ZGlmZiAtLWdpdCBhL2JpdGJha2UvQVVUSE9SUyBiL2JpdGJha2UvQVVUSE9SUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWZkNzhmCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9BVVRIT1JTCkBAIC0wLDAgKzEsMTAgQEAKK1RpbSBBbnNlbGwgPG1pdGhyb0BtaXRoaXMubmV0PgorUGhpbCBCbHVuZGVsbCA8cGJAaGFuZGhlbGRzLm9yZz4KK1NlYiBGcmFua2VuZ3VsIDxzZWJAZnJhbmtlbmd1bC5vcmc+CitIb2xnZXIgRnJleXRoZXIgPGhvbGdlckBtb2lqaS1tb2JpbGUuY29tPgorTWFyY2luIEp1c3praWV3aWN6IDxtYXJjaW5AanVzemtpZXdpY3ouY29tLnBsPgorQ2hyaXMgTGFyc29uIDxrZXJnb3RoQGhhbmRoZWxkcy5vcmc+CitVbHJpY2ggTHVja2FzIDxsdWNrYXNAbXVzb2Z0LmRlPgorTWlja2V5IExhdWVyIDxtaWNrZXlAVmFuaWxsZS5kZT4KK1JpY2hhcmQgUHVyZGllIDxycHVyZGllQHJwc3lzLm5ldD4KK0hvbGdlciBTY2h1cmlnIDxob2xnZXJzY2h1cmlnQGdteC5kZT4KZGlmZiAtLWdpdCBhL2JpdGJha2UvQ09QWUlORyBiL2JpdGJha2UvQ09QWUlORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTExOTA1Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9DT1BZSU5HCkBAIC0wLDAgKzEsMzM5IEBACisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCisJCQkgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQorc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCit1c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Cit0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bworeW91ciBwcm9ncmFtcywgdG9vLgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKK3ByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKK2hhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKK3RoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAoraWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKK2luIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCithbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCitUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQorZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgorCisgIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKK2dyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoreW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKK3NvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKK3JpZ2h0cy4KKworICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCisoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LAorZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KKworICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgordGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKK3NvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQord2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KK3RoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCithdXRob3JzJyByZXB1dGF0aW9ucy4KKworICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQorcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQorcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQorcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55CitwYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgorCisgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCittb2RpZmljYXRpb24gZm9sbG93LgorCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCisKKyAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucworYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKK3VuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKK3JlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgorbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKK3RoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCitlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgorbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgordGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCisKK0FjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Citjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCitydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCitpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KK1doZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgorCisgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncworc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Citjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCitjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCitub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7CithbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCithbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgorCitZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKK3lvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCisKKyAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgorb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAorZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCithYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KKworICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgorICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQorICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCisgICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQorICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKKyAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCisgICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCisgICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCisgICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgorICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCisgICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKKyAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCisgICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCisKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KK3dpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCit1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKK1NlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKKyAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKKyAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCisgICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKKyAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCisgICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQorICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCisgICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKKyAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcworICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91CisgICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAorICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQorCitUaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQorY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKK2Fzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bworY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQorc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCithbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQorZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKK29wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50CitpdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCisKK0lmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKK2FjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKK2FjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcworZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorCisgIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQorZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAorb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCit2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCitIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgordGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKK3BhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KKworICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKK3NpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCitkaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKK3Byb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKK21vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKK2FsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKK3RoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCitvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCit0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgorcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgorWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KK3RoaXMgTGljZW5zZS4KKworICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CitpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAorY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKK2Rpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKK21heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKK2xpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKK2FsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgordGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bworcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KKworSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCithbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCithcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgorY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKK3N1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKK2ludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcworaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCitnZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCit0aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAorc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwordG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90CitpbXBvc2UgdGhhdCBjaG9pY2UuCisKK1RoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bworYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCisKKyAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQorbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCit0aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCitjb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKK3RoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCitvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKK2JlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bworYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KK3NwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55CitsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCitlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgordGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbi4KKworICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCit0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcworbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKK29mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKK29mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisJCQkgICAgTk8gV0FSUkFOVFkKKworICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKK0ZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgorT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUworUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKK09SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCitUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCitQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKK1JFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKK1dJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKK1JFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCitJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKK09VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKK1RPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQorWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKK1BST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQorUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorCisJCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKKwkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAorZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCisKKyAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKK3RvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Cit0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCitJZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCit3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgorCisgICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSB5ZWFyIG5hbWUgb2YgYXV0aG9yCisgICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgorICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKKyAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCisKK1RoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQorcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQorYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCittb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKK25lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKKworICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCisgIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgorCisgIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQorICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KK3Byb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Citjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKK2xpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExlc3NlciBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2JpdGJha2UvQ2hhbmdlTG9nIGIvYml0YmFrZS9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFjMmE2NAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsMzE3IEBACitDaGFuZ2VzIGluIEJpdGJha2UgMS45Lng6CisJLSBBZGQgUEUgKFBhY2thZ2UgRXBvY2gpIHN1cHBvcnQgZnJvbSBQaGlsaXBwIFphYmVsIChwSDUpCisJLSBUcmVhdCBweXRob24gZnVuY3Rpb25zIHRoZSBzYW1lIGFzIHNoZWxsIGZ1bmN0aW9ucyBmb3IgbG9nZ2luZworCS0gVXNlIFRNUERJUi9hbm9uZnVuYyBhcyBhIF9fYW5vbmZ1bmMgdGVtcCBkaXJlY3RvcnkgKFQpCisJLSBDYXRjaCB0cnVuY2F0ZWQgY2FjaGUgZmlsZSBlcnJvcnMKKwktIEFsbG93IG9wZXJhdGlvbnMgb3RoZXIgdGhhbiBhc3NpZ25tZW50IG9uIGZsYWcgdmFyaWFibGVzCisJLSBBZGQgY29kZSB0byBoYW5kbGUgaW50ZXItdGFzayBkZXBlbmRlbmNpZXMKKwktIEZpeCBjYWNoZSBlcnJvcnMgd2hlbiBnZW5lcmF0aW9uIGRvdEdyYXBocworCS0gTWFrZSBzdXJlIF9faW5oZXJpdF9jYWNoZSBpcyB1cGRhdGVkIGJlZm9yZSBjYWxsaW5nIGluY2x1ZGUoKSAoZnJvbSBNaWNoYWVsIEtyZWxpbikKKwktIEZpeCBidWcgd2hlbiB0YXJnZXQgd2FzIGluIEFTU1VNRV9QUk9WSURFRCAoIzIyMzYpCisJLSBSYWlzZSBQYXJzZUVycm9yIGZvciBmaWxlbmFtZXMgd2l0aCBtdWx0aXBsZSB1bmRlcnNjb3JlcyBpbnN0ZWFkIG9mIGluZmluaXRlbHkgbG9vcGluZyAoIzIwNjIpCisJLSBGaXggaW52YWxpZCByZWdleHAgaW4gQkJNQVNLIGVycm9yIGhhbmRsaW5nIChtaXNzaW5nIGltcG9ydCkgKCMxMTI0KQorCS0gUHJvbW90ZSBjZXJ0YWluIHdhcm5pbmdzIGZyb20gZGVidWcgdG8gbm90ZSAyIGxldmVsCisJLSBVcGRhdGUgbWFudWFsCisJLSBDb3JyZWN0bHkgcmVkaXJlY3Qgc3RkaW4gd2hlbiBmb3JraW5nCisJLSBJZiBwYXJzaW5nIGVycm9ycyBhcmUgZm91bmQsIGV4aXQsIHRvbyBtYW55IHVzZXJzIG1pc3MgdGhlIGVycm9ycworCS0gUmVtb3ZlIHN1cHJpb3VycyBQUkVGRVJSRURfUFJPVklERVIgd2FybmluZ3MKKwktIHN2biBmZXRjaGVyOiBBZGQgX2J1aWxkc3ZuY29tbWFuZCBmdW5jdGlvbgorCS0gSW1wcm92ZSBjZXJ0YWluIGVycm9yIG1lc3NhZ2VzCisJLSBSZXdyaXRlIHN2biBmZXRjaGVyIHRvIG1ha2UgYWRkaW5nIGV4dHJhIG9wZXJhdGlvbnMgZWFzaWVyIAorCSAgYXMgcGFydCBvZiBmdXR1cmUgU1JDREFURT0ibm93IiBmaXhlcworCSAgKHJlcXVpcmVzIG5ldyBGRVRDSENNRF9zdm4gZGVmaW5pdGlvbiBpbiBiaXRiYWtlLmNvbmYpCisJLSBDaGFuZ2UgU1ZORElSIGxheW91dCB0byBiZSBtb3JlIHVuaXF1ZSAoZml4ZXMgIzI2NDQgYW5kICMyNjI0KQorCS0gQWRkIENvbmZpZ1BhcnNlZCBFdmVudCBhZnRlciBjb25maWd1cmF0aW9uIHBhcnNpbmcgaXMgY29tcGxldGUKKwktIEFkZCBTUkNSRVYgc3VwcG9ydCBmb3Igc3ZuIGZldGNoZXIKKwktIGRhdGEuZW1pdF92YXIoKSAtIG9ubHkgY2FsbCBnZXRWYXIgaWYgd2UgbmVlZCB0aGUgdmFyaWFibGUKKwktIFN0b3AgZ2VuZXJhdGluZyB0aGUgQSB2YXJpYWJsZSAoc2VlbXMgdG8gYmUgbGVnYWN5IGNvZGUpCisJLSBNYWtlIHN1cmUgaW50ZXJ0YXNrIGRlcGVuZHMgZ2V0IHByb2Nlc3NlZCBjb3JyZWN0aW5nIGluIHJlY3Vyc2l2ZSBkZXBlbmRzCisJLSBBZGQgcG4tUE4gdG8gb3ZlcnJpZGVzIHdoZW4gZXZhbHVhdGluZyBQUkVGRVJSRURfVkVSU0lPTgorCS0gSW1wcm92ZSB0aGUgcHJvZ3Jlc3MgaW5kaWNhdG9yIGJ5IHNraXBwaW5nIHRhc2tzIHRoYXQgaGF2ZSAKKwkgIGFscmVhZHkgcnVuIGJlZm9yZSBzdGFydGluZyB0aGUgYnVpbGQgcmF0aGVyIHRoYW4gZHVyaW5nIGl0CisJLSBBZGQgcHJvZmlsaW5nIG9wdGlvbiAoLVApCisJLSBBZGQgQkJfU1JDUkVWX1BPTElDWSB2YXJpYWJsZSAoY2xlYXIgb3IgY2FjaGUpIHRvIGNvbnRyb2wgU1JDUkVWIGNhY2hlCisJLSBBZGQgU1JDUkVWX0ZPUk1BVCBzdXBwb3J0CisJLSBGaXggbG9jYWwgZmV0Y2hlcidzIGxvY2FscGF0aCByZXR1cm4gdmFsdWVzCisJLSBBcHBseSBPVkVSUklERVMgYmVmb3JlIHBlcmZvcm1pbmcgaW1tZWRpYXRlIGV4cGFuc2lvbnMKKwktIEFsbG93IHRoZSAtYiAtZSBvcHRpb24gY29tYmluYXRpb24gdG8gdGFrZSByZWd1bGFyIGV4cHJlc3Npb25zCisJLSBGaXggaGFuZGxpbmcgb2YgdmFyaWFibGVzIHdpdGggZXhwYW5zaW9uIGluIHRoZSBuYW1lIHVzaW5nIF9hcHBlbmQvX3ByZXBlbmQKKwkgIGUuZy4gUlJFQ09NTUVORFNfJHtQTn1fYXBwZW5kX3h5eiA9ICJhYmMiCisJLSBBZGQgcGxhaW4gbWVzc2FnZSBmdW5jdGlvbiB0byBiYi5tc2cKKwktIFNvcnQgdGhlIGxpc3Qgb2YgcHJvdmlkZXJzIGJlZm9yZSBwcm9jZXNzaW5nIHNvIGRlcGVuZGVuY3kgcHJvYmxlbXMgYXJlIAorCSAgcmVwcm9kdWNpYmxlIHJhdGhlciB0aGFuIGVmZmVjdGl2ZWx5IHJhbmRvbQorCS0gRml4L2ltcHJvdmUgYml0YmFrZSAtcyBvdXRwdXQKKwktIEFkZCBsb2NraW5nIGZvciBmZXRjaGVycyBzbyBvbmx5IG9uZSB0cmllcyB0byBmZXRjaCBhIGdpdmVuIGZpbGUgYXQgYSBnaXZlbiB0aW1lCisJLSBGaXggaW50KDApL05vbmUgY29uZnVzaW9uIGluIHJ1bnF1ZXVlLnB5IHdoaWNoIGNhdXNlcyByYW5kb20gZ2FwcyBpbiBkZXBlbmRlbmN5IGNoYWlucwkgIAorCS0gRXhwYW5kIGRhdGEgaW4gYWRkdGFza3MKKwktIFByaW50IHRoZSBsaXN0IG9mIG1pc3NpbmcgREVQRU5EUyxSREVQRU5EUyBmb3IgdGhlICJObyBidWlsZGFibGUgcHJvdmlkZXJzIGF2YWlsYWJsZSBmb3IgcmVxdWlyZWQuLi4uIgorCSAgZXJyb3IgbWVzc2FnZS4KKwktIFJld29yayBhZGRfdGFzayB0byBiZSBtb3JlIGVmZmljaWVudCAoNiUgc3BlZWR1cCwgNyUgbnVtYmVyIG9mIGZ1bmN0aW9uIGNhbGxzIHJlZHVjdGlvbikKKwktIFNvcnQgZGlncmFwaCBvdXRwdXQgdG8gbWFrZSBidWlsZHMgbW9yZSByZXByb2R1Y2libGUKKwktIFNwbGl0IGV4cGFuZEtleXMgaW50byB0d28gZm9yIGxvb3BzIHRvIGJlbmVmaXQgZnJvbSB0aGUgZXhwYW5kX2NhY2hlICgxMiUgc3BlZWR1cCkKKwktIHJ1bnF1ZXVlLnB5OiBGaXggaWRlcGVuZHMgaGFuZGxpbmcgdG8gYXZvaWQgZGVwZW5kZW5jeSBlcnJvcnMKKwktIENsZWFyIHRoZSB0ZXJtaW5hbCBUT1NUT1AgZmxhZyBpZiBzZXQgKGFuZCB3YXJuIHRoZSB1c2VyKQorCS0gRml4IHJlZ3Jlc3Npb24gZnJvbSByNjUzIGFuZCBtYWtlIFNSQ0RBVEUvQ1ZTREFURSB3b3JrIGZvciBwYWNrYWdlcyBhZ2FpbgorCS0gRml4IGEgYnVnIGluIGJiLmRlY29kZXVybCB3aGVyZSBodHRwOi8vc29tZS53aGVyZS5jb20vc29tZWZpbGUudGd6IGRlY29kZWQgdG8gaG9zdD0iIiAoIzE1MzApCisJLSBXYXJuIGFib3V0IG1hbGZvcm1lZCBQUkVGRVJSRURfUFJPVklERVJTICgjMTA3MikKKwktIEFkZCBzdXBwb3J0IGZvciBCQl9OSUNFX0xFVkVMIG9wdGlvbiAoIzE2MjcpCisJLSBQc3ljbyBpcyB1c2VkIG9ubHkgb24geDg2IGFzIHRoZXJlIGlzIG5vIHN1cHBvcnQgZm9yIG90aGVyIGFyY2hpdGVjdHVyZXMuCisJLSBTb3J0IGluaXRpYWwgcHJvdmlkZXJzIGxpc3QgYnkgZGVmYXVsdCBwcmVmZXJlbmNlICgjMTE0NSwgIzIwMjQpCisJLSBJbXByb3ZlIHByb3ZpZGVyIHNvcnRpbmcgc28gcHJlZmVyZWQgdmVyc2lvbnMgaGF2ZSBwcmVmZXJlbmNlIG92ZXIgbGF0ZXN0IHZlcnNpb25zICgjNzY4KQorCS0gRGV0ZWN0IGJ1aWxkcyBvZiB0YXNrcyB3aXRoIG92ZXJsYXBwaW5nIHByb3ZpZGVycyBhbmQgd2FybiAod2lsbCBiZWNvbWUgYSBmYXRhbCBlcnJvcikgKCMxMzU5KQorCS0gQWRkIE1VTFRJX1BST1ZJREVSX1dISVRFTElTVCB2YXJpYWJsZSB0byBhbGxvdyBrbm93biBzYWZlIG11bHRpcGxlIHByb3ZpZGVycyB0byBiZSBsaXN0ZWQKKwktIEhhbmRsZSBwYXRocyBpbiBzdm4gZmV0Y2hlciBtb2R1bGUgcGFyYW1ldGVyCisJLSBTdXBwb3J0IHRoZSBzeW50YXggImV4cG9ydCBWQVJJQUJMRSIKKwktIEFkZCBienIgZmV0Y2hlcgorCS0gQWRkIHN1cHBvcnQgZm9yIGNsZWFuaW5nIGRpcmVjdG9yaWVzIGJlZm9yZSBhIHRhc2sgaW4gdGhlIGZvcm06CisJICBkb190YXNrbmFtZVtjbGVhbmRpcnNdID0gImRpciIKKwktIGJ6ciBmZXRjaGVyIHR3ZWFrcyBmcm9tIFJvYmVydCBTY2h1c3RlciAoIzI5MTMpCisJLSBBZGQgbWVyY3VyaWFsIChoZykgZmV0Y2hlciBmcm9tIFJvYmVydCBTY2h1c3RlciAoIzI5MTMpCisJLSBEb24ndCBhZGQgZHVwbGljYXRlcyB0byBCQlBBVEgKKwktIEZpeCBwcmVmZXJyZWRfdmVyc2lvbiByZXR1cm4gdmFsdWVzIChwcm92aWRlcnMucHkpCisJLSBGaXggJ2RlcGVuZHMnIGZsYWcgc3BsaXR0aW5nCisJLSBGaXggdW5leHBvcnQgaGFuZGxpbmcgKCMzMTM1KQorCS0gQWRkIGJiLmNvcHlmaWxlIGZ1bmN0aW9uIHNpbWlsYXIgdG8gYmIubW92ZWZpbGUgKGFuZCBpbXByb3ZlIG1vdmVmaWxlIGVycm9yIHJlcG9ydGluZykKKwktIEFsbG93IG11bHRpcGxlIG9wdGlvbnMgZm9yIGRlcHRhc2sgZmxhZworCS0gVXNlIGdpdC1mZXRjaCBpbnN0ZWFkIG9mIGdpdC1wdWxsIHJlbW92aW5nIGFueSBuZWVkIGZvciBtZXJnZXMgd2hlbiAKKwkgIGZldGNoaW5nICh3ZSBkb24ndCBjYXJlIGFib3V0IHRoZSBpbmRleCkuIEZpeGVzIGZldGNoIGVycm9ycy4KKwktIEFkZCBCQl9HRU5FUkFURV9NSVJST1JfVEFSQkFMTFMgb3B0aW9uLCBzZXQgdG8gMCB0byBtYWtlIGdpdCBmZXRjaGVzIAorCSAgZmFzdGVyIGF0IHRoZSBleHBlbnNlIG9mIG5vdCBjcmVhdGluZyBtaXJyb3IgdGFyYmFsbHMuCisJLSBTUkNSRVYgaGFuZGxpbmcgdXBkYXRlcywgaW1wcm92ZW1lbnRzIGFuZCBmaXhlcyBmcm9tIFBva3kKKwktIEFkZCBiYi51dGlscy5sb2NrZmlsZSgpIGFuZCBiYi51dGlscy51bmxvY2tmaWxlKCkgZnJvbSBQb2t5CisJLSBBZGQgc3VwcG9ydCBmb3IgdGFzayBzZWxmc3RhbXAgYW5kIGxvY2tmaWxlcyBmbGFncworCS0gRGlzYWJsZSB0YXNrIG51bWJlciBhY2NlbGVyYXRpb24gc2luY2UgaXQgY2FuIGFsbG93IHRoZSB0YXNrcyB0byBydW4gCisJICBvdXQgb2Ygc2VxdWVuY2UKKwktIEltcHJvdmUgcnVucXVldWUgY29kZSBjb21tZW50cworCS0gQWRkIHRhc2sgc2NoZWR1bGVyIGFic3RyYWN0aW9uIGFuZCBzb21lIGV4YW1wbGUgc2NoZWR1bGVycworCS0gSW1wcm92ZSBjaXJjdWxhciBkZXBlbmRlbmN5IGNoYWluIGRlYnVnZ2luZyBjb2RlIGFuZCB1c2VyIGZlZWRiYWNrCisJLSBEb24ndCBnaXZlIGEgc3RhY2t0cmFjZSBmb3IgaW52YWxpZCB0YXNrcywgaGF2ZSBhIHVzZXIgZnJpZW5kbHkgbWVzc2FnZSAoIzM0MzEpCisJLSBBZGQgc3VwcG9ydCBmb3IgIi1lIHRhcmdldCIgKCMzNDMyKQorCS0gRml4IHNoZWxsIHNob3dkYXRhIGNvbW1hbmQgKCMzMjU5KQorCS0gRml4IHNoZWxsIGRhdGEgdXBkYXRpbmcgcHJvYmxlbXMgKCMxODgwKQorCS0gUHJvcGVybHkgcmFpc2UgZXJyb3JzIGZvciBpbnZhbGlkIHNvdXJjZSBVUkkgcHJvdG9jb2xzCisJLSBDaGFuZ2UgdGhlIHdnZXQgZmV0Y2hlciBmYWlsdXJlIGhhbmRsaW5nIHRvIGF2b2lkIGxvY2tmaWxlIHByb2JsZW1zCisJLSBBZGQgc3VwcG9ydCBmb3IgYnJhbmNoZXMgaW4gZ2l0IGZldGNoZXIgKE90YXZpbyBTYWx2YWRvciwgTWljaGFlbCBMYXVlcikKKwktIE1ha2UgdGFza2RhdGEgYW5kIHJ1bnF1ZXVlIGVycm9ycyBtb3JlIHVzZXIgZnJpZW5kbHkKKwktIEFkZCBub3JlY3Vyc2UgYW5kIGZ1bGxwYXRoIG9wdGlvbnMgdG8gY3ZzIGZldGNoZXIKKwktIEZpeCBleGl0IGNvZGUgZm9yIGJ1aWxkIGZhaWx1cmVzIGluIC0tY29udGludWUgbW9kZQorCS0gRml4IGdpdCBicmFuY2ggdGFncyBmZXRjaGluZworCS0gQ2hhbmdlIHBhcnNlQ29uZmlndXJhdGlvbkZpbGUgc28gaXQgd29ya3Mgb24gcmVhbCBkYXRhLCBub3QgYSBjb3B5CisJLSBIYW5kbGUgJ2Jhc2UnIGluaGVyaXQgYW5kIGFsbCBvdGhlciBJTkhFUklUcyBmcm9tIHBhcnNlQ29uZmlndXJhdGlvbkZpbGUgCisJICBpbnN0ZWFkIG9mIEJCSGFuZGxlcgorCS0gRml4IGdldFZhckZsYWdzIGJ1ZyBpbiBkYXRhX3NtYXJ0CisJLSBPcHRtaXNlIGNhY2hlIGhhbmRsaW5nIGJ5IG1vcmUgcXVpY2tseSBkZXRlY3RpbmcgYW4gaW52YWxpZCBjYWNoZSwgb25seSAKKwkgIHNhdmluZyB0aGUgY2FjaGUgd2hlbiBpdHMgY2hhbmdlZCwgbW92aW5nIHRoZSBjYWNoZSB2YWxpZGl0eSBjaGVjayBpbnRvCisJICB0aGUgcGFyc2luZyBsb29wIGFuZCBmYWN0b3Jpbmcgc29tZSBnZXRWYXIgY2FsbHMgb3V0c2lkZSBhIGZvciBsb29wCisJLSBDb29rZXI6IFJlbW92ZSBhIGRlYnVnIG1lc3NhZ2UgZnJvbSB0aGUgcGFyc2luZyBsb29wIHRvIGxvd2VyIG92ZXJoZWFkCisJLSBDb252ZXJ0IGJ1aWxkLnB5IGV4ZWNfdGFzayB0byB1c2UgZ2V0VmFyRmxhZ3MKKwktIFVwZGF0ZSBzaGVsbCB0byB1c2UgY29va2VyLmJ1aWxkRmlsZQorCS0gQWRkIFN0YW1wVXBkYXRlIGV2ZW50CisJLSBDb252ZXJ0IC1iIG9wdGlvbiB0byB1c2UgdGFza2RhdGEvcnVucXVldWUKKwktIFJlbW92ZSBkaWdyYXBoIGFuZCBzd2l0Y2ggdG8gbmV3IHN0YW1wIGNoZWNraW5nIGNvZGUuIGV4ZWNfdGFzayBubyBsb25nZXIKKwkgIGhvbm91cnMgZGVwZW5kZW5jaWVzCisJLSBNYWtlIGZldGNoZXIgdGltZXN0YW1wIHVwZGF0aW5nIG5vbi1mYXRhbCB3aGVuIHBlcm1pc3Npb25zIGRvbid0IGFsbG93IAorCSAgdXBkYXRlcworCS0gQWRkIEJCX1NDSEVEVUxFUiB2YXJpYWJsZS9vcHRpb24gKCJjb21wbGV0aW9uIiBvciAic3BlZWQiKSBjb250cm9sbGluZworCSAgdGhlIHdheSBiaXRiYWtlIHNjaGVkdWxlcyB0YXNrcworCS0gQWRkIEJCX1NUQU1QX1BPTElDWSB2YXJpYWJsZS9vcHRpb24gKCJwZXJmaWxlIiBvciAiZnVsbCIpIGNvbnRyb2xsaW5nCisJICBob3cgZXh0ZW5zaXZlbHkgc3RhbXBzIGFyZSBsb29rZWQgYXQgZm9yIHZhbGlkaXR5CisJLSBXaGVuIGhhbmRsaW5nIGJ1aWxkIHRhcmdldCBmYWlsdXJlcyBtYWtlIHN1cmUgaWRlcGVuZHMgYXJlIGNoZWNrZWQgYW5kCisJICBmYWlsZWQgd2hlcmUgbmVlZGVkLiBGaXhlcyAtLWNvbnRpbnVlIG1vZGUgY3Jhc2hlcy4KKwktIEZpeCAtZiAoZm9yY2UpIGluIGNvbmp1bmN0aW9uIHdpdGggLWIKKwktIEZpeCBwcm9ibGVtcyB3aXRoIHJlY3JkZXB0YXNrIGhhbmRsaW5nIHdoZXJlIHNvbWUgaWRlcGVuZHMgd2VyZW4ndCBoYW5kbGVkCisJICBjb3JyZWN0bHkuCisJLSBIYW5kbGUgZXhpdCBjb2RlcyBjb3JyZWN0bHkgKGZyb20gcEg1KQorCS0gV29yayBhcm91bmQgcmVmcy9IRUFEIGlzc3VlcyB3aXRoIGdpdCBvdmVyIGh0dHAgKCMzNDEwKQorCS0gQWRkIHByb3h5IHN1cHBvcnQgdG8gdGhlIENWUyBmZXRjaGVyIChmcm9tIEN5cmlsIENoZW1wYXJhdGh5KQorCS0gSW1wcm92ZSBydW5mZXRjaGNtZCBzbyBlcnJvcnMgYXJlIHNlZW4gYW5kIHZhcmlvdXMgR0lUIHZhcmlhYmxlcyBhcmUgZXhwb3J0ZWQKKwktIEFkZCBhYmlsaXR5IHRvIGZldGNoZXJzIHRvIGNoZWNrIFVSTCB2YWxpZGl0eSB3aXRob3V0IGRvd25sb2FkaW5nCisJLSBJbXByb3ZlIHJ1bnRpbWUgUFJFRkVSUkVEX1BST1ZJREVSUyB3YXJuaW5nIG1lc3NhZ2UKKwktIEFkZCBCQl9TVEFNUF9XSElURUxJU1Qgb3B0aW9uIHdoaWNoIGNvbnRhaW5zIGEgbGlzdCBvZiBzdGFtcHMgdG8gaWdub3JlIHdoZW4KKwkgIGNoZWNraW5nIHN0YW1wIGRlcGVuZGVuY2llcyBhbmQgdXNpbmcgYSBCQl9TVEFNUF9QT0xJQ1kgb2YgIndoaXRlbGlzdCIKKwktIE5vIGxvbmdlciB3ZWlnaHQgcHJvdmlkZXJzIG9uIHRoZSBiYXNpcyBvZiBhIHBhY2thZ2UgYmVpbmcgImFscmVhZHkgc3RhZ2VkIi4gVGhpcworCSAgbGVhZHMgdG8gYnVpbGRzIGJlaW5nIG5vbi1kZXRlcm1pbmlzdGljLgorCS0gRmx1c2ggc3Rkb3V0L3N0ZGVyciBiZWZvcmUgZm9ya2luZyB0byBmaXggZHVwbGljYXRlIGNvbnNvbGUgb3V0cHV0CisJLSBNYWtlIHN1cmUgcmVjcmRlcHMgdGFza3MgaW5jbHVkZSBhbGwgaW50ZXItdGFzayBkZXBlbmRlbmNpZXMgb2YgYSBnaXZlbiBmbgorCS0gQWRkIGJiLnJ1bnF1ZXVlLmNoZWNrX3N0YW1wX2ZuKCkgZm9yIHVzZSBieSBwYWNrYWdlZC1zdGFnaW5nCisJLSBBZGQgUEVSU0lTVEVOVF9ESVIgdG8gc3RvcmUgdGhlIFBlcnNpc3REYXRhIGluIGEgcGVyc2lzdGVudAorCSAgZGlyZWN0b3J5ICE9IHRoZSBjYWNoZSBkaXIuCisJLSBBZGQgbWQ1IGFuZCBzaGEyNTYgY2hlY2tzdW0gZ2VuZXJhdGlvbiBmdW5jdGlvbnMgdG8gdXRpbHMucHkKKwktIENvcnJlY3RseSBoYW5kbGUgJy0nIGNoYXJhY3RlcnMgaW4gY2xhc3MgbmFtZXMgKCMyOTU4KQorCS0gTWFrZSBzdXJlIGV4cGFuZEtleXMgaGFzIGJlZW4gY2FsbGVkIG9uIHRoZSBkYXRhIGRpY3Rpb25hcnkgYmVmb3JlIHJ1bm5pbmcgdGFza3MKKwktIENvcnJlY3RseSBhZGQgYSB0YXNrIG92ZXJyaWRlIGluIHRoZSBmb3JtIHRhc2stVEFTS05BTUUuCisJLSBSZXZlcnQgdGhlICctJyBjaGFyYWN0ZXIgZml4IGluIGNsYXNzIG5hbWVzIHNpbmNlIGl0IGJyZWFrcyB0aGluZ3MKKwktIFdoZW4gYSByZWdleHAgZmFpbHMgdG8gY29tcGlsZSBmb3IgUEFDS0FHRVNfRFlOQU1JQywgcHJpbnQgYSBtb3JlIHVzZWZ1bCBlcnJvciAoIzQ0NDQpCisJLSBBbGxvdyB0byBjaGVja291dCBDVlMgYnkgRGF0ZSBhbmQgVGltZS4gSnVzdCBhZGQgSEhtbSB0byB0aGUgU1JDREFURS4KKwktIE1vdmUgcHJ1bmVkaXIgZnVuY3Rpb24gdG8gdXRpbHMucHkgYW5kIGFkZCBleHBsb2RlX2RlcF92ZXJzaW9ucyBmdW5jdGlvbgorCS0gUmFpc2UgYW4gZXhjZXB0aW9uIGlmIFNSQ1JFViA9PSAnSU5WQUxJRCcKKwktIEZpeCBoZyBmZXRjaGVyIHVzZXJuYW1lL3Bhc3N3b3JkIGhhbmRsaW5nIGFuZCBmaXggY3Jhc2gKKwktIEZpeCBQQUNLQUdFU19EWU5BTUlDIGhhbmRsaW5nIG9mIHBhY2thZ2VzIHdpdGggJysrJyBpbiB0aGUgbmFtZQorCS0gUmVuYW1lIF9fZGVwZW5kcyB0byBfX2Jhc2VfZGVwZW5kcyBhZnRlciBjb25maWd1cmF0aW9uIHBhcnNpbmcgc28gd2UgZG9uJ3QKKwkgIHJlY2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoZSBjb25maWcgZmlsZXMgdGltZSBhZnRlciB0aW1lCisJLSBBZGQgYmV0dGVyIGVudmlyb25tZW50YWwgdmFyaWFibGUgaGFuZGxpbmcuIEJ5IGRlZmF1bHQgaXQgd2lsbCBub3cgb25seSBwYXNzIGNlcnRhaW4gCisJICB3aGl0ZWxpc3RlZCB2YXJpYWJsZXMgaW50byB0aGUgZGF0YSBzdG9yZS4gSWYgQkJfUFJFU0VSVkVfRU5WIGlzIHNldCBiaXRiYWtlIHdpbGwgdXNlCisJICBhbGwgdmFyaWFibGUgZnJvbSB0aGUgZW52aXJvbm1lbnQuIElmIEJCX0VOVl9XSElURUxJU1QgaXMgc2V0LCB0aGF0IHdoaXRlbGlzdCB3aWxsIGJlCisJICB1c2VkIGluc3RlYWQgb2YgdGhlIGludGVybmFsIGJpdGJha2Ugb25lLiBBbHRlcm5hdGl2ZWx5LCBCQl9FTlZfRVhUUkFXSElURSBjYW4gYmUgdXNlZAorCSAgdG8gZXh0ZW5kIHRoZSBpbnRlcm5hbCB3aGl0ZWxpc3QuCisJLSBQZXJmb3JjZSBmZXRjaGVyIGZpeCB0byB1c2UgY29tbWFuZGxpbmUgb3B0aW9ucyBpbnN0ZWFkIG9mIGJlaW5nIG92ZXJyaWRlbiBieSB0aGUgZW52aXJvbm1lbnQKKwktIGJiLnV0aWxzLnBydW5lZGlyIGNhbiBjb3BlIHdpdGggc3ltbGlua3MgdG8gZGlyZWN0b3JpZWVzIHdpdGhvdXQgZXhjZXB0aW9ucworCS0gdXNlIEByZXYgd2hlbiBkb2luZyBhIHN2biBjaGVja291dAorCS0gQWRkIG9zYyBmZXRjaGVyIChmcm9tIEpvc2h1YSBMb2NrIGluIFBva3kpCisJLSBXaGVuIFNSQ1JFViBhdXRvcmV2aXNpb25pbmcgZm9yIGEgcmVjaXBlIGlzIGluIHVzZSwgZG9uJ3QgY2FjaGUgdGhlIHJlY2lwZQorCS0gQWRkIHRyeWFsdGNvbmZpZ3Mgb3B0aW9uIHRvIGNvbnRyb2wgd2hldGhlciBiaXRiYWtlIHRyeXMgdXNpbmcgYWx0ZXJuYXRpdmUgcHJvdmlkZXJzCisJICB0byBmdWxmaWwgZmFpbGVkIGRlcGVuZGVuY2llcy4gSXQgZGVmYXVsdHMgdG8gb2ZmLCBjaGFuZ2luZyB0aGUgZGVmYXVsdCBzaW5jZSB0aGlzCisJICBiZWhhdmlvdXIgY29uZnVzZXMgbWFueSB1c2VycyBhbmQgaXNuJ3Qgb2Z0ZW4gdXNlZnVsLgorCS0gSW1wcm92ZSBsb2NrIGZpbGUgZnVuY3Rpb24gZXJyb3IgaGFuZGxpbmcKKwktIEFkZCB1c2VybmFtZSBoYW5kbGluZyB0byB0aGUgZ2l0IGZldGNoZXIgKFJvYmVydCBCcmFnZykKKwktIEFkZCBzdXBwb3J0IGZvciBIVFRQX1BST1hZIGFuZCBIVFRQX1BST1hZX0lHTk9SRSB2YXJpYWJsZXMgdG8gdGhlIHdnZXQgZmV0Y2hlcgorCS0gRXhwb3J0IG1vcmUgdmFyaWFibGVzIHRvIHRoZSBmZXRjaGVyIGNvbW1hbmRzIHRvIGFsbG93IHNzaCBjaGVja291dHMgYW5kIGNoZWNrb3V0cyB0aHJvdWdoIAorCSAgcHJveGllcyB0byB3b3JrIGJldHRlci4gKGZyb20gUG9reSkKKwktIEFsc28gYWxsb3cgdXNlciBhbmQgcHN3ZCBvcHRpb25zIGluIFNSQ19VUklzIGdsb2JhbGx5IChmcm9tIFBva3kpCisJLSBJbXByb3ZlIHByb3h5IGhhbmRsaW5nIHdoZW4gdXNpbmcgbWlycm9ycyAoZnJvbSBQb2t5KQorCS0gQWRkIGJiLnV0aWxzLnBydW5lX3N1ZmZpeCBmdW5jdGlvbgorCS0gRml4IGhnIGNoZWNrb3V0cyBvZiBzcGVjaWZpYyByZXZpc2lvbnMgKGZyb20gUG9reSkKKwktIEZpeCB3Z2V0IGZldGNoaW5nIG9mIHVybHMgd2l0aCBwYXJhbWV0ZXJzIHNwZWNpZmllZCAoZnJvbSBQb2t5KQorCS0gQWRkIHVzZXJuYW1lIGhhbmRsaW5nIHRvIGdpdCBmZXRjaGVyIChmcm9tIFBva3kpCisJLSBTZXQgSE9NRSBlbnZpcm9ubWVudGFsIHZhcmlhYmxlIHdoZW4gcnVubmluZyBmZXRjaGVyIGNvbW1hbmRzIChmcm9tIFBva3kpCisJLSBNYWtlIHN1cmUgYWxsb3dlZCB2YXJpYWJsZXMgaW5oZXJpdGVkIGZyb20gdGhlIGVudmlyb25tZW50IGFyZSBleHBvcnRlZCBhZ2FpbiAoZnJvbSBQb2t5KQorCS0gV2hlbiBydW5uaW5nIGEgc3RhZ2UgdGFzayBpbiBiYnNoZWxsLCBydW4gcG9wdWxhdGVfc3RhZ2luZywgbm90IHRoZSBzdGFnZSB0YXNrIChmcm9tIFBva3kpCisJLSBGaXggKyBjaGFyYWN0ZXIgZXNjYXBpbmcgZnJvbSBQQUNLQUdFU19EWU5BTUlDICh0aGFua3MgT3RhdmlvIFNhbHZhZG9yKQorCS0gQWRkaXRpb24gb2YgQkJDTEFTU0VYVEVORCBzdXBwb3J0IGZvciBhbGxvd2luZyBvbmUgcmVjaXBlIHRvIHByb3ZpZGUgbXVsdGlwbGUgdGFyZ2V0cyAoZnJvbSBQb2t5KQorCitDaGFuZ2VzIGluIEJpdGJha2UgMS44LjA6CisJLSBSZWxlYXNlIDEuNy54IGFzIGEgc3RhYmxlIHNlcmllcworCitDaGFuZ2VzIGluIEJpdEJha2UgMS43Lng6CisJLSBNYWpvciB1cGRhdGVzIG9mIHRoZSBkZXBlbmRlbmN5IGhhbmRsaW5nIGFuZCBleGVjdXRpb24KKwkgIG9mIHRhc2tzLiBDb2RlIGZyb20gYmluL2JpdGJha2UgcmVwbGFjZWQgd2l0aCBydW5xdWV1ZS5weQorCSAgYW5kIHRhc2tkYXRhLnB5CisJLSBOZXcgdGFzayBleGVjdXRpb24gY29kZSBzdXBwb3J0cyBtdWx0aXRocmVhZGluZyB3aXRoIGEgc2ltcGxpc3RpYworCSAgdGhyZWFkaW5nIGFsZ29yaXRobSBjb250cm9sbGVkIGJ5IEJCX05VTUJFUl9USFJFQURTCisJLSBDaGFuZ2Ugb2YgdGhlIFNWTiBGZXRjaGVyIHRvIGtlZXAgdGhlIGNoZWNrb3V0IGFyb3VuZAorCSAgY291cnRzZXkgb2YgUGF1bCBTb2tvbG92c2t5ICgjMTM2NykKKwktIFBBVEggZml4IHRvIGJiaW1hZ2UgKCMxMTA4KQorCS0gQWxsb3cgZGVidWcgZG9tYWlucyB0byBiZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmRsaW5lICgtbCkKKwktIEFsbG93ICdpbnRlcmFjdGl2ZScgdGFza3MKKwktIExvZ2dpbmcgbWVzc2FnZSBpbXByb3ZlbWVudHMKKwktIERyb3Agbm93IHVuZWVkZWQgQlVJTERfQUxMX0RFUFMgdmFyaWFibGUKKwktIEFkZCBzdXBwb3J0IGZvciB3aWxkY2FyZHMgdG8gLWIgb3B0aW9uCisJLSBNYWpvciBvdmVyaGF1bCBvZiB0aGUgZmV0Y2hlcnMgbWFraW5nIGEgbGFyZ2UgYW1vdW50IG9mIGNvZGUgY29tbW9uCisJICBpbmNsdWRpbmcgbWlycm9yaW5nIGNvZGUKKwktIEZldGNoZXJzIG5vdyB0b3VjaCBtZDUgc3RhbXBzIHVwb24gYWNjZXNzICh0byBzaG93IGFjdGl2aXR5KQorCS0gRml4IC1mIGZvcmNlIG9wdGlvbiB3aGVuIHVzZWQgd2l0aG91dCAtYiAobG9uZyBzdGFuZGluZyBidWcpCisJLSBBZGQgZXhwYW5kX2NhY2hlIHRvIGRhdGFfY2FjaGUucHksIGNhY2hpbmcgZXhwYW5kZWQgZGF0YSAoc3BlZWR1cCkKKwktIEFsbG93IHZlcnNpb24gZmllbGQgaW4gREVQRU5EUyAoaWdub3JlZCBmb3Igbm93KQorCS0gQWRkIGFib3J0IGZsYWcgc3VwcG9ydCB0byB0aGUgc2hlbGwKKwktIE1ha2UgaW5oZXJpdCBmYWlsIGlmIHRoZSBjbGFzcyBkb2Vzbid0IGV4aXN0ICgjMTQ3OCkKKwktIEZpeCBkYXRhLmVtaXRfZW52KCkgdG8gZXhwYW5kIGtleW5hbWVzIGFzIHdlbGwgYXMgdmFsdWVzCisJLSBBZGQgc3NoIGZldGNoZXIKKwktIEFkZCBwZXJmb3JjZSBmZXRjaGVyCisJLSBNYWtlIFBSRUZFUlJFRF9QUk9WSURFUl9mb29iYXIgZGVmYXVsdHMgdG8gZm9vYmFyIGlmIGF2YWlsYWJsZQorCS0gU2hhcmUgdGhlIHBhcnNlcidzIG10aW1lX2NhY2hlLCByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIHN0YXQgc3lzY2FsbHMKKwktIENvbXBpbGUgYWxsIGFub25mdW5jcyBhdCBvbmNlISAKKwkgICoqKiBBbm9uZnVuY3MgbXVzdCBub3cgdXNlIGNvbW1vbiBzcGFjaW5nIGZvcm1hdCAqKioKKwktIE1lbW9yaXNlIHRoZSBsaXN0IG9mIGhhbmRsZXJzIGluIF9fQkJIQU5ETEVSUyBhbmQgdGFza3MgaW4gX19CQlRBU0tTCisJICBUaGlzIHJlbW92ZXMgMiBtaWxsaW9uIGZ1bmN0aW9uIGNhbGxzIHJlc3VsdGluZyBpbiBhIDUtMTAlIHNwZWVkdXAKKwktIEFkZCBtYW5wYWdlCisJLSBVcGRhdGUgZ2VuZXJhdGVEb3RHcmFwaCB0byB1c2UgdGFza0RhdGEvcnVuUXVldWUgaW1wcm92aW5nIGFjY3VyYWN5CisJICBhbmQgYWxzbyBhZGRpbmcgYSB0YXNrIGRlcGVuZGVuY3kgZ3JhcGgKKwktIEZpeC9zdGFuZGFyZGlzZSBvbiBHUEx2MiBsaWNlbmNlCisJLSBNb3ZlIG1vc3QgZnVuY3Rpb25hbGl0eSBmcm9tIGJpbi9iaXRiYWtlIHRvIGNvb2tlci5weSBhbmQgc3BsaXQgaW50bworCSAgc2VwYXJhdGUgZnVuY2l0b25zCisJLSBDVlMgZmV0Y2hlcjogQWRkZWQgc3VwcG9ydCBmb3Igbm9uLWRlZmF1bHQgcG9ydAorCS0gQWRkIEJCSU5DTFVERUxPR1NfTElORVMsIHRoZSBudW1iZXIgb2YgbGluZXMgdG8gcmVhZCBmcm9tIGFueSBsb2dmaWxlCisJLSBEcm9wIHNoZWJhbmdzIGZyb20gbGliL2JiIHNjcmlwdHMKKworQ2hhbmdlcyBpbiBCaXRiYWtlIDEuNi4wOgorCS0gQmV0dGVyIG1zZyBoYW5kbGluZworCS0gQ09XIGRpY3QgaW1wbGVtZW50YXRpb24gZnJvbSBUaW0gQW5zZWxsIChtaXRocm8pIGxlYWRpbmcKKwkgIHRvIGJldHRlciBwZXJmb3JtYW5jZQorCS0gU3BlZWQgdXAgb2YgLXMKKworQ2hhbmdlcyBpbiBCaXRiYWtlIDEuNC40OgorCS0gU1JDREFURSBub3cgaGFuZGxpbmcgY291cnRzZXkgSnVzdGluIFBhdHJpbgorCS0gIzEwMTcgZml4IHRvIHdvcmsgd2l0aCBybV93b3JrCisKK0NoYW5nZXMgaW4gQml0QmFrZSAxLjQuMjoKKwktIFNlbmQgbG9ncyB0byBvZS5wYXN0ZWJpbi5jb20gaW5zdGVhZCBvZiBwYXN0ZWJpbi5jb20KKwkgIGZpeGVzICM4NTYKKwktIENvcHkgdGhlIGludGVybmFsIGJpdGJha2UgZGF0YSBiZWZvcmUgYnVpbGRpbmcgdGhlCisJICBkZXBlbmRlbmN5IGdyYXBoLiBUaGlzIGZpeGVzIG5hbm8gbm90IGhhdmluZyBhCisJICB2aXJ0dWFsL2xpYmMgZGVwZW5kZW5jeQorCS0gQWxsb3cgbXVsdGlwbGUgVEFSQkFMTF9TVEFTSCBlbnRyaWVzCisJLSBDYWNoZSwgY2hlY2sgaWYgdGhlIGRpcmVjdG9yeSBleGlzdHMgYmVmb3JlIGNoYW5naW5nCisJICBpbnRvIGl0CisJLSBnaXQgc3BlZWR1cCBjbG9uaW5nIGJ5IG5vdCBkb2luZyBhIGNoZWNrb3V0CisJLSBhbGxvdyB0byBoYXZlIHNwYWNlcyBpbiBmaWxlbmFtZXMgKC5jb25mLCAuYmIsIC5iYmNsYXNzKQorCitDaGFuZ2VzIGluIEJpdEJha2UgMS40LjA6CisJLSBGaXggdG8gY2hlY2sgYm90aCBSREVQRU5EUyBhbmQgUkRFUEVORFNfJHtQTn0KKwktIEZpeCBhIFJERVBFTkRTIHBhcnNpbmcgYnVnIGluIHV0aWxzOmV4cGxvZGVfZGVwcygpCisJLSBVcGRhdGUgZ2l0IGZldGNoZXIgYmVoYXZpb3VyIHRvIG1hdGNoIGdpdCBjaGFuZ2VzCisJLSBBU1NVTUVfUFJPVklERUQgYWxsb3dlZCB0byBpbmNsdWRlIHJ1bnRpbWUgcGFja2FnZXMKKwktIGdpdCBmZXRjaGVyIGNsZWFudXAgYW5kIGVmZmljZW5jeSBpbXByb3ZlbWVudHMKKwktIENoYW5nZSB0aGUgZm9ybWF0IG9mIHRoZSBjYWNoZQorCS0gVXBkYXRlIHVzZXJtYW51YWwgdG8gZG9jdW1lbnQgdGhlIEZldGNoZXJzCisJLSBNYWpvciBjaGFuZ2VzIHRvIGNhY2hpbmcgd2l0aCBhIG5ldyBzdHJhdGVneQorCSAgZ2l2aW5nIGEgbWFqb3IgcGVyZm9ybWFuY2UgaW5jcmVhc2Ugd2hlbiByZXBhcnNpbmcKKwkgIHdpdGggZmV3IGRhdGEgY2hhbmdlcworCitDaGFuZ2VzIGluIEJpdEJha2UgMS4zLjM6CisJLSBDcmVhdGUgYSBuZXcgRmV0Y2hlciBtb2R1bGUgdG8gZWFzZSB0aGUKKwkgIGRldmVsb3BtZW50IG9mIG5ldyBGZXRjaGVycy4KKwkgIElzc3VlICM0MzggZml4ZWQgYnkgcnB1cmRpZUBvcGVuZWRoYW5kLmNvbQorCS0gTWFrZSB0aGUgU3VidmVyc2lvbiBmZXRjaGVyIGhvbm9yIHRoZSBTUkMgRGF0ZQorCSAgKENWU0RBVEUpLgorCSAgSXNzdWUgIzU1NSBmaXhlZCBieSBjaHJpc0BvcGVuZWRoYW5kLmNvbQorCS0gRXhwYW5kIFBSRUZFUlJFRF9QUk9WSURFUiBwcm9wZXJseQorCSAgSXNzdWUgIzQzNiBmaXhlZCBieSBycHJ1ZGllQG9wZW5lZGhhbmQuY29tCisJLSBUeXBvIGZpeCBmb3IgSXNzdWUgIzUzMSBieSBQaGlsaXBwIFphYmVsIGZvciB0aGUKKwkgIEJpdEJha2UgU2hlbGwKKwktIEludHJvZHVjZSBhIG5ldyBzcGVjaWFsIHZhcmlhYmxlIFNSQ0RBVEUgYXMKKwkgIGEgZ2VuZXJpYyBuYW1pbmcgdG8gcmVwbGFjZSBDVlNEQVRFLgorCS0gSW50cm9kdWNlIGEgbmV3IGtleXdvcmQgJ3JlcXVpcmVkJy4gSW4gY29udHJhc3QKKwkgIHRvICdpbmNsdWRlJyBwYXJzaW5nIHdpbGwgZmFpbCBpZiBhIHRvIGJlIGluY2x1ZGVkCisJICBmaWxlIGNhbiBub3QgYmUgZm91bmQuCisJLSBSZW1vdmUgaGFyZGNvZGluZyBvZiB0aGUgU1RBTVAgZGlyZWN0b3J5LiBQYXRjaAorCSAgY291cnRzZXkgcEhpbGlwcCBaYWJlbAorCS0gVHJhY2sgdGhlIFJERVBFTkRTIG9mIGVhY2ggcGFja2FnZSAocnB1cmRpZUBvcGVuZWRoYW5kLmNvbSkKKwktIEludHJvZHVjZSBCVUlMRF9BTExfREVQUyB0byBidWlsZCBhbGwgUkRFUEVORFMuIEUuZworCSAgdGhpcyBpcyB1c2VkIGJ5IHRoZSBPcGVuRW1iZWRkZWQgTWV0YSBQYWNrYWdlcy4KKwkgIChycHVyZGllQG9wZW5lZGhhbmQuY29tKS4KKworQ2hhbmdlcyBpbiBCaXRCYWtlIDEuMy4yOgorCS0gcmVpbnRlZ3JhdGlvbiBvZiBtYWtlLnB5IGludG8gQml0QmFrZQorCS0gYmJyZWFkIGlzIGdvbmUsIHVzZSBiaXRiYWtlIC1lCisJLSBsb3RzIG9mIHNoZWxsIHVwZGF0ZXMgYW5kIGJ1Z2ZpeGVzCisJLSBJbnRyb2R1Y3Rpb24gb2YgdGhlIC49IGFuZCA9LiBvcGVyYXRvcgorCS0gU29ydCB2YXJpYWJsZXMsIGtleXMgYW5kIGdyb3VwcyBpbiBiaXRkb2MKKwktIEZpeCByZWdyZXNzaW9uIGluIHRoZSBoYW5kbGluZyBvZiBCQkNPTExFQ1RJT05TCisJLSBVcGRhdGUgdGhlIGJpdGJha2UgdXNlcm1hbnVhbAorCitDaGFuZ2VzIGluIEJpdEJha2UgMS4zLjA6CisJLSBhZGQgYml0YmFrZSBpbnRlcmFjdGl2ZSBzaGVsbCAoYml0YmFrZSAtaSkKKwktIHJlZmFjdG9yIGJpdGJha2UgdXRpbGl0eSBpbiBPTyBzdHlsZQorCS0ga2lsbCBkZWZhdWx0IGFyZ3VtZW50cyBpbiBtZXRob2RzIGluIHRoZSBiYi5kYXRhIG1vZHVsZQorCS0ga2lsbCBkZWZhdWx0IGFyZ3VtZW50cyBpbiBtZXRob2RzIGluIHRoZSBiYi5mZXRjaCBtb2R1bGUKKwktIHRoZSBodHRwL2h0dHBzL2Z0cCBmZXRjaGVyIHdpbGwgZmFpbCBpZiB0aGUgdG8gYmUgCisJICBkb3dubG9hZGVkIGZpbGUgd2FzIG5vdCBmb3VuZCBpbiBETF9ESVIgKHRoaXMgaXMgbmVlZGVkCisJICB0byBhdm9pZCB1bnBhY2tpbmcgdGhlIHNvdXJjZWZvcmdlIG1pcnJvciBwYWdlKQorCS0gU3dpdGNoIHRvIGEgY293IGxpa2UgZGF0YSBpbnN0YW5jZSBmb3IgcGVyc2lzdGVudCBhbmQgbm9uCisJICBwZXJzaXN0aW5nIG1vZGUgKGNhbGxlZCBkYXRhX3NtYXJ0LnB5KQorCS0gQ2hhbmdlZCB0aGUgY2FsbGJhY2sgb2YgYmIubWFrZS5jb2xsZWN0X2JiZmlsZXMgdG8gY2FycnkKKwkgIGFkZGl0aW9uYWwgcGFyYW1ldGVycworCS0gRHJhc3RpY2FsbHkgcmVkdWNlZCB0aGUgYW1vdW50IG9mIG5lZWRlZCBSQU0gYnkgbm90IGhvbGRpbmcKKwkgIGVhY2ggZGF0YSBpbnN0YW5jZSBpbiBtZW1vcnkgd2hlbiB1c2luZyBhIGNhY2hlL3BlcnNpc3RlbnQKKwkgIHN0b3JhZ2UKKworQ2hhbmdlcyBpbiBCaXRCYWtlIDEuMi4xOgorCVRoZSAxLjIuMSByZWxlYXNlIGlzIG1lYW50IGFzIGEgaW50ZXJtZWRpYXRlIHJlbGVhc2UgdG8gbGF5IHRoZQorCWdyb3VuZCBmb3IgbW9yZSByYWRpY2FsIGNoYW5nZXMuIFRoZSBtb3N0IG5vdGFibGUgY2hhbmdlcyBhcmU6CisKKwktIERvIG5vdCBoYXJkY29kZSB7fSwgdXNlIGJiLmRhdGEuaW5pdCgpIGluc3RlYWQgaWYgeW91IHdhbnQgdG8KKwkgIGdldCBhIGluc3RhbmNlIG9mIGEgZGF0YSBjbGFzcworCS0gYmIuZGF0YS5pbml0KCkgaXMgYSBmYWN0b3J5IGFuZCB0aGUgb2xkIGJiLmRhdGEgbWV0aG9kcyBhcmUgZGVsZWdhdGVzCisJLSBEbyBub3QgdXNlIGRlZXBjb3B5IHVzZSBiYi5kYXRhLmNyZWF0ZUNvcHkoKSBpbnN0ZWFkLgorCS0gUmVtb3ZlZCBkZWZhdWx0IGFyZ3VtZW50cyBpbiBiYi5mZXRjaAorCmRpZmYgLS1naXQgYS9iaXRiYWtlL0hFQURFUiBiL2JpdGJha2UvSEVBREVSCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NTkyNTUKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL0hFQURFUgpAQCAtMCwwICsxLDE5IEBACisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIworIyA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgorIyBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9MSUNFTlNFIGIvYml0YmFrZS9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MDE0MGMKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL0xJQ0VOU0UKQEAgLTAsMCArMSwxMCBAQAorQml0QmFrZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjAuIFNlZSBDT1BZSU5HIGZvciBmdXJ0aGVyIGRldGFpbHMuCisKK1RoZSBmb2xsb3dpbmcgZXh0ZXJuYWwgY29tcG9uZW50cyBhcmUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlOgorCisqIFRoZSBUb2FzdGVyIFNpbXBsZSBVSSBhcHBsaWNhdGlvbiBpcyBiYXNlZCB1cG9uIHRoZSBEamFuZ28gcHJvamVjdCB0ZW1wbGF0ZSwgdGhlIGZpbGVzIG9mIHdoaWNoIGFyZSBjb3ZlcmVkIGJ5IHRoZSBCU0QgbGljZW5zZSBhbmQgYXJlIGNvcHlyaWdodCAoYykgRGphbmdvIFNvZnR3YXJlCitGb3VuZGF0aW9uIGFuZCBpbmRpdmlkdWFsIGNvbnRyaWJ1dG9ycy4KKworKiBUd2l0dGVyIEJvb3RzdHJhcCAoaW5jbHVkaW5nIEdseXBoaWNvbnMpLCByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSAyLjAuCisKKyogalF1ZXJ5IGlzIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9iaW4vYml0YmFrZSBiL2JpdGJha2UvYmluL2JpdGJha2UKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTNkMTM4YgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvYmluL2JpdGJha2UKQEAgLTAsMCArMSw1MyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIworIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgIENocmlzIExhcnNvbgorIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgIFBoaWwgQmx1bmRlbGwKKyMgQ29weXJpZ2h0IChDKSAyMDAzIC0gMjAwNSBNaWNoYWVsICdNaWNrZXknIExhdWVyCisjIENvcHlyaWdodCAoQykgMjAwNSAgICAgICAgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIKKyMgQ29weXJpZ2h0IChDKSAyMDA1ICAgICAgICBST0FEIEdtYkgKKyMgQ29weXJpZ2h0IChDKSAyMDA2ICAgICAgICBSaWNoYXJkIFB1cmRpZQorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCisKK3N5cy5wYXRoLmluc2VydCgwLCBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGliJykpCit0cnk6CisgICAgaW1wb3J0IGJiCitleGNlcHQgUnVudGltZUVycm9yIGFzIGV4YzoKKyAgICBzeXMuZXhpdChzdHIoZXhjKSkKKworZnJvbSBiYiBpbXBvcnQgY29va2VyZGF0YQorZnJvbSBiYi5tYWluIGltcG9ydCBiaXRiYWtlX21haW4sIEJpdEJha2VDb25maWdQYXJhbWV0ZXJzLCBCQk1haW5FeGNlcHRpb24KKworX192ZXJzaW9uX18gPSAiMS4yNy4xIgorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIGlmIF9fdmVyc2lvbl9fICE9IGJiLl9fdmVyc2lvbl9fOgorICAgICAgICBzeXMuZXhpdCgiQml0YmFrZSBjb3JlIHZlcnNpb24gYW5kIHByb2dyYW0gdmVyc2lvbiBtaXNtYXRjaCEiKQorICAgIHRyeToKKyAgICAgICAgc3lzLmV4aXQoYml0YmFrZV9tYWluKEJpdEJha2VDb25maWdQYXJhbWV0ZXJzKHN5cy5hcmd2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tlcmRhdGEuQ29va2VyQ29uZmlndXJhdGlvbigpKSkKKyAgICBleGNlcHQgQkJNYWluRXhjZXB0aW9uIGFzIGVycjoKKyAgICAgICAgc3lzLmV4aXQoZXJyKQorICAgIGV4Y2VwdCBiYi5CQkhhbmRsZWRFeGNlcHRpb246CisgICAgICAgIHN5cy5leGl0KDEpCisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgaW1wb3J0IHRyYWNlYmFjaworICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkKKyAgICAgICAgc3lzLmV4aXQoMSkKZGlmZiAtLWdpdCBhL2JpdGJha2UvYmluL2JpdGJha2UtZGlmZnNpZ3MgYi9iaXRiYWtlL2Jpbi9iaXRiYWtlLWRpZmZzaWdzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE5NmYwYjcKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2Jpbi9iaXRiYWtlLWRpZmZzaWdzCkBAIC0wLDAgKzEsMTM4IEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIyBiaXRiYWtlLWRpZmZzaWdzCisjIEJpdEJha2UgdGFzayBzaWduYXR1cmUgZGF0YSBjb21wYXJpc29uIHV0aWxpdHkKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEyLTIwMTMgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHdhcm5pbmdzCitpbXBvcnQgZm5tYXRjaAoraW1wb3J0IG9wdHBhcnNlCitpbXBvcnQgbG9nZ2luZworCitzeXMucGF0aC5pbnNlcnQoMCwgb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoc3lzLmFyZ3ZbMF0pKSwgJ2xpYicpKQorCitpbXBvcnQgYmIudGluZm9pbAoraW1wb3J0IGJiLnNpZ2dlbgorCitkZWYgbG9nZ2VyX2NyZWF0ZShuYW1lLCBvdXRwdXQ9c3lzLnN0ZGVycik6CisgICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIobmFtZSkKKyAgICBjb25zb2xlID0gbG9nZ2luZy5TdHJlYW1IYW5kbGVyKG91dHB1dCkKKyAgICBmb3JtYXQgPSBiYi5tc2cuQkJMb2dGb3JtYXR0ZXIoIiUobGV2ZWxuYW1lKXM6ICUobWVzc2FnZSlzIikKKyAgICBpZiBvdXRwdXQuaXNhdHR5KCk6CisgICAgICAgIGZvcm1hdC5lbmFibGVfY29sb3IoKQorICAgIGNvbnNvbGUuc2V0Rm9ybWF0dGVyKGZvcm1hdCkKKyAgICBsb2dnZXIuYWRkSGFuZGxlcihjb25zb2xlKQorICAgIGxvZ2dlci5zZXRMZXZlbChsb2dnaW5nLklORk8pCisgICAgcmV0dXJuIGxvZ2dlcgorCitsb2dnZXIgPSBsb2dnZXJfY3JlYXRlKCdiaXRiYWtlLWRpZmZzaWdzJykKKworZGVmIGZpbmRfY29tcGFyZV90YXNrKGJiaGFuZGxlciwgcG4sIHRhc2tuYW1lKToKKyAgICAiIiIgRmluZCB0aGUgbW9zdCByZWNlbnQgc2lnbmF0dXJlIGZpbGVzIGZvciB0aGUgc3BlY2lmaWVkIFBOL3Rhc2sgYW5kIGNvbXBhcmUgdGhlbSAiIiIKKworICAgIGRlZiBnZXRfaGFzaHZhbChzaWdpbmZvKToKKyAgICAgICAgaWYgc2lnaW5mby5lbmRzd2l0aCgnLnNpZ2luZm8nKToKKyAgICAgICAgICAgIHJldHVybiBzaWdpbmZvLnJwYXJ0aXRpb24oJzonKVsyXS5wYXJ0aXRpb24oJ18nKVswXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNpZ2luZm8ucnBhcnRpdGlvbignLicpWzJdCisKKyAgICBpZiBub3QgaGFzYXR0cihiYi5zaWdnZW4sICdmaW5kX3NpZ2luZm8nKToKKyAgICAgICAgbG9nZ2VyLmVycm9yKCdNZXRhZGF0YSBkb2VzIG5vdCBzdXBwb3J0IGZpbmRpbmcgc2lnbmF0dXJlIGRhdGEgZmlsZXMnKQorICAgICAgICBzeXMuZXhpdCgxKQorCisgICAgaWYgbm90IHRhc2tuYW1lLnN0YXJ0c3dpdGgoJ2RvXycpOgorICAgICAgICB0YXNrbmFtZSA9ICdkb18lcycgJSB0YXNrbmFtZQorCisgICAgZmlsZWRhdGVzID0gYmIuc2lnZ2VuLmZpbmRfc2lnaW5mbyhwbiwgdGFza25hbWUsIE5vbmUsIGJiaGFuZGxlci5jb25maWdfZGF0YSkKKyAgICBsYXRlc3RmaWxlcyA9IHNvcnRlZChmaWxlZGF0ZXMua2V5cygpLCBrZXk9bGFtYmRhIGY6IGZpbGVkYXRlc1tmXSlbLTM6XQorICAgIGlmIG5vdCBsYXRlc3RmaWxlczoKKyAgICAgICAgbG9nZ2VyLmVycm9yKCdObyBzaWdkYXRhIGZpbGVzIGZvdW5kIG1hdGNoaW5nICVzICVzJyAlIChwbiwgdGFza25hbWUpKQorICAgICAgICBzeXMuZXhpdCgxKQorICAgIGVsaWYgbGVuKGxhdGVzdGZpbGVzKSA8IDI6CisgICAgICAgIGxvZ2dlci5lcnJvcignT25seSBvbmUgbWF0Y2hpbmcgc2lnZGF0YSBmaWxlIGZvdW5kIGZvciB0aGUgc3BlY2lmaWVkIHRhc2sgKCVzICVzKScgJSAocG4sIHRhc2tuYW1lKSkKKyAgICAgICAgc3lzLmV4aXQoMSkKKyAgICBlbHNlOgorICAgICAgICAjIEl0J3MgcG9zc2libGUgdGhhdCBsYXRlc3RmaWxlcyBjb250YWluIDMgZWxlbWVudHMgYW5kIHRoZSBmaXJzdCB0d28gaGF2ZSB0aGUgc2FtZSBoYXNoIHZhbHVlLgorICAgICAgICAjIEluIHRoaXMgY2FzZSwgd2UgZGVsZXRlIHRoZSBzZWNvbmQgZWxlbWVudC4KKyAgICAgICAgIyBUaGUgYWJvdmUgY2FzZSBpcyBhY3R1YWxseSB0aGUgbW9zdCBjb21tb24gb25lLiBCZWNhdXNlIHdlIG1heSBoYXZlIHNpZ2RhdGEgZmlsZSBhbmQgc2lnaW5mbworICAgICAgICAjIGZpbGUgaGF2aW5nIHRoZSBzYW1lIGhhc2ggdmFsdWUuIENvbXBhcmluZyBzdWNoIHR3byBmaWxlcyBtYWtlcyBubyBzZW5zZS4KKyAgICAgICAgaWYgbGVuKGxhdGVzdGZpbGVzKSA9PSAzOgorICAgICAgICAgICAgaGFzaDAgPSBnZXRfaGFzaHZhbChsYXRlc3RmaWxlc1swXSkKKyAgICAgICAgICAgIGhhc2gxID0gZ2V0X2hhc2h2YWwobGF0ZXN0ZmlsZXNbMV0pCisgICAgICAgICAgICBpZiBoYXNoMCA9PSBoYXNoMToKKyAgICAgICAgICAgICAgICBsYXRlc3RmaWxlcy5wb3AoMSkKKworICAgICAgICAjIERlZmluZSByZWN1cnNpb24gY2FsbGJhY2sKKyAgICAgICAgZGVmIHJlY3Vyc2VjYihrZXksIGhhc2gxLCBoYXNoMik6CisgICAgICAgICAgICBoYXNoZXMgPSBbaGFzaDEsIGhhc2gyXQorICAgICAgICAgICAgaGFzaGZpbGVzID0gYmIuc2lnZ2VuLmZpbmRfc2lnaW5mbyhrZXksIE5vbmUsIGhhc2hlcywgYmJoYW5kbGVyLmNvbmZpZ19kYXRhKQorCisgICAgICAgICAgICByZWNvdXQgPSBbXQorICAgICAgICAgICAgaWYgbGVuKGhhc2hmaWxlcykgPT0gMjoKKyAgICAgICAgICAgICAgICBvdXQyID0gYmIuc2lnZ2VuLmNvbXBhcmVfc2lnZmlsZXMoaGFzaGZpbGVzW2hhc2gxXSwgaGFzaGZpbGVzW2hhc2gyXSwgcmVjdXJzZWNiKQorICAgICAgICAgICAgICAgIHJlY291dC5leHRlbmQobGlzdCgnICAnICsgbCBmb3IgbCBpbiBvdXQyKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmVjb3V0LmFwcGVuZCgiVW5hYmxlIHRvIGZpbmQgbWF0Y2hpbmcgc2lnZGF0YSBmb3IgJXMgd2l0aCBoYXNoZXMgJXMgb3IgJXMiICUgKGtleSwgaGFzaDEsIGhhc2gyKSkKKworICAgICAgICAgICAgcmV0dXJuIHJlY291dAorCisgICAgICAgICMgUmVjdXJzZSBpbnRvIHNpZ25hdHVyZSBjb21wYXJpc29uCisgICAgICAgIG91dHB1dCA9IGJiLnNpZ2dlbi5jb21wYXJlX3NpZ2ZpbGVzKGxhdGVzdGZpbGVzWzBdLCBsYXRlc3RmaWxlc1sxXSwgcmVjdXJzZWNiKQorICAgICAgICBpZiBvdXRwdXQ6CisgICAgICAgICAgICBwcmludCAnXG4nLmpvaW4ob3V0cHV0KQorICAgIHN5cy5leGl0KDApCisKKworCitwYXJzZXIgPSBvcHRwYXJzZS5PcHRpb25QYXJzZXIoCisgICAgZGVzY3JpcHRpb24gPSAiQ29tcGFyZXMgc2lnaW5mby9zaWdkYXRhIGZpbGVzIHdyaXR0ZW4gb3V0IGJ5IEJpdEJha2UiLAorICAgIHVzYWdlID0gIiIiCisgICVwcm9nIC10IHJlY2lwZW5hbWUgdGFza25hbWUKKyAgJXByb2cgc2lnZGF0YWZpbGUxIHNpZ2RhdGFmaWxlMgorICAlcHJvZyBzaWdkYXRhZmlsZTEiIiIpCisKK3BhcnNlci5hZGRfb3B0aW9uKCItdCIsICItLXRhc2siLAorICAgICAgICBoZWxwID0gImZpbmQgdGhlIHNpZ25hdHVyZSBkYXRhIGZpbGVzIGZvciBsYXN0IHR3byBydW5zIG9mIHRoZSBzcGVjaWZpZWQgdGFzayBhbmQgY29tcGFyZSB0aGVtIiwKKyAgICAgICAgYWN0aW9uPSJzdG9yZSIsIGRlc3Q9InRhc2thcmdzIiwgbmFyZ3M9MiwgbWV0YXZhcj0ncmVjaXBlbmFtZSB0YXNrbmFtZScpCisKK29wdGlvbnMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncyhzeXMuYXJndikKKworaWYgb3B0aW9ucy50YXNrYXJnczoKKyAgICB0aW5mb2lsID0gYmIudGluZm9pbC5UaW5mb2lsKCkKKyAgICB0aW5mb2lsLnByZXBhcmUoY29uZmlnX29ubHkgPSBUcnVlKQorICAgIGZpbmRfY29tcGFyZV90YXNrKHRpbmZvaWwsIG9wdGlvbnMudGFza2FyZ3NbMF0sIG9wdGlvbnMudGFza2FyZ3NbMV0pCitlbHNlOgorICAgIGlmIGxlbihhcmdzKSA9PSAxOgorICAgICAgICBwYXJzZXIucHJpbnRfaGVscCgpCisgICAgZWxzZToKKyAgICAgICAgaW1wb3J0IGNQaWNrbGUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgbGVuKGFyZ3MpID09IDI6CisgICAgICAgICAgICAgICAgb3V0cHV0ID0gYmIuc2lnZ2VuLmR1bXBfc2lnZmlsZShzeXMuYXJndlsxXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb3V0cHV0ID0gYmIuc2lnZ2VuLmNvbXBhcmVfc2lnZmlsZXMoc3lzLmFyZ3ZbMV0sIHN5cy5hcmd2WzJdKQorICAgICAgICBleGNlcHQgSU9FcnJvciBhcyBlOgorICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHN0cihlKSkKKyAgICAgICAgICAgIHN5cy5leGl0KDEpCisgICAgICAgIGV4Y2VwdCBjUGlja2xlLlVucGlja2xpbmdFcnJvciwgRU9GRXJyb3I6CisgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0ludmFsaWQgc2lnbmF0dXJlIGRhdGEgLSBlbnN1cmUgeW91IGFyZSBzcGVjaWZ5aW5nIHNpZ2RhdGEvc2lnaW5mbyBmaWxlcycpCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorCisgICAgICAgIGlmIG91dHB1dDoKKyAgICAgICAgICAgIHByaW50ICdcbicuam9pbihvdXRwdXQpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2Jpbi9iaXRiYWtlLWR1bXBzaWcgYi9iaXRiYWtlL2Jpbi9iaXRiYWtlLWR1bXBzaWcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjU2ZDkzYQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvYmluL2JpdGJha2UtZHVtcHNpZwpAQCAtMCwwICsxLDY1IEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIyBiaXRiYWtlLWR1bXBzaWcKKyMgQml0QmFrZSB0YXNrIHNpZ25hdHVyZSBkdW1wIHV0aWxpdHkKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEzIEludGVsIENvcnBvcmF0aW9uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB3YXJuaW5ncworaW1wb3J0IG9wdHBhcnNlCitpbXBvcnQgbG9nZ2luZworCitzeXMucGF0aC5pbnNlcnQoMCwgb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoc3lzLmFyZ3ZbMF0pKSwgJ2xpYicpKQorCitpbXBvcnQgYmIuc2lnZ2VuCisKK2RlZiBsb2dnZXJfY3JlYXRlKG5hbWUsIG91dHB1dD1zeXMuc3RkZXJyKToKKyAgICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihuYW1lKQorICAgIGNvbnNvbGUgPSBsb2dnaW5nLlN0cmVhbUhhbmRsZXIob3V0cHV0KQorICAgIGZvcm1hdCA9IGJiLm1zZy5CQkxvZ0Zvcm1hdHRlcigiJShsZXZlbG5hbWUpczogJShtZXNzYWdlKXMiKQorICAgIGlmIG91dHB1dC5pc2F0dHkoKToKKyAgICAgICAgZm9ybWF0LmVuYWJsZV9jb2xvcigpCisgICAgY29uc29sZS5zZXRGb3JtYXR0ZXIoZm9ybWF0KQorICAgIGxvZ2dlci5hZGRIYW5kbGVyKGNvbnNvbGUpCisgICAgbG9nZ2VyLnNldExldmVsKGxvZ2dpbmcuSU5GTykKKyAgICByZXR1cm4gbG9nZ2VyCisKK2xvZ2dlciA9IGxvZ2dlcl9jcmVhdGUoJ2JpdGJha2UtZHVtcHNpZycpCisKK3BhcnNlciA9IG9wdHBhcnNlLk9wdGlvblBhcnNlcigKKyAgICBkZXNjcmlwdGlvbiA9ICJEdW1wcyBzaWdpbmZvL3NpZ2RhdGEgZmlsZXMgd3JpdHRlbiBvdXQgYnkgQml0QmFrZSIsCisgICAgdXNhZ2UgPSAiIiIKKyAgJXByb2cgc2lnZGF0YWZpbGUiIiIpCisKK29wdGlvbnMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncyhzeXMuYXJndikKKworaWYgbGVuKGFyZ3MpID09IDE6CisgICAgcGFyc2VyLnByaW50X2hlbHAoKQorZWxzZToKKyAgICBpbXBvcnQgY1BpY2tsZQorICAgIHRyeToKKyAgICAgICAgb3V0cHV0ID0gYmIuc2lnZ2VuLmR1bXBfc2lnZmlsZShhcmdzWzFdKQorICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGU6CisgICAgICAgIGxvZ2dlci5lcnJvcihzdHIoZSkpCisgICAgICAgIHN5cy5leGl0KDEpCisgICAgZXhjZXB0IGNQaWNrbGUuVW5waWNrbGluZ0Vycm9yLCBFT0ZFcnJvcjoKKyAgICAgICAgbG9nZ2VyLmVycm9yKCdJbnZhbGlkIHNpZ25hdHVyZSBkYXRhIC0gZW5zdXJlIHlvdSBhcmUgc3BlY2lmeWluZyBhIHNpZ2RhdGEvc2lnaW5mbyBmaWxlJykKKyAgICAgICAgc3lzLmV4aXQoMSkKKworICAgIGlmIG91dHB1dDoKKyAgICAgICAgcHJpbnQgJ1xuJy5qb2luKG91dHB1dCkKZGlmZiAtLWdpdCBhL2JpdGJha2UvYmluL2JpdGJha2UtbGF5ZXJzIGIvYml0YmFrZS9iaW4vYml0YmFrZS1sYXllcnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmIxMzA0NAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvYmluL2JpdGJha2UtbGF5ZXJzCkBAIC0wLDAgKzEsMTA3MiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyMgVGhpcyBzY3JpcHQgaGFzIHN1YmNvbW1hbmRzIHdoaWNoIG9wZXJhdGUgYWdhaW5zdCB5b3VyIGJpdGJha2UgbGF5ZXJzLCBlaXRoZXIKKyMgZGlzcGxheWluZyB1c2VmdWwgaW5mb3JtYXRpb24sIG9yIGFjdGluZyBhZ2FpbnN0IHRoZW0uCisjIFNlZSB0aGUgaGVscCBvdXRwdXQgZm9yIGRldGFpbHMgb24gYXZhaWxhYmxlIGNvbW1hbmRzLgorCisjIENvcHlyaWdodCAoQykgMjAxMSBNZW50b3IgR3JhcGhpY3MgQ29ycG9yYXRpb24KKyMgQ29weXJpZ2h0IChDKSAyMDExLTIwMTUgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCBmbm1hdGNoCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZWZhdWx0ZGljdAoraW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgcmUKK2ltcG9ydCBodHRwbGliLCB1cmxwYXJzZSwganNvbgoraW1wb3J0IHN1YnByb2Nlc3MKKworYmluZGlyID0gb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKQordG9wZGlyID0gb3MucGF0aC5kaXJuYW1lKGJpbmRpcikKK3N5cy5wYXRoWzA6MF0gPSBbb3MucGF0aC5qb2luKHRvcGRpciwgJ2xpYicpXQorCitpbXBvcnQgYmIuY2FjaGUKK2ltcG9ydCBiYi5jb29rZXIKK2ltcG9ydCBiYi5wcm92aWRlcnMKK2ltcG9ydCBiYi51dGlscworaW1wb3J0IGJiLnRpbmZvaWwKKworCitkZWYgbG9nZ2VyX2NyZWF0ZShuYW1lLCBvdXRwdXQ9c3lzLnN0ZGVycik6CisgICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIobmFtZSkKKyAgICBjb25zb2xlID0gbG9nZ2luZy5TdHJlYW1IYW5kbGVyKG91dHB1dCkKKyAgICBmb3JtYXQgPSBiYi5tc2cuQkJMb2dGb3JtYXR0ZXIoIiUobGV2ZWxuYW1lKXM6ICUobWVzc2FnZSlzIikKKyAgICBpZiBvdXRwdXQuaXNhdHR5KCk6CisgICAgICAgIGZvcm1hdC5lbmFibGVfY29sb3IoKQorICAgIGNvbnNvbGUuc2V0Rm9ybWF0dGVyKGZvcm1hdCkKKyAgICBsb2dnZXIuYWRkSGFuZGxlcihjb25zb2xlKQorICAgIGxvZ2dlci5zZXRMZXZlbChsb2dnaW5nLklORk8pCisgICAgcmV0dXJuIGxvZ2dlcgorCitsb2dnZXIgPSBsb2dnZXJfY3JlYXRlKCdiaXRiYWtlLWxheWVycycsIHN5cy5zdGRvdXQpCisKK2NsYXNzIFVzZXJFcnJvcihFeGNlcHRpb24pOgorICAgIHBhc3MKKworY2xhc3MgQ29tbWFuZHMoKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuYmJoYW5kbGVyID0gTm9uZQorICAgICAgICBzZWxmLmJibGF5ZXJzID0gW10KKworICAgIGRlZiBpbml0X2JiaGFuZGxlcihzZWxmLCBjb25maWdfb25seSA9IEZhbHNlKToKKyAgICAgICAgaWYgbm90IHNlbGYuYmJoYW5kbGVyOgorICAgICAgICAgICAgc2VsZi5iYmhhbmRsZXIgPSBiYi50aW5mb2lsLlRpbmZvaWwodHJhY2tpbmc9VHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuYmJsYXllcnMgPSAoc2VsZi5iYmhhbmRsZXIuY29uZmlnX2RhdGEuZ2V0VmFyKCdCQkxBWUVSUycsIFRydWUpIG9yICIiKS5zcGxpdCgpCisgICAgICAgICAgICBzZWxmLmJiaGFuZGxlci5wcmVwYXJlKGNvbmZpZ19vbmx5KQorICAgICAgICAgICAgbGF5ZXJjb25mcyA9IHNlbGYuYmJoYW5kbGVyLmNvbmZpZ19kYXRhLnZhcmhpc3RvcnkuZ2V0X3ZhcmlhYmxlX2l0ZW1zX2ZpbGVzKCdCQkZJTEVfQ09MTEVDVElPTlMnLCBzZWxmLmJiaGFuZGxlci5jb25maWdfZGF0YSkKKyAgICAgICAgICAgIHNlbGYuYmJmaWxlX2NvbGxlY3Rpb25zID0ge2xheWVyOiBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKHBhdGgpKSBmb3IgbGF5ZXIsIHBhdGggaW4gbGF5ZXJjb25mcy5pdGVyaXRlbXMoKX0KKworCisgICAgZGVmIGRvX3Nob3dfbGF5ZXJzKHNlbGYsIGFyZ3MpOgorICAgICAgICAiIiJzaG93IGN1cnJlbnQgY29uZmlndXJlZCBsYXllcnMiIiIKKyAgICAgICAgc2VsZi5pbml0X2JiaGFuZGxlcihjb25maWdfb25seSA9IFRydWUpCisgICAgICAgIGxvZ2dlci5wbGFpbigiJXMgICVzICAlcyIgJSAoImxheWVyIi5sanVzdCgyMCksICJwYXRoIi5sanVzdCg0MCksICJwcmlvcml0eSIpKQorICAgICAgICBsb2dnZXIucGxhaW4oJz0nICogNzQpCisgICAgICAgIGZvciBsYXllciwgXywgcmVnZXgsIHByaSBpbiBzZWxmLmJiaGFuZGxlci5jb29rZXIucmVjaXBlY2FjaGUuYmJmaWxlX2NvbmZpZ19wcmlvcml0aWVzOgorICAgICAgICAgICAgbGF5ZXJkaXIgPSBzZWxmLmJiZmlsZV9jb2xsZWN0aW9ucy5nZXQobGF5ZXIsIE5vbmUpCisgICAgICAgICAgICBsYXllcm5hbWUgPSBzZWxmLmdldF9sYXllcl9uYW1lKGxheWVyZGlyKQorICAgICAgICAgICAgbG9nZ2VyLnBsYWluKCIlcyAgJXMgICVkIiAlIChsYXllcm5hbWUubGp1c3QoMjApLCBsYXllcmRpci5sanVzdCg0MCksIHByaSkpCisKKworICAgIGRlZiBkb19hZGRfbGF5ZXIoc2VsZiwgYXJncyk6CisgICAgICAgICIiIkFkZCBhIGxheWVyIHRvIGJibGF5ZXJzLmNvbmYKKworQWRkcyB0aGUgc3BlY2lmaWVkIGxheWVyIHRvIGJibGF5ZXJzLmNvbmYKKyIiIgorICAgICAgICBsYXllcmRpciA9IG9zLnBhdGguYWJzcGF0aChhcmdzLmxheWVyZGlyKQorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMobGF5ZXJkaXIpOgorICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiU3BlY2lmaWVkIGxheWVyIGRpcmVjdG9yeSBkb2Vzbid0IGV4aXN0XG4iKQorICAgICAgICAgICAgcmV0dXJuIDEKKworICAgICAgICBsYXllcl9jb25mID0gb3MucGF0aC5qb2luKGxheWVyZGlyLCAnY29uZicsICdsYXllci5jb25mJykKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGxheWVyX2NvbmYpOgorICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiU3BlY2lmaWVkIGxheWVyIGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gYSBjb25mL2xheWVyLmNvbmYgZmlsZVxuIikKKyAgICAgICAgICAgIHJldHVybiAxCisKKyAgICAgICAgYmJsYXllcnNfY29uZiA9IG9zLnBhdGguam9pbignY29uZicsICdiYmxheWVycy5jb25mJykKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGJibGF5ZXJzX2NvbmYpOgorICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiVW5hYmxlIHRvIGZpbmQgYmJsYXllcnMuY29uZlxuIikKKyAgICAgICAgICAgIHJldHVybiAxCisKKyAgICAgICAgKG5vdGFkZGVkLCBfKSA9IGJiLnV0aWxzLmVkaXRfYmJsYXllcnNfY29uZihiYmxheWVyc19jb25mLCBsYXllcmRpciwgTm9uZSkKKyAgICAgICAgaWYgbm90YWRkZWQ6CisgICAgICAgICAgICBmb3IgaXRlbSBpbiBub3RhZGRlZDoKKyAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJTcGVjaWZpZWQgbGF5ZXIgJXMgaXMgYWxyZWFkeSBpbiBCQkxBWUVSU1xuIiAlIGl0ZW0pCisKKworICAgIGRlZiBkb19yZW1vdmVfbGF5ZXIoc2VsZiwgYXJncyk6CisgICAgICAgICIiIlJlbW92ZSBhIGxheWVyIGZyb20gYmJsYXllcnMuY29uZgorCitSZW1vdmVzIHRoZSBzcGVjaWZpZWQgbGF5ZXIgZnJvbSBiYmxheWVycy5jb25mCisiIiIKKyAgICAgICAgYmJsYXllcnNfY29uZiA9IG9zLnBhdGguam9pbignY29uZicsICdiYmxheWVycy5jb25mJykKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGJibGF5ZXJzX2NvbmYpOgorICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiVW5hYmxlIHRvIGZpbmQgYmJsYXllcnMuY29uZlxuIikKKyAgICAgICAgICAgIHJldHVybiAxCisKKyAgICAgICAgaWYgYXJncy5sYXllcmRpci5zdGFydHN3aXRoKCcqJyk6CisgICAgICAgICAgICBsYXllcmRpciA9IGFyZ3MubGF5ZXJkaXIKKyAgICAgICAgZWxpZiBub3QgJy8nIGluIGFyZ3MubGF5ZXJkaXI6CisgICAgICAgICAgICBsYXllcmRpciA9ICcqLyVzJyAlIGFyZ3MubGF5ZXJkaXIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxheWVyZGlyID0gb3MucGF0aC5hYnNwYXRoKGFyZ3MubGF5ZXJkaXIpCisgICAgICAgIChfLCBub3RyZW1vdmVkKSA9IGJiLnV0aWxzLmVkaXRfYmJsYXllcnNfY29uZihiYmxheWVyc19jb25mLCBOb25lLCBsYXllcmRpcikKKyAgICAgICAgaWYgbm90cmVtb3ZlZDoKKyAgICAgICAgICAgIGZvciBpdGVtIGluIG5vdHJlbW92ZWQ6CisgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiTm8gbGF5ZXJzIG1hdGNoaW5nICVzIGZvdW5kIGluIEJCTEFZRVJTXG4iICUgaXRlbSkKKyAgICAgICAgICAgIHJldHVybiAxCisKKworICAgIGRlZiBnZXRfanNvbl9kYXRhKHNlbGYsIGFwaXVybCk6CisgICAgICAgIHByb3h5X3NldHRpbmdzID0gb3MuZW52aXJvbi5nZXQoImh0dHBfcHJveHkiLCBOb25lKQorICAgICAgICBjb25uID0gTm9uZQorICAgICAgICBfcGFyc2VkdXJsID0gdXJscGFyc2UudXJscGFyc2UoYXBpdXJsKQorICAgICAgICBwYXRoID0gX3BhcnNlZHVybC5wYXRoCisgICAgICAgIHF1ZXJ5ID0gX3BhcnNlZHVybC5xdWVyeQorICAgICAgICBkZWYgcGFyc2VfdXJsKHVybCk6CisgICAgICAgICAgICBwYXJzZWR1cmwgPSB1cmxwYXJzZS51cmxwYXJzZSh1cmwpCisgICAgICAgICAgICBpZiBwYXJzZWR1cmwubmV0bG9jWzBdID09ICdbJzoKKyAgICAgICAgICAgICAgICBob3N0LCBwb3J0ID0gcGFyc2VkdXJsLm5ldGxvY1sxOl0uc3BsaXQoJ10nLCAxKQorICAgICAgICAgICAgICAgIGlmICc6JyBpbiBwb3J0OgorICAgICAgICAgICAgICAgICAgICBwb3J0ID0gcG9ydC5yc3BsaXQoJzonLCAxKVsxXQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHBvcnQgPSBOb25lCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHBhcnNlZHVybC5uZXRsb2MuY291bnQoJzonKSA9PSAxOgorICAgICAgICAgICAgICAgICAgICAoaG9zdCwgcG9ydCkgPSBwYXJzZWR1cmwubmV0bG9jLnNwbGl0KCI6IikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBob3N0ID0gcGFyc2VkdXJsLm5ldGxvYworICAgICAgICAgICAgICAgICAgICBwb3J0ID0gTm9uZQorICAgICAgICAgICAgcmV0dXJuIChob3N0LCA4MCBpZiBwb3J0IGlzIE5vbmUgZWxzZSBpbnQocG9ydCkpCisKKyAgICAgICAgaWYgcHJveHlfc2V0dGluZ3MgaXMgTm9uZToKKyAgICAgICAgICAgIGhvc3QsIHBvcnQgPSBwYXJzZV91cmwoYXBpdXJsKQorICAgICAgICAgICAgY29ubiA9IGh0dHBsaWIuSFRUUENvbm5lY3Rpb24oaG9zdCwgcG9ydCkKKyAgICAgICAgICAgIGNvbm4ucmVxdWVzdCgiR0VUIiwgcGF0aCArICI/IiArIHF1ZXJ5KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaG9zdCwgcG9ydCA9IHBhcnNlX3VybChwcm94eV9zZXR0aW5ncykKKyAgICAgICAgICAgIGNvbm4gPSBodHRwbGliLkhUVFBDb25uZWN0aW9uKGhvc3QsIHBvcnQpCisgICAgICAgICAgICBjb25uLnJlcXVlc3QoIkdFVCIsIGFwaXVybCkKKworICAgICAgICByID0gY29ubi5nZXRyZXNwb25zZSgpCisgICAgICAgIGlmIHIuc3RhdHVzICE9IDIwMDoKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiRmFpbGVkIHRvIHJlYWQgIiArIHBhdGggKyAiOiAlZCAlcyIgJSAoci5zdGF0dXMsIHIucmVhc29uKSkKKyAgICAgICAgcmV0dXJuIGpzb24ubG9hZHMoci5yZWFkKCkpCisKKworICAgIGRlZiBnZXRfbGF5ZXJfZGVwcyhzZWxmLCBsYXllcm5hbWUsIGxheWVyaXRlbXMsIGxheWVyYnJhbmNoZXMsIGxheWVyZGVwZW5kZW5jaWVzLCBicmFuY2hudW0sIHNlbGZuYW1lPUZhbHNlKToKKyAgICAgICAgZGVmIGxheWVyaXRlbXNfaW5mb19pZChpdGVtc19uYW1lLCBsYXllcml0ZW1zKToKKyAgICAgICAgICAgIGxpdGVtc19pZCA9IE5vbmUKKyAgICAgICAgICAgIGZvciBsaSBpbiBsYXllcml0ZW1zOgorICAgICAgICAgICAgICAgIGlmIGxpWyduYW1lJ10gPT0gaXRlbXNfbmFtZToKKyAgICAgICAgICAgICAgICAgICAgbGl0ZW1zX2lkID0gbGlbJ2lkJ10KKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHJldHVybiBsaXRlbXNfaWQKKworICAgICAgICBkZWYgbGF5ZXJicmFuY2hlc19pbmZvKGl0ZW1zX2lkLCBsYXllcmJyYW5jaGVzKToKKyAgICAgICAgICAgIGxicmFuY2ggPSB7fQorICAgICAgICAgICAgZm9yIGxiIGluIGxheWVyYnJhbmNoZXM6CisgICAgICAgICAgICAgICAgaWYgbGJbJ2xheWVyJ10gPT0gaXRlbXNfaWQgYW5kIGxiWydicmFuY2gnXSA9PSBicmFuY2hudW06CisgICAgICAgICAgICAgICAgICAgIGxicmFuY2hbJ2lkJ10gPSBsYlsnaWQnXQorICAgICAgICAgICAgICAgICAgICBsYnJhbmNoWyd2Y3Nfc3ViZGlyJ10gPSBsYlsndmNzX3N1YmRpciddCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICByZXR1cm4gbGJyYW5jaAorCisgICAgICAgIGRlZiBsYXllcmRlcGVuZGVuY2llc19pbmZvKGxiX2lkLCBsYXllcmRlcGVuZGVuY2llcyk6CisgICAgICAgICAgICBsZF9kZXBzID0gW10KKyAgICAgICAgICAgIGZvciBsZCBpbiBsYXllcmRlcGVuZGVuY2llczoKKyAgICAgICAgICAgICAgICBpZiBsZFsnbGF5ZXJicmFuY2gnXSA9PSBsYl9pZCBhbmQgbm90IGxkWydkZXBlbmRlbmN5J10gaW4gbGRfZGVwczoKKyAgICAgICAgICAgICAgICAgICAgbGRfZGVwcy5hcHBlbmQobGRbJ2RlcGVuZGVuY3knXSkKKyAgICAgICAgICAgIGlmIG5vdCBsZF9kZXBzOgorICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiVGhlIGRlcGVuZGVuY3kgb2YgbGF5ZXJEZXBlbmRlbmNpZXMgaXMgbm90IGZvdW5kLiIpCisgICAgICAgICAgICByZXR1cm4gbGRfZGVwcworCisgICAgICAgIGRlZiBsYXllcml0ZW1zX2luZm9fbmFtZV9zdWJkaXIoaXRlbXNfaWQsIGxheWVyaXRlbXMpOgorICAgICAgICAgICAgbGl0ZW1zID0ge30KKyAgICAgICAgICAgIGZvciBsaSBpbiBsYXllcml0ZW1zOgorICAgICAgICAgICAgICAgIGlmIGxpWydpZCddID09IGl0ZW1zX2lkOgorICAgICAgICAgICAgICAgICAgICBsaXRlbXNbJ3Zjc191cmwnXSA9IGxpWyd2Y3NfdXJsJ10KKyAgICAgICAgICAgICAgICAgICAgbGl0ZW1zWyduYW1lJ10gPSBsaVsnbmFtZSddCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICByZXR1cm4gbGl0ZW1zCisKKyAgICAgICAgaWYgc2VsZm5hbWU6CisgICAgICAgICAgICBzZWxmaWQgPSBsYXllcml0ZW1zX2luZm9faWQobGF5ZXJuYW1lLCBsYXllcml0ZW1zKQorICAgICAgICAgICAgbGJpbmZvID0gbGF5ZXJicmFuY2hlc19pbmZvKHNlbGZpZCwgbGF5ZXJicmFuY2hlcykKKyAgICAgICAgICAgIGlmIGxiaW5mbzoKKyAgICAgICAgICAgICAgICBzZWxmc3ViZGlyID0gbGJpbmZvWyd2Y3Nfc3ViZGlyJ10KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCIlcyBpcyBub3QgZm91bmQgaW4gdGhlIHNwZWNpZmllZCBicmFuY2giICUgbGF5ZXJuYW1lKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgc2VsZnVybCA9IGxheWVyaXRlbXNfaW5mb19uYW1lX3N1YmRpcihzZWxmaWQsIGxheWVyaXRlbXMpWyd2Y3NfdXJsJ10KKyAgICAgICAgICAgIGlmIHNlbGZ1cmw6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGZ1cmwsIHNlbGZzdWJkaXIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJDYW5ub3QgZ2V0IGxheWVyICVzIGdpdCByZXBvIGFuZCBzdWJkaXIiICUgbGF5ZXJuYW1lKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBsZGljdCA9IHt9CisgICAgICAgIGl0ZW1zaWQgPSBsYXllcml0ZW1zX2luZm9faWQobGF5ZXJuYW1lLCBsYXllcml0ZW1zKQorICAgICAgICBpZiBub3QgaXRlbXNpZDoKKyAgICAgICAgICAgIHJldHVybiBsYXllcm5hbWUsIE5vbmUKKyAgICAgICAgbGJpZCA9IGxheWVyYnJhbmNoZXNfaW5mbyhpdGVtc2lkLCBsYXllcmJyYW5jaGVzKQorICAgICAgICBpZiBsYmlkOgorICAgICAgICAgICAgbGJpZCA9IGxheWVyYnJhbmNoZXNfaW5mbyhpdGVtc2lkLCBsYXllcmJyYW5jaGVzKVsnaWQnXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCIlcyBpcyBub3QgZm91bmQgaW4gdGhlIHNwZWNpZmllZCBicmFuY2giICUgbGF5ZXJuYW1lKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUsIE5vbmUKKyAgICAgICAgZm9yIGRlcGVuZGVuY3kgaW4gbGF5ZXJkZXBlbmRlbmNpZXNfaW5mbyhsYmlkLCBsYXllcmRlcGVuZGVuY2llcyk6CisgICAgICAgICAgICBsbmFtZSA9IGxheWVyaXRlbXNfaW5mb19uYW1lX3N1YmRpcihkZXBlbmRlbmN5LCBsYXllcml0ZW1zKVsnbmFtZSddCisgICAgICAgICAgICBsdXJsID0gbGF5ZXJpdGVtc19pbmZvX25hbWVfc3ViZGlyKGRlcGVuZGVuY3ksIGxheWVyaXRlbXMpWyd2Y3NfdXJsJ10KKyAgICAgICAgICAgIGxzdWJkaXIgPSBsYXllcmJyYW5jaGVzX2luZm8oZGVwZW5kZW5jeSwgbGF5ZXJicmFuY2hlcylbJ3Zjc19zdWJkaXInXQorICAgICAgICAgICAgbGRpY3RbbG5hbWVdID0gbHVybCwgbHN1YmRpcgorICAgICAgICByZXR1cm4gTm9uZSwgbGRpY3QKKworCisgICAgZGVmIGdldF9mZXRjaF9sYXllcihzZWxmLCBmZXRjaGRpciwgdXJsLCBzdWJkaXIsIGZldGNoX2xheWVyKToKKyAgICAgICAgbGF5ZXJuYW1lID0gc2VsZi5nZXRfbGF5ZXJfbmFtZSh1cmwpCisgICAgICAgIGlmIG9zLnBhdGguc3BsaXRleHQobGF5ZXJuYW1lKVsxXSA9PSAnLmdpdCc6CisgICAgICAgICAgICBsYXllcm5hbWUgPSBvcy5wYXRoLnNwbGl0ZXh0KGxheWVybmFtZSlbMF0KKyAgICAgICAgcmVwb2RpciA9IG9zLnBhdGguam9pbihmZXRjaGRpciwgbGF5ZXJuYW1lKQorICAgICAgICBsYXllcmRpciA9IG9zLnBhdGguam9pbihyZXBvZGlyLCBzdWJkaXIpCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhyZXBvZGlyKToKKyAgICAgICAgICAgIGlmIGZldGNoX2xheWVyOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHN1YnByb2Nlc3MuY2FsbCgnZ2l0IGNsb25lICVzICVzJyAlICh1cmwsIHJlcG9kaXIpLCBzaGVsbCA9IFRydWUpCisgICAgICAgICAgICAgICAgaWYgcmVzdWx0OgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIkZhaWxlZCB0byBkb3dubG9hZCAlcyIgJSB1cmwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lLCBOb25lCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxheWVybmFtZSwgbGF5ZXJkaXIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbG9nZ2VyLnBsYWluKCJSZXBvc2l0b3J5ICVzIG5lZWRzIHRvIGJlIGZldGNoZWQiICUgdXJsKQorICAgICAgICAgICAgICAgIHJldHVybiBsYXllcm5hbWUsIGxheWVyZGlyCisgICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMobGF5ZXJkaXIpOgorICAgICAgICAgICAgcmV0dXJuIGxheWVybmFtZSwgbGF5ZXJkaXIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiJXMgaXMgbm90IGluICVzIiAlICh1cmwsIHN1YmRpcikpCisgICAgICAgIHJldHVybiBOb25lLCBOb25lCisKKworICAgIGRlZiBkb19sYXllcmluZGV4X2ZldGNoKHNlbGYsIGFyZ3MpOgorICAgICAgICAiIiJGZXRjaGVzIGEgbGF5ZXIgZnJvbSBhIGxheWVyIGluZGV4IGFsb25nIHdpdGggaXRzIGRlcGVuZGVudCBsYXllcnMsIGFuZCBhZGRzIHRoZW0gdG8gY29uZi9iYmxheWVycy5jb25mLgorIiIiCisgICAgICAgIHNlbGYuaW5pdF9iYmhhbmRsZXIoY29uZmlnX29ubHkgPSBUcnVlKQorICAgICAgICBhcGl1cmwgPSBzZWxmLmJiaGFuZGxlci5jb25maWdfZGF0YS5nZXRWYXIoJ0JCTEFZRVJTX0xBWUVSSU5ERVhfVVJMJywgVHJ1ZSkKKyAgICAgICAgaWYgbm90IGFwaXVybDoKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiQ2Fubm90IGdldCBCQkxBWUVSU19MQVlFUklOREVYX1VSTCIpCisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgYXBpdXJsWy0xXSAhPSAnLyc6CisgICAgICAgICAgICAgICAgYXBpdXJsICs9ICcvJworICAgICAgICAgICAgYXBpdXJsICs9ICJhcGkvIgorICAgICAgICBhcGlsaW5rcyA9IHNlbGYuZ2V0X2pzb25fZGF0YShhcGl1cmwpCisgICAgICAgIGJyYW5jaGVzID0gc2VsZi5nZXRfanNvbl9kYXRhKGFwaWxpbmtzWydicmFuY2hlcyddKQorCisgICAgICAgIGJyYW5jaG51bSA9IDAKKyAgICAgICAgZm9yIGJyYW5jaCBpbiBicmFuY2hlczoKKyAgICAgICAgICAgIGlmIGJyYW5jaFsnbmFtZSddID09IGFyZ3MuYnJhbmNoOgorICAgICAgICAgICAgICAgIGJyYW5jaG51bSA9IGJyYW5jaFsnaWQnXQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGlmIGJyYW5jaG51bSA9PSAwOgorICAgICAgICAgICAgdmFsaWRicmFuY2hlcyA9ICcsICcuam9pbihbYnJhbmNoWyduYW1lJ10gZm9yIGJyYW5jaCBpbiBicmFuY2hlc10pCisgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0ludmFsaWQgbGF5ZXIgYnJhbmNoIG5hbWUgIiVzIi4gVmFsaWQgYnJhbmNoZXM6ICVzJyAlIChhcmdzLmJyYW5jaCwgdmFsaWRicmFuY2hlcykpCisgICAgICAgICAgICByZXR1cm4gMQorCisgICAgICAgIGlnbm9yZV9sYXllcnMgPSBbXQorICAgICAgICBmb3IgY29sbGVjdGlvbiBpbiBzZWxmLmJiaGFuZGxlci5jb25maWdfZGF0YS5nZXRWYXIoJ0JCRklMRV9DT0xMRUNUSU9OUycsIFRydWUpLnNwbGl0KCk6CisgICAgICAgICAgICBsbmFtZSA9IHNlbGYuYmJoYW5kbGVyLmNvbmZpZ19kYXRhLmdldFZhcignQkJMQVlFUlNfTEFZRVJJTkRFWF9OQU1FXyVzJyAlIGNvbGxlY3Rpb24sIFRydWUpCisgICAgICAgICAgICBpZiBsbmFtZToKKyAgICAgICAgICAgICAgICBpZ25vcmVfbGF5ZXJzLmFwcGVuZChsbmFtZSkKKworICAgICAgICBpZiBhcmdzLmlnbm9yZToKKyAgICAgICAgICAgIGlnbm9yZV9sYXllcnMuZXh0ZW5kKGFyZ3MuaWdub3JlLnNwbGl0KCcsJykpCisKKyAgICAgICAgbGF5ZXJpdGVtcyA9IHNlbGYuZ2V0X2pzb25fZGF0YShhcGlsaW5rc1snbGF5ZXJJdGVtcyddKQorICAgICAgICBsYXllcmJyYW5jaGVzID0gc2VsZi5nZXRfanNvbl9kYXRhKGFwaWxpbmtzWydsYXllckJyYW5jaGVzJ10pCisgICAgICAgIGxheWVyZGVwZW5kZW5jaWVzID0gc2VsZi5nZXRfanNvbl9kYXRhKGFwaWxpbmtzWydsYXllckRlcGVuZGVuY2llcyddKQorICAgICAgICBpbnZhbHVlbmFtZXMgPSBbXQorICAgICAgICByZXBvdXJscyA9IHt9CisgICAgICAgIHByaW50bGF5ZXJzID0gW10KKyAgICAgICAgZGVmIHF1ZXJ5X2RlcGVuZGVuY2llcyhsYXllcnMsIGxheWVyaXRlbXMsIGxheWVyYnJhbmNoZXMsIGxheWVyZGVwZW5kZW5jaWVzLCBicmFuY2hudW0pOgorICAgICAgICAgICAgZGVwc2xheWVyID0gW10KKyAgICAgICAgICAgIGZvciBsYXllcm5hbWUgaW4gbGF5ZXJzOgorICAgICAgICAgICAgICAgIGludmFsdWVuYW1lLCBsYXllcmRpY3QgPSBzZWxmLmdldF9sYXllcl9kZXBzKGxheWVybmFtZSwgbGF5ZXJpdGVtcywgbGF5ZXJicmFuY2hlcywgbGF5ZXJkZXBlbmRlbmNpZXMsIGJyYW5jaG51bSkKKyAgICAgICAgICAgICAgICBpZiBsYXllcmRpY3Q6CisgICAgICAgICAgICAgICAgICAgIHJlcG91cmxzW2xheWVybmFtZV0gPSBzZWxmLmdldF9sYXllcl9kZXBzKGxheWVybmFtZSwgbGF5ZXJpdGVtcywgbGF5ZXJicmFuY2hlcywgbGF5ZXJkZXBlbmRlbmNpZXMsIGJyYW5jaG51bSwgc2VsZm5hbWU9VHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgZm9yIGxheWVyIGluIGxheWVyZGljdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBsYXllciBpbiBpZ25vcmVfbGF5ZXJzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHNsYXllci5hcHBlbmQobGF5ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGxheWVycy5hcHBlbmQoKGxheWVybmFtZSwgbGF5ZXIsIGxheWVyZGljdFtsYXllcl1bMF0sIGxheWVyZGljdFtsYXllcl1bMV0pKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGxheWVyIGluIGlnbm9yZV9sYXllcnMgYW5kIG5vdCBsYXllciBpbiByZXBvdXJsczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvdXJsc1tsYXllcl0gPSAobGF5ZXJkaWN0W2xheWVyXVswXSwgbGF5ZXJkaWN0W2xheWVyXVsxXSkKKyAgICAgICAgICAgICAgICBpZiBpbnZhbHVlbmFtZSBhbmQgbm90IGludmFsdWVuYW1lIGluIGludmFsdWVuYW1lczoKKyAgICAgICAgICAgICAgICAgICAgaW52YWx1ZW5hbWVzLmFwcGVuZChpbnZhbHVlbmFtZSkKKyAgICAgICAgICAgIHJldHVybiBkZXBzbGF5ZXIKKworICAgICAgICBkZXBzbGF5ZXJzID0gcXVlcnlfZGVwZW5kZW5jaWVzKGFyZ3MubGF5ZXJuYW1lLCBsYXllcml0ZW1zLCBsYXllcmJyYW5jaGVzLCBsYXllcmRlcGVuZGVuY2llcywgYnJhbmNobnVtKQorICAgICAgICB3aGlsZSBkZXBzbGF5ZXJzOgorICAgICAgICAgICAgZGVwc2xheWVyID0gcXVlcnlfZGVwZW5kZW5jaWVzKGRlcHNsYXllcnMsIGxheWVyaXRlbXMsIGxheWVyYnJhbmNoZXMsIGxheWVyZGVwZW5kZW5jaWVzLCBicmFuY2hudW0pCisgICAgICAgICAgICBkZXBzbGF5ZXJzID0gZGVwc2xheWVyCisgICAgICAgIGlmIGludmFsdWVuYW1lczoKKyAgICAgICAgICAgIGZvciBpbnZhbHVlbmFtZSBpbiBpbnZhbHVlbmFtZXM6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdMYXllciAiJXMiIG5vdCBmb3VuZCBpbiBsYXllciBpbmRleCcgJSBpbnZhbHVlbmFtZSkKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIGxvZ2dlci5wbGFpbigiJXMgICVzICAlcyAgJXMiICUgKCJMYXllciIubGp1c3QoMTkpLCAiUmVxdWlyZWQgYnkiLmxqdXN0KDE5KSwgIkdpdCByZXBvc2l0b3J5Ii5sanVzdCg1NCksICJTdWJkaXJlY3RvcnkiKSkKKyAgICAgICAgbG9nZ2VyLnBsYWluKCc9JyAqIDExNSkKKyAgICAgICAgZm9yIGxheWVybmFtZSBpbiBhcmdzLmxheWVybmFtZToKKyAgICAgICAgICAgIGxheWVydXJsID0gcmVwb3VybHNbbGF5ZXJuYW1lXQorICAgICAgICAgICAgbG9nZ2VyLnBsYWluKCIlcyAlcyAlcyAlcyIgJSAobGF5ZXJuYW1lLmxqdXN0KDIwKSwgJy0nLmxqdXN0KDIwKSwgbGF5ZXJ1cmxbMF0ubGp1c3QoNTUpLCBsYXllcnVybFsxXSkpCisgICAgICAgIHByaW50ZWRsYXllcnMgPSBbXQorICAgICAgICBmb3IgbGF5ZXIsIGRlcGVuZGVuY3ksIGdpdHJlcG8sIHN1YmRpcmVjdG9yeSBpbiBwcmludGxheWVyczoKKyAgICAgICAgICAgIGlmIGRlcGVuZGVuY3kgaW4gcHJpbnRlZGxheWVyczoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgbG9nZ2VyLnBsYWluKCIlcyAlcyAlcyAlcyIgJSAoZGVwZW5kZW5jeS5sanVzdCgyMCksIGxheWVyLmxqdXN0KDIwKSwgZ2l0cmVwby5sanVzdCg1NSksIHN1YmRpcmVjdG9yeSkpCisgICAgICAgICAgICBwcmludGVkbGF5ZXJzLmFwcGVuZChkZXBlbmRlbmN5KQorCisgICAgICAgIGlmIHJlcG91cmxzOgorICAgICAgICAgICAgZmV0Y2hkaXIgPSBzZWxmLmJiaGFuZGxlci5jb25maWdfZGF0YS5nZXRWYXIoJ0JCTEFZRVJTX0ZFVENIX0RJUicsIFRydWUpCisgICAgICAgICAgICBpZiBub3QgZmV0Y2hkaXI6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJDYW5ub3QgZ2V0IEJCTEFZRVJTX0ZFVENIX0RJUiIpCisgICAgICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhmZXRjaGRpcik6CisgICAgICAgICAgICAgICAgb3MubWFrZWRpcnMoZmV0Y2hkaXIpCisgICAgICAgICAgICBhZGRsYXllcnMgPSBbXQorICAgICAgICAgICAgZm9yIHJlcG91cmwsIHN1YmRpciBpbiByZXBvdXJscy52YWx1ZXMoKToKKyAgICAgICAgICAgICAgICBuYW1lLCBsYXllcmRpciA9IHNlbGYuZ2V0X2ZldGNoX2xheWVyKGZldGNoZGlyLCByZXBvdXJsLCBzdWJkaXIsIG5vdCBhcmdzLnNob3dfb25seSkKKyAgICAgICAgICAgICAgICBpZiBub3QgbmFtZToKKyAgICAgICAgICAgICAgICAgICAgIyBFcnJvciBhbHJlYWR5IHNob3duCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgICAgICAgICAgYWRkbGF5ZXJzLmFwcGVuZCgoc3ViZGlyLCBuYW1lLCBsYXllcmRpcikpCisgICAgICAgIGlmIG5vdCBhcmdzLnNob3dfb25seToKKyAgICAgICAgICAgIGZvciBzdWJkaXIsIG5hbWUsIGxheWVyZGlyIGluIHNldChhZGRsYXllcnMpOgorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGxheWVyZGlyKToKKyAgICAgICAgICAgICAgICAgICAgaWYgc3ViZGlyOgorICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnBsYWluKCJBZGRpbmcgbGF5ZXIgXCIlc1wiIHRvIGNvbmYvYmJsYXllcnMuY29uZiIgJSBzdWJkaXIpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIucGxhaW4oIkFkZGluZyBsYXllciBcIiVzXCIgdG8gY29uZi9iYmxheWVycy5jb25mIiAlIG5hbWUpCisgICAgICAgICAgICAgICAgICAgIGxvY2FsYXJncyA9IGFyZ3BhcnNlLk5hbWVzcGFjZSgpCisgICAgICAgICAgICAgICAgICAgIGxvY2FsYXJncy5sYXllcmRpciA9IGxheWVyZGlyCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZG9fYWRkX2xheWVyKGxvY2FsYXJncykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBicmVhaworCisKKyAgICBkZWYgZG9fbGF5ZXJpbmRleF9zaG93X2RlcGVuZHMoc2VsZiwgYXJncyk6CisgICAgICAgICIiIkZpbmQgbGF5ZXIgZGVwZW5kZW5jaWVzIGZyb20gbGF5ZXIgaW5kZXguCisiIiIKKyAgICAgICAgYXJncy5zaG93X29ubHkgPSBUcnVlCisgICAgICAgIGFyZ3MuaWdub3JlID0gW10KKyAgICAgICAgc2VsZi5kb19sYXllcmluZGV4X2ZldGNoKGFyZ3MpCisKKworICAgIGRlZiB2ZXJzaW9uX3N0cihzZWxmLCBwZSwgcHYsIHByID0gTm9uZSk6CisgICAgICAgIHZlcnN0ciA9ICIlcyIgJSBwdgorICAgICAgICBpZiBwcjoKKyAgICAgICAgICAgIHZlcnN0ciA9ICIlcy0lcyIgJSAodmVyc3RyLCBwcikKKyAgICAgICAgaWYgcGU6CisgICAgICAgICAgICB2ZXJzdHIgPSAiJXM6JXMiICUgKHBlLCB2ZXJzdHIpCisgICAgICAgIHJldHVybiB2ZXJzdHIKKworCisgICAgZGVmIGRvX3Nob3dfb3ZlcmxheWVkKHNlbGYsIGFyZ3MpOgorICAgICAgICAiIiJsaXN0IG92ZXJsYXllZCByZWNpcGVzICh3aGVyZSB0aGUgc2FtZSByZWNpcGUgZXhpc3RzIGluIGFub3RoZXIgbGF5ZXIpCisKK0xpc3RzIHRoZSBuYW1lcyBvZiBvdmVybGF5ZWQgcmVjaXBlcyBhbmQgdGhlIGF2YWlsYWJsZSB2ZXJzaW9ucyBpbiBlYWNoCitsYXllciwgd2l0aCB0aGUgcHJlZmVycmVkIHZlcnNpb24gZmlyc3QuIE5vdGUgdGhhdCBza2lwcGVkIHJlY2lwZXMgdGhhdAorYXJlIG92ZXJsYXllZCB3aWxsIGFsc28gYmUgbGlzdGVkLCB3aXRoIGEgIiAoc2tpcHBlZCkiIHN1ZmZpeC4KKyIiIgorICAgICAgICBzZWxmLmluaXRfYmJoYW5kbGVyKCkKKworICAgICAgICBpdGVtc19saXN0ZWQgPSBzZWxmLmxpc3RfcmVjaXBlcygnT3ZlcmxheWVkIHJlY2lwZXMnLCBOb25lLCBUcnVlLCBhcmdzLnNhbWVfdmVyc2lvbiwgYXJncy5maWxlbmFtZXMsIFRydWUsIE5vbmUpCisKKyAgICAgICAgIyBDaGVjayBmb3Igb3ZlcmxheWVkIC5iYmNsYXNzIGZpbGVzCisgICAgICAgIGNsYXNzZXMgPSBkZWZhdWx0ZGljdChsaXN0KQorICAgICAgICBmb3IgbGF5ZXJkaXIgaW4gc2VsZi5iYmxheWVyczoKKyAgICAgICAgICAgIGNsYXNzZGlyID0gb3MucGF0aC5qb2luKGxheWVyZGlyLCAnY2xhc3NlcycpCisgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhjbGFzc2Rpcik6CisgICAgICAgICAgICAgICAgZm9yIGNsYXNzZmlsZSBpbiBvcy5saXN0ZGlyKGNsYXNzZGlyKToKKyAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5zcGxpdGV4dChjbGFzc2ZpbGUpWzFdID09ICcuYmJjbGFzcyc6CisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2VzW2NsYXNzZmlsZV0uYXBwZW5kKGNsYXNzZGlyKQorCisgICAgICAgICMgTG9jYXRpbmcgY2xhc3NlcyBhbmQgb3RoZXIgZmlsZXMgaXMgYSBiaXQgbW9yZSBjb21wbGljYXRlZCB0aGFuIHJlY2lwZXMgLQorICAgICAgICAjIGxheWVyIHByaW9yaXR5IGlzIG5vdCBhIGZhY3RvcjsgaW5zdGVhZCBCaXRCYWtlIHVzZXMgdGhlIGZpcnN0IG1hdGNoaW5nCisgICAgICAgICMgZmlsZSBpbiBCQlBBVEgsIHdoaWNoIGlzIG1hbmlwdWxhdGVkIGRpcmVjdGx5IGJ5IGVhY2ggbGF5ZXIncworICAgICAgICAjIGNvbmYvbGF5ZXIuY29uZiBpbiB0dXJuLCB0aHVzIHRoZSBvcmRlciBvZiBsYXllcnMgaW4gYmJsYXllcnMuY29uZiBpcyBhCisgICAgICAgICMgZmFjdG9yIC0gaG93ZXZlciwgZWFjaCBsYXllci5jb25mIGlzIGZyZWUgdG8gZWl0aGVyIHByZXBlbmQgb3IgYXBwZW5kIHRvCisgICAgICAgICMgQkJQQVRIIChvciBpbmRlZWQgZG8gY3Jhenkgc3R1ZmYgd2l0aCBpdCkuIFRodXMgdGhlIG9yZGVyIGluIEJCUEFUSCBtaWdodAorICAgICAgICAjIG5vdCBiZSBleGFjdGx5IHRoZSBvcmRlciBwcmVzZW50IGluIGJibGF5ZXJzLmNvbmYgZWl0aGVyLgorICAgICAgICBiYnBhdGggPSBzdHIoc2VsZi5iYmhhbmRsZXIuY29uZmlnX2RhdGEuZ2V0VmFyKCdCQlBBVEgnLCBUcnVlKSkKKyAgICAgICAgb3ZlcmxheWVkX2NsYXNzX2ZvdW5kID0gRmFsc2UKKyAgICAgICAgZm9yIChjbGFzc2ZpbGUsIGNsYXNzZGlycykgaW4gY2xhc3Nlcy5pdGVtcygpOgorICAgICAgICAgICAgaWYgbGVuKGNsYXNzZGlycykgPiAxOgorICAgICAgICAgICAgICAgIGlmIG5vdCBvdmVybGF5ZWRfY2xhc3NfZm91bmQ6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5wbGFpbignPT09IE92ZXJsYXllZCBjbGFzc2VzID09PScpCisgICAgICAgICAgICAgICAgICAgIG92ZXJsYXllZF9jbGFzc19mb3VuZCA9IFRydWUKKworICAgICAgICAgICAgICAgIG1haW5maWxlID0gYmIudXRpbHMud2hpY2goYmJwYXRoLCBvcy5wYXRoLmpvaW4oJ2NsYXNzZXMnLCBjbGFzc2ZpbGUpKQorICAgICAgICAgICAgICAgIGlmIGFyZ3MuZmlsZW5hbWVzOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIucGxhaW4oJyVzJyAlIG1haW5maWxlKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgV2UgZWZmZWN0aXZlbHkgaGF2ZSB0byBndWVzcyB0aGUgbGF5ZXIgaGVyZQorICAgICAgICAgICAgICAgICAgICBsb2dnZXIucGxhaW4oJyVzOicgJSBjbGFzc2ZpbGUpCisgICAgICAgICAgICAgICAgICAgIG1haW5sYXllcm5hbWUgPSAnPycKKyAgICAgICAgICAgICAgICAgICAgZm9yIGxheWVyZGlyIGluIHNlbGYuYmJsYXllcnM6CisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2RpciA9IG9zLnBhdGguam9pbihsYXllcmRpciwgJ2NsYXNzZXMnKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbWFpbmZpbGUuc3RhcnRzd2l0aChjbGFzc2Rpcik6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbmxheWVybmFtZSA9IHNlbGYuZ2V0X2xheWVyX25hbWUobGF5ZXJkaXIpCisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5wbGFpbignICAlcycgJSBtYWlubGF5ZXJuYW1lKQorICAgICAgICAgICAgICAgIGZvciBjbGFzc2RpciBpbiBjbGFzc2RpcnM6CisgICAgICAgICAgICAgICAgICAgIGZ1bGxwYXRoID0gb3MucGF0aC5qb2luKGNsYXNzZGlyLCBjbGFzc2ZpbGUpCisgICAgICAgICAgICAgICAgICAgIGlmIGZ1bGxwYXRoICE9IG1haW5maWxlOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgYXJncy5maWxlbmFtZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQoJyAgJXMnICUgZnVsbHBhdGgpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KCcgICVzJyAlIHNlbGYuZ2V0X2xheWVyX25hbWUob3MucGF0aC5kaXJuYW1lKGNsYXNzZGlyKSkpCisKKyAgICAgICAgaWYgb3ZlcmxheWVkX2NsYXNzX2ZvdW5kOgorICAgICAgICAgICAgaXRlbXNfbGlzdGVkID0gVHJ1ZTsKKworICAgICAgICBpZiBub3QgaXRlbXNfbGlzdGVkOgorICAgICAgICAgICAgbG9nZ2VyLnBsYWluKCdObyBvdmVybGF5ZWQgZmlsZXMgZm91bmQuJykKKworCisgICAgZGVmIGRvX3Nob3dfcmVjaXBlcyhzZWxmLCBhcmdzKToKKyAgICAgICAgIiIibGlzdCBhdmFpbGFibGUgcmVjaXBlcywgc2hvd2luZyB0aGUgbGF5ZXIgdGhleSBhcmUgcHJvdmlkZWQgYnkKKworTGlzdHMgdGhlIG5hbWVzIG9mIHJlY2lwZXMgYW5kIHRoZSBhdmFpbGFibGUgdmVyc2lvbnMgaW4gZWFjaAorbGF5ZXIsIHdpdGggdGhlIHByZWZlcnJlZCB2ZXJzaW9uIGZpcnN0LiBPcHRpb25hbGx5IHlvdSBtYXkgc3BlY2lmeQorcG5zcGVjIHRvIG1hdGNoIGEgc3BlY2lmaWVkIHJlY2lwZSBuYW1lIChzdXBwb3J0cyB3aWxkY2FyZHMpLiBOb3RlIHRoYXQKK3NraXBwZWQgcmVjaXBlcyB3aWxsIGFsc28gYmUgbGlzdGVkLCB3aXRoIGEgIiAoc2tpcHBlZCkiIHN1ZmZpeC4KKyIiIgorICAgICAgICBzZWxmLmluaXRfYmJoYW5kbGVyKCkKKworICAgICAgICBpbmhlcml0bGlzdCA9IGFyZ3MuaW5oZXJpdHMuc3BsaXQoJywnKSBpZiBhcmdzLmluaGVyaXRzIGVsc2UgW10KKyAgICAgICAgaWYgaW5oZXJpdGxpc3Qgb3IgYXJncy5wbnNwZWMgb3IgYXJncy5tdWx0aXBsZToKKyAgICAgICAgICAgIHRpdGxlID0gJ01hdGNoaW5nIHJlY2lwZXM6JworICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGl0bGUgPSAnQXZhaWxhYmxlIHJlY2lwZXM6JworICAgICAgICBzZWxmLmxpc3RfcmVjaXBlcyh0aXRsZSwgYXJncy5wbnNwZWMsIEZhbHNlLCBGYWxzZSwgYXJncy5maWxlbmFtZXMsIGFyZ3MubXVsdGlwbGUsIGluaGVyaXRsaXN0KQorCisKKyAgICBkZWYgbGlzdF9yZWNpcGVzKHNlbGYsIHRpdGxlLCBwbnNwZWMsIHNob3dfb3ZlcmxheWVkX29ubHksIHNob3dfc2FtZV92ZXJfb25seSwgc2hvd19maWxlbmFtZXMsIHNob3dfbXVsdGlfcHJvdmlkZXJfb25seSwgaW5oZXJpdHMpOgorICAgICAgICBpZiBpbmhlcml0czoKKyAgICAgICAgICAgIGJicGF0aCA9IHN0cihzZWxmLmJiaGFuZGxlci5jb25maWdfZGF0YS5nZXRWYXIoJ0JCUEFUSCcsIFRydWUpKQorICAgICAgICAgICAgZm9yIGNsYXNzbmFtZSBpbiBpbmhlcml0czoKKyAgICAgICAgICAgICAgICBjbGFzc2ZpbGUgPSAnY2xhc3Nlcy8lcy5iYmNsYXNzJyAlIGNsYXNzbmFtZQorICAgICAgICAgICAgICAgIGlmIG5vdCBiYi51dGlscy53aGljaChiYnBhdGgsIGNsYXNzZmlsZSwgaGlzdG9yeT1GYWxzZSk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFVzZXJFcnJvcignTm8gY2xhc3MgbmFtZWQgJXMgZm91bmQgaW4gQkJQQVRIJyAlIGNsYXNzZmlsZSkKKworICAgICAgICBwa2dfcG4gPSBzZWxmLmJiaGFuZGxlci5jb29rZXIucmVjaXBlY2FjaGUucGtnX3BuCisgICAgICAgIChsYXRlc3RfdmVyc2lvbnMsIHByZWZlcnJlZF92ZXJzaW9ucykgPSBiYi5wcm92aWRlcnMuZmluZFByb3ZpZGVycyhzZWxmLmJiaGFuZGxlci5jb25maWdfZGF0YSwgc2VsZi5iYmhhbmRsZXIuY29va2VyLnJlY2lwZWNhY2hlLCBwa2dfcG4pCisgICAgICAgIGFsbHByb3ZpZGVycyA9IGJiLnByb3ZpZGVycy5hbGxQcm92aWRlcnMoc2VsZi5iYmhhbmRsZXIuY29va2VyLnJlY2lwZWNhY2hlKQorCisgICAgICAgICMgRW5zdXJlIHdlIGxpc3Qgc2tpcHBlZCByZWNpcGVzCisgICAgICAgICMgV2UgYXJlIGxhcmdlbHkgZ3Vlc3NpbmcgYWJvdXQgUE4sIFBWIGFuZCB0aGUgcHJlZmVycmVkIHZlcnNpb24gaGVyZSwKKyAgICAgICAgIyBidXQgd2UgaGF2ZSBubyBjaG9pY2Ugc2luY2Ugc2tpcHBlZCByZWNpcGVzIGFyZSBub3QgZnVsbHkgcGFyc2VkCisgICAgICAgIHNraXBsaXN0ID0gc2VsZi5iYmhhbmRsZXIuY29va2VyLnNraXBsaXN0LmtleXMoKQorICAgICAgICBza2lwbGlzdC5zb3J0KCBrZXk9bGFtYmRhIGZpbGVpdGVtOiBzZWxmLmJiaGFuZGxlci5jb29rZXIuY29sbGVjdGlvbi5jYWxjX2JiZmlsZV9wcmlvcml0eShmaWxlaXRlbSkgKQorICAgICAgICBza2lwbGlzdC5yZXZlcnNlKCkKKyAgICAgICAgZm9yIGZuIGluIHNraXBsaXN0OgorICAgICAgICAgICAgcmVjaXBlX3BhcnRzID0gb3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLmJhc2VuYW1lKGZuKSlbMF0uc3BsaXQoJ18nKQorICAgICAgICAgICAgcCA9IHJlY2lwZV9wYXJ0c1swXQorICAgICAgICAgICAgaWYgbGVuKHJlY2lwZV9wYXJ0cykgPiAxOgorICAgICAgICAgICAgICAgIHZlciA9IChOb25lLCByZWNpcGVfcGFydHNbMV0sIE5vbmUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHZlciA9IChOb25lLCAndW5rbm93bicsIE5vbmUpCisgICAgICAgICAgICBhbGxwcm92aWRlcnNbcF0uYXBwZW5kKCh2ZXIsIGZuKSkKKyAgICAgICAgICAgIGlmIG5vdCBwIGluIHBrZ19wbjoKKyAgICAgICAgICAgICAgICBwa2dfcG5bcF0gPSAnZHVtbXknCisgICAgICAgICAgICAgICAgcHJlZmVycmVkX3ZlcnNpb25zW3BdID0gKHZlciwgZm4pCisKKyAgICAgICAgZGVmIHByaW50X2l0ZW0oZiwgcG4sIHZlciwgbGF5ZXIsIGlzcHJlZik6CisgICAgICAgICAgICBpZiBmIGluIHNraXBsaXN0OgorICAgICAgICAgICAgICAgIHNraXBwZWQgPSAnIChza2lwcGVkKScKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2tpcHBlZCA9ICcnCisgICAgICAgICAgICBpZiBzaG93X2ZpbGVuYW1lczoKKyAgICAgICAgICAgICAgICBpZiBpc3ByZWY6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5wbGFpbigiJXMlcyIsIGYsIHNraXBwZWQpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnBsYWluKCIgICVzJXMiLCBmLCBza2lwcGVkKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBpc3ByZWY6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5wbGFpbigiJXM6IiwgcG4pCisgICAgICAgICAgICAgICAgbG9nZ2VyLnBsYWluKCIgICVzICVzJXMiLCBsYXllci5sanVzdCgyMCksIHZlciwgc2tpcHBlZCkKKworICAgICAgICBnbG9iYWxfaW5oZXJpdCA9IChzZWxmLmJiaGFuZGxlci5jb25maWdfZGF0YS5nZXRWYXIoJ0lOSEVSSVQnLCBUcnVlKSBvciAiIikuc3BsaXQoKQorICAgICAgICBjbHNfcmUgPSByZS5jb21waWxlKCdjbGFzc2VzLycpCisKKyAgICAgICAgcHJlZmZpbGVzID0gW10KKyAgICAgICAgaXRlbXNfbGlzdGVkID0gRmFsc2UKKyAgICAgICAgZm9yIHAgaW4gc29ydGVkKHBrZ19wbik6CisgICAgICAgICAgICBpZiBwbnNwZWM6CisgICAgICAgICAgICAgICAgaWYgbm90IGZubWF0Y2guZm5tYXRjaChwLCBwbnNwZWMpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBsZW4oYWxscHJvdmlkZXJzW3BdKSA+IDEgb3Igbm90IHNob3dfbXVsdGlfcHJvdmlkZXJfb25seToKKyAgICAgICAgICAgICAgICBwcmVmID0gcHJlZmVycmVkX3ZlcnNpb25zW3BdCisgICAgICAgICAgICAgICAgcmVhbGZuID0gYmIuY2FjaGUuQ2FjaGUudmlydHVhbGZuMnJlYWxmbihwcmVmWzFdKQorICAgICAgICAgICAgICAgIHByZWZmaWxlID0gcmVhbGZuWzBdCisKKyAgICAgICAgICAgICAgICAjIFdlIG9ubHkgZGlzcGxheSBvbmNlIHBlciByZWNpcGUsIHdlIHNob3VsZCBwcmVmZXIgbm9uIGV4dGVuZGVkIHZlcnNpb25zIG9mIHRoZQorICAgICAgICAgICAgICAgICMgcmVjaXBlIGlmIHByZXNlbnQgKHNvIGUuZy4gaW4gT3BlbkVtYmVkZGVkLCBvcGVuc3NsIHJhdGhlciB0aGFuIG5hdGl2ZXNkay1vcGVuc3NsCisgICAgICAgICAgICAgICAgIyB3aGljaCB3b3VsZCBvdGhlcndpc2Ugc29ydCBmaXJzdCkuCisgICAgICAgICAgICAgICAgaWYgcmVhbGZuWzFdIGFuZCByZWFsZm5bMF0gaW4gc2VsZi5iYmhhbmRsZXIuY29va2VyLnJlY2lwZWNhY2hlLnBrZ19mbjoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIGlmIGluaGVyaXRzOgorICAgICAgICAgICAgICAgICAgICBtYXRjaGNvdW50ID0gMAorICAgICAgICAgICAgICAgICAgICByZWNpcGVfaW5oZXJpdHMgPSBzZWxmLmJiaGFuZGxlci5jb29rZXJfZGF0YS5pbmhlcml0cy5nZXQocHJlZmZpbGUsIFtdKQorICAgICAgICAgICAgICAgICAgICBmb3IgY2xzIGluIHJlY2lwZV9pbmhlcml0czoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNsc19yZS5tYXRjaChjbHMpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc25hbWUgPSBvcy5wYXRoLnNwbGl0ZXh0KG9zLnBhdGguYmFzZW5hbWUoY2xzKSlbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNsYXNzbmFtZSBpbiBnbG9iYWxfaW5oZXJpdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBjbGFzc25hbWUgaW4gaW5oZXJpdHM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hjb3VudCArPSAxCisgICAgICAgICAgICAgICAgICAgIGlmIG1hdGNoY291bnQgIT0gbGVuKGluaGVyaXRzKToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgTm8gbWF0Y2ggLSBza2lwIHRoaXMgcmVjaXBlCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgaWYgcHJlZmZpbGUgbm90IGluIHByZWZmaWxlczoKKyAgICAgICAgICAgICAgICAgICAgcHJlZmxheWVyID0gc2VsZi5nZXRfZmlsZV9sYXllcihwcmVmZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgbXVsdGlsYXllciA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgIHNhbWVfdmVyID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBwcm92cyA9IFtdCisgICAgICAgICAgICAgICAgICAgIGZvciBwcm92IGluIGFsbHByb3ZpZGVyc1twXToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZmaWxlID0gYmIuY2FjaGUuQ2FjaGUudmlydHVhbGZuMnJlYWxmbihwcm92WzFdKVswXQorICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmxheWVyID0gc2VsZi5nZXRfZmlsZV9sYXllcihwcm92ZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZzLmFwcGVuZCgocHJvdmZpbGUsIHByb3ZsYXllciwgcHJvdlswXSkpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBwcm92bGF5ZXIgIT0gcHJlZmxheWVyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpbGF5ZXIgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBwcm92WzBdICE9IHByZWZbMF06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtZV92ZXIgPSBGYWxzZQorCisgICAgICAgICAgICAgICAgICAgIGlmIChtdWx0aWxheWVyIG9yIG5vdCBzaG93X292ZXJsYXllZF9vbmx5KSBhbmQgKHNhbWVfdmVyIG9yIG5vdCBzaG93X3NhbWVfdmVyX29ubHkpOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGl0ZW1zX2xpc3RlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIucGxhaW4oJz09PSAlcyA9PT0nICUgdGl0bGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNfbGlzdGVkID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfaXRlbShwcmVmZmlsZSwgcCwgc2VsZi52ZXJzaW9uX3N0cihwcmVmWzBdWzBdLCBwcmVmWzBdWzFdKSwgcHJlZmxheWVyLCBUcnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChwcm92ZmlsZSwgcHJvdmxheWVyLCBwcm92dmVyKSBpbiBwcm92czoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBwcm92ZmlsZSAhPSBwcmVmZmlsZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfaXRlbShwcm92ZmlsZSwgcCwgc2VsZi52ZXJzaW9uX3N0cihwcm92dmVyWzBdLCBwcm92dmVyWzFdKSwgcHJvdmxheWVyLCBGYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICMgRW5zdXJlIHdlIGRvbid0IHNob3cgdHdvIGVudHJpZXMgZm9yIEJCQ0xBU1NFWFRFTkRlZCByZWNpcGVzCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVmZmlsZXMuYXBwZW5kKHByZWZmaWxlKQorCisgICAgICAgIHJldHVybiBpdGVtc19saXN0ZWQKKworCisgICAgZGVmIGRvX2ZsYXR0ZW4oc2VsZiwgYXJncyk6CisgICAgICAgICIiImZsYXR0ZW4gbGF5ZXIgY29uZmlndXJhdGlvbiBpbnRvIGEgc2VwYXJhdGUgb3V0cHV0IGRpcmVjdG9yeS4KKworVGFrZXMgdGhlIHNwZWNpZmllZCBsYXllcnMgKG9yIGFsbCBsYXllcnMgaW4gdGhlIGN1cnJlbnQgbGF5ZXIKK2NvbmZpZ3VyYXRpb24gaWYgbm9uZSBhcmUgc3BlY2lmaWVkKSBhbmQgYnVpbGRzIGEgImZsYXR0ZW5lZCIgZGlyZWN0b3J5Citjb250YWluaW5nIHRoZSBjb250ZW50cyBvZiBhbGwgbGF5ZXJzLCB3aXRoIGFueSBvdmVybGF5ZWQgcmVjaXBlcyByZW1vdmVkCithbmQgYmJhcHBlbmRzIGFwcGVuZGVkIHRvIHRoZSBjb3JyZXNwb25kaW5nIHJlY2lwZXMuIE5vdGUgdGhhdCBzb21lIG1hbnVhbAorY2xlYW51cCBtYXkgc3RpbGwgYmUgbmVjZXNzYXJ5IGFmdGVyd2FyZHMsIGluIHBhcnRpY3VsYXI6CisKKyogd2hlcmUgbm9uLXJlY2lwZSBmaWxlcyAoc3VjaCBhcyBwYXRjaGVzKSBhcmUgb3ZlcndyaXR0ZW4gKHRoZSBmbGF0dGVuCisgIGNvbW1hbmQgd2lsbCBzaG93IGEgd2FybmluZyBmb3IgdGhlc2UpCisqIHdoZXJlIGFueXRoaW5nIGJleW9uZCB0aGUgbm9ybWFsIGxheWVyIHNldHVwIGhhcyBiZWVuIGFkZGVkIHRvCisgIGxheWVyLmNvbmYgKG9ubHkgdGhlIGxvd2VzdCBwcmlvcml0eSBudW1iZXIgbGF5ZXIncyBsYXllci5jb25mIGlzIHVzZWQpCisqIG92ZXJyaWRkZW4vYXBwZW5kZWQgaXRlbXMgZnJvbSBiYmFwcGVuZHMgd2lsbCBuZWVkIHRvIGJlIHRpZGllZCB1cAorKiB3aGVuIHRoZSBmbGF0dGVuZWQgbGF5ZXJzIGRvIG5vdCBoYXZlIHRoZSBzYW1lIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgKHRoZQorICBmbGF0dGVuIGNvbW1hbmQgc2hvdWxkIHNob3cgYSB3YXJuaW5nIHdoZW4gdGhpcyB3aWxsIGNhdXNlIGEgcHJvYmxlbSkKKworV2FybmluZzogaWYgeW91IGZsYXR0ZW4gc2V2ZXJhbCBsYXllcnMgd2hlcmUgYW5vdGhlciBsYXllciBpcyBpbnRlbmRlZCB0bworYmUgdXNlZCAiaW5iZXR3ZWVuIiB0aGVtIChpbiBsYXllciBwcmlvcml0eSBvcmRlcikgc3VjaCB0aGF0IHJlY2lwZXMgLworYmJhcHBlbmRzIGluIHRoZSBsYXllcnMgaW50ZXJhY3QsIGFuZCB0aGVuIGF0dGVtcHQgdG8gdXNlIHRoZSBuZXcgb3V0cHV0CitsYXllciB0b2dldGhlciB3aXRoIHRoYXQgb3RoZXIgbGF5ZXIsIHlvdSBtYXkgbm8gbG9uZ2VyIGdldCB0aGUgc2FtZQorYnVpbGQgcmVzdWx0cyAoYXMgdGhlIGxheWVyIHByaW9yaXR5IG9yZGVyIGhhcyBlZmZlY3RpdmVseSBjaGFuZ2VkKS4KKyIiIgorICAgICAgICBpZiBsZW4oYXJncy5sYXllcikgPT0gMToKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcignSWYgeW91IHNwZWNpZnkgbGF5ZXJzIHRvIGZsYXR0ZW4geW91IG11c3Qgc3BlY2lmeSBhdCBsZWFzdCB0d28nKQorICAgICAgICAgICAgcmV0dXJuIDEKKworICAgICAgICBvdXRwdXRkaXIgPSBhcmdzLm91dHB1dGRpcgorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhvdXRwdXRkaXIpIGFuZCBvcy5saXN0ZGlyKG91dHB1dGRpcik6CisgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0RpcmVjdG9yeSAlcyBleGlzdHMgYW5kIGlzIG5vbi1lbXB0eSwgcGxlYXNlIGNsZWFyIGl0IG91dCBmaXJzdCcgJSBvdXRwdXRkaXIpCisgICAgICAgICAgICByZXR1cm4gMQorCisgICAgICAgIHNlbGYuaW5pdF9iYmhhbmRsZXIoKQorICAgICAgICBsYXllcnMgPSBzZWxmLmJibGF5ZXJzCisgICAgICAgIGlmIGxlbihhcmdzLmxheWVyKSA+IDI6CisgICAgICAgICAgICBsYXllcm5hbWVzID0gYXJncy5sYXllcgorICAgICAgICAgICAgZm91bmRfbGF5ZXJuYW1lcyA9IFtdCisgICAgICAgICAgICBmb3VuZF9sYXllcmRpcnMgPSBbXQorICAgICAgICAgICAgZm9yIGxheWVyZGlyIGluIGxheWVyczoKKyAgICAgICAgICAgICAgICBsYXllcm5hbWUgPSBzZWxmLmdldF9sYXllcl9uYW1lKGxheWVyZGlyKQorICAgICAgICAgICAgICAgIGlmIGxheWVybmFtZSBpbiBsYXllcm5hbWVzOgorICAgICAgICAgICAgICAgICAgICBmb3VuZF9sYXllcmRpcnMuYXBwZW5kKGxheWVyZGlyKQorICAgICAgICAgICAgICAgICAgICBmb3VuZF9sYXllcm5hbWVzLmFwcGVuZChsYXllcm5hbWUpCisKKyAgICAgICAgICAgIGZvciBsYXllcm5hbWUgaW4gbGF5ZXJuYW1lczoKKyAgICAgICAgICAgICAgICBpZiBub3QgbGF5ZXJuYW1lIGluIGZvdW5kX2xheWVybmFtZXM6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignVW5hYmxlIHRvIGZpbmQgbGF5ZXIgJXMgaW4gY3VycmVudCBjb25maWd1cmF0aW9uLCBwbGVhc2UgcnVuICIlcyBzaG93LWxheWVycyIgdG8gbGlzdCBjb25maWd1cmVkIGxheWVycycgJSAobGF5ZXJuYW1lLCBvcy5wYXRoLmJhc2VuYW1lKHN5cy5hcmd2WzBdKSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgbGF5ZXJzID0gZm91bmRfbGF5ZXJkaXJzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsYXllcm5hbWVzID0gW10KKworICAgICAgICAjIEVuc3VyZSBhIHNwZWNpZmllZCBwYXRoIG1hdGNoZXMgb3VyIGxpc3Qgb2YgbGF5ZXJzCisgICAgICAgIGRlZiBsYXllcl9wYXRoX21hdGNoKHBhdGgpOgorICAgICAgICAgICAgZm9yIGxheWVyZGlyIGluIGxheWVyczoKKyAgICAgICAgICAgICAgICBpZiBwYXRoLnN0YXJ0c3dpdGgob3MucGF0aC5qb2luKGxheWVyZGlyLCAnJykpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGF5ZXJkaXIKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgYXBwbGllZF9hcHBlbmRzID0gW10KKyAgICAgICAgZm9yIGxheWVyIGluIGxheWVyczoKKyAgICAgICAgICAgIG92ZXJsYXllZCA9IFtdCisgICAgICAgICAgICBmb3IgZiBpbiBzZWxmLmJiaGFuZGxlci5jb29rZXIuY29sbGVjdGlvbi5vdmVybGF5ZWQuaXRlcmtleXMoKToKKyAgICAgICAgICAgICAgICBmb3Igb2YgaW4gc2VsZi5iYmhhbmRsZXIuY29va2VyLmNvbGxlY3Rpb24ub3ZlcmxheWVkW2ZdOgorICAgICAgICAgICAgICAgICAgICBpZiBvZi5zdGFydHN3aXRoKGxheWVyKToKKyAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXllZC5hcHBlbmQob2YpCisKKyAgICAgICAgICAgIGxvZ2dlci5wbGFpbignQ29weWluZyBmaWxlcyBmcm9tICVzLi4uJyAlIGxheWVyICkKKyAgICAgICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKGxheWVyKToKKyAgICAgICAgICAgICAgICBmb3IgZjEgaW4gZmlsZXM6CisgICAgICAgICAgICAgICAgICAgIGYxZnVsbCA9IG9zLnNlcC5qb2luKFtyb290LCBmMV0pCisgICAgICAgICAgICAgICAgICAgIGlmIGYxZnVsbCBpbiBvdmVybGF5ZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIucGxhaW4oJyAgU2tpcHBpbmcgb3ZlcmxheWVkIGZpbGUgJXMnICUgZjFmdWxsICkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoZjEpWzFdCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBleHQgIT0gJy5iYmFwcGVuZCc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRlc3QgPSBmMWZ1bGxbbGVuKGxheWVyKTpdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRlc3QgPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnNlcC5qb2luKFtvdXRwdXRkaXIsZmRlc3RdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYi51dGlscy5ta2RpcmhpZXIob3MucGF0aC5kaXJuYW1lKGZkZXN0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmZGVzdCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGYxID09ICdsYXllci5jb25mJyBhbmQgcm9vdC5lbmRzd2l0aCgnL2NvbmYnKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5wbGFpbignICBTa2lwcGluZyBsYXllciBjb25maWcgZmlsZSAlcycgJSBmMWZ1bGwgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdPdmVyd3JpdGluZyBmaWxlICVzJywgZmRlc3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmIudXRpbHMuY29weWZpbGUoZjFmdWxsLCBmZGVzdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBleHQgPT0gJy5iYic6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhcHBlbmQgaW4gc2VsZi5iYmhhbmRsZXIuY29va2VyLmNvbGxlY3Rpb24uZ2V0X2ZpbGVfYXBwZW5kcyhmMWZ1bGwpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGF5ZXJfcGF0aF9tYXRjaChhcHBlbmQpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5wbGFpbignICBBcHBseWluZyBhcHBlbmQgJXMgdG8gJXMnICUgKGFwcGVuZCwgZmRlc3QpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXBwbHlfYXBwZW5kKGFwcGVuZCwgZmRlc3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGllZF9hcHBlbmRzLmFwcGVuZChhcHBlbmQpCisKKyAgICAgICAgIyBUYWtlIGNhcmUgb2Ygd2hlbiBzb21lIGxheWVycyBhcmUgZXhjbHVkZWQgYW5kIHlldCB3ZSBoYXZlIGluY2x1ZGVkIGJiYXBwZW5kcyBmb3IgdGhvc2UgcmVjaXBlcworICAgICAgICBmb3IgYiBpbiBzZWxmLmJiaGFuZGxlci5jb29rZXIuY29sbGVjdGlvbi5iYmFwcGVuZHM6CisgICAgICAgICAgICAocmVjaXBlbmFtZSwgYXBwZW5kbmFtZSkgPSBiCisgICAgICAgICAgICBpZiBhcHBlbmRuYW1lIG5vdCBpbiBhcHBsaWVkX2FwcGVuZHM6CisgICAgICAgICAgICAgICAgZmlyc3RfYXBwZW5kID0gTm9uZQorICAgICAgICAgICAgICAgIGxheWVyID0gbGF5ZXJfcGF0aF9tYXRjaChhcHBlbmRuYW1lKQorICAgICAgICAgICAgICAgIGlmIGxheWVyOgorICAgICAgICAgICAgICAgICAgICBpZiBmaXJzdF9hcHBlbmQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFwcGx5X2FwcGVuZChhcHBlbmRuYW1lLCBmaXJzdF9hcHBlbmQpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBmZGVzdCA9IGFwcGVuZG5hbWVbbGVuKGxheWVyKTpdCisgICAgICAgICAgICAgICAgICAgICAgICBmZGVzdCA9IG9zLnBhdGgubm9ybXBhdGgob3Muc2VwLmpvaW4oW291dHB1dGRpcixmZGVzdF0pKQorICAgICAgICAgICAgICAgICAgICAgICAgYmIudXRpbHMubWtkaXJoaWVyKG9zLnBhdGguZGlybmFtZShmZGVzdCkpCisgICAgICAgICAgICAgICAgICAgICAgICBiYi51dGlscy5jb3B5ZmlsZShhcHBlbmRuYW1lLCBmZGVzdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X2FwcGVuZCA9IGZkZXN0CisKKyAgICAgICAgIyBHZXQgdGhlIHJlZ2V4IGZvciB0aGUgZmlyc3QgbGF5ZXIgaW4gb3VyIGxpc3QgKHdoaWNoIGlzIHdoZXJlIHRoZSBjb25mL2xheWVyLmNvbmYgZmlsZSB3aWxsCisgICAgICAgICMgaGF2ZSBjb21lIGZyb20pCisgICAgICAgIGZpcnN0X3JlZ2V4ID0gTm9uZQorICAgICAgICBsYXllcmRpciA9IGxheWVyc1swXQorICAgICAgICBmb3IgbGF5ZXJuYW1lLCBwYXR0ZXJuLCByZWdleCwgXyBpbiBzZWxmLmJiaGFuZGxlci5jb29rZXIucmVjaXBlY2FjaGUuYmJmaWxlX2NvbmZpZ19wcmlvcml0aWVzOgorICAgICAgICAgICAgaWYgcmVnZXgubWF0Y2gob3MucGF0aC5qb2luKGxheWVyZGlyLCAndGVzdCcpKToKKyAgICAgICAgICAgICAgICBmaXJzdF9yZWdleCA9IHJlZ2V4CisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICBpZiBmaXJzdF9yZWdleDoKKyAgICAgICAgICAgICMgRmluZCB0aGUgQkJGSUxFUyBlbnRyaWVzIHRoYXQgbWF0Y2ggKHdoaWNoIHdpbGwgaGF2ZSBjb21lIGZyb20gdGhpcyBjb25mL2xheWVyLmNvbmYgZmlsZSkKKyAgICAgICAgICAgIGJiZmlsZXMgPSBzdHIoc2VsZi5iYmhhbmRsZXIuY29uZmlnX2RhdGEuZ2V0VmFyKCdCQkZJTEVTJywgVHJ1ZSkpLnNwbGl0KCkKKyAgICAgICAgICAgIGJiZmlsZXNfbGF5ZXIgPSBbXQorICAgICAgICAgICAgZm9yIGl0ZW0gaW4gYmJmaWxlczoKKyAgICAgICAgICAgICAgICBpZiBmaXJzdF9yZWdleC5tYXRjaChpdGVtKToKKyAgICAgICAgICAgICAgICAgICAgbmV3cGF0aCA9IG9zLnBhdGguam9pbihvdXRwdXRkaXIsIGl0ZW1bbGVuKGxheWVyZGlyKSsxOl0pCisgICAgICAgICAgICAgICAgICAgIGJiZmlsZXNfbGF5ZXIuYXBwZW5kKG5ld3BhdGgpCisKKyAgICAgICAgICAgIGlmIGJiZmlsZXNfbGF5ZXI6CisgICAgICAgICAgICAgICAgIyBDaGVjayB0aGF0IGFsbCBpbXBvcnRhbnQgbGF5ZXIgZmlsZXMgbWF0Y2ggQkJGSUxFUworICAgICAgICAgICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKG91dHB1dGRpcik6CisgICAgICAgICAgICAgICAgICAgIGZvciBmMSBpbiBmaWxlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoZjEpWzFdCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBleHQgaW4gWycuYmInLCAnLmJiYXBwZW5kJ106CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZjFmdWxsID0gb3Muc2VwLmpvaW4oW3Jvb3QsIGYxXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeV9mb3VuZCA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGl0ZW0gaW4gYmJmaWxlc19sYXllcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZm5tYXRjaC5mbm1hdGNoKGYxZnVsbCwgaXRlbSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeV9mb3VuZCA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGVudHJ5X2ZvdW5kOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygiRmlsZSAlcyBkb2VzIG5vdCBtYXRjaCB0aGUgZmxhdHRlbmVkIGxheWVyJ3MgQkJGSUxFUyBzZXR0aW5nLCB5b3UgbWF5IG5lZWQgdG8gZWRpdCBjb25mL2xheWVyLmNvbmYgb3IgbW92ZSB0aGUgZmlsZSBlbHNld2hlcmUiICUgZjFmdWxsKQorCisgICAgZGVmIGdldF9maWxlX2xheWVyKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgbGF5ZXJkaXIgPSBzZWxmLmdldF9maWxlX2xheWVyZGlyKGZpbGVuYW1lKQorICAgICAgICBpZiBsYXllcmRpcjoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmdldF9sYXllcl9uYW1lKGxheWVyZGlyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICc/JworCisgICAgZGVmIGdldF9maWxlX2xheWVyZGlyKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgbGF5ZXIgPSBiYi51dGlscy5nZXRfZmlsZV9sYXllcihmaWxlbmFtZSwgc2VsZi5iYmhhbmRsZXIuY29uZmlnX2RhdGEpCisgICAgICAgIHJldHVybiBzZWxmLmJiZmlsZV9jb2xsZWN0aW9ucy5nZXQobGF5ZXIsIE5vbmUpCisKKyAgICBkZWYgcmVtb3ZlX2xheWVyX3ByZWZpeChzZWxmLCBmKToKKyAgICAgICAgIiIiUmVtb3ZlIHRoZSBsYXllcl9kaXIgcHJlZml4LCBlLmcuLCBmID0gL3BhdGgvdG8vbGF5ZXJfZGlyL2Zvby9ibGFoLCB0aGUKKyAgICAgICAgICAgcmV0dXJuIHZhbHVlIHdpbGwgYmU6IGxheWVyX2Rpci9mb28vYmxhaCIiIgorICAgICAgICBmX2xheWVyZGlyID0gc2VsZi5nZXRfZmlsZV9sYXllcmRpcihmKQorICAgICAgICBpZiBub3QgZl9sYXllcmRpcjoKKyAgICAgICAgICAgIHJldHVybiBmCisgICAgICAgIHByZWZpeCA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoZl9sYXllcmRpciksICcnKQorICAgICAgICByZXR1cm4gZltsZW4ocHJlZml4KTpdIGlmIGYuc3RhcnRzd2l0aChwcmVmaXgpIGVsc2UgZgorCisgICAgZGVmIGdldF9sYXllcl9uYW1lKHNlbGYsIGxheWVyZGlyKToKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguYmFzZW5hbWUobGF5ZXJkaXIucnN0cmlwKG9zLnNlcCkpCisKKyAgICBkZWYgYXBwbHlfYXBwZW5kKHNlbGYsIGFwcGVuZG5hbWUsIHJlY2lwZW5hbWUpOgorICAgICAgICB3aXRoIG9wZW4oYXBwZW5kbmFtZSwgJ3InKSBhcyBhcHBlbmRmaWxlOgorICAgICAgICAgICAgd2l0aCBvcGVuKHJlY2lwZW5hbWUsICdhJykgYXMgcmVjaXBlZmlsZToKKyAgICAgICAgICAgICAgICByZWNpcGVmaWxlLndyaXRlKCdcbicpCisgICAgICAgICAgICAgICAgcmVjaXBlZmlsZS53cml0ZSgnIyMjIyMgYmJhcHBlbmRlZCBmcm9tICVzICMjIyMjXG4nICUgc2VsZi5nZXRfZmlsZV9sYXllcihhcHBlbmRuYW1lKSkKKyAgICAgICAgICAgICAgICByZWNpcGVmaWxlLndyaXRlbGluZXMoYXBwZW5kZmlsZS5yZWFkbGluZXMoKSkKKworICAgIGRlZiBkb19zaG93X2FwcGVuZHMoc2VsZiwgYXJncyk6CisgICAgICAgICIiImxpc3QgYmJhcHBlbmQgZmlsZXMgYW5kIHJlY2lwZSBmaWxlcyB0aGV5IGFwcGx5IHRvCisKK0xpc3RzIHJlY2lwZXMgd2l0aCB0aGUgYmJhcHBlbmRzIHRoYXQgYXBwbHkgdG8gdGhlbSBhcyBzdWJpdGVtcy4KKyIiIgorICAgICAgICBzZWxmLmluaXRfYmJoYW5kbGVyKCkKKworICAgICAgICBsb2dnZXIucGxhaW4oJz09PSBBcHBlbmRlZCByZWNpcGVzID09PScpCisKKyAgICAgICAgcG5saXN0ID0gbGlzdChzZWxmLmJiaGFuZGxlci5jb29rZXJfZGF0YS5wa2dfcG4ua2V5cygpKQorICAgICAgICBwbmxpc3Quc29ydCgpCisgICAgICAgIGFwcGVuZHMgPSBGYWxzZQorICAgICAgICBmb3IgcG4gaW4gcG5saXN0OgorICAgICAgICAgICAgaWYgc2VsZi5zaG93X2FwcGVuZHNfZm9yX3BuKHBuKToKKyAgICAgICAgICAgICAgICBhcHBlbmRzID0gVHJ1ZQorCisgICAgICAgIGlmIHNlbGYuc2hvd19hcHBlbmRzX2Zvcl9za2lwcGVkKCk6CisgICAgICAgICAgICBhcHBlbmRzID0gVHJ1ZQorCisgICAgICAgIGlmIG5vdCBhcHBlbmRzOgorICAgICAgICAgICAgbG9nZ2VyLnBsYWluKCdObyBhcHBlbmQgZmlsZXMgZm91bmQnKQorCisgICAgZGVmIHNob3dfYXBwZW5kc19mb3JfcG4oc2VsZiwgcG4pOgorICAgICAgICBmaWxlbmFtZXMgPSBzZWxmLmJiaGFuZGxlci5jb29rZXJfZGF0YS5wa2dfcG5bcG5dCisKKyAgICAgICAgYmVzdCA9IGJiLnByb3ZpZGVycy5maW5kQmVzdFByb3ZpZGVyKHBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5iYmhhbmRsZXIuY29uZmlnX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmJiaGFuZGxlci5jb29rZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYmJoYW5kbGVyLmNvb2tlcl9kYXRhLnBrZ19wbikKKyAgICAgICAgYmVzdF9maWxlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoYmVzdFszXSkKKworICAgICAgICByZXR1cm4gc2VsZi5zaG93X2FwcGVuZHNfb3V0cHV0KGZpbGVuYW1lcywgYmVzdF9maWxlbmFtZSkKKworICAgIGRlZiBzaG93X2FwcGVuZHNfZm9yX3NraXBwZWQoc2VsZik6CisgICAgICAgIGZpbGVuYW1lcyA9IFtvcy5wYXRoLmJhc2VuYW1lKGYpCisgICAgICAgICAgICAgICAgICAgIGZvciBmIGluIHNlbGYuYmJoYW5kbGVyLmNvb2tlci5za2lwbGlzdC5pdGVya2V5cygpXQorICAgICAgICByZXR1cm4gc2VsZi5zaG93X2FwcGVuZHNfb3V0cHV0KGZpbGVuYW1lcywgTm9uZSwgIiAoc2tpcHBlZCkiKQorCisgICAgZGVmIHNob3dfYXBwZW5kc19vdXRwdXQoc2VsZiwgZmlsZW5hbWVzLCBiZXN0X2ZpbGVuYW1lLCBuYW1lX3N1ZmZpeCA9ICcnKToKKyAgICAgICAgYXBwZW5kZWQsIG1pc3NpbmcgPSBzZWxmLmdldF9hcHBlbmRzX2Zvcl9maWxlcyhmaWxlbmFtZXMpCisgICAgICAgIGlmIGFwcGVuZGVkOgorICAgICAgICAgICAgZm9yIGJhc2VuYW1lLCBhcHBlbmRzIGluIGFwcGVuZGVkOgorICAgICAgICAgICAgICAgIGxvZ2dlci5wbGFpbignJXMlczonLCBiYXNlbmFtZSwgbmFtZV9zdWZmaXgpCisgICAgICAgICAgICAgICAgZm9yIGFwcGVuZCBpbiBhcHBlbmRzOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIucGxhaW4oJyAgJXMnLCBhcHBlbmQpCisKKyAgICAgICAgICAgIGlmIGJlc3RfZmlsZW5hbWU6CisgICAgICAgICAgICAgICAgaWYgYmVzdF9maWxlbmFtZSBpbiBtaXNzaW5nOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybignJXM6IG1pc3NpbmcgYXBwZW5kIGZvciBwcmVmZXJyZWQgdmVyc2lvbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RfZmlsZW5hbWUpCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgZ2V0X2FwcGVuZHNfZm9yX2ZpbGVzKHNlbGYsIGZpbGVuYW1lcyk6CisgICAgICAgIGFwcGVuZGVkLCBub3RhcHBlbmRlZCA9IFtdLCBbXQorICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZW5hbWVzOgorICAgICAgICAgICAgXywgY2xzID0gYmIuY2FjaGUuQ2FjaGUudmlydHVhbGZuMnJlYWxmbihmaWxlbmFtZSkKKyAgICAgICAgICAgIGlmIGNsczoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBiYXNlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpCisgICAgICAgICAgICBhcHBlbmRzID0gc2VsZi5iYmhhbmRsZXIuY29va2VyLmNvbGxlY3Rpb24uZ2V0X2ZpbGVfYXBwZW5kcyhiYXNlbmFtZSkKKyAgICAgICAgICAgIGlmIGFwcGVuZHM6CisgICAgICAgICAgICAgICAgYXBwZW5kZWQuYXBwZW5kKChiYXNlbmFtZSwgbGlzdChhcHBlbmRzKSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5vdGFwcGVuZGVkLmFwcGVuZChiYXNlbmFtZSkKKyAgICAgICAgcmV0dXJuIGFwcGVuZGVkLCBub3RhcHBlbmRlZAorCisgICAgZGVmIGRvX3Nob3dfY3Jvc3NfZGVwZW5kcyhzZWxmLCBhcmdzKToKKyAgICAgICAgIiIiU2hvdyBkZXBlbmRlbmNpZXMgYmV0d2VlbiByZWNpcGVzIHRoYXQgY3Jvc3MgbGF5ZXIgYm91bmRhcmllcy4KKworRmlndXJlIG91dCB0aGUgZGVwZW5kZW5jaWVzIGJldHdlZW4gcmVjaXBlcyB0aGF0IGNyb3NzIGxheWVyIGJvdW5kYXJpZXMuCisKK05PVEU6IC5iYmFwcGVuZCBmaWxlcyBjYW4gaW1wYWN0IHRoZSBkZXBlbmRlbmNpZXMuCisiIiIKKyAgICAgICAgaWdub3JlX2xheWVycyA9IChhcmdzLmlnbm9yZSBvciAnJykuc3BsaXQoJywnKQorCisgICAgICAgIHNlbGYuaW5pdF9iYmhhbmRsZXIoKQorCisgICAgICAgIHBrZ19mbiA9IHNlbGYuYmJoYW5kbGVyLmNvb2tlcl9kYXRhLnBrZ19mbgorICAgICAgICBiYnBhdGggPSBzdHIoc2VsZi5iYmhhbmRsZXIuY29uZmlnX2RhdGEuZ2V0VmFyKCdCQlBBVEgnLCBUcnVlKSkKKyAgICAgICAgc2VsZi5yZXF1aXJlX3JlID0gcmUuY29tcGlsZShyInJlcXVpcmVccysoLispIikKKyAgICAgICAgc2VsZi5pbmNsdWRlX3JlID0gcmUuY29tcGlsZShyImluY2x1ZGVccysoLispIikKKyAgICAgICAgc2VsZi5pbmhlcml0X3JlID0gcmUuY29tcGlsZShyImluaGVyaXRccysoLispIikKKworICAgICAgICBnbG9iYWxfaW5oZXJpdCA9IChzZWxmLmJiaGFuZGxlci5jb25maWdfZGF0YS5nZXRWYXIoJ0lOSEVSSVQnLCBUcnVlKSBvciAiIikuc3BsaXQoKQorCisgICAgICAgICMgVGhlIGJiJ3MgREVQRU5EUyBhbmQgUkRFUEVORFMKKyAgICAgICAgZm9yIGYgaW4gcGtnX2ZuOgorICAgICAgICAgICAgZiA9IGJiLmNhY2hlLkNhY2hlLnZpcnR1YWxmbjJyZWFsZm4oZilbMF0KKyAgICAgICAgICAgICMgR2V0IHRoZSBsYXllcm5hbWUgdGhhdCB0aGUgZmlsZSBpcyBpbgorICAgICAgICAgICAgbGF5ZXJuYW1lID0gc2VsZi5nZXRfZmlsZV9sYXllcihmKQorCisgICAgICAgICAgICAjIFRoZSBERVBFTkRTCisgICAgICAgICAgICBkZXBzID0gc2VsZi5iYmhhbmRsZXIuY29va2VyX2RhdGEuZGVwc1tmXQorICAgICAgICAgICAgZm9yIHBuIGluIGRlcHM6CisgICAgICAgICAgICAgICAgaWYgcG4gaW4gc2VsZi5iYmhhbmRsZXIuY29va2VyX2RhdGEucGtnX3BuOgorICAgICAgICAgICAgICAgICAgICBiZXN0ID0gYmIucHJvdmlkZXJzLmZpbmRCZXN0UHJvdmlkZXIocG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5iYmhhbmRsZXIuY29uZmlnX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5iYmhhbmRsZXIuY29va2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5iYmhhbmRsZXIuY29va2VyX2RhdGEucGtnX3BuKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX2Nyb3NzX2RlcGVuZHMoIkRFUEVORFMiLCBsYXllcm5hbWUsIGYsIGJlc3RbM10sIGFyZ3MuZmlsZW5hbWVzLCBpZ25vcmVfbGF5ZXJzKQorCisgICAgICAgICAgICAjIFRoZSBSRFBFTkRTCisgICAgICAgICAgICBhbGxfcmRlcHMgPSBzZWxmLmJiaGFuZGxlci5jb29rZXJfZGF0YS5ydW5kZXBzW2ZdLnZhbHVlcygpCisgICAgICAgICAgICAjIFJlbW92ZSB0aGUgZHVwbGljYXRlZCBvciBudWxsIG9uZS4KKyAgICAgICAgICAgIHNvcnRlZF9yZGVwcyA9IHt9CisgICAgICAgICAgICAjIFRoZSBhbGxfcmRlcHMgaXMgdGhlIGxpc3QgaW4gbGlzdCwgc28gd2UgbmVlZCB0d28gZm9yIGxvb3BzCisgICAgICAgICAgICBmb3IgazEgaW4gYWxsX3JkZXBzOgorICAgICAgICAgICAgICAgIGZvciBrMiBpbiBrMToKKyAgICAgICAgICAgICAgICAgICAgc29ydGVkX3JkZXBzW2syXSA9IDEKKyAgICAgICAgICAgIGFsbF9yZGVwcyA9IHNvcnRlZF9yZGVwcy5rZXlzKCkKKyAgICAgICAgICAgIGZvciByZGVwIGluIGFsbF9yZGVwczoKKyAgICAgICAgICAgICAgICBhbGxfcCA9IGJiLnByb3ZpZGVycy5nZXRSdW50aW1lUHJvdmlkZXJzKHNlbGYuYmJoYW5kbGVyLmNvb2tlcl9kYXRhLCByZGVwKQorICAgICAgICAgICAgICAgIGlmIGFsbF9wOgorICAgICAgICAgICAgICAgICAgICBpZiBmIGluIGFsbF9wOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgcmVjaXBlIHByb3ZpZGVzIHRoaXMgb25lIGl0c2VsZiwgaWdub3JlCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBiZXN0ID0gYmIucHJvdmlkZXJzLmZpbHRlclByb3ZpZGVyc1J1blRpbWUoYWxsX3AsIHJkZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmJiaGFuZGxlci5jb25maWdfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYmJoYW5kbGVyLmNvb2tlcl9kYXRhKVswXVswXQorICAgICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX2Nyb3NzX2RlcGVuZHMoIlJERVBFTkRTIiwgbGF5ZXJuYW1lLCBmLCBiZXN0LCBhcmdzLmZpbGVuYW1lcywgaWdub3JlX2xheWVycykKKworICAgICAgICAgICAgIyBUaGUgUlJFQ09NTUVORFMKKyAgICAgICAgICAgIGFsbF9ycmVjcyA9IHNlbGYuYmJoYW5kbGVyLmNvb2tlcl9kYXRhLnJ1bnJlY3NbZl0udmFsdWVzKCkKKyAgICAgICAgICAgICMgUmVtb3ZlIHRoZSBkdXBsaWNhdGVkIG9yIG51bGwgb25lLgorICAgICAgICAgICAgc29ydGVkX3JyZWNzID0ge30KKyAgICAgICAgICAgICMgVGhlIGFsbF9ycmVjcyBpcyB0aGUgbGlzdCBpbiBsaXN0LCBzbyB3ZSBuZWVkIHR3byBmb3IgbG9vcHMKKyAgICAgICAgICAgIGZvciBrMSBpbiBhbGxfcnJlY3M6CisgICAgICAgICAgICAgICAgZm9yIGsyIGluIGsxOgorICAgICAgICAgICAgICAgICAgICBzb3J0ZWRfcnJlY3NbazJdID0gMQorICAgICAgICAgICAgYWxsX3JyZWNzID0gc29ydGVkX3JyZWNzLmtleXMoKQorICAgICAgICAgICAgZm9yIHJyZWMgaW4gYWxsX3JyZWNzOgorICAgICAgICAgICAgICAgIGFsbF9wID0gYmIucHJvdmlkZXJzLmdldFJ1bnRpbWVQcm92aWRlcnMoc2VsZi5iYmhhbmRsZXIuY29va2VyX2RhdGEsIHJyZWMpCisgICAgICAgICAgICAgICAgaWYgYWxsX3A6CisgICAgICAgICAgICAgICAgICAgIGlmIGYgaW4gYWxsX3A6CisgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSByZWNpcGUgcHJvdmlkZXMgdGhpcyBvbmUgaXRzZWxmLCBpZ25vcmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGJlc3QgPSBiYi5wcm92aWRlcnMuZmlsdGVyUHJvdmlkZXJzUnVuVGltZShhbGxfcCwgcnJlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYmJoYW5kbGVyLmNvbmZpZ19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5iYmhhbmRsZXIuY29va2VyX2RhdGEpWzBdWzBdCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfY3Jvc3NfZGVwZW5kcygiUlJFQ09NTUVORFMiLCBsYXllcm5hbWUsIGYsIGJlc3QsIGFyZ3MuZmlsZW5hbWVzLCBpZ25vcmVfbGF5ZXJzKQorCisgICAgICAgICAgICAjIFRoZSBpbmhlcml0IGNsYXNzCisgICAgICAgICAgICBjbHNfcmUgPSByZS5jb21waWxlKCdjbGFzc2VzLycpCisgICAgICAgICAgICBpZiBmIGluIHNlbGYuYmJoYW5kbGVyLmNvb2tlcl9kYXRhLmluaGVyaXRzOgorICAgICAgICAgICAgICAgIGluaGVyaXRzID0gc2VsZi5iYmhhbmRsZXIuY29va2VyX2RhdGEuaW5oZXJpdHNbZl0KKyAgICAgICAgICAgICAgICBmb3IgY2xzIGluIGluaGVyaXRzOgorICAgICAgICAgICAgICAgICAgICAjIFRoZSBpbmhlcml0cycgZm9ybWF0IGlzIFtjbGFzc2VzL2NscywgL3BhdGgvdG8vY2xhc3Nlcy9jbHNdCisgICAgICAgICAgICAgICAgICAgICMgaWdub3JlIHRoZSBjbGFzc2VzL2Nscy4KKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGNsc19yZS5tYXRjaChjbHMpOgorICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NuYW1lID0gb3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLmJhc2VuYW1lKGNscykpWzBdCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBjbGFzc25hbWUgaW4gZ2xvYmFsX2luaGVyaXQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXRfbGF5ZXJuYW1lID0gc2VsZi5nZXRfZmlsZV9sYXllcihjbHMpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBpbmhlcml0X2xheWVybmFtZSAhPSBsYXllcm5hbWUgYW5kIG5vdCBpbmhlcml0X2xheWVybmFtZSBpbiBpZ25vcmVfbGF5ZXJzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBhcmdzLmZpbGVuYW1lczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZl9zaG9ydCA9IHNlbGYucmVtb3ZlX2xheWVyX3ByZWZpeChmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHMgPSBzZWxmLnJlbW92ZV9sYXllcl9wcmVmaXgoY2xzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZfc2hvcnQgPSBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnBsYWluKCIlcyBpbmhlcml0cyAlcyIgJSAoZl9zaG9ydCwgY2xzKSkKKworICAgICAgICAgICAgIyBUaGUgJ3JlcXVpcmUvaW5jbHVkZSB4eHgnIGluIHRoZSBiYiBmaWxlCisgICAgICAgICAgICBwdl9yZSA9IHJlLmNvbXBpbGUociJcJHtQVn0iKQorICAgICAgICAgICAgd2l0aCBvcGVuKGYsICdyJykgYXMgZm5maWxlOgorICAgICAgICAgICAgICAgIGxpbmUgPSBmbmZpbGUucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgIHdoaWxlIGxpbmU6CisgICAgICAgICAgICAgICAgICAgIG0sIGtleXdvcmQgPSBzZWxmLm1hdGNoX3JlcXVpcmVfaW5jbHVkZShsaW5lKQorICAgICAgICAgICAgICAgICAgICAjIEZvdW5kIHRoZSAncmVxdWlyZS9pbmNsdWRlIHh4eHgnCisgICAgICAgICAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWRfZmlsZSA9IG0uZ3JvdXAoMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICMgUmVwbGFjZSB0aGUgJHtQVn0gd2l0aCB0aGUgcmVhbCBQVgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgcHZfcmUuc2VhcmNoKG5lZWRlZF9maWxlKSBhbmQgZiBpbiBzZWxmLmJiaGFuZGxlci5jb29rZXJfZGF0YS5wa2dfcGVwdnByOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB2ID0gc2VsZi5iYmhhbmRsZXIuY29va2VyX2RhdGEucGtnX3BlcHZwcltmXVsxXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZF9maWxlID0gcmUuc3ViKHIiXCR7UFZ9IiwgcHYsIG5lZWRlZF9maWxlKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wcmludF9jcm9zc19maWxlcyhiYnBhdGgsIGtleXdvcmQsIGxheWVybmFtZSwgZiwgbmVlZGVkX2ZpbGUsIGFyZ3MuZmlsZW5hbWVzLCBpZ25vcmVfbGF5ZXJzKQorICAgICAgICAgICAgICAgICAgICBsaW5lID0gZm5maWxlLnJlYWRsaW5lKCkKKworICAgICAgICAjIFRoZSAicmVxdWlyZS9pbmNsdWRlIHh4eCIgaW4gY29uZi9tYWNoaW5lLyouY29uZiwgLmluYyBhbmQgLmJiY2xhc3MKKyAgICAgICAgY29uZl9yZSA9IHJlLmNvbXBpbGUoIi4qL2NvbmYvbWFjaGluZS9bXlwvXSpcLmNvbmYkIikKKyAgICAgICAgaW5jX3JlID0gcmUuY29tcGlsZSgiLipcLmluYyQiKQorICAgICAgICAjIFRoZSAiaW5oZXJpdCB4eHgiIGluIC5iYmNsYXNzCisgICAgICAgIGJiY2xhc3NfcmUgPSByZS5jb21waWxlKCIuKlwuYmJjbGFzcyQiKQorICAgICAgICBmb3IgbGF5ZXJkaXIgaW4gc2VsZi5iYmxheWVyczoKKyAgICAgICAgICAgIGxheWVybmFtZSA9IHNlbGYuZ2V0X2xheWVyX25hbWUobGF5ZXJkaXIpCisgICAgICAgICAgICBmb3IgZGlycGF0aCwgZGlybmFtZXMsIGZpbGVuYW1lcyBpbiBvcy53YWxrKGxheWVyZGlyKToKKyAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBmaWxlbmFtZXM6CisgICAgICAgICAgICAgICAgICAgIGYgPSBvcy5wYXRoLmpvaW4oZGlycGF0aCwgbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgcyA9IGNvbmZfcmUubWF0Y2goZikgb3IgaW5jX3JlLm1hdGNoKGYpIG9yIGJiY2xhc3NfcmUubWF0Y2goZikKKyAgICAgICAgICAgICAgICAgICAgaWYgczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggb3BlbihmLCAncicpIGFzIGZmaWxlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBmZmlsZS5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgbGluZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbSwga2V5d29yZCA9IHNlbGYubWF0Y2hfcmVxdWlyZV9pbmNsdWRlKGxpbmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgT25seSBiYmNsYXNzIGhhcyB0aGUgImluaGVyaXQgeHh4IiBoZXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYmNsYXNzPSIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBtIGFuZCBmLmVuZHN3aXRoKCIuYmJjbGFzcyIpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbSwga2V5d29yZCA9IHNlbGYubWF0Y2hfaW5oZXJpdChsaW5lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmJjbGFzcz0iLmJiY2xhc3MiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgRmluZCBhICdyZXF1aXJlL2luY2x1ZGUgeHh4eCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucHJpbnRfY3Jvc3NfZmlsZXMoYmJwYXRoLCBrZXl3b3JkLCBsYXllcm5hbWUsIGYsIG0uZ3JvdXAoMSkgKyBiYmNsYXNzLCBhcmdzLmZpbGVuYW1lcywgaWdub3JlX2xheWVycykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGZmaWxlLnJlYWRsaW5lKCkKKworICAgIGRlZiBwcmludF9jcm9zc19maWxlcyhzZWxmLCBiYnBhdGgsIGtleXdvcmQsIGxheWVybmFtZSwgZiwgbmVlZGVkX2ZpbGVuYW1lLCBzaG93X2ZpbGVuYW1lcywgaWdub3JlX2xheWVycyk6CisgICAgICAgICIiIlByaW50IHRoZSBkZXBlbmRzIHRoYXQgY3Jvc3NlcyBhIGxheWVyIGJvdW5kYXJ5IiIiCisgICAgICAgIG5lZWRlZF9maWxlID0gYmIudXRpbHMud2hpY2goYmJwYXRoLCBuZWVkZWRfZmlsZW5hbWUpCisgICAgICAgIGlmIG5lZWRlZF9maWxlOgorICAgICAgICAgICAgIyBXaGljaCBsYXllciBpcyB0aGlzIGZpbGUgZnJvbQorICAgICAgICAgICAgbmVlZGVkX2xheWVybmFtZSA9IHNlbGYuZ2V0X2ZpbGVfbGF5ZXIobmVlZGVkX2ZpbGUpCisgICAgICAgICAgICBpZiBuZWVkZWRfbGF5ZXJuYW1lICE9IGxheWVybmFtZSBhbmQgbm90IG5lZWRlZF9sYXllcm5hbWUgaW4gaWdub3JlX2xheWVyczoKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2hvd19maWxlbmFtZXM6CisgICAgICAgICAgICAgICAgICAgIGYgPSBzZWxmLnJlbW92ZV9sYXllcl9wcmVmaXgoZikKKyAgICAgICAgICAgICAgICAgICAgbmVlZGVkX2ZpbGUgPSBzZWxmLnJlbW92ZV9sYXllcl9wcmVmaXgobmVlZGVkX2ZpbGUpCisgICAgICAgICAgICAgICAgbG9nZ2VyLnBsYWluKCIlcyAlcyAlcyIgJShmLCBrZXl3b3JkLCBuZWVkZWRfZmlsZSkpCisKKyAgICBkZWYgbWF0Y2hfaW5oZXJpdChzZWxmLCBsaW5lKToKKyAgICAgICAgIiIiTWF0Y2ggdGhlIGluaGVyaXQgeHh4IGxpbmUiIiIKKyAgICAgICAgcmV0dXJuIChzZWxmLmluaGVyaXRfcmUubWF0Y2gobGluZSksICJpbmhlcml0cyIpCisKKyAgICBkZWYgbWF0Y2hfcmVxdWlyZV9pbmNsdWRlKHNlbGYsIGxpbmUpOgorICAgICAgICAiIiJNYXRjaCB0aGUgcmVxdWlyZS9pbmNsdWRlIHh4eCBsaW5lIiIiCisgICAgICAgIG0gPSBzZWxmLnJlcXVpcmVfcmUubWF0Y2gobGluZSkKKyAgICAgICAga2V5d29yZCA9ICJyZXF1aXJlcyIKKyAgICAgICAgaWYgbm90IG06CisgICAgICAgICAgICBtID0gc2VsZi5pbmNsdWRlX3JlLm1hdGNoKGxpbmUpCisgICAgICAgICAgICBrZXl3b3JkID0gImluY2x1ZGVzIgorICAgICAgICByZXR1cm4gKG0sIGtleXdvcmQpCisKKyAgICBkZWYgY2hlY2tfY3Jvc3NfZGVwZW5kcyhzZWxmLCBrZXl3b3JkLCBsYXllcm5hbWUsIGYsIG5lZWRlZF9maWxlLCBzaG93X2ZpbGVuYW1lcywgaWdub3JlX2xheWVycyk6CisgICAgICAgICIiIlByaW50IHRoZSBERVBFTkRTL1JERVBFTkRTIGZpbGUgdGhhdCBjcm9zc2VzIGEgbGF5ZXIgYm91bmRhcnkiIiIKKyAgICAgICAgYmVzdF9yZWFsZm4gPSBiYi5jYWNoZS5DYWNoZS52aXJ0dWFsZm4ycmVhbGZuKG5lZWRlZF9maWxlKVswXQorICAgICAgICBuZWVkZWRfbGF5ZXJuYW1lID0gc2VsZi5nZXRfZmlsZV9sYXllcihiZXN0X3JlYWxmbikKKyAgICAgICAgaWYgbmVlZGVkX2xheWVybmFtZSAhPSBsYXllcm5hbWUgYW5kIG5vdCBuZWVkZWRfbGF5ZXJuYW1lIGluIGlnbm9yZV9sYXllcnM6CisgICAgICAgICAgICBpZiBub3Qgc2hvd19maWxlbmFtZXM6CisgICAgICAgICAgICAgICAgZiA9IHNlbGYucmVtb3ZlX2xheWVyX3ByZWZpeChmKQorICAgICAgICAgICAgICAgIGJlc3RfcmVhbGZuID0gc2VsZi5yZW1vdmVfbGF5ZXJfcHJlZml4KGJlc3RfcmVhbGZuKQorCisgICAgICAgICAgICBsb2dnZXIucGxhaW4oIiVzICVzICVzIiAlIChmLCBrZXl3b3JkLCBiZXN0X3JlYWxmbikpCisKKworZGVmIG1haW4oKToKKworICAgIGNtZHMgPSBDb21tYW5kcygpCisKKyAgICBkZWYgYWRkX2NvbW1hbmQoY21kbmFtZSwgZnVuY3Rpb24sICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICMgQ29udmVydCBkb2NzdHJpbmcgZm9yIGZ1bmN0aW9uIHRvIGhlbHAgKG9uZS1saW5lciBzaG93biBpbiBtYWluIC0taGVscCkgYW5kIGRlc2NyaXB0aW9uIChzaG93biBpbiBzdWJjb21tYW5kIC0taGVscCkKKyAgICAgICAgZG9jc3BsaXQgPSBmdW5jdGlvbi5fX2RvY19fLnNwbGl0bGluZXMoKQorICAgICAgICBoZWxwID0gZG9jc3BsaXRbMF0KKyAgICAgICAgaWYgbGVuKGRvY3NwbGl0KSA+IDE6CisgICAgICAgICAgICBkZXNjID0gJ1xuJy5qb2luKGRvY3NwbGl0WzE6XSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRlc2MgPSBoZWxwCisgICAgICAgIHN1YnBhcnNlciA9IHN1YnBhcnNlcnMuYWRkX3BhcnNlcihjbWRuYW1lLCAqYXJncywgaGVscD1oZWxwLCBkZXNjcmlwdGlvbj1kZXNjLCBmb3JtYXR0ZXJfY2xhc3M9YXJncGFyc2UuUmF3VGV4dEhlbHBGb3JtYXR0ZXIsICoqa3dhcmdzKQorICAgICAgICBzdWJwYXJzZXIuc2V0X2RlZmF1bHRzKGZ1bmM9ZnVuY3Rpb24pCisgICAgICAgIHJldHVybiBzdWJwYXJzZXIKKworICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKGRlc2NyaXB0aW9uPSJCaXRCYWtlIGxheWVycyB1dGlsaXR5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcGlsb2c9IlVzZSAlKHByb2cpcyA8c3ViY29tbWFuZD4gLS1oZWxwIHRvIGdldCBoZWxwIG9uIGEgc3BlY2lmaWMgY29tbWFuZCIpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLWQnLCAnLS1kZWJ1ZycsIGhlbHA9J0VuYWJsZSBkZWJ1ZyBvdXRwdXQnLCBhY3Rpb249J3N0b3JlX3RydWUnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1xJywgJy0tcXVpZXQnLCBoZWxwPSdQcmludCBvbmx5IGVycm9ycycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCisgICAgc3VicGFyc2VycyA9IHBhcnNlci5hZGRfc3VicGFyc2Vycyh0aXRsZT0nc3ViY29tbWFuZHMnLCBtZXRhdmFyPSc8c3ViY29tbWFuZD4nKQorCisgICAgcGFyc2VyX3Nob3dfbGF5ZXJzID0gYWRkX2NvbW1hbmQoJ3Nob3ctbGF5ZXJzJywgY21kcy5kb19zaG93X2xheWVycykKKworICAgIHBhcnNlcl9hZGRfbGF5ZXIgPSBhZGRfY29tbWFuZCgnYWRkLWxheWVyJywgY21kcy5kb19hZGRfbGF5ZXIpCisgICAgcGFyc2VyX2FkZF9sYXllci5hZGRfYXJndW1lbnQoJ2xheWVyZGlyJywgaGVscD0nTGF5ZXIgZGlyZWN0b3J5IHRvIGFkZCcpCisKKyAgICBwYXJzZXJfcmVtb3ZlX2xheWVyID0gYWRkX2NvbW1hbmQoJ3JlbW92ZS1sYXllcicsIGNtZHMuZG9fcmVtb3ZlX2xheWVyKQorICAgIHBhcnNlcl9yZW1vdmVfbGF5ZXIuYWRkX2FyZ3VtZW50KCdsYXllcmRpcicsIGhlbHA9J0xheWVyIGRpcmVjdG9yeSB0byByZW1vdmUgKHdpbGRjYXJkcyBhbGxvd2VkLCBlbmNsb3NlIGluIHF1b3RlcyB0byBhdm9pZCBzaGVsbCBleHBhbnNpb24pJykKKyAgICBwYXJzZXJfcmVtb3ZlX2xheWVyLnNldF9kZWZhdWx0cyhmdW5jPWNtZHMuZG9fcmVtb3ZlX2xheWVyKQorCisgICAgcGFyc2VyX3Nob3dfb3ZlcmxheWVkID0gYWRkX2NvbW1hbmQoJ3Nob3ctb3ZlcmxheWVkJywgY21kcy5kb19zaG93X292ZXJsYXllZCkKKyAgICBwYXJzZXJfc2hvd19vdmVybGF5ZWQuYWRkX2FyZ3VtZW50KCctZicsICctLWZpbGVuYW1lcycsIGhlbHA9J2luc3RlYWQgb2YgdGhlIGRlZmF1bHQgZm9ybWF0dGluZywgbGlzdCBmaWxlbmFtZXMgb2YgaGlnaGVyIHByaW9yaXR5IHJlY2lwZXMgd2l0aCB0aGUgb25lcyB0aGV5IG92ZXJsYXkgaW5kZW50ZWQgdW5kZXJuZWF0aCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCisgICAgcGFyc2VyX3Nob3dfb3ZlcmxheWVkLmFkZF9hcmd1bWVudCgnLXMnLCAnLS1zYW1lLXZlcnNpb24nLCBoZWxwPSdvbmx5IGxpc3Qgb3ZlcmxheWVkIHJlY2lwZXMgd2hlcmUgdGhlIHZlcnNpb24gaXMgdGhlIHNhbWUnLCBhY3Rpb249J3N0b3JlX3RydWUnKQorCisgICAgcGFyc2VyX3Nob3dfcmVjaXBlcyA9IGFkZF9jb21tYW5kKCdzaG93LXJlY2lwZXMnLCBjbWRzLmRvX3Nob3dfcmVjaXBlcykKKyAgICBwYXJzZXJfc2hvd19yZWNpcGVzLmFkZF9hcmd1bWVudCgnLWYnLCAnLS1maWxlbmFtZXMnLCBoZWxwPSdpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGZvcm1hdHRpbmcsIGxpc3QgZmlsZW5hbWVzIG9mIGhpZ2hlciBwcmlvcml0eSByZWNpcGVzIHdpdGggdGhlIG9uZXMgdGhleSBvdmVybGF5IGluZGVudGVkIHVuZGVybmVhdGgnLCBhY3Rpb249J3N0b3JlX3RydWUnKQorICAgIHBhcnNlcl9zaG93X3JlY2lwZXMuYWRkX2FyZ3VtZW50KCctbScsICctLW11bHRpcGxlJywgaGVscD0nb25seSBsaXN0IHdoZXJlIG11bHRpcGxlIHJlY2lwZXMgKGluIHRoZSBzYW1lIGxheWVyIG9yIGRpZmZlcmVudCBsYXllcnMpIGV4aXN0IGZvciB0aGUgc2FtZSByZWNpcGUgbmFtZScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCisgICAgcGFyc2VyX3Nob3dfcmVjaXBlcy5hZGRfYXJndW1lbnQoJy1pJywgJy0taW5oZXJpdHMnLCBoZWxwPSdvbmx5IGxpc3QgcmVjaXBlcyB0aGF0IGluaGVyaXQgdGhlIG5hbWVkIGNsYXNzJywgbWV0YXZhcj0nQ0xBU1MnLCBkZWZhdWx0PScnKQorICAgIHBhcnNlcl9zaG93X3JlY2lwZXMuYWRkX2FyZ3VtZW50KCdwbnNwZWMnLCBuYXJncz0nPycsIGhlbHA9J29wdGlvbmFsIHJlY2lwZSBuYW1lIHNwZWNpZmljYXRpb24gKHdpbGRjYXJkcyBhbGxvd2VkLCBlbmNsb3NlIGluIHF1b3RlcyB0byBhdm9pZCBzaGVsbCBleHBhbnNpb24pJykKKworICAgIHBhcnNlcl9zaG93X2FwcGVuZHMgPSBhZGRfY29tbWFuZCgnc2hvdy1hcHBlbmRzJywgY21kcy5kb19zaG93X2FwcGVuZHMpCisKKyAgICBwYXJzZXJfZmxhdHRlbiA9IGFkZF9jb21tYW5kKCdmbGF0dGVuJywgY21kcy5kb19mbGF0dGVuKQorICAgIHBhcnNlcl9mbGF0dGVuLmFkZF9hcmd1bWVudCgnbGF5ZXInLCBuYXJncz0nKicsIGhlbHA9J09wdGlvbmFsIGxheWVyKHMpIHRvIGZsYXR0ZW4gKG90aGVyd2lzZSBhbGwgYXJlIGZsYXR0ZW5lZCknKQorICAgIHBhcnNlcl9mbGF0dGVuLmFkZF9hcmd1bWVudCgnb3V0cHV0ZGlyJywgaGVscD0nT3V0cHV0IGRpcmVjdG9yeScpCisKKyAgICBwYXJzZXJfc2hvd19jcm9zc19kZXBlbmRzID0gYWRkX2NvbW1hbmQoJ3Nob3ctY3Jvc3MtZGVwZW5kcycsIGNtZHMuZG9fc2hvd19jcm9zc19kZXBlbmRzKQorICAgIHBhcnNlcl9zaG93X2Nyb3NzX2RlcGVuZHMuYWRkX2FyZ3VtZW50KCctZicsICctLWZpbGVuYW1lcycsIGhlbHA9J3Nob3cgZnVsbCBmaWxlIHBhdGgnLCBhY3Rpb249J3N0b3JlX3RydWUnKQorICAgIHBhcnNlcl9zaG93X2Nyb3NzX2RlcGVuZHMuYWRkX2FyZ3VtZW50KCctaScsICctLWlnbm9yZScsIGhlbHA9J2lnbm9yZSBkZXBlbmRlbmNpZXMgb24gaXRlbXMgaW4gdGhlIHNwZWNpZmllZCBsYXllcihzKSAoc3BsaXQgbXVsdGlwbGUgbGF5ZXIgbmFtZXMgd2l0aCBjb21tYXMsIG5vIHNwYWNlcyknLCBtZXRhdmFyPSdMQVlFUk5BTUUnKQorCisgICAgcGFyc2VyX2xheWVyaW5kZXhfZmV0Y2ggPSBhZGRfY29tbWFuZCgnbGF5ZXJpbmRleC1mZXRjaCcsIGNtZHMuZG9fbGF5ZXJpbmRleF9mZXRjaCkKKyAgICBwYXJzZXJfbGF5ZXJpbmRleF9mZXRjaC5hZGRfYXJndW1lbnQoJy1uJywgJy0tc2hvdy1vbmx5JywgaGVscD0nc2hvdyBkZXBlbmRlbmNpZXMgYW5kIGRvIG5vdGhpbmcgZWxzZScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCisgICAgcGFyc2VyX2xheWVyaW5kZXhfZmV0Y2guYWRkX2FyZ3VtZW50KCctYicsICctLWJyYW5jaCcsIGhlbHA9J2JyYW5jaCBuYW1lIHRvIGZldGNoIChkZWZhdWx0ICUoZGVmYXVsdClzKScsIGRlZmF1bHQ9J21hc3RlcicpCisgICAgcGFyc2VyX2xheWVyaW5kZXhfZmV0Y2guYWRkX2FyZ3VtZW50KCctaScsICctLWlnbm9yZScsIGhlbHA9J2Fzc3VtZSB0aGUgc3BlY2lmaWVkIGxheWVycyBkbyBub3QgbmVlZCB0byBiZSBmZXRjaGVkL2FkZGVkIChzZXBhcmF0ZSBtdWx0aXBsZSBsYXllcnMgd2l0aCBjb21tYXMsIG5vIHNwYWNlcyknLCBtZXRhdmFyPSdMQVlFUicpCisgICAgcGFyc2VyX2xheWVyaW5kZXhfZmV0Y2guYWRkX2FyZ3VtZW50KCdsYXllcm5hbWUnLCBuYXJncz0nKycsIGhlbHA9J2xheWVyIHRvIGZldGNoJykKKworICAgIHBhcnNlcl9sYXllcmluZGV4X3Nob3dfZGVwZW5kcyA9IGFkZF9jb21tYW5kKCdsYXllcmluZGV4LXNob3ctZGVwZW5kcycsIGNtZHMuZG9fbGF5ZXJpbmRleF9zaG93X2RlcGVuZHMpCisgICAgcGFyc2VyX2xheWVyaW5kZXhfc2hvd19kZXBlbmRzLmFkZF9hcmd1bWVudCgnLWInLCAnLS1icmFuY2gnLCBoZWxwPSdicmFuY2ggbmFtZSB0byBmZXRjaCAoZGVmYXVsdCAlKGRlZmF1bHQpcyknLCBkZWZhdWx0PSdtYXN0ZXInKQorICAgIHBhcnNlcl9sYXllcmluZGV4X3Nob3dfZGVwZW5kcy5hZGRfYXJndW1lbnQoJ2xheWVybmFtZScsIG5hcmdzPScrJywgaGVscD0nbGF5ZXIgdG8gcXVlcnknKQorCisgICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKworICAgIGlmIGFyZ3MuZGVidWc6CisgICAgICAgIGxvZ2dlci5zZXRMZXZlbChsb2dnaW5nLkRFQlVHKQorICAgIGVsaWYgYXJncy5xdWlldDoKKyAgICAgICAgbG9nZ2VyLnNldExldmVsKGxvZ2dpbmcuRVJST1IpCisKKyAgICB0cnk6CisgICAgICAgIHJldCA9IGFyZ3MuZnVuYyhhcmdzKQorICAgIGV4Y2VwdCBVc2VyRXJyb3IgYXMgZXJyOgorICAgICAgICBsb2dnZXIuZXJyb3Ioc3RyKGVycikpCisgICAgICAgIHJldCA9IDEKKworICAgIHJldHVybiByZXQKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRyeToKKyAgICAgICAgcmV0ID0gbWFpbigpCisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgcmV0ID0gMQorICAgICAgICBpbXBvcnQgdHJhY2ViYWNrCisgICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoNSkKKyAgICBzeXMuZXhpdChyZXQpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2Jpbi9iaXRiYWtlLXByc2VydiBiL2JpdGJha2UvYmluL2JpdGJha2UtcHJzZXJ2Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE4ZDdhY2IKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2Jpbi9iaXRiYWtlLXByc2VydgpAQCAtMCwwICsxLDU1IEBACisjIS91c3IvYmluL2VudiBweXRob24KK2ltcG9ydCBvcworaW1wb3J0IHN5cyxsb2dnaW5nCitpbXBvcnQgb3B0cGFyc2UKKworc3lzLnBhdGguaW5zZXJ0KDAsIG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSksJ2xpYicpKQorCitpbXBvcnQgcHJzZXJ2CitpbXBvcnQgcHJzZXJ2LnNlcnYKKworX192ZXJzaW9uX189IjEuMC4wIgorCitQUkhPU1RfREVGQVVMVD0nMC4wLjAuMCcKK1BSUE9SVF9ERUZBVUxUPTg1ODUKKworZGVmIG1haW4oKToKKyAgICBwYXJzZXIgPSBvcHRwYXJzZS5PcHRpb25QYXJzZXIoCisgICAgICAgIHZlcnNpb249IkJpdGJha2UgUFIgU2VydmljZSBDb3JlIHZlcnNpb24gJXMsICUlcHJvZyB2ZXJzaW9uICVzIiAlIChwcnNlcnYuX192ZXJzaW9uX18sIF9fdmVyc2lvbl9fKSwKKyAgICAgICAgdXNhZ2UgPSAiJXByb2cgPCAtLXN0YXJ0IHwgLS1zdG9wID4gW29wdGlvbnNdIikKKworICAgIHBhcnNlci5hZGRfb3B0aW9uKCItZiIsICItLWZpbGUiLCBoZWxwPSJkYXRhYmFzZSBmaWxlbmFtZShkZWZhdWx0OiBwcnNlcnYuc3FsaXRlMykiLCBhY3Rpb249InN0b3JlIiwKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0PSJkYmZpbGUiLCB0eXBlPSJzdHJpbmciLCBkZWZhdWx0PSJwcnNlcnYuc3FsaXRlMyIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi1sIiwgIi0tbG9nIiwgaGVscD0ibG9nIGZpbGVuYW1lKGRlZmF1bHQ6IHByc2Vydi5sb2cpIiwgYWN0aW9uPSJzdG9yZSIsCisgICAgICAgICAgICAgICAgICAgICAgZGVzdD0ibG9nZmlsZSIsIHR5cGU9InN0cmluZyIsIGRlZmF1bHQ9InByc2Vydi5sb2ciKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItLWxvZ2xldmVsIiwgaGVscD0ibG9nZ2luZyBsZXZlbCwgaS5lLiBDUklUSUNBTCwgRVJST1IsIFdBUk5JTkcsIElORk8sIERFQlVHIiwKKyAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSAic3RvcmUiLCB0eXBlPSJzdHJpbmciLCBkZXN0PSJsb2dsZXZlbCIsIGRlZmF1bHQgPSAiSU5GTyIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi0tc3RhcnQiLCBoZWxwPSJzdGFydCBkYWVtb24iLAorICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9InN0YXJ0IikKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLS1zdG9wIiwgaGVscD0ic3RvcCBkYWVtb24iLAorICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9InN0b3AiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItLWhvc3QiLCBoZWxwPSJpcCBhZGRyZXNzIHRvIGJpbmQiLCBhY3Rpb249InN0b3JlIiwKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0PSJob3N0IiwgdHlwZT0ic3RyaW5nIiwgZGVmYXVsdD1QUkhPU1RfREVGQVVMVCkKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLS1wb3J0IiwgaGVscD0icG9ydCBudW1iZXIoZGVmYXVsdDogODU4NSkiLCBhY3Rpb249InN0b3JlIiwKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0PSJwb3J0IiwgdHlwZT0iaW50IiwgZGVmYXVsdD1QUlBPUlRfREVGQVVMVCkKKworICAgIG9wdGlvbnMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncyhzeXMuYXJndikKKyAgICBwcnNlcnYuaW5pdF9sb2dnZXIob3MucGF0aC5hYnNwYXRoKG9wdGlvbnMubG9nZmlsZSksb3B0aW9ucy5sb2dsZXZlbCkKKworICAgIGlmIG9wdGlvbnMuc3RhcnQ6CisgICAgICAgIHJldD1wcnNlcnYuc2Vydi5zdGFydF9kYWVtb24ob3B0aW9ucy5kYmZpbGUsIG9wdGlvbnMuaG9zdCwgb3B0aW9ucy5wb3J0LG9zLnBhdGguYWJzcGF0aChvcHRpb25zLmxvZ2ZpbGUpKQorICAgIGVsaWYgb3B0aW9ucy5zdG9wOgorICAgICAgICByZXQ9cHJzZXJ2LnNlcnYuc3RvcF9kYWVtb24ob3B0aW9ucy5ob3N0LCBvcHRpb25zLnBvcnQpCisgICAgZWxzZToKKyAgICAgICAgcmV0PXBhcnNlci5wcmludF9oZWxwKCkKKyAgICByZXR1cm4gcmV0CisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdHJ5OgorICAgICAgICByZXQgPSBtYWluKCkKKyAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICByZXQgPSAxCisgICAgICAgIGltcG9ydCB0cmFjZWJhY2sKKyAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4Yyg1KQorICAgIHN5cy5leGl0KHJldCkKKwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9iaW4vYml0YmFrZS1zZWxmdGVzdCBiL2JpdGJha2UvYmluL2JpdGJha2Utc2VsZnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDYyZWIxYgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvYmluL2JpdGJha2Utc2VsZnRlc3QKQEAgLTAsMCArMSw1NSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAoQykgMjAxMiBSaWNoYXJkIFB1cmRpZQorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworaW1wb3J0IG9zCitpbXBvcnQgc3lzLCBsb2dnaW5nCitzeXMucGF0aC5pbnNlcnQoMCwgb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKSwgJ2xpYicpKQorCitpbXBvcnQgdW5pdHRlc3QKK3RyeToKKyAgICBpbXBvcnQgYmIKK2V4Y2VwdCBSdW50aW1lRXJyb3IgYXMgZXhjOgorICAgIHN5cy5leGl0KHN0cihleGMpKQorCitkZWYgdXNhZ2UoKToKKyAgICBwcmludCgndXNhZ2U6IFtCQl9TS0lQX05FVFRFU1RTPXllc10gJXMgWy12XSBbdGVzdG5hbWUxIFt0ZXN0bmFtZTJdLi4uXScgJSBvcy5wYXRoLmJhc2VuYW1lKHN5cy5hcmd2WzBdKSkKKwordmVyYm9zaXR5ID0gMQorCit0ZXN0cyA9IHN5cy5hcmd2WzE6XQoraWYgJy12JyBpbiBzeXMuYXJndjoKKyAgICB0ZXN0cy5yZW1vdmUoJy12JykKKyAgICB2ZXJib3NpdHkgPSAyCisKK2lmIHRlc3RzOgorICAgIGlmICctLWhlbHAnIGluIHN5cy5hcmd2WzE6XToKKyAgICAgICAgdXNhZ2UoKQorICAgICAgICBzeXMuZXhpdCgwKQorZWxzZToKKyAgICB0ZXN0cyA9IFsiYmIudGVzdHMuY29kZXBhcnNlciIsCisgICAgICAgICAgICAgImJiLnRlc3RzLmNvdyIsCisgICAgICAgICAgICAgImJiLnRlc3RzLmRhdGEiLAorICAgICAgICAgICAgICJiYi50ZXN0cy5mZXRjaCIsCisgICAgICAgICAgICAgImJiLnRlc3RzLnBhcnNlIiwKKyAgICAgICAgICAgICAiYmIudGVzdHMudXRpbHMiXQorCitmb3IgdCBpbiB0ZXN0czoKKyAgICB0ID0gJy4nLmpvaW4odC5zcGxpdCgnLicpWzozXSkKKyAgICBfX2ltcG9ydF9fKHQpCisKK3VuaXR0ZXN0Lm1haW4oYXJndj1bImJpdGJha2Utc2VsZnRlc3QiXSArIHRlc3RzLCB2ZXJib3NpdHk9dmVyYm9zaXR5KQorCmRpZmYgLS1naXQgYS9iaXRiYWtlL2Jpbi9iaXRiYWtlLXdvcmtlciBiL2JpdGJha2UvYmluL2JpdGJha2Utd29ya2VyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFmMTdiODcKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2Jpbi9iaXRiYWtlLXdvcmtlcgpAQCAtMCwwICsxLDQzMiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHdhcm5pbmdzCitzeXMucGF0aC5pbnNlcnQoMCwgb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoc3lzLmFyZ3ZbMF0pKSwgJ2xpYicpKQorZnJvbSBiYiBpbXBvcnQgZmV0Y2gyCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IGJiCitpbXBvcnQgc2VsZWN0CitpbXBvcnQgZXJybm8KK2ltcG9ydCBzaWduYWwKKworIyBVc2VycyBzaG91bGRuJ3QgYmUgcnVubmluZyB0aGlzIGNvZGUgZGlyZWN0bHkKK2lmIGxlbihzeXMuYXJndikgIT0gMiBvciBub3Qgc3lzLmFyZ3ZbMV0uc3RhcnRzd2l0aCgiZGVjYWZiYWQiKToKKyAgICBwcmludCgiYml0YmFrZS13b3JrZXIgaXMgbWVhbnQgZm9yIGludGVybmFsIGV4ZWN1dGlvbiBieSBiaXRiYWtlIGl0c2VsZiwgcGxlYXNlIGRvbid0IHVzZSBpdCBzdGFuZGFsb25lLiIpCisgICAgc3lzLmV4aXQoMSkKKworcHJvZmlsaW5nID0gRmFsc2UKK2lmIHN5cy5hcmd2WzFdID09ICJkZWNhZmJhZGJhZCI6CisgICAgcHJvZmlsaW5nID0gVHJ1ZQorICAgIHRyeToKKyAgICAgICAgaW1wb3J0IGNQcm9maWxlIGFzIHByb2ZpbGUKKyAgICBleGNlcHQ6CisgICAgICAgIGltcG9ydCBwcm9maWxlCisKKyMgVW5idWZmZXIgc3Rkb3V0IHRvIGF2b2lkIGxvZyB0cnVuY2F0aW9uIGluIHRoZSBldmVudAorIyBvZiBhbiB1bm9yZGVybHkgZXhpdCBhcyB3ZWxsIGFzIHRvIHByb3ZpZGUgdGltZWx5CisjIHVwZGF0ZXMgdG8gbG9nIGZpbGVzIGZvciB1c2Ugd2l0aCB0YWlsCit0cnk6CisgICAgaWYgc3lzLnN0ZG91dC5uYW1lID09ICc8c3Rkb3V0Pic6CisgICAgICAgIHN5cy5zdGRvdXQgPSBvcy5mZG9wZW4oc3lzLnN0ZG91dC5maWxlbm8oKSwgJ3cnLCAwKQorZXhjZXB0OgorICAgIHBhc3MKKworbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoIkJpdEJha2UiKQorCit0cnk6CisgICAgaW1wb3J0IGNQaWNrbGUgYXMgcGlja2xlCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgaW1wb3J0IHBpY2tsZQorICAgIGJiLm1zZy5ub3RlKDEsIGJiLm1zZy5kb21haW4uQ2FjaGUsICJJbXBvcnRpbmcgY1BpY2tsZSBmYWlsZWQuIEZhbGxpbmcgYmFjayB0byBhIHZlcnkgc2xvdyBpbXBsZW1lbnRhdGlvbi4iKQorCisKK3dvcmtlcl9waXBlID0gc3lzLnN0ZG91dC5maWxlbm8oKQorYmIudXRpbHMubm9uYmxvY2tpbmdmZCh3b3JrZXJfcGlwZSkKKworaGFuZGxlciA9IGJiLmV2ZW50LkxvZ0hhbmRsZXIoKQorbG9nZ2VyLmFkZEhhbmRsZXIoaGFuZGxlcikKKworaWYgMDoKKyAgICAjIENvZGUgdG8gd3JpdGUgb3V0IGEgbG9nIGZpbGUgb2YgYWxsIGV2ZW50cyBwYXNzaW5nIHRocm91Z2ggdGhlIHdvcmtlcgorICAgIGxvZ2ZpbGVuYW1lID0gIi90bXAvd29ya2VybG9nZmlsZSIKKyAgICBmb3JtYXRfc3RyID0gIiUobGV2ZWxuYW1lKXM6ICUobWVzc2FnZSlzIgorICAgIGNvbmxvZ2Zvcm1hdCA9IGJiLm1zZy5CQkxvZ0Zvcm1hdHRlcihmb3JtYXRfc3RyKQorICAgIGNvbnNvbGVsb2cgPSBsb2dnaW5nLkZpbGVIYW5kbGVyKGxvZ2ZpbGVuYW1lKQorICAgIGJiLm1zZy5hZGREZWZhdWx0bG9nRmlsdGVyKGNvbnNvbGVsb2cpCisgICAgY29uc29sZWxvZy5zZXRGb3JtYXR0ZXIoY29ubG9nZm9ybWF0KQorICAgIGxvZ2dlci5hZGRIYW5kbGVyKGNvbnNvbGVsb2cpCisKK3dvcmtlcl9xdWV1ZSA9ICIiCisKK2RlZiB3b3JrZXJfZmlyZShldmVudCwgZCk6CisgICAgZGF0YSA9ICI8ZXZlbnQ+IiArIHBpY2tsZS5kdW1wcyhldmVudCkgKyAiPC9ldmVudD4iCisgICAgd29ya2VyX2ZpcmVfcHJlcGlja2xlZChkYXRhKQorCitkZWYgd29ya2VyX2ZpcmVfcHJlcGlja2xlZChldmVudCk6CisgICAgZ2xvYmFsIHdvcmtlcl9xdWV1ZQorCisgICAgd29ya2VyX3F1ZXVlID0gd29ya2VyX3F1ZXVlICsgZXZlbnQKKyAgICB3b3JrZXJfZmx1c2goKQorCitkZWYgd29ya2VyX2ZsdXNoKCk6CisgICAgZ2xvYmFsIHdvcmtlcl9xdWV1ZSwgd29ya2VyX3BpcGUKKworICAgIGlmIG5vdCB3b3JrZXJfcXVldWU6CisgICAgICAgIHJldHVybgorCisgICAgdHJ5OgorICAgICAgICB3cml0dGVuID0gb3Mud3JpdGUod29ya2VyX3BpcGUsIHdvcmtlcl9xdWV1ZSkKKyAgICAgICAgd29ya2VyX3F1ZXVlID0gd29ya2VyX3F1ZXVlW3dyaXR0ZW46XQorICAgIGV4Y2VwdCAoSU9FcnJvciwgT1NFcnJvcikgYXMgZToKKyAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FQUdBSU4gYW5kIGUuZXJybm8gIT0gZXJybm8uRVBJUEU6CisgICAgICAgICAgICByYWlzZQorCitkZWYgd29ya2VyX2NoaWxkX2ZpcmUoZXZlbnQsIGQpOgorICAgIGdsb2JhbCB3b3JrZXJfcGlwZQorCisgICAgZGF0YSA9ICI8ZXZlbnQ+IiArIHBpY2tsZS5kdW1wcyhldmVudCkgKyAiPC9ldmVudD4iCisgICAgdHJ5OgorICAgICAgICB3b3JrZXJfcGlwZS53cml0ZShkYXRhKQorICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICBzaWd0ZXJtX2hhbmRsZXIoTm9uZSwgTm9uZSkKKyAgICAgICAgcmFpc2UKKworYmIuZXZlbnQud29ya2VyX2ZpcmUgPSB3b3JrZXJfZmlyZQorCitsZiA9IE5vbmUKKyNsZiA9IG9wZW4oIi90bXAvd29ya2VyY29tbWFuZGxvZyIsICJ3KyIpCitkZWYgd29ya2VybG9nX3dyaXRlKG1zZyk6CisgICAgaWYgbGY6CisgICAgICAgIGxmLndyaXRlKG1zZykKKyAgICAgICAgbGYuZmx1c2goKQorCitkZWYgc2lndGVybV9oYW5kbGVyKHNpZ251bSwgZnJhbWUpOgorICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR1RFUk0sIHNpZ25hbC5TSUdfREZMKQorICAgIG9zLmtpbGxwZygwLCBzaWduYWwuU0lHVEVSTSkKKyAgICBzeXMuZXhpdCgpCisKK2RlZiBmb3JrX29mZl90YXNrKGNmZywgZGF0YSwgd29ya2VyZGF0YSwgZm4sIHRhc2ssIHRhc2tuYW1lLCBhcHBlbmRzLCB0YXNrZGVwZGF0YSwgcXVpZXRlcnJvcnM9RmFsc2UpOgorICAgICMgV2UgbmVlZCB0byBzZXR1cCB0aGUgZW52aXJvbm1lbnQgQkVGT1JFIHRoZSBmb3JrLCBzaW5jZQorICAgICMgYSBmb3JrKCkgb3IgZXhlYyooKSBhY3RpdmF0ZXMgUFNFVURPLi4uCisKKyAgICBlbnZiYWNrdXAgPSB7fQorICAgIGZha2VlbnYgPSB7fQorICAgIHVtYXNrID0gTm9uZQorCisgICAgdGFza2RlcCA9IHdvcmtlcmRhdGFbInRhc2tkZXBzIl1bZm5dCisgICAgaWYgJ3VtYXNrJyBpbiB0YXNrZGVwIGFuZCB0YXNrbmFtZSBpbiB0YXNrZGVwWyd1bWFzayddOgorICAgICAgICAjIHVtYXNrIG1pZ2h0IGNvbWUgaW4gYXMgYSBudW1iZXIgb3IgdGV4dCBzdHJpbmcuLgorICAgICAgICB0cnk6CisgICAgICAgICAgICAgdW1hc2sgPSBpbnQodGFza2RlcFsndW1hc2snXVt0YXNrbmFtZV0sOCkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICB1bWFzayA9IHRhc2tkZXBbJ3VtYXNrJ11bdGFza25hbWVdCisKKyAgICAjIFdlIGNhbid0IHVzZSB0aGUgZmFrZXJvb3QgZW52aXJvbm1lbnQgaW4gYSBkcnkgcnVuIGFzIGl0IHBvc3NpYmx5IGhhc24ndCBiZWVuIGJ1aWx0CisgICAgaWYgJ2Zha2Vyb290JyBpbiB0YXNrZGVwIGFuZCB0YXNrbmFtZSBpbiB0YXNrZGVwWydmYWtlcm9vdCddIGFuZCBub3QgY2ZnLmRyeV9ydW46CisgICAgICAgIGVudnZhcnMgPSAod29ya2VyZGF0YVsiZmFrZXJvb3RlbnYiXVtmbl0gb3IgIiIpLnNwbGl0KCkKKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gKHZhci5zcGxpdCgnPScpIGZvciB2YXIgaW4gZW52dmFycyk6CisgICAgICAgICAgICBlbnZiYWNrdXBba2V5XSA9IG9zLmVudmlyb24uZ2V0KGtleSkKKyAgICAgICAgICAgIG9zLmVudmlyb25ba2V5XSA9IHZhbHVlCisgICAgICAgICAgICBmYWtlZW52W2tleV0gPSB2YWx1ZQorCisgICAgICAgIGZha2VkaXJzID0gKHdvcmtlcmRhdGFbImZha2Vyb290ZGlycyJdW2ZuXSBvciAiIikuc3BsaXQoKQorICAgICAgICBmb3IgcCBpbiBmYWtlZGlyczoKKyAgICAgICAgICAgIGJiLnV0aWxzLm1rZGlyaGllcihwKQorICAgICAgICBsb2dnZXIuZGVidWcoMiwgJ1J1bm5pbmcgJXM6JXMgdW5kZXIgZmFrZXJvb3QsIGZha2VkaXJzOiAlcycgJQorICAgICAgICAgICAgICAgICAgICAgICAgKGZuLCB0YXNrbmFtZSwgJywgJy5qb2luKGZha2VkaXJzKSkpCisgICAgZWxzZToKKyAgICAgICAgZW52dmFycyA9ICh3b3JrZXJkYXRhWyJmYWtlcm9vdG5vZW52Il1bZm5dIG9yICIiKS5zcGxpdCgpCisgICAgICAgIGZvciBrZXksIHZhbHVlIGluICh2YXIuc3BsaXQoJz0nKSBmb3IgdmFyIGluIGVudnZhcnMpOgorICAgICAgICAgICAgZW52YmFja3VwW2tleV0gPSBvcy5lbnZpcm9uLmdldChrZXkpCisgICAgICAgICAgICBvcy5lbnZpcm9uW2tleV0gPSB2YWx1ZQorICAgICAgICAgICAgZmFrZWVudltrZXldID0gdmFsdWUKKworICAgIHN5cy5zdGRvdXQuZmx1c2goKQorICAgIHN5cy5zdGRlcnIuZmx1c2goKQorCisgICAgdHJ5OgorICAgICAgICBwaXBlaW4sIHBpcGVvdXQgPSBvcy5waXBlKCkKKyAgICAgICAgcGlwZWluID0gb3MuZmRvcGVuKHBpcGVpbiwgJ3JiJywgNDA5NikKKyAgICAgICAgcGlwZW91dCA9IG9zLmZkb3BlbihwaXBlb3V0LCAnd2InLCAwKQorICAgICAgICBwaWQgPSBvcy5mb3JrKCkKKyAgICBleGNlcHQgT1NFcnJvciBhcyBlOgorICAgICAgICBiYi5tc2cuZmF0YWwoIlJ1blF1ZXVlIiwgImZvcmsgZmFpbGVkOiAlZCAoJXMpIiAlIChlLmVycm5vLCBlLnN0cmVycm9yKSkKKworICAgIGlmIHBpZCA9PSAwOgorICAgICAgICBkZWYgY2hpbGQoKToKKyAgICAgICAgICAgIGdsb2JhbCB3b3JrZXJfcGlwZQorICAgICAgICAgICAgcGlwZWluLmNsb3NlKCkKKworICAgICAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHVEVSTSwgc2lndGVybV9oYW5kbGVyKQorICAgICAgICAgICAgIyBMZXQgU0lHSFVQIGV4aXQgYXMgU0lHVEVSTQorICAgICAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHSFVQLCBzaWd0ZXJtX2hhbmRsZXIpCisgICAgICAgICAgICBiYi51dGlscy5zaWduYWxfb25fcGFyZW50X2V4aXQoIlNJR1RFUk0iKQorCisgICAgICAgICAgICAjIFNhdmUgb3V0IHRoZSBQSUQgc28gdGhhdCB0aGUgZXZlbnQgY2FuIGluY2x1ZGUgaXQgdGhlCisgICAgICAgICAgICAjIGV2ZW50cworICAgICAgICAgICAgYmIuZXZlbnQud29ya2VyX3BpZCA9IG9zLmdldHBpZCgpCisgICAgICAgICAgICBiYi5ldmVudC53b3JrZXJfZmlyZSA9IHdvcmtlcl9jaGlsZF9maXJlCisgICAgICAgICAgICB3b3JrZXJfcGlwZSA9IHBpcGVvdXQKKworICAgICAgICAgICAgIyBNYWtlIHRoZSBjaGlsZCB0aGUgcHJvY2VzcyBncm91cCBsZWFkZXIgYW5kIGVuc3VyZSBubworICAgICAgICAgICAgIyBjaGlsZCBwcm9jZXNzIHdpbGwgYmUgY29udHJvbGxlZCBieSB0aGUgY3VycmVudCB0ZXJtaW5hbAorICAgICAgICAgICAgIyBUaGlzIGVuc3VyZXMgc2lnbmFscyBzZW50IHRvIHRoZSBjb250cm9sbGluZyB0ZXJtaW5hbCBsaWtlIEN0cmwrQworICAgICAgICAgICAgIyBkb24ndCBzdG9wIHRoZSBjaGlsZCBwcm9jZXNzZXMuCisgICAgICAgICAgICBvcy5zZXRzaWQoKQorICAgICAgICAgICAgIyBObyBzdGRpbgorICAgICAgICAgICAgbmV3c2kgPSBvcy5vcGVuKG9zLmRldm51bGwsIG9zLk9fUkRXUikKKyAgICAgICAgICAgIG9zLmR1cDIobmV3c2ksIHN5cy5zdGRpbi5maWxlbm8oKSkKKworICAgICAgICAgICAgaWYgdW1hc2s6CisgICAgICAgICAgICAgICAgb3MudW1hc2sodW1hc2spCisKKyAgICAgICAgICAgIGRhdGEuc2V0VmFyKCJCQl9XT1JLRVJDT05URVhUIiwgIjEiKQorICAgICAgICAgICAgZGF0YS5zZXRWYXIoIkJCX1RBU0tERVBEQVRBIiwgdGFza2RlcGRhdGEpCisgICAgICAgICAgICBkYXRhLnNldFZhcigiQlVJTEROQU1FIiwgd29ya2VyZGF0YVsiYnVpbGRuYW1lIl0pCisgICAgICAgICAgICBkYXRhLnNldFZhcigiREFURSIsIHdvcmtlcmRhdGFbImRhdGUiXSkKKyAgICAgICAgICAgIGRhdGEuc2V0VmFyKCJUSU1FIiwgd29ya2VyZGF0YVsidGltZSJdKQorICAgICAgICAgICAgYmIucGFyc2Uuc2lnZ2VuLnNldF90YXNrZGF0YSh3b3JrZXJkYXRhWyJzaWdkYXRhIl0pCisgICAgICAgICAgICByZXQgPSAwCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdGhlX2RhdGEgPSBiYi5jYWNoZS5DYWNoZS5sb2FkRGF0YUZ1bGwoZm4sIGFwcGVuZHMsIGRhdGEpCisgICAgICAgICAgICAgICAgdGhlX2RhdGEuc2V0VmFyKCdCQl9UQVNLSEFTSCcsIHdvcmtlcmRhdGFbInJ1bnFfaGFzaCJdW3Rhc2tdKQorCisgICAgICAgICAgICAgICAgIyBleHBvcnRlZF92YXJzKCkgcmV0dXJucyBhIGdlbmVyYXRvciB3aGljaCAqY2Fubm90KiBiZSBwYXNzZWQgdG8gb3MuZW52aXJvbi51cGRhdGUoKSAKKyAgICAgICAgICAgICAgICAjIHN1Y2Nlc3NmdWxseS4gV2UgYWxzbyBuZWVkIHRvIHVuc2V0IGFueXRoaW5nIGZyb20gdGhlIGVudmlyb25tZW50IHdoaWNoIHNob3VsZG4ndCBiZSB0aGVyZSAKKyAgICAgICAgICAgICAgICBleHBvcnRzID0gYmIuZGF0YS5leHBvcnRlZF92YXJzKHRoZV9kYXRhKQorICAgICAgICAgICAgICAgIGJiLnV0aWxzLmVtcHR5X2Vudmlyb25tZW50KCkKKyAgICAgICAgICAgICAgICBmb3IgZSwgdiBpbiBleHBvcnRzOgorICAgICAgICAgICAgICAgICAgICBvcy5lbnZpcm9uW2VdID0gdgorICAgICAgICAgICAgICAgIGZvciBlIGluIGZha2VlbnY6CisgICAgICAgICAgICAgICAgICAgIG9zLmVudmlyb25bZV0gPSBmYWtlZW52W2VdCisgICAgICAgICAgICAgICAgICAgIHRoZV9kYXRhLnNldFZhcihlLCBmYWtlZW52W2VdKQorICAgICAgICAgICAgICAgICAgICB0aGVfZGF0YS5zZXRWYXJGbGFnKGUsICdleHBvcnQnLCAiMSIpCisKKyAgICAgICAgICAgICAgICBpZiBxdWlldGVycm9yczoKKyAgICAgICAgICAgICAgICAgICAgdGhlX2RhdGEuc2V0VmFyRmxhZyh0YXNrbmFtZSwgInF1aWV0ZXJyb3JzIiwgIjEiKQorCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoKKyAgICAgICAgICAgICAgICBpZiBub3QgcXVpZXRlcnJvcnM6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5jcml0aWNhbChzdHIoZXhjKSkKKyAgICAgICAgICAgICAgICBvcy5fZXhpdCgxKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlmIGNmZy5kcnlfcnVuOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgICAgIHJldHVybiBiYi5idWlsZC5leGVjX3Rhc2soZm4sIHRhc2tuYW1lLCB0aGVfZGF0YSwgY2ZnLnByb2ZpbGUpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgb3MuX2V4aXQoMSkKKyAgICAgICAgaWYgbm90IHByb2ZpbGluZzoKKyAgICAgICAgICAgIG9zLl9leGl0KGNoaWxkKCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcm9mbmFtZSA9ICJwcm9maWxlLSVzLmxvZyIgJSAoZm4ucmVwbGFjZSgiLyIsICItIikgKyAiLSIgKyB0YXNrbmFtZSkKKyAgICAgICAgICAgIHByb2YgPSBwcm9maWxlLlByb2ZpbGUoKQorICAgICAgICAgICAgdHJ5OiAKKyAgICAgICAgICAgICAgICByZXQgPSBwcm9maWxlLlByb2ZpbGUucnVuY2FsbChwcm9mLCBjaGlsZCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgcHJvZi5kdW1wX3N0YXRzKHByb2ZuYW1lKQorICAgICAgICAgICAgICAgIGJiLnV0aWxzLnByb2Nlc3NfcHJvZmlsZWxvZyhwcm9mbmFtZSkKKyAgICAgICAgICAgICAgICBvcy5fZXhpdChyZXQpCisgICAgZWxzZToKKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gZW52YmFja3VwLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgaWYgdmFsdWUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBkZWwgb3MuZW52aXJvbltrZXldCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG9zLmVudmlyb25ba2V5XSA9IHZhbHVlCisKKyAgICByZXR1cm4gcGlkLCBwaXBlaW4sIHBpcGVvdXQKKworY2xhc3MgcnVuUXVldWVXb3JrZXJQaXBlKCk6CisgICAgIiIiCisgICAgQWJzdHJhY3Rpb24gZm9yIGEgcGlwZSBiZXR3ZWVuIGEgd29ya2VyIHRocmVhZCBhbmQgdGhlIHdvcmtlciBzZXJ2ZXIKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGlwZWluLCBwaXBlb3V0KToKKyAgICAgICAgc2VsZi5pbnB1dCA9IHBpcGVpbgorICAgICAgICBpZiBwaXBlb3V0OgorICAgICAgICAgICAgcGlwZW91dC5jbG9zZSgpCisgICAgICAgIGJiLnV0aWxzLm5vbmJsb2NraW5nZmQoc2VsZi5pbnB1dCkKKyAgICAgICAgc2VsZi5xdWV1ZSA9ICIiCisKKyAgICBkZWYgcmVhZChzZWxmKToKKyAgICAgICAgc3RhcnQgPSBsZW4oc2VsZi5xdWV1ZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5xdWV1ZSA9IHNlbGYucXVldWUgKyBzZWxmLmlucHV0LnJlYWQoMTAyNDAwKQorICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IpIGFzIGU6CisgICAgICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVBR0FJTjoKKyAgICAgICAgICAgICAgICByYWlzZQorCisgICAgICAgIGVuZCA9IGxlbihzZWxmLnF1ZXVlKQorICAgICAgICBpbmRleCA9IHNlbGYucXVldWUuZmluZCgiPC9ldmVudD4iKQorICAgICAgICB3aGlsZSBpbmRleCAhPSAtMToKKyAgICAgICAgICAgIHdvcmtlcl9maXJlX3ByZXBpY2tsZWQoc2VsZi5xdWV1ZVs6aW5kZXgrOF0pCisgICAgICAgICAgICBzZWxmLnF1ZXVlID0gc2VsZi5xdWV1ZVtpbmRleCs4Ol0KKyAgICAgICAgICAgIGluZGV4ID0gc2VsZi5xdWV1ZS5maW5kKCI8L2V2ZW50PiIpCisgICAgICAgIHJldHVybiAoZW5kID4gc3RhcnQpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHdoaWxlIHNlbGYucmVhZCgpOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgaWYgbGVuKHNlbGYucXVldWUpID4gMDoKKyAgICAgICAgICAgIHByaW50KCJXYXJuaW5nLCB3b3JrZXIgY2hpbGQgbGVmdCBwYXJ0aWFsIG1lc3NhZ2U6ICVzIiAlIHNlbGYucXVldWUpCisgICAgICAgIHNlbGYuaW5wdXQuY2xvc2UoKQorCitub3JtYWxleGl0ID0gRmFsc2UKKworY2xhc3MgQml0YmFrZVdvcmtlcihvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkaW4pOgorICAgICAgICBzZWxmLmlucHV0ID0gZGluCisgICAgICAgIGJiLnV0aWxzLm5vbmJsb2NraW5nZmQoc2VsZi5pbnB1dCkKKyAgICAgICAgc2VsZi5xdWV1ZSA9ICIiCisgICAgICAgIHNlbGYuY29va2VyY2ZnID0gTm9uZQorICAgICAgICBzZWxmLmRhdGFidWlsZGVyID0gTm9uZQorICAgICAgICBzZWxmLmRhdGEgPSBOb25lCisgICAgICAgIHNlbGYuYnVpbGRfcGlkcyA9IHt9CisgICAgICAgIHNlbGYuYnVpbGRfcGlwZXMgPSB7fQorICAgIAorICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdURVJNLCBzZWxmLnNpZ3Rlcm1fZXhjZXB0aW9uKQorICAgICAgICAjIExldCBTSUdIVVAgZXhpdCBhcyBTSUdURVJNCisgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0hVUCwgc2VsZi5zaWd0ZXJtX2V4Y2VwdGlvbikKKworICAgIGRlZiBzaWd0ZXJtX2V4Y2VwdGlvbihzZWxmLCBzaWdudW0sIHN0YWNrZnJhbWUpOgorICAgICAgICBpZiBzaWdudW0gPT0gc2lnbmFsLlNJR1RFUk06CisgICAgICAgICAgICBiYi53YXJuKCJXb3JrZXIgcmVjaWV2ZWQgU0lHVEVSTSwgc2h1dHRpbmcgZG93bi4uLiIpCisgICAgICAgIGVsaWYgc2lnbnVtID09IHNpZ25hbC5TSUdIVVA6CisgICAgICAgICAgICBiYi53YXJuKCJXb3JrZXIgcmVjaWV2ZWQgU0lHSFVQLCBzaHV0dGluZyBkb3duLi4uIikKKyAgICAgICAgc2VsZi5oYW5kbGVfZmluaXNobm93KE5vbmUpCisgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR1RFUk0sIHNpZ25hbC5TSUdfREZMKQorICAgICAgICBvcy5raWxsKG9zLmdldHBpZCgpLCBzaWduYWwuU0lHVEVSTSkKKworICAgIGRlZiBzZXJ2ZShzZWxmKTogICAgICAgIAorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgKHJlYWR5LCBfLCBfKSA9IHNlbGVjdC5zZWxlY3QoW3NlbGYuaW5wdXRdICsgW2kuaW5wdXQgZm9yIGkgaW4gc2VsZi5idWlsZF9waXBlcy52YWx1ZXMoKV0sIFtdICwgW10sIDEpCisgICAgICAgICAgICBpZiBzZWxmLmlucHV0IGluIHJlYWR5OgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgciA9IHNlbGYuaW5wdXQucmVhZCgpCisgICAgICAgICAgICAgICAgICAgIGlmIGxlbihyKSA9PSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBFT0Ygb24gcGlwZSwgc2VydmVyIG11c3QgaGF2ZSB0ZXJtaW5hdGVkCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNpZ3Rlcm1fZXhjZXB0aW9uKHNpZ25hbC5TSUdURVJNLCBOb25lKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnF1ZXVlID0gc2VsZi5xdWV1ZSArIHIKKyAgICAgICAgICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IpOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBpZiBsZW4oc2VsZi5xdWV1ZSk6CisgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfaXRlbSgiY29va2VyY29uZmlnIiwgc2VsZi5oYW5kbGVfY29va2VyY2ZnKQorICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2l0ZW0oIndvcmtlcmRhdGEiLCBzZWxmLmhhbmRsZV93b3JrZXJkYXRhKQorICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2l0ZW0oInJ1bnRhc2siLCBzZWxmLmhhbmRsZV9ydW50YXNrKQorICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2l0ZW0oImZpbmlzaG5vdyIsIHNlbGYuaGFuZGxlX2ZpbmlzaG5vdykKKyAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9pdGVtKCJwaW5nIiwgc2VsZi5oYW5kbGVfcGluZykKKyAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9pdGVtKCJxdWl0Iiwgc2VsZi5oYW5kbGVfcXVpdCkKKworICAgICAgICAgICAgZm9yIHBpcGUgaW4gc2VsZi5idWlsZF9waXBlczoKKyAgICAgICAgICAgICAgICBzZWxmLmJ1aWxkX3BpcGVzW3BpcGVdLnJlYWQoKQorICAgICAgICAgICAgaWYgbGVuKHNlbGYuYnVpbGRfcGlkcyk6CisgICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzX3dhaXRwaWQoKQorICAgICAgICAgICAgd29ya2VyX2ZsdXNoKCkKKworCisgICAgZGVmIGhhbmRsZV9pdGVtKHNlbGYsIGl0ZW0sIGZ1bmMpOgorICAgICAgICBpZiBzZWxmLnF1ZXVlLnN0YXJ0c3dpdGgoIjwiICsgaXRlbSArICI+Iik6CisgICAgICAgICAgICBpbmRleCA9IHNlbGYucXVldWUuZmluZCgiPC8iICsgaXRlbSArICI+IikKKyAgICAgICAgICAgIHdoaWxlIGluZGV4ICE9IC0xOgorICAgICAgICAgICAgICAgIGZ1bmMoc2VsZi5xdWV1ZVsobGVuKGl0ZW0pICsgMik6aW5kZXhdKQorICAgICAgICAgICAgICAgIHNlbGYucXVldWUgPSBzZWxmLnF1ZXVlWyhpbmRleCArIGxlbihpdGVtKSArIDMpOl0KKyAgICAgICAgICAgICAgICBpbmRleCA9IHNlbGYucXVldWUuZmluZCgiPC8iICsgaXRlbSArICI+IikKKworICAgIGRlZiBoYW5kbGVfY29va2VyY2ZnKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLmNvb2tlcmNmZyA9IHBpY2tsZS5sb2FkcyhkYXRhKQorICAgICAgICBzZWxmLmRhdGFidWlsZGVyID0gYmIuY29va2VyZGF0YS5Db29rZXJEYXRhQnVpbGRlcihzZWxmLmNvb2tlcmNmZywgd29ya2VyPVRydWUpCisgICAgICAgIHNlbGYuZGF0YWJ1aWxkZXIucGFyc2VCYXNlQ29uZmlndXJhdGlvbigpCisgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZGF0YWJ1aWxkZXIuZGF0YQorCisgICAgZGVmIGhhbmRsZV93b3JrZXJkYXRhKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLndvcmtlcmRhdGEgPSBwaWNrbGUubG9hZHMoZGF0YSkKKyAgICAgICAgYmIubXNnLmxvZ2dlckRlZmF1bHREZWJ1Z0xldmVsID0gc2VsZi53b3JrZXJkYXRhWyJsb2dkZWZhdWx0ZGVidWciXQorICAgICAgICBiYi5tc2cubG9nZ2VyRGVmYXVsdFZlcmJvc2UgPSBzZWxmLndvcmtlcmRhdGFbImxvZ2RlZmF1bHR2ZXJib3NlIl0KKyAgICAgICAgYmIubXNnLmxvZ2dlclZlcmJvc2VMb2dzID0gc2VsZi53b3JrZXJkYXRhWyJsb2dkZWZhdWx0dmVyYm9zZWxvZ3MiXQorICAgICAgICBiYi5tc2cubG9nZ2VyRGVmYXVsdERvbWFpbnMgPSBzZWxmLndvcmtlcmRhdGFbImxvZ2RlZmF1bHRkb21haW4iXQorICAgICAgICBzZWxmLmRhdGEuc2V0VmFyKCJQUlNFUlZfSE9TVCIsIHNlbGYud29ya2VyZGF0YVsicHJob3N0Il0pCisKKyAgICBkZWYgaGFuZGxlX3Bpbmcoc2VsZiwgXyk6CisgICAgICAgIHdvcmtlcmxvZ193cml0ZSgiSGFuZGxpbmcgcGluZ1xuIikKKworICAgICAgICBsb2dnZXIud2FybigiUG9uZyBmcm9tIGJpdGJha2Utd29ya2VyISIpCisKKyAgICBkZWYgaGFuZGxlX3F1aXQoc2VsZiwgZGF0YSk6CisgICAgICAgIHdvcmtlcmxvZ193cml0ZSgiSGFuZGxpbmcgcXVpdFxuIikKKworICAgICAgICBnbG9iYWwgbm9ybWFsZXhpdAorICAgICAgICBub3JtYWxleGl0ID0gVHJ1ZQorICAgICAgICBzeXMuZXhpdCgwKQorCisgICAgZGVmIGhhbmRsZV9ydW50YXNrKHNlbGYsIGRhdGEpOgorICAgICAgICBmbiwgdGFzaywgdGFza25hbWUsIHF1aWV0ZXJyb3JzLCBhcHBlbmRzLCB0YXNrZGVwZGF0YSA9IHBpY2tsZS5sb2FkcyhkYXRhKQorICAgICAgICB3b3JrZXJsb2dfd3JpdGUoIkhhbmRsaW5nIHJ1bnRhc2sgJXMgJXMgJXNcbiIgJSAodGFzaywgZm4sIHRhc2tuYW1lKSkKKworICAgICAgICBwaWQsIHBpcGVpbiwgcGlwZW91dCA9IGZvcmtfb2ZmX3Rhc2soc2VsZi5jb29rZXJjZmcsIHNlbGYuZGF0YSwgc2VsZi53b3JrZXJkYXRhLCBmbiwgdGFzaywgdGFza25hbWUsIGFwcGVuZHMsIHRhc2tkZXBkYXRhLCBxdWlldGVycm9ycykKKworICAgICAgICBzZWxmLmJ1aWxkX3BpZHNbcGlkXSA9IHRhc2sKKyAgICAgICAgc2VsZi5idWlsZF9waXBlc1twaWRdID0gcnVuUXVldWVXb3JrZXJQaXBlKHBpcGVpbiwgcGlwZW91dCkKKworICAgIGRlZiBwcm9jZXNzX3dhaXRwaWQoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gbm9uZSBpcyB0aGVyZSBhcmUgbm8gcHJvY2Vzc2VzIGF3YWl0aW5nIHJlc3VsdCBjb2xsZWN0aW9uLCBvdGhlcndpc2UKKyAgICAgICAgY29sbGVjdCB0aGUgcHJvY2VzcyBleGl0IGNvZGVzIGFuZCBjbG9zZSB0aGUgaW5mb3JtYXRpb24gcGlwZS4KKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBpZCwgc3RhdHVzID0gb3Mud2FpdHBpZCgtMSwgb3MuV05PSEFORykKKyAgICAgICAgICAgIGlmIHBpZCA9PSAwIG9yIG9zLldJRlNUT1BQRUQoc3RhdHVzKToKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgd29ya2VybG9nX3dyaXRlKCJFeGl0IGNvZGUgb2YgJXMgZm9yIHBpZCAlc1xuIiAlIChzdGF0dXMsIHBpZCkpCisKKyAgICAgICAgaWYgb3MuV0lGRVhJVEVEKHN0YXR1cyk6CisgICAgICAgICAgICBzdGF0dXMgPSBvcy5XRVhJVFNUQVRVUyhzdGF0dXMpCisgICAgICAgIGVsaWYgb3MuV0lGU0lHTkFMRUQoc3RhdHVzKToKKyAgICAgICAgICAgICMgUGVyIHNoZWxsIGNvbnZlbnRpb25zIGZvciAkPywgd2hlbiBhIHByb2Nlc3MgZXhpdHMgZHVlIHRvCisgICAgICAgICAgICAjIGEgc2lnbmFsLCB3ZSByZXR1cm4gYW4gZXhpdCBjb2RlIG9mIDEyOCArIFNJR05VTQorICAgICAgICAgICAgc3RhdHVzID0gMTI4ICsgb3MuV1RFUk1TSUcoc3RhdHVzKQorCisgICAgICAgIHRhc2sgPSBzZWxmLmJ1aWxkX3BpZHNbcGlkXQorICAgICAgICBkZWwgc2VsZi5idWlsZF9waWRzW3BpZF0KKworICAgICAgICBzZWxmLmJ1aWxkX3BpcGVzW3BpZF0uY2xvc2UoKQorICAgICAgICBkZWwgc2VsZi5idWlsZF9waXBlc1twaWRdCisKKyAgICAgICAgd29ya2VyX2ZpcmVfcHJlcGlja2xlZCgiPGV4aXRjb2RlPiIgKyBwaWNrbGUuZHVtcHMoKHRhc2ssIHN0YXR1cykpICsgIjwvZXhpdGNvZGU+IikKKworICAgIGRlZiBoYW5kbGVfZmluaXNobm93KHNlbGYsIF8pOgorICAgICAgICBpZiBzZWxmLmJ1aWxkX3BpZHM6CisgICAgICAgICAgICBsb2dnZXIuaW5mbygiU2VuZGluZyBTSUdURVJNIHRvIHJlbWFpbmluZyAlcyB0YXNrcyIsIGxlbihzZWxmLmJ1aWxkX3BpZHMpKQorICAgICAgICAgICAgZm9yIGssIHYgaW4gc2VsZi5idWlsZF9waWRzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgb3Mua2lsbCgtaywgc2lnbmFsLlNJR1RFUk0pCisgICAgICAgICAgICAgICAgICAgIG9zLndhaXRwaWQoLTEsIDApCisgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGZvciBwaXBlIGluIHNlbGYuYnVpbGRfcGlwZXM6CisgICAgICAgICAgICBzZWxmLmJ1aWxkX3BpcGVzW3BpcGVdLnJlYWQoKQorCit0cnk6CisgICAgd29ya2VyID0gQml0YmFrZVdvcmtlcihzeXMuc3RkaW4pCisgICAgaWYgbm90IHByb2ZpbGluZzoKKyAgICAgICAgd29ya2VyLnNlcnZlKCkKKyAgICBlbHNlOgorICAgICAgICBwcm9mbmFtZSA9ICJwcm9maWxlLXdvcmtlci5sb2ciCisgICAgICAgIHByb2YgPSBwcm9maWxlLlByb2ZpbGUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwcm9maWxlLlByb2ZpbGUucnVuY2FsbChwcm9mLCB3b3JrZXIuc2VydmUpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBwcm9mLmR1bXBfc3RhdHMocHJvZm5hbWUpCisgICAgICAgICAgICBiYi51dGlscy5wcm9jZXNzX3Byb2ZpbGVsb2cocHJvZm5hbWUpCitleGNlcHQgQmFzZUV4Y2VwdGlvbiBhcyBlOgorICAgIGlmIG5vdCBub3JtYWxleGl0OgorICAgICAgICBpbXBvcnQgdHJhY2ViYWNrCisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUodHJhY2ViYWNrLmZvcm1hdF9leGMoKSkKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZShzdHIoZSkpCit3aGlsZSBsZW4od29ya2VyX3F1ZXVlKToKKyAgICB3b3JrZXJfZmx1c2goKQord29ya2VybG9nX3dyaXRlKCJleGl0dGluZyIpCitzeXMuZXhpdCgwKQorCmRpZmYgLS1naXQgYS9iaXRiYWtlL2Jpbi9iaXRkb2MgYi9iaXRiYWtlL2Jpbi9iaXRkb2MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTc2ZDg4YgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvYmluL2JpdGRvYwpAQCAtMCwwICsxLDUzMSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIworIyBDb3B5cmlnaHQgKEMpIDIwMDUgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBvcHRwYXJzZSwgb3MsIHN5cworCisjIGJpdGJha2UKK3N5cy5wYXRoLmFwcGVuZChvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksICdsaWInKSkKK2ltcG9ydCBiYgoraW1wb3J0IGJiLnBhcnNlCitmcm9tICAgc3RyaW5nIGltcG9ydCBzcGxpdCwgam9pbgorCitfX3ZlcnNpb25fXyA9ICIwLjAuMiIKKworY2xhc3MgSFRNTEZvcm1hdHRlcjoKKyAgICAiIiIKKyAgICBTaW1wbGUgY2xhc3MgdG8gaGVscCB0byBnZW5lcmF0ZSBzb21lIHNvcnQgb2YgSFRNTCBmaWxlcy4gSXQgaXMKKyAgICBxdWl0ZSBpbmZlcmlvciBzb2x1dGlvbiBjb21wYXJlZCB0byBkb2Nib29rLCBndGtkb2MsIGRveHlnZW4gYnV0IGl0CisgICAgc2hvdWxkIHdvcmsgZm9yIG5vdy4KKyAgICBXZSd2ZSBhIGdsb2JhbCBpbnRyb2R1Y3Rpb24gc2l0ZSAoaW5kZXguaHRtbCkgYW5kIHRoZW4gb25lIHNpdGUgZm9yCisgICAgdGhlIGxpc3Qgb2Yga2V5cyAoYWxwaGFiZXRpY2FsIHNvcnRlZCkgYW5kIG9uZSBmb3IgdGhlIGxpc3Qgb2YgZ3JvdXBzLAorICAgIG9uZSBzaXRlIGZvciBlYWNoIGtleSB3aXRoIGxpbmtzIHRvIHRoZSByZWxhdGlvbnMgYW5kIGdyb3Vwcy4KKworICAgICAgICBpbmRleC5odG1sCisgICAgICAgIGFsbF9rZXlzLmh0bWwKKyAgICAgICAgYWxsX2dyb3Vwcy5odG1sCisgICAgICAgIGdyb3VwTkFNRS5odG1sCisgICAgICAgIGtleU5BTUUuaHRtbAorICAgICIiIgorCisgICAgZGVmIHJlcGxhY2Uoc2VsZiwgdGV4dCwgKnBhaXJzKToKKyAgICAgICAgIiIiCisgICAgICAgIEZyb20gcHlkb2MuLi4gYWxtb3N0IGlkZW50aWNhbCBhdCBsZWFzdAorICAgICAgICAiIiIKKyAgICAgICAgd2hpbGUgcGFpcnM6CisgICAgICAgICAgICAoYSwgYikgPSBwYWlyc1swXQorICAgICAgICAgICAgdGV4dCA9IGpvaW4oc3BsaXQodGV4dCwgYSksIGIpCisgICAgICAgICAgICBwYWlycyA9IHBhaXJzWzE6XQorICAgICAgICByZXR1cm4gdGV4dAorICAgIGRlZiBlc2NhcGUoc2VsZiwgdGV4dCk6CisgICAgICAgICIiIgorICAgICAgICBFc2NhcGUgc3RyaW5nIHRvIGJlIGNvbmZvcm0gSFRNTAorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYucmVwbGFjZSh0ZXh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJyYnLCAnJmFtcDsnKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCc8JywgJyZsdDsnICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCc+JywgJyZndDsnICkgKQorICAgIGRlZiBjcmVhdGVOYXZpZ2F0b3Ioc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBDcmVhdGUgdGhlIG5hdmdpYXRvcgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuICIiIjx0YWJsZSBjbGFzcz0ibmF2aWdhdGlvbiIgd2lkdGg9IjEwMCUiIHN1bW1hcnk9Ik5hdmlnYXRpb24gaGVhZGVyIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjIiPgorPHRyIHZhbGlnbj0ibWlkZGxlIj4KKzx0ZD48YSBhY2Nlc3NrZXk9ImciIGhyZWY9ImluZGV4Lmh0bWwiPkhvbWU8L2E+PC90ZD4KKzx0ZD48YSBhY2Nlc3NrZXk9Im4iIGhyZWY9ImFsbF9ncm91cHMuaHRtbCI+R3JvdXBzPC9hPjwvdGQ+Cis8dGQ+PGEgYWNjZXNza2V5PSJ1IiBocmVmPSJhbGxfa2V5cy5odG1sIj5LZXlzPC9hPjwvdGQ+Cis8L3RyPjwvdGFibGU+CisiIiIKKworICAgIGRlZiByZWxhdGVkS2V5cyhzZWxmLCBpdGVtKToKKyAgICAgICAgIiIiCisgICAgICAgIENyZWF0ZSBIVE1MIHRvIGxpbmsgdG8gZm9yZWlnbiBrZXlzCisgICAgICAgICIiIgorCisgICAgICAgIGlmIGxlbihpdGVtLnJlbGF0ZWQoKSkgPT0gMDoKKyAgICAgICAgICAgIHJldHVybiAiIgorCisgICAgICAgIHR4dCA9ICI8cD48Yj5TZWUgYWxzbzo8L2I+PGJyPiIKKyAgICAgICAgdHh0cyA9IFtdCisgICAgICAgIGZvciBpdCBpbiBpdGVtLnJlbGF0ZWQoKToKKyAgICAgICAgICAgIHR4dHMuYXBwZW5kKCIiIjxhIGhyZWY9ImtleSUoaXQpcy5odG1sIj4lKGl0KXM8L2E+IiIiICUgdmFycygpICkKKworICAgICAgICByZXR1cm4gdHh0ICsgIiwiLmpvaW4odHh0cykKKworICAgIGRlZiBncm91cHMoc2VsZiwgaXRlbSk6CisgICAgICAgICIiIgorICAgICAgICBDcmVhdGUgSFRNTCB0byBsaW5rIHRvIHJlbGF0ZWQgZ3JvdXBzCisgICAgICAgICIiIgorCisgICAgICAgIGlmIGxlbihpdGVtLmdyb3VwcygpKSA9PSAwOgorICAgICAgICAgICAgcmV0dXJuICIiCisKKworICAgICAgICB0eHQgPSAiPHA+PGI+U2VlIGFsc286PC9iPjxicj4iCisgICAgICAgIHR4dHMgPSBbXQorICAgICAgICBmb3IgZ3JvdXAgaW4gaXRlbS5ncm91cHMoKToKKyAgICAgICAgICAgIHR4dHMuYXBwZW5kKCAiIiI8YSBocmVmPSJncm91cCVzLmh0bWwiPiVzPC9hPiAiIiIgJSAoZ3JvdXAsIGdyb3VwKSApCisKKyAgICAgICAgcmV0dXJuIHR4dCArICIsIi5qb2luKHR4dHMpCisKKworICAgIGRlZiBjcmVhdGVLZXlTaXRlKHNlbGYsIGl0ZW0pOgorICAgICAgICAiIiIKKyAgICAgICAgQ3JlYXRlIGEgc2l0ZSBmb3IgYSBrZXkuIEl0IGNvbnRhaW5zIHRoZSBoZWFkZXIvbmF2aWdhdG9yLCBhIGhlYWRpbmcsCisgICAgICAgIHRoZSBkZXNjcmlwdGlvbiwgbGlua3MgdG8gcmVsYXRlZCBrZXlzIGFuZCB0byB0aGUgZ3JvdXBzLgorICAgICAgICAiIiIKKworICAgICAgICByZXR1cm4gIiIiPCFkb2N0eXBlIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KKzxodG1sPjxoZWFkPjx0aXRsZT5LZXkgJXM8L3RpdGxlPjwvaGVhZD4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0ic3R5bGUuY3NzIiB0eXBlPSJ0ZXh0L2NzcyI+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgdGV4dD0iYmxhY2siIGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjODQwMDg0IiBhbGluaz0iIzAwMDBGRiI+CislcworPGgyPjxzcGFuIGNsYXNzPSJyZWZlbnRyeXRpdGxlIj4lczwvc3Bhbj48L2gyPgorCis8ZGl2IGNsYXNzPSJyZWZzeW5vcHNpc2RpdiI+Cis8aDI+U3lub3BzaXM8L2gyPgorPHA+CislcworPC9wPgorPC9kaXY+CisKKzxkaXYgY2xhc3M9InJlZnN5bm9wc2lzZGl2Ij4KKzxoMj5SZWxhdGVkIEtleXM8L2gyPgorPHA+CislcworPC9wPgorPC9kaXY+CisKKzxkaXYgY2xhc3M9InJlZnN5bm9wc2lzZGl2Ij4KKzxoMj5Hcm91cHM8L2gyPgorPHA+CislcworPC9wPgorPC9kaXY+CisKKworPC9ib2R5PgorIiIiICAgICAlIChpdGVtLm5hbWUoKSwgc2VsZi5jcmVhdGVOYXZpZ2F0b3IoKSwgaXRlbS5uYW1lKCksIAorICAgICAgICAgICBzZWxmLmVzY2FwZShpdGVtLmRlc2NyaXB0aW9uKCkpLCBzZWxmLnJlbGF0ZWRLZXlzKGl0ZW0pLCBzZWxmLmdyb3VwcyhpdGVtKSkKKworICAgIGRlZiBjcmVhdGVHcm91cHNTaXRlKHNlbGYsIGRvYyk6CisgICAgICAgICIiIgorICAgICAgICBDcmVhdGUgdGhlIEdyb3VwIE92ZXJ2aWV3IHNpdGUKKyAgICAgICAgIiIiCisKKyAgICAgICAgZ3JvdXBzID0gIiIKKyAgICAgICAgc29ydGVkX2dyb3VwcyA9IHNvcnRlZChkb2MuZ3JvdXBzKCkpCisgICAgICAgIGZvciBncm91cCBpbiBzb3J0ZWRfZ3JvdXBzOgorICAgICAgICAgICAgZ3JvdXBzICs9ICIiIjxhIGhyZWY9Imdyb3VwJXMuaHRtbCI+JXM8L2E+PGJyPiIiIiAlIChncm91cCwgZ3JvdXApCisKKyAgICAgICAgcmV0dXJuICIiIjwhZG9jdHlwZSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Cis8aHRtbD48aGVhZD48dGl0bGU+R3JvdXAgb3ZlcnZpZXc8L3RpdGxlPjwvaGVhZD4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0ic3R5bGUuY3NzIiB0eXBlPSJ0ZXh0L2NzcyI+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgdGV4dD0iYmxhY2siIGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjODQwMDg0IiBhbGluaz0iIzAwMDBGRiI+CislcworPGgyPkF2YWlsYWJsZSBHcm91cHM8L2gyPgorJXMKKzwvYm9keT4KKyIiIiAlIChzZWxmLmNyZWF0ZU5hdmlnYXRvcigpLCBncm91cHMpCisKKyAgICBkZWYgY3JlYXRlSW5kZXgoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBDcmVhdGUgdGhlIGluZGV4IGZpbGUKKyAgICAgICAgIiIiCisKKyAgICAgICAgcmV0dXJuICIiIjwhZG9jdHlwZSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Cis8aHRtbD48aGVhZD48dGl0bGU+Qml0YmFrZSBEb2N1bWVudGF0aW9uPC90aXRsZT48L2hlYWQ+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9InN0eWxlLmNzcyIgdHlwZT0idGV4dC9jc3MiPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIHRleHQ9ImJsYWNrIiBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzg0MDA4NCIgYWxpbms9IiMwMDAwRkYiPgorJXMKKzxoMj5Eb2N1bWVudGF0aW9uIEVudHJhbmNlPC9oMj4KKzxhIGhyZWY9ImFsbF9ncm91cHMuaHRtbCI+QWxsIGF2YWlsYWJsZSBncm91cHM8L2E+PGJyPgorPGEgaHJlZj0iYWxsX2tleXMuaHRtbCI+QWxsIGF2YWlsYWJsZSBrZXlzPC9hPjxicj4KKzwvYm9keT4KKyIiIiAlIHNlbGYuY3JlYXRlTmF2aWdhdG9yKCkKKworICAgIGRlZiBjcmVhdGVLZXlzU2l0ZShzZWxmLCBkb2MpOgorICAgICAgICAiIiIKKyAgICAgICAgQ3JlYXRlIE92ZXJ2aWV3IG9mIGFsbCBhdmlsYWJsZSBrZXlzCisgICAgICAgICIiIgorICAgICAgICBrZXlzID0gIiIKKyAgICAgICAgc29ydGVkX2tleXMgPSBzb3J0ZWQoZG9jLmRvY19rZXlzKCkpCisgICAgICAgIGZvciBrZXkgaW4gc29ydGVkX2tleXM6CisgICAgICAgICAgICBrZXlzICs9ICIiIjxhIGhyZWY9ImtleSVzLmh0bWwiPiVzPC9hPjxicj4iIiIgJSAoa2V5LCBrZXkpCisKKyAgICAgICAgcmV0dXJuICIiIjwhZG9jdHlwZSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Cis8aHRtbD48aGVhZD48dGl0bGU+S2V5IG92ZXJ2aWV3PC90aXRsZT48L2hlYWQ+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9InN0eWxlLmNzcyIgdHlwZT0idGV4dC9jc3MiPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIHRleHQ9ImJsYWNrIiBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzg0MDA4NCIgYWxpbms9IiMwMDAwRkYiPgorJXMKKzxoMj5BdmFpbGFibGUgS2V5czwvaDI+CislcworPC9ib2R5PgorIiIiICUgKHNlbGYuY3JlYXRlTmF2aWdhdG9yKCksIGtleXMpCisKKyAgICBkZWYgY3JlYXRlR3JvdXBTaXRlKHNlbGYsIGdyLCBpdGVtcywgX2Rlc2NyaXB0aW9uID0gTm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBDcmVhdGUgYSBzaXRlIGZvciBhIGdyb3VwOgorICAgICAgICBHcm91cCB0aGUgbmFtZSBvZiB0aGUgZ3JvdXAsIGl0ZW1zIGNvbnRhaW4gdGhlIG5hbWUgb2YgdGhlIGtleXMKKyAgICAgICAgaW5zaWRlIHRoaXMgZ3JvdXAKKyAgICAgICAgIiIiCisgICAgICAgIGdyb3VwcyA9ICIiCisgICAgICAgIGRlc2NyaXB0aW9uID0gIiIKKworICAgICAgICAjIGNyZWF0ZSBhIHNlY3Rpb24gd2l0aCB0aGUgZ3JvdXAgZGVzY3JpcHRpb25zCisgICAgICAgIGlmIF9kZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uICArPSAiPGgyIERlc2NyaXB0aW9uIG9mIEdyb3pwICVzPC9oMj4iICUgZ3IKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uICArPSBfZGVzY3JpcHRpb24KKworICAgICAgICBpdGVtcy5zb3J0KGxhbWJkYSB4LCB5OmNtcCh4Lm5hbWUoKSwgeS5uYW1lKCkpKQorICAgICAgICBmb3IgZ3JvdXAgaW4gaXRlbXM6CisgICAgICAgICAgICBncm91cHMgKz0gIiIiPGEgaHJlZj0ia2V5JXMuaHRtbCI+JXM8L2E+PGJyPiIiIiAlIChncm91cC5uYW1lKCksIGdyb3VwLm5hbWUoKSkKKworICAgICAgICByZXR1cm4gIiIiPCFkb2N0eXBlIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KKzxodG1sPjxoZWFkPjx0aXRsZT5Hcm91cCAlczwvdGl0bGU+PC9oZWFkPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJzdHlsZS5jc3MiIHR5cGU9InRleHQvY3NzIj4KKzxib2R5IGJnY29sb3I9IndoaXRlIiB0ZXh0PSJibGFjayIgbGluaz0iIzAwMDBGRiIgdmxpbms9IiM4NDAwODQiIGFsaW5rPSIjMDAwMEZGIj4KKyVzCislcworPGRpdiBjbGFzcz0icmVmc3lub3BzaXNkaXYiPgorPGgyPktleXMgaW4gR3JvdXAgJXM8L2gyPgorPHByZSBjbGFzcz0ic3lub3BzaXMiPgorJXMKKzwvcHJlPgorPC9kaXY+Cis8L2JvZHk+CisiIiIgJSAoZ3IsIHNlbGYuY3JlYXRlTmF2aWdhdG9yKCksIGRlc2NyaXB0aW9uLCBnciwgZ3JvdXBzKQorCisKKworICAgIGRlZiBjcmVhdGVDU1Moc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBDcmVhdGUgdGhlIENTUyBmaWxlCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gIiIiLnN5bm9wc2lzLCAuY2xhc3NzeW5vcHNpcworeworICBiYWNrZ3JvdW5kOiAjZWVlZWVlOworICBib3JkZXI6IHNvbGlkIDFweCAjYWFhYWFhOworICBwYWRkaW5nOiAwLjVlbTsKK30KKy5wcm9ncmFtbGlzdGluZworeworICBiYWNrZ3JvdW5kOiAjZWVlZWZmOworICBib3JkZXI6IHNvbGlkIDFweCAjYWFhYWZmOworICBwYWRkaW5nOiAwLjVlbTsKK30KKy52YXJpYWJsZWxpc3QKK3sKKyAgcGFkZGluZzogNHB4OworICBtYXJnaW4tbGVmdDogM2VtOworfQorLnZhcmlhYmxlbGlzdCB0ZDpmaXJzdC1jaGlsZAoreworICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworfQordGFibGUubmF2aWdhdGlvbgoreworICBiYWNrZ3JvdW5kOiAjZmZlZWVlOworICBib3JkZXI6IHNvbGlkIDFweCAjZmZhYWFhOworICBtYXJnaW4tdG9wOiAwLjVlbTsKKyAgbWFyZ2luLWJvdHRvbTogMC41ZW07Cit9CisubmF2aWdhdGlvbiBhCit7CisgIGNvbG9yOiAjNzcwMDAwOworfQorLm5hdmlnYXRpb24gYTp2aXNpdGVkCit7CisgIGNvbG9yOiAjNTUwMDAwOworfQorLm5hdmlnYXRpb24gLnRpdGxlCit7CisgIGZvbnQtc2l6ZTogMjAwJTsKK30KK2Rpdi5yZWZuYW1lZGl2Cit7CisgIG1hcmdpbi10b3A6IDJlbTsKK30KK2Rpdi5nYWxsZXJ5LWZsb2F0Cit7CisgIGZsb2F0OiBsZWZ0OworICBwYWRkaW5nOiAxMHB4OworfQorZGl2LmdhbGxlcnktZmxvYXQgaW1nCit7CisgIGJvcmRlci1zdHlsZTogbm9uZTsKK30KK2Rpdi5nYWxsZXJ5LXNwYWNlcgoreworICBjbGVhcjogYm90aDsKK30KK2EKK3sKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorYTpob3ZlcgoreworICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKKyAgY29sb3I6ICNGRjAwMDA7Cit9CisiIiIKKworCisKK2NsYXNzIERvY3VtZW50YXRpb25JdGVtOgorICAgICIiIgorICAgIEEgY2xhc3MgdG8gaG9sZCBpbmZvcm1hdGlvbiBhYm91dCBhIGNvbmZpZ3VyYXRpb24KKyAgICBpdGVtLiBJdCBjb250YWlucyB0aGUga2V5IG5hbWUsIGRlc2NyaXB0aW9uLCBhIGxpc3Qgb2YgcmVsYXRlZCBuYW1lcywKKyAgICBhbmQgdGhlIGdyb3VwIHRoaXMgaXRlbSBpcyBjb250YWluZWQgaW4uCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX2dyb3VwcyAgPSBbXQorICAgICAgICBzZWxmLl9yZWxhdGVkID0gW10KKyAgICAgICAgc2VsZi5fbmFtZSAgICA9ICIiCisgICAgICAgIHNlbGYuX2Rlc2MgICAgPSAiIgorCisgICAgZGVmIGdyb3VwcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dyb3VwcworCisgICAgZGVmIG5hbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9uYW1lCisKKyAgICBkZWYgZGVzY3JpcHRpb24oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9kZXNjCisKKyAgICBkZWYgcmVsYXRlZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JlbGF0ZWQKKworICAgIGRlZiBzZXROYW1lKHNlbGYsIG5hbWUpOgorICAgICAgICBzZWxmLl9uYW1lID0gbmFtZQorCisgICAgZGVmIHNldERlc2NyaXB0aW9uKHNlbGYsIGRlc2MpOgorICAgICAgICBzZWxmLl9kZXNjID0gZGVzYworCisgICAgZGVmIGFkZEdyb3VwKHNlbGYsIGdyb3VwKToKKyAgICAgICAgc2VsZi5fZ3JvdXBzLmFwcGVuZChncm91cCkKKworICAgIGRlZiBhZGRSZWxhdGlvbihzZWxmLCByZWxhdGlvbik6CisgICAgICAgIHNlbGYuX3JlbGF0ZWQuYXBwZW5kKHJlbGF0aW9uKQorCisgICAgZGVmIHNvcnQoc2VsZik6CisgICAgICAgIHNlbGYuX3JlbGF0ZWQuc29ydCgpCisgICAgICAgIHNlbGYuX2dyb3Vwcy5zb3J0KCkKKworCitjbGFzcyBEb2N1bWVudGF0aW9uOgorICAgICIiIgorICAgIEhvbGRzIHRoZSBkb2N1bWVudGF0aW9uLi4uIHdpdGggbWFwcGluZ3MgZnJvbSBrZXkgdG8gaXRlbXMuLi4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5fX2tleXMgICA9IHt9CisgICAgICAgIHNlbGYuX19ncm91cHMgPSB7fQorCisgICAgZGVmIGluc2VydF9kb2NfaXRlbShzZWxmLCBpdGVtKToKKyAgICAgICAgIiIiCisgICAgICAgIEluc2VydCB0aGUgRG9jIEl0ZW0gaW50byB0aGUgaW50ZXJuYWwgbGlzdAorICAgICAgICBvZiByZXByZXNlbnRhdGlvbgorICAgICAgICAiIiIKKyAgICAgICAgaXRlbS5zb3J0KCkKKyAgICAgICAgc2VsZi5fX2tleXNbaXRlbS5uYW1lKCldID0gaXRlbQorCisgICAgICAgIGZvciBncm91cCBpbiBpdGVtLmdyb3VwcygpOgorICAgICAgICAgICAgaWYgbm90IGdyb3VwIGluIHNlbGYuX19ncm91cHM6CisgICAgICAgICAgICAgICAgc2VsZi5fX2dyb3Vwc1tncm91cF0gPSBbXQorICAgICAgICAgICAgc2VsZi5fX2dyb3Vwc1tncm91cF0uYXBwZW5kKGl0ZW0pCisgICAgICAgICAgICBzZWxmLl9fZ3JvdXBzW2dyb3VwXS5zb3J0KCkKKworCisgICAgZGVmIGRvY19pdGVtKHNlbGYsIGtleSk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gdGhlIERvY3VtZW50YXRpb25JbnN0YW5jZSBkZXNjcmliaW5nIHRoZSBrZXkKKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9fa2V5c1trZXldCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgZG9jX2tleXMoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gdGhlIGRvY3VtZW50ZWQgS0VZUyAobmFtZXMpCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5fX2tleXMua2V5cygpCisKKyAgICBkZWYgZ3JvdXBzKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIHRoZSBuYW1lcyBvZiBhdmFpbGFibGUgZ3JvdXBzCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5fX2dyb3Vwcy5rZXlzKCkKKworICAgIGRlZiBncm91cF9jb250ZW50KHNlbGYsIGdyb3VwX25hbWUpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgbGlzdCBvZiBrZXlzL25hbWVzIHRoYXQgYXJlIGluIGEgc3BlY2VmaWMKKyAgICAgICAgZ3JvdXAgb3IgdGhlIGVtcHR5IGxpc3QKKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9fZ3JvdXBzW2dyb3VwX25hbWVdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBbXQorCisKK2RlZiBwYXJzZV9jbWRsaW5lKGFyZ3MpOgorICAgICIiIgorICAgIFBhcnNlIHRoZSBDTUQgbGluZSBhbmQgcmV0dXJuIHRoZSByZXN1bHQgYXMgYSBuLXR1cGxlCisgICAgIiIiCisKKyAgICBwYXJzZXIgPSBvcHRwYXJzZS5PcHRpb25QYXJzZXIoIHZlcnNpb24gPSAiQml0YmFrZSBEb2N1bWVudGF0aW9uIFRvb2wgQ29yZSB2ZXJzaW9uICVzLCAlJXByb2cgdmVyc2lvbiAlcyIgJSAoYmIuX192ZXJzaW9uX18sIF9fdmVyc2lvbl9fKSkKKyAgICB1c2FnZSAgPSAiIiIlcHJvZyBbb3B0aW9uc10KKworQ3JlYXRlIGEgc2V0IG9mIGh0bWwgcGFnZXMgKGRvY3VtZW50YXRpb24pIGZvciBhIGJpdGJha2UuY29uZi4uLi4KKyIiIgorCisgICAgIyBBZGQgdGhlIG5lZWRlZCBvcHRpb25zCisgICAgcGFyc2VyLmFkZF9vcHRpb24oICItYyIsICItLWNvbmZpZyIsIGhlbHAgPSAiVXNlIHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiBmaWxlIGFzIHNvdXJjZSIsCisgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9ICJzdG9yZSIsIGRlc3QgPSAiY29uZmlnIiwgZGVmYXVsdCA9IG9zLnBhdGguam9pbigiY29uZiIsICJkb2N1bWVudGF0aW9uLmNvbmYiKSApCisKKyAgICBwYXJzZXIuYWRkX29wdGlvbiggIi1vIiwgIi0tb3V0cHV0IiwgaGVscCA9ICJPdXRwdXQgZGlyZWN0b3J5IGZvciBodG1sIGZpbGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gInN0b3JlIiwgZGVzdCA9ICJvdXRwdXQiLCBkZWZhdWx0ID0gImh0bWwvIiApCisKKyAgICBwYXJzZXIuYWRkX29wdGlvbiggIi1EIiwgICItLWRlYnVnIiwgaGVscCA9ICJJbmNyZWFzZSB0aGUgZGVidWcgbGV2ZWwiLAorICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSAiY291bnQiLCBkZXN0ID0gImRlYnVnIiwgZGVmYXVsdCA9IDAgKQorCisgICAgcGFyc2VyLmFkZF9vcHRpb24oICItdiIsICItLXZlcmJvc2UiLCBoZWxwID0gIm91dHB1dCBtb3JlIGNoaXQtY2hhciB0byB0aGUgdGVybWluYWwiLAorICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSAic3RvcmVfdHJ1ZSIsIGRlc3QgPSAidmVyYm9zZSIsIGRlZmF1bHQgPSBGYWxzZSApCisKKyAgICBvcHRpb25zLCBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoIHN5cy5hcmd2ICkKKyAKKyAgICBiYi5tc2cuaW5pdF9tc2djb25maWcob3B0aW9ucy52ZXJib3NlLCBvcHRpb25zLmRlYnVnKQorCisgICAgcmV0dXJuIG9wdGlvbnMuY29uZmlnLCBvcHRpb25zLm91dHB1dAorCitkZWYgbWFpbigpOgorICAgICIiIgorICAgIFRoZSBtYWluIE1ldGhvZAorICAgICIiIgorCisgICAgKGNvbmZpZ19maWxlLCBvdXRwdXRfZGlyKSA9IHBhcnNlX2NtZGxpbmUoIHN5cy5hcmd2ICkKKworICAgICMgcmlnaHQgdG8gbGV0IHVzIGxvYWQgdGhlIGZpbGUgbm93CisgICAgdHJ5OgorICAgICAgICBkb2N1bWVudGF0aW9uID0gYmIucGFyc2UuaGFuZGxlKCBjb25maWdfZmlsZSwgYmIuZGF0YS5pbml0KCkgKQorICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICBiYi5mYXRhbCggIlVuYWJsZSB0byBvcGVuICVzIiAlIGNvbmZpZ19maWxlICkKKyAgICBleGNlcHQgYmIucGFyc2UuUGFyc2VFcnJvcjoKKyAgICAgICAgYmIuZmF0YWwoICJVbmFibGUgdG8gcGFyc2UgJXMiICUgY29uZmlnX2ZpbGUgKQorCisgICAgaWYgaXNpbnN0YW5jZShkb2N1bWVudGF0aW9uLCBkaWN0KToKKyAgICAgICAgZG9jdW1lbnRhdGlvbiA9IGRvY3VtZW50YXRpb25bIiJdCisKKyAgICAjIEFzc3VtaW5nIHdlJ3ZlIHRoZSBmaWxlIGxvYWRlZCBub3csIHdlIHdpbGwgaW5pdGlhbGl6ZSB0aGUgJ3RyZWUnCisgICAgZG9jID0gRG9jdW1lbnRhdGlvbigpCisKKyAgICAjIGRlZmluZWQgc3RhdGVzCisgICAgc3RhdGVfYmVnaW4gPSAwCisgICAgc3RhdGVfc2VlICAgPSAxCisgICAgc3RhdGVfZ3JvdXAgPSAyCisKKyAgICBmb3Iga2V5IGluIGJiLmRhdGEua2V5cyhkb2N1bWVudGF0aW9uKToKKyAgICAgICAgZGF0YSAgID0gZG9jdW1lbnRhdGlvbi5nZXRWYXJGbGFnKGtleSwgImRvYyIpCisgICAgICAgIGlmIG5vdCBkYXRhOgorICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAjIFRoZSBEb2N1bWVudGF0aW9uIG5vdyBzdGFydHMKKyAgICAgICAgZG9jX2lucyA9IERvY3VtZW50YXRpb25JdGVtKCkKKyAgICAgICAgZG9jX2lucy5zZXROYW1lKGtleSkKKworCisgICAgICAgIHRva2VucyA9IGRhdGEuc3BsaXQoJyAnKQorICAgICAgICBzdGF0ZSA9IHN0YXRlX2JlZ2luCisgICAgICAgIHN0cmluZz0gIiIKKyAgICAgICAgZm9yIHRva2VuIGluIHRva2VuczoKKyAgICAgICAgICAgIHRva2VuID0gdG9rZW4uc3RyaXAoJywnKQorCisgICAgICAgICAgICBpZiBub3Qgc3RhdGUgPT0gc3RhdGVfc2VlIGFuZCB0b2tlbiA9PSAiQHNlZSI6CisgICAgICAgICAgICAgICAgc3RhdGUgPSBzdGF0ZV9zZWUKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxpZiBub3Qgc3RhdGUgPT0gc3RhdGVfZ3JvdXAgYW5kIHRva2VuICA9PSAiQGdyb3VwIjoKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IHN0YXRlX2dyb3VwCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgc3RhdGUgPT0gc3RhdGVfYmVnaW46CisgICAgICAgICAgICAgICAgc3RyaW5nICs9ICIgJXMiICUgdG9rZW4KKyAgICAgICAgICAgIGVsaWYgc3RhdGUgPT0gc3RhdGVfc2VlOgorICAgICAgICAgICAgICAgIGRvY19pbnMuYWRkUmVsYXRpb24odG9rZW4pCisgICAgICAgICAgICBlbGlmIHN0YXRlID09IHN0YXRlX2dyb3VwOgorICAgICAgICAgICAgICAgIGRvY19pbnMuYWRkR3JvdXAodG9rZW4pCisKKyAgICAgICAgIyBzZXQgdGhlIGRlc2NyaXB0aW9uCisgICAgICAgIGRvY19pbnMuc2V0RGVzY3JpcHRpb24oc3RyaW5nKQorICAgICAgICBkb2MuaW5zZXJ0X2RvY19pdGVtKGRvY19pbnMpCisKKyAgICAjIGxldCB1cyBjcmVhdGUgdGhlIEhUTUwgbm93CisgICAgYmIudXRpbHMubWtkaXJoaWVyKG91dHB1dF9kaXIpCisgICAgb3MuY2hkaXIob3V0cHV0X2RpcikKKworICAgICMgTGV0IHVzIGNyZWF0ZSB0aGUgc2l0ZXMgbm93LiBXZSBkbyBpdCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyCisgICAgIyBTdGFydCB3aXRoIHRoZSBpbmRleC5odG1sLiBJdCB3aWxsIHBvaW50IHRvIHNpdGVzIGV4cGxhaW5pbmcgYWxsCisgICAgIyBrZXlzIGFuZCBncm91cHMKKyAgICBodG1sX3NsYXZlID0gSFRNTEZvcm1hdHRlcigpCisKKyAgICBmID0gZmlsZSgnc3R5bGUuY3NzJywgJ3cnKQorICAgIHByaW50ID4+IGYsIGh0bWxfc2xhdmUuY3JlYXRlQ1NTKCkKKworICAgIGYgPSBmaWxlKCdpbmRleC5odG1sJywgJ3cnKQorICAgIHByaW50ID4+IGYsIGh0bWxfc2xhdmUuY3JlYXRlSW5kZXgoKQorCisgICAgZiA9IGZpbGUoJ2FsbF9ncm91cHMuaHRtbCcsICd3JykKKyAgICBwcmludCA+PiBmLCBodG1sX3NsYXZlLmNyZWF0ZUdyb3Vwc1NpdGUoZG9jKQorCisgICAgZiA9IGZpbGUoJ2FsbF9rZXlzLmh0bWwnLCAndycpCisgICAgcHJpbnQgPj4gZiwgaHRtbF9zbGF2ZS5jcmVhdGVLZXlzU2l0ZShkb2MpCisKKyAgICAjIG5vdyBmb3IgZWFjaCBncm91cCBjcmVhdGUgdGhlIHNpdGUKKyAgICBmb3IgZ3JvdXAgaW4gZG9jLmdyb3VwcygpOgorICAgICAgICBmID0gZmlsZSgnZ3JvdXAlcy5odG1sJyAlIGdyb3VwLCAndycpCisgICAgICAgIHByaW50ID4+IGYsIGh0bWxfc2xhdmUuY3JlYXRlR3JvdXBTaXRlKGdyb3VwLCBkb2MuZ3JvdXBfY29udGVudChncm91cCkpCisKKyAgICAjIG5vdyBmb3IgdGhlIGtleXMKKyAgICBmb3Iga2V5IGluIGRvYy5kb2Nfa2V5cygpOgorICAgICAgICBmID0gZmlsZSgna2V5JXMuaHRtbCcgJSBkb2MuZG9jX2l0ZW0oa2V5KS5uYW1lKCksICd3JykKKyAgICAgICAgcHJpbnQgPj4gZiwgaHRtbF9zbGF2ZS5jcmVhdGVLZXlTaXRlKGRvYy5kb2NfaXRlbShrZXkpKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2Jpbi9pbWFnZS13cml0ZXIgYi9iaXRiYWtlL2Jpbi9pbWFnZS13cml0ZXIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2Q3MTE2NwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvYmluL2ltYWdlLXdyaXRlcgpAQCAtMCwwICsxLDEyMiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyMgQ29weXJpZ2h0IChjKSAyMDEyIFdpbmQgUml2ZXIgU3lzdGVtcywgSW5jLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyMgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK3N5cy5wYXRoLmluc2VydCgwLCBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZSggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5hYnNwYXRoKF9fZmlsZV9fKSkpLCAnbGliJykpCit0cnk6CisgICAgaW1wb3J0IGJiCitleGNlcHQgUnVudGltZUVycm9yIGFzIGV4YzoKKyAgICBzeXMuZXhpdChzdHIoZXhjKSkKKworaW1wb3J0IGd0aworaW1wb3J0IG9wdHBhcnNlCitpbXBvcnQgcHlndGsKKworZnJvbSBiYi51aS5jcnVtYnMuaG9id2lkZ2V0IGltcG9ydCBIb2JBbHRCdXR0b24sIEhvYkJ1dHRvbgorZnJvbSBiYi51aS5jcnVtYnMuaGlnLmNydW1ic21lc3NhZ2VkaWFsb2cgaW1wb3J0IENydW1ic01lc3NhZ2VEaWFsb2cKK2Zyb20gYmIudWkuY3J1bWJzLmhpZy5kZXBsb3lpbWFnZWRpYWxvZyBpbXBvcnQgRGVwbG95SW1hZ2VEaWFsb2cKK2Zyb20gYmIudWkuY3J1bWJzLmhpZy5pbWFnZXNlbGVjdGlvbmRpYWxvZyBpbXBvcnQgSW1hZ2VTZWxlY3Rpb25EaWFsb2cKKworIyBJIHB1dCBhbGwgdGhlIGZzIGJpdGJha2Ugc3VwcG9ydGVkIGhlcmUuIE5lZWQgbW9yZSB0ZXN0LgorREVQTE9ZQUJMRV9JTUFHRV9UWVBFUyA9IFsiamZmczIiLCAiY3JhbWZzIiwgImV4dDIiLCAiZXh0MyIsICJleHQ0IiwgImJ0cmZzIiwgInNxdWFzaGZzIiwgInViaSIsICJ2bWRrIl0KK1RpdGxlID0gIlVTQiBJbWFnZSBXcml0ZXIiCisKK2NsYXNzIERlcGxveVdpbmRvdyhndGsuV2luZG93KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaW1hZ2VfcGF0aD0nJyk6CisgICAgICAgIHN1cGVyKERlcGxveVdpbmRvdywgc2VsZikuX19pbml0X18oKQorCisgICAgICAgIGlmIGxlbihpbWFnZV9wYXRoKSA+IDA6CisgICAgICAgICAgICB2YWxpZCA9IFRydWUKKyAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhpbWFnZV9wYXRoKToKKyAgICAgICAgICAgICAgICB2YWxpZCA9IEZhbHNlCisgICAgICAgICAgICAgICAgbGJsID0gIjxiPkludmFsaWQgaW1hZ2UgZmlsZSBwYXRoOiAlcy48L2I+XG5QcmVzcyA8Yj5TZWxlY3QgSW1hZ2U8L2I+IHRvIHNlbGVjdCBhbiBpbWFnZS4iICUgaW1hZ2VfcGF0aAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpbWFnZV9wYXRoID0gb3MucGF0aC5hYnNwYXRoKGltYWdlX3BhdGgpCisgICAgICAgICAgICAgICAgZXh0ZW5kX25hbWUgPSBvcy5wYXRoLnNwbGl0ZXh0KGltYWdlX3BhdGgpWzFdWzE6XQorICAgICAgICAgICAgICAgIGlmIGV4dGVuZF9uYW1lIG5vdCBpbiBERVBMT1lBQkxFX0lNQUdFX1RZUEVTOgorICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgIGxibCA9ICI8Yj5VbmRlcGxveWFibGUgaW1nZSB0eXBlOiAlczwvYj5cblByZXNzIDxiPlNlbGVjdCBJbWFnZTwvYj4gdG8gc2VsZWN0IGFuIGltYWdlLiIgJSBleHRlbmRfbmFtZQorCisgICAgICAgICAgICBpZiBub3QgdmFsaWQ6CisgICAgICAgICAgICAgICAgaW1hZ2VfcGF0aCA9ICcnCisgICAgICAgICAgICAgICAgY3J1bWJzX2RpYWxvZyA9IENydW1ic01lc3NhZ2VEaWFsb2coc2VsZiwgbGJsLCBndGsuU1RPQ0tfRElBTE9HX0lORk8pCisgICAgICAgICAgICAgICAgYnV0dG9uID0gY3J1bWJzX2RpYWxvZy5hZGRfYnV0dG9uKCJDbG9zZSIsIGd0ay5SRVNQT05TRV9PSykKKyAgICAgICAgICAgICAgICBIb2JCdXR0b24uc3R5bGVfYnV0dG9uKGJ1dHRvbikKKyAgICAgICAgICAgICAgICBjcnVtYnNfZGlhbG9nLnJ1bigpCisgICAgICAgICAgICAgICAgY3J1bWJzX2RpYWxvZy5kZXN0cm95KCkKKworICAgICAgICBzZWxmLmRlcGxveV9kaWFsb2cgPSBEZXBsb3lJbWFnZURpYWxvZyhUaXRsZSwgaW1hZ2VfcGF0aCwgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGsuRElBTE9HX01PREFMIHwgZ3RrLkRJQUxPR19ERVNUUk9ZX1dJVEhfUEFSRU5UCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBndGsuRElBTE9HX05PX1NFUEFSQVRPUiwgTm9uZSwgc3RhbmRhbG9uZT1UcnVlKQorICAgICAgICBjbG9zZV9idXR0b24gPSBzZWxmLmRlcGxveV9kaWFsb2cuYWRkX2J1dHRvbigiQ2xvc2UiLCBndGsuUkVTUE9OU0VfTk8pCisgICAgICAgIEhvYkFsdEJ1dHRvbi5zdHlsZV9idXR0b24oY2xvc2VfYnV0dG9uKQorICAgICAgICBjbG9zZV9idXR0b24uY29ubmVjdCgnY2xpY2tlZCcsIGd0ay5tYWluX3F1aXQpCisKKyAgICAgICAgd3JpdGVfYnV0dG9uID0gc2VsZi5kZXBsb3lfZGlhbG9nLmFkZF9idXR0b24oIldyaXRlIFVTQiBpbWFnZSIsIGd0ay5SRVNQT05TRV9ZRVMpCisgICAgICAgIEhvYkFsdEJ1dHRvbi5zdHlsZV9idXR0b24od3JpdGVfYnV0dG9uKQorCisgICAgICAgIHNlbGYuZGVwbG95X2RpYWxvZy5jb25uZWN0KCdzZWxlY3RfaW1hZ2VfY2xpY2tlZCcsIHNlbGYuc2VsZWN0X2ltYWdlX2NsaWNrZWRfY2IpCisgICAgICAgIHNlbGYuZGVwbG95X2RpYWxvZy5jb25uZWN0KCdkZXN0cm95JywgZ3RrLm1haW5fcXVpdCkKKyAgICAgICAgcmVzcG9uc2UgPSBzZWxmLmRlcGxveV9kaWFsb2cuc2hvdygpCisKKyAgICBkZWYgc2VsZWN0X2ltYWdlX2NsaWNrZWRfY2Ioc2VsZiwgZGlhbG9nKToKKyAgICAgICAgY3dkID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgZGlhbG9nID0gSW1hZ2VTZWxlY3Rpb25EaWFsb2coY3dkLCBERVBMT1lBQkxFX0lNQUdFX1RZUEVTLCBUaXRsZSwgc2VsZiwgZ3RrLkZJTEVfQ0hPT1NFUl9BQ1RJT05fU0FWRSApCisgICAgICAgIGJ1dHRvbiA9IGRpYWxvZy5hZGRfYnV0dG9uKCJDYW5jZWwiLCBndGsuUkVTUE9OU0VfTk8pCisgICAgICAgIEhvYkFsdEJ1dHRvbi5zdHlsZV9idXR0b24oYnV0dG9uKQorICAgICAgICBidXR0b24gPSBkaWFsb2cuYWRkX2J1dHRvbigiT3BlbiIsIGd0ay5SRVNQT05TRV9ZRVMpCisgICAgICAgIEhvYkFsdEJ1dHRvbi5zdHlsZV9idXR0b24oYnV0dG9uKQorICAgICAgICByZXNwb25zZSA9IGRpYWxvZy5ydW4oKQorCisgICAgICAgIGlmIHJlc3BvbnNlID09IGd0ay5SRVNQT05TRV9ZRVM6CisgICAgICAgICAgICBpZiBub3QgZGlhbG9nLmltYWdlX25hbWVzOgorICAgICAgICAgICAgICAgIGxibCA9ICI8Yj5ObyBzZWxlY3Rpb25zIG1hZGU8L2I+XG5DbGlja2VkIHRoZSByYWRpbyBidXR0b24gdG8gc2VsZWN0IGEgaW1hZ2UuIgorICAgICAgICAgICAgICAgIGNydW1ic19kaWFsb2cgPSBDcnVtYnNNZXNzYWdlRGlhbG9nKHNlbGYsIGxibCwgZ3RrLlNUT0NLX0RJQUxPR19JTkZPKQorICAgICAgICAgICAgICAgIGJ1dHRvbiA9IGNydW1ic19kaWFsb2cuYWRkX2J1dHRvbigiQ2xvc2UiLCBndGsuUkVTUE9OU0VfT0spCisgICAgICAgICAgICAgICAgSG9iQnV0dG9uLnN0eWxlX2J1dHRvbihidXR0b24pCisgICAgICAgICAgICAgICAgY3J1bWJzX2RpYWxvZy5ydW4oKQorICAgICAgICAgICAgICAgIGNydW1ic19kaWFsb2cuZGVzdHJveSgpCisgICAgICAgICAgICAgICAgZGlhbG9nLmRlc3Ryb3koKQorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICAgICAjIGdldCB0aGUgZnVsbCBwYXRoIG9mIGltYWdlCisgICAgICAgICAgICBpbWFnZV9wYXRoID0gb3MucGF0aC5qb2luKGRpYWxvZy5pbWFnZV9mb2xkZXIsIGRpYWxvZy5pbWFnZV9uYW1lc1swXSkKKyAgICAgICAgICAgIHNlbGYuZGVwbG95X2RpYWxvZy5zZXRfaW1hZ2VfdGV4dF9idWZmZXIoaW1hZ2VfcGF0aCkKKyAgICAgICAgICAgIHNlbGYuZGVwbG95X2RpYWxvZy5zZXRfaW1hZ2VfcGF0aChpbWFnZV9wYXRoKQorCisgICAgICAgIGRpYWxvZy5kZXN0cm95KCkKKworZGVmIG1haW4oKToKKyAgICBwYXJzZXIgPSBvcHRwYXJzZS5PcHRpb25QYXJzZXIoCisgICAgICAgICAgICAgICAgdXNhZ2UgPSAiIiIlcHJvZyBbLWhdIFtpbWFnZV9maWxlXQorCislcHJvZyB3cml0ZXMgYm9vdGFibGUgaW1hZ2VzIHRvIFVTQiBkZXZpY2VzLiBZb3UgY2FuCitwcm92aWRlIHRoZSBpbWFnZSBmaWxlIG9uIHRoZSBjb21tYW5kIGxpbmUgb3Igc2VsZWN0IGl0IHVzaW5nIHRoZSBHVUkuIiIiKQorCisgICAgb3B0aW9ucywgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKHN5cy5hcmd2KQorICAgIGltYWdlX2ZpbGUgPSBhcmdzWzFdIGlmIGxlbihhcmdzKSA+IDEgZWxzZSAnJworICAgIGR3ID0gRGVwbG95V2luZG93KGltYWdlX2ZpbGUpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdHJ5OgorICAgICAgICBtYWluKCkKKyAgICAgICAgZ3RrLm1haW4oKQorICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgIGltcG9ydCB0cmFjZWJhY2sKKyAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygzKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9iaW4vdG9hc3RlciBiL2JpdGJha2UvYmluL3RvYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDExY2UyYwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvYmluL3RvYXN0ZXIKQEAgLTAsMCArMSwzNTIgQEAKKyMhL2Jpbi9zaAorIyAoYykgMjAxMyBJbnRlbCBDb3JwLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworCisjIFRoaXMgc2NyaXB0IGNhbiBiZSBydW4gaW4gdHdvIG1vZGVzLgorCisjIFdoZW4gdXNlZCB3aXRoICJzb3VyY2UiLCBmcm9tIGEgYnVpbGQgZGlyZWN0b3J5LAorIyBpdCBlbmFibGVzIHRvYXN0ZXIgZXZlbnQgbG9nZ2luZyBhbmQgc3RhcnRzIHRoZSBiaXRiYWtlIHJlc2lkZW50IHNlcnZlci4KKyMgdXNlIGFzOiAgc291cmNlIHRvYXN0ZXIgW3N0YXJ0fHN0b3BdIFtub3dlYl0gW25vdWldCisKKyMgV2hlbiBpdCBpcyBjYWxsZWQgYXMgYSBzdGFuZC1hbG9uZSBzY3JpcHQsIGl0IHN0YXJ0cyBqdXN0IHRoZQorIyB3ZWIgc2VydmVyLCBhbmQgdGhlIGJ1aWxkaW5nIHNoYWxsIGJlIGRvbmUgdGhyb3VnaCB0aGUgd2ViIGludGVyZmFjZS4KKyMgQXMgc2NyaXB0LCBpdCB3aWxsIG5vdCByZXR1cm4gdG8gdGhlIGNvbW1hbmQgcHJvbXB0LiBTdG9wIHdpdGggQ3RybC1DLgorCisjIEhlbHBlciBmdW5jdGlvbiB0byBraWxsIGEgYmFja2dyb3VuZCB0b2FzdGVyIGRldmVsb3BtZW50IHNlcnZlcgorCit3ZWJzZXJ2ZXJLaWxsQWxsKCkKK3sKKyAgICBsb2NhbCBwaWRmaWxlCisgICAgZm9yIHBpZGZpbGUgaW4gJHtCVUlMRERJUn0vLnRvYXN0ZXJtYWluLnBpZDsgZG8KKyAgICAgICAgaWYgWyAtZiAke3BpZGZpbGV9IF07IHRoZW4KKyAgICAgICAgICAgIHBpZD1gY2F0ICR7cGlkZmlsZX1gCisgICAgICAgICAgICB3aGlsZSBraWxsIC0wICRwaWQgMj4vZGV2L251bGw7IGRvCisgICAgICAgICAgICAgICAga2lsbCAtU0lHVEVSTSAtJHBpZCAyPi9kZXYvbnVsbAorICAgICAgICAgICAgICAgIHNsZWVwIDEKKyAgICAgICAgICAgICAgICAjIEtpbGwgcHJvY2Vzc2VzIGlmIHRoZXkgYXJlIHN0aWxsIHJ1bm5pbmcgLSBtYXkgaGFwcGVuIGluIGludGVyYWN0aXZlIHNoZWxscworICAgICAgICAgICAgICAgIHBzIGZ1eCB8IGdyZXAgInB5dGhvbi4qbWFuYWdlLnB5IHJ1bnNlcnZlciIgfCBhd2sgJ3twcmludCAkMn0nIHwgeGFyZ3Mga2lsbAorICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgcm0gICR7cGlkZmlsZX0KKyAgICAgICAgZmkKKyAgICBkb25lCit9CisKK3dlYnNlcnZlclN0YXJ0QWxsKCkKK3sKKyAgICAjIGRvIG5vdCBzdGFydCBpZiB0b2FzdGVybWFpbiBwb2ludHMgdG8gYSB2YWxpZCBwcm9jZXNzCisgICAgaWYgISBjYXQgIiR7QlVJTERESVJ9Ly50b2FzdGVybWFpbi5waWQiIDI+L2Rldi9udWxsIHwgeGFyZ3MgLUl7fSBraWxsIC0wIHt9IDsgdGhlbgorICAgICAgICByZXR2YWw9MQorICAgICAgICBybSAiJHtCVUlMRERJUn0vLnRvYXN0ZXJtYWluLnBpZCIKKyAgICBmaQorCisgICAgcmV0dmFsPTAKKyAgICBpZiBbICIkVE9BU1RFUl9NQU5BR0VEIiAnPScgJzEnIF07IHRoZW4KKyAgICAgICAgcHl0aG9uICRCQkJBU0VESVIvbGliL3RvYXN0ZXIvbWFuYWdlLnB5IHN5bmNkYiB8fCByZXR2YWw9MQorICAgIGVsc2UKKyAgICAgICAgcHl0aG9uICRCQkJBU0VESVIvbGliL3RvYXN0ZXIvbWFuYWdlLnB5IHN5bmNkYiAtLW5vaW5wdXQgfHwgcmV0dmFsPTEKKyAgICBmaQorICAgIHB5dGhvbiAkQkJCQVNFRElSL2xpYi90b2FzdGVyL21hbmFnZS5weSBtaWdyYXRlIG9ybSB8fCByZXR2YWw9MgorICAgIGlmIFsgJHJldHZhbCAtZXEgMSBdOyB0aGVuCisgICAgICAgIGVjaG8gIkZhaWxlZCBkYiBzeW5jLCBzdG9wcGluZyBzeXN0ZW0gc3RhcnQiIDE+JjIKKyAgICBlbGlmIFsgJHJldHZhbCAtZXEgMiBdOyB0aGVuCisgICAgICAgIHByaW50ZiAiXG5FcnJvciBvbiBtaWdyYXRpb24sIHRyeWluZyB0byByZWNvdmVyLi4uIFxuIgorICAgICAgICBweXRob24gJEJCQkFTRURJUi9saWIvdG9hc3Rlci9tYW5hZ2UucHkgbWlncmF0ZSBvcm0gMDAwMV9pbml0aWFsIC0tZmFrZQorICAgICAgICByZXR2YWw9MAorICAgICAgICBweXRob24gJEJCQkFTRURJUi9saWIvdG9hc3Rlci9tYW5hZ2UucHkgbWlncmF0ZSBvcm0gfHwgcmV0dmFsPTEKKyAgICBmaQorICAgIGlmIFsgIiRUT0FTVEVSX01BTkFHRUQiID0gJzEnIF07IHRoZW4KKyAgICAgICAgcHl0aG9uICRCQkJBU0VESVIvbGliL3RvYXN0ZXIvbWFuYWdlLnB5IG1pZ3JhdGUgYmxkY29udHJvbCB8fCByZXR2YWw9MQorICAgICAgICBweXRob24gJEJCQkFTRURJUi9saWIvdG9hc3Rlci9tYW5hZ2UucHkgY2hlY2tzZXR0aW5ncyAgLS10cmFjZWJhY2sgfHwgcmV0dmFsPTEKKyAgICBmaQorICAgIGlmIFsgJHJldHZhbCAtZXEgMCBdOyB0aGVuCisgICAgICAgIGVjaG8gIlN0YXJ0aW5nIHdlYnNlcnZlci4uLiIKKyAgICAgICAgcHl0aG9uICRCQkJBU0VESVIvbGliL3RvYXN0ZXIvbWFuYWdlLnB5IHJ1bnNlcnZlciAiMC4wLjAuMDokV0VCX1BPUlQiIDwvZGV2L251bGwgPj4ke0JVSUxERElSfS90b2FzdGVyX3dlYi5sb2cgMj4mMSAmIGVjaG8gJCEgPiR7QlVJTERESVJ9Ly50b2FzdGVybWFpbi5waWQKKyAgICAgICAgc2xlZXAgMQorICAgICAgICBpZiAhIGNhdCAiJHtCVUlMRERJUn0vLnRvYXN0ZXJtYWluLnBpZCIgfCB4YXJncyAtSXt9IGtpbGwgLTAge30gOyB0aGVuCisgICAgICAgICAgICByZXR2YWw9MQorICAgICAgICAgICAgcm0gIiR7QlVJTERESVJ9Ly50b2FzdGVybWFpbi5waWQiCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIldlYnNlcnZlciBhZGRyZXNzOiAgaHR0cDovLzAuMC4wLjA6JFdFQl9QT1JULyIKKyAgICAgICAgZmkKKyAgICBmaQorICAgIHJldHVybiAkcmV0dmFsCit9CisKKyMgSGVscGVyIGZ1bmN0aW9ucyB0byBhZGQgYSBzcGVjaWFsIGNvbmZpZ3VyYXRpb24gZmlsZQorCithZGR0b0NvbmZpZ3VyYXRpb24oKQoreworICAgIGZpbGU9JDEKKyAgICBzaGlmdAorICAgIGVjaG8gIiNDcmVhdGVkIGJ5IHRvYXN0ZXIgc3RhcnQgc2NyaXB0IiA+ICR7QlVJTERESVJ9L2NvbmYvJGZpbGUKKyAgICBmb3IgdmFyIGluICIkQCI7IGRvIGVjaG8gJHZhciA+PiAke0JVSUxERElSfS9jb25mLyRmaWxlOyBkb25lCit9CisKK0lOU1RPUFNZU1RFTT0wCisKKyMgZGVmaW5lIHRoZSBzdG9wIGNvbW1hbmQKK3N0b3Bfc3lzdGVtKCkKK3sKKyAgICAjIHByZXZlbnQgcmVlbnRyeQorICAgIGlmIFsgJElOU1RPUFNZU1RFTSAtZXEgMSBdOyB0aGVuIHJldHVybjsgZmkKKyAgICBJTlNUT1BTWVNURU09MQorICAgIGlmIFsgLWYgJHtCVUlMRERJUn0vLnRvYXN0ZXJ1aS5waWQgXTsgdGhlbgorICAgICAgICBraWxsIGBjYXQgJHtCVUlMRERJUn0vLnRvYXN0ZXJ1aS5waWRgIDI+L2Rldi9udWxsCisgICAgICAgIHJtICR7QlVJTERESVJ9Ly50b2FzdGVydWkucGlkCisgICAgZmkKKyAgICBCQlNFUlZFUj0wLjAuMC4wOi0xIGJpdGJha2UgLW0KKyAgICB1bnNldCBCQlNFUlZFUgorICAgIHdlYnNlcnZlcktpbGxBbGwKKyAgICAjIGZvcmNlIHN0b3AgYW55IG1pc2JlaGF2aW5nIGJpdGJha2Ugc2VydmVyCisgICAgbHNvZiBiaXRiYWtlLmxvY2sgfCBhd2sgJ3twcmludCAkMn0nIHwgZ3JlcCAiWzAtOV1cKyIgfCB4YXJncyAtbjEgLXIga2lsbAorICAgIHRyYXAgLSBTSUdIVVAKKyAgICAjdHJhcCAtIFNJR0NITEQKKyAgICBJTlNUT1BTWVNURU09MAorfQorCitjaGVja19waWRieWZpbGUoKSB7CisgICAgWyAtZSAkMSBdICYmIGtpbGwgLTAgYGNhdCAkMWAgMj4vZGV2L251bGwKK30KKworCitub3RpZnlfY2hsZGV4aXQoKSB7CisgICAgaWYgWyAkTk9UT0FTVEVSVUkgLWVxIDAgXTsgdGhlbgorICAgICAgICBjaGVja19waWRieWZpbGUgJHtCVUlMRERJUn0vLnRvYXN0ZXJ1aS5waWQgJiYgcmV0dXJuCisgICAgICAgIHN0b3Bfc3lzdGVtCisgICAgZmkKK30KKworCit2ZXJpZnlfcHJlcmVxKCkgeworICAgICMgVmVyaWZ5IHByZXJlcXVpc2l0ZXMKKworICAgIGlmICEgZWNobyAiaW1wb3J0IGRqYW5nbzsgcHJpbnQgKDEsKSA9PSBkamFuZ28uVkVSU0lPTlswOjFdIGFuZCBkamFuZ28uVkVSU0lPTlsxOjJdWzBdIGluICg2LCkiIHwgcHl0aG9uIDI+L2Rldi9udWxsIHwgZ3JlcCBUcnVlID4vZGV2L251bGw7IHRoZW4KKyAgICAgICAgcHJpbnRmICJUaGlzIHByb2dyYW0gbmVlZHMgRGphbmdvIDEuNi4gUGxlYXNlIGluc3RhbGwgd2l0aFxuXG5waXAgaW5zdGFsbCBkamFuZ289PTEuNlxuIgorICAgICAgICByZXR1cm4gMgorICAgIGZpCisKKyAgICBpZiAhIGVjaG8gImltcG9ydCBzb3V0aDsgcHJpbnQgcmVkdWNlKGxhbWJkYSB4LCB5OiAyIGlmIHg9PTIgZWxzZSAwIGlmIHggPT0gMCBlbHNlIHksIG1hcChsYW1iZGEgeDogMStjbXAoeFsxXS14WzBdLDApLCB6aXAoWzAsOCw0XSwgbWFwKGludCxzb3V0aC5fX3ZlcnNpb25fXy5zcGxpdChcIi5cIikpKSkpID4gMCIgfCBweXRob24gMj4vZGV2L251bGwgfCBncmVwIFRydWUgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICBwcmludGYgIlRoaXMgcHJvZ3JhbSBuZWVkcyBTb3V0aCAwLjguNC4gUGxlYXNlIGluc3RhbGwgd2l0aFxuXG5waXAgaW5zdGFsbCBzb3V0aD09MC44LjRcbiIKKyAgICAgICAgcmV0dXJuIDIKKyAgICBmaQorICAgIHJldHVybiAwCit9CisKKworIyByZWFkIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzCitpZiBbIC1uICIkQkFTSF9TT1VSQ0UiIF0gOyB0aGVuCisgICAgVE9BU1RFUj0ke0JBU0hfU09VUkNFfQorZWxpZiBbIC1uICIkWlNIX05BTUUiIF0gOyB0aGVuCisgICAgVE9BU1RFUj0keyglKTotJXh9CitlbHNlCisgICAgVE9BU1RFUj0kMAorZmkKKworQkJCQVNFRElSPWBkaXJuYW1lICRUT0FTVEVSYC8uLgorCitSVU5OSU5HPTAKKworTk9UT0FTVEVSVUk9MAorV0VCU0VSVkVSPTEKK1RPQVNURVJfQlJCRT0iIgorV0VCX1BPUlQ9IjgwMDAiCitOT0JST1dTRVI9MAorCitmb3IgcGFyYW0gaW4gJCo7IGRvCisgICAgY2FzZSAkcGFyYW0gaW4KKyAgICBub3VpICkKKyAgICAgICAgICAgIE5PVE9BU1RFUlVJPTEKKyAgICA7OworICAgIG5vd2ViICkKKyAgICAgICAgICAgIFdFQlNFUlZFUj0wCisgICAgOzsKKyAgICBub2Jyb3dzZXIgKQorICAgICAgICAgICAgTk9CUk9XU0VSPTEKKyAgICA7OworICAgIGJyYmU9KiApCisgICAgICAgICAgICBUT0FTVEVSX0JSQkU9JCdcbiciVE9BU1RFUl9CUkJFPVwiIiR7cGFyYW0jKj19IlwiIgorICAgIDs7CisgICAgd2VicG9ydD0qKQorICAgICAgICAgICAgV0VCX1BPUlQ9IiR7cGFyYW0jKj19IgorICAgIGVzYWMKK2RvbmUKKworWyAtbiAiJHtCQVNIX1NPVVJDRX0iIF0gJiYgU1JDRklMRT0ke0JBU0hfU09VUkNFfSB8fCBTUkNGSUxFPSRfCisKK2lmIFsgYGJhc2VuYW1lIFwiJDBcImAgPSBgYmFzZW5hbWUgXCIke1NSQ0ZJTEV9XCJgIF07IHRoZW4KKyAgICAjIFdlIGFyZSBjYWxsZWQgYXMgc3RhbmRhbG9uZS4gV2UgcmVmdXNlIHRvIHJ1biBpbiBhIGJ1aWxkIGVudmlyb25tZW50IC0gd2UgbmVlZCB0aGUgaW50ZXJhY3RpdmUgbW9kZSBmb3IgdGhhdC4KKyAgICAjIFN0YXJ0IGp1c3QgdGhlIHdlYiBzZXJ2ZXIsIHBvaW50IHRoZSB3ZWIgYnJvd3NlciB0byB0aGUgaW50ZXJmYWNlLCBhbmQgc3RhcnQgYW55IERqYW5nbyBzZXJ2aWNlcy4KKworICAgIGlmICEgdmVyaWZ5X3ByZXJlcTsgdGhlbgorICAgICAgICBlY2hvICJFcnJvcjogQ291bGQgbm90IHZlcmlmeSB0aGF0IHRoZSBuZWVkZWQgZGVwZW5kZW5jaWVzIGFyZSBpbnN0YWxsZWQuIFBsZWFzZSB1c2UgdmlydHVhbGVudiBhbmQgcGlwIHRvIGluc3RhbGwgZGVwZW5kZW5jaWVzIGxpc3RlZCBpbiB0b2FzdGVyLXJlcXVpcmVtZW50cy50eHQiIDE+JjIKKyAgICAgICAgZXhpdCAxCisgICAgZmkKKworICAgIGlmIFsgLW4gIiRCVUlMRERJUiIgXTsgdGhlbgorICAgICAgICBwcmludGYgIkVycm9yOiBJdCBsb29rcyBsaWtlIHlvdSBzb3VyY2VkIG9lLWluaXQtYnVpbGQtZW52LiBUb2FzdGVyIGNhbm5vdCBzdGFydCBpbiBidWlsZCBtb2RlIGZyb20gYW4gb2UtY29yZSBidWlsZCBlbnZpcm9ubWVudC5cbiBZb3Ugc2hvdWxkIGJlIHN0YXJ0aW5nIFRvYXN0ZXIgZnJvbSBhIG5ldyB0ZXJtaW5hbCB3aW5kb3cuIiAxPiYyCisgICAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICAjIERlZmluZSBhIGZha2UgYnVpbGRkaXIgd2hlcmUgb25seSB0aGUgcGlkIGZpbGVzIGFyZSBhY3R1YWxseSBjcmVhdGVkLiBObyByZWFsIGJ1aWxkcyB3aWxsIHRha2UgcGxhY2UgaGVyZS4KKyAgICBCVUlMRERJUj0vdG1wL3RvYXN0ZXJfJCQKKyAgICBpZiBbIC1kICIkQlVJTERESVIiIF07IHRoZW4KKyAgICAgICAgZWNobyAiUHJldmlvdXMgdG9hc3RlciBydW4gZGlyZWN0b3J5ICRCVUlMRERJUiBmb3VuZCwgY293YXJkbHkgcmVmdXNpbmcgdG8gc3RhcnQuIFBsZWFzZSByZW1vdmUgdGhlIGRpcmVjdG9yeSB3aGVuIHRoYXQgdG9hc3RlciBpbnN0YW5jZSBpcyBvdmVyIiAyPiYxCisgICAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBta2RpciAtcCAiJEJVSUxERElSIgorCisgICAgUlVOTklORz0xCisgICAgdHJhcF9jdHJsYygpIHsKKyAgICAgICAgZWNobyAiKiogU3RvcHBpbmcgc3lzdGVtIgorICAgICAgICB3ZWJzZXJ2ZXJLaWxsQWxsCisgICAgICAgIFJVTk5JTkc9MAorICAgIH0KKworICAgIGRvX2NsZWFudXAoKSB7CisgICAgICAgIGZpbmQgIiRCVUlMRERJUiIgLXR5cGUgZiB8IHhhcmdzIHJtCisgICAgICAgIHJtZGlyICIkQlVJTERESVIiCisgICAgfQorICAgIGNsZWFudXAoKSB7CisgICAgICAgIGlmIGdyZXAgLWlyIGVycm9yICIkQlVJTERESVIiID4vZGV2L251bGw7IHRoZW4KKyAgICAgICAgICAgIGlmIGdyZXAgLWlybiAiVGhhdCBwb3J0IGlzIGFscmVhZHkgaW4gdXNlIiAiJEJVSUxERElSIjsgdGhlbgorICAgICAgICAgICAgICAgIGVjaG8gIllvdSBjYW4gdXNlIHRoZSBcIndlYnBvcnQ9UE9SVE5VTUJFUlwiIHBhcmFtZXRlciB0byBzdGFydCBUb2FzdGVyIG9uIGEgZGlmZmVyZW50IHBvcnQgKHBvcnQgJFdFQl9QT1JUIGlzIGFscmVhZHkgaW4gdXNlKSIKKyAgICAgICAgICAgICAgICBkb19jbGVhbnVwCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHJpbnRmICJcbkVycm9ycyBmb3VuZCBpbiB0aGUgVG9hc3RlciBsb2cgZmlsZXMgcHJlc2VudCBpbiAnJEJVSUxERElSJy4gRGlyZWN0b3J5IHdpbGwgbm90IGJlIGNsZWFuZWQuXG4gUGxlYXNlIHJldmlldyB0aGUgZXJyb3JzIGFuZCBub3RpZnkgdG9hc3RlckB5b2N0b3Byb2plY3Qub3JnIG9yIHN1Ym1pdCBhIGJ1ZyBodHRwczovL2J1Z3ppbGxhLnlvY3RvcHJvamVjdC5vcmcvZW50ZXJfYnVnLmNnaT9wcm9kdWN0PVRvYXN0ZXIiCisgICAgICAgICAgICBmaQorICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJObyBlcnJvcnMgZm91bmQsIHJlbW92aW5nIHRoZSBydW4gZGlyZWN0b3J5ICckQlVJTERESVInIgorICAgICAgICAgICAgZG9fY2xlYW51cAorICAgICAgICBmaQorICAgIH0KKyAgICBUT0FTVEVSX01BTkFHRUQ9MQorICAgIGV4cG9ydCBUT0FTVEVSX01BTkFHRUQ9MQorICAgIGlmIFsgJFdFQlNFUlZFUiAtZ3QgMCBdICYmICEgd2Vic2VydmVyU3RhcnRBbGw7IHRoZW4KKyAgICAgICAgZWNobyAiRmFpbGVkIHRvIHN0YXJ0IHRoZSB3ZWIgc2VydmVyLCBzdG9wcGluZyIgMT4mMgorICAgICAgICBjbGVhbnVwCisgICAgICAgIGV4aXQgMQorICAgIGZpCisgICAgaWYgWyAkV0VCU0VSVkVSIC1ndCAwIF0gJiYgWyAkTk9CUk9XU0VSIC1lcSAwIF0gIDsgdGhlbgorICAgICAgICBlY2hvICJTdGFydGluZyBicm93c2VyLi4uIgorICAgICAgICB4ZGctb3BlbiBodHRwOi8vMTI3LjAuMC4xOiRXRUJfUE9SVC8gPi9kZXYvbnVsbCAyPiYxICYKKyAgICBmaQorICAgIHRyYXAgdHJhcF9jdHJsYyAyCisgICAgZWNobyAiVG9hc3RlciBpcyBub3cgcnVubmluZy4gWW91IGNhbiBzdG9wIGl0IHdpdGggQ3RybC1DIgorICAgIHdoaWxlIFsgJFJVTk5JTkcgLWd0IDAgXTsgZG8KKyAgICAgICAgcHl0aG9uICRCQkJBU0VESVIvbGliL3RvYXN0ZXIvbWFuYWdlLnB5IHJ1bmJ1aWxkcyAyPiYxIHwgdGVlIC1hICIkQlVJTERESVIvdG9hc3Rlci5sb2ciCisgICAgICAgIHNsZWVwIDEKKyAgICBkb25lCisgICAgY2xlYW51cAorICAgIGVjaG8gIioqKiogRXhpdCIKKyAgICBleGl0IDAKK2ZpCisKKworaWYgISB2ZXJpZnlfcHJlcmVxOyB0aGVuCisgICAgZWNobyAiRXJyb3I6IENvdWxkIG5vdCB2ZXJpZnkgdGhhdCB0aGUgbmVlZGVkIGRlcGVuZGVuY2llcyBhcmUgaW5zdGFsbGVkLiBQbGVhc2UgdXNlIHZpcnR1YWxlbnYgYW5kIHBpcCB0byBpbnN0YWxsIGRlcGVuZGVuY2llcyBsaXN0ZWQgaW4gdG9hc3Rlci1yZXF1aXJlbWVudHMudHh0IiAxPiYyCisgICAgcmV0dXJuIDEKK2ZpCisKKworIyBXZSBtYWtlIHN1cmUgd2UncmUgcnVubmluZyBpbiB0aGUgY3VycmVudCBzaGVsbCBhbmQgaW4gYSBnb29kIGVudmlyb25tZW50CitpZiBbIC16ICIkQlVJTERESVIiIF0gfHwgICEgd2hpY2ggYml0YmFrZSA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCisgICAgZWNobyAiRXJyb3I6IEJ1aWxkIGVudmlyb25tZW50IGlzIG5vdCBzZXR1cCBvciBiaXRiYWtlIGlzIG5vdCBpbiBwYXRoLiIgMT4mMgorICAgIHJldHVybiAyCitmaQorCisKKyMgRGV0ZXJtaW5lIHRoZSBhY3Rpb24uIElmIHNwZWNpZmllZCBieSBhcmd1bWVudHMsIGZpbmUsIGlmIG5vdCwgdG9nZ2xlIGl0CitpZiBbICIkMSIgPSAnc3RhcnQnIF0gfHwgWyAiJDEiID0gJ3N0b3AnIF07IHRoZW4KKyAgICBDTUQ9IiQxIgorZWxzZQorICAgIGlmIFsgLXogIiRCQlNFUlZFUiIgXTsgdGhlbgorICAgICAgICBDTUQ9InN0YXJ0IgorICAgIGVsc2UKKyAgICAgICAgQ01EPSJzdG9wIgorICAgIGZpCitmaQorCitlY2hvICJUaGUgc3lzdGVtIHdpbGwgJENNRC4iCisKKyMgTWFrZSBzdXJlIGl0J3Mgc2FmZSB0byBydW4gYnkgY2hlY2tpbmcgYml0YmFrZSBsb2NrCisKK2xvY2s9MQoraWYgWyAtZSAkQlVJTERESVIvYml0YmFrZS5sb2NrIF07IHRoZW4KKyAgICBweXRob24gLWMgImltcG9ydCBmY250bDsgZmNudGwuZmxvY2sob3BlbihcIiRCVUlMRERJUi9iaXRiYWtlLmxvY2tcIiksIGZjbnRsLkxPQ0tfRVh8ZmNudGwuTE9DS19OQikiIDI+L2Rldi9udWxsIHx8IGxvY2s9MAorZmkKKworaWYgWyAke0NNRH0gPSAnc3RhcnQnIF0gJiYgWyAkbG9jayAtZXEgMCBdOyB0aGVuCisgICAgZWNobyAiRXJyb3I6IGJpdGJha2UgbG9jayBzdGF0ZSBlcnJvci4gRmlsZSBsb2NrcyBzaG93IHRoYXQgdGhlIHN5c3RlbSBpcyBvbi4iIDE+JjIKKyAgICBlY2hvICJQbGVhc2Ugd2FpdCBmb3IgdGhlIGN1cnJlbnQgYnVpbGQgdG8gZmluaXNoLCBzdG9wIGFuZCB0aGVuIHN0YXJ0IHRoZSBzeXN0ZW0gYWdhaW4uIiAxPiYyCisgICAgcmV0dXJuIDMKK2ZpCisKK2lmIFsgJHtDTUR9ID0gJ3N0YXJ0JyBdICYmIFsgLWUgJEJVSUxERElSLy50b2FzdGVybWFpbi5waWQgXSAmJiBraWxsIC0wIGBjYXQgJEJVSUxERElSLy50b2FzdGVybWFpbi5waWRgOyB0aGVuCisgICAgZWNobyAiV2FybmluZzogYml0YmFrZSBhcHBlYXJzIHRvIGJlIGRlYWQsIGJ1dCB0aGUgVG9hc3RlciB3ZWIgc2VydmVyIGlzIHJ1bm5pbmcuIFNvbWV0aGluZyBmaXNoeSBpcyBnb2luZyBvbi4iIDE+JjIKKyAgICBlY2hvICJDbGVhbmluZyB1cCB0aGUgd2ViIHNlcnZlciB0byBzdGFydCBmcm9tIGEgY2xlYW4gc2xhdGUuIgorICAgIHdlYnNlcnZlcktpbGxBbGwKK2ZpCisKKworIyBFeGVjdXRlIHRoZSBjb21tYW5kcworCitjYXNlICRDTUQgaW4KKyAgICBzdGFydCApCisgICAgICAgIHN0YXJ0X3N1Y2Nlc3M9MQorICAgICAgICBhZGR0b0NvbmZpZ3VyYXRpb24gdG9hc3Rlci5jb25mICJJTkhFUklUKz1cInRvYXN0ZXIgYnVpbGRoaXN0b3J5XCIiICRUT0FTVEVSX0JSQkUKKyAgICAgICAgaWYgWyAkV0VCU0VSVkVSIC1ndCAwIF0gJiYgISB3ZWJzZXJ2ZXJTdGFydEFsbDsgdGhlbgorICAgICAgICAgICAgZWNobyAiRmFpbGVkICR7Q01EfS4iCisgICAgICAgICAgICByZXR1cm4gNAorICAgICAgICBmaQorICAgICAgICB1bnNldCBCQlNFUlZFUgorICAgICAgICBQUkVSRUFEPSIiCisgICAgICAgIGlmIFsgLWUgJHtCVUlMRERJUn0vY29uZi90b2FzdGVyLXByZS5jb25mIF07IHRoZW4KKyAgICAgICAgICAgIHJtICR7QlVJTERESVJ9L2NvbmYvdG9hc3Rlci1wcmUuY29uZgorICAgICAgICBmaQorICAgICAgICBiaXRiYWtlICRQUkVSRUFEIC0tcG9zdHJlYWQgY29uZi90b2FzdGVyLmNvbmYgLS1zZXJ2ZXItb25seSAtdCB4bWxycGMgLUIgMC4wLjAuMDowCisgICAgICAgIGlmIFsgJD8gLW5lIDAgXTsgdGhlbgorICAgICAgICAgICAgc3RhcnRfc3VjY2Vzcz0wCisgICAgICAgICAgICBlY2hvICJCaXRiYWtlIHNlcnZlciBzdGFydCBmYWlsZWQiCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV4cG9ydCBCQlNFUlZFUj0wLjAuMC4wOi0xCisgICAgICAgICAgICBpZiBbICROT1RPQVNURVJVSSAtZXEgMCBdOyB0aGVuICAgICAgICAjIHdlIHN0YXJ0IHRoZSBUT0FTVEVSVUkgb25seSBpZiBub3QgaW5oaWJpdGVkCisgICAgICAgICAgICAgICAgYml0YmFrZSAtLW9ic2VydmUtb25seSAtdSB0b2FzdGVydWkgPj4ke0JVSUxERElSfS90b2FzdGVyX3VpLmxvZyAyPiYxICYgZWNobyAkISA+JHtCVUlMRERJUn0vLnRvYXN0ZXJ1aS5waWQKKyAgICAgICAgICAgIGZpCisgICAgICAgIGZpCisgICAgICAgIGlmIFsgJHN0YXJ0X3N1Y2Nlc3MgLWVxIDEgXTsgdGhlbgorICAgICAgICAgICAgIyBzZXQgZmFpbCBzYWZlIHN0b3Agc3lzdGVtIG9uIHRlcm1pbmFsIGV4aXQKKyAgICAgICAgICAgIHRyYXAgc3RvcF9zeXN0ZW0gU0lHSFVQCisgICAgICAgICAgICBlY2hvICJTdWNjZXNzZnVsICR7Q01EfS4iCisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBlbHNlCisgICAgICAgICAgICAjIGZhaWxlZCBzdGFydCwgZG8gc3RvcAorICAgICAgICAgICAgc3RvcF9zeXN0ZW0KKyAgICAgICAgICAgIGVjaG8gIkZhaWxlZCAke0NNRH0uIgorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgZmkKKyAgICAgICAgIyBzdG9wIHN5c3RlbSBvbiB0ZXJtaW5hbCBleGl0CisgICAgICAgIHNldCAtbyBtb25pdG9yCisgICAgICAgIHRyYXAgc3RvcF9zeXN0ZW0gU0lHSFVQCisgICAgICAgICN0cmFwIG5vdGlmeV9jaGxkZXhpdCBTSUdDSExECisgICAgOzsKKyAgICBzdG9wICkKKyAgICAgICAgc3RvcF9zeXN0ZW0KKyAgICAgICAgZWNobyAiU3VjY2Vzc2Z1bCAke0NNRH0uIgorICAgIDs7Citlc2FjCisKZGlmZiAtLWdpdCBhL2JpdGJha2UvYmluL3RvYXN0ZXItZXZlbnRyZXBsYXkgYi9iaXRiYWtlL2Jpbi90b2FzdGVyLWV2ZW50cmVwbGF5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYxNWE3YWUKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2Jpbi90b2FzdGVyLWV2ZW50cmVwbGF5CkBAIC0wLDAgKzEsMTc0IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisjCisjIENvcHlyaWdodCAoQykgMjAxNCAgICAgICAgQWxleCBEYW1pYW4KKyMKKyMgVGhpcyBmaWxlIHJlLXVzZXMgY29kZSBzcHJlYWQgdGhyb3VnaG91dCBvdGhlciBCaXRiYWtlIHNvdXJjZSBmaWxlcy4KKyMgQXMgc3VjaCwgYWxsIG90aGVyIGNvcHlyaWdodHMgYmVsb25nIHRvIHRoZWlyIG93biByaWdodCBob2xkZXJzLgorIworIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworCisjIFRoaXMgY29tbWFuZCB0YWtlcyBhIGZpbGVuYW1lIGFzIGEgc2luZ2xlIHBhcmFtZXRlci4gVGhlIGZpbGVuYW1lIGlzIHJlYWQKKyMgYXMgYSBidWlsZCBldmVudGxvZywgYW5kIHRoZSBUb2FzdGVyVUkgaXMgdXNlZCB0byBwcm9jZXNzIGV2ZW50cyBpbiB0aGUgZmlsZQorIyBhbmQgbG9nIGRhdGEgaW4gdGhlIGRhdGFiYXNlCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KK2ltcG9ydCBvcworaW1wb3J0IHN5cywgbG9nZ2luZworCisjIG1hbmdsZSBzeXNwYXRoIHRvIGFsbG93IGVhc3kgaW1wb3J0IG9mIG1vZHVsZXMKK3N5cy5wYXRoLmluc2VydCgwLCBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmFic3BhdGgoX19maWxlX18pKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaWInKSkKKworCitpbXBvcnQgYmIuY29va2VyCitmcm9tIGJiLnVpIGltcG9ydCB0b2FzdGVydWkKK2ltcG9ydCBzeXMKK2ltcG9ydCBsb2dnaW5nCisKK2ltcG9ydCBqc29uLCBwaWNrbGUKKworCitjbGFzcyBGaWxlUmVhZEV2ZW50c1NlcnZlckNvbm5lY3Rpb24oKToKKyAgICAiIiIgIEVtdWxhdGVzIGEgY29ubmVjdGlvbiB0byBhIGJpdGJha2Ugc2VydmVyIHRoYXQgZmVlZHMKKyAgICAgICAgZXZlbnRzIGNvbWluZyBhY3R1YWxseSByZWFkIGZyb20gYSBzYXZlZCBsb2cgZmlsZS4KKyAgICAiIiIKKworICAgIGNsYXNzIE1vY2tDb25uZWN0aW9uKCk6CisgICAgICAgICIiIiBmaWxsLWluIGZvciB0aGUgcHJveHkgdG8gdGhlIHNlcnZlci4gd2UganVzdCByZXR1cm4gZ2VuZXJpYyBkYXRhCisgICAgICAgICIiIgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgc2MpOgorICAgICAgICAgICAgc2VsZi5fc2MgPSBzYworCisgICAgICAgIGRlZiBydW5Db21tYW5kKHNlbGYsIGNvbW1hbmRBcnJheSk6CisgICAgICAgICAgICAiIiIgZW11bGF0ZXMgcnVubmluZyBhIGNvbW1hbmQgb24gdGhlIHNlcnZlcjsgb25seSByZWFkLW9ubHkgY29tbWFuZHMgYXJlIGFjY2VwdGVkICIiIgorICAgICAgICAgICAgY29tbWFuZF9uYW1lID0gY29tbWFuZEFycmF5WzBdCisKKyAgICAgICAgICAgIGlmIGNvbW1hbmRfbmFtZSA9PSAiZ2V0VmFyaWFibGUiOgorICAgICAgICAgICAgICAgIGlmIGNvbW1hbmRBcnJheVsxXSBpbiBzZWxmLl9zYy5fdmFyaWFibGVzOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHNlbGYuX3NjLl92YXJpYWJsZXNbY29tbWFuZEFycmF5WzFdXVsndiddLCBOb25lKQorICAgICAgICAgICAgICAgIHJldHVybiAoTm9uZSwgIk1pc3NpbmcgdmFyaWFibGUiKQorCisgICAgICAgICAgICBlbGlmIGNvbW1hbmRfbmFtZSA9PSAiZ2V0QWxsS2V5c1dpdGhGbGFncyI6CisgICAgICAgICAgICAgICAgZHVtcCA9IHt9CisgICAgICAgICAgICAgICAgZmxhZ2xpc3QgPSBjb21tYW5kQXJyYXlbMV0KKyAgICAgICAgICAgICAgICBmb3IgayBpbiBzZWxmLl9zYy5fdmFyaWFibGVzLmtleXMoKToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGsuc3RhcnRzd2l0aCgiX18iKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gc2VsZi5fc2MuX3ZhcmlhYmxlc1trXVsndiddCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVtcFtrXSA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3YnIDogdiAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoaXN0b3J5JyA6IHNlbGYuX3NjLl92YXJpYWJsZXNba11bJ2hpc3RvcnknXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGQgaW4gZmxhZ2xpc3Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBba11bZF0gPSBzZWxmLl9zYy5fdmFyaWFibGVzW2tdW2RdCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KGUpCisgICAgICAgICAgICAgICAgcmV0dXJuIChkdW1wLCBOb25lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIkNvbW1hbmQgJXMgbm90IGltcGxlbWVudGVkIiAlIGNvbW1hbmRBcnJheVswXSkKKworICAgICAgICBkZWYgdGVybWluYXRlU2VydmVyKHNlbGYpOgorICAgICAgICAgICAgIiIiIGRvIG5vdCBkbyBhbnl0aGluZyAiIiIKKyAgICAgICAgICAgIHBhc3MKKworCisKKyAgICBjbGFzcyBFdmVudFJlYWRlcigpOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgc2MpOgorICAgICAgICAgICAgc2VsZi5fc2MgPSBzYworICAgICAgICAgICAgc2VsZi5maXJzdHJhaXNlID0gMAorCisgICAgICAgIGRlZiBfY3JlYXRlX2V2ZW50KHNlbGYsIGxpbmUpOgorICAgICAgICAgICAgZGVmIF9pbXBvcnRfY2xhc3MobmFtZSk6CisgICAgICAgICAgICAgICAgYXNzZXJ0IGxlbihuYW1lKSA+IDAKKyAgICAgICAgICAgICAgICBhc3NlcnQgIi4iIGluIG5hbWUsIG5hbWUKKworICAgICAgICAgICAgICAgIGNvbXBvbmVudHMgPSBuYW1lLnN0cmlwKCkuc3BsaXQoIi4iKQorICAgICAgICAgICAgICAgIG1vZHVsZW5hbWUgPSAiLiIuam9pbihjb21wb25lbnRzWzotMV0pCisgICAgICAgICAgICAgICAgbW9kdWxla2xhc3MgPSBjb21wb25lbnRzWy0xXQorCisgICAgICAgICAgICAgICAgbW9kdWxlID0gX19pbXBvcnRfXyhtb2R1bGVuYW1lLCBmcm9tbGlzdD1bc3RyKG1vZHVsZWtsYXNzKV0pCisgICAgICAgICAgICAgICAgcmV0dXJuIGdldGF0dHIobW9kdWxlLCBtb2R1bGVrbGFzcykKKworICAgICAgICAgICAgIyB3ZSBidWlsZCBhIHRvYXN0ZXIgZXZlbnQgb3V0IG9mIGN1cnJlbnQgZXZlbnQgbG9nIGxpbmUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBldmVudF9kYXRhID0ganNvbi5sb2FkcyhsaW5lLnN0cmlwKCkpCisgICAgICAgICAgICAgICAgZXZlbnRfY2xhc3MgPSBfaW1wb3J0X2NsYXNzKGV2ZW50X2RhdGFbJ2NsYXNzJ10pCisgICAgICAgICAgICAgICAgZXZlbnRfb2JqZWN0ID0gcGlja2xlLmxvYWRzKGpzb24ubG9hZHMoZXZlbnRfZGF0YVsndmFycyddKSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgcHJpbnQoIkZhaWxlZCBsb2FkaW5nICIsIGxpbmUpCisgICAgICAgICAgICAgICAgcmFpc2UgZQorCisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShldmVudF9vYmplY3QsIGV2ZW50X2NsYXNzKToKKyAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIkVycm9yIGxvYWRpbmcgb2JqZWN0cyAlcyBjbGFzcyAlcyAiLCBldmVudF9vYmplY3QsIGV2ZW50X2NsYXNzKQorCisgICAgICAgICAgICByZXR1cm4gZXZlbnRfb2JqZWN0CisKKyAgICAgICAgZGVmIHdhaXRFdmVudChzZWxmLCB0aW1lb3V0KToKKworICAgICAgICAgICAgbmV4dGxpbmUgPSBzZWxmLl9zYy5fZXZlbnRmaWxlLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIGxlbihuZXh0bGluZSkgPT0gMDoKKyAgICAgICAgICAgICAgICAjIHRoZSBidWlsZCBkYXRhIGVuZGVkLCB3aGlsZSB0b2FzdGVydWkgc3RpbGwgd2FpdHMgZm9yIGV2ZW50cy4KKyAgICAgICAgICAgICAgICAjIHRoaXMgaGFwcGVucyB3aGVuIHRoZSBzZXJ2ZXIgd2FzIGFicnVwdGx5IHN0b3BwZWQsIHNvIHdlIHNpbXVsYXRlIHRoaXMKKyAgICAgICAgICAgICAgICBzZWxmLmZpcnN0cmFpc2UgKz0gMQorICAgICAgICAgICAgICAgIGlmIHNlbGYuZmlyc3RyYWlzZSA9PSAxOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBLZXlib2FyZEludGVycnVwdCgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5fc2MubGluZW5vICs9IDEKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9jcmVhdGVfZXZlbnQobmV4dGxpbmUpCisKKworICAgIGRlZiBfcmVhZFZhcmlhYmxlcyhzZWxmLCB2YXJpYWJsZWxpbmUpOgorICAgICAgICBzZWxmLl92YXJpYWJsZXMgPSBqc29uLmxvYWRzKHZhcmlhYmxlbGluZS5zdHJpcCgpKVsnYWxsdmFyaWFibGVzJ10KKworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVfbmFtZSk6CisgICAgICAgIHNlbGYuY29ubmVjdGlvbiA9IEZpbGVSZWFkRXZlbnRzU2VydmVyQ29ubmVjdGlvbi5Nb2NrQ29ubmVjdGlvbihzZWxmKQorICAgICAgICBzZWxmLl9ldmVudGZpbGUgPSBvcGVuKGZpbGVfbmFtZSwgInIiKQorCisgICAgICAgICMgd2UgZXhwZWN0IHRvIGhhdmUgdGhlIHZhcmlhYmxlIGR1bXAgYXQgdGhlIHN0YXJ0IG9mIHRoZSBmaWxlCisgICAgICAgIHNlbGYubGluZW5vID0gMQorICAgICAgICBzZWxmLl9yZWFkVmFyaWFibGVzKHNlbGYuX2V2ZW50ZmlsZS5yZWFkbGluZSgpKQorCisgICAgICAgIHNlbGYuZXZlbnRzID0gRmlsZVJlYWRFdmVudHNTZXJ2ZXJDb25uZWN0aW9uLkV2ZW50UmVhZGVyKHNlbGYpCisKKworCisKKworY2xhc3MgTW9ja0NvbmZpZ1BhcmFtZXRlcnMoKToKKyAgICAiIiIgc3RhbmQtaW4gZm9yIGNvb2tlcmRhdGEuQ29uZmlnUGFyYW1ldGVyczsgYXMgd2UgZG9uJ3QgcmVhbGx5IGNvbmZpZyBhIGNvb2tlciwgdGhpcworICAgICAgICBzZXJ2ZXMganVzdCB0byBzdXBwbHkgbmVlZGVkIGludGVyZmFjZXMgZm9yIHRoZSB0b2FzdGVyIHVpIHRvIHdvcmsgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLm9ic2VydmVfb25seSA9IFRydWUgICAgICAgICAgICAjIHdlIGNhbiBvbmx5IHJlYWQgZmlsZXMKKworCisjIHJ1biB0b2FzdGVyIHVpIG9uIG91ciBtb2NrIGJpdGJha2UgY2xhc3MKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgaWYgbGVuKHN5cy5hcmd2KSA8IDI6CisgICAgICAgIHByaW50KCJVc2FnZTogJXMgZXZlbnQubG9nICIgJSBzeXMuYXJndlswXSkKKyAgICAgICAgc3lzLmV4aXQoMSkKKworICAgIGZpbGVfbmFtZSA9IHN5cy5hcmd2Wy0xXQorICAgIG1vY2tfY29ubmVjdGlvbiA9IEZpbGVSZWFkRXZlbnRzU2VydmVyQ29ubmVjdGlvbihmaWxlX25hbWUpCisgICAgY29uZmlnUGFyYW1zID0gTW9ja0NvbmZpZ1BhcmFtZXRlcnMoKQorCisgICAgIyBydW4gdGhlIG1haW4gcHJvZ3JhbSBhbmQgc2V0IGV4aXQgY29kZSB0byB0aGUgcmV0dXJuZWQgdmFsdWUKKyAgICBzeXMuZXhpdCh0b2FzdGVydWkubWFpbihtb2NrX2Nvbm5lY3Rpb24uY29ubmVjdGlvbiwgbW9ja19jb25uZWN0aW9uLmV2ZW50cywgY29uZmlnUGFyYW1zKSkKZGlmZiAtLWdpdCBhL2JpdGJha2UvY29udHJpYi9SRUFETUUgYi9iaXRiYWtlL2NvbnRyaWIvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZTUxNTYKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2NvbnRyaWIvUkVBRE1FCkBAIC0wLDAgKzEgQEAKK1RoaXMgZGlyZWN0b3J5IGlzIGZvciBhZGRpdGlvbmFsIGNvbnRyaWJ1dGVkIGZpbGVzIHdoaWNoIG1heSBiZSB1c2VmdWwuCmRpZmYgLS1naXQgYS9iaXRiYWtlL2NvbnRyaWIvYmJkZXYuc2ggYi9iaXRiYWtlL2NvbnRyaWIvYmJkZXYuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNhNzg1MwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvY29udHJpYi9iYmRldi5zaApAQCAtMCwwICsxLDMxIEBACisjIFRoaXMgaXMgYSBzaGVsbCBmdW5jdGlvbiB0byBiZSBzb3VyY2VkIGludG8geW91ciBzaGVsbCBvciBwbGFjZWQgaW4geW91ciAucHJvZmlsZSwKKyMgd2hpY2ggbWFrZXMgc2V0dGluZyB0aGluZ3MgdXAgZm9yIEJpdEJha2UgYSBiaXQgZWFzaWVyLgorIworIyBUaGUgYXV0aG9yIGRpc2NsYWltcyBjb3B5cmlnaHQgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhbmQgcGxhY2VzIGl0IGluIHRoZQorIyBwdWJsaWMgZG9tYWluLgorCitiYmRldiAoKSB7CisJbG9jYWwgQkJESVIgUEtHRElSIEJVSUxERElSCisJaWYgdGVzdCB4IiQxIiA9ICJ4LS1oZWxwIjsgdGhlbiBlY2hvID4mMiAic3ludGF4OiBiYmRldiBbYmJkaXIgW3BrZ2RpciBbYnVpbGRkaXJdXV0iOyByZXR1cm4gMTsgZmkKKwlpZiB0ZXN0IHgiJDEiID0geDsgdGhlbiBCQkRJUj1gcHdkYDsgZWxzZSBCQkRJUj0kMTsgZmkKKwlpZiB0ZXN0IHgiJDIiID0geDsgdGhlbiBQS0dESVI9YHB3ZGA7IGVsc2UgUEtHRElSPSQyOyBmaQorCWlmIHRlc3QgeCIkMyIgPSB4OyB0aGVuIEJVSUxERElSPWBwd2RgOyBlbHNlIEJVSUxERElSPSQzOyBmaQorCisJQkJESVI9YHJlYWRsaW5rIC1mICRCQkRJUmAKKwlQS0dESVI9YHJlYWRsaW5rIC1mICRQS0dESVJgCisJQlVJTERESVI9YHJlYWRsaW5rIC1mICRCVUlMRERJUmAKKwlpZiAhICh0ZXN0IC1kICRCQkRJUiAmJiB0ZXN0IC1kICRQS0dESVIgJiYgdGVzdCAtZCAkQlVJTERESVIpOyB0aGVuCisJCWVjaG8gPiYyICJzeW50YXg6IGJiZGV2IFtiYmRpciBbcGtnZGlyIFtidWlsZGRpcl1dXSIKKwkJcmV0dXJuIDEKKwlmaQorCQorCVBBVEg9JEJCRElSL2JpbjokUEFUSAorCUJCUEFUSD0kQkJESVIKKwlpZiB0ZXN0IHgiJEJCRElSIiAhPSB4IiRQS0dESVIiOyB0aGVuCisJCUJCUEFUSD0kUEtHRElSOiRCQlBBVEgKKwlmaQorCWlmIHRlc3QgeCIkUEtHRElSIiAhPSB4IiRCVUlMRERJUiI7IHRoZW4KKwkJQkJQQVRIPSRCVUlMRERJUjokQkJQQVRICisJZmkKKwlleHBvcnQgQkJQQVRICit9CmRpZmYgLS1naXQgYS9iaXRiYWtlL2NvbnRyaWIvZHVtcF9jYWNoZS5weSBiL2JpdGJha2UvY29udHJpYi9kdW1wX2NhY2hlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUxZjIzMDkKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2NvbnRyaWIvZHVtcF9jYWNoZS5weQpAQCAtMCwwICsxLDY4IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisjCisjIENvcHlyaWdodCAoQykgMjAxMiBXaW5kIFJpdmVyIFN5c3RlbXMsIEluYy4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKyMKKyMgVGhpcyBpcyB1c2VkIGZvciBkdW1waW5nIHRoZSBiYl9jYWNoZS5kYXQsIHRoZSBvdXRwdXQgZm9ybWF0IGlzOgorIyByZWNpcGVfcGF0aCBQTiBQViBQQUNLQUdFUworIworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgd2FybmluZ3MKKworIyBGb3IgaW1wb3J0aW5nIGJiLmNhY2hlCitzeXMucGF0aC5pbnNlcnQoMCwgb3MucGF0aC5qb2luKG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmRpcm5hbWUoc3lzLmFyZ3ZbMF0pKSwgJy4uL2xpYicpKQorZnJvbSBiYi5jYWNoZSBpbXBvcnQgQ29yZVJlY2lwZUluZm8KKworaW1wb3J0IGNQaWNrbGUgYXMgcGlja2xlCisKK2RlZiBtYWluKGFyZ3Y9Tm9uZSk6CisgICAgIiIiCisgICAgR2V0IHRoZSBtYXBwaW5nIGZvciB0aGUgdGFyZ2V0IHJlY2lwZS4KKyAgICAiIiIKKyAgICBpZiBsZW4oYXJndikgIT0gMToKKyAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAiRXJyb3IsIG5lZWQgb25lIGFyZ3VtZW50ISIKKyAgICAgICAgcmV0dXJuIDIKKworICAgIGNhY2hlZmlsZSA9IGFyZ3ZbMF0KKworICAgIHdpdGggb3BlbihjYWNoZWZpbGUsICJyYiIpIGFzIGNhY2hlZmlsZToKKyAgICAgICAgcGlja2xlZCA9IHBpY2tsZS5VbnBpY2tsZXIoY2FjaGVmaWxlKQorICAgICAgICB3aGlsZSBjYWNoZWZpbGU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAga2V5ID0gcGlja2xlZC5sb2FkKCkKKyAgICAgICAgICAgICAgICB2YWwgPSBwaWNrbGVkLmxvYWQoKQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWwsIENvcmVSZWNpcGVJbmZvKSBhbmQgKG5vdCB2YWwuc2tpcHBlZCk6CisgICAgICAgICAgICAgICAgcG4gPSB2YWwucG4KKyAgICAgICAgICAgICAgICAjIEZpbHRlciBvdXQgdGhlIG5hdGl2ZSByZWNpcGVzLgorICAgICAgICAgICAgICAgIGlmIGtleS5zdGFydHN3aXRoKCd2aXJ0dWFsOm5hdGl2ZTonKSBvciBwbi5lbmRzd2l0aCgiLW5hdGl2ZSIpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgIyAxLjAgaXMgdGhlIGRlZmF1bHQgdmVyc2lvbiBmb3IgYSBubyBQViByZWNpcGUuCisgICAgICAgICAgICAgICAgaWYgdmFsLl9fZGljdF9fLmhhc19rZXkoInB2Iik6CisgICAgICAgICAgICAgICAgICAgIHB2ID0gdmFsLnB2CisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcHYgPSAiMS4wIgorCisgICAgICAgICAgICAgICAgcHJpbnQoIiVzICVzICVzICVzIiAlIChrZXksIHBuLCBwdiwgJyAnLmpvaW4odmFsLnBhY2thZ2VzKSkpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgc3lzLmV4aXQobWFpbihzeXMuYXJndlsxOl0pKQorCmRpZmYgLS1naXQgYS9iaXRiYWtlL2NvbnRyaWIvdmltL2Z0ZGV0ZWN0L2JpdGJha2UudmltIGIvYml0YmFrZS9jb250cmliL3ZpbS9mdGRldGVjdC9iaXRiYWtlLnZpbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDBmOGFlCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9jb250cmliL3ZpbS9mdGRldGVjdC9iaXRiYWtlLnZpbQpAQCAtMCwwICsxLDI0IEBACisiIFZpbSBmaWxldHlwZSBkZXRlY3Rpb24gZmlsZQorIiBMYW5ndWFnZTogICAgIEJpdEJha2UKKyIgQXV0aG9yOiAgICAgICBSaWNhcmRvIFNhbHZldGkgPHJzYWx2ZXRpQHJzYWx2ZXRpLm5ldD4KKyIgQ29weXJpZ2h0OiAgICBDb3B5cmlnaHQgKEMpIDIwMDggIFJpY2FyZG8gU2FsdmV0aSA8cnNhbHZldGlAcnNhbHZldGkubmV0PgorIiBMaWNlbmNlOiAgICAgIFlvdSBtYXkgcmVkaXN0cmlidXRlIHRoaXMgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgVmltIGl0c2VsZgorIgorIiBUaGlzIHNldHMgdXAgdGhlIHN5bnRheCBoaWdobGlnaHRpbmcgZm9yIEJpdEJha2UgZmlsZXMsIGxpa2UgLmJiLCAuYmJjbGFzcyBhbmQgLmluYworCitpZiAmY29tcGF0aWJsZSB8fCB2ZXJzaW9uIDwgNjAwCisgICAgZmluaXNoCitlbmRpZgorCisiIC5iYiwgLmJiYXBwZW5kIGFuZCAuYmJjbGFzcworYXUgQnVmTmV3RmlsZSxCdWZSZWFkICoue2JiLGJiYXBwZW5kLGJiY2xhc3N9CXNldCBmaWxldHlwZT1iaXRiYWtlCisKKyIgLmluYworYXUgQnVmTmV3RmlsZSxCdWZSZWFkICouaW5jCQlzZXQgZmlsZXR5cGU9Yml0YmFrZQorCisiIC5jb25mCithdSBCdWZOZXdGaWxlLEJ1ZlJlYWQgKi5jb25mCisgICAgXCBpZiAobWF0Y2goZXhwYW5kKCIlOnA6aCIpLCAiY29uZiIpID4gMCkgfAorICAgIFwgICAgIHNldCBmaWxldHlwZT1iaXRiYWtlIHwKKyAgICBcIGVuZGlmCisKZGlmZiAtLWdpdCBhL2JpdGJha2UvY29udHJpYi92aW0vZnRwbHVnaW4vYml0YmFrZS52aW0gYi9iaXRiYWtlL2NvbnRyaWIvdmltL2Z0cGx1Z2luL2JpdGJha2UudmltCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMGQ3NTMKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2NvbnRyaWIvdmltL2Z0cGx1Z2luL2JpdGJha2UudmltCkBAIC0wLDAgKzEsMiBAQAorc2V0IHN0cz00IHN3PTQgZXQKK3NldCBjbXM9IyVzCmRpZmYgLS1naXQgYS9iaXRiYWtlL2NvbnRyaWIvdmltL3BsdWdpbi9uZXdiYi52aW0gYi9iaXRiYWtlL2NvbnRyaWIvdmltL3BsdWdpbi9uZXdiYi52aW0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODc0ZTMzOAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvY29udHJpYi92aW0vcGx1Z2luL25ld2JiLnZpbQpAQCAtMCwwICsxLDg0IEBACisiIFZpbSBwbHVnaW4gZmlsZQorIiBQdXJwb3NlOglDcmVhdGUgYSB0ZW1wbGF0ZSBmb3IgbmV3IGJiIGZpbGVzCisiIEF1dGhvcjoJUmljYXJkbyBTYWx2ZXRpIDxyc2FsdmV0aUBnbWFpbC5jb20+CisiIENvcHlyaWdodDoJQ29weXJpZ2h0IChDKSAyMDA4IFJpY2FyZG8gU2FsdmV0aSA8cnNhbHZldGlAZ21haWwuY29tPgorIgorIiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLCBzZWUgQ09QWUlORy5NSVQgaW4KKyIgdGhpcyBzb3VyY2UgZGlzdHJpYnV0aW9uIGZvciB0aGUgdGVybXMuCisiCisiIEJhc2VkIG9uIHRoZSBnZW50b28tc3ludGF4IHBhY2thZ2UKKyIKKyIgV2lsbCB0cnkgdG8gdXNlIGdpdCB0byBmaW5kIHRoZSB1c2VyIG5hbWUgYW5kIGVtYWlsCisKK2lmICZjb21wYXRpYmxlIHx8IHY6dmVyc2lvbiA8IDYwMAorICAgIGZpbmlzaAorZW5kaWYKKworZnVuISA8U0lEPkdldFVzZXJOYW1lKCkKKyAgICBsZXQgbDp1c2VyX25hbWUgPSBzeXN0ZW0oImdpdCBjb25maWcgLS1nZXQgdXNlci5uYW1lIikKKyAgICBpZiB2OnNoZWxsX2Vycm9yCisgICAgICAgIHJldHVybiAiVW5rbm93biBVc2VyIgorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHN1YnN0aXR1dGUobDp1c2VyX25hbWUsICJcbiIsICIiLCAiIikKK2VuZGZ1bgorCitmdW4hIDxTSUQ+R2V0VXNlckVtYWlsKCkKKyAgICBsZXQgbDp1c2VyX2VtYWlsID0gc3lzdGVtKCJnaXQgY29uZmlnIC0tZ2V0IHVzZXIuZW1haWwiKQorICAgIGlmIHY6c2hlbGxfZXJyb3IKKyAgICAgICAgcmV0dXJuICJ1bmtub3dAdXNlci5vcmciCisgICAgZWxzZQorICAgICAgICByZXR1cm4gc3Vic3RpdHV0ZShsOnVzZXJfZW1haWwsICJcbiIsICIiLCAiIikKK2VuZGZ1bgorCitmdW4hIEJCSGVhZGVyKCkKKyAgICBsZXQgbDpjdXJyZW50X3llYXIgPSBzdHJmdGltZSgiJVkiKQorICAgIGxldCBsOnVzZXJfbmFtZSA9IDxTSUQ+R2V0VXNlck5hbWUoKQorICAgIGxldCBsOnVzZXJfZW1haWwgPSA8U0lEPkdldFVzZXJFbWFpbCgpCisgICAgMCBwdXQgPScjIENvcHlyaWdodCAoQykgJyAuIGw6Y3VycmVudF95ZWFyIC4KKyAgICAgICAgICAgICAgICBcICcgJyAuIGw6dXNlcl9uYW1lIC4gJyA8JyAuIGw6dXNlcl9lbWFpbCAuICc+JworICAgIHB1dCA9JyMgUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIChzZWUgQ09QWUlORy5NSVQgZm9yIHRoZSB0ZXJtcyknCisgICAgJAorZW5kZnVuCisKK2Z1biEgTmV3QkJUZW1wbGF0ZSgpCisgICAgbGV0IGw6cGFzdGUgPSAmcGFzdGUKKyAgICBzZXQgbm9wYXN0ZQorICAgIAorICAgICIgR2V0IHRoZSBoZWFkZXIKKyAgICBjYWxsIEJCSGVhZGVyKCkKKworICAgICIgTmV3IHRoZSBiYiB0ZW1wbGF0ZQorICAgIHB1dCA9J0RFU0NSSVBUSU9OID0gXCJcIicKKyAgICBwdXQgPSdIT01FUEFHRSA9IFwiXCInCisgICAgcHV0ID0nTElDRU5TRSA9IFwiXCInIAorICAgIHB1dCA9J1NFQ1RJT04gPSBcIlwiJworICAgIHB1dCA9J0RFUEVORFMgPSBcIlwiJworICAgIHB1dCA9JycKKyAgICBwdXQgPSdTUkNfVVJJID0gXCJcIicKKworICAgICIgR28gdG8gdGhlIGZpcnN0IHBsYWNlIHRvIGVkaXQKKyAgICAwCisgICAgL15ERVNDUklQVElPTiA9LworICAgIGV4ZWMgIm5vcm1hbCAyZlwiIgorCisgICAgaWYgcGFzdGUgPT0gMQorICAgICAgICBzZXQgcGFzdGUKKyAgICBlbmRpZgorZW5kZnVuCisKK2lmICFleGlzdHMoImc6YmJfY3JlYXRlX29uX2VtcHR5IikKKyAgICBsZXQgZzpiYl9jcmVhdGVfb25fZW1wdHkgPSAxCitlbmRpZgorCisiIGRpc2FibGUgaW4gY2FzZSBvZiB2aW1kaWZmCitpZiB2OnByb2duYW1lID1+ICJ2aW1kaWZmIgorICAgIGxldCBnOmJiX2NyZWF0ZV9vbl9lbXB0eSA9IDAKK2VuZGlmCisKK2F1Z3JvdXAgTmV3QkIKKyAgICBhdSBCdWZOZXdGaWxlICouYmIKKyAgICAgICAgICAgICAgICBcIGlmIGc6YmJfY3JlYXRlX29uX2VtcHR5IHwKKyAgICAgICAgICAgICAgICBcICAgIGNhbGwgTmV3QkJUZW1wbGF0ZSgpIHwKKyAgICAgICAgICAgICAgICBcIGVuZGlmCithdWdyb3VwIEVORAorCmRpZmYgLS1naXQgYS9iaXRiYWtlL2NvbnRyaWIvdmltL3N5bnRheC9iaXRiYWtlLnZpbSBiL2JpdGJha2UvY29udHJpYi92aW0vc3ludGF4L2JpdGJha2UudmltCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNTVmOTEKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2NvbnRyaWIvdmltL3N5bnRheC9iaXRiYWtlLnZpbQpAQCAtMCwwICsxLDEyNiBAQAorIiBWaW0gc3ludGF4IGZpbGUKKyIgTGFuZ3VhZ2U6ICAgICBCaXRCYWtlIGJiL2JiY2xhc3Nlcy9pbmMKKyIgQXV0aG9yOiAgICAgICBDaHJpcyBMYXJzb24gPGtlcmdvdGhAaGFuZGhlbGRzLm9yZz4KKyIgICAgICAgICAgICAgICBSaWNhcmRvIFNhbHZldGkgPHJzYWx2ZXRpQHJzYWx2ZXRpLm5ldD4KKyIgQ29weXJpZ2h0OiAgICBDb3B5cmlnaHQgKEMpIDIwMDQgIENocmlzIExhcnNvbiA8a2VyZ290aEBoYW5kaGVsZHMub3JnPgorIiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMjAwOCAgUmljYXJkbyBTYWx2ZXRpIDxyc2FsdmV0aUByc2FsdmV0aS5uZXQ+CisiCisiIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UsIHNlZSBDT1BZSU5HLk1JVCBpbgorIiB0aGlzIHNvdXJjZSBkaXN0cmlidXRpb24gZm9yIHRoZSB0ZXJtcy4KKyIKKyIgU3ludGF4IGhpZ2hsaWdodGluZyBmb3IgYmIsIGJiY2xhc3NlcyBhbmQgaW5jIGZpbGVzLgorIgorIiBJdCdzIGFuIGVudGlyZWx5IG5ldyB0eXBlLCBqdXN0IGhhcyBzcGVjaWZpYyBzeW50YXggaW4gc2hlbGwgYW5kIHB5dGhvbiBjb2RlCisKK2lmICZjb21wYXRpYmxlIHx8IHY6dmVyc2lvbiA8IDYwMAorICAgIGZpbmlzaAorZW5kaWYKK2lmIGV4aXN0cygiYjpjdXJyZW50X3N5bnRheCIpCisgICAgZmluaXNoCitlbmRpZgorCitzeW4gaW5jbHVkZSBAcHl0aG9uIHN5bnRheC9weXRob24udmltCitpZiBleGlzdHMoImI6Y3VycmVudF9zeW50YXgiKQorICB1bmxldCBiOmN1cnJlbnRfc3ludGF4CitlbmRpZgorCisiIEJpdEJha2Ugc3ludGF4CisKKyIgTWF0Y2hpbmcgY2FzZQorc3luIGNhc2UgbWF0Y2gKKworIiBJbmRpY2F0ZXMgdGhlIGVycm9yIHdoZW4gbm90aGluZyBpcyBtYXRjaGVkCitzeW4gbWF0Y2ggYmJVbm1hdGNoZWQgICAgICAgICAgICIuIgorCisiIENvbW1lbnRzCitzeW4gY2x1c3RlciBiYkNvbW1lbnRHcm91cCAgICAgIGNvbnRhaW5zPWJiVG9kbyxAU3BlbGwKK3N5biBrZXl3b3JkIGJiVG9kbyAgICAgICAgICAgICAgQ09NQkFLIEZJWE1FIFRPRE8gWFhYIGNvbnRhaW5lZAorc3luIG1hdGNoIGJiQ29tbWVudCAgICAgICAgICAgICAiIy4qJCIgY29udGFpbnM9QGJiQ29tbWVudEdyb3VwCisKKyIgU3RyaW5nIGhlbHBlcnMKK3N5biBtYXRjaCBiYlF1b3RlICAgICAgICAgICAgICAgK1snIl0rIGNvbnRhaW5lZCAKK3N5biBtYXRjaCBiYkRlbGltaXRlciAgICAgICAgICAgIlsoKXt9PV0iIGNvbnRhaW5lZAorc3luIG1hdGNoIGJiQXJyYXlCcmFja2V0cyAgICAgICAiW1xbXF1dIiBjb250YWluZWQKKworIiBCaXRCYWtlIHN0cmluZ3MKK3N5biBtYXRjaCBiYkNvbnRpbnVlICAgICAgICAgICAgIlxcJCIKK3N5biByZWdpb24gYmJTdHJpbmcgICAgICAgICAgICAgbWF0Y2hncm91cD1iYlF1b3RlIHN0YXJ0PSsiKyBza2lwPStcXCQrIGVuZD0rIisgY29udGFpbmVkIGNvbnRhaW5zPWJiVG9kbyxiYkNvbnRpbnVlLGJiVmFyRGVyZWYsYmJWYXJQeVZhbHVlLEBTcGVsbAorc3luIHJlZ2lvbiBiYlN0cmluZyAgICAgICAgICAgICBtYXRjaGdyb3VwPWJiUXVvdGUgc3RhcnQ9KycrIHNraXA9K1xcJCsgZW5kPSsnKyBjb250YWluZWQgY29udGFpbnM9YmJUb2RvLGJiQ29udGludWUsYmJWYXJEZXJlZixiYlZhclB5VmFsdWUsQFNwZWxsCisKKyIgVmFycyBkZWZpbml0aW9uCitzeW4gbWF0Y2ggYmJFeHBvcnQgICAgICAgICAgICAiXmV4cG9ydCIgbmV4dGdyb3VwPWJiSWRlbnRpZmllciBza2lwd2hpdGUKK3N5biBrZXl3b3JkIGJiRXhwb3J0RmxhZyAgICAgICAgZXhwb3J0IGNvbnRhaW5lZCBuZXh0Z3JvdXA9YmJJZGVudGlmaWVyIHNraXB3aGl0ZQorc3luIG1hdGNoIGJiSWRlbnRpZmllciAgICAgICAgICAiW2EtekEtWjAtOVwtX1wuXC9cK11cKyIgZGlzcGxheSBjb250YWluZWQKK3N5biBtYXRjaCBiYlZhckRlcmVmICAgICAgICAgICAgIiR7W2EtekEtWjAtOVwtX1wuXC9cK11cK30iIGNvbnRhaW5lZAorc3luIG1hdGNoIGJiVmFyRXEgICAgICAgICAgICAgICAiXCg6PVx8Kz1cfD0rXHxcLj1cfD1cLlx8Pz1cfD8/PVx8PVwpIiBjb250YWluZWQgbmV4dGdyb3VwPWJiVmFyVmFsdWUKK3N5biBtYXRjaCBiYlZhckRlZiAgICAgICAgICAgICAgIl5cKGV4cG9ydFxzKlwpXD9cKFthLXpBLVowLTlcLV9cLlwvXCtdXCtcKF9bJHt9YS16QS1aMC05XC1fXC5cL1wrXVwrXClcP1wpXHMqXCg6PVx8Kz1cfD0rXHxcLj1cfD1cLlx8Pz1cfD8/PVx8PVwpXEA9IiBjb250YWlucz1iYkV4cG9ydEZsYWcsYmJJZGVudGlmaWVyLGJiVmFyRGVyZWYgbmV4dGdyb3VwPWJiVmFyRXEKK3N5biBtYXRjaCBiYlZhclZhbHVlICAgICAgICAgICAgIi4qJCIgY29udGFpbmVkIGNvbnRhaW5zPWJiU3RyaW5nLGJiVmFyRGVyZWYsYmJWYXJQeVZhbHVlCitzeW4gcmVnaW9uIGJiVmFyUHlWYWx1ZSAgICAgICAgIHN0YXJ0PSske0ArIHNraXA9K1xcJCsgZW5kPSt9KyBjb250YWluZWQgY29udGFpbnM9QHB5dGhvbgorCisiIFZhcnMgbWV0YWRhdGEgZmxhZ3MKK3N5biBtYXRjaCBiYlZhckZsYWdEZWYgICAgICAgICAgIl5cKFthLXpBLVowLTlcLV9cLl1cK1wpXChcW1thLXpBLVowLTlcLV9cLl1cK1xdXClcQD0iIGNvbnRhaW5zPWJiSWRlbnRpZmllciBuZXh0Z3JvdXA9YmJWYXJGbGFnRmxhZworc3luIHJlZ2lvbiBiYlZhckZsYWdGbGFnICAgICAgICBtYXRjaGdyb3VwPWJiQXJyYXlCcmFja2V0cyBzdGFydD0iXFsiIGVuZD0iXF1ccypcKD1cfCs9XHw9K1x8Pz1cKVxAPSIgY29udGFpbmVkIGNvbnRhaW5zPWJiSWRlbnRpZmllciBuZXh0Z3JvdXA9YmJWYXJFcQorCisiIEluY2x1ZGVzIGFuZCByZXF1aXJlcworc3luIGtleXdvcmQgYmJJbmNsdWRlICAgICAgICAgICBpbmhlcml0IGluY2x1ZGUgcmVxdWlyZSBjb250YWluZWQgCitzeW4gbWF0Y2ggYmJJbmNsdWRlUmVzdCAgICAgICAgICIuKiQiIGNvbnRhaW5lZCBjb250YWlucz1iYlN0cmluZyxiYlZhckRlcmVmCitzeW4gbWF0Y2ggYmJJbmNsdWRlTGluZSAgICAgICAgICJeXChpbmhlcml0XHxpbmNsdWRlXHxyZXF1aXJlXClcc1wrIiBjb250YWlucz1iYkluY2x1ZGUgbmV4dGdyb3VwPWJiSW5jbHVkZVJlc3QKKworIiBBZGQgdGFrcyBhbmQgc2ltaWxhcgorc3luIGtleXdvcmQgYmJTdGF0ZW1lbnQgICAgICAgICBhZGR0YXNrIGFkZGhhbmRsZXIgYWZ0ZXIgYmVmb3JlIEVYUE9SVF9GVU5DVElPTlMgY29udGFpbmVkCitzeW4gbWF0Y2ggYmJTdGF0ZW1lbnRSZXN0ICAgICAgICIuKiQiIHNraXB3aGl0ZSBjb250YWluZWQgY29udGFpbnM9YmJTdGF0ZW1lbnQKK3N5biBtYXRjaCBiYlN0YXRlbWVudExpbmUgICAgICAgIl5cKGFkZHRhc2tcfGFkZGhhbmRsZXJcfGFmdGVyXHxiZWZvcmVcfEVYUE9SVF9GVU5DVElPTlNcKVxzXCsiIGNvbnRhaW5zPWJiU3RhdGVtZW50IG5leHRncm91cD1iYlN0YXRlbWVudFJlc3QKKworIiBPRSBJbXBvcnRhbnQgRnVuY3Rpb25zCitzeW4ga2V5d29yZCBiYk9FRnVuY3Rpb25zICAgICAgIGRvX2ZldGNoIGRvX3VucGFjayBkb19wYXRjaCBkb19jb25maWd1cmUgZG9fY29tcGlsZSBkb19zdGFnZSBkb19pbnN0YWxsIGRvX3BhY2thZ2UgY29udGFpbmVkCisKKyIgR2VuZXJpYyBGdW5jdGlvbnMKK3N5biBtYXRjaCBiYkZ1bmN0aW9uICAgICAgICAgICAgIlxoWzAtOUEtWmEtel8tXSoiIGRpc3BsYXkgY29udGFpbmVkIGNvbnRhaW5zPWJiT0VGdW5jdGlvbnMKKworIiBCaXRCYWtlIHNoZWxsIG1ldGFkYXRhCitzeW4gaW5jbHVkZSBAc2hlbGwgc3ludGF4L3NoLnZpbQoraWYgZXhpc3RzKCJiOmN1cnJlbnRfc3ludGF4IikKKyAgdW5sZXQgYjpjdXJyZW50X3N5bnRheAorZW5kaWYKK3N5biBrZXl3b3JkIGJiU2hGYWtlUm9vdEZsYWcgICAgZmFrZXJvb3QgY29udGFpbmVkCitzeW4gbWF0Y2ggYmJTaEZ1bmNEZWYgICAgICAgICAgICJeXChmYWtlcm9vdFxzKlwpXD9cKFswLTlBLVphLXpfJHt9LV1cK1wpXChweXRob25cKVxAPCFcKFxzKigpXHMqXClcKHtcKVxAPSIgY29udGFpbnM9YmJTaEZha2VSb290RmxhZyxiYkZ1bmN0aW9uLGJiVmFyRGVyZWYsYmJEZWxpbWl0ZXIgbmV4dGdyb3VwPWJiU2hGdW5jUmVnaW9uIHNraXB3aGl0ZQorc3luIHJlZ2lvbiBiYlNoRnVuY1JlZ2lvbiAgICAgICBtYXRjaGdyb3VwPWJiRGVsaW1pdGVyIHN0YXJ0PSJ7XHMqJCIgZW5kPSJefVxzKiQiIGNvbnRhaW5lZCBjb250YWlucz1Ac2hlbGwKKworIiBQeXRob24gdmFsdWUgaW5zaWRlIHNoZWxsIGZ1bmN0aW9ucworc3luIHJlZ2lvbiBzaERlcmVmICAgICAgICAgc3RhcnQ9KyR7QCsgc2tpcD0rXFwkKyBleGNsdWRlbmwgZW5kPSt9KyBjb250YWluZWQgY29udGFpbnM9QHB5dGhvbgorCisiIEJpdEJha2UgcHl0aG9uIG1ldGFkYXRhCitzeW4ga2V5d29yZCBiYlB5RmxhZyAgICAgICAgICAgIHB5dGhvbiBjb250YWluZWQKK3N5biBtYXRjaCBiYlB5RnVuY0RlZiAgICAgICAgICAgIl5cKHB5dGhvblxzXCtcKVwoWzAtOUEtWmEtel8ke30tXVwrXClcP1woXHMqKClccypcKVwoe1wpXEA9IiBjb250YWlucz1iYlB5RmxhZyxiYkZ1bmN0aW9uLGJiVmFyRGVyZWYsYmJEZWxpbWl0ZXIgbmV4dGdyb3VwPWJiUHlGdW5jUmVnaW9uIHNraXB3aGl0ZQorc3luIHJlZ2lvbiBiYlB5RnVuY1JlZ2lvbiAgICAgICBtYXRjaGdyb3VwPWJiRGVsaW1pdGVyIHN0YXJ0PSJ7XHMqJCIgZW5kPSJefVxzKiQiIGNvbnRhaW5lZCBjb250YWlucz1AcHl0aG9uCisKKyIgQml0QmFrZSAnZGVmJ2QgcHl0aG9uIGZ1bmN0aW9ucworc3luIGtleXdvcmQgYmJQeURlZiAgICAgICAgICAgICBkZWYgY29udGFpbmVkCitzeW4gcmVnaW9uIGJiUHlEZWZSZWdpb24gICAgICAgIHN0YXJ0PSdeXChkZWZcc1wrXClcKFswLTlBLVphLXpfLV1cK1wpXChccyooLiopXHMqXCk6XHMqJCcgZW5kPSdeXChcc1x8JFwpXEAhJyBjb250YWlucz1AcHl0aG9uCisKKyIgSGlnaGxpZ2h0aW5nIERlZmluaXRpb25zCitoaSBkZWYgbGluayBiYlVubWF0Y2hlZCAgICAgICAgIEVycm9yCitoaSBkZWYgbGluayBiYkluY2x1ZGUgICAgICAgICAgIEluY2x1ZGUKK2hpIGRlZiBsaW5rIGJiVG9kbyAgICAgICAgICAgICAgVG9kbworaGkgZGVmIGxpbmsgYmJDb21tZW50ICAgICAgICAgICBDb21tZW50CitoaSBkZWYgbGluayBiYlF1b3RlICAgICAgICAgICAgIFN0cmluZworaGkgZGVmIGxpbmsgYmJTdHJpbmcgICAgICAgICAgICBTdHJpbmcKK2hpIGRlZiBsaW5rIGJiRGVsaW1pdGVyICAgICAgICAgS2V5d29yZAoraGkgZGVmIGxpbmsgYmJBcnJheUJyYWNrZXRzICAgICBTdGF0ZW1lbnQKK2hpIGRlZiBsaW5rIGJiQ29udGludWUgICAgICAgICAgU3BlY2lhbAoraGkgZGVmIGxpbmsgYmJFeHBvcnQgICAgICAgICAgICBUeXBlCitoaSBkZWYgbGluayBiYkV4cG9ydEZsYWcgICAgICAgIFR5cGUKK2hpIGRlZiBsaW5rIGJiSWRlbnRpZmllcgkgICAgSWRlbnRpZmllcgoraGkgZGVmIGxpbmsgYmJWYXJEZXJlZiAgICAgICAgICBQcmVQcm9jCitoaSBkZWYgbGluayBiYlZhckRlZiAgICAgICAgICAgIElkZW50aWZpZXIKK2hpIGRlZiBsaW5rIGJiVmFyVmFsdWUgICAgICAgICAgU3RyaW5nCitoaSBkZWYgbGluayBiYlNoRmFrZVJvb3RGbGFnICAgIFR5cGUKK2hpIGRlZiBsaW5rIGJiRnVuY3Rpb24gICAgICAgICAgRnVuY3Rpb24KK2hpIGRlZiBsaW5rIGJiUHlGbGFnICAgICAgICAgICAgVHlwZQoraGkgZGVmIGxpbmsgYmJQeURlZiAgICAgICAgICAgICBTdGF0ZW1lbnQKK2hpIGRlZiBsaW5rIGJiU3RhdGVtZW50ICAgICAgICAgU3RhdGVtZW50CitoaSBkZWYgbGluayBiYlN0YXRlbWVudFJlc3QgICAgIElkZW50aWZpZXIKK2hpIGRlZiBsaW5rIGJiT0VGdW5jdGlvbnMgICAgICAgU3BlY2lhbAoraGkgZGVmIGxpbmsgYmJWYXJQeVZhbHVlICAgICAgICBQcmVQcm9jCisKK2xldCBiOmN1cnJlbnRfc3ludGF4ID0gImJiIgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9kb2MvQ09QWUlORy5HUEwgYi9iaXRiYWtlL2RvYy9DT1BZSU5HLkdQTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTExOTA1Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9kb2MvQ09QWUlORy5HUEwKQEAgLTAsMCArMSwzMzkgQEAKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisJCSAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQorCisgQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCisgb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKKwkJCSAgICBQcmVhbWJsZQorCisgIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKK2ZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlCitzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcworR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8KK3VzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkKK3RoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRvCit5b3VyIHByb2dyYW1zLCB0b28uCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAorcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQoraGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgordGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0CitpZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAoraW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgorCisgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKK2FueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KK1RoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91CitkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgorZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Cit5b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQorc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpcgorcmlnaHRzLgorCisgIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQKKygyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCitkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgorCisgIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCit0aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQorc29mdHdhcmUuICBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCit3YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbwordGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwKK2F1dGhvcnMnIHJlcHV0YXRpb25zLgorCisgIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCitwYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlCitwcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlCitwcm9ncmFtIHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkKK3BhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuCisKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCithIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAordW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAorcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCittZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgordGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKK2VpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCitsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCit0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKK2NvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKK3J1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KK2lzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgorV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCisKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCitzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKK2NvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKK2NvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKK25vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKK2FuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhlIFByb2dyYW0uCisKK1lvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoreW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KKworICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCisgICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55CisgICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKKyAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5CisgICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAorICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KKyAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKKyAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKKyAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCisgICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKKyAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAorICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KKyAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKKworVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgoraWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwKK2FuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgordGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQorc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91CitkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKK29uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgordGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKK2VudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KKworVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Cit5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KK2V4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgorY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KKworSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQord2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mCithIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgordGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwKK3VuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgorU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCisgICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQorICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucworICAgIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYikgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKKyAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91cgorICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKKyAgICBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlCisgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KKyAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlcgorICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCisgICAgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UKKyAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoCisgICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCisKK1RoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKK21ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlCitjb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueQorYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvCitjb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCitzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUKK2FueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5Citmb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQorb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQKK2l0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KKworSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZworYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudAorYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCitkaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKK2NvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCisKKyAgNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCitleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0CitvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKK3ZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KK0hvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyCit0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaAorcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgorCisgIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKK2Rpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQorcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQorbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAorYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwordGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKyAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKK29yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8KK3RoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCityZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCitZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwordGhpcyBMaWNlbnNlLgorCisgIDcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCitjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAorZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQorbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAorbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQorYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCit0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCityZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgorCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKK2FueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KK2FwcGx5IGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCitjaXJjdW1zdGFuY2VzLgorCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CitwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQorc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQoraW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzCitpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKK2dlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKK3Rocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCit0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKK2ltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCitiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKworICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCittYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKK3Rob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKK2NvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwordGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKK29mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAorYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCithZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKK2xhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKK2VpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCit0aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLgorCisgIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKK3Byb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKK3RvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCittYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscworb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAorb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKKwkJCSAgICBOTyBXQVJSQU5UWQorCisgIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQorRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCitPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCitQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAorT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKK1RPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKK1BST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAorUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORworV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgorUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKK0lOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORworT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAorVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCitZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgorUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisKKwkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKworCSAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKKworICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0CitmcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KKworICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAordG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQorY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKK3RoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCisgICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KKyAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK0lmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKK3doZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CisKKyAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIHllYXIgbmFtZSBvZiBhdXRob3IKKyAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCisgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAorICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KKworVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCitwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5CitiZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKK21vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KKyAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5CisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bworcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKK2NvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQorbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9kb2MvQ09QWUlORy5NSVQgYi9iaXRiYWtlL2RvYy9DT1BZSU5HLk1JVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTdkNTc0Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9kb2MvQ09QWUlORy5NSVQKQEAgLTAsMCArMSwxNyBAQAorUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKK2luIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKK3RvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKK2NvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCitjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVAorU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCitEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKK09USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUgorVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCmRpZmYgLS1naXQgYS9iaXRiYWtlL2RvYy9NYWtlZmlsZSBiL2JpdGJha2UvZG9jL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMjhmNGIKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2RvYy9NYWtlZmlsZQpAQCAtMCwwICsxLDkxIEBACisjIFRoaXMgaXMgYSBzaW5nbGUgTWFrZWZpbGUgdG8gaGFuZGxlIGFsbCBnZW5lcmF0ZWQgQml0QmFrZSBkb2N1bWVudHMuCisjIFRoZSBNYWtlZmlsZSBuZWVkcyB0byBsaXZlIGluIHRoZSBkb2N1bWVudGF0aW9uIGRpcmVjdG9yeSBhbmQgYWxsIGZpZ3VyZXMgdXNlZAorIyBpbiBhbnkgbWFudWFscyBtdXN0IGJlIC5QTkcgZmlsZXMgYW5kIGxpdmUgaW4gdGhlIGluZGl2aWR1YWwgYm9vaydzIGZpZ3VyZXMKKyMgZGlyZWN0b3J5LgorIworIyBUaGUgTWFrZWZpbGUgaGFzIHRoZXNlIHRhcmdldHM6CisjCisjICAgIHBkZjogICAgICBnZW5lcmF0ZXMgYSBQREYgdmVyc2lvbiBvZiBhIG1hbnVhbC4KKyMgICAgaHRtbDogICAgIGdlbmVyYXRlcyBhbiBIVE1MIHZlcnNpb24gb2YgYSBtYW51YWwuCisjICAgIHRhcmJhbGw6ICBjcmVhdGVzIGEgdGFyYmFsbCBmb3IgdGhlIGRvYyBmaWxlcy4KKyMgICAgdmFsaWRhdGU6IHZhbGlkYXRlcworIyAgICBjbGVhbjogICAgcmVtb3ZlcyBmaWxlcworIworIyBUaGUgTWFrZWZpbGUgZ2VuZXJhdGVzIGFuIEhUTUwgdmVyc2lvbiBvZiBldmVyeSBkb2N1bWVudC4gIFRoZQorIyB2YXJpYWJsZSBET0MgaW5kaWNhdGVzIHRoZSBmb2xkZXIgbmFtZSBmb3IgYSBnaXZlbiBtYW51YWwuCisjCisjIFRvIGJ1aWxkIGEgbWFudWFsLCB5b3UgbXVzdCBpbnZva2UgJ21ha2UnIHdpdGggdGhlIERPQyBhcmd1bWVudC4KKyMKKyMgRXhhbXBsZXM6CisjCisjICAgICBtYWtlIERPQz1iaXRiYWtlLXVzZXItbWFudWFsCisjICAgICBtYWtlIHBkZiBET0M9Yml0YmFrZS11c2VyLW1hbnVhbAorIworIyBUaGUgZmlyc3QgZXhhbXBsZSBnZW5lcmF0ZXMgdGhlIEhUTUwgdmVyc2lvbiBvZiB0aGUgVXNlciBNYW51YWwuCisjIFRoZSBzZWNvbmQgZXhhbXBsZSBnZW5lcmF0ZXMgdGhlIFBERiB2ZXJzaW9uIG9mIHRoZSBVc2VyIE1hbnVhbC4KKyMKKworaWZlcSAoJChET0MpLGJpdGJha2UtdXNlci1tYW51YWwpCitYU0xUT1BUUyA9IC0tc3RyaW5ncGFyYW0gaHRtbC5zdHlsZXNoZWV0IGJpdGJha2UtdXNlci1tYW51YWwtc3R5bGUuY3NzIFwKKyAgICAgICAgICAgLS1zdHJpbmdwYXJhbSAgY2hhcHRlci5hdXRvbGFiZWwgMSBcCisgICAgICAgICAgIC0tc3RyaW5ncGFyYW0gIHNlY3Rpb24uYXV0b2xhYmVsIDEgXAorICAgICAgICAgICAtLXN0cmluZ3BhcmFtICBzZWN0aW9uLmxhYmVsLmluY2x1ZGVzLmNvbXBvbmVudC5sYWJlbCAxIFwKKyAgICAgICAgICAgLS14aW5jbHVkZQorQUxMUFJFUSA9IGh0bWwgdGFyYmFsbAorVEFSRklMRVMgPSBiaXRiYWtlLXVzZXItbWFudWFsLXN0eWxlLmNzcyBiaXRiYWtlLXVzZXItbWFudWFsLmh0bWwgZmlndXJlcy9iaXRiYWtlLXRpdGxlLnBuZworTUFOVUFMUyA9ICQoRE9DKS8kKERPQykuaHRtbAorRklHVVJFUyA9IGZpZ3VyZXMKK1NUWUxFU0hFRVQgPSAkKERPQykvKi5jc3MKKworZW5kaWYKKworIyMKKyMgVGhlc2UgVVJJIHNob3VsZCBiZSByZXdyaXR0ZW4gYnkgeW91ciBkaXN0cmlidXRpb24ncyB4bWwgY2F0YWxvZyB0bworIyBtYXRjaCB5b3VyIGxvY2FseSBpbnN0YWxsZWQgWFNMIHN0eWxlc2hlZXRzLgorWFNMX0JBU0VfVVJJICA9IGh0dHA6Ly9kb2Nib29rLnNvdXJjZWZvcmdlLm5ldC9yZWxlYXNlL3hzbC9jdXJyZW50CitYU0xfWEhUTUxfVVJJID0gJChYU0xfQkFTRV9VUkkpL3hodG1sL2RvY2Jvb2sueHNsCisKK2FsbDogJChBTExQUkVRKQorCitwZGY6CitpZmVxICgkKERPQyksYml0YmFrZS11c2VyLW1hbnVhbCkKKwlAZWNobyAiICIKKwlAZWNobyAiKioqKioqKioqKiBCdWlsZGluZy4iJChET0MpCisJQGVjaG8gIiAiCisJY2QgJChET0MpOyAuLi90b29scy9kb2Nib29rLXRvLXBkZiAkKERPQykueG1sIC4uL3RlbXBsYXRlOyBjZCAuLgorZW5kaWYKKworaHRtbDoKK2lmZXEgKCQoRE9DKSxiaXRiYWtlLXVzZXItbWFudWFsKQorIyAgICAgICBTZWUgaHR0cDovL3d3dy5zYWdlaGlsbC5uZXQvZG9jYm9va3hzbC9IdG1sT3V0cHV0Lmh0bWwKKwlAZWNobyAiICIKKwlAZWNobyAiKioqKioqKiogQnVpbGRpbmcgIiQoRE9DKQorCUBlY2hvICIgIgorCWNkICQoRE9DKTsgeHNsdHByb2MgJChYU0xUT1BUUykgLW8gJChET0MpLmh0bWwgJChET0MpLWN1c3RvbWl6YXRpb24ueHNsICQoRE9DKS54bWw7IGNkIC4uCitlbmRpZgorCit0YXJiYWxsOiBodG1sCisJQGVjaG8gIiAiCisJQGVjaG8gIioqKioqKioqIENyZWF0aW5nIFRhcmJhbGwgb2YgZG9jdW1lbnQgZmlsZXMiCisJQGVjaG8gIiAiCisJY2QgJChET0MpOyB0YXIgLWN2emYgJChET0MpLnRneiAkKFRBUkZJTEVTKTsgY2QgLi4KKwordmFsaWRhdGU6CisJY2QgJChET0MpOyB4bWxsaW50IC0tcG9zdHZhbGlkIC0teGluY2x1ZGUgLS1ub291dCAkKERPQykueG1sOyBjZCAuLgorCitwdWJsaXNoOgorCUBpZiB0ZXN0IC1mICQoRE9DKS8kKERPQykuaHRtbDsgXAorCSAgdGhlbiBcCisgICAgICAgICAgICBlY2hvICIgIjsgXAorICAgICAgICAgICAgZWNobyAiKioqKioqKiogUHVibGlzaGluZyAiJChET0MpIi5odG1sIjsgXAorICAgICAgICAgICAgZWNobyAiICI7IFwKKyAgICAgICAgICAgIHNjcCAtciAkKE1BTlVBTFMpICQoU1RZTEVTSEVFVCkgZG9jcy55cDovdmFyL3d3dy93d3cueW9jdG9wcm9qZWN0Lm9yZy1kb2NzLyQoVkVSKS8kKERPQyk7IFwKKyAgICAgICAgICAgIGNkICQoRE9DKTsgc2NwIC1yICQoRklHVVJFUykgZG9jcy55cDovdmFyL3d3dy93d3cueW9jdG9wcm9qZWN0Lm9yZy1kb2NzLyQoVkVSKS8kKERPQyk7IFwKKwllbHNlIFwKKyAgICAgICAgICBlY2hvICIgIjsgXAorICAgICAgICAgIGVjaG8gJChET0MpIi5odG1sIG1pc3NpbmcuICBHZW5lcmF0ZSB0aGUgZmlsZSBmaXJzdCB0aGVuIHRyeSBhZ2Fpbi4iOyBcCisgICAgICAgICAgZWNobyAiICI7IFwKKwlmaQorCitjbGVhbjoKKwlybSAtcmYgJChNQU5VQUxTKTsgcm0gJChET0MpLyQoRE9DKS50Z3o7CmRpZmYgLS1naXQgYS9iaXRiYWtlL2RvYy9SRUFETUUgYi9iaXRiYWtlL2RvYy9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAzY2Y4ZQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvZG9jL1JFQURNRQpAQCAtMCwwICsxLDM5IEBACitEb2N1bWVudGF0aW9uCis9PT09PT09PT09PT09CisKK1RoaXMgaXMgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRoZSBCaXRCYWtlIGRvY3VtZW50YXRpb24uIAorCitNYW51YWwgT3JnYW5pemF0aW9uCis9PT09PT09PT09PT09PT09PT09CisKK0ZvbGRlcnMgZXhpc3QgZm9yIGluZGl2aWR1YWwgbWFudWFscyBhcyBmb2xsb3dzOgorCisqIGJpdGJha2UtdXNlci1tYW51YWwgICAgICAtIFRoZSBCaXRCYWtlIFVzZXIgTWFudWFsIAorCitFYWNoIGZvbGRlciBpcyBzZWxmLWNvbnRhaW5lZCByZWdhcmRpbmcgY29udGVudCBhbmQgZmlndXJlcy4KKworSWYgeW91IHdhbnQgdG8gZmluZCBIVE1MIHZlcnNpb25zIG9mIHRoZSBCaXRCYWtlIG1hbnVhbHMgb24gdGhlIHdlYiwgCitnbyB0byBodHRwOi8vd3d3Lm9wZW5lbWJlZGRlZC5vcmcvd2lraS9Eb2N1bWVudGF0aW9uLiAKKworTWFrZWZpbGUKKz09PT09PT09CisKK1RoZSBNYWtlZmlsZSBwcm9jZXNzZXMgbWFudWFsIGRpcmVjdG9yaWVzIHRvIGNyZWF0ZSBIVE1MLCBQREYsCit0YXJiYWxscywgZXRjLiAgRGV0YWlscyBvbiBob3cgdGhlIE1ha2VmaWxlIHdvcmsgYXJlIGRvY3VtZW50ZWQKK2luc2lkZSB0aGUgTWFrZWZpbGUuICBTZWUgdGhhdCBmaWxlIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCitUbyBidWlsZCBhIG1hbnVhbCwgeW91IHJ1biB0aGUgbWFrZSBjb21tYW5kIGFuZCBwYXNzIGl0IHRoZSBuYW1lCitvZiB0aGUgZm9sZGVyIGNvbnRhaW5pbmcgdGhlIG1hbnVhbCdzIGNvbnRlbnRzLiAKK0ZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvbW1hbmQgcnVuIGZyb20gdGhlIGRvY3VtZW50YXRpb24gZGlyZWN0b3J5IAorY3JlYXRlcyBhbiBIVE1MIGFuZCBhIFBERiB2ZXJzaW9uIG9mIHRoZSBCaXRCYWtlIFVzZXIgTWFudWFsLgorVGhlIERPQyB2YXJpYWJsZSBzcGVjaWZpZXMgdGhlIG1hbnVhbCB5b3UgYXJlIG1ha2luZzoKKworICAgICAkIG1ha2UgRE9DPWJpdGJha2UtdXNlci1tYW51YWwKKwordGVtcGxhdGUKKz09PT09PT09CitDb250YWlucyB2YXJpb3VzIHRlbXBsYXRlcywgZm9udHMsIGFuZCBzb21lIG9sZCBQTkcgZmlsZXMuCisKK3Rvb2xzCis9PT09PQorQ29udGFpbnMgYSB0b29sIHRvIGNvbnZlcnQgdGhlIERvY0Jvb2sgZmlsZXMgdG8gUERGIGZvcm1hdC4KZGlmZiAtLWdpdCBhL2JpdGJha2UvZG9jL2JpdGJha2UtdXNlci1tYW51YWwvYml0YmFrZS11c2VyLW1hbnVhbC1jdXN0b21pemF0aW9uLnhzbCBiL2JpdGJha2UvZG9jL2JpdGJha2UtdXNlci1tYW51YWwvYml0YmFrZS11c2VyLW1hbnVhbC1jdXN0b21pemF0aW9uLnhzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTg1ZWE3Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9kb2MvYml0YmFrZS11c2VyLW1hbnVhbC9iaXRiYWtlLXVzZXItbWFudWFsLWN1c3RvbWl6YXRpb24ueHNsCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249JzEuMCc/PgorPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sbnM6Zm89Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML0Zvcm1hdCIgdmVyc2lvbj0iMS4wIj4KKworICA8eHNsOmltcG9ydCBocmVmPSJodHRwOi8vZG93bmxvYWRzLnlvY3RvcHJvamVjdC5vcmcvbWlycm9yL2RvY2Jvb2stbWlycm9yL2RvY2Jvb2steHNsLTEuNzYuMS94aHRtbC9kb2Nib29rLnhzbCIgLz4KKworPCEtLQorCisgIDx4c2w6aW1wb3J0IGhyZWY9Ii4uL3RlbXBsYXRlLzEuNzYuMS9kb2Nib29rLXhzbC0xLjc2LjEveGh0bWwvZG9jYm9vay54c2wiIC8+CisKKyAgPHhzbDppbXBvcnQgaHJlZj0iaHR0cDovL2RvY2Jvb2suc291cmNlZm9yZ2UubmV0L3JlbGVhc2UveHNsLzEuNzYuMS94aHRtbC9kb2Nib29rLnhzbCIgLz4KKworLS0+CisKKyAgPHhzbDppbmNsdWRlIGhyZWY9Ii4uL3RlbXBsYXRlL3Blcm1hbGlua3MueHNsIi8+CisgIDx4c2w6aW5jbHVkZSBocmVmPSIuLi90ZW1wbGF0ZS9zZWN0aW9uLnRpdGxlLnhzbCIvPgorICA8eHNsOmluY2x1ZGUgaHJlZj0iLi4vdGVtcGxhdGUvY29tcG9uZW50LnRpdGxlLnhzbCIvPgorICA8eHNsOmluY2x1ZGUgaHJlZj0iLi4vdGVtcGxhdGUvZGl2aXNpb24udGl0bGUueHNsIi8+CisgIDx4c2w6aW5jbHVkZSBocmVmPSIuLi90ZW1wbGF0ZS9mb3JtYWwub2JqZWN0LmhlYWRpbmcueHNsIi8+CisgIDx4c2w6aW5jbHVkZSBocmVmPSIuLi90ZW1wbGF0ZS9nbG9zcy1wZXJtYWxpbmtzLnhzbCIvPgorCisgIDx4c2w6cGFyYW0gbmFtZT0iaHRtbC5zdHlsZXNoZWV0IiBzZWxlY3Q9Iid1c2VyLW1hbnVhbC1zdHlsZS5jc3MnIiAvPgorICA8eHNsOnBhcmFtIG5hbWU9ImNoYXB0ZXIuYXV0b2xhYmVsIiBzZWxlY3Q9IjEiIC8+CisgIDx4c2w6cGFyYW0gbmFtZT0ic2VjdGlvbi5hdXRvbGFiZWwiIHNlbGVjdD0iMSIgLz4KKyAgPHhzbDpwYXJhbSBuYW1lPSJzZWN0aW9uLmxhYmVsLmluY2x1ZGVzLmNvbXBvbmVudC5sYWJlbCIgc2VsZWN0PSIxIiAvPgorICA8eHNsOnBhcmFtIG5hbWU9ImFwcGVuZGl4LmF1dG9sYWJlbCI+QTwveHNsOnBhcmFtPgorCis8IS0tICA8eHNsOnBhcmFtIG5hbWU9ImdlbmVyYXRlLnRvYyIgc2VsZWN0PSInYXJ0aWNsZSBub3AnIj48L3hzbDpwYXJhbT4gIC0tPgorCis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9kb2MvYml0YmFrZS11c2VyLW1hbnVhbC9iaXRiYWtlLXVzZXItbWFudWFsLWV4ZWN1dGlvbi54bWwgYi9iaXRiYWtlL2RvYy9iaXRiYWtlLXVzZXItbWFudWFsL2JpdGJha2UtdXNlci1tYW51YWwtZXhlY3V0aW9uLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTUyZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9kb2MvYml0YmFrZS11c2VyLW1hbnVhbC9iaXRiYWtlLXVzZXItbWFudWFsLWV4ZWN1dGlvbi54bWwKQEAgLTAsMCArMSw5MTIgQEAKKzwhRE9DVFlQRSBjaGFwdGVyIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBEb2NCb29rIFhNTCBWNC4yLy9FTiIKKyJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuMi9kb2Nib29reC5kdGQiPgorCis8Y2hhcHRlciBpZD0iYml0YmFrZS11c2VyLW1hbnVhbC1leGVjdXRpb24iPgorICAgIDx0aXRsZT5FeGVjdXRpb248L3RpdGxlPgorCisgICAgPHBhcmE+CisgICAgICAgIFRoZSBwcmltYXJ5IHB1cnBvc2UgZm9yIHJ1bm5pbmcgQml0QmFrZSBpcyB0byBwcm9kdWNlIHNvbWUga2luZAorICAgICAgICBvZiBvdXRwdXQgc3VjaCBhcyBhIHNpbmdsZSBpbnN0YWxsYWJsZSBwYWNrYWdlLCBhIGtlcm5lbCwgYSBzb2Z0d2FyZQorICAgICAgICBkZXZlbG9wbWVudCBraXQsIG9yIGV2ZW4gYSBmdWxsLCBib2FyZC1zcGVjaWZpYyBib290YWJsZSBMaW51eCBpbWFnZSwKKyAgICAgICAgY29tcGxldGUgd2l0aCBib290bG9hZGVyLCBrZXJuZWwsIGFuZCByb290IGZpbGVzeXN0ZW0uCisgICAgICAgIE9mIGNvdXJzZSwgeW91IGNhbiBleGVjdXRlIHRoZSA8ZmlsZW5hbWU+Yml0YmFrZTwvZmlsZW5hbWU+CisgICAgICAgIGNvbW1hbmQgd2l0aCBvcHRpb25zIHRoYXQgY2F1c2UgaXQgdG8gZXhlY3V0ZSBzaW5nbGUgdGFza3MsCisgICAgICAgIGNvbXBpbGUgc2luZ2xlIHJlY2lwZSBmaWxlcywgY2FwdHVyZSBvciBjbGVhciBkYXRhLCBvciBzaW1wbHkKKyAgICAgICAgcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnQuCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICAgIFRoaXMgY2hhcHRlciBkZXNjcmliZXMgQml0QmFrZSdzIGV4ZWN1dGlvbiBwcm9jZXNzIGZyb20gc3RhcnQKKyAgICAgICAgdG8gZmluaXNoIHdoZW4geW91IHVzZSBpdCB0byBjcmVhdGUgYW4gaW1hZ2UuCisgICAgICAgIFRoZSBleGVjdXRpb24gcHJvY2VzcyBpcyBsYXVuY2hlZCB1c2luZyB0aGUgZm9sbG93aW5nIGNvbW1hbmQKKyAgICAgICAgZm9ybToKKyAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICAkIGJpdGJha2UgPHJlcGxhY2VhYmxlPnRhcmdldDwvcmVwbGFjZWFibGU+CisgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgRm9yIGluZm9ybWF0aW9uIG9uIHRoZSBCaXRCYWtlIGNvbW1hbmQgYW5kIGl0cyBvcHRpb25zLAorICAgICAgICBzZWUKKyAgICAgICAgIjxsaW5rIGxpbmtlbmQ9J2JpdGJha2UtdXNlci1tYW51YWwtY29tbWFuZCc+VGhlIEJpdEJha2UgQ29tbWFuZDwvbGluaz4iCisgICAgICAgIHNlY3Rpb24uCisgICAgICAgIDxub3RlPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgUHJpb3IgdG8gZXhlY3V0aW5nIEJpdEJha2UsIHlvdSBzaG91bGQgdGFrZSBhZHZhbnRhZ2Ugb2YgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgcGFyYWxsZWwgdGhyZWFkIGV4ZWN1dGlvbiBvbiB5b3VyIGJ1aWxkIGhvc3QgYnkgc2V0dGluZyB0aGUKKyAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItQkJfTlVNQkVSX1RIUkVBRFMnPjxmaWxlbmFtZT5CQl9OVU1CRVJfVEhSRUFEUzwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgICAgIHZhcmlhYmxlIGluIHlvdXIgcHJvamVjdCdzIDxmaWxlbmFtZT5sb2NhbC5jb25mPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEEgY29tbW9uIG1ldGhvZCB0byBkZXRlcm1pbmUgdGhpcyB2YWx1ZSBmb3IgeW91ciBidWlsZCBob3N0IGlzIHRvIHJ1bgorICAgICAgICAgICAgICAgIHRoZSBmb2xsb3dpbmc6CisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICAkIGdyZXAgcHJvY2Vzc29yIC9wcm9jL2NwdWluZm8KKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgVGhpcyBjb21tYW5kIHJldHVybnMgdGhlIG51bWJlciBvZiBwcm9jZXNzb3JzLCB3aGljaCB0YWtlcyBpbnRvIAorICAgICAgICAgICAgICAgIGFjY291bnQgaHlwZXItdGhyZWFkaW5nLiAKKyAgICAgICAgICAgICAgICBUaHVzLCBhIHF1YWQtY29yZSBidWlsZCBob3N0IHdpdGggaHlwZXItdGhyZWFkaW5nIG1vc3QgbGlrZWx5IAorICAgICAgICAgICAgICAgIHNob3dzIGVpZ2h0IHByb2Nlc3NvcnMsIHdoaWNoIGlzIHRoZSB2YWx1ZSB5b3Ugd291bGQgdGhlbiBhc3NpZ24gdG8KKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+QkJfTlVNQkVSX1RIUkVBRFM8L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQSBwb3NzaWJseSBzaW1wbGVyIHNvbHV0aW9uIGlzIHRoYXQgc29tZSBMaW51eCBkaXN0cmlidXRpb25zCisgICAgICAgICAgICAgICAgKGUuZy4gRGViaWFuIGFuZCBVYnVudHUpIHByb3ZpZGUgdGhlIDxmaWxlbmFtZT5uY3B1czwvZmlsZW5hbWU+IGNvbW1hbmQuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbm90ZT4KKyAgICA8L3BhcmE+CisKKyAgICA8c2VjdGlvbiBpZD0ncGFyc2luZy10aGUtYmFzZS1jb25maWd1cmF0aW9uLW1ldGFkYXRhJz4KKyAgICAgICAgPHRpdGxlPlBhcnNpbmcgdGhlIEJhc2UgQ29uZmlndXJhdGlvbiBNZXRhZGF0YTwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGUgZmlyc3QgdGhpbmcgQml0QmFrZSBkb2VzIGlzIHBhcnNlIGJhc2UgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgbWV0YWRhdGEuCisgICAgICAgICAgICBCYXNlIGNvbmZpZ3VyYXRpb24gbWV0YWRhdGEgY29uc2lzdHMgb2YgeW91ciBwcm9qZWN0J3MKKyAgICAgICAgICAgIDxmaWxlbmFtZT5iYmxheWVycy5jb25mPC9maWxlbmFtZT4gZmlsZSB0byBkZXRlcm1pbmUgd2hhdAorICAgICAgICAgICAgbGF5ZXJzIEJpdEJha2UgbmVlZHMgdG8gcmVjb2duaXplLCBhbGwgbmVjZXNzYXJ5CisgICAgICAgICAgICA8ZmlsZW5hbWU+bGF5ZXIuY29uZjwvZmlsZW5hbWU+IGZpbGVzIChvbmUgZnJvbSBlYWNoIGxheWVyKSwKKyAgICAgICAgICAgIGFuZCA8ZmlsZW5hbWU+Yml0YmFrZS5jb25mPC9maWxlbmFtZT4uCisgICAgICAgICAgICBUaGUgZGF0YSBpdHNlbGYgaXMgb2YgdmFyaW91cyB0eXBlczoKKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz5SZWNpcGVzOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIERldGFpbHMgYWJvdXQgcGFydGljdWxhciBwaWVjZXMgb2Ygc29mdHdhcmUuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+Q2xhc3MgRGF0YTo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICBBbiBhYnN0cmFjdGlvbiBvZiBjb21tb24gYnVpbGQgaW5mb3JtYXRpb24KKyAgICAgICAgICAgICAgICAgICAgKGUuZy4gaG93IHRvIGJ1aWxkIGEgTGludXgga2VybmVsKS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz5Db25maWd1cmF0aW9uIERhdGE6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgTWFjaGluZS1zcGVjaWZpYyBzZXR0aW5ncywgcG9saWN5IGRlY2lzaW9ucywKKyAgICAgICAgICAgICAgICAgICAgYW5kIHNvIGZvcnRoLgorICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uIGRhdGEgYWN0cyBhcyB0aGUgZ2x1ZSB0byBiaW5kIGV2ZXJ5dGhpbmcKKyAgICAgICAgICAgICAgICAgICAgdG9nZXRoZXIuPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlIDxmaWxlbmFtZT5sYXllci5jb25mPC9maWxlbmFtZT4gZmlsZXMgYXJlIHVzZWQgdG8KKyAgICAgICAgICAgIGNvbnN0cnVjdCBrZXkgdmFyaWFibGVzIHN1Y2ggYXMKKyAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1CQlBBVEgnPjxmaWxlbmFtZT5CQlBBVEg8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgIGFuZAorICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUJCRklMRVMnPjxmaWxlbmFtZT5CQkZJTEVTPC9maWxlbmFtZT48L2xpbms+LgorICAgICAgICAgICAgPGZpbGVuYW1lPkJCUEFUSDwvZmlsZW5hbWU+IGlzIHVzZWQgdG8gc2VhcmNoIGZvcgorICAgICAgICAgICAgY29uZmlndXJhdGlvbiBhbmQgY2xhc3MgZmlsZXMgdW5kZXIgdGhlCisgICAgICAgICAgICA8ZmlsZW5hbWU+Y29uZjwvZmlsZW5hbWU+IGFuZCA8ZmlsZW5hbWU+Y2xhc3NlczwvZmlsZW5hbWU+CisgICAgICAgICAgICBkaXJlY3RvcmllcywgcmVzcGVjdGl2ZWx5LgorICAgICAgICAgICAgPGZpbGVuYW1lPkJCRklMRVM8L2ZpbGVuYW1lPiBpcyB1c2VkIHRvIGxvY2F0ZSBib3RoIHJlY2lwZQorICAgICAgICAgICAgYW5kIHJlY2lwZSBhcHBlbmQgZmlsZXMKKyAgICAgICAgICAgICg8ZmlsZW5hbWU+LmJiPC9maWxlbmFtZT4gYW5kIDxmaWxlbmFtZT4uYmJhcHBlbmQ8L2ZpbGVuYW1lPikuCisgICAgICAgICAgICBJZiB0aGVyZSBpcyBubyA8ZmlsZW5hbWU+YmJsYXllcnMuY29uZjwvZmlsZW5hbWU+IGZpbGUsCisgICAgICAgICAgICBpdCBpcyBhc3N1bWVkIHRoZSB1c2VyIGhhcyBzZXQgdGhlIDxmaWxlbmFtZT5CQlBBVEg8L2ZpbGVuYW1lPgorICAgICAgICAgICAgYW5kIDxmaWxlbmFtZT5CQkZJTEVTPC9maWxlbmFtZT4gZGlyZWN0bHkgaW4gdGhlIGVudmlyb25tZW50LgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBOZXh0LCB0aGUgPGZpbGVuYW1lPmJpdGJha2UuY29uZjwvZmlsZW5hbWU+IGZpbGUgaXMgbG9jYXRlZAorICAgICAgICAgICAgdXNpbmcgdGhlIDxmaWxlbmFtZT5CQlBBVEg8L2ZpbGVuYW1lPiB2YXJpYWJsZSB0aGF0IHdhcworICAgICAgICAgICAganVzdCBjb25zdHJ1Y3RlZC4KKyAgICAgICAgICAgIFRoZSA8ZmlsZW5hbWU+Yml0YmFrZS5jb25mPC9maWxlbmFtZT4gZmlsZSBtYXkgYWxzbyBpbmNsdWRlIG90aGVyCisgICAgICAgICAgICBjb25maWd1cmF0aW9uIGZpbGVzIHVzaW5nIHRoZQorICAgICAgICAgICAgPGZpbGVuYW1lPmluY2x1ZGU8L2ZpbGVuYW1lPiBvcgorICAgICAgICAgICAgPGZpbGVuYW1lPnJlcXVpcmU8L2ZpbGVuYW1lPiBkaXJlY3RpdmVzLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBQcmlvciB0byBwYXJzaW5nIGNvbmZpZ3VyYXRpb24gZmlsZXMsIEJpdGJha2UgbG9va3MKKyAgICAgICAgICAgIGF0IGNlcnRhaW4gdmFyaWFibGVzLCBpbmNsdWRpbmc6CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSd2YXItQkJfRU5WX1dISVRFTElTVCc+PGZpbGVuYW1lPkJCX0VOVl9XSElURUxJU1Q8L2ZpbGVuYW1lPjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0ndmFyLUJCX1BSRVNFUlZFX0VOVic+PGZpbGVuYW1lPkJCX1BSRVNFUlZFX0VOVjwvZmlsZW5hbWU+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSd2YXItQkJfRU5WX0VYVFJBV0hJVEUnPjxmaWxlbmFtZT5CQl9FTlZfRVhUUkFXSElURTwvZmlsZW5hbWU+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUJJVEJBS0VfVUknPjxmaWxlbmFtZT5CSVRCQUtFX1VJPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICBZb3UgY2FuIGZpbmQgaW5mb3JtYXRpb24gb24gaG93IHRvIHBhc3MgZW52aXJvbm1lbnQgdmFyaWFibGVzIGludG8gdGhlIEJpdEJha2UKKyAgICAgICAgICAgIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCBpbiB0aGUKKyAgICAgICAgICAgICI8bGluayBsaW5rZW5kPSdwYXNzaW5nLWluZm9ybWF0aW9uLWludG8tdGhlLWJ1aWxkLXRhc2stZW52aXJvbm1lbnQnPlBhc3NpbmcgSW5mb3JtYXRpb24gSW50byB0aGUgQnVpbGQgVGFzayBFbnZpcm9ubWVudDwvbGluaz4iIHNlY3Rpb24uCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSBiYXNlIGNvbmZpZ3VyYXRpb24gbWV0YWRhdGEgaXMgZ2xvYmFsCisgICAgICAgICAgICBhbmQgdGhlcmVmb3JlIGFmZmVjdHMgYWxsIHJlY2lwZXMgYW5kIHRhc2tzIHRoYXQgYXJlIGV4ZWN1dGVkLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBCaXRCYWtlIGZpcnN0IHNlYXJjaGVzIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGZvciBhbgorICAgICAgICAgICAgb3B0aW9uYWwgPGZpbGVuYW1lPmNvbmYvYmJsYXllcnMuY29uZjwvZmlsZW5hbWU+IGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgICAgICAgICAgIFRoaXMgZmlsZSBpcyBleHBlY3RlZCB0byBjb250YWluIGEKKyAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1CQkxBWUVSUyc+PGZpbGVuYW1lPkJCTEFZRVJTPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICB2YXJpYWJsZSB0aGF0IGlzIGEgc3BhY2UtZGVsaW1pdGVkIGxpc3Qgb2YgJ2xheWVyJyBkaXJlY3Rvcmllcy4KKyAgICAgICAgICAgIFJlY2FsbCB0aGF0IGlmIEJpdEJha2UgY2Fubm90IGZpbmQgYSA8ZmlsZW5hbWU+YmJsYXllcnMuY29uZjwvZmlsZW5hbWU+CisgICAgICAgICAgICBmaWxlLCB0aGVuIGl0IGlzIGFzc3VtZWQgdGhlIHVzZXIgaGFzIHNldCB0aGUgPGZpbGVuYW1lPkJCUEFUSDwvZmlsZW5hbWU+CisgICAgICAgICAgICBhbmQgPGZpbGVuYW1lPkJCRklMRVM8L2ZpbGVuYW1lPiB2YXJpYWJsZXMgZGlyZWN0bHkgaW4gdGhlIGVudmlyb25tZW50LgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBGb3IgZWFjaCBkaXJlY3RvcnkgKGxheWVyKSBpbiB0aGlzIGxpc3QsIGEgPGZpbGVuYW1lPmNvbmYvbGF5ZXIuY29uZjwvZmlsZW5hbWU+CisgICAgICAgICAgICBmaWxlIGlzIGxvY2F0ZWQgYW5kIHBhcnNlZCB3aXRoIHRoZQorICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUxBWUVSRElSJz48ZmlsZW5hbWU+TEFZRVJESVI8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgIHZhcmlhYmxlIGJlaW5nIHNldCB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBsYXllciB3YXMgZm91bmQuCisgICAgICAgICAgICBUaGUgaWRlYSBpcyB0aGVzZSBmaWxlcyBhdXRvbWF0aWNhbGx5IHNldCB1cAorICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUJCUEFUSCc+PGZpbGVuYW1lPkJCUEFUSDwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgYW5kIG90aGVyIHZhcmlhYmxlcyBjb3JyZWN0bHkgZm9yIGEgZ2l2ZW4gYnVpbGQgZGlyZWN0b3J5LgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBCaXRCYWtlIHRoZW4gZXhwZWN0cyB0byBmaW5kIHRoZSA8ZmlsZW5hbWU+Y29uZi9iaXRiYWtlLmNvbmY8L2ZpbGVuYW1lPgorICAgICAgICAgICAgZmlsZSBzb21ld2hlcmUgaW4gdGhlIHVzZXItc3BlY2lmaWVkIDxmaWxlbmFtZT5CQlBBVEg8L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgIFRoYXQgY29uZmlndXJhdGlvbiBmaWxlIGdlbmVyYWxseSBoYXMgaW5jbHVkZSBkaXJlY3RpdmVzIHRvIHB1bGwKKyAgICAgICAgICAgIGluIGFueSBvdGhlciBtZXRhZGF0YSBzdWNoIGFzIGZpbGVzIHNwZWNpZmljIHRvIHRoZSBhcmNoaXRlY3R1cmUsCisgICAgICAgICAgICB0aGUgbWFjaGluZSwgdGhlIGxvY2FsIGVudmlyb25tZW50LCBhbmQgc28gZm9ydGguCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIE9ubHkgdmFyaWFibGUgZGVmaW5pdGlvbnMgYW5kIGluY2x1ZGUgZGlyZWN0aXZlcyBhcmUgYWxsb3dlZAorICAgICAgICAgICAgaW4gQml0QmFrZSA8ZmlsZW5hbWU+LmNvbmY8L2ZpbGVuYW1lPiBmaWxlcy4KKyAgICAgICAgICAgIFNvbWUgdmFyaWFibGVzIGRpcmVjdGx5IGluZmx1ZW5jZSBCaXRCYWtlJ3MgYmVoYXZpb3IuCisgICAgICAgICAgICBUaGVzZSB2YXJpYWJsZXMgbWlnaHQgaGF2ZSBiZWVuIHNldCBmcm9tIHRoZSBlbnZpcm9ubWVudAorICAgICAgICAgICAgZGVwZW5kaW5nIG9uIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcHJldmlvdXNseQorICAgICAgICAgICAgbWVudGlvbmVkIG9yIHNldCBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlcy4KKyAgICAgICAgICAgIFRoZQorICAgICAgICAgICAgIjxsaW5rIGxpbmtlbmQ9J3JlZi12YXJpYWJsZXMtZ2xvcyc+VmFyaWFibGVzIEdsb3NzYXJ5PC9saW5rPiIKKyAgICAgICAgICAgIGNoYXB0ZXIgcHJlc2VudHMgYSBmdWxsIGxpc3Qgb2YgdmFyaWFibGVzLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBBZnRlciBwYXJzaW5nIGNvbmZpZ3VyYXRpb24gZmlsZXMsIEJpdEJha2UgdXNlcyBpdHMgcnVkaW1lbnRhcnkKKyAgICAgICAgICAgIGluaGVyaXRhbmNlIG1lY2hhbmlzbSwgd2hpY2ggaXMgdGhyb3VnaCBjbGFzcyBmaWxlcywgdG8gaW5oZXJpdAorICAgICAgICAgICAgc29tZSBzdGFuZGFyZCBjbGFzc2VzLgorICAgICAgICAgICAgQml0QmFrZSBwYXJzZXMgYSBjbGFzcyB3aGVuIHRoZSBpbmhlcml0IGRpcmVjdGl2ZSByZXNwb25zaWJsZQorICAgICAgICAgICAgZm9yIGdldHRpbmcgdGhhdCBjbGFzcyBpcyBlbmNvdW50ZXJlZC4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlIDxmaWxlbmFtZT5iYXNlLmJiY2xhc3M8L2ZpbGVuYW1lPiBmaWxlIGlzIGFsd2F5cyBpbmNsdWRlZC4KKyAgICAgICAgICAgIE90aGVyIGNsYXNzZXMgdGhhdCBhcmUgc3BlY2lmaWVkIGluIHRoZSBjb25maWd1cmF0aW9uIHVzaW5nIHRoZQorICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUlOSEVSSVQnPjxmaWxlbmFtZT5JTkhFUklUPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICB2YXJpYWJsZSBhcmUgYWxzbyBpbmNsdWRlZC4KKyAgICAgICAgICAgIEJpdEJha2Ugc2VhcmNoZXMgZm9yIGNsYXNzIGZpbGVzIGluIGEKKyAgICAgICAgICAgIDxmaWxlbmFtZT5jbGFzc2VzPC9maWxlbmFtZT4gc3ViZGlyZWN0b3J5IHVuZGVyCisgICAgICAgICAgICB0aGUgcGF0aHMgaW4gPGZpbGVuYW1lPkJCUEFUSDwvZmlsZW5hbWU+IGluIHRoZSBzYW1lIHdheSBhcworICAgICAgICAgICAgY29uZmlndXJhdGlvbiBmaWxlcy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQSBnb29kIHdheSB0byBnZXQgYW4gaWRlYSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlcyBhbmQKKyAgICAgICAgICAgIHRoZSBjbGFzcyBmaWxlcyB1c2VkIGluIHlvdXIgZXhlY3V0aW9uIGVudmlyb25tZW50IGlzIHRvCisgICAgICAgICAgICBydW4gdGhlIGZvbGxvd2luZyBCaXRCYWtlIGNvbW1hbmQ6CisgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgICQgYml0YmFrZSAtZSA+IG15YmIubG9nCisgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICBFeGFtaW5pbmcgdGhlIHRvcCBvZiB0aGUgPGZpbGVuYW1lPm15YmIubG9nPC9maWxlbmFtZT4KKyAgICAgICAgICAgIHNob3dzIHlvdSB0aGUgbWFueSBjb25maWd1cmF0aW9uIGZpbGVzIGFuZCBjbGFzcyBmaWxlcworICAgICAgICAgICAgdXNlZCBpbiB5b3VyIGV4ZWN1dGlvbiBlbnZpcm9ubWVudC4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxub3RlPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgWW91IG5lZWQgdG8gYmUgYXdhcmUgb2YgaG93IEJpdEJha2UgcGFyc2VzIGN1cmx5IGJyYWNlcy4KKyAgICAgICAgICAgICAgICBJZiBhIHJlY2lwZSB1c2VzIGEgY2xvc2luZyBjdXJseSBicmFjZSB3aXRoaW4gdGhlIGZ1bmN0aW9uIGFuZAorICAgICAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgaGFzIG5vIGxlYWRpbmcgc3BhY2VzLCBCaXRCYWtlIHByb2R1Y2VzIGEgcGFyc2luZworICAgICAgICAgICAgICAgIGVycm9yLgorICAgICAgICAgICAgICAgIElmIHlvdSB1c2UgYSBwYWlyIG9mIGN1cmx5IGJyYWNlcyBpbiBhIHNoZWxsIGZ1bmN0aW9uLCB0aGUKKyAgICAgICAgICAgICAgICBjbG9zaW5nIGN1cmx5IGJyYWNlIG11c3Qgbm90IGJlIGxvY2F0ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lCisgICAgICAgICAgICAgICAgd2l0aG91dCBsZWFkaW5nIHNwYWNlcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgSGVyZSBpcyBhbiBleGFtcGxlIHRoYXQgY2F1c2VzIEJpdEJha2UgdG8gcHJvZHVjZSBhIHBhcnNpbmcKKyAgICAgICAgICAgICAgICBlcnJvcjoKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIGZha2Vyb290IGNyZWF0ZV9zaGFyKCkgeworICAgICAgICAgY2F0ICZsdDsmbHQ7ICJFT0YiICZndDsgJHtTREtfREVQTE9ZfS8ke1RPT0xDSEFJTl9PVVRQVVROQU1FfS5zaAorICAgICB1c2FnZSgpCisgICAgIHsKKyAgICAgICBlY2hvICJ0ZXN0IgorICAgICAgICMjIyMjIyBUaGUgZm9sbG93aW5nICJ9IiBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUgY2F1c2VzIGEgcGFyc2luZyBlcnJvciAjIyMjIyMKKyAgICAgfQorICAgICBFT0YKKyAgICAgfQorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICBXcml0aW5nIHRoZSByZWNpcGUgdGhpcyB3YXkgYXZvaWRzIHRoZSBlcnJvcjoKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIGZha2Vyb290IGNyZWF0ZV9zaGFyKCkgeworICAgICAgICAgY2F0ICZsdDsmbHQ7ICJFT0YiICZndDsgJHtTREtfREVQTE9ZfS8ke1RPT0xDSEFJTl9PVVRQVVROQU1FfS5zaAorICAgICB1c2FnZSgpCisgICAgIHsKKyAgICAgICBlY2hvICJ0ZXN0IgorICAgICAgICMjIyMjI1RoZSBmb2xsb3dpbmcgIn0iIHdpdGggYSBsZWFkaW5nIHNwYWNlIGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZSBhdm9pZHMgdGhlIGVycm9yICMjIyMjIworICAgICAgfQorICAgICBFT0YKKyAgICAgfQorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9ub3RlPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIGlkPSdsb2NhdGluZy1hbmQtcGFyc2luZy1yZWNpcGVzJz4KKyAgICAgICAgPHRpdGxlPkxvY2F0aW5nIGFuZCBQYXJzaW5nIFJlY2lwZXM8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgRHVyaW5nIHRoZSBjb25maWd1cmF0aW9uIHBoYXNlLCBCaXRCYWtlIHdpbGwgaGF2ZSBzZXQKKyAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1CQkZJTEVTJz48ZmlsZW5hbWU+QkJGSUxFUzwvZmlsZW5hbWU+PC9saW5rPi4KKyAgICAgICAgICAgIEJpdEJha2Ugbm93IHVzZXMgaXQgdG8gY29uc3RydWN0IGEgbGlzdCBvZiByZWNpcGVzIHRvIHBhcnNlLAorICAgICAgICAgICAgYWxvbmcgd2l0aCBhbnkgYXBwZW5kIGZpbGVzICg8ZmlsZW5hbWU+LmJiYXBwZW5kPC9maWxlbmFtZT4pCisgICAgICAgICAgICB0byBhcHBseS4KKyAgICAgICAgICAgIDxmaWxlbmFtZT5CQkZJTEVTPC9maWxlbmFtZT4gaXMgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZgorICAgICAgICAgICAgYXZhaWxhYmxlIGZpbGVzIGFuZCBzdXBwb3J0cyB3aWxkY2FyZHMuCisgICAgICAgICAgICBBbiBleGFtcGxlIHdvdWxkIGJlOgorICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBCQkZJTEVTID0gIi9wYXRoL3RvL2JiZmlsZXMvKi5iYiAvcGF0aC90by9hcHBlbmRzLyouYmJhcHBlbmQiCisgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICBCaXRCYWtlIHBhcnNlcyBlYWNoIHJlY2lwZSBhbmQgYXBwZW5kIGZpbGUgbG9jYXRlZAorICAgICAgICAgICAgd2l0aCA8ZmlsZW5hbWU+QkJGSUxFUzwvZmlsZW5hbWU+IGFuZCBzdG9yZXMgdGhlIHZhbHVlcyBvZgorICAgICAgICAgICAgdmFyaW91cyB2YXJpYWJsZXMgaW50byB0aGUgZGF0YXN0b3JlLgorICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgQXBwZW5kIGZpbGVzIGFyZSBhcHBsaWVkIGluIHRoZSBvcmRlciB0aGV5IGFyZSBlbmNvdW50ZXJlZCBpbgorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5CQkZJTEVTPC9maWxlbmFtZT4uCisgICAgICAgICAgICA8L25vdGU+CisgICAgICAgICAgICBGb3IgZWFjaCBmaWxlLCBhIGZyZXNoIGNvcHkgb2YgdGhlIGJhc2UgY29uZmlndXJhdGlvbiBpcworICAgICAgICAgICAgbWFkZSwgdGhlbiB0aGUgcmVjaXBlIGlzIHBhcnNlZCBsaW5lIGJ5IGxpbmUuCisgICAgICAgICAgICBBbnkgaW5oZXJpdCBzdGF0ZW1lbnRzIGNhdXNlIEJpdEJha2UgdG8gZmluZCBhbmQKKyAgICAgICAgICAgIHRoZW4gcGFyc2UgY2xhc3MgZmlsZXMgKDxmaWxlbmFtZT4uYmJjbGFzczwvZmlsZW5hbWU+KQorICAgICAgICAgICAgdXNpbmcKKyAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1CQlBBVEgnPjxmaWxlbmFtZT5CQlBBVEg8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgIGFzIHRoZSBzZWFyY2ggcGF0aC4KKyAgICAgICAgICAgIEZpbmFsbHksIEJpdEJha2UgcGFyc2VzIGluIG9yZGVyIGFueSBhcHBlbmQgZmlsZXMgZm91bmQgaW4KKyAgICAgICAgICAgIDxmaWxlbmFtZT5CQkZJTEVTPC9maWxlbmFtZT4uCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIE9uZSBjb21tb24gY29udmVudGlvbiBpcyB0byB1c2UgdGhlIHJlY2lwZSBmaWxlbmFtZSB0byBkZWZpbmUKKyAgICAgICAgICAgIHBpZWNlcyBvZiBtZXRhZGF0YS4KKyAgICAgICAgICAgIEZvciBleGFtcGxlLCBpbiA8ZmlsZW5hbWU+Yml0YmFrZS5jb25mPC9maWxlbmFtZT4gdGhlIHJlY2lwZQorICAgICAgICAgICAgbmFtZSBhbmQgdmVyc2lvbiBhcmUgdXNlZCB0byBzZXQgdGhlIHZhcmlhYmxlcworICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVBOJz48ZmlsZW5hbWU+UE48L2ZpbGVuYW1lPjwvbGluaz4gYW5kCisgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItUFYnPjxmaWxlbmFtZT5QVjwvZmlsZW5hbWU+PC9saW5rPjoKKyAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgUE4gPSAiJHtAYmIucGFyc2UuQkJIYW5kbGVyLnZhcnNfZnJvbV9maWxlKGQuZ2V0VmFyKCdGSUxFJywgRmFsc2UpLGQpWzBdIG9yICdkZWZhdWx0cGtnbmFtZSd9IgorICAgICBQViA9ICIke0BiYi5wYXJzZS5CQkhhbmRsZXIudmFyc19mcm9tX2ZpbGUoZC5nZXRWYXIoJ0ZJTEUnLCBGYWxzZSksZClbMV0gb3IgJzEuMCd9IgorICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgSW4gdGhpcyBleGFtcGxlLCBhIHJlY2lwZSBjYWxsZWQgInNvbWV0aGluZ18xLjIuMy5iYiIgd291bGQgc2V0CisgICAgICAgICAgICA8ZmlsZW5hbWU+UE48L2ZpbGVuYW1lPiB0byAic29tZXRoaW5nIiBhbmQKKyAgICAgICAgICAgIDxmaWxlbmFtZT5QVjwvZmlsZW5hbWU+IHRvICIxLjIuMyIuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEJ5IHRoZSB0aW1lIHBhcnNpbmcgaXMgY29tcGxldGUgZm9yIGEgcmVjaXBlLCBCaXRCYWtlCisgICAgICAgICAgICBoYXMgYSBsaXN0IG9mIHRhc2tzIHRoYXQgdGhlIHJlY2lwZSBkZWZpbmVzIGFuZCBhIHNldCBvZgorICAgICAgICAgICAgZGF0YSBjb25zaXN0aW5nIG9mIGtleXMgYW5kIHZhbHVlcyBhcyB3ZWxsIGFzCisgICAgICAgICAgICBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIGFib3V0IHRoZSB0YXNrcy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQml0QmFrZSBkb2VzIG5vdCBuZWVkIGFsbCBvZiB0aGlzIGluZm9ybWF0aW9uLgorICAgICAgICAgICAgSXQgb25seSBuZWVkcyBhIHNtYWxsIHN1YnNldCBvZiB0aGUgaW5mb3JtYXRpb24gdG8gbWFrZQorICAgICAgICAgICAgZGVjaXNpb25zIGFib3V0IHRoZSByZWNpcGUuCisgICAgICAgICAgICBDb25zZXF1ZW50bHksIEJpdEJha2UgY2FjaGVzIHRoZSB2YWx1ZXMgaW4gd2hpY2ggaXQgaXMKKyAgICAgICAgICAgIGludGVyZXN0ZWQgYW5kIGRvZXMgbm90IHN0b3JlIHRoZSByZXN0IG9mIHRoZSBpbmZvcm1hdGlvbi4KKyAgICAgICAgICAgIEV4cGVyaWVuY2UgaGFzIHNob3duIGl0IGlzIGZhc3RlciB0byByZS1wYXJzZSB0aGUgbWV0YWRhdGEgdGhhbiB0bworICAgICAgICAgICAgdHJ5IGFuZCB3cml0ZSBpdCBvdXQgdG8gdGhlIGRpc2sgYW5kIHRoZW4gcmVsb2FkIGl0LgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBXaGVyZSBwb3NzaWJsZSwgc3Vic2VxdWVudCBCaXRCYWtlIGNvbW1hbmRzIHJldXNlIHRoaXMgY2FjaGUgb2YKKyAgICAgICAgICAgIHJlY2lwZSBpbmZvcm1hdGlvbi4KKyAgICAgICAgICAgIFRoZSB2YWxpZGl0eSBvZiB0aGlzIGNhY2hlIGlzIGRldGVybWluZWQgYnkgZmlyc3QgY29tcHV0aW5nIGEKKyAgICAgICAgICAgIGNoZWNrc3VtIG9mIHRoZSBiYXNlIGNvbmZpZ3VyYXRpb24gZGF0YSAoc2VlCisgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItQkJfSEFTSENPTkZJR19XSElURUxJU1QnPjxmaWxlbmFtZT5CQl9IQVNIQ09ORklHX1dISVRFTElTVDwvZmlsZW5hbWU+PC9saW5rPikKKyAgICAgICAgICAgIGFuZCB0aGVuIGNoZWNraW5nIGlmIHRoZSBjaGVja3N1bSBtYXRjaGVzLgorICAgICAgICAgICAgSWYgdGhhdCBjaGVja3N1bSBtYXRjaGVzIHdoYXQgaXMgaW4gdGhlIGNhY2hlIGFuZCB0aGUgcmVjaXBlCisgICAgICAgICAgICBhbmQgY2xhc3MgZmlsZXMgaGF2ZSBub3QgY2hhbmdlZCwgQml0YmFrZSBpcyBhYmxlIHRvIHVzZQorICAgICAgICAgICAgdGhlIGNhY2hlLgorICAgICAgICAgICAgQml0QmFrZSB0aGVuIHJlbG9hZHMgdGhlIGNhY2hlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVjaXBlCisgICAgICAgICAgICBpbnN0ZWFkIG9mIHJlcGFyc2luZyBpdCBmcm9tIHNjcmF0Y2guCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFJlY2lwZSBmaWxlIGNvbGxlY3Rpb25zIGV4aXN0IHRvIGFsbG93IHRoZSB1c2VyIHRvCisgICAgICAgICAgICBoYXZlIG11bHRpcGxlIHJlcG9zaXRvcmllcyBvZgorICAgICAgICAgICAgPGZpbGVuYW1lPi5iYjwvZmlsZW5hbWU+IGZpbGVzIHRoYXQgY29udGFpbiB0aGUgc2FtZQorICAgICAgICAgICAgZXhhY3QgcGFja2FnZS4KKyAgICAgICAgICAgIEZvciBleGFtcGxlLCBvbmUgY291bGQgZWFzaWx5IHVzZSB0aGVtIHRvIG1ha2Ugb25lJ3MKKyAgICAgICAgICAgIG93biBsb2NhbCBjb3B5IG9mIGFuIHVwc3RyZWFtIHJlcG9zaXRvcnksIGJ1dCB3aXRoCisgICAgICAgICAgICBjdXN0b20gbW9kaWZpY2F0aW9ucyB0aGF0IG9uZSBkb2VzIG5vdCB3YW50IHVwc3RyZWFtLgorICAgICAgICAgICAgSGVyZSBpcyBhbiBleGFtcGxlOgorICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgIEJCRklMRVMgPSAiL3N0dWZmL29wZW5lbWJlZGRlZC8qLyouYmIgL3N0dWZmL29wZW5lbWJlZGRlZC5tb2RpZmllZC8qLyouYmIiCisgICAgQkJGSUxFX0NPTExFQ1RJT05TID0gInVwc3RyZWFtIGxvY2FsIgorICAgIEJCRklMRV9QQVRURVJOX3Vwc3RyZWFtID0gIl4vc3R1ZmYvb3BlbmVtYmVkZGVkLyIKKyAgICBCQkZJTEVfUEFUVEVSTl9sb2NhbCA9ICJeL3N0dWZmL29wZW5lbWJlZGRlZC5tb2RpZmllZC8iCisgICAgQkJGSUxFX1BSSU9SSVRZX3Vwc3RyZWFtID0gIjUiCisgICAgQkJGSUxFX1BSSU9SSVRZX2xvY2FsID0gIjEwIgorICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgVGhlIGxheWVycyBtZWNoYW5pc20gaXMgbm93IHRoZSBwcmVmZXJyZWQgbWV0aG9kIG9mIGNvbGxlY3RpbmcKKyAgICAgICAgICAgICAgICBjb2RlLgorICAgICAgICAgICAgICAgIFdoaWxlIHRoZSBjb2xsZWN0aW9ucyBjb2RlIHJlbWFpbnMsIGl0cyBtYWluIHVzZSBpcyB0byBzZXQgbGF5ZXIKKyAgICAgICAgICAgICAgICBwcmlvcml0aWVzIGFuZCB0byBkZWFsIHdpdGggb3ZlcmxhcCAoY29uZmxpY3RzKSBiZXR3ZWVuIGxheWVycy4KKyAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIGlkPSdiYi1iaXRiYWtlLXByb3ZpZGVycyc+CisgICAgICAgIDx0aXRsZT5Qcm92aWRlcnM8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQXNzdW1pbmcgQml0QmFrZSBoYXMgYmVlbiBpbnN0cnVjdGVkIHRvIGV4ZWN1dGUgYSB0YXJnZXQKKyAgICAgICAgICAgIGFuZCB0aGF0IGFsbCB0aGUgcmVjaXBlIGZpbGVzIGhhdmUgYmVlbiBwYXJzZWQsIEJpdEJha2UKKyAgICAgICAgICAgIHN0YXJ0cyB0byBmaWd1cmUgb3V0IGhvdyB0byBidWlsZCB0aGUgdGFyZ2V0LgorICAgICAgICAgICAgQml0QmFrZSBsb29rcyB0aHJvdWdoIHRoZSA8ZmlsZW5hbWU+UFJPVklERVM8L2ZpbGVuYW1lPiBsaXN0CisgICAgICAgICAgICBmb3IgZWFjaCBvZiB0aGUgcmVjaXBlcy4KKyAgICAgICAgICAgIEEgPGZpbGVuYW1lPlBST1ZJREVTPC9maWxlbmFtZT4gbGlzdCBpcyB0aGUgbGlzdCBvZiBuYW1lcyBieSB3aGljaAorICAgICAgICAgICAgdGhlIHJlY2lwZSBjYW4gYmUga25vd24uCisgICAgICAgICAgICBFYWNoIHJlY2lwZSdzIDxmaWxlbmFtZT5QUk9WSURFUzwvZmlsZW5hbWU+IGxpc3QgaXMgY3JlYXRlZAorICAgICAgICAgICAgaW1wbGljaXRseSB0aHJvdWdoIHRoZSByZWNpcGUncworICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVBOJz48ZmlsZW5hbWU+UE48L2ZpbGVuYW1lPjwvbGluaz4gdmFyaWFibGUKKyAgICAgICAgICAgIGFuZCBleHBsaWNpdGx5IHRocm91Z2ggdGhlIHJlY2lwZSdzCisgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItUFJPVklERVMnPjxmaWxlbmFtZT5QUk9WSURFUzwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgdmFyaWFibGUsIHdoaWNoIGlzIG9wdGlvbmFsLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBXaGVuIGEgcmVjaXBlIHVzZXMgPGZpbGVuYW1lPlBST1ZJREVTPC9maWxlbmFtZT4sIHRoYXQgcmVjaXBlJ3MKKyAgICAgICAgICAgIGZ1bmN0aW9uYWxpdHkgY2FuIGJlIGZvdW5kIHVuZGVyIGFuIGFsdGVybmF0aXZlIG5hbWUgb3IgbmFtZXMgb3RoZXIKKyAgICAgICAgICAgIHRoYW4gdGhlIGltcGxpY2l0IDxmaWxlbmFtZT5QTjwvZmlsZW5hbWU+IG5hbWUuCisgICAgICAgICAgICBBcyBhbiBleGFtcGxlLCBzdXBwb3NlIGEgcmVjaXBlIG5hbWVkIDxmaWxlbmFtZT5rZXlib2FyZF8xLjAuYmI8L2ZpbGVuYW1lPgorICAgICAgICAgICAgY29udGFpbmVkIHRoZSBmb2xsb3dpbmc6CisgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIFBST1ZJREVTICs9ICJmdWxsa2V5Ym9hcmQiCisgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICBUaGUgPGZpbGVuYW1lPlBST1ZJREVTPC9maWxlbmFtZT4gbGlzdCBmb3IgdGhpcyByZWNpcGUgYmVjb21lcworICAgICAgICAgICAgImtleWJvYXJkIiwgd2hpY2ggaXMgaW1wbGljaXQsIGFuZCAiZnVsbGtleWJvYXJkIiwgd2hpY2ggaXMgZXhwbGljaXQuCisgICAgICAgICAgICBDb25zZXF1ZW50bHksIHRoZSBmdW5jdGlvbmFsaXR5IGZvdW5kIGluCisgICAgICAgICAgICA8ZmlsZW5hbWU+a2V5Ym9hcmRfMS4wLmJiPC9maWxlbmFtZT4gY2FuIGJlIGZvdW5kIHVuZGVyIHR3bworICAgICAgICAgICAgZGlmZmVyZW50IG5hbWVzLgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24gaWQ9J2JiLWJpdGJha2UtcHJlZmVyZW5jZXMnPgorICAgICAgICA8dGl0bGU+UHJlZmVyZW5jZXM8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlIDxmaWxlbmFtZT5QUk9WSURFUzwvZmlsZW5hbWU+IGxpc3QgaXMgb25seSBwYXJ0IG9mIHRoZSBzb2x1dGlvbgorICAgICAgICAgICAgZm9yIGZpZ3VyaW5nIG91dCBhIHRhcmdldCdzIHJlY2lwZXMuCisgICAgICAgICAgICBCZWNhdXNlIHRhcmdldHMgbWlnaHQgaGF2ZSBtdWx0aXBsZSBwcm92aWRlcnMsIEJpdEJha2UgbmVlZHMKKyAgICAgICAgICAgIHRvIHByaW9yaXRpemUgcHJvdmlkZXJzIGJ5IGRldGVybWluaW5nIHByb3ZpZGVyIHByZWZlcmVuY2VzLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBBIGNvbW1vbiBleGFtcGxlIGluIHdoaWNoIGEgdGFyZ2V0IGhhcyBtdWx0aXBsZSBwcm92aWRlcnMKKyAgICAgICAgICAgIGlzICJ2aXJ0dWFsL2tlcm5lbCIsIHdoaWNoIGlzIG9uIHRoZQorICAgICAgICAgICAgPGZpbGVuYW1lPlBST1ZJREVTPC9maWxlbmFtZT4gbGlzdCBmb3IgZWFjaCBrZXJuZWwgcmVjaXBlLgorICAgICAgICAgICAgRWFjaCBtYWNoaW5lIG9mdGVuIHNlbGVjdHMgdGhlIGJlc3Qga2VybmVsIHByb3ZpZGVyIGJ5IHVzaW5nIGEKKyAgICAgICAgICAgIGxpbmUgc2ltaWxhciB0byB0aGUgZm9sbG93aW5nIGluIHRoZSBtYWNoaW5lIGNvbmZpZ3VyYXRpb24gZmlsZToKKyAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgUFJFRkVSUkVEX1BST1ZJREVSX3ZpcnR1YWwva2VybmVsID0gImxpbnV4LXlvY3RvIgorICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgVGhlIGRlZmF1bHQKKyAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1QUkVGRVJSRURfUFJPVklERVInPjxmaWxlbmFtZT5QUkVGRVJSRURfUFJPVklERVI8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgIGlzIHRoZSBwcm92aWRlciB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHRhcmdldC4KKyAgICAgICAgICAgIEJpdGJha2UgaXRlcmF0ZXMgdGhyb3VnaCBlYWNoIHRhcmdldCBpdCBuZWVkcyB0byBidWlsZCBhbmQKKyAgICAgICAgICAgIHJlc29sdmVzIHRoZW0gYW5kIHRoZWlyIGRlcGVuZGVuY2llcyB1c2luZyB0aGlzIHByb2Nlc3MuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFVuZGVyc3RhbmRpbmcgaG93IHByb3ZpZGVycyBhcmUgY2hvc2VuIGlzIG1hZGUgY29tcGxpY2F0ZWQgYnkgdGhlIGZhY3QKKyAgICAgICAgICAgIHRoYXQgbXVsdGlwbGUgdmVyc2lvbnMgbWlnaHQgZXhpc3QgZm9yIGEgZ2l2ZW4gcHJvdmlkZXIuCisgICAgICAgICAgICBCaXRCYWtlIGRlZmF1bHRzIHRvIHRoZSBoaWdoZXN0IHZlcnNpb24gb2YgYSBwcm92aWRlci4KKyAgICAgICAgICAgIFZlcnNpb24gY29tcGFyaXNvbnMgYXJlIG1hZGUgdXNpbmcgdGhlIHNhbWUgbWV0aG9kIGFzIERlYmlhbi4KKyAgICAgICAgICAgIFlvdSBjYW4gdXNlIHRoZQorICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVBSRUZFUlJFRF9WRVJTSU9OJz48ZmlsZW5hbWU+UFJFRkVSUkVEX1ZFUlNJT048L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgIHZhcmlhYmxlIHRvIHNwZWNpZnkgYSBwYXJ0aWN1bGFyIHZlcnNpb24uCisgICAgICAgICAgICBZb3UgY2FuIGluZmx1ZW5jZSB0aGUgb3JkZXIgYnkgdXNpbmcgdGhlCisgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItREVGQVVMVF9QUkVGRVJFTkNFJz48ZmlsZW5hbWU+REVGQVVMVF9QUkVGRVJFTkNFPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICB2YXJpYWJsZS4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQnkgZGVmYXVsdCwgZmlsZXMgaGF2ZSBhIHByZWZlcmVuY2Ugb2YgIjAiLgorICAgICAgICAgICAgU2V0dGluZyA8ZmlsZW5hbWU+REVGQVVMVF9QUkVGRVJFTkNFPC9maWxlbmFtZT4gdG8gIi0xIiBtYWtlcyB0aGUKKyAgICAgICAgICAgIHJlY2lwZSB1bmxpa2VseSB0byBiZSB1c2VkIHVubGVzcyBpdCBpcyBleHBsaWNpdGx5IHJlZmVyZW5jZWQuCisgICAgICAgICAgICBTZXR0aW5nIDxmaWxlbmFtZT5ERUZBVUxUX1BSRUZFUkVOQ0U8L2ZpbGVuYW1lPiB0byAiMSIgbWFrZXMgaXQKKyAgICAgICAgICAgIGxpa2VseSB0aGUgcmVjaXBlIGlzIHVzZWQuCisgICAgICAgICAgICA8ZmlsZW5hbWU+UFJFRkVSUkVEX1ZFUlNJT048L2ZpbGVuYW1lPiBvdmVycmlkZXMgYW55CisgICAgICAgICAgICA8ZmlsZW5hbWU+REVGQVVMVF9QUkVGRVJFTkNFPC9maWxlbmFtZT4gc2V0dGluZy4KKyAgICAgICAgICAgIDxmaWxlbmFtZT5ERUZBVUxUX1BSRUZFUkVOQ0U8L2ZpbGVuYW1lPiBpcyBvZnRlbiB1c2VkIHRvIG1hcmsgbmV3ZXIKKyAgICAgICAgICAgIGFuZCBtb3JlIGV4cGVyaW1lbnRhbCByZWNpcGUgdmVyc2lvbnMgdW50aWwgdGhleSBoYXZlIHVuZGVyZ29uZQorICAgICAgICAgICAgc3VmZmljaWVudCB0ZXN0aW5nIHRvIGJlIGNvbnNpZGVyZWQgc3RhYmxlLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBXaGVuIHRoZXJlIGFyZSBtdWx0aXBsZSDigJx2ZXJzaW9uc+KAnSBvZiBhIGdpdmVuIHJlY2lwZSwKKyAgICAgICAgICAgIEJpdEJha2UgZGVmYXVsdHMgdG8gc2VsZWN0aW5nIHRoZSBtb3N0IHJlY2VudAorICAgICAgICAgICAgdmVyc2lvbiwgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQuCisgICAgICAgICAgICBJZiB0aGUgcmVjaXBlIGluIHF1ZXN0aW9uIGhhcyBhCisgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItREVGQVVMVF9QUkVGRVJFTkNFJz48ZmlsZW5hbWU+REVGQVVMVF9QUkVGRVJFTkNFPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICBzZXQgbG93ZXIgdGhhbiB0aGUgb3RoZXIgcmVjaXBlcyAoZGVmYXVsdCBpcyAwKSwgdGhlbgorICAgICAgICAgICAgaXQgd2lsbCBub3QgYmUgc2VsZWN0ZWQuCisgICAgICAgICAgICBUaGlzIGFsbG93cyB0aGUgcGVyc29uIG9yIHBlcnNvbnMgbWFpbnRhaW5pbmcKKyAgICAgICAgICAgIHRoZSByZXBvc2l0b3J5IG9mIHJlY2lwZSBmaWxlcyB0byBzcGVjaWZ5CisgICAgICAgICAgICB0aGVpciBwcmVmZXJlbmNlIGZvciB0aGUgZGVmYXVsdCBzZWxlY3RlZCB2ZXJzaW9uLgorICAgICAgICAgICAgQWRkaXRpb25hbGx5LCB0aGUgdXNlciBjYW4gc3BlY2lmeSB0aGVpciBwcmVmZXJyZWQgdmVyc2lvbi4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgSWYgdGhlIGZpcnN0IHJlY2lwZSBpcyBuYW1lZCA8ZmlsZW5hbWU+YV8xLjEuYmI8L2ZpbGVuYW1lPiwgdGhlbiB0aGUKKyAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1QTic+PGZpbGVuYW1lPlBOPC9maWxlbmFtZT48L2xpbms+IHZhcmlhYmxlCisgICAgICAgICAgICB3aWxsIGJlIHNldCB0byDigJxh4oCdLCBhbmQgdGhlCisgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItUFYnPjxmaWxlbmFtZT5QVjwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgdmFyaWFibGUgd2lsbCBiZSBzZXQgdG8gMS4xLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaHVzLCBpZiBhIHJlY2lwZSBuYW1lZCA8ZmlsZW5hbWU+YV8xLjIuYmI8L2ZpbGVuYW1lPiBleGlzdHMsIEJpdEJha2UKKyAgICAgICAgICAgIHdpbGwgY2hvb3NlIDEuMiBieSBkZWZhdWx0LgorICAgICAgICAgICAgSG93ZXZlciwgaWYgeW91IGRlZmluZSB0aGUgZm9sbG93aW5nIHZhcmlhYmxlIGluIGEKKyAgICAgICAgICAgIDxmaWxlbmFtZT4uY29uZjwvZmlsZW5hbWU+IGZpbGUgdGhhdCBCaXRCYWtlIHBhcnNlcywgeW91CisgICAgICAgICAgICBjYW4gY2hhbmdlIHRoYXQgcHJlZmVyZW5jZToKKyAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgUFJFRkVSUkVEX1ZFUlNJT05fYSA9ICIxLjEiCisgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEl0IGlzIGNvbW1vbiBmb3IgYSByZWNpcGUgdG8gcHJvdmlkZSB0d28gdmVyc2lvbnMgLS0gYSBzdGFibGUsCisgICAgICAgICAgICAgICAgbnVtYmVyZWQgKGFuZCBwcmVmZXJyZWQpIHZlcnNpb24sIGFuZCBhIHZlcnNpb24gdGhhdCBpcworICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgY2hlY2tlZCBvdXQgZnJvbSBhIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnkgdGhhdAorICAgICAgICAgICAgICAgIGlzIGNvbnNpZGVyZWQgbW9yZSAiYmxlZWRpbmcgZWRnZSIgYnV0IGNhbiBiZSBzZWxlY3RlZCBvbmx5CisgICAgICAgICAgICAgICAgZXhwbGljaXRseS4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIGluIHRoZSBPcGVuRW1iZWRkZWQgY29kZWJhc2UsIHRoZXJlIGlzIGEgc3RhbmRhcmQsCisgICAgICAgICAgICAgICAgdmVyc2lvbmVkIHJlY2lwZSBmaWxlIGZvciBCdXN5Qm94LAorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5idXN5Ym94XzEuMjIuMS5iYjwvZmlsZW5hbWU+LAorICAgICAgICAgICAgICAgIGJ1dCB0aGVyZSBpcyBhbHNvIGEgR2l0LWJhc2VkIHZlcnNpb24sCisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmJ1c3lib3hfZ2l0LmJiPC9maWxlbmFtZT4sIHdoaWNoIGV4cGxpY2l0bHkgY29udGFpbnMgdGhlIGxpbmUKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgREVGQVVMVF9QUkVGRVJFTkNFID0gIi0xIgorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICB0byBlbnN1cmUgdGhhdCB0aGUgbnVtYmVyZWQsIHN0YWJsZSB2ZXJzaW9uIGlzIGFsd2F5cyBwcmVmZXJyZWQKKyAgICAgICAgICAgICAgICB1bmxlc3MgdGhlIGRldmVsb3BlciBzZWxlY3RzIG90aGVyd2lzZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9ub3RlPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIGlkPSdiYi1iaXRiYWtlLWRlcGVuZGVuY2llcyc+CisgICAgICAgIDx0aXRsZT5EZXBlbmRlbmNpZXM8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgRWFjaCB0YXJnZXQgQml0QmFrZSBidWlsZHMgY29uc2lzdHMgb2YgbXVsdGlwbGUgdGFza3Mgc3VjaCBhcworICAgICAgICAgICAgPGZpbGVuYW1lPmZldGNoPC9maWxlbmFtZT4sIDxmaWxlbmFtZT51bnBhY2s8L2ZpbGVuYW1lPiwKKyAgICAgICAgICAgIDxmaWxlbmFtZT5wYXRjaDwvZmlsZW5hbWU+LCA8ZmlsZW5hbWU+Y29uZmlndXJlPC9maWxlbmFtZT4sCisgICAgICAgICAgICBhbmQgPGZpbGVuYW1lPmNvbXBpbGU8L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgIEZvciBiZXN0IHBlcmZvcm1hbmNlIG9uIG11bHRpLWNvcmUgc3lzdGVtcywgQml0QmFrZSBjb25zaWRlcnMgZWFjaAorICAgICAgICAgICAgdGFzayBhcyBhbiBpbmRlcGVuZGVudAorICAgICAgICAgICAgZW50aXR5IHdpdGggaXRzIG93biBzZXQgb2YgZGVwZW5kZW5jaWVzLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBEZXBlbmRlbmNpZXMgYXJlIGRlZmluZWQgdGhyb3VnaCBzZXZlcmFsIHZhcmlhYmxlcy4KKyAgICAgICAgICAgIFlvdSBjYW4gZmluZCBpbmZvcm1hdGlvbiBhYm91dCB2YXJpYWJsZXMgQml0QmFrZSB1c2VzIGluCisgICAgICAgICAgICB0aGUgPGxpbmsgbGlua2VuZD0ncmVmLXZhcmlhYmxlcy1nbG9zJz5WYXJpYWJsZXMgR2xvc3Nhcnk8L2xpbms+CisgICAgICAgICAgICBuZWFyIHRoZSBlbmQgb2YgdGhpcyBtYW51YWwuCisgICAgICAgICAgICBBdCBhIGJhc2ljIGxldmVsLCBpdCBpcyBzdWZmaWNpZW50IHRvIGtub3cgdGhhdCBCaXRCYWtlIHVzZXMgdGhlCisgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItREVQRU5EUyc+PGZpbGVuYW1lPkRFUEVORFM8L2ZpbGVuYW1lPjwvbGluaz4gYW5kCisgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItUkRFUEVORFMnPjxmaWxlbmFtZT5SREVQRU5EUzwvZmlsZW5hbWU+PC9saW5rPiB2YXJpYWJsZXMgd2hlbgorICAgICAgICAgICAgY2FsY3VsYXRpbmcgZGVwZW5kZW5jaWVzLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgQml0QmFrZSBoYW5kbGVzIGRlcGVuZGVuY2llcywgc2VlIHRoZQorICAgICAgICAgICAgIjxsaW5rIGxpbmtlbmQ9J2RlcGVuZGVuY2llcyc+RGVwZW5kZW5jaWVzPC9saW5rPiIgc2VjdGlvbi4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIGlkPSdyZWYtYml0YmFrZS10YXNrbGlzdCc+CisgICAgICAgIDx0aXRsZT5UaGUgVGFzayBMaXN0PC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEJhc2VkIG9uIHRoZSBnZW5lcmF0ZWQgbGlzdCBvZiBwcm92aWRlcnMgYW5kIHRoZSBkZXBlbmRlbmN5IGluZm9ybWF0aW9uLAorICAgICAgICAgICAgQml0QmFrZSBjYW4gbm93IGNhbGN1bGF0ZSBleGFjdGx5IHdoYXQgdGFza3MgaXQgbmVlZHMgdG8gcnVuIGFuZCBpbiB3aGF0CisgICAgICAgICAgICBvcmRlciBpdCBuZWVkcyB0byBydW4gdGhlbS4KKyAgICAgICAgICAgIFRoZQorICAgICAgICAgICAgIjxsaW5rIGxpbmtlbmQ9J2V4ZWN1dGluZy10YXNrcyc+RXhlY3V0aW5nIFRhc2tzPC9saW5rPiIgc2VjdGlvbiBoYXMgbW9yZQorICAgICAgICAgICAgaW5mb3JtYXRpb24gb24gaG93IEJpdEJha2UgY2hvb3NlcyB3aGljaCB0YXNrIHRvIGV4ZWN1dGUgbmV4dC4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlIGJ1aWxkIG5vdyBzdGFydHMgd2l0aCBCaXRCYWtlIGZvcmtpbmcgb2ZmIHRocmVhZHMgdXAgdG8gdGhlIGxpbWl0IHNldCBpbiB0aGUKKyAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1CQl9OVU1CRVJfVEhSRUFEUyc+PGZpbGVuYW1lPkJCX05VTUJFUl9USFJFQURTPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICB2YXJpYWJsZS4KKyAgICAgICAgICAgIEJpdEJha2UgY29udGludWVzIHRvIGZvcmsgdGhyZWFkcyBhcyBsb25nIGFzIHRoZXJlIGFyZSB0YXNrcyByZWFkeSB0byBydW4sCisgICAgICAgICAgICB0aG9zZSB0YXNrcyBoYXZlIGFsbCB0aGVpciBkZXBlbmRlbmNpZXMgbWV0LCBhbmQgdGhlIHRocmVhZCB0aHJlc2hvbGQgaGFzIG5vdCBiZWVuCisgICAgICAgICAgICBleGNlZWRlZC4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgSXQgaXMgd29ydGggbm90aW5nIHRoYXQgeW91IGNhbiBncmVhdGx5IHNwZWVkIHVwIHRoZSBidWlsZCB0aW1lIGJ5IHByb3Blcmx5IHNldHRpbmcKKyAgICAgICAgICAgIHRoZSA8ZmlsZW5hbWU+QkJfTlVNQkVSX1RIUkVBRFM8L2ZpbGVuYW1lPiB2YXJpYWJsZS4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQXMgZWFjaCB0YXNrIGNvbXBsZXRlcywgYSB0aW1lc3RhbXAgaXMgd3JpdHRlbiB0byB0aGUgZGlyZWN0b3J5IHNwZWNpZmllZCBieSB0aGUKKyAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1TVEFNUCc+PGZpbGVuYW1lPlNUQU1QPC9maWxlbmFtZT48L2xpbms+IHZhcmlhYmxlLgorICAgICAgICAgICAgT24gc3Vic2VxdWVudCBydW5zLCBCaXRCYWtlIGxvb2tzIGluIHRoZSBidWlsZCBkaXJlY3Rvcnkgd2l0aGluCisgICAgICAgICAgICA8ZmlsZW5hbWU+dG1wL3N0YW1wczwvZmlsZW5hbWU+IGFuZCBkb2VzIG5vdCByZXJ1bgorICAgICAgICAgICAgdGFza3MgdGhhdCBhcmUgYWxyZWFkeSBjb21wbGV0ZWQgdW5sZXNzIGEgdGltZXN0YW1wIGlzIGZvdW5kIHRvIGJlIGludmFsaWQuCisgICAgICAgICAgICBDdXJyZW50bHksIGludmFsaWQgdGltZXN0YW1wcyBhcmUgb25seSBjb25zaWRlcmVkIG9uIGEgcGVyCisgICAgICAgICAgICByZWNpcGUgZmlsZSBiYXNpcy4KKyAgICAgICAgICAgIFNvLCBmb3IgZXhhbXBsZSwgaWYgdGhlIGNvbmZpZ3VyZSBzdGFtcCBoYXMgYSB0aW1lc3RhbXAgZ3JlYXRlciB0aGFuIHRoZQorICAgICAgICAgICAgY29tcGlsZSB0aW1lc3RhbXAgZm9yIGEgZ2l2ZW4gdGFyZ2V0LCB0aGVuIHRoZSBjb21waWxlIHRhc2sgd291bGQgcmVydW4uCisgICAgICAgICAgICBSdW5uaW5nIHRoZSBjb21waWxlIHRhc2sgYWdhaW4sIGhvd2V2ZXIsIGhhcyBubyBlZmZlY3Qgb24gb3RoZXIgcHJvdmlkZXJzCisgICAgICAgICAgICB0aGF0IGRlcGVuZCBvbiB0aGF0IHRhcmdldC4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlIGV4YWN0IGZvcm1hdCBvZiB0aGUgc3RhbXBzIGlzIHBhcnRseSBjb25maWd1cmFibGUuCisgICAgICAgICAgICBJbiBtb2Rlcm4gdmVyc2lvbnMgb2YgQml0QmFrZSwgYSBoYXNoIGlzIGFwcGVuZGVkIHRvIHRoZQorICAgICAgICAgICAgc3RhbXAgc28gdGhhdCBpZiB0aGUgY29uZmlndXJhdGlvbiBjaGFuZ2VzLCB0aGUgc3RhbXAgYmVjb21lcworICAgICAgICAgICAgaW52YWxpZCBhbmQgdGhlIHRhc2sgaXMgYXV0b21hdGljYWxseSByZXJ1bi4KKyAgICAgICAgICAgIFRoaXMgaGFzaCwgb3Igc2lnbmF0dXJlIHVzZWQsIGlzIGdvdmVybmVkIGJ5IHRoZSBzaWduYXR1cmUgcG9saWN5CisgICAgICAgICAgICB0aGF0IGlzIGNvbmZpZ3VyZWQgKHNlZSB0aGUKKyAgICAgICAgICAgICI8bGluayBsaW5rZW5kPSdjaGVja3N1bXMnPkNoZWNrc3VtcyAoU2lnbmF0dXJlcyk8L2xpbms+IgorICAgICAgICAgICAgc2VjdGlvbiBmb3IgaW5mb3JtYXRpb24pLgorICAgICAgICAgICAgSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBhcHBlbmQgZXh0cmEgbWV0YWRhdGEgdG8gdGhlIHN0YW1wIHVzaW5nCisgICAgICAgICAgICB0aGUgInN0YW1wLWV4dHJhLWluZm8iIHRhc2sgZmxhZy4KKyAgICAgICAgICAgIEZvciBleGFtcGxlLCBPcGVuRW1iZWRkZWQgdXNlcyB0aGlzIGZsYWcgdG8gbWFrZSBzb21lIHRhc2tzIG1hY2hpbmUtc3BlY2lmaWMuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgIFNvbWUgdGFza3MgYXJlIG1hcmtlZCBhcyAibm9zdGFtcCIgdGFza3MuCisgICAgICAgICAgICBObyB0aW1lc3RhbXAgZmlsZSBpcyBjcmVhdGVkIHdoZW4gdGhlc2UgdGFza3MgYXJlIHJ1bi4KKyAgICAgICAgICAgIENvbnNlcXVlbnRseSwgIm5vc3RhbXAiIHRhc2tzIGFyZSBhbHdheXMgcmVydW4uCisgICAgICAgIDwvbm90ZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRhc2tzLCBzZWUgdGhlCisgICAgICAgICAgICAiPGxpbmsgbGlua2VuZD0ndGFza3MnPlRhc2tzPC9saW5rPiIgc2VjdGlvbi4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIGlkPSdleGVjdXRpbmctdGFza3MnPgorICAgICAgICA8dGl0bGU+RXhlY3V0aW5nIFRhc2tzPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRhc2tzIGNhbiBiZSBlaXRoZXIgYSBzaGVsbCB0YXNrIG9yIGEgUHl0aG9uIHRhc2suCisgICAgICAgICAgICBGb3Igc2hlbGwgdGFza3MsIEJpdEJha2Ugd3JpdGVzIGEgc2hlbGwgc2NyaXB0IHRvCisgICAgICAgICAgICA8ZmlsZW5hbWU+JHs8L2ZpbGVuYW1lPjxsaW5rIGxpbmtlbmQ9J3Zhci1UJz48ZmlsZW5hbWU+VDwvZmlsZW5hbWU+PC9saW5rPjxmaWxlbmFtZT59L3J1bi5kb190YXNrbmFtZS5waWQ8L2ZpbGVuYW1lPgorICAgICAgICAgICAgYW5kIHRoZW4gZXhlY3V0ZXMgdGhlIHNjcmlwdC4KKyAgICAgICAgICAgIFRoZSBnZW5lcmF0ZWQgc2hlbGwgc2NyaXB0IGNvbnRhaW5zIGFsbCB0aGUgZXhwb3J0ZWQgdmFyaWFibGVzLAorICAgICAgICAgICAgYW5kIHRoZSBzaGVsbCBmdW5jdGlvbnMgd2l0aCBhbGwgdmFyaWFibGVzIGV4cGFuZGVkLgorICAgICAgICAgICAgT3V0cHV0IGZyb20gdGhlIHNoZWxsIHNjcmlwdCBnb2VzIHRvIHRoZSBmaWxlCisgICAgICAgICAgICA8ZmlsZW5hbWU+JHtUfS9sb2cuZG9fdGFza25hbWUucGlkPC9maWxlbmFtZT4uCisgICAgICAgICAgICBMb29raW5nIGF0IHRoZSBleHBhbmRlZCBzaGVsbCBmdW5jdGlvbnMgaW4gdGhlIHJ1biBmaWxlIGFuZAorICAgICAgICAgICAgdGhlIG91dHB1dCBpbiB0aGUgbG9nIGZpbGVzIGlzIGEgdXNlZnVsIGRlYnVnZ2luZyB0ZWNobmlxdWUuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEZvciBQeXRob24gdGFza3MsIEJpdEJha2UgZXhlY3V0ZXMgdGhlIHRhc2sgaW50ZXJuYWxseSBhbmQgbG9ncworICAgICAgICAgICAgaW5mb3JtYXRpb24gdG8gdGhlIGNvbnRyb2xsaW5nIHRlcm1pbmFsLgorICAgICAgICAgICAgRnV0dXJlIHZlcnNpb25zIG9mIEJpdEJha2Ugd2lsbCB3cml0ZSB0aGUgZnVuY3Rpb25zIHRvIGZpbGVzCisgICAgICAgICAgICBzaW1pbGFyIHRvIHRoZSB3YXkgc2hlbGwgdGFza3MgYXJlIGhhbmRsZWQuCisgICAgICAgICAgICBMb2dnaW5nIHdpbGwgYmUgaGFuZGxlZCBpbiBhIHdheSBzaW1pbGFyIHRvIHNoZWxsIHRhc2tzIGFzIHdlbGwuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSBvcmRlciBpbiB3aGljaCBCaXRCYWtlIHJ1bnMgdGhlIHRhc2tzIGlzIGNvbnRyb2xsZWQgYnkgaXRzCisgICAgICAgICAgICB0YXNrIHNjaGVkdWxlci4KKyAgICAgICAgICAgIEl0IGlzIHBvc3NpYmxlIHRvIGNvbmZpZ3VyZSB0aGUgc2NoZWR1bGVyIGFuZCBkZWZpbmUgY3VzdG9tCisgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbnMgZm9yIHNwZWNpZmljIHVzZSBjYXNlcy4KKyAgICAgICAgICAgIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlc2UgdmFyaWFibGVzIHRoYXQgY29udHJvbCB0aGUKKyAgICAgICAgICAgIGJlaGF2aW9yOgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1CQl9TQ0hFRFVMRVInPjxmaWxlbmFtZT5CQl9TQ0hFRFVMRVI8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItQkJfU0NIRURVTEVSUyc+PGZpbGVuYW1lPkJCX1NDSEVEVUxFUlM8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIEl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgZnVuY3Rpb25zIHJ1biBiZWZvcmUgYW5kIGFmdGVyIGEgdGFzaydzIG1haW4KKyAgICAgICAgICAgIGZ1bmN0aW9uLgorICAgICAgICAgICAgVGhpcyBpcyBkb25lIHVzaW5nIHRoZSAicHJlZnVuY3MiIGFuZCAicG9zdGZ1bmNzIiBmbGFncyBvZiB0aGUgdGFzaworICAgICAgICAgICAgdGhhdCBsaXN0cyB0aGUgZnVuY3Rpb25zIHRvIHJ1bi4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIGlkPSdjaGVja3N1bXMnPgorICAgICAgICA8dGl0bGU+Q2hlY2tzdW1zIChTaWduYXR1cmVzKTwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBBIGNoZWNrc3VtIGlzIGEgdW5pcXVlIHNpZ25hdHVyZSBvZiBhIHRhc2sncyBpbnB1dHMuCisgICAgICAgICAgICBUaGUgc2lnbmF0dXJlIG9mIGEgdGFzayBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgaWYgYSB0YXNrCisgICAgICAgICAgICBuZWVkcyB0byBiZSBydW4uCisgICAgICAgICAgICBCZWNhdXNlIGl0IGlzIGEgY2hhbmdlIGluIGEgdGFzaydzIGlucHV0cyB0aGF0IHRyaWdnZXJzIHJ1bm5pbmcKKyAgICAgICAgICAgIHRoZSB0YXNrLCBCaXRCYWtlIG5lZWRzIHRvIGRldGVjdCBhbGwgdGhlIGlucHV0cyB0byBhIGdpdmVuIHRhc2suCisgICAgICAgICAgICBGb3Igc2hlbGwgdGFza3MsIHRoaXMgdHVybnMgb3V0IHRvIGJlIGZhaXJseSBlYXN5IGJlY2F1c2UKKyAgICAgICAgICAgIEJpdEJha2UgZ2VuZXJhdGVzIGEgInJ1biIgc2hlbGwgc2NyaXB0IGZvciBlYWNoIHRhc2sgYW5kCisgICAgICAgICAgICBpdCBpcyBwb3NzaWJsZSB0byBjcmVhdGUgYSBjaGVja3N1bSB0aGF0IGdpdmVzIHlvdSBhIGdvb2QgaWRlYSBvZiB3aGVuCisgICAgICAgICAgICB0aGUgdGFzaydzIGRhdGEgY2hhbmdlcy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVG8gY29tcGxpY2F0ZSB0aGUgcHJvYmxlbSwgc29tZSB0aGluZ3Mgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbgorICAgICAgICAgICAgdGhlIGNoZWNrc3VtLgorICAgICAgICAgICAgRmlyc3QsIHRoZXJlIGlzIHRoZSBhY3R1YWwgc3BlY2lmaWMgYnVpbGQgcGF0aCBvZiBhIGdpdmVuIHRhc2sgLQorICAgICAgICAgICAgdGhlIHdvcmtpbmcgZGlyZWN0b3J5LgorICAgICAgICAgICAgSXQgZG9lcyBub3QgbWF0dGVyIGlmIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBjaGFuZ2VzIGJlY2F1c2UgaXQgc2hvdWxkIG5vdAorICAgICAgICAgICAgYWZmZWN0IHRoZSBvdXRwdXQgZm9yIHRhcmdldCBwYWNrYWdlcy4KKyAgICAgICAgICAgIFRoZSBzaW1wbGlzdGljIGFwcHJvYWNoIGZvciBleGNsdWRpbmcgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGlzIHRvIHNldAorICAgICAgICAgICAgaXQgdG8gc29tZSBmaXhlZCB2YWx1ZSBhbmQgY3JlYXRlIHRoZSBjaGVja3N1bSBmb3IgdGhlICJydW4iIHNjcmlwdC4KKyAgICAgICAgICAgIEJpdEJha2UgZ29lcyBvbmUgc3RlcCBiZXR0ZXIgYW5kIHVzZXMgdGhlCisgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItQkJfSEFTSEJBU0VfV0hJVEVMSVNUJz48ZmlsZW5hbWU+QkJfSEFTSEJBU0VfV0hJVEVMSVNUPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICB2YXJpYWJsZSB0byBkZWZpbmUgYSBsaXN0IG9mIHZhcmlhYmxlcyB0aGF0IHNob3VsZCBuZXZlciBiZSBpbmNsdWRlZAorICAgICAgICAgICAgd2hlbiBnZW5lcmF0aW5nIHRoZSBzaWduYXR1cmVzLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBBbm90aGVyIHByb2JsZW0gcmVzdWx0cyBmcm9tIHRoZSAicnVuIiBzY3JpcHRzIGNvbnRhaW5pbmcgZnVuY3Rpb25zIHRoYXQKKyAgICAgICAgICAgIG1pZ2h0IG9yIG1pZ2h0IG5vdCBnZXQgY2FsbGVkLgorICAgICAgICAgICAgVGhlIGluY3JlbWVudGFsIGJ1aWxkIHNvbHV0aW9uIGNvbnRhaW5zIGNvZGUgdGhhdCBmaWd1cmVzIG91dCBkZXBlbmRlbmNpZXMKKyAgICAgICAgICAgIGJldHdlZW4gc2hlbGwgZnVuY3Rpb25zLgorICAgICAgICAgICAgVGhpcyBjb2RlIGlzIHVzZWQgdG8gcHJ1bmUgdGhlICJydW4iIHNjcmlwdHMgZG93biB0byB0aGUgbWluaW11bSBzZXQsCisgICAgICAgICAgICB0aGVyZWJ5IGFsbGV2aWF0aW5nIHRoaXMgcHJvYmxlbSBhbmQgbWFraW5nIHRoZSAicnVuIiBzY3JpcHRzIG11Y2ggbW9yZQorICAgICAgICAgICAgcmVhZGFibGUgYXMgYSBib251cy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgU28gZmFyIHdlIGhhdmUgc29sdXRpb25zIGZvciBzaGVsbCBzY3JpcHRzLgorICAgICAgICAgICAgV2hhdCBhYm91dCBQeXRob24gdGFza3M/CisgICAgICAgICAgICBUaGUgc2FtZSBhcHByb2FjaCBhcHBsaWVzIGV2ZW4gdGhvdWdoIHRoZXNlIHRhc2tzIGFyZSBtb3JlIGRpZmZpY3VsdC4KKyAgICAgICAgICAgIFRoZSBwcm9jZXNzIG5lZWRzIHRvIGZpZ3VyZSBvdXQgd2hhdCB2YXJpYWJsZXMgYSBQeXRob24gZnVuY3Rpb24gYWNjZXNzZXMKKyAgICAgICAgICAgIGFuZCB3aGF0IGZ1bmN0aW9ucyBpdCBjYWxscy4KKyAgICAgICAgICAgIEFnYWluLCB0aGUgaW5jcmVtZW50YWwgYnVpbGQgc29sdXRpb24gY29udGFpbnMgY29kZSB0aGF0IGZpcnN0IGZpZ3VyZXMgb3V0CisgICAgICAgICAgICB0aGUgdmFyaWFibGUgYW5kIGZ1bmN0aW9uIGRlcGVuZGVuY2llcywgYW5kIHRoZW4gY3JlYXRlcyBhIGNoZWNrc3VtIGZvciB0aGUgZGF0YQorICAgICAgICAgICAgdXNlZCBhcyB0aGUgaW5wdXQgdG8gdGhlIHRhc2suCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIExpa2UgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGNhc2UsIHNpdHVhdGlvbnMgZXhpc3Qgd2hlcmUgZGVwZW5kZW5jaWVzCisgICAgICAgICAgICBzaG91bGQgYmUgaWdub3JlZC4KKyAgICAgICAgICAgIEZvciB0aGVzZSBjYXNlcywgeW91IGNhbiBpbnN0cnVjdCB0aGUgYnVpbGQgcHJvY2VzcyB0byBpZ25vcmUgYSBkZXBlbmRlbmN5CisgICAgICAgICAgICBieSB1c2luZyBhIGxpbmUgbGlrZSB0aGUgZm9sbG93aW5nOgorICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBQQUNLQUdFX0FSQ0hTW3ZhcmRlcHNleGNsdWRlXSA9ICJNQUNISU5FIgorICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgVGhpcyBleGFtcGxlIGVuc3VyZXMgdGhhdCB0aGUgPGZpbGVuYW1lPlBBQ0tBR0VfQVJDSFM8L2ZpbGVuYW1lPiB2YXJpYWJsZSBkb2VzIG5vdAorICAgICAgICAgICAgZGVwZW5kIG9uIHRoZSB2YWx1ZSBvZiA8ZmlsZW5hbWU+TUFDSElORTwvZmlsZW5hbWU+LCBldmVuIGlmIGl0IGRvZXMgcmVmZXJlbmNlIGl0LgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBFcXVhbGx5LCB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgd2UgbmVlZCB0byBhZGQgZGVwZW5kZW5jaWVzIEJpdEJha2UKKyAgICAgICAgICAgIGlzIG5vdCBhYmxlIHRvIGZpbmQuCisgICAgICAgICAgICBZb3UgY2FuIGFjY29tcGxpc2ggdGhpcyBieSB1c2luZyBhIGxpbmUgbGlrZSB0aGUgZm9sbG93aW5nOgorICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICAgUEFDS0FHRV9BUkNIU1t2YXJkZXBzXSA9ICJNQUNISU5FIgorICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgVGhpcyBleGFtcGxlIGV4cGxpY2l0bHkgYWRkcyB0aGUgPGZpbGVuYW1lPk1BQ0hJTkU8L2ZpbGVuYW1lPiB2YXJpYWJsZSBhcyBhCisgICAgICAgICAgICBkZXBlbmRlbmN5IGZvciA8ZmlsZW5hbWU+UEFDS0FHRV9BUkNIUzwvZmlsZW5hbWU+LgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBDb25zaWRlciBhIGNhc2Ugd2l0aCBpbi1saW5lIFB5dGhvbiwgZm9yIGV4YW1wbGUsIHdoZXJlIEJpdEJha2UgaXMgbm90CisgICAgICAgICAgICBhYmxlIHRvIGZpZ3VyZSBvdXQgZGVwZW5kZW5jaWVzLgorICAgICAgICAgICAgV2hlbiBydW5uaW5nIGluIGRlYnVnIG1vZGUgKGkuZS4gdXNpbmcgPGZpbGVuYW1lPi1EREQ8L2ZpbGVuYW1lPiksIEJpdEJha2UKKyAgICAgICAgICAgIHByb2R1Y2VzIG91dHB1dCB3aGVuIGl0IGRpc2NvdmVycyBzb21ldGhpbmcgZm9yIHdoaWNoIGl0IGNhbm5vdCBmaWd1cmUgb3V0CisgICAgICAgICAgICBkZXBlbmRlbmNpZXMuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRodXMgZmFyLCB0aGlzIHNlY3Rpb24gaGFzIGxpbWl0ZWQgZGlzY3Vzc2lvbiB0byB0aGUgZGlyZWN0IGlucHV0cyBpbnRvIGEgdGFzay4KKyAgICAgICAgICAgIEluZm9ybWF0aW9uIGJhc2VkIG9uIGRpcmVjdCBpbnB1dHMgaXMgcmVmZXJyZWQgdG8gYXMgdGhlICJiYXNlaGFzaCIgaW4gdGhlCisgICAgICAgICAgICBjb2RlLgorICAgICAgICAgICAgSG93ZXZlciwgdGhlcmUgaXMgc3RpbGwgdGhlIHF1ZXN0aW9uIG9mIGEgdGFzaydzIGluZGlyZWN0IGlucHV0cyAtIHRoZQorICAgICAgICAgICAgdGhpbmdzIHRoYXQgd2VyZSBhbHJlYWR5IGJ1aWx0IGFuZCBwcmVzZW50IGluIHRoZSBidWlsZCBkaXJlY3RvcnkuCisgICAgICAgICAgICBUaGUgY2hlY2tzdW0gKG9yIHNpZ25hdHVyZSkgZm9yIGEgcGFydGljdWxhciB0YXNrIG5lZWRzIHRvIGFkZCB0aGUgaGFzaGVzCisgICAgICAgICAgICBvZiBhbGwgdGhlIHRhc2tzIG9uIHdoaWNoIHRoZSBwYXJ0aWN1bGFyIHRhc2sgZGVwZW5kcy4KKyAgICAgICAgICAgIENob29zaW5nIHdoaWNoIGRlcGVuZGVuY2llcyB0byBhZGQgaXMgYSBwb2xpY3kgZGVjaXNpb24uCisgICAgICAgICAgICBIb3dldmVyLCB0aGUgZWZmZWN0IGlzIHRvIGdlbmVyYXRlIGEgbWFzdGVyIGNoZWNrc3VtIHRoYXQgY29tYmluZXMgdGhlIGJhc2VoYXNoCisgICAgICAgICAgICBhbmQgdGhlIGhhc2hlcyBvZiB0aGUgdGFzaydzIGRlcGVuZGVuY2llcy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQXQgdGhlIGNvZGUgbGV2ZWwsIHRoZXJlIGFyZSBhIHZhcmlldHkgb2Ygd2F5cyBib3RoIHRoZSBiYXNlaGFzaCBhbmQgdGhlCisgICAgICAgICAgICBkZXBlbmRlbnQgdGFzayBoYXNoZXMgY2FuIGJlIGluZmx1ZW5jZWQuCisgICAgICAgICAgICBXaXRoaW4gdGhlIEJpdEJha2UgY29uZmlndXJhdGlvbiBmaWxlLCB3ZSBjYW4gZ2l2ZSBCaXRCYWtlIHNvbWUgZXh0cmEgaW5mb3JtYXRpb24KKyAgICAgICAgICAgIHRvIGhlbHAgaXQgY29uc3RydWN0IHRoZSBiYXNlaGFzaC4KKyAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgc3RhdGVtZW50IGVmZmVjdGl2ZWx5IHJlc3VsdHMgaW4gYSBsaXN0IG9mIGdsb2JhbCB2YXJpYWJsZQorICAgICAgICAgICAgZGVwZW5kZW5jeSBleGNsdWRlcyAtIHZhcmlhYmxlcyBuZXZlciBpbmNsdWRlZCBpbiBhbnkgY2hlY2tzdW0uCisgICAgICAgICAgICBUaGlzIGV4YW1wbGUgdXNlcyB2YXJpYWJsZXMgZnJvbSBPcGVuRW1iZWRkZWQgdG8gaGVscCBpbGx1c3RyYXRlCisgICAgICAgICAgICB0aGUgY29uY2VwdDoKKyAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgQkJfSEFTSEJBU0VfV0hJVEVMSVNUID89ICJUTVBESVIgRklMRSBQQVRIIFBXRCBCQl9UQVNLSEFTSCBCQlBBVEggRExfRElSIFwKKyAgICAgICAgIFNTVEFURV9ESVIgVEhJU0RJUiBGSUxFU0VYVFJBUEFUSFMgRklMRV9ESVJOQU1FIEhPTUUgTE9HTkFNRSBTSEVMTCBURVJNIFwKKyAgICAgICAgIFVTRVIgRklMRVNQQVRIIFNUQUdJTkdfRElSX0hPU1QgU1RBR0lOR19ESVJfVEFSR0VUIENPUkVCQVNFIFBSU0VSVl9IT1NUIFwKKyAgICAgICAgIFBSU0VSVl9EVU1QRElSIFBSU0VSVl9EVU1QRklMRSBQUlNFUlZfTE9DS0RPV04gUEFSQUxMRUxfTUFLRSBcCisgICAgICAgICBDQ0FDSEVfRElSIEVYVEVSTkFMX1RPT0xDSEFJTiBDQ0FDSEUgQ0NBQ0hFX0RJU0FCTEUgTElDRU5TRV9QQVRIIFNES1BLR1NVRkZJWCIKKyAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgIFRoZSBwcmV2aW91cyBleGFtcGxlIGV4Y2x1ZGVzIHRoZSB3b3JrIGRpcmVjdG9yeSwgd2hpY2ggaXMgcGFydCBvZgorICAgICAgICAgICAgPGZpbGVuYW1lPlRNUERJUjwvZmlsZW5hbWU+LgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGUgcnVsZXMgZm9yIGRlY2lkaW5nIHdoaWNoIGhhc2hlcyBvZiBkZXBlbmRlbnQgdGFza3MgdG8gaW5jbHVkZSB0aHJvdWdoCisgICAgICAgICAgICBkZXBlbmRlbmN5IGNoYWlucyBhcmUgbW9yZSBjb21wbGV4IGFuZCBhcmUgZ2VuZXJhbGx5IGFjY29tcGxpc2hlZCB3aXRoIGEKKyAgICAgICAgICAgIFB5dGhvbiBmdW5jdGlvbi4KKyAgICAgICAgICAgIFRoZSBjb2RlIGluIDxmaWxlbmFtZT5tZXRhL2xpYi9vZS9zc3RhdGVzaWcucHk8L2ZpbGVuYW1lPiBzaG93cyB0d28gZXhhbXBsZXMKKyAgICAgICAgICAgIG9mIHRoaXMgYW5kIGFsc28gaWxsdXN0cmF0ZXMgaG93IHlvdSBjYW4gaW5zZXJ0IHlvdXIgb3duIHBvbGljeSBpbnRvIHRoZSBzeXN0ZW0KKyAgICAgICAgICAgIGlmIHNvIGRlc2lyZWQuCisgICAgICAgICAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgdHdvIGJhc2ljIHNpZ25hdHVyZSBnZW5lcmF0b3JzIE9wZW5FbWJlZGRlZCBDb3JlCisgICAgICAgICAgICB1c2VzOiAgIk9FQmFzaWMiIGFuZCAiT0VCYXNpY0hhc2giLgorICAgICAgICAgICAgQnkgZGVmYXVsdCwgdGhlcmUgaXMgYSBkdW1teSAibm9vcCIgc2lnbmF0dXJlIGhhbmRsZXIgZW5hYmxlZCBpbiBCaXRCYWtlLgorICAgICAgICAgICAgVGhpcyBtZWFucyB0aGF0IGJlaGF2aW9yIGlzIHVuY2hhbmdlZCBmcm9tIHByZXZpb3VzIHZlcnNpb25zLgorICAgICAgICAgICAgPGZpbGVuYW1lPk9FLUNvcmU8L2ZpbGVuYW1lPiB1c2VzIHRoZSAiT0VCYXNpY0hhc2giIHNpZ25hdHVyZSBoYW5kbGVyIGJ5IGRlZmF1bHQKKyAgICAgICAgICAgIHRocm91Z2ggdGhpcyBzZXR0aW5nIGluIHRoZSA8ZmlsZW5hbWU+Yml0YmFrZS5jb25mPC9maWxlbmFtZT4gZmlsZToKKyAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgQkJfU0lHTkFUVVJFX0hBTkRMRVIgPz0gIk9FQmFzaWNIYXNoIgorICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgVGhlICJPRUJhc2ljSGFzaCIgPGZpbGVuYW1lPkJCX1NJR05BVFVSRV9IQU5ETEVSPC9maWxlbmFtZT4gaXMgdGhlIHNhbWUgYXMgdGhlCisgICAgICAgICAgICAiT0VCYXNpYyIgdmVyc2lvbiBidXQgYWRkcyB0aGUgdGFzayBoYXNoIHRvIHRoZSBzdGFtcCBmaWxlcy4KKyAgICAgICAgICAgIFRoaXMgcmVzdWx0cyBpbiBhbnkgbWV0YWRhdGEgY2hhbmdlIHRoYXQgY2hhbmdlcyB0aGUgdGFzayBoYXNoLCBhdXRvbWF0aWNhbGx5CisgICAgICAgICAgICBjYXVzaW5nIHRoZSB0YXNrIHRvIGJlIHJ1biBhZ2Fpbi4KKyAgICAgICAgICAgIFRoaXMgcmVtb3ZlcyB0aGUgbmVlZCB0byBidW1wCisgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItUFInPjxmaWxlbmFtZT5QUjwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgdmFsdWVzLCBhbmQgY2hhbmdlcyB0byBtZXRhZGF0YSBhdXRvbWF0aWNhbGx5IHJpcHBsZSBhY3Jvc3MgdGhlIGJ1aWxkLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBJdCBpcyBhbHNvIHdvcnRoIG5vdGluZyB0aGF0IHRoZSBlbmQgcmVzdWx0IG9mIHRoZXNlIHNpZ25hdHVyZSBnZW5lcmF0b3JzIGlzIHRvCisgICAgICAgICAgICBtYWtlIHNvbWUgZGVwZW5kZW5jeSBhbmQgaGFzaCBpbmZvcm1hdGlvbiBhdmFpbGFibGUgdG8gdGhlIGJ1aWxkLgorICAgICAgICAgICAgVGhpcyBpbmZvcm1hdGlvbiBpbmNsdWRlczoKKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxmaWxlbmFtZT5CQl9CQVNFSEFTSF90YXNrLTwvZmlsZW5hbWU+PHJlcGxhY2VhYmxlPnRhc2tuYW1lPC9yZXBsYWNlYWJsZT46CisgICAgICAgICAgICAgICAgICAgIFRoZSBiYXNlIGhhc2hlcyBmb3IgZWFjaCB0YXNrIGluIHRoZSByZWNpcGUuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZmlsZW5hbWU+QkJfQkFTRUhBU0hfPC9maWxlbmFtZT48cmVwbGFjZWFibGU+ZmlsZW5hbWU8L3JlcGxhY2VhYmxlPjxmaWxlbmFtZT46PC9maWxlbmFtZT48cmVwbGFjZWFibGU+dGFza25hbWU8L3JlcGxhY2VhYmxlPjoKKyAgICAgICAgICAgICAgICAgICAgVGhlIGJhc2UgaGFzaGVzIGZvciBlYWNoIGRlcGVuZGVudCB0YXNrLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGZpbGVuYW1lPkJCSEFTSERFUFNfPC9maWxlbmFtZT48cmVwbGFjZWFibGU+ZmlsZW5hbWU8L3JlcGxhY2VhYmxlPjxmaWxlbmFtZT46PC9maWxlbmFtZT48cmVwbGFjZWFibGU+dGFza25hbWU8L3JlcGxhY2VhYmxlPjoKKyAgICAgICAgICAgICAgICAgICAgVGhlIHRhc2sgZGVwZW5kZW5jaWVzIGZvciBlYWNoIHRhc2suCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZmlsZW5hbWU+QkJfVEFTS0hBU0g8L2ZpbGVuYW1lPjoKKyAgICAgICAgICAgICAgICAgICAgVGhlIGhhc2ggb2YgdGhlIGN1cnJlbnRseSBydW5uaW5nIHRhc2suCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEl0IGlzIHdvcnRoIG5vdGluZyB0aGF0IEJpdEJha2UncyAiLVMiIG9wdGlvbiBsZXRzIHlvdQorICAgICAgICAgICAgZGVidWcgQml0YmFrZSdzIHByb2Nlc3Npbmcgb2Ygc2lnbmF0dXJlcy4KKyAgICAgICAgICAgIFRoZSBvcHRpb25zIHBhc3NlZCB0byAtUyBhbGxvdyBkaWZmZXJlbnQgZGVidWdnaW5nIG1vZGVzCisgICAgICAgICAgICB0byBiZSB1c2VkLCBlaXRoZXIgdXNpbmcgQml0QmFrZSdzIG93biBkZWJ1ZyBmdW5jdGlvbnMKKyAgICAgICAgICAgIG9yIHBvc3NpYmx5IHRob3NlIGRlZmluZWQgaW4gdGhlIG1ldGFkYXRhL3NpZ25hdHVyZSBoYW5kbGVyCisgICAgICAgICAgICBpdHNlbGYuCisgICAgICAgICAgICBUaGUgc2ltcGxlc3QgcGFyYW1ldGVyIHRvIHBhc3MgaXMgIm5vbmUiLCB3aGljaCBjYXVzZXMgYQorICAgICAgICAgICAgc2V0IG9mIHNpZ25hdHVyZSBpbmZvcm1hdGlvbiB0byBiZSB3cml0dGVuIG91dCBpbnRvCisgICAgICAgICAgICA8ZmlsZW5hbWU+U1RBTVBfRElSPC9maWxlbmFtZT4KKyAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRhcmdldHMgc3BlY2lmaWVkLgorICAgICAgICAgICAgVGhlIG90aGVyIGN1cnJlbnRseSBhdmFpbGFibGUgcGFyYW1ldGVyIGlzICJwcmludGRpZmYiLAorICAgICAgICAgICAgd2hpY2ggY2F1c2VzIEJpdEJha2UgdG8gdHJ5IHRvIGVzdGFibGlzaCB0aGUgY2xvc2VzdAorICAgICAgICAgICAgc2lnbmF0dXJlIG1hdGNoIGl0IGNhbiAoZS5nLiBpbiB0aGUgc3N0YXRlIGNhY2hlKSBhbmQgdGhlbgorICAgICAgICAgICAgcnVuIDxmaWxlbmFtZT5iaXRiYWtlLWRpZmZzaWdzPC9maWxlbmFtZT4gb3ZlciB0aGUgbWF0Y2hlcworICAgICAgICAgICAgdG8gZGV0ZXJtaW5lIHRoZSBzdGFtcHMgYW5kIGRlbHRhIHdoZXJlIHRoZXNlIHR3bworICAgICAgICAgICAgc3RhbXAgdHJlZXMgZGl2ZXJnZS4KKyAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgIEl0IGlzIGxpa2VseSB0aGF0IGZ1dHVyZSB2ZXJzaW9ucyBvZiBCaXRCYWtlIHdpbGwKKyAgICAgICAgICAgICAgICBwcm92aWRlIG90aGVyIHNpZ25hdHVyZSBoYW5kbGVycyB0cmlnZ2VyZWQgdGhyb3VnaAorICAgICAgICAgICAgICAgIGFkZGl0aW9uYWwgIi1TIiBwYXJhbWV0ZXJzLgorICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBZb3UgY2FuIGZpbmQgbW9yZSBpbmZvcm1hdGlvbiBvbiBjaGVja3N1bSBtZXRhZGF0YSBpbiB0aGUKKyAgICAgICAgICAgICI8bGluayBsaW5rZW5kPSd0YXNrLWNoZWNrc3Vtcy1hbmQtc2V0c2NlbmUnPlRhc2sgQ2hlY2tzdW1zIGFuZCBTZXRzY2VuZTwvbGluaz4iCisgICAgICAgICAgICBzZWN0aW9uLgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24gaWQ9J3NldHNjZW5lJz4KKyAgICAgICAgPHRpdGxlPlNldHNjZW5lPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSBzZXRzY2VuZSBwcm9jZXNzIGVuYWJsZXMgQml0QmFrZSB0byBoYW5kbGUgInByZS1idWlsdCIgYXJ0aWZhY3RzLgorICAgICAgICAgICAgVGhlIGFiaWxpdHkgdG8gaGFuZGxlIGFuZCByZXVzZSB0aGVzZSBhcnRpZmFjdHMgYWxsb3dzIEJpdEJha2UKKyAgICAgICAgICAgIHRoZSBsdXh1cnkgb2Ygbm90IGhhdmluZyB0byBidWlsZCBzb21ldGhpbmcgZnJvbSBzY3JhdGNoIGV2ZXJ5IHRpbWUuCisgICAgICAgICAgICBJbnN0ZWFkLCBCaXRCYWtlIGNhbiB1c2UsIHdoZW4gcG9zc2libGUsIGV4aXN0aW5nIGJ1aWxkIGFydGlmYWN0cy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQml0QmFrZSBuZWVkcyB0byBoYXZlIHJlbGlhYmxlIGRhdGEgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCBhbgorICAgICAgICAgICAgYXJ0aWZhY3QgaXMgY29tcGF0aWJsZS4KKyAgICAgICAgICAgIFNpZ25hdHVyZXMsIGRlc2NyaWJlZCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbiwgcHJvdmlkZSBhbiBpZGVhbAorICAgICAgICAgICAgd2F5IG9mIHJlcHJlc2VudGluZyB3aGV0aGVyIGFuIGFydGlmYWN0IGlzIGNvbXBhdGlibGUuCisgICAgICAgICAgICBJZiBhIHNpZ25hdHVyZSBpcyB0aGUgc2FtZSwgYW4gb2JqZWN0IGNhbiBiZSByZXVzZWQuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIElmIGFuIG9iamVjdCBjYW4gYmUgcmV1c2VkLCB0aGUgcHJvYmxlbSB0aGVuIGJlY29tZXMgaG93IHRvCisgICAgICAgICAgICByZXBsYWNlIGEgZ2l2ZW4gdGFzayBvciBzZXQgb2YgdGFza3Mgd2l0aCB0aGUgcHJlLWJ1aWx0IGFydGlmYWN0LgorICAgICAgICAgICAgQml0QmFrZSBzb2x2ZXMgdGhlIHByb2JsZW0gd2l0aCB0aGUgInNldHNjZW5lIiBwcm9jZXNzLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBXaGVuIEJpdEJha2UgaXMgYXNrZWQgdG8gYnVpbGQgYSBnaXZlbiB0YXJnZXQsIGJlZm9yZSBidWlsZGluZyBhbnl0aGluZywKKyAgICAgICAgICAgIGl0IGZpcnN0IGFza3Mgd2hldGhlciBjYWNoZWQgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIGZvciBhbnkgb2YgdGhlCisgICAgICAgICAgICB0YXJnZXRzIGl0J3MgYnVpbGRpbmcsIG9yIGFueSBvZiB0aGUgaW50ZXJtZWRpYXRlIHRhcmdldHMuCisgICAgICAgICAgICBJZiBjYWNoZWQgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLCBCaXRCYWtlIHVzZXMgdGhpcyBpbmZvcm1hdGlvbiBpbnN0ZWFkIG9mCisgICAgICAgICAgICBydW5uaW5nIHRoZSBtYWluIHRhc2tzLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBCaXRCYWtlIGZpcnN0IGNhbGxzIHRoZSBmdW5jdGlvbiBkZWZpbmVkIGJ5IHRoZQorICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUJCX0hBU0hDSEVDS19GVU5DVElPTic+PGZpbGVuYW1lPkJCX0hBU0hDSEVDS19GVU5DVElPTjwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgdmFyaWFibGUgd2l0aCBhIGxpc3Qgb2YgdGFza3MgYW5kIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgICAgIGhhc2hlcyBpdCB3YW50cyB0byBidWlsZC4KKyAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgZmFzdCBhbmQgcmV0dXJucyBhIGxpc3QKKyAgICAgICAgICAgIG9mIHRoZSB0YXNrcyBmb3Igd2hpY2ggaXQgYmVsaWV2ZXMgaW4gY2FuIG9idGFpbiBhcnRpZmFjdHMuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIE5leHQsIGZvciBlYWNoIG9mIHRoZSB0YXNrcyB0aGF0IHdlcmUgcmV0dXJuZWQgYXMgcG9zc2liaWxpdGllcywKKyAgICAgICAgICAgIEJpdEJha2UgZXhlY3V0ZXMgYSBzZXRzY2VuZSB2ZXJzaW9uIG9mIHRoZSB0YXNrIHRoYXQgdGhlIHBvc3NpYmxlCisgICAgICAgICAgICBhcnRpZmFjdCBjb3ZlcnMuCisgICAgICAgICAgICBTZXRzY2VuZSB2ZXJzaW9ucyBvZiBhIHRhc2sgaGF2ZSB0aGUgc3RyaW5nICJfc2V0c2NlbmUiIGFwcGVuZGVkIHRvIHRoZQorICAgICAgICAgICAgdGFzayBuYW1lLgorICAgICAgICAgICAgU28sIGZvciBleGFtcGxlLCB0aGUgdGFzayB3aXRoIHRoZSBuYW1lIDxmaWxlbmFtZT54eHg8L2ZpbGVuYW1lPiBoYXMKKyAgICAgICAgICAgIGEgc2V0c2NlbmUgdGFzayBuYW1lZCA8ZmlsZW5hbWU+eHh4X3NldHNjZW5lPC9maWxlbmFtZT4uCisgICAgICAgICAgICBUaGUgc2V0c2NlbmUgdmVyc2lvbiBvZiB0aGUgdGFzayBleGVjdXRlcyBhbmQgcHJvdmlkZXMgdGhlIG5lY2Vzc2FyeQorICAgICAgICAgICAgYXJ0aWZhY3RzIHJldHVybmluZyBlaXRoZXIgc3VjY2VzcyBvciBmYWlsdXJlLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBBcyBwcmV2aW91c2x5IG1lbnRpb25lZCwgYW4gYXJ0aWZhY3QgY2FuIGNvdmVyIG1vcmUgdGhhbiBvbmUgdGFzay4KKyAgICAgICAgICAgIEZvciBleGFtcGxlLCBpdCBpcyBwb2ludGxlc3MgdG8gb2J0YWluIGEgY29tcGlsZXIgaWYgeW91CisgICAgICAgICAgICBhbHJlYWR5IGhhdmUgdGhlIGNvbXBpbGVkIGJpbmFyeS4KKyAgICAgICAgICAgIFRvIGhhbmRsZSB0aGlzLCBCaXRCYWtlIGNhbGxzIHRoZQorICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUJCX1NFVFNDRU5FX0RFUFZBTElEJz48ZmlsZW5hbWU+QkJfU0VUU0NFTkVfREVQVkFMSUQ8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgIGZ1bmN0aW9uIGZvciBlYWNoIHN1Y2Nlc3NmdWwgc2V0c2NlbmUgdGFzayB0byBrbm93IHdoZXRoZXIgb3Igbm90IGl0IG5lZWRzCisgICAgICAgICAgICB0byBvYnRhaW4gdGhlIGRlcGVuZGVuY2llcyBvZiB0aGF0IHRhc2suCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEZpbmFsbHksIGFmdGVyIGFsbCB0aGUgc2V0c2NlbmUgdGFza3MgaGF2ZSBleGVjdXRlZCwgQml0QmFrZSBjYWxscyB0aGUKKyAgICAgICAgICAgIGZ1bmN0aW9uIGxpc3RlZCBpbgorICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUJCX1NFVFNDRU5FX1ZFUklGWV9GVU5DVElPTic+PGZpbGVuYW1lPkJCX1NFVFNDRU5FX1ZFUklGWV9GVU5DVElPTjwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgd2l0aCB0aGUgbGlzdCBvZiB0YXNrcyBCaXRCYWtlIHRoaW5rcyBoYXMgYmVlbiAiY292ZXJlZCIuCisgICAgICAgICAgICBUaGUgbWV0YWRhdGEgY2FuIHRoZW4gZW5zdXJlIHRoYXQgdGhpcyBsaXN0IGlzIGNvcnJlY3QgYW5kIGNhbgorICAgICAgICAgICAgaW5mb3JtIEJpdEJha2UgdGhhdCBpdCB3YW50cyBzcGVjaWZpYyB0YXNrcyB0byBiZSBydW4gcmVnYXJkbGVzcworICAgICAgICAgICAgb2YgdGhlIHNldHNjZW5lIHJlc3VsdC4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgWW91IGNhbiBmaW5kIG1vcmUgaW5mb3JtYXRpb24gb24gc2V0c2NlbmUgbWV0YWRhdGEgaW4gdGhlCisgICAgICAgICAgICAiPGxpbmsgbGlua2VuZD0ndGFzay1jaGVja3N1bXMtYW5kLXNldHNjZW5lJz5UYXNrIENoZWNrc3VtcyBhbmQgU2V0c2NlbmU8L2xpbms+IgorICAgICAgICAgICAgc2VjdGlvbi4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKzwvY2hhcHRlcj4KZGlmZiAtLWdpdCBhL2JpdGJha2UvZG9jL2JpdGJha2UtdXNlci1tYW51YWwvYml0YmFrZS11c2VyLW1hbnVhbC1mZXRjaGluZy54bWwgYi9iaXRiYWtlL2RvYy9iaXRiYWtlLXVzZXItbWFudWFsL2JpdGJha2UtdXNlci1tYW51YWwtZmV0Y2hpbmcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNjhjZmEKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2RvYy9iaXRiYWtlLXVzZXItbWFudWFsL2JpdGJha2UtdXNlci1tYW51YWwtZmV0Y2hpbmcueG1sCkBAIC0wLDAgKzEsNzY1IEBACis8IURPQ1RZUEUgY2hhcHRlciBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuMi8vRU4iCisiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9kb2Nib29rL3htbC80LjIvZG9jYm9va3guZHRkIj4KKworPGNoYXB0ZXI+Cis8dGl0bGU+RmlsZSBEb3dubG9hZCBTdXBwb3J0PC90aXRsZT4KKworICAgIDxwYXJhPgorICAgICAgICBCaXRCYWtlJ3MgZmV0Y2ggbW9kdWxlIGlzIGEgc3RhbmRhbG9uZSBwaWVjZSBvZiBsaWJyYXJ5IGNvZGUKKyAgICAgICAgdGhhdCBkZWFscyB3aXRoIHRoZSBpbnRyaWNhY2llcyBvZiBkb3dubG9hZGluZyBzb3VyY2UgY29kZQorICAgICAgICBhbmQgZmlsZXMgZnJvbSByZW1vdGUgc3lzdGVtcy4KKyAgICAgICAgRmV0Y2hpbmcgc291cmNlIGNvZGUgaXMgb25lIG9mIHRoZSBjb3JuZXJzdG9uZXMgb2YgYnVpbGRpbmcgc29mdHdhcmUuCisgICAgICAgIEFzIHN1Y2gsIHRoaXMgbW9kdWxlIGZvcm1zIGFuIGltcG9ydGFudCBwYXJ0IG9mIEJpdEJha2UuCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICAgIFRoZSBjdXJyZW50IGZldGNoIG1vZHVsZSBpcyBjYWxsZWQgImZldGNoMiIgYW5kIHJlZmVycyB0byB0aGUKKyAgICAgICAgZmFjdCB0aGF0IGl0IGlzIHRoZSBzZWNvbmQgbWFqb3IgdmVyc2lvbiBvZiB0aGUgQVBJLgorICAgICAgICBUaGUgb3JpZ2luYWwgdmVyc2lvbiBpcyBvYnNvbGV0ZSBhbmQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBjb2RlYmFzZS4KKyAgICAgICAgVGh1cywgaW4gYWxsIGNhc2VzLCAiZmV0Y2giIHJlZmVycyB0byAiZmV0Y2gyIiBpbiB0aGlzCisgICAgICAgIG1hbnVhbC4KKyAgICA8L3BhcmE+CisKKyAgICA8c2VjdGlvbiBpZD0ndGhlLWRvd25sb2FkLWZldGNoJz4KKyAgICAgICAgPHRpdGxlPlRoZSBEb3dubG9hZCAoRmV0Y2gpPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEJpdEJha2UgdGFrZXMgc2V2ZXJhbCBzdGVwcyB3aGVuIGZldGNoaW5nIHNvdXJjZSBjb2RlIG9yIGZpbGVzLgorICAgICAgICAgICAgVGhlIGZldGNoZXIgY29kZWJhc2UgZGVhbHMgd2l0aCB0d28gZGlzdGluY3QgcHJvY2Vzc2VzIGluIG9yZGVyOgorICAgICAgICAgICAgb2J0YWluaW5nIHRoZSBmaWxlcyBmcm9tIHNvbWV3aGVyZSAoY2FjaGVkIG9yIG90aGVyd2lzZSkKKyAgICAgICAgICAgIGFuZCB0aGVuIHVucGFja2luZyB0aG9zZSBmaWxlcyBpbnRvIGEgc3BlY2lmaWMgbG9jYXRpb24gYW5kCisgICAgICAgICAgICBwZXJoYXBzIGluIGEgc3BlY2lmaWMgd2F5LgorICAgICAgICAgICAgR2V0dGluZyBhbmQgdW5wYWNraW5nIHRoZSBmaWxlcyBpcyBvZnRlbiBvcHRpb25hbGx5IGZvbGxvd2VkCisgICAgICAgICAgICBieSBwYXRjaGluZy4KKyAgICAgICAgICAgIFBhdGNoaW5nLCBob3dldmVyLCBpcyBub3QgY292ZXJlZCBieSB0aGlzIG1vZHVsZS4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlIGNvZGUgdG8gZXhlY3V0ZSB0aGUgZmlyc3QgcGFydCBvZiB0aGlzIHByb2Nlc3MsIGEgZmV0Y2gsCisgICAgICAgICAgICBsb29rcyBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nOgorICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBzcmNfdXJpID0gKGQuZ2V0VmFyKCdTUkNfVVJJJywgVHJ1ZSkgb3IgIiIpLnNwbGl0KCkKKyAgICAgZmV0Y2hlciA9IGJiLmZldGNoMi5GZXRjaChzcmNfdXJpLCBkKQorICAgICBmZXRjaGVyLmRvd25sb2FkKCkKKyAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgIFRoaXMgY29kZSBzZXRzIHVwIGFuIGluc3RhbmNlIG9mIHRoZSBmZXRjaCBjbGFzcy4KKyAgICAgICAgICAgIFRoZSBpbnN0YW5jZSB1c2VzIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgVVJMcyBmcm9tIHRoZQorICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVNSQ19VUkknPjxmaWxlbmFtZT5TUkNfVVJJPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICB2YXJpYWJsZSBhbmQgdGhlbiBjYWxscyB0aGUgPGZpbGVuYW1lPmRvd25sb2FkPC9maWxlbmFtZT4KKyAgICAgICAgICAgIG1ldGhvZCB0byBkb3dubG9hZCB0aGUgZmlsZXMuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSBpbnN0YW50aWF0aW9uIG9mIHRoZSBmZXRjaCBjbGFzcyBpcyB1c3VhbGx5IGZvbGxvd2VkIGJ5OgorICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICByb290ZGlyID0gbC5nZXRWYXIoJ1dPUktESVInLCBUcnVlKQorICAgICBmZXRjaGVyLnVucGFjayhyb290ZGlyKQorICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgVGhpcyBjb2RlIHVucGFja3MgdGhlIGRvd25sb2FkZWQgZmlsZXMgdG8gdGhlCisgICAgICAgICAgICBzcGVjaWZpZWQgYnkgPGZpbGVuYW1lPldPUktESVI8L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgIEZvciBjb252ZW5pZW5jZSwgdGhlIG5hbWluZyBpbiB0aGVzZSBleGFtcGxlcyBtYXRjaGVzCisgICAgICAgICAgICAgICAgdGhlIHZhcmlhYmxlcyB1c2VkIGJ5IE9wZW5FbWJlZGRlZC4KKyAgICAgICAgICAgICAgICBJZiB5b3Ugd2FudCB0byBzZWUgdGhlIGFib3ZlIGNvZGUgaW4gYWN0aW9uLCBleGFtaW5lCisgICAgICAgICAgICAgICAgdGhlIE9wZW5FbWJlZGRlZCBjbGFzcyBmaWxlIDxmaWxlbmFtZT5iYXNlLmJiY2xhc3M8L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgIFRoZSA8ZmlsZW5hbWU+U1JDX1VSSTwvZmlsZW5hbWU+IGFuZCA8ZmlsZW5hbWU+V09SS0RJUjwvZmlsZW5hbWU+CisgICAgICAgICAgICB2YXJpYWJsZXMgYXJlIG5vdCBoYXJkY29kZWQgaW50byB0aGUgZmV0Y2hlciwgc2luY2UgdGhvc2UgZmV0Y2hlcgorICAgICAgICAgICAgbWV0aG9kcyBjYW4gYmUgKGFuZCBhcmUpIGNhbGxlZCB3aXRoIGRpZmZlcmVudCB2YXJpYWJsZSBuYW1lcy4KKyAgICAgICAgICAgIEluIE9wZW5FbWJlZGRlZCBmb3IgZXhhbXBsZSwgdGhlIHNoYXJlZCBzdGF0ZSAoc3N0YXRlKSBjb2RlIHVzZXMKKyAgICAgICAgICAgIHRoZSBmZXRjaCBtb2R1bGUgdG8gZmV0Y2ggdGhlIHNzdGF0ZSBmaWxlcy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgV2hlbiB0aGUgPGZpbGVuYW1lPmRvd25sb2FkKCk8L2ZpbGVuYW1lPiBtZXRob2QgaXMgY2FsbGVkLAorICAgICAgICAgICAgQml0QmFrZSB0cmllcyB0byByZXNvbHZlIHRoZSBVUkxzIGJ5IGxvb2tpbmcgZm9yIHNvdXJjZSBmaWxlcworICAgICAgICAgICAgaW4gYSBzcGVjaWZpYyBzZWFyY2ggb3JkZXI6CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+UHJlLW1pcnJvciBTaXRlczo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICBCaXRCYWtlIGZpcnN0IHVzZXMgcHJlLW1pcnJvcnMgdG8gdHJ5IGFuZCBmaW5kIHNvdXJjZSBmaWxlcy4KKyAgICAgICAgICAgICAgICAgICAgVGhlc2UgbG9jYXRpb25zIGFyZSBkZWZpbmVkIHVzaW5nIHRoZQorICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItUFJFTUlSUk9SUyc+PGZpbGVuYW1lPlBSRU1JUlJPUlM8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+U291cmNlIFVSSTo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICBJZiBwcmUtbWlycm9ycyBmYWlsLCBCaXRCYWtlIHVzZXMgdGhlIG9yaWdpbmFsIFVSTCAoZS5nIGZyb20KKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPlNSQ19VUkk8L2ZpbGVuYW1lPikuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+TWlycm9yIFNpdGVzOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIElmIGZldGNoIGZhaWx1cmVzIG9jY3VyLCBCaXRCYWtlIG5leHQgdXNlcyBtaXJyb3IgbG9jYXRpb25zIGFzCisgICAgICAgICAgICAgICAgICAgIGRlZmluZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1NSVJST1JTJz48ZmlsZW5hbWU+TUlSUk9SUzwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgRm9yIGVhY2ggVVJMIHBhc3NlZCB0byB0aGUgZmV0Y2hlciwgdGhlIGZldGNoZXIKKyAgICAgICAgICAgIGNhbGxzIHRoZSBzdWJtb2R1bGUgdGhhdCBoYW5kbGVzIHRoYXQgcGFydGljdWxhciBVUkwgdHlwZS4KKyAgICAgICAgICAgIFRoaXMgYmVoYXZpb3IgY2FuIGJlIHRoZSBzb3VyY2Ugb2Ygc29tZSBjb25mdXNpb24gd2hlbiB5b3UKKyAgICAgICAgICAgIGFyZSBwcm92aWRpbmcgVVJMcyBmb3IgdGhlIDxmaWxlbmFtZT5TUkNfVVJJPC9maWxlbmFtZT4KKyAgICAgICAgICAgIHZhcmlhYmxlLgorICAgICAgICAgICAgQ29uc2lkZXIgdGhlIGZvbGxvd2luZyB0d28gVVJMczoKKyAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgaHR0cDovL2dpdC55b2N0b3Byb2plY3Qub3JnL2dpdC9wb2t5O3Byb3RvY29sPWdpdAorICAgICBnaXQ6Ly9naXQueW9jdG9wcm9qZWN0Lm9yZy9naXQvcG9reTtwcm90b2NvbD1odHRwCisgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICBJbiB0aGUgZm9ybWVyIGNhc2UsIHRoZSBVUkwgaXMgcGFzc2VkIHRvIHRoZQorICAgICAgICAgICAgPGZpbGVuYW1lPndnZXQ8L2ZpbGVuYW1lPiBmZXRjaGVyLCB3aGljaCBkb2VzIG5vdAorICAgICAgICAgICAgdW5kZXJzdGFuZCAiZ2l0Ii4KKyAgICAgICAgICAgIFRoZXJlZm9yZSwgdGhlIGxhdHRlciBjYXNlIGlzIHRoZSBjb3JyZWN0IGZvcm0gc2luY2UgdGhlCisgICAgICAgICAgICBHaXQgZmV0Y2hlciBkb2VzIGtub3cgaG93IHRvIHVzZSBIVFRQIGFzIGEgdHJhbnNwb3J0LgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBIZXJlIGFyZSBzb21lIGV4YW1wbGVzIHRoYXQgc2hvdyBjb21tb25seSB1c2VkIG1pcnJvcgorICAgICAgICAgICAgZGVmaW5pdGlvbnM6CisgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIFBSRU1JUlJPUlMgPz0gIlwKKyAgICAgICAgIGJ6cjovLy4qLy4qICAgaHR0cDovL3NvbWVtaXJyb3Iub3JnL3NvdXJjZXMvIFxuIFwKKyAgICAgICAgIGN2czovLy4qLy4qICAgaHR0cDovL3NvbWVtaXJyb3Iub3JnL3NvdXJjZXMvIFxuIFwKKyAgICAgICAgIGdpdDovLy4qLy4qICAgaHR0cDovL3NvbWVtaXJyb3Iub3JnL3NvdXJjZXMvIFxuIFwKKyAgICAgICAgIGhnOi8vLiovLiogICAgaHR0cDovL3NvbWVtaXJyb3Iub3JnL3NvdXJjZXMvIFxuIFwKKyAgICAgICAgIG9zYzovLy4qLy4qICAgaHR0cDovL3NvbWVtaXJyb3Iub3JnL3NvdXJjZXMvIFxuIFwKKyAgICAgICAgIHA0Oi8vLiovLiogICAgaHR0cDovL3NvbWVtaXJyb3Iub3JnL3NvdXJjZXMvIFxuIFwKKyAgICAgICAgIHN2bjovLy4qLy4qICAgaHR0cDovL3NvbWVtaXJyb3Iub3JnL3NvdXJjZXMvIFxuIgorCisgICAgIE1JUlJPUlMgPSsgIlwKKyAgICAgICAgIGZ0cDovLy4qLy4qICAgICAgaHR0cDovL3NvbWVtaXJyb3Iub3JnL3NvdXJjZXMvIFxuIFwKKyAgICAgICAgIGh0dHA6Ly8uKi8uKiAgICAgaHR0cDovL3NvbWVtaXJyb3Iub3JnL3NvdXJjZXMvIFxuIFwKKyAgICAgICAgIGh0dHBzOi8vLiovLiogICAgaHR0cDovL3NvbWVtaXJyb3Iub3JnL3NvdXJjZXMvIFxuIgorICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgSXQgaXMgdXNlZnVsIHRvIG5vdGUgdGhhdCBCaXRCYWtlIHN1cHBvcnRzCisgICAgICAgICAgICBjcm9zcy1VUkxzLgorICAgICAgICAgICAgSXQgaXMgcG9zc2libGUgdG8gbWlycm9yIGEgR2l0IHJlcG9zaXRvcnkgb24gYW4gSFRUUAorICAgICAgICAgICAgc2VydmVyIGFzIGEgdGFyYmFsbC4KKyAgICAgICAgICAgIFRoaXMgaXMgd2hhdCB0aGUgPGZpbGVuYW1lPmdpdDovLzwvZmlsZW5hbWU+IG1hcHBpbmcgaW4KKyAgICAgICAgICAgIHRoZSBwcmV2aW91cyBleGFtcGxlIGRvZXMuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFNpbmNlIG5ldHdvcmsgYWNjZXNzZXMgYXJlIHNsb3csIEJpdGJha2UgbWFpbnRhaW5zIGEKKyAgICAgICAgICAgIGNhY2hlIG9mIGZpbGVzIGRvd25sb2FkZWQgZnJvbSB0aGUgbmV0d29yay4KKyAgICAgICAgICAgIEFueSBzb3VyY2UgZmlsZXMgdGhhdCBhcmUgbm90IGxvY2FsIChpLmUuCisgICAgICAgICAgICBkb3dubG9hZGVkIGZyb20gdGhlIEludGVybmV0KSBhcmUgcGxhY2VkIGludG8gdGhlIGRvd25sb2FkCisgICAgICAgICAgICBkaXJlY3RvcnksIHdoaWNoIGlzIHNwZWNpZmllZCBieSB0aGUKKyAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1ETF9ESVInPjxmaWxlbmFtZT5ETF9ESVI8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgIHZhcmlhYmxlLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBGaWxlIGludGVncml0eSBpcyBvZiBrZXkgaW1wb3J0YW5jZSBmb3IgcmVwcm9kdWNpbmcgYnVpbGRzLgorICAgICAgICAgICAgRm9yIG5vbi1sb2NhbCBhcmNoaXZlIGRvd25sb2FkcywgdGhlIGZldGNoZXIgY29kZSBjYW4gdmVyaWZ5CisgICAgICAgICAgICBTSEEtMjU2IGFuZCBNRDUgY2hlY2tzdW1zIHRvIGVuc3VyZSB0aGUgYXJjaGl2ZXMgaGF2ZSBiZWVuCisgICAgICAgICAgICBkb3dubG9hZGVkIGNvcnJlY3RseS4KKyAgICAgICAgICAgIFlvdSBjYW4gc3BlY2lmeSB0aGVzZSBjaGVja3N1bXMgYnkgdXNpbmcgdGhlCisgICAgICAgICAgICA8ZmlsZW5hbWU+U1JDX1VSSTwvZmlsZW5hbWU+IHZhcmlhYmxlIHdpdGggdGhlIGFwcHJvcHJpYXRlCisgICAgICAgICAgICB2YXJmbGFncyBhcyBmb2xsb3dzOgorICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBTUkNfVVJJW21kNXN1bV0gPSAiPHJlcGxhY2VhYmxlPnZhbHVlPC9yZXBsYWNlYWJsZT4iCisgICAgIFNSQ19VUklbc2hhMjU2c3VtXSA9ICI8cmVwbGFjZWFibGU+dmFsdWU8L3JlcGxhY2VhYmxlPiIKKyAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IHRoZSBjaGVja3N1bXMgYXMgcGFyYW1ldGVycyBvbiB0aGUKKyAgICAgICAgICAgIDxmaWxlbmFtZT5TUkNfVVJJPC9maWxlbmFtZT4gYXMgc2hvd24gYmVsb3c6CisgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIFNSQ19VUkkgPSAiaHR0cDovL2V4YW1wbGUuY29tL2Zvb2Jhci50YXIuYnoyO21kNXN1bT00YThlMGYyMzdlOTYxZmQ3Nzg1ZDE5ZDA3ZmRiOTk0ZCIKKyAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgIElmIG11bHRpcGxlIFVSSXMgZXhpc3QsIHlvdSBjYW4gc3BlY2lmeSB0aGUgY2hlY2tzdW1zIGVpdGhlcgorICAgICAgICAgICAgZGlyZWN0bHkgYXMgaW4gdGhlIHByZXZpb3VzIGV4YW1wbGUsIG9yIHlvdSBjYW4gbmFtZSB0aGUgVVJMcy4KKyAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgc3ludGF4IHNob3dzIGhvdyB5b3UgbmFtZSB0aGUgVVJJczoKKyAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgU1JDX1VSSSA9ICJodHRwOi8vZXhhbXBsZS5jb20vZm9vYmFyLnRhci5iejI7bmFtZT1mb28iCisgICAgIFNSQ19VUklbZm9vLm1kNXN1bV0gPSA0YThlMGYyMzdlOTYxZmQ3Nzg1ZDE5ZDA3ZmRiOTk0ZAorICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgQWZ0ZXIgYSBmaWxlIGhhcyBiZWVuIGRvd25sb2FkZWQgYW5kIGhhcyBoYWQgaXRzIGNoZWNrc3VtIGNoZWNrZWQsCisgICAgICAgICAgICBhICIuZG9uZSIgc3RhbXAgaXMgcGxhY2VkIGluIDxmaWxlbmFtZT5ETF9ESVI8L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgIEJpdEJha2UgdXNlcyB0aGlzIHN0YW1wIGR1cmluZyBzdWJzZXF1ZW50IGJ1aWxkcyB0byBhdm9pZAorICAgICAgICAgICAgZG93bmxvYWRpbmcgb3IgY29tcGFyaW5nIGEgY2hlY2tzdW0gZm9yIHRoZSBmaWxlIGFnYWluLgorICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgSXQgaXMgYXNzdW1lZCB0aGF0IGxvY2FsIHN0b3JhZ2UgaXMgc2FmZSBmcm9tIGRhdGEgY29ycnVwdGlvbi4KKyAgICAgICAgICAgICAgICBJZiB0aGlzIHdlcmUgbm90IHRoZSBjYXNlLCB0aGVyZSB3b3VsZCBiZSBiaWdnZXIgaXNzdWVzIHRvIHdvcnJ5IGFib3V0LgorICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBJZgorICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUJCX1NUUklDVF9DSEVDS1NVTSc+PGZpbGVuYW1lPkJCX1NUUklDVF9DSEVDS1NVTTwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgaXMgc2V0LCBhbnkgZG93bmxvYWQgd2l0aG91dCBhIGNoZWNrc3VtIHRyaWdnZXJzIGFuCisgICAgICAgICAgICBlcnJvciBtZXNzYWdlLgorICAgICAgICAgICAgVGhlCisgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItQkJfTk9fTkVUV09SSyc+PGZpbGVuYW1lPkJCX05PX05FVFdPUks8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgIHZhcmlhYmxlIGNhbiBiZSB1c2VkIHRvIG1ha2UgYW55IGF0dGVtcHRlZCBuZXR3b3JrIGFjY2VzcyBhIGZhdGFsCisgICAgICAgICAgICBlcnJvciwgd2hpY2ggaXMgdXNlZnVsIGZvciBjaGVja2luZyB0aGF0IG1pcnJvcnMgYXJlIGNvbXBsZXRlCisgICAgICAgICAgICBhcyB3ZWxsIGFzIG90aGVyIHRoaW5ncy4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIGlkPSdiYi10aGUtdW5wYWNrJz4KKyAgICAgICAgPHRpdGxlPlRoZSBVbnBhY2s8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlIHVucGFjayBwcm9jZXNzIHVzdWFsbHkgaW1tZWRpYXRlbHkgZm9sbG93cyB0aGUgZG93bmxvYWQuCisgICAgICAgICAgICBGb3IgYWxsIFVSTHMgZXhjZXB0IEdpdCBVUkxzLCBCaXRCYWtlIHVzZXMgdGhlIGNvbW1vbgorICAgICAgICAgICAgPGZpbGVuYW1lPnVucGFjazwvZmlsZW5hbWU+IG1ldGhvZC4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQSBudW1iZXIgb2YgcGFyYW1ldGVycyBleGlzdCB0aGF0IHlvdSBjYW4gc3BlY2lmeSB3aXRoaW4gdGhlCisgICAgICAgICAgICBVUkwgdG8gZ292ZXJuIHRoZSBiZWhhdmlvciBvZiB0aGUgdW5wYWNrIHN0YWdlOgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPnVucGFjazo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICBDb250cm9scyB3aGV0aGVyIHRoZSBVUkwgY29tcG9uZW50cyBhcmUgdW5wYWNrZWQuCisgICAgICAgICAgICAgICAgICAgIElmIHNldCB0byAiMSIsIHdoaWNoIGlzIHRoZSBkZWZhdWx0LCB0aGUgY29tcG9uZW50cworICAgICAgICAgICAgICAgICAgICBhcmUgdW5wYWNrZWQuCisgICAgICAgICAgICAgICAgICAgIElmIHNldCB0byAiMCIsIHRoZSB1bnBhY2sgc3RhZ2UgbGVhdmVzIHRoZSBmaWxlIGFsb25lLgorICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBpcyB1c2VmdWwgd2hlbiB5b3Ugd2FudCBhbiBhcmNoaXZlIHRvIGJlCisgICAgICAgICAgICAgICAgICAgIGNvcGllZCBpbiBhbmQgbm90IGJlIHVucGFja2VkLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPmRvczo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICBBcHBsaWVzIHRvIDxmaWxlbmFtZT4uemlwPC9maWxlbmFtZT4gYW5kCisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT4uamFyPC9maWxlbmFtZT4gZmlsZXMgYW5kIHNwZWNpZmllcyB3aGV0aGVyIHRvCisgICAgICAgICAgICAgICAgICAgIHVzZSBET1MgbGluZSBlbmRpbmcgY29udmVyc2lvbiBvbiB0ZXh0IGZpbGVzLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPmJhc2VwYXRoOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIEluc3RydWN0cyB0aGUgdW5wYWNrIHN0YWdlIHRvIHN0cmlwIHRoZSBzcGVjaWZpZWQKKyAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3JpZXMgZnJvbSB0aGUgc291cmNlIHBhdGggd2hlbiB1bnBhY2tpbmcuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+c3ViZGlyOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIFVucGFja3MgdGhlIHNwZWNpZmljIFVSTCB0byB0aGUgc3BlY2lmaWVkIHN1YmRpcmVjdG9yeQorICAgICAgICAgICAgICAgICAgICB3aXRoaW4gdGhlIHJvb3QgZGlyZWN0b3J5LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgVGhlIHVucGFjayBjYWxsIGF1dG9tYXRpY2FsbHkgZGVjb21wcmVzc2VzIGFuZCBleHRyYWN0cyBmaWxlcworICAgICAgICAgICAgd2l0aCAiLloiLCAiLnoiLCAiLmd6IiwgIi54eiIsICIuemlwIiwgIi5qYXIiLCAiLmlwayIsICIucnBtIi4KKyAgICAgICAgICAgICIuc3JwbSIsICIuZGViIiBhbmQgIi5iejIiIGV4dGVuc2lvbnMgYXMgd2VsbCBhcyB2YXJpb3VzIGNvbWJpbmF0aW9ucworICAgICAgICAgICAgb2YgdGFyYmFsbCBleHRlbnNpb25zLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBBcyBtZW50aW9uZWQsIHRoZSBHaXQgZmV0Y2hlciBoYXMgaXRzIG93biB1bnBhY2sgbWV0aG9kIHRoYXQKKyAgICAgICAgICAgIGlzIG9wdGltaXplZCB0byB3b3JrIHdpdGggR2l0IHRyZWVzLgorICAgICAgICAgICAgQmFzaWNhbGx5LCB0aGlzIG1ldGhvZCB3b3JrcyBieSBjbG9uaW5nIHRoZSB0cmVlIGludG8gdGhlIGZpbmFsCisgICAgICAgICAgICBkaXJlY3RvcnkuCisgICAgICAgICAgICBUaGUgcHJvY2VzcyBpcyBjb21wbGV0ZWQgdXNpbmcgcmVmZXJlbmNlcyBzbyB0aGF0IHRoZXJlIGlzCisgICAgICAgICAgICBvbmx5IG9uZSBjZW50cmFsIGNvcHkgb2YgdGhlIEdpdCBtZXRhZGF0YSBuZWVkZWQuCisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiBpZD0nYmItZmV0Y2hlcnMnPgorICAgICAgICA8dGl0bGU+RmV0Y2hlcnM8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQXMgbWVudGlvbmVkIGVhcmxpZXIsIHRoZSBVUkwgcHJlZml4IGRldGVybWluZXMgd2hpY2gKKyAgICAgICAgICAgIGZldGNoZXIgc3VibW9kdWxlIEJpdEJha2UgdXNlcy4KKyAgICAgICAgICAgIEVhY2ggc3VibW9kdWxlIGNhbiBzdXBwb3J0IGRpZmZlcmVudCBVUkwgcGFyYW1ldGVycywKKyAgICAgICAgICAgIHdoaWNoIGFyZSBkZXNjcmliZWQgaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9ucy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxzZWN0aW9uIGlkPSdsb2NhbC1maWxlLWZldGNoZXInPgorICAgICAgICAgICAgPHRpdGxlPkxvY2FsIGZpbGUgZmV0Y2hlciAoPGZpbGVuYW1lPmZpbGU6Ly88L2ZpbGVuYW1lPik8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGlzIHN1Ym1vZHVsZSBoYW5kbGVzIFVSTHMgdGhhdCBiZWdpbiB3aXRoCisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmZpbGU6Ly88L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgICAgICBUaGUgZmlsZW5hbWUgeW91IHNwZWNpZnkgd2l0aGluIHRoZSBVUkwgY2FuIGJlCisgICAgICAgICAgICAgICAgZWl0aGVyIGFuIGFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGggdG8gYSBmaWxlLgorICAgICAgICAgICAgICAgIElmIHRoZSBmaWxlbmFtZSBpcyByZWxhdGl2ZSwgdGhlIGNvbnRlbnRzIG9mIHRoZQorICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1GSUxFU1BBVEgnPjxmaWxlbmFtZT5GSUxFU1BBVEg8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgICAgICB2YXJpYWJsZSBpcyB1c2VkIGluIHRoZSBzYW1lIHdheQorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5QQVRIPC9maWxlbmFtZT4gaXMgdXNlZCB0byBmaW5kIGV4ZWN1dGFibGVzLgorICAgICAgICAgICAgICAgIEZhaWxpbmcgdGhhdCwKKyAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItRklMRVNESVInPjxmaWxlbmFtZT5GSUxFU0RJUjwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgICAgIGlzIHVzZWQgdG8gZmluZCB0aGUgYXBwcm9wcmlhdGUgcmVsYXRpdmUgZmlsZS4KKyAgICAgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPkZJTEVTRElSPC9maWxlbmFtZT4gaXMgZGVwcmVjYXRlZCBhbmQgY2FuCisgICAgICAgICAgICAgICAgICAgIGJlIHJlcGxhY2VkIHdpdGggPGZpbGVuYW1lPkZJTEVTUEFUSDwvZmlsZW5hbWU+LgorICAgICAgICAgICAgICAgICAgICBCZWNhdXNlIDxmaWxlbmFtZT5GSUxFU0RJUjwvZmlsZW5hbWU+IGlzIGxpa2VseSB0byBiZQorICAgICAgICAgICAgICAgICAgICByZW1vdmVkLCB5b3Ugc2hvdWxkIG5vdCB1c2UgdGhpcyB2YXJpYWJsZSBpbiBhbnkgbmV3IGNvZGUuCisgICAgICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICAgICAgICAgIElmIHRoZSBmaWxlIGNhbm5vdCBiZSBmb3VuZCwgaXQgaXMgYXNzdW1lZCB0aGF0IGl0IGlzIGF2YWlsYWJsZSBpbgorICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1ETF9ESVInPjxmaWxlbmFtZT5ETF9ESVI8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgICAgICBieSB0aGUgdGltZSB0aGUgPGZpbGVuYW1lPmRvd25sb2FkKCk8L2ZpbGVuYW1lPiBtZXRob2QgaXMgY2FsbGVkLgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBJZiB5b3Ugc3BlY2lmeSBhIGRpcmVjdG9yeSwgdGhlIGVudGlyZSBkaXJlY3RvcnkgaXMKKyAgICAgICAgICAgICAgICB1bnBhY2tlZC4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgSGVyZSBhcmUgYSBjb3VwbGUgb2YgZXhhbXBsZSBVUkxzLCB0aGUgZmlyc3QgcmVsYXRpdmUgYW5kCisgICAgICAgICAgICAgICAgdGhlIHNlY29uZCBhYnNvbHV0ZToKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIFNSQ19VUkkgPSAiZmlsZTovL3JlbGF0aXZlZmlsZS5wYXRjaCIKKyAgICAgU1JDX1VSSSA9ICJmaWxlOi8vL1VzZXJzL2ljaC92ZXJ5X2ltcG9ydGFudF9zb2Z0d2FyZSIKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbiBpZD0naHR0cC1mdHAtZmV0Y2hlcic+CisgICAgICAgICAgICA8dGl0bGU+SFRUUC9GVFAgd2dldCBmZXRjaGVyICg8ZmlsZW5hbWU+aHR0cDovLzwvZmlsZW5hbWU+LCA8ZmlsZW5hbWU+ZnRwOi8vPC9maWxlbmFtZT4sIDxmaWxlbmFtZT5odHRwczovLzwvZmlsZW5hbWU+KTwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoaXMgZmV0Y2hlciBvYnRhaW5zIGZpbGVzIGZyb20gd2ViIGFuZCBGVFAgc2VydmVycy4KKyAgICAgICAgICAgICAgICBJbnRlcm5hbGx5LCB0aGUgZmV0Y2hlciB1c2VzIHRoZSB3Z2V0IHV0aWxpdHkuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZSBleGVjdXRhYmxlIGFuZCBwYXJhbWV0ZXJzIHVzZWQgYXJlIHNwZWNpZmllZCBieSB0aGUKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+RkVUQ0hDTURfd2dldDwvZmlsZW5hbWU+IHZhcmlhYmxlLCB3aGljaCBkZWZhdWx0cworICAgICAgICAgICAgICAgIHRvIHNlbnNpYmxlIHZhbHVlcy4KKyAgICAgICAgICAgICAgICBUaGUgZmV0Y2hlciBzdXBwb3J0cyBhIHBhcmFtZXRlciAiZG93bmxvYWRmaWxlbmFtZSIgdGhhdAorICAgICAgICAgICAgICAgIGFsbG93cyB0aGUgbmFtZSBvZiB0aGUgZG93bmxvYWRlZCBmaWxlIHRvIGJlIHNwZWNpZmllZC4KKyAgICAgICAgICAgICAgICBTcGVjaWZ5aW5nIHRoZSBuYW1lIG9mIHRoZSBkb3dubG9hZGVkIGZpbGUgaXMgdXNlZnVsCisgICAgICAgICAgICAgICAgZm9yIGF2b2lkaW5nIGNvbGxpc2lvbnMgaW4KKyAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItRExfRElSJz48ZmlsZW5hbWU+RExfRElSPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgd2hlbiBkZWFsaW5nIHdpdGggbXVsdGlwbGUgZmlsZXMgdGhhdCBoYXZlIHRoZSBzYW1lIG5hbWUuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFNvbWUgZXhhbXBsZSBVUkxzIGFyZSBhcyBmb2xsb3dzOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgU1JDX1VSSSA9ICJodHRwOi8vb2UuaGFuZGhlbGRzLm9yZy9ub3RfdGhlcmUuYWFjIgorICAgICBTUkNfVVJJID0gImZ0cDovL29lLmhhbmRoZWxkcy5vcmcvbm90X3RoZXJlX2FzX3dlbGwuYWFjIgorICAgICBTUkNfVVJJID0gImZ0cDovL3lvdUBvZS5oYW5kaGVsZHMub3JnL2hvbWUveW91L3NlY3JldC5wbGFuIgorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgQmVjYXVzZSBVUkwgcGFyYW1ldGVycyBhcmUgZGVsaW1pdGVkIGJ5IHNlbWktY29sb25zLCB0aGlzIGNhbgorICAgICAgICAgICAgICAgaW50cm9kdWNlIGFtYmlndWl0eSB3aGVuIHBhcnNpbmcgVVJMcyB0aGF0IGFsc28gY29udGFpbiBzZW1pLWNvbG9ucywKKyAgICAgICAgICAgICAgIGZvciBleGFtcGxlOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgU1JDX1VSSSA9ICJodHRwOi8vYWJjMTIzLm9yZy9naXQvP3A9Z2NjL2djYy5naXQ7YT1zbmFwc2hvdDtoPWE1ZGQ0NyIKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICBTdWNoIFVSTHMgc2hvdWxkIHNob3VsZCBiZSBtb2RpZmllZCBieSByZXBsYWNpbmcgc2VtaS1jb2xvbnMgd2l0aCAnJmFtcDsnIGNoYXJhY3RlcnM6CisgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIFNSQ19VUkkgPSAiaHR0cDovL2FiYzEyMy5vcmcvZ2l0Lz9wPWdjYy9nY2MuZ2l0JmFtcDthPXNuYXBzaG90JmFtcDtoPWE1ZGQ0NyIKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgSW4gbW9zdCBjYXNlcyB0aGlzIHNob3VsZCB3b3JrLiBUcmVhdGluZyBzZW1pLWNvbG9ucyBhbmQgJyZhbXA7JyBpbiBxdWVyaWVzCisgICAgICAgICAgICAgICAgaWRlbnRpY2FsbHkgaXMgcmVjb21tZW5kZWQgYnkgdGhlIFdvcmxkIFdpZGUgV2ViIENvbnNvcnRpdW0gKFczQykuCisgICAgICAgICAgICAgICAgTm90ZSB0aGF0IGR1ZSB0byB0aGUgbmF0dXJlIG9mIHRoZSBVUkwsIHlvdSBtYXkgaGF2ZSB0byBzcGVjaWZ5IHRoZSBuYW1lCisgICAgICAgICAgICAgICAgb2YgdGhlIGRvd25sb2FkZWQgZmlsZSBhcyB3ZWxsOgorICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIFNSQ19VUkkgPSAiaHR0cDovL2FiYzEyMy5vcmcvZ2l0Lz9wPWdjYy9nY2MuZ2l0JmFtcDthPXNuYXBzaG90JmFtcDtoPWE1ZGQ0Nztkb3dubG9hZGZpbGVuYW1lPW15ZmlsZS5iejIiCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24gaWQ9J2N2cy1mZXRjaGVyJz4KKyAgICAgICAgICAgIDx0aXRsZT5DVlMgZmV0Y2hlciAoPGZpbGVuYW1lPihjdnM6Ly88L2ZpbGVuYW1lPik8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGlzIHN1Ym1vZHVsZSBoYW5kbGVzIGNoZWNraW5nIG91dCBmaWxlcyBmcm9tIHRoZQorICAgICAgICAgICAgICAgIENWUyB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtLgorICAgICAgICAgICAgICAgIFlvdSBjYW4gY29uZmlndXJlIGl0IHVzaW5nIGEgbnVtYmVyIG9mIGRpZmZlcmVudCB2YXJpYWJsZXM6CisgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz48ZmlsZW5hbWU+RkVUQ0hDTURfY3ZzPC9maWxlbmFtZT46PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBleGVjdXRhYmxlIHRvIHVzZSB3aGVuIHJ1bm5pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoZSA8ZmlsZW5hbWU+Y3ZzPC9maWxlbmFtZT4gY29tbWFuZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbmFtZSBpcyB1c3VhbGx5ICJjdnMiLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+PGZpbGVuYW1lPlNSQ0RBVEU8L2ZpbGVuYW1lPjo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRhdGUgdG8gdXNlIHdoZW4gZmV0Y2hpbmcgdGhlIENWUyBzb3VyY2UgY29kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIEEgc3BlY2lhbCB2YWx1ZSBvZiAibm93IiBjYXVzZXMgdGhlIGNoZWNrb3V0IHRvCisgICAgICAgICAgICAgICAgICAgICAgICBiZSB1cGRhdGVkIG9uIGV2ZXJ5IGJ1aWxkLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+PGxpbmsgbGlua2VuZD0ndmFyLUNWU0RJUic+PGZpbGVuYW1lPkNWU0RJUjwvZmlsZW5hbWU+PC9saW5rPjo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXJlIGEgdGVtcG9yYXJ5IGNoZWNrb3V0IGlzIHNhdmVkLgorICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGxvY2F0aW9uIGlzIG9mdGVuIDxmaWxlbmFtZT5ETF9ESVIvY3ZzPC9maWxlbmFtZT4uCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz48ZmlsZW5hbWU+Q1ZTX1BST1hZX0hPU1Q8L2ZpbGVuYW1lPjo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG5hbWUgdG8gdXNlIGFzIGEgInByb3h5PSIgcGFyYW1ldGVyIHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmN2czwvZmlsZW5hbWU+IGNvbW1hbmQuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz48ZmlsZW5hbWU+Q1ZTX1BST1hZX1BPUlQ8L2ZpbGVuYW1lPjo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHBvcnQgbnVtYmVyIHRvIHVzZSBhcyBhICJwcm94eXBvcnQ9IiBwYXJhbWV0ZXIgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgIHRoZSA8ZmlsZW5hbWU+Y3ZzPC9maWxlbmFtZT4gY29tbWFuZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIEFzIHdlbGwgYXMgdGhlIHN0YW5kYXJkIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBVUkwgc3ludGF4LAorICAgICAgICAgICAgICAgIHlvdSBjYW4gYWxzbyBjb25maWd1cmUgdGhlIGZldGNoZXIgd2l0aCB2YXJpb3VzIFVSTCBwYXJhbWV0ZXJzOgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgc3VwcG9ydGVkIHBhcmFtZXRlcnMgYXJlIGFzIGZvbGxvd3M6CisgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz4ibWV0aG9kIjo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHByb3RvY29sIG92ZXIgd2hpY2ggdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgQ1ZTIHNlcnZlci4KKyAgICAgICAgICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQsIHRoaXMgcHJvdG9jb2wgaXMgInBzZXJ2ZXIiLgorICAgICAgICAgICAgICAgICAgICAgICAgSWYgIm1ldGhvZCIgaXMgc2V0IHRvICJleHQiLCBCaXRCYWtlIGV4YW1pbmVzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgInJzaCIgcGFyYW1ldGVyIGFuZCBzZXRzIDxmaWxlbmFtZT5DVlNfUlNIPC9maWxlbmFtZT4uCisgICAgICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIHVzZSAiZGlyIiBmb3IgbG9jYWwgZGlyZWN0b3JpZXMuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz4ibW9kdWxlIjo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBtb2R1bGUgdG8gY2hlY2sgb3V0LgorICAgICAgICAgICAgICAgICAgICAgICAgWW91IG11c3Qgc3VwcGx5IHRoaXMgcGFyYW1ldGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+InRhZyI6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaWJlcyB3aGljaCBDVlMgVEFHIHNob3VsZCBiZSB1c2VkIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNoZWNrb3V0LgorICAgICAgICAgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCwgdGhlIFRBRyBpcyBlbXB0eS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPiJkYXRlIjo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIGEgZGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIElmIG5vICJkYXRlIiBpcyBzcGVjaWZpZWQsIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVNSQ0RBVEUnPjxmaWxlbmFtZT5TUkNEQVRFPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgY29uZmlndXJhdGlvbiBpcyB1c2VkIHRvIGNoZWNrb3V0IGEgc3BlY2lmaWMgZGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBzcGVjaWFsIHZhbHVlIG9mICJub3ciIGNhdXNlcyB0aGUgY2hlY2tvdXQgdG8gYmUKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQgb24gZXZlcnkgYnVpbGQuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz4ibG9jYWxkaXIiOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICBVc2VkIHRvIHJlbmFtZSB0aGUgbW9kdWxlLgorICAgICAgICAgICAgICAgICAgICAgICAgRWZmZWN0aXZlbHksIHlvdSBhcmUgcmVuYW1pbmcgdGhlIG91dHB1dCBkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvIHdoaWNoIHRoZSBtb2R1bGUgaXMgdW5wYWNrZWQuCisgICAgICAgICAgICAgICAgICAgICAgICBZb3UgYXJlIGZvcmNpbmcgdGhlIG1vZHVsZSBpbnRvIGEgc3BlY2lhbAorICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5IHJlbGF0aXZlIHRvCisgICAgICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItQ1ZTRElSJz48ZmlsZW5hbWU+Q1ZTRElSPC9maWxlbmFtZT48L2xpbms+LgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+InJzaCI8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSAibWV0aG9kIiBwYXJhbWV0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz4ic2NtZGF0YSI6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIENhdXNlcyB0aGUgQ1ZTIG1ldGFkYXRhIHRvIGJlIG1haW50YWluZWQgaW4gdGhlIHRhcmJhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmZXRjaGVyIGNyZWF0ZXMgd2hlbiBzZXQgdG8gImtlZXAiLgorICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHRhcmJhbGwgaXMgZXhwYW5kZWQgaW50byB0aGUgd29yayBkaXJlY3RvcnkuCisgICAgICAgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0LCB0aGUgQ1ZTIG1ldGFkYXRhIGlzIHJlbW92ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz4iZnVsbHBhdGgiOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9scyB3aGV0aGVyIHRoZSByZXN1bHRpbmcgY2hlY2tvdXQgaXMgYXQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUgbGV2ZWwsIHdoaWNoIGlzIHRoZSBkZWZhdWx0LCBvciBpcyBhdCBkZWVwZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhzLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+Im5vcmVjdXJzZSI6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIENhdXNlcyB0aGUgZmV0Y2hlciB0byBvbmx5IGNoZWNrb3V0IHRoZSBzcGVjaWZpZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSB3aXRoIG5vIHJlY3Vyc2UgaW50byBhbnkgc3ViZGlyZWN0b3JpZXMuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz4icG9ydCI6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBwb3J0IHRvIHdoaWNoIHRoZSBDVlMgc2VydmVyIGNvbm5lY3RzLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgU29tZSBleGFtcGxlIFVSTHMgYXJlIGFzIGZvbGxvd3M6CisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBTUkNfVVJJID0gImN2czovL0NWU1JPT1Q7bW9kdWxlPW15bW9kdWxlO3RhZz1zb21lLXZlcnNpb247bWV0aG9kPWV4dCIKKyAgICAgU1JDX1VSSSA9ICJjdnM6Ly9DVlNST09UO21vZHVsZT1teW1vZHVsZTtkYXRlPTIwMDYwMTI2O2xvY2FsZGlyPXVzZXRoYXQiCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24gaWQ9J3N2bi1mZXRjaGVyJz4KKyAgICAgICAgICAgIDx0aXRsZT5TdWJ2ZXJzaW9uIChTVk4pIEZldGNoZXIgKDxmaWxlbmFtZT5zdm46Ly88L2ZpbGVuYW1lPik8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGlzIGZldGNoZXIgc3VibW9kdWxlIGZldGNoZXMgY29kZSBmcm9tIHRoZQorICAgICAgICAgICAgICAgIFN1YnZlcnNpb24gc291cmNlIGNvbnRyb2wgc3lzdGVtLgorICAgICAgICAgICAgICAgIFRoZSBleGVjdXRhYmxlIHVzZWQgaXMgc3BlY2lmaWVkIGJ5CisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPkZFVENIQ01EX3N2bjwvZmlsZW5hbWU+LCB3aGljaCBkZWZhdWx0cworICAgICAgICAgICAgICAgIHRvICJzdm4iLgorICAgICAgICAgICAgICAgIFRoZSBmZXRjaGVyJ3MgdGVtcG9yYXJ5IHdvcmtpbmcgZGlyZWN0b3J5IGlzIHNldCBieQorICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1TVk5ESVInPjxmaWxlbmFtZT5TVk5ESVI8L2ZpbGVuYW1lPjwvbGluaz4sCisgICAgICAgICAgICAgICAgd2hpY2ggaXMgdXN1YWxseSA8ZmlsZW5hbWU+RExfRElSL3N2bjwvZmlsZW5hbWU+LgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgc3VwcG9ydGVkIHBhcmFtZXRlcnMgYXJlIGFzIGZvbGxvd3M6CisgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz4ibW9kdWxlIjo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHN2biBtb2R1bGUgdG8gY2hlY2tvdXQuCisgICAgICAgICAgICAgICAgICAgICAgICBZb3UgbXVzdCBwcm92aWRlIHRoaXMgcGFyYW1ldGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgWW91IGNhbiB0aGluayBvZiB0aGlzIHBhcmFtZXRlciBhcyB0aGUgdG9wLWxldmVsCisgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rvcnkgb2YgdGhlIHJlcG9zaXRvcnkgZGF0YSB5b3Ugd2FudC4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPiJwcm90b2NvbCI6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBwcm90b2NvbCB0byB1c2UsIHdoaWNoIGRlZmF1bHRzIHRvICJzdm4iLgorICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXIgb3B0aW9ucyBhcmUgInN2bitzc2giIGFuZCAicnNoIi4KKyAgICAgICAgICAgICAgICAgICAgICAgIEZvciAicnNoIiwgdGhlICJyc2giIHBhcmFtZXRlciBpcyBhbHNvIHVzZWQuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz4icmV2Ijo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJldmlzaW9uIG9mIHRoZSBzb3VyY2UgY29kZSB0byBjaGVja291dC4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPiJkYXRlIjo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRhdGUgb2YgdGhlIHNvdXJjZSBjb2RlIHRvIGNoZWNrb3V0LgorICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWMgcmV2aXNpb25zIGFyZSBnZW5lcmFsbHkgbXVjaCBzYWZlciB0byBjaGVja291dAorICAgICAgICAgICAgICAgICAgICAgICAgcmF0aGVyIHRoYW4gYnkgZGF0ZSBhcyB0aGV5IGRvIG5vdCBpbnZvbHZlIHRpbWV6b25lcworICAgICAgICAgICAgICAgICAgICAgICAgKGUuZy4gdGhleSBhcmUgbXVjaCBtb3JlIGRldGVybWluaXN0aWMpLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+InNjbWRhdGEiOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICBDYXVzZXMgdGhlIOKAnC5zdm7igJ0gZGlyZWN0b3JpZXMgdG8gYmUgYXZhaWxhYmxlIGR1cmluZworICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZS10aW1lIHdoZW4gc2V0IHRvICJrZWVwIi4KKyAgICAgICAgICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQsIHRoZXNlIGRpcmVjdG9yaWVzIGFyZSByZW1vdmVkLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+InRyYW5zcG9ydHVzZXIiOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICBXaGVuIHJlcXVpcmVkLCBzZXRzIHRoZSB1c2VybmFtZSBmb3IgdGhlIHRyYW5zcG9ydC4KKyAgICAgICAgICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQsIHRoaXMgcGFyYW1ldGVyIGlzIGVtcHR5LgorICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHRyYW5zcG9ydCB1c2VybmFtZSBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgdXNlcm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgaW4gdGhlIG1haW4gVVJMLCB3aGljaCBpcyBwYXNzZWQgdG8gdGhlIHN1YnZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICBGb2xsb3dpbmcgYXJlIHR3byBleGFtcGxlcyB1c2luZyBzdm46CisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBTUkNfVVJJID0gInN2bjovL3N2bi5vZS5oYW5kaGVsZHMub3JnL3N2bjttb2R1bGU9dmlwO3Byb3RvPWh0dHA7cmV2PTY2NyIKKyAgICAgU1JDX1VSSSA9ICJzdm46Ly9zdm4ub2UuaGFuZGhlbGRzLm9yZy9zdm4vO21vZHVsZT1vcGllO3Byb3RvPXN2bitzc2g7ZGF0ZT0yMDA2MDEyNiIKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbiBpZD0nZ2l0LWZldGNoZXInPgorICAgICAgICAgICAgPHRpdGxlPkdpdCBGZXRjaGVyICg8ZmlsZW5hbWU+Z2l0Oi8vPC9maWxlbmFtZT4pPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhpcyBmZXRjaGVyIHN1Ym1vZHVsZSBmZXRjaGVzIGNvZGUgZnJvbSB0aGUgR2l0CisgICAgICAgICAgICAgICAgc291cmNlIGNvbnRyb2wgc3lzdGVtLgorICAgICAgICAgICAgICAgIFRoZSBmZXRjaGVyIHdvcmtzIGJ5IGNyZWF0aW5nIGEgYmFyZSBjbG9uZSBvZiB0aGUKKyAgICAgICAgICAgICAgICByZW1vdGUgaW50bworICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1HSVRESVInPjxmaWxlbmFtZT5HSVRESVI8L2ZpbGVuYW1lPjwvbGluaz4sCisgICAgICAgICAgICAgICAgd2hpY2ggaXMgdXN1YWxseSA8ZmlsZW5hbWU+RExfRElSL2dpdDI8L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgICAgICBUaGlzIGJhcmUgY2xvbmUgaXMgdGhlbiBjbG9uZWQgaW50byB0aGUgd29yayBkaXJlY3RvcnkgZHVyaW5nIHRoZQorICAgICAgICAgICAgICAgIHVucGFjayBzdGFnZSB3aGVuIGEgc3BlY2lmaWMgdHJlZSBpcyBjaGVja2VkIG91dC4KKyAgICAgICAgICAgICAgICBUaGlzIGlzIGRvbmUgdXNpbmcgYWx0ZXJuYXRlcyBhbmQgYnkgcmVmZXJlbmNlIHRvCisgICAgICAgICAgICAgICAgbWluaW1pemUgdGhlIGFtb3VudCBvZiBkdXBsaWNhdGUgZGF0YSBvbiB0aGUgZGlzayBhbmQKKyAgICAgICAgICAgICAgICBtYWtlIHRoZSB1bnBhY2sgcHJvY2VzcyBmYXN0LgorICAgICAgICAgICAgICAgIFRoZSBleGVjdXRhYmxlIHVzZWQgY2FuIGJlIHNldCB3aXRoCisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPkZFVENIQ01EX2dpdDwvZmlsZW5hbWU+LgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGlzIGZldGNoZXIgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+InByb3RvY29sIjo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHByb3RvY29sIHVzZWQgdG8gZmV0Y2ggdGhlIGZpbGVzLgorICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgImdpdCIgd2hlbiBhIGhvc3RuYW1lIGlzIHNldC4KKyAgICAgICAgICAgICAgICAgICAgICAgIElmIGEgaG9zdG5hbWUgaXMgbm90IHNldCwgdGhlIEdpdCBwcm90b2NvbCBpcyAiZmlsZSIuCisgICAgICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIGFsc28gdXNlICJodHRwIiwgImh0dHBzIiwgInNzaCIgYW5kICJyc3luYyIuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz4ibm9jaGVja291dCI6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRlbGxzIHRoZSBmZXRjaGVyIHRvIG5vdCBjaGVja291dCBzb3VyY2UgY29kZSB3aGVuCisgICAgICAgICAgICAgICAgICAgICAgICB1bnBhY2tpbmcgd2hlbiBzZXQgdG8gIjEiLgorICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRoaXMgb3B0aW9uIGZvciB0aGUgVVJMIHdoZXJlIHRoZXJlIGlzIGEgY3VzdG9tCisgICAgICAgICAgICAgICAgICAgICAgICByb3V0aW5lIHRvIGNoZWNrb3V0IGNvZGUuCisgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyAiMCIuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz4icmViYXNlYWJsZSI6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIEluZGljYXRlcyB0aGF0IHRoZSB1cHN0cmVhbSBHaXQgcmVwb3NpdG9yeSBjYW4gYmUgcmViYXNlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIFlvdSBzaG91bGQgc2V0IHRoaXMgcGFyYW1ldGVyIHRvICIxIiBpZgorICAgICAgICAgICAgICAgICAgICAgICAgcmV2aXNpb25zIGNhbiBiZWNvbWUgZGV0YWNoZWQgZnJvbSBicmFuY2hlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIHNvdXJjZSBtaXJyb3IgdGFyYmFsbCBpcyBkb25lIHBlcgorICAgICAgICAgICAgICAgICAgICAgICAgcmV2aXNpb24sIHdoaWNoIGhhcyBhIGxvc3Mgb2YgZWZmaWNpZW5jeS4KKyAgICAgICAgICAgICAgICAgICAgICAgIFJlYmFzaW5nIHRoZSB1cHN0cmVhbSBHaXQgcmVwb3NpdG9yeSBjb3VsZCBjYXVzZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgcmV2aXNpb24gdG8gZGlzYXBwZWFyIGZyb20gdGhlIHVwc3RyZWFtIHJlcG9zaXRvcnkuCisgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbiByZW1pbmRzIHRoZSBmZXRjaGVyIHRvIHByZXNlcnZlIHRoZSBsb2NhbCBjYWNoZQorICAgICAgICAgICAgICAgICAgICAgICAgY2FyZWZ1bGx5IGZvciBmdXR1cmUgdXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIGlzICIwIi4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPiJub2JyYW5jaCI6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRlbGxzIHRoZSBmZXRjaGVyIHRvIG5vdCBjaGVjayB0aGUgU0hBIHZhbGlkYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgYnJhbmNoIHdoZW4gc2V0IHRvICIxIi4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGlzICIwIi4KKyAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0aGlzIG9wdGlvbiBmb3IgdGhlIHJlY2lwZSB0aGF0IHJlZmVycyB0bworICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbW1pdCB0aGF0IGlzIHZhbGlkIGZvciBhIHRhZyBpbnN0ZWFkIG9mCisgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYnJhbmNoLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+ImJhcmVjbG9uZSI6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRlbGxzIHRoZSBmZXRjaGVyIHRvIGNsb25lIGEgYmFyZSBjbG9uZSBpbnRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24gZGlyZWN0b3J5IHdpdGhvdXQgY2hlY2tpbmcgb3V0IGEgd29ya2luZyB0cmVlLgorICAgICAgICAgICAgICAgICAgICAgICAgT25seSB0aGUgcmF3IEdpdCBtZXRhZGF0YSBpcyBwcm92aWRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGltcGxpZXMgdGhlICJub2NoZWNrb3V0IiBwYXJhbWV0ZXIgYXMgd2VsbC4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPiJicmFuY2giOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICBUaGUgYnJhbmNoKGVzKSBvZiB0aGUgR2l0IHRyZWUgdG8gY2xvbmUuCisgICAgICAgICAgICAgICAgICAgICAgICBJZiB1bnNldCwgdGhpcyBpcyBhc3N1bWVkIHRvIGJlICJtYXN0ZXIiLgorICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG51bWJlciBvZiBicmFuY2ggcGFyYW1ldGVycyBtdWNoIG1hdGNoIHRoZSBudW1iZXIgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgcGFyYW1ldGVycy4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPiJyZXYiOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICBUaGUgcmV2aXNpb24gdG8gdXNlIGZvciB0aGUgY2hlY2tvdXQuCisgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyAibWFzdGVyIi4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPiJ0YWciOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgYSB0YWcgdG8gdXNlIGZvciB0aGUgY2hlY2tvdXQuCisgICAgICAgICAgICAgICAgICAgICAgICBUbyBjb3JyZWN0bHkgcmVzb2x2ZSB0YWdzLCBCaXRCYWtlIG11c3QgYWNjZXNzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29yay4KKyAgICAgICAgICAgICAgICAgICAgICAgIEZvciB0aGF0IHJlYXNvbiwgdGFncyBhcmUgb2Z0ZW4gbm90IHVzZWQuCisgICAgICAgICAgICAgICAgICAgICAgICBBcyBmYXIgYXMgR2l0IGlzIGNvbmNlcm5lZCwgdGhlICJ0YWciIHBhcmFtZXRlciBiZWhhdmVzCisgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RpdmVseSB0aGUgc2FtZSBhcyB0aGUgInJldiIgcGFyYW1ldGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+InN1YnBhdGgiOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICBMaW1pdHMgdGhlIGNoZWNrb3V0IHRvIGEgc3BlY2lmaWMgc3VicGF0aCBvZiB0aGUgdHJlZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQsIHRoZSB3aG9sZSB0cmVlIGlzIGNoZWNrZWQgb3V0LgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+ImRlc3RzdWZmaXgiOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgcGF0aCBpbiB3aGljaCB0byBwbGFjZSB0aGUgY2hlY2tvdXQuCisgICAgICAgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0LCB0aGUgcGF0aCBpcyA8ZmlsZW5hbWU+Z2l0LzwvZmlsZW5hbWU+LgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgSGVyZSBhcmUgc29tZSBleGFtcGxlIFVSTHM6CisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBTUkNfVVJJID0gImdpdDovL2dpdC5vZS5oYW5kaGVsZHMub3JnL2dpdC92aXAuZ2l0O3RhZz12ZXJzaW9uLTEiCisgICAgIFNSQ19VUkkgPSAiZ2l0Oi8vZ2l0Lm9lLmhhbmRoZWxkcy5vcmcvZ2l0L3ZpcC5naXQ7cHJvdG9jb2w9aHR0cCIKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbiBpZD0nZ2l0c20tZmV0Y2hlcic+CisgICAgICAgICAgICA8dGl0bGU+R2l0IFN1Ym1vZHVsZSBGZXRjaGVyICg8ZmlsZW5hbWU+Z2l0c206Ly88L2ZpbGVuYW1lPik8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGlzIGZldGNoZXIgc3VibW9kdWxlIGluaGVyaXRzIGZyb20gdGhlCisgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0nZ2l0LWZldGNoZXInPkdpdCBmZXRjaGVyPC9saW5rPiBhbmQgZXh0ZW5kcworICAgICAgICAgICAgICAgIHRoYXQgZmV0Y2hlcidzIGJlaGF2aW9yIGJ5IGZldGNoaW5nIGEgcmVwb3NpdG9yeSdzIHN1Ym1vZHVsZXMuCisgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVNSQ19VUkknPjxmaWxlbmFtZT5TUkNfVVJJPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgaXMgcGFzc2VkIHRvIHRoZSBHaXQgZmV0Y2hlciBhcyBkZXNjcmliZWQgaW4gdGhlCisgICAgICAgICAgICAgICAgIjxsaW5rIGxpbmtlbmQ9J2dpdC1mZXRjaGVyJz5HaXQgRmV0Y2hlciAoPGZpbGVuYW1lPmdpdDovLzwvZmlsZW5hbWU+KTwvbGluaz4iCisgICAgICAgICAgICAgICAgc2VjdGlvbi4KKyAgICAgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPk5vdGVzIGFuZCBXYXJuaW5nczwvdGl0bGU+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgWW91IG11c3QgY2xlYW4gYSByZWNpcGUgd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbgorICAgICAgICAgICAgICAgICAgICAgICAgJzxmaWxlbmFtZT5naXQ6Ly88L2ZpbGVuYW1lPicgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAnPGZpbGVuYW1lPmdpdHNtOi8vPC9maWxlbmFtZT4nIFVSTHMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBHaXQgU3VibW9kdWxlcyBmZXRjaGVyIGlzIG5vdCBhIGNvbXBsZXRlIGZldGNoZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGZldGNoZXIgaGFzIGtub3duIGlzc3VlcyB3aGVyZSBpdCBkb2VzIG5vdCB1c2UgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWwgc291cmNlIG1pcnJvcmluZyBpbmZyYXN0cnVjdHVyZSBwcm9wZXJseS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uIGlkPSdjbGVhcmNhc2UtZmV0Y2hlcic+CisgICAgICAgICAgICA8dGl0bGU+Q2xlYXJDYXNlIEZldGNoZXIgKDxmaWxlbmFtZT5jY3JjOi8vPC9maWxlbmFtZT4pPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhpcyBmZXRjaGVyIHN1Ym1vZHVsZSBmZXRjaGVzIGNvZGUgZnJvbSBhCisgICAgICAgICAgICAgICAgPHVsaW5rIHVybD0naHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9SYXRpb25hbF9DbGVhckNhc2UnPkNsZWFyQ2FzZTwvdWxpbms+CisgICAgICAgICAgICAgICAgcmVwb3NpdG9yeS4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVG8gdXNlIHRoaXMgZmV0Y2hlciwgbWFrZSBzdXJlIHlvdXIgcmVjaXBlIGhhcyBwcm9wZXIKKyAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItU1JDX1VSSSc+PGZpbGVuYW1lPlNSQ19VUkk8L2ZpbGVuYW1lPjwvbGluaz4sCisgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVNSQ1JFVic+PGZpbGVuYW1lPlNSQ1JFVjwvZmlsZW5hbWU+PC9saW5rPiwgYW5kCisgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVBWJz48ZmlsZW5hbWU+UFY8L2ZpbGVuYW1lPjwvbGluaz4gc2V0dGluZ3MuCisgICAgICAgICAgICAgICAgSGVyZSBpcyBhbiBleGFtcGxlOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgU1JDX1VSSSA9ICJjY3JjOi8vY2MuZXhhbXBsZS5vcmcvY2NyYzt2b2I9L2V4YW1wbGVfdm9iO21vZHVsZT0vZXhhbXBsZV9tb2R1bGUiCisgICAgIFNSQ1JFViA9ICJFWEFNUExFX0NMRUFSQ0FTRV9UQUciCisgICAgIFBWID0gIiR7QGQuZ2V0VmFyKCJTUkNSRVYiLCBGYWxzZSkucmVwbGFjZSgiLyIsICIrIil9IgorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICBUaGUgZmV0Y2hlciB1c2VzIHRoZSA8ZmlsZW5hbWU+cmNsZWFydG9vbDwvZmlsZW5hbWU+IG9yCisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmNsZWFydG9vbDwvZmlsZW5hbWU+IHJlbW90ZSBjbGllbnQsIGRlcGVuZGluZyBvbgorICAgICAgICAgICAgICAgIHdoaWNoIG9uZSBpcyBhdmFpbGFibGUuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEZvbGxvd2luZyBhcmUgb3B0aW9ucyBmb3IgdGhlIDxmaWxlbmFtZT5TUkNfVVJJPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICBzdGF0ZW1lbnQ6CisgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz48ZmlsZW5hbWU+dm9iPC9maWxlbmFtZT48L2VtcGhhc2lzPjoKKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBuYW1lLCB3aGljaCBtdXN0IGluY2x1ZGUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVwZW5kaW5nICIvIiBjaGFyYWN0ZXIsIG9mIHRoZSBDbGVhckNhc2UgVk9CLgorICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb24gaXMgcmVxdWlyZWQuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz48ZmlsZW5hbWU+bW9kdWxlPC9maWxlbmFtZT48L2VtcGhhc2lzPjoKKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBtb2R1bGUsIHdoaWNoIG11c3QgaW5jbHVkZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXBlbmRpbmcgIi8iIGNoYXJhY3RlciwgaW4gdGhlIHNlbGVjdGVkIFZPQi4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSA8ZmlsZW5hbWU+bW9kdWxlPC9maWxlbmFtZT4gYW5kIDxmaWxlbmFtZT52b2I8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgYXJlIGNvbWJpbmVkIHRvIGNyZWF0ZSB0aGUgPGZpbGVuYW1lPmxvYWQ8L2ZpbGVuYW1lPiBydWxlIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHZpZXcgY29uZmlnIHNwZWMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXMgYW4gZXhhbXBsZSwgY29uc2lkZXIgdGhlIDxmaWxlbmFtZT52b2I8L2ZpbGVuYW1lPiBhbmQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPm1vZHVsZTwvZmlsZW5hbWU+IHZhbHVlcyBmcm9tIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+U1JDX1VSSTwvZmlsZW5hbWU+IHN0YXRlbWVudCBhdCB0aGUgc3RhcnQgb2YgdGhpcyBzZWN0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbWJpbmluZyB0aG9zZSB2YWx1ZXMgcmVzdWx0cyBpbiB0aGUgZm9sbG93aW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgbG9hZCAvZXhhbXBsZV92b2IvZXhhbXBsZV9tb2R1bGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L25vdGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz48ZmlsZW5hbWU+cHJvdG88L2ZpbGVuYW1lPjwvZW1waGFzaXM+OgorICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHByb3RvY29sLCB3aGljaCBjYW4gYmUgZWl0aGVyIDxmaWxlbmFtZT5odHRwPC9maWxlbmFtZT4gb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5odHRwczwvZmlsZW5hbWU+LgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQsIHRoZSBmZXRjaGVyIGNyZWF0ZXMgYSBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb24uCisgICAgICAgICAgICAgICAgSWYgeW91IHdhbnQgdGhpcyBzcGVjaWZpY2F0aW9uIHdyaXR0ZW4gdG8gYW4gYXJlYSBvdGhlciB0aGFuIHRoZSBkZWZhdWx0LAorICAgICAgICAgICAgICAgIHVzZSB0aGUgPGZpbGVuYW1lPkNDQVNFX0NVU1RPTV9DT05GSUdfU1BFQzwvZmlsZW5hbWU+IHZhcmlhYmxlCisgICAgICAgICAgICAgICAgaW4geW91ciByZWNpcGUgdG8gZGVmaW5lIHdoZXJlIHRoZSBzcGVjaWZpY2F0aW9uIGlzIHdyaXR0ZW4uCisgICAgICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgICAgIHRoZSA8ZmlsZW5hbWU+U1JDUkVWPC9maWxlbmFtZT4gbG9zZXMgaXRzIGZ1bmN0aW9uYWxpdHkgaWYgeW91CisgICAgICAgICAgICAgICAgICAgIHNwZWNpZnkgdGhpcyB2YXJpYWJsZS4KKyAgICAgICAgICAgICAgICAgICAgSG93ZXZlciwgPGZpbGVuYW1lPlNSQ1JFVjwvZmlsZW5hbWU+IGlzIHN0aWxsIHVzZWQgdG8gbGFiZWwgdGhlCisgICAgICAgICAgICAgICAgICAgIGFyY2hpdmUgYWZ0ZXIgYSBmZXRjaCBldmVuIHRob3VnaCBpdCBkb2VzIG5vdCBkZWZpbmUgd2hhdCBpcworICAgICAgICAgICAgICAgICAgICBmZXRjaGVkLgorICAgICAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgSGVyZSBhcmUgYSBjb3VwbGUgb2Ygb3RoZXIgYmVoYXZpb3JzIHdvcnRoIG1lbnRpb25pbmc6CisgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgV2hlbiB1c2luZyA8ZmlsZW5hbWU+Y2xlYXJ0b29sPC9maWxlbmFtZT4sIHRoZSBsb2dpbiBvZgorICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmNsZWFydG9vbDwvZmlsZW5hbWU+IGlzIGhhbmRsZWQgYnkgdGhlIHN5c3RlbS4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBsb2dpbiByZXF1aXJlIG5vIHNwZWNpYWwgc3RlcHMuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgSW4gb3JkZXIgdG8gdXNlIDxmaWxlbmFtZT5yY2xlYXJ0b29sPC9maWxlbmFtZT4gd2l0aCBhdXRoZW50aWNhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICB1c2VycywgYW4gInJjbGVhcnRvb2wgbG9naW4iIGlzIG5lY2Vzc2FyeSBiZWZvcmUgdXNpbmcgdGhlIGZldGNoZXIuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uIGlkPSdvdGhlci1mZXRjaGVycyc+CisgICAgICAgICAgICA8dGl0bGU+T3RoZXIgRmV0Y2hlcnM8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBGZXRjaCBzdWJtb2R1bGVzIGFsc28gZXhpc3QgZm9yIHRoZSBmb2xsb3dpbmc6CisgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgQmF6YWFyICg8ZmlsZW5hbWU+YnpyOi8vPC9maWxlbmFtZT4pCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9yY2UgKDxmaWxlbmFtZT5wNDovLzwvZmlsZW5hbWU+KQorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRyZWVzIHVzaW5nIEdpdCBBbm5leCAoPGZpbGVuYW1lPmdpdGFubmV4Oi8vPC9maWxlbmFtZT4pCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgU2VjdXJlIEZUUCAoPGZpbGVuYW1lPnNmdHA6Ly88L2ZpbGVuYW1lPikKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBTZWN1cmUgU2hlbGwgKDxmaWxlbmFtZT5zc2g6Ly88L2ZpbGVuYW1lPikKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBSZXBvICg8ZmlsZW5hbWU+cmVwbzovLzwvZmlsZW5hbWU+KQorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIE9TQyAoPGZpbGVuYW1lPm9zYzovLzwvZmlsZW5hbWU+KQorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIE1lcmN1cmlhbCAoPGZpbGVuYW1lPmhnOi8vPC9maWxlbmFtZT4pCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICBObyBkb2N1bWVudGF0aW9uIGN1cnJlbnRseSBleGlzdHMgZm9yIHRoZXNlIGxlc3NlciB1c2VkCisgICAgICAgICAgICAgICAgZmV0Y2hlciBzdWJtb2R1bGVzLgorICAgICAgICAgICAgICAgIEhvd2V2ZXIsIHlvdSBtaWdodCBmaW5kIHRoZSBjb2RlIGhlbHBmdWwgYW5kIHJlYWRhYmxlLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24gaWQ9J2F1dG8tcmV2aXNpb25zJz4KKyAgICAgICAgPHRpdGxlPkF1dG8gUmV2aXNpb25zPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFdlIG5lZWQgdG8gZG9jdW1lbnQgPGZpbGVuYW1lPkFVVE9SRVY8L2ZpbGVuYW1lPiBhbmQKKyAgICAgICAgICAgIDxmaWxlbmFtZT5TUkNSRVZfRk9STUFUPC9maWxlbmFtZT4gaGVyZS4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKzwvY2hhcHRlcj4KZGlmZiAtLWdpdCBhL2JpdGJha2UvZG9jL2JpdGJha2UtdXNlci1tYW51YWwvYml0YmFrZS11c2VyLW1hbnVhbC1oZWxsby54bWwgYi9iaXRiYWtlL2RvYy9iaXRiYWtlLXVzZXItbWFudWFsL2JpdGJha2UtdXNlci1tYW51YWwtaGVsbG8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNjI4Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2RvYy9iaXRiYWtlLXVzZXItbWFudWFsL2JpdGJha2UtdXNlci1tYW51YWwtaGVsbG8ueG1sCkBAIC0wLDAgKzEsNTA2IEBACis8IURPQ1RZUEUgY2hhcHRlciBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuMi8vRU4iCisiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9kb2Nib29rL3htbC80LjIvZG9jYm9va3guZHRkIj4KKworPGFwcGVuZGl4IGlkPSdoZWxsby13b3JsZC1leGFtcGxlJz4KKyAgICA8dGl0bGU+SGVsbG8gV29ybGQgRXhhbXBsZTwvdGl0bGU+CisKKyAgICA8c2VjdGlvbiBpZD0nYml0YmFrZS1oZWxsby13b3JsZCc+CisgICAgICAgIDx0aXRsZT5CaXRCYWtlIEhlbGxvIFdvcmxkPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSBzaW1wbGVzdCBleGFtcGxlIGNvbW1vbmx5IHVzZWQgdG8gZGVtb25zdHJhdGUgYW55IG5ldworICAgICAgICAgICAgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2Ugb3IgdG9vbCBpcyB0aGUKKyAgICAgICAgICAgICI8dWxpbmsgdXJsPSJodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0hlbGxvX3dvcmxkX3Byb2dyYW0iPkhlbGxvIFdvcmxkPC91bGluaz4iCisgICAgICAgICAgICBleGFtcGxlLgorICAgICAgICAgICAgVGhpcyBhcHBlbmRpeCBkZW1vbnN0cmF0ZXMsIGluIHR1dG9yaWFsIGZvcm0sIEhlbGxvCisgICAgICAgICAgICBXb3JsZCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgQml0QmFrZS4KKyAgICAgICAgICAgIFRoZSB0dXRvcmlhbCBkZXNjcmliZXMgaG93IHRvIGNyZWF0ZSBhIG5ldyBwcm9qZWN0CisgICAgICAgICAgICBhbmQgdGhlIGFwcGxpY2FibGUgbWV0YWRhdGEgZmlsZXMgbmVjZXNzYXJ5IHRvIGFsbG93CisgICAgICAgICAgICBCaXRCYWtlIHRvIGJ1aWxkIGl0LgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24gaWQ9J2V4YW1wbGUtb2J0YWluaW5nLWJpdGJha2UnPgorICAgICAgICA8dGl0bGU+T2J0YWluaW5nIEJpdEJha2U8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgU2VlIHRoZQorICAgICAgICAgICAgIjxsaW5rIGxpbmtlbmQ9J29idGFpbmluZy1iaXRiYWtlJz5PYnRhaW5pbmcgQml0QmFrZTwvbGluaz4iCisgICAgICAgICAgICBzZWN0aW9uIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gb2J0YWluIEJpdEJha2UuCisgICAgICAgICAgICBPbmNlIHlvdSBoYXZlIHRoZSBzb3VyY2UgY29kZSBvbiB5b3VyIG1hY2hpbmUsIHRoZSBCaXRCYWtlIGRpcmVjdG9yeQorICAgICAgICAgICAgYXBwZWFycyBhcyBmb2xsb3dzOgorICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICAkIGxzIC1hbAorICAgICB0b3RhbCAxMDAKKyAgICAgZHJ3eHJ3eHIteC4gOSB3bWF0IHdtYXQgIDQwOTYgSmFuIDMxIDEzOjQ0IC4KKyAgICAgZHJ3eHJ3eHIteC4gMyB3bWF0IHdtYXQgIDQwOTYgRmViICA0IDEwOjQ1IC4uCisgICAgIC1ydy1ydy1yLS0uIDEgd21hdCB3bWF0ICAgMzY1IE5vdiAyNiAwNDo1NSBBVVRIT1JTCisgICAgIGRyd3hyd3hyLXguIDIgd21hdCB3bWF0ICA0MDk2IE5vdiAyNiAwNDo1NSBiaW4KKyAgICAgZHJ3eHJ3eHIteC4gNCB3bWF0IHdtYXQgIDQwOTYgSmFuIDMxIDEzOjQ0IGJ1aWxkCisgICAgIC1ydy1ydy1yLS0uIDEgd21hdCB3bWF0IDE2NTAxIE5vdiAyNiAwNDo1NSBDaGFuZ2VMb2cKKyAgICAgZHJ3eHJ3eHIteC4gMiB3bWF0IHdtYXQgIDQwOTYgTm92IDI2IDA0OjU1IGNsYXNzZXMKKyAgICAgZHJ3eHJ3eHIteC4gMiB3bWF0IHdtYXQgIDQwOTYgTm92IDI2IDA0OjU1IGNvbmYKKyAgICAgZHJ3eHJ3eHIteC4gMyB3bWF0IHdtYXQgIDQwOTYgTm92IDI2IDA0OjU1IGNvbnRyaWIKKyAgICAgLXJ3LXJ3LXItLS4gMSB3bWF0IHdtYXQgMTc5ODcgTm92IDI2IDA0OjU1IENPUFlJTkcKKyAgICAgZHJ3eHJ3eHIteC4gMyB3bWF0IHdtYXQgIDQwOTYgTm92IDI2IDA0OjU1IGRvYworICAgICAtcnctcnctci0tLiAxIHdtYXQgd21hdCAgICA2OSBOb3YgMjYgMDQ6NTUgLmdpdGlnbm9yZQorICAgICAtcnctcnctci0tLiAxIHdtYXQgd21hdCAgIDg0OSBOb3YgMjYgMDQ6NTUgSEVBREVSCisgICAgIGRyd3hyd3hyLXguIDUgd21hdCB3bWF0ICA0MDk2IEphbiAzMSAxMzo0NCBsaWIKKyAgICAgLXJ3LXJ3LXItLS4gMSB3bWF0IHdtYXQgICAxOTUgTm92IDI2IDA0OjU1IE1BTklGRVNULmluCisgICAgIC1yd3hyd3hyLXguIDEgd21hdCB3bWF0ICAzMTk1IEphbiAzMSAxMTo1NyBzZXR1cC5weQorICAgICAtcnctcnctci0tLiAxIHdtYXQgd21hdCAgMjg4NyBOb3YgMjYgMDQ6NTUgVE9ETworICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBBdCB0aGlzIHBvaW50LCB5b3Ugc2hvdWxkIGhhdmUgQml0QmFrZSBjbG9uZWQgdG8KKyAgICAgICAgICAgIGEgZGlyZWN0b3J5IHRoYXQgbWF0Y2hlcyB0aGUgcHJldmlvdXMgbGlzdGluZyBleGNlcHQgZm9yCisgICAgICAgICAgICBkYXRlcyBhbmQgdXNlciBuYW1lcy4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIGlkPSdzZXR0aW5nLXVwLXRoZS1iaXRiYWtlLWVudmlyb25tZW50Jz4KKyAgICAgICAgPHRpdGxlPlNldHRpbmcgVXAgdGhlIEJpdEJha2UgRW52aXJvbm1lbnQ8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgRmlyc3QsIHlvdSBuZWVkIHRvIGJlIHN1cmUgdGhhdCB5b3UgY2FuIHJ1biBCaXRCYWtlLgorICAgICAgICAgICAgU2V0IHlvdXIgd29ya2luZyBkaXJlY3RvcnkgdG8gd2hlcmUgeW91ciBsb2NhbCBCaXRCYWtlCisgICAgICAgICAgICBmaWxlcyBhcmUgYW5kIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgICQgLi9iaW4vYml0YmFrZSAtLXZlcnNpb24KKyAgICAgQml0QmFrZSBCdWlsZCBUb29sIENvcmUgdmVyc2lvbiAxLjIzLjAsIGJpdGJha2UgdmVyc2lvbiAxLjIzLjAKKyAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgIFRoZSBjb25zb2xlIG91dHB1dCB0ZWxscyB5b3Ugd2hhdCB2ZXJzaW9uIHlvdSBhcmUgcnVubmluZy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlIHJlY29tbWVuZGVkIG1ldGhvZCB0byBydW4gQml0QmFrZSBpcyBmcm9tIGEgZGlyZWN0b3J5IG9mIHlvdXIKKyAgICAgICAgICAgIGNob2ljZS4KKyAgICAgICAgICAgIFRvIGJlIGFibGUgdG8gcnVuIEJpdEJha2UgZnJvbSBhbnkgZGlyZWN0b3J5LCB5b3UgbmVlZCB0byBhZGQgdGhlCisgICAgICAgICAgICBleGVjdXRhYmxlIGJpbmFyeSB0byB5b3VyIGJpbmFyeSB0byB5b3VyIHNoZWxsJ3MgZW52aXJvbm1lbnQKKyAgICAgICAgICAgIDxmaWxlbmFtZT5QQVRIPC9maWxlbmFtZT4gdmFyaWFibGUuCisgICAgICAgICAgICBGaXJzdCwgbG9vayBhdCB5b3VyIGN1cnJlbnQgPGZpbGVuYW1lPlBBVEg8L2ZpbGVuYW1lPiB2YXJpYWJsZQorICAgICAgICAgICAgYnkgZW50ZXJpbmcgdGhlIGZvbGxvd2luZzoKKyAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgJCBlY2hvICRQQVRICisgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICBOZXh0LCBhZGQgdGhlIGRpcmVjdG9yeSBsb2NhdGlvbiBmb3IgdGhlIEJpdEJha2UgYmluYXJ5IHRvIHRoZQorICAgICAgICAgICAgPGZpbGVuYW1lPlBBVEg8L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgIEhlcmUgaXMgYW4gZXhhbXBsZSB0aGF0IGFkZHMgdGhlCisgICAgICAgICAgICA8ZmlsZW5hbWU+L2hvbWUvc2NvdHQtbGVub3ZvL2JpdGJha2UvYmluPC9maWxlbmFtZT4gZGlyZWN0b3J5CisgICAgICAgICAgICB0byB0aGUgZnJvbnQgb2YgdGhlIDxmaWxlbmFtZT5QQVRIPC9maWxlbmFtZT4gdmFyaWFibGU6CisgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgICQgZXhwb3J0IFBBVEg9L2hvbWUvc2NvdHQtbGVub3ZvL2JpdGJha2UvYmluOiRQQVRICisgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICBZb3Ugc2hvdWxkIG5vdyBiZSBhYmxlIHRvIGVudGVyIHRoZSA8ZmlsZW5hbWU+Yml0YmFrZTwvZmlsZW5hbWU+CisgICAgICAgICAgICBjb21tYW5kIGZyb20gdGhlIGNvbW1hbmQgbGluZSB3aGlsZSB3b3JraW5nIGZyb20gYW55IGRpcmVjdG9yeS4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIGlkPSd0aGUtaGVsbG8td29ybGQtZXhhbXBsZSc+CisgICAgICAgIDx0aXRsZT5UaGUgSGVsbG8gV29ybGQgRXhhbXBsZTwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGUgb3ZlcmFsbCBnb2FsIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gYnVpbGQgYQorICAgICAgICAgICAgY29tcGxldGUgIkhlbGxvIFdvcmxkIiBleGFtcGxlIHV0aWxpemluZyB0YXNrIGFuZCBsYXllcgorICAgICAgICAgICAgY29uY2VwdHMuCisgICAgICAgICAgICBCZWNhdXNlIHRoaXMgaXMgaG93IG1vZGVybiBwcm9qZWN0cyBzdWNoIGFzIE9wZW5FbWJlZGRlZCBhbmQKKyAgICAgICAgICAgIHRoZSBZb2N0byBQcm9qZWN0IHV0aWxpemUgQml0QmFrZSwgdGhlIGV4YW1wbGUKKyAgICAgICAgICAgIHByb3ZpZGVzIGFuIGV4Y2VsbGVudCBzdGFydGluZyBwb2ludCBmb3IgdW5kZXJzdGFuZGluZworICAgICAgICAgICAgQml0QmFrZS4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVG8gaGVscCB5b3UgdW5kZXJzdGFuZCBob3cgdG8gdXNlIEJpdEJha2UgdG8gYnVpbGQgdGFyZ2V0cywKKyAgICAgICAgICAgIHRoZSBleGFtcGxlIHN0YXJ0cyB3aXRoIG5vdGhpbmcgYnV0IHRoZSA8ZmlsZW5hbWU+Yml0YmFrZTwvZmlsZW5hbWU+CisgICAgICAgICAgICBjb21tYW5kLCB3aGljaCBjYXVzZXMgQml0QmFrZSB0byBmYWlsIGFuZCByZXBvcnQgcHJvYmxlbXMuCisgICAgICAgICAgICBUaGUgZXhhbXBsZSBwcm9ncmVzc2VzIGJ5IGFkZGluZyBwaWVjZXMgdG8gdGhlIGJ1aWxkIHRvCisgICAgICAgICAgICBldmVudHVhbGx5IGNvbmNsdWRlIHdpdGggYSB3b3JraW5nLCBtaW5pbWFsICJIZWxsbyBXb3JsZCIKKyAgICAgICAgICAgIGV4YW1wbGUuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFdoaWxlIGV2ZXJ5IGF0dGVtcHQgaXMgbWFkZSB0byBleHBsYWluIHdoYXQgaXMgaGFwcGVuaW5nIGR1cmluZworICAgICAgICAgICAgdGhlIGV4YW1wbGUsIHRoZSBkZXNjcmlwdGlvbnMgY2Fubm90IGNvdmVyIGV2ZXJ5dGhpbmcuCisgICAgICAgICAgICBZb3UgY2FuIGZpbmQgZnVydGhlciBpbmZvcm1hdGlvbiB0aHJvdWdob3V0IHRoaXMgbWFudWFsLgorICAgICAgICAgICAgQWxzbywgeW91IGNhbiBhY3RpdmVseSBwYXJ0aWNpcGF0ZSBpbiB0aGUKKyAgICAgICAgICAgIDx1bGluayB1cmw9J2h0dHA6Ly9saXN0cy5vcGVuZW1iZWRkZWQub3JnL21haWxtYW4vbGlzdGluZm8vYml0YmFrZS1kZXZlbCc+PC91bGluaz4KKyAgICAgICAgICAgIGRpc2N1c3Npb24gbWFpbGluZyBsaXN0IGFib3V0IHRoZSBCaXRCYWtlIGJ1aWxkIHRvb2wuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgIFRoaXMgZXhhbXBsZSB3YXMgaW5zcGlyZWQgYnkgYW5kIGRyZXcgaGVhdmlseSBmcm9tIHRoZXNlIHNvdXJjZXM6CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPHVsaW5rIHVybD0iaHR0cDovL3d3dy5tYWlsLWFyY2hpdmUuY29tL3lvY3RvQHlvY3RvcHJvamVjdC5vcmcvbXNnMDkzNzkuaHRtbCI+TWFpbGluZyBMaXN0IHBvc3QgLSBUaGUgQml0QmFrZSBlcXVpdmFsZW50IG9mICJIZWxsbywgV29ybGQhIjwvdWxpbms+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPHVsaW5rIHVybD0iaHR0cDovL2hhbWJlZGRlZC5vcmcvYmxvZy8yMDEyLzExLzI0L2Zyb20tYml0YmFrZS1oZWxsby13b3JsZC10by1hbi1pbWFnZS8iPkhhbWJlZGRlZCBMaW51eCBibG9nIHBvc3QgLSBGcm9tIEJpdGJha2UgSGVsbG8gV29ybGQgdG8gYW4gSW1hZ2U8L3VsaW5rPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8L25vdGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBBcyBzdGF0ZWQgZWFybGllciwgdGhlIGdvYWwgb2YgdGhpcyBleGFtcGxlCisgICAgICAgICAgICBpcyB0byBldmVudHVhbGx5IGNvbXBpbGUgIkhlbGxvIFdvcmxkIi4KKyAgICAgICAgICAgIEhvd2V2ZXIsIGl0IGlzIHVua25vd24gd2hhdCBCaXRCYWtlIG5lZWRzIGFuZCB3aGF0IHlvdSBoYXZlCisgICAgICAgICAgICB0byBwcm92aWRlIGluIG9yZGVyIHRvIGFjaGlldmUgdGhhdCBnb2FsLgorICAgICAgICAgICAgUmVjYWxsIHRoYXQgQml0QmFrZSB1dGlsaXplcyB0aHJlZSB0eXBlcyBvZiBtZXRhZGF0YSBmaWxlczoKKyAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J2NvbmZpZ3VyYXRpb24tZmlsZXMnPkNvbmZpZ3VyYXRpb24gRmlsZXM8L2xpbms+LAorICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0nY2xhc3Nlcyc+Q2xhc3NlczwvbGluaz4sIGFuZAorICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ncmVjaXBlcyc+UmVjaXBlczwvbGluaz4uCisgICAgICAgICAgICBCdXQgd2hlcmUgZG8gdGhleSBnbz8KKyAgICAgICAgICAgIEhvdyBkb2VzIEJpdEJha2UgZmluZCB0aGVtPworICAgICAgICAgICAgQml0QmFrZSdzIGVycm9yIG1lc3NhZ2luZyBoZWxwcyB5b3UgYW5zd2VyIHRoZXNlIHR5cGVzIG9mIHF1ZXN0aW9ucworICAgICAgICAgICAgYW5kIGhlbHBzIHlvdSBiZXR0ZXIgdW5kZXJzdGFuZCBleGFjdGx5IHdoYXQgaXMgZ29pbmcgb24uCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEZvbGxvd2luZyBpcyB0aGUgY29tcGxldGUgIkhlbGxvIFdvcmxkIiBleGFtcGxlLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPG9yZGVyZWRsaXN0PgorICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz5DcmVhdGUgYSBQcm9qZWN0IERpcmVjdG9yeTo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIEZpcnN0LCBzZXQgdXAgYSBkaXJlY3RvcnkgZm9yIHRoZSAiSGVsbG8gV29ybGQiIHByb2plY3QuCisgICAgICAgICAgICAgICAgSGVyZSBpcyBob3cgeW91IGNhbiBkbyBzbyBpbiB5b3VyIGhvbWUgZGlyZWN0b3J5OgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgJCBta2RpciB+L2hlbGxvCisgICAgICQgY2Qgfi9oZWxsbworICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBkaXJlY3RvcnkgdGhhdCBCaXRCYWtlIHdpbGwgdXNlIHRvIGRvIGFsbCBvZgorICAgICAgICAgICAgICAgIGl0cyB3b3JrLgorICAgICAgICAgICAgICAgIFlvdSBjYW4gdXNlIHRoaXMgZGlyZWN0b3J5IHRvIGtlZXAgYWxsIHRoZSBtZXRhZmlsZXMgbmVlZGVkCisgICAgICAgICAgICAgICAgYnkgQml0QmFrZS4KKyAgICAgICAgICAgICAgICBIYXZpbmcgYSBwcm9qZWN0IGRpcmVjdG9yeSBpcyBhIGdvb2Qgd2F5IHRvIGlzb2xhdGUgeW91cgorICAgICAgICAgICAgICAgIHByb2plY3QuCisgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPlJ1biBCaXRiYWtlOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgQXQgdGhpcyBwb2ludCwgeW91IGhhdmUgbm90aGluZyBidXQgYSBwcm9qZWN0IGRpcmVjdG9yeS4KKyAgICAgICAgICAgICAgICBSdW4gdGhlIDxmaWxlbmFtZT5iaXRiYWtlPC9maWxlbmFtZT4gY29tbWFuZCBhbmQgc2VlIHdoYXQKKyAgICAgICAgICAgICAgICBpdCBkb2VzOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgJCBiaXRiYWtlCisgICAgIFRoZSBCQlBBVEggdmFyaWFibGUgaXMgbm90IHNldCBhbmQgYml0YmFrZSBkaWQgbm90CisgICAgIGZpbmQgYSBjb25mL2JibGF5ZXJzLmNvbmYgZmlsZSBpbiB0aGUgZXhwZWN0ZWQgbG9jYXRpb24uCisgICAgIE1heWJlIHlvdSBhY2NpZGVudGFsbHkgaW52b2tlZCBiaXRiYWtlIGZyb20gdGhlIHdyb25nIGRpcmVjdG9yeT8KKyAgICAgREVCVUc6IFJlbW92ZWQgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgZnJvbSB0aGUgZW52aXJvbm1lbnQ6CisgICAgIEdOT01FX0RFU0tUT1BfU0VTU0lPTl9JRCwgWERHX0NVUlJFTlRfREVTS1RPUCwKKyAgICAgR05PTUVfS0VZUklOR19DT05UUk9MLCBESVNQTEFZLCBTU0hfQUdFTlRfUElELCBMQU5HLCBub19wcm94eSwKKyAgICAgWERHX1NFU1NJT05fUEFUSCwgWEFVVEhPUklUWSwgU0VTU0lPTl9NQU5BR0VSLCBTSExWTCwKKyAgICAgTUFOREFUT1JZX1BBVEgsIENPTVBJWl9DT05GSUdfUFJPRklMRSwgV0lORE9XSUQsIEVESVRPUiwKKyAgICAgR1BHX0FHRU5UX0lORk8sIFNTSF9BVVRIX1NPQ0ssIEdETVNFU1NJT04sIEdOT01FX0tFWVJJTkdfUElELAorICAgICBYREdfU0VBVF9QQVRILCBYREdfQ09ORklHX0RJUlMsIExFU1NPUEVOLCBEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MsCisgICAgIF8sIFhER19TRVNTSU9OX0NPT0tJRSwgREVTS1RPUF9TRVNTSU9OLCBMRVNTQ0xPU0UsIERFRkFVTFRTX1BBVEgsCisgICAgIFVCVU5UVV9NRU5VUFJPWFksIE9MRFBXRCwgWERHX0RBVEFfRElSUywgQ09MT1JURVJNLCBMU19DT0xPUlMKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgVGhlIG1ham9yaXR5IG9mIHRoaXMgb3V0cHV0IGlzIHNwZWNpZmljIHRvIGVudmlyb25tZW50IHZhcmlhYmxlcworICAgICAgICAgICAgICAgIHRoYXQgYXJlIG5vdCBkaXJlY3RseSByZWxldmFudCB0byBCaXRCYWtlLgorICAgICAgICAgICAgICAgIEhvd2V2ZXIsIHRoZSB2ZXJ5IGZpcnN0IG1lc3NhZ2UgcmVnYXJkaW5nIHRoZQorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5CQlBBVEg8L2ZpbGVuYW1lPiB2YXJpYWJsZSBhbmQgdGhlCisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmNvbmYvYmJsYXllcnMuY29uZjwvZmlsZW5hbWU+IGZpbGUKKyAgICAgICAgICAgICAgICBpcyByZWxldmFudC48L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgV2hlbiB5b3UgcnVuIEJpdEJha2UsIGl0IGJlZ2lucyBsb29raW5nIGZvciBtZXRhZGF0YSBmaWxlcy4KKyAgICAgICAgICAgICAgICBUaGUKKyAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItQkJQQVRIJz48ZmlsZW5hbWU+QkJQQVRIPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgdmFyaWFibGUgaXMgd2hhdCB0ZWxscyBCaXRCYWtlIHdoZXJlIHRvIGxvb2sgZm9yIHRob3NlIGZpbGVzLgorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5CQlBBVEg8L2ZpbGVuYW1lPiBpcyBub3Qgc2V0IGFuZCB5b3UgbmVlZCB0byBzZXQgaXQuCisgICAgICAgICAgICAgICAgV2l0aG91dCA8ZmlsZW5hbWU+QkJQQVRIPC9maWxlbmFtZT4sIEJpdGJha2UgY2Fubm90CisgICAgICAgICAgICAgICAgZmluZCBhbnkgY29uZmlndXJhdGlvbiBmaWxlcyAoPGZpbGVuYW1lPi5jb25mPC9maWxlbmFtZT4pCisgICAgICAgICAgICAgICAgb3IgcmVjaXBlIGZpbGVzICg8ZmlsZW5hbWU+LmJiPC9maWxlbmFtZT4pIGF0IGFsbC4KKyAgICAgICAgICAgICAgICBCaXRCYWtlIGFsc28gY2Fubm90IGZpbmQgdGhlIDxmaWxlbmFtZT5iaXRiYWtlLmNvbmY8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgIGZpbGUuCisgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPlNldHRpbmcgPGZpbGVuYW1lPkJCUEFUSDwvZmlsZW5hbWU+OjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgRm9yIHRoaXMgZXhhbXBsZSwgeW91IGNhbiBzZXQgPGZpbGVuYW1lPkJCUEFUSDwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgaW4gdGhlIHNhbWUgbWFubmVyIHRoYXQgeW91IHNldCA8ZmlsZW5hbWU+UEFUSDwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgZWFybGllciBpbiB0aGUgYXBwZW5kaXguCisgICAgICAgICAgICAgICAgWW91IHNob3VsZCByZWFsaXplLCB0aG91Z2gsIHRoYXQgaXQgaXMgbXVjaCBtb3JlIGZsZXhpYmxlIHRvIHNldCB0aGUKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+QkJQQVRIPC9maWxlbmFtZT4gdmFyaWFibGUgdXAgaW4gYSBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAgICAgZmlsZSBmb3IgZWFjaCBwcm9qZWN0LjwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT5Gcm9tIHlvdXIgc2hlbGwsIGVudGVyIHRoZSBmb2xsb3dpbmcgY29tbWFuZHMgdG8gc2V0IGFuZAorICAgICAgICAgICAgICAgIGV4cG9ydCB0aGUgPGZpbGVuYW1lPkJCUEFUSDwvZmlsZW5hbWU+IHZhcmlhYmxlOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgJCBCQlBBVEg9IjxyZXBsYWNlYWJsZT5wcm9qZWN0ZGlyZWN0b3J5PC9yZXBsYWNlYWJsZT4iCisgICAgICQgZXhwb3J0IEJCUEFUSAorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICBVc2UgeW91ciBhY3R1YWwgcHJvamVjdCBkaXJlY3RvcnkgaW4gdGhlIGNvbW1hbmQuCisgICAgICAgICAgICAgICAgQml0QmFrZSB1c2VzIHRoYXQgZGlyZWN0b3J5IHRvIGZpbmQgdGhlIG1ldGFkYXRhIGl0IG5lZWRzIGZvcgorICAgICAgICAgICAgICAgIHlvdXIgcHJvamVjdC4KKyAgICAgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICAgICAgV2hlbiBzcGVjaWZ5aW5nIHlvdXIgcHJvamVjdCBkaXJlY3RvcnksIGRvIG5vdCB1c2UgdGhlCisgICAgICAgICAgICAgICAgICAgIHRpbGRlICgifiIpIGNoYXJhY3RlciBhcyBCaXRCYWtlIGRvZXMgbm90IGV4cGFuZCB0aGF0IGNoYXJhY3RlcgorICAgICAgICAgICAgICAgICAgICBhcyB0aGUgc2hlbGwgd291bGQuCisgICAgICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz5SdW4gQml0YmFrZTo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIE5vdyB0aGF0IHlvdSBoYXZlIDxmaWxlbmFtZT5CQlBBVEg8L2ZpbGVuYW1lPiBkZWZpbmVkLCBydW4KKyAgICAgICAgICAgICAgICB0aGUgPGZpbGVuYW1lPmJpdGJha2U8L2ZpbGVuYW1lPiBjb21tYW5kIGFnYWluOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgJCBiaXRiYWtlCisgICAgIEVSUk9SOiBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAgRmlsZSAiL2hvbWUvc2NvdHQtbGVub3ZvL2JpdGJha2UvbGliL2JiL2Nvb2tlcmRhdGEucHkiLCBsaW5lIDE2MywgaW4gd3JhcHBlZAorICAgICAgICAgcmV0dXJuIGZ1bmMoZm4sICphcmdzKQorICAgICAgIEZpbGUgIi9ob21lL3Njb3R0LWxlbm92by9iaXRiYWtlL2xpYi9iYi9jb29rZXJkYXRhLnB5IiwgbGluZSAxNzMsIGluIHBhcnNlX2NvbmZpZ19maWxlCisgICAgICAgICByZXR1cm4gYmIucGFyc2UuaGFuZGxlKGZuLCBkYXRhLCBpbmNsdWRlKQorICAgICAgIEZpbGUgIi9ob21lL3Njb3R0LWxlbm92by9iaXRiYWtlL2xpYi9iYi9wYXJzZS9fX2luaXRfXy5weSIsIGxpbmUgOTksIGluIGhhbmRsZQorICAgICAgICAgcmV0dXJuIGhbJ2hhbmRsZSddKGZuLCBkYXRhLCBpbmNsdWRlKQorICAgICAgIEZpbGUgIi9ob21lL3Njb3R0LWxlbm92by9iaXRiYWtlL2xpYi9iYi9wYXJzZS9wYXJzZV9weS9Db25mSGFuZGxlci5weSIsIGxpbmUgMTIwLCBpbiBoYW5kbGUKKyAgICAgICAgIGFic19mbiA9IHJlc29sdmVfZmlsZShmbiwgZGF0YSkKKyAgICAgICBGaWxlICIvaG9tZS9zY290dC1sZW5vdm8vYml0YmFrZS9saWIvYmIvcGFyc2UvX19pbml0X18ucHkiLCBsaW5lIDExNywgaW4gcmVzb2x2ZV9maWxlCisgICAgICAgICByYWlzZSBJT0Vycm9yKCJmaWxlICVzIG5vdCBmb3VuZCBpbiAlcyIgJSAoZm4sIGJicGF0aCkpCisgICAgIElPRXJyb3I6IGZpbGUgY29uZi9iaXRiYWtlLmNvbmYgbm90IGZvdW5kIGluIC9ob21lL3Njb3R0LWxlbm92by9oZWxsbworCisgICAgIEVSUk9SOiBVbmFibGUgdG8gcGFyc2UgY29uZi9iaXRiYWtlLmNvbmY6IGZpbGUgY29uZi9iaXRiYWtlLmNvbmYgbm90IGZvdW5kIGluIC9ob21lL3Njb3R0LWxlbm92by9oZWxsbworICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICBUaGlzIHNhbXBsZSBvdXRwdXQgc2hvd3MgdGhhdCBCaXRCYWtlIGNvdWxkIG5vdCBmaW5kIHRoZQorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5jb25mL2JpdGJha2UuY29uZjwvZmlsZW5hbWU+IGZpbGUgaW4gdGhlIHByb2plY3QKKyAgICAgICAgICAgICAgICBkaXJlY3RvcnkuCisgICAgICAgICAgICAgICAgVGhpcyBmaWxlIGlzIHRoZSBmaXJzdCB0aGluZyBCaXRCYWtlIG11c3QgZmluZCBpbiBvcmRlcgorICAgICAgICAgICAgICAgIHRvIGJ1aWxkIGEgdGFyZ2V0LgorICAgICAgICAgICAgICAgIEFuZCwgc2luY2UgdGhlIHByb2plY3QgZGlyZWN0b3J5IGZvciB0aGlzIGV4YW1wbGUgaXMKKyAgICAgICAgICAgICAgICBlbXB0eSwgeW91IG5lZWQgdG8gcHJvdmlkZSBhIDxmaWxlbmFtZT5jb25mL2JpdGJha2UuY29uZjwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgZmlsZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+Q3JlYXRpbmcgPGZpbGVuYW1lPmNvbmYvYml0YmFrZS5jb25mPC9maWxlbmFtZT46PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICBUaGUgPGZpbGVuYW1lPmNvbmYvYml0YmFrZS5jb25mPC9maWxlbmFtZT4gaW5jbHVkZXMgYSBudW1iZXIgb2YKKyAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBCaXRCYWtlIHVzZXMgZm9yIG1ldGFkYXRhIGFuZCByZWNpcGUKKyAgICAgICAgICAgICAgICBmaWxlcy4KKyAgICAgICAgICAgICAgICBGb3IgdGhpcyBleGFtcGxlLCB5b3UgbmVlZCB0byBjcmVhdGUgdGhlIGZpbGUgaW4geW91ciBwcm9qZWN0IGRpcmVjdG9yeQorICAgICAgICAgICAgICAgIGFuZCBkZWZpbmUgc29tZSBrZXkgQml0QmFrZSB2YXJpYWJsZXMuCisgICAgICAgICAgICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIDxmaWxlbmFtZT5iaXRiYWtlLmNvbmY8L2ZpbGVuYW1lPiwKKyAgICAgICAgICAgICAgICBzZWUKKyAgICAgICAgICAgICAgICA8dWxpbmsgdXJsPSdodHRwOi8vaGFtYmVkZGVkLm9yZy9ibG9nLzIwMTIvMTEvMjQvZnJvbS1iaXRiYWtlLWhlbGxvLXdvcmxkLXRvLWFuLWltYWdlLyNhbi1vdmVydmlldy1vZi1iaXRiYWtlY29uZic+PC91bGluaz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+VXNlIHRoZSBmb2xsb3dpbmcgY29tbWFuZHMgdG8gY3JlYXRlIHRoZSA8ZmlsZW5hbWU+Y29uZjwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgZGlyZWN0b3J5IGluIHRoZSBwcm9qZWN0IGRpcmVjdG9yeToKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgICQgbWtkaXIgY29uZgorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICBGcm9tIHdpdGhpbiB0aGUgPGZpbGVuYW1lPmNvbmY8L2ZpbGVuYW1lPiBkaXJlY3RvcnksIHVzZQorICAgICAgICAgICAgICAgIHNvbWUgZWRpdG9yIHRvIGNyZWF0ZSB0aGUgPGZpbGVuYW1lPmJpdGJha2UuY29uZjwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBjb250YWlucyB0aGUgZm9sbG93aW5nOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgVE1QRElSICA9ICIkezxsaW5rIGxpbmtlbmQ9J3Zhci1UT1BESVInPlRPUERJUjwvbGluaz59L3RtcCIKKyAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUNBQ0hFJz5DQUNIRTwvbGluaz4gICA9ICIke1RNUERJUn0vY2FjaGUiCisgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1TVEFNUCc+U1RBTVA8L2xpbms+ICAgPSAiJHtUTVBESVJ9L3N0YW1wcyIKKyAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVQnPlQ8L2xpbms+ICAgICAgID0gIiR7VE1QRElSfS93b3JrIgorICAgICA8bGluayBsaW5rZW5kPSd2YXItQic+QjwvbGluaz4gICAgICAgPSAiJHtUTVBESVJ9IgorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICBUaGUgPGZpbGVuYW1lPlRNUERJUjwvZmlsZW5hbWU+IHZhcmlhYmxlIGVzdGFibGlzaGVzIGEgZGlyZWN0b3J5CisgICAgICAgICAgICAgICAgdGhhdCBCaXRCYWtlIHVzZXMgZm9yIGJ1aWxkIG91dHB1dCBhbmQgaW50ZXJtZWRpYXRlIGZpbGVzIChvdGhlcgorICAgICAgICAgICAgICAgIHRoYW4gdGhlIGNhY2hlZCBpbmZvcm1hdGlvbiB1c2VkIGJ5IHRoZQorICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3NldHNjZW5lJz5TZXRzY2VuZTwvbGluaz4gcHJvY2Vzcy4KKyAgICAgICAgICAgICAgICBIZXJlLCB0aGUgPGZpbGVuYW1lPlRNUERJUjwvZmlsZW5hbWU+IGRpcmVjdG9yeSBpcyBzZXQgdG8KKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+aGVsbG8vdG1wPC9maWxlbmFtZT4uCisgICAgICAgICAgICAgICAgPG5vdGU+PHRpdGxlPlRpcDwvdGl0bGU+CisgICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gYWx3YXlzIHNhZmVseSBkZWxldGUgdGhlIDxmaWxlbmFtZT50bXA8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnkgaW4gb3JkZXIgdG8gcmVidWlsZCBhIEJpdEJha2UgdGFyZ2V0LgorICAgICAgICAgICAgICAgICAgICBUaGUgYnVpbGQgcHJvY2VzcyBjcmVhdGVzIHRoZSBkaXJlY3RvcnkgZm9yIHlvdQorICAgICAgICAgICAgICAgICAgICB3aGVuIHlvdSBydW4gQml0QmFrZS4KKyAgICAgICAgICAgICAgICA8L25vdGU+PC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPkZvciBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIG9mIHRoZSBvdGhlciB2YXJpYWJsZXMgZGVmaW5lZCBpbiB0aGlzCisgICAgICAgICAgICAgICAgZXhhbXBsZSwgY2xpY2sgb24gdGhlIGxpbmtzIHRvIHRha2UgeW91IHRvIHRoZSBkZWZpbml0aW9ucyBpbgorICAgICAgICAgICAgICAgIHRoZSBnbG9zc2FyeS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+UnVuIEJpdGJha2U6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICBBZnRlciBtYWtpbmcgc3VyZSB0aGF0IHRoZSA8ZmlsZW5hbWU+Y29uZi9iaXRiYWtlLmNvbmY8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgIGZpbGUgZXhpc3RzLCB5b3UgY2FuIHJ1biB0aGUgPGZpbGVuYW1lPmJpdGJha2U8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgIGNvbW1hbmQgYWdhaW46CisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorJCBiaXRiYWtlCitFUlJPUjogVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICBGaWxlICIvaG9tZS9zY290dC1sZW5vdm8vYml0YmFrZS9saWIvYmIvY29va2VyZGF0YS5weSIsIGxpbmUgMTYzLCBpbiB3cmFwcGVkCisgICAgcmV0dXJuIGZ1bmMoZm4sICphcmdzKQorICBGaWxlICIvaG9tZS9zY290dC1sZW5vdm8vYml0YmFrZS9saWIvYmIvY29va2VyZGF0YS5weSIsIGxpbmUgMTc3LCBpbiBfaW5oZXJpdAorICAgIGJiLnBhcnNlLkJCSGFuZGxlci5pbmhlcml0KGJiY2xhc3MsICJjb25maWd1cmF0aW9uIElOSEVSSVRzIiwgMCwgZGF0YSkKKyAgRmlsZSAiL2hvbWUvc2NvdHQtbGVub3ZvL2JpdGJha2UvbGliL2JiL3BhcnNlL3BhcnNlX3B5L0JCSGFuZGxlci5weSIsIGxpbmUgOTIsIGluIGluaGVyaXQKKyAgICBpbmNsdWRlKGZuLCBmaWxlLCBsaW5lbm8sIGQsICJpbmhlcml0IikKKyAgRmlsZSAiL2hvbWUvc2NvdHQtbGVub3ZvL2JpdGJha2UvbGliL2JiL3BhcnNlL3BhcnNlX3B5L0NvbmZIYW5kbGVyLnB5IiwgbGluZSAxMDAsIGluIGluY2x1ZGUKKyAgICByYWlzZSBQYXJzZUVycm9yKCJDb3VsZCBub3QgJShlcnJvcl9vdXQpcyBmaWxlICUoZm4pcyIgJSB2YXJzKCksIG9sZGZuLCBsaW5lbm8pCitQYXJzZUVycm9yOiBQYXJzZUVycm9yIGluIGNvbmZpZ3VyYXRpb24gSU5IRVJJVHM6IENvdWxkIG5vdCBpbmhlcml0IGZpbGUgY2xhc3Nlcy9iYXNlLmJiY2xhc3MKKworRVJST1I6IFVuYWJsZSB0byBwYXJzZSBiYXNlOiBQYXJzZUVycm9yIGluIGNvbmZpZ3VyYXRpb24gSU5IRVJJVHM6IENvdWxkIG5vdCBpbmhlcml0IGZpbGUgY2xhc3Nlcy9iYXNlLmJiY2xhc3MKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgSW4gdGhlIHNhbXBsZSBvdXRwdXQsIEJpdEJha2UgY291bGQgbm90IGZpbmQgdGhlCisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmNsYXNzZXMvYmFzZS5iYmNsYXNzPC9maWxlbmFtZT4gZmlsZS4KKyAgICAgICAgICAgICAgICBZb3UgbmVlZCB0byBjcmVhdGUgdGhhdCBmaWxlIG5leHQuCisgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPkNyZWF0aW5nIDxmaWxlbmFtZT5jbGFzc2VzL2Jhc2UuYmJjbGFzczwvZmlsZW5hbWU+OjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgQml0QmFrZSB1c2VzIGNsYXNzIGZpbGVzIHRvIHByb3ZpZGUgY29tbW9uIGNvZGUgYW5kIGZ1bmN0aW9uYWxpdHkuCisgICAgICAgICAgICAgICAgVGhlIG1pbmltYWxseSByZXF1aXJlZCBjbGFzcyBmb3IgQml0QmFrZSBpcyB0aGUKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+Y2xhc3Nlcy9iYXNlLmJiY2xhc3M8L2ZpbGVuYW1lPiBmaWxlLgorICAgICAgICAgICAgICAgIFRoZSA8ZmlsZW5hbWU+YmFzZTwvZmlsZW5hbWU+IGNsYXNzIGlzIGltcGxpY2l0bHkgaW5oZXJpdGVkIGJ5CisgICAgICAgICAgICAgICAgZXZlcnkgcmVjaXBlLgorICAgICAgICAgICAgICAgIEJpdEJha2UgbG9va3MgZm9yIHRoZSBjbGFzcyBpbiB0aGUgPGZpbGVuYW1lPmNsYXNzZXM8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgIGRpcmVjdG9yeSBvZiB0aGUgcHJvamVjdCAoaS5lIDxmaWxlbmFtZT5oZWxsby9jbGFzc2VzPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICBpbiB0aGlzIGV4YW1wbGUpLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT5DcmVhdGUgdGhlIDxmaWxlbmFtZT5jbGFzc2VzPC9maWxlbmFtZT4gZGlyZWN0b3J5IGFzIGZvbGxvd3M6CisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICAkIGNkICRIT01FL2hlbGxvCisgICAgICQgbWtkaXIgY2xhc3NlcworICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICBNb3ZlIHRvIHRoZSA8ZmlsZW5hbWU+Y2xhc3NlczwvZmlsZW5hbWU+IGRpcmVjdG9yeSBhbmQgdGhlbgorICAgICAgICAgICAgICAgIGNyZWF0ZSB0aGUgPGZpbGVuYW1lPmJhc2UuYmJjbGFzczwvZmlsZW5hbWU+IGZpbGUgYnkgaW5zZXJ0aW5nCisgICAgICAgICAgICAgICAgdGhpcyBzaW5nbGUgbGluZToKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIGFkZHRhc2sgYnVpbGQKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgVGhlIG1pbmltYWwgdGFzayB0aGF0IEJpdEJha2UgcnVucyBpcyB0aGUKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+ZG9fYnVpbGQ8L2ZpbGVuYW1lPiB0YXNrLgorICAgICAgICAgICAgICAgIFRoaXMgaXMgYWxsIHRoZSBleGFtcGxlIG5lZWRzIGluIG9yZGVyIHRvIGJ1aWxkIHRoZSBwcm9qZWN0LgorICAgICAgICAgICAgICAgIE9mIGNvdXJzZSwgdGhlIDxmaWxlbmFtZT5iYXNlLmJiY2xhc3M8L2ZpbGVuYW1lPiBjYW4gaGF2ZSBtdWNoCisgICAgICAgICAgICAgICAgbW9yZSBkZXBlbmRpbmcgb24gd2hpY2ggYnVpbGQgZW52aXJvbm1lbnRzIEJpdEJha2UgaXMKKyAgICAgICAgICAgICAgICBzdXBwb3J0aW5nLgorICAgICAgICAgICAgICAgIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSA8ZmlsZW5hbWU+YmFzZS5iYmNsYXNzPC9maWxlbmFtZT4gZmlsZSwKKyAgICAgICAgICAgICAgICB5b3UgY2FuIGxvb2sgYXQKKyAgICAgICAgICAgICAgICA8dWxpbmsgdXJsPSdodHRwOi8vaGFtYmVkZGVkLm9yZy9ibG9nLzIwMTIvMTEvMjQvZnJvbS1iaXRiYWtlLWhlbGxvLXdvcmxkLXRvLWFuLWltYWdlLyN0YXNrcyc+PC91bGluaz4uCisgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPlJ1biBCaXRiYWtlOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgQWZ0ZXIgbWFraW5nIHN1cmUgdGhhdCB0aGUgPGZpbGVuYW1lPmNsYXNzZXMvYmFzZS5iYmNsYXNzPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICBmaWxlIGV4aXN0cywgeW91IGNhbiBydW4gdGhlIDxmaWxlbmFtZT5iaXRiYWtlPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICBjb21tYW5kIGFnYWluOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgJCBiaXRiYWtlCisgICAgIE5vdGhpbmcgdG8gZG8uICBVc2UgJ2JpdGJha2Ugd29ybGQnIHRvIGJ1aWxkIGV2ZXJ5dGhpbmcsIG9yIHJ1biAnYml0YmFrZSAtLWhlbHAnIGZvciB1c2FnZSBpbmZvcm1hdGlvbi4KKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgQml0QmFrZSBpcyBmaW5hbGx5IHJlcG9ydGluZyBubyBlcnJvcnMuCisgICAgICAgICAgICAgICAgSG93ZXZlciwgeW91IGNhbiBzZWUgdGhhdCBpdCByZWFsbHkgZG9lcyBub3QgaGF2ZSBhbnl0aGluZworICAgICAgICAgICAgICAgIHRvIGRvLgorICAgICAgICAgICAgICAgIFlvdSBuZWVkIHRvIGNyZWF0ZSBhIHJlY2lwZSB0aGF0IGdpdmVzIEJpdEJha2Ugc29tZXRoaW5nIHRvIGRvLgorICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz5DcmVhdGluZyBhIExheWVyOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgV2hpbGUgaXQgaXMgbm90IHJlYWxseSBuZWNlc3NhcnkgZm9yIHN1Y2ggYSBzbWFsbCBleGFtcGxlLAorICAgICAgICAgICAgICAgIGl0IGlzIGdvb2QgcHJhY3RpY2UgdG8gY3JlYXRlIGEgbGF5ZXIgaW4gd2hpY2ggdG8ga2VlcCB5b3VyCisgICAgICAgICAgICAgICAgY29kZSBzZXBhcmF0ZSBmcm9tIHRoZSBnZW5lcmFsIG1ldGFkYXRhIHVzZWQgYnkgQml0QmFrZS4KKyAgICAgICAgICAgICAgICBUaHVzLCB0aGlzIGV4YW1wbGUgY3JlYXRlcyBhbmQgdXNlcyBhIGxheWVyIGNhbGxlZCAibXlsYXllciIuCisgICAgICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gZmluZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGFkZGluZyBhIGxheWVyIGF0CisgICAgICAgICAgICAgICAgICAgIDx1bGluayB1cmw9J2h0dHA6Ly9oYW1iZWRkZWQub3JnL2Jsb2cvMjAxMi8xMS8yNC9mcm9tLWJpdGJha2UtaGVsbG8td29ybGQtdG8tYW4taW1hZ2UvI2FkZGluZy1hbi1leGFtcGxlLWxheWVyJz48L3VsaW5rPi4KKyAgICAgICAgICAgICAgICA8L25vdGU+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPk1pbmltYWxseSwgeW91IG5lZWQgYSByZWNpcGUgZmlsZSBhbmQgYSBsYXllciBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAgICAgZmlsZSBpbiB5b3VyIGxheWVyLgorICAgICAgICAgICAgICAgIFRoZSBjb25maWd1cmF0aW9uIGZpbGUgbmVlZHMgdG8gYmUgaW4gdGhlIDxmaWxlbmFtZT5jb25mPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICBkaXJlY3RvcnkgaW5zaWRlIHRoZSBsYXllci4KKyAgICAgICAgICAgICAgICBVc2UgdGhlc2UgY29tbWFuZHMgdG8gc2V0IHVwIHRoZSBsYXllciBhbmQgdGhlIDxmaWxlbmFtZT5jb25mPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICBkaXJlY3Rvcnk6CisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICAkIGNkICRIT01FCisgICAgICQgbWtkaXIgbXlsYXllcgorICAgICAkIGNkIG15bGF5ZXIKKyAgICAgJCBta2RpciBjb25mCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIE1vdmUgdG8gdGhlIDxmaWxlbmFtZT5jb25mPC9maWxlbmFtZT4gZGlyZWN0b3J5IGFuZCBjcmVhdGUgYQorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5sYXllci5jb25mPC9maWxlbmFtZT4gZmlsZSB0aGF0IGhhcyB0aGUgZm9sbG93aW5nOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgQkJQQVRIIC49ICI6JHs8bGluayBsaW5rZW5kPSd2YXItTEFZRVJESVInPkxBWUVSRElSPC9saW5rPn0iCisKKyAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUJCRklMRVMnPkJCRklMRVM8L2xpbms+ICs9ICIke0xBWUVSRElSfS8qLmJiIgorCisgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1CQkZJTEVfQ09MTEVDVElPTlMnPkJCRklMRV9DT0xMRUNUSU9OUzwvbGluaz4gKz0gIm15bGF5ZXIiCisgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1CQkZJTEVfUEFUVEVSTic+QkJGSUxFX1BBVFRFUk5fbXlsYXllcjwvbGluaz4gOj0gIl4ke0xBWUVSRElSfS8iCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIEZvciBpbmZvcm1hdGlvbiBvbiB0aGVzZSB2YXJpYWJsZXMsIGNsaWNrIHRoZSBsaW5rcworICAgICAgICAgICAgICAgIHRvIGdvIHRvIHRoZSBkZWZpbml0aW9ucyBpbiB0aGUgZ2xvc3NhcnkuPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPllvdSBuZWVkIHRvIGNyZWF0ZSB0aGUgcmVjaXBlIGZpbGUgbmV4dC4KKyAgICAgICAgICAgICAgICBJbnNpZGUgeW91ciBsYXllciBhdCB0aGUgdG9wLWxldmVsLCB1c2UgYW4gZWRpdG9yIGFuZCBjcmVhdGUKKyAgICAgICAgICAgICAgICBhIHJlY2lwZSBmaWxlIG5hbWVkIDxmaWxlbmFtZT5wcmludGhlbGxvLmJiPC9maWxlbmFtZT4gdGhhdAorICAgICAgICAgICAgICAgIGhhcyB0aGUgZm9sbG93aW5nOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgPGxpbmsgbGlua2VuZD0ndmFyLURFU0NSSVBUSU9OJz5ERVNDUklQVElPTjwvbGluaz4gPSAiUHJpbnRzIEhlbGxvIFdvcmxkIgorICAgICA8bGluayBsaW5rZW5kPSd2YXItUE4nPlBOPC9saW5rPiA9ICdwcmludGhlbGxvJworICAgICA8bGluayBsaW5rZW5kPSd2YXItUFYnPlBWPC9saW5rPiA9ICcxJworCisgICAgIHB5dGhvbiBkb19idWlsZCgpIHsKKyAgICAgICAgYmIucGxhaW4oIioqKioqKioqKioqKioqKioqKioqIik7CisgICAgICAgIGJiLnBsYWluKCIqICAgICAgICAgICAgICAgICAgKiIpOworICAgICAgICBiYi5wbGFpbigiKiAgSGVsbG8sIFdvcmxkISAgICoiKTsKKyAgICAgICAgYmIucGxhaW4oIiogICAgICAgICAgICAgICAgICAqIik7CisgICAgICAgIGJiLnBsYWluKCIqKioqKioqKioqKioqKioqKioqKiIpOworICAgICB9CisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIFRoZSByZWNpcGUgZmlsZSBzaW1wbHkgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBvZiB0aGUKKyAgICAgICAgICAgICAgICByZWNpcGUsIHRoZSBuYW1lLCB2ZXJzaW9uLCBhbmQgdGhlIDxmaWxlbmFtZT5kb19idWlsZDwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgdGFzaywgd2hpY2ggcHJpbnRzIG91dCAiSGVsbG8gV29ybGQiIHRvIHRoZSBjb25zb2xlLgorICAgICAgICAgICAgICAgIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZXNlIHZhcmlhYmxlcywgZm9sbG93IHRoZSBsaW5rcworICAgICAgICAgICAgICAgIHRvIHRoZSBnbG9zc2FyeS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+UnVuIEJpdGJha2UgV2l0aCBhIFRhcmdldDo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIE5vdyB0aGF0IGEgQml0QmFrZSB0YXJnZXQgZXhpc3RzLCBydW4gdGhlIGNvbW1hbmQgYW5kIHByb3ZpZGUKKyAgICAgICAgICAgICAgICB0aGF0IHRhcmdldDoKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgICQgY2QgJEhPTUUvaGVsbG8KKyAgICAgJCBiaXRiYWtlIHByaW50aGVsbG8KKyAgICAgRVJST1I6IG5vIHJlY2lwZSBmaWxlcyB0byBidWlsZCwgY2hlY2sgeW91ciBCQlBBVEggYW5kIEJCRklMRVM/CisKKyAgICAgU3VtbWFyeTogVGhlcmUgd2FzIDEgRVJST1IgbWVzc2FnZSBzaG93biwgcmV0dXJuaW5nIGEgbm9uLXplcm8gZXhpdCBjb2RlLgorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICBXZSBoYXZlIGNyZWF0ZWQgdGhlIGxheWVyIHdpdGggdGhlIHJlY2lwZSBhbmQgdGhlIGxheWVyCisgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBmaWxlIGJ1dCBpdCBzdGlsbCBzZWVtcyB0aGF0IEJpdEJha2UgY2Fubm90CisgICAgICAgICAgICAgICAgZmluZCB0aGUgcmVjaXBlLgorICAgICAgICAgICAgICAgIEJpdEJha2UgbmVlZHMgYSA8ZmlsZW5hbWU+Y29uZi9iYmxheWVycy5jb25mPC9maWxlbmFtZT4gdGhhdAorICAgICAgICAgICAgICAgIGxpc3RzIHRoZSBsYXllcnMgZm9yIHRoZSBwcm9qZWN0LgorICAgICAgICAgICAgICAgIFdpdGhvdXQgdGhpcyBmaWxlLCBCaXRCYWtlIGNhbm5vdCBmaW5kIHRoZSByZWNpcGUuCisgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPkNyZWF0aW5nIDxmaWxlbmFtZT5jb25mL2JibGF5ZXJzLmNvbmY8L2ZpbGVuYW1lPjo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIEJpdEJha2UgdXNlcyB0aGUgPGZpbGVuYW1lPmNvbmYvYmJsYXllcnMuY29uZjwvZmlsZW5hbWU+IGZpbGUKKyAgICAgICAgICAgICAgICB0byBsb2NhdGUgbGF5ZXJzIG5lZWRlZCBmb3IgdGhlIHByb2plY3QuCisgICAgICAgICAgICAgICAgVGhpcyBmaWxlIG11c3QgcmVzaWRlIGluIHRoZSA8ZmlsZW5hbWU+Y29uZjwvZmlsZW5hbWU+IGRpcmVjdG9yeQorICAgICAgICAgICAgICAgIG9mIHRoZSBwcm9qZWN0IChpLmUuIDxmaWxlbmFtZT5oZWxsby9jb25mPC9maWxlbmFtZT4gZm9yIHRoaXMKKyAgICAgICAgICAgICAgICBleGFtcGxlKS48L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+U2V0IHlvdXIgd29ya2luZyBkaXJlY3RvcnkgdG8gdGhlIDxmaWxlbmFtZT5oZWxsby9jb25mPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICBkaXJlY3RvcnkgYW5kIHRoZW4gY3JlYXRlIHRoZSA8ZmlsZW5hbWU+YmJsYXllcnMuY29uZjwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgZmlsZSBzbyB0aGF0IGl0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmc6CisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBCQkxBWUVSUyA/PSAiIFwKKyAgICAgICAvaG9tZS8mbHQ7eW91Jmd0Oy9teWxheWVyIFwKKyAgICAgICAiCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIFlvdSBuZWVkIHRvIHByb3ZpZGUgeW91ciBvd24gaW5mb3JtYXRpb24gZm9yCisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPnlvdTwvZmlsZW5hbWU+IGluIHRoZSBmaWxlLgorICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz5SdW4gQml0YmFrZSBXaXRoIGEgVGFyZ2V0OjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgTm93IHRoYXQgeW91IGhhdmUgc3VwcGxpZWQgdGhlIDxmaWxlbmFtZT5iYmxheWVycy5jb25mPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICBmaWxlLCBydW4gdGhlIDxmaWxlbmFtZT5iaXRiYWtlPC9maWxlbmFtZT4gY29tbWFuZCBhbmQgcHJvdmlkZQorICAgICAgICAgICAgICAgIHRoZSB0YXJnZXQ6CisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICAkIGJpdGJha2UgcHJpbnRoZWxsbworICAgICBQYXJzaW5nIHJlY2lwZXM6IDEwMCUgfCMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyN8CisgICAgIFRpbWU6IDAwOjAwOjAwCisgICAgIFBhcnNpbmcgb2YgMSAuYmIgZmlsZXMgY29tcGxldGUgKDAgY2FjaGVkLCAxIHBhcnNlZCkuIDEgdGFyZ2V0cywgMCBza2lwcGVkLCAwIG1hc2tlZCwgMCBlcnJvcnMuCisgICAgIE5PVEU6IFJlc29sdmluZyBhbnkgbWlzc2luZyB0YXNrIHF1ZXVlIGRlcGVuZGVuY2llcworICAgICBOT1RFOiBQcmVwYXJpbmcgUnVuUXVldWUKKyAgICAgTk9URTogRXhlY3V0aW5nIFJ1blF1ZXVlIFRhc2tzCisgICAgICoqKioqKioqKioqKioqKioqKioqCisgICAgICogICAgICAgICAgICAgICAgICAqCisgICAgICogIEhlbGxvLCBXb3JsZCEgICAqCisgICAgICogICAgICAgICAgICAgICAgICAqCisgICAgICoqKioqKioqKioqKioqKioqKioqCisgICAgIE5PVEU6IFRhc2tzIFN1bW1hcnk6IEF0dGVtcHRlZCAxIHRhc2tzIG9mIHdoaWNoIDAgZGlkbid0IG5lZWQgdG8gYmUgcmVydW4gYW5kIGFsbCBzdWNjZWVkZWQuCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIEJpdEJha2UgZmluZHMgdGhlIDxmaWxlbmFtZT5wcmludGhlbGxvPC9maWxlbmFtZT4gcmVjaXBlIGFuZAorICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWxseSBydW5zIHRoZSB0YXNrLgorICAgICAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgICAgICBBZnRlciB0aGUgZmlyc3QgZXhlY3V0aW9uLCByZS1ydW5uaW5nCisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5iaXRiYWtlIHByaW50aGVsbG88L2ZpbGVuYW1lPiBhZ2FpbiB3aWxsIG5vdAorICAgICAgICAgICAgICAgICAgICByZXN1bHQgaW4gYSBCaXRCYWtlIHJ1biB0aGF0IHByaW50cyB0aGUgc2FtZSBjb25zb2xlCisgICAgICAgICAgICAgICAgICAgIG91dHB1dC4KKyAgICAgICAgICAgICAgICAgICAgVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IHRoZSBmaXJzdCB0aW1lIHRoZQorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+cHJpbnRoZWxsby5iYjwvZmlsZW5hbWU+IHJlY2lwZSdzCisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5kb19idWlsZDwvZmlsZW5hbWU+IHRhc2sgZXhlY3V0ZXMKKyAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bGx5LCBCaXRCYWtlIHdyaXRlcyBhIHN0YW1wIGZpbGUgZm9yIHRoZSB0YXNrLgorICAgICAgICAgICAgICAgICAgICBUaHVzLCB0aGUgbmV4dCB0aW1lIHlvdSBhdHRlbXB0IHRvIHJ1biB0aGUgdGFzaworICAgICAgICAgICAgICAgICAgICB1c2luZyB0aGF0IHNhbWUgPGZpbGVuYW1lPmJpdGJha2U8L2ZpbGVuYW1lPiBjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICBCaXRCYWtlIG5vdGljZXMgdGhlIHN0YW1wIGFuZCB0aGVyZWZvcmUgZGV0ZXJtaW5lcworICAgICAgICAgICAgICAgICAgICB0aGF0IHRoZSB0YXNrIGRvZXMgbm90IG5lZWQgdG8gYmUgcmUtcnVuLgorICAgICAgICAgICAgICAgICAgICBJZiB5b3UgZGVsZXRlIHRoZSA8ZmlsZW5hbWU+dG1wPC9maWxlbmFtZT4gZGlyZWN0b3J5CisgICAgICAgICAgICAgICAgICAgIG9yIHJ1biA8ZmlsZW5hbWU+Yml0YmFrZSAtYyBjbGVhbiBwcmludGhlbGxvPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgYW5kIHRoZW4gcmUtcnVuIHRoZSBidWlsZCwgdGhlICJIZWxsbywgV29ybGQhIiBtZXNzYWdlIHdpbGwKKyAgICAgICAgICAgICAgICAgICAgYmUgcHJpbnRlZCBhZ2Fpbi4KKyAgICAgICAgICAgICAgICA8L25vdGU+CisgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgIDwvb3JkZXJlZGxpc3Q+CisgICAgPC9zZWN0aW9uPgorPC9hcHBlbmRpeD4KZGlmZiAtLWdpdCBhL2JpdGJha2UvZG9jL2JpdGJha2UtdXNlci1tYW51YWwvYml0YmFrZS11c2VyLW1hbnVhbC1pbnRyby54bWwgYi9iaXRiYWtlL2RvYy9iaXRiYWtlLXVzZXItbWFudWFsL2JpdGJha2UtdXNlci1tYW51YWwtaW50cm8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxODg2NTUKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2RvYy9iaXRiYWtlLXVzZXItbWFudWFsL2JpdGJha2UtdXNlci1tYW51YWwtaW50cm8ueG1sCkBAIC0wLDAgKzEsNjg1IEBACis8IURPQ1RZUEUgY2hhcHRlciBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuMi8vRU4iCisgICAgImh0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvZG9jYm9vay94bWwvNC4yL2RvY2Jvb2t4LmR0ZCI+CisKKzxjaGFwdGVyIGlkPSJiaXRiYWtlLXVzZXItbWFudWFsLWludHJvIj4KKyAgICA8dGl0bGU+T3ZlcnZpZXc8L3RpdGxlPgorCisgICAgPHBhcmE+CisgICAgICAgIFdlbGNvbWUgdG8gdGhlIEJpdEJha2UgVXNlciBNYW51YWwuCisgICAgICAgIFRoaXMgbWFudWFsIHByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIHRoZSBCaXRCYWtlIHRvb2wuCisgICAgICAgIFRoZSBpbmZvcm1hdGlvbiBhdHRlbXB0cyB0byBiZSBhcyBpbmRlcGVuZGVudCBhcyBwb3NzaWJsZSByZWdhcmRpbmcKKyAgICAgICAgc3lzdGVtcyB0aGF0IHVzZSBCaXRCYWtlLCBzdWNoIGFzIE9wZW5FbWJlZGRlZCBhbmQgdGhlCisgICAgICAgIFlvY3RvIFByb2plY3QuCisgICAgICAgIEluIHNvbWUgY2FzZXMsIHNjZW5hcmlvcyBvciBleGFtcGxlcyB3aXRoaW4gdGhlIGNvbnRleHQgb2YKKyAgICAgICAgYSBidWlsZCBzeXN0ZW0gYXJlIHVzZWQgaW4gdGhlIG1hbnVhbCB0byBoZWxwIHdpdGggdW5kZXJzdGFuZGluZy4KKyAgICAgICAgRm9yIHRoZXNlIGNhc2VzLCB0aGUgbWFudWFsIGNsZWFybHkgc3RhdGVzIHRoZSBjb250ZXh0LgorICAgIDwvcGFyYT4KKworICAgIDxzZWN0aW9uIGlkPSJpbnRybyI+CisgICAgICAgIDx0aXRsZT5JbnRyb2R1Y3Rpb248L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgRnVuZGFtZW50YWxseSwgQml0QmFrZSBpcyBhIGdlbmVyaWMgdGFzayBleGVjdXRpb24KKyAgICAgICAgICAgIGVuZ2luZSB0aGF0IGFsbG93cyBzaGVsbCBhbmQgUHl0aG9uIHRhc2tzIHRvIGJlIHJ1bgorICAgICAgICAgICAgZWZmaWNpZW50bHkgYW5kIGluIHBhcmFsbGVsIHdoaWxlIHdvcmtpbmcgd2l0aGluCisgICAgICAgICAgICBjb21wbGV4IGludGVyLXRhc2sgZGVwZW5kZW5jeSBjb25zdHJhaW50cy4KKyAgICAgICAgICAgIE9uZSBvZiBCaXRCYWtlJ3MgbWFpbiB1c2VycywgT3BlbkVtYmVkZGVkLCB0YWtlcyB0aGlzIGNvcmUKKyAgICAgICAgICAgIGFuZCBidWlsZHMgZW1iZWRkZWQgTGludXggc29mdHdhcmUgc3RhY2tzIHVzaW5nCisgICAgICAgICAgICBhIHRhc2stb3JpZW50ZWQgYXBwcm9hY2guCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIENvbmNlcHR1YWxseSwgQml0QmFrZSBpcyBzaW1pbGFyIHRvIEdOVSBNYWtlIGluCisgICAgICAgICAgICBzb21lIHJlZ2FyZHMgYnV0IGhhcyBzaWduaWZpY2FudCBkaWZmZXJlbmNlczoKKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICBCaXRCYWtlIGV4ZWN1dGVzIHRhc2tzIGFjY29yZGluZyB0byBwcm92aWRlZAorICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSB0aGF0IGJ1aWxkcyB1cCB0aGUgdGFza3MuCisgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhIGlzIHN0b3JlZCBpbiByZWNpcGUgKDxmaWxlbmFtZT4uYmI8L2ZpbGVuYW1lPikKKyAgICAgICAgICAgICAgICAgICAgYW5kIHJlbGF0ZWQgcmVjaXBlICJhcHBlbmQiICg8ZmlsZW5hbWU+LmJiYXBwZW5kPC9maWxlbmFtZT4pCisgICAgICAgICAgICAgICAgICAgIGZpbGVzLCBjb25maWd1cmF0aW9uICg8ZmlsZW5hbWU+LmNvbmY8L2ZpbGVuYW1lPikgYW5kCisgICAgICAgICAgICAgICAgICAgIHVuZGVybHlpbmcgaW5jbHVkZSAoPGZpbGVuYW1lPi5pbmM8L2ZpbGVuYW1lPikgZmlsZXMsIGFuZAorICAgICAgICAgICAgICAgICAgICBpbiBjbGFzcyAoPGZpbGVuYW1lPi5iYmNsYXNzPC9maWxlbmFtZT4pIGZpbGVzLgorICAgICAgICAgICAgICAgICAgICBUaGUgbWV0YWRhdGEgcHJvdmlkZXMKKyAgICAgICAgICAgICAgICAgICAgQml0QmFrZSB3aXRoIGluc3RydWN0aW9ucyBvbiB3aGF0IHRhc2tzIHRvIHJ1biBhbmQKKyAgICAgICAgICAgICAgICAgICAgdGhlIGRlcGVuZGVuY2llcyBiZXR3ZWVuIHRob3NlIHRhc2tzLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEJpdEJha2UgaW5jbHVkZXMgYSBmZXRjaGVyIGxpYnJhcnkgZm9yIG9idGFpbmluZyBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgY29kZSBmcm9tIHZhcmlvdXMgcGxhY2VzIHN1Y2ggYXMgbG9jYWwgZmlsZXMsIHNvdXJjZSBjb250cm9sCisgICAgICAgICAgICAgICAgICAgIHN5c3RlbXMsIG9yIHdlYnNpdGVzLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFRoZSBpbnN0cnVjdGlvbnMgZm9yIGVhY2ggdW5pdCB0byBiZSBidWlsdCAoZS5nLiBhIHBpZWNlCisgICAgICAgICAgICAgICAgICAgIG9mIHNvZnR3YXJlKSBhcmUga25vd24gYXMgInJlY2lwZSIgZmlsZXMgYW5kCisgICAgICAgICAgICAgICAgICAgIGNvbnRhaW4gYWxsIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdW5pdAorICAgICAgICAgICAgICAgICAgICAoZGVwZW5kZW5jaWVzLCBzb3VyY2UgZmlsZSBsb2NhdGlvbnMsIGNoZWNrc3VtcywgZGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgICAgICAgYW5kIHNvIG9uKS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICBCaXRCYWtlIGluY2x1ZGVzIGEgY2xpZW50L3NlcnZlciBhYnN0cmFjdGlvbiBhbmQgY2FuCisgICAgICAgICAgICAgICAgICAgIGJlIHVzZWQgZnJvbSBhIGNvbW1hbmQgbGluZSBvciB1c2VkIGFzIGEgc2VydmljZSBvdmVyCisgICAgICAgICAgICAgICAgICAgIFhNTC1SUEMgYW5kIGhhcyBzZXZlcmFsIGRpZmZlcmVudCB1c2VyIGludGVyZmFjZXMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiBpZD0iaGlzdG9yeS1hbmQtZ29hbHMiPgorICAgICAgICA8dGl0bGU+SGlzdG9yeSBhbmQgR29hbHM8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQml0QmFrZSB3YXMgb3JpZ2luYWxseSBhIHBhcnQgb2YgdGhlIE9wZW5FbWJlZGRlZCBwcm9qZWN0LgorICAgICAgICAgICAgSXQgd2FzIGluc3BpcmVkIGJ5IHRoZSBQb3J0YWdlIHBhY2thZ2UgbWFuYWdlbWVudCBzeXN0ZW0KKyAgICAgICAgICAgIHVzZWQgYnkgdGhlIEdlbnRvbyBMaW51eCBkaXN0cmlidXRpb24uCisgICAgICAgICAgICBPbiBEZWNlbWJlciA3LCAyMDA0LCBPcGVuRW1iZWRkZWQgcHJvamVjdCB0ZWFtIG1lbWJlcgorICAgICAgICAgICAgQ2hyaXMgTGFyc29uIHNwbGl0IHRoZSBwcm9qZWN0IGludG8gdHdvIGRpc3RpbmN0IHBpZWNlczoKKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPkJpdEJha2UsIGEgZ2VuZXJpYyB0YXNrIGV4ZWN1dG9yPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPk9wZW5FbWJlZGRlZCwgYSBtZXRhZGF0YSBzZXQgdXRpbGl6ZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgQml0QmFrZTwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICBUb2RheSwgQml0QmFrZSBpcyB0aGUgcHJpbWFyeSBiYXNpcyBvZiB0aGUKKyAgICAgICAgICAgIDx1bGluayB1cmw9Imh0dHA6Ly93d3cub3BlbmVtYmVkZGVkLm9yZy8iPk9wZW5FbWJlZGRlZDwvdWxpbms+CisgICAgICAgICAgICBwcm9qZWN0LCB3aGljaCBpcyBiZWluZyB1c2VkIHRvIGJ1aWxkIGFuZCBtYWludGFpbiBMaW51eAorICAgICAgICAgICAgZGlzdHJpYnV0aW9ucyBzdWNoIGFzIHRoZQorICAgICAgICAgICAgPHVsaW5rIHVybD0naHR0cDovL3d3dy5hbmdzdHJvbS1kaXN0cmlidXRpb24ub3JnLyc+QW5nc3Ryb20gRGlzdHJpYnV0aW9uPC91bGluaz4sCisgICAgICAgICAgICBhbmQgd2hpY2ggaXMgYWxzbyBiZWluZyB1c2VkIGFzIHRoZSBidWlsZCB0b29sIGZvciBMaW51eCBwcm9qZWN0cworICAgICAgICAgICAgc3VjaCBhcyB0aGUKKyAgICAgICAgICAgIDx1bGluayB1cmw9J2h0dHA6Ly93d3cueW9jdG9wcm9qZWN0Lm9yZyc+WW9jdG8gUHJvamVjdDwvdWxpbms+LgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBQcmlvciB0byBCaXRCYWtlLCBubyBvdGhlciBidWlsZCB0b29sIGFkZXF1YXRlbHkgbWV0IHRoZSBuZWVkcyBvZgorICAgICAgICAgICAgYW4gYXNwaXJpbmcgZW1iZWRkZWQgTGludXggZGlzdHJpYnV0aW9uLgorICAgICAgICAgICAgQWxsIG9mIHRoZSBidWlsZCBzeXN0ZW1zIHVzZWQgYnkgdHJhZGl0aW9uYWwgZGVza3RvcCBMaW51eAorICAgICAgICAgICAgZGlzdHJpYnV0aW9ucyBsYWNrZWQgaW1wb3J0YW50IGZ1bmN0aW9uYWxpdHksIGFuZCBub25lIG9mIHRoZQorICAgICAgICAgICAgYWQgaG9jIEJ1aWxkcm9vdC1iYXNlZCBzeXN0ZW1zLCBwcmV2YWxlbnQgaW4gdGhlCisgICAgICAgICAgICBlbWJlZGRlZCBzcGFjZSwgd2VyZSBzY2FsYWJsZSBvciBtYWludGFpbmFibGUuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFNvbWUgaW1wb3J0YW50IG9yaWdpbmFsIGdvYWxzIGZvciBCaXRCYWtlIHdlcmU6CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgSGFuZGxlIGNyb3NzLWNvbXBpbGF0aW9uLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEhhbmRsZSBpbnRlci1wYWNrYWdlIGRlcGVuZGVuY2llcyAoYnVpbGQgdGltZSBvbgorICAgICAgICAgICAgICAgICAgICB0YXJnZXQgYXJjaGl0ZWN0dXJlLCBidWlsZCB0aW1lIG9uIG5hdGl2ZQorICAgICAgICAgICAgICAgICAgICBhcmNoaXRlY3R1cmUsIGFuZCBydW50aW1lKS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICBTdXBwb3J0IHJ1bm5pbmcgYW55IG51bWJlciBvZiB0YXNrcyB3aXRoaW4gYSBnaXZlbgorICAgICAgICAgICAgICAgICAgICBwYWNrYWdlLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgZmV0Y2hpbmcKKyAgICAgICAgICAgICAgICAgICAgdXBzdHJlYW0gc291cmNlcywgdW5wYWNraW5nIHRoZW0sIHBhdGNoaW5nIHRoZW0sCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyaW5nIHRoZW0sIGFuZCBzbyBmb3J0aC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICBCZSBMaW51eCBkaXN0cmlidXRpb24gYWdub3N0aWMgZm9yIGJvdGggYnVpbGQgYW5kCisgICAgICAgICAgICAgICAgICAgIHRhcmdldCBzeXN0ZW1zLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEJlIGFyY2hpdGVjdHVyZSBhZ25vc3RpYy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICBTdXBwb3J0IG11bHRpcGxlIGJ1aWxkIGFuZCB0YXJnZXQgb3BlcmF0aW5nIHN5c3RlbXMKKyAgICAgICAgICAgICAgICAgICAgKGUuZy4gQ3lnd2luLCB0aGUgQlNEcywgYW5kIHNvIGZvcnRoKS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICBCZSBzZWxmIGNvbnRhaW5lZCwgcmF0aGVyIHRoYW4gdGlnaHRseQorICAgICAgICAgICAgICAgICAgICBpbnRlZ3JhdGVkIGludG8gdGhlIGJ1aWxkIG1hY2hpbmUncyByb290CisgICAgICAgICAgICAgICAgICAgIGZpbGVzeXN0ZW0uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgSGFuZGxlIGNvbmRpdGlvbmFsIG1ldGFkYXRhIG9uIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLAorICAgICAgICAgICAgICAgICAgICBvcGVyYXRpbmcgc3lzdGVtLCBkaXN0cmlidXRpb24sIGFuZCBtYWNoaW5lLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEJlIGVhc3kgdG8gdXNlIHRoZSB0b29scyB0byBzdXBwbHkgbG9jYWwgbWV0YWRhdGEgYW5kIHBhY2thZ2VzCisgICAgICAgICAgICAgICAgICAgIGFnYWluc3Qgd2hpY2ggdG8gb3BlcmF0ZS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICBCZSBlYXN5IHRvIHVzZSBCaXRCYWtlIHRvIGNvbGxhYm9yYXRlIGJldHdlZW4gbXVsdGlwbGUKKyAgICAgICAgICAgICAgICAgICAgcHJvamVjdHMgZm9yIHRoZWlyIGJ1aWxkcy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICBQcm92aWRlIGFuIGluaGVyaXRhbmNlIG1lY2hhbmlzbSB0byBzaGFyZQorICAgICAgICAgICAgICAgICAgICBjb21tb24gbWV0YWRhdGEgYmV0d2VlbiBtYW55IHBhY2thZ2VzLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgT3ZlciB0aW1lIGl0IGJlY2FtZSBhcHBhcmVudCB0aGF0IHNvbWUgZnVydGhlciByZXF1aXJlbWVudHMKKyAgICAgICAgICAgIHdlcmUgbmVjZXNzYXJ5OgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEhhbmRsZSB2YXJpYW50cyBvZiBhIGJhc2UgcmVjaXBlIChlLmcuIG5hdGl2ZSwgc2RrLAorICAgICAgICAgICAgICAgICAgICBhbmQgbXVsdGlsaWIpLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFNwbGl0IG1ldGFkYXRhIGludG8gbGF5ZXJzIGFuZCBhbGxvdyBsYXllcnMKKyAgICAgICAgICAgICAgICAgICAgdG8gZW5oYW5jZSBvciBvdmVycmlkZSBvdGhlciBsYXllcnMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgQWxsb3cgcmVwcmVzZW50YXRpb24gb2YgYSBnaXZlbiBzZXQgb2YgaW5wdXQgdmFyaWFibGVzCisgICAgICAgICAgICAgICAgICAgIHRvIGEgdGFzayBhcyBhIGNoZWNrc3VtLgorICAgICAgICAgICAgICAgICAgICBCYXNlZCBvbiB0aGF0IGNoZWNrc3VtLCBhbGxvdyBhY2NlbGVyYXRpb24gb2YgYnVpbGRzCisgICAgICAgICAgICAgICAgICAgIHdpdGggcHJlYnVpbHQgY29tcG9uZW50cy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIEJpdEJha2Ugc2F0aXNmaWVzIGFsbCB0aGUgb3JpZ2luYWwgcmVxdWlyZW1lbnRzIGFuZCBtYW55IG1vcmUKKyAgICAgICAgICAgIHdpdGggZXh0ZW5zaW9ucyBiZWluZyBtYWRlIHRvIHRoZSBiYXNpYyBmdW5jdGlvbmFsaXR5IHRvCisgICAgICAgICAgICByZWZsZWN0IHRoZSBhZGRpdGlvbmFsIHJlcXVpcmVtZW50cy4KKyAgICAgICAgICAgIEZsZXhpYmlsaXR5IGFuZCBwb3dlciBoYXZlIGFsd2F5cyBiZWVuIHRoZSBwcmlvcml0aWVzLgorICAgICAgICAgICAgQml0QmFrZSBpcyBoaWdobHkgZXh0ZW5zaWJsZSBhbmQgc3VwcG9ydHMgZW1iZWRkZWQgUHl0aG9uIGNvZGUgYW5kCisgICAgICAgICAgICBleGVjdXRpb24gb2YgYW55IGFyYml0cmFyeSB0YXNrcy4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIGlkPSJDb25jZXB0cyI+CisgICAgICAgIDx0aXRsZT5Db25jZXB0czwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBCaXRCYWtlIGlzIGEgcHJvZ3JhbSB3cml0dGVuIGluIHRoZSBQeXRob24gbGFuZ3VhZ2UuCisgICAgICAgICAgICBBdCB0aGUgaGlnaGVzdCBsZXZlbCwgQml0QmFrZSBpbnRlcnByZXRzIG1ldGFkYXRhLCBkZWNpZGVzCisgICAgICAgICAgICB3aGF0IHRhc2tzIGFyZSByZXF1aXJlZCB0byBydW4sIGFuZCBleGVjdXRlcyB0aG9zZSB0YXNrcy4KKyAgICAgICAgICAgIFNpbWlsYXIgdG8gR05VIE1ha2UsIEJpdEJha2UgY29udHJvbHMgaG93IHNvZnR3YXJlIGlzCisgICAgICAgICAgICBidWlsdC4KKyAgICAgICAgICAgIEdOVSBNYWtlIGFjaGlldmVzIGl0cyBjb250cm9sIHRocm91Z2ggIm1ha2VmaWxlcyIsIHdoaWxlCisgICAgICAgICAgICBCaXRCYWtlIHVzZXMgInJlY2lwZXMiLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBCaXRCYWtlIGV4dGVuZHMgdGhlIGNhcGFiaWxpdGllcyBvZiBhIHNpbXBsZQorICAgICAgICAgICAgdG9vbCBsaWtlIEdOVSBNYWtlIGJ5IGFsbG93aW5nIGZvciB0aGUgZGVmaW5pdGlvbiBvZiBtdWNoIG1vcmUKKyAgICAgICAgICAgIGNvbXBsZXggdGFza3MsIHN1Y2ggYXMgYXNzZW1ibGluZyBlbnRpcmUgZW1iZWRkZWQgTGludXgKKyAgICAgICAgICAgIGRpc3RyaWJ1dGlvbnMuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSByZW1haW5kZXIgb2YgdGhpcyBzZWN0aW9uIGludHJvZHVjZXMgc2V2ZXJhbCBjb25jZXB0cworICAgICAgICAgICAgdGhhdCBzaG91bGQgYmUgdW5kZXJzdG9vZCBpbiBvcmRlciB0byBiZXR0ZXIgbGV2ZXJhZ2UKKyAgICAgICAgICAgIHRoZSBwb3dlciBvZiBCaXRCYWtlLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHNlY3Rpb24gaWQ9J3JlY2lwZXMnPgorICAgICAgICAgICAgPHRpdGxlPlJlY2lwZXM8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBCaXRCYWtlIFJlY2lwZXMsIHdoaWNoIGFyZSBkZW5vdGVkIGJ5IHRoZSBmaWxlIGV4dGVuc2lvbgorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT4uYmI8L2ZpbGVuYW1lPiwgYXJlIHRoZSBtb3N0IGJhc2ljIG1ldGFkYXRhIGZpbGVzLgorICAgICAgICAgICAgICAgIFRoZXNlIHJlY2lwZSBmaWxlcyBwcm92aWRlIEJpdEJha2Ugd2l0aCB0aGUgZm9sbG93aW5nOgorICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5EZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2UgKGF1dGhvciwgaG9tZXBhZ2UsIGxpY2Vuc2UsIGFuZCBzbyBvbik8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPlRoZSB2ZXJzaW9uIG9mIHRoZSByZWNpcGU8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPkV4aXN0aW5nIGRlcGVuZGVuY2llcyAoYm90aCBidWlsZAorICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHJ1bnRpbWUgZGVwZW5kZW5jaWVzKTwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+V2hlcmUgdGhlIHNvdXJjZSBjb2RlIHJlc2lkZXMgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICBob3cgdG8gZmV0Y2ggaXQ8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPldoZXRoZXIgdGhlIHNvdXJjZSBjb2RlIHJlcXVpcmVzCisgICAgICAgICAgICAgICAgICAgICAgICBhbnkgcGF0Y2hlcywgd2hlcmUgdG8gZmluZCB0aGVtLCBhbmQgaG93IHRvIGFwcGx5CisgICAgICAgICAgICAgICAgICAgICAgICB0aGVtPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5Ib3cgdG8gY29uZmlndXJlIGFuZCBjb21waWxlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlIGNvZGU8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPldoZXJlIG9uIHRoZSB0YXJnZXQgbWFjaGluZSB0byBpbnN0YWxsIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZSBvciBwYWNrYWdlcyBjcmVhdGVkPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFdpdGhpbiB0aGUgY29udGV4dCBvZiBCaXRCYWtlLCBvciBhbnkgcHJvamVjdCB1dGlsaXppbmcgQml0QmFrZQorICAgICAgICAgICAgICAgIGFzIGl0cyBidWlsZCBzeXN0ZW0sIGZpbGVzIHdpdGggdGhlIDxmaWxlbmFtZT4uYmI8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgIGV4dGVuc2lvbiBhcmUgcmVmZXJyZWQgdG8gYXMgcmVjaXBlcy4KKyAgICAgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICAgICAgVGhlIHRlcm0gInBhY2thZ2UiIGlzIGFsc28gY29tbW9ubHkgdXNlZCB0byBkZXNjcmliZSByZWNpcGVzLgorICAgICAgICAgICAgICAgICAgICBIb3dldmVyLCBzaW5jZSB0aGUgc2FtZSB3b3JkIGlzIHVzZWQgdG8gZGVzY3JpYmUgcGFja2FnZWQKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGZyb20gYSBwcm9qZWN0LCBpdCBpcyBiZXN0IHRvIG1haW50YWluIGEgc2luZ2xlCisgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aXZlIHRlcm0gLSAicmVjaXBlcyIuCisgICAgICAgICAgICAgICAgICAgIFB1dCBhbm90aGVyIHdheSwgYSBzaW5nbGUgInJlY2lwZSIgZmlsZSBpcyBxdWl0ZSBjYXBhYmxlCisgICAgICAgICAgICAgICAgICAgIG9mIGdlbmVyYXRpbmcgYSBudW1iZXIgb2YgcmVsYXRlZCBidXQgc2VwYXJhdGVseSBpbnN0YWxsYWJsZQorICAgICAgICAgICAgICAgICAgICAicGFja2FnZXMiLgorICAgICAgICAgICAgICAgICAgICBJbiBmYWN0LCB0aGF0IGFiaWxpdHkgaXMgZmFpcmx5IGNvbW1vbi4KKyAgICAgICAgICAgICAgICA8L25vdGU+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbiBpZD0nY29uZmlndXJhdGlvbi1maWxlcyc+CisgICAgICAgICAgICA8dGl0bGU+Q29uZmlndXJhdGlvbiBGaWxlczwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gZmlsZXMsIHdoaWNoIGFyZSBkZW5vdGVkIGJ5IHRoZQorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT4uY29uZjwvZmlsZW5hbWU+IGV4dGVuc2lvbiwgZGVmaW5lCisgICAgICAgICAgICAgICAgdmFyaW91cyBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyB0aGF0IGdvdmVybiB0aGUgcHJvamVjdCdzIGJ1aWxkCisgICAgICAgICAgICAgICAgcHJvY2Vzcy4KKyAgICAgICAgICAgICAgICBUaGVzZSBmaWxlcyBmYWxsIGludG8gc2V2ZXJhbCBhcmVhcyB0aGF0IGRlZmluZQorICAgICAgICAgICAgICAgIG1hY2hpbmUgY29uZmlndXJhdGlvbiBvcHRpb25zLCBkaXN0cmlidXRpb24gY29uZmlndXJhdGlvbgorICAgICAgICAgICAgICAgIG9wdGlvbnMsIGNvbXBpbGVyIHR1bmluZyBvcHRpb25zLCBnZW5lcmFsIGNvbW1vbgorICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gb3B0aW9ucywgYW5kIHVzZXIgY29uZmlndXJhdGlvbiBvcHRpb25zLgorICAgICAgICAgICAgICAgIFRoZSBtYWluIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyB0aGUgc2FtcGxlCisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmJpdGJha2UuY29uZjwvZmlsZW5hbWU+IGZpbGUsIHdoaWNoIGlzCisgICAgICAgICAgICAgICAgbG9jYXRlZCB3aXRoaW4gdGhlIEJpdEJha2Ugc291cmNlIHRyZWUKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+Y29uZjwvZmlsZW5hbWU+IGRpcmVjdG9yeS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uIGlkPSdjbGFzc2VzJz4KKyAgICAgICAgICAgIDx0aXRsZT5DbGFzc2VzPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQ2xhc3MgZmlsZXMsIHdoaWNoIGFyZSBkZW5vdGVkIGJ5IHRoZQorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT4uYmJjbGFzczwvZmlsZW5hbWU+IGV4dGVuc2lvbiwgY29udGFpbgorICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIHRoYXQgaXMgdXNlZnVsIHRvIHNoYXJlIGJldHdlZW4gbWV0YWRhdGEgZmlsZXMuCisgICAgICAgICAgICAgICAgVGhlIEJpdEJha2Ugc291cmNlIHRyZWUgY3VycmVudGx5IGNvbWVzIHdpdGggb25lIGNsYXNzIG1ldGFkYXRhIGZpbGUKKyAgICAgICAgICAgICAgICBjYWxsZWQgPGZpbGVuYW1lPmJhc2UuYmJjbGFzczwvZmlsZW5hbWU+LgorICAgICAgICAgICAgICAgIFlvdSBjYW4gZmluZCB0aGlzIGZpbGUgaW4gdGhlCisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmNsYXNzZXM8L2ZpbGVuYW1lPiBkaXJlY3RvcnkuCisgICAgICAgICAgICAgICAgVGhlIDxmaWxlbmFtZT5iYXNlLmJiY2xhc3M8L2ZpbGVuYW1lPiBjbGFzcyBmaWxlcyBpcyBzcGVjaWFsIHNpbmNlIGl0CisgICAgICAgICAgICAgICAgaXMgYWx3YXlzIGluY2x1ZGVkIGF1dG9tYXRpY2FsbHkgZm9yIGFsbCByZWNpcGVzCisgICAgICAgICAgICAgICAgYW5kIGNsYXNzZXMuCisgICAgICAgICAgICAgICAgVGhpcyBjbGFzcyBjb250YWlucyBkZWZpbml0aW9ucyBmb3Igc3RhbmRhcmQgYmFzaWMgdGFza3Mgc3VjaAorICAgICAgICAgICAgICAgIGFzIGZldGNoaW5nLCB1bnBhY2tpbmcsIGNvbmZpZ3VyaW5nIChlbXB0eSBieSBkZWZhdWx0KSwKKyAgICAgICAgICAgICAgICBjb21waWxpbmcgKHJ1bnMgYW55IE1ha2VmaWxlIHByZXNlbnQpLCBpbnN0YWxsaW5nIChlbXB0eSBieQorICAgICAgICAgICAgICAgIGRlZmF1bHQpIGFuZCBwYWNrYWdpbmcgKGVtcHR5IGJ5IGRlZmF1bHQpLgorICAgICAgICAgICAgICAgIFRoZXNlIHRhc2tzIGFyZSBvZnRlbiBvdmVycmlkZGVuIG9yIGV4dGVuZGVkIGJ5IG90aGVyIGNsYXNzZXMKKyAgICAgICAgICAgICAgICBhZGRlZCBkdXJpbmcgdGhlIHByb2plY3QgZGV2ZWxvcG1lbnQgcHJvY2Vzcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uIGlkPSdsYXllcnMnPgorICAgICAgICAgICAgPHRpdGxlPkxheWVyczwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIExheWVycyBhbGxvdyB5b3UgdG8gaXNvbGF0ZSBkaWZmZXJlbnQgdHlwZXMgb2YKKyAgICAgICAgICAgICAgICBjdXN0b21pemF0aW9ucyBmcm9tIGVhY2ggb3RoZXIuCisgICAgICAgICAgICAgICAgV2hpbGUgeW91IG1pZ2h0IGZpbmQgaXQgdGVtcHRpbmcgdG8ga2VlcCBldmVyeXRoaW5nIGluIG9uZSBsYXllcgorICAgICAgICAgICAgICAgIHdoZW4gd29ya2luZyBvbiBhIHNpbmdsZSBwcm9qZWN0LCB0aGUgbW9yZSBtb2R1bGFyIHlvdSBvcmdhbml6ZQorICAgICAgICAgICAgICAgIHlvdXIgbWV0YWRhdGEsIHRoZSBlYXNpZXIgaXQgaXMgdG8gY29wZSB3aXRoIGZ1dHVyZSBjaGFuZ2VzLgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUbyBpbGx1c3RyYXRlIGhvdyB5b3UgY2FuIHVzZSBsYXllcnMgdG8ga2VlcCB0aGluZ3MgbW9kdWxhciwKKyAgICAgICAgICAgICAgICBjb25zaWRlciBjdXN0b21pemF0aW9ucyB5b3UgbWlnaHQgbWFrZSB0byBzdXBwb3J0IGEgc3BlY2lmaWMgdGFyZ2V0IG1hY2hpbmUuCisgICAgICAgICAgICAgICAgVGhlc2UgdHlwZXMgb2YgY3VzdG9taXphdGlvbnMgdHlwaWNhbGx5IHJlc2lkZSBpbiBhIHNwZWNpYWwgbGF5ZXIsCisgICAgICAgICAgICAgICAgcmF0aGVyIHRoYW4gYSBnZW5lcmFsIGxheWVyLCBjYWxsZWQgYSBCb2FyZCBTdXBwb3J0IFBhY2thZ2UgKEJTUCkKKyAgICAgICAgICAgICAgICBMYXllci4KKyAgICAgICAgICAgICAgICBGdXJ0aGVybW9yZSwgdGhlIG1hY2hpbmUgY3VzdG9taXphdGlvbnMgc2hvdWxkIGJlIGlzb2xhdGVkIGZyb20KKyAgICAgICAgICAgICAgICByZWNpcGVzIGFuZCBtZXRhZGF0YSB0aGF0IHN1cHBvcnQgYSBuZXcgR1VJIGVudmlyb25tZW50LCBmb3IKKyAgICAgICAgICAgICAgICBleGFtcGxlLgorICAgICAgICAgICAgICAgIFRoaXMgc2l0dWF0aW9uIGdpdmVzIHlvdSBhIGNvdXBsZSBvZiBsYXllcnM6IG9uZSBmb3IgdGhlIG1hY2hpbmUKKyAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9ucyBhbmQgb25lIGZvciB0aGUgR1VJIGVudmlyb25tZW50LgorICAgICAgICAgICAgICAgIEl0IGlzIGltcG9ydGFudCB0byB1bmRlcnN0YW5kLCBob3dldmVyLCB0aGF0IHRoZSBCU1AgbGF5ZXIgY2FuIHN0aWxsCisgICAgICAgICAgICAgICAgbWFrZSBtYWNoaW5lLXNwZWNpZmljIGFkZGl0aW9ucyB0byByZWNpcGVzIHdpdGhpbgorICAgICAgICAgICAgICAgIHRoZSBHVUkgZW52aXJvbm1lbnQgbGF5ZXIgd2l0aG91dCBwb2xsdXRpbmcgdGhlIEdVSSBsYXllciBpdHNlbGYKKyAgICAgICAgICAgICAgICB3aXRoIHRob3NlIG1hY2hpbmUtc3BlY2lmaWMgY2hhbmdlcy4KKyAgICAgICAgICAgICAgICBZb3UgY2FuIGFjY29tcGxpc2ggdGhpcyB0aHJvdWdoIGEgcmVjaXBlIHRoYXQgaXMgYSBCaXRCYWtlIGFwcGVuZAorICAgICAgICAgICAgICAgICg8ZmlsZW5hbWU+LmJiYXBwZW5kPC9maWxlbmFtZT4pIGZpbGUuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbiBpZD0nYXBwZW5kLWJiYXBwZW5kLWZpbGVzJz4KKyAgICAgICAgICAgIDx0aXRsZT5BcHBlbmQgRmlsZXM8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBBcHBlbmQgZmlsZXMsIHdoaWNoIGFyZSBmaWxlcyB0aGF0IGhhdmUgdGhlCisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPi5iYmFwcGVuZDwvZmlsZW5hbWU+IGZpbGUgZXh0ZW5zaW9uLCBleHRlbmQgb3IKKyAgICAgICAgICAgICAgICBvdmVycmlkZSBpbmZvcm1hdGlvbiBpbiBhbiBleGlzdGluZyByZWNpcGUgZmlsZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQml0QmFrZSBleHBlY3RzIGV2ZXJ5IGFwcGVuZCBmaWxlIHRvIGhhdmUgYSBjb3JyZXNwb25kaW5nIHJlY2lwZSBmaWxlLgorICAgICAgICAgICAgICAgIEZ1cnRoZXJtb3JlLCB0aGUgYXBwZW5kIGZpbGUgYW5kIGNvcnJlc3BvbmRpbmcgcmVjaXBlIGZpbGUKKyAgICAgICAgICAgICAgICBtdXN0IHVzZSB0aGUgc2FtZSByb290IGZpbGVuYW1lLgorICAgICAgICAgICAgICAgIFRoZSBmaWxlbmFtZXMgY2FuIGRpZmZlciBvbmx5IGluIHRoZSBmaWxlIHR5cGUgc3VmZml4IHVzZWQKKyAgICAgICAgICAgICAgICAoZS5nLiA8ZmlsZW5hbWU+Zm9ybWZhY3Rvcl8wLjAuYmI8L2ZpbGVuYW1lPiBhbmQKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+Zm9ybWZhY3Rvcl8wLjAuYmJhcHBlbmQ8L2ZpbGVuYW1lPikuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uIGluIGFwcGVuZCBmaWxlcyBleHRlbmRzIG9yCisgICAgICAgICAgICAgICAgb3ZlcnJpZGVzIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgdW5kZXJseWluZywKKyAgICAgICAgICAgICAgICBzaW1pbGFybHktbmFtZWQgcmVjaXBlIGZpbGVzLgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBXaGVuIHlvdSBuYW1lIGFuIGFwcGVuZCBmaWxlLCB5b3UgY2FuIHVzZSB0aGUKKyAgICAgICAgICAgICAgICB3aWxkY2FyZCBjaGFyYWN0ZXIgKCUpIHRvIGFsbG93IGZvciBtYXRjaGluZyByZWNpcGUgbmFtZXMuCisgICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IGhhdmUgYW4gYXBwZW5kIGZpbGUgbmFtZWQKKyAgICAgICAgICAgICAgICBhcyBmb2xsb3dzOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgYnVzeWJveF8xLjIxLiUuYmJhcHBlbmQKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgVGhhdCBhcHBlbmQgZmlsZSB3b3VsZCBtYXRjaCBhbnkgPGZpbGVuYW1lPmJ1c3lib3hfMS4yMS54LmJiPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICB2ZXJzaW9uIG9mIHRoZSByZWNpcGUuCisgICAgICAgICAgICAgICAgU28sIHRoZSBhcHBlbmQgZmlsZSB3b3VsZCBtYXRjaCB0aGUgZm9sbG93aW5nIHJlY2lwZSBuYW1lczoKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIGJ1c3lib3hfMS4yMS4xLmJiCisgICAgIGJ1c3lib3hfMS4yMS4yLmJiCisgICAgIGJ1c3lib3hfMS4yMS4zLmJiCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIElmIHRoZSA8ZmlsZW5hbWU+YnVzeWJveDwvZmlsZW5hbWU+IHJlY2lwZSB3YXMgdXBkYXRlZCB0bworICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5idXN5Ym94XzEuMy4wLmJiPC9maWxlbmFtZT4sIHRoZSBhcHBlbmQgbmFtZSB3b3VsZCBub3QKKyAgICAgICAgICAgICAgICBtYXRjaC4KKyAgICAgICAgICAgICAgICBIb3dldmVyLCBpZiB5b3UgbmFtZWQgdGhlIGFwcGVuZCBmaWxlCisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmJ1c3lib3hfMS4lLmJiYXBwZW5kPC9maWxlbmFtZT4sIHRoZW4geW91IHdvdWxkIGhhdmUgYSBtYXRjaC4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgSW4gdGhlIG1vc3QgZ2VuZXJhbCBjYXNlLCB5b3UgY291bGQgbmFtZSB0aGUgYXBwZW5kIGZpbGUgc29tZXRoaW5nIGFzCisgICAgICAgICAgICAgICAgc2ltcGxlIGFzIDxmaWxlbmFtZT5idXN5Ym94XyUuYmJhcHBlbmQ8L2ZpbGVuYW1lPiB0byBiZSBlbnRpcmVseQorICAgICAgICAgICAgICAgIHZlcnNpb24gaW5kZXBlbmRlbnQuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiBpZD0nb2J0YWluaW5nLWJpdGJha2UnPgorICAgICAgICA8dGl0bGU+T2J0YWluaW5nIEJpdEJha2U8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgWW91IGNhbiBvYnRhaW4gQml0QmFrZSBzZXZlcmFsIGRpZmZlcmVudCB3YXlzOgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPkNsb25pbmcgQml0QmFrZTo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICBVc2luZyBHaXQgdG8gY2xvbmUgdGhlIEJpdEJha2Ugc291cmNlIGNvZGUgcmVwb3NpdG9yeQorICAgICAgICAgICAgICAgICAgICBpcyB0aGUgcmVjb21tZW5kZWQgbWV0aG9kIGZvciBvYnRhaW5pbmcgQml0QmFrZS4KKyAgICAgICAgICAgICAgICAgICAgQ2xvbmluZyB0aGUgcmVwb3NpdG9yeSBtYWtlcyBpdCBlYXN5IHRvIGdldCBidWcgZml4ZXMKKyAgICAgICAgICAgICAgICAgICAgYW5kIGhhdmUgYWNjZXNzIHRvIHN0YWJsZSBicmFuY2hlcyBhbmQgdGhlIG1hc3RlcgorICAgICAgICAgICAgICAgICAgICBicmFuY2guCisgICAgICAgICAgICAgICAgICAgIE9uY2UgeW91IGhhdmUgY2xvbmVkIEJpdEJha2UsIHlvdSBzaG91bGQgdXNlCisgICAgICAgICAgICAgICAgICAgIHRoZSBsYXRlc3Qgc3RhYmxlCisgICAgICAgICAgICAgICAgICAgIGJyYW5jaCBmb3IgZGV2ZWxvcG1lbnQgc2luY2UgdGhlIG1hc3RlciBicmFuY2ggaXMgZm9yCisgICAgICAgICAgICAgICAgICAgIEJpdEJha2UgZGV2ZWxvcG1lbnQgYW5kIG1pZ2h0IGNvbnRhaW4gbGVzcyBzdGFibGUgY2hhbmdlcy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT5Zb3UgdXN1YWxseSBuZWVkIGEgdmVyc2lvbiBvZiBCaXRCYWtlCisgICAgICAgICAgICAgICAgICAgIHRoYXQgbWF0Y2hlcyB0aGUgbWV0YWRhdGEgeW91IGFyZSB1c2luZy4KKyAgICAgICAgICAgICAgICAgICAgVGhlIG1ldGFkYXRhIGlzIGdlbmVyYWxseSBiYWNrd2FyZHMgY29tcGF0aWJsZSBidXQKKyAgICAgICAgICAgICAgICAgICAgbm90IGZvcndhcmQgY29tcGF0aWJsZS48L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPkhlcmUgaXMgYW4gZXhhbXBsZSB0aGF0IGNsb25lcyB0aGUgQml0QmFrZSByZXBvc2l0b3J5OgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgICQgZ2l0IGNsb25lIGdpdDovL2dpdC5vcGVuZW1iZWRkZWQub3JnL2JpdGJha2UKKyAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgICAgICBUaGlzIGNvbW1hbmQgY2xvbmVzIHRoZSBCaXRCYWtlIEdpdCByZXBvc2l0b3J5IGludG8gYQorICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnkgY2FsbGVkIDxmaWxlbmFtZT5iaXRiYWtlPC9maWxlbmFtZT4uCisgICAgICAgICAgICAgICAgICAgIEFsdGVybmF0aXZlbHksIHlvdSBjYW4KKyAgICAgICAgICAgICAgICAgICAgZGVzaWduYXRlIGEgZGlyZWN0b3J5IGFmdGVyIHRoZQorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+Z2l0IGNsb25lPC9maWxlbmFtZT4gY29tbWFuZAorICAgICAgICAgICAgICAgICAgICBpZiB5b3Ugd2FudCB0byBjYWxsIHRoZSBuZXcgZGlyZWN0b3J5IHNvbWV0aGluZworICAgICAgICAgICAgICAgICAgICBvdGhlciB0aGFuIDxmaWxlbmFtZT5iaXRiYWtlPC9maWxlbmFtZT4uCisgICAgICAgICAgICAgICAgICAgIEhlcmUgaXMgYW4gZXhhbXBsZSB0aGF0IG5hbWVzIHRoZSBkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmJiZGV2PC9maWxlbmFtZT46CisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgJCBnaXQgY2xvbmUgZ2l0Oi8vZ2l0Lm9wZW5lbWJlZGRlZC5vcmcvYml0YmFrZSBiYmRldgorICAgICAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+PC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz5JbnN0YWxsYXRpb24gdXNpbmcgeW91ciBEaXN0cmlidXRpb24KKyAgICAgICAgICAgICAgICAgICAgUGFja2FnZSBNYW5hZ2VtZW50IFN5c3RlbTo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICBUaGlzIG1ldGhvZCBpcyBub3QKKyAgICAgICAgICAgICAgICAgICAgcmVjb21tZW5kZWQgYmVjYXVzZSB0aGUgQml0QmFrZSB2ZXJzaW9uIHRoYXQgaXMKKyAgICAgICAgICAgICAgICAgICAgcHJvdmlkZWQgYnkgeW91ciBkaXN0cmlidXRpb24sIGluIG1vc3QgY2FzZXMsCisgICAgICAgICAgICAgICAgICAgIGlzIHNldmVyYWwKKyAgICAgICAgICAgICAgICAgICAgcmVsZWFzZXMgYmVoaW5kIGEgc25hcHNob3Qgb2YgdGhlIEJpdEJha2UgcmVwb3NpdG9yeS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz5UYWtpbmcgYSBzbmFwc2hvdCBvZiBCaXRCYWtlOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIERvd25sb2FkaW5nIGEgc25hcHNob3Qgb2YgQml0QmFrZSBmcm9tIHRoZQorICAgICAgICAgICAgICAgICAgICBzb3VyY2UgY29kZSByZXBvc2l0b3J5IGdpdmVzIHlvdSBhY2Nlc3MgdG8gYSBrbm93bgorICAgICAgICAgICAgICAgICAgICBicmFuY2ggb3IgcmVsZWFzZSBvZiBCaXRCYWtlLgorICAgICAgICAgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICBDbG9uaW5nIHRoZSBHaXQgcmVwb3NpdG9yeSwgYXMgZGVzY3JpYmVkIGVhcmxpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaXMgdGhlIHByZWZlcnJlZCBtZXRob2QgZm9yIGdldHRpbmcgQml0QmFrZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICBDbG9uaW5nIHRoZSByZXBvc2l0b3J5IG1ha2VzIGl0IGVhc2llciB0byB1cGRhdGUgYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaGVzIGFyZSBhZGRlZCB0byB0aGUgc3RhYmxlIGJyYW5jaGVzLgorICAgICAgICAgICAgICAgICAgICA8L25vdGU+PC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT5UaGUgZm9sbG93aW5nIGV4YW1wbGUgZG93bmxvYWRzIGEgc25hcHNob3Qgb2YKKyAgICAgICAgICAgICAgICAgICAgQml0QmFrZSB2ZXJzaW9uIDEuMTcuMDoKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICAkIHdnZXQgaHR0cDovL2dpdC5vcGVuZW1iZWRkZWQub3JnL2JpdGJha2Uvc25hcHNob3QvYml0YmFrZS0xLjE3LjAudGFyLmd6CisgICAgICQgdGFyIHp4cHZmIGJpdGJha2UtMS4xNy4wLnRhci5negorICAgICAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgICAgIEFmdGVyIGV4dHJhY3Rpb24gb2YgdGhlIHRhcmJhbGwgdXNpbmcgdGhlIHRhciB1dGlsaXR5LAorICAgICAgICAgICAgICAgICAgICB5b3UgaGF2ZSBhIGRpcmVjdG9yeSBlbnRpdGxlZAorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+Yml0YmFrZS0xLjE3LjA8L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz5Vc2luZyB0aGUgQml0QmFrZSB0aGF0IENvbWVzIFdpdGggWW91cgorICAgICAgICAgICAgICAgICAgICBCdWlsZCBDaGVja291dDo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICBBIGZpbmFsIHBvc3NpYmlsaXR5IGZvciBnZXR0aW5nIGEgY29weSBvZiBCaXRCYWtlIGlzIHRoYXQgaXQKKyAgICAgICAgICAgICAgICAgICAgYWxyZWFkeSBjb21lcyB3aXRoIHlvdXIgY2hlY2tvdXQgb2YgYSBsYXJnZXIgQml0YmFrZS1iYXNlZCBidWlsZAorICAgICAgICAgICAgICAgICAgICBzeXN0ZW0sIHN1Y2ggYXMgUG9reSBvciBZb2N0byBQcm9qZWN0LgorICAgICAgICAgICAgICAgICAgICBSYXRoZXIgdGhhbiBtYW51YWxseSBjaGVja2luZyBvdXQgaW5kaXZpZHVhbCBsYXllcnMgYW5kCisgICAgICAgICAgICAgICAgICAgIGdsdWluZyB0aGVtIHRvZ2V0aGVyIHlvdXJzZWxmLCB5b3UgY2FuIGNoZWNrCisgICAgICAgICAgICAgICAgICAgIG91dCBhbiBlbnRpcmUgYnVpbGQgc3lzdGVtLgorICAgICAgICAgICAgICAgICAgICBUaGUgY2hlY2tvdXQgd2lsbCBhbHJlYWR5IGluY2x1ZGUgYSB2ZXJzaW9uIG9mIEJpdEJha2UgdGhhdAorICAgICAgICAgICAgICAgICAgICBoYXMgYmVlbiB0aG9yb3VnaGx5IHRlc3RlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBvdGhlcgorICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLgorICAgICAgICAgICAgICAgICAgICBGb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGNoZWNrIG91dCBhIHBhcnRpY3VsYXIgQml0QmFrZS1iYXNlZAorICAgICAgICAgICAgICAgICAgICBidWlsZCBzeXN0ZW0sIGNvbnN1bHQgdGhhdCBidWlsZCBzeXN0ZW0ncyBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiBpZD0iYml0YmFrZS11c2VyLW1hbnVhbC1jb21tYW5kIj4KKyAgICAgICAgPHRpdGxlPlRoZSBCaXRCYWtlIENvbW1hbmQ8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlIDxmaWxlbmFtZT5iaXRiYWtlPC9maWxlbmFtZT4gY29tbWFuZCBpcyB0aGUgcHJpbWFyeSBpbnRlcmZhY2UKKyAgICAgICAgICAgIHRvIHRoZSBCaXRCYWtlIHRvb2wuCisgICAgICAgICAgICBUaGlzIHNlY3Rpb24gcHJlc2VudHMgdGhlIEJpdEJha2UgY29tbWFuZCBzeW50YXggYW5kIHByb3ZpZGVzCisgICAgICAgICAgICBzZXZlcmFsIGV4ZWN1dGlvbiBleGFtcGxlcy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxzZWN0aW9uIGlkPSd1c2FnZS1hbmQtc3ludGF4Jz4KKyAgICAgICAgICAgIDx0aXRsZT5Vc2FnZSBhbmQgc3ludGF4PC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgRm9sbG93aW5nIGlzIHRoZSB1c2FnZSBhbmQgc3ludGF4IGZvciBCaXRCYWtlOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgJCBiaXRiYWtlIC1oCisgICAgIFVzYWdlOiBiaXRiYWtlIFtvcHRpb25zXSBbcmVjaXBlbmFtZS90YXJnZXQgLi4uXQorCisgICAgICAgICBFeGVjdXRlcyB0aGUgc3BlY2lmaWVkIHRhc2sgKGRlZmF1bHQgaXMgJ2J1aWxkJykgZm9yIGEgZ2l2ZW4gc2V0IG9mIHRhcmdldCByZWNpcGVzICguYmIgZmlsZXMpLgorICAgICAgICAgSXQgaXMgYXNzdW1lZCB0aGVyZSBpcyBhIGNvbmYvYmJsYXllcnMuY29uZiBhdmFpbGFibGUgaW4gY3dkIG9yIGluIEJCUEFUSCB3aGljaAorICAgICAgICAgd2lsbCBwcm92aWRlIHRoZSBsYXllciwgQkJGSUxFUyBhbmQgb3RoZXIgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KKworICAgICBPcHRpb25zOgorICAgICAgIC0tdmVyc2lvbiAgICAgICAgICAgICBzaG93IHByb2dyYW0ncyB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdAorICAgICAgIC1oLCAtLWhlbHAgICAgICAgICAgICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgICAgLWIgQlVJTERGSUxFLCAtLWJ1aWxkZmlsZT1CVUlMREZJTEUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhlY3V0ZSB0YXNrcyBmcm9tIGEgc3BlY2lmaWMgLmJiIHJlY2lwZSBkaXJlY3RseS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0FSTklORzogRG9lcyBub3QgaGFuZGxlIGFueSBkZXBlbmRlbmNpZXMgZnJvbSBvdGhlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNpcGVzLgorICAgICAgIC1rLCAtLWNvbnRpbnVlICAgICAgICBDb250aW51ZSBhcyBtdWNoIGFzIHBvc3NpYmxlIGFmdGVyIGFuIGVycm9yLiBXaGlsZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0IHRoYXQgZmFpbGVkIGFuZCBhbnl0aGluZyBkZXBlbmRpbmcgb24gaXQgY2Fubm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGJ1aWx0LCBhcyBtdWNoIGFzIHBvc3NpYmxlIHdpbGwgYmUgYnVpbHQgYmVmb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BwaW5nLgorICAgICAgIC1hLCAtLXRyeWFsdGNvbmZpZ3MgICBDb250aW51ZSB3aXRoIGJ1aWxkcyBieSB0cnlpbmcgdG8gdXNlIGFsdGVybmF0aXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVycyB3aGVyZSBwb3NzaWJsZS4KKyAgICAgICAtZiwgLS1mb3JjZSAgICAgICAgICAgRm9yY2UgdGhlIHNwZWNpZmllZCB0YXJnZXRzL3Rhc2sgdG8gcnVuIChpbnZhbGlkYXRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW55IGV4aXN0aW5nIHN0YW1wIGZpbGUpLgorICAgICAgIC1jIENNRCwgLS1jbWQ9Q01EICAgICBTcGVjaWZ5IHRoZSB0YXNrIHRvIGV4ZWN1dGUuIFRoZSBleGFjdCBvcHRpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSBkZXBlbmQgb24gdGhlIG1ldGFkYXRhLiBTb21lIGV4YW1wbGVzIG1pZ2h0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlICdjb21waWxlJyBvciAncG9wdWxhdGVfc3lzcm9vdCcgb3IgJ2xpc3R0YXNrcycgbWF5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpdmUgYSBsaXN0IG9mIHRoZSB0YXNrcyBhdmFpbGFibGUuCisgICAgICAgLUMgSU5WQUxJREFURV9TVEFNUCwgLS1jbGVhci1zdGFtcD1JTlZBTElEQVRFX1NUQU1QCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRhdGUgdGhlIHN0YW1wIGZvciB0aGUgc3BlY2lmaWVkIHRhc2sgc3VjaCBhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29tcGlsZScgYW5kIHRoZW4gcnVuIHRoZSBkZWZhdWx0IHRhc2sgZm9yIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgdGFyZ2V0KHMpLgorICAgICAgIC1yIFBSRUZJTEUsIC0tcmVhZD1QUkVGSUxFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWQgdGhlIHNwZWNpZmllZCBmaWxlIGJlZm9yZSBiaXRiYWtlLmNvbmYuCisgICAgICAgLVIgUE9TVEZJTEUsIC0tcG9zdHJlYWQ9UE9TVEZJTEUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZCB0aGUgc3BlY2lmaWVkIGZpbGUgYWZ0ZXIgYml0YmFrZS5jb25mLgorICAgICAgIC12LCAtLXZlcmJvc2UgICAgICAgICBPdXRwdXQgbW9yZSBsb2cgbWVzc2FnZSBkYXRhIHRvIHRoZSB0ZXJtaW5hbC4KKyAgICAgICAtRCwgLS1kZWJ1ZyAgICAgICAgICAgSW5jcmVhc2UgdGhlIGRlYnVnIGxldmVsLiBZb3UgY2FuIHNwZWNpZnkgdGhpcyBtb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYW4gb25jZS4KKyAgICAgICAtbiwgLS1kcnktcnVuICAgICAgICAgRG9uJ3QgZXhlY3V0ZSwganVzdCBnbyB0aHJvdWdoIHRoZSBtb3Rpb25zLgorICAgICAgIC1TIFNJR05BVFVSRV9IQU5ETEVSLCAtLWR1bXAtc2lnbmF0dXJlcz1TSUdOQVRVUkVfSEFORExFUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEdW1wIG91dCB0aGUgc2lnbmF0dXJlIGNvbnN0cnVjdGlvbiBpbmZvcm1hdGlvbiwgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyB0YXNrIGV4ZWN1dGlvbi4gVGhlIFNJR05BVFVSRV9IQU5ETEVSIHBhcmFtZXRlciBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgdG8gdGhlIGhhbmRsZXIuIFR3byBjb21tb24gdmFsdWVzIGFyZSBub25lIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGRpZmYgYnV0IHRoZSBoYW5kbGVyIG1heSBkZWZpbmUgbW9yZS9sZXNzLiBub25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYW5zIG9ubHkgZHVtcCB0aGUgc2lnbmF0dXJlLCBwcmludGRpZmYgbWVhbnMgY29tcGFyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZHVtcGVkIHNpZ25hdHVyZSB3aXRoIHRoZSBjYWNoZWQgb25lLgorICAgICAgIC1wLCAtLXBhcnNlLW9ubHkgICAgICBRdWl0IGFmdGVyIHBhcnNpbmcgdGhlIEJCIHJlY2lwZXMuCisgICAgICAgLXMsIC0tc2hvdy12ZXJzaW9ucyAgIFNob3cgY3VycmVudCBhbmQgcHJlZmVycmVkIHZlcnNpb25zIG9mIGFsbCByZWNpcGVzLgorICAgICAgIC1lLCAtLWVudmlyb25tZW50ICAgICBTaG93IHRoZSBnbG9iYWwgb3IgcGVyLXJlY2lwZSBlbnZpcm9ubWVudCBjb21wbGV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHdoZXJlIHZhcmlhYmxlcyB3ZXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldC9jaGFuZ2VkLgorICAgICAgIC1nLCAtLWdyYXBodml6ICAgICAgICBTYXZlIGRlcGVuZGVuY3kgdHJlZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRzIGluIHRoZSBkb3Qgc3ludGF4LgorICAgICAgIC1JIEVYVFJBX0FTU1VNRV9QUk9WSURFRCwgLS1pZ25vcmUtZGVwcz1FWFRSQV9BU1NVTUVfUFJPVklERUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNzdW1lIHRoZXNlIGRlcGVuZGVuY2llcyBkb24ndCBleGlzdCBhbmQgYXJlIGFscmVhZHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZWQgKGVxdWl2YWxlbnQgdG8gQVNTVU1FX1BST1ZJREVEKS4gVXNlZnVsIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2UgZGVwZW5kZW5jeSBncmFwaHMgbW9yZSBhcHBlYWxpbmcKKyAgICAgICAtbCBERUJVR19ET01BSU5TLCAtLWxvZy1kb21haW5zPURFQlVHX0RPTUFJTlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvdyBkZWJ1ZyBsb2dnaW5nIGZvciB0aGUgc3BlY2lmaWVkIGxvZ2dpbmcgZG9tYWlucworICAgICAgIC1QLCAtLXByb2ZpbGUgICAgICAgICBQcm9maWxlIHRoZSBjb21tYW5kIGFuZCBzYXZlIHJlcG9ydHMuCisgICAgICAgLXUgVUksIC0tdWk9VUkgICAgICAgIFRoZSB1c2VyIGludGVyZmFjZSB0byB1c2UgKGUuZy4ga25vdHR5LCBob2IsIGRlcGV4cCkuCisgICAgICAgLXQgU0VSVkVSVFlQRSwgLS1zZXJ2ZXJ0eXBlPVNFUlZFUlRZUEUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hvb3NlIHdoaWNoIHNlcnZlciB0byB1c2UsIHByb2Nlc3Mgb3IgeG1scnBjLgorICAgICAgIC0tdG9rZW49WE1MUlBDVE9LRU4gICBTcGVjaWZ5IHRoZSBjb25uZWN0aW9uIHRva2VuIHRvIGJlIHVzZWQgd2hlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW5nIHRvIGEgcmVtb3RlIHNlcnZlci4KKyAgICAgICAtLXJldmlzaW9ucy1jaGFuZ2VkICAgU2V0IHRoZSBleGl0IGNvZGUgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdXBzdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXRpbmcgcmV2aXNpb25zIGhhdmUgY2hhbmdlZCBvciBub3QuCisgICAgICAgLS1zZXJ2ZXItb25seSAgICAgICAgIFJ1biBiaXRiYWtlIHdpdGhvdXQgYSBVSSwgb25seSBzdGFydGluZyBhIHNlcnZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29va2VyKSBwcm9jZXNzLgorICAgICAgIC1CIEJJTkQsIC0tYmluZD1CSU5EICBUaGUgbmFtZS9hZGRyZXNzIGZvciB0aGUgYml0YmFrZSBzZXJ2ZXIgdG8gYmluZCB0by4KKyAgICAgICAtLW5vLXNldHNjZW5lICAgICAgICAgRG8gbm90IHJ1biBhbnkgc2V0c2NlbmUgdGFza3MuIHNzdGF0ZSB3aWxsIGJlIGlnbm9yZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGV2ZXJ5dGhpbmcgbmVlZGVkLCBidWlsdC4KKyAgICAgICAtLXJlbW90ZS1zZXJ2ZXI9UkVNT1RFX1NFUlZFUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0IHRvIHRoZSBzcGVjaWZpZWQgc2VydmVyLgorICAgICAgIC1tLCAtLWtpbGwtc2VydmVyICAgICBUZXJtaW5hdGUgdGhlIHJlbW90ZSBzZXJ2ZXIuCisgICAgICAgLS1vYnNlcnZlLW9ubHkgICAgICAgIENvbm5lY3QgdG8gYSBzZXJ2ZXIgYXMgYW4gb2JzZXJ2aW5nLW9ubHkgY2xpZW50LgorICAgICAgIC0tc3RhdHVzLW9ubHkgICAgICAgICBDaGVjayB0aGUgc3RhdHVzIG9mIHRoZSByZW1vdGUgYml0YmFrZSBzZXJ2ZXIuCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24gaWQ9J2JpdGJha2UtZXhhbXBsZXMnPgorICAgICAgICAgICAgPHRpdGxlPkV4YW1wbGVzPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhpcyBzZWN0aW9uIHByZXNlbnRzIHNvbWUgZXhhbXBsZXMgc2hvd2luZyBob3cgdG8gdXNlIEJpdEJha2UuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxzZWN0aW9uIGlkPSdleGFtcGxlLWV4ZWN1dGluZy1hLXRhc2stYWdhaW5zdC1hLXNpbmdsZS1yZWNpcGUnPgorICAgICAgICAgICAgICAgIDx0aXRsZT5FeGVjdXRpbmcgYSBUYXNrIEFnYWluc3QgYSBTaW5nbGUgUmVjaXBlPC90aXRsZT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBFeGVjdXRpbmcgdGFza3MgZm9yIGEgc2luZ2xlIHJlY2lwZSBmaWxlIGlzIHJlbGF0aXZlbHkgc2ltcGxlLgorICAgICAgICAgICAgICAgICAgICBZb3Ugc3BlY2lmeSB0aGUgZmlsZSBpbiBxdWVzdGlvbiwgYW5kIEJpdEJha2UgcGFyc2VzCisgICAgICAgICAgICAgICAgICAgIGl0IGFuZCBleGVjdXRlcyB0aGUgc3BlY2lmaWVkIHRhc2suCisgICAgICAgICAgICAgICAgICAgIElmIHlvdSBkbyBub3Qgc3BlY2lmeSBhIHRhc2ssIEJpdEJha2UgZXhlY3V0ZXMgdGhlIGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgdGFzaywgd2hpY2ggaXMgImJ1aWxk4oCdLgorICAgICAgICAgICAgICAgICAgICBCaXRCYWtlIG9iZXlzIGludGVyLXRhc2sgZGVwZW5kZW5jaWVzIHdoZW4gZG9pbmcKKyAgICAgICAgICAgICAgICAgICAgc28uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgY29tbWFuZCBydW5zIHRoZSBidWlsZCB0YXNrLCB3aGljaCBpcworICAgICAgICAgICAgICAgICAgICB0aGUgZGVmYXVsdCB0YXNrLCBvbiB0aGUgPGZpbGVuYW1lPmZvb18xLjAuYmI8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICByZWNpcGUgZmlsZToKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICAkIGJpdGJha2UgLWIgZm9vXzEuMC5iYgorICAgICAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgY29tbWFuZCBydW5zIHRoZSBjbGVhbiB0YXNrIG9uIHRoZQorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+Zm9vLmJiPC9maWxlbmFtZT4gcmVjaXBlIGZpbGU6CisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgJCBiaXRiYWtlIC1iIGZvby5iYiAtYyBjbGVhbgorICAgICAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgICAgICAgICAgVGhlICItYiIgb3B0aW9uIGV4cGxpY2l0bHkgZG9lcyBub3QgaGFuZGxlIHJlY2lwZQorICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzLgorICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXIgdGhhbiBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLCBpdCBpcyBpbnN0ZWFkCisgICAgICAgICAgICAgICAgICAgICAgICByZWNvbW1lbmRlZCB0aGF0IHlvdSB1c2UgdGhlIHN5bnRheCBwcmVzZW50ZWQgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IHNlY3Rpb24uCisgICAgICAgICAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgICAgIDxzZWN0aW9uIGlkPSdleGVjdXRpbmctdGFza3MtYWdhaW5zdC1hLXNldC1vZi1yZWNpcGUtZmlsZXMnPgorICAgICAgICAgICAgICAgIDx0aXRsZT5FeGVjdXRpbmcgVGFza3MgQWdhaW5zdCBhIFNldCBvZiBSZWNpcGUgRmlsZXM8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFRoZXJlIGFyZSBhIG51bWJlciBvZiBhZGRpdGlvbmFsIGNvbXBsZXhpdGllcyBpbnRyb2R1Y2VkCisgICAgICAgICAgICAgICAgICAgIHdoZW4gb25lIHdhbnRzIHRvIG1hbmFnZSBtdWx0aXBsZSA8ZmlsZW5hbWU+LmJiPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgZmlsZXMuCisgICAgICAgICAgICAgICAgICAgIENsZWFybHkgdGhlcmUgbmVlZHMgdG8gYmUgYSB3YXkgdG8gdGVsbCBCaXRCYWtlIHdoYXQKKyAgICAgICAgICAgICAgICAgICAgZmlsZXMgYXJlIGF2YWlsYWJsZSBhbmQsIG9mIHRob3NlLCB3aGljaCB5b3UKKyAgICAgICAgICAgICAgICAgICAgd2FudCB0byBleGVjdXRlLgorICAgICAgICAgICAgICAgICAgICBUaGVyZSBhbHNvIG5lZWRzIHRvIGJlIGEgd2F5IGZvciBlYWNoIHJlY2lwZQorICAgICAgICAgICAgICAgICAgICB0byBleHByZXNzIGl0cyBkZXBlbmRlbmNpZXMsIGJvdGggZm9yIGJ1aWxkLXRpbWUgYW5kCisgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWUuCisgICAgICAgICAgICAgICAgICAgIFRoZXJlIG11c3QgYmUgYSB3YXkgZm9yIHlvdSB0byBleHByZXNzIHJlY2lwZSBwcmVmZXJlbmNlcworICAgICAgICAgICAgICAgICAgICB3aGVuIG11bHRpcGxlIHJlY2lwZXMgcHJvdmlkZSB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5LCBvciB3aGVuCisgICAgICAgICAgICAgICAgICAgIHRoZXJlIGFyZSBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBhIHJlY2lwZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVGhlIDxmaWxlbmFtZT5iaXRiYWtlPC9maWxlbmFtZT4gY29tbWFuZCwgd2hlbiBub3QgdXNpbmcKKyAgICAgICAgICAgICAgICAgICAgIi0tYnVpbGRmaWxlIiBvciAiLWIiIG9ubHkgYWNjZXB0cyBhICJQUk9WSURFUyIuCisgICAgICAgICAgICAgICAgICAgIFlvdSBjYW5ub3QgcHJvdmlkZSBhbnl0aGluZyBlbHNlLgorICAgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0LCBhIHJlY2lwZSBmaWxlIGdlbmVyYWxseSAiUFJPVklERVMiIGl0cworICAgICAgICAgICAgICAgICAgICAicGFja2FnZW5hbWUiIGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICAkIGJpdGJha2UgZm9vCisgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICAgICAgVGhpcyBuZXh0IGV4YW1wbGUgIlBST1ZJREVTIiB0aGUgcGFja2FnZSBuYW1lIGFuZCBhbHNvIHVzZXMKKyAgICAgICAgICAgICAgICAgICAgdGhlICItYyIgb3B0aW9uIHRvIHRlbGwgQml0QmFrZSB0byBqdXN0IGV4ZWN1dGUgdGhlCisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5kb19jbGVhbjwvZmlsZW5hbWU+IHRhc2s6CisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgJCBiaXRiYWtlIC1jIGNsZWFuIGZvbworICAgICAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgICAgICA8c2VjdGlvbiBpZD0nZ2VuZXJhdGluZy1kZXBlbmRlbmN5LWdyYXBocyc+CisgICAgICAgICAgICAgICAgPHRpdGxlPkdlbmVyYXRpbmcgRGVwZW5kZW5jeSBHcmFwaHM8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEJpdEJha2UgaXMgYWJsZSB0byBnZW5lcmF0ZSBkZXBlbmRlbmN5IGdyYXBocyB1c2luZworICAgICAgICAgICAgICAgICAgICB0aGUgPGZpbGVuYW1lPmRvdDwvZmlsZW5hbWU+IHN5bnRheC4KKyAgICAgICAgICAgICAgICAgICAgWW91IGNhbiBjb252ZXJ0IHRoZXNlIGdyYXBocyBpbnRvIGltYWdlcyB1c2luZyB0aGUKKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmRvdDwvZmlsZW5hbWU+IHRvb2wgZnJvbQorICAgICAgICAgICAgICAgICAgICA8dWxpbmsgdXJsPSdodHRwOi8vd3d3LmdyYXBodml6Lm9yZyc+R3JhcGh2aXo8L3VsaW5rPi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgV2hlbiB5b3UgZ2VuZXJhdGUgYSBkZXBlbmRlbmN5IGdyYXBoLCBCaXRCYWtlIHdyaXRlcyBmb3VyIGZpbGVzCisgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5OgorICAgICAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz48ZmlsZW5hbWU+cGFja2FnZS1kZXBlbmRzLmRvdDwvZmlsZW5hbWU+OjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvd3MgQml0QmFrZSdzIGtub3dsZWRnZSBvZiBkZXBlbmRlbmNpZXMgYmV0d2VlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWUgdGFyZ2V0cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+PGZpbGVuYW1lPnBuLWRlcGVuZHMuZG90PC9maWxlbmFtZT46PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG93cyBkZXBlbmRlbmNpZXMgYmV0d2VlbiBidWlsZC10aW1lIHRhcmdldHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaS5lLiByZWNpcGVzKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+PGZpbGVuYW1lPnRhc2stZGVwZW5kcy5kb3Q8L2ZpbGVuYW1lPjo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3dzIGRlcGVuZGVuY2llcyBiZXR3ZWVuIHRhc2tzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz48ZmlsZW5hbWU+cG4tYnVpbGRsaXN0PC9maWxlbmFtZT46PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG93cyBhIHNpbXBsZSBsaXN0IG9mIHRhcmdldHMgdGhhdCBhcmUgdG8gYmUgYnVpbHQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUbyBzdG9wIGRlcGVuZGluZyBvbiBjb21tb24gZGVwZW5kcywgdXNlIHRoZSAiLUkiIGRlcGVuZAorICAgICAgICAgICAgICAgICAgICBvcHRpb24gYW5kIEJpdEJha2Ugb21pdHMgdGhlbSBmcm9tIHRoZSBncmFwaC4KKyAgICAgICAgICAgICAgICAgICAgTGVhdmluZyB0aGlzIGluZm9ybWF0aW9uIG91dCBjYW4gcHJvZHVjZSBtb3JlIHJlYWRhYmxlIGdyYXBocy4KKyAgICAgICAgICAgICAgICAgICAgVGhpcyB3YXksIHlvdSBjYW4gcmVtb3ZlIGZyb20gdGhlIGdyYXBoCisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5ERVBFTkRTPC9maWxlbmFtZT4gZnJvbSBpbmhlcml0ZWQgY2xhc3NlcworICAgICAgICAgICAgICAgICAgICBzdWNoIGFzIDxmaWxlbmFtZT5iYXNlLmJiY2xhc3M8L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgSGVyZSBhcmUgdHdvIGV4YW1wbGVzIHRoYXQgY3JlYXRlIGRlcGVuZGVuY3kgZ3JhcGhzLgorICAgICAgICAgICAgICAgICAgICBUaGUgc2Vjb25kIGV4YW1wbGUgb21pdHMgZGVwZW5kcyBjb21tb24gaW4gT3BlbkVtYmVkZGVkIGZyb20KKyAgICAgICAgICAgICAgICAgICAgdGhlIGdyYXBoOgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgICQgYml0YmFrZSAtZyBmb28KKworICAgICAkIGJpdGJha2UgLWcgLUkgdmlydHVhbC9rZXJuZWwgLUkgZWdsaWJjIGZvbworICAgICAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorPC9jaGFwdGVyPgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9kb2MvYml0YmFrZS11c2VyLW1hbnVhbC9iaXRiYWtlLXVzZXItbWFudWFsLW1ldGFkYXRhLnhtbCBiL2JpdGJha2UvZG9jL2JpdGJha2UtdXNlci1tYW51YWwvYml0YmFrZS11c2VyLW1hbnVhbC1tZXRhZGF0YS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI5ZDgwMAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvZG9jL2JpdGJha2UtdXNlci1tYW51YWwvYml0YmFrZS11c2VyLW1hbnVhbC1tZXRhZGF0YS54bWwKQEAgLTAsMCArMSwxODMwIEBACis8IURPQ1RZUEUgY2hhcHRlciBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuMi8vRU4iCisiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9kb2Nib29rL3htbC80LjIvZG9jYm9va3guZHRkIj4KKworPGNoYXB0ZXIgaWQ9ImJpdGJha2UtdXNlci1tYW51YWwtbWV0YWRhdGEiPgorICAgIDx0aXRsZT5TeW50YXggYW5kIE9wZXJhdG9yczwvdGl0bGU+CisKKyAgICA8cGFyYT4KKyAgICAgICAgQml0YmFrZSBmaWxlcyBoYXZlIHRoZWlyIG93biBzeW50YXguCisgICAgICAgIFRoZSBzeW50YXggaGFzIHNpbWlsYXJpdGllcyB0byBzZXZlcmFsCisgICAgICAgIG90aGVyIGxhbmd1YWdlcyBidXQgYWxzbyBoYXMgc29tZSB1bmlxdWUgZmVhdHVyZXMuCisgICAgICAgIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIGF2YWlsYWJsZSBzeW50YXggYW5kIG9wZXJhdG9ycworICAgICAgICBhcyB3ZWxsIGFzIHByb3ZpZGVzIGV4YW1wbGVzLgorICAgIDwvcGFyYT4KKworICAgIDxzZWN0aW9uIGlkPSdiYXNpYy1zeW50YXgnPgorICAgICAgICA8dGl0bGU+QmFzaWMgU3ludGF4PC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBzb21lIGJhc2ljIHN5bnRheCBleGFtcGxlcy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxzZWN0aW9uIGlkPSdiYXNpYy12YXJpYWJsZS1zZXR0aW5nJz4KKyAgICAgICAgICAgIDx0aXRsZT5CYXNpYyBWYXJpYWJsZSBTZXR0aW5nPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBleGFtcGxlIHNldHMgPGZpbGVuYW1lPlZBUklBQkxFPC9maWxlbmFtZT4gdG8KKyAgICAgICAgICAgICAgICAidmFsdWUiLgorICAgICAgICAgICAgICAgIFRoaXMgYXNzaWdubWVudCBvY2N1cnMgaW1tZWRpYXRlbHkgYXMgdGhlIHN0YXRlbWVudCBpcyBwYXJzZWQuCisgICAgICAgICAgICAgICAgSXQgaXMgYSAiaGFyZCIgYXNzaWdubWVudC4KKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIFZBUklBQkxFID0gInZhbHVlIgorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICBBcyBleHBlY3RlZCwgaWYgeW91IGluY2x1ZGUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMgYXMgcGFydCBvZgorICAgICAgICAgICAgICAgIGFuIGFzc2lnbm1lbnQsIHRoZSBzcGFjZXMgYXJlIHJldGFpbmVkOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgVkFSSUFCTEUgPSAiIHZhbHVlIgorICAgICBWQVJJQUJMRSA9ICJ2YWx1ZSAiCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIFNldHRpbmcgPGZpbGVuYW1lPlZBUklBQkxFPC9maWxlbmFtZT4gdG8gIiIgc2V0cyBpdCB0byBhbiBlbXB0eSBzdHJpbmcsCisgICAgICAgICAgICAgICAgd2hpbGUgc2V0dGluZyB0aGUgdmFyaWFibGUgdG8gIiAiIHNldHMgaXQgdG8gYSBibGFuayBzcGFjZQorICAgICAgICAgICAgICAgIChpLmUuIHRoZXNlIGFyZSBub3QgdGhlIHNhbWUgdmFsdWVzKS4KKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIFZBUklBQkxFID0gIiIKKyAgICAgVkFSSUFCTEUgPSAiICIKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbiBpZD0ndmFyaWFibGUtZXhwYW5zaW9uJz4KKyAgICAgICAgICAgIDx0aXRsZT5WYXJpYWJsZSBFeHBhbnNpb248L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBCaXRCYWtlIHN1cHBvcnRzIHZhcmlhYmxlcyByZWZlcmVuY2luZyBvbmUgYW5vdGhlcidzCisgICAgICAgICAgICAgICAgY29udGVudHMgdXNpbmcgYSBzeW50YXggdGhhdCBpcyBzaW1pbGFyIHRvIHNoZWxsIHNjcmlwdGluZy4KKyAgICAgICAgICAgICAgICBGb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSB0aGF0IHJlc3VsdHMgaW4gPGZpbGVuYW1lPkE8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgIGNvbnRhaW5pbmcgImF2YWwiIGFuZCA8ZmlsZW5hbWU+QjwvZmlsZW5hbWU+IGV2YWx1YXRpbmcgdG8KKyAgICAgICAgICAgICAgICAicHJlYXZhbHBvc3QiIGJhc2VkIG9uIHRoYXQgY3VycmVudCB2YWx1ZSBvZgorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5BPC9maWxlbmFtZT4uCisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBBID0gImF2YWwiCisgICAgIEIgPSAicHJlJHtBfXBvc3QiCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIFlvdSBzaG91bGQgcmVhbGl6ZSB0aGF0IHdoZW5ldmVyIDxmaWxlbmFtZT5CPC9maWxlbmFtZT4gaXMKKyAgICAgICAgICAgICAgICByZWZlcmVuY2VkLCBpdHMgZXZhbHVhdGlvbiB3aWxsIGRlcGVuZCBvbiB0aGUgc3RhdGUgb2YKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+QTwvZmlsZW5hbWU+IGF0IHRoYXQgdGltZS4KKyAgICAgICAgICAgICAgICBUaHVzLCBsYXRlciBldmFsdWF0aW9ucyBvZiA8ZmlsZW5hbWU+QjwvZmlsZW5hbWU+IGluIHRoZQorICAgICAgICAgICAgICAgIHByZXZpb3VzIGV4YW1wbGUgY291bGQgcmVzdWx0IGluIGRpZmZlcmVudCB2YWx1ZXMKKyAgICAgICAgICAgICAgICBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIDxmaWxlbmFtZT5BPC9maWxlbmFtZT4uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbiBpZD0nc2V0dGluZy1hLWRlZmF1bHQtdmFsdWUnPgorICAgICAgICAgICAgPHRpdGxlPlNldHRpbmcgYSBkZWZhdWx0IHZhbHVlICg/PSk8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBZb3UgY2FuIHVzZSB0aGUgIj89IiBvcGVyYXRvciB0byBhY2hpZXZlIGEgInNvZnRlciIgYXNzaWdubWVudAorICAgICAgICAgICAgICAgIGZvciBhIHZhcmlhYmxlLgorICAgICAgICAgICAgICAgIFRoaXMgdHlwZSBvZiBhc3NpZ25tZW50IGFsbG93cyB5b3UgdG8gZGVmaW5lIGEgdmFyaWFibGUgaWYgaXQKKyAgICAgICAgICAgICAgICBpcyB1bmRlZmluZWQgd2hlbiB0aGUgc3RhdGVtZW50IGlzIHBhcnNlZCwgYnV0IHRvIGxlYXZlIHRoZQorICAgICAgICAgICAgICAgIHZhbHVlIGFsb25lIGlmIHRoZSB2YXJpYWJsZSBoYXMgYSB2YWx1ZS4KKyAgICAgICAgICAgICAgICBIZXJlIGlzIGFuIGV4YW1wbGU6CisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBBID89ICJhdmFsIgorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICBJZiA8ZmlsZW5hbWU+QTwvZmlsZW5hbWU+IGlzIHNldCBhdCB0aGUgdGltZSB0aGlzIHN0YXRlbWVudCBpcyBwYXJzZWQsCisgICAgICAgICAgICAgICAgdGhlIHZhcmlhYmxlIHJldGFpbnMgaXRzIHZhbHVlLgorICAgICAgICAgICAgICAgIEhvd2V2ZXIsIGlmIDxmaWxlbmFtZT5BPC9maWxlbmFtZT4gaXMgbm90IHNldCwKKyAgICAgICAgICAgICAgICB0aGUgdmFyaWFibGUgaXMgc2V0IHRvICJhdmFsIi4KKyAgICAgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICAgICAgVGhpcyBhc3NpZ25tZW50IGlzIGltbWVkaWF0ZS4KKyAgICAgICAgICAgICAgICAgICAgQ29uc2VxdWVudGx5LCBpZiBtdWx0aXBsZSAiPz0iIGFzc2lnbm1lbnRzCisgICAgICAgICAgICAgICAgICAgIHRvIGEgc2luZ2xlIHZhcmlhYmxlIGV4aXN0LCB0aGUgZmlyc3Qgb2YgdGhvc2UgZW5kcyB1cCBnZXR0aW5nCisgICAgICAgICAgICAgICAgICAgIHVzZWQuCisgICAgICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24gaWQ9J3NldHRpbmctYS13ZWFrLWRlZmF1bHQtdmFsdWUnPgorICAgICAgICAgICAgPHRpdGxlPlNldHRpbmcgYSB3ZWFrIGRlZmF1bHQgdmFsdWUgKD8/PSk8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBJdCBpcyBwb3NzaWJsZSB0byB1c2UgYSAid2Vha2VyIiBhc3NpZ25tZW50IHRoYW4gaW4gdGhlCisgICAgICAgICAgICAgICAgcHJldmlvdXMgc2VjdGlvbiBieSB1c2luZyB0aGUgIj8/PSIgb3BlcmF0b3IuCisgICAgICAgICAgICAgICAgVGhpcyBhc3NpZ25tZW50IGJlaGF2ZXMgaWRlbnRpY2FsIHRvICI/PSIgZXhjZXB0IHRoYXQgdGhlCisgICAgICAgICAgICAgICAgYXNzaWdubWVudCBpcyBtYWRlIGF0IHRoZSBlbmQgb2YgdGhlIHBhcnNpbmcgcHJvY2VzcyByYXRoZXIKKyAgICAgICAgICAgICAgICB0aGFuIGltbWVkaWF0ZWx5LgorICAgICAgICAgICAgICAgIENvbnNlcXVlbnRseSwgd2hlbiBtdWx0aXBsZSAiPz89IiBhc3NpZ25tZW50cyBleGlzdCwgdGhlIGxhc3QKKyAgICAgICAgICAgICAgICBvbmUgaXMgdXNlZC4KKyAgICAgICAgICAgICAgICBBbHNvLCBhbnkgIj0iIG9yICI/PSIgYXNzaWdubWVudCB3aWxsIG92ZXJyaWRlIHRoZSB2YWx1ZSBzZXQgd2l0aAorICAgICAgICAgICAgICAgICI/Pz0iLgorICAgICAgICAgICAgICAgIEhlcmUgaXMgYW4gZXhhbXBsZToKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIEEgPz89ICJzb21ldmFsdWUiCisgICAgIEEgPz89ICJzb21lb3RoZXJ2YWx1ZSIKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgSWYgPGZpbGVuYW1lPkE8L2ZpbGVuYW1lPiBpcyBzZXQgYmVmb3JlIHRoZSBhYm92ZSBzdGF0ZW1lbnRzIGFyZSBwYXJzZWQsCisgICAgICAgICAgICAgICAgdGhlIHZhcmlhYmxlIHJldGFpbnMgaXRzIHZhbHVlLgorICAgICAgICAgICAgICAgIElmIDxmaWxlbmFtZT5BPC9maWxlbmFtZT4gaXMgbm90IHNldCwKKyAgICAgICAgICAgICAgICB0aGUgdmFyaWFibGUgaXMgc2V0IHRvICJzb21lb3RoZXJ2YWx1ZSIuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEFnYWluLCB0aGlzIGFzc2lnbm1lbnQgaXMgYSAibGF6eSIgb3IgIndlYWsiIGFzc2lnbm1lbnQKKyAgICAgICAgICAgICAgICBiZWNhdXNlIGl0IGRvZXMgbm90IG9jY3VyIHVudGlsIHRoZSBlbmQKKyAgICAgICAgICAgICAgICBvZiB0aGUgcGFyc2luZyBwcm9jZXNzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24gaWQ9J2ltbWVkaWF0ZS12YXJpYWJsZS1leHBhbnNpb24nPgorICAgICAgICAgICAgPHRpdGxlPkltbWVkaWF0ZSB2YXJpYWJsZSBleHBhbnNpb24gKDo9KTwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZSAiOj0iIG9wZXJhdG9yIHJlc3VsdHMgaW4gYSB2YXJpYWJsZSdzCisgICAgICAgICAgICAgICAgY29udGVudHMgYmVpbmcgZXhwYW5kZWQgaW1tZWRpYXRlbHksCisgICAgICAgICAgICAgICAgcmF0aGVyIHRoYW4gd2hlbiB0aGUgdmFyaWFibGUgaXMgYWN0dWFsbHkgdXNlZDoKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIFQgPSAiMTIzIgorICAgICBBIDo9ICIke0J9ICR7QX0gdGVzdCAke1R9IgorICAgICBUID0gIjQ1NiIKKyAgICAgQiA9ICIke1R9IGJ2YWwiCisgICAgIEMgPSAiY3ZhbCIKKyAgICAgQyA6PSAiJHtDfWFwcGVuZCIKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgSW4gdGhpcyBleGFtcGxlLCA8ZmlsZW5hbWU+QTwvZmlsZW5hbWU+IGNvbnRhaW5zCisgICAgICAgICAgICAgICAgInRlc3QgMTIzIiBiZWNhdXNlIDxmaWxlbmFtZT4ke0J9PC9maWxlbmFtZT4gYW5kCisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPiR7QX08L2ZpbGVuYW1lPiBhdCB0aGUgdGltZSBvZiBwYXJzaW5nIGFyZSB1bmRlZmluZWQsCisgICAgICAgICAgICAgICAgd2hpY2ggbGVhdmVzICJ0ZXN0IDEyMyIuCisgICAgICAgICAgICAgICAgQW5kLCB0aGUgdmFyaWFibGUgPGZpbGVuYW1lPkM8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgIGNvbnRhaW5zICJjdmFsYXBwZW5kIiBzaW5jZSA8ZmlsZW5hbWU+JHtDfTwvZmlsZW5hbWU+IGltbWVkaWF0ZWx5CisgICAgICAgICAgICAgICAgZXhwYW5kcyB0byAiY3ZhbCIuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbiBpZD0nYXBwZW5kaW5nLWFuZC1wcmVwZW5kaW5nJz4KKyAgICAgICAgICAgIDx0aXRsZT5BcHBlbmRpbmcgKCs9KSBhbmQgcHJlcGVuZGluZyAoPSspIFdpdGggU3BhY2VzPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQXBwZW5kaW5nIGFuZCBwcmVwZW5kaW5nIHZhbHVlcyBpcyBjb21tb24gYW5kIGNhbiBiZSBhY2NvbXBsaXNoZWQKKyAgICAgICAgICAgICAgICB1c2luZyB0aGUgIis9IiBhbmQgIj0rIiBvcGVyYXRvcnMuCisgICAgICAgICAgICAgICAgVGhlc2Ugb3BlcmF0b3JzIGluc2VydCBhIHNwYWNlIGJldHdlZW4gdGhlIGN1cnJlbnQKKyAgICAgICAgICAgICAgICB2YWx1ZSBhbmQgcHJlcGVuZGVkIG9yIGFwcGVuZGVkIHZhbHVlLgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGVzZSBvcGVyYXRvcnMgdGFrZSBpbW1lZGlhdGUgZWZmZWN0IGR1cmluZyBwYXJzaW5nLgorICAgICAgICAgICAgICAgIEhlcmUgYXJlIHNvbWUgZXhhbXBsZXM6CisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBCID0gImJ2YWwiCisgICAgIEIgKz0gImFkZGl0aW9uYWxkYXRhIgorICAgICBDID0gImN2YWwiCisgICAgIEMgPSsgInRlc3QiCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIFRoZSB2YXJpYWJsZSA8ZmlsZW5hbWU+QjwvZmlsZW5hbWU+IGNvbnRhaW5zCisgICAgICAgICAgICAgICAgImJ2YWwgYWRkaXRpb25hbGRhdGEiIGFuZCA8ZmlsZW5hbWU+QzwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgY29udGFpbnMgInRlc3QgY3ZhbCIuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbiBpZD0nYXBwZW5kaW5nLWFuZC1wcmVwZW5kaW5nLXdpdGhvdXQtc3BhY2VzJz4KKyAgICAgICAgICAgIDx0aXRsZT5BcHBlbmRpbmcgKC49KSBhbmQgUHJlcGVuZGluZyAoPS4pIFdpdGhvdXQgU3BhY2VzPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgSWYgeW91IHdhbnQgdG8gYXBwZW5kIG9yIHByZXBlbmQgdmFsdWVzIHdpdGhvdXQgYW4KKyAgICAgICAgICAgICAgICBpbnNlcnRlZCBzcGFjZSwgdXNlIHRoZSAiLj0iIGFuZCAiPS4iIG9wZXJhdG9ycy4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlc2Ugb3BlcmF0b3JzIHRha2UgaW1tZWRpYXRlIGVmZmVjdCBkdXJpbmcgcGFyc2luZy4KKyAgICAgICAgICAgICAgICBIZXJlIGFyZSBzb21lIGV4YW1wbGVzOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgQiA9ICJidmFsIgorICAgICBCIC49ICJhZGRpdGlvbmFsZGF0YSIKKyAgICAgQyA9ICJjdmFsIgorICAgICBDID0uICJ0ZXN0IgorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICBUaGUgdmFyaWFibGUgPGZpbGVuYW1lPkI8L2ZpbGVuYW1lPiBjb250YWlucworICAgICAgICAgICAgICAgICJidmFsYWRkaXRpb25hbGRhdGEiIGFuZAorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5DPC9maWxlbmFtZT4gY29udGFpbnMgInRlc3RjdmFsIi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uIGlkPSdhcHBlbmRpbmctYW5kLXByZXBlbmRpbmctb3ZlcnJpZGUtc3R5bGUtc3ludGF4Jz4KKyAgICAgICAgICAgIDx0aXRsZT5BcHBlbmRpbmcgYW5kIFByZXBlbmRpbmcgKE92ZXJyaWRlIFN0eWxlIFN5bnRheCk8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBZb3UgY2FuIGFsc28gYXBwZW5kIGFuZCBwcmVwZW5kIGEgdmFyaWFibGUncyB2YWx1ZQorICAgICAgICAgICAgICAgIHVzaW5nIGFuIG92ZXJyaWRlIHN0eWxlIHN5bnRheC4KKyAgICAgICAgICAgICAgICBXaGVuIHlvdSB1c2UgdGhpcyBzeW50YXgsIG5vIHNwYWNlcyBhcmUgaW5zZXJ0ZWQuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZXNlIG9wZXJhdG9ycyBkaWZmZXIgZnJvbSB0aGUgIjo9IiwgIi49IiwgIj0uIiwgIis9IiwgYW5kICI9KyIKKyAgICAgICAgICAgICAgICBvcGVyYXRvcnMgaW4gdGhhdCB0aGVpciBlZmZlY3RzIGFyZSBkZWZlcnJlZAorICAgICAgICAgICAgICAgIHVudGlsIGFmdGVyIHBhcnNpbmcgY29tcGxldGVzIHJhdGhlciB0aGFuIGJlaW5nIGltbWVkaWF0ZWx5CisgICAgICAgICAgICAgICAgYXBwbGllZC4KKyAgICAgICAgICAgICAgICBIZXJlIGFyZSBzb21lIGV4YW1wbGVzOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgQiA9ICJidmFsIgorICAgICBCX2FwcGVuZCA9ICIgYWRkaXRpb25hbCBkYXRhIgorICAgICBDID0gImN2YWwiCisgICAgIENfcHJlcGVuZCA9ICJhZGRpdGlvbmFsIGRhdGEgIgorICAgICBEID0gImR2YWwiCisgICAgIERfYXBwZW5kID0gImFkZGl0aW9uYWwgZGF0YSIKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgVGhlIHZhcmlhYmxlIDxmaWxlbmFtZT5CPC9maWxlbmFtZT4gYmVjb21lcworICAgICAgICAgICAgICAgICJidmFsIGFkZGl0aW9uYWwgZGF0YSIgYW5kIDxmaWxlbmFtZT5DPC9maWxlbmFtZT4gYmVjb21lcworICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsIGRhdGEgY3ZhbCIuCisgICAgICAgICAgICAgICAgVGhlIHZhcmlhYmxlIDxmaWxlbmFtZT5EPC9maWxlbmFtZT4gYmVjb21lcworICAgICAgICAgICAgICAgICJkdmFsYWRkaXRpb25hbCBkYXRhIi4KKyAgICAgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICAgICAgWW91IG11c3QgY29udHJvbCBhbGwgc3BhY2luZyB3aGVuIHlvdSB1c2UgdGhlCisgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlIHN5bnRheC4KKyAgICAgICAgICAgICAgICA8L25vdGU+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbiBpZD0ncmVtb3Zpbmctb3ZlcnJpZGUtc3R5bGUtc3ludGF4Jz4KKyAgICAgICAgICAgIDx0aXRsZT5SZW1vdmFsIChPdmVycmlkZSBTdHlsZSBTeW50YXgpPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgWW91IGNhbiByZW1vdmUgdmFsdWVzIGZyb20gbGlzdHMgdXNpbmcgdGhlIHJlbW92YWwKKyAgICAgICAgICAgICAgICBvdmVycmlkZSBzdHlsZSBzeW50YXguCisgICAgICAgICAgICAgICAgU3BlY2lmeWluZyBhIHZhbHVlIGZvciByZW1vdmFsIGNhdXNlcyBhbGwgb2NjdXJyZW5jZXMgb2YgdGhhdAorICAgICAgICAgICAgICAgIHZhbHVlIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgdmFyaWFibGUuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFdoZW4geW91IHVzZSB0aGlzIHN5bnRheCwgQml0QmFrZSBleHBlY3RzIG9uZSBvciBtb3JlIHN0cmluZ3MuCisgICAgICAgICAgICAgICAgU3Vycm91bmRpbmcgc3BhY2VzIGFyZSByZW1vdmVkIGFzIHdlbGwuCisgICAgICAgICAgICAgICAgSGVyZSBpcyBhbiBleGFtcGxlOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgRk9PID0gIjEyMyA0NTYgNzg5IDEyMzQ1NiAxMjMgNDU2IDEyMyA0NTYiCisgICAgIEZPT19yZW1vdmUgPSAiMTIzIgorICAgICBGT09fcmVtb3ZlID0gIjQ1NiIKKyAgICAgRk9PMiA9ICJhYmMgZGVmIGdoaSBhYmNkZWYgYWJjIGRlZiBhYmMgZGVmIgorICAgICBGT08yX3JlbW92ZSA9ICJhYmMgZGVmIgorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICBUaGUgdmFyaWFibGUgPGZpbGVuYW1lPkZPTzwvZmlsZW5hbWU+IGJlY29tZXMKKyAgICAgICAgICAgICAgICAiNzg5IDEyMzQ1NiIgYW5kIDxmaWxlbmFtZT5GT08yPC9maWxlbmFtZT4gYmVjb21lcworICAgICAgICAgICAgICAgICJnaGkgYWJjZGVmIi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uIGlkPSd2YXJpYWJsZS1mbGFnLXN5bnRheCc+CisgICAgICAgICAgICA8dGl0bGU+VmFyaWFibGUgRmxhZyBTeW50YXg8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBWYXJpYWJsZSBmbGFncyBhcmUgQml0QmFrZSdzIGltcGxlbWVudGF0aW9uIG9mIHZhcmlhYmxlIHByb3BlcnRpZXMKKyAgICAgICAgICAgICAgICBvciBhdHRyaWJ1dGVzLgorICAgICAgICAgICAgICAgIEl0IGlzIGEgd2F5IG9mIHRhZ2dpbmcgZXh0cmEgaW5mb3JtYXRpb24gb250byBhIHZhcmlhYmxlLgorICAgICAgICAgICAgICAgIFlvdSBjYW4gZmluZCBtb3JlIG91dCBhYm91dCB2YXJpYWJsZSBmbGFncyBpbiBnZW5lcmFsIGluIHRoZQorICAgICAgICAgICAgICAgICI8bGluayBsaW5rZW5kPSd2YXJpYWJsZS1mbGFncyc+VmFyaWFibGUgRmxhZ3M8L2xpbms+IgorICAgICAgICAgICAgICAgIHNlY3Rpb24uCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFlvdSBjYW4gZGVmaW5lLCBhcHBlbmQsIGFuZCBwcmVwZW5kIHZhbHVlcyB0byB2YXJpYWJsZSBmbGFncy4KKyAgICAgICAgICAgICAgICBBbGwgdGhlIHN0YW5kYXJkIHN5bnRheCBvcGVyYXRpb25zIHByZXZpb3VzbHkgbWVudGlvbmVkIHdvcmsKKyAgICAgICAgICAgICAgICBmb3IgdmFyaWFibGUgZmxhZ3MgZXhjZXB0IGZvciBvdmVycmlkZSBzdHlsZSBzeW50YXgKKyAgICAgICAgICAgICAgICAoaS5lLiA8ZmlsZW5hbWU+X3ByZXBlbmQ8L2ZpbGVuYW1lPiwgPGZpbGVuYW1lPl9hcHBlbmQ8L2ZpbGVuYW1lPiwKKyAgICAgICAgICAgICAgICBhbmQgPGZpbGVuYW1lPl9yZW1vdmU8L2ZpbGVuYW1lPikuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEhlcmUgYXJlIHNvbWUgZXhhbXBsZXMgc2hvd2luZyBob3cgdG8gc2V0IHZhcmlhYmxlIGZsYWdzOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgRk9PW2FdID0gImFiYyIKKyAgICAgRk9PW2JdID0gIjEyMyIKKyAgICAgRk9PW2FdICs9ICI0NTYiCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIFRoZSB2YXJpYWJsZSA8ZmlsZW5hbWU+Rk9PPC9maWxlbmFtZT4gaGFzIHR3byBmbGFnczoKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+YTwvZmlsZW5hbWU+IGFuZCA8ZmlsZW5hbWU+YjwvZmlsZW5hbWU+LgorICAgICAgICAgICAgICAgIFRoZSBmbGFncyBhcmUgaW1tZWRpYXRlbHkgc2V0IHRvICJhYmMiIGFuZCAiMTIzIiwgcmVzcGVjdGl2ZWx5LgorICAgICAgICAgICAgICAgIFRoZSA8ZmlsZW5hbWU+YTwvZmlsZW5hbWU+IGZsYWcgYmVjb21lcyAiYWJjIDQ1NiIuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIE5vIG5lZWQgZXhpc3RzIHRvIHByZS1kZWZpbmUgdmFyaWFibGUgZmxhZ3MuCisgICAgICAgICAgICAgICAgWW91IGNhbiBzaW1wbHkgc3RhcnQgdXNpbmcgdGhlbS4KKyAgICAgICAgICAgICAgICBPbmUgZXh0cmVtZWx5IGNvbW1vbiBhcHBsaWNhdGlvbgorICAgICAgICAgICAgICAgIGlzIHRvIGF0dGFjaCBzb21lIGJyaWVmIGRvY3VtZW50YXRpb24gdG8gYSBCaXRCYWtlIHZhcmlhYmxlIGFzCisgICAgICAgICAgICAgICAgZm9sbG93czoKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIENBQ0hFW2RvY10gPSAiVGhlIGRpcmVjdG9yeSBob2xkaW5nIHRoZSBjYWNoZSBvZiB0aGUgbWV0YWRhdGEuIgorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uIGlkPSdpbmxpbmUtcHl0aG9uLXZhcmlhYmxlLWV4cGFuc2lvbic+CisgICAgICAgICAgICA8dGl0bGU+SW5saW5lIFB5dGhvbiBWYXJpYWJsZSBFeHBhbnNpb248L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBZb3UgY2FuIHVzZSBpbmxpbmUgUHl0aG9uIHZhcmlhYmxlIGV4cGFuc2lvbiB0bworICAgICAgICAgICAgICAgIHNldCB2YXJpYWJsZXMuCisgICAgICAgICAgICAgICAgSGVyZSBpcyBhbiBleGFtcGxlOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgREFURSA9ICIke0B0aW1lLnN0cmZ0aW1lKCclWSVtJWQnLHRpbWUuZ210aW1lKCkpfSIKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgVGhpcyBleGFtcGxlIHJlc3VsdHMgaW4gdGhlIDxmaWxlbmFtZT5EQVRFPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICB2YXJpYWJsZSBiZWluZyBzZXQgdG8gdGhlIGN1cnJlbnQgZGF0ZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgUHJvYmFibHkgdGhlIG1vc3QgY29tbW9uIHVzZSBvZiB0aGlzIGZlYXR1cmUgaXMgdG8gZXh0cmFjdAorICAgICAgICAgICAgICAgIHRoZSB2YWx1ZSBvZiB2YXJpYWJsZXMgZnJvbSBCaXRCYWtlJ3MgaW50ZXJuYWwgZGF0YSBkaWN0aW9uYXJ5LAorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5kPC9maWxlbmFtZT4uCisgICAgICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBsaW5lcyBzZWxlY3QgdGhlIHZhbHVlcyBvZiBhIHBhY2thZ2UgbmFtZQorICAgICAgICAgICAgICAgIGFuZCBpdHMgdmVyc2lvbiBudW1iZXIsIHJlc3BlY3RpdmVseToKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIFBOID0gIiR7QGJiLnBhcnNlLkJCSGFuZGxlci52YXJzX2Zyb21fZmlsZShkLmdldFZhcignRklMRScsIEZhbHNlKSxkKVswXSBvciAnZGVmYXVsdHBrZ25hbWUnfSIKKyAgICAgUFYgPSAiJHtAYmIucGFyc2UuQkJIYW5kbGVyLnZhcnNfZnJvbV9maWxlKGQuZ2V0VmFyKCdGSUxFJywgRmFsc2UpLGQpWzFdIG9yICcxLjAnfSIKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbiBpZD0ncHJvdmlkaW5nLXBhdGhuYW1lcyc+CisgICAgICAgICAgICA8dGl0bGU+UHJvdmlkaW5nIFBhdGhuYW1lczwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFdoZW4gc3BlY2lmeWluZyBwYXRobmFtZXMgZm9yIHVzZSB3aXRoIEJpdEJha2UsCisgICAgICAgICAgICAgICAgZG8gbm90IHVzZSB0aGUgdGlsZGUgKCJ+IikgY2hhcmFjdGVyIGFzIGEgc2hvcnRjdXQKKyAgICAgICAgICAgICAgICBmb3IgeW91ciBob21lIGRpcmVjdG9yeS4KKyAgICAgICAgICAgICAgICBEb2luZyBzbyBtaWdodCBjYXVzZSBCaXRCYWtlIHRvIG5vdCByZWNvZ25pemUgdGhlCisgICAgICAgICAgICAgICAgcGF0aCBzaW5jZSBCaXRCYWtlIGRvZXMgbm90IGV4cGFuZCB0aGlzIGNoYXJhY3RlciBpbgorICAgICAgICAgICAgICAgIHRoZSBzYW1lIHdheSBhIHNoZWxsIHdvdWxkLgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBJbnN0ZWFkLCBwcm92aWRlIGEgZnVsbGVyIHBhdGggYXMgdGhlIGZvbGxvd2luZworICAgICAgICAgICAgICAgIGV4YW1wbGUgaWxsdXN0cmF0ZXM6CisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBCQkxBWUVSUyA/PSAiIFwKKyAgICAgICAvaG9tZS9zY290dC1sZW5vdm8vTGF5ZXJBIFwKKyAgICAgICAiCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24gaWQ9J2NvbmRpdGlvbmFsLXN5bnRheC1vdmVycmlkZXMnPgorICAgICAgICA8dGl0bGU+Q29uZGl0aW9uYWwgU3ludGF4IChPdmVycmlkZXMpPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEJpdEJha2UgdXNlcworICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLU9WRVJSSURFUyc+PGZpbGVuYW1lPk9WRVJSSURFUzwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgdG8gY29udHJvbCB3aGF0IHZhcmlhYmxlcyBhcmUgb3ZlcnJpZGRlbiBhZnRlciBCaXRCYWtlCisgICAgICAgICAgICBwYXJzZXMgcmVjaXBlcyBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKyAgICAgICAgICAgIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgaG93IHlvdSBjYW4gdXNlCisgICAgICAgICAgICA8ZmlsZW5hbWU+T1ZFUlJJREVTPC9maWxlbmFtZT4gYXMgY29uZGl0aW9uYWwgbWV0YWRhdGEsCisgICAgICAgICAgICB0YWxrcyBhYm91dCBrZXkgZXhwYW5zaW9uIGluIHJlbGF0aW9uc2hpcCB0bworICAgICAgICAgICAgPGZpbGVuYW1lPk9WRVJSSURFUzwvZmlsZW5hbWU+LCBhbmQgcHJvdmlkZXMgc29tZSBleGFtcGxlcworICAgICAgICAgICAgdG8gaGVscCB3aXRoIHVuZGVyc3RhbmRpbmcuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8c2VjdGlvbiBpZD0nY29uZGl0aW9uYWwtbWV0YWRhdGEnPgorICAgICAgICAgICAgPHRpdGxlPkNvbmRpdGlvbmFsIE1ldGFkYXRhPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgWW91IGNhbiB1c2UgPGZpbGVuYW1lPk9WRVJSSURFUzwvZmlsZW5hbWU+IHRvIGNvbmRpdGlvbmFsbHkgc2VsZWN0CisgICAgICAgICAgICAgICAgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIGEgdmFyaWFibGUgYW5kIHRvIGNvbmRpdGlvbmFsbHkKKyAgICAgICAgICAgICAgICBhcHBlbmQgb3IgcHJlcGVuZCB0aGUgdmFsdWUgb2YgYSB2YXJpYWJsZS4KKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPlNlbGVjdGluZyBhIFZhcmlhYmxlOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICBUaGUgPGZpbGVuYW1lPk9WRVJSSURFUzwvZmlsZW5hbWU+IHZhcmlhYmxlIGlzCisgICAgICAgICAgICAgICAgICAgICAgICBhIGNvbG9uLWNoYXJhY3Rlci1zZXBhcmF0ZWQgbGlzdCB0aGF0IGNvbnRhaW5zIGl0ZW1zCisgICAgICAgICAgICAgICAgICAgICAgICBmb3Igd2hpY2ggeW91IHdhbnQgdG8gc2F0aXNmeSBjb25kaXRpb25zLgorICAgICAgICAgICAgICAgICAgICAgICAgVGh1cywgaWYgeW91IGhhdmUgYSB2YXJpYWJsZSB0aGF0IGlzIGNvbmRpdGlvbmFsIG9uIOKAnGFybeKAnSwgYW5kIOKAnGFybeKAnQorICAgICAgICAgICAgICAgICAgICAgICAgaXMgaW4gPGZpbGVuYW1lPk9WRVJSSURFUzwvZmlsZW5hbWU+LCB0aGVuIHRoZSDigJxhcm3igJ0tc3BlY2lmaWMKKyAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gb2YgdGhlIHZhcmlhYmxlIGlzIHVzZWQgcmF0aGVyIHRoYW4gdGhlIG5vbi1jb25kaXRpb25hbAorICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIEhlcmUgaXMgYW4gZXhhbXBsZToKKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgT1ZFUlJJREVTID0gImFyY2hpdGVjdHVyZTpvczptYWNoaW5lIgorICAgICBURVNUID0gImRlZmF1bHQiCisgICAgIFRFU1Rfb3MgPSAib3NzcGVjaWZpYyIKKyAgICAgVEVTVF9ub292ZXJyaWRlID0gIm90aGVyY29uZHZhbHVlIgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgICAgICAgICAgSW4gdGhpcyBleGFtcGxlLCB0aGUgPGZpbGVuYW1lPk9WRVJSSURFUzwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBsaXN0cyB0aHJlZSBvdmVycmlkZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAiYXJjaGl0ZWN0dXJlIiwgIm9zIiwgYW5kICJtYWNoaW5lIi4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZSB2YXJpYWJsZSA8ZmlsZW5hbWU+VEVTVDwvZmlsZW5hbWU+IGJ5IGl0c2VsZiBoYXMgYSBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBvZiAiZGVmYXVsdCIuCisgICAgICAgICAgICAgICAgICAgICAgICBZb3Ugc2VsZWN0IHRoZSBvcy1zcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSA8ZmlsZW5hbWU+VEVTVDwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBieSBhcHBlbmRpbmcgdGhlICJvcyIgb3ZlcnJpZGUgdG8gdGhlIHZhcmlhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAoaS5lLjxmaWxlbmFtZT5URVNUX29zPC9maWxlbmFtZT4pLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUbyBiZXR0ZXIgdW5kZXJzdGFuZCB0aGlzLCBjb25zaWRlciBhIHByYWN0aWNhbCBleGFtcGxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBhc3N1bWVzIGFuIE9wZW5FbWJlZGRlZCBtZXRhZGF0YS1iYXNlZCBMaW51eAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlcm5lbCByZWNpcGUgZmlsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZm9sbG93aW5nIGxpbmVzIGZyb20gdGhlIHJlY2lwZSBmaWxlIGZpcnN0IHNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBrZXJuZWwgYnJhbmNoIHZhcmlhYmxlIDxmaWxlbmFtZT5LQlJBTkNIPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhIGRlZmF1bHQgdmFsdWUsIHRoZW4gY29uZGl0aW9uYWxseSBvdmVycmlkZSB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgYmFzZWQgb24gdGhlIGFyY2hpdGVjdHVyZSBvZiB0aGUgYnVpbGQ6CisgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIEtCUkFOQ0ggPSAic3RhbmRhcmQvYmFzZSIKKyAgICAgS0JSQU5DSF9xZW11YXJtICA9ICJzdGFuZGFyZC9hcm0tdmVyc2F0aWxlLTkyNmVqcyIKKyAgICAgS0JSQU5DSF9xZW11bWlwcyA9ICJzdGFuZGFyZC9tdGktbWFsdGEzMiIKKyAgICAgS0JSQU5DSF9xZW11cHBjICA9ICJzdGFuZGFyZC9xZW11cHBjIgorICAgICBLQlJBTkNIX3FlbXV4ODYgID0gInN0YW5kYXJkL2NvbW1vbi1wYy9iYXNlIgorICAgICBLQlJBTkNIX3FlbXV4ODYtNjQgID0gInN0YW5kYXJkL2NvbW1vbi1wYy02NC9iYXNlIgorICAgICBLQlJBTkNIX3FlbXVtaXBzNjQgPSAic3RhbmRhcmQvbXRpLW1hbHRhNjQiCisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz5BcHBlbmRpbmcgYW5kIFByZXBlbmRpbmc6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIEJpdEJha2UgYWxzbyBzdXBwb3J0cyBhcHBlbmQgYW5kIHByZXBlbmQgb3BlcmF0aW9ucyB0bworICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgdmFsdWVzIGJhc2VkIG9uIHdoZXRoZXIgYSBzcGVjaWZpYyBpdGVtIGlzCisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZWQgaW4gPGZpbGVuYW1lPk9WRVJSSURFUzwvZmlsZW5hbWU+LgorICAgICAgICAgICAgICAgICAgICAgICAgSGVyZSBpcyBhbiBleGFtcGxlOgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBERVBFTkRTID0gImdsaWJjIG5jdXJzZXMiCisgICAgIE9WRVJSSURFUyA9ICJtYWNoaW5lOmxvY2FsIgorICAgICBERVBFTkRTX2FwcGVuZF9tYWNoaW5lID0gImxpYm1hZCIKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICAgICAgICAgIEluIHRoaXMgZXhhbXBsZSwgPGZpbGVuYW1lPkRFUEVORFM8L2ZpbGVuYW1lPiBiZWNvbWVzCisgICAgICAgICAgICAgICAgICAgICAgICAiZ2xpYmMgbmN1cnNlcyBsaWJtYWQiLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2FpbiwgdXNpbmcgYW4gT3BlbkVtYmVkZGVkIG1ldGFkYXRhLWJhc2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VybmVsIHJlY2lwZSBmaWxlIGFzIGFuIGV4YW1wbGUsIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZyBsaW5lcyB3aWxsIGNvbmRpdGlvbmFsbHkgYXBwZW5kIHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5LRVJORUxfRkVBVFVSRVM8L2ZpbGVuYW1lPiB2YXJpYWJsZSBiYXNlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIHRoZSBhcmNoaXRlY3R1cmU6CisgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIEtFUk5FTF9GRUFUVVJFU19hcHBlbmQgPSAiICR7S0VSTkVMX0VYVFJBX0ZFQVRVUkVTfSIKKyAgICAgS0VSTkVMX0ZFQVRVUkVTX2FwcGVuZF9xZW11eDg2PSIgY2ZnL3NvdW5kLnNjYyBjZmcvcGFyYXZpcnRfa3ZtLnNjYyIKKyAgICAgS0VSTkVMX0ZFQVRVUkVTX2FwcGVuZF9xZW11eDg2LTY0PSIgY2ZnL3NvdW5kLnNjYyBjZmcvcGFyYXZpcnRfa3ZtLnNjYyIKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24gaWQ9J2tleS1leHBhbnNpb24nPgorICAgICAgICAgICAgPHRpdGxlPktleSBFeHBhbnNpb248L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBLZXkgZXhwYW5zaW9uIGhhcHBlbnMgd2hlbiB0aGUgQml0QmFrZSBkYXRhc3RvcmUgaXMgZmluYWxpemVkCisgICAgICAgICAgICAgICAganVzdCBiZWZvcmUgQml0QmFrZSBleHBhbmRzIG92ZXJyaWRlcy4KKyAgICAgICAgICAgICAgICBUbyBiZXR0ZXIgdW5kZXJzdGFuZCB0aGlzLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBBJHtCfSA9ICJYIgorICAgICBCID0gIjIiCisgICAgIEEyID0gIlkiCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgYWZ0ZXIgYWxsIHRoZSBwYXJzaW5nIGlzIGNvbXBsZXRlLCBhbmQKKyAgICAgICAgICAgICAgICBiZWZvcmUgYW55IG92ZXJyaWRlcyBhcmUgaGFuZGxlZCwgQml0QmFrZSBleHBhbmRzCisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPiR7Qn08L2ZpbGVuYW1lPiBpbnRvICIyIi4KKyAgICAgICAgICAgICAgICBUaGlzIGV4cGFuc2lvbiBjYXVzZXMgPGZpbGVuYW1lPkEyPC9maWxlbmFtZT4sIHdoaWNoIHdhcworICAgICAgICAgICAgICAgIHNldCB0byAiWSIgYmVmb3JlIHRoZSBleHBhbnNpb24sIHRvIGJlY29tZSAiWCIuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbiBpZD0ndmFyaWFibGUtaW50ZXJhY3Rpb24td29ya2VkLWV4YW1wbGVzJz4KKyAgICAgICAgICAgIDx0aXRsZT5FeGFtcGxlczwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIERlc3BpdGUgdGhlIHByZXZpb3VzIGV4cGxhbmF0aW9ucyB0aGF0IHNob3cgdGhlIGRpZmZlcmVudCBmb3JtcyBvZgorICAgICAgICAgICAgICAgIHZhcmlhYmxlIGRlZmluaXRpb25zLCBpdCBjYW4gYmUgaGFyZCB0byB3b3JrCisgICAgICAgICAgICAgICAgb3V0IGV4YWN0bHkgd2hhdCBoYXBwZW5zIHdoZW4gdmFyaWFibGUgb3BlcmF0b3JzLCBjb25kaXRpb25hbAorICAgICAgICAgICAgICAgIG92ZXJyaWRlcywgYW5kIHVuY29uZGl0aW9uYWwgb3ZlcnJpZGVzIGFyZSBjb21iaW5lZC4KKyAgICAgICAgICAgICAgICBUaGlzIHNlY3Rpb24gcHJlc2VudHMgc29tZSBjb21tb24gc2NlbmFyaW9zIGFsb25nCisgICAgICAgICAgICAgICAgd2l0aCBleHBsYW5hdGlvbnMgZm9yIHZhcmlhYmxlIGludGVyYWN0aW9ucyB0aGF0CisgICAgICAgICAgICAgICAgdHlwaWNhbGx5IGNvbmZ1c2UgdXNlcnMuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZXJlIGlzIG9mdGVuIGNvbmZ1c2lvbiBjb25jZXJuaW5nIHRoZSBvcmRlciBpbiB3aGljaAorICAgICAgICAgICAgICAgIG92ZXJyaWRlcyBhbmQgdmFyaW91cyAiYXBwZW5kIiBvcGVyYXRvcnMgdGFrZSBlZmZlY3QuCisgICAgICAgICAgICAgICAgUmVjYWxsIHRoYXQgYW4gYXBwZW5kIG9yIHByZXBlbmQgb3BlcmF0aW9uIHVzaW5nICJfYXBwZW5kIgorICAgICAgICAgICAgICAgIGFuZCAiX3ByZXBlbmQiIGRvZXMgbm90IHJlc3VsdCBpbiBhbiBpbW1lZGlhdGUgYXNzaWdubWVudAorICAgICAgICAgICAgICAgIGFzIHdvdWxkICIrPSIsICIuPSIsICI9KyIsIG9yICI9LiIuCisgICAgICAgICAgICAgICAgQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBleGFtcGxlOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgT1ZFUlJJREVTID0gImZvbyIKKyAgICAgQSA9ICJaIgorICAgICBBX2Zvb19hcHBlbmQgPSAiWCIKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgRm9yIHRoaXMgY2FzZSwgPGZpbGVuYW1lPkE8L2ZpbGVuYW1lPiBpcworICAgICAgICAgICAgICAgIHVuY29uZGl0aW9uYWxseSBzZXQgdG8gIloiIGFuZCAiWCIgaXMKKyAgICAgICAgICAgICAgICB1bmNvbmRpdGlvbmFsbHkgYW5kIGltbWVkaWF0ZWx5IGFwcGVuZGVkIHRvIHRoZSB2YXJpYWJsZQorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5BX2ZvbzwvZmlsZW5hbWU+LgorICAgICAgICAgICAgICAgIEJlY2F1c2Ugb3ZlcnJpZGVzIGhhdmUgbm90IGJlZW4gYXBwbGllZCB5ZXQsCisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPkFfZm9vPC9maWxlbmFtZT4gaXMgc2V0IHRvICJYIiBkdWUgdG8gdGhlIGFwcGVuZAorICAgICAgICAgICAgICAgIGFuZCA8ZmlsZW5hbWU+QTwvZmlsZW5hbWU+IHNpbXBseSBlcXVhbHMgIloiLgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBBcHBseWluZyBvdmVycmlkZXMsIGhvd2V2ZXIsIGNoYW5nZXMgdGhpbmdzLgorICAgICAgICAgICAgICAgIFNpbmNlICJmb28iIGlzIGxpc3RlZCBpbiA8ZmlsZW5hbWU+T1ZFUlJJREVTPC9maWxlbmFtZT4sCisgICAgICAgICAgICAgICAgdGhlIGNvbmRpdGlvbmFsIHZhcmlhYmxlIDxmaWxlbmFtZT5BPC9maWxlbmFtZT4gaXMgcmVwbGFjZWQKKyAgICAgICAgICAgICAgICB3aXRoIHRoZSAiZm9vIiB2ZXJzaW9uLCB3aGljaCBpcyBlcXVhbCB0byAiWCIuCisgICAgICAgICAgICAgICAgU28gZWZmZWN0aXZlbHksIDxmaWxlbmFtZT5BX2ZvbzwvZmlsZW5hbWU+IHJlcGxhY2VzIDxmaWxlbmFtZT5BPC9maWxlbmFtZT4uCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoaXMgbmV4dCBleGFtcGxlIGNoYW5nZXMgdGhlIG9yZGVyIG9mIHRoZSBvdmVycmlkZSBhbmQKKyAgICAgICAgICAgICAgICB0aGUgYXBwZW5kOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgT1ZFUlJJREVTID0gImZvbyIKKyAgICAgQSA9ICJaIgorICAgICBBX2FwcGVuZF9mb28gPSAiWCIKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgRm9yIHRoaXMgY2FzZSwgYmVmb3JlIG92ZXJyaWRlcyBhcmUgaGFuZGxlZCwKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+QTwvZmlsZW5hbWU+IGlzIHNldCB0byAiWiIgYW5kIDxmaWxlbmFtZT5BX2FwcGVuZF9mb288L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgIGlzIHNldCB0byAiWCIuCisgICAgICAgICAgICAgICAgT25jZSB0aGUgb3ZlcnJpZGUgZm9yICJmb28iIGlzIGFwcGxpZWQsIGhvd2V2ZXIsCisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPkE8L2ZpbGVuYW1lPiBnZXRzIGFwcGVuZGVkIHdpdGggIlgiLgorICAgICAgICAgICAgICAgIENvbnNlcXVlbnRseSwgPGZpbGVuYW1lPkE8L2ZpbGVuYW1lPiBiZWNvbWVzICJaWCIuCisgICAgICAgICAgICAgICAgTm90aWNlIHRoYXQgc3BhY2VzIGFyZSBub3QgYXBwZW5kZWQuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoaXMgbmV4dCBleGFtcGxlIGhhcyB0aGUgb3JkZXIgb2YgdGhlIGFwcGVuZHMgYW5kIG92ZXJyaWRlcyByZXZlcnNlZAorICAgICAgICAgICAgICAgIGJhY2sgYXMgaW4gdGhlIGZpcnN0IGV4YW1wbGU6CisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBPVkVSUklERVMgPSAiZm9vIgorICAgICBBID0gIlkiCisgICAgIEFfZm9vX2FwcGVuZCA9ICJaIgorICAgICBBX2Zvb19hcHBlbmQgKz0gIlgiCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIEZvciB0aGlzIGNhc2UsIGJlZm9yZSBhbnkgb3ZlcnJpZGVzIGFyZSByZXNvbHZlZCwKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+QTwvZmlsZW5hbWU+IGlzIHNldCB0byAiWSIgdXNpbmcgYW4gaW1tZWRpYXRlIGFzc2lnbm1lbnQuCisgICAgICAgICAgICAgICAgQWZ0ZXIgdGhpcyBpbW1lZGlhdGUgYXNzaWdubWVudCwgPGZpbGVuYW1lPkFfZm9vPC9maWxlbmFtZT4gaXMgc2V0CisgICAgICAgICAgICAgICAgdG8gIloiLCBhbmQgdGhlbiBmdXJ0aGVyIGFwcGVuZGVkIHdpdGgKKyAgICAgICAgICAgICAgICAiWCIgbGVhdmluZyB0aGUgdmFyaWFibGUgc2V0IHRvICJaIFgiLgorICAgICAgICAgICAgICAgIEZpbmFsbHksIGFwcGx5aW5nIHRoZSBvdmVycmlkZSBmb3IgImZvbyIgcmVzdWx0cyBpbiB0aGUgY29uZGl0aW9uYWwKKyAgICAgICAgICAgICAgICB2YXJpYWJsZSA8ZmlsZW5hbWU+QTwvZmlsZW5hbWU+IGJlY29taW5nICJaIFgiIChpLmUuCisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPkE8L2ZpbGVuYW1lPiBpcyByZXBsYWNlZCB3aXRoIDxmaWxlbmFtZT5BX2ZvbzwvZmlsZW5hbWU+KS4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhpcyBmaW5hbCBleGFtcGxlIG1peGVzIGluIHNvbWUgdmFyeWluZyBvcGVyYXRvcnM6CisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBBID0gIjEiCisgICAgIEFfYXBwZW5kID0gIjIiCisgICAgIEFfYXBwZW5kID0gIjMiCisgICAgIEEgKz0gIjQiCisgICAgIEEgLj0gIjUiCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIEZvciB0aGlzIGNhc2UsIHRoZSB0eXBlIG9mIGFwcGVuZCBvcGVyYXRvcnMgYXJlIGFmZmVjdGluZyB0aGUKKyAgICAgICAgICAgICAgICBvcmRlciBvZiBhc3NpZ25tZW50cyBhcyBCaXRCYWtlIHBhc3NlcyB0aHJvdWdoIHRoZSBjb2RlCisgICAgICAgICAgICAgICAgbXVsdGlwbGUgdGltZXMuCisgICAgICAgICAgICAgICAgSW5pdGlhbGx5LCA8ZmlsZW5hbWU+QTwvZmlsZW5hbWU+IGlzIHNldCB0byAiMSA0NSIgYmVjYXVzZQorICAgICAgICAgICAgICAgIG9mIHRoZSB0aHJlZSBzdGF0ZW1lbnRzIHRoYXQgdXNlIGltbWVkaWF0ZSBvcGVyYXRvcnMuCisgICAgICAgICAgICAgICAgQWZ0ZXIgdGhlc2UgYXNzaWdubWVudHMgYXJlIG1hZGUsIEJpdEJha2UgYXBwbGllcyB0aGUKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+X2FwcGVuZDwvZmlsZW5hbWU+IG9wZXJhdGlvbnMuCisgICAgICAgICAgICAgICAgVGhvc2Ugb3BlcmF0aW9ucyByZXN1bHQgaW4gPGZpbGVuYW1lPkE8L2ZpbGVuYW1lPiBiZWNvbWluZyAiMSA0NTIzIi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIGlkPSdzaGFyaW5nLWZ1bmN0aW9uYWxpdHknPgorICAgICAgICA8dGl0bGU+U2hhcmluZyBGdW5jdGlvbmFsaXR5PC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEJpdEJha2UgYWxsb3dzIGZvciBtZXRhZGF0YSBzaGFyaW5nIHRocm91Z2ggaW5jbHVkZSBmaWxlcworICAgICAgICAgICAgKDxmaWxlbmFtZT4uaW5jPC9maWxlbmFtZT4pIGFuZCBjbGFzcyBmaWxlcworICAgICAgICAgICAgKDxmaWxlbmFtZT4uYmJjbGFzczwvZmlsZW5hbWU+KS4KKyAgICAgICAgICAgIEZvciBleGFtcGxlLCBzdXBwb3NlIHlvdSBoYXZlIGEgcGllY2Ugb2YgY29tbW9uIGZ1bmN0aW9uYWxpdHkKKyAgICAgICAgICAgIHN1Y2ggYXMgYSB0YXNrIGRlZmluaXRpb24gdGhhdCB5b3Ugd2FudCB0byBzaGFyZSBiZXR3ZWVuCisgICAgICAgICAgICBtb3JlIHRoYW4gb25lIHJlY2lwZS4KKyAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgY3JlYXRpbmcgYSA8ZmlsZW5hbWU+LmJiY2xhc3M8L2ZpbGVuYW1lPgorICAgICAgICAgICAgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBjb21tb24gZnVuY3Rpb25hbGl0eSBhbmQgdGhlbiB1c2luZworICAgICAgICAgICAgdGhlIDxmaWxlbmFtZT5pbmhlcml0PC9maWxlbmFtZT4gZGlyZWN0aXZlIGluIHlvdXIgcmVjaXBlcyB0bworICAgICAgICAgICAgaW5oZXJpdCB0aGUgY2xhc3Mgd291bGQgYmUgYSBjb21tb24gd2F5IHRvIHNoYXJlIHRoZSB0YXNrLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGlzIHNlY3Rpb24gcHJlc2VudHMgdGhlIG1lY2hhbmlzbXMgQml0QmFrZSBwcm92aWRlcyB0bworICAgICAgICAgICAgYWxsb3cgeW91IHRvIHNoYXJlIGZ1bmN0aW9uYWxpdHkgYmV0d2VlbiByZWNpcGVzLgorICAgICAgICAgICAgU3BlY2lmaWNhbGx5LCB0aGUgbWVjaGFuaXNtcyBpbmNsdWRlIDxmaWxlbmFtZT5pbmNsdWRlPC9maWxlbmFtZT4sCisgICAgICAgICAgICA8ZmlsZW5hbWU+aW5oZXJpdDwvZmlsZW5hbWU+LCA8ZmlsZW5hbWU+SU5IRVJJVDwvZmlsZW5hbWU+LCBhbmQKKyAgICAgICAgICAgIDxmaWxlbmFtZT5yZXF1aXJlPC9maWxlbmFtZT4gZGlyZWN0aXZlcy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxzZWN0aW9uIGlkPSdsb2NhdGluZy1pbmNsdWRlLWFuZC1jbGFzcy1maWxlcyc+CisgICAgICAgICAgICA8dGl0bGU+TG9jYXRpbmcgSW5jbHVkZSBhbmQgQ2xhc3MgRmlsZXM8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBCaXRCYWtlIHVzZXMgdGhlCisgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUJCUEFUSCc+PGZpbGVuYW1lPkJCUEFUSDwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgICAgIHZhcmlhYmxlIHRvIGxvY2F0ZSBuZWVkZWQgaW5jbHVkZSBhbmQgY2xhc3MgZmlsZXMuCisgICAgICAgICAgICAgICAgVGhlIDxmaWxlbmFtZT5CQlBBVEg8L2ZpbGVuYW1lPiB2YXJpYWJsZSBpcyBhbmFsb2dvdXMgdG8KKyAgICAgICAgICAgICAgICB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgPGZpbGVuYW1lPlBBVEg8L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgSW4gb3JkZXIgZm9yIGluY2x1ZGUgYW5kIGNsYXNzIGZpbGVzIHRvIGJlIGZvdW5kIGJ5IEJpdEJha2UsCisgICAgICAgICAgICAgICAgdGhleSBuZWVkIHRvIGJlIGxvY2F0ZWQgaW4gYSAiY2xhc3NlcyIgc3ViZGlyZWN0b3J5IHRoYXQgY2FuCisgICAgICAgICAgICAgICAgYmUgZm91bmQgaW4gPGZpbGVuYW1lPkJCUEFUSDwvZmlsZW5hbWU+LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24gaWQ9J2luaGVyaXQtZGlyZWN0aXZlJz4KKyAgICAgICAgICAgIDx0aXRsZT48ZmlsZW5hbWU+aW5oZXJpdDwvZmlsZW5hbWU+IERpcmVjdGl2ZTwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFdoZW4gd3JpdGluZyBhIHJlY2lwZSBvciBjbGFzcyBmaWxlLCB5b3UgY2FuIHVzZSB0aGUKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+aW5oZXJpdDwvZmlsZW5hbWU+IGRpcmVjdGl2ZSB0byBpbmhlcml0IHRoZQorICAgICAgICAgICAgICAgIGZ1bmN0aW9uYWxpdHkgb2YgYSBjbGFzcyAoPGZpbGVuYW1lPi5iYmNsYXNzPC9maWxlbmFtZT4pLgorICAgICAgICAgICAgICAgIEJpdEJha2Ugb25seSBzdXBwb3J0cyB0aGlzIGRpcmVjdGl2ZSB3aGVuIHVzZWQgd2l0aGluIHJlY2lwZQorICAgICAgICAgICAgICAgIGFuZCBjbGFzcyBmaWxlcyAoaS5lLiA8ZmlsZW5hbWU+LmJiPC9maWxlbmFtZT4gYW5kCisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPi5iYmNsYXNzPC9maWxlbmFtZT4pLgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgPGZpbGVuYW1lPmluaGVyaXQ8L2ZpbGVuYW1lPiBkaXJlY3RpdmUgaXMgYSBydWRpbWVudGFyeQorICAgICAgICAgICAgICAgIG1lYW5zIG9mIHNwZWNpZnlpbmcgd2hhdCBjbGFzc2VzIG9mIGZ1bmN0aW9uYWxpdHkgeW91cgorICAgICAgICAgICAgICAgIHJlY2lwZXMgcmVxdWlyZS4KKyAgICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgeW91IGNhbiBlYXNpbHkgYWJzdHJhY3Qgb3V0IHRoZSB0YXNrcyBpbnZvbHZlZCBpbgorICAgICAgICAgICAgICAgIGJ1aWxkaW5nIGEgcGFja2FnZSB0aGF0IHVzZXMgQXV0b2NvbmYgYW5kIEF1dG9tYWtlIGFuZCBwdXQKKyAgICAgICAgICAgICAgICB0aG9zZSB0YXNrcyBpbnRvIGEgY2xhc3MgZmlsZSB0aGF0IGNhbiBiZSB1c2VkIGJ5IHlvdXIgcmVjaXBlLgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBBcyBhbiBleGFtcGxlLCB5b3VyIHJlY2lwZXMgY291bGQgdXNlIHRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlCisgICAgICAgICAgICAgICAgdG8gaW5oZXJpdCBhbiA8ZmlsZW5hbWU+YXV0b3Rvb2xzLmJiY2xhc3M8L2ZpbGVuYW1lPiBmaWxlLgorICAgICAgICAgICAgICAgIFRoZSBjbGFzcyBmaWxlIHdvdWxkIGNvbnRhaW4gY29tbW9uIGZ1bmN0aW9uYWxpdHkgZm9yIHVzaW5nCisgICAgICAgICAgICAgICAgQXV0b3Rvb2xzIHRoYXQgY291bGQgYmUgc2hhcmVkIGFjcm9zcyByZWNpcGVzOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgaW5oZXJpdCBhdXRvdG9vbHMKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBCaXRCYWtlIHdvdWxkIHNlYXJjaCBmb3IgdGhlIGRpcmVjdG9yeQorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5jbGFzc2VzL2F1dG90b29scy5iYmNsYXNzPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICBpbiA8ZmlsZW5hbWU+QkJQQVRIPC9maWxlbmFtZT4uCisgICAgICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gb3ZlcnJpZGUgYW55IHZhbHVlcyBhbmQgZnVuY3Rpb25zIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICBpbmhlcml0ZWQgY2xhc3Mgd2l0aGluIHlvdXIgcmVjaXBlIGJ5IGRvaW5nIHNvCisgICAgICAgICAgICAgICAgICAgIGFmdGVyIHRoZSAiaW5oZXJpdCIgc3RhdGVtZW50LgorICAgICAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uIGlkPSdpbmNsdWRlLWRpcmVjdGl2ZSc+CisgICAgICAgICAgICA8dGl0bGU+PGZpbGVuYW1lPmluY2x1ZGU8L2ZpbGVuYW1lPiBEaXJlY3RpdmU8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBCaXRCYWtlIHVuZGVyc3RhbmRzIHRoZSA8ZmlsZW5hbWU+aW5jbHVkZTwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgZGlyZWN0aXZlLgorICAgICAgICAgICAgICAgIFRoaXMgZGlyZWN0aXZlIGNhdXNlcyBCaXRCYWtlIHRvIHBhcnNlIHdoYXRldmVyIGZpbGUgeW91IHNwZWNpZnksCisgICAgICAgICAgICAgICAgYW5kIHRvIGluc2VydCB0aGF0IGZpbGUgYXQgdGhhdCBsb2NhdGlvbi4KKyAgICAgICAgICAgICAgICBUaGUgZGlyZWN0aXZlIGlzIG11Y2ggbGlrZSBpdHMgZXF1aXZhbGVudCBpbiBNYWtlIGV4Y2VwdAorICAgICAgICAgICAgICAgIHRoYXQgaWYgdGhlIHBhdGggc3BlY2lmaWVkIG9uIHRoZSBpbmNsdWRlIGxpbmUgaXMgYSByZWxhdGl2ZQorICAgICAgICAgICAgICAgIHBhdGgsIEJpdEJha2UgbG9jYXRlcyB0aGUgZmlyc3QgZmlsZSBpdCBjYW4gZmluZAorICAgICAgICAgICAgICAgIHdpdGhpbiA8ZmlsZW5hbWU+QkJQQVRIPC9maWxlbmFtZT4uCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEFzIGFuIGV4YW1wbGUsIHN1cHBvc2UgeW91IG5lZWRlZCBhIHJlY2lwZSB0byBpbmNsdWRlIHNvbWUKKyAgICAgICAgICAgICAgICBzZWxmLXRlc3QgZGVmaW5pdGlvbnM6CisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBpbmNsdWRlIHRlc3RfZGVmcy5pbmMKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgICAgIFRoZSA8ZmlsZW5hbWU+aW5jbHVkZTwvZmlsZW5hbWU+IGRpcmVjdGl2ZSBkb2VzIG5vdAorICAgICAgICAgICAgICAgICAgICBwcm9kdWNlIGFuIGVycm9yIHdoZW4gdGhlIGZpbGUgY2Fubm90IGJlIGZvdW5kLgorICAgICAgICAgICAgICAgICAgICBDb25zZXF1ZW50bHksIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgaWYgdGhlIGZpbGUgeW91CisgICAgICAgICAgICAgICAgICAgIGFyZSBpbmNsdWRpbmcgaXMgZXhwZWN0ZWQgdG8gZXhpc3QsIHlvdSBzaG91bGQgdXNlCisgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3JlcXVpcmUtaW5jbHVzaW9uJz48ZmlsZW5hbWU+cmVxdWlyZTwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIDxmaWxlbmFtZT5pbmNsdWRlPC9maWxlbmFtZT4uCisgICAgICAgICAgICAgICAgICAgIERvaW5nIHNvIG1ha2VzIHN1cmUgdGhhdCBhbiBlcnJvciBpcyBwcm9kdWNlZCBpZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgZmlsZSBjYW5ub3QgYmUgZm91bmQuCisgICAgICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24gaWQ9J3JlcXVpcmUtaW5jbHVzaW9uJz4KKyAgICAgICAgICAgIDx0aXRsZT48ZmlsZW5hbWU+cmVxdWlyZTwvZmlsZW5hbWU+IERpcmVjdGl2ZTwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEJpdEJha2UgdW5kZXJzdGFuZHMgdGhlIDxmaWxlbmFtZT5yZXF1aXJlPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICBkaXJlY3RpdmUuCisgICAgICAgICAgICAgICAgVGhpcyBkaXJlY3RpdmUgYmVoYXZlcyBqdXN0IGxpa2UgdGhlCisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmluY2x1ZGU8L2ZpbGVuYW1lPiBkaXJlY3RpdmUgd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQKKyAgICAgICAgICAgICAgICBCaXRCYWtlIHJhaXNlcyBhIHBhcnNpbmcgZXJyb3IgaWYgdGhlIGZpbGUgdG8gYmUgaW5jbHVkZWQgY2Fubm90CisgICAgICAgICAgICAgICAgYmUgZm91bmQuCisgICAgICAgICAgICAgICAgVGh1cywgYW55IGZpbGUgeW91IHJlcXVpcmUgaXMgaW5zZXJ0ZWQgaW50byB0aGUgZmlsZSB0aGF0IGlzCisgICAgICAgICAgICAgICAgYmVpbmcgcGFyc2VkIGF0IHRoZSBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlLgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBTaW1pbGFyIHRvIGhvdyBCaXRCYWtlIGhhbmRsZXMKKyAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSdpbmNsdWRlLWRpcmVjdGl2ZSc+PGZpbGVuYW1lPmluY2x1ZGU8L2ZpbGVuYW1lPjwvbGluaz4sCisgICAgICAgICAgICAgICAgaWYgdGhlIHBhdGggc3BlY2lmaWVkCisgICAgICAgICAgICAgICAgb24gdGhlIHJlcXVpcmUgbGluZSBpcyBhIHJlbGF0aXZlIHBhdGgsIEJpdEJha2UgbG9jYXRlcworICAgICAgICAgICAgICAgIHRoZSBmaXJzdCBmaWxlIGl0IGNhbiBmaW5kIHdpdGhpbiA8ZmlsZW5hbWU+QkJQQVRIPC9maWxlbmFtZT4uCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEFzIGFuIGV4YW1wbGUsIHN1cHBvc2UgeW91IGhhdmUgdHdvIHZlcnNpb25zIG9mIGEgcmVjaXBlCisgICAgICAgICAgICAgICAgKGUuZy4gPGZpbGVuYW1lPmZvb18xLjIuMi5iYjwvZmlsZW5hbWU+IGFuZAorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5mb29fMi4wLjAuYmI8L2ZpbGVuYW1lPikgd2hlcmUKKyAgICAgICAgICAgICAgICBlYWNoIHZlcnNpb24gY29udGFpbnMgc29tZSBpZGVudGljYWwgZnVuY3Rpb25hbGl0eSB0aGF0IGNvdWxkIGJlCisgICAgICAgICAgICAgICAgc2hhcmVkLgorICAgICAgICAgICAgICAgIFlvdSBjb3VsZCBjcmVhdGUgYW4gaW5jbHVkZSBmaWxlIG5hbWVkIDxmaWxlbmFtZT5mb28uaW5jPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICB0aGF0IGNvbnRhaW5zIHRoZSBjb21tb24gZGVmaW5pdGlvbnMgbmVlZGVkIHRvIGJ1aWxkICJmb28iLgorICAgICAgICAgICAgICAgIFlvdSBuZWVkIHRvIGJlIHN1cmUgPGZpbGVuYW1lPmZvby5pbmM8L2ZpbGVuYW1lPiBpcyBsb2NhdGVkIGluIHRoZQorICAgICAgICAgICAgICAgIHNhbWUgZGlyZWN0b3J5IGFzIHlvdXIgdHdvIHJlY2lwZSBmaWxlcyBhcyB3ZWxsLgorICAgICAgICAgICAgICAgIE9uY2UgdGhlc2UgY29uZGl0aW9ucyBhcmUgc2V0IHVwLCB5b3UgY2FuIHNoYXJlIHRoZSBmdW5jdGlvbmFsaXR5CisgICAgICAgICAgICAgICAgdXNpbmcgYSA8ZmlsZW5hbWU+cmVxdWlyZTwvZmlsZW5hbWU+IGRpcmVjdGl2ZSBmcm9tIHdpdGhpbiBlYWNoCisgICAgICAgICAgICAgICAgcmVjaXBlOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgcmVxdWlyZSBmb28uaW5jCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24gaWQ9J2luaGVyaXQtY29uZmlndXJhdGlvbi1kaXJlY3RpdmUnPgorICAgICAgICAgICAgPHRpdGxlPjxmaWxlbmFtZT5JTkhFUklUPC9maWxlbmFtZT4gQ29uZmlndXJhdGlvbiBEaXJlY3RpdmU8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBXaGVuIGNyZWF0aW5nIGEgY29uZmlndXJhdGlvbiBmaWxlICg8ZmlsZW5hbWU+LmNvbmY8L2ZpbGVuYW1lPiksCisgICAgICAgICAgICAgICAgeW91IGNhbiB1c2UgdGhlIDxmaWxlbmFtZT5JTkhFUklUPC9maWxlbmFtZT4gZGlyZWN0aXZlIHRvCisgICAgICAgICAgICAgICAgaW5oZXJpdCBhIGNsYXNzLgorICAgICAgICAgICAgICAgIEJpdEJha2Ugb25seSBzdXBwb3J0cyB0aGlzIGRpcmVjdGl2ZSB3aGVuIHVzZWQgd2l0aGluCisgICAgICAgICAgICAgICAgYSBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEFzIGFuIGV4YW1wbGUsIHN1cHBvc2UgeW91IG5lZWRlZCB0byBpbmhlcml0IGEgY2xhc3MKKyAgICAgICAgICAgICAgICBmaWxlIGNhbGxlZCA8ZmlsZW5hbWU+YWJjLmJiY2xhc3M8L2ZpbGVuYW1lPiBmcm9tIGEKKyAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIGZpbGUgYXMgZm9sbG93czoKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIElOSEVSSVQgKz0gImFiYyIKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgVGhpcyBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZSBjYXVzZXMgdGhlIG5hbWVkCisgICAgICAgICAgICAgICAgY2xhc3MgdG8gYmUgaW5oZXJpdGVkIGF0IHRoZSBwb2ludCBvZiB0aGUgZGlyZWN0aXZlCisgICAgICAgICAgICAgICAgZHVyaW5nIHBhcnNpbmcuCisgICAgICAgICAgICAgICAgQXMgd2l0aCB0aGUgPGZpbGVuYW1lPmluaGVyaXQ8L2ZpbGVuYW1lPiBkaXJlY3RpdmUsIHRoZQorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT4uYmJjbGFzczwvZmlsZW5hbWU+IGZpbGUgbXVzdCBiZSBsb2NhdGVkIGluIGEKKyAgICAgICAgICAgICAgICAiY2xhc3NlcyIgc3ViZGlyZWN0b3J5IGluIG9uZSBvZiB0aGUgZGlyZWN0b3JpZXMgc3BlY2lmaWVkCisgICAgICAgICAgICAgICAgaW4gPGZpbGVuYW1lPkJCUEFUSDwvZmlsZW5hbWU+LgorICAgICAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgICAgICBCZWNhdXNlIDxmaWxlbmFtZT4uY29uZjwvZmlsZW5hbWU+IGZpbGVzIGFyZSBwYXJzZWQKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgZHVyaW5nIEJpdEJha2UncyBleGVjdXRpb24sIHVzaW5nCisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5JTkhFUklUPC9maWxlbmFtZT4gdG8gaW5oZXJpdCBhIGNsYXNzIGVmZmVjdGl2ZWx5CisgICAgICAgICAgICAgICAgICAgIGluaGVyaXRzIHRoZSBjbGFzcyBnbG9iYWxseSAoaS5lLiBmb3IgYWxsIHJlY2lwZXMpLgorICAgICAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIGlkPSdmdW5jdGlvbnMnPgorICAgICAgICA8dGl0bGU+RnVuY3Rpb25zPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEFzIHdpdGggbW9zdCBsYW5ndWFnZXMsIGZ1bmN0aW9ucyBhcmUgdGhlIGJ1aWxkaW5nIGJsb2NrcyB0aGF0CisgICAgICAgICAgICBhcmUgdXNlZCB0byBidWlsZCB1cCBvcGVyYXRpb25zIGludG8gdGFza3MuCisgICAgICAgICAgICBCaXRCYWtlIHN1cHBvcnRzIHRoZXNlIHR5cGVzIG9mIGZ1bmN0aW9uczoKKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz5TaGVsbCBGdW5jdGlvbnM6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25zIHdyaXR0ZW4gaW4gc2hlbGwgc2NyaXB0IGFuZCBleGVjdXRlZCBlaXRoZXIKKyAgICAgICAgICAgICAgICAgICAgZGlyZWN0bHkgYXMgZnVuY3Rpb25zLCB0YXNrcywgb3IgYm90aC4KKyAgICAgICAgICAgICAgICAgICAgVGhleSBjYW4gYWxzbyBiZSBjYWxsZWQgYnkgb3RoZXIgc2hlbGwgZnVuY3Rpb25zLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPkJpdEJha2UgU3R5bGUgUHl0aG9uIEZ1bmN0aW9uczo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbnMgd3JpdHRlbiBpbiBQeXRob24gYW5kIGV4ZWN1dGVkIGJ5IEJpdEJha2Ugb3Igb3RoZXIKKyAgICAgICAgICAgICAgICAgICAgUHl0aG9uIGZ1bmN0aW9ucyB1c2luZyA8ZmlsZW5hbWU+YmIuYnVpbGQuZXhlY19mdW5jKCk8L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz5QeXRob24gRnVuY3Rpb25zOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9ucyB3cml0dGVuIGluIFB5dGhvbiBhbmQgZXhlY3V0ZWQgYnkgUHl0aG9uLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPkFub255bW91cyBQeXRob24gRnVuY3Rpb25zOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIFB5dGhvbiBmdW5jdGlvbnMgZXhlY3V0ZWQgYXV0b21hdGljYWxseSBkdXJpbmcKKyAgICAgICAgICAgICAgICAgICAgcGFyc2luZy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIFJlZ2FyZGxlc3Mgb2YgdGhlIHR5cGUgb2YgZnVuY3Rpb24sIHlvdSBjYW4gb25seQorICAgICAgICAgICAgZGVmaW5lIHRoZW0gaW4gY2xhc3MgKDxmaWxlbmFtZT4uYmJjbGFzczwvZmlsZW5hbWU+KQorICAgICAgICAgICAgYW5kIHJlY2lwZSAoPGZpbGVuYW1lPi5iYjwvZmlsZW5hbWU+IG9yIDxmaWxlbmFtZT4uaW5jPC9maWxlbmFtZT4pCisgICAgICAgICAgICBmaWxlcy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxzZWN0aW9uIGlkPSdzaGVsbC1mdW5jdGlvbnMnPgorICAgICAgICAgICAgPHRpdGxlPlNoZWxsIEZ1bmN0aW9uczwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEZ1bmN0aW9ucyB3cml0dGVuIGluIHNoZWxsIHNjcmlwdCBhbmQgZXhlY3V0ZWQgZWl0aGVyCisgICAgICAgICAgICAgICAgZGlyZWN0bHkgYXMgZnVuY3Rpb25zLCB0YXNrcywgb3IgYm90aC4KKyAgICAgICAgICAgICAgICBUaGV5IGNhbiBhbHNvIGJlIGNhbGxlZCBieSBvdGhlciBzaGVsbCBmdW5jdGlvbnMuCisgICAgICAgICAgICAgICAgSGVyZSBpcyBhbiBleGFtcGxlIHNoZWxsIGZ1bmN0aW9uIGRlZmluaXRpb246CisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBzb21lX2Z1bmN0aW9uICgpIHsKKyAgICAgICAgIGVjaG8gIkhlbGxvIFdvcmxkIgorICAgICB9CisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIFdoZW4geW91IGNyZWF0ZSB0aGVzZSB0eXBlcyBvZiBmdW5jdGlvbnMgaW4geW91ciByZWNpcGUKKyAgICAgICAgICAgICAgICBvciBjbGFzcyBmaWxlcywgeW91IG5lZWQgdG8gZm9sbG93IHRoZSBzaGVsbCBwcm9ncmFtbWluZworICAgICAgICAgICAgICAgIHJ1bGVzLgorICAgICAgICAgICAgICAgIFRoZSBzY3JpcHRzIGFyZSBleGVjdXRlZCBieSA8ZmlsZW5hbWU+L2Jpbi9zaDwvZmlsZW5hbWU+LAorICAgICAgICAgICAgICAgIHdoaWNoIG1heSBub3QgYmUgYSBiYXNoIHNoZWxsIGJ1dCBtaWdodCBiZSBzb21ldGhpbmcKKyAgICAgICAgICAgICAgICBzdWNoIGFzIDxmaWxlbmFtZT5kYXNoPC9maWxlbmFtZT4uCisgICAgICAgICAgICAgICAgWW91IHNob3VsZCBub3QgdXNlIEJhc2gtc3BlY2lmaWMgc2NyaXB0IChiYXNoaXNtcykuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbiBpZD0nYml0YmFrZS1zdHlsZS1weXRob24tZnVuY3Rpb25zJz4KKyAgICAgICAgICAgIDx0aXRsZT5CaXRCYWtlIFN0eWxlIFB5dGhvbiBGdW5jdGlvbnM8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGVzZSBmdW5jdGlvbnMgYXJlIHdyaXR0ZW4gaW4gUHl0aG9uIGFuZCBleGVjdXRlZCBieQorICAgICAgICAgICAgICAgIEJpdEJha2Ugb3Igb3RoZXIgUHl0aG9uIGZ1bmN0aW9ucyB1c2luZworICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5iYi5idWlsZC5leGVjX2Z1bmMoKTwvZmlsZW5hbWU+LgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBBbiBleGFtcGxlIEJpdEJha2UgZnVuY3Rpb24gaXM6CisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBweXRob24gc29tZV9weXRob25fZnVuY3Rpb24gKCkgeworICAgICAgICAgZC5zZXRWYXIoIlRFWFQiLCAiSGVsbG8gV29ybGQiKQorICAgICAgICAgcHJpbnQgZC5nZXRWYXIoIlRFWFQiLCBUcnVlKQorICAgICB9CisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIEJlY2F1c2UgdGhlIFB5dGhvbiAiYmIiIGFuZCAib3MiIG1vZHVsZXMgYXJlIGFscmVhZHkKKyAgICAgICAgICAgICAgICBpbXBvcnRlZCwgeW91IGRvIG5vdCBuZWVkIHRvIGltcG9ydCB0aGVzZSBtb2R1bGVzLgorICAgICAgICAgICAgICAgIEFsc28gaW4gdGhlc2UgdHlwZXMgb2YgZnVuY3Rpb25zLCB0aGUgZGF0YXN0b3JlICgiZCIpCisgICAgICAgICAgICAgICAgaXMgYSBnbG9iYWwgdmFyaWFibGUgYW5kIGlzIGFsd2F5cyBhdXRvbWF0aWNhbGx5CisgICAgICAgICAgICAgICAgYXZhaWxhYmxlLgorICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbiBpZD0ncHl0aG9uLWZ1bmN0aW9ucyc+CisgICAgICAgICAgICA8dGl0bGU+UHl0aG9uIEZ1bmN0aW9uczwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgd3JpdHRlbiBpbiBQeXRob24gYW5kIGFyZSBleGVjdXRlZCBieQorICAgICAgICAgICAgICAgIG90aGVyIFB5dGhvbiBjb2RlLgorICAgICAgICAgICAgICAgIEV4YW1wbGVzIG9mIFB5dGhvbiBmdW5jdGlvbnMgYXJlIHV0aWxpdHkgZnVuY3Rpb25zCisgICAgICAgICAgICAgICAgdGhhdCB5b3UgaW50ZW5kIHRvIGNhbGwgZnJvbSBpbi1saW5lIFB5dGhvbiBvcgorICAgICAgICAgICAgICAgIGZyb20gd2l0aGluIG90aGVyIFB5dGhvbiBmdW5jdGlvbnMuCisgICAgICAgICAgICAgICAgSGVyZSBpcyBhbiBleGFtcGxlOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgZGVmIGdldF9kZXBlbmRzKGQpOgorICAgICAgICAgaWYgZC5nZXRWYXIoJ1NPTUVDT05ESVRJT04nLCBUcnVlKToKKyAgICAgICAgICAgICByZXR1cm4gImRlcGVuZGVuY3l3aXRoY29uZCIKKyAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgcmV0dXJuICJkZXBlbmRlbmN5IgorICAgICBTT01FQ09ORElUSU9OID0gIjEiCisgICAgIERFUEVORFMgPSAiJHtAZ2V0X2RlcGVuZHMoZCl9IgorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICBUaGlzIHdvdWxkIHJlc3VsdCBpbiA8ZmlsZW5hbWU+REVQRU5EUzwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgY29udGFpbmluZyA8ZmlsZW5hbWU+ZGVwZW5kZW5jeXdpdGhjb25kPC9maWxlbmFtZT4uCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEhlcmUgYXJlIHNvbWUgdGhpbmdzIHRvIGtub3cgYWJvdXQgUHl0aG9uIGZ1bmN0aW9uczoKKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+UHl0aG9uIGZ1bmN0aW9ucyBjYW4gdGFrZSBwYXJhbWV0ZXJzLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5UaGUgQml0QmFrZSBkYXRhc3RvcmUgaXMgbm90CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGF2YWlsYWJsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNlcXVlbnRseSwgeW91IG11c3QgcGFzcyBpdCBpbiBhcyBhCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgdG8gdGhlIGZ1bmN0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5UaGUgImJiIiBhbmQgIm9zIiBQeXRob24gbW9kdWxlcyBhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgYXZhaWxhYmxlLgorICAgICAgICAgICAgICAgICAgICAgICAgWW91IGRvIG5vdCBuZWVkIHRvIGltcG9ydCB0aGVtLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbiBpZD0nYW5vbnltb3VzLXB5dGhvbi1mdW5jdGlvbnMnPgorICAgICAgICAgICAgPHRpdGxlPkFub255bW91cyBQeXRob24gRnVuY3Rpb25zPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgU29tZXRpbWVzIGl0IGlzIHVzZWZ1bCB0byBydW4gc29tZSBjb2RlIGR1cmluZworICAgICAgICAgICAgICAgIHBhcnNpbmcgdG8gc2V0IHZhcmlhYmxlcyBvciB0byBwZXJmb3JtIG90aGVyIG9wZXJhdGlvbnMKKyAgICAgICAgICAgICAgICBwcm9ncmFtbWF0aWNhbGx5LgorICAgICAgICAgICAgICAgIFRvIGRvIHRoaXMsIHlvdSBjYW4gZGVmaW5lIGFuIGFub255bW91cyBQeXRob24gZnVuY3Rpb24uCisgICAgICAgICAgICAgICAgSGVyZSBpcyBhbiBleGFtcGxlIHRoYXQgY29uZGl0aW9uYWxseSBzZXRzIGEKKyAgICAgICAgICAgICAgICB2YXJpYWJsZSBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgYW5vdGhlciB2YXJpYWJsZToKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIHB5dGhvbiBfX2Fub255bW91cyAoKSB7CisgICAgICAgICBpZiBkLmdldFZhcignU09NRVZBUicsIFRydWUpID09ICd2YWx1ZSc6CisgICAgICAgICAgICAgZC5zZXRWYXIoJ0FOT1RIRVJWQVInLCAndmFsdWUyJykKKyAgICAgfQorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICBUaGUgIl9fYW5vbnltb3VzIiBmdW5jdGlvbiBuYW1lIGlzIG9wdGlvbmFsLCBzbyB0aGUKKyAgICAgICAgICAgICAgICBmb2xsb3dpbmcgZXhhbXBsZSBpcyBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byB0aGUgYWJvdmU6CisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBweXRob24gKCkgeworICAgICAgICAgaWYgZC5nZXRWYXIoJ1NPTUVWQVInLCBUcnVlKSA9PSAndmFsdWUnOgorICAgICAgICAgICAgIGQuc2V0VmFyKCdBTk9USEVSVkFSJywgJ3ZhbHVlMicpCisgICAgIH0KKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgQmVjYXVzZSB1bmxpa2Ugb3RoZXIgUHl0aG9uIGZ1bmN0aW9ucyBhbm9ueW1vdXMKKyAgICAgICAgICAgICAgICBQeXRob24gZnVuY3Rpb25zIGFyZSBleGVjdXRlZCBkdXJpbmcgcGFyc2luZywgdGhlCisgICAgICAgICAgICAgICAgImQiIHZhcmlhYmxlIHdpdGhpbiBhbiBhbm9ueW1vdXMgUHl0aG9uIGZ1bmN0aW9uIHJlcHJlc2VudHMKKyAgICAgICAgICAgICAgICB0aGUgZGF0YXN0b3JlIGZvciB0aGUgZW50aXJlIHJlY2lwZS4KKyAgICAgICAgICAgICAgICBDb25zZXF1ZW50bHksIHlvdSBjYW4gc2V0IHZhcmlhYmxlIHZhbHVlcyBoZXJlIGFuZAorICAgICAgICAgICAgICAgIHRob3NlIHZhbHVlcyBjYW4gYmUgcGlja2VkIHVwIGJ5IG90aGVyIGZ1bmN0aW9ucy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uIGlkPSdmbGV4aWJsZS1pbmhlcml0YW5jZS1mb3ItY2xhc3MtZnVuY3Rpb25zJz4KKyAgICAgICAgICAgIDx0aXRsZT5GbGV4aWJsZSBJbmhlcml0YW5jZSBmb3IgQ2xhc3MgRnVuY3Rpb25zPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhyb3VnaCBjb2RpbmcgdGVjaG5pcXVlcyBhbmQgdGhlIHVzZSBvZgorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5FWFBPUlRfRlVOQ1RJT05TPC9maWxlbmFtZT4sIEJpdEJha2Ugc3VwcG9ydHMKKyAgICAgICAgICAgICAgICBleHBvcnRpbmcgYSBmdW5jdGlvbiBmcm9tIGEgY2xhc3Mgc3VjaCB0aGF0IHRoZQorICAgICAgICAgICAgICAgIGNsYXNzIGZ1bmN0aW9uIGFwcGVhcnMgYXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KKyAgICAgICAgICAgICAgICBvZiB0aGUgZnVuY3Rpb24sIGJ1dCBjYW4gc3RpbGwgYmUgY2FsbGVkIGlmIGEgcmVjaXBlCisgICAgICAgICAgICAgICAgaW5oZXJpdGluZyB0aGUgY2xhc3MgbmVlZHMgdG8gZGVmaW5lIGl0cyBvd24gdmVyc2lvbiBvZgorICAgICAgICAgICAgICAgIHRoZSBmdW5jdGlvbi4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVG8gdW5kZXJzdGFuZCB0aGUgYmVuZWZpdHMgb2YgdGhpcyBmZWF0dXJlLCBjb25zaWRlcgorICAgICAgICAgICAgICAgIHRoZSBiYXNpYyBzY2VuYXJpbyB3aGVyZSBhIGNsYXNzIGRlZmluZXMgYSB0YXNrIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgYW5kIHlvdXIgcmVjaXBlIGluaGVyaXRzIHRoZSBjbGFzcy4KKyAgICAgICAgICAgICAgICBJbiB0aGlzIGJhc2ljIHNjZW5hcmlvLCB5b3VyIHJlY2lwZSBpbmhlcml0cyB0aGUgdGFzaworICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGFzIGRlZmluZWQgaW4gdGhlIGNsYXNzLgorICAgICAgICAgICAgICAgIElmIGRlc2lyZWQsIHlvdXIgcmVjaXBlIGNhbiBhZGQgdG8gdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlCisgICAgICAgICAgICAgICAgZnVuY3Rpb24gYnkgdXNpbmcgdGhlICJfcHJlcGVuZCIgb3IgIl9hcHBlbmQiIG9wZXJhdGlvbnMKKyAgICAgICAgICAgICAgICByZXNwZWN0aXZlbHksIG9yIGl0IGNhbiByZWRlZmluZSB0aGUgZnVuY3Rpb24gY29tcGxldGVseS4KKyAgICAgICAgICAgICAgICBIb3dldmVyLCBpZiBpdCByZWRlZmluZXMgdGhlIGZ1bmN0aW9uLCB0aGVyZSBpcworICAgICAgICAgICAgICAgIG5vIG1lYW5zICBmb3IgaXQgdG8gY2FsbCB0aGUgY2xhc3MgdmVyc2lvbiBvZiB0aGUgZnVuY3Rpb24uCisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPkVYUE9SVF9GVU5DVElPTlM8L2ZpbGVuYW1lPiBwcm92aWRlcyBhIG1lY2hhbmlzbQorICAgICAgICAgICAgICAgIHRoYXQgZW5hYmxlcyB0aGUgcmVjaXBlJ3MgdmVyc2lvbiBvZiB0aGUgZnVuY3Rpb24gdG8gY2FsbAorICAgICAgICAgICAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBmdW5jdGlvbi4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVG8gbWFrZSB1c2Ugb2YgdGhpcyB0ZWNobmlxdWUsIHlvdSBuZWVkIHRoZSBmb2xsb3dpbmcKKyAgICAgICAgICAgICAgICB0aGluZ3MgaW4gcGxhY2U6CisgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGNsYXNzIG5lZWRzIHRvIGRlZmluZSB0aGUgZnVuY3Rpb24gYXMgZm9sbG93czoKKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgPHJlcGxhY2VhYmxlPmNsYXNzbmFtZTwvcmVwbGFjZWFibGU+PGZpbGVuYW1lPl88L2ZpbGVuYW1lPjxyZXBsYWNlYWJsZT5mdW5jdGlvbm5hbWU8L3JlcGxhY2VhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGEgY2xhc3MgZmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmJhci5iYmNsYXNzPC9maWxlbmFtZT4gYW5kIGEgZnVuY3Rpb24gbmFtZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5kb19mb288L2ZpbGVuYW1lPiwgdGhlIGNsYXNzIG11c3QgZGVmaW5lIHRoZSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgYXMgZm9sbG93czoKKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgYmFyX2RvX2ZvbworICAgICAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBjbGFzcyBuZWVkcyB0byBjb250YWluIHRoZSA8ZmlsZW5hbWU+RVhQT1JUX0ZVTkNUSU9OUzwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgYXMgZm9sbG93czoKKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgRVhQT1JUX0ZVTkNUSU9OUyA8cmVwbGFjZWFibGU+ZnVuY3Rpb25uYW1lPC9yZXBsYWNlYWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICAgICAgICAgIEZvciBleGFtcGxlLCBjb250aW51aW5nIHdpdGggdGhlIHNhbWUgZXhhbXBsZSwgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgaW4gdGhlIDxmaWxlbmFtZT5iYXIuYmJjbGFzczwvZmlsZW5hbWU+IHdvdWxkIGJlCisgICAgICAgICAgICAgICAgICAgICAgICBhcyBmb2xsb3dzOgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBFWFBPUlRfRlVOQ1RJT05TIGRvX2ZvbworICAgICAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFlvdSBuZWVkIHRvIGNhbGwgdGhlIGZ1bmN0aW9uIGFwcHJvcHJpYXRlbHkgZnJvbSB3aXRoaW4geW91cgorICAgICAgICAgICAgICAgICAgICAgICAgcmVjaXBlLgorICAgICAgICAgICAgICAgICAgICAgICAgQ29udGludWluZyB3aXRoIHRoZSBzYW1lIGV4YW1wbGUsIGlmIHlvdXIgcmVjaXBlCisgICAgICAgICAgICAgICAgICAgICAgICBuZWVkcyB0byBjYWxsIHRoZSBjbGFzcyB2ZXJzaW9uIG9mIHRoZSBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0IHNob3VsZCBjYWxsIDxmaWxlbmFtZT5iYXJfZG9fZm9vPC9maWxlbmFtZT4uCisgICAgICAgICAgICAgICAgICAgICAgICBBc3N1bWluZyA8ZmlsZW5hbWU+ZG9fZm9vPC9maWxlbmFtZT4gd2FzIGEgc2hlbGwgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCA8ZmlsZW5hbWU+RVhQT1JUX0ZVTkNUSU9OUzwvZmlsZW5hbWU+IHdhcyB1c2VkIGFzIGFib3ZlLAorICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlY2lwZSdzIGZ1bmN0aW9uIGNvdWxkIGNvbmRpdGlvbmFsbHkgY2FsbCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIHZlcnNpb24gb2YgdGhlIGZ1bmN0aW9uIGFzIGZvbGxvd3M6CisgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIGRvX2ZvbygpIHsKKyAgICAgICAgICAgICBpZiBbIHNvbWVjb25kaXRpb24gXSA7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgIGJhcl9kb19mb28KKyAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAjIERvIHNvbWV0aGluZyBlbHNlCisgICAgICAgICAgICAgZmkKKyAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgICAgICAgICAgVG8gY2FsbCB5b3VyIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIGZ1bmN0aW9uIGFzIGRlZmluZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGluIHlvdXIgcmVjaXBlLCBjYWxsIGl0IGFzIDxmaWxlbmFtZT5kb19mb288L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIFdpdGggdGhlc2UgY29uZGl0aW9ucyBtZXQsIHlvdXIgc2luZ2xlIHJlY2lwZQorICAgICAgICAgICAgICAgIGNhbiBmcmVlbHkgY2hvb3NlIGJldHdlZW4gdGhlIG9yaWdpbmFsIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgYXMgZGVmaW5lZCBpbiB0aGUgY2xhc3MgZmlsZSBhbmQgdGhlIG1vZGlmaWVkIGZ1bmN0aW9uIGluIHlvdXIgcmVjaXBlLgorICAgICAgICAgICAgICAgIElmIHlvdSBkbyBub3Qgc2V0IHVwIHRoZXNlIGNvbmRpdGlvbnMsIHlvdSBhcmUgbGltaXRlZCB0byB1c2luZyBvbmUgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICBvciB0aGUgb3RoZXIuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiBpZD0ndGFza3MnPgorICAgICAgICA8dGl0bGU+VGFza3M8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGFza3MgYXJlIEJpdEJha2UgZXhlY3V0aW9uIHVuaXRzIHRoYXQgb3JpZ2luYXRlIGFzCisgICAgICAgICAgICBmdW5jdGlvbnMgYW5kIG1ha2UgdXAgdGhlIHN0ZXBzIHRoYXQgQml0QmFrZSBuZWVkcyB0byBydW4KKyAgICAgICAgICAgIGZvciBnaXZlbiByZWNpcGUuCisgICAgICAgICAgICBUYXNrcyBhcmUgb25seSBzdXBwb3J0ZWQgaW4gcmVjaXBlICg8ZmlsZW5hbWU+LmJiPC9maWxlbmFtZT4KKyAgICAgICAgICAgIG9yIDxmaWxlbmFtZT4uaW5jPC9maWxlbmFtZT4pIGFuZCBjbGFzcworICAgICAgICAgICAgKDxmaWxlbmFtZT4uYmJjbGFzczwvZmlsZW5hbWU+KSBmaWxlcy4KKyAgICAgICAgICAgIEJ5IGNvbnZlbnRpb24sIHRhc2sgbmFtZXMgYmVnaW4gd2l0aCB0aGUgc3RyaW5nICJkb18iLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBIZXJlIGlzIGFuIGV4YW1wbGUgb2YgYSB0YXNrIHRoYXQgcHJpbnRzIG91dCB0aGUgZGF0ZToKKyAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgcHl0aG9uIGRvX3ByaW50ZGF0ZSAoKSB7CisgICAgICAgICBpbXBvcnQgdGltZQorICAgICAgICAgcHJpbnQgdGltZS5zdHJmdGltZSgnJVklbSVkJywgdGltZS5nbXRpbWUoKSkKKyAgICAgfQorICAgICBhZGR0YXNrIHByaW50ZGF0ZSBhZnRlciBkb19mZXRjaCBiZWZvcmUgZG9fYnVpbGQKKyAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxzZWN0aW9uIGlkPSdwcm9tb3RpbmctYS1mdW5jdGlvbi10by1hLXRhc2snPgorICAgICAgICAgICAgPHRpdGxlPlByb21vdGluZyBhIEZ1bmN0aW9uIHRvIGEgVGFzazwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEFueSBmdW5jdGlvbiBjYW4gYmUgcHJvbW90ZWQgdG8gYSB0YXNrIGJ5IGFwcGx5aW5nIHRoZQorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5hZGR0YXNrPC9maWxlbmFtZT4gY29tbWFuZC4KKyAgICAgICAgICAgICAgICBUaGUgPGZpbGVuYW1lPmFkZHRhc2s8L2ZpbGVuYW1lPiBjb21tYW5kIGFsc28gZGVzY3JpYmVzCisgICAgICAgICAgICAgICAgaW50ZXItdGFzayBkZXBlbmRlbmNpZXMuCisgICAgICAgICAgICAgICAgSGVyZSBpcyB0aGUgZnVuY3Rpb24gZnJvbSB0aGUgcHJldmlvdXMgc2VjdGlvbiBidXQgd2l0aCB0aGUKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+YWRkdGFzazwvZmlsZW5hbWU+IGNvbW1hbmQgcHJvbW90aW5nIGl0IHRvIGEgdGFzaworICAgICAgICAgICAgICAgIGFuZCBkZWZpbmluZyBzb21lIGRlcGVuZGVuY2llczoKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIHB5dGhvbiBkb19wcmludGRhdGUgKCkgeworICAgICAgICAgaW1wb3J0IHRpbWUKKyAgICAgICAgIHByaW50IHRpbWUuc3RyZnRpbWUoJyVZJW0lZCcsIHRpbWUuZ210aW1lKCkpCisgICAgIH0KKyAgICAgYWRkdGFzayBwcmludGRhdGUgYWZ0ZXIgZG9fZmV0Y2ggYmVmb3JlIGRvX2J1aWxkCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIEluIHRoZSBleGFtcGxlLCB0aGUgZnVuY3Rpb24gaXMgZGVmaW5lZCBhbmQgdGhlbiBwcm9tb3RlZAorICAgICAgICAgICAgICAgIGFzIGEgdGFzay4KKyAgICAgICAgICAgICAgICBUaGUgPGZpbGVuYW1lPmRvX3ByaW50ZGF0ZTwvZmlsZW5hbWU+IHRhc2sgYmVjb21lcyBhIGRlcGVuZGVuY3kgb2YKKyAgICAgICAgICAgICAgICB0aGUgPGZpbGVuYW1lPmRvX2J1aWxkPC9maWxlbmFtZT4gdGFzaywgd2hpY2ggaXMgdGhlIGRlZmF1bHQKKyAgICAgICAgICAgICAgICB0YXNrLgorICAgICAgICAgICAgICAgIEFuZCwgdGhlIDxmaWxlbmFtZT5kb19wcmludGRhdGU8L2ZpbGVuYW1lPiB0YXNrIGlzIGRlcGVuZGVudCB1cG9uCisgICAgICAgICAgICAgICAgdGhlIDxmaWxlbmFtZT5kb19mZXRjaDwvZmlsZW5hbWU+IHRhc2suCisgICAgICAgICAgICAgICAgRXhlY3V0aW9uIG9mIHRoZSA8ZmlsZW5hbWU+ZG9fYnVpbGQ8L2ZpbGVuYW1lPiB0YXNrIHJlc3VsdHMKKyAgICAgICAgICAgICAgICBpbiB0aGUgPGZpbGVuYW1lPmRvX3ByaW50ZGF0ZTwvZmlsZW5hbWU+IHRhc2sgcnVubmluZyBmaXJzdC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uIGlkPSdkZWxldGluZy1hLXRhc2snPgorICAgICAgICAgICAgPHRpdGxlPkRlbGV0aW5nIGEgVGFzazwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEFzIHdlbGwgYXMgYmVpbmcgYWJsZSB0byBhZGQgdGFza3MsIHlvdSBjYW4gZGVsZXRlIHRoZW0uCisgICAgICAgICAgICAgICAgU2ltcGx5IHVzZSB0aGUgPGZpbGVuYW1lPmRlbHRhc2s8L2ZpbGVuYW1lPiBjb21tYW5kIHRvCisgICAgICAgICAgICAgICAgZGVsZXRlIGEgdGFzay4KKyAgICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgdG8gZGVsZXRlIHRoZSBleGFtcGxlIHRhc2sgdXNlZCBpbiB0aGUgcHJldmlvdXMKKyAgICAgICAgICAgICAgICBzZWN0aW9ucywgeW91IHdvdWxkIHVzZToKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIGRlbHRhc2sgcHJpbnRkYXRlCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIElmIHlvdSBkZWxldGUgYSB0YXNrIHVzaW5nIHRoZSA8ZmlsZW5hbWU+ZGVsdGFzazwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgY29tbWFuZCBhbmQgdGhlIHRhc2sgaGFzIGRlcGVuZGVuY2llcywgdGhlIGRlcGVuZGVuY2llcyBhcmUKKyAgICAgICAgICAgICAgICBub3QgcmVjb25uZWN0ZWQuCisgICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IGhhdmUgdGhyZWUgdGFza3MgbmFtZWQKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+ZG9fYTwvZmlsZW5hbWU+LCA8ZmlsZW5hbWU+ZG9fYjwvZmlsZW5hbWU+LCBhbmQKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+ZG9fYzwvZmlsZW5hbWU+LgorICAgICAgICAgICAgICAgIEZ1cnRoZXJtb3JlLCA8ZmlsZW5hbWU+ZG9fYzwvZmlsZW5hbWU+IGlzIGRlcGVuZGVudCBvbgorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5kb19iPC9maWxlbmFtZT4sIHdoaWNoIGluIHR1cm4gaXMgZGVwZW5kZW50IG9uCisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmRvX2E8L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgICAgICBHaXZlbiB0aGlzIHNjZW5hcmlvLCBpZiB5b3UgdXNlIDxmaWxlbmFtZT5kZWx0YXNrPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICB0byBkZWxldGUgPGZpbGVuYW1lPmRvX2I8L2ZpbGVuYW1lPiwgdGhlIGltcGxpY2l0IGRlcGVuZGVuY3kKKyAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXAgYmV0d2VlbiA8ZmlsZW5hbWU+ZG9fYzwvZmlsZW5hbWU+IGFuZAorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5kb19hPC9maWxlbmFtZT4gdGhyb3VnaCA8ZmlsZW5hbWU+ZG9fYjwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgbm8gbG9uZ2VyIGV4aXN0cywgYW5kIDxmaWxlbmFtZT5kb19jPC9maWxlbmFtZT4gZGVwZW5kZW5jaWVzCisgICAgICAgICAgICAgICAgYXJlIG5vdCB1cGRhdGVkIHRvIGluY2x1ZGUgPGZpbGVuYW1lPmRvX2E8L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgICAgICBUaHVzLCA8ZmlsZW5hbWU+ZG9fYzwvZmlsZW5hbWU+IGlzIGZyZWUgdG8gcnVuIGJlZm9yZQorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5kb19hPC9maWxlbmFtZT4uCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIElmIHlvdSB3YW50IGRlcGVuZGVuY2llcyBzdWNoIGFzIHRoZXNlIHRvIHJlbWFpbiBpbnRhY3QsIHVzZQorICAgICAgICAgICAgICAgIHRoZSA8ZmlsZW5hbWU+bm9leGVjPC9maWxlbmFtZT4gdmFyZmxhZyB0byBkaXNhYmxlIHRoZSB0YXNrCisgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiB1c2luZyB0aGUgPGZpbGVuYW1lPmRlbHRhc2s8L2ZpbGVuYW1lPiBjb21tYW5kIHRvCisgICAgICAgICAgICAgICAgZGVsZXRlIGl0OgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgZG9fYltub2V4ZWNdID0gIjEiCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24gaWQ9J3Bhc3NpbmctaW5mb3JtYXRpb24taW50by10aGUtYnVpbGQtdGFzay1lbnZpcm9ubWVudCc+CisgICAgICAgICAgICA8dGl0bGU+UGFzc2luZyBJbmZvcm1hdGlvbiBJbnRvIHRoZSBCdWlsZCBUYXNrIEVudmlyb25tZW50PC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgV2hlbiBydW5uaW5nIGEgdGFzaywgQml0QmFrZSB0aWdodGx5IGNvbnRyb2xzIHRoZSBleGVjdXRpb24KKyAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCBvZiB0aGUgYnVpbGQgdGFza3MgdG8gbWFrZQorICAgICAgICAgICAgICAgIHN1cmUgdW53YW50ZWQgY29udGFtaW5hdGlvbiBmcm9tIHRoZSBidWlsZCBtYWNoaW5lIGNhbm5vdAorICAgICAgICAgICAgICAgIGluZmx1ZW5jZSB0aGUgYnVpbGQuCisgICAgICAgICAgICAgICAgQ29uc2VxdWVudGx5LCBpZiB5b3UgZG8gd2FudCBzb21ldGhpbmcgdG8gZ2V0IHBhc3NlZCBpbnRvIHRoZQorICAgICAgICAgICAgICAgIGJ1aWxkIHRhc2sgZW52aXJvbm1lbnQsIHlvdSBtdXN0IHRha2UgdGhlc2UgdHdvIHN0ZXBzOgorICAgICAgICAgICAgICAgIDxvcmRlcmVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgVGVsbCBCaXRCYWtlIHRvIGxvYWQgd2hhdCB5b3Ugd2FudCBmcm9tIHRoZSBlbnZpcm9ubWVudAorICAgICAgICAgICAgICAgICAgICAgICAgaW50byB0aGUgZGF0YXN0b3JlLgorICAgICAgICAgICAgICAgICAgICAgICAgWW91IGNhbiBkbyBzbyB0aHJvdWdoIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUJCX0VOVl9FWFRSQVdISVRFJz48ZmlsZW5hbWU+QkJfRU5WX0VYVFJBV0hJVEU8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLgorICAgICAgICAgICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIGFzc3VtZSB5b3Ugd2FudCB0byBwcmV2ZW50IHRoZSBidWlsZCBzeXN0ZW0gZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzaW5nIHlvdXIgPGZpbGVuYW1lPiRIT01FLy5jY2FjaGU8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5LgorICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBjb21tYW5kIHRlbGxzIEJpdEJha2UgdG8gbG9hZAorICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPkNDQUNIRV9ESVI8L2ZpbGVuYW1lPiBmcm9tIHRoZSBlbnZpcm9ubWVudCBpbnRvCisgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZGF0YXN0b3JlOgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBleHBvcnQgQkJfRU5WX0VYVFJBV0hJVEU9IiRCQl9FTlZfRVhUUkFXSElURSBDQ0FDSEVfRElSIgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PjwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBUZWxsIEJpdEJha2UgdG8gZXhwb3J0IHdoYXQgeW91IGhhdmUgbG9hZGVkIGludG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhc3RvcmUgdG8gdGhlIHRhc2sgZW52aXJvbm1lbnQgb2YgZXZlcnkgcnVubmluZyB0YXNrLgorICAgICAgICAgICAgICAgICAgICAgICAgTG9hZGluZyBzb21ldGhpbmcgZnJvbSB0aGUgZW52aXJvbm1lbnQgaW50byB0aGUgZGF0YXN0b3JlCisgICAgICAgICAgICAgICAgICAgICAgICAocHJldmlvdXMgc3RlcCkgb25seSBtYWtlcyBpdCBhdmFpbGFibGUgaW4gdGhlIGRhdGFzdG9yZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRvIGV4cG9ydCBpdCB0byB0aGUgdGFzayBlbnZpcm9ubWVudCBvZiBldmVyeSBydW5uaW5nIHRhc2ssCisgICAgICAgICAgICAgICAgICAgICAgICB1c2UgYSBjb21tYW5kIHNpbWlsYXIgdG8gdGhlIGZvbGxvd2luZyBpbiB5b3VyIGxvY2FsIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgPGZpbGVuYW1lPmxvY2FsLmNvbmY8L2ZpbGVuYW1lPiBvciB5b3VyCisgICAgICAgICAgICAgICAgICAgICAgICBkaXN0cmlidXRpb24gY29uZmlndXJhdGlvbiBmaWxlOgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBleHBvcnQgQ0NBQ0hFX0RJUgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSBzaWRlIGVmZmVjdCBvZiB0aGUgcHJldmlvdXMgc3RlcHMgaXMgdGhhdCBCaXRCYWtlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkcyB0aGUgdmFyaWFibGUgYXMgYSBkZXBlbmRlbmN5IG9mIHRoZSBidWlsZCBwcm9jZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhpbmdzIGxpa2UgdGhlIHNldHNjZW5lIGNoZWNrc3Vtcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBkb2luZyBzbyByZXN1bHRzIGluIHVubmVjZXNzYXJ5IHJlYnVpbGRzIG9mIHRhc2tzLCB5b3UgY2FuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpdGVsaXN0IHRoZSB2YXJpYWJsZSBzbyB0aGF0IHRoZSBzZXRzY2VuZSBjb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlcyB0aGUgZGVwZW5kZW5jeSB3aGVuIGl0IGNyZWF0ZXMgY2hlY2tzdW1zLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9ub3RlPjwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvb3JkZXJlZGxpc3Q+CisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFNvbWV0aW1lcywgaXQgaXMgdXNlZnVsIHRvIGJlIGFibGUgdG8gb2J0YWluIGluZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgZnJvbSB0aGUgb3JpZ2luYWwgZXhlY3V0aW9uIGVudmlyb25tZW50LgorICAgICAgICAgICAgICAgIEJpdGJha2Ugc2F2ZXMgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBlbnZpcm9ubWVudCBpbnRvCisgICAgICAgICAgICAgICAgYSBzcGVjaWFsIHZhcmlhYmxlIG5hbWVkCisgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUJCX09SSUdFTlYnPjxmaWxlbmFtZT5CQl9PUklHRU5WPC9maWxlbmFtZT48L2xpbms+LgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgPGZpbGVuYW1lPkJCX09SSUdFTlY8L2ZpbGVuYW1lPiB2YXJpYWJsZSByZXR1cm5zIGEgZGF0YXN0b3JlCisgICAgICAgICAgICAgICAgb2JqZWN0IHRoYXQgY2FuIGJlIHF1ZXJpZWQgdXNpbmcgdGhlIHN0YW5kYXJkIGRhdGFzdG9yZSBvcGVyYXRvcnMKKyAgICAgICAgICAgICAgICBzdWNoIGFzIDxmaWxlbmFtZT5nZXRWYXIoLCBGYWxzZSk8L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgICAgICBUaGUgZGF0YXN0b3JlIG9iamVjdCBpcyB1c2VmdWwsIGZvciBleGFtcGxlLCB0byBmaW5kIHRoZSBvcmlnaW5hbAorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5ESVNQTEFZPC9maWxlbmFtZT4gdmFyaWFibGUuCisgICAgICAgICAgICAgICAgSGVyZSBpcyBhbiBleGFtcGxlOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgb3JpZ2VudiA9IGQuZ2V0VmFyKCJCQl9PUklHRU5WIiwgRmFsc2UpCisgICAgIGJhciA9IG9yaWdlbnYuZ2V0VmFyKCJCQVIiLCBGYWxzZSkKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgVGhlIHByZXZpb3VzIGV4YW1wbGUgcmV0dXJucyA8ZmlsZW5hbWU+QkFSPC9maWxlbmFtZT4gZnJvbSB0aGUgb3JpZ2luYWwKKyAgICAgICAgICAgICAgICBleGVjdXRpb24gZW52aXJvbm1lbnQuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQsIEJpdEJha2UgY2xlYW5zIHRoZSBlbnZpcm9ubWVudCB0byBpbmNsdWRlIG9ubHkgdGhvc2UKKyAgICAgICAgICAgICAgICB0aGluZ3MgZXhwb3J0ZWQgb3IgbGlzdGVkIGluIGl0cyB3aGl0ZWxpc3QgdG8gZW5zdXJlIHRoYXQgdGhlIGJ1aWxkCisgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQgaXMgcmVwcm9kdWNpYmxlIGFuZCBjb25zaXN0ZW50LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24gaWQ9J3ZhcmlhYmxlLWZsYWdzJz4KKyAgICAgICAgPHRpdGxlPlZhcmlhYmxlIEZsYWdzPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFZhcmlhYmxlIGZsYWdzICh2YXJmbGFncykgaGVscCBjb250cm9sIGEgdGFzaydzIGZ1bmN0aW9uYWxpdHkKKyAgICAgICAgICAgIGFuZCBkZXBlbmRlbmNpZXMuCisgICAgICAgICAgICBCaXRCYWtlIHJlYWRzIGFuZCB3cml0ZXMgdmFyZmxhZ3MgdG8gdGhlIGRhdGFzdG9yZSB1c2luZyB0aGUgZm9sbG93aW5nCisgICAgICAgICAgICBjb21tYW5kIGZvcm1zOgorICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICA8cmVwbGFjZWFibGU+dmFyaWFibGU8L3JlcGxhY2VhYmxlPiA9IGQuZ2V0VmFyRmxhZ3MoIjxyZXBsYWNlYWJsZT52YXJpYWJsZTwvcmVwbGFjZWFibGU+IikKKyAgICAgc2VsZi5kLnNldFZhckZsYWdzKCJGT08iLCB7ImZ1bmMiOiBUcnVlfSkKKyAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgV2hlbiB3b3JraW5nIHdpdGggdmFyZmxhZ3MsIHRoZSBzYW1lIHN5bnRheCwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mCisgICAgICAgICAgICBvdmVycmlkZXMsIGFwcGxpZXMuCisgICAgICAgICAgICBJbiBvdGhlciB3b3JkcywgeW91IGNhbiBzZXQsIGFwcGVuZCwgYW5kIHByZXBlbmQgdmFyZmxhZ3MganVzdCBsaWtlCisgICAgICAgICAgICB2YXJpYWJsZXMuCisgICAgICAgICAgICBTZWUgdGhlCisgICAgICAgICAgICAiPGxpbmsgbGlua2VuZD0ndmFyaWFibGUtZmxhZy1zeW50YXgnPlZhcmlhYmxlIEZsYWcgU3ludGF4PC9saW5rPiIKKyAgICAgICAgICAgIHNlY3Rpb24gZm9yIGRldGFpbHMuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEJpdEJha2UgaGFzIGEgZGVmaW5lZCBzZXQgb2YgdmFyZmxhZ3MgYXZhaWxhYmxlIGZvciByZWNpcGVzIGFuZAorICAgICAgICAgICAgY2xhc3Nlcy4KKyAgICAgICAgICAgIFRhc2tzIHN1cHBvcnQgYSBudW1iZXIgb2YgdGhlc2UgZmxhZ3Mgd2hpY2ggY29udHJvbCB2YXJpb3VzCisgICAgICAgICAgICBmdW5jdGlvbmFsaXR5IG9mIHRoZSB0YXNrOgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPmNsZWFuZGlyczo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICBFbXB0eSBkaXJlY3RvcmllcyB0aGF0IHNob3VsZCBjcmVhdGVkIGJlZm9yZSB0aGUgdGFzayBydW5zLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPmRlcGVuZHM6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgQ29udHJvbHMgaW50ZXItdGFzayBkZXBlbmRlbmNpZXMuCisgICAgICAgICAgICAgICAgICAgIFNlZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLURFUEVORFMnPjxmaWxlbmFtZT5ERVBFTkRTPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIGFuZCB0aGUKKyAgICAgICAgICAgICAgICAgICAgIjxsaW5rIGxpbmtlbmQ9J2ludGVyLXRhc2stZGVwZW5kZW5jaWVzJz5JbnRlci1UYXNrIERlcGVuZGVuY2llczwvbGluaz4iCisgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+ZGVwdGFzazo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICBDb250cm9scyB0YXNrIGJ1aWxkLXRpbWUgZGVwZW5kZW5jaWVzLgorICAgICAgICAgICAgICAgICAgICBTZWUgdGhlCisgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1ERVBFTkRTJz48ZmlsZW5hbWU+REVQRU5EUzwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBhbmQgdGhlCisgICAgICAgICAgICAgICAgICAgICI8bGluayBsaW5rZW5kPSdidWlsZC1kZXBlbmRlbmNpZXMnPkJ1aWxkIERlcGVuZGVuY2llczwvbGluaz4iCisgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+ZGlyczo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICBEaXJlY3RvcmllcyB0aGF0IHNob3VsZCBiZSBjcmVhdGVkIGJlZm9yZSB0aGUgdGFzayBydW5zLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPmxvY2tmaWxlczo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIG9uZSBvciBtb3JlIGxvY2tmaWxlcyB0byBsb2NrIHdoaWxlIHRoZSB0YXNrCisgICAgICAgICAgICAgICAgICAgICBleGVjdXRlcy4KKyAgICAgICAgICAgICAgICAgICAgIE9ubHkgb25lIHRhc2sgbWF5IGhvbGQgYSBsb2NrZmlsZSwgYW5kIGFueSB0YXNrIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHRzIHRvIGxvY2sgYW4gYWxyZWFkeSBsb2NrZWQgZmlsZSB3aWxsIGJsb2NrIHVudGlsCisgICAgICAgICAgICAgICAgICAgICB0aGUgbG9jayBpcyByZWxlYXNlZC4KKyAgICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gdXNlIHRoaXMgdmFyaWFibGUgZmxhZyB0byBhY2NvbXBsaXNoIG11dHVhbAorICAgICAgICAgICAgICAgICAgICAgZXhjbHVzaW9uLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPm5vZXhlYzo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICBNYXJrcyB0aGUgdGFza3MgYXMgYmVpbmcgZW1wdHkgYW5kIG5vIGV4ZWN1dGlvbiByZXF1aXJlZC4KKyAgICAgICAgICAgICAgICAgICAgVGhlIDxmaWxlbmFtZT5ub2V4ZWM8L2ZpbGVuYW1lPiBmbGFnIGNhbiBiZSB1c2VkIHRvIHNldCB1cAorICAgICAgICAgICAgICAgICAgICB0YXNrcyBhcyBkZXBlbmRlbmN5IHBsYWNlaG9sZGVycywgb3IgdG8gZGlzYWJsZSB0YXNrcyBkZWZpbmVkCisgICAgICAgICAgICAgICAgICAgIGVsc2V3aGVyZSB0aGF0IGFyZSBub3QgbmVlZGVkIGluIGEgcGFydGljdWxhciByZWNpcGUuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+bm9zdGFtcDo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICBUZWxscyBCaXRCYWtlIHRvIG5vdCBnZW5lcmF0ZSBhIHN0YW1wIGZpbGUgZm9yIGEgdGFzaywKKyAgICAgICAgICAgICAgICAgICAgd2hpY2ggaW1wbGllcyB0aGUgdGFzayBzaG91bGQgYWx3YXlzIGJlIGV4ZWN1dGVkLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPnBvc3RmdW5jczo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICBMaXN0IG9mIGZ1bmN0aW9ucyB0byBjYWxsIGFmdGVyIHRoZSBjb21wbGV0aW9uIG9mIHRoZSB0YXNrLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPnByZWZ1bmNzOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIExpc3Qgb2YgZnVuY3Rpb25zIHRvIGNhbGwgYmVmb3JlIHRoZSB0YXNrIGV4ZWN1dGVzLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPnJkZXBlbmRzOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIENvbnRyb2xzIGludGVyLXRhc2sgcnVudGltZSBkZXBlbmRlbmNpZXMuCisgICAgICAgICAgICAgICAgICAgIFNlZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVJERVBFTkRTJz48ZmlsZW5hbWU+UkRFUEVORFM8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUsIHRoZQorICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItUlJFQ09NTUVORFMnPjxmaWxlbmFtZT5SUkVDT01NRU5EUzwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSwgYW5kIHRoZQorICAgICAgICAgICAgICAgICAgICAiPGxpbmsgbGlua2VuZD0naW50ZXItdGFzay1kZXBlbmRlbmNpZXMnPkludGVyLVRhc2sgRGVwZW5kZW5jaWVzPC9saW5rPiIKKyAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz5yZGVwdGFzazo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICBDb250cm9scyB0YXNrIHJ1bnRpbWUgZGVwZW5kZW5jaWVzLgorICAgICAgICAgICAgICAgICAgICBTZWUgdGhlCisgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1SREVQRU5EUyc+PGZpbGVuYW1lPlJERVBFTkRTPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLCB0aGUKKyAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVJSRUNPTU1FTkRTJz48ZmlsZW5hbWU+UlJFQ09NTUVORFM8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUsIGFuZCB0aGUKKyAgICAgICAgICAgICAgICAgICAgIjxsaW5rIGxpbmtlbmQ9J3J1bnRpbWUtZGVwZW5kZW5jaWVzJz5SdW50aW1lIERlcGVuZGVuY2llczwvbGluaz4iCisgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+cmVjaWRlcHRhc2s6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgV2hlbiBzZXQgaW4gY29uanVuY3Rpb24gd2l0aAorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+cmVjcmRlcHRhc2s8L2ZpbGVuYW1lPiwgc3BlY2lmaWVzIGEgdGFzayB0aGF0CisgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBpbnNwZWN0ZWQgZm9yIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPnJlY3JkZXB0YXNrOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIENvbnRyb2xzIHRhc2sgcmVjdXJzaXZlIHJ1bnRpbWUgZGVwZW5kZW5jaWVzLgorICAgICAgICAgICAgICAgICAgICBTZWUgdGhlCisgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1SREVQRU5EUyc+PGZpbGVuYW1lPlJERVBFTkRTPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLCB0aGUKKyAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVJSRUNPTU1FTkRTJz48ZmlsZW5hbWU+UlJFQ09NTUVORFM8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUsIGFuZCB0aGUKKyAgICAgICAgICAgICAgICAgICAgIjxsaW5rIGxpbmtlbmQ9J3JlY3Vyc2l2ZS1kZXBlbmRlbmNpZXMnPlJlY3Vyc2l2ZSBEZXBlbmRlbmNpZXM8L2xpbms+IgorICAgICAgICAgICAgICAgICAgICBzZWN0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPnN0YW1wLWV4dHJhLWluZm86PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgRXh0cmEgc3RhbXAgaW5mb3JtYXRpb24gdG8gYXBwZW5kIHRvIHRoZSB0YXNrJ3Mgc3RhbXAuCisgICAgICAgICAgICAgICAgICAgIEFzIGFuIGV4YW1wbGUsIE9wZW5FbWJlZGRlZCB1c2VzIHRoaXMgZmxhZyB0byBhbGxvdworICAgICAgICAgICAgICAgICAgICBtYWNoaW5lLXNwZWNpZmljIHRhc2tzLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPnVtYXNrOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIFRoZSB1bWFzayB0byBydW4gdGhlIHRhc2sgdW5kZXIuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFNldmVyYWwgdmFyZmxhZ3MgYXJlIHVzZWZ1bCBmb3IgY29udHJvbGxpbmcgaG93IHNpZ25hdHVyZXMgYXJlCisgICAgICAgICAgICBjYWxjdWxhdGVkIGZvciB2YXJpYWJsZXMuCisgICAgICAgICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzIHByb2Nlc3MsIHNlZSB0aGUKKyAgICAgICAgICAgICI8bGluayBsaW5rZW5kPSdjaGVja3N1bXMnPkNoZWNrc3VtcyAoU2lnbmF0dXJlcyk8L2xpbms+IgorICAgICAgICAgICAgc2VjdGlvbi4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz52YXJkZXBzOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGFkZGl0aW9uYWwKKyAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzIHRvIGFkZCB0byBhIHZhcmlhYmxlJ3MgZGVwZW5kZW5jaWVzCisgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgcHVycG9zZXMgb2YgY2FsY3VsYXRpbmcgaXRzIHNpZ25hdHVyZS4KKyAgICAgICAgICAgICAgICAgICAgQWRkaW5nIHZhcmlhYmxlcyB0byB0aGlzIGxpc3QgaXMgdXNlZnVsLCBmb3IgZXhhbXBsZSwgd2hlbgorICAgICAgICAgICAgICAgICAgICBhIGZ1bmN0aW9uIHJlZmVycyB0byBhIHZhcmlhYmxlIGluIGEgbWFubmVyIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgZG9lcyBub3QgYWxsb3cgQml0QmFrZSB0byBhdXRvbWF0aWNhbGx5IGRldGVybWluZQorICAgICAgICAgICAgICAgICAgICB0aGF0IHRoZSB2YXJpYWJsZSBpcyByZWZlcnJlZCB0by4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz52YXJkZXBzZXhjbHVkZTo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiB2YXJpYWJsZXMKKyAgICAgICAgICAgICAgICAgICAgdGhhdCBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSBhIHZhcmlhYmxlJ3MgZGVwZW5kZW5jaWVzCisgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgcHVycG9zZXMgb2YgY2FsY3VsYXRpbmcgaXRzIHNpZ25hdHVyZS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz52YXJkZXB2YWx1ZTo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICBJZiBzZXQsIGluc3RydWN0cyBCaXRCYWtlIHRvIGlnbm9yZSB0aGUgYWN0dWFsCisgICAgICAgICAgICAgICAgICAgIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSBhbmQgaW5zdGVhZCB1c2UgdGhlIHNwZWNpZmllZAorICAgICAgICAgICAgICAgICAgICB2YWx1ZSB3aGVuIGNhbGN1bGF0aW5nIHRoZSB2YXJpYWJsZSdzIHNpZ25hdHVyZS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz52YXJkZXB2YWx1ZWV4Y2x1ZGU6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIGEgcGlwZS1zZXBhcmF0ZWQgbGlzdCBvZiBzdHJpbmdzIHRvIGV4Y2x1ZGUKKyAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgdmFyaWFibGUncyB2YWx1ZSB3aGVuIGNhbGN1bGF0aW5nIHRoZQorICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSdzIHNpZ25hdHVyZS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIGlkPSdldmVudHMnPgorICAgICAgICA8dGl0bGU+RXZlbnRzPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEJpdEJha2UgYWxsb3dzIGluc3RhbGxhdGlvbiBvZiBldmVudCBoYW5kbGVycyB3aXRoaW4KKyAgICAgICAgICAgIHJlY2lwZSBhbmQgY2xhc3MgZmlsZXMuCisgICAgICAgICAgICBFdmVudHMgYXJlIHRyaWdnZXJlZCBhdCBjZXJ0YWluIHBvaW50cyBkdXJpbmcgb3BlcmF0aW9uLAorICAgICAgICAgICAgc3VjaCBhcyB0aGUgYmVnaW5uaW5nIG9mIGFuIG9wZXJhdGlvbiBhZ2FpbnN0IGEgZ2l2ZW4gcmVjaXBlCisgICAgICAgICAgICAoPGZpbGVuYW1lPiouYmI8L2ZpbGVuYW1lPiBmaWxlKSwgdGhlIHN0YXJ0IG9mIGEgZ2l2ZW4gdGFzaywKKyAgICAgICAgICAgIHRhc2sgZmFpbHVyZSwgdGFzayBzdWNjZXNzLCBhbmQgc28gZm9ydGguCisgICAgICAgICAgICBUaGUgaW50ZW50IGlzIHRvIG1ha2UgaXQgZWFzeSB0byBkbyB0aGluZ3MgbGlrZSBlbWFpbAorICAgICAgICAgICAgbm90aWZpY2F0aW9uIG9uIGJ1aWxkIGZhaWx1cmUuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEZvbGxvd2luZyBpcyBhbiBleGFtcGxlIGV2ZW50IGhhbmRsZXIgdGhhdAorICAgICAgICAgICAgcHJpbnRzIHRoZSBuYW1lIG9mIHRoZSBldmVudCBhbmQgdGhlIGNvbnRlbnQgb2YKKyAgICAgICAgICAgIHRoZSA8ZmlsZW5hbWU+RklMRTwvZmlsZW5hbWU+IHZhcmlhYmxlOgorICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBhZGRoYW5kbGVyIG15Y2xhc3NfZXZlbnRoYW5kbGVyCisgICAgIHB5dGhvbiBteWNsYXNzX2V2ZW50aGFuZGxlcigpIHsKKyAgICAgICAgIGZyb20gYmIuZXZlbnQgaW1wb3J0IGdldE5hbWUKKyAgICAgICAgIGZyb20gYmIgaW1wb3J0IGRhdGEKKyAgICAgICAgIHByaW50KCJUaGUgbmFtZSBvZiB0aGUgRXZlbnQgaXMgJXMiICUgZ2V0TmFtZShlKSkKKyAgICAgICAgIHByaW50KCJUaGUgZmlsZSB3ZSBydW4gZm9yIGlzICVzIiAlIGRhdGEuZ2V0VmFyKCdGSUxFJywgZS5kYXRhLCBUcnVlKSkKKyAgICAgfQorICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgVGhpcyBldmVudCBoYW5kbGVyIGdldHMgY2FsbGVkIGV2ZXJ5IHRpbWUgYW4gZXZlbnQgaXMKKyAgICAgICAgICAgIHRyaWdnZXJlZC4KKyAgICAgICAgICAgIEEgZ2xvYmFsIHZhcmlhYmxlICI8ZmlsZW5hbWU+ZTwvZmlsZW5hbWU+IiBpcyBkZWZpbmVkIGFuZAorICAgICAgICAgICAgIjxmaWxlbmFtZT5lLmRhdGE8L2ZpbGVuYW1lPiIgY29udGFpbnMgYW4gaW5zdGFuY2Ugb2YKKyAgICAgICAgICAgICI8ZmlsZW5hbWU+YmIuZGF0YTwvZmlsZW5hbWU+Ii4KKyAgICAgICAgICAgIFdpdGggdGhlIDxmaWxlbmFtZT5nZXROYW1lKGUpPC9maWxlbmFtZT4gbWV0aG9kLCBvbmUgY2FuIGdldAorICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHRyaWdnZXJlZCBldmVudC4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQmVjYXVzZSB5b3UgcHJvYmFibHkgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBhIHN1YnNldCBvZiBldmVudHMsCisgICAgICAgICAgICB5b3Ugd291bGQgbGlrZWx5IHVzZSB0aGUgPGZpbGVuYW1lPltldmVudG1hc2tdPC9maWxlbmFtZT4gZmxhZworICAgICAgICAgICAgZm9yIHlvdXIgZXZlbnQgaGFuZGxlciB0byBiZSBzdXJlIHRoYXQgb25seSBjZXJ0YWluIGV2ZW50cworICAgICAgICAgICAgdHJpZ2dlciB0aGUgaGFuZGxlci4KKyAgICAgICAgICAgIEdpdmVuIHRoZSBwcmV2aW91cyBleGFtcGxlLCBzdXBwb3NlIHlvdSBvbmx5IHdhbnRlZCB0aGUKKyAgICAgICAgICAgIDxmaWxlbmFtZT5iYi5idWlsZC5UYXNrRmFpbGVkPC9maWxlbmFtZT4gZXZlbnQgdG8gdHJpZ2dlciB0aGF0CisgICAgICAgICAgICBldmVudCBoYW5kbGVyLgorICAgICAgICAgICAgVXNlIHRoZSBmbGFnIGFzIGZvbGxvd3M6CisgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIGFkZGhhbmRsZXIgbXljbGFzc19ldmVudGhhbmRsZXIKKyAgICAgbXljbGFzc19ldmVudGhhbmRsZXJbZXZlbnRtYXNrXSA9ICJiYi5idWlsZC5UYXNrRmFpbGVkIgorICAgICBweXRob24gbXljbGFzc19ldmVudGhhbmRsZXIoKSB7CisgICAgICAgICBmcm9tIGJiLmV2ZW50IGltcG9ydCBnZXROYW1lCisgICAgICAgICBmcm9tIGJiIGltcG9ydCBkYXRhCisgICAgICAgICBwcmludCgiVGhlIG5hbWUgb2YgdGhlIEV2ZW50IGlzICVzIiAlIGdldE5hbWUoZSkpCisgICAgICAgICBwcmludCgiVGhlIGZpbGUgd2UgcnVuIGZvciBpcyAlcyIgJSBkYXRhLmdldFZhcignRklMRScsIGUuZGF0YSwgVHJ1ZSkpCisgICAgIH0KKyAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgRHVyaW5nIGEgc3RhbmRhcmQgYnVpbGQsIHRoZSBmb2xsb3dpbmcgY29tbW9uIGV2ZW50cyBtaWdodCBvY2N1cjoKKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+YmIuZXZlbnQuQ29uZmlnUGFyc2VkKCk8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5iYi5ldmVudC5QYXJzZVN0YXJ0ZWQoKTwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmJiLmV2ZW50LlBhcnNlUHJvZ3Jlc3MoKTwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmJiLmV2ZW50LlBhcnNlQ29tcGxldGVkKCk8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5iYi5ldmVudC5CdWlsZFN0YXJ0ZWQoKTwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmJiLmJ1aWxkLlRhc2tTdGFydGVkKCk8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5iYi5idWlsZC5UYXNrSW52YWxpZCgpPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+YmIuYnVpbGQuVGFza0ZhaWxlZFNpbGVudCgpPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+YmIuYnVpbGQuVGFza0ZhaWxlZCgpPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+YmIuYnVpbGQuVGFza1N1Y2NlZWRlZCgpPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+YmIuZXZlbnQuQnVpbGRDb21wbGV0ZWQoKTwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmJiLmNvb2tlci5Db29rZXJFeGl0KCk8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgSGVyZSBpcyBhIGxpc3Qgb2Ygb3RoZXIgZXZlbnRzIHRoYXQgb2NjdXIgYmFzZWQgb24gc3BlY2lmaWMgcmVxdWVzdHMKKyAgICAgICAgICAgIHRvIHRoZSBzZXJ2ZXI6CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmJiLmV2ZW50LlRyZWVEYXRhUHJlcGFyYXRpb25TdGFydGVkKCk8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5iYi5ldmVudC5UcmVlRGF0YVByZXBhcmF0aW9uUHJvZ3Jlc3M8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5iYi5ldmVudC5UcmVlRGF0YVByZXBhcmF0aW9uQ29tcGxldGVkPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+YmIuZXZlbnQuRGVwVHJlZUdlbmVyYXRlZDwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmJiLmV2ZW50LkNvcmVCYXNlRmlsZXNGb3VuZDwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmJiLmV2ZW50LkNvbmZpZ0ZpbGVQYXRoRm91bmQ8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5iYi5ldmVudC5GaWxlc01hdGNoaW5nRm91bmQ8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5iYi5ldmVudC5Db25maWdGaWxlc0ZvdW5kPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+YmIuZXZlbnQuVGFyZ2V0c1RyZWVHZW5lcmF0ZWQ8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24gaWQ9J3ZhcmlhbnRzLWNsYXNzLWV4dGVuc2lvbi1tZWNoYW5pc20nPgorICAgICAgICA8dGl0bGU+VmFyaWFudHMgLSBDbGFzcyBFeHRlbnNpb24gTWVjaGFuaXNtPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEJpdEJha2Ugc3VwcG9ydHMgdHdvIGZlYXR1cmVzIHRoYXQgZmFjaWxpdGF0ZSBjcmVhdGluZworICAgICAgICAgICAgZnJvbSBhIHNpbmdsZSByZWNpcGUgZmlsZSBtdWx0aXBsZSBpbmNhcm5hdGlvbnMgb2YgdGhhdAorICAgICAgICAgICAgcmVjaXBlIGZpbGUgd2hlcmUgYWxsIGluY2FybmF0aW9ucyBhcmUgYnVpbGRhYmxlLgorICAgICAgICAgICAgVGhlc2UgZmVhdHVyZXMgYXJlIGVuYWJsZWQgdGhyb3VnaCB0aGUKKyAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1CQkNMQVNTRVhURU5EJz48ZmlsZW5hbWU+QkJDTEFTU0VYVEVORDwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgYW5kCisgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItQkJWRVJTSU9OUyc+PGZpbGVuYW1lPkJCVkVSU0lPTlM8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgIHZhcmlhYmxlcy4KKyAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgIFRoZSBtZWNoYW5pc20gZm9yIHRoaXMgY2xhc3MgZXh0ZW5zaW9uIGlzIGV4dHJlbWVseQorICAgICAgICAgICAgICAgIHNwZWNpZmljIHRvIHRoZSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgICAgICAgICBVc3VhbGx5LCB0aGUgcmVjaXBlJ3MKKyAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItUFJPVklERVMnPjxmaWxlbmFtZT5QUk9WSURFUzwvZmlsZW5hbWU+PC9saW5rPiwKKyAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItUE4nPjxmaWxlbmFtZT5QTjwvZmlsZW5hbWU+PC9saW5rPiwgYW5kCisgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLURFUEVORFMnPjxmaWxlbmFtZT5ERVBFTkRTPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgdmFyaWFibGVzIHdvdWxkIG5lZWQgdG8gYmUgbW9kaWZpZWQgYnkgdGhlIGV4dGVuc2lvbiBjbGFzcy4KKyAgICAgICAgICAgICAgICBGb3Igc3BlY2lmaWMgZXhhbXBsZXMsIHNlZSB0aGUgT0UtQ29yZQorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5uYXRpdmU8L2ZpbGVuYW1lPiwgPGZpbGVuYW1lPm5hdGl2ZXNkazwvZmlsZW5hbWU+LAorICAgICAgICAgICAgICAgIGFuZCA8ZmlsZW5hbWU+bXVsdGlsaWI8L2ZpbGVuYW1lPiBjbGFzc2VzLgorICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPjxmaWxlbmFtZT5CQkNMQVNTRVhURU5EPC9maWxlbmFtZT46PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgVGhpcyB2YXJpYWJsZSBpcyBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGNsYXNzZXMgdXNlZCB0byAiZXh0ZW5kIiB0aGUKKyAgICAgICAgICAgICAgICAgICAgcmVjaXBlIGZvciBlYWNoIHZhcmlhbnQuCisgICAgICAgICAgICAgICAgICAgIEhlcmUgaXMgYW4gZXhhbXBsZSB0aGF0IHJlc3VsdHMgaW4gYSBzZWNvbmQgaW5jYXJuYXRpb24gb2YgdGhlIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgICAgcmVjaXBlIGJlaW5nIGF2YWlsYWJsZS4KKyAgICAgICAgICAgICAgICAgICAgVGhpcyBzZWNvbmQgaW5jYXJuYXRpb24gd2lsbCBoYXZlIHRoZSAibmF0aXZlIiBjbGFzcyBpbmhlcml0ZWQuCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgQkJDTEFTU0VYVEVORCA9ICJuYXRpdmUiCisgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD48L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPjxmaWxlbmFtZT5CQlZFUlNJT05TPC9maWxlbmFtZT46PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgVGhpcyB2YXJpYWJsZSBhbGxvd3MgYSBzaW5nbGUgcmVjaXBlIHRvIGJ1aWxkIG11bHRpcGxlIHZlcnNpb25zIG9mIGEKKyAgICAgICAgICAgICAgICAgICAgcHJvamVjdCBmcm9tIGEgc2luZ2xlIHJlY2lwZSBmaWxlLgorICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIGFsc28gc3BlY2lmeSBjb25kaXRpb25hbCBtZXRhZGF0YQorICAgICAgICAgICAgICAgICAgICAodXNpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1PVkVSUklERVMnPjxmaWxlbmFtZT5PVkVSUklERVM8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgbWVjaGFuaXNtKSBmb3IgYSBzaW5nbGUgdmVyc2lvbiwgb3IgYW4gb3B0aW9uYWxseSBuYW1lZCByYW5nZSBvZiB2ZXJzaW9ucy4KKyAgICAgICAgICAgICAgICAgICAgSGVyZSBpcyBhbiBleGFtcGxlOgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIEJCVkVSU0lPTlMgPSAiMS4wIDIuMCBnaXQiCisgICAgIFNSQ19VUklfZ2l0ID0gImdpdDovL3NvbWV1cmwvc29tZXBhdGguZ2l0IgorCisgICAgIEJCVkVSU0lPTlMgPSAiMS4wLlswLTZdOjEuMC4wKyBcIDEuMC5bNy05XToxLjAuNysiCisgICAgIFNSQ19VUklfYXBwZW5kXzEuMC43KyA9ICJmaWxlOi8vc29tZV9wYXRjaF93aGljaF90aGVfbmV3X3ZlcnNpb25zX25lZWQucGF0Y2g7cGF0Y2g9MSIKKyAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgcmFuZ2UgZGVmYXVsdHMgdG8gdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlCisgICAgICAgICAgICAgICAgICAgIHJlY2lwZS4KKyAgICAgICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIGluIE9wZW5FbWJlZGRlZCwgdGhlIHJlY2lwZSBmaWxlCisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5mb29fMS4wLjArLmJiPC9maWxlbmFtZT4gY3JlYXRlcyBhIGRlZmF1bHQgbmFtZSByYW5nZQorICAgICAgICAgICAgICAgICAgICBvZiA8ZmlsZW5hbWU+MS4wLjArPC9maWxlbmFtZT4uCisgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdXNlZnVsIGJlY2F1c2UgdGhlIHJhbmdlIG5hbWUgaXMgbm90IG9ubHkgcGxhY2VkCisgICAgICAgICAgICAgICAgICAgIGludG8gb3ZlcnJpZGVzLCBidXQgaXQgaXMgYWxzbyBtYWRlIGF2YWlsYWJsZSBmb3IgdGhlIG1ldGFkYXRhIHRvIHVzZQorICAgICAgICAgICAgICAgICAgICBpbiB0aGUgdmFyaWFibGUgdGhhdCBkZWZpbmVzIHRoZSBiYXNlIHJlY2lwZSB2ZXJzaW9ucyBmb3IgdXNlIGluCisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5maWxlOi8vPC9maWxlbmFtZT4gc2VhcmNoIHBhdGhzCisgICAgICAgICAgICAgICAgICAgICg8bGluayBsaW5rZW5kPSd2YXItRklMRVNQQVRIJz48ZmlsZW5hbWU+RklMRVNQQVRIPC9maWxlbmFtZT48L2xpbms+KS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIGlkPSdkZXBlbmRlbmNpZXMnPgorICAgICAgICA8dGl0bGU+RGVwZW5kZW5jaWVzPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRvIGFsbG93IGZvciBlZmZpY2llbnQgb3BlcmF0aW9uIGdpdmVuIG11bHRpcGxlIHByb2Nlc3NlcworICAgICAgICAgICAgZXhlY3V0aW5nIGluIHBhcmFsbGVsLCBCaXRCYWtlIGhhbmRsZXMgZGVwZW5kZW5jaWVzIGF0CisgICAgICAgICAgICB0aGUgdGFzayBsZXZlbC4KKyAgICAgICAgICAgIEJpdEJha2Ugc3VwcG9ydHMgYSByb2J1c3QgbWV0aG9kIHRvIGhhbmRsZSB0aGVzZSBkZXBlbmRlbmNpZXMuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgc2V2ZXJhbCB0eXBlcyBvZiBkZXBlbmRlbmN5IG1lY2hhbmlzbXMuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8c2VjdGlvbiBpZD0nZGVwZW5kZW5jaWVzLWludGVybmFsLXRvLXRoZS1iYi1maWxlJz4KKyAgICAgICAgICAgIDx0aXRsZT5EZXBlbmRlbmNpZXMgSW50ZXJuYWwgdG8gdGhlIDxmaWxlbmFtZT4uYmI8L2ZpbGVuYW1lPiBGaWxlPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQml0QmFrZSB1c2VzIHRoZSA8ZmlsZW5hbWU+YWRkdGFzazwvZmlsZW5hbWU+IGRpcmVjdGl2ZQorICAgICAgICAgICAgICAgIHRvIG1hbmFnZSBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgaW50ZXJuYWwgdG8gYSBnaXZlbiByZWNpcGUKKyAgICAgICAgICAgICAgICBmaWxlLgorICAgICAgICAgICAgICAgIFlvdSBjYW4gdXNlIHRoZSA8ZmlsZW5hbWU+YWRkdGFzazwvZmlsZW5hbWU+IGRpcmVjdGl2ZSB0bworICAgICAgICAgICAgICAgIGluZGljYXRlIHdoZW4gYSB0YXNrIGlzIGRlcGVuZGVudCBvbiBvdGhlciB0YXNrcyBvciB3aGVuCisgICAgICAgICAgICAgICAgb3RoZXIgdGFza3MgZGVwZW5kIG9uIHRoYXQgcmVjaXBlLgorICAgICAgICAgICAgICAgIEhlcmUgaXMgYW4gZXhhbXBsZToKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIGFkZHRhc2sgcHJpbnRkYXRlIGFmdGVyIGRvX2ZldGNoIGJlZm9yZSBkb19idWlsZAorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICBJbiB0aGlzIGV4YW1wbGUsIHRoZSA8ZmlsZW5hbWU+cHJpbnRkYXRlPC9maWxlbmFtZT4gdGFzayBpcworICAgICAgICAgICAgICAgIGRlcGVuZHMgb24gdGhlIGNvbXBsZXRpb24gb2YgdGhlIDxmaWxlbmFtZT5kb19mZXRjaDwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgdGFzay4KKyAgICAgICAgICAgICAgICBBbmQsIHRoZSA8ZmlsZW5hbWU+ZG9fYnVpbGQ8L2ZpbGVuYW1lPiBkZXBlbmRzIG9uIHRoZSBjb21wbGV0aW9uCisgICAgICAgICAgICAgICAgb2YgdGhlIDxmaWxlbmFtZT5wcmludGRhdGU8L2ZpbGVuYW1lPiB0YXNrLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24gaWQ9J2J1aWxkLWRlcGVuZGVuY2llcyc+CisgICAgICAgICAgICA8dGl0bGU+QnVpbGQgRGVwZW5kZW5jaWVzPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQml0QmFrZSB1c2VzIHRoZQorICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1ERVBFTkRTJz48ZmlsZW5hbWU+REVQRU5EUzwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgICAgIHZhcmlhYmxlIHRvIG1hbmFnZSBidWlsZCB0aW1lIGRlcGVuZGVuY2llcy4KKyAgICAgICAgICAgICAgICBUaGUgImRlcHRhc2siIHZhcmZsYWcgZm9yIHRhc2tzIHNpZ25pZmllcyB0aGUgdGFzayBvZiBlYWNoCisgICAgICAgICAgICAgICAgaXRlbSBsaXN0ZWQgaW4gPGZpbGVuYW1lPkRFUEVORFM8L2ZpbGVuYW1lPiB0aGF0IG11c3QKKyAgICAgICAgICAgICAgICBjb21wbGV0ZSBiZWZvcmUgdGhhdCB0YXNrIGNhbiBiZSBleGVjdXRlZC4KKyAgICAgICAgICAgICAgICBIZXJlIGlzIGFuIGV4YW1wbGU6CisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBkb19jb25maWd1cmVbZGVwdGFza10gPSAiZG9fcG9wdWxhdGVfc3lzcm9vdCIKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgSW4gdGhpcyBleGFtcGxlLCB0aGUgPGZpbGVuYW1lPmRvX3BvcHVsYXRlX3N5c3Jvb3Q8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgIHRhc2sgb2YgZWFjaCBpdGVtIGluIDxmaWxlbmFtZT5ERVBFTkRTPC9maWxlbmFtZT4gbXVzdCBjb21wbGV0ZSBiZWZvcmUKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+ZG9fY29uZmlndXJlPC9maWxlbmFtZT4gY2FuIGV4ZWN1dGUuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbiBpZD0ncnVudGltZS1kZXBlbmRlbmNpZXMnPgorICAgICAgICAgICAgPHRpdGxlPlJ1bnRpbWUgRGVwZW5kZW5jaWVzPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQml0QmFrZSB1c2VzIHRoZQorICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1QQUNLQUdFUyc+PGZpbGVuYW1lPlBBQ0tBR0VTPC9maWxlbmFtZT48L2xpbms+LAorICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1SREVQRU5EUyc+PGZpbGVuYW1lPlJERVBFTkRTPC9maWxlbmFtZT48L2xpbms+LCBhbmQKKyAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItUlJFQ09NTUVORFMnPjxmaWxlbmFtZT5SUkVDT01NRU5EUzwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgICAgIHZhcmlhYmxlcyB0byBtYW5hZ2UgcnVudGltZSBkZXBlbmRlbmNpZXMuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZSA8ZmlsZW5hbWU+UEFDS0FHRVM8L2ZpbGVuYW1lPiB2YXJpYWJsZSBsaXN0cyBydW50aW1lCisgICAgICAgICAgICAgICAgcGFja2FnZXMuCisgICAgICAgICAgICAgICAgRWFjaCBvZiB0aG9zZSBwYWNrYWdlcyBjYW4gaGF2ZSA8ZmlsZW5hbWU+UkRFUEVORFM8L2ZpbGVuYW1lPiBhbmQKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+UlJFQ09NTUVORFM8L2ZpbGVuYW1lPiBydW50aW1lIGRlcGVuZGVuY2llcy4KKyAgICAgICAgICAgICAgICBUaGUgInJkZXB0YXNrIiBmbGFnIGZvciB0YXNrcyBpcyB1c2VkIHRvIHNpZ25pZnkgdGhlIHRhc2sgb2YgZWFjaAorICAgICAgICAgICAgICAgIGl0ZW0gcnVudGltZSBkZXBlbmRlbmN5IHdoaWNoIG11c3QgaGF2ZSBjb21wbGV0ZWQgYmVmb3JlIHRoYXQKKyAgICAgICAgICAgICAgICB0YXNrIGNhbiBiZSBleGVjdXRlZC4KKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIGRvX3BhY2thZ2VfcWFbcmRlcHRhc2tdID0gImRvX3BhY2thZ2VkYXRhIgorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICBJbiB0aGUgcHJldmlvdXMgZXhhbXBsZSwgdGhlIDxmaWxlbmFtZT5kb19wYWNrYWdlZGF0YTwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgdGFzayBvZiBlYWNoIGl0ZW0gaW4gPGZpbGVuYW1lPlJERVBFTkRTPC9maWxlbmFtZT4gbXVzdCBoYXZlCisgICAgICAgICAgICAgICAgY29tcGxldGVkIGJlZm9yZSA8ZmlsZW5hbWU+ZG9fcGFja2FnZV9xYTwvZmlsZW5hbWU+IGNhbiBleGVjdXRlLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24gaWQ9J3JlY3Vyc2l2ZS1kZXBlbmRlbmNpZXMnPgorICAgICAgICAgICAgPHRpdGxlPlJlY3Vyc2l2ZSBEZXBlbmRlbmNpZXM8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBCaXRCYWtlIHVzZXMgdGhlICJyZWNyZGVwdGFzayIgZmxhZyB0byBtYW5hZ2UKKyAgICAgICAgICAgICAgICByZWN1cnNpdmUgdGFzayBkZXBlbmRlbmNpZXMuCisgICAgICAgICAgICAgICAgQml0QmFrZSBsb29rcyB0aHJvdWdoIHRoZSBidWlsZC10aW1lIGFuZCBydW50aW1lCisgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzIG9mIHRoZSBjdXJyZW50IHJlY2lwZSwgbG9va3MgdGhyb3VnaAorICAgICAgICAgICAgICAgIHRoZSB0YXNrJ3MgaW50ZXItdGFzaworICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llcywgYW5kIHRoZW4gYWRkcyBkZXBlbmRlbmNpZXMgZm9yIHRoZQorICAgICAgICAgICAgICAgIGxpc3RlZCB0YXNrLgorICAgICAgICAgICAgICAgIE9uY2UgQml0QmFrZSBoYXMgYWNjb21wbGlzaGVkIHRoaXMsIGl0IHJlY3Vyc2l2ZWx5IHdvcmtzIHRocm91Z2gKKyAgICAgICAgICAgICAgICB0aGUgZGVwZW5kZW5jaWVzIG9mIHRob3NlIHRhc2tzLgorICAgICAgICAgICAgICAgIEl0ZXJhdGl2ZSBwYXNzZXMgY29udGludWUgdW50aWwgYWxsIGRlcGVuZGVuY2llcyBhcmUgZGlzY292ZXJlZAorICAgICAgICAgICAgICAgIGFuZCBhZGRlZC4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgWW91IG1pZ2h0IHdhbnQgdG8gbm90IG9ubHkgaGF2ZSBCaXRCYWtlIGxvb2sgZm9yCisgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzIG9mIHRob3NlIHRhc2tzLCBidXQgYWxzbyBoYXZlIEJpdEJha2UgbG9vaworICAgICAgICAgICAgICAgIGZvciBidWlsZC10aW1lIGFuZCBydW50aW1lIGRlcGVuZGVuY2llcyBvZiB0aGUgZGVwZW5kZW50CisgICAgICAgICAgICAgICAgdGFza3MgYXMgd2VsbC4KKyAgICAgICAgICAgICAgICBJZiB0aGF0IGlzIHRoZSBjYXNlLCB5b3UgbmVlZCB0byByZWZlcmVuY2UgdGhlIHRhc2sgbmFtZQorICAgICAgICAgICAgICAgIGl0c2VsZiBpbiB0aGUgdGFzayBsaXN0OgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgZG9fYVtyZWNyZGVwdGFza10gPSAiZG9fYSBkb19iIgorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uIGlkPSdpbnRlci10YXNrLWRlcGVuZGVuY2llcyc+CisgICAgICAgICAgICA8dGl0bGU+SW50ZXItVGFzayBEZXBlbmRlbmNpZXM8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBCaXRCYWtlIHVzZXMgdGhlICJkZXBlbmRzIiBmbGFnIGluIGEgbW9yZSBnZW5lcmljIGZvcm0KKyAgICAgICAgICAgICAgICB0byBtYW5hZ2UgaW50ZXItdGFzayBkZXBlbmRlbmNpZXMuCisgICAgICAgICAgICAgICAgVGhpcyBtb3JlIGdlbmVyaWMgZm9ybSBhbGxvd3MgZm9yIGludGVyLWRlcGVuZGVuY3kKKyAgICAgICAgICAgICAgICBjaGVja3MgZm9yIHNwZWNpZmljIHRhc2tzIHJhdGhlciB0aGFuIGNoZWNrcyBmb3IKKyAgICAgICAgICAgICAgICB0aGUgZGF0YSBpbiA8ZmlsZW5hbWU+REVQRU5EUzwvZmlsZW5hbWU+LgorICAgICAgICAgICAgICAgIEhlcmUgaXMgYW4gZXhhbXBsZToKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIGRvX3BhdGNoW2RlcGVuZHNdID0gInF1aWx0LW5hdGl2ZTpkb19wb3B1bGF0ZV9zeXNyb290IgorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICBJbiB0aGlzIGV4YW1wbGUsIHRoZSA8ZmlsZW5hbWU+ZG9fcG9wdWxhdGVfc3lzcm9vdDwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgdGFzayBvZiB0aGUgdGFyZ2V0IDxmaWxlbmFtZT5xdWlsdC1uYXRpdmU8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgIG11c3QgaGF2ZSBjb21wbGV0ZWQgYmVmb3JlIHRoZQorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5kb19wYXRjaDwvZmlsZW5hbWU+IHRhc2sgY2FuIGV4ZWN1dGUuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZSAicmRlcGVuZHMiIGZsYWcgd29ya3MgaW4gYSBzaW1pbGFyIHdheSBidXQgdGFrZXMgdGFyZ2V0cworICAgICAgICAgICAgICAgIGluIHRoZSBydW50aW1lIG5hbWVzcGFjZSBpbnN0ZWFkIG9mIHRoZSBidWlsZC10aW1lIGRlcGVuZGVuY3kKKyAgICAgICAgICAgICAgICBuYW1lc3BhY2UuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiBpZD0nYWNjZXNzaW5nLWRhdGFzdG9yZS12YXJpYWJsZXMtdXNpbmctcHl0aG9uJz4KKyAgICAgICAgPHRpdGxlPkFjY2Vzc2luZyBEYXRhc3RvcmUgVmFyaWFibGVzIFVzaW5nIFB5dGhvbjwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBJdCBpcyBvZnRlbiBuZWNlc3NhcnkgdG8gYWNjZXNzIHZhcmlhYmxlcyBpbiB0aGUKKyAgICAgICAgICAgIEJpdEJha2UgZGF0YXN0b3JlIHVzaW5nIFB5dGhvbiBmdW5jdGlvbnMuCisgICAgICAgICAgICBUaGUgQml0YmFrZSBkYXRhc3RvcmUgaGFzIGFuIEFQSSB0aGF0IGFsbG93cyB5b3UgdGhpcworICAgICAgICAgICAgYWNjZXNzLgorICAgICAgICAgICAgSGVyZSBpcyBhIGxpc3Qgb2YgYXZhaWxhYmxlIG9wZXJhdGlvbnM6CisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIDxpbmZvcm1hbHRhYmxlIGZyYW1lPSdub25lJz4KKyAgICAgICAgICAgICAgICA8dGdyb3VwIGNvbHM9JzInIGFsaWduPSdsZWZ0JyBjb2xzZXA9JzEnIHJvd3NlcD0nMSc+CisgICAgICAgICAgICAgICAgICAgIDxjb2xzcGVjIGNvbG5hbWU9J2MxJyBjb2x3aWR0aD0nMSonLz4KKyAgICAgICAgICAgICAgICAgICAgPGNvbHNwZWMgY29sbmFtZT0nYzInIGNvbHdpZHRoPScxKicvPgorICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBhbGlnbj0ibGVmdCI+PGVtcGhhc2lzPk9wZXJhdGlvbjwvZW1waGFzaXM+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgYWxpZ249ImxlZnQiPjxlbXBoYXNpcz5EZXNjcmlwdGlvbjwvZW1waGFzaXM+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBhbGlnbj0ibGVmdCI+PGZpbGVuYW1lPmQuZ2V0VmFyKCJYIiwgZXhwYW5kPUZhbHNlKTwvZmlsZW5hbWU+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgYWxpZ249ImxlZnQiPlJldHVybnMgdGhlIHZhbHVlIG9mIHZhcmlhYmxlICJYIi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNpbmcgImV4cGFuZD1UcnVlIiBleHBhbmRzIHRoZSB2YWx1ZS48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBhbGlnbj0ibGVmdCI+PGZpbGVuYW1lPmQuc2V0VmFyKCJYIiwgInZhbHVlIik8L2ZpbGVuYW1lPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGFsaWduPSJsZWZ0Ij5TZXRzIHRoZSB2YXJpYWJsZSAiWCIgdG8gInZhbHVlIi48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBhbGlnbj0ibGVmdCI+PGZpbGVuYW1lPmQuYXBwZW5kVmFyKCJYIiwgInZhbHVlIik8L2ZpbGVuYW1lPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGFsaWduPSJsZWZ0Ij5BZGRzICJ2YWx1ZSIgdG8gdGhlIGVuZCBvZiB0aGUgdmFyaWFibGUgIlgiLjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGFsaWduPSJsZWZ0Ij48ZmlsZW5hbWU+ZC5wcmVwZW5kVmFyKCJYIiwgInZhbHVlIik8L2ZpbGVuYW1lPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGFsaWduPSJsZWZ0Ij5BZGRzICJ2YWx1ZSIgdG8gdGhlIHN0YXJ0IG9mIHRoZSB2YXJpYWJsZSAiWCIuPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgYWxpZ249ImxlZnQiPjxmaWxlbmFtZT5kLmRlbFZhcigiWCIpPC9maWxlbmFtZT48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBhbGlnbj0ibGVmdCI+RGVsZXRlcyB0aGUgdmFyaWFibGUgIlgiIGZyb20gdGhlIGRhdGFzdG9yZS48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBhbGlnbj0ibGVmdCI+PGZpbGVuYW1lPmQucmVuYW1lVmFyKCJYIiwgIlkiKTwvZmlsZW5hbWU+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgYWxpZ249ImxlZnQiPlJlbmFtZXMgdGhlIHZhcmlhYmxlICJYIiB0byAiWSIuPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgYWxpZ249ImxlZnQiPjxmaWxlbmFtZT5kLmdldFZhckZsYWcoIlgiLCBmbGFnLCBleHBhbmQ9RmFsc2UpPC9maWxlbmFtZT48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBhbGlnbj0ibGVmdCI+R2V0cyB0aGVuIG5hbWVkIGZsYWcgZnJvbSB0aGUgdmFyaWFibGUgIlgiLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2luZyAiZXhwYW5kPVRydWUiIGV4cGFuZHMgdGhlIG5hbWVkIGZsYWcuPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgYWxpZ249ImxlZnQiPjxmaWxlbmFtZT5kLnNldFZhckZsYWcoIlgiLCBmbGFnLCAidmFsdWUiKTwvZmlsZW5hbWU+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgYWxpZ249ImxlZnQiPlNldHMgdGhlIG5hbWVkIGZsYWcgZm9yIHZhcmlhYmxlICJYIiB0byAidmFsdWUiLjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGFsaWduPSJsZWZ0Ij48ZmlsZW5hbWU+ZC5hcHBlbmRWYXJGbGFnKCJYIiwgZmxhZywgInZhbHVlIik8L2ZpbGVuYW1lPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGFsaWduPSJsZWZ0Ij5BcHBlbmRzICJ2YWx1ZSIgdG8gdGhlIG5hbWVkIGZsYWcgb24gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgIlgiLjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGFsaWduPSJsZWZ0Ij48ZmlsZW5hbWU+ZC5wcmVwZW5kVmFyRmxhZygiWCIsIGZsYWcsICJ2YWx1ZSIpPC9maWxlbmFtZT48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBhbGlnbj0ibGVmdCI+UHJlcGVuZHMgInZhbHVlIiB0byB0aGUgbmFtZWQgZmxhZyBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB2YXJpYWJsZSAiWCIuPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgYWxpZ249ImxlZnQiPjxmaWxlbmFtZT5kLmRlbFZhckZsYWcoIlgiLCBmbGFnKTwvZmlsZW5hbWU+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgYWxpZ249ImxlZnQiPkRlbGV0ZXMgdGhlIG5hbWVkIGZsYWcgb24gdGhlIHZhcmlhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJYIiBmcm9tIHRoZSBkYXRhc3RvcmUuPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgYWxpZ249ImxlZnQiPjxmaWxlbmFtZT5kLnNldFZhckZsYWdzKCJYIiwgZmxhZ3NkaWN0KTwvZmlsZW5hbWU+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgYWxpZ249ImxlZnQiPlNldHMgdGhlIGZsYWdzIHNwZWNpZmllZCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgPGZpbGVuYW1lPmZsYWdzZGljdCgpPC9maWxlbmFtZT4gcGFyYW1ldGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+c2V0VmFyRmxhZ3M8L2ZpbGVuYW1lPiBkb2VzIG5vdCBjbGVhciBwcmV2aW91cyBmbGFncy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpbmsgb2YgdGhpcyBvcGVyYXRpb24gYXMgPGZpbGVuYW1lPmFkZFZhckZsYWdzPC9maWxlbmFtZT4uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgYWxpZ249ImxlZnQiPjxmaWxlbmFtZT5kLmdldFZhckZsYWdzKCJYIik8L2ZpbGVuYW1lPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGFsaWduPSJsZWZ0Ij5SZXR1cm5zIGEgPGZpbGVuYW1lPmZsYWdzZGljdDwvZmlsZW5hbWU+IG9mIHRoZSBmbGFncyBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHZhcmlhYmxlICJYIi48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBhbGlnbj0ibGVmdCI+PGZpbGVuYW1lPmQuZGVsVmFyRmxhZ3MoIlgiKTwvZmlsZW5hbWU+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgYWxpZ249ImxlZnQiPkRlbGV0ZXMgYWxsIHRoZSBmbGFncyBmb3IgdGhlIHZhcmlhYmxlICJYIi48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiBpZD0ndGFzay1jaGVja3N1bXMtYW5kLXNldHNjZW5lJz4KKyAgICAgICAgPHRpdGxlPlRhc2sgQ2hlY2tzdW1zIGFuZCBTZXRzY2VuZTwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBCaXRCYWtlIHVzZXMgY2hlY2tzdW1zIChvciBzaWduYXR1cmVzKSBhbG9uZyB3aXRoIHRoZSBzZXRzY2VuZQorICAgICAgICAgICAgdG8gZGV0ZXJtaW5lIGlmIGEgdGFzayBuZWVkcyB0byBiZSBydW4uCisgICAgICAgICAgICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBwcm9jZXNzLgorICAgICAgICAgICAgVG8gaGVscCB1bmRlcnN0YW5kIGhvdyBCaXRCYWtlIGRvZXMgdGhpcywgdGhlIHNlY3Rpb24gYXNzdW1lcyBhbgorICAgICAgICAgICAgT3BlbkVtYmVkZGVkIG1ldGFkYXRhLWJhc2VkIGV4YW1wbGUuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoaXMgbGlzdCBpcyBhIHBsYWNlIGhvbGRlciBvZiBjb250ZW50IGV4aXN0ZWQgZnJvbSBwcmV2aW91cyB3b3JrCisgICAgICAgICAgICBvbiB0aGUgbWFudWFsLgorICAgICAgICAgICAgU29tZSBvciBhbGwgb2YgaXQgcHJvYmFibHkgbmVlZHMgaW50ZWdyYXRlZCBpbnRvIHRoZSBzdWJzZWN0aW9ucworICAgICAgICAgICAgdGhhdCBtYWtlIHVwIHRoaXMgc2VjdGlvbi4KKyAgICAgICAgICAgIEZvciBub3csIEkgaGF2ZSBqdXN0IHByb3ZpZGVkIGEgc2hvcnQgZ2xvc3NhcnktbGlrZSBkZXNjcmlwdGlvbgorICAgICAgICAgICAgZm9yIGVhY2ggdmFyaWFibGUuCisgICAgICAgICAgICBVbHRpbWF0ZWx5LCB0aGlzIGxpc3QgZ29lcyBhd2F5LgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGZpbGVuYW1lPlNUQU1QPC9maWxlbmFtZT46CisgICAgICAgICAgICAgICAgICAgIFRoZSBiYXNlIHBhdGggdG8gY3JlYXRlIHN0YW1wIGZpbGVzLjwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZmlsZW5hbWU+U1RBTVBDTEVBTjwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIEFnYWluLCB0aGUgYmFzZSBwYXRoIHRvIGNyZWF0ZSBzdGFtcCBmaWxlcyBidXQgY2FuIHVzZSB3aWxkY2FyZHMKKyAgICAgICAgICAgICAgICAgICAgZm9yIG1hdGNoaW5nIGEgcmFuZ2Ugb2YgZmlsZXMgZm9yIGNsZWFuIG9wZXJhdGlvbnMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZmlsZW5hbWU+QkJfU1RBTVBfV0hJVEVMSVNUPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgTGlzdHMgc3RhbXAgZmlsZXMgdGhhdCBhcmUgbG9va2VkIGF0IHdoZW4gdGhlIHN0YW1wIHBvbGljeQorICAgICAgICAgICAgICAgICAgICBpcyAid2hpdGVsaXN0Ii4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxmaWxlbmFtZT5CQl9TVEFNUF9QT0xJQ1k8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICBEZWZpbmVzIHRoZSBtb2RlIGZvciBjb21wYXJpbmcgdGltZXN0YW1wcyBvZiBzdGFtcCBmaWxlcy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxmaWxlbmFtZT5CQl9IQVNIQ0hFQ0tfRlVOQ1RJT048L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGNhbGwgZHVyaW5nCisgICAgICAgICAgICAgICAgICAgIHRoZSAic2V0c2NlbmUiIHBhcnQgb2YgdGhlIHRhc2sncyBleGVjdXRpb24gaW4gb3JkZXIKKyAgICAgICAgICAgICAgICAgICAgdG8gdmFsaWRhdGUgdGhlIGxpc3Qgb2YgdGFzayBoYXNoZXMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZmlsZW5hbWU+QkJfU0VUU0NFTkVfVkVSSUZZX0ZVTkNUSU9OPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIGEgZnVuY3Rpb24gdG8gY2FsbCB0aGF0IHZlcmlmaWVzIHRoZSBsaXN0IG9mCisgICAgICAgICAgICAgICAgICAgIHBsYW5uZWQgdGFzayBleGVjdXRpb24gYmVmb3JlIHRoZSBtYWluIHRhc2sgZXhlY3V0aW9uCisgICAgICAgICAgICAgICAgICAgIGhhcHBlbnMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZmlsZW5hbWU+QkJfU0VUU0NFTkVfREVQVkFMSUQ8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgYSBmdW5jdGlvbiBCaXRCYWtlIGNhbGxzIHRoYXQgZGV0ZXJtaW5lcworICAgICAgICAgICAgICAgICAgICB3aGV0aGVyIEJpdEJha2UgcmVxdWlyZXMgYSBzZXRzY2VuZSBkZXBlbmRlbmN5IHRvCisgICAgICAgICAgICAgICAgICAgIGJlIG1ldC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxmaWxlbmFtZT5CQl9UQVNLSEFTSDwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIFdpdGhpbiBhbiBleGVjdXRpbmcgdGFzaywgdGhpcyB2YXJpYWJsZSBob2xkcyB0aGUgaGFzaAorICAgICAgICAgICAgICAgICAgICBvZiB0aGUgdGFzayBhcyByZXR1cm5lZCBieSB0aGUgY3VycmVudGx5IGVuYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlIGdlbmVyYXRvci4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKzwvY2hhcHRlcj4KZGlmZiAtLWdpdCBhL2JpdGJha2UvZG9jL2JpdGJha2UtdXNlci1tYW51YWwvYml0YmFrZS11c2VyLW1hbnVhbC1yZWYtdmFyaWFibGVzLnhtbCBiL2JpdGJha2UvZG9jL2JpdGJha2UtdXNlci1tYW51YWwvYml0YmFrZS11c2VyLW1hbnVhbC1yZWYtdmFyaWFibGVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWUxYjk1Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9kb2MvYml0YmFrZS11c2VyLW1hbnVhbC9iaXRiYWtlLXVzZXItbWFudWFsLXJlZi12YXJpYWJsZXMueG1sCkBAIC0wLDAgKzEsMjI2MiBAQAorPCFET0NUWVBFIGNoYXB0ZXIgUFVCTElDICItLy9PQVNJUy8vRFREIERvY0Jvb2sgWE1MIFY0LjIvL0VOIgorImh0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvZG9jYm9vay94bWwvNC4yL2RvY2Jvb2t4LmR0ZCIKK1s8IUVOVElUWSAlIHBva3kgU1lTVEVNICIuLi9wb2t5LmVudCI+ICVwb2t5OyBdID4KKworPCEtLSBEdW1teSBjaGFwdGVyIC0tPgorPGNoYXB0ZXIgaWQ9J3JlZi12YXJpYWJsZXMtZ2xvcyc+CisKKzx0aXRsZT5WYXJpYWJsZXMgR2xvc3Nhcnk8L3RpdGxlPgorCis8cGFyYT4KKyAgICBUaGlzIGNoYXB0ZXIgbGlzdHMgY29tbW9uIHZhcmlhYmxlcyB1c2VkIGJ5IEJpdEJha2UgYW5kIGdpdmVzIGFuIG92ZXJ2aWV3CisgICAgb2YgdGhlaXIgZnVuY3Rpb24gYW5kIGNvbnRlbnRzLgorPC9wYXJhPgorCis8bm90ZT4KKyAgICBGb2xsb3dpbmcgYXJlIHNvbWUgcG9pbnRzIHJlZ2FyZGluZyB0aGUgdmFyaWFibGVzIGxpc3RlZCBpbiB0aGlzIGdsb3NzYXJ5OgorICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgIDxsaXN0aXRlbT48cGFyYT5UaGUgdmFyaWFibGVzIGxpc3RlZCBpbiB0aGlzIGdsb3NzYXJ5CisgICAgICAgICAgICBhcmUgc3BlY2lmaWMgdG8gQml0QmFrZS4KKyAgICAgICAgICAgIENvbnNlcXVlbnRseSwgdGhlIGRlc2NyaXB0aW9ucyBhcmUgbGltaXRlZCB0byB0aGF0IGNvbnRleHQuCisgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgPGxpc3RpdGVtPjxwYXJhPkFsc28sIHZhcmlhYmxlcyBleGlzdCBpbiBvdGhlciBzeXN0ZW1zIHRoYXQgdXNlIEJpdEJha2UKKyAgICAgICAgICAgIChlLmcuIFRoZSBZb2N0byBQcm9qZWN0IGFuZCBPcGVuRW1iZWRkZWQpIHRoYXQgaGF2ZSBuYW1lcyBpZGVudGljYWwKKyAgICAgICAgICAgIHRvIHRob3NlIGZvdW5kIGluIHRoaXMgZ2xvc3NhcnkuCisgICAgICAgICAgICBGb3Igc3VjaCBjYXNlcywgdGhlIHZhcmlhYmxlcyBpbiB0aG9zZSBzeXN0ZW1zIGV4dGVuZCB0aGUKKyAgICAgICAgICAgIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIHZhcmlhYmxlIGFzIGl0IGlzIGRlc2NyaWJlZCBoZXJlIGluCisgICAgICAgICAgICB0aGlzIGdsb3NzYXJ5LgorICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgIDxsaXN0aXRlbT48cGFyYT5GaW5hbGx5LCB0aGVyZSBhcmUgdmFyaWFibGVzIG1lbnRpb25lZCBpbiB0aGlzCisgICAgICAgICAgICBnbG9zc2FyeSB0aGF0IGRvIG5vdCBhcHBlYXIgaW4gdGhlIEJpdEJha2UgZ2xvc3NhcnkuCisgICAgICAgICAgICBUaGVzZSBvdGhlciB2YXJpYWJsZXMgYXJlIHZhcmlhYmxlcyB1c2VkIGluIHN5c3RlbXMgdGhhdCB1c2UKKyAgICAgICAgICAgIEJpdEJha2UuCisgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICA8L2l0ZW1pemVkbGlzdD4KKzwvbm90ZT4KKworPGdsb3NzYXJ5IGlkPSdyZWYtdmFyaWFibGVzLWdsb3NzYXJ5Jz4KKworICAgIDxwYXJhPgorICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1BU1NVTUVfUFJPVklERUQnPkE8L2xpbms+CisgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUInPkI8L2xpbms+CisgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUNBQ0hFJz5DPC9saW5rPgorICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1ERUZBVUxUX1BSRUZFUkVOQ0UnPkQ8L2xpbms+CisgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUVYQ0xVREVfRlJPTV9XT1JMRCc+RTwvbGluaz4KKyAgICAgICA8bGluayBsaW5rZW5kPSd2YXItRkFLRVJPT1QnPkY8L2xpbms+CisgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUdJVERJUic+RzwvbGluaz4KKyAgICAgICA8bGluayBsaW5rZW5kPSd2YXItSEdESVInPkg8L2xpbms+Cis8IS0tICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1JQ0VDQ19ESVNBQkxFRCc+STwvbGluaz4gLS0+Cis8IS0tICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLWdsb3NzYXJ5LWonPko8L2xpbms+IC0tPgorPCEtLSAgICAgICA8bGluayBsaW5rZW5kPSd2YXItS0FSQ0gnPks8L2xpbms+IC0tPgorICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1MQVlFUkRFUEVORFMnPkw8L2xpbms+CisgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLU1JUlJPUlMnPk08L2xpbms+Cis8IS0tICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLWdsb3NzYXJ5LW4nPk48L2xpbms+IC0tPgorICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1PVkVSUklERVMnPk88L2xpbms+CisgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVBBQ0tBR0VTJz5QPC9saW5rPgorPCEtLSAgICAgICA8bGluayBsaW5rZW5kPSd2YXItUU1BS0VfUFJPRklMRVMnPlE8L2xpbms+IC0tPgorICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1SREVQRU5EUyc+UjwvbGluaz4KKyAgICAgICA8bGluayBsaW5rZW5kPSd2YXItU0VDVElPTic+UzwvbGluaz4KKyAgICAgICA8bGluayBsaW5rZW5kPSd2YXItVCc+VDwvbGluaz4KKzwhLS0gICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVVCT09UX0NPTkZJRyc+VTwvbGluaz4gLS0+Cis8IS0tICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLWdsb3NzYXJ5LXYnPlY8L2xpbms+IC0tPgorPCEtLSAgICAgICA8bGluayBsaW5rZW5kPSd2YXItV0FSTl9RQSc+VzwvbGluaz4gLS0+Cis8IS0tICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLWdsb3NzYXJ5LXgnPlg8L2xpbms+IC0tPgorPCEtLSAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1nbG9zc2FyeS15Jz5ZPC9saW5rPiAtLT4KKzwhLS0gICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItZ2xvc3Nhcnkteic+WjwvbGluaz4tLT4KKyAgICA8L3BhcmE+CisKKyAgICA8Z2xvc3NkaXYgaWQ9J3Zhci1nbG9zc2FyeS1hJz48dGl0bGU+QTwvdGl0bGU+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1BU1NVTUVfUFJPVklERUQnPjxnbG9zc3Rlcm0+QVNTVU1FX1BST1ZJREVEPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIExpc3RzIHJlY2lwZSBuYW1lcworICAgICAgICAgICAgICAgICAgICAoPGxpbmsgbGlua2VuZD0ndmFyLVBOJz48ZmlsZW5hbWU+UE48L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzKSBCaXRCYWtlIGRvZXMgbm90IGF0dGVtcHQgdG8gYnVpbGQuCisgICAgICAgICAgICAgICAgICAgIEluc3RlYWQsIEJpdEJha2UgYXNzdW1lcyB0aGVzZSByZWNpcGVzIGhhdmUgYWxyZWFkeSBiZWVuCisgICAgICAgICAgICAgICAgICAgIGJ1aWx0LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBJbiBPcGVuRW1iZWRkZWQgQ29yZSwgPGZpbGVuYW1lPkFTU1VNRV9QUk9WSURFRDwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIG1vc3RseSBzcGVjaWZpZXMgbmF0aXZlIHRvb2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBidWlsdC4KKyAgICAgICAgICAgICAgICAgICAgQW4gZXhhbXBsZSBpcyA8ZmlsZW5hbWU+Z2l0LW5hdGl2ZTwvZmlsZW5hbWU+LCB3aGljaAorICAgICAgICAgICAgICAgICAgICB3aGVuIHNwZWNpZmllZCBhbGxvd3MgZm9yIHRoZSBHaXQgYmluYXJ5IGZyb20gdGhlIGhvc3QgdG8KKyAgICAgICAgICAgICAgICAgICAgYmUgdXNlZCByYXRoZXIgdGhhbiBidWlsZGluZworICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+Z2l0LW5hdGl2ZTwvZmlsZW5hbWU+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgIDwvZ2xvc3NkaXY+CisKKworICAgIDxnbG9zc2RpdiBpZD0ndmFyLWdsb3NzYXJ5LWInPjx0aXRsZT5CPC90aXRsZT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUInPjxnbG9zc3Rlcm0+QjwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGUgZGlyZWN0b3J5IGluIHdoaWNoIEJpdEJha2UgZXhlY3V0ZXMgZnVuY3Rpb25zCisgICAgICAgICAgICAgICAgICAgIGR1cmluZyBhIHJlY2lwZSdzIGJ1aWxkIHByb2Nlc3MuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQkJfQUxMT1dFRF9ORVRXT1JLUyc+PGdsb3NzdGVybT5CQl9BTExPV0VEX05FVFdPUktTPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyBhIHNwYWNlLWRlbGltaXRlZCBsaXN0IG9mIGhvc3RzIHRoYXQgdGhlIGZldGNoZXIKKyAgICAgICAgICAgICAgICAgICAgaXMgYWxsb3dlZCB0byB1c2UgdG8gb2J0YWluIHRoZSByZXF1aXJlZCBzb3VyY2UgY29kZS4KKyAgICAgICAgICAgICAgICAgICAgRm9sbG93aW5nIGFyZSBjb25zaWRlcmF0aW9ucyBzdXJyb3VuZGluZyB0aGlzIHZhcmlhYmxlOgorICAgICAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaG9zdCBsaXN0IGlzIG9ubHkgdXNlZCBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1CQl9OT19ORVRXT1JLJz48ZmlsZW5hbWU+QkJfTk9fTkVUV09SSzwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGVpdGhlciBub3Qgc2V0IG9yIHNldCB0byAiMCIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGltaXRlZCBzdXBwb3J0IGZvciB3aWxkY2FyZCBtYXRjaGluZyBhZ2FpbnN0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2lubmluZyBvZiBob3N0IG5hbWVzIGV4aXN0cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBzZXR0aW5nIG1hdGNoZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+Z2l0LmdudS5vcmc8L2ZpbGVuYW1lPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+ZnRwLmdudS5vcmc8L2ZpbGVuYW1lPiwgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmZvby5naXQuZ251Lm9yZzwvZmlsZW5hbWU+LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgQkJfQUxMT1dFRF9ORVRXT1JLUyA9ICIqLmdudS5vcmciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pcnJvcnMgbm90IGluIHRoZSBob3N0IGxpc3QgYXJlIHNraXBwZWQgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VkIGluIGRlYnVnLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dGVtcHRzIHRvIGFjY2VzcyBuZXR3b3JrcyBub3QgaW4gdGhlIGhvc3QgbGlzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdXNlIGEgZmFpbHVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIFVzaW5nIDxmaWxlbmFtZT5CQl9BTExPV0VEX05FVFdPUktTPC9maWxlbmFtZT4gaW4KKyAgICAgICAgICAgICAgICAgICAgY29uanVuY3Rpb24gd2l0aAorICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItUFJFTUlSUk9SUyc+PGZpbGVuYW1lPlBSRU1JUlJPUlM8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgaXMgdmVyeSB1c2VmdWwuCisgICAgICAgICAgICAgICAgICAgIEFkZGluZyB0aGUgaG9zdCB5b3Ugd2FudCB0byB1c2UgdG8KKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPlBSRU1JUlJPUlM8L2ZpbGVuYW1lPiByZXN1bHRzIGluIHRoZSBzb3VyY2UgY29kZQorICAgICAgICAgICAgICAgICAgICBiZWluZyBmZXRjaGVkIGZyb20gYW4gYWxsb3dlZCBsb2NhdGlvbiBhbmQgYXZvaWRzIHJhaXNpbmcKKyAgICAgICAgICAgICAgICAgICAgYW4gZXJyb3Igd2hlbiBhIGhvc3QgdGhhdCBpcyBub3QgYWxsb3dlZCBpcyBpbiBhCisgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1TUkNfVVJJJz48ZmlsZW5hbWU+U1JDX1VSSTwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuCisgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgYmVjYXVzZSB0aGUgZmV0Y2hlciBkb2VzIG5vdCBhdHRlbXB0IHRvIHVzZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgaG9zdCBsaXN0ZWQgaW4gPGZpbGVuYW1lPlNSQ19VUkk8L2ZpbGVuYW1lPiBhZnRlciBhCisgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWwgZmV0Y2ggZnJvbSB0aGUKKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPlBSRU1JUlJPUlM8L2ZpbGVuYW1lPiBvY2N1cnMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQkJfQ09OU09MRUxPRyc+PGdsb3NzdGVybT5CQl9DT05TT0xFTE9HPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgcGF0aCB0byBhIGxvZyBmaWxlIGludG8gd2hpY2ggQml0QmFrZSdzIHVzZXIKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlIHdyaXRlcyBvdXRwdXQgZHVyaW5nIHRoZSBidWlsZC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQl9DVVJSRU5UVEFTSyc+PGdsb3NzdGVybT5CQl9DVVJSRU5UVEFTSzwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBDb250YWlucyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGFzay4KKyAgICAgICAgICAgICAgICAgICAgVGhlIG5hbWUgZG9lcyBub3QgaW5jbHVkZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmRvXzwvZmlsZW5hbWU+IHByZWZpeC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQl9EQU5HTElOR0FQUEVORFNfV0FSTk9OTFknPjxnbG9zc3Rlcm0+QkJfREFOR0xJTkdBUFBFTkRTX1dBUk5PTkxZPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIERlZmluZXMgaG93IEJpdEJha2UgaGFuZGxlcyBzaXR1YXRpb25zIHdoZXJlIGFuIGFwcGVuZAorICAgICAgICAgICAgICAgICAgICBmaWxlICg8ZmlsZW5hbWU+LmJiYXBwZW5kPC9maWxlbmFtZT4pIGhhcyBubworICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kaW5nIHJlY2lwZSBmaWxlICg8ZmlsZW5hbWU+LmJiPC9maWxlbmFtZT4pLgorICAgICAgICAgICAgICAgICAgICBUaGlzIGNvbmRpdGlvbiBvZnRlbiBvY2N1cnMgd2hlbiBsYXllcnMgZ2V0IG91dCBvZiBzeW5jCisgICAgICAgICAgICAgICAgICAgIChlLmcuIDxmaWxlbmFtZT5vZS1jb3JlPC9maWxlbmFtZT4gYnVtcHMgYQorICAgICAgICAgICAgICAgICAgICByZWNpcGUgdmVyc2lvbiBhbmQgdGhlIG9sZCByZWNpcGUgbm8gbG9uZ2VyIGV4aXN0cyBhbmQgdGhlCisgICAgICAgICAgICAgICAgICAgIG90aGVyIGxheWVyIGhhcyBub3QgYmVlbiB1cGRhdGVkIHRvIHRoZSBuZXcgdmVyc2lvbgorICAgICAgICAgICAgICAgICAgICBvZiB0aGUgcmVjaXBlIHlldCkuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGZhdGFsIGJlaGF2aW9yIGlzIHNhZmVzdCBiZWNhdXNlIGl0IGlzCisgICAgICAgICAgICAgICAgICAgIHRoZSBzYW5lIHJlYWN0aW9uIGdpdmVuIHNvbWV0aGluZyBpcyBvdXQgb2Ygc3luYy4KKyAgICAgICAgICAgICAgICAgICAgSXQgaXMgaW1wb3J0YW50IHRvIHJlYWxpemUgd2hlbiB5b3VyIGNoYW5nZXMgYXJlIG5vIGxvbmdlcgorICAgICAgICAgICAgICAgICAgICBiZWluZyBhcHBsaWVkLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUJCX0RFRkFVTFRfVEFTSyc+PGdsb3NzdGVybT5CQl9ERUZBVUxUX1RBU0s8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdGFzayB0byB1c2Ugd2hlbiBub25lIGlzIHNwZWNpZmllZCAoZS5nLgorICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSA8ZmlsZW5hbWU+LWM8L2ZpbGVuYW1lPiBjb21tYW5kIGxpbmUgb3B0aW9uKS4KKyAgICAgICAgICAgICAgICAgICAgVGhlIHRhc2sgbmFtZSBzcGVjaWZpZWQgc2hvdWxkIG5vdCBpbmNsdWRlIHRoZQorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+ZG9fPC9maWxlbmFtZT4gcHJlZml4LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUJCX0RJU0tNT05fRElSUyc+PGdsb3NzdGVybT5CQl9ESVNLTU9OX0RJUlM8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgTW9uaXRvcnMgZGlzayBzcGFjZSBhbmQgYXZhaWxhYmxlIGlub2RlcyBkdXJpbmcgdGhlIGJ1aWxkCisgICAgICAgICAgICAgICAgICAgIGFuZCBhbGxvd3MgeW91IHRvIGNvbnRyb2wgdGhlIGJ1aWxkIGJhc2VkIG9uIHRoZXNlCisgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIERpc2sgc3BhY2UgbW9uaXRvcmluZyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgorICAgICAgICAgICAgICAgICAgICBXaGVuIHNldHRpbmcgdGhpcyB2YXJpYWJsZSwgdXNlIHRoZSBmb2xsb3dpbmcgZm9ybToKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBCQl9ESVNLTU9OX0RJUlMgPSAiJmx0O2FjdGlvbiZndDssJmx0O2RpciZndDssJmx0O3RocmVzaG9sZCZndDsgWy4uLl0iCisKKyAgICAgd2hlcmU6CisKKyAgICAgICAgJmx0O2FjdGlvbiZndDsgaXM6CisgICAgICAgICAgIEFCT1JUOiAgICAgSW1tZWRpYXRlbHkgYWJvcnQgdGhlIGJ1aWxkIHdoZW4KKyAgICAgICAgICAgICAgICAgICAgICBhIHRocmVzaG9sZCBpcyBicm9rZW4uCisgICAgICAgICAgIFNUT1BUQVNLUzogU3RvcCB0aGUgYnVpbGQgYWZ0ZXIgdGhlIGN1cnJlbnRseQorICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGluZyB0YXNrcyBoYXZlIGZpbmlzaGVkIHdoZW4KKyAgICAgICAgICAgICAgICAgICAgICBhIHRocmVzaG9sZCBpcyBicm9rZW4uCisgICAgICAgICAgIFdBUk46ICAgICAgSXNzdWUgYSB3YXJuaW5nIGJ1dCBjb250aW51ZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICBidWlsZCB3aGVuIGEgdGhyZXNob2xkIGlzIGJyb2tlbi4KKyAgICAgICAgICAgICAgICAgICAgICBTdWJzZXF1ZW50IHdhcm5pbmdzIGFyZSBpc3N1ZWQgYXMKKyAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkIGJ5IHRoZQorICAgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1CQl9ESVNLTU9OX1dBUk5JTlRFUlZBTCc+QkJfRElTS01PTl9XQVJOSU5URVJWQUw8L2xpbms+IHZhcmlhYmxlLAorICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIG11c3QgYmUgZGVmaW5lZC4KKworICAgICAgICAmbHQ7ZGlyJmd0OyBpczoKKyAgICAgICAgICAgQW55IGRpcmVjdG9yeSB5b3UgY2hvb3NlLiBZb3UgY2FuIHNwZWNpZnkgb25lIG9yCisgICAgICAgICAgIG1vcmUgZGlyZWN0b3JpZXMgdG8gbW9uaXRvciBieSBzZXBhcmF0aW5nIHRoZQorICAgICAgICAgICBncm91cGluZ3Mgd2l0aCBhIHNwYWNlLiAgSWYgdHdvIGRpcmVjdG9yaWVzIGFyZQorICAgICAgICAgICBvbiB0aGUgc2FtZSBkZXZpY2UsIG9ubHkgdGhlIGZpcnN0IGRpcmVjdG9yeQorICAgICAgICAgICBpcyBtb25pdG9yZWQuCisKKyAgICAgICAgJmx0O3RocmVzaG9sZCZndDsgaXM6CisgICAgICAgICAgIEVpdGhlciB0aGUgbWluaW11bSBhdmFpbGFibGUgZGlzayBzcGFjZSwKKyAgICAgICAgICAgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGZyZWUgaW5vZGVzLCBvcgorICAgICAgICAgICBib3RoLiAgWW91IG11c3Qgc3BlY2lmeSBhdCBsZWFzdCBvbmUuICBUbworICAgICAgICAgICBvbWl0IG9uZSBvciB0aGUgb3RoZXIsIHNpbXBseSBvbWl0IHRoZSB2YWx1ZS4KKyAgICAgICAgICAgU3BlY2lmeSB0aGUgdGhyZXNob2xkIHVzaW5nIEcsIE0sIEsgZm9yIEdieXRlcywKKyAgICAgICAgICAgTWJ5dGVzLCBhbmQgS2J5dGVzLCByZXNwZWN0aXZlbHkuIElmIHlvdSBkbworICAgICAgICAgICBub3Qgc3BlY2lmeSBHLCBNLCBvciBLLCBLYnl0ZXMgaXMgYXNzdW1lZCBieQorICAgICAgICAgICBkZWZhdWx0LiAgRG8gbm90IHVzZSBHQiwgTUIsIG9yIEtCLgorICAgICAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEhlcmUgYXJlIHNvbWUgZXhhbXBsZXM6CisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgQkJfRElTS01PTl9ESVJTID0gIkFCT1JULCR7VE1QRElSfSwxRywxMDBLIFdBUk4sJHtTU1RBVEVfRElSfSwxRywxMDBLIgorICAgICBCQl9ESVNLTU9OX0RJUlMgPSAiU1RPUFRBU0tTLCR7VE1QRElSfSwxRyIKKyAgICAgQkJfRElTS01PTl9ESVJTID0gIkFCT1JULCR7VE1QRElSfSwsMTAwSyIKKyAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgICAgICBUaGUgZmlyc3QgZXhhbXBsZSB3b3JrcyBvbmx5IGlmIHlvdSBhbHNvIHNldAorICAgICAgICAgICAgICAgICAgICB0aGUgPGxpbmsgbGlua2VuZD0ndmFyLUJCX0RJU0tNT05fV0FSTklOVEVSVkFMJz48ZmlsZW5hbWU+QkJfRElTS01PTl9XQVJOSU5URVJWQUw8L2ZpbGVuYW1lPjwvbGluaz4gdmFyaWFibGUuCisgICAgICAgICAgICAgICAgICAgIFRoaXMgZXhhbXBsZSBjYXVzZXMgdGhlIGJ1aWxkIHN5c3RlbSB0byBpbW1lZGlhdGVseQorICAgICAgICAgICAgICAgICAgICBhYm9ydCB3aGVuIGVpdGhlciB0aGUgZGlzayBzcGFjZSBpbiA8ZmlsZW5hbWU+JHtUTVBESVJ9PC9maWxlbmFtZT4gZHJvcHMKKyAgICAgICAgICAgICAgICAgICAgYmVsb3cgMSBHYnl0ZSBvciB0aGUgYXZhaWxhYmxlIGZyZWUgaW5vZGVzIGRyb3BzIGJlbG93CisgICAgICAgICAgICAgICAgICAgIDEwMCBLYnl0ZXMuCisgICAgICAgICAgICAgICAgICAgIEJlY2F1c2UgdHdvIGRpcmVjdG9yaWVzIGFyZSBwcm92aWRlZCB3aXRoIHRoZSB2YXJpYWJsZSwgdGhlCisgICAgICAgICAgICAgICAgICAgIGJ1aWxkIHN5c3RlbSBhbHNvIGlzc3VlcyBhCisgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcgd2hlbiB0aGUgZGlzayBzcGFjZSBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPiR7U1NUQVRFX0RJUn08L2ZpbGVuYW1lPiBkaXJlY3RvcnkgZHJvcHMKKyAgICAgICAgICAgICAgICAgICAgYmVsb3cgMSBHYnl0ZSBvciB0aGUgbnVtYmVyIG9mIGZyZWUgaW5vZGVzIGRyb3BzCisgICAgICAgICAgICAgICAgICAgIGJlbG93IDEwMCBLYnl0ZXMuCisgICAgICAgICAgICAgICAgICAgIFN1YnNlcXVlbnQgd2FybmluZ3MgYXJlIGlzc3VlZCBkdXJpbmcgaW50ZXJ2YWxzIGFzCisgICAgICAgICAgICAgICAgICAgIGRlZmluZWQgYnkgdGhlIDxmaWxlbmFtZT5CQl9ESVNLTU9OX1dBUk5JTlRFUlZBTDwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGUgc2Vjb25kIGV4YW1wbGUgc3RvcHMgdGhlIGJ1aWxkIGFmdGVyIGFsbCBjdXJyZW50bHkKKyAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW5nIHRhc2tzIGNvbXBsZXRlIHdoZW4gdGhlIG1pbmltdW0gZGlzayBzcGFjZQorICAgICAgICAgICAgICAgICAgICBpbiB0aGUgPGZpbGVuYW1lPiR7VE1QRElSfTwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSBkcm9wcyBiZWxvdyAxIEdieXRlLgorICAgICAgICAgICAgICAgICAgICBObyBkaXNrIG1vbml0b3Jpbmcgb2NjdXJzIGZvciB0aGUgZnJlZSBpbm9kZXMgaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGUgZmluYWwgZXhhbXBsZSBpbW1lZGlhdGVseSBhYm9ydHMgdGhlIGJ1aWxkIHdoZW4gdGhlCisgICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiBmcmVlIGlub2RlcyBpbiB0aGUgPGZpbGVuYW1lPiR7VE1QRElSfTwvZmlsZW5hbWU+IGRpcmVjdG9yeQorICAgICAgICAgICAgICAgICAgICBkcm9wcyBiZWxvdyAxMDAgS2J5dGVzLgorICAgICAgICAgICAgICAgICAgICBObyBkaXNrIHNwYWNlIG1vbml0b3JpbmcgZm9yIHRoZSBkaXJlY3RvcnkgaXRzZWxmIG9jY3VycworICAgICAgICAgICAgICAgICAgICBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQkJfRElTS01PTl9XQVJOSU5URVJWQUwnPjxnbG9zc3Rlcm0+QkJfRElTS01PTl9XQVJOSU5URVJWQUw8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgRGVmaW5lcyB0aGUgZGlzayBzcGFjZSBhbmQgZnJlZSBpbm9kZSB3YXJuaW5nIGludGVydmFscy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgSWYgeW91IGFyZSBnb2luZyB0byB1c2UgdGhlCisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5CQl9ESVNLTU9OX1dBUk5JTlRFUlZBTDwvZmlsZW5hbWU+IHZhcmlhYmxlLCB5b3UgbXVzdAorICAgICAgICAgICAgICAgICAgICBhbHNvIHVzZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUJCX0RJU0tNT05fRElSUyc+PGZpbGVuYW1lPkJCX0RJU0tNT05fRElSUzwvZmlsZW5hbWU+PC9saW5rPiB2YXJpYWJsZQorICAgICAgICAgICAgICAgICAgICBhbmQgZGVmaW5lIGl0cyBhY3Rpb24gYXMgIldBUk4iLgorICAgICAgICAgICAgICAgICAgICBEdXJpbmcgdGhlIGJ1aWxkLCBzdWJzZXF1ZW50IHdhcm5pbmdzIGFyZSBpc3N1ZWQgZWFjaCB0aW1lCisgICAgICAgICAgICAgICAgICAgIGRpc2sgc3BhY2Ugb3IgbnVtYmVyIG9mIGZyZWUgaW5vZGVzIGZ1cnRoZXIgcmVkdWNlcyBieQorICAgICAgICAgICAgICAgICAgICB0aGUgcmVzcGVjdGl2ZSBpbnRlcnZhbC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgSWYgeW91IGRvIG5vdCBwcm92aWRlIGEgPGZpbGVuYW1lPkJCX0RJU0tNT05fV0FSTklOVEVSVkFMPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgYW5kIHlvdSBkbyB1c2UgPGZpbGVuYW1lPkJCX0RJU0tNT05fRElSUzwvZmlsZW5hbWU+IHdpdGgKKyAgICAgICAgICAgICAgICAgICAgdGhlICJXQVJOIiBhY3Rpb24sIHRoZSBkaXNrIG1vbml0b3JpbmcgaW50ZXJ2YWwgZGVmYXVsdHMgdG8KKyAgICAgICAgICAgICAgICAgICAgdGhlIGZvbGxvd2luZzoKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBCQl9ESVNLTU9OX1dBUk5JTlRFUlZBTCA9ICI1ME0sNUsiCisgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgV2hlbiBzcGVjaWZ5aW5nIHRoZSB2YXJpYWJsZSBpbiB5b3VyIGNvbmZpZ3VyYXRpb24gZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgdXNlIHRoZSBmb2xsb3dpbmcgZm9ybToKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBCQl9ESVNLTU9OX1dBUk5JTlRFUlZBTCA9ICImbHQ7ZGlza19zcGFjZV9pbnRlcnZhbCZndDssJmx0O2Rpc2tfaW5vZGVfaW50ZXJ2YWwmZ3Q7IgorCisgICAgIHdoZXJlOgorCisgICAgICAgICZsdDtkaXNrX3NwYWNlX2ludGVydmFsJmd0OyBpczoKKyAgICAgICAgICAgQW4gaW50ZXJ2YWwgb2YgbWVtb3J5IGV4cHJlc3NlZCBpbiBlaXRoZXIKKyAgICAgICAgICAgRywgTSwgb3IgSyBmb3IgR2J5dGVzLCBNYnl0ZXMsIG9yIEtieXRlcywKKyAgICAgICAgICAgcmVzcGVjdGl2ZWx5LiBZb3UgY2Fubm90IHVzZSBHQiwgTUIsIG9yIEtCLgorCisgICAgICAgICZsdDtkaXNrX2lub2RlX2ludGVydmFsJmd0OyBpczoKKyAgICAgICAgICAgQW4gaW50ZXJ2YWwgb2YgZnJlZSBpbm9kZXMgZXhwcmVzc2VkIGluIGVpdGhlcgorICAgICAgICAgICBHLCBNLCBvciBLIGZvciBHYnl0ZXMsIE1ieXRlcywgb3IgS2J5dGVzLAorICAgICAgICAgICByZXNwZWN0aXZlbHkuIFlvdSBjYW5ub3QgdXNlIEdCLCBNQiwgb3IgS0IuCisgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgSGVyZSBpcyBhbiBleGFtcGxlOgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIEJCX0RJU0tNT05fRElSUyA9ICJXQVJOLCR7U1NUQVRFX0RJUn0sMUcsMTAwSyIKKyAgICAgQkJfRElTS01PTl9XQVJOSU5URVJWQUwgPSAiNTBNLDVLIgorICAgICAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgICAgIFRoZXNlIHZhcmlhYmxlcyBjYXVzZSBCaXRCYWtlIHRvCisgICAgICAgICAgICAgICAgICAgIGlzc3VlIHN1YnNlcXVlbnQgd2FybmluZ3MgZWFjaCB0aW1lIHRoZSBhdmFpbGFibGUKKyAgICAgICAgICAgICAgICAgICAgZGlzayBzcGFjZSBmdXJ0aGVyIHJlZHVjZXMgYnkgNTAgTWJ5dGVzIG9yIHRoZSBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgb2YgZnJlZSBpbm9kZXMgZnVydGhlciByZWR1Y2VzIGJ5IDUgS2J5dGVzIGluIHRoZQorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+JHtTU1RBVEVfRElSfTwvZmlsZW5hbWU+IGRpcmVjdG9yeS4KKyAgICAgICAgICAgICAgICAgICAgU3Vic2VxdWVudCB3YXJuaW5ncyBiYXNlZCBvbiB0aGUgaW50ZXJ2YWwgb2NjdXIgZWFjaCB0aW1lCisgICAgICAgICAgICAgICAgICAgIGEgcmVzcGVjdGl2ZSBpbnRlcnZhbCBpcyByZWFjaGVkIGJleW9uZCB0aGUgaW5pdGlhbCB3YXJuaW5nCisgICAgICAgICAgICAgICAgICAgIChpLmUuIDEgR2J5dGVzIGFuZCAxMDAgS2J5dGVzKS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQl9FTlZfV0hJVEVMSVNUJz48Z2xvc3N0ZXJtPkJCX0VOVl9XSElURUxJU1Q8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBpbnRlcm5hbCB3aGl0ZWxpc3Qgb2YgdmFyaWFibGVzIHRvIGFsbG93CisgICAgICAgICAgICAgICAgICAgIHRocm91Z2ggZnJvbSB0aGUgZXh0ZXJuYWwgZW52aXJvbm1lbnQgaW50byBCaXRCYWtlJ3MKKyAgICAgICAgICAgICAgICAgICAgZGF0YXN0b3JlLgorICAgICAgICAgICAgICAgICAgICBJZiB0aGUgdmFsdWUgb2YgdGhpcyB2YXJpYWJsZSBpcyBub3Qgc3BlY2lmaWVkCisgICAgICAgICAgICAgICAgICAgICh3aGljaCBpcyB0aGUgZGVmYXVsdCksIHRoZSBmb2xsb3dpbmcgbGlzdCBpcyB1c2VkOgorICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItQkJQQVRIJz48ZmlsZW5hbWU+QkJQQVRIPC9maWxlbmFtZT48L2xpbms+LAorICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItQkJfUFJFU0VSVkVfRU5WJz48ZmlsZW5hbWU+QkJfUFJFU0VSVkVfRU5WPC9maWxlbmFtZT48L2xpbms+LAorICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItQkJfRU5WX1dISVRFTElTVCc+PGZpbGVuYW1lPkJCX0VOVl9XSElURUxJU1Q8L2ZpbGVuYW1lPjwvbGluaz4sCisgICAgICAgICAgICAgICAgICAgIGFuZAorICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItQkJfRU5WX0VYVFJBV0hJVEUnPjxmaWxlbmFtZT5CQl9FTlZfRVhUUkFXSElURTwvZmlsZW5hbWU+PC9saW5rPi4KKyAgICAgICAgICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgICAgICAgICBZb3UgbXVzdCBzZXQgdGhpcyB2YXJpYWJsZSBpbiB0aGUgZXh0ZXJuYWwgZW52aXJvbm1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIGluIG9yZGVyIGZvciBpdCB0byB3b3JrLgorICAgICAgICAgICAgICAgICAgICA8L25vdGU+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQkJfRU5WX0VYVFJBV0hJVEUnPjxnbG9zc3Rlcm0+QkJfRU5WX0VYVFJBV0hJVEU8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIGFuIGFkZGl0aW9uYWwgc2V0IG9mIHZhcmlhYmxlcyB0byBhbGxvdyB0aHJvdWdoCisgICAgICAgICAgICAgICAgICAgICh3aGl0ZWxpc3QpIGZyb20gdGhlIGV4dGVybmFsIGVudmlyb25tZW50IGludG8gQml0QmFrZSdzCisgICAgICAgICAgICAgICAgICAgIGRhdGFzdG9yZS4KKyAgICAgICAgICAgICAgICAgICAgVGhpcyBsaXN0IG9mIHZhcmlhYmxlcyBhcmUgb24gdG9wIG9mIHRoZSBpbnRlcm5hbCBsaXN0CisgICAgICAgICAgICAgICAgICAgIHNldCBpbgorICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItQkJfRU5WX1dISVRFTElTVCc+PGZpbGVuYW1lPkJCX0VOVl9XSElURUxJU1Q8L2ZpbGVuYW1lPjwvbGluaz4uCisgICAgICAgICAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgICAgICAgICAgWW91IG11c3Qgc2V0IHRoaXMgdmFyaWFibGUgaW4gdGhlIGV4dGVybmFsCisgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCBpbiBvcmRlciBmb3IgaXQgdG8gd29yay4KKyAgICAgICAgICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUJCX0ZFVENIX1BSRU1JUlJPUk9OTFknPjxnbG9zc3Rlcm0+QkJfRkVUQ0hfUFJFTUlSUk9ST05MWTwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBXaGVuIHNldCB0byAiMSIsIGNhdXNlcyBCaXRCYWtlJ3MgZmV0Y2hlciBtb2R1bGUgdG8gb25seQorICAgICAgICAgICAgICAgICAgICBzZWFyY2gKKyAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVBSRU1JUlJPUlMnPjxmaWxlbmFtZT5QUkVNSVJST1JTPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgICAgIGZvciBmaWxlcy4KKyAgICAgICAgICAgICAgICAgICAgQml0QmFrZSB3aWxsIG5vdCBzZWFyY2ggdGhlIG1haW4KKyAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVNSQ19VUkknPjxmaWxlbmFtZT5TUkNfVVJJPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgICAgIG9yCisgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1NSVJST1JTJz48ZmlsZW5hbWU+TUlSUk9SUzwvZmlsZW5hbWU+PC9saW5rPi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQl9GSUxFTkFNRSc+PGdsb3NzdGVybT5CQl9GSUxFTkFNRTwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBDb250YWlucyB0aGUgZmlsZW5hbWUgb2YgdGhlIHJlY2lwZSB0aGF0IG93bnMgdGhlIGN1cnJlbnRseQorICAgICAgICAgICAgICAgICAgICBydW5uaW5nIHRhc2suCisgICAgICAgICAgICAgICAgICAgIEZvciBleGFtcGxlLCBpZiB0aGUgPGZpbGVuYW1lPmRvX2ZldGNoPC9maWxlbmFtZT4gdGFzayB0aGF0CisgICAgICAgICAgICAgICAgICAgIHJlc2lkZXMgaW4gdGhlIDxmaWxlbmFtZT5teS1yZWNpcGUuYmI8L2ZpbGVuYW1lPiBpcworICAgICAgICAgICAgICAgICAgICBleGVjdXRpbmcsIHRoZSA8ZmlsZW5hbWU+QkJfRklMRU5BTUU8L2ZpbGVuYW1lPiB2YXJpYWJsZQorICAgICAgICAgICAgICAgICAgICBjb250YWlucyAiL2Zvby9wYXRoL215LXJlY2lwZS5iYiIuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQkJfR0VORVJBVEVfTUlSUk9SX1RBUkJBTExTJz48Z2xvc3N0ZXJtPkJCX0dFTkVSQVRFX01JUlJPUl9UQVJCQUxMUzwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBDYXVzZXMgdGFyYmFsbHMgb2YgdGhlIEdpdCByZXBvc2l0b3JpZXMsIGluY2x1ZGluZyB0aGUKKyAgICAgICAgICAgICAgICAgICAgR2l0IG1ldGFkYXRhLCB0byBiZSBwbGFjZWQgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1ETF9ESVInPjxmaWxlbmFtZT5ETF9ESVI8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5LgorICAgICAgICAgICAgICAgICAgICBBbnlvbmUgd2lzaGluZyB0byBjcmVhdGUgYSBzb3VyY2UgbWlycm9yIHdvdWxkIHdhbnQgdG8KKyAgICAgICAgICAgICAgICAgICAgZW5hYmxlIHRoaXMgdmFyaWFibGUuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBjcmVhdGluZyBhbmQgcGxhY2luZyB0YXJiYWxscyBvZgorICAgICAgICAgICAgICAgICAgICB0aGUgR2l0IHJlcG9zaXRvcmllcyBpcyBub3QgdGhlIGRlZmF1bHQgYWN0aW9uIGJ5IEJpdEJha2UuCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgQkJfR0VORVJBVEVfTUlSUk9SX1RBUkJBTExTID0gIjEiCisgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQl9IQVNIQ09ORklHX1dISVRFTElTVCc+PGdsb3NzdGVybT5CQl9IQVNIQ09ORklHX1dISVRFTElTVDwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBMaXN0cyB2YXJpYWJsZXMgdGhhdCBhcmUgZXhjbHVkZWQgZnJvbSBiYXNlIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgY2hlY2tzdW0sIHdoaWNoIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBjYWNoZSBjYW4KKyAgICAgICAgICAgICAgICAgICAgYmUgcmV1c2VkLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBPbmUgb2YgdGhlIHdheXMgQml0QmFrZSBkZXRlcm1pbmVzIHdoZXRoZXIgdG8gcmUtcGFyc2UgdGhlCisgICAgICAgICAgICAgICAgICAgIG1haW4gbWV0YWRhdGEgaXMgdGhyb3VnaCBjaGVja3N1bXMgb2YgdGhlIHZhcmlhYmxlcyBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgZGF0YXN0b3JlIG9mIHRoZSBiYXNlIGNvbmZpZ3VyYXRpb24gZGF0YS4KKyAgICAgICAgICAgICAgICAgICAgVGhlcmUgYXJlIHZhcmlhYmxlcyB0aGF0IHlvdSB0eXBpY2FsbHkgd2FudCB0byBleGNsdWRlIHdoZW4KKyAgICAgICAgICAgICAgICAgICAgY2hlY2tpbmcgd2hldGhlciBvciBub3QgdG8gcmUtcGFyc2UgYW5kIHRodXMgcmVidWlsZCB0aGUKKyAgICAgICAgICAgICAgICAgICAgY2FjaGUuCisgICAgICAgICAgICAgICAgICAgIEFzIGFuIGV4YW1wbGUsIHlvdSB3b3VsZCB1c3VhbGx5IGV4Y2x1ZGUKKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPlRJTUU8L2ZpbGVuYW1lPiBhbmQgPGZpbGVuYW1lPkRBVEU8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICBiZWNhdXNlIHRoZXNlIHZhcmlhYmxlcyBhcmUgYWx3YXlzIGNoYW5naW5nLgorICAgICAgICAgICAgICAgICAgICBJZiB5b3UgZGlkIG5vdCBleGNsdWRlIHRoZW0sIEJpdEJha2Ugd291bGQgbmV2ZXIgcmV1c2UgdGhlCisgICAgICAgICAgICAgICAgICAgIGNhY2hlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUJCX0hBU0hCQVNFX1dISVRFTElTVCc+PGdsb3NzdGVybT5CQl9IQVNIQkFTRV9XSElURUxJU1Q8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgTGlzdHMgdmFyaWFibGVzIHRoYXQgYXJlIGV4Y2x1ZGVkIGZyb20gY2hlY2tzdW0gYW5kCisgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3kgZGF0YS4KKyAgICAgICAgICAgICAgICAgICAgVmFyaWFibGVzIHRoYXQgYXJlIGV4Y2x1ZGVkIGNhbiB0aGVyZWZvcmUgY2hhbmdlIHdpdGhvdXQKKyAgICAgICAgICAgICAgICAgICAgYWZmZWN0aW5nIHRoZSBjaGVja3N1bSBtZWNoYW5pc20uCisgICAgICAgICAgICAgICAgICAgIEEgY29tbW9uIGV4YW1wbGUgd291bGQgYmUgdGhlIHZhcmlhYmxlIGZvciB0aGUgcGF0aCBvZgorICAgICAgICAgICAgICAgICAgICB0aGUgYnVpbGQuCisgICAgICAgICAgICAgICAgICAgIEJpdEJha2UncyBvdXRwdXQgc2hvdWxkIG5vdCAoYW5kIHVzdWFsbHkgZG9lcyBub3QpIGRlcGVuZAorICAgICAgICAgICAgICAgICAgICBvbiB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIGl0IHdhcyBidWlsdC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQl9IQVNIQ0hFQ0tfRlVOQ1RJT04nPjxnbG9zc3Rlcm0+QkJfSEFTSENIRUNLX0ZVTkNUSU9OPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gY2FsbCBkdXJpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgICJzZXRzY2VuZSIgcGFydCBvZiB0aGUgdGFzaydzIGV4ZWN1dGlvbiBpbiBvcmRlciB0bworICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZSB0aGUgbGlzdCBvZiB0YXNrIGhhc2hlcy4KKyAgICAgICAgICAgICAgICAgICAgVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGxpc3Qgb2Ygc2V0c2NlbmUgdGFza3MgdGhhdCBzaG91bGQKKyAgICAgICAgICAgICAgICAgICAgYmUgZXhlY3V0ZWQuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEF0IHRoaXMgcG9pbnQgaW4gdGhlIGV4ZWN1dGlvbiBvZiB0aGUgY29kZSwgdGhlIG9iamVjdGl2ZQorICAgICAgICAgICAgICAgICAgICBpcyB0byBxdWlja2x5IHZlcmlmeSBpZiBhIGdpdmVuIHNldHNjZW5lIGZ1bmN0aW9uIGlzIGxpa2VseQorICAgICAgICAgICAgICAgICAgICB0byB3b3JrIG9yIG5vdC4KKyAgICAgICAgICAgICAgICAgICAgSXQncyBlYXNpZXIgdG8gY2hlY2sgdGhlIGxpc3Qgb2Ygc2V0c2NlbmUgZnVuY3Rpb25zIGluCisgICAgICAgICAgICAgICAgICAgIG9uZSBwYXNzIHRoYW4gdG8gY2FsbCBtYW55IGluZGl2aWR1YWwgdGFza3MuCisgICAgICAgICAgICAgICAgICAgIFRoZSByZXR1cm5lZCBsaXN0IG5lZWQgbm90IGJlIGNvbXBsZXRlbHkgYWNjdXJhdGUuCisgICAgICAgICAgICAgICAgICAgIEEgZ2l2ZW4gc2V0c2NlbmUgdGFzayBjYW4gc3RpbGwgbGF0ZXIgZmFpbC4KKyAgICAgICAgICAgICAgICAgICAgSG93ZXZlciwgdGhlIG1vcmUgYWNjdXJhdGUgdGhlIGRhdGEgcmV0dXJuZWQsIHRoZSBtb3JlCisgICAgICAgICAgICAgICAgICAgIGVmZmljaWVudCB0aGUgYnVpbGQgd2lsbCBiZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQl9JTlZBTElEQ09ORic+PGdsb3NzdGVybT5CQl9JTlZBTElEQ09ORjwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBVc2VkIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlCisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5Db25maWdQYXJzZWQ8L2ZpbGVuYW1lPiBldmVudCB0byB0cmlnZ2VyCisgICAgICAgICAgICAgICAgICAgIHJlLXBhcnNpbmcgdGhlIGJhc2UgbWV0YWRhdGEgKGkuZS4gYWxsIHRoZQorICAgICAgICAgICAgICAgICAgICByZWNpcGVzKS4KKyAgICAgICAgICAgICAgICAgICAgVGhlIDxmaWxlbmFtZT5Db25maWdQYXJzZWQ8L2ZpbGVuYW1lPiBldmVudCBjYW4gc2V0IHRoZQorICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSB0byB0cmlnZ2VyIHRoZSByZS1wYXJzZS4KKyAgICAgICAgICAgICAgICAgICAgWW91IG11c3QgYmUgY2FyZWZ1bCB0byBhdm9pZCByZWN1cnNpdmUgbG9vcHMgd2l0aCB0aGlzCisgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uYWxpdHkuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQkJfTE9HRk1UJz48Z2xvc3N0ZXJtPkJCX0xPR0ZNVDwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIGxvZyBmaWxlcyBzYXZlZCBpbnRvCisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT4kezwvZmlsZW5hbWU+PGxpbmsgbGlua2VuZD0ndmFyLVQnPjxmaWxlbmFtZT5UPC9maWxlbmFtZT48L2xpbms+PGZpbGVuYW1lPn08L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCwgdGhlIDxmaWxlbmFtZT5CQl9MT0dGTVQ8L2ZpbGVuYW1lPiB2YXJpYWJsZQorICAgICAgICAgICAgICAgICAgICBpcyB1bmRlZmluZWQgYW5kIHRoZSBsb2cgZmlsZSBuYW1lcyBnZXQgY3JlYXRlZCB1c2luZyB0aGUKKyAgICAgICAgICAgICAgICAgICAgZm9sbG93aW5nIGZvcm06CisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgbG9nLnt0YXNrfS57cGlkfQorICAgICAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgICAgIElmIHlvdSB3YW50IHRvIGZvcmNlIGxvZyBmaWxlcyB0byB0YWtlIGEgc3BlY2lmaWMgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgeW91IGNhbiBzZXQgdGhpcyB2YXJpYWJsZSBpbiBhIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQl9OSUNFX0xFVkVMJz48Z2xvc3N0ZXJtPkJCX05JQ0VfTEVWRUw8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgQWxsb3dzIEJpdEJha2UgdG8gcnVuIGF0IGEgc3BlY2lmaWMgcHJpb3JpdHkKKyAgICAgICAgICAgICAgICAgICAgKGkuZS4gbmljZSBsZXZlbCkuCisgICAgICAgICAgICAgICAgICAgIFN5c3RlbSBwZXJtaXNzaW9ucyB1c3VhbGx5IG1lYW4gdGhhdCBCaXRCYWtlIGNhbiByZWR1Y2UgaXRzCisgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5IGJ1dCBub3QgcmFpc2UgaXQgYWdhaW4uCisgICAgICAgICAgICAgICAgICAgIFNlZQorICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItQkJfVEFTS19OSUNFX0xFVkVMJz48ZmlsZW5hbWU+QkJfVEFTS19OSUNFX0xFVkVMPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgICAgIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUJCX05PX05FVFdPUksnPjxnbG9zc3Rlcm0+QkJfTk9fTkVUV09SSzwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBEaXNhYmxlcyBuZXR3b3JrIGFjY2VzcyBpbiB0aGUgQml0QmFrZSBmZXRjaGVyIG1vZHVsZXMuCisgICAgICAgICAgICAgICAgICAgIFdpdGggdGhpcyBhY2Nlc3MgZGlzYWJsZWQsIGFueSBjb21tYW5kIHRoYXQgYXR0ZW1wdHMgdG8KKyAgICAgICAgICAgICAgICAgICAgYWNjZXNzIHRoZSBuZXR3b3JrIGJlY29tZXMgYW4gZXJyb3IuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIERpc2FibGluZyBuZXR3b3JrIGFjY2VzcyBpcyB1c2VmdWwgZm9yIHRlc3Rpbmcgc291cmNlCisgICAgICAgICAgICAgICAgICAgIG1pcnJvcnMsIHJ1bm5pbmcgYnVpbGRzIHdoZW4gbm90IGNvbm5lY3RlZCB0byB0aGUgSW50ZXJuZXQsCisgICAgICAgICAgICAgICAgICAgIGFuZCB3aGVuIG9wZXJhdGluZyBpbiBjZXJ0YWluIGtpbmRzIG9mIGZpcmV3YWxsCisgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50cy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQl9OVU1CRVJfVEhSRUFEUyc+PGdsb3NzdGVybT5CQl9OVU1CRVJfVEhSRUFEUzwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGFza3MgQml0QmFrZSBzaG91bGQgcnVuIGluIHBhcmFsbGVsCisgICAgICAgICAgICAgICAgICAgIGF0IGFueSBvbmUgdGltZS4KKyAgICAgICAgICAgICAgICAgICAgSWYgeW91ciBob3N0IGRldmVsb3BtZW50IHN5c3RlbSBzdXBwb3J0cyBtdWx0aXBsZSBjb3JlcywKKyAgICAgICAgICAgICAgICAgICAgYSBnb29kIHJ1bGUgb2YgdGh1bWIgaXMgdG8gc2V0IHRoaXMgdmFyaWFibGUgdG8gdHdpY2UgdGhlCisgICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiBjb3Jlcy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQl9OVU1CRVJfUEFSU0VfVEhSRUFEUyc+PGdsb3NzdGVybT5CQl9OVU1CRVJfUEFSU0VfVEhSRUFEUzwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBTZXRzIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBCaXRCYWtlIHVzZXMgd2hlbiBwYXJzaW5nLgorICAgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0LCB0aGUgbnVtYmVyIG9mIHRocmVhZHMgaXMgZXF1YWwgdG8gdGhlIG51bWJlcgorICAgICAgICAgICAgICAgICAgICBvZiBjb3JlcyBvbiB0aGUgc3lzdGVtLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUJCX09SSUdFTlYnPjxnbG9zc3Rlcm0+QkJfT1JJR0VOVjwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBDb250YWlucyBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIGV4dGVybmFsIGVudmlyb25tZW50IGluCisgICAgICAgICAgICAgICAgICAgIHdoaWNoIEJpdEJha2Ugd2FzIHJ1bi4KKyAgICAgICAgICAgICAgICAgICAgVGhlIGNvcHkgaXMgdGFrZW4gYmVmb3JlIGFueSB3aGl0ZWxpc3RlZCB2YXJpYWJsZSB2YWx1ZXMKKyAgICAgICAgICAgICAgICAgICAgYXJlIGZpbHRlcmVkIGludG8gQml0QmFrZSdzIGRhdGFzdG9yZS4KKyAgICAgICAgICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgICAgICAgICBUaGUgY29udGVudHMgb2YgdGhpcyB2YXJpYWJsZSBpcyBhIGRhdGFzdG9yZSBvYmplY3QKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgY2FuIGJlIHF1ZXJpZWQgdXNpbmcgdGhlIG5vcm1hbCBkYXRhc3RvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbnMuCisgICAgICAgICAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQl9QUkVTRVJWRV9FTlYnPjxnbG9zc3Rlcm0+QkJfUFJFU0VSVkVfRU5WPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIERpc2FibGVzIHdoaXRlbGlzdGluZyBhbmQgaW5zdGVhZCBhbGxvd3MgYWxsIHZhcmlhYmxlcworICAgICAgICAgICAgICAgICAgICB0aHJvdWdoIGZyb20gdGhlIGV4dGVybmFsIGVudmlyb25tZW50IGludG8gQml0QmFrZSdzCisgICAgICAgICAgICAgICAgICAgIGRhdGFzdG9yZS4KKyAgICAgICAgICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgICAgICAgICBZb3UgbXVzdCBzZXQgdGhpcyB2YXJpYWJsZSBpbiB0aGUgZXh0ZXJuYWwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50IGluIG9yZGVyIGZvciBpdCB0byB3b3JrLgorICAgICAgICAgICAgICAgICAgICA8L25vdGU+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQkJfUlVORk1UJz48Z2xvc3N0ZXJtPkJCX1JVTkZNVDwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIGV4ZWN1dGFibGUgc2NyaXB0IGZpbGVzCisgICAgICAgICAgICAgICAgICAgIChpLmUuIHJ1biBmaWxlcykgc2F2ZWQgaW50bworICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+JHs8L2ZpbGVuYW1lPjxsaW5rIGxpbmtlbmQ9J3Zhci1UJz48ZmlsZW5hbWU+VDwvZmlsZW5hbWU+PC9saW5rPjxmaWxlbmFtZT59PC9maWxlbmFtZT4uCisgICAgICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQsIHRoZSA8ZmlsZW5hbWU+QkJfUlVORk1UPC9maWxlbmFtZT4gdmFyaWFibGUKKyAgICAgICAgICAgICAgICAgICAgaXMgdW5kZWZpbmVkIGFuZCB0aGUgcnVuIGZpbGUgbmFtZXMgZ2V0IGNyZWF0ZWQgdXNpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZyBmb3JtOgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIHJ1bi57dGFza30ue3BpZH0KKyAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgICAgICBJZiB5b3Ugd2FudCB0byBmb3JjZSBydW4gZmlsZXMgdG8gdGFrZSBhIHNwZWNpZmljIG5hbWUsCisgICAgICAgICAgICAgICAgICAgIHlvdSBjYW4gc2V0IHRoaXMgdmFyaWFibGUgaW4gYSBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQkJfUlVOVEFTSyc+PGdsb3NzdGVybT5CQl9SVU5UQVNLPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIENvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIHRhc2suCisgICAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSBkb2VzIG5vdCBpbmNsdWRlIHRoZSAiZG9fIiBwcmVmaXguCisgICAgICAgICAgICAgICAgICAgIEZvciBleGFtcGxlLCBpZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyB0YXNrIGlzCisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5kb19jb25maWc8L2ZpbGVuYW1lPiwgdGhlIHZhbHVlIGlzCisgICAgICAgICAgICAgICAgICAgICJjb25maWciLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUJCX1NDSEVEVUxFUic+PGdsb3NzdGVybT5CQl9TQ0hFRFVMRVI8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgU2VsZWN0cyB0aGUgbmFtZSBvZiB0aGUgc2NoZWR1bGVyIHRvIHVzZSBmb3IgdGhlCisgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxpbmcgb2YgQml0QmFrZSB0YXNrcy4KKyAgICAgICAgICAgICAgICAgICAgVGhyZWUgb3B0aW9ucyBleGlzdDoKKyAgICAgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+YmFzaWM8L2VtcGhhc2lzPiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGJhc2ljIGZyYW1ld29yayBmcm9tIHdoaWNoIGV2ZXJ5dGhpbmcgZGVyaXZlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2luZyB0aGlzIG9wdGlvbiBjYXVzZXMgdGFza3MgdG8gYmUgb3JkZXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWVyaWNhbGx5IGFzIHRoZXkgYXJlIHBhcnNlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+c3BlZWQ8L2VtcGhhc2lzPiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhlY3V0ZXMgdGFza3MgZmlyc3QgdGhhdCBoYXZlIG1vcmUgdGFza3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRpbmcgb24gdGhlbS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgInNwZWVkIiBvcHRpb24gaXMgdGhlIGRlZmF1bHQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPmNvbXBsZXRpb248L2VtcGhhc2lzPiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2F1c2VzIHRoZSBzY2hlZHVsZXIgdG8gdHJ5IHRvIGNvbXBsZXRlIGEgZ2l2ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNpcGUgb25jZSBpdHMgYnVpbGQgaGFzIHN0YXJ0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUJCX1NDSEVEVUxFUlMnPjxnbG9zc3Rlcm0+QkJfU0NIRURVTEVSUzwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBEZWZpbmVzIGN1c3RvbSBzY2hlZHVsZXJzIHRvIGltcG9ydC4KKyAgICAgICAgICAgICAgICAgICAgQ3VzdG9tIHNjaGVkdWxlcnMgbmVlZCB0byBiZSBkZXJpdmVkIGZyb20gdGhlCisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5SdW5RdWV1ZVNjaGVkdWxlcjwvZmlsZW5hbWU+IGNsYXNzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBGb3IgaW5mb3JtYXRpb24gaG93IHRvIHNlbGVjdCBhIHNjaGVkdWxlciwgc2VlIHRoZQorICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItQkJfU0NIRURVTEVSJz48ZmlsZW5hbWU+QkJfU0NIRURVTEVSPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUJCX1NFVFNDRU5FX0RFUFZBTElEJz48Z2xvc3N0ZXJtPkJCX1NFVFNDRU5FX0RFUFZBTElEPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyBhIGZ1bmN0aW9uIEJpdEJha2UgY2FsbHMgdGhhdCBkZXRlcm1pbmVzCisgICAgICAgICAgICAgICAgICAgIHdoZXRoZXIgQml0QmFrZSByZXF1aXJlcyBhIHNldHNjZW5lIGRlcGVuZGVuY3kgdG8gYmUgbWV0LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBXaGVuIHJ1bm5pbmcgYSBzZXRzY2VuZSB0YXNrLCBCaXRCYWtlIG5lZWRzIHRvCisgICAgICAgICAgICAgICAgICAgIGtub3cgd2hpY2ggZGVwZW5kZW5jaWVzIG9mIHRoYXQgc2V0c2NlbmUgdGFzayBhbHNvIG5lZWQKKyAgICAgICAgICAgICAgICAgICAgdG8gYmUgcnVuLgorICAgICAgICAgICAgICAgICAgICBXaGV0aGVyIGRlcGVuZGVuY2llcyBhbHNvIG5lZWQgdG8gYmUgcnVuIGlzIGhpZ2hseQorICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbnQgb24gdGhlIG1ldGFkYXRhLgorICAgICAgICAgICAgICAgICAgICBUaGUgZnVuY3Rpb24gc3BlY2lmaWVkIGJ5IHRoaXMgdmFyaWFibGUgcmV0dXJucyBhCisgICAgICAgICAgICAgICAgICAgICJUcnVlIiBvciAiRmFsc2UiIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBkZXBlbmRlbmN5IG5lZWRzCisgICAgICAgICAgICAgICAgICAgIHRvIGJlIG1ldC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQl9TRVRTQ0VORV9WRVJJRllfRlVOQ1RJT04nPjxnbG9zc3Rlcm0+QkJfU0VUU0NFTkVfVkVSSUZZX0ZVTkNUSU9OPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyBhIGZ1bmN0aW9uIHRvIGNhbGwgdGhhdCB2ZXJpZmllcyB0aGUgbGlzdCBvZgorICAgICAgICAgICAgICAgICAgICBwbGFubmVkIHRhc2sgZXhlY3V0aW9uIGJlZm9yZSB0aGUgbWFpbiB0YXNrIGV4ZWN1dGlvbgorICAgICAgICAgICAgICAgICAgICBoYXBwZW5zLgorICAgICAgICAgICAgICAgICAgICBUaGUgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgQml0QmFrZSBoYXMgYSBsaXN0IG9mIHNldHNjZW5lCisgICAgICAgICAgICAgICAgICAgIHRhc2tzIHRoYXQgaGF2ZSBydW4gYW5kIGVpdGhlciBzdWNjZWVkZWQgb3IgZmFpbGVkLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGUgZnVuY3Rpb24gYWxsb3dzIGZvciBhIHRhc2sgbGlzdCBjaGVjayB0byBzZWUgaWYgdGhleQorICAgICAgICAgICAgICAgICAgICBtYWtlIHNlbnNlLgorICAgICAgICAgICAgICAgICAgICBFdmVuIGlmIEJpdEJha2Ugd2FzIHBsYW5uaW5nIHRvIHNraXAgYSB0YXNrLCB0aGUKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQgdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIGNhbiBmb3JjZSBCaXRCYWtlIHRvIHJ1bgorICAgICAgICAgICAgICAgICAgICB0aGUgdGFzaywgd2hpY2ggaXMgbmVjZXNzYXJ5IHVuZGVyIGNlcnRhaW4gbWV0YWRhdGEKKyAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCBjaXJjdW1zdGFuY2VzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUJCX1NJR05BVFVSRV9FWENMVURFX0ZMQUdTJz48Z2xvc3N0ZXJtPkJCX1NJR05BVFVSRV9FWENMVURFX0ZMQUdTPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIExpc3RzIHZhcmlhYmxlIGZsYWdzICh2YXJmbGFncykKKyAgICAgICAgICAgICAgICAgICAgdGhhdCBjYW4gYmUgc2FmZWx5IGV4Y2x1ZGVkIGZyb20gY2hlY2tzdW0KKyAgICAgICAgICAgICAgICAgICAgYW5kIGRlcGVuZGVuY3kgZGF0YSBmb3Iga2V5cyBpbiB0aGUgZGF0YXN0b3JlLgorICAgICAgICAgICAgICAgICAgICBXaGVuIGdlbmVyYXRpbmcgY2hlY2tzdW0gb3IgZGVwZW5kZW5jeSBkYXRhIGZvciBrZXlzIGluIHRoZQorICAgICAgICAgICAgICAgICAgICBkYXRhc3RvcmUsIHRoZSBmbGFncyBzZXQgYWdhaW5zdCB0aGF0IGtleSBhcmUgbm9ybWFsbHkKKyAgICAgICAgICAgICAgICAgICAgaW5jbHVkZWQgaW4gdGhlIGNoZWNrc3VtLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB2YXJmbGFncywgc2VlIHRoZQorICAgICAgICAgICAgICAgICAgICAiPGxpbmsgbGlua2VuZD0ndmFyaWFibGUtZmxhZ3MnPlZhcmlhYmxlIEZsYWdzPC9saW5rPiIKKyAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQl9TSUdOQVRVUkVfSEFORExFUic+PGdsb3NzdGVybT5CQl9TSUdOQVRVUkVfSEFORExFUjwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBEZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBzaWduYXR1cmUgaGFuZGxlciBCaXRCYWtlIHVzZXMuCisgICAgICAgICAgICAgICAgICAgIFRoZSBzaWduYXR1cmUgaGFuZGxlciBkZWZpbmVzIHRoZSB3YXkgc3RhbXAgZmlsZXMgYXJlCisgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQgYW5kIGhhbmRsZWQsIGlmIGFuZCBob3cgdGhlIHNpZ25hdHVyZSBpcworICAgICAgICAgICAgICAgICAgICBpbmNvcnBvcmF0ZWQgaW50byB0aGUgc3RhbXBzLCBhbmQgaG93IHRoZSBzaWduYXR1cmUKKyAgICAgICAgICAgICAgICAgICAgaXRzZWxmIGlzIGdlbmVyYXRlZC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgQSBuZXcgc2lnbmF0dXJlIGhhbmRsZXIgY2FuIGJlIGFkZGVkIGJ5IGluamVjdGluZyBhIGNsYXNzCisgICAgICAgICAgICAgICAgICAgIGRlcml2ZWQgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPlNpZ25hdHVyZUdlbmVyYXRvcjwvZmlsZW5hbWU+IGNsYXNzIGludG8gdGhlCisgICAgICAgICAgICAgICAgICAgIGdsb2JhbCBuYW1lc3BhY2UuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQkJfU1JDUkVWX1BPTElDWSc+PGdsb3NzdGVybT5CQl9TUkNSRVZfUE9MSUNZPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIGJlaGF2aW9yIG9mIHRoZSBmZXRjaGVyIHdoZW4gaXQgaW50ZXJhY3RzIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgc291cmNlIGNvbnRyb2wgc3lzdGVtcyBhbmQgZHluYW1pYyBzb3VyY2UgcmV2aXNpb25zLgorICAgICAgICAgICAgICAgICAgICBUaGUgPGZpbGVuYW1lPkJCX1NSQ1JFVl9QT0xJQ1k8L2ZpbGVuYW1lPiB2YXJpYWJsZSBpcworICAgICAgICAgICAgICAgICAgICB1c2VmdWwgd2hlbiB3b3JraW5nIHdpdGhvdXQgYSBuZXR3b3JrLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGUgdmFyaWFibGUgY2FuIGJlIHNldCB1c2luZyBvbmUgb2YgdHdvIHBvbGljaWVzOgorICAgICAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz5jYWNoZTwvZW1waGFzaXM+IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXRhaW5zIHRoZSB2YWx1ZSB0aGUgc3lzdGVtIG9idGFpbmVkIHByZXZpb3VzbHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRoZXIgdGhhbiBxdWVyeWluZyB0aGUgc291cmNlIGNvbnRyb2wgc3lzdGVtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCB0aW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz5jbGVhcjwvZW1waGFzaXM+IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWVyaWVzIHRoZSBzb3VyY2UgY29udHJvbHMgc3lzdGVtIGV2ZXJ5IHRpbWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2l0aCB0aGlzIHBvbGljeSwgdGhlcmUgaXMgbm8gY2FjaGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJjbGVhciIgcG9saWN5IGlzIHRoZSBkZWZhdWx0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQl9TVEFNUF9QT0xJQ1knPjxnbG9zc3Rlcm0+QkJfU1RBTVBfUE9MSUNZPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIG1vZGUgdXNlZCBmb3IgaG93IHRpbWVzdGFtcHMgb2Ygc3RhbXAgZmlsZXMKKyAgICAgICAgICAgICAgICAgICAgYXJlIGNvbXBhcmVkLgorICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIHNldCB0aGUgdmFyaWFibGUgdG8gb25lIG9mIHRoZSBmb2xsb3dpbmcgbW9kZXM6CisgICAgICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPnBlcmZpbGU8L2VtcGhhc2lzPiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZXN0YW1wIGNvbXBhcmlzb25zIGFyZSBvbmx5IG1hZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIHRpbWVzdGFtcHMgb2YgYSBzcGVjaWZpYyByZWNpcGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgZGVmYXVsdCBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz5mdWxsPC9lbXBoYXNpcz4gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVzdGFtcCBjb21wYXJpc29ucyBhcmUgbWFkZSBmb3IgYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz53aGl0ZWxpc3Q8L2VtcGhhc2lzPiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpY2FsIHRvICJmdWxsIiBtb2RlIGV4Y2VwdCB0aW1lc3RhbXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29ucyBhcmUgbWFkZSBmb3IgcmVjaXBlcyBsaXN0ZWQgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUJCX1NUQU1QX1dISVRFTElTVCc+PGZpbGVuYW1lPkJCX1NUQU1QX1dISVRFTElTVDwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgICAgICAgICBTdGFtcCBwb2xpY2llcyBhcmUgbGFyZ2VseSBvYnNvbGV0ZSB3aXRoIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgaW50cm9kdWN0aW9uIG9mIHNldHNjZW5lIHRhc2tzLgorICAgICAgICAgICAgICAgICAgICA8L25vdGU+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQkJfU1RBTVBfV0hJVEVMSVNUJz48Z2xvc3N0ZXJtPkJCX1NUQU1QX1dISVRFTElTVDwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBMaXN0cyBmaWxlcyB3aG9zZSBzdGFtcCBmaWxlIHRpbWVzdGFtcHMgYXJlIGNvbXBhcmVkIHdoZW4KKyAgICAgICAgICAgICAgICAgICAgdGhlIHN0YW1wIHBvbGljeSBtb2RlIGlzIHNldCB0byAid2hpdGVsaXN0Ii4KKyAgICAgICAgICAgICAgICAgICAgRm9yIGluZm9ybWF0aW9uIG9uIHN0YW1wIHBvbGljaWVzLCBzZWUgdGhlCisgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1CQl9TVEFNUF9QT0xJQ1knPjxmaWxlbmFtZT5CQl9TVEFNUF9QT0xJQ1k8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQkJfU1RSSUNUX0NIRUNLU1VNJz48Z2xvc3N0ZXJtPkJCX1NUUklDVF9DSEVDS1NVTTwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBTZXRzIGEgbW9yZSBzdHJpY3QgY2hlY2tzdW0gbWVjaGFuaXNtIGZvciBub24tbG9jYWwgVVJMcy4KKyAgICAgICAgICAgICAgICAgICAgU2V0dGluZyB0aGlzIHZhcmlhYmxlIHRvIGEgdmFsdWUgY2F1c2VzIEJpdEJha2UKKyAgICAgICAgICAgICAgICAgICAgdG8gcmVwb3J0IGFuIGVycm9yIGlmIGl0IGVuY291bnRlcnMgYSBub24tbG9jYWwgVVJMCisgICAgICAgICAgICAgICAgICAgIHRoYXQgZG9lcyBub3QgaGF2ZSBhdCBsZWFzdCBvbmUgY2hlY2tzdW0gc3BlY2lmaWVkLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUJCX1RBU0tfTklDRV9MRVZFTCc+PGdsb3NzdGVybT5CQl9UQVNLX05JQ0VfTEVWRUw8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgQWxsb3dzIHNwZWNpZmljIHRhc2tzIHRvIGNoYW5nZSB0aGVpciBwcmlvcml0eQorICAgICAgICAgICAgICAgICAgICAoaS5lLiBuaWNlIGxldmVsKS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgWW91IGNhbiB1c2UgdGhpcyB2YXJpYWJsZSBpbiBjb21iaW5hdGlvbiB3aXRoIHRhc2sKKyAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGVzIHRvIHJhaXNlIG9yIGxvd2VyIHByaW9yaXRpZXMgb2Ygc3BlY2lmaWMgdGFza3MuCisgICAgICAgICAgICAgICAgICAgIEZvciBleGFtcGxlLCBvbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgPHVsaW5rIHVybD0naHR0cDovL3d3dy55b2N0b3Byb2plY3Qub3JnJz5Zb2N0byBQcm9qZWN0PC91bGluaz4KKyAgICAgICAgICAgICAgICAgICAgYXV0b2J1aWxkZXIsIFFFTVUgZW11bGF0aW9uIGluIGltYWdlcyBpcyBnaXZlbiBhIGhpZ2hlcgorICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSBhcyBjb21wYXJlZCB0byBidWlsZCB0YXNrcyB0byBlbnN1cmUgdGhhdCBpbWFnZXMKKyAgICAgICAgICAgICAgICAgICAgZG8gbm90IHN1ZmZlciB0aW1lb3V0cyBvbiBsb2FkZWQgc3lzdGVtcy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQl9UQVNLSEFTSCc+PGdsb3NzdGVybT5CQl9UQVNLSEFTSDwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBXaXRoaW4gYW4gZXhlY3V0aW5nIHRhc2ssIHRoaXMgdmFyaWFibGUgaG9sZHMgdGhlIGhhc2gKKyAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHRhc2sgYXMgcmV0dXJuZWQgYnkgdGhlIGN1cnJlbnRseSBlbmFibGVkCisgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZSBnZW5lcmF0b3IuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQkJfVkVSQk9TRV9MT0dTJz48Z2xvc3N0ZXJtPkJCX1ZFUkJPU0VfTE9HUzwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBDb250cm9scyBob3cgdmVyYm9zZSBCaXRCYWtlIGlzIGR1cmluZyBidWlsZHMuCisgICAgICAgICAgICAgICAgICAgIElmIHNldCwgc2hlbGwgc2NyaXB0cyBlY2hvIGNvbW1hbmRzIGFuZCBzaGVsbCBzY3JpcHQgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgIGFwcGVhcnMgb24gc3RhbmRhcmQgb3V0IChzdGRvdXQpLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUJCX1dPUktFUkNPTlRFWFQnPjxnbG9zc3Rlcm0+QkJfV09SS0VSQ09OVEVYVDwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgaWYgdGhlIGN1cnJlbnQgY29udGV4dCBpcyBleGVjdXRpbmcgYSB0YXNrLgorICAgICAgICAgICAgICAgICAgICBCaXRCYWtlIHNldHMgdGhpcyB2YXJpYWJsZSB0byAiMSIgd2hlbiBhIHRhc2sgaXMKKyAgICAgICAgICAgICAgICAgICAgYmVpbmcgZXhlY3V0ZWQuCisgICAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSBpcyBub3Qgc2V0IHdoZW4gdGhlIHRhc2sgaXMgaW4gc2VydmVyIGNvbnRleHQKKyAgICAgICAgICAgICAgICAgICAgZHVyaW5nIHBhcnNpbmcgb3IgZXZlbnQgaGFuZGxpbmcuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQkNMQVNTRVhURU5EJz48Z2xvc3N0ZXJtPkJCQ0xBU1NFWFRFTkQ8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgQWxsb3dzIHlvdSB0byBleHRlbmQgYSByZWNpcGUgc28gdGhhdCBpdCBidWlsZHMgdmFyaWFudHMKKyAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHNvZnR3YXJlLgorICAgICAgICAgICAgICAgICAgICBTb21lIGV4YW1wbGVzIG9mIHRoZXNlIHZhcmlhbnRzIGZvciByZWNpcGVzIGZyb20gdGhlCisgICAgICAgICAgICAgICAgICAgIE9wZW5FbWJlZGRlZCBDb3JlIG1ldGFkYXRhIGFyZSAibmF0aXZlcyIgc3VjaCBhcworICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+cXVpbHQtbmF0aXZlPC9maWxlbmFtZT4sIHdoaWNoIGlzIGEgY29weSBvZgorICAgICAgICAgICAgICAgICAgICBRdWlsdCBidWlsdCB0byBydW4gb24gdGhlIGJ1aWxkIHN5c3RlbTsgImNyb3NzZXMiIHN1Y2gKKyAgICAgICAgICAgICAgICAgICAgYXMgPGZpbGVuYW1lPmdjYy1jcm9zczwvZmlsZW5hbWU+LCB3aGljaCBpcyBhIGNvbXBpbGVyCisgICAgICAgICAgICAgICAgICAgIGJ1aWx0IHRvIHJ1biBvbiB0aGUgYnVpbGQgbWFjaGluZSBidXQgcHJvZHVjZXMgYmluYXJpZXMKKyAgICAgICAgICAgICAgICAgICAgdGhhdCBydW4gb24gdGhlIHRhcmdldCA8ZmlsZW5hbWU+TUFDSElORTwvZmlsZW5hbWU+OworICAgICAgICAgICAgICAgICAgICAibmF0aXZlc2RrIiwgd2hpY2ggdGFyZ2V0cyB0aGUgU0RLIG1hY2hpbmUgaW5zdGVhZCBvZgorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+TUFDSElORTwvZmlsZW5hbWU+OyBhbmQgIm11bGl0bGlicyIgaW4gdGhlIGZvcm0KKyAgICAgICAgICAgICAgICAgICAgIjxmaWxlbmFtZT5tdWx0aWxpYjo8L2ZpbGVuYW1lPjxyZXBsYWNlYWJsZT5tdWx0aWxpYl9uYW1lPC9yZXBsYWNlYWJsZT4iLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUbyBidWlsZCBhIGRpZmZlcmVudCB2YXJpYW50IG9mIHRoZSByZWNpcGUgd2l0aCBhIG1pbmltYWwKKyAgICAgICAgICAgICAgICAgICAgYW1vdW50IG9mIGNvZGUsIGl0IHVzdWFsbHkgaXMgYXMgc2ltcGxlIGFzIGFkZGluZyB0aGUKKyAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgdG8geW91ciByZWNpcGUuCisgICAgICAgICAgICAgICAgICAgIEhlcmUgYXJlIHR3byBleGFtcGxlcy4KKyAgICAgICAgICAgICAgICAgICAgVGhlICJuYXRpdmUiIHZhcmlhbnRzIGFyZSBmcm9tIHRoZSBPcGVuRW1iZWRkZWQgQ29yZQorICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YToKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBCQkNMQVNTRVhURU5EID0rICJuYXRpdmUgbmF0aXZlc2RrIgorICAgICBCQkNMQVNTRVhURU5EID0rICJtdWx0aWxpYjo8cmVwbGFjZWFibGU+bXVsdGlsaWJfbmFtZTwvcmVwbGFjZWFibGU+IgorICAgICAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUJCREVCVUcnPjxnbG9zc3Rlcm0+QkJERUJVRzwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBTZXRzIHRoZSBCaXRCYWtlIGRlYnVnIG91dHB1dCBsZXZlbCB0byBhIHNwZWNpZmljIHZhbHVlCisgICAgICAgICAgICAgICAgICAgIGFzIGluY3JlbWVudGVkIGJ5IHRoZSA8ZmlsZW5hbWU+LWQ8L2ZpbGVuYW1lPiBjb21tYW5kIGxpbmUKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9uLgorICAgICAgICAgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFlvdSBtdXN0IHNldCB0aGlzIHZhcmlhYmxlIGluIHRoZSBleHRlcm5hbCBlbnZpcm9ubWVudAorICAgICAgICAgICAgICAgICAgICAgICAgaW4gb3JkZXIgZm9yIGl0IHRvIHdvcmsuCisgICAgICAgICAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQkJGSUxFX0NPTExFQ1RJT05TJz48Z2xvc3N0ZXJtPkJCRklMRV9DT0xMRUNUSU9OUzwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPkxpc3RzIHRoZSBuYW1lcyBvZiBjb25maWd1cmVkIGxheWVycy4KKyAgICAgICAgICAgICAgICAgICAgVGhlc2UgbmFtZXMgYXJlIHVzZWQgdG8gZmluZCB0aGUgb3RoZXIgPGZpbGVuYW1lPkJCRklMRV8qPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzLgorICAgICAgICAgICAgICAgICAgICBUeXBpY2FsbHksIGVhY2ggbGF5ZXIgYXBwZW5kcyBpdHMgbmFtZSB0byB0aGlzIHZhcmlhYmxlIGluIGl0cworICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+Y29uZi9sYXllci5jb25mPC9maWxlbmFtZT4gZmlsZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQkZJTEVfUEFUVEVSTic+PGdsb3NzdGVybT5CQkZJTEVfUEFUVEVSTjwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPlZhcmlhYmxlIHRoYXQgZXhwYW5kcyB0byBtYXRjaCBmaWxlcyBmcm9tCisgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1CQkZJTEVTJz48ZmlsZW5hbWU+QkJGSUxFUzwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgICAgICAgICBpbiBhIHBhcnRpY3VsYXIgbGF5ZXIuCisgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFyaWFibGUgaXMgdXNlZCBpbiB0aGUgPGZpbGVuYW1lPmNvbmYvbGF5ZXIuY29uZjwvZmlsZW5hbWU+IGZpbGUgYW5kIG11c3QKKyAgICAgICAgICAgICAgICAgICAgYmUgc3VmZml4ZWQgd2l0aCB0aGUgbmFtZSBvZiB0aGUgc3BlY2lmaWMgbGF5ZXIgKGUuZy4KKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPkJCRklMRV9QQVRURVJOX2VtZW5sb3c8L2ZpbGVuYW1lPikuPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQkJGSUxFX1BSSU9SSVRZJz48Z2xvc3N0ZXJtPkJCRklMRV9QUklPUklUWTwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPkFzc2lnbnMgdGhlIHByaW9yaXR5IGZvciByZWNpcGUgZmlsZXMgaW4gZWFjaCBsYXllci48L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+VGhpcyB2YXJpYWJsZSBpcyB1c2VmdWwgaW4gc2l0dWF0aW9ucyB3aGVyZSB0aGUgc2FtZSByZWNpcGUgYXBwZWFycyBpbgorICAgICAgICAgICAgICAgICAgICBtb3JlIHRoYW4gb25lIGxheWVyLgorICAgICAgICAgICAgICAgICAgICBTZXR0aW5nIHRoaXMgdmFyaWFibGUgYWxsb3dzIHlvdSB0byBwcmlvcml0aXplIGEKKyAgICAgICAgICAgICAgICAgICAgbGF5ZXIgYWdhaW5zdCBvdGhlciBsYXllcnMgdGhhdCBjb250YWluIHRoZSBzYW1lIHJlY2lwZSAtIGVmZmVjdGl2ZWx5CisgICAgICAgICAgICAgICAgICAgIGxldHRpbmcgeW91IGNvbnRyb2wgdGhlIHByZWNlZGVuY2UgZm9yIHRoZSBtdWx0aXBsZSBsYXllcnMuCisgICAgICAgICAgICAgICAgICAgIFRoZSBwcmVjZWRlbmNlIGVzdGFibGlzaGVkIHRocm91Z2ggdGhpcyB2YXJpYWJsZSBzdGFuZHMgcmVnYXJkbGVzcyBvZiBhCisgICAgICAgICAgICAgICAgICAgIHJlY2lwZSdzIHZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgKDxsaW5rIGxpbmtlbmQ9J3Zhci1QVic+PGZpbGVuYW1lPlBWPC9maWxlbmFtZT48L2xpbms+IHZhcmlhYmxlKS4KKyAgICAgICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIGEgbGF5ZXIgdGhhdCBoYXMgYSByZWNpcGUgd2l0aCBhIGhpZ2hlciA8ZmlsZW5hbWU+UFY8L2ZpbGVuYW1lPiB2YWx1ZSBidXQgZm9yCisgICAgICAgICAgICAgICAgICAgIHdoaWNoIHRoZSA8ZmlsZW5hbWU+QkJGSUxFX1BSSU9SSVRZPC9maWxlbmFtZT4gaXMgc2V0IHRvIGhhdmUgYSBsb3dlciBwcmVjZWRlbmNlIHN0aWxsIGhhcyBhCisgICAgICAgICAgICAgICAgICAgIGxvd2VyIHByZWNlZGVuY2UuPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPkEgbGFyZ2VyIHZhbHVlIGZvciB0aGUgPGZpbGVuYW1lPkJCRklMRV9QUklPUklUWTwvZmlsZW5hbWU+IHZhcmlhYmxlIHJlc3VsdHMgaW4gYSBoaWdoZXIKKyAgICAgICAgICAgICAgICAgICAgcHJlY2VkZW5jZS4KKyAgICAgICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRoZSB2YWx1ZSA2IGhhcyBhIGhpZ2hlciBwcmVjZWRlbmNlIHRoYW4gdGhlIHZhbHVlIDUuCisgICAgICAgICAgICAgICAgICAgIElmIG5vdCBzcGVjaWZpZWQsIHRoZSA8ZmlsZW5hbWU+QkJGSUxFX1BSSU9SSVRZPC9maWxlbmFtZT4gdmFyaWFibGUgaXMgc2V0IGJhc2VkIG9uIGxheWVyCisgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llcyAoc2VlIHRoZQorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+PGxpbmsgbGlua2VuZD0ndmFyLUxBWUVSREVQRU5EUyc+TEFZRVJERVBFTkRTPC9saW5rPjwvZmlsZW5hbWU+IHZhcmlhYmxlIGZvcgorICAgICAgICAgICAgICAgICAgICBtb3JlIGluZm9ybWF0aW9uLgorICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCBwcmlvcml0eSwgaWYgdW5zcGVjaWZpZWQKKyAgICAgICAgICAgICAgICAgICAgZm9yIGEgbGF5ZXIgd2l0aCBubyBkZXBlbmRlbmNpZXMsIGlzIHRoZSBsb3dlc3QgZGVmaW5lZCBwcmlvcml0eSArIDEKKyAgICAgICAgICAgICAgICAgICAgKG9yIDEgaWYgbm8gcHJpb3JpdGllcyBhcmUgZGVmaW5lZCkuPC9wYXJhPgorICAgICAgICAgICAgICAgIDx0aXA+CisgICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gdXNlIHRoZSBjb21tYW5kIDxmaWxlbmFtZT5iaXRiYWtlLWxheWVycyBzaG93LWxheWVyczwvZmlsZW5hbWU+IHRvIGxpc3QKKyAgICAgICAgICAgICAgICAgICAgYWxsIGNvbmZpZ3VyZWQgbGF5ZXJzIGFsb25nIHdpdGggdGhlaXIgcHJpb3JpdGllcy4KKyAgICAgICAgICAgICAgICA8L3RpcD4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUJCRklMRVMnPjxnbG9zc3Rlcm0+QkJGSUxFUzwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPkxpc3Qgb2YgcmVjaXBlIGZpbGVzIEJpdEJha2UgdXNlcyB0byBidWlsZCBzb2Z0d2FyZS48L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQklOQ0xVREVEJz48Z2xvc3N0ZXJtPkJCSU5DTFVERUQ8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgQ29udGFpbnMgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBhbGwgb2YgYWxsIGZpbGVzIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgQml0QmFrZSdzIHBhcnNlciBpbmNsdWRlZCBkdXJpbmcgcGFyc2luZyBvZiB0aGUgY3VycmVudAorICAgICAgICAgICAgICAgICAgICBmaWxlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUJCSU5DTFVERUxPR1MnPjxnbG9zc3Rlcm0+QkJJTkNMVURFTE9HUzwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBJZiBzZXQgdG8gYSB2YWx1ZSwgZW5hYmxlcyBwcmludGluZyB0aGUgdGFzayBsb2cgd2hlbgorICAgICAgICAgICAgICAgICAgICByZXBvcnRpbmcgYSBmYWlsZWQgdGFzay4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQklOQ0xVREVMT0dTX0xJTkVTJz48Z2xvc3N0ZXJtPkJCSU5DTFVERUxPR1NfTElORVM8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgSWYKKyAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUJCSU5DTFVERUxPR1MnPjxmaWxlbmFtZT5CQklOQ0xVREVMT0dTPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgICAgIGlzIHNldCwgc3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsaW5lcyBmcm9tIHRoZQorICAgICAgICAgICAgICAgICAgICB0YXNrIGxvZyBmaWxlIHRvIHByaW50IHdoZW4gcmVwb3J0aW5nIGEgZmFpbGVkIHRhc2suCisgICAgICAgICAgICAgICAgICAgIElmIHlvdSBkbyBub3Qgc2V0IDxmaWxlbmFtZT5CQklOQ0xVREVMT0dTX0xJTkVTPC9maWxlbmFtZT4sCisgICAgICAgICAgICAgICAgICAgIHRoZSBlbnRpcmUgbG9nIGlzIHByaW50ZWQuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQkJMQVlFUlMnPjxnbG9zc3Rlcm0+QkJMQVlFUlM8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT5MaXN0cyB0aGUgbGF5ZXJzIHRvIGVuYWJsZSBkdXJpbmcgdGhlIGJ1aWxkLgorICAgICAgICAgICAgICAgICAgICBUaGlzIHZhcmlhYmxlIGlzIGRlZmluZWQgaW4gdGhlIDxmaWxlbmFtZT5iYmxheWVycy5jb25mPC9maWxlbmFtZT4gY29uZmlndXJhdGlvbgorICAgICAgICAgICAgICAgICAgICBmaWxlIGluIHRoZSBidWlsZCBkaXJlY3RvcnkuCisgICAgICAgICAgICAgICAgICAgIEhlcmUgaXMgYW4gZXhhbXBsZToKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBCQkxBWUVSUyA9ICIgXAorICAgICAgIC9ob21lL3Njb3R0cmlmL3Bva3kvbWV0YSBcCisgICAgICAgL2hvbWUvc2NvdHRyaWYvcG9reS9tZXRhLXlvY3RvIFwKKyAgICAgICAvaG9tZS9zY290dHJpZi9wb2t5L21ldGEteW9jdG8tYnNwIFwKKyAgICAgICAvaG9tZS9zY290dHJpZi9wb2t5L21ldGEtbXlrZXJuZWwgXAorICAgICAgICIKKworICAgICAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgICAgIFRoaXMgZXhhbXBsZSBlbmFibGVzIGZvdXIgbGF5ZXJzLCBvbmUgb2Ygd2hpY2ggaXMgYSBjdXN0b20sIHVzZXItZGVmaW5lZCBsYXllcgorICAgICAgICAgICAgICAgICAgICBuYW1lZCA8ZmlsZW5hbWU+bWV0YS1teWtlcm5lbDwvZmlsZW5hbWU+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUJCTEFZRVJTX0ZFVENIX0RJUic+PGdsb3NzdGVybT5CQkxBWUVSU19GRVRDSF9ESVI8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgU2V0cyB0aGUgYmFzZSBsb2NhdGlvbiB3aGVyZSBsYXllcnMgYXJlIHN0b3JlZC4KKyAgICAgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCwgdGhpcyBsb2NhdGlvbiBpcyBzZXQgdG8KKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPiR7Q09SRUJBU0V9PC9maWxlbmFtZT4uCisgICAgICAgICAgICAgICAgICAgIFRoaXMgc2V0dGluZyBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmJpdGJha2UtbGF5ZXJzIGxheWVyaW5kZXgtZmV0Y2g8L2ZpbGVuYW1lPiBhbmQKKyAgICAgICAgICAgICAgICAgICAgdGVsbHMgPGZpbGVuYW1lPmJpdGJha2UtbGF5ZXJzPC9maWxlbmFtZT4gd2hlcmUgdG8gcGxhY2UKKyAgICAgICAgICAgICAgICAgICAgdGhlIGZldGNoZWQgbGF5ZXJzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUJCTUFTSyc+PGdsb3NzdGVybT5CQk1BU0s8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgUHJldmVudHMgQml0QmFrZSBmcm9tIHByb2Nlc3NpbmcgcmVjaXBlcyBhbmQgcmVjaXBlCisgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBmaWxlcy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgWW91IGNhbiB1c2UgdGhlIDxmaWxlbmFtZT5CQk1BU0s8L2ZpbGVuYW1lPiB2YXJpYWJsZQorICAgICAgICAgICAgICAgICAgICB0byAiaGlkZSIgdGhlc2UgPGZpbGVuYW1lPi5iYjwvZmlsZW5hbWU+IGFuZAorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+LmJiYXBwZW5kPC9maWxlbmFtZT4gZmlsZXMuCisgICAgICAgICAgICAgICAgICAgIEJpdEJha2UgaWdub3JlcyBhbnkgcmVjaXBlIG9yIHJlY2lwZSBhcHBlbmQgZmlsZXMgdGhhdAorICAgICAgICAgICAgICAgICAgICBtYXRjaCB0aGUgZXhwcmVzc2lvbi4KKyAgICAgICAgICAgICAgICAgICAgSXQgaXMgYXMgaWYgQml0QmFrZSBkb2VzIG5vdCBzZWUgdGhlbSBhdCBhbGwuCisgICAgICAgICAgICAgICAgICAgIENvbnNlcXVlbnRseSwgbWF0Y2hpbmcgZmlsZXMgYXJlIG5vdCBwYXJzZWQgb3Igb3RoZXJ3aXNlCisgICAgICAgICAgICAgICAgICAgIHVzZWQgYnkgQml0QmFrZS48L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSB5b3UgcHJvdmlkZSBpcyBwYXNzZWQgdG8gUHl0aG9uJ3MgcmVndWxhcgorICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uIGNvbXBpbGVyLgorICAgICAgICAgICAgICAgICAgICBUaGUgZXhwcmVzc2lvbiBpcyBjb21wYXJlZCBhZ2FpbnN0IHRoZSBmdWxsIHBhdGhzIHRvCisgICAgICAgICAgICAgICAgICAgIHRoZSBmaWxlcy4KKyAgICAgICAgICAgICAgICAgICAgRm9yIGNvbXBsZXRlIHN5bnRheCBpbmZvcm1hdGlvbiwgc2VlIFB5dGhvbidzCisgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50YXRpb24gYXQKKyAgICAgICAgICAgICAgICAgICAgPHVsaW5rIHVybD0naHR0cDovL2RvY3MucHl0aG9uLm9yZy9yZWxlYXNlLzIuMy9saWIvcmUtc3ludGF4Lmh0bWwnPjwvdWxpbms+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgdXNlcyBhIGNvbXBsZXRlIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICB0byB0ZWxsIEJpdEJha2UgdG8gaWdub3JlIGFsbCByZWNpcGUgYW5kIHJlY2lwZSBhcHBlbmQKKyAgICAgICAgICAgICAgICAgICAgZmlsZXMgaW4gdGhlIDxmaWxlbmFtZT5tZXRhLXRpL3JlY2lwZXMtbWlzYy88L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICBkaXJlY3Rvcnk6CisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgQkJNQVNLID0gIm1ldGEtdGkvcmVjaXBlcy1taXNjLyIKKyAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgICAgICBJZiB5b3Ugd2FudCB0byBtYXNrIG91dCBtdWx0aXBsZSBkaXJlY3RvcmllcyBvciByZWNpcGVzLAorICAgICAgICAgICAgICAgICAgICB1c2UgdGhlIHZlcnRpY2FsIGJhciB0byBzZXBhcmF0ZSB0aGUgcmVndWxhciBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50cy4KKyAgICAgICAgICAgICAgICAgICAgVGhpcyBuZXh0IGV4YW1wbGUgbWFza3Mgb3V0IG11bHRpcGxlIGRpcmVjdG9yaWVzIGFuZAorICAgICAgICAgICAgICAgICAgICBpbmRpdmlkdWFsIHJlY2lwZXM6CisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgQkJNQVNLID0gIm1ldGEtdGkvcmVjaXBlcy1taXNjL3xtZXRhLXRpL3JlY2lwZXMtdGkvcGFja2FnZWdyb3VwLyIKKyAgICAgQkJNQVNLIC49ICJ8LiptZXRhLW9lL3JlY2lwZXMtc3VwcG9ydC8iCisgICAgIEJCTUFTSyAuPSAifC4qb3BlbmxkYXAiCisgICAgIEJCTUFTSyAuPSAifC4qb3BlbmN2IgorICAgICBCQk1BU0sgLj0gInwuKmx6bWEiCisgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICAgICAgTm90aWNlIGhvdyB0aGUgdmVydGljYWwgYmFyIGlzIHVzZWQgdG8gYXBwZW5kIHRoZSBmcmFnbWVudHMuCisgICAgICAgICAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgICAgICAgICAgV2hlbiBzcGVjaWZ5aW5nIGEgZGlyZWN0b3J5IG5hbWUsIHVzZSB0aGUgdHJhaWxpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsYXNoIGNoYXJhY3RlciB0byBlbnN1cmUgeW91IG1hdGNoIGp1c3QgdGhhdCBkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuCisgICAgICAgICAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQlBBVEgnPjxnbG9zc3Rlcm0+QkJQQVRIPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFVzZWQgYnkgQml0QmFrZSB0byBsb2NhdGUgY2xhc3MKKyAgICAgICAgICAgICAgICAgICAgKDxmaWxlbmFtZT4uYmJjbGFzczwvZmlsZW5hbWU+KSBhbmQgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgICAgICAgICAoPGZpbGVuYW1lPi5jb25mPC9maWxlbmFtZT4pIGZpbGVzLgorICAgICAgICAgICAgICAgICAgICBUaGlzIHZhcmlhYmxlIGlzIGFuYWxvZ291cyB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPlBBVEg8L2ZpbGVuYW1lPiB2YXJpYWJsZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgSWYgeW91IHJ1biBCaXRCYWtlIGZyb20gYSBkaXJlY3Rvcnkgb3V0c2lkZSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgYnVpbGQgZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICB5b3UgbXVzdCBiZSBzdXJlIHRvIHNldAorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+QkJQQVRIPC9maWxlbmFtZT4gdG8gcG9pbnQgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgIGJ1aWxkIGRpcmVjdG9yeS4KKyAgICAgICAgICAgICAgICAgICAgU2V0IHRoZSB2YXJpYWJsZSBhcyB5b3Ugd291bGQgYW55IGVudmlyb25tZW50IHZhcmlhYmxlCisgICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIHJ1biBCaXRCYWtlOgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgICQgQkJQQVRIPSI8cmVwbGFjZWFibGU+YnVpbGRfZGlyZWN0b3J5PC9yZXBsYWNlYWJsZT4iCisgICAgICQgZXhwb3J0IEJCUEFUSAorICAgICAkIGJpdGJha2UgPHJlcGxhY2VhYmxlPnRhcmdldDwvcmVwbGFjZWFibGU+CisgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQlNFUlZFUic+PGdsb3NzdGVybT5CQlNFUlZFUjwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBQb2ludHMgdG8gdGhlIHNlcnZlciB0aGF0IHJ1bnMgbWVtb3J5LXJlc2lkZW50IEJpdEJha2UuCisgICAgICAgICAgICAgICAgICAgIFRoZSB2YXJpYWJsZSBpcyBvbmx5IHVzZWQgd2hlbiB5b3UgZW1wbG95IG1lbW9yeS1yZXNpZGVudAorICAgICAgICAgICAgICAgICAgICBCaXRCYWtlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUJCVkVSU0lPTlMnPjxnbG9zc3Rlcm0+QkJWRVJTSU9OUzwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBBbGxvd3MgYSBzaW5nbGUgcmVjaXBlIHRvIGJ1aWxkIG11bHRpcGxlIHZlcnNpb25zIG9mIGEKKyAgICAgICAgICAgICAgICAgICAgcHJvamVjdCBmcm9tIGEgc2luZ2xlIHJlY2lwZSBmaWxlLgorICAgICAgICAgICAgICAgICAgICBZb3UgYWxzbyBhYmxlIHRvIHNwZWNpZnkgY29uZGl0aW9uYWwgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICAgICAgdXNpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1PVkVSUklERVMnPjxmaWxlbmFtZT5PVkVSUklERVM8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgbWVjaGFuaXNtIGZvciBhIHNpbmdsZSB2ZXJzaW9uIG9yIGZvciBhbiBvcHRpb25hbGx5IG5hbWVkCisgICAgICAgICAgICAgICAgICAgIHJhbmdlIG9mIHZlcnNpb25zLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiA8ZmlsZW5hbWU+QkJWRVJTSU9OUzwvZmlsZW5hbWU+LAorICAgICAgICAgICAgICAgICAgICBzZWUgdGhlCisgICAgICAgICAgICAgICAgICAgICI8bGluayBsaW5rZW5kPSd2YXJpYW50cy1jbGFzcy1leHRlbnNpb24tbWVjaGFuaXNtJz5WYXJpYW50cyAtIENsYXNzIEV4dGVuc2lvbiBNZWNoYW5pc208L2xpbms+IgorICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUJJVEJBS0VfVUknPjxnbG9zc3Rlcm0+QklUQkFLRV9VSTwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBVc2VkIHRvIHNwZWNpZnkgdGhlIFVJIG1vZHVsZSB0byB1c2Ugd2hlbiBydW5uaW5nIEJpdEJha2UuCisgICAgICAgICAgICAgICAgICAgIFVzaW5nIHRoaXMgdmFyaWFibGUgaXMgZXF1aXZhbGVudCB0byB1c2luZyB0aGUKKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPi11PC9maWxlbmFtZT4gY29tbWFuZC1saW5lIG9wdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgICAgICAgICBZb3UgbXVzdCBzZXQgdGhpcyB2YXJpYWJsZSBpbiB0aGUgZXh0ZXJuYWwgZW52aXJvbm1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIGluIG9yZGVyIGZvciBpdCB0byB3b3JrLgorICAgICAgICAgICAgICAgICAgICA8L25vdGU+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQlVJTEROQU1FJz48Z2xvc3N0ZXJtPkJVSUxETkFNRTwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBBIG5hbWUgYXNzaWduZWQgdG8gdGhlIGJ1aWxkLgorICAgICAgICAgICAgICAgICAgICBUaGUgbmFtZSBkZWZhdWx0cyB0byBhIGRhdGV0aW1lIHN0YW1wIG9mIHdoZW4gdGhlIGJ1aWxkIHdhcworICAgICAgICAgICAgICAgICAgICBzdGFydGVkIGJ1dCBjYW4gYmUgZGVmaW5lZCBieSB0aGUgbWV0YWRhdGEuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQlpSRElSJz48Z2xvc3N0ZXJtPkJaUkRJUjwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGUgZGlyZWN0b3J5IGluIHdoaWNoIGZpbGVzIGNoZWNrZWQgb3V0IG9mIGEgQmF6YWFyCisgICAgICAgICAgICAgICAgICAgIHN5c3RlbSBhcmUgc3RvcmVkLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgIDwvZ2xvc3NkaXY+CisKKyAgICA8Z2xvc3NkaXYgaWQ9J3Zhci1nbG9zc2FyeS1jJz48dGl0bGU+QzwvdGl0bGU+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1DQUNIRSc+PGdsb3NzdGVybT5DQUNIRTwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIGRpcmVjdG9yeSBCaXRCYWtlIHVzZXMgdG8gc3RvcmUgYSBjYWNoZQorICAgICAgICAgICAgICAgICAgICBvZiB0aGUgbWV0YWRhdGEgc28gaXQgZG9lcyBub3QgbmVlZCB0byBiZSBwYXJzZWQgZXZlcnkKKyAgICAgICAgICAgICAgICAgICAgdGltZSBCaXRCYWtlIGlzIHN0YXJ0ZWQuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQ1ZTRElSJz48Z2xvc3N0ZXJtPkNWU0RJUjwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGUgZGlyZWN0b3J5IGluIHdoaWNoIGZpbGVzIGNoZWNrZWQgb3V0IHVuZGVyIHRoZQorICAgICAgICAgICAgICAgICAgICBDVlMgc3lzdGVtIGFyZSBzdG9yZWQuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgPC9nbG9zc2Rpdj4KKworICAgIDxnbG9zc2RpdiBpZD0ndmFyLWdsb3NzYXJ5LWQnPjx0aXRsZT5EPC90aXRsZT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLURFRkFVTFRfUFJFRkVSRU5DRSc+PGdsb3NzdGVybT5ERUZBVUxUX1BSRUZFUkVOQ0U8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIGEgd2VhayBiaWFzIGZvciByZWNpcGUgc2VsZWN0aW9uIHByaW9yaXR5LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVGhlIG1vc3QgY29tbW9uIHVzYWdlIG9mIHRoaXMgaXMgdmFyaWFibGUgaXMgdG8gc2V0CisgICAgICAgICAgICAgICAgICAgIGl0IHRvICItMSIgd2l0aGluIGEgcmVjaXBlIGZvciBhIGRldmVsb3BtZW50IHZlcnNpb24gb2YgYQorICAgICAgICAgICAgICAgICAgICBwaWVjZSBvZiBzb2Z0d2FyZS4KKyAgICAgICAgICAgICAgICAgICAgVXNpbmcgdGhlIHZhcmlhYmxlIGluIHRoaXMgd2F5IGNhdXNlcyB0aGUgc3RhYmxlIHZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHJlY2lwZSB0byBidWlsZCBieSBkZWZhdWx0IGluIHRoZSBhYnNlbmNlIG9mCisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT48bGluayBsaW5rZW5kPSd2YXItUFJFRkVSUkVEX1ZFUlNJT04nPlBSRUZFUlJFRF9WRVJTSU9OPC9saW5rPjwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIGJlaW5nIHVzZWQgdG8gYnVpbGQgdGhlIGRldmVsb3BtZW50IHZlcnNpb24uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgICAgICBUaGUgYmlhcyBwcm92aWRlZCBieSA8ZmlsZW5hbWU+REVGQVVMVF9QUkVGRVJFTkNFPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgaXMgd2VhayBhbmQgaXMgb3ZlcnJpZGRlbiBieQorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+PGxpbmsgbGlua2VuZD0ndmFyLUJCRklMRV9QUklPUklUWSc+QkJGSUxFX1BSSU9SSVRZPC9saW5rPjwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIGlmIHRoYXQgdmFyaWFibGUgaXMgZGlmZmVyZW50IGJldHdlZW4gdHdvIGxheWVycworICAgICAgICAgICAgICAgICAgICB0aGF0IGNvbnRhaW4gZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBzYW1lIHJlY2lwZS4KKyAgICAgICAgICAgICAgICA8L25vdGU+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1ERVBFTkRTJz48Z2xvc3N0ZXJtPkRFUEVORFM8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgTGlzdHMgYSByZWNpcGUncyBidWlsZC10aW1lIGRlcGVuZGVuY2llcworICAgICAgICAgICAgICAgICAgICAoaS5lLiBvdGhlciByZWNpcGUgZmlsZXMpLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBDb25zaWRlciB0aGlzIHNpbXBsZSBleGFtcGxlIGZvciB0d28gcmVjaXBlcyBuYW1lZCAiYSIgYW5kCisgICAgICAgICAgICAgICAgICAgICJiIiB0aGF0IHByb2R1Y2Ugc2ltaWxhcmx5IG5hbWVkIHBhY2thZ2VzLgorICAgICAgICAgICAgICAgICAgICBJbiB0aGlzIGV4YW1wbGUsIHRoZSA8ZmlsZW5hbWU+REVQRU5EUzwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCBhcHBlYXJzIGluIHRoZSAiYSIgcmVjaXBlOgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIERFUEVORFMgPSAiYiIKKyAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgICAgICBIZXJlLCB0aGUgZGVwZW5kZW5jeSBpcyBzdWNoIHRoYXQgdGhlCisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5kb19jb25maWd1cmU8L2ZpbGVuYW1lPiB0YXNrIGZvciByZWNpcGUgImEiCisgICAgICAgICAgICAgICAgICAgIGRlcGVuZHMgb24gdGhlIDxmaWxlbmFtZT5kb19wb3B1bGF0ZV9zeXNyb290PC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgdGFzayBvZiByZWNpcGUgImIiLgorICAgICAgICAgICAgICAgICAgICBUaGlzIG1lYW5zIGFueXRoaW5nIHRoYXQgcmVjaXBlICJiIiBwdXRzIGludG8gc3lzcm9vdAorICAgICAgICAgICAgICAgICAgICBpcyBhdmFpbGFibGUgd2hlbiByZWNpcGUgImEiIGlzIGNvbmZpZ3VyaW5nIGl0c2VsZi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgRm9yIGluZm9ybWF0aW9uIG9uIHJ1bnRpbWUgZGVwZW5kZW5jaWVzLCBzZWUgdGhlCisgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1SREVQRU5EUyc+PGZpbGVuYW1lPlJERVBFTkRTPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLURFU0NSSVBUSU9OJz48Z2xvc3N0ZXJtPkRFU0NSSVBUSU9OPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEEgbG9uZyBkZXNjcmlwdGlvbiBmb3IgdGhlIHJlY2lwZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1ETF9ESVInPjxnbG9zc3Rlcm0+RExfRElSPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFRoZSBjZW50cmFsIGRvd25sb2FkIGRpcmVjdG9yeSB1c2VkIGJ5IHRoZSBidWlsZCBwcm9jZXNzIHRvCisgICAgICAgICAgICAgICAgICAgIHN0b3JlIGRvd25sb2Fkcy4KKyAgICAgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCwgPGZpbGVuYW1lPkRMX0RJUjwvZmlsZW5hbWU+IGdldHMgZmlsZXMKKyAgICAgICAgICAgICAgICAgICAgc3VpdGFibGUgZm9yIG1pcnJvcmluZyBmb3IgZXZlcnl0aGluZyBleGNlcHQgR2l0CisgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcmllcy4KKyAgICAgICAgICAgICAgICAgICAgSWYgeW91IHdhbnQgdGFyYmFsbHMgb2YgR2l0IHJlcG9zaXRvcmllcywgdXNlIHRoZQorICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItQkJfR0VORVJBVEVfTUlSUk9SX1RBUkJBTExTJz48ZmlsZW5hbWU+QkJfR0VORVJBVEVfTUlSUk9SX1RBUkJBTExTPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisKKyAgICAgICAgPC9nbG9zc2VudHJ5PgorICAgIDwvZ2xvc3NkaXY+CisKKyAgICA8Z2xvc3NkaXYgaWQ9J3Zhci1nbG9zc2FyeS1lJz48dGl0bGU+RTwvdGl0bGU+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1FWENMVURFX0ZST01fV09STEQnPjxnbG9zc3Rlcm0+RVhDTFVERV9GUk9NX1dPUkxEPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIERpcmVjdHMgQml0QmFrZSB0byBleGNsdWRlIGEgcmVjaXBlIGZyb20gd29ybGQgYnVpbGRzIChpLmUuCisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5iaXRiYWtlIHdvcmxkPC9maWxlbmFtZT4pLgorICAgICAgICAgICAgICAgICAgICBEdXJpbmcgd29ybGQgYnVpbGRzLCBCaXRCYWtlIGxvY2F0ZXMsIHBhcnNlcyBhbmQgYnVpbGRzIGFsbAorICAgICAgICAgICAgICAgICAgICByZWNpcGVzIGZvdW5kIGluIGV2ZXJ5IGxheWVyIGV4cG9zZWQgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5iYmxheWVycy5jb25mPC9maWxlbmFtZT4gY29uZmlndXJhdGlvbiBmaWxlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUbyBleGNsdWRlIGEgcmVjaXBlIGZyb20gYSB3b3JsZCBidWlsZCB1c2luZyB0aGlzIHZhcmlhYmxlLAorICAgICAgICAgICAgICAgICAgICBzZXQgdGhlIHZhcmlhYmxlIHRvICIxIiBpbiB0aGUgcmVjaXBlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgICAgICBSZWNpcGVzIGFkZGVkIHRvIDxmaWxlbmFtZT5FWENMVURFX0ZST01fV09STEQ8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICBtYXkgc3RpbGwgYmUgYnVpbHQgZHVyaW5nIGEgd29ybGQgYnVpbGQgaW4gb3JkZXIgdG8gc2F0aXNmeQorICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMgb2Ygb3RoZXIgcmVjaXBlcy4KKyAgICAgICAgICAgICAgICAgICAgQWRkaW5nIGEgcmVjaXBlIHRvIDxmaWxlbmFtZT5FWENMVURFX0ZST01fV09STEQ8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICBvbmx5IGVuc3VyZXMgdGhhdCB0aGUgcmVjaXBlIGlzIG5vdCBleHBsaWNpdGx5IGFkZGVkCisgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBsaXN0IG9mIGJ1aWxkIHRhcmdldHMgaW4gYSB3b3JsZCBidWlsZC4KKyAgICAgICAgICAgICAgICA8L25vdGU+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICA8L2dsb3NzZGl2PgorCisgICAgPGdsb3NzZGl2IGlkPSd2YXItZ2xvc3NhcnktZic+PHRpdGxlPkY8L3RpdGxlPgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItRkFLRVJPT1QnPjxnbG9zc3Rlcm0+RkFLRVJPT1Q8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgIENvbnRhaW5zIHRoZSBjb21tYW5kIHRvIHVzZSB3aGVuIHJ1bm5pbmcgYSBzaGVsbCBzY3JpcHQKKyAgICAgICAgICAgICAgICAgICAgIGluIGEgZmFrZXJvb3QgZW52aXJvbm1lbnQuCisgICAgICAgICAgICAgICAgICAgICBUaGUgPGZpbGVuYW1lPkZBS0VST09UPC9maWxlbmFtZT4gdmFyaWFibGUgaXMgb2Jzb2xldGUKKyAgICAgICAgICAgICAgICAgICAgIGFuZCBoYXMgYmVlbiByZXBsYWNlZCBieSB0aGUgb3RoZXIKKyAgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5GQUtFUk9PVCo8L2ZpbGVuYW1lPiB2YXJpYWJsZXMuCisgICAgICAgICAgICAgICAgICAgICBTZWUgdGhlc2UgZW50cmllcyBpbiB0aGUgZ2xvc3NhcnkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItRkFLRVJPT1RCQVNFRU5WJz48Z2xvc3N0ZXJtPkZBS0VST09UQkFTRUVOVjwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgTGlzdHMgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHNldCB3aGVuIGV4ZWN1dGluZworICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbW1hbmQgZGVmaW5lZCBieQorICAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUZBS0VST09UQ01EJz48ZmlsZW5hbWU+RkFLRVJPT1RDTUQ8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgIHRoYXQgc3RhcnRzIHRoZSBiaXRiYWtlLXdvcmtlciBwcm9jZXNzCisgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgZmFrZXJvb3QgZW52aXJvbm1lbnQuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItRkFLRVJPT1RDTUQnPjxnbG9zc3Rlcm0+RkFLRVJPT1RDTUQ8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgIENvbnRhaW5zIHRoZSBjb21tYW5kIHRoYXQgc3RhcnRzIHRoZSBiaXRiYWtlLXdvcmtlcgorICAgICAgICAgICAgICAgICAgICAgcHJvY2VzcyBpbiB0aGUgZmFrZXJvb3QgZW52aXJvbm1lbnQuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItRkFLRVJPT1RESVJTJz48Z2xvc3N0ZXJtPkZBS0VST09URElSUzwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgTGlzdHMgZGlyZWN0b3JpZXMgdG8gY3JlYXRlIGJlZm9yZSBydW5uaW5nIGEgdGFzayBpbgorICAgICAgICAgICAgICAgICAgICAgdGhlIGZha2Vyb290IGVudmlyb25tZW50LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUZBS0VST09URU5WJz48Z2xvc3N0ZXJtPkZBS0VST09URU5WPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICBMaXN0cyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gc2V0IHdoZW4gcnVubmluZyBhIHRhc2sKKyAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBmYWtlcm9vdCBlbnZpcm9ubWVudC4KKyAgICAgICAgICAgICAgICAgICAgIEZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQKKyAgICAgICAgICAgICAgICAgICAgIHRoZSBmYWtlcm9vdCBlbnZpcm9ubWVudCwgc2VlIHRoZQorICAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUZBS0VST09UQkFTRUVOVic+PGZpbGVuYW1lPkZBS0VST09UQkFTRUVOVjwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItRkFLRVJPT1ROT0VOVic+PGdsb3NzdGVybT5GQUtFUk9PVE5PRU5WPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICBMaXN0cyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gc2V0IHdoZW4gcnVubmluZyBhIHRhc2sKKyAgICAgICAgICAgICAgICAgICAgIHRoYXQgaXMgbm90IGluIHRoZSBmYWtlcm9vdCBlbnZpcm9ubWVudC4KKyAgICAgICAgICAgICAgICAgICAgIEZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQKKyAgICAgICAgICAgICAgICAgICAgIHRoZSBmYWtlcm9vdCBlbnZpcm9ubWVudCwgc2VlIHRoZQorICAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUZBS0VST09URU5WJz48ZmlsZW5hbWU+RkFLRVJPT1RFTlY8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUZFVENIQ01EJz48Z2xvc3N0ZXJtPkZFVENIQ01EPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIGNvbW1hbmQgdGhlIEJpdEJha2UgZmV0Y2hlciBtb2R1bGUKKyAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZXMgd2hlbiBydW5uaW5nIGZldGNoIG9wZXJhdGlvbnMuCisgICAgICAgICAgICAgICAgICAgIFlvdSBuZWVkIHRvIHVzZSBhbiBvdmVycmlkZSBzdWZmaXggd2hlbiB5b3UgdXNlIHRoZQorICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSAoZS5nLiA8ZmlsZW5hbWU+RkVUQ0hDTURfZ2l0PC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgb3IgPGZpbGVuYW1lPkZFVENIQ01EX3N2bjwvZmlsZW5hbWU+KS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1GSUxFJz48Z2xvc3N0ZXJtPkZJTEU8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgUG9pbnRzIGF0IHRoZSBjdXJyZW50IGZpbGUuCisgICAgICAgICAgICAgICAgICAgIEJpdEJha2Ugc2V0cyB0aGlzIHZhcmlhYmxlIGR1cmluZyB0aGUgcGFyc2luZyBwcm9jZXNzCisgICAgICAgICAgICAgICAgICAgIHRvIGlkZW50aWZ5IHRoZSBmaWxlIGJlaW5nIHBhcnNlZC4KKyAgICAgICAgICAgICAgICAgICAgQml0QmFrZSBhbHNvIHNldHMgdGhpcyB2YXJpYWJsZSB3aGVuIGEgcmVjaXBlIGlzIGJlaW5nCisgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVkIHRvIGlkZW50aWZ5IHRoZSByZWNpcGUgZmlsZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1GSUxFU0RJUic+PGdsb3NzdGVybT5GSUxFU0RJUjwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgZGlyZWN0b3JpZXMgQml0QmFrZSB1c2VzIHdoZW4gc2VhcmNoaW5nIGZvcgorICAgICAgICAgICAgICAgICAgICBwYXRjaGVzIGFuZCBmaWxlcy4KKyAgICAgICAgICAgICAgICAgICAgVGhlICJsb2NhbCIgZmV0Y2hlciBtb2R1bGUgdXNlcyB0aGVzZSBkaXJlY3RvcmllcyB3aGVuCisgICAgICAgICAgICAgICAgICAgIGhhbmRsaW5nIDxmaWxlbmFtZT5maWxlOi8vPC9maWxlbmFtZT4gVVJMcyBpZiB0aGUgZmlsZQorICAgICAgICAgICAgICAgICAgICB3YXMgbm90IGZvdW5kIHVzaW5nCisgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1GSUxFU1BBVEgnPjxmaWxlbmFtZT5GSUxFU1BBVEg8L2ZpbGVuYW1lPjwvbGluaz4uCisgICAgICAgICAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgICAgICAgICAgVGhlIDxmaWxlbmFtZT5GSUxFU0RJUjwvZmlsZW5hbWU+IHZhcmlhYmxlIGlzCisgICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkIGFuZCB5b3Ugc2hvdWxkIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPkZJTEVTUEFUSDwvZmlsZW5hbWU+IGluIGFsbCBuZXcgY29kZS4KKyAgICAgICAgICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUZJTEVTUEFUSCc+PGdsb3NzdGVybT5GSUxFU1BBVEg8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIGRpcmVjdG9yaWVzIEJpdEJha2UgdXNlcyB3aGVuIHNlYXJjaGluZyBmb3IKKyAgICAgICAgICAgICAgICAgICAgcGF0Y2hlcyBhbmQgZmlsZXMuCisgICAgICAgICAgICAgICAgICAgIFRoZSAibG9jYWwiIGZldGNoZXIgbW9kdWxlIHVzZXMgdGhlc2UgZGlyZWN0b3JpZXMgd2hlbgorICAgICAgICAgICAgICAgICAgICBoYW5kbGluZyA8ZmlsZW5hbWU+ZmlsZTovLzwvZmlsZW5hbWU+IFVSTHMuCisgICAgICAgICAgICAgICAgICAgIFRoZSB2YXJpYWJsZSBiZWhhdmVzIGxpa2UgYSBzaGVsbCA8ZmlsZW5hbWU+UEFUSDwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50IHZhcmlhYmxlLgorICAgICAgICAgICAgICAgICAgICBUaGUgdmFsdWUgaXMgYSBjb2xvbi1zZXBhcmF0ZWQgbGlzdCBvZiBkaXJlY3RvcmllcyB0aGF0CisgICAgICAgICAgICAgICAgICAgIGFyZSBzZWFyY2hlZCBsZWZ0LXRvLXJpZ2h0IGluIG9yZGVyLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgIDwvZ2xvc3NkaXY+CisKKworICAgIDxnbG9zc2RpdiBpZD0ndmFyLWdsb3NzYXJ5LWcnPjx0aXRsZT5HPC90aXRsZT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUdJVERJUic+PGdsb3NzdGVybT5HSVRESVI8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVGhlIGRpcmVjdG9yeSBpbiB3aGljaCBhIGxvY2FsIGNvcHkgb2YgYSBHaXQgcmVwb3NpdG9yeQorICAgICAgICAgICAgICAgICAgICBpcyBzdG9yZWQgd2hlbiBpdCBpcyBjbG9uZWQuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgPC9nbG9zc2Rpdj4KKworCisgICAgPGdsb3NzZGl2IGlkPSd2YXItZ2xvc3NhcnktaCc+PHRpdGxlPkg8L3RpdGxlPgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItSEdESVInPjxnbG9zc3Rlcm0+SEdESVI8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVGhlIGRpcmVjdG9yeSBpbiB3aGljaCBmaWxlcyBjaGVja2VkIG91dCBvZiBhIE1lcmN1cmlhbAorICAgICAgICAgICAgICAgICAgICBzeXN0ZW0gYXJlIHN0b3JlZC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1IT01FUEFHRSc+PGdsb3NzdGVybT5IT01FUEFHRTwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPldlYnNpdGUgd2hlcmUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc29mdHdhcmUgdGhlIHJlY2lwZSBpcyBidWlsZGluZworICAgICAgICAgICAgICAgICAgICBjYW4gYmUgZm91bmQuPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgPC9nbG9zc2Rpdj4KKworICAgIDxnbG9zc2RpdiBpZD0ndmFyLWdsb3NzYXJ5LWknPjx0aXRsZT5JPC90aXRsZT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUlOSEVSSVQnPjxnbG9zc3Rlcm0+SU5IRVJJVDwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBDYXVzZXMgdGhlIG5hbWVkIGNsYXNzIHRvIGJlIGluaGVyaXRlZCBhdAorICAgICAgICAgICAgICAgICAgICB0aGlzIHBvaW50IGR1cmluZyBwYXJzaW5nLgorICAgICAgICAgICAgICAgICAgICBUaGUgdmFyaWFibGUgaXMgb25seSB2YWxpZCBpbiBjb25maWd1cmF0aW9uIGZpbGVzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgIDwvZ2xvc3NkaXY+CisKKzwhLS0KKyAgICA8Z2xvc3NkaXYgaWQ9J3Zhci1nbG9zc2FyeS1qJz48dGl0bGU+SjwvdGl0bGU+CisgICAgPC9nbG9zc2Rpdj4KKworICAgIDxnbG9zc2RpdiBpZD0ndmFyLWdsb3NzYXJ5LWsnPjx0aXRsZT5LPC90aXRsZT4KKyAgICA8L2dsb3NzZGl2PgorLS0+CisKKyAgICA8Z2xvc3NkaXYgaWQ9J3Zhci1nbG9zc2FyeS1sJz48dGl0bGU+TDwvdGl0bGU+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1MQVlFUkRFUEVORFMnPjxnbG9zc3Rlcm0+TEFZRVJERVBFTkRTPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+TGlzdHMgdGhlIGxheWVycywgc2VwYXJhdGVkIGJ5IHNwYWNlcywgdXBvbiB3aGljaCB0aGlzIHJlY2lwZSBkZXBlbmRzLgorICAgICAgICAgICAgICAgICAgICBPcHRpb25hbGx5LCB5b3UgY2FuIHNwZWNpZnkgYSBzcGVjaWZpYyBsYXllciB2ZXJzaW9uIGZvciBhIGRlcGVuZGVuY3kKKyAgICAgICAgICAgICAgICAgICAgYnkgYWRkaW5nIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGxheWVyIG5hbWUgd2l0aCBhIGNvbG9uLCAoZS5nLiAiYW5vdGhlcmxheWVyOjMiCisgICAgICAgICAgICAgICAgICAgIHRvIGJlIGNvbXBhcmVkIGFnYWluc3QKKyAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUxBWUVSVkVSU0lPTic+PGZpbGVuYW1lPkxBWUVSVkVSU0lPTjwvZmlsZW5hbWU+PC9saW5rPjxmaWxlbmFtZT5fYW5vdGhlcmxheWVyPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgaW4gdGhpcyBjYXNlKS4KKyAgICAgICAgICAgICAgICAgICAgQml0QmFrZSBwcm9kdWNlcyBhbiBlcnJvciBpZiBhbnkgZGVwZW5kZW5jeSBpcyBtaXNzaW5nIG9yCisgICAgICAgICAgICAgICAgICAgIHRoZSB2ZXJzaW9uIG51bWJlcnMgZG8gbm90IG1hdGNoIGV4YWN0bHkgKGlmIHNwZWNpZmllZCkuPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBZb3UgdXNlIHRoaXMgdmFyaWFibGUgaW4gdGhlIDxmaWxlbmFtZT5jb25mL2xheWVyLmNvbmY8L2ZpbGVuYW1lPiBmaWxlLgorICAgICAgICAgICAgICAgICAgICBZb3UgbXVzdCBhbHNvIHVzZSB0aGUgc3BlY2lmaWMgbGF5ZXIgbmFtZSBhcyBhIHN1ZmZpeAorICAgICAgICAgICAgICAgICAgICB0byB0aGUgdmFyaWFibGUgKGUuZy4gPGZpbGVuYW1lPkxBWUVSREVQRU5EU19teWxheWVyPC9maWxlbmFtZT4pLjwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUxBWUVSRElSJz48Z2xvc3N0ZXJtPkxBWUVSRElSPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+V2hlbiB1c2VkIGluc2lkZSB0aGUgPGZpbGVuYW1lPmxheWVyLmNvbmY8L2ZpbGVuYW1lPiBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAgICAgICAgIGZpbGUsIHRoaXMgdmFyaWFibGUgcHJvdmlkZXMgdGhlIHBhdGggb2YgdGhlIGN1cnJlbnQgbGF5ZXIuCisgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFyaWFibGUgaXMgbm90IGF2YWlsYWJsZSBvdXRzaWRlIG9mIDxmaWxlbmFtZT5sYXllci5jb25mPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgYW5kIHJlZmVyZW5jZXMgYXJlIGV4cGFuZGVkIGltbWVkaWF0ZWx5IHdoZW4gcGFyc2luZyBvZiB0aGUgZmlsZSBjb21wbGV0ZXMuPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItTEFZRVJWRVJTSU9OJz48Z2xvc3N0ZXJtPkxBWUVSVkVSU0lPTjwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPk9wdGlvbmFsbHkgc3BlY2lmaWVzIHRoZSB2ZXJzaW9uIG9mIGEgbGF5ZXIgYXMgYSBzaW5nbGUgbnVtYmVyLgorICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIHVzZSB0aGlzIHZhcmlhYmxlIHdpdGhpbgorICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItTEFZRVJERVBFTkRTJz48ZmlsZW5hbWU+TEFZRVJERVBFTkRTPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgICAgIGZvciBhbm90aGVyIGxheWVyIGluIG9yZGVyIHRvIGRlcGVuZCBvbiBhIHNwZWNpZmljIHZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGxheWVyLjwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgWW91IHVzZSB0aGlzIHZhcmlhYmxlIGluIHRoZSA8ZmlsZW5hbWU+Y29uZi9sYXllci5jb25mPC9maWxlbmFtZT4gZmlsZS4KKyAgICAgICAgICAgICAgICAgICAgWW91IG11c3QgYWxzbyB1c2UgdGhlIHNwZWNpZmljIGxheWVyIG5hbWUgYXMgYSBzdWZmaXgKKyAgICAgICAgICAgICAgICAgICAgdG8gdGhlIHZhcmlhYmxlIChlLmcuIDxmaWxlbmFtZT5MQVlFUkRFUEVORFNfbXlsYXllcjwvZmlsZW5hbWU+KS48L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1MSUNFTlNFJz48Z2xvc3N0ZXJtPkxJQ0VOU0U8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVGhlIGxpc3Qgb2Ygc291cmNlIGxpY2Vuc2VzIGZvciB0aGUgcmVjaXBlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgIDwvZ2xvc3NkaXY+CisKKyAgICA8Z2xvc3NkaXYgaWQ9J3Zhci1nbG9zc2FyeS1tJz48dGl0bGU+TTwvdGl0bGU+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1NSVJST1JTJz48Z2xvc3N0ZXJtPk1JUlJPUlM8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIGFkZGl0aW9uYWwgcGF0aHMgZnJvbSB3aGljaCBCaXRCYWtlIGdldHMgc291cmNlIGNvZGUuCisgICAgICAgICAgICAgICAgICAgIFdoZW4gdGhlIGJ1aWxkIHN5c3RlbSBzZWFyY2hlcyBmb3Igc291cmNlIGNvZGUsIGl0IGZpcnN0CisgICAgICAgICAgICAgICAgICAgIHRyaWVzIHRoZSBsb2NhbCBkb3dubG9hZCBkaXJlY3RvcnkuCisgICAgICAgICAgICAgICAgICAgIElmIHRoYXQgbG9jYXRpb24gZmFpbHMsIHRoZSBidWlsZCBzeXN0ZW0gdHJpZXMgbG9jYXRpb25zCisgICAgICAgICAgICAgICAgICAgIGRlZmluZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVBSRU1JUlJPUlMnPjxmaWxlbmFtZT5QUkVNSVJST1JTPC9maWxlbmFtZT48L2xpbms+LAorICAgICAgICAgICAgICAgICAgICB0aGUgdXBzdHJlYW0gc291cmNlLCBhbmQgdGhlbiBsb2NhdGlvbnMgc3BlY2lmaWVkIGJ5CisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5NSVJST1JTPC9maWxlbmFtZT4gaW4gdGhhdCBvcmRlci4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1NVUxUSV9QUk9WSURFUl9XSElURUxJU1QnPjxnbG9zc3Rlcm0+TVVMVElfUFJPVklERVJfV0hJVEVMSVNUPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEFsbG93cyB5b3UgdG8gc3VwcHJlc3MgQml0QmFrZSB3YXJuaW5ncyBjYXVzZWQgd2hlbgorICAgICAgICAgICAgICAgICAgICBidWlsZGluZyB0d28gc2VwYXJhdGUgcmVjaXBlcyB0aGF0IHByb3ZpZGUgdGhlIHNhbWUKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBCaXRiYWtlIG5vcm1hbGx5IGlzc3VlcyBhIHdhcm5pbmcgd2hlbiBidWlsZGluZyB0d28KKyAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW50IHJlY2lwZXMgd2hlcmUgZWFjaCBwcm92aWRlcyB0aGUgc2FtZSBvdXRwdXQuCisgICAgICAgICAgICAgICAgICAgIFRoaXMgc2NlbmFyaW8gaXMgdXN1YWxseSBzb21ldGhpbmcgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICAgICAgICAgICAgICAgd2FudC4KKyAgICAgICAgICAgICAgICAgICAgSG93ZXZlciwgY2FzZXMgZG8gZXhpc3Qgd2hlcmUgaXQgbWFrZXMgc2Vuc2UsIHBhcnRpY3VsYXJseQorICAgICAgICAgICAgICAgICAgICBpbiB0aGUgPGZpbGVuYW1lPnZpcnR1YWwvKjwvZmlsZW5hbWU+IG5hbWVzcGFjZS4KKyAgICAgICAgICAgICAgICAgICAgWW91IGNhbiB1c2UgdGhpcyB2YXJpYWJsZSB0byBzdXBwcmVzcyBCaXRCYWtlJ3Mgd2FybmluZ3MuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFRvIHVzZSB0aGUgdmFyaWFibGUsIGxpc3QgcHJvdmlkZXIgbmFtZXMgKGUuZy4KKyAgICAgICAgICAgICAgICAgICAgcmVjaXBlIG5hbWVzLCA8ZmlsZW5hbWU+dmlydHVhbC9rZXJuZWw8L2ZpbGVuYW1lPiwKKyAgICAgICAgICAgICAgICAgICAgYW5kIHNvIGZvcnRoKS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICA8L2dsb3NzZGl2PgorCis8IS0tCisgICAgPGdsb3NzZGl2IGlkPSd2YXItZ2xvc3Nhcnktbic+PHRpdGxlPk48L3RpdGxlPgorICAgIDwvZ2xvc3NkaXY+CistLT4KKworICAgIDxnbG9zc2RpdiBpZD0ndmFyLWdsb3NzYXJ5LW8nPjx0aXRsZT5PPC90aXRsZT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLU9WRVJSSURFUyc+PGdsb3NzdGVybT5PVkVSUklERVM8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgQml0QmFrZSB1c2VzIDxmaWxlbmFtZT5PVkVSUklERVM8L2ZpbGVuYW1lPiB0byBjb250cm9sCisgICAgICAgICAgICAgICAgICAgIHdoYXQgdmFyaWFibGVzIGFyZSBvdmVycmlkZGVuIGFmdGVyIEJpdEJha2UgcGFyc2VzCisgICAgICAgICAgICAgICAgICAgIHJlY2lwZXMgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEZvbGxvd2luZyBpcyBhIHNpbXBsZSBleGFtcGxlIHRoYXQgdXNlcyBhbiBvdmVycmlkZXMKKyAgICAgICAgICAgICAgICAgICAgbGlzdCBiYXNlZCBvbiBtYWNoaW5lIGFyY2hpdGVjdHVyZXM6CisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgT1ZFUlJJREVTID0gImFybTp4ODY6bWlwczpwb3dlcnBjIgorICAgICAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gZmluZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gdXNlCisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5PVkVSUklERVM8L2ZpbGVuYW1lPiBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgIjxsaW5rIGxpbmtlbmQ9J2NvbmRpdGlvbmFsLXN5bnRheC1vdmVycmlkZXMnPkNvbmRpdGlvbmFsIFN5bnRheCAoT3ZlcnJpZGVzKTwvbGluaz4iCisgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorICAgIDwvZ2xvc3NkaXY+CisKKyAgICA8Z2xvc3NkaXYgaWQ9J3Zhci1nbG9zc2FyeS1wJz48dGl0bGU+UDwvdGl0bGU+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1QQUNLQUdFUyc+PGdsb3NzdGVybT5QQUNLQUdFUzwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPlRoZSBsaXN0IG9mIHBhY2thZ2VzIHRoZSByZWNpcGUgY3JlYXRlcy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1QQUNLQUdFU19EWU5BTUlDJz48Z2xvc3N0ZXJtPlBBQ0tBR0VTX0RZTkFNSUM8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgQSBwcm9taXNlIHRoYXQgeW91ciByZWNpcGUgc2F0aXNmaWVzIHJ1bnRpbWUgZGVwZW5kZW5jaWVzCisgICAgICAgICAgICAgICAgICAgIGZvciBvcHRpb25hbCBtb2R1bGVzIHRoYXQgYXJlIGZvdW5kIGluIG90aGVyIHJlY2lwZXMuCisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5QQUNLQUdFU19EWU5BTUlDPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgZG9lcyBub3QgYWN0dWFsbHkgc2F0aXNmeSB0aGUgZGVwZW5kZW5jaWVzLCBpdCBvbmx5IHN0YXRlcyB0aGF0CisgICAgICAgICAgICAgICAgICAgIHRoZXkgc2hvdWxkIGJlIHNhdGlzZmllZC4KKyAgICAgICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIGlmIGEgaGFyZCwgcnVudGltZSBkZXBlbmRlbmN5CisgICAgICAgICAgICAgICAgICAgICg8bGluayBsaW5rZW5kPSd2YXItUkRFUEVORFMnPjxmaWxlbmFtZT5SREVQRU5EUzwvZmlsZW5hbWU+PC9saW5rPikKKyAgICAgICAgICAgICAgICAgICAgb2YgYW5vdGhlciBwYWNrYWdlIGlzIHNhdGlzZmllZCBkdXJpbmcgdGhlIGJ1aWxkCisgICAgICAgICAgICAgICAgICAgIHRocm91Z2ggdGhlIDxmaWxlbmFtZT5QQUNLQUdFU19EWU5BTUlDPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUsIGJ1dCBhIHBhY2thZ2Ugd2l0aCB0aGUgbW9kdWxlIG5hbWUgaXMgbmV2ZXIgYWN0dWFsbHkKKyAgICAgICAgICAgICAgICAgICAgcHJvZHVjZWQsIHRoZW4gdGhlIG90aGVyIHBhY2thZ2Ugd2lsbCBiZSBicm9rZW4uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItUEUnPjxnbG9zc3Rlcm0+UEU8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVGhlIGVwb2NoIG9mIHRoZSByZWNpcGUuCisgICAgICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQsIHRoaXMgdmFyaWFibGUgaXMgdW5zZXQuCisgICAgICAgICAgICAgICAgICAgIFRoZSB2YXJpYWJsZSBpcyB1c2VkIHRvIG1ha2UgdXBncmFkZXMgcG9zc2libGUgd2hlbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgdmVyc2lvbmluZyBzY2hlbWUgY2hhbmdlcyBpbiBzb21lIGJhY2t3YXJkcyBpbmNvbXBhdGlibGUKKyAgICAgICAgICAgICAgICAgICAgd2F5LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLVBFUlNJU1RFTlRfRElSJz48Z2xvc3N0ZXJtPlBFUlNJU1RFTlRfRElSPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgZGlyZWN0b3J5IEJpdEJha2UgdXNlcyB0byBzdG9yZSBkYXRhIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIHByZXNlcnZlZCBiZXR3ZWVuIGJ1aWxkcy4KKyAgICAgICAgICAgICAgICAgICAgSW4gcGFydGljdWxhciwgdGhlIGRhdGEgc3RvcmVkIGlzIHRoZSBkYXRhIHRoYXQgdXNlcworICAgICAgICAgICAgICAgICAgICBCaXRCYWtlJ3MgcGVyc2lzdGVudCBkYXRhIEFQSSBhbmQgdGhlIGRhdGEgdXNlZCBieSB0aGUKKyAgICAgICAgICAgICAgICAgICAgUFIgU2VydmVyIGFuZCBQUiBTZXJ2aWNlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLVBGJz48Z2xvc3N0ZXJtPlBGPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgcmVjaXBlIG9yIHBhY2thZ2UgbmFtZSBhbmQgaW5jbHVkZXMgYWxsIHZlcnNpb24gYW5kIHJldmlzaW9uCisgICAgICAgICAgICAgICAgICAgIG51bWJlcnMgKGkuZS4gPGZpbGVuYW1lPmVnbGliYy0yLjEzLXIyMCtzdm5yMTU1MDgvPC9maWxlbmFtZT4gYW5kCisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5iYXNoLTQuMi1yMS88L2ZpbGVuYW1lPikuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItUE4nPjxnbG9zc3Rlcm0+UE48L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT5UaGUgcmVjaXBlIG5hbWUuPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItUFInPjxnbG9zc3Rlcm0+UFI8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT5UaGUgcmV2aXNpb24gb2YgdGhlIHJlY2lwZS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItUFJFRkVSUkVEX1BST1ZJREVSJz48Z2xvc3N0ZXJtPlBSRUZFUlJFRF9QUk9WSURFUjwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBEZXRlcm1pbmVzIHdoaWNoIHJlY2lwZSBzaG91bGQgYmUgZ2l2ZW4gcHJlZmVyZW5jZSB3aGVuCisgICAgICAgICAgICAgICAgICAgIG11bHRpcGxlIHJlY2lwZXMgcHJvdmlkZSB0aGUgc2FtZSBpdGVtLgorICAgICAgICAgICAgICAgICAgICBZb3Ugc2hvdWxkIGFsd2F5cyBzdWZmaXggdGhlIHZhcmlhYmxlIHdpdGggdGhlIG5hbWUgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVkIGl0ZW0sIGFuZCB5b3Ugc2hvdWxkIHNldCBpdCB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVBOJz48ZmlsZW5hbWU+UE48L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHJlY2lwZSB0byB3aGljaCB5b3Ugd2FudCB0byBnaXZlIHByZWNlZGVuY2UuCisgICAgICAgICAgICAgICAgICAgIFNvbWUgZXhhbXBsZXM6CisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgUFJFRkVSUkVEX1BST1ZJREVSX3ZpcnR1YWwva2VybmVsID89ICJsaW51eC15b2N0byIKKyAgICAgUFJFRkVSUkVEX1BST1ZJREVSX3ZpcnR1YWwveHNlcnZlciA9ICJ4c2VydmVyLXhmODYiCisgICAgIFBSRUZFUlJFRF9QUk9WSURFUl92aXJ0dWFsL2xpYmdsID89ICJtZXNhIgorICAgICAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItUFJFRkVSUkVEX1BST1ZJREVSUyc+PGdsb3NzdGVybT5QUkVGRVJSRURfUFJPVklERVJTPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIERldGVybWluZXMgd2hpY2ggcmVjaXBlIHNob3VsZCBiZSBnaXZlbiBwcmVmZXJlbmNlIGZvcgorICAgICAgICAgICAgICAgICAgICBjYXNlcyB3aGVyZSBtdWx0aXBsZSByZWNpcGVzIHByb3ZpZGUgdGhlIHNhbWUgaXRlbS4KKyAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25hbGx5LAorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+UFJFRkVSUkVEX1BST1ZJREVSUzwvZmlsZW5hbWU+IGlzIGlkZW50aWNhbCB0bworICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItUFJFRkVSUkVEX1BST1ZJREVSJz48ZmlsZW5hbWU+UFJFRkVSUkVEX1BST1ZJREVSPC9maWxlbmFtZT48L2xpbms+LgorICAgICAgICAgICAgICAgICAgICBIb3dldmVyLCB0aGUgPGZpbGVuYW1lPlBSRUZFUlJFRF9QUk9WSURFUlM8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBsZXRzIHlvdSBkZWZpbmUgcHJlZmVyZW5jZXMgZm9yIG11bHRpcGxlCisgICAgICAgICAgICAgICAgICAgIHNpdHVhdGlvbnMgdXNpbmcgdGhlIGZvbGxvd2luZyBmb3JtOgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIFBSRUZFUlJFRF9QUk9WSURFUlMgPSAieHh4Onl5eSBhYWE6YmJiIC4uLiIKKyAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgICAgICBUaGlzIGZvcm0gaXMgYSBjb252ZW5pZW50IHJlcGxhY2VtZW50IGZvciB0aGUgZm9sbG93aW5nOgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIFBSRUZFUlJFRF9QUk9WSURFUl94eHggPSAieXl5IgorICAgICBQUkVGRVJSRURfUFJPVklERVJfYWFhID0gImJiYiIKKyAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLVBSRUZFUlJFRF9WRVJTSU9OJz48Z2xvc3N0ZXJtPlBSRUZFUlJFRF9WRVJTSU9OPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIElmIHRoZXJlIGFyZSBtdWx0aXBsZSB2ZXJzaW9ucyBvZiByZWNpcGVzIGF2YWlsYWJsZSwgdGhpcworICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBkZXRlcm1pbmVzIHdoaWNoIHJlY2lwZSBzaG91bGQgYmUgZ2l2ZW4gcHJlZmVyZW5jZS4KKyAgICAgICAgICAgICAgICAgICAgWW91IG11c3QgYWx3YXlzIHN1ZmZpeCB0aGUgdmFyaWFibGUgd2l0aCB0aGUKKyAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVBOJz48ZmlsZW5hbWU+UE48L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgeW91IHdhbnQgdG8gc2VsZWN0LCBhbmQgeW91IHNob3VsZCBzZXQKKyAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVBWJz48ZmlsZW5hbWU+UFY8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgYWNjb3JkaW5nbHkgZm9yIHByZWNlZGVuY2UuCisgICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gdXNlIHRoZSAiPGZpbGVuYW1lPiU8L2ZpbGVuYW1lPiIgY2hhcmFjdGVyIGFzIGEKKyAgICAgICAgICAgICAgICAgICAgd2lsZGNhcmQgdG8gbWF0Y2ggYW55IG51bWJlciBvZiBjaGFyYWN0ZXJzLCB3aGljaCBjYW4gYmUKKyAgICAgICAgICAgICAgICAgICAgdXNlZnVsIHdoZW4gc3BlY2lmeWluZyB2ZXJzaW9ucyB0aGF0IGNvbnRhaW4gbG9uZyByZXZpc2lvbgorICAgICAgICAgICAgICAgICAgICBudW1iZXJzIHRoYXQgY291bGQgcG90ZW50aWFsbHkgY2hhbmdlLgorICAgICAgICAgICAgICAgICAgICBIZXJlIGFyZSB0d28gZXhhbXBsZXM6CisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgUFJFRkVSUkVEX1ZFUlNJT05fcHl0aG9uID0gIjIuNy4zIgorICAgICBQUkVGRVJSRURfVkVSU0lPTl9saW51eC15b2N0byA9ICIzLjEwJSIKKyAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLVBSRU1JUlJPUlMnPjxnbG9zc3Rlcm0+UFJFTUlSUk9SUzwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgYWRkaXRpb25hbCBwYXRocyBmcm9tIHdoaWNoIEJpdEJha2UgZ2V0cyBzb3VyY2UgY29kZS4KKyAgICAgICAgICAgICAgICAgICAgV2hlbiB0aGUgYnVpbGQgc3lzdGVtIHNlYXJjaGVzIGZvciBzb3VyY2UgY29kZSwgaXQgZmlyc3QKKyAgICAgICAgICAgICAgICAgICAgdHJpZXMgdGhlIGxvY2FsIGRvd25sb2FkIGRpcmVjdG9yeS4KKyAgICAgICAgICAgICAgICAgICAgSWYgdGhhdCBsb2NhdGlvbiBmYWlscywgdGhlIGJ1aWxkIHN5c3RlbSB0cmllcyBsb2NhdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCBieSA8ZmlsZW5hbWU+UFJFTUlSUk9SUzwvZmlsZW5hbWU+LCB0aGUgdXBzdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgc291cmNlLCBhbmQgdGhlbiBsb2NhdGlvbnMgc3BlY2lmaWVkIGJ5CisgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1NSVJST1JTJz48ZmlsZW5hbWU+TUlSUk9SUzwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgICAgICAgICBpbiB0aGF0IG9yZGVyLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUeXBpY2FsbHksIHlvdSB3b3VsZCBhZGQgYSBzcGVjaWZpYyBzZXJ2ZXIgZm9yIHRoZQorICAgICAgICAgICAgICAgICAgICBidWlsZCBzeXN0ZW0gdG8gYXR0ZW1wdCBiZWZvcmUgYW55IG90aGVycyBieSBhZGRpbmcKKyAgICAgICAgICAgICAgICAgICAgc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZyB0byB5b3VyIGNvbmZpZ3VyYXRpb246CisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgUFJFTUlSUk9SU19wcmVwZW5kID0gIlwKKyAgICAgZ2l0Oi8vLiovLiogaHR0cDovL3d3dy55b2N0b3Byb2plY3Qub3JnL3NvdXJjZXMvIFxuIFwKKyAgICAgZnRwOi8vLiovLiogaHR0cDovL3d3dy55b2N0b3Byb2plY3Qub3JnL3NvdXJjZXMvIFxuIFwKKyAgICAgaHR0cDovLy4qLy4qIGh0dHA6Ly93d3cueW9jdG9wcm9qZWN0Lm9yZy9zb3VyY2VzLyBcbiBcCisgICAgIGh0dHBzOi8vLiovLiogaHR0cDovL3d3dy55b2N0b3Byb2plY3Qub3JnL3NvdXJjZXMvIFxuIgorICAgICAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgICAgIFRoZXNlIGNoYW5nZXMgY2F1c2UgdGhlIGJ1aWxkIHN5c3RlbSB0byBpbnRlcmNlcHQKKyAgICAgICAgICAgICAgICAgICAgR2l0LCBGVFAsIEhUVFAsIGFuZCBIVFRQUyByZXF1ZXN0cyBhbmQgZGlyZWN0IHRoZW0gdG8KKyAgICAgICAgICAgICAgICAgICAgdGhlIDxmaWxlbmFtZT5odHRwOi8vPC9maWxlbmFtZT4gc291cmNlcyBtaXJyb3IuCisgICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gdXNlIDxmaWxlbmFtZT5maWxlOi8vPC9maWxlbmFtZT4gVVJMcyB0byBwb2ludAorICAgICAgICAgICAgICAgICAgICB0byBsb2NhbCBkaXJlY3RvcmllcyBvciBuZXR3b3JrIHNoYXJlcyBhcyB3ZWxsLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLVBST1ZJREVTJz48Z2xvc3N0ZXJtPlBST1ZJREVTPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEEgbGlzdCBvZiBhbGlhc2VzIGJ5IHdoaWNoIGEgcGFydGljdWxhciByZWNpcGUgY2FuIGJlCisgICAgICAgICAgICAgICAgICAgIGtub3duLgorICAgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0LCBhIHJlY2lwZSdzIG93bgorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+PGxpbmsgbGlua2VuZD0ndmFyLVBOJz5QTjwvbGluaz48L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICBpcyBpbXBsaWNpdGx5IGFscmVhZHkgaW4gaXRzIDxmaWxlbmFtZT5QUk9WSURFUzwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIGxpc3QuCisgICAgICAgICAgICAgICAgICAgIElmIGEgcmVjaXBlIHVzZXMgPGZpbGVuYW1lPlBST1ZJREVTPC9maWxlbmFtZT4sIHRoZQorICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsIGFsaWFzZXMgYXJlIHN5bm9ueW1zIGZvciB0aGUgcmVjaXBlIGFuZCBjYW4KKyAgICAgICAgICAgICAgICAgICAgYmUgdXNlZnVsIHNhdGlzZnlpbmcgZGVwZW5kZW5jaWVzIG9mIG90aGVyIHJlY2lwZXMgZHVyaW5nCisgICAgICAgICAgICAgICAgICAgIHRoZSBidWlsZCBhcyBzcGVjaWZpZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPjxsaW5rIGxpbmtlbmQ9J3Zhci1ERVBFTkRTJz5ERVBFTkRTPC9saW5rPjwvZmlsZW5hbWU+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBDb25zaWRlciB0aGUgZm9sbG93aW5nIGV4YW1wbGUKKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPlBST1ZJREVTPC9maWxlbmFtZT4gc3RhdGVtZW50IGZyb20gYSByZWNpcGUKKyAgICAgICAgICAgICAgICAgICAgZmlsZSA8ZmlsZW5hbWU+bGliYXZfMC44LjExLmJiPC9maWxlbmFtZT46CisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgUFJPVklERVMgKz0gImxpYnBvc3Rwcm9jIgorICAgICAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgICAgIFRoZSA8ZmlsZW5hbWU+UFJPVklERVM8L2ZpbGVuYW1lPiBzdGF0ZW1lbnQgcmVzdWx0cyBpbgorICAgICAgICAgICAgICAgICAgICB0aGUgImxpYmF2IiByZWNpcGUgYWxzbyBiZWluZyBrbm93biBhcyAibGlicG9zdHByb2MiLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLVBSU0VSVl9IT1NUJz48Z2xvc3N0ZXJtPlBSU0VSVl9IT1NUPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFRoZSBuZXR3b3JrIGJhc2VkCisgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1QUic+PGZpbGVuYW1lPlBSPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UgaG9zdCBhbmQgcG9ydC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgRm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRoZSA8ZmlsZW5hbWU+UFJTRVJWX0hPU1Q8L2ZpbGVuYW1lPiB2YXJpYWJsZSBpcworICAgICAgICAgICAgICAgICAgICBzZXQ6CisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgUFJTRVJWX0hPU1QgPSAibG9jYWxob3N0OjAiCisgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICAgICAgWW91IG11c3Qgc2V0IHRoZSB2YXJpYWJsZSBpZiB5b3Ugd2FudCB0byBhdXRvbWF0aWNhbGx5CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0IGEgbG9jYWwgUFIgc2VydmljZS4KKyAgICAgICAgICAgICAgICAgICAgWW91IGNhbiBzZXQgPGZpbGVuYW1lPlBSU0VSVl9IT1NUPC9maWxlbmFtZT4gdG8gb3RoZXIKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzIHRvIHVzZSBhIHJlbW90ZSBQUiBzZXJ2aWNlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLVBWJz48Z2xvc3N0ZXJtPlBWPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+VGhlIHZlcnNpb24gb2YgdGhlIHJlY2lwZS4KKyAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgPC9nbG9zc2Rpdj4KKworPCEtLQorICAgIDxnbG9zc2RpdiBpZD0ndmFyLWdsb3NzYXJ5LXEnPjx0aXRsZT5RPC90aXRsZT4KKyAgICA8L2dsb3NzZGl2PgorLS0+CisKKyAgICA8Z2xvc3NkaXYgaWQ9J3Zhci1nbG9zc2FyeS1yJz48dGl0bGU+UjwvdGl0bGU+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1SREVQRU5EUyc+PGdsb3NzdGVybT5SREVQRU5EUzwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBMaXN0cyBhIHBhY2thZ2UncyBydW50aW1lIGRlcGVuZGVuY2llcyAoaS5lLiBvdGhlciBwYWNrYWdlcykKKyAgICAgICAgICAgICAgICAgICAgdGhhdCBtdXN0IGJlIGluc3RhbGxlZCBpbiBvcmRlciBmb3IgdGhlIGJ1aWx0IHBhY2thZ2UgdG8gcnVuCisgICAgICAgICAgICAgICAgICAgIGNvcnJlY3RseS4KKyAgICAgICAgICAgICAgICAgICAgSWYgYSBwYWNrYWdlIGluIHRoaXMgbGlzdCBjYW5ub3QgYmUgZm91bmQgZHVyaW5nIHRoZSBidWlsZCwKKyAgICAgICAgICAgICAgICAgICAgeW91IHdpbGwgZ2V0IGEgYnVpbGQgZXJyb3IuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEJlY2F1c2UgdGhlIDxmaWxlbmFtZT5SREVQRU5EUzwvZmlsZW5hbWU+IHZhcmlhYmxlIGFwcGxpZXMKKyAgICAgICAgICAgICAgICAgICAgdG8gcGFja2FnZXMgYmVpbmcgYnVpbHQsIHlvdSBzaG91bGQgYWx3YXlzIHVzZSB0aGUgdmFyaWFibGUKKyAgICAgICAgICAgICAgICAgICAgaW4gYSBmb3JtIHdpdGggYW4gYXR0YWNoZWQgcGFja2FnZSBuYW1lLgorICAgICAgICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3UgYXJlIGJ1aWxkaW5nIGEgZGV2ZWxvcG1lbnQgcGFja2FnZQorICAgICAgICAgICAgICAgICAgICB0aGF0IGRlcGVuZHMgb24gdGhlIDxmaWxlbmFtZT5wZXJsPC9maWxlbmFtZT4gcGFja2FnZS4KKyAgICAgICAgICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB5b3Ugd291bGQgdXNlIHRoZSBmb2xsb3dpbmcKKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPlJERVBFTkRTPC9maWxlbmFtZT4gc3RhdGVtZW50OgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIFJERVBFTkRTXyR7UE59LWRldiArPSAicGVybCIKKyAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgICAgICBJbiB0aGUgZXhhbXBsZSwgdGhlIGRldmVsb3BtZW50IHBhY2thZ2UgZGVwZW5kcyBvbgorICAgICAgICAgICAgICAgICAgICB0aGUgPGZpbGVuYW1lPnBlcmw8L2ZpbGVuYW1lPiBwYWNrYWdlLgorICAgICAgICAgICAgICAgICAgICBUaHVzLCB0aGUgPGZpbGVuYW1lPlJERVBFTkRTPC9maWxlbmFtZT4gdmFyaWFibGUgaGFzIHRoZQorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+JHtQTn0tZGV2PC9maWxlbmFtZT4gcGFja2FnZSBuYW1lIGFzIHBhcnQgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBCaXRCYWtlIHN1cHBvcnRzIHNwZWNpZnlpbmcgdmVyc2lvbmVkIGRlcGVuZGVuY2llcy4KKyAgICAgICAgICAgICAgICAgICAgQWx0aG91Z2ggdGhlIHN5bnRheCB2YXJpZXMgZGVwZW5kaW5nIG9uIHRoZSBwYWNrYWdpbmcKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBCaXRCYWtlIGhpZGVzIHRoZXNlIGRpZmZlcmVuY2VzIGZyb20geW91LgorICAgICAgICAgICAgICAgICAgICBIZXJlIGlzIHRoZSBnZW5lcmFsIHN5bnRheCB0byBzcGVjaWZ5IHZlcnNpb25zIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgdGhlIDxmaWxlbmFtZT5SREVQRU5EUzwvZmlsZW5hbWU+IHZhcmlhYmxlOgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIFJERVBFTkRTXyR7UE59ID0gIjxyZXBsYWNlYWJsZT5wYWNrYWdlPC9yZXBsYWNlYWJsZT4gKDxyZXBsYWNlYWJsZT5vcGVyYXRvcjwvcmVwbGFjZWFibGU+IDxyZXBsYWNlYWJsZT52ZXJzaW9uPC9yZXBsYWNlYWJsZT4pIgorICAgICAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgICAgIEZvciA8ZmlsZW5hbWU+b3BlcmF0b3I8L2ZpbGVuYW1lPiwgeW91IGNhbiBzcGVjaWZ5IHRoZQorICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmc6CisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgPQorICAgICAmbHQ7CisgICAgICZndDsKKyAgICAgJmx0Oz0KKyAgICAgJmd0Oz0KKyAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBzZXRzIHVwIGEgZGVwZW5kZW5jeSBvbiB2ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgIDEuMiBvciBncmVhdGVyIG9mIHRoZSBwYWNrYWdlIDxmaWxlbmFtZT5mb288L2ZpbGVuYW1lPjoKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBSREVQRU5EU18ke1BOfSA9ICJmb28gKD49IDEuMikiCisgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgRm9yIGluZm9ybWF0aW9uIG9uIGJ1aWxkLXRpbWUgZGVwZW5kZW5jaWVzLCBzZWUgdGhlCisgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1ERVBFTkRTJz48ZmlsZW5hbWU+REVQRU5EUzwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1SUFJPVklERVMnPjxnbG9zc3Rlcm0+UlBST1ZJREVTPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEEgbGlzdCBvZiBwYWNrYWdlIG5hbWUgYWxpYXNlcyB0aGF0IGEgcGFja2FnZSBhbHNvIHByb3ZpZGVzLgorICAgICAgICAgICAgICAgICAgICBUaGVzZSBhbGlhc2VzIGFyZSB1c2VmdWwgZm9yIHNhdGlzZnlpbmcgcnVudGltZSBkZXBlbmRlbmNpZXMKKyAgICAgICAgICAgICAgICAgICAgb2Ygb3RoZXIgcGFja2FnZXMgYm90aCBkdXJpbmcgdGhlIGJ1aWxkIGFuZCBvbiB0aGUgdGFyZ2V0CisgICAgICAgICAgICAgICAgICAgIChhcyBzcGVjaWZpZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPjxsaW5rIGxpbmtlbmQ9J3Zhci1SREVQRU5EUyc+UkRFUEVORFM8L2xpbms+PC9maWxlbmFtZT4pLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICBBcyB3aXRoIGFsbCBwYWNrYWdlLWNvbnRyb2xsaW5nIHZhcmlhYmxlcywgeW91IG11c3QgYWx3YXlzCisgICAgICAgICAgICAgICAgICAgdXNlIHRoZSB2YXJpYWJsZSBpbiBjb25qdW5jdGlvbiB3aXRoIGEgcGFja2FnZSBuYW1lIG92ZXJyaWRlLgorICAgICAgICAgICAgICAgICAgIEhlcmUgaXMgYW4gZXhhbXBsZToKKyAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIFJQUk9WSURFU18ke1BOfSA9ICJ3aWRnZXQtYWJpLTIiCisgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLVJSRUNPTU1FTkRTJz48Z2xvc3N0ZXJtPlJSRUNPTU1FTkRTPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEEgbGlzdCBvZiBwYWNrYWdlcyB0aGF0IGV4dGVuZHMgdGhlIHVzYWJpbGl0eSBvZiBhIHBhY2thZ2UKKyAgICAgICAgICAgICAgICAgICAgYmVpbmcgYnVpbHQuCisgICAgICAgICAgICAgICAgICAgIFRoZSBwYWNrYWdlIGJlaW5nIGJ1aWx0IGRvZXMgbm90IGRlcGVuZCBvbiB0aGlzIGxpc3Qgb2YKKyAgICAgICAgICAgICAgICAgICAgcGFja2FnZXMgaW4gb3JkZXIgdG8gc3VjY2Vzc2Z1bGx5IGJ1aWxkLCBidXQgbmVlZHMgdGhlbSBmb3IKKyAgICAgICAgICAgICAgICAgICAgdGhlIGV4dGVuZGVkIHVzYWJpbGl0eS4KKyAgICAgICAgICAgICAgICAgICAgVG8gc3BlY2lmeSBydW50aW1lIGRlcGVuZGVuY2llcyBmb3IgcGFja2FnZXMsIHNlZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPjxsaW5rIGxpbmtlbmQ9J3Zhci1SREVQRU5EUyc+UkRFUEVORFM8L2xpbms+PC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEJpdEJha2Ugc3VwcG9ydHMgc3BlY2lmeWluZyB2ZXJzaW9uZWQgcmVjb21tZW5kcy4KKyAgICAgICAgICAgICAgICAgICAgQWx0aG91Z2ggdGhlIHN5bnRheCB2YXJpZXMgZGVwZW5kaW5nIG9uIHRoZSBwYWNrYWdpbmcKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBCaXRCYWtlIGhpZGVzIHRoZXNlIGRpZmZlcmVuY2VzIGZyb20geW91LgorICAgICAgICAgICAgICAgICAgICBIZXJlIGlzIHRoZSBnZW5lcmFsIHN5bnRheCB0byBzcGVjaWZ5IHZlcnNpb25zIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgdGhlIDxmaWxlbmFtZT5SUkVDT01NRU5EUzwvZmlsZW5hbWU+IHZhcmlhYmxlOgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIFJSRUNPTU1FTkRTXyR7UE59ID0gIjxyZXBsYWNlYWJsZT5wYWNrYWdlPC9yZXBsYWNlYWJsZT4gKDxyZXBsYWNlYWJsZT5vcGVyYXRvcjwvcmVwbGFjZWFibGU+IDxyZXBsYWNlYWJsZT52ZXJzaW9uPC9yZXBsYWNlYWJsZT4pIgorICAgICAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgICAgIEZvciA8ZmlsZW5hbWU+b3BlcmF0b3I8L2ZpbGVuYW1lPiwgeW91IGNhbiBzcGVjaWZ5IHRoZQorICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmc6CisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgPQorICAgICAmbHQ7CisgICAgICZndDsKKyAgICAgJmx0Oz0KKyAgICAgJmd0Oz0KKyAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBzZXRzIHVwIGEgcmVjb21tZW5kIG9uIHZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgMS4yIG9yIGdyZWF0ZXIgb2YgdGhlIHBhY2thZ2UgPGZpbGVuYW1lPmZvbzwvZmlsZW5hbWU+OgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIFJSRUNPTU1FTkRTXyR7UE59ID0gImZvbyAoPj0gMS4yKSIKKyAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgIDwvZ2xvc3NkaXY+CisKKyAgICA8Z2xvc3NkaXYgaWQ9J3Zhci1nbG9zc2FyeS1zJz48dGl0bGU+UzwvdGl0bGU+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1TRUNUSU9OJz48Z2xvc3N0ZXJtPlNFQ1RJT048L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT5UaGUgc2VjdGlvbiBpbiB3aGljaCBwYWNrYWdlcyBzaG91bGQgYmUgY2F0ZWdvcml6ZWQuPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItU1JDX1VSSSc+PGdsb3NzdGVybT5TUkNfVVJJPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFRoZSBsaXN0IG9mIHNvdXJjZSBmaWxlcyAtIGxvY2FsIG9yIHJlbW90ZS4KKyAgICAgICAgICAgICAgICAgICAgVGhpcyB2YXJpYWJsZSB0ZWxscyBCaXRCYWtlIHdoaWNoIGJpdHMKKyAgICAgICAgICAgICAgICAgICAgdG8gcHVsbCBmb3IgdGhlIGJ1aWxkIGFuZCBob3cgdG8gcHVsbCB0aGVtLgorICAgICAgICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgaWYgdGhlIHJlY2lwZSBvciBhcHBlbmQgZmlsZSBuZWVkcyB0bworICAgICAgICAgICAgICAgICAgICBmZXRjaCBhIHNpbmdsZSB0YXJiYWxsIGZyb20gdGhlIEludGVybmV0LCB0aGUgcmVjaXBlIG9yCisgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBmaWxlIHVzZXMgYSA8ZmlsZW5hbWU+U1JDX1VSSTwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIGVudHJ5IHRoYXQgc3BlY2lmaWVzIHRoYXQgdGFyYmFsbC4KKyAgICAgICAgICAgICAgICAgICAgT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoZSByZWNpcGUgb3IgYXBwZW5kIGZpbGUgbmVlZHMgdG8KKyAgICAgICAgICAgICAgICAgICAgZmV0Y2ggYSB0YXJiYWxsIGFuZCBpbmNsdWRlIGEgY3VzdG9tIGZpbGUsIHRoZSByZWNpcGUgb3IKKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGZpbGUgbmVlZHMgYW4gPGZpbGVuYW1lPlNSQ19VUkk8L2ZpbGVuYW1lPiB2YXJpYWJsZQorICAgICAgICAgICAgICAgICAgICB0aGF0IHNwZWNpZmllcyBhbGwgdGhvc2Ugc291cmNlcy48L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+VGhlIGZvbGxvd2luZyBsaXN0IGV4cGxhaW5zIHRoZSBhdmFpbGFibGUgVVJJIHByb3RvY29sczoKKyAgICAgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+PGZpbGVuYW1lPmZpbGU6Ly88L2ZpbGVuYW1lPiAtPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGZXRjaGVzIGZpbGVzLCB3aGljaCBhcmUgdXN1YWxseSBmaWxlcyBzaGlwcGVkIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgbG9jYWwgbWFjaGluZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgcGF0aCBpcyByZWxhdGl2ZSB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItRklMRVNQQVRIJz48ZmlsZW5hbWU+RklMRVNQQVRIPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPjxmaWxlbmFtZT5ienI6Ly88L2ZpbGVuYW1lPiAtPC9lbXBoYXNpcz4gRmV0Y2hlcyBmaWxlcyBmcm9tIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXphYXIgcmV2aXNpb24gY29udHJvbCByZXBvc2l0b3J5LjwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz48ZmlsZW5hbWU+Z2l0Oi8vPC9maWxlbmFtZT4gLTwvZW1waGFzaXM+IEZldGNoZXMgZmlsZXMgZnJvbSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2l0IHJldmlzaW9uIGNvbnRyb2wgcmVwb3NpdG9yeS48L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+PGZpbGVuYW1lPm9zYzovLzwvZmlsZW5hbWU+IC08L2VtcGhhc2lzPiBGZXRjaGVzIGZpbGVzIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbiBPU0MgKE9wZW5TVVNFIEJ1aWxkIHNlcnZpY2UpIHJldmlzaW9uIGNvbnRyb2wgcmVwb3NpdG9yeS48L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+PGZpbGVuYW1lPnJlcG86Ly88L2ZpbGVuYW1lPiAtPC9lbXBoYXNpcz4gRmV0Y2hlcyBmaWxlcyBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSByZXBvIChHaXQpIHJlcG9zaXRvcnkuPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPjxmaWxlbmFtZT5odHRwOi8vPC9maWxlbmFtZT4gLTwvZW1waGFzaXM+IEZldGNoZXMgZmlsZXMgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBJbnRlcm5ldCB1c2luZyBIVFRQLjwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz48ZmlsZW5hbWU+aHR0cHM6Ly88L2ZpbGVuYW1lPiAtPC9lbXBoYXNpcz4gRmV0Y2hlcyBmaWxlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIEludGVybmV0IHVzaW5nIEhUVFBTLjwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz48ZmlsZW5hbWU+ZnRwOi8vPC9maWxlbmFtZT4gLTwvZW1waGFzaXM+IEZldGNoZXMgZmlsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBJbnRlcm5ldCB1c2luZyBGVFAuPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPjxmaWxlbmFtZT5jdnM6Ly88L2ZpbGVuYW1lPiAtPC9lbXBoYXNpcz4gRmV0Y2hlcyBmaWxlcyBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBDVlMgcmV2aXNpb24gY29udHJvbCByZXBvc2l0b3J5LjwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz48ZmlsZW5hbWU+aGc6Ly88L2ZpbGVuYW1lPiAtPC9lbXBoYXNpcz4gRmV0Y2hlcyBmaWxlcyBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBNZXJjdXJpYWwgKDxmaWxlbmFtZT5oZzwvZmlsZW5hbWU+KSByZXZpc2lvbiBjb250cm9sIHJlcG9zaXRvcnkuPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPjxmaWxlbmFtZT5wNDovLzwvZmlsZW5hbWU+IC08L2VtcGhhc2lzPiBGZXRjaGVzIGZpbGVzIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIFBlcmZvcmNlICg8ZmlsZW5hbWU+cDQ8L2ZpbGVuYW1lPikgcmV2aXNpb24gY29udHJvbCByZXBvc2l0b3J5LjwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz48ZmlsZW5hbWU+c3NoOi8vPC9maWxlbmFtZT4gLTwvZW1waGFzaXM+IEZldGNoZXMgZmlsZXMgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgc2VjdXJlIHNoZWxsLjwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz48ZmlsZW5hbWU+c3ZuOi8vPC9maWxlbmFtZT4gLTwvZW1waGFzaXM+IEZldGNoZXMgZmlsZXMgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgU3VidmVyc2lvbiAoPGZpbGVuYW1lPnN2bjwvZmlsZW5hbWU+KSByZXZpc2lvbiBjb250cm9sIHJlcG9zaXRvcnkuPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT5IZXJlIGFyZSBzb21lIGFkZGl0aW9uYWwgb3B0aW9ucyB3b3J0aCBtZW50aW9uaW5nOgorICAgICAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz48ZmlsZW5hbWU+dW5wYWNrPC9maWxlbmFtZT4gLTwvZW1waGFzaXM+IENvbnRyb2xzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hldGhlciBvciBub3QgdG8gdW5wYWNrIHRoZSBmaWxlIGlmIGl0IGlzIGFuIGFyY2hpdmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgYWN0aW9uIGlzIHRvIHVucGFjayB0aGUgZmlsZS48L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+PGZpbGVuYW1lPnN1YmRpcjwvZmlsZW5hbWU+IC08L2VtcGhhc2lzPiBQbGFjZXMgdGhlIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3IgZXh0cmFjdHMgaXRzIGNvbnRlbnRzKSBpbnRvIHRoZSBzcGVjaWZpZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJkaXJlY3RvcnkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb24gaXMgdXNlZnVsIGZvciB1bnVzdWFsIHRhcmJhbGxzIG9yIG90aGVyIGFyY2hpdmVzIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyBub3QgaGF2ZSB0aGVpciBmaWxlcyBhbHJlYWR5IGluIGEgc3ViZGlyZWN0b3J5IHdpdGhpbiB0aGUgYXJjaGl2ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+PGZpbGVuYW1lPm5hbWU8L2ZpbGVuYW1lPiAtPC9lbXBoYXNpcz4gU3BlY2lmaWVzIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lIHRvIGJlIHVzZWQgZm9yIGFzc29jaWF0aW9uIHdpdGggPGZpbGVuYW1lPlNSQ19VUkk8L2ZpbGVuYW1lPiBjaGVja3N1bXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHlvdSBoYXZlIG1vcmUgdGhhbiBvbmUgZmlsZSBzcGVjaWZpZWQgaW4gPGZpbGVuYW1lPlNSQ19VUkk8L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+PGZpbGVuYW1lPmRvd25sb2FkZmlsZW5hbWU8L2ZpbGVuYW1lPiAtPC9lbXBoYXNpcz4gU3BlY2lmaWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZpbGVuYW1lIHVzZWQgd2hlbiBzdG9yaW5nIHRoZSBkb3dubG9hZGVkIGZpbGUuPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLVNSQ0RBVEUnPjxnbG9zc3Rlcm0+U1JDREFURTwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGUgZGF0ZSBvZiB0aGUgc291cmNlIGNvZGUgdXNlZCB0byBidWlsZCB0aGUgcGFja2FnZS4KKyAgICAgICAgICAgICAgICAgICAgVGhpcyB2YXJpYWJsZSBhcHBsaWVzIG9ubHkgaWYgdGhlIHNvdXJjZSB3YXMgZmV0Y2hlZCBmcm9tIGEgU291cmNlIENvZGUgTWFuYWdlciAoU0NNKS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1TUkNSRVYnPjxnbG9zc3Rlcm0+U1JDUkVWPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFRoZSByZXZpc2lvbiBvZiB0aGUgc291cmNlIGNvZGUgdXNlZCB0byBidWlsZCB0aGUgcGFja2FnZS4KKyAgICAgICAgICAgICAgICAgICAgVGhpcyB2YXJpYWJsZSBhcHBsaWVzIG9ubHkgd2hlbiB1c2luZyBTdWJ2ZXJzaW9uLCBHaXQsIE1lcmN1cmlhbCBhbmQgQmF6YWFyLgorICAgICAgICAgICAgICAgICAgICBJZiB5b3Ugd2FudCB0byBidWlsZCBhIGZpeGVkIHJldmlzaW9uIGFuZCB5b3Ugd2FudAorICAgICAgICAgICAgICAgICAgICB0byBhdm9pZCBwZXJmb3JtaW5nIGEgcXVlcnkgb24gdGhlIHJlbW90ZSByZXBvc2l0b3J5IGV2ZXJ5IHRpbWUKKyAgICAgICAgICAgICAgICAgICAgQml0QmFrZSBwYXJzZXMgeW91ciByZWNpcGUsIHlvdSBzaG91bGQgc3BlY2lmeSBhIDxmaWxlbmFtZT5TUkNSRVY8L2ZpbGVuYW1lPiB0aGF0IGlzIGEKKyAgICAgICAgICAgICAgICAgICAgZnVsbCByZXZpc2lvbiBpZGVudGlmaWVyIGFuZCBub3QganVzdCBhIHRhZy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1TUkNSRVZfRk9STUFUJz48Z2xvc3N0ZXJtPlNSQ1JFVl9GT1JNQVQ8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgSGVscHMgY29uc3RydWN0IHZhbGlkCisgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1TUkNSRVYnPjxmaWxlbmFtZT5TUkNSRVY8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzIHdoZW4gbXVsdGlwbGUgc291cmNlIGNvbnRyb2xsZWQgVVJMcyBhcmUgdXNlZCBpbgorICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItU1JDX1VSSSc+PGZpbGVuYW1lPlNSQ19VUkk8L2ZpbGVuYW1lPjwvbGluaz4uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFRoZSBzeXN0ZW0gbmVlZHMgaGVscCBjb25zdHJ1Y3RpbmcgdGhlc2UgdmFsdWVzIHVuZGVyIHRoZXNlCisgICAgICAgICAgICAgICAgICAgIGNpcmN1bXN0YW5jZXMuCisgICAgICAgICAgICAgICAgICAgIEVhY2ggY29tcG9uZW50IGluIHRoZSA8ZmlsZW5hbWU+U1JDX1VSSTwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIGlzIGFzc2lnbmVkIGEgbmFtZSBhbmQgdGhlc2UgYXJlIHJlZmVyZW5jZWQKKyAgICAgICAgICAgICAgICAgICAgaW4gdGhlIDxmaWxlbmFtZT5TUkNSRVZfRk9STUFUPC9maWxlbmFtZT4gdmFyaWFibGUuCisgICAgICAgICAgICAgICAgICAgIENvbnNpZGVyIGFuIGV4YW1wbGUgd2l0aCBVUkxzIG5hbWVkICJtYWNoaW5lIiBhbmQgIm1ldGEiLgorICAgICAgICAgICAgICAgICAgICBJbiB0aGlzIGNhc2UsIDxmaWxlbmFtZT5TUkNSRVZfRk9STUFUPC9maWxlbmFtZT4gY291bGQgbG9vaworICAgICAgICAgICAgICAgICAgICBsaWtlICJtYWNoaW5lX21ldGEiIGFuZCB0aG9zZSBuYW1lcyB3b3VsZCBoYXZlIHRoZSBTQ00KKyAgICAgICAgICAgICAgICAgICAgdmVyc2lvbnMgc3Vic3RpdHV0ZWQgaW50byBlYWNoIHBvc2l0aW9uLgorICAgICAgICAgICAgICAgICAgICBPbmx5IG9uZSA8ZmlsZW5hbWU+QVVUT0lOQzwvZmlsZW5hbWU+IHBsYWNlaG9sZGVyIGlzIGFkZGVkCisgICAgICAgICAgICAgICAgICAgIGFuZCBpZiBuZWVkZWQuCisgICAgICAgICAgICAgICAgICAgIEFuZCwgdGhpcyBwbGFjZWhvbGRlciBpcyBwbGFjZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZQorICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCBzdHJpbmcuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItU1RBTVAnPjxnbG9zc3Rlcm0+U1RBTVA8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBiYXNlIHBhdGggdXNlZCB0byBjcmVhdGUgcmVjaXBlIHN0YW1wIGZpbGVzLgorICAgICAgICAgICAgICAgICAgICBUaGUgcGF0aCB0byBhbiBhY3R1YWwgc3RhbXAgZmlsZSBpcyBjb25zdHJ1Y3RlZCBieSBldmFsdWF0aW5nIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGFuZCB0aGVuIGFwcGVuZGluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLVNUQU1QQ0xFQU4nPjxnbG9zc3Rlcm0+U1RBTVBDTEVBTjwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIGJhc2UgcGF0aCB1c2VkIHRvIGNyZWF0ZSByZWNpcGUgc3RhbXAgZmlsZXMuCisgICAgICAgICAgICAgICAgICAgIFVubGlrZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVNUQU1QJz48ZmlsZW5hbWU+U1RBTVA8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUsIDxmaWxlbmFtZT5TVEFNUENMRUFOPC9maWxlbmFtZT4gY2FuIGNvbnRhaW4KKyAgICAgICAgICAgICAgICAgICAgd2lsZGNhcmRzIHRvIG1hdGNoIHRoZSByYW5nZSBvZiBmaWxlcyBhIGNsZWFuIG9wZXJhdGlvbgorICAgICAgICAgICAgICAgICAgICBzaG91bGQgcmVtb3ZlLgorICAgICAgICAgICAgICAgICAgICBCaXRCYWtlIHVzZXMgYSBjbGVhbiBvcGVyYXRpb24gdG8gcmVtb3ZlIGFueSBvdGhlciBzdGFtcHMKKyAgICAgICAgICAgICAgICAgICAgaXQgc2hvdWxkIGJlIHJlbW92aW5nIHdoZW4gY3JlYXRpbmcgYSBuZXcgc3RhbXAuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItU1VNTUFSWSc+PGdsb3NzdGVybT5TVU1NQVJZPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEEgc2hvcnQgc3VtbWFyeSBmb3IgdGhlIHJlY2lwZSwgd2hpY2ggaXMgNzIgY2hhcmFjdGVycyBvciBsZXNzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLVNWTkRJUic+PGdsb3NzdGVybT5TVk5ESVI8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVGhlIGRpcmVjdG9yeSBpbiB3aGljaCBmaWxlcyBjaGVja2VkIG91dCBvZiBhIFN1YnZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgc3lzdGVtIGFyZSBzdG9yZWQuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgPC9nbG9zc2Rpdj4KKworICAgIDxnbG9zc2RpdiBpZD0ndmFyLWdsb3NzYXJ5LXQnPjx0aXRsZT5UPC90aXRsZT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLVQnPjxnbG9zc3Rlcm0+VDwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPlBvaW50cyB0byBhIGRpcmVjdG9yeSB3ZXJlIEJpdEJha2UgcGxhY2VzCisgICAgICAgICAgICAgICAgICAgIHRlbXBvcmFyeSBmaWxlcywgd2hpY2ggY29uc2lzdCBtb3N0bHkgb2YgdGFzayBsb2dzIGFuZAorICAgICAgICAgICAgICAgICAgICBzY3JpcHRzLCB3aGVuIGJ1aWxkaW5nIGEgcGFydGljdWxhciByZWNpcGUuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItVE9QRElSJz48Z2xvc3N0ZXJtPlRPUERJUjwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBQb2ludHMgdG8gdGhlIGJ1aWxkIGRpcmVjdG9yeS4KKyAgICAgICAgICAgICAgICAgICAgQml0QmFrZSBhdXRvbWF0aWNhbGx5IHNldHMgdGhpcyB2YXJpYWJsZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICA8L2dsb3NzZGl2PgorCis8IS0tCisgICAgPGdsb3NzZGl2IGlkPSd2YXItZ2xvc3NhcnktdSc+PHRpdGxlPlU8L3RpdGxlPgorICAgIDwvZ2xvc3NkaXY+CisKKyAgICA8Z2xvc3NkaXYgaWQ9J3Zhci1nbG9zc2FyeS12Jz48dGl0bGU+VjwvdGl0bGU+CisgICA8L2dsb3NzZGl2PgorCisgICAgPGdsb3NzZGl2IGlkPSd2YXItZ2xvc3Nhcnktdyc+PHRpdGxlPlc8L3RpdGxlPgorICAgIDwvZ2xvc3NkaXY+CisKKyAgICA8Z2xvc3NkaXYgaWQ9J3Zhci1nbG9zc2FyeS14Jz48dGl0bGU+WDwvdGl0bGU+CisgICAgPC9nbG9zc2Rpdj4KKworICAgIDxnbG9zc2RpdiBpZD0ndmFyLWdsb3NzYXJ5LXknPjx0aXRsZT5ZPC90aXRsZT4KKyAgICA8L2dsb3NzZGl2PgorCisgICAgPGdsb3NzZGl2IGlkPSd2YXItZ2xvc3Nhcnkteic+PHRpdGxlPlo8L3RpdGxlPgorICAgIDwvZ2xvc3NkaXY+CistLT4KKworCis8L2dsb3NzYXJ5PgorPC9jaGFwdGVyPgorPCEtLQordmltOiBleHBhbmR0YWIgdHc9ODAgdHM9NAorLS0+CmRpZmYgLS1naXQgYS9iaXRiYWtlL2RvYy9iaXRiYWtlLXVzZXItbWFudWFsL2JpdGJha2UtdXNlci1tYW51YWwtc3R5bGUuY3NzIGIvYml0YmFrZS9kb2MvYml0YmFrZS11c2VyLW1hbnVhbC9iaXRiYWtlLXVzZXItbWFudWFsLXN0eWxlLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWRhMmE0Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9kb2MvYml0YmFrZS11c2VyLW1hbnVhbC9iaXRiYWtlLXVzZXItbWFudWFsLXN0eWxlLmNzcwpAQCAtMCwwICsxLDk4NCBAQAorLyoKKyAgIEdlbmVyaWMgWEhUTUwgLyBEb2NCb29rIFhIVE1MIENTUyBTdHlsZXNoZWV0LgorCisgICBCcm93c2VyIHdyYW5nbGluZyBhbmQgdHlwb2dyYXBoaWMgZGVzaWduIGJ5CisgICAgICBPeXZpbmQgS29sYXMgLyBwaXBwaW5AZ2ltcC5vcmcKKworICAgQ3VzdG9taXNlZCBmb3IgUG9reSBieQorICAgICAgTWF0dGhldyBBbGx1bSAvIG1hbGx1bUBvLWhhbmQuY29tCisKKyAgIFRoYW5rcyB0bzoKKyAgICAgTGlhbSBSLiBFLiBRdWluCisgICAgIFdpbGxpYW0gU2thZ2dzCisgICAgIEpha3ViIFN0ZWluZXIKKworICAgU3RydWN0dXJlCisgICAtLS0tLS0tLS0KKworICAgVGhlIHN0eWxlc2hlZXQgaXMgZGl2aWRlZCBpbnRvIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnM6CisKKyAgICAgICBQb3NpdGlvbmluZworICAgICAgICAgIE1hcmdpbnMsIHBhZGRpbmdzLCB3aWR0aCwgZm9udC1zaXplLCBjbGVhcmluZy4KKyAgICAgICBEZWNvcmF0aW9ucworICAgICAgICAgIEJvcmRlcnMsIHN0eWxlCisgICAgICAgQ29sb3JzCisgICAgICAgICAgQ29sb3JzCisgICAgICAgR3JhcGhpY3MKKyAgICAgICAgICBHcmFwaGljYWwgYmFja2dyb3VuZHMKKyAgICAgICBOYXN0eSBJRSB0d2Vha3MKKyAgICAgICAgICBXb3JrYXJvdW5kcyBuZWVkZWQgdG8gbWFrZSBpdCB3b3JrIGluIGludGVybmV0IGV4cGxvcmVyLAorICAgICAgICAgIGN1cnJlbnRseSBtYWtlcyB0aGUgc3R5bGVzaGVldCBub24gdmFsaWRhdGluZywgYnV0IHVwIHVudGlsCisgICAgICAgICAgdGhpcyBwb2ludCBpdCBpcyB2YWxpZGF0aW5nLgorICAgICAgIE1vemlsbGEgZXh0ZW5zaW9ucworICAgICAgICAgIFRyYW5zcGFyZW5jeSBmb3IgZm9vdGVyCisJICBSb3VuZGVkIGNvcm5lcnMgb24gYm94ZXMKKworKi8KKworCisgIC8qKioqKioqKioqKioqKiogLworIC8gIFBvc2l0aW9uaW5nICAgLworLyAqKioqKioqKioqKioqKiovCisKK2JvZHkgeworICBmb250LWZhbWlseTogVmVyZGFuYSwgU2Fucywgc2Fucy1zZXJpZjsKKworICBtaW4td2lkdGg6IDY0MHB4OworICB3aWR0aDogODAlOworICBtYXJnaW46ICAwZW0gYXV0bzsKKyAgcGFkZGluZzogMmVtIDVlbSA1ZW0gNWVtOworICBjb2xvcjogIzMzMzsKK30KKworaDEsaDIsaDMsaDQsaDUsaDYsaDcgeworICBmb250LWZhbWlseTogQXJpYWwsIFNhbnM7CisgIGNvbG9yOiAjMDA1NTdEOworICBjbGVhcjogYm90aDsKK30KKworaDEgeworICBmb250LXNpemU6IDJlbTsKKyAgdGV4dC1hbGlnbjogbGVmdDsKKyAgcGFkZGluZzogMGVtIDBlbSAwZW0gMGVtOworICBtYXJnaW46IDJlbSAwZW0gMGVtIDBlbTsKK30KKworaDIuc3VidGl0bGUgeworICBtYXJnaW46IDAuMTBlbSAwZW0gMy4wZW0gMGVtOworICBwYWRkaW5nOiAwZW0gMGVtIDBlbSAwZW07CisgIGZvbnQtc2l6ZTogMS44ZW07CisgIHBhZGRpbmctbGVmdDogMjAlOworICBmb250LXdlaWdodDogbm9ybWFsOworICBmb250LXN0eWxlOiBpdGFsaWM7Cit9CisKK2gyIHsKKyAgbWFyZ2luOiAyZW0gMGVtIDAuNjZlbSAwZW07CisgIHBhZGRpbmc6IDAuNWVtIDBlbSAwZW0gMGVtOworICBmb250LXNpemU6IDEuNWVtOworICBmb250LXdlaWdodDogYm9sZDsKK30KKworaDMuc3VidGl0bGUgeworICBtYXJnaW46IDBlbSAwZW0gMWVtIDBlbTsKKyAgcGFkZGluZzogMGVtIDBlbSAwZW0gMGVtOworICBmb250LXNpemU6IDE0Mi4xNCU7CisgIHRleHQtYWxpZ246IHJpZ2h0OworfQorCitoMyB7CisgIG1hcmdpbjogMWVtIDBlbSAwLjVlbSAwZW07CisgIHBhZGRpbmc6IDFlbSAwZW0gMGVtIDBlbTsKKyAgZm9udC1zaXplOiAxNDAlOworICBmb250LXdlaWdodDogYm9sZDsKK30KKworaDQgeworICBtYXJnaW46IDFlbSAwZW0gMC41ZW0gMGVtOworICBwYWRkaW5nOiAxZW0gMGVtIDBlbSAwZW07CisgIGZvbnQtc2l6ZTogMTIwJTsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKK2g1IHsKKyAgbWFyZ2luOiAxZW0gMGVtIDAuNWVtIDBlbTsKKyAgcGFkZGluZzogMWVtIDBlbSAwZW0gMGVtOworICBmb250LXNpemU6IDExMCU7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCitoNiB7CisgIG1hcmdpbjogMWVtIDBlbSAwZW0gMGVtOworICBwYWRkaW5nOiAxZW0gMGVtIDBlbSAwZW07CisgIGZvbnQtc2l6ZTogMTEwJTsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKKy5hdXRob3Jncm91cCB7CisgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OworICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OworICBwYWRkaW5nLXRvcDogMjU2cHg7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZmlndXJlcy9iaXRiYWtlLXRpdGxlLnBuZyIpOworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBsZWZ0IHRvcDsKKyAgbWFyZ2luLXRvcDogLTI1NnB4OworICBwYWRkaW5nLXJpZ2h0OiA1MHB4OworICBtYXJnaW4tbGVmdDogMHB4OworICB0ZXh0LWFsaWduOiByaWdodDsKKyAgd2lkdGg6IDc0MHB4OworfQorCitoMy5hdXRob3IgeworICBtYXJnaW46IDBlbSAwbWUgMGVtIDBlbTsKKyAgcGFkZGluZzogMGVtIDBlbSAwZW0gMGVtOworICBmb250LXdlaWdodDogbm9ybWFsOworICBmb250LXNpemU6IDEwMCU7CisgIGNvbG9yOiAjMzMzOworICBjbGVhcjogYm90aDsKK30KKworLmF1dGhvciB0dC5lbWFpbCB7CisgIGZvbnQtc2l6ZTogNjYlOworfQorCisudGl0bGVwYWdlIGhyIHsKKyAgd2lkdGg6IDBlbTsKKyAgY2xlYXI6IGJvdGg7Cit9CisKKy5yZXZoaXN0b3J5IHsKKyAgcGFkZGluZy10b3A6IDJlbTsKKyAgY2xlYXI6IGJvdGg7Cit9CisKKy50b2MsCisubGlzdC1vZi10YWJsZXMsCisubGlzdC1vZi1leGFtcGxlcywKKy5saXN0LW9mLWZpZ3VyZXMgeworICBwYWRkaW5nOiAxLjMzZW0gMGVtIDIuNWVtIDBlbTsKKyAgY29sb3I6ICMwMDU1N0Q7Cit9CisKKy50b2MgcCwKKy5saXN0LW9mLXRhYmxlcyBwLAorLmxpc3Qtb2YtZmlndXJlcyBwLAorLmxpc3Qtb2YtZXhhbXBsZXMgcCB7CisgIHBhZGRpbmc6IDBlbSAwZW0gMGVtIDBlbTsKKyAgcGFkZGluZzogMGVtIDBlbSAwLjNlbTsKKyAgbWFyZ2luOiAxLjVlbSAwZW0gMGVtIDBlbTsKK30KKworLnRvYyBwIGIsCisubGlzdC1vZi10YWJsZXMgcCBiLAorLmxpc3Qtb2YtZmlndXJlcyBwIGIsCisubGlzdC1vZi1leGFtcGxlcyBwIGJ7CisgIGZvbnQtc2l6ZTogMTAwLjAlOworICBmb250LXdlaWdodDogYm9sZDsKK30KKworLnRvYyBkbCwKKy5saXN0LW9mLXRhYmxlcyBkbCwKKy5saXN0LW9mLWZpZ3VyZXMgZGwsCisubGlzdC1vZi1leGFtcGxlcyBkbCB7CisgIG1hcmdpbjogMGVtIDBlbSAwLjVlbSAwZW07CisgIHBhZGRpbmc6IDBlbSAwZW0gMGVtIDBlbTsKK30KKworLnRvYyBkdCB7CisgIG1hcmdpbjogMGVtIDBlbSAwZW0gMGVtOworICBwYWRkaW5nOiAwZW0gMGVtIDBlbSAwZW07Cit9CisKKy50b2MgZGQgeworICBtYXJnaW46IDBlbSAwZW0gMGVtIDIuNmVtOworICBwYWRkaW5nOiAwZW0gMGVtIDBlbSAwZW07Cit9CisKK2Rpdi5nbG9zc2FyeSBkbCwKK2Rpdi52YXJpYWJsZWxpc3QgZGwgeworfQorCisuZ2xvc3NhcnkgZGwgZHQsCisudmFyaWFibGVsaXN0IGRsIGR0LAorLnZhcmlhYmxlbGlzdCBkbCBkdCBzcGFuLnRlcm0geworICBmb250LXdlaWdodDogbm9ybWFsOworICB3aWR0aDogMjBlbTsKKyAgdGV4dC1hbGlnbjogcmlnaHQ7Cit9CisKKy52YXJpYWJsZWxpc3QgZGwgZHQgeworICBtYXJnaW4tdG9wOiAwLjVlbTsKK30KKworLmdsb3NzYXJ5IGRsIGRkLAorLnZhcmlhYmxlbGlzdCBkbCBkZCB7CisgIG1hcmdpbi10b3A6IC0xZW07CisgIG1hcmdpbi1sZWZ0OiAyNS41ZW07Cit9CisKKy5nbG9zc2FyeSBkZCBwLAorLnZhcmlhYmxlbGlzdCBkZCBwIHsKKyAgbWFyZ2luLXRvcDogMGVtOworICBtYXJnaW4tYm90dG9tOiAxZW07Cit9CisKKworZGl2LmNhbGxvdXRsaXN0IHRhYmxlIHRkIHsKKyAgcGFkZGluZzogMGVtIDBlbSAwZW0gMGVtOworICBtYXJnaW46IDBlbSAwZW0gMGVtIDBlbTsKK30KKworZGl2LmNhbGxvdXRsaXN0IHRhYmxlIHRkIHAgeworICBtYXJnaW4tdG9wOiAwZW07CisgIG1hcmdpbi1ib3R0b206IDFlbTsKK30KKworZGl2IHAuY29weXJpZ2h0IHsKKyAgdGV4dC1hbGlnbjogbGVmdDsKK30KKworZGl2LmxlZ2Fsbm90aWNlIHAubGVnYWxub3RpY2UtdGl0bGUgeworICBtYXJnaW4tYm90dG9tOiAwZW07Cit9CisKK3AgeworICBsaW5lLWhlaWdodDogMS41ZW07CisgIG1hcmdpbi10b3A6IDBlbTsKKworfQorCitkbCB7CisgIHBhZGRpbmctdG9wOiAwZW07Cit9CisKK2hyIHsKKyAgYm9yZGVyOiBzb2xpZCAxcHg7Cit9CisKKworLm1lZGlhb2JqZWN0LAorLm1lZGlhb2JqZWN0Y28geworICB0ZXh0LWFsaWduOiBjZW50ZXI7Cit9CisKK2ltZyB7CisgIGJvcmRlcjogbm9uZTsKK30KKwordWwgeworICBwYWRkaW5nOiAwZW0gMGVtIDBlbSAxLjVlbTsKK30KKwordWwgbGkgeworICBwYWRkaW5nOiAwZW0gMGVtIDBlbSAwZW07Cit9CisKK3VsIGxpIHAgeworICB0ZXh0LWFsaWduOiBsZWZ0OworfQorCit0YWJsZSB7CisgIHdpZHRoIDoxMDAlOworfQorCit0aCB7CisgIHBhZGRpbmc6IDAuMjVlbTsKKyAgdGV4dC1hbGlnbjogbGVmdDsKKyAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgdmVydGljYWwtYWxpZ246IHRvcDsKK30KKwordGQgeworICBwYWRkaW5nOiAwLjI1ZW07CisgIHZlcnRpY2FsLWFsaWduOiB0b3A7Cit9CisKK3AgYVtpZF0geworICBtYXJnaW46IDBweDsKKyAgcGFkZGluZzogMHB4OworICBkaXNwbGF5OiBpbmxpbmU7CisgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7Cit9CisKK2EgeworICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKKyAgY29sb3I6ICM0NDQ7Cit9CisKK3ByZSB7CisgICAgb3ZlcmZsb3c6IGF1dG87Cit9CisKK2E6aG92ZXIgeworICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKKyAgLypmb250LXdlaWdodDogYm9sZDsqLworfQorCisvKiBUaGlzIHN0eWxlIGRlZmluZXMgaG93IHRoZSBwZXJtYWxpbmsgY2hhcmFjdGVyCisgICBhcHBlYXJzIGJ5IGl0c2VsZiBhbmQgd2hlbiBob3ZlcmVkIG92ZXIgd2l0aAorICAgdGhlIG1vdXNlLiAqLworCitbYWx0PSdQZXJtYWxpbmsnXSB7IGNvbG9yOiAjZWVlOyB9CitbYWx0PSdQZXJtYWxpbmsnXTpob3ZlciB7IGNvbG9yOiBibGFjazsgfQorCisKK2Rpdi5pbmZvcm1hbGZpZ3VyZSwKK2Rpdi5pbmZvcm1hbGV4YW1wbGUsCitkaXYuaW5mb3JtYWx0YWJsZSwKK2Rpdi5maWd1cmUsCitkaXYudGFibGUsCitkaXYuZXhhbXBsZSB7CisgIG1hcmdpbjogMWVtIDBlbTsKKyAgcGFkZGluZzogMWVtOworICBwYWdlLWJyZWFrLWluc2lkZTogYXZvaWQ7Cit9CisKKworZGl2LmluZm9ybWFsZmlndXJlIHAudGl0bGUgYiwKK2Rpdi5pbmZvcm1hbGV4YW1wbGUgcC50aXRsZSBiLAorZGl2LmluZm9ybWFsdGFibGUgcC50aXRsZSBiLAorZGl2LmZpZ3VyZSBwLnRpdGxlIGIsCitkaXYuZXhhbXBsZSBwLnRpdGxlIGIsCitkaXYudGFibGUgcC50aXRsZSBieworICAgIHBhZGRpbmctdG9wOiAwZW07CisgICAgbWFyZ2luLXRvcDogMGVtOworICAgIGZvbnQtc2l6ZTogMTAwJTsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworfQorCisubWVkaWFvYmplY3QgLmNhcHRpb24sCisubWVkaWFvYmplY3QgLmNhcHRpb24gcCAgeworICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgIGZvbnQtc2l6ZTogODAlOworICBwYWRkaW5nLXRvcDogMC41ZW07CisgIHBhZGRpbmctYm90dG9tOiAwLjVlbTsKK30KKworLmVwaWdyYXBoIHsKKyAgcGFkZGluZy1sZWZ0OiA1NSU7CisgIG1hcmdpbi1ib3R0b206IDFlbTsKK30KKworLmVwaWdyYXBoIHAgeworICB0ZXh0LWFsaWduOiBsZWZ0OworfQorCisuZXBpZ3JhcGggLnF1b3RlIHsKKyAgZm9udC1zdHlsZTogaXRhbGljOworfQorLmVwaWdyYXBoIC5hdHRyaWJ1dGlvbiB7CisgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgdGV4dC1hbGlnbjogcmlnaHQ7Cit9CisKK3NwYW4uYXBwbGljYXRpb24geworICBmb250LXN0eWxlOiBpdGFsaWM7Cit9CisKKy5wcm9ncmFtbGlzdGluZyB7CisgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CisgIGZvbnQtc2l6ZTogODAlOworICB3aGl0ZS1zcGFjZTogcHJlOworICBtYXJnaW46IDEuMzNlbSAwZW07CisgIHBhZGRpbmc6IDEuMzNlbTsKK30KKworLnRpcCwKKy53YXJuaW5nLAorLmNhdXRpb24sCisubm90ZSB7CisgIG1hcmdpbi10b3A6IDFlbTsKKyAgbWFyZ2luLWJvdHRvbTogMWVtOworCit9CisKKy8qIGZvcmNlIGZ1bGwgd2lkdGggb2YgdGFibGUgd2l0aGluIGRpdiAqLworLnRpcCB0YWJsZSwKKy53YXJuaW5nIHRhYmxlLAorLmNhdXRpb24gdGFibGUsCisubm90ZSB0YWJsZSB7CisgIGJvcmRlcjogbm9uZTsKKyAgd2lkdGg6IDEwMCU7Cit9CisKKworLnRpcCB0YWJsZSB0aCwKKy53YXJuaW5nIHRhYmxlIHRoLAorLmNhdXRpb24gdGFibGUgdGgsCisubm90ZSB0YWJsZSB0aCB7CisgIHBhZGRpbmc6IDAuOGVtIDAuMGVtIDAuMGVtIDAuMGVtOworICBtYXJnaW4gOiAwZW0gMGVtIDBlbSAwZW07Cit9CisKKy50aXAgcCwKKy53YXJuaW5nIHAsCisuY2F1dGlvbiBwLAorLm5vdGUgcCB7CisgIG1hcmdpbi10b3A6IDAuNWVtOworICBtYXJnaW4tYm90dG9tOiAwLjVlbTsKKyAgcGFkZGluZy1yaWdodDogMWVtOworICB0ZXh0LWFsaWduOiBsZWZ0OworfQorCisuYWNyb255bSB7CisgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7Cit9CisKK2Iua2V5Y2FwLAorLmtleWNhcCB7CisgIHBhZGRpbmc6IDAuMDllbSAwLjNlbTsKKyAgbWFyZ2luOiAwZW07Cit9CisKKy5pdGVtaXplZGxpc3QgbGkgeworICBjbGVhcjogbm9uZTsKK30KKworLmZpbGVuYW1lIHsKKyAgZm9udC1zaXplOiBtZWRpdW07CisgIGZvbnQtZmFtaWx5OiBDb3VyaWVyLCBtb25vc3BhY2U7Cit9CisKKworZGl2Lm5hdmhlYWRlciwgZGl2LmhlYWRpbmd7CisgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgbGVmdDogMGVtOworICB0b3A6IDBlbTsKKyAgd2lkdGg6IDEwMCU7CisgIGJhY2tncm91bmQtY29sb3I6ICNjZGY7CisgIHdpZHRoOiAxMDAlOworfQorCitkaXYubmF2Zm9vdGVyLCBkaXYuZm9vdGluZ3sKKyAgcG9zaXRpb246IGZpeGVkOworICBsZWZ0OiAwZW07CisgIGJvdHRvbTogMGVtOworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlOworICB3aWR0aDogMTAwJTsKK30KKworCitkaXYubmF2aGVhZGVyIHRkLAorZGl2Lm5hdmZvb3RlciB0ZCB7CisgIGZvbnQtc2l6ZTogNjYlOworfQorCitkaXYubmF2aGVhZGVyIHRhYmxlIHRoIHsKKyAgLypmb250LWZhbWlseTogR2VvcmdpYSwgVGltZXMsIHNlcmlmOyovCisgIC8qZm9udC1zaXplOiB4LWxhcmdlOyovCisgIGZvbnQtc2l6ZTogODAlOworfQorCitkaXYubmF2aGVhZGVyIHRhYmxlIHsKKyAgYm9yZGVyLWxlZnQ6IDBlbTsKKyAgYm9yZGVyLXJpZ2h0OiAwZW07CisgIGJvcmRlci10b3A6IDBlbTsKKyAgd2lkdGg6IDEwMCU7Cit9CisKK2Rpdi5uYXZmb290ZXIgdGFibGUgeworICBib3JkZXItbGVmdDogMGVtOworICBib3JkZXItcmlnaHQ6IDBlbTsKKyAgYm9yZGVyLWJvdHRvbTogMGVtOworICB3aWR0aDogMTAwJTsKK30KKworZGl2Lm5hdmhlYWRlciB0YWJsZSB0ZCBhLAorZGl2Lm5hdmZvb3RlciB0YWJsZSB0ZCBhIHsKKyAgY29sb3I6ICM3Nzc7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKworLyogbm9ybWFsIHRleHQgaW4gdGhlIGZvb3RlciAqLworZGl2Lm5hdmZvb3RlciB0YWJsZSB0ZCB7CisgIGNvbG9yOiBibGFjazsKK30KKworZGl2Lm5hdmhlYWRlciB0YWJsZSB0ZCBhOnZpc2l0ZWQsCitkaXYubmF2Zm9vdGVyIHRhYmxlIHRkIGE6dmlzaXRlZCB7CisgIGNvbG9yOiAjNDQ0OworfQorCisKKy8qIGxpbmtzIGluIGhlYWRlciBhbmQgZm9vdGVyICovCitkaXYubmF2aGVhZGVyIHRhYmxlIHRkIGE6aG92ZXIsCitkaXYubmF2Zm9vdGVyIHRhYmxlIHRkIGE6aG92ZXIgeworICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKKyAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7CisgIGNvbG9yOiAjMzNhOworfQorCitkaXYubmF2aGVhZGVyIGhyLAorZGl2Lm5hdmZvb3RlciBociB7CisgIGRpc3BsYXk6IG5vbmU7Cit9CisKKworLnFhbmRhc2V0IHRyLnF1ZXN0aW9uIHRkIHAgeworICBtYXJnaW46IDBlbSAwZW0gMWVtIDBlbTsKKyAgcGFkZGluZzogMGVtIDBlbSAwZW0gMGVtOworfQorCisucWFuZGFzZXQgdHIuYW5zd2VyIHRkIHAgeworICBtYXJnaW46IDBlbSAwZW0gMWVtIDBlbTsKKyAgcGFkZGluZzogMGVtIDBlbSAwZW0gMGVtOworfQorLmFuc3dlciB0ZCB7CisgIHBhZGRpbmctYm90dG9tOiAxLjVlbTsKK30KKworLmVtcGhhc2lzIHsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKKworICAvKioqKioqKioqKioqKiAvCisgLyBkZWNvcmF0aW9ucyAgLworLyAqKioqKioqKioqKioqLworCisudGl0bGVwYWdlIHsKK30KKworLnBhcnQgLnRpdGxlIHsKK30KKworLnN1YnRpdGxlIHsKKyAgICBib3JkZXI6IG5vbmU7Cit9CisKKy8qCitoMSB7CisgIGJvcmRlcjogbm9uZTsKK30KKworaDIgeworICBib3JkZXItdG9wOiBzb2xpZCAwLjJlbTsKKyAgYm9yZGVyLWJvdHRvbTogc29saWQgMC4wNmVtOworfQorCitoMyB7CisgIGJvcmRlci10b3A6IDBlbTsKKyAgYm9yZGVyLWJvdHRvbTogc29saWQgMC4wNmVtOworfQorCitoNCB7CisgIGJvcmRlcjogMGVtOworICBib3JkZXItYm90dG9tOiBzb2xpZCAwLjA2ZW07Cit9CisKK2g1IHsKKyAgYm9yZGVyOiAwZW07Cit9CisqLworCisucHJvZ3JhbWxpc3RpbmcgeworICBib3JkZXI6IHNvbGlkIDFweDsKK30KKworZGl2LmZpZ3VyZSwKK2Rpdi50YWJsZSwKK2Rpdi5pbmZvcm1hbGZpZ3VyZSwKK2Rpdi5pbmZvcm1hbHRhYmxlLAorZGl2LmluZm9ybWFsZXhhbXBsZSwKK2Rpdi5leGFtcGxlIHsKKyAgYm9yZGVyOiAxcHggc29saWQ7Cit9CisKKworCisudGlwLAorLndhcm5pbmcsCisuY2F1dGlvbiwKKy5ub3RlIHsKKyAgYm9yZGVyOiAxcHggc29saWQ7Cit9CisKKy50aXAgdGFibGUgdGgsCisud2FybmluZyB0YWJsZSB0aCwKKy5jYXV0aW9uIHRhYmxlIHRoLAorLm5vdGUgdGFibGUgdGggeworICBib3JkZXItYm90dG9tOiAxcHggc29saWQ7Cit9CisKKy5xdWVzdGlvbiB0ZCB7CisgIGJvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsKK30KKworLmFuc3dlciB7Cit9CisKKworYi5rZXljYXAsCisua2V5Y2FwIHsKKyAgYm9yZGVyOiAxcHggc29saWQ7Cit9CisKKworZGl2Lm5hdmhlYWRlciwgZGl2LmhlYWRpbmd7CisgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZDsKK30KKworCitkaXYubmF2Zm9vdGVyLCBkaXYuZm9vdGluZ3sKKyAgYm9yZGVyLXRvcDogMXB4IHNvbGlkOworfQorCisgIC8qKioqKioqKiogLworIC8gIGNvbG9ycyAgLworLyAqKioqKioqKiovCisKK2JvZHkgeworICBjb2xvcjogIzMzMzsKKyAgYmFja2dyb3VuZDogd2hpdGU7Cit9CisKK2EgeworICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKK30KKworYTpob3ZlciB7CisgIGJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Cit9CisKKworaDEsCitoMiwKK2gzLAoraDQsCitoNSwKK2g2LAoraDcsCitoOCB7CisgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OworfQorCitociB7CisgIGJvcmRlci1jb2xvcjogI2FhYTsKK30KKworCisudGlwLCAud2FybmluZywgLmNhdXRpb24sIC5ub3RlIHsKKyAgYm9yZGVyLWNvbG9yOiAjZmZmOworfQorCisKKy50aXAgdGFibGUgdGgsCisud2FybmluZyB0YWJsZSB0aCwKKy5jYXV0aW9uIHRhYmxlIHRoLAorLm5vdGUgdGFibGUgdGggeworICBib3JkZXItYm90dG9tLWNvbG9yOiAjZmZmOworfQorCisKKy53YXJuaW5nIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMjsKK30KKworLmNhdXRpb24geworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYyOworfQorCisudGlwIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMjsKK30KKworLm5vdGUgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYyOworfQorCisuZ2xvc3NhcnkgZGwgZHQsCisudmFyaWFibGVsaXN0IGRsIGR0LAorLnZhcmlhYmxlbGlzdCBkbCBkdCBzcGFuLnRlcm0geworICBjb2xvcjogIzA0NDsKK30KKworZGl2LmZpZ3VyZSwKK2Rpdi50YWJsZSwKK2Rpdi5leGFtcGxlLAorZGl2LmluZm9ybWFsZmlndXJlLAorZGl2LmluZm9ybWFsdGFibGUsCitkaXYuaW5mb3JtYWxleGFtcGxlIHsKKyAgYm9yZGVyLWNvbG9yOiAjYWFhOworfQorCitwcmUucHJvZ3JhbWxpc3RpbmcgeworICBjb2xvcjogYmxhY2s7CisgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CisgIGJvcmRlci1jb2xvcjogI2FhYTsKKyAgYm9yZGVyLXdpZHRoOiAycHg7Cit9CisKKy5ndWltZW51LAorLmd1aWxhYmVsLAorLmd1aW1lbnVpdGVtIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTsKK30KKworCitiLmtleWNhcCwKKy5rZXljYXAgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlOworICBib3JkZXItY29sb3I6ICM5OTk7Cit9CisKKworZGl2Lm5hdmhlYWRlciB7CisgIGJvcmRlci1jb2xvcjogYmxhY2s7Cit9CisKKworZGl2Lm5hdmZvb3RlciB7CisgIGJvcmRlci1jb2xvcjogYmxhY2s7Cit9CisKKworICAvKioqKioqKioqKiogLworIC8gIGdyYXBoaWNzICAvCisvICoqKioqKioqKioqLworCisvKgorYm9keSB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiaW1hZ2VzL2JvZHlfYmcuanBnIik7CisgIGJhY2tncm91bmQtYXR0YWNobWVudDogZml4ZWQ7Cit9CisKKy5uYXZoZWFkZXIsCisubm90ZSwKKy50aXAgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImltYWdlcy9ub3RlX2JnLmpwZyIpOworICBiYWNrZ3JvdW5kLWF0dGFjaG1lbnQ6IGZpeGVkOworfQorCisud2FybmluZywKKy5jYXV0aW9uIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJpbWFnZXMvd2FybmluZ19iZy5qcGciKTsKKyAgYmFja2dyb3VuZC1hdHRhY2htZW50OiBmaXhlZDsKK30KKworLmZpZ3VyZSwKKy5pbmZvcm1hbGZpZ3VyZSwKKy5leGFtcGxlLAorLmluZm9ybWFsZXhhbXBsZSwKKy50YWJsZSwKKy5pbmZvcm1hbHRhYmxlIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJpbWFnZXMvZmlndXJlX2JnLmpwZyIpOworICBiYWNrZ3JvdW5kLWF0dGFjaG1lbnQ6IGZpeGVkOworfQorCisqLworaDEsCitoMiwKK2gzLAoraDQsCitoNSwKK2g2LAoraDd7Cit9CisKKy8qCitFeGFtcGxlIG9mIGhvdyB0byBzdGljayBhbiBpbWFnZSBhcyBwYXJ0IG9mIHRoZSB0aXRsZS4KKworZGl2LmFydGljbGUgLnRpdGxlcGFnZSAudGl0bGUKK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJmaWd1cmVzL3doaXRlLW9uLWJsYWNrLnBuZyIpOworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7CisgIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDsKK30KKyovCisKK2Rpdi5wcmVmYWNlIC50aXRsZXBhZ2UgLnRpdGxlLAorZGl2LmNvbG9waG9uIC50aXRsZSwKK2Rpdi5jaGFwdGVyIC50aXRsZXBhZ2UgLnRpdGxlLAorZGl2LmFydGljbGUgLnRpdGxlcGFnZSAudGl0bGUKK3sKK30KKworZGl2LnNlY3Rpb24gZGl2LnNlY3Rpb24gLnRpdGxlcGFnZSAudGl0bGUsCitkaXYuc2VjdDIgLnRpdGxlcGFnZSAudGl0bGUgeworICAgIGJhY2tncm91bmQ6IG5vbmU7Cit9CisKKworaDEudGl0bGUgeworICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKKyAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKKyAgaGVpZ2h0OiAyNTZweDsKKyAgdGV4dC1pbmRlbnQ6IC05MDAwcHg7CisgIG92ZXJmbG93OmhpZGRlbjsKK30KKworaDIuc3VidGl0bGUgeworICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKKyAgdGV4dC1pbmRlbnQ6IC05MDAwcHg7CisgIG92ZXJmbG93OmhpZGRlbjsKKyAgd2lkdGg6IDBweDsKKyAgZGlzcGxheTogbm9uZTsKK30KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8KKyAvICBwaXBwaW4uZ2ltcC5vcmcgc3BlY2lmaWMgYWx0ZXJhdGlvbnMgIC8KKy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorZGl2LmhlYWRpbmcsIGRpdi5uYXZoZWFkZXIgeworICBjb2xvcjogIzc3NzsKKyAgZm9udC1zaXplOiA4MCU7CisgIHBhZGRpbmc6IDA7CisgIG1hcmdpbjogMDsKKyAgdGV4dC1hbGlnbjogbGVmdDsKKyAgcG9zaXRpb246IGFic29sdXRlOworICB0b3A6IDBweDsKKyAgbGVmdDogMHB4OworICB3aWR0aDogMTAwJTsKKyAgaGVpZ2h0OiA1MHB4OworICBiYWNrZ3JvdW5kOiB1cmwoJy9nZngvaGVhZGluZ19iZy5wbmcnKSB0cmFuc3BhcmVudDsKKyAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14OworICBiYWNrZ3JvdW5kLWF0dGFjaG1lbnQ6IGZpeGVkOworICBib3JkZXI6IG5vbmU7Cit9CisKK2Rpdi5oZWFkaW5nIGEgeworICBjb2xvcjogIzQ0NDsKK30KKworZGl2LmZvb3RpbmcsIGRpdi5uYXZmb290ZXIgeworICBib3JkZXI6IG5vbmU7CisgIGNvbG9yOiAjZGRkOworICBmb250LXNpemU6IDgwJTsKKyAgdGV4dC1hbGlnbjpyaWdodDsKKworICB3aWR0aDogMTAwJTsKKyAgcGFkZGluZy10b3A6IDEwcHg7CisgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgYm90dG9tOiAwcHg7CisgIGxlZnQ6IDBweDsKKworICBiYWNrZ3JvdW5kOiB1cmwoJy9nZngvZm9vdGluZ19iZy5wbmcnKSB0cmFuc3BhcmVudDsKK30KKyovCisKKworCisgIC8qKioqKioqKioqKioqKioqKiogLworIC8gIG5hc3R5IGllIHR3ZWFrcyAgLworLyAqKioqKioqKioqKioqKioqKiovCisKKy8qCitkaXYuaGVhZGluZywgZGl2Lm5hdmhlYWRlciB7CisgIHdpZHRoOmV4cHJlc3Npb24oZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aCArICJweCIpOworfQorCitkaXYuZm9vdGluZywgZGl2Lm5hdmZvb3RlciB7CisgIHdpZHRoOmV4cHJlc3Npb24oZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aCArICJweCIpOworICBtYXJnaW4tbGVmdDpleHByZXNzaW9uKCItNWVtIik7Cit9Citib2R5IHsKKyAgcGFkZGluZzpleHByZXNzaW9uKCI0ZW0gNWVtIDBlbSA1ZW0iKTsKK30KKyovCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLworIC8gbW96aWxsYSB2ZW5kb3Igc3BlY2lmaWMgY3NzIGV4dGVuc2lvbnMgIC8KKy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCitkaXYubmF2Zm9vdGVyLCBkaXYuZm9vdGluZ3sKKyAgLW1vei1vcGFjaXR5OiAwLjhlbTsKK30KKworZGl2LmZpZ3VyZSwKK2Rpdi50YWJsZSwKK2Rpdi5pbmZvcm1hbGZpZ3VyZSwKK2Rpdi5pbmZvcm1hbHRhYmxlLAorZGl2LmluZm9ybWFsZXhhbXBsZSwKK2Rpdi5leGFtcGxlLAorLnRpcCwKKy53YXJuaW5nLAorLmNhdXRpb24sCisubm90ZSB7CisgIC1tb3otYm9yZGVyLXJhZGl1czogMC41ZW07Cit9CisKK2Iua2V5Y2FwLAorLmtleWNhcCB7CisgIC1tb3otYm9yZGVyLXJhZGl1czogMC4zZW07Cit9CisqLworCit0YWJsZSB0ciB0ZCB0YWJsZSB0ciB0ZCB7CisgIGRpc3BsYXk6IG5vbmU7Cit9CisKKworaHIgeworICBkaXNwbGF5OiBub25lOworfQorCit0YWJsZSB7CisgIGJvcmRlcjogMGVtOworfQorCisgLnBob3RvIHsKKyAgZmxvYXQ6IHJpZ2h0OworICBtYXJnaW4tbGVmdDogICAxLjVlbTsKKyAgbWFyZ2luLWJvdHRvbTogMS41ZW07CisgIG1hcmdpbi10b3A6IDBlbTsKKyAgbWF4LXdpZHRoOiAgICAgIDE3ZW07CisgIGJvcmRlcjogICAgIDFweCBzb2xpZCBncmF5OworICBwYWRkaW5nOiAgICAzcHg7CisgIGJhY2tncm91bmQ6IHdoaXRlOworfQorIC5zZXBlcmF0b3IgeworICAgcGFkZGluZy10b3A6IDJlbTsKKyAgIGNsZWFyOiBib3RoOworICB9CisKKyAgI3ZhbGlkYXRvcnMgeworICAgICAgbWFyZ2luLXRvcDogNWVtOworICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CisgICAgICBjb2xvcjogIzc3NzsKKyAgfQorICBAbWVkaWEgcHJpbnQgeworICAgICAgYm9keSB7CisgICAgICAgICAgZm9udC1zaXplOiA4cHQ7CisgICAgICB9CisgICAgICAubm9wcmludCB7CisgICAgICAgICAgZGlzcGxheTogbm9uZTsKKyAgICAgIH0KKyAgfQorCisKKy50aXAsCisubm90ZSB7CisgICBiYWNrZ3JvdW5kOiAjZjBmMGYyOworICAgY29sb3I6ICMzMzM7CisgICBwYWRkaW5nOiAyMHB4OworICAgbWFyZ2luOiAyMHB4OworfQorCisudGlwIGgzLAorLm5vdGUgaDMgeworICAgcGFkZGluZzogMGVtOworICAgbWFyZ2luOiAwZW07CisgICBmb250LXNpemU6IDJlbTsKKyAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgY29sb3I6ICMzMzM7Cit9CisKKy50aXAgYSwKKy5ub3RlIGEgeworICAgY29sb3I6ICMzMzM7CisgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKK30KKworLmZvb3Rub3RlIHsKKyAgIGZvbnQtc2l6ZTogc21hbGw7CisgICBjb2xvcjogIzMzMzsKK30KKworLyogQ2hhbmdlcyB0aGUgYW5ub3VuY2VtZW50IHRleHQgKi8KKy50aXAgaDMsCisud2FybmluZyBoMywKKy5jYXV0aW9uIGgzLAorLm5vdGUgaDMgeworICAgZm9udC1zaXplOmxhcmdlOworICAgY29sb3I6ICMwMDU1N0Q7Cit9CmRpZmYgLS1naXQgYS9iaXRiYWtlL2RvYy9iaXRiYWtlLXVzZXItbWFudWFsL2JpdGJha2UtdXNlci1tYW51YWwueG1sIGIvYml0YmFrZS9kb2MvYml0YmFrZS11c2VyLW1hbnVhbC9iaXRiYWtlLXVzZXItbWFudWFsLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmZmOTMzCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9kb2MvYml0YmFrZS11c2VyLW1hbnVhbC9iaXRiYWtlLXVzZXItbWFudWFsLnhtbApAQCAtMCwwICsxLDg4IEBACis8IURPQ1RZUEUgYm9vayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuMi8vRU4iCisiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9kb2Nib29rL3htbC80LjIvZG9jYm9va3guZHRkIj4KKworPGJvb2sgaWQ9J2JpdGJha2UtdXNlci1tYW51YWwnIGxhbmc9J2VuJworICAgICAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMy9YSW5jbHVkZSIKKyAgICAgICAgeG1sbnM9Imh0dHA6Ly9kb2Nib29rLm9yZy9ucy9kb2Nib29rIgorICAgICAgICA+CisgICAgPGJvb2tpbmZvPgorCisgICAgICAgIDxtZWRpYW9iamVjdD4KKyAgICAgICAgICAgIDxpbWFnZW9iamVjdD4KKyAgICAgICAgICAgICAgICA8aW1hZ2VkYXRhIGZpbGVyZWY9J2ZpZ3VyZXMvYml0YmFrZS10aXRsZS5wbmcnCisgICAgICAgICAgICAgICAgICAgIGZvcm1hdD0nU1ZHJworICAgICAgICAgICAgICAgICAgICBhbGlnbj0nbGVmdCcgc2NhbGVmaXQ9JzEnIHdpZHRoPScxMDAlJy8+CisgICAgICAgICAgICA8L2ltYWdlb2JqZWN0PgorICAgICAgICA8L21lZGlhb2JqZWN0PgorCisgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgIEJpdEJha2UgVXNlciBNYW51YWwKKyAgICAgICAgPC90aXRsZT4KKworICAgICAgICA8YXV0aG9yZ3JvdXA+CisgICAgICAgICAgICA8YXV0aG9yPgorICAgICAgICAgICAgICAgIDxmaXJzdG5hbWU+UmljaGFyZCBQdXJkaWUsIENocmlzIExhcnNvbiwgYW5kIDwvZmlyc3RuYW1lPiA8c3VybmFtZT5QaGlsIEJsdW5kZWxsPC9zdXJuYW1lPgorICAgICAgICAgICAgICAgIDxhZmZpbGlhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPG9yZ25hbWU+Qml0QmFrZSBDb21tdW5pdHk8L29yZ25hbWU+CisgICAgICAgICAgICAgICAgPC9hZmZpbGlhdGlvbj4KKyAgICAgICAgICAgICAgICA8ZW1haWw+Yml0YmFrZS1kZXZlbEBsaXN0cy5vcGVuZW1iZWRkZWQub3JnPC9lbWFpbD4KKyAgICAgICAgICAgIDwvYXV0aG9yPgorICAgICAgICA8L2F1dGhvcmdyb3VwPgorCis8IS0tCisjIEFkZCBpbiBzb21lIHJldmlzaW9uIGhpc3RvcnkgaWYgd2Ugd2FudCBpdCBoZXJlLgorICAgICAgICA8cmV2aGlzdG9yeT4KKyAgICAgICAgICAgIDxyZXZpc2lvbj4KKyAgICAgICAgICAgICAgICA8cmV2bnVtYmVyPngueDwvcmV2bnVtYmVyPgorICAgICAgICAgICAgICAgIDxkYXRlPmRkIG1vbnRoIHllYXI8L2RhdGU+CisgICAgICAgICAgICAgICAgPHJldnJlbWFyaz5Tb21lIHJlbGV2ZW50IGNvbW1lbnQ8L3JldnJlbWFyaz4KKyAgICAgICAgICAgIDwvcmV2aXNpb24+CisgICAgICAgICAgICA8cmV2aXNpb24+CisgICAgICAgICAgICAgICAgPHJldm51bWJlcj54Lng8L3Jldm51bWJlcj4KKyAgICAgICAgICAgICAgICA8ZGF0ZT5kZCBtb250aCB5ZWFyPC9kYXRlPgorICAgICAgICAgICAgICAgIDxyZXZyZW1hcms+U29tZSByZWxldmVudCBjb21tZW50PC9yZXZyZW1hcms+CisgICAgICAgICAgICA8L3JldmlzaW9uPgorICAgICAgICAgICAgPHJldmlzaW9uPgorICAgICAgICAgICAgICAgIDxyZXZudW1iZXI+eC54PC9yZXZudW1iZXI+CisgICAgICAgICAgICAgICAgPGRhdGU+ZGQgbW9udGggeWVhcjwvZGF0ZT4KKyAgICAgICAgICAgICAgICA8cmV2cmVtYXJrPlNvbWUgcmVsZXZlbnQgY29tbWVudDwvcmV2cmVtYXJrPgorICAgICAgICAgICAgPC9yZXZpc2lvbj4KKyAgICAgICAgICAgIDxyZXZpc2lvbj4KKyAgICAgICAgICAgICAgICA8cmV2bnVtYmVyPngueDwvcmV2bnVtYmVyPgorICAgICAgICAgICAgICAgIDxkYXRlPmRkIG1vbnRoIHllYXI8L2RhdGU+CisgICAgICAgICAgICAgICAgPHJldnJlbWFyaz5Tb21lIHJlbGV2ZW50IGNvbW1lbnQ8L3JldnJlbWFyaz4KKyAgICAgICAgICAgIDwvcmV2aXNpb24+CisgICAgICAgPC9yZXZoaXN0b3J5PgorLS0+CisKKyAgICAgICAgPGNvcHlyaWdodD4KKyAgICAgICAgICAgIDx5ZWFyPjIwMDQtMjAxNTwveWVhcj4KKyAgICAgICAgICAgIDxob2xkZXI+UmljaGFyZCBQdXJkaWU8L2hvbGRlcj4KKyAgICAgICAgICAgIDxob2xkZXI+Q2hyaXMgTGFyc29uPC9ob2xkZXI+CisgICAgICAgICAgICA8aG9sZGVyPmFuZCBQaGlsIEJsdW5kZWxsPC9ob2xkZXI+CisgICAgICAgIDwvY29weXJpZ2h0PgorCisgICAgICAgIDxsZWdhbG5vdGljZT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBMaWNlbnNlLgorICAgICAgICAgICAgICAgIFRvIHZpZXcgYSBjb3B5IG9mIHRoaXMgbGljZW5zZSwgdmlzaXQKKyAgICAgICAgICAgICAgICA8dWxpbmsgdXJsPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8yLjUvIj5odHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8yLjUvPC91bGluaz4KKyAgICAgICAgICAgICAgICBvciBzZW5kIGEgbGV0dGVyIHRvIENyZWF0aXZlIENvbW1vbnMsIDQ0NCBDYXN0cm8gU3RyZWV0LAorICAgICAgICAgICAgICAgIFN1aXRlIDkwMCwgTW91bnRhaW4gVmlldywgQ2FsaWZvcm5pYSA5NDA0MSwgVVNBLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xlZ2Fsbm90aWNlPgorICAgIDwvYm9va2luZm8+CisKKyAgICA8eGk6aW5jbHVkZSBocmVmPSJiaXRiYWtlLXVzZXItbWFudWFsLWludHJvLnhtbCIvPgorCisgICAgPHhpOmluY2x1ZGUgaHJlZj0iYml0YmFrZS11c2VyLW1hbnVhbC1leGVjdXRpb24ueG1sIi8+CisKKyAgICA8eGk6aW5jbHVkZSBocmVmPSJiaXRiYWtlLXVzZXItbWFudWFsLW1ldGFkYXRhLnhtbCIvPgorCisgICAgPHhpOmluY2x1ZGUgaHJlZj0iYml0YmFrZS11c2VyLW1hbnVhbC1mZXRjaGluZy54bWwiLz4KKworICAgIDx4aTppbmNsdWRlIGhyZWY9ImJpdGJha2UtdXNlci1tYW51YWwtcmVmLXZhcmlhYmxlcy54bWwiLz4KKworICAgIDx4aTppbmNsdWRlIGhyZWY9ImJpdGJha2UtdXNlci1tYW51YWwtaGVsbG8ueG1sIi8+CisKKzwvYm9vaz4KZGlmZiAtLWdpdCBhL2JpdGJha2UvZG9jL2JpdGJha2UtdXNlci1tYW51YWwvZmlndXJlcy9iaXRiYWtlLXRpdGxlLnBuZyBiL2JpdGJha2UvZG9jL2JpdGJha2UtdXNlci1tYW51YWwvZmlndXJlcy9iaXRiYWtlLXRpdGxlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjI5MDE1Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9kb2MvYml0YmFrZS11c2VyLW1hbnVhbC9maWd1cmVzL2JpdGJha2UtdGl0bGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvZG9jL2JpdGJha2UtdXNlci1tYW51YWwvaHRtbC5jc3MgYi9iaXRiYWtlL2RvYy9iaXRiYWtlLXVzZXItbWFudWFsL2h0bWwuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZWRmZDMKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2RvYy9iaXRiYWtlLXVzZXItbWFudWFsL2h0bWwuY3NzCkBAIC0wLDAgKzEsMjgxIEBACisvKiBGZXVpbGxlIGRlIHN0eWxlIERvY0Jvb2sgZHUgcHJvamV0IFRyYWR1Yy5vcmcgICAgICAgICAgICAgICAgKi8KKy8qIERvY0Jvb2sgQ1NTIHN0eWxlc2hlZXQgb2YgdGhlIFRyYWR1Yy5vcmcgcHJvamVjdCAgICAgICAgICAgICAqLworCisvKiAoYykgSmVhbi1QaGlsaXBwZSBHdelyYXJkIC0gMTQgYW/7dCAyMDA0ICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIChjKSBKZWFuLVBoaWxpcHBlIEd16XJhcmQgLSAxNCBBdWd1c3QgMjAwNCAgICAgICAgICAgICAgICAgICAqLworCisvKiBDZXR0ZSBmZXVpbGxlIGRlIHN0eWxlIGVzdCBsaWJyZSwgdm91cyBwb3V2ZXogbGEgICAgICAgICAgICAgKi8KKy8qIHJlZGlzdHJpYnVlciBldCBsYSBtb2RpZmllciBzZWxvbiBsZXMgdGVybWVzIGRlIGxhIExpY2VuY2UgICAqLworLyogQXJ0IExpYnJlLiBWb3VzIHRyb3V2ZXJleiB1biBleGVtcGxhaXJlIGRlIGNldHRlIExpY2VuY2Ugc3VyICovCisvKiBodHRwOi8vdGlncmVyYXllLm9yZy9QZXRpdC1ndWlkZS1kdS10cmFkdWN0ZXVyLmh0bWwjbGljZW5jZS1hcnQtbGlicmUgKi8KKworLyogVGhpcyB3b3JrIG9mIGFydCBpcyBmcmVlLCB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgICAgICovCisvKiBtb2RpZnkgaXQgYWNjb3JkaW5nIHRvIHRlcm1zIG9mIHRoZSBGcmVlIEFydCBsaWNlbnNlLiBZb3UgICAgKi8KKy8qIHdpbGwgZmluZCBhIHNwZWNpbWVuIG9mIHRoaXMgbGljZW5zZSBvbiB0aGUgQ29weWxlZnQgICAgICAgICAqLworLyogQXR0aXR1ZGUgd2ViIHNpdGU6IGh0dHA6Ly9hcnRsaWJyZS5vcmcgYXMgd2VsbCBhcyBvbiBvdGhlciAgICovCisvKiBzaXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBsZWFzZSBub3RlIHRoYXQgdGhlIEZyZW5jaCB2ZXJzaW9uIG9mIHRoaXMgbGljZW5jZSBhcyBzaG93biAqLworLyogb24gaHR0cDovL3RpZ3JlcmF5ZS5vcmcvUGV0aXQtZ3VpZGUtZHUtdHJhZHVjdGV1ci5odG1sI2xpY2VuY2UtYXJ0LWxpYnJlICovCisvKiBpcyBvbmx5IG9mZmljaWFsIGxpY2VuY2Ugb2YgdGhpcyBkb2N1bWVudC4gVGhlIEVuZ2xpc2ggICAgICAgKi8KKy8qIGlzIG9ubHkgcHJvdmlkZWQgdG8gaGVscCB5b3UgdW5kZXJzdGFuZCB0aGlzIGxpY2VuY2UuICAgICAgICAqLworCisvKiBMYSBkZXJuaehyZSB2ZXJzaW9uIGRlIGNldHRlIGZldWlsbGUgZGUgc3R5bGUgZXN0IHRvdWpvdXJzICAgKi8KKy8qIGRpc3BvbmlibGUgc3VyoDogaHR0cDovL3RpZ3JlcmF5ZS5vcmcvc3R5bGUuY3NzICAgICAgICAgICAgICAqLworLyogRWxsZSBlc3Qg6WdhbGVtZW50IGRpc3BvbmlibGUgc3VyoDogICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBodHRwOi8vd3d3LnRyYWR1Yy5vcmcvZG9jcy9IT1dUTy9sZWN0dXJlL3N0eWxlLmNzcyAgICAgICAgICAgKi8KKworLyogVGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgc3R5bGVzaGVldCBpcyBhdmFpbGFibGUgZnJvbTogICAgICovCisvKiBodHRwOi8vdGlncmVyYXllLm9yZy9zdHlsZS5jc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEl0IGlzIGFsc28gYXZhaWxhYmxlIG9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogaHR0cDovL3d3dy50cmFkdWMub3JnL2RvY3MvSE9XVE8vbGVjdHVyZS9zdHlsZS5jc3MgICAgICAgICAgICovCisKKy8qIE4naOlzaXRleiBwYXMg4CBlbnZveWVyIHZvcyBjb21tZW50YWlyZXMgZXQgY29ycmVjdGlvbnMg4CAgICAqLworLyogSmVhbi1QaGlsaXBwZSBHdelyYXJkIDxqZWFuLXBoaWxpcHBlLmd1ZXJhcmRAdGlncmVyYXllLm9yZz4gICovCisKKy8qIFBsZWFzZSBzZW5kIGZlZWRiYWNrIGFuZCBidWcgcmVwb3J0cyB0byAgICAgICAgICAgICAgICAgICAgICAqLworLyogSmVhbi1QaGlsaXBwZSBHdelyYXJkIDxqZWFuLXBoaWxpcHBlLmd1ZXJhcmRAdGlncmVyYXllLm9yZz4gICovCisKKy8qICRJZDogc3R5bGUuY3NzLHYgMS4xNCAyMDA0LzA5LzEwIDIwOjEyOjA5IGZldnJpZXIgRXhwIGZldnJpZXIgJCAqLworCisvKiBQculzZW50YXRpb24gZ+lu6XJhbGUgZHUgZG9jdW1lbnQgKi8KKy8qIE92ZXJhbGwgZG9jdW1lbnQgcHJlc2VudGF0aW9uICovCisKK2JvZHkgeworICAgIC8qCisgICAgZm9udC1mYW1pbHk6IEFwb2xsaW5lLCAiVVJXIFBhbGxhZGlvIEwiLCBHYXJhbW9uZCwgakdhcmFtb25kLAorICAgICAgICAgICAgICAgICAiQml0c3RyZWFtIEN5YmVyYml0IiwgIlBhbGF0aW5vIExpbm90eXBlIiwgc2VyaWY7CisgICAgICovCisgICAgbWFyZ2luOiA3JTsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKK30KKworLyogVGFpbGxlIGR1IHRleHRlICovCisvKiBUZXh0IHNpemUgKi8KKworKiB7IGZvbnQtc2l6ZTogMTAwJTsgfQorCisvKiBHZXN0aW9uIGRlcyB0ZXh0ZXMgbWlzIGVuIHJlbGllZiBpbWJyaXF16XMgKi8KKy8qIEVtYmVkZGVkIGVtcGhhc2lzICovCisKK2VtIHsgZm9udC1zdHlsZTogaXRhbGljOyB9CitlbSBlbSB7IGZvbnQtc3R5bGU6IG5vcm1hbDsgfQorZW0gZW0gZW0geyBmb250LXN0eWxlOiBpdGFsaWM7IH0KKworLyogVGl0cmVzICovCisvKiBUaXRsZXMgKi8KKworaDEgeyBmb250LXNpemU6IDIwMCU7IGZvbnQtd2VpZ2h0OiA5MDA7IH0KK2gyIHsgZm9udC1zaXplOiAxNjAlOyBmb250LXdlaWdodDogOTAwOyB9CitoMyB7IGZvbnQtc2l6ZTogMTMwJTsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KK2g0IHsgZm9udC1zaXplOiAxMTUlOyBmb250LXdlaWdodDogYm9sZDsgfQoraDUgeyBmb250LXNpemU6IDEwOCU7IGZvbnQtd2VpZ2h0OiBib2xkOyB9CitoNiB7ICAgICAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KKworLyogTm9tIGRlIGZhbWlsbGUgZW4gcGV0aXRlcyBtYWp1c2N1bGVzICh1bmlxdWVtZW50IGVuIGZyYW7nYWlzKSAqLworLyogTGFzdCBuYW1lcyBpbiBzbWFsbCBjYXBzIChmb3IgRnJlbmNoIG9ubHkpICovCisKKypbY2xhc3N+PSJzdXJuYW1lIl06bGFuZyhmcikgeyBmb250LXZhcmlhbnQ6IHNtYWxsLWNhcHM7IH0KKworLyogQmxvY3MgZGUgY2l0YXRpb24gKi8KKy8qIFF1b3RhdGlvbiBibG9jcyAqLworCitkaXZbY2xhc3N+PSJibG9ja3F1b3RlIl0geworICBib3JkZXI6IHNvbGlkIDJweCAjQUFBOworICBwYWRkaW5nOiA1cHg7CisgIG1hcmdpbjogNXB4OworfQorCitkaXZbY2xhc3N+PSJibG9ja3F1b3RlIl0gPiB0YWJsZSB7CisgIGJvcmRlcjogbm9uZTsKK30KKworLyogQmxvY3MgbGl06XJhdXigOiBmb25kIGdyaXMgY2xhaXIgKi8KKy8qIExpdGVyYWwgYmxvY3M6IGxpZ2h0IGdyYXkgYmFja2dyb3VuZCAqLworCisqW2NsYXNzfj0ibGl0ZXJhbGxheW91dCJdIHsKKyAgYmFja2dyb3VuZDogI2YwZjBmMDsKKyAgcGFkZGluZzogNXB4OworICBtYXJnaW46IDVweDsKK30KKworLyogUHJvZ3JhbW1lcyBldCBjYXB0dXJlcyB0ZXh0ZaA6IGZvbmQgYmxldSBjbGFpciAqLworLyogTGlzdGluZyBhbmQgdGV4dCBzY3JlZW4gc25hcHNob3RzOiBsaWdodCBibHVlIGJhY2tncm91bmQgKi8KKworKltjbGFzc349InByb2dyYW1saXN0aW5nIl0sICpbY2xhc3N+PSJzY3JlZW4iXSB7CisgIGJhY2tncm91bmQ6ICNmMGYwZmY7CisgIHBhZGRpbmc6IDVweDsKKyAgbWFyZ2luOiA1cHg7Cit9CisKKy8qIExlcyB0ZXh0ZXMg4CByZW1wbGFjZXIgc29udCBzdXJsaWdu6XMgZW4gdmVydCBw4mxlICovCisvKiBSZXBsYWNlYWJsZSB0ZXh0IGluIGhpZ2hsaWdodGVkIGluIHBhbGUgZ3JlZW4gKi8KKworKltjbGFzc349InJlcGxhY2VhYmxlIl0geyAKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjOThmYjk4OworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsgfQorCisvKiBUYWJsZXOgOiBmb25kcyBncmlzIGNsYWlyICYgYm9yZHMgc2ltcGxlcyAqLworLyogVGFibGVzOiBsaWdodCBncmF5IGJhY2tncm91bmQgYW5kIHNvbGlkIGJvcmRlcnMgKi8KKworKltjbGFzc349InRhYmxlIl0gKltjbGFzc349InRpdGxlIl0geyB3aWR0aDoxMDAlOyBib3JkZXI6IDBweDsgfQorCit0YWJsZSB7CisgICAgYm9yZGVyOiAxcHggc29saWQgI2FhYTsKKyAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOworICAgIHBhZGRpbmc6IDJweDsKKyAgICBtYXJnaW46IDVweDsKK30KKworLyogTGlzdGVzIHNpbXBsZXMgZW4gc3R5bGUgdGFibGUgKi8KKy8qIFNpbXBsZXMgbGlzdHMgaW4gdGFibGUgcHJlc2VudGF0aW9uICovCisKK3RhYmxlW2NsYXNzfj0ic2ltcGxlbGlzdCJdIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjBGMEYwOworICAgIG1hcmdpbjogNXB4OworICAgIGJvcmRlcjogc29saWQgMXB4ICNBQUE7Cit9CisKK3RhYmxlW2NsYXNzfj0ic2ltcGxlbGlzdCJdIHRkIHsKKyAgICBib3JkZXI6IHNvbGlkIDFweCAjQUFBOworfQorCisvKiBMZXMgdGFibGVzICovCisvKiBUYWJsZXMgKi8KKworKltjbGFzc349InRhYmxlIl0gdGFibGUgeworICAgIGJhY2tncm91bmQtY29sb3I6ICNGMEYwRjA7CisgICAgYm9yZGVyOiBzb2xpZCAxcHggI0FBQTsKK30KKypbY2xhc3N+PSJpbmZvcm1hbHRhYmxlIl0gdGFibGUgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjRjBGMEYwOyB9CisKK3RoLHRkIHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7CisgICAgdGV4dC1hbGlnbjogbGVmdDsKKyAgICBwYWRkaW5nOiAwLjFlbSAwLjNlbTsKKyAgICBlbXB0eS1jZWxsczogc2hvdzsgCit9CisKKy8qIEFsaWduZW1lbnQgZGVzIGNvbG9ubmVzICovCisvKiBDb2x1bm1zIGFsaWdubWVudCAqLworCit0ZFthbGlnbj1jZW50ZXJdICwgIHRoW2FsaWduPWNlbnRlcl0gIHsgdGV4dC1hbGlnbjogY2VudGVyOyB9Cit0ZFthbGlnbj1yaWdodF0gLCAgIHRoW2FsaWduPXJpZ2h0XSAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IH0KK3RkW2FsaWduPWxlZnRdICwgICAgdGhbYWxpZ249bGVmdF0gICAgeyB0ZXh0LWFsaWduOiBsZWZ0OyB9Cit0ZFthbGlnbj1qdXN0aWZ5XSAsIHRoW2FsaWduPWp1c3RpZnldIHsgdGV4dC1hbGlnbjoganVzdGlmeTsgfQorCisvKiBQYXMgZGUgbWFyZ2UgYXV0b3VyIGRlcyBpbWFnZXMgKi8KKy8qIE5vIGluc2lkZSBtYXJnaW5zIGZvciBpbWFnZXMgKi8KKworaW1nIHsgYm9yZGVyOiAwOyB9CisKKy8qIExlcyBsaWVucyBuZSBzb250IHBhcyBzb3VsaWdu6XMgKi8KKy8qIE5vIHVuZGVybGluZXMgZm9yIGxpbmtzICovCisKKzpsaW5rICwgOnZpc2l0ZWQgLCA6YWN0aXZlIHsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyB9CisKKy8qIFBydWRlbmNloDogY2FkcmUgamF1bmUgZXQgZm9uZCBqYXVuZSBjbGFpciAqLworLyogQ2F1dGlvbjogeWVsbG93IGJvcmRlciBhbmQgbGlnaHQgeWVsbG93IGJhY2tncm91bmQgKi8KKworKltjbGFzc349ImNhdXRpb24iXSB7CisgICAgYm9yZGVyOiBzb2xpZCAycHggeWVsbG93OworICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZTA7CisgICAgcGFkZGluZzogMWVtIDZweCAxZW0gOworICAgIG1hcmdpbjogNXB4OworfQorCisqW2NsYXNzfj0iY2F1dGlvbiJdIHRoIHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlCit9CisKKypbY2xhc3N+PSJjYXV0aW9uIl0gdGFibGUgeworICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZTA7CisgICAgYm9yZGVyOiBub25lOworfQorCisvKiBOb3RlIGltcG9ydGFudGWgOiBjYWRyZSBqYXVuZSBldCBmb25kIGphdW5lIGNsYWlyICovCisvKiBJbXBvcnRhbnQ6IHllbGxvdyBib3JkZXIgYW5kIGxpZ2h0IHllbGxvdyBiYWNrZ3JvdW5kICovCisKKypbY2xhc3N+PSJpbXBvcnRhbnQiXSB7CisgICAgYm9yZGVyOiBzb2xpZCAycHggeWVsbG93OworICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZTA7CisgICAgcGFkZGluZzogMWVtIDZweCAxZW07CisgICAgbWFyZ2luOiA1cHg7Cit9CisKKypbY2xhc3N+PSJpbXBvcnRhbnQiXSB0aCB7CisgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZQorfQorCisqW2NsYXNzfj0iaW1wb3J0YW50Il0gdGFibGUgIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmUwOworICAgIGJvcmRlcjogbm9uZTsKK30KKworLyogTWlzZSBlbiDpdmlkZW5jZaA6IHRleHRlIGzpZ+hyZW1lbnQgcGx1cyBncmFuZCAqLworLyogSGlnaGxpZ2h0czogc2xpZ2h0bHkgbGFyZ2VyIHRleHRzICovCisKKypbY2xhc3N+PSJoaWdobGlnaHRzIl0geworICAgIGZvbnQtc2l6ZTogIDExMCU7Cit9CisKKy8qIE5vdGWgOiBjYWRyZSBibGV1IGV0IGZvbmQgYmxldSBjbGFpciAqLworLyogTm90ZXM6IGJsdWUgYm9yZGVyIGFuZCBsaWdodCBibHVlIGJhY2tncm91bmQgKi8KKworKltjbGFzc349Im5vdGUiXSAgIHsKKyAgICBib3JkZXI6IHNvbGlkIDJweCAjNzA5OUM1OworICAgIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZmY7CisgICAgcGFkZGluZzogMWVtIDZweCAxZW0gOworICAgIG1hcmdpbjogNXB4OworfQorCisqW2NsYXNzfj0ibm90ZSJdIHRoIHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlCit9CisKKypbY2xhc3N+PSJub3RlIl0gdGFibGUgeworICAgIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZmY7CisgICAgYm9yZGVyOiBub25lOworfQorCisvKiBBc3R1Y2WgOiBjYWRyZSB2ZXJ0IGV0IGZvbmQgdmVydCBjbGFpciAqLworLyogVGlwOiBncmVlbiBib3JkZXIgYW5kIGxpZ2h0IGdyZWVuIGJhY2tncm91bmQgKi8KKworKltjbGFzc349InRpcCJdIHsKKyAgICBib3JkZXI6IHNvbGlkIDJweCAjMDBmZjAwOworICAgIGJhY2tncm91bmQtY29sb3I6ICNmMGZmZmY7CisgICAgcGFkZGluZzogMWVtIDZweCAxZW0gOworICAgIG1hcmdpbjogNXB4OworfQorCisqW2NsYXNzfj0idGlwIl0gdGggeworICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cit9CisKKypbY2xhc3N+PSJ0aXAiXSB0YWJsZSB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI2YwZmZmZjsKKyAgICBib3JkZXI6IG5vbmU7Cit9CisKKy8qIEF2ZXJ0aXNzZW1lbnSgOiBjYWRyZSByb3VnZSBldCBmb25kIHJvdWdlIGNsYWlyICovCisvKiBXYXJuaW5nOiByZWQgYm9yZGVyIGFuZCBsaWdodCByZWQgYmFja2dyb3VuZCAqLworCisqW2NsYXNzfj0id2FybmluZyJdIHsKKyAgICBib3JkZXI6IHNvbGlkIDJweCAjZmYwMDAwOworICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmYwZjA7IAorICAgIHBhZGRpbmc6IDFlbSA2cHggMWVtIDsKKyAgICBtYXJnaW46IDVweDsKK30KKworKltjbGFzc349Indhcm5pbmciXSB0aCB7CisgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKK30KKyAgICAgICAgICAgICAgICAgICAgCisKKypbY2xhc3N+PSJ3YXJuaW5nIl0gdGFibGUgeworICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmYwZjA7CisgICAgYm9yZGVyOiBub25lOworfQorCisvKiBGaW4gKi8KKy8qIFRoZSBFbmQgKi8KKwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9kb2MvYml0YmFrZS4xIGIvYml0YmFrZS9kb2MvYml0YmFrZS4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YzhkOTcKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2RvYy9iaXRiYWtlLjEKQEAgLTAsMCArMSwxNDIgQEAKKy5cIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGV5LCBFTUFDUzogLSotIG5yb2ZmIC0qLQorLlwiIEZpcnN0IHBhcmFtZXRlciwgTkFNRSwgc2hvdWxkIGJlIGFsbCBjYXBzCisuXCIgU2Vjb25kIHBhcmFtZXRlciwgU0VDVElPTiwgc2hvdWxkIGJlIDEtOCwgbWF5YmUgdy8gc3Vic2VjdGlvbgorLlwiIG90aGVyIHBhcmFtZXRlcnMgYXJlIGFsbG93ZWQ6IHNlZSBtYW4oNyksIG1hbigxKQorLlRIIEJJVEJBS0UgMSAiTm92ZW1iZXIgMTksIDIwMDYiCisuXCIgUGxlYXNlIGFkanVzdCB0aGlzIGRhdGUgd2hlbmV2ZXIgcmV2aXNpbmcgdGhlIG1hbnBhZ2UuCisuXCIKKy5cIiBTb21lIHJvZmYgbWFjcm9zLCBmb3IgcmVmZXJlbmNlOgorLlwiIC5uaCAgICAgICAgZGlzYWJsZSBoeXBoZW5hdGlvbgorLlwiIC5oeSAgICAgICAgZW5hYmxlIGh5cGhlbmF0aW9uCisuXCIgLmFkIGwgICAgICBsZWZ0IGp1c3RpZnkKKy5cIiAuYWQgYiAgICAgIGp1c3RpZnkgdG8gYm90aCBsZWZ0IGFuZCByaWdodCBtYXJnaW5zCisuXCIgLm5mICAgICAgICBkaXNhYmxlIGZpbGxpbmcKKy5cIiAuZmkgICAgICAgIGVuYWJsZSBmaWxsaW5nCisuXCIgLmJyICAgICAgICBpbnNlcnQgbGluZSBicmVhaworLlwiIC5zcCA8bj4gICAgaW5zZXJ0IG4rMSBlbXB0eSBsaW5lcworLlwiIGZvciBtYW5wYWdlLXNwZWNpZmljIG1hY3Jvcywgc2VlIG1hbig3KQorLlNIIE5BTUUKK0JpdEJha2UgXC0gc2ltcGxlIHRvb2wgZm9yIHRoZSBleGVjdXRpb24gb2YgdGFza3MKKy5TSCBTWU5PUFNJUworLkIgYml0YmFrZQorLlJJIFsgb3B0aW9ucyBdICIgcGFja2FnZW5hbWVzIgorLmJyCisuU0ggREVTQ1JJUFRJT04KK1RoaXMgbWFudWFsIHBhZ2UgZG9jdW1lbnRzIGJyaWVmbHkgdGhlCisuQiBiaXRiYWtlCitjb21tYW5kLgorLlBQCisuXCIgVGVYIHVzZXJzIG1heSBiZSBtb3JlIGNvbWZvcnRhYmxlIHdpdGggdGhlIFxmQjx3aGF0ZXZlcj5cZlAgYW5kCisuXCIgXGZJPHdoYXRldmVyPlxmUCBlc2NhcGUgc2VxdWVuY2VzIHRvIGludm9kZSBib2xkIGZhY2UgYW5kIGl0YWxpY3MsIAorLlwiIHJlc3BlY3RpdmVseS4KK1xmQmJpdGJha2VcZlAgaXMgYSBwcm9ncmFtIHRoYXQgZXhlY3V0ZXMgdGhlIHNwZWNpZmllZCB0YXNrIChkZWZhdWx0IGlzICdidWlsZCcpCitmb3IgYSBnaXZlbiBzZXQgb2YgQml0QmFrZSBmaWxlcy4KKy5icgorSXQgZXhwZWN0cyB0aGF0IEJCRklMRVMgaXMgZGVmaW5lZCwgd2hpY2ggaXMgYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBmaWxlcyB0bworYmUgZXhlY3V0ZWQuIEJCRklMRVMgZG9lcyBzdXBwb3J0IHdpbGRjYXJkcy4KKy5icgorRGVmYXVsdCBCQkZJTEVTIGFyZSB0aGUgLmJiIGZpbGVzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKy5TSCBPUFRJT05TCitUaGlzIHByb2dyYW0gZm9sbG93IHRoZSB1c3VhbCBHTlUgY29tbWFuZCBsaW5lIHN5bnRheCwgd2l0aCBsb25nCitvcHRpb25zIHN0YXJ0aW5nIHdpdGggdHdvIGRhc2hlcyAoYC0nKS4KKy5UUAorLkIgXC1oLCBcLVwtaGVscAorU2hvdyBzdW1tYXJ5IG9mIG9wdGlvbnMuCisuVFAKKy5CIFwtXC12ZXJzaW9uCitTaG93IHZlcnNpb24gb2YgcHJvZ3JhbS4KKy5UUAorLkIgXC1iQlVJTERGSUxFLCBcLVwtYnVpbGRmaWxlPUJVSUxERklMRQorZXhlY3V0ZSB0aGUgdGFzayBhZ2FpbnN0IHRoaXMgLmJiIGZpbGUsIHJhdGhlciB0aGFuIGEgcGFja2FnZSBmcm9tIEJCRklMRVMuCisuVFAKKy5CIFwtaywgXC1cLWNvbnRpbnVlCitjb250aW51ZSBhcyBtdWNoIGFzIHBvc3NpYmxlIGFmdGVyIGFuIGVycm9yLiBXaGlsZSB0aGUgdGFyZ2V0IHRoYXQgZmFpbGVkLCBhbmQKK3Rob3NlIHRoYXQgZGVwZW5kIG9uIGl0LCBjYW5ub3QgYmUgcmVtYWRlLCB0aGUgb3RoZXIgZGVwZW5kZW5jaWVzIG9mIHRoZXNlCit0YXJnZXRzIGNhbiBiZSBwcm9jZXNzZWQgYWxsIHRoZSBzYW1lLgorLlRQCisuQiBcLWEsIFwtXC10cnlhbHRjb25maWdzCitjb250aW51ZSB3aXRoIGJ1aWxkcyBieSB0cnlpbmcgdG8gdXNlIGFsdGVybmF0aXZlIHByb3ZpZGVycyB3aGVyZSBwb3NzaWJsZS4KKy5UUAorLkIgXC1mLCBcLVwtZm9yY2UKK2ZvcmNlIHJ1biBvZiBzcGVjaWZpZWQgY21kLCByZWdhcmRsZXNzIG9mIHN0YW1wIHN0YXR1cworLlRQCisuQiBcLWksIFwtXC1pbnRlcmFjdGl2ZQorZHJvcCBpbnRvIHRoZSBpbnRlcmFjdGl2ZSBtb2RlIGFsc28gY2FsbGVkIHRoZSBCaXRCYWtlIHNoZWxsLgorLlRQCisuQiBcLWNDTUQsIFwtXC1jbWQ9Q01ECitTcGVjaWZ5IHRhc2sgdG8gZXhlY3V0ZS4gTm90ZSB0aGF0IHRoaXMgb25seSBleGVjdXRlcyB0aGUgc3BlY2lmaWVkIHRhc2sgZm9yCit0aGUgcHJvdmlkZWUgYW5kIHRoZSBwYWNrYWdlcyBpdCBkZXBlbmRzIG9uLCBpLmUuICdjb21waWxlJyBkb2VzIG5vdCBpbXBsaWNpdGx5CitjYWxsIHN0YWdlIGZvciB0aGUgZGVwZW5kZW5jaWVzIChJT1c6IHVzZSBvbmx5IGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZykuCitEZXBlbmRpbmcgb24gdGhlIGJhc2UuYmJjbGFzcyBhIGxpc3R0YXNrcyB0YXNrIGlzIGRlZmluZWQgYW5kIHdpbGwgc2hvdworYXZhaWxhYmxlIHRhc2tzLgorLlRQCisuQiBcLXJGSUxFLCBcLVwtcmVhZD1GSUxFIAorcmVhZCB0aGUgc3BlY2lmaWVkIGZpbGUgYmVmb3JlIGJpdGJha2UuY29uZgorLlRQCisuQiBcLXYsIFwtXC12ZXJib3NlCitvdXRwdXQgbW9yZSBjaGl0LWNoYXQgdG8gdGhlIHRlcm1pbmFsCisuVFAKKy5CIFwtRCwgXC1cLWRlYnVnCitJbmNyZWFzZSB0aGUgZGVidWcgbGV2ZWwuIFlvdSBjYW4gc3BlY2lmeSB0aGlzIG1vcmUgdGhhbiBvbmNlLgorLlRQCisuQiBcLW4sIFwtXC1kcnktcnVuCitkb24ndCBleGVjdXRlLCBqdXN0IGdvIHRocm91Z2ggdGhlIG1vdGlvbnMKKy5UUAorLkIgXC1wLCBcLVwtcGFyc2Utb25seQorcXVpdCBhZnRlciBwYXJzaW5nIHRoZSBCQiBmaWxlcyAoZGV2ZWxvcGVycyBvbmx5KQorLlRQCisuQiBcLXMsIFwtXC1zaG93LXZlcnNpb25zCitzaG93IGN1cnJlbnQgYW5kIHByZWZlcnJlZCB2ZXJzaW9ucyBvZiBhbGwgcGFja2FnZXMKKy5UUAorLkIgXC1lLCBcLVwtZW52aXJvbm1lbnQKK3Nob3cgdGhlIGdsb2JhbCBvciBwZXItcmVjaXBlIGVudmlyb25tZW50ICh0aGlzIGlzIHdoYXQgdXNlZCB0byBiZSBiYnJlYWQpCisuVFAKKy5CIFwtZywgXC1cLWdyYXBodml6CitlbWl0IHRoZSBkZXBlbmRlbmN5IHRyZWVzIG9mIHRoZSBzcGVjaWZpZWQgcGFja2FnZXMgaW4gdGhlIGRvdCBzeW50YXgKKy5UUAorLkIgXC1JSUdOT1JFRFxfRE9UXF9ERVBTLCBcLVwtaWdub3JlLWRlcHM9SUdOT1JFRF9ET1RfREVQUworU3RvcCBwcm9jZXNzaW5nIGF0IHRoZSBnaXZlbiBsaXN0IG9mIGRlcGVuZGVuY2llcyB3aGVuIGdlbmVyYXRpbmcgZGVwZW5kZW5jeQorZ3JhcGhzLiBUaGlzIGNhbiBoZWxwIHRvIG1ha2UgdGhlIGdyYXBoIG1vcmUgYXBwZWFsaW5nCisuVFAKKy5CIFwtbERFQlVHX0RPTUFJTlMsIFwtXC1sb2ctZG9tYWlucz1ERUJVR19ET01BSU5TCitTaG93IGRlYnVnIGxvZ2dpbmcgZm9yIHRoZSBzcGVjaWZpZWQgbG9nZ2luZyBkb21haW5zCisuVFAKKy5CIFwtUCwgXC1cLXByb2ZpbGUKK3Byb2ZpbGUgdGhlIGNvbW1hbmQgYW5kIHByaW50IGEgcmVwb3J0CisuVFAKKy5CIFwtdVVJLCBcLVwtdWk9VUkKK1VzZXIgaW50ZXJmYWNlIHRvIHVzZS4gQ3VycmVudGx5LCBob2IsIGRlcGV4cCwgZ29nZ2xlIG9yIG5jdXJzZXMgY2FuIGJlIHNwZWNpZmllZCBhcyBVSS4KKy5UUAorLkIgXC10U0VSVkVSVFlQRSwgXC1cLXNlcnZlcnR5cGU9U0VSVkVSVFlQRQorQ2hvb3NlIHdoaWNoIHNlcnZlciB0byB1c2UsIG5vbmUsIHByb2Nlc3Mgb3IgeG1scnBjLgorLlRQCisuQiBcLVwtcmV2aXNpb25zLWNoYW5nZWQKK1NldCB0aGUgZXhpdCBjb2RlIGRlcGVuZGluZyBvbiB3aGV0aGVyIHVwc3RyZWFtIGZsb2F0aW5nIHJldmlzaW9ucyBoYXZlIGNoYW5nZWQgb3Igbm90LgorLlRQCisuQiBcLVwtc2VydmVyLW9ubHkKK1J1biBiaXRiYWtlIHdpdGhvdXQgVUksICB0aGUgZnJvbnRlbmQgY2FuIGNvbm5lY3Qgd2l0aCBiaXRiYWtlIHNlcnZlciBpdHNlbGYuCisuVFAKKy5CIFwtQkJJTkQsIFwtXC1iaW5kPUJJTkQKK1RoZSBuYW1lL2FkZHJlc3MgZm9yIHRoZSBiaXRiYWtlIHNlcnZlciB0byBiaW5kIHRvLgorLlRQCisuQiBcLVwtbm9cLXNldHNjZW5lCitEbyBub3QgcnVuIGFueSBzZXRzY2VuZSB0YXNrcywgZm9yY2VzIGJ1aWxkcy4KKworLlNIIEVOVklST05NRU5UIFZBUklBQkxFUworYml0YmFrZSB1c2VzIHRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIGNvbnRyb2wgaXRzCitvcGVyYXRpb246CisuVFAKKy5CIEJJVEJBS0VfVUkKK1RoZSBiaXRiYWtlIHVzZXIgaW50ZXJmYWNlOyBvdmVycmlkZGVuIGJ5IHRoZSBcZkItdVxmUCBjb21tYW5kbGluZSBvcHRpb24uCisKKy5TSCBBVVRIT1JTCitCaXRCYWtlIHdhcyB3cml0dGVuIGJ5IAorUGhpbCBCbHVuZGVsbCwKK0hvbGdlciBGcmV5dGhlciwKK0NocmlzIExhcnNvbiwKK01pY2tleSBMYXVlciwKK1JpY2hhcmQgUHVyZGllLAorSG9sZ2VyIFNjaHVyaWcKKy5QUAorVGhpcyBtYW51YWwgcGFnZSB3YXMgd3JpdHRlbiBieSBNYXJjaW4gSnVzemtpZXdpY3ogPG1hcmNpbkBocncub25lLnBsPgorZm9yIHRoZSBEZWJpYW4gcHJvamVjdCAoYnV0IG1heSBiZSB1c2VkIGJ5IG90aGVycykuCmRpZmYgLS1naXQgYS9iaXRiYWtlL2RvYy9wb2t5LmVudCBiL2JpdGJha2UvZG9jL3Bva3kuZW50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMzJlMTQKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2RvYy9wb2t5LmVudApAQCAtMCwwICsxLDU5IEBACis8IUVOVElUWSBESVNUUk8gIjEuNCI+Cis8IUVOVElUWSBESVNUUk9fTkFNRSAidGJkIj4KKzwhRU5USVRZIFlPQ1RPX0RPQ19WRVJTSU9OICIxLjQiPgorPCFFTlRJVFkgUE9LWVZFUlNJT04gIjguMCI+Cis8IUVOVElUWSBZT0NUT19QT0tZICJwb2t5LSZESVNUUk9fTkFNRTstJlBPS1lWRVJTSU9OOyI+Cis8IUVOVElUWSBDT1BZUklHSFRfWUVBUiAiMjAxMC0yMDEzIj4KKzwhRU5USVRZIFlPQ1RPX0RMX1VSTCAiaHR0cDovL2Rvd25sb2Fkcy55b2N0b3Byb2plY3Qub3JnIj4KKzwhRU5USVRZIFlPQ1RPX0hPTUVfVVJMICJodHRwOi8vd3d3LnlvY3RvcHJvamVjdC5vcmciPgorPCFFTlRJVFkgWU9DVE9fTElTVFNfVVJMICJodHRwOi8vbGlzdHMueW9jdG9wcm9qZWN0Lm9yZyI+Cis8IUVOVElUWSBZT0NUT19CVUdaSUxMQV9VUkwgImh0dHA6Ly9idWd6aWxsYS55b2N0b3Byb2plY3Qub3JnIj4KKzwhRU5USVRZIFlPQ1RPX1dJS0lfVVJMICJodHRwczovL3dpa2kueW9jdG9wcm9qZWN0Lm9yZyI+Cis8IUVOVElUWSBZT0NUT19BQl9VUkwgImh0dHA6Ly9hdXRvYnVpbGRlci55b2N0b3Byb2plY3Qub3JnIj4KKzwhRU5USVRZIFlPQ1RPX0dJVF9VUkwgImh0dHA6Ly9naXQueW9jdG9wcm9qZWN0Lm9yZyI+Cis8IUVOVElUWSBZT0NUT19BRFRSRVBPX1VSTCAiaHR0cDovL2FkdHJlcG8ueW9jdG9wcm9qZWN0Lm9yZyI+Cis8IUVOVElUWSBPRV9IT01FX1VSTCAiaHR0cDovL3d3dy5vcGVuZW1iZWRkZWQub3JnIj4KKzwhRU5USVRZIE9FX0xJU1RTX1VSTCAiaHR0cDovL2xpc3RzLmxpbnV4dG9nby5vcmcvY2dpLWJpbi9tYWlsbWFuIj4KKzwhRU5USVRZIE9FX0RPQ1NfVVJMICJodHRwOi8vZG9jcy5vcGVuZW1iZWRkZWQub3JnIj4KKzwhRU5USVRZIE9IX0hPTUVfVVJMICJodHRwOi8vby1oYW5kLmNvbSI+Cis8IUVOVElUWSBCSVRCQUtFX0hPTUVfVVJMICJodHRwOi8vZGV2ZWxvcGVyLmJlcmxpb3MuZGUvcHJvamVjdHMvYml0YmFrZS8iPgorPCFFTlRJVFkgRUNMSVBTRV9NQUlOX1VSTCAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9kb3dubG9hZHMiPgorPCFFTlRJVFkgRUNMSVBTRV9ETF9VUkwgImh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZyI+Cis8IUVOVElUWSBFQ0xJUFNFX0RMX1BMVUdJTl9VUkwgIiZZT0NUT19ETF9VUkw7L3JlbGVhc2VzL2VjbGlwc2UtcGx1Z2luLyZESVNUUk87Ij4KKzwhRU5USVRZIEVDTElQU0VfVVBEQVRFU19VUkwgIiZFQ0xJUFNFX0RMX1VSTDsvdG0vdXBkYXRlcy8zLjMiPgorPCFFTlRJVFkgRUNMSVBTRV9JTkRJR09fVVJMICImRUNMSVBTRV9ETF9VUkw7L3JlbGVhc2VzL2luZGlnbyI+Cis8IUVOVElUWSBFQ0xJUFNFX0pVTk9fVVJMICImRUNMSVBTRV9ETF9VUkw7L3JlbGVhc2VzL2p1bm8iPgorPCFFTlRJVFkgRUNMSVBTRV9JTkRJR09fQ0RUX1VSTCAiJkVDTElQU0VfRExfVVJMO3Rvb2xzL2NkdC9yZWxlYXNlcy9pbmRpZ28iPgorPCFFTlRJVFkgWU9DVE9fRE9DU19VUkwgIiZZT0NUT19IT01FX1VSTDsvZG9jcyI+Cis8IUVOVElUWSBZT0NUT19TT1VSQ0VTX1VSTCAiJllPQ1RPX0hPTUVfVVJMOy9zb3VyY2VzLyI+Cis8IUVOVElUWSBZT0NUT19BQl9QT1JUX1VSTCAiJllPQ1RPX0FCX1VSTDs6ODAxMCI+Cis8IUVOVElUWSBZT0NUT19BQl9OSUdIVExZX1VSTCAiJllPQ1RPX0FCX1VSTDsvbmlnaHRseS8iPgorPCFFTlRJVFkgWU9DVE9fUE9LWV9VUkwgIiZZT0NUT19ETF9VUkw7L3JlbGVhc2VzL3Bva3kvIj4KKzwhRU5USVRZIFlPQ1RPX1JFTEVBU0VfRExfVVJMICImWU9DVE9fRExfVVJMOy9yZWxlYXNlcy95b2N0by95b2N0by0mRElTVFJPOyI+Cis8IUVOVElUWSBZT0NUT19UT09MQ0hBSU5fRExfVVJMICImWU9DVE9fUkVMRUFTRV9ETF9VUkw7L3Rvb2xjaGFpbi8iPgorPCFFTlRJVFkgWU9DVE9fRUNMSVBTRV9ETF9VUkwgIiZZT0NUT19SRUxFQVNFX0RMX1VSTDsvZWNsaXBzZS1wbHVnaW4vaW5kaWdvOyI+Cis8IUVOVElUWSBZT0NUT19BRFRJTlNUQUxMRVJfRExfVVJMICImWU9DVE9fUkVMRUFTRV9ETF9VUkw7L2FkdF9pbnN0YWxsZXIiPgorPCFFTlRJVFkgWU9DVE9fUE9LWV9ETF9VUkwgIiZZT0NUT19SRUxFQVNFX0RMX1VSTDsvJllPQ1RPX1BPS1k7LnRhci5iejIiPgorPCFFTlRJVFkgWU9DVE9fTUFDSElORVNfRExfVVJMICImWU9DVE9fUkVMRUFTRV9ETF9VUkw7L21hY2hpbmVzIj4KKzwhRU5USVRZIFlPQ1RPX1FFTVVfRExfVVJMICImWU9DVE9fTUFDSElORVNfRExfVVJMOy9xZW11Ij4KKzwhRU5USVRZIFlPQ1RPX1BZVEhPTi1pNjg2X0RMX1VSTCAiJllPQ1RPX0RMX1VSTDsvcmVsZWFzZXMvbWlzY3N1cHBvcnQvcHl0aG9uLW5hdGl2ZXNkay1zdGFuZGFsb25lLWk2ODYudGFyLmJ6MiI+Cis8IUVOVElUWSBZT0NUT19QWVRIT04teDg2XzY0X0RMX1VSTCAiJllPQ1RPX0RMX1VSTDsvcmVsZWFzZXMvbWlzY3N1cHBvcnQvcHl0aG9uLW5hdGl2ZXNkay1zdGFuZGFsb25lLXg4Nl82NC50YXIuYnoyIj4KKzwhRU5USVRZIFlPQ1RPX0RPQ1NfUVNfVVJMICImWU9DVE9fRE9DU19VUkw7LyZZT0NUT19ET0NfVkVSU0lPTjsveW9jdG8tcHJvamVjdC1xcy95b2N0by1wcm9qZWN0LXFzLmh0bWwiPgorPCFFTlRJVFkgWU9DVE9fRE9DU19BRFRfVVJMICImWU9DVE9fRE9DU19VUkw7LyZZT0NUT19ET0NfVkVSU0lPTjsvYWR0LW1hbnVhbC9hZHQtbWFudWFsLmh0bWwiPgorPCFFTlRJVFkgWU9DVE9fRE9DU19SRUZfVVJMICImWU9DVE9fRE9DU19VUkw7LyZZT0NUT19ET0NfVkVSU0lPTjsvcmVmLW1hbnVhbC9yZWYtbWFudWFsLmh0bWwiPgorPCFFTlRJVFkgWU9DVE9fRE9DU19CU1BfVVJMICImWU9DVE9fRE9DU19VUkw7LyZZT0NUT19ET0NfVkVSU0lPTjsvYnNwLWd1aWRlL2JzcC1ndWlkZS5odG1sIj4KKzwhRU5USVRZIFlPQ1RPX0RPQ1NfREVWX1VSTCAiJllPQ1RPX0RPQ1NfVVJMOy8mWU9DVE9fRE9DX1ZFUlNJT047L2Rldi1tYW51YWwvZGV2LW1hbnVhbC5odG1sIj4KKzwhRU5USVRZIFlPQ1RPX0RPQ1NfS0VSTkVMX1VSTCAiJllPQ1RPX0RPQ1NfVVJMOy8mWU9DVE9fRE9DX1ZFUlNJT047L2tlcm5lbC1tYW51YWwva2VybmVsLW1hbnVhbC5odG1sIj4KKzwhRU5USVRZIFlPQ1RPX0FEVFBBVEhfRElSICIvb3B0L3Bva3kvJkRJU1RSTzsiPgorPCFFTlRJVFkgWU9DVE9fUE9LWV9UQVJCQUxMICImWU9DVE9fUE9LWTsudGFyLmJ6MiI+Cis8IUVOVElUWSBPRV9JTklUX1BBVEggIiZZT0NUT19QT0tZOy9vZS1pbml0LWJ1aWxkLWVudiI+Cis8IUVOVElUWSBPRV9JTklUX0ZJTEUgIm9lLWluaXQtYnVpbGQtZW52Ij4KKzwhRU5USVRZIFVCVU5UVV9IT1NUX1BBQ0tBR0VTX0VTU0VOVElBTCAiZ2F3ayB3Z2V0IGdpdC1jb3JlIGRpZmZzdGF0IHVuemlwIHRleGluZm8gXAorICAgICBidWlsZC1lc3NlbnRpYWwgY2hycGF0aCI+Cis8IUVOVElUWSBGRURPUkFfSE9TVF9QQUNLQUdFU19FU1NFTlRJQUwgImdhd2sgbWFrZSB3Z2V0IHRhciBiemlwMiBnemlwIHB5dGhvbiB1bnppcCBwZXJsIHBhdGNoIFwKKyAgICAgZGlmZnV0aWxzIGRpZmZzdGF0IGdpdCBjcHAgZ2NjIGdjYy1jKysgZWdsaWJjLWRldmVsIHRleGluZm8gY2hycGF0aCBcCisgICAgIGNjYWNoZSI+Cis8IUVOVElUWSBPUEVOU1VTRV9IT1NUX1BBQ0tBR0VTX0VTU0VOVElBTCAicHl0aG9uIGdjYyBnY2MtYysrIGdpdCBjaHJwYXRoIG1ha2Ugd2dldCBweXRob24teG1sIFwKKyAgICAgZGlmZnN0YXQgdGV4aW5mbyBweXRob24tY3Vyc2VzIj4KKzwhRU5USVRZIENFTlRPU19IT1NUX1BBQ0tBR0VTX0VTU0VOVElBTCAiZ2F3ayBtYWtlIHdnZXQgdGFyIGJ6aXAyIGd6aXAgcHl0aG9uIHVuemlwIHBlcmwgcGF0Y2ggXAorICAgICBkaWZmdXRpbHMgZGlmZnN0YXQgZ2l0IGNwcCBnY2MgZ2NjLWMrKyBnbGliYy1kZXZlbCB0ZXhpbmZvIGNocnBhdGgiPgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9kb2MvdGVtcGxhdGUvVmVyYS50dGYgYi9iaXRiYWtlL2RvYy90ZW1wbGF0ZS9WZXJhLnR0ZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGNkNmI1Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9kb2MvdGVtcGxhdGUvVmVyYS50dGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9kb2MvdGVtcGxhdGUvVmVyYS54bWwgYi9iaXRiYWtlL2RvYy90ZW1wbGF0ZS9WZXJhLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzgyMDQzCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9kb2MvdGVtcGxhdGUvVmVyYS54bWwKQEAgLTAsMCArMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48Zm9udC1tZXRyaWNzIHR5cGU9IlRZUEUwIj48Zm9udC1uYW1lPkJpdHN0cmVhbVZlcmFTYW5zPC9mb250LW5hbWU+PGVtYmVkLz48Y2FwLWhlaWdodD43Mjk8L2NhcC1oZWlnaHQ+PHgtaGVpZ2h0PjU0NjwveC1oZWlnaHQ+PGFzY2VuZGVyPjkyODwvYXNjZW5kZXI+PGRlc2NlbmRlcj4tMjM1PC9kZXNjZW5kZXI+PGJib3g+PGxlZnQ+LTE4MzwvbGVmdD48Ym90dG9tPi0yMzU8L2JvdHRvbT48cmlnaHQ+MTI4NzwvcmlnaHQ+PHRvcD45Mjg8L3RvcD48L2Jib3g+PGZsYWdzPjMyPC9mbGFncz48c3RlbXY+MDwvc3RlbXY+PGl0YWxpY2FuZ2xlPjA8L2l0YWxpY2FuZ2xlPjxzdWJ0eXBlPlRZUEUwPC9zdWJ0eXBlPjxtdWx0aWJ5dGUtZXh0cmFzPjxjaWQtdHlwZT5DSURGb250VHlwZTI8L2NpZC10eXBlPjxkZWZhdWx0LXdpZHRoPjA8L2RlZmF1bHQtd2lkdGg+PGJmcmFuZ2VzPjxiZiBnaT0iMyIgdWU9IjEyNiIgdXM9IjMyIi8+PGJmIGdpPSIxNzIiIHVlPSIxNjAiIHVzPSIxNjAiLz48YmYgZ2k9IjE2MyIgdWU9IjE2MSIgdXM9IjE2MSIvPjxiZiBnaT0iMTMyIiB1ZT0iMTYzIiB1cz0iMTYyIi8+PGJmIGdpPSIxODkiIHVlPSIxNjQiIHVzPSIxNjQiLz48YmYgZ2k9IjE1MCIgdWU9IjE2NSIgdXM9IjE2NSIvPjxiZiBnaT0iMjMxIiB1ZT0iMTY2IiB1cz0iMTY2Ii8+PGJmIGdpPSIxMzQiIHVlPSIxNjciIHVzPSIxNjciLz48YmYgZ2k9IjE0MiIgdWU9IjE2OCIgdXM9IjE2OCIvPjxiZiBnaT0iMTM5IiB1ZT0iMTY5IiB1cz0iMTY5Ii8+PGJmIGdpPSIxNTciIHVlPSIxNzAiIHVzPSIxNzAiLz48YmYgZ2k9IjE2OSIgdWU9IjE3MSIgdXM9IjE3MSIvPjxiZiBnaT0iMTY0IiB1ZT0iMTcyIiB1cz0iMTcyIi8+PGJmIGdpPSIyNTYiIHVlPSIxNzMiIHVzPSIxNzMiLz48YmYgZ2k9IjEzOCIgdWU9IjE3NCIgdXM9IjE3NCIvPjxiZiBnaT0iMjE3IiB1ZT0iMTc1IiB1cz0iMTc1Ii8+PGJmIGdpPSIxMzEiIHVlPSIxNzYiIHVzPSIxNzYiLz48YmYgZ2k9IjE0NyIgdWU9IjE3NyIgdXM9IjE3NyIvPjxiZiBnaT0iMjQxIiB1ZT0iMTc5IiB1cz0iMTc4Ii8+PGJmIGdpPSIxNDEiIHVlPSIxODAiIHVzPSIxODAiLz48YmYgZ2k9IjE1MSIgdWU9IjE4MSIgdXM9IjE4MSIvPjxiZiBnaT0iMTM2IiB1ZT0iMTgyIiB1cz0iMTgyIi8+PGJmIGdpPSIxOTUiIHVlPSIxODMiIHVzPSIxODMiLz48YmYgZ2k9IjIyMSIgdWU9IjE4NCIgdXM9IjE4NCIvPjxiZiBnaT0iMjQwIiB1ZT0iMTg1IiB1cz0iMTg1Ii8+PGJmIGdpPSIxNTgiIHVlPSIxODYiIHVzPSIxODYiLz48YmYgZ2k9IjE3MCIgdWU9IjE4NyIgdXM9IjE4NyIvPjxiZiBnaT0iMjQzIiB1ZT0iMTkwIiB1cz0iMTg4Ii8+PGJmIGdpPSIxNjIiIHVlPSIxOTEiIHVzPSIxOTEiLz48YmYgZ2k9IjE3MyIgdWU9IjE5MiIgdXM9IjE5MiIvPjxiZiBnaT0iMjAxIiB1ZT0iMTkzIiB1cz0iMTkzIi8+PGJmIGdpPSIxOTkiIHVlPSIxOTQiIHVzPSIxOTQiLz48YmYgZ2k9IjE3NCIgdWU9IjE5NSIgdXM9IjE5NSIvPjxiZiBnaT0iOTgiIHVlPSIxOTciIHVzPSIxOTYiLz48YmYgZ2k9IjE0NCIgdWU9IjE5OCIgdXM9IjE5OCIvPjxiZiBnaT0iMTAwIiB1ZT0iMTk5IiB1cz0iMTk5Ii8+PGJmIGdpPSIyMDMiIHVlPSIyMDAiIHVzPSIyMDAiLz48YmYgZ2k9IjEwMSIgdWU9IjIwMSIgdXM9IjIwMSIvPjxiZiBnaT0iMjAwIiB1ZT0iMjAyIiB1cz0iMjAyIi8+PGJmIGdpPSIyMDIiIHVlPSIyMDMiIHVzPSIyMDMiLz48YmYgZ2k9IjIwNyIgdWU9IjIwNCIgdXM9IjIwNCIvPjxiZiBnaT0iMjA0IiB1ZT0iMjA3IiB1cz0iMjA1Ii8+PGJmIGdpPSIyMzIiIHVlPSIyMDgiIHVzPSIyMDgiLz48YmYgZ2k9IjEwMiIgdWU9IjIwOSIgdXM9IjIwOSIvPjxiZiBnaT0iMjEwIiB1ZT0iMjEwIiB1cz0iMjEwIi8+PGJmIGdpPSIyMDgiIHVlPSIyMTIiIHVzPSIyMTEiLz48YmYgZ2k9IjE3NSIgdWU9IjIxMyIgdXM9IjIxMyIvPjxiZiBnaT0iMTAzIiB1ZT0iMjE0IiB1cz0iMjE0Ii8+PGJmIGdpPSIyMzkiIHVlPSIyMTUiIHVzPSIyMTUiLz48YmYgZ2k9IjE0NSIgdWU9IjIxNiIgdXM9IjIxNiIvPjxiZiBnaT0iMjEzIiB1ZT0iMjE3IiB1cz0iMjE3Ii8+PGJmIGdpPSIyMTEiIHVlPSIyMTkiIHVzPSIyMTgiLz48YmYgZ2k9IjEwNCIgdWU9IjIyMCIgdXM9IjIyMCIvPjxiZiBnaT0iMjM0IiB1ZT0iMjIxIiB1cz0iMjIxIi8+PGJmIGdpPSIyMzYiIHVlPSIyMjIiIHVzPSIyMjIiLz48YmYgZ2k9IjEzNyIgdWU9IjIyMyIgdXM9IjIyMyIvPjxiZiBnaT0iMTA2IiB1ZT0iMjI0IiB1cz0iMjI0Ii8+PGJmIGdpPSIxMDUiIHVlPSIyMjUiIHVzPSIyMjUiLz48YmYgZ2k9IjEwNyIgdWU9IjIyNiIgdXM9IjIyNiIvPjxiZiBnaT0iMTA5IiB1ZT0iMjI3IiB1cz0iMjI3Ii8+PGJmIGdpPSIxMDgiIHVlPSIyMjgiIHVzPSIyMjgiLz48YmYgZ2k9IjExMCIgdWU9IjIyOSIgdXM9IjIyOSIvPjxiZiBnaT0iMTYwIiB1ZT0iMjMwIiB1cz0iMjMwIi8+PGJmIGdpPSIxMTEiIHVlPSIyMzEiIHVzPSIyMzEiLz48YmYgZ2k9IjExMyIgdWU9IjIzMiIgdXM9IjIzMiIvPjxiZiBnaT0iMTEyIiB1ZT0iMjMzIiB1cz0iMjMzIi8+PGJmIGdpPSIxMTQiIHVlPSIyMzUiIHVzPSIyMzQiLz48YmYgZ2k9IjExNyIgdWU9IjIzNiIgdXM9IjIzNiIvPjxiZiBnaT0iMTE2IiB1ZT0iMjM3IiB1cz0iMjM3Ii8+PGJmIGdpPSIxMTgiIHVlPSIyMzkiIHVzPSIyMzgiLz48YmYgZ2k9IjIzMyIgdWU9IjI0MCIgdXM9IjI0MCIvPjxiZiBnaT0iMTIwIiB1ZT0iMjQxIiB1cz0iMjQxIi8+PGJmIGdpPSIxMjIiIHVlPSIyNDIiIHVzPSIyNDIiLz48YmYgZ2k9IjEyMSIgdWU9IjI0MyIgdXM9IjI0MyIvPjxiZiBnaT0iMTIzIiB1ZT0iMjQ0IiB1cz0iMjQ0Ii8+PGJmIGdpPSIxMjUiIHVlPSIyNDUiIHVzPSIyNDUiLz48YmYgZ2k9IjEyNCIgdWU9IjI0NiIgdXM9IjI0NiIvPjxiZiBnaT0iMTg0IiB1ZT0iMjQ3IiB1cz0iMjQ3Ii8+PGJmIGdpPSIxNjEiIHVlPSIyNDgiIHVzPSIyNDgiLz48YmYgZ2k9IjEyNyIgdWU9IjI0OSIgdXM9IjI0OSIvPjxiZiBnaT0iMTI2IiB1ZT0iMjUwIiB1cz0iMjUwIi8+PGJmIGdpPSIxMjgiIHVlPSIyNTIiIHVzPSIyNTEiLz48YmYgZ2k9IjIzNSIgdWU9IjI1MyIgdXM9IjI1MyIvPjxiZiBnaT0iMjM3IiB1ZT0iMjU0IiB1cz0iMjU0Ii8+PGJmIGdpPSIxODYiIHVlPSIyNTUiIHVzPSIyNTUiLz48YmYgZ2k9IjI1MSIgdWU9IjI2MyIgdXM9IjI2MiIvPjxiZiBnaT0iMjUzIiB1ZT0iMjY5IiB1cz0iMjY4Ii8+PGJmIGdpPSIwIiB1ZT0iMjcwIiB1cz0iMjcwIi8+PGJmIGdpPSIwIiB1ZT0iMjcxIiB1cz0iMjcxIi8+PGJmIGdpPSIwIiB1ZT0iMjcyIiB1cz0iMjcyIi8+PGJmIGdpPSIyNTUiIHVlPSIyNzMiIHVzPSIyNzMiLz48YmYgZ2k9IjI0NiIgdWU9IjI4NyIgdXM9IjI4NiIvPjxiZiBnaT0iMjQ4IiB1ZT0iMzA0IiB1cz0iMzA0Ii8+PGJmIGdpPSIyMTQiIHVlPSIzMDUiIHVzPSIzMDUiLz48YmYgZ2k9IjIyNSIgdWU9IjMyMiIgdXM9IjMyMSIvPjxiZiBnaT0iMTc2IiB1ZT0iMzM5IiB1cz0iMzM4Ii8+PGJmIGdpPSIyNDkiIHVlPSIzNTEiIHVzPSIzNTAiLz48YmYgZ2k9IjIyNyIgdWU9IjM1MyIgdXM9IjM1MiIvPjxiZiBnaT0iMTg3IiB1ZT0iMzc2IiB1cz0iMzc2Ii8+PGJmIGdpPSIyMjkiIHVlPSIzODIiIHVzPSIzODEiLz48YmYgZ2k9IjE2NiIgdWU9IjQwMiIgdXM9IjQwMiIvPjxiZiBnaT0iMjE1IiB1ZT0iNzEwIiB1cz0iNzEwIi8+PGJmIGdpPSIyMjQiIHVlPSI3MTEiIHVzPSI3MTEiLz48YmYgZ2k9IjIxOCIgdWU9IjczMCIgdXM9IjcyOCIvPjxiZiBnaT0iMjIzIiB1ZT0iNzMxIiB1cz0iNzMxIi8+PGJmIGdpPSIyMTYiIHVlPSI3MzIiIHVzPSI3MzIiLz48YmYgZ2k9IjIyMiIgdWU9IjczMyIgdXM9IjczMyIvPjxiZiBnaT0iMTU5IiB1ZT0iOTM3IiB1cz0iOTM3Ii8+PGJmIGdpPSIxNTUiIHVlPSI5NjAiIHVzPSI5NjAiLz48YmYgZ2k9IjE3OCIgdWU9IjgyMTIiIHVzPSI4MjExIi8+PGJmIGdpPSIwIiB1ZT0iODIxMyIgdXM9IjgyMTMiLz48YmYgZ2k9IjAiIHVlPSI4MjE0IiB1cz0iODIxNCIvPjxiZiBnaT0iMCIgdWU9IjgyMTUiIHVzPSI4MjE1Ii8+PGJmIGdpPSIxODIiIHVlPSI4MjE3IiB1cz0iODIxNiIvPjxiZiBnaT0iMTk2IiB1ZT0iODIxOCIgdXM9IjgyMTgiLz48YmYgZ2k9IjAiIHVlPSI4MjE5IiB1cz0iODIxOSIvPjxiZiBnaT0iMTgwIiB1ZT0iODIyMSIgdXM9IjgyMjAiLz48YmYgZ2k9IjE5NyIgdWU9IjgyMjIiIHVzPSI4MjIyIi8+PGJmIGdpPSIwIiB1ZT0iODIyMyIgdXM9IjgyMjMiLz48YmYgZ2k9IjEzMCIgdWU9IjgyMjQiIHVzPSI4MjI0Ii8+PGJmIGdpPSIxOTQiIHVlPSI4MjI1IiB1cz0iODIyNSIvPjxiZiBnaT0iMTM1IiB1ZT0iODIyNiIgdXM9IjgyMjYiLz48YmYgZ2k9IjAiIHVlPSI4MjI3IiB1cz0iODIyNyIvPjxiZiBnaT0iMCIgdWU9IjgyMjgiIHVzPSI4MjI4Ii8+PGJmIGdpPSIwIiB1ZT0iODIyOSIgdXM9IjgyMjkiLz48YmYgZ2k9IjE3MSIgdWU9IjgyMzAiIHVzPSI4MjMwIi8+PGJmIGdpPSIxOTgiIHVlPSI4MjQwIiB1cz0iODI0MCIvPjxiZiBnaT0iMTkwIiB1ZT0iODI1MCIgdXM9IjgyNDkiLz48YmYgZ2k9IjI1OCIgdWU9IjgzNjQiIHVzPSI4MzY0Ii8+PGJmIGdpPSIxNDAiIHVlPSI4NDgyIiB1cz0iODQ4MiIvPjxiZiBnaT0iMTUyIiB1ZT0iODcwNiIgdXM9Ijg3MDYiLz48YmYgZ2k9IjAiIHVlPSI4NzA3IiB1cz0iODcwNyIvPjxiZiBnaT0iMCIgdWU9Ijg3MDgiIHVzPSI4NzA4Ii8+PGJmIGdpPSIwIiB1ZT0iODcwOSIgdXM9Ijg3MDkiLz48YmYgZ2k9IjE2OCIgdWU9Ijg3MTAiIHVzPSI4NzEwIi8+PGJmIGdpPSIxNTQiIHVlPSI4NzE5IiB1cz0iODcxOSIvPjxiZiBnaT0iMCIgdWU9Ijg3MjAiIHVzPSI4NzIwIi8+PGJmIGdpPSIxNTMiIHVlPSI4NzIxIiB1cz0iODcyMSIvPjxiZiBnaT0iMjM4IiB1ZT0iODcyMiIgdXM9Ijg3MjIiLz48YmYgZ2k9IjAiIHVlPSI4NzIzIiB1cz0iODcyMyIvPjxiZiBnaT0iMCIgdWU9Ijg3MjQiIHVzPSI4NzI0Ii8+PGJmIGdpPSIxODgiIHVlPSI4NzI1IiB1cz0iODcyNSIvPjxiZiBnaT0iMCIgdWU9Ijg3MjYiIHVzPSI4NzI2Ii8+PGJmIGdpPSIwIiB1ZT0iODcyNyIgdXM9Ijg3MjciLz48YmYgZ2k9IjAiIHVlPSI4NzI4IiB1cz0iODcyOCIvPjxiZiBnaT0iMjU3IiB1ZT0iODcyOSIgdXM9Ijg3MjkiLz48YmYgZ2k9IjE2NSIgdWU9Ijg3MzAiIHVzPSI4NzMwIi8+PGJmIGdpPSIwIiB1ZT0iODczMSIgdXM9Ijg3MzEiLz48YmYgZ2k9IjAiIHVlPSI4NzMyIiB1cz0iODczMiIvPjxiZiBnaT0iMCIgdWU9Ijg3MzMiIHVzPSI4NzMzIi8+PGJmIGdpPSIxNDYiIHVlPSI4NzM0IiB1cz0iODczNCIvPjxiZiBnaT0iMTU2IiB1ZT0iODc0NyIgdXM9Ijg3NDciLz48YmYgZ2k9IjE2NyIgdWU9Ijg3NzYiIHVzPSI4Nzc2Ii8+PGJmIGdpPSIxNDMiIHVlPSI4ODAwIiB1cz0iODgwMCIvPjxiZiBnaT0iMCIgdWU9Ijg4MDEiIHVzPSI4ODAxIi8+PGJmIGdpPSIwIiB1ZT0iODgwMiIgdXM9Ijg4MDIiLz48YmYgZ2k9IjAiIHVlPSI4ODAzIiB1cz0iODgwMyIvPjxiZiBnaT0iMTQ4IiB1ZT0iODgwNSIgdXM9Ijg4MDQiLz48YmYgZ2k9IjE4NSIgdWU9Ijk2NzQiIHVzPSI5Njc0Ii8+PGJmIGdpPSIxOTIiIHVlPSI2NDI1OCIgdXM9IjY0MjU3Ii8+PGJmIGdpPSIwIiB1ZT0iNjU1MzUiIHVzPSI2NTUzNSIvPjwvYmZyYW5nZXM+PGNpZC13aWR0aHMgc3RhcnQtaW5kZXg9IjAiPjx3eCB3PSI2MDAiLz48d3ggdz0iMCIvPjx3eCB3PSIzMTciLz48d3ggdz0iMzE3Ii8+PHd4IHc9IjQwMCIvPjx3eCB3PSI0NTkiLz48d3ggdz0iODM3Ii8+PHd4IHc9IjYzNiIvPjx3eCB3PSI5NTAiLz48d3ggdz0iNzc5Ii8+PHd4IHc9IjI3NCIvPjx3eCB3PSIzOTAiLz48d3ggdz0iMzkwIi8+PHd4IHc9IjUwMCIvPjx3eCB3PSI4MzciLz48d3ggdz0iMzE3Ii8+PHd4IHc9IjM2MCIvPjx3eCB3PSIzMTciLz48d3ggdz0iMzM2Ii8+PHd4IHc9IjYzNiIvPjx3eCB3PSI2MzYiLz48d3ggdz0iNjM2Ii8+PHd4IHc9IjYzNiIvPjx3eCB3PSI2MzYiLz48d3ggdz0iNjM2Ii8+PHd4IHc9IjYzNiIvPjx3eCB3PSI2MzYiLz48d3ggdz0iNjM2Ii8+PHd4IHc9IjYzNiIvPjx3eCB3PSIzMzYiLz48d3ggdz0iMzM2Ii8+PHd4IHc9IjgzNyIvPjx3eCB3PSI4MzciLz48d3ggdz0iODM3Ii8+PHd4IHc9IjUzMCIvPjx3eCB3PSIxMDAwIi8+PHd4IHc9IjY4NCIvPjx3eCB3PSI2ODYiLz48d3ggdz0iNjk4Ii8+PHd4IHc9Ijc3MCIvPjx3eCB3PSI2MzEiLz48d3ggdz0iNTc1Ii8+PHd4IHc9Ijc3NCIvPjx3eCB3PSI3NTEiLz48d3ggdz0iMjk0Ii8+PHd4IHc9IjI5NCIvPjx3eCB3PSI2NTUiLz48d3ggdz0iNTU3Ii8+PHd4IHc9Ijg2MiIvPjx3eCB3PSI3NDgiLz48d3ggdz0iNzg3Ii8+PHd4IHc9IjYwMyIvPjx3eCB3PSI3ODciLz48d3ggdz0iNjk0Ii8+PHd4IHc9IjYzNCIvPjx3eCB3PSI2MTAiLz48d3ggdz0iNzMxIi8+PHd4IHc9IjY4NCIvPjx3eCB3PSI5ODgiLz48d3ggdz0iNjg1Ii8+PHd4IHc9IjYxMCIvPjx3eCB3PSI2ODUiLz48d3ggdz0iMzkwIi8+PHd4IHc9IjMzNiIvPjx3eCB3PSIzOTAiLz48d3ggdz0iODM3Ii8+PHd4IHc9IjUwMCIvPjx3eCB3PSI1MDAiLz48d3ggdz0iNjEyIi8+PHd4IHc9IjYzNCIvPjx3eCB3PSI1NDkiLz48d3ggdz0iNjM0Ii8+PHd4IHc9IjYxNSIvPjx3eCB3PSIzNTIiLz48d3ggdz0iNjM0Ii8+PHd4IHc9IjYzMyIvPjx3eCB3PSIyNzciLz48d3ggdz0iMjc3Ii8+PHd4IHc9IjU3OSIvPjx3eCB3PSIyNzciLz48d3ggdz0iOTc0Ii8+PHd4IHc9IjYzMyIvPjx3eCB3PSI2MTEiLz48d3ggdz0iNjM0Ii8+PHd4IHc9IjYzNCIvPjx3eCB3PSI0MTEiLz48d3ggdz0iNTIwIi8+PHd4IHc9IjM5MiIvPjx3eCB3PSI2MzMiLz48d3ggdz0iNTkxIi8+PHd4IHc9IjgxNyIvPjx3eCB3PSI1OTEiLz48d3ggdz0iNTkxIi8+PHd4IHc9IjUyNCIvPjx3eCB3PSI2MzYiLz48d3ggdz0iMzM2Ii8+PHd4IHc9IjYzNiIvPjx3eCB3PSI4MzciLz48d3ggdz0iNjg0Ii8+PHd4IHc9IjY4NCIvPjx3eCB3PSI2OTgiLz48d3ggdz0iNjMxIi8+PHd4IHc9Ijc0OCIvPjx3eCB3PSI3ODciLz48d3ggdz0iNzMxIi8+PHd4IHc9IjYxMiIvPjx3eCB3PSI2MTIiLz48d3ggdz0iNjEyIi8+PHd4IHc9IjYxMiIvPjx3eCB3PSI2MTIiLz48d3ggdz0iNjEyIi8+PHd4IHc9IjU0OSIvPjx3eCB3PSI2MTUiLz48d3ggdz0iNjE1Ii8+PHd4IHc9IjYxNSIvPjx3eCB3PSI2MTUiLz48d3ggdz0iMjc3Ii8+PHd4IHc9IjI3NyIvPjx3eCB3PSIyNzciLz48d3ggdz0iMjc3Ii8+PHd4IHc9IjYzMyIvPjx3eCB3PSI2MTEiLz48d3ggdz0iNjExIi8+PHd4IHc9IjYxMSIvPjx3eCB3PSI2MTEiLz48d3ggdz0iNjExIi8+PHd4IHc9IjYzMyIvPjx3eCB3PSI2MzMiLz48d3ggdz0iNjMzIi8+PHd4IHc9IjYzMyIvPjx3eCB3PSI1MDAiLz48d3ggdz0iNTAwIi8+PHd4IHc9IjYzNiIvPjx3eCB3PSI2MzYiLz48d3ggdz0iNTAwIi8+PHd4IHc9IjU4OSIvPjx3eCB3PSI2MzYiLz48d3ggdz0iNjI5Ii8+PHd4IHc9IjEwMDAiLz48d3ggdz0iMTAwMCIvPjx3eCB3PSIxMDAwIi8+PHd4IHc9IjUwMCIvPjx3eCB3PSI1MDAiLz48d3ggdz0iODM3Ii8+PHd4IHc9Ijk3NCIvPjx3eCB3PSI3ODciLz48d3ggdz0iODMzIi8+PHd4IHc9IjgzNyIvPjx3eCB3PSI4MzciLz48d3ggdz0iODM3Ii8+PHd4IHc9IjYzNiIvPjx3eCB3PSI2MzYiLz48d3ggdz0iNTE3Ii8+PHd4IHc9IjY3MyIvPjx3eCB3PSI3NTYiLz48d3ggdz0iNTg4Ii8+PHd4IHc9IjUyMCIvPjx3eCB3PSI0NzEiLz48d3ggdz0iNDcxIi8+PHd4IHc9Ijc2NCIvPjx3eCB3PSI5ODEiLz48d3ggdz0iNjExIi8+PHd4IHc9IjUzMCIvPjx3eCB3PSI0MDAiLz48d3ggdz0iODM3Ii8+PHd4IHc9IjYzNyIvPjx3eCB3PSI2MzYiLz48d3ggdz0iODM3Ii8+PHd4IHc9IjY2OCIvPjx3eCB3PSI2MTEiLz48d3ggdz0iNjExIi8+PHd4IHc9IjEwMDAiLz48d3ggdz0iNjM2Ii8+PHd4IHc9IjY4NCIvPjx3eCB3PSI2ODQiLz48d3ggdz0iNzg3Ii8+PHd4IHc9IjEwNjkiLz48d3ggdz0iMTAyMiIvPjx3eCB3PSI1MDAiLz48d3ggdz0iMTAwMCIvPjx3eCB3PSI1MTgiLz48d3ggdz0iNTE4Ii8+PHd4IHc9IjMxNyIvPjx3eCB3PSIzMTciLz48d3ggdz0iODM3Ii8+PHd4IHc9IjQ5NCIvPjx3eCB3PSI1OTEiLz48d3ggdz0iNjEwIi8+PHd4IHc9IjE2NiIvPjx3eCB3PSI2MzYiLz48d3ggdz0iMzk5Ii8+PHd4IHc9IjM5OSIvPjx3eCB3PSI2MjkiLz48d3ggdz0iNjI5Ii8+PHd4IHc9IjUwMCIvPjx3eCB3PSIzMTciLz48d3ggdz0iMzE3Ii8+PHd4IHc9IjUxOCIvPjx3eCB3PSIxMzQxIi8+PHd4IHc9IjY4NCIvPjx3eCB3PSI2MzEiLz48d3ggdz0iNjg0Ii8+PHd4IHc9IjYzMSIvPjx3eCB3PSI2MzEiLz48d3ggdz0iMjk0Ii8+PHd4IHc9IjI5NCIvPjx3eCB3PSIyOTQiLz48d3ggdz0iMjk0Ii8+PHd4IHc9Ijc4NyIvPjx3eCB3PSI3ODciLz48d3ggdz0iNzg3Ii8+PHd4IHc9IjczMSIvPjx3eCB3PSI3MzEiLz48d3ggdz0iNzMxIi8+PHd4IHc9IjI3NyIvPjx3eCB3PSI1MDAiLz48d3ggdz0iNTAwIi8+PHd4IHc9IjUwMCIvPjx3eCB3PSI1MDAiLz48d3ggdz0iNTAwIi8+PHd4IHc9IjUwMCIvPjx3eCB3PSI1MDAiLz48d3ggdz0iNTAwIi8+PHd4IHc9IjUwMCIvPjx3eCB3PSI1MDAiLz48d3ggdz0iNTYyIi8+PHd4IHc9IjI4NCIvPjx3eCB3PSI2MzQiLz48d3ggdz0iNTIwIi8+PHd4IHc9IjY4NSIvPjx3eCB3PSI1MjQiLz48d3ggdz0iMzM2Ii8+PHd4IHc9Ijc3NCIvPjx3eCB3PSI2MTEiLz48d3ggdz0iNjEwIi8+PHd4IHc9IjU5MSIvPjx3eCB3PSI2MDQiLz48d3ggdz0iNjM0Ii8+PHd4IHc9IjgzNyIvPjx3eCB3PSI4MzciLz48d3ggdz0iNDAwIi8+PHd4IHc9IjQwMCIvPjx3eCB3PSI0MDAiLz48d3ggdz0iOTY5Ii8+PHd4IHc9Ijk2OSIvPjx3eCB3PSI5NjkiLz48d3ggdz0iNzc0Ii8+PHd4IHc9IjYzNCIvPjx3eCB3PSIyOTQiLz48d3ggdz0iNjM0Ii8+PHd4IHc9IjUyMCIvPjx3eCB3PSI2OTgiLz48d3ggdz0iNTQ5Ii8+PHd4IHc9IjY5OCIvPjx3eCB3PSI1NDkiLz48d3ggdz0iNjM0Ii8+PHd4IHc9IjM2MCIvPjx3eCB3PSIzMTciLz48d3ggdz0iNjM2Ii8+PHd4IHc9IjUwMCIvPjx3eCB3PSI1MDAiLz48d3ggdz0iNTAwIi8+PHd4IHc9IjUwMCIvPjx3eCB3PSI1MDAiLz48d3ggdz0iNTAwIi8+PHd4IHc9IjQwMCIvPjx3eCB3PSI1MDAiLz48d3ggdz0iNTAwIi8+PC9jaWQtd2lkdGhzPjwvbXVsdGlieXRlLWV4dHJhcz48a2VybmluZyBrcHgxPSIyNDYiPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iMTgwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNjkiLz48cGFpciBrZXJuPSItMjYiIGtweDI9IjE5NyIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iNTUiLz48cGFpciBrZXJuPSItNDkiIGtweDI9IjYwIi8+PHBhaXIga2Vybj0iLTQ5IiBrcHgyPSIxODciLz48cGFpciBrZXJuPSItMjEiIGtweDI9IjE4MSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTcwIi8+PHBhaXIga2Vybj0iLTQ5IiBrcHgyPSIyMzQiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iMjM1Ij48cGFpciBrZXJuPSItMTQyIiBrcHgyPSIxNyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTY5Ii8+PHBhaXIga2Vybj0iLTE0NiIga3B4Mj0iMTk3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNiIvPjxwYWlyIGtlcm49Ii03MiIga3B4Mj0iMjkiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3MCIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSI0MyI+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxODAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxOTciLz48cGFpciBrZXJuPSItMzAiIGtweDI9IjE4MSIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSIxNiI+PHBhaXIga2Vybj0iMzYiIGtweDI9IjI0NiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjM1Ii8+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSIxOTkiLz48cGFpciBrZXJuPSIxOCIga3B4Mj0iMTIzIi8+PHBhaXIga2Vybj0iMjciIGtweDI9IjIwOCIvPjxwYWlyIGtlcm49Ii0xMTgiIGtweDI9IjE4NyIvPjxwYWlyIGtlcm49Ii00OSIga3B4Mj0iNTkiLz48cGFpciBrZXJuPSIxOCIga3B4Mj0iMTI0Ii8+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSIyMDEiLz48cGFpciBrZXJuPSItMTE4IiBrcHgyPSI2MCIvPjxwYWlyIGtlcm49IjM2IiBrcHgyPSI1MiIvPjxwYWlyIGtlcm49IjE4IiBrcHgyPSIxMjUiLz48cGFpciBrZXJuPSIzNiIga3B4Mj0iNDIiLz48cGFpciBrZXJuPSItMTE4IiBrcHgyPSIyMzQiLz48cGFpciBrZXJuPSIxOCIga3B4Mj0iMTIyIi8+PHBhaXIga2Vybj0iMjciIGtweDI9IjIxMCIvPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iMzYiLz48cGFpciBrZXJuPSIxOCIga3B4Mj0iODIiLz48cGFpciBrZXJuPSItNDAiIGtweDI9IjU4Ii8+PHBhaXIga2Vybj0iLTkxIiBrcHgyPSI1NSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTg2Ii8+PHBhaXIga2Vybj0iMjciIGtweDI9IjE3NSIvPjxwYWlyIGtlcm49IjI3IiBrcHgyPSI1MCIvPjxwYWlyIGtlcm49IjI3IiBrcHgyPSIyMDkiLz48cGFpciBrZXJuPSIyNyIga3B4Mj0iMTAzIi8+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSI5OCIvPjxwYWlyIGtlcm49IjU1IiBrcHgyPSI0NSIvPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iMTczIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI5MiIvPjxwYWlyIGtlcm49Ii0yNiIga3B4Mj0iODkiLz48cGFpciBrZXJuPSIxOCIga3B4Mj0iMTIxIi8+PHBhaXIga2Vybj0iLTU4IiBrcHgyPSI1NyIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMzciLz48cGFpciBrZXJuPSItMjEiIGtweDI9IjE3NCIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSIxMTIiPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iOTEiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iMTIzIj48cGFpciBrZXJuPSItNzIiIGtweDI9IjE4MCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTciLz48cGFpciBrZXJuPSItNjMiIGtweDI9IjE5NyIvPjxwYWlyIGtlcm49IjE4IiBrcHgyPSIxNiIvPjxwYWlyIGtlcm49Ii0zMCIga3B4Mj0iOTEiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjE4MSIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSIyNTEiPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTY5Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI2MCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTg3Ii8+PHBhaXIga2Vybj0iMTgiIGtweDI9IjE4MSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTcwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyMzQiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iMjEzIj48cGFpciBrZXJuPSItMTciIGtweDI9IjIyOSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNjEiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iMjA4Ij48cGFpciBrZXJuPSItMTciIGtweDI9IjM2Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxOTkiLz48cGFpciBrZXJuPSIyNyIga3B4Mj0iMTYiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjE4NyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iOTgiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE4MSIvPjxwYWlyIGtlcm49Ii02MyIga3B4Mj0iNTkiLz48cGFpciBrZXJuPSItNDAiIGtweDI9IjE3Ii8+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSIxODAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3MyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTY5Ii8+PHBhaXIga2Vybj0iLTkxIiBrcHgyPSIxOTciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjIwMSIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iNjAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI5Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI1NyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTc0Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIyMzQiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iMTg3Ij48cGFpciBrZXJuPSItMTE0IiBrcHgyPSIxMjYiLz48cGFpciBrZXJuPSItMTM3IiBrcHgyPSIxMDciLz48cGFpciBrZXJuPSItMTMyIiBrcHgyPSI3MiIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iMTk5Ii8+PHBhaXIga2Vybj0iLTExOCIga3B4Mj0iMTYiLz48cGFpciBrZXJuPSItMTMyIiBrcHgyPSIxMjMiLz48cGFpciBrZXJuPSItMTMyIiBrcHgyPSIxMTIiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjI1MSIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMjA4Ii8+PHBhaXIga2Vybj0iLTEzMiIga3B4Mj0iMTEzIi8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxODAiLz48cGFpciBrZXJuPSItMTM3IiBrcHgyPSIxMDUiLz48cGFpciBrZXJuPSItMTE0IiBrcHgyPSIxMjkiLz48cGFpciBrZXJuPSItMTMyIiBrcHgyPSIxMjQiLz48cGFpciBrZXJuPSItMTA5IiBrcHgyPSIxNjkiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjIwMSIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMjUzIi8+PHBhaXIga2Vybj0iLTEzNyIga3B4Mj0iMTA2Ii8+PHBhaXIga2Vybj0iLTEzMiIga3B4Mj0iMjkiLz48cGFpciBrZXJuPSItMTMyIiBrcHgyPSIxMjUiLz48cGFpciBrZXJuPSItNzIiIGtweDI9IjE3MCIvPjxwYWlyIGtlcm49Ii0xMzIiIGtweDI9IjExNSIvPjxwYWlyIGtlcm49Ii0xMTQiIGtweDI9Ijg4Ii8+PHBhaXIga2Vybj0iLTEzMiIga3B4Mj0iMTIyIi8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxMDAiLz48cGFpciBrZXJuPSItMTM3IiBrcHgyPSI2OCIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMjEwIi8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSIzNiIvPjxwYWlyIGtlcm49Ii0xMzIiIGtweDI9IjgyIi8+PHBhaXIga2Vybj0iLTEzMiIga3B4Mj0iMTE0Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxNzUiLz48cGFpciBrZXJuPSItMTE0IiBrcHgyPSIxMjciLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjUwIi8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIyMDkiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjEwMyIvPjxwYWlyIGtlcm49Ii0xMzciIGtweDI9IjEwOCIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iOTgiLz48cGFpciBrZXJuPSItMzUiIGtweDI9Ijc2Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxODEiLz48cGFpciBrZXJuPSItMjAyIiBrcHgyPSIxNyIvPjxwYWlyIGtlcm49Ii0xMTQiIGtweDI9IjEyOCIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iMTczIi8+PHBhaXIga2Vybj0iLTEzNyIga3B4Mj0iMTA5Ii8+PHBhaXIga2Vybj0iLTEyOCIga3B4Mj0iMTk3Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIzOCIvPjxwYWlyIGtlcm49Ii0xMzIiIGtweDI9IjEyMSIvPjxwYWlyIGtlcm49Ii0xMzciIGtweDI9IjExMCIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iMTc0Ii8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjExMyI+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI5MSIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSIxNDQiPjxwYWlyIGtlcm49Ii00MCIga3B4Mj0iMTgwIi8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxOTciLz48cGFpciBrZXJuPSItNDQiIGtweDI9IjE4MSIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSI1OSI+PHBhaXIga2Vybj0iLTcyIiBrcHgyPSIxMDAiLz48cGFpciBrZXJuPSItNjMiIGtweDI9IjIxMCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNTUiLz48cGFpciBrZXJuPSItNDQiIGtweDI9IjExNCIvPjxwYWlyIGtlcm49Ii00NCIga3B4Mj0iNzIiLz48cGFpciBrZXJuPSItNjMiIGtweDI9IjE3NSIvPjxwYWlyIGtlcm49Ii00OSIga3B4Mj0iMTYiLz48cGFpciBrZXJuPSItNjMiIGtweDI9IjUwIi8+PHBhaXIga2Vybj0iLTYzIiBrcHgyPSIyMDkiLz48cGFpciBrZXJuPSItNDQiIGtweDI9IjExMiIvPjxwYWlyIGtlcm49Ii03MiIga3B4Mj0iMjUxIi8+PHBhaXIga2Vybj0iLTYzIiBrcHgyPSIxMDMiLz48cGFpciBrZXJuPSItNjMiIGtweDI9IjIwOCIvPjxwYWlyIGtlcm49Ii00NCIga3B4Mj0iMTEzIi8+PHBhaXIga2Vybj0iLTQwIiBrcHgyPSIxODEiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjE4MCIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMTY5Ii8+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSIxOTciLz48cGFpciBrZXJuPSItNzIiIGtweDI9IjM4Ii8+PHBhaXIga2Vybj0iLTcyIiBrcHgyPSIyNTMiLz48cGFpciBrZXJuPSItNDQiIGtweDI9IjExNSIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSI3MyI+PHBhaXIga2Vybj0iMzEiIGtweDI9IjE4MCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iOTAiLz48cGFpciBrZXJuPSItNzIiIGtweDI9IjE3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyMzUiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjE2OSIvPjxwYWlyIGtlcm49Ii0xMTQiIGtweDI9IjE5NyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTg2Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI5MiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iODciLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjE2Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIyOSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTcwIi8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjQxIj48cGFpciBrZXJuPSItMTciIGtweDI9IjIyNyIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMTI2Ii8+PHBhaXIga2Vybj0iLTkxIiBrcHgyPSIxMDciLz48cGFpciBrZXJuPSItOTEiIGtweDI9IjIzNSIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iNzIiLz48cGFpciBrZXJuPSItOTEiIGtweDI9IjE5OSIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTIzIi8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxMTIiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjExMyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNTQiLz48cGFpciBrZXJuPSItMjEiIGtweDI9IjE4MCIvPjxwYWlyIGtlcm49Ii05MSIga3B4Mj0iMTA1Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxMjkiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjEyNCIvPjxwYWlyIGtlcm49Ii05MSIga3B4Mj0iMjAxIi8+PHBhaXIga2Vybj0iLTcyIiBrcHgyPSI4NSIvPjxwYWlyIGtlcm49Ii05MSIga3B4Mj0iMTA2Ii8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSIyOSIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTI1Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxMTUiLz48cGFpciBrZXJuPSItNTQiIGtweDI9Ijg4Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxMjIiLz48cGFpciBrZXJuPSItOTEiIGtweDI9IjY4Ii8+PHBhaXIga2Vybj0iLTkxIiBrcHgyPSIzNiIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iODIiLz48cGFpciBrZXJuPSItOTEiIGtweDI9IjE4NiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNTUiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjExNCIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMTI3Ii8+PHBhaXIga2Vybj0iLTkxIiBrcHgyPSIxMDgiLz48cGFpciBrZXJuPSItOTEiIGtweDI9Ijk4Ii8+PHBhaXIga2Vybj0iLTcyIiBrcHgyPSI3NiIvPjxwYWlyIGtlcm49Ii0xNjAiIGtweDI9IjE3Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxMjgiLz48cGFpciBrZXJuPSItOTEiIGtweDI9IjE3MyIvPjxwYWlyIGtlcm49Ii05MSIga3B4Mj0iMTA5Ii8+PHBhaXIga2Vybj0iLTE4MyIga3B4Mj0iMTk3Ii8+PHBhaXIga2Vybj0iLTkxIiBrcHgyPSI5MiIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTIxIi8+PHBhaXIga2Vybj0iLTkxIiBrcHgyPSIxMTAiLz48cGFpciBrZXJuPSItOTEiIGtweDI9IjE3NCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjQ5Ii8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjEyNCI+PHBhaXIga2Vybj0iLTcyIiBrcHgyPSIxODAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3Ii8+PHBhaXIga2Vybj0iLTYzIiBrcHgyPSIxOTciLz48cGFpciBrZXJuPSIxOCIga3B4Mj0iMTYiLz48cGFpciBrZXJuPSItMzAiIGtweDI9IjkxIi8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxODEiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iMTY5Ij48cGFpciBrZXJuPSItMTciIGtweDI9IjkwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMDAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI0NiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjM1Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI1OCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTg2Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSI1NSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjUxIi8+PHBhaXIga2Vybj0iLTcyIiBrcHgyPSIxODciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjM5Ii8+PHBhaXIga2Vybj0iNzMiIGtweDI9IjE0NCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNDUiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjkyIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIzOCIvPjxwYWlyIGtlcm49Ii03MiIga3B4Mj0iNjAiLz48cGFpciBrZXJuPSItMTciIGtweDI9Ijg5Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyNTMiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjU3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIzNyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNDIiLz48cGFpciBrZXJuPSItNzIiIGtweDI9IjIzNCIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSIyMDEiPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjQ2Ii8+PHBhaXIga2Vybj0iLTY3IiBrcHgyPSIyMzUiLz48cGFpciBrZXJuPSItMjEiIGtweDI9IjE2Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMTIiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEyMyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjUxIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMTMiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjE4NyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjA4Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSI3MyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTI0Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxNjkiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI1MiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNzAiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjYwIi8+PHBhaXIga2Vybj0iMjciIGtweDI9IjIwMSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjkiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjIzNCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTAwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMjIiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjIxMCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iODIiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjU4Ii8+PHBhaXIga2Vybj0iLTY3IiBrcHgyPSIxODYiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3NSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjA5Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMDMiLz48cGFpciBrZXJuPSIyNyIga3B4Mj0iOTgiLz48cGFpciBrZXJuPSItMTIzIiBrcHgyPSIxODEiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIzOCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iODQiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEyMSIvPjxwYWlyIGtlcm49Ii02MyIga3B4Mj0iNTciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI1NCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iODciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjcyIi8+PHBhaXIga2Vybj0iMjciIGtweDI9IjE5OSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNzEiLz48cGFpciBrZXJuPSItMTI4IiBrcHgyPSIxODAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI1MyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNTIiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEyNSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNDIiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjExNSIvPjxwYWlyIGtlcm49Ii00MCIga3B4Mj0iOTAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjExMSIvPjxwYWlyIGtlcm49IjI3IiBrcHgyPSIzNiIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iNTUiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjExNCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNTAiLz48cGFpciBrZXJuPSIyNyIga3B4Mj0iMTczIi8+PHBhaXIga2Vybj0iLTY3IiBrcHgyPSI5MiIvPjxwYWlyIGtlcm49IjIyIiBrcHgyPSIxOTciLz48cGFpciBrZXJuPSItNTgiIGtweDI9Ijg5Ii8+PHBhaXIga2Vybj0iMjciIGtweDI9IjE3NCIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSI2MCI+PHBhaXIga2Vybj0iLTExNCIga3B4Mj0iMTI2Ii8+PHBhaXIga2Vybj0iLTEzNyIga3B4Mj0iMTA3Ii8+PHBhaXIga2Vybj0iLTEzMiIga3B4Mj0iNzIiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjE5OSIvPjxwYWlyIGtlcm49Ii0xMTgiIGtweDI9IjE2Ii8+PHBhaXIga2Vybj0iLTEzMiIga3B4Mj0iMTIzIi8+PHBhaXIga2Vybj0iLTEzMiIga3B4Mj0iMTEyIi8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIyNTEiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjIwOCIvPjxwYWlyIGtlcm49Ii0xMzIiIGtweDI9IjExMyIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMTgwIi8+PHBhaXIga2Vybj0iLTEzNyIga3B4Mj0iMTA1Ii8+PHBhaXIga2Vybj0iLTExNCIga3B4Mj0iMTI5Ii8+PHBhaXIga2Vybj0iLTEzMiIga3B4Mj0iMTI0Ii8+PHBhaXIga2Vybj0iLTEwOSIga3B4Mj0iMTY5Ii8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSIyMDEiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjI1MyIvPjxwYWlyIGtlcm49Ii0xMzciIGtweDI9IjEwNiIvPjxwYWlyIGtlcm49Ii0xMzIiIGtweDI9IjI5Ii8+PHBhaXIga2Vybj0iLTEzMiIga3B4Mj0iMTI1Ii8+PHBhaXIga2Vybj0iLTcyIiBrcHgyPSIxNzAiLz48cGFpciBrZXJuPSItMTMyIiBrcHgyPSIxMTUiLz48cGFpciBrZXJuPSItMTE0IiBrcHgyPSI4OCIvPjxwYWlyIGtlcm49Ii0xMzIiIGtweDI9IjEyMiIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMTAwIi8+PHBhaXIga2Vybj0iLTEzNyIga3B4Mj0iNjgiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjIxMCIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iMzYiLz48cGFpciBrZXJuPSItMTMyIiBrcHgyPSI4MiIvPjxwYWlyIGtlcm49Ii0xMzIiIGtweDI9IjExNCIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMTc1Ii8+PHBhaXIga2Vybj0iLTExNCIga3B4Mj0iMTI3Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSI1MCIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMjA5Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxMDMiLz48cGFpciBrZXJuPSItMTM3IiBrcHgyPSIxMDgiLz48cGFpciBrZXJuPSItNzciIGtweDI9Ijk4Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSI3NiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTgxIi8+PHBhaXIga2Vybj0iLTIwMiIga3B4Mj0iMTciLz48cGFpciBrZXJuPSItMTE0IiBrcHgyPSIxMjgiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjE3MyIvPjxwYWlyIGtlcm49Ii0xMzciIGtweDI9IjEwOSIvPjxwYWlyIGtlcm49Ii0xMjgiIGtweDI9IjE5NyIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMzgiLz48cGFpciBrZXJuPSItMTMyIiBrcHgyPSIxMjEiLz48cGFpciBrZXJuPSItMTM3IiBrcHgyPSIxMTAiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjE3NCIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSI4NSI+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSIyNTQiLz48cGFpciBrZXJuPSItMjEiIGtweDI9IjcyIi8+PHBhaXIga2Vybj0iLTYzIiBrcHgyPSIxNiIvPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iMTEyIi8+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSIxMjMiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjgwIi8+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSIxMTMiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjcxIi8+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSIxMjQiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjE2OSIvPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iMjUyIi8+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSI3MCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iODUiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI5Ii8+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSIxMjUiLz48cGFpciBrZXJuPSItMjEiIGtweDI9IjExNSIvPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iMTExIi8+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSIxMjIiLz48cGFpciBrZXJuPSItMjEiIGtweDI9IjgyIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI3NSIvPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iMTE0Ii8+PHBhaXIga2Vybj0iLTI2IiBrcHgyPSI5MSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iODEiLz48cGFpciBrZXJuPSI0MSIga3B4Mj0iMTgxIi8+PHBhaXIga2Vybj0iLTkxIiBrcHgyPSIxNyIvPjxwYWlyIGtlcm49Ii0xNTEiIGtweDI9IjE5NyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNzQiLz48cGFpciBrZXJuPSItMTciIGtweDI9Ijg0Ii8+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSIxMjEiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI0NyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTIwIi8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjYxIj48cGFpciBrZXJuPSItMTciIGtweDI9IjE4MCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTk3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTgxIi8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjIzNCI+PHBhaXIga2Vybj0iLTExNCIga3B4Mj0iMTI2Ii8+PHBhaXIga2Vybj0iLTEzNyIga3B4Mj0iMTA3Ii8+PHBhaXIga2Vybj0iLTEzMiIga3B4Mj0iNzIiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjE5OSIvPjxwYWlyIGtlcm49Ii0xMTgiIGtweDI9IjE2Ii8+PHBhaXIga2Vybj0iLTEzMiIga3B4Mj0iMTIzIi8+PHBhaXIga2Vybj0iLTEzMiIga3B4Mj0iMTEyIi8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIyNTEiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjIwOCIvPjxwYWlyIGtlcm49Ii0xMzIiIGtweDI9IjExMyIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMTgwIi8+PHBhaXIga2Vybj0iLTEzNyIga3B4Mj0iMTA1Ii8+PHBhaXIga2Vybj0iLTExNCIga3B4Mj0iMTI5Ii8+PHBhaXIga2Vybj0iLTEzMiIga3B4Mj0iMTI0Ii8+PHBhaXIga2Vybj0iLTEwOSIga3B4Mj0iMTY5Ii8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSIyMDEiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjI1MyIvPjxwYWlyIGtlcm49Ii0xMzciIGtweDI9IjEwNiIvPjxwYWlyIGtlcm49Ii0xMzIiIGtweDI9IjI5Ii8+PHBhaXIga2Vybj0iLTEzMiIga3B4Mj0iMTI1Ii8+PHBhaXIga2Vybj0iLTcyIiBrcHgyPSIxNzAiLz48cGFpciBrZXJuPSItMTMyIiBrcHgyPSIxMTUiLz48cGFpciBrZXJuPSItMTE0IiBrcHgyPSI4OCIvPjxwYWlyIGtlcm49Ii0xMzIiIGtweDI9IjEyMiIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMTAwIi8+PHBhaXIga2Vybj0iLTEzNyIga3B4Mj0iNjgiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjIxMCIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iMzYiLz48cGFpciBrZXJuPSItMTMyIiBrcHgyPSI4MiIvPjxwYWlyIGtlcm49Ii0xMzIiIGtweDI9IjExNCIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMTc1Ii8+PHBhaXIga2Vybj0iLTExNCIga3B4Mj0iMTI3Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSI1MCIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMjA5Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxMDMiLz48cGFpciBrZXJuPSItMTM3IiBrcHgyPSIxMDgiLz48cGFpciBrZXJuPSItNzciIGtweDI9Ijk4Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSI3NiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTgxIi8+PHBhaXIga2Vybj0iLTIwMiIga3B4Mj0iMTciLz48cGFpciBrZXJuPSItMTE0IiBrcHgyPSIxMjgiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjE3MyIvPjxwYWlyIGtlcm49Ii0xMzciIGtweDI9IjEwOSIvPjxwYWlyIGtlcm49Ii0xMjgiIGtweDI9IjE5NyIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMzgiLz48cGFpciBrZXJuPSItMTMyIiBrcHgyPSIxMjEiLz48cGFpciBrZXJuPSItMTM3IiBrcHgyPSIxMTAiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjE3NCIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSIxMDAiPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTY5Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI2MCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTg3Ii8+PHBhaXIga2Vybj0iMTgiIGtweDI9IjE4MSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTcwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyMzQiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iMTIyIj48cGFpciBrZXJuPSItNzIiIGtweDI9IjE4MCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTciLz48cGFpciBrZXJuPSItNjMiIGtweDI9IjE5NyIvPjxwYWlyIGtlcm49IjE4IiBrcHgyPSIxNiIvPjxwYWlyIGtlcm49Ii0zMCIga3B4Mj0iOTEiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjE4MSIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSI0NyI+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMjYiLz48cGFpciBrZXJuPSItOTEiIGtweDI9IjIzNSIvPjxwYWlyIGtlcm49Ii00OSIga3B4Mj0iMTA0Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI3MiIvPjxwYWlyIGtlcm49IjIyIiBrcHgyPSIxOTkiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE2Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMTIiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEyMyIvPjxwYWlyIGtlcm49Ii00OSIga3B4Mj0iMjEzIi8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIyMDgiLz48cGFpciBrZXJuPSItMTMyIiBrcHgyPSIxODciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjExMyIvPjxwYWlyIGtlcm49Ii0yMDIiIGtweDI9IjE4MCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTI5Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMjQiLz48cGFpciBrZXJuPSIyMiIga3B4Mj0iMjAxIi8+PHBhaXIga2Vybj0iLTEzMiIga3B4Mj0iNjAiLz48cGFpciBrZXJuPSItNDkiIGtweDI9IjIxMSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTI1Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMTUiLz48cGFpciBrZXJuPSItMTMyIiBrcHgyPSIyMzQiLz48cGFpciBrZXJuPSItMTciIGtweDI9Ijg4Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMjIiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjIxMCIvPjxwYWlyIGtlcm49IjIyIiBrcHgyPSIzNiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iODIiLz48cGFpciBrZXJuPSItOTEiIGtweDI9IjU4Ii8+PHBhaXIga2Vybj0iLTkxIiBrcHgyPSIxODYiLz48cGFpciBrZXJuPSItMTM3IiBrcHgyPSI1NSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTE0Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxNzUiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEyNyIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iNTAiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjIwOSIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTAzIi8+PHBhaXIga2Vybj0iMjIiIGtweDI9Ijk4Ii8+PHBhaXIga2Vybj0iLTI2MiIga3B4Mj0iMTgxIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMjgiLz48cGFpciBrZXJuPSIyMiIga3B4Mj0iMTczIi8+PHBhaXIga2Vybj0iLTQ5IiBrcHgyPSIyMTIiLz48cGFpciBrZXJuPSItOTEiIGtweDI9IjkyIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMjEiLz48cGFpciBrZXJuPSItMTA5IiBrcHgyPSI1NyIvPjxwYWlyIGtlcm49IjIyIiBrcHgyPSIxNzQiLz48cGFpciBrZXJuPSItNDkiIGtweDI9IjU2Ii8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjIxMCI+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIzNiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTk5Ii8+PHBhaXIga2Vybj0iMjciIGtweDI9IjE2Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxODciLz48cGFpciBrZXJuPSItMTciIGtweDI9Ijk4Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxODEiLz48cGFpciBrZXJuPSItNjMiIGtweDI9IjU5Ii8+PHBhaXIga2Vybj0iLTQwIiBrcHgyPSIxNyIvPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iMTgwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNzMiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE2OSIvPjxwYWlyIGtlcm49Ii05MSIga3B4Mj0iMTk3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyMDEiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjYwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyOSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNTciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3NCIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMjM0Ii8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjU4Ij48cGFpciBrZXJuPSItMzUiIGtweDI9IjEyNiIvPjxwYWlyIGtlcm49Ii02MyIga3B4Mj0iMTA3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyMzUiLz48cGFpciBrZXJuPSItNTgiIGtweDI9IjcyIi8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxOTkiLz48cGFpciBrZXJuPSItNDAiIGtweDI9IjE2Ii8+PHBhaXIga2Vybj0iLTU4IiBrcHgyPSIxMTIiLz48cGFpciBrZXJuPSItNTgiIGtweDI9IjEyMyIvPjxwYWlyIGtlcm49Ii01OCIga3B4Mj0iMTEzIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxODAiLz48cGFpciBrZXJuPSItNjMiIGtweDI9IjEwNSIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTI5Ii8+PHBhaXIga2Vybj0iLTU4IiBrcHgyPSIxMjQiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjE2OSIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMjAxIi8+PHBhaXIga2Vybj0iLTQ0IiBrcHgyPSI4NSIvPjxwYWlyIGtlcm49Ii02MyIga3B4Mj0iMTA2Ii8+PHBhaXIga2Vybj0iLTU4IiBrcHgyPSIyOSIvPjxwYWlyIGtlcm49Ii01OCIga3B4Mj0iMTI1Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNzAiLz48cGFpciBrZXJuPSItNTgiIGtweDI9IjExNSIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iODgiLz48cGFpciBrZXJuPSItNTgiIGtweDI9IjEyMiIvPjxwYWlyIGtlcm49Ii02MyIga3B4Mj0iNjgiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjM2Ii8+PHBhaXIga2Vybj0iLTU4IiBrcHgyPSI4MiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTg2Ii8+PHBhaXIga2Vybj0iLTU4IiBrcHgyPSIxMTQiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjEyNyIvPjxwYWlyIGtlcm49Ii02MyIga3B4Mj0iMTA4Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSI5OCIvPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iNzYiLz48cGFpciBrZXJuPSItMTE0IiBrcHgyPSIxNyIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTI4Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxNzMiLz48cGFpciBrZXJuPSItNjMiIGtweDI9IjEwOSIvPjxwYWlyIGtlcm49Ii0xMjgiIGtweDI9IjE5NyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iOTIiLz48cGFpciBrZXJuPSItNTgiIGtweDI9IjEyMSIvPjxwYWlyIGtlcm49Ii02MyIga3B4Mj0iMTEwIi8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxNzQiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iODIiPjxwYWlyIGtlcm49Ii03MiIga3B4Mj0iMTgwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNyIvPjxwYWlyIGtlcm49Ii02MyIga3B4Mj0iMTk3Ii8+PHBhaXIga2Vybj0iMTgiIGtweDI9IjE2Ii8+PHBhaXIga2Vybj0iLTMwIiBrcHgyPSI5MSIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTgxIi8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjE4NiI+PHBhaXIga2Vybj0iLTE0MiIga3B4Mj0iMTciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE2OSIvPjxwYWlyIGtlcm49Ii0xNDYiIGtweDI9IjE5NyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTYiLz48cGFpciBrZXJuPSItNzIiIGtweDI9IjI5Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNzAiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iMTc1Ij48cGFpciBrZXJuPSItMTciIGtweDI9IjM2Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxOTkiLz48cGFpciBrZXJuPSIyNyIga3B4Mj0iMTYiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjE4NyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iOTgiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE4MSIvPjxwYWlyIGtlcm49Ii02MyIga3B4Mj0iNTkiLz48cGFpciBrZXJuPSItNDAiIGtweDI9IjE3Ii8+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSIxODAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3MyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTY5Ii8+PHBhaXIga2Vybj0iLTkxIiBrcHgyPSIxOTciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjIwMSIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iNjAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI5Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI1NyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTc0Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIyMzQiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iMjA5Ij48cGFpciBrZXJuPSItMTciIGtweDI9IjM2Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxOTkiLz48cGFpciBrZXJuPSIyNyIga3B4Mj0iMTYiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjE4NyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iOTgiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE4MSIvPjxwYWlyIGtlcm49Ii02MyIga3B4Mj0iNTkiLz48cGFpciBrZXJuPSItNDAiIGtweDI9IjE3Ii8+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSIxODAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3MyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTY5Ii8+PHBhaXIga2Vybj0iLTkxIiBrcHgyPSIxOTciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjIwMSIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iNjAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI5Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI1NyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTc0Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIyMzQiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iMTAzIj48cGFpciBrZXJuPSItMTciIGtweDI9IjM2Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxOTkiLz48cGFpciBrZXJuPSIyNyIga3B4Mj0iMTYiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjE4NyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iOTgiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE4MSIvPjxwYWlyIGtlcm49Ii02MyIga3B4Mj0iNTkiLz48cGFpciBrZXJuPSItNDAiIGtweDI9IjE3Ii8+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSIxODAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3MyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTY5Ii8+PHBhaXIga2Vybj0iLTkxIiBrcHgyPSIxOTciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjIwMSIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iNjAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI5Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI1NyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTc0Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIyMzQiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iODEiPjxwYWlyIGtlcm49Ii03MiIga3B4Mj0iMTgwIi8+PHBhaXIga2Vybj0iLTQ0IiBrcHgyPSIxOTciLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjE4MSIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSI5OCI+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyNDYiLz48cGFpciBrZXJuPSItNjciIGtweDI9IjIzNSIvPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iMTYiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjExMiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTIzIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyNTEiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjExMyIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iMTg3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyMDgiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjczIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMjQiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjE2OSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjUyIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI3MCIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iNjAiLz48cGFpciBrZXJuPSIyNyIga3B4Mj0iMjAxIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyOSIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iMjM0Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMDAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEyMiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjEwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI4MiIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iNTgiLz48cGFpciBrZXJuPSItNjciIGtweDI9IjE4NiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTc1Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyMDkiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEwMyIvPjxwYWlyIGtlcm49IjI3IiBrcHgyPSI5OCIvPjxwYWlyIGtlcm49Ii0xMjMiIGtweDI9IjE4MSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjM4Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI4NCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTIxIi8+PHBhaXIga2Vybj0iLTYzIiBrcHgyPSI1NyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjU0Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI4NyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNzIiLz48cGFpciBrZXJuPSIyNyIga3B4Mj0iMTk5Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI3MSIvPjxwYWlyIGtlcm49Ii0xMjgiIGtweDI9IjE4MCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjUzIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI1MiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTI1Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI0MiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTE1Ii8+PHBhaXIga2Vybj0iLTQwIiBrcHgyPSI5MCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTExIi8+PHBhaXIga2Vybj0iMjciIGtweDI9IjM2Ii8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSI1NSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTE0Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI1MCIvPjxwYWlyIGtlcm49IjI3IiBrcHgyPSIxNzMiLz48cGFpciBrZXJuPSItNjciIGtweDI9IjkyIi8+PHBhaXIga2Vybj0iMjIiIGtweDI9IjE5NyIvPjxwYWlyIGtlcm49Ii01OCIga3B4Mj0iODkiLz48cGFpciBrZXJuPSIyNyIga3B4Mj0iMTc0Ii8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjIxMiI+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyMjkiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjYxIi8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjIyOSI+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxODAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE5NyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTYiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE4MSIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSIzOCI+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNjkiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjYwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxODciLz48cGFpciBrZXJuPSIxOCIga3B4Mj0iMTgxIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNzAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjIzNCIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSIxMjEiPjxwYWlyIGtlcm49Ii03MiIga3B4Mj0iMTgwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNyIvPjxwYWlyIGtlcm49Ii02MyIga3B4Mj0iMTk3Ii8+PHBhaXIga2Vybj0iMTgiIGtweDI9IjE2Ii8+PHBhaXIga2Vybj0iLTMwIiBrcHgyPSI5MSIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTgxIi8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjU3Ij48cGFpciBrZXJuPSItNjciIGtweDI9IjEyNiIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iMTA3Ii8+PHBhaXIga2Vybj0iLTI2IiBrcHgyPSIyMzUiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjcyIi8+PHBhaXIga2Vybj0iLTYzIiBrcHgyPSIxOTkiLz48cGFpciBrZXJuPSItNTgiIGtweDI9IjE2Ii8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSIxMjMiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjExMiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjA4Ii8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSIxMTMiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjEwNSIvPjxwYWlyIGtlcm49Ii02NyIga3B4Mj0iMTI5Ii8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSIxMjQiLz48cGFpciBrZXJuPSItODYiIGtweDI9IjE2OSIvPjxwYWlyIGtlcm49Ii02MyIga3B4Mj0iMjAxIi8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSIxMDYiLz48cGFpciBrZXJuPSItODEiIGtweDI9IjI5Ii8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSIxMjUiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjE3MCIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iMTE1Ii8+PHBhaXIga2Vybj0iLTY3IiBrcHgyPSI4OCIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iMTIyIi8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSI2OCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjEwIi8+PHBhaXIga2Vybj0iLTYzIiBrcHgyPSIzNiIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iODIiLz48cGFpciBrZXJuPSItMjYiIGtweDI9IjE4NiIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iMTE0Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNzUiLz48cGFpciBrZXJuPSItNjciIGtweDI9IjEyNyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNTAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjIwOSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTAzIi8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSIxMDgiLz48cGFpciBrZXJuPSItNjMiIGtweDI9Ijk4Ii8+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSI3NiIvPjxwYWlyIGtlcm49Ii0xMjgiIGtweDI9IjE3Ii8+PHBhaXIga2Vybj0iLTY3IiBrcHgyPSIxMjgiLz48cGFpciBrZXJuPSItNjMiIGtweDI9IjE3MyIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iMTA5Ii8+PHBhaXIga2Vybj0iLTEzNyIga3B4Mj0iMTk3Ii8+PHBhaXIga2Vybj0iLTI2IiBrcHgyPSI5MiIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iMTIxIi8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSIxMTAiLz48cGFpciBrZXJuPSItNjMiIGtweDI9IjE3NCIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSIzNyI+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyMjciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI0NiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjUxIi8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxODciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjIwOCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNTQiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjE4MCIvPjxwYWlyIGtlcm49Ii0zMCIga3B4Mj0iMTY5Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSI2MCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjUzIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI0MiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTcwIi8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIyMzQiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEwMCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjEwIi8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSI1OCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTc1Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI1MCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjA5Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMDMiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjE4MSIvPjxwYWlyIGtlcm49Ii00MCIga3B4Mj0iMTk3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIzOCIvPjxwYWlyIGtlcm49Ii0zMCIga3B4Mj0iNTciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI0OSIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSIxMjAiPjxwYWlyIGtlcm49Ii03MiIga3B4Mj0iMTgwIi8+PHBhaXIga2Vybj0iLTQ0IiBrcHgyPSIxOTciLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjE4MSIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSIyNDkiPjxwYWlyIGtlcm49IjE4IiBrcHgyPSIxNzMiLz48cGFpciBrZXJuPSIxOCIga3B4Mj0iMzYiLz48cGFpciBrZXJuPSIxOCIga3B4Mj0iMjAxIi8+PHBhaXIga2Vybj0iMTgiIGtweDI9IjE5OSIvPjxwYWlyIGtlcm49IjE4IiBrcHgyPSIxNzQiLz48cGFpciBrZXJuPSIxOCIga3B4Mj0iOTgiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iMjI3Ij48cGFpciBrZXJuPSIxOCIga3B4Mj0iMTczIi8+PHBhaXIga2Vybj0iMTgiIGtweDI9IjM2Ii8+PHBhaXIga2Vybj0iMTgiIGtweDI9IjIwMSIvPjxwYWlyIGtlcm49IjE4IiBrcHgyPSIxOTkiLz48cGFpciBrZXJuPSIxOCIga3B4Mj0iMTc0Ii8+PHBhaXIga2Vybj0iMTgiIGtweDI9Ijk4Ii8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjUxIj48cGFpciBrZXJuPSItMTciIGtweDI9IjEyNiIvPjxwYWlyIGtlcm49Ii00NCIga3B4Mj0iMTA3Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSI3MiIvPjxwYWlyIGtlcm49Ii02MyIga3B4Mj0iMTk5Ii8+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSIxNiIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTIzIi8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxMTIiLz48cGFpciBrZXJuPSItMjEiIGtweDI9IjE4NyIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTEzIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI4NiIvPjxwYWlyIGtlcm49IjE4IiBrcHgyPSIxODAiLz48cGFpciBrZXJuPSItNDQiIGtweDI9IjEwNSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTI5Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxMjQiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE2OSIvPjxwYWlyIGtlcm49Ii02MyIga3B4Mj0iMjAxIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI4NSIvPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iNjAiLz48cGFpciBrZXJuPSItNDQiIGtweDI9IjEwNiIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTI1Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxMTUiLz48cGFpciBrZXJuPSItMjEiIGtweDI9IjIzNCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iODgiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjEyMiIvPjxwYWlyIGtlcm49Ii00NCIga3B4Mj0iNjgiLz48cGFpciBrZXJuPSItNjMiIGtweDI9IjM2Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSI4MiIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTE0Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyNTAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEyNyIvPjxwYWlyIGtlcm49Ii00NCIga3B4Mj0iMTA4Ii8+PHBhaXIga2Vybj0iLTYzIiBrcHgyPSI5OCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iODEiLz48cGFpciBrZXJuPSItMjEiIGtweDI9Ijc2Ii8+PHBhaXIga2Vybj0iMTgiIGtweDI9IjE4MSIvPjxwYWlyIGtlcm49Ii0xNTUiIGtweDI9IjE3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMjgiLz48cGFpciBrZXJuPSItNjMiIGtweDI9IjE3MyIvPjxwYWlyIGtlcm49Ii00NCIga3B4Mj0iMTA5Ii8+PHBhaXIga2Vybj0iLTE2MCIga3B4Mj0iMTk3Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxMjEiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjIyOCIvPjxwYWlyIGtlcm49Ii00NCIga3B4Mj0iMTEwIi8+PHBhaXIga2Vybj0iLTYzIiBrcHgyPSIxNzQiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEyMCIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSIxMDQiPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjI5Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI2MSIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSI3MiI+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI5MSIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSIxOTkiPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjQ2Ii8+PHBhaXIga2Vybj0iLTY3IiBrcHgyPSIyMzUiLz48cGFpciBrZXJuPSItMjEiIGtweDI9IjE2Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMTIiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEyMyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjUxIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMTMiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjE4NyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjA4Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSI3MyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTI0Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxNjkiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI1MiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNzAiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjYwIi8+PHBhaXIga2Vybj0iMjciIGtweDI9IjIwMSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjkiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjIzNCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTAwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMjIiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjIxMCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iODIiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjU4Ii8+PHBhaXIga2Vybj0iLTY3IiBrcHgyPSIxODYiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3NSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjA5Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMDMiLz48cGFpciBrZXJuPSIyNyIga3B4Mj0iOTgiLz48cGFpciBrZXJuPSItMTIzIiBrcHgyPSIxODEiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIzOCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iODQiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEyMSIvPjxwYWlyIGtlcm49Ii02MyIga3B4Mj0iNTciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI1NCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iODciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjcyIi8+PHBhaXIga2Vybj0iMjciIGtweDI9IjE5OSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNzEiLz48cGFpciBrZXJuPSItMTI4IiBrcHgyPSIxODAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI1MyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNTIiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEyNSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNDIiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjExNSIvPjxwYWlyIGtlcm49Ii00MCIga3B4Mj0iOTAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjExMSIvPjxwYWlyIGtlcm49IjI3IiBrcHgyPSIzNiIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iNTUiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjExNCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNTAiLz48cGFpciBrZXJuPSIyNyIga3B4Mj0iMTczIi8+PHBhaXIga2Vybj0iLTY3IiBrcHgyPSI5MiIvPjxwYWlyIGtlcm49IjIyIiBrcHgyPSIxOTciLz48cGFpciBrZXJuPSItNTgiIGtweDI9Ijg5Ii8+PHBhaXIga2Vybj0iMjciIGtweDI9IjE3NCIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSI1NCI+PHBhaXIga2Vybj0iMTgiIGtweDI9IjE3MyIvPjxwYWlyIGtlcm49IjE4IiBrcHgyPSIzNiIvPjxwYWlyIGtlcm49IjE4IiBrcHgyPSIyMDEiLz48cGFpciBrZXJuPSIxOCIga3B4Mj0iMTk5Ii8+PHBhaXIga2Vybj0iMTgiIGtweDI9IjE3NCIvPjxwYWlyIGtlcm49IjE4IiBrcHgyPSI5OCIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSIxODAiPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMjM1Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIyNDYiLz48cGFpciBrZXJuPSItMzAiIGtweDI9IjQzIi8+PHBhaXIga2Vybj0iLTcyIiBrcHgyPSIxMjMiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjI1MSIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMjA4Ii8+PHBhaXIga2Vybj0iLTE4OCIga3B4Mj0iMTQ0Ii8+PHBhaXIga2Vybj0iLTU4IiBrcHgyPSI1OSIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iNzMiLz48cGFpciBrZXJuPSItMzAiIGtweDI9IjQxIi8+PHBhaXIga2Vybj0iLTcyIiBrcHgyPSIxMjQiLz48cGFpciBrZXJuPSItNTQiIGtweDI9Ijg1Ii8+PHBhaXIga2Vybj0iLTEyOCIga3B4Mj0iMjAxIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI2MSIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTAwIi8+PHBhaXIga2Vybj0iLTcyIiBrcHgyPSIxMjIiLz48cGFpciBrZXJuPSItMzAiIGtweDI9IjQ3Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIyMTAiLz48cGFpciBrZXJuPSItNzIiIGtweDI9IjgyIi8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxODYiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjE3NSIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMjA5Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxMDMiLz48cGFpciBrZXJuPSItMTI4IiBrcHgyPSI5OCIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iODEiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjIyOSIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMzgiLz48cGFpciBrZXJuPSItNzIiIGtweDI9IjEyMSIvPjxwYWlyIGtlcm49Ii0zMCIga3B4Mj0iMzciLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjEyMCIvPjxwYWlyIGtlcm49Ii0zMCIga3B4Mj0iNTEiLz48cGFpciBrZXJuPSItMTI4IiBrcHgyPSIxOTkiLz48cGFpciBrZXJuPSItMzAiIGtweDI9IjUzIi8+PHBhaXIga2Vybj0iLTMwIiBrcHgyPSIxMzciLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjIzMyIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMjUzIi8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSI1MiIvPjxwYWlyIGtlcm49Ii03MiIga3B4Mj0iMTI1Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSI0MiIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iOTAiLz48cGFpciBrZXJuPSItMTI4IiBrcHgyPSIzNiIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iNTAiLz48cGFpciBrZXJuPSItMzAiIGtweDI9IjM5Ii8+PHBhaXIga2Vybj0iLTMwIiBrcHgyPSIyMzYiLz48cGFpciBrZXJuPSItMzAiIGtweDI9IjQ1Ii8+PHBhaXIga2Vybj0iLTEyOCIga3B4Mj0iMTczIi8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSI5MiIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iODkiLz48cGFpciBrZXJuPSItMzAiIGtweDI9IjQ2Ii8+PHBhaXIga2Vybj0iLTEyOCIga3B4Mj0iMTc0Ii8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjUzIj48cGFpciBrZXJuPSItMjEiIGtweDI9IjEwNyIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMjM1Ii8+PHBhaXIga2Vybj0iLTQwIiBrcHgyPSIxNiIvPjxwYWlyIGtlcm49Ii00NCIga3B4Mj0iMTEyIi8+PHBhaXIga2Vybj0iLTQ0IiBrcHgyPSIxMjMiLz48cGFpciBrZXJuPSItNDkiIGtweDI9IjI1MSIvPjxwYWlyIGtlcm49Ii00NCIga3B4Mj0iMTEzIi8+PHBhaXIga2Vybj0iLTYzIiBrcHgyPSIxODciLz48cGFpciBrZXJuPSItNDQiIGtweDI9IjEyOSIvPjxwYWlyIGtlcm49Ii00NCIga3B4Mj0iMTI0Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxNjkiLz48cGFpciBrZXJuPSItNjMiIGtweDI9IjYwIi8+PHBhaXIga2Vybj0iLTQwIiBrcHgyPSIyMDEiLz48cGFpciBrZXJuPSItMjEiIGtweDI9IjEwNiIvPjxwYWlyIGtlcm49Ii0zMCIga3B4Mj0iMjkiLz48cGFpciBrZXJuPSItNjMiIGtweDI9IjIzNCIvPjxwYWlyIGtlcm49Ii00OSIga3B4Mj0iMTAwIi8+PHBhaXIga2Vybj0iLTQ0IiBrcHgyPSIxMjIiLz48cGFpciBrZXJuPSItMjEiIGtweDI9IjY4Ii8+PHBhaXIga2Vybj0iLTQwIiBrcHgyPSI1OCIvPjxwYWlyIGtlcm49Ii00NCIga3B4Mj0iODIiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjE4NiIvPjxwYWlyIGtlcm49Ii00MCIga3B4Mj0iOTgiLz48cGFpciBrZXJuPSItNjMiIGtweDI9IjE4MSIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTciLz48cGFpciBrZXJuPSItNDkiIGtweDI9IjM4Ii8+PHBhaXIga2Vybj0iLTQ0IiBrcHgyPSIxMjEiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjU3Ii8+PHBhaXIga2Vybj0iLTQ0IiBrcHgyPSIxMjYiLz48cGFpciBrZXJuPSItNDQiIGtweDI9IjcyIi8+PHBhaXIga2Vybj0iLTQwIiBrcHgyPSIxOTkiLz48cGFpciBrZXJuPSItNzIiIGtweDI9IjE4MCIvPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iMTA1Ii8+PHBhaXIga2Vybj0iLTQ5IiBrcHgyPSIyNTMiLz48cGFpciBrZXJuPSItNDQiIGtweDI9IjEyNSIvPjxwYWlyIGtlcm49Ii00NCIga3B4Mj0iMTE1Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNzAiLz48cGFpciBrZXJuPSItNDQiIGtweDI9Ijg4Ii8+PHBhaXIga2Vybj0iLTQwIiBrcHgyPSIzNiIvPjxwYWlyIGtlcm49Ii00NCIga3B4Mj0iMTE0Ii8+PHBhaXIga2Vybj0iLTcyIiBrcHgyPSI1NSIvPjxwYWlyIGtlcm49Ii00NCIga3B4Mj0iMTI3Ii8+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSIxMDgiLz48cGFpciBrZXJuPSItNDQiIGtweDI9IjEyOCIvPjxwYWlyIGtlcm49Ii00MCIga3B4Mj0iMTczIi8+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSIxMDkiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjkyIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxOTciLz48cGFpciBrZXJuPSItMjEiIGtweDI9IjExMCIvPjxwYWlyIGtlcm49Ii00MCIga3B4Mj0iMTc0Ii8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjEzNyI+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxODAiLz48cGFpciBrZXJuPSItNDAiIGtweDI9IjE5NyIvPjxwYWlyIGtlcm49IjE4IiBrcHgyPSIxNiIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMTgxIi8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjIzMyI+PHBhaXIga2Vybj0iLTQ0IiBrcHgyPSIxODAiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjE5NyIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMTgxIi8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjI1MyI+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNjkiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjYwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxODciLz48cGFpciBrZXJuPSIxOCIga3B4Mj0iMTgxIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNzAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjIzNCIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSIyMTEiPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjI5Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI2MSIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSI3OCI+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMDciLz48cGFpciBrZXJuPSItMzAiIGtweDI9IjEyNiIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMjM1Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSI3MiIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTEyIi8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxMjMiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjExMyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTA1Ii8+PHBhaXIga2Vybj0iLTMwIiBrcHgyPSIxMjkiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjEyNCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTA2Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxMjUiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjExNSIvPjxwYWlyIGtlcm49Ii0zMCIga3B4Mj0iODgiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjEyMiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNjgiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjgyIi8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxMTQiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjE4NiIvPjxwYWlyIGtlcm49Ii0zMCIga3B4Mj0iMTI3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMDgiLz48cGFpciBrZXJuPSItMzAiIGtweDI9IjEyOCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTA5Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSI5MiIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTIxIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMTAiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iNTIiPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iMTgwIi8+PHBhaXIga2Vybj0iLTYzIiBrcHgyPSIxOTciLz48cGFpciBrZXJuPSIyNyIga3B4Mj0iMTYiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE4MSIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSIxMjUiPjxwYWlyIGtlcm49Ii03MiIga3B4Mj0iMTgwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNyIvPjxwYWlyIGtlcm49Ii02MyIga3B4Mj0iMTk3Ii8+PHBhaXIga2Vybj0iMTgiIGtweDI9IjE2Ii8+PHBhaXIga2Vybj0iLTMwIiBrcHgyPSI5MSIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTgxIi8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjQyIj48cGFpciBrZXJuPSItMjEiIGtweDI9IjE4MCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTY5Ii8+PHBhaXIga2Vybj0iLTI2IiBrcHgyPSIxOTciLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjU1Ii8+PHBhaXIga2Vybj0iLTQ5IiBrcHgyPSI2MCIvPjxwYWlyIGtlcm49Ii00OSIga3B4Mj0iMTg3Ii8+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSIxODEiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3MCIvPjxwYWlyIGtlcm49Ii00OSIga3B4Mj0iMjM0Ii8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjE3MCI+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyMzUiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjE5OSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjUxIi8+PHBhaXIga2Vybj0iLTEwOSIga3B4Mj0iMTg3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyMDgiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjU5Ii8+PHBhaXIga2Vybj0iLTEwOSIga3B4Mj0iNjAiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjIwMSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjUzIi8+PHBhaXIga2Vybj0iLTEwOSIga3B4Mj0iMjM0Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI5MCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTAwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyMTAiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjM2Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSI1OCIvPjxwYWlyIGtlcm49Ii05MSIga3B4Mj0iNTUiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE4NiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTc1Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI1MCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjA5Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMDMiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjM5Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSI5OCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNDUiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjE3MyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iOTIiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjM4Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI4OSIvPjxwYWlyIGtlcm49Ii04NiIga3B4Mj0iNTciLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjM3Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxNzQiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iMTE1Ij48cGFpciBrZXJuPSItMTciIGtweDI9IjkxIi8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjkwIj48cGFpciBrZXJuPSItOTEiIGtweDI9IjE3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNjkiLz48cGFpciBrZXJuPSItMTA0IiBrcHgyPSIxOTciLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjI5Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNzAiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iMzYiPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjQ2Ii8+PHBhaXIga2Vybj0iLTY3IiBrcHgyPSIyMzUiLz48cGFpciBrZXJuPSItMjEiIGtweDI9IjE2Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMTIiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEyMyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjUxIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMTMiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjE4NyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjA4Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSI3MyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTI0Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxNjkiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI1MiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNzAiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjYwIi8+PHBhaXIga2Vybj0iMjciIGtweDI9IjIwMSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjkiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjIzNCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTAwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMjIiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjIxMCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iODIiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjU4Ii8+PHBhaXIga2Vybj0iLTY3IiBrcHgyPSIxODYiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3NSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjA5Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMDMiLz48cGFpciBrZXJuPSIyNyIga3B4Mj0iOTgiLz48cGFpciBrZXJuPSItMTIzIiBrcHgyPSIxODEiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIzOCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iODQiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEyMSIvPjxwYWlyIGtlcm49Ii02MyIga3B4Mj0iNTciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI1NCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iODciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjcyIi8+PHBhaXIga2Vybj0iMjciIGtweDI9IjE5OSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNzEiLz48cGFpciBrZXJuPSItMTI4IiBrcHgyPSIxODAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI1MyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNTIiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEyNSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNDIiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjExNSIvPjxwYWlyIGtlcm49Ii00MCIga3B4Mj0iOTAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjExMSIvPjxwYWlyIGtlcm49IjI3IiBrcHgyPSIzNiIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iNTUiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjExNCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNTAiLz48cGFpciBrZXJuPSIyNyIga3B4Mj0iMTczIi8+PHBhaXIga2Vybj0iLTY3IiBrcHgyPSI5MiIvPjxwYWlyIGtlcm49IjIyIiBrcHgyPSIxOTciLz48cGFpciBrZXJuPSItNTgiIGtweDI9Ijg5Ii8+PHBhaXIga2Vybj0iMjciIGtweDI9IjE3NCIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSI1NSI+PHBhaXIga2Vybj0iLTE2NSIga3B4Mj0iMTA3Ii8+PHBhaXIga2Vybj0iLTE1NSIga3B4Mj0iMjM1Ii8+PHBhaXIga2Vybj0iLTkxIiBrcHgyPSIxNiIvPjxwYWlyIGtlcm49Ii0xNjkiIGtweDI9IjExMiIvPjxwYWlyIGtlcm49Ii0xNjkiIGtweDI9IjEyMyIvPjxwYWlyIGtlcm49Ii01OCIga3B4Mj0iMjUxIi8+PHBhaXIga2Vybj0iLTE2OSIga3B4Mj0iMTEzIi8+PHBhaXIga2Vybj0iLTE2NSIga3B4Mj0iODYiLz48cGFpciBrZXJuPSItMTUxIiBrcHgyPSIxMjkiLz48cGFpciBrZXJuPSItMTY5IiBrcHgyPSIxMjQiLz48cGFpciBrZXJuPSItOTEiIGtweDI9IjE2OSIvPjxwYWlyIGtlcm49Ii0xNjkiIGtweDI9IjI1MiIvPjxwYWlyIGtlcm49Ii0xNjkiIGtweDI9IjcwIi8+PHBhaXIga2Vybj0iLTE0NiIga3B4Mj0iODUiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjIwMSIvPjxwYWlyIGtlcm49Ii0xNjUiIGtweDI9IjEwNiIvPjxwYWlyIGtlcm49Ii0xMDkiIGtweDI9IjI5Ii8+PHBhaXIga2Vybj0iLTU4IiBrcHgyPSIxMDAiLz48cGFpciBrZXJuPSItMTY5IiBrcHgyPSIxMjIiLz48cGFpciBrZXJuPSItMTY1IiBrcHgyPSI2OCIvPjxwYWlyIGtlcm49Ii0xNjkiIGtweDI9IjgyIi8+PHBhaXIga2Vybj0iLTE1NSIga3B4Mj0iMTg2Ii8+PHBhaXIga2Vybj0iLTE2NSIga3B4Mj0iMjUwIi8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSI5OCIvPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iMTgxIi8+PHBhaXIga2Vybj0iLTExOCIga3B4Mj0iMTciLz48cGFpciBrZXJuPSItNTgiIGtweDI9IjM4Ii8+PHBhaXIga2Vybj0iLTE2OSIga3B4Mj0iMTIxIi8+PHBhaXIga2Vybj0iLTE2NSIga3B4Mj0iMjI4Ii8+PHBhaXIga2Vybj0iLTE2OSIga3B4Mj0iMjU0Ii8+PHBhaXIga2Vybj0iLTE1MSIga3B4Mj0iMTI2Ii8+PHBhaXIga2Vybj0iLTE2OSIga3B4Mj0iNzIiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjE5OSIvPjxwYWlyIGtlcm49Ii0xNjUiIGtweDI9IjEwNSIvPjxwYWlyIGtlcm49Ii01OCIga3B4Mj0iMjUzIi8+PHBhaXIga2Vybj0iLTE2OSIga3B4Mj0iMTI1Ii8+PHBhaXIga2Vybj0iLTE2OSIga3B4Mj0iMTE1Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxNzAiLz48cGFpciBrZXJuPSItMTUxIiBrcHgyPSI4OCIvPjxwYWlyIGtlcm49Ii0xNjkiIGtweDI9IjExMSIvPjxwYWlyIGtlcm49Ii0xNjUiIGtweDI9IjkwIi8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSIzNiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNTUiLz48cGFpciBrZXJuPSItMTY5IiBrcHgyPSIxMTQiLz48cGFpciBrZXJuPSItMTUxIiBrcHgyPSIxMjciLz48cGFpciBrZXJuPSItMTY1IiBrcHgyPSIxMDgiLz48cGFpciBrZXJuPSItMzAiIGtweDI9Ijc2Ii8+PHBhaXIga2Vybj0iLTE1MSIga3B4Mj0iMTI4Ii8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSIxNzMiLz48cGFpciBrZXJuPSItMTY1IiBrcHgyPSIxMDkiLz48cGFpciBrZXJuPSItMTU1IiBrcHgyPSI5MiIvPjxwYWlyIGtlcm49Ii0xMjgiIGtweDI9IjE5NyIvPjxwYWlyIGtlcm49Ii0xNjUiIGtweDI9IjExMCIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iMTc0Ii8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjExNCI+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI5MSIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSI1MCI+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIzNiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTk5Ii8+PHBhaXIga2Vybj0iMjciIGtweDI9IjE2Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxODciLz48cGFpciBrZXJuPSItMTciIGtweDI9Ijk4Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxODEiLz48cGFpciBrZXJuPSItNjMiIGtweDI9IjU5Ii8+PHBhaXIga2Vybj0iLTQwIiBrcHgyPSIxNyIvPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iMTgwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNzMiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE2OSIvPjxwYWlyIGtlcm49Ii05MSIga3B4Mj0iMTk3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyMDEiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjYwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyOSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNTciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3NCIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMjM0Ii8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjkxIj48cGFpciBrZXJuPSItMTciIGtweDI9IjI1NCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTExIi8+PHBhaXIga2Vybj0iLTMwIiBrcHgyPSIxMjIiLz48cGFpciBrZXJuPSItMzAiIGtweDI9IjgyIi8+PHBhaXIga2Vybj0iLTMwIiBrcHgyPSIxMTQiLz48cGFpciBrZXJuPSItMzAiIGtweDI9IjcyIi8+PHBhaXIga2Vybj0iLTMwIiBrcHgyPSIxMTIiLz48cGFpciBrZXJuPSItMzAiIGtweDI9IjEyMyIvPjxwYWlyIGtlcm49Ii0zMCIga3B4Mj0iMTEzIi8+PHBhaXIga2Vybj0iLTMwIiBrcHgyPSIxMjQiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI1MiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNzAiLz48cGFpciBrZXJuPSItMzAiIGtweDI9IjEyMSIvPjxwYWlyIGtlcm49Ii0zMCIga3B4Mj0iMTI1Ii8+PHBhaXIga2Vybj0iLTMwIiBrcHgyPSIxMTUiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iMzkiPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMzYiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE5OSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iOTgiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjE4NyIvPjxwYWlyIGtlcm49Ii0yNiIga3B4Mj0iMTgxIi8+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSIxODAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3MyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTY5Ii8+PHBhaXIga2Vybj0iLTkxIiBrcHgyPSIxOTciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjIwMSIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iNjAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjU3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNzQiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3MCIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMjM0Ii8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjIzNiI+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxODAiLz48cGFpciBrZXJuPSItNzIiIGtweDI9IjE3Ii8+PHBhaXIga2Vybj0iLTkxIiBrcHgyPSIxOTciLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjI5Ii8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjQ1Ij48cGFpciBrZXJuPSItMzUiIGtweDI9IjE4MCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTczIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIzNiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTY5Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxOTciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjIwMSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTk5Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxNiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTc0Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI5OCIvPjxwYWlyIGtlcm49Ii0zMCIga3B4Mj0iMTgxIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNzAiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iMTczIj48cGFpciBrZXJuPSItMTciIGtweDI9IjI0NiIvPjxwYWlyIGtlcm49Ii02NyIga3B4Mj0iMjM1Ii8+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSIxNiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTEyIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMjMiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI1MSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTEzIi8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSIxODciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjIwOCIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iNzMiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEyNCIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTY5Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyNTIiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjcwIi8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSI2MCIvPjxwYWlyIGtlcm49IjI3IiBrcHgyPSIyMDEiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI5Ii8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSIyMzQiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEwMCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTIyIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyMTAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjgyIi8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSI1OCIvPjxwYWlyIGtlcm49Ii02NyIga3B4Mj0iMTg2Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNzUiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjIwOSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTAzIi8+PHBhaXIga2Vybj0iMjciIGtweDI9Ijk4Ii8+PHBhaXIga2Vybj0iLTEyMyIga3B4Mj0iMTgxIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMzgiLz48cGFpciBrZXJuPSItMTciIGtweDI9Ijg0Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMjEiLz48cGFpciBrZXJuPSItNjMiIGtweDI9IjU3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyNTQiLz48cGFpciBrZXJuPSItMTciIGtweDI9Ijg3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI3MiIvPjxwYWlyIGtlcm49IjI3IiBrcHgyPSIxOTkiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjcxIi8+PHBhaXIga2Vybj0iLTEyOCIga3B4Mj0iMTgwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyNTMiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjUyIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMjUiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjQyIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMTUiLz48cGFpciBrZXJuPSItNDAiIGtweDI9IjkwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMTEiLz48cGFpciBrZXJuPSIyNyIga3B4Mj0iMzYiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjU1Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMTQiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjUwIi8+PHBhaXIga2Vybj0iMjciIGtweDI9IjE3MyIvPjxwYWlyIGtlcm49Ii02NyIga3B4Mj0iOTIiLz48cGFpciBrZXJuPSIyMiIga3B4Mj0iMTk3Ii8+PHBhaXIga2Vybj0iLTU4IiBrcHgyPSI4OSIvPjxwYWlyIGtlcm49IjI3IiBrcHgyPSIxNzQiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iMTk3Ij48cGFpciBrZXJuPSItMzUiIGtweDI9IjI0NiIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMjM1Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSI0MyIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTIzIi8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIyNTEiLz48cGFpciBrZXJuPSItMTgzIiBrcHgyPSIxODciLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjIwOCIvPjxwYWlyIGtlcm49IjE4IiBrcHgyPSIxNDQiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjU5Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI3MyIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iNDEiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjEyNCIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iODUiLz48cGFpciBrZXJuPSItMTgzIiBrcHgyPSI2MCIvPjxwYWlyIGtlcm49IjE4IiBrcHgyPSIyMDEiLz48cGFpciBrZXJuPSItMTgzIiBrcHgyPSIyMzQiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjEwMCIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTIyIi8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSI0NyIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMjEwIi8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSI4MiIvPjxwYWlyIGtlcm49Ii0xMjMiIGtweDI9IjU4Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxODYiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjE3NSIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMjA5Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxMDMiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjgxIi8+PHBhaXIga2Vybj0iMTgiIGtweDI9Ijk4Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIzOCIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTIxIi8+PHBhaXIga2Vybj0iLTE4MyIga3B4Mj0iNTciLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjM3Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxMjAiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjUxIi8+PHBhaXIga2Vybj0iMTgiIGtweDI9IjE5OSIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iNTMiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjEzNyIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMjMzIi8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIyNTMiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjUyIi8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxMjUiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjQyIi8+PHBhaXIga2Vybj0iLTk1IiBrcHgyPSI5MCIvPjxwYWlyIGtlcm49IjE4IiBrcHgyPSIzNiIvPjxwYWlyIGtlcm49Ii0xMzciIGtweDI9IjU1Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSI1MCIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMzkiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjIzNiIvPjxwYWlyIGtlcm49IjIyIiBrcHgyPSI0NSIvPjxwYWlyIGtlcm49IjE4IiBrcHgyPSIxNzMiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjkyIi8+PHBhaXIga2Vybj0iLTExNCIga3B4Mj0iODkiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjQ2Ii8+PHBhaXIga2Vybj0iMTgiIGtweDI9IjE3NCIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSI5MiI+PHBhaXIga2Vybj0iLTE0MiIga3B4Mj0iMTciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE2OSIvPjxwYWlyIGtlcm49Ii0xNDYiIGtweDI9IjE5NyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTYiLz48cGFpciBrZXJuPSItNzIiIGtweDI9IjI5Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNzAiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iODkiPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iMTciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE2OSIvPjxwYWlyIGtlcm49Ii0xMzIiIGtweDI9IjE5NyIvPjxwYWlyIGtlcm49Ii0yNiIga3B4Mj0iMTYiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjI5Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxODEiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3MCIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSI0NiI+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMDciLz48cGFpciBrZXJuPSItNzIiIGtweDI9IjIzNSIvPjxwYWlyIGtlcm49Ii0xMDQiIGtweDI9IjE2Ii8+PHBhaXIga2Vybj0iLTQ5IiBrcHgyPSIxMTIiLz48cGFpciBrZXJuPSItNDkiIGtweDI9IjEyMyIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMjUxIi8+PHBhaXIga2Vybj0iLTI2IiBrcHgyPSIyMTMiLz48cGFpciBrZXJuPSItNDkiIGtweDI9IjExMyIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTg3Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIyMDgiLz48cGFpciBrZXJuPSItNDkiIGtweDI9IjEyOSIvPjxwYWlyIGtlcm49Ii00OSIga3B4Mj0iMTI0Ii8+PHBhaXIga2Vybj0iLTYzIiBrcHgyPSIxNjkiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjYwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyMDEiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEwNiIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMjM0Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxMDAiLz48cGFpciBrZXJuPSItNDkiIGtweDI9IjEyMiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNjgiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjIxMCIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iNTgiLz48cGFpciBrZXJuPSItNDkiIGtweDI9IjgyIi8+PHBhaXIga2Vybj0iLTcyIiBrcHgyPSIxODYiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjE3NSIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMjA5Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxMDMiLz48cGFpciBrZXJuPSItMTciIGtweDI9Ijk4Ii8+PHBhaXIga2Vybj0iLTMwIiBrcHgyPSIxODEiLz48cGFpciBrZXJuPSItMjYiIGtweDI9IjIxMiIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMzgiLz48cGFpciBrZXJuPSItNDkiIGtweDI9IjEyMSIvPjxwYWlyIGtlcm49Ii00OSIga3B4Mj0iMTI2Ii8+PHBhaXIga2Vybj0iLTI2IiBrcHgyPSIxMDQiLz48cGFpciBrZXJuPSItNDkiIGtweDI9IjcyIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxOTkiLz48cGFpciBrZXJuPSItMzAiIGtweDI9IjE4MCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTA1Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIyNTMiLz48cGFpciBrZXJuPSItMjYiIGtweDI9IjIxMSIvPjxwYWlyIGtlcm49Ii00OSIga3B4Mj0iMTI1Ii8+PHBhaXIga2Vybj0iLTQ5IiBrcHgyPSIxMTUiLz48cGFpciBrZXJuPSItNDkiIGtweDI9Ijg4Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIzNiIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iNTUiLz48cGFpciBrZXJuPSItNDkiIGtweDI9IjExNCIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iNTAiLz48cGFpciBrZXJuPSItNDkiIGtweDI9IjEyNyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTA4Ii8+PHBhaXIga2Vybj0iLTQ5IiBrcHgyPSIxMjgiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3MyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTA5Ii8+PHBhaXIga2Vybj0iLTcyIiBrcHgyPSI5MiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTEwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNzQiLz48cGFpciBrZXJuPSItMjYiIGtweDI9IjU2Ii8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjE3NCI+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyNDYiLz48cGFpciBrZXJuPSItNjciIGtweDI9IjIzNSIvPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iMTYiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjExMiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTIzIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyNTEiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjExMyIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iMTg3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyMDgiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjczIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMjQiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjE2OSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjUyIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI3MCIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iNjAiLz48cGFpciBrZXJuPSIyNyIga3B4Mj0iMjAxIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyOSIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iMjM0Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMDAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEyMiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjEwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI4MiIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iNTgiLz48cGFpciBrZXJuPSItNjciIGtweDI9IjE4NiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTc1Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyMDkiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEwMyIvPjxwYWlyIGtlcm49IjI3IiBrcHgyPSI5OCIvPjxwYWlyIGtlcm49Ii0xMjMiIGtweDI9IjE4MSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjM4Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI4NCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTIxIi8+PHBhaXIga2Vybj0iLTYzIiBrcHgyPSI1NyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjU0Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI4NyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNzIiLz48cGFpciBrZXJuPSIyNyIga3B4Mj0iMTk5Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI3MSIvPjxwYWlyIGtlcm49Ii0xMjgiIGtweDI9IjE4MCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjUzIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI1MiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTI1Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI0MiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTE1Ii8+PHBhaXIga2Vybj0iLTQwIiBrcHgyPSI5MCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTExIi8+PHBhaXIga2Vybj0iMjciIGtweDI9IjM2Ii8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSI1NSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTE0Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI1MCIvPjxwYWlyIGtlcm49IjI3IiBrcHgyPSIxNzMiLz48cGFpciBrZXJuPSItNjciIGtweDI9IjkyIi8+PHBhaXIga2Vybj0iMjIiIGtweDI9IjE5NyIvPjxwYWlyIGtlcm49Ii01OCIga3B4Mj0iODkiLz48cGFpciBrZXJuPSIyNyIga3B4Mj0iMTc0Ii8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjU2Ij48cGFpciBrZXJuPSItMTciIGtweDI9IjIyOSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNjEiLz48L2tlcm5pbmc+PC9mb250LW1ldHJpY3M+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9kb2MvdGVtcGxhdGUvVmVyYU1vQmQudHRmIGIvYml0YmFrZS9kb2MvdGVtcGxhdGUvVmVyYU1vQmQudHRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZTY1NDcKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2RvYy90ZW1wbGF0ZS9WZXJhTW9CZC50dGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9kb2MvdGVtcGxhdGUvVmVyYU1vQmQueG1sIGIvYml0YmFrZS9kb2MvdGVtcGxhdGUvVmVyYU1vQmQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMzMxMDcKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2RvYy90ZW1wbGF0ZS9WZXJhTW9CZC54bWwKQEAgLTAsMCArMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48Zm9udC1tZXRyaWNzIG1ldHJpY3MtdmVyc2lvbj0iMiIgdHlwZT0iVFlQRTAiPjxmb250LW5hbWU+Qml0c3RyZWFtVmVyYVNhbnNNb25vLUJvbGQ8L2ZvbnQtbmFtZT48ZnVsbC1uYW1lPkJpdHN0cmVhbSBWZXJhIFNhbnMgTW9ubyBCb2xkPC9mdWxsLW5hbWU+PGZhbWlseS1uYW1lPkJpdHN0cmVhbSBWZXJhIFNhbnMgTW9ubzwvZmFtaWx5LW5hbWU+PGVtYmVkLz48Y2FwLWhlaWdodD43Mjk8L2NhcC1oZWlnaHQ+PHgtaGVpZ2h0PjU0NjwveC1oZWlnaHQ+PGFzY2VuZGVyPjc1OTwvYXNjZW5kZXI+PGRlc2NlbmRlcj4tMjQwPC9kZXNjZW5kZXI+PGJib3g+PGxlZnQ+LTE5PC9sZWZ0Pjxib3R0b20+LTIzNTwvYm90dG9tPjxyaWdodD42MDU8L3JpZ2h0Pjx0b3A+OTI4PC90b3A+PC9iYm94PjxmbGFncz4zNDwvZmxhZ3M+PHN0ZW12PjA8L3N0ZW12PjxpdGFsaWNhbmdsZT4wPC9pdGFsaWNhbmdsZT48c3VidHlwZT5UWVBFMDwvc3VidHlwZT48bXVsdGlieXRlLWV4dHJhcz48Y2lkLXR5cGU+Q0lERm9udFR5cGUyPC9jaWQtdHlwZT48ZGVmYXVsdC13aWR0aD4wPC9kZWZhdWx0LXdpZHRoPjxiZnJhbmdlcz48YmYgZ2k9IjMiIHVlPSIxMjYiIHVzPSIzMiIvPjxiZiBnaT0iMTcyIiB1ZT0iMTYwIiB1cz0iMTYwIi8+PGJmIGdpPSIxNjMiIHVlPSIxNjEiIHVzPSIxNjEiLz48YmYgZ2k9IjEzMiIgdWU9IjE2MyIgdXM9IjE2MiIvPjxiZiBnaT0iMTg5IiB1ZT0iMTY0IiB1cz0iMTY0Ii8+PGJmIGdpPSIxNTAiIHVlPSIxNjUiIHVzPSIxNjUiLz48YmYgZ2k9IjIzMSIgdWU9IjE2NiIgdXM9IjE2NiIvPjxiZiBnaT0iMTM0IiB1ZT0iMTY3IiB1cz0iMTY3Ii8+PGJmIGdpPSIxNDIiIHVlPSIxNjgiIHVzPSIxNjgiLz48YmYgZ2k9IjEzOSIgdWU9IjE2OSIgdXM9IjE2OSIvPjxiZiBnaT0iMTU3IiB1ZT0iMTcwIiB1cz0iMTcwIi8+PGJmIGdpPSIxNjkiIHVlPSIxNzEiIHVzPSIxNzEiLz48YmYgZ2k9IjE2NCIgdWU9IjE3MiIgdXM9IjE3MiIvPjxiZiBnaT0iMjU2IiB1ZT0iMTczIiB1cz0iMTczIi8+PGJmIGdpPSIxMzgiIHVlPSIxNzQiIHVzPSIxNzQiLz48YmYgZ2k9IjIxNyIgdWU9IjE3NSIgdXM9IjE3NSIvPjxiZiBnaT0iMTMxIiB1ZT0iMTc2IiB1cz0iMTc2Ii8+PGJmIGdpPSIxNDciIHVlPSIxNzciIHVzPSIxNzciLz48YmYgZ2k9IjI0MSIgdWU9IjE3OSIgdXM9IjE3OCIvPjxiZiBnaT0iMTQxIiB1ZT0iMTgwIiB1cz0iMTgwIi8+PGJmIGdpPSIxNTEiIHVlPSIxODEiIHVzPSIxODEiLz48YmYgZ2k9IjEzNiIgdWU9IjE4MiIgdXM9IjE4MiIvPjxiZiBnaT0iMTk1IiB1ZT0iMTgzIiB1cz0iMTgzIi8+PGJmIGdpPSIyMjEiIHVlPSIxODQiIHVzPSIxODQiLz48YmYgZ2k9IjI0MCIgdWU9IjE4NSIgdXM9IjE4NSIvPjxiZiBnaT0iMTU4IiB1ZT0iMTg2IiB1cz0iMTg2Ii8+PGJmIGdpPSIxNzAiIHVlPSIxODciIHVzPSIxODciLz48YmYgZ2k9IjI0MyIgdWU9IjE5MCIgdXM9IjE4OCIvPjxiZiBnaT0iMTYyIiB1ZT0iMTkxIiB1cz0iMTkxIi8+PGJmIGdpPSIxNzMiIHVlPSIxOTIiIHVzPSIxOTIiLz48YmYgZ2k9IjIwMSIgdWU9IjE5MyIgdXM9IjE5MyIvPjxiZiBnaT0iMTk5IiB1ZT0iMTk0IiB1cz0iMTk0Ii8+PGJmIGdpPSIxNzQiIHVlPSIxOTUiIHVzPSIxOTUiLz48YmYgZ2k9Ijk4IiB1ZT0iMTk3IiB1cz0iMTk2Ii8+PGJmIGdpPSIxNDQiIHVlPSIxOTgiIHVzPSIxOTgiLz48YmYgZ2k9IjEwMCIgdWU9IjE5OSIgdXM9IjE5OSIvPjxiZiBnaT0iMjAzIiB1ZT0iMjAwIiB1cz0iMjAwIi8+PGJmIGdpPSIxMDEiIHVlPSIyMDEiIHVzPSIyMDEiLz48YmYgZ2k9IjIwMCIgdWU9IjIwMiIgdXM9IjIwMiIvPjxiZiBnaT0iMjAyIiB1ZT0iMjAzIiB1cz0iMjAzIi8+PGJmIGdpPSIyMDciIHVlPSIyMDQiIHVzPSIyMDQiLz48YmYgZ2k9IjIwNCIgdWU9IjIwNyIgdXM9IjIwNSIvPjxiZiBnaT0iMjMyIiB1ZT0iMjA4IiB1cz0iMjA4Ii8+PGJmIGdpPSIxMDIiIHVlPSIyMDkiIHVzPSIyMDkiLz48YmYgZ2k9IjIxMCIgdWU9IjIxMCIgdXM9IjIxMCIvPjxiZiBnaT0iMjA4IiB1ZT0iMjEyIiB1cz0iMjExIi8+PGJmIGdpPSIxNzUiIHVlPSIyMTMiIHVzPSIyMTMiLz48YmYgZ2k9IjEwMyIgdWU9IjIxNCIgdXM9IjIxNCIvPjxiZiBnaT0iMjM5IiB1ZT0iMjE1IiB1cz0iMjE1Ii8+PGJmIGdpPSIxNDUiIHVlPSIyMTYiIHVzPSIyMTYiLz48YmYgZ2k9IjIxMyIgdWU9IjIxNyIgdXM9IjIxNyIvPjxiZiBnaT0iMjExIiB1ZT0iMjE5IiB1cz0iMjE4Ii8+PGJmIGdpPSIxMDQiIHVlPSIyMjAiIHVzPSIyMjAiLz48YmYgZ2k9IjIzNCIgdWU9IjIyMSIgdXM9IjIyMSIvPjxiZiBnaT0iMjM2IiB1ZT0iMjIyIiB1cz0iMjIyIi8+PGJmIGdpPSIxMzciIHVlPSIyMjMiIHVzPSIyMjMiLz48YmYgZ2k9IjEwNiIgdWU9IjIyNCIgdXM9IjIyNCIvPjxiZiBnaT0iMTA1IiB1ZT0iMjI1IiB1cz0iMjI1Ii8+PGJmIGdpPSIxMDciIHVlPSIyMjYiIHVzPSIyMjYiLz48YmYgZ2k9IjEwOSIgdWU9IjIyNyIgdXM9IjIyNyIvPjxiZiBnaT0iMTA4IiB1ZT0iMjI4IiB1cz0iMjI4Ii8+PGJmIGdpPSIxMTAiIHVlPSIyMjkiIHVzPSIyMjkiLz48YmYgZ2k9IjE2MCIgdWU9IjIzMCIgdXM9IjIzMCIvPjxiZiBnaT0iMTExIiB1ZT0iMjMxIiB1cz0iMjMxIi8+PGJmIGdpPSIxMTMiIHVlPSIyMzIiIHVzPSIyMzIiLz48YmYgZ2k9IjExMiIgdWU9IjIzMyIgdXM9IjIzMyIvPjxiZiBnaT0iMTE0IiB1ZT0iMjM1IiB1cz0iMjM0Ii8+PGJmIGdpPSIxMTciIHVlPSIyMzYiIHVzPSIyMzYiLz48YmYgZ2k9IjExNiIgdWU9IjIzNyIgdXM9IjIzNyIvPjxiZiBnaT0iMTE4IiB1ZT0iMjM5IiB1cz0iMjM4Ii8+PGJmIGdpPSIyMzMiIHVlPSIyNDAiIHVzPSIyNDAiLz48YmYgZ2k9IjEyMCIgdWU9IjI0MSIgdXM9IjI0MSIvPjxiZiBnaT0iMTIyIiB1ZT0iMjQyIiB1cz0iMjQyIi8+PGJmIGdpPSIxMjEiIHVlPSIyNDMiIHVzPSIyNDMiLz48YmYgZ2k9IjEyMyIgdWU9IjI0NCIgdXM9IjI0NCIvPjxiZiBnaT0iMTI1IiB1ZT0iMjQ1IiB1cz0iMjQ1Ii8+PGJmIGdpPSIxMjQiIHVlPSIyNDYiIHVzPSIyNDYiLz48YmYgZ2k9IjE4NCIgdWU9IjI0NyIgdXM9IjI0NyIvPjxiZiBnaT0iMTYxIiB1ZT0iMjQ4IiB1cz0iMjQ4Ii8+PGJmIGdpPSIxMjciIHVlPSIyNDkiIHVzPSIyNDkiLz48YmYgZ2k9IjEyNiIgdWU9IjI1MCIgdXM9IjI1MCIvPjxiZiBnaT0iMTI4IiB1ZT0iMjUyIiB1cz0iMjUxIi8+PGJmIGdpPSIyMzUiIHVlPSIyNTMiIHVzPSIyNTMiLz48YmYgZ2k9IjIzNyIgdWU9IjI1NCIgdXM9IjI1NCIvPjxiZiBnaT0iMTg2IiB1ZT0iMjU1IiB1cz0iMjU1Ii8+PGJmIGdpPSIyNTEiIHVlPSIyNjMiIHVzPSIyNjIiLz48YmYgZ2k9IjI1MyIgdWU9IjI2OSIgdXM9IjI2OCIvPjxiZiBnaT0iMCIgdWU9IjI3MCIgdXM9IjI3MCIvPjxiZiBnaT0iMCIgdWU9IjI3MSIgdXM9IjI3MSIvPjxiZiBnaT0iMCIgdWU9IjI3MiIgdXM9IjI3MiIvPjxiZiBnaT0iMjU1IiB1ZT0iMjczIiB1cz0iMjczIi8+PGJmIGdpPSIyNDYiIHVlPSIyODciIHVzPSIyODYiLz48YmYgZ2k9IjI0OCIgdWU9IjMwNCIgdXM9IjMwNCIvPjxiZiBnaT0iMjE0IiB1ZT0iMzA1IiB1cz0iMzA1Ii8+PGJmIGdpPSIyMjUiIHVlPSIzMjIiIHVzPSIzMjEiLz48YmYgZ2k9IjE3NiIgdWU9IjMzOSIgdXM9IjMzOCIvPjxiZiBnaT0iMjQ5IiB1ZT0iMzUxIiB1cz0iMzUwIi8+PGJmIGdpPSIyMjciIHVlPSIzNTMiIHVzPSIzNTIiLz48YmYgZ2k9IjE4NyIgdWU9IjM3NiIgdXM9IjM3NiIvPjxiZiBnaT0iMjI5IiB1ZT0iMzgyIiB1cz0iMzgxIi8+PGJmIGdpPSIxNjYiIHVlPSI0MDIiIHVzPSI0MDIiLz48YmYgZ2k9IjIxNSIgdWU9IjcxMCIgdXM9IjcxMCIvPjxiZiBnaT0iMjI0IiB1ZT0iNzExIiB1cz0iNzExIi8+PGJmIGdpPSIyMTgiIHVlPSI3MzAiIHVzPSI3MjgiLz48YmYgZ2k9IjIyMyIgdWU9IjczMSIgdXM9IjczMSIvPjxiZiBnaT0iMjE2IiB1ZT0iNzMyIiB1cz0iNzMyIi8+PGJmIGdpPSIyMjIiIHVlPSI3MzMiIHVzPSI3MzMiLz48YmYgZ2k9IjE1OSIgdWU9IjkzNyIgdXM9IjkzNyIvPjxiZiBnaT0iMTU1IiB1ZT0iOTYwIiB1cz0iOTYwIi8+PGJmIGdpPSIxNzgiIHVlPSI4MjEyIiB1cz0iODIxMSIvPjxiZiBnaT0iMCIgdWU9IjgyMTMiIHVzPSI4MjEzIi8+PGJmIGdpPSIwIiB1ZT0iODIxNCIgdXM9IjgyMTQiLz48YmYgZ2k9IjAiIHVlPSI4MjE1IiB1cz0iODIxNSIvPjxiZiBnaT0iMTgyIiB1ZT0iODIxNyIgdXM9IjgyMTYiLz48YmYgZ2k9IjE5NiIgdWU9IjgyMTgiIHVzPSI4MjE4Ii8+PGJmIGdpPSIwIiB1ZT0iODIxOSIgdXM9IjgyMTkiLz48YmYgZ2k9IjE4MCIgdWU9IjgyMjEiIHVzPSI4MjIwIi8+PGJmIGdpPSIxOTciIHVlPSI4MjIyIiB1cz0iODIyMiIvPjxiZiBnaT0iMCIgdWU9IjgyMjMiIHVzPSI4MjIzIi8+PGJmIGdpPSIxMzAiIHVlPSI4MjI0IiB1cz0iODIyNCIvPjxiZiBnaT0iMTk0IiB1ZT0iODIyNSIgdXM9IjgyMjUiLz48YmYgZ2k9IjEzNSIgdWU9IjgyMjYiIHVzPSI4MjI2Ii8+PGJmIGdpPSIwIiB1ZT0iODIyNyIgdXM9IjgyMjciLz48YmYgZ2k9IjAiIHVlPSI4MjI4IiB1cz0iODIyOCIvPjxiZiBnaT0iMCIgdWU9IjgyMjkiIHVzPSI4MjI5Ii8+PGJmIGdpPSIxNzEiIHVlPSI4MjMwIiB1cz0iODIzMCIvPjxiZiBnaT0iMTk4IiB1ZT0iODI0MCIgdXM9IjgyNDAiLz48YmYgZ2k9IjE5MCIgdWU9IjgyNTAiIHVzPSI4MjQ5Ii8+PGJmIGdpPSIyNTgiIHVlPSI4MzY0IiB1cz0iODM2NCIvPjxiZiBnaT0iMTQwIiB1ZT0iODQ4MiIgdXM9Ijg0ODIiLz48YmYgZ2k9IjE1MiIgdWU9Ijg3MDYiIHVzPSI4NzA2Ii8+PGJmIGdpPSIwIiB1ZT0iODcwNyIgdXM9Ijg3MDciLz48YmYgZ2k9IjAiIHVlPSI4NzA4IiB1cz0iODcwOCIvPjxiZiBnaT0iMCIgdWU9Ijg3MDkiIHVzPSI4NzA5Ii8+PGJmIGdpPSIxNjgiIHVlPSI4NzEwIiB1cz0iODcxMCIvPjxiZiBnaT0iMTU0IiB1ZT0iODcxOSIgdXM9Ijg3MTkiLz48YmYgZ2k9IjAiIHVlPSI4NzIwIiB1cz0iODcyMCIvPjxiZiBnaT0iMTUzIiB1ZT0iODcyMSIgdXM9Ijg3MjEiLz48YmYgZ2k9IjIzOCIgdWU9Ijg3MjIiIHVzPSI4NzIyIi8+PGJmIGdpPSIwIiB1ZT0iODcyMyIgdXM9Ijg3MjMiLz48YmYgZ2k9IjAiIHVlPSI4NzI0IiB1cz0iODcyNCIvPjxiZiBnaT0iMTg4IiB1ZT0iODcyNSIgdXM9Ijg3MjUiLz48YmYgZ2k9IjAiIHVlPSI4NzI2IiB1cz0iODcyNiIvPjxiZiBnaT0iMCIgdWU9Ijg3MjciIHVzPSI4NzI3Ii8+PGJmIGdpPSIwIiB1ZT0iODcyOCIgdXM9Ijg3MjgiLz48YmYgZ2k9IjI1NyIgdWU9Ijg3MjkiIHVzPSI4NzI5Ii8+PGJmIGdpPSIxNjUiIHVlPSI4NzMwIiB1cz0iODczMCIvPjxiZiBnaT0iMCIgdWU9Ijg3MzEiIHVzPSI4NzMxIi8+PGJmIGdpPSIwIiB1ZT0iODczMiIgdXM9Ijg3MzIiLz48YmYgZ2k9IjAiIHVlPSI4NzMzIiB1cz0iODczMyIvPjxiZiBnaT0iMTQ2IiB1ZT0iODczNCIgdXM9Ijg3MzQiLz48YmYgZ2k9IjE1NiIgdWU9Ijg3NDciIHVzPSI4NzQ3Ii8+PGJmIGdpPSIxNjciIHVlPSI4Nzc2IiB1cz0iODc3NiIvPjxiZiBnaT0iMTQzIiB1ZT0iODgwMCIgdXM9Ijg4MDAiLz48YmYgZ2k9IjAiIHVlPSI4ODAxIiB1cz0iODgwMSIvPjxiZiBnaT0iMCIgdWU9Ijg4MDIiIHVzPSI4ODAyIi8+PGJmIGdpPSIwIiB1ZT0iODgwMyIgdXM9Ijg4MDMiLz48YmYgZ2k9IjE0OCIgdWU9Ijg4MDUiIHVzPSI4ODA0Ii8+PGJmIGdpPSIxODUiIHVlPSI5Njc0IiB1cz0iOTY3NCIvPjxiZiBnaT0iMTkyIiB1ZT0iNjQyNTgiIHVzPSI2NDI1NyIvPjxiZiBnaT0iMCIgdWU9IjY1NTM1IiB1cz0iNjU1MzUiLz48L2JmcmFuZ2VzPjxjaWQtd2lkdGhzIHN0YXJ0LWluZGV4PSIwIj48d3ggdz0iNjAyIi8+PHd4IHc9IjAiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48L2NpZC13aWR0aHM+PC9tdWx0aWJ5dGUtZXh0cmFzPjwvZm9udC1tZXRyaWNzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpdGJha2UvZG9jL3RlbXBsYXRlL1ZlcmFNb25vLnR0ZiBiL2JpdGJha2UvZG9jL3RlbXBsYXRlL1ZlcmFNb25vLnR0ZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzlmMGI0Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9kb2MvdGVtcGxhdGUvVmVyYU1vbm8udHRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvZG9jL3RlbXBsYXRlL1ZlcmFNb25vLnhtbCBiL2JpdGJha2UvZG9jL3RlbXBsYXRlL1ZlcmFNb25vLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTBhODY2Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9kb2MvdGVtcGxhdGUvVmVyYU1vbm8ueG1sCkBAIC0wLDAgKzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PGZvbnQtbWV0cmljcyBtZXRyaWNzLXZlcnNpb249IjIiIHR5cGU9IlRZUEUwIj48Zm9udC1uYW1lPkJpdHN0cmVhbVZlcmFTYW5zTW9uby1Sb21hbjwvZm9udC1uYW1lPjxmdWxsLW5hbWU+Qml0c3RyZWFtIFZlcmEgU2FucyBNb25vPC9mdWxsLW5hbWU+PGZhbWlseS1uYW1lPkJpdHN0cmVhbSBWZXJhIFNhbnMgTW9ubzwvZmFtaWx5LW5hbWU+PGVtYmVkLz48Y2FwLWhlaWdodD43Mjk8L2NhcC1oZWlnaHQ+PHgtaGVpZ2h0PjU0NjwveC1oZWlnaHQ+PGFzY2VuZGVyPjc1OTwvYXNjZW5kZXI+PGRlc2NlbmRlcj4tMjQwPC9kZXNjZW5kZXI+PGJib3g+PGxlZnQ+LTQ8L2xlZnQ+PGJvdHRvbT4tMjM1PC9ib3R0b20+PHJpZ2h0PjYwNTwvcmlnaHQ+PHRvcD45Mjg8L3RvcD48L2Jib3g+PGZsYWdzPjM0PC9mbGFncz48c3RlbXY+MDwvc3RlbXY+PGl0YWxpY2FuZ2xlPjA8L2l0YWxpY2FuZ2xlPjxzdWJ0eXBlPlRZUEUwPC9zdWJ0eXBlPjxtdWx0aWJ5dGUtZXh0cmFzPjxjaWQtdHlwZT5DSURGb250VHlwZTI8L2NpZC10eXBlPjxkZWZhdWx0LXdpZHRoPjA8L2RlZmF1bHQtd2lkdGg+PGJmcmFuZ2VzPjxiZiBnaT0iMyIgdWU9IjEyNiIgdXM9IjMyIi8+PGJmIGdpPSIxNzIiIHVlPSIxNjAiIHVzPSIxNjAiLz48YmYgZ2k9IjE2MyIgdWU9IjE2MSIgdXM9IjE2MSIvPjxiZiBnaT0iMTMyIiB1ZT0iMTYzIiB1cz0iMTYyIi8+PGJmIGdpPSIxODkiIHVlPSIxNjQiIHVzPSIxNjQiLz48YmYgZ2k9IjE1MCIgdWU9IjE2NSIgdXM9IjE2NSIvPjxiZiBnaT0iMjMxIiB1ZT0iMTY2IiB1cz0iMTY2Ii8+PGJmIGdpPSIxMzQiIHVlPSIxNjciIHVzPSIxNjciLz48YmYgZ2k9IjE0MiIgdWU9IjE2OCIgdXM9IjE2OCIvPjxiZiBnaT0iMTM5IiB1ZT0iMTY5IiB1cz0iMTY5Ii8+PGJmIGdpPSIxNTciIHVlPSIxNzAiIHVzPSIxNzAiLz48YmYgZ2k9IjE2OSIgdWU9IjE3MSIgdXM9IjE3MSIvPjxiZiBnaT0iMTY0IiB1ZT0iMTcyIiB1cz0iMTcyIi8+PGJmIGdpPSIyNTYiIHVlPSIxNzMiIHVzPSIxNzMiLz48YmYgZ2k9IjEzOCIgdWU9IjE3NCIgdXM9IjE3NCIvPjxiZiBnaT0iMjE3IiB1ZT0iMTc1IiB1cz0iMTc1Ii8+PGJmIGdpPSIxMzEiIHVlPSIxNzYiIHVzPSIxNzYiLz48YmYgZ2k9IjE0NyIgdWU9IjE3NyIgdXM9IjE3NyIvPjxiZiBnaT0iMjQxIiB1ZT0iMTc5IiB1cz0iMTc4Ii8+PGJmIGdpPSIxNDEiIHVlPSIxODAiIHVzPSIxODAiLz48YmYgZ2k9IjE1MSIgdWU9IjE4MSIgdXM9IjE4MSIvPjxiZiBnaT0iMTM2IiB1ZT0iMTgyIiB1cz0iMTgyIi8+PGJmIGdpPSIxOTUiIHVlPSIxODMiIHVzPSIxODMiLz48YmYgZ2k9IjIyMSIgdWU9IjE4NCIgdXM9IjE4NCIvPjxiZiBnaT0iMjQwIiB1ZT0iMTg1IiB1cz0iMTg1Ii8+PGJmIGdpPSIxNTgiIHVlPSIxODYiIHVzPSIxODYiLz48YmYgZ2k9IjE3MCIgdWU9IjE4NyIgdXM9IjE4NyIvPjxiZiBnaT0iMjQzIiB1ZT0iMTkwIiB1cz0iMTg4Ii8+PGJmIGdpPSIxNjIiIHVlPSIxOTEiIHVzPSIxOTEiLz48YmYgZ2k9IjE3MyIgdWU9IjE5MiIgdXM9IjE5MiIvPjxiZiBnaT0iMjAxIiB1ZT0iMTkzIiB1cz0iMTkzIi8+PGJmIGdpPSIxOTkiIHVlPSIxOTQiIHVzPSIxOTQiLz48YmYgZ2k9IjE3NCIgdWU9IjE5NSIgdXM9IjE5NSIvPjxiZiBnaT0iOTgiIHVlPSIxOTciIHVzPSIxOTYiLz48YmYgZ2k9IjE0NCIgdWU9IjE5OCIgdXM9IjE5OCIvPjxiZiBnaT0iMTAwIiB1ZT0iMTk5IiB1cz0iMTk5Ii8+PGJmIGdpPSIyMDMiIHVlPSIyMDAiIHVzPSIyMDAiLz48YmYgZ2k9IjEwMSIgdWU9IjIwMSIgdXM9IjIwMSIvPjxiZiBnaT0iMjAwIiB1ZT0iMjAyIiB1cz0iMjAyIi8+PGJmIGdpPSIyMDIiIHVlPSIyMDMiIHVzPSIyMDMiLz48YmYgZ2k9IjIwNyIgdWU9IjIwNCIgdXM9IjIwNCIvPjxiZiBnaT0iMjA0IiB1ZT0iMjA3IiB1cz0iMjA1Ii8+PGJmIGdpPSIyMzIiIHVlPSIyMDgiIHVzPSIyMDgiLz48YmYgZ2k9IjEwMiIgdWU9IjIwOSIgdXM9IjIwOSIvPjxiZiBnaT0iMjEwIiB1ZT0iMjEwIiB1cz0iMjEwIi8+PGJmIGdpPSIyMDgiIHVlPSIyMTIiIHVzPSIyMTEiLz48YmYgZ2k9IjE3NSIgdWU9IjIxMyIgdXM9IjIxMyIvPjxiZiBnaT0iMTAzIiB1ZT0iMjE0IiB1cz0iMjE0Ii8+PGJmIGdpPSIyMzkiIHVlPSIyMTUiIHVzPSIyMTUiLz48YmYgZ2k9IjE0NSIgdWU9IjIxNiIgdXM9IjIxNiIvPjxiZiBnaT0iMjEzIiB1ZT0iMjE3IiB1cz0iMjE3Ii8+PGJmIGdpPSIyMTEiIHVlPSIyMTkiIHVzPSIyMTgiLz48YmYgZ2k9IjEwNCIgdWU9IjIyMCIgdXM9IjIyMCIvPjxiZiBnaT0iMjM0IiB1ZT0iMjIxIiB1cz0iMjIxIi8+PGJmIGdpPSIyMzYiIHVlPSIyMjIiIHVzPSIyMjIiLz48YmYgZ2k9IjEzNyIgdWU9IjIyMyIgdXM9IjIyMyIvPjxiZiBnaT0iMTA2IiB1ZT0iMjI0IiB1cz0iMjI0Ii8+PGJmIGdpPSIxMDUiIHVlPSIyMjUiIHVzPSIyMjUiLz48YmYgZ2k9IjEwNyIgdWU9IjIyNiIgdXM9IjIyNiIvPjxiZiBnaT0iMTA5IiB1ZT0iMjI3IiB1cz0iMjI3Ii8+PGJmIGdpPSIxMDgiIHVlPSIyMjgiIHVzPSIyMjgiLz48YmYgZ2k9IjExMCIgdWU9IjIyOSIgdXM9IjIyOSIvPjxiZiBnaT0iMTYwIiB1ZT0iMjMwIiB1cz0iMjMwIi8+PGJmIGdpPSIxMTEiIHVlPSIyMzEiIHVzPSIyMzEiLz48YmYgZ2k9IjExMyIgdWU9IjIzMiIgdXM9IjIzMiIvPjxiZiBnaT0iMTEyIiB1ZT0iMjMzIiB1cz0iMjMzIi8+PGJmIGdpPSIxMTQiIHVlPSIyMzUiIHVzPSIyMzQiLz48YmYgZ2k9IjExNyIgdWU9IjIzNiIgdXM9IjIzNiIvPjxiZiBnaT0iMTE2IiB1ZT0iMjM3IiB1cz0iMjM3Ii8+PGJmIGdpPSIxMTgiIHVlPSIyMzkiIHVzPSIyMzgiLz48YmYgZ2k9IjIzMyIgdWU9IjI0MCIgdXM9IjI0MCIvPjxiZiBnaT0iMTIwIiB1ZT0iMjQxIiB1cz0iMjQxIi8+PGJmIGdpPSIxMjIiIHVlPSIyNDIiIHVzPSIyNDIiLz48YmYgZ2k9IjEyMSIgdWU9IjI0MyIgdXM9IjI0MyIvPjxiZiBnaT0iMTIzIiB1ZT0iMjQ0IiB1cz0iMjQ0Ii8+PGJmIGdpPSIxMjUiIHVlPSIyNDUiIHVzPSIyNDUiLz48YmYgZ2k9IjEyNCIgdWU9IjI0NiIgdXM9IjI0NiIvPjxiZiBnaT0iMTg0IiB1ZT0iMjQ3IiB1cz0iMjQ3Ii8+PGJmIGdpPSIxNjEiIHVlPSIyNDgiIHVzPSIyNDgiLz48YmYgZ2k9IjEyNyIgdWU9IjI0OSIgdXM9IjI0OSIvPjxiZiBnaT0iMTI2IiB1ZT0iMjUwIiB1cz0iMjUwIi8+PGJmIGdpPSIxMjgiIHVlPSIyNTIiIHVzPSIyNTEiLz48YmYgZ2k9IjIzNSIgdWU9IjI1MyIgdXM9IjI1MyIvPjxiZiBnaT0iMjM3IiB1ZT0iMjU0IiB1cz0iMjU0Ii8+PGJmIGdpPSIxODYiIHVlPSIyNTUiIHVzPSIyNTUiLz48YmYgZ2k9IjI1MSIgdWU9IjI2MyIgdXM9IjI2MiIvPjxiZiBnaT0iMjUzIiB1ZT0iMjY5IiB1cz0iMjY4Ii8+PGJmIGdpPSIwIiB1ZT0iMjcwIiB1cz0iMjcwIi8+PGJmIGdpPSIwIiB1ZT0iMjcxIiB1cz0iMjcxIi8+PGJmIGdpPSIwIiB1ZT0iMjcyIiB1cz0iMjcyIi8+PGJmIGdpPSIyNTUiIHVlPSIyNzMiIHVzPSIyNzMiLz48YmYgZ2k9IjI0NiIgdWU9IjI4NyIgdXM9IjI4NiIvPjxiZiBnaT0iMjQ4IiB1ZT0iMzA0IiB1cz0iMzA0Ii8+PGJmIGdpPSIyMTQiIHVlPSIzMDUiIHVzPSIzMDUiLz48YmYgZ2k9IjIyNSIgdWU9IjMyMiIgdXM9IjMyMSIvPjxiZiBnaT0iMTc2IiB1ZT0iMzM5IiB1cz0iMzM4Ii8+PGJmIGdpPSIyNDkiIHVlPSIzNTEiIHVzPSIzNTAiLz48YmYgZ2k9IjIyNyIgdWU9IjM1MyIgdXM9IjM1MiIvPjxiZiBnaT0iMTg3IiB1ZT0iMzc2IiB1cz0iMzc2Ii8+PGJmIGdpPSIyMjkiIHVlPSIzODIiIHVzPSIzODEiLz48YmYgZ2k9IjE2NiIgdWU9IjQwMiIgdXM9IjQwMiIvPjxiZiBnaT0iMjE1IiB1ZT0iNzEwIiB1cz0iNzEwIi8+PGJmIGdpPSIyMjQiIHVlPSI3MTEiIHVzPSI3MTEiLz48YmYgZ2k9IjIxOCIgdWU9IjczMCIgdXM9IjcyOCIvPjxiZiBnaT0iMjIzIiB1ZT0iNzMxIiB1cz0iNzMxIi8+PGJmIGdpPSIyMTYiIHVlPSI3MzIiIHVzPSI3MzIiLz48YmYgZ2k9IjIyMiIgdWU9IjczMyIgdXM9IjczMyIvPjxiZiBnaT0iMTU5IiB1ZT0iOTM3IiB1cz0iOTM3Ii8+PGJmIGdpPSIxNTUiIHVlPSI5NjAiIHVzPSI5NjAiLz48YmYgZ2k9IjE3OCIgdWU9IjgyMTIiIHVzPSI4MjExIi8+PGJmIGdpPSIwIiB1ZT0iODIxMyIgdXM9IjgyMTMiLz48YmYgZ2k9IjAiIHVlPSI4MjE0IiB1cz0iODIxNCIvPjxiZiBnaT0iMCIgdWU9IjgyMTUiIHVzPSI4MjE1Ii8+PGJmIGdpPSIxODIiIHVlPSI4MjE3IiB1cz0iODIxNiIvPjxiZiBnaT0iMTk2IiB1ZT0iODIxOCIgdXM9IjgyMTgiLz48YmYgZ2k9IjAiIHVlPSI4MjE5IiB1cz0iODIxOSIvPjxiZiBnaT0iMTgwIiB1ZT0iODIyMSIgdXM9IjgyMjAiLz48YmYgZ2k9IjE5NyIgdWU9IjgyMjIiIHVzPSI4MjIyIi8+PGJmIGdpPSIwIiB1ZT0iODIyMyIgdXM9IjgyMjMiLz48YmYgZ2k9IjEzMCIgdWU9IjgyMjQiIHVzPSI4MjI0Ii8+PGJmIGdpPSIxOTQiIHVlPSI4MjI1IiB1cz0iODIyNSIvPjxiZiBnaT0iMTM1IiB1ZT0iODIyNiIgdXM9IjgyMjYiLz48YmYgZ2k9IjAiIHVlPSI4MjI3IiB1cz0iODIyNyIvPjxiZiBnaT0iMCIgdWU9IjgyMjgiIHVzPSI4MjI4Ii8+PGJmIGdpPSIwIiB1ZT0iODIyOSIgdXM9IjgyMjkiLz48YmYgZ2k9IjE3MSIgdWU9IjgyMzAiIHVzPSI4MjMwIi8+PGJmIGdpPSIxOTgiIHVlPSI4MjQwIiB1cz0iODI0MCIvPjxiZiBnaT0iMTkwIiB1ZT0iODI1MCIgdXM9IjgyNDkiLz48YmYgZ2k9IjI1OCIgdWU9IjgzNjQiIHVzPSI4MzY0Ii8+PGJmIGdpPSIxNDAiIHVlPSI4NDgyIiB1cz0iODQ4MiIvPjxiZiBnaT0iMTUyIiB1ZT0iODcwNiIgdXM9Ijg3MDYiLz48YmYgZ2k9IjAiIHVlPSI4NzA3IiB1cz0iODcwNyIvPjxiZiBnaT0iMCIgdWU9Ijg3MDgiIHVzPSI4NzA4Ii8+PGJmIGdpPSIwIiB1ZT0iODcwOSIgdXM9Ijg3MDkiLz48YmYgZ2k9IjE2OCIgdWU9Ijg3MTAiIHVzPSI4NzEwIi8+PGJmIGdpPSIxNTQiIHVlPSI4NzE5IiB1cz0iODcxOSIvPjxiZiBnaT0iMCIgdWU9Ijg3MjAiIHVzPSI4NzIwIi8+PGJmIGdpPSIxNTMiIHVlPSI4NzIxIiB1cz0iODcyMSIvPjxiZiBnaT0iMjM4IiB1ZT0iODcyMiIgdXM9Ijg3MjIiLz48YmYgZ2k9IjAiIHVlPSI4NzIzIiB1cz0iODcyMyIvPjxiZiBnaT0iMCIgdWU9Ijg3MjQiIHVzPSI4NzI0Ii8+PGJmIGdpPSIxODgiIHVlPSI4NzI1IiB1cz0iODcyNSIvPjxiZiBnaT0iMCIgdWU9Ijg3MjYiIHVzPSI4NzI2Ii8+PGJmIGdpPSIwIiB1ZT0iODcyNyIgdXM9Ijg3MjciLz48YmYgZ2k9IjAiIHVlPSI4NzI4IiB1cz0iODcyOCIvPjxiZiBnaT0iMjU3IiB1ZT0iODcyOSIgdXM9Ijg3MjkiLz48YmYgZ2k9IjE2NSIgdWU9Ijg3MzAiIHVzPSI4NzMwIi8+PGJmIGdpPSIwIiB1ZT0iODczMSIgdXM9Ijg3MzEiLz48YmYgZ2k9IjAiIHVlPSI4NzMyIiB1cz0iODczMiIvPjxiZiBnaT0iMCIgdWU9Ijg3MzMiIHVzPSI4NzMzIi8+PGJmIGdpPSIxNDYiIHVlPSI4NzM0IiB1cz0iODczNCIvPjxiZiBnaT0iMTU2IiB1ZT0iODc0NyIgdXM9Ijg3NDciLz48YmYgZ2k9IjE2NyIgdWU9Ijg3NzYiIHVzPSI4Nzc2Ii8+PGJmIGdpPSIxNDMiIHVlPSI4ODAwIiB1cz0iODgwMCIvPjxiZiBnaT0iMCIgdWU9Ijg4MDEiIHVzPSI4ODAxIi8+PGJmIGdpPSIwIiB1ZT0iODgwMiIgdXM9Ijg4MDIiLz48YmYgZ2k9IjAiIHVlPSI4ODAzIiB1cz0iODgwMyIvPjxiZiBnaT0iMTQ4IiB1ZT0iODgwNSIgdXM9Ijg4MDQiLz48YmYgZ2k9IjE4NSIgdWU9Ijk2NzQiIHVzPSI5Njc0Ii8+PGJmIGdpPSIxOTIiIHVlPSI2NDI1OCIgdXM9IjY0MjU3Ii8+PGJmIGdpPSIwIiB1ZT0iNjU1MzUiIHVzPSI2NTUzNSIvPjwvYmZyYW5nZXM+PGNpZC13aWR0aHMgc3RhcnQtaW5kZXg9IjAiPjx3eCB3PSI2MDIiLz48d3ggdz0iMCIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjwvY2lkLXdpZHRocz48L211bHRpYnl0ZS1leHRyYXM+PC9mb250LW1ldHJpY3M+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9kb2MvdGVtcGxhdGUvY29tcG9uZW50LnRpdGxlLnhzbCBiL2JpdGJha2UvZG9jL3RlbXBsYXRlL2NvbXBvbmVudC50aXRsZS54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFlZjA0MwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvZG9jL3RlbXBsYXRlL2NvbXBvbmVudC50aXRsZS54c2wKQEAgLTAsMCArMSwzOSBAQAorPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKKyAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCisgIHhtbG5zOmQ9Imh0dHA6Ly9kb2Nib29rLm9yZy9ucy9kb2Nib29rIgorICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKKyAgZXhjbHVkZS1yZXN1bHQtcHJlZml4ZXM9ImQiPgorICAKKyAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJjb21wb25lbnQudGl0bGUiPgorICAgIDx4c2w6cGFyYW0gbmFtZT0ibm9kZSIgc2VsZWN0PSIuIi8+CisgICAgCisgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJsZXZlbCI+CisgICAgICA8eHNsOmNob29zZT4KKyAgICAgICAgPHhzbDp3aGVuIHRlc3Q9ImFuY2VzdG9yOjpkOnNlY3Rpb24iPgorICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb3VudChhbmNlc3Rvcjo6ZDpzZWN0aW9uKSsxIi8+CisgICAgICAgIDwveHNsOndoZW4+CisgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJhbmNlc3Rvcjo6ZDpzZWN0NSI+NjwveHNsOndoZW4+CisgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJhbmNlc3Rvcjo6ZDpzZWN0NCI+NTwveHNsOndoZW4+CisgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJhbmNlc3Rvcjo6ZDpzZWN0MyI+NDwveHNsOndoZW4+CisgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJhbmNlc3Rvcjo6ZDpzZWN0MiI+MzwveHNsOndoZW4+CisgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJhbmNlc3Rvcjo6ZDpzZWN0MSI+MjwveHNsOndoZW4+CisgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjE8L3hzbDpvdGhlcndpc2U+CisgICAgICA8L3hzbDpjaG9vc2U+CisgICAgPC94c2w6dmFyaWFibGU+CisgICAgPHhzbDplbGVtZW50IG5hbWU9Imh7JGxldmVsKzF9IiBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPnRpdGxlPC94c2w6YXR0cmlidXRlPgorICAgICAgPHhzbDppZiB0ZXN0PSIkZ2VuZXJhdGUuaWQuYXR0cmlidXRlcyA9IDAiPgorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYW5jaG9yIj4KKyAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibm9kZSIgc2VsZWN0PSIkbm9kZSIvPgorICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb25kaXRpb25hbCIgc2VsZWN0PSIwIi8+CisgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICA8L3hzbDppZj4KKyAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iJG5vZGUiIG1vZGU9Im9iamVjdC50aXRsZS5tYXJrdXAiPgorICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iYWxsb3ctYW5jaG9ycyIgc2VsZWN0PSIxIi8+CisgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+CisgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGVybWFsaW5rIj4KKyAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5vZGUiIHNlbGVjdD0iJG5vZGUiLz4KKyAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgPC94c2w6ZWxlbWVudD4KKyAgPC94c2w6dGVtcGxhdGU+Cis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9kb2MvdGVtcGxhdGUvZGItcGRmLnhzbCBiL2JpdGJha2UvZG9jL3RlbXBsYXRlL2RiLXBkZi54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RkMDY1YQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvZG9jL3RlbXBsYXRlL2RiLXBkZi54c2wKQEAgLTAsMCArMSw2NCBAQAorPD94bWwgdmVyc2lvbj0nMS4wJz8+Cis8eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWxuczpmbz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvRm9ybWF0IiB2ZXJzaW9uPSIxLjAiPgorICAKKyAgPHhzbDppbXBvcnQgaHJlZj0iaHR0cDovL2RvY2Jvb2suc291cmNlZm9yZ2UubmV0L3JlbGVhc2UveHNsL2N1cnJlbnQvZm8vZG9jYm9vay54c2wiIC8+CisKKyAgPCEtLSBjaGVjayBwcm9qZWN0LXBsYW4uc2ggZm9yIGhvdyB0aGlzIGlzIGdlbmVyYXRlZCwgbmVlZGVkIHRvIHR3ZWFrIAorICAgICAgIHRoZSBjb3ZlciBwYWdlICAgICAKKyAgICAtLT4KKyAgPHhzbDppbmNsdWRlIGhyZWY9Ii90bXAvdGl0bGVwYWdlLnhzbCIvPiAKKworICA8IS0tIFRvIGZvcmNlIGEgcGFnZSBicmVhayBpbiBkb2N1bWVudCwgaS5lIHBlciBzZWN0aW9uIGFkZCBhIAorICAgICAgPD9oYXJkLXBhZ2VicmVhaz8+IHRhZy4KKyAgLS0+CisgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icHJvY2Vzc2luZy1pbnN0cnVjdGlvbignaGFyZC1wYWdlYnJlYWsnKSI+CisgICA8Zm86YmxvY2sgYnJlYWstYmVmb3JlPSdwYWdlJyAvPgorIDwveHNsOnRlbXBsYXRlPgorCisgIDwhLS1GaXggZm9yIGRlZnVhbHQgaW5kZW50IGdldHRpbmcgVE9DIGFsbCB3aWVyZC4uCisgICAgICBTZWUgaHR0cDovL3NvdXJjZXMucmVkaGF0LmNvbS9tbC9kb2Nib29rLWFwcHMvMjAwNS1xMS9tc2cwMDQ1NS5odG1sIAorICAgICAgRklYTUU6IG11c3QgYmUgYSBiZXR0ZXIgZml4CisgICAgLS0+CisgIDx4c2w6cGFyYW0gbmFtZT0iYm9keS5zdGFydC5pbmRlbnQiIHNlbGVjdD0iJzAnIi8+CisgIDwhLS08eHNsOnBhcmFtIG5hbWU9InRpdGxlLm1hcmdpbi5sZWZ0IiBzZWxlY3Q9IicwJyIvPi0tPgorCisgIDwhLS0gc3RvcCBsb25nLWlzaCBoZWFkZXIgdGl0bGVzIGdldHRpbmcgd3JhcHBlZCAtLT4KKyAgPHhzbDpwYXJhbSBuYW1lPSJoZWFkZXIuY29sdW1uLndpZHRocyI+MSAxMCAxPC94c2w6cGFyYW0+CisKKyAgPCEtLSBjdXN0b21pc2UgaGVhZGVycyBhbmQgZm9vdGVycyBhIGxpdHRsZSAtLT4gCisKKyAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJoZWFkLnNlcC5ydWxlIj4KKyAgIDx4c2w6aWYgdGVzdD0iJGhlYWRlci5ydWxlICE9IDAiPgorICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJib3JkZXItYm90dG9tLXdpZHRoIj4wLjVwdDwveHNsOmF0dHJpYnV0ZT4KKyAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iYm9yZGVyLWJvdHRvbS1zdHlsZSI+c29saWQ8L3hzbDphdHRyaWJ1dGU+CisgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImJvcmRlci1ib3R0b20tY29sb3IiPiNjY2NjY2M8L3hzbDphdHRyaWJ1dGU+CisgICA8L3hzbDppZj4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJmb290LnNlcC5ydWxlIj4KKyAgICA8eHNsOmlmIHRlc3Q9IiRmb290ZXIucnVsZSAhPSAwIj4KKyAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iYm9yZGVyLXRvcC13aWR0aCI+MC41cHQ8L3hzbDphdHRyaWJ1dGU+CisgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImJvcmRlci10b3Atc3R5bGUiPnNvbGlkPC94c2w6YXR0cmlidXRlPgorICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJib3JkZXItdG9wLWNvbG9yIj4jY2NjY2NjPC94c2w6YXR0cmlidXRlPgorICAgIDwveHNsOmlmPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8eHNsOmF0dHJpYnV0ZS1zZXQgbmFtZT0iaGVhZGVyLmNvbnRlbnQucHJvcGVydGllcyI+CisgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29sb3IiPiNjY2NjY2M8L3hzbDphdHRyaWJ1dGU+CisgIDwveHNsOmF0dHJpYnV0ZS1zZXQ+CisKKyAgPHhzbDphdHRyaWJ1dGUtc2V0IG5hbWU9ImZvb3Rlci5jb250ZW50LnByb3BlcnRpZXMiPgorICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNvbG9yIj4jY2NjY2NjPC94c2w6YXR0cmlidXRlPgorICA8L3hzbDphdHRyaWJ1dGUtc2V0PgorCisgCisgIDwhLS0gZ2VuZXJhbCBzZXR0aW5ncyAtLT4KKworICA8eHNsOnBhcmFtIG5hbWU9ImZvcDEuZXh0ZW5zaW9ucyIgc2VsZWN0PSIxIj48L3hzbDpwYXJhbT4KKyAgPHhzbDpwYXJhbSBuYW1lPSJwYXBlci50eXBlIiBzZWxlY3Q9IidBNCciPjwveHNsOnBhcmFtPgorICA8eHNsOnBhcmFtIG5hbWU9InNlY3Rpb24uYXV0b2xhYmVsIiBzZWxlY3Q9IjEiPjwveHNsOnBhcmFtPgorICA8eHNsOnBhcmFtIG5hbWU9ImJvZHkuZm9udC5mYW1pbHkiIHNlbGVjdD0iJ3ZlcmFzYW5zJyI+PC94c2w6cGFyYW0+CisgIDx4c2w6cGFyYW0gbmFtZT0idGl0bGUuZm9udC5mYW1pbHkiIHNlbGVjdD0iJ3ZlcmFzYW5zJyI+PC94c2w6cGFyYW0+CisgIDx4c2w6cGFyYW0gbmFtZT0ibW9ub3NwYWNlLmZvbnQuZmFtaWx5IiBzZWxlY3Q9Iid2ZXJhbW9ubyciPjwveHNsOnBhcmFtPgorCis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9kb2MvdGVtcGxhdGUvZGl2aXNpb24udGl0bGUueHNsIGIvYml0YmFrZS9kb2MvdGVtcGxhdGUvZGl2aXNpb24udGl0bGUueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljODQzYmMKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2RvYy90ZW1wbGF0ZS9kaXZpc2lvbi50aXRsZS54c2wKQEAgLTAsMCArMSwyNSBAQAorPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKKyAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCisgIHhtbG5zOmQ9Imh0dHA6Ly9kb2Nib29rLm9yZy9ucy9kb2Nib29rIgorICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKKyAgZXhjbHVkZS1yZXN1bHQtcHJlZml4ZXM9ImQiPgorICAKKyAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkaXZpc2lvbi50aXRsZSI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJub2RlIiBzZWxlY3Q9Ii4iLz4KKyAgICAKKyAgICA8aDE+CisgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+dGl0bGU8L3hzbDphdHRyaWJ1dGU+CisgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYW5jaG9yIj4KKyAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5vZGUiIHNlbGVjdD0iJG5vZGUiLz4KKyAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbmRpdGlvbmFsIiBzZWxlY3Q9IjAiLz4KKyAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IiRub2RlIiBtb2RlPSJvYmplY3QudGl0bGUubWFya3VwIj4KKyAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImFsbG93LWFuY2hvcnMiIHNlbGVjdD0iMSIvPgorICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgorICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBlcm1hbGluayI+CisgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJub2RlIiBzZWxlY3Q9IiRub2RlIi8+CisgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgIDwvaDE+CisgIDwveHNsOnRlbXBsYXRlPgorPC94c2w6c3R5bGVzaGVldD4KKwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9kb2MvdGVtcGxhdGUvZHJhZnQucG5nIGIvYml0YmFrZS9kb2MvdGVtcGxhdGUvZHJhZnQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMDUxYTkKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2RvYy90ZW1wbGF0ZS9kcmFmdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9kb2MvdGVtcGxhdGUvZm9wLWNvbmZpZy54bWwgYi9iaXRiYWtlL2RvYy90ZW1wbGF0ZS9mb3AtY29uZmlnLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWNjNWNhCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9kb2MvdGVtcGxhdGUvZm9wLWNvbmZpZy54bWwKQEAgLTAsMCArMSw1OCBAQAorPGZvcCB2ZXJzaW9uPSIxLjAiPgorCisgIDwhLS0gU3RyaWN0IHVzZXIgY29uZmlndXJhdGlvbiAtLT4KKyAgPHN0cmljdC1jb25maWd1cmF0aW9uPnRydWU8L3N0cmljdC1jb25maWd1cmF0aW9uPgorCisgIDwhLS0gU3RyaWN0IEZPIHZhbGlkYXRpb24gLS0+CisgIDxzdHJpY3QtdmFsaWRhdGlvbj50cnVlPC9zdHJpY3QtdmFsaWRhdGlvbj4KKworICAgPCEtLQorICAgIFNldCB0aGUgYmFzZURpciBzbyBjb21tb24vb3BlbmVkaGFuZC5zdmcgcmVmZXJlbmNlcyBpbiBwbGFucyBzdGlsbAorICAgIHdvcmsgb2suIE5vdGUsIHJlbGF0aXZlIGZpbGUgcmVmZXJlbmNlcyB0byBjdXJyZW50IGRpciBzaG91bGQgc3RpbGwgd29yay4KKyAgICAtLT4JCisgIDxiYXNlPi4uL3RlbXBsYXRlPC9iYXNlPgorICA8Zm9udC1iYXNlPi4uL3RlbXBsYXRlPC9mb250LWJhc2U+CisgCisgIDwhLS0gU291cmNlIHJlc29sdXRpb24gaW4gZHBpIChkb3RzL3BpeGVscyBwZXIgaW5jaCkgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgIHNpemUgb2YgcGl4ZWxzIGluIFNWRyBhbmQgYml0bWFwIGltYWdlcywgZGVmYXVsdDogNzJkcGkgLS0+CisgIDwhLS0gPHNvdXJjZS1yZXNvbHV0aW9uPjcyPC9zb3VyY2UtcmVzb2x1dGlvbj4gLS0+CisgIDwhLS0gVGFyZ2V0IHJlc29sdXRpb24gaW4gZHBpIChkb3RzL3BpeGVscyBwZXIgaW5jaCkgZm9yIHNwZWNpZnlpbmcgdGhlCisgICAgICAgdGFyZ2V0IHJlc29sdXRpb24gZm9yIGdlbmVyYXRlZCBiaXRtYXBzLCBkZWZhdWx0OiA3MmRwaSAtLT4KKyAgPCEtLSA8dGFyZ2V0LXJlc29sdXRpb24+NzI8L3RhcmdldC1yZXNvbHV0aW9uPiAtLT4KKyAKKyAgPCEtLSBkZWZhdWx0IHBhZ2UtaGVpZ2h0IGFuZCBwYWdlLXdpZHRoLCBpbiBjYXNlCisgICAgICAgdmFsdWUgaXMgc3BlY2lmaWVkIGFzIGF1dG8gLS0+CisgIDxkZWZhdWx0LXBhZ2Utc2V0dGluZ3MgaGVpZ2h0PSIxMWluIiB3aWR0aD0iOC4yNmluIi8+IAorIAorICA8IS0tIDx1c2UtY2FjaGU+ZmFsc2U8L3VzZS1jYWNoZT4gLS0+CisgCisgIDxyZW5kZXJlcnM+CisgICAgPHJlbmRlcmVyIG1pbWU9ImFwcGxpY2F0aW9uL3BkZiI+CisgICAgICA8Zm9udHM+CisgICAgICAgIDxmb250ICBtZXRyaWNzLWZpbGU9IlZlcmFNb25vLnhtbCIKKyAgICAgICAgICAgICAgIGtlcm5pbmc9InllcyIgCisgICAgICAgICAgICAgICBlbWJlZC11cmw9IlZlcmFNb25vLnR0ZiI+CisgICAgICAgICAgPGZvbnQtdHJpcGxldCBuYW1lPSJ2ZXJhbW9ubyIgc3R5bGU9Im5vcm1hbCIgd2VpZ2h0PSJub3JtYWwiLz4KKyAgICAgICAgPC9mb250PgorCisgICAgICAgIDxmb250ICBtZXRyaWNzLWZpbGU9IlZlcmFNb0JkLnhtbCIKKyAgICAgICAgICAgICAgIGtlcm5pbmc9InllcyIgCisgICAgICAgICAgICAgICBlbWJlZC11cmw9IlZlcmFNb0JkLnR0ZiI+CisgICAgICAgICAgPGZvbnQtdHJpcGxldCBuYW1lPSJ2ZXJhbW9ubyIgc3R5bGU9Im5vcm1hbCIgd2VpZ2h0PSJib2xkIi8+CisgICAgICAgIDwvZm9udD4KKworICAgICAgICA8Zm9udCAgbWV0cmljcy1maWxlPSJWZXJhLnhtbCIKKyAgICAgICAgICAgICAgIGtlcm5pbmc9InllcyIgCisgICAgICAgICAgICAgICBlbWJlZC11cmw9IlZlcmEudHRmIj4KKyAgICAgICAgICA8Zm9udC10cmlwbGV0IG5hbWU9InZlcmFzYW5zIiBzdHlsZT0ibm9ybWFsIiB3ZWlnaHQ9Im5vcm1hbCIvPgorICAgICAgICAgIDxmb250LXRyaXBsZXQgbmFtZT0idmVyYXNhbnMiIHN0eWxlPSJub3JtYWwiIHdlaWdodD0iYm9sZCIvPgorICAgICAgICAgIDxmb250LXRyaXBsZXQgbmFtZT0idmVyYXNhbnMiIHN0eWxlPSJpdGFsaWMiIHdlaWdodD0ibm9ybWFsIi8+CisgICAgICAgICAgPGZvbnQtdHJpcGxldCBuYW1lPSJ2ZXJhc2FucyIgc3R5bGU9Iml0YWxpYyIgd2VpZ2h0PSJib2xkIi8+CisgICAgICAgIDwvZm9udD4KKyAgICAgICAgCisgICAgICAgIDxhdXRvLWRldGVjdC8+CisgICAgICA8L2ZvbnRzPgorICAgIDwvcmVuZGVyZXI+CisgIDwvcmVuZGVyZXJzPgorPC9mb3A+CisKZGlmZiAtLWdpdCBhL2JpdGJha2UvZG9jL3RlbXBsYXRlL2Zvcm1hbC5vYmplY3QuaGVhZGluZy54c2wgYi9iaXRiYWtlL2RvYy90ZW1wbGF0ZS9mb3JtYWwub2JqZWN0LmhlYWRpbmcueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMzkwMGQKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2RvYy90ZW1wbGF0ZS9mb3JtYWwub2JqZWN0LmhlYWRpbmcueHNsCkBAIC0wLDAgKzEsMjEgQEAKKzx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCisgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgorICB4bWxuczpkPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayIKKyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCisgIGV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzPSJkIj4KKyAgCisgIDx4c2w6dGVtcGxhdGUgbmFtZT0iZm9ybWFsLm9iamVjdC5oZWFkaW5nIj4KKyAgICA8eHNsOnBhcmFtIG5hbWU9Im9iamVjdCIgc2VsZWN0PSIuIi8+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJ0aXRsZSI+CisgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IiRvYmplY3QiIG1vZGU9Im9iamVjdC50aXRsZS5tYXJrdXAiPgorICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iYWxsb3ctYW5jaG9ycyIgc2VsZWN0PSIxIi8+CisgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+CisgICAgPC94c2w6cGFyYW0+CisgICAgPHAgY2xhc3M9InRpdGxlIj4KKyAgICAgIDxiPjx4c2w6Y29weS1vZiBzZWxlY3Q9IiR0aXRsZSIvPjwvYj4KKyAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwZXJtYWxpbmsiPgorICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibm9kZSIgc2VsZWN0PSIkb2JqZWN0Ii8+CisgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgIDwvcD4KKyAgPC94c2w6dGVtcGxhdGU+Cis8L3hzbDpzdHlsZXNoZWV0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpdGJha2UvZG9jL3RlbXBsYXRlL2dsb3NzLXBlcm1hbGlua3MueHNsIGIvYml0YmFrZS9kb2MvdGVtcGxhdGUvZ2xvc3MtcGVybWFsaW5rcy54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJmNTgxMQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvZG9jL3RlbXBsYXRlL2dsb3NzLXBlcm1hbGlua3MueHNsCkBAIC0wLDAgKzEsMTQgQEAKKzx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiDQorICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSINCisgIHhtbG5zOmQ9Imh0dHA6Ly9kb2Nib29rLm9yZy9ucy9kb2Nib29rIg0KKyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KKw0KKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZ2xvc3NlbnRyeS9nbG9zc3Rlcm0iPg0KKyAgICA8eHNsOmFwcGx5LWltcG9ydHMvPg0KKyAgICA8eHNsOmlmIHRlc3Q9IiRnZW5lcmF0ZS5wZXJtYWxpbmsgIT0gMCI+DQorICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBlcm1hbGluayI+DQorICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibm9kZSIgc2VsZWN0PSIuLiIvPg0KKyAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+DQorICAgIDwveHNsOmlmPg0KKyAgPC94c2w6dGVtcGxhdGU+DQorPC94c2w6c3R5bGVzaGVldD4NCmRpZmYgLS1naXQgYS9iaXRiYWtlL2RvYy90ZW1wbGF0ZS9wZXJtYWxpbmtzLnhzbCBiL2JpdGJha2UvZG9jL3RlbXBsYXRlL3Blcm1hbGlua3MueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYTFjMTQKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2RvYy90ZW1wbGF0ZS9wZXJtYWxpbmtzLnhzbApAQCAtMCwwICsxLDI1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKKyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCisgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4KKworICA8eHNsOnBhcmFtIG5hbWU9ImdlbmVyYXRlLnBlcm1hbGluayIgc2VsZWN0PSIxIi8+CisgIDx4c2w6cGFyYW0gbmFtZT0icGVybWFsaW5rLnRleHQiPsK2PC94c2w6cGFyYW0+CisKKyAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwZXJtYWxpbmsiPgorICAgIDx4c2w6cGFyYW0gbmFtZT0ibm9kZSIvPgorCisgICAgPHhzbDppZiB0ZXN0PSIkZ2VuZXJhdGUucGVybWFsaW5rICE9ICcwJyI+CisgICAgICA8c3BhbiBjbGFzcz0icGVybWFsaW5rIj4KKyAgICAgICAgPGEgYWx0PSJQZXJtYWxpbmsiIHRpdGxlPSJQZXJtYWxpbmsiPgorICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImhyZWYudGFyZ2V0Ij4KKyAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im9iamVjdCIgIHNlbGVjdD0iJG5vZGUiLz4KKyAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgICAgPC94c2w6YXR0cmlidXRlPgorICAgICAgICAgIDx4c2w6Y29weS1vZiBzZWxlY3Q9IiRwZXJtYWxpbmsudGV4dCIvPgorICAgICAgICA8L2E+CisgICAgICA8L3NwYW4+CisgICAgPC94c2w6aWY+CisgIDwveHNsOnRlbXBsYXRlPgorPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL2JpdGJha2UvZG9jL3RlbXBsYXRlL3NlY3Rpb24udGl0bGUueHNsIGIvYml0YmFrZS9kb2MvdGVtcGxhdGUvc2VjdGlvbi50aXRsZS54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM2ZmY5YQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvZG9jL3RlbXBsYXRlL3NlY3Rpb24udGl0bGUueHNsCkBAIC0wLDAgKzEsNTUgQEAKKzx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCisgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgorICB4bWxuczpkPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayIKKyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIGV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzPSJkIj4KKworICA8eHNsOnRlbXBsYXRlIG5hbWU9InNlY3Rpb24udGl0bGUiPgorICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic2VjdGlvbiIKKyAgICAgIHNlbGVjdD0iKGFuY2VzdG9yOjpzZWN0aW9uIHwKKyAgICAgICAgICAgICAgIGFuY2VzdG9yOjpzaW1wbGVzZWN0fAorICAgICAgICAgICAgICAgYW5jZXN0b3I6OnNlY3QxfAorICAgICAgICAgICAgICAgYW5jZXN0b3I6OnNlY3QyfAorICAgICAgICAgICAgICAgYW5jZXN0b3I6OnNlY3QzfAorICAgICAgICAgICAgICAgYW5jZXN0b3I6OnNlY3Q0fAorICAgICAgICAgICAgICAgYW5jZXN0b3I6OnNlY3Q1KVtsYXN0KCldIi8+CisKKyAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InJlbmRlcmFzIj4KKyAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHNlY3Rpb24vQHJlbmRlcmFzID0gJ3NlY3QxJyI+MTwveHNsOndoZW4+CisgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkc2VjdGlvbi9AcmVuZGVyYXMgPSAnc2VjdDInIj4yPC94c2w6d2hlbj4KKyAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRzZWN0aW9uL0ByZW5kZXJhcyA9ICdzZWN0MyciPjM8L3hzbDp3aGVuPgorICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHNlY3Rpb24vQHJlbmRlcmFzID0gJ3NlY3Q0JyI+NDwveHNsOndoZW4+CisgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkc2VjdGlvbi9AcmVuZGVyYXMgPSAnc2VjdDUnIj41PC94c2w6d2hlbj4KKyAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IicnIi8+PC94c2w6b3RoZXJ3aXNlPgorICAgICAgPC94c2w6Y2hvb3NlPgorICAgIDwveHNsOnZhcmlhYmxlPgorCisgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJsZXZlbCI+CisgICAgICA8eHNsOmNob29zZT4KKyAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRyZW5kZXJhcyAhPSAnJyI+CisgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZW5kZXJhcyIvPgorICAgICAgICA8L3hzbDp3aGVuPgorICAgICAgICA8eHNsOm90aGVyd2lzZT4KKyAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic2VjdGlvbi5sZXZlbCI+CisgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibm9kZSIgc2VsZWN0PSIkc2VjdGlvbiIvPgorICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgIDwveHNsOm90aGVyd2lzZT4KKyAgICAgIDwveHNsOmNob29zZT4KKyAgICA8L3hzbDp2YXJpYWJsZT4KKworICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzZWN0aW9uLmhlYWRpbmciPgorICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNlY3Rpb24iIHNlbGVjdD0iJHNlY3Rpb24iLz4KKyAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJsZXZlbCIgc2VsZWN0PSIkbGV2ZWwiLz4KKyAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0aXRsZSI+CisgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iJHNlY3Rpb24iIG1vZGU9Im9iamVjdC50aXRsZS5tYXJrdXAiPgorICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJhbGxvdy1hbmNob3JzIiBzZWxlY3Q9IjEiLz4KKyAgICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgorICAgICAgICA8eHNsOmlmIHRlc3Q9IiRsZXZlbCAmZ3Q7IDAiPgorICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwZXJtYWxpbmsiPgorICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5vZGUiIHNlbGVjdD0iJHNlY3Rpb24iLz4KKyAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgICAgICA8L3hzbDppZj4KKyAgICAgIDwveHNsOndpdGgtcGFyYW0+CisgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgPC94c2w6dGVtcGxhdGU+Cis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9kb2MvdGVtcGxhdGUvdGl0bGVwYWdlLnRlbXBsYXRlcy54bWwgYi9iaXRiYWtlL2RvYy90ZW1wbGF0ZS90aXRsZXBhZ2UudGVtcGxhdGVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGVjMTFhCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9kb2MvdGVtcGxhdGUvdGl0bGVwYWdlLnRlbXBsYXRlcy54bWwKQEAgLTAsMCArMSwxMjU5IEBACis8IURPQ1RZUEUgdDp0ZW1wbGF0ZXMgWworPCFFTlRJVFkgaHNpemUwICIxMHB0Ij4KKzwhRU5USVRZIGhzaXplMSAiMTJwdCI+Cis8IUVOVElUWSBoc2l6ZTIgIjE0LjRwdCI+Cis8IUVOVElUWSBoc2l6ZTMgIjE3LjI4cHQiPgorPCFFTlRJVFkgaHNpemU0ICIyMC43MzZwdCI+Cis8IUVOVElUWSBoc2l6ZTUgIjI0Ljg4MzJwdCI+Cis8IUVOVElUWSBoc2l6ZTBzcGFjZSAiNy41cHQiPiA8IS0tIDAuNzUgKiBoc2l6ZTAgLS0+Cis8IUVOVElUWSBoc2l6ZTFzcGFjZSAiOXB0Ij4gPCEtLSAwLjc1ICogaHNpemUxIC0tPgorPCFFTlRJVFkgaHNpemUyc3BhY2UgIjEwLjhwdCI+IDwhLS0gMC43NSAqIGhzaXplMiAtLT4KKzwhRU5USVRZIGhzaXplM3NwYWNlICIxMi45NnB0Ij4gPCEtLSAwLjc1ICogaHNpemUzIC0tPgorPCFFTlRJVFkgaHNpemU0c3BhY2UgIjE1LjU1MnB0Ij4gPCEtLSAwLjc1ICogaHNpemU0IC0tPgorPCFFTlRJVFkgaHNpemU1c3BhY2UgIjE4LjY2MjRwdCI+IDwhLS0gMC43NSAqIGhzaXplNSAtLT4KK10+Cis8dDp0ZW1wbGF0ZXMgeG1sbnM6dD0iaHR0cDovL253YWxzaC5jb20vZG9jYm9vay94c2wvdGVtcGxhdGUvMS4wIgorCSAgICAgeG1sbnM6cGFyYW09Imh0dHA6Ly9ud2Fsc2guY29tL2RvY2Jvb2sveHNsL3RlbXBsYXRlLzEuMC9wYXJhbSIKKyAgICAgICAgICAgICB4bWxuczpmbz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvRm9ybWF0IgorICAgICAgICAgICAgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAkSWQ6IHRpdGxlcGFnZS50ZW1wbGF0ZXMueG1sLHYgMS4yMyAyMDAzLzEyLzE2IDAwOjMwOjQ5IGJvYnN0YXl0b24gRXhwICQKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRG9jQm9vayBYU0wgU3R5bGVzaGVldCBkaXN0cmlidXRpb24uCisgICAgIFNlZSAuLi9SRUFETUUgb3IgaHR0cDovL2RvY2Jvb2suc2YubmV0LyBmb3IgY29weXJpZ2h0CisgICAgIGFuZCBvdGhlciBpbmZvcm1hdGlvbi4KKworICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworPHQ6dGl0bGVwYWdlIHQ6ZWxlbWVudD0iYXJ0aWNsZSIgdDp3cmFwcGVyPSJmbzpibG9jayIKKyAgICAgICAgICAgICBmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSI+CisKKyAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJyZWN0byIKKyAgICAgICAgICAgICB0ZXh0LWFsaWduPSJjZW50ZXIiPgorCisgICAgPG1lZGlhb2JqZWN0Lz4KKworICAgIDx0aXRsZSB0Om5hbWVkLXRlbXBsYXRlPSJjb21wb25lbnQudGl0bGUiCisJICAgcGFyYW06bm9kZT0iYW5jZXN0b3Itb3Itc2VsZjo6YXJ0aWNsZVsxXSIKKwkgICBrZWVwLXdpdGgtbmV4dD0iYWx3YXlzIgorCSAgIGZvbnQtc2l6ZT0iJmhzaXplNTsiCisJICAgZm9udC13ZWlnaHQ9ImJvbGQiLz4KKworICAgIDxzdWJ0aXRsZSBwYXJhbTpub2RlPSJhbmNlc3Rvci1vci1zZWxmOjphcnRpY2xlWzFdIgorCSAgIGtlZXAtd2l0aC1uZXh0PSJhbHdheXMiCisJICAgZm9udC1zaXplPSImaHNpemUzOyIKKwkgICBmb250LXdlaWdodD0iYm9sZCIKKyAgICAgICBzcGFjZS1hZnRlcj0iMC44ZW0iLz4KKworICAgIDxjb3JwYXV0aG9yIHNwYWNlLWJlZm9yZT0iMC41ZW0iCisgICAgICAgICAgICAgICAgZm9udC1zaXplPSImaHNpemUzOyIvPgorICAgIDxhdXRob3Jncm91cCBzcGFjZS1iZWZvcmU9IjAuNWVtIgorICAgICAgICAgICAgICAgICBmb250LXNpemU9IiZoc2l6ZTI7Ii8+CisgICAgPGF1dGhvciBzcGFjZS1iZWZvcmU9IjAuNWVtIgorICAgICAgICAgICAgZm9udC1zaXplPSImaHNpemUyOyIKKyAgICAgICAgICAgIHNwYWNlLWFmdGVyPSIwLjhlbSIvPgorCisgICAgPGVtYWlsIGZvbnQtc2l6ZT0iJmhzaXplMjsiLz4KKworICAgIDxvdGhlcmNyZWRpdCBzcGFjZS1iZWZvcmU9IjAuNWVtIi8+CisgICAgPHJlbGVhc2VpbmZvIHNwYWNlLWJlZm9yZT0iMC41ZW0iLz4KKyAgICA8Y29weXJpZ2h0IHNwYWNlLWJlZm9yZT0iMC41ZW0iLz4KKyAgICA8bGVnYWxub3RpY2UgdGV4dC1hbGlnbj0ic3RhcnQiCisgICAgICAgICAgICAgICAgIG1hcmdpbi1sZWZ0PSIwLjVpbiIKKyAgICAgICAgICAgICAgICAgbWFyZ2luLXJpZ2h0PSIwLjVpbiIKKyAgICAgICAgICAgICAgICAgZm9udC1mYW1pbHk9InskYm9keS5mb250c2V0fSIvPgorICAgIDxwdWJkYXRlIHNwYWNlLWJlZm9yZT0iMC41ZW0iLz4KKwk8cGFyYT48L3BhcmE+CisgICAgPHJldmlzaW9uIHNwYWNlLWJlZm9yZT0iMC41ZW0iLz4KKyAgICA8cmV2aGlzdG9yeSBzcGFjZS1iZWZvcmU9IjAuNWVtIi8+CisgICAgPGFic3RyYWN0IHNwYWNlLWJlZm9yZT0iMC41ZW0iCisJICAgICAgdGV4dC1hbGlnbj0ic3RhcnQiCisJICAgICAgbWFyZ2luLWxlZnQ9IjAuNWluIgorICAgICAgICAgICAgICBtYXJnaW4tcmlnaHQ9IjAuNWluIgorICAgICAgICAgICAgICBmb250LWZhbWlseT0ieyRib2R5LmZvbnRzZXR9Ii8+CisKKyAgICA8cGFyYT48L3BhcmE+CisgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InZlcnNvIj4KKyAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgIDx0OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisgIDwvdDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorCisgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJyZWN0byI+CisgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorCisgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJ2ZXJzbyI+CisgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorPC90OnRpdGxlcGFnZT4KKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworPHQ6dGl0bGVwYWdlIHQ6ZWxlbWVudD0ic2V0IiB0OndyYXBwZXI9ImZvOmJsb2NrIj4KKyAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJyZWN0byI+CisgICAgICA8dGl0bGUKKwkgICAgIHQ6bmFtZWQtdGVtcGxhdGU9ImRpdmlzaW9uLnRpdGxlIgorCSAgICAgcGFyYW06bm9kZT0iYW5jZXN0b3Itb3Itc2VsZjo6c2V0WzFdIgorCSAgICAgdGV4dC1hbGlnbj0iY2VudGVyIgorCSAgICAgZm9udC1zaXplPSImaHNpemU1OyIKKwkgICAgIHNwYWNlLWJlZm9yZT0iJmhzaXplNXNwYWNlOyIKKwkgICAgIGZvbnQtd2VpZ2h0PSJib2xkIgorCSAgICAgZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iLz4KKyAgICA8c3VidGl0bGUKKwkgICAgICBmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSIKKwkgICAgICB0ZXh0LWFsaWduPSJjZW50ZXIiLz4KKyAgICA8Y29ycGF1dGhvci8+CisgICAgPGF1dGhvcmdyb3VwLz4KKyAgICA8YXV0aG9yLz4KKyAgICA8b3RoZXJjcmVkaXQvPgorICAgIDxyZWxlYXNlaW5mby8+CisgICAgPGNvcHlyaWdodC8+CisgICAgPGxlZ2Fsbm90aWNlLz4KKyAgICA8cHViZGF0ZS8+CisgICAgPHJldmlzaW9uLz4KKyAgICA8cmV2aGlzdG9yeS8+CisgICAgPGFic3RyYWN0Lz4KKyAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0idmVyc28iPgorICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgPHQ6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKyAgPC90OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisKKyAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InJlY3RvIj4KKyAgPC90OnRpdGxlcGFnZS1iZWZvcmU+CisKKyAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InZlcnNvIj4KKyAgPC90OnRpdGxlcGFnZS1iZWZvcmU+Cis8L3Q6dGl0bGVwYWdlPgorCis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDx0OnRpdGxlcGFnZSB0OmVsZW1lbnQ9ImJvb2siIHQ6d3JhcHBlcj0iZm86YmxvY2siPgorICAgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0icmVjdG8iPgorCisgICAgICA8bWVkaWFvYmplY3QvPgorCis8IS0tCisKKyMgSWYgeW91IGxlYXZlIHRoaXMgYmxvY2sgb2YgY29kZSBpbiB0aGVuIHRoZSB0ZXh0IHRpdGxlIGluIHRoZQorIyA8dGl0bGU+Qml0QmFrZSBVc2VyIE1hbnVhbDwvdGl0bGU+IHN0YXRlbWVudCBvZiB0aGUKKyMgYml0YmFrZS11c2VyLW1hbnVhbC54bWwgZmlsZSBpcyByZW5kZXJlZCBvbiB0aGUgdGl0bGUgcGFnZSBiZWxvdyB0aGUKKyMgaW1hZ2UuICBDb21tZW50aW5nIGl0IG91dCBnZXRzIGl0IG91dCBvZiB0aGVyZSB5ZXQgYWxsb3dzIGl0CisjIHRvIGJlIHJldGFpbmVkIGluIHRoZSB0YWIgdGV4dCBmb3IgdGhlIEhUTUwgdmVyc2lvbiBvZiB0aGUKKyMgbWFudWFsLgorCisgICAgICA8dGl0bGUKKwkgICAgIHQ6bmFtZWQtdGVtcGxhdGU9ImRpdmlzaW9uLnRpdGxlIgorCSAgICAgcGFyYW06bm9kZT0iYW5jZXN0b3Itb3Itc2VsZjo6Ym9va1sxXSIKKwkgICAgIHRleHQtYWxpZ249ImNlbnRlciIKKwkgICAgIGZvbnQtc2l6ZT0iJmhzaXplNTsiCisJICAgICBzcGFjZS1iZWZvcmU9IiZoc2l6ZTVzcGFjZTsiCisJICAgICBmb250LXdlaWdodD0iYm9sZCIKKwkgICAgIGZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9Ii8+CistLT4KKyAgICAgIDxzdWJ0aXRsZQorCQl0ZXh0LWFsaWduPSJjZW50ZXIiCisJCWZvbnQtc2l6ZT0iJmhzaXplNDsiCisJCXNwYWNlLWJlZm9yZT0iJmhzaXplNHNwYWNlOyIKKwkJZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iLz4KKyAgICAgIDxjb3JwYXV0aG9yIGZvbnQtc2l6ZT0iJmhzaXplMzsiCisJCSAga2VlcC13aXRoLW5leHQ9ImFsd2F5cyIKKwkJICBzcGFjZS1iZWZvcmU9IjJpbiIvPgorICAgICAgPGF1dGhvcmdyb3VwIHNwYWNlLWJlZm9yZT0iMmluIi8+CisgICAgICA8YXV0aG9yIGZvbnQtc2l6ZT0iJmhzaXplMzsiCisJICAgICAgc3BhY2UtYmVmb3JlPSImaHNpemUyc3BhY2U7IgorCSAgICAgIGtlZXAtd2l0aC1uZXh0PSJhbHdheXMiLz4KKyAgICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJ2ZXJzbyI+Cis8IS0tCisjIElmIHlvdSBsZWF2ZSB0aGlzIGJsb2NrIG9mIGNvZGUgaW4gdGhlbiB0aGUgdGV4dCB0aXRsZSBpbiB0aGUKKyMgPHRpdGxlPkJpdEJha2UgVXNlciBNYW51YWw8L3RpdGxlPiBzdGF0ZW1lbnQgb2YgdGhlCisjIGJpdGJha2UtdXNlci1tYW51YWwueG1sIGZpbGUgaXMgcmVuZGVyZWQgb24gdGhlIHRpdGxlIHBhZ2UgYmVsb3cgdGhlCisjIGltYWdlLiAgQ29tbWVudGluZyBpdCBvdXQgZ2V0cyBpdCBvdXQgb2YgdGhlcmUgeWV0IGFsbG93cyBpdAorIyB0byBiZSByZXRhaW5lZCBpbiB0aGUgdGFiIHRleHQgZm9yIHRoZSBIVE1MIHZlcnNpb24gb2YgdGhlCisjIG1hbnVhbC4KKworICAgICAgPHRpdGxlCisJICAgICB0Om5hbWVkLXRlbXBsYXRlPSJib29rLnZlcnNvLnRpdGxlIgorCSAgICAgZm9udC1zaXplPSImaHNpemUyOyIKKwkgICAgIGZvbnQtd2VpZ2h0PSJib2xkIgorCSAgICAgZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iLz4KKy0tPgorICAgICAgPGNvcnBhdXRob3IvPgorICAgICAgPGF1dGhvcmdyb3VwIHQ6bmFtZWQtdGVtcGxhdGU9InZlcnNvLmF1dGhvcmdyb3VwIi8+CisgICAgICA8YXV0aG9yLz4KKyAgICAgIDxvdGhlcmNyZWRpdC8+CisgICAgICA8cHViZGF0ZSBzcGFjZS1iZWZvcmU9IjFlbSIvPgorICAgICAgPGNvcHlyaWdodC8+CisgICAgICA8YWJzdHJhY3QvPgorICAgICAgPGxlZ2Fsbm90aWNlIGZvbnQtc2l6ZT0iOHB0Ii8+CisgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICA8dDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorICAgICAgPGZvOmJsb2NrIGJyZWFrLWFmdGVyPSJwYWdlIi8+CisgIDwvdDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorCisgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJyZWN0byI+CisgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorCisgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJ2ZXJzbyI+CisgICAgICA8Zm86YmxvY2sgYnJlYWstYWZ0ZXI9InBhZ2UiLz4KKyAgPC90OnRpdGxlcGFnZS1iZWZvcmU+Cis8L3Q6dGl0bGVwYWdlPgorCis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCis8dDp0aXRsZXBhZ2UgdDplbGVtZW50PSJwYXJ0IiB0OndyYXBwZXI9ImZvOmJsb2NrIj4KKyAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJyZWN0byI+CisgICAgICA8dGl0bGUKKwkgICAgIHQ6bmFtZWQtdGVtcGxhdGU9ImRpdmlzaW9uLnRpdGxlIgorCSAgICAgcGFyYW06bm9kZT0iYW5jZXN0b3Itb3Itc2VsZjo6cGFydFsxXSIKKwkgICAgIHRleHQtYWxpZ249ImNlbnRlciIKKwkgICAgIGZvbnQtc2l6ZT0iJmhzaXplNTsiCisJICAgICBzcGFjZS1iZWZvcmU9IiZoc2l6ZTVzcGFjZTsiCisJICAgICBmb250LXdlaWdodD0iYm9sZCIKKwkgICAgIGZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9Ii8+CisgICAgPHN1YnRpdGxlCisJICAgICAgdGV4dC1hbGlnbj0iY2VudGVyIgorCSAgICAgIGZvbnQtc2l6ZT0iJmhzaXplNDsiCisJICAgICAgc3BhY2UtYmVmb3JlPSImaHNpemU0c3BhY2U7IgorCSAgICAgIGZvbnQtd2VpZ2h0PSdib2xkJworCSAgICAgIGZvbnQtc3R5bGU9J2l0YWxpYycKKwkgICAgICBmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSIvPgorICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJ2ZXJzbyI+CisgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICA8dDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorICA8L3Q6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKworICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0icmVjdG8iPgorICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKworICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0idmVyc28iPgorICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKzwvdDp0aXRsZXBhZ2U+CisKKzx0OnRpdGxlcGFnZSB0OmVsZW1lbnQ9InBhcnRpbnRybyIgdDp3cmFwcGVyPSJmbzpibG9jayI+CisgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0icmVjdG8iPgorICAgIDx0aXRsZQorCSAgIHRleHQtYWxpZ249ImNlbnRlciIKKwkgICBmb250LXNpemU9IiZoc2l6ZTU7IgorCSAgIGZvbnQtd2VpZ2h0PSJib2xkIgorCSAgIHNwYWNlLWJlZm9yZT0iMWVtIgorCSAgIGZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9Ii8+CisgICAgPHN1YnRpdGxlCisJICAgICAgdGV4dC1hbGlnbj0iY2VudGVyIgorCSAgICAgIGZvbnQtc2l6ZT0iJmhzaXplMjsiCisJICAgICAgZm9udC13ZWlnaHQ9ImJvbGQiCisJICAgICAgZm9udC1zdHlsZT0iaXRhbGljIgorCSAgICAgIGZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9Ii8+CisgICAgPGNvcnBhdXRob3IvPgorICAgIDxhdXRob3Jncm91cC8+CisgICAgPGF1dGhvci8+CisgICAgPG90aGVyY3JlZGl0Lz4KKyAgICA8cmVsZWFzZWluZm8vPgorICAgIDxjb3B5cmlnaHQvPgorICAgIDxsZWdhbG5vdGljZS8+CisgICAgPHB1YmRhdGUvPgorICAgIDxyZXZpc2lvbi8+CisgICAgPHJldmhpc3RvcnkvPgorICAgIDxhYnN0cmFjdC8+CisgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InZlcnNvIj4KKyAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgIDx0OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisgIDwvdDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorCisgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJyZWN0byI+CisgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorCisgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJ2ZXJzbyI+CisgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorPC90OnRpdGxlcGFnZT4KKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworPHQ6dGl0bGVwYWdlIHQ6ZWxlbWVudD0icmVmZXJlbmNlIiB0OndyYXBwZXI9ImZvOmJsb2NrIj4KKyAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJyZWN0byI+CisgICAgICA8dGl0bGUKKwkgICAgIHQ6bmFtZWQtdGVtcGxhdGU9ImRpdmlzaW9uLnRpdGxlIgorCSAgICAgcGFyYW06bm9kZT0iYW5jZXN0b3Itb3Itc2VsZjo6cmVmZXJlbmNlWzFdIgorCSAgICAgdGV4dC1hbGlnbj0iY2VudGVyIgorCSAgICAgZm9udC1zaXplPSImaHNpemU1OyIKKwkgICAgIHNwYWNlLWJlZm9yZT0iJmhzaXplNXNwYWNlOyIKKwkgICAgIGZvbnQtd2VpZ2h0PSJib2xkIgorCSAgICAgZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iLz4KKyAgICA8c3VidGl0bGUKKwkgICAgICBmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSIKKwkgICAgICB0ZXh0LWFsaWduPSJjZW50ZXIiLz4KKyAgICA8Y29ycGF1dGhvci8+CisgICAgPGF1dGhvcmdyb3VwLz4KKyAgICA8YXV0aG9yLz4KKyAgICA8b3RoZXJjcmVkaXQvPgorICAgIDxyZWxlYXNlaW5mby8+CisgICAgPGNvcHlyaWdodC8+CisgICAgPGxlZ2Fsbm90aWNlLz4KKyAgICA8cHViZGF0ZS8+CisgICAgPHJldmlzaW9uLz4KKyAgICA8cmV2aGlzdG9yeS8+CisgICAgPGFic3RyYWN0Lz4KKyAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0idmVyc28iPgorICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgPHQ6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKyAgPC90OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisKKyAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InJlY3RvIj4KKyAgPC90OnRpdGxlcGFnZS1iZWZvcmU+CisKKyAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InZlcnNvIj4KKyAgPC90OnRpdGxlcGFnZS1iZWZvcmU+Cis8L3Q6dGl0bGVwYWdlPgorCis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCis8dDp0aXRsZXBhZ2UgdDplbGVtZW50PSJyZWZzeW5vcHNpc2RpdiIgdDp3cmFwcGVyPSJmbzpibG9jayI+CisgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0icmVjdG8iPgorICAgIDx0aXRsZQorCSAgIGZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9Ii8+CisgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InZlcnNvIj4KKyAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgIDx0OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisgIDwvdDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorCisgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJyZWN0byI+CisgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorCisgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJ2ZXJzbyI+CisgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorPC90OnRpdGxlcGFnZT4KKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworPHQ6dGl0bGVwYWdlIHQ6ZWxlbWVudD0icmVmc2VjdGlvbiIgdDp3cmFwcGVyPSJmbzpibG9jayI+CisgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0icmVjdG8iPgorICAgIDx0aXRsZQorCSAgIGZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9Ii8+CisgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InZlcnNvIj4KKyAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgIDx0OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisgIDwvdDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorCisgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJyZWN0byI+CisgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorCisgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJ2ZXJzbyI+CisgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorPC90OnRpdGxlcGFnZT4KKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworPHQ6dGl0bGVwYWdlIHQ6ZWxlbWVudD0icmVmc2VjdDEiIHQ6d3JhcHBlcj0iZm86YmxvY2siPgorICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InJlY3RvIj4KKyAgICA8dGl0bGUKKwkgICBmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSIvPgorICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJ2ZXJzbyI+CisgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICA8dDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorICA8L3Q6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKworICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0icmVjdG8iPgorICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKworICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0idmVyc28iPgorICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKzwvdDp0aXRsZXBhZ2U+CisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKzx0OnRpdGxlcGFnZSB0OmVsZW1lbnQ9InJlZnNlY3QyIiB0OndyYXBwZXI9ImZvOmJsb2NrIj4KKyAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJyZWN0byI+CisgICAgPHRpdGxlCisJICAgZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iLz4KKyAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0idmVyc28iPgorICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgPHQ6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKyAgPC90OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisKKyAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InJlY3RvIj4KKyAgPC90OnRpdGxlcGFnZS1iZWZvcmU+CisKKyAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InZlcnNvIj4KKyAgPC90OnRpdGxlcGFnZS1iZWZvcmU+Cis8L3Q6dGl0bGVwYWdlPgorCis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCis8dDp0aXRsZXBhZ2UgdDplbGVtZW50PSJyZWZzZWN0MyIgdDp3cmFwcGVyPSJmbzpibG9jayI+CisgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0icmVjdG8iPgorICAgIDx0aXRsZQorCSAgIGZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9Ii8+CisgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InZlcnNvIj4KKyAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgIDx0OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisgIDwvdDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorCisgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJyZWN0byI+CisgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorCisgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJ2ZXJzbyI+CisgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorPC90OnRpdGxlcGFnZT4KKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8dDp0aXRsZXBhZ2UgdDplbGVtZW50PSJkZWRpY2F0aW9uIiB0OndyYXBwZXI9ImZvOmJsb2NrIj4KKyAgICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InJlY3RvIj4KKyAgICAgIDx0aXRsZQorCSAgICAgdDpmb3JjZT0iMSIKKwkgICAgIHQ6bmFtZWQtdGVtcGxhdGU9ImNvbXBvbmVudC50aXRsZSIKKwkgICAgIHBhcmFtOm5vZGU9ImFuY2VzdG9yLW9yLXNlbGY6OmRlZGljYXRpb25bMV0iCisJICAgICBtYXJnaW4tbGVmdD0ieyR0aXRsZS5tYXJnaW4ubGVmdH0iCisJICAgICBmb250LXNpemU9IiZoc2l6ZTU7IgorCSAgICAgZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iCisJICAgICBmb250LXdlaWdodD0iYm9sZCIvPgorICAgICAgPHN1YnRpdGxlCisJCWZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9Ii8+CisgICAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0idmVyc28iPgorICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgPHQ6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKyAgPC90OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisKKyAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InJlY3RvIj4KKyAgPC90OnRpdGxlcGFnZS1iZWZvcmU+CisKKyAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InZlcnNvIj4KKyAgPC90OnRpdGxlcGFnZS1iZWZvcmU+Cis8L3Q6dGl0bGVwYWdlPgorCis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDx0OnRpdGxlcGFnZSB0OmVsZW1lbnQ9InByZWZhY2UiIHQ6d3JhcHBlcj0iZm86YmxvY2siPgorICAgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0icmVjdG8iPgorICAgICAgPHRpdGxlCisJICAgICB0OmZvcmNlPSIxIgorCSAgICAgdDpuYW1lZC10ZW1wbGF0ZT0iY29tcG9uZW50LnRpdGxlIgorCSAgICAgcGFyYW06bm9kZT0iYW5jZXN0b3Itb3Itc2VsZjo6cHJlZmFjZVsxXSIKKwkgICAgIG1hcmdpbi1sZWZ0PSJ7JHRpdGxlLm1hcmdpbi5sZWZ0fSIKKwkgICAgIGZvbnQtc2l6ZT0iJmhzaXplNTsiCisJICAgICBmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSIKKwkgICAgIGZvbnQtd2VpZ2h0PSJib2xkIi8+CisgICAgICA8c3VidGl0bGUKKwkJZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iLz4KKyAgICAgIDxjb3JwYXV0aG9yLz4KKyAgICAgIDxhdXRob3Jncm91cC8+CisgICAgICA8YXV0aG9yLz4KKyAgICAgIDxvdGhlcmNyZWRpdC8+CisgICAgICA8cmVsZWFzZWluZm8vPgorICAgICAgPGNvcHlyaWdodC8+CisgICAgICA8bGVnYWxub3RpY2UvPgorICAgICAgPHB1YmRhdGUvPgorICAgICAgPHJldmlzaW9uLz4KKyAgICAgIDxyZXZoaXN0b3J5Lz4KKyAgICAgIDxhYnN0cmFjdC8+CisgICAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0idmVyc28iPgorICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgPHQ6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKyAgPC90OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisKKyAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InJlY3RvIj4KKyAgPC90OnRpdGxlcGFnZS1iZWZvcmU+CisKKyAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InZlcnNvIj4KKyAgPC90OnRpdGxlcGFnZS1iZWZvcmU+Cis8L3Q6dGl0bGVwYWdlPgorCis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDx0OnRpdGxlcGFnZSB0OmVsZW1lbnQ9ImNoYXB0ZXIiIHQ6d3JhcHBlcj0iZm86YmxvY2siCisgICAgICAgICAgICAgICBmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSI+CisgICAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJyZWN0byIgbWFyZ2luLWxlZnQ9InskdGl0bGUubWFyZ2luLmxlZnR9Ij4KKyAgICAgIDx0aXRsZSB0Om5hbWVkLXRlbXBsYXRlPSJjb21wb25lbnQudGl0bGUiCisJICAgICBwYXJhbTpub2RlPSJhbmNlc3Rvci1vci1zZWxmOjpjaGFwdGVyWzFdIgorCSAgICAgZm9udC1zaXplPSImaHNpemU1OyIKKwkgICAgIGZvbnQtd2VpZ2h0PSJib2xkIi8+CisKKyAgICAgIDxzdWJ0aXRsZSBzcGFjZS1iZWZvcmU9IjAuNWVtIgorCQlmb250LXN0eWxlPSJpdGFsaWMiCisJCWZvbnQtc2l6ZT0iJmhzaXplMjsiCisJCWZvbnQtd2VpZ2h0PSJib2xkIi8+CisKKyAgICAgIDxjb3JwYXV0aG9yICBzcGFjZS1iZWZvcmU9IjAuNWVtIgorCSAgICAgICAgICAgc3BhY2UtYWZ0ZXI9IjAuNWVtIgorICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZT0iJmhzaXplMjsiLz4KKworICAgICAgPGF1dGhvcmdyb3VwIHNwYWNlLWJlZm9yZT0iMC41ZW0iCisJICAgICAgICAgICBzcGFjZS1hZnRlcj0iMC41ZW0iCisgICAgICAgICAgICAgICAgICAgZm9udC1zaXplPSImaHNpemUyOyIvPgorCisgICAgICA8YXV0aG9yICAgICAgc3BhY2UtYmVmb3JlPSIwLjVlbSIKKwkgICAgICAgICAgIHNwYWNlLWFmdGVyPSIwLjVlbSIKKyAgICAgICAgICAgICAgICAgICBmb250LXNpemU9IiZoc2l6ZTI7Ii8+CisKKyAgICAgIDxvdGhlcmNyZWRpdC8+CisgICAgICA8cmVsZWFzZWluZm8vPgorICAgICAgPGNvcHlyaWdodC8+CisgICAgICA8bGVnYWxub3RpY2UvPgorICAgICAgPHB1YmRhdGUvPgorICAgICAgPHJldmlzaW9uLz4KKyAgICAgIDxyZXZoaXN0b3J5Lz4KKyAgICAgIDxhYnN0cmFjdC8+CisgICAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0idmVyc28iPgorICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgPHQ6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKyAgPC90OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisKKyAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InJlY3RvIj4KKyAgPC90OnRpdGxlcGFnZS1iZWZvcmU+CisKKyAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InZlcnNvIj4KKyAgPC90OnRpdGxlcGFnZS1iZWZvcmU+Cis8L3Q6dGl0bGVwYWdlPgorCis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDx0OnRpdGxlcGFnZSB0OmVsZW1lbnQ9ImFwcGVuZGl4IiB0OndyYXBwZXI9ImZvOmJsb2NrIj4KKyAgICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InJlY3RvIj4KKyAgICAgIDx0aXRsZQorCSAgICAgdDpuYW1lZC10ZW1wbGF0ZT0iY29tcG9uZW50LnRpdGxlIgorCSAgICAgcGFyYW06bm9kZT0iYW5jZXN0b3Itb3Itc2VsZjo6YXBwZW5kaXhbMV0iCisJICAgICBtYXJnaW4tbGVmdD0ieyR0aXRsZS5tYXJnaW4ubGVmdH0iCisJICAgICBmb250LXNpemU9IiZoc2l6ZTU7IgorCSAgICAgZm9udC13ZWlnaHQ9ImJvbGQiCisJICAgICBmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSIvPgorICAgICAgPHN1YnRpdGxlCisJCWZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9Ii8+CisgICAgICA8Y29ycGF1dGhvci8+CisgICAgICA8YXV0aG9yZ3JvdXAvPgorICAgICAgPGF1dGhvci8+CisgICAgICA8b3RoZXJjcmVkaXQvPgorICAgICAgPHJlbGVhc2VpbmZvLz4KKyAgICAgIDxjb3B5cmlnaHQvPgorICAgICAgPGxlZ2Fsbm90aWNlLz4KKyAgICAgIDxwdWJkYXRlLz4KKyAgICAgIDxyZXZpc2lvbi8+CisgICAgICA8cmV2aGlzdG9yeS8+CisgICAgICA8YWJzdHJhY3QvPgorICAgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InZlcnNvIj4KKyAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgIDx0OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisgIDwvdDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorCisgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJyZWN0byI+CisgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorCisgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJ2ZXJzbyI+CisgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorPC90OnRpdGxlcGFnZT4KKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworPHQ6dGl0bGVwYWdlIHQ6ZWxlbWVudD0ic2VjdGlvbiIgdDp3cmFwcGVyPSJmbzpibG9jayI+CisgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0icmVjdG8iPgorICAgIDx0aXRsZQorCSAgIG1hcmdpbi1sZWZ0PSJ7JHRpdGxlLm1hcmdpbi5sZWZ0fSIKKwkgICBmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSIvPgorICAgIDxzdWJ0aXRsZQorCSAgICAgIGZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9Ii8+CisgICAgPGNvcnBhdXRob3IvPgorICAgIDxhdXRob3Jncm91cC8+CisgICAgPGF1dGhvci8+CisgICAgPG90aGVyY3JlZGl0Lz4KKyAgICA8cmVsZWFzZWluZm8vPgorICAgIDxjb3B5cmlnaHQvPgorICAgIDxsZWdhbG5vdGljZS8+CisgICAgPHB1YmRhdGUvPgorICAgIDxyZXZpc2lvbi8+CisgICAgPHJldmhpc3RvcnkvPgorICAgIDxhYnN0cmFjdC8+CisgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InZlcnNvIj4KKyAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgIDx0OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisgIDwvdDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorCisgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJyZWN0byI+CisgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorCisgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJ2ZXJzbyI+CisgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorPC90OnRpdGxlcGFnZT4KKworPHQ6dGl0bGVwYWdlIHQ6ZWxlbWVudD0ic2VjdDEiIHQ6d3JhcHBlcj0iZm86YmxvY2siPgorICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InJlY3RvIj4KKyAgICA8dGl0bGUKKwkgICBtYXJnaW4tbGVmdD0ieyR0aXRsZS5tYXJnaW4ubGVmdH0iCisJICAgZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iLz4KKyAgICA8c3VidGl0bGUKKwkgICAgICBmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSIvPgorICAgIDxjb3JwYXV0aG9yLz4KKyAgICA8YXV0aG9yZ3JvdXAvPgorICAgIDxhdXRob3IvPgorICAgIDxvdGhlcmNyZWRpdC8+CisgICAgPHJlbGVhc2VpbmZvLz4KKyAgICA8Y29weXJpZ2h0Lz4KKyAgICA8bGVnYWxub3RpY2UvPgorICAgIDxwdWJkYXRlLz4KKyAgICA8cmV2aXNpb24vPgorICAgIDxyZXZoaXN0b3J5Lz4KKyAgICA8YWJzdHJhY3QvPgorICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJ2ZXJzbyI+CisgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICA8dDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorICA8L3Q6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKworICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0icmVjdG8iPgorICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKworICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0idmVyc28iPgorICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKzwvdDp0aXRsZXBhZ2U+CisKKzx0OnRpdGxlcGFnZSB0OmVsZW1lbnQ9InNlY3QyIiB0OndyYXBwZXI9ImZvOmJsb2NrIj4KKyAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJyZWN0byI+CisgICAgPHRpdGxlCisJICAgbWFyZ2luLWxlZnQ9InskdGl0bGUubWFyZ2luLmxlZnR9IgorCSAgIGZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9Ii8+CisgICAgPHN1YnRpdGxlCisJICAgICAgZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iLz4KKyAgICA8Y29ycGF1dGhvci8+CisgICAgPGF1dGhvcmdyb3VwLz4KKyAgICA8YXV0aG9yLz4KKyAgICA8b3RoZXJjcmVkaXQvPgorICAgIDxyZWxlYXNlaW5mby8+CisgICAgPGNvcHlyaWdodC8+CisgICAgPGxlZ2Fsbm90aWNlLz4KKyAgICA8cHViZGF0ZS8+CisgICAgPHJldmlzaW9uLz4KKyAgICA8cmV2aGlzdG9yeS8+CisgICAgPGFic3RyYWN0Lz4KKyAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0idmVyc28iPgorICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgPHQ6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKyAgPC90OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisKKyAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InJlY3RvIj4KKyAgPC90OnRpdGxlcGFnZS1iZWZvcmU+CisKKyAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InZlcnNvIj4KKyAgPC90OnRpdGxlcGFnZS1iZWZvcmU+Cis8L3Q6dGl0bGVwYWdlPgorCis8dDp0aXRsZXBhZ2UgdDplbGVtZW50PSJzZWN0MyIgdDp3cmFwcGVyPSJmbzpibG9jayI+CisgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0icmVjdG8iPgorICAgIDx0aXRsZQorCSAgIG1hcmdpbi1sZWZ0PSJ7JHRpdGxlLm1hcmdpbi5sZWZ0fSIKKwkgICBmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSIvPgorICAgIDxzdWJ0aXRsZQorCSAgICAgIGZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9Ii8+CisgICAgPGNvcnBhdXRob3IvPgorICAgIDxhdXRob3Jncm91cC8+CisgICAgPGF1dGhvci8+CisgICAgPG90aGVyY3JlZGl0Lz4KKyAgICA8cmVsZWFzZWluZm8vPgorICAgIDxjb3B5cmlnaHQvPgorICAgIDxsZWdhbG5vdGljZS8+CisgICAgPHB1YmRhdGUvPgorICAgIDxyZXZpc2lvbi8+CisgICAgPHJldmhpc3RvcnkvPgorICAgIDxhYnN0cmFjdC8+CisgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InZlcnNvIj4KKyAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgIDx0OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisgIDwvdDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorCisgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJyZWN0byI+CisgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorCisgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJ2ZXJzbyI+CisgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorPC90OnRpdGxlcGFnZT4KKworPHQ6dGl0bGVwYWdlIHQ6ZWxlbWVudD0ic2VjdDQiIHQ6d3JhcHBlcj0iZm86YmxvY2siPgorICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InJlY3RvIj4KKyAgICA8dGl0bGUKKwkgICBtYXJnaW4tbGVmdD0ieyR0aXRsZS5tYXJnaW4ubGVmdH0iCisJICAgZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iLz4KKyAgICA8c3VidGl0bGUKKwkgICAgICBmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSIvPgorICAgIDxjb3JwYXV0aG9yLz4KKyAgICA8YXV0aG9yZ3JvdXAvPgorICAgIDxhdXRob3IvPgorICAgIDxvdGhlcmNyZWRpdC8+CisgICAgPHJlbGVhc2VpbmZvLz4KKyAgICA8Y29weXJpZ2h0Lz4KKyAgICA8bGVnYWxub3RpY2UvPgorICAgIDxwdWJkYXRlLz4KKyAgICA8cmV2aXNpb24vPgorICAgIDxyZXZoaXN0b3J5Lz4KKyAgICA8YWJzdHJhY3QvPgorICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJ2ZXJzbyI+CisgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICA8dDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorICA8L3Q6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKworICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0icmVjdG8iPgorICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKworICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0idmVyc28iPgorICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKzwvdDp0aXRsZXBhZ2U+CisKKzx0OnRpdGxlcGFnZSB0OmVsZW1lbnQ9InNlY3Q1IiB0OndyYXBwZXI9ImZvOmJsb2NrIj4KKyAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJyZWN0byI+CisgICAgPHRpdGxlCisJICAgbWFyZ2luLWxlZnQ9InskdGl0bGUubWFyZ2luLmxlZnR9IgorCSAgIGZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9Ii8+CisgICAgPHN1YnRpdGxlCisJICAgICAgZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iLz4KKyAgICA8Y29ycGF1dGhvci8+CisgICAgPGF1dGhvcmdyb3VwLz4KKyAgICA8YXV0aG9yLz4KKyAgICA8b3RoZXJjcmVkaXQvPgorICAgIDxyZWxlYXNlaW5mby8+CisgICAgPGNvcHlyaWdodC8+CisgICAgPGxlZ2Fsbm90aWNlLz4KKyAgICA8cHViZGF0ZS8+CisgICAgPHJldmlzaW9uLz4KKyAgICA8cmV2aGlzdG9yeS8+CisgICAgPGFic3RyYWN0Lz4KKyAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0idmVyc28iPgorICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgPHQ6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKyAgPC90OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisKKyAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InJlY3RvIj4KKyAgPC90OnRpdGxlcGFnZS1iZWZvcmU+CisKKyAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InZlcnNvIj4KKyAgPC90OnRpdGxlcGFnZS1iZWZvcmU+Cis8L3Q6dGl0bGVwYWdlPgorCis8dDp0aXRsZXBhZ2UgdDplbGVtZW50PSJzaW1wbGVzZWN0IiB0OndyYXBwZXI9ImZvOmJsb2NrIj4KKyAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJyZWN0byI+CisgICAgPHRpdGxlCisJICAgbWFyZ2luLWxlZnQ9InskdGl0bGUubWFyZ2luLmxlZnR9IgorCSAgIGZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9Ii8+CisgICAgPHN1YnRpdGxlCisJICAgICAgZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iLz4KKyAgICA8Y29ycGF1dGhvci8+CisgICAgPGF1dGhvcmdyb3VwLz4KKyAgICA8YXV0aG9yLz4KKyAgICA8b3RoZXJjcmVkaXQvPgorICAgIDxyZWxlYXNlaW5mby8+CisgICAgPGNvcHlyaWdodC8+CisgICAgPGxlZ2Fsbm90aWNlLz4KKyAgICA8cHViZGF0ZS8+CisgICAgPHJldmlzaW9uLz4KKyAgICA8cmV2aGlzdG9yeS8+CisgICAgPGFic3RyYWN0Lz4KKyAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0idmVyc28iPgorICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgPHQ6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKyAgPC90OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisKKyAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InJlY3RvIj4KKyAgPC90OnRpdGxlcGFnZS1iZWZvcmU+CisKKyAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InZlcnNvIj4KKyAgPC90OnRpdGxlcGFnZS1iZWZvcmU+Cis8L3Q6dGl0bGVwYWdlPgorCis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDx0OnRpdGxlcGFnZSB0OmVsZW1lbnQ9ImJpYmxpb2dyYXBoeSIgdDp3cmFwcGVyPSJmbzpibG9jayI+CisgICAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJyZWN0byI+CisgICAgICA8dGl0bGUKKwkgICAgIHQ6Zm9yY2U9IjEiCisJICAgICB0Om5hbWVkLXRlbXBsYXRlPSJjb21wb25lbnQudGl0bGUiCisJICAgICBwYXJhbTpub2RlPSJhbmNlc3Rvci1vci1zZWxmOjpiaWJsaW9ncmFwaHlbMV0iCisJICAgICBtYXJnaW4tbGVmdD0ieyR0aXRsZS5tYXJnaW4ubGVmdH0iCisJICAgICBmb250LXNpemU9IiZoc2l6ZTU7IgorCSAgICAgZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iCisJICAgICBmb250LXdlaWdodD0iYm9sZCIvPgorICAgICAgPHN1YnRpdGxlCisJCWZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9Ii8+CisgICAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgICAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJ2ZXJzbyI+CisgICAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgICAgPHQ6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKyAgICA8L3Q6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKworICAgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJyZWN0byI+CisgICAgPC90OnRpdGxlcGFnZS1iZWZvcmU+CisKKyAgICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0idmVyc28iPgorICAgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorICA8L3Q6dGl0bGVwYWdlPgorCis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDx0OnRpdGxlcGFnZSB0OmVsZW1lbnQ9ImJpYmxpb2RpdiIgdDp3cmFwcGVyPSJmbzpibG9jayI+CisgICAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJyZWN0byI+CisgICAgICA8dGl0bGUgdDpuYW1lZC10ZW1wbGF0ZT0iY29tcG9uZW50LnRpdGxlIgorCSAgICAgcGFyYW06bm9kZT0iYW5jZXN0b3Itb3Itc2VsZjo6YmlibGlvZGl2WzFdIgorCSAgICAgbWFyZ2luLWxlZnQ9InskdGl0bGUubWFyZ2luLmxlZnR9IgorCSAgICAgZm9udC1zaXplPSImaHNpemU0OyIKKwkgICAgIGZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9IgorCSAgICAgZm9udC13ZWlnaHQ9ImJvbGQiLz4KKyAgICAgIDxzdWJ0aXRsZQorCQlmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSIvPgorICAgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICAgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0idmVyc28iPgorICAgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICAgIDx0OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisgICAgPC90OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisKKyAgICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0icmVjdG8iPgorICAgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorCisgICAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InZlcnNvIj4KKyAgICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKyAgPC90OnRpdGxlcGFnZT4KKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8dDp0aXRsZXBhZ2UgdDplbGVtZW50PSJnbG9zc2FyeSIgdDp3cmFwcGVyPSJmbzpibG9jayI+CisgICAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJyZWN0byI+CisgICAgICA8dGl0bGUKKwkgICAgIHQ6Zm9yY2U9IjEiCisJICAgICB0Om5hbWVkLXRlbXBsYXRlPSJjb21wb25lbnQudGl0bGUiCisJICAgICBwYXJhbTpub2RlPSJhbmNlc3Rvci1vci1zZWxmOjpnbG9zc2FyeVsxXSIKKwkgICAgIG1hcmdpbi1sZWZ0PSJ7JHRpdGxlLm1hcmdpbi5sZWZ0fSIKKwkgICAgIGZvbnQtc2l6ZT0iJmhzaXplNTsiCisJICAgICBmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSIKKwkgICAgIGZvbnQtd2VpZ2h0PSJib2xkIi8+CisgICAgICA8c3VidGl0bGUKKwkJZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iLz4KKyAgICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InZlcnNvIj4KKyAgICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgICA8dDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorICAgIDwvdDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorCisgICAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InJlY3RvIj4KKyAgICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKworICAgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJ2ZXJzbyI+CisgICAgPC90OnRpdGxlcGFnZS1iZWZvcmU+CisgIDwvdDp0aXRsZXBhZ2U+CisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPHQ6dGl0bGVwYWdlIHQ6ZWxlbWVudD0iZ2xvc3NkaXYiIHQ6d3JhcHBlcj0iZm86YmxvY2siPgorICAgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0icmVjdG8iPgorICAgICAgPHRpdGxlIHQ6bmFtZWQtdGVtcGxhdGU9ImNvbXBvbmVudC50aXRsZSIKKwkgICAgIHBhcmFtOm5vZGU9ImFuY2VzdG9yLW9yLXNlbGY6Omdsb3NzZGl2WzFdIgorCSAgICAgbWFyZ2luLWxlZnQ9InskdGl0bGUubWFyZ2luLmxlZnR9IgorCSAgICAgZm9udC1zaXplPSImaHNpemU0OyIKKwkgICAgIGZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9IgorCSAgICAgZm9udC13ZWlnaHQ9ImJvbGQiLz4KKyAgICAgIDxzdWJ0aXRsZQorCQlmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSIvPgorICAgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICAgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0idmVyc28iPgorICAgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICAgIDx0OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisgICAgPC90OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisKKyAgICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0icmVjdG8iPgorICAgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorCisgICAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InZlcnNvIj4KKyAgICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKyAgPC90OnRpdGxlcGFnZT4KKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8dDp0aXRsZXBhZ2UgdDplbGVtZW50PSJpbmRleCIgdDp3cmFwcGVyPSJmbzpibG9jayI+CisgICAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJyZWN0byI+CisgICAgICA8dGl0bGUKKwkgICAgIHQ6Zm9yY2U9IjEiCisJICAgICB0Om5hbWVkLXRlbXBsYXRlPSJjb21wb25lbnQudGl0bGUiCisJICAgICBwYXJhbTpub2RlPSJhbmNlc3Rvci1vci1zZWxmOjppbmRleFsxXSIKKyAgICAgICAgICAgICBwYXJhbTpwYWdld2lkZT0iMSIKKwkgICAgIG1hcmdpbi1sZWZ0PSIwcHQiCisJICAgICBmb250LXNpemU9IiZoc2l6ZTU7IgorCSAgICAgZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iCisJICAgICBmb250LXdlaWdodD0iYm9sZCIvPgorICAgICAgPHN1YnRpdGxlCisJCWZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9Ii8+CisgICAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgICAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJ2ZXJzbyI+CisgICAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgICAgPHQ6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKyAgICA8L3Q6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKworICAgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJyZWN0byI+CisgICAgPC90OnRpdGxlcGFnZS1iZWZvcmU+CisKKyAgICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0idmVyc28iPgorICAgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorICA8L3Q6dGl0bGVwYWdlPgorCis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDwhLS0gVGhlIGluZGV4ZGl2LnRpdGxlIHRlbXBsYXRlIGlzIHVzZWQgc28gdGhhdCBtYW51YWwgYW5kIC0tPgorICA8IS0tIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGluZGV4ZGl2IHRpdGxlcyBnZXQgdGhlIHNhbWUgLS0+CisgIDwhLS0gZm9ybWF0dGluZy4gLS0+CisKKyAgPHQ6dGl0bGVwYWdlIHQ6ZWxlbWVudD0iaW5kZXhkaXYiIHQ6d3JhcHBlcj0iZm86YmxvY2siPgorICAgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0icmVjdG8iPgorICAgICAgPHRpdGxlIHQ6Zm9yY2U9IjEiCisJICAgICB0Om5hbWVkLXRlbXBsYXRlPSJpbmRleGRpdi50aXRsZSIKKwkgICAgIHBhcmFtOnRpdGxlPSJ0aXRsZSIvPgorICAgICAgPHN1YnRpdGxlCisJCWZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9Ii8+CisgICAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgICAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJ2ZXJzbyI+CisgICAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgICAgPHQ6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKyAgICA8L3Q6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKworICAgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJyZWN0byI+CisgICAgPC90OnRpdGxlcGFnZS1iZWZvcmU+CisKKyAgICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0idmVyc28iPgorICAgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorICA8L3Q6dGl0bGVwYWdlPgorCis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDx0OnRpdGxlcGFnZSB0OmVsZW1lbnQ9InNldGluZGV4IiB0OndyYXBwZXI9ImZvOmJsb2NrIj4KKyAgICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InJlY3RvIj4KKyAgICAgIDx0aXRsZQorCSAgICAgdDpmb3JjZT0iMSIKKwkgICAgIHQ6bmFtZWQtdGVtcGxhdGU9ImNvbXBvbmVudC50aXRsZSIKKwkgICAgIHBhcmFtOm5vZGU9ImFuY2VzdG9yLW9yLXNlbGY6OnNldGluZGV4WzFdIgorICAgICAgICAgICAgIHBhcmFtOnBhZ2V3aWRlPSIxIgorCSAgICAgbWFyZ2luLWxlZnQ9IjBwdCIKKwkgICAgIGZvbnQtc2l6ZT0iJmhzaXplNTsiCisJICAgICBmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSIKKwkgICAgIGZvbnQtd2VpZ2h0PSJib2xkIi8+CisgICAgICA8c3VidGl0bGUKKwkJZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iLz4KKyAgICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InZlcnNvIj4KKyAgICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgICA8dDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorICAgIDwvdDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorCisgICAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InJlY3RvIj4KKyAgICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKworICAgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJ2ZXJzbyI+CisgICAgPC90OnRpdGxlcGFnZS1iZWZvcmU+CisgIDwvdDp0aXRsZXBhZ2U+CisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPHQ6dGl0bGVwYWdlIHQ6ZWxlbWVudD0iY29sb3Bob24iIHQ6d3JhcHBlcj0iZm86YmxvY2siPgorICAgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0icmVjdG8iPgorICAgICAgPHRpdGxlCisJICAgICB0OmZvcmNlPSIxIgorCSAgICAgdDpuYW1lZC10ZW1wbGF0ZT0iY29tcG9uZW50LnRpdGxlIgorCSAgICAgcGFyYW06bm9kZT0iYW5jZXN0b3Itb3Itc2VsZjo6Y29sb3Bob25bMV0iCisJICAgICBtYXJnaW4tbGVmdD0ieyR0aXRsZS5tYXJnaW4ubGVmdH0iCisJICAgICBmb250LXNpemU9IiZoc2l6ZTU7IgorCSAgICAgZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iCisJICAgICBmb250LXdlaWdodD0iYm9sZCIvPgorICAgICAgPHN1YnRpdGxlCisJCWZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9Ii8+CisgICAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0idmVyc28iPgorICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgPHQ6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKyAgPC90OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisKKyAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InJlY3RvIj4KKyAgPC90OnRpdGxlcGFnZS1iZWZvcmU+CisKKyAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InZlcnNvIj4KKyAgPC90OnRpdGxlcGFnZS1iZWZvcmU+Cis8L3Q6dGl0bGVwYWdlPgorCis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDx0OnRpdGxlcGFnZSB0OmVsZW1lbnQ9InRhYmxlLm9mLmNvbnRlbnRzIiB0OndyYXBwZXI9ImZvOmJsb2NrIj4KKyAgICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InJlY3RvIj4KKyAgICAgIDx0aXRsZQorCSAgICAgdDpmb3JjZT0iMSIKKwkgICAgIHQ6bmFtZWQtdGVtcGxhdGU9ImdlbnRleHQiCisJICAgICBwYXJhbTprZXk9IidUYWJsZW9mQ29udGVudHMnIgorICAgICAgICAgICAgIHNwYWNlLWJlZm9yZS5taW5pbXVtPSIxZW0iCisgICAgICAgICAgICAgc3BhY2UtYmVmb3JlLm9wdGltdW09IjEuNWVtIgorICAgICAgICAgICAgIHNwYWNlLWJlZm9yZS5tYXhpbXVtPSIyZW0iCisJICAgICBzcGFjZS1hZnRlcj0iMC41ZW0iCisJICAgICBtYXJnaW4tbGVmdD0ieyR0aXRsZS5tYXJnaW4ubGVmdH0iCisJICAgICBmb250LXNpemU9IiZoc2l6ZTM7IgorCSAgICAgZm9udC13ZWlnaHQ9ImJvbGQiCisJICAgICBmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSIvPgorICAgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICAgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0idmVyc28iPgorICAgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICAgIDx0OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisgICAgPC90OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisKKyAgICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0icmVjdG8iPgorICAgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorCisgICAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InZlcnNvIj4KKyAgICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKyAgPC90OnRpdGxlcGFnZT4KKworICA8dDp0aXRsZXBhZ2UgdDplbGVtZW50PSJsaXN0Lm9mLnRhYmxlcyIgdDp3cmFwcGVyPSJmbzpibG9jayI+CisgICAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJyZWN0byI+CisgICAgICA8dGl0bGUKKwkgICAgIHQ6Zm9yY2U9IjEiCisJICAgICB0Om5hbWVkLXRlbXBsYXRlPSJnZW50ZXh0IgorCSAgICAgcGFyYW06a2V5PSInTGlzdG9mVGFibGVzJyIKKyAgICAgICAgICAgICBzcGFjZS1iZWZvcmUubWluaW11bT0iMWVtIgorICAgICAgICAgICAgIHNwYWNlLWJlZm9yZS5vcHRpbXVtPSIxLjVlbSIKKyAgICAgICAgICAgICBzcGFjZS1iZWZvcmUubWF4aW11bT0iMmVtIgorCSAgICAgc3BhY2UtYWZ0ZXI9IjAuNWVtIgorCSAgICAgbWFyZ2luLWxlZnQ9InskdGl0bGUubWFyZ2luLmxlZnR9IgorCSAgICAgZm9udC1zaXplPSImaHNpemUzOyIKKwkgICAgIGZvbnQtd2VpZ2h0PSJib2xkIgorCSAgICAgZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iLz4KKyAgICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InZlcnNvIj4KKyAgICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgICA8dDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorICAgIDwvdDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorCisgICAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InJlY3RvIj4KKyAgICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKworICAgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJ2ZXJzbyI+CisgICAgPC90OnRpdGxlcGFnZS1iZWZvcmU+CisgIDwvdDp0aXRsZXBhZ2U+CisKKyAgPHQ6dGl0bGVwYWdlIHQ6ZWxlbWVudD0ibGlzdC5vZi5maWd1cmVzIiB0OndyYXBwZXI9ImZvOmJsb2NrIj4KKyAgICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InJlY3RvIj4KKyAgICAgIDx0aXRsZQorCSAgICAgdDpmb3JjZT0iMSIKKwkgICAgIHQ6bmFtZWQtdGVtcGxhdGU9ImdlbnRleHQiCisJICAgICBwYXJhbTprZXk9IidMaXN0b2ZGaWd1cmVzJyIKKyAgICAgICAgICAgICBzcGFjZS1iZWZvcmUubWluaW11bT0iMWVtIgorICAgICAgICAgICAgIHNwYWNlLWJlZm9yZS5vcHRpbXVtPSIxLjVlbSIKKyAgICAgICAgICAgICBzcGFjZS1iZWZvcmUubWF4aW11bT0iMmVtIgorCSAgICAgc3BhY2UtYWZ0ZXI9IjAuNWVtIgorCSAgICAgbWFyZ2luLWxlZnQ9InskdGl0bGUubWFyZ2luLmxlZnR9IgorCSAgICAgZm9udC1zaXplPSImaHNpemUzOyIKKwkgICAgIGZvbnQtd2VpZ2h0PSJib2xkIgorCSAgICAgZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iLz4KKyAgICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InZlcnNvIj4KKyAgICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgICA8dDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorICAgIDwvdDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorCisgICAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InJlY3RvIj4KKyAgICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKworICAgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJ2ZXJzbyI+CisgICAgPC90OnRpdGxlcGFnZS1iZWZvcmU+CisgIDwvdDp0aXRsZXBhZ2U+CisKKyAgPHQ6dGl0bGVwYWdlIHQ6ZWxlbWVudD0ibGlzdC5vZi5leGFtcGxlcyIgdDp3cmFwcGVyPSJmbzpibG9jayI+CisgICAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJyZWN0byI+CisgICAgICA8dGl0bGUKKwkgICAgIHQ6Zm9yY2U9IjEiCisJICAgICB0Om5hbWVkLXRlbXBsYXRlPSJnZW50ZXh0IgorCSAgICAgcGFyYW06a2V5PSInTGlzdG9mRXhhbXBsZXMnIgorICAgICAgICAgICAgIHNwYWNlLWJlZm9yZS5taW5pbXVtPSIxZW0iCisgICAgICAgICAgICAgc3BhY2UtYmVmb3JlLm9wdGltdW09IjEuNWVtIgorICAgICAgICAgICAgIHNwYWNlLWJlZm9yZS5tYXhpbXVtPSIyZW0iCisJICAgICBzcGFjZS1hZnRlcj0iMC41ZW0iCisJICAgICBtYXJnaW4tbGVmdD0ieyR0aXRsZS5tYXJnaW4ubGVmdH0iCisJICAgICBmb250LXNpemU9IiZoc2l6ZTM7IgorCSAgICAgZm9udC13ZWlnaHQ9ImJvbGQiCisJICAgICBmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSIvPgorICAgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICAgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0idmVyc28iPgorICAgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICAgIDx0OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisgICAgPC90OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisKKyAgICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0icmVjdG8iPgorICAgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorCisgICAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InZlcnNvIj4KKyAgICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKyAgPC90OnRpdGxlcGFnZT4KKworICA8dDp0aXRsZXBhZ2UgdDplbGVtZW50PSJsaXN0Lm9mLmVxdWF0aW9ucyIgdDp3cmFwcGVyPSJmbzpibG9jayI+CisgICAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJyZWN0byI+CisgICAgICA8dGl0bGUKKwkgICAgIHQ6Zm9yY2U9IjEiCisJICAgICB0Om5hbWVkLXRlbXBsYXRlPSJnZW50ZXh0IgorCSAgICAgcGFyYW06a2V5PSInTGlzdG9mRXF1YXRpb25zJyIKKyAgICAgICAgICAgICBzcGFjZS1iZWZvcmUubWluaW11bT0iMWVtIgorICAgICAgICAgICAgIHNwYWNlLWJlZm9yZS5vcHRpbXVtPSIxLjVlbSIKKyAgICAgICAgICAgICBzcGFjZS1iZWZvcmUubWF4aW11bT0iMmVtIgorCSAgICAgc3BhY2UtYWZ0ZXI9IjAuNWVtIgorCSAgICAgbWFyZ2luLWxlZnQ9InskdGl0bGUubWFyZ2luLmxlZnR9IgorCSAgICAgZm9udC1zaXplPSImaHNpemUzOyIKKwkgICAgIGZvbnQtd2VpZ2h0PSJib2xkIgorCSAgICAgZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iLz4KKyAgICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InZlcnNvIj4KKyAgICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgICA8dDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorICAgIDwvdDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorCisgICAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InJlY3RvIj4KKyAgICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKworICAgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJ2ZXJzbyI+CisgICAgPC90OnRpdGxlcGFnZS1iZWZvcmU+CisgIDwvdDp0aXRsZXBhZ2U+CisKKyAgPHQ6dGl0bGVwYWdlIHQ6ZWxlbWVudD0ibGlzdC5vZi5wcm9jZWR1cmVzIiB0OndyYXBwZXI9ImZvOmJsb2NrIj4KKyAgICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InJlY3RvIj4KKyAgICAgIDx0aXRsZQorCSAgICAgdDpmb3JjZT0iMSIKKwkgICAgIHQ6bmFtZWQtdGVtcGxhdGU9ImdlbnRleHQiCisJICAgICBwYXJhbTprZXk9IidMaXN0b2ZQcm9jZWR1cmVzJyIKKyAgICAgICAgICAgICBzcGFjZS1iZWZvcmUubWluaW11bT0iMWVtIgorICAgICAgICAgICAgIHNwYWNlLWJlZm9yZS5vcHRpbXVtPSIxLjVlbSIKKyAgICAgICAgICAgICBzcGFjZS1iZWZvcmUubWF4aW11bT0iMmVtIgorCSAgICAgc3BhY2UtYWZ0ZXI9IjAuNWVtIgorCSAgICAgbWFyZ2luLWxlZnQ9InskdGl0bGUubWFyZ2luLmxlZnR9IgorCSAgICAgZm9udC1zaXplPSImaHNpemUzOyIKKwkgICAgIGZvbnQtd2VpZ2h0PSJib2xkIgorCSAgICAgZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iLz4KKyAgICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InZlcnNvIj4KKyAgICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgICA8dDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorICAgIDwvdDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorCisgICAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InJlY3RvIj4KKyAgICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKworICAgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJ2ZXJzbyI+CisgICAgPC90OnRpdGxlcGFnZS1iZWZvcmU+CisgIDwvdDp0aXRsZXBhZ2U+CisKKyAgPHQ6dGl0bGVwYWdlIHQ6ZWxlbWVudD0ibGlzdC5vZi51bmtub3ducyIgdDp3cmFwcGVyPSJmbzpibG9jayI+CisgICAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJyZWN0byI+CisgICAgICA8dGl0bGUKKwkgICAgIHQ6Zm9yY2U9IjEiCisJICAgICB0Om5hbWVkLXRlbXBsYXRlPSJnZW50ZXh0IgorCSAgICAgcGFyYW06a2V5PSInTGlzdG9mVW5rbm93biciCisgICAgICAgICAgICAgc3BhY2UtYmVmb3JlLm1pbmltdW09IjFlbSIKKyAgICAgICAgICAgICBzcGFjZS1iZWZvcmUub3B0aW11bT0iMS41ZW0iCisgICAgICAgICAgICAgc3BhY2UtYmVmb3JlLm1heGltdW09IjJlbSIKKwkgICAgIHNwYWNlLWFmdGVyPSIwLjVlbSIKKwkgICAgIG1hcmdpbi1sZWZ0PSJ7JHRpdGxlLm1hcmdpbi5sZWZ0fSIKKwkgICAgIGZvbnQtc2l6ZT0iJmhzaXplMzsiCisJICAgICBmb250LXdlaWdodD0iYm9sZCIKKwkgICAgIGZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9Ii8+CisgICAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgICAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJ2ZXJzbyI+CisgICAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgICAgPHQ6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKyAgICA8L3Q6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKworICAgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJyZWN0byI+CisgICAgPC90OnRpdGxlcGFnZS1iZWZvcmU+CisKKyAgICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0idmVyc28iPgorICAgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorICA8L3Q6dGl0bGVwYWdlPgorCis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCis8L3Q6dGVtcGxhdGVzPgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9kb2MvdG9vbHMvZG9jYm9vay10by1wZGYgYi9iaXRiYWtlL2RvYy90b29scy9kb2Nib29rLXRvLXBkZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NThkZWQ5ZQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvZG9jL3Rvb2xzL2RvY2Jvb2stdG8tcGRmCkBAIC0wLDAgKzEsNTEgQEAKKyMhL2Jpbi9zaAorCQoraWYgWyAteiAiJDEiIC1vIC16ICIkMiIgXTsgdGhlbgorICAgZWNobyAidXNhZ2U6IFstdl0gJDAgPGRvY2Jvb2sgZmlsZT4gPHRlbXBsYXRlZGlyPiIKKyAgIGVjaG8KKyAgIGVjaG8gIipOT1RFKiB5b3UgbmVlZCB4c2x0cHJvYywgZm9wIGFuZCBud2Fsc2ggZG9jYm9vayBzdHlsZXNoZWV0cyIgCisgICBlY2hvICIgICAgICAgaW5zdGFsbGVkIGZvciB0aGlzIHRvIHdvcmshIgorICAgZWNobworICAgZXhpdCAwCitmaQorCitGTz1gZWNobyAkMSB8IHNlZCBzLy54bWwvLmZvL2AgfHwgZXhpdCAxCitQREY9YGVjaG8gJDEgfCBzZWQgcy8ueG1sLy5wZGYvYCB8fCBleGl0IDEKK1RFTVBMQVRFRElSPSQyCisKKyMjCisjIFRoZXNlIFVSSSBzaG91bGQgYmUgcmV3cml0dGVuIGJ5IHlvdXIgZGlzdHJpYnV0aW9uJ3MgeG1sIGNhdGFsb2cgdG8KKyMgbWF0Y2ggeW91ciBsb2NhbHkgaW5zdGFsbGVkIFhTTCBzdHlsZXNoZWV0cy4KK1hTTF9CQVNFX1VSST0iaHR0cDovL2RvY2Jvb2suc291cmNlZm9yZ2UubmV0L3JlbGVhc2UveHNsL2N1cnJlbnQiCisKKyMgQ3JlYXRlcyBhIHRlbXBvcmFyeSBYU0wgc3R5bGVzaGVldCBiYXNlZCBvbiB0aXRsZXBhZ2UueHNsCit4c2x0cHJvYyAtbyAvdG1wL3RpdGxlcGFnZS54c2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAtLXhpbmNsdWRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgJFhTTF9CQVNFX1VSSS90ZW1wbGF0ZS90aXRsZXBhZ2UueHNsIFwKKyAgICAgICAgICRURU1QTEFURURJUi90aXRsZXBhZ2UudGVtcGxhdGVzLnhtbCB8fCBleGl0IDEKKworIyBDcmVhdGVzIHRoZSBmaWxlIG5lZWRlZCBmb3IgRk9QCit4c2x0cHJvYyAtLXhpbmNsdWRlICAgICAgICAgICAgICAgICAgICBcCisJIC0tc3RyaW5ncGFyYW0gaHlwaGVuYXRlIGZhbHNlIFwKKwkgLS1zdHJpbmdwYXJhbSBmb3JtYWwudGl0bGUucGxhY2VtZW50ICJmaWd1cmUgYWZ0ZXIiIFwKKwkgLS1zdHJpbmdwYXJhbSB1bGluay5zaG93IDEgXAorICAgICAgICAgLS1zdHJpbmdwYXJhbSAgYm9keS5mb250Lm1hc3RlciAgOSBcCisgICAgICAgICAtLXN0cmluZ3BhcmFtICB0aXRsZS5mb250Lm1hc3RlciAgMTEgXAorICAgICAgICAgLS1zdHJpbmdwYXJhbSBkcmFmdC53YXRlcm1hcmsuaW1hZ2UgIiRURU1QTEFURURJUi9kcmFmdC5wbmciIFwKKyAgICAgICAgIC0tc3RyaW5ncGFyYW0gIGNoYXB0ZXIuYXV0b2xhYmVsIDEgXAorICAgICAgICAgLS1zdHJpbmdwYXJhbSAgYXBwZW5kaXguYXV0b2xhYmVsIEEgXAorICAgICAgICAgLS1zdHJpbmdwYXJhbSAgc2VjdGlvbi5hdXRvbGFiZWwgMSBcCisgICAgICAgICAtLXN0cmluZ3BhcmFtICBzZWN0aW9uLmxhYmVsLmluY2x1ZGVzLmNvbXBvbmVudC5sYWJlbCAxIFwKKyAgICAgICAgIC0tb3V0cHV0ICRGTyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICRURU1QTEFURURJUi9kYi1wZGYueHNsICAgIFwKKwkgJDEgICAgICAgICAgICAgICAgIHx8IGV4aXQgMQorCisjIEludm9rZXMgdGhlIEphdmEgdmVyc2lvbiBvZiBGT1AuICBVc2VzIHRoZSBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gZmlsZSBjb21tb24vZm9wLWNvbmZpZy54bWwKK2ZvcCAtYyAkVEVNUExBVEVESVIvZm9wLWNvbmZpZy54bWwgLWZvICRGTyAtcGRmICRQREYgICAgICAgfHwgZXhpdCAxCisKK3JtIC1mICRGTworcm0gLWYgIC90bXAvdGl0bGVwYWdlLnhzbAorCitlY2hvCitlY2hvICIgIyMjIyBTdWNjZXNzISAkUERGIHJlYWR5LiAjIyMjIgorZWNobwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvQ09XLnB5IGIvYml0YmFrZS9saWIvYmIvQ09XLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MTdlYzMKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9DT1cucHkKQEAgLTAsMCArMSwzMjMgQEAKKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisjCisjIFRoaXMgaXMgYSBjb3B5IG9uIHdyaXRlIGRpY3Rpb25hcnkgYW5kIHNldCB3aGljaCBhYnVzZXMgY2xhc3NlcyB0byB0cnkgYW5kIGJlIG5pY2UgYW5kIGZhc3QuCisjCisjIENvcHlyaWdodCAoQykgMjAwNiBUaW0gQW1zZWxsCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworI1BsZWFzZSBOb3RlOgorIyBCZSBjYXJlZnVsIHdoZW4gdXNpbmcgbXV0YWJsZSB0eXBlcyAoaWUgRGljdCBhbmQgTGlzdHMpIC0gb3BlcmF0aW9ucyBpbnZvbHZpbmcgdGhlc2UgYXJlIFNMT1cuCisjIEFzc2lnbiBhIGZpbGUgdG8gX193YXJuX18gdG8gZ2V0IHdhcm5pbmdzIGFib3V0IHNsb3cgb3BlcmF0aW9ucy4KKyMKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgoraW1wb3J0IGNvcHkKK2ltcG9ydCB0eXBlcworSW1tdXRhYmxlVHlwZXMgPSAoCisgICAgdHlwZXMuTm9uZVR5cGUsCisgICAgYm9vbCwKKyAgICBjb21wbGV4LAorICAgIGZsb2F0LAorICAgIGludCwKKyAgICBsb25nLAorICAgIHR1cGxlLAorICAgIGZyb3plbnNldCwKKyAgICBiYXNlc3RyaW5nCispCisKK01VVEFCTEUgPSAiX19tdXRhYmxlX18iCisKK2NsYXNzIENPV01ldGEodHlwZSk6CisgICAgcGFzcworCitjbGFzcyBDT1dEaWN0TWV0YShDT1dNZXRhKToKKyAgICBfX3dhcm5fXyA9IEZhbHNlCisgICAgX19oYXNtdXRhYmxlX18gPSBGYWxzZQorICAgIF9fbWFya2VyX18gPSB0dXBsZSgpCisKKyAgICBkZWYgX19zdHJfXyhjbHMpOgorICAgICAgICAjIEZJWE1FOiBJIGhhdmUgbWFnaWMgbnVtYmVycyEKKyAgICAgICAgcmV0dXJuICI8Q09XRGljdCBMZXZlbDogJWkgQ3VycmVudCBLZXlzOiAlaT4iICUgKGNscy5fX2NvdW50X18sIGxlbihjbHMuX19kaWN0X18pIC0gMykKKyAgICBfX3JlcHJfXyA9IF9fc3RyX18KKworICAgIGRlZiBjb3coY2xzKToKKyAgICAgICAgY2xhc3MgQyhjbHMpOgorICAgICAgICAgICAgX19jb3VudF9fID0gY2xzLl9fY291bnRfXyArIDEKKyAgICAgICAgcmV0dXJuIEMKKyAgICBjb3B5ID0gY293CisgICAgX19jYWxsX18gPSBjb3cKKworICAgIGRlZiBfX3NldGl0ZW1fXyhjbHMsIGtleSwgdmFsdWUpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgSW1tdXRhYmxlVHlwZXMpOgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIENPV01ldGEpOgorICAgICAgICAgICAgICAgIGNscy5fX2hhc211dGFibGVfXyA9IFRydWUKKyAgICAgICAgICAgIGtleSArPSBNVVRBQkxFCisgICAgICAgIHNldGF0dHIoY2xzLCBrZXksIHZhbHVlKQorCisgICAgZGVmIF9fZ2V0bXV0YWJsZV9fKGNscywga2V5LCByZWFkb25seT1GYWxzZSk6CisgICAgICAgIG5rZXkgPSBrZXkgKyBNVVRBQkxFCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBjbHMuX19kaWN0X19bbmtleV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHZhbHVlID0gZ2V0YXR0cihjbHMsIG5rZXkpCisgICAgICAgIGlmIHJlYWRvbmx5OgorICAgICAgICAgICAgcmV0dXJuIHZhbHVlCisKKyAgICAgICAgaWYgbm90IGNscy5fX3dhcm5fXyBpcyBGYWxzZSBhbmQgbm90IGlzaW5zdGFuY2UodmFsdWUsIENPV01ldGEpOgorICAgICAgICAgICAgcHJpbnQoIldhcm5pbmc6IERvaW5nIGEgY29weSBiZWNhdXNlICVzIGlzIGEgbXV0YWJsZSB0eXBlLiIgJSBrZXksIGZpbGU9Y2xzLl9fd2Fybl9fKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmNvcHkoKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3IgYXMgZToKKyAgICAgICAgICAgIHZhbHVlID0gY29weS5jb3B5KHZhbHVlKQorICAgICAgICBzZXRhdHRyKGNscywgbmtleSwgdmFsdWUpCisgICAgICAgIHJldHVybiB2YWx1ZQorCisgICAgX19nZXRtYXJrZXJfXyA9IFtdCisgICAgZGVmIF9fZ2V0cmVhZG9ubHlfXyhjbHMsIGtleSwgZGVmYXVsdD1fX2dldG1hcmtlcl9fKToKKyAgICAgICAgIiIiXAorICAgICAgICBHZXQgYSB2YWx1ZSAoZXZlbiBpZiBtdXRhYmxlKSB3aGljaCB5b3UgcHJvbWlzZSBub3QgdG8gY2hhbmdlLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIGNscy5fX2dldGl0ZW1fXyhrZXksIGRlZmF1bHQsIFRydWUpCisKKyAgICBkZWYgX19nZXRpdGVtX18oY2xzLCBrZXksIGRlZmF1bHQ9X19nZXRtYXJrZXJfXywgcmVhZG9ubHk9RmFsc2UpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRhdHRyKGNscywga2V5KQorICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgIHZhbHVlID0gY2xzLl9fZ2V0bXV0YWJsZV9fKGtleSwgcmVhZG9ubHkpCisKKyAgICAgICAgICAgICMgVGhpcyBpcyBmb3IgdmFsdWVzIHdoaWNoIGhhdmUgYmVlbiBkZWxldGVkCisgICAgICAgICAgICBpZiB2YWx1ZSBpcyBjbHMuX19tYXJrZXJfXzoKKyAgICAgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcigia2V5ICVzIGRvZXMgbm90IGV4aXN0LiIgJSBrZXkpCisKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3IgYXMgZToKKyAgICAgICAgICAgIGlmIG5vdCBkZWZhdWx0IGlzIGNscy5fX2dldG1hcmtlcl9fOgorICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0CisKKyAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKHN0cihlKSkKKworICAgIGRlZiBfX2RlbGl0ZW1fXyhjbHMsIGtleSk6CisgICAgICAgIGNscy5fX3NldGl0ZW1fXyhrZXksIGNscy5fX21hcmtlcl9fKQorCisgICAgZGVmIF9fcmV2ZXJ0aXRlbV9fKGNscywga2V5KToKKyAgICAgICAgaWYgbm90IGNscy5fX2RpY3RfXy5oYXNfa2V5KGtleSk6CisgICAgICAgICAgICBrZXkgKz0gTVVUQUJMRQorICAgICAgICBkZWxhdHRyKGNscywga2V5KQorCisgICAgZGVmIF9fY29udGFpbnNfXyhjbHMsIGtleSk6CisgICAgICAgIHJldHVybiBjbHMuaGFzX2tleShrZXkpCisKKyAgICBkZWYgaGFzX2tleShjbHMsIGtleSk6CisgICAgICAgIHZhbHVlID0gY2xzLl9fZ2V0cmVhZG9ubHlfXyhrZXksIGNscy5fX21hcmtlcl9fKQorICAgICAgICBpZiB2YWx1ZSBpcyBjbHMuX19tYXJrZXJfXzoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGl0ZXIoY2xzLCB0eXBlLCByZWFkb25seT1GYWxzZSk6CisgICAgICAgIGZvciBrZXkgaW4gZGlyKGNscyk6CisgICAgICAgICAgICBpZiBrZXkuc3RhcnRzd2l0aCgiX18iKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBrZXkuZW5kc3dpdGgoTVVUQUJMRSk6CisgICAgICAgICAgICAgICAga2V5ID0ga2V5WzotbGVuKE1VVEFCTEUpXQorCisgICAgICAgICAgICBpZiB0eXBlID09ICJrZXlzIjoKKyAgICAgICAgICAgICAgICB5aWVsZCBrZXkKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlmIHJlYWRvbmx5OgorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGNscy5fX2dldHJlYWRvbmx5X18oa2V5KQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gY2xzW2tleV0KKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiB0eXBlID09ICJ2YWx1ZXMiOgorICAgICAgICAgICAgICAgIHlpZWxkIHZhbHVlCisgICAgICAgICAgICBpZiB0eXBlID09ICJpdGVtcyI6CisgICAgICAgICAgICAgICAgeWllbGQgKGtleSwgdmFsdWUpCisgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24oKQorCisgICAgZGVmIGl0ZXJrZXlzKGNscyk6CisgICAgICAgIHJldHVybiBjbHMuaXRlcigia2V5cyIpCisgICAgZGVmIGl0ZXJ2YWx1ZXMoY2xzLCByZWFkb25seT1GYWxzZSk6CisgICAgICAgIGlmIG5vdCBjbHMuX193YXJuX18gaXMgRmFsc2UgYW5kIGNscy5fX2hhc211dGFibGVfXyBhbmQgcmVhZG9ubHkgaXMgRmFsc2U6CisgICAgICAgICAgICBwcmludCgiV2FybmluZzogSWYgeW91IGFybid0IGdvaW5nIHRvIGNoYW5nZSBhbnkgb2YgdGhlIHZhbHVlcyBjYWxsIHdpdGggVHJ1ZS4iLCBmaWxlPWNscy5fX3dhcm5fXykKKyAgICAgICAgcmV0dXJuIGNscy5pdGVyKCJ2YWx1ZXMiLCByZWFkb25seSkKKyAgICBkZWYgaXRlcml0ZW1zKGNscywgcmVhZG9ubHk9RmFsc2UpOgorICAgICAgICBpZiBub3QgY2xzLl9fd2Fybl9fIGlzIEZhbHNlIGFuZCBjbHMuX19oYXNtdXRhYmxlX18gYW5kIHJlYWRvbmx5IGlzIEZhbHNlOgorICAgICAgICAgICAgcHJpbnQoIldhcm5pbmc6IElmIHlvdSBhcm4ndCBnb2luZyB0byBjaGFuZ2UgYW55IG9mIHRoZSB2YWx1ZXMgY2FsbCB3aXRoIFRydWUuIiwgZmlsZT1jbHMuX193YXJuX18pCisgICAgICAgIHJldHVybiBjbHMuaXRlcigiaXRlbXMiLCByZWFkb25seSkKKworY2xhc3MgQ09XU2V0TWV0YShDT1dEaWN0TWV0YSk6CisgICAgZGVmIF9fc3RyX18oY2xzKToKKyAgICAgICAgIyBGSVhNRTogSSBoYXZlIG1hZ2ljIG51bWJlcnMhCisgICAgICAgIHJldHVybiAiPENPV1NldCBMZXZlbDogJWkgQ3VycmVudCBLZXlzOiAlaT4iICUgKGNscy5fX2NvdW50X18sIGxlbihjbHMuX19kaWN0X18pIC0zKQorICAgIF9fcmVwcl9fID0gX19zdHJfXworCisgICAgZGVmIGNvdyhjbHMpOgorICAgICAgICBjbGFzcyBDKGNscyk6CisgICAgICAgICAgICBfX2NvdW50X18gPSBjbHMuX19jb3VudF9fICsgMQorICAgICAgICByZXR1cm4gQworCisgICAgZGVmIGFkZChjbHMsIHZhbHVlKToKKyAgICAgICAgQ09XRGljdE1ldGEuX19zZXRpdGVtX18oY2xzLCByZXByKGhhc2godmFsdWUpKSwgdmFsdWUpCisKKyAgICBkZWYgcmVtb3ZlKGNscywgdmFsdWUpOgorICAgICAgICBDT1dEaWN0TWV0YS5fX2RlbGl0ZW1fXyhjbHMsIHJlcHIoaGFzaCh2YWx1ZSkpKQorCisgICAgZGVmIF9faW5fXyhjbHMsIHZhbHVlKToKKyAgICAgICAgcmV0dXJuIENPV0RpY3RNZXRhLmhhc19rZXkocmVwcihoYXNoKHZhbHVlKSkpCisKKyAgICBkZWYgaXRlcmtleXMoY2xzKToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJzZXRzIGRvbid0IGhhdmUga2V5cyIpCisKKyAgICBkZWYgaXRlcml0ZW1zKGNscyk6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcigic2V0cyBkb24ndCBoYXZlICdpdGVtcyciKQorCisjIFRoZXNlIGFyZSB0aGUgYWN0dWFsIGNsYXNzZXMgeW91IHVzZSEKK2NsYXNzIENPV0RpY3RCYXNlKG9iamVjdCk6CisgICAgX19tZXRhY2xhc3NfXyA9IENPV0RpY3RNZXRhCisgICAgX19jb3VudF9fID0gMAorCitjbGFzcyBDT1dTZXRCYXNlKG9iamVjdCk6CisgICAgX19tZXRhY2xhc3NfXyA9IENPV1NldE1ldGEKKyAgICBfX2NvdW50X18gPSAwCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgaW1wb3J0IHN5cworICAgIENPV0RpY3RCYXNlLl9fd2Fybl9fID0gc3lzLnN0ZGVycgorICAgIGEgPSBDT1dEaWN0QmFzZSgpCisgICAgcHJpbnQoImEiLCBhKQorCisgICAgYVsnYSddID0gJ2EnCisgICAgYVsnYiddID0gJ2InCisgICAgYVsnZGljdCddID0ge30KKworICAgIGIgPSBhLmNvcHkoKQorICAgIHByaW50KCJiIiwgYikKKyAgICBiWydjJ10gPSAnYicKKworICAgIHByaW50KCkKKworICAgIHByaW50KCJhIiwgYSkKKyAgICBmb3IgeCBpbiBhLml0ZXJpdGVtcygpOgorICAgICAgICBwcmludCh4KQorICAgIHByaW50KCItLSIpCisgICAgcHJpbnQoImIiLCBiKQorICAgIGZvciB4IGluIGIuaXRlcml0ZW1zKCk6CisgICAgICAgIHByaW50KHgpCisgICAgcHJpbnQoKQorCisgICAgYlsnZGljdCddWydhJ10gPSAnYicKKyAgICBiWydhJ10gPSAnYycKKworICAgIHByaW50KCJhIiwgYSkKKyAgICBmb3IgeCBpbiBhLml0ZXJpdGVtcygpOgorICAgICAgICBwcmludCh4KQorICAgIHByaW50KCItLSIpCisgICAgcHJpbnQoImIiLCBiKQorICAgIGZvciB4IGluIGIuaXRlcml0ZW1zKCk6CisgICAgICAgIHByaW50KHgpCisgICAgcHJpbnQoKQorCisgICAgdHJ5OgorICAgICAgICBiWydkaWN0MiddCisgICAgZXhjZXB0IEtleUVycm9yIGFzIGU6CisgICAgICAgIHByaW50KCJPa2F5ISIpCisKKyAgICBhWydzZXQnXSA9IENPV1NldEJhc2UoKQorICAgIGFbJ3NldCddLmFkZCgibzEiKQorICAgIGFbJ3NldCddLmFkZCgibzEiKQorICAgIGFbJ3NldCddLmFkZCgibzIiKQorCisgICAgcHJpbnQoImEiLCBhKQorICAgIGZvciB4IGluIGFbJ3NldCddLml0ZXJ2YWx1ZXMoKToKKyAgICAgICAgcHJpbnQoeCkKKyAgICBwcmludCgiLS0iKQorICAgIHByaW50KCJiIiwgYikKKyAgICBmb3IgeCBpbiBiWydzZXQnXS5pdGVydmFsdWVzKCk6CisgICAgICAgIHByaW50KHgpCisgICAgcHJpbnQoKQorCisgICAgYlsnc2V0J10uYWRkKCdvMycpCisKKyAgICBwcmludCgiYSIsIGEpCisgICAgZm9yIHggaW4gYVsnc2V0J10uaXRlcnZhbHVlcygpOgorICAgICAgICBwcmludCh4KQorICAgIHByaW50KCItLSIpCisgICAgcHJpbnQoImIiLCBiKQorICAgIGZvciB4IGluIGJbJ3NldCddLml0ZXJ2YWx1ZXMoKToKKyAgICAgICAgcHJpbnQoeCkKKyAgICBwcmludCgpCisKKyAgICBhWydzZXQyJ10gPSBzZXQoKQorICAgIGFbJ3NldDInXS5hZGQoIm8xIikKKyAgICBhWydzZXQyJ10uYWRkKCJvMSIpCisgICAgYVsnc2V0MiddLmFkZCgibzIiKQorCisgICAgcHJpbnQoImEiLCBhKQorICAgIGZvciB4IGluIGEuaXRlcml0ZW1zKCk6CisgICAgICAgIHByaW50KHgpCisgICAgcHJpbnQoIi0tIikKKyAgICBwcmludCgiYiIsIGIpCisgICAgZm9yIHggaW4gYi5pdGVyaXRlbXMocmVhZG9ubHk9VHJ1ZSk6CisgICAgICAgIHByaW50KHgpCisgICAgcHJpbnQoKQorCisgICAgZGVsIGJbJ2InXQorICAgIHRyeToKKyAgICAgICAgcHJpbnQoYlsnYiddKQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgcHJpbnQoIllheSEgZGVsZXRlZCBrZXkgcmFpc2VzIGVycm9yIikKKworICAgIGlmIGIuaGFzX2tleSgnYicpOgorICAgICAgICBwcmludCgiQm9vISIpCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQoIllheSAtIGhhc19rZXkgd2l0aCBkZWxldGUgd29ya3MhIikKKworICAgIHByaW50KCJhIiwgYSkKKyAgICBmb3IgeCBpbiBhLml0ZXJpdGVtcygpOgorICAgICAgICBwcmludCh4KQorICAgIHByaW50KCItLSIpCisgICAgcHJpbnQoImIiLCBiKQorICAgIGZvciB4IGluIGIuaXRlcml0ZW1zKHJlYWRvbmx5PVRydWUpOgorICAgICAgICBwcmludCh4KQorICAgIHByaW50KCkKKworICAgIGIuX19yZXZlcnRpdGVtX18oJ2InKQorCisgICAgcHJpbnQoImEiLCBhKQorICAgIGZvciB4IGluIGEuaXRlcml0ZW1zKCk6CisgICAgICAgIHByaW50KHgpCisgICAgcHJpbnQoIi0tIikKKyAgICBwcmludCgiYiIsIGIpCisgICAgZm9yIHggaW4gYi5pdGVyaXRlbXMocmVhZG9ubHk9VHJ1ZSk6CisgICAgICAgIHByaW50KHgpCisgICAgcHJpbnQoKQorCisgICAgYi5fX3JldmVydGl0ZW1fXygnZGljdCcpCisgICAgcHJpbnQoImEiLCBhKQorICAgIGZvciB4IGluIGEuaXRlcml0ZW1zKCk6CisgICAgICAgIHByaW50KHgpCisgICAgcHJpbnQoIi0tIikKKyAgICBwcmludCgiYiIsIGIpCisgICAgZm9yIHggaW4gYi5pdGVyaXRlbXMocmVhZG9ubHk9VHJ1ZSk6CisgICAgICAgIHByaW50KHgpCisgICAgcHJpbnQoKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvX19pbml0X18ucHkgYi9iaXRiYWtlL2xpYi9iYi9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjc5NDZlCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvX19pbml0X18ucHkKQEAgLTAsMCArMSwxNDIgQEAKKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisjCisjIEJpdEJha2UgQnVpbGQgU3lzdGVtIFB5dGhvbiBMaWJyYXJ5CisjCisjIENvcHlyaWdodCAoQykgMjAwMyAgSG9sZ2VyIFNjaHVyaWcKKyMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0ICBDaHJpcyBMYXJzb24KKyMKKyMgQmFzZWQgb24gR2VudG9vJ3MgcG9ydGFnZS5weS4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK19fdmVyc2lvbl9fID0gIjEuMjcuMSIKKworaW1wb3J0IHN5cworaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA3LCAzKToKKyAgICByYWlzZSBSdW50aW1lRXJyb3IoIlNvcnJ5LCBweXRob24gMi43LjMgb3IgbGF0ZXIgaXMgcmVxdWlyZWQgZm9yIHRoaXMgdmVyc2lvbiBvZiBiaXRiYWtlIikKKworCitjbGFzcyBCQkhhbmRsZWRFeGNlcHRpb24oRXhjZXB0aW9uKToKKyAgICAiIiIKKyAgICBUaGUgYmlnIGRpbGVtbWEgZm9yIGdlbmVyaWMgYml0YmFrZSBjb2RlIGlzIHdoYXQgaW5mb3JtYXRpb24gdG8gZ2l2ZSB0aGUgdXNlcgorICAgIHdoZW4gYW4gZXhjZXB0aW9uIG9jY3Vycy4gQW55IGV4Y2VwdGlvbiBpbmhlcml0aW5nIHRoaXMgYmFzZSBleGNlcHRpb24gY2xhc3MKKyAgICBoYXMgYWxyZWFkeSBwcm92aWRlZCBpbmZvcm1hdGlvbiB0byB0aGUgdXNlciB2aWEgc29tZSAnZmlyZWQnIG1lc3NhZ2UgdHlwZSBzdWNoIGFzCisgICAgYW4gZXhwbGljaXRseSBmaXJlZCBldmVudCB1c2luZyBiYi5maXJlLCBvciBhIGJiLmVycm9yIG1lc3NhZ2UuIElmIGJpdGJha2UgCisgICAgZW5jb3VudGVycyBhbiBleGNlcHRpb24gZGVyaXZlZCBmcm9tIHRoaXMgY2xhc3MsIG5vIGJhY2t0cmFjZSBvciBvdGhlciBpbmZvcm1hdGlvbiAKKyAgICB3aWxsIGJlIGdpdmVuIHRvIHRoZSB1c2VyLCBpdHMgYXNzdW1lZCB0aGUgZWFybGllciBldmVudCBwcm92aWRlZCB0aGUgcmVsZXZhbnQgaW5mb3JtYXRpb24uCisgICAgIiIiCisgICAgcGFzcworCitpbXBvcnQgb3MKK2ltcG9ydCBsb2dnaW5nCisKKworY2xhc3MgTnVsbEhhbmRsZXIobG9nZ2luZy5IYW5kbGVyKToKKyAgICBkZWYgZW1pdChzZWxmLCByZWNvcmQpOgorICAgICAgICBwYXNzCisKK0xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyQ2xhc3MoKQorY2xhc3MgQkJMb2dnZXIoTG9nZ2VyKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CisgICAgICAgIGlmIG5hbWUuc3BsaXQoIi4iKVswXSA9PSAiQml0QmFrZSI6CisgICAgICAgICAgICBzZWxmLmRlYnVnID0gc2VsZi5iYmRlYnVnCisgICAgICAgIExvZ2dlci5fX2luaXRfXyhzZWxmLCBuYW1lKQorCisgICAgZGVmIGJiZGVidWcoc2VsZiwgbGV2ZWwsIG1zZywgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYubG9nKGxvZ2dpbmcuREVCVUcgLSBsZXZlbCArIDEsIG1zZywgKmFyZ3MsICoqa3dhcmdzKQorCisgICAgZGVmIHBsYWluKHNlbGYsIG1zZywgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYubG9nKGxvZ2dpbmcuSU5GTyArIDEsIG1zZywgKmFyZ3MsICoqa3dhcmdzKQorCisgICAgZGVmIHZlcmJvc2Uoc2VsZiwgbXNnLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5sb2cobG9nZ2luZy5JTkZPIC0gMSwgbXNnLCAqYXJncywgKiprd2FyZ3MpCisKK2xvZ2dpbmcucmFpc2VFeGNlcHRpb25zID0gRmFsc2UKK2xvZ2dpbmcuc2V0TG9nZ2VyQ2xhc3MoQkJMb2dnZXIpCisKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJCaXRCYWtlIikKK2xvZ2dlci5hZGRIYW5kbGVyKE51bGxIYW5kbGVyKCkpCitsb2dnZXIuc2V0TGV2ZWwobG9nZ2luZy5ERUJVRyAtIDIpCisKKyMgVGhpcyBoYXMgdG8gYmUgaW1wb3J0ZWQgYWZ0ZXIgdGhlIHNldExvZ2dlckNsYXNzLCBhcyB0aGUgaW1wb3J0IG9mIGJiLm1zZworIyBjYW4gcmVzdWx0IGluIGNvbnN0cnVjdGlvbiBvZiB0aGUgdmFyaW91cyBsb2dnZXJzLgoraW1wb3J0IGJiLm1zZworCitmcm9tIGJiIGltcG9ydCBmZXRjaDIgYXMgZmV0Y2gKK3N5cy5tb2R1bGVzWydiYi5mZXRjaCddID0gc3lzLm1vZHVsZXNbJ2JiLmZldGNoMiddCisKKyMgTWVzc2FnaW5nIGNvbnZlbmllbmNlIGZ1bmN0aW9ucworZGVmIHBsYWluKCphcmdzKToKKyAgICBsb2dnZXIucGxhaW4oJycuam9pbihhcmdzKSkKKworZGVmIGRlYnVnKGx2bCwgKmFyZ3MpOgorICAgIGlmIGlzaW5zdGFuY2UobHZsLCBiYXNlc3RyaW5nKToKKyAgICAgICAgbG9nZ2VyLndhcm4oIlBhc3NlZCBpbnZhbGlkIGRlYnVnIGxldmVsICclcycgdG8gYmIuZGVidWciLCBsdmwpCisgICAgICAgIGFyZ3MgPSAobHZsLCkgKyBhcmdzCisgICAgICAgIGx2bCA9IDEKKyAgICBsb2dnZXIuZGVidWcobHZsLCAnJy5qb2luKGFyZ3MpKQorCitkZWYgbm90ZSgqYXJncyk6CisgICAgbG9nZ2VyLmluZm8oJycuam9pbihhcmdzKSkKKworZGVmIHdhcm4oKmFyZ3MpOgorICAgIGxvZ2dlci53YXJuKCcnLmpvaW4oYXJncykpCisKK2RlZiBlcnJvcigqYXJncywgKiprd2FyZ3MpOgorICAgIGxvZ2dlci5lcnJvcignJy5qb2luKGFyZ3MpLCBleHRyYT1rd2FyZ3MpCisKK2RlZiBmYXRhbCgqYXJncywgKiprd2FyZ3MpOgorICAgIGxvZ2dlci5jcml0aWNhbCgnJy5qb2luKGFyZ3MpLCBleHRyYT1rd2FyZ3MpCisgICAgcmFpc2UgQkJIYW5kbGVkRXhjZXB0aW9uKCkKKworZGVmIGRlcHJlY2F0ZWQoZnVuYywgbmFtZT1Ob25lLCBhZHZpY2U9IiIpOgorICAgICIiIlRoaXMgaXMgYSBkZWNvcmF0b3Igd2hpY2ggY2FuIGJlIHVzZWQgdG8gbWFyayBmdW5jdGlvbnMKKyAgICBhcyBkZXByZWNhdGVkLiBJdCB3aWxsIHJlc3VsdCBpbiBhIHdhcm5pbmcgYmVpbmcgZW1pdHRlZAorICAgIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIHVzZWQuIiIiCisgICAgaW1wb3J0IHdhcm5pbmdzCisKKyAgICBpZiBhZHZpY2U6CisgICAgICAgIGFkdmljZSA9ICI6ICVzIiAlIGFkdmljZQorICAgIGlmIG5hbWUgaXMgTm9uZToKKyAgICAgICAgbmFtZSA9IGZ1bmMuX19uYW1lX18KKworICAgIGRlZiBuZXdGdW5jKCphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbGwgdG8gZGVwcmVjYXRlZCBmdW5jdGlvbiAlcyVzLiIgJSAobmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5PURlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICBzdGFja2xldmVsPTIpCisgICAgICAgIHJldHVybiBmdW5jKCphcmdzLCAqKmt3YXJncykKKyAgICBuZXdGdW5jLl9fbmFtZV9fID0gZnVuYy5fX25hbWVfXworICAgIG5ld0Z1bmMuX19kb2NfXyA9IGZ1bmMuX19kb2NfXworICAgIG5ld0Z1bmMuX19kaWN0X18udXBkYXRlKGZ1bmMuX19kaWN0X18pCisgICAgcmV0dXJuIG5ld0Z1bmMKKworIyBGb3IgY29tcGF0aWJpbGl0eQorZGVmIGRlcHJlY2F0ZV9pbXBvcnQoY3VycmVudCwgbW9kdWxlbmFtZSwgZnJvbWxpc3QsIHJlbmFtZXMgPSBOb25lKToKKyAgICAiIiJJbXBvcnQgb2JqZWN0cyBmcm9tIG9uZSBtb2R1bGUgaW50byBhbm90aGVyLCB3cmFwcGluZyB0aGVtIHdpdGggYSBEZXByZWNhdGlvbldhcm5pbmciIiIKKyAgICBpbXBvcnQgc3lzCisKKyAgICBtb2R1bGUgPSBfX2ltcG9ydF9fKG1vZHVsZW5hbWUsIGZyb21saXN0ID0gZnJvbWxpc3QpCisgICAgZm9yIHBvc2l0aW9uLCBvYmpuYW1lIGluIGVudW1lcmF0ZShmcm9tbGlzdCk6CisgICAgICAgIG9iaiA9IGdldGF0dHIobW9kdWxlLCBvYmpuYW1lKQorICAgICAgICBuZXdvYmogPSBkZXByZWNhdGVkKG9iaiwgInswfS57MX0iLmZvcm1hdChjdXJyZW50LCBvYmpuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGxlYXNlIHVzZSB7MH0uezF9IGluc3RlYWQiLmZvcm1hdChtb2R1bGVuYW1lLCBvYmpuYW1lKSkKKyAgICAgICAgaWYgcmVuYW1lczoKKyAgICAgICAgICAgIG5ld25hbWUgPSByZW5hbWVzW3Bvc2l0aW9uXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmV3bmFtZSA9IG9iam5hbWUKKworICAgICAgICBzZXRhdHRyKHN5cy5tb2R1bGVzW2N1cnJlbnRdLCBuZXduYW1lLCBuZXdvYmopCisKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL2J1aWxkLnB5IGIvYml0YmFrZS9saWIvYmIvYnVpbGQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ4YzM5NQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL2J1aWxkLnB5CkBAIC0wLDAgKzEsNzcwIEBACisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIworIyBCaXRCYWtlICdCdWlsZCcgaW1wbGVtZW50YXRpb24KKyMKKyMgQ29yZSBjb2RlIGZvciBmdW5jdGlvbiBleGVjdXRpb24gYW5kIHRhc2sgaGFuZGxpbmcgaW4gdGhlCisjIEJpdEJha2UgYnVpbGQgdG9vbHMuCisjCisjIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCAgQ2hyaXMgTGFyc29uCisjCisjIEJhc2VkIG9uIEdlbnRvbydzIHBvcnRhZ2UucHkuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBCYXNlZCBvbiBmdW5jdGlvbnMgZnJvbSB0aGUgYmFzZSBiYiBtb2R1bGUsIENvcHlyaWdodCAyMDAzIEhvbGdlciBTY2h1cmlnCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBzaGxleAoraW1wb3J0IGdsb2IKK2ltcG9ydCB0aW1lCitpbXBvcnQgc3RhdAoraW1wb3J0IGJiCitpbXBvcnQgYmIubXNnCitpbXBvcnQgYmIucHJvY2VzcworZnJvbSBjb250ZXh0bGliIGltcG9ydCBuZXN0ZWQKK2Zyb20gYmIgaW1wb3J0IGV2ZW50LCB1dGlscworCitiYmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCdCaXRCYWtlJykKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCdCaXRCYWtlLkJ1aWxkJykKKworTlVMTCA9IG9wZW4ob3MuZGV2bnVsbCwgJ3IrJykKKworX19tdGltZV9jYWNoZSA9IHt9CisKK2RlZiBjYWNoZWRfbXRpbWVfbm9lcnJvcihmKToKKyAgICBpZiBmIG5vdCBpbiBfX210aW1lX2NhY2hlOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBfX210aW1lX2NhY2hlW2ZdID0gb3Muc3RhdChmKVtzdGF0LlNUX01USU1FXQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgcmV0dXJuIF9fbXRpbWVfY2FjaGVbZl0KKworZGVmIHJlc2V0X2NhY2hlKCk6CisgICAgZ2xvYmFsIF9fbXRpbWVfY2FjaGUKKyAgICBfX210aW1lX2NhY2hlID0ge30KKworIyBXaGVuIHdlIGV4ZWN1dGUgYSBQeXRob24gZnVuY3Rpb24sIHdlJ2QgbGlrZSBjZXJ0YWluIHRoaW5ncworIyBpbiBhbGwgbmFtZXNwYWNlcywgaGVuY2Ugd2UgYWRkIHRoZW0gdG8gX19idWlsdGluc19fLgorIyBJZiB3ZSBkbyBub3QgZG8gdGhpcyBhbmQgdXNlIHRoZSBleGVjIGdsb2JhbHMsIHRoZXkgd2lsbAorIyBub3QgYmUgYXZhaWxhYmxlIHRvIHN1YmZ1bmN0aW9ucy4KK19fYnVpbHRpbnNfX1snYmInXSA9IGJiCitfX2J1aWx0aW5zX19bJ29zJ10gPSBvcworCitjbGFzcyBGdW5jRmFpbGVkKEV4Y2VwdGlvbik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUgPSBOb25lLCBsb2dmaWxlID0gTm9uZSk6CisgICAgICAgIHNlbGYubG9nZmlsZSA9IGxvZ2ZpbGUKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBpZiBuYW1lOgorICAgICAgICAgICAgc2VsZi5tc2cgPSAnRnVuY3Rpb24gZmFpbGVkOiAlcycgJSBuYW1lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLm1zZyA9ICJGdW5jdGlvbiBmYWlsZWQiCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5sb2dmaWxlIGFuZCBvcy5wYXRoLmV4aXN0cyhzZWxmLmxvZ2ZpbGUpOgorICAgICAgICAgICAgbXNnID0gKCIlcyAobG9nIGZpbGUgaXMgbG9jYXRlZCBhdCAlcykiICUKKyAgICAgICAgICAgICAgICAgICAoc2VsZi5tc2csIHNlbGYubG9nZmlsZSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtc2cgPSBzZWxmLm1zZworICAgICAgICByZXR1cm4gbXNnCisKK2NsYXNzIFRhc2tCYXNlKGV2ZW50LkV2ZW50KToKKyAgICAiIiJCYXNlIGNsYXNzIGZvciB0YXNrIGV2ZW50cyIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHQsIGxvZ2ZpbGUsIGQpOgorICAgICAgICBzZWxmLl90YXNrID0gdAorICAgICAgICBzZWxmLl9wYWNrYWdlID0gZC5nZXRWYXIoIlBGIiwgVHJ1ZSkKKyAgICAgICAgc2VsZi50YXNrZmlsZSA9IGQuZ2V0VmFyKCJGSUxFIiwgVHJ1ZSkKKyAgICAgICAgc2VsZi50YXNrbmFtZSA9IHNlbGYuX3Rhc2sKKyAgICAgICAgc2VsZi5sb2dmaWxlID0gbG9nZmlsZQorICAgICAgICBzZWxmLnRpbWUgPSB0aW1lLnRpbWUoKQorICAgICAgICBldmVudC5FdmVudC5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLl9tZXNzYWdlID0gInJlY2lwZSAlczogdGFzayAlczogJXMiICUgKGQuZ2V0VmFyKCJQRiIsIFRydWUpLCB0LCBzZWxmLmdldERpc3BsYXlOYW1lKCkpCisKKyAgICBkZWYgZ2V0VGFzayhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Rhc2sKKworICAgIGRlZiBzZXRUYXNrKHNlbGYsIHRhc2spOgorICAgICAgICBzZWxmLl90YXNrID0gdGFzaworCisgICAgZGVmIGdldERpc3BsYXlOYW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gYmIuZXZlbnQuZ2V0TmFtZShzZWxmKVs0Ol0KKworICAgIHRhc2sgPSBwcm9wZXJ0eShnZXRUYXNrLCBzZXRUYXNrLCBOb25lLCAidGFzayBwcm9wZXJ0eSIpCisKK2NsYXNzIFRhc2tTdGFydGVkKFRhc2tCYXNlKToKKyAgICAiIiJUYXNrIGV4ZWN1dGlvbiBzdGFydGVkIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHQsIGxvZ2ZpbGUsIHRhc2tmbGFncywgZCk6CisgICAgICAgIHN1cGVyKFRhc2tTdGFydGVkLCBzZWxmKS5fX2luaXRfXyh0LCBsb2dmaWxlLCBkKQorICAgICAgICBzZWxmLnRhc2tmbGFncyA9IHRhc2tmbGFncworCitjbGFzcyBUYXNrU3VjY2VlZGVkKFRhc2tCYXNlKToKKyAgICAiIiJUYXNrIGV4ZWN1dGlvbiBjb21wbGV0ZWQiIiIKKworY2xhc3MgVGFza0ZhaWxlZChUYXNrQmFzZSk6CisgICAgIiIiVGFzayBleGVjdXRpb24gZmFpbGVkIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGFzaywgbG9nZmlsZSwgbWV0YWRhdGEsIGVycnByaW50ZWQgPSBGYWxzZSk6CisgICAgICAgIHNlbGYuZXJycHJpbnRlZCA9IGVycnByaW50ZWQKKyAgICAgICAgc3VwZXIoVGFza0ZhaWxlZCwgc2VsZikuX19pbml0X18odGFzaywgbG9nZmlsZSwgbWV0YWRhdGEpCisKK2NsYXNzIFRhc2tGYWlsZWRTaWxlbnQoVGFza0Jhc2UpOgorICAgICIiIlRhc2sgZXhlY3V0aW9uIGZhaWxlZCAoc2lsZW50bHkpIiIiCisgICAgZGVmIGdldERpc3BsYXlOYW1lKHNlbGYpOgorICAgICAgICAjIERvbid0IG5lZWQgdG8gdGVsbCB0aGUgdXNlciBpdCB3YXMgc2lsZW50CisgICAgICAgIHJldHVybiAiRmFpbGVkIgorCitjbGFzcyBUYXNrSW52YWxpZChUYXNrQmFzZSk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGFzaywgbWV0YWRhdGEpOgorICAgICAgICBzdXBlcihUYXNrSW52YWxpZCwgc2VsZikuX19pbml0X18odGFzaywgTm9uZSwgbWV0YWRhdGEpCisgICAgICAgIHNlbGYuX21lc3NhZ2UgPSAiTm8gc3VjaCB0YXNrICclcyciICUgdGFzaworCisKK2NsYXNzIExvZ1RlZShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsb2dnZXIsIG91dGZpbGUpOgorICAgICAgICBzZWxmLm91dGZpbGUgPSBvdXRmaWxlCisgICAgICAgIHNlbGYubG9nZ2VyID0gbG9nZ2VyCisgICAgICAgIHNlbGYubmFtZSA9IHNlbGYub3V0ZmlsZS5uYW1lCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgc3RyaW5nKToKKyAgICAgICAgc2VsZi5sb2dnZXIucGxhaW4oc3RyaW5nKQorICAgICAgICBzZWxmLm91dGZpbGUud3JpdGUoc3RyaW5nKQorCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgc2VsZi5vdXRmaWxlLl9fZW50ZXJfXygpCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgKmV4Y2luZm8pOgorICAgICAgICBzZWxmLm91dGZpbGUuX19leGl0X18oKmV4Y2luZm8pCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAnPExvZ1RlZSB7MH0+Jy5mb3JtYXQoc2VsZi5uYW1lKQorICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgc2VsZi5vdXRmaWxlLmZsdXNoKCkKKworZGVmIGV4ZWNfZnVuYyhmdW5jLCBkLCBkaXJzID0gTm9uZSk6CisgICAgIiIiRXhlY3V0ZSBhIEJCICdmdW5jdGlvbiciIiIKKworICAgIGJvZHkgPSBkLmdldFZhcihmdW5jLCBGYWxzZSkKKyAgICBpZiBub3QgYm9keToKKyAgICAgICAgaWYgYm9keSBpcyBOb25lOgorICAgICAgICAgICAgbG9nZ2VyLndhcm4oIkZ1bmN0aW9uICVzIGRvZXNuJ3QgZXhpc3QiLCBmdW5jKQorICAgICAgICByZXR1cm4KKworICAgIGZsYWdzID0gZC5nZXRWYXJGbGFncyhmdW5jKQorICAgIGNsZWFuZGlycyA9IGZsYWdzLmdldCgnY2xlYW5kaXJzJykKKyAgICBpZiBjbGVhbmRpcnM6CisgICAgICAgIGZvciBjZGlyIGluIGQuZXhwYW5kKGNsZWFuZGlycykuc3BsaXQoKToKKyAgICAgICAgICAgIGJiLnV0aWxzLnJlbW92ZShjZGlyLCBUcnVlKQorICAgICAgICAgICAgYmIudXRpbHMubWtkaXJoaWVyKGNkaXIpCisKKyAgICBpZiBkaXJzIGlzIE5vbmU6CisgICAgICAgIGRpcnMgPSBmbGFncy5nZXQoJ2RpcnMnKQorICAgICAgICBpZiBkaXJzOgorICAgICAgICAgICAgZGlycyA9IGQuZXhwYW5kKGRpcnMpLnNwbGl0KCkKKworICAgIGlmIGRpcnM6CisgICAgICAgIGZvciBhZGlyIGluIGRpcnM6CisgICAgICAgICAgICBiYi51dGlscy5ta2RpcmhpZXIoYWRpcikKKyAgICAgICAgYWRpciA9IGRpcnNbLTFdCisgICAgZWxzZToKKyAgICAgICAgYWRpciA9IGQuZ2V0VmFyKCdCJywgVHJ1ZSkKKyAgICAgICAgYmIudXRpbHMubWtkaXJoaWVyKGFkaXIpCisKKyAgICBpc3B5dGhvbiA9IGZsYWdzLmdldCgncHl0aG9uJykKKworICAgIGxvY2tmbGFnID0gZmxhZ3MuZ2V0KCdsb2NrZmlsZXMnKQorICAgIGlmIGxvY2tmbGFnOgorICAgICAgICBsb2NrZmlsZXMgPSBbZiBmb3IgZiBpbiBkLmV4cGFuZChsb2NrZmxhZykuc3BsaXQoKV0KKyAgICBlbHNlOgorICAgICAgICBsb2NrZmlsZXMgPSBOb25lCisKKyAgICB0ZW1wZGlyID0gZC5nZXRWYXIoJ1QnLCBUcnVlKQorCisgICAgIyBvciBmdW5jIGFsbG93cyBpdGVtcyB0byBiZSBleGVjdXRlZCBvdXRzaWRlIG9mIHRoZSBub3JtYWwKKyAgICAjIHRhc2sgc2V0LCBzdWNoIGFzIGJ1aWxkaGlzdG9yeQorICAgIHRhc2sgPSBkLmdldFZhcignQkJfUlVOVEFTSycsIFRydWUpIG9yIGZ1bmMKKyAgICBpZiB0YXNrID09IGZ1bmM6CisgICAgICAgIHRhc2tmdW5jID0gdGFzaworICAgIGVsc2U6CisgICAgICAgIHRhc2tmdW5jID0gIiVzLiVzIiAlICh0YXNrLCBmdW5jKQorCisgICAgcnVuZm10ID0gZC5nZXRWYXIoJ0JCX1JVTkZNVCcsIFRydWUpIG9yICJydW4ue2Z1bmN9LntwaWR9IgorICAgIHJ1bmZuID0gcnVuZm10LmZvcm1hdCh0YXNrZnVuYz10YXNrZnVuYywgdGFzaz10YXNrLCBmdW5jPWZ1bmMsIHBpZD1vcy5nZXRwaWQoKSkKKyAgICBydW5maWxlID0gb3MucGF0aC5qb2luKHRlbXBkaXIsIHJ1bmZuKQorICAgIGJiLnV0aWxzLm1rZGlyaGllcihvcy5wYXRoLmRpcm5hbWUocnVuZmlsZSkpCisKKyAgICAjIFNldHVwIHRoZSBjb3VydGVzeSBsaW5rIHRvIHRoZSBydW5mbiwgb25seSBmb3IgdGFza3MKKyAgICAjIHdlIGNyZWF0ZSB0aGUgbGluayAnanVzdCcgYmVmb3JlIHRoZSBydW4gc2NyaXB0IGlzIGNyZWF0ZWQKKyAgICAjIGlmIHdlIGNyZWF0ZSBpdCBhZnRlciwgYW5kIGlmIHRoZSBydW4gc2NyaXB0IGZhaWxzLCB0aGVuIHRoZQorICAgICMgbGluayB3b24ndCBiZSBjcmVhdGVkIGFzIGFuIGV4Y2VwdGlvbiB3b3VsZCBiZSBmaXJlZC4KKyAgICBpZiB0YXNrID09IGZ1bmM6CisgICAgICAgIHJ1bmxpbmsgPSBvcy5wYXRoLmpvaW4odGVtcGRpciwgJ3J1bi57MH0nLmZvcm1hdCh0YXNrKSkKKyAgICAgICAgaWYgcnVubGluazoKKyAgICAgICAgICAgIGJiLnV0aWxzLnJlbW92ZShydW5saW5rKQorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3Muc3ltbGluayhydW5mbiwgcnVubGluaykKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgIHdpdGggYmIudXRpbHMuZmlsZXNsb2NrZWQobG9ja2ZpbGVzKToKKyAgICAgICAgaWYgaXNweXRob246CisgICAgICAgICAgICBleGVjX2Z1bmNfcHl0aG9uKGZ1bmMsIGQsIHJ1bmZpbGUsIGN3ZD1hZGlyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZXhlY19mdW5jX3NoZWxsKGZ1bmMsIGQsIHJ1bmZpbGUsIGN3ZD1hZGlyKQorCitfZnVuY3Rpb25mbXQgPSAiIiIKK2RlZiB7ZnVuY3Rpb259KGQpOgore2JvZHl9CisKK3tmdW5jdGlvbn0oZCkKKyIiIgorbG9nZm9ybWF0dGVyID0gYmIubXNnLkJCTG9nRm9ybWF0dGVyKCIlKGxldmVsbmFtZSlzOiAlKG1lc3NhZ2UpcyIpCitkZWYgZXhlY19mdW5jX3B5dGhvbihmdW5jLCBkLCBydW5maWxlLCBjd2Q9Tm9uZSk6CisgICAgIiIiRXhlY3V0ZSBhIHB5dGhvbiBCQiAnZnVuY3Rpb24nIiIiCisKKyAgICBiYmZpbGUgPSBkLmdldFZhcignRklMRScsIFRydWUpCisgICAgY29kZSA9IF9mdW5jdGlvbmZtdC5mb3JtYXQoZnVuY3Rpb249ZnVuYywgYm9keT1kLmdldFZhcihmdW5jLCBUcnVlKSkKKyAgICBiYi51dGlscy5ta2RpcmhpZXIob3MucGF0aC5kaXJuYW1lKHJ1bmZpbGUpKQorICAgIHdpdGggb3BlbihydW5maWxlLCAndycpIGFzIHNjcmlwdDoKKyAgICAgICAgYmIuZGF0YS5lbWl0X2Z1bmNfcHl0aG9uKGZ1bmMsIHNjcmlwdCwgZCkKKworICAgIGlmIGN3ZDoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb2xkZGlyID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICBvbGRkaXIgPSBOb25lCisgICAgICAgIG9zLmNoZGlyKGN3ZCkKKworICAgIGJiLmRlYnVnKDIsICJFeGVjdXRpbmcgcHl0aG9uIGZ1bmN0aW9uICVzIiAlIGZ1bmMpCisKKyAgICB0cnk6CisgICAgICAgIGNvbXAgPSB1dGlscy5iZXR0ZXJfY29tcGlsZShjb2RlLCBmdW5jLCBiYmZpbGUpCisgICAgICAgIHV0aWxzLmJldHRlcl9leGVjKGNvbXAsIHsiZCI6IGR9LCBjb2RlLCBiYmZpbGUpCisgICAgZXhjZXB0IChiYi5wYXJzZS5Ta2lwUmVjaXBlLCBiYi5idWlsZC5GdW5jRmFpbGVkKToKKyAgICAgICAgcmFpc2UKKyAgICBleGNlcHQ6CisgICAgICAgIHJhaXNlIEZ1bmNGYWlsZWQoZnVuYywgTm9uZSkKKyAgICBmaW5hbGx5OgorICAgICAgICBiYi5kZWJ1ZygyLCAiUHl0aG9uIGZ1bmN0aW9uICVzIGZpbmlzaGVkIiAlIGZ1bmMpCisKKyAgICAgICAgaWYgY3dkIGFuZCBvbGRkaXI6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3MuY2hkaXIob2xkZGlyKQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCitkZWYgc2hlbGxfdHJhcF9jb2RlKCk6CisgICAgcmV0dXJuICcnJyMhL2Jpbi9zaFxuCisjIEVtaXQgYSB1c2VmdWwgZGlhZ25vc3RpYyBpZiBzb21ldGhpbmcgZmFpbHM6CitiYl9leGl0X2hhbmRsZXIoKSB7CisgICAgcmV0PSQ/CisgICAgY2FzZSAkcmV0IGluCisgICAgMCkgIDs7CisgICAgKikgIGNhc2UgJEJBU0hfVkVSU0lPTiBpbgorICAgICAgICAiIikgICBlY2hvICJXQVJOSU5HOiBleGl0IGNvZGUgJHJldCBmcm9tIGEgc2hlbGwgY29tbWFuZC4iOzsKKyAgICAgICAgKikgICAgZWNobyAiV0FSTklORzogJHtCQVNIX1NPVVJDRVswXX06JHtCQVNIX0xJTkVOT1swXX0gZXhpdCAkcmV0IGZyb20KKyAgXCIkQkFTSF9DT01NQU5EXCIiOzsKKyAgICAgICAgZXNhYworICAgICAgICBleGl0ICRyZXQKKyAgICBlc2FjCit9Cit0cmFwICdiYl9leGl0X2hhbmRsZXInIDAKK3NldCAtZQorJycnCisKK2RlZiBleGVjX2Z1bmNfc2hlbGwoZnVuYywgZCwgcnVuZmlsZSwgY3dkPU5vbmUpOgorICAgICIiIkV4ZWN1dGUgYSBzaGVsbCBmdW5jdGlvbiBmcm9tIHRoZSBtZXRhZGF0YQorCisgICAgTm90ZSBvbiBkaXJlY3RvcnkgYmVoYXZpb3IuICBUaGUgJ2RpcnMnIHZhcmZsYWcgc2hvdWxkIGNvbnRhaW4gYSBsaXN0CisgICAgb2YgdGhlIGRpcmVjdG9yaWVzIHlvdSBuZWVkIGNyZWF0ZWQgcHJpb3IgdG8gZXhlY3V0aW9uLiAgVGhlIGxhc3QKKyAgICBpdGVtIGluIHRoZSBsaXN0IGlzIHdoZXJlIHdlIHdpbGwgY2hkaXIvY2QgdG8uCisgICAgIiIiCisKKyAgICAjIERvbid0IGxldCB0aGUgZW1pdHRlZCBzaGVsbCBzY3JpcHQgb3ZlcnJpZGUgUFdECisgICAgZC5kZWxWYXJGbGFnKCdQV0QnLCAnZXhwb3J0JykKKworICAgIHdpdGggb3BlbihydW5maWxlLCAndycpIGFzIHNjcmlwdDoKKyAgICAgICAgc2NyaXB0LndyaXRlKHNoZWxsX3RyYXBfY29kZSgpKQorCisgICAgICAgIGJiLmRhdGEuZW1pdF9mdW5jKGZ1bmMsIHNjcmlwdCwgZCkKKworICAgICAgICBpZiBiYi5tc2cubG9nZ2VyVmVyYm9zZUxvZ3M6CisgICAgICAgICAgICBzY3JpcHQud3JpdGUoInNldCAteFxuIikKKyAgICAgICAgaWYgY3dkOgorICAgICAgICAgICAgc2NyaXB0LndyaXRlKCJjZCAnJXMnXG4iICUgY3dkKQorICAgICAgICBzY3JpcHQud3JpdGUoIiVzXG4iICUgZnVuYykKKyAgICAgICAgc2NyaXB0LndyaXRlKCcnJworIyBjbGVhbnVwCityZXQ9JD8KK3RyYXAgJycgMAorZXhpdCAkcmV0CisnJycpCisKKyAgICBvcy5jaG1vZChydW5maWxlLCAwNzc1KQorCisgICAgY21kID0gcnVuZmlsZQorICAgIGlmIGQuZ2V0VmFyRmxhZyhmdW5jLCAnZmFrZXJvb3QnKToKKyAgICAgICAgZmFrZXJvb3RjbWQgPSBkLmdldFZhcignRkFLRVJPT1QnLCBUcnVlKQorICAgICAgICBpZiBmYWtlcm9vdGNtZDoKKyAgICAgICAgICAgIGNtZCA9IFtmYWtlcm9vdGNtZCwgcnVuZmlsZV0KKworICAgIGlmIGJiLm1zZy5sb2dnZXJEZWZhdWx0VmVyYm9zZToKKyAgICAgICAgbG9nZmlsZSA9IExvZ1RlZShsb2dnZXIsIHN5cy5zdGRvdXQpCisgICAgZWxzZToKKyAgICAgICAgbG9nZmlsZSA9IHN5cy5zdGRvdXQKKworICAgIGRlZiByZWFkZmlmbyhkYXRhKToKKyAgICAgICAgbGluZXMgPSBkYXRhLnNwbGl0KCdcMCcpCisgICAgICAgIGZvciBsaW5lIGluIGxpbmVzOgorICAgICAgICAgICAgc3BsaXR2YWwgPSBsaW5lLnNwbGl0KCcgJywgMSkKKyAgICAgICAgICAgIGNtZCA9IHNwbGl0dmFsWzBdCisgICAgICAgICAgICBpZiBsZW4oc3BsaXR2YWwpID4gMToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHNwbGl0dmFsWzFdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHZhbHVlID0gJycKKyAgICAgICAgICAgIGlmIGNtZCA9PSAnYmJwbGFpbic6CisgICAgICAgICAgICAgICAgYmIucGxhaW4odmFsdWUpCisgICAgICAgICAgICBlbGlmIGNtZCA9PSAnYmJub3RlJzoKKyAgICAgICAgICAgICAgICBiYi5ub3RlKHZhbHVlKQorICAgICAgICAgICAgZWxpZiBjbWQgPT0gJ2Jid2Fybic6CisgICAgICAgICAgICAgICAgYmIud2Fybih2YWx1ZSkKKyAgICAgICAgICAgIGVsaWYgY21kID09ICdiYmVycm9yJzoKKyAgICAgICAgICAgICAgICBiYi5lcnJvcih2YWx1ZSkKKyAgICAgICAgICAgIGVsaWYgY21kID09ICdiYmZhdGFsJzoKKyAgICAgICAgICAgICAgICAjIFRoZSBjYWxsZXIgd2lsbCBjYWxsIGV4aXQgdGhlbXNlbHZlcywgc28gYmIuZXJyb3IoKSBpcworICAgICAgICAgICAgICAgICMgd2hhdCB3ZSB3YW50IGhlcmUgcmF0aGVyIHRoYW4gYmIuZmF0YWwoKQorICAgICAgICAgICAgICAgIGJiLmVycm9yKHZhbHVlKQorICAgICAgICAgICAgZWxpZiBjbWQgPT0gJ2JiZmF0YWxfbG9nJzoKKyAgICAgICAgICAgICAgICBiYi5lcnJvcih2YWx1ZSwgZm9yY2Vsb2c9VHJ1ZSkKKyAgICAgICAgICAgIGVsaWYgY21kID09ICdiYmRlYnVnJzoKKyAgICAgICAgICAgICAgICBzcGxpdHZhbCA9IHZhbHVlLnNwbGl0KCcgJywgMSkKKyAgICAgICAgICAgICAgICBsZXZlbCA9IGludChzcGxpdHZhbFswXSkKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHNwbGl0dmFsWzFdCisgICAgICAgICAgICAgICAgYmIuZGVidWcobGV2ZWwsIHZhbHVlKQorCisgICAgdGVtcGRpciA9IGQuZ2V0VmFyKCdUJywgVHJ1ZSkKKyAgICBmaWZvcGF0aCA9IG9zLnBhdGguam9pbih0ZW1wZGlyLCAnZmlmby4lcycgJSBvcy5nZXRwaWQoKSkKKyAgICBpZiBvcy5wYXRoLmV4aXN0cyhmaWZvcGF0aCk6CisgICAgICAgIG9zLnVubGluayhmaWZvcGF0aCkKKyAgICBvcy5ta2ZpZm8oZmlmb3BhdGgpCisgICAgd2l0aCBvcGVuKGZpZm9wYXRoLCAncisnKSBhcyBmaWZvOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBiYi5kZWJ1ZygyLCAiRXhlY3V0aW5nIHNoZWxsIGZ1bmN0aW9uICVzIiAlIGZ1bmMpCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB3aXRoIG9wZW4ob3MuZGV2bnVsbCwgJ3IrJykgYXMgc3RkaW46CisgICAgICAgICAgICAgICAgICAgIGJiLnByb2Nlc3MucnVuKGNtZCwgc2hlbGw9RmFsc2UsIHN0ZGluPXN0ZGluLCBsb2c9bG9nZmlsZSwgZXh0cmFmaWxlcz1bKGZpZm8scmVhZGZpZm8pXSkKKyAgICAgICAgICAgIGV4Y2VwdCBiYi5wcm9jZXNzLkNtZEVycm9yOgorICAgICAgICAgICAgICAgIGxvZ2ZuID0gZC5nZXRWYXIoJ0JCX0xPR0ZJTEUnLCBUcnVlKQorICAgICAgICAgICAgICAgIHJhaXNlIEZ1bmNGYWlsZWQoZnVuYywgbG9nZm4pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy51bmxpbmsoZmlmb3BhdGgpCisKKyAgICBiYi5kZWJ1ZygyLCAiU2hlbGwgZnVuY3Rpb24gJXMgZmluaXNoZWQiICUgZnVuYykKKworZGVmIF90YXNrX2RhdGEoZm4sIHRhc2ssIGQpOgorICAgIGxvY2FsZGF0YSA9IGJiLmRhdGEuY3JlYXRlQ29weShkKQorICAgIGxvY2FsZGF0YS5zZXRWYXIoJ0JCX0ZJTEVOQU1FJywgZm4pCisgICAgbG9jYWxkYXRhLnNldFZhcignQkJfQ1VSUkVOVFRBU0snLCB0YXNrWzM6XSkKKyAgICBsb2NhbGRhdGEuc2V0VmFyKCdPVkVSUklERVMnLCAndGFzay0lczolcycgJQorICAgICAgICAgICAgICAgICAgICAgKHRhc2tbMzpdLnJlcGxhY2UoJ18nLCAnLScpLCBkLmdldFZhcignT1ZFUlJJREVTJywgRmFsc2UpKSkKKyAgICBsb2NhbGRhdGEuZmluYWxpemUoKQorICAgIGJiLmRhdGEuZXhwYW5kS2V5cyhsb2NhbGRhdGEpCisgICAgcmV0dXJuIGxvY2FsZGF0YQorCitkZWYgX2V4ZWNfdGFzayhmbiwgdGFzaywgZCwgcXVpZXRlcnIpOgorICAgICIiIkV4ZWN1dGUgYSBCQiAndGFzaycKKworICAgIEV4ZWN1dGlvbiBvZiBhIHRhc2sgaW52b2x2ZXMgYSBiaXQgbW9yZSBzZXR1cCB0aGFuIGV4ZWN1dGluZyBhIGZ1bmN0aW9uLAorICAgIHJ1bm5pbmcgaXQgd2l0aCBpdHMgb3duIGxvY2FsIG1ldGFkYXRhLCBhbmQgd2l0aCBzb21lIHVzZWZ1bCB2YXJpYWJsZXMgc2V0LgorICAgICIiIgorICAgIGlmIG5vdCBkLmdldFZhckZsYWcodGFzaywgJ3Rhc2snKToKKyAgICAgICAgZXZlbnQuZmlyZShUYXNrSW52YWxpZCh0YXNrLCBkKSwgZCkKKyAgICAgICAgbG9nZ2VyLmVycm9yKCJObyBzdWNoIHRhc2s6ICVzIiAlIHRhc2spCisgICAgICAgIHJldHVybiAxCisKKyAgICBsb2dnZXIuZGVidWcoMSwgIkV4ZWN1dGluZyB0YXNrICVzIiwgdGFzaykKKworICAgIGxvY2FsZGF0YSA9IF90YXNrX2RhdGEoZm4sIHRhc2ssIGQpCisgICAgdGVtcGRpciA9IGxvY2FsZGF0YS5nZXRWYXIoJ1QnLCBUcnVlKQorICAgIGlmIG5vdCB0ZW1wZGlyOgorICAgICAgICBiYi5mYXRhbCgiVCB2YXJpYWJsZSBub3Qgc2V0LCB1bmFibGUgdG8gYnVpbGQiKQorCisgICAgIyBDaGFuZ2UgbmljZSBsZXZlbCBpZiB3ZSdyZSBhc2tlZCB0bworICAgIG5pY2UgPSBsb2NhbGRhdGEuZ2V0VmFyKCJCQl9UQVNLX05JQ0VfTEVWRUwiLCBUcnVlKQorICAgIGlmIG5pY2U6CisgICAgICAgIGN1cm5pY2UgPSBvcy5uaWNlKDApCisgICAgICAgIG5pY2UgPSBpbnQobmljZSkgLSBjdXJuaWNlCisgICAgICAgIG5ld25pY2UgPSBvcy5uaWNlKG5pY2UpCisgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiUmVuaWNlIHRvICVzICIgJSBuZXduaWNlKQorCisgICAgYmIudXRpbHMubWtkaXJoaWVyKHRlbXBkaXIpCisKKyAgICAjIERldGVybWluZSB0aGUgbG9nZmlsZSB0byBnZW5lcmF0ZQorICAgIGxvZ2ZtdCA9IGxvY2FsZGF0YS5nZXRWYXIoJ0JCX0xPR0ZNVCcsIFRydWUpIG9yICdsb2cue3Rhc2t9LntwaWR9JworICAgIGxvZ2Jhc2UgPSBsb2dmbXQuZm9ybWF0KHRhc2s9dGFzaywgcGlkPW9zLmdldHBpZCgpKQorCisgICAgIyBEb2N1bWVudCB0aGUgb3JkZXIgb2YgdGhlIHRhc2tzLi4uCisgICAgbG9nb3JkZXIgPSBvcy5wYXRoLmpvaW4odGVtcGRpciwgJ2xvZy50YXNrX29yZGVyJykKKyAgICB0cnk6CisgICAgICAgIHdpdGggb3Blbihsb2dvcmRlciwgJ2EnKSBhcyBsb2dvcmRlcmZpbGU6CisgICAgICAgICAgICBsb2dvcmRlcmZpbGUud3JpdGUoJ3swfSAoezF9KTogezJ9XG4nLmZvcm1hdCh0YXNrLCBvcy5nZXRwaWQoKSwgbG9nYmFzZSkpCisgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgIGxvZ2dlci5leGNlcHRpb24oIk9wZW5pbmcgbG9nIGZpbGUgJyVzJyIsIGxvZ29yZGVyKQorICAgICAgICBwYXNzCisKKyAgICAjIFNldHVwIHRoZSBjb3VydGVzeSBsaW5rIHRvIHRoZSBsb2dmbgorICAgIGxvZ2xpbmsgPSBvcy5wYXRoLmpvaW4odGVtcGRpciwgJ2xvZy57MH0nLmZvcm1hdCh0YXNrKSkKKyAgICBsb2dmbiA9IG9zLnBhdGguam9pbih0ZW1wZGlyLCBsb2diYXNlKQorICAgIGlmIGxvZ2xpbms6CisgICAgICAgIGJiLnV0aWxzLnJlbW92ZShsb2dsaW5rKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgb3Muc3ltbGluayhsb2diYXNlLCBsb2dsaW5rKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgcGFzcworCisgICAgcHJlZnVuY3MgPSBsb2NhbGRhdGEuZ2V0VmFyRmxhZyh0YXNrLCAncHJlZnVuY3MnLCBleHBhbmQ9VHJ1ZSkKKyAgICBwb3N0ZnVuY3MgPSBsb2NhbGRhdGEuZ2V0VmFyRmxhZyh0YXNrLCAncG9zdGZ1bmNzJywgZXhwYW5kPVRydWUpCisKKyAgICBjbGFzcyBFcnJvckNoZWNrSGFuZGxlcihsb2dnaW5nLkhhbmRsZXIpOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICBzZWxmLnRyaWdnZXJlZCA9IEZhbHNlCisgICAgICAgICAgICBsb2dnaW5nLkhhbmRsZXIuX19pbml0X18oc2VsZiwgbG9nZ2luZy5FUlJPUikKKyAgICAgICAgZGVmIGVtaXQoc2VsZiwgcmVjb3JkKToKKyAgICAgICAgICAgIGlmIGdldGF0dHIocmVjb3JkLCAnZm9yY2Vsb2cnLCBGYWxzZSk6CisgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyZWQgPSBGYWxzZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJlZCA9IFRydWUKKworICAgICMgSGFuZGxlIGxvZ2ZpbGVzCisgICAgc2kgPSBvcGVuKCcvZGV2L251bGwnLCAncicpCisgICAgdHJ5OgorICAgICAgICBiYi51dGlscy5ta2RpcmhpZXIob3MucGF0aC5kaXJuYW1lKGxvZ2ZuKSkKKyAgICAgICAgbG9nZmlsZSA9IG9wZW4obG9nZm4sICd3JykKKyAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbigiT3BlbmluZyBsb2cgZmlsZSAnJXMnIiwgbG9nZm4pCisgICAgICAgIHBhc3MKKworICAgICMgRHVwIHRoZSBleGlzdGluZyBmZHMgc28gd2UgZG9udCBsb3NlIHRoZW0KKyAgICBvc2kgPSBbb3MuZHVwKHN5cy5zdGRpbi5maWxlbm8oKSksIHN5cy5zdGRpbi5maWxlbm8oKV0KKyAgICBvc28gPSBbb3MuZHVwKHN5cy5zdGRvdXQuZmlsZW5vKCkpLCBzeXMuc3Rkb3V0LmZpbGVubygpXQorICAgIG9zZSA9IFtvcy5kdXAoc3lzLnN0ZGVyci5maWxlbm8oKSksIHN5cy5zdGRlcnIuZmlsZW5vKCldCisKKyAgICAjIFJlcGxhY2UgdGhvc2UgZmRzIHdpdGggb3VyIG93bgorICAgIG9zLmR1cDIoc2kuZmlsZW5vKCksIG9zaVsxXSkKKyAgICBvcy5kdXAyKGxvZ2ZpbGUuZmlsZW5vKCksIG9zb1sxXSkKKyAgICBvcy5kdXAyKGxvZ2ZpbGUuZmlsZW5vKCksIG9zZVsxXSkKKworICAgICMgRW5zdXJlIFB5dGhvbiBsb2dnaW5nIGdvZXMgdG8gdGhlIGxvZ2ZpbGUKKyAgICBoYW5kbGVyID0gbG9nZ2luZy5TdHJlYW1IYW5kbGVyKGxvZ2ZpbGUpCisgICAgaGFuZGxlci5zZXRGb3JtYXR0ZXIobG9nZm9ybWF0dGVyKQorICAgICMgQWx3YXlzIGVuYWJsZSBmdWxsIGRlYnVnIG91dHB1dCBpbnRvIHRhc2sgbG9nZmlsZXMKKyAgICBoYW5kbGVyLnNldExldmVsKGxvZ2dpbmcuREVCVUcgLSAyKQorICAgIGJibG9nZ2VyLmFkZEhhbmRsZXIoaGFuZGxlcikKKworICAgIGVycmNoayA9IEVycm9yQ2hlY2tIYW5kbGVyKCkKKyAgICBiYmxvZ2dlci5hZGRIYW5kbGVyKGVycmNoaykKKworICAgIGxvY2FsZGF0YS5zZXRWYXIoJ0JCX0xPR0ZJTEUnLCBsb2dmbikKKyAgICBsb2NhbGRhdGEuc2V0VmFyKCdCQl9SVU5UQVNLJywgdGFzaykKKworICAgIGZsYWdzID0gbG9jYWxkYXRhLmdldFZhckZsYWdzKHRhc2spCisKKyAgICBldmVudC5maXJlKFRhc2tTdGFydGVkKHRhc2ssIGxvZ2ZuLCBmbGFncywgbG9jYWxkYXRhKSwgbG9jYWxkYXRhKQorICAgIHRyeToKKyAgICAgICAgZm9yIGZ1bmMgaW4gKHByZWZ1bmNzIG9yICcnKS5zcGxpdCgpOgorICAgICAgICAgICAgZXhlY19mdW5jKGZ1bmMsIGxvY2FsZGF0YSkKKyAgICAgICAgZXhlY19mdW5jKHRhc2ssIGxvY2FsZGF0YSkKKyAgICAgICAgZm9yIGZ1bmMgaW4gKHBvc3RmdW5jcyBvciAnJykuc3BsaXQoKToKKyAgICAgICAgICAgIGV4ZWNfZnVuYyhmdW5jLCBsb2NhbGRhdGEpCisgICAgZXhjZXB0IEZ1bmNGYWlsZWQgYXMgZXhjOgorICAgICAgICBpZiBxdWlldGVycjoKKyAgICAgICAgICAgIGV2ZW50LmZpcmUoVGFza0ZhaWxlZFNpbGVudCh0YXNrLCBsb2dmbiwgbG9jYWxkYXRhKSwgbG9jYWxkYXRhKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZXJycHJpbnRlZCA9IGVycmNoay50cmlnZ2VyZWQKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcihzdHIoZXhjKSkKKyAgICAgICAgICAgIGV2ZW50LmZpcmUoVGFza0ZhaWxlZCh0YXNrLCBsb2dmbiwgbG9jYWxkYXRhLCBlcnJwcmludGVkKSwgbG9jYWxkYXRhKQorICAgICAgICByZXR1cm4gMQorICAgIGZpbmFsbHk6CisgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQorICAgICAgICBzeXMuc3RkZXJyLmZsdXNoKCkKKworICAgICAgICBiYmxvZ2dlci5yZW1vdmVIYW5kbGVyKGhhbmRsZXIpCisKKyAgICAgICAgIyBSZXN0b3JlIHRoZSBiYWNrdXAgZmRzCisgICAgICAgIG9zLmR1cDIob3NpWzBdLCBvc2lbMV0pCisgICAgICAgIG9zLmR1cDIob3NvWzBdLCBvc29bMV0pCisgICAgICAgIG9zLmR1cDIob3NlWzBdLCBvc2VbMV0pCisKKyAgICAgICAgIyBDbG9zZSB0aGUgYmFja3VwIGZkcworICAgICAgICBvcy5jbG9zZShvc2lbMF0pCisgICAgICAgIG9zLmNsb3NlKG9zb1swXSkKKyAgICAgICAgb3MuY2xvc2Uob3NlWzBdKQorICAgICAgICBzaS5jbG9zZSgpCisKKyAgICAgICAgbG9nZmlsZS5jbG9zZSgpCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGxvZ2ZuKSBhbmQgb3MucGF0aC5nZXRzaXplKGxvZ2ZuKSA9PSAwOgorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICJaZXJvIHNpemUgbG9nZm4gJXMsIHJlbW92aW5nIiwgbG9nZm4pCisgICAgICAgICAgICBiYi51dGlscy5yZW1vdmUobG9nZm4pCisgICAgICAgICAgICBiYi51dGlscy5yZW1vdmUobG9nbGluaykKKyAgICBldmVudC5maXJlKFRhc2tTdWNjZWVkZWQodGFzaywgbG9nZm4sIGxvY2FsZGF0YSksIGxvY2FsZGF0YSkKKworICAgIGlmIG5vdCBsb2NhbGRhdGEuZ2V0VmFyRmxhZyh0YXNrLCAnbm9zdGFtcCcpIGFuZCBub3QgbG9jYWxkYXRhLmdldFZhckZsYWcodGFzaywgJ3NlbGZzdGFtcCcpOgorICAgICAgICBtYWtlX3N0YW1wKHRhc2ssIGxvY2FsZGF0YSkKKworICAgIHJldHVybiAwCisKK2RlZiBleGVjX3Rhc2soZm4sIHRhc2ssIGQsIHByb2ZpbGUgPSBGYWxzZSk6CisgICAgdHJ5OgorICAgICAgICBxdWlldGVyciA9IEZhbHNlCisgICAgICAgIGlmIGQuZ2V0VmFyRmxhZyh0YXNrLCAicXVpZXRlcnJvcnMiKSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHF1aWV0ZXJyID0gVHJ1ZQorCisgICAgICAgIGlmIHByb2ZpbGU6CisgICAgICAgICAgICBwcm9mbmFtZSA9ICJwcm9maWxlLSVzLmxvZyIgJSAoZC5nZXRWYXIoIlBOIiwgVHJ1ZSkgKyAiLSIgKyB0YXNrKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGltcG9ydCBjUHJvZmlsZSBhcyBwcm9maWxlCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgaW1wb3J0IHByb2ZpbGUKKyAgICAgICAgICAgIHByb2YgPSBwcm9maWxlLlByb2ZpbGUoKQorICAgICAgICAgICAgcmV0ID0gcHJvZmlsZS5Qcm9maWxlLnJ1bmNhbGwocHJvZiwgX2V4ZWNfdGFzaywgZm4sIHRhc2ssIGQsIHF1aWV0ZXJyKQorICAgICAgICAgICAgcHJvZi5kdW1wX3N0YXRzKHByb2ZuYW1lKQorICAgICAgICAgICAgYmIudXRpbHMucHJvY2Vzc19wcm9maWxlbG9nKHByb2ZuYW1lKQorCisgICAgICAgICAgICByZXR1cm4gcmV0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gX2V4ZWNfdGFzayhmbiwgdGFzaywgZCwgcXVpZXRlcnIpCisKKyAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICBmcm9tIHRyYWNlYmFjayBpbXBvcnQgZm9ybWF0X2V4YworICAgICAgICBpZiBub3QgcXVpZXRlcnI6CisgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIkJ1aWxkIG9mICVzIGZhaWxlZCIgJSAodGFzaykpCisgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZm9ybWF0X2V4YygpKQorICAgICAgICAgICAgZmFpbGVkZXZlbnQgPSBUYXNrRmFpbGVkKHRhc2ssIE5vbmUsIGQsIFRydWUpCisgICAgICAgICAgICBldmVudC5maXJlKGZhaWxlZGV2ZW50LCBkKQorICAgICAgICByZXR1cm4gMQorCitkZWYgc3RhbXBfaW50ZXJuYWwodGFza25hbWUsIGQsIGZpbGVfbmFtZSwgYmFzZW9ubHk9RmFsc2UpOgorICAgICIiIgorICAgIEludGVybmFsIHN0YW1wIGhlbHBlciBmdW5jdGlvbgorICAgIE1ha2VzIHN1cmUgdGhlIHN0YW1wIGRpcmVjdG9yeSBleGlzdHMKKyAgICBSZXR1cm5zIHRoZSBzdGFtcCBwYXRoK2ZpbGVuYW1lCisKKyAgICBJbiB0aGUgYml0YmFrZSBjb3JlLCBkIGNhbiBiZSBhIENhY2hlRGF0YSBhbmQgZmlsZV9uYW1lIHdpbGwgYmUgc2V0LgorICAgIFdoZW4gY2FsbGVkIGluIHRhc2sgY29udGV4dCwgZCB3aWxsIGJlIGEgZGF0YSBzdG9yZSwgZmlsZV9uYW1lIHdpbGwgbm90IGJlIHNldAorICAgICIiIgorICAgIHRhc2tmbGFnbmFtZSA9IHRhc2tuYW1lCisgICAgaWYgdGFza25hbWUuZW5kc3dpdGgoIl9zZXRzY2VuZSIpIGFuZCB0YXNrbmFtZSAhPSAiZG9fc2V0c2NlbmUiOgorICAgICAgICB0YXNrZmxhZ25hbWUgPSB0YXNrbmFtZS5yZXBsYWNlKCJfc2V0c2NlbmUiLCAiIikKKworICAgIGlmIGZpbGVfbmFtZToKKyAgICAgICAgc3RhbXAgPSBkLnN0YW1wX2Jhc2VbZmlsZV9uYW1lXS5nZXQodGFza2ZsYWduYW1lKSBvciBkLnN0YW1wW2ZpbGVfbmFtZV0KKyAgICAgICAgZXh0cmFpbmZvID0gZC5zdGFtcF9leHRyYWluZm9bZmlsZV9uYW1lXS5nZXQodGFza2ZsYWduYW1lKSBvciAiIgorICAgIGVsc2U6CisgICAgICAgIHN0YW1wID0gZC5nZXRWYXJGbGFnKHRhc2tmbGFnbmFtZSwgJ3N0YW1wLWJhc2UnLCBUcnVlKSBvciBkLmdldFZhcignU1RBTVAnLCBUcnVlKQorICAgICAgICBmaWxlX25hbWUgPSBkLmdldFZhcignQkJfRklMRU5BTUUnLCBUcnVlKQorICAgICAgICBleHRyYWluZm8gPSBkLmdldFZhckZsYWcodGFza2ZsYWduYW1lLCAnc3RhbXAtZXh0cmEtaW5mbycsIFRydWUpIG9yICIiCisKKyAgICBpZiBiYXNlb25seToKKyAgICAgICAgcmV0dXJuIHN0YW1wCisKKyAgICBpZiBub3Qgc3RhbXA6CisgICAgICAgIHJldHVybgorCisgICAgc3RhbXAgPSBiYi5wYXJzZS5zaWdnZW4uc3RhbXBmaWxlKHN0YW1wLCBmaWxlX25hbWUsIHRhc2tuYW1lLCBleHRyYWluZm8pCisKKyAgICBzdGFtcGRpciA9IG9zLnBhdGguZGlybmFtZShzdGFtcCkKKyAgICBpZiBjYWNoZWRfbXRpbWVfbm9lcnJvcihzdGFtcGRpcikgPT0gMDoKKyAgICAgICAgYmIudXRpbHMubWtkaXJoaWVyKHN0YW1wZGlyKQorCisgICAgcmV0dXJuIHN0YW1wCisKK2RlZiBzdGFtcF9jbGVhbm1hc2tfaW50ZXJuYWwodGFza25hbWUsIGQsIGZpbGVfbmFtZSk6CisgICAgIiIiCisgICAgSW50ZXJuYWwgc3RhbXAgaGVscGVyIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIHN0YW1wIGNsZWFuaW5nIG1hc2sKKyAgICBSZXR1cm5zIHRoZSBzdGFtcCBwYXRoK2ZpbGVuYW1lCisKKyAgICBJbiB0aGUgYml0YmFrZSBjb3JlLCBkIGNhbiBiZSBhIENhY2hlRGF0YSBhbmQgZmlsZV9uYW1lIHdpbGwgYmUgc2V0LgorICAgIFdoZW4gY2FsbGVkIGluIHRhc2sgY29udGV4dCwgZCB3aWxsIGJlIGEgZGF0YSBzdG9yZSwgZmlsZV9uYW1lIHdpbGwgbm90IGJlIHNldAorICAgICIiIgorICAgIHRhc2tmbGFnbmFtZSA9IHRhc2tuYW1lCisgICAgaWYgdGFza25hbWUuZW5kc3dpdGgoIl9zZXRzY2VuZSIpIGFuZCB0YXNrbmFtZSAhPSAiZG9fc2V0c2NlbmUiOgorICAgICAgICB0YXNrZmxhZ25hbWUgPSB0YXNrbmFtZS5yZXBsYWNlKCJfc2V0c2NlbmUiLCAiIikKKworICAgIGlmIGZpbGVfbmFtZToKKyAgICAgICAgc3RhbXAgPSBkLnN0YW1wX2Jhc2VfY2xlYW5bZmlsZV9uYW1lXS5nZXQodGFza2ZsYWduYW1lKSBvciBkLnN0YW1wY2xlYW5bZmlsZV9uYW1lXQorICAgICAgICBleHRyYWluZm8gPSBkLnN0YW1wX2V4dHJhaW5mb1tmaWxlX25hbWVdLmdldCh0YXNrZmxhZ25hbWUpIG9yICIiCisgICAgZWxzZToKKyAgICAgICAgc3RhbXAgPSBkLmdldFZhckZsYWcodGFza2ZsYWduYW1lLCAnc3RhbXAtYmFzZS1jbGVhbicsIFRydWUpIG9yIGQuZ2V0VmFyKCdTVEFNUENMRUFOJywgVHJ1ZSkKKyAgICAgICAgZmlsZV9uYW1lID0gZC5nZXRWYXIoJ0JCX0ZJTEVOQU1FJywgVHJ1ZSkKKyAgICAgICAgZXh0cmFpbmZvID0gZC5nZXRWYXJGbGFnKHRhc2tmbGFnbmFtZSwgJ3N0YW1wLWV4dHJhLWluZm8nLCBUcnVlKSBvciAiIgorCisgICAgaWYgbm90IHN0YW1wOgorICAgICAgICByZXR1cm4gW10KKworICAgIGNsZWFubWFzayA9IGJiLnBhcnNlLnNpZ2dlbi5zdGFtcGNsZWFubWFzayhzdGFtcCwgZmlsZV9uYW1lLCB0YXNrbmFtZSwgZXh0cmFpbmZvKQorCisgICAgcmV0dXJuIFtjbGVhbm1hc2ssIGNsZWFubWFzay5yZXBsYWNlKHRhc2tmbGFnbmFtZSwgdGFza2ZsYWduYW1lICsgIl9zZXRzY2VuZSIpXQorCitkZWYgbWFrZV9zdGFtcCh0YXNrLCBkLCBmaWxlX25hbWUgPSBOb25lKToKKyAgICAiIiIKKyAgICBDcmVhdGVzL3VwZGF0ZXMgYSBzdGFtcCBmb3IgYSBnaXZlbiB0YXNrCisgICAgKGQgY2FuIGJlIGEgZGF0YSBkaWN0IG9yIGRhdGFDYWNoZSkKKyAgICAiIiIKKyAgICBjbGVhbm1hc2sgPSBzdGFtcF9jbGVhbm1hc2tfaW50ZXJuYWwodGFzaywgZCwgZmlsZV9uYW1lKQorICAgIGZvciBtYXNrIGluIGNsZWFubWFzazoKKyAgICAgICAgZm9yIG5hbWUgaW4gZ2xvYi5nbG9iKG1hc2spOgorICAgICAgICAgICAgIyBQcmVzZXJ2ZSBzaWdkYXRhIGZpbGVzIGluIHRoZSBzdGFtcHMgZGlyZWN0b3J5CisgICAgICAgICAgICBpZiAic2lnZGF0YSIgaW4gbmFtZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgIyBQcmVzZXJ2ZSB0YWludCBmaWxlcyBpbiB0aGUgc3RhbXBzIGRpcmVjdG9yeQorICAgICAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgnLnRhaW50Jyk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQorCisgICAgc3RhbXAgPSBzdGFtcF9pbnRlcm5hbCh0YXNrLCBkLCBmaWxlX25hbWUpCisgICAgIyBSZW1vdmUgdGhlIGZpbGUgYW5kIHJlY3JlYXRlIHRvIGZvcmNlIHRpbWVzdGFtcAorICAgICMgY2hhbmdlIG9uIGJyb2tlbiBORlMgZmlsZXN5c3RlbXMKKyAgICBpZiBzdGFtcDoKKyAgICAgICAgYmIudXRpbHMucmVtb3ZlKHN0YW1wKQorICAgICAgICBvcGVuKHN0YW1wLCAidyIpLmNsb3NlKCkKKworICAgICMgSWYgd2UncmUgaW4gdGFzayBjb250ZXh0LCB3cml0ZSBvdXQgYSBzaWduYXR1cmUgZmlsZSBmb3IgZWFjaCB0YXNrCisgICAgIyBhcyBpdCBjb21wbGV0ZXMKKyAgICBpZiBub3QgdGFzay5lbmRzd2l0aCgiX3NldHNjZW5lIikgYW5kIHRhc2sgIT0gImRvX3NldHNjZW5lIiBhbmQgbm90IGZpbGVfbmFtZToKKyAgICAgICAgc3RhbXBiYXNlID0gc3RhbXBfaW50ZXJuYWwodGFzaywgZCwgTm9uZSwgVHJ1ZSkKKyAgICAgICAgZmlsZV9uYW1lID0gZC5nZXRWYXIoJ0JCX0ZJTEVOQU1FJywgVHJ1ZSkKKyAgICAgICAgYmIucGFyc2Uuc2lnZ2VuLmR1bXBfc2lndGFzayhmaWxlX25hbWUsIHRhc2ssIHN0YW1wYmFzZSwgVHJ1ZSkKKworZGVmIGRlbF9zdGFtcCh0YXNrLCBkLCBmaWxlX25hbWUgPSBOb25lKToKKyAgICAiIiIKKyAgICBSZW1vdmVzIGEgc3RhbXAgZm9yIGEgZ2l2ZW4gdGFzaworICAgIChkIGNhbiBiZSBhIGRhdGEgZGljdCBvciBkYXRhQ2FjaGUpCisgICAgIiIiCisgICAgc3RhbXAgPSBzdGFtcF9pbnRlcm5hbCh0YXNrLCBkLCBmaWxlX25hbWUpCisgICAgYmIudXRpbHMucmVtb3ZlKHN0YW1wKQorCitkZWYgd3JpdGVfdGFpbnQodGFzaywgZCwgZmlsZV9uYW1lID0gTm9uZSk6CisgICAgIiIiCisgICAgQ3JlYXRlcyBhICJ0YWludCIgZmlsZSB3aGljaCB3aWxsIGZvcmNlIHRoZSBzcGVjaWZpZWQgdGFzayBhbmQgaXRzCisgICAgZGVwZW5kZW50cyB0byBiZSByZS1ydW4gdGhlIG5leHQgdGltZSBieSBpbmZsdWVuY2luZyB0aGUgdmFsdWUgb2YgaXRzCisgICAgdGFza2hhc2guCisgICAgKGQgY2FuIGJlIGEgZGF0YSBkaWN0IG9yIGRhdGFDYWNoZSkKKyAgICAiIiIKKyAgICBpbXBvcnQgdXVpZAorICAgIGlmIGZpbGVfbmFtZToKKyAgICAgICAgdGFpbnRmbiA9IGQuc3RhbXBbZmlsZV9uYW1lXSArICcuJyArIHRhc2sgKyAnLnRhaW50JworICAgIGVsc2U6CisgICAgICAgIHRhaW50Zm4gPSBkLmdldFZhcignU1RBTVAnLCBUcnVlKSArICcuJyArIHRhc2sgKyAnLnRhaW50JworICAgIGJiLnV0aWxzLm1rZGlyaGllcihvcy5wYXRoLmRpcm5hbWUodGFpbnRmbikpCisgICAgIyBUaGUgc3BlY2lmaWMgY29udGVudCBvZiB0aGUgdGFpbnQgZmlsZSBpcyBub3QgcmVhbGx5IGltcG9ydGFudCwKKyAgICAjIHdlIGp1c3QgbmVlZCBpdCB0byBiZSByYW5kb20sIHNvIGEgcmFuZG9tIFVVSUQgaXMgdXNlZAorICAgIHdpdGggb3Blbih0YWludGZuLCAndycpIGFzIHRhaW50ZjoKKyAgICAgICAgdGFpbnRmLndyaXRlKHN0cih1dWlkLnV1aWQ0KCkpKQorCitkZWYgc3RhbXBmaWxlKHRhc2tuYW1lLCBkLCBmaWxlX25hbWUgPSBOb25lKToKKyAgICAiIiIKKyAgICBSZXR1cm4gdGhlIHN0YW1wIGZvciBhIGdpdmVuIHRhc2sKKyAgICAoZCBjYW4gYmUgYSBkYXRhIGRpY3Qgb3IgZGF0YUNhY2hlKQorICAgICIiIgorICAgIHJldHVybiBzdGFtcF9pbnRlcm5hbCh0YXNrbmFtZSwgZCwgZmlsZV9uYW1lKQorCitkZWYgYWRkX3Rhc2tzKHRhc2tsaXN0LCBkKToKKyAgICB0YXNrX2RlcHMgPSBkLmdldFZhcignX3Rhc2tfZGVwcycsIEZhbHNlKQorICAgIGlmIG5vdCB0YXNrX2RlcHM6CisgICAgICAgIHRhc2tfZGVwcyA9IHt9CisgICAgaWYgbm90ICd0YXNrcycgaW4gdGFza19kZXBzOgorICAgICAgICB0YXNrX2RlcHNbJ3Rhc2tzJ10gPSBbXQorICAgIGlmIG5vdCAncGFyZW50cycgaW4gdGFza19kZXBzOgorICAgICAgICB0YXNrX2RlcHNbJ3BhcmVudHMnXSA9IHt9CisKKyAgICBmb3IgdGFzayBpbiB0YXNrbGlzdDoKKyAgICAgICAgdGFzayA9IGQuZXhwYW5kKHRhc2spCisKKyAgICAgICAgZC5zZXRWYXJGbGFnKHRhc2ssICd0YXNrJywgMSkKKworICAgICAgICBpZiBub3QgdGFzayBpbiB0YXNrX2RlcHNbJ3Rhc2tzJ106CisgICAgICAgICAgICB0YXNrX2RlcHNbJ3Rhc2tzJ10uYXBwZW5kKHRhc2spCisKKyAgICAgICAgZmxhZ3MgPSBkLmdldFZhckZsYWdzKHRhc2spCisgICAgICAgIGRlZiBnZXRUYXNrKG5hbWUpOgorICAgICAgICAgICAgaWYgbm90IG5hbWUgaW4gdGFza19kZXBzOgorICAgICAgICAgICAgICAgIHRhc2tfZGVwc1tuYW1lXSA9IHt9CisgICAgICAgICAgICBpZiBuYW1lIGluIGZsYWdzOgorICAgICAgICAgICAgICAgIGRlcHRhc2sgPSBkLmV4cGFuZChmbGFnc1tuYW1lXSkKKyAgICAgICAgICAgICAgICB0YXNrX2RlcHNbbmFtZV1bdGFza10gPSBkZXB0YXNrCisgICAgICAgIGdldFRhc2soJ2RlcGVuZHMnKQorICAgICAgICBnZXRUYXNrKCdyZGVwZW5kcycpCisgICAgICAgIGdldFRhc2soJ2RlcHRhc2snKQorICAgICAgICBnZXRUYXNrKCdyZGVwdGFzaycpCisgICAgICAgIGdldFRhc2soJ3JlY3JkZXB0YXNrJykKKyAgICAgICAgZ2V0VGFzaygncmVjaWRlcHRhc2snKQorICAgICAgICBnZXRUYXNrKCdub3N0YW1wJykKKyAgICAgICAgZ2V0VGFzaygnZmFrZXJvb3QnKQorICAgICAgICBnZXRUYXNrKCdub2V4ZWMnKQorICAgICAgICBnZXRUYXNrKCd1bWFzaycpCisgICAgICAgIHRhc2tfZGVwc1sncGFyZW50cyddW3Rhc2tdID0gW10KKyAgICAgICAgaWYgJ2RlcHMnIGluIGZsYWdzOgorICAgICAgICAgICAgZm9yIGRlcCBpbiBmbGFnc1snZGVwcyddOgorICAgICAgICAgICAgICAgIGRlcCA9IGQuZXhwYW5kKGRlcCkKKyAgICAgICAgICAgICAgICB0YXNrX2RlcHNbJ3BhcmVudHMnXVt0YXNrXS5hcHBlbmQoZGVwKQorCisgICAgIyBkb24ndCBhc3N1bWUgaG9sZGluZyBhIHJlZmVyZW5jZQorICAgIGQuc2V0VmFyKCdfdGFza19kZXBzJywgdGFza19kZXBzKQorCitkZWYgYWRkdGFzayh0YXNrLCBiZWZvcmUsIGFmdGVyLCBkKToKKyAgICBpZiB0YXNrWzozXSAhPSAiZG9fIjoKKyAgICAgICAgdGFzayA9ICJkb18iICsgdGFzaworCisgICAgZC5zZXRWYXJGbGFnKHRhc2ssICJ0YXNrIiwgMSkKKyAgICBiYnRhc2tzID0gZC5nZXRWYXIoJ19fQkJUQVNLUycsIEZhbHNlKSBvciBbXQorICAgIGlmIHRhc2sgbm90IGluIGJidGFza3M6CisgICAgICAgIGJidGFza3MuYXBwZW5kKHRhc2spCisgICAgZC5zZXRWYXIoJ19fQkJUQVNLUycsIGJidGFza3MpCisKKyAgICBleGlzdGluZyA9IGQuZ2V0VmFyRmxhZyh0YXNrLCAiZGVwcyIpIG9yIFtdCisgICAgaWYgYWZ0ZXIgaXMgbm90IE5vbmU6CisgICAgICAgICMgc2V0IHVwIGRlcHMgZm9yIGZ1bmN0aW9uCisgICAgICAgIGZvciBlbnRyeSBpbiBhZnRlci5zcGxpdCgpOgorICAgICAgICAgICAgaWYgZW50cnkgbm90IGluIGV4aXN0aW5nOgorICAgICAgICAgICAgICAgIGV4aXN0aW5nLmFwcGVuZChlbnRyeSkKKyAgICBkLnNldFZhckZsYWcodGFzaywgImRlcHMiLCBleGlzdGluZykKKyAgICBpZiBiZWZvcmUgaXMgbm90IE5vbmU6CisgICAgICAgICMgc2V0IHVwIHRoaW5ncyB0aGF0IGRlcGVuZCBvbiB0aGlzIGZ1bmMKKyAgICAgICAgZm9yIGVudHJ5IGluIGJlZm9yZS5zcGxpdCgpOgorICAgICAgICAgICAgZXhpc3RpbmcgPSBkLmdldFZhckZsYWcoZW50cnksICJkZXBzIikgb3IgW10KKyAgICAgICAgICAgIGlmIHRhc2sgbm90IGluIGV4aXN0aW5nOgorICAgICAgICAgICAgICAgIGQuc2V0VmFyRmxhZyhlbnRyeSwgImRlcHMiLCBbdGFza10gKyBleGlzdGluZykKKworZGVmIGRlbHRhc2sodGFzaywgZCk6CisgICAgaWYgdGFza1s6M10gIT0gImRvXyI6CisgICAgICAgIHRhc2sgPSAiZG9fIiArIHRhc2sKKworICAgIGJidGFza3MgPSBkLmdldFZhcignX19CQlRBU0tTJywgRmFsc2UpIG9yIFtdCisgICAgaWYgdGFzayBpbiBiYnRhc2tzOgorICAgICAgICBiYnRhc2tzLnJlbW92ZSh0YXNrKQorICAgICAgICBkLnNldFZhcignX19CQlRBU0tTJywgYmJ0YXNrcykKKworICAgIGQuZGVsVmFyRmxhZyh0YXNrLCAnZGVwcycpCisgICAgZm9yIGJidGFzayBpbiBkLmdldFZhcignX19CQlRBU0tTJywgRmFsc2UpIG9yIFtdOgorICAgICAgICBkZXBzID0gZC5nZXRWYXJGbGFnKGJidGFzaywgJ2RlcHMnKSBvciBbXQorICAgICAgICBpZiB0YXNrIGluIGRlcHM6CisgICAgICAgICAgICBkZXBzLnJlbW92ZSh0YXNrKQorICAgICAgICAgICAgZC5zZXRWYXJGbGFnKGJidGFzaywgJ2RlcHMnLCBkZXBzKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvY2FjaGUucHkgYi9iaXRiYWtlL2xpYi9iYi9jYWNoZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjRkNjYwCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvY2FjaGUucHkKQEAgLTAsMCArMSw4MzcgQEAKKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisjCisjIEJpdEJha2UgQ2FjaGUgaW1wbGVtZW50YXRpb24KKyMKKyMgQ2FjaGluZyBvZiBiaXRiYWtlIHZhcmlhYmxlcyBiZWZvcmUgdGFzayBleGVjdXRpb24KKworIyBDb3B5cmlnaHQgKEMpIDIwMDYgICAgICAgIFJpY2hhcmQgUHVyZGllCisjIENvcHlyaWdodCAoQykgMjAxMiAgICAgICAgSW50ZWwgQ29ycG9yYXRpb24KKworIyBidXQgc21hbGwgc2VjdGlvbnMgYmFzZWQgb24gY29kZSBmcm9tIGJpbi9iaXRiYWtlOgorIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgIENocmlzIExhcnNvbgorIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgIFBoaWwgQmx1bmRlbGwKKyMgQ29weXJpZ2h0IChDKSAyMDAzIC0gMjAwNSBNaWNoYWVsICdNaWNrZXknIExhdWVyCisjIENvcHlyaWdodCAoQykgMjAwNSAgICAgICAgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIKKyMgQ29weXJpZ2h0IChDKSAyMDA1ICAgICAgICBST0FEIEdtYkgKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKworaW1wb3J0IG9zCitpbXBvcnQgbG9nZ2luZworZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVmYXVsdGRpY3QKK2ltcG9ydCBiYi51dGlscworCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiQml0QmFrZS5DYWNoZSIpCisKK3RyeToKKyAgICBpbXBvcnQgY1BpY2tsZSBhcyBwaWNrbGUKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBpbXBvcnQgcGlja2xlCisgICAgbG9nZ2VyLmluZm8oIkltcG9ydGluZyBjUGlja2xlIGZhaWxlZC4gIgorICAgICAgICAgICAgICAgICJGYWxsaW5nIGJhY2sgdG8gYSB2ZXJ5IHNsb3cgaW1wbGVtZW50YXRpb24uIikKKworX19jYWNoZV92ZXJzaW9uX18gPSAiMTQ4IgorCitkZWYgZ2V0Q2FjaGVGaWxlKHBhdGgsIGZpbGVuYW1lLCBkYXRhX2hhc2gpOgorICAgIHJldHVybiBvcy5wYXRoLmpvaW4ocGF0aCwgZmlsZW5hbWUgKyAiLiIgKyBkYXRhX2hhc2gpCisKKyMgUmVjaXBlSW5mb0NvbW1vbiBkZWZpbmVzIGNvbW1vbiBkYXRhIHJldHJpZXZpbmcgbWV0aG9kcworIyBmcm9tIG1ldGEgZGF0YSBmb3IgY2FjaGVzLiBDb3JlUmVjaXBlSW5mbyBhcyB3ZWxsIGFzIG90aGVyCisjIEV4dHJhIFJlY2lwZUluZm8gbmVlZHMgdG8gaW5oZXJpdCB0aGlzIGNsYXNzCitjbGFzcyBSZWNpcGVJbmZvQ29tbW9uKG9iamVjdCk6CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgbGlzdHZhcihjbHMsIHZhciwgbWV0YWRhdGEpOgorICAgICAgICByZXR1cm4gY2xzLmdldHZhcih2YXIsIG1ldGFkYXRhKS5zcGxpdCgpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgaW50dmFyKGNscywgdmFyLCBtZXRhZGF0YSk6CisgICAgICAgIHJldHVybiBpbnQoY2xzLmdldHZhcih2YXIsIG1ldGFkYXRhKSBvciAwKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGRlcHZhcihjbHMsIHZhciwgbWV0YWRhdGEpOgorICAgICAgICByZXR1cm4gYmIudXRpbHMuZXhwbG9kZV9kZXBzKGNscy5nZXR2YXIodmFyLCBtZXRhZGF0YSkpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgcGtndmFyKGNscywgdmFyLCBwYWNrYWdlcywgbWV0YWRhdGEpOgorICAgICAgICByZXR1cm4gZGljdCgocGtnLCBjbHMuZGVwdmFyKCIlc18lcyIgJSAodmFyLCBwa2cpLCBtZXRhZGF0YSkpCisgICAgICAgICAgICAgICAgICAgIGZvciBwa2cgaW4gcGFja2FnZXMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgdGFza3ZhcihjbHMsIHZhciwgdGFza3MsIG1ldGFkYXRhKToKKyAgICAgICAgcmV0dXJuIGRpY3QoKHRhc2ssIGNscy5nZXR2YXIoIiVzX3Rhc2stJXMiICUgKHZhciwgdGFzayksIG1ldGFkYXRhKSkKKyAgICAgICAgICAgICAgICAgICAgZm9yIHRhc2sgaW4gdGFza3MpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZmxhZ2xpc3QoY2xzLCBmbGFnLCB2YXJsaXN0LCBtZXRhZGF0YSwgc3F1YXNoPUZhbHNlKToKKyAgICAgICAgb3V0X2RpY3QgPSBkaWN0KCh2YXIsIG1ldGFkYXRhLmdldFZhckZsYWcodmFyLCBmbGFnLCBUcnVlKSkKKyAgICAgICAgICAgICAgICAgICAgZm9yIHZhciBpbiB2YXJsaXN0KQorICAgICAgICBpZiBzcXVhc2g6CisgICAgICAgICAgICByZXR1cm4gZGljdCgoayx2KSBmb3IgKGssdikgaW4gb3V0X2RpY3QuaXRlcml0ZW1zKCkgaWYgdikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBvdXRfZGljdAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGdldHZhcihjbHMsIHZhciwgbWV0YWRhdGEpOgorICAgICAgICByZXR1cm4gbWV0YWRhdGEuZ2V0VmFyKHZhciwgVHJ1ZSkgb3IgJycKKworCitjbGFzcyBDb3JlUmVjaXBlSW5mbyhSZWNpcGVJbmZvQ29tbW9uKToKKyAgICBfX3Nsb3RzX18gPSAoKQorCisgICAgY2FjaGVmaWxlID0gImJiX2NhY2hlLmRhdCIgICAKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgbWV0YWRhdGEpOiAgICAgIAorICAgICAgICBzZWxmLmZpbGVfZGVwZW5kcyA9IG1ldGFkYXRhLmdldFZhcignX19kZXBlbmRzJywgRmFsc2UpCisgICAgICAgIHNlbGYudGltZXN0YW1wID0gYmIucGFyc2UuY2FjaGVkX210aW1lKGZpbGVuYW1lKQorICAgICAgICBzZWxmLnZhcmlhbnRzID0gc2VsZi5saXN0dmFyKCdfX1ZBUklBTlRTJywgbWV0YWRhdGEpICsgWycnXQorICAgICAgICBzZWxmLmFwcGVuZHMgPSBzZWxmLmxpc3R2YXIoJ19fQkJBUFBFTkQnLCBtZXRhZGF0YSkKKyAgICAgICAgc2VsZi5ub2NhY2hlID0gc2VsZi5nZXR2YXIoJ19fQkJfRE9OVF9DQUNIRScsIG1ldGFkYXRhKQorCisgICAgICAgIHNlbGYuc2tpcHJlYXNvbiA9IHNlbGYuZ2V0dmFyKCdfX1NLSVBQRUQnLCBtZXRhZGF0YSkKKyAgICAgICAgaWYgc2VsZi5za2lwcmVhc29uOgorICAgICAgICAgICAgc2VsZi5wbiA9IHNlbGYuZ2V0dmFyKCdQTicsIG1ldGFkYXRhKSBvciBiYi5wYXJzZS5CQkhhbmRsZXIudmFyc19mcm9tX2ZpbGUoZmlsZW5hbWUsbWV0YWRhdGEpWzBdCisgICAgICAgICAgICBzZWxmLnNraXBwZWQgPSBUcnVlCisgICAgICAgICAgICBzZWxmLnByb3ZpZGVzICA9IHNlbGYuZGVwdmFyKCdQUk9WSURFUycsIG1ldGFkYXRhKQorICAgICAgICAgICAgc2VsZi5ycHJvdmlkZXMgPSBzZWxmLmRlcHZhcignUlBST1ZJREVTJywgbWV0YWRhdGEpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLnRhc2tzID0gbWV0YWRhdGEuZ2V0VmFyKCdfX0JCVEFTS1MnLCBGYWxzZSkKKworICAgICAgICBzZWxmLnBuID0gc2VsZi5nZXR2YXIoJ1BOJywgbWV0YWRhdGEpCisgICAgICAgIHNlbGYucGFja2FnZXMgPSBzZWxmLmxpc3R2YXIoJ1BBQ0tBR0VTJywgbWV0YWRhdGEpCisgICAgICAgIGlmIG5vdCBzZWxmLnBuIGluIHNlbGYucGFja2FnZXM6CisgICAgICAgICAgICBzZWxmLnBhY2thZ2VzLmFwcGVuZChzZWxmLnBuKQorCisgICAgICAgIHNlbGYuYmFzZXRhc2toYXNoZXMgPSBzZWxmLnRhc2t2YXIoJ0JCX0JBU0VIQVNIJywgc2VsZi50YXNrcywgbWV0YWRhdGEpCisgICAgICAgIHNlbGYuaGFzaGZpbGVuYW1lID0gc2VsZi5nZXR2YXIoJ0JCX0hBU0hGSUxFTkFNRScsIG1ldGFkYXRhKQorCisgICAgICAgIHNlbGYudGFza19kZXBzID0gbWV0YWRhdGEuZ2V0VmFyKCdfdGFza19kZXBzJywgRmFsc2UpIG9yIHsndGFza3MnOiBbXSwgJ3BhcmVudHMnOiB7fX0KKworICAgICAgICBzZWxmLnNraXBwZWQgPSBGYWxzZQorICAgICAgICBzZWxmLnBlID0gc2VsZi5nZXR2YXIoJ1BFJywgbWV0YWRhdGEpCisgICAgICAgIHNlbGYucHYgPSBzZWxmLmdldHZhcignUFYnLCBtZXRhZGF0YSkKKyAgICAgICAgc2VsZi5wciA9IHNlbGYuZ2V0dmFyKCdQUicsIG1ldGFkYXRhKQorICAgICAgICBzZWxmLmRlZmF1bHRwcmVmID0gc2VsZi5pbnR2YXIoJ0RFRkFVTFRfUFJFRkVSRU5DRScsIG1ldGFkYXRhKQorICAgICAgICBzZWxmLm5vdF93b3JsZCA9IHNlbGYuZ2V0dmFyKCdFWENMVURFX0ZST01fV09STEQnLCBtZXRhZGF0YSkKKyAgICAgICAgc2VsZi5zdGFtcCA9IHNlbGYuZ2V0dmFyKCdTVEFNUCcsIG1ldGFkYXRhKQorICAgICAgICBzZWxmLnN0YW1wY2xlYW4gPSBzZWxmLmdldHZhcignU1RBTVBDTEVBTicsIG1ldGFkYXRhKSAgICAgICAgCisgICAgICAgIHNlbGYuc3RhbXBfYmFzZSA9IHNlbGYuZmxhZ2xpc3QoJ3N0YW1wLWJhc2UnLCBzZWxmLnRhc2tzLCBtZXRhZGF0YSkKKyAgICAgICAgc2VsZi5zdGFtcF9iYXNlX2NsZWFuID0gc2VsZi5mbGFnbGlzdCgnc3RhbXAtYmFzZS1jbGVhbicsIHNlbGYudGFza3MsIG1ldGFkYXRhKQorICAgICAgICBzZWxmLnN0YW1wX2V4dHJhaW5mbyA9IHNlbGYuZmxhZ2xpc3QoJ3N0YW1wLWV4dHJhLWluZm8nLCBzZWxmLnRhc2tzLCBtZXRhZGF0YSkKKyAgICAgICAgc2VsZi5maWxlX2NoZWNrc3VtcyA9IHNlbGYuZmxhZ2xpc3QoJ2ZpbGUtY2hlY2tzdW1zJywgc2VsZi50YXNrcywgbWV0YWRhdGEsIFRydWUpCisgICAgICAgIHNlbGYucGFja2FnZXNfZHluYW1pYyA9IHNlbGYubGlzdHZhcignUEFDS0FHRVNfRFlOQU1JQycsIG1ldGFkYXRhKQorICAgICAgICBzZWxmLmRlcGVuZHMgICAgICAgICAgPSBzZWxmLmRlcHZhcignREVQRU5EUycsIG1ldGFkYXRhKQorICAgICAgICBzZWxmLnByb3ZpZGVzICAgICAgICAgPSBzZWxmLmRlcHZhcignUFJPVklERVMnLCBtZXRhZGF0YSkKKyAgICAgICAgc2VsZi5yZGVwZW5kcyAgICAgICAgID0gc2VsZi5kZXB2YXIoJ1JERVBFTkRTJywgbWV0YWRhdGEpCisgICAgICAgIHNlbGYucnByb3ZpZGVzICAgICAgICA9IHNlbGYuZGVwdmFyKCdSUFJPVklERVMnLCBtZXRhZGF0YSkKKyAgICAgICAgc2VsZi5ycmVjb21tZW5kcyAgICAgID0gc2VsZi5kZXB2YXIoJ1JSRUNPTU1FTkRTJywgbWV0YWRhdGEpCisgICAgICAgIHNlbGYucnByb3ZpZGVzX3BrZyAgICA9IHNlbGYucGtndmFyKCdSUFJPVklERVMnLCBzZWxmLnBhY2thZ2VzLCBtZXRhZGF0YSkKKyAgICAgICAgc2VsZi5yZGVwZW5kc19wa2cgICAgID0gc2VsZi5wa2d2YXIoJ1JERVBFTkRTJywgc2VsZi5wYWNrYWdlcywgbWV0YWRhdGEpCisgICAgICAgIHNlbGYucnJlY29tbWVuZHNfcGtnICA9IHNlbGYucGtndmFyKCdSUkVDT01NRU5EUycsIHNlbGYucGFja2FnZXMsIG1ldGFkYXRhKQorICAgICAgICBzZWxmLmluaGVyaXRzICAgICAgICAgPSBzZWxmLmdldHZhcignX19pbmhlcml0X2NhY2hlJywgbWV0YWRhdGEpCisgICAgICAgIHNlbGYuZmFrZXJvb3RlbnYgICAgICA9IHNlbGYuZ2V0dmFyKCdGQUtFUk9PVEVOVicsIG1ldGFkYXRhKQorICAgICAgICBzZWxmLmZha2Vyb290ZGlycyAgICAgPSBzZWxmLmdldHZhcignRkFLRVJPT1RESVJTJywgbWV0YWRhdGEpCisgICAgICAgIHNlbGYuZmFrZXJvb3Rub2VudiAgICA9IHNlbGYuZ2V0dmFyKCdGQUtFUk9PVE5PRU5WJywgbWV0YWRhdGEpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgaW5pdF9jYWNoZURhdGEoY2xzLCBjYWNoZWRhdGEpOgorICAgICAgICAjIENhY2hlRGF0YSBpbiBDb3JlIFJlY2lwZUluZm8gQ2xhc3MKKyAgICAgICAgY2FjaGVkYXRhLnRhc2tfZGVwcyA9IHt9CisgICAgICAgIGNhY2hlZGF0YS5wa2dfZm4gPSB7fQorICAgICAgICBjYWNoZWRhdGEucGtnX3BuID0gZGVmYXVsdGRpY3QobGlzdCkKKyAgICAgICAgY2FjaGVkYXRhLnBrZ19wZXB2cHIgPSB7fQorICAgICAgICBjYWNoZWRhdGEucGtnX2RwID0ge30KKworICAgICAgICBjYWNoZWRhdGEuc3RhbXAgPSB7fQorICAgICAgICBjYWNoZWRhdGEuc3RhbXBjbGVhbiA9IHt9CisgICAgICAgIGNhY2hlZGF0YS5zdGFtcF9iYXNlID0ge30KKyAgICAgICAgY2FjaGVkYXRhLnN0YW1wX2Jhc2VfY2xlYW4gPSB7fQorICAgICAgICBjYWNoZWRhdGEuc3RhbXBfZXh0cmFpbmZvID0ge30KKyAgICAgICAgY2FjaGVkYXRhLmZpbGVfY2hlY2tzdW1zID0ge30KKyAgICAgICAgY2FjaGVkYXRhLmZuX3Byb3ZpZGVzID0ge30KKyAgICAgICAgY2FjaGVkYXRhLnBuX3Byb3ZpZGVzID0gZGVmYXVsdGRpY3QobGlzdCkKKyAgICAgICAgY2FjaGVkYXRhLmFsbF9kZXBlbmRzID0gW10KKworICAgICAgICBjYWNoZWRhdGEuZGVwcyA9IGRlZmF1bHRkaWN0KGxpc3QpCisgICAgICAgIGNhY2hlZGF0YS5wYWNrYWdlcyA9IGRlZmF1bHRkaWN0KGxpc3QpCisgICAgICAgIGNhY2hlZGF0YS5wcm92aWRlcnMgPSBkZWZhdWx0ZGljdChsaXN0KQorICAgICAgICBjYWNoZWRhdGEucnByb3ZpZGVycyA9IGRlZmF1bHRkaWN0KGxpc3QpCisgICAgICAgIGNhY2hlZGF0YS5wYWNrYWdlc19keW5hbWljID0gZGVmYXVsdGRpY3QobGlzdCkKKworICAgICAgICBjYWNoZWRhdGEucnVuZGVwcyA9IGRlZmF1bHRkaWN0KGxhbWJkYTogZGVmYXVsdGRpY3QobGlzdCkpCisgICAgICAgIGNhY2hlZGF0YS5ydW5yZWNzID0gZGVmYXVsdGRpY3QobGFtYmRhOiBkZWZhdWx0ZGljdChsaXN0KSkKKyAgICAgICAgY2FjaGVkYXRhLnBvc3NpYmxlX3dvcmxkID0gW10KKyAgICAgICAgY2FjaGVkYXRhLnVuaXZlcnNlX3RhcmdldCA9IFtdCisgICAgICAgIGNhY2hlZGF0YS5oYXNoZm4gPSB7fQorCisgICAgICAgIGNhY2hlZGF0YS5iYXNldGFza2hhc2ggPSB7fQorICAgICAgICBjYWNoZWRhdGEuaW5oZXJpdHMgPSB7fQorICAgICAgICBjYWNoZWRhdGEuZmFrZXJvb3RlbnYgPSB7fQorICAgICAgICBjYWNoZWRhdGEuZmFrZXJvb3Rub2VudiA9IHt9CisgICAgICAgIGNhY2hlZGF0YS5mYWtlcm9vdGRpcnMgPSB7fQorCisgICAgZGVmIGFkZF9jYWNoZURhdGEoc2VsZiwgY2FjaGVkYXRhLCBmbik6CisgICAgICAgIGNhY2hlZGF0YS50YXNrX2RlcHNbZm5dID0gc2VsZi50YXNrX2RlcHMKKyAgICAgICAgY2FjaGVkYXRhLnBrZ19mbltmbl0gPSBzZWxmLnBuCisgICAgICAgIGNhY2hlZGF0YS5wa2dfcG5bc2VsZi5wbl0uYXBwZW5kKGZuKQorICAgICAgICBjYWNoZWRhdGEucGtnX3BlcHZwcltmbl0gPSAoc2VsZi5wZSwgc2VsZi5wdiwgc2VsZi5wcikKKyAgICAgICAgY2FjaGVkYXRhLnBrZ19kcFtmbl0gPSBzZWxmLmRlZmF1bHRwcmVmCisgICAgICAgIGNhY2hlZGF0YS5zdGFtcFtmbl0gPSBzZWxmLnN0YW1wCisgICAgICAgIGNhY2hlZGF0YS5zdGFtcGNsZWFuW2ZuXSA9IHNlbGYuc3RhbXBjbGVhbgorICAgICAgICBjYWNoZWRhdGEuc3RhbXBfYmFzZVtmbl0gPSBzZWxmLnN0YW1wX2Jhc2UKKyAgICAgICAgY2FjaGVkYXRhLnN0YW1wX2Jhc2VfY2xlYW5bZm5dID0gc2VsZi5zdGFtcF9iYXNlX2NsZWFuCisgICAgICAgIGNhY2hlZGF0YS5zdGFtcF9leHRyYWluZm9bZm5dID0gc2VsZi5zdGFtcF9leHRyYWluZm8KKyAgICAgICAgY2FjaGVkYXRhLmZpbGVfY2hlY2tzdW1zW2ZuXSA9IHNlbGYuZmlsZV9jaGVja3N1bXMKKworICAgICAgICBwcm92aWRlcyA9IFtzZWxmLnBuXQorICAgICAgICBmb3IgcHJvdmlkZSBpbiBzZWxmLnByb3ZpZGVzOgorICAgICAgICAgICAgaWYgcHJvdmlkZSBub3QgaW4gcHJvdmlkZXM6CisgICAgICAgICAgICAgICAgcHJvdmlkZXMuYXBwZW5kKHByb3ZpZGUpCisgICAgICAgIGNhY2hlZGF0YS5mbl9wcm92aWRlc1tmbl0gPSBwcm92aWRlcworCisgICAgICAgIGZvciBwcm92aWRlIGluIHByb3ZpZGVzOgorICAgICAgICAgICAgY2FjaGVkYXRhLnByb3ZpZGVyc1twcm92aWRlXS5hcHBlbmQoZm4pCisgICAgICAgICAgICBpZiBwcm92aWRlIG5vdCBpbiBjYWNoZWRhdGEucG5fcHJvdmlkZXNbc2VsZi5wbl06CisgICAgICAgICAgICAgICAgY2FjaGVkYXRhLnBuX3Byb3ZpZGVzW3NlbGYucG5dLmFwcGVuZChwcm92aWRlKQorCisgICAgICAgIGZvciBkZXAgaW4gc2VsZi5kZXBlbmRzOgorICAgICAgICAgICAgaWYgZGVwIG5vdCBpbiBjYWNoZWRhdGEuZGVwc1tmbl06CisgICAgICAgICAgICAgICAgY2FjaGVkYXRhLmRlcHNbZm5dLmFwcGVuZChkZXApCisgICAgICAgICAgICBpZiBkZXAgbm90IGluIGNhY2hlZGF0YS5hbGxfZGVwZW5kczoKKyAgICAgICAgICAgICAgICBjYWNoZWRhdGEuYWxsX2RlcGVuZHMuYXBwZW5kKGRlcCkKKworICAgICAgICBycHJvdmlkZXMgPSBzZWxmLnJwcm92aWRlcworICAgICAgICBmb3IgcGFja2FnZSBpbiBzZWxmLnBhY2thZ2VzOgorICAgICAgICAgICAgY2FjaGVkYXRhLnBhY2thZ2VzW3BhY2thZ2VdLmFwcGVuZChmbikKKyAgICAgICAgICAgIHJwcm92aWRlcyArPSBzZWxmLnJwcm92aWRlc19wa2dbcGFja2FnZV0KKworICAgICAgICBmb3IgcnByb3ZpZGUgaW4gcnByb3ZpZGVzOgorICAgICAgICAgICAgY2FjaGVkYXRhLnJwcm92aWRlcnNbcnByb3ZpZGVdLmFwcGVuZChmbikKKworICAgICAgICBmb3IgcGFja2FnZSBpbiBzZWxmLnBhY2thZ2VzX2R5bmFtaWM6CisgICAgICAgICAgICBjYWNoZWRhdGEucGFja2FnZXNfZHluYW1pY1twYWNrYWdlXS5hcHBlbmQoZm4pCisKKyAgICAgICAgIyBCdWlsZCBoYXNoIG9mIHJ1bnRpbWUgZGVwZW5kcyBhbmQgcmVjb21tZW5kcworICAgICAgICBmb3IgcGFja2FnZSBpbiBzZWxmLnBhY2thZ2VzICsgW3NlbGYucG5dOgorICAgICAgICAgICAgY2FjaGVkYXRhLnJ1bmRlcHNbZm5dW3BhY2thZ2VdID0gbGlzdChzZWxmLnJkZXBlbmRzKSArIHNlbGYucmRlcGVuZHNfcGtnW3BhY2thZ2VdCisgICAgICAgICAgICBjYWNoZWRhdGEucnVucmVjc1tmbl1bcGFja2FnZV0gPSBsaXN0KHNlbGYucnJlY29tbWVuZHMpICsgc2VsZi5ycmVjb21tZW5kc19wa2dbcGFja2FnZV0KKworICAgICAgICAjIENvbGxlY3QgZmlsZXMgd2UgbWF5IG5lZWQgZm9yIHBvc3NpYmxlIHdvcmxkLWRlcAorICAgICAgICAjIGNhbGN1bGF0aW9ucworICAgICAgICBpZiBzZWxmLm5vdF93b3JsZDoKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiRVhDTFVERSBGUk9NIFdPUkxEOiAlcyIsIGZuKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY2FjaGVkYXRhLnBvc3NpYmxlX3dvcmxkLmFwcGVuZChmbikKKworICAgICAgICAjIGNyZWF0ZSBhIGNvbGxlY3Rpb24gb2YgYWxsIHRhcmdldHMgZm9yIHNhbml0eSBjaGVja2luZworICAgICAgICAjIHRhc2tzLCBzdWNoIGFzIHVwc3RyZWFtIHZlcnNpb25zLCBsaWNlbnNlLCBhbmQgdG9vbHMgZm9yCisgICAgICAgICMgdGFzayBhbmQgaW1hZ2UgY3JlYXRpb24uCisgICAgICAgIGNhY2hlZGF0YS51bml2ZXJzZV90YXJnZXQuYXBwZW5kKHNlbGYucG4pCisKKyAgICAgICAgY2FjaGVkYXRhLmhhc2hmbltmbl0gPSBzZWxmLmhhc2hmaWxlbmFtZQorICAgICAgICBmb3IgdGFzaywgdGFza2hhc2ggaW4gc2VsZi5iYXNldGFza2hhc2hlcy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIGlkZW50aWZpZXIgPSAnJXMuJXMnICUgKGZuLCB0YXNrKQorICAgICAgICAgICAgY2FjaGVkYXRhLmJhc2V0YXNraGFzaFtpZGVudGlmaWVyXSA9IHRhc2toYXNoCisKKyAgICAgICAgY2FjaGVkYXRhLmluaGVyaXRzW2ZuXSA9IHNlbGYuaW5oZXJpdHMKKyAgICAgICAgY2FjaGVkYXRhLmZha2Vyb290ZW52W2ZuXSA9IHNlbGYuZmFrZXJvb3RlbnYKKyAgICAgICAgY2FjaGVkYXRhLmZha2Vyb290bm9lbnZbZm5dID0gc2VsZi5mYWtlcm9vdG5vZW52CisgICAgICAgIGNhY2hlZGF0YS5mYWtlcm9vdGRpcnNbZm5dID0gc2VsZi5mYWtlcm9vdGRpcnMKKworCisKK2NsYXNzIENhY2hlKG9iamVjdCk6CisgICAgIiIiCisgICAgQml0QmFrZSBDYWNoZSBpbXBsZW1lbnRhdGlvbgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGEsIGRhdGFfaGFzaCwgY2FjaGVzX2FycmF5KToKKyAgICAgICAgIyBQYXNzIGNhY2hlc19hcnJheSBpbmZvcm1hdGlvbiBpbnRvIENhY2hlIENvbnN0cnVjdG9yCisgICAgICAgICMgSXQgd2lsbCBiZSB1c2VkIGxhdGVyIGZvciBkZWNpZGluZyB3aGV0aGVyIHdlIAorICAgICAgICAjIG5lZWQgZXh0cmEgY2FjaGUgZmlsZSBkdW1wL2xvYWQgc3VwcG9ydCAKKyAgICAgICAgc2VsZi5jYWNoZXNfYXJyYXkgPSBjYWNoZXNfYXJyYXkKKyAgICAgICAgc2VsZi5jYWNoZWRpciA9IGRhdGEuZ2V0VmFyKCJDQUNIRSIsIFRydWUpCisgICAgICAgIHNlbGYuY2xlYW4gPSBzZXQoKQorICAgICAgICBzZWxmLmNoZWNrZWQgPSBzZXQoKQorICAgICAgICBzZWxmLmRlcGVuZHNfY2FjaGUgPSB7fQorICAgICAgICBzZWxmLmRhdGEgPSBOb25lCisgICAgICAgIHNlbGYuZGF0YV9mbiA9IE5vbmUKKyAgICAgICAgc2VsZi5jYWNoZWNsZWFuID0gVHJ1ZQorICAgICAgICBzZWxmLmRhdGFfaGFzaCA9IGRhdGFfaGFzaAorCisgICAgICAgIGlmIHNlbGYuY2FjaGVkaXIgaW4gW05vbmUsICcnXToKKyAgICAgICAgICAgIHNlbGYuaGFzX2NhY2hlID0gRmFsc2UKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJOb3QgdXNpbmcgYSBjYWNoZS4gIgorICAgICAgICAgICAgICAgICAgICAgICAgIlNldCBDQUNIRSA9IDxkaXJlY3Rvcnk+IHRvIGVuYWJsZS4iKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgc2VsZi5oYXNfY2FjaGUgPSBUcnVlCisgICAgICAgIHNlbGYuY2FjaGVmaWxlID0gZ2V0Q2FjaGVGaWxlKHNlbGYuY2FjaGVkaXIsICJiYl9jYWNoZS5kYXQiLCBzZWxmLmRhdGFfaGFzaCkKKworICAgICAgICBsb2dnZXIuZGVidWcoMSwgIlVzaW5nIGNhY2hlIGluICclcyciLCBzZWxmLmNhY2hlZGlyKQorICAgICAgICBiYi51dGlscy5ta2RpcmhpZXIoc2VsZi5jYWNoZWRpcikKKworICAgICAgICBjYWNoZV9vayA9IFRydWUKKyAgICAgICAgaWYgc2VsZi5jYWNoZXNfYXJyYXk6CisgICAgICAgICAgICBmb3IgY2FjaGVfY2xhc3MgaW4gc2VsZi5jYWNoZXNfYXJyYXk6CisgICAgICAgICAgICAgICAgaWYgdHlwZShjYWNoZV9jbGFzcykgaXMgdHlwZSBhbmQgaXNzdWJjbGFzcyhjYWNoZV9jbGFzcywgUmVjaXBlSW5mb0NvbW1vbik6CisgICAgICAgICAgICAgICAgICAgIGNhY2hlZmlsZSA9IGdldENhY2hlRmlsZShzZWxmLmNhY2hlZGlyLCBjYWNoZV9jbGFzcy5jYWNoZWZpbGUsIHNlbGYuZGF0YV9oYXNoKQorICAgICAgICAgICAgICAgICAgICBjYWNoZV9vayA9IGNhY2hlX29rIGFuZCBvcy5wYXRoLmV4aXN0cyhjYWNoZWZpbGUpCisgICAgICAgICAgICAgICAgICAgIGNhY2hlX2NsYXNzLmluaXRfY2FjaGVEYXRhKHNlbGYpCisgICAgICAgIGlmIGNhY2hlX29rOgorICAgICAgICAgICAgc2VsZi5sb2FkX2NhY2hlZmlsZSgpCisgICAgICAgIGVsaWYgb3MucGF0aC5pc2ZpbGUoc2VsZi5jYWNoZWZpbGUpOgorICAgICAgICAgICAgbG9nZ2VyLmluZm8oIk91dCBvZiBkYXRlIGNhY2hlIGZvdW5kLCByZWJ1aWxkaW5nLi4uIikKKworICAgIGRlZiBsb2FkX2NhY2hlZmlsZShzZWxmKToKKyAgICAgICAgIyBGaXJzdGx5LCB1c2luZyBjb3JlIGNhY2hlIGZpbGUgaW5mb3JtYXRpb24gZm9yCisgICAgICAgICMgdmFsaWQgY2hlY2tpbmcKKyAgICAgICAgd2l0aCBvcGVuKHNlbGYuY2FjaGVmaWxlLCAicmIiKSBhcyBjYWNoZWZpbGU6CisgICAgICAgICAgICBwaWNrbGVkID0gcGlja2xlLlVucGlja2xlcihjYWNoZWZpbGUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY2FjaGVfdmVyID0gcGlja2xlZC5sb2FkKCkKKyAgICAgICAgICAgICAgICBiaXRiYWtlX3ZlciA9IHBpY2tsZWQubG9hZCgpCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdJbnZhbGlkIGNhY2hlLCByZWJ1aWxkaW5nLi4uJykKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAgICAgaWYgY2FjaGVfdmVyICE9IF9fY2FjaGVfdmVyc2lvbl9fOgorICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdDYWNoZSB2ZXJzaW9uIG1pc21hdGNoLCByZWJ1aWxkaW5nLi4uJykKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGVsaWYgYml0YmFrZV92ZXIgIT0gYmIuX192ZXJzaW9uX186CisgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ0JpdGJha2UgdmVyc2lvbiBtaXNtYXRjaCwgcmVidWlsZGluZy4uLicpCisgICAgICAgICAgICAgICAgcmV0dXJuCisKKworICAgICAgICBjYWNoZXNpemUgPSAwCisgICAgICAgIHByZXZpb3VzX3Byb2dyZXNzID0gMAorICAgICAgICBwcmV2aW91c19wZXJjZW50ID0gMAorCisgICAgICAgICMgQ2FsY3VsYXRlIHRoZSBjb3JyZWN0IGNhY2hlc2l6ZSBvZiBhbGwgdGhvc2UgY2FjaGUgZmlsZXMKKyAgICAgICAgZm9yIGNhY2hlX2NsYXNzIGluIHNlbGYuY2FjaGVzX2FycmF5OgorICAgICAgICAgICAgaWYgdHlwZShjYWNoZV9jbGFzcykgaXMgdHlwZSBhbmQgaXNzdWJjbGFzcyhjYWNoZV9jbGFzcywgUmVjaXBlSW5mb0NvbW1vbik6CisgICAgICAgICAgICAgICAgY2FjaGVmaWxlID0gZ2V0Q2FjaGVGaWxlKHNlbGYuY2FjaGVkaXIsIGNhY2hlX2NsYXNzLmNhY2hlZmlsZSwgc2VsZi5kYXRhX2hhc2gpCisgICAgICAgICAgICAgICAgd2l0aCBvcGVuKGNhY2hlZmlsZSwgInJiIikgYXMgY2FjaGVmaWxlOgorICAgICAgICAgICAgICAgICAgICBjYWNoZXNpemUgKz0gb3MuZnN0YXQoY2FjaGVmaWxlLmZpbGVubygpKS5zdF9zaXplCisKKyAgICAgICAgYmIuZXZlbnQuZmlyZShiYi5ldmVudC5DYWNoZUxvYWRTdGFydGVkKGNhY2hlc2l6ZSksIHNlbGYuZGF0YSkKKyAgICAgICAgCisgICAgICAgIGZvciBjYWNoZV9jbGFzcyBpbiBzZWxmLmNhY2hlc19hcnJheToKKyAgICAgICAgICAgIGlmIHR5cGUoY2FjaGVfY2xhc3MpIGlzIHR5cGUgYW5kIGlzc3ViY2xhc3MoY2FjaGVfY2xhc3MsIFJlY2lwZUluZm9Db21tb24pOgorICAgICAgICAgICAgICAgIGNhY2hlZmlsZSA9IGdldENhY2hlRmlsZShzZWxmLmNhY2hlZGlyLCBjYWNoZV9jbGFzcy5jYWNoZWZpbGUsIHNlbGYuZGF0YV9oYXNoKQorICAgICAgICAgICAgICAgIHdpdGggb3BlbihjYWNoZWZpbGUsICJyYiIpIGFzIGNhY2hlZmlsZToKKyAgICAgICAgICAgICAgICAgICAgcGlja2xlZCA9IHBpY2tsZS5VbnBpY2tsZXIoY2FjaGVmaWxlKSAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIGNhY2hlZmlsZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBwaWNrbGVkLmxvYWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcGlja2xlZC5sb2FkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVwZW5kc19jYWNoZS5oYXNfa2V5KGtleSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kZXBlbmRzX2NhY2hlW2tleV0uYXBwZW5kKHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRlcGVuZHNfY2FjaGVba2V5XSA9IFt2YWx1ZV0KKyAgICAgICAgICAgICAgICAgICAgICAgICMgb25seSBmaXJlIGV2ZW50cyBvbiBldmVuIHBlcmNlbnRhZ2UgYm91bmRhcmllcworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9wcm9ncmVzcyA9IGNhY2hlZmlsZS50ZWxsKCkgKyBwcmV2aW91c19wcm9ncmVzcworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9wZXJjZW50ID0gMTAwICogY3VycmVudF9wcm9ncmVzcyAvIGNhY2hlc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgY3VycmVudF9wZXJjZW50ID4gcHJldmlvdXNfcGVyY2VudDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c19wZXJjZW50ID0gY3VycmVudF9wZXJjZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmIuZXZlbnQuZmlyZShiYi5ldmVudC5DYWNoZUxvYWRQcm9ncmVzcyhjdXJyZW50X3Byb2dyZXNzLCBjYWNoZXNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhKQorCisgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzX3Byb2dyZXNzICs9IGN1cnJlbnRfcHJvZ3Jlc3MKKworICAgICAgICAjIE5vdGU6IGRlcGVuZHMgY2FjaGUgbnVtYmVyIGlzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBhcnNpbmcgZmlsZSBudW1iZXJzLgorICAgICAgICAjIFRoZSBzYW1lIGZpbGUgaGFzIHNldmVyYWwgY2FjaGVzLCBzdGlsbCByZWdhcmRlZCBhcyBvbmUgaXRlbSBpbiB0aGUgY2FjaGUKKyAgICAgICAgYmIuZXZlbnQuZmlyZShiYi5ldmVudC5DYWNoZUxvYWRDb21wbGV0ZWQoY2FjaGVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4oc2VsZi5kZXBlbmRzX2NhY2hlKSksCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhKQorCisgICAgCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiB2aXJ0dWFsZm4ycmVhbGZuKHZpcnR1YWxmbik6CisgICAgICAgICIiIgorICAgICAgICBDb252ZXJ0IGEgdmlydHVhbCBmaWxlIG5hbWUgdG8gYSByZWFsIG9uZSArIHRoZSBhc3NvY2lhdGVkIHN1YmNsYXNzIGtleXdvcmQKKyAgICAgICAgIiIiCisKKyAgICAgICAgZm4gPSB2aXJ0dWFsZm4KKyAgICAgICAgY2xzID0gIiIKKyAgICAgICAgaWYgdmlydHVhbGZuLnN0YXJ0c3dpdGgoJ3ZpcnR1YWw6Jyk6CisgICAgICAgICAgICBlbGVtcyA9IHZpcnR1YWxmbi5zcGxpdCgnOicpCisgICAgICAgICAgICBjbHMgPSAiOiIuam9pbihlbGVtc1sxOi0xXSkKKyAgICAgICAgICAgIGZuID0gZWxlbXNbLTFdCisgICAgICAgIHJldHVybiAoZm4sIGNscykKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgcmVhbGZuMnZpcnR1YWwocmVhbGZuLCBjbHMpOgorICAgICAgICAiIiIKKyAgICAgICAgQ29udmVydCBhIHJlYWwgZmlsZW5hbWUgKyB0aGUgYXNzb2NpYXRlZCBzdWJjbGFzcyBrZXl3b3JkIHRvIGEgdmlydHVhbCBmaWxlbmFtZQorICAgICAgICAiIiIKKyAgICAgICAgaWYgY2xzID09ICIiOgorICAgICAgICAgICAgcmV0dXJuIHJlYWxmbgorICAgICAgICByZXR1cm4gInZpcnR1YWw6IiArIGNscyArICI6IiArIHJlYWxmbgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGxvYWREYXRhRnVsbChjbHMsIHZpcnR1YWxmbiwgYXBwZW5kcywgY2ZnRGF0YSk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBjb21wbGV0ZSBzZXQgb2YgZGF0YSBmb3IgZm4uCisgICAgICAgIFRvIGRvIHRoaXMsIHdlIG5lZWQgdG8gcGFyc2UgdGhlIGZpbGUuCisgICAgICAgICIiIgorCisgICAgICAgIChmbiwgdmlydHVhbCkgPSBjbHMudmlydHVhbGZuMnJlYWxmbih2aXJ0dWFsZm4pCisKKyAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJQYXJzaW5nICVzIChmdWxsKSIsIGZuKQorCisgICAgICAgIGNmZ0RhdGEuc2V0VmFyKCJfX09OTFlGSU5BTElTRSIsIHZpcnR1YWwgb3IgImRlZmF1bHQiKQorICAgICAgICBiYl9kYXRhID0gY2xzLmxvYWRfYmJmaWxlKGZuLCBhcHBlbmRzLCBjZmdEYXRhKQorICAgICAgICByZXR1cm4gYmJfZGF0YVt2aXJ0dWFsXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHBhcnNlKGNscywgZmlsZW5hbWUsIGFwcGVuZHMsIGNvbmZpZ2RhdGEsIGNhY2hlc19hcnJheSk6CisgICAgICAgICIiIlBhcnNlIHRoZSBzcGVjaWZpZWQgZmlsZW5hbWUsIHJldHVybmluZyB0aGUgcmVjaXBlIGluZm9ybWF0aW9uIiIiCisgICAgICAgIGluZm9zID0gW10KKyAgICAgICAgZGF0YXN0b3JlcyA9IGNscy5sb2FkX2JiZmlsZShmaWxlbmFtZSwgYXBwZW5kcywgY29uZmlnZGF0YSkKKyAgICAgICAgZGVwZW5kcyA9IFtdCisgICAgICAgIGZvciB2YXJpYW50LCBkYXRhIGluIHNvcnRlZChkYXRhc3RvcmVzLml0ZXJpdGVtcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PWxhbWJkYSBpOiBpWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2ZXJzZT1UcnVlKToKKyAgICAgICAgICAgIHZpcnR1YWxmbiA9IGNscy5yZWFsZm4ydmlydHVhbChmaWxlbmFtZSwgdmFyaWFudCkKKyAgICAgICAgICAgIGRlcGVuZHMgPSBkZXBlbmRzICsgKGRhdGEuZ2V0VmFyKCJfX2RlcGVuZHMiLCBGYWxzZSkgb3IgW10pCisgICAgICAgICAgICBpZiBkZXBlbmRzIGFuZCBub3QgdmFyaWFudDoKKyAgICAgICAgICAgICAgICBkYXRhLnNldFZhcigiX19kZXBlbmRzIiwgZGVwZW5kcykKKworICAgICAgICAgICAgaW5mb19hcnJheSA9IFtdCisgICAgICAgICAgICBmb3IgY2FjaGVfY2xhc3MgaW4gY2FjaGVzX2FycmF5OgorICAgICAgICAgICAgICAgIGlmIHR5cGUoY2FjaGVfY2xhc3MpIGlzIHR5cGUgYW5kIGlzc3ViY2xhc3MoY2FjaGVfY2xhc3MsIFJlY2lwZUluZm9Db21tb24pOgorICAgICAgICAgICAgICAgICAgICBpbmZvID0gY2FjaGVfY2xhc3MoZmlsZW5hbWUsIGRhdGEpCisgICAgICAgICAgICAgICAgICAgIGluZm9fYXJyYXkuYXBwZW5kKGluZm8pCisgICAgICAgICAgICBpbmZvcy5hcHBlbmQoKHZpcnR1YWxmbiwgaW5mb19hcnJheSkpCisKKyAgICAgICAgcmV0dXJuIGluZm9zCisKKyAgICBkZWYgbG9hZChzZWxmLCBmaWxlbmFtZSwgYXBwZW5kcywgY29uZmlnZGF0YSk6CisgICAgICAgICIiIk9idGFpbiB0aGUgcmVjaXBlIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGZpbGVuYW1lLAorICAgICAgICB1c2luZyBjYWNoZWQgdmFsdWVzIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHBhcnNpbmcuCisKKyAgICAgICAgTm90ZSB0aGF0IGlmIGl0IGRvZXMgcGFyc2UgdG8gb2J0YWluIHRoZSBpbmZvLCBpdCB3aWxsIG5vdAorICAgICAgICBhdXRvbWF0aWNhbGx5IGFkZCB0aGUgaW5mb3JtYXRpb24gdG8gdGhlIGNhY2hlIG9yIHRvIHlvdXIKKyAgICAgICAgQ2FjaGVEYXRhLiAgVXNlIHRoZSBhZGQgb3IgYWRkX2luZm8gbWV0aG9kIHRvIGRvIHNvIGFmdGVyCisgICAgICAgIHJ1bm5pbmcgdGhpcywgb3IgdXNlIGxvYWREYXRhIGluc3RlYWQuIiIiCisgICAgICAgIGNhY2hlZCA9IHNlbGYuY2FjaGVWYWxpZChmaWxlbmFtZSwgYXBwZW5kcykKKyAgICAgICAgaWYgY2FjaGVkOgorICAgICAgICAgICAgaW5mb3MgPSBbXQorICAgICAgICAgICAgIyBpbmZvX2FycmF5IGl0ZW0gaXMgYSBsaXN0IG9mIFtDb3JlUmVjaXBlSW5mbywgWFhYUmVjaXBlSW5mb10KKyAgICAgICAgICAgIGluZm9fYXJyYXkgPSBzZWxmLmRlcGVuZHNfY2FjaGVbZmlsZW5hbWVdCisgICAgICAgICAgICBmb3IgdmFyaWFudCBpbiBpbmZvX2FycmF5WzBdLnZhcmlhbnRzOgorICAgICAgICAgICAgICAgIHZpcnR1YWxmbiA9IHNlbGYucmVhbGZuMnZpcnR1YWwoZmlsZW5hbWUsIHZhcmlhbnQpCisgICAgICAgICAgICAgICAgaW5mb3MuYXBwZW5kKCh2aXJ0dWFsZm4sIHNlbGYuZGVwZW5kc19jYWNoZVt2aXJ0dWFsZm5dKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiUGFyc2luZyAlcyIsIGZpbGVuYW1lKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2UoZmlsZW5hbWUsIGFwcGVuZHMsIGNvbmZpZ2RhdGEsIHNlbGYuY2FjaGVzX2FycmF5KQorCisgICAgICAgIHJldHVybiBjYWNoZWQsIGluZm9zCisKKyAgICBkZWYgbG9hZERhdGEoc2VsZiwgZm4sIGFwcGVuZHMsIGNmZ0RhdGEsIGNhY2hlRGF0YSk6CisgICAgICAgICIiIkxvYWQgdGhlIHJlY2lwZSBpbmZvIGZvciB0aGUgc3BlY2lmaWVkIGZpbGVuYW1lLAorICAgICAgICBwYXJzaW5nIGFuZCBhZGRpbmcgdG8gdGhlIGNhY2hlIGlmIG5lY2Vzc2FyeSwgYW5kIGFkZGluZworICAgICAgICB0aGUgcmVjaXBlIGluZm9ybWF0aW9uIHRvIHRoZSBzdXBwbGllZCBDYWNoZURhdGEgaW5zdGFuY2UuIiIiCisgICAgICAgIHNraXBwZWQsIHZpcnR1YWxzID0gMCwgMAorCisgICAgICAgIGNhY2hlZCwgaW5mb3MgPSBzZWxmLmxvYWQoZm4sIGFwcGVuZHMsIGNmZ0RhdGEpCisgICAgICAgIGZvciB2aXJ0dWFsZm4sIGluZm9fYXJyYXkgaW4gaW5mb3M6CisgICAgICAgICAgICBpZiBpbmZvX2FycmF5WzBdLnNraXBwZWQ6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJTa2lwcGluZyAlczogJXMiLCB2aXJ0dWFsZm4sIGluZm9fYXJyYXlbMF0uc2tpcHJlYXNvbikKKyAgICAgICAgICAgICAgICBza2lwcGVkICs9IDEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRfaW5mbyh2aXJ0dWFsZm4sIGluZm9fYXJyYXksIGNhY2hlRGF0YSwgbm90IGNhY2hlZCkKKyAgICAgICAgICAgICAgICB2aXJ0dWFscyArPSAxCisKKyAgICAgICAgcmV0dXJuIGNhY2hlZCwgc2tpcHBlZCwgdmlydHVhbHMKKworICAgIGRlZiBjYWNoZVZhbGlkKHNlbGYsIGZuLCBhcHBlbmRzKToKKyAgICAgICAgIiIiCisgICAgICAgIElzIHRoZSBjYWNoZSB2YWxpZCBmb3IgZm4/CisgICAgICAgIEZhc3QgdmVyc2lvbiwgbm8gdGltZXN0YW1wcyBjaGVja2VkLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgZm4gbm90IGluIHNlbGYuY2hlY2tlZDoKKyAgICAgICAgICAgIHNlbGYuY2FjaGVWYWxpZFVwZGF0ZShmbiwgYXBwZW5kcykKKworICAgICAgICAjIElzIGNhY2hlIGVuYWJsZWQ/CisgICAgICAgIGlmIG5vdCBzZWxmLmhhc19jYWNoZToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBpZiBmbiBpbiBzZWxmLmNsZWFuOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgY2FjaGVWYWxpZFVwZGF0ZShzZWxmLCBmbiwgYXBwZW5kcyk6CisgICAgICAgICIiIgorICAgICAgICBJcyB0aGUgY2FjaGUgdmFsaWQgZm9yIGZuPworICAgICAgICBNYWtlIHRob3JvdWdoIChzbG93ZXIpIGNoZWNrcyBpbmNsdWRpbmcgdGltZXN0YW1wcy4KKyAgICAgICAgIiIiCisgICAgICAgICMgSXMgY2FjaGUgZW5hYmxlZD8KKyAgICAgICAgaWYgbm90IHNlbGYuaGFzX2NhY2hlOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgc2VsZi5jaGVja2VkLmFkZChmbikKKworICAgICAgICAjIEZpbGUgaXNuJ3QgaW4gZGVwZW5kc19jYWNoZQorICAgICAgICBpZiBub3QgZm4gaW4gc2VsZi5kZXBlbmRzX2NhY2hlOgorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICJDYWNoZTogJXMgaXMgbm90IGNhY2hlZCIsIGZuKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgbXRpbWUgPSBiYi5wYXJzZS5jYWNoZWRfbXRpbWVfbm9lcnJvcihmbikKKworICAgICAgICAjIENoZWNrIGZpbGUgc3RpbGwgZXhpc3RzCisgICAgICAgIGlmIG10aW1lID09IDA6CisgICAgICAgICAgICBsb2dnZXIuZGVidWcoMiwgIkNhY2hlOiAlcyBubyBsb25nZXIgZXhpc3RzIiwgZm4pCisgICAgICAgICAgICBzZWxmLnJlbW92ZShmbikKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIGluZm9fYXJyYXkgPSBzZWxmLmRlcGVuZHNfY2FjaGVbZm5dCisgICAgICAgICMgQ2hlY2sgdGhlIGZpbGUncyB0aW1lc3RhbXAKKyAgICAgICAgaWYgbXRpbWUgIT0gaW5mb19hcnJheVswXS50aW1lc3RhbXA6CisgICAgICAgICAgICBsb2dnZXIuZGVidWcoMiwgIkNhY2hlOiAlcyBjaGFuZ2VkIiwgZm4pCisgICAgICAgICAgICBzZWxmLnJlbW92ZShmbikKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgICMgQ2hlY2sgZGVwZW5kZW5jaWVzIGFyZSBzdGlsbCB2YWxpZAorICAgICAgICBkZXBlbmRzID0gaW5mb19hcnJheVswXS5maWxlX2RlcGVuZHMKKyAgICAgICAgaWYgZGVwZW5kczoKKyAgICAgICAgICAgIGZvciBmLCBvbGRfbXRpbWUgaW4gZGVwZW5kczoKKyAgICAgICAgICAgICAgICBmbXRpbWUgPSBiYi5wYXJzZS5jYWNoZWRfbXRpbWVfbm9lcnJvcihmKQorICAgICAgICAgICAgICAgICMgQ2hlY2sgaWYgZmlsZSBzdGlsbCBleGlzdHMKKyAgICAgICAgICAgICAgICBpZiBvbGRfbXRpbWUgIT0gMCBhbmQgZm10aW1lID09IDA6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygyLCAiQ2FjaGU6ICVzJ3MgZGVwZW5kZW5jeSAlcyB3YXMgcmVtb3ZlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbiwgZikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5yZW1vdmUoZm4pCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgICAgICAgICAgaWYgKGZtdGltZSAhPSBvbGRfbXRpbWUpOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoMiwgIkNhY2hlOiAlcydzIGRlcGVuZGVuY3kgJXMgY2hhbmdlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbiwgZikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5yZW1vdmUoZm4pCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIGlmIGhhc2F0dHIoaW5mb19hcnJheVswXSwgJ2ZpbGVfY2hlY2tzdW1zJyk6CisgICAgICAgICAgICBmb3IgXywgZmwgaW4gaW5mb19hcnJheVswXS5maWxlX2NoZWNrc3Vtcy5pdGVtcygpOgorICAgICAgICAgICAgICAgIGZvciBmIGluIGZsLnNwbGl0KCk6CisgICAgICAgICAgICAgICAgICAgIGlmICIqIiBpbiBmOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgZiwgZXhpc3QgPSBmLnNwbGl0KCI6IikKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0ID09ICJUcnVlIiBhbmQgbm90IG9zLnBhdGguZXhpc3RzKGYpKSBvciAoZXhpc3QgPT0gIkZhbHNlIiBhbmQgb3MucGF0aC5leGlzdHMoZikpOgorICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICJDYWNoZTogJXMncyBmaWxlIGNoZWNrc3VtIGxpc3QgZmlsZSAlcyBjaGFuZ2VkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbiwgZikKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVtb3ZlKGZuKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgaWYgYXBwZW5kcyAhPSBpbmZvX2FycmF5WzBdLmFwcGVuZHM6CisgICAgICAgICAgICBsb2dnZXIuZGVidWcoMiwgIkNhY2hlOiBhcHBlbmRzIGZvciAlcyBjaGFuZ2VkIiwgZm4pCisgICAgICAgICAgICBsb2dnZXIuZGVidWcoMiwgIiVzIHRvICVzIiAlIChzdHIoYXBwZW5kcyksIHN0cihpbmZvX2FycmF5WzBdLmFwcGVuZHMpKSkKKyAgICAgICAgICAgIHNlbGYucmVtb3ZlKGZuKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgaW52YWxpZCA9IEZhbHNlCisgICAgICAgIGZvciBjbHMgaW4gaW5mb19hcnJheVswXS52YXJpYW50czoKKyAgICAgICAgICAgIHZpcnR1YWxmbiA9IHNlbGYucmVhbGZuMnZpcnR1YWwoZm4sIGNscykKKyAgICAgICAgICAgIHNlbGYuY2xlYW4uYWRkKHZpcnR1YWxmbikKKyAgICAgICAgICAgIGlmIHZpcnR1YWxmbiBub3QgaW4gc2VsZi5kZXBlbmRzX2NhY2hlOgorICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygyLCAiQ2FjaGU6ICVzIGlzIG5vdCBjYWNoZWQiLCB2aXJ0dWFsZm4pCisgICAgICAgICAgICAgICAgaW52YWxpZCA9IFRydWUKKworICAgICAgICAjIElmIGFueSBvbmUgb2YgdGhlIHZhcmlhbnRzIGlzIG5vdCBwcmVzZW50LCBtYXJrIGFzIGludmFsaWQgZm9yIGFsbAorICAgICAgICBpZiBpbnZhbGlkOgorICAgICAgICAgICAgZm9yIGNscyBpbiBpbmZvX2FycmF5WzBdLnZhcmlhbnRzOgorICAgICAgICAgICAgICAgIHZpcnR1YWxmbiA9IHNlbGYucmVhbGZuMnZpcnR1YWwoZm4sIGNscykKKyAgICAgICAgICAgICAgICBpZiB2aXJ0dWFsZm4gaW4gc2VsZi5jbGVhbjoKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICJDYWNoZTogUmVtb3ZpbmcgJXMgZnJvbSBjYWNoZSIsIHZpcnR1YWxmbikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jbGVhbi5yZW1vdmUodmlydHVhbGZuKQorICAgICAgICAgICAgaWYgZm4gaW4gc2VsZi5jbGVhbjoKKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoMiwgIkNhY2hlOiBNYXJraW5nICVzIGFzIG5vdCBjbGVhbiIsIGZuKQorICAgICAgICAgICAgICAgIHNlbGYuY2xlYW4ucmVtb3ZlKGZuKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgc2VsZi5jbGVhbi5hZGQoZm4pCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgcmVtb3ZlKHNlbGYsIGZuKToKKyAgICAgICAgIiIiCisgICAgICAgIFJlbW92ZSBhIGZuIGZyb20gdGhlIGNhY2hlCisgICAgICAgIENhbGxlZCBmcm9tIHRoZSBwYXJzZXIgaW4gZXJyb3IgY2FzZXMKKyAgICAgICAgIiIiCisgICAgICAgIGlmIGZuIGluIHNlbGYuZGVwZW5kc19jYWNoZToKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiUmVtb3ZpbmcgJXMgZnJvbSBjYWNoZSIsIGZuKQorICAgICAgICAgICAgZGVsIHNlbGYuZGVwZW5kc19jYWNoZVtmbl0KKyAgICAgICAgaWYgZm4gaW4gc2VsZi5jbGVhbjoKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiTWFya2luZyAlcyBhcyB1bmNsZWFuIiwgZm4pCisgICAgICAgICAgICBzZWxmLmNsZWFuLnJlbW92ZShmbikKKworICAgIGRlZiBzeW5jKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgU2F2ZSB0aGUgY2FjaGUKKyAgICAgICAgQ2FsbGVkIGZyb20gdGhlIHBhcnNlciB3aGVuIGNvbXBsZXRlIChvciBleGl0aW5nKQorICAgICAgICAiIiIKKworICAgICAgICBpZiBub3Qgc2VsZi5oYXNfY2FjaGU6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBzZWxmLmNhY2hlY2xlYW46CisgICAgICAgICAgICBsb2dnZXIuZGVidWcoMiwgIkNhY2hlIGlzIGNsZWFuLCBub3Qgc2F2aW5nLiIpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBmaWxlX2RpY3QgPSB7fQorICAgICAgICBwaWNrbGVyX2RpY3QgPSB7fQorICAgICAgICBmb3IgY2FjaGVfY2xhc3MgaW4gc2VsZi5jYWNoZXNfYXJyYXk6CisgICAgICAgICAgICBpZiB0eXBlKGNhY2hlX2NsYXNzKSBpcyB0eXBlIGFuZCBpc3N1YmNsYXNzKGNhY2hlX2NsYXNzLCBSZWNpcGVJbmZvQ29tbW9uKToKKyAgICAgICAgICAgICAgICBjYWNoZV9jbGFzc19uYW1lID0gY2FjaGVfY2xhc3MuX19uYW1lX18KKyAgICAgICAgICAgICAgICBjYWNoZWZpbGUgPSBnZXRDYWNoZUZpbGUoc2VsZi5jYWNoZWRpciwgY2FjaGVfY2xhc3MuY2FjaGVmaWxlLCBzZWxmLmRhdGFfaGFzaCkKKyAgICAgICAgICAgICAgICBmaWxlX2RpY3RbY2FjaGVfY2xhc3NfbmFtZV0gPSBvcGVuKGNhY2hlZmlsZSwgIndiIikKKyAgICAgICAgICAgICAgICBwaWNrbGVyX2RpY3RbY2FjaGVfY2xhc3NfbmFtZV0gPSAgcGlja2xlLlBpY2tsZXIoZmlsZV9kaWN0W2NhY2hlX2NsYXNzX25hbWVdLCBwaWNrbGUuSElHSEVTVF9QUk9UT0NPTCkKKyAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgcGlja2xlcl9kaWN0WydDb3JlUmVjaXBlSW5mbyddLmR1bXAoX19jYWNoZV92ZXJzaW9uX18pCisgICAgICAgIHBpY2tsZXJfZGljdFsnQ29yZVJlY2lwZUluZm8nXS5kdW1wKGJiLl9fdmVyc2lvbl9fKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBrZXksIGluZm9fYXJyYXkgaW4gc2VsZi5kZXBlbmRzX2NhY2hlLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgICAgIGZvciBpbmZvIGluIGluZm9fYXJyYXk6CisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaW5mbywgUmVjaXBlSW5mb0NvbW1vbik6CisgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZV9jbGFzc19uYW1lID0gaW5mby5fX2NsYXNzX18uX19uYW1lX18KKyAgICAgICAgICAgICAgICAgICAgICAgIHBpY2tsZXJfZGljdFtjYWNoZV9jbGFzc19uYW1lXS5kdW1wKGtleSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpY2tsZXJfZGljdFtjYWNoZV9jbGFzc19uYW1lXS5kdW1wKGluZm8pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmb3IgY2FjaGVfY2xhc3MgaW4gc2VsZi5jYWNoZXNfYXJyYXk6CisgICAgICAgICAgICAgICAgaWYgdHlwZShjYWNoZV9jbGFzcykgaXMgdHlwZSBhbmQgaXNzdWJjbGFzcyhjYWNoZV9jbGFzcywgUmVjaXBlSW5mb0NvbW1vbik6CisgICAgICAgICAgICAgICAgICAgIGNhY2hlX2NsYXNzX25hbWUgPSBjYWNoZV9jbGFzcy5fX25hbWVfXworICAgICAgICAgICAgICAgICAgICBmaWxlX2RpY3RbY2FjaGVfY2xhc3NfbmFtZV0uY2xvc2UoKQorCisgICAgICAgIGRlbCBzZWxmLmRlcGVuZHNfY2FjaGUKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgbXRpbWUoY2FjaGVmaWxlKToKKyAgICAgICAgcmV0dXJuIGJiLnBhcnNlLmNhY2hlZF9tdGltZV9ub2Vycm9yKGNhY2hlZmlsZSkKKworICAgIGRlZiBhZGRfaW5mbyhzZWxmLCBmaWxlbmFtZSwgaW5mb19hcnJheSwgY2FjaGVEYXRhLCBwYXJzZWQ9Tm9uZSwgd2F0Y2hlcj1Ob25lKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShpbmZvX2FycmF5WzBdLCBDb3JlUmVjaXBlSW5mbykgYW5kIChub3QgaW5mb19hcnJheVswXS5za2lwcGVkKToKKyAgICAgICAgICAgIGNhY2hlRGF0YS5hZGRfZnJvbV9yZWNpcGVpbmZvKGZpbGVuYW1lLCBpbmZvX2FycmF5KQorCisgICAgICAgICAgICBpZiB3YXRjaGVyOgorICAgICAgICAgICAgICAgIHdhdGNoZXIoaW5mb19hcnJheVswXS5maWxlX2RlcGVuZHMpCisKKyAgICAgICAgaWYgbm90IHNlbGYuaGFzX2NhY2hlOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgKGluZm9fYXJyYXlbMF0uc2tpcHBlZCBvciAnU1JDUkVWSU5BQ1RJT04nIG5vdCBpbiBpbmZvX2FycmF5WzBdLnB2KSBhbmQgbm90IGluZm9fYXJyYXlbMF0ubm9jYWNoZToKKyAgICAgICAgICAgIGlmIHBhcnNlZDoKKyAgICAgICAgICAgICAgICBzZWxmLmNhY2hlY2xlYW4gPSBGYWxzZQorICAgICAgICAgICAgc2VsZi5kZXBlbmRzX2NhY2hlW2ZpbGVuYW1lXSA9IGluZm9fYXJyYXkKKworICAgIGRlZiBhZGQoc2VsZiwgZmlsZV9uYW1lLCBkYXRhLCBjYWNoZURhdGEsIHBhcnNlZD1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIFNhdmUgZGF0YSB3ZSBuZWVkIGludG8gdGhlIGNhY2hlCisgICAgICAgICIiIgorCisgICAgICAgIHJlYWxmbiA9IHNlbGYudmlydHVhbGZuMnJlYWxmbihmaWxlX25hbWUpWzBdCisKKyAgICAgICAgaW5mb19hcnJheSA9IFtdCisgICAgICAgIGZvciBjYWNoZV9jbGFzcyBpbiBzZWxmLmNhY2hlc19hcnJheToKKyAgICAgICAgICAgIGlmIHR5cGUoY2FjaGVfY2xhc3MpIGlzIHR5cGUgYW5kIGlzc3ViY2xhc3MoY2FjaGVfY2xhc3MsIFJlY2lwZUluZm9Db21tb24pOgorICAgICAgICAgICAgICAgIGluZm9fYXJyYXkuYXBwZW5kKGNhY2hlX2NsYXNzKHJlYWxmbiwgZGF0YSkpCisgICAgICAgIHNlbGYuYWRkX2luZm8oZmlsZV9uYW1lLCBpbmZvX2FycmF5LCBjYWNoZURhdGEsIHBhcnNlZCkKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgbG9hZF9iYmZpbGUoYmJmaWxlLCBhcHBlbmRzLCBjb25maWcpOgorICAgICAgICAiIiIKKyAgICAgICAgTG9hZCBhbmQgcGFyc2Ugb25lIC5iYiBidWlsZCBmaWxlCisgICAgICAgIFJldHVybiB0aGUgZGF0YSBhbmQgd2hldGhlciBwYXJzaW5nIHJlc3VsdGVkIGluIHRoZSBmaWxlIGJlaW5nIHNraXBwZWQKKyAgICAgICAgIiIiCisgICAgICAgIGNoZGlyX2JhY2sgPSBGYWxzZQorCisgICAgICAgIGZyb20gYmIgaW1wb3J0IHBhcnNlCisKKyAgICAgICAgIyBleHBhbmQgdG1wZGlyIHRvIGluY2x1ZGUgdGhpcyB0b3BkaXIKKyAgICAgICAgY29uZmlnLnNldFZhcignVE1QRElSJywgY29uZmlnLmdldFZhcignVE1QRElSJywgVHJ1ZSkgb3IgIiIpCisgICAgICAgIGJiZmlsZV9sb2MgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKGJiZmlsZSkpCisgICAgICAgIG9sZHBhdGggPSBvcy5wYXRoLmFic3BhdGgob3MuZ2V0Y3dkKCkpCisgICAgICAgIHBhcnNlLmNhY2hlZF9tdGltZV9ub2Vycm9yKGJiZmlsZV9sb2MpCisgICAgICAgIGJiX2RhdGEgPSBjb25maWcuY3JlYXRlQ29weSgpCisgICAgICAgICMgVGhlIENvbmZIYW5kbGVyIGZpcnN0IGxvb2tzIGlmIHRoZXJlIGlzIGEgVE9QRElSIGFuZCBpZiBub3QKKyAgICAgICAgIyB0aGVuIGl0IHdvdWxkIGNhbGwgZ2V0Y3dkKCkuCisgICAgICAgICMgUHJldmlvdXNseSwgd2UgY2hkaXIoKWVkIHRvIGJiZmlsZV9sb2MsIGNhbGxlZCB0aGUgaGFuZGxlcgorICAgICAgICAjIGFuZCBmaW5hbGx5IGNoZGlyKCllZCBiYWNrLCBhIGNvdXBsZSBvZiB0aG91c2FuZCB0aW1lcy4gV2Ugbm93CisgICAgICAgICMganVzdCBmaWxsIGluIFRPUERJUiB0byBwb2ludCB0byBiYmZpbGVfbG9jIGlmIHRoZXJlIGlzIG5vIFRPUERJUiB5ZXQuCisgICAgICAgIGlmIG5vdCBiYl9kYXRhLmdldFZhcignVE9QRElSJywgRmFsc2UpOgorICAgICAgICAgICAgY2hkaXJfYmFjayA9IFRydWUKKyAgICAgICAgICAgIGJiX2RhdGEuc2V0VmFyKCdUT1BESVInLCBiYmZpbGVfbG9jKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBhcHBlbmRzOgorICAgICAgICAgICAgICAgIGJiX2RhdGEuc2V0VmFyKCdfX0JCQVBQRU5EJywgIiAiLmpvaW4oYXBwZW5kcykpCisgICAgICAgICAgICBiYl9kYXRhID0gcGFyc2UuaGFuZGxlKGJiZmlsZSwgYmJfZGF0YSkKKyAgICAgICAgICAgIGlmIGNoZGlyX2JhY2s6CisgICAgICAgICAgICAgICAgb3MuY2hkaXIob2xkcGF0aCkKKyAgICAgICAgICAgIHJldHVybiBiYl9kYXRhCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGlmIGNoZGlyX2JhY2s6CisgICAgICAgICAgICAgICAgb3MuY2hkaXIob2xkcGF0aCkKKyAgICAgICAgICAgIHJhaXNlCisKKworZGVmIGluaXQoY29va2VyKToKKyAgICAiIiIKKyAgICBUaGUgT2JqZWN0aXZlOiBDYWNoZSB0aGUgbWluaW11bSBhbW91bnQgb2YgZGF0YSBwb3NzaWJsZSB5ZXQgZ2V0IHRvIHRoZQorICAgIHN0YWdlIG9mIGJ1aWxkaW5nIHBhY2thZ2VzIChpLmUuIHRyeUJ1aWxkKSB3aXRob3V0IHJlcGFyc2luZyBhbnkgLmJiIGZpbGVzLgorCisgICAgVG8gZG8gdGhpcywgd2UgaW50ZXJjZXB0IGdldFZhciBjYWxscyBhbmQgb25seSBjYWNoZSB0aGUgdmFyaWFibGVzIHdlIHNlZQorICAgIGJlaW5nIGFjY2Vzc2VkLiBXZSByZWx5IG9uIHRoZSBjYWNoZSBnZXRWYXIgY2FsbHMgYmVpbmcgbWFkZSBmb3IgYWxsCisgICAgdmFyaWFibGVzIGJpdGJha2UgbWlnaHQgbmVlZCB0byB1c2UgdG8gcmVhY2ggdGhpcyBzdGFnZS4gRm9yIGVhY2ggY2FjaGVkCisgICAgZmlsZSB3ZSBuZWVkIHRvIHRyYWNrOgorCisgICAgKiBJdHMgbXRpbWUKKyAgICAqIFRoZSBtdGltZXMgb2YgYWxsIGl0cyBkZXBlbmRlbmNpZXMKKyAgICAqIFdoZXRoZXIgaXQgY2F1c2VkIGEgcGFyc2UuU2tpcFJlY2lwZSBleGNlcHRpb24KKworICAgIEZpbGVzIGNhdXNpbmcgcGFyc2luZyBlcnJvcnMgYXJlIGV2aWN0ZWQgZnJvbSB0aGUgY2FjaGUuCisKKyAgICAiIiIKKyAgICByZXR1cm4gQ2FjaGUoY29va2VyLmNvbmZpZ3VyYXRpb24uZGF0YSwgY29va2VyLmNvbmZpZ3VyYXRpb24uZGF0YV9oYXNoKQorCisKK2NsYXNzIENhY2hlRGF0YShvYmplY3QpOgorICAgICIiIgorICAgIFRoZSBkYXRhIHN0cnVjdHVyZXMgd2UgY29tcGlsZSBmcm9tIHRoZSBjYWNoZWQgZGF0YQorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNhY2hlc19hcnJheSk6CisgICAgICAgIHNlbGYuY2FjaGVzX2FycmF5ID0gY2FjaGVzX2FycmF5CisgICAgICAgIGZvciBjYWNoZV9jbGFzcyBpbiBzZWxmLmNhY2hlc19hcnJheToKKyAgICAgICAgICAgIGlmIHR5cGUoY2FjaGVfY2xhc3MpIGlzIHR5cGUgYW5kIGlzc3ViY2xhc3MoY2FjaGVfY2xhc3MsIFJlY2lwZUluZm9Db21tb24pOgorICAgICAgICAgICAgICAgIGNhY2hlX2NsYXNzLmluaXRfY2FjaGVEYXRhKHNlbGYpICAgICAgICAKKworICAgICAgICAjIERpcmVjdCBjYWNoZSB2YXJpYWJsZXMKKyAgICAgICAgc2VsZi50YXNrX3F1ZXVlcyA9IHt9CisgICAgICAgIHNlbGYucHJlZmVycmVkID0ge30KKyAgICAgICAgc2VsZi50YXNrcyA9IHt9CisgICAgICAgICMgSW5kaXJlY3QgQ2FjaGUgdmFyaWFibGVzIChzZXQgZWxzZXdoZXJlKQorICAgICAgICBzZWxmLmlnbm9yZWRfZGVwZW5kZW5jaWVzID0gW10KKyAgICAgICAgc2VsZi53b3JsZF90YXJnZXQgPSBzZXQoKQorICAgICAgICBzZWxmLmJiZmlsZV9wcmlvcml0eSA9IHt9CisKKyAgICBkZWYgYWRkX2Zyb21fcmVjaXBlaW5mbyhzZWxmLCBmbiwgaW5mb19hcnJheSk6CisgICAgICAgIGZvciBpbmZvIGluIGluZm9fYXJyYXk6CisgICAgICAgICAgICBpbmZvLmFkZF9jYWNoZURhdGEoc2VsZiwgZm4pCisKK2NsYXNzIE11bHRpUHJvY2Vzc0NhY2hlKG9iamVjdCk6CisgICAgIiIiCisgICAgQml0QmFrZSBtdWx0aS1wcm9jZXNzIGNhY2hlIGltcGxlbWVudGF0aW9uCisKKyAgICBVc2VkIGJ5IHRoZSBjb2RlcGFyc2VyICYgZmlsZSBjaGVja3N1bSBjYWNoZXMKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5jYWNoZWZpbGUgPSBOb25lCisgICAgICAgIHNlbGYuY2FjaGVkYXRhID0gc2VsZi5jcmVhdGVfY2FjaGVkYXRhKCkKKyAgICAgICAgc2VsZi5jYWNoZWRhdGFfZXh0cmFzID0gc2VsZi5jcmVhdGVfY2FjaGVkYXRhKCkKKworICAgIGRlZiBpbml0X2NhY2hlKHNlbGYsIGQpOgorICAgICAgICBjYWNoZWRpciA9IChkLmdldFZhcigiUEVSU0lTVEVOVF9ESVIiLCBUcnVlKSBvcgorICAgICAgICAgICAgICAgICAgICBkLmdldFZhcigiQ0FDSEUiLCBUcnVlKSkKKyAgICAgICAgaWYgY2FjaGVkaXIgaW4gW05vbmUsICcnXToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBiYi51dGlscy5ta2RpcmhpZXIoY2FjaGVkaXIpCisgICAgICAgIHNlbGYuY2FjaGVmaWxlID0gb3MucGF0aC5qb2luKGNhY2hlZGlyLCBzZWxmLl9fY2xhc3NfXy5jYWNoZV9maWxlX25hbWUpCisgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiVXNpbmcgY2FjaGUgaW4gJyVzJyIsIHNlbGYuY2FjaGVmaWxlKQorCisgICAgICAgIGdsZiA9IGJiLnV0aWxzLmxvY2tmaWxlKHNlbGYuY2FjaGVmaWxlICsgIi5sb2NrIikKKworICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIG9wZW4oc2VsZi5jYWNoZWZpbGUsICJyYiIpIGFzIGY6CisgICAgICAgICAgICAgICAgcCA9IHBpY2tsZS5VbnBpY2tsZXIoZikKKyAgICAgICAgICAgICAgICBkYXRhLCB2ZXJzaW9uID0gcC5sb2FkKCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgYmIudXRpbHMudW5sb2NrZmlsZShnbGYpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBiYi51dGlscy51bmxvY2tmaWxlKGdsZikKKworICAgICAgICBpZiB2ZXJzaW9uICE9IHNlbGYuX19jbGFzc19fLkNBQ0hFX1ZFUlNJT046CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLmNhY2hlZGF0YSA9IGRhdGEKKworICAgIGRlZiBjcmVhdGVfY2FjaGVkYXRhKHNlbGYpOgorICAgICAgICBkYXRhID0gW3t9XQorICAgICAgICByZXR1cm4gZGF0YQorCisgICAgZGVmIHNhdmVfZXh0cmFzKHNlbGYsIGQpOgorICAgICAgICBpZiBub3Qgc2VsZi5jYWNoZWZpbGU6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBnbGYgPSBiYi51dGlscy5sb2NrZmlsZShzZWxmLmNhY2hlZmlsZSArICIubG9jayIsIHNoYXJlZD1UcnVlKQorCisgICAgICAgIGkgPSBvcy5nZXRwaWQoKQorICAgICAgICBsZiA9IE5vbmUKKyAgICAgICAgd2hpbGUgbm90IGxmOgorICAgICAgICAgICAgbGYgPSBiYi51dGlscy5sb2NrZmlsZShzZWxmLmNhY2hlZmlsZSArICIubG9jay4iICsgc3RyKGkpLCByZXRyeT1GYWxzZSkKKyAgICAgICAgICAgIGlmIG5vdCBsZiBvciBvcy5wYXRoLmV4aXN0cyhzZWxmLmNhY2hlZmlsZSArICItIiArIHN0cihpKSk6CisgICAgICAgICAgICAgICAgaWYgbGY6CisgICAgICAgICAgICAgICAgICAgIGJiLnV0aWxzLnVubG9ja2ZpbGUobGYpCisgICAgICAgICAgICAgICAgICAgIGxmID0gTm9uZQorICAgICAgICAgICAgICAgIGkgPSBpICsgMQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIHdpdGggb3BlbihzZWxmLmNhY2hlZmlsZSArICItIiArIHN0cihpKSwgIndiIikgYXMgZjoKKyAgICAgICAgICAgICAgICBwID0gcGlja2xlLlBpY2tsZXIoZiwgLTEpCisgICAgICAgICAgICAgICAgcC5kdW1wKFtzZWxmLmNhY2hlZGF0YV9leHRyYXMsIHNlbGYuX19jbGFzc19fLkNBQ0hFX1ZFUlNJT05dKQorCisgICAgICAgIGJiLnV0aWxzLnVubG9ja2ZpbGUobGYpCisgICAgICAgIGJiLnV0aWxzLnVubG9ja2ZpbGUoZ2xmKQorCisgICAgZGVmIG1lcmdlX2RhdGEoc2VsZiwgc291cmNlLCBkZXN0KToKKyAgICAgICAgZm9yIGogaW4gcmFuZ2UoMCxsZW4oZGVzdCkpOgorICAgICAgICAgICAgZm9yIGggaW4gc291cmNlW2pdOgorICAgICAgICAgICAgICAgIGlmIGggbm90IGluIGRlc3Rbal06CisgICAgICAgICAgICAgICAgICAgIGRlc3Rbal1baF0gPSBzb3VyY2Vbal1baF0KKworICAgIGRlZiBzYXZlX21lcmdlKHNlbGYsIGQpOgorICAgICAgICBpZiBub3Qgc2VsZi5jYWNoZWZpbGU6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBnbGYgPSBiYi51dGlscy5sb2NrZmlsZShzZWxmLmNhY2hlZmlsZSArICIubG9jayIpCisKKyAgICAgICAgZGF0YSA9IHNlbGYuY2FjaGVkYXRhCisKKyAgICAgICAgZm9yIGYgaW4gW3kgZm9yIHkgaW4gb3MubGlzdGRpcihvcy5wYXRoLmRpcm5hbWUoc2VsZi5jYWNoZWZpbGUpKSBpZiB5LnN0YXJ0c3dpdGgob3MucGF0aC5iYXNlbmFtZShzZWxmLmNhY2hlZmlsZSkgKyAnLScpXToKKyAgICAgICAgICAgIGYgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKHNlbGYuY2FjaGVmaWxlKSwgZikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB3aXRoIG9wZW4oZiwgInJiIikgYXMgZmQ6CisgICAgICAgICAgICAgICAgICAgIHAgPSBwaWNrbGUuVW5waWNrbGVyKGZkKQorICAgICAgICAgICAgICAgICAgICBleHRyYWRhdGEsIHZlcnNpb24gPSBwLmxvYWQoKQorICAgICAgICAgICAgZXhjZXB0IChJT0Vycm9yLCBFT0ZFcnJvcik6CisgICAgICAgICAgICAgICAgb3MudW5saW5rKGYpCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgdmVyc2lvbiAhPSBzZWxmLl9fY2xhc3NfXy5DQUNIRV9WRVJTSU9OOgorICAgICAgICAgICAgICAgIG9zLnVubGluayhmKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIHNlbGYubWVyZ2VfZGF0YShleHRyYWRhdGEsIGRhdGEpCisgICAgICAgICAgICBvcy51bmxpbmsoZikKKworICAgICAgICB3aXRoIG9wZW4oc2VsZi5jYWNoZWZpbGUsICJ3YiIpIGFzIGY6CisgICAgICAgICAgICBwID0gcGlja2xlLlBpY2tsZXIoZiwgLTEpCisgICAgICAgICAgICBwLmR1bXAoW2RhdGEsIHNlbGYuX19jbGFzc19fLkNBQ0hFX1ZFUlNJT05dKQorCisgICAgICAgIGJiLnV0aWxzLnVubG9ja2ZpbGUoZ2xmKQorCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9jYWNoZV9leHRyYS5weSBiL2JpdGJha2UvbGliL2JiL2NhY2hlX2V4dHJhLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZjQ5NTkKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9jYWNoZV9leHRyYS5weQpAQCAtMCwwICsxLDc1IEBACisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIworIyBFeHRyYSBSZWNpcGVJbmZvIHdpbGwgYmUgYWxsIGRlZmluZWQgaW4gdGhpcyBmaWxlLiBDdXJyZW50bHksCisjIE9ubHkgSG9iIChJbWFnZSBDcmVhdG9yKSBSZXF1ZXN0cyBzb21lIGV4dHJhIGZpZWxkcy4gU28KKyMgSG9iUmVjaXBlSW5mbyBpcyBkZWZpbmVkLiBJdCdzIG5hbWVkIEhvYlJlY2lwZUluZm8gYmVjYXVzZSBpdAorIyBpcyBpbnRyb2R1Y2VkIGJ5ICdob2InLiBVc2VycyBjb3VsZCBhbHNvIGludHJvZHVjZSBvdGhlcgorIyBSZWNpcGVJbmZvIG9yIHNpbXBseSB1c2UgdGhvc2UgYWxyZWFkeSBkZWZpbmVkIFJlY2lwZUluZm8uCisjIEluIHRoZSBmb2xsb3dpbmcgcGF0Y2gsIHRoaXMgbmV3bHkgZGVmaW5lZCBuZXcgZXh0cmEgUmVjaXBlSW5mbworIyB3aWxsIGJlIGR5bmFtaWNhbGx5IGxvYWRlZCBhbmQgdXNlZCBmb3IgbG9hZGluZy9zYXZpbmcgdGhlIGV4dHJhCisjIGNhY2hlIGZpZWxkcyAgCisKKyMgQ29weXJpZ2h0IChDKSAyMDExLCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworZnJvbSBiYi5jYWNoZSBpbXBvcnQgUmVjaXBlSW5mb0NvbW1vbgorCitjbGFzcyBIb2JSZWNpcGVJbmZvKFJlY2lwZUluZm9Db21tb24pOgorICAgIF9fc2xvdHNfXyA9ICgpCisKKyAgICBjbGFzc25hbWUgPSAiSG9iUmVjaXBlSW5mbyIKKyAgICAjIHBsZWFzZSBvdmVycmlkZSB0aGlzIG1lbWJlciB3aXRoIHRoZSBjb3JyZWN0IGRhdGEgY2FjaGUgZmlsZQorICAgICMgc3VjaCBhcyAoYmJfY2FjaGUuZGF0LCBiYl9leHRyYWNhY2hlX2hvYi5kYXQpIAorICAgIGNhY2hlZmlsZSA9ICJiYl9leHRyYWNhY2hlXyIgKyBjbGFzc25hbWUgKyIuZGF0IiAgICAgICAgCisKKyAgICAjIG92ZXJyaWRlIHRoaXMgbWVtYmVyIHdpdGggdGhlIGxpc3Qgb2YgZXh0cmEgY2FjaGUgZmllbGRzCisgICAgIyB0aGF0IHRoaXMgY2xhc3Mgd2lsbCBwcm92aWRlCisgICAgY2FjaGVmaWVsZHMgPSBbJ3N1bW1hcnknLCAnbGljZW5zZScsICdzZWN0aW9uJywKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbicsICdob21lcGFnZScsICdidWd0cmFja2VyJywKKyAgICAgICAgICAgICdwcmV2aXNpb24nLCAnZmlsZXNfaW5mbyddCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWUsIG1ldGFkYXRhKToKKworICAgICAgICBzZWxmLnN1bW1hcnkgPSBzZWxmLmdldHZhcignU1VNTUFSWScsIG1ldGFkYXRhKQorICAgICAgICBzZWxmLmxpY2Vuc2UgPSBzZWxmLmdldHZhcignTElDRU5TRScsIG1ldGFkYXRhKQorICAgICAgICBzZWxmLnNlY3Rpb24gPSBzZWxmLmdldHZhcignU0VDVElPTicsIG1ldGFkYXRhKQorICAgICAgICBzZWxmLmRlc2NyaXB0aW9uID0gc2VsZi5nZXR2YXIoJ0RFU0NSSVBUSU9OJywgbWV0YWRhdGEpCisgICAgICAgIHNlbGYuaG9tZXBhZ2UgPSBzZWxmLmdldHZhcignSE9NRVBBR0UnLCBtZXRhZGF0YSkKKyAgICAgICAgc2VsZi5idWd0cmFja2VyID0gc2VsZi5nZXR2YXIoJ0JVR1RSQUNLRVInLCBtZXRhZGF0YSkKKyAgICAgICAgc2VsZi5wcmV2aXNpb24gPSBzZWxmLmdldHZhcignUFInLCBtZXRhZGF0YSkKKyAgICAgICAgc2VsZi5maWxlc19pbmZvID0gc2VsZi5nZXR2YXIoJ0ZJTEVTX0lORk8nLCBtZXRhZGF0YSkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBpbml0X2NhY2hlRGF0YShjbHMsIGNhY2hlZGF0YSk6CisgICAgICAgICMgQ2FjaGVEYXRhIGluIEhvYiBSZWNpcGVJbmZvIENsYXNzCisgICAgICAgIGNhY2hlZGF0YS5zdW1tYXJ5ID0ge30KKyAgICAgICAgY2FjaGVkYXRhLmxpY2Vuc2UgPSB7fQorICAgICAgICBjYWNoZWRhdGEuc2VjdGlvbiA9IHt9CisgICAgICAgIGNhY2hlZGF0YS5kZXNjcmlwdGlvbiA9IHt9CisgICAgICAgIGNhY2hlZGF0YS5ob21lcGFnZSA9IHt9CisgICAgICAgIGNhY2hlZGF0YS5idWd0cmFja2VyID0ge30KKyAgICAgICAgY2FjaGVkYXRhLnByZXZpc2lvbiA9IHt9CisgICAgICAgIGNhY2hlZGF0YS5maWxlc19pbmZvID0ge30KKworICAgIGRlZiBhZGRfY2FjaGVEYXRhKHNlbGYsIGNhY2hlZGF0YSwgZm4pOgorICAgICAgICBjYWNoZWRhdGEuc3VtbWFyeVtmbl0gPSBzZWxmLnN1bW1hcnkKKyAgICAgICAgY2FjaGVkYXRhLmxpY2Vuc2VbZm5dID0gc2VsZi5saWNlbnNlCisgICAgICAgIGNhY2hlZGF0YS5zZWN0aW9uW2ZuXSA9IHNlbGYuc2VjdGlvbgorICAgICAgICBjYWNoZWRhdGEuZGVzY3JpcHRpb25bZm5dID0gc2VsZi5kZXNjcmlwdGlvbgorICAgICAgICBjYWNoZWRhdGEuaG9tZXBhZ2VbZm5dID0gc2VsZi5ob21lcGFnZQorICAgICAgICBjYWNoZWRhdGEuYnVndHJhY2tlcltmbl0gPSBzZWxmLmJ1Z3RyYWNrZXIKKyAgICAgICAgY2FjaGVkYXRhLnByZXZpc2lvbltmbl0gPSBzZWxmLnByZXZpc2lvbgorICAgICAgICBjYWNoZWRhdGEuZmlsZXNfaW5mb1tmbl0gPSBzZWxmLmZpbGVzX2luZm8KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL2NoZWNrc3VtLnB5IGIvYml0YmFrZS9saWIvYmIvY2hlY2tzdW0ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE0ZmYwYgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL2NoZWNrc3VtLnB5CkBAIC0wLDAgKzEsOTAgQEAKKyMgTG9jYWwgZmlsZSBjaGVja3N1bSBjYWNoZSBpbXBsZW1lbnRhdGlvbgorIworIyBDb3B5cmlnaHQgKEMpIDIwMTIgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBvcworaW1wb3J0IHN0YXQKK2ltcG9ydCBiYi51dGlscworaW1wb3J0IGxvZ2dpbmcKK2Zyb20gYmIuY2FjaGUgaW1wb3J0IE11bHRpUHJvY2Vzc0NhY2hlCisKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJCaXRCYWtlLkNhY2hlIikKKwordHJ5OgorICAgIGltcG9ydCBjUGlja2xlIGFzIHBpY2tsZQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGltcG9ydCBwaWNrbGUKKyAgICBsb2dnZXIuaW5mbygiSW1wb3J0aW5nIGNQaWNrbGUgZmFpbGVkLiAiCisgICAgICAgICAgICAgICAgIkZhbGxpbmcgYmFjayB0byBhIHZlcnkgc2xvdyBpbXBsZW1lbnRhdGlvbi4iKQorCisKKyMgbXRpbWUgY2FjaGUgKG5vbi1wZXJzaXN0ZW50KQorIyBiYXNlZCB1cG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgZmlsZXMgZG8gbm90IGNoYW5nZSBkdXJpbmcgYml0YmFrZSBydW4KK2NsYXNzIEZpbGVNdGltZUNhY2hlKG9iamVjdCk6CisgICAgY2FjaGUgPSB7fQorCisgICAgZGVmIGNhY2hlZF9tdGltZShzZWxmLCBmKToKKyAgICAgICAgaWYgZiBub3QgaW4gc2VsZi5jYWNoZToKKyAgICAgICAgICAgIHNlbGYuY2FjaGVbZl0gPSBvcy5zdGF0KGYpW3N0YXQuU1RfTVRJTUVdCisgICAgICAgIHJldHVybiBzZWxmLmNhY2hlW2ZdCisKKyAgICBkZWYgY2FjaGVkX210aW1lX25vZXJyb3Ioc2VsZiwgZik6CisgICAgICAgIGlmIGYgbm90IGluIHNlbGYuY2FjaGU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5jYWNoZVtmXSA9IG9zLnN0YXQoZilbc3RhdC5TVF9NVElNRV0KKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIHJldHVybiBzZWxmLmNhY2hlW2ZdCisKKyAgICBkZWYgdXBkYXRlX210aW1lKHNlbGYsIGYpOgorICAgICAgICBzZWxmLmNhY2hlW2ZdID0gb3Muc3RhdChmKVtzdGF0LlNUX01USU1FXQorICAgICAgICByZXR1cm4gc2VsZi5jYWNoZVtmXQorCisgICAgZGVmIGNsZWFyKHNlbGYpOgorICAgICAgICBzZWxmLmNhY2hlLmNsZWFyKCkKKworIyBDaGVja3N1bSArIG10aW1lIGNhY2hlIChwZXJzaXN0ZW50KQorY2xhc3MgRmlsZUNoZWNrc3VtQ2FjaGUoTXVsdGlQcm9jZXNzQ2FjaGUpOgorICAgIGNhY2hlX2ZpbGVfbmFtZSA9ICJsb2NhbF9maWxlX2NoZWNrc3VtX2NhY2hlLmRhdCIKKyAgICBDQUNIRV9WRVJTSU9OID0gMQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLm10aW1lX2NhY2hlID0gRmlsZU10aW1lQ2FjaGUoKQorICAgICAgICBNdWx0aVByb2Nlc3NDYWNoZS5fX2luaXRfXyhzZWxmKQorCisgICAgZGVmIGdldF9jaGVja3N1bShzZWxmLCBmKToKKyAgICAgICAgZW50cnkgPSBzZWxmLmNhY2hlZGF0YVswXS5nZXQoZikKKyAgICAgICAgY210aW1lID0gc2VsZi5tdGltZV9jYWNoZS5jYWNoZWRfbXRpbWUoZikKKyAgICAgICAgaWYgZW50cnk6CisgICAgICAgICAgICAobXRpbWUsIGhhc2h2YWwpID0gZW50cnkKKyAgICAgICAgICAgIGlmIGNtdGltZSA9PSBtdGltZToKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFzaHZhbAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBiYi5kZWJ1ZygyLCAiZmlsZSAlcyBjaGFuZ2VkIG10aW1lLCByZWNvbXB1dGUgY2hlY2tzdW0iICUgZikKKworICAgICAgICBoYXNodmFsID0gYmIudXRpbHMubWQ1X2ZpbGUoZikKKyAgICAgICAgc2VsZi5jYWNoZWRhdGFfZXh0cmFzWzBdW2ZdID0gKGNtdGltZSwgaGFzaHZhbCkKKyAgICAgICAgcmV0dXJuIGhhc2h2YWwKKworICAgIGRlZiBtZXJnZV9kYXRhKHNlbGYsIHNvdXJjZSwgZGVzdCk6CisgICAgICAgIGZvciBoIGluIHNvdXJjZVswXToKKyAgICAgICAgICAgIGlmIGggaW4gZGVzdDoKKyAgICAgICAgICAgICAgICAoc210aW1lLCBfKSA9IHNvdXJjZVswXVtoXQorICAgICAgICAgICAgICAgIChkbXRpbWUsIF8pID0gZGVzdFswXVtoXQorICAgICAgICAgICAgICAgIGlmIHNtdGltZSA+IGRtdGltZToKKyAgICAgICAgICAgICAgICAgICAgZGVzdFswXVtoXSA9IHNvdXJjZVswXVtoXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkZXN0WzBdW2hdID0gc291cmNlWzBdW2hdCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9jb2RlcGFyc2VyLnB5IGIvYml0YmFrZS9saWIvYmIvY29kZXBhcnNlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmEzYWY0Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvY29kZXBhcnNlci5weQpAQCAtMCwwICsxLDQxNCBAQAoraW1wb3J0IGFzdAoraW1wb3J0IGNvZGVnZW4KK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgb3MucGF0aAoraW1wb3J0IGJiLnV0aWxzLCBiYi5kYXRhCitmcm9tIGl0ZXJ0b29scyBpbXBvcnQgY2hhaW4KK2Zyb20gcHlzaCBpbXBvcnQgcHlzaHlhY2MsIHB5c2hsZXgsIHNoZXJyb3JzCitmcm9tIGJiLmNhY2hlIGltcG9ydCBNdWx0aVByb2Nlc3NDYWNoZQorCisKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCdCaXRCYWtlLkNvZGVQYXJzZXInKQorCit0cnk6CisgICAgaW1wb3J0IGNQaWNrbGUgYXMgcGlja2xlCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgaW1wb3J0IHBpY2tsZQorICAgIGxvZ2dlci5pbmZvKCdJbXBvcnRpbmcgY1BpY2tsZSBmYWlsZWQuICBGYWxsaW5nIGJhY2sgdG8gYSB2ZXJ5IHNsb3cgaW1wbGVtZW50YXRpb24uJykKKworCitkZWYgY2hlY2tfaW5kZW50KGNvZGVzdHIpOgorICAgICIiIklmIHRoZSBjb2RlIGlzIGluZGVudGVkLCBhZGQgYSB0b3AgbGV2ZWwgcGllY2Ugb2YgY29kZSB0byAncmVtb3ZlJyB0aGUgaW5kZW50YXRpb24iIiIKKworICAgIGkgPSAwCisgICAgd2hpbGUgY29kZXN0cltpXSBpbiBbIlxuIiwgIlx0IiwgIiAiXToKKyAgICAgICAgaSA9IGkgKyAxCisKKyAgICBpZiBpID09IDA6CisgICAgICAgIHJldHVybiBjb2Rlc3RyCisKKyAgICBpZiBjb2Rlc3RyW2ktMV0gPT0gIlx0IiBvciBjb2Rlc3RyW2ktMV0gPT0gIiAiOgorICAgICAgICByZXR1cm4gImlmIDE6XG4iICsgY29kZXN0cgorCisgICAgcmV0dXJuIGNvZGVzdHIKKworCisjIEJhc2ljYWxseSBwaWNrbGUsIGluIHB5dGhvbiAyLjcuMyBhdCBsZWFzdCwgZG9lcyBiYWRseSB3aXRoIGRhdGEgZHVwbGljYXRpb24gCisjIHVwb24gcGlja2xpbmcgYW5kIHVucGlja2xpbmcuIENvbWJpbmUgdGhpcyB3aXRoIGR1cGxpY2F0ZSBvYmplY3RzIGFuZCB0aGluZ3MKKyMgYXJlIGEgbWVzcy4KKyMKKyMgV2hlbiB0aGUgc2V0cyBhcmUgb3JpZ2luYWxseSBjcmVhdGVkLCBweXRob24gY2FsbHMgaW50ZXJuKCkgb24gdGhlIHNldCBrZXlzCisjIHdoaWNoIHNpZ25pZmljYW50bHkgaW1wcm92ZXMgbWVtb3J5IHVzYWdlLiBTYWRseSB0aGUgcGlja2xlL3VucGlja2xlIHByb2Nlc3MKKyMgZG9lc24ndCBjYWxsIGludGVybigpIG9uIHRoZSBrZXlzIGFuZCByZXN1bHRzIGluIHRoZSBzYW1lIHN0cmluZ3MgYmVpbmcgZHVwbGljYXRlZAorIyBpbiBtZW1vcnkuIFRoaXMgYWxzbyBtZWFucyBwaWNrbGUgd2lsbCBzYXZlIHRoZSBzYW1lIHN0cmluZyBtdWx0aXBsZSB0aW1lcyBpbgorIyB0aGUgY2FjaGUgZmlsZS4KKyMKKyMgQnkgaGF2aW5nIHNoZWxsIGFuZCBweXRob24gY2FjaGVsaW5lIG9iamVjdHMgd2l0aCBzZXRzdGF0ZS9nZXRzdGF0ZSwgd2UgZm9yY2UKKyMgdGhlIG9iamVjdCBjcmVhdGlvbiB0aHJvdWdoIG91ciBvd24gcm91dGluZSB3aGVyZSB3ZSBjYW4gY2FsbCBpbnRlcm4gKHZpYSBpbnRlcm5TZXQpLgorIworIyBXZSBhbHNvIHVzZSBoYXNoYWJsZSBmcm96ZW5zZXRzIGFuZCBlbnN1cmUgd2UgdXNlIHJlZmVyZW5jZXMgdG8gdGhlc2Ugc28gdGhhdAorIyBkdXBsaWNhdGVzIGNhbiBiZSByZW1vdmVkLCBib3RoIGluIG1lbW9yeSBhbmQgaW4gdGhlIHJlc3VsdGluZyBwaWNrbGVkIGRhdGEuCisjCisjIEJ5IHBsYXlpbmcgdGhlc2UgZ2FtZXMsIHRoZSBzaXplIG9mIHRoZSBjYWNoZSBmaWxlIHNocmlua3MgZHJhbWF0aWNhbGx5CisjIG1lYW5pbmcgZmFzdGVyIGxvYWQgdGltZXMgYW5kIHRoZSByZWxvYWRlZCBjYWNoZSBmaWxlcyBhbHNvIGNvbnN1bWUgbXVjaCBsZXNzCisjIG1lbW9yeS4gU21hbGxlciBjYWNoZSBmaWxlcywgZmFzdGVyIGxvYWQgdGltZXMgYW5kIGxvd2VyIG1lbW9yeSB1c2FnZSBpcyBnb29kLgorIworIyBBIGN1c3RvbSBnZXRzdGF0ZS9zZXRzdGF0ZSB1c2luZyB0dXBsZXMgaXMgYWN0dWFsbHkgd29ydGggMTUlIGNhY2hlc2l6ZSBieQorIyBhdm9pZGluZyBkdXBsaWNhdGlvbiBvZiB0aGUgYXR0cmlidXRlIG5hbWVzIQorCitjbGFzcyBTZXRDYWNoZShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5zZXRjYWNoZSA9IHt9CisKKyAgICBkZWYgaW50ZXJuU2V0KHNlbGYsIGl0ZW1zKToKKyAgICAgICAgCisgICAgICAgIG5ldyA9IFtdCisgICAgICAgIGZvciBpIGluIGl0ZW1zOgorICAgICAgICAgICAgbmV3LmFwcGVuZChpbnRlcm4oaSkpCisgICAgICAgIHMgPSBmcm96ZW5zZXQobmV3KQorICAgICAgICBpZiBoYXNoKHMpIGluIHNlbGYuc2V0Y2FjaGU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5zZXRjYWNoZVtoYXNoKHMpXQorICAgICAgICBzZWxmLnNldGNhY2hlW2hhc2gocyldID0gcworICAgICAgICByZXR1cm4gcworCitjb2RlY2FjaGUgPSBTZXRDYWNoZSgpCisKK2NsYXNzIHB5dGhvbkNhY2hlTGluZShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZWZzLCBleGVjcywgY29udGFpbnMpOgorICAgICAgICBzZWxmLnJlZnMgPSBjb2RlY2FjaGUuaW50ZXJuU2V0KHJlZnMpCisgICAgICAgIHNlbGYuZXhlY3MgPSBjb2RlY2FjaGUuaW50ZXJuU2V0KGV4ZWNzKQorICAgICAgICBzZWxmLmNvbnRhaW5zID0ge30KKyAgICAgICAgZm9yIGMgaW4gY29udGFpbnM6CisgICAgICAgICAgICBzZWxmLmNvbnRhaW5zW2NdID0gY29kZWNhY2hlLmludGVyblNldChjb250YWluc1tjXSkKKworICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CisgICAgICAgIHJldHVybiAoc2VsZi5yZWZzLCBzZWxmLmV4ZWNzLCBzZWxmLmNvbnRhaW5zKQorCisgICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLCBzdGF0ZSk6CisgICAgICAgIChyZWZzLCBleGVjcywgY29udGFpbnMpID0gc3RhdGUKKyAgICAgICAgc2VsZi5fX2luaXRfXyhyZWZzLCBleGVjcywgY29udGFpbnMpCisgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICBsID0gKGhhc2goc2VsZi5yZWZzKSwgaGFzaChzZWxmLmV4ZWNzKSkKKyAgICAgICAgZm9yIGMgaW4gc29ydGVkKHNlbGYuY29udGFpbnMua2V5cygpKToKKyAgICAgICAgICAgIGwgPSBsICsgKGMsIGhhc2goc2VsZi5jb250YWluc1tjXSkpCisgICAgICAgIHJldHVybiBoYXNoKGwpCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIiAiLmpvaW4oW3N0cihzZWxmLnJlZnMpLCBzdHIoc2VsZi5leGVjcyksIHN0cihzZWxmLmNvbnRhaW5zKV0pIAorCisKK2NsYXNzIHNoZWxsQ2FjaGVMaW5lKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGV4ZWNzKToKKyAgICAgICAgc2VsZi5leGVjcyA9IGNvZGVjYWNoZS5pbnRlcm5TZXQoZXhlY3MpCisKKyAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgorICAgICAgICByZXR1cm4gKHNlbGYuZXhlY3MpCisKKyAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsIHN0YXRlKToKKyAgICAgICAgKGV4ZWNzKSA9IHN0YXRlCisgICAgICAgIHNlbGYuX19pbml0X18oZXhlY3MpCisgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gaGFzaChzZWxmLmV4ZWNzKQorICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHN0cihzZWxmLmV4ZWNzKQorCitjbGFzcyBDb2RlUGFyc2VyQ2FjaGUoTXVsdGlQcm9jZXNzQ2FjaGUpOgorICAgIGNhY2hlX2ZpbGVfbmFtZSA9ICJiYl9jb2RlcGFyc2VyLmRhdCIKKyAgICBDQUNIRV9WRVJTSU9OID0gNworCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBNdWx0aVByb2Nlc3NDYWNoZS5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLnB5dGhvbmNhY2hlID0gc2VsZi5jYWNoZWRhdGFbMF0KKyAgICAgICAgc2VsZi5zaGVsbGNhY2hlID0gc2VsZi5jYWNoZWRhdGFbMV0KKyAgICAgICAgc2VsZi5weXRob25jYWNoZWV4dHJhcyA9IHNlbGYuY2FjaGVkYXRhX2V4dHJhc1swXQorICAgICAgICBzZWxmLnNoZWxsY2FjaGVleHRyYXMgPSBzZWxmLmNhY2hlZGF0YV9leHRyYXNbMV0KKworICAgICAgICAjIFRvIGF2b2lkIGR1cGxpY2F0aW9uIGluIHRoZSBjb2RlcGFyc2VyIGNhY2hlLCBrZWVwCisgICAgICAgICMgYSBsb29rdXAgb2YgaGFzaGVzIG9mIG9iamVjdHMgd2UgYWxyZWFkeSBoYXZlCisgICAgICAgIHNlbGYucHl0aG9uY2FjaGVsaW5lcyA9IHt9CisgICAgICAgIHNlbGYuc2hlbGxjYWNoZWxpbmVzID0ge30KKworICAgIGRlZiBuZXdQeXRob25DYWNoZUxpbmUoc2VsZiwgcmVmcywgZXhlY3MsIGNvbnRhaW5zKToKKyAgICAgICAgY2FjaGVsaW5lID0gcHl0aG9uQ2FjaGVMaW5lKHJlZnMsIGV4ZWNzLCBjb250YWlucykKKyAgICAgICAgaCA9IGhhc2goY2FjaGVsaW5lKQorICAgICAgICBpZiBoIGluIHNlbGYucHl0aG9uY2FjaGVsaW5lczoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnB5dGhvbmNhY2hlbGluZXNbaF0KKyAgICAgICAgc2VsZi5weXRob25jYWNoZWxpbmVzW2hdID0gY2FjaGVsaW5lCisgICAgICAgIHJldHVybiBjYWNoZWxpbmUKKworICAgIGRlZiBuZXdTaGVsbENhY2hlTGluZShzZWxmLCBleGVjcyk6CisgICAgICAgIGNhY2hlbGluZSA9IHNoZWxsQ2FjaGVMaW5lKGV4ZWNzKQorICAgICAgICBoID0gaGFzaChjYWNoZWxpbmUpCisgICAgICAgIGlmIGggaW4gc2VsZi5zaGVsbGNhY2hlbGluZXM6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5zaGVsbGNhY2hlbGluZXNbaF0KKyAgICAgICAgc2VsZi5zaGVsbGNhY2hlbGluZXNbaF0gPSBjYWNoZWxpbmUKKyAgICAgICAgcmV0dXJuIGNhY2hlbGluZQorCisgICAgZGVmIGluaXRfY2FjaGUoc2VsZiwgZCk6CisgICAgICAgIE11bHRpUHJvY2Vzc0NhY2hlLmluaXRfY2FjaGUoc2VsZiwgZCkKKworICAgICAgICAjIGNhY2hlZGF0YSBnZXRzIHJlLWFzc2lnbmVkIGluIHRoZSBwYXJlbnQKKyAgICAgICAgc2VsZi5weXRob25jYWNoZSA9IHNlbGYuY2FjaGVkYXRhWzBdCisgICAgICAgIHNlbGYuc2hlbGxjYWNoZSA9IHNlbGYuY2FjaGVkYXRhWzFdCisKKyAgICBkZWYgY3JlYXRlX2NhY2hlZGF0YShzZWxmKToKKyAgICAgICAgZGF0YSA9IFt7fSwge31dCisgICAgICAgIHJldHVybiBkYXRhCisKK2NvZGVwYXJzZXJjYWNoZSA9IENvZGVQYXJzZXJDYWNoZSgpCisKK2RlZiBwYXJzZXJfY2FjaGVfaW5pdChkKToKKyAgICBjb2RlcGFyc2VyY2FjaGUuaW5pdF9jYWNoZShkKQorCitkZWYgcGFyc2VyX2NhY2hlX3NhdmUoZCk6CisgICAgY29kZXBhcnNlcmNhY2hlLnNhdmVfZXh0cmFzKGQpCisKK2RlZiBwYXJzZXJfY2FjaGVfc2F2ZW1lcmdlKGQpOgorICAgIGNvZGVwYXJzZXJjYWNoZS5zYXZlX21lcmdlKGQpCisKK0xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyQ2xhc3MoKQorY2xhc3MgQnVmZmVyZWRMb2dnZXIoTG9nZ2VyKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgbGV2ZWw9MCwgdGFyZ2V0PU5vbmUpOgorICAgICAgICBMb2dnZXIuX19pbml0X18oc2VsZiwgbmFtZSkKKyAgICAgICAgc2VsZi5zZXRMZXZlbChsZXZlbCkKKyAgICAgICAgc2VsZi5idWZmZXIgPSBbXQorICAgICAgICBzZWxmLnRhcmdldCA9IHRhcmdldAorCisgICAgZGVmIGhhbmRsZShzZWxmLCByZWNvcmQpOgorICAgICAgICBzZWxmLmJ1ZmZlci5hcHBlbmQocmVjb3JkKQorCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBmb3IgcmVjb3JkIGluIHNlbGYuYnVmZmVyOgorICAgICAgICAgICAgc2VsZi50YXJnZXQuaGFuZGxlKHJlY29yZCkKKyAgICAgICAgc2VsZi5idWZmZXIgPSBbXQorCitjbGFzcyBQeXRob25QYXJzZXIoKToKKyAgICBnZXR2YXJzID0gKCIuZ2V0VmFyIiwgIi5hcHBlbmRWYXIiLCAiLnByZXBlbmRWYXIiKQorICAgIGNvbnRhaW5zZnVuY3MgPSAoImJiLnV0aWxzLmNvbnRhaW5zIiwgImJhc2VfY29udGFpbnMiLCAiYmIudXRpbHMuY29udGFpbnNfYW55IikKKyAgICBleGVjZnVuY3MgPSAoImJiLmJ1aWxkLmV4ZWNfZnVuYyIsICJiYi5idWlsZC5leGVjX3Rhc2siKQorCisgICAgZGVmIHdhcm4oc2VsZiwgZnVuYywgYXJnKToKKyAgICAgICAgIiIiV2FybiBhYm91dCBjYWxscyBvZiBiaXRiYWtlIEFQSXMgd2hpY2ggcGFzcyBhIG5vbi1saXRlcmFsCisgICAgICAgIGFyZ3VtZW50IGZvciB0aGUgdmFyaWFibGUgbmFtZSwgYXMgd2UncmUgbm90IGFibGUgdG8gdHJhY2sgc3VjaAorICAgICAgICBhIHJlZmVyZW5jZS4KKyAgICAgICAgIiIiCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnVuY3N0ciA9IGNvZGVnZW4udG9fc291cmNlKGZ1bmMpCisgICAgICAgICAgICBhcmdzdHIgPSBjb2RlZ2VuLnRvX3NvdXJjZShhcmcpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBzZWxmLmxvZy5kZWJ1ZygyLCAnRmFpbGVkIHRvIGNvbnZlcnQgZnVuY3Rpb24gYW5kIGFyZ3VtZW50IHRvIHNvdXJjZSBmb3JtJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYubG9nLmRlYnVnKDEsIHNlbGYudW5oYW5kbGVkX21lc3NhZ2UgJSAoZnVuY3N0ciwgYXJnc3RyKSkKKworICAgIGRlZiB2aXNpdF9DYWxsKHNlbGYsIG5vZGUpOgorICAgICAgICBuYW1lID0gc2VsZi5jYWxsZWRfbm9kZV9uYW1lKG5vZGUuZnVuYykKKyAgICAgICAgaWYgbmFtZSBhbmQgbmFtZS5lbmRzd2l0aChzZWxmLmdldHZhcnMpIG9yIG5hbWUgaW4gc2VsZi5jb250YWluc2Z1bmNzOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLmFyZ3NbMF0sIGFzdC5TdHIpOgorICAgICAgICAgICAgICAgIHZhcm5hbWUgPSBub2RlLmFyZ3NbMF0ucworICAgICAgICAgICAgICAgIGlmIG5hbWUgaW4gc2VsZi5jb250YWluc2Z1bmNzIGFuZCBpc2luc3RhbmNlKG5vZGUuYXJnc1sxXSwgYXN0LlN0cik6CisgICAgICAgICAgICAgICAgICAgIGlmIHZhcm5hbWUgbm90IGluIHNlbGYuY29udGFpbnM6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRhaW5zW3Zhcm5hbWVdID0gc2V0KCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250YWluc1t2YXJuYW1lXS5hZGQobm9kZS5hcmdzWzFdLnMpCisgICAgICAgICAgICAgICAgZWxzZTogICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmZXJlbmNlcy5hZGQobm9kZS5hcmdzWzBdLnMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYud2Fybihub2RlLmZ1bmMsIG5vZGUuYXJnc1swXSkKKyAgICAgICAgZWxpZiBuYW1lIGluIHNlbGYuZXhlY2Z1bmNzOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLmFyZ3NbMF0sIGFzdC5TdHIpOgorICAgICAgICAgICAgICAgIHNlbGYudmFyX2V4ZWNzLmFkZChub2RlLmFyZ3NbMF0ucykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi53YXJuKG5vZGUuZnVuYywgbm9kZS5hcmdzWzBdKQorICAgICAgICBlbGlmIG5hbWUgYW5kIGlzaW5zdGFuY2Uobm9kZS5mdW5jLCAoYXN0Lk5hbWUsIGFzdC5BdHRyaWJ1dGUpKToKKyAgICAgICAgICAgIHNlbGYuZXhlY3MuYWRkKG5hbWUpCisKKyAgICBkZWYgY2FsbGVkX25vZGVfbmFtZShzZWxmLCBub2RlKToKKyAgICAgICAgIiIiR2l2ZW4gYSBjYWxsZWQgbm9kZSwgcmV0dXJuIGl0cyBvcmlnaW5hbCBzdHJpbmcgZm9ybSIiIgorICAgICAgICBjb21wb25lbnRzID0gW10KKyAgICAgICAgd2hpbGUgbm9kZToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgYXN0LkF0dHJpYnV0ZSk6CisgICAgICAgICAgICAgICAgY29tcG9uZW50cy5hcHBlbmQobm9kZS5hdHRyKQorICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLnZhbHVlCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2Uobm9kZSwgYXN0Lk5hbWUpOgorICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuYXBwZW5kKG5vZGUuaWQpCisgICAgICAgICAgICAgICAgcmV0dXJuICcuJy5qb2luKHJldmVyc2VkKGNvbXBvbmVudHMpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGxvZyk6CisgICAgICAgIHNlbGYudmFyX2V4ZWNzID0gc2V0KCkKKyAgICAgICAgc2VsZi5jb250YWlucyA9IHt9CisgICAgICAgIHNlbGYuZXhlY3MgPSBzZXQoKQorICAgICAgICBzZWxmLnJlZmVyZW5jZXMgPSBzZXQoKQorICAgICAgICBzZWxmLmxvZyA9IEJ1ZmZlcmVkTG9nZ2VyKCdCaXRCYWtlLkRhdGEuUHl0aG9uUGFyc2VyJywgbG9nZ2luZy5ERUJVRywgbG9nKQorCisgICAgICAgIHNlbGYudW5oYW5kbGVkX21lc3NhZ2UgPSAiaW4gY2FsbCBvZiAlcywgYXJndW1lbnQgJyVzJyBpcyBub3QgYSBzdHJpbmcgbGl0ZXJhbCIKKyAgICAgICAgc2VsZi51bmhhbmRsZWRfbWVzc2FnZSA9ICJ3aGlsZSBwYXJzaW5nICVzLCAlcyIgJSAobmFtZSwgc2VsZi51bmhhbmRsZWRfbWVzc2FnZSkKKworICAgIGRlZiBwYXJzZV9weXRob24oc2VsZiwgbm9kZSk6CisgICAgICAgIGlmIG5vdCBub2RlIG9yIG5vdCBub2RlLnN0cmlwKCk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBoID0gaGFzaChzdHIobm9kZSkpCisKKyAgICAgICAgaWYgaCBpbiBjb2RlcGFyc2VyY2FjaGUucHl0aG9uY2FjaGU6CisgICAgICAgICAgICBzZWxmLnJlZmVyZW5jZXMgPSBzZXQoY29kZXBhcnNlcmNhY2hlLnB5dGhvbmNhY2hlW2hdLnJlZnMpCisgICAgICAgICAgICBzZWxmLmV4ZWNzID0gc2V0KGNvZGVwYXJzZXJjYWNoZS5weXRob25jYWNoZVtoXS5leGVjcykKKyAgICAgICAgICAgIHNlbGYuY29udGFpbnMgPSB7fQorICAgICAgICAgICAgZm9yIGkgaW4gY29kZXBhcnNlcmNhY2hlLnB5dGhvbmNhY2hlW2hdLmNvbnRhaW5zOgorICAgICAgICAgICAgICAgIHNlbGYuY29udGFpbnNbaV0gPSBzZXQoY29kZXBhcnNlcmNhY2hlLnB5dGhvbmNhY2hlW2hdLmNvbnRhaW5zW2ldKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgaCBpbiBjb2RlcGFyc2VyY2FjaGUucHl0aG9uY2FjaGVleHRyYXM6CisgICAgICAgICAgICBzZWxmLnJlZmVyZW5jZXMgPSBzZXQoY29kZXBhcnNlcmNhY2hlLnB5dGhvbmNhY2hlZXh0cmFzW2hdLnJlZnMpCisgICAgICAgICAgICBzZWxmLmV4ZWNzID0gc2V0KGNvZGVwYXJzZXJjYWNoZS5weXRob25jYWNoZWV4dHJhc1toXS5leGVjcykKKyAgICAgICAgICAgIHNlbGYuY29udGFpbnMgPSB7fQorICAgICAgICAgICAgZm9yIGkgaW4gY29kZXBhcnNlcmNhY2hlLnB5dGhvbmNhY2hlZXh0cmFzW2hdLmNvbnRhaW5zOgorICAgICAgICAgICAgICAgIHNlbGYuY29udGFpbnNbaV0gPSBzZXQoY29kZXBhcnNlcmNhY2hlLnB5dGhvbmNhY2hlZXh0cmFzW2hdLmNvbnRhaW5zW2ldKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgY29kZSA9IGNvbXBpbGUoY2hlY2tfaW5kZW50KHN0cihub2RlKSksICI8c3RyaW5nPiIsICJleGVjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgYXN0LlB5Q0ZfT05MWV9BU1QpCisKKyAgICAgICAgZm9yIG4gaW4gYXN0LndhbGsoY29kZSk6CisgICAgICAgICAgICBpZiBuLl9fY2xhc3NfXy5fX25hbWVfXyA9PSAiQ2FsbCI6CisgICAgICAgICAgICAgICAgc2VsZi52aXNpdF9DYWxsKG4pCisKKyAgICAgICAgc2VsZi5leGVjcy51cGRhdGUoc2VsZi52YXJfZXhlY3MpCisKKyAgICAgICAgY29kZXBhcnNlcmNhY2hlLnB5dGhvbmNhY2hlZXh0cmFzW2hdID0gY29kZXBhcnNlcmNhY2hlLm5ld1B5dGhvbkNhY2hlTGluZShzZWxmLnJlZmVyZW5jZXMsIHNlbGYuZXhlY3MsIHNlbGYuY29udGFpbnMpCisKK2NsYXNzIFNoZWxsUGFyc2VyKCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGxvZyk6CisgICAgICAgIHNlbGYuZnVuY2RlZnMgPSBzZXQoKQorICAgICAgICBzZWxmLmFsbGV4ZWNzID0gc2V0KCkKKyAgICAgICAgc2VsZi5leGVjcyA9IHNldCgpCisgICAgICAgIHNlbGYubG9nID0gQnVmZmVyZWRMb2dnZXIoJ0JpdEJha2UuRGF0YS4lcycgJSBuYW1lLCBsb2dnaW5nLkRFQlVHLCBsb2cpCisgICAgICAgIHNlbGYudW5oYW5kbGVkX3RlbXBsYXRlID0gInVuYWJsZSB0byBoYW5kbGUgbm9uLWxpdGVyYWwgY29tbWFuZCAnJXMnIgorICAgICAgICBzZWxmLnVuaGFuZGxlZF90ZW1wbGF0ZSA9ICJ3aGlsZSBwYXJzaW5nICVzLCAlcyIgJSAobmFtZSwgc2VsZi51bmhhbmRsZWRfdGVtcGxhdGUpCisKKyAgICBkZWYgcGFyc2Vfc2hlbGwoc2VsZiwgdmFsdWUpOgorICAgICAgICAiIiJQYXJzZSB0aGUgc3VwcGxpZWQgc2hlbGwgY29kZSBpbiBhIHN0cmluZywgcmV0dXJuaW5nIHRoZSBleHRlcm5hbAorICAgICAgICBjb21tYW5kcyBpdCBleGVjdXRlcy4KKyAgICAgICAgIiIiCisKKyAgICAgICAgaCA9IGhhc2goc3RyKHZhbHVlKSkKKworICAgICAgICBpZiBoIGluIGNvZGVwYXJzZXJjYWNoZS5zaGVsbGNhY2hlOgorICAgICAgICAgICAgc2VsZi5leGVjcyA9IHNldChjb2RlcGFyc2VyY2FjaGUuc2hlbGxjYWNoZVtoXS5leGVjcykKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmV4ZWNzCisKKyAgICAgICAgaWYgaCBpbiBjb2RlcGFyc2VyY2FjaGUuc2hlbGxjYWNoZWV4dHJhczoKKyAgICAgICAgICAgIHNlbGYuZXhlY3MgPSBzZXQoY29kZXBhcnNlcmNhY2hlLnNoZWxsY2FjaGVleHRyYXNbaF0uZXhlY3MpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5leGVjcworCisgICAgICAgIHNlbGYuX3BhcnNlX3NoZWxsKHZhbHVlKQorICAgICAgICBzZWxmLmV4ZWNzID0gc2V0KGNtZCBmb3IgY21kIGluIHNlbGYuYWxsZXhlY3MgaWYgY21kIG5vdCBpbiBzZWxmLmZ1bmNkZWZzKQorCisgICAgICAgIGNvZGVwYXJzZXJjYWNoZS5zaGVsbGNhY2hlZXh0cmFzW2hdID0gY29kZXBhcnNlcmNhY2hlLm5ld1NoZWxsQ2FjaGVMaW5lKHNlbGYuZXhlY3MpCisKKyAgICAgICAgcmV0dXJuIHNlbGYuZXhlY3MKKworICAgIGRlZiBfcGFyc2Vfc2hlbGwoc2VsZiwgdmFsdWUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0b2tlbnMsIF8gPSBweXNoeWFjYy5wYXJzZSh2YWx1ZSwgZW9mPVRydWUsIGRlYnVnPUZhbHNlKQorICAgICAgICBleGNlcHQgcHlzaGxleC5OZWVkTW9yZToKKyAgICAgICAgICAgIHJhaXNlIHNoZXJyb3JzLlNoZWxsU3ludGF4RXJyb3IoIlVuZXhwZWN0ZWQgRU9GIikKKworICAgICAgICBmb3IgdG9rZW4gaW4gdG9rZW5zOgorICAgICAgICAgICAgc2VsZi5wcm9jZXNzX3Rva2Vucyh0b2tlbikKKworICAgIGRlZiBwcm9jZXNzX3Rva2VucyhzZWxmLCB0b2tlbnMpOgorICAgICAgICAiIiJQcm9jZXNzIGEgc3VwcGxpZWQgcG9ydGlvbiBvZiB0aGUgc3ludGF4IHRyZWUgYXMgcmV0dXJuZWQgYnkKKyAgICAgICAgcHlzaHlhY2MucGFyc2UuCisgICAgICAgICIiIgorCisgICAgICAgIGRlZiBmdW5jdGlvbl9kZWZpbml0aW9uKHZhbHVlKToKKyAgICAgICAgICAgIHNlbGYuZnVuY2RlZnMuYWRkKHZhbHVlLm5hbWUpCisgICAgICAgICAgICByZXR1cm4gW3ZhbHVlLmJvZHldLCBOb25lCisKKyAgICAgICAgZGVmIGNhc2VfY2xhdXNlKHZhbHVlKToKKyAgICAgICAgICAgICMgRWxlbWVudCAwIG9mIGVhY2ggaXRlbSBpbiB0aGUgY2FzZSBpcyB0aGUgbGlzdCBvZiBwYXR0ZXJucywgYW5kCisgICAgICAgICAgICAjIEVsZW1lbnQgMSBvZiBlYWNoIGl0ZW0gaW4gdGhlIGNhc2UgaXMgdGhlIGxpc3Qgb2YgY29tbWFuZHMgdG8gYmUKKyAgICAgICAgICAgICMgZXhlY3V0ZWQgd2hlbiB0aGF0IHBhdHRlcm4gbWF0Y2hlcy4KKyAgICAgICAgICAgIHdvcmRzID0gY2hhaW4oKltpdGVtWzBdIGZvciBpdGVtIGluIHZhbHVlLml0ZW1zXSkKKyAgICAgICAgICAgIGNtZHMgID0gY2hhaW4oKltpdGVtWzFdIGZvciBpdGVtIGluIHZhbHVlLml0ZW1zXSkKKyAgICAgICAgICAgIHJldHVybiBjbWRzLCB3b3JkcworCisgICAgICAgIGRlZiBpZl9jbGF1c2UodmFsdWUpOgorICAgICAgICAgICAgbWFpbiA9IGNoYWluKHZhbHVlLmNvbmQsIHZhbHVlLmlmX2NtZHMpCisgICAgICAgICAgICByZXN0ID0gdmFsdWUuZWxzZV9jbWRzCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHJlc3QsIHR1cGxlKSBhbmQgcmVzdFswXSA9PSAiZWxpZiI6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNoYWluKG1haW4sIGlmX2NsYXVzZShyZXN0WzFdKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNoYWluKG1haW4sIHJlc3QpCisKKyAgICAgICAgZGVmIHNpbXBsZV9jb21tYW5kKHZhbHVlKToKKyAgICAgICAgICAgIHJldHVybiBOb25lLCBjaGFpbih2YWx1ZS53b3JkcywgKGFzc2lnblsxXSBmb3IgYXNzaWduIGluIHZhbHVlLmFzc2lnbnMpKQorCisgICAgICAgIHRva2VuX2hhbmRsZXJzID0geworICAgICAgICAgICAgImFuZF9vciI6IGxhbWJkYSB4OiAoKHgubGVmdCwgeC5yaWdodCksIE5vbmUpLAorICAgICAgICAgICAgImFzeW5jIjogbGFtYmRhIHg6IChbeF0sIE5vbmUpLAorICAgICAgICAgICAgImJyYWNlX2dyb3VwIjogbGFtYmRhIHg6ICh4LmNtZHMsIE5vbmUpLAorICAgICAgICAgICAgImZvcl9jbGF1c2UiOiBsYW1iZGEgeDogKHguY21kcywgeC5pdGVtcyksCisgICAgICAgICAgICAiZnVuY3Rpb25fZGVmaW5pdGlvbiI6IGZ1bmN0aW9uX2RlZmluaXRpb24sCisgICAgICAgICAgICAiaWZfY2xhdXNlIjogbGFtYmRhIHg6IChpZl9jbGF1c2UoeCksIE5vbmUpLAorICAgICAgICAgICAgInBpcGVsaW5lIjogbGFtYmRhIHg6ICh4LmNvbW1hbmRzLCBOb25lKSwKKyAgICAgICAgICAgICJyZWRpcmVjdF9saXN0IjogbGFtYmRhIHg6IChbeC5jbWRdLCBOb25lKSwKKyAgICAgICAgICAgICJzdWJzaGVsbCI6IGxhbWJkYSB4OiAoeC5jbWRzLCBOb25lKSwKKyAgICAgICAgICAgICJ3aGlsZV9jbGF1c2UiOiBsYW1iZGEgeDogKGNoYWluKHguY29uZGl0aW9uLCB4LmNtZHMpLCBOb25lKSwKKyAgICAgICAgICAgICJ1bnRpbF9jbGF1c2UiOiBsYW1iZGEgeDogKGNoYWluKHguY29uZGl0aW9uLCB4LmNtZHMpLCBOb25lKSwKKyAgICAgICAgICAgICJzaW1wbGVfY29tbWFuZCI6IHNpbXBsZV9jb21tYW5kLAorICAgICAgICAgICAgImNhc2VfY2xhdXNlIjogY2FzZV9jbGF1c2UsCisgICAgICAgIH0KKworICAgICAgICBmb3IgdG9rZW4gaW4gdG9rZW5zOgorICAgICAgICAgICAgbmFtZSwgdmFsdWUgPSB0b2tlbgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG1vcmVfdG9rZW5zLCB3b3JkcyA9IHRva2VuX2hhbmRsZXJzW25hbWVdKHZhbHVlKQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoIlVuc3VwcG9ydGVkIHRva2VuIHR5cGUgIiArIG5hbWUpCisKKyAgICAgICAgICAgIGlmIG1vcmVfdG9rZW5zOgorICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc190b2tlbnMobW9yZV90b2tlbnMpCisKKyAgICAgICAgICAgIGlmIHdvcmRzOgorICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc193b3Jkcyh3b3JkcykKKworICAgIGRlZiBwcm9jZXNzX3dvcmRzKHNlbGYsIHdvcmRzKToKKyAgICAgICAgIiIiUHJvY2VzcyBhIHNldCBvZiAnd29yZHMnIGluIHB5c2h5YWNjIHBhcmxhbmNlLCB3aGljaCBpbmNsdWRlcworICAgICAgICBleHRyYWN0aW9uIG9mIGV4ZWN1dGVkIGNvbW1hbmRzIGZyb20gJCgpIGJsb2NrcywgYXMgd2VsbCBhcyBncmFiYmluZworICAgICAgICB0aGUgY29tbWFuZCBuYW1lIGFyZ3VtZW50LgorICAgICAgICAiIiIKKworICAgICAgICB3b3JkcyA9IGxpc3Qod29yZHMpCisgICAgICAgIGZvciB3b3JkIGluIGxpc3Qod29yZHMpOgorICAgICAgICAgICAgd3RyZWUgPSBweXNobGV4Lm1ha2Vfd29yZHRyZWUod29yZFsxXSkKKyAgICAgICAgICAgIGZvciBwYXJ0IGluIHd0cmVlOgorICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHBhcnQsIGxpc3QpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgaWYgcGFydFswXSBpbiAoJ2AnLCAnJCgnKToKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZCA9IHB5c2hsZXgud29yZHRyZWVfYXNfc3RyaW5nKHBhcnRbMTotMV0pCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhcnNlX3NoZWxsKGNvbW1hbmQpCisKKyAgICAgICAgICAgICAgICAgICAgaWYgd29yZFswXSBpbiAoImNtZF9uYW1lIiwgImNtZF93b3JkIik6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiB3b3JkIGluIHdvcmRzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRzLnJlbW92ZSh3b3JkKQorCisgICAgICAgIHVzZXRva2VuID0gRmFsc2UKKyAgICAgICAgZm9yIHdvcmQgaW4gd29yZHM6CisgICAgICAgICAgICBpZiB3b3JkWzBdIGluICgiY21kX25hbWUiLCAiY21kX3dvcmQiKSBvciBcCisgICAgICAgICAgICAgICAodXNldG9rZW4gYW5kIHdvcmRbMF0gPT0gIlRPS0VOIik6CisgICAgICAgICAgICAgICAgaWYgIj0iIGluIHdvcmRbMV06CisgICAgICAgICAgICAgICAgICAgIHVzZXRva2VuID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgY21kID0gd29yZFsxXQorICAgICAgICAgICAgICAgIGlmIGNtZC5zdGFydHN3aXRoKCIkIik6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nLmRlYnVnKDEsIHNlbGYudW5oYW5kbGVkX3RlbXBsYXRlICUgY21kKQorICAgICAgICAgICAgICAgIGVsaWYgY21kID09ICJldmFsIjoKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZCA9ICIgIi5qb2luKHdvcmQgZm9yIF8sIHdvcmQgaW4gd29yZHNbMTpdKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9wYXJzZV9zaGVsbChjb21tYW5kKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWxsZXhlY3MuYWRkKGNtZCkKKyAgICAgICAgICAgICAgICBicmVhawpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvY29tbWFuZC5weSBiL2JpdGJha2UvbGliL2JiL2NvbW1hbmQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk4YzFkNgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL2NvbW1hbmQucHkKQEAgLTAsMCArMSw0NjMgQEAKKyIiIgorQml0QmFrZSAnQ29tbWFuZCcgbW9kdWxlCisKK1Byb3ZpZGUgYW4gaW50ZXJmYWNlIHRvIGludGVyYWN0IHdpdGggdGhlIGJpdGJha2Ugc2VydmVyIHRocm91Z2ggJ2NvbW1hbmRzJworIiIiCisKKyMgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgIFJpY2hhcmQgUHVyZGllCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCisiIiIKK1RoZSBiaXRiYWtlIHNlcnZlciB0YWtlcyAnY29tbWFuZHMnIGZyb20gaXRzIFVJL2NvbW1hbmRsaW5lLgorQ29tbWFuZHMgYXJlIGVpdGhlciBzeW5jaHJvbm91cyBvciBhc3luY2hyb25vdXMuCitBc3luYyBjb21tYW5kcyByZXR1cm4gZGF0YSB0byB0aGUgY2xpZW50IGluIHRoZSBmb3JtIG9mIGV2ZW50cy4KK1N5bmMgY29tbWFuZHMgbXVzdCBvbmx5IHJldHVybiBkYXRhIHRocm91Z2ggdGhlIGZ1bmN0aW9uIHJldHVybiB2YWx1ZQorYW5kIG11c3Qgbm90IHRyaWdnZXIgZXZlbnRzLCBkaXJlY3RseSBvciBpbmRpcmVjdGx5LgorQ29tbWFuZHMgYXJlIHF1ZXVlZCBpbiBhIENvbW1hbmRRdWV1ZQorIiIiCisKK2ltcG9ydCBiYi5ldmVudAoraW1wb3J0IGJiLmNvb2tlcgorCitjbGFzcyBDb21tYW5kQ29tcGxldGVkKGJiLmV2ZW50LkV2ZW50KToKKyAgICBwYXNzCisKK2NsYXNzIENvbW1hbmRFeGl0KGJiLmV2ZW50LkV2ZW50KToKKyAgICBkZWYgIF9faW5pdF9fKHNlbGYsIGV4aXRjb2RlKToKKyAgICAgICAgYmIuZXZlbnQuRXZlbnQuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5leGl0Y29kZSA9IGludChleGl0Y29kZSkKKworY2xhc3MgQ29tbWFuZEZhaWxlZChDb21tYW5kRXhpdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICBzZWxmLmVycm9yID0gbWVzc2FnZQorICAgICAgICBDb21tYW5kRXhpdC5fX2luaXRfXyhzZWxmLCAxKQorCitjbGFzcyBDb21tYW5kRXJyb3IoRXhjZXB0aW9uKToKKyAgICBwYXNzCisKK2NsYXNzIENvbW1hbmQ6CisgICAgIiIiCisgICAgQSBxdWV1ZSBvZiBhc3luY2hyb25vdXMgY29tbWFuZHMgZm9yIGJpdGJha2UKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29va2VyKToKKyAgICAgICAgc2VsZi5jb29rZXIgPSBjb29rZXIKKyAgICAgICAgc2VsZi5jbWRzX3N5bmMgPSBDb21tYW5kc1N5bmMoKQorICAgICAgICBzZWxmLmNtZHNfYXN5bmMgPSBDb21tYW5kc0FzeW5jKCkKKworICAgICAgICAjIEZJWE1FIEFkZCBsb2NrIGZvciB0aGlzCisgICAgICAgIHNlbGYuY3VycmVudEFzeW5jQ29tbWFuZCA9IE5vbmUKKworICAgIGRlZiBydW5Db21tYW5kKHNlbGYsIGNvbW1hbmRsaW5lLCByb19vbmx5ID0gRmFsc2UpOgorICAgICAgICBjb21tYW5kID0gY29tbWFuZGxpbmUucG9wKDApCisgICAgICAgIGlmIGhhc2F0dHIoQ29tbWFuZHNTeW5jLCBjb21tYW5kKToKKyAgICAgICAgICAgICMgQ2FuIHJ1biBzeW5jaHJvbm91cyBjb21tYW5kcyBzdHJhaWdodCBhd2F5CisgICAgICAgICAgICBjb21tYW5kX21ldGhvZCA9IGdldGF0dHIoc2VsZi5jbWRzX3N5bmMsIGNvbW1hbmQpCisgICAgICAgICAgICBpZiByb19vbmx5OgorICAgICAgICAgICAgICAgIGlmIG5vdCBoYXNhdHRyKGNvbW1hbmRfbWV0aG9kLCAncmVhZG9ubHknKSBvciBGYWxzZSA9PSBnZXRhdHRyKGNvbW1hbmRfbWV0aG9kLCAncmVhZG9ubHknKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUsICJOb3QgYWJsZSB0byBleGVjdXRlIG5vdCByZWFkb25seSBjb21tYW5kcyBpbiByZWFkb25seSBtb2RlIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlmIGdldGF0dHIoY29tbWFuZF9tZXRob2QsICduZWVkY29uZmlnJywgRmFsc2UpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmNvb2tlci51cGRhdGVDYWNoZVN5bmMoKQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNvbW1hbmRfbWV0aG9kKHNlbGYsIGNvbW1hbmRsaW5lKQorICAgICAgICAgICAgZXhjZXB0IENvbW1hbmRFcnJvciBhcyBleGM6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUsIGV4Yy5hcmdzWzBdCisgICAgICAgICAgICBleGNlcHQgKEV4Y2VwdGlvbiwgU3lzdGVtRXhpdCk6CisgICAgICAgICAgICAgICAgaW1wb3J0IHRyYWNlYmFjaworICAgICAgICAgICAgICAgIHJldHVybiBOb25lLCB0cmFjZWJhY2suZm9ybWF0X2V4YygpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQsIE5vbmUKKyAgICAgICAgaWYgc2VsZi5jdXJyZW50QXN5bmNDb21tYW5kIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUsICJCdXN5ICglcyBpbiBwcm9ncmVzcykiICUgc2VsZi5jdXJyZW50QXN5bmNDb21tYW5kWzBdCisgICAgICAgIGlmIGNvbW1hbmQgbm90IGluIENvbW1hbmRzQXN5bmMuX19kaWN0X186CisgICAgICAgICAgICByZXR1cm4gTm9uZSwgIk5vIHN1Y2ggY29tbWFuZCIKKyAgICAgICAgc2VsZi5jdXJyZW50QXN5bmNDb21tYW5kID0gKGNvbW1hbmQsIGNvbW1hbmRsaW5lKQorICAgICAgICBzZWxmLmNvb2tlci5jb25maWd1cmF0aW9uLnNlcnZlcl9yZWdpc3Rlcl9pZGxlY2FsbGJhY2soc2VsZi5jb29rZXIucnVuQ29tbWFuZHMsIHNlbGYuY29va2VyKQorICAgICAgICByZXR1cm4gVHJ1ZSwgTm9uZQorCisgICAgZGVmIHJ1bkFzeW5jQ29tbWFuZChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi5jb29rZXIuc3RhdGUgaW4gKGJiLmNvb2tlci5zdGF0ZS5lcnJvciwgYmIuY29va2VyLnN0YXRlLnNodXRkb3duLCBiYi5jb29rZXIuc3RhdGUuZm9yY2VzaHV0ZG93bik6CisgICAgICAgICAgICAgICAgIyB1cGRhdGVDYWNoZSB3aWxsIHRyaWdnZXIgYSBzaHV0ZG93biBvZiB0aGUgcGFyc2VyCisgICAgICAgICAgICAgICAgIyBhbmQgdGhlbiByYWlzZSBCQkhhbmRsZWRFeGNlcHRpb24gdHJpZ2dlcmluZyBhbiBleGl0CisgICAgICAgICAgICAgICAgc2VsZi5jb29rZXIudXBkYXRlQ2FjaGUoKQorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgaWYgc2VsZi5jdXJyZW50QXN5bmNDb21tYW5kIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIChjb21tYW5kLCBvcHRpb25zKSA9IHNlbGYuY3VycmVudEFzeW5jQ29tbWFuZAorICAgICAgICAgICAgICAgIGNvbW1hbmRtZXRob2QgPSBnZXRhdHRyKENvbW1hbmRzQXN5bmMsIGNvbW1hbmQpCisgICAgICAgICAgICAgICAgbmVlZGNhY2hlID0gZ2V0YXR0ciggY29tbWFuZG1ldGhvZCwgIm5lZWRjYWNoZSIgKQorICAgICAgICAgICAgICAgIGlmIG5lZWRjYWNoZSBhbmQgc2VsZi5jb29rZXIuc3RhdGUgIT0gYmIuY29va2VyLnN0YXRlLnJ1bm5pbmc6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY29va2VyLnVwZGF0ZUNhY2hlKCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBjb21tYW5kbWV0aG9kKHNlbGYuY21kc19hc3luYywgc2VsZiwgb3B0aW9ucykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQgYXMgZXhjOgorICAgICAgICAgICAgc2VsZi5maW5pc2hBc3luY0NvbW1hbmQoIkludGVycnVwdGVkIikKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBleGNlcHQgU3lzdGVtRXhpdCBhcyBleGM6CisgICAgICAgICAgICBhcmcgPSBleGMuYXJnc1swXQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhcmcsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgICAgIHNlbGYuZmluaXNoQXN5bmNDb21tYW5kKGFyZykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5maW5pc2hBc3luY0NvbW1hbmQoIkV4aXRlZCB3aXRoICVzIiAlIGFyZykKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoKKyAgICAgICAgICAgIGltcG9ydCB0cmFjZWJhY2sKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXhjLCBiYi5CQkhhbmRsZWRFeGNlcHRpb24pOgorICAgICAgICAgICAgICAgIHNlbGYuZmluaXNoQXN5bmNDb21tYW5kKCIiKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZpbmlzaEFzeW5jQ29tbWFuZCh0cmFjZWJhY2suZm9ybWF0X2V4YygpKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgZmluaXNoQXN5bmNDb21tYW5kKHNlbGYsIG1zZz1Ob25lLCBjb2RlPU5vbmUpOgorICAgICAgICBpZiBtc2cgb3IgbXNnID09ICIiOgorICAgICAgICAgICAgYmIuZXZlbnQuZmlyZShDb21tYW5kRmFpbGVkKG1zZyksIHNlbGYuY29va2VyLmV4cGFuZGVkX2RhdGEpCisgICAgICAgIGVsaWYgY29kZToKKyAgICAgICAgICAgIGJiLmV2ZW50LmZpcmUoQ29tbWFuZEV4aXQoY29kZSksIHNlbGYuY29va2VyLmV4cGFuZGVkX2RhdGEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBiYi5ldmVudC5maXJlKENvbW1hbmRDb21wbGV0ZWQoKSwgc2VsZi5jb29rZXIuZXhwYW5kZWRfZGF0YSkKKyAgICAgICAgc2VsZi5jdXJyZW50QXN5bmNDb21tYW5kID0gTm9uZQorICAgICAgICBzZWxmLmNvb2tlci5maW5pc2hjb21tYW5kKCkKKworY2xhc3MgQ29tbWFuZHNTeW5jOgorICAgICIiIgorICAgIEEgY2xhc3Mgb2Ygc3luY2hyb25vdXMgY29tbWFuZHMKKyAgICBUaGVzZSBzaG91bGQgcnVuIHF1aWNrbHkgc28gYXMgbm90IHRvIGh1cnQgaW50ZXJhY3RpdmUgcGVyZm9ybWFuY2UuCisgICAgVGhlc2UgbXVzdCBub3QgaW5mbHVlbmNlIGFueSBydW5uaW5nIHN5bmNocm9ub3VzIGNvbW1hbmQuCisgICAgIiIiCisKKyAgICBkZWYgc3RhdGVTaHV0ZG93bihzZWxmLCBjb21tYW5kLCBwYXJhbXMpOgorICAgICAgICAiIiIKKyAgICAgICAgVHJpZ2dlciBjb29rZXIgJ3NodXRkb3duJyBtb2RlCisgICAgICAgICIiIgorICAgICAgICBjb21tYW5kLmNvb2tlci5zaHV0ZG93bihGYWxzZSkKKworICAgIGRlZiBzdGF0ZUZvcmNlU2h1dGRvd24oc2VsZiwgY29tbWFuZCwgcGFyYW1zKToKKyAgICAgICAgIiIiCisgICAgICAgIFN0b3AgdGhlIGNvb2tlcgorICAgICAgICAiIiIKKyAgICAgICAgY29tbWFuZC5jb29rZXIuc2h1dGRvd24oVHJ1ZSkKKworICAgIGRlZiBnZXRBbGxLZXlzV2l0aEZsYWdzKHNlbGYsIGNvbW1hbmQsIHBhcmFtcyk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm5zIGEgZHVtcCBvZiB0aGUgZ2xvYmFsIHN0YXRlLiBDYWxsIHdpdGgKKyAgICAgICAgdmFyaWFibGUgZmxhZ3MgdG8gYmUgcmV0cmlldmVkIGFzIHBhcmFtcy4KKyAgICAgICAgIiIiCisgICAgICAgIGZsYWdsaXN0ID0gcGFyYW1zWzBdCisgICAgICAgIHJldHVybiBjb21tYW5kLmNvb2tlci5nZXRBbGxLZXlzV2l0aEZsYWdzKGZsYWdsaXN0KQorICAgIGdldEFsbEtleXNXaXRoRmxhZ3MucmVhZG9ubHkgPSBUcnVlCisKKyAgICBkZWYgZ2V0VmFyaWFibGUoc2VsZiwgY29tbWFuZCwgcGFyYW1zKToKKyAgICAgICAgIiIiCisgICAgICAgIFJlYWQgdGhlIHZhbHVlIG9mIGEgdmFyaWFibGUgZnJvbSBkYXRhCisgICAgICAgICIiIgorICAgICAgICB2YXJuYW1lID0gcGFyYW1zWzBdCisgICAgICAgIGV4cGFuZCA9IFRydWUKKyAgICAgICAgaWYgbGVuKHBhcmFtcykgPiAxOgorICAgICAgICAgICAgZXhwYW5kID0gKHBhcmFtc1sxXSA9PSAiVHJ1ZSIpCisKKyAgICAgICAgcmV0dXJuIGNvbW1hbmQuY29va2VyLmRhdGEuZ2V0VmFyKHZhcm5hbWUsIGV4cGFuZCkKKyAgICBnZXRWYXJpYWJsZS5yZWFkb25seSA9IFRydWUKKworICAgIGRlZiBzZXRWYXJpYWJsZShzZWxmLCBjb21tYW5kLCBwYXJhbXMpOgorICAgICAgICAiIiIKKyAgICAgICAgU2V0IHRoZSB2YWx1ZSBvZiB2YXJpYWJsZSBpbiBkYXRhCisgICAgICAgICIiIgorICAgICAgICB2YXJuYW1lID0gcGFyYW1zWzBdCisgICAgICAgIHZhbHVlID0gc3RyKHBhcmFtc1sxXSkKKyAgICAgICAgY29tbWFuZC5jb29rZXIuZGF0YS5zZXRWYXIodmFybmFtZSwgdmFsdWUpCisKKyAgICBkZWYgc2V0Q29uZmlnKHNlbGYsIGNvbW1hbmQsIHBhcmFtcyk6CisgICAgICAgICIiIgorICAgICAgICBTZXQgdGhlIHZhbHVlIG9mIHZhcmlhYmxlIGluIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgIiIiCisgICAgICAgIHZhcm5hbWUgPSBwYXJhbXNbMF0KKyAgICAgICAgdmFsdWUgPSBzdHIocGFyYW1zWzFdKQorICAgICAgICBzZXRhdHRyKGNvbW1hbmQuY29va2VyLmNvbmZpZ3VyYXRpb24sIHZhcm5hbWUsIHZhbHVlKQorCisgICAgZGVmIGVuYWJsZURhdGFUcmFja2luZyhzZWxmLCBjb21tYW5kLCBwYXJhbXMpOgorICAgICAgICAiIiIKKyAgICAgICAgRW5hYmxlIGhpc3RvcnkgdHJhY2tpbmcgZm9yIHZhcmlhYmxlcworICAgICAgICAiIiIKKyAgICAgICAgY29tbWFuZC5jb29rZXIuZW5hYmxlRGF0YVRyYWNraW5nKCkKKworICAgIGRlZiBkaXNhYmxlRGF0YVRyYWNraW5nKHNlbGYsIGNvbW1hbmQsIHBhcmFtcyk6CisgICAgICAgICIiIgorICAgICAgICBEaXNhYmxlIGhpc3RvcnkgdHJhY2tpbmcgZm9yIHZhcmlhYmxlcworICAgICAgICAiIiIKKyAgICAgICAgY29tbWFuZC5jb29rZXIuZGlzYWJsZURhdGFUcmFja2luZygpCisKKyAgICBkZWYgc2V0UHJlUG9zdENvbmZGaWxlcyhzZWxmLCBjb21tYW5kLCBwYXJhbXMpOgorICAgICAgICBwcmVmaWxlcyA9IHBhcmFtc1swXS5zcGxpdCgpCisgICAgICAgIHBvc3RmaWxlcyA9IHBhcmFtc1sxXS5zcGxpdCgpCisgICAgICAgIGNvbW1hbmQuY29va2VyLmNvbmZpZ3VyYXRpb24ucHJlZmlsZSA9IHByZWZpbGVzCisgICAgICAgIGNvbW1hbmQuY29va2VyLmNvbmZpZ3VyYXRpb24ucG9zdGZpbGUgPSBwb3N0ZmlsZXMKKyAgICBzZXRQcmVQb3N0Q29uZkZpbGVzLm5lZWRjb25maWcgPSBGYWxzZQorCisgICAgZGVmIGdldENwdUNvdW50KHNlbGYsIGNvbW1hbmQsIHBhcmFtcyk6CisgICAgICAgICIiIgorICAgICAgICBHZXQgdGhlIENQVSBjb3VudCBvbiB0aGUgYml0YmFrZSBzZXJ2ZXIKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBiYi51dGlscy5jcHVfY291bnQoKQorICAgIGdldENwdUNvdW50LnJlYWRvbmx5ID0gVHJ1ZQorICAgIGdldENwdUNvdW50Lm5lZWRjb25maWcgPSBGYWxzZQorCisgICAgZGVmIG1hdGNoRmlsZShzZWxmLCBjb21tYW5kLCBwYXJhbXMpOgorICAgICAgICBmTWF0Y2ggPSBwYXJhbXNbMF0KKyAgICAgICAgcmV0dXJuIGNvbW1hbmQuY29va2VyLm1hdGNoRmlsZShmTWF0Y2gpCisgICAgbWF0Y2hGaWxlLm5lZWRjb25maWcgPSBGYWxzZQorCisgICAgZGVmIGdlbmVyYXRlTmV3SW1hZ2Uoc2VsZiwgY29tbWFuZCwgcGFyYW1zKToKKyAgICAgICAgaW1hZ2UgPSBwYXJhbXNbMF0KKyAgICAgICAgYmFzZV9pbWFnZSA9IHBhcmFtc1sxXQorICAgICAgICBwYWNrYWdlX3F1ZXVlID0gcGFyYW1zWzJdCisgICAgICAgIHRpbWVzdGFtcCA9IHBhcmFtc1szXQorICAgICAgICBkZXNjcmlwdGlvbiA9IHBhcmFtc1s0XQorICAgICAgICByZXR1cm4gY29tbWFuZC5jb29rZXIuZ2VuZXJhdGVOZXdJbWFnZShpbWFnZSwgYmFzZV9pbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VfcXVldWUsIHRpbWVzdGFtcCwgZGVzY3JpcHRpb24pCisKKyAgICBkZWYgZW5zdXJlRGlyKHNlbGYsIGNvbW1hbmQsIHBhcmFtcyk6CisgICAgICAgIGRpcmVjdG9yeSA9IHBhcmFtc1swXQorICAgICAgICBiYi51dGlscy5ta2RpcmhpZXIoZGlyZWN0b3J5KQorICAgIGVuc3VyZURpci5uZWVkY29uZmlnID0gRmFsc2UKKworICAgIGRlZiBzZXRWYXJGaWxlKHNlbGYsIGNvbW1hbmQsIHBhcmFtcyk6CisgICAgICAgICIiIgorICAgICAgICBTYXZlIGEgdmFyaWFibGUgaW4gYSBmaWxlOyB1c2VkIGZvciBzYXZpbmcgaW4gYSBjb25maWd1cmF0aW9uIGZpbGUKKyAgICAgICAgIiIiCisgICAgICAgIHZhciA9IHBhcmFtc1swXQorICAgICAgICB2YWwgPSBwYXJhbXNbMV0KKyAgICAgICAgZGVmYXVsdF9maWxlID0gcGFyYW1zWzJdCisgICAgICAgIG9wID0gcGFyYW1zWzNdCisgICAgICAgIGNvbW1hbmQuY29va2VyLm1vZGlmeUNvbmZpZ3VyYXRpb25WYXIodmFyLCB2YWwsIGRlZmF1bHRfZmlsZSwgb3ApCisgICAgc2V0VmFyRmlsZS5uZWVkY29uZmlnID0gRmFsc2UKKworICAgIGRlZiByZW1vdmVWYXJGaWxlKHNlbGYsIGNvbW1hbmQsIHBhcmFtcyk6CisgICAgICAgICIiIgorICAgICAgICBSZW1vdmUgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBmcm9tIGEgZmlsZQorICAgICAgICAiIiIKKyAgICAgICAgdmFyID0gcGFyYW1zWzBdCisgICAgICAgIGNvbW1hbmQuY29va2VyLnJlbW92ZUNvbmZpZ3VyYXRpb25WYXIodmFyKQorICAgIHJlbW92ZVZhckZpbGUubmVlZGNvbmZpZyA9IEZhbHNlCisKKyAgICBkZWYgY3JlYXRlQ29uZmlnRmlsZShzZWxmLCBjb21tYW5kLCBwYXJhbXMpOgorICAgICAgICAiIiIKKyAgICAgICAgQ3JlYXRlIGFuIGV4dHJhIGNvbmZpZ3VyYXRpb24gZmlsZQorICAgICAgICAiIiIKKyAgICAgICAgbmFtZSA9IHBhcmFtc1swXQorICAgICAgICBjb21tYW5kLmNvb2tlci5jcmVhdGVDb25maWdGaWxlKG5hbWUpCisgICAgY3JlYXRlQ29uZmlnRmlsZS5uZWVkY29uZmlnID0gRmFsc2UKKworICAgIGRlZiBzZXRFdmVudE1hc2soc2VsZiwgY29tbWFuZCwgcGFyYW1zKToKKyAgICAgICAgaGFuZGxlck51bSA9IHBhcmFtc1swXQorICAgICAgICBsbGV2ZWwgPSBwYXJhbXNbMV0KKyAgICAgICAgZGVidWdfZG9tYWlucyA9IHBhcmFtc1syXQorICAgICAgICBtYXNrID0gcGFyYW1zWzNdCisgICAgICAgIHJldHVybiBiYi5ldmVudC5zZXRfVUlIbWFzayhoYW5kbGVyTnVtLCBsbGV2ZWwsIGRlYnVnX2RvbWFpbnMsIG1hc2spCisgICAgc2V0RXZlbnRNYXNrLm5lZWRjb25maWcgPSBGYWxzZQorCisgICAgZGVmIHNldEZlYXR1cmVzKHNlbGYsIGNvbW1hbmQsIHBhcmFtcyk6CisgICAgICAgICIiIgorICAgICAgICBTZXQgdGhlIGNvb2tlciBmZWF0dXJlcyB0byBpbmNsdWRlIHRoZSBwYXNzZWQgbGlzdCBvZiBmZWF0dXJlcworICAgICAgICAiIiIKKyAgICAgICAgZmVhdHVyZXMgPSBwYXJhbXNbMF0KKyAgICAgICAgY29tbWFuZC5jb29rZXIuc2V0RmVhdHVyZXMoZmVhdHVyZXMpCisgICAgc2V0RmVhdHVyZXMubmVlZGNvbmZpZyA9IEZhbHNlCisgICAgIyBhbHRob3VnaCB3ZSBjaGFuZ2UgdGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSBjb29rZXIsIHRoaXMgaXMgdHJhbnNwYXJlbnQgc2luY2UKKyAgICAjIHdlIGFsd2F5cyB0YWtlIGFuZCBsZWF2ZSB0aGUgY29va2VyIGluIHN0YXRlLmluaXRpYWwKKyAgICBzZXRGZWF0dXJlcy5yZWFkb25seSA9IFRydWUKKworICAgIGRlZiB1cGRhdGVDb25maWcoc2VsZiwgY29tbWFuZCwgcGFyYW1zKToKKyAgICAgICAgb3B0aW9ucyA9IHBhcmFtc1swXQorICAgICAgICBlbnZpcm9ubWVudCA9IHBhcmFtc1sxXQorICAgICAgICBjb21tYW5kLmNvb2tlci51cGRhdGVDb25maWdPcHRzKG9wdGlvbnMsIGVudmlyb25tZW50KQorICAgIHVwZGF0ZUNvbmZpZy5uZWVkY29uZmlnID0gRmFsc2UKKworY2xhc3MgQ29tbWFuZHNBc3luYzoKKyAgICAiIiIKKyAgICBBIGNsYXNzIG9mIGFzeW5jaHJvbm91cyBjb21tYW5kcworICAgIFRoZXNlIGZ1bmN0aW9ucyBjb21tdW5pY2F0ZSB2aWEgZ2VuZXJhdGVkIGV2ZW50cy4KKyAgICBBbnkgZnVuY3Rpb24gdGhhdCByZXF1aXJlcyBtZXRhZGF0YSBwYXJzaW5nIHNob3VsZCBiZSBoZXJlLgorICAgICIiIgorCisgICAgZGVmIGJ1aWxkRmlsZShzZWxmLCBjb21tYW5kLCBwYXJhbXMpOgorICAgICAgICAiIiIKKyAgICAgICAgQnVpbGQgYSBzaW5nbGUgc3BlY2lmaWVkIC5iYiBmaWxlCisgICAgICAgICIiIgorICAgICAgICBiZmlsZSA9IHBhcmFtc1swXQorICAgICAgICB0YXNrID0gcGFyYW1zWzFdCisKKyAgICAgICAgY29tbWFuZC5jb29rZXIuYnVpbGRGaWxlKGJmaWxlLCB0YXNrKQorICAgIGJ1aWxkRmlsZS5uZWVkY2FjaGUgPSBGYWxzZQorCisgICAgZGVmIGJ1aWxkVGFyZ2V0cyhzZWxmLCBjb21tYW5kLCBwYXJhbXMpOgorICAgICAgICAiIiIKKyAgICAgICAgQnVpbGQgYSBzZXQgb2YgdGFyZ2V0cworICAgICAgICAiIiIKKyAgICAgICAgcGtnc190b19idWlsZCA9IHBhcmFtc1swXQorICAgICAgICB0YXNrID0gcGFyYW1zWzFdCisKKyAgICAgICAgY29tbWFuZC5jb29rZXIuYnVpbGRUYXJnZXRzKHBrZ3NfdG9fYnVpbGQsIHRhc2spCisgICAgYnVpbGRUYXJnZXRzLm5lZWRjYWNoZSA9IFRydWUKKworICAgIGRlZiBnZW5lcmF0ZURlcFRyZWVFdmVudChzZWxmLCBjb21tYW5kLCBwYXJhbXMpOgorICAgICAgICAiIiIKKyAgICAgICAgR2VuZXJhdGUgYW4gZXZlbnQgY29udGFpbmluZyB0aGUgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbgorICAgICAgICAiIiIKKyAgICAgICAgcGtnc190b19idWlsZCA9IHBhcmFtc1swXQorICAgICAgICB0YXNrID0gcGFyYW1zWzFdCisKKyAgICAgICAgY29tbWFuZC5jb29rZXIuZ2VuZXJhdGVEZXBUcmVlRXZlbnQocGtnc190b19idWlsZCwgdGFzaykKKyAgICAgICAgY29tbWFuZC5maW5pc2hBc3luY0NvbW1hbmQoKQorICAgIGdlbmVyYXRlRGVwVHJlZUV2ZW50Lm5lZWRjYWNoZSA9IFRydWUKKworICAgIGRlZiBnZW5lcmF0ZURvdEdyYXBoKHNlbGYsIGNvbW1hbmQsIHBhcmFtcyk6CisgICAgICAgICIiIgorICAgICAgICBEdW1wIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gdG8gZGlzayBhcyAuZG90IGZpbGVzCisgICAgICAgICIiIgorICAgICAgICBwa2dzX3RvX2J1aWxkID0gcGFyYW1zWzBdCisgICAgICAgIHRhc2sgPSBwYXJhbXNbMV0KKworICAgICAgICBjb21tYW5kLmNvb2tlci5nZW5lcmF0ZURvdEdyYXBoRmlsZXMocGtnc190b19idWlsZCwgdGFzaykKKyAgICAgICAgY29tbWFuZC5maW5pc2hBc3luY0NvbW1hbmQoKQorICAgIGdlbmVyYXRlRG90R3JhcGgubmVlZGNhY2hlID0gVHJ1ZQorCisgICAgZGVmIGdlbmVyYXRlVGFyZ2V0c1RyZWUoc2VsZiwgY29tbWFuZCwgcGFyYW1zKToKKyAgICAgICAgIiIiCisgICAgICAgIEdlbmVyYXRlIGEgdHJlZSBvZiBidWlsZGFibGUgdGFyZ2V0cy4KKyAgICAgICAgSWYga2xhc3MgaXMgcHJvdmlkZWQgZW5zdXJlIGFsbCByZWNpcGVzIHRoYXQgaW5oZXJpdCB0aGUgY2xhc3MgYXJlCisgICAgICAgIGluY2x1ZGVkIGluIHRoZSBwYWNrYWdlIGxpc3QuCisgICAgICAgIElmIHBrZ19saXN0IHByb3ZpZGVkIHVzZSB0aGF0IGxpc3QgKHBsdXMgYW55IGV4dHJhcyBicm91Z2h0IGluIGJ5CisgICAgICAgIGtsYXNzKSByYXRoZXIgdGhhbiBnZW5lcmF0aW5nIGEgdHJlZSBmb3IgYWxsIHBhY2thZ2VzLgorICAgICAgICAiIiIKKyAgICAgICAga2xhc3MgPSBwYXJhbXNbMF0KKyAgICAgICAgcGtnX2xpc3QgPSBwYXJhbXNbMV0KKworICAgICAgICBjb21tYW5kLmNvb2tlci5nZW5lcmF0ZVRhcmdldHNUcmVlKGtsYXNzLCBwa2dfbGlzdCkKKyAgICAgICAgY29tbWFuZC5maW5pc2hBc3luY0NvbW1hbmQoKQorICAgIGdlbmVyYXRlVGFyZ2V0c1RyZWUubmVlZGNhY2hlID0gVHJ1ZQorCisgICAgZGVmIGZpbmRDb3JlQmFzZUZpbGVzKHNlbGYsIGNvbW1hbmQsIHBhcmFtcyk6CisgICAgICAgICIiIgorICAgICAgICBGaW5kIGNlcnRhaW4gZmlsZXMgaW4gQ09SRUJBU0UgZGlyZWN0b3J5LiBpLmUuIExheWVycworICAgICAgICAiIiIKKyAgICAgICAgc3ViZGlyID0gcGFyYW1zWzBdCisgICAgICAgIGZpbGVuYW1lID0gcGFyYW1zWzFdCisKKyAgICAgICAgY29tbWFuZC5jb29rZXIuZmluZENvcmVCYXNlRmlsZXMoc3ViZGlyLCBmaWxlbmFtZSkKKyAgICAgICAgY29tbWFuZC5maW5pc2hBc3luY0NvbW1hbmQoKQorICAgIGZpbmRDb3JlQmFzZUZpbGVzLm5lZWRjYWNoZSA9IEZhbHNlCisKKyAgICBkZWYgZmluZENvbmZpZ0ZpbGVzKHNlbGYsIGNvbW1hbmQsIHBhcmFtcyk6CisgICAgICAgICIiIgorICAgICAgICBGaW5kIGNvbmZpZyBmaWxlcyB3aGljaCBwcm92aWRlIGFwcHJvcHJpYXRlIHZhbHVlcworICAgICAgICBmb3IgdGhlIHBhc3NlZCBjb25maWd1cmF0aW9uIHZhcmlhYmxlLiBpLmUuIE1BQ0hJTkUKKyAgICAgICAgIiIiCisgICAgICAgIHZhcm5hbWUgPSBwYXJhbXNbMF0KKworICAgICAgICBjb21tYW5kLmNvb2tlci5maW5kQ29uZmlnRmlsZXModmFybmFtZSkKKyAgICAgICAgY29tbWFuZC5maW5pc2hBc3luY0NvbW1hbmQoKQorICAgIGZpbmRDb25maWdGaWxlcy5uZWVkY2FjaGUgPSBGYWxzZQorCisgICAgZGVmIGZpbmRGaWxlc01hdGNoaW5nSW5EaXIoc2VsZiwgY29tbWFuZCwgcGFyYW1zKToKKyAgICAgICAgIiIiCisgICAgICAgIEZpbmQgaW1wbGVtZW50YXRpb24gZmlsZXMgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBwYXR0ZXJuCisgICAgICAgIGluIHRoZSByZXF1ZXN0ZWQgc3ViZGlyZWN0b3J5IG9mIGEgQkJQQVRICisgICAgICAgICIiIgorICAgICAgICBwYXR0ZXJuID0gcGFyYW1zWzBdCisgICAgICAgIGRpcmVjdG9yeSA9IHBhcmFtc1sxXQorCisgICAgICAgIGNvbW1hbmQuY29va2VyLmZpbmRGaWxlc01hdGNoaW5nSW5EaXIocGF0dGVybiwgZGlyZWN0b3J5KQorICAgICAgICBjb21tYW5kLmZpbmlzaEFzeW5jQ29tbWFuZCgpCisgICAgZmluZEZpbGVzTWF0Y2hpbmdJbkRpci5uZWVkY2FjaGUgPSBGYWxzZQorCisgICAgZGVmIGZpbmRDb25maWdGaWxlUGF0aChzZWxmLCBjb21tYW5kLCBwYXJhbXMpOgorICAgICAgICAiIiIKKyAgICAgICAgRmluZCB0aGUgcGF0aCBvZiB0aGUgcmVxdWVzdGVkIGNvbmZpZ3VyYXRpb24gZmlsZQorICAgICAgICAiIiIKKyAgICAgICAgY29uZmlnZmlsZSA9IHBhcmFtc1swXQorCisgICAgICAgIGNvbW1hbmQuY29va2VyLmZpbmRDb25maWdGaWxlUGF0aChjb25maWdmaWxlKQorICAgICAgICBjb21tYW5kLmZpbmlzaEFzeW5jQ29tbWFuZCgpCisgICAgZmluZENvbmZpZ0ZpbGVQYXRoLm5lZWRjYWNoZSA9IEZhbHNlCisKKyAgICBkZWYgc2hvd1ZlcnNpb25zKHNlbGYsIGNvbW1hbmQsIHBhcmFtcyk6CisgICAgICAgICIiIgorICAgICAgICBTaG93IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdmVyc2lvbnMKKyAgICAgICAgIiIiCisgICAgICAgIGNvbW1hbmQuY29va2VyLnNob3dWZXJzaW9ucygpCisgICAgICAgIGNvbW1hbmQuZmluaXNoQXN5bmNDb21tYW5kKCkKKyAgICBzaG93VmVyc2lvbnMubmVlZGNhY2hlID0gVHJ1ZQorCisgICAgZGVmIHNob3dFbnZpcm9ubWVudFRhcmdldChzZWxmLCBjb21tYW5kLCBwYXJhbXMpOgorICAgICAgICAiIiIKKyAgICAgICAgUHJpbnQgdGhlIGVudmlyb25tZW50IG9mIGEgdGFyZ2V0IHJlY2lwZQorICAgICAgICAobmVlZHMgdGhlIGNhY2hlIHRvIHdvcmsgb3V0IHdoaWNoIHJlY2lwZSB0byB1c2UpCisgICAgICAgICIiIgorICAgICAgICBwa2cgPSBwYXJhbXNbMF0KKworICAgICAgICBjb21tYW5kLmNvb2tlci5zaG93RW52aXJvbm1lbnQoTm9uZSwgcGtnKQorICAgICAgICBjb21tYW5kLmZpbmlzaEFzeW5jQ29tbWFuZCgpCisgICAgc2hvd0Vudmlyb25tZW50VGFyZ2V0Lm5lZWRjYWNoZSA9IFRydWUKKworICAgIGRlZiBzaG93RW52aXJvbm1lbnQoc2VsZiwgY29tbWFuZCwgcGFyYW1zKToKKyAgICAgICAgIiIiCisgICAgICAgIFByaW50IHRoZSBzdGFuZGFyZCBlbnZpcm9ubWVudAorICAgICAgICBvciBpZiBzcGVjaWZpZWQgdGhlIGVudmlyb25tZW50IGZvciBhIHNwZWNpZmllZCByZWNpcGUKKyAgICAgICAgIiIiCisgICAgICAgIGJmaWxlID0gcGFyYW1zWzBdCisKKyAgICAgICAgY29tbWFuZC5jb29rZXIuc2hvd0Vudmlyb25tZW50KGJmaWxlKQorICAgICAgICBjb21tYW5kLmZpbmlzaEFzeW5jQ29tbWFuZCgpCisgICAgc2hvd0Vudmlyb25tZW50Lm5lZWRjYWNoZSA9IEZhbHNlCisKKyAgICBkZWYgcGFyc2VGaWxlcyhzZWxmLCBjb21tYW5kLCBwYXJhbXMpOgorICAgICAgICAiIiIKKyAgICAgICAgUGFyc2UgdGhlIC5iYiBmaWxlcworICAgICAgICAiIiIKKyAgICAgICAgY29tbWFuZC5jb29rZXIudXBkYXRlQ2FjaGUoKQorICAgICAgICBjb21tYW5kLmZpbmlzaEFzeW5jQ29tbWFuZCgpCisgICAgcGFyc2VGaWxlcy5uZWVkY2FjaGUgPSBUcnVlCisKKyAgICBkZWYgY29tcGFyZVJldmlzaW9ucyhzZWxmLCBjb21tYW5kLCBwYXJhbXMpOgorICAgICAgICAiIiIKKyAgICAgICAgUGFyc2UgdGhlIC5iYiBmaWxlcworICAgICAgICAiIiIKKyAgICAgICAgaWYgYmIuZmV0Y2guZmV0Y2hlcl9jb21wYXJlX3JldmlzaW9ucyhjb21tYW5kLmNvb2tlci5kYXRhKToKKyAgICAgICAgICAgIGNvbW1hbmQuZmluaXNoQXN5bmNDb21tYW5kKGNvZGU9MSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNvbW1hbmQuZmluaXNoQXN5bmNDb21tYW5kKCkKKyAgICBjb21wYXJlUmV2aXNpb25zLm5lZWRjYWNoZSA9IFRydWUKKworICAgIGRlZiB0cmlnZ2VyRXZlbnQoc2VsZiwgY29tbWFuZCwgcGFyYW1zKToKKyAgICAgICAgIiIiCisgICAgICAgIFRyaWdnZXIgYSBjZXJ0YWluIGV2ZW50CisgICAgICAgICIiIgorICAgICAgICBldmVudCA9IHBhcmFtc1swXQorICAgICAgICBiYi5ldmVudC5maXJlKGV2YWwoZXZlbnQpLCBjb21tYW5kLmNvb2tlci5kYXRhKQorICAgICAgICBjb21tYW5kLmN1cnJlbnRBc3luY0NvbW1hbmQgPSBOb25lCisgICAgdHJpZ2dlckV2ZW50Lm5lZWRjYWNoZSA9IEZhbHNlCisKKyAgICBkZWYgcmVzZXRDb29rZXIoc2VsZiwgY29tbWFuZCwgcGFyYW1zKToKKyAgICAgICAgIiIiCisgICAgICAgIFJlc2V0IHRoZSBjb29rZXIgdG8gaXRzIGluaXRpYWwgc3RhdGUsIHRodXMgZm9yY2luZyBhIHJlcGFyc2UgZm9yCisgICAgICAgIGFueSBhc3luYyBjb21tYW5kIHRoYXQgaGFzIHRoZSBuZWVkY2FjaGUgcHJvcGVydHkgc2V0IHRvIFRydWUKKyAgICAgICAgIiIiCisgICAgICAgIGNvbW1hbmQuY29va2VyLnJlc2V0KCkKKyAgICAgICAgY29tbWFuZC5maW5pc2hBc3luY0NvbW1hbmQoKQorICAgIHJlc2V0Q29va2VyLm5lZWRjYWNoZSA9IEZhbHNlCisKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL2NvbXBhdC5weSBiL2JpdGJha2UvbGliL2JiL2NvbXBhdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTE5MjNkCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvY29tcGF0LnB5CkBAIC0wLDAgKzEsNiBAQAorIiIiQ29kZSBwdWxsZWQgZnJvbSBmdXR1cmUgcHl0aG9uIHZlcnNpb25zLCBoZXJlIGZvciBjb21wYXRpYmlsaXR5IiIiCisKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IE11dGFibGVNYXBwaW5nLCBLZXlzVmlldywgVmFsdWVzVmlldywgSXRlbXNWaWV3LCBPcmRlcmVkRGljdAorZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHRvdGFsX29yZGVyaW5nCisKKwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvY29va2VyLnB5IGIvYml0YmFrZS9saWIvYmIvY29va2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZDdkNTkKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9jb29rZXIucHkKQEAgLTAsMCArMSwyMTM5IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisjCisjIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCAgQ2hyaXMgTGFyc29uCisjIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCAgUGhpbCBCbHVuZGVsbAorIyBDb3B5cmlnaHQgKEMpIDIwMDMgLSAyMDA1IE1pY2hhZWwgJ01pY2tleScgTGF1ZXIKKyMgQ29weXJpZ2h0IChDKSAyMDA1ICAgICAgICBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlcgorIyBDb3B5cmlnaHQgKEMpIDIwMDUgICAgICAgIFJPQUQgR21iSAorIyBDb3B5cmlnaHQgKEMpIDIwMDYgLSAyMDA3IFJpY2hhcmQgUHVyZGllCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCitpbXBvcnQgc3lzLCBvcywgZ2xvYiwgb3MucGF0aCwgcmUsIHRpbWUKK2ltcG9ydCBhdGV4aXQKK2ltcG9ydCBpdGVydG9vbHMKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgbXVsdGlwcm9jZXNzaW5nCitpbXBvcnQgc3JlX2NvbnN0YW50cworaW1wb3J0IHRocmVhZGluZworZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitmcm9tIGNvbnRleHRsaWIgaW1wb3J0IGNsb3NpbmcKK2Zyb20gZnVuY3Rvb2xzIGltcG9ydCB3cmFwcworZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVmYXVsdGRpY3QKK2ltcG9ydCBiYiwgYmIuZXhjZXB0aW9ucywgYmIuY29tbWFuZAorZnJvbSBiYiBpbXBvcnQgdXRpbHMsIGRhdGEsIHBhcnNlLCBldmVudCwgY2FjaGUsIHByb3ZpZGVycywgdGFza2RhdGEsIHJ1bnF1ZXVlLCBidWlsZAoraW1wb3J0IFF1ZXVlCitpbXBvcnQgc2lnbmFsCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IGVycm5vCitpbXBvcnQgcHJzZXJ2LnNlcnYKK2ltcG9ydCBweWlub3RpZnkKKworbG9nZ2VyICAgICAgPSBsb2dnaW5nLmdldExvZ2dlcigiQml0QmFrZSIpCitjb2xsZWN0bG9nICA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJCaXRCYWtlLkNvbGxlY3Rpb24iKQorYnVpbGRsb2cgICAgPSBsb2dnaW5nLmdldExvZ2dlcigiQml0QmFrZS5CdWlsZCIpCitwYXJzZWxvZyAgICA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJCaXRCYWtlLlBhcnNpbmciKQorcHJvdmlkZXJsb2cgPSBsb2dnaW5nLmdldExvZ2dlcigiQml0QmFrZS5Qcm92aWRlciIpCisKK2NsYXNzIE5vU3BlY2lmaWNNYXRjaChiYi5CQkhhbmRsZWRFeGNlcHRpb24pOgorICAgICIiIgorICAgIEV4Y2VwdGlvbiByYWlzZWQgd2hlbiBubyBvciBtdWx0aXBsZSBmaWxlIG1hdGNoZXMgYXJlIGZvdW5kCisgICAgIiIiCisKK2NsYXNzIE5vdGhpbmdUb0J1aWxkKEV4Y2VwdGlvbik6CisgICAgIiIiCisgICAgRXhjZXB0aW9uIHJhaXNlZCB3aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gYnVpbGQKKyAgICAiIiIKKworY2xhc3MgQ29sbGVjdGlvbkVycm9yKGJiLkJCSGFuZGxlZEV4Y2VwdGlvbik6CisgICAgIiIiCisgICAgRXhjZXB0aW9uIHJhaXNlZCB3aGVuIGxheWVyIGNvbmZpZ3VyYXRpb24gaXMgaW5jb3JyZWN0CisgICAgIiIiCisKK2NsYXNzIHN0YXRlOgorICAgIGluaXRpYWwsIHBhcnNpbmcsIHJ1bm5pbmcsIHNodXRkb3duLCBmb3JjZXNodXRkb3duLCBzdG9wcGVkLCBlcnJvciA9IHJhbmdlKDcpCisKKworY2xhc3MgU2tpcHBlZFBhY2thZ2U6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGluZm8gPSBOb25lLCByZWFzb24gPSBOb25lKToKKyAgICAgICAgc2VsZi5wbiA9IE5vbmUKKyAgICAgICAgc2VsZi5za2lwcmVhc29uID0gTm9uZQorICAgICAgICBzZWxmLnByb3ZpZGVzID0gTm9uZQorICAgICAgICBzZWxmLnJwcm92aWRlcyA9IE5vbmUKKworICAgICAgICBpZiBpbmZvOgorICAgICAgICAgICAgc2VsZi5wbiA9IGluZm8ucG4KKyAgICAgICAgICAgIHNlbGYuc2tpcHJlYXNvbiA9IGluZm8uc2tpcHJlYXNvbgorICAgICAgICAgICAgc2VsZi5wcm92aWRlcyA9IGluZm8ucHJvdmlkZXMKKyAgICAgICAgICAgIHNlbGYucnByb3ZpZGVzID0gaW5mby5ycHJvdmlkZXMKKyAgICAgICAgZWxpZiByZWFzb246CisgICAgICAgICAgICBzZWxmLnNraXByZWFzb24gPSByZWFzb24KKworCitjbGFzcyBDb29rZXJGZWF0dXJlcyhvYmplY3QpOgorICAgIF9mZWF0dXJlX2xpc3QgPSBbSE9CX0VYVFJBX0NBQ0hFUywgU0VORF9ERVBFTkRTX1RSRUUsIEJBU0VEQVRBU1RPUkVfVFJBQ0tJTkcsIFNFTkRfU0FOSVRZRVZFTlRTXSA9IHJhbmdlKDQpCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX2ZlYXR1cmVzPXNldCgpCisKKyAgICBkZWYgc2V0RmVhdHVyZShzZWxmLCBmKToKKyAgICAgICAgIyB2YWxpZGF0ZSB3ZSBnb3QgYSByZXF1ZXN0IGZvciBhIGZlYXR1cmUgd2Ugc3VwcG9ydAorICAgICAgICBpZiBmIG5vdCBpbiBDb29rZXJGZWF0dXJlcy5fZmVhdHVyZV9saXN0OgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuX2ZlYXR1cmVzLmFkZChmKQorCisgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBmKToKKyAgICAgICAgcmV0dXJuIGYgaW4gc2VsZi5fZmVhdHVyZXMKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZlYXR1cmVzLl9faXRlcl9fKCkKKworICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZmVhdHVyZXMubmV4dCgpCisKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0jCisjIEJCQ29va2VyCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSMKK2NsYXNzIEJCQ29va2VyOgorICAgICIiIgorICAgIE1hbmFnZXMgb25lIGJpdGJha2UgYnVpbGQgcnVuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlndXJhdGlvbiwgZmVhdHVyZVNldD1Ob25lKToKKyAgICAgICAgc2VsZi5yZWNpcGVjYWNoZSA9IE5vbmUKKyAgICAgICAgc2VsZi5za2lwbGlzdCA9IHt9CisgICAgICAgIHNlbGYuZmVhdHVyZXNldCA9IENvb2tlckZlYXR1cmVzKCkKKyAgICAgICAgaWYgZmVhdHVyZVNldDoKKyAgICAgICAgICAgIGZvciBmIGluIGZlYXR1cmVTZXQ6CisgICAgICAgICAgICAgICAgc2VsZi5mZWF0dXJlc2V0LnNldEZlYXR1cmUoZikKKworICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uCisKKyAgICAgICAgc2VsZi5jb25maWd3YXRjaGVyID0gcHlpbm90aWZ5LldhdGNoTWFuYWdlcigpCisgICAgICAgIHNlbGYuY29uZmlnd2F0Y2hlci5iYnNlZW4gPSBbXQorICAgICAgICBzZWxmLmNvbmZpZ3dhdGNoZXIuYmJ3YXRjaGVkZmlsZXMgPSBbXQorICAgICAgICBzZWxmLmNvbmZpZ25vdGlmaWVyID0gcHlpbm90aWZ5Lk5vdGlmaWVyKHNlbGYuY29uZmlnd2F0Y2hlciwgc2VsZi5jb25maWdfbm90aWZpY2F0aW9ucykKKyAgICAgICAgc2VsZi53YXRjaG1hc2sgPSBweWlub3RpZnkuSU5fQ0xPU0VfV1JJVEUgfCBweWlub3RpZnkuSU5fQ1JFQVRFIHwgcHlpbm90aWZ5LklOX0RFTEVURSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBweWlub3RpZnkuSU5fREVMRVRFX1NFTEYgfCBweWlub3RpZnkuSU5fTU9ESUZZIHwgcHlpbm90aWZ5LklOX01PVkVfU0VMRiB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBweWlub3RpZnkuSU5fTU9WRURfRlJPTSB8IHB5aW5vdGlmeS5JTl9NT1ZFRF9UTyAKKyAgICAgICAgc2VsZi53YXRjaGVyID0gcHlpbm90aWZ5LldhdGNoTWFuYWdlcigpCisgICAgICAgIHNlbGYud2F0Y2hlci5iYnNlZW4gPSBbXQorICAgICAgICBzZWxmLndhdGNoZXIuYmJ3YXRjaGVkZmlsZXMgPSBbXQorICAgICAgICBzZWxmLm5vdGlmaWVyID0gcHlpbm90aWZ5Lk5vdGlmaWVyKHNlbGYud2F0Y2hlciwgc2VsZi5ub3RpZmljYXRpb25zKQorCisKKyAgICAgICAgc2VsZi5pbml0Q29uZmlndXJhdGlvbkRhdGEoKQorCisgICAgICAgIHNlbGYuaW5vdGlmeV9tb2RpZmllZF9maWxlcyA9IFtdCisKKyAgICAgICAgZGVmIF9wcm9jZXNzX2lub3RpZnlfdXBkYXRlcyhzZXJ2ZXIsIG5vdGlmaWVyX2xpc3QsIGFib3J0KToKKyAgICAgICAgICAgIGZvciBuIGluIG5vdGlmaWVyX2xpc3Q6CisgICAgICAgICAgICAgICAgaWYgbi5jaGVja19ldmVudHModGltZW91dD0wKToKKyAgICAgICAgICAgICAgICAgICAgIyByZWFkIG5vdGlmaWVkIGV2ZW50cyBhbmQgZW5xZXVlIHRoZW0KKyAgICAgICAgICAgICAgICAgICAgbi5yZWFkX2V2ZW50cygpCisgICAgICAgICAgICAgICAgICAgIG4ucHJvY2Vzc19ldmVudHMoKQorICAgICAgICAgICAgcmV0dXJuIDEuMAorCisgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi5zZXJ2ZXJfcmVnaXN0ZXJfaWRsZWNhbGxiYWNrKF9wcm9jZXNzX2lub3RpZnlfdXBkYXRlcywgW3NlbGYuY29uZmlnbm90aWZpZXIsIHNlbGYubm90aWZpZXJdKQorCisgICAgICAgIHNlbGYuYmFzZWNvbmZpZ192YWxpZCA9IFRydWUKKyAgICAgICAgc2VsZi5wYXJzZWNhY2hlX3ZhbGlkID0gRmFsc2UKKworICAgICAgICAjIFRha2UgYSBsb2NrIHNvIG9ubHkgb25lIGNvcHkgb2YgYml0YmFrZSBjYW4gcnVuIGFnYWluc3QgYSBnaXZlbiBidWlsZAorICAgICAgICAjIGRpcmVjdG9yeSBhdCBhIHRpbWUKKyAgICAgICAgaWYgbm90IHNlbGYubG9ja0JpdGJha2UoKToKKyAgICAgICAgICAgIGJiLmZhdGFsKCJPbmx5IG9uZSBjb3B5IG9mIGJpdGJha2Ugc2hvdWxkIGJlIHJ1biBhZ2FpbnN0IGEgYnVpbGQgZGlyZWN0b3J5IikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5sb2NrLnNlZWsoMCkKKyAgICAgICAgICAgIHNlbGYubG9jay50cnVuY2F0ZSgpCisgICAgICAgICAgICBpZiBsZW4oY29uZmlndXJhdGlvbi5pbnRlcmZhY2UpID49IDI6CisgICAgICAgICAgICAgICAgc2VsZi5sb2NrLndyaXRlKCIlczolc1xuIiAlIChjb25maWd1cmF0aW9uLmludGVyZmFjZVswXSwgY29uZmlndXJhdGlvbi5pbnRlcmZhY2VbMV0pKTsKKyAgICAgICAgICAgIHNlbGYubG9jay5mbHVzaCgpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICAjIFRPU1RPUCBtdXN0IG5vdCBiZSBzZXQgb3Igb3VyIGNoaWxkcmVuIHdpbGwgaGFuZyB3aGVuIHRoZXkgb3V0cHV0CisgICAgICAgIGZkID0gc3lzLnN0ZG91dC5maWxlbm8oKQorICAgICAgICBpZiBvcy5pc2F0dHkoZmQpOgorICAgICAgICAgICAgaW1wb3J0IHRlcm1pb3MKKyAgICAgICAgICAgIHRjYXR0ciA9IHRlcm1pb3MudGNnZXRhdHRyKGZkKQorICAgICAgICAgICAgaWYgdGNhdHRyWzNdICYgdGVybWlvcy5UT1NUT1A6CisgICAgICAgICAgICAgICAgYnVpbGRsb2cuaW5mbygiVGhlIHRlcm1pbmFsIGhhZCB0aGUgVE9TVE9QIGJpdCBzZXQsIGNsZWFyaW5nLi4uIikKKyAgICAgICAgICAgICAgICB0Y2F0dHJbM10gPSB0Y2F0dHJbM10gJiB+dGVybWlvcy5UT1NUT1AKKyAgICAgICAgICAgICAgICB0ZXJtaW9zLnRjc2V0YXR0cihmZCwgdGVybWlvcy5UQ1NBTk9XLCB0Y2F0dHIpCisKKyAgICAgICAgc2VsZi5jb21tYW5kID0gYmIuY29tbWFuZC5Db21tYW5kKHNlbGYpCisgICAgICAgIHNlbGYuc3RhdGUgPSBzdGF0ZS5pbml0aWFsCisKKyAgICAgICAgc2VsZi5wYXJzZXIgPSBOb25lCisKKyAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHVEVSTSwgc2VsZi5zaWd0ZXJtX2V4Y2VwdGlvbikKKyAgICAgICAgIyBMZXQgU0lHSFVQIGV4aXQgYXMgU0lHVEVSTQorICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdIVVAsIHNlbGYuc2lndGVybV9leGNlcHRpb24pCisKKyAgICBkZWYgY29uZmlnX25vdGlmaWNhdGlvbnMoc2VsZiwgZXZlbnQpOgorICAgICAgICBpZiBub3QgZXZlbnQucGF0aG5hbWUgaW4gc2VsZi5jb25maWd3YXRjaGVyLmJid2F0Y2hlZGZpbGVzOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIG5vdCBldmVudC5wYXRoIGluIHNlbGYuaW5vdGlmeV9tb2RpZmllZF9maWxlczoKKyAgICAgICAgICAgIHNlbGYuaW5vdGlmeV9tb2RpZmllZF9maWxlcy5hcHBlbmQoZXZlbnQucGF0aCkKKyAgICAgICAgc2VsZi5iYXNlY29uZmlnX3ZhbGlkID0gRmFsc2UKKworICAgIGRlZiBub3RpZmljYXRpb25zKHNlbGYsIGV2ZW50KToKKyAgICAgICAgaWYgbm90IGV2ZW50LnBhdGggaW4gc2VsZi5pbm90aWZ5X21vZGlmaWVkX2ZpbGVzOgorICAgICAgICAgICAgc2VsZi5pbm90aWZ5X21vZGlmaWVkX2ZpbGVzLmFwcGVuZChldmVudC5wYXRoKQorICAgICAgICBzZWxmLnBhcnNlY2FjaGVfdmFsaWQgPSBGYWxzZQorCisgICAgZGVmIGFkZF9maWxld2F0Y2goc2VsZiwgZGVwcywgd2F0Y2hlcj1Ob25lKToKKyAgICAgICAgaWYgbm90IHdhdGNoZXI6CisgICAgICAgICAgICB3YXRjaGVyID0gc2VsZi53YXRjaGVyCisgICAgICAgIGZvciBpIGluIGRlcHM6CisgICAgICAgICAgICB3YXRjaGVyLmJid2F0Y2hlZGZpbGVzLmFwcGVuZChpWzBdKQorICAgICAgICAgICAgZiA9IG9zLnBhdGguZGlybmFtZShpWzBdKQorICAgICAgICAgICAgaWYgZiBpbiB3YXRjaGVyLmJic2VlbjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgd2F0Y2hlci5iYnNlZW4uYXBwZW5kKGYpCisgICAgICAgICAgICB3YXRjaHRhcmdldCA9IE5vbmUKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgIyBXZSB0cnkgYW5kIGFkZCB3YXRjaGVzIGZvciBmaWxlcyB0aGF0IGRvbid0IGV4aXN0IGJ1dCBpZiB0aGV5IGRpZCwgd291bGQgaW5mbHVlbmNlCisgICAgICAgICAgICAgICAgIyB0aGUgcGFyc2VyLiBUaGUgcGFyZW50IGRpcmVjdG9yeSBvZiB0aGVzZSBmaWxlcyBtYXkgbm90IGV4aXN0LCBpbiB3aGljaCBjYXNlIHdlIG5lZWQgCisgICAgICAgICAgICAgICAgIyB0byB3YXRjaCBhbnkgcGFyZW50IHRoYXQgZG9lcyBleGlzdCBmb3IgY2hhbmdlcy4KKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHdhdGNoZXIuYWRkX3dhdGNoKGYsIHNlbGYud2F0Y2htYXNrLCBxdWlldD1GYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgd2F0Y2h0YXJnZXQ6CisgICAgICAgICAgICAgICAgICAgICAgICB3YXRjaGVyLmJid2F0Y2hlZGZpbGVzLmFwcGVuZCh3YXRjaHRhcmdldCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBleGNlcHQgcHlpbm90aWZ5LldhdGNoTWFuYWdlckVycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgICAgIGlmICdFTk9FTlQnIGluIHN0cihlKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNodGFyZ2V0ID0gZgorICAgICAgICAgICAgICAgICAgICAgICAgZiA9IG9zLnBhdGguZGlybmFtZShmKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZiBpbiB3YXRjaGVyLmJic2VlbjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2hlci5iYnNlZW4uYXBwZW5kKGYpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBpZiAnRU5PU1BDJyBpbiBzdHIoZSk6CisgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcmxvZy5lcnJvcigiTm8gc3BhY2UgbGVmdCBvbiBkZXZpY2Ugb3IgZXhjZWVkcyBmcy5pbm90aWZ5Lm1heF91c2VyX3dhdGNoZXM/IikKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVybG9nLmVycm9yKCJUbyBjaGVjayBtYXhfdXNlcl93YXRjaGVzOiBzeXNjdGwgLW4gZnMuaW5vdGlmeS5tYXhfdXNlcl93YXRjaGVzLiIpCisgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcmxvZy5lcnJvcigiVG8gbW9kaWZ5IG1heF91c2VyX3dhdGNoZXM6IHN5c2N0bCAtbiAtdyBmcy5pbm90aWZ5Lm1heF91c2VyX3dhdGNoZXM9PHZhbHVlPi4iKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJsb2cuZXJyb3IoIlJvb3QgcHJpdmlsZWdlIGlzIHJlcXVpcmVkIHRvIG1vZGlmeSBtYXhfdXNlcl93YXRjaGVzLiIpCisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICBkZWYgc2lndGVybV9leGNlcHRpb24oc2VsZiwgc2lnbnVtLCBzdGFja2ZyYW1lKToKKyAgICAgICAgaWYgc2lnbnVtID09IHNpZ25hbC5TSUdURVJNOgorICAgICAgICAgICAgYmIud2FybigiQ29va2VyIHJlY2lldmVkIFNJR1RFUk0sIHNodXR0aW5nIGRvd24uLi4iKQorICAgICAgICBlbGlmIHNpZ251bSA9PSBzaWduYWwuU0lHSFVQOgorICAgICAgICAgICAgYmIud2FybigiQ29va2VyIHJlY2lldmVkIFNJR0hVUCwgc2h1dHRpbmcgZG93bi4uLiIpCisgICAgICAgIHNlbGYuc3RhdGUgPSBzdGF0ZS5mb3JjZXNodXRkb3duCisKKyAgICBkZWYgc2V0RmVhdHVyZXMoc2VsZiwgZmVhdHVyZXMpOgorICAgICAgICAjIHdlIG9ubHkgYWNjZXB0IGEgbmV3IGZlYXR1cmUgc2V0IGlmIHdlJ3JlIGluIHN0YXRlIGluaXRpYWwsIHNvIHdlIGNhbiByZXNldCB3aXRob3V0IHByb2JsZW1zCisgICAgICAgIGlmIG5vdCBzZWxmLnN0YXRlIGluIFtzdGF0ZS5pbml0aWFsLCBzdGF0ZS5zaHV0ZG93biwgc3RhdGUuZm9yY2VzaHV0ZG93biwgc3RhdGUuc3RvcHBlZCwgc3RhdGUuZXJyb3JdOgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJJbGxlZ2FsIHN0YXRlIGZvciBmZWF0dXJlIHNldCBjaGFuZ2UiKQorICAgICAgICBvcmlnaW5hbF9mZWF0dXJlc2V0ID0gbGlzdChzZWxmLmZlYXR1cmVzZXQpCisgICAgICAgIGZvciBmZWF0dXJlIGluIGZlYXR1cmVzOgorICAgICAgICAgICAgc2VsZi5mZWF0dXJlc2V0LnNldEZlYXR1cmUoZmVhdHVyZSkKKyAgICAgICAgYmIuZGVidWcoMSwgIkZlYXR1cmVzIHNldCAlcyAod2FzICVzKSIgJSAob3JpZ2luYWxfZmVhdHVyZXNldCwgbGlzdChzZWxmLmZlYXR1cmVzZXQpKSkKKyAgICAgICAgaWYgKG9yaWdpbmFsX2ZlYXR1cmVzZXQgIT0gbGlzdChzZWxmLmZlYXR1cmVzZXQpKSBhbmQgc2VsZi5zdGF0ZSAhPSBzdGF0ZS5lcnJvcjoKKyAgICAgICAgICAgIHNlbGYucmVzZXQoKQorCisgICAgZGVmIGluaXRDb25maWd1cmF0aW9uRGF0YShzZWxmKToKKworICAgICAgICBzZWxmLnN0YXRlID0gc3RhdGUuaW5pdGlhbAorICAgICAgICBzZWxmLmNhY2hlc19hcnJheSA9IFtdCisKKyAgICAgICAgaWYgQ29va2VyRmVhdHVyZXMuQkFTRURBVEFTVE9SRV9UUkFDS0lORyBpbiBzZWxmLmZlYXR1cmVzZXQ6CisgICAgICAgICAgICBzZWxmLmVuYWJsZURhdGFUcmFja2luZygpCisKKyAgICAgICAgYWxsX2V4dHJhX2NhY2hlX25hbWVzID0gW10KKyAgICAgICAgIyBXZSBoYXJkY29kZSBhbGwga25vd24gY2FjaGUgdHlwZXMgaW4gYSBzaW5nbGUgcGxhY2UsIGhlcmUuCisgICAgICAgIGlmIENvb2tlckZlYXR1cmVzLkhPQl9FWFRSQV9DQUNIRVMgaW4gc2VsZi5mZWF0dXJlc2V0OgorICAgICAgICAgICAgYWxsX2V4dHJhX2NhY2hlX25hbWVzLmFwcGVuZCgiYmIuY2FjaGVfZXh0cmE6SG9iUmVjaXBlSW5mbyIpCisKKyAgICAgICAgY2FjaGVzX25hbWVfYXJyYXkgPSBbJ2JiLmNhY2hlOkNvcmVSZWNpcGVJbmZvJ10gKyBhbGxfZXh0cmFfY2FjaGVfbmFtZXMKKworICAgICAgICAjIEF0IGxlYXN0IENvcmVSZWNpcGVJbmZvIHdpbGwgYmUgbG9hZGVkLCBzbyBjYWNoZXNfYXJyYXkgd2lsbCBuZXZlciBiZSBlbXB0eSEKKyAgICAgICAgIyBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludCwgbm8gZnVydGhlciBjaGVjayBuZWVkZWQhCisgICAgICAgIGZvciB2YXIgaW4gY2FjaGVzX25hbWVfYXJyYXk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbW9kdWxlX25hbWUsIGNhY2hlX25hbWUgPSB2YXIuc3BsaXQoJzonKQorICAgICAgICAgICAgICAgIG1vZHVsZSA9IF9faW1wb3J0X18obW9kdWxlX25hbWUsIGZyb21saXN0PShjYWNoZV9uYW1lLCkpCisgICAgICAgICAgICAgICAgc2VsZi5jYWNoZXNfYXJyYXkuYXBwZW5kKGdldGF0dHIobW9kdWxlLCBjYWNoZV9uYW1lKSkKKyAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvciBhcyBleGM6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmNyaXRpY2FsKCJVbmFibGUgdG8gaW1wb3J0IGV4dHJhIFJlY2lwZUluZm8gJyVzJyBmcm9tICclcyc6ICVzIiAlIChjYWNoZV9uYW1lLCBtb2R1bGVfbmFtZSwgZXhjKSkKKyAgICAgICAgICAgICAgICBzeXMuZXhpdCgiRkFUQUw6IEZhaWxlZCB0byBpbXBvcnQgZXh0cmEgY2FjaGUgY2xhc3MgJyVzJy4iICUgY2FjaGVfbmFtZSkKKworICAgICAgICBzZWxmLmRhdGFidWlsZGVyID0gYmIuY29va2VyZGF0YS5Db29rZXJEYXRhQnVpbGRlcihzZWxmLmNvbmZpZ3VyYXRpb24sIEZhbHNlKQorICAgICAgICBzZWxmLmRhdGFidWlsZGVyLnBhcnNlQmFzZUNvbmZpZ3VyYXRpb24oKQorICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLmRhdGFidWlsZGVyLmRhdGEKKyAgICAgICAgc2VsZi5kYXRhX2hhc2ggPSBzZWxmLmRhdGFidWlsZGVyLmRhdGFfaGFzaAorCisKKyAgICAgICAgIyB3ZSBsb2cgYWxsIGV2ZW50cyB0byBhIGZpbGUgaWYgc28gZGlyZWN0ZWQKKyAgICAgICAgaWYgc2VsZi5jb25maWd1cmF0aW9uLndyaXRlZXZlbnRsb2c6CisgICAgICAgICAgICBpbXBvcnQganNvbiwgcGlja2xlCisgICAgICAgICAgICBERUZBVUxUX0VWRU5URklMRSA9IHNlbGYuY29uZmlndXJhdGlvbi53cml0ZWV2ZW50bG9nCisgICAgICAgICAgICBjbGFzcyBFdmVudExvZ1dyaXRlSGFuZGxlcigpOgorCisgICAgICAgICAgICAgICAgY2xhc3MgRXZlbnRXcml0ZXIoKToKKyAgICAgICAgICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvb2tlcik6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVfaW5pdGVkID0gTm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb29rZXIgPSBjb29rZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfcXVldWUgPSBbXQorCisgICAgICAgICAgICAgICAgICAgIGRlZiBpbml0X2ZpbGUoc2VsZik6CisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkZWxldGUgdGhlIG9sZCBsb2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5yZW1vdmUoREVGQVVMVF9FVkVOVEZJTEUpCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICAgICAgICAgICAgICAjIHdyaXRlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBkYXRhCisgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIG9wZW4oREVGQVVMVF9FVkVOVEZJTEUsICJ3IikgYXMgZjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCIlc1xuIiAlIGpzb24uZHVtcHMoeyAiYWxsdmFyaWFibGVzIiA6IHNlbGYuY29va2VyLmdldEFsbEtleXNXaXRoRmxhZ3MoWyJkb2MiLCAiZnVuYyJdKX0pKQorCisgICAgICAgICAgICAgICAgICAgIGRlZiB3cml0ZV9ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIG9wZW4oREVGQVVMVF9FVkVOVEZJTEUsICJhIikgYXMgZjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYud3JpdGUoIiVzXG4iICUganNvbi5kdW1wcyh7ImNsYXNzIjpldmVudC5fX21vZHVsZV9fICsgIi4iICsgZXZlbnQuX19jbGFzc19fLl9fbmFtZV9fLCAidmFycyI6anNvbi5kdW1wcyhwaWNrbGUuZHVtcHMoZXZlbnQpKSB9KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydCB0cmFjZWJhY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQoZSwgdHJhY2ViYWNrLmZvcm1hdF9leGMoZSkpCisKKworICAgICAgICAgICAgICAgICAgICBkZWYgc2VuZChzZWxmLCBldmVudCk6CisgICAgICAgICAgICAgICAgICAgICAgICBldmVudF9jbGFzcyA9IGV2ZW50Ll9fbW9kdWxlX18gKyAiLiIgKyBldmVudC5fX2NsYXNzX18uX19uYW1lX18KKworICAgICAgICAgICAgICAgICAgICAgICAgIyBpbml0IG9uIGJiLmV2ZW50LkJ1aWxkU3RhcnRlZAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5maWxlX2luaXRlZCBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICBldmVudF9jbGFzcyA9PSAiYmIuZXZlbnQuQnVpbGRTdGFydGVkIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbml0X2ZpbGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVfaW5pdGVkID0gVHJ1ZQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd3JpdGUgcGVuZGluZyBldmVudHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGUgaW4gc2VsZi5ldmVudF9xdWV1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfZXZlbnQoZSkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFsc28gd3JpdGUgdGhlIGN1cnJlbnQgZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9ldmVudChldmVudCkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcXVldWUgYWxsIGV2ZW50cyB1bnRpbCB0aGUgZmlsZSBpcyBpbml0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ldmVudF9xdWV1ZS5hcHBlbmQoZXZlbnQpCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3ZSBoYXZlIHRoZSBmaWxlLCBqdXN0IHdyaXRlIHRoZSBldmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfZXZlbnQoZXZlbnQpCisKKyAgICAgICAgICAgICAgICAjIHNldCBvdXIgaGFuZGxlcidzIGV2ZW50IHByb2Nlc3NvcgorICAgICAgICAgICAgICAgIGV2ZW50ID0gRXZlbnRXcml0ZXIoc2VsZikgICAgICAgIyBzZWxmIGlzIHRoZSBjb29rZXIgaGVyZQorCisKKyAgICAgICAgICAgICMgc2V0IHVwIGNvb2tlciBmZWF0dXJlcyBmb3IgdGhpcyBtb2NrIFVJIGhhbmRsZXIKKworICAgICAgICAgICAgIyB3ZSBuZWVkIHRvIHdyaXRlIHRoZSBkZXBlbmRlbmN5IHRyZWUgaW4gdGhlIGxvZworICAgICAgICAgICAgc2VsZi5mZWF0dXJlc2V0LnNldEZlYXR1cmUoQ29va2VyRmVhdHVyZXMuU0VORF9ERVBFTkRTX1RSRUUpCisgICAgICAgICAgICAjIHJlZ2lzdGVyIHRoZSBsb2cgZmlsZSB3cml0ZXIgYXMgVUkgSGFuZGxlcgorICAgICAgICAgICAgYmIuZXZlbnQucmVnaXN0ZXJfVUlIaGFuZGxlcihFdmVudExvZ1dyaXRlSGFuZGxlcigpKQorCisKKyAgICAgICAgIworICAgICAgICAjIENvcHkgb2YgdGhlIGRhdGEgc3RvcmUgd2hpY2ggaGFzIGJlZW4gZXhwYW5kZWQuCisgICAgICAgICMgVXNlZCBmb3IgZmlyaW5nIGV2ZW50cyBhbmQgYWNjZXNzaW5nIHZhcmlhYmxlcyB3aGVyZSBleHBhbnNpb24gbmVlZHMgdG8gYmUgYWNjb3VudGVkIGZvcgorICAgICAgICAjCisgICAgICAgIHNlbGYuZXhwYW5kZWRfZGF0YSA9IGJiLmRhdGEuY3JlYXRlQ29weShzZWxmLmRhdGEpCisgICAgICAgIGJiLmRhdGEudXBkYXRlX2RhdGEoc2VsZi5leHBhbmRlZF9kYXRhKQorICAgICAgICBiYi5wYXJzZS5pbml0X3BhcnNlcihzZWxmLmV4cGFuZGVkX2RhdGEpCisKKyAgICAgICAgaWYgQ29va2VyRmVhdHVyZXMuQkFTRURBVEFTVE9SRV9UUkFDS0lORyBpbiBzZWxmLmZlYXR1cmVzZXQ6CisgICAgICAgICAgICBzZWxmLmRpc2FibGVEYXRhVHJhY2tpbmcoKQorCisgICAgICAgIHNlbGYuZGF0YS5yZW5hbWVWYXIoIl9fZGVwZW5kcyIsICJfX2Jhc2VfZGVwZW5kcyIpCisgICAgICAgIHNlbGYuYWRkX2ZpbGV3YXRjaChzZWxmLmRhdGEuZ2V0VmFyKCJfX2Jhc2VfZGVwZW5kcyIsIEZhbHNlKSwgc2VsZi5jb25maWd3YXRjaGVyKQorCisKKyAgICBkZWYgZW5hYmxlRGF0YVRyYWNraW5nKHNlbGYpOgorICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24udHJhY2tpbmcgPSBUcnVlCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgImRhdGEiKToKKyAgICAgICAgICAgIHNlbGYuZGF0YS5lbmFibGVUcmFja2luZygpCisKKyAgICBkZWYgZGlzYWJsZURhdGFUcmFja2luZyhzZWxmKToKKyAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLnRyYWNraW5nID0gRmFsc2UKKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLCAiZGF0YSIpOgorICAgICAgICAgICAgc2VsZi5kYXRhLmRpc2FibGVUcmFja2luZygpCisKKyAgICBkZWYgbW9kaWZ5Q29uZmlndXJhdGlvblZhcihzZWxmLCB2YXIsIHZhbCwgZGVmYXVsdF9maWxlLCBvcCk6CisgICAgICAgIGlmIG9wID09ICJhcHBlbmQiOgorICAgICAgICAgICAgc2VsZi5hcHBlbmRDb25maWd1cmF0aW9uVmFyKHZhciwgdmFsLCBkZWZhdWx0X2ZpbGUpCisgICAgICAgIGVsaWYgb3AgPT0gInNldCI6CisgICAgICAgICAgICBzZWxmLnNhdmVDb25maWd1cmF0aW9uVmFyKHZhciwgdmFsLCBkZWZhdWx0X2ZpbGUsICI9IikKKyAgICAgICAgZWxpZiBvcCA9PSAiZWFybHlBc3NpZ24iOgorICAgICAgICAgICAgc2VsZi5zYXZlQ29uZmlndXJhdGlvblZhcih2YXIsIHZhbCwgZGVmYXVsdF9maWxlLCAiPz0iKQorCisKKyAgICBkZWYgYXBwZW5kQ29uZmlndXJhdGlvblZhcihzZWxmLCB2YXIsIHZhbCwgZGVmYXVsdF9maWxlKToKKyAgICAgICAgI2FkZCBhcHBlbmQgdmFyIG9wZXJhdGlvbiB0byB0aGUgZW5kIG9mIGRlZmF1bHRfZmlsZQorICAgICAgICBkZWZhdWx0X2ZpbGUgPSBiYi5jb29rZXJkYXRhLmZpbmRDb25maWdGaWxlKGRlZmF1bHRfZmlsZSwgc2VsZi5kYXRhKQorCisgICAgICAgIHRvdGFsID0gIiNhZGRlZCBieSBob2IiCisgICAgICAgIHRvdGFsICs9ICJcbiVzICs9IFwiJXNcIlxuIiAlICh2YXIsIHZhbCkKKworICAgICAgICB3aXRoIG9wZW4oZGVmYXVsdF9maWxlLCAnYScpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKHRvdGFsKQorCisgICAgICAgICNhZGQgdG8gaGlzdG9yeQorICAgICAgICBsb2dpbmZvID0geyJvcCI6ImFwcGVuZCIsICJmaWxlIjpkZWZhdWx0X2ZpbGUsICJsaW5lIjp0b3RhbC5jb3VudCgiXG4iKX0KKyAgICAgICAgc2VsZi5kYXRhLmFwcGVuZFZhcih2YXIsIHZhbCwgKipsb2dpbmZvKQorCisgICAgZGVmIHNhdmVDb25maWd1cmF0aW9uVmFyKHNlbGYsIHZhciwgdmFsLCBkZWZhdWx0X2ZpbGUsIG9wKToKKworICAgICAgICByZXBsYWNlZCA9IEZhbHNlCisgICAgICAgICNkbyBub3Qgc2F2ZSBpZiBub3RoaW5nIGNoYW5nZWQKKyAgICAgICAgaWYgc3RyKHZhbCkgPT0gc2VsZi5kYXRhLmdldFZhcih2YXIsIEZhbHNlKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGNvbmZfZmlsZXMgPSBzZWxmLmRhdGEudmFyaGlzdG9yeS5nZXRfdmFyaWFibGVfZmlsZXModmFyKQorCisgICAgICAgICNmb3JtYXQgdGhlIHZhbHVlIHdoZW4gaXQgaXMgYSBsaXN0CisgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsLCBsaXN0KToKKyAgICAgICAgICAgIGxpc3R2YWwgPSAiIgorICAgICAgICAgICAgZm9yIHZhbHVlIGluIHZhbDoKKyAgICAgICAgICAgICAgICBsaXN0dmFsICs9ICIlcyAgICIgJSB2YWx1ZQorICAgICAgICAgICAgdmFsID0gbGlzdHZhbAorCisgICAgICAgIHRvcGRpciA9IHNlbGYuZGF0YS5nZXRWYXIoIlRPUERJUiIsIEZhbHNlKQorCisgICAgICAgICNjb21tZW50IG9yIHJlcGxhY2Ugb3BlcmF0aW9ucyBtYWRlIG9uIHZhcgorICAgICAgICBmb3IgY29uZl9maWxlIGluIGNvbmZfZmlsZXM6CisgICAgICAgICAgICBpZiB0b3BkaXIgaW4gY29uZl9maWxlOgorICAgICAgICAgICAgICAgIHdpdGggb3Blbihjb25mX2ZpbGUsICdyJykgYXMgZjoKKyAgICAgICAgICAgICAgICAgICAgY29udGVudHMgPSBmLnJlYWRsaW5lcygpCisKKyAgICAgICAgICAgICAgICBsaW5lcyA9IHNlbGYuZGF0YS52YXJoaXN0b3J5LmdldF92YXJpYWJsZV9saW5lcyh2YXIsIGNvbmZfZmlsZSkKKyAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICAgICAgICAgICAgICAgICAgdG90YWwgPSAiIgorICAgICAgICAgICAgICAgICAgICBpID0gMAorICAgICAgICAgICAgICAgICAgICBmb3IgYyBpbiBjb250ZW50czoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IGMKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBpICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgaT09aW50KGxpbmUpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9pbmRleCA9IGxlbih0b3RhbCkKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggPSB0b3RhbC5yZmluZCh2YXIsIDAsIGVuZF9pbmRleCkKKworICAgICAgICAgICAgICAgICAgICBiZWdpbl9saW5lID0gdG90YWwuY291bnQoIlxuIiwwLGluZGV4KQorICAgICAgICAgICAgICAgICAgICBlbmRfbGluZSA9IGludChsaW5lKQorCisgICAgICAgICAgICAgICAgICAgICNjaGVjayBpZiB0aGUgdmFyaWFibGUgd2FzIHNhdmVkIGJlZm9yZSBpbiB0aGUgc2FtZSB3YXkKKyAgICAgICAgICAgICAgICAgICAgI2lmIHRydWUgaXQgcmVwbGFjZSB0aGUgcGxhY2Ugd2hlcmUgdGhlIHZhcmlhYmxlIHdhcyBkZWNsYXJlZAorICAgICAgICAgICAgICAgICAgICAjZWxzZSBpdCBjb21tZW50cyBpdAorICAgICAgICAgICAgICAgICAgICBpZiBjb250ZW50c1tiZWdpbl9saW5lLTFdPT0gIiNhZGRlZCBieSBob2JcbiI6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50c1tiZWdpbl9saW5lXSA9ICIlcyAlcyBcIiVzXCJcbiIgJSAodmFyLCBvcCwgdmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaWkgaW4gcmFuZ2UoYmVnaW5fbGluZSwgZW5kX2xpbmUpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzW2lpXSA9ICIjIiArIGNvbnRlbnRzW2lpXQorCisgICAgICAgICAgICAgICAgd2l0aCBvcGVuKGNvbmZfZmlsZSwgJ3cnKSBhcyBmOgorICAgICAgICAgICAgICAgICAgICBmLndyaXRlbGluZXMoY29udGVudHMpCisKKyAgICAgICAgaWYgcmVwbGFjZWQgPT0gRmFsc2U6CisgICAgICAgICAgICAjcmVtb3ZlIHZhciBmcm9tIGhpc3RvcnkKKyAgICAgICAgICAgIHNlbGYuZGF0YS52YXJoaXN0b3J5LmRlbF92YXJfaGlzdG9yeSh2YXIpCisKKyAgICAgICAgICAgICNhZGQgdmFyIHRvIHRoZSBlbmQgb2YgZGVmYXVsdF9maWxlCisgICAgICAgICAgICBkZWZhdWx0X2ZpbGUgPSBiYi5jb29rZXJkYXRhLmZpbmRDb25maWdGaWxlKGRlZmF1bHRfZmlsZSwgc2VsZi5kYXRhKQorCisgICAgICAgICAgICAjYWRkIHRoZSB2YXJpYWJsZSBvbiBhIHNpbmdsZSBsaW5lLCB0byBiZSBlYXN5IHRvIHJlcGxhY2UgdGhlIHNlY29uZCB0aW1lCisgICAgICAgICAgICB0b3RhbCA9ICJcbiNhZGRlZCBieSBob2IiCisgICAgICAgICAgICB0b3RhbCArPSAiXG4lcyAlcyBcIiVzXCJcbiIgJSAodmFyLCBvcCwgdmFsKQorCisgICAgICAgICAgICB3aXRoIG9wZW4oZGVmYXVsdF9maWxlLCAnYScpIGFzIGY6CisgICAgICAgICAgICAgICAgZi53cml0ZSh0b3RhbCkKKworICAgICAgICAgICAgI2FkZCB0byBoaXN0b3J5CisgICAgICAgICAgICBsb2dpbmZvID0geyJvcCI6InNldCIsICJmaWxlIjpkZWZhdWx0X2ZpbGUsICJsaW5lIjp0b3RhbC5jb3VudCgiXG4iKX0KKyAgICAgICAgICAgIHNlbGYuZGF0YS5zZXRWYXIodmFyLCB2YWwsICoqbG9naW5mbykKKworICAgIGRlZiByZW1vdmVDb25maWd1cmF0aW9uVmFyKHNlbGYsIHZhcik6CisgICAgICAgIGNvbmZfZmlsZXMgPSBzZWxmLmRhdGEudmFyaGlzdG9yeS5nZXRfdmFyaWFibGVfZmlsZXModmFyKQorICAgICAgICB0b3BkaXIgPSBzZWxmLmRhdGEuZ2V0VmFyKCJUT1BESVIiLCBGYWxzZSkKKworICAgICAgICBmb3IgY29uZl9maWxlIGluIGNvbmZfZmlsZXM6CisgICAgICAgICAgICBpZiB0b3BkaXIgaW4gY29uZl9maWxlOgorICAgICAgICAgICAgICAgIHdpdGggb3Blbihjb25mX2ZpbGUsICdyJykgYXMgZjoKKyAgICAgICAgICAgICAgICAgICAgY29udGVudHMgPSBmLnJlYWRsaW5lcygpCisKKyAgICAgICAgICAgICAgICBsaW5lcyA9IHNlbGYuZGF0YS52YXJoaXN0b3J5LmdldF92YXJpYWJsZV9saW5lcyh2YXIsIGNvbmZfZmlsZSkKKyAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICAgICAgICAgICAgICAgICAgdG90YWwgPSAiIgorICAgICAgICAgICAgICAgICAgICBpID0gMAorICAgICAgICAgICAgICAgICAgICBmb3IgYyBpbiBjb250ZW50czoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IGMKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBpICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgaT09aW50KGxpbmUpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9pbmRleCA9IGxlbih0b3RhbCkKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggPSB0b3RhbC5yZmluZCh2YXIsIDAsIGVuZF9pbmRleCkKKworICAgICAgICAgICAgICAgICAgICBiZWdpbl9saW5lID0gdG90YWwuY291bnQoIlxuIiwwLGluZGV4KQorCisgICAgICAgICAgICAgICAgICAgICNjaGVjayBpZiB0aGUgdmFyaWFibGUgd2FzIHNhdmVkIGJlZm9yZSBpbiB0aGUgc2FtZSB3YXkKKyAgICAgICAgICAgICAgICAgICAgaWYgY29udGVudHNbYmVnaW5fbGluZS0xXT09ICIjYWRkZWQgYnkgaG9iXG4iOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHNbYmVnaW5fbGluZS0xXSA9IGNvbnRlbnRzW2JlZ2luX2xpbmVdID0gIlxuIgorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHNbYmVnaW5fbGluZV0gPSAiXG4iCisgICAgICAgICAgICAgICAgICAgICNyZW1vdmUgdmFyIGZyb20gaGlzdG9yeQorICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEudmFyaGlzdG9yeS5kZWxfdmFyX2hpc3RvcnkodmFyLCBjb25mX2ZpbGUsIGxpbmUpCisgICAgICAgICAgICAgICAgICAgICNyZW1vdmUgdmFyaWFibGUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhLmRlbFZhcih2YXIpCisKKyAgICAgICAgICAgICAgICB3aXRoIG9wZW4oY29uZl9maWxlLCAndycpIGFzIGY6CisgICAgICAgICAgICAgICAgICAgIGYud3JpdGVsaW5lcyhjb250ZW50cykKKworICAgIGRlZiBjcmVhdGVDb25maWdGaWxlKHNlbGYsIG5hbWUpOgorICAgICAgICBwYXRoID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgY29uZnBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgImNvbmYiLCBuYW1lKQorICAgICAgICBvcGVuKGNvbmZwYXRoLCAndycpLmNsb3NlKCkKKworICAgIGRlZiBwYXJzZUNvbmZpZ3VyYXRpb24oc2VsZik6CisgICAgICAgICMgU2V0IGxvZyBmaWxlIHZlcmJvc2l0eQorICAgICAgICB2ZXJib3NlbG9ncyA9IGJiLnV0aWxzLnRvX2Jvb2xlYW4oc2VsZi5kYXRhLmdldFZhcigiQkJfVkVSQk9TRV9MT0dTIiwgRmFsc2UpKQorICAgICAgICBpZiB2ZXJib3NlbG9nczoKKyAgICAgICAgICAgIGJiLm1zZy5sb2dnZXJWZXJib3NlTG9ncyA9IFRydWUKKworICAgICAgICAjIENoYW5nZSBuaWNlIGxldmVsIGlmIHdlJ3JlIGFza2VkIHRvCisgICAgICAgIG5pY2UgPSBzZWxmLmRhdGEuZ2V0VmFyKCJCQl9OSUNFX0xFVkVMIiwgVHJ1ZSkKKyAgICAgICAgaWYgbmljZToKKyAgICAgICAgICAgIGN1cm5pY2UgPSBvcy5uaWNlKDApCisgICAgICAgICAgICBuaWNlID0gaW50KG5pY2UpIC0gY3VybmljZQorICAgICAgICAgICAgYnVpbGRsb2cudmVyYm9zZSgiUmVuaWNlIHRvICVzICIgJSBvcy5uaWNlKG5pY2UpKQorCisgICAgICAgIGlmIHNlbGYucmVjaXBlY2FjaGU6CisgICAgICAgICAgICBkZWwgc2VsZi5yZWNpcGVjYWNoZQorICAgICAgICBzZWxmLnJlY2lwZWNhY2hlID0gYmIuY2FjaGUuQ2FjaGVEYXRhKHNlbGYuY2FjaGVzX2FycmF5KQorCisgICAgICAgIHNlbGYuaGFuZGxlQ29sbGVjdGlvbnMoIHNlbGYuZGF0YS5nZXRWYXIoIkJCRklMRV9DT0xMRUNUSU9OUyIsIFRydWUpICkKKworICAgIGRlZiB1cGRhdGVDb25maWdPcHRzKHNlbGYsIG9wdGlvbnMsIGVudmlyb25tZW50KToKKyAgICAgICAgY2xlYW4gPSBUcnVlCisgICAgICAgIGZvciBvIGluIG9wdGlvbnM6CisgICAgICAgICAgICBpZiBvIGluIFsncHJlZmlsZScsICdwb3N0ZmlsZSddOgorICAgICAgICAgICAgICAgIGNsZWFuID0gRmFsc2UKKyAgICAgICAgICAgIHNldGF0dHIoc2VsZi5jb25maWd1cmF0aW9uLCBvLCBvcHRpb25zW29dKQorICAgICAgICBmb3IgayBpbiBiYi51dGlscy5hcHByb3ZlZF92YXJpYWJsZXMoKToKKyAgICAgICAgICAgIGlmIGsgaW4gZW52aXJvbm1lbnQgYW5kIGsgbm90IGluIHNlbGYuY29uZmlndXJhdGlvbi5lbnY6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJVcGRhdGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSAlcyB0byAlcyIgJSAoaywgZW52aXJvbm1lbnRba10pKQorICAgICAgICAgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi5lbnZba10gPSBlbnZpcm9ubWVudFtrXQorICAgICAgICAgICAgICAgIGNsZWFuID0gRmFsc2UKKyAgICAgICAgICAgIGlmIGsgaW4gc2VsZi5jb25maWd1cmF0aW9uLmVudiBhbmQgayBub3QgaW4gZW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJVcGRhdGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSAlcyAoZGVsZXRlZCkiICUgKGspKQorICAgICAgICAgICAgICAgIGRlbCBzZWxmLmNvbmZpZ3VyYXRpb24uZW52W2tdCisgICAgICAgICAgICAgICAgY2xlYW4gPSBGYWxzZQorICAgICAgICAgICAgaWYgayBub3QgaW4gc2VsZi5jb25maWd1cmF0aW9uLmVudiBhbmQgayBub3QgaW4gZW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBlbnZpcm9ubWVudFtrXSAhPSBzZWxmLmNvbmZpZ3VyYXRpb24uZW52W2tdOgorICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiVXBkYXRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUgJXMgdG8gJXMiICUgKGssIGVudmlyb25tZW50W2tdKSkKKyAgICAgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uZW52W2tdID0gZW52aXJvbm1lbnRba10KKyAgICAgICAgICAgICAgICBjbGVhbiA9IEZhbHNlCisgICAgICAgIGlmIG5vdCBjbGVhbjoKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiQmFzZSBlbnZpcm9ubWVudCBjaGFuZ2UsIHRyaWdnZXJpbmcgcmVwYXJzZSIpCisgICAgICAgICAgICBzZWxmLmJhc2Vjb25maWdfdmFsaWQgPSBGYWxzZSAgICAgICAgCisgICAgICAgICAgICBzZWxmLnJlc2V0KCkKKworICAgIGRlZiBydW5Db21tYW5kcyhzZWxmLCBzZXJ2ZXIsIGRhdGEsIGFib3J0KToKKyAgICAgICAgIiIiCisgICAgICAgIFJ1biBhbnkgcXVldWVkIGFzeW5jaHJvbm91cyBjb21tYW5kCisgICAgICAgIFRoaXMgaXMgZG9uZSBieSB0aGUgaWRsZSBoYW5kbGVyIHNvIGl0IHJ1bnMgaW4gdHJ1ZSBjb250ZXh0IHJhdGhlciB0aGFuCisgICAgICAgIHRpZWQgdG8gYW55IFVJLgorICAgICAgICAiIiIKKworICAgICAgICByZXR1cm4gc2VsZi5jb21tYW5kLnJ1bkFzeW5jQ29tbWFuZCgpCisKKyAgICBkZWYgc2hvd1ZlcnNpb25zKHNlbGYpOgorCisgICAgICAgIHBrZ19wbiA9IHNlbGYucmVjaXBlY2FjaGUucGtnX3BuCisgICAgICAgIChsYXRlc3RfdmVyc2lvbnMsIHByZWZlcnJlZF92ZXJzaW9ucykgPSBiYi5wcm92aWRlcnMuZmluZFByb3ZpZGVycyhzZWxmLmRhdGEsIHNlbGYucmVjaXBlY2FjaGUsIHBrZ19wbikKKworICAgICAgICBsb2dnZXIucGxhaW4oIiUtMzVzICUyNXMgJTI1cyIsICJSZWNpcGUgTmFtZSIsICJMYXRlc3QgVmVyc2lvbiIsICJQcmVmZXJyZWQgVmVyc2lvbiIpCisgICAgICAgIGxvZ2dlci5wbGFpbigiJS0zNXMgJTI1cyAlMjVzXG4iLCAiPT09PT09PT09PT0iLCAiPT09PT09PT09PT09PT0iLCAiPT09PT09PT09PT09PT09PT0iKQorCisgICAgICAgIGZvciBwIGluIHNvcnRlZChwa2dfcG4pOgorICAgICAgICAgICAgcHJlZiA9IHByZWZlcnJlZF92ZXJzaW9uc1twXQorICAgICAgICAgICAgbGF0ZXN0ID0gbGF0ZXN0X3ZlcnNpb25zW3BdCisKKyAgICAgICAgICAgIHByZWZzdHIgPSBwcmVmWzBdWzBdICsgIjoiICsgcHJlZlswXVsxXSArICctJyArIHByZWZbMF1bMl0KKyAgICAgICAgICAgIGxhdGVzdHN0ciA9IGxhdGVzdFswXVswXSArICI6IiArIGxhdGVzdFswXVsxXSArICItIiArIGxhdGVzdFswXVsyXQorCisgICAgICAgICAgICBpZiBwcmVmID09IGxhdGVzdDoKKyAgICAgICAgICAgICAgICBwcmVmc3RyID0gIiIKKworICAgICAgICAgICAgbG9nZ2VyLnBsYWluKCIlLTM1cyAlMjVzICUyNXMiLCBwLCBsYXRlc3RzdHIsIHByZWZzdHIpCisKKyAgICBkZWYgc2hvd0Vudmlyb25tZW50KHNlbGYsIGJ1aWxkZmlsZT1Ob25lLCBwa2dzX3RvX2J1aWxkPU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgU2hvdyB0aGUgb3V0ZXIgb3IgcGVyLXJlY2lwZSBlbnZpcm9ubWVudAorICAgICAgICAiIiIKKyAgICAgICAgZm4gPSBOb25lCisgICAgICAgIGVudmRhdGEgPSBOb25lCisgICAgICAgIGlmIG5vdCBwa2dzX3RvX2J1aWxkOgorICAgICAgICAgICAgcGtnc190b19idWlsZCA9IFtdCisKKyAgICAgICAgaWYgYnVpbGRmaWxlOgorICAgICAgICAgICAgIyBQYXJzZSB0aGUgY29uZmlndXJhdGlvbiBoZXJlLiBXZSBuZWVkIHRvIGRvIGl0IGV4cGxpY2l0bHkgaGVyZSBzaW5jZQorICAgICAgICAgICAgIyB0aGlzIHNob3dFbnZpcm9ubWVudCgpIGNvZGUgcGF0aCBkb2Vzbid0IHVzZSB0aGUgY2FjaGUKKyAgICAgICAgICAgIHNlbGYucGFyc2VDb25maWd1cmF0aW9uKCkKKworICAgICAgICAgICAgZm4sIGNscyA9IGJiLmNhY2hlLkNhY2hlLnZpcnR1YWxmbjJyZWFsZm4oYnVpbGRmaWxlKQorICAgICAgICAgICAgZm4gPSBzZWxmLm1hdGNoRmlsZShmbikKKyAgICAgICAgICAgIGZuID0gYmIuY2FjaGUuQ2FjaGUucmVhbGZuMnZpcnR1YWwoZm4sIGNscykKKyAgICAgICAgZWxpZiBsZW4ocGtnc190b19idWlsZCkgPT0gMToKKyAgICAgICAgICAgIGlnbm9yZSA9IHNlbGYuZXhwYW5kZWRfZGF0YS5nZXRWYXIoIkFTU1VNRV9QUk9WSURFRCIsIFRydWUpIG9yICIiCisgICAgICAgICAgICBpZiBwa2dzX3RvX2J1aWxkWzBdIGluIHNldChpZ25vcmUuc3BsaXQoKSk6CisgICAgICAgICAgICAgICAgYmIuZmF0YWwoIiVzIGlzIGluIEFTU1VNRV9QUk9WSURFRCIgJSBwa2dzX3RvX2J1aWxkWzBdKQorCisgICAgICAgICAgICB0YXNrZGF0YSwgcnVubGlzdCwgcGtnc190b19idWlsZCA9IHNlbGYuYnVpbGRUYXNrRGF0YShwa2dzX3RvX2J1aWxkLCBOb25lLCBzZWxmLmNvbmZpZ3VyYXRpb24uYWJvcnQsIGFsbG93aW5jb21wbGV0ZT1UcnVlKQorCisgICAgICAgICAgICB0YXJnZXRpZCA9IHRhc2tkYXRhLmdldGJ1aWxkX2lkKHBrZ3NfdG9fYnVpbGRbMF0pCisgICAgICAgICAgICBmbmlkID0gdGFza2RhdGEuYnVpbGRfdGFyZ2V0c1t0YXJnZXRpZF1bMF0KKyAgICAgICAgICAgIGZuID0gdGFza2RhdGEuZm5faW5kZXhbZm5pZF0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGVudmRhdGEgPSBzZWxmLmRhdGEKKworICAgICAgICBpZiBmbjoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBlbnZkYXRhID0gYmIuY2FjaGUuQ2FjaGUubG9hZERhdGFGdWxsKGZuLCBzZWxmLmNvbGxlY3Rpb24uZ2V0X2ZpbGVfYXBwZW5kcyhmbiksIHNlbGYuZGF0YSkKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgICAgICBwYXJzZWxvZy5leGNlcHRpb24oIlVuYWJsZSB0byByZWFkICVzIiwgZm4pCisgICAgICAgICAgICAgICAgcmFpc2UKKworICAgICAgICAjIERpc3BsYXkgaGlzdG9yeQorICAgICAgICB3aXRoIGNsb3NpbmcoU3RyaW5nSU8oKSkgYXMgZW52OgorICAgICAgICAgICAgc2VsZi5kYXRhLmluY2hpc3RvcnkuZW1pdChlbnYpCisgICAgICAgICAgICBsb2dnZXIucGxhaW4oZW52LmdldHZhbHVlKCkpCisKKyAgICAgICAgIyBlbWl0IHZhcmlhYmxlcyBhbmQgc2hlbGwgZnVuY3Rpb25zCisgICAgICAgIGRhdGEudXBkYXRlX2RhdGEoZW52ZGF0YSkKKyAgICAgICAgd2l0aCBjbG9zaW5nKFN0cmluZ0lPKCkpIGFzIGVudjoKKyAgICAgICAgICAgIGRhdGEuZW1pdF9lbnYoZW52LCBlbnZkYXRhLCBUcnVlKQorICAgICAgICAgICAgbG9nZ2VyLnBsYWluKGVudi5nZXR2YWx1ZSgpKQorCisgICAgICAgICMgZW1pdCB0aGUgbWV0YWRhdGEgd2hpY2ggaXNudCB2YWxpZCBzaGVsbAorICAgICAgICBkYXRhLmV4cGFuZEtleXMoZW52ZGF0YSkKKyAgICAgICAgZm9yIGUgaW4gZW52ZGF0YS5rZXlzKCk6CisgICAgICAgICAgICBpZiBkYXRhLmdldFZhckZsYWcoIGUsICdweXRob24nLCBlbnZkYXRhICk6CisgICAgICAgICAgICAgICAgbG9nZ2VyLnBsYWluKCJcbnB5dGhvbiAlcyAoKSB7XG4lc31cbiIsIGUsIGVudmRhdGEuZ2V0VmFyKGUsIFRydWUpKQorCisKKyAgICBkZWYgYnVpbGRUYXNrRGF0YShzZWxmLCBwa2dzX3RvX2J1aWxkLCB0YXNrLCBhYm9ydCwgYWxsb3dpbmNvbXBsZXRlPUZhbHNlKToKKyAgICAgICAgIiIiCisgICAgICAgIFByZXBhcmUgYSBydW5xdWV1ZSBhbmQgdGFza2RhdGEgb2JqZWN0IGZvciBpdGVyYXRpb24gb3ZlciBwa2dzX3RvX2J1aWxkCisgICAgICAgICIiIgorICAgICAgICBiYi5ldmVudC5maXJlKGJiLmV2ZW50LlRyZWVEYXRhUHJlcGFyYXRpb25TdGFydGVkKCksIHNlbGYuZGF0YSkKKworICAgICAgICAjIEEgdGFzayBvZiBOb25lIG1lYW5zIHVzZSB0aGUgZGVmYXVsdCB0YXNrCisgICAgICAgIGlmIHRhc2sgaXMgTm9uZToKKyAgICAgICAgICAgIHRhc2sgPSBzZWxmLmNvbmZpZ3VyYXRpb24uY21kCisKKyAgICAgICAgZnVsbHRhcmdldGxpc3QgPSBzZWxmLmNoZWNrUGFja2FnZXMocGtnc190b19idWlsZCkKKworICAgICAgICBsb2NhbGRhdGEgPSBkYXRhLmNyZWF0ZUNvcHkoc2VsZi5kYXRhKQorICAgICAgICBiYi5kYXRhLnVwZGF0ZV9kYXRhKGxvY2FsZGF0YSkKKyAgICAgICAgYmIuZGF0YS5leHBhbmRLZXlzKGxvY2FsZGF0YSkKKyAgICAgICAgdGFza2RhdGEgPSBiYi50YXNrZGF0YS5UYXNrRGF0YShhYm9ydCwgc2tpcGxpc3Q9c2VsZi5za2lwbGlzdCwgYWxsb3dpbmNvbXBsZXRlPWFsbG93aW5jb21wbGV0ZSkKKworICAgICAgICBjdXJyZW50ID0gMAorICAgICAgICBydW5saXN0ID0gW10KKyAgICAgICAgZm9yIGsgaW4gZnVsbHRhcmdldGxpc3Q6CisgICAgICAgICAgICBrdGFzayA9IHRhc2sKKyAgICAgICAgICAgIGlmICI6ZG9fIiBpbiBrOgorICAgICAgICAgICAgICAgIGsyID0gay5zcGxpdCgiOmRvXyIpCisgICAgICAgICAgICAgICAgayA9IGsyWzBdCisgICAgICAgICAgICAgICAga3Rhc2sgPSBrMlsxXQorICAgICAgICAgICAgdGFza2RhdGEuYWRkX3Byb3ZpZGVyKGxvY2FsZGF0YSwgc2VsZi5yZWNpcGVjYWNoZSwgaykKKyAgICAgICAgICAgIGN1cnJlbnQgKz0gMQorICAgICAgICAgICAgaWYgbm90IGt0YXNrLnN0YXJ0c3dpdGgoImRvXyIpOgorICAgICAgICAgICAgICAgIGt0YXNrID0gImRvXyVzIiAlIGt0YXNrCisgICAgICAgICAgICBydW5saXN0LmFwcGVuZChbaywga3Rhc2tdKQorICAgICAgICAgICAgYmIuZXZlbnQuZmlyZShiYi5ldmVudC5UcmVlRGF0YVByZXBhcmF0aW9uUHJvZ3Jlc3MoY3VycmVudCwgbGVuKGZ1bGx0YXJnZXRsaXN0KSksIHNlbGYuZGF0YSkKKyAgICAgICAgdGFza2RhdGEuYWRkX3VucmVzb2x2ZWQobG9jYWxkYXRhLCBzZWxmLnJlY2lwZWNhY2hlKQorICAgICAgICBiYi5ldmVudC5maXJlKGJiLmV2ZW50LlRyZWVEYXRhUHJlcGFyYXRpb25Db21wbGV0ZWQobGVuKGZ1bGx0YXJnZXRsaXN0KSksIHNlbGYuZGF0YSkKKyAgICAgICAgcmV0dXJuIHRhc2tkYXRhLCBydW5saXN0LCBmdWxsdGFyZ2V0bGlzdAorCisgICAgZGVmIHByZXBhcmVUcmVlRGF0YShzZWxmLCBwa2dzX3RvX2J1aWxkLCB0YXNrKToKKyAgICAgICAgIiIiCisgICAgICAgIFByZXBhcmUgYSBydW5xdWV1ZSBhbmQgdGFza2RhdGEgb2JqZWN0IGZvciBpdGVyYXRpb24gb3ZlciBwa2dzX3RvX2J1aWxkCisgICAgICAgICIiIgorCisgICAgICAgICMgV2Ugc2V0IGFib3J0IHRvIEZhbHNlIGhlcmUgdG8gcHJldmVudCB1bmJ1aWxkYWJsZSB0YXJnZXRzIHJhaXNpbmcKKyAgICAgICAgIyBhbiBleGNlcHRpb24gd2hlbiB3ZSdyZSBqdXN0IGdlbmVyYXRpbmcgZGF0YQorICAgICAgICB0YXNrZGF0YSwgcnVubGlzdCwgcGtnc190b19idWlsZCA9IHNlbGYuYnVpbGRUYXNrRGF0YShwa2dzX3RvX2J1aWxkLCB0YXNrLCBGYWxzZSwgYWxsb3dpbmNvbXBsZXRlPVRydWUpCisKKyAgICAgICAgcmV0dXJuIHJ1bmxpc3QsIHRhc2tkYXRhCisKKyAgICAjIyMjIyMjIyBXQVJOSU5HIDogdGhpcyBmdW5jdGlvbiByZXF1aXJlcyBjYWNoZV9leHRyYSB0byBiZSBlbmFibGVkICMjIyMjIyMjCisKKyAgICBkZWYgZ2VuZXJhdGVUYXNrRGVwVHJlZURhdGEoc2VsZiwgcGtnc190b19idWlsZCwgdGFzayk6CisgICAgICAgICIiIgorICAgICAgICBDcmVhdGUgYSBkZXBlbmRlbmN5IGdyYXBoIG9mIHBrZ3NfdG9fYnVpbGQgaW5jbHVkaW5nIHJldmVyc2UgZGVwZW5kZW5jeQorICAgICAgICBpbmZvcm1hdGlvbi4KKyAgICAgICAgIiIiCisgICAgICAgIHJ1bmxpc3QsIHRhc2tkYXRhID0gc2VsZi5wcmVwYXJlVHJlZURhdGEocGtnc190b19idWlsZCwgdGFzaykKKyAgICAgICAgcnEgPSBiYi5ydW5xdWV1ZS5SdW5RdWV1ZShzZWxmLCBzZWxmLmRhdGEsIHNlbGYucmVjaXBlY2FjaGUsIHRhc2tkYXRhLCBydW5saXN0KQorICAgICAgICBycS5ycWRhdGEucHJlcGFyZSgpCisgICAgICAgIHJldHVybiBzZWxmLmJ1aWxkRGVwZW5kVHJlZShycSwgdGFza2RhdGEpCisKKworICAgIGRlZiBidWlsZERlcGVuZFRyZWUoc2VsZiwgcnEsIHRhc2tkYXRhKToKKyAgICAgICAgc2Vlbl9mbmlkcyA9IFtdCisgICAgICAgIGRlcGVuZF90cmVlID0ge30KKyAgICAgICAgZGVwZW5kX3RyZWVbImRlcGVuZHMiXSA9IHt9CisgICAgICAgIGRlcGVuZF90cmVlWyJ0ZGVwZW5kcyJdID0ge30KKyAgICAgICAgZGVwZW5kX3RyZWVbInBuIl0gPSB7fQorICAgICAgICBkZXBlbmRfdHJlZVsicmRlcGVuZHMtcG4iXSA9IHt9CisgICAgICAgIGRlcGVuZF90cmVlWyJwYWNrYWdlcyJdID0ge30KKyAgICAgICAgZGVwZW5kX3RyZWVbInJkZXBlbmRzLXBrZyJdID0ge30KKyAgICAgICAgZGVwZW5kX3RyZWVbInJyZWNzLXBrZyJdID0ge30KKyAgICAgICAgZGVwZW5kX3RyZWVbImxheWVyLXByaW9yaXRpZXMiXSA9IHNlbGYucmVjaXBlY2FjaGUuYmJmaWxlX2NvbmZpZ19wcmlvcml0aWVzCisKKyAgICAgICAgZm9yIHRhc2sgaW4geHJhbmdlKGxlbihycS5ycWRhdGEucnVucV9mbmlkKSk6CisgICAgICAgICAgICB0YXNrbmFtZSA9IHJxLnJxZGF0YS5ydW5xX3Rhc2tbdGFza10KKyAgICAgICAgICAgIGZuaWQgPSBycS5ycWRhdGEucnVucV9mbmlkW3Rhc2tdCisgICAgICAgICAgICBmbiA9IHRhc2tkYXRhLmZuX2luZGV4W2ZuaWRdCisgICAgICAgICAgICBwbiA9IHNlbGYucmVjaXBlY2FjaGUucGtnX2ZuW2ZuXQorICAgICAgICAgICAgdmVyc2lvbiAgPSAiJXM6JXMtJXMiICUgc2VsZi5yZWNpcGVjYWNoZS5wa2dfcGVwdnByW2ZuXQorICAgICAgICAgICAgaWYgcG4gbm90IGluIGRlcGVuZF90cmVlWyJwbiJdOgorICAgICAgICAgICAgICAgIGRlcGVuZF90cmVlWyJwbiJdW3BuXSA9IHt9CisgICAgICAgICAgICAgICAgZGVwZW5kX3RyZWVbInBuIl1bcG5dWyJmaWxlbmFtZSJdID0gZm4KKyAgICAgICAgICAgICAgICBkZXBlbmRfdHJlZVsicG4iXVtwbl1bInZlcnNpb24iXSA9IHZlcnNpb24KKyAgICAgICAgICAgICAgICBkZXBlbmRfdHJlZVsicG4iXVtwbl1bImluaGVyaXRzIl0gPSBzZWxmLnJlY2lwZWNhY2hlLmluaGVyaXRzLmdldChmbiwgTm9uZSkKKworICAgICAgICAgICAgICAgICMgaWYgd2UgaGF2ZSBleHRyYSBjYWNoZXMsIGxpc3QgYWxsIGF0dHJpYnV0ZXMgdGhleSBicmluZyBpbgorICAgICAgICAgICAgICAgIGV4dHJhX2luZm8gPSBbXQorICAgICAgICAgICAgICAgIGZvciBjYWNoZV9jbGFzcyBpbiBzZWxmLmNhY2hlc19hcnJheToKKyAgICAgICAgICAgICAgICAgICAgaWYgdHlwZShjYWNoZV9jbGFzcykgaXMgdHlwZSBhbmQgaXNzdWJjbGFzcyhjYWNoZV9jbGFzcywgYmIuY2FjaGUuUmVjaXBlSW5mb0NvbW1vbikgYW5kIGhhc2F0dHIoY2FjaGVfY2xhc3MsICdjYWNoZWZpZWxkcycpOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVmaWVsZHMgPSBnZXRhdHRyKGNhY2hlX2NsYXNzLCAnY2FjaGVmaWVsZHMnLCBbXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2luZm8gPSBleHRyYV9pbmZvICsgY2FjaGVmaWVsZHMKKworICAgICAgICAgICAgICAgICMgZm9yIGFsbCBhdHRyaWJ1dGVzIHN0b3JlZCwgYWRkIHRoZW0gdG8gdGhlIGRlcGVuZGVuY3kgdHJlZQorICAgICAgICAgICAgICAgIGZvciBlaSBpbiBleHRyYV9pbmZvOgorICAgICAgICAgICAgICAgICAgICBkZXBlbmRfdHJlZVsicG4iXVtwbl1bZWldID0gdmFycyhzZWxmLnJlY2lwZWNhY2hlKVtlaV1bZm5dCisKKworICAgICAgICAgICAgZm9yIGRlcCBpbiBycS5ycWRhdGEucnVucV9kZXBlbmRzW3Rhc2tdOgorICAgICAgICAgICAgICAgIGRlcGZuID0gdGFza2RhdGEuZm5faW5kZXhbcnEucnFkYXRhLnJ1bnFfZm5pZFtkZXBdXQorICAgICAgICAgICAgICAgIGRlcHBuID0gc2VsZi5yZWNpcGVjYWNoZS5wa2dfZm5bZGVwZm5dCisgICAgICAgICAgICAgICAgZG90bmFtZSA9ICIlcy4lcyIgJSAocG4sIHJxLnJxZGF0YS5ydW5xX3Rhc2tbdGFza10pCisgICAgICAgICAgICAgICAgaWYgbm90IGRvdG5hbWUgaW4gZGVwZW5kX3RyZWVbInRkZXBlbmRzIl06CisgICAgICAgICAgICAgICAgICAgIGRlcGVuZF90cmVlWyJ0ZGVwZW5kcyJdW2RvdG5hbWVdID0gW10KKyAgICAgICAgICAgICAgICBkZXBlbmRfdHJlZVsidGRlcGVuZHMiXVtkb3RuYW1lXS5hcHBlbmQoIiVzLiVzIiAlIChkZXBwbiwgcnEucnFkYXRhLnJ1bnFfdGFza1tkZXBdKSkKKyAgICAgICAgICAgIGlmIGZuaWQgbm90IGluIHNlZW5fZm5pZHM6CisgICAgICAgICAgICAgICAgc2Vlbl9mbmlkcy5hcHBlbmQoZm5pZCkKKyAgICAgICAgICAgICAgICBwYWNrYWdlcyA9IFtdCisKKyAgICAgICAgICAgICAgICBkZXBlbmRfdHJlZVsiZGVwZW5kcyJdW3BuXSA9IFtdCisgICAgICAgICAgICAgICAgZm9yIGRlcCBpbiB0YXNrZGF0YS5kZXBpZHNbZm5pZF06CisgICAgICAgICAgICAgICAgICAgIGRlcGVuZF90cmVlWyJkZXBlbmRzIl1bcG5dLmFwcGVuZCh0YXNrZGF0YS5idWlsZF9uYW1lc19pbmRleFtkZXBdKQorCisgICAgICAgICAgICAgICAgZGVwZW5kX3RyZWVbInJkZXBlbmRzLXBuIl1bcG5dID0gW10KKyAgICAgICAgICAgICAgICBmb3IgcmRlcCBpbiB0YXNrZGF0YS5yZGVwaWRzW2ZuaWRdOgorICAgICAgICAgICAgICAgICAgICBkZXBlbmRfdHJlZVsicmRlcGVuZHMtcG4iXVtwbl0uYXBwZW5kKHRhc2tkYXRhLnJ1bl9uYW1lc19pbmRleFtyZGVwXSkKKworICAgICAgICAgICAgICAgIHJkZXBlbmRzID0gc2VsZi5yZWNpcGVjYWNoZS5ydW5kZXBzW2ZuXQorICAgICAgICAgICAgICAgIGZvciBwYWNrYWdlIGluIHJkZXBlbmRzOgorICAgICAgICAgICAgICAgICAgICBkZXBlbmRfdHJlZVsicmRlcGVuZHMtcGtnIl1bcGFja2FnZV0gPSBbXQorICAgICAgICAgICAgICAgICAgICBmb3IgcmRlcGVuZCBpbiByZGVwZW5kc1twYWNrYWdlXToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZF90cmVlWyJyZGVwZW5kcy1wa2ciXVtwYWNrYWdlXS5hcHBlbmQocmRlcGVuZCkKKyAgICAgICAgICAgICAgICAgICAgcGFja2FnZXMuYXBwZW5kKHBhY2thZ2UpCisKKyAgICAgICAgICAgICAgICBycmVjcyA9IHNlbGYucmVjaXBlY2FjaGUucnVucmVjc1tmbl0KKyAgICAgICAgICAgICAgICBmb3IgcGFja2FnZSBpbiBycmVjczoKKyAgICAgICAgICAgICAgICAgICAgZGVwZW5kX3RyZWVbInJyZWNzLXBrZyJdW3BhY2thZ2VdID0gW10KKyAgICAgICAgICAgICAgICAgICAgZm9yIHJkZXBlbmQgaW4gcnJlY3NbcGFja2FnZV06CisgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRfdHJlZVsicnJlY3MtcGtnIl1bcGFja2FnZV0uYXBwZW5kKHJkZXBlbmQpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBwYWNrYWdlIGluIHBhY2thZ2VzOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZXMuYXBwZW5kKHBhY2thZ2UpCisKKyAgICAgICAgICAgICAgICBmb3IgcGFja2FnZSBpbiBwYWNrYWdlczoKKyAgICAgICAgICAgICAgICAgICAgaWYgcGFja2FnZSBub3QgaW4gZGVwZW5kX3RyZWVbInBhY2thZ2VzIl06CisgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRfdHJlZVsicGFja2FnZXMiXVtwYWNrYWdlXSA9IHt9CisgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRfdHJlZVsicGFja2FnZXMiXVtwYWNrYWdlXVsicG4iXSA9IHBuCisgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRfdHJlZVsicGFja2FnZXMiXVtwYWNrYWdlXVsiZmlsZW5hbWUiXSA9IGZuCisgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRfdHJlZVsicGFja2FnZXMiXVtwYWNrYWdlXVsidmVyc2lvbiJdID0gdmVyc2lvbgorCisgICAgICAgIHJldHVybiBkZXBlbmRfdHJlZQorCisgICAgIyMjIyMjIyMgV0FSTklORyA6IHRoaXMgZnVuY3Rpb24gcmVxdWlyZXMgY2FjaGVfZXh0cmEgdG8gYmUgZW5hYmxlZCAjIyMjIyMjIworICAgIGRlZiBnZW5lcmF0ZVBrZ0RlcFRyZWVEYXRhKHNlbGYsIHBrZ3NfdG9fYnVpbGQsIHRhc2spOgorICAgICAgICAiIiIKKyAgICAgICAgQ3JlYXRlIGEgZGVwZW5kZW5jeSB0cmVlIG9mIHBrZ3NfdG9fYnVpbGQsIHJldHVybmluZyB0aGUgZGF0YS4KKyAgICAgICAgIiIiCisgICAgICAgIF8sIHRhc2tkYXRhID0gc2VsZi5wcmVwYXJlVHJlZURhdGEocGtnc190b19idWlsZCwgdGFzaykKKyAgICAgICAgdGFza3NfZm5pZCA9IFtdCisgICAgICAgIGlmIGxlbih0YXNrZGF0YS50YXNrc19uYW1lKSAhPSAwOgorICAgICAgICAgICAgZm9yIHRhc2sgaW4geHJhbmdlKGxlbih0YXNrZGF0YS50YXNrc19uYW1lKSk6CisgICAgICAgICAgICAgICAgdGFza3NfZm5pZC5hcHBlbmQodGFza2RhdGEudGFza3NfZm5pZFt0YXNrXSkKKworICAgICAgICBzZWVuX2ZuaWRzID0gW10KKyAgICAgICAgZGVwZW5kX3RyZWUgPSB7fQorICAgICAgICBkZXBlbmRfdHJlZVsiZGVwZW5kcyJdID0ge30KKyAgICAgICAgZGVwZW5kX3RyZWVbInBuIl0gPSB7fQorICAgICAgICBkZXBlbmRfdHJlZVsicmRlcGVuZHMtcG4iXSA9IHt9CisgICAgICAgIGRlcGVuZF90cmVlWyJyZGVwZW5kcy1wa2ciXSA9IHt9CisgICAgICAgIGRlcGVuZF90cmVlWyJycmVjcy1wa2ciXSA9IHt9CisKKyAgICAgICAgIyBpZiB3ZSBoYXZlIGV4dHJhIGNhY2hlcywgbGlzdCBhbGwgYXR0cmlidXRlcyB0aGV5IGJyaW5nIGluCisgICAgICAgIGV4dHJhX2luZm8gPSBbXQorICAgICAgICBmb3IgY2FjaGVfY2xhc3MgaW4gc2VsZi5jYWNoZXNfYXJyYXk6CisgICAgICAgICAgICBpZiB0eXBlKGNhY2hlX2NsYXNzKSBpcyB0eXBlIGFuZCBpc3N1YmNsYXNzKGNhY2hlX2NsYXNzLCBiYi5jYWNoZS5SZWNpcGVJbmZvQ29tbW9uKSBhbmQgaGFzYXR0cihjYWNoZV9jbGFzcywgJ2NhY2hlZmllbGRzJyk6CisgICAgICAgICAgICAgICAgY2FjaGVmaWVsZHMgPSBnZXRhdHRyKGNhY2hlX2NsYXNzLCAnY2FjaGVmaWVsZHMnLCBbXSkKKyAgICAgICAgICAgICAgICBleHRyYV9pbmZvID0gZXh0cmFfaW5mbyArIGNhY2hlZmllbGRzCisKKyAgICAgICAgZm9yIHRhc2sgaW4geHJhbmdlKGxlbih0YXNrc19mbmlkKSk6CisgICAgICAgICAgICBmbmlkID0gdGFza3NfZm5pZFt0YXNrXQorICAgICAgICAgICAgZm4gPSB0YXNrZGF0YS5mbl9pbmRleFtmbmlkXQorICAgICAgICAgICAgcG4gPSBzZWxmLnJlY2lwZWNhY2hlLnBrZ19mbltmbl0KKworICAgICAgICAgICAgaWYgcG4gbm90IGluIGRlcGVuZF90cmVlWyJwbiJdOgorICAgICAgICAgICAgICAgIGRlcGVuZF90cmVlWyJwbiJdW3BuXSA9IHt9CisgICAgICAgICAgICAgICAgZGVwZW5kX3RyZWVbInBuIl1bcG5dWyJmaWxlbmFtZSJdID0gZm4KKyAgICAgICAgICAgICAgICB2ZXJzaW9uICA9ICIlczolcy0lcyIgJSBzZWxmLnJlY2lwZWNhY2hlLnBrZ19wZXB2cHJbZm5dCisgICAgICAgICAgICAgICAgZGVwZW5kX3RyZWVbInBuIl1bcG5dWyJ2ZXJzaW9uIl0gPSB2ZXJzaW9uCisgICAgICAgICAgICAgICAgcmRlcGVuZHMgPSBzZWxmLnJlY2lwZWNhY2hlLnJ1bmRlcHNbZm5dCisgICAgICAgICAgICAgICAgcnJlY3MgPSBzZWxmLnJlY2lwZWNhY2hlLnJ1bnJlY3NbZm5dCisgICAgICAgICAgICAgICAgZGVwZW5kX3RyZWVbInBuIl1bcG5dWyJpbmhlcml0cyJdID0gc2VsZi5yZWNpcGVjYWNoZS5pbmhlcml0cy5nZXQoZm4sIE5vbmUpCisKKyAgICAgICAgICAgICAgICAjIGZvciBhbGwgZXh0cmEgYXR0cmlidXRlcyBzdG9yZWQsIGFkZCB0aGVtIHRvIHRoZSBkZXBlbmRlbmN5IHRyZWUKKyAgICAgICAgICAgICAgICBmb3IgZWkgaW4gZXh0cmFfaW5mbzoKKyAgICAgICAgICAgICAgICAgICAgZGVwZW5kX3RyZWVbInBuIl1bcG5dW2VpXSA9IHZhcnMoc2VsZi5yZWNpcGVjYWNoZSlbZWldW2ZuXQorCisgICAgICAgICAgICBpZiBmbmlkIG5vdCBpbiBzZWVuX2ZuaWRzOgorICAgICAgICAgICAgICAgIHNlZW5fZm5pZHMuYXBwZW5kKGZuaWQpCisKKyAgICAgICAgICAgICAgICBkZXBlbmRfdHJlZVsiZGVwZW5kcyJdW3BuXSA9IFtdCisgICAgICAgICAgICAgICAgZm9yIGRlcCBpbiB0YXNrZGF0YS5kZXBpZHNbZm5pZF06CisgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSB0YXNrZGF0YS5idWlsZF9uYW1lc19pbmRleFtkZXBdCisgICAgICAgICAgICAgICAgICAgIHBuX3Byb3ZpZGVyID0gIiIKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0aWQgPSB0YXNrZGF0YS5nZXRidWlsZF9pZChpdGVtKQorICAgICAgICAgICAgICAgICAgICBpZiB0YXJnZXRpZCBpbiB0YXNrZGF0YS5idWlsZF90YXJnZXRzIGFuZCB0YXNrZGF0YS5idWlsZF90YXJnZXRzW3RhcmdldGlkXToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkID0gdGFza2RhdGEuYnVpbGRfdGFyZ2V0c1t0YXJnZXRpZF1bMF0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZuX3Byb3ZpZGVyID0gdGFza2RhdGEuZm5faW5kZXhbaWRdCisgICAgICAgICAgICAgICAgICAgICAgICBwbl9wcm92aWRlciA9IHNlbGYucmVjaXBlY2FjaGUucGtnX2ZuW2ZuX3Byb3ZpZGVyXQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcG5fcHJvdmlkZXIgPSBpdGVtCisgICAgICAgICAgICAgICAgICAgIGRlcGVuZF90cmVlWyJkZXBlbmRzIl1bcG5dLmFwcGVuZChwbl9wcm92aWRlcikKKworICAgICAgICAgICAgICAgIGRlcGVuZF90cmVlWyJyZGVwZW5kcy1wbiJdW3BuXSA9IFtdCisgICAgICAgICAgICAgICAgZm9yIHJkZXAgaW4gdGFza2RhdGEucmRlcGlkc1tmbmlkXToKKyAgICAgICAgICAgICAgICAgICAgaXRlbSA9IHRhc2tkYXRhLnJ1bl9uYW1lc19pbmRleFtyZGVwXQorICAgICAgICAgICAgICAgICAgICBwbl9ycHJvdmlkZXIgPSAiIgorICAgICAgICAgICAgICAgICAgICB0YXJnZXRpZCA9IHRhc2tkYXRhLmdldHJ1bl9pZChpdGVtKQorICAgICAgICAgICAgICAgICAgICBpZiB0YXJnZXRpZCBpbiB0YXNrZGF0YS5ydW5fdGFyZ2V0cyBhbmQgdGFza2RhdGEucnVuX3RhcmdldHNbdGFyZ2V0aWRdOgorICAgICAgICAgICAgICAgICAgICAgICAgaWQgPSB0YXNrZGF0YS5ydW5fdGFyZ2V0c1t0YXJnZXRpZF1bMF0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZuX3Jwcm92aWRlciA9IHRhc2tkYXRhLmZuX2luZGV4W2lkXQorICAgICAgICAgICAgICAgICAgICAgICAgcG5fcnByb3ZpZGVyID0gc2VsZi5yZWNpcGVjYWNoZS5wa2dfZm5bZm5fcnByb3ZpZGVyXQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcG5fcnByb3ZpZGVyID0gaXRlbQorICAgICAgICAgICAgICAgICAgICBkZXBlbmRfdHJlZVsicmRlcGVuZHMtcG4iXVtwbl0uYXBwZW5kKHBuX3Jwcm92aWRlcikKKworICAgICAgICAgICAgICAgIGRlcGVuZF90cmVlWyJyZGVwZW5kcy1wa2ciXS51cGRhdGUocmRlcGVuZHMpCisgICAgICAgICAgICAgICAgZGVwZW5kX3RyZWVbInJyZWNzLXBrZyJdLnVwZGF0ZShycmVjcykKKworICAgICAgICByZXR1cm4gZGVwZW5kX3RyZWUKKworICAgIGRlZiBnZW5lcmF0ZURlcFRyZWVFdmVudChzZWxmLCBwa2dzX3RvX2J1aWxkLCB0YXNrKToKKyAgICAgICAgIiIiCisgICAgICAgIENyZWF0ZSBhIHRhc2sgZGVwZW5kZW5jeSBncmFwaCBvZiBwa2dzX3RvX2J1aWxkLgorICAgICAgICBHZW5lcmF0ZSBhbiBldmVudCB3aXRoIHRoZSByZXN1bHQKKyAgICAgICAgIiIiCisgICAgICAgIGRlcGdyYXBoID0gc2VsZi5nZW5lcmF0ZVRhc2tEZXBUcmVlRGF0YShwa2dzX3RvX2J1aWxkLCB0YXNrKQorICAgICAgICBiYi5ldmVudC5maXJlKGJiLmV2ZW50LkRlcFRyZWVHZW5lcmF0ZWQoZGVwZ3JhcGgpLCBzZWxmLmRhdGEpCisKKyAgICBkZWYgZ2VuZXJhdGVEb3RHcmFwaEZpbGVzKHNlbGYsIHBrZ3NfdG9fYnVpbGQsIHRhc2spOgorICAgICAgICAiIiIKKyAgICAgICAgQ3JlYXRlIGEgdGFzayBkZXBlbmRlbmN5IGdyYXBoIG9mIHBrZ3NfdG9fYnVpbGQuCisgICAgICAgIFNhdmUgdGhlIHJlc3VsdCB0byBhIHNldCBvZiAuZG90IGZpbGVzLgorICAgICAgICAiIiIKKworICAgICAgICBkZXBncmFwaCA9IHNlbGYuZ2VuZXJhdGVUYXNrRGVwVHJlZURhdGEocGtnc190b19idWlsZCwgdGFzaykKKworICAgICAgICAjIFByaW50cyBhIGZsYXR0ZW5lZCBmb3JtIG9mIHBhY2thZ2UtZGVwZW5kcyBiZWxvdyB3aGVyZSBzdWJwYWNrYWdlcyBvZiBhIHBhY2thZ2UgYXJlIG1lcmdlZCBpbnRvIHRoZSBtYWluIHBuCisgICAgICAgIGRlcGVuZHNfZmlsZSA9IGZpbGUoJ3BuLWRlcGVuZHMuZG90JywgJ3cnICkKKyAgICAgICAgYnVpbGRsaXN0X2ZpbGUgPSBmaWxlKCdwbi1idWlsZGxpc3QnLCAndycgKQorICAgICAgICBwcmludCgiZGlncmFwaCBkZXBlbmRzIHsiLCBmaWxlPWRlcGVuZHNfZmlsZSkKKyAgICAgICAgZm9yIHBuIGluIGRlcGdyYXBoWyJwbiJdOgorICAgICAgICAgICAgZm4gPSBkZXBncmFwaFsicG4iXVtwbl1bImZpbGVuYW1lIl0KKyAgICAgICAgICAgIHZlcnNpb24gPSBkZXBncmFwaFsicG4iXVtwbl1bInZlcnNpb24iXQorICAgICAgICAgICAgcHJpbnQoJyIlcyIgW2xhYmVsPSIlcyAlc1xcbiVzIl0nICUgKHBuLCBwbiwgdmVyc2lvbiwgZm4pLCBmaWxlPWRlcGVuZHNfZmlsZSkKKyAgICAgICAgICAgIHByaW50KCIlcyIgJSBwbiwgZmlsZT1idWlsZGxpc3RfZmlsZSkKKyAgICAgICAgYnVpbGRsaXN0X2ZpbGUuY2xvc2UoKQorICAgICAgICBsb2dnZXIuaW5mbygiUE4gYnVpbGQgbGlzdCBzYXZlZCB0byAncG4tYnVpbGRsaXN0JyIpCisgICAgICAgIGZvciBwbiBpbiBkZXBncmFwaFsiZGVwZW5kcyJdOgorICAgICAgICAgICAgZm9yIGRlcGVuZCBpbiBkZXBncmFwaFsiZGVwZW5kcyJdW3BuXToKKyAgICAgICAgICAgICAgICBwcmludCgnIiVzIiAtPiAiJXMiJyAlIChwbiwgZGVwZW5kKSwgZmlsZT1kZXBlbmRzX2ZpbGUpCisgICAgICAgIGZvciBwbiBpbiBkZXBncmFwaFsicmRlcGVuZHMtcG4iXToKKyAgICAgICAgICAgIGZvciByZGVwZW5kIGluIGRlcGdyYXBoWyJyZGVwZW5kcy1wbiJdW3BuXToKKyAgICAgICAgICAgICAgICBwcmludCgnIiVzIiAtPiAiJXMiIFtzdHlsZT1kYXNoZWRdJyAlIChwbiwgcmRlcGVuZCksIGZpbGU9ZGVwZW5kc19maWxlKQorICAgICAgICBwcmludCgifSIsIGZpbGU9ZGVwZW5kc19maWxlKQorICAgICAgICBsb2dnZXIuaW5mbygiUE4gZGVwZW5kZW5jaWVzIHNhdmVkIHRvICdwbi1kZXBlbmRzLmRvdCciKQorCisgICAgICAgIGRlcGVuZHNfZmlsZSA9IGZpbGUoJ3BhY2thZ2UtZGVwZW5kcy5kb3QnLCAndycgKQorICAgICAgICBwcmludCgiZGlncmFwaCBkZXBlbmRzIHsiLCBmaWxlPWRlcGVuZHNfZmlsZSkKKyAgICAgICAgZm9yIHBhY2thZ2UgaW4gZGVwZ3JhcGhbInBhY2thZ2VzIl06CisgICAgICAgICAgICBwbiA9IGRlcGdyYXBoWyJwYWNrYWdlcyJdW3BhY2thZ2VdWyJwbiJdCisgICAgICAgICAgICBmbiA9IGRlcGdyYXBoWyJwYWNrYWdlcyJdW3BhY2thZ2VdWyJmaWxlbmFtZSJdCisgICAgICAgICAgICB2ZXJzaW9uID0gZGVwZ3JhcGhbInBhY2thZ2VzIl1bcGFja2FnZV1bInZlcnNpb24iXQorICAgICAgICAgICAgaWYgcGFja2FnZSA9PSBwbjoKKyAgICAgICAgICAgICAgICBwcmludCgnIiVzIiBbbGFiZWw9IiVzICVzXFxuJXMiXScgJSAocG4sIHBuLCB2ZXJzaW9uLCBmbiksIGZpbGU9ZGVwZW5kc19maWxlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCgnIiVzIiBbbGFiZWw9IiVzKCVzKSAlc1xcbiVzIl0nICUgKHBhY2thZ2UsIHBhY2thZ2UsIHBuLCB2ZXJzaW9uLCBmbiksIGZpbGU9ZGVwZW5kc19maWxlKQorICAgICAgICAgICAgZm9yIGRlcGVuZCBpbiBkZXBncmFwaFsiZGVwZW5kcyJdW3BuXToKKyAgICAgICAgICAgICAgICBwcmludCgnIiVzIiAtPiAiJXMiJyAlIChwYWNrYWdlLCBkZXBlbmQpLCBmaWxlPWRlcGVuZHNfZmlsZSkKKyAgICAgICAgZm9yIHBhY2thZ2UgaW4gZGVwZ3JhcGhbInJkZXBlbmRzLXBrZyJdOgorICAgICAgICAgICAgZm9yIHJkZXBlbmQgaW4gZGVwZ3JhcGhbInJkZXBlbmRzLXBrZyJdW3BhY2thZ2VdOgorICAgICAgICAgICAgICAgIHByaW50KCciJXMiIC0+ICIlcyIgW3N0eWxlPWRhc2hlZF0nICUgKHBhY2thZ2UsIHJkZXBlbmQpLCBmaWxlPWRlcGVuZHNfZmlsZSkKKyAgICAgICAgZm9yIHBhY2thZ2UgaW4gZGVwZ3JhcGhbInJyZWNzLXBrZyJdOgorICAgICAgICAgICAgZm9yIHJkZXBlbmQgaW4gZGVwZ3JhcGhbInJyZWNzLXBrZyJdW3BhY2thZ2VdOgorICAgICAgICAgICAgICAgIHByaW50KCciJXMiIC0+ICIlcyIgW3N0eWxlPWRhc2hlZF0nICUgKHBhY2thZ2UsIHJkZXBlbmQpLCBmaWxlPWRlcGVuZHNfZmlsZSkKKyAgICAgICAgcHJpbnQoIn0iLCBmaWxlPWRlcGVuZHNfZmlsZSkKKyAgICAgICAgbG9nZ2VyLmluZm8oIlBhY2thZ2UgZGVwZW5kZW5jaWVzIHNhdmVkIHRvICdwYWNrYWdlLWRlcGVuZHMuZG90JyIpCisKKyAgICAgICAgdGRlcGVuZHNfZmlsZSA9IGZpbGUoJ3Rhc2stZGVwZW5kcy5kb3QnLCAndycgKQorICAgICAgICBwcmludCgiZGlncmFwaCBkZXBlbmRzIHsiLCBmaWxlPXRkZXBlbmRzX2ZpbGUpCisgICAgICAgIGZvciB0YXNrIGluIGRlcGdyYXBoWyJ0ZGVwZW5kcyJdOgorICAgICAgICAgICAgKHBuLCB0YXNrbmFtZSkgPSB0YXNrLnJzcGxpdCgiLiIsIDEpCisgICAgICAgICAgICBmbiA9IGRlcGdyYXBoWyJwbiJdW3BuXVsiZmlsZW5hbWUiXQorICAgICAgICAgICAgdmVyc2lvbiA9IGRlcGdyYXBoWyJwbiJdW3BuXVsidmVyc2lvbiJdCisgICAgICAgICAgICBwcmludCgnIiVzLiVzIiBbbGFiZWw9IiVzICVzXFxuJXNcXG4lcyJdJyAlIChwbiwgdGFza25hbWUsIHBuLCB0YXNrbmFtZSwgdmVyc2lvbiwgZm4pLCBmaWxlPXRkZXBlbmRzX2ZpbGUpCisgICAgICAgICAgICBmb3IgZGVwIGluIGRlcGdyYXBoWyJ0ZGVwZW5kcyJdW3Rhc2tdOgorICAgICAgICAgICAgICAgIHByaW50KCciJXMiIC0+ICIlcyInICUgKHRhc2ssIGRlcCksIGZpbGU9dGRlcGVuZHNfZmlsZSkKKyAgICAgICAgcHJpbnQoIn0iLCBmaWxlPXRkZXBlbmRzX2ZpbGUpCisgICAgICAgIGxvZ2dlci5pbmZvKCJUYXNrIGRlcGVuZGVuY2llcyBzYXZlZCB0byAndGFzay1kZXBlbmRzLmRvdCciKQorCisgICAgZGVmIHNob3dfYXBwZW5kc193aXRoX25vX3JlY2lwZXMoc2VsZik6CisgICAgICAgICMgRGV0ZXJtaW5lIHdoaWNoIGJiYXBwZW5kcyBoYXZlbid0IGJlZW4gYXBwbGllZAorCisgICAgICAgICMgRmlyc3QgZ2V0IGxpc3Qgb2YgcmVjaXBlcywgaW5jbHVkaW5nIHNraXBwZWQKKyAgICAgICAgcmVjaXBlZm5zID0gc2VsZi5yZWNpcGVjYWNoZS5wa2dfZm4ua2V5cygpCisgICAgICAgIHJlY2lwZWZucy5leHRlbmQoc2VsZi5za2lwbGlzdC5rZXlzKCkpCisKKyAgICAgICAgIyBXb3JrIG91dCBsaXN0IG9mIGJiYXBwZW5kcyB0aGF0IGhhdmUgYmVlbiBhcHBsaWVkCisgICAgICAgIGFwcGxpZWRfYXBwZW5kcyA9IFtdCisgICAgICAgIGZvciBmbiBpbiByZWNpcGVmbnM6CisgICAgICAgICAgICBhcHBsaWVkX2FwcGVuZHMuZXh0ZW5kKHNlbGYuY29sbGVjdGlvbi5nZXRfZmlsZV9hcHBlbmRzKGZuKSkKKworICAgICAgICBhcHBlbmRzX3dpdGhvdXRfcmVjaXBlcyA9IFtdCisgICAgICAgIGZvciBfLCBhcHBlbmRmbiBpbiBzZWxmLmNvbGxlY3Rpb24uYmJhcHBlbmRzOgorICAgICAgICAgICAgaWYgbm90IGFwcGVuZGZuIGluIGFwcGxpZWRfYXBwZW5kczoKKyAgICAgICAgICAgICAgICBhcHBlbmRzX3dpdGhvdXRfcmVjaXBlcy5hcHBlbmQoYXBwZW5kZm4pCisKKyAgICAgICAgaWYgYXBwZW5kc193aXRob3V0X3JlY2lwZXM6CisgICAgICAgICAgICBtc2cgPSAnTm8gcmVjaXBlcyBhdmFpbGFibGUgZm9yOlxuICAlcycgJSAnXG4gICcuam9pbihhcHBlbmRzX3dpdGhvdXRfcmVjaXBlcykKKyAgICAgICAgICAgIHdhcm5fb25seSA9IHNlbGYuZGF0YS5nZXRWYXIoIkJCX0RBTkdMSU5HQVBQRU5EU19XQVJOT05MWSIsIFwKKyAgICAgICAgICAgICAgICAgRmFsc2UpIG9yICJubyIKKyAgICAgICAgICAgIGlmIHdhcm5fb25seS5sb3dlcigpIGluICgiMSIsICJ5ZXMiLCAidHJ1ZSIpOgorICAgICAgICAgICAgICAgIGJiLndhcm4obXNnKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBiYi5mYXRhbChtc2cpCisKKyAgICBkZWYgaGFuZGxlUHJlZlByb3ZpZGVycyhzZWxmKToKKworICAgICAgICBsb2NhbGRhdGEgPSBkYXRhLmNyZWF0ZUNvcHkoc2VsZi5kYXRhKQorICAgICAgICBiYi5kYXRhLnVwZGF0ZV9kYXRhKGxvY2FsZGF0YSkKKyAgICAgICAgYmIuZGF0YS5leHBhbmRLZXlzKGxvY2FsZGF0YSkKKworICAgICAgICAjIEhhbmRsZSBQUkVGRVJSRURfUFJPVklERVJTCisgICAgICAgIGZvciBwIGluIChsb2NhbGRhdGEuZ2V0VmFyKCdQUkVGRVJSRURfUFJPVklERVJTJywgVHJ1ZSkgb3IgIiIpLnNwbGl0KCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgKHByb3ZpZGVlLCBwcm92aWRlcikgPSBwLnNwbGl0KCc6JykKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwcm92aWRlcmxvZy5jcml0aWNhbCgiTWFsZm9ybWVkIG9wdGlvbiBpbiBQUkVGRVJSRURfUFJPVklERVJTIHZhcmlhYmxlOiAlcyIgJSBwKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBwcm92aWRlZSBpbiBzZWxmLnJlY2lwZWNhY2hlLnByZWZlcnJlZCBhbmQgc2VsZi5yZWNpcGVjYWNoZS5wcmVmZXJyZWRbcHJvdmlkZWVdICE9IHByb3ZpZGVyOgorICAgICAgICAgICAgICAgIHByb3ZpZGVybG9nLmVycm9yKCJjb25mbGljdGluZyBwcmVmZXJlbmNlcyBmb3IgJXM6IGJvdGggJXMgYW5kICVzIHNwZWNpZmllZCIsIHByb3ZpZGVlLCBwcm92aWRlciwgc2VsZi5yZWNpcGVjYWNoZS5wcmVmZXJyZWRbcHJvdmlkZWVdKQorICAgICAgICAgICAgc2VsZi5yZWNpcGVjYWNoZS5wcmVmZXJyZWRbcHJvdmlkZWVdID0gcHJvdmlkZXIKKworICAgIGRlZiBmaW5kQ29yZUJhc2VGaWxlcyhzZWxmLCBzdWJkaXIsIGNvbmZpZ2ZpbGUpOgorICAgICAgICBjb3JlYmFzZSA9IHNlbGYuZGF0YS5nZXRWYXIoJ0NPUkVCQVNFJywgVHJ1ZSkgb3IgIiIKKyAgICAgICAgcGF0aHMgPSBbXQorICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2Fsayhjb3JlYmFzZSArICcvJyArIHN1YmRpcik6CisgICAgICAgICAgICBmb3IgZCBpbiBkaXJzOgorICAgICAgICAgICAgICAgIGNvbmZpZ2ZpbGVwYXRoID0gb3MucGF0aC5qb2luKHJvb3QsIGQsIGNvbmZpZ2ZpbGUpCisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoY29uZmlnZmlsZXBhdGgpOgorICAgICAgICAgICAgICAgICAgICBwYXRocy5hcHBlbmQob3MucGF0aC5qb2luKHJvb3QsIGQpKQorCisgICAgICAgIGlmIHBhdGhzOgorICAgICAgICAgICAgYmIuZXZlbnQuZmlyZShiYi5ldmVudC5Db3JlQmFzZUZpbGVzRm91bmQocGF0aHMpLCBzZWxmLmRhdGEpCisKKyAgICBkZWYgZmluZENvbmZpZ0ZpbGVQYXRoKHNlbGYsIGNvbmZpZ2ZpbGUpOgorICAgICAgICAiIiIKKyAgICAgICAgRmluZCB0aGUgbG9jYXRpb24gb24gZGlzayBvZiBjb25maWdmaWxlIGFuZCBpZiBpdCBleGlzdHMgYW5kIHdhcyBwYXJzZWQgYnkgQml0QmFrZQorICAgICAgICBlbWl0IHRoZSBDb25maWdGaWxlUGF0aEZvdW5kIGV2ZW50IHdpdGggdGhlIHBhdGggdG8gdGhlIGZpbGUuCisgICAgICAgICIiIgorICAgICAgICBwYXRoID0gYmIuY29va2VyZGF0YS5maW5kQ29uZmlnRmlsZShjb25maWdmaWxlLCBzZWxmLmRhdGEpCisgICAgICAgIGlmIG5vdCBwYXRoOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBHZW5lcmF0ZSBhIGxpc3Qgb2YgcGFyc2VkIGNvbmZpZ3VyYXRpb24gZmlsZXMgYnkgc2VhcmNoaW5nIHRoZSBmaWxlcworICAgICAgICAjIGxpc3RlZCBpbiB0aGUgX19kZXBlbmRzIGFuZCBfX2Jhc2VfZGVwZW5kcyB2YXJpYWJsZXMgd2l0aCBhIC5jb25mIHN1ZmZpeC4KKyAgICAgICAgY29uZmZpbGVzID0gW10KKyAgICAgICAgZGVwX2ZpbGVzID0gc2VsZi5kYXRhLmdldFZhcignX19iYXNlX2RlcGVuZHMnLCBGYWxzZSkgb3IgW10KKyAgICAgICAgZGVwX2ZpbGVzID0gZGVwX2ZpbGVzICsgKHNlbGYuZGF0YS5nZXRWYXIoJ19fZGVwZW5kcycsIEZhbHNlKSBvciBbXSkKKworICAgICAgICBmb3IgZiBpbiBkZXBfZmlsZXM6CisgICAgICAgICAgICBpZiBmWzBdLmVuZHN3aXRoKCIuY29uZiIpOgorICAgICAgICAgICAgICAgIGNvbmZmaWxlcy5hcHBlbmQoZlswXSkKKworICAgICAgICBfLCBjb25mLCBjb25mZmlsZSA9IHBhdGgucnBhcnRpdGlvbigiY29uZi8iKQorICAgICAgICBtYXRjaCA9IG9zLnBhdGguam9pbihjb25mLCBjb25mZmlsZSkKKyAgICAgICAgIyBUcnkgYW5kIGZpbmQgbWF0Y2hlcyBmb3IgY29uZi9jb25mZmlsZW5hbWUuY29uZiBhcyB3ZSBkb24ndCBhbHdheXMKKyAgICAgICAgIyBoYXZlIHRoZSBmdWxsIHBhdGggdG8gdGhlIGZpbGUuCisgICAgICAgIGZvciBjZmcgaW4gY29uZmZpbGVzOgorICAgICAgICAgICAgaWYgY2ZnLmVuZHN3aXRoKG1hdGNoKToKKyAgICAgICAgICAgICAgICBiYi5ldmVudC5maXJlKGJiLmV2ZW50LkNvbmZpZ0ZpbGVQYXRoRm91bmQocGF0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEpCisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgIGRlZiBmaW5kRmlsZXNNYXRjaGluZ0luRGlyKHNlbGYsIGZpbGVwYXR0ZXJuLCBkaXJlY3RvcnkpOgorICAgICAgICAiIiIKKyAgICAgICAgU2VhcmNoZXMgZm9yIGZpbGVzIG1hdGNoaW5nIHRoZSByZWdleCAncGF0dGVybicgd2hpY2ggYXJlIGNoaWxkcmVuIG9mCisgICAgICAgICdkaXJlY3RvcnknIGluIGVhY2ggQkJQQVRILiBpLmUuIHRvIGZpbmQgYWxsIHJvb3RmcyBwYWNrYWdlIGNsYXNzZXMgYXZhaWxhYmxlCisgICAgICAgIHRvIEJpdEJha2Ugb25lIGNvdWxkIGNhbGwgZmluZEZpbGVzTWF0Y2hpbmdJbkRpcihzZWxmLCAncm9vdGZzXycsICdjbGFzc2VzJykKKyAgICAgICAgb3IgdG8gZmluZCBhbGwgbWFjaGluZSBjb25maWd1cmF0aW9uIGZpbGVzIG9uZSBjb3VsZCBjYWxsOgorICAgICAgICBmaW5kRmlsZXNNYXRjaGluZ0luRGlyKHNlbGYsICdjb25mL21hY2hpbmVzJywgJ2NvbmYnKQorICAgICAgICAiIiIKKworICAgICAgICBtYXRjaGVzID0gW10KKyAgICAgICAgcCA9IHJlLmNvbXBpbGUocmUuZXNjYXBlKGZpbGVwYXR0ZXJuKSkKKyAgICAgICAgYmJwYXRocyA9IHNlbGYuZGF0YS5nZXRWYXIoJ0JCUEFUSCcsIFRydWUpLnNwbGl0KCc6JykKKyAgICAgICAgZm9yIHBhdGggaW4gYmJwYXRoczoKKyAgICAgICAgICAgIGRpcnBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgZGlyZWN0b3J5KQorICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZGlycGF0aCk6CisgICAgICAgICAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsoZGlycGF0aCk6CisgICAgICAgICAgICAgICAgICAgIGZvciBmIGluIGZpbGVzOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgcC5zZWFyY2goZik6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5hcHBlbmQoZikKKworICAgICAgICBpZiBtYXRjaGVzOgorICAgICAgICAgICAgYmIuZXZlbnQuZmlyZShiYi5ldmVudC5GaWxlc01hdGNoaW5nRm91bmQoZmlsZXBhdHRlcm4sIG1hdGNoZXMpLCBzZWxmLmRhdGEpCisKKyAgICBkZWYgZmluZENvbmZpZ0ZpbGVzKHNlbGYsIHZhcm5hbWUpOgorICAgICAgICAiIiIKKyAgICAgICAgRmluZCBjb25maWcgZmlsZXMgd2hpY2ggYXJlIGFwcHJvcHJpYXRlIHZhbHVlcyBmb3IgdmFybmFtZS4KKyAgICAgICAgaS5lLiBNQUNISU5FLCBESVNUUk8KKyAgICAgICAgIiIiCisgICAgICAgIHBvc3NpYmxlID0gW10KKyAgICAgICAgdmFyID0gdmFybmFtZS5sb3dlcigpCisKKyAgICAgICAgZGF0YSA9IHNlbGYuZGF0YQorICAgICAgICAjIGl0ZXJhdGUgY29uZmlncworICAgICAgICBiYnBhdGhzID0gZGF0YS5nZXRWYXIoJ0JCUEFUSCcsIFRydWUpLnNwbGl0KCc6JykKKyAgICAgICAgZm9yIHBhdGggaW4gYmJwYXRoczoKKyAgICAgICAgICAgIGNvbmZwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsICJjb25mIiwgdmFyKQorICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoY29uZnBhdGgpOgorICAgICAgICAgICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKGNvbmZwYXRoKToKKyAgICAgICAgICAgICAgICAgICAgIyBnZXQgYWxsIGNoaWxkIGZpbGVzLCB0aGVzZSBhcmUgYXBwcm9wcmlhdGUgdmFsdWVzCisgICAgICAgICAgICAgICAgICAgIGZvciBmIGluIGZpbGVzOgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsLCBzZXAsIGVuZCA9IGYucnBhcnRpdGlvbignLicpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBlbmQgPT0gJ2NvbmYnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlLmFwcGVuZCh2YWwpCisKKyAgICAgICAgaWYgcG9zc2libGU6CisgICAgICAgICAgICBiYi5ldmVudC5maXJlKGJiLmV2ZW50LkNvbmZpZ0ZpbGVzRm91bmQodmFyLCBwb3NzaWJsZSksIHNlbGYuZGF0YSkKKworICAgIGRlZiBmaW5kSW5oZXJpdHNDbGFzcyhzZWxmLCBrbGFzcyk6CisgICAgICAgICIiIgorICAgICAgICBGaW5kIGFsbCByZWNpcGVzIHdoaWNoIGluaGVyaXQgdGhlIHNwZWNpZmllZCBjbGFzcworICAgICAgICAiIiIKKyAgICAgICAgcGtnX2xpc3QgPSBbXQorCisgICAgICAgIGZvciBwZm4gaW4gc2VsZi5yZWNpcGVjYWNoZS5wa2dfZm46CisgICAgICAgICAgICBpbmhlcml0cyA9IHNlbGYucmVjaXBlY2FjaGUuaW5oZXJpdHMuZ2V0KHBmbiwgTm9uZSkKKyAgICAgICAgICAgIGlmIGluaGVyaXRzIGFuZCBpbmhlcml0cy5jb3VudChrbGFzcykgPiAwOgorICAgICAgICAgICAgICAgIHBrZ19saXN0LmFwcGVuZChzZWxmLnJlY2lwZWNhY2hlLnBrZ19mbltwZm5dKQorCisgICAgICAgIHJldHVybiBwa2dfbGlzdAorCisgICAgZGVmIGdlbmVyYXRlVGFyZ2V0c1RyZWUoc2VsZiwga2xhc3M9Tm9uZSwgcGtncz1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIEdlbmVyYXRlIGEgZGVwZW5kZW5jeSB0cmVlIG9mIGJ1aWxkYWJsZSB0YXJnZXRzCisgICAgICAgIEdlbmVyYXRlIGFuIGV2ZW50IHdpdGggdGhlIHJlc3VsdAorICAgICAgICAiIiIKKyAgICAgICAgIyBpZiB0aGUgY2FsbGVyIGhhc24ndCBzcGVjaWZpZWQgYSBwa2dzIGxpc3QgZGVmYXVsdCB0byB1bml2ZXJzZQorICAgICAgICBpZiBub3QgcGtnczoKKyAgICAgICAgICAgIHBrZ3MgPSBbJ3VuaXZlcnNlJ10KKyAgICAgICAgIyBpZiBpbmhlcml0ZWRfY2xhc3MgcGFzc2VkIGVuc3VyZSBhbGwgcmVjaXBlcyB3aGljaCBpbmhlcml0IHRoZQorICAgICAgICAjIHNwZWNpZmllZCBjbGFzcyBhcmUgaW5jbHVkZWQgaW4gcGtncworICAgICAgICBpZiBrbGFzczoKKyAgICAgICAgICAgIGV4dHJhX3BrZ3MgPSBzZWxmLmZpbmRJbmhlcml0c0NsYXNzKGtsYXNzKQorICAgICAgICAgICAgcGtncyA9IHBrZ3MgKyBleHRyYV9wa2dzCisKKyAgICAgICAgIyBnZW5lcmF0ZSBhIGRlcGVuZGVuY3kgdHJlZSBmb3IgYWxsIG91ciBwYWNrYWdlcworICAgICAgICB0cmVlID0gc2VsZi5nZW5lcmF0ZVBrZ0RlcFRyZWVEYXRhKHBrZ3MsICdidWlsZCcpCisgICAgICAgIGJiLmV2ZW50LmZpcmUoYmIuZXZlbnQuVGFyZ2V0c1RyZWVHZW5lcmF0ZWQodHJlZSksIHNlbGYuZGF0YSkKKworICAgIGRlZiBidWlsZFdvcmxkVGFyZ2V0TGlzdChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgICBCdWlsZCBwYWNrYWdlIGxpc3QgZm9yICJiaXRiYWtlIHdvcmxkIgorICAgICAgICAiIiIKKyAgICAgICAgcGFyc2Vsb2cuZGVidWcoMSwgImNvbGxhdGluZyBwYWNrYWdlcyBmb3IgXCJ3b3JsZFwiIikKKyAgICAgICAgZm9yIGYgaW4gc2VsZi5yZWNpcGVjYWNoZS5wb3NzaWJsZV93b3JsZDoKKyAgICAgICAgICAgIHRlcm1pbmFsID0gVHJ1ZQorICAgICAgICAgICAgcG4gPSBzZWxmLnJlY2lwZWNhY2hlLnBrZ19mbltmXQorCisgICAgICAgICAgICBmb3IgcCBpbiBzZWxmLnJlY2lwZWNhY2hlLnBuX3Byb3ZpZGVzW3BuXToKKyAgICAgICAgICAgICAgICBpZiBwLnN0YXJ0c3dpdGgoJ3ZpcnR1YWwvJyk6CisgICAgICAgICAgICAgICAgICAgIHBhcnNlbG9nLmRlYnVnKDIsICJXb3JsZCBidWlsZCBza2lwcGluZyAlcyBkdWUgdG8gJXMgcHJvdmlkZXIgc3RhcnRpbmcgd2l0aCB2aXJ0dWFsLyIsIGYsIHApCisgICAgICAgICAgICAgICAgICAgIHRlcm1pbmFsID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBmb3IgcGYgaW4gc2VsZi5yZWNpcGVjYWNoZS5wcm92aWRlcnNbcF06CisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYucmVjaXBlY2FjaGUucGtnX2ZuW3BmXSAhPSBwbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlbG9nLmRlYnVnKDIsICJXb3JsZCBidWlsZCBza2lwcGluZyAlcyBkdWUgdG8gYm90aCB1cyBhbmQgJXMgcHJvdmlkaW5nICVzIiwgZiwgcGYsIHApCisgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hbCA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgdGVybWluYWw6CisgICAgICAgICAgICAgICAgc2VsZi5yZWNpcGVjYWNoZS53b3JsZF90YXJnZXQuYWRkKHBuKQorCisgICAgZGVmIGludGVyYWN0aXZlTW9kZSggc2VsZiApOgorICAgICAgICAiIiJEcm9wIG9mZiBpbnRvIGEgc2hlbGwiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnJvbSBiYiBpbXBvcnQgc2hlbGwKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgcGFyc2Vsb2cuZXhjZXB0aW9uKCJJbnRlcmFjdGl2ZSBtb2RlIG5vdCBhdmFpbGFibGUiKQorICAgICAgICAgICAgc3lzLmV4aXQoMSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNoZWxsLnN0YXJ0KCBzZWxmICkKKworCisgICAgZGVmIGhhbmRsZUNvbGxlY3Rpb25zKCBzZWxmLCBjb2xsZWN0aW9ucyApOgorICAgICAgICAiIiJIYW5kbGUgY29sbGVjdGlvbnMiIiIKKyAgICAgICAgZXJyb3JzID0gRmFsc2UKKyAgICAgICAgc2VsZi5yZWNpcGVjYWNoZS5iYmZpbGVfY29uZmlnX3ByaW9yaXRpZXMgPSBbXQorICAgICAgICBpZiBjb2xsZWN0aW9uczoKKyAgICAgICAgICAgIGNvbGxlY3Rpb25fcHJpb3JpdGllcyA9IHt9CisgICAgICAgICAgICBjb2xsZWN0aW9uX2RlcGVuZHMgPSB7fQorICAgICAgICAgICAgY29sbGVjdGlvbl9saXN0ID0gY29sbGVjdGlvbnMuc3BsaXQoKQorICAgICAgICAgICAgbWluX3ByaW8gPSAwCisgICAgICAgICAgICBmb3IgYyBpbiBjb2xsZWN0aW9uX2xpc3Q6CisgICAgICAgICAgICAgICAgIyBHZXQgY29sbGVjdGlvbiBwcmlvcml0eSBpZiBkZWZpbmVkIGV4cGxpY2l0bHkKKyAgICAgICAgICAgICAgICBwcmlvcml0eSA9IHNlbGYuZGF0YS5nZXRWYXIoIkJCRklMRV9QUklPUklUWV8lcyIgJSBjLCBUcnVlKQorICAgICAgICAgICAgICAgIGlmIHByaW9yaXR5OgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmlvID0gaW50KHByaW9yaXR5KQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlbG9nLmVycm9yKCJpbnZhbGlkIHZhbHVlIGZvciBCQkZJTEVfUFJJT1JJVFlfJXM6IFwiJXNcIiIsIGMsIHByaW9yaXR5KQorICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBpZiBtaW5fcHJpbyA9PSAwIG9yIHByaW8gPCBtaW5fcHJpbzoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9wcmlvID0gcHJpbworICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uX3ByaW9yaXRpZXNbY10gPSBwcmlvCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbl9wcmlvcml0aWVzW2NdID0gTm9uZQorCisgICAgICAgICAgICAgICAgIyBDaGVjayBkZXBlbmRlbmNpZXMgYW5kIHN0b3JlIGluZm9ybWF0aW9uIGZvciBwcmlvcml0eSBjYWxjdWxhdGlvbgorICAgICAgICAgICAgICAgIGRlcHMgPSBzZWxmLmRhdGEuZ2V0VmFyKCJMQVlFUkRFUEVORFNfJXMiICUgYywgVHJ1ZSkKKyAgICAgICAgICAgICAgICBpZiBkZXBzOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBkZXBsaXN0ID0gYmIudXRpbHMuZXhwbG9kZV9kZXBfdmVyc2lvbnMyKGRlcHMpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBiYi51dGlscy5WZXJzaW9uU3RyaW5nRXhjZXB0aW9uIGFzIHZzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJiLmZhdGFsKCdFcnJvciBwYXJzaW5nIExBWUVSREVQRU5EU18lczogJXMnICUgKGMsIHN0cih2c2UpKSkKKyAgICAgICAgICAgICAgICAgICAgZm9yIGRlcCwgb3BsaXN0IGluIGRlcGxpc3QuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBkZXAgaW4gY29sbGVjdGlvbl9saXN0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBvcHN0ciBpbiBvcGxpc3Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVydmVyID0gc2VsZi5kYXRhLmdldFZhcigiTEFZRVJWRVJTSU9OXyVzIiAlIGRlcCwgVHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wLCBkZXB2ZXIpID0gb3BzdHIuc3BsaXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBsYXllcnZlcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBiYi51dGlscy52ZXJjbXBfc3RyaW5nX29wKGxheWVydmVyLCBkZXB2ZXIsIG9wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IGJiLnV0aWxzLlZlcnNpb25TdHJpbmdFeGNlcHRpb24gYXMgdnNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiLmZhdGFsKCdFcnJvciBwYXJzaW5nIExBWUVSREVQRU5EU18lczogJXMnICUgKGMsIHN0cih2c2UpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCByZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2Vsb2cuZXJyb3IoIkxheWVyICclcycgZGVwZW5kcyBvbiB2ZXJzaW9uICVzIG9mIGxheWVyICclcycsIGJ1dCB2ZXJzaW9uICVzIGlzIGN1cnJlbnRseSBlbmFibGVkIGluIHlvdXIgY29uZmlndXJhdGlvbi4gQ2hlY2sgdGhhdCB5b3UgYXJlIHVzaW5nIHRoZSBjb3JyZWN0IG1hdGNoaW5nIHZlcnNpb25zL2JyYW5jaGVzIG9mIHRoZXNlIHR3byBsYXllcnMuIiwgYywgb3BzdHIsIGRlcCwgbGF5ZXJ2ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2Vsb2cuZXJyb3IoIkxheWVyICclcycgZGVwZW5kcyBvbiB2ZXJzaW9uICVzIG9mIGxheWVyICclcycsIHdoaWNoIGV4aXN0cyBpbiB5b3VyIGNvbmZpZ3VyYXRpb24gYnV0IGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uLiBDaGVjayB0aGF0IHlvdSBhcmUgdXNpbmcgdGhlIGNvcnJlY3QgbWF0Y2hpbmcgdmVyc2lvbnMvYnJhbmNoZXMgb2YgdGhlc2UgdHdvIGxheWVycy4iLCBjLCBvcHN0ciwgZGVwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWxvZy5lcnJvcigiTGF5ZXIgJyVzJyBkZXBlbmRzIG9uIGxheWVyICclcycsIGJ1dCB0aGlzIGxheWVyIGlzIG5vdCBlbmFibGVkIGluIHlvdXIgY29uZmlndXJhdGlvbiIsIGMsIGRlcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25fZGVwZW5kc1tjXSA9IGRlcGxpc3Qua2V5cygpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbl9kZXBlbmRzW2NdID0gW10KKworICAgICAgICAgICAgIyBSZWN1cnNpdmVseSB3b3JrIG91dCBjb2xsZWN0aW9uIHByaW9yaXRpZXMgYmFzZWQgb24gZGVwZW5kZW5jaWVzCisgICAgICAgICAgICBkZWYgY2FsY19sYXllcl9wcmlvcml0eShjb2xsZWN0aW9uKToKKyAgICAgICAgICAgICAgICBpZiBub3QgY29sbGVjdGlvbl9wcmlvcml0aWVzW2NvbGxlY3Rpb25dOgorICAgICAgICAgICAgICAgICAgICBtYXhfZGVwcHJpbyA9IG1pbl9wcmlvCisgICAgICAgICAgICAgICAgICAgIGZvciBkZXAgaW4gY29sbGVjdGlvbl9kZXBlbmRzW2NvbGxlY3Rpb25dOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FsY19sYXllcl9wcmlvcml0eShkZXApCisgICAgICAgICAgICAgICAgICAgICAgICBkZXBwcmlvID0gY29sbGVjdGlvbl9wcmlvcml0aWVzW2RlcF0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRlcHByaW8gPiBtYXhfZGVwcHJpbzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfZGVwcHJpbyA9IGRlcHByaW8KKyAgICAgICAgICAgICAgICAgICAgbWF4X2RlcHByaW8gKz0gMQorICAgICAgICAgICAgICAgICAgICBwYXJzZWxvZy5kZWJ1ZygxLCAiQ2FsY3VsYXRlZCBwcmlvcml0eSBvZiBsYXllciAlcyBhcyAlZCIsIGNvbGxlY3Rpb24sIG1heF9kZXBwcmlvKQorICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uX3ByaW9yaXRpZXNbY29sbGVjdGlvbl0gPSBtYXhfZGVwcHJpbworCisgICAgICAgICAgICAjIENhbGN1bGF0ZSBhbGwgbGF5ZXIgcHJpb3JpdGllcyB1c2luZyBjYWxjX2xheWVyX3ByaW9yaXR5IGFuZCBzdG9yZSBpbiBiYmZpbGVfY29uZmlnX3ByaW9yaXRpZXMKKyAgICAgICAgICAgIGZvciBjIGluIGNvbGxlY3Rpb25fbGlzdDoKKyAgICAgICAgICAgICAgICBjYWxjX2xheWVyX3ByaW9yaXR5KGMpCisgICAgICAgICAgICAgICAgcmVnZXggPSBzZWxmLmRhdGEuZ2V0VmFyKCJCQkZJTEVfUEFUVEVSTl8lcyIgJSBjLCBUcnVlKQorICAgICAgICAgICAgICAgIGlmIHJlZ2V4ID09IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHBhcnNlbG9nLmVycm9yKCJCQkZJTEVfUEFUVEVSTl8lcyBub3QgZGVmaW5lZCIgJSBjKQorICAgICAgICAgICAgICAgICAgICBlcnJvcnMgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBjcmUgPSByZS5jb21waWxlKHJlZ2V4KQorICAgICAgICAgICAgICAgIGV4Y2VwdCByZS5lcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFyc2Vsb2cuZXJyb3IoIkJCRklMRV9QQVRURVJOXyVzIFwiJXNcIiBpcyBub3QgYSB2YWxpZCByZWd1bGFyIGV4cHJlc3Npb24iLCBjLCByZWdleCkKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHNlbGYucmVjaXBlY2FjaGUuYmJmaWxlX2NvbmZpZ19wcmlvcml0aWVzLmFwcGVuZCgoYywgcmVnZXgsIGNyZSwgY29sbGVjdGlvbl9wcmlvcml0aWVzW2NdKSkKKyAgICAgICAgaWYgZXJyb3JzOgorICAgICAgICAgICAgIyBXZSd2ZSBhbHJlYWR5IHByaW50ZWQgdGhlIGFjdHVhbCBlcnJvcihzKQorICAgICAgICAgICAgcmFpc2UgQ29sbGVjdGlvbkVycm9yKCJFcnJvcnMgZHVyaW5nIHBhcnNpbmcgbGF5ZXIgY29uZmlndXJhdGlvbiIpCisKKyAgICBkZWYgYnVpbGRTZXRWYXJzKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgU2V0dXAgYW55IHZhcmlhYmxlcyBuZWVkZWQgYmVmb3JlIHN0YXJ0aW5nIGEgYnVpbGQKKyAgICAgICAgIiIiCisgICAgICAgIHQgPSB0aW1lLmdtdGltZSgpIAorICAgICAgICBpZiBub3Qgc2VsZi5kYXRhLmdldFZhcigiQlVJTEROQU1FIiwgRmFsc2UpOgorICAgICAgICAgICAgc2VsZi5kYXRhLnNldFZhcigiQlVJTEROQU1FIiwgIiR7REFURX0ke1RJTUV9IikKKyAgICAgICAgc2VsZi5kYXRhLnNldFZhcigiQlVJTERTVEFSVCIsIHRpbWUuc3RyZnRpbWUoJyVtLyVkLyVZICVIOiVNOiVTJywgdCkpCisgICAgICAgIHNlbGYuZGF0YS5zZXRWYXIoIkRBVEUiLCB0aW1lLnN0cmZ0aW1lKCclWSVtJWQnLCB0KSkKKyAgICAgICAgc2VsZi5kYXRhLnNldFZhcigiVElNRSIsIHRpbWUuc3RyZnRpbWUoJyVIJU0lUycsIHQpKQorCisgICAgZGVmIG1hdGNoRmlsZXMoc2VsZiwgYmYpOgorICAgICAgICAiIiIKKyAgICAgICAgRmluZCB0aGUgLmJiIGZpbGVzIHdoaWNoIG1hdGNoIHRoZSBleHByZXNzaW9uIGluICdidWlsZGZpbGUnLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgYmYuc3RhcnRzd2l0aCgiLyIpIG9yIGJmLnN0YXJ0c3dpdGgoIi4uLyIpOgorICAgICAgICAgICAgYmYgPSBvcy5wYXRoLmFic3BhdGgoYmYpCisKKyAgICAgICAgc2VsZi5jb2xsZWN0aW9uID0gQ29va2VyQ29sbGVjdEZpbGVzKHNlbGYucmVjaXBlY2FjaGUuYmJmaWxlX2NvbmZpZ19wcmlvcml0aWVzKQorICAgICAgICBmaWxlbGlzdCwgbWFza2VkID0gc2VsZi5jb2xsZWN0aW9uLmNvbGxlY3RfYmJmaWxlcyhzZWxmLmRhdGEsIHNlbGYuZXhwYW5kZWRfZGF0YSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3Muc3RhdChiZikKKyAgICAgICAgICAgIGJmID0gb3MucGF0aC5hYnNwYXRoKGJmKQorICAgICAgICAgICAgcmV0dXJuIFtiZl0KKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICByZWdleHAgPSByZS5jb21waWxlKGJmKQorICAgICAgICAgICAgbWF0Y2hlcyA9IFtdCisgICAgICAgICAgICBmb3IgZiBpbiBmaWxlbGlzdDoKKyAgICAgICAgICAgICAgICBpZiByZWdleHAuc2VhcmNoKGYpIGFuZCBvcy5wYXRoLmlzZmlsZShmKToKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5hcHBlbmQoZikKKyAgICAgICAgICAgIHJldHVybiBtYXRjaGVzCisKKyAgICBkZWYgbWF0Y2hGaWxlKHNlbGYsIGJ1aWxkZmlsZSk6CisgICAgICAgICIiIgorICAgICAgICBGaW5kIHRoZSAuYmIgZmlsZSB3aGljaCBtYXRjaGVzIHRoZSBleHByZXNzaW9uIGluICdidWlsZGZpbGUnLgorICAgICAgICBSYWlzZSBhbiBlcnJvciBpZiBtdWx0aXBsZSBmaWxlcworICAgICAgICAiIiIKKyAgICAgICAgbWF0Y2hlcyA9IHNlbGYubWF0Y2hGaWxlcyhidWlsZGZpbGUpCisgICAgICAgIGlmIGxlbihtYXRjaGVzKSAhPSAxOgorICAgICAgICAgICAgaWYgbWF0Y2hlczoKKyAgICAgICAgICAgICAgICBtc2cgPSAiVW5hYmxlIHRvIG1hdGNoICclcycgdG8gYSBzcGVjaWZpYyByZWNpcGUgZmlsZSAtICVzIG1hdGNoZXMgZm91bmQ6IiAlIChidWlsZGZpbGUsIGxlbihtYXRjaGVzKSkKKyAgICAgICAgICAgICAgICBpZiBtYXRjaGVzOgorICAgICAgICAgICAgICAgICAgICBmb3IgZiBpbiBtYXRjaGVzOgorICAgICAgICAgICAgICAgICAgICAgICAgbXNnICs9ICJcbiAgICAlcyIgJSBmCisgICAgICAgICAgICAgICAgcGFyc2Vsb2cuZXJyb3IobXNnKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwYXJzZWxvZy5lcnJvcigiVW5hYmxlIHRvIGZpbmQgYW55IHJlY2lwZSBmaWxlIG1hdGNoaW5nICclcyciICUgYnVpbGRmaWxlKQorICAgICAgICAgICAgcmFpc2UgTm9TcGVjaWZpY01hdGNoCisgICAgICAgIHJldHVybiBtYXRjaGVzWzBdCisKKyAgICBkZWYgYnVpbGRGaWxlKHNlbGYsIGJ1aWxkZmlsZSwgdGFzayk6CisgICAgICAgICIiIgorICAgICAgICBCdWlsZCB0aGUgZmlsZSBtYXRjaGluZyByZWdleHAgYnVpbGRmaWxlCisgICAgICAgICIiIgorCisgICAgICAgICMgVG9vIG1hbnkgcGVvcGxlIHVzZSAtYiBiZWNhdXNlIHRoZXkgdGhpbmsgaXQncyBob3cgeW91IG5vcm1hbGx5CisgICAgICAgICMgc3BlY2lmeSBhIHRhcmdldCB0byBiZSBidWlsdCwgc28gc2hvdyBhIHdhcm5pbmcKKyAgICAgICAgYmIud2FybigiQnVpbGRmaWxlIHNwZWNpZmllZCwgZGVwZW5kZW5jaWVzIHdpbGwgbm90IGJlIGhhbmRsZWQuIElmIHRoaXMgaXMgbm90IHdoYXQgeW91IHdhbnQsIGRvIG5vdCB1c2UgLWIgLyAtLWJ1aWxkZmlsZS4iKQorCisgICAgICAgICMgUGFyc2UgdGhlIGNvbmZpZ3VyYXRpb24gaGVyZS4gV2UgbmVlZCB0byBkbyBpdCBleHBsaWNpdGx5IGhlcmUgc2luY2UKKyAgICAgICAgIyBidWlsZEZpbGUoKSBkb2Vzbid0IHVzZSB0aGUgY2FjaGUKKyAgICAgICAgc2VsZi5wYXJzZUNvbmZpZ3VyYXRpb24oKQorCisgICAgICAgICMgSWYgd2UgYXJlIHRvbGQgdG8gZG8gdGhlIE5vbmUgdGFzayB0aGVuIHF1ZXJ5IHRoZSBkZWZhdWx0IHRhc2sKKyAgICAgICAgaWYgKHRhc2sgPT0gTm9uZSk6CisgICAgICAgICAgICB0YXNrID0gc2VsZi5jb25maWd1cmF0aW9uLmNtZAorCisgICAgICAgIGZuLCBjbHMgPSBiYi5jYWNoZS5DYWNoZS52aXJ0dWFsZm4ycmVhbGZuKGJ1aWxkZmlsZSkKKyAgICAgICAgZm4gPSBzZWxmLm1hdGNoRmlsZShmbikKKworICAgICAgICBzZWxmLmJ1aWxkU2V0VmFycygpCisKKyAgICAgICAgaW5mb3MgPSBiYi5jYWNoZS5DYWNoZS5wYXJzZShmbiwgc2VsZi5jb2xsZWN0aW9uLmdldF9maWxlX2FwcGVuZHMoZm4pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2FjaGVzX2FycmF5KQorICAgICAgICBpbmZvcyA9IGRpY3QoaW5mb3MpCisKKyAgICAgICAgZm4gPSBiYi5jYWNoZS5DYWNoZS5yZWFsZm4ydmlydHVhbChmbiwgY2xzKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbmZvX2FycmF5ID0gaW5mb3NbZm5dCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIGJiLmZhdGFsKCIlcyBkb2VzIG5vdCBleGlzdCIgJSBmbikKKworICAgICAgICBpZiBpbmZvX2FycmF5WzBdLnNraXBwZWQ6CisgICAgICAgICAgICBiYi5mYXRhbCgiJXMgd2FzIHNraXBwZWQ6ICVzIiAlIChmbiwgaW5mb19hcnJheVswXS5za2lwcmVhc29uKSkKKworICAgICAgICBzZWxmLnJlY2lwZWNhY2hlLmFkZF9mcm9tX3JlY2lwZWluZm8oZm4sIGluZm9fYXJyYXkpCisKKyAgICAgICAgIyBUd2VhayBzb21lIHZhcmlhYmxlcworICAgICAgICBpdGVtID0gaW5mb19hcnJheVswXS5wbgorICAgICAgICBzZWxmLnJlY2lwZWNhY2hlLmlnbm9yZWRfZGVwZW5kZW5jaWVzID0gc2V0KCkKKyAgICAgICAgc2VsZi5yZWNpcGVjYWNoZS5iYmZpbGVfcHJpb3JpdHlbZm5dID0gMQorCisgICAgICAgICMgUmVtb3ZlIGV4dGVybmFsIGRlcGVuZGVuY2llcworICAgICAgICBzZWxmLnJlY2lwZWNhY2hlLnRhc2tfZGVwc1tmbl1bJ2RlcGVuZHMnXSA9IHt9CisgICAgICAgIHNlbGYucmVjaXBlY2FjaGUuZGVwc1tmbl0gPSBbXQorICAgICAgICBzZWxmLnJlY2lwZWNhY2hlLnJ1bmRlcHNbZm5dID0gW10KKyAgICAgICAgc2VsZi5yZWNpcGVjYWNoZS5ydW5yZWNzW2ZuXSA9IFtdCisKKyAgICAgICAgIyBJbnZhbGlkYXRlIHRhc2sgZm9yIHRhcmdldCBpZiBmb3JjZSBtb2RlIGFjdGl2ZQorICAgICAgICBpZiBzZWxmLmNvbmZpZ3VyYXRpb24uZm9yY2U6CisgICAgICAgICAgICBsb2dnZXIudmVyYm9zZSgiSW52YWxpZGF0ZSB0YXNrICVzLCAlcyIsIHRhc2ssIGZuKQorICAgICAgICAgICAgaWYgbm90IHRhc2suc3RhcnRzd2l0aCgiZG9fIik6CisgICAgICAgICAgICAgICAgdGFzayA9ICJkb18lcyIgJSB0YXNrCisgICAgICAgICAgICBiYi5wYXJzZS5zaWdnZW4uaW52YWxpZGF0ZV90YXNrKHRhc2ssIHNlbGYucmVjaXBlY2FjaGUsIGZuKQorCisgICAgICAgICMgU2V0dXAgdGFza2RhdGEgc3RydWN0dXJlCisgICAgICAgIHRhc2tkYXRhID0gYmIudGFza2RhdGEuVGFza0RhdGEoc2VsZi5jb25maWd1cmF0aW9uLmFib3J0KQorICAgICAgICB0YXNrZGF0YS5hZGRfcHJvdmlkZXIoc2VsZi5kYXRhLCBzZWxmLnJlY2lwZWNhY2hlLCBpdGVtKQorCisgICAgICAgIGJ1aWxkbmFtZSA9IHNlbGYuZGF0YS5nZXRWYXIoIkJVSUxETkFNRSIsIFRydWUpCisgICAgICAgIGJiLmV2ZW50LmZpcmUoYmIuZXZlbnQuQnVpbGRTdGFydGVkKGJ1aWxkbmFtZSwgW2l0ZW1dKSwgc2VsZi5leHBhbmRlZF9kYXRhKQorCisgICAgICAgICMgRXhlY3V0ZSB0aGUgcnVucXVldWUKKyAgICAgICAgaWYgbm90IHRhc2suc3RhcnRzd2l0aCgiZG9fIik6CisgICAgICAgICAgICB0YXNrID0gImRvXyVzIiAlIHRhc2sKKyAgICAgICAgcnVubGlzdCA9IFtbaXRlbSwgdGFza11dCisKKyAgICAgICAgcnEgPSBiYi5ydW5xdWV1ZS5SdW5RdWV1ZShzZWxmLCBzZWxmLmRhdGEsIHNlbGYucmVjaXBlY2FjaGUsIHRhc2tkYXRhLCBydW5saXN0KQorCisgICAgICAgIGRlZiBidWlsZEZpbGVJZGxlKHNlcnZlciwgcnEsIGFib3J0KToKKworICAgICAgICAgICAgbXNnID0gTm9uZQorICAgICAgICAgICAgaW50ZXJydXB0ZWQgPSAwCisgICAgICAgICAgICBpZiBhYm9ydCBvciBzZWxmLnN0YXRlID09IHN0YXRlLmZvcmNlc2h1dGRvd246CisgICAgICAgICAgICAgICAgcnEuZmluaXNoX3J1bnF1ZXVlKFRydWUpCisgICAgICAgICAgICAgICAgbXNnID0gIkZvcmNlZCBzaHV0ZG93biIKKyAgICAgICAgICAgICAgICBpbnRlcnJ1cHRlZCA9IDIKKyAgICAgICAgICAgIGVsaWYgc2VsZi5zdGF0ZSA9PSBzdGF0ZS5zaHV0ZG93bjoKKyAgICAgICAgICAgICAgICBycS5maW5pc2hfcnVucXVldWUoRmFsc2UpCisgICAgICAgICAgICAgICAgbXNnID0gIlN0b3BwZWQgYnVpbGQiCisgICAgICAgICAgICAgICAgaW50ZXJydXB0ZWQgPSAxCisgICAgICAgICAgICBmYWlsdXJlcyA9IDAKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR2YWwgPSBycS5leGVjdXRlX3J1bnF1ZXVlKCkKKyAgICAgICAgICAgIGV4Y2VwdCBydW5xdWV1ZS5UYXNrRmFpbHVyZSBhcyBleGM6CisgICAgICAgICAgICAgICAgZmFpbHVyZXMgKz0gbGVuKGV4Yy5hcmdzKQorICAgICAgICAgICAgICAgIHJldHZhbCA9IEZhbHNlCisgICAgICAgICAgICBleGNlcHQgU3lzdGVtRXhpdCBhcyBleGM6CisgICAgICAgICAgICAgICAgc2VsZi5jb21tYW5kLmZpbmlzaEFzeW5jQ29tbWFuZCgpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgICAgIGlmIG5vdCByZXR2YWw6CisgICAgICAgICAgICAgICAgYmIuZXZlbnQuZmlyZShiYi5ldmVudC5CdWlsZENvbXBsZXRlZChsZW4ocnEucnFkYXRhLnJ1bnFfZm5pZCksIGJ1aWxkbmFtZSwgaXRlbSwgZmFpbHVyZXMsIGludGVycnVwdGVkKSwgc2VsZi5leHBhbmRlZF9kYXRhKQorICAgICAgICAgICAgICAgIHNlbGYuY29tbWFuZC5maW5pc2hBc3luY0NvbW1hbmQobXNnKQorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgaWYgcmV0dmFsIGlzIFRydWU6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIHJldHVybiByZXR2YWwKKworICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uc2VydmVyX3JlZ2lzdGVyX2lkbGVjYWxsYmFjayhidWlsZEZpbGVJZGxlLCBycSkKKworICAgIGRlZiBidWlsZFRhcmdldHMoc2VsZiwgdGFyZ2V0cywgdGFzayk6CisgICAgICAgICIiIgorICAgICAgICBBdHRlbXB0IHRvIGJ1aWxkIHRoZSB0YXJnZXRzIHNwZWNpZmllZAorICAgICAgICAiIiIKKworICAgICAgICBkZWYgYnVpbGRUYXJnZXRzSWRsZShzZXJ2ZXIsIHJxLCBhYm9ydCk6CisgICAgICAgICAgICBtc2cgPSBOb25lCisgICAgICAgICAgICBpbnRlcnJ1cHRlZCA9IDAKKyAgICAgICAgICAgIGlmIGFib3J0IG9yIHNlbGYuc3RhdGUgPT0gc3RhdGUuZm9yY2VzaHV0ZG93bjoKKyAgICAgICAgICAgICAgICBycS5maW5pc2hfcnVucXVldWUoVHJ1ZSkKKyAgICAgICAgICAgICAgICBtc2cgPSAiRm9yY2VkIHNodXRkb3duIgorICAgICAgICAgICAgICAgIGludGVycnVwdGVkID0gMgorICAgICAgICAgICAgZWxpZiBzZWxmLnN0YXRlID09IHN0YXRlLnNodXRkb3duOgorICAgICAgICAgICAgICAgIHJxLmZpbmlzaF9ydW5xdWV1ZShGYWxzZSkKKyAgICAgICAgICAgICAgICBtc2cgPSAiU3RvcHBlZCBidWlsZCIKKyAgICAgICAgICAgICAgICBpbnRlcnJ1cHRlZCA9IDEKKyAgICAgICAgICAgIGZhaWx1cmVzID0gMAorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJldHZhbCA9IHJxLmV4ZWN1dGVfcnVucXVldWUoKQorICAgICAgICAgICAgZXhjZXB0IHJ1bnF1ZXVlLlRhc2tGYWlsdXJlIGFzIGV4YzoKKyAgICAgICAgICAgICAgICBmYWlsdXJlcyArPSBsZW4oZXhjLmFyZ3MpCisgICAgICAgICAgICAgICAgcmV0dmFsID0gRmFsc2UKKyAgICAgICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0IGFzIGV4YzoKKyAgICAgICAgICAgICAgICBzZWxmLmNvbW1hbmQuZmluaXNoQXN5bmNDb21tYW5kKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICAgICAgaWYgbm90IHJldHZhbDoKKyAgICAgICAgICAgICAgICBiYi5ldmVudC5maXJlKGJiLmV2ZW50LkJ1aWxkQ29tcGxldGVkKGxlbihycS5ycWRhdGEucnVucV9mbmlkKSwgYnVpbGRuYW1lLCB0YXJnZXRzLCBmYWlsdXJlcywgaW50ZXJydXB0ZWQpLCBzZWxmLmRhdGEpCisgICAgICAgICAgICAgICAgc2VsZi5jb21tYW5kLmZpbmlzaEFzeW5jQ29tbWFuZChtc2cpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICBpZiByZXR2YWwgaXMgVHJ1ZToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgcmV0dXJuIHJldHZhbAorCisgICAgICAgIGJ1aWxkLnJlc2V0X2NhY2hlKCkKKyAgICAgICAgc2VsZi5idWlsZFNldFZhcnMoKQorCisgICAgICAgIHRhc2tkYXRhLCBydW5saXN0LCBmdWxsdGFyZ2V0bGlzdCA9IHNlbGYuYnVpbGRUYXNrRGF0YSh0YXJnZXRzLCB0YXNrLCBzZWxmLmNvbmZpZ3VyYXRpb24uYWJvcnQpCisKKyAgICAgICAgYnVpbGRuYW1lID0gc2VsZi5kYXRhLmdldFZhcigiQlVJTEROQU1FIiwgRmFsc2UpCisgICAgICAgIGJiLmV2ZW50LmZpcmUoYmIuZXZlbnQuQnVpbGRTdGFydGVkKGJ1aWxkbmFtZSwgZnVsbHRhcmdldGxpc3QpLCBzZWxmLmRhdGEpCisKKyAgICAgICAgcnEgPSBiYi5ydW5xdWV1ZS5SdW5RdWV1ZShzZWxmLCBzZWxmLmRhdGEsIHNlbGYucmVjaXBlY2FjaGUsIHRhc2tkYXRhLCBydW5saXN0KQorICAgICAgICBpZiAndW5pdmVyc2UnIGluIHRhcmdldHM6CisgICAgICAgICAgICBycS5ycWRhdGEud2Fybl9tdWx0aV9iYiA9IFRydWUKKworICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uc2VydmVyX3JlZ2lzdGVyX2lkbGVjYWxsYmFjayhidWlsZFRhcmdldHNJZGxlLCBycSkKKworCisgICAgZGVmIGdldEFsbEtleXNXaXRoRmxhZ3Moc2VsZiwgZmxhZ2xpc3QpOgorICAgICAgICBkdW1wID0ge30KKyAgICAgICAgZm9yIGsgaW4gc2VsZi5kYXRhLmtleXMoKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB2ID0gc2VsZi5kYXRhLmdldFZhcihrLCBUcnVlKQorICAgICAgICAgICAgICAgIGlmIG5vdCBrLnN0YXJ0c3dpdGgoIl9fIikgYW5kIG5vdCBpc2luc3RhbmNlKHYsIGJiLmRhdGFfc21hcnQuRGF0YVNtYXJ0KToKKyAgICAgICAgICAgICAgICAgICAgZHVtcFtrXSA9IHsKKyAgICAndicgOiB2ICwKKyAgICAnaGlzdG9yeScgOiBzZWxmLmRhdGEudmFyaGlzdG9yeS52YXJpYWJsZShrKSwKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmb3IgZCBpbiBmbGFnbGlzdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBba11bZF0gPSBzZWxmLmRhdGEuZ2V0VmFyRmxhZyhrLCBkKQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgICAgIHByaW50KGUpCisgICAgICAgIHJldHVybiBkdW1wCisKKworICAgIGRlZiBnZW5lcmF0ZU5ld0ltYWdlKHNlbGYsIGltYWdlLCBiYXNlX2ltYWdlLCBwYWNrYWdlX3F1ZXVlLCB0aW1lc3RhbXAsIGRlc2NyaXB0aW9uKToKKyAgICAgICAgJycnCisgICAgICAgIENyZWF0ZSBhIG5ldyBpbWFnZSB3aXRoIGEgInJlcXVpcmUiLyJpbmhlcml0IiBiYXNlX2ltYWdlIHN0YXRlbWVudAorICAgICAgICAnJycKKyAgICAgICAgaWYgdGltZXN0YW1wOgorICAgICAgICAgICAgaW1hZ2VfbmFtZSA9IG9zLnBhdGguc3BsaXRleHQoaW1hZ2UpWzBdCisgICAgICAgICAgICB0aW1lc3RyID0gdGltZS5zdHJmdGltZSgiLSVZJW0lZC0lSCVNJVMiKQorICAgICAgICAgICAgZGVzdCA9IGltYWdlX25hbWUgKyBzdHIodGltZXN0cikgKyAiLmJiIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgbm90IGltYWdlLmVuZHN3aXRoKCIuYmIiKToKKyAgICAgICAgICAgICAgICBkZXN0ID0gaW1hZ2UgKyAiLmJiIgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkZXN0ID0gaW1hZ2UKKworICAgICAgICBiYXNlbmFtZSA9IEZhbHNlCisgICAgICAgIGlmIGJhc2VfaW1hZ2U6CisgICAgICAgICAgICB3aXRoIG9wZW4oYmFzZV9pbWFnZSwgJ3InKSBhcyBmOgorICAgICAgICAgICAgICAgIHJlcXVpcmVfbGluZSA9IGYucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgIHAgPSByZS5jb21waWxlKCJJTUFHRV9CQVNFTkFNRSAqPSIpCisgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gZjoKKyAgICAgICAgICAgICAgICAgICAgaWYgcC5zZWFyY2gobGluZSk6CisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlbmFtZSA9IFRydWUKKworICAgICAgICB3aXRoIG9wZW4oZGVzdCwgInciKSBhcyBpbWFnZWZpbGU6CisgICAgICAgICAgICBpZiBiYXNlX2ltYWdlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgaW1hZ2VmaWxlLndyaXRlKCJpbmhlcml0IGNvcmUtaW1hZ2VcbiIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHRvcGRpciA9IHNlbGYuZGF0YS5nZXRWYXIoIlRPUERJUiIsIEZhbHNlKQorICAgICAgICAgICAgICAgIGlmIHRvcGRpciBpbiBiYXNlX2ltYWdlOgorICAgICAgICAgICAgICAgICAgICBiYXNlX2ltYWdlID0gcmVxdWlyZV9saW5lLnNwbGl0KClbMV0KKyAgICAgICAgICAgICAgICBpbWFnZWZpbGUud3JpdGUoInJlcXVpcmUgIiArIGJhc2VfaW1hZ2UgKyAiXG4iKQorICAgICAgICAgICAgaW1hZ2VfaW5zdGFsbCA9ICJJTUFHRV9JTlNUQUxMID0gXCIiCisgICAgICAgICAgICBmb3IgcGFja2FnZSBpbiBwYWNrYWdlX3F1ZXVlOgorICAgICAgICAgICAgICAgIGltYWdlX2luc3RhbGwgKz0gc3RyKHBhY2thZ2UpICsgIiAiCisgICAgICAgICAgICBpbWFnZV9pbnN0YWxsICs9ICJcIlxuIgorICAgICAgICAgICAgaW1hZ2VmaWxlLndyaXRlKGltYWdlX2luc3RhbGwpCisKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uX3ZhciA9ICJERVNDUklQVElPTiA9IFwiIiArIGRlc2NyaXB0aW9uICsgIlwiXG4iCisgICAgICAgICAgICBpbWFnZWZpbGUud3JpdGUoZGVzY3JpcHRpb25fdmFyKQorCisgICAgICAgICAgICBpZiBiYXNlbmFtZToKKyAgICAgICAgICAgICAgICAjIElmIHRoaXMgaXMgb3ZlcndyaXR0ZW4gaW4gYSBpbmhlcml0ZWQgaW1hZ2UsIHJlc2V0IGl0IHRvIGRlZmF1bHQKKyAgICAgICAgICAgICAgICBpbWFnZV9iYXNlbmFtZSA9ICJJTUFHRV9CQVNFTkFNRSA9IFwiJHtQTn1cIlxuIgorICAgICAgICAgICAgICAgIGltYWdlZmlsZS53cml0ZShpbWFnZV9iYXNlbmFtZSkKKworICAgICAgICBzZWxmLnN0YXRlID0gc3RhdGUuaW5pdGlhbAorICAgICAgICBpZiB0aW1lc3RhbXA6CisgICAgICAgICAgICByZXR1cm4gdGltZXN0cgorCisgICAgZGVmIHVwZGF0ZUNhY2hlU3luYyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5zdGF0ZSA9PSBzdGF0ZS5ydW5uaW5nOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyByZWxvYWQgZmlsZXMgZm9yIHdoaWNoIHdlIGdvdCBub3RpZmljYXRpb25zCisgICAgICAgIGZvciBwIGluIHNlbGYuaW5vdGlmeV9tb2RpZmllZF9maWxlczoKKyAgICAgICAgICAgIGJiLnBhcnNlLnVwZGF0ZV9jYWNoZShwKQorICAgICAgICBzZWxmLmlub3RpZnlfbW9kaWZpZWRfZmlsZXMgPSBbXQorCisgICAgICAgIGlmIG5vdCBzZWxmLmJhc2Vjb25maWdfdmFsaWQ6CisgICAgICAgICAgICBsb2dnZXIuZGVidWcoMSwgIlJlbG9hZGluZyBiYXNlIGNvbmZpZ3VyYXRpb24gZGF0YSIpCisgICAgICAgICAgICBzZWxmLmluaXRDb25maWd1cmF0aW9uRGF0YSgpCisgICAgICAgICAgICBzZWxmLmJhc2Vjb25maWdfdmFsaWQgPSBUcnVlCisgICAgICAgICAgICBzZWxmLnBhcnNlY2FjaGVfdmFsaWQgPSBGYWxzZQorCisgICAgIyBUaGlzIGlzIGNhbGxlZCBmb3IgYWxsIGFzeW5jIGNvbW1hbmRzIHdoZW4gc2VsZi5zdGF0ZSAhPSBydW5uaW5nCisgICAgZGVmIHVwZGF0ZUNhY2hlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnN0YXRlID09IHN0YXRlLnJ1bm5pbmc6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBzZWxmLnN0YXRlIGluIChzdGF0ZS5zaHV0ZG93biwgc3RhdGUuZm9yY2VzaHV0ZG93biwgc3RhdGUuZXJyb3IpOgorICAgICAgICAgICAgaWYgaGFzYXR0cihzZWxmLnBhcnNlciwgJ3NodXRkb3duJyk6CisgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIuc2h1dGRvd24oY2xlYW49RmFsc2UsIGZvcmNlID0gVHJ1ZSkKKyAgICAgICAgICAgIHJhaXNlIGJiLkJCSGFuZGxlZEV4Y2VwdGlvbigpCisKKyAgICAgICAgaWYgc2VsZi5zdGF0ZSAhPSBzdGF0ZS5wYXJzaW5nOgorICAgICAgICAgICAgc2VsZi51cGRhdGVDYWNoZVN5bmMoKQorCisgICAgICAgIGlmIHNlbGYuc3RhdGUgIT0gc3RhdGUucGFyc2luZyBhbmQgbm90IHNlbGYucGFyc2VjYWNoZV92YWxpZDoKKyAgICAgICAgICAgIHNlbGYucGFyc2VDb25maWd1cmF0aW9uICgpCisgICAgICAgICAgICBpZiBDb29rZXJGZWF0dXJlcy5TRU5EX1NBTklUWUVWRU5UUyBpbiBzZWxmLmZlYXR1cmVzZXQ6CisgICAgICAgICAgICAgICAgYmIuZXZlbnQuZmlyZShiYi5ldmVudC5TYW5pdHlDaGVjayhGYWxzZSksIHNlbGYuZGF0YSkKKworICAgICAgICAgICAgaWdub3JlID0gc2VsZi5leHBhbmRlZF9kYXRhLmdldFZhcigiQVNTVU1FX1BST1ZJREVEIiwgVHJ1ZSkgb3IgIiIKKyAgICAgICAgICAgIHNlbGYucmVjaXBlY2FjaGUuaWdub3JlZF9kZXBlbmRlbmNpZXMgPSBzZXQoaWdub3JlLnNwbGl0KCkpCisKKyAgICAgICAgICAgIGZvciBkZXAgaW4gc2VsZi5jb25maWd1cmF0aW9uLmV4dHJhX2Fzc3VtZV9wcm92aWRlZDoKKyAgICAgICAgICAgICAgICBzZWxmLnJlY2lwZWNhY2hlLmlnbm9yZWRfZGVwZW5kZW5jaWVzLmFkZChkZXApCisKKyAgICAgICAgICAgIHNlbGYuY29sbGVjdGlvbiA9IENvb2tlckNvbGxlY3RGaWxlcyhzZWxmLnJlY2lwZWNhY2hlLmJiZmlsZV9jb25maWdfcHJpb3JpdGllcykKKyAgICAgICAgICAgIChmaWxlbGlzdCwgbWFza2VkKSA9IHNlbGYuY29sbGVjdGlvbi5jb2xsZWN0X2JiZmlsZXMoc2VsZi5kYXRhLCBzZWxmLmV4cGFuZGVkX2RhdGEpCisKKyAgICAgICAgICAgIHNlbGYucGFyc2VyID0gQ29va2VyUGFyc2VyKHNlbGYsIGZpbGVsaXN0LCBtYXNrZWQpCisgICAgICAgICAgICBzZWxmLnBhcnNlY2FjaGVfdmFsaWQgPSBUcnVlCisKKyAgICAgICAgc2VsZi5zdGF0ZSA9IHN0YXRlLnBhcnNpbmcKKworICAgICAgICBpZiBub3Qgc2VsZi5wYXJzZXIucGFyc2VfbmV4dCgpOgorICAgICAgICAgICAgY29sbGVjdGxvZy5kZWJ1ZygxLCAicGFyc2luZyBjb21wbGV0ZSIpCisgICAgICAgICAgICBpZiBzZWxmLnBhcnNlci5lcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSBiYi5CQkhhbmRsZWRFeGNlcHRpb24oKQorICAgICAgICAgICAgc2VsZi5zaG93X2FwcGVuZHNfd2l0aF9ub19yZWNpcGVzKCkKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlUHJlZlByb3ZpZGVycygpCisgICAgICAgICAgICBzZWxmLnJlY2lwZWNhY2hlLmJiZmlsZV9wcmlvcml0eSA9IHNlbGYuY29sbGVjdGlvbi5jb2xsZWN0aW9uX3ByaW9yaXRpZXMoc2VsZi5yZWNpcGVjYWNoZS5wa2dfZm4sIHNlbGYuZGF0YSkKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzdGF0ZS5ydW5uaW5nCisKKyAgICAgICAgICAgICMgU2VuZCBhbiBldmVudCBsaXN0aW5nIGFsbCBzdGFtcHMgcmVhY2hhYmxlIGFmdGVyIHBhcnNpbmcKKyAgICAgICAgICAgICMgd2hpY2ggdGhlIG1ldGFkYXRhIG1heSB1c2UgdG8gY2xlYW4gdXAgc3RhbGUgZGF0YQorICAgICAgICAgICAgZXZlbnQgPSBiYi5ldmVudC5SZWFjaGFibGVTdGFtcHMoc2VsZi5yZWNpcGVjYWNoZS5zdGFtcCkKKyAgICAgICAgICAgIGJiLmV2ZW50LmZpcmUoZXZlbnQsIHNlbGYuZXhwYW5kZWRfZGF0YSkKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBjaGVja1BhY2thZ2VzKHNlbGYsIHBrZ3NfdG9fYnVpbGQpOgorCisgICAgICAgICMgUmV0dXJuIGEgY29weSwgZG9uJ3QgbW9kaWZ5IHRoZSBvcmlnaW5hbAorICAgICAgICBwa2dzX3RvX2J1aWxkID0gcGtnc190b19idWlsZFs6XQorCisgICAgICAgIGlmIGxlbihwa2dzX3RvX2J1aWxkKSA9PSAwOgorICAgICAgICAgICAgcmFpc2UgTm90aGluZ1RvQnVpbGQKKworICAgICAgICBpZ25vcmUgPSAoc2VsZi5leHBhbmRlZF9kYXRhLmdldFZhcigiQVNTVU1FX1BST1ZJREVEIiwgVHJ1ZSkgb3IgIiIpLnNwbGl0KCkKKyAgICAgICAgZm9yIHBrZyBpbiBwa2dzX3RvX2J1aWxkOgorICAgICAgICAgICAgaWYgcGtnIGluIGlnbm9yZToKKyAgICAgICAgICAgICAgICBwYXJzZWxvZy53YXJuKCJFeHBsaWNpdCB0YXJnZXQgXCIlc1wiIGlzIGluIEFTU1VNRV9QUk9WSURFRCwgaWdub3JpbmciICUgcGtnKQorCisgICAgICAgIGlmICd3b3JsZCcgaW4gcGtnc190b19idWlsZDoKKyAgICAgICAgICAgIHNlbGYuYnVpbGRXb3JsZFRhcmdldExpc3QoKQorICAgICAgICAgICAgcGtnc190b19idWlsZC5yZW1vdmUoJ3dvcmxkJykKKyAgICAgICAgICAgIGZvciB0IGluIHNlbGYucmVjaXBlY2FjaGUud29ybGRfdGFyZ2V0OgorICAgICAgICAgICAgICAgIHBrZ3NfdG9fYnVpbGQuYXBwZW5kKHQpCisKKyAgICAgICAgaWYgJ3VuaXZlcnNlJyBpbiBwa2dzX3RvX2J1aWxkOgorICAgICAgICAgICAgcGFyc2Vsb2cud2FybigiVGhlIFwidW5pdmVyc2VcIiB0YXJnZXQgaXMgb25seSBpbnRlbmRlZCBmb3IgdGVzdGluZyBhbmQgbWF5IHByb2R1Y2UgZXJyb3JzLiIpCisgICAgICAgICAgICBwYXJzZWxvZy5kZWJ1ZygxLCAiY29sbGF0aW5nIHBhY2thZ2VzIGZvciBcInVuaXZlcnNlXCIiKQorICAgICAgICAgICAgcGtnc190b19idWlsZC5yZW1vdmUoJ3VuaXZlcnNlJykKKyAgICAgICAgICAgIGZvciB0IGluIHNlbGYucmVjaXBlY2FjaGUudW5pdmVyc2VfdGFyZ2V0OgorICAgICAgICAgICAgICAgIHBrZ3NfdG9fYnVpbGQuYXBwZW5kKHQpCisKKyAgICAgICAgcmV0dXJuIHBrZ3NfdG9fYnVpbGQKKworCisKKworICAgIGRlZiBwcmVfc2VydmUoc2VsZik6CisgICAgICAgICMgRW1wdHkgdGhlIGVudmlyb25tZW50LiBUaGUgZW52aXJvbm1lbnQgd2lsbCBiZSBwb3B1bGF0ZWQgYXMKKyAgICAgICAgIyBuZWNlc3NhcnkgZnJvbSB0aGUgZGF0YSBzdG9yZS4KKyAgICAgICAgI2JiLnV0aWxzLmVtcHR5X2Vudmlyb25tZW50KCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5wcmhvc3QgPSBwcnNlcnYuc2Vydi5hdXRvX3N0YXJ0KHNlbGYuZGF0YSkKKyAgICAgICAgZXhjZXB0IHByc2Vydi5zZXJ2LlBSU2VydmljZUNvbmZpZ0Vycm9yOgorICAgICAgICAgICAgYmIuZXZlbnQuZmlyZShDb29rZXJFeGl0KCksIHNlbGYuZXhwYW5kZWRfZGF0YSkKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzdGF0ZS5lcnJvcgorICAgICAgICByZXR1cm4KKworICAgIGRlZiBwb3N0X3NlcnZlKHNlbGYpOgorICAgICAgICBwcnNlcnYuc2Vydi5hdXRvX3NodXRkb3duKHNlbGYuZGF0YSkKKyAgICAgICAgYmIuZXZlbnQuZmlyZShDb29rZXJFeGl0KCksIHNlbGYuZXhwYW5kZWRfZGF0YSkKKyAgICAgICAgbG9ja2ZpbGUgPSBzZWxmLmxvY2submFtZQorICAgICAgICBzZWxmLmxvY2suY2xvc2UoKQorICAgICAgICBzZWxmLmxvY2sgPSBOb25lCisKKyAgICAgICAgd2hpbGUgbm90IHNlbGYubG9jazoKKyAgICAgICAgICAgIHdpdGggYmIudXRpbHMudGltZW91dCgzKToKKyAgICAgICAgICAgICAgICBzZWxmLmxvY2sgPSBiYi51dGlscy5sb2NrZmlsZShsb2NrZmlsZSwgc2hhcmVkPUZhbHNlLCByZXRyeT1GYWxzZSwgYmxvY2s9VHJ1ZSkKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5sb2NrOgorICAgICAgICAgICAgICAgICAgICAjIFNvbWUgc3lzdGVtcyBtYXkgbm90IGhhdmUgbHNvZiBhdmFpbGFibGUKKyAgICAgICAgICAgICAgICAgICAgcHJvY3MgPSBOb25lCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2NzID0gc3VicHJvY2Vzcy5jaGVja19vdXRwdXQoWyJsc29mIiwgJy13JywgbG9ja2ZpbGVdLCBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVOT0VOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgICAgICBpZiBwcm9jcyBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBGYWxsIGJhY2sgdG8gZnVzZXIgaWYgbHNvZiBpcyB1bmF2YWlsYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2NzID0gc3VicHJvY2Vzcy5jaGVja19vdXRwdXQoWyJmdXNlciIsICctdicsIGxvY2tmaWxlXSwgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VUKQorICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVOT0VOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UKKworICAgICAgICAgICAgICAgICAgICBtc2cgPSAiRGVsYXlpbmcgc2h1dGRvd24gZHVlIHRvIGFjdGl2ZSBwcm9jZXNzZXMgd2hpY2ggYXBwZWFyIHRvIGJlIGhvbGRpbmcgYml0YmFrZS5sb2NrIgorICAgICAgICAgICAgICAgICAgICBpZiBwcm9jczoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZyArPSAiOlxuJXMiICUgc3RyKHByb2NzKQorICAgICAgICAgICAgICAgICAgICBwcmludChtc2cpCisKKworICAgIGRlZiBzaHV0ZG93bihzZWxmLCBmb3JjZSA9IEZhbHNlKToKKyAgICAgICAgaWYgZm9yY2U6CisgICAgICAgICAgICBzZWxmLnN0YXRlID0gc3RhdGUuZm9yY2VzaHV0ZG93bgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHN0YXRlLnNodXRkb3duCisKKyAgICBkZWYgZmluaXNoY29tbWFuZChzZWxmKToKKyAgICAgICAgc2VsZi5zdGF0ZSA9IHN0YXRlLmluaXRpYWwKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgc2VsZi5pbml0Q29uZmlndXJhdGlvbkRhdGEoKQorCisgICAgZGVmIGxvY2tCaXRiYWtlKHNlbGYpOgorICAgICAgICBpZiBub3QgaGFzYXR0cihzZWxmLCAnbG9jaycpOgorICAgICAgICAgICAgc2VsZi5sb2NrID0gTm9uZQorICAgICAgICAgICAgaWYgc2VsZi5kYXRhOgorICAgICAgICAgICAgICAgIGxvY2tmaWxlID0gc2VsZi5kYXRhLmV4cGFuZCgiJHtUT1BESVJ9L2JpdGJha2UubG9jayIpCisgICAgICAgICAgICAgICAgaWYgbG9ja2ZpbGU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9jayA9IGJiLnV0aWxzLmxvY2tmaWxlKGxvY2tmaWxlLCBGYWxzZSwgRmFsc2UpCisgICAgICAgIHJldHVybiBzZWxmLmxvY2sKKworICAgIGRlZiB1bmxvY2tCaXRiYWtlKHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyKHNlbGYsICdsb2NrJykgYW5kIHNlbGYubG9jazoKKyAgICAgICAgICAgIGJiLnV0aWxzLnVubG9ja2ZpbGUoc2VsZi5sb2NrKQorCitkZWYgc2VydmVyX21haW4oY29va2VyLCBmdW5jLCAqYXJncyk6CisgICAgY29va2VyLnByZV9zZXJ2ZSgpCisKKyAgICBpZiBjb29rZXIuY29uZmlndXJhdGlvbi5wcm9maWxlOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgY1Byb2ZpbGUgYXMgcHJvZmlsZQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBpbXBvcnQgcHJvZmlsZQorICAgICAgICBwcm9mID0gcHJvZmlsZS5Qcm9maWxlKCkKKworICAgICAgICByZXQgPSBwcm9maWxlLlByb2ZpbGUucnVuY2FsbChwcm9mLCBmdW5jLCAqYXJncykKKworICAgICAgICBwcm9mLmR1bXBfc3RhdHMoInByb2ZpbGUubG9nIikKKyAgICAgICAgYmIudXRpbHMucHJvY2Vzc19wcm9maWxlbG9nKCJwcm9maWxlLmxvZyIpCisgICAgICAgIHByaW50KCJSYXcgcHJvZmlsaW5nIGluZm9ybWF0aW9uIHNhdmVkIHRvIHByb2ZpbGUubG9nIGFuZCBwcm9jZXNzZWQgc3RhdGlzdGljcyB0byBwcm9maWxlLmxvZy5wcm9jZXNzZWQiKQorCisgICAgZWxzZToKKyAgICAgICAgcmV0ID0gZnVuYygqYXJncykKKworICAgIGNvb2tlci5wb3N0X3NlcnZlKCkKKworICAgIHJldHVybiByZXQKKworY2xhc3MgQ29va2VyRXhpdChiYi5ldmVudC5FdmVudCk6CisgICAgIiIiCisgICAgTm90aWZ5IGNsaWVudHMgb2YgdGhlIENvb2tlciBzaHV0ZG93bgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBiYi5ldmVudC5FdmVudC5fX2luaXRfXyhzZWxmKQorCisKK2NsYXNzIENvb2tlckNvbGxlY3RGaWxlcyhvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcmlvcml0aWVzKToKKyAgICAgICAgc2VsZi5iYmFwcGVuZHMgPSBbXQorICAgICAgICBzZWxmLmJiZmlsZV9jb25maWdfcHJpb3JpdGllcyA9IHByaW9yaXRpZXMKKworICAgIGRlZiBjYWxjX2JiZmlsZV9wcmlvcml0eSggc2VsZiwgZmlsZW5hbWUsIG1hdGNoZWQgPSBOb25lICk6CisgICAgICAgIGZvciBfLCBfLCByZWdleCwgcHJpIGluIHNlbGYuYmJmaWxlX2NvbmZpZ19wcmlvcml0aWVzOgorICAgICAgICAgICAgaWYgcmVnZXgubWF0Y2goZmlsZW5hbWUpOgorICAgICAgICAgICAgICAgIGlmIG1hdGNoZWQgIT0gTm9uZToKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHJlZ2V4IGluIG1hdGNoZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkLmFkZChyZWdleCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJpCisgICAgICAgIHJldHVybiAwCisKKyAgICBkZWYgZ2V0X2JiZmlsZXMoc2VsZik6CisgICAgICAgICIiIkdldCBsaXN0IG9mIGRlZmF1bHQgLmJiIGZpbGVzIGJ5IHJlYWRpbmcgb3V0IHRoZSBjdXJyZW50IGRpcmVjdG9yeSIiIgorICAgICAgICBwYXRoID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgY29udGVudHMgPSBvcy5saXN0ZGlyKHBhdGgpCisgICAgICAgIGJiZmlsZXMgPSBbXQorICAgICAgICBmb3IgZiBpbiBjb250ZW50czoKKyAgICAgICAgICAgIGlmIGYuZW5kc3dpdGgoIi5iYiIpOgorICAgICAgICAgICAgICAgIGJiZmlsZXMuYXBwZW5kKG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4ocGF0aCwgZikpKQorICAgICAgICByZXR1cm4gYmJmaWxlcworCisgICAgZGVmIGZpbmRfYmJmaWxlcyhzZWxmLCBwYXRoKToKKyAgICAgICAgIiIiRmluZCBhbGwgdGhlIC5iYiBhbmQgLmJiYXBwZW5kIGZpbGVzIGluIGEgZGlyZWN0b3J5IiIiCisgICAgICAgIGZvdW5kID0gW10KKyAgICAgICAgZm9yIGRpciwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhwYXRoKToKKyAgICAgICAgICAgIGZvciBpZ25vcmVkIGluICgnU0NDUycsICdDVlMnLCAnLnN2bicpOgorICAgICAgICAgICAgICAgIGlmIGlnbm9yZWQgaW4gZGlyczoKKyAgICAgICAgICAgICAgICAgICAgZGlycy5yZW1vdmUoaWdub3JlZCkKKyAgICAgICAgICAgIGZvdW5kICs9IFtvcy5wYXRoLmpvaW4oZGlyLCBmKSBmb3IgZiBpbiBmaWxlcyBpZiAoZi5lbmRzd2l0aChbJy5iYicsICcuYmJhcHBlbmQnXSkpXQorCisgICAgICAgIHJldHVybiBmb3VuZAorCisgICAgZGVmIGNvbGxlY3RfYmJmaWxlcyhzZWxmLCBjb25maWcsIGV2ZW50ZGF0YSk6CisgICAgICAgICIiIkNvbGxlY3QgYWxsIGF2YWlsYWJsZSAuYmIgYnVpbGQgZmlsZXMiIiIKKyAgICAgICAgbWFza2VkID0gMAorCisgICAgICAgIGNvbGxlY3Rsb2cuZGVidWcoMSwgImNvbGxlY3RpbmcgLmJiIGZpbGVzIikKKworICAgICAgICBmaWxlcyA9IChjb25maWcuZ2V0VmFyKCAiQkJGSUxFUyIsIFRydWUpIG9yICIiKS5zcGxpdCgpCisgICAgICAgIGNvbmZpZy5zZXRWYXIoIkJCRklMRVMiLCAiICIuam9pbihmaWxlcykpCisKKyAgICAgICAgIyBTb3J0IGZpbGVzIGJ5IHByaW9yaXR5CisgICAgICAgIGZpbGVzLnNvcnQoIGtleT1sYW1iZGEgZmlsZWl0ZW06IHNlbGYuY2FsY19iYmZpbGVfcHJpb3JpdHkoZmlsZWl0ZW0pICkKKworICAgICAgICBpZiBub3QgbGVuKGZpbGVzKToKKyAgICAgICAgICAgIGZpbGVzID0gc2VsZi5nZXRfYmJmaWxlcygpCisKKyAgICAgICAgaWYgbm90IGxlbihmaWxlcyk6CisgICAgICAgICAgICBjb2xsZWN0bG9nLmVycm9yKCJubyByZWNpcGUgZmlsZXMgdG8gYnVpbGQsIGNoZWNrIHlvdXIgQkJQQVRIIGFuZCBCQkZJTEVTPyIpCisgICAgICAgICAgICBiYi5ldmVudC5maXJlKENvb2tlckV4aXQoKSwgZXZlbnRkYXRhKQorCisgICAgICAgICMgQ2FuJ3QgdXNlIHNldCBoZXJlIGFzIG9yZGVyIGlzIGltcG9ydGFudAorICAgICAgICBuZXdmaWxlcyA9IFtdCisgICAgICAgIGZvciBmIGluIGZpbGVzOgorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihmKToKKyAgICAgICAgICAgICAgICBkaXJmaWxlcyA9IHNlbGYuZmluZF9iYmZpbGVzKGYpCisgICAgICAgICAgICAgICAgZm9yIGcgaW4gZGlyZmlsZXM6CisgICAgICAgICAgICAgICAgICAgIGlmIGcgbm90IGluIG5ld2ZpbGVzOgorICAgICAgICAgICAgICAgICAgICAgICAgbmV3ZmlsZXMuYXBwZW5kKGcpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGdsb2JiZWQgPSBnbG9iLmdsb2IoZikKKyAgICAgICAgICAgICAgICBpZiBub3QgZ2xvYmJlZCBhbmQgb3MucGF0aC5leGlzdHMoZik6CisgICAgICAgICAgICAgICAgICAgIGdsb2JiZWQgPSBbZl0KKyAgICAgICAgICAgICAgICBmb3IgZyBpbiBnbG9iYmVkOgorICAgICAgICAgICAgICAgICAgICBpZiBnIG5vdCBpbiBuZXdmaWxlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld2ZpbGVzLmFwcGVuZChnKQorCisgICAgICAgIGJibWFzayA9IGNvbmZpZy5nZXRWYXIoJ0JCTUFTSycsIFRydWUpCisKKyAgICAgICAgaWYgYmJtYXNrOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGJibWFza19jb21waWxlZCA9IHJlLmNvbXBpbGUoYmJtYXNrKQorICAgICAgICAgICAgZXhjZXB0IHNyZV9jb25zdGFudHMuZXJyb3I6CisgICAgICAgICAgICAgICAgY29sbGVjdGxvZy5jcml0aWNhbCgiQkJNQVNLIGlzIG5vdCBhIHZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbiwgaWdub3JpbmcuIikKKyAgICAgICAgICAgICAgICByZXR1cm4gbGlzdChuZXdmaWxlcyksIDAKKworICAgICAgICBiYmZpbGVzID0gW10KKyAgICAgICAgYmJhcHBlbmQgPSBbXQorICAgICAgICBmb3IgZiBpbiBuZXdmaWxlczoKKyAgICAgICAgICAgIGlmIGJibWFzayBhbmQgYmJtYXNrX2NvbXBpbGVkLnNlYXJjaChmKToKKyAgICAgICAgICAgICAgICBjb2xsZWN0bG9nLmRlYnVnKDEsICJza2lwcGluZyBtYXNrZWQgZmlsZSAlcyIsIGYpCisgICAgICAgICAgICAgICAgbWFza2VkICs9IDEKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgZi5lbmRzd2l0aCgnLmJiJyk6CisgICAgICAgICAgICAgICAgYmJmaWxlcy5hcHBlbmQoZikKKyAgICAgICAgICAgIGVsaWYgZi5lbmRzd2l0aCgnLmJiYXBwZW5kJyk6CisgICAgICAgICAgICAgICAgYmJhcHBlbmQuYXBwZW5kKGYpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNvbGxlY3Rsb2cuZGVidWcoMSwgInNraXBwaW5nICVzOiB1bmtub3duIGZpbGUgZXh0ZW5zaW9uIiwgZikKKworICAgICAgICAjIEJ1aWxkIGEgbGlzdCBvZiAuYmJhcHBlbmQgZmlsZXMgZm9yIGVhY2ggLmJiIGZpbGUKKyAgICAgICAgZm9yIGYgaW4gYmJhcHBlbmQ6CisgICAgICAgICAgICBiYXNlID0gb3MucGF0aC5iYXNlbmFtZShmKS5yZXBsYWNlKCcuYmJhcHBlbmQnLCAnLmJiJykKKyAgICAgICAgICAgIHNlbGYuYmJhcHBlbmRzLmFwcGVuZCgoYmFzZSwgZikpCisKKyAgICAgICAgIyBGaW5kIG92ZXJsYXllZCByZWNpcGVzCisgICAgICAgICMgYmJmaWxlcyB3aWxsIGJlIGluIHByaW9yaXR5IG9yZGVyIHdoaWNoIG1ha2VzIHRoaXMgZWFzeQorICAgICAgICBiYmZpbGVfc2VlbiA9IGRpY3QoKQorICAgICAgICBzZWxmLm92ZXJsYXllZCA9IGRlZmF1bHRkaWN0KGxpc3QpCisgICAgICAgIGZvciBmIGluIHJldmVyc2VkKGJiZmlsZXMpOgorICAgICAgICAgICAgYmFzZSA9IG9zLnBhdGguYmFzZW5hbWUoZikKKyAgICAgICAgICAgIGlmIGJhc2Ugbm90IGluIGJiZmlsZV9zZWVuOgorICAgICAgICAgICAgICAgIGJiZmlsZV9zZWVuW2Jhc2VdID0gZgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0b3BmaWxlID0gYmJmaWxlX3NlZW5bYmFzZV0KKyAgICAgICAgICAgICAgICBzZWxmLm92ZXJsYXllZFt0b3BmaWxlXS5hcHBlbmQoZikKKworICAgICAgICByZXR1cm4gKGJiZmlsZXMsIG1hc2tlZCkKKworICAgIGRlZiBnZXRfZmlsZV9hcHBlbmRzKHNlbGYsIGZuKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybnMgYSBsaXN0IG9mIC5iYmFwcGVuZCBmaWxlcyB0byBhcHBseSB0byBmbgorICAgICAgICAiIiIKKyAgICAgICAgZmlsZWxpc3QgPSBbXQorICAgICAgICBmID0gb3MucGF0aC5iYXNlbmFtZShmbikKKyAgICAgICAgZm9yIGIgaW4gc2VsZi5iYmFwcGVuZHM6CisgICAgICAgICAgICAoYmJhcHBlbmQsIGZpbGVuYW1lKSA9IGIKKyAgICAgICAgICAgIGlmIChiYmFwcGVuZCA9PSBmKSBvciAoJyUnIGluIGJiYXBwZW5kIGFuZCBiYmFwcGVuZC5zdGFydHN3aXRoKGZbOmJiYXBwZW5kLmluZGV4KCclJyldKSk6CisgICAgICAgICAgICAgICAgZmlsZWxpc3QuYXBwZW5kKGZpbGVuYW1lKQorICAgICAgICByZXR1cm4gZmlsZWxpc3QKKworICAgIGRlZiBjb2xsZWN0aW9uX3ByaW9yaXRpZXMoc2VsZiwgcGtnZm5zLCBkKToKKworICAgICAgICBwcmlvcml0aWVzID0ge30KKworICAgICAgICAjIENhbGN1bGF0ZSBwcmlvcml0aWVzIGZvciBlYWNoIGZpbGUKKyAgICAgICAgbWF0Y2hlZCA9IHNldCgpCisgICAgICAgIGZvciBwIGluIHBrZ2ZuczoKKyAgICAgICAgICAgIHJlYWxmbiwgY2xzID0gYmIuY2FjaGUuQ2FjaGUudmlydHVhbGZuMnJlYWxmbihwKQorICAgICAgICAgICAgcHJpb3JpdGllc1twXSA9IHNlbGYuY2FsY19iYmZpbGVfcHJpb3JpdHkocmVhbGZuLCBtYXRjaGVkKQorCisgICAgICAgICMgRG9uJ3Qgc2hvdyB0aGUgd2FybmluZyBpZiB0aGUgQkJGSUxFX1BBVFRFUk4gZGlkIG1hdGNoIC5iYmFwcGVuZCBmaWxlcworICAgICAgICB1bm1hdGNoZWQgPSBzZXQoKQorICAgICAgICBmb3IgXywgXywgcmVnZXgsIHByaSBpbiBzZWxmLmJiZmlsZV9jb25maWdfcHJpb3JpdGllczoKKyAgICAgICAgICAgIGlmIG5vdCByZWdleCBpbiBtYXRjaGVkOgorICAgICAgICAgICAgICAgIHVubWF0Y2hlZC5hZGQocmVnZXgpCisKKyAgICAgICAgZGVmIGZpbmRtYXRjaChyZWdleCk6CisgICAgICAgICAgICBmb3IgYiBpbiBzZWxmLmJiYXBwZW5kczoKKyAgICAgICAgICAgICAgICAoYmJmaWxlLCBhcHBlbmQpID0gYgorICAgICAgICAgICAgICAgIGlmIHJlZ2V4Lm1hdGNoKGFwcGVuZCk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBmb3IgdW5tYXRjaCBpbiB1bm1hdGNoZWQuY29weSgpOgorICAgICAgICAgICAgaWYgZmluZG1hdGNoKHVubWF0Y2gpOgorICAgICAgICAgICAgICAgIHVubWF0Y2hlZC5yZW1vdmUodW5tYXRjaCkKKworICAgICAgICBmb3IgY29sbGVjdGlvbiwgcGF0dGVybiwgcmVnZXgsIF8gaW4gc2VsZi5iYmZpbGVfY29uZmlnX3ByaW9yaXRpZXM6CisgICAgICAgICAgICBpZiByZWdleCBpbiB1bm1hdGNoZWQ6CisgICAgICAgICAgICAgICAgaWYgZC5nZXRWYXIoJ0JCRklMRV9QQVRURVJOX0lHTk9SRV9FTVBUWV8lcycgJSBjb2xsZWN0aW9uLCBUcnVlKSAhPSAnMSc6CisgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rsb2cud2FybigiTm8gYmIgZmlsZXMgbWF0Y2hlZCBCQkZJTEVfUEFUVEVSTl8lcyAnJXMnIiAlIChjb2xsZWN0aW9uLCBwYXR0ZXJuKSkKKworICAgICAgICByZXR1cm4gcHJpb3JpdGllcworCitjbGFzcyBQYXJzaW5nRmFpbHVyZShFeGNlcHRpb24pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZWFsZXhjZXB0aW9uLCByZWNpcGUpOgorICAgICAgICBzZWxmLnJlYWxleGNlcHRpb24gPSByZWFsZXhjZXB0aW9uCisgICAgICAgIHNlbGYucmVjaXBlID0gcmVjaXBlCisgICAgICAgIEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCByZWFsZXhjZXB0aW9uLCByZWNpcGUpCisKK2NsYXNzIEZlZWRlcihtdWx0aXByb2Nlc3NpbmcuUHJvY2Vzcyk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGpvYnMsIHRvX3BhcnNlcnMsIHF1aXQpOgorICAgICAgICBzZWxmLnF1aXQgPSBxdWl0CisgICAgICAgIHNlbGYuam9icyA9IGpvYnMKKyAgICAgICAgc2VsZi50b19wYXJzZXJzID0gdG9fcGFyc2VycworICAgICAgICBtdWx0aXByb2Nlc3NpbmcuUHJvY2Vzcy5fX2luaXRfXyhzZWxmKQorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBxdWl0ID0gc2VsZi5xdWl0LmdldF9ub3dhaXQoKQorICAgICAgICAgICAgZXhjZXB0IFF1ZXVlLkVtcHR5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgcXVpdCA9PSAnY2FuY2VsJzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50b19wYXJzZXJzLmNhbmNlbF9qb2luX3RocmVhZCgpCisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGpvYiA9IHNlbGYuam9icy5wb3AoKQorICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYudG9fcGFyc2Vycy5wdXQoam9iLCB0aW1lb3V0PTAuNSkKKyAgICAgICAgICAgIGV4Y2VwdCBRdWV1ZS5GdWxsOgorICAgICAgICAgICAgICAgIHNlbGYuam9icy5pbnNlcnQoMCwgam9iKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKK2NsYXNzIFBhcnNlcihtdWx0aXByb2Nlc3NpbmcuUHJvY2Vzcyk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGpvYnMsIHJlc3VsdHMsIHF1aXQsIGluaXQsIHByb2ZpbGUpOgorICAgICAgICBzZWxmLmpvYnMgPSBqb2JzCisgICAgICAgIHNlbGYucmVzdWx0cyA9IHJlc3VsdHMKKyAgICAgICAgc2VsZi5xdWl0ID0gcXVpdAorICAgICAgICBzZWxmLmluaXQgPSBpbml0CisgICAgICAgIG11bHRpcHJvY2Vzc2luZy5Qcm9jZXNzLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuY29udGV4dCA9IGJiLnV0aWxzLmdldF9jb250ZXh0KCkuY29weSgpCisgICAgICAgIHNlbGYuaGFuZGxlcnMgPSBiYi5ldmVudC5nZXRfY2xhc3NfaGFuZGxlcnMoKS5jb3B5KCkKKyAgICAgICAgc2VsZi5wcm9maWxlID0gcHJvZmlsZQorCisgICAgZGVmIHJ1bihzZWxmKToKKworICAgICAgICBpZiBub3Qgc2VsZi5wcm9maWxlOgorICAgICAgICAgICAgc2VsZi5yZWFscnVuKCkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCBjUHJvZmlsZSBhcyBwcm9maWxlCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGltcG9ydCBwcm9maWxlCisgICAgICAgIHByb2YgPSBwcm9maWxlLlByb2ZpbGUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwcm9maWxlLlByb2ZpbGUucnVuY2FsbChwcm9mLCBzZWxmLnJlYWxydW4pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBsb2dmaWxlID0gInByb2ZpbGUtcGFyc2UtJXMubG9nIiAlIG11bHRpcHJvY2Vzc2luZy5jdXJyZW50X3Byb2Nlc3MoKS5uYW1lCisgICAgICAgICAgICBwcm9mLmR1bXBfc3RhdHMobG9nZmlsZSkKKworICAgIGRlZiByZWFscnVuKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmluaXQ6CisgICAgICAgICAgICBzZWxmLmluaXQoKQorCisgICAgICAgIHBlbmRpbmcgPSBbXQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYucXVpdC5nZXRfbm93YWl0KCkKKyAgICAgICAgICAgIGV4Y2VwdCBRdWV1ZS5FbXB0eToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0cy5jYW5jZWxfam9pbl90aHJlYWQoKQorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgIGlmIHBlbmRpbmc6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gcGVuZGluZy5wb3AoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGpvYiA9IHNlbGYuam9icy5nZXQodGltZW91dD0wLjI1KQorICAgICAgICAgICAgICAgIGV4Y2VwdCBRdWV1ZS5FbXB0eToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIGlmIGpvYiBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYucGFyc2UoKmpvYikKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0cy5wdXQocmVzdWx0LCB0aW1lb3V0PTAuMjUpCisgICAgICAgICAgICBleGNlcHQgUXVldWUuRnVsbDoKKyAgICAgICAgICAgICAgICBwZW5kaW5nLmFwcGVuZChyZXN1bHQpCisKKyAgICBkZWYgcGFyc2Uoc2VsZiwgZmlsZW5hbWUsIGFwcGVuZHMsIGNhY2hlc19hcnJheSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgUmVzZXQgb3VyIGVudmlyb25tZW50IGFuZCBoYW5kbGVycyB0byB0aGUgb3JpZ2luYWwgc2V0dGluZ3MKKyAgICAgICAgICAgIGJiLnV0aWxzLnNldF9jb250ZXh0KHNlbGYuY29udGV4dC5jb3B5KCkpCisgICAgICAgICAgICBiYi5ldmVudC5zZXRfY2xhc3NfaGFuZGxlcnMoc2VsZi5oYW5kbGVycy5jb3B5KCkpCisgICAgICAgICAgICByZXR1cm4gVHJ1ZSwgYmIuY2FjaGUuQ2FjaGUucGFyc2UoZmlsZW5hbWUsIGFwcGVuZHMsIHNlbGYuY2ZnLCBjYWNoZXNfYXJyYXkpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOgorICAgICAgICAgICAgdGIgPSBzeXMuZXhjX2luZm8oKVsyXQorICAgICAgICAgICAgZXhjLnJlY2lwZSA9IGZpbGVuYW1lCisgICAgICAgICAgICBleGMudHJhY2ViYWNrID0gbGlzdChiYi5leGNlcHRpb25zLmV4dHJhY3RfdHJhY2ViYWNrKHRiLCBjb250ZXh0PTMpKQorICAgICAgICAgICAgcmV0dXJuIFRydWUsIGV4YworICAgICAgICAjIE5lZWQgdG8gdHVybiBCYXNlRXhjZXB0aW9ucyBpbnRvIEV4Y2VwdGlvbnMgaGVyZSBzbyB3ZSBncmFjZWZ1bGx5IHNodXRkb3duCisgICAgICAgICMgYW5kIGZvciBleGFtcGxlIGEgd29ya2VyIHRocmVhZCBkb2Vzbid0IGp1c3QgZXhpdCBvbiBpdHMgb3duIGluIHJlc3BvbnNlIHRvCisgICAgICAgICMgYSBTeXN0ZW1FeGl0IGV2ZW50IGZvciBleGFtcGxlLgorICAgICAgICBleGNlcHQgQmFzZUV4Y2VwdGlvbiBhcyBleGM6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZSwgUGFyc2luZ0ZhaWx1cmUoZXhjLCBmaWxlbmFtZSkKKworY2xhc3MgQ29va2VyUGFyc2VyKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvb2tlciwgZmlsZWxpc3QsIG1hc2tlZCk6CisgICAgICAgIHNlbGYuZmlsZWxpc3QgPSBmaWxlbGlzdAorICAgICAgICBzZWxmLmNvb2tlciA9IGNvb2tlcgorICAgICAgICBzZWxmLmNmZ2RhdGEgPSBjb29rZXIuZGF0YQorICAgICAgICBzZWxmLmNmZ2hhc2ggPSBjb29rZXIuZGF0YV9oYXNoCisKKyAgICAgICAgIyBBY2NvdW50aW5nIHN0YXRpc3RpY3MKKyAgICAgICAgc2VsZi5wYXJzZWQgPSAwCisgICAgICAgIHNlbGYuY2FjaGVkID0gMAorICAgICAgICBzZWxmLmVycm9yID0gMAorICAgICAgICBzZWxmLm1hc2tlZCA9IG1hc2tlZAorCisgICAgICAgIHNlbGYuc2tpcHBlZCA9IDAKKyAgICAgICAgc2VsZi52aXJ0dWFscyA9IDAKKyAgICAgICAgc2VsZi50b3RhbCA9IGxlbihmaWxlbGlzdCkKKworICAgICAgICBzZWxmLmN1cnJlbnQgPSAwCisgICAgICAgIHNlbGYubnVtX3Byb2Nlc3NlcyA9IGludChzZWxmLmNmZ2RhdGEuZ2V0VmFyKCJCQl9OVU1CRVJfUEFSU0VfVEhSRUFEUyIsIFRydWUpIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXByb2Nlc3NpbmcuY3B1X2NvdW50KCkpCisgICAgICAgIHNlbGYucHJvY2Vzc19uYW1lcyA9IFtdCisKKyAgICAgICAgc2VsZi5iYl9jYWNoZSA9IGJiLmNhY2hlLkNhY2hlKHNlbGYuY2ZnZGF0YSwgc2VsZi5jZmdoYXNoLCBjb29rZXIuY2FjaGVzX2FycmF5KQorICAgICAgICBzZWxmLmZyb21jYWNoZSA9IFtdCisgICAgICAgIHNlbGYud2lsbHBhcnNlID0gW10KKyAgICAgICAgZm9yIGZpbGVuYW1lIGluIHNlbGYuZmlsZWxpc3Q6CisgICAgICAgICAgICBhcHBlbmRzID0gc2VsZi5jb29rZXIuY29sbGVjdGlvbi5nZXRfZmlsZV9hcHBlbmRzKGZpbGVuYW1lKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuYmJfY2FjaGUuY2FjaGVWYWxpZChmaWxlbmFtZSwgYXBwZW5kcyk6CisgICAgICAgICAgICAgICAgc2VsZi53aWxscGFyc2UuYXBwZW5kKChmaWxlbmFtZSwgYXBwZW5kcywgY29va2VyLmNhY2hlc19hcnJheSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZnJvbWNhY2hlLmFwcGVuZCgoZmlsZW5hbWUsIGFwcGVuZHMpKQorICAgICAgICBzZWxmLnRvcGFyc2UgPSBzZWxmLnRvdGFsIC0gbGVuKHNlbGYuZnJvbWNhY2hlKQorICAgICAgICBzZWxmLnByb2dyZXNzX2NodW5rID0gbWF4KHNlbGYudG9wYXJzZSAvIDEwMCwgMSkKKworICAgICAgICBzZWxmLnN0YXJ0KCkKKyAgICAgICAgc2VsZi5oYXZlc2h1dGRvd24gPSBGYWxzZQorCisgICAgZGVmIHN0YXJ0KHNlbGYpOgorICAgICAgICBzZWxmLnJlc3VsdHMgPSBzZWxmLmxvYWRfY2FjaGVkKCkKKyAgICAgICAgc2VsZi5wcm9jZXNzZXMgPSBbXQorICAgICAgICBpZiBzZWxmLnRvcGFyc2U6CisgICAgICAgICAgICBiYi5ldmVudC5maXJlKGJiLmV2ZW50LlBhcnNlU3RhcnRlZChzZWxmLnRvcGFyc2UpLCBzZWxmLmNmZ2RhdGEpCisgICAgICAgICAgICBkZWYgaW5pdCgpOgorICAgICAgICAgICAgICAgIFBhcnNlci5jZmcgPSBzZWxmLmNmZ2RhdGEKKyAgICAgICAgICAgICAgICBtdWx0aXByb2Nlc3NpbmcudXRpbC5GaW5hbGl6ZShOb25lLCBiYi5jb2RlcGFyc2VyLnBhcnNlcl9jYWNoZV9zYXZlLCBhcmdzPShzZWxmLmNmZ2RhdGEsKSwgZXhpdHByaW9yaXR5PTEpCisgICAgICAgICAgICAgICAgbXVsdGlwcm9jZXNzaW5nLnV0aWwuRmluYWxpemUoTm9uZSwgYmIuZmV0Y2guZmV0Y2hlcl9wYXJzZV9zYXZlLCBhcmdzPShzZWxmLmNmZ2RhdGEsKSwgZXhpdHByaW9yaXR5PTEpCisKKyAgICAgICAgICAgIHNlbGYuZmVlZGVyX3F1aXQgPSBtdWx0aXByb2Nlc3NpbmcuUXVldWUobWF4c2l6ZT0xKQorICAgICAgICAgICAgc2VsZi5wYXJzZXJfcXVpdCA9IG11bHRpcHJvY2Vzc2luZy5RdWV1ZShtYXhzaXplPXNlbGYubnVtX3Byb2Nlc3NlcykKKyAgICAgICAgICAgIHNlbGYuam9icyA9IG11bHRpcHJvY2Vzc2luZy5RdWV1ZShtYXhzaXplPXNlbGYubnVtX3Byb2Nlc3NlcykKKyAgICAgICAgICAgIHNlbGYucmVzdWx0X3F1ZXVlID0gbXVsdGlwcm9jZXNzaW5nLlF1ZXVlKCkKKyAgICAgICAgICAgIHNlbGYuZmVlZGVyID0gRmVlZGVyKHNlbGYud2lsbHBhcnNlLCBzZWxmLmpvYnMsIHNlbGYuZmVlZGVyX3F1aXQpCisgICAgICAgICAgICBzZWxmLmZlZWRlci5zdGFydCgpCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCBzZWxmLm51bV9wcm9jZXNzZXMpOgorICAgICAgICAgICAgICAgIHBhcnNlciA9IFBhcnNlcihzZWxmLmpvYnMsIHNlbGYucmVzdWx0X3F1ZXVlLCBzZWxmLnBhcnNlcl9xdWl0LCBpbml0LCBzZWxmLmNvb2tlci5jb25maWd1cmF0aW9uLnByb2ZpbGUpCisgICAgICAgICAgICAgICAgcGFyc2VyLnN0YXJ0KCkKKyAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3NfbmFtZXMuYXBwZW5kKHBhcnNlci5uYW1lKQorICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc2VzLmFwcGVuZChwYXJzZXIpCisKKyAgICAgICAgICAgIHNlbGYucmVzdWx0cyA9IGl0ZXJ0b29scy5jaGFpbihzZWxmLnJlc3VsdHMsIHNlbGYucGFyc2VfZ2VuZXJhdG9yKCkpCisKKyAgICBkZWYgc2h1dGRvd24oc2VsZiwgY2xlYW49VHJ1ZSwgZm9yY2U9RmFsc2UpOgorICAgICAgICBpZiBub3Qgc2VsZi50b3BhcnNlOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIHNlbGYuaGF2ZXNodXRkb3duOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuaGF2ZXNodXRkb3duID0gVHJ1ZQorCisgICAgICAgIGlmIGNsZWFuOgorICAgICAgICAgICAgZXZlbnQgPSBiYi5ldmVudC5QYXJzZUNvbXBsZXRlZChzZWxmLmNhY2hlZCwgc2VsZi5wYXJzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2tpcHBlZCwgc2VsZi5tYXNrZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudmlydHVhbHMsIHNlbGYuZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudG90YWwpCisKKyAgICAgICAgICAgIGJiLmV2ZW50LmZpcmUoZXZlbnQsIHNlbGYuY2ZnZGF0YSkKKyAgICAgICAgICAgIHNlbGYuZmVlZGVyX3F1aXQucHV0KE5vbmUpCisgICAgICAgICAgICBmb3IgcHJvY2VzcyBpbiBzZWxmLnByb2Nlc3NlczoKKyAgICAgICAgICAgICAgICBzZWxmLmpvYnMucHV0KE5vbmUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZlZWRlcl9xdWl0LnB1dCgnY2FuY2VsJykKKworICAgICAgICAgICAgc2VsZi5wYXJzZXJfcXVpdC5jYW5jZWxfam9pbl90aHJlYWQoKQorICAgICAgICAgICAgZm9yIHByb2Nlc3MgaW4gc2VsZi5wcm9jZXNzZXM6CisgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXJfcXVpdC5wdXQoTm9uZSkKKworICAgICAgICAgICAgc2VsZi5qb2JzLmNhbmNlbF9qb2luX3RocmVhZCgpCisKKyAgICAgICAgZm9yIHByb2Nlc3MgaW4gc2VsZi5wcm9jZXNzZXM6CisgICAgICAgICAgICBpZiBmb3JjZToKKyAgICAgICAgICAgICAgICBwcm9jZXNzLmpvaW4oLjEpCisgICAgICAgICAgICAgICAgcHJvY2Vzcy50ZXJtaW5hdGUoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcm9jZXNzLmpvaW4oKQorICAgICAgICBzZWxmLmZlZWRlci5qb2luKCkKKworICAgICAgICBzeW5jID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VsZi5iYl9jYWNoZS5zeW5jKQorICAgICAgICBzeW5jLnN0YXJ0KCkKKyAgICAgICAgbXVsdGlwcm9jZXNzaW5nLnV0aWwuRmluYWxpemUoTm9uZSwgc3luYy5qb2luLCBleGl0cHJpb3JpdHk9LTEwMCkKKyAgICAgICAgYmIuY29kZXBhcnNlci5wYXJzZXJfY2FjaGVfc2F2ZW1lcmdlKHNlbGYuY29va2VyLmRhdGEpCisgICAgICAgIGJiLmZldGNoLmZldGNoZXJfcGFyc2VfZG9uZShzZWxmLmNvb2tlci5kYXRhKQorICAgICAgICBpZiBzZWxmLmNvb2tlci5jb25maWd1cmF0aW9uLnByb2ZpbGU6CisgICAgICAgICAgICBwcm9maWxlcyA9IFtdCisgICAgICAgICAgICBmb3IgaSBpbiBzZWxmLnByb2Nlc3NfbmFtZXM6CisgICAgICAgICAgICAgICAgbG9nZmlsZSA9ICJwcm9maWxlLXBhcnNlLSVzLmxvZyIgJSBpCisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMobG9nZmlsZSk6CisgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVzLmFwcGVuZChsb2dmaWxlKQorCisgICAgICAgICAgICBwb3V0ID0gInByb2ZpbGUtcGFyc2UubG9nLnByb2Nlc3NlZCIKKyAgICAgICAgICAgIGJiLnV0aWxzLnByb2Nlc3NfcHJvZmlsZWxvZyhwcm9maWxlcywgcG91dCA9IHBvdXQpCisgICAgICAgICAgICBwcmludCgiUHJvY2Vzc2VkIHBhcnNpbmcgc3RhdGlzdGljcyBzYXZlZCB0byAlcyIgJSAocG91dCkpCisKKyAgICBkZWYgbG9hZF9jYWNoZWQoc2VsZik6CisgICAgICAgIGZvciBmaWxlbmFtZSwgYXBwZW5kcyBpbiBzZWxmLmZyb21jYWNoZToKKyAgICAgICAgICAgIGNhY2hlZCwgaW5mb3MgPSBzZWxmLmJiX2NhY2hlLmxvYWQoZmlsZW5hbWUsIGFwcGVuZHMsIHNlbGYuY2ZnZGF0YSkKKyAgICAgICAgICAgIHlpZWxkIG5vdCBjYWNoZWQsIGluZm9zCisKKyAgICBkZWYgcGFyc2VfZ2VuZXJhdG9yKHNlbGYpOgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgaWYgc2VsZi5wYXJzZWQgPj0gc2VsZi50b3BhcnNlOgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLnJlc3VsdF9xdWV1ZS5nZXQodGltZW91dD0wLjI1KQorICAgICAgICAgICAgZXhjZXB0IFF1ZXVlLkVtcHR5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdmFsdWUgPSByZXN1bHRbMV0KKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBCYXNlRXhjZXB0aW9uKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgdmFsdWUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB5aWVsZCByZXN1bHQKKworICAgIGRlZiBwYXJzZV9uZXh0KHNlbGYpOgorICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICBwYXJzZWQgPSBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBhcnNlZCwgcmVzdWx0ID0gc2VsZi5yZXN1bHRzLm5leHQoKQorICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgIHNlbGYuc2h1dGRvd24oKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGV4Y2VwdCBiYi5CQkhhbmRsZWRFeGNlcHRpb24gYXMgZXhjOgorICAgICAgICAgICAgc2VsZi5lcnJvciArPSAxCisgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBwYXJzZSByZWNpcGU6ICVzJyAlIGV4Yy5yZWNpcGUpCisgICAgICAgICAgICBzZWxmLnNodXRkb3duKGNsZWFuPUZhbHNlKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGV4Y2VwdCBQYXJzaW5nRmFpbHVyZSBhcyBleGM6CisgICAgICAgICAgICBzZWxmLmVycm9yICs9IDEKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcignVW5hYmxlIHRvIHBhcnNlICVzOiAlcycgJQorICAgICAgICAgICAgICAgICAgICAgKGV4Yy5yZWNpcGUsIGJiLmV4Y2VwdGlvbnMudG9fc3RyaW5nKGV4Yy5yZWFsZXhjZXB0aW9uKSkpCisgICAgICAgICAgICBzZWxmLnNodXRkb3duKGNsZWFuPUZhbHNlKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGV4Y2VwdCBiYi5wYXJzZS5QYXJzZUVycm9yIGFzIGV4YzoKKyAgICAgICAgICAgIHNlbGYuZXJyb3IgKz0gMQorICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHN0cihleGMpKQorICAgICAgICAgICAgc2VsZi5zaHV0ZG93bihjbGVhbj1GYWxzZSkKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBleGNlcHQgYmIuZGF0YV9zbWFydC5FeHBhbnNpb25FcnJvciBhcyBleGM6CisgICAgICAgICAgICBzZWxmLmVycm9yICs9IDEKKyAgICAgICAgICAgIF8sIHZhbHVlLCBfID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcignRXhwYW5zaW9uRXJyb3IgZHVyaW5nIHBhcnNpbmcgJXM6ICVzJywgdmFsdWUucmVjaXBlLCBzdHIoZXhjKSkKKyAgICAgICAgICAgIHNlbGYuc2h1dGRvd24oY2xlYW49RmFsc2UpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yIGFzIGV4YzoKKyAgICAgICAgICAgIHNlbGYuZXJyb3IgKz0gMQorICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdVbmFibGUgdG8gcGFyc2UgJXMnLCBleGMucmVjaXBlKQorICAgICAgICAgICAgc2VsZi5zaHV0ZG93bihjbGVhbj1GYWxzZSkKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoKKyAgICAgICAgICAgIHNlbGYuZXJyb3IgKz0gMQorICAgICAgICAgICAgZXR5cGUsIHZhbHVlLCB0YiA9IHN5cy5leGNfaW5mbygpCisgICAgICAgICAgICBpZiBoYXNhdHRyKHZhbHVlLCAicmVjaXBlIik6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdVbmFibGUgdG8gcGFyc2UgJXMnLCB2YWx1ZS5yZWNpcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjX2luZm89KGV0eXBlLCB2YWx1ZSwgZXhjLnRyYWNlYmFjaykpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgTW9zdCBsaWtlbHksIGFuIGV4Y2VwdGlvbiBvY2N1cnJlZCBkdXJpbmcgcmFpc2luZyBhbiBleGNlcHRpb24KKyAgICAgICAgICAgICAgICBpbXBvcnQgdHJhY2ViYWNrCisgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdFeGNlcHRpb24gZHVyaW5nIHBhcnNlOiAlcycgJSB0cmFjZWJhY2suZm9ybWF0X2V4YygpKQorICAgICAgICAgICAgc2VsZi5zaHV0ZG93bihjbGVhbj1GYWxzZSkKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIHNlbGYuY3VycmVudCArPSAxCisgICAgICAgIHNlbGYudmlydHVhbHMgKz0gbGVuKHJlc3VsdCkKKyAgICAgICAgaWYgcGFyc2VkOgorICAgICAgICAgICAgc2VsZi5wYXJzZWQgKz0gMQorICAgICAgICAgICAgaWYgc2VsZi5wYXJzZWQgJSBzZWxmLnByb2dyZXNzX2NodW5rID09IDA6CisgICAgICAgICAgICAgICAgYmIuZXZlbnQuZmlyZShiYi5ldmVudC5QYXJzZVByb2dyZXNzKHNlbGYucGFyc2VkLCBzZWxmLnRvcGFyc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jZmdkYXRhKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5jYWNoZWQgKz0gMQorCisgICAgICAgIGZvciB2aXJ0dWFsZm4sIGluZm9fYXJyYXkgaW4gcmVzdWx0OgorICAgICAgICAgICAgaWYgaW5mb19hcnJheVswXS5za2lwcGVkOgorICAgICAgICAgICAgICAgIHNlbGYuc2tpcHBlZCArPSAxCisgICAgICAgICAgICAgICAgc2VsZi5jb29rZXIuc2tpcGxpc3RbdmlydHVhbGZuXSA9IFNraXBwZWRQYWNrYWdlKGluZm9fYXJyYXlbMF0pCisgICAgICAgICAgICBzZWxmLmJiX2NhY2hlLmFkZF9pbmZvKHZpcnR1YWxmbiwgaW5mb19hcnJheSwgc2VsZi5jb29rZXIucmVjaXBlY2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkPXBhcnNlZCwgd2F0Y2hlciA9IHNlbGYuY29va2VyLmFkZF9maWxld2F0Y2gpCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgcmVwYXJzZShzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIGluZm9zID0gc2VsZi5iYl9jYWNoZS5wYXJzZShmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29va2VyLmNvbGxlY3Rpb24uZ2V0X2ZpbGVfYXBwZW5kcyhmaWxlbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNmZ2RhdGEsIHNlbGYuY29va2VyLmNhY2hlc19hcnJheSkKKyAgICAgICAgZm9yIHZmbiwgaW5mb19hcnJheSBpbiBpbmZvczoKKyAgICAgICAgICAgIHNlbGYuY29va2VyLnJlY2lwZWNhY2hlLmFkZF9mcm9tX3JlY2lwZWluZm8odmZuLCBpbmZvX2FycmF5KQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvY29va2VyZGF0YS5weSBiL2JpdGJha2UvbGliL2JiL2Nvb2tlcmRhdGEucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE5YzI4MwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL2Nvb2tlcmRhdGEucHkKQEAgLTAsMCArMSwzMzYgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0ICBDaHJpcyBMYXJzb24KKyMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0ICBQaGlsIEJsdW5kZWxsCisjIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDUgTWljaGFlbCAnTWlja2V5JyBMYXVlcgorIyBDb3B5cmlnaHQgKEMpIDIwMDUgICAgICAgIEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCisjIENvcHlyaWdodCAoQykgMjAwNSAgICAgICAgUk9BRCBHbWJICisjIENvcHlyaWdodCAoQykgMjAwNiAgICAgICAgUmljaGFyZCBQdXJkaWUKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBvcywgc3lzCitmcm9tIGZ1bmN0b29scyBpbXBvcnQgd3JhcHMKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgYmIKK2Zyb20gYmIgaW1wb3J0IGRhdGEKK2ltcG9ydCBiYi5wYXJzZQorCitsb2dnZXIgICAgICA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJCaXRCYWtlIikKK3BhcnNlbG9nICAgID0gbG9nZ2luZy5nZXRMb2dnZXIoIkJpdEJha2UuUGFyc2luZyIpCisKK2NsYXNzIENvbmZpZ1BhcmFtZXRlcnMob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYXJndj1zeXMuYXJndik6CisgICAgICAgIHNlbGYub3B0aW9ucywgdGFyZ2V0cyA9IHNlbGYucGFyc2VDb21tYW5kTGluZShhcmd2KQorICAgICAgICBzZWxmLmVudmlyb25tZW50ID0gc2VsZi5wYXJzZUVudmlyb25tZW50KCkKKworICAgICAgICBzZWxmLm9wdGlvbnMucGtnc190b19idWlsZCA9IHRhcmdldHMgb3IgW10KKworICAgICAgICBzZWxmLm9wdGlvbnMudHJhY2tpbmcgPSBGYWxzZQorICAgICAgICBpZiBoYXNhdHRyKHNlbGYub3B0aW9ucywgInNob3dfZW52aXJvbm1lbnQiKSBhbmQgc2VsZi5vcHRpb25zLnNob3dfZW52aXJvbm1lbnQ6CisgICAgICAgICAgICBzZWxmLm9wdGlvbnMudHJhY2tpbmcgPSBUcnVlCisKKyAgICAgICAgZm9yIGtleSwgdmFsIGluIHNlbGYub3B0aW9ucy5fX2RpY3RfXy5pdGVtcygpOgorICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBrZXksIHZhbCkKKworICAgIGRlZiBwYXJzZUNvbW1hbmRMaW5lKHNlbGYsIGFyZ3Y9c3lzLmFyZ3YpOgorICAgICAgICByYWlzZSBFeGNlcHRpb24oIkNhbGxlciBtdXN0IGltcGxlbWVudCBjb21tYW5kbGluZSBvcHRpb24gcGFyc2luZyIpCisKKyAgICBkZWYgcGFyc2VFbnZpcm9ubWVudChzZWxmKToKKyAgICAgICAgcmV0dXJuIG9zLmVudmlyb24uY29weSgpCisKKyAgICBkZWYgdXBkYXRlRnJvbVNlcnZlcihzZWxmLCBzZXJ2ZXIpOgorICAgICAgICBpZiBub3Qgc2VsZi5vcHRpb25zLmNtZDoKKyAgICAgICAgICAgIGRlZmF1bHR0YXNrLCBlcnJvciA9IHNlcnZlci5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiQkJfREVGQVVMVF9UQVNLIl0pCisgICAgICAgICAgICBpZiBlcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIlVuYWJsZSB0byBnZXQgdGhlIHZhbHVlIG9mIEJCX0RFRkFVTFRfVEFTSyBmcm9tIHRoZSBzZXJ2ZXI6ICVzIiAlIGVycm9yKQorICAgICAgICAgICAgc2VsZi5vcHRpb25zLmNtZCA9IGRlZmF1bHR0YXNrIG9yICJidWlsZCIKKyAgICAgICAgXywgZXJyb3IgPSBzZXJ2ZXIucnVuQ29tbWFuZChbInNldENvbmZpZyIsICJjbWQiLCBzZWxmLm9wdGlvbnMuY21kXSkKKyAgICAgICAgaWYgZXJyb3I6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIlVuYWJsZSB0byBzZXQgY29uZmlndXJhdGlvbiBvcHRpb24gJ2NtZCcgb24gdGhlIHNlcnZlcjogJXMiICUgZXJyb3IpCisKKyAgICAgICAgaWYgbm90IHNlbGYub3B0aW9ucy5wa2dzX3RvX2J1aWxkOgorICAgICAgICAgICAgYmJwa2dzLCBlcnJvciA9IHNlcnZlci5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiQkJQS0dTIl0pCisgICAgICAgICAgICBpZiBlcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIlVuYWJsZSB0byBnZXQgdGhlIHZhbHVlIG9mIEJCUEtHUyBmcm9tIHRoZSBzZXJ2ZXI6ICVzIiAlIGVycm9yKQorICAgICAgICAgICAgaWYgYmJwa2dzOgorICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5wa2dzX3RvX2J1aWxkLmV4dGVuZChiYnBrZ3Muc3BsaXQoKSkKKworICAgIGRlZiB1cGRhdGVUb1NlcnZlcihzZWxmLCBzZXJ2ZXIsIGVudmlyb25tZW50KToKKyAgICAgICAgb3B0aW9ucyA9IHt9CisgICAgICAgIGZvciBvIGluIFsiYWJvcnQiLCAidHJ5YWx0Y29uZmlncyIsICJmb3JjZSIsICJpbnZhbGlkYXRlX3N0YW1wIiwgCisgICAgICAgICAgICAgICAgICAidmVyYm9zZSIsICJkZWJ1ZyIsICJkcnlfcnVuIiwgImR1bXBfc2lnbmF0dXJlcyIsIAorICAgICAgICAgICAgICAgICAgImRlYnVnX2RvbWFpbnMiLCAiZXh0cmFfYXNzdW1lX3Byb3ZpZGVkIiwgInByb2ZpbGUiLAorICAgICAgICAgICAgICAgICAgInByZWZpbGUiLCAicG9zdGZpbGUiXToKKyAgICAgICAgICAgIG9wdGlvbnNbb10gPSBnZXRhdHRyKHNlbGYub3B0aW9ucywgbykKKworICAgICAgICByZXQsIGVycm9yID0gc2VydmVyLnJ1bkNvbW1hbmQoWyJ1cGRhdGVDb25maWciLCBvcHRpb25zLCBlbnZpcm9ubWVudF0pCisgICAgICAgIGlmIGVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiVW5hYmxlIHRvIHVwZGF0ZSB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gd2l0aCBsb2NhbCBwYXJhbWV0ZXJzOiAlcyIgJSBlcnJvcikKKworICAgIGRlZiBwYXJzZUFjdGlvbnMoc2VsZik6CisgICAgICAgICMgUGFyc2UgYW55IGNvbW1hbmRsaW5lIGludG8gYWN0aW9ucworICAgICAgICBhY3Rpb24gPSB7J2FjdGlvbic6Tm9uZSwgJ21zZyc6Tm9uZX0KKyAgICAgICAgaWYgc2VsZi5vcHRpb25zLnNob3dfZW52aXJvbm1lbnQ6CisgICAgICAgICAgICBpZiAnd29ybGQnIGluIHNlbGYub3B0aW9ucy5wa2dzX3RvX2J1aWxkOgorICAgICAgICAgICAgICAgIGFjdGlvblsnbXNnJ10gPSAiJ3dvcmxkJyBpcyBub3QgYSB2YWxpZCB0YXJnZXQgZm9yIC0tZW52aXJvbm1lbnQuIgorICAgICAgICAgICAgZWxpZiAndW5pdmVyc2UnIGluIHNlbGYub3B0aW9ucy5wa2dzX3RvX2J1aWxkOgorICAgICAgICAgICAgICAgIGFjdGlvblsnbXNnJ10gPSAiJ3VuaXZlcnNlJyBpcyBub3QgYSB2YWxpZCB0YXJnZXQgZm9yIC0tZW52aXJvbm1lbnQuIgorICAgICAgICAgICAgZWxpZiBsZW4oc2VsZi5vcHRpb25zLnBrZ3NfdG9fYnVpbGQpID4gMToKKyAgICAgICAgICAgICAgICBhY3Rpb25bJ21zZyddID0gIk9ubHkgb25lIHRhcmdldCBjYW4gYmUgdXNlZCB3aXRoIHRoZSAtLWVudmlyb25tZW50IG9wdGlvbi4iCisgICAgICAgICAgICBlbGlmIHNlbGYub3B0aW9ucy5idWlsZGZpbGUgYW5kIGxlbihzZWxmLm9wdGlvbnMucGtnc190b19idWlsZCkgPiAwOgorICAgICAgICAgICAgICAgIGFjdGlvblsnbXNnJ10gPSAiTm8gdGFyZ2V0IHNob3VsZCBiZSB1c2VkIHdpdGggdGhlIC0tZW52aXJvbm1lbnQgYW5kIC0tYnVpbGRmaWxlIG9wdGlvbnMuIgorICAgICAgICAgICAgZWxpZiBsZW4oc2VsZi5vcHRpb25zLnBrZ3NfdG9fYnVpbGQpID4gMDoKKyAgICAgICAgICAgICAgICBhY3Rpb25bJ2FjdGlvbiddID0gWyJzaG93RW52aXJvbm1lbnRUYXJnZXQiLCBzZWxmLm9wdGlvbnMucGtnc190b19idWlsZF0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYWN0aW9uWydhY3Rpb24nXSA9IFsic2hvd0Vudmlyb25tZW50Iiwgc2VsZi5vcHRpb25zLmJ1aWxkZmlsZV0KKyAgICAgICAgZWxpZiBzZWxmLm9wdGlvbnMuYnVpbGRmaWxlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYWN0aW9uWydhY3Rpb24nXSA9IFsiYnVpbGRGaWxlIiwgc2VsZi5vcHRpb25zLmJ1aWxkZmlsZSwgc2VsZi5vcHRpb25zLmNtZF0KKyAgICAgICAgZWxpZiBzZWxmLm9wdGlvbnMucmV2aXNpb25zX2NoYW5nZWQ6CisgICAgICAgICAgICBhY3Rpb25bJ2FjdGlvbiddID0gWyJjb21wYXJlUmV2aXNpb25zIl0KKyAgICAgICAgZWxpZiBzZWxmLm9wdGlvbnMuc2hvd192ZXJzaW9uczoKKyAgICAgICAgICAgIGFjdGlvblsnYWN0aW9uJ10gPSBbInNob3dWZXJzaW9ucyJdCisgICAgICAgIGVsaWYgc2VsZi5vcHRpb25zLnBhcnNlX29ubHk6CisgICAgICAgICAgICBhY3Rpb25bJ2FjdGlvbiddID0gWyJwYXJzZUZpbGVzIl0KKyAgICAgICAgZWxpZiBzZWxmLm9wdGlvbnMuZG90X2dyYXBoOgorICAgICAgICAgICAgaWYgc2VsZi5vcHRpb25zLnBrZ3NfdG9fYnVpbGQ6CisgICAgICAgICAgICAgICAgYWN0aW9uWydhY3Rpb24nXSA9IFsiZ2VuZXJhdGVEb3RHcmFwaCIsIHNlbGYub3B0aW9ucy5wa2dzX3RvX2J1aWxkLCBzZWxmLm9wdGlvbnMuY21kXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBhY3Rpb25bJ21zZyddID0gIlBsZWFzZSBzcGVjaWZ5IGEgcGFja2FnZSBuYW1lIGZvciBkZXBlbmRlbmN5IGdyYXBoIGdlbmVyYXRpb24uIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5vcHRpb25zLnBrZ3NfdG9fYnVpbGQ6CisgICAgICAgICAgICAgICAgYWN0aW9uWydhY3Rpb24nXSA9IFsiYnVpbGRUYXJnZXRzIiwgc2VsZi5vcHRpb25zLnBrZ3NfdG9fYnVpbGQsIHNlbGYub3B0aW9ucy5jbWRdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICNhY3Rpb25bJ21zZyddID0gIk5vdGhpbmcgdG8gZG8uICBVc2UgJ2JpdGJha2Ugd29ybGQnIHRvIGJ1aWxkIGV2ZXJ5dGhpbmcsIG9yIHJ1biAnYml0YmFrZSAtLWhlbHAnIGZvciB1c2FnZSBpbmZvcm1hdGlvbi4iCisgICAgICAgICAgICAgICAgYWN0aW9uID0gTm9uZQorICAgICAgICBzZWxmLm9wdGlvbnMuaW5pdGlhbGFjdGlvbiA9IGFjdGlvbgorICAgICAgICByZXR1cm4gYWN0aW9uCisKK2NsYXNzIENvb2tlckNvbmZpZ3VyYXRpb24ob2JqZWN0KToKKyAgICAiIiIKKyAgICBNYW5hZ2VzIGJ1aWxkIG9wdGlvbnMgYW5kIGNvbmZpZ3VyYXRpb25zIGZvciBvbmUgcnVuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuZGVidWdfZG9tYWlucyA9IFtdCisgICAgICAgIHNlbGYuZXh0cmFfYXNzdW1lX3Byb3ZpZGVkID0gW10KKyAgICAgICAgc2VsZi5wcmVmaWxlID0gW10KKyAgICAgICAgc2VsZi5wb3N0ZmlsZSA9IFtdCisgICAgICAgIHNlbGYuZGVidWcgPSAwCisgICAgICAgIHNlbGYuY21kID0gTm9uZQorICAgICAgICBzZWxmLmFib3J0ID0gVHJ1ZQorICAgICAgICBzZWxmLmZvcmNlID0gRmFsc2UKKyAgICAgICAgc2VsZi5wcm9maWxlID0gRmFsc2UKKyAgICAgICAgc2VsZi5ub3NldHNjZW5lID0gRmFsc2UKKyAgICAgICAgc2VsZi5pbnZhbGlkYXRlX3N0YW1wID0gRmFsc2UKKyAgICAgICAgc2VsZi5kdW1wX3NpZ25hdHVyZXMgPSBbXQorICAgICAgICBzZWxmLmRyeV9ydW4gPSBGYWxzZQorICAgICAgICBzZWxmLnRyYWNraW5nID0gRmFsc2UKKyAgICAgICAgc2VsZi5pbnRlcmZhY2UgPSBbXQorICAgICAgICBzZWxmLndyaXRlZXZlbnRsb2cgPSBGYWxzZQorCisgICAgICAgIHNlbGYuZW52ID0ge30KKworICAgIGRlZiBzZXRDb25maWdQYXJhbWV0ZXJzKHNlbGYsIHBhcmFtZXRlcnMpOgorICAgICAgICBmb3Iga2V5IGluIHNlbGYuX19kaWN0X18ua2V5cygpOgorICAgICAgICAgICAgaWYga2V5IGluIHBhcmFtZXRlcnMub3B0aW9ucy5fX2RpY3RfXzoKKyAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGtleSwgcGFyYW1ldGVycy5vcHRpb25zLl9fZGljdF9fW2tleV0pCisgICAgICAgIHNlbGYuZW52ID0gcGFyYW1ldGVycy5lbnZpcm9ubWVudC5jb3B5KCkKKyAgICAgICAgc2VsZi50cmFja2luZyA9IHBhcmFtZXRlcnMudHJhY2tpbmcKKworICAgIGRlZiBzZXRTZXJ2ZXJSZWdJZGxlQ2FsbGJhY2soc2VsZiwgc3JjYik6CisgICAgICAgIHNlbGYuc2VydmVyX3JlZ2lzdGVyX2lkbGVjYWxsYmFjayA9IHNyY2IKKworICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CisgICAgICAgIHN0YXRlID0ge30KKyAgICAgICAgZm9yIGtleSBpbiBzZWxmLl9fZGljdF9fLmtleXMoKToKKyAgICAgICAgICAgIGlmIGtleSA9PSAic2VydmVyX3JlZ2lzdGVyX2lkbGVjYWxsYmFjayI6CisgICAgICAgICAgICAgICAgc3RhdGVba2V5XSA9IE5vbmUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc3RhdGVba2V5XSA9IGdldGF0dHIoc2VsZiwga2V5KQorICAgICAgICByZXR1cm4gc3RhdGUKKworICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZixzdGF0ZSk6CisgICAgICAgIGZvciBrIGluIHN0YXRlOgorICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBrLCBzdGF0ZVtrXSkgCisKKworZGVmIGNhdGNoX3BhcnNlX2Vycm9yKGZ1bmMpOgorICAgICIiIkV4Y2VwdGlvbiBoYW5kbGluZyBiaXRzIGZvciBvdXIgcGFyc2luZyIiIgorICAgIEB3cmFwcyhmdW5jKQorICAgIGRlZiB3cmFwcGVkKGZuLCAqYXJncyk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBmdW5jKGZuLCAqYXJncykKKyAgICAgICAgZXhjZXB0IElPRXJyb3IgYXMgZXhjOgorICAgICAgICAgICAgaW1wb3J0IHRyYWNlYmFjaworICAgICAgICAgICAgcGFyc2Vsb2cuY3JpdGljYWwodHJhY2ViYWNrLmZvcm1hdF9leGMoKSkKKyAgICAgICAgICAgIHBhcnNlbG9nLmNyaXRpY2FsKCJVbmFibGUgdG8gcGFyc2UgJXM6ICVzIiAlIChmbiwgZXhjKSkKKyAgICAgICAgICAgIHN5cy5leGl0KDEpCisgICAgICAgIGV4Y2VwdCAoYmIucGFyc2UuUGFyc2VFcnJvciwgYmIuZGF0YV9zbWFydC5FeHBhbnNpb25FcnJvcikgYXMgZXhjOgorICAgICAgICAgICAgaW1wb3J0IHRyYWNlYmFjaworCisgICAgICAgICAgICBiYmRpciA9IG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykgKyBvcy5zZXAKKyAgICAgICAgICAgIGV4Y19jbGFzcywgZXhjLCB0YiA9IHN5cy5leGNfaW5mbygpCisgICAgICAgICAgICBmb3IgdGIgaW4gaXRlcihsYW1iZGE6IHRiLnRiX25leHQsIE5vbmUpOgorICAgICAgICAgICAgICAgICMgU2tpcCBmcmFtZXMgaW4gYml0YmFrZSBpdHNlbGYsIHdlIG9ubHkgd2FudCB0aGUgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICBmbiwgXywgXywgXyA9IHRyYWNlYmFjay5leHRyYWN0X3RiKHRiLCAxKVswXQorICAgICAgICAgICAgICAgIGlmIG5vdCBmbi5zdGFydHN3aXRoKGJiZGlyKToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHBhcnNlbG9nLmNyaXRpY2FsKCJVbmFibGUgdG8gcGFyc2UgJXMiLCBmbiwgZXhjX2luZm89KGV4Y19jbGFzcywgZXhjLCB0YikpCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorICAgIHJldHVybiB3cmFwcGVkCisKK0BjYXRjaF9wYXJzZV9lcnJvcgorZGVmIHBhcnNlX2NvbmZpZ19maWxlKGZuLCBkYXRhLCBpbmNsdWRlPVRydWUpOgorICAgIHJldHVybiBiYi5wYXJzZS5oYW5kbGUoZm4sIGRhdGEsIGluY2x1ZGUpCisKK0BjYXRjaF9wYXJzZV9lcnJvcgorZGVmIF9pbmhlcml0KGJiY2xhc3MsIGRhdGEpOgorICAgIGJiLnBhcnNlLkJCSGFuZGxlci5pbmhlcml0KGJiY2xhc3MsICJjb25maWd1cmF0aW9uIElOSEVSSVRzIiwgMCwgZGF0YSkKKyAgICByZXR1cm4gZGF0YQorCitkZWYgZmluZENvbmZpZ0ZpbGUoY29uZmlnZmlsZSwgZGF0YSk6CisgICAgc2VhcmNoID0gW10KKyAgICBiYnBhdGggPSBkYXRhLmdldFZhcigiQkJQQVRIIiwgVHJ1ZSkKKyAgICBpZiBiYnBhdGg6CisgICAgICAgIGZvciBpIGluIGJicGF0aC5zcGxpdCgiOiIpOgorICAgICAgICAgICAgc2VhcmNoLmFwcGVuZChvcy5wYXRoLmpvaW4oaSwgImNvbmYiLCBjb25maWdmaWxlKSkKKyAgICBwYXRoID0gb3MuZ2V0Y3dkKCkKKyAgICB3aGlsZSBwYXRoICE9ICIvIjoKKyAgICAgICAgc2VhcmNoLmFwcGVuZChvcy5wYXRoLmpvaW4ocGF0aCwgImNvbmYiLCBjb25maWdmaWxlKSkKKyAgICAgICAgcGF0aCwgXyA9IG9zLnBhdGguc3BsaXQocGF0aCkKKworICAgIGZvciBpIGluIHNlYXJjaDoKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoaSk6CisgICAgICAgICAgICByZXR1cm4gaQorCisgICAgcmV0dXJuIE5vbmUKKworY2xhc3MgQ29va2VyRGF0YUJ1aWxkZXIob2JqZWN0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb29rZXJjZmcsIHdvcmtlciA9IEZhbHNlKToKKworICAgICAgICBzZWxmLnByZWZpbGVzID0gY29va2VyY2ZnLnByZWZpbGUKKyAgICAgICAgc2VsZi5wb3N0ZmlsZXMgPSBjb29rZXJjZmcucG9zdGZpbGUKKyAgICAgICAgc2VsZi50cmFja2luZyA9IGNvb2tlcmNmZy50cmFja2luZworCisgICAgICAgIGJiLnV0aWxzLnNldF9jb250ZXh0KGJiLnV0aWxzLmNsZWFuX2NvbnRleHQoKSkKKyAgICAgICAgYmIuZXZlbnQuc2V0X2NsYXNzX2hhbmRsZXJzKGJiLmV2ZW50LmNsZWFuX2NsYXNzX2hhbmRsZXJzKCkpCisgICAgICAgIHNlbGYuZGF0YSA9IGJiLmRhdGEuaW5pdCgpCisgICAgICAgIGlmIHNlbGYudHJhY2tpbmc6CisgICAgICAgICAgICBzZWxmLmRhdGEuZW5hYmxlVHJhY2tpbmcoKQorCisgICAgICAgICMgS2VlcCBhIGRhdGFzdG9yZSBvZiB0aGUgaW5pdGlhbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYW5kIHRoZWlyCisgICAgICAgICMgdmFsdWVzIGZyb20gd2hlbiBCaXRCYWtlIHdhcyBsYXVuY2hlZCB0byBlbmFibGUgY2hpbGQgcHJvY2Vzc2VzCisgICAgICAgICMgdG8gdXNlIGVudmlyb25tZW50IHZhcmlhYmxlcyB3aGljaCBoYXZlIGJlZW4gY2xlYW5lZCBmcm9tIHRoZQorICAgICAgICAjIEJpdEJha2UgcHJvY2Vzc2VzIGVudgorICAgICAgICBzZWxmLnNhdmVkZW52ID0gYmIuZGF0YS5pbml0KCkKKyAgICAgICAgZm9yIGsgaW4gY29va2VyY2ZnLmVudjoKKyAgICAgICAgICAgIHNlbGYuc2F2ZWRlbnYuc2V0VmFyKGssIGNvb2tlcmNmZy5lbnZba10pCisKKyAgICAgICAgZmlsdGVyZWRfa2V5cyA9IGJiLnV0aWxzLmFwcHJvdmVkX3ZhcmlhYmxlcygpCisgICAgICAgIGJiLmRhdGEuaW5oZXJpdEZyb21PUyhzZWxmLmRhdGEsIHNlbGYuc2F2ZWRlbnYsIGZpbHRlcmVkX2tleXMpCisgICAgICAgIHNlbGYuZGF0YS5zZXRWYXIoIkJCX09SSUdFTlYiLCBzZWxmLnNhdmVkZW52KQorICAgICAgICAKKyAgICAgICAgaWYgd29ya2VyOgorICAgICAgICAgICAgc2VsZi5kYXRhLnNldFZhcigiQkJfV09SS0VSQ09OVEVYVCIsICIxIikKKworICAgIGRlZiBwYXJzZUJhc2VDb25maWd1cmF0aW9uKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnBhcnNlQ29uZmlndXJhdGlvbkZpbGVzKHNlbGYucHJlZmlsZXMsIHNlbGYucG9zdGZpbGVzKQorICAgICAgICBleGNlcHQgU3ludGF4RXJyb3I6CisgICAgICAgICAgICByYWlzZSBiYi5CQkhhbmRsZWRFeGNlcHRpb24KKyAgICAgICAgZXhjZXB0IGJiLmRhdGFfc21hcnQuRXhwYW5zaW9uRXJyb3IgYXMgZToKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcihzdHIoZSkpCisgICAgICAgICAgICByYWlzZSBiYi5CQkhhbmRsZWRFeGNlcHRpb24KKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oIkVycm9yIHBhcnNpbmcgY29uZmlndXJhdGlvbiBmaWxlcyIpCisgICAgICAgICAgICByYWlzZSBiYi5CQkhhbmRsZWRFeGNlcHRpb24KKworICAgIGRlZiBfZmluZExheWVyQ29uZihzZWxmLCBkYXRhKToKKyAgICAgICAgcmV0dXJuIGZpbmRDb25maWdGaWxlKCJiYmxheWVycy5jb25mIiwgZGF0YSkKKworICAgIGRlZiBwYXJzZUNvbmZpZ3VyYXRpb25GaWxlcyhzZWxmLCBwcmVmaWxlcywgcG9zdGZpbGVzKToKKyAgICAgICAgZGF0YSA9IHNlbGYuZGF0YQorICAgICAgICBiYi5wYXJzZS5pbml0X3BhcnNlcihkYXRhKQorCisgICAgICAgICMgUGFyc2UgZmlsZXMgZm9yIGxvYWRpbmcgKmJlZm9yZSogYml0YmFrZS5jb25mIGFuZCBhbnkgaW5jbHVkZXMKKyAgICAgICAgZm9yIGYgaW4gcHJlZmlsZXM6CisgICAgICAgICAgICBkYXRhID0gcGFyc2VfY29uZmlnX2ZpbGUoZiwgZGF0YSkKKworICAgICAgICBsYXllcmNvbmYgPSBzZWxmLl9maW5kTGF5ZXJDb25mKGRhdGEpCisgICAgICAgIGlmIGxheWVyY29uZjoKKyAgICAgICAgICAgIHBhcnNlbG9nLmRlYnVnKDIsICJGb3VuZCBiYmxheWVycy5jb25mICglcykiLCBsYXllcmNvbmYpCisgICAgICAgICAgICAjIEJ5IGRlZmluaXRpb24gYmJsYXllcnMuY29uZiBpcyBpbiBjb25mLyBvZiBUT1BESVIuCisgICAgICAgICAgICAjIFdlIG1heSBoYXZlIGJlZW4gY2FsbGVkIHdpdGggY3dkIHNvbWV3aGVyZSBlbHNlIHNvIHJlc2V0IFRPUERJUgorICAgICAgICAgICAgZGF0YS5zZXRWYXIoIlRPUERJUiIsIG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUobGF5ZXJjb25mKSkpCisgICAgICAgICAgICBkYXRhID0gcGFyc2VfY29uZmlnX2ZpbGUobGF5ZXJjb25mLCBkYXRhKQorCisgICAgICAgICAgICBsYXllcnMgPSAoZGF0YS5nZXRWYXIoJ0JCTEFZRVJTJywgVHJ1ZSkgb3IgIiIpLnNwbGl0KCkKKworICAgICAgICAgICAgZGF0YSA9IGJiLmRhdGEuY3JlYXRlQ29weShkYXRhKQorICAgICAgICAgICAgYXBwcm92ZWQgPSBiYi51dGlscy5hcHByb3ZlZF92YXJpYWJsZXMoKQorICAgICAgICAgICAgZm9yIGxheWVyIGluIGxheWVyczoKKyAgICAgICAgICAgICAgICBwYXJzZWxvZy5kZWJ1ZygyLCAiQWRkaW5nIGxheWVyICVzIiwgbGF5ZXIpCisgICAgICAgICAgICAgICAgaWYgJ0hPTUUnIGluIGFwcHJvdmVkIGFuZCAnficgaW4gbGF5ZXI6CisgICAgICAgICAgICAgICAgICAgIGxheWVyID0gb3MucGF0aC5leHBhbmR1c2VyKGxheWVyKQorICAgICAgICAgICAgICAgIGRhdGEuc2V0VmFyKCdMQVlFUkRJUicsIGxheWVyKQorICAgICAgICAgICAgICAgIGRhdGEgPSBwYXJzZV9jb25maWdfZmlsZShvcy5wYXRoLmpvaW4obGF5ZXIsICJjb25mIiwgImxheWVyLmNvbmYiKSwgZGF0YSkKKyAgICAgICAgICAgICAgICBkYXRhLmV4cGFuZFZhcnJlZignTEFZRVJESVInKQorCisgICAgICAgICAgICBkYXRhLmRlbFZhcignTEFZRVJESVInKQorCisgICAgICAgIGlmIG5vdCBkYXRhLmdldFZhcigiQkJQQVRIIiwgVHJ1ZSk6CisgICAgICAgICAgICBtc2cgPSAiVGhlIEJCUEFUSCB2YXJpYWJsZSBpcyBub3Qgc2V0IgorICAgICAgICAgICAgaWYgbm90IGxheWVyY29uZjoKKyAgICAgICAgICAgICAgICBtc2cgKz0gKCIgYW5kIGJpdGJha2UgZGlkIG5vdCBmaW5kIGEgY29uZi9iYmxheWVycy5jb25mIGZpbGUgaW4iCisgICAgICAgICAgICAgICAgICAgICAgICAiIHRoZSBleHBlY3RlZCBsb2NhdGlvbi5cbk1heWJlIHlvdSBhY2NpZGVudGFsbHkiCisgICAgICAgICAgICAgICAgICAgICAgICAiIGludm9rZWQgYml0YmFrZSBmcm9tIHRoZSB3cm9uZyBkaXJlY3Rvcnk/IikKKyAgICAgICAgICAgIHJhaXNlIFN5c3RlbUV4aXQobXNnKQorCisgICAgICAgIGRhdGEgPSBwYXJzZV9jb25maWdfZmlsZShvcy5wYXRoLmpvaW4oImNvbmYiLCAiYml0YmFrZS5jb25mIiksIGRhdGEpCisKKyAgICAgICAgIyBQYXJzZSBmaWxlcyBmb3IgbG9hZGluZyAqYWZ0ZXIqIGJpdGJha2UuY29uZiBhbmQgYW55IGluY2x1ZGVzCisgICAgICAgIGZvciBwIGluIHBvc3RmaWxlczoKKyAgICAgICAgICAgIGRhdGEgPSBwYXJzZV9jb25maWdfZmlsZShwLCBkYXRhKQorCisgICAgICAgICMgSGFuZGxlIGFueSBJTkhFUklUcyBhbmQgaW5oZXJpdCB0aGUgYmFzZSBjbGFzcworICAgICAgICBiYmNsYXNzZXMgID0gWyJiYXNlIl0gKyAoZGF0YS5nZXRWYXIoJ0lOSEVSSVQnLCBUcnVlKSBvciAiIikuc3BsaXQoKQorICAgICAgICBmb3IgYmJjbGFzcyBpbiBiYmNsYXNzZXM6CisgICAgICAgICAgICBkYXRhID0gX2luaGVyaXQoYmJjbGFzcywgZGF0YSkKKworICAgICAgICAjIE5vbWFsbHkgd2Ugb25seSByZWdpc3RlciBldmVudCBoYW5kbGVycyBhdCB0aGUgZW5kIG9mIHBhcnNpbmcgLmJiIGZpbGVzCisgICAgICAgICMgV2UgcmVnaXN0ZXIgYW55IGhhbmRsZXJzIHdlJ3ZlIGZvdW5kIHNvIGZhciBoZXJlLi4uCisgICAgICAgIGZvciB2YXIgaW4gZGF0YS5nZXRWYXIoJ19fQkJIQU5ETEVSUycsIEZhbHNlKSBvciBbXToKKyAgICAgICAgICAgIGJiLmV2ZW50LnJlZ2lzdGVyKHZhciwgZGF0YS5nZXRWYXIodmFyLCBGYWxzZSksICAoZGF0YS5nZXRWYXJGbGFnKHZhciwgImV2ZW50bWFzayIsIFRydWUpIG9yICIiKS5zcGxpdCgpKQorCisgICAgICAgIGlmIGRhdGEuZ2V0VmFyKCJCQl9XT1JLRVJDT05URVhUIiwgRmFsc2UpIGlzIE5vbmU6CisgICAgICAgICAgICBiYi5mZXRjaC5mZXRjaGVyX2luaXQoZGF0YSkKKyAgICAgICAgYmIuY29kZXBhcnNlci5wYXJzZXJfY2FjaGVfaW5pdChkYXRhKQorICAgICAgICBiYi5ldmVudC5maXJlKGJiLmV2ZW50LkNvbmZpZ1BhcnNlZCgpLCBkYXRhKQorCisgICAgICAgIGlmIGRhdGEuZ2V0VmFyKCJCQl9JTlZBTElEQ09ORiIsIEZhbHNlKSBpcyBUcnVlOgorICAgICAgICAgICAgZGF0YS5zZXRWYXIoIkJCX0lOVkFMSURDT05GIiwgRmFsc2UpCisgICAgICAgICAgICBzZWxmLnBhcnNlQ29uZmlndXJhdGlvbkZpbGVzKHNlbGYucHJlZmlsZXMsIHNlbGYucG9zdGZpbGVzKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgYmIucGFyc2UuaW5pdF9wYXJzZXIoZGF0YSkKKyAgICAgICAgZGF0YS5zZXRWYXIoJ0JCSU5DTFVERUQnLGJiLnBhcnNlLmdldF9maWxlX2RlcGVuZHMoZGF0YSkpCisgICAgICAgIHNlbGYuZGF0YSA9IGRhdGEKKyAgICAgICAgc2VsZi5kYXRhX2hhc2ggPSBkYXRhLmdldF9oYXNoKCkKKworCisKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL2RhZW1vbml6ZS5weSBiL2JpdGJha2UvbGliL2JiL2RhZW1vbml6ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDZhNjE4Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvZGFlbW9uaXplLnB5CkBAIC0wLDAgKzEsMTkzIEBACisiIiIKK1B5dGhvbiBEYWVtb25pemluZyBoZWxwZXIKKworQ29uZmlndXJhYmxlIGRhZW1vbiBiZWhhdmlvcnM6CisKKyAgICAxLikgVGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnkgc2V0IHRvIHRoZSAiLyIgZGlyZWN0b3J5LgorICAgIDIuKSBUaGUgY3VycmVudCBmaWxlIGNyZWF0aW9uIG1vZGUgbWFzayBzZXQgdG8gMC4KKyAgICAzLikgQ2xvc2UgYWxsIG9wZW4gZmlsZXMgKDEwMjQpLiAKKyAgICA0LikgUmVkaXJlY3Qgc3RhbmRhcmQgSS9PIHN0cmVhbXMgdG8gIi9kZXYvbnVsbCIuCisKK0EgZmFpbGVkIGNhbGwgdG8gZm9yaygpIG5vdyByYWlzZXMgYW4gZXhjZXB0aW9uLgorCitSZWZlcmVuY2VzOgorICAgIDEpIEFkdmFuY2VkIFByb2dyYW1taW5nIGluIHRoZSBVbml4IEVudmlyb25tZW50OiBXLiBSaWNoYXJkIFN0ZXZlbnMKKwlodHRwOi8vd3d3LmFwdWVib29rLmNvbS9hcHVlM2UuaHRtbAorICAgIDIpIFRoZSBMaW51eCBQcm9ncmFtbWluZyBJbnRlcmZhY2U6IE1pY2hhZWwgS2VycmlzaworCWh0dHA6Ly9tYW43Lm9yZy90bHBpL2luZGV4Lmh0bWwKKyAgICAzKSBVbml4IFByb2dyYW1taW5nIEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zOgorCWh0dHA6Ly93d3cuZmFxcy5vcmcvZmFxcy91bml4LWZhcS9wcm9ncmFtbWVyL2ZhcS8KKworTW9kaWZpZWQgdG8gYWxsb3cgYSBmdW5jdGlvbiB0byBiZSBkYWVtb25pemVkIGFuZCByZXR1cm4gZm9yIAorYml0YmFrZSB1c2UgYnkgUmljaGFyZCBQdXJkaWUKKyIiIgorCitfX2F1dGhvcl9fID0gIkNoYWQgSi4gU2Nocm9lZGVyIgorX19jb3B5cmlnaHRfXyA9ICJDb3B5cmlnaHQgKEMpIDIwMDUgQ2hhZCBKLiBTY2hyb2VkZXIiCitfX3ZlcnNpb25fXyA9ICIwLjIiCisKKyMgU3RhbmRhcmQgUHl0aG9uIG1vZHVsZXMuCitpbXBvcnQgb3MgICAgICAgICAgICAgICAgICAgICMgTWlzY2VsbGFuZW91cyBPUyBpbnRlcmZhY2VzLgoraW1wb3J0IHN5cyAgICAgICAgICAgICAgICAgICAjIFN5c3RlbS1zcGVjaWZpYyBwYXJhbWV0ZXJzIGFuZCBmdW5jdGlvbnMuCisKKyMgRGVmYXVsdCBkYWVtb24gcGFyYW1ldGVycy4KKyMgRmlsZSBtb2RlIGNyZWF0aW9uIG1hc2sgb2YgdGhlIGRhZW1vbi4KKyMgRm9yIEJpdEJha2UncyBjaGlsZHJlbiwgd2UgZG8gd2FudCB0byBpbmhlcml0IHRoZSBwYXJlbnQgdW1hc2suCitVTUFTSyA9IE5vbmUKKworIyBEZWZhdWx0IG1heGltdW0gZm9yIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGZpbGUgZGVzY3JpcHRvcnMuCitNQVhGRCA9IDEwMjQKKworIyBUaGUgc3RhbmRhcmQgSS9PIGZpbGUgZGVzY3JpcHRvcnMgYXJlIHJlZGlyZWN0ZWQgdG8gL2Rldi9udWxsIGJ5IGRlZmF1bHQuCitpZiAoaGFzYXR0cihvcywgImRldm51bGwiKSk6CisgICAgUkVESVJFQ1RfVE8gPSBvcy5kZXZudWxsCitlbHNlOgorICAgIFJFRElSRUNUX1RPID0gIi9kZXYvbnVsbCIKKworZGVmIGNyZWF0ZURhZW1vbihmdW5jdGlvbiwgbG9nZmlsZSk6CisgICAgIiIiCisgICAgRGV0YWNoIGEgcHJvY2VzcyBmcm9tIHRoZSBjb250cm9sbGluZyB0ZXJtaW5hbCBhbmQgcnVuIGl0IGluIHRoZQorICAgIGJhY2tncm91bmQgYXMgYSBkYWVtb24sIHJldHVybmluZyBjb250cm9sIHRvIHRoZSBjYWxsZXIuCisgICAgIiIiCisKKyAgICB0cnk6CisgICAgICAgICMgRm9yayBhIGNoaWxkIHByb2Nlc3Mgc28gdGhlIHBhcmVudCBjYW4gZXhpdC4gIFRoaXMgcmV0dXJucyBjb250cm9sIHRvCisgICAgICAgICMgdGhlIGNvbW1hbmQtbGluZSBvciBzaGVsbC4gIEl0IGFsc28gZ3VhcmFudGVlcyB0aGF0IHRoZSBjaGlsZCB3aWxsIG5vdAorICAgICAgICAjIGJlIGEgcHJvY2VzcyBncm91cCBsZWFkZXIsIHNpbmNlIHRoZSBjaGlsZCByZWNlaXZlcyBhIG5ldyBwcm9jZXNzIElECisgICAgICAgICMgYW5kIGluaGVyaXRzIHRoZSBwYXJlbnQncyBwcm9jZXNzIGdyb3VwIElELiAgVGhpcyBzdGVwIGlzIHJlcXVpcmVkCisgICAgICAgICMgdG8gaW5zdXJlIHRoYXQgdGhlIG5leHQgY2FsbCB0byBvcy5zZXRzaWQgaXMgc3VjY2Vzc2Z1bC4KKyAgICAgICAgcGlkID0gb3MuZm9yaygpCisgICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCIlcyBbJWRdIiAlIChlLnN0cmVycm9yLCBlLmVycm5vKSkKKworICAgIGlmIChwaWQgPT0gMCk6ICAgICAgIyBUaGUgZmlyc3QgY2hpbGQuCisgICAgICAgICMgVG8gYmVjb21lIHRoZSBzZXNzaW9uIGxlYWRlciBvZiB0aGlzIG5ldyBzZXNzaW9uIGFuZCB0aGUgcHJvY2VzcyBncm91cAorICAgICAgICAjIGxlYWRlciBvZiB0aGUgbmV3IHByb2Nlc3MgZ3JvdXAsIHdlIGNhbGwgb3Muc2V0c2lkKCkuICBUaGUgcHJvY2VzcyBpcworICAgICAgICAjIGFsc28gZ3VhcmFudGVlZCBub3QgdG8gaGF2ZSBhIGNvbnRyb2xsaW5nIHRlcm1pbmFsLgorICAgICAgICBvcy5zZXRzaWQoKQorCisgICAgICAgICMgSXMgaWdub3JpbmcgU0lHSFVQIG5lY2Vzc2FyeT8KKyAgICAgICAgIworICAgICAgICAjIEl0J3Mgb2Z0ZW4gc3VnZ2VzdGVkIHRoYXQgdGhlIFNJR0hVUCBzaWduYWwgc2hvdWxkIGJlIGlnbm9yZWQgYmVmb3JlCisgICAgICAgICMgdGhlIHNlY29uZCBmb3JrIHRvIGF2b2lkIHByZW1hdHVyZSB0ZXJtaW5hdGlvbiBvZiB0aGUgcHJvY2Vzcy4gIFRoZQorICAgICAgICAjIHJlYXNvbiBpcyB0aGF0IHdoZW4gdGhlIGZpcnN0IGNoaWxkIHRlcm1pbmF0ZXMsIGFsbCBwcm9jZXNzZXMsIGUuZy4KKyAgICAgICAgIyB0aGUgc2Vjb25kIGNoaWxkLCBpbiB0aGUgb3JwaGFuZWQgZ3JvdXAgd2lsbCBiZSBzZW50IGEgU0lHSFVQLgorICAgICAgICAjCisgICAgICAgICMgIkhvd2V2ZXIsIGFzIHBhcnQgb2YgdGhlIHNlc3Npb24gbWFuYWdlbWVudCBzeXN0ZW0sIHRoZXJlIGFyZSBleGFjdGx5CisgICAgICAgICMgdHdvIGNhc2VzIHdoZXJlIFNJR0hVUCBpcyBzZW50IG9uIHRoZSBkZWF0aCBvZiBhIHByb2Nlc3M6CisgICAgICAgICMKKyAgICAgICAgIyAgICAxKSBXaGVuIHRoZSBwcm9jZXNzIHRoYXQgZGllcyBpcyB0aGUgc2Vzc2lvbiBsZWFkZXIgb2YgYSBzZXNzaW9uIHRoYXQKKyAgICAgICAgIyAgICAgICAgaXMgYXR0YWNoZWQgdG8gYSB0ZXJtaW5hbCBkZXZpY2UsIFNJR0hVUCBpcyBzZW50IHRvIGFsbCBwcm9jZXNzZXMKKyAgICAgICAgIyAgICAgICAgaW4gdGhlIGZvcmVncm91bmQgcHJvY2VzcyBncm91cCBvZiB0aGF0IHRlcm1pbmFsIGRldmljZS4KKyAgICAgICAgIyAgICAyKSBXaGVuIHRoZSBkZWF0aCBvZiBhIHByb2Nlc3MgY2F1c2VzIGEgcHJvY2VzcyBncm91cCB0byBiZWNvbWUKKyAgICAgICAgIyAgICAgICAgb3JwaGFuZWQsIGFuZCBvbmUgb3IgbW9yZSBwcm9jZXNzZXMgaW4gdGhlIG9ycGhhbmVkIGdyb3VwIGFyZQorICAgICAgICAjICAgICAgICBzdG9wcGVkLCB0aGVuIFNJR0hVUCBhbmQgU0lHQ09OVCBhcmUgc2VudCB0byBhbGwgbWVtYmVycyBvZiB0aGUKKyAgICAgICAgIyAgICAgICAgb3JwaGFuZWQgZ3JvdXAuIiBbMl0KKyAgICAgICAgIworICAgICAgICAjIFRoZSBmaXJzdCBjYXNlIGNhbiBiZSBpZ25vcmVkIHNpbmNlIHRoZSBjaGlsZCBpcyBndWFyYW50ZWVkIG5vdCB0byBoYXZlCisgICAgICAgICMgYSBjb250cm9sbGluZyB0ZXJtaW5hbC4gIFRoZSBzZWNvbmQgY2FzZSBpc24ndCBzbyBlYXN5IHRvIGRpc21pc3MuCisgICAgICAgICMgVGhlIHByb2Nlc3MgZ3JvdXAgaXMgb3JwaGFuZWQgd2hlbiB0aGUgZmlyc3QgY2hpbGQgdGVybWluYXRlcyBhbmQKKyAgICAgICAgIyBQT1NJWC4xIHJlcXVpcmVzIHRoYXQgZXZlcnkgU1RPUFBFRCBwcm9jZXNzIGluIGFuIG9ycGhhbmVkIHByb2Nlc3MKKyAgICAgICAgIyBncm91cCBiZSBzZW50IGEgU0lHSFVQIHNpZ25hbCBmb2xsb3dlZCBieSBhIFNJR0NPTlQgc2lnbmFsLiAgU2luY2UgdGhlCisgICAgICAgICMgc2Vjb25kIGNoaWxkIGlzIG5vdCBTVE9QUEVEIHRob3VnaCwgd2UgY2FuIHNhZmVseSBmb3JlZ28gaWdub3JpbmcgdGhlCisgICAgICAgICMgU0lHSFVQIHNpZ25hbC4gIEluIGFueSBjYXNlLCB0aGVyZSBhcmUgbm8gaWxsLWVmZmVjdHMgaWYgaXQgaXMgaWdub3JlZC4KKyAgICAgICAgIworICAgICAgICAjIGltcG9ydCBzaWduYWwgICAgICAgICAgICAgICMgU2V0IGhhbmRsZXJzIGZvciBhc3luY2hyb25vdXMgZXZlbnRzLgorICAgICAgICAjIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0hVUCwgc2lnbmFsLlNJR19JR04pCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBGb3JrIGEgc2Vjb25kIGNoaWxkIGFuZCBleGl0IGltbWVkaWF0ZWx5IHRvIHByZXZlbnQgem9tYmllcy4gIFRoaXMKKyAgICAgICAgICAgICMgY2F1c2VzIHRoZSBzZWNvbmQgY2hpbGQgcHJvY2VzcyB0byBiZSBvcnBoYW5lZCwgbWFraW5nIHRoZSBpbml0CisgICAgICAgICAgICAjIHByb2Nlc3MgcmVzcG9uc2libGUgZm9yIGl0cyBjbGVhbnVwLiAgQW5kLCBzaW5jZSB0aGUgZmlyc3QgY2hpbGQgaXMKKyAgICAgICAgICAgICMgYSBzZXNzaW9uIGxlYWRlciB3aXRob3V0IGEgY29udHJvbGxpbmcgdGVybWluYWwsIGl0J3MgcG9zc2libGUgZm9yCisgICAgICAgICAgICAjIGl0IHRvIGFjcXVpcmUgb25lIGJ5IG9wZW5pbmcgYSB0ZXJtaW5hbCBpbiB0aGUgZnV0dXJlIChTeXN0ZW0gVi0KKyAgICAgICAgICAgICMgYmFzZWQgc3lzdGVtcykuICBUaGlzIHNlY29uZCBmb3JrIGd1YXJhbnRlZXMgdGhhdCB0aGUgY2hpbGQgaXMgbm8KKyAgICAgICAgICAgICMgbG9uZ2VyIGEgc2Vzc2lvbiBsZWFkZXIsIHByZXZlbnRpbmcgdGhlIGRhZW1vbiBmcm9tIGV2ZXIgYWNxdWlyaW5nCisgICAgICAgICAgICAjIGEgY29udHJvbGxpbmcgdGVybWluYWwuCisgICAgICAgICAgICBwaWQgPSBvcy5mb3JrKCkgICAgICMgRm9yayBhIHNlY29uZCBjaGlsZC4KKyAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiJXMgWyVkXSIgJSAoZS5zdHJlcnJvciwgZS5lcnJubykpCisKKyAgICAgICAgaWYgKHBpZCA9PSAwKTogICMgVGhlIHNlY29uZCBjaGlsZC4KKyAgICAgICAgICAgICMgV2UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0aGUgZmlsZSBtb2RlIGNyZWF0aW9uIG1hc2sgaW5oZXJpdGVkIGZyb20KKyAgICAgICAgICAgICMgdGhlIHBhcmVudCwgc28gd2UgZ2l2ZSB0aGUgY2hpbGQgY29tcGxldGUgY29udHJvbCBvdmVyIHBlcm1pc3Npb25zLgorICAgICAgICAgICAgaWYgVU1BU0sgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgb3MudW1hc2soVU1BU0spCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFBhcmVudCAodGhlIGZpcnN0IGNoaWxkKSBvZiB0aGUgc2Vjb25kIGNoaWxkLgorICAgICAgICAgICAgb3MuX2V4aXQoMCkKKyAgICBlbHNlOgorICAgICAgICAjIGV4aXQoKSBvciBfZXhpdCgpPworICAgICAgICAjIF9leGl0IGlzIGxpa2UgZXhpdCgpLCBidXQgaXQgZG9lc24ndCBjYWxsIGFueSBmdW5jdGlvbnMgcmVnaXN0ZXJlZAorICAgICAgICAjIHdpdGggYXRleGl0IChhbmQgb25fZXhpdCkgb3IgYW55IHJlZ2lzdGVyZWQgc2lnbmFsIGhhbmRsZXJzLiAgSXQgYWxzbworICAgICAgICAjIGNsb3NlcyBhbnkgb3BlbiBmaWxlIGRlc2NyaXB0b3JzLiAgVXNpbmcgZXhpdCgpIG1heSBjYXVzZSBhbGwgc3RkaW8KKyAgICAgICAgIyBzdHJlYW1zIHRvIGJlIGZsdXNoZWQgdHdpY2UgYW5kIGFueSB0ZW1wb3JhcnkgZmlsZXMgbWF5IGJlIHVuZXhwZWN0ZWRseQorICAgICAgICAjIHJlbW92ZWQuICBJdCdzIHRoZXJlZm9yZSByZWNvbW1lbmRlZCB0aGF0IGNoaWxkIGJyYW5jaGVzIG9mIGEgZm9yaygpCisgICAgICAgICMgYW5kIHRoZSBwYXJlbnQgYnJhbmNoKGVzKSBvZiBhIGRhZW1vbiB1c2UgX2V4aXQoKS4KKyAgICAgICAgcmV0dXJuCisKKyAgICAjIENsb3NlIGFsbCBvcGVuIGZpbGUgZGVzY3JpcHRvcnMuICBUaGlzIHByZXZlbnRzIHRoZSBjaGlsZCBmcm9tIGtlZXBpbmcKKyAgICAjIG9wZW4gYW55IGZpbGUgZGVzY3JpcHRvcnMgaW5oZXJpdGVkIGZyb20gdGhlIHBhcmVudC4gIFRoZXJlIGlzIGEgdmFyaWV0eQorICAgICMgb2YgbWV0aG9kcyB0byBhY2NvbXBsaXNoIHRoaXMgdGFzay4gIFRocmVlIGFyZSBsaXN0ZWQgYmVsb3cuCisgICAgIworICAgICMgVHJ5IHRoZSBzeXN0ZW0gY29uZmlndXJhdGlvbiB2YXJpYWJsZSwgU0NfT1BFTl9NQVgsIHRvIG9idGFpbiB0aGUgbWF4aW11bQorICAgICMgbnVtYmVyIG9mIG9wZW4gZmlsZSBkZXNjcmlwdG9ycyB0byBjbG9zZS4gIElmIGl0IGRvZXNuJ3QgZXhpc3QsIHVzZQorICAgICMgdGhlIGRlZmF1bHQgdmFsdWUgKGNvbmZpZ3VyYWJsZSkuCisgICAgIworICAgICMgdHJ5OgorICAgICMgICAgIG1heGZkID0gb3Muc3lzY29uZigiU0NfT1BFTl9NQVgiKQorICAgICMgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgVmFsdWVFcnJvcik6CisgICAgIyAgICAgbWF4ZmQgPSBNQVhGRAorICAgICMKKyAgICAjIE9SCisgICAgIworICAgICMgaWYgKG9zLnN5c2NvbmZfbmFtZXMuaGFzX2tleSgiU0NfT1BFTl9NQVgiKSk6CisgICAgIyAgICAgbWF4ZmQgPSBvcy5zeXNjb25mKCJTQ19PUEVOX01BWCIpCisgICAgIyBlbHNlOgorICAgICMgICAgIG1heGZkID0gTUFYRkQKKyAgICAjCisgICAgIyBPUgorICAgICMKKyAgICAjIFVzZSB0aGUgZ2V0cmxpbWl0IG1ldGhvZCB0byByZXRyaWV2ZSB0aGUgbWF4aW11bSBmaWxlIGRlc2NyaXB0b3IgbnVtYmVyCisgICAgIyB0aGF0IGNhbiBiZSBvcGVuZWQgYnkgdGhpcyBwcm9jZXNzLiAgSWYgdGhlcmUgaXMgbm8gbGltaXQgb24gdGhlCisgICAgIyByZXNvdXJjZSwgdXNlIHRoZSBkZWZhdWx0IHZhbHVlLgorICAgICMKKyAgICBpbXBvcnQgcmVzb3VyY2UgICAgICAgICAgICAgIyBSZXNvdXJjZSB1c2FnZSBpbmZvcm1hdGlvbi4KKyAgICBtYXhmZCA9IHJlc291cmNlLmdldHJsaW1pdChyZXNvdXJjZS5STElNSVRfTk9GSUxFKVsxXQorICAgIGlmIChtYXhmZCA9PSByZXNvdXJjZS5STElNX0lORklOSVRZKToKKyAgICAgICAgbWF4ZmQgPSBNQVhGRAorICAKKyAgICAjIEl0ZXJhdGUgdGhyb3VnaCBhbmQgY2xvc2UgYWxsIGZpbGUgZGVzY3JpcHRvcnMuCisjICAgIGZvciBmZCBpbiByYW5nZSgwLCBtYXhmZCk6CisjICAgICAgICB0cnk6CisjICAgICAgICAgICAgb3MuY2xvc2UoZmQpCisjICAgICAgICBleGNlcHQgT1NFcnJvcjogICAgICAgICMgRVJST1IsIGZkIHdhc24ndCBvcGVuIHRvIGJlZ2luIHdpdGggKGlnbm9yZWQpCisjICAgICAgICAgICAgcGFzcworCisgICAgIyBSZWRpcmVjdCB0aGUgc3RhbmRhcmQgSS9PIGZpbGUgZGVzY3JpcHRvcnMgdG8gdGhlIHNwZWNpZmllZCBmaWxlLiAgU2luY2UKKyAgICAjIHRoZSBkYWVtb24gaGFzIG5vIGNvbnRyb2xsaW5nIHRlcm1pbmFsLCBtb3N0IGRhZW1vbnMgcmVkaXJlY3Qgc3RkaW4sCisgICAgIyBzdGRvdXQsIGFuZCBzdGRlcnIgdG8gL2Rldi9udWxsLiAgVGhpcyBpcyBkb25lIHRvIHByZXZlbnQgc2lkZS1lZmZlY3RzCisgICAgIyBmcm9tIHJlYWRzIGFuZCB3cml0ZXMgdG8gdGhlIHN0YW5kYXJkIEkvTyBmaWxlIGRlc2NyaXB0b3JzLgorCisgICAgIyBUaGlzIGNhbGwgdG8gb3BlbiBpcyBndWFyYW50ZWVkIHRvIHJldHVybiB0aGUgbG93ZXN0IGZpbGUgZGVzY3JpcHRvciwKKyAgICAjIHdoaWNoIHdpbGwgYmUgMCAoc3RkaW4pLCBzaW5jZSBpdCB3YXMgY2xvc2VkIGFib3ZlLgorIyAgICBvcy5vcGVuKFJFRElSRUNUX1RPLCBvcy5PX1JEV1IpICAgICMgc3RhbmRhcmQgaW5wdXQgKDApCisKKyAgICAjIER1cGxpY2F0ZSBzdGFuZGFyZCBpbnB1dCB0byBzdGFuZGFyZCBvdXRwdXQgYW5kIHN0YW5kYXJkIGVycm9yLgorIyAgICBvcy5kdXAyKDAsIDEpICAgICAgICAgICAgICAgICAgICAgICMgc3RhbmRhcmQgb3V0cHV0ICgxKQorIyAgICBvcy5kdXAyKDAsIDIpICAgICAgICAgICAgICAgICAgICAgICMgc3RhbmRhcmQgZXJyb3IgKDIpCisKKworICAgIHNpID0gZmlsZSgnL2Rldi9udWxsJywgJ3InKQorICAgIHNvID0gZmlsZShsb2dmaWxlLCAndycpCisgICAgc2UgPSBzbworCisKKyAgICAjIFJlcGxhY2UgdGhvc2UgZmRzIHdpdGggb3VyIG93bgorICAgIG9zLmR1cDIoc2kuZmlsZW5vKCksIHN5cy5zdGRpbi5maWxlbm8oKSkKKyAgICBvcy5kdXAyKHNvLmZpbGVubygpLCBzeXMuc3Rkb3V0LmZpbGVubygpKQorICAgIG9zLmR1cDIoc2UuZmlsZW5vKCksIHN5cy5zdGRlcnIuZmlsZW5vKCkpCisKKyAgICBmdW5jdGlvbigpCisKKyAgICBvcy5fZXhpdCgwKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvZGF0YS5weSBiL2JpdGJha2UvbGliL2JiL2RhdGEucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY0MTVhNAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL2RhdGEucHkKQEAgLTAsMCArMSw0NDYgQEAKKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisiIiIKK0JpdEJha2UgJ0RhdGEnIGltcGxlbWVudGF0aW9ucworCitGdW5jdGlvbnMgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIGRhdGEgc3RydWN0dXJlIHVzZWQgYnkgdGhlCitCaXRCYWtlIGJ1aWxkIHRvb2xzLgorCitUaGUgZXhwYW5kS2V5cyBhbmQgdXBkYXRlX2RhdGEgYXJlIHRoZSBtb3N0IGV4cGVuc2l2ZQorb3BlcmF0aW9ucy4gQXQgbmlnaHQgdGhlIGNvb2tpZSBtb25zdGVyIGNhbWUgYnkgYW5kCitzdWdnZXN0ZWQgJ2dpdmUgbWUgY29va2llcyBvbiBzZXR0aW5nIHRoZSB2YXJpYWJsZXMgYW5kCit0aGluZ3Mgd2lsbCB3b3JrIG91dCcuIFRha2luZyB0aGlzIHN1Z2dlc3Rpb24gaW50byBhY2NvdW50CithcHBseWluZyB0aGUgc2tpbGxzIGZyb20gdGhlIG5vdCB5ZXQgcGFzc2VkICdFbnR3dXJmIHVuZAorQW5hbHlzZSB2b24gQWxnb3JpdGhtZW4nIGxlY3R1cmUgYW5kIHRoZSBjb29raWUKK21vbnN0ZXIgc2VlbXMgdG8gYmUgcmlnaHQuIFdlIHdpbGwgdHJhY2sgc2V0VmFyIG1vcmUgY2FyZWZ1bGx5Cit0byBoYXZlIGZhc3RlciB1cGRhdGVfZGF0YSBhbmQgZXhwYW5kS2V5cyBvcGVyYXRpb25zLgorCitUaGlzIGlzIGEgdHJhZGUtb2ZmIGJldHdlZW4gc3BlZWQgYW5kIG1lbW9yeSBhZ2FpbiBidXQKK3RoZSBzcGVlZCBpcyBtb3JlIGNyaXRpY2FsIGhlcmUuCisiIiIKKworIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgIENocmlzIExhcnNvbgorIyBDb3B5cmlnaHQgKEMpIDIwMDUgICAgICAgIEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBCYXNlZCBvbiBmdW5jdGlvbnMgZnJvbSB0aGUgYmFzZSBiYiBtb2R1bGUsIENvcHlyaWdodCAyMDAzIEhvbGdlciBTY2h1cmlnCisKK2ltcG9ydCBzeXMsIG9zLCByZQoraWYgc3lzLmFyZ3ZbMF1bLTU6XSA9PSAicHlkb2MiOgorICAgIHBhdGggPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKHN5cy5hcmd2WzFdKSkKK2Vsc2U6CisgICAgcGF0aCA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoc3lzLmFyZ3ZbMF0pKQorc3lzLnBhdGguaW5zZXJ0KDAsIHBhdGgpCitmcm9tIGl0ZXJ0b29scyBpbXBvcnQgZ3JvdXBieQorCitmcm9tIGJiIGltcG9ydCBkYXRhX3NtYXJ0Citmcm9tIGJiIGltcG9ydCBjb2RlcGFyc2VyCitpbXBvcnQgYmIKKworbG9nZ2VyID0gZGF0YV9zbWFydC5sb2dnZXIKK19kaWN0X3R5cGUgPSBkYXRhX3NtYXJ0LkRhdGFTbWFydAorCitkZWYgaW5pdCgpOgorICAgICIiIlJldHVybiBhIG5ldyBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBCaXRiYWtlIGRhdGEiIiIKKyAgICByZXR1cm4gX2RpY3RfdHlwZSgpCisKK2RlZiBpbml0X2RiKHBhcmVudCA9IE5vbmUpOgorICAgICIiIlJldHVybiBhIG5ldyBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBCaXRiYWtlIGRhdGEsCisgICAgb3B0aW9uYWxseSBiYXNlZCBvbiBhbiBleGlzdGluZyBvYmplY3QiIiIKKyAgICBpZiBwYXJlbnQgaXMgbm90IE5vbmU6CisgICAgICAgIHJldHVybiBwYXJlbnQuY3JlYXRlQ29weSgpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIF9kaWN0X3R5cGUoKQorCitkZWYgY3JlYXRlQ29weShzb3VyY2UpOgorICAgICIiIkxpbmsgdGhlIHNvdXJjZSBzZXQgdG8gdGhlIGRlc3RpbmF0aW9uCisgICAgSWYgb25lIGRvZXMgbm90IGZpbmQgdGhlIHZhbHVlIGluIHRoZSBkZXN0aW5hdGlvbiBzZXQsCisgICAgc2VhcmNoIHdpbGwgZ28gb24gdG8gdGhlIHNvdXJjZSBzZXQgdG8gZ2V0IHRoZSB2YWx1ZS4KKyAgICBWYWx1ZSBmcm9tIHNvdXJjZSBhcmUgY29weS1vbi13cml0ZS4gaS5lLiBhbnkgdHJ5IHRvCisgICAgbW9kaWZ5IG9uZSBvZiB0aGVtIHdpbGwgZW5kIHVwIHB1dHRpbmcgdGhlIG1vZGlmaWVkIHZhbHVlCisgICAgaW4gdGhlIGRlc3RpbmF0aW9uIHNldC4KKyAgICAiIiIKKyAgICByZXR1cm4gc291cmNlLmNyZWF0ZUNvcHkoKQorCitkZWYgaW5pdFZhcih2YXIsIGQpOgorICAgICIiIk5vbi1kZXN0cnVjdGl2ZSB2YXIgaW5pdCBmb3IgZGF0YSBzdHJ1Y3R1cmUiIiIKKyAgICBkLmluaXRWYXIodmFyKQorCisKK2RlZiBzZXRWYXIodmFyLCB2YWx1ZSwgZCk6CisgICAgIiIiU2V0IGEgdmFyaWFibGUgdG8gYSBnaXZlbiB2YWx1ZSIiIgorICAgIGQuc2V0VmFyKHZhciwgdmFsdWUpCisKKworZGVmIGdldFZhcih2YXIsIGQsIGV4cCA9IEZhbHNlKToKKyAgICAiIiJHZXRzIHRoZSB2YWx1ZSBvZiBhIHZhcmlhYmxlIiIiCisgICAgcmV0dXJuIGQuZ2V0VmFyKHZhciwgZXhwKQorCisKK2RlZiByZW5hbWVWYXIoa2V5LCBuZXdrZXksIGQpOgorICAgICIiIlJlbmFtZXMgYSB2YXJpYWJsZSBmcm9tIGtleSB0byBuZXdrZXkiIiIKKyAgICBkLnJlbmFtZVZhcihrZXksIG5ld2tleSkKKworZGVmIGRlbFZhcih2YXIsIGQpOgorICAgICIiIlJlbW92ZXMgYSB2YXJpYWJsZSBmcm9tIHRoZSBkYXRhIHNldCIiIgorICAgIGQuZGVsVmFyKHZhcikKKworZGVmIGFwcGVuZFZhcih2YXIsIHZhbHVlLCBkKToKKyAgICAiIiJBcHBlbmQgYWRkaXRpb25hbCB2YWx1ZSB0byBhIHZhcmlhYmxlIiIiCisgICAgZC5hcHBlbmRWYXIodmFyLCB2YWx1ZSkKKworZGVmIHNldFZhckZsYWcodmFyLCBmbGFnLCBmbGFndmFsdWUsIGQpOgorICAgICIiIlNldCBhIGZsYWcgZm9yIGEgZ2l2ZW4gdmFyaWFibGUgdG8gYSBnaXZlbiB2YWx1ZSIiIgorICAgIGQuc2V0VmFyRmxhZyh2YXIsIGZsYWcsIGZsYWd2YWx1ZSkKKworZGVmIGdldFZhckZsYWcodmFyLCBmbGFnLCBkKToKKyAgICAiIiJHZXRzIGdpdmVuIGZsYWcgZnJvbSBnaXZlbiB2YXIiIiIKKyAgICByZXR1cm4gZC5nZXRWYXJGbGFnKHZhciwgZmxhZykKKworZGVmIGRlbFZhckZsYWcodmFyLCBmbGFnLCBkKToKKyAgICAiIiJSZW1vdmVzIGEgZ2l2ZW4gZmxhZyBmcm9tIHRoZSB2YXJpYWJsZSdzIGZsYWdzIiIiCisgICAgZC5kZWxWYXJGbGFnKHZhciwgZmxhZykKKworZGVmIHNldFZhckZsYWdzKHZhciwgZmxhZ3MsIGQpOgorICAgICIiIlNldCB0aGUgZmxhZ3MgZm9yIGEgZ2l2ZW4gdmFyaWFibGUKKworICAgIE5vdGU6CisgICAgICAgIHNldFZhckZsYWdzIHdpbGwgbm90IGNsZWFyIHByZXZpb3VzCisgICAgICAgIGZsYWdzLiBUaGluayBvZiB0aGlzIG1ldGhvZCBhcworICAgICAgICBhZGRWYXJGbGFncworICAgICIiIgorICAgIGQuc2V0VmFyRmxhZ3ModmFyLCBmbGFncykKKworZGVmIGdldFZhckZsYWdzKHZhciwgZCk6CisgICAgIiIiR2V0cyBhIHZhcmlhYmxlJ3MgZmxhZ3MiIiIKKyAgICByZXR1cm4gZC5nZXRWYXJGbGFncyh2YXIpCisKK2RlZiBkZWxWYXJGbGFncyh2YXIsIGQpOgorICAgICIiIlJlbW92ZXMgYSB2YXJpYWJsZSdzIGZsYWdzIiIiCisgICAgZC5kZWxWYXJGbGFncyh2YXIpCisKK2RlZiBrZXlzKGQpOgorICAgICIiIlJldHVybiBhIGxpc3Qgb2Yga2V5cyBpbiBkIiIiCisgICAgcmV0dXJuIGQua2V5cygpCisKKworX19leHBhbmRfdmFyX3JlZ2V4cF9fID0gcmUuY29tcGlsZShyIlwke1tee31dK30iKQorX19leHBhbmRfcHl0aG9uX3JlZ2V4cF9fID0gcmUuY29tcGlsZShyIlwke0AuKz99IikKKworZGVmIGV4cGFuZChzLCBkLCB2YXJuYW1lID0gTm9uZSk6CisgICAgIiIiVmFyaWFibGUgZXhwYW5zaW9uIHVzaW5nIHRoZSBkYXRhIHN0b3JlIiIiCisgICAgcmV0dXJuIGQuZXhwYW5kKHMsIHZhcm5hbWUpCisKK2RlZiBleHBhbmRLZXlzKGFsdGVyZGF0YSwgcmVhZGRhdGEgPSBOb25lKToKKyAgICBpZiByZWFkZGF0YSA9PSBOb25lOgorICAgICAgICByZWFkZGF0YSA9IGFsdGVyZGF0YQorCisgICAgdG9kb2xpc3QgPSB7fQorICAgIGZvciBrZXkgaW4gYWx0ZXJkYXRhOgorICAgICAgICBpZiBub3QgJyR7JyBpbiBrZXk6CisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIGVrZXkgPSBleHBhbmQoa2V5LCByZWFkZGF0YSkKKyAgICAgICAgaWYga2V5ID09IGVrZXk6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICB0b2RvbGlzdFtrZXldID0gZWtleQorCisgICAgIyBUaGVzZSB0d28gZm9yIGxvb3BzIGFyZSBzcGxpdCBmb3IgcGVyZm9ybWFuY2UgdG8gbWF4aW1pc2UgdGhlCisgICAgIyB1c2VmdWxuZXNzIG9mIHRoZSBleHBhbmQgY2FjaGUKKyAgICBmb3Iga2V5IGluIHNvcnRlZCh0b2RvbGlzdCk6CisgICAgICAgIGVrZXkgPSB0b2RvbGlzdFtrZXldCisgICAgICAgIG5ld3ZhbCA9IGFsdGVyZGF0YS5nZXRWYXIoZWtleSwgRmFsc2UpCisgICAgICAgIGlmIG5ld3ZhbCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHZhbCA9IGFsdGVyZGF0YS5nZXRWYXIoa2V5LCBGYWxzZSkKKyAgICAgICAgICAgIGlmIHZhbCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBiYi53YXJuKCJWYXJpYWJsZSBrZXkgJXMgKCVzKSByZXBsYWNlcyBvcmlnaW5hbCBrZXkgJXMgKCVzKS4iICUgKGtleSwgdmFsLCBla2V5LCBuZXd2YWwpKQorICAgICAgICBhbHRlcmRhdGEucmVuYW1lVmFyKGtleSwgZWtleSkKKworZGVmIGluaGVyaXRGcm9tT1MoZCwgc2F2ZWRlbnYsIHBlcm1pdHRlZCk6CisgICAgIiIiSW5oZXJpdCB2YXJpYWJsZXMgZnJvbSB0aGUgaW5pdGlhbCBlbnZpcm9ubWVudC4iIiIKKyAgICBleHBvcnRsaXN0ID0gYmIudXRpbHMucHJlc2VydmVkX2VudnZhcnNfZXhwb3J0ZWQoKQorICAgIGZvciBzIGluIHNhdmVkZW52LmtleXMoKToKKyAgICAgICAgaWYgcyBpbiBwZXJtaXR0ZWQ6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZC5zZXRWYXIocywgc2F2ZWRlbnYuZ2V0VmFyKHMsIFRydWUpLCBvcCA9ICdmcm9tIGVudicpCisgICAgICAgICAgICAgICAgaWYgcyBpbiBleHBvcnRsaXN0OgorICAgICAgICAgICAgICAgICAgICBkLnNldFZhckZsYWcocywgImV4cG9ydCIsIFRydWUsIG9wID0gJ2F1dG8gZW52IGV4cG9ydCcpCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworZGVmIGVtaXRfdmFyKHZhciwgbz1zeXMuX19zdGRvdXRfXywgZCA9IGluaXQoKSwgYWxsPUZhbHNlKToKKyAgICAiIiJFbWl0IGEgdmFyaWFibGUgdG8gYmUgc291cmNlZCBieSBhIHNoZWxsLiIiIgorICAgIGlmIGQuZ2V0VmFyRmxhZyh2YXIsICJweXRob24iKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBleHBvcnQgPSBkLmdldFZhckZsYWcodmFyLCAiZXhwb3J0IikKKyAgICB1bmV4cG9ydCA9IGQuZ2V0VmFyRmxhZyh2YXIsICJ1bmV4cG9ydCIpCisgICAgZnVuYyA9IGQuZ2V0VmFyRmxhZyh2YXIsICJmdW5jIikKKyAgICBpZiBub3QgYWxsIGFuZCBub3QgZXhwb3J0IGFuZCBub3QgdW5leHBvcnQgYW5kIG5vdCBmdW5jOgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIHRyeToKKyAgICAgICAgaWYgYWxsOgorICAgICAgICAgICAgb3ZhbCA9IGQuZ2V0VmFyKHZhciwgRmFsc2UpCisgICAgICAgIHZhbCA9IGQuZ2V0VmFyKHZhciwgVHJ1ZSkKKyAgICBleGNlcHQgKEtleWJvYXJkSW50ZXJydXB0LCBiYi5idWlsZC5GdW5jRmFpbGVkKToKKyAgICAgICAgcmFpc2UKKyAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoKKyAgICAgICAgby53cml0ZSgnIyBleHBhbnNpb24gb2YgJXMgdGhyZXcgJXM6ICVzXG4nICUgKHZhciwgZXhjLl9fY2xhc3NfXy5fX25hbWVfXywgc3RyKGV4YykpKQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGlmIGFsbDoKKyAgICAgICAgZC52YXJoaXN0b3J5LmVtaXQodmFyLCBvdmFsLCB2YWwsIG8sIGQpCisKKyAgICBpZiAodmFyLmZpbmQoIi0iKSAhPSAtMSBvciB2YXIuZmluZCgiLiIpICE9IC0xIG9yIHZhci5maW5kKCd7JykgIT0gLTEgb3IgdmFyLmZpbmQoJ30nKSAhPSAtMSBvciB2YXIuZmluZCgnKycpICE9IC0xKSBhbmQgbm90IGFsbDoKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICB2YXJFeHBhbmRlZCA9IGQuZXhwYW5kKHZhcikKKworICAgIGlmIHVuZXhwb3J0OgorICAgICAgICBvLndyaXRlKCd1bnNldCAlc1xuJyAlIHZhckV4cGFuZGVkKQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGlmIHZhbCBpcyBOb25lOgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIHZhbCA9IHN0cih2YWwpCisKKyAgICBpZiB2YXJFeHBhbmRlZC5zdGFydHN3aXRoKCJCQVNIX0ZVTkNfIik6CisgICAgICAgIHZhckV4cGFuZGVkID0gdmFyRXhwYW5kZWRbMTA6LTJdCisgICAgICAgIHZhbCA9IHZhbFszOl0gIyBTdHJpcCBvZmYgIigpICIKKyAgICAgICAgby53cml0ZSgiJXMoKSAlc1xuIiAlICh2YXJFeHBhbmRlZCwgdmFsKSkKKyAgICAgICAgby53cml0ZSgiZXhwb3J0IC1mICVzXG4iICUgKHZhckV4cGFuZGVkKSkKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGlmIGZ1bmM6CisgICAgICAgICMgTk9URTogc2hvdWxkIHByb2JhYmx5IGNoZWNrIGZvciB1bmJhbGFuY2VkIHt9IHdpdGhpbiB0aGUgdmFyCisgICAgICAgIG8ud3JpdGUoIiVzKCkge1xuJXNcbn1cbiIgJSAodmFyRXhwYW5kZWQsIHZhbCkpCisgICAgICAgIHJldHVybiAxCisKKyAgICBpZiBleHBvcnQ6CisgICAgICAgIG8ud3JpdGUoJ2V4cG9ydCAnKQorCisgICAgIyBpZiB3ZSdyZSBnb2luZyB0byBvdXRwdXQgdGhpcyB3aXRoaW4gZG91YmxlcXVvdGVzLAorICAgICMgdG8gYSBzaGVsbCwgd2UgbmVlZCB0byBlc2NhcGUgdGhlIHF1b3RlcyBpbiB0aGUgdmFyCisgICAgYWx0ZXIgPSByZS5zdWIoJyInLCAnXFwiJywgdmFsKQorICAgIGFsdGVyID0gcmUuc3ViKCdcbicsICcgXFxcbicsIGFsdGVyKQorICAgIGFsdGVyID0gcmUuc3ViKCdcXCQnLCAnXFxcXCQnLCBhbHRlcikKKyAgICBvLndyaXRlKCclcz0iJXMiXG4nICUgKHZhckV4cGFuZGVkLCBhbHRlcikpCisgICAgcmV0dXJuIEZhbHNlCisKK2RlZiBlbWl0X2VudihvPXN5cy5fX3N0ZG91dF9fLCBkID0gaW5pdCgpLCBhbGw9RmFsc2UpOgorICAgICIiIkVtaXRzIGFsbCBpdGVtcyBpbiB0aGUgZGF0YSBzdG9yZSBpbiBhIGZvcm1hdCBzdWNoIHRoYXQgaXQgY2FuIGJlIHNvdXJjZWQgYnkgYSBzaGVsbC4iIiIKKworICAgIGlzZnVuYyA9IGxhbWJkYSBrZXk6IGJvb2woZC5nZXRWYXJGbGFnKGtleSwgImZ1bmMiKSkKKyAgICBrZXlzID0gc29ydGVkKChrZXkgZm9yIGtleSBpbiBkLmtleXMoKSBpZiBub3Qga2V5LnN0YXJ0c3dpdGgoIl9fIikpLCBrZXk9aXNmdW5jKQorICAgIGdyb3VwZWQgPSBncm91cGJ5KGtleXMsIGlzZnVuYykKKyAgICBmb3IgaXNmdW5jLCBrZXlzIGluIGdyb3VwZWQ6CisgICAgICAgIGZvciBrZXkgaW4ga2V5czoKKyAgICAgICAgICAgIGVtaXRfdmFyKGtleSwgbywgZCwgYWxsIGFuZCBub3QgaXNmdW5jKSBhbmQgby53cml0ZSgnXG4nKQorCitkZWYgZXhwb3J0ZWRfa2V5cyhkKToKKyAgICByZXR1cm4gKGtleSBmb3Iga2V5IGluIGQua2V5cygpIGlmIG5vdCBrZXkuc3RhcnRzd2l0aCgnX18nKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5nZXRWYXJGbGFnKGtleSwgJ2V4cG9ydCcpIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgZC5nZXRWYXJGbGFnKGtleSwgJ3VuZXhwb3J0JykpCisKK2RlZiBleHBvcnRlZF92YXJzKGQpOgorICAgIGZvciBrZXkgaW4gZXhwb3J0ZWRfa2V5cyhkKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdmFsdWUgPSBkLmdldFZhcihrZXksIFRydWUpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgaWYgdmFsdWUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB5aWVsZCBrZXksIHN0cih2YWx1ZSkKKworZGVmIGVtaXRfZnVuYyhmdW5jLCBvPXN5cy5fX3N0ZG91dF9fLCBkID0gaW5pdCgpKToKKyAgICAiIiJFbWl0cyBhbGwgaXRlbXMgaW4gdGhlIGRhdGEgc3RvcmUgaW4gYSBmb3JtYXQgc3VjaCB0aGF0IGl0IGNhbiBiZSBzb3VyY2VkIGJ5IGEgc2hlbGwuIiIiCisKKyAgICBrZXlzID0gKGtleSBmb3Iga2V5IGluIGQua2V5cygpIGlmIG5vdCBrZXkuc3RhcnRzd2l0aCgiX18iKSBhbmQgbm90IGQuZ2V0VmFyRmxhZyhrZXksICJmdW5jIikpCisgICAgZm9yIGtleSBpbiBrZXlzOgorICAgICAgICBlbWl0X3ZhcihrZXksIG8sIGQsIEZhbHNlKQorCisgICAgby53cml0ZSgnXG4nKQorICAgIGVtaXRfdmFyKGZ1bmMsIG8sIGQsIEZhbHNlKSBhbmQgby53cml0ZSgnXG4nKQorICAgIG5ld2RlcHMgPSBiYi5jb2RlcGFyc2VyLlNoZWxsUGFyc2VyKGZ1bmMsIGxvZ2dlcikucGFyc2Vfc2hlbGwoZC5nZXRWYXIoZnVuYywgVHJ1ZSkpCisgICAgbmV3ZGVwcyB8PSBzZXQoKGQuZ2V0VmFyRmxhZyhmdW5jLCAidmFyZGVwcyIsIFRydWUpIG9yICIiKS5zcGxpdCgpKQorICAgIHNlZW4gPSBzZXQoKQorICAgIHdoaWxlIG5ld2RlcHM6CisgICAgICAgIGRlcHMgPSBuZXdkZXBzCisgICAgICAgIHNlZW4gfD0gZGVwcworICAgICAgICBuZXdkZXBzID0gc2V0KCkKKyAgICAgICAgZm9yIGRlcCBpbiBkZXBzOgorICAgICAgICAgICAgaWYgZC5nZXRWYXJGbGFnKGRlcCwgImZ1bmMiKSBhbmQgbm90IGQuZ2V0VmFyRmxhZyhkZXAsICJweXRob24iKToKKyAgICAgICAgICAgICAgIGVtaXRfdmFyKGRlcCwgbywgZCwgRmFsc2UpIGFuZCBvLndyaXRlKCdcbicpCisgICAgICAgICAgICAgICBuZXdkZXBzIHw9ICBiYi5jb2RlcGFyc2VyLlNoZWxsUGFyc2VyKGRlcCwgbG9nZ2VyKS5wYXJzZV9zaGVsbChkLmdldFZhcihkZXAsIFRydWUpKQorICAgICAgICAgICAgICAgbmV3ZGVwcyB8PSBzZXQoKGQuZ2V0VmFyRmxhZyhkZXAsICJ2YXJkZXBzIiwgVHJ1ZSkgb3IgIiIpLnNwbGl0KCkpCisgICAgICAgIG5ld2RlcHMgLT0gc2VlbgorCitfZnVuY3Rpb25mbXQgPSAiIiIKK2RlZiB7ZnVuY3Rpb259KGQpOgore2JvZHl9IiIiCisKK2RlZiBlbWl0X2Z1bmNfcHl0aG9uKGZ1bmMsIG89c3lzLl9fc3Rkb3V0X18sIGQgPSBpbml0KCkpOgorICAgICIiIkVtaXRzIGFsbCBpdGVtcyBpbiB0aGUgZGF0YSBzdG9yZSBpbiBhIGZvcm1hdCBzdWNoIHRoYXQgaXQgY2FuIGJlIHNvdXJjZWQgYnkgYSBzaGVsbC4iIiIKKworICAgIGRlZiB3cml0ZV9mdW5jKGZ1bmMsIG8sIGNhbGwgPSBGYWxzZSk6CisgICAgICAgIGJvZHkgPSBkLmdldFZhcihmdW5jLCBUcnVlKQorICAgICAgICBpZiBub3QgYm9keS5zdGFydHN3aXRoKCJkZWYiKToKKyAgICAgICAgICAgIGJvZHkgPSBfZnVuY3Rpb25mbXQuZm9ybWF0KGZ1bmN0aW9uPWZ1bmMsIGJvZHk9Ym9keSkKKworICAgICAgICBvLndyaXRlKGJvZHkuc3RyaXAoKSArICJcblxuIikKKyAgICAgICAgaWYgY2FsbDoKKyAgICAgICAgICAgIG8ud3JpdGUoZnVuYyArICIoZCkiICsgIlxuXG4iKQorCisgICAgd3JpdGVfZnVuYyhmdW5jLCBvLCBUcnVlKQorICAgIHBwID0gYmIuY29kZXBhcnNlci5QeXRob25QYXJzZXIoZnVuYywgbG9nZ2VyKQorICAgIHBwLnBhcnNlX3B5dGhvbihkLmdldFZhcihmdW5jLCBUcnVlKSkKKyAgICBuZXdkZXBzID0gcHAuZXhlY3MKKyAgICBuZXdkZXBzIHw9IHNldCgoZC5nZXRWYXJGbGFnKGZ1bmMsICJ2YXJkZXBzIiwgVHJ1ZSkgb3IgIiIpLnNwbGl0KCkpCisgICAgc2VlbiA9IHNldCgpCisgICAgd2hpbGUgbmV3ZGVwczoKKyAgICAgICAgZGVwcyA9IG5ld2RlcHMKKyAgICAgICAgc2VlbiB8PSBkZXBzCisgICAgICAgIG5ld2RlcHMgPSBzZXQoKQorICAgICAgICBmb3IgZGVwIGluIGRlcHM6CisgICAgICAgICAgICBpZiBkLmdldFZhckZsYWcoZGVwLCAiZnVuYyIpIGFuZCBkLmdldFZhckZsYWcoZGVwLCAicHl0aG9uIik6CisgICAgICAgICAgICAgICB3cml0ZV9mdW5jKGRlcCwgbykKKyAgICAgICAgICAgICAgIHBwID0gYmIuY29kZXBhcnNlci5QeXRob25QYXJzZXIoZGVwLCBsb2dnZXIpCisgICAgICAgICAgICAgICBwcC5wYXJzZV9weXRob24oZC5nZXRWYXIoZGVwLCBUcnVlKSkKKyAgICAgICAgICAgICAgIG5ld2RlcHMgfD0gcHAuZXhlY3MKKyAgICAgICAgICAgICAgIG5ld2RlcHMgfD0gc2V0KChkLmdldFZhckZsYWcoZGVwLCAidmFyZGVwcyIsIFRydWUpIG9yICIiKS5zcGxpdCgpKQorICAgICAgICBuZXdkZXBzIC09IHNlZW4KKworZGVmIHVwZGF0ZV9kYXRhKGQpOgorICAgICIiIlBlcmZvcm1zIGZpbmFsIHN0ZXBzIHVwb24gdGhlIGRhdGFzdG9yZSwgaW5jbHVkaW5nIGFwcGxpY2F0aW9uIG9mIG92ZXJyaWRlcyIiIgorICAgIGQuZmluYWxpemUocGFyZW50ID0gVHJ1ZSkKKworZGVmIGJ1aWxkX2RlcGVuZGVuY2llcyhrZXksIGtleXMsIHNoZWxsZGVwcywgdmFyZmxhZ3NleGNsLCBkKToKKyAgICBkZXBzID0gc2V0KCkKKyAgICB0cnk6CisgICAgICAgIGlmIGtleVstMV0gPT0gJ10nOgorICAgICAgICAgICAgdmYgPSBrZXlbOi0xXS5zcGxpdCgnWycpCisgICAgICAgICAgICB2YWx1ZSA9IGQuZ2V0VmFyRmxhZyh2ZlswXSwgdmZbMV0sIEZhbHNlKQorICAgICAgICAgICAgcGFyc2VyID0gZC5leHBhbmRXaXRoUmVmcyh2YWx1ZSwga2V5KQorICAgICAgICAgICAgZGVwcyB8PSBwYXJzZXIucmVmZXJlbmNlcworICAgICAgICAgICAgZGVwcyA9IGRlcHMgfCAoa2V5cyAmIHBhcnNlci5leGVjcykKKyAgICAgICAgICAgIHJldHVybiBkZXBzLCB2YWx1ZQorICAgICAgICB2YXJmbGFncyA9IGQuZ2V0VmFyRmxhZ3Moa2V5LCBbInZhcmRlcHMiLCAidmFyZGVwdmFsdWUiLCAidmFyZGVwc2V4Y2x1ZGUiLCAidmFyZGVwdmFsdWVleGNsdWRlIiwgInBvc3RmdW5jcyIsICJwcmVmdW5jcyJdKSBvciB7fQorICAgICAgICB2YXJkZXBzID0gdmFyZmxhZ3MuZ2V0KCJ2YXJkZXBzIikKKyAgICAgICAgdmFsdWUgPSBkLmdldFZhcihrZXksIEZhbHNlKQorCisgICAgICAgIGRlZiBoYW5kbGVfY29udGFpbnModmFsdWUsIGNvbnRhaW5zLCBkKToKKyAgICAgICAgICAgIG5ld3ZhbHVlID0gIiIKKyAgICAgICAgICAgIGZvciBrIGluIHNvcnRlZChjb250YWlucyk6CisgICAgICAgICAgICAgICAgbCA9IChkLmdldFZhcihrLCBUcnVlKSBvciAiIikuc3BsaXQoKQorICAgICAgICAgICAgICAgIGZvciB3b3JkIGluIHNvcnRlZChjb250YWluc1trXSk6CisgICAgICAgICAgICAgICAgICAgIGlmIHdvcmQgaW4gbDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld3ZhbHVlICs9ICJcbiVzeyVzfSA9IFNldCIgJSAgKGssIHdvcmQpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBuZXd2YWx1ZSArPSAiXG4lc3slc30gPSBVbnNldCIgJSAgKGssIHdvcmQpCisgICAgICAgICAgICBpZiBub3QgbmV3dmFsdWU6CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlCisgICAgICAgICAgICBpZiBub3QgdmFsdWU6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ld3ZhbHVlCisgICAgICAgICAgICByZXR1cm4gdmFsdWUgKyBuZXd2YWx1ZQorCisgICAgICAgIGlmICJ2YXJkZXB2YWx1ZSIgaW4gdmFyZmxhZ3M6CisgICAgICAgICAgIHZhbHVlID0gdmFyZmxhZ3MuZ2V0KCJ2YXJkZXB2YWx1ZSIpCisgICAgICAgIGVsaWYgdmFyZmxhZ3MuZ2V0KCJmdW5jIik6CisgICAgICAgICAgICBpZiB2YXJmbGFncy5nZXQoInB5dGhvbiIpOgorICAgICAgICAgICAgICAgIHBhcnNlZHZhciA9IGQuZXhwYW5kV2l0aFJlZnModmFsdWUsIGtleSkKKyAgICAgICAgICAgICAgICBwYXJzZXIgPSBiYi5jb2RlcGFyc2VyLlB5dGhvblBhcnNlcihrZXksIGxvZ2dlcikKKyAgICAgICAgICAgICAgICBpZiBwYXJzZWR2YXIudmFsdWUgYW5kICJcdCIgaW4gcGFyc2VkdmFyLnZhbHVlOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiVmFyaWFibGUgJXMgY29udGFpbnMgdGFicywgcGxlYXNlIHJlbW92ZSB0aGVzZSAoJXMpIiAlIChrZXksIGQuZ2V0VmFyKCJGSUxFIiwgVHJ1ZSkpKQorICAgICAgICAgICAgICAgIHBhcnNlci5wYXJzZV9weXRob24ocGFyc2VkdmFyLnZhbHVlKQorICAgICAgICAgICAgICAgIGRlcHMgPSBkZXBzIHwgcGFyc2VyLnJlZmVyZW5jZXMKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGhhbmRsZV9jb250YWlucyh2YWx1ZSwgcGFyc2VyLmNvbnRhaW5zLCBkKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwYXJzZWR2YXIgPSBkLmV4cGFuZFdpdGhSZWZzKHZhbHVlLCBrZXkpCisgICAgICAgICAgICAgICAgcGFyc2VyID0gYmIuY29kZXBhcnNlci5TaGVsbFBhcnNlcihrZXksIGxvZ2dlcikKKyAgICAgICAgICAgICAgICBwYXJzZXIucGFyc2Vfc2hlbGwocGFyc2VkdmFyLnZhbHVlKQorICAgICAgICAgICAgICAgIGRlcHMgPSBkZXBzIHwgc2hlbGxkZXBzCisgICAgICAgICAgICBpZiB2YXJkZXBzIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcGFyc2VyLmxvZy5mbHVzaCgpCisgICAgICAgICAgICBpZiAicHJlZnVuY3MiIGluIHZhcmZsYWdzOgorICAgICAgICAgICAgICAgIGRlcHMgPSBkZXBzIHwgc2V0KHZhcmZsYWdzWyJwcmVmdW5jcyJdLnNwbGl0KCkpCisgICAgICAgICAgICBpZiAicG9zdGZ1bmNzIiBpbiB2YXJmbGFnczoKKyAgICAgICAgICAgICAgICBkZXBzID0gZGVwcyB8IHNldCh2YXJmbGFnc1sicG9zdGZ1bmNzIl0uc3BsaXQoKSkKKyAgICAgICAgICAgIGRlcHMgPSBkZXBzIHwgcGFyc2VkdmFyLnJlZmVyZW5jZXMKKyAgICAgICAgICAgIGRlcHMgPSBkZXBzIHwgKGtleXMgJiBwYXJzZXIuZXhlY3MpIHwgKGtleXMgJiBwYXJzZWR2YXIuZXhlY3MpCisgICAgICAgICAgICB2YWx1ZSA9IGhhbmRsZV9jb250YWlucyh2YWx1ZSwgcGFyc2VkdmFyLmNvbnRhaW5zLCBkKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGFyc2VyID0gZC5leHBhbmRXaXRoUmVmcyh2YWx1ZSwga2V5KQorICAgICAgICAgICAgZGVwcyB8PSBwYXJzZXIucmVmZXJlbmNlcworICAgICAgICAgICAgZGVwcyA9IGRlcHMgfCAoa2V5cyAmIHBhcnNlci5leGVjcykKKyAgICAgICAgICAgIHZhbHVlID0gaGFuZGxlX2NvbnRhaW5zKHZhbHVlLCBwYXJzZXIuY29udGFpbnMsIGQpCisKKyAgICAgICAgaWYgInZhcmRlcHZhbHVlZXhjbHVkZSIgaW4gdmFyZmxhZ3M6CisgICAgICAgICAgICBleGNsdWRlID0gdmFyZmxhZ3MuZ2V0KCJ2YXJkZXB2YWx1ZWV4Y2x1ZGUiKQorICAgICAgICAgICAgZm9yIGV4Y2wgaW4gZXhjbHVkZS5zcGxpdCgnfCcpOgorICAgICAgICAgICAgICAgIGlmIGV4Y2w6CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShleGNsLCAnJykKKworICAgICAgICAjIEFkZCB2YXJmbGFncywgYXNzdW1pbmcgYW4gZXhjbHVzaW9uIGxpc3QgaXMgc2V0CisgICAgICAgIGlmIHZhcmZsYWdzZXhjbDoKKyAgICAgICAgICAgIHZhcmZkZXBzID0gW10KKyAgICAgICAgICAgIGZvciBmIGluIHZhcmZsYWdzOgorICAgICAgICAgICAgICAgIGlmIGYgbm90IGluIHZhcmZsYWdzZXhjbDoKKyAgICAgICAgICAgICAgICAgICAgdmFyZmRlcHMuYXBwZW5kKCclc1slc10nICUgKGtleSwgZikpCisgICAgICAgICAgICBpZiB2YXJmZGVwczoKKyAgICAgICAgICAgICAgICBkZXBzIHw9IHNldCh2YXJmZGVwcykKKworICAgICAgICBkZXBzIHw9IHNldCgodmFyZGVwcyBvciAiIikuc3BsaXQoKSkKKyAgICAgICAgZGVwcyAtPSBzZXQodmFyZmxhZ3MuZ2V0KCJ2YXJkZXBzZXhjbHVkZSIsICIiKS5zcGxpdCgpKQorICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgcmFpc2UgYmIuZGF0YV9zbWFydC5FeHBhbnNpb25FcnJvcihrZXksIE5vbmUsIGUpCisgICAgcmV0dXJuIGRlcHMsIHZhbHVlCisgICAgI2JiLm5vdGUoIlZhcmlhYmxlICVzIHJlZmVyZW5jZXMgJXMgYW5kIGNhbGxzICVzIiAlIChrZXksIHN0cihkZXBzKSwgc3RyKGV4ZWNzKSkpCisgICAgI2Quc2V0VmFyRmxhZyhrZXksICJ2YXJkZXBzIiwgZGVwcykKKworZGVmIGdlbmVyYXRlX2RlcGVuZGVuY2llcyhkKToKKworICAgIGtleXMgPSBzZXQoa2V5IGZvciBrZXkgaW4gZCBpZiBub3Qga2V5LnN0YXJ0c3dpdGgoIl9fIikpCisgICAgc2hlbGxkZXBzID0gc2V0KGtleSBmb3Iga2V5IGluIGQuZ2V0VmFyKCJfX2V4cG9ydGxpc3QiLCBGYWxzZSkgaWYgZC5nZXRWYXJGbGFnKGtleSwgImV4cG9ydCIpIGFuZCBub3QgZC5nZXRWYXJGbGFnKGtleSwgInVuZXhwb3J0IikpCisgICAgdmFyZmxhZ3NleGNsID0gZC5nZXRWYXIoJ0JCX1NJR05BVFVSRV9FWENMVURFX0ZMQUdTJywgVHJ1ZSkKKworICAgIGRlcHMgPSB7fQorICAgIHZhbHVlcyA9IHt9CisKKyAgICB0YXNrbGlzdCA9IGQuZ2V0VmFyKCdfX0JCVEFTS1MnLCBGYWxzZSkgb3IgW10KKyAgICBmb3IgdGFzayBpbiB0YXNrbGlzdDoKKyAgICAgICAgZGVwc1t0YXNrXSwgdmFsdWVzW3Rhc2tdID0gYnVpbGRfZGVwZW5kZW5jaWVzKHRhc2ssIGtleXMsIHNoZWxsZGVwcywgdmFyZmxhZ3NleGNsLCBkKQorICAgICAgICBuZXdkZXBzID0gZGVwc1t0YXNrXQorICAgICAgICBzZWVuID0gc2V0KCkKKyAgICAgICAgd2hpbGUgbmV3ZGVwczoKKyAgICAgICAgICAgIG5leHRkZXBzID0gbmV3ZGVwcworICAgICAgICAgICAgc2VlbiB8PSBuZXh0ZGVwcworICAgICAgICAgICAgbmV3ZGVwcyA9IHNldCgpCisgICAgICAgICAgICBmb3IgZGVwIGluIG5leHRkZXBzOgorICAgICAgICAgICAgICAgIGlmIGRlcCBub3QgaW4gZGVwczoKKyAgICAgICAgICAgICAgICAgICAgZGVwc1tkZXBdLCB2YWx1ZXNbZGVwXSA9IGJ1aWxkX2RlcGVuZGVuY2llcyhkZXAsIGtleXMsIHNoZWxsZGVwcywgdmFyZmxhZ3NleGNsLCBkKQorICAgICAgICAgICAgICAgIG5ld2RlcHMgfD0gIGRlcHNbZGVwXQorICAgICAgICAgICAgbmV3ZGVwcyAtPSBzZWVuCisgICAgICAgICNwcmludCAiRm9yICVzOiAlcyIgJSAodGFzaywgc3RyKGRlcHNbdGFza10pKQorICAgIHJldHVybiB0YXNrbGlzdCwgZGVwcywgdmFsdWVzCisKK2RlZiBpbmhlcml0c19jbGFzcyhrbGFzcywgZCk6CisgICAgdmFsID0gZC5nZXRWYXIoJ19faW5oZXJpdF9jYWNoZScsIEZhbHNlKSBvciBbXQorICAgIG5lZWRsZSA9IG9zLnBhdGguam9pbignY2xhc3NlcycsICclcy5iYmNsYXNzJyAlIGtsYXNzKQorICAgIGZvciB2IGluIHZhbDoKKyAgICAgICAgaWYgdi5lbmRzd2l0aChuZWVkbGUpOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICByZXR1cm4gRmFsc2UKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL2RhdGFfc21hcnQucHkgYi9iaXRiYWtlL2xpYi9iYi9kYXRhX3NtYXJ0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YjRlZDkKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9kYXRhX3NtYXJ0LnB5CkBAIC0wLDAgKzEsOTQyIEBACisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIiIiCitCaXRCYWtlIFNtYXJ0IERpY3Rpb25hcnkgSW1wbGVtZW50YXRpb24KKworRnVuY3Rpb25zIGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSBkYXRhIHN0cnVjdHVyZSB1c2VkIGJ5IHRoZQorQml0QmFrZSBidWlsZCB0b29scy4KKworIiIiCisKKyMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0ICBDaHJpcyBMYXJzb24KKyMgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1ICBTZWIgRnJhbmtlbmd1bAorIyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYgIEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCisjIENvcHlyaWdodCAoQykgMjAwNSAgICAgICAgVWxpIEx1Y2thcworIyBDb3B5cmlnaHQgKEMpIDIwMDUgICAgICAgIFJPQUQgR21iSAorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMgQmFzZWQgb24gZnVuY3Rpb25zIGZyb20gdGhlIGJhc2UgYmIgbW9kdWxlLCBDb3B5cmlnaHQgMjAwMyBIb2xnZXIgU2NodXJpZworCitpbXBvcnQgY29weSwgcmUsIHN5cywgdHJhY2ViYWNrCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBNdXRhYmxlTWFwcGluZworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBoYXNobGliCitpbXBvcnQgYmIsIGJiLmNvZGVwYXJzZXIKK2Zyb20gYmIgICBpbXBvcnQgdXRpbHMKK2Zyb20gYmIuQ09XICBpbXBvcnQgQ09XRGljdEJhc2UKKworbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoIkJpdEJha2UuRGF0YSIpCisKK19fc2V0dmFyX2tleXdvcmRfXyA9IFsiX2FwcGVuZCIsICJfcHJlcGVuZCIsICJfcmVtb3ZlIl0KK19fc2V0dmFyX3JlZ2V4cF9fID0gcmUuY29tcGlsZSgnKD9QPGJhc2U+Lio/KSg/UDxrZXl3b3JkPl9hcHBlbmR8X3ByZXBlbmR8X3JlbW92ZSkoXyg/UDxhZGQ+LiopKT8kJykKK19fZXhwYW5kX3Zhcl9yZWdleHBfXyA9IHJlLmNvbXBpbGUociJcJHtbXnt9QFxuXHQgXSt9IikKK19fZXhwYW5kX3B5dGhvbl9yZWdleHBfXyA9IHJlLmNvbXBpbGUociJcJHtALis/fSIpCisKK2RlZiBpbmZlcl9jYWxsZXJfZGV0YWlscyhsb2dpbmZvLCBwYXJlbnQgPSBGYWxzZSwgdmFydmFsID0gVHJ1ZSk6CisgICAgIiIiU2F2ZSB0aGUgY2FsbGVyIHRoZSB0cm91YmxlIG9mIHNwZWNpZnlpbmcgZXZlcnl0aGluZy4iIiIKKyAgICAjIFNhdmUgZWZmb3J0LgorICAgIGlmICdpZ25vcmUnIGluIGxvZ2luZm8gYW5kIGxvZ2luZm9bJ2lnbm9yZSddOgorICAgICAgICByZXR1cm4KKyAgICAjIElmIG5vdGhpbmcgd2FzIHByb3ZpZGVkLCBtYXJrIHRoaXMgYXMgcG9zc2libHkgdW5uZWVkZWQuCisgICAgaWYgbm90IGxvZ2luZm86CisgICAgICAgIGxvZ2luZm9bJ2lnbm9yZSddID0gVHJ1ZQorICAgICAgICByZXR1cm4KKyAgICAjIEluZmVyIGNhbGxlcidzIGxpa2VseSB2YWx1ZXMgZm9yIHZhcmlhYmxlICh2YXIpIGFuZCB2YWx1ZSAodmFsdWUpLCAKKyAgICAjIHRvIHJlZHVjZSBjbHV0dGVyIGluIHRoZSByZXN0IG9mIHRoZSBjb2RlLgorICAgIGFib3ZlID0gTm9uZQorICAgIGRlZiBzZXRfYWJvdmUoKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICB0YiA9IHN5cy5leGNfaW5mbygpWzJdCisgICAgICAgICAgICBpZiBwYXJlbnQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIHRiLnRiX2ZyYW1lLmZfYmFjay5mX2JhY2suZl9iYWNrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiB0Yi50Yl9mcmFtZS5mX2JhY2suZl9iYWNrCisKKyAgICBpZiB2YXJ2YWwgYW5kICgndmFyaWFibGUnIG5vdCBpbiBsb2dpbmZvIG9yICdkZXRhaWwnIG5vdCBpbiBsb2dpbmZvKToKKyAgICAgICAgaWYgbm90IGFib3ZlOgorICAgICAgICAgICAgYWJvdmUgPSBzZXRfYWJvdmUoKQorICAgICAgICBsY2xzID0gYWJvdmUuZl9sb2NhbHMuaXRlbXMoKQorICAgICAgICBmb3IgaywgdiBpbiBsY2xzOgorICAgICAgICAgICAgaWYgayA9PSAndmFsdWUnIGFuZCAnZGV0YWlsJyBub3QgaW4gbG9naW5mbzoKKyAgICAgICAgICAgICAgICBsb2dpbmZvWydkZXRhaWwnXSA9IHYKKyAgICAgICAgICAgIGlmIGsgPT0gJ3ZhcicgYW5kICd2YXJpYWJsZScgbm90IGluIGxvZ2luZm86CisgICAgICAgICAgICAgICAgbG9naW5mb1sndmFyaWFibGUnXSA9IHYKKyAgICAjIEluZmVyIGZpbGUvbGluZS9mdW5jdGlvbiBmcm9tIHRyYWNlYmFjaworICAgICMgRG9uJ3QgdXNlIHRyYWNlYmFjay5leHRyYWN0X3N0YWNrKCkgc2luY2UgaXQgZmlsbHMgdGhlIGxpbmUgY29udGVudHMgd2hpY2gKKyAgICAjIHdlIGRvbid0IG5lZWQgYW5kIHRoYXQgaGl0cyBzdGF0IHN5c2NhbGxzCisgICAgaWYgJ2ZpbGUnIG5vdCBpbiBsb2dpbmZvOgorICAgICAgICBpZiBub3QgYWJvdmU6CisgICAgICAgICAgICBhYm92ZSA9IHNldF9hYm92ZSgpCisgICAgICAgIGYgPSBhYm92ZS5mX2JhY2sKKyAgICAgICAgbGluZSA9IGYuZl9saW5lbm8KKyAgICAgICAgZmlsZSA9IGYuZl9jb2RlLmNvX2ZpbGVuYW1lCisgICAgICAgIGZ1bmMgPSBmLmZfY29kZS5jb19uYW1lCisgICAgICAgIGxvZ2luZm9bJ2ZpbGUnXSA9IGZpbGUKKyAgICAgICAgbG9naW5mb1snbGluZSddID0gbGluZQorICAgICAgICBpZiBmdW5jIG5vdCBpbiBsb2dpbmZvOgorICAgICAgICAgICAgbG9naW5mb1snZnVuYyddID0gZnVuYworCitjbGFzcyBWYXJpYWJsZVBhcnNlOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YXJuYW1lLCBkLCB2YWwgPSBOb25lKToKKyAgICAgICAgc2VsZi52YXJuYW1lID0gdmFybmFtZQorICAgICAgICBzZWxmLmQgPSBkCisgICAgICAgIHNlbGYudmFsdWUgPSB2YWwKKworICAgICAgICBzZWxmLnJlZmVyZW5jZXMgPSBzZXQoKQorICAgICAgICBzZWxmLmV4ZWNzID0gc2V0KCkKKyAgICAgICAgc2VsZi5jb250YWlucyA9IHt9CisKKyAgICBkZWYgdmFyX3N1YihzZWxmLCBtYXRjaCk6CisgICAgICAgICAgICBrZXkgPSBtYXRjaC5ncm91cCgpWzI6LTFdCisgICAgICAgICAgICBpZiBzZWxmLnZhcm5hbWUgYW5kIGtleToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnZhcm5hbWUgPT0ga2V5OgorICAgICAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oInZhcmlhYmxlICVzIHJlZmVyZW5jZXMgaXRzZWxmISIgJSBzZWxmLnZhcm5hbWUpCisgICAgICAgICAgICBpZiBrZXkgaW4gc2VsZi5kLmV4cGFuZF9jYWNoZToKKyAgICAgICAgICAgICAgICB2YXJwYXJzZSA9IHNlbGYuZC5leHBhbmRfY2FjaGVba2V5XQorICAgICAgICAgICAgICAgIHZhciA9IHZhcnBhcnNlLnZhbHVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHZhciA9IHNlbGYuZC5nZXRWYXJGbGFnKGtleSwgIl9jb250ZW50IiwgVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYucmVmZXJlbmNlcy5hZGQoa2V5KQorICAgICAgICAgICAgaWYgdmFyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybiB2YXIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoLmdyb3VwKCkKKworICAgIGRlZiBweXRob25fc3ViKHNlbGYsIG1hdGNoKToKKyAgICAgICAgICAgIGNvZGUgPSBtYXRjaC5ncm91cCgpWzM6LTFdCisgICAgICAgICAgICBjb2Rlb2JqID0gY29tcGlsZShjb2RlLnN0cmlwKCksIHNlbGYudmFybmFtZSBvciAiPGV4cGFuc2lvbj4iLCAiZXZhbCIpCisKKyAgICAgICAgICAgIHBhcnNlciA9IGJiLmNvZGVwYXJzZXIuUHl0aG9uUGFyc2VyKHNlbGYudmFybmFtZSwgbG9nZ2VyKQorICAgICAgICAgICAgcGFyc2VyLnBhcnNlX3B5dGhvbihjb2RlKQorICAgICAgICAgICAgaWYgc2VsZi52YXJuYW1lOgorICAgICAgICAgICAgICAgIHZhcmRlcHMgPSBzZWxmLmQuZ2V0VmFyRmxhZyhzZWxmLnZhcm5hbWUsICJ2YXJkZXBzIiwgVHJ1ZSkKKyAgICAgICAgICAgICAgICBpZiB2YXJkZXBzIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHBhcnNlci5sb2cuZmx1c2goKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwYXJzZXIubG9nLmZsdXNoKCkKKyAgICAgICAgICAgIHNlbGYucmVmZXJlbmNlcyB8PSBwYXJzZXIucmVmZXJlbmNlcworICAgICAgICAgICAgc2VsZi5leGVjcyB8PSBwYXJzZXIuZXhlY3MKKworICAgICAgICAgICAgZm9yIGsgaW4gcGFyc2VyLmNvbnRhaW5zOgorICAgICAgICAgICAgICAgIGlmIGsgbm90IGluIHNlbGYuY29udGFpbnM6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGFpbnNba10gPSBwYXJzZXIuY29udGFpbnNba10uY29weSgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250YWluc1trXS51cGRhdGUocGFyc2VyLmNvbnRhaW5zW2tdKQorICAgICAgICAgICAgdmFsdWUgPSB1dGlscy5iZXR0ZXJfZXZhbChjb2Rlb2JqLCBEYXRhQ29udGV4dChzZWxmLmQpKQorICAgICAgICAgICAgcmV0dXJuIHN0cih2YWx1ZSkKKworCitjbGFzcyBEYXRhQ29udGV4dChkaWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWV0YWRhdGEsICoqa3dhcmdzKToKKyAgICAgICAgc2VsZi5tZXRhZGF0YSA9IG1ldGFkYXRhCisgICAgICAgIGRpY3QuX19pbml0X18oc2VsZiwgKiprd2FyZ3MpCisgICAgICAgIHNlbGZbJ2QnXSA9IG1ldGFkYXRhCisKKyAgICBkZWYgX19taXNzaW5nX18oc2VsZiwga2V5KToKKyAgICAgICAgdmFsdWUgPSBzZWxmLm1ldGFkYXRhLmdldFZhcihrZXksIFRydWUpCisgICAgICAgIGlmIHZhbHVlIGlzIE5vbmUgb3Igc2VsZi5tZXRhZGF0YS5nZXRWYXJGbGFnKGtleSwgJ2Z1bmMnKToKKyAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKGtleSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZQorCitjbGFzcyBFeHBhbnNpb25FcnJvcihFeGNlcHRpb24pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YXJuYW1lLCBleHByZXNzaW9uLCBleGNlcHRpb24pOgorICAgICAgICBzZWxmLmV4cHJlc3Npb24gPSBleHByZXNzaW9uCisgICAgICAgIHNlbGYudmFyaWFibGVuYW1lID0gdmFybmFtZQorICAgICAgICBzZWxmLmV4Y2VwdGlvbiA9IGV4Y2VwdGlvbgorICAgICAgICBpZiB2YXJuYW1lOgorICAgICAgICAgICAgaWYgZXhwcmVzc2lvbjoKKyAgICAgICAgICAgICAgICBzZWxmLm1zZyA9ICJGYWlsdXJlIGV4cGFuZGluZyB2YXJpYWJsZSAlcywgZXhwcmVzc2lvbiB3YXMgJXMgd2hpY2ggdHJpZ2dlcmVkIGV4Y2VwdGlvbiAlczogJXMiICUgKHZhcm5hbWUsIGV4cHJlc3Npb24sIHR5cGUoZXhjZXB0aW9uKS5fX25hbWVfXywgZXhjZXB0aW9uKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLm1zZyA9ICJGYWlsdXJlIGV4cGFuZGluZyB2YXJpYWJsZSAlczogJXM6ICVzIiAlICh2YXJuYW1lLCB0eXBlKGV4Y2VwdGlvbikuX19uYW1lX18sIGV4Y2VwdGlvbikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYubXNnID0gIkZhaWx1cmUgZXhwYW5kaW5nIGV4cHJlc3Npb24gJXMgd2hpY2ggdHJpZ2dlcmVkIGV4Y2VwdGlvbiAlczogJXMiICUgKGV4cHJlc3Npb24sIHR5cGUoZXhjZXB0aW9uKS5fX25hbWVfXywgZXhjZXB0aW9uKQorICAgICAgICBFeGNlcHRpb24uX19pbml0X18oc2VsZiwgc2VsZi5tc2cpCisgICAgICAgIHNlbGYuYXJncyA9ICh2YXJuYW1lLCBleHByZXNzaW9uLCBleGNlcHRpb24pCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm1zZworCitjbGFzcyBJbmNsdWRlSGlzdG9yeShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnQgPSBOb25lLCBmaWxlbmFtZSA9ICdbVE9QIExFVkVMXScpOgorICAgICAgICBzZWxmLnBhcmVudCA9IHBhcmVudAorICAgICAgICBzZWxmLmZpbGVuYW1lID0gZmlsZW5hbWUKKyAgICAgICAgc2VsZi5jaGlsZHJlbiA9IFtdCisgICAgICAgIHNlbGYuY3VycmVudCA9IHNlbGYKKworICAgIGRlZiBjb3B5KHNlbGYpOgorICAgICAgICBuZXcgPSBJbmNsdWRlSGlzdG9yeShzZWxmLnBhcmVudCwgc2VsZi5maWxlbmFtZSkKKyAgICAgICAgZm9yIGMgaW4gc2VsZi5jaGlsZHJlbjoKKyAgICAgICAgICAgIG5ldy5jaGlsZHJlbi5hcHBlbmQoYykKKyAgICAgICAgcmV0dXJuIG5ldworCisgICAgZGVmIGluY2x1ZGUoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBuZXdmaWxlID0gSW5jbHVkZUhpc3Rvcnkoc2VsZi5jdXJyZW50LCBmaWxlbmFtZSkKKyAgICAgICAgc2VsZi5jdXJyZW50LmNoaWxkcmVuLmFwcGVuZChuZXdmaWxlKQorICAgICAgICBzZWxmLmN1cnJlbnQgPSBuZXdmaWxlCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgYSwgYiwgYyk6CisgICAgICAgIGlmIHNlbGYuY3VycmVudC5wYXJlbnQ6CisgICAgICAgICAgICBzZWxmLmN1cnJlbnQgPSBzZWxmLmN1cnJlbnQucGFyZW50CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBiYi53YXJuKCJJbmNsdWRlIGxvZzogVHJpZWQgdG8gZmluaXNoICclcycgYXQgdG9wIGxldmVsLiIgJSBmaWxlbmFtZSkKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgZW1pdChzZWxmLCBvLCBsZXZlbCA9IDApOgorICAgICAgICAiIiJFbWl0IGFuIGluY2x1ZGUgaGlzdG9yeSBmaWxlLCBhbmQgaXRzIGNoaWxkcmVuLiIiIgorICAgICAgICBpZiBsZXZlbDoKKyAgICAgICAgICAgIHNwYWNlcyA9ICIgICIgKiAobGV2ZWwgLSAxKQorICAgICAgICAgICAgby53cml0ZSgiIyAlcyVzIiAlIChzcGFjZXMsIHNlbGYuZmlsZW5hbWUpKQorICAgICAgICAgICAgaWYgbGVuKHNlbGYuY2hpbGRyZW4pID4gMDoKKyAgICAgICAgICAgICAgICBvLndyaXRlKCIgaW5jbHVkZXM6IikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG8ud3JpdGUoIiNcbiMgSU5DTFVERSBISVNUT1JZOlxuIyIpCisgICAgICAgIGxldmVsID0gbGV2ZWwgKyAxCisgICAgICAgIGZvciBjaGlsZCBpbiBzZWxmLmNoaWxkcmVuOgorICAgICAgICAgICAgby53cml0ZSgiXG4iKQorICAgICAgICAgICAgY2hpbGQuZW1pdChvLCBsZXZlbCkKKworY2xhc3MgVmFyaWFibGVIaXN0b3J5KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGFyb290KToKKyAgICAgICAgc2VsZi5kYXRhcm9vdCA9IGRhdGFyb290CisgICAgICAgIHNlbGYudmFyaWFibGVzID0gQ09XRGljdEJhc2UuY29weSgpCisKKyAgICBkZWYgY29weShzZWxmKToKKyAgICAgICAgbmV3ID0gVmFyaWFibGVIaXN0b3J5KHNlbGYuZGF0YXJvb3QpCisgICAgICAgIG5ldy52YXJpYWJsZXMgPSBzZWxmLnZhcmlhYmxlcy5jb3B5KCkKKyAgICAgICAgcmV0dXJuIG5ldworCisgICAgZGVmIHJlY29yZChzZWxmLCAqa3dvbmx5LCAqKmxvZ2luZm8pOgorICAgICAgICBpZiBub3Qgc2VsZi5kYXRhcm9vdC5fdHJhY2tpbmc6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbGVuKGt3b25seSkgPiAwOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yCisgICAgICAgIGluZmVyX2NhbGxlcl9kZXRhaWxzKGxvZ2luZm8sIHBhcmVudCA9IFRydWUpCisgICAgICAgIGlmICdpZ25vcmUnIGluIGxvZ2luZm8gYW5kIGxvZ2luZm9bJ2lnbm9yZSddOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmICdvcCcgbm90IGluIGxvZ2luZm8gb3Igbm90IGxvZ2luZm9bJ29wJ106CisgICAgICAgICAgICBsb2dpbmZvWydvcCddID0gJ3NldCcKKyAgICAgICAgaWYgJ2RldGFpbCcgaW4gbG9naW5mbzoKKyAgICAgICAgICAgIGxvZ2luZm9bJ2RldGFpbCddID0gc3RyKGxvZ2luZm9bJ2RldGFpbCddKQorICAgICAgICBpZiAndmFyaWFibGUnIG5vdCBpbiBsb2dpbmZvIG9yICdmaWxlJyBub3QgaW4gbG9naW5mbzoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInJlY29yZCgpIG1pc3NpbmcgdmFyaWFibGUgb3IgZmlsZS4iKQorICAgICAgICB2YXIgPSBsb2dpbmZvWyd2YXJpYWJsZSddCisKKyAgICAgICAgaWYgdmFyIG5vdCBpbiBzZWxmLnZhcmlhYmxlczoKKyAgICAgICAgICAgIHNlbGYudmFyaWFibGVzW3Zhcl0gPSBbXQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzZWxmLnZhcmlhYmxlc1t2YXJdLCBsaXN0KToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiAnbm9kdXBzJyBpbiBsb2dpbmZvIGFuZCBsb2dpbmZvIGluIHNlbGYudmFyaWFibGVzW3Zhcl06CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi52YXJpYWJsZXNbdmFyXS5hcHBlbmQobG9naW5mby5jb3B5KCkpCisKKyAgICBkZWYgdmFyaWFibGUoc2VsZiwgdmFyKToKKyAgICAgICAgaWYgdmFyIGluIHNlbGYudmFyaWFibGVzOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudmFyaWFibGVzW3Zhcl0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBbXQorCisgICAgZGVmIGVtaXQoc2VsZiwgdmFyLCBvdmFsLCB2YWwsIG8sIGQpOgorICAgICAgICBoaXN0b3J5ID0gc2VsZi52YXJpYWJsZSh2YXIpCisKKyAgICAgICAgIyBBcHBlbmQgb3ZlcnJpZGUgaGlzdG9yeQorICAgICAgICBpZiB2YXIgaW4gZC5vdmVycmlkZWRhdGE6CisgICAgICAgICAgICBmb3IgKHIsIG92ZXJyaWRlKSBpbiBkLm92ZXJyaWRlZGF0YVt2YXJdOgorICAgICAgICAgICAgICAgIGZvciBldmVudCBpbiBzZWxmLnZhcmlhYmxlKHIpOgorICAgICAgICAgICAgICAgICAgICBsb2dpbmZvID0gZXZlbnQuY29weSgpCisgICAgICAgICAgICAgICAgICAgIGlmICdmbGFnJyBpbiBsb2dpbmZvIGFuZCBub3QgbG9naW5mb1snZmxhZyddLnN0YXJ0c3dpdGgoIl8iKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGxvZ2luZm9bJ3ZhcmlhYmxlJ10gPSB2YXIKKyAgICAgICAgICAgICAgICAgICAgbG9naW5mb1snb3AnXSA9ICdvdmVycmlkZVslc106JXMnICUgKG92ZXJyaWRlLCBsb2dpbmZvWydvcCddKQorICAgICAgICAgICAgICAgICAgICBoaXN0b3J5LmFwcGVuZChsb2dpbmZvKQorCisgICAgICAgIGNvbW1lbnRWYWwgPSByZS5zdWIoJ1xuJywgJ1xuIycsIHN0cihvdmFsKSkKKyAgICAgICAgaWYgaGlzdG9yeToKKyAgICAgICAgICAgIGlmIGxlbihoaXN0b3J5KSA9PSAxOgorICAgICAgICAgICAgICAgIG8ud3JpdGUoIiNcbiMgJCVzXG4iICUgdmFyKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBvLndyaXRlKCIjXG4jICQlcyBbJWQgb3BlcmF0aW9uc11cbiIgJSAodmFyLCBsZW4oaGlzdG9yeSkpKQorICAgICAgICAgICAgZm9yIGV2ZW50IGluIGhpc3Rvcnk6CisgICAgICAgICAgICAgICAgIyBvLndyaXRlKCIjICVzXG4iICUgc3RyKGV2ZW50KSkKKyAgICAgICAgICAgICAgICBpZiAnZnVuYycgaW4gZXZlbnQ6CisgICAgICAgICAgICAgICAgICAgICMgSWYgd2UgaGF2ZSBhIGZ1bmN0aW9uIGxpc3RlZCwgdGhpcyBpcyBpbnRlcm5hbAorICAgICAgICAgICAgICAgICAgICAjIGNvZGUsIG5vdCBhbiBvcGVyYXRpb24gaW4gYSBjb25maWcgZmlsZSwgYW5kIHRoZQorICAgICAgICAgICAgICAgICAgICAjIGZ1bGwgcGF0aCBpcyBkaXN0cmFjdGluZy4KKyAgICAgICAgICAgICAgICAgICAgZXZlbnRbJ2ZpbGUnXSA9IHJlLnN1YignLiovJywgJycsIGV2ZW50WydmaWxlJ10pCisgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfZnVuYyA9ICcgWyVzXScgJSBldmVudFsnZnVuYyddCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9mdW5jID0gJycKKyAgICAgICAgICAgICAgICBpZiAnZmxhZycgaW4gZXZlbnQ6CisgICAgICAgICAgICAgICAgICAgIGZsYWcgPSAnWyVzXSAnICUgKGV2ZW50WydmbGFnJ10pCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZmxhZyA9ICcnCisgICAgICAgICAgICAgICAgby53cml0ZSgiIyAgICVzICVzOiVzJXNcbiMgICAgICVzXCIlc1wiXG4iICUgKGV2ZW50WydvcCddLCBldmVudFsnZmlsZSddLCBldmVudFsnbGluZSddLCBkaXNwbGF5X2Z1bmMsIGZsYWcsIHJlLnN1YignXG4nLCAnXG4jICAgICAnLCBldmVudFsnZGV0YWlsJ10pKSkKKyAgICAgICAgICAgIGlmIGxlbihoaXN0b3J5KSA+IDE6CisgICAgICAgICAgICAgICAgby53cml0ZSgiIyBwcmUtZXhwYW5zaW9uIHZhbHVlOlxuIikKKyAgICAgICAgICAgICAgICBvLndyaXRlKCcjICAgIiVzIlxuJyAlIChjb21tZW50VmFsKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG8ud3JpdGUoIiNcbiMgJCVzXG4jICAgW25vIGhpc3RvcnkgcmVjb3JkZWRdXG4jXG4iICUgdmFyKQorICAgICAgICAgICAgby53cml0ZSgnIyAgICIlcyJcbicgJSAoY29tbWVudFZhbCkpCisKKyAgICBkZWYgZ2V0X3ZhcmlhYmxlX2ZpbGVzKHNlbGYsIHZhcik6CisgICAgICAgICIiIkdldCB0aGUgZmlsZXMgd2hlcmUgb3BlcmF0aW9ucyBhcmUgbWFkZSBvbiBhIHZhcmlhYmxlIiIiCisgICAgICAgIHZhcl9oaXN0b3J5ID0gc2VsZi52YXJpYWJsZSh2YXIpCisgICAgICAgIGZpbGVzID0gW10KKyAgICAgICAgZm9yIGV2ZW50IGluIHZhcl9oaXN0b3J5OgorICAgICAgICAgICAgZmlsZXMuYXBwZW5kKGV2ZW50WydmaWxlJ10pCisgICAgICAgIHJldHVybiBmaWxlcworCisgICAgZGVmIGdldF92YXJpYWJsZV9saW5lcyhzZWxmLCB2YXIsIGYpOgorICAgICAgICAiIiJHZXQgdGhlIGxpbmUgd2hlcmUgYSBvcGVyYXRpb24gaXMgbWFkZSBvbiBhIHZhcmlhYmxlIGluIGZpbGUgZiIiIgorICAgICAgICB2YXJfaGlzdG9yeSA9IHNlbGYudmFyaWFibGUodmFyKQorICAgICAgICBsaW5lcyA9IFtdCisgICAgICAgIGZvciBldmVudCBpbiB2YXJfaGlzdG9yeToKKyAgICAgICAgICAgIGlmIGY9PSBldmVudFsnZmlsZSddOgorICAgICAgICAgICAgICAgIGxpbmUgPSBldmVudFsnbGluZSddCisgICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKGxpbmUpCisgICAgICAgIHJldHVybiBsaW5lcworCisgICAgZGVmIGdldF92YXJpYWJsZV9pdGVtc19maWxlcyhzZWxmLCB2YXIsIGQpOgorICAgICAgICAiIiIKKyAgICAgICAgVXNlIHZhcmlhYmxlIGhpc3RvcnkgdG8gbWFwIGl0ZW1zIGFkZGVkIHRvIGEgbGlzdCB2YXJpYWJsZSBhbmQKKyAgICAgICAgdGhlIGZpbGVzIGluIHdoaWNoIHRoZXkgd2VyZSBhZGRlZC4KKyAgICAgICAgIiIiCisgICAgICAgIGhpc3RvcnkgPSBzZWxmLnZhcmlhYmxlKHZhcikKKyAgICAgICAgZmluYWxpdGVtcyA9IChkLmdldFZhcih2YXIsIFRydWUpIG9yICcnKS5zcGxpdCgpCisgICAgICAgIGZpbGVtYXAgPSB7fQorICAgICAgICBpc3NldCA9IEZhbHNlCisgICAgICAgIGZvciBldmVudCBpbiBoaXN0b3J5OgorICAgICAgICAgICAgaWYgJ2ZsYWcnIGluIGV2ZW50OgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBldmVudFsnb3AnXSA9PSAnX3JlbW92ZSc6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGlzc2V0IGFuZCBldmVudFsnb3AnXSA9PSAnc2V0Pyc6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlzc2V0ID0gVHJ1ZQorICAgICAgICAgICAgaXRlbXMgPSBkLmV4cGFuZChldmVudFsnZGV0YWlsJ10pLnNwbGl0KCkKKyAgICAgICAgICAgIGZvciBpdGVtIGluIGl0ZW1zOgorICAgICAgICAgICAgICAgICMgVGhpcyBpcyBhIGxpdHRsZSBjcnVkZSBidXQgaXMgYmVsdC1hbmQtYnJhY2VzIHRvIGF2b2lkIHVzCisgICAgICAgICAgICAgICAgIyBoYXZpbmcgdG8gaGFuZGxlIGV2ZXJ5IHBvc3NpYmxlIG9wZXJhdGlvbiB0eXBlIHNwZWNpZmljYWxseQorICAgICAgICAgICAgICAgIGlmIGl0ZW0gaW4gZmluYWxpdGVtcyBhbmQgbm90IGl0ZW0gaW4gZmlsZW1hcDoKKyAgICAgICAgICAgICAgICAgICAgZmlsZW1hcFtpdGVtXSA9IGV2ZW50WydmaWxlJ10KKyAgICAgICAgcmV0dXJuIGZpbGVtYXAKKworICAgIGRlZiBkZWxfdmFyX2hpc3Rvcnkoc2VsZiwgdmFyLCBmPU5vbmUsIGxpbmU9Tm9uZSk6CisgICAgICAgICIiIklmIGZpbGUgZiBhbmQgbGluZSBhcmUgbm90IGdpdmVuLCB0aGUgZW50aXJlIGhpc3Rvcnkgb2YgdmFyIGlzIGRlbGV0ZWQiIiIKKyAgICAgICAgaWYgdmFyIGluIHNlbGYudmFyaWFibGVzOgorICAgICAgICAgICAgaWYgZiBhbmQgbGluZToKKyAgICAgICAgICAgICAgICBzZWxmLnZhcmlhYmxlc1t2YXJdID0gWyB4IGZvciB4IGluIHNlbGYudmFyaWFibGVzW3Zhcl0gaWYgeFsnZmlsZSddIT1mIGFuZCB4WydsaW5lJ10hPWxpbmVdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYudmFyaWFibGVzW3Zhcl0gPSBbXQorCitjbGFzcyBEYXRhU21hcnQoTXV0YWJsZU1hcHBpbmcpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5kaWN0ID0ge30KKworICAgICAgICBzZWxmLmluY2hpc3RvcnkgPSBJbmNsdWRlSGlzdG9yeSgpCisgICAgICAgIHNlbGYudmFyaGlzdG9yeSA9IFZhcmlhYmxlSGlzdG9yeShzZWxmKQorICAgICAgICBzZWxmLl90cmFja2luZyA9IEZhbHNlCisKKyAgICAgICAgc2VsZi5leHBhbmRfY2FjaGUgPSB7fQorCisgICAgICAgICMgY29va2llIG1vbnN0ZXIgdHJpYnV0ZQorICAgICAgICAjIE5lZWQgdG8gYmUgY2FyZWZ1bCBhYm91dCB3cml0ZXMgdG8gb3ZlcnJpZGVkYXRhIGFzCisgICAgICAgICMgaXRzIG9ubHkgYSBzaGFsbG93IGNvcHksIGNvdWxkIGluZmx1ZW5jZSBvdGhlciBkYXRhIHN0b3JlCisgICAgICAgICMgY29waWVzIQorICAgICAgICBzZWxmLm92ZXJyaWRlZGF0YSA9IHt9CisgICAgICAgIHNlbGYub3ZlcnJpZGVzID0gTm9uZQorICAgICAgICBzZWxmLm92ZXJyaWRldmFycyA9IHNldChbIk9WRVJSSURFUyIsICJGSUxFIl0pCisgICAgICAgIHNlbGYuaW5vdmVycmlkZSA9IEZhbHNlCisKKyAgICBkZWYgZW5hYmxlVHJhY2tpbmcoc2VsZik6CisgICAgICAgIHNlbGYuX3RyYWNraW5nID0gVHJ1ZQorCisgICAgZGVmIGRpc2FibGVUcmFja2luZyhzZWxmKToKKyAgICAgICAgc2VsZi5fdHJhY2tpbmcgPSBGYWxzZQorCisgICAgZGVmIGV4cGFuZFdpdGhSZWZzKHNlbGYsIHMsIHZhcm5hbWUpOgorCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHMsIGJhc2VzdHJpbmcpOiAjIHNhbml0eSBjaGVjaworICAgICAgICAgICAgcmV0dXJuIFZhcmlhYmxlUGFyc2UodmFybmFtZSwgc2VsZiwgcykKKworICAgICAgICBpZiB2YXJuYW1lIGFuZCB2YXJuYW1lIGluIHNlbGYuZXhwYW5kX2NhY2hlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZXhwYW5kX2NhY2hlW3Zhcm5hbWVdCisKKyAgICAgICAgdmFycGFyc2UgPSBWYXJpYWJsZVBhcnNlKHZhcm5hbWUsIHNlbGYpCisKKyAgICAgICAgd2hpbGUgcy5maW5kKCckeycpICE9IC0xOgorICAgICAgICAgICAgb2xkcyA9IHMKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzID0gX19leHBhbmRfdmFyX3JlZ2V4cF9fLnN1Yih2YXJwYXJzZS52YXJfc3ViLCBzKQorICAgICAgICAgICAgICAgIHMgPSBfX2V4cGFuZF9weXRob25fcmVnZXhwX18uc3ViKHZhcnBhcnNlLnB5dGhvbl9zdWIsIHMpCisgICAgICAgICAgICAgICAgaWYgcyA9PSBvbGRzOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZXhjZXB0IEV4cGFuc2lvbkVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICBleGNlcHQgYmIucGFyc2UuU2tpcFJlY2lwZToKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6CisgICAgICAgICAgICAgICAgZXhjX2NsYXNzLCBleGMsIHRiID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgICAgICAgICByYWlzZSBFeHBhbnNpb25FcnJvciwgRXhwYW5zaW9uRXJyb3IodmFybmFtZSwgcywgZXhjKSwgdGIKKworICAgICAgICB2YXJwYXJzZS52YWx1ZSA9IHMKKworICAgICAgICBpZiB2YXJuYW1lOgorICAgICAgICAgICAgc2VsZi5leHBhbmRfY2FjaGVbdmFybmFtZV0gPSB2YXJwYXJzZQorCisgICAgICAgIHJldHVybiB2YXJwYXJzZQorCisgICAgZGVmIGV4cGFuZChzZWxmLCBzLCB2YXJuYW1lID0gTm9uZSk6CisgICAgICAgIHJldHVybiBzZWxmLmV4cGFuZFdpdGhSZWZzKHMsIHZhcm5hbWUpLnZhbHVlCisKKyAgICBkZWYgZmluYWxpemUoc2VsZiwgcGFyZW50ID0gRmFsc2UpOgorICAgICAgICByZXR1cm4KKworICAgIGRlZiBpbnRlcm5hbF9maW5hbGl6ZShzZWxmLCBwYXJlbnQgPSBGYWxzZSk6CisgICAgICAgICIiIlBlcmZvcm1zIGZpbmFsIHN0ZXBzIHVwb24gdGhlIGRhdGFzdG9yZSwgaW5jbHVkaW5nIGFwcGxpY2F0aW9uIG9mIG92ZXJyaWRlcyIiIgorICAgICAgICBzZWxmLm92ZXJyaWRlcyA9IE5vbmUKKworICAgIGRlZiBuZWVkX292ZXJyaWRlcyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5vdmVycmlkZXMgaXMgTm9uZToKKyAgICAgICAgICAgIGlmIHNlbGYuaW5vdmVycmlkZToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHNlbGYuaW5vdmVycmlkZSA9IFRydWUKKyAgICAgICAgICAgICMgQ2FuIGVuZCB1cCBoZXJlIHJlY3Vyc2l2ZWx5IHNvIHNldHVwIGR1bW15IHZhbHVlcworICAgICAgICAgICAgc2VsZi5vdmVycmlkZXMgPSBbXQorICAgICAgICAgICAgc2VsZi5vdmVycmlkZXNzZXQgPSBzZXQoKQorICAgICAgICAgICAgc2VsZi5vdmVycmlkZXMgPSAoc2VsZi5nZXRWYXIoIk9WRVJSSURFUyIsIFRydWUpIG9yICIiKS5zcGxpdCgiOiIpIG9yIFtdCisgICAgICAgICAgICBzZWxmLm92ZXJyaWRlc3NldCA9IHNldChzZWxmLm92ZXJyaWRlcykKKyAgICAgICAgICAgIHNlbGYuaW5vdmVycmlkZSA9IEZhbHNlCisgICAgICAgICAgICBzZWxmLmV4cGFuZF9jYWNoZSA9IHt9CisKKyAgICBkZWYgaW5pdFZhcihzZWxmLCB2YXIpOgorICAgICAgICBzZWxmLmV4cGFuZF9jYWNoZSA9IHt9CisgICAgICAgIGlmIG5vdCB2YXIgaW4gc2VsZi5kaWN0OgorICAgICAgICAgICAgc2VsZi5kaWN0W3Zhcl0gPSB7fQorCisgICAgZGVmIF9maW5kVmFyKHNlbGYsIHZhcik6CisgICAgICAgIGRlc3QgPSBzZWxmLmRpY3QKKyAgICAgICAgd2hpbGUgZGVzdDoKKyAgICAgICAgICAgIGlmIHZhciBpbiBkZXN0OgorICAgICAgICAgICAgICAgIHJldHVybiBkZXN0W3Zhcl0KKworICAgICAgICAgICAgaWYgIl9kYXRhIiBub3QgaW4gZGVzdDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZGVzdCA9IGRlc3RbIl9kYXRhIl0KKworICAgIGRlZiBfbWFrZVNoYWRvd0NvcHkoc2VsZiwgdmFyKToKKyAgICAgICAgaWYgdmFyIGluIHNlbGYuZGljdDoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGxvY2FsX3ZhciA9IHNlbGYuX2ZpbmRWYXIodmFyKQorCisgICAgICAgIGlmIGxvY2FsX3ZhcjoKKyAgICAgICAgICAgIHNlbGYuZGljdFt2YXJdID0gY29weS5jb3B5KGxvY2FsX3ZhcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuaW5pdFZhcih2YXIpCisKKworICAgIGRlZiBzZXRWYXIoc2VsZiwgdmFyLCB2YWx1ZSwgKipsb2dpbmZvKToKKyAgICAgICAgI3ByaW50KCJ2YXI9IiArIHN0cih2YXIpICsgIiAgdmFsPSIgKyBzdHIodmFsdWUpKQorICAgICAgICBwYXJzaW5nPUZhbHNlCisgICAgICAgIGlmICdwYXJzaW5nJyBpbiBsb2dpbmZvOgorICAgICAgICAgICAgcGFyc2luZz1UcnVlCisKKyAgICAgICAgaWYgJ29wJyBub3QgaW4gbG9naW5mbzoKKyAgICAgICAgICAgIGxvZ2luZm9bJ29wJ10gPSAic2V0IgorICAgICAgICBzZWxmLmV4cGFuZF9jYWNoZSA9IHt9CisgICAgICAgIG1hdGNoICA9IF9fc2V0dmFyX3JlZ2V4cF9fLm1hdGNoKHZhcikKKyAgICAgICAgaWYgbWF0Y2ggYW5kIG1hdGNoLmdyb3VwKCJrZXl3b3JkIikgaW4gX19zZXR2YXJfa2V5d29yZF9fOgorICAgICAgICAgICAgYmFzZSA9IG1hdGNoLmdyb3VwKCdiYXNlJykKKyAgICAgICAgICAgIGtleXdvcmQgPSBtYXRjaC5ncm91cCgia2V5d29yZCIpCisgICAgICAgICAgICBvdmVycmlkZSA9IG1hdGNoLmdyb3VwKCdhZGQnKQorICAgICAgICAgICAgbCA9IHNlbGYuZ2V0VmFyRmxhZyhiYXNlLCBrZXl3b3JkKSBvciBbXQorICAgICAgICAgICAgbC5hcHBlbmQoW3ZhbHVlLCBvdmVycmlkZV0pCisgICAgICAgICAgICBzZWxmLnNldFZhckZsYWcoYmFzZSwga2V5d29yZCwgbCwgaWdub3JlPVRydWUpCisgICAgICAgICAgICAjIEFuZCBjYXVzZSB0aGF0IHRvIGJlIHJlY29yZGVkOgorICAgICAgICAgICAgbG9naW5mb1snZGV0YWlsJ10gPSB2YWx1ZQorICAgICAgICAgICAgbG9naW5mb1sndmFyaWFibGUnXSA9IGJhc2UKKyAgICAgICAgICAgIGlmIG92ZXJyaWRlOgorICAgICAgICAgICAgICAgIGxvZ2luZm9bJ29wJ10gPSAnJXNbJXNdJyAlIChrZXl3b3JkLCBvdmVycmlkZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbG9naW5mb1snb3AnXSA9IGtleXdvcmQKKyAgICAgICAgICAgIHNlbGYudmFyaGlzdG9yeS5yZWNvcmQoKipsb2dpbmZvKQorICAgICAgICAgICAgIyB0b2RvIG1ha2Ugc3VyZSBrZXl3b3JkIGlzIG5vdCBfX2RvY19fIG9yIF9fbW9kdWxlX18KKyAgICAgICAgICAgICMgcGF5IHRoZSBjb29raWUgbW9uc3RlcgorCisgICAgICAgICAgICAjIG1vcmUgY29va2llcyBmb3IgdGhlIGNvb2tpZSBtb25zdGVyCisgICAgICAgICAgICBpZiAnXycgaW4gdmFyOgorICAgICAgICAgICAgICAgIHNlbGYuX3NldHZhcl91cGRhdGVfb3ZlcnJpZGVzKGJhc2UsICoqbG9naW5mbykKKworCisgICAgICAgICAgICBpZiBiYXNlIGluIHNlbGYub3ZlcnJpZGV2YXJzOgorICAgICAgICAgICAgICAgIHNlbGYub3ZlcnJpZGV2YXJzLnVwZGF0ZShzZWxmLmV4cGFuZFdpdGhSZWZzKHZhbHVlLCB2YXIpLnJlZmVyZW5jZXMpCisgICAgICAgICAgICAgICAgc2VsZi5pbnRlcm5hbF9maW5hbGl6ZShUcnVlKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgbm90IHZhciBpbiBzZWxmLmRpY3Q6CisgICAgICAgICAgICBzZWxmLl9tYWtlU2hhZG93Q29weSh2YXIpCisKKyAgICAgICAgaWYgbm90IHBhcnNpbmc6CisgICAgICAgICAgICBpZiAiX2FwcGVuZCIgaW4gc2VsZi5kaWN0W3Zhcl06CisgICAgICAgICAgICAgICAgZGVsIHNlbGYuZGljdFt2YXJdWyJfYXBwZW5kIl0KKyAgICAgICAgICAgIGlmICJfcHJlcGVuZCIgaW4gc2VsZi5kaWN0W3Zhcl06CisgICAgICAgICAgICAgICAgZGVsIHNlbGYuZGljdFt2YXJdWyJfcHJlcGVuZCJdCisgICAgICAgICAgICBpZiB2YXIgaW4gc2VsZi5vdmVycmlkZWRhdGE6CisgICAgICAgICAgICAgICAgYWN0aXZlID0gW10KKyAgICAgICAgICAgICAgICBzZWxmLm5lZWRfb3ZlcnJpZGVzKCkKKyAgICAgICAgICAgICAgICBmb3IgKHIsIG8pIGluIHNlbGYub3ZlcnJpZGVkYXRhW3Zhcl06CisgICAgICAgICAgICAgICAgICAgIGlmIG8gaW4gc2VsZi5vdmVycmlkZXNzZXQ6CisgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmUuYXBwZW5kKHIpCisgICAgICAgICAgICAgICAgICAgIGVsaWYgIl8iIGluIG86CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZXQoby5zcGxpdCgiXyIpKS5pc3N1YnNldChzZWxmLm92ZXJyaWRlc3NldCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlLmFwcGVuZChyKQorICAgICAgICAgICAgICAgIGZvciBhIGluIGFjdGl2ZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5kZWxWYXIoYSkKKyAgICAgICAgICAgICAgICBkZWwgc2VsZi5vdmVycmlkZWRhdGFbdmFyXQorCisgICAgICAgICMgbW9yZSBjb29raWVzIGZvciB0aGUgY29va2llIG1vbnN0ZXIKKyAgICAgICAgaWYgJ18nIGluIHZhcjoKKyAgICAgICAgICAgIHNlbGYuX3NldHZhcl91cGRhdGVfb3ZlcnJpZGVzKHZhciwgKipsb2dpbmZvKQorCisgICAgICAgICMgc2V0dGluZyB2YXIKKyAgICAgICAgc2VsZi5kaWN0W3Zhcl1bIl9jb250ZW50Il0gPSB2YWx1ZQorICAgICAgICBzZWxmLnZhcmhpc3RvcnkucmVjb3JkKCoqbG9naW5mbykKKworICAgICAgICBpZiB2YXIgaW4gc2VsZi5vdmVycmlkZXZhcnM6CisgICAgICAgICAgICBzZWxmLm92ZXJyaWRldmFycy51cGRhdGUoc2VsZi5leHBhbmRXaXRoUmVmcyh2YWx1ZSwgdmFyKS5yZWZlcmVuY2VzKQorICAgICAgICAgICAgc2VsZi5pbnRlcm5hbF9maW5hbGl6ZShUcnVlKQorCisgICAgZGVmIF9zZXR2YXJfdXBkYXRlX292ZXJyaWRlcyhzZWxmLCB2YXIsICoqbG9naW5mbyk6CisgICAgICAgICMgYWthIHBheSB0aGUgY29va2llIG1vbnN0ZXIKKyAgICAgICAgb3ZlcnJpZGUgPSB2YXJbdmFyLnJmaW5kKCdfJykrMTpdCisgICAgICAgIHNob3J0dmFyID0gdmFyWzp2YXIucmZpbmQoJ18nKV0KKyAgICAgICAgd2hpbGUgb3ZlcnJpZGU6CisgICAgICAgICAgICBpZiBzaG9ydHZhciBub3QgaW4gc2VsZi5vdmVycmlkZWRhdGE6CisgICAgICAgICAgICAgICAgc2VsZi5vdmVycmlkZWRhdGFbc2hvcnR2YXJdID0gW10KKyAgICAgICAgICAgIGlmIFt2YXIsIG92ZXJyaWRlXSBub3QgaW4gc2VsZi5vdmVycmlkZWRhdGFbc2hvcnR2YXJdOgorICAgICAgICAgICAgICAgICMgRm9yY2UgQ29XIGJ5IHJlY3JlYXRpbmcgdGhlIGxpc3QgZmlyc3QKKyAgICAgICAgICAgICAgICBzZWxmLm92ZXJyaWRlZGF0YVtzaG9ydHZhcl0gPSBsaXN0KHNlbGYub3ZlcnJpZGVkYXRhW3Nob3J0dmFyXSkKKyAgICAgICAgICAgICAgICBzZWxmLm92ZXJyaWRlZGF0YVtzaG9ydHZhcl0uYXBwZW5kKFt2YXIsIG92ZXJyaWRlXSkKKyAgICAgICAgICAgIG92ZXJyaWRlID0gTm9uZQorICAgICAgICAgICAgaWYgIl8iIGluIHNob3J0dmFyOgorICAgICAgICAgICAgICAgIG92ZXJyaWRlID0gdmFyW3Nob3J0dmFyLnJmaW5kKCdfJykrMTpdCisgICAgICAgICAgICAgICAgc2hvcnR2YXIgPSB2YXJbOnNob3J0dmFyLnJmaW5kKCdfJyldCisgICAgICAgICAgICAgICAgaWYgbGVuKHNob3J0dmFyKSA9PSAwOgorICAgICAgICAgICAgICAgICAgICBvdmVycmlkZSA9IE5vbmUKKworICAgIGRlZiBnZXRWYXIoc2VsZiwgdmFyLCBleHBhbmQ9RmFsc2UsIG5vd2Vha2RlZmF1bHQ9RmFsc2UsIHBhcnNpbmc9RmFsc2UpOgorICAgICAgICByZXR1cm4gc2VsZi5nZXRWYXJGbGFnKHZhciwgIl9jb250ZW50IiwgZXhwYW5kLCBub3dlYWtkZWZhdWx0LCBwYXJzaW5nKQorCisgICAgZGVmIHJlbmFtZVZhcihzZWxmLCBrZXksIG5ld2tleSwgKipsb2dpbmZvKToKKyAgICAgICAgIiIiCisgICAgICAgIFJlbmFtZSB0aGUgdmFyaWFibGUga2V5IHRvIG5ld2tleQorICAgICAgICAiIiIKKyAgICAgICAgdmFsID0gc2VsZi5nZXRWYXIoa2V5LCAwLCBwYXJzaW5nPVRydWUpCisgICAgICAgIGlmIHZhbCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGxvZ2luZm9bJ3ZhcmlhYmxlJ10gPSBuZXdrZXkKKyAgICAgICAgICAgIGxvZ2luZm9bJ29wJ10gPSAncmVuYW1lIGZyb20gJXMnICUga2V5CisgICAgICAgICAgICBsb2dpbmZvWydkZXRhaWwnXSA9IHZhbAorICAgICAgICAgICAgc2VsZi52YXJoaXN0b3J5LnJlY29yZCgqKmxvZ2luZm8pCisgICAgICAgICAgICBzZWxmLnNldFZhcihuZXdrZXksIHZhbCwgaWdub3JlPVRydWUsIHBhcnNpbmc9VHJ1ZSkKKworICAgICAgICBmb3IgaSBpbiAoX19zZXR2YXJfa2V5d29yZF9fKToKKyAgICAgICAgICAgIHNyYyA9IHNlbGYuZ2V0VmFyRmxhZyhrZXksIGkpCisgICAgICAgICAgICBpZiBzcmMgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBkZXN0ID0gc2VsZi5nZXRWYXJGbGFnKG5ld2tleSwgaSkgb3IgW10KKyAgICAgICAgICAgIGRlc3QuZXh0ZW5kKHNyYykKKyAgICAgICAgICAgIHNlbGYuc2V0VmFyRmxhZyhuZXdrZXksIGksIGRlc3QsIGlnbm9yZT1UcnVlKQorCisgICAgICAgIGlmIGtleSBpbiBzZWxmLm92ZXJyaWRlZGF0YToKKyAgICAgICAgICAgIHNlbGYub3ZlcnJpZGVkYXRhW25ld2tleV0gPSBbXQorICAgICAgICAgICAgZm9yICh2LCBvKSBpbiBzZWxmLm92ZXJyaWRlZGF0YVtrZXldOgorICAgICAgICAgICAgICAgIHNlbGYub3ZlcnJpZGVkYXRhW25ld2tleV0uYXBwZW5kKFt2LnJlcGxhY2Uoa2V5LCBuZXdrZXkpLCBvXSkKKyAgICAgICAgICAgICAgICBzZWxmLnJlbmFtZVZhcih2LCB2LnJlcGxhY2Uoa2V5LCBuZXdrZXkpKQorCisgICAgICAgIGlmICdfJyBpbiBuZXdrZXkgYW5kIHZhbCBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5fc2V0dmFyX3VwZGF0ZV9vdmVycmlkZXMobmV3a2V5LCAqKmxvZ2luZm8pCisKKyAgICAgICAgbG9naW5mb1sndmFyaWFibGUnXSA9IGtleQorICAgICAgICBsb2dpbmZvWydvcCddID0gJ3JlbmFtZSAodG8pJworICAgICAgICBsb2dpbmZvWydkZXRhaWwnXSA9IG5ld2tleQorICAgICAgICBzZWxmLnZhcmhpc3RvcnkucmVjb3JkKCoqbG9naW5mbykKKyAgICAgICAgc2VsZi5kZWxWYXIoa2V5LCBpZ25vcmU9VHJ1ZSkKKworICAgIGRlZiBhcHBlbmRWYXIoc2VsZiwgdmFyLCB2YWx1ZSwgKipsb2dpbmZvKToKKyAgICAgICAgbG9naW5mb1snb3AnXSA9ICdhcHBlbmQnCisgICAgICAgIHNlbGYudmFyaGlzdG9yeS5yZWNvcmQoKipsb2dpbmZvKQorICAgICAgICBzZWxmLnNldFZhcih2YXIgKyAiX2FwcGVuZCIsIHZhbHVlLCBpZ25vcmU9VHJ1ZSwgcGFyc2luZz1UcnVlKQorCisgICAgZGVmIHByZXBlbmRWYXIoc2VsZiwgdmFyLCB2YWx1ZSwgKipsb2dpbmZvKToKKyAgICAgICAgbG9naW5mb1snb3AnXSA9ICdwcmVwZW5kJworICAgICAgICBzZWxmLnZhcmhpc3RvcnkucmVjb3JkKCoqbG9naW5mbykKKyAgICAgICAgc2VsZi5zZXRWYXIodmFyICsgIl9wcmVwZW5kIiwgdmFsdWUsIGlnbm9yZT1UcnVlLCBwYXJzaW5nPVRydWUpCisKKyAgICBkZWYgZGVsVmFyKHNlbGYsIHZhciwgKipsb2dpbmZvKToKKyAgICAgICAgbG9naW5mb1snZGV0YWlsJ10gPSAiIgorICAgICAgICBsb2dpbmZvWydvcCddID0gJ2RlbCcKKyAgICAgICAgc2VsZi52YXJoaXN0b3J5LnJlY29yZCgqKmxvZ2luZm8pCisgICAgICAgIHNlbGYuZXhwYW5kX2NhY2hlID0ge30KKyAgICAgICAgc2VsZi5kaWN0W3Zhcl0gPSB7fQorICAgICAgICBpZiB2YXIgaW4gc2VsZi5vdmVycmlkZWRhdGE6CisgICAgICAgICAgICBkZWwgc2VsZi5vdmVycmlkZWRhdGFbdmFyXQorICAgICAgICBpZiAnXycgaW4gdmFyOgorICAgICAgICAgICAgb3ZlcnJpZGUgPSB2YXJbdmFyLnJmaW5kKCdfJykrMTpdCisgICAgICAgICAgICBzaG9ydHZhciA9IHZhcls6dmFyLnJmaW5kKCdfJyldCisgICAgICAgICAgICB3aGlsZSBvdmVycmlkZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGlmIHNob3J0dmFyIGluIHNlbGYub3ZlcnJpZGVkYXRhOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBGb3JjZSBDb1cgYnkgcmVjcmVhdGluZyB0aGUgbGlzdCBmaXJzdAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vdmVycmlkZWRhdGFbc2hvcnR2YXJdID0gbGlzdChzZWxmLm92ZXJyaWRlZGF0YVtzaG9ydHZhcl0pCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm92ZXJyaWRlZGF0YVtzaG9ydHZhcl0ucmVtb3ZlKFt2YXIsIG92ZXJyaWRlXSkKKyAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBlOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgb3ZlcnJpZGUgPSBOb25lCisgICAgICAgICAgICAgICAgaWYgIl8iIGluIHNob3J0dmFyOgorICAgICAgICAgICAgICAgICAgICBvdmVycmlkZSA9IHZhcltzaG9ydHZhci5yZmluZCgnXycpKzE6XQorICAgICAgICAgICAgICAgICAgICBzaG9ydHZhciA9IHZhcls6c2hvcnR2YXIucmZpbmQoJ18nKV0KKyAgICAgICAgICAgICAgICAgICAgaWYgbGVuKHNob3J0dmFyKSA9PSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlID0gTm9uZQorCisgICAgZGVmIHNldFZhckZsYWcoc2VsZiwgdmFyLCBmbGFnLCB2YWx1ZSwgKipsb2dpbmZvKToKKyAgICAgICAgc2VsZi5leHBhbmRfY2FjaGUgPSB7fQorICAgICAgICBpZiAnb3AnIG5vdCBpbiBsb2dpbmZvOgorICAgICAgICAgICAgbG9naW5mb1snb3AnXSA9ICJzZXQiCisgICAgICAgIGxvZ2luZm9bJ2ZsYWcnXSA9IGZsYWcKKyAgICAgICAgc2VsZi52YXJoaXN0b3J5LnJlY29yZCgqKmxvZ2luZm8pCisgICAgICAgIGlmIG5vdCB2YXIgaW4gc2VsZi5kaWN0OgorICAgICAgICAgICAgc2VsZi5fbWFrZVNoYWRvd0NvcHkodmFyKQorICAgICAgICBzZWxmLmRpY3RbdmFyXVtmbGFnXSA9IHZhbHVlCisKKyAgICAgICAgaWYgZmxhZyA9PSAiX2RlZmF1bHR2YWwiIGFuZCAnXycgaW4gdmFyOgorICAgICAgICAgICAgc2VsZi5fc2V0dmFyX3VwZGF0ZV9vdmVycmlkZXModmFyLCAqKmxvZ2luZm8pCisKKyAgICAgICAgaWYgZmxhZyA9PSAidW5leHBvcnQiIG9yIGZsYWcgPT0gImV4cG9ydCI6CisgICAgICAgICAgICBpZiBub3QgIl9fZXhwb3J0bGlzdCIgaW4gc2VsZi5kaWN0OgorICAgICAgICAgICAgICAgIHNlbGYuX21ha2VTaGFkb3dDb3B5KCJfX2V4cG9ydGxpc3QiKQorICAgICAgICAgICAgaWYgbm90ICJfY29udGVudCIgaW4gc2VsZi5kaWN0WyJfX2V4cG9ydGxpc3QiXToKKyAgICAgICAgICAgICAgICBzZWxmLmRpY3RbIl9fZXhwb3J0bGlzdCJdWyJfY29udGVudCJdID0gc2V0KCkKKyAgICAgICAgICAgIHNlbGYuZGljdFsiX19leHBvcnRsaXN0Il1bIl9jb250ZW50Il0uYWRkKHZhcikKKworICAgIGRlZiBnZXRWYXJGbGFnKHNlbGYsIHZhciwgZmxhZywgZXhwYW5kPUZhbHNlLCBub3dlYWtkZWZhdWx0PUZhbHNlLCBwYXJzaW5nPUZhbHNlKToKKyAgICAgICAgbG9jYWxfdmFyID0gc2VsZi5fZmluZFZhcih2YXIpCisgICAgICAgIHZhbHVlID0gTm9uZQorICAgICAgICBpZiBmbGFnID09ICJfY29udGVudCIgYW5kIHZhciBpbiBzZWxmLm92ZXJyaWRlZGF0YSBhbmQgbm90IHBhcnNpbmc6CisgICAgICAgICAgICBtYXRjaCA9IEZhbHNlCisgICAgICAgICAgICBhY3RpdmUgPSB7fQorICAgICAgICAgICAgc2VsZi5uZWVkX292ZXJyaWRlcygpCisgICAgICAgICAgICBmb3IgKHIsIG8pIGluIHNlbGYub3ZlcnJpZGVkYXRhW3Zhcl06CisgICAgICAgICAgICAgICAgIyBXaGF0IGFib3V0IGRvdWJsZSBvdmVycmlkZXMgYm90aCB3aXRoICJfIiBpbiB0aGUgbmFtZT8KKyAgICAgICAgICAgICAgICBpZiBvIGluIHNlbGYub3ZlcnJpZGVzc2V0OgorICAgICAgICAgICAgICAgICAgICBhY3RpdmVbb10gPSByCisgICAgICAgICAgICAgICAgZWxpZiAiXyIgaW4gbzoKKyAgICAgICAgICAgICAgICAgICAgaWYgc2V0KG8uc3BsaXQoIl8iKSkuaXNzdWJzZXQoc2VsZi5vdmVycmlkZXNzZXQpOgorICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlW29dID0gcgorCisgICAgICAgICAgICBtb2QgPSBUcnVlCisgICAgICAgICAgICB3aGlsZSBtb2Q6CisgICAgICAgICAgICAgICAgbW9kID0gRmFsc2UKKyAgICAgICAgICAgICAgICBmb3IgbyBpbiBzZWxmLm92ZXJyaWRlczoKKyAgICAgICAgICAgICAgICAgICAgZm9yIGEgaW4gYWN0aXZlLmNvcHkoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGEuZW5kc3dpdGgoIl8iICsgbyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IGFjdGl2ZVthXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBhY3RpdmVbYV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVbYS5yZXBsYWNlKCJfIiArIG8sICIiKV0gPSB0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBhID09IG86CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBhY3RpdmVbYV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWwgYWN0aXZlW2FdCisgICAgICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZ2V0VmFyKG1hdGNoKQorCisgICAgICAgIGlmIGxvY2FsX3ZhciBpcyBub3QgTm9uZSBhbmQgdmFsdWUgaXMgTm9uZToKKyAgICAgICAgICAgIGlmIGZsYWcgaW4gbG9jYWxfdmFyOgorICAgICAgICAgICAgICAgIHZhbHVlID0gY29weS5jb3B5KGxvY2FsX3ZhcltmbGFnXSkKKyAgICAgICAgICAgIGVsaWYgZmxhZyA9PSAiX2NvbnRlbnQiIGFuZCAiX2RlZmF1bHR2YWwiIGluIGxvY2FsX3ZhciBhbmQgbm90IG5vd2Vha2RlZmF1bHQ6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBjb3B5LmNvcHkobG9jYWxfdmFyWyJfZGVmYXVsdHZhbCJdKQorCisKKyAgICAgICAgaWYgZmxhZyA9PSAiX2NvbnRlbnQiIGFuZCBsb2NhbF92YXIgaXMgbm90IE5vbmUgYW5kICJfYXBwZW5kIiBpbiBsb2NhbF92YXIgYW5kIG5vdCBwYXJzaW5nOgorICAgICAgICAgICAgaWYgbm90IHZhbHVlOgorICAgICAgICAgICAgICAgIHZhbHVlID0gIiIKKyAgICAgICAgICAgIHNlbGYubmVlZF9vdmVycmlkZXMoKQorICAgICAgICAgICAgZm9yIChyLCBvKSBpbiBsb2NhbF92YXJbIl9hcHBlbmQiXToKKyAgICAgICAgICAgICAgICBtYXRjaCA9IFRydWUKKyAgICAgICAgICAgICAgICBpZiBvOgorICAgICAgICAgICAgICAgICAgICBmb3IgbzIgaW4gby5zcGxpdCgiXyIpOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IG8yIGluIHNlbGYub3ZlcnJpZGVzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gRmFsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgKyByCisKKyAgICAgICAgaWYgZmxhZyA9PSAiX2NvbnRlbnQiIGFuZCBsb2NhbF92YXIgaXMgbm90IE5vbmUgYW5kICJfcHJlcGVuZCIgaW4gbG9jYWxfdmFyIGFuZCBub3QgcGFyc2luZzoKKyAgICAgICAgICAgIGlmIG5vdCB2YWx1ZToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICIiCisgICAgICAgICAgICBzZWxmLm5lZWRfb3ZlcnJpZGVzKCkKKyAgICAgICAgICAgIGZvciAociwgbykgaW4gbG9jYWxfdmFyWyJfcHJlcGVuZCJdOgorCisgICAgICAgICAgICAgICAgbWF0Y2ggPSBUcnVlCisgICAgICAgICAgICAgICAgaWYgbzoKKyAgICAgICAgICAgICAgICAgICAgZm9yIG8yIGluIG8uc3BsaXQoIl8iKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvMiBpbiBzZWxmLm92ZXJyaWRlczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IEZhbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHIgKyB2YWx1ZQorCisgICAgICAgIGlmIGV4cGFuZCBhbmQgdmFsdWU6CisgICAgICAgICAgICAjIE9ubHkgZ2V0dmFyIChmbGFnID09IF9jb250ZW50KSBoaXRzIHRoZSBleHBhbmQgY2FjaGUKKyAgICAgICAgICAgIGNhY2hlbmFtZSA9IE5vbmUKKyAgICAgICAgICAgIGlmIGZsYWcgPT0gIl9jb250ZW50IjoKKyAgICAgICAgICAgICAgICBjYWNoZW5hbWUgPSB2YXIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY2FjaGVuYW1lID0gdmFyICsgIlsiICsgZmxhZyArICJdIgorICAgICAgICAgICAgdmFsdWUgPSBzZWxmLmV4cGFuZCh2YWx1ZSwgY2FjaGVuYW1lKQorCisgICAgICAgIGlmIHZhbHVlIGFuZCBmbGFnID09ICJfY29udGVudCIgYW5kIGxvY2FsX3ZhciBpcyBub3QgTm9uZSBhbmQgIl9yZW1vdmUiIGluIGxvY2FsX3ZhcjoKKyAgICAgICAgICAgIHJlbW92ZXMgPSBbXQorICAgICAgICAgICAgc2VsZi5uZWVkX292ZXJyaWRlcygpCisgICAgICAgICAgICBmb3IgKHIsIG8pIGluIGxvY2FsX3ZhclsiX3JlbW92ZSJdOgorICAgICAgICAgICAgICAgIG1hdGNoID0gVHJ1ZQorICAgICAgICAgICAgICAgIGlmIG86CisgICAgICAgICAgICAgICAgICAgIGZvciBvMiBpbiBvLnNwbGl0KCJfIik6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgbzIgaW4gc2VsZi5vdmVycmlkZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBGYWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgICAgICAgICAgcmVtb3Zlcy5leHRlbmQoc2VsZi5leHBhbmQocikuc3BsaXQoKSkKKworICAgICAgICAgICAgZmlsdGVyZWQgPSBmaWx0ZXIobGFtYmRhIHY6IHYgbm90IGluIHJlbW92ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5zcGxpdCgpKQorICAgICAgICAgICAgdmFsdWUgPSAiICIuam9pbihmaWx0ZXJlZCkKKyAgICAgICAgICAgIGlmIGV4cGFuZCBhbmQgdmFyIGluIHNlbGYuZXhwYW5kX2NhY2hlOgorICAgICAgICAgICAgICAgICAjIFdlIG5lZWQgdG8gZW5zdXJlIHRoZSBleHBhbmQgY2FjaGUgaGFzIHRoZSBjb3JyZWN0IHZhbHVlCisgICAgICAgICAgICAgICAgICMgZmxhZyA9PSAiX2NvbnRlbnQiIGhlcmUKKyAgICAgICAgICAgICAgICBzZWxmLmV4cGFuZF9jYWNoZVt2YXJdLnZhbHVlID0gdmFsdWUKKyAgICAgICAgcmV0dXJuIHZhbHVlCisKKyAgICBkZWYgZGVsVmFyRmxhZyhzZWxmLCB2YXIsIGZsYWcsICoqbG9naW5mbyk6CisgICAgICAgIHNlbGYuZXhwYW5kX2NhY2hlID0ge30KKyAgICAgICAgbG9jYWxfdmFyID0gc2VsZi5fZmluZFZhcih2YXIpCisgICAgICAgIGlmIG5vdCBsb2NhbF92YXI6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbm90IHZhciBpbiBzZWxmLmRpY3Q6CisgICAgICAgICAgICBzZWxmLl9tYWtlU2hhZG93Q29weSh2YXIpCisKKyAgICAgICAgaWYgdmFyIGluIHNlbGYuZGljdCBhbmQgZmxhZyBpbiBzZWxmLmRpY3RbdmFyXToKKyAgICAgICAgICAgIGxvZ2luZm9bJ2RldGFpbCddID0gIiIKKyAgICAgICAgICAgIGxvZ2luZm9bJ29wJ10gPSAnZGVsRmxhZycKKyAgICAgICAgICAgIGxvZ2luZm9bJ2ZsYWcnXSA9IGZsYWcKKyAgICAgICAgICAgIHNlbGYudmFyaGlzdG9yeS5yZWNvcmQoKipsb2dpbmZvKQorCisgICAgICAgICAgICBkZWwgc2VsZi5kaWN0W3Zhcl1bZmxhZ10KKworICAgIGRlZiBhcHBlbmRWYXJGbGFnKHNlbGYsIHZhciwgZmxhZywgdmFsdWUsICoqbG9naW5mbyk6CisgICAgICAgIGxvZ2luZm9bJ29wJ10gPSAnYXBwZW5kJworICAgICAgICBsb2dpbmZvWydmbGFnJ10gPSBmbGFnCisgICAgICAgIHNlbGYudmFyaGlzdG9yeS5yZWNvcmQoKipsb2dpbmZvKQorICAgICAgICBuZXd2YWx1ZSA9IChzZWxmLmdldFZhckZsYWcodmFyLCBmbGFnLCBGYWxzZSkgb3IgIiIpICsgdmFsdWUKKyAgICAgICAgc2VsZi5zZXRWYXJGbGFnKHZhciwgZmxhZywgbmV3dmFsdWUsIGlnbm9yZT1UcnVlKQorCisgICAgZGVmIHByZXBlbmRWYXJGbGFnKHNlbGYsIHZhciwgZmxhZywgdmFsdWUsICoqbG9naW5mbyk6CisgICAgICAgIGxvZ2luZm9bJ29wJ10gPSAncHJlcGVuZCcKKyAgICAgICAgbG9naW5mb1snZmxhZyddID0gZmxhZworICAgICAgICBzZWxmLnZhcmhpc3RvcnkucmVjb3JkKCoqbG9naW5mbykKKyAgICAgICAgbmV3dmFsdWUgPSB2YWx1ZSArIChzZWxmLmdldFZhckZsYWcodmFyLCBmbGFnLCBGYWxzZSkgb3IgIiIpCisgICAgICAgIHNlbGYuc2V0VmFyRmxhZyh2YXIsIGZsYWcsIG5ld3ZhbHVlLCBpZ25vcmU9VHJ1ZSkKKworICAgIGRlZiBzZXRWYXJGbGFncyhzZWxmLCB2YXIsIGZsYWdzLCAqKmxvZ2luZm8pOgorICAgICAgICBzZWxmLmV4cGFuZF9jYWNoZSA9IHt9CisgICAgICAgIGluZmVyX2NhbGxlcl9kZXRhaWxzKGxvZ2luZm8pCisgICAgICAgIGlmIG5vdCB2YXIgaW4gc2VsZi5kaWN0OgorICAgICAgICAgICAgc2VsZi5fbWFrZVNoYWRvd0NvcHkodmFyKQorCisgICAgICAgIGZvciBpIGluIGZsYWdzOgorICAgICAgICAgICAgaWYgaSA9PSAiX2NvbnRlbnQiOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBsb2dpbmZvWydmbGFnJ10gPSBpCisgICAgICAgICAgICBsb2dpbmZvWydkZXRhaWwnXSA9IGZsYWdzW2ldCisgICAgICAgICAgICBzZWxmLnZhcmhpc3RvcnkucmVjb3JkKCoqbG9naW5mbykKKyAgICAgICAgICAgIHNlbGYuZGljdFt2YXJdW2ldID0gZmxhZ3NbaV0KKworICAgIGRlZiBnZXRWYXJGbGFncyhzZWxmLCB2YXIsIGV4cGFuZCA9IEZhbHNlLCBpbnRlcm5hbGZsYWdzPUZhbHNlKToKKyAgICAgICAgbG9jYWxfdmFyID0gc2VsZi5fZmluZFZhcih2YXIpCisgICAgICAgIGZsYWdzID0ge30KKworICAgICAgICBpZiBsb2NhbF92YXI6CisgICAgICAgICAgICBmb3IgaSBpbiBsb2NhbF92YXI6CisgICAgICAgICAgICAgICAgaWYgaS5zdGFydHN3aXRoKCJfIikgYW5kIG5vdCBpbnRlcm5hbGZsYWdzOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGZsYWdzW2ldID0gbG9jYWxfdmFyW2ldCisgICAgICAgICAgICAgICAgaWYgZXhwYW5kIGFuZCBpIGluIGV4cGFuZDoKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3NbaV0gPSBzZWxmLmV4cGFuZChmbGFnc1tpXSwgdmFyICsgIlsiICsgaSArICJdIikKKyAgICAgICAgaWYgbGVuKGZsYWdzKSA9PSAwOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgcmV0dXJuIGZsYWdzCisKKworICAgIGRlZiBkZWxWYXJGbGFncyhzZWxmLCB2YXIsICoqbG9naW5mbyk6CisgICAgICAgIHNlbGYuZXhwYW5kX2NhY2hlID0ge30KKyAgICAgICAgaWYgbm90IHZhciBpbiBzZWxmLmRpY3Q6CisgICAgICAgICAgICBzZWxmLl9tYWtlU2hhZG93Q29weSh2YXIpCisKKyAgICAgICAgaWYgdmFyIGluIHNlbGYuZGljdDoKKyAgICAgICAgICAgIGNvbnRlbnQgPSBOb25lCisKKyAgICAgICAgICAgIGxvZ2luZm9bJ29wJ10gPSAnZGVsZXRlIGZsYWdzJworICAgICAgICAgICAgc2VsZi52YXJoaXN0b3J5LnJlY29yZCgqKmxvZ2luZm8pCisKKyAgICAgICAgICAgICMgdHJ5IHRvIHNhdmUgdGhlIGNvbnRlbnQKKyAgICAgICAgICAgIGlmICJfY29udGVudCIgaW4gc2VsZi5kaWN0W3Zhcl06CisgICAgICAgICAgICAgICAgY29udGVudCAgPSBzZWxmLmRpY3RbdmFyXVsiX2NvbnRlbnQiXQorICAgICAgICAgICAgICAgIHNlbGYuZGljdFt2YXJdICAgICAgICAgICAgPSB7fQorICAgICAgICAgICAgICAgIHNlbGYuZGljdFt2YXJdWyJfY29udGVudCJdID0gY29udGVudAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkZWwgc2VsZi5kaWN0W3Zhcl0KKworICAgIGRlZiBjcmVhdGVDb3B5KHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgQ3JlYXRlIGEgY29weSBvZiBzZWxmIGJ5IHNldHRpbmcgX2RhdGEgdG8gc2VsZgorICAgICAgICAiIiIKKyAgICAgICAgIyB3ZSByZWFsbHkgd2FudCB0aGlzIHRvIGJlIGEgRGF0YVNtYXJ0Li4uCisgICAgICAgIGRhdGEgPSBEYXRhU21hcnQoKQorICAgICAgICBkYXRhLmRpY3RbIl9kYXRhIl0gPSBzZWxmLmRpY3QKKyAgICAgICAgZGF0YS52YXJoaXN0b3J5ID0gc2VsZi52YXJoaXN0b3J5LmNvcHkoKQorICAgICAgICBkYXRhLnZhcmhpc3RvcnkuZGF0YXNtYXJ0ID0gZGF0YQorICAgICAgICBkYXRhLmluY2hpc3RvcnkgPSBzZWxmLmluY2hpc3RvcnkuY29weSgpCisKKyAgICAgICAgZGF0YS5fdHJhY2tpbmcgPSBzZWxmLl90cmFja2luZworCisgICAgICAgIGRhdGEub3ZlcnJpZGVzID0gTm9uZQorICAgICAgICBkYXRhLm92ZXJyaWRldmFycyA9IGNvcHkuY29weShzZWxmLm92ZXJyaWRldmFycykKKyAgICAgICAgIyBTaG91bGQgcmVhbGx5IGJlIGEgZGVlcGNvcHkgYnV0IGhhcyBoZWF2eSBvdmVyaGVhZC4KKyAgICAgICAgIyBJbnN0ZWFkLCB3ZSdyZSBjYXJlZnVsIHdpdGggd3JpdGVzLgorICAgICAgICBkYXRhLm92ZXJyaWRlZGF0YSA9IGNvcHkuY29weShzZWxmLm92ZXJyaWRlZGF0YSkKKworICAgICAgICByZXR1cm4gZGF0YQorCisgICAgZGVmIGV4cGFuZFZhcnJlZihzZWxmLCB2YXJpYWJsZSwgcGFyZW50cz1GYWxzZSk6CisgICAgICAgICIiIkZpbmQgYWxsIHJlZmVyZW5jZXMgdG8gdmFyaWFibGUgaW4gdGhlIGRhdGEgYW5kIGV4cGFuZCBpdAorICAgICAgICAgICBpbiBwbGFjZSwgb3B0aW9uYWxseSBkZXNjZW5kaW5nIHRvIHBhcmVudCBkYXRhc3RvcmVzLiIiIgorCisgICAgICAgIGlmIHBhcmVudHM6CisgICAgICAgICAgICBrZXlzID0gaXRlcihzZWxmKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAga2V5cyA9IHNlbGYubG9jYWxrZXlzKCkKKworICAgICAgICByZWYgPSAnJHslc30nICUgdmFyaWFibGUKKyAgICAgICAgdmFsdWUgPSBzZWxmLmdldFZhcih2YXJpYWJsZSwgRmFsc2UpCisgICAgICAgIGZvciBrZXkgaW4ga2V5czoKKyAgICAgICAgICAgIHJlZmVycmVydmFsdWUgPSBzZWxmLmdldFZhcihrZXksIEZhbHNlKQorICAgICAgICAgICAgaWYgcmVmZXJyZXJ2YWx1ZSBhbmQgcmVmIGluIHJlZmVycmVydmFsdWU6CisgICAgICAgICAgICAgICAgc2VsZi5zZXRWYXIoa2V5LCByZWZlcnJlcnZhbHVlLnJlcGxhY2UocmVmLCB2YWx1ZSkpCisKKyAgICBkZWYgbG9jYWxrZXlzKHNlbGYpOgorICAgICAgICBmb3Iga2V5IGluIHNlbGYuZGljdDoKKyAgICAgICAgICAgIGlmIGtleSAhPSAnX2RhdGEnOgorICAgICAgICAgICAgICAgIHlpZWxkIGtleQorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICBkZWxldGVkID0gc2V0KCkKKyAgICAgICAgb3ZlcnJpZGVzID0gc2V0KCkKKyAgICAgICAgZGVmIGtleWxpc3QoZCk6ICAgICAgICAKKyAgICAgICAgICAgIGtsaXN0ID0gc2V0KCkKKyAgICAgICAgICAgIGZvciBrZXkgaW4gZDoKKyAgICAgICAgICAgICAgICBpZiBrZXkgPT0gIl9kYXRhIjoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiBrZXkgaW4gZGVsZXRlZDoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiBrZXkgaW4gb3ZlcnJpZGVzOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIG5vdCBkW2tleV06CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZWQuYWRkKGtleSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBrbGlzdC5hZGQoa2V5KQorCisgICAgICAgICAgICBpZiAiX2RhdGEiIGluIGQ6CisgICAgICAgICAgICAgICAga2xpc3QgfD0ga2V5bGlzdChkWyJfZGF0YSJdKQorCisgICAgICAgICAgICByZXR1cm4ga2xpc3QKKworICAgICAgICBzZWxmLm5lZWRfb3ZlcnJpZGVzKCkKKyAgICAgICAgZm9yIHZhciBpbiBzZWxmLm92ZXJyaWRlZGF0YToKKyAgICAgICAgICAgIGZvciAociwgbykgaW4gc2VsZi5vdmVycmlkZWRhdGFbdmFyXToKKyAgICAgICAgICAgICAgICBpZiBvIGluIHNlbGYub3ZlcnJpZGVzc2V0OgorICAgICAgICAgICAgICAgICAgICBvdmVycmlkZXMuYWRkKHZhcikKKyAgICAgICAgICAgICAgICBlbGlmICJfIiBpbiBvOgorICAgICAgICAgICAgICAgICAgICBpZiBzZXQoby5zcGxpdCgiXyIpKS5pc3N1YnNldChzZWxmLm92ZXJyaWRlc3NldCk6CisgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZXMuYWRkKHZhcikKKworICAgICAgICBmb3IgayBpbiBrZXlsaXN0KHNlbGYuZGljdCk6CisgICAgICAgICAgICAgeWllbGQgaworCisgICAgICAgIGZvciBrIGluIG92ZXJyaWRlczoKKyAgICAgICAgICAgICB5aWVsZCBrCisKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGxlbihmcm96ZW5zZXQoc2VsZikpCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaXRlbSk6CisgICAgICAgIHZhbHVlID0gc2VsZi5nZXRWYXIoaXRlbSwgRmFsc2UpCisgICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBLZXlFcnJvcihpdGVtKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHZhbHVlCisKKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwgdmFyLCB2YWx1ZSk6CisgICAgICAgIHNlbGYuc2V0VmFyKHZhciwgdmFsdWUpCisKKyAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwgdmFyKToKKyAgICAgICAgc2VsZi5kZWxWYXIodmFyKQorCisgICAgZGVmIGdldF9oYXNoKHNlbGYpOgorICAgICAgICBkYXRhID0ge30KKyAgICAgICAgZCA9IHNlbGYuY3JlYXRlQ29weSgpCisgICAgICAgIGJiLmRhdGEuZXhwYW5kS2V5cyhkKQorICAgICAgICBiYi5kYXRhLnVwZGF0ZV9kYXRhKGQpCisKKyAgICAgICAgY29uZmlnX3doaXRlbGlzdCA9IHNldCgoZC5nZXRWYXIoIkJCX0hBU0hDT05GSUdfV0hJVEVMSVNUIiwgVHJ1ZSkgb3IgIiIpLnNwbGl0KCkpCisgICAgICAgIGtleXMgPSBzZXQoa2V5IGZvciBrZXkgaW4gaXRlcihkKSBpZiBub3Qga2V5LnN0YXJ0c3dpdGgoIl9fIikpCisgICAgICAgIGZvciBrZXkgaW4ga2V5czoKKyAgICAgICAgICAgIGlmIGtleSBpbiBjb25maWdfd2hpdGVsaXN0OgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIHZhbHVlID0gZC5nZXRWYXIoa2V5LCBGYWxzZSkgb3IgIiIKKyAgICAgICAgICAgIGRhdGEudXBkYXRlKHtrZXk6dmFsdWV9KQorCisgICAgICAgICAgICB2YXJmbGFncyA9IGQuZ2V0VmFyRmxhZ3Moa2V5LCBpbnRlcm5hbGZsYWdzID0gVHJ1ZSkKKyAgICAgICAgICAgIGlmIG5vdCB2YXJmbGFnczoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZm9yIGYgaW4gdmFyZmxhZ3M6CisgICAgICAgICAgICAgICAgaWYgZiA9PSAiX2NvbnRlbnQiOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGRhdGEudXBkYXRlKHsnJXNbJXNdJyAlIChrZXksIGYpOnZhcmZsYWdzW2ZdfSkKKworICAgICAgICBmb3Iga2V5IGluIFsiX19CQlRBU0tTIiwgIl9fQkJBTk9ORlVOQ1MiLCAiX19CQkhBTkRMRVJTIl06CisgICAgICAgICAgICBiYl9saXN0ID0gZC5nZXRWYXIoa2V5LCBGYWxzZSkgb3IgW10KKyAgICAgICAgICAgIGJiX2xpc3Quc29ydCgpCisgICAgICAgICAgICBkYXRhLnVwZGF0ZSh7a2V5OnN0cihiYl9saXN0KX0pCisKKyAgICAgICAgICAgIGlmIGtleSA9PSAiX19CQkFOT05GVU5DUyI6CisgICAgICAgICAgICAgICAgZm9yIGkgaW4gYmJfbGlzdDoKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBkLmdldFZhcihpLCBUcnVlKSBvciAiIgorICAgICAgICAgICAgICAgICAgICBkYXRhLnVwZGF0ZSh7aTp2YWx1ZX0pCisKKyAgICAgICAgZGF0YV9zdHIgPSBzdHIoWyhrLCBkYXRhW2tdKSBmb3IgayBpbiBzb3J0ZWQoZGF0YS5rZXlzKCkpXSkKKyAgICAgICAgcmV0dXJuIGhhc2hsaWIubWQ1KGRhdGFfc3RyKS5oZXhkaWdlc3QoKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvZXZlbnQucHkgYi9iaXRiYWtlL2xpYi9iYi9ldmVudC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjZiYzQxCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvZXZlbnQucHkKQEAgLTAsMCArMSw2NjggQEAKKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisiIiIKK0JpdEJha2UgJ0V2ZW50JyBpbXBsZW1lbnRhdGlvbgorCitDbGFzc2VzIGFuZCBmdW5jdGlvbnMgZm9yIG1hbmlwdWxhdGluZyAnZXZlbnRzJyBpbiB0aGUKK0JpdEJha2UgYnVpbGQgdG9vbHMuCisiIiIKKworIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgIENocmlzIExhcnNvbgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworaW1wb3J0IG9zLCBzeXMKK2ltcG9ydCB3YXJuaW5ncwordHJ5OgorICAgIGltcG9ydCBjUGlja2xlIGFzIHBpY2tsZQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGltcG9ydCBwaWNrbGUKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgYXRleGl0CitpbXBvcnQgdHJhY2ViYWNrCitpbXBvcnQgYmIudXRpbHMKK2ltcG9ydCBiYi5jb21wYXQKK2ltcG9ydCBiYi5leGNlcHRpb25zCisKKyMgVGhpcyBpcyB0aGUgcGlkIGZvciB3aGljaCB3ZSBzaG91bGQgZ2VuZXJhdGUgdGhlIGV2ZW50LiBUaGlzIGlzIHNldCB3aGVuCisjIHRoZSBydW5xdWV1ZSBmb3JrcyBvZmYuCit3b3JrZXJfcGlkID0gMAord29ya2VyX2ZpcmUgPSBOb25lCisKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCdCaXRCYWtlLkV2ZW50JykKKworY2xhc3MgRXZlbnQob2JqZWN0KToKKyAgICAiIiJCYXNlIGNsYXNzIGZvciBldmVudHMiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5waWQgPSB3b3JrZXJfcGlkCisKK1JlZ2lzdGVyZWQgICAgICAgID0gMTAKK0FscmVhZHlSZWdpc3RlcmVkID0gMTQKKworZGVmIGdldF9jbGFzc19oYW5kbGVycygpOgorICAgIHJldHVybiBfaGFuZGxlcnMKKworZGVmIHNldF9jbGFzc19oYW5kbGVycyhoKToKKyAgICBnbG9iYWwgX2hhbmRsZXJzCisgICAgX2hhbmRsZXJzID0gaAorCitkZWYgY2xlYW5fY2xhc3NfaGFuZGxlcnMoKToKKyAgICByZXR1cm4gYmIuY29tcGF0Lk9yZGVyZWREaWN0KCkKKworIyBJbnRlcm5hbAorX2hhbmRsZXJzID0gY2xlYW5fY2xhc3NfaGFuZGxlcnMoKQorX3VpX2hhbmRsZXJzID0ge30KK191aV9sb2dmaWx0ZXJzID0ge30KK191aV9oYW5kbGVyX3NlcSA9IDAKK19ldmVudF9oYW5kbGVyX21hcCA9IHt9CitfY2F0Y2hhbGxfaGFuZGxlcnMgPSB7fQorX2V2ZW50ZmlsdGVyID0gTm9uZQorX3VpcmVhZHkgPSBGYWxzZQorCitkZWYgZXhlY3V0ZV9oYW5kbGVyKG5hbWUsIGhhbmRsZXIsIGV2ZW50LCBkKToKKyAgICBldmVudC5kYXRhID0gZAorICAgIGFkZGVkZCA9IEZhbHNlCisgICAgaWYgJ2QnIG5vdCBpbiBfX2J1aWx0aW5zX186CisgICAgICAgIF9fYnVpbHRpbnNfX1snZCddID0gZAorICAgICAgICBhZGRlZGQgPSBUcnVlCisgICAgdHJ5OgorICAgICAgICByZXQgPSBoYW5kbGVyKGV2ZW50KQorICAgIGV4Y2VwdCAoYmIucGFyc2UuU2tpcFJlY2lwZSwgYmIuQkJIYW5kbGVkRXhjZXB0aW9uKToKKyAgICAgICAgcmFpc2UKKyAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICBldHlwZSwgdmFsdWUsIHRiID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgbG9nZ2VyLmVycm9yKCJFeGVjdXRpb24gb2YgZXZlbnQgaGFuZGxlciAnJXMnIGZhaWxlZCIgJSBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgZXhjX2luZm89KGV0eXBlLCB2YWx1ZSwgdGIudGJfbmV4dCkpCisgICAgICAgIHJhaXNlCisgICAgZXhjZXB0IFN5c3RlbUV4aXQgYXMgZXhjOgorICAgICAgICBpZiBleGMuY29kZSAhPSAwOgorICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJFeGVjdXRpb24gb2YgZXZlbnQgaGFuZGxlciAnJXMnIGZhaWxlZCIgJSBuYW1lKQorICAgICAgICByYWlzZQorICAgIGZpbmFsbHk6CisgICAgICAgIGRlbCBldmVudC5kYXRhCisgICAgICAgIGlmIGFkZGVkZDoKKyAgICAgICAgICAgIGRlbCBfX2J1aWx0aW5zX19bJ2QnXQorCitkZWYgZmlyZV9jbGFzc19oYW5kbGVycyhldmVudCwgZCk6CisgICAgaWYgaXNpbnN0YW5jZShldmVudCwgbG9nZ2luZy5Mb2dSZWNvcmQpOgorICAgICAgICByZXR1cm4KKworICAgIGVpZCA9IHN0cihldmVudC5fX2NsYXNzX18pWzg6LTJdCisgICAgZXZ0X2htYXAgPSBfZXZlbnRfaGFuZGxlcl9tYXAuZ2V0KGVpZCwge30pCisgICAgZm9yIG5hbWUsIGhhbmRsZXIgaW4gX2hhbmRsZXJzLml0ZXJpdGVtcygpOgorICAgICAgICBpZiBuYW1lIGluIF9jYXRjaGFsbF9oYW5kbGVycyBvciBuYW1lIGluIGV2dF9obWFwOgorICAgICAgICAgICAgaWYgX2V2ZW50ZmlsdGVyOgorICAgICAgICAgICAgICAgIGlmIG5vdCBfZXZlbnRmaWx0ZXIobmFtZSwgaGFuZGxlciwgZXZlbnQsIGQpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZXhlY3V0ZV9oYW5kbGVyKG5hbWUsIGhhbmRsZXIsIGV2ZW50LCBkKQorCit1aV9xdWV1ZSA9IFtdCitAYXRleGl0LnJlZ2lzdGVyCitkZWYgcHJpbnRfdWlfcXVldWUoKToKKyAgICAiIiJJZiB3ZSdyZSBleGl0aW5nIGJlZm9yZSBhIFVJIGhhcyBiZWVuIHNwYXduZWQsIGRpc3BsYXkgYW55IHF1ZXVlZAorICAgIExvZ1JlY29yZHMgdG8gdGhlIGNvbnNvbGUuIiIiCisgICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoIkJpdEJha2UiKQorICAgIGlmIG5vdCBfdWlyZWFkeToKKyAgICAgICAgZnJvbSBiYi5tc2cgaW1wb3J0IEJCTG9nRm9ybWF0dGVyCisgICAgICAgIGNvbnNvbGUgPSBsb2dnaW5nLlN0cmVhbUhhbmRsZXIoc3lzLnN0ZG91dCkKKyAgICAgICAgY29uc29sZS5zZXRGb3JtYXR0ZXIoQkJMb2dGb3JtYXR0ZXIoIiUobGV2ZWxuYW1lKXM6ICUobWVzc2FnZSlzIikpCisgICAgICAgIGxvZ2dlci5oYW5kbGVycyA9IFtjb25zb2xlXQorCisgICAgICAgICMgRmlyc3QgY2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYW55IHByb3BlciBtZXNzYWdlcworICAgICAgICBtc2dwcmludCA9IEZhbHNlCisgICAgICAgIGZvciBldmVudCBpbiB1aV9xdWV1ZToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGxvZ2dpbmcuTG9nUmVjb3JkKToKKyAgICAgICAgICAgICAgICBpZiBldmVudC5sZXZlbG5vID4gbG9nZ2luZy5ERUJVRzoKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmhhbmRsZShldmVudCkKKyAgICAgICAgICAgICAgICAgICAgbXNncHJpbnQgPSBUcnVlCisgICAgICAgIGlmIG1zZ3ByaW50OgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBOb3BlLCBzbyBqdXN0IHByaW50IGFsbCBvZiB0aGUgbWVzc2FnZXMgd2UgaGF2ZSAoaW5jbHVkaW5nIGRlYnVnIG1lc3NhZ2VzKQorICAgICAgICBmb3IgZXZlbnQgaW4gdWlfcXVldWU6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBsb2dnaW5nLkxvZ1JlY29yZCk6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmhhbmRsZShldmVudCkKKworZGVmIGZpcmVfdWlfaGFuZGxlcnMoZXZlbnQsIGQpOgorICAgIGlmIG5vdCBfdWlyZWFkeToKKyAgICAgICAgIyBObyBVSSBoYW5kbGVycyByZWdpc3RlcmVkIHlldCwgcXVldWUgdXAgdGhlIG1lc3NhZ2VzCisgICAgICAgIHVpX3F1ZXVlLmFwcGVuZChldmVudCkKKyAgICAgICAgcmV0dXJuCisKKyAgICBlcnJvcnMgPSBbXQorICAgIGZvciBoIGluIF91aV9oYW5kbGVyczoKKyAgICAgICAgI3ByaW50ICJTZW5kaW5nIGV2ZW50ICVzIiAlIGV2ZW50CisgICAgICAgIHRyeToKKyAgICAgICAgICAgICBpZiBub3QgX3VpX2xvZ2ZpbHRlcnNbaF0uZmlsdGVyKGV2ZW50KToKKyAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAjIFdlIHVzZSBwaWNrbGUgaGVyZSBzaW5jZSBpdCBiZXR0ZXIgaGFuZGxlcyBvYmplY3QgaW5zdGFuY2VzCisgICAgICAgICAgICAgIyB3aGljaCB4bWxycGMncyBtYXJzaGFsbGVyIGRvZXMgbm90LiBFdmVudHMgKm11c3QqIGJlIHNlcmlhbGl6YWJsZQorICAgICAgICAgICAgICMgYnkgcGlja2xlLgorICAgICAgICAgICAgIGlmIGhhc2F0dHIoX3VpX2hhbmRsZXJzW2hdLmV2ZW50LCAic2VuZHBpY2tsZSIpOgorICAgICAgICAgICAgICAgIF91aV9oYW5kbGVyc1toXS5ldmVudC5zZW5kcGlja2xlKChwaWNrbGUuZHVtcHMoZXZlbnQpKSkKKyAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIF91aV9oYW5kbGVyc1toXS5ldmVudC5zZW5kKGV2ZW50KQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKGgpCisgICAgZm9yIGggaW4gZXJyb3JzOgorICAgICAgICBkZWwgX3VpX2hhbmRsZXJzW2hdCisKK2RlZiBmaXJlKGV2ZW50LCBkKToKKyAgICAiIiJGaXJlIG9mZiBhbiBFdmVudCIiIgorCisgICAgIyBXZSBjYW4gZmlyZSBjbGFzcyBoYW5kbGVycyBpbiB0aGUgd29ya2VyIHByb2Nlc3MgY29udGV4dCBhbmQgdGhpcyBpcworICAgICMgZGVzaXJlZCBzbyB0aGV5IGdldCB0aGUgdGFzayBiYXNlZCBkYXRhc3RvcmUuCisgICAgIyBVSSBoYW5kbGVycyBuZWVkIHRvIGJlIGZpcmVkIGluIHRoZSBzZXJ2ZXIgY29udGV4dCBzbyB3ZSBkZWZlciB0aGlzLiBUaGV5CisgICAgIyBkb24ndCBoYXZlIGEgZGF0YXN0b3JlIHNvIHRoZSBkYXRhc3RvcmUgY29udGV4dCBpc24ndCBhIHByb2JsZW0uCisKKyAgICBmaXJlX2NsYXNzX2hhbmRsZXJzKGV2ZW50LCBkKQorICAgIGlmIHdvcmtlcl9maXJlOgorICAgICAgICB3b3JrZXJfZmlyZShldmVudCwgZCkKKyAgICBlbHNlOgorICAgICAgICBmaXJlX3VpX2hhbmRsZXJzKGV2ZW50LCBkKQorCitkZWYgZmlyZV9mcm9tX3dvcmtlcihldmVudCwgZCk6CisgICAgZmlyZV91aV9oYW5kbGVycyhldmVudCwgZCkKKworbm9vcCA9IGxhbWJkYSBfOiBOb25lCitkZWYgcmVnaXN0ZXIobmFtZSwgaGFuZGxlciwgbWFzaz1Ob25lKToKKyAgICAiIiJSZWdpc3RlciBhbiBFdmVudCBoYW5kbGVyIiIiCisKKyAgICAjIGFscmVhZHkgcmVnaXN0ZXJlZAorICAgIGlmIG5hbWUgaW4gX2hhbmRsZXJzOgorICAgICAgICByZXR1cm4gQWxyZWFkeVJlZ2lzdGVyZWQKKworICAgIGlmIGhhbmRsZXIgaXMgbm90IE5vbmU6CisgICAgICAgICMgaGFuZGxlIHN0cmluZyBjb250YWluaW5nIHB5dGhvbiBjb2RlCisgICAgICAgIGlmIGlzaW5zdGFuY2UoaGFuZGxlciwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICB0bXAgPSAiZGVmICVzKGUpOlxuJXMiICUgKG5hbWUsIGhhbmRsZXIpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY29kZSA9IGNvbXBpbGUodG1wLCAiJXMoZSkiICUgbmFtZSwgImV4ZWMiKQorICAgICAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yOgorICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiVW5hYmxlIHRvIHJlZ2lzdGVyIGV2ZW50IGhhbmRsZXIgJyVzJzpcbiVzIiwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycuam9pbih0cmFjZWJhY2suZm9ybWF0X2V4YyhsaW1pdD0wKSkpCisgICAgICAgICAgICAgICAgX2hhbmRsZXJzW25hbWVdID0gbm9vcAorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZW52ID0ge30KKyAgICAgICAgICAgIGJiLnV0aWxzLmJldHRlcl9leGVjKGNvZGUsIGVudikKKyAgICAgICAgICAgIGZ1bmMgPSBiYi51dGlscy5iZXR0ZXJfZXZhbChuYW1lLCBlbnYpCisgICAgICAgICAgICBfaGFuZGxlcnNbbmFtZV0gPSBmdW5jCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBfaGFuZGxlcnNbbmFtZV0gPSBoYW5kbGVyCisKKyAgICAgICAgaWYgbm90IG1hc2sgb3IgJyonIGluIG1hc2s6CisgICAgICAgICAgICBfY2F0Y2hhbGxfaGFuZGxlcnNbbmFtZV0gPSBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmb3IgbSBpbiBtYXNrOgorICAgICAgICAgICAgICAgIGlmIF9ldmVudF9oYW5kbGVyX21hcC5nZXQobSwgTm9uZSkgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgX2V2ZW50X2hhbmRsZXJfbWFwW21dID0ge30KKyAgICAgICAgICAgICAgICBfZXZlbnRfaGFuZGxlcl9tYXBbbV1bbmFtZV0gPSBUcnVlCisKKyAgICAgICAgcmV0dXJuIFJlZ2lzdGVyZWQKKworZGVmIHJlbW92ZShuYW1lLCBoYW5kbGVyKToKKyAgICAiIiJSZW1vdmUgYW4gRXZlbnQgaGFuZGxlciIiIgorICAgIF9oYW5kbGVycy5wb3AobmFtZSkKKworZGVmIHNldF9ldmVudGZpbHRlcihmdW5jKToKKyAgICBnbG9iYWwgX2V2ZW50ZmlsdGVyCisgICAgX2V2ZW50ZmlsdGVyID0gZnVuYworCitkZWYgcmVnaXN0ZXJfVUlIaGFuZGxlcihoYW5kbGVyLCBtYWludWk9RmFsc2UpOgorICAgIGlmIG1haW51aToKKyAgICAgICAgZ2xvYmFsIF91aXJlYWR5CisgICAgICAgIF91aXJlYWR5ID0gVHJ1ZQorICAgIGJiLmV2ZW50Ll91aV9oYW5kbGVyX3NlcSA9IGJiLmV2ZW50Ll91aV9oYW5kbGVyX3NlcSArIDEKKyAgICBfdWlfaGFuZGxlcnNbX3VpX2hhbmRsZXJfc2VxXSA9IGhhbmRsZXIKKyAgICBsZXZlbCwgZGVidWdfZG9tYWlucyA9IGJiLm1zZy5jb25zdHJ1Y3RMb2dPcHRpb25zKCkKKyAgICBfdWlfbG9nZmlsdGVyc1tfdWlfaGFuZGxlcl9zZXFdID0gVUlFdmVudEZpbHRlcihsZXZlbCwgZGVidWdfZG9tYWlucykKKyAgICByZXR1cm4gX3VpX2hhbmRsZXJfc2VxCisKK2RlZiB1bnJlZ2lzdGVyX1VJSGhhbmRsZXIoaGFuZGxlck51bSk6CisgICAgaWYgaGFuZGxlck51bSBpbiBfdWlfaGFuZGxlcnM6CisgICAgICAgIGRlbCBfdWlfaGFuZGxlcnNbaGFuZGxlck51bV0KKyAgICByZXR1cm4KKworIyBDbGFzcyB0byBhbGxvdyBmaWx0ZXJpbmcgb2YgZXZlbnRzIGFuZCBzcGVjaWZpYyBmaWx0ZXJpbmcgb2YgTG9nUmVjb3JkcyAqYmVmb3JlKiB3ZSBwdXQgdGhlbSBvdmVyIHRoZSBJUEMKK2NsYXNzIFVJRXZlbnRGaWx0ZXIob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbGV2ZWwsIGRlYnVnX2RvbWFpbnMpOgorICAgICAgICBzZWxmLnVwZGF0ZShOb25lLCBsZXZlbCwgZGVidWdfZG9tYWlucykKKworICAgIGRlZiB1cGRhdGUoc2VsZiwgZXZlbnRtYXNrLCBsZXZlbCwgZGVidWdfZG9tYWlucyk6CisgICAgICAgIHNlbGYuZXZlbnRtYXNrID0gZXZlbnRtYXNrCisgICAgICAgIHNlbGYuc3RkbGV2ZWwgPSBsZXZlbAorICAgICAgICBzZWxmLmRlYnVnX2RvbWFpbnMgPSBkZWJ1Z19kb21haW5zCisKKyAgICBkZWYgZmlsdGVyKHNlbGYsIGV2ZW50KToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgbG9nZ2luZy5Mb2dSZWNvcmQpOgorICAgICAgICAgICAgaWYgZXZlbnQubGV2ZWxubyA+PSBzZWxmLnN0ZGxldmVsOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICBpZiBldmVudC5uYW1lIGluIHNlbGYuZGVidWdfZG9tYWlucyBhbmQgZXZlbnQubGV2ZWxubyA+PSBzZWxmLmRlYnVnX2RvbWFpbnNbZXZlbnQubmFtZV06CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBlaWQgPSBzdHIoZXZlbnQuX19jbGFzc19fKVs4Oi0yXQorICAgICAgICBpZiBzZWxmLmV2ZW50bWFzayBhbmQgZWlkIG5vdCBpbiBzZWxmLmV2ZW50bWFzazoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCitkZWYgc2V0X1VJSG1hc2soaGFuZGxlck51bSwgbGV2ZWwsIGRlYnVnX2RvbWFpbnMsIG1hc2spOgorICAgIGlmIG5vdCBoYW5kbGVyTnVtIGluIF91aV9oYW5kbGVyczoKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgaWYgJyonIGluIG1hc2s6CisgICAgICAgIF91aV9sb2dmaWx0ZXJzW2hhbmRsZXJOdW1dLnVwZGF0ZShOb25lLCBsZXZlbCwgZGVidWdfZG9tYWlucykKKyAgICBlbHNlOgorICAgICAgICBfdWlfbG9nZmlsdGVyc1toYW5kbGVyTnVtXS51cGRhdGUobWFzaywgbGV2ZWwsIGRlYnVnX2RvbWFpbnMpCisgICAgcmV0dXJuIFRydWUKKworZGVmIGdldE5hbWUoZSk6CisgICAgIiIiUmV0dXJucyB0aGUgbmFtZSBvZiBhIGNsYXNzIG9yIGNsYXNzIGluc3RhbmNlIiIiCisgICAgaWYgZ2V0YXR0cihlLCAiX19uYW1lX18iLCBOb25lKSA9PSBOb25lOgorICAgICAgICByZXR1cm4gZS5fX2NsYXNzX18uX19uYW1lX18KKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gZS5fX25hbWVfXworCitjbGFzcyBPcGVyYXRpb25TdGFydGVkKEV2ZW50KToKKyAgICAiIiJBbiBvcGVyYXRpb24gaGFzIGJlZ3VuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1zZyA9ICJPcGVyYXRpb24gU3RhcnRlZCIpOgorICAgICAgICBFdmVudC5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLm1zZyA9IG1zZworCitjbGFzcyBPcGVyYXRpb25Db21wbGV0ZWQoRXZlbnQpOgorICAgICIiIkFuIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRvdGFsLCBtc2cgPSAiT3BlcmF0aW9uIENvbXBsZXRlZCIpOgorICAgICAgICBFdmVudC5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLnRvdGFsID0gdG90YWwKKyAgICAgICAgc2VsZi5tc2cgPSBtc2cKKworY2xhc3MgT3BlcmF0aW9uUHJvZ3Jlc3MoRXZlbnQpOgorICAgICIiIkFuIG9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcyIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjdXJyZW50LCB0b3RhbCwgbXNnID0gIk9wZXJhdGlvbiBpbiBQcm9ncmVzcyIpOgorICAgICAgICBFdmVudC5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLmN1cnJlbnQgPSBjdXJyZW50CisgICAgICAgIHNlbGYudG90YWwgPSB0b3RhbAorICAgICAgICBzZWxmLm1zZyA9IG1zZyArICI6ICVzLyVzIiAlIChjdXJyZW50LCB0b3RhbCk7CisKK2NsYXNzIENvbmZpZ1BhcnNlZChFdmVudCk6CisgICAgIiIiQ29uZmlndXJhdGlvbiBQYXJzaW5nIENvbXBsZXRlIiIiCisKK2NsYXNzIFJlY2lwZUV2ZW50KEV2ZW50KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZm4pOgorICAgICAgICBzZWxmLmZuID0gZm4KKyAgICAgICAgRXZlbnQuX19pbml0X18oc2VsZikKKworY2xhc3MgUmVjaXBlUHJlRmluYWxpc2UoUmVjaXBlRXZlbnQpOgorICAgICIiIiBSZWNpcGUgUGFyc2luZyBDb21wbGV0ZSBidXQgbm90IHlldCBmaW5pYWxpc2VkIiIiCisKK2NsYXNzIFJlY2lwZVBhcnNlZChSZWNpcGVFdmVudCk6CisgICAgIiIiIFJlY2lwZSBQYXJzaW5nIENvbXBsZXRlICIiIgorCitjbGFzcyBTdGFtcFVwZGF0ZShFdmVudCk6CisgICAgIiIiVHJpZ2dlciBmb3IgYW55IGFkanVzdG1lbnQgb2YgdGhlIHN0YW1wIGZpbGVzIHRvIGhhcHBlbiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRhcmdldHMsIHN0YW1wZm5zKToKKyAgICAgICAgc2VsZi5fdGFyZ2V0cyA9IHRhcmdldHMKKyAgICAgICAgc2VsZi5fc3RhbXBmbnMgPSBzdGFtcGZucworICAgICAgICBFdmVudC5fX2luaXRfXyhzZWxmKQorCisgICAgZGVmIGdldFN0YW1wUHJlZml4KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fc3RhbXBmbnMKKworICAgIGRlZiBnZXRUYXJnZXRzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fdGFyZ2V0cworCisgICAgc3RhbXBQcmVmaXggPSBwcm9wZXJ0eShnZXRTdGFtcFByZWZpeCkKKyAgICB0YXJnZXRzID0gcHJvcGVydHkoZ2V0VGFyZ2V0cykKKworY2xhc3MgQnVpbGRCYXNlKEV2ZW50KToKKyAgICAiIiJCYXNlIGNsYXNzIGZvciBiYm1ha2UgcnVuIGV2ZW50cyIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG4sIHAsIGZhaWx1cmVzID0gMCk6CisgICAgICAgIHNlbGYuX25hbWUgPSBuCisgICAgICAgIHNlbGYuX3BrZ3MgPSBwCisgICAgICAgIEV2ZW50Ll9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuX2ZhaWx1cmVzID0gZmFpbHVyZXMKKworICAgIGRlZiBnZXRQa2dzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcGtncworCisgICAgZGVmIHNldFBrZ3Moc2VsZiwgcGtncyk6CisgICAgICAgIHNlbGYuX3BrZ3MgPSBwa2dzCisKKyAgICBkZWYgZ2V0TmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX25hbWUKKworICAgIGRlZiBzZXROYW1lKHNlbGYsIG5hbWUpOgorICAgICAgICBzZWxmLl9uYW1lID0gbmFtZQorCisgICAgZGVmIGdldENmZyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YQorCisgICAgZGVmIHNldENmZyhzZWxmLCBjZmcpOgorICAgICAgICBzZWxmLmRhdGEgPSBjZmcKKworICAgIGRlZiBnZXRGYWlsdXJlcyhzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiB0aGUgbnVtYmVyIG9mIGZhaWxlZCBwYWNrYWdlcworICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZhaWx1cmVzCisKKyAgICBwa2dzID0gcHJvcGVydHkoZ2V0UGtncywgc2V0UGtncywgTm9uZSwgInBrZ3MgcHJvcGVydHkiKQorICAgIG5hbWUgPSBwcm9wZXJ0eShnZXROYW1lLCBzZXROYW1lLCBOb25lLCAibmFtZSBwcm9wZXJ0eSIpCisgICAgY2ZnID0gcHJvcGVydHkoZ2V0Q2ZnLCBzZXRDZmcsIE5vbmUsICJjZmcgcHJvcGVydHkiKQorCisKKworCisKK2NsYXNzIEJ1aWxkU3RhcnRlZChCdWlsZEJhc2UsIE9wZXJhdGlvblN0YXJ0ZWQpOgorICAgICIiImJibWFrZSBidWlsZCBydW4gc3RhcnRlZCIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuLCBwLCBmYWlsdXJlcyA9IDApOgorICAgICAgICBPcGVyYXRpb25TdGFydGVkLl9faW5pdF9fKHNlbGYsICJCdWlsZGluZyBTdGFydGVkIikKKyAgICAgICAgQnVpbGRCYXNlLl9faW5pdF9fKHNlbGYsIG4sIHAsIGZhaWx1cmVzKQorCitjbGFzcyBCdWlsZENvbXBsZXRlZChCdWlsZEJhc2UsIE9wZXJhdGlvbkNvbXBsZXRlZCk6CisgICAgIiIiYmJtYWtlIGJ1aWxkIHJ1biBjb21wbGV0ZWQiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdG90YWwsIG4sIHAsIGZhaWx1cmVzPTAsIGludGVycnVwdGVkPTApOgorICAgICAgICBpZiBub3QgZmFpbHVyZXM6CisgICAgICAgICAgICBPcGVyYXRpb25Db21wbGV0ZWQuX19pbml0X18oc2VsZiwgdG90YWwsICJCdWlsZGluZyBTdWNjZWVkZWQiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgT3BlcmF0aW9uQ29tcGxldGVkLl9faW5pdF9fKHNlbGYsIHRvdGFsLCAiQnVpbGRpbmcgRmFpbGVkIikKKyAgICAgICAgc2VsZi5faW50ZXJydXB0ZWQgPSBpbnRlcnJ1cHRlZAorICAgICAgICBCdWlsZEJhc2UuX19pbml0X18oc2VsZiwgbiwgcCwgZmFpbHVyZXMpCisKK2NsYXNzIERpc2tGdWxsKEV2ZW50KToKKyAgICAiIiJEaXNrIGZ1bGwgY2FzZSBidWlsZCBhYm9ydGVkIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRldiwgdHlwZSwgZnJlZXNwYWNlLCBtb3VudHBvaW50KToKKyAgICAgICAgRXZlbnQuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5fZGV2ID0gZGV2CisgICAgICAgIHNlbGYuX3R5cGUgPSB0eXBlCisgICAgICAgIHNlbGYuX2ZyZWUgPSBmcmVlc3BhY2UKKyAgICAgICAgc2VsZi5fbW91bnRwb2ludCA9IG1vdW50cG9pbnQKKworY2xhc3MgTm9Qcm92aWRlcihFdmVudCk6CisgICAgIiIiTm8gUHJvdmlkZXIgZm9yIGFuIEV2ZW50IiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaXRlbSwgcnVudGltZT1GYWxzZSwgZGVwZW5kZWVzPU5vbmUsIHJlYXNvbnM9Tm9uZSwgY2xvc2VfbWF0Y2hlcz1Ob25lKToKKyAgICAgICAgRXZlbnQuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5faXRlbSA9IGl0ZW0KKyAgICAgICAgc2VsZi5fcnVudGltZSA9IHJ1bnRpbWUKKyAgICAgICAgc2VsZi5fZGVwZW5kZWVzID0gZGVwZW5kZWVzCisgICAgICAgIHNlbGYuX3JlYXNvbnMgPSByZWFzb25zCisgICAgICAgIHNlbGYuX2Nsb3NlX21hdGNoZXMgPSBjbG9zZV9tYXRjaGVzCisKKyAgICBkZWYgZ2V0SXRlbShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2l0ZW0KKworICAgIGRlZiBpc1J1bnRpbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9ydW50aW1lCisKK2NsYXNzIE11bHRpcGxlUHJvdmlkZXJzKEV2ZW50KToKKyAgICAiIiJNdWx0aXBsZSBQcm92aWRlcnMiIiIKKworICAgIGRlZiAgX19pbml0X18oc2VsZiwgaXRlbSwgY2FuZGlkYXRlcywgcnVudGltZSA9IEZhbHNlKToKKyAgICAgICAgRXZlbnQuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5faXRlbSA9IGl0ZW0KKyAgICAgICAgc2VsZi5fY2FuZGlkYXRlcyA9IGNhbmRpZGF0ZXMKKyAgICAgICAgc2VsZi5faXNfcnVudGltZSA9IHJ1bnRpbWUKKworICAgIGRlZiBpc1J1bnRpbWUoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBJcyB0aGlzIGEgcnVudGltZSBpc3N1ZT8KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9pc19ydW50aW1lCisKKyAgICBkZWYgZ2V0SXRlbShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFRoZSBuYW1lIGZvciB0aGUgdG8gYmUgYnVpbGQgaXRlbQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2l0ZW0KKworICAgIGRlZiBnZXRDYW5kaWRhdGVzKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgR2V0IHRoZSBwb3NzaWJsZSBDYW5kaWRhdGVzIGZvciBhIFBST1ZJREVSLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NhbmRpZGF0ZXMKKworY2xhc3MgUGFyc2VTdGFydGVkKE9wZXJhdGlvblN0YXJ0ZWQpOgorICAgICIiIlJlY2lwZSBwYXJzaW5nIGZvciB0aGUgcnVucXVldWUgaGFzIGJlZ3VuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRvdGFsKToKKyAgICAgICAgT3BlcmF0aW9uU3RhcnRlZC5fX2luaXRfXyhzZWxmLCAiUmVjaXBlIHBhcnNpbmcgU3RhcnRlZCIpCisgICAgICAgIHNlbGYudG90YWwgPSB0b3RhbAorCitjbGFzcyBQYXJzZUNvbXBsZXRlZChPcGVyYXRpb25Db21wbGV0ZWQpOgorICAgICIiIlJlY2lwZSBwYXJzaW5nIGZvciB0aGUgcnVucXVldWUgaGFzIGNvbXBsZXRlZCIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjYWNoZWQsIHBhcnNlZCwgc2tpcHBlZCwgbWFza2VkLCB2aXJ0dWFscywgZXJyb3JzLCB0b3RhbCk6CisgICAgICAgIE9wZXJhdGlvbkNvbXBsZXRlZC5fX2luaXRfXyhzZWxmLCB0b3RhbCwgIlJlY2lwZSBwYXJzaW5nIENvbXBsZXRlZCIpCisgICAgICAgIHNlbGYuY2FjaGVkID0gY2FjaGVkCisgICAgICAgIHNlbGYucGFyc2VkID0gcGFyc2VkCisgICAgICAgIHNlbGYuc2tpcHBlZCA9IHNraXBwZWQKKyAgICAgICAgc2VsZi52aXJ0dWFscyA9IHZpcnR1YWxzCisgICAgICAgIHNlbGYubWFza2VkID0gbWFza2VkCisgICAgICAgIHNlbGYuZXJyb3JzID0gZXJyb3JzCisgICAgICAgIHNlbGYuc29mYXIgPSBjYWNoZWQgKyBwYXJzZWQKKworY2xhc3MgUGFyc2VQcm9ncmVzcyhPcGVyYXRpb25Qcm9ncmVzcyk6CisgICAgIiIiUmVjaXBlIHBhcnNpbmcgcHJvZ3Jlc3MiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY3VycmVudCwgdG90YWwpOgorICAgICAgICBPcGVyYXRpb25Qcm9ncmVzcy5fX2luaXRfXyhzZWxmLCBjdXJyZW50LCB0b3RhbCwgIlJlY2lwZSBwYXJzaW5nIikKKworCitjbGFzcyBDYWNoZUxvYWRTdGFydGVkKE9wZXJhdGlvblN0YXJ0ZWQpOgorICAgICIiIkxvYWRpbmcgb2YgdGhlIGRlcGVuZGVuY3kgY2FjaGUgaGFzIGJlZ3VuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRvdGFsKToKKyAgICAgICAgT3BlcmF0aW9uU3RhcnRlZC5fX2luaXRfXyhzZWxmLCAiTG9hZGluZyBjYWNoZSBTdGFydGVkIikKKyAgICAgICAgc2VsZi50b3RhbCA9IHRvdGFsCisKK2NsYXNzIENhY2hlTG9hZFByb2dyZXNzKE9wZXJhdGlvblByb2dyZXNzKToKKyAgICAiIiJDYWNoZSBsb2FkaW5nIHByb2dyZXNzIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGN1cnJlbnQsIHRvdGFsKToKKyAgICAgICAgT3BlcmF0aW9uUHJvZ3Jlc3MuX19pbml0X18oc2VsZiwgY3VycmVudCwgdG90YWwsICJMb2FkaW5nIGNhY2hlIikKKworY2xhc3MgQ2FjaGVMb2FkQ29tcGxldGVkKE9wZXJhdGlvbkNvbXBsZXRlZCk6CisgICAgIiIiQ2FjaGUgbG9hZGluZyBpcyBjb21wbGV0ZSIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0b3RhbCwgbnVtX2VudHJpZXMpOgorICAgICAgICBPcGVyYXRpb25Db21wbGV0ZWQuX19pbml0X18oc2VsZiwgdG90YWwsICJMb2FkaW5nIGNhY2hlIENvbXBsZXRlZCIpCisgICAgICAgIHNlbGYubnVtX2VudHJpZXMgPSBudW1fZW50cmllcworCitjbGFzcyBUcmVlRGF0YVByZXBhcmF0aW9uU3RhcnRlZChPcGVyYXRpb25TdGFydGVkKToKKyAgICAiIiJUcmVlIGRhdGEgcHJlcGFyYXRpb24gc3RhcnRlZCIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgT3BlcmF0aW9uU3RhcnRlZC5fX2luaXRfXyhzZWxmLCAiUHJlcGFyaW5nIHRyZWUgZGF0YSBTdGFydGVkIikKKworY2xhc3MgVHJlZURhdGFQcmVwYXJhdGlvblByb2dyZXNzKE9wZXJhdGlvblByb2dyZXNzKToKKyAgICAiIiJUcmVlIGRhdGEgcHJlcGFyYXRpb24gaXMgaW4gcHJvZ3Jlc3MiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY3VycmVudCwgdG90YWwpOgorICAgICAgICBPcGVyYXRpb25Qcm9ncmVzcy5fX2luaXRfXyhzZWxmLCBjdXJyZW50LCB0b3RhbCwgIlByZXBhcmluZyB0cmVlIGRhdGEiKQorCitjbGFzcyBUcmVlRGF0YVByZXBhcmF0aW9uQ29tcGxldGVkKE9wZXJhdGlvbkNvbXBsZXRlZCk6CisgICAgIiIiVHJlZSBkYXRhIHByZXBhcmF0aW9uIGNvbXBsZXRlZCIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0b3RhbCk6CisgICAgICAgIE9wZXJhdGlvbkNvbXBsZXRlZC5fX2luaXRfXyhzZWxmLCB0b3RhbCwgIlByZXBhcmluZyB0cmVlIGRhdGEgQ29tcGxldGVkIikKKworY2xhc3MgRGVwVHJlZUdlbmVyYXRlZChFdmVudCk6CisgICAgIiIiCisgICAgRXZlbnQgd2hlbiBhIGRlcGVuZGVuY3kgdHJlZSBoYXMgYmVlbiBnZW5lcmF0ZWQKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkZXBncmFwaCk6CisgICAgICAgIEV2ZW50Ll9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuX2RlcGdyYXBoID0gZGVwZ3JhcGgKKworY2xhc3MgVGFyZ2V0c1RyZWVHZW5lcmF0ZWQoRXZlbnQpOgorICAgICIiIgorICAgIEV2ZW50IHdoZW4gYSBzZXQgb2YgYnVpbGRhYmxlIHRhcmdldHMgaGFzIGJlZW4gZ2VuZXJhdGVkCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZGVsKToKKyAgICAgICAgRXZlbnQuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5fbW9kZWwgPSBtb2RlbAorCitjbGFzcyBSZWFjaGFibGVTdGFtcHMoRXZlbnQpOgorICAgICIiIgorICAgIEFuIGV2ZW50IGxpc3RpbmcgYWxsIHN0YW1wcyByZWFjaGFibGUgYWZ0ZXIgcGFyc2luZworICAgIHdoaWNoIHRoZSBtZXRhZGF0YSBtYXkgdXNlIHRvIGNsZWFuIHVwIHN0YWxlIGRhdGEKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdGFtcHMpOgorICAgICAgICBFdmVudC5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLnN0YW1wcyA9IHN0YW1wcworCitjbGFzcyBGaWxlc01hdGNoaW5nRm91bmQoRXZlbnQpOgorICAgICIiIgorICAgIEV2ZW50IHdoZW4gYSBsaXN0IG9mIGZpbGVzIG1hdGNoaW5nIHRoZSBzdXBwbGllZCBwYXR0ZXJuIGhhcworICAgIGJlZW4gZ2VuZXJhdGVkCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdHRlcm4sIG1hdGNoZXMpOgorICAgICAgICBFdmVudC5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLl9wYXR0ZXJuID0gcGF0dGVybgorICAgICAgICBzZWxmLl9tYXRjaGVzID0gbWF0Y2hlcworCitjbGFzcyBDb3JlQmFzZUZpbGVzRm91bmQoRXZlbnQpOgorICAgICIiIgorICAgIEV2ZW50IHdoZW4gYSBsaXN0IG9mIGFwcHJvcHJpYXRlIGNvbmZpZyBmaWxlcyBoYXMgYmVlbiBnZW5lcmF0ZWQKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aHMpOgorICAgICAgICBFdmVudC5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLl9wYXRocyA9IHBhdGhzCisKK2NsYXNzIENvbmZpZ0ZpbGVzRm91bmQoRXZlbnQpOgorICAgICIiIgorICAgIEV2ZW50IHdoZW4gYSBsaXN0IG9mIGFwcHJvcHJpYXRlIGNvbmZpZyBmaWxlcyBoYXMgYmVlbiBnZW5lcmF0ZWQKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdmFyaWFibGUsIHZhbHVlcyk6CisgICAgICAgIEV2ZW50Ll9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuX3ZhcmlhYmxlID0gdmFyaWFibGUKKyAgICAgICAgc2VsZi5fdmFsdWVzID0gdmFsdWVzCisKK2NsYXNzIENvbmZpZ0ZpbGVQYXRoRm91bmQoRXZlbnQpOgorICAgICIiIgorICAgIEV2ZW50IHdoZW4gYSBwYXRoIGZvciBhIGNvbmZpZyBmaWxlIGhhcyBiZWVuIGZvdW5kCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgpOgorICAgICAgICBFdmVudC5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLl9wYXRoID0gcGF0aAorCitjbGFzcyBNc2dCYXNlKEV2ZW50KToKKyAgICAiIiJCYXNlIGNsYXNzIGZvciBtZXNzYWdlcyIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1zZyk6CisgICAgICAgIHNlbGYuX21lc3NhZ2UgPSBtc2cKKyAgICAgICAgRXZlbnQuX19pbml0X18oc2VsZikKKworY2xhc3MgTXNnRGVidWcoTXNnQmFzZSk6CisgICAgIiIiRGVidWcgTWVzc2FnZSIiIgorCitjbGFzcyBNc2dOb3RlKE1zZ0Jhc2UpOgorICAgICIiIk5vdGUgTWVzc2FnZSIiIgorCitjbGFzcyBNc2dXYXJuKE1zZ0Jhc2UpOgorICAgICIiIldhcm5pbmcgTWVzc2FnZSIiIgorCitjbGFzcyBNc2dFcnJvcihNc2dCYXNlKToKKyAgICAiIiJFcnJvciBNZXNzYWdlIiIiCisKK2NsYXNzIE1zZ0ZhdGFsKE1zZ0Jhc2UpOgorICAgICIiIkZhdGFsIE1lc3NhZ2UiIiIKKworY2xhc3MgTXNnUGxhaW4oTXNnQmFzZSk6CisgICAgIiIiR2VuZXJhbCBvdXRwdXQiIiIKKworY2xhc3MgTG9nRXhlY1RUWShFdmVudCk6CisgICAgIiIiU2VuZCBldmVudCBjb250YWluaW5nIHByb2dyYW0gdG8gc3Bhd24gb24gdHR5IG9mIHRoZSBsb2dnZXIiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbXNnLCBwcm9nLCBzbGVlcF9kZWxheSwgcmV0cmllcyk6CisgICAgICAgIEV2ZW50Ll9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYubXNnID0gbXNnCisgICAgICAgIHNlbGYucHJvZyA9IHByb2cKKyAgICAgICAgc2VsZi5zbGVlcF9kZWxheSA9IHNsZWVwX2RlbGF5CisgICAgICAgIHNlbGYucmV0cmllcyA9IHJldHJpZXMKKworY2xhc3MgTG9nSGFuZGxlcihsb2dnaW5nLkhhbmRsZXIpOgorICAgICIiIkRpc3BhdGNoIGxvZ2dpbmcgbWVzc2FnZXMgYXMgYml0YmFrZSBldmVudHMiIiIKKworICAgIGRlZiBlbWl0KHNlbGYsIHJlY29yZCk6CisgICAgICAgIGlmIHJlY29yZC5leGNfaW5mbzoKKyAgICAgICAgICAgIGV0eXBlLCB2YWx1ZSwgdGIgPSByZWNvcmQuZXhjX2luZm8KKyAgICAgICAgICAgIGlmIGhhc2F0dHIodGIsICd0Yl9uZXh0Jyk6CisgICAgICAgICAgICAgICAgdGIgPSBsaXN0KGJiLmV4Y2VwdGlvbnMuZXh0cmFjdF90cmFjZWJhY2sodGIsIGNvbnRleHQ9MykpCisgICAgICAgICAgICByZWNvcmQuYmJfZXhjX2luZm8gPSAoZXR5cGUsIHZhbHVlLCB0YikKKyAgICAgICAgICAgIHJlY29yZC5leGNfaW5mbyA9IE5vbmUKKyAgICAgICAgZmlyZShyZWNvcmQsIE5vbmUpCisKKyAgICBkZWYgZmlsdGVyKHNlbGYsIHJlY29yZCk6CisgICAgICAgIHJlY29yZC50YXNrcGlkID0gd29ya2VyX3BpZAorICAgICAgICByZXR1cm4gVHJ1ZQorCitjbGFzcyBSZXF1ZXN0UGFja2FnZUluZm8oRXZlbnQpOgorICAgICIiIgorICAgIEV2ZW50IHRvIHJlcXVlc3QgcGFja2FnZSBpbmZvcm1hdGlvbgorICAgICIiIgorCitjbGFzcyBQYWNrYWdlSW5mbyhFdmVudCk6CisgICAgIiIiCisgICAgUGFja2FnZSBpbmZvcm1hdGlvbiBmb3IgR1VJCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBrZ2luZm9saXN0KToKKyAgICAgICAgRXZlbnQuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5fcGtnaW5mb2xpc3QgPSBwa2dpbmZvbGlzdAorCitjbGFzcyBNZXRhZGF0YUV2ZW50KEV2ZW50KToKKyAgICAiIiIKKyAgICBHZW5lcmljIGV2ZW50IHRoYXQgdGFyZ2V0IGZvciBPRS1Db3JlIGNsYXNzZXMKKyAgICB0byByZXBvcnQgaW5mb3JtYXRpb24gZHVyaW5nIGFzeW5jaHJvdXMgZXhlY3V0aW9uCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGV2ZW50dHlwZSwgZXZlbnRkYXRhKToKKyAgICAgICAgRXZlbnQuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi50eXBlID0gZXZlbnR0eXBlCisgICAgICAgIHNlbGYuX2xvY2FsZGF0YSA9IGV2ZW50ZGF0YQorCitjbGFzcyBTYW5pdHlDaGVjayhFdmVudCk6CisgICAgIiIiCisgICAgRXZlbnQgdG8gcnVuIHNhbml0eSBjaGVja3MsIGVpdGhlciByYWlzZSBlcnJvcnMgb3IgZ2VuZXJhdGUgZXZlbnRzIGFzIHJldHVybiBzdGF0dXMuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGdlbmVyYXRlZXZlbnRzID0gVHJ1ZSk6CisgICAgICAgIEV2ZW50Ll9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuZ2VuZXJhdGVldmVudHMgPSBnZW5lcmF0ZWV2ZW50cworCitjbGFzcyBTYW5pdHlDaGVja1Bhc3NlZChFdmVudCk6CisgICAgIiIiCisgICAgRXZlbnQgdG8gaW5kaWNhdGUgc2FuaXR5IGNoZWNrIGhhcyBwYXNzZWQKKyAgICAiIiIKKworY2xhc3MgU2FuaXR5Q2hlY2tGYWlsZWQoRXZlbnQpOgorICAgICIiIgorICAgIEV2ZW50IHRvIGluZGljYXRlIHNhbml0eSBjaGVjayBoYXMgZmFpbGVkCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1zZywgbmV0d29ya19lcnJvcj1GYWxzZSk6CisgICAgICAgIEV2ZW50Ll9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuX21zZyA9IG1zZworICAgICAgICBzZWxmLl9uZXR3b3JrX2Vycm9yID0gbmV0d29ya19lcnJvcgorCitjbGFzcyBOZXR3b3JrVGVzdChFdmVudCk6CisgICAgIiIiCisgICAgRXZlbnQgdG8gcnVuIG5ldHdvcmsgY29ubmVjdGl2aXR5IHRlc3RzLCBlaXRoZXIgcmFpc2UgZXJyb3JzIG9yIGdlbmVyYXRlIGV2ZW50cyBhcyByZXR1cm4gc3RhdHVzLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBnZW5lcmF0ZWV2ZW50cyA9IFRydWUpOgorICAgICAgICBFdmVudC5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLmdlbmVyYXRlZXZlbnRzID0gZ2VuZXJhdGVldmVudHMKKworY2xhc3MgTmV0d29ya1Rlc3RQYXNzZWQoRXZlbnQpOgorICAgICIiIgorICAgIEV2ZW50IHRvIGluZGljYXRlIG5ldHdvcmsgdGVzdCBoYXMgcGFzc2VkCisgICAgIiIiCisKK2NsYXNzIE5ldHdvcmtUZXN0RmFpbGVkKEV2ZW50KToKKyAgICAiIiIKKyAgICBFdmVudCB0byBpbmRpY2F0ZSBuZXR3b3JrIHRlc3QgaGFzIGZhaWxlZAorICAgICIiIgorCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9leGNlcHRpb25zLnB5IGIvYml0YmFrZS9saWIvYmIvZXhjZXB0aW9ucy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTgyYzhmCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvZXhjZXB0aW9ucy5weQpAQCAtMCwwICsxLDkxIEBACitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoraW1wb3J0IGluc3BlY3QKK2ltcG9ydCB0cmFjZWJhY2sKK2ltcG9ydCBiYi5uYW1lZHR1cGxlX3dpdGhfYWJjCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBuYW1lZHR1cGxlCisKKworY2xhc3MgVHJhY2ViYWNrRW50cnkobmFtZWR0dXBsZS5hYmMpOgorICAgICIiIlBpY2tsZWFibGUgcmVwcmVzZW50YXRpb24gb2YgYSB0cmFjZWJhY2sgZW50cnkiIiIKKyAgICBfZmllbGRzID0gJ2ZpbGVuYW1lIGxpbmVubyBmdW5jdGlvbiBhcmdzIGNvZGVfY29udGV4dCBpbmRleCcKKyAgICBfaGVhZGVyID0gJyAgRmlsZSAiezAuZmlsZW5hbWV9IiwgbGluZSB7MC5saW5lbm99LCBpbiB7MC5mdW5jdGlvbn17MC5hcmdzfScKKworICAgIGRlZiBmb3JtYXQoc2VsZiwgZm9ybWF0dGVyPU5vbmUpOgorICAgICAgICBpZiBub3Qgc2VsZi5jb2RlX2NvbnRleHQ6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5faGVhZGVyLmZvcm1hdChzZWxmKSArICdcbicKKworICAgICAgICBmb3JtYXR0ZWQgPSBbc2VsZi5faGVhZGVyLmZvcm1hdChzZWxmKSArICc6XG4nXQorCisgICAgICAgIGZvciBsaW5laW5kZXgsIGxpbmUgaW4gZW51bWVyYXRlKHNlbGYuY29kZV9jb250ZXh0KToKKyAgICAgICAgICAgIGlmIGZvcm1hdHRlcjoKKyAgICAgICAgICAgICAgICBsaW5lID0gZm9ybWF0dGVyKGxpbmUpCisKKyAgICAgICAgICAgIGlmIGxpbmVpbmRleCA9PSBzZWxmLmluZGV4OgorICAgICAgICAgICAgICAgIGZvcm1hdHRlZC5hcHBlbmQoJyAgICA+JXMnICUgbGluZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZm9ybWF0dGVkLmFwcGVuZCgnICAgICAlcycgJSBsaW5lKQorICAgICAgICByZXR1cm4gZm9ybWF0dGVkCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICcnLmpvaW4oc2VsZi5mb3JtYXQoKSkKKworZGVmIF9nZXRfZnJhbWVfYXJncyhmcmFtZSk6CisgICAgIiIiR2V0IHRoZSBmb3JtYXR0ZWQgYXJndW1lbnRzIGFuZCBjbGFzcyAoaWYgYXZhaWxhYmxlKSBmb3IgYSBmcmFtZSIiIgorICAgIGFyZ2luZm8gPSBpbnNwZWN0LmdldGFyZ3ZhbHVlcyhmcmFtZSkKKworICAgIHRyeToKKyAgICAgICAgaWYgbm90IGFyZ2luZm8uYXJnczoKKyAgICAgICAgICAgIHJldHVybiAnJywgTm9uZQorICAgICMgVGhlcmUgaGF2ZSBiZWVuIHJlcG9ydHMgZnJvbSB0aGUgZmllbGQgb2YgcHl0aG9uIDIuNiB3aGljaCBkb2Vzbid0IAorICAgICMgcmV0dXJuIGEgbmFtZWR0dXBsZSBoZXJlIGJ1dCBzaW1wbHkgYSB0dXBsZSBzbyBmYWxsYmFjayBncmFjZWZ1bGx5IGlmCisgICAgIyBhcmdzIGlzbid0IHByZXNlbnQuCisgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICByZXR1cm4gJycsIE5vbmUKKworICAgIGZpcnN0YXJnID0gYXJnaW5mby5hcmdzWzBdCisgICAgaWYgZmlyc3RhcmcgPT0gJ3NlbGYnOgorICAgICAgICBzZWxmID0gYXJnaW5mby5sb2NhbHNbJ3NlbGYnXQorICAgICAgICBjbHMgPSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworCisgICAgICAgIGFyZ2luZm8uYXJncy5wb3AoMCkKKyAgICAgICAgZGVsIGFyZ2luZm8ubG9jYWxzWydzZWxmJ10KKyAgICBlbHNlOgorICAgICAgICBjbHMgPSBOb25lCisKKyAgICBmb3JtYXR0ZWQgPSBpbnNwZWN0LmZvcm1hdGFyZ3ZhbHVlcygqYXJnaW5mbykKKyAgICByZXR1cm4gZm9ybWF0dGVkLCBjbHMKKworZGVmIGV4dHJhY3RfdHJhY2ViYWNrKHRiLCBjb250ZXh0PTEpOgorICAgIGZyYW1lcyA9IGluc3BlY3QuZ2V0aW5uZXJmcmFtZXModGIsIGNvbnRleHQpCisgICAgZm9yIGZyYW1lLCBmaWxlbmFtZSwgbGluZW5vLCBmdW5jdGlvbiwgY29kZV9jb250ZXh0LCBpbmRleCBpbiBmcmFtZXM6CisgICAgICAgIGZvcm1hdHRlZF9hcmdzLCBjbHMgPSBfZ2V0X2ZyYW1lX2FyZ3MoZnJhbWUpCisgICAgICAgIGlmIGNsczoKKyAgICAgICAgICAgIGZ1bmN0aW9uID0gJyVzLiVzJyAlIChjbHMsIGZ1bmN0aW9uKQorICAgICAgICB5aWVsZCBUcmFjZWJhY2tFbnRyeShmaWxlbmFtZSwgbGluZW5vLCBmdW5jdGlvbiwgZm9ybWF0dGVkX2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfY29udGV4dCwgaW5kZXgpCisKK2RlZiBmb3JtYXRfZXh0cmFjdGVkKGV4dHJhY3RlZCwgZm9ybWF0dGVyPU5vbmUsIGxpbWl0PU5vbmUpOgorICAgIGlmIGxpbWl0OgorICAgICAgICBleHRyYWN0ZWQgPSBleHRyYWN0ZWRbLWxpbWl0Ol0KKworICAgIGZvcm1hdHRlZCA9IFtdCisgICAgZm9yIHRyYWNlYmFja2luZm8gaW4gZXh0cmFjdGVkOgorICAgICAgICBmb3JtYXR0ZWQuZXh0ZW5kKHRyYWNlYmFja2luZm8uZm9ybWF0KGZvcm1hdHRlcikpCisgICAgcmV0dXJuIGZvcm1hdHRlZAorCisKK2RlZiBmb3JtYXRfZXhjZXB0aW9uKGV0eXBlLCB2YWx1ZSwgdGIsIGNvbnRleHQ9MSwgbGltaXQ9Tm9uZSwgZm9ybWF0dGVyPU5vbmUpOgorICAgIGZvcm1hdHRlZCA9IFsnVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOlxuJ10KKworICAgIGlmIGhhc2F0dHIodGIsICd0Yl9uZXh0Jyk6CisgICAgICAgIHRiID0gZXh0cmFjdF90cmFjZWJhY2sodGIsIGNvbnRleHQpCisKKyAgICBmb3JtYXR0ZWQuZXh0ZW5kKGZvcm1hdF9leHRyYWN0ZWQodGIsIGZvcm1hdHRlciwgbGltaXQpKQorICAgIGZvcm1hdHRlZC5leHRlbmQodHJhY2ViYWNrLmZvcm1hdF9leGNlcHRpb25fb25seShldHlwZSwgdmFsdWUpKQorICAgIHJldHVybiBmb3JtYXR0ZWQKKworZGVmIHRvX3N0cmluZyhleGMpOgorICAgIGlmIGlzaW5zdGFuY2UoZXhjLCBTeXN0ZW1FeGl0KToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZXhjLmNvZGUsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgcmV0dXJuICdFeGl0ZWQgd2l0aCAiJWQiJyAlIGV4Yy5jb2RlCisgICAgcmV0dXJuIHN0cihleGMpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvX19pbml0X18ucHkgYi9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q1M2I2MwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL2ZldGNoMi9fX2luaXRfXy5weQpAQCAtMCwwICsxLDE3ODcgQEAKKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisiIiIKK0JpdEJha2UgJ0ZldGNoJyBpbXBsZW1lbnRhdGlvbnMKKworQ2xhc3NlcyBmb3Igb2J0YWluaW5nIHVwc3RyZWFtIHNvdXJjZXMgZm9yIHRoZQorQml0QmFrZSBidWlsZCB0b29scy4KKyIiIgorCisjIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCAgQ2hyaXMgTGFyc29uCisjIENvcHlyaWdodCAoQykgMjAxMiAgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisjCisjIEJhc2VkIG9uIGZ1bmN0aW9ucyBmcm9tIHRoZSBiYXNlIGJiIG1vZHVsZSwgQ29weXJpZ2h0IDIwMDMgSG9sZ2VyIFNjaHVyaWcKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KK2ltcG9ydCBvcywgcmUKK2ltcG9ydCBzaWduYWwKK2ltcG9ydCBnbG9iCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IHVybGxpYgoraW1wb3J0IHVybHBhcnNlCitpbXBvcnQgb3BlcmF0b3IKK2ltcG9ydCBiYi5wZXJzaXN0X2RhdGEsIGJiLnV0aWxzCitpbXBvcnQgYmIuY2hlY2tzdW0KK2Zyb20gYmIgaW1wb3J0IGRhdGEKK2ltcG9ydCBiYi5wcm9jZXNzCitpbXBvcnQgc3VicHJvY2VzcworCitfX3ZlcnNpb25fXyA9ICIyIgorX2NoZWNrc3VtX2NhY2hlID0gYmIuY2hlY2tzdW0uRmlsZUNoZWNrc3VtQ2FjaGUoKQorCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiQml0QmFrZS5GZXRjaGVyIikKKwordHJ5OgorICAgIGltcG9ydCBjUGlja2xlIGFzIHBpY2tsZQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGltcG9ydCBwaWNrbGUKKyAgICBsb2dnZXIuaW5mbygiSW1wb3J0aW5nIGNQaWNrbGUgZmFpbGVkLiAiCisgICAgICAgICAgICAgICAgIkZhbGxpbmcgYmFjayB0byBhIHZlcnkgc2xvdyBpbXBsZW1lbnRhdGlvbi4iKQorCitjbGFzcyBCQkZldGNoRXhjZXB0aW9uKEV4Y2VwdGlvbik6CisgICAgIiIiQ2xhc3MgYWxsIGZldGNoIGV4Y2VwdGlvbnMgaW5oZXJpdCBmcm9tIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICAgc2VsZi5tc2cgPSBtZXNzYWdlCisgICAgICAgICBFeGNlcHRpb24uX19pbml0X18oc2VsZiwgbWVzc2FnZSkKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAgcmV0dXJuIHNlbGYubXNnCisKK2NsYXNzIFVudHJ1c3RlZFVybChCQkZldGNoRXhjZXB0aW9uKToKKyAgICAiIiJFeGNlcHRpb24gcmFpc2VkIHdoZW4gZW5jb3VudGVyaW5nIGEgaG9zdCBub3QgbGlzdGVkIGluIEJCX0FMTE9XRURfTkVUV09SS1MiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdXJsLCBtZXNzYWdlPScnKToKKyAgICAgICAgaWYgbWVzc2FnZToKKyAgICAgICAgICAgIG1zZyA9IG1lc3NhZ2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1zZyA9ICJUaGUgVVJMOiAnJXMnIGlzIG5vdCB0cnVzdGVkIGFuZCBjYW5ub3QgYmUgdXNlZCIgJSB1cmwKKyAgICAgICAgc2VsZi51cmwgPSB1cmwKKyAgICAgICAgQkJGZXRjaEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBtc2cpCisgICAgICAgIHNlbGYuYXJncyA9ICh1cmwsKQorCitjbGFzcyBNYWxmb3JtZWRVcmwoQkJGZXRjaEV4Y2VwdGlvbik6CisgICAgIiIiRXhjZXB0aW9uIHJhaXNlZCB3aGVuIGVuY291bnRlcmluZyBhbiBpbnZhbGlkIHVybCIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1cmwsIG1lc3NhZ2U9JycpOgorICAgICAgICAgaWYgbWVzc2FnZToKKyAgICAgICAgICAgICBtc2cgPSBtZXNzYWdlCisgICAgICAgICBlbHNlOgorICAgICAgICAgICAgIG1zZyA9ICJUaGUgVVJMOiAnJXMnIGlzIGludmFsaWQgYW5kIGNhbm5vdCBiZSBpbnRlcnByZXRlZCIgJSB1cmwKKyAgICAgICAgIHNlbGYudXJsID0gdXJsCisgICAgICAgICBCQkZldGNoRXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsIG1zZykKKyAgICAgICAgIHNlbGYuYXJncyA9ICh1cmwsKQorCitjbGFzcyBGZXRjaEVycm9yKEJCRmV0Y2hFeGNlcHRpb24pOgorICAgICIiIkdlbmVyYWwgZmV0Y2hlciBleGNlcHRpb24gd2hlbiBzb21ldGhpbmcgaGFwcGVucyBpbmNvcnJlY3RseSIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlLCB1cmwgPSBOb25lKToKKyAgICAgICAgIGlmIHVybDoKKyAgICAgICAgICAgIG1zZyA9ICJGZXRjaGVyIGZhaWx1cmUgZm9yIFVSTDogJyVzJy4gJXMiICUgKHVybCwgbWVzc2FnZSkKKyAgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtc2cgPSAiRmV0Y2hlciBmYWlsdXJlOiAlcyIgJSBtZXNzYWdlCisgICAgICAgICBzZWxmLnVybCA9IHVybAorICAgICAgICAgQkJGZXRjaEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBtc2cpCisgICAgICAgICBzZWxmLmFyZ3MgPSAobWVzc2FnZSwgdXJsKQorCitjbGFzcyBDaGVja3N1bUVycm9yKEZldGNoRXJyb3IpOgorICAgICIiIkV4Y2VwdGlvbiB3aGVuIG1pc21hdGNoZWQgY2hlY2tzdW0gZW5jb3VudGVyZWQiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWVzc2FnZSwgdXJsID0gTm9uZSwgY2hlY2tzdW0gPSBOb25lKToKKyAgICAgICAgc2VsZi5jaGVja3N1bSA9IGNoZWNrc3VtCisgICAgICAgIEZldGNoRXJyb3IuX19pbml0X18oc2VsZiwgbWVzc2FnZSwgdXJsKQorCitjbGFzcyBOb0NoZWNrc3VtRXJyb3IoRmV0Y2hFcnJvcik6CisgICAgIiIiRXhjZXB0aW9uIHdoZW4gbm8gY2hlY2tzdW0gaXMgc3BlY2lmaWVkLCBidXQgQkJfU1RSSUNUX0NIRUNLU1VNIGlzIHNldCIiIgorCitjbGFzcyBVbnBhY2tFcnJvcihCQkZldGNoRXhjZXB0aW9uKToKKyAgICAiIiJHZW5lcmFsIGZldGNoZXIgZXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIGhhcHBlbnMgaW5jb3JyZWN0bHkgd2hlbiB1bnBhY2tpbmciIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWVzc2FnZSwgdXJsKToKKyAgICAgICAgIG1zZyA9ICJVbnBhY2sgZmFpbHVyZSBmb3IgVVJMOiAnJXMnLiAlcyIgJSAodXJsLCBtZXNzYWdlKQorICAgICAgICAgc2VsZi51cmwgPSB1cmwKKyAgICAgICAgIEJCRmV0Y2hFeGNlcHRpb24uX19pbml0X18oc2VsZiwgbXNnKQorICAgICAgICAgc2VsZi5hcmdzID0gKG1lc3NhZ2UsIHVybCkKKworY2xhc3MgTm9NZXRob2RFcnJvcihCQkZldGNoRXhjZXB0aW9uKToKKyAgICAiIiJFeGNlcHRpb24gcmFpc2VkIHdoZW4gdGhlcmUgaXMgbm8gbWV0aG9kIHRvIG9idGFpbiBhIHN1cHBsaWVkIHVybCBvciBzZXQgb2YgdXJscyIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1cmwpOgorICAgICAgICAgbXNnID0gIkNvdWxkIG5vdCBmaW5kIGEgZmV0Y2hlciB3aGljaCBzdXBwb3J0cyB0aGUgVVJMOiAnJXMnIiAlIHVybAorICAgICAgICAgc2VsZi51cmwgPSB1cmwKKyAgICAgICAgIEJCRmV0Y2hFeGNlcHRpb24uX19pbml0X18oc2VsZiwgbXNnKQorICAgICAgICAgc2VsZi5hcmdzID0gKHVybCwpCisKK2NsYXNzIE1pc3NpbmdQYXJhbWV0ZXJFcnJvcihCQkZldGNoRXhjZXB0aW9uKToKKyAgICAiIiJFeGNlcHRpb24gcmFpc2VkIHdoZW4gYSBmZXRjaCBtZXRob2QgaXMgbWlzc2luZyBhIGNyaXRpY2FsIHBhcmFtZXRlciBpbiB0aGUgdXJsIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1pc3NpbmcsIHVybCk6CisgICAgICAgICBtc2cgPSAiVVJMOiAnJXMnIGlzIG1pc3NpbmcgdGhlIHJlcXVpcmVkIHBhcmFtZXRlciAnJXMnIiAlICh1cmwsIG1pc3NpbmcpCisgICAgICAgICBzZWxmLnVybCA9IHVybAorICAgICAgICAgc2VsZi5taXNzaW5nID0gbWlzc2luZworICAgICAgICAgQkJGZXRjaEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBtc2cpCisgICAgICAgICBzZWxmLmFyZ3MgPSAobWlzc2luZywgdXJsKQorCitjbGFzcyBQYXJhbWV0ZXJFcnJvcihCQkZldGNoRXhjZXB0aW9uKToKKyAgICAiIiJFeGNlcHRpb24gcmFpc2VkIHdoZW4gYSB1cmwgY2Fubm90IGJlIHByb2NjZXNzZWQgZHVlIHRvIGludmFsaWQgcGFyYW1ldGVycy4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWVzc2FnZSwgdXJsKToKKyAgICAgICAgIG1zZyA9ICJVUkw6ICclcycgaGFzIGludmFsaWQgcGFyYW1ldGVycy4gJXMiICUgKHVybCwgbWVzc2FnZSkKKyAgICAgICAgIHNlbGYudXJsID0gdXJsCisgICAgICAgICBCQkZldGNoRXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsIG1zZykKKyAgICAgICAgIHNlbGYuYXJncyA9IChtZXNzYWdlLCB1cmwpCisKK2NsYXNzIE5ldHdvcmtBY2Nlc3MoQkJGZXRjaEV4Y2VwdGlvbik6CisgICAgIiIiRXhjZXB0aW9uIHJhaXNlZCB3aGVuIG5ldHdvcmsgYWNjZXNzIGlzIGRpc2FibGVkIGJ1dCBpdCBpcyByZXF1aXJlZC4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdXJsLCBjbWQpOgorICAgICAgICAgbXNnID0gIk5ldHdvcmsgYWNjZXNzIGRpc2FibGVkIHRocm91Z2ggQkJfTk9fTkVUV09SSyAob3Igc2V0IGluZGlyZWN0bHkgZHVlIHRvIHVzZSBvZiBCQl9GRVRDSF9QUkVNSVJST1JPTkxZKSBidXQgYWNjZXNzIHJlcXVlc3RlZCB3aXRoIGNvbW1hbmQgJXMgKGZvciB1cmwgJXMpIiAlIChjbWQsIHVybCkKKyAgICAgICAgIHNlbGYudXJsID0gdXJsCisgICAgICAgICBzZWxmLmNtZCA9IGNtZAorICAgICAgICAgQkJGZXRjaEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBtc2cpCisgICAgICAgICBzZWxmLmFyZ3MgPSAodXJsLCBjbWQpCisKK2NsYXNzIE5vbkxvY2FsTWV0aG9kKEV4Y2VwdGlvbik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBFeGNlcHRpb24uX19pbml0X18oc2VsZikKKworCitjbGFzcyBVUkkob2JqZWN0KToKKyAgICAiIiIKKyAgICBBIGNsYXNzIHJlcHJlc2VudGluZyBhIGdlbmVyaWMgVVJJLCB3aXRoIG1ldGhvZHMgZm9yCisgICAgYWNjZXNzaW5nIHRoZSBVUkkgY29tcG9uZW50cywgYW5kIHN0cmluZ2lmaWVzIHRvIHRoZQorICAgIFVSSS4KKworICAgIEl0IGlzIGNvbnN0cnVjdGVkIGJ5IGNhbGxpbmcgaXQgd2l0aCBhIFVSSSwgb3Igc2V0dGluZworICAgIHRoZSBhdHRyaWJ1dGVzIG1hbnVhbGx5OgorCisgICAgIHVyaSA9IFVSSSgiaHR0cDovL2V4YW1wbGUuY29tLyIpCisKKyAgICAgdXJpID0gVVJJKCkKKyAgICAgdXJpLnNjaGVtZSA9ICdodHRwJworICAgICB1cmkuaG9zdG5hbWUgPSAnZXhhbXBsZS5jb20nCisgICAgIHVyaS5wYXRoID0gJy8nCisKKyAgICBJdCBoYXMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgorCisgICAgICAqIHNjaGVtZSAocmVhZC93cml0ZSkKKyAgICAgICogdXNlcmluZm8gKGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uKSAocmVhZC93cml0ZSkKKyAgICAgICAgKiB1c2VybmFtZSAocmVhZC93cml0ZSkKKyAgICAgICAgKiBwYXNzd29yZCAocmVhZC93cml0ZSkKKworICAgICAgICBOb3RlLCBwYXNzd29yZCBpcyBkZXByZWNhdGVkIGFzIG9mIFJGQyAzOTg2LgorCisgICAgICAqIGhvc3RuYW1lIChyZWFkL3dyaXRlKQorICAgICAgKiBwb3J0IChyZWFkL3dyaXRlKQorICAgICAgKiBob3N0cG9ydCAocmVhZCBvbmx5KQorICAgICAgICAiaG9zdG5hbWU6cG9ydCIsIGlmIGJvdGggYXJlIHNldCwgb3RoZXJ3aXNlIGp1c3QgImhvc3RuYW1lIgorICAgICAgKiBwYXRoIChyZWFkL3dyaXRlKQorICAgICAgKiBwYXRoX3F1b3RlZCAocmVhZC93cml0ZSkKKyAgICAgICAgQSBVUkkgcXVvdGVkIHZlcnNpb24gb2YgcGF0aAorICAgICAgKiBwYXJhbXMgKGRpY3QpIChyZWFkL3dyaXRlKQorICAgICAgKiBxdWVyeSAoZGljdCkgKHJlYWQvd3JpdGUpCisgICAgICAqIHJlbGF0aXZlIChib29sKSAocmVhZCBvbmx5KQorICAgICAgICBUcnVlIGlmIHRoaXMgaXMgYSAicmVsYXRpdmUgVVJJIiwgKGUuZy4gZmlsZTpmb28uZGlmZikKKworICAgIEl0IHN0cmluZ2lmaWVzIHRvIHRoZSBVUkkgaXRzZWxmLgorCisgICAgU29tZSBub3RlcyBhYm91dCByZWxhdGl2ZSBVUklzOiB3aGlsZSBpdCdzIHNwZWNpZmllZCB0aGF0CisgICAgYSBVUkkgYmVnaW5uaW5nIHdpdGggPHNjaGVtZT46Ly8gc2hvdWxkIGVpdGhlciBiZSBkaXJlY3RseQorICAgIGZvbGxvd2VkIGJ5IGEgaG9zdG5hbWUgb3IgYSAvLCB0aGUgb2xkIFVSSSBoYW5kbGluZyBvZiB0aGUKKyAgICBmZXRjaDIgbGlicmFyeSBkaWQgbm90IGNvbWZvcm0gdG8gdGhpcy4gVGhlcmVmb3JlLCB0aGlzIFVSSQorICAgIGNsYXNzIGhhcyBzb21lIGtsdWRnZXMgdG8gbWFrZSBzdXJlIHRoYXQgVVJJcyBhcmUgcGFyc2VkIGluCisgICAgYSB3YXkgY29tZm9ybWluZyB0byBiaXRiYWtlJ3MgY3VycmVudCB1c2FnZS4gVGhpcyBVUkkgY2xhc3MKKyAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nOgorCisgICAgIGZpbGU6cmVsYXRpdmUvcGF0aC5kaWZmIChJRVRGIGNvbXBsaWFudCkKKyAgICAgZ2l0OnJlbGF0aXZlL3BhdGguZ2l0IChJRVRGIGNvbXBsaWFudCkKKyAgICAgZ2l0Oi8vL2Fic29sdXRlL3BhdGguZ2l0IChJRVRGIGNvbXBsaWFudCkKKyAgICAgZmlsZTovLy9hYnNvbHV0ZS9wYXRoLmRpZmYgKElFVEYgY29tcGxpYW50KQorCisgICAgIGZpbGU6Ly9yZWxhdGl2ZS9wYXRoLmRpZmYgKG5vdCBJRVRGIGNvbXBsaWFudCkKKworICAgIEJ1dCBpdCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBmb2xsb3dpbmc6CisKKyAgICAgZmlsZTovL2hvc3RuYW1lL2Fic29sdXRlL3BhdGguZGlmZiAod291bGQgYmUgSUVURiBjb21wbGlhbnQpCisKKyAgICBOb3RlIHRoYXQgdGhlIGxhc3QgY2FzZSBvbmx5IGFwcGxpZXMgdG8gYSBsaXN0IG9mCisgICAgIndoaXRlbGlzdGVkIiBzY2hlbWVzIChjdXJyZW50bHkgb25seSBmaWxlOi8vKSwgdGhhdCByZXF1aXJlcworICAgIGl0cyBVUklzIHRvIG5vdCBoYXZlIGEgbmV0d29yayBsb2NhdGlvbi4KKyAgICAiIiIKKworICAgIF9yZWxhdGl2ZV9zY2hlbWVzID0gWydmaWxlJywgJ2dpdCddCisgICAgX25ldGxvY19mb3JiaWRkZW4gPSBbJ2ZpbGUnXQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHVyaT1Ob25lKToKKyAgICAgICAgc2VsZi5zY2hlbWUgPSAnJworICAgICAgICBzZWxmLnVzZXJpbmZvID0gJycKKyAgICAgICAgc2VsZi5ob3N0bmFtZSA9ICcnCisgICAgICAgIHNlbGYucG9ydCA9IE5vbmUKKyAgICAgICAgc2VsZi5fcGF0aCA9ICcnCisgICAgICAgIHNlbGYucGFyYW1zID0ge30KKyAgICAgICAgc2VsZi5xdWVyeSA9IHt9CisgICAgICAgIHNlbGYucmVsYXRpdmUgPSBGYWxzZQorCisgICAgICAgIGlmIG5vdCB1cmk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIFdlIGhpamFjayB0aGUgVVJMIHBhcmFtZXRlcnMsIHNpbmNlIHRoZSB3YXkgYml0YmFrZSB1c2VzCisgICAgICAgICMgdGhlbSBhcmUgbm90IHF1aXRlIFJGQyBjb21wbGlhbnQuCisgICAgICAgIHVyaSwgcGFyYW1fc3RyID0gKHVyaS5zcGxpdCgiOyIsIDEpICsgW05vbmVdKVs6Ml0KKworICAgICAgICB1cmxwID0gdXJscGFyc2UudXJscGFyc2UodXJpKQorICAgICAgICBzZWxmLnNjaGVtZSA9IHVybHAuc2NoZW1lCisKKyAgICAgICAgcmVwYXJzZSA9IDAKKworICAgICAgICAjIENvZXJjZSB1cmxwYXJzZSB0byBtYWtlIFVSSSBzY2hlbWUgdXNlIG5ldGxvYworICAgICAgICBpZiBub3Qgc2VsZi5zY2hlbWUgaW4gdXJscGFyc2UudXNlc19uZXRsb2M6CisgICAgICAgICAgICB1cmxwYXJzZS51c2VzX3BhcmFtcy5hcHBlbmQoc2VsZi5zY2hlbWUpCisgICAgICAgICAgICByZXBhcnNlID0gMQorCisgICAgICAgICMgTWFrZSB1cmxwYXJzZSBoYXBweSgvaWVyKSBieSBjb252ZXJ0aW5nIGxvY2FsIHJlc291cmNlcworICAgICAgICAjIHRvIFJGQyBjb21wbGlhbnQgVVJMIGZvcm1hdC4gRS5nLjoKKyAgICAgICAgIyAgIGZpbGU6Ly9mb28uZGlmZiAtPiBmaWxlOmZvby5kaWZmCisgICAgICAgIGlmIHVybHAuc2NoZW1lIGluIHNlbGYuX25ldGxvY19mb3JiaWRkZW46CisgICAgICAgICAgICB1cmkgPSByZS5zdWIoIig/PD06KS8vKD8hLykiLCAiIiwgdXJpLCAxKQorICAgICAgICAgICAgcmVwYXJzZSA9IDEKKworICAgICAgICBpZiByZXBhcnNlOgorICAgICAgICAgICAgdXJscCA9IHVybHBhcnNlLnVybHBhcnNlKHVyaSkKKworICAgICAgICAjIElkZW50aWZ5IGlmIHRoZSBVUkkgaXMgcmVsYXRpdmUgb3Igbm90CisgICAgICAgIGlmIHVybHAuc2NoZW1lIGluIHNlbGYuX3JlbGF0aXZlX3NjaGVtZXMgYW5kIFwKKyAgICAgICAgICAgcmUuY29tcGlsZSgiXlx3KzooPyEvLykiKS5tYXRjaCh1cmkpOgorICAgICAgICAgICAgc2VsZi5yZWxhdGl2ZSA9IFRydWUKKworICAgICAgICBpZiBub3Qgc2VsZi5yZWxhdGl2ZToKKyAgICAgICAgICAgIHNlbGYuaG9zdG5hbWUgPSB1cmxwLmhvc3RuYW1lIG9yICcnCisgICAgICAgICAgICBzZWxmLnBvcnQgPSB1cmxwLnBvcnQKKworICAgICAgICAgICAgc2VsZi51c2VyaW5mbyArPSB1cmxwLnVzZXJuYW1lIG9yICcnCisKKyAgICAgICAgICAgIGlmIHVybHAucGFzc3dvcmQ6CisgICAgICAgICAgICAgICAgc2VsZi51c2VyaW5mbyArPSAnOiVzJyAlIHVybHAucGFzc3dvcmQKKworICAgICAgICBzZWxmLnBhdGggPSB1cmxsaWIudW5xdW90ZSh1cmxwLnBhdGgpCisKKyAgICAgICAgaWYgcGFyYW1fc3RyOgorICAgICAgICAgICAgc2VsZi5wYXJhbXMgPSBzZWxmLl9wYXJhbV9zdHJfc3BsaXQocGFyYW1fc3RyLCAiOyIpCisgICAgICAgIGlmIHVybHAucXVlcnk6CisgICAgICAgICAgICBzZWxmLnF1ZXJ5ID0gc2VsZi5fcGFyYW1fc3RyX3NwbGl0KHVybHAucXVlcnksICImIikKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICB1c2VyaW5mbyA9IHNlbGYudXNlcmluZm8KKyAgICAgICAgaWYgdXNlcmluZm86CisgICAgICAgICAgICB1c2VyaW5mbyArPSAnQCcKKworICAgICAgICByZXR1cm4gIiVzOiVzJXMlcyVzJXMlcyIgJSAoCisgICAgICAgICAgICBzZWxmLnNjaGVtZSwKKyAgICAgICAgICAgICcnIGlmIHNlbGYucmVsYXRpdmUgZWxzZSAnLy8nLAorICAgICAgICAgICAgdXNlcmluZm8sCisgICAgICAgICAgICBzZWxmLmhvc3Rwb3J0LAorICAgICAgICAgICAgc2VsZi5wYXRoX3F1b3RlZCwKKyAgICAgICAgICAgIHNlbGYuX3F1ZXJ5X3N0cigpLAorICAgICAgICAgICAgc2VsZi5fcGFyYW1fc3RyKCkpCisKKyAgICBkZWYgX3BhcmFtX3N0cihzZWxmKToKKyAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICcnLmpvaW4oWyc7Jywgc2VsZi5fcGFyYW1fc3RyX2pvaW4oc2VsZi5wYXJhbXMsICI7IildKQorICAgICAgICAgICAgaWYgc2VsZi5wYXJhbXMgZWxzZSAnJykKKworICAgIGRlZiBfcXVlcnlfc3RyKHNlbGYpOgorICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgJycuam9pbihbJz8nLCBzZWxmLl9wYXJhbV9zdHJfam9pbihzZWxmLnF1ZXJ5LCAiJiIpXSkKKyAgICAgICAgICAgIGlmIHNlbGYucXVlcnkgZWxzZSAnJykKKworICAgIGRlZiBfcGFyYW1fc3RyX3NwbGl0KHNlbGYsIHN0cmluZywgZWxtZGVsaW0sIGt2ZGVsaW09Ij0iKToKKyAgICAgICAgcmV0ID0ge30KKyAgICAgICAgZm9yIGssIHYgaW4gW3guc3BsaXQoa3ZkZWxpbSwgMSkgZm9yIHggaW4gc3RyaW5nLnNwbGl0KGVsbWRlbGltKV06CisgICAgICAgICAgICByZXRba10gPSB2CisgICAgICAgIHJldHVybiByZXQKKworICAgIGRlZiBfcGFyYW1fc3RyX2pvaW4oc2VsZiwgZGljdF8sIGVsbWRlbGltLCBrdmRlbGltPSI9Iik6CisgICAgICAgIHJldHVybiBlbG1kZWxpbS5qb2luKFtrdmRlbGltLmpvaW4oW2ssIHZdKSBmb3IgaywgdiBpbiBkaWN0Xy5pdGVtcygpXSkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBob3N0cG9ydChzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYucG9ydDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmhvc3RuYW1lCisgICAgICAgIHJldHVybiAiJXM6JWQiICUgKHNlbGYuaG9zdG5hbWUsIHNlbGYucG9ydCkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBwYXRoX3F1b3RlZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHVybGxpYi5xdW90ZShzZWxmLnBhdGgpCisKKyAgICBAcGF0aF9xdW90ZWQuc2V0dGVyCisgICAgZGVmIHBhdGhfcXVvdGVkKHNlbGYsIHBhdGgpOgorICAgICAgICBzZWxmLnBhdGggPSB1cmxsaWIudW5xdW90ZShwYXRoKQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHBhdGgoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wYXRoCisKKyAgICBAcGF0aC5zZXR0ZXIKKyAgICBkZWYgcGF0aChzZWxmLCBwYXRoKToKKyAgICAgICAgc2VsZi5fcGF0aCA9IHBhdGgKKworICAgICAgICBpZiByZS5jb21waWxlKCJeLyIpLm1hdGNoKHBhdGgpOgorICAgICAgICAgICAgc2VsZi5yZWxhdGl2ZSA9IEZhbHNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnJlbGF0aXZlID0gVHJ1ZQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHVzZXJuYW1lKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnVzZXJpbmZvOgorICAgICAgICAgICAgcmV0dXJuIChzZWxmLnVzZXJpbmZvLnNwbGl0KCI6IiwgMSkpWzBdCisgICAgICAgIHJldHVybiAnJworCisgICAgQHVzZXJuYW1lLnNldHRlcgorICAgIGRlZiB1c2VybmFtZShzZWxmLCB1c2VybmFtZSk6CisgICAgICAgIHBhc3N3b3JkID0gc2VsZi5wYXNzd29yZAorICAgICAgICBzZWxmLnVzZXJpbmZvID0gdXNlcm5hbWUKKyAgICAgICAgaWYgcGFzc3dvcmQ6CisgICAgICAgICAgICBzZWxmLnVzZXJpbmZvICs9ICI6JXMiICUgcGFzc3dvcmQKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBwYXNzd29yZChzZWxmKToKKyAgICAgICAgaWYgc2VsZi51c2VyaW5mbyBhbmQgIjoiIGluIHNlbGYudXNlcmluZm86CisgICAgICAgICAgICByZXR1cm4gKHNlbGYudXNlcmluZm8uc3BsaXQoIjoiLCAxKSlbMV0KKyAgICAgICAgcmV0dXJuICcnCisKKyAgICBAcGFzc3dvcmQuc2V0dGVyCisgICAgZGVmIHBhc3N3b3JkKHNlbGYsIHBhc3N3b3JkKToKKyAgICAgICAgc2VsZi51c2VyaW5mbyA9ICIlczolcyIgJSAoc2VsZi51c2VybmFtZSwgcGFzc3dvcmQpCisKK2RlZiBkZWNvZGV1cmwodXJsKToKKyAgICAiIiJEZWNvZGVzIGFuIFVSTCBpbnRvIHRoZSB0b2tlbnMgKHNjaGVtZSwgbmV0d29yayBsb2NhdGlvbiwgcGF0aCwKKyAgICB1c2VyLCBwYXNzd29yZCwgcGFyYW1ldGVycykuCisgICAgIiIiCisKKyAgICBtID0gcmUuY29tcGlsZSgnKD9QPHR5cGU+W146XSopOi8vKCg/UDx1c2VyPlteL10rKUApPyg/UDxsb2NhdGlvbj5bXjtdKykoOyg/UDxwYXJtPi4qKSk/JykubWF0Y2godXJsKQorICAgIGlmIG5vdCBtOgorICAgICAgICByYWlzZSBNYWxmb3JtZWRVcmwodXJsKQorCisgICAgdHlwZSA9IG0uZ3JvdXAoJ3R5cGUnKQorICAgIGxvY2F0aW9uID0gbS5ncm91cCgnbG9jYXRpb24nKQorICAgIGlmIG5vdCBsb2NhdGlvbjoKKyAgICAgICAgcmFpc2UgTWFsZm9ybWVkVXJsKHVybCkKKyAgICB1c2VyID0gbS5ncm91cCgndXNlcicpCisgICAgcGFybSA9IG0uZ3JvdXAoJ3Bhcm0nKQorCisgICAgbG9jaWR4ID0gbG9jYXRpb24uZmluZCgnLycpCisgICAgaWYgbG9jaWR4ICE9IC0xIGFuZCB0eXBlLmxvd2VyKCkgIT0gJ2ZpbGUnOgorICAgICAgICBob3N0ID0gbG9jYXRpb25bOmxvY2lkeF0KKyAgICAgICAgcGF0aCA9IGxvY2F0aW9uW2xvY2lkeDpdCisgICAgZWxzZToKKyAgICAgICAgaG9zdCA9ICIiCisgICAgICAgIHBhdGggPSBsb2NhdGlvbgorICAgIGlmIHVzZXI6CisgICAgICAgIG0gPSByZS5jb21waWxlKCcoP1A8dXNlcj5bXjpdKykoOj8oP1A8cHN3ZD4uKikpJykubWF0Y2godXNlcikKKyAgICAgICAgaWYgbToKKyAgICAgICAgICAgIHVzZXIgPSBtLmdyb3VwKCd1c2VyJykKKyAgICAgICAgICAgIHBzd2QgPSBtLmdyb3VwKCdwc3dkJykKKyAgICBlbHNlOgorICAgICAgICB1c2VyID0gJycKKyAgICAgICAgcHN3ZCA9ICcnCisKKyAgICBwID0ge30KKyAgICBpZiBwYXJtOgorICAgICAgICBmb3IgcyBpbiBwYXJtLnNwbGl0KCc7Jyk6CisgICAgICAgICAgICBpZiBzOgorICAgICAgICAgICAgICAgIGlmIG5vdCAnPScgaW4gczoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgTWFsZm9ybWVkVXJsKHVybCwgIlRoZSBVUkw6ICclcycgaXMgaW52YWxpZDogcGFyYW1ldGVyICVzIGRvZXMgbm90IHNwZWNpZnkgYSB2YWx1ZSAobWlzc2luZyAnPScpIiAlICh1cmwsIHMpKQorICAgICAgICAgICAgICAgIHMxLCBzMiA9IHMuc3BsaXQoJz0nKQorICAgICAgICAgICAgICAgIHBbczFdID0gczIKKworICAgIHJldHVybiB0eXBlLCBob3N0LCB1cmxsaWIudW5xdW90ZShwYXRoKSwgdXNlciwgcHN3ZCwgcAorCitkZWYgZW5jb2RldXJsKGRlY29kZWQpOgorICAgICIiIkVuY29kZXMgYSBVUkwgZnJvbSB0b2tlbnMgKHNjaGVtZSwgbmV0d29yayBsb2NhdGlvbiwgcGF0aCwKKyAgICB1c2VyLCBwYXNzd29yZCwgcGFyYW1ldGVycykuCisgICAgIiIiCisKKyAgICB0eXBlLCBob3N0LCBwYXRoLCB1c2VyLCBwc3dkLCBwID0gZGVjb2RlZAorCisgICAgaWYgbm90IHBhdGg6CisgICAgICAgIHJhaXNlIE1pc3NpbmdQYXJhbWV0ZXJFcnJvcigncGF0aCcsICJlbmNvZGVkIGZyb20gdGhlIGRhdGEgJXMiICUgc3RyKGRlY29kZWQpKQorICAgIGlmIG5vdCB0eXBlOgorICAgICAgICByYWlzZSBNaXNzaW5nUGFyYW1ldGVyRXJyb3IoJ3R5cGUnLCAiZW5jb2RlZCBmcm9tIHRoZSBkYXRhICVzIiAlIHN0cihkZWNvZGVkKSkKKyAgICB1cmwgPSAnJXM6Ly8nICUgdHlwZQorICAgIGlmIHVzZXIgYW5kIHR5cGUgIT0gImZpbGUiOgorICAgICAgICB1cmwgKz0gIiVzIiAlIHVzZXIKKyAgICAgICAgaWYgcHN3ZDoKKyAgICAgICAgICAgIHVybCArPSAiOiVzIiAlIHBzd2QKKyAgICAgICAgdXJsICs9ICJAIgorICAgIGlmIGhvc3QgYW5kIHR5cGUgIT0gImZpbGUiOgorICAgICAgICB1cmwgKz0gIiVzIiAlIGhvc3QKKyAgICAjIFN0YW5kYXJkaXNlIHBhdGggdG8gZW5zdXJlIGNvbXBhcmlzb25zIHdvcmsKKyAgICB3aGlsZSAnLy8nIGluIHBhdGg6CisgICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoIi8vIiwgIi8iKQorICAgIHVybCArPSAiJXMiICUgdXJsbGliLnF1b3RlKHBhdGgpCisgICAgaWYgcDoKKyAgICAgICAgZm9yIHBhcm0gaW4gcDoKKyAgICAgICAgICAgIHVybCArPSAiOyVzPSVzIiAlIChwYXJtLCBwW3Bhcm1dKQorCisgICAgcmV0dXJuIHVybAorCitkZWYgdXJpX3JlcGxhY2UodWQsIHVyaV9maW5kLCB1cmlfcmVwbGFjZSwgcmVwbGFjZW1lbnRzLCBkKToKKyAgICBpZiBub3QgdWQudXJsIG9yIG5vdCB1cmlfZmluZCBvciBub3QgdXJpX3JlcGxhY2U6CisgICAgICAgIGxvZ2dlci5lcnJvcigidXJpX3JlcGxhY2U6IHBhc3NlZCBhbiB1bmRlZmluZWQgdmFsdWUsIG5vdCByZXBsYWNpbmciKQorICAgICAgICByZXR1cm4gTm9uZQorICAgIHVyaV9kZWNvZGVkID0gbGlzdChkZWNvZGV1cmwodWQudXJsKSkKKyAgICB1cmlfZmluZF9kZWNvZGVkID0gbGlzdChkZWNvZGV1cmwodXJpX2ZpbmQpKQorICAgIHVyaV9yZXBsYWNlX2RlY29kZWQgPSBsaXN0KGRlY29kZXVybCh1cmlfcmVwbGFjZSkpCisgICAgbG9nZ2VyLmRlYnVnKDIsICJGb3IgdXJsICVzIGNvbXBhcmluZyAlcyB0byAlcyIgJSAodXJpX2RlY29kZWQsIHVyaV9maW5kX2RlY29kZWQsIHVyaV9yZXBsYWNlX2RlY29kZWQpKQorICAgIHJlc3VsdF9kZWNvZGVkID0gWycnLCAnJywgJycsICcnLCAnJywge31dCisgICAgZm9yIGxvYywgaSBpbiBlbnVtZXJhdGUodXJpX2ZpbmRfZGVjb2RlZCk6CisgICAgICAgIHJlc3VsdF9kZWNvZGVkW2xvY10gPSB1cmlfZGVjb2RlZFtsb2NdCisgICAgICAgIHJlZ2V4cCA9IGkKKyAgICAgICAgaWYgbG9jID09IDAgYW5kIHJlZ2V4cCBhbmQgbm90IHJlZ2V4cC5lbmRzd2l0aCgiJCIpOgorICAgICAgICAgICAgIyBMZWF2aW5nIHRoZSB0eXBlIHVuYW5jaG9yZWQgY2FuIG1lYW4gImh0dHBzIiBtYXRjaGluZyAiZmlsZSIgY2FuIGJlY29tZSAiZmlsZXMiCisgICAgICAgICAgICAjIHdoaWNoIGlzIGNsZWFybHkgdW5kZXNpcmFibGUuCisgICAgICAgICAgICByZWdleHAgKz0gIiQiCisgICAgICAgIGlmIGxvYyA9PSA1OgorICAgICAgICAgICAgIyBIYW5kbGUgVVJMIHBhcmFtZXRlcnMKKyAgICAgICAgICAgIGlmIGk6CisgICAgICAgICAgICAgICAgIyBBbnkgc3BlY2lmaWVkIFVSTCBwYXJhbWV0ZXJzIG11c3QgbWF0Y2gKKyAgICAgICAgICAgICAgICBmb3IgayBpbiB1cmlfcmVwbGFjZV9kZWNvZGVkW2xvY106CisgICAgICAgICAgICAgICAgICAgIGlmIHVyaV9kZWNvZGVkW2xvY11ba10gIT0gdXJpX3JlcGxhY2VfZGVjb2RlZFtsb2NdW2tdOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgICMgT3ZlcndyaXRlIGFueSBzcGVjaWZpZWQgcmVwbGFjZW1lbnQgcGFyYW1ldGVycworICAgICAgICAgICAgZm9yIGsgaW4gdXJpX3JlcGxhY2VfZGVjb2RlZFtsb2NdOgorICAgICAgICAgICAgICAgIGZvciBsIGluIHJlcGxhY2VtZW50czoKKyAgICAgICAgICAgICAgICAgICAgdXJpX3JlcGxhY2VfZGVjb2RlZFtsb2NdW2tdID0gdXJpX3JlcGxhY2VfZGVjb2RlZFtsb2NdW2tdLnJlcGxhY2UobCwgcmVwbGFjZW1lbnRzW2xdKQorICAgICAgICAgICAgICAgIHJlc3VsdF9kZWNvZGVkW2xvY11ba10gPSB1cmlfcmVwbGFjZV9kZWNvZGVkW2xvY11ba10KKyAgICAgICAgZWxpZiAocmUubWF0Y2gocmVnZXhwLCB1cmlfZGVjb2RlZFtsb2NdKSk6CisgICAgICAgICAgICBpZiBub3QgdXJpX3JlcGxhY2VfZGVjb2RlZFtsb2NdOgorICAgICAgICAgICAgICAgIHJlc3VsdF9kZWNvZGVkW2xvY10gPSAiIiAgICAKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZm9yIGsgaW4gcmVwbGFjZW1lbnRzOgorICAgICAgICAgICAgICAgICAgICB1cmlfcmVwbGFjZV9kZWNvZGVkW2xvY10gPSB1cmlfcmVwbGFjZV9kZWNvZGVkW2xvY10ucmVwbGFjZShrLCByZXBsYWNlbWVudHNba10pCisgICAgICAgICAgICAgICAgI2JiLm5vdGUoIiVzICVzICVzIiAlIChyZWdleHAsIHVyaV9yZXBsYWNlX2RlY29kZWRbbG9jXSwgdXJpX2RlY29kZWRbbG9jXSkpCisgICAgICAgICAgICAgICAgcmVzdWx0X2RlY29kZWRbbG9jXSA9IHJlLnN1YihyZWdleHAsIHVyaV9yZXBsYWNlX2RlY29kZWRbbG9jXSwgdXJpX2RlY29kZWRbbG9jXSkKKyAgICAgICAgICAgIGlmIGxvYyA9PSAyOgorICAgICAgICAgICAgICAgICMgSGFuZGxlIHBhdGggbWFuaXB1bGF0aW9ucworICAgICAgICAgICAgICAgIGJhc2VuYW1lID0gTm9uZQorICAgICAgICAgICAgICAgIGlmIHVyaV9kZWNvZGVkWzBdICE9IHVyaV9yZXBsYWNlX2RlY29kZWRbMF0gYW5kIHVkLm1pcnJvcnRhcmJhbGw6CisgICAgICAgICAgICAgICAgICAgICMgSWYgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gdXJsIHR5cGVzIGRpZmZlciwgbXVzdCBiZSBhIG1pcnJvcnRhcmJhbGwgbWFwcGluZworICAgICAgICAgICAgICAgICAgICBiYXNlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUodWQubWlycm9ydGFyYmFsbCkKKyAgICAgICAgICAgICAgICAgICAgIyBLaWxsIHBhcmFtZXRlcnMsIHRoZXkgbWFrZSBubyBzZW5zZSBmb3IgbWlycm9yIHRhcmJhbGxzCisgICAgICAgICAgICAgICAgICAgIHVyaV9kZWNvZGVkWzVdID0ge30KKyAgICAgICAgICAgICAgICBlbGlmIHVkLmxvY2FscGF0aCBhbmQgdWQubWV0aG9kLnN1cHBvcnRzX2NoZWNrc3VtKHVkKToKKyAgICAgICAgICAgICAgICAgICAgYmFzZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHVkLmxvY2FscGF0aCkKKyAgICAgICAgICAgICAgICBpZiBiYXNlbmFtZSBhbmQgbm90IHJlc3VsdF9kZWNvZGVkW2xvY10uZW5kc3dpdGgoYmFzZW5hbWUpOgorICAgICAgICAgICAgICAgICAgICByZXN1bHRfZGVjb2RlZFtsb2NdID0gb3MucGF0aC5qb2luKHJlc3VsdF9kZWNvZGVkW2xvY10sIGJhc2VuYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICByZXN1bHQgPSBlbmNvZGV1cmwocmVzdWx0X2RlY29kZWQpCisgICAgaWYgcmVzdWx0ID09IHVkLnVybDoKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICBsb2dnZXIuZGVidWcoMiwgIkZvciB1cmwgJXMgcmV0dXJuaW5nICVzIiAlICh1ZC51cmwsIHJlc3VsdCkpCisgICAgcmV0dXJuIHJlc3VsdAorCittZXRob2RzID0gW10KK3VybGRhdGFfY2FjaGUgPSB7fQorc2F2ZWRfaGVhZHJldnMgPSB7fQorCitkZWYgZmV0Y2hlcl9pbml0KGQpOgorICAgICIiIgorICAgIENhbGxlZCB0byBpbml0aWFsaXplIHRoZSBmZXRjaGVycyBvbmNlIHRoZSBjb25maWd1cmF0aW9uIGRhdGEgaXMga25vd24uCisgICAgQ2FsbHMgYmVmb3JlIHRoaXMgbXVzdCBub3QgaGl0IHRoZSBjYWNoZS4KKyAgICAiIiIKKyAgICAjIFdoZW4gdG8gZHJvcCBTQ00gaGVhZCByZXZpc2lvbnMgY29udHJvbGxlZCBieSB1c2VyIHBvbGljeQorICAgIHNyY3Jldl9wb2xpY3kgPSBkLmdldFZhcignQkJfU1JDUkVWX1BPTElDWScsIFRydWUpIG9yICJjbGVhciIKKyAgICBpZiBzcmNyZXZfcG9saWN5ID09ICJjYWNoZSI6CisgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiS2VlcGluZyBTUkNSRVYgY2FjaGUgZHVlIHRvIGNhY2hlIHBvbGljeSBvZjogJXMiLCBzcmNyZXZfcG9saWN5KQorICAgIGVsaWYgc3JjcmV2X3BvbGljeSA9PSAiY2xlYXIiOgorICAgICAgICBsb2dnZXIuZGVidWcoMSwgIkNsZWFyaW5nIFNSQ1JFViBjYWNoZSBkdWUgdG8gY2FjaGUgcG9saWN5IG9mOiAlcyIsIHNyY3Jldl9wb2xpY3kpCisgICAgICAgIHJldnMgPSBiYi5wZXJzaXN0X2RhdGEucGVyc2lzdCgnQkJfVVJJX0hFQURSRVZTJywgZCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYmIuZmV0Y2gyLnNhdmVkX2hlYWRyZXZzID0gcmV2cy5pdGVtcygpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgcmV2cy5jbGVhcigpCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgRmV0Y2hFcnJvcigiSW52YWxpZCBTUkNSRVYgY2FjaGUgcG9saWN5IG9mOiAlcyIgJSBzcmNyZXZfcG9saWN5KQorCisgICAgX2NoZWNrc3VtX2NhY2hlLmluaXRfY2FjaGUoZCkKKworICAgIGZvciBtIGluIG1ldGhvZHM6CisgICAgICAgIGlmIGhhc2F0dHIobSwgImluaXQiKToKKyAgICAgICAgICAgIG0uaW5pdChkKQorCitkZWYgZmV0Y2hlcl9wYXJzZV9zYXZlKGQpOgorICAgIF9jaGVja3N1bV9jYWNoZS5zYXZlX2V4dHJhcyhkKQorCitkZWYgZmV0Y2hlcl9wYXJzZV9kb25lKGQpOgorICAgIF9jaGVja3N1bV9jYWNoZS5zYXZlX21lcmdlKGQpCisKK2RlZiBmZXRjaGVyX2NvbXBhcmVfcmV2aXNpb25zKGQpOgorICAgICIiIgorICAgIENvbXBhcmUgdGhlIHJldmlzaW9ucyBpbiB0aGUgcGVyc2lzdGFudCBjYWNoZSB3aXRoIGN1cnJlbnQgdmFsdWVzIGFuZAorICAgIHJldHVybiB0cnVlL2ZhbHNlIG9uIHdoZXRoZXIgdGhleSd2ZSBjaGFuZ2VkLgorICAgICIiIgorCisgICAgZGF0YSA9IGJiLnBlcnNpc3RfZGF0YS5wZXJzaXN0KCdCQl9VUklfSEVBRFJFVlMnLCBkKS5pdGVtcygpCisgICAgZGF0YTIgPSBiYi5mZXRjaDIuc2F2ZWRfaGVhZHJldnMKKworICAgIGNoYW5nZWQgPSBGYWxzZQorICAgIGZvciBrZXkgaW4gZGF0YToKKyAgICAgICAgaWYga2V5IG5vdCBpbiBkYXRhMiBvciBkYXRhMltrZXldICE9IGRhdGFba2V5XToKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiJXMgY2hhbmdlZCIsIGtleSkKKyAgICAgICAgICAgIGNoYW5nZWQgPSBUcnVlCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICIlcyBkaWQgbm90IGNoYW5nZSIsIGtleSkKKyAgICByZXR1cm4gRmFsc2UKKworZGVmIG1pcnJvcl9mcm9tX3N0cmluZyhkYXRhKToKKyAgICByZXR1cm4gWyBpLnNwbGl0KCkgZm9yIGkgaW4gKGRhdGEgb3IgIiIpLnJlcGxhY2UoJ1xcbicsJ1xuJykuc3BsaXQoJ1xuJykgaWYgaSBdCisKK2RlZiB2ZXJpZnlfY2hlY2tzdW0odWQsIGQsIHByZWNvbXB1dGVkPXt9KToKKyAgICAiIiIKKyAgICB2ZXJpZnkgdGhlIE1ENSBhbmQgU0hBMjU2IGNoZWNrc3VtIGZvciBkb3dubG9hZGVkIHNyYworCisgICAgUmFpc2VzIGEgRmV0Y2hFcnJvciBpZiBvbmUgb3IgYm90aCBvZiB0aGUgU1JDX1VSSSBjaGVja3N1bXMgZG8gbm90IG1hdGNoCisgICAgdGhlIGRvd25sb2FkZWQgZmlsZSwgb3IgaWYgQkJfU1RSSUNUX0NIRUNLU1VNIGlzIHNldCBhbmQgdGhlcmUgYXJlIG5vCisgICAgY2hlY2tzdW1zIHNwZWNpZmllZC4KKworICAgIFJldHVybnMgYSBkaWN0IG9mIGNoZWNrc3VtcyB0aGF0IGNhbiBiZSBzdG9yZWQgaW4gYSBkb25lIHN0YW1wIGZpbGUgYW5kCisgICAgcGFzc2VkIGluIGFzIHByZWNvbXB1dGVkIHBhcmFtZXRlciBpbiBhIGxhdGVyIGNhbGwgdG8gYXZvaWQgcmUtY29tcHV0aW5nCisgICAgdGhlIGNoZWNrc3VtcyBmcm9tIHRoZSBmaWxlLiBUaGlzIGFsbG93cyB2ZXJpZnlpbmcgdGhlIGNoZWNrc3VtcyBvZiB0aGUKKyAgICBmaWxlIGFnYWluc3QgdGhvc2UgaW4gdGhlIHJlY2lwZSBlYWNoIHRpbWUsIHJhdGhlciB0aGFuIG9ubHkgYWZ0ZXIKKyAgICBkb3dubG9hZGluZy4gU2VlIGh0dHBzOi8vYnVnemlsbGEueW9jdG9wcm9qZWN0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTU3MS4KKyAgICAiIiIKKworICAgIF9NRDVfS0VZID0gIm1kNSIKKyAgICBfU0hBMjU2X0tFWSA9ICJzaGEyNTYiCisKKyAgICBpZiB1ZC5pZ25vcmVfY2hlY2tzdW1zIG9yIG5vdCB1ZC5tZXRob2Quc3VwcG9ydHNfY2hlY2tzdW0odWQpOgorICAgICAgICByZXR1cm4ge30KKworICAgIGlmIF9NRDVfS0VZIGluIHByZWNvbXB1dGVkOgorICAgICAgICBtZDVkYXRhID0gcHJlY29tcHV0ZWRbX01ENV9LRVldCisgICAgZWxzZToKKyAgICAgICAgbWQ1ZGF0YSA9IGJiLnV0aWxzLm1kNV9maWxlKHVkLmxvY2FscGF0aCkKKworICAgIGlmIF9TSEEyNTZfS0VZIGluIHByZWNvbXB1dGVkOgorICAgICAgICBzaGEyNTZkYXRhID0gcHJlY29tcHV0ZWRbX1NIQTI1Nl9LRVldCisgICAgZWxzZToKKyAgICAgICAgc2hhMjU2ZGF0YSA9IGJiLnV0aWxzLnNoYTI1Nl9maWxlKHVkLmxvY2FscGF0aCkKKworICAgIGlmIHVkLm1ldGhvZC5yZWNvbW1lbmRzX2NoZWNrc3VtKHVkKToKKyAgICAgICAgIyBJZiBzdHJpY3QgY2hlY2tpbmcgZW5hYmxlZCBhbmQgbmVpdGhlciBzdW0gZGVmaW5lZCwgcmFpc2UgZXJyb3IKKyAgICAgICAgc3RyaWN0ID0gZC5nZXRWYXIoIkJCX1NUUklDVF9DSEVDS1NVTSIsIFRydWUpIG9yICIwIgorICAgICAgICBpZiAoc3RyaWN0ID09ICIxIikgYW5kIG5vdCAodWQubWQ1X2V4cGVjdGVkIG9yIHVkLnNoYTI1Nl9leHBlY3RlZCk6CisgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ05vIGNoZWNrc3VtIHNwZWNpZmllZCBmb3IgJXMsIHBsZWFzZSBhZGQgYXQgbGVhc3Qgb25lIHRvIHRoZSByZWNpcGU6XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTUkNfVVJJWyVzXSA9ICIlcyJcblNSQ19VUklbJXNdID0gIiVzIicgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWQubG9jYWxwYXRoLCB1ZC5tZDVfbmFtZSwgbWQ1ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkLnNoYTI1Nl9uYW1lLCBzaGEyNTZkYXRhKSkKKyAgICAgICAgICAgIHJhaXNlIE5vQ2hlY2tzdW1FcnJvcignTWlzc2luZyBTUkNfVVJJIGNoZWNrc3VtJywgdWQudXJsKQorCisgICAgICAgICMgTG9nIG1pc3Npbmcgc3VtcyBzbyB1c2VyIGNhbiBtb3JlIGVhc2lseSBhZGQgdGhlbQorICAgICAgICBpZiBub3QgdWQubWQ1X2V4cGVjdGVkOgorICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ01pc3NpbmcgbWQ1IFNSQ19VUkkgY2hlY2tzdW0gZm9yICVzLCBjb25zaWRlciBhZGRpbmcgdG8gdGhlIHJlY2lwZTpcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICdTUkNfVVJJWyVzXSA9ICIlcyInLAorICAgICAgICAgICAgICAgICAgICAgICAgdWQubG9jYWxwYXRoLCB1ZC5tZDVfbmFtZSwgbWQ1ZGF0YSkKKworICAgICAgICBpZiBub3QgdWQuc2hhMjU2X2V4cGVjdGVkOgorICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ01pc3Npbmcgc2hhMjU2IFNSQ19VUkkgY2hlY2tzdW0gZm9yICVzLCBjb25zaWRlciBhZGRpbmcgdG8gdGhlIHJlY2lwZTpcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICdTUkNfVVJJWyVzXSA9ICIlcyInLAorICAgICAgICAgICAgICAgICAgICAgICAgdWQubG9jYWxwYXRoLCB1ZC5zaGEyNTZfbmFtZSwgc2hhMjU2ZGF0YSkKKworICAgIG1kNW1pc21hdGNoID0gRmFsc2UKKyAgICBzaGEyNTZtaXNtYXRjaCA9IEZhbHNlCisKKyAgICBpZiB1ZC5tZDVfZXhwZWN0ZWQgIT0gbWQ1ZGF0YToKKyAgICAgICAgbWQ1bWlzbWF0Y2ggPSBUcnVlCisKKyAgICBpZiB1ZC5zaGEyNTZfZXhwZWN0ZWQgIT0gc2hhMjU2ZGF0YToKKyAgICAgICAgc2hhMjU2bWlzbWF0Y2ggPSBUcnVlCisKKyAgICAjIFdlIHdhbnQgdG8gYWxlcnQgdGhlIHVzZXIgaWYgYSBjaGVja3N1bSBpcyBkZWZpbmVkIGluIHRoZSByZWNpcGUgYnV0CisgICAgIyBpdCBkb2VzIG5vdCBtYXRjaC4KKyAgICBtc2cgPSAiIgorICAgIG1pc21hdGNoID0gRmFsc2UKKyAgICBpZiBtZDVtaXNtYXRjaCBhbmQgdWQubWQ1X2V4cGVjdGVkOgorICAgICAgICBtc2cgPSBtc2cgKyAiXG5GaWxlOiAnJXMnIGhhcyAlcyBjaGVja3N1bSAlcyB3aGVuICVzIHdhcyBleHBlY3RlZCIgJSAodWQubG9jYWxwYXRoLCAnbWQ1JywgbWQ1ZGF0YSwgdWQubWQ1X2V4cGVjdGVkKQorICAgICAgICBtaXNtYXRjaCA9IFRydWU7CisKKyAgICBpZiBzaGEyNTZtaXNtYXRjaCBhbmQgdWQuc2hhMjU2X2V4cGVjdGVkOgorICAgICAgICBtc2cgPSBtc2cgKyAiXG5GaWxlOiAnJXMnIGhhcyAlcyBjaGVja3N1bSAlcyB3aGVuICVzIHdhcyBleHBlY3RlZCIgJSAodWQubG9jYWxwYXRoLCAnc2hhMjU2Jywgc2hhMjU2ZGF0YSwgdWQuc2hhMjU2X2V4cGVjdGVkKQorICAgICAgICBtaXNtYXRjaCA9IFRydWU7CisKKyAgICBpZiBtaXNtYXRjaDoKKyAgICAgICAgbXNnID0gbXNnICsgJ1xuSWYgdGhpcyBjaGFuZ2UgaXMgZXhwZWN0ZWQgKGUuZy4geW91IGhhdmUgdXBncmFkZWQgdG8gYSBuZXcgdmVyc2lvbiB3aXRob3V0IHVwZGF0aW5nIHRoZSBjaGVja3N1bXMpIHRoZW4geW91IGNhbiB1c2UgdGhlc2UgbGluZXMgd2l0aGluIHRoZSByZWNpcGU6XG5TUkNfVVJJWyVzXSA9ICIlcyJcblNSQ19VUklbJXNdID0gIiVzIlxuT3RoZXJ3aXNlIHlvdSBzaG91bGQgcmV0cnkgdGhlIGRvd25sb2FkIGFuZC9vciBjaGVjayB3aXRoIHVwc3RyZWFtIHRvIGRldGVybWluZSBpZiB0aGUgZmlsZSBoYXMgYmVjb21lIGNvcnJ1cHRlZCBvciBvdGhlcndpc2UgdW5leHBlY3RlZGx5IG1vZGlmaWVkLlxuJyAlICh1ZC5tZDVfbmFtZSwgbWQ1ZGF0YSwgdWQuc2hhMjU2X25hbWUsIHNoYTI1NmRhdGEpCisKKyAgICBpZiBsZW4obXNnKToKKyAgICAgICAgcmFpc2UgQ2hlY2tzdW1FcnJvcignQ2hlY2tzdW0gbWlzbWF0Y2ghJXMnICUgbXNnLCB1ZC51cmwsIG1kNWRhdGEpCisKKyAgICByZXR1cm4geworICAgICAgICBfTUQ1X0tFWTogbWQ1ZGF0YSwKKyAgICAgICAgX1NIQTI1Nl9LRVk6IHNoYTI1NmRhdGEKKyAgICB9CisKKworZGVmIHZlcmlmeV9kb25lc3RhbXAodWQsIGQsIG9yaWd1ZD1Ob25lKToKKyAgICAiIiIKKyAgICBDaGVjayB3aGV0aGVyIHRoZSBkb25lIHN0YW1wIGZpbGUgaGFzIHRoZSByaWdodCBjaGVja3N1bXMgKGlmIHRoZSBmZXRjaAorICAgIG1ldGhvZCBzdXBwb3J0cyB0aGVtKS4gSWYgaXQgZG9lc24ndCwgZGVsZXRlIHRoZSBkb25lIHN0YW1wIGFuZCBmb3JjZQorICAgIGEgcmUtZG93bmxvYWQuCisKKyAgICBSZXR1cm5zIFRydWUsIGlmIHRoZSBkb25lc3RhbXAgZXhpc3RzIGFuZCBpcyB2YWxpZCwgRmFsc2Ugb3RoZXJ3aXNlLiBXaGVuCisgICAgcmV0dXJuaW5nIEZhbHNlLCBhbnkgZXhpc3RpbmcgZG9uZSBzdGFtcHMgYXJlIHJlbW92ZWQuCisgICAgIiIiCisgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHVkLmRvbmVzdGFtcCk6CisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgaWYgKG5vdCB1ZC5tZXRob2Quc3VwcG9ydHNfY2hlY2tzdW0odWQpIG9yCisgICAgICAgIChvcmlndWQgYW5kIG5vdCBvcmlndWQubWV0aG9kLnN1cHBvcnRzX2NoZWNrc3VtKG9yaWd1ZCkpKToKKyAgICAgICAgIyBkb25lIHN0YW1wIGV4aXN0cywgY2hlY2tzdW1zIG5vdCBzdXBwb3J0ZWQ7IGFzc3VtZSB0aGUgbG9jYWwgZmlsZSBpcworICAgICAgICAjIGN1cnJlbnQKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyh1ZC5sb2NhbHBhdGgpOgorICAgICAgICAjIGRvbmUgc3RhbXAgZXhpc3RzLCBidXQgdGhlIGRvd25sb2FkZWQgZmlsZSBkb2VzIG5vdDsgdGhlIGRvbmUgc3RhbXAKKyAgICAgICAgIyBtdXN0IGJlIGluY29ycmVjdCwgcmUtdHJpZ2dlciB0aGUgZG93bmxvYWQKKyAgICAgICAgYmIudXRpbHMucmVtb3ZlKHVkLmRvbmVzdGFtcCkKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBwcmVjb21wdXRlZF9jaGVja3N1bXMgPSB7fQorICAgICMgT25seSByZS11c2UgdGhlIHByZWNvbXB1dGVkIGNoZWNrc3VtcyBpZiB0aGUgZG9uZXN0YW1wIGlzIG5ld2VyIHRoYW4gdGhlCisgICAgIyBmaWxlLiBEbyBub3QgcmVseSBvbiB0aGUgbXRpbWUgb2YgZGlyZWN0b3JpZXMsIHRob3VnaC4gSWYgdWQubG9jYWxwYXRoIGlzCisgICAgIyBhIGRpcmVjdG9yeSwgdGhlcmUgd2lsbCBwcm9iYWJseSBub3QgYmUgYW55IGNoZWNrc3VtcyBhbnl3YXkuCisgICAgaWYgKG9zLnBhdGguaXNkaXIodWQubG9jYWxwYXRoKSBvcgorICAgICAgICAgICAgb3MucGF0aC5nZXRtdGltZSh1ZC5sb2NhbHBhdGgpIDwgb3MucGF0aC5nZXRtdGltZSh1ZC5kb25lc3RhbXApKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBvcGVuKHVkLmRvbmVzdGFtcCwgInJiIikgYXMgY2FjaGVmaWxlOgorICAgICAgICAgICAgICAgIHBpY2tsZWQgPSBwaWNrbGUuVW5waWNrbGVyKGNhY2hlZmlsZSkKKyAgICAgICAgICAgICAgICBwcmVjb21wdXRlZF9jaGVja3N1bXMudXBkYXRlKHBpY2tsZWQubG9hZCgpKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICAjIEF2b2lkIHRoZSB3YXJuaW5ncyBvbiB0aGUgdXBncmFkZSBwYXRoIGZyb20gZW10cHkgZG9uZSBzdGFtcAorICAgICAgICAgICAgIyBmaWxlcyB0byB0aG9zZSBjb250YWluaW5nIHRoZSBjaGVja3N1bXMuCisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShlLCBFT0ZFcnJvcik6CisgICAgICAgICAgICAgICAgIyBJZ25vcmUgZXJyb3JzLCB0aGV5IGFyZW4ndCBmYXRhbAorICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJDb3VsZG4ndCBsb2FkIGNoZWNrc3VtcyBmcm9tIGRvbmVzdGFtcCAlczogJXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIobXNnOiAlcykiICUgKHVkLmRvbmVzdGFtcCwgdHlwZShlKS5fX25hbWVfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIoZSkpKQorCisgICAgdHJ5OgorICAgICAgICBjaGVja3N1bXMgPSB2ZXJpZnlfY2hlY2tzdW0odWQsIGQsIHByZWNvbXB1dGVkX2NoZWNrc3VtcykKKyAgICAgICAgIyBJZiB0aGUgY2FjaGUgZmlsZSBkaWQgbm90IGhhdmUgdGhlIGNoZWNrc3VtcywgY29tcHV0ZSBhbmQgc3RvcmUgdGhlbQorICAgICAgICAjIGFzIGFuIHVwZ3JhZGUgcGF0aCBmcm9tIHRoZSBwcmV2aW91cyBkb25lIHN0YW1wIGZpbGUgZm9ybWF0LgorICAgICAgICBpZiBjaGVja3N1bXMgIT0gcHJlY29tcHV0ZWRfY2hlY2tzdW1zOgorICAgICAgICAgICAgd2l0aCBvcGVuKHVkLmRvbmVzdGFtcCwgIndiIikgYXMgY2FjaGVmaWxlOgorICAgICAgICAgICAgICAgIHAgPSBwaWNrbGUuUGlja2xlcihjYWNoZWZpbGUsIHBpY2tsZS5ISUdIRVNUX1BST1RPQ09MKQorICAgICAgICAgICAgICAgIHAuZHVtcChjaGVja3N1bXMpCisgICAgICAgIHJldHVybiBUcnVlCisgICAgZXhjZXB0IENoZWNrc3VtRXJyb3IgYXMgZToKKyAgICAgICAgIyBDaGVja3N1bXMgZmFpbGVkIHRvIHZlcmlmeSwgdHJpZ2dlciByZS1kb3dubG9hZCBhbmQgcmVtb3ZlIHRoZQorICAgICAgICAjIGluY29ycmVjdCBzdGFtcCBmaWxlLgorICAgICAgICBsb2dnZXIud2FybigiQ2hlY2tzdW0gbWlzbWF0Y2ggZm9yIGxvY2FsIGZpbGUgJXNcbiIKKyAgICAgICAgICAgICAgICAgICAgIkNsZWFuaW5nIGFuZCB0cnlpbmcgYWdhaW4uIiAlIHVkLmxvY2FscGF0aCkKKyAgICAgICAgcmVuYW1lX2JhZF9jaGVja3N1bSh1ZCwgZS5jaGVja3N1bSkKKyAgICAgICAgYmIudXRpbHMucmVtb3ZlKHVkLmRvbmVzdGFtcCkKKyAgICByZXR1cm4gRmFsc2UKKworCitkZWYgdXBkYXRlX3N0YW1wKHVkLCBkKToKKyAgICAiIiIKKyAgICAgICAgZG9uZXN0YW1wIGlzIGZpbGUgc3RhbXAgaW5kaWNhdGluZyB0aGUgd2hvbGUgZmV0Y2hpbmcgaXMgZG9uZQorICAgICAgICB0aGlzIGZ1bmN0aW9uIHVwZGF0ZSB0aGUgc3RhbXAgYWZ0ZXIgdmVyaWZ5aW5nIHRoZSBjaGVja3N1bQorICAgICIiIgorICAgIGlmIG9zLnBhdGguZXhpc3RzKHVkLmRvbmVzdGFtcCk6CisgICAgICAgICMgVG91Y2ggdGhlIGRvbmUgc3RhbXAgZmlsZSB0byBzaG93IGFjdGl2ZSB1c2Ugb2YgdGhlIGRvd25sb2FkCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnV0aW1lKHVkLmRvbmVzdGFtcCwgTm9uZSkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgIyBFcnJvcnMgYXJlbid0IGZhdGFsIGhlcmUKKyAgICAgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICBjaGVja3N1bXMgPSB2ZXJpZnlfY2hlY2tzdW0odWQsIGQpCisgICAgICAgICMgU3RvcmUgdGhlIGNoZWNrc3VtcyBmb3IgbGF0ZXIgcmUtdmVyaWZpY2F0aW9uIGFnYWluc3QgdGhlIHJlY2lwZQorICAgICAgICB3aXRoIG9wZW4odWQuZG9uZXN0YW1wLCAid2IiKSBhcyBjYWNoZWZpbGU6CisgICAgICAgICAgICBwID0gcGlja2xlLlBpY2tsZXIoY2FjaGVmaWxlLCBwaWNrbGUuSElHSEVTVF9QUk9UT0NPTCkKKyAgICAgICAgICAgIHAuZHVtcChjaGVja3N1bXMpCisKK2RlZiBzdWJwcm9jZXNzX3NldHVwKCk6CisgICAgIyBQeXRob24gaW5zdGFsbHMgYSBTSUdQSVBFIGhhbmRsZXIgYnkgZGVmYXVsdC4gVGhpcyBpcyB1c3VhbGx5IG5vdCB3aGF0CisgICAgIyBub24tUHl0aG9uIHN1YnByb2Nlc3NlcyBleHBlY3QuCisgICAgIyBTSUdQSVBFIGVycm9ycyBhcmUga25vd24gaXNzdWVzIHdpdGggZ3ppcC9iYXNoCisgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHUElQRSwgc2lnbmFsLlNJR19ERkwpCisKK2RlZiBnZXRfYXV0b3JldihkKToKKyAgICAjICBvbmx5IG5vdCBjYWNoZSBzcmMgcmV2IGluIGF1dG9yZXYgY2FzZQorICAgIGlmIGQuZ2V0VmFyKCdCQl9TUkNSRVZfUE9MSUNZJywgVHJ1ZSkgIT0gImNhY2hlIjoKKyAgICAgICAgZC5zZXRWYXIoJ19fQkJfRE9OVF9DQUNIRScsICcxJykKKyAgICByZXR1cm4gIkFVVE9JTkMiCisKK2RlZiBnZXRfc3JjcmV2KGQsIG1ldGhvZF9uYW1lPSdzb3J0YWJsZV9yZXZpc2lvbicpOgorICAgICIiIgorICAgIFJldHVybiB0aGUgcmV2c2lvbiBzdHJpbmcsIHVzdWFsbHkgZm9yIHVzZSBpbiB0aGUgdmVyc2lvbiBzdHJpbmcgKFBWKSBvZiB0aGUgY3VycmVudCBwYWNrYWdlCisgICAgTW9zdCBwYWNrYWdlcyB1c3VhbGx5IG9ubHkgaGF2ZSBvbmUgU0NNIHNvIHdlIGp1c3QgcGFzcyBvbiB0aGUgY2FsbC4KKyAgICBJbiB0aGUgbXVsdGkgU0NNIGNhc2UsIHdlIGJ1aWxkIGEgdmFsdWUgYmFzZWQgb24gU1JDUkVWX0ZPUk1BVCB3aGljaCBtdXN0CisgICAgaGF2ZSBiZWVuIHNldC4KKworICAgIFRoZSBpZGVhIGhlcmUgaXMgdGhhdCB3ZSBwdXQgdGhlIHN0cmluZyAiQVVUT0lOQysiIGludG8gcmV0dXJuIHZhbHVlIGlmIHRoZSByZXZpc2lvbnMgYXJlIG5vdCAKKyAgICBpbmNyZW1lbnRhbCwgb3RoZXIgY29kZSBpcyB0aGVuIHJlc3BvbnNpYmxlIGZvciB0dXJuaW5nIHRoYXQgaW50byBhbiBpbmNyZWFzaW5nIHZhbHVlIChpZiBuZWVkZWQpCisKKyAgICBBIG1ldGhvZF9uYW1lIGNhbiBiZSBzdXBwbGllZCB0byByZXRyaWV2ZSBhbiBhbHRlcm5hdGl2ZWx5IGZvcm1hdHRlZCByZXZpc2lvbiBmcm9tIGEgZmV0Y2hlciwgaWYKKyAgICB0aGF0IGZldGNoZXIgcHJvdmlkZXMgYSBtZXRob2Qgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgdGhlIHNhbWUgc2lnbmF0dXJlIGFzIHNvcnRhYmxlX3JldmlzaW9uLgorICAgICIiIgorCisgICAgc2NtcyA9IFtdCisgICAgZmV0Y2hlciA9IEZldGNoKGQuZ2V0VmFyKCdTUkNfVVJJJywgVHJ1ZSkuc3BsaXQoKSwgZCkKKyAgICB1cmxkYXRhID0gZmV0Y2hlci51ZAorICAgIGZvciB1IGluIHVybGRhdGE6CisgICAgICAgIGlmIHVybGRhdGFbdV0ubWV0aG9kLnN1cHBvcnRzX3NyY3JldigpOgorICAgICAgICAgICAgc2Ntcy5hcHBlbmQodSkKKworICAgIGlmIGxlbihzY21zKSA9PSAwOgorICAgICAgICByYWlzZSBGZXRjaEVycm9yKCJTUkNSRVYgd2FzIHVzZWQgeWV0IG5vIHZhbGlkIFNDTSB3YXMgZm91bmQgaW4gU1JDX1VSSSIpCisKKyAgICBpZiBsZW4oc2NtcykgPT0gMSBhbmQgbGVuKHVybGRhdGFbc2Ntc1swXV0ubmFtZXMpID09IDE6CisgICAgICAgIGF1dG9pbmMsIHJldiA9IGdldGF0dHIodXJsZGF0YVtzY21zWzBdXS5tZXRob2QsIG1ldGhvZF9uYW1lKSh1cmxkYXRhW3NjbXNbMF1dLCBkLCB1cmxkYXRhW3NjbXNbMF1dLm5hbWVzWzBdKQorICAgICAgICBpZiBsZW4ocmV2KSA+IDEwOgorICAgICAgICAgICAgcmV2ID0gcmV2WzoxMF0KKyAgICAgICAgaWYgYXV0b2luYzoKKyAgICAgICAgICAgIHJldHVybiAiQVVUT0lOQysiICsgcmV2CisgICAgICAgIHJldHVybiByZXYKKworICAgICMKKyAgICAjIE11dGlwbGUgU0NNcyBhcmUgaW4gU1JDX1VSSSBzbyB3ZSByZXNvcnQgdG8gU1JDUkVWX0ZPUk1BVAorICAgICMKKyAgICBmb3JtYXQgPSBkLmdldFZhcignU1JDUkVWX0ZPUk1BVCcsIFRydWUpCisgICAgaWYgbm90IGZvcm1hdDoKKyAgICAgICAgcmFpc2UgRmV0Y2hFcnJvcigiVGhlIFNSQ1JFVl9GT1JNQVQgdmFyaWFibGUgbXVzdCBiZSBzZXQgd2hlbiBtdWx0aXBsZSBTQ01zIGFyZSB1c2VkLiIpCisKKyAgICBzZWVuYXV0b2luYyA9IEZhbHNlCisgICAgZm9yIHNjbSBpbiBzY21zOgorICAgICAgICB1ZCA9IHVybGRhdGFbc2NtXQorICAgICAgICBmb3IgbmFtZSBpbiB1ZC5uYW1lczoKKyAgICAgICAgICAgIGF1dG9pbmMsIHJldiA9IGdldGF0dHIodWQubWV0aG9kLCBtZXRob2RfbmFtZSkodWQsIGQsIG5hbWUpCisgICAgICAgICAgICBzZWVuYXV0b2luYyA9IHNlZW5hdXRvaW5jIG9yIGF1dG9pbmMKKyAgICAgICAgICAgIGlmIGxlbihyZXYpID4gMTA6CisgICAgICAgICAgICAgICAgcmV2ID0gcmV2WzoxMF0KKyAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdC5yZXBsYWNlKG5hbWUsIHJldikKKyAgICBpZiBzZWVuYXV0b2luYzoKKyAgICAgICBmb3JtYXQgPSAiQVVUT0lOQysiICsgZm9ybWF0CisKKyAgICByZXR1cm4gZm9ybWF0CisKK2RlZiBsb2NhbHBhdGgodXJsLCBkKToKKyAgICBmZXRjaGVyID0gYmIuZmV0Y2gyLkZldGNoKFt1cmxdLCBkKQorICAgIHJldHVybiBmZXRjaGVyLmxvY2FscGF0aCh1cmwpCisKK2RlZiBydW5mZXRjaGNtZChjbWQsIGQsIHF1aWV0PUZhbHNlLCBjbGVhbnVwPU5vbmUpOgorICAgICIiIgorICAgIFJ1biBjbWQgcmV0dXJuaW5nIHRoZSBjb21tYW5kIG91dHB1dAorICAgIFJhaXNlIGFuIGVycm9yIGlmIGludGVycnVwdGVkIG9yIGNtZCBmYWlscworICAgIE9wdGlvbmFsbHkgZWNobyBjb21tYW5kIG91dHB1dCB0byBzdGRvdXQKKyAgICBPcHRpb25hbGx5IHJlbW92ZSB0aGUgZmlsZXMvZGlyZWN0b3JpZXMgbGlzdGVkIGluIGNsZWFudXAgdXBvbiBmYWlsdXJlCisgICAgIiIiCisKKyAgICAjIE5lZWQgdG8gZXhwb3J0IFBBVEggYXMgYmluYXJ5IGNvdWxkIGJlIGluIG1ldGFkYXRhIHBhdGhzCisgICAgIyByYXRoZXIgdGhhbiBob3N0IHByb3ZpZGVkCisgICAgIyBBbHNvIGluY2x1ZGUgc29tZSBvdGhlciB2YXJpYWJsZXMuCisgICAgIyBGSVhNRTogU2hvdWxkIHJlYWxseSBpbmNsdWRlIGFsbCBleHBvcnQgdmFyYWlhYmxlcz8KKyAgICBleHBvcnR2YXJzID0gWydIT01FJywgJ1BBVEgnLAorICAgICAgICAgICAgICAgICAgJ0hUVFBfUFJPWFknLCAnaHR0cF9wcm94eScsCisgICAgICAgICAgICAgICAgICAnSFRUUFNfUFJPWFknLCAnaHR0cHNfcHJveHknLAorICAgICAgICAgICAgICAgICAgJ0ZUUF9QUk9YWScsICdmdHBfcHJveHknLAorICAgICAgICAgICAgICAgICAgJ0ZUUFNfUFJPWFknLCAnZnRwc19wcm94eScsCisgICAgICAgICAgICAgICAgICAnTk9fUFJPWFknLCAnbm9fcHJveHknLAorICAgICAgICAgICAgICAgICAgJ0FMTF9QUk9YWScsICdhbGxfcHJveHknLAorICAgICAgICAgICAgICAgICAgJ0dJVF9QUk9YWV9DT01NQU5EJywKKyAgICAgICAgICAgICAgICAgICdHSVRfU1NMX0NBSU5GTycsCisgICAgICAgICAgICAgICAgICAnR0lUX1NNQVJUX0hUVFAnLAorICAgICAgICAgICAgICAgICAgJ1NTSF9BVVRIX1NPQ0snLCAnU1NIX0FHRU5UX1BJRCcsCisgICAgICAgICAgICAgICAgICAnU09DS1M1X1VTRVInLCAnU09DS1M1X1BBU1NXRCddCisKKyAgICBpZiBub3QgY2xlYW51cDoKKyAgICAgICAgY2xlYW51cCA9IFtdCisKKyAgICBmb3IgdmFyIGluIGV4cG9ydHZhcnM6CisgICAgICAgIHZhbCA9IGQuZ2V0VmFyKHZhciwgVHJ1ZSkKKyAgICAgICAgaWYgdmFsOgorICAgICAgICAgICAgY21kID0gJ2V4cG9ydCAnICsgdmFyICsgJz1cIiVzXCI7ICVzJyAlICh2YWwsIGNtZCkKKworICAgIGxvZ2dlci5kZWJ1ZygxLCAiUnVubmluZyAlcyIsIGNtZCkKKworICAgIHN1Y2Nlc3MgPSBGYWxzZQorICAgIGVycm9yX21lc3NhZ2UgPSAiIgorCisgICAgdHJ5OgorICAgICAgICAob3V0cHV0LCBlcnJvcnMpID0gYmIucHJvY2Vzcy5ydW4oY21kLCBzaGVsbD1UcnVlLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBzdWNjZXNzID0gVHJ1ZQorICAgIGV4Y2VwdCBiYi5wcm9jZXNzLk5vdEZvdW5kRXJyb3IgYXMgZToKKyAgICAgICAgZXJyb3JfbWVzc2FnZSA9ICJGZXRjaCBjb21tYW5kICVzIiAlIChlLmNvbW1hbmQpCisgICAgZXhjZXB0IGJiLnByb2Nlc3MuRXhlY3V0aW9uRXJyb3IgYXMgZToKKyAgICAgICAgaWYgZS5zdGRvdXQ6CisgICAgICAgICAgICBvdXRwdXQgPSAib3V0cHV0OlxuJXNcbiVzIiAlIChlLnN0ZG91dCwgZS5zdGRlcnIpCisgICAgICAgIGVsaWYgZS5zdGRlcnI6CisgICAgICAgICAgICBvdXRwdXQgPSAib3V0cHV0OlxuJXMiICUgZS5zdGRlcnIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG91dHB1dCA9ICJubyBvdXRwdXQiCisgICAgICAgIGVycm9yX21lc3NhZ2UgPSAiRmV0Y2ggY29tbWFuZCBmYWlsZWQgd2l0aCBleGl0IGNvZGUgJXMsICVzIiAlIChlLmV4aXRjb2RlLCBvdXRwdXQpCisgICAgZXhjZXB0IGJiLnByb2Nlc3MuQ21kRXJyb3IgYXMgZToKKyAgICAgICAgZXJyb3JfbWVzc2FnZSA9ICJGZXRjaCBjb21tYW5kICVzIGNvdWxkIG5vdCBiZSBydW46XG4lcyIgJSAoZS5jb21tYW5kLCBlLm1zZykKKyAgICBpZiBub3Qgc3VjY2VzczoKKyAgICAgICAgZm9yIGYgaW4gY2xlYW51cDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBiYi51dGlscy5yZW1vdmUoZiwgVHJ1ZSkKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICByYWlzZSBGZXRjaEVycm9yKGVycm9yX21lc3NhZ2UpCisKKyAgICByZXR1cm4gb3V0cHV0CisKK2RlZiBjaGVja19uZXR3b3JrX2FjY2VzcyhkLCBpbmZvID0gIiIsIHVybCA9IE5vbmUpOgorICAgICIiIgorICAgIGxvZyByZW1vdGUgbmV0d29yayBhY2Nlc3MsIGFuZCBlcnJvciBpZiBCQl9OT19ORVRXT1JLIGlzIHNldAorICAgICIiIgorICAgIGlmIGQuZ2V0VmFyKCJCQl9OT19ORVRXT1JLIiwgVHJ1ZSkgPT0gIjEiOgorICAgICAgICByYWlzZSBOZXR3b3JrQWNjZXNzKHVybCwgaW5mbykKKyAgICBlbHNlOgorICAgICAgICBsb2dnZXIuZGVidWcoMSwgIkZldGNoZXIgYWNjZXNzZWQgdGhlIG5ldHdvcmsgd2l0aCB0aGUgY29tbWFuZCAlcyIgJSBpbmZvKQorCitkZWYgYnVpbGRfbWlycm9ydXJpcyhvcmlndWQsIG1pcnJvcnMsIGxkKToKKyAgICB1cmlzID0gW10KKyAgICB1ZHMgPSBbXQorCisgICAgcmVwbGFjZW1lbnRzID0ge30KKyAgICByZXBsYWNlbWVudHNbIlRZUEUiXSA9IG9yaWd1ZC50eXBlCisgICAgcmVwbGFjZW1lbnRzWyJIT1NUIl0gPSBvcmlndWQuaG9zdAorICAgIHJlcGxhY2VtZW50c1siUEFUSCJdID0gb3JpZ3VkLnBhdGgKKyAgICByZXBsYWNlbWVudHNbIkJBU0VOQU1FIl0gPSBvcmlndWQucGF0aC5zcGxpdCgiLyIpWy0xXQorICAgIHJlcGxhY2VtZW50c1siTUlSUk9STkFNRSJdID0gb3JpZ3VkLmhvc3QucmVwbGFjZSgnOicsJy4nKSArIG9yaWd1ZC5wYXRoLnJlcGxhY2UoJy8nLCAnLicpLnJlcGxhY2UoJyonLCAnLicpCisKKyAgICBkZWYgYWRkdXJpKHVkLCB1cmlzLCB1ZHMpOgorICAgICAgICBmb3IgbGluZSBpbiBtaXJyb3JzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIChmaW5kLCByZXBsYWNlKSA9IGxpbmUKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBuZXd1cmkgPSB1cmlfcmVwbGFjZSh1ZCwgZmluZCwgcmVwbGFjZSwgcmVwbGFjZW1lbnRzLCBsZCkKKyAgICAgICAgICAgIGlmIG5vdCBuZXd1cmkgb3IgbmV3dXJpIGluIHVyaXMgb3IgbmV3dXJpID09IG9yaWd1ZC51cmw6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgbm90IHRydXN0ZWRfbmV0d29yayhsZCwgbmV3dXJpKToKKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoMSwgIk1pcnJvciAlcyBub3QgaW4gdGhlIGxpc3Qgb2YgdHJ1c3RlZCBuZXR3b3Jrcywgc2tpcHBpbmciICUgIChuZXd1cmkpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBuZXd1ZCA9IEZldGNoRGF0YShuZXd1cmksIGxkKQorICAgICAgICAgICAgICAgIG5ld3VkLnNldHVwX2xvY2FscGF0aChsZCkKKyAgICAgICAgICAgIGV4Y2VwdCBiYi5mZXRjaDIuQkJGZXRjaEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiTWlycm9yIGZldGNoIGZhaWx1cmUgZm9yIHVybCAlcyAob3JpZ2luYWwgdXJsOiAlcykiICUgKG5ld3VyaSwgb3JpZ3VkLnVybCkpCisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDEsIHN0cihlKSkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICMgc2V0dXBfbG9jYWxwYXRoIG9mIGZpbGU6Ly8gdXJscyBtYXkgZmFpbCwgd2Ugc2hvdWxkIHN0aWxsIHNlZSAKKyAgICAgICAgICAgICAgICAgICAgIyBpZiBtaXJyb3JzIG9mIHRoZSB1cmwgZXhpc3QKKyAgICAgICAgICAgICAgICAgICAgYWRkdXJpKG5ld3VkLCB1cmlzLCB1ZHMpCisgICAgICAgICAgICAgICAgZXhjZXB0IFVuYm91bmRMb2NhbEVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgY29udGludWUgICAKKyAgICAgICAgICAgIHVyaXMuYXBwZW5kKG5ld3VyaSkKKyAgICAgICAgICAgIHVkcy5hcHBlbmQobmV3dWQpCisKKyAgICAgICAgICAgIGFkZHVyaShuZXd1ZCwgdXJpcywgdWRzKQorCisgICAgYWRkdXJpKG9yaWd1ZCwgdXJpcywgdWRzKQorCisgICAgcmV0dXJuIHVyaXMsIHVkcworCitkZWYgcmVuYW1lX2JhZF9jaGVja3N1bSh1ZCwgc3VmZml4KToKKyAgICAiIiIKKyAgICBSZW5hbWVzIGZpbGVzIHRvIGhhdmUgc3VmZml4IGZyb20gcGFyYW1ldGVyCisgICAgIiIiCisKKyAgICBpZiB1ZC5sb2NhbHBhdGggaXMgTm9uZToKKyAgICAgICAgcmV0dXJuCisKKyAgICBuZXdfbG9jYWxwYXRoID0gIiVzX2JhZC1jaGVja3N1bV8lcyIgJSAodWQubG9jYWxwYXRoLCBzdWZmaXgpCisgICAgYmIud2FybigiUmVuYW1pbmcgJXMgdG8gJXMiICUgKHVkLmxvY2FscGF0aCwgbmV3X2xvY2FscGF0aCkpCisgICAgYmIudXRpbHMubW92ZWZpbGUodWQubG9jYWxwYXRoLCBuZXdfbG9jYWxwYXRoKQorCisKK2RlZiB0cnlfbWlycm9yX3VybChmZXRjaCwgb3JpZ3VkLCB1ZCwgbGQsIGNoZWNrID0gRmFsc2UpOgorICAgICMgUmV0dXJuIG9mIE5vbmUgb3IgYSB2YWx1ZSBtZWFucyB3ZSdyZSBmaW5pc2hlZAorICAgICMgRmFsc2UgbWVhbnMgdHJ5IGFub3RoZXIgdXJsCisgICAgdHJ5OgorICAgICAgICBpZiBjaGVjazoKKyAgICAgICAgICAgIGZvdW5kID0gdWQubWV0aG9kLmNoZWNrc3RhdHVzKGZldGNoLCB1ZCwgbGQpCisgICAgICAgICAgICBpZiBmb3VuZDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZm91bmQKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIG9zLmNoZGlyKGxkLmdldFZhcigiRExfRElSIiwgVHJ1ZSkpCisKKyAgICAgICAgaWYgbm90IHZlcmlmeV9kb25lc3RhbXAodWQsIGxkLCBvcmlndWQpIG9yIHVkLm1ldGhvZC5uZWVkX3VwZGF0ZSh1ZCwgbGQpOgorICAgICAgICAgICAgdWQubWV0aG9kLmRvd25sb2FkKHVkLCBsZCkKKyAgICAgICAgICAgIGlmIGhhc2F0dHIodWQubWV0aG9kLCJidWlsZF9taXJyb3JfZGF0YSIpOgorICAgICAgICAgICAgICAgIHVkLm1ldGhvZC5idWlsZF9taXJyb3JfZGF0YSh1ZCwgbGQpCisKKyAgICAgICAgaWYgbm90IHVkLmxvY2FscGF0aCBvciBub3Qgb3MucGF0aC5leGlzdHModWQubG9jYWxwYXRoKToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIGlmIHVkLmxvY2FscGF0aCA9PSBvcmlndWQubG9jYWxwYXRoOgorICAgICAgICAgICAgcmV0dXJuIHVkLmxvY2FscGF0aAorCisgICAgICAgICMgV2UgbWF5IGJlIG9idGFpbmluZyBhIG1pcnJvciB0YXJiYWxsIHdoaWNoIG5lZWRzIGZ1cnRoZXIgcHJvY2Vzc2luZyBieSB0aGUgcmVhbCBmZXRjaGVyCisgICAgICAgICMgSWYgdGhhdCB0YXJiYWxsIGlzIGEgbG9jYWwgZmlsZTovLyB3ZSBuZWVkIHRvIHByb3ZpZGUgYSBzeW1saW5rIHRvIGl0CisgICAgICAgIGRsZGlyID0gbGQuZ2V0VmFyKCJETF9ESVIiLCBUcnVlKQorICAgICAgICBpZiBvcmlndWQubWlycm9ydGFyYmFsbCBhbmQgb3MucGF0aC5iYXNlbmFtZSh1ZC5sb2NhbHBhdGgpID09IG9zLnBhdGguYmFzZW5hbWUob3JpZ3VkLm1pcnJvcnRhcmJhbGwpIFwKKyAgICAgICAgICAgICAgICBhbmQgb3MucGF0aC5iYXNlbmFtZSh1ZC5sb2NhbHBhdGgpICE9IG9zLnBhdGguYmFzZW5hbWUob3JpZ3VkLmxvY2FscGF0aCk6CisgICAgICAgICAgICAjIENyZWF0ZSBkb25lc3RhbXAgaW4gb2xkIGZvcm1hdCB0byBhdm9pZCB0cmlnZ2VyaW5nIGEgcmUtZG93bmxvYWQKKyAgICAgICAgICAgIGJiLnV0aWxzLm1rZGlyaGllcihvcy5wYXRoLmRpcm5hbWUodWQuZG9uZXN0YW1wKSkKKyAgICAgICAgICAgIG9wZW4odWQuZG9uZXN0YW1wLCAndycpLmNsb3NlKCkKKyAgICAgICAgICAgIGRlc3QgPSBvcy5wYXRoLmpvaW4oZGxkaXIsIG9zLnBhdGguYmFzZW5hbWUodWQubG9jYWxwYXRoKSkKKyAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhkZXN0KToKKyAgICAgICAgICAgICAgICBvcy5zeW1saW5rKHVkLmxvY2FscGF0aCwgZGVzdCkKKyAgICAgICAgICAgIGlmIG5vdCB2ZXJpZnlfZG9uZXN0YW1wKG9yaWd1ZCwgbGQpIG9yIG9yaWd1ZC5tZXRob2QubmVlZF91cGRhdGUob3JpZ3VkLCBsZCk6CisgICAgICAgICAgICAgICAgb3JpZ3VkLm1ldGhvZC5kb3dubG9hZChvcmlndWQsIGxkKQorICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIob3JpZ3VkLm1ldGhvZCwiYnVpbGRfbWlycm9yX2RhdGEiKToKKyAgICAgICAgICAgICAgICAgICAgb3JpZ3VkLm1ldGhvZC5idWlsZF9taXJyb3JfZGF0YShvcmlndWQsIGxkKQorICAgICAgICAgICAgcmV0dXJuIHVkLmxvY2FscGF0aAorICAgICAgICAjIE90aGVyd2lzZSB0aGUgcmVzdWx0IGlzIGEgbG9jYWwgZmlsZTovLyBhbmQgd2Ugc3ltbGluayB0byBpdAorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMob3JpZ3VkLmxvY2FscGF0aCk6CisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzbGluayhvcmlndWQubG9jYWxwYXRoKToKKyAgICAgICAgICAgICAgICAjIEJyb2tlbiBzeW1ib2xpYyBsaW5rCisgICAgICAgICAgICAgICAgb3MudW5saW5rKG9yaWd1ZC5sb2NhbHBhdGgpCisKKyAgICAgICAgICAgIG9zLnN5bWxpbmsodWQubG9jYWxwYXRoLCBvcmlndWQubG9jYWxwYXRoKQorICAgICAgICB1cGRhdGVfc3RhbXAob3JpZ3VkLCBsZCkKKyAgICAgICAgcmV0dXJuIHVkLmxvY2FscGF0aAorCisgICAgZXhjZXB0IGJiLmZldGNoMi5OZXR3b3JrQWNjZXNzOgorICAgICAgICByYWlzZQorCisgICAgZXhjZXB0IGJiLmZldGNoMi5CQkZldGNoRXhjZXB0aW9uIGFzIGU6CisgICAgICAgIGlmIGlzaW5zdGFuY2UoZSwgQ2hlY2tzdW1FcnJvcik6CisgICAgICAgICAgICBsb2dnZXIud2FybigiTWlycm9yIGNoZWNrc3VtIGZhaWx1cmUgZm9yIHVybCAlcyAob3JpZ2luYWwgdXJsOiAlcylcbkNsZWFuaW5nIGFuZCB0cnlpbmcgYWdhaW4uIiAlICh1ZC51cmwsIG9yaWd1ZC51cmwpKQorICAgICAgICAgICAgbG9nZ2VyLndhcm4oc3RyKGUpKQorICAgICAgICAgICAgcmVuYW1lX2JhZF9jaGVja3N1bSh1ZCwgZS5jaGVja3N1bSkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGUsIE5vQ2hlY2tzdW1FcnJvcik6CisgICAgICAgICAgICByYWlzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJNaXJyb3IgZmV0Y2ggZmFpbHVyZSBmb3IgdXJsICVzIChvcmlnaW5hbCB1cmw6ICVzKSIgJSAodWQudXJsLCBvcmlndWQudXJsKSkKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCBzdHIoZSkpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHVkLm1ldGhvZC5jbGVhbih1ZCwgbGQpCisgICAgICAgIGV4Y2VwdCBVbmJvdW5kTG9jYWxFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKK2RlZiB0cnlfbWlycm9ycyhmZXRjaCwgZCwgb3JpZ3VkLCBtaXJyb3JzLCBjaGVjayA9IEZhbHNlKToKKyAgICAiIiIKKyAgICBUcnkgdG8gdXNlIGEgbWlycm9yZWQgdmVyc2lvbiBvZiB0aGUgc291cmNlcy4KKyAgICBUaGlzIG1ldGhvZCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY2FsbGVkIGJlZm9yZSB0aGUgZmV0Y2hlcnMgZ28uCisKKyAgICBkIElzIGEgYmIuZGF0YSBpbnN0YW5jZQorICAgIHVyaSBpcyB0aGUgb3JpZ2luYWwgdXJpIHdlJ3JlIHRyeWluZyB0byBkb3dubG9hZAorICAgIG1pcnJvcnMgaXMgdGhlIGxpc3Qgb2YgbWlycm9ycyB3ZSdyZSBnb2luZyB0byB0cnkKKyAgICAiIiIKKyAgICBsZCA9IGQuY3JlYXRlQ29weSgpCisKKyAgICB1cmlzLCB1ZHMgPSBidWlsZF9taXJyb3J1cmlzKG9yaWd1ZCwgbWlycm9ycywgbGQpCisKKyAgICBmb3IgaW5kZXgsIHVyaSBpbiBlbnVtZXJhdGUodXJpcyk6CisgICAgICAgIHJldCA9IHRyeV9taXJyb3JfdXJsKGZldGNoLCBvcmlndWQsIHVkc1tpbmRleF0sIGxkLCBjaGVjaykKKyAgICAgICAgaWYgcmV0ICE9IEZhbHNlOgorICAgICAgICAgICAgcmV0dXJuIHJldAorICAgIHJldHVybiBOb25lCisKK2RlZiB0cnVzdGVkX25ldHdvcmsoZCwgdXJsKToKKyAgICAiIiIKKyAgICBVc2UgYSB0cnVzdGVkIHVybCBkdXJpbmcgZG93bmxvYWQgaWYgbmV0d29ya2luZyBpcyBlbmFibGVkIGFuZAorICAgIEJCX0FMTE9XRURfTkVUV09SS1MgaXMgc2V0IGdsb2JhbGx5IG9yIGZvciBhIHNwZWNpZmljIHJlY2lwZS4KKyAgICBOb3RlOiBtb2RpZmllcyBTUkNfVVJJICYgbWlycm9ycy4KKyAgICAiIiIKKyAgICBpZiBkLmdldFZhcignQkJfTk9fTkVUV09SSycsIFRydWUpID09ICIxIjoKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIHBrZ25hbWUgPSBkLmV4cGFuZChkLmdldFZhcignUE4nLCBGYWxzZSkpCisgICAgdHJ1c3RlZF9ob3N0cyA9IGQuZ2V0VmFyRmxhZygnQkJfQUxMT1dFRF9ORVRXT1JLUycsIHBrZ25hbWUpCisKKyAgICBpZiBub3QgdHJ1c3RlZF9ob3N0czoKKyAgICAgICAgdHJ1c3RlZF9ob3N0cyA9IGQuZ2V0VmFyKCdCQl9BTExPV0VEX05FVFdPUktTJywgVHJ1ZSkKKworICAgICMgTm90IGVuYWJsZWQuCisgICAgaWYgbm90IHRydXN0ZWRfaG9zdHM6CisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBzY2hlbWUsIG5ldHdvcmssIHBhdGgsIHVzZXIsIHBhc3N3ZCwgcGFyYW0gPSBkZWNvZGV1cmwodXJsKQorCisgICAgaWYgbm90IG5ldHdvcms6CisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBuZXR3b3JrID0gbmV0d29yay5sb3dlcigpCisKKyAgICBmb3IgaG9zdCBpbiB0cnVzdGVkX2hvc3RzLnNwbGl0KCIgIik6CisgICAgICAgIGhvc3QgPSBob3N0Lmxvd2VyKCkKKyAgICAgICAgaWYgaG9zdC5zdGFydHN3aXRoKCIqLiIpIGFuZCAoIi4iICsgbmV0d29yaykuZW5kc3dpdGgoaG9zdFsxOl0pOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgaWYgaG9zdCA9PSBuZXR3b3JrOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgIHJldHVybiBGYWxzZQorCitkZWYgc3JjcmV2X2ludGVybmFsX2hlbHBlcih1ZCwgZCwgbmFtZSk6CisgICAgIiIiCisgICAgUmV0dXJuOgorICAgICAgICBhKSBhIHNvdXJjZSByZXZpc2lvbiBpZiBzcGVjaWZpZWQKKyAgICAgICAgYikgbGF0ZXN0IHJldmlzaW9uIGlmIFNSQ1JFVj0iQVVUT0lOQyIKKyAgICAgICAgYykgTm9uZSBpZiBub3Qgc3BlY2lmaWVkCisgICAgIiIiCisKKyAgICBzcmNyZXYgPSBOb25lCisgICAgcG4gPSBkLmdldFZhcigiUE4iLCBUcnVlKQorICAgIGF0dGVtcHRzID0gW10KKyAgICBpZiBuYW1lICE9ICcnIGFuZCBwbjoKKyAgICAgICAgYXR0ZW1wdHMuYXBwZW5kKCJTUkNSRVZfJXNfcG4tJXMiICUgKG5hbWUsIHBuKSkKKyAgICBpZiBuYW1lICE9ICcnOgorICAgICAgICBhdHRlbXB0cy5hcHBlbmQoIlNSQ1JFVl8lcyIgJSBuYW1lKQorICAgIGlmIHBuOgorICAgICAgICBhdHRlbXB0cy5hcHBlbmQoIlNSQ1JFVl9wbi0lcyIgJSBwbikKKyAgICBhdHRlbXB0cy5hcHBlbmQoIlNSQ1JFViIpCisKKyAgICBmb3IgYSBpbiBhdHRlbXB0czoKKyAgICAgICAgc3JjcmV2ID0gZC5nZXRWYXIoYSwgVHJ1ZSkgICAgICAgICAgICAgIAorICAgICAgICBpZiBzcmNyZXYgYW5kIHNyY3JldiAhPSAiSU5WQUxJRCI6CisgICAgICAgICAgICBicmVhaworCisgICAgaWYgJ3JldicgaW4gdWQucGFybSBhbmQgJ3RhZycgaW4gdWQucGFybToKKyAgICAgICAgcmFpc2UgRmV0Y2hFcnJvcigiUGxlYXNlIHNwZWNpZnkgYSA7cmV2PSBwYXJhbWV0ZXIgb3IgYSA7dGFnPSBwYXJhbWV0ZXIgaW4gdGhlIHVybCAlcyBidXQgbm90IGJvdGguIiAlICh1ZC51cmwpKQorCisgICAgaWYgJ3JldicgaW4gdWQucGFybSBvciAndGFnJyBpbiB1ZC5wYXJtOgorICAgICAgICBpZiAncmV2JyBpbiB1ZC5wYXJtOgorICAgICAgICAgICAgcGFybXJldiA9IHVkLnBhcm1bJ3JldiddCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXJtcmV2ID0gdWQucGFybVsndGFnJ10KKyAgICAgICAgaWYgc3JjcmV2ID09ICJJTlZBTElEIiBvciBub3Qgc3JjcmV2OgorICAgICAgICAgICAgcmV0dXJuIHBhcm1yZXYKKyAgICAgICAgaWYgc3JjcmV2ICE9IHBhcm1yZXY6CisgICAgICAgICAgICByYWlzZSBGZXRjaEVycm9yKCJDb25mbGljdGluZyByZXZpc2lvbnMgKCVzIGZyb20gU1JDUkVWIGFuZCAlcyBmcm9tIHRoZSB1cmwpIGZvdW5kLCBwbGVhc2Ugc3BjaWZ5IG9uZSB2YWxpZCB2YWx1ZSIgJSAoc3JjcmV2LCBwYXJtcmV2KSkKKyAgICAgICAgcmV0dXJuIHBhcm1yZXYKKworICAgIGlmIHNyY3JldiA9PSAiSU5WQUxJRCIgb3Igbm90IHNyY3JldjoKKyAgICAgICAgcmFpc2UgRmV0Y2hFcnJvcigiUGxlYXNlIHNldCBhIHZhbGlkIFNSQ1JFViBmb3IgdXJsICVzIChwb3NzaWJsZSBrZXkgbmFtZXMgYXJlICVzLCBvciB1c2UgYSA7cmV2PVggVVJMIHBhcmFtZXRlcikiICUgKHN0cihhdHRlbXB0cyksIHVkLnVybCksIHVkLnVybCkKKyAgICBpZiBzcmNyZXYgPT0gIkFVVE9JTkMiOgorICAgICAgICBzcmNyZXYgPSB1ZC5tZXRob2QubGF0ZXN0X3JldmlzaW9uKHVkLCBkLCBuYW1lKQorCisgICAgcmV0dXJuIHNyY3JldgorCitkZWYgZ2V0X2NoZWNrc3VtX2ZpbGVfbGlzdChkKToKKyAgICAiIiIgR2V0IGEgbGlzdCBvZiBmaWxlcyBjaGVja3N1bSBpbiBTUkNfVVJJCisKKyAgICBSZXR1cm5zIHRoZSByZXNvbHZlZCBsb2NhbCBwYXRocyBvZiBhbGwgbG9jYWwgZmlsZSBlbnRyaWVzIGluCisgICAgU1JDX1VSSSBhcyBhIHNwYWNlLXNlcGFyYXRlZCBzdHJpbmcKKyAgICAiIiIKKyAgICBmZXRjaCA9IEZldGNoKFtdLCBkLCBjYWNoZSA9IEZhbHNlLCBsb2NhbG9ubHkgPSBUcnVlKQorCisgICAgZGxfZGlyID0gZC5nZXRWYXIoJ0RMX0RJUicsIFRydWUpCisgICAgZmlsZWxpc3QgPSBbXQorICAgIGZvciB1IGluIGZldGNoLnVybHM6CisgICAgICAgIHVkID0gZmV0Y2gudWRbdV0KKworICAgICAgICBpZiB1ZCBhbmQgaXNpbnN0YW5jZSh1ZC5tZXRob2QsIGxvY2FsLkxvY2FsKToKKyAgICAgICAgICAgIHBhdGhzID0gdWQubWV0aG9kLmxvY2FscGF0aHModWQsIGQpCisgICAgICAgICAgICBmb3IgZiBpbiBwYXRoczoKKyAgICAgICAgICAgICAgICBwdGggPSB1ZC5kZWNvZGVkdXJsCisgICAgICAgICAgICAgICAgaWYgJyonIGluIHB0aDoKKyAgICAgICAgICAgICAgICAgICAgZiA9IG9zLnBhdGguam9pbihvcy5wYXRoLmFic3BhdGgoZiksIHB0aCkKKyAgICAgICAgICAgICAgICBpZiBmLnN0YXJ0c3dpdGgoZGxfZGlyKToKKyAgICAgICAgICAgICAgICAgICAgIyBUaGUgbG9jYWwgZmV0Y2hlcidzIGJlaGF2aW91ciBpcyB0byByZXR1cm4gYSBwYXRoIHVuZGVyIERMX0RJUiBpZiBpdCBjb3VsZG4ndCBmaW5kIHRoZSBmaWxlIGFueXdoZXJlIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZik6CisgICAgICAgICAgICAgICAgICAgICAgICBiYi53YXJuKCJHZXR0aW5nIGNoZWNrc3VtIGZvciAlcyBTUkNfVVJJIGVudHJ5ICVzOiBmaWxlIG5vdCBmb3VuZCBleGNlcHQgaW4gRExfRElSIiAlIChkLmdldFZhcignUE4nLCBUcnVlKSwgb3MucGF0aC5iYXNlbmFtZShmKSkpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBiYi53YXJuKCJVbmFibGUgdG8gZ2V0IGNoZWNrc3VtIGZvciAlcyBTUkNfVVJJIGVudHJ5ICVzOiBmaWxlIGNvdWxkIG5vdCBiZSBmb3VuZCIgJSAoZC5nZXRWYXIoJ1BOJywgVHJ1ZSksIG9zLnBhdGguYmFzZW5hbWUoZikpKQorICAgICAgICAgICAgICAgIGZpbGVsaXN0LmFwcGVuZChmICsgIjoiICsgc3RyKG9zLnBhdGguZXhpc3RzKGYpKSkKKworICAgIHJldHVybiAiICIuam9pbihmaWxlbGlzdCkKKworZGVmIGdldF9maWxlX2NoZWNrc3VtcyhmaWxlbGlzdCwgcG4pOgorICAgICIiIkdldCBhIGxpc3Qgb2YgdGhlIGNoZWNrc3VtcyBmb3IgYSBsaXN0IG9mIGxvY2FsIGZpbGVzCisKKyAgICBSZXR1cm5zIHRoZSBjaGVja3N1bXMgZm9yIGEgbGlzdCBvZiBsb2NhbCBmaWxlcywgY2FjaGluZyB0aGUgcmVzdWx0cyBhcworICAgIGl0IHByb2NlZWRzCisKKyAgICAiIiIKKworICAgIGRlZiBjaGVja3N1bV9maWxlKGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBjaGVja3N1bSA9IF9jaGVja3N1bV9jYWNoZS5nZXRfY2hlY2tzdW0oZikKKyAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKKyAgICAgICAgICAgIGJiLndhcm4oIlVuYWJsZSB0byBnZXQgY2hlY2tzdW0gZm9yICVzIFNSQ19VUkkgZW50cnkgJXM6ICVzIiAlIChwbiwgb3MucGF0aC5iYXNlbmFtZShmKSwgZSkpCisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICByZXR1cm4gY2hlY2tzdW0KKworICAgIGRlZiBjaGVja3N1bV9kaXIocHRoKToKKyAgICAgICAgIyBIYW5kbGUgZGlyZWN0b3JpZXMgcmVjdXJzaXZlbHkKKyAgICAgICAgZGlyY2hlY2tzdW1zID0gW10KKyAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsocHRoKToKKyAgICAgICAgICAgIGZvciBuYW1lIGluIGZpbGVzOgorICAgICAgICAgICAgICAgIGZ1bGxwdGggPSBvcy5wYXRoLmpvaW4ocm9vdCwgbmFtZSkKKyAgICAgICAgICAgICAgICBjaGVja3N1bSA9IGNoZWNrc3VtX2ZpbGUoZnVsbHB0aCkKKyAgICAgICAgICAgICAgICBpZiBjaGVja3N1bToKKyAgICAgICAgICAgICAgICAgICAgZGlyY2hlY2tzdW1zLmFwcGVuZCgoZnVsbHB0aCwgY2hlY2tzdW0pKQorICAgICAgICByZXR1cm4gZGlyY2hlY2tzdW1zCisKKyAgICBjaGVja3N1bXMgPSBbXQorICAgIGZvciBwdGggaW4gZmlsZWxpc3Quc3BsaXQoKToKKyAgICAgICAgZXhpc3QgPSBwdGguc3BsaXQoIjoiKVsxXQorICAgICAgICBpZiBleGlzdCA9PSAiRmFsc2UiOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgcHRoID0gcHRoLnNwbGl0KCI6IilbMF0KKyAgICAgICAgaWYgJyonIGluIHB0aDoKKyAgICAgICAgICAgICMgSGFuZGxlIGdsb2JzCisgICAgICAgICAgICBmb3IgZiBpbiBnbG9iLmdsb2IocHRoKToKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGYpOgorICAgICAgICAgICAgICAgICAgICBjaGVja3N1bXMuZXh0ZW5kKGNoZWNrc3VtX2RpcihmKSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBjaGVja3N1bSA9IGNoZWNrc3VtX2ZpbGUoZikKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tzdW1zLmFwcGVuZCgoZiwgY2hlY2tzdW0pKQorICAgICAgICBlbGlmIG9zLnBhdGguaXNkaXIocHRoKToKKyAgICAgICAgICAgIGNoZWNrc3Vtcy5leHRlbmQoY2hlY2tzdW1fZGlyKHB0aCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjaGVja3N1bSA9IGNoZWNrc3VtX2ZpbGUocHRoKQorICAgICAgICAgICAgY2hlY2tzdW1zLmFwcGVuZCgocHRoLCBjaGVja3N1bSkpCisKKyAgICBjaGVja3N1bXMuc29ydChrZXk9b3BlcmF0b3IuaXRlbWdldHRlcigxKSkKKyAgICByZXR1cm4gY2hlY2tzdW1zCisKKworY2xhc3MgRmV0Y2hEYXRhKG9iamVjdCk6CisgICAgIiIiCisgICAgQSBjbGFzcyB3aGljaCByZXByZXNlbnRzIHRoZSBmZXRjaGVyIHN0YXRlIGZvciBhIGdpdmVuIFVSSS4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdXJsLCBkLCBsb2NhbG9ubHkgPSBGYWxzZSk6CisgICAgICAgICMgbG9jYWxwYXRoIGlzIHRoZSBsb2NhdGlvbiBvZiBhIGRvd25sb2FkZWQgcmVzdWx0LiBJZiBub3Qgc2V0LCB0aGUgZmlsZSBpcyBsb2NhbC4KKyAgICAgICAgc2VsZi5kb25lc3RhbXAgPSBOb25lCisgICAgICAgIHNlbGYubG9jYWxmaWxlID0gIiIKKyAgICAgICAgc2VsZi5sb2NhbHBhdGggPSBOb25lCisgICAgICAgIHNlbGYubG9ja2ZpbGUgPSBOb25lCisgICAgICAgIHNlbGYubWlycm9ydGFyYmFsbCA9IE5vbmUKKyAgICAgICAgc2VsZi5iYXNlbmFtZSA9IE5vbmUKKyAgICAgICAgc2VsZi5iYXNlcGF0aCA9IE5vbmUKKyAgICAgICAgKHNlbGYudHlwZSwgc2VsZi5ob3N0LCBzZWxmLnBhdGgsIHNlbGYudXNlciwgc2VsZi5wc3dkLCBzZWxmLnBhcm0pID0gZGVjb2RldXJsKGRhdGEuZXhwYW5kKHVybCwgZCkpCisgICAgICAgIHNlbGYuZGF0ZSA9IHNlbGYuZ2V0U1JDRGF0ZShkKQorICAgICAgICBzZWxmLnVybCA9IHVybAorICAgICAgICBpZiBub3Qgc2VsZi51c2VyIGFuZCAidXNlciIgaW4gc2VsZi5wYXJtOgorICAgICAgICAgICAgc2VsZi51c2VyID0gc2VsZi5wYXJtWyJ1c2VyIl0KKyAgICAgICAgaWYgbm90IHNlbGYucHN3ZCBhbmQgInBzd2QiIGluIHNlbGYucGFybToKKyAgICAgICAgICAgIHNlbGYucHN3ZCA9IHNlbGYucGFybVsicHN3ZCJdCisgICAgICAgIHNlbGYuc2V0dXAgPSBGYWxzZQorCisgICAgICAgIGlmICJuYW1lIiBpbiBzZWxmLnBhcm06CisgICAgICAgICAgICBzZWxmLm1kNV9uYW1lID0gIiVzLm1kNXN1bSIgJSBzZWxmLnBhcm1bIm5hbWUiXQorICAgICAgICAgICAgc2VsZi5zaGEyNTZfbmFtZSA9ICIlcy5zaGEyNTZzdW0iICUgc2VsZi5wYXJtWyJuYW1lIl0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYubWQ1X25hbWUgPSAibWQ1c3VtIgorICAgICAgICAgICAgc2VsZi5zaGEyNTZfbmFtZSA9ICJzaGEyNTZzdW0iCisgICAgICAgIGlmIHNlbGYubWQ1X25hbWUgaW4gc2VsZi5wYXJtOgorICAgICAgICAgICAgc2VsZi5tZDVfZXhwZWN0ZWQgPSBzZWxmLnBhcm1bc2VsZi5tZDVfbmFtZV0KKyAgICAgICAgZWxpZiBzZWxmLnR5cGUgbm90IGluIFsiaHR0cCIsICJodHRwcyIsICJmdHAiLCAiZnRwcyIsICJzZnRwIl06CisgICAgICAgICAgICBzZWxmLm1kNV9leHBlY3RlZCA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYubWQ1X2V4cGVjdGVkID0gZC5nZXRWYXJGbGFnKCJTUkNfVVJJIiwgc2VsZi5tZDVfbmFtZSkKKyAgICAgICAgaWYgc2VsZi5zaGEyNTZfbmFtZSBpbiBzZWxmLnBhcm06CisgICAgICAgICAgICBzZWxmLnNoYTI1Nl9leHBlY3RlZCA9IHNlbGYucGFybVtzZWxmLnNoYTI1Nl9uYW1lXQorICAgICAgICBlbGlmIHNlbGYudHlwZSBub3QgaW4gWyJodHRwIiwgImh0dHBzIiwgImZ0cCIsICJmdHBzIiwgInNmdHAiXToKKyAgICAgICAgICAgIHNlbGYuc2hhMjU2X2V4cGVjdGVkID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zaGEyNTZfZXhwZWN0ZWQgPSBkLmdldFZhckZsYWcoIlNSQ19VUkkiLCBzZWxmLnNoYTI1Nl9uYW1lKQorICAgICAgICBzZWxmLmlnbm9yZV9jaGVja3N1bXMgPSBGYWxzZQorCisgICAgICAgIHNlbGYubmFtZXMgPSBzZWxmLnBhcm0uZ2V0KCJuYW1lIiwnZGVmYXVsdCcpLnNwbGl0KCcsJykKKworICAgICAgICBzZWxmLm1ldGhvZCA9IE5vbmUKKyAgICAgICAgZm9yIG0gaW4gbWV0aG9kczoKKyAgICAgICAgICAgIGlmIG0uc3VwcG9ydHMoc2VsZiwgZCk6CisgICAgICAgICAgICAgICAgc2VsZi5tZXRob2QgPSBtCisgICAgICAgICAgICAgICAgYnJlYWsgICAgICAgICAgICAgICAgCisKKyAgICAgICAgaWYgbm90IHNlbGYubWV0aG9kOgorICAgICAgICAgICAgcmFpc2UgTm9NZXRob2RFcnJvcih1cmwpCisKKyAgICAgICAgaWYgbG9jYWxvbmx5IGFuZCBub3QgaXNpbnN0YW5jZShzZWxmLm1ldGhvZCwgbG9jYWwuTG9jYWwpOgorICAgICAgICAgICAgcmFpc2UgTm9uTG9jYWxNZXRob2QoKQorCisgICAgICAgIGlmIHNlbGYucGFybS5nZXQoInByb3RvIiwgTm9uZSkgYW5kICJwcm90b2NvbCIgbm90IGluIHNlbGYucGFybToKKyAgICAgICAgICAgIGxvZ2dlci53YXJuKCdDb25zaWRlciB1cGRhdGluZyAlcyByZWNpcGUgdG8gdXNlICJwcm90b2NvbCIgbm90ICJwcm90byIgaW4gU1JDX1VSSS4nLCBkLmdldFZhcignUE4nLCBUcnVlKSkKKyAgICAgICAgICAgIHNlbGYucGFybVsicHJvdG9jb2wiXSA9IHNlbGYucGFybS5nZXQoInByb3RvIiwgTm9uZSkKKworICAgICAgICBpZiBoYXNhdHRyKHNlbGYubWV0aG9kLCAidXJsZGF0YV9pbml0Iik6CisgICAgICAgICAgICBzZWxmLm1ldGhvZC51cmxkYXRhX2luaXQoc2VsZiwgZCkKKworICAgICAgICBpZiAibG9jYWxwYXRoIiBpbiBzZWxmLnBhcm06CisgICAgICAgICAgICAjIGlmIHVzZXIgc2V0cyBsb2NhbHBhdGggZm9yIGZpbGUsIHVzZSBpdCBpbnN0ZWFkLgorICAgICAgICAgICAgc2VsZi5sb2NhbHBhdGggPSBzZWxmLnBhcm1bImxvY2FscGF0aCJdCisgICAgICAgICAgICBzZWxmLmJhc2VuYW1lID0gb3MucGF0aC5iYXNlbmFtZShzZWxmLmxvY2FscGF0aCkKKyAgICAgICAgZWxpZiBzZWxmLmxvY2FsZmlsZToKKyAgICAgICAgICAgIHNlbGYubG9jYWxwYXRoID0gc2VsZi5tZXRob2QubG9jYWxwYXRoKHNlbGYsIGQpCisKKyAgICAgICAgZGxkaXIgPSBkLmdldFZhcigiRExfRElSIiwgVHJ1ZSkKKyAgICAgICAgIyBOb3RlOiAuZG9uZSBhbmQgLmxvY2sgZmlsZXMgc2hvdWxkIGFsd2F5cyBiZSBpbiBETF9ESVIgd2hlcmVhcyBsb2NhbHBhdGggbWF5IG5vdCBiZS4KKyAgICAgICAgaWYgc2VsZi5sb2NhbHBhdGggYW5kIHNlbGYubG9jYWxwYXRoLnN0YXJ0c3dpdGgoZGxkaXIpOgorICAgICAgICAgICAgYmFzZXBhdGggPSBzZWxmLmxvY2FscGF0aAorICAgICAgICBlbGlmIHNlbGYubG9jYWxwYXRoOgorICAgICAgICAgICAgYmFzZXBhdGggPSBkbGRpciArIG9zLnNlcCArIG9zLnBhdGguYmFzZW5hbWUoc2VsZi5sb2NhbHBhdGgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBiYXNlcGF0aCA9IGRsZGlyICsgb3Muc2VwICsgKHNlbGYuYmFzZXBhdGggb3Igc2VsZi5iYXNlbmFtZSkKKyAgICAgICAgc2VsZi5kb25lc3RhbXAgPSBiYXNlcGF0aCArICcuZG9uZScKKyAgICAgICAgc2VsZi5sb2NrZmlsZSA9IGJhc2VwYXRoICsgJy5sb2NrJworCisgICAgZGVmIHNldHVwX3Jldmlzb25zKHNlbGYsIGQpOgorICAgICAgICBzZWxmLnJldmlzaW9ucyA9IHt9CisgICAgICAgIGZvciBuYW1lIGluIHNlbGYubmFtZXM6CisgICAgICAgICAgICBzZWxmLnJldmlzaW9uc1tuYW1lXSA9IHNyY3Jldl9pbnRlcm5hbF9oZWxwZXIoc2VsZiwgZCwgbmFtZSkKKworICAgICAgICAjIGFkZCBjb21wYXRpYmlsaXR5IGNvZGUgZm9yIG5vbiBuYW1lIHNwZWNpZmllZCBjYXNlCisgICAgICAgIGlmIGxlbihzZWxmLm5hbWVzKSA9PSAxOgorICAgICAgICAgICAgc2VsZi5yZXZpc2lvbiA9IHNlbGYucmV2aXNpb25zW3NlbGYubmFtZXNbMF1dCisKKyAgICBkZWYgc2V0dXBfbG9jYWxwYXRoKHNlbGYsIGQpOgorICAgICAgICBpZiBub3Qgc2VsZi5sb2NhbHBhdGg6CisgICAgICAgICAgICBzZWxmLmxvY2FscGF0aCA9IHNlbGYubWV0aG9kLmxvY2FscGF0aChzZWxmLCBkKQorCisgICAgZGVmIGdldFNSQ0RhdGUoc2VsZiwgZCk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gdGhlIFNSQyBEYXRlIGZvciB0aGUgY29tcG9uZW50CisKKyAgICAgICAgZCB0aGUgYmIuZGF0YSBtb2R1bGUKKyAgICAgICAgIiIiCisgICAgICAgIGlmICJzcmNkYXRlIiBpbiBzZWxmLnBhcm06CisgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJtWydzcmNkYXRlJ10KKworICAgICAgICBwbiA9IGQuZ2V0VmFyKCJQTiIsIFRydWUpCisKKyAgICAgICAgaWYgcG46CisgICAgICAgICAgICByZXR1cm4gZC5nZXRWYXIoIlNSQ0RBVEVfJXMiICUgcG4sIFRydWUpIG9yIGQuZ2V0VmFyKCJTUkNEQVRFIiwgVHJ1ZSkgb3IgZC5nZXRWYXIoIkRBVEUiLCBUcnVlKQorCisgICAgICAgIHJldHVybiBkLmdldFZhcigiU1JDREFURSIsIFRydWUpIG9yIGQuZ2V0VmFyKCJEQVRFIiwgVHJ1ZSkKKworY2xhc3MgRmV0Y2hNZXRob2Qob2JqZWN0KToKKyAgICAiIiJCYXNlIGNsYXNzIGZvciAnZmV0Y2gnaW5nIGRhdGEiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1cmxzPU5vbmUpOgorICAgICAgICBzZWxmLnVybHMgPSBbXQorCisgICAgZGVmIHN1cHBvcnRzKHNlbGYsIHVybGRhdGEsIGQpOgorICAgICAgICAiIiIKKyAgICAgICAgQ2hlY2sgdG8gc2VlIGlmIHRoaXMgZmV0Y2ggY2xhc3Mgc3VwcG9ydHMgYSBnaXZlbiB1cmwuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gMAorCisgICAgZGVmIGxvY2FscGF0aChzZWxmLCB1cmxkYXRhLCBkKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiB0aGUgbG9jYWwgZmlsZW5hbWUgb2YgYSBnaXZlbiB1cmwgYXNzdW1pbmcgYSBzdWNjZXNzZnVsIGZldGNoLgorICAgICAgICBDYW4gYWxzbyBzZXR1cCB2YXJpYWJsZXMgaW4gdXJsZGF0YSBmb3IgdXNlIGluIGdvIChzYXZpbmcgY29kZSBkdXBsaWNhdGlvbgorICAgICAgICBhbmQgZHVwbGljYXRlIGNvZGUgZXhlY3V0aW9uKQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihkYXRhLmdldFZhcigiRExfRElSIiwgZCwgVHJ1ZSksIHVybGRhdGEubG9jYWxmaWxlKQorCisgICAgZGVmIHN1cHBvcnRzX2NoZWNrc3VtKHNlbGYsIHVybGRhdGEpOgorICAgICAgICAiIiIKKyAgICAgICAgSXMgbG9jYWxwYXRoIHNvbWV0aGluZyB0aGF0IGNhbiBiZSByZXByZXNlbnRlZCBieSBhIGNoZWNrc3VtPworICAgICAgICAiIiIKKworICAgICAgICAjIFdlIGNhbm5vdCBjb21wdXRlIGNoZWNrc3VtcyBmb3IgZGlyZWN0b3JpZXMKKyAgICAgICAgaWYgb3MucGF0aC5pc2Rpcih1cmxkYXRhLmxvY2FscGF0aCkgPT0gVHJ1ZToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBpZiB1cmxkYXRhLmxvY2FscGF0aC5maW5kKCIqIikgIT0gLTE6CisgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiByZWNvbW1lbmRzX2NoZWNrc3VtKHNlbGYsIHVybGRhdGEpOgorICAgICAgICAiIiIKKyAgICAgICAgSXMgdGhlIGJhY2tlbmQgb24gd2hlcmUgY2hlY2tzdW1taW5nIGlzIHJlY29tbWVuZGVkIChzaG91bGQgd2FybmluZ3MgCisgICAgICAgIGJlIGRpc3BsYXllZCBpZiB0aGVyZSBpcyBubyBjaGVja3N1bSk/CisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBfc3RyaXBfbGVhZGluZ19zbGFzaGVzKHNlbGYsIHJlbHBhdGgpOgorICAgICAgICAiIiIKKyAgICAgICAgUmVtb3ZlIGxlYWRpbmcgc2xhc2ggYXMgb3MucGF0aC5qb2luIGNhbid0IGNvcGUKKyAgICAgICAgIiIiCisgICAgICAgIHdoaWxlIG9zLnBhdGguaXNhYnMocmVscGF0aCk6CisgICAgICAgICAgICByZWxwYXRoID0gcmVscGF0aFsxOl0KKyAgICAgICAgcmV0dXJuIHJlbHBhdGgKKworICAgIGRlZiBzZXRVcmxzKHNlbGYsIHVybHMpOgorICAgICAgICBzZWxmLl9fdXJscyA9IHVybHMKKworICAgIGRlZiBnZXRVcmxzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX3VybHMKKworICAgIHVybHMgPSBwcm9wZXJ0eShnZXRVcmxzLCBzZXRVcmxzLCBOb25lLCAiVXJscyBwcm9wZXJ0eSIpCisKKyAgICBkZWYgbmVlZF91cGRhdGUoc2VsZiwgdWQsIGQpOgorICAgICAgICAiIiIKKyAgICAgICAgRm9yY2UgYSBmZXRjaCwgZXZlbiBpZiBsb2NhbHBhdGggZXhpc3RzPworICAgICAgICAiIiIKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHModWQubG9jYWxwYXRoKToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHN1cHBvcnRzX3NyY3JldihzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFRoZSBmZXRjaGVyIHN1cHBvcnRzIGF1dG8gc291cmNlIHJldmlzaW9ucyAoU1JDUkVWKQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgZG93bmxvYWQoc2VsZiwgdXJsZGF0YSwgZCk6CisgICAgICAgICIiIgorICAgICAgICBGZXRjaCB1cmxzCisgICAgICAgIEFzc3VtZXMgbG9jYWxwYXRoIHdhcyBjYWxsZWQgZmlyc3QKKyAgICAgICAgIiIiCisgICAgICAgIHJhaXNlIE5vTWV0aG9kRXJyb3IodXJsKQorCisgICAgZGVmIHVucGFjayhzZWxmLCB1cmxkYXRhLCByb290ZGlyLCBkYXRhKToKKyAgICAgICAgaXRlcmF0ZSA9IEZhbHNlCisgICAgICAgIGZpbGUgPSB1cmxkYXRhLmxvY2FscGF0aAorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHVucGFjayA9IGJiLnV0aWxzLnRvX2Jvb2xlYW4odXJsZGF0YS5wYXJtLmdldCgndW5wYWNrJyksIFRydWUpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIGV4YzoKKyAgICAgICAgICAgIGJiLmZhdGFsKCJJbnZhbGlkIHZhbHVlIGZvciAndW5wYWNrJyBwYXJhbWV0ZXIgZm9yICVzOiAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgKGZpbGUsIHVybGRhdGEucGFybS5nZXQoJ3VucGFjaycpKSkKKworICAgICAgICBiYXNlLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGUpCisgICAgICAgIGlmIGV4dCBpbiBbJy5neicsICcuYnoyJywgJy5aJywgJy54eicsICcubHonXToKKyAgICAgICAgICAgIGVmaWxlID0gb3MucGF0aC5qb2luKHJvb3RkaXIsIG9zLnBhdGguYmFzZW5hbWUoYmFzZSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlZmlsZSA9IGZpbGUKKyAgICAgICAgY21kID0gTm9uZQorCisgICAgICAgIGlmIHVucGFjazoKKyAgICAgICAgICAgIGlmIGZpbGUuZW5kc3dpdGgoJy50YXInKToKKyAgICAgICAgICAgICAgICBjbWQgPSAndGFyIHggLS1uby1zYW1lLW93bmVyIC1mICVzJyAlIGZpbGUKKyAgICAgICAgICAgIGVsaWYgZmlsZS5lbmRzd2l0aCgnLnRneicpIG9yIGZpbGUuZW5kc3dpdGgoJy50YXIuZ3onKSBvciBmaWxlLmVuZHN3aXRoKCcudGFyLlonKToKKyAgICAgICAgICAgICAgICBjbWQgPSAndGFyIHh6IC0tbm8tc2FtZS1vd25lciAtZiAlcycgJSBmaWxlCisgICAgICAgICAgICBlbGlmIGZpbGUuZW5kc3dpdGgoJy50YnonKSBvciBmaWxlLmVuZHN3aXRoKCcudGJ6MicpIG9yIGZpbGUuZW5kc3dpdGgoJy50YXIuYnoyJyk6CisgICAgICAgICAgICAgICAgY21kID0gJ2J6aXAyIC1kYyAlcyB8IHRhciB4IC0tbm8tc2FtZS1vd25lciAtZiAtJyAlIGZpbGUKKyAgICAgICAgICAgIGVsaWYgZmlsZS5lbmRzd2l0aCgnLmd6Jykgb3IgZmlsZS5lbmRzd2l0aCgnLlonKSBvciBmaWxlLmVuZHN3aXRoKCcueicpOgorICAgICAgICAgICAgICAgIGNtZCA9ICdnemlwIC1kYyAlcyA+ICVzJyAlIChmaWxlLCBlZmlsZSkKKyAgICAgICAgICAgIGVsaWYgZmlsZS5lbmRzd2l0aCgnLmJ6MicpOgorICAgICAgICAgICAgICAgIGNtZCA9ICdiemlwMiAtZGMgJXMgPiAlcycgJSAoZmlsZSwgZWZpbGUpCisgICAgICAgICAgICBlbGlmIGZpbGUuZW5kc3dpdGgoJy50YXIueHonKToKKyAgICAgICAgICAgICAgICBjbWQgPSAneHogLWRjICVzIHwgdGFyIHggLS1uby1zYW1lLW93bmVyIC1mIC0nICUgZmlsZQorICAgICAgICAgICAgZWxpZiBmaWxlLmVuZHN3aXRoKCcueHonKToKKyAgICAgICAgICAgICAgICBjbWQgPSAneHogLWRjICVzID4gJXMnICUgKGZpbGUsIGVmaWxlKQorICAgICAgICAgICAgZWxpZiBmaWxlLmVuZHN3aXRoKCcudGFyLmx6Jyk6CisgICAgICAgICAgICAgICAgY21kID0gJ2x6aXAgLWRjICVzIHwgdGFyIHggLS1uby1zYW1lLW93bmVyIC1mIC0nICUgZmlsZQorICAgICAgICAgICAgZWxpZiBmaWxlLmVuZHN3aXRoKCcubHonKToKKyAgICAgICAgICAgICAgICBjbWQgPSAnbHppcCAtZGMgJXMgPiAlcycgJSAoZmlsZSwgZWZpbGUpCisgICAgICAgICAgICBlbGlmIGZpbGUuZW5kc3dpdGgoJy56aXAnKSBvciBmaWxlLmVuZHN3aXRoKCcuamFyJyk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBkb3MgPSBiYi51dGlscy50b19ib29sZWFuKHVybGRhdGEucGFybS5nZXQoJ2RvcycpLCBGYWxzZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBleGM6CisgICAgICAgICAgICAgICAgICAgIGJiLmZhdGFsKCJJbnZhbGlkIHZhbHVlIGZvciAnZG9zJyBwYXJhbWV0ZXIgZm9yICVzOiAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZSwgdXJsZGF0YS5wYXJtLmdldCgnZG9zJykpKQorICAgICAgICAgICAgICAgIGNtZCA9ICd1bnppcCAtcSAtbycKKyAgICAgICAgICAgICAgICBpZiBkb3M6CisgICAgICAgICAgICAgICAgICAgIGNtZCA9ICclcyAtYScgJSBjbWQKKyAgICAgICAgICAgICAgICBjbWQgPSAiJXMgJyVzJyIgJSAoY21kLCBmaWxlKQorICAgICAgICAgICAgZWxpZiBmaWxlLmVuZHN3aXRoKCcucnBtJykgb3IgZmlsZS5lbmRzd2l0aCgnLnNycG0nKToKKyAgICAgICAgICAgICAgICBpZiAnZXh0cmFjdCcgaW4gdXJsZGF0YS5wYXJtOgorICAgICAgICAgICAgICAgICAgICB1bnBhY2tfZmlsZSA9IHVybGRhdGEucGFybS5nZXQoJ2V4dHJhY3QnKQorICAgICAgICAgICAgICAgICAgICBjbWQgPSAncnBtMmNwaW8uc2ggJXMgfCBjcGlvIC1pZCAlcycgJSAoZmlsZSwgdW5wYWNrX2ZpbGUpCisgICAgICAgICAgICAgICAgICAgIGl0ZXJhdGUgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIGl0ZXJhdGVfZmlsZSA9IHVucGFja19maWxlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgY21kID0gJ3JwbTJjcGlvLnNoICVzIHwgY3BpbyAtaWQnICUgKGZpbGUpCisgICAgICAgICAgICBlbGlmIGZpbGUuZW5kc3dpdGgoJy5kZWInKSBvciBmaWxlLmVuZHN3aXRoKCcuaXBrJyk6CisgICAgICAgICAgICAgICAgY21kID0gJ2FyIC1wICVzIGRhdGEudGFyLmd6IHwgemNhdCB8IHRhciAtLW5vLXNhbWUtb3duZXIgLXhwZiAtJyAlIGZpbGUKKworICAgICAgICBpZiBub3QgdW5wYWNrIG9yIG5vdCBjbWQ6CisgICAgICAgICAgICAjIElmIGZpbGUgPT0gZGVzdCwgdGhlbiBhdm9pZCBhbnkgY29waWVzLCBhcyB3ZSBhbHJlYWR5IHB1dCB0aGUgZmlsZSBpbnRvIGRlc3QhCisgICAgICAgICAgICBkZXN0ID0gb3MucGF0aC5qb2luKHJvb3RkaXIsIG9zLnBhdGguYmFzZW5hbWUoZmlsZSkpCisgICAgICAgICAgICBpZiAoZmlsZSAhPSBkZXN0KSBhbmQgbm90IChvcy5wYXRoLmV4aXN0cyhkZXN0KSBhbmQgb3MucGF0aC5zYW1lZmlsZShmaWxlLCBkZXN0KSk6CisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihmaWxlKToKKyAgICAgICAgICAgICAgICAgICAgIyBJZiBmb3IgZXhhbXBsZSB3ZSdyZSBhc2tlZCB0byBjb3B5IGZpbGU6Ly9mb28vYmFyLCB3ZSBuZWVkIHRvIHVucGFjayB0aGUgcmVzdWx0IGludG8gZm9vL2JhcgorICAgICAgICAgICAgICAgICAgICBiYXNlcGF0aCA9IGdldGF0dHIodXJsZGF0YSwgImJhc2VwYXRoIiwgTm9uZSkKKyAgICAgICAgICAgICAgICAgICAgZGVzdGRpciA9ICIuIgorICAgICAgICAgICAgICAgICAgICBpZiBiYXNlcGF0aCBhbmQgYmFzZXBhdGguZW5kc3dpdGgoIi8iKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VwYXRoID0gYmFzZXBhdGgucnN0cmlwKCIvIikKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBiYXNlcGF0aDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VwYXRoID0gb3MucGF0aC5kaXJuYW1lKGJhc2VwYXRoKQorICAgICAgICAgICAgICAgICAgICBpZiBiYXNlcGF0aCBhbmQgYmFzZXBhdGguZmluZCgiLyIpICE9IC0xOgorICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGRpciA9IGJhc2VwYXRoWzpiYXNlcGF0aC5yZmluZCgnLycpXQorICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGRpciA9IGRlc3RkaXIuc3RyaXAoJy8nKQorICAgICAgICAgICAgICAgICAgICBpZiBkZXN0ZGlyICE9ICIuIiBhbmQgbm90IG9zLmFjY2VzcygiJXMvJXMiICUgKHJvb3RkaXIsIGRlc3RkaXIpLCBvcy5GX09LKToKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zLm1ha2VkaXJzKCIlcy8lcyIgJSAocm9vdGRpciwgZGVzdGRpcikpCisgICAgICAgICAgICAgICAgICAgIGNtZCA9ICdjcCAtZnBQUiAlcyAlcy8lcy8nICUgKGZpbGUsIHJvb3RkaXIsIGRlc3RkaXIpCisgICAgICAgICAgICAgICAgICAgICNjbWQgPSAndGFyIC1jZiAtIC1DICIlZCIgLXBzIC4gfCB0YXIgLXhmIC0gLUMgIiVzLyVzLyInICUgKGZpbGUsIHJvb3RkaXIsIGRlc3RkaXIpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyBUaGUgImRlc3RkaXIiIGhhbmRsaW5nIHdhcyBzcGVjaWZpY2FsbHkgZG9uZSBmb3IgRklMRVNQQVRICisgICAgICAgICAgICAgICAgICAgICMgaXRlbXMuICBTbywgb25seSBkbyBzbyBmb3IgZmlsZTovLyBlbnRyaWVzLgorICAgICAgICAgICAgICAgICAgICBpZiB1cmxkYXRhLnR5cGUgPT0gImZpbGUiIGFuZCB1cmxkYXRhLnBhdGguZmluZCgiLyIpICE9IC0xOgorICAgICAgICAgICAgICAgICAgICAgICBkZXN0ZGlyID0gdXJsZGF0YS5wYXRoLnJzcGxpdCgiLyIsIDEpWzBdCisgICAgICAgICAgICAgICAgICAgICAgIGlmIHVybGRhdGEucGFybS5nZXQoJ3N1YmRpcicpICE9IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RkaXIgPSB1cmxkYXRhLnBhcm0uZ2V0KCdzdWJkaXInKSArICIvIiArIGRlc3RkaXIKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgaWYgdXJsZGF0YS5wYXJtLmdldCgnc3ViZGlyJykgIT0gTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGRpciA9IHVybGRhdGEucGFybS5nZXQoJ3N1YmRpcicpCisgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RkaXIgPSAiLiIKKyAgICAgICAgICAgICAgICAgICAgYmIudXRpbHMubWtkaXJoaWVyKCIlcy8lcyIgJSAocm9vdGRpciwgZGVzdGRpcikpCisgICAgICAgICAgICAgICAgICAgIGNtZCA9ICdjcCAtZiAlcyAlcy8lcy8nICUgKGZpbGUsIHJvb3RkaXIsIGRlc3RkaXIpCisKKyAgICAgICAgaWYgbm90IGNtZDoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgQ2hhbmdlIHRvIHN1YmRpciBiZWZvcmUgZXhlY3V0aW5nIGNvbW1hbmQKKyAgICAgICAgc2F2ZV9jd2QgPSBvcy5nZXRjd2QoKTsKKyAgICAgICAgb3MuY2hkaXIocm9vdGRpcikKKyAgICAgICAgaWYgJ3N1YmRpcicgaW4gdXJsZGF0YS5wYXJtOgorICAgICAgICAgICAgbmV3ZGlyID0gKCIlcy8lcyIgJSAocm9vdGRpciwgdXJsZGF0YS5wYXJtLmdldCgnc3ViZGlyJykpKQorICAgICAgICAgICAgYmIudXRpbHMubWtkaXJoaWVyKG5ld2RpcikKKyAgICAgICAgICAgIG9zLmNoZGlyKG5ld2RpcikKKworICAgICAgICBwYXRoID0gZGF0YS5nZXRWYXIoJ1BBVEgnLCBUcnVlKQorICAgICAgICBpZiBwYXRoOgorICAgICAgICAgICAgY21kID0gIlBBVEg9XCIlc1wiICVzIiAlIChwYXRoLCBjbWQpCisgICAgICAgIGJiLm5vdGUoIlVucGFja2luZyAlcyB0byAlcy8iICUgKGZpbGUsIG9zLmdldGN3ZCgpKSkKKyAgICAgICAgcmV0ID0gc3VicHJvY2Vzcy5jYWxsKGNtZCwgcHJlZXhlY19mbj1zdWJwcm9jZXNzX3NldHVwLCBzaGVsbD1UcnVlKQorCisgICAgICAgIG9zLmNoZGlyKHNhdmVfY3dkKQorCisgICAgICAgIGlmIHJldCAhPSAwOgorICAgICAgICAgICAgcmFpc2UgVW5wYWNrRXJyb3IoIlVucGFjayBjb21tYW5kICVzIGZhaWxlZCB3aXRoIHJldHVybiB2YWx1ZSAlcyIgJSAoY21kLCByZXQpLCB1cmxkYXRhLnVybCkKKworICAgICAgICBpZiBpdGVyYXRlIGlzIFRydWU6CisgICAgICAgICAgICBpdGVyYXRlX3VybGRhdGEgPSB1cmxkYXRhCisgICAgICAgICAgICBpdGVyYXRlX3VybGRhdGEubG9jYWxwYXRoID0gIiVzLyVzIiAlIChyb290ZGlyLCBpdGVyYXRlX2ZpbGUpCisgICAgICAgICAgICBzZWxmLnVucGFjayh1cmxkYXRhLCByb290ZGlyLCBkYXRhKQorCisgICAgICAgIHJldHVybgorCisgICAgZGVmIGNsZWFuKHNlbGYsIHVybGRhdGEsIGQpOgorICAgICAgICAiIiIKKyAgICAgICAgQ2xlYW4gYW55IGV4aXN0aW5nIGZ1bGwgb3IgcGFydGlhbCBkb3dubG9hZAorICAgICAgICAiIiIKKyAgICAgICAgYmIudXRpbHMucmVtb3ZlKHVybGRhdGEubG9jYWxwYXRoKQorCisgICAgZGVmIHRyeV9wcmVtaXJyb3Ioc2VsZiwgdXJsZGF0YSwgZCk6CisgICAgICAgICIiIgorICAgICAgICBTaG91bGQgcHJlbWlycm9ycyBiZSB1c2VkPworICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBjaGVja3N0YXR1cyhzZWxmLCBmZXRjaCwgdXJsZGF0YSwgZCk6CisgICAgICAgICIiIgorICAgICAgICBDaGVjayB0aGUgc3RhdHVzIG9mIGEgVVJMCisgICAgICAgIEFzc3VtZXMgbG9jYWxwYXRoIHdhcyBjYWxsZWQgZmlyc3QKKyAgICAgICAgIiIiCisgICAgICAgIGxvZ2dlci5pbmZvKCJVUkwgJXMgY291bGQgbm90IGJlIGNoZWNrZWQgZm9yIHN0YXR1cyBzaW5jZSBubyBtZXRob2QgZXhpc3RzLiIsIHVybCkKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBsYXRlc3RfcmV2aXNpb24oc2VsZiwgdWQsIGQsIG5hbWUpOgorICAgICAgICAiIiIKKyAgICAgICAgTG9vayBpbiB0aGUgY2FjaGUgZm9yIHRoZSBsYXRlc3QgcmV2aXNpb24sIGlmIG5vdCBwcmVzZW50IGFzayB0aGUgU0NNLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZiwgIl9sYXRlc3RfcmV2aXNpb24iKToKKyAgICAgICAgICAgIHJhaXNlIFBhcmFtZXRlckVycm9yKCJUaGUgZmV0Y2hlciBmb3IgdGhpcyBVUkwgZG9lcyBub3Qgc3VwcG9ydCBfbGF0ZXN0X3JldmlzaW9uIiwgdXJsKQorCisgICAgICAgIHJldnMgPSBiYi5wZXJzaXN0X2RhdGEucGVyc2lzdCgnQkJfVVJJX0hFQURSRVZTJywgZCkKKyAgICAgICAga2V5ID0gc2VsZi5nZW5lcmF0ZV9yZXZpc2lvbl9rZXkodWQsIGQsIG5hbWUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiByZXZzW2tleV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcmV2c1trZXldID0gcmV2ID0gc2VsZi5fbGF0ZXN0X3JldmlzaW9uKHVkLCBkLCBuYW1lKQorICAgICAgICAgICAgcmV0dXJuIHJldgorCisgICAgZGVmIHNvcnRhYmxlX3JldmlzaW9uKHNlbGYsIHVkLCBkLCBuYW1lKToKKyAgICAgICAgbGF0ZXN0X3JldiA9IHNlbGYuX2J1aWxkX3JldmlzaW9uKHVkLCBkLCBuYW1lKQorICAgICAgICByZXR1cm4gVHJ1ZSwgc3RyKGxhdGVzdF9yZXYpCisKKyAgICBkZWYgZ2VuZXJhdGVfcmV2aXNpb25fa2V5KHNlbGYsIHVkLCBkLCBuYW1lKToKKyAgICAgICAga2V5ID0gc2VsZi5fcmV2aXNpb25fa2V5KHVkLCBkLCBuYW1lKQorICAgICAgICByZXR1cm4gIiVzLSVzIiAlIChrZXksIGQuZ2V0VmFyKCJQTiIsIFRydWUpIG9yICIiKQorCitjbGFzcyBGZXRjaChvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1cmxzLCBkLCBjYWNoZSA9IFRydWUsIGxvY2Fsb25seSA9IEZhbHNlLCBjb25uZWN0aW9uX2NhY2hlID0gTm9uZSk6CisgICAgICAgIGlmIGxvY2Fsb25seSBhbmQgY2FjaGU6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oImJiLmZldGNoMi5GZXRjaC5fX2luaXRfXzogY2Fubm90IHNldCBjYWNoZSBhbmQgbG9jYWxvbmx5IGF0IHNhbWUgdGltZSIpCisKKyAgICAgICAgaWYgbGVuKHVybHMpID09IDA6CisgICAgICAgICAgICB1cmxzID0gZC5nZXRWYXIoIlNSQ19VUkkiLCBUcnVlKS5zcGxpdCgpCisgICAgICAgIHNlbGYudXJscyA9IHVybHMKKyAgICAgICAgc2VsZi5kID0gZAorICAgICAgICBzZWxmLnVkID0ge30KKyAgICAgICAgc2VsZi5jb25uZWN0aW9uX2NhY2hlID0gY29ubmVjdGlvbl9jYWNoZQorCisgICAgICAgIGZuID0gZC5nZXRWYXIoJ0ZJTEUnLCBUcnVlKQorICAgICAgICBpZiBjYWNoZSBhbmQgZm4gYW5kIGZuIGluIHVybGRhdGFfY2FjaGU6CisgICAgICAgICAgICBzZWxmLnVkID0gdXJsZGF0YV9jYWNoZVtmbl0KKworICAgICAgICBmb3IgdXJsIGluIHVybHM6CisgICAgICAgICAgICBpZiB1cmwgbm90IGluIHNlbGYudWQ6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLnVkW3VybF0gPSBGZXRjaERhdGEodXJsLCBkLCBsb2NhbG9ubHkpCisgICAgICAgICAgICAgICAgZXhjZXB0IE5vbkxvY2FsTWV0aG9kOgorICAgICAgICAgICAgICAgICAgICBpZiBsb2NhbG9ubHk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnVkW3VybF0gPSBOb25lCisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgaWYgZm4gYW5kIGNhY2hlOgorICAgICAgICAgICAgdXJsZGF0YV9jYWNoZVtmbl0gPSBzZWxmLnVkCisKKyAgICBkZWYgbG9jYWxwYXRoKHNlbGYsIHVybCk6CisgICAgICAgIGlmIHVybCBub3QgaW4gc2VsZi51cmxzOgorICAgICAgICAgICAgc2VsZi51ZFt1cmxdID0gRmV0Y2hEYXRhKHVybCwgc2VsZi5kKQorCisgICAgICAgIHNlbGYudWRbdXJsXS5zZXR1cF9sb2NhbHBhdGgoc2VsZi5kKQorICAgICAgICByZXR1cm4gc2VsZi5kLmV4cGFuZChzZWxmLnVkW3VybF0ubG9jYWxwYXRoKQorCisgICAgZGVmIGxvY2FscGF0aHMoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBsaXN0IG9mIHRoZSBsb2NhbCBmaWxlbmFtZXMsIGFzc3VtaW5nIHN1Y2Nlc3NmdWwgZmV0Y2gKKyAgICAgICAgIiIiCisgICAgICAgIGxvY2FsID0gW10KKworICAgICAgICBmb3IgdSBpbiBzZWxmLnVybHM6CisgICAgICAgICAgICB1ZCA9IHNlbGYudWRbdV0KKyAgICAgICAgICAgIHVkLnNldHVwX2xvY2FscGF0aChzZWxmLmQpCisgICAgICAgICAgICBsb2NhbC5hcHBlbmQodWQubG9jYWxwYXRoKQorCisgICAgICAgIHJldHVybiBsb2NhbAorCisgICAgZGVmIGRvd25sb2FkKHNlbGYsIHVybHM9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBGZXRjaCBhbGwgdXJscworICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IHVybHM6CisgICAgICAgICAgICB1cmxzID0gc2VsZi51cmxzCisKKyAgICAgICAgbmV0d29yayA9IHNlbGYuZC5nZXRWYXIoIkJCX05PX05FVFdPUksiLCBUcnVlKQorICAgICAgICBwcmVtaXJyb3Jvbmx5ID0gKHNlbGYuZC5nZXRWYXIoIkJCX0ZFVENIX1BSRU1JUlJPUk9OTFkiLCBUcnVlKSA9PSAiMSIpCisKKyAgICAgICAgZm9yIHUgaW4gdXJsczoKKyAgICAgICAgICAgIHVkID0gc2VsZi51ZFt1XQorICAgICAgICAgICAgdWQuc2V0dXBfbG9jYWxwYXRoKHNlbGYuZCkKKyAgICAgICAgICAgIG0gPSB1ZC5tZXRob2QKKyAgICAgICAgICAgIGxvY2FscGF0aCA9ICIiCisKKyAgICAgICAgICAgIGxmID0gYmIudXRpbHMubG9ja2ZpbGUodWQubG9ja2ZpbGUpCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmQuc2V0VmFyKCJCQl9OT19ORVRXT1JLIiwgbmV0d29yaykKKyAKKyAgICAgICAgICAgICAgICBpZiB2ZXJpZnlfZG9uZXN0YW1wKHVkLCBzZWxmLmQpIGFuZCBub3QgbS5uZWVkX3VwZGF0ZSh1ZCwgc2VsZi5kKToKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxwYXRoID0gdWQubG9jYWxwYXRoCisgICAgICAgICAgICAgICAgZWxpZiBtLnRyeV9wcmVtaXJyb3IodWQsIHNlbGYuZCk6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiVHJ5aW5nIFBSRU1JUlJPUlMiKQorICAgICAgICAgICAgICAgICAgICBtaXJyb3JzID0gbWlycm9yX2Zyb21fc3RyaW5nKHNlbGYuZC5nZXRWYXIoJ1BSRU1JUlJPUlMnLCBUcnVlKSkKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxwYXRoID0gdHJ5X21pcnJvcnMoc2VsZiwgc2VsZi5kLCB1ZCwgbWlycm9ycywgRmFsc2UpCisKKyAgICAgICAgICAgICAgICBpZiBwcmVtaXJyb3Jvbmx5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmQuc2V0VmFyKCJCQl9OT19ORVRXT1JLIiwgIjEiKQorCisgICAgICAgICAgICAgICAgb3MuY2hkaXIoc2VsZi5kLmdldFZhcigiRExfRElSIiwgVHJ1ZSkpCisKKyAgICAgICAgICAgICAgICBmaXJzdGVyciA9IE5vbmUKKyAgICAgICAgICAgICAgICB2ZXJpZmllZF9zdGFtcCA9IHZlcmlmeV9kb25lc3RhbXAodWQsIHNlbGYuZCkKKyAgICAgICAgICAgICAgICBpZiBub3QgbG9jYWxwYXRoIGFuZCAobm90IHZlcmlmaWVkX3N0YW1wIG9yIG0ubmVlZF91cGRhdGUodWQsIHNlbGYuZCkpOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgdHJ1c3RlZF9uZXR3b3JrKHNlbGYuZCwgdWQudXJsKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBVbnRydXN0ZWRVcmwodWQudXJsKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJUcnlpbmcgVXBzdHJlYW0iKQorICAgICAgICAgICAgICAgICAgICAgICAgbS5kb3dubG9hZCh1ZCwgc2VsZi5kKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihtLCAiYnVpbGRfbWlycm9yX2RhdGEiKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLmJ1aWxkX21pcnJvcl9kYXRhKHVkLCBzZWxmLmQpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbHBhdGggPSB1ZC5sb2NhbHBhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICMgZWFybHkgY2hlY2tzdW0gdmVyaWZ5LCBzbyB0aGF0IGlmIGNoZWNrc3VtIG1pc21hdGNoZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAjIGZldGNoZXIgc3RpbGwgaGF2ZSBjaGFuY2UgdG8gZmV0Y2ggZnJvbSBtaXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZV9zdGFtcCh1ZCwgc2VsZi5kKQorCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBiYi5mZXRjaDIuTmV0d29ya0FjY2VzczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEJCRmV0Y2hFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZSwgQ2hlY2tzdW1FcnJvcik6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIkNoZWNrc3VtIGZhaWx1cmUgZW5jb3VudGVyZWQgd2l0aCBkb3dubG9hZCBvZiAlcyAtIHdpbGwgYXR0ZW1wdCBvdGhlciBzb3VyY2VzIGlmIGF2YWlsYWJsZSIgJSB1KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCBzdHIoZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lX2JhZF9jaGVja3N1bSh1ZCwgZS5jaGVja3N1bSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShlLCBOb0NoZWNrc3VtRXJyb3IpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gZmV0Y2ggVVJMICVzLCBhdHRlbXB0aW5nIE1JUlJPUlMgaWYgYXZhaWxhYmxlJyAlIHUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDEsIHN0cihlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ZXJyID0gZQorICAgICAgICAgICAgICAgICAgICAgICAgIyBSZW1vdmUgYW55IGluY29tcGxldGUgZmV0Y2gKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCB2ZXJpZmllZF9zdGFtcDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLmNsZWFuKHVkLCBzZWxmLmQpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoMSwgIlRyeWluZyBNSVJST1JTIikKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pcnJvcnMgPSBtaXJyb3JfZnJvbV9zdHJpbmcoc2VsZi5kLmdldFZhcignTUlSUk9SUycsIFRydWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxwYXRoID0gdHJ5X21pcnJvcnMoc2VsZiwgc2VsZi5kLCB1ZCwgbWlycm9ycykKKworICAgICAgICAgICAgICAgIGlmIG5vdCBsb2NhbHBhdGggb3IgKChub3Qgb3MucGF0aC5leGlzdHMobG9jYWxwYXRoKSkgYW5kIGxvY2FscGF0aC5maW5kKCIqIikgPT0gLTEpOgorICAgICAgICAgICAgICAgICAgICBpZiBmaXJzdGVycjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihzdHIoZmlyc3RlcnIpKQorICAgICAgICAgICAgICAgICAgICByYWlzZSBGZXRjaEVycm9yKCJVbmFibGUgdG8gZmV0Y2ggVVJMIGZyb20gYW55IHNvdXJjZS4iLCB1KQorCisgICAgICAgICAgICAgICAgdXBkYXRlX3N0YW1wKHVkLCBzZWxmLmQpCisKKyAgICAgICAgICAgIGV4Y2VwdCBCQkZldGNoRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShlLCBDaGVja3N1bUVycm9yKToKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJDaGVja3N1bSBmYWlsdXJlIGZldGNoaW5nICVzIiAlIHUpCisgICAgICAgICAgICAgICAgcmFpc2UKKworICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBiYi51dGlscy51bmxvY2tmaWxlKGxmKQorCisgICAgZGVmIGNoZWNrc3RhdHVzKHNlbGYsIHVybHM9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBDaGVjayBhbGwgdXJscyBleGlzdCB1cHN0cmVhbQorICAgICAgICAiIiIKKworICAgICAgICBpZiBub3QgdXJsczoKKyAgICAgICAgICAgIHVybHMgPSBzZWxmLnVybHMKKworICAgICAgICBmb3IgdSBpbiB1cmxzOgorICAgICAgICAgICAgdWQgPSBzZWxmLnVkW3VdCisgICAgICAgICAgICB1ZC5zZXR1cF9sb2NhbHBhdGgoc2VsZi5kKQorICAgICAgICAgICAgbSA9IHVkLm1ldGhvZAorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJUZXN0aW5nIFVSTCAlcyIsIHUpCisgICAgICAgICAgICAjIEZpcnN0IHRyeSBjaGVja2luZyB1cmksIHUsIGZyb20gUFJFTUlSUk9SUworICAgICAgICAgICAgbWlycm9ycyA9IG1pcnJvcl9mcm9tX3N0cmluZyhzZWxmLmQuZ2V0VmFyKCdQUkVNSVJST1JTJywgVHJ1ZSkpCisgICAgICAgICAgICByZXQgPSB0cnlfbWlycm9ycyhzZWxmLCBzZWxmLmQsIHVkLCBtaXJyb3JzLCBUcnVlKQorICAgICAgICAgICAgaWYgbm90IHJldDoKKyAgICAgICAgICAgICAgICAjIE5leHQgdHJ5IGNoZWNraW5nIGZyb20gdGhlIG9yaWdpbmFsIHVyaSwgdQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gbS5jaGVja3N0YXR1cyhzZWxmLCB1ZCwgc2VsZi5kKQorICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgIyBGaW5hbGx5LCB0cnkgY2hlY2tpbmcgdXJpLCB1LCBmcm9tIE1JUlJPUlMKKyAgICAgICAgICAgICAgICAgICAgbWlycm9ycyA9IG1pcnJvcl9mcm9tX3N0cmluZyhzZWxmLmQuZ2V0VmFyKCdNSVJST1JTJywgVHJ1ZSkpCisgICAgICAgICAgICAgICAgICAgIHJldCA9IHRyeV9taXJyb3JzKHNlbGYsIHNlbGYuZCwgdWQsIG1pcnJvcnMsIFRydWUpCisKKyAgICAgICAgICAgIGlmIG5vdCByZXQ6CisgICAgICAgICAgICAgICAgcmFpc2UgRmV0Y2hFcnJvcigiVVJMICVzIGRvZXNuJ3Qgd29yayIgJSB1LCB1KQorCisgICAgZGVmIHVucGFjayhzZWxmLCByb290LCB1cmxzPU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgQ2hlY2sgYWxsIHVybHMgZXhpc3QgdXBzdHJlYW0KKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgbm90IHVybHM6CisgICAgICAgICAgICB1cmxzID0gc2VsZi51cmxzCisKKyAgICAgICAgZm9yIHUgaW4gdXJsczoKKyAgICAgICAgICAgIHVkID0gc2VsZi51ZFt1XQorICAgICAgICAgICAgdWQuc2V0dXBfbG9jYWxwYXRoKHNlbGYuZCkKKworICAgICAgICAgICAgaWYgc2VsZi5kLmV4cGFuZChzZWxmLmxvY2FscGF0aCkgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiB1ZC5sb2NrZmlsZToKKyAgICAgICAgICAgICAgICBsZiA9IGJiLnV0aWxzLmxvY2tmaWxlKHVkLmxvY2tmaWxlKQorCisgICAgICAgICAgICB1ZC5tZXRob2QudW5wYWNrKHVkLCByb290LCBzZWxmLmQpCisKKyAgICAgICAgICAgIGlmIHVkLmxvY2tmaWxlOgorICAgICAgICAgICAgICAgIGJiLnV0aWxzLnVubG9ja2ZpbGUobGYpCisKKyAgICBkZWYgY2xlYW4oc2VsZiwgdXJscz1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIENsZWFuIGZpbGVzIHRoYXQgdGhlIGZldGNoZXIgZ2V0cyBvciBwbGFjZXMKKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgbm90IHVybHM6CisgICAgICAgICAgICB1cmxzID0gc2VsZi51cmxzCisKKyAgICAgICAgZm9yIHVybCBpbiB1cmxzOgorICAgICAgICAgICAgaWYgdXJsIG5vdCBpbiBzZWxmLnVkOgorICAgICAgICAgICAgICAgIHNlbGYudWRbdXJsXSA9IEZldGNoRGF0YSh1cmwsIGQpCisgICAgICAgICAgICB1ZCA9IHNlbGYudWRbdXJsXQorICAgICAgICAgICAgdWQuc2V0dXBfbG9jYWxwYXRoKHNlbGYuZCkKKworICAgICAgICAgICAgaWYgbm90IHVkLmxvY2FsZmlsZSBhbmQgdWQubG9jYWxwYXRoIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgdWQubG9ja2ZpbGU6CisgICAgICAgICAgICAgICAgbGYgPSBiYi51dGlscy5sb2NrZmlsZSh1ZC5sb2NrZmlsZSkKKworICAgICAgICAgICAgdWQubWV0aG9kLmNsZWFuKHVkLCBzZWxmLmQpCisgICAgICAgICAgICBpZiB1ZC5kb25lc3RhbXA6CisgICAgICAgICAgICAgICAgYmIudXRpbHMucmVtb3ZlKHVkLmRvbmVzdGFtcCkKKworICAgICAgICAgICAgaWYgdWQubG9ja2ZpbGU6CisgICAgICAgICAgICAgICAgYmIudXRpbHMudW5sb2NrZmlsZShsZikKKworY2xhc3MgRmV0Y2hDb25uZWN0aW9uQ2FjaGUob2JqZWN0KToKKyAgICAiIiIKKyAgICAgICAgQSBjbGFzcyB3aGljaCByZXByZXNlbnRzIGFuIGNvbnRhaW5lciBmb3Igc29ja2V0IGNvbm5lY3Rpb25zLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5jYWNoZSA9IHt9CisKKyAgICBkZWYgZ2V0X2Nvbm5lY3Rpb25fbmFtZShzZWxmLCBob3N0LCBwb3J0KToKKyAgICAgICAgcmV0dXJuIGhvc3QgKyAnOicgKyBzdHIocG9ydCkKKworICAgIGRlZiBhZGRfY29ubmVjdGlvbihzZWxmLCBob3N0LCBwb3J0LCBjb25uZWN0aW9uKToKKyAgICAgICAgY24gPSBzZWxmLmdldF9jb25uZWN0aW9uX25hbWUoaG9zdCwgcG9ydCkKKworICAgICAgICBpZiBjbiBub3QgaW4gc2VsZi5jYWNoZToKKyAgICAgICAgICAgIHNlbGYuY2FjaGVbY25dID0gY29ubmVjdGlvbgorCisgICAgZGVmIGdldF9jb25uZWN0aW9uKHNlbGYsIGhvc3QsIHBvcnQpOgorICAgICAgICBjb25uZWN0aW9uID0gTm9uZQorCisgICAgICAgIGNuID0gc2VsZi5nZXRfY29ubmVjdGlvbl9uYW1lKGhvc3QsIHBvcnQpCisgICAgICAgIGlmIGNuIGluIHNlbGYuY2FjaGU6CisgICAgICAgICAgICBjb25uZWN0aW9uID0gc2VsZi5jYWNoZVtjbl0KKworICAgICAgICByZXR1cm4gY29ubmVjdGlvbgorCisgICAgZGVmIHJlbW92ZV9jb25uZWN0aW9uKHNlbGYsIGhvc3QsIHBvcnQpOgorICAgICAgICBjbiA9IHNlbGYuZ2V0X2Nvbm5lY3Rpb25fbmFtZShob3N0LCBwb3J0KQorICAgICAgICBpZiBjbiBpbiBzZWxmLmNhY2hlOgorICAgICAgICAgICAgc2VsZi5jYWNoZVtjbl0uY2xvc2UoKQorICAgICAgICAgICAgZGVsIHNlbGYuY2FjaGVbY25dCisKKyAgICBkZWYgY2xvc2VfY29ubmVjdGlvbnMoc2VsZik6CisgICAgICAgIGZvciBjbiBpbiBzZWxmLmNhY2hlLmtleXMoKToKKyAgICAgICAgICAgIHNlbGYuY2FjaGVbY25dLmNsb3NlKCkKKyAgICAgICAgICAgIGRlbCBzZWxmLmNhY2hlW2NuXQorCitmcm9tIC4gaW1wb3J0IGN2cworZnJvbSAuIGltcG9ydCBnaXQKK2Zyb20gLiBpbXBvcnQgZ2l0c20KK2Zyb20gLiBpbXBvcnQgZ2l0YW5uZXgKK2Zyb20gLiBpbXBvcnQgbG9jYWwKK2Zyb20gLiBpbXBvcnQgc3ZuCitmcm9tIC4gaW1wb3J0IHdnZXQKK2Zyb20gLiBpbXBvcnQgc3NoCitmcm9tIC4gaW1wb3J0IHNmdHAKK2Zyb20gLiBpbXBvcnQgcGVyZm9yY2UKK2Zyb20gLiBpbXBvcnQgYnpyCitmcm9tIC4gaW1wb3J0IGhnCitmcm9tIC4gaW1wb3J0IG9zYworZnJvbSAuIGltcG9ydCByZXBvCitmcm9tIC4gaW1wb3J0IGNsZWFyY2FzZQorCittZXRob2RzLmFwcGVuZChsb2NhbC5Mb2NhbCgpKQorbWV0aG9kcy5hcHBlbmQod2dldC5XZ2V0KCkpCittZXRob2RzLmFwcGVuZChzdm4uU3ZuKCkpCittZXRob2RzLmFwcGVuZChnaXQuR2l0KCkpCittZXRob2RzLmFwcGVuZChnaXRzbS5HaXRTTSgpKQorbWV0aG9kcy5hcHBlbmQoZ2l0YW5uZXguR2l0QU5ORVgoKSkKK21ldGhvZHMuYXBwZW5kKGN2cy5DdnMoKSkKK21ldGhvZHMuYXBwZW5kKHNzaC5TU0goKSkKK21ldGhvZHMuYXBwZW5kKHNmdHAuU0ZUUCgpKQorbWV0aG9kcy5hcHBlbmQocGVyZm9yY2UuUGVyZm9yY2UoKSkKK21ldGhvZHMuYXBwZW5kKGJ6ci5CenIoKSkKK21ldGhvZHMuYXBwZW5kKGhnLkhnKCkpCittZXRob2RzLmFwcGVuZChvc2MuT3NjKCkpCittZXRob2RzLmFwcGVuZChyZXBvLlJlcG8oKSkKK21ldGhvZHMuYXBwZW5kKGNsZWFyY2FzZS5DbGVhckNhc2UoKSkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL2ZldGNoMi9ienIucHkgYi9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvYnpyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZTlhYzQKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvYnpyLnB5CkBAIC0wLDAgKzEsMTQzIEBACisiIiIKK0JpdEJha2UgJ0ZldGNoJyBpbXBsZW1lbnRhdGlvbiBmb3IgYnpyLgorCisiIiIKKworIyBDb3B5cmlnaHQgKEMpIDIwMDcgUm9zcyBCdXJ0b24KKyMgQ29weXJpZ2h0IChDKSAyMDA3IFJpY2hhcmQgUHVyZGllCisjCisjICAgQ2xhc3NlcyBmb3Igb2J0YWluaW5nIHVwc3RyZWFtIHNvdXJjZXMgZm9yIHRoZQorIyAgIEJpdEJha2UgYnVpbGQgdG9vbHMuCisjICAgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0ICBDaHJpcyBMYXJzb24KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBiYgorZnJvbSBiYiBpbXBvcnQgZGF0YQorZnJvbSBiYi5mZXRjaDIgaW1wb3J0IEZldGNoTWV0aG9kCitmcm9tIGJiLmZldGNoMiBpbXBvcnQgRmV0Y2hFcnJvcgorZnJvbSBiYi5mZXRjaDIgaW1wb3J0IHJ1bmZldGNoY21kCitmcm9tIGJiLmZldGNoMiBpbXBvcnQgbG9nZ2VyCisKK2NsYXNzIEJ6cihGZXRjaE1ldGhvZCk6CisgICAgZGVmIHN1cHBvcnRzKHNlbGYsIHVkLCBkKToKKyAgICAgICAgcmV0dXJuIHVkLnR5cGUgaW4gWydienInXQorCisgICAgZGVmIHVybGRhdGFfaW5pdChzZWxmLCB1ZCwgZCk6CisgICAgICAgICIiIgorICAgICAgICBpbml0IGJ6ciBzcGVjaWZpYyB2YXJpYWJsZSB3aXRoaW4gdXJsIGRhdGEKKyAgICAgICAgIiIiCisgICAgICAgICMgQ3JlYXRlIHBhdGhzIHRvIGJ6ciBjaGVja291dHMKKyAgICAgICAgcmVscGF0aCA9IHNlbGYuX3N0cmlwX2xlYWRpbmdfc2xhc2hlcyh1ZC5wYXRoKQorICAgICAgICB1ZC5wa2dkaXIgPSBvcy5wYXRoLmpvaW4oZGF0YS5leHBhbmQoJyR7QlpSRElSfScsIGQpLCB1ZC5ob3N0LCByZWxwYXRoKQorCisgICAgICAgIHVkLnNldHVwX3Jldmlzb25zKGQpCisKKyAgICAgICAgaWYgbm90IHVkLnJldmlzaW9uOgorICAgICAgICAgICAgdWQucmV2aXNpb24gPSBzZWxmLmxhdGVzdF9yZXZpc2lvbih1ZCwgZCkKKworICAgICAgICB1ZC5sb2NhbGZpbGUgPSBkYXRhLmV4cGFuZCgnYnpyXyVzXyVzXyVzLnRhci5neicgJSAodWQuaG9zdCwgdWQucGF0aC5yZXBsYWNlKCcvJywgJy4nKSwgdWQucmV2aXNpb24pLCBkKQorCisgICAgZGVmIF9idWlsZGJ6cmNvbW1hbmQoc2VsZiwgdWQsIGQsIGNvbW1hbmQpOgorICAgICAgICAiIiIKKyAgICAgICAgQnVpbGQgdXAgYW4gYnpyIGNvbW1hbmRsaW5lIGJhc2VkIG9uIHVkCisgICAgICAgIGNvbW1hbmQgaXMgImZldGNoIiwgInVwZGF0ZSIsICJyZXZubyIKKyAgICAgICAgIiIiCisKKyAgICAgICAgYmFzZWNtZCA9IGRhdGEuZXhwYW5kKCcke0ZFVENIQ01EX2J6cn0nLCBkKQorCisgICAgICAgIHByb3RvID0gIHVkLnBhcm0uZ2V0KCdwcm90b2NvbCcsICdodHRwJykKKworICAgICAgICBienJyb290ID0gdWQuaG9zdCArIHVkLnBhdGgKKworICAgICAgICBvcHRpb25zID0gW10KKworICAgICAgICBpZiBjb21tYW5kID09ICJyZXZubyI6CisgICAgICAgICAgICBienJjbWQgPSAiJXMgcmV2bm8gJXMgJXM6Ly8lcyIgJSAoYmFzZWNtZCwgIiAiLmpvaW4ob3B0aW9ucyksIHByb3RvLCBienJyb290KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgdWQucmV2aXNpb246CisgICAgICAgICAgICAgICAgb3B0aW9ucy5hcHBlbmQoIi1yICVzIiAlIHVkLnJldmlzaW9uKQorCisgICAgICAgICAgICBpZiBjb21tYW5kID09ICJmZXRjaCI6CisgICAgICAgICAgICAgICAgYnpyY21kID0gIiVzIGJyYW5jaCAlcyAlczovLyVzIiAlIChiYXNlY21kLCAiICIuam9pbihvcHRpb25zKSwgcHJvdG8sIGJ6cnJvb3QpCisgICAgICAgICAgICBlbGlmIGNvbW1hbmQgPT0gInVwZGF0ZSI6CisgICAgICAgICAgICAgICAgYnpyY21kID0gIiVzIHB1bGwgJXMgLS1vdmVyd3JpdGUiICUgKGJhc2VjbWQsICIgIi5qb2luKG9wdGlvbnMpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBGZXRjaEVycm9yKCJJbnZhbGlkIGJ6ciBjb21tYW5kICVzIiAlIGNvbW1hbmQsIHVkLnVybCkKKworICAgICAgICByZXR1cm4gYnpyY21kCisKKyAgICBkZWYgZG93bmxvYWQoc2VsZiwgdWQsIGQpOgorICAgICAgICAiIiJGZXRjaCB1cmwiIiIKKworICAgICAgICBpZiBvcy5hY2Nlc3Mob3MucGF0aC5qb2luKHVkLnBrZ2Rpciwgb3MucGF0aC5iYXNlbmFtZSh1ZC5wa2dkaXIpLCAnLmJ6cicpLCBvcy5SX09LKToKKyAgICAgICAgICAgIGJ6cmNtZCA9IHNlbGYuX2J1aWxkYnpyY29tbWFuZCh1ZCwgZCwgInVwZGF0ZSIpCisgICAgICAgICAgICBsb2dnZXIuZGVidWcoMSwgIkJaUiBVcGRhdGUgJXMiLCB1ZC51cmwpCisgICAgICAgICAgICBiYi5mZXRjaDIuY2hlY2tfbmV0d29ya19hY2Nlc3MoZCwgYnpyY21kLCB1ZC51cmwpCisgICAgICAgICAgICBvcy5jaGRpcihvcy5wYXRoLmpvaW4gKHVkLnBrZ2Rpciwgb3MucGF0aC5iYXNlbmFtZSh1ZC5wYXRoKSkpCisgICAgICAgICAgICBydW5mZXRjaGNtZChienJjbWQsIGQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBiYi51dGlscy5yZW1vdmUob3MucGF0aC5qb2luKHVkLnBrZ2Rpciwgb3MucGF0aC5iYXNlbmFtZSh1ZC5wa2dkaXIpKSwgVHJ1ZSkKKyAgICAgICAgICAgIGJ6cmNtZCA9IHNlbGYuX2J1aWxkYnpyY29tbWFuZCh1ZCwgZCwgImZldGNoIikKKyAgICAgICAgICAgIGJiLmZldGNoMi5jaGVja19uZXR3b3JrX2FjY2VzcyhkLCBienJjbWQsIHVkLnVybCkKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiQlpSIENoZWNrb3V0ICVzIiwgdWQudXJsKQorICAgICAgICAgICAgYmIudXRpbHMubWtkaXJoaWVyKHVkLnBrZ2RpcikKKyAgICAgICAgICAgIG9zLmNoZGlyKHVkLnBrZ2RpcikKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiUnVubmluZyAlcyIsIGJ6cmNtZCkKKyAgICAgICAgICAgIHJ1bmZldGNoY21kKGJ6cmNtZCwgZCkKKworICAgICAgICBvcy5jaGRpcih1ZC5wa2dkaXIpCisKKyAgICAgICAgc2NtZGF0YSA9IHVkLnBhcm0uZ2V0KCJzY21kYXRhIiwgIiIpCisgICAgICAgIGlmIHNjbWRhdGEgPT0gImtlZXAiOgorICAgICAgICAgICAgdGFyX2ZsYWdzID0gIiIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRhcl9mbGFncyA9ICItLWV4Y2x1ZGUgJy5ienInIC0tZXhjbHVkZSAnLmJ6cnRhZ3MnIgorCisgICAgICAgICMgdGFyIHRoZW0gdXAgdG8gYSBkZWZpbmVkIGZpbGVuYW1lCisgICAgICAgIHJ1bmZldGNoY21kKCJ0YXIgJXMgLWN6ZiAlcyAlcyIgJSAodGFyX2ZsYWdzLCB1ZC5sb2NhbHBhdGgsIG9zLnBhdGguYmFzZW5hbWUodWQucGtnZGlyKSksIGQsIGNsZWFudXAgPSBbdWQubG9jYWxwYXRoXSkKKworICAgIGRlZiBzdXBwb3J0c19zcmNyZXYoc2VsZik6CisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgX3JldmlzaW9uX2tleShzZWxmLCB1ZCwgZCwgbmFtZSk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSB1bmlxdWUga2V5IGZvciB0aGUgdXJsCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gImJ6cjoiICsgdWQucGtnZGlyCisKKyAgICBkZWYgX2xhdGVzdF9yZXZpc2lvbihzZWxmLCB1ZCwgZCwgbmFtZSk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gdGhlIGxhdGVzdCB1cHN0cmVhbSByZXZpc2lvbiBudW1iZXIKKyAgICAgICAgIiIiCisgICAgICAgIGxvZ2dlci5kZWJ1ZygyLCAiQlpSIGZldGNoZXIgaGl0dGluZyBuZXR3b3JrIGZvciAlcyIsIHVkLnVybCkKKworICAgICAgICBiYi5mZXRjaDIuY2hlY2tfbmV0d29ya19hY2Nlc3MoZCwgc2VsZi5fYnVpbGRienJjb21tYW5kKHVkLCBkLCAicmV2bm8iKSwgdWQudXJsKQorCisgICAgICAgIG91dHB1dCA9IHJ1bmZldGNoY21kKHNlbGYuX2J1aWxkYnpyY29tbWFuZCh1ZCwgZCwgInJldm5vIiksIGQsIFRydWUpCisKKyAgICAgICAgcmV0dXJuIG91dHB1dC5zdHJpcCgpCisKKyAgICBkZWYgc29ydGFibGVfcmV2aXNpb24oc2VsZiwgdWQsIGQsIG5hbWUpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgc29ydGFibGUgcmV2aXNpb24gbnVtYmVyIHdoaWNoIGluIG91ciBjYXNlIGlzIHRoZSByZXZpc2lvbiBudW1iZXIKKyAgICAgICAgIiIiCisKKyAgICAgICAgcmV0dXJuIEZhbHNlLCBzZWxmLl9idWlsZF9yZXZpc2lvbih1ZCwgZCkKKworICAgIGRlZiBfYnVpbGRfcmV2aXNpb24oc2VsZiwgdWQsIGQpOgorICAgICAgICByZXR1cm4gdWQucmV2aXNpb24KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL2ZldGNoMi9jbGVhcmNhc2UucHkgYi9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvY2xlYXJjYXNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhODNlN2MKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvY2xlYXJjYXNlLnB5CkBAIC0wLDAgKzEsMjYzIEBACisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIiIiCitCaXRCYWtlICdGZXRjaCcgY2xlYXJjYXNlIGltcGxlbWVudGF0aW9uCisKK1RoZSBjbGVhcmNhc2UgZmV0Y2hlciBpcyB1c2VkIHRvIHJldHJpZXZlIGZpbGVzIGZyb20gYSBDbGVhckNhc2UgcmVwb3NpdG9yeS4KKworVXNhZ2UgaW4gdGhlIHJlY2lwZToKKworICAgIFNSQ19VUkkgPSAiY2NyYzovL2NjLmV4YW1wbGUub3JnL2NjcmM7dm9iPS9leGFtcGxlX3ZvYjttb2R1bGU9L2V4YW1wbGVfbW9kdWxlIgorICAgIFNSQ1JFViA9ICJFWEFNUExFX0NMRUFSQ0FTRV9UQUciCisgICAgUFYgPSAiJHtAZC5nZXRWYXIoIlNSQ1JFViIsIEZhbHNlKS5yZXBsYWNlKCIvIiwgIisiKX0iCisKK1RoZSBmZXRjaGVyIHVzZXMgdGhlIHJjbGVhcnRvb2wgb3IgY2xlYXJ0b29sIHJlbW90ZSBjbGllbnQsIGRlcGVuZGluZyBvbiB3aGljaCBvbmUgaXMgYXZhaWxhYmxlLgorCitTdXBwb3J0ZWQgU1JDX1VSSSBvcHRpb25zIGFyZToKKworLSB2b2IKKyAgICAocmVxdWlyZWQpIFRoZSBuYW1lIG9mIHRoZSBjbGVhcmNhc2UgVk9CICh3aXRoIHByZXBlbmRpbmcgIi8iKQorCistIG1vZHVsZQorICAgIFRoZSBtb2R1bGUgaW4gdGhlIHNlbGVjdGVkIFZPQiAod2l0aCBwcmVwZW5kaW5nICIvIikKKworICAgIFRoZSBtb2R1bGUgYW5kIHZvYiBwYXJhbWV0ZXJzIGFyZSBjb21iaW5lZCB0byBjcmVhdGUKKyAgICB0aGUgZm9sbG93aW5nIGxvYWQgcnVsZSBpbiB0aGUgdmlldyBjb25maWcgc3BlYzoKKyAgICAgICAgICAgICAgICBsb2FkIDx2b2I+PG1vZHVsZT4KKworLSBwcm90bworICAgIGh0dHAgb3IgaHR0cHMKKworUmVsYXRlZCB2YXJpYWJsZXM6CisKKyAgICBDQ0FTRV9DVVNUT01fQ09ORklHX1NQRUMKKyAgICAgICAgICAgIFdyaXRlIGEgY29uZmlnIHNwZWMgdG8gdGhpcyB2YXJpYWJsZSBpbiB5b3VyIHJlY2lwZSB0byB1c2UgaXQgaW5zdGVhZAorICAgICAgICAgICAgb2YgdGhlIGRlZmF1bHQgY29uZmlnIHNwZWMgZ2VuZXJhdGVkIGJ5IHRoaXMgZmV0Y2hlci4KKyAgICAgICAgICAgIFBsZWFzZSBub3RlIHRoYXQgdGhlIFNSQ1JFViBsb3NlcyBpdHMgZnVuY3Rpb25hbGl0eSBpZiB5b3Ugc3BlY2lmeQorICAgICAgICAgICAgdGhpcyB2YXJpYWJsZS4gU1JDUkVWIGlzIHN0aWxsIHVzZWQgdG8gbGFiZWwgdGhlIGFyY2hpdmUgYWZ0ZXIgYSBmZXRjaCwKKyAgICAgICAgICAgIGJ1dCBpdCBkb2Vzbid0IGRlZmluZSB3aGF0J3MgZmV0Y2hlZC4KKworVXNlciBjcmVkZW50aWFsczoKKyAgICBjbGVhcnRvb2w6CisgICAgICAgICAgICBUaGUgbG9naW4gb2YgY2xlYXJ0b29sIGlzIGhhbmRsZWQgYnkgdGhlIHN5c3RlbS4gTm8gc3BlY2lhbCBzdGVwcyBuZWVkZWQuCisKKyAgICByY2xlYXJ0b29sOgorICAgICAgICAgICAgSW4gb3JkZXIgdG8gdXNlIHJjbGVhcnRvb2wgd2l0aCBhdXRoZW50aWNhdGVkIHVzZXJzIGFuIGByY2xlYXJ0b29sIGxvZ2luYCBpcworICAgICAgICAgICAgbmVjZXNzYXJ5IGJlZm9yZSB1c2luZyB0aGUgZmV0Y2hlci4KKyIiIgorIyBDb3B5cmlnaHQgKEMpIDIwMTQgU2llbWVucyBBRworIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgYmIKK2Zyb20gICBiYiBpbXBvcnQgZGF0YQorZnJvbSAgIGJiLmZldGNoMiBpbXBvcnQgRmV0Y2hNZXRob2QKK2Zyb20gICBiYi5mZXRjaDIgaW1wb3J0IEZldGNoRXJyb3IKK2Zyb20gICBiYi5mZXRjaDIgaW1wb3J0IHJ1bmZldGNoY21kCitmcm9tICAgYmIuZmV0Y2gyIGltcG9ydCBsb2dnZXIKK2Zyb20gICBkaXN0dXRpbHMgaW1wb3J0IHNwYXduCisKK2NsYXNzIENsZWFyQ2FzZShGZXRjaE1ldGhvZCk6CisgICAgIiIiQ2xhc3MgdG8gZmV0Y2ggdXJscyB2aWEgJ2NsZWFyY2FzZSciIiIKKyAgICBkZWYgaW5pdChzZWxmLCBkKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHN1cHBvcnRzKHNlbGYsIHVkLCBkKToKKyAgICAgICAgIiIiCisgICAgICAgIENoZWNrIHRvIHNlZSBpZiBhIGdpdmVuIHVybCBjYW4gYmUgZmV0Y2hlZCB3aXRoIENsZWFyY2FzZS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiB1ZC50eXBlIGluIFsnY2NyYyddCisKKyAgICBkZWYgZGVidWcoc2VsZiwgbXNnKToKKyAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJDbGVhckNhc2U6ICVzIiwgbXNnKQorCisgICAgZGVmIHVybGRhdGFfaW5pdChzZWxmLCB1ZCwgZCk6CisgICAgICAgICIiIgorICAgICAgICBpbml0IENsZWFyQ2FzZSBzcGVjaWZpYyB2YXJpYWJsZSB3aXRoaW4gdXJsIGRhdGEKKyAgICAgICAgIiIiCisgICAgICAgIHVkLnByb3RvID0gImh0dHBzIgorICAgICAgICBpZiAncHJvdG9jb2wnIGluIHVkLnBhcm06CisgICAgICAgICAgICB1ZC5wcm90byA9IHVkLnBhcm1bJ3Byb3RvY29sJ10KKyAgICAgICAgaWYgbm90IHVkLnByb3RvIGluICgnaHR0cCcsICdodHRwcycpOgorICAgICAgICAgICAgcmFpc2UgZmV0Y2gyLlBhcmFtZXRlckVycm9yKCJJbnZhbGlkIHByb3RvY29sIHR5cGUiLCB1ZC51cmwpCisKKyAgICAgICAgdWQudm9iID0gJycKKyAgICAgICAgaWYgJ3ZvYicgaW4gdWQucGFybToKKyAgICAgICAgICAgIHVkLnZvYiA9IHVkLnBhcm1bJ3ZvYiddCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtc2cgPSB1ZC51cmwrIjogdm9iIG11c3QgYmUgZGVmaW5lZCBzbyB0aGUgZmV0Y2hlciBrbm93cyB3aGF0IHRvIGdldC4iCisgICAgICAgICAgICByYWlzZSBNaXNzaW5nUGFyYW1ldGVyRXJyb3IoJ3ZvYicsIG1zZykKKworICAgICAgICBpZiAnbW9kdWxlJyBpbiB1ZC5wYXJtOgorICAgICAgICAgICAgdWQubW9kdWxlID0gdWQucGFybVsnbW9kdWxlJ10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHVkLm1vZHVsZSA9ICIiCisKKyAgICAgICAgdWQuYmFzZWNtZCA9IGQuZ2V0VmFyKCJGRVRDSENNRF9jY3JjIiwgVHJ1ZSkgb3Igc3Bhd24uZmluZF9leGVjdXRhYmxlKCJjbGVhcnRvb2wiKSBvciBzcGF3bi5maW5kX2V4ZWN1dGFibGUoInJjbGVhcnRvb2wiKQorCisgICAgICAgIGlmIGRhdGEuZ2V0VmFyKCJTUkNSRVYiLCBkLCBUcnVlKSA9PSAiSU5WQUxJRCI6CisgICAgICAgICAgcmFpc2UgRmV0Y2hFcnJvcigiU2V0IGEgdmFsaWQgU1JDUkVWIGZvciB0aGUgY2xlYXJjYXNlIGZldGNoZXIgaW4geW91ciByZWNpcGUsIGUuZy4gU1JDUkVWID0gXCIvbWFpbi9MQVRFU1RcIiBvciBhbnkgb3RoZXIgbGFiZWwgb2YgeW91ciBjaG9pY2UuIikKKworICAgICAgICB1ZC5sYWJlbCA9IGQuZ2V0VmFyKCJTUkNSRVYiLCBGYWxzZSkKKyAgICAgICAgdWQuY3VzdG9tc3BlYyA9IGQuZ2V0VmFyKCJDQ0FTRV9DVVNUT01fQ09ORklHX1NQRUMiLCBUcnVlKQorCisgICAgICAgIHVkLnNlcnZlciAgICAgPSAiJXM6Ly8lcyVzIiAlICh1ZC5wcm90bywgdWQuaG9zdCwgdWQucGF0aCkKKworICAgICAgICB1ZC5pZGVudGlmaWVyID0gImNsZWFyY2FzZS0lcyVzLSVzIiAlICggdWQudm9iLnJlcGxhY2UoIi8iLCAiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZC5tb2R1bGUucmVwbGFjZSgiLyIsICIuIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZC5sYWJlbC5yZXBsYWNlKCIvIiwgIi4iKSkKKworICAgICAgICB1ZC52aWV3bmFtZSAgICAgICAgID0gIiVzLXZpZXclcyIgJSAodWQuaWRlbnRpZmllciwgZC5nZXRWYXIoIkRBVEVUSU1FIiwgZCwgVHJ1ZSkpCisgICAgICAgIHVkLmNzbmFtZSAgICAgICAgICAgPSAiJXMtY29uZmlnLXNwZWMiICUgKHVkLmlkZW50aWZpZXIpCisgICAgICAgIHVkLmNjYXNlZGlyICAgICAgICAgPSBvcy5wYXRoLmpvaW4oZGF0YS5nZXRWYXIoIkRMX0RJUiIsIGQsIFRydWUpLCB1ZC50eXBlKQorICAgICAgICB1ZC52aWV3ZGlyICAgICAgICAgID0gb3MucGF0aC5qb2luKHVkLmNjYXNlZGlyLCB1ZC52aWV3bmFtZSkKKyAgICAgICAgdWQuY29uZmlnc3BlY2ZpbGUgICA9IG9zLnBhdGguam9pbih1ZC5jY2FzZWRpciwgdWQuY3NuYW1lKQorICAgICAgICB1ZC5sb2NhbGZpbGUgICAgICAgID0gIiVzLnRhci5neiIgJSAodWQuaWRlbnRpZmllcikKKworICAgICAgICBzZWxmLmRlYnVnKCJob3N0ICAgICAgICAgICAgPSAlcyIgJSB1ZC5ob3N0KQorICAgICAgICBzZWxmLmRlYnVnKCJwYXRoICAgICAgICAgICAgPSAlcyIgJSB1ZC5wYXRoKQorICAgICAgICBzZWxmLmRlYnVnKCJzZXJ2ZXIgICAgICAgICAgPSAlcyIgJSB1ZC5zZXJ2ZXIpCisgICAgICAgIHNlbGYuZGVidWcoInByb3RvICAgICAgICAgICA9ICVzIiAlIHVkLnByb3RvKQorICAgICAgICBzZWxmLmRlYnVnKCJ0eXBlICAgICAgICAgICAgPSAlcyIgJSB1ZC50eXBlKQorICAgICAgICBzZWxmLmRlYnVnKCJ2b2IgICAgICAgICAgICAgPSAlcyIgJSB1ZC52b2IpCisgICAgICAgIHNlbGYuZGVidWcoIm1vZHVsZSAgICAgICAgICA9ICVzIiAlIHVkLm1vZHVsZSkKKyAgICAgICAgc2VsZi5kZWJ1ZygiYmFzZWNtZCAgICAgICAgID0gJXMiICUgdWQuYmFzZWNtZCkKKyAgICAgICAgc2VsZi5kZWJ1ZygibGFiZWwgICAgICAgICAgID0gJXMiICUgdWQubGFiZWwpCisgICAgICAgIHNlbGYuZGVidWcoImNjYXNlZGlyICAgICAgICA9ICVzIiAlIHVkLmNjYXNlZGlyKQorICAgICAgICBzZWxmLmRlYnVnKCJ2aWV3ZGlyICAgICAgICAgPSAlcyIgJSB1ZC52aWV3ZGlyKQorICAgICAgICBzZWxmLmRlYnVnKCJ2aWV3bmFtZSAgICAgICAgPSAlcyIgJSB1ZC52aWV3bmFtZSkKKyAgICAgICAgc2VsZi5kZWJ1ZygiY29uZmlnc3BlY2ZpbGUgID0gJXMiICUgdWQuY29uZmlnc3BlY2ZpbGUpCisgICAgICAgIHNlbGYuZGVidWcoImxvY2FsZmlsZSAgICAgICA9ICVzIiAlIHVkLmxvY2FsZmlsZSkKKworICAgICAgICB1ZC5sb2NhbGZpbGUgPSBvcy5wYXRoLmpvaW4oZGF0YS5nZXRWYXIoIkRMX0RJUiIsIGQsIFRydWUpLCB1ZC5sb2NhbGZpbGUpCisKKyAgICBkZWYgX2J1aWxkX2NjYXNlX2NvbW1hbmQoc2VsZiwgdWQsIGNvbW1hbmQpOgorICAgICAgICAiIiIKKyAgICAgICAgQnVpbGQgdXAgYSBjb21tYW5kbGluZSBiYXNlZCBvbiB1ZAorICAgICAgICBjb21tYW5kIGlzOiBta3ZpZXcsIHNldGNzLCBybXZpZXcKKyAgICAgICAgIiIiCisgICAgICAgIG9wdGlvbnMgPSBbXQorCisgICAgICAgIGlmICJyY2xlYXJ0b29sIiBpbiB1ZC5iYXNlY21kOgorICAgICAgICAgICAgb3B0aW9ucy5hcHBlbmQoIi1zZXJ2ZXIgJXMiICUgdWQuc2VydmVyKQorCisgICAgICAgIGJhc2VjbWQgPSAiJXMgJXMiICUgKHVkLmJhc2VjbWQsIGNvbW1hbmQpCisKKyAgICAgICAgaWYgY29tbWFuZCBpcyAnbWt2aWV3JzoKKyAgICAgICAgICAgIGlmIG5vdCAicmNsZWFydG9vbCIgaW4gdWQuYmFzZWNtZDoKKyAgICAgICAgICAgICAgICAjIENsZWFydG9vbCBuZWVkcyBhIC1zbmFwc2hvdCB2aWV3CisgICAgICAgICAgICAgICAgb3B0aW9ucy5hcHBlbmQoIi1zbmFwc2hvdCIpCisgICAgICAgICAgICBvcHRpb25zLmFwcGVuZCgiLXRhZyAlcyIgJSB1ZC52aWV3bmFtZSkKKyAgICAgICAgICAgIG9wdGlvbnMuYXBwZW5kKHVkLnZpZXdkaXIpCisKKyAgICAgICAgZWxpZiBjb21tYW5kIGlzICdybXZpZXcnOgorICAgICAgICAgICAgb3B0aW9ucy5hcHBlbmQoIi1mb3JjZSIpCisgICAgICAgICAgICBvcHRpb25zLmFwcGVuZCgiJXMiICUgdWQudmlld2RpcikKKworICAgICAgICBlbGlmIGNvbW1hbmQgaXMgJ3NldGNzJzoKKyAgICAgICAgICAgIG9wdGlvbnMuYXBwZW5kKCItb3ZlcndyaXRlIikKKyAgICAgICAgICAgIG9wdGlvbnMuYXBwZW5kKHVkLmNvbmZpZ3NwZWNmaWxlKQorCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBGZXRjaEVycm9yKCJJbnZhbGlkIGNjYXNlIGNvbW1hbmQgJXMiICUgY29tbWFuZCkKKworICAgICAgICBjY2FzZWNtZCA9ICIlcyAlcyIgJSAoYmFzZWNtZCwgIiAiLmpvaW4ob3B0aW9ucykpCisgICAgICAgIHNlbGYuZGVidWcoImNjYXNlY21kID0gJXMiICUgY2Nhc2VjbWQpCisgICAgICAgIHJldHVybiBjY2FzZWNtZAorCisgICAgZGVmIF93cml0ZV9jb25maWdzcGVjKHNlbGYsIHVkLCBkKToKKyAgICAgICAgIiIiCisgICAgICAgIENyZWF0ZSBjb25maWcgc3BlYyBmaWxlICh1ZC5jb25maWdzcGVjZmlsZSkgZm9yIGNjYXNlIHZpZXcKKyAgICAgICAgIiIiCisgICAgICAgIGNvbmZpZ19zcGVjID0gIiIKKyAgICAgICAgY3VzdG9tX2NvbmZpZ19zcGVjID0gZC5nZXRWYXIoIkNDQVNFX0NVU1RPTV9DT05GSUdfU1BFQyIsIGQpCisgICAgICAgIGlmIGN1c3RvbV9jb25maWdfc3BlYyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGZvciBsaW5lIGluIGN1c3RvbV9jb25maWdfc3BlYy5zcGxpdCgiXFxuIik6CisgICAgICAgICAgICAgICAgY29uZmlnX3NwZWMgKz0gbGluZSsiXG4iCisgICAgICAgICAgICBiYi53YXJuKCJBIGN1c3RvbSBjb25maWcgc3BlYyBoYXMgYmVlbiBzZXQsIFNSQ1JFViBpcyBvbmx5IHJlbGV2YW50IGZvciB0aGUgdGFyYmFsbCBuYW1lLiIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjb25maWdfc3BlYyArPSAiZWxlbWVudCAqIENIRUNLRURPVVRcbiIKKyAgICAgICAgICAgIGNvbmZpZ19zcGVjICs9ICJlbGVtZW50ICogJXNcbiIgJSB1ZC5sYWJlbAorICAgICAgICAgICAgY29uZmlnX3NwZWMgKz0gImxvYWQgJXMlc1xuIiAlICh1ZC52b2IsIHVkLm1vZHVsZSkKKworICAgICAgICBsb2dnZXIuaW5mbygiVXNpbmcgY29uZmlnIHNwZWM6IFxuJXMiICUgY29uZmlnX3NwZWMpCisKKyAgICAgICAgd2l0aCBvcGVuKHVkLmNvbmZpZ3NwZWNmaWxlLCAndycpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKGNvbmZpZ19zcGVjKQorCisgICAgZGVmIF9yZW1vdmVfdmlldyhzZWxmLCB1ZCwgZCk6CisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHVkLnZpZXdkaXIpOgorICAgICAgICAgICAgb3MuY2hkaXIodWQuY2Nhc2VkaXIpCisgICAgICAgICAgICBjbWQgPSBzZWxmLl9idWlsZF9jY2FzZV9jb21tYW5kKHVkLCAncm12aWV3Jyk7CisgICAgICAgICAgICBsb2dnZXIuaW5mbygiY2xlYW5pbmcgdXAgW1ZPQj0lcyBsYWJlbD0lcyB2aWV3PSVzXSIsIHVkLnZvYiwgdWQubGFiZWwsIHVkLnZpZXduYW1lKQorICAgICAgICAgICAgYmIuZmV0Y2gyLmNoZWNrX25ldHdvcmtfYWNjZXNzKGQsIGNtZCwgdWQudXJsKQorICAgICAgICAgICAgb3V0cHV0ID0gcnVuZmV0Y2hjbWQoY21kLCBkKQorICAgICAgICAgICAgbG9nZ2VyLmluZm8oInJtdmlldyBvdXRwdXQ6ICVzIiwgb3V0cHV0KQorCisgICAgZGVmIG5lZWRfdXBkYXRlKHNlbGYsIHVkLCBkKToKKyAgICAgICAgaWYgKCJMQVRFU1QiIGluIHVkLmxhYmVsKSBvciAodWQuY3VzdG9tc3BlYyBhbmQgIkxBVEVTVCIgaW4gdWQuY3VzdG9tc3BlYyk6CisgICAgICAgICAgICB1ZC5pZGVudGlmaWVyICs9ICItJXMiICUgZC5nZXRWYXIoIkRBVEVUSU1FIixkLCBUcnVlKQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHModWQubG9jYWxwYXRoKToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHN1cHBvcnRzX3NyY3JldihzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBzb3J0YWJsZV9yZXZpc2lvbihzZWxmLCB1ZCwgZCwgbmFtZSk6CisgICAgICAgIHJldHVybiBGYWxzZSwgdWQuaWRlbnRpZmllcgorCisgICAgZGVmIGRvd25sb2FkKHNlbGYsIHVkLCBkKToKKyAgICAgICAgIiIiRmV0Y2ggdXJsIiIiCisKKyAgICAgICAgIyBNYWtlIGEgZnJlc2ggdmlldworICAgICAgICBiYi51dGlscy5ta2RpcmhpZXIodWQuY2Nhc2VkaXIpCisgICAgICAgIHNlbGYuX3dyaXRlX2NvbmZpZ3NwZWModWQsIGQpCisgICAgICAgIGNtZCA9IHNlbGYuX2J1aWxkX2NjYXNlX2NvbW1hbmQodWQsICdta3ZpZXcnKQorICAgICAgICBsb2dnZXIuaW5mbygiY3JlYXRpbmcgdmlldyBbVk9CPSVzIGxhYmVsPSVzIHZpZXc9JXNdIiwgdWQudm9iLCB1ZC5sYWJlbCwgdWQudmlld25hbWUpCisgICAgICAgIGJiLmZldGNoMi5jaGVja19uZXR3b3JrX2FjY2VzcyhkLCBjbWQsIHVkLnVybCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcnVuZmV0Y2hjbWQoY21kLCBkKQorICAgICAgICBleGNlcHQgRmV0Y2hFcnJvciBhcyBlOgorICAgICAgICAgICAgaWYgIkNSQ0xJMjAwOEUiIGluIGUubXNnOgorICAgICAgICAgICAgICAgIHJhaXNlIEZldGNoRXJyb3IoIiVzXG4lc1xuIiAlIChlLm1zZywgIkNhbGwgYHJjbGVhcnRvb2wgbG9naW5gIGluIHlvdXIgY29uc29sZSB0byBhdXRoZW50aWNhdGUgdG8gdGhlIGNsZWFyY2FzZSBzZXJ2ZXIgYmVmb3JlIHJ1bm5pbmcgYml0YmFrZS4iKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgZQorCisgICAgICAgICMgU2V0IGNvbmZpZ3NwZWM6IFNldHRpbmcgdGhlIGNvbmZpZ3NwZWMgZWZmZWN0aXZlbHkgZmV0Y2hlcyB0aGUgZmlsZXMgYXMgZGVmaW5lZCBpbiB0aGUgY29uZmlnc3BlYworICAgICAgICBvcy5jaGRpcih1ZC52aWV3ZGlyKQorICAgICAgICBjbWQgPSBzZWxmLl9idWlsZF9jY2FzZV9jb21tYW5kKHVkLCAnc2V0Y3MnKTsKKyAgICAgICAgbG9nZ2VyLmluZm8oImZldGNoaW5nIGRhdGEgW1ZPQj0lcyBsYWJlbD0lcyB2aWV3PSVzXSIsIHVkLnZvYiwgdWQubGFiZWwsIHVkLnZpZXduYW1lKQorICAgICAgICBiYi5mZXRjaDIuY2hlY2tfbmV0d29ya19hY2Nlc3MoZCwgY21kLCB1ZC51cmwpCisgICAgICAgIG91dHB1dCA9IHJ1bmZldGNoY21kKGNtZCwgZCkKKyAgICAgICAgbG9nZ2VyLmluZm8oIiVzIiwgb3V0cHV0KQorCisgICAgICAgICMgQ29weSB0aGUgY29uZmlnc3BlYyB0byB0aGUgdmlld2RpciBzbyB3ZSBoYXZlIGl0IGluIG91ciBzb3VyY2UgdGFyYmFsbCBsYXRlcgorICAgICAgICBzaHV0aWwuY29weWZpbGUodWQuY29uZmlnc3BlY2ZpbGUsIG9zLnBhdGguam9pbih1ZC52aWV3ZGlyLCB1ZC5jc25hbWUpKQorCisgICAgICAgICMgQ2xlYW4gY2xlYXJjYXNlIG1ldGEtZGF0YSBiZWZvcmUgdGFyCisKKyAgICAgICAgcnVuZmV0Y2hjbWQoJ3RhciAtY3pmICIlcyIgLicgJSAodWQubG9jYWxwYXRoKSwgZCwgY2xlYW51cCA9IFt1ZC5sb2NhbHBhdGhdKQorCisgICAgICAgICMgQ2xlYW4gdXAgc28gd2UgY2FuIGNyZWF0ZSBhIG5ldyB2aWV3IG5leHQgdGltZQorICAgICAgICBzZWxmLmNsZWFuKHVkLCBkKTsKKworICAgIGRlZiBjbGVhbihzZWxmLCB1ZCwgZCk6CisgICAgICAgIHNlbGYuX3JlbW92ZV92aWV3KHVkLCBkKQorICAgICAgICBiYi51dGlscy5yZW1vdmUodWQuY29uZmlnc3BlY2ZpbGUpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvY3ZzLnB5IGIvYml0YmFrZS9saWIvYmIvZmV0Y2gyL2N2cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjdkOTZmCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvZmV0Y2gyL2N2cy5weQpAQCAtMCwwICsxLDE3MSBAQAorIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyIiIgorQml0QmFrZSAnRmV0Y2gnIGltcGxlbWVudGF0aW9ucworCitDbGFzc2VzIGZvciBvYnRhaW5pbmcgdXBzdHJlYW0gc291cmNlcyBmb3IgdGhlCitCaXRCYWtlIGJ1aWxkIHRvb2xzLgorCisiIiIKKworIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgIENocmlzIExhcnNvbgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKyNCYXNlZCBvbiBmdW5jdGlvbnMgZnJvbSB0aGUgYmFzZSBiYiBtb2R1bGUsIENvcHlyaWdodCAyMDAzIEhvbGdlciBTY2h1cmlnCisjCisKK2ltcG9ydCBvcworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBiYgorZnJvbSBiYi5mZXRjaDIgaW1wb3J0IEZldGNoTWV0aG9kLCBGZXRjaEVycm9yLCBNaXNzaW5nUGFyYW1ldGVyRXJyb3IsIGxvZ2dlcgorZnJvbSBiYi5mZXRjaDIgaW1wb3J0IHJ1bmZldGNoY21kCisKK2NsYXNzIEN2cyhGZXRjaE1ldGhvZCk6CisgICAgIiIiCisgICAgQ2xhc3MgdG8gZmV0Y2ggYSBtb2R1bGUgb3IgbW9kdWxlcyBmcm9tIGN2cyByZXBvc2l0b3JpZXMKKyAgICAiIiIKKyAgICBkZWYgc3VwcG9ydHMoc2VsZiwgdWQsIGQpOgorICAgICAgICAiIiIKKyAgICAgICAgQ2hlY2sgdG8gc2VlIGlmIGEgZ2l2ZW4gdXJsIGNhbiBiZSBmZXRjaGVkIHdpdGggY3ZzLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHVkLnR5cGUgaW4gWydjdnMnXQorCisgICAgZGVmIHVybGRhdGFfaW5pdChzZWxmLCB1ZCwgZCk6CisgICAgICAgIGlmIG5vdCAibW9kdWxlIiBpbiB1ZC5wYXJtOgorICAgICAgICAgICAgcmFpc2UgTWlzc2luZ1BhcmFtZXRlckVycm9yKCJtb2R1bGUiLCB1ZC51cmwpCisgICAgICAgIHVkLm1vZHVsZSA9IHVkLnBhcm1bIm1vZHVsZSJdCisKKyAgICAgICAgdWQudGFnID0gdWQucGFybS5nZXQoJ3RhZycsICIiKQorCisgICAgICAgICMgT3ZlcnJpZGUgdGhlIGRlZmF1bHQgZGF0ZSBpbiBjZXJ0YWluIGNhc2VzCisgICAgICAgIGlmICdkYXRlJyBpbiB1ZC5wYXJtOgorICAgICAgICAgICAgdWQuZGF0ZSA9IHVkLnBhcm1bJ2RhdGUnXQorICAgICAgICBlbGlmIHVkLnRhZzoKKyAgICAgICAgICAgIHVkLmRhdGUgPSAiIgorCisgICAgICAgIG5vcmVjdXJzZSA9ICcnCisgICAgICAgIGlmICdub3JlY3Vyc2UnIGluIHVkLnBhcm06CisgICAgICAgICAgICBub3JlY3Vyc2UgPSAnX25vcmVjdXJzZScKKworICAgICAgICBmdWxscGF0aCA9ICcnCisgICAgICAgIGlmICdmdWxscGF0aCcgaW4gdWQucGFybToKKyAgICAgICAgICAgIGZ1bGxwYXRoID0gJ19mdWxscGF0aCcKKworICAgICAgICB1ZC5sb2NhbGZpbGUgPSBiYi5kYXRhLmV4cGFuZCgnJXNfJXNfJXNfJXMlcyVzLnRhci5neicgJSAodWQubW9kdWxlLnJlcGxhY2UoJy8nLCAnLicpLCB1ZC5ob3N0LCB1ZC50YWcsIHVkLmRhdGUsIG5vcmVjdXJzZSwgZnVsbHBhdGgpLCBkKQorCisgICAgZGVmIG5lZWRfdXBkYXRlKHNlbGYsIHVkLCBkKToKKyAgICAgICAgaWYgKHVkLmRhdGUgPT0gIm5vdyIpOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHVkLmxvY2FscGF0aCk6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBkb3dubG9hZChzZWxmLCB1ZCwgZCk6CisKKyAgICAgICAgbWV0aG9kID0gdWQucGFybS5nZXQoJ21ldGhvZCcsICdwc2VydmVyJykKKyAgICAgICAgbG9jYWxkaXIgPSB1ZC5wYXJtLmdldCgnbG9jYWxkaXInLCB1ZC5tb2R1bGUpCisgICAgICAgIGN2c19wb3J0ID0gdWQucGFybS5nZXQoJ3BvcnQnLCAnJykKKworICAgICAgICBjdnNfcnNoID0gTm9uZQorICAgICAgICBpZiBtZXRob2QgPT0gImV4dCI6CisgICAgICAgICAgICBpZiAicnNoIiBpbiB1ZC5wYXJtOgorICAgICAgICAgICAgICAgIGN2c19yc2ggPSB1ZC5wYXJtWyJyc2giXQorCisgICAgICAgIGlmIG1ldGhvZCA9PSAiZGlyIjoKKyAgICAgICAgICAgIGN2c3Jvb3QgPSB1ZC5wYXRoCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjdnNyb290ID0gIjoiICsgbWV0aG9kCisgICAgICAgICAgICBjdnNwcm94eWhvc3QgPSBkLmdldFZhcignQ1ZTX1BST1hZX0hPU1QnLCBUcnVlKQorICAgICAgICAgICAgaWYgY3ZzcHJveHlob3N0OgorICAgICAgICAgICAgICAgIGN2c3Jvb3QgKz0gIjtwcm94eT0iICsgY3ZzcHJveHlob3N0CisgICAgICAgICAgICBjdnNwcm94eXBvcnQgPSBkLmdldFZhcignQ1ZTX1BST1hZX1BPUlQnLCBUcnVlKQorICAgICAgICAgICAgaWYgY3ZzcHJveHlwb3J0OgorICAgICAgICAgICAgICAgIGN2c3Jvb3QgKz0gIjtwcm94eXBvcnQ9IiArIGN2c3Byb3h5cG9ydAorICAgICAgICAgICAgY3Zzcm9vdCArPSAiOiIgKyB1ZC51c2VyCisgICAgICAgICAgICBpZiB1ZC5wc3dkOgorICAgICAgICAgICAgICAgIGN2c3Jvb3QgKz0gIjoiICsgdWQucHN3ZAorICAgICAgICAgICAgY3Zzcm9vdCArPSAiQCIgKyB1ZC5ob3N0ICsgIjoiICsgY3ZzX3BvcnQgKyB1ZC5wYXRoCisKKyAgICAgICAgb3B0aW9ucyA9IFtdCisgICAgICAgIGlmICdub3JlY3Vyc2UnIGluIHVkLnBhcm06CisgICAgICAgICAgICBvcHRpb25zLmFwcGVuZCgiLWwiKQorICAgICAgICBpZiB1ZC5kYXRlOgorICAgICAgICAgICAgIyB0cmVhdCBZWVlZTU1EREhITU0gc3BlY2lhbGx5IGZvciBDVlMKKyAgICAgICAgICAgIGlmIGxlbih1ZC5kYXRlKSA9PSAxMjoKKyAgICAgICAgICAgICAgICBvcHRpb25zLmFwcGVuZCgiLUQgXCIlcyAlczolcyBVVENcIiIgJSAodWQuZGF0ZVswOjhdLCB1ZC5kYXRlWzg6MTBdLCB1ZC5kYXRlWzEwOjEyXSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG9wdGlvbnMuYXBwZW5kKCItRCBcIiVzIFVUQ1wiIiAlIHVkLmRhdGUpCisgICAgICAgIGlmIHVkLnRhZzoKKyAgICAgICAgICAgIG9wdGlvbnMuYXBwZW5kKCItciAlcyIgJSB1ZC50YWcpCisKKyAgICAgICAgY3ZzYmFzZWNtZCA9IGQuZ2V0VmFyKCJGRVRDSENNRF9jdnMiLCBUcnVlKQorICAgICAgICBjdnNjbWQgPSBjdnNiYXNlY21kICsgIiAnLWQiICsgY3Zzcm9vdCArICInIGNvICIgKyAiICIuam9pbihvcHRpb25zKSArICIgIiArIHVkLm1vZHVsZQorICAgICAgICBjdnN1cGRhdGVjbWQgPSBjdnNiYXNlY21kICsgIiAnLWQiICsgY3Zzcm9vdCArICInIHVwZGF0ZSAtZCAtUCAiICsgIiAiLmpvaW4ob3B0aW9ucykKKworICAgICAgICBpZiBjdnNfcnNoOgorICAgICAgICAgICAgY3ZzY21kID0gIkNWU19SU0g9XCIlc1wiICVzIiAlIChjdnNfcnNoLCBjdnNjbWQpCisgICAgICAgICAgICBjdnN1cGRhdGVjbWQgPSAiQ1ZTX1JTSD1cIiVzXCIgJXMiICUgKGN2c19yc2gsIGN2c3VwZGF0ZWNtZCkKKworICAgICAgICAjIGNyZWF0ZSBtb2R1bGUgZGlyZWN0b3J5CisgICAgICAgIGxvZ2dlci5kZWJ1ZygyLCAiRmV0Y2g6IGNoZWNraW5nIGZvciBtb2R1bGUgZGlyZWN0b3J5IikKKyAgICAgICAgcGtnID0gZC5nZXRWYXIoJ1BOJywgVHJ1ZSkKKyAgICAgICAgcGtnZGlyID0gb3MucGF0aC5qb2luKGQuZ2V0VmFyKCdDVlNESVInLCBUcnVlKSwgcGtnKQorICAgICAgICBtb2RkaXIgPSBvcy5wYXRoLmpvaW4ocGtnZGlyLCBsb2NhbGRpcikKKyAgICAgICAgaWYgb3MuYWNjZXNzKG9zLnBhdGguam9pbihtb2RkaXIsICdDVlMnKSwgb3MuUl9PSyk6CisgICAgICAgICAgICBsb2dnZXIuaW5mbygiVXBkYXRlICIgKyB1ZC51cmwpCisgICAgICAgICAgICBiYi5mZXRjaDIuY2hlY2tfbmV0d29ya19hY2Nlc3MoZCwgY3ZzdXBkYXRlY21kLCB1ZC51cmwpCisgICAgICAgICAgICAjIHVwZGF0ZSBzb3VyY2VzIHRoZXJlCisgICAgICAgICAgICBvcy5jaGRpcihtb2RkaXIpCisgICAgICAgICAgICBjbWQgPSBjdnN1cGRhdGVjbWQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJGZXRjaCAiICsgdWQudXJsKQorICAgICAgICAgICAgIyBjaGVjayBvdXQgc291cmNlcyB0aGVyZQorICAgICAgICAgICAgYmIudXRpbHMubWtkaXJoaWVyKHBrZ2RpcikKKyAgICAgICAgICAgIG9zLmNoZGlyKHBrZ2RpcikKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiUnVubmluZyAlcyIsIGN2c2NtZCkKKyAgICAgICAgICAgIGJiLmZldGNoMi5jaGVja19uZXR3b3JrX2FjY2VzcyhkLCBjdnNjbWQsIHVkLnVybCkKKyAgICAgICAgICAgIGNtZCA9IGN2c2NtZAorCisgICAgICAgIHJ1bmZldGNoY21kKGNtZCwgZCwgY2xlYW51cCA9IFttb2RkaXJdKQorCisgICAgICAgIGlmIG5vdCBvcy5hY2Nlc3MobW9kZGlyLCBvcy5SX09LKToKKyAgICAgICAgICAgIHJhaXNlIEZldGNoRXJyb3IoIkRpcmVjdG9yeSAlcyB3YXMgbm90IHJlYWRhYmxlIGRlc3BpdGUgc3VjZXNzZnVsIGZldGNoPyEiICUgbW9kZGlyLCB1ZC51cmwpCisKKyAgICAgICAgc2NtZGF0YSA9IHVkLnBhcm0uZ2V0KCJzY21kYXRhIiwgIiIpCisgICAgICAgIGlmIHNjbWRhdGEgPT0gImtlZXAiOgorICAgICAgICAgICAgdGFyX2ZsYWdzID0gIiIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRhcl9mbGFncyA9ICItLWV4Y2x1ZGUgJ0NWUyciCisKKyAgICAgICAgIyB0YXIgdGhlbSB1cCB0byBhIGRlZmluZWQgZmlsZW5hbWUKKyAgICAgICAgaWYgJ2Z1bGxwYXRoJyBpbiB1ZC5wYXJtOgorICAgICAgICAgICAgb3MuY2hkaXIocGtnZGlyKQorICAgICAgICAgICAgY21kID0gInRhciAlcyAtY3pmICVzICVzIiAlICh0YXJfZmxhZ3MsIHVkLmxvY2FscGF0aCwgbG9jYWxkaXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvcy5jaGRpcihtb2RkaXIpCisgICAgICAgICAgICBvcy5jaGRpcignLi4nKQorICAgICAgICAgICAgY21kID0gInRhciAlcyAtY3pmICVzICVzIiAlICh0YXJfZmxhZ3MsIHVkLmxvY2FscGF0aCwgb3MucGF0aC5iYXNlbmFtZShtb2RkaXIpKQorCisgICAgICAgIHJ1bmZldGNoY21kKGNtZCwgZCwgY2xlYW51cCA9IFt1ZC5sb2NhbHBhdGhdKQorCisgICAgZGVmIGNsZWFuKHNlbGYsIHVkLCBkKToKKyAgICAgICAgIiIiIENsZWFuIENWUyBGaWxlcyBhbmQgdGFyYmFsbHMgIiIiCisKKyAgICAgICAgcGtnID0gZC5nZXRWYXIoJ1BOJywgVHJ1ZSkKKyAgICAgICAgcGtnZGlyID0gb3MucGF0aC5qb2luKGQuZ2V0VmFyKCJDVlNESVIiLCBUcnVlKSwgcGtnKQorCisgICAgICAgIGJiLnV0aWxzLnJlbW92ZShwa2dkaXIsIFRydWUpCisgICAgICAgIGJiLnV0aWxzLnJlbW92ZSh1ZC5sb2NhbHBhdGgpCisKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL2ZldGNoMi9naXQucHkgYi9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvZ2l0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNjU4ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvZ2l0LnB5CkBAIC0wLDAgKzEsNDQ3IEBACisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIiIiCitCaXRCYWtlICdGZXRjaCcgZ2l0IGltcGxlbWVudGF0aW9uCisKK2dpdCBmZXRjaGVyIHN1cHBvcnQgdGhlIFNSQ19VUkkgd2l0aCBmb3JtYXQgb2Y6CitTUkNfVVJJID0gImdpdDovL3NvbWUuaG9zdC9zb21lcGF0aDtPcHRpb25BPXh4eDtPcHRpb25CPXh4eDsuLi4iCisKK1N1cHBvcnRlZCBTUkNfVVJJIG9wdGlvbnMgYXJlOgorCistIGJyYW5jaAorICAgVGhlIGdpdCBicmFuY2ggdG8gcmV0cmlldmUgZnJvbS4gVGhlIGRlZmF1bHQgaXMgIm1hc3RlciIKKworICAgVGhpcyBvcHRpb24gYWxzbyBzdXBwb3J0cyBtdWx0aXBsZSBicmFuY2ggZmV0Y2hpbmcsIHdpdGggYnJhbmNoZXMKKyAgIHNlcGFyYXRlZCBieSBjb21tYXMuICBJbiBtdWx0aXBsZSBicmFuY2hlcyBjYXNlLCB0aGUgbmFtZSBvcHRpb24KKyAgIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgbmFtZXMgdG8gbWF0Y2ggdGhlIGJyYW5jaGVzLCB3aGljaCBpcworICAgdXNlZCB0byBzcGVjaWZ5IHRoZSBTUkNfUkVWIGZvciB0aGUgYnJhbmNoCisgICBlLmc6CisgICBTUkNfVVJJPSJnaXQ6Ly9zb21lLmhvc3Qvc29tZXBhdGg7YnJhbmNoPWJyYW5jaFgsYnJhbmNoWTtuYW1lPW5hbWVYLG5hbWVZIgorICAgU1JDUkVWX25hbWVYID0gInh4eHh4eHh4eHh4eHh4eHh4eHh4IgorICAgU1JDUkVWX25hbWVZID0gIllZWVlZWVlZWVlZWVlZWVlZWVlZIgorCistIHRhZworICAgIFRoZSBnaXQgdGFnIHRvIHJldHJpZXZlLiBUaGUgZGVmYXVsdCBpcyAibWFzdGVyIgorCistIHByb3RvY29sCisgICBUaGUgbWV0aG9kIHRvIHVzZSB0byBhY2Nlc3MgdGhlIHJlcG9zaXRvcnkuIENvbW1vbiBvcHRpb25zIGFyZSAiZ2l0IiwKKyAgICJodHRwIiwgImh0dHBzIiwgImZpbGUiLCAic3NoIiBhbmQgInJzeW5jIi4gVGhlIGRlZmF1bHQgaXMgImdpdCIuCisKKy0gcmViYXNlYWJsZQorICAgcmViYXNlYWJsZSBpbmRpY2F0ZXMgdGhhdCB0aGUgdXBzdHJlYW0gZ2l0IHJlcG8gbWF5IHJlYmFzZSBpbiB0aGUgZnV0dXJlLAorICAgYW5kIGN1cnJlbnQgcmV2aXNpb24gbWF5IGRpc2FwcGVhciBmcm9tIHVwc3RyZWFtIHJlcG8uIFRoaXMgb3B0aW9uIHdpbGwKKyAgIHJlbWluZCBmZXRjaGVyIHRvIHByZXNlcnZlIGxvY2FsIGNhY2hlIGNhcmVmdWxseSBmb3IgZnV0dXJlIHVzZS4KKyAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzICIwIiwgc2V0IHJlYmFzZWFibGU9MSBmb3IgcmViYXNlYWJsZSBnaXQgcmVwby4KKworLSBub2NoZWNrb3V0CisgICBEb24ndCBjaGVja291dCBzb3VyY2UgY29kZSB3aGVuIHVucGFja2luZy4gc2V0IHRoaXMgb3B0aW9uIGZvciB0aGUgcmVjaXBlCisgICB3aG8gaGFzIGl0cyBvd24gcm91dGluZSB0byBjaGVja291dCBjb2RlLgorICAgVGhlIGRlZmF1bHQgaXMgIjAiLCBzZXQgbm9jaGVja291dD0xIGlmIG5lZWRlZC4KKworLSBiYXJlY2xvbmUKKyAgIENyZWF0ZSBhIGJhcmUgY2xvbmUgb2YgdGhlIHNvdXJjZSBjb2RlIGFuZCBkb24ndCBjaGVja291dCB0aGUgc291cmNlIGNvZGUKKyAgIHdoZW4gdW5wYWNraW5nLiBTZXQgdGhpcyBvcHRpb24gZm9yIHRoZSByZWNpcGUgd2hvIGhhcyBpdHMgb3duIHJvdXRpbmUgdG8KKyAgIGNoZWNrb3V0IGNvZGUgYW5kIHRyYWNraW5nIGJyYW5jaCByZXF1aXJlbWVudHMuCisgICBUaGUgZGVmYXVsdCBpcyAiMCIsIHNldCBiYXJlY2xvbmU9MSBpZiBuZWVkZWQuCisKKy0gbm9icmFuY2gKKyAgIERvbid0IGNoZWNrIHRoZSBTSEEgdmFsaWRhdGlvbiBmb3IgYnJhbmNoLiBzZXQgdGhpcyBvcHRpb24gZm9yIHRoZSByZWNpcGUKKyAgIHJlZmVycmluZyB0byBjb21taXQgd2hpY2ggaXMgdmFsaWQgaW4gdGFnIGluc3RlYWQgb2YgYnJhbmNoLgorICAgVGhlIGRlZmF1bHQgaXMgIjAiLCBzZXQgbm9icmFuY2g9MSBpZiBuZWVkZWQuCisKKyIiIgorCisjQ29weXJpZ2h0IChDKSAyMDA1IFJpY2hhcmQgUHVyZGllCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IGJiCitmcm9tICAgYmIgICAgaW1wb3J0IGRhdGEKK2Zyb20gICBiYi5mZXRjaDIgaW1wb3J0IEZldGNoTWV0aG9kCitmcm9tICAgYmIuZmV0Y2gyIGltcG9ydCBydW5mZXRjaGNtZAorZnJvbSAgIGJiLmZldGNoMiBpbXBvcnQgbG9nZ2VyCisKK2NsYXNzIEdpdChGZXRjaE1ldGhvZCk6CisgICAgIiIiQ2xhc3MgdG8gZmV0Y2ggYSBtb2R1bGUgb3IgbW9kdWxlcyBmcm9tIGdpdCByZXBvc2l0b3JpZXMiIiIKKyAgICBkZWYgaW5pdChzZWxmLCBkKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHN1cHBvcnRzKHNlbGYsIHVkLCBkKToKKyAgICAgICAgIiIiCisgICAgICAgIENoZWNrIHRvIHNlZSBpZiBhIGdpdmVuIHVybCBjYW4gYmUgZmV0Y2hlZCB3aXRoIGdpdC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiB1ZC50eXBlIGluIFsnZ2l0J10KKworICAgIGRlZiBzdXBwb3J0c19jaGVja3N1bShzZWxmLCB1cmxkYXRhKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgdXJsZGF0YV9pbml0KHNlbGYsIHVkLCBkKToKKyAgICAgICAgIiIiCisgICAgICAgIGluaXQgZ2l0IHNwZWNpZmljIHZhcmlhYmxlIHdpdGhpbiB1cmwgZGF0YQorICAgICAgICBzbyB0aGF0IHRoZSBnaXQgbWV0aG9kIGxpa2UgbGF0ZXN0X3JldmlzaW9uKCkgY2FuIHdvcmsKKyAgICAgICAgIiIiCisgICAgICAgIGlmICdwcm90b2NvbCcgaW4gdWQucGFybToKKyAgICAgICAgICAgIHVkLnByb3RvID0gdWQucGFybVsncHJvdG9jb2wnXQorICAgICAgICBlbGlmIG5vdCB1ZC5ob3N0OgorICAgICAgICAgICAgdWQucHJvdG8gPSAnZmlsZScKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHVkLnByb3RvID0gImdpdCIKKworICAgICAgICBpZiBub3QgdWQucHJvdG8gaW4gKCdnaXQnLCAnZmlsZScsICdzc2gnLCAnaHR0cCcsICdodHRwcycsICdyc3luYycpOgorICAgICAgICAgICAgcmFpc2UgYmIuZmV0Y2gyLlBhcmFtZXRlckVycm9yKCJJbnZhbGlkIHByb3RvY29sIHR5cGUiLCB1ZC51cmwpCisKKyAgICAgICAgdWQubm9jaGVja291dCA9IHVkLnBhcm0uZ2V0KCJub2NoZWNrb3V0IiwiMCIpID09ICIxIgorCisgICAgICAgIHVkLnJlYmFzZWFibGUgPSB1ZC5wYXJtLmdldCgicmViYXNlYWJsZSIsIjAiKSA9PSAiMSIKKworICAgICAgICB1ZC5ub2JyYW5jaCA9IHVkLnBhcm0uZ2V0KCJub2JyYW5jaCIsIjAiKSA9PSAiMSIKKworICAgICAgICAjIGJhcmVjbG9uZSBpbXBsaWVzIG5vY2hlY2tvdXQKKyAgICAgICAgdWQuYmFyZWNsb25lID0gdWQucGFybS5nZXQoImJhcmVjbG9uZSIsIjAiKSA9PSAiMSIKKyAgICAgICAgaWYgdWQuYmFyZWNsb25lOgorICAgICAgICAgICAgdWQubm9jaGVja291dCA9IDEKKyAgCisgICAgICAgIHVkLnVucmVzb2x2ZWRyZXYgPSB7fQorICAgICAgICBicmFuY2hlcyA9IHVkLnBhcm0uZ2V0KCJicmFuY2giLCAibWFzdGVyIikuc3BsaXQoJywnKQorICAgICAgICBpZiBsZW4oYnJhbmNoZXMpICE9IGxlbih1ZC5uYW1lcyk6CisgICAgICAgICAgICByYWlzZSBiYi5mZXRjaDIuUGFyYW1ldGVyRXJyb3IoIlRoZSBudW1iZXIgb2YgbmFtZSBhbmQgYnJhbmNoIHBhcmFtZXRlcnMgaXMgbm90IGJhbGFuY2VkIiwgdWQudXJsKQorICAgICAgICB1ZC5icmFuY2hlcyA9IHt9CisgICAgICAgIGZvciBuYW1lIGluIHVkLm5hbWVzOgorICAgICAgICAgICAgYnJhbmNoID0gYnJhbmNoZXNbdWQubmFtZXMuaW5kZXgobmFtZSldCisgICAgICAgICAgICB1ZC5icmFuY2hlc1tuYW1lXSA9IGJyYW5jaAorICAgICAgICAgICAgdWQudW5yZXNvbHZlZHJldltuYW1lXSA9IGJyYW5jaAorCisgICAgICAgIHVkLmJhc2VjbWQgPSBkYXRhLmdldFZhcigiRkVUQ0hDTURfZ2l0IiwgZCwgVHJ1ZSkgb3IgImdpdCAtYyBjb3JlLmZzeW5jb2JqZWN0ZmlsZXM9MCIKKworICAgICAgICB1ZC53cml0ZV90YXJiYWxscyA9ICgoZGF0YS5nZXRWYXIoIkJCX0dFTkVSQVRFX01JUlJPUl9UQVJCQUxMUyIsIGQsIFRydWUpIG9yICIwIikgIT0gIjAiKSBvciB1ZC5yZWJhc2VhYmxlCisKKyAgICAgICAgdWQuc2V0dXBfcmV2aXNvbnMoZCkKKworICAgICAgICBmb3IgbmFtZSBpbiB1ZC5uYW1lczoKKyAgICAgICAgICAgICMgRW5zdXJlIGFueXRoaW5nIHRoYXQgZG9lc24ndCBsb29rIGxpa2UgYSBzaGEyNTYgY2hlY2tzdW0vcmV2aXNpb24gaXMgdHJhbnNsYXRlZCBpbnRvIG9uZQorICAgICAgICAgICAgaWYgbm90IHVkLnJldmlzaW9uc1tuYW1lXSBvciBsZW4odWQucmV2aXNpb25zW25hbWVdKSAhPSA0MCAgb3IgKEZhbHNlIGluIFtjIGluICJhYmNkZWYwMTIzNDU2Nzg5IiBmb3IgYyBpbiB1ZC5yZXZpc2lvbnNbbmFtZV1dKToKKyAgICAgICAgICAgICAgICBpZiB1ZC5yZXZpc2lvbnNbbmFtZV06CisgICAgICAgICAgICAgICAgICAgIHVkLnVucmVzb2x2ZWRyZXZbbmFtZV0gPSB1ZC5yZXZpc2lvbnNbbmFtZV0KKyAgICAgICAgICAgICAgICB1ZC5yZXZpc2lvbnNbbmFtZV0gPSBzZWxmLmxhdGVzdF9yZXZpc2lvbih1ZCwgZCwgbmFtZSkKKworICAgICAgICBnaXRzcmNuYW1lID0gJyVzJXMnICUgKHVkLmhvc3QucmVwbGFjZSgnOicsICcuJyksIHVkLnBhdGgucmVwbGFjZSgnLycsICcuJykucmVwbGFjZSgnKicsICcuJykpCisgICAgICAgIGlmIGdpdHNyY25hbWUuc3RhcnRzd2l0aCgnLicpOgorICAgICAgICAgICAgZ2l0c3JjbmFtZSA9IGdpdHNyY25hbWVbMTpdCisKKyAgICAgICAgIyBmb3IgcmViYXNlYWJsZSBnaXQgcmVwbywgaXQgaXMgbmVjZXNzYXJ5IHRvIGtlZXAgbWlycm9yIHRhciBiYWxsCisgICAgICAgICMgcGVyIHJldmlzaW9uLCBzbyB0aGF0IGV2ZW4gdGhlIHJldmlzaW9uIGRpc2FwcGVhcnMgZnJvbSB0aGUKKyAgICAgICAgIyB1cHN0cmVhbSByZXBvIGluIHRoZSBmdXR1cmUsIHRoZSBtaXJyb3Igd2lsbCByZW1haW4gaW50YWN0IGFuZCBzdGlsbAorICAgICAgICAjIGNvbnRhaW5zIHRoZSByZXZpc2lvbgorICAgICAgICBpZiB1ZC5yZWJhc2VhYmxlOgorICAgICAgICAgICAgZm9yIG5hbWUgaW4gdWQubmFtZXM6CisgICAgICAgICAgICAgICAgZ2l0c3JjbmFtZSA9IGdpdHNyY25hbWUgKyAnXycgKyB1ZC5yZXZpc2lvbnNbbmFtZV0KKyAgICAgICAgdWQubWlycm9ydGFyYmFsbCA9ICdnaXQyXyVzLnRhci5neicgJSAoZ2l0c3JjbmFtZSkKKyAgICAgICAgdWQuZnVsbG1pcnJvciA9IG9zLnBhdGguam9pbihkLmdldFZhcigiRExfRElSIiwgVHJ1ZSksIHVkLm1pcnJvcnRhcmJhbGwpCisgICAgICAgIGdpdGRpciA9IGQuZ2V0VmFyKCJHSVRESVIiLCBUcnVlKSBvciAoZC5nZXRWYXIoIkRMX0RJUiIsIFRydWUpICsgIi9naXQyLyIpCisgICAgICAgIHVkLmNsb25lZGlyID0gb3MucGF0aC5qb2luKGdpdGRpciwgZ2l0c3JjbmFtZSkKKworICAgICAgICB1ZC5sb2NhbGZpbGUgPSB1ZC5jbG9uZWRpcgorCisgICAgZGVmIGxvY2FscGF0aChzZWxmLCB1ZCwgZCk6CisgICAgICAgIHJldHVybiB1ZC5jbG9uZWRpcgorCisgICAgZGVmIG5lZWRfdXBkYXRlKHNlbGYsIHVkLCBkKToKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHVkLmNsb25lZGlyKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIG9zLmNoZGlyKHVkLmNsb25lZGlyKQorICAgICAgICBmb3IgbmFtZSBpbiB1ZC5uYW1lczoKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9jb250YWluc19yZWYodWQsIGQsIG5hbWUpOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGlmIHVkLndyaXRlX3RhcmJhbGxzIGFuZCBub3Qgb3MucGF0aC5leGlzdHModWQuZnVsbG1pcnJvcik6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiB0cnlfcHJlbWlycm9yKHNlbGYsIHVkLCBkKToKKyAgICAgICAgIyBJZiB3ZSBkb24ndCBkbyB0aGlzLCB1cGRhdGluZyBhbiBleGlzdGluZyBjaGVja291dCB3aXRoIG9ubHkgcHJlbWlycm9ycworICAgICAgICAjIGlzIG5vdCBwb3NzaWJsZQorICAgICAgICBpZiBkLmdldFZhcigiQkJfRkVUQ0hfUFJFTUlSUk9ST05MWSIsIFRydWUpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHModWQuY2xvbmVkaXIpOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgZG93bmxvYWQoc2VsZiwgdWQsIGQpOgorICAgICAgICAiIiJGZXRjaCB1cmwiIiIKKworICAgICAgICB1ZC5yZXBvY2hhbmdlZCA9IG5vdCBvcy5wYXRoLmV4aXN0cyh1ZC5mdWxsbWlycm9yKQorCisgICAgICAgICMgSWYgdGhlIGNoZWNrb3V0IGRvZXNuJ3QgZXhpc3QgYW5kIHRoZSBtaXJyb3IgdGFyYmFsbCBkb2VzLCBleHRyYWN0IGl0CisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyh1ZC5jbG9uZWRpcikgYW5kIG9zLnBhdGguZXhpc3RzKHVkLmZ1bGxtaXJyb3IpOgorICAgICAgICAgICAgYmIudXRpbHMubWtkaXJoaWVyKHVkLmNsb25lZGlyKQorICAgICAgICAgICAgb3MuY2hkaXIodWQuY2xvbmVkaXIpCisgICAgICAgICAgICBydW5mZXRjaGNtZCgidGFyIC14emYgJXMiICUgKHVkLmZ1bGxtaXJyb3IpLCBkKQorCisgICAgICAgIHJlcG91cmwgPSBzZWxmLl9nZXRfcmVwb191cmwodWQpCisKKyAgICAgICAgIyBJZiB0aGUgcmVwbyBzdGlsbCBkb2Vzbid0IGV4aXN0LCBmYWxsYmFjayB0byBjbG9uaW5nIGl0CisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyh1ZC5jbG9uZWRpcik6CisgICAgICAgICAgICAjIFdlIGRvIHRoaXMgc2luY2UgZ2l0IHdpbGwgdXNlIGEgIi1sIiBvcHRpb24gYXV0b21hdGljYWxseSBmb3IgbG9jYWwgdXJscyB3aGVyZSBwb3NzaWJsZQorICAgICAgICAgICAgaWYgcmVwb3VybC5zdGFydHN3aXRoKCJmaWxlOi8vIik6CisgICAgICAgICAgICAgICAgcmVwb3VybCA9IHJlcG91cmxbNzpdCisgICAgICAgICAgICBjbG9uZV9jbWQgPSAiJXMgY2xvbmUgLS1iYXJlIC0tbWlycm9yICVzICVzIiAlICh1ZC5iYXNlY21kLCByZXBvdXJsLCB1ZC5jbG9uZWRpcikKKyAgICAgICAgICAgIGlmIHVkLnByb3RvLmxvd2VyKCkgIT0gJ2ZpbGUnOgorICAgICAgICAgICAgICAgIGJiLmZldGNoMi5jaGVja19uZXR3b3JrX2FjY2VzcyhkLCBjbG9uZV9jbWQpCisgICAgICAgICAgICBydW5mZXRjaGNtZChjbG9uZV9jbWQsIGQpCisKKyAgICAgICAgb3MuY2hkaXIodWQuY2xvbmVkaXIpCisgICAgICAgICMgVXBkYXRlIHRoZSBjaGVja291dCBpZiBuZWVkZWQKKyAgICAgICAgbmVlZHVwZGF0ZSA9IEZhbHNlCisgICAgICAgIGZvciBuYW1lIGluIHVkLm5hbWVzOgorICAgICAgICAgICAgaWYgbm90IHNlbGYuX2NvbnRhaW5zX3JlZih1ZCwgZCwgbmFtZSk6CisgICAgICAgICAgICAgICAgbmVlZHVwZGF0ZSA9IFRydWUKKyAgICAgICAgaWYgbmVlZHVwZGF0ZToKKyAgICAgICAgICAgIHRyeTogCisgICAgICAgICAgICAgICAgcnVuZmV0Y2hjbWQoIiVzIHJlbW90ZSBybSBvcmlnaW4iICUgdWQuYmFzZWNtZCwgZCkgCisgICAgICAgICAgICBleGNlcHQgYmIuZmV0Y2gyLkZldGNoRXJyb3I6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJObyBPcmlnaW4iKQorCisgICAgICAgICAgICBydW5mZXRjaGNtZCgiJXMgcmVtb3RlIGFkZCAtLW1pcnJvcj1mZXRjaCBvcmlnaW4gJXMiICUgKHVkLmJhc2VjbWQsIHJlcG91cmwpLCBkKQorICAgICAgICAgICAgZmV0Y2hfY21kID0gIiVzIGZldGNoIC1mIC0tcHJ1bmUgJXMgcmVmcy8qOnJlZnMvKiIgJSAodWQuYmFzZWNtZCwgcmVwb3VybCkKKyAgICAgICAgICAgIGlmIHVkLnByb3RvLmxvd2VyKCkgIT0gJ2ZpbGUnOgorICAgICAgICAgICAgICAgIGJiLmZldGNoMi5jaGVja19uZXR3b3JrX2FjY2VzcyhkLCBmZXRjaF9jbWQsIHVkLnVybCkKKyAgICAgICAgICAgIHJ1bmZldGNoY21kKGZldGNoX2NtZCwgZCkKKyAgICAgICAgICAgIHJ1bmZldGNoY21kKCIlcyBwcnVuZS1wYWNrZWQiICUgdWQuYmFzZWNtZCwgZCkKKyAgICAgICAgICAgIHJ1bmZldGNoY21kKCIlcyBwYWNrLXJlZHVuZGFudCAtLWFsbCB8IHhhcmdzIC1yIHJtIiAlIHVkLmJhc2VjbWQsIGQpCisgICAgICAgICAgICB1ZC5yZXBvY2hhbmdlZCA9IFRydWUKKyAgICAgICAgb3MuY2hkaXIodWQuY2xvbmVkaXIpCisgICAgICAgIGZvciBuYW1lIGluIHVkLm5hbWVzOgorICAgICAgICAgICAgaWYgbm90IHNlbGYuX2NvbnRhaW5zX3JlZih1ZCwgZCwgbmFtZSk6CisgICAgICAgICAgICAgICAgcmFpc2UgYmIuZmV0Y2gyLkZldGNoRXJyb3IoIlVuYWJsZSB0byBmaW5kIHJldmlzaW9uICVzIGluIGJyYW5jaCAlcyBldmVuIGZyb20gdXBzdHJlYW0iICUgKHVkLnJldmlzaW9uc1tuYW1lXSwgdWQuYnJhbmNoZXNbbmFtZV0pKQorCisgICAgZGVmIGJ1aWxkX21pcnJvcl9kYXRhKHNlbGYsIHVkLCBkKToKKyAgICAgICAgIyBHZW5lcmF0ZSBhIG1pcnJvciB0YXJiYWxsIGlmIG5lZWRlZAorICAgICAgICBpZiB1ZC53cml0ZV90YXJiYWxscyBhbmQgKHVkLnJlcG9jaGFuZ2VkIG9yIG5vdCBvcy5wYXRoLmV4aXN0cyh1ZC5mdWxsbWlycm9yKSk6CisgICAgICAgICAgICAjIGl0J3MgcG9zc2libGUgdGhhdCB0aGlzIHN5bWxpbmsgcG9pbnRzIHRvIHJlYWQtb25seSBmaWxlc3lzdGVtIHdpdGggUFJFTUlSUk9SCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzbGluayh1ZC5mdWxsbWlycm9yKToKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsodWQuZnVsbG1pcnJvcikKKworICAgICAgICAgICAgb3MuY2hkaXIodWQuY2xvbmVkaXIpCisgICAgICAgICAgICBsb2dnZXIuaW5mbygiQ3JlYXRpbmcgdGFyYmFsbCBvZiBnaXQgcmVwb3NpdG9yeSIpCisgICAgICAgICAgICBydW5mZXRjaGNtZCgidGFyIC1jemYgJXMgJXMiICUgKHVkLmZ1bGxtaXJyb3IsIG9zLnBhdGguam9pbigiLiIpICksIGQpCisgICAgICAgICAgICBydW5mZXRjaGNtZCgidG91Y2ggJXMuZG9uZSIgJSAodWQuZnVsbG1pcnJvciksIGQpCisKKyAgICBkZWYgdW5wYWNrKHNlbGYsIHVkLCBkZXN0ZGlyLCBkKToKKyAgICAgICAgIiIiIHVucGFjayB0aGUgZG93bmxvYWRlZCBzcmMgdG8gZGVzdGRpciIiIgorCisgICAgICAgIHN1YmRpciA9IHVkLnBhcm0uZ2V0KCJzdWJwYXRoIiwgIiIpCisgICAgICAgIGlmIHN1YmRpciAhPSAiIjoKKyAgICAgICAgICAgIHJlYWRwYXRoc3BlYyA9ICI6JXMiICUgKHN1YmRpcikKKyAgICAgICAgICAgIGRlZl9kZXN0c3VmZml4ID0gIiVzLyIgJSBvcy5wYXRoLmJhc2VuYW1lKHN1YmRpci5yc3RyaXAoJy8nKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlYWRwYXRoc3BlYyA9ICIiCisgICAgICAgICAgICBkZWZfZGVzdHN1ZmZpeCA9ICJnaXQvIgorCisgICAgICAgIGRlc3RzdWZmaXggPSB1ZC5wYXJtLmdldCgiZGVzdHN1ZmZpeCIsIGRlZl9kZXN0c3VmZml4KQorICAgICAgICBkZXN0ZGlyID0gdWQuZGVzdGRpciA9IG9zLnBhdGguam9pbihkZXN0ZGlyLCBkZXN0c3VmZml4KQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhkZXN0ZGlyKToKKyAgICAgICAgICAgIGJiLnV0aWxzLnBydW5lZGlyKGRlc3RkaXIpCisKKyAgICAgICAgY2xvbmVmbGFncyA9ICItcyAtbiIKKyAgICAgICAgaWYgdWQuYmFyZWNsb25lOgorICAgICAgICAgICAgY2xvbmVmbGFncyArPSAiIC0tbWlycm9yIgorCisgICAgICAgICMgVmVyc2lvbnMgb2YgZ2l0IHByaW9yIHRvIDEuNy45LjIgaGF2ZSBpc3N1ZXMgd2hlcmUgZm9vLmdpdCBhbmQgZm9vIGdldCBjb25mdXNlZAorICAgICAgICAjIGFuZCB5b3UgZW5kIHVwIHdpdGggc29tZSBob3JyaWJsZSB1bmlvbiBvZiB0aGUgdHdvIHdoZW4geW91IGF0dGVtcHQgdG8gY2xvbmUgaXQKKyAgICAgICAgIyBUaGUgbGVhc3QgaW52YXNpdmUgd29ya2Fyb3VuZCBzZWVtcyB0byBiZSBhIHN5bWxpbmsgdG8gdGhlIHJlYWwgZGlyZWN0b3J5IHRvCisgICAgICAgICMgZm9vbCBnaXQgaW50byBpZ25vcmluZyBhbnkgLmdpdCB2ZXJzaW9uIHRoYXQgbWF5IGFsc28gYmUgcHJlc2VudC4KKyAgICAgICAgIworICAgICAgICAjIFRoZSBpc3N1ZSBpcyBmaXhlZCBpbiBtb3JlIHJlY2VudCB2ZXJzaW9ucyBvZiBnaXQgc28gd2UgY2FuIGRyb3AgdGhpcyBoYWNrIGluIGZ1dHVyZQorICAgICAgICAjIHdoZW4gdGhhdCB2ZXJzaW9uIGJlY29tZXMgY29tbW9uIGVub3VnaC4KKyAgICAgICAgY2xvbmVkaXIgPSB1ZC5jbG9uZWRpcgorICAgICAgICBpZiBub3QgdWQucGF0aC5lbmRzd2l0aCgiLmdpdCIpOgorICAgICAgICAgICAgaW5kaXJlY3Rpb25kaXIgPSBkZXN0ZGlyWzotMV0gKyAiLmluZGlyZWN0aW9uc3ltbGluayIKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGluZGlyZWN0aW9uZGlyKToKKyAgICAgICAgICAgICAgICBvcy5yZW1vdmUoaW5kaXJlY3Rpb25kaXIpCisgICAgICAgICAgICBiYi51dGlscy5ta2RpcmhpZXIob3MucGF0aC5kaXJuYW1lKGluZGlyZWN0aW9uZGlyKSkKKyAgICAgICAgICAgIG9zLnN5bWxpbmsodWQuY2xvbmVkaXIsIGluZGlyZWN0aW9uZGlyKQorICAgICAgICAgICAgY2xvbmVkaXIgPSBpbmRpcmVjdGlvbmRpcgorCisgICAgICAgIHJ1bmZldGNoY21kKCIlcyBjbG9uZSAlcyAlcy8gJXMiICUgKHVkLmJhc2VjbWQsIGNsb25lZmxhZ3MsIGNsb25lZGlyLCBkZXN0ZGlyKSwgZCkKKyAgICAgICAgb3MuY2hkaXIoZGVzdGRpcikKKyAgICAgICAgcmVwb3VybCA9IHNlbGYuX2dldF9yZXBvX3VybCh1ZCkKKyAgICAgICAgcnVuZmV0Y2hjbWQoIiVzIHJlbW90ZSBzZXQtdXJsIG9yaWdpbiAlcyIgJSAodWQuYmFzZWNtZCwgcmVwb3VybCksIGQpCisgICAgICAgIGlmIG5vdCB1ZC5ub2NoZWNrb3V0OgorICAgICAgICAgICAgaWYgc3ViZGlyICE9ICIiOgorICAgICAgICAgICAgICAgIHJ1bmZldGNoY21kKCIlcyByZWFkLXRyZWUgJXMlcyIgJSAodWQuYmFzZWNtZCwgdWQucmV2aXNpb25zW3VkLm5hbWVzWzBdXSwgcmVhZHBhdGhzcGVjKSwgZCkKKyAgICAgICAgICAgICAgICBydW5mZXRjaGNtZCgiJXMgY2hlY2tvdXQtaW5kZXggLXEgLWYgLWEiICUgdWQuYmFzZWNtZCwgZCkKKyAgICAgICAgICAgIGVsaWYgbm90IHVkLm5vYnJhbmNoOgorICAgICAgICAgICAgICAgIGJyYW5jaG5hbWUgPSAgdWQuYnJhbmNoZXNbdWQubmFtZXNbMF1dCisgICAgICAgICAgICAgICAgcnVuZmV0Y2hjbWQoIiVzIGNoZWNrb3V0IC1CICVzICVzIiAlICh1ZC5iYXNlY21kLCBicmFuY2huYW1lLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWQucmV2aXNpb25zW3VkLm5hbWVzWzBdXSksIGQpCisgICAgICAgICAgICAgICAgcnVuZmV0Y2hjbWQoIiVzIGJyYW5jaCAtLXNldC11cHN0cmVhbSAlcyBvcmlnaW4vJXMiICUgKHVkLmJhc2VjbWQsIGJyYW5jaG5hbWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmFuY2huYW1lKSwgZCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcnVuZmV0Y2hjbWQoIiVzIGNoZWNrb3V0ICVzIiAlICh1ZC5iYXNlY21kLCB1ZC5yZXZpc2lvbnNbdWQubmFtZXNbMF1dKSwgZCkKKworICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGNsZWFuKHNlbGYsIHVkLCBkKToKKyAgICAgICAgIiIiIGNsZWFuIHRoZSBnaXQgZGlyZWN0b3J5ICIiIgorCisgICAgICAgIGJiLnV0aWxzLnJlbW92ZSh1ZC5sb2NhbHBhdGgsIFRydWUpCisgICAgICAgIGJiLnV0aWxzLnJlbW92ZSh1ZC5mdWxsbWlycm9yKQorICAgICAgICBiYi51dGlscy5yZW1vdmUodWQuZnVsbG1pcnJvciArICIuZG9uZSIpCisKKyAgICBkZWYgc3VwcG9ydHNfc3JjcmV2KHNlbGYpOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIF9jb250YWluc19yZWYoc2VsZiwgdWQsIGQsIG5hbWUpOgorICAgICAgICBjbWQgPSAiIgorICAgICAgICBpZiB1ZC5ub2JyYW5jaDoKKyAgICAgICAgICAgIGNtZCA9ICIlcyBsb2cgLS1wcmV0dHk9b25lbGluZSAtbiAxICVzIC0tIDI+IC9kZXYvbnVsbCB8IHdjIC1sIiAlICgKKyAgICAgICAgICAgICAgICB1ZC5iYXNlY21kLCB1ZC5yZXZpc2lvbnNbbmFtZV0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjbWQgPSAgIiVzIGJyYW5jaCAtLWNvbnRhaW5zICVzIC0tbGlzdCAlcyAyPiAvZGV2L251bGwgfCB3YyAtbCIgJSAoCisgICAgICAgICAgICAgICAgdWQuYmFzZWNtZCwgdWQucmV2aXNpb25zW25hbWVdLCB1ZC5icmFuY2hlc1tuYW1lXSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3V0cHV0ID0gcnVuZmV0Y2hjbWQoY21kLCBkLCBxdWlldD1UcnVlKQorICAgICAgICBleGNlcHQgYmIuZmV0Y2gyLkZldGNoRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgaWYgbGVuKG91dHB1dC5zcGxpdCgpKSA+IDE6CisgICAgICAgICAgICByYWlzZSBiYi5mZXRjaDIuRmV0Y2hFcnJvcigiVGhlIGNvbW1hbmQgJyVzJyBnYXZlIG91dHB1dCB3aXRoIG1vcmUgdGhlbiAxIGxpbmUgdW5leHBlY3RlZGx5LCBvdXRwdXQ6ICclcyciICUgKGNtZCwgb3V0cHV0KSkKKyAgICAgICAgcmV0dXJuIG91dHB1dC5zcGxpdCgpWzBdICE9ICIwIgorCisgICAgZGVmIF9nZXRfcmVwb191cmwoc2VsZiwgdWQpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIHRoZSByZXBvc2l0b3J5IFVSTAorICAgICAgICAiIiIKKyAgICAgICAgaWYgdWQudXNlcjoKKyAgICAgICAgICAgIHVzZXJuYW1lID0gdWQudXNlciArICdAJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgdXNlcm5hbWUgPSAiIgorICAgICAgICByZXR1cm4gIiVzOi8vJXMlcyVzIiAlICh1ZC5wcm90bywgdXNlcm5hbWUsIHVkLmhvc3QsIHVkLnBhdGgpCisKKyAgICBkZWYgX3JldmlzaW9uX2tleShzZWxmLCB1ZCwgZCwgbmFtZSk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSB1bmlxdWUga2V5IGZvciB0aGUgdXJsCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gImdpdDoiICsgdWQuaG9zdCArIHVkLnBhdGgucmVwbGFjZSgnLycsICcuJykgKyB1ZC51bnJlc29sdmVkcmV2W25hbWVdCisKKyAgICBkZWYgX2xzcmVtb3RlKHNlbGYsIHVkLCBkLCBzZWFyY2gpOgorICAgICAgICAiIiIKKyAgICAgICAgUnVuIGdpdCBscy1yZW1vdGUgd2l0aCB0aGUgc3BlY2lmaWVkIHNlYXJjaCBzdHJpbmcKKyAgICAgICAgIiIiCisgICAgICAgIHJlcG91cmwgPSBzZWxmLl9nZXRfcmVwb191cmwodWQpCisgICAgICAgIGNtZCA9ICIlcyBscy1yZW1vdGUgJXMgJXMiICUgXAorICAgICAgICAgICAgICAodWQuYmFzZWNtZCwgcmVwb3VybCwgc2VhcmNoKQorICAgICAgICBpZiB1ZC5wcm90by5sb3dlcigpICE9ICdmaWxlJzoKKyAgICAgICAgICAgIGJiLmZldGNoMi5jaGVja19uZXR3b3JrX2FjY2VzcyhkLCBjbWQpCisgICAgICAgIG91dHB1dCA9IHJ1bmZldGNoY21kKGNtZCwgZCwgVHJ1ZSkKKyAgICAgICAgaWYgbm90IG91dHB1dDoKKyAgICAgICAgICAgIHJhaXNlIGJiLmZldGNoMi5GZXRjaEVycm9yKCJUaGUgY29tbWFuZCAlcyBnYXZlIGVtcHR5IG91dHB1dCB1bmV4cGVjdGVkbHkiICUgY21kLCB1ZC51cmwpCisgICAgICAgIHJldHVybiBvdXRwdXQKKworICAgIGRlZiBfbGF0ZXN0X3JldmlzaW9uKHNlbGYsIHVkLCBkLCBuYW1lKToKKyAgICAgICAgIiIiCisgICAgICAgIENvbXB1dGUgdGhlIEhFQUQgcmV2aXNpb24gZm9yIHRoZSB1cmwKKyAgICAgICAgIiIiCisgICAgICAgIG91dHB1dCA9IHNlbGYuX2xzcmVtb3RlKHVkLCBkLCAiIikKKyAgICAgICAgIyBUYWdzIG9mIHRoZSBmb3JtIF57fSBtYXkgbm90IHdvcmssIG5lZWQgdG8gZmFsbGJhY2sgdG8gb3RoZXIgZm9ybQorICAgICAgICBpZiB1ZC51bnJlc29sdmVkcmV2W25hbWVdWzo1XSA9PSAicmVmcy8iOgorICAgICAgICAgICAgaGVhZCA9IHVkLnVucmVzb2x2ZWRyZXZbbmFtZV0KKyAgICAgICAgICAgIHRhZyA9IHVkLnVucmVzb2x2ZWRyZXZbbmFtZV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGhlYWQgPSAicmVmcy9oZWFkcy8lcyIgJSB1ZC51bnJlc29sdmVkcmV2W25hbWVdCisgICAgICAgICAgICB0YWcgPSAicmVmcy90YWdzLyVzIiAlIHVkLnVucmVzb2x2ZWRyZXZbbmFtZV0KKyAgICAgICAgZm9yIHMgaW4gW2hlYWQsIHRhZyArICJee30iLCB0YWddOgorICAgICAgICAgICAgZm9yIGwgaW4gb3V0cHV0LnNwbGl0KCdcbicpOgorICAgICAgICAgICAgICAgIGlmIHMgaW4gbDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGwuc3BsaXQoKVswXQorICAgICAgICByYWlzZSBiYi5mZXRjaDIuRmV0Y2hFcnJvcigiVW5hYmxlIHRvIHJlc29sdmUgJyVzJyBpbiB1cHN0cmVhbSBnaXQgcmVwb3NpdG9yeSBpbiBnaXQgbHMtcmVtb3RlIG91dHB1dCBmb3IgJXMiICUgXAorICAgICAgICAgICAgKHVkLnVucmVzb2x2ZWRyZXZbbmFtZV0sIHVkLmhvc3QrdWQucGF0aCkpCisKKyAgICBkZWYgbGF0ZXN0X3ZlcnNpb25zdHJpbmcoc2VsZiwgdWQsIGQpOgorICAgICAgICAiIiIKKyAgICAgICAgQ29tcHV0ZSB0aGUgbGF0ZXN0IHJlbGVhc2UgbmFtZSBsaWtlICJ4LnkueCIgaW4gIngueS54K2dpdEhBU0giCisgICAgICAgIGJ5IHNlYXJjaGluZyB0aHJvdWdoIHRoZSB0YWdzIG91dHB1dCBvZiBscy1yZW1vdGUsIGNvbXBhcmluZworICAgICAgICB2ZXJzaW9ucyBhbmQgcmV0dXJuaW5nIHRoZSBoaWdoZXN0IG1hdGNoLgorICAgICAgICAiIiIKKyAgICAgICAgcHVwdmVyID0gKCcnLCAnJykKKworICAgICAgICB0YWdyZWdleCA9IHJlLmNvbXBpbGUoZC5nZXRWYXIoJ0dJVFRBR1JFR0VYJywgVHJ1ZSkgb3IgIig/UDxwdmVyPihbMC05XVtcLnxfXT8pKykiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvdXRwdXQgPSBzZWxmLl9sc3JlbW90ZSh1ZCwgZCwgInJlZnMvdGFncy8qIikKKyAgICAgICAgZXhjZXB0IGJiLmZldGNoMi5GZXRjaEVycm9yIG9yIGJiLmZldGNoMi5OZXR3b3JrQWNjZXNzOgorICAgICAgICAgICAgcmV0dXJuIHB1cHZlcgorCisgICAgICAgIHZlcnN0cmluZyA9ICIiCisgICAgICAgIHJldmlzaW9uID0gIiIKKyAgICAgICAgZm9yIGxpbmUgaW4gb3V0cHV0LnNwbGl0KCJcbiIpOgorICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgdGFnX2hlYWQgPSBsaW5lLnNwbGl0KCIvIilbLTFdCisgICAgICAgICAgICAjIElnbm9yZSBub24tcmVsZWFzZWQgYnJhbmNoZXMKKyAgICAgICAgICAgIG0gPSByZS5zZWFyY2goIihhbHBoYXxiZXRhfHJjfGZpbmFsKSsiLCB0YWdfaGVhZCkKKyAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgIyBzZWFyY2ggZm9yIHZlcnNpb24gaW4gdGhlIGxpbmUKKyAgICAgICAgICAgIHRhZyA9IHRhZ3JlZ2V4LnNlYXJjaCh0YWdfaGVhZCkKKyAgICAgICAgICAgIGlmIHRhZyA9PSBOb25lOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIHRhZyA9IHRhZy5ncm91cCgncHZlcicpCisgICAgICAgICAgICB0YWcgPSB0YWcucmVwbGFjZSgiXyIsICIuIikKKworICAgICAgICAgICAgaWYgdmVyc3RyaW5nIGFuZCBiYi51dGlscy52ZXJjbXAoKCIwIiwgdGFnLCAiIiksICgiMCIsIHZlcnN0cmluZywgIiIpKSA8IDA6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgdmVyc3RyaW5nID0gdGFnCisgICAgICAgICAgICByZXZpc2lvbiA9IGxpbmUuc3BsaXQoKVswXQorICAgICAgICAgICAgcHVwdmVyID0gKHZlcnN0cmluZywgcmV2aXNpb24pCisKKyAgICAgICAgcmV0dXJuIHB1cHZlcgorCisgICAgZGVmIF9idWlsZF9yZXZpc2lvbihzZWxmLCB1ZCwgZCwgbmFtZSk6CisgICAgICAgIHJldHVybiB1ZC5yZXZpc2lvbnNbbmFtZV0KKworICAgIGRlZiBnaXRwa2d2X3JldmlzaW9uKHNlbGYsIHVkLCBkLCBuYW1lKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIHNvcnRhYmxlIHJldmlzaW9uIG51bWJlciBieSBjb3VudGluZyBjb21taXRzIGluIHRoZSBoaXN0b3J5CisgICAgICAgIEJhc2VkIG9uIGdpdHBrZ3YuYmJsYXNzIGluIG1ldGEtb3BlbmVtYmVkZGVkCisgICAgICAgICIiIgorICAgICAgICByZXYgPSBzZWxmLl9idWlsZF9yZXZpc2lvbih1ZCwgZCwgbmFtZSkKKyAgICAgICAgbG9jYWxwYXRoID0gdWQubG9jYWxwYXRoCisgICAgICAgIHJldl9maWxlID0gb3MucGF0aC5qb2luKGxvY2FscGF0aCwgIm9lLWdpdHBrZ3ZfIiArIHJldikKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGxvY2FscGF0aCk6CisgICAgICAgICAgICBjb21taXRzID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHJldl9maWxlKSBvciBub3Qgb3MucGF0aC5nZXRzaXplKHJldl9maWxlKToKKyAgICAgICAgICAgICAgICBmcm9tIHBpcGVzIGltcG9ydCBxdW90ZQorICAgICAgICAgICAgICAgIGNvbW1pdHMgPSBiYi5mZXRjaDIucnVuZmV0Y2hjbWQoCisgICAgICAgICAgICAgICAgICAgICAgICAiZ2l0IHJldi1saXN0ICVzIC0tIHwgd2MgLWwiICUgKHF1b3RlKHJldikpLAorICAgICAgICAgICAgICAgICAgICAgICAgZCwgcXVpZXQ9VHJ1ZSkuc3RyaXAoKS5sc3RyaXAoJzAnKQorICAgICAgICAgICAgICAgIGlmIGNvbW1pdHM6CisgICAgICAgICAgICAgICAgICAgIG9wZW4ocmV2X2ZpbGUsICJ3Iikud3JpdGUoIiVkXG4iICUgaW50KGNvbW1pdHMpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjb21taXRzID0gb3BlbihyZXZfZmlsZSwgInIiKS5yZWFkbGluZSgxMjgpLnN0cmlwKCkKKyAgICAgICAgaWYgY29tbWl0czoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZSwgIiVzKyVzIiAlIChjb21taXRzLCByZXZbOjddKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIFRydWUsIHN0cihyZXYpCisKKyAgICBkZWYgY2hlY2tzdGF0dXMoc2VsZiwgZmV0Y2gsIHVkLCBkKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fbHNyZW1vdGUodWQsIGQsICIiKQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgZXhjZXB0IEZldGNoRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL2ZldGNoMi9naXRhbm5leC5weSBiL2JpdGJha2UvbGliL2JiL2ZldGNoMi9naXRhbm5leC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjM3ODk3Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvZmV0Y2gyL2dpdGFubmV4LnB5CkBAIC0wLDAgKzEsNzYgQEAKKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisiIiIKK0JpdEJha2UgJ0ZldGNoJyBnaXQgYW5uZXggaW1wbGVtZW50YXRpb24KKyIiIgorCisjIENvcHlyaWdodCAoQykgMjAxNCBPdGF2aW8gU2FsdmFkb3IKKyMgQ29weXJpZ2h0IChDKSAyMDE0IE8uUy4gU3lzdGVtcyBTb2Z0d2FyZSBMVERBLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworaW1wb3J0IG9zCitpbXBvcnQgYmIKK2Zyb20gICBiYiBpbXBvcnQgZGF0YQorZnJvbSAgIGJiLmZldGNoMi5naXQgaW1wb3J0IEdpdAorZnJvbSAgIGJiLmZldGNoMiBpbXBvcnQgcnVuZmV0Y2hjbWQKK2Zyb20gICBiYi5mZXRjaDIgaW1wb3J0IGxvZ2dlcgorCitjbGFzcyBHaXRBTk5FWChHaXQpOgorICAgIGRlZiBzdXBwb3J0cyhzZWxmLCB1ZCwgZCk6CisgICAgICAgICIiIgorICAgICAgICBDaGVjayB0byBzZWUgaWYgYSBnaXZlbiB1cmwgY2FuIGJlIGZldGNoZWQgd2l0aCBnaXQuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gdWQudHlwZSBpbiBbJ2dpdGFubmV4J10KKworICAgIGRlZiB1c2VzX2FubmV4KHNlbGYsIHVkLCBkKToKKyAgICAgICAgZm9yIG5hbWUgaW4gdWQubmFtZXM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcnVuZmV0Y2hjbWQoIiVzIHJldi1saXN0IGdpdC1hbm5leCIgJSAodWQuYmFzZWNtZCksIGQsIHF1aWV0PVRydWUpCisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIGV4Y2VwdCBiYi5mZXRjaC5GZXRjaEVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiB1cGRhdGVfYW5uZXgoc2VsZiwgdWQsIGQpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBydW5mZXRjaGNtZCgiJXMgYW5uZXggZ2V0IC0tYWxsIiAlICh1ZC5iYXNlY21kKSwgZCwgcXVpZXQ9VHJ1ZSkKKyAgICAgICAgZXhjZXB0IGJiLmZldGNoLkZldGNoRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcnVuZmV0Y2hjbWQoImNobW9kIHUrdyAtUiAlcy9hbm5leCIgJSAodWQuY2xvbmVkaXIpLCBkLCBxdWlldD1UcnVlKQorCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgZG93bmxvYWQoc2VsZiwgdWQsIGQpOgorICAgICAgICBHaXQuZG93bmxvYWQoc2VsZiwgdWQsIGQpCisKKyAgICAgICAgb3MuY2hkaXIodWQuY2xvbmVkaXIpCisgICAgICAgIGFubmV4ID0gc2VsZi51c2VzX2FubmV4KHVkLCBkKQorICAgICAgICBpZiBhbm5leDoKKyAgICAgICAgICAgIHNlbGYudXBkYXRlX2FubmV4KHVkLCBkKQorCisgICAgZGVmIHVucGFjayhzZWxmLCB1ZCwgZGVzdGRpciwgZCk6CisgICAgICAgIEdpdC51bnBhY2soc2VsZiwgdWQsIGRlc3RkaXIsIGQpCisKKyAgICAgICAgb3MuY2hkaXIodWQuZGVzdGRpcikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcnVuZmV0Y2hjbWQoIiVzIGFubmV4IHN5bmMiICUgKHVkLmJhc2VjbWQpLCBkKQorICAgICAgICBleGNlcHQgYmIuZmV0Y2guRmV0Y2hFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBhbm5leCA9IHNlbGYudXNlc19hbm5leCh1ZCwgZCkKKyAgICAgICAgaWYgYW5uZXg6CisgICAgICAgICAgICBydW5mZXRjaGNtZCgiJXMgYW5uZXggZ2V0IiAlICh1ZC5iYXNlY21kKSwgZCkKKyAgICAgICAgICAgIHJ1bmZldGNoY21kKCJjaG1vZCB1K3cgLVIgJXMvLmdpdC9hbm5leCIgJSAodWQuZGVzdGRpciksIGQsIHF1aWV0PVRydWUpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvZ2l0c20ucHkgYi9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvZ2l0c20ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM5MmU0OAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL2ZldGNoMi9naXRzbS5weQpAQCAtMCwwICsxLDEzNyBAQAorIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyIiIgorQml0QmFrZSAnRmV0Y2gnIGdpdCBzdWJtb2R1bGVzIGltcGxlbWVudGF0aW9uCisKK0luaGVyaXRzIGZyb20gYW5kIGV4dGVuZHMgdGhlIEdpdCBmZXRjaGVyIHRvIHJldHJpZXZlIHN1Ym1vZHVsZXMgb2YgYSBnaXQgcmVwb3NpdG9yeQorYWZ0ZXIgY2xvbmluZy4KKworU1JDX1VSSSA9ICJnaXRzbTovLzxzZWUgR2l0IGZldGNoZXIgZm9yIHN5bnRheD4iCisKK1NlZSB0aGUgR2l0IGZldGNoZXIsIGdpdDovLywgZm9yIHVzYWdlIGRvY3VtZW50YXRpb24uCisKK05PVEU6IFN3aXRjaGluZyBhIFNSQ19VUkkgZnJvbSAiZ2l0Oi8vIiB0byAiZ2l0c206Ly8iIHJlcXVpcmVzIGEgY2xlYW4gb2YgeW91ciByZWNpcGUuCisKKyIiIgorCisjIENvcHlyaWdodCAoQykgMjAxMyBSaWNoYXJkIFB1cmRpZQorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworaW1wb3J0IG9zCitpbXBvcnQgYmIKK2Zyb20gICBiYiAgICBpbXBvcnQgZGF0YQorZnJvbSAgIGJiLmZldGNoMi5naXQgaW1wb3J0IEdpdAorZnJvbSAgIGJiLmZldGNoMiBpbXBvcnQgcnVuZmV0Y2hjbWQKK2Zyb20gICBiYi5mZXRjaDIgaW1wb3J0IGxvZ2dlcgorCitjbGFzcyBHaXRTTShHaXQpOgorICAgIGRlZiBzdXBwb3J0cyhzZWxmLCB1ZCwgZCk6CisgICAgICAgICIiIgorICAgICAgICBDaGVjayB0byBzZWUgaWYgYSBnaXZlbiB1cmwgY2FuIGJlIGZldGNoZWQgd2l0aCBnaXQuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gdWQudHlwZSBpbiBbJ2dpdHNtJ10KKworICAgIGRlZiB1c2VzX3N1Ym1vZHVsZXMoc2VsZiwgdWQsIGQpOgorICAgICAgICBmb3IgbmFtZSBpbiB1ZC5uYW1lczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBydW5mZXRjaGNtZCgiJXMgc2hvdyAlczouZ2l0bW9kdWxlcyIgJSAodWQuYmFzZWNtZCwgdWQucmV2aXNpb25zW25hbWVdKSwgZCwgcXVpZXQ9VHJ1ZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgZXhjZXB0IGJiLmZldGNoLkZldGNoRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBfc2V0X3JlbGF0aXZlX3BhdGhzKHNlbGYsIHJlcG9wYXRoKToKKyAgICAgICAgIiIiCisgICAgICAgIEZpeCBzdWJtb2R1bGUgcGF0aHMgdG8gYmUgcmVsYXRpdmUgaW5zdGVhZCBvZiBhYnNvbHV0ZSwKKyAgICAgICAgc28gdGhhdCB3aGVuIHdlIG1vdmUgdGhlIHJlcG8gaXQgZG9lc24ndCBicmVhaworICAgICAgICAoSW4gR2l0IDEuNy4xMCsgdGhpcyBpcyBkb25lIGF1dG9tYXRpY2FsbHkpCisgICAgICAgICIiIgorICAgICAgICBzdWJtb2R1bGVzID0gW10KKyAgICAgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihyZXBvcGF0aCwgJy5naXRtb2R1bGVzJyksICdyJykgYXMgZjoKKyAgICAgICAgICAgIGZvciBsaW5lIGluIGYucmVhZGxpbmVzKCk6CisgICAgICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCdbc3VibW9kdWxlJyk6CisgICAgICAgICAgICAgICAgICAgIHN1Ym1vZHVsZXMuYXBwZW5kKGxpbmUuc3BsaXQoJyInKVsxXSkKKworICAgICAgICBmb3IgbW9kdWxlIGluIHN1Ym1vZHVsZXM6CisgICAgICAgICAgICByZXBvX2NvbmYgPSBvcy5wYXRoLmpvaW4ocmVwb3BhdGgsIG1vZHVsZSwgJy5naXQnKQorICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocmVwb19jb25mKToKKyAgICAgICAgICAgICAgICB3aXRoIG9wZW4ocmVwb19jb25mLCAncicpIGFzIGY6CisgICAgICAgICAgICAgICAgICAgIGxpbmVzID0gZi5yZWFkbGluZXMoKQorICAgICAgICAgICAgICAgIG5ld3BhdGggPSAnJworICAgICAgICAgICAgICAgIGZvciBpLCBsaW5lIGluIGVudW1lcmF0ZShsaW5lcyk6CisgICAgICAgICAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgnZ2l0ZGlyOicpOgorICAgICAgICAgICAgICAgICAgICAgICAgb2xkcGF0aCA9IGxpbmUuc3BsaXQoJzogJylbLTFdLnJzdHJpcCgpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBvbGRwYXRoLnN0YXJ0c3dpdGgoJy8nKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdwYXRoID0gJy4uLycgKiAobW9kdWxlLmNvdW50KCcvJykgKyAxKSArICcuZ2l0L21vZHVsZXMvJyArIG1vZHVsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzW2ldID0gJ2dpdGRpcjogJXNcbicgJSBuZXdwYXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBpZiBuZXdwYXRoOgorICAgICAgICAgICAgICAgICAgICB3aXRoIG9wZW4ocmVwb19jb25mLCAndycpIGFzIGY6CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLndyaXRlKGxpbmUpCisKKyAgICAgICAgICAgIHJlcG9fY29uZjIgPSBvcy5wYXRoLmpvaW4ocmVwb3BhdGgsICcuZ2l0JywgJ21vZHVsZXMnLCBtb2R1bGUsICdjb25maWcnKQorICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocmVwb19jb25mMik6CisgICAgICAgICAgICAgICAgd2l0aCBvcGVuKHJlcG9fY29uZjIsICdyJykgYXMgZjoKKyAgICAgICAgICAgICAgICAgICAgbGluZXMgPSBmLnJlYWRsaW5lcygpCisgICAgICAgICAgICAgICAgbmV3cGF0aCA9ICcnCisgICAgICAgICAgICAgICAgZm9yIGksIGxpbmUgaW4gZW51bWVyYXRlKGxpbmVzKToKKyAgICAgICAgICAgICAgICAgICAgaWYgbGluZS5sc3RyaXAoKS5zdGFydHN3aXRoKCd3b3JrdHJlZSA9ICcpOgorICAgICAgICAgICAgICAgICAgICAgICAgb2xkcGF0aCA9IGxpbmUuc3BsaXQoJyA9ICcpWy0xXS5yc3RyaXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgb2xkcGF0aC5zdGFydHN3aXRoKCcvJyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3cGF0aCA9ICcuLi8nICogKG1vZHVsZS5jb3VudCgnLycpICsgMykgKyBtb2R1bGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc1tpXSA9ICdcdHdvcmt0cmVlID0gJXNcbicgJSBuZXdwYXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBpZiBuZXdwYXRoOgorICAgICAgICAgICAgICAgICAgICB3aXRoIG9wZW4ocmVwb19jb25mMiwgJ3cnKSBhcyBmOgorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gbGluZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi53cml0ZShsaW5lKQorCisgICAgZGVmIHVwZGF0ZV9zdWJtb2R1bGVzKHNlbGYsIHVkLCBkKToKKyAgICAgICAgIyBXZSBoYXZlIHRvIGNvbnZlcnQgYmFyZSAtPiBmdWxsIHJlcG8sIGRvIHRoZSBzdWJtb2R1bGUgYml0LCB0aGVuIGNvbnZlcnQgYmFjaworICAgICAgICB0bXBjbG9uZWRpciA9IHVkLmNsb25lZGlyICsgIi50bXAiCisgICAgICAgIGdpdGRpciA9IHRtcGNsb25lZGlyICsgb3Muc2VwICsgIi5naXQiCisgICAgICAgIGJiLnV0aWxzLnJlbW92ZSh0bXBjbG9uZWRpciwgVHJ1ZSkKKyAgICAgICAgb3MubWtkaXIodG1wY2xvbmVkaXIpCisgICAgICAgIG9zLnJlbmFtZSh1ZC5jbG9uZWRpciwgZ2l0ZGlyKQorICAgICAgICBydW5mZXRjaGNtZCgic2VkICIgKyBnaXRkaXIgKyAiL2NvbmZpZyAtaSAtZSAncy9iYXJlLio9Lip0cnVlL2JhcmUgPSBmYWxzZS8nIiwgZCkKKyAgICAgICAgb3MuY2hkaXIodG1wY2xvbmVkaXIpCisgICAgICAgIHJ1bmZldGNoY21kKHVkLmJhc2VjbWQgKyAiIHJlc2V0IC0taGFyZCIsIGQpCisgICAgICAgIHJ1bmZldGNoY21kKHVkLmJhc2VjbWQgKyAiIGNoZWNrb3V0ICIgKyB1ZC5yZXZpc2lvbnNbdWQubmFtZXNbMF1dLCBkKQorICAgICAgICBydW5mZXRjaGNtZCh1ZC5iYXNlY21kICsgIiBzdWJtb2R1bGUgaW5pdCIsIGQpCisgICAgICAgIHJ1bmZldGNoY21kKHVkLmJhc2VjbWQgKyAiIHN1Ym1vZHVsZSB1cGRhdGUiLCBkKQorICAgICAgICBzZWxmLl9zZXRfcmVsYXRpdmVfcGF0aHModG1wY2xvbmVkaXIpCisgICAgICAgIHJ1bmZldGNoY21kKCJzZWQgIiArIGdpdGRpciArICIvY29uZmlnIC1pIC1lICdzL2JhcmUuKj0uKmZhbHNlL2JhcmUgPSB0cnVlLyciLCBkKQorICAgICAgICBvcy5yZW5hbWUoZ2l0ZGlyLCB1ZC5jbG9uZWRpciwpCisgICAgICAgIGJiLnV0aWxzLnJlbW92ZSh0bXBjbG9uZWRpciwgVHJ1ZSkKKworICAgIGRlZiBkb3dubG9hZChzZWxmLCB1ZCwgZCk6CisgICAgICAgIEdpdC5kb3dubG9hZChzZWxmLCB1ZCwgZCkKKworICAgICAgICBvcy5jaGRpcih1ZC5jbG9uZWRpcikKKyAgICAgICAgc3VibW9kdWxlcyA9IHNlbGYudXNlc19zdWJtb2R1bGVzKHVkLCBkKQorICAgICAgICBpZiBzdWJtb2R1bGVzOgorICAgICAgICAgICAgc2VsZi51cGRhdGVfc3VibW9kdWxlcyh1ZCwgZCkKKworICAgIGRlZiB1bnBhY2soc2VsZiwgdWQsIGRlc3RkaXIsIGQpOgorICAgICAgICBHaXQudW5wYWNrKHNlbGYsIHVkLCBkZXN0ZGlyLCBkKQorICAgICAgICAKKyAgICAgICAgb3MuY2hkaXIodWQuZGVzdGRpcikKKyAgICAgICAgc3VibW9kdWxlcyA9IHNlbGYudXNlc19zdWJtb2R1bGVzKHVkLCBkKQorICAgICAgICBpZiBzdWJtb2R1bGVzOgorICAgICAgICAgICAgcnVuZmV0Y2hjbWQoImNwIC1yICIgKyB1ZC5jbG9uZWRpciArICIvbW9kdWxlcyAiICsgdWQuZGVzdGRpciArICIvLmdpdC8iLCBkKQorICAgICAgICAgICAgcnVuZmV0Y2hjbWQodWQuYmFzZWNtZCArICIgc3VibW9kdWxlIGluaXQiLCBkKQorICAgICAgICAgICAgcnVuZmV0Y2hjbWQodWQuYmFzZWNtZCArICIgc3VibW9kdWxlIHVwZGF0ZSIsIGQpCisKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL2ZldGNoMi9oZy5weSBiL2JpdGJha2UvbGliL2JiL2ZldGNoMi9oZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTc4NjMwCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvZmV0Y2gyL2hnLnB5CkBAIC0wLDAgKzEsMjc1IEBACisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIiIiCitCaXRCYWtlICdGZXRjaCcgaW1wbGVtZW50YXRpb24gZm9yIG1lcmN1cmlhbCBEUkNTIChoZykuCisKKyIiIgorCisjIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCAgQ2hyaXMgTGFyc29uCisjIENvcHlyaWdodCAoQykgMjAwNCAgICAgICAgTWFyY2luIEp1c3praWV3aWN6CisjIENvcHlyaWdodCAoQykgMjAwNyAgICAgICAgUm9iZXJ0IFNjaHVzdGVyCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBCYXNlZCBvbiBmdW5jdGlvbnMgZnJvbSB0aGUgYmFzZSBiYiBtb2R1bGUsIENvcHlyaWdodCAyMDAzIEhvbGdlciBTY2h1cmlnCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBiYgorZnJvbSBiYiBpbXBvcnQgZGF0YQorZnJvbSBiYi5mZXRjaDIgaW1wb3J0IEZldGNoTWV0aG9kCitmcm9tIGJiLmZldGNoMiBpbXBvcnQgRmV0Y2hFcnJvcgorZnJvbSBiYi5mZXRjaDIgaW1wb3J0IE1pc3NpbmdQYXJhbWV0ZXJFcnJvcgorZnJvbSBiYi5mZXRjaDIgaW1wb3J0IHJ1bmZldGNoY21kCitmcm9tIGJiLmZldGNoMiBpbXBvcnQgbG9nZ2VyCisKK2NsYXNzIEhnKEZldGNoTWV0aG9kKToKKyAgICAiIiJDbGFzcyB0byBmZXRjaCBmcm9tIG1lcmN1cmlhbCByZXBvc2l0b3JpZXMiIiIKKyAgICBkZWYgc3VwcG9ydHMoc2VsZiwgdWQsIGQpOgorICAgICAgICAiIiIKKyAgICAgICAgQ2hlY2sgdG8gc2VlIGlmIGEgZ2l2ZW4gdXJsIGNhbiBiZSBmZXRjaGVkIHdpdGggbWVyY3VyaWFsLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHVkLnR5cGUgaW4gWydoZyddCisKKyAgICBkZWYgc3VwcG9ydHNfY2hlY2tzdW0oc2VsZiwgdXJsZGF0YSk6CisgICAgICAgICIiIgorICAgICAgICBEb24ndCByZXF1aXJlIGNoZWNrc3VtcyBmb3IgbG9jYWwgYXJjaGl2ZXMgY3JlYXRlZCBmcm9tCisgICAgICAgIHJlcG9zaXRvcnkgY2hlY2tvdXRzLgorICAgICAgICAiIiIgCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIHVybGRhdGFfaW5pdChzZWxmLCB1ZCwgZCk6CisgICAgICAgICIiIgorICAgICAgICBpbml0IGhnIHNwZWNpZmljIHZhcmlhYmxlIHdpdGhpbiB1cmwgZGF0YQorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90ICJtb2R1bGUiIGluIHVkLnBhcm06CisgICAgICAgICAgICByYWlzZSBNaXNzaW5nUGFyYW1ldGVyRXJyb3IoJ21vZHVsZScsIHVkLnVybCkKKworICAgICAgICB1ZC5tb2R1bGUgPSB1ZC5wYXJtWyJtb2R1bGUiXQorCisgICAgICAgIGlmICdwcm90b2NvbCcgaW4gdWQucGFybToKKyAgICAgICAgICAgIHVkLnByb3RvID0gdWQucGFybVsncHJvdG9jb2wnXQorICAgICAgICBlbGlmIG5vdCB1ZC5ob3N0OgorICAgICAgICAgICAgdWQucHJvdG8gPSAnZmlsZScKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHVkLnByb3RvID0gImhnIgorCisgICAgICAgIHVkLnNldHVwX3Jldmlzb25zKGQpCisKKyAgICAgICAgaWYgJ3JldicgaW4gdWQucGFybToKKyAgICAgICAgICAgIHVkLnJldmlzaW9uID0gdWQucGFybVsncmV2J10KKyAgICAgICAgZWxpZiBub3QgdWQucmV2aXNpb246CisgICAgICAgICAgICB1ZC5yZXZpc2lvbiA9IHNlbGYubGF0ZXN0X3JldmlzaW9uKHVkLCBkKQorCisgICAgICAgICMgQ3JlYXRlIHBhdGhzIHRvIG1lcmN1cmlhbCBjaGVja291dHMKKyAgICAgICAgaGdzcmNuYW1lID0gJyVzXyVzXyVzJyAlICh1ZC5tb2R1bGUucmVwbGFjZSgnLycsICcuJyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZC5ob3N0LCB1ZC5wYXRoLnJlcGxhY2UoJy8nLCAnLicpKQorICAgICAgICB1ZC5taXJyb3J0YXJiYWxsID0gJ2hnXyVzLnRhci5neicgJSBoZ3NyY25hbWUKKyAgICAgICAgdWQuZnVsbG1pcnJvciA9IG9zLnBhdGguam9pbihkLmdldFZhcigiRExfRElSIiwgVHJ1ZSksIHVkLm1pcnJvcnRhcmJhbGwpCisKKyAgICAgICAgaGdkaXIgPSBkLmdldFZhcigiSEdESVIiLCBUcnVlKSBvciAoZC5nZXRWYXIoIkRMX0RJUiIsIFRydWUpICsgIi9oZy8iKQorICAgICAgICB1ZC5wa2dkaXIgPSBvcy5wYXRoLmpvaW4oaGdkaXIsIGhnc3JjbmFtZSkKKyAgICAgICAgdWQubW9kZGlyID0gb3MucGF0aC5qb2luKHVkLnBrZ2RpciwgdWQubW9kdWxlKQorICAgICAgICB1ZC5sb2NhbGZpbGUgPSB1ZC5tb2RkaXIKKyAgICAgICAgdWQuYmFzZWNtZCA9IGRhdGEuZ2V0VmFyKCJGRVRDSENNRF9oZyIsIGQsIFRydWUpIG9yICIvdXNyL2Jpbi9lbnYgaGciCisKKyAgICAgICAgdWQud3JpdGVfdGFyYmFsbHMgPSBkLmdldFZhcigiQkJfR0VORVJBVEVfTUlSUk9SX1RBUkJBTExTIiwgVHJ1ZSkKKworICAgIGRlZiBuZWVkX3VwZGF0ZShzZWxmLCB1ZCwgZCk6CisgICAgICAgIHJldlRhZyA9IHVkLnBhcm0uZ2V0KCdyZXYnLCAndGlwJykKKyAgICAgICAgaWYgcmV2VGFnID09ICJ0aXAiOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHVkLmxvY2FscGF0aCk6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiB0cnlfcHJlbWlycm9yKHNlbGYsIHVkLCBkKToKKyAgICAgICAgIyBJZiB3ZSBkb24ndCBkbyB0aGlzLCB1cGRhdGluZyBhbiBleGlzdGluZyBjaGVja291dCB3aXRoIG9ubHkgcHJlbWlycm9ycworICAgICAgICAjIGlzIG5vdCBwb3NzaWJsZQorICAgICAgICBpZiBkLmdldFZhcigiQkJfRkVUQ0hfUFJFTUlSUk9ST05MWSIsIFRydWUpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHModWQubW9kZGlyKToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIF9idWlsZGhnY29tbWFuZChzZWxmLCB1ZCwgZCwgY29tbWFuZCk6CisgICAgICAgICIiIgorICAgICAgICBCdWlsZCB1cCBhbiBoZyBjb21tYW5kbGluZSBiYXNlZCBvbiB1ZAorICAgICAgICBjb21tYW5kIGlzICJmZXRjaCIsICJ1cGRhdGUiLCAiaW5mbyIKKyAgICAgICAgIiIiCisKKyAgICAgICAgcHJvdG8gPSB1ZC5wYXJtLmdldCgncHJvdG9jb2wnLCAnaHR0cCcpCisKKyAgICAgICAgaG9zdCA9IHVkLmhvc3QKKyAgICAgICAgaWYgcHJvdG8gPT0gImZpbGUiOgorICAgICAgICAgICAgaG9zdCA9ICIvIgorICAgICAgICAgICAgdWQuaG9zdCA9ICJsb2NhbGhvc3QiCisKKyAgICAgICAgaWYgbm90IHVkLnVzZXI6CisgICAgICAgICAgICBoZ3Jvb3QgPSBob3N0ICsgdWQucGF0aAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgdWQucHN3ZDoKKyAgICAgICAgICAgICAgICBoZ3Jvb3QgPSB1ZC51c2VyICsgIjoiICsgdWQucHN3ZCArICJAIiArIGhvc3QgKyB1ZC5wYXRoCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGhncm9vdCA9IHVkLnVzZXIgKyAiQCIgKyBob3N0ICsgdWQucGF0aAorCisgICAgICAgIGlmIGNvbW1hbmQgPT0gImluZm8iOgorICAgICAgICAgICAgcmV0dXJuICIlcyBpZGVudGlmeSAtaSAlczovLyVzLyVzIiAlICh1ZC5iYXNlY21kLCBwcm90bywgaGdyb290LCB1ZC5tb2R1bGUpCisKKyAgICAgICAgb3B0aW9ucyA9IFtdOworCisgICAgICAgICMgRG9uJ3Qgc3BlY2lmeSByZXZpc2lvbiBmb3IgdGhlIGZldGNoOyBjbG9uZSB0aGUgZW50aXJlIHJlcG8uCisgICAgICAgICMgVGhpcyBhdm9pZHMgYW4gaXNzdWUgaWYgdGhlIHNwZWNpZmllZCByZXZpc2lvbiBpcyBhIHRhZywgYmVjYXVzZQorICAgICAgICAjIHRoZSB0YWcgYWN0dWFsbHkgZXhpc3RzIGluIHRoZSBzcGVjaWZpZWQgcmV2aXNpb24gKyAxLCBzbyBpdCB3b24ndAorICAgICAgICAjIGJlIGF2YWlsYWJsZSB3aGVuIHVzZWQgaW4gYW55IHN1Y2Nlc3NpdmUgY29tbWFuZHMuCisgICAgICAgIGlmIHVkLnJldmlzaW9uIGFuZCBjb21tYW5kICE9ICJmZXRjaCI6CisgICAgICAgICAgICBvcHRpb25zLmFwcGVuZCgiLXIgJXMiICUgdWQucmV2aXNpb24pCisKKyAgICAgICAgaWYgY29tbWFuZCA9PSAiZmV0Y2giOgorICAgICAgICAgICAgaWYgdWQudXNlciBhbmQgdWQucHN3ZDoKKyAgICAgICAgICAgICAgICBjbWQgPSAiJXMgLS1jb25maWcgYXV0aC5kZWZhdWx0LnByZWZpeD0qIC0tY29uZmlnIGF1dGguZGVmYXVsdC51c2VybmFtZT0lcyAtLWNvbmZpZyBhdXRoLmRlZmF1bHQucGFzc3dvcmQ9JXMgLS1jb25maWcgXCJhdXRoLmRlZmF1bHQuc2NoZW1lcz0lc1wiIGNsb25lICVzICVzOi8vJXMvJXMgJXMiICUgKHVkLmJhc2VjbWQsIHVkLnVzZXIsIHVkLnBzd2QsIHByb3RvLCAiICIuam9pbihvcHRpb25zKSwgcHJvdG8sIGhncm9vdCwgdWQubW9kdWxlLCB1ZC5tb2R1bGUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNtZCA9ICIlcyBjbG9uZSAlcyAlczovLyVzLyVzICVzIiAlICh1ZC5iYXNlY21kLCAiICIuam9pbihvcHRpb25zKSwgcHJvdG8sIGhncm9vdCwgdWQubW9kdWxlLCB1ZC5tb2R1bGUpCisgICAgICAgIGVsaWYgY29tbWFuZCA9PSAicHVsbCI6CisgICAgICAgICAgICAjIGRvIG5vdCBwYXNzIG9wdGlvbnMgbGlzdDsgbGltaXRpbmcgcHVsbCB0byByZXYgY2F1c2VzIHRoZSBsb2NhbAorICAgICAgICAgICAgIyByZXBvIG5vdCB0byBjb250YWluIGl0IGFuZCBpbW1lZGlhdGVseSBmb2xsb3dpbmcgInVwZGF0ZSIgY29tbWFuZAorICAgICAgICAgICAgIyB3aWxsIGNyYXNoCisgICAgICAgICAgICBpZiB1ZC51c2VyIGFuZCB1ZC5wc3dkOgorICAgICAgICAgICAgICAgIGNtZCA9ICIlcyAtLWNvbmZpZyBhdXRoLmRlZmF1bHQucHJlZml4PSogLS1jb25maWcgYXV0aC5kZWZhdWx0LnVzZXJuYW1lPSVzIC0tY29uZmlnIGF1dGguZGVmYXVsdC5wYXNzd29yZD0lcyAtLWNvbmZpZyBcImF1dGguZGVmYXVsdC5zY2hlbWVzPSVzXCIgcHVsbCIgJSAodWQuYmFzZWNtZCwgdWQudXNlciwgdWQucHN3ZCwgcHJvdG8pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNtZCA9ICIlcyBwdWxsIiAlICh1ZC5iYXNlY21kKQorICAgICAgICBlbGlmIGNvbW1hbmQgPT0gInVwZGF0ZSI6CisgICAgICAgICAgICBpZiB1ZC51c2VyIGFuZCB1ZC5wc3dkOgorICAgICAgICAgICAgICAgIGNtZCA9ICIlcyAtLWNvbmZpZyBhdXRoLmRlZmF1bHQucHJlZml4PSogLS1jb25maWcgYXV0aC5kZWZhdWx0LnVzZXJuYW1lPSVzIC0tY29uZmlnIGF1dGguZGVmYXVsdC5wYXNzd29yZD0lcyAtLWNvbmZpZyBcImF1dGguZGVmYXVsdC5zY2hlbWVzPSVzXCIgdXBkYXRlIC1DICVzIiAlICh1ZC5iYXNlY21kLCB1ZC51c2VyLCB1ZC5wc3dkLCBwcm90bywgIiAiLmpvaW4ob3B0aW9ucykpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNtZCA9ICIlcyB1cGRhdGUgLUMgJXMiICUgKHVkLmJhc2VjbWQsICIgIi5qb2luKG9wdGlvbnMpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgRmV0Y2hFcnJvcigiSW52YWxpZCBoZyBjb21tYW5kICVzIiAlIGNvbW1hbmQsIHVkLnVybCkKKworICAgICAgICByZXR1cm4gY21kCisKKyAgICBkZWYgZG93bmxvYWQoc2VsZiwgdWQsIGQpOgorICAgICAgICAiIiJGZXRjaCB1cmwiIiIKKworICAgICAgICB1ZC5yZXBvY2hhbmdlZCA9IG5vdCBvcy5wYXRoLmV4aXN0cyh1ZC5mdWxsbWlycm9yKQorCisgICAgICAgIGxvZ2dlci5kZWJ1ZygyLCAiRmV0Y2g6IGNoZWNraW5nIGZvciBtb2R1bGUgZGlyZWN0b3J5ICciICsgdWQubW9kZGlyICsgIiciKQorCisgICAgICAgICMgSWYgdGhlIGNoZWNrb3V0IGRvZXNuJ3QgZXhpc3QgYW5kIHRoZSBtaXJyb3IgdGFyYmFsbCBkb2VzLCBleHRyYWN0IGl0CisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyh1ZC5wa2dkaXIpIGFuZCBvcy5wYXRoLmV4aXN0cyh1ZC5mdWxsbWlycm9yKToKKyAgICAgICAgICAgIGJiLnV0aWxzLm1rZGlyaGllcih1ZC5wa2dkaXIpCisgICAgICAgICAgICBvcy5jaGRpcih1ZC5wa2dkaXIpCisgICAgICAgICAgICBydW5mZXRjaGNtZCgidGFyIC14emYgJXMiICUgKHVkLmZ1bGxtaXJyb3IpLCBkKQorCisgICAgICAgIGlmIG9zLmFjY2Vzcyhvcy5wYXRoLmpvaW4odWQubW9kZGlyLCAnLmhnJyksIG9zLlJfT0spOgorICAgICAgICAgICAgIyBGb3VuZCB0aGUgc291cmNlLCBjaGVjayB3aGV0aGVyIG5lZWQgcHVsbAorICAgICAgICAgICAgdXBkYXRlY21kID0gc2VsZi5fYnVpbGRoZ2NvbW1hbmQodWQsIGQsICJ1cGRhdGUiKQorICAgICAgICAgICAgb3MuY2hkaXIodWQubW9kZGlyKQorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJSdW5uaW5nICVzIiwgdXBkYXRlY21kKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJ1bmZldGNoY21kKHVwZGF0ZWNtZCwgZCkKKyAgICAgICAgICAgIGV4Y2VwdCBiYi5mZXRjaDIuRmV0Y2hFcnJvcjoKKyAgICAgICAgICAgICAgICAjIFJ1bm5uaW5nIHB1bGwgaW4gdGhlIHJlcG8KKyAgICAgICAgICAgICAgICBwdWxsY21kID0gc2VsZi5fYnVpbGRoZ2NvbW1hbmQodWQsIGQsICJwdWxsIikKKyAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiUHVsbGluZyAiICsgdWQudXJsKQorICAgICAgICAgICAgICAgICMgdXBkYXRlIHNvdXJjZXMgdGhlcmUKKyAgICAgICAgICAgICAgICBvcy5jaGRpcih1ZC5tb2RkaXIpCisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJSdW5uaW5nICVzIiwgcHVsbGNtZCkKKyAgICAgICAgICAgICAgICBiYi5mZXRjaDIuY2hlY2tfbmV0d29ya19hY2Nlc3MoZCwgcHVsbGNtZCwgdWQudXJsKQorICAgICAgICAgICAgICAgIHJ1bmZldGNoY21kKHB1bGxjbWQsIGQpCisgICAgICAgICAgICAgICAgdWQucmVwb2NoYW5nZWQgPSBUcnVlCisKKyAgICAgICAgIyBObyBzb3VyY2UgZm91bmQsIGNsb25lIGl0LgorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHModWQubW9kZGlyKToKKyAgICAgICAgICAgIGZldGNoY21kID0gc2VsZi5fYnVpbGRoZ2NvbW1hbmQodWQsIGQsICJmZXRjaCIpCisgICAgICAgICAgICBsb2dnZXIuaW5mbygiRmV0Y2ggIiArIHVkLnVybCkKKyAgICAgICAgICAgICMgY2hlY2sgb3V0IHNvdXJjZXMgdGhlcmUKKyAgICAgICAgICAgIGJiLnV0aWxzLm1rZGlyaGllcih1ZC5wa2dkaXIpCisgICAgICAgICAgICBvcy5jaGRpcih1ZC5wa2dkaXIpCisgICAgICAgICAgICBsb2dnZXIuZGVidWcoMSwgIlJ1bm5pbmcgJXMiLCBmZXRjaGNtZCkKKyAgICAgICAgICAgIGJiLmZldGNoMi5jaGVja19uZXR3b3JrX2FjY2VzcyhkLCBmZXRjaGNtZCwgdWQudXJsKQorICAgICAgICAgICAgcnVuZmV0Y2hjbWQoZmV0Y2hjbWQsIGQpCisKKyAgICAgICAgIyBFdmVuIHdoZW4gd2UgY2xvbmUgKGZldGNoKSwgd2Ugc3RpbGwgbmVlZCB0byB1cGRhdGUgYXMgaGcncyBjbG9uZQorICAgICAgICAjIHdvbid0IGNoZWNrb3V0IHRoZSBzcGVjaWZpZWQgcmV2aXNpb24gaWYgaXRzIG9uIGEgYnJhbmNoCisgICAgICAgIHVwZGF0ZWNtZCA9IHNlbGYuX2J1aWxkaGdjb21tYW5kKHVkLCBkLCAidXBkYXRlIikKKyAgICAgICAgb3MuY2hkaXIodWQubW9kZGlyKQorICAgICAgICBsb2dnZXIuZGVidWcoMSwgIlJ1bm5pbmcgJXMiLCB1cGRhdGVjbWQpCisgICAgICAgIHJ1bmZldGNoY21kKHVwZGF0ZWNtZCwgZCkKKworICAgIGRlZiBjbGVhbihzZWxmLCB1ZCwgZCk6CisgICAgICAgICIiIiBDbGVhbiB0aGUgaGcgZGlyICIiIgorCisgICAgICAgIGJiLnV0aWxzLnJlbW92ZSh1ZC5sb2NhbHBhdGgsIFRydWUpCisgICAgICAgIGJiLnV0aWxzLnJlbW92ZSh1ZC5mdWxsbWlycm9yKQorICAgICAgICBiYi51dGlscy5yZW1vdmUodWQuZnVsbG1pcnJvciArICIuZG9uZSIpCisKKyAgICBkZWYgc3VwcG9ydHNfc3JjcmV2KHNlbGYpOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIF9sYXRlc3RfcmV2aXNpb24oc2VsZiwgdWQsIGQsIG5hbWUpOgorICAgICAgICAiIiIKKyAgICAgICAgQ29tcHV0ZSB0aXAgcmV2aXNpb24gZm9yIHRoZSB1cmwKKyAgICAgICAgIiIiCisgICAgICAgIGJiLmZldGNoMi5jaGVja19uZXR3b3JrX2FjY2VzcyhkLCBzZWxmLl9idWlsZGhnY29tbWFuZCh1ZCwgZCwgImluZm8iKSkKKyAgICAgICAgb3V0cHV0ID0gcnVuZmV0Y2hjbWQoc2VsZi5fYnVpbGRoZ2NvbW1hbmQodWQsIGQsICJpbmZvIiksIGQpCisgICAgICAgIHJldHVybiBvdXRwdXQuc3RyaXAoKQorCisgICAgZGVmIF9idWlsZF9yZXZpc2lvbihzZWxmLCB1ZCwgZCwgbmFtZSk6CisgICAgICAgIHJldHVybiB1ZC5yZXZpc2lvbgorCisgICAgZGVmIF9yZXZpc2lvbl9rZXkoc2VsZiwgdWQsIGQsIG5hbWUpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgdW5pcXVlIGtleSBmb3IgdGhlIHVybAorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuICJoZzoiICsgdWQubW9kZGlyCisKKyAgICBkZWYgYnVpbGRfbWlycm9yX2RhdGEoc2VsZiwgdWQsIGQpOgorICAgICAgICAjIEdlbmVyYXRlIGEgbWlycm9yIHRhcmJhbGwgaWYgbmVlZGVkCisgICAgICAgIGlmIHVkLndyaXRlX3RhcmJhbGxzID09ICIxIiBhbmQgKHVkLnJlcG9jaGFuZ2VkIG9yIG5vdCBvcy5wYXRoLmV4aXN0cyh1ZC5mdWxsbWlycm9yKSk6CisgICAgICAgICAgICAjIGl0J3MgcG9zc2libGUgdGhhdCB0aGlzIHN5bWxpbmsgcG9pbnRzIHRvIHJlYWQtb25seSBmaWxlc3lzdGVtIHdpdGggUFJFTUlSUk9SCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzbGluayh1ZC5mdWxsbWlycm9yKToKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsodWQuZnVsbG1pcnJvcikKKworICAgICAgICAgICAgb3MuY2hkaXIodWQucGtnZGlyKQorICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkNyZWF0aW5nIHRhcmJhbGwgb2YgaGcgcmVwb3NpdG9yeSIpCisgICAgICAgICAgICBydW5mZXRjaGNtZCgidGFyIC1jemYgJXMgJXMiICUgKHVkLmZ1bGxtaXJyb3IsIHVkLm1vZHVsZSksIGQpCisgICAgICAgICAgICBydW5mZXRjaGNtZCgidG91Y2ggJXMuZG9uZSIgJSAodWQuZnVsbG1pcnJvciksIGQpCisKKyAgICBkZWYgbG9jYWxwYXRoKHNlbGYsIHVkLCBkKToKKyAgICAgICAgcmV0dXJuIHVkLnBrZ2RpcgorCisgICAgZGVmIHVucGFjayhzZWxmLCB1ZCwgZGVzdGRpciwgZCk6CisgICAgICAgICIiIgorICAgICAgICBNYWtlIGEgbG9jYWwgY2xvbmUgb3IgZXhwb3J0IGZvciB0aGUgdXJsCisgICAgICAgICIiIgorCisgICAgICAgIHJldmZsYWcgPSAiLXIgJXMiICUgdWQucmV2aXNpb24KKyAgICAgICAgc3ViZGlyID0gdWQucGFybS5nZXQoImRlc3RzdWZmaXgiLCB1ZC5tb2R1bGUpCisgICAgICAgIGNvZGlyID0gIiVzLyVzIiAlIChkZXN0ZGlyLCBzdWJkaXIpCisKKyAgICAgICAgc2NtZGF0YSA9IHVkLnBhcm0uZ2V0KCJzY21kYXRhIiwgIiIpCisgICAgICAgIGlmIHNjbWRhdGEgIT0gIm5va2VlcCI6CisgICAgICAgICAgICBpZiBub3Qgb3MuYWNjZXNzKG9zLnBhdGguam9pbihjb2RpciwgJy5oZycpLCBvcy5SX09LKToKKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoMiwgIlVucGFjazogY3JlYXRpbmcgbmV3IGhnIHJlcG9zaXRvcnkgaW4gJyIgKyBjb2RpciArICInIikKKyAgICAgICAgICAgICAgICBydW5mZXRjaGNtZCgiJXMgaW5pdCAlcyIgJSAodWQuYmFzZWNtZCwgY29kaXIpLCBkKQorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICJVbnBhY2s6IHVwZGF0aW5nIHNvdXJjZSBpbiAnIiArIGNvZGlyICsgIiciKQorICAgICAgICAgICAgb3MuY2hkaXIoY29kaXIpCisgICAgICAgICAgICBydW5mZXRjaGNtZCgiJXMgcHVsbCAlcyIgJSAodWQuYmFzZWNtZCwgdWQubW9kZGlyKSwgZCkKKyAgICAgICAgICAgIHJ1bmZldGNoY21kKCIlcyB1cCAtQyAlcyIgJSAodWQuYmFzZWNtZCwgcmV2ZmxhZyksIGQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsb2dnZXIuZGVidWcoMiwgIlVucGFjazogZXh0cmFjdGluZyBzb3VyY2UgdG8gJyIgKyBjb2RpciArICInIikKKyAgICAgICAgICAgIG9zLmNoZGlyKHVkLm1vZGRpcikKKyAgICAgICAgICAgIHJ1bmZldGNoY21kKCIlcyBhcmNoaXZlIC10IGZpbGVzICVzICVzIiAlICh1ZC5iYXNlY21kLCByZXZmbGFnLCBjb2RpciksIGQpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvbG9jYWwucHkgYi9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvbG9jYWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ5MjFmNwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL2ZldGNoMi9sb2NhbC5weQpAQCAtMCwwICsxLDEyOCBAQAorIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyIiIgorQml0QmFrZSAnRmV0Y2gnIGltcGxlbWVudGF0aW9ucworCitDbGFzc2VzIGZvciBvYnRhaW5pbmcgdXBzdHJlYW0gc291cmNlcyBmb3IgdGhlCitCaXRCYWtlIGJ1aWxkIHRvb2xzLgorCisiIiIKKworIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgIENocmlzIExhcnNvbgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKyMgQmFzZWQgb24gZnVuY3Rpb25zIGZyb20gdGhlIGJhc2UgYmIgbW9kdWxlLCBDb3B5cmlnaHQgMjAwMyBIb2xnZXIgU2NodXJpZworCitpbXBvcnQgb3MKK2ltcG9ydCB1cmxsaWIKK2ltcG9ydCBiYgoraW1wb3J0IGJiLnV0aWxzCitmcm9tICAgYmIgaW1wb3J0IGRhdGEKK2Zyb20gICBiYi5mZXRjaDIgaW1wb3J0IEZldGNoTWV0aG9kLCBGZXRjaEVycm9yCitmcm9tICAgYmIuZmV0Y2gyIGltcG9ydCBsb2dnZXIKKworY2xhc3MgTG9jYWwoRmV0Y2hNZXRob2QpOgorICAgIGRlZiBzdXBwb3J0cyhzZWxmLCB1cmxkYXRhLCBkKToKKyAgICAgICAgIiIiCisgICAgICAgIENoZWNrIHRvIHNlZSBpZiBhIGdpdmVuIHVybCByZXByZXNlbnRzIGEgbG9jYWwgZmV0Y2guCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gdXJsZGF0YS50eXBlIGluIFsnZmlsZSddCisKKyAgICBkZWYgdXJsZGF0YV9pbml0KHNlbGYsIHVkLCBkKToKKyAgICAgICAgIyBXZSBkb24ndCBzZXQgbG9jYWxmaWxlIGFzIGZvciB0aGlzIGZldGNoZXIgdGhlIGZpbGUgaXMgYWxyZWFkeSBsb2NhbCEKKyAgICAgICAgdWQuZGVjb2RlZHVybCA9IHVybGxpYi51bnF1b3RlKHVkLnVybC5zcGxpdCgiOi8vIilbMV0uc3BsaXQoIjsiKVswXSkKKyAgICAgICAgdWQuYmFzZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHVkLmRlY29kZWR1cmwpCisgICAgICAgIHVkLmJhc2VwYXRoID0gdWQuZGVjb2RlZHVybAorICAgICAgICByZXR1cm4KKworICAgIGRlZiBsb2NhbHBhdGgoc2VsZiwgdXJsZGF0YSwgZCk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gdGhlIGxvY2FsIGZpbGVuYW1lIG9mIGEgZ2l2ZW4gdXJsIGFzc3VtaW5nIGEgc3VjY2Vzc2Z1bCBmZXRjaC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLmxvY2FscGF0aHModXJsZGF0YSwgZClbLTFdCisKKyAgICBkZWYgbG9jYWxwYXRocyhzZWxmLCB1cmxkYXRhLCBkKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiB0aGUgbG9jYWwgZmlsZW5hbWUgb2YgYSBnaXZlbiB1cmwgYXNzdW1pbmcgYSBzdWNjZXNzZnVsIGZldGNoLgorICAgICAgICAiIiIKKyAgICAgICAgc2VhcmNoZWQgPSBbXQorICAgICAgICBwYXRoID0gdXJsZGF0YS5kZWNvZGVkdXJsCisgICAgICAgIG5ld3BhdGggPSBwYXRoCisgICAgICAgIGlmIHBhdGhbMF0gPT0gIi8iOgorICAgICAgICAgICAgcmV0dXJuIFtwYXRoXQorICAgICAgICBmaWxlc3BhdGggPSBkYXRhLmdldFZhcignRklMRVNQQVRIJywgZCwgVHJ1ZSkKKyAgICAgICAgaWYgZmlsZXNwYXRoOgorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICJTZWFyY2hpbmcgZm9yICVzIGluIHBhdGhzOlxuICAgICVzIiAlIChwYXRoLCAiXG4gICAgIi5qb2luKGZpbGVzcGF0aC5zcGxpdCgiOiIpKSkpCisgICAgICAgICAgICBuZXdwYXRoLCBoaXN0ID0gYmIudXRpbHMud2hpY2goZmlsZXNwYXRoLCBwYXRoLCBoaXN0b3J5PVRydWUpCisgICAgICAgICAgICBzZWFyY2hlZC5leHRlbmQoaGlzdCkKKyAgICAgICAgaWYgbm90IG5ld3BhdGg6CisgICAgICAgICAgICBmaWxlc2RpciA9IGRhdGEuZ2V0VmFyKCdGSUxFU0RJUicsIGQsIFRydWUpCisgICAgICAgICAgICBpZiBmaWxlc2RpcjoKKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoMiwgIlNlYXJjaGluZyBmb3IgJXMgaW4gcGF0aDogJXMiICUgKHBhdGgsIGZpbGVzZGlyKSkKKyAgICAgICAgICAgICAgICBuZXdwYXRoID0gb3MucGF0aC5qb2luKGZpbGVzZGlyLCBwYXRoKQorICAgICAgICAgICAgICAgIHNlYXJjaGVkLmFwcGVuZChuZXdwYXRoKQorICAgICAgICBpZiAobm90IG5ld3BhdGggb3Igbm90IG9zLnBhdGguZXhpc3RzKG5ld3BhdGgpKSBhbmQgcGF0aC5maW5kKCIqIikgIT0gLTE6CisgICAgICAgICAgICAjIEZvciBleHByZXNzaW9ucyB1c2luZyAnKicsIGJlc3Qgd2UgY2FuIGRvIGlzIHRha2UgdGhlIGZpcnN0IGRpcmVjdG9yeSBpbiBGSUxFU1BBVEggdGhhdCBleGlzdHMKKyAgICAgICAgICAgIG5ld3BhdGgsIGhpc3QgPSBiYi51dGlscy53aGljaChmaWxlc3BhdGgsICIuIiwgaGlzdG9yeT1UcnVlKQorICAgICAgICAgICAgc2VhcmNoZWQuZXh0ZW5kKGhpc3QpCisgICAgICAgICAgICBsb2dnZXIuZGVidWcoMiwgIlNlYXJjaGluZyBmb3IgJXMgaW4gcGF0aDogJXMiICUgKHBhdGgsIG5ld3BhdGgpKQorICAgICAgICAgICAgcmV0dXJuIHNlYXJjaGVkCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhuZXdwYXRoKToKKyAgICAgICAgICAgIGRsZGlyZmlsZSA9IG9zLnBhdGguam9pbihkLmdldFZhcigiRExfRElSIiwgVHJ1ZSksIHBhdGgpCisgICAgICAgICAgICBsb2dnZXIuZGVidWcoMiwgIkRlZmF1bHRpbmcgdG8gJXMgZm9yICVzIiAlIChkbGRpcmZpbGUsIHBhdGgpKQorICAgICAgICAgICAgYmIudXRpbHMubWtkaXJoaWVyKG9zLnBhdGguZGlybmFtZShkbGRpcmZpbGUpKQorICAgICAgICAgICAgc2VhcmNoZWQuYXBwZW5kKGRsZGlyZmlsZSkKKyAgICAgICAgICAgIHJldHVybiBzZWFyY2hlZAorICAgICAgICByZXR1cm4gc2VhcmNoZWQKKworICAgIGRlZiBuZWVkX3VwZGF0ZShzZWxmLCB1ZCwgZCk6CisgICAgICAgIGlmIHVkLnVybC5maW5kKCIqIikgIT0gLTE6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHModWQubG9jYWxwYXRoKToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGRvd25sb2FkKHNlbGYsIHVybGRhdGEsIGQpOgorICAgICAgICAiIiJGZXRjaCB1cmxzIChuby1vcCBmb3IgTG9jYWwgbWV0aG9kKSIiIgorICAgICAgICAjIG5vIG5lZWQgdG8gZmV0Y2ggbG9jYWwgZmlsZXMsIHdlJ2xsIGRlYWwgd2l0aCB0aGVtIGluIHBsYWNlLgorICAgICAgICBpZiBzZWxmLnN1cHBvcnRzX2NoZWNrc3VtKHVybGRhdGEpIGFuZCBub3Qgb3MucGF0aC5leGlzdHModXJsZGF0YS5sb2NhbHBhdGgpOgorICAgICAgICAgICAgbG9jYXRpb25zID0gW10KKyAgICAgICAgICAgIGZpbGVzcGF0aCA9IGRhdGEuZ2V0VmFyKCdGSUxFU1BBVEgnLCBkLCBUcnVlKQorICAgICAgICAgICAgaWYgZmlsZXNwYXRoOgorICAgICAgICAgICAgICAgIGxvY2F0aW9ucyA9IGZpbGVzcGF0aC5zcGxpdCgiOiIpCisgICAgICAgICAgICBmaWxlc2RpciA9IGRhdGEuZ2V0VmFyKCdGSUxFU0RJUicsIGQsIFRydWUpCisgICAgICAgICAgICBpZiBmaWxlc2RpcjoKKyAgICAgICAgICAgICAgICBsb2NhdGlvbnMuYXBwZW5kKGZpbGVzZGlyKQorICAgICAgICAgICAgbG9jYXRpb25zLmFwcGVuZChkLmdldFZhcigiRExfRElSIiwgVHJ1ZSkpCisKKyAgICAgICAgICAgIG1zZyA9ICJVbmFibGUgdG8gZmluZCBmaWxlICIgKyB1cmxkYXRhLnVybCArICIgYW55d2hlcmUuIFRoZSBwYXRocyB0aGF0IHdlcmUgc2VhcmNoZWQgd2VyZTpcbiAgICAiICsgIlxuICAgICIuam9pbihsb2NhdGlvbnMpCisgICAgICAgICAgICByYWlzZSBGZXRjaEVycm9yKG1zZykKKworICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGNoZWNrc3RhdHVzKHNlbGYsIGZldGNoLCB1cmxkYXRhLCBkKToKKyAgICAgICAgIiIiCisgICAgICAgIENoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIHVybAorICAgICAgICAiIiIKKyAgICAgICAgaWYgdXJsZGF0YS5sb2NhbHBhdGguZmluZCgiKiIpICE9IC0xOgorICAgICAgICAgICAgbG9nZ2VyLmluZm8oIlVSTCAlcyBsb29rcyBsaWtlIGEgZ2xvYiBhbmQgd2FzIHRoZXJlZm9yZSBub3QgY2hlY2tlZC4iLCB1cmxkYXRhLnVybCkKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHVybGRhdGEubG9jYWxwYXRoKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIGNsZWFuKHNlbGYsIHVybGRhdGEsIGQpOgorICAgICAgICByZXR1cm4KKwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvZmV0Y2gyL29zYy5weSBiL2JpdGJha2UvbGliL2JiL2ZldGNoMi9vc2MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q4Nzc5NgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL2ZldGNoMi9vc2MucHkKQEAgLTAsMCArMSwxMzUgQEAKKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisiIiIKK0JpdGJha2UgIkZldGNoIiBpbXBsZW1lbnRhdGlvbiBmb3Igb3NjIChPcGVuc3VzZSBidWlsZCBzZXJ2aWNlIGNsaWVudCkuCitCYXNlZCBvbiB0aGUgc3ZuICJGZXRjaCIgaW1wbGVtZW50YXRpb24uCisKKyIiIgorCitpbXBvcnQgIG9zCitpbXBvcnQgIHN5cworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCAgYmIKK2Zyb20gICAgYmIgICAgICAgaW1wb3J0IGRhdGEKK2Zyb20gICAgYmIuZmV0Y2gyIGltcG9ydCBGZXRjaE1ldGhvZAorZnJvbSAgICBiYi5mZXRjaDIgaW1wb3J0IEZldGNoRXJyb3IKK2Zyb20gICAgYmIuZmV0Y2gyIGltcG9ydCBNaXNzaW5nUGFyYW1ldGVyRXJyb3IKK2Zyb20gICAgYmIuZmV0Y2gyIGltcG9ydCBydW5mZXRjaGNtZAorCitjbGFzcyBPc2MoRmV0Y2hNZXRob2QpOgorICAgICIiIkNsYXNzIHRvIGZldGNoIGEgbW9kdWxlIG9yIG1vZHVsZXMgZnJvbSBPcGVuc3VzZSBidWlsZCBzZXJ2ZXIKKyAgICAgICByZXBvc2l0b3JpZXMuIiIiCisKKyAgICBkZWYgc3VwcG9ydHMoc2VsZiwgdWQsIGQpOgorICAgICAgICAiIiIKKyAgICAgICAgQ2hlY2sgdG8gc2VlIGlmIGEgZ2l2ZW4gdXJsIGNhbiBiZSBmZXRjaGVkIHdpdGggb3NjLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHVkLnR5cGUgaW4gWydvc2MnXQorCisgICAgZGVmIHVybGRhdGFfaW5pdChzZWxmLCB1ZCwgZCk6CisgICAgICAgIGlmIG5vdCAibW9kdWxlIiBpbiB1ZC5wYXJtOgorICAgICAgICAgICAgcmFpc2UgTWlzc2luZ1BhcmFtZXRlckVycm9yKCdtb2R1bGUnLCB1ZC51cmwpCisKKyAgICAgICAgdWQubW9kdWxlID0gdWQucGFybVsibW9kdWxlIl0KKworICAgICAgICAjIENyZWF0ZSBwYXRocyB0byBvc2MgY2hlY2tvdXRzCisgICAgICAgIHJlbHBhdGggPSBzZWxmLl9zdHJpcF9sZWFkaW5nX3NsYXNoZXModWQucGF0aCkKKyAgICAgICAgdWQucGtnZGlyID0gb3MucGF0aC5qb2luKGRhdGEuZXhwYW5kKCcke09TQ0RJUn0nLCBkKSwgdWQuaG9zdCkKKyAgICAgICAgdWQubW9kZGlyID0gb3MucGF0aC5qb2luKHVkLnBrZ2RpciwgcmVscGF0aCwgdWQubW9kdWxlKQorCisgICAgICAgIGlmICdyZXYnIGluIHVkLnBhcm06CisgICAgICAgICAgICB1ZC5yZXZpc2lvbiA9IHVkLnBhcm1bJ3JldiddCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwdiA9IGRhdGEuZ2V0VmFyKCJQViIsIGQsIDApCisgICAgICAgICAgICByZXYgPSBiYi5mZXRjaDIuc3JjcmV2X2ludGVybmFsX2hlbHBlcih1ZCwgZCkKKyAgICAgICAgICAgIGlmIHJldiBhbmQgcmV2ICE9IFRydWU6CisgICAgICAgICAgICAgICAgdWQucmV2aXNpb24gPSByZXYKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdWQucmV2aXNpb24gPSAiIgorCisgICAgICAgIHVkLmxvY2FsZmlsZSA9IGRhdGEuZXhwYW5kKCclc18lc18lcy50YXIuZ3onICUgKHVkLm1vZHVsZS5yZXBsYWNlKCcvJywgJy4nKSwgdWQucGF0aC5yZXBsYWNlKCcvJywgJy4nKSwgdWQucmV2aXNpb24pLCBkKQorCisgICAgZGVmIF9idWlsZG9zY2NvbW1hbmQoc2VsZiwgdWQsIGQsIGNvbW1hbmQpOgorICAgICAgICAiIiIKKyAgICAgICAgQnVpbGQgdXAgYW4gb2NzIGNvbW1hbmRsaW5lIGJhc2VkIG9uIHVkCisgICAgICAgIGNvbW1hbmQgaXMgImZldGNoIiwgInVwZGF0ZSIsICJpbmZvIgorICAgICAgICAiIiIKKworICAgICAgICBiYXNlY21kID0gZGF0YS5leHBhbmQoJyR7RkVUQ0hDTURfb3NjfScsIGQpCisKKyAgICAgICAgcHJvdG8gPSB1ZC5wYXJtLmdldCgncHJvdG9jb2wnLCAnb2NzJykKKworICAgICAgICBvcHRpb25zID0gW10KKworICAgICAgICBjb25maWcgPSAiLWMgJXMiICUgc2VsZi5nZW5lcmF0ZV9jb25maWcodWQsIGQpCisKKyAgICAgICAgaWYgdWQucmV2aXNpb246CisgICAgICAgICAgICBvcHRpb25zLmFwcGVuZCgiLXIgJXMiICUgdWQucmV2aXNpb24pCisKKyAgICAgICAgY29yb290ID0gc2VsZi5fc3RyaXBfbGVhZGluZ19zbGFzaGVzKHVkLnBhdGgpCisKKyAgICAgICAgaWYgY29tbWFuZCA9PSAiZmV0Y2giOgorICAgICAgICAgICAgb3NjY21kID0gIiVzICVzIGNvICVzLyVzICVzIiAlIChiYXNlY21kLCBjb25maWcsIGNvcm9vdCwgdWQubW9kdWxlLCAiICIuam9pbihvcHRpb25zKSkKKyAgICAgICAgZWxpZiBjb21tYW5kID09ICJ1cGRhdGUiOgorICAgICAgICAgICAgb3NjY21kID0gIiVzICVzIHVwICVzIiAlIChiYXNlY21kLCBjb25maWcsICIgIi5qb2luKG9wdGlvbnMpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgRmV0Y2hFcnJvcigiSW52YWxpZCBvc2MgY29tbWFuZCAlcyIgJSBjb21tYW5kLCB1ZC51cmwpCisKKyAgICAgICAgcmV0dXJuIG9zY2NtZAorCisgICAgZGVmIGRvd25sb2FkKHNlbGYsIHVkLCBkKToKKyAgICAgICAgIiIiCisgICAgICAgIEZldGNoIHVybAorICAgICAgICAiIiIKKworICAgICAgICBsb2dnZXIuZGVidWcoMiwgIkZldGNoOiBjaGVja2luZyBmb3IgbW9kdWxlIGRpcmVjdG9yeSAnIiArIHVkLm1vZGRpciArICInIikKKworICAgICAgICBpZiBvcy5hY2Nlc3Mob3MucGF0aC5qb2luKGRhdGEuZXhwYW5kKCcke09TQ0RJUn0nLCBkKSwgdWQucGF0aCwgdWQubW9kdWxlKSwgb3MuUl9PSyk6CisgICAgICAgICAgICBvc2N1cGRhdGVjbWQgPSBzZWxmLl9idWlsZG9zY2NvbW1hbmQodWQsIGQsICJ1cGRhdGUiKQorICAgICAgICAgICAgbG9nZ2VyLmluZm8oIlVwZGF0ZSAiKyB1ZC51cmwpCisgICAgICAgICAgICAjIHVwZGF0ZSBzb3VyY2VzIHRoZXJlCisgICAgICAgICAgICBvcy5jaGRpcih1ZC5tb2RkaXIpCisgICAgICAgICAgICBsb2dnZXIuZGVidWcoMSwgIlJ1bm5pbmcgJXMiLCBvc2N1cGRhdGVjbWQpCisgICAgICAgICAgICBiYi5mZXRjaDIuY2hlY2tfbmV0d29ya19hY2Nlc3MoZCwgb3NjdXBkYXRlY21kLCB1ZC51cmwpCisgICAgICAgICAgICBydW5mZXRjaGNtZChvc2N1cGRhdGVjbWQsIGQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvc2NmZXRjaGNtZCA9IHNlbGYuX2J1aWxkb3NjY29tbWFuZCh1ZCwgZCwgImZldGNoIikKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJGZXRjaCAiICsgdWQudXJsKQorICAgICAgICAgICAgIyBjaGVjayBvdXQgc291cmNlcyB0aGVyZQorICAgICAgICAgICAgYmIudXRpbHMubWtkaXJoaWVyKHVkLnBrZ2RpcikKKyAgICAgICAgICAgIG9zLmNoZGlyKHVkLnBrZ2RpcikKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiUnVubmluZyAlcyIsIG9zY2ZldGNoY21kKQorICAgICAgICAgICAgYmIuZmV0Y2gyLmNoZWNrX25ldHdvcmtfYWNjZXNzKGQsIG9zY2ZldGNoY21kLCB1ZC51cmwpCisgICAgICAgICAgICBydW5mZXRjaGNtZChvc2NmZXRjaGNtZCwgZCkKKworICAgICAgICBvcy5jaGRpcihvcy5wYXRoLmpvaW4odWQucGtnZGlyICsgdWQucGF0aCkpCisgICAgICAgICMgdGFyIHRoZW0gdXAgdG8gYSBkZWZpbmVkIGZpbGVuYW1lCisgICAgICAgIHJ1bmZldGNoY21kKCJ0YXIgLWN6ZiAlcyAlcyIgJSAodWQubG9jYWxwYXRoLCB1ZC5tb2R1bGUpLCBkLCBjbGVhbnVwID0gW3VkLmxvY2FscGF0aF0pCisKKyAgICBkZWYgc3VwcG9ydHNfc3JjcmV2KHNlbGYpOgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBnZW5lcmF0ZV9jb25maWcoc2VsZiwgdWQsIGQpOgorICAgICAgICAiIiIKKyAgICAgICAgR2VuZXJhdGUgYSAub3NjcmMgdG8gYmUgdXNlZCBmb3IgdGhpcyBydW4uCisgICAgICAgICIiIgorCisgICAgICAgIGNvbmZpZ19wYXRoID0gb3MucGF0aC5qb2luKGRhdGEuZXhwYW5kKCcke09TQ0RJUn0nLCBkKSwgIm9zY3JjIikKKyAgICAgICAgaWYgKG9zLnBhdGguZXhpc3RzKGNvbmZpZ19wYXRoKSk6CisgICAgICAgICAgICBvcy5yZW1vdmUoY29uZmlnX3BhdGgpCisKKyAgICAgICAgZiA9IG9wZW4oY29uZmlnX3BhdGgsICd3JykKKyAgICAgICAgZi53cml0ZSgiW2dlbmVyYWxdXG4iKQorICAgICAgICBmLndyaXRlKCJhcGlzcnYgPSAlc1xuIiAlIHVkLmhvc3QpCisgICAgICAgIGYud3JpdGUoInNjaGVtZSA9IGh0dHBcbiIpCisgICAgICAgIGYud3JpdGUoInN1LXdyYXBwZXIgPSBzdSAtY1xuIikKKyAgICAgICAgZi53cml0ZSgiYnVpbGQtcm9vdCA9ICVzXG4iICUgZGF0YS5leHBhbmQoJyR7V09SS0RJUn0nLCBkKSkKKyAgICAgICAgZi53cml0ZSgidXJsbGlzdCA9IGh0dHA6Ly9tb2JsaW4tb2JzLmpmLmludGVsLmNvbTo4ODg4L2J1aWxkLyUocHJvamVjdClzLyUocmVwb3NpdG9yeSlzLyUoYnVpbGRhcmNoKXMvOmZ1bGwvJShuYW1lKXMucnBtXG4iKQorICAgICAgICBmLndyaXRlKCJleHRyYS1wa2dzID0gZ3ppcFxuIikKKyAgICAgICAgZi53cml0ZSgiXG4iKQorICAgICAgICBmLndyaXRlKCJbJXNdXG4iICUgdWQuaG9zdCkKKyAgICAgICAgZi53cml0ZSgidXNlciA9ICVzXG4iICUgdWQucGFybVsidXNlciJdKQorICAgICAgICBmLndyaXRlKCJwYXNzID0gJXNcbiIgJSB1ZC5wYXJtWyJwc3dkIl0pCisgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgIHJldHVybiBjb25maWdfcGF0aApkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvZmV0Y2gyL3BlcmZvcmNlLnB5IGIvYml0YmFrZS9saWIvYmIvZmV0Y2gyL3BlcmZvcmNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMTBjN2MKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvcGVyZm9yY2UucHkKQEAgLTAsMCArMSwxODcgQEAKKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisiIiIKK0JpdEJha2UgJ0ZldGNoJyBpbXBsZW1lbnRhdGlvbnMKKworQ2xhc3NlcyBmb3Igb2J0YWluaW5nIHVwc3RyZWFtIHNvdXJjZXMgZm9yIHRoZQorQml0QmFrZSBidWlsZCB0b29scy4KKworIiIiCisKKyMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0ICBDaHJpcyBMYXJzb24KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisjCisjIEJhc2VkIG9uIGZ1bmN0aW9ucyBmcm9tIHRoZSBiYXNlIGJiIG1vZHVsZSwgQ29weXJpZ2h0IDIwMDMgSG9sZ2VyIFNjaHVyaWcKKworZnJvbSBmdXR1cmVfYnVpbHRpbnMgaW1wb3J0IHppcAoraW1wb3J0IG9zCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBiYgorZnJvbSAgIGJiIGltcG9ydCBkYXRhCitmcm9tICAgYmIuZmV0Y2gyIGltcG9ydCBGZXRjaE1ldGhvZAorZnJvbSAgIGJiLmZldGNoMiBpbXBvcnQgRmV0Y2hFcnJvcgorZnJvbSAgIGJiLmZldGNoMiBpbXBvcnQgbG9nZ2VyCitmcm9tICAgYmIuZmV0Y2gyIGltcG9ydCBydW5mZXRjaGNtZAorCitjbGFzcyBQZXJmb3JjZShGZXRjaE1ldGhvZCk6CisgICAgZGVmIHN1cHBvcnRzKHNlbGYsIHVkLCBkKToKKyAgICAgICAgcmV0dXJuIHVkLnR5cGUgaW4gWydwNCddCisKKyAgICBkZWYgZG9wYXJzZSh1cmwsIGQpOgorICAgICAgICBwYXJtID0ge30KKyAgICAgICAgcGF0aCA9IHVybC5zcGxpdCgiOi8vIilbMV0KKyAgICAgICAgZGVsaW0gPSBwYXRoLmZpbmQoIkAiKTsKKyAgICAgICAgaWYgZGVsaW0gIT0gLTE6CisgICAgICAgICAgICAodXNlciwgcHN3ZCwgaG9zdCwgcG9ydCkgPSBwYXRoLnNwbGl0KCdAJylbMF0uc3BsaXQoIjoiKQorICAgICAgICAgICAgcGF0aCA9IHBhdGguc3BsaXQoJ0AnKVsxXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgKGhvc3QsIHBvcnQpID0gZC5nZXRWYXIoJ1A0UE9SVCcsIEZhbHNlKS5zcGxpdCgnOicpCisgICAgICAgICAgICB1c2VyID0gIiIKKyAgICAgICAgICAgIHBzd2QgPSAiIgorCisgICAgICAgIGlmIHBhdGguZmluZCgiOyIpICE9IC0xOgorICAgICAgICAgICAga2V5cz1bXQorICAgICAgICAgICAgdmFsdWVzPVtdCisgICAgICAgICAgICBwbGlzdCA9IHBhdGguc3BsaXQoJzsnKQorICAgICAgICAgICAgZm9yIGl0ZW0gaW4gcGxpc3Q6CisgICAgICAgICAgICAgICAgaWYgaXRlbS5jb3VudCgnPScpOgorICAgICAgICAgICAgICAgICAgICAoa2V5LCB2YWx1ZSkgPSBpdGVtLnNwbGl0KCc9JykKKyAgICAgICAgICAgICAgICAgICAga2V5cy5hcHBlbmQoa2V5KQorICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuYXBwZW5kKHZhbHVlKQorCisgICAgICAgICAgICBwYXJtID0gZGljdCh6aXAoa2V5cywgdmFsdWVzKSkKKyAgICAgICAgcGF0aCA9ICIvLyIgKyBwYXRoLnNwbGl0KCc7JylbMF0KKyAgICAgICAgaG9zdCArPSAiOiVzIiAlIChwb3J0KQorICAgICAgICBwYXJtWyJjc2V0Il0gPSBQZXJmb3JjZS5nZXRjc2V0KGQsIHBhdGgsIGhvc3QsIHVzZXIsIHBzd2QsIHBhcm0pCisKKyAgICAgICAgcmV0dXJuIGhvc3QsIHBhdGgsIHVzZXIsIHBzd2QsIHBhcm0KKyAgICBkb3BhcnNlID0gc3RhdGljbWV0aG9kKGRvcGFyc2UpCisKKyAgICBkZWYgZ2V0Y3NldChkLCBkZXBvdCwgaG9zdCwgdXNlciwgcHN3ZCwgcGFybSk6CisgICAgICAgIHA0b3B0ID0gIiIKKyAgICAgICAgaWYgImNzZXQiIGluIHBhcm06CisgICAgICAgICAgICByZXR1cm4gcGFybVsiY3NldCJdOworICAgICAgICBpZiB1c2VyOgorICAgICAgICAgICAgcDRvcHQgKz0gIiAtdSAlcyIgJSAodXNlcikKKyAgICAgICAgaWYgcHN3ZDoKKyAgICAgICAgICAgIHA0b3B0ICs9ICIgLVAgJXMiICUgKHBzd2QpCisgICAgICAgIGlmIGhvc3Q6CisgICAgICAgICAgICBwNG9wdCArPSAiIC1wICVzIiAlIChob3N0KQorCisgICAgICAgIHA0ZGF0ZSA9IGQuZ2V0VmFyKCJQNERBVEUiLCBUcnVlKQorICAgICAgICBpZiAicmV2aXNpb24iIGluIHBhcm06CisgICAgICAgICAgICBkZXBvdCArPSAiIyVzIiAlIChwYXJtWyJyZXZpc2lvbiJdKQorICAgICAgICBlbGlmICJsYWJlbCIgaW4gcGFybToKKyAgICAgICAgICAgIGRlcG90ICs9ICJAJXMiICUgKHBhcm1bImxhYmVsIl0pCisgICAgICAgIGVsaWYgcDRkYXRlOgorICAgICAgICAgICAgZGVwb3QgKz0gIkAlcyIgJSAocDRkYXRlKQorCisgICAgICAgIHA0Y21kID0gZC5nZXRWYXIoJ0ZFVENIQ01EX3A0JywgVHJ1ZSkgb3IgInA0IgorICAgICAgICBsb2dnZXIuZGVidWcoMSwgIlJ1bm5pbmcgJXMlcyBjaGFuZ2VzIC1tIDEgJXMiLCBwNGNtZCwgcDRvcHQsIGRlcG90KQorICAgICAgICBwNGZpbGUsIGVycm9ycyA9IGJiLnByb2Nlc3MucnVuKCIlcyVzIGNoYW5nZXMgLW0gMSAlcyIgJSAocDRjbWQsIHA0b3B0LCBkZXBvdCkpCisgICAgICAgIGNzZXQgPSBwNGZpbGUuc3RyaXAoKQorICAgICAgICBsb2dnZXIuZGVidWcoMSwgIlJFQUQgJXMiLCBjc2V0KQorICAgICAgICBpZiBub3QgY3NldDoKKyAgICAgICAgICAgIHJldHVybiAtMQorCisgICAgICAgIHJldHVybiBjc2V0LnNwbGl0KCcgJylbMV0KKyAgICBnZXRjc2V0ID0gc3RhdGljbWV0aG9kKGdldGNzZXQpCisKKyAgICBkZWYgdXJsZGF0YV9pbml0KHNlbGYsIHVkLCBkKToKKyAgICAgICAgKGhvc3QsIHBhdGgsIHVzZXIsIHBzd2QsIHBhcm0pID0gUGVyZm9yY2UuZG9wYXJzZSh1ZC51cmwsIGQpCisKKyAgICAgICAgYmFzZV9wYXRoID0gcGF0aC5yZXBsYWNlKCcvLi4uJywgJycpCisgICAgICAgIGJhc2VfcGF0aCA9IHNlbGYuX3N0cmlwX2xlYWRpbmdfc2xhc2hlcyhiYXNlX3BhdGgpCisgICAgICAgIAorICAgICAgICBpZiAibGFiZWwiIGluIHBhcm06CisgICAgICAgICAgICB2ZXJzaW9uID0gcGFybVsibGFiZWwiXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdmVyc2lvbiA9IFBlcmZvcmNlLmdldGNzZXQoZCwgcGF0aCwgaG9zdCwgdXNlciwgcHN3ZCwgcGFybSkKKworICAgICAgICB1ZC5sb2NhbGZpbGUgPSBkYXRhLmV4cGFuZCgnJXMrJXMrJXMudGFyLmd6JyAlIChob3N0LCBiYXNlX3BhdGgucmVwbGFjZSgnLycsICcuJyksIHZlcnNpb24pLCBkKQorCisgICAgZGVmIGRvd25sb2FkKHNlbGYsIHVkLCBkKToKKyAgICAgICAgIiIiCisgICAgICAgIEZldGNoIHVybHMKKyAgICAgICAgIiIiCisKKyAgICAgICAgKGhvc3QsIGRlcG90LCB1c2VyLCBwc3dkLCBwYXJtKSA9IFBlcmZvcmNlLmRvcGFyc2UodWQudXJsLCBkKQorCisgICAgICAgIGlmIGRlcG90LmZpbmQoJy8uLi4nKSAhPSAtMToKKyAgICAgICAgICAgIHBhdGggPSBkZXBvdFs6ZGVwb3QuZmluZCgnLy4uLicpXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGF0aCA9IGRlcG90WzpkZXBvdC5yZmluZCgnLycpXQorCisgICAgICAgIG1vZHVsZSA9IHBhcm0uZ2V0KCdtb2R1bGUnLCBvcy5wYXRoLmJhc2VuYW1lKHBhdGgpKQorCisgICAgICAgICMgR2V0IHRoZSBwNCBjb21tYW5kCisgICAgICAgIHA0b3B0ID0gIiIKKyAgICAgICAgaWYgdXNlcjoKKyAgICAgICAgICAgIHA0b3B0ICs9ICIgLXUgJXMiICUgKHVzZXIpCisKKyAgICAgICAgaWYgcHN3ZDoKKyAgICAgICAgICAgIHA0b3B0ICs9ICIgLVAgJXMiICUgKHBzd2QpCisKKyAgICAgICAgaWYgaG9zdDoKKyAgICAgICAgICAgIHA0b3B0ICs9ICIgLXAgJXMiICUgKGhvc3QpCisKKyAgICAgICAgcDRjbWQgPSBkLmdldFZhcignRkVUQ0hDTURfcDQnLCBUcnVlKSBvciAicDQiCisKKyAgICAgICAgIyBjcmVhdGUgdGVtcCBkaXJlY3RvcnkKKyAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICJGZXRjaDogY3JlYXRpbmcgdGVtcG9yYXJ5IGRpcmVjdG9yeSIpCisgICAgICAgIGJiLnV0aWxzLm1rZGlyaGllcihkLmV4cGFuZCgnJHtXT1JLRElSfScpKQorICAgICAgICBta3RlbXAgPSBkLmdldFZhcigiRkVUQ0hDTURfcDRta3RlbXAiLCBUcnVlKSBvciBkLmV4cGFuZCgibWt0ZW1wIC1kIC1xICcke1dPUktESVJ9L29lcDQuWFhYWFhYJyIpCisgICAgICAgIHRtcGZpbGUsIGVycm9ycyA9IGJiLnByb2Nlc3MucnVuKG1rdGVtcCkKKyAgICAgICAgdG1wZmlsZSA9IHRtcGZpbGUuc3RyaXAoKQorICAgICAgICBpZiBub3QgdG1wZmlsZToKKyAgICAgICAgICAgIHJhaXNlIEZldGNoRXJyb3IoIkZldGNoOiB1bmFibGUgdG8gY3JlYXRlIHRlbXBvcmFyeSBkaXJlY3RvcnkuLiBtYWtlIHN1cmUgJ21rdGVtcCcgaXMgaW4gdGhlIFBBVEguIiwgdWQudXJsKQorCisgICAgICAgIGlmICJsYWJlbCIgaW4gcGFybToKKyAgICAgICAgICAgIGRlcG90ID0gIiVzQCVzIiAlIChkZXBvdCwgcGFybVsibGFiZWwiXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNzZXQgPSBQZXJmb3JjZS5nZXRjc2V0KGQsIGRlcG90LCBob3N0LCB1c2VyLCBwc3dkLCBwYXJtKQorICAgICAgICAgICAgZGVwb3QgPSAiJXNAJXMiICUgKGRlcG90LCBjc2V0KQorCisgICAgICAgIG9zLmNoZGlyKHRtcGZpbGUpCisgICAgICAgIGxvZ2dlci5pbmZvKCJGZXRjaCAiICsgdWQudXJsKQorICAgICAgICBsb2dnZXIuaW5mbygiJXMlcyBmaWxlcyAlcyIsIHA0Y21kLCBwNG9wdCwgZGVwb3QpCisgICAgICAgIHA0ZmlsZSwgZXJyb3JzID0gYmIucHJvY2Vzcy5ydW4oIiVzJXMgZmlsZXMgJXMiICUgKHA0Y21kLCBwNG9wdCwgZGVwb3QpKQorICAgICAgICBwNGZpbGUgPSBbZi5yc3RyaXAoKSBmb3IgZiBpbiBwNGZpbGUuc3BsaXRsaW5lcygpXQorCisgICAgICAgIGlmIG5vdCBwNGZpbGU6CisgICAgICAgICAgICByYWlzZSBGZXRjaEVycm9yKCJGZXRjaDogdW5hYmxlIHRvIGdldCB0aGUgUDQgZmlsZXMgZnJvbSAlcyIgJSBkZXBvdCwgdWQudXJsKQorCisgICAgICAgIGNvdW50ID0gMAorCisgICAgICAgIGZvciBmaWxlIGluIHA0ZmlsZToKKyAgICAgICAgICAgIGxpc3QgPSBmaWxlLnNwbGl0KCkKKworICAgICAgICAgICAgaWYgbGlzdFsyXSA9PSAiZGVsZXRlIjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBkZXN0ID0gbGlzdFswXVtsZW4ocGF0aCkrMTpdCisgICAgICAgICAgICB3aGVyZSA9IGRlc3QuZmluZCgiIyIpCisKKyAgICAgICAgICAgIHN1YnByb2Nlc3MuY2FsbCgiJXMlcyBwcmludCAtbyAlcy8lcyAlcyIgJSAocDRjbWQsIHA0b3B0LCBtb2R1bGUsIGRlc3RbOndoZXJlXSwgbGlzdFswXSksIHNoZWxsPVRydWUpCisgICAgICAgICAgICBjb3VudCA9IGNvdW50ICsgMQorCisgICAgICAgIGlmIGNvdW50ID09IDA6CisgICAgICAgICAgICBsb2dnZXIuZXJyb3IoKQorICAgICAgICAgICAgcmFpc2UgRmV0Y2hFcnJvcigiRmV0Y2g6IE5vIGZpbGVzIGdhdGhlcmVkIGZyb20gdGhlIFA0IGZldGNoIiwgdWQudXJsKQorCisgICAgICAgIHJ1bmZldGNoY21kKCJ0YXIgLWN6ZiAlcyAlcyIgJSAodWQubG9jYWxwYXRoLCBtb2R1bGUpLCBkLCBjbGVhbnVwID0gW3VkLmxvY2FscGF0aF0pCisgICAgICAgICMgY2xlYW51cAorICAgICAgICBiYi51dGlscy5wcnVuZWRpcih0bXBmaWxlKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvZmV0Y2gyL3JlcG8ucHkgYi9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvcmVwby5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTY3OGViCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvZmV0Y2gyL3JlcG8ucHkKQEAgLTAsMCArMSw5OCBAQAorIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyIiIgorQml0QmFrZSAiRmV0Y2giIHJlcG8gKGdpdCkgaW1wbGVtZW50YXRpb24KKworIiIiCisKKyMgQ29weXJpZ2h0IChDKSAyMDA5IFRvbSBSaW5pIDx0cmluaUBlbWJlZGRlZGFsbGV5LmNvbT4KKyMKKyMgQmFzZWQgb24gZ2l0LnB5IHdoaWNoIGlzOgorI0NvcHlyaWdodCAoQykgMjAwNSBSaWNoYXJkIFB1cmRpZQorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworaW1wb3J0IG9zCitpbXBvcnQgYmIKK2Zyb20gICBiYiAgICBpbXBvcnQgZGF0YQorZnJvbSAgIGJiLmZldGNoMiBpbXBvcnQgRmV0Y2hNZXRob2QKK2Zyb20gICBiYi5mZXRjaDIgaW1wb3J0IHJ1bmZldGNoY21kCisKK2NsYXNzIFJlcG8oRmV0Y2hNZXRob2QpOgorICAgICIiIkNsYXNzIHRvIGZldGNoIGEgbW9kdWxlIG9yIG1vZHVsZXMgZnJvbSByZXBvIChnaXQpIHJlcG9zaXRvcmllcyIiIgorICAgIGRlZiBzdXBwb3J0cyhzZWxmLCB1ZCwgZCk6CisgICAgICAgICIiIgorICAgICAgICBDaGVjayB0byBzZWUgaWYgYSBnaXZlbiB1cmwgY2FuIGJlIGZldGNoZWQgd2l0aCByZXBvLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHVkLnR5cGUgaW4gWyJyZXBvIl0KKworICAgIGRlZiB1cmxkYXRhX2luaXQoc2VsZiwgdWQsIGQpOgorICAgICAgICAiIiIKKyAgICAgICAgV2UgZG9uInQgY2FyZSBhYm91dCB0aGUgZ2l0IHJldiBvZiB0aGUgbWFuaWZlc3RzIHJlcG9zaXRvcnksIGJ1dAorICAgICAgICB3ZSBkbyBjYXJlIGFib3V0IHRoZSBtYW5pZmVzdCB0byB1c2UuICBUaGUgZGVmYXVsdCBpcyAiZGVmYXVsdCIuCisgICAgICAgIFdlIGFsc28gY2FyZSBhYm91dCB0aGUgYnJhbmNoIG9yIHRhZyB0byBiZSB1c2VkLiAgVGhlIGRlZmF1bHQgaXMKKyAgICAgICAgIm1hc3RlciIuCisgICAgICAgICIiIgorCisgICAgICAgIHVkLnByb3RvID0gdWQucGFybS5nZXQoJ3Byb3RvY29sJywgJ2dpdCcpCisgICAgICAgIHVkLmJyYW5jaCA9IHVkLnBhcm0uZ2V0KCdicmFuY2gnLCAnbWFzdGVyJykKKyAgICAgICAgdWQubWFuaWZlc3QgPSB1ZC5wYXJtLmdldCgnbWFuaWZlc3QnLCAnZGVmYXVsdC54bWwnKQorICAgICAgICBpZiBub3QgdWQubWFuaWZlc3QuZW5kc3dpdGgoJy54bWwnKToKKyAgICAgICAgICAgIHVkLm1hbmlmZXN0ICs9ICcueG1sJworCisgICAgICAgIHVkLmxvY2FsZmlsZSA9IGRhdGEuZXhwYW5kKCJyZXBvXyVzJXNfJXNfJXMudGFyLmd6IiAlICh1ZC5ob3N0LCB1ZC5wYXRoLnJlcGxhY2UoIi8iLCAiLiIpLCB1ZC5tYW5pZmVzdCwgdWQuYnJhbmNoKSwgZCkKKworICAgIGRlZiBkb3dubG9hZChzZWxmLCB1ZCwgZCk6CisgICAgICAgICIiIkZldGNoIHVybCIiIgorCisgICAgICAgIGlmIG9zLmFjY2Vzcyhvcy5wYXRoLmpvaW4oZGF0YS5nZXRWYXIoIkRMX0RJUiIsIGQsIFRydWUpLCB1ZC5sb2NhbGZpbGUpLCBvcy5SX09LKToKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiJXMgYWxyZWFkeSBleGlzdHMgKG9yIHdhcyBzdGFzaGVkKS4gU2tpcHBpbmcgcmVwbyBpbml0IC8gc3luYy4iLCB1ZC5sb2NhbHBhdGgpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBnaXRzcmNuYW1lID0gIiVzJXMiICUgKHVkLmhvc3QsIHVkLnBhdGgucmVwbGFjZSgiLyIsICIuIikpCisgICAgICAgIHJlcG9kaXIgPSBkYXRhLmdldFZhcigiUkVQT0RJUiIsIGQsIFRydWUpIG9yIG9zLnBhdGguam9pbihkYXRhLmdldFZhcigiRExfRElSIiwgZCwgVHJ1ZSksICJyZXBvIikKKyAgICAgICAgY29kaXIgPSBvcy5wYXRoLmpvaW4ocmVwb2RpciwgZ2l0c3JjbmFtZSwgdWQubWFuaWZlc3QpCisKKyAgICAgICAgaWYgdWQudXNlcjoKKyAgICAgICAgICAgIHVzZXJuYW1lID0gdWQudXNlciArICJAIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdXNlcm5hbWUgPSAiIgorCisgICAgICAgIGJiLnV0aWxzLm1rZGlyaGllcihvcy5wYXRoLmpvaW4oY29kaXIsICJyZXBvIikpCisgICAgICAgIG9zLmNoZGlyKG9zLnBhdGguam9pbihjb2RpciwgInJlcG8iKSkKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihjb2RpciwgInJlcG8iLCAiLnJlcG8iKSk6CisgICAgICAgICAgICBiYi5mZXRjaDIuY2hlY2tfbmV0d29ya19hY2Nlc3MoZCwgInJlcG8gaW5pdCAtbSAlcyAtYiAlcyAtdSAlczovLyVzJXMlcyIgJSAodWQubWFuaWZlc3QsIHVkLmJyYW5jaCwgdWQucHJvdG8sIHVzZXJuYW1lLCB1ZC5ob3N0LCB1ZC5wYXRoKSwgdWQudXJsKQorICAgICAgICAgICAgcnVuZmV0Y2hjbWQoInJlcG8gaW5pdCAtbSAlcyAtYiAlcyAtdSAlczovLyVzJXMlcyIgJSAodWQubWFuaWZlc3QsIHVkLmJyYW5jaCwgdWQucHJvdG8sIHVzZXJuYW1lLCB1ZC5ob3N0LCB1ZC5wYXRoKSwgZCkKKworICAgICAgICBiYi5mZXRjaDIuY2hlY2tfbmV0d29ya19hY2Nlc3MoZCwgInJlcG8gc3luYyAlcyIgJSB1ZC51cmwsIHVkLnVybCkKKyAgICAgICAgcnVuZmV0Y2hjbWQoInJlcG8gc3luYyIsIGQpCisgICAgICAgIG9zLmNoZGlyKGNvZGlyKQorCisgICAgICAgIHNjbWRhdGEgPSB1ZC5wYXJtLmdldCgic2NtZGF0YSIsICIiKQorICAgICAgICBpZiBzY21kYXRhID09ICJrZWVwIjoKKyAgICAgICAgICAgIHRhcl9mbGFncyA9ICIiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0YXJfZmxhZ3MgPSAiLS1leGNsdWRlICcucmVwbycgLS1leGNsdWRlICcuZ2l0JyIKKworICAgICAgICAjIENyZWF0ZSBhIGNhY2hlCisgICAgICAgIHJ1bmZldGNoY21kKCJ0YXIgJXMgLWN6ZiAlcyAlcyIgJSAodGFyX2ZsYWdzLCB1ZC5sb2NhbHBhdGgsIG9zLnBhdGguam9pbigiLiIsICIqIikgKSwgZCkKKworICAgIGRlZiBzdXBwb3J0c19zcmNyZXYoc2VsZik6CisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIF9idWlsZF9yZXZpc2lvbihzZWxmLCB1ZCwgZCk6CisgICAgICAgIHJldHVybiB1ZC5tYW5pZmVzdAorCisgICAgZGVmIF93YW50X3NvcnRhYmxlX3JldmlzaW9uKHNlbGYsIHVkLCBkKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvc2Z0cC5weSBiL2JpdGJha2UvbGliL2JiL2ZldGNoMi9zZnRwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMmY3NTMKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvc2Z0cC5weQpAQCAtMCwwICsxLDEyOSBAQAorIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyIiIgorQml0QmFrZSBTRlRQIEZldGNoIGltcGxlbWVudGF0aW9uCisKK0NsYXNzIGZvciBmZXRjaGluZyBmaWxlcyB2aWEgU0ZUUC4gSXQgdHJpZXMgdG8gYWRoZXJlIHRvIHRoZSAobm93CitleHBpcmVkKSBJRVRGIEludGVybmV0IERyYWZ0IGZvciAiVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyIChVUkkpCitTY2hlbWUgZm9yIFNlY3VyZSBGaWxlIFRyYW5zZmVyIFByb3RvY29sIChTRlRQKSBhbmQgU2VjdXJlIFNoZWxsCisoU1NIKSIgKFNFQ1NIIFVSSSkuCisKK0l0IHVzZXMgU0ZUUCAoYXMgdG8gYWRoZXJlIHRvIHRoZSBTRUNTSCBVUkkgc3BlY2lmaWNhdGlvbikuIEl0IG9ubHkKK3N1cHBvcnRzIGtleSBiYXNlZCBhdXRoZW50aWNhdGlvbiwgbm90IHBhc3N3b3JkLiBUaGlzIGNsYXNzLCB1bmxpa2UKK3RoZSBTU0ggZmV0Y2hlciwgZG9lcyBub3Qgc3VwcG9ydCBmZXRjaGluZyBhIGRpcmVjdG9yeSB0cmVlIGZyb20gdGhlCityZW1vdGUuCisKKyAgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtaWV0Zi1zZWNzaC1zY3Atc2Z0cC1zc2gtdXJpLTA0CisgIGh0dHBzOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL3VyaS1zY2hlbWVzL3Byb3Yvc2Z0cAorICBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtaWV0Zi1zZWNzaC1maWxleGZlci0xMworCitQbGVhc2Ugbm90ZSB0aGF0ICcvJyBpcyB1c2VkIGFzIGhvc3QgcGF0aCBzZXBlcmF0b3IsIGFuZCBub3QgIjoiCithcyB5b3UgbWF5IGJlIHVzZWQgdG8gZnJvbSB0aGUgc2NwL3NmdHAgY29tbWFuZHMuIFlvdSBjYW4gdXNlIGEKK34gKHRpbGRlKSB0byBzcGVjaWZ5IGEgcGF0aCByZWxhdGl2ZSB0byB5b3VyIGhvbWUgZGlyZWN0b3J5LgorKFRoZSAvfnVzZXIvIHN5bnRheCwgZm9yIHNwZWN5ZmluZyBhIHBhdGggcmVsYXRpdmUgdG8gYW5vdGhlcgordXNlcidzIGhvbWUgZGlyZWN0b3J5IGlzIG5vdCBzdXBwb3J0ZWQuKSBOb3RlIHRoYXQgdGhlIHRpbGRlIG11c3QKK3N0aWxsIGZvbGxvdyB0aGUgaG9zdCBwYXRoIHNlcGVyYXRvciAoIi8iKS4gU2VlIGV4YW1wZWxzIGJlbG93LgorCitFeGFtcGxlIFNSQ19VUklzOgorCitTUkNfVVJJID0gInNmdHA6Ly9ob3N0LmV4YW1wbGUuY29tL2Rpci9wYXRoLmZpbGUudHh0IgorCitBIHBhdGggcmVsYXRpdmUgdG8geW91ciBob21lIGRpcmVjdG9yeS4KKworU1JDX1VSSSA9ICJzZnRwOi8vaG9zdC5leGFtcGxlLmNvbS9+L2Rpci9wYXRoLmZpbGUudHh0IgorCitZb3UgY2FuIGFsc28gc3BlY2lmeSBhIHVzZXJuYW1lIChzcGVjeWZpbmcgcGFzc3dvcmQgaW4gdGhlCitVUkkgaXMgbm90IHN1cHBvcnRlZCwgdXNlIFNTSCBrZXlzIHRvIGF1dGhlbnRpY2F0ZSk6CisKK1NSQ19VUkkgPSAic2Z0cDovL3VzZXJAaG9zdC5leGFtcGxlLmNvbS9kaXIvcGF0aC5maWxlLnR4dCIKKworIiIiCisKKyMgQ29weXJpZ2h0IChDKSAyMDEzLCBPbG9mIEpvaGFuc3NvbiA8b2xvZi5qb2hhbnNzb25AYXhpcy5jb20+CisjCisjIEJhc2VkIGluIHBhcnQgb24gYmIuZmV0Y2gyLndnZXQ6CisjICAgIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCAgQ2hyaXMgTGFyc29uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBCYXNlZCBvbiBmdW5jdGlvbnMgZnJvbSB0aGUgYmFzZSBiYiBtb2R1bGUsIENvcHlyaWdodCAyMDAzIEhvbGdlciBTY2h1cmlnCisKK2ltcG9ydCBvcworaW1wb3J0IGJiCitpbXBvcnQgdXJsbGliCitpbXBvcnQgY29tbWFuZHMKK2Zyb20gYmIgaW1wb3J0IGRhdGEKK2Zyb20gYmIuZmV0Y2gyIGltcG9ydCBVUkkKK2Zyb20gYmIuZmV0Y2gyIGltcG9ydCBGZXRjaE1ldGhvZAorZnJvbSBiYi5mZXRjaDIgaW1wb3J0IHJ1bmZldGNoY21kCisKKworY2xhc3MgU0ZUUChGZXRjaE1ldGhvZCk6CisgICAgIiIiQ2xhc3MgdG8gZmV0Y2ggdXJscyB2aWEgJ3NmdHAnIiIiCisKKyAgICBkZWYgc3VwcG9ydHMoc2VsZiwgdWQsIGQpOgorICAgICAgICAiIiIKKyAgICAgICAgQ2hlY2sgdG8gc2VlIGlmIGEgZ2l2ZW4gdXJsIGNhbiBiZSBmZXRjaGVkIHdpdGggc2Z0cC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiB1ZC50eXBlIGluIFsnc2Z0cCddCisKKyAgICBkZWYgcmVjb21tZW5kc19jaGVja3N1bShzZWxmLCB1cmxkYXRhKToKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiB1cmxkYXRhX2luaXQoc2VsZiwgdWQsIGQpOgorICAgICAgICBpZiAncHJvdG9jb2wnIGluIHVkLnBhcm0gYW5kIHVkLnBhcm1bJ3Byb3RvY29sJ10gPT0gJ2dpdCc6CisgICAgICAgICAgICByYWlzZSBiYi5mZXRjaDIuUGFyYW1ldGVyRXJyb3IoCisgICAgICAgICAgICAgICAgIkludmFsaWQgcHJvdG9jb2wgLSBpZiB5b3Ugd2lzaCB0byBmZXRjaCBmcm9tIGEgIiArCisgICAgICAgICAgICAgICAgImdpdCByZXBvc2l0b3J5IHVzaW5nIHNzaCwgeW91IG5lZWQgdG8gdXNlIHRoZSAiICsKKyAgICAgICAgICAgICAgICAiZ2l0Oi8vIHByZWZpeCB3aXRoIHByb3RvY29sPXNzaCIsIHVkLnVybCkKKworICAgICAgICBpZiAnZG93bmxvYWRmaWxlbmFtZScgaW4gdWQucGFybToKKyAgICAgICAgICAgIHVkLmJhc2VuYW1lID0gdWQucGFybVsnZG93bmxvYWRmaWxlbmFtZSddCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB1ZC5iYXNlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUodWQucGF0aCkKKworICAgICAgICB1ZC5sb2NhbGZpbGUgPSBkYXRhLmV4cGFuZCh1cmxsaWIudW5xdW90ZSh1ZC5iYXNlbmFtZSksIGQpCisKKyAgICBkZWYgZG93bmxvYWQoc2VsZiwgdWQsIGQpOgorICAgICAgICAiIiJGZXRjaCB1cmxzIiIiCisKKyAgICAgICAgdXJsbyA9IFVSSSh1ZC51cmwpCisgICAgICAgIGJhc2VjbWQgPSAnc2Z0cCAtb0JhdGNoTW9kZT15ZXMnCisgICAgICAgIHBvcnQgPSAnJworICAgICAgICBpZiB1cmxvLnBvcnQ6CisgICAgICAgICAgICBwb3J0ID0gJy1QICVkJyAlIHVybG8ucG9ydAorICAgICAgICAgICAgdXJsby5wb3J0ID0gTm9uZQorCisgICAgICAgIGRsZGlyID0gZGF0YS5nZXRWYXIoJ0RMX0RJUicsIGQsIFRydWUpCisgICAgICAgIGxwYXRoID0gb3MucGF0aC5qb2luKGRsZGlyLCB1ZC5sb2NhbGZpbGUpCisKKyAgICAgICAgdXNlciA9ICcnCisgICAgICAgIGlmIHVybG8udXNlcmluZm86CisgICAgICAgICAgICB1c2VyID0gdXJsby51c2VyaW5mbyArICdAJworCisgICAgICAgIHBhdGggPSB1cmxvLnBhdGgKKworICAgICAgICAjIFN1cG9wcnQgVVJJcyByZWxhdGl2ZSB0byB0aGUgdXNlcidzIGhvbWUgZGlyZWN0b3J5LCB3aXRoCisgICAgICAgICMgdGhlIHRpbGRlIHN5bnRheC4gKEUuZy4gPHNmdHA6Ly9leGFtcGxlLmNvbS9+L2Zvby5kaWZmPikuCisgICAgICAgIGlmIHBhdGhbOjNdID09ICcvfi8nOgorICAgICAgICAgICAgcGF0aCA9IHBhdGhbMzpdCisKKyAgICAgICAgcmVtb3RlID0gJyVzJXM6JXMnICUgKHVzZXIsIHVybG8uaG9zdG5hbWUsIHBhdGgpCisKKyAgICAgICAgY21kID0gJyVzICVzICVzICVzJyAlIChiYXNlY21kLCBwb3J0LCBjb21tYW5kcy5ta2FyZyhyZW1vdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRzLm1rYXJnKGxwYXRoKSkKKworICAgICAgICBiYi5mZXRjaDIuY2hlY2tfbmV0d29ya19hY2Nlc3MoZCwgY21kLCB1ZC51cmwpCisgICAgICAgIHJ1bmZldGNoY21kKGNtZCwgZCkKKyAgICAgICAgcmV0dXJuIFRydWUKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL2ZldGNoMi9zc2gucHkgYi9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvc3NoLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNTU3OGEKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvc3NoLnB5CkBAIC0wLDAgKzEsMTI4IEBACisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorJycnCitCaXRCYWtlICdGZXRjaCcgaW1wbGVtZW50YXRpb25zCisKK1RoaXMgaW1wbGVtZW50YXRpb24gaXMgZm9yIFNlY3VyZSBTaGVsbCAoU1NIKSwgYW5kIGF0dGVtcHRzIHRvIGNvbXBseSB3aXRoIHRoZQorSUVURiBzZWNzaCBpbnRlcm5ldCBkcmFmdDoKKyAgICBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvd2cvc2Vjc2gvZHJhZnQtaWV0Zi1zZWNzaC1zY3Atc2Z0cC1zc2gtdXJpLworCisgICAgQ3VycmVudGx5IGRvZXMgbm90IHN1cHBvcnQgdGhlIHNmdHAgcGFyYW1ldGVycywgYXMgdGhpcyB1c2VzIHNjcAorICAgIEFsc28gZG9lcyBub3Qgc3VwcG9ydCB0aGUgJ2ZpbmdlcnByaW50JyBjb25uZWN0aW9uIHBhcmFtZXRlci4KKworICAgIFBsZWFzZSBub3RlIHRoYXQgJy8nIGlzIHVzZWQgYXMgaG9zdCwgcGF0aCBzZXBhcmF0b3Igbm90ICc6JyBhcyB5b3UgbWF5IAorICAgIGJlIHVzZWQgdG8sIGFsc28gJ34nIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdXNlciBIT01FLCBidXQgYWdhaW4gYWZ0ZXIgJy8nCisgICAgCisgICAgRXhhbXBsZSBTUkNfVVJJOgorICAgIFNSQ19VUkkgPSAic3NoOi8vdXNlckBob3N0LmV4YW1wbGUuY29tL2Rpci9wYXRoL2ZpbGUudHh0IgorICAgIFNSQ19VUkkgPSAic3NoOi8vdXNlckBob3N0LmV4YW1wbGUuY29tL34vZmlsZS50eHQiCisnJycKKworIyBDb3B5cmlnaHQgKEMpIDIwMDYgIE9wZW5lZEhhbmQgTHRkLgorIworIworIyBCYXNlZCBpbiBwYXJ0IG9uIHN2ay5weToKKyMgICAgQ29weXJpZ2h0IChDKSAyMDA2IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCisjICAgIEJhc2VkIG9uIHN2bi5weToKKyMgICAgICAgIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCAgQ2hyaXMgTGFyc29uCisjICAgICAgICBCYXNlZCBvbiBmdW5jdGlvbnMgZnJvbSB0aGUgYmFzZSBiYiBtb2R1bGU6CisjICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDMgSG9sZ2VyIFNjaHVyaWcKKyMKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCByZSwgb3MKK2Zyb20gICBiYiBpbXBvcnQgZGF0YQorZnJvbSAgIGJiLmZldGNoMiBpbXBvcnQgRmV0Y2hNZXRob2QKK2Zyb20gICBiYi5mZXRjaDIgaW1wb3J0IEZldGNoRXJyb3IKK2Zyb20gICBiYi5mZXRjaDIgaW1wb3J0IGxvZ2dlcgorZnJvbSAgIGJiLmZldGNoMiBpbXBvcnQgcnVuZmV0Y2hjbWQKKworCitfX3BhdHRlcm5fXyA9IHJlLmNvbXBpbGUocicnJworIFxzKiAgICAgICAgICAgICAgICAgIyBTa2lwIGxlYWRpbmcgd2hpdGVzcGFjZQorIHNzaDovLyAgICAgICAgICAgICAgIyBzY2hlbWUKKyAoICAgICAgICAgICAgICAgICAgICMgT3B0aW9uYWwgdXNlcm5hbWUvcGFzc3dvcmQgYmxvY2sKKyAgKD9QPHVzZXI+XFMrKSAgICAgICMgdXNlcm5hbWUKKyAgKDooP1A8cGFzcz5cUyspKT8gICMgY29sb24gZm9sbG93ZWQgYnkgdGhlIHBhc3N3b3JkIChvcHRpb25hbCkKKyApPworICg/UDxjcGFyYW0+KDtbXjtdKykqKT8gICMgY29ubmVjdGlvbiBwYXJhbWV0ZXJzIGJsb2NrIChvcHRpb25hbCkKKyBACisgKD9QPGhvc3Q+XFMrPykgICAgICAgICAgIyBub24tZ3JlZWR5IG1hdGNoIG9mIHRoZSBob3N0CisgKDooP1A8cG9ydD5bMC05XSspKT8gICAgIyBjb2xvbiBmb2xsb3dlZCBieSB0aGUgcG9ydCAob3B0aW9uYWwpCisgLworICg/UDxwYXRoPlteO10rKSAgICAgICAgICMgcGF0aCBvbiB0aGUgcmVtb3RlIHN5c3RlbSwgbWF5IGJlIGFic29sdXRlIG9yIHJlbGF0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICMgYW5kIG1heSBpbmNsdWRlIHRoZSB1c2Ugb2YgJ34nIHRvIHJlZmVyZW5jZSB0aGUgcmVtb3RlIGhvbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAjIGRpcmVjdG9yeQorICg/UDxzcGFyYW0+KDtbXjtdKykqKT8gICMgcGFyYW1ldGVycyBibG9jayAob3B0aW9uYWwpCisgJAorJycnLCByZS5WRVJCT1NFKQorCitjbGFzcyBTU0goRmV0Y2hNZXRob2QpOgorICAgICcnJ0NsYXNzIHRvIGZldGNoIGEgbW9kdWxlIG9yIG1vZHVsZXMgdmlhIFNlY3VyZSBTaGVsbCcnJworCisgICAgZGVmIHN1cHBvcnRzKHNlbGYsIHVybGRhdGEsIGQpOgorICAgICAgICByZXR1cm4gX19wYXR0ZXJuX18ubWF0Y2godXJsZGF0YS51cmwpICE9IE5vbmUKKworICAgIGRlZiBzdXBwb3J0c19jaGVja3N1bShzZWxmLCB1cmxkYXRhKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgdXJsZGF0YV9pbml0KHNlbGYsIHVybGRhdGEsIGQpOgorICAgICAgICBpZiAncHJvdG9jb2wnIGluIHVybGRhdGEucGFybSBhbmQgdXJsZGF0YS5wYXJtWydwcm90b2NvbCddID09ICdnaXQnOgorICAgICAgICAgICAgcmFpc2UgYmIuZmV0Y2gyLlBhcmFtZXRlckVycm9yKAorICAgICAgICAgICAgICAgICJJbnZhbGlkIHByb3RvY29sIC0gaWYgeW91IHdpc2ggdG8gZmV0Y2ggZnJvbSBhIGdpdCAiICsKKyAgICAgICAgICAgICAgICAicmVwb3NpdG9yeSB1c2luZyBzc2gsIHlvdSBuZWVkIHRvIHVzZSAiICsKKyAgICAgICAgICAgICAgICAiZ2l0Oi8vIHByZWZpeCB3aXRoIHByb3RvY29sPXNzaCIsIHVybGRhdGEudXJsKQorICAgICAgICBtID0gX19wYXR0ZXJuX18ubWF0Y2godXJsZGF0YS51cmwpCisgICAgICAgIHBhdGggPSBtLmdyb3VwKCdwYXRoJykKKyAgICAgICAgaG9zdCA9IG0uZ3JvdXAoJ2hvc3QnKQorICAgICAgICB1cmxkYXRhLmxvY2FscGF0aCA9IG9zLnBhdGguam9pbihkLmdldFZhcignRExfRElSJywgVHJ1ZSksCisgICAgICAgICAgICAgICAgb3MucGF0aC5iYXNlbmFtZShvcy5wYXRoLm5vcm1wYXRoKHBhdGgpKSkKKworICAgIGRlZiBkb3dubG9hZChzZWxmLCB1cmxkYXRhLCBkKToKKyAgICAgICAgZGxkaXIgPSBkLmdldFZhcignRExfRElSJywgVHJ1ZSkKKworICAgICAgICBtID0gX19wYXR0ZXJuX18ubWF0Y2godXJsZGF0YS51cmwpCisgICAgICAgIHBhdGggPSBtLmdyb3VwKCdwYXRoJykKKyAgICAgICAgaG9zdCA9IG0uZ3JvdXAoJ2hvc3QnKQorICAgICAgICBwb3J0ID0gbS5ncm91cCgncG9ydCcpCisgICAgICAgIHVzZXIgPSBtLmdyb3VwKCd1c2VyJykKKyAgICAgICAgcGFzc3dvcmQgPSBtLmdyb3VwKCdwYXNzJykKKworICAgICAgICBpZiBwb3J0OgorICAgICAgICAgICAgcG9ydGFyZyA9ICctUCAlcycgJSBwb3J0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwb3J0YXJnID0gJycKKworICAgICAgICBpZiB1c2VyOgorICAgICAgICAgICAgZnIgPSB1c2VyCisgICAgICAgICAgICBpZiBwYXNzd29yZDoKKyAgICAgICAgICAgICAgICBmciArPSAnOiVzJyAlIHBhc3N3b3JkCisgICAgICAgICAgICBmciArPSAnQCVzJyAlIGhvc3QKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZyID0gaG9zdAorICAgICAgICBmciArPSAnOiVzJyAlIHBhdGgKKworCisgICAgICAgIGltcG9ydCBjb21tYW5kcworICAgICAgICBjbWQgPSAnc2NwIC1CIC1yICVzICVzICVzLycgJSAoCisgICAgICAgICAgICBwb3J0YXJnLAorICAgICAgICAgICAgY29tbWFuZHMubWthcmcoZnIpLAorICAgICAgICAgICAgY29tbWFuZHMubWthcmcoZGxkaXIpCisgICAgICAgICkKKworICAgICAgICBiYi5mZXRjaDIuY2hlY2tfbmV0d29ya19hY2Nlc3MoZCwgY21kLCB1cmxkYXRhLnVybCkKKworICAgICAgICBydW5mZXRjaGNtZChjbWQsIGQpCisKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL2ZldGNoMi9zdm4ucHkgYi9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvc3ZuLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MzNjMmIKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvc3ZuLnB5CkBAIC0wLDAgKzEsMTkyIEBACisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIiIiCitCaXRCYWtlICdGZXRjaCcgaW1wbGVtZW50YXRpb24gZm9yIHN2bi4KKworIiIiCisKKyMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0ICBDaHJpcyBMYXJzb24KKyMgQ29weXJpZ2h0IChDKSAyMDA0ICAgICAgICBNYXJjaW4gSnVzemtpZXdpY3oKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisjCisjIEJhc2VkIG9uIGZ1bmN0aW9ucyBmcm9tIHRoZSBiYXNlIGJiIG1vZHVsZSwgQ29weXJpZ2h0IDIwMDMgSG9sZ2VyIFNjaHVyaWcKKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IGJiCitpbXBvcnQgcmUKK2Zyb20gICBiYiBpbXBvcnQgZGF0YQorZnJvbSAgIGJiLmZldGNoMiBpbXBvcnQgRmV0Y2hNZXRob2QKK2Zyb20gICBiYi5mZXRjaDIgaW1wb3J0IEZldGNoRXJyb3IKK2Zyb20gICBiYi5mZXRjaDIgaW1wb3J0IE1pc3NpbmdQYXJhbWV0ZXJFcnJvcgorZnJvbSAgIGJiLmZldGNoMiBpbXBvcnQgcnVuZmV0Y2hjbWQKK2Zyb20gICBiYi5mZXRjaDIgaW1wb3J0IGxvZ2dlcgorCitjbGFzcyBTdm4oRmV0Y2hNZXRob2QpOgorICAgICIiIkNsYXNzIHRvIGZldGNoIGEgbW9kdWxlIG9yIG1vZHVsZXMgZnJvbSBzdm4gcmVwb3NpdG9yaWVzIiIiCisgICAgZGVmIHN1cHBvcnRzKHNlbGYsIHVkLCBkKToKKyAgICAgICAgIiIiCisgICAgICAgIENoZWNrIHRvIHNlZSBpZiBhIGdpdmVuIHVybCBjYW4gYmUgZmV0Y2hlZCB3aXRoIHN2bi4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiB1ZC50eXBlIGluIFsnc3ZuJ10KKworICAgIGRlZiB1cmxkYXRhX2luaXQoc2VsZiwgdWQsIGQpOgorICAgICAgICAiIiIKKyAgICAgICAgaW5pdCBzdm4gc3BlY2lmaWMgdmFyaWFibGUgd2l0aGluIHVybCBkYXRhCisgICAgICAgICIiIgorICAgICAgICBpZiBub3QgIm1vZHVsZSIgaW4gdWQucGFybToKKyAgICAgICAgICAgIHJhaXNlIE1pc3NpbmdQYXJhbWV0ZXJFcnJvcignbW9kdWxlJywgdWQudXJsKQorCisgICAgICAgIHVkLmJhc2VjbWQgPSBkLmdldFZhcignRkVUQ0hDTURfc3ZuJywgVHJ1ZSkKKworICAgICAgICB1ZC5tb2R1bGUgPSB1ZC5wYXJtWyJtb2R1bGUiXQorCisgICAgICAgICMgQ3JlYXRlIHBhdGhzIHRvIHN2biBjaGVja291dHMKKyAgICAgICAgcmVscGF0aCA9IHNlbGYuX3N0cmlwX2xlYWRpbmdfc2xhc2hlcyh1ZC5wYXRoKQorICAgICAgICB1ZC5wa2dkaXIgPSBvcy5wYXRoLmpvaW4oZGF0YS5leHBhbmQoJyR7U1ZORElSfScsIGQpLCB1ZC5ob3N0LCByZWxwYXRoKQorICAgICAgICB1ZC5tb2RkaXIgPSBvcy5wYXRoLmpvaW4odWQucGtnZGlyLCB1ZC5tb2R1bGUpCisKKyAgICAgICAgdWQuc2V0dXBfcmV2aXNvbnMoZCkKKworICAgICAgICBpZiAncmV2JyBpbiB1ZC5wYXJtOgorICAgICAgICAgICAgdWQucmV2aXNpb24gPSB1ZC5wYXJtWydyZXYnXQorCisgICAgICAgIHVkLmxvY2FsZmlsZSA9IGRhdGEuZXhwYW5kKCclc18lc18lc18lc18udGFyLmd6JyAlICh1ZC5tb2R1bGUucmVwbGFjZSgnLycsICcuJyksIHVkLmhvc3QsIHVkLnBhdGgucmVwbGFjZSgnLycsICcuJyksIHVkLnJldmlzaW9uKSwgZCkKKworICAgIGRlZiBfYnVpbGRzdm5jb21tYW5kKHNlbGYsIHVkLCBkLCBjb21tYW5kKToKKyAgICAgICAgIiIiCisgICAgICAgIEJ1aWxkIHVwIGFuIHN2biBjb21tYW5kbGluZSBiYXNlZCBvbiB1ZAorICAgICAgICBjb21tYW5kIGlzICJmZXRjaCIsICJ1cGRhdGUiLCAiaW5mbyIKKyAgICAgICAgIiIiCisKKyAgICAgICAgcHJvdG8gPSB1ZC5wYXJtLmdldCgncHJvdG9jb2wnLCAnc3ZuJykKKworICAgICAgICBzdm5fcnNoID0gTm9uZQorICAgICAgICBpZiBwcm90byA9PSAic3ZuK3NzaCIgYW5kICJyc2giIGluIHVkLnBhcm06CisgICAgICAgICAgICBzdm5fcnNoID0gdWQucGFybVsicnNoIl0KKworICAgICAgICBzdm5yb290ID0gdWQuaG9zdCArIHVkLnBhdGgKKworICAgICAgICBvcHRpb25zID0gW10KKworICAgICAgICBvcHRpb25zLmFwcGVuZCgiLS1uby1hdXRoLWNhY2hlIikKKworICAgICAgICBpZiB1ZC51c2VyOgorICAgICAgICAgICAgb3B0aW9ucy5hcHBlbmQoIi0tdXNlcm5hbWUgJXMiICUgdWQudXNlcikKKworICAgICAgICBpZiB1ZC5wc3dkOgorICAgICAgICAgICAgb3B0aW9ucy5hcHBlbmQoIi0tcGFzc3dvcmQgJXMiICUgdWQucHN3ZCkKKworICAgICAgICBpZiBjb21tYW5kID09ICJpbmZvIjoKKyAgICAgICAgICAgIHN2bmNtZCA9ICIlcyBpbmZvICVzICVzOi8vJXMvJXMvIiAlICh1ZC5iYXNlY21kLCAiICIuam9pbihvcHRpb25zKSwgcHJvdG8sIHN2bnJvb3QsIHVkLm1vZHVsZSkKKyAgICAgICAgZWxpZiBjb21tYW5kID09ICJsb2cxIjoKKyAgICAgICAgICAgIHN2bmNtZCA9ICIlcyBsb2cgLS1saW1pdCAxICVzICVzOi8vJXMvJXMvIiAlICh1ZC5iYXNlY21kLCAiICIuam9pbihvcHRpb25zKSwgcHJvdG8sIHN2bnJvb3QsIHVkLm1vZHVsZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN1ZmZpeCA9ICIiCisgICAgICAgICAgICBpZiB1ZC5yZXZpc2lvbjoKKyAgICAgICAgICAgICAgICBvcHRpb25zLmFwcGVuZCgiLXIgJXMiICUgdWQucmV2aXNpb24pCisgICAgICAgICAgICAgICAgc3VmZml4ID0gIkAlcyIgJSAodWQucmV2aXNpb24pCisKKyAgICAgICAgICAgIGlmIGNvbW1hbmQgPT0gImZldGNoIjoKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnR1c2VyID0gdWQucGFybS5nZXQoInRyYW5zcG9ydHVzZXIiLCAiIikKKyAgICAgICAgICAgICAgICBzdm5jbWQgPSAiJXMgY28gJXMgJXM6Ly8lcyVzLyVzJXMgJXMiICUgKHVkLmJhc2VjbWQsICIgIi5qb2luKG9wdGlvbnMpLCBwcm90bywgdHJhbnNwb3J0dXNlciwgc3Zucm9vdCwgdWQubW9kdWxlLCBzdWZmaXgsIHVkLm1vZHVsZSkKKyAgICAgICAgICAgIGVsaWYgY29tbWFuZCA9PSAidXBkYXRlIjoKKyAgICAgICAgICAgICAgICBzdm5jbWQgPSAiJXMgdXBkYXRlICVzIiAlICh1ZC5iYXNlY21kLCAiICIuam9pbihvcHRpb25zKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgRmV0Y2hFcnJvcigiSW52YWxpZCBzdm4gY29tbWFuZCAlcyIgJSBjb21tYW5kLCB1ZC51cmwpCisKKyAgICAgICAgaWYgc3ZuX3JzaDoKKyAgICAgICAgICAgIHN2bmNtZCA9ICJzdm5fUlNIPVwiJXNcIiAlcyIgJSAoc3ZuX3JzaCwgc3ZuY21kKQorCisgICAgICAgIHJldHVybiBzdm5jbWQKKworICAgIGRlZiBkb3dubG9hZChzZWxmLCB1ZCwgZCk6CisgICAgICAgICIiIkZldGNoIHVybCIiIgorCisgICAgICAgIGxvZ2dlci5kZWJ1ZygyLCAiRmV0Y2g6IGNoZWNraW5nIGZvciBtb2R1bGUgZGlyZWN0b3J5ICciICsgdWQubW9kZGlyICsgIiciKQorCisgICAgICAgIGlmIG9zLmFjY2Vzcyhvcy5wYXRoLmpvaW4odWQubW9kZGlyLCAnLnN2bicpLCBvcy5SX09LKToKKyAgICAgICAgICAgIHN2bnVwZGF0ZWNtZCA9IHNlbGYuX2J1aWxkc3ZuY29tbWFuZCh1ZCwgZCwgInVwZGF0ZSIpCisgICAgICAgICAgICBsb2dnZXIuaW5mbygiVXBkYXRlICIgKyB1ZC51cmwpCisgICAgICAgICAgICAjIHVwZGF0ZSBzb3VyY2VzIHRoZXJlCisgICAgICAgICAgICBvcy5jaGRpcih1ZC5tb2RkaXIpCisgICAgICAgICAgICAjIFdlIG5lZWQgdG8gYXR0ZW1wdCB0byBydW4gc3ZuIHVwZ3JhZGUgZmlyc3QgaW4gY2FzZSBpdHMgYW4gb2xkZXIgd29ya2luZyBmb3JtYXQKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBydW5mZXRjaGNtZCh1ZC5iYXNlY21kICsgIiB1cGdyYWRlIiwgZCkKKyAgICAgICAgICAgIGV4Y2VwdCBGZXRjaEVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiUnVubmluZyAlcyIsIHN2bnVwZGF0ZWNtZCkKKyAgICAgICAgICAgIGJiLmZldGNoMi5jaGVja19uZXR3b3JrX2FjY2VzcyhkLCBzdm51cGRhdGVjbWQsIHVkLnVybCkKKyAgICAgICAgICAgIHJ1bmZldGNoY21kKHN2bnVwZGF0ZWNtZCwgZCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN2bmZldGNoY21kID0gc2VsZi5fYnVpbGRzdm5jb21tYW5kKHVkLCBkLCAiZmV0Y2giKQorICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkZldGNoICIgKyB1ZC51cmwpCisgICAgICAgICAgICAjIGNoZWNrIG91dCBzb3VyY2VzIHRoZXJlCisgICAgICAgICAgICBiYi51dGlscy5ta2RpcmhpZXIodWQucGtnZGlyKQorICAgICAgICAgICAgb3MuY2hkaXIodWQucGtnZGlyKQorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJSdW5uaW5nICVzIiwgc3ZuZmV0Y2hjbWQpCisgICAgICAgICAgICBiYi5mZXRjaDIuY2hlY2tfbmV0d29ya19hY2Nlc3MoZCwgc3ZuZmV0Y2hjbWQsIHVkLnVybCkKKyAgICAgICAgICAgIHJ1bmZldGNoY21kKHN2bmZldGNoY21kLCBkKQorCisgICAgICAgIHNjbWRhdGEgPSB1ZC5wYXJtLmdldCgic2NtZGF0YSIsICIiKQorICAgICAgICBpZiBzY21kYXRhID09ICJrZWVwIjoKKyAgICAgICAgICAgIHRhcl9mbGFncyA9ICIiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0YXJfZmxhZ3MgPSAiLS1leGNsdWRlICcuc3ZuJyIKKworICAgICAgICBvcy5jaGRpcih1ZC5wa2dkaXIpCisgICAgICAgICMgdGFyIHRoZW0gdXAgdG8gYSBkZWZpbmVkIGZpbGVuYW1lCisgICAgICAgIHJ1bmZldGNoY21kKCJ0YXIgJXMgLWN6ZiAlcyAlcyIgJSAodGFyX2ZsYWdzLCB1ZC5sb2NhbHBhdGgsIHVkLm1vZHVsZSksIGQsIGNsZWFudXAgPSBbdWQubG9jYWxwYXRoXSkKKworICAgIGRlZiBjbGVhbihzZWxmLCB1ZCwgZCk6CisgICAgICAgICIiIiBDbGVhbiBTVk4gc3BlY2lmaWMgZmlsZXMgYW5kIGRpcnMgIiIiCisKKyAgICAgICAgYmIudXRpbHMucmVtb3ZlKHVkLmxvY2FscGF0aCkKKyAgICAgICAgYmIudXRpbHMucmVtb3ZlKHVkLm1vZGRpciwgVHJ1ZSkKKyAgICAgICAgCisKKyAgICBkZWYgc3VwcG9ydHNfc3JjcmV2KHNlbGYpOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIF9yZXZpc2lvbl9rZXkoc2VsZiwgdWQsIGQsIG5hbWUpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgdW5pcXVlIGtleSBmb3IgdGhlIHVybAorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuICJzdm46IiArIHVkLm1vZGRpcgorCisgICAgZGVmIF9sYXRlc3RfcmV2aXNpb24oc2VsZiwgdWQsIGQsIG5hbWUpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIHRoZSBsYXRlc3QgdXBzdHJlYW0gcmV2aXNpb24gbnVtYmVyCisgICAgICAgICIiIgorICAgICAgICBiYi5mZXRjaDIuY2hlY2tfbmV0d29ya19hY2Nlc3MoZCwgc2VsZi5fYnVpbGRzdm5jb21tYW5kKHVkLCBkLCAibG9nMSIpKQorCisgICAgICAgIG91dHB1dCA9IHJ1bmZldGNoY21kKCJMQU5HPUMgTENfQUxMPUMgIiArIHNlbGYuX2J1aWxkc3ZuY29tbWFuZCh1ZCwgZCwgImxvZzEiKSwgZCwgVHJ1ZSkKKworICAgICAgICAjIHNraXAgdGhlIGZpcnN0IGxpbmUsIGFzIHBlciBvdXRwdXQgb2Ygc3ZuIGxvZworICAgICAgICAjIHRoZW4gd2UgZXhwZWN0IHRoZSByZXZpc2lvbiBvbiB0aGUgMm5kIGxpbmUKKyAgICAgICAgcmV2aXNpb24gPSByZS5zZWFyY2goJ15yKFswLTldKiknLCBvdXRwdXQuc3BsaXRsaW5lcygpWzFdKS5ncm91cCgxKQorCisgICAgICAgIHJldHVybiByZXZpc2lvbgorCisgICAgZGVmIHNvcnRhYmxlX3JldmlzaW9uKHNlbGYsIHVkLCBkLCBuYW1lKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIHNvcnRhYmxlIHJldmlzaW9uIG51bWJlciB3aGljaCBpbiBvdXIgY2FzZSBpcyB0aGUgcmV2aXNpb24gbnVtYmVyCisgICAgICAgICIiIgorCisgICAgICAgIHJldHVybiBGYWxzZSwgc2VsZi5fYnVpbGRfcmV2aXNpb24odWQsIGQpCisKKyAgICBkZWYgX2J1aWxkX3JldmlzaW9uKHNlbGYsIHVkLCBkKToKKyAgICAgICAgcmV0dXJuIHVkLnJldmlzaW9uCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvd2dldC5weSBiL2JpdGJha2UvbGliL2JiL2ZldGNoMi93Z2V0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMmE4OTcKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvd2dldC5weQpAQCAtMCwwICsxLDU0MSBAQAorIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyIiIgorQml0QmFrZSAnRmV0Y2gnIGltcGxlbWVudGF0aW9ucworCitDbGFzc2VzIGZvciBvYnRhaW5pbmcgdXBzdHJlYW0gc291cmNlcyBmb3IgdGhlCitCaXRCYWtlIGJ1aWxkIHRvb2xzLgorCisiIiIKKworIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgIENocmlzIExhcnNvbgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKyMgQmFzZWQgb24gZnVuY3Rpb25zIGZyb20gdGhlIGJhc2UgYmIgbW9kdWxlLCBDb3B5cmlnaHQgMjAwMyBIb2xnZXIgU2NodXJpZworCitpbXBvcnQgcmUKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBvcworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBiYgoraW1wb3J0IHVybGxpYgorZnJvbSAgIGJiIGltcG9ydCBkYXRhCitmcm9tICAgYmIuZmV0Y2gyIGltcG9ydCBGZXRjaE1ldGhvZAorZnJvbSAgIGJiLmZldGNoMiBpbXBvcnQgRmV0Y2hFcnJvcgorZnJvbSAgIGJiLmZldGNoMiBpbXBvcnQgbG9nZ2VyCitmcm9tICAgYmIuZmV0Y2gyIGltcG9ydCBydW5mZXRjaGNtZAorZnJvbSAgIGJzNCBpbXBvcnQgQmVhdXRpZnVsU291cAorCitjbGFzcyBXZ2V0KEZldGNoTWV0aG9kKToKKyAgICAiIiJDbGFzcyB0byBmZXRjaCB1cmxzIHZpYSAnd2dldCciIiIKKyAgICBkZWYgc3VwcG9ydHMoc2VsZiwgdWQsIGQpOgorICAgICAgICAiIiIKKyAgICAgICAgQ2hlY2sgdG8gc2VlIGlmIGEgZ2l2ZW4gdXJsIGNhbiBiZSBmZXRjaGVkIHdpdGggd2dldC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiB1ZC50eXBlIGluIFsnaHR0cCcsICdodHRwcycsICdmdHAnXQorCisgICAgZGVmIHJlY29tbWVuZHNfY2hlY2tzdW0oc2VsZiwgdXJsZGF0YSk6CisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgdXJsZGF0YV9pbml0KHNlbGYsIHVkLCBkKToKKyAgICAgICAgaWYgJ3Byb3RvY29sJyBpbiB1ZC5wYXJtOgorICAgICAgICAgICAgaWYgdWQucGFybVsncHJvdG9jb2wnXSA9PSAnZ2l0JzoKKyAgICAgICAgICAgICAgICByYWlzZSBiYi5mZXRjaDIuUGFyYW1ldGVyRXJyb3IoIkludmFsaWQgcHJvdG9jb2wgLSBpZiB5b3Ugd2lzaCB0byBmZXRjaCBmcm9tIGEgZ2l0IHJlcG9zaXRvcnkgdXNpbmcgaHR0cCwgeW91IG5lZWQgdG8gaW5zdGVhZCB1c2UgdGhlIGdpdDovLyBwcmVmaXggd2l0aCBwcm90b2NvbD1odHRwIiwgdWQudXJsKQorCisgICAgICAgIGlmICdkb3dubG9hZGZpbGVuYW1lJyBpbiB1ZC5wYXJtOgorICAgICAgICAgICAgdWQuYmFzZW5hbWUgPSB1ZC5wYXJtWydkb3dubG9hZGZpbGVuYW1lJ10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHVkLmJhc2VuYW1lID0gb3MucGF0aC5iYXNlbmFtZSh1ZC5wYXRoKQorCisgICAgICAgIHVkLmxvY2FsZmlsZSA9IGRhdGEuZXhwYW5kKHVybGxpYi51bnF1b3RlKHVkLmJhc2VuYW1lKSwgZCkKKworICAgICAgICBzZWxmLmJhc2VjbWQgPSBkLmdldFZhcigiRkVUQ0hDTURfd2dldCIsIFRydWUpIG9yICIvdXNyL2Jpbi9lbnYgd2dldCAtdCAyIC1UIDMwIC1udiAtLXBhc3NpdmUtZnRwIC0tbm8tY2hlY2stY2VydGlmaWNhdGUiCisKKyAgICBkZWYgX3J1bndnZXQoc2VsZiwgdWQsIGQsIGNvbW1hbmQsIHF1aWV0KToKKworICAgICAgICBsb2dnZXIuZGVidWcoMiwgIkZldGNoaW5nICVzIHVzaW5nIGNvbW1hbmQgJyVzJyIgJSAodWQudXJsLCBjb21tYW5kKSkKKyAgICAgICAgYmIuZmV0Y2gyLmNoZWNrX25ldHdvcmtfYWNjZXNzKGQsIGNvbW1hbmQpCisgICAgICAgIHJ1bmZldGNoY21kKGNvbW1hbmQsIGQsIHF1aWV0KQorCisgICAgZGVmIGRvd25sb2FkKHNlbGYsIHVkLCBkKToKKyAgICAgICAgIiIiRmV0Y2ggdXJscyIiIgorCisgICAgICAgIGZldGNoY21kID0gc2VsZi5iYXNlY21kCisKKyAgICAgICAgaWYgJ2Rvd25sb2FkZmlsZW5hbWUnIGluIHVkLnBhcm06CisgICAgICAgICAgICBkbGRpciA9IGQuZ2V0VmFyKCJETF9ESVIiLCBUcnVlKQorICAgICAgICAgICAgYmIudXRpbHMubWtkaXJoaWVyKG9zLnBhdGguZGlybmFtZShkbGRpciArIG9zLnNlcCArIHVkLmxvY2FsZmlsZSkpCisgICAgICAgICAgICBmZXRjaGNtZCArPSAiIC1PICIgKyBkbGRpciArIG9zLnNlcCArIHVkLmxvY2FsZmlsZQorCisgICAgICAgIHVyaSA9IHVkLnVybC5zcGxpdCgiOyIpWzBdCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHVkLmxvY2FscGF0aCk6CisgICAgICAgICAgICAjIGZpbGUgZXhpc3RzLCBidXQgd2UgZGlkbnQgY29tcGxldGUgaXQuLiB0cnlpbmcgYWdhaW4uLgorICAgICAgICAgICAgZmV0Y2hjbWQgKz0gZC5leHBhbmQoIiAtYyAtUCAke0RMX0RJUn0gJyVzJyIgJSB1cmkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmZXRjaGNtZCArPSBkLmV4cGFuZCgiIC1QICR7RExfRElSfSAnJXMnIiAlIHVyaSkKKworICAgICAgICBzZWxmLl9ydW53Z2V0KHVkLCBkLCBmZXRjaGNtZCwgRmFsc2UpCisKKyAgICAgICAgIyBTYW5pdHkgY2hlY2sgc2luY2Ugd2dldCBjYW4gcHJldGVuZCBpdCBzdWNjZWVkIHdoZW4gaXQgZGlkbid0CisgICAgICAgICMgQWxzbywgdGhpcyB1c2VkIHRvIGhhcHBlbiBpZiBzb3VyY2Vmb3JnZSBzZW50IHVzIHRvIHRoZSBtaXJyb3IgcGFnZQorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHModWQubG9jYWxwYXRoKToKKyAgICAgICAgICAgIHJhaXNlIEZldGNoRXJyb3IoIlRoZSBmZXRjaCBjb21tYW5kIHJldHVybmVkIHN1Y2Nlc3MgZm9yIHVybCAlcyBidXQgJXMgZG9lc24ndCBleGlzdD8hIiAlICh1cmksIHVkLmxvY2FscGF0aCksIHVyaSkKKworICAgICAgICBpZiBvcy5wYXRoLmdldHNpemUodWQubG9jYWxwYXRoKSA9PSAwOgorICAgICAgICAgICAgb3MucmVtb3ZlKHVkLmxvY2FscGF0aCkKKyAgICAgICAgICAgIHJhaXNlIEZldGNoRXJyb3IoIlRoZSBmZXRjaCBvZiAlcyByZXN1bHRlZCBpbiBhIHplcm8gc2l6ZSBmaWxlPyEgRGVsZXRpbmcgYW5kIGZhaWxpbmcgc2luY2UgdGhpcyBpc24ndCByaWdodC4iICUgKHVyaSksIHVyaSkKKworICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGNoZWNrc3RhdHVzKHNlbGYsIGZldGNoLCB1ZCwgZCk6CisgICAgICAgIGltcG9ydCB1cmxsaWIyLCBzb2NrZXQsIGh0dHBsaWIKKyAgICAgICAgZnJvbSB1cmxsaWIgaW1wb3J0IGFkZGluZm91cmwKKyAgICAgICAgZnJvbSBiYi5mZXRjaDIgaW1wb3J0IEZldGNoQ29ubmVjdGlvbkNhY2hlCisKKyAgICAgICAgY2xhc3MgSFRUUENvbm5lY3Rpb25DYWNoZShodHRwbGliLkhUVFBDb25uZWN0aW9uKToKKyAgICAgICAgICAgIGlmIGZldGNoLmNvbm5lY3Rpb25fY2FjaGU6CisgICAgICAgICAgICAgICAgZGVmIGNvbm5lY3Qoc2VsZik6CisgICAgICAgICAgICAgICAgICAgICIiIkNvbm5lY3QgdG8gdGhlIGhvc3QgYW5kIHBvcnQgc3BlY2lmaWVkIGluIF9faW5pdF9fLiIiIgorCisgICAgICAgICAgICAgICAgICAgIHNvY2sgPSBmZXRjaC5jb25uZWN0aW9uX2NhY2hlLmdldF9jb25uZWN0aW9uKHNlbGYuaG9zdCwgc2VsZi5wb3J0KQorICAgICAgICAgICAgICAgICAgICBpZiBzb2NrOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zb2NrID0gc29jaworICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zb2NrID0gc29ja2V0LmNyZWF0ZV9jb25uZWN0aW9uKChzZWxmLmhvc3QsIHNlbGYucG9ydCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRpbWVvdXQsIHNlbGYuc291cmNlX2FkZHJlc3MpCisgICAgICAgICAgICAgICAgICAgICAgICBmZXRjaC5jb25uZWN0aW9uX2NhY2hlLmFkZF9jb25uZWN0aW9uKHNlbGYuaG9zdCwgc2VsZi5wb3J0LCBzZWxmLnNvY2spCisKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5fdHVubmVsX2hvc3Q6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90dW5uZWwoKQorCisgICAgICAgIGNsYXNzIENhY2hlSFRUUEhhbmRsZXIodXJsbGliMi5IVFRQSGFuZGxlcik6CisgICAgICAgICAgICBkZWYgaHR0cF9vcGVuKHNlbGYsIHJlcSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZG9fb3BlbihIVFRQQ29ubmVjdGlvbkNhY2hlLCByZXEpCisKKyAgICAgICAgICAgIGRlZiBkb19vcGVuKHNlbGYsIGh0dHBfY2xhc3MsIHJlcSk6CisgICAgICAgICAgICAgICAgIiIiUmV0dXJuIGFuIGFkZGluZm91cmwgb2JqZWN0IGZvciB0aGUgcmVxdWVzdCwgdXNpbmcgaHR0cF9jbGFzcy4KKworICAgICAgICAgICAgICAgIGh0dHBfY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlIEhUVFBDb25uZWN0aW9uIEFQSSBmcm9tIGh0dHBsaWIuCisgICAgICAgICAgICAgICAgVGhlIGFkZGluZm91cmwgcmV0dXJuIHZhbHVlIGlzIGEgZmlsZS1saWtlIG9iamVjdC4gIEl0IGFsc28KKyAgICAgICAgICAgICAgICBoYXMgbWV0aG9kcyBhbmQgYXR0cmlidXRlcyBpbmNsdWRpbmc6CisgICAgICAgICAgICAgICAgICAgIC0gaW5mbygpOiByZXR1cm4gYSBtaW1ldG9vbHMuTWVzc2FnZSBvYmplY3QgZm9yIHRoZSBoZWFkZXJzCisgICAgICAgICAgICAgICAgICAgIC0gZ2V0dXJsKCk6IHJldHVybiB0aGUgb3JpZ2luYWwgcmVxdWVzdCBVUkwKKyAgICAgICAgICAgICAgICAgICAgLSBjb2RlOiBIVFRQIHN0YXR1cyBjb2RlCisgICAgICAgICAgICAgICAgIiIiCisgICAgICAgICAgICAgICAgaG9zdCA9IHJlcS5nZXRfaG9zdCgpCisgICAgICAgICAgICAgICAgaWYgbm90IGhvc3Q6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIHVybGxsaWIyLlVSTEVycm9yKCdubyBob3N0IGdpdmVuJykKKworICAgICAgICAgICAgICAgIGggPSBodHRwX2NsYXNzKGhvc3QsIHRpbWVvdXQ9cmVxLnRpbWVvdXQpICMgd2lsbCBwYXJzZSBob3N0OnBvcnQKKyAgICAgICAgICAgICAgICBoLnNldF9kZWJ1Z2xldmVsKHNlbGYuX2RlYnVnbGV2ZWwpCisKKyAgICAgICAgICAgICAgICBoZWFkZXJzID0gZGljdChyZXEudW5yZWRpcmVjdGVkX2hkcnMpCisgICAgICAgICAgICAgICAgaGVhZGVycy51cGRhdGUoZGljdCgoaywgdikgZm9yIGssIHYgaW4gcmVxLmhlYWRlcnMuaXRlbXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGsgbm90IGluIGhlYWRlcnMpKQorCisgICAgICAgICAgICAgICAgIyBXZSB3YW50IHRvIG1ha2UgYW4gSFRUUC8xLjEgcmVxdWVzdCwgYnV0IHRoZSBhZGRpbmZvdXJsCisgICAgICAgICAgICAgICAgIyBjbGFzcyBpc24ndCBwcmVwYXJlZCB0byBkZWFsIHdpdGggYSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24uCisgICAgICAgICAgICAgICAgIyBJdCB3aWxsIHRyeSB0byByZWFkIGFsbCByZW1haW5pbmcgZGF0YSBmcm9tIHRoZSBzb2NrZXQsCisgICAgICAgICAgICAgICAgIyB3aGljaCB3aWxsIGJsb2NrIHdoaWxlIHRoZSBzZXJ2ZXIgd2FpdHMgZm9yIHRoZSBuZXh0IHJlcXVlc3QuCisgICAgICAgICAgICAgICAgIyBTbyBtYWtlIHN1cmUgdGhlIGNvbm5lY3Rpb24gZ2V0cyBjbG9zZWQgYWZ0ZXIgdGhlIChvbmx5KQorICAgICAgICAgICAgICAgICMgcmVxdWVzdC4KKworICAgICAgICAgICAgICAgICMgRG9uJ3QgY2xvc2UgY29ubmVjdGlvbiB3aGVuIGNvbm5lY3Rpb25fY2FjaGUgaXMgZW5hYmxlZCwKKyAgICAgICAgICAgICAgICBpZiBmZXRjaC5jb25uZWN0aW9uX2NhY2hlIGlzIE5vbmU6IAorICAgICAgICAgICAgICAgICAgICBoZWFkZXJzWyJDb25uZWN0aW9uIl0gPSAiY2xvc2UiCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyc1siQ29ubmVjdGlvbiJdID0gIktlZXAtQWxpdmUiICMgV29ya3MgZm9yIEhUVFAvMS4wCisKKyAgICAgICAgICAgICAgICBoZWFkZXJzID0gZGljdCgKKyAgICAgICAgICAgICAgICAgICAgKG5hbWUudGl0bGUoKSwgdmFsKSBmb3IgbmFtZSwgdmFsIGluIGhlYWRlcnMuaXRlbXMoKSkKKworICAgICAgICAgICAgICAgIGlmIHJlcS5fdHVubmVsX2hvc3Q6CisgICAgICAgICAgICAgICAgICAgIHR1bm5lbF9oZWFkZXJzID0ge30KKyAgICAgICAgICAgICAgICAgICAgcHJveHlfYXV0aF9oZHIgPSAiUHJveHktQXV0aG9yaXphdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgaWYgcHJveHlfYXV0aF9oZHIgaW4gaGVhZGVyczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHR1bm5lbF9oZWFkZXJzW3Byb3h5X2F1dGhfaGRyXSA9IGhlYWRlcnNbcHJveHlfYXV0aF9oZHJdCisgICAgICAgICAgICAgICAgICAgICAgICAjIFByb3h5LUF1dGhvcml6YXRpb24gc2hvdWxkIG5vdCBiZSBzZW50IHRvIG9yaWdpbgorICAgICAgICAgICAgICAgICAgICAgICAgIyBzZXJ2ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICBkZWwgaGVhZGVyc1twcm94eV9hdXRoX2hkcl0KKyAgICAgICAgICAgICAgICAgICAgaC5zZXRfdHVubmVsKHJlcS5fdHVubmVsX2hvc3QsIGhlYWRlcnM9dHVubmVsX2hlYWRlcnMpCisKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGgucmVxdWVzdChyZXEuZ2V0X21ldGhvZCgpLCByZXEuZ2V0X3NlbGVjdG9yKCksIHJlcS5kYXRhLCBoZWFkZXJzKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIGVycjogIyBYWFggd2hhdCBlcnJvcj8KKyAgICAgICAgICAgICAgICAgICAgIyBEb24ndCBjbG9zZSBjb25uZWN0aW9uIHdoZW4gY2FjaGUgaXMgZW5hYmxlZC4KKyAgICAgICAgICAgICAgICAgICAgaWYgZmV0Y2guY29ubmVjdGlvbl9jYWNoZSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgaC5jbG9zZSgpCisgICAgICAgICAgICAgICAgICAgIHJhaXNlIHVybGxpYjIuVVJMRXJyb3IoZXJyKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBoLmdldHJlc3BvbnNlKGJ1ZmZlcmluZz1UcnVlKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOiAjIGJ1ZmZlcmluZyBrdyBub3Qgc3VwcG9ydGVkCisgICAgICAgICAgICAgICAgICAgICAgICByID0gaC5nZXRyZXNwb25zZSgpCisKKyAgICAgICAgICAgICAgICAjIFBpY2sgYXBhcnQgdGhlIEhUVFBSZXNwb25zZSBvYmplY3QgdG8gZ2V0IHRoZSBhZGRpbmZvdXJsCisgICAgICAgICAgICAgICAgIyBvYmplY3QgaW5pdGlhbGl6ZWQgcHJvcGVybHkuCisKKyAgICAgICAgICAgICAgICAjIFdyYXAgdGhlIEhUVFBSZXNwb25zZSBvYmplY3QgaW4gc29ja2V0J3MgZmlsZSBvYmplY3QgYWRhcHRlcgorICAgICAgICAgICAgICAgICMgZm9yIFdpbmRvd3MuICBUaGF0IGFkYXB0ZXIgY2FsbHMgcmVjdigpLCBzbyBkZWxlZ2F0ZSByZWN2KCkKKyAgICAgICAgICAgICAgICAjIHRvIHJlYWQoKS4gIFRoaXMgd2VpcmQgd3JhcHBpbmcgYWxsb3dzIHRoZSByZXR1cm5lZCBvYmplY3QgdG8KKyAgICAgICAgICAgICAgICAjIGhhdmUgcmVhZGxpbmUoKSBhbmQgcmVhZGxpbmVzKCkgbWV0aG9kcy4KKworICAgICAgICAgICAgICAgICMgWFhYIEl0IG1pZ2h0IGJlIGJldHRlciB0byBleHRyYWN0IHRoZSByZWFkIGJ1ZmZlcmluZyBjb2RlCisgICAgICAgICAgICAgICAgIyBvdXQgb2Ygc29ja2V0Ll9maWxlb2JqZWN0KCkgYW5kIGludG8gYSBiYXNlIGNsYXNzLgorICAgICAgICAgICAgICAgIHIucmVjdiA9IHIucmVhZAorCisgICAgICAgICAgICAgICAgIyBubyBkYXRhLCBqdXN0IGhhdmUgdG8gcmVhZAorICAgICAgICAgICAgICAgIHIucmVhZCgpCisgICAgICAgICAgICAgICAgY2xhc3MgZnBfZHVtbXkob2JqZWN0KToKKyAgICAgICAgICAgICAgICAgICAgZGVmIHJlYWQoc2VsZik6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiIKKyAgICAgICAgICAgICAgICAgICAgZGVmIHJlYWRsaW5lKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIiCisgICAgICAgICAgICAgICAgICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgICAgIHJlc3AgPSBhZGRpbmZvdXJsKGZwX2R1bW15KCksIHIubXNnLCByZXEuZ2V0X2Z1bGxfdXJsKCkpCisgICAgICAgICAgICAgICAgcmVzcC5jb2RlID0gci5zdGF0dXMKKyAgICAgICAgICAgICAgICByZXNwLm1zZyA9IHIucmVhc29uCisKKyAgICAgICAgICAgICAgICAjIENsb3NlIGNvbm5lY3Rpb24gd2hlbiBzZXJ2ZXIgcmVxdWVzdCBpdC4KKyAgICAgICAgICAgICAgICBpZiBmZXRjaC5jb25uZWN0aW9uX2NhY2hlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBpZiAnQ29ubmVjdGlvbicgaW4gci5tc2cgYW5kIHIubXNnWydDb25uZWN0aW9uJ10gPT0gJ2Nsb3NlJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoLmNvbm5lY3Rpb25fY2FjaGUucmVtb3ZlX2Nvbm5lY3Rpb24oaC5ob3N0LCBoLnBvcnQpCisKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzcAorCisgICAgICAgIGRlZiBleHBvcnRfcHJveGllcyhkKToKKyAgICAgICAgICAgIHZhcmlhYmxlcyA9IFsnaHR0cF9wcm94eScsICdIVFRQX1BST1hZJywgJ2h0dHBzX3Byb3h5JywgJ0hUVFBTX1BST1hZJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnRwX3Byb3h5JywgJ0ZUUF9QUk9YWScsICdub19wcm94eScsICdOT19QUk9YWSddCisgICAgICAgICAgICBleHBvcnRlZCA9IEZhbHNlCisKKyAgICAgICAgICAgIGZvciB2IGluIHZhcmlhYmxlczoKKyAgICAgICAgICAgICAgICBpZiB2IGluIG9zLmVudmlyb24ua2V5cygpOgorICAgICAgICAgICAgICAgICAgICBleHBvcnRlZCA9IFRydWUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB2X3Byb3h5ID0gZC5nZXRWYXIodiwgVHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgdl9wcm94eSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zLmVudmlyb25bdl0gPSB2X3Byb3h5CisgICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRlZCA9IFRydWUKKworICAgICAgICAgICAgcmV0dXJuIGV4cG9ydGVkCisKKyAgICAgICAgZGVmIGhlYWRfbWV0aG9kKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuICJIRUFEIgorCisgICAgICAgIGV4cG9ydGVkX3Byb3hpZXMgPSBleHBvcnRfcHJveGllcyhkKQorCisgICAgICAgICMgWFhYOiBTaW5jZSBQeXRob24gMi43Ljkgc3NsIGNlcnQgdmFsaWRhdGlvbiBpcyBlbmFibGVkIGJ5IGRlZmF1bHQKKyAgICAgICAgIyBzZWUgUEVQLTA0NzYsIHRoaXMgY2F1c2VzIHZlcmlmaWNhdGlvbiBlcnJvcnMgb24gc29tZSBodHRwcyBzZXJ2ZXJzCisgICAgICAgICMgc28gZGlzYWJsZSBieSBkZWZhdWx0LgorICAgICAgICBpbXBvcnQgc3NsCisgICAgICAgIHNzbF9jb250ZXh0ID0gTm9uZQorICAgICAgICBpZiBoYXNhdHRyKHNzbCwgJ19jcmVhdGVfdW52ZXJpZmllZF9jb250ZXh0Jyk6CisgICAgICAgICAgICBzc2xfY29udGV4dCA9IHNzbC5fY3JlYXRlX3VudmVyaWZpZWRfY29udGV4dCgpCisKKyAgICAgICAgaWYgZXhwb3J0ZWRfcHJveGllcyA9PSBUcnVlIGFuZCBzc2xfY29udGV4dCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG9wZW5lciA9IHVybGxpYjIuYnVpbGRfb3BlbmVyKHVybGxpYjIuUHJveHlIYW5kbGVyLCBDYWNoZUhUVFBIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICB1cmxsaWIyLkhUVFBTSGFuZGxlcihjb250ZXh0PXNzbF9jb250ZXh0KSkKKyAgICAgICAgZWxpZiBleHBvcnRlZF9wcm94aWVzID09IEZhbHNlIGFuZCBzc2xfY29udGV4dCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG9wZW5lciA9IHVybGxpYjIuYnVpbGRfb3BlbmVyKENhY2hlSFRUUEhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgIHVybGxpYjIuSFRUUFNIYW5kbGVyKGNvbnRleHQ9c3NsX2NvbnRleHQpKQorICAgICAgICBlbGlmIGV4cG9ydGVkX3Byb3hpZXMgPT0gVHJ1ZSBhbmQgc3NsX2NvbnRleHQgaXMgTm9uZToKKyAgICAgICAgICAgIG9wZW5lciA9IHVybGxpYjIuYnVpbGRfb3BlbmVyKHVybGxpYjIuUHJveHlIYW5kbGVyLCBDYWNoZUhUVFBIYW5kbGVyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3BlbmVyID0gdXJsbGliMi5idWlsZF9vcGVuZXIoQ2FjaGVIVFRQSGFuZGxlcikKKworICAgICAgICB1cmxsaWIyLlJlcXVlc3QuZ2V0X21ldGhvZCA9IGhlYWRfbWV0aG9kCisgICAgICAgIHVybGxpYjIuaW5zdGFsbF9vcGVuZXIob3BlbmVyKQorCisgICAgICAgIHVyaSA9IHVkLnVybC5zcGxpdCgiOyIpWzBdCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdXJsbGliMi51cmxvcGVuKHVyaSkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgX3BhcnNlX3BhdGgoc2VsZiwgcmVnZXgsIHMpOgorICAgICAgICAiIiIKKyAgICAgICAgRmluZCBhbmQgZ3JvdXAgbmFtZSwgdmVyc2lvbiBhbmQgYXJjaGl2ZSB0eXBlIGluIHRoZSBnaXZlbiBzdHJpbmcgcworICAgICAgICAiIiIKKworICAgICAgICBtID0gcmVnZXguc2VhcmNoKHMpCisgICAgICAgIGlmIG06CisgICAgICAgICAgICBwbmFtZSA9ICcnCisgICAgICAgICAgICBwdmVyID0gJycKKyAgICAgICAgICAgIHB0eXBlID0gJycKKworICAgICAgICAgICAgbWRpY3QgPSBtLmdyb3VwZGljdCgpCisgICAgICAgICAgICBpZiAnbmFtZScgaW4gbWRpY3Qua2V5cygpOgorICAgICAgICAgICAgICAgIHBuYW1lID0gbWRpY3RbJ25hbWUnXQorICAgICAgICAgICAgaWYgJ3B2ZXInIGluIG1kaWN0LmtleXMoKToKKyAgICAgICAgICAgICAgICBwdmVyID0gbWRpY3RbJ3B2ZXInXQorICAgICAgICAgICAgaWYgJ3R5cGUnIGluIG1kaWN0LmtleXMoKToKKyAgICAgICAgICAgICAgICBwdHlwZSA9IG1kaWN0Wyd0eXBlJ10KKworICAgICAgICAgICAgYmIuZGVidWcoMywgIl9wYXJzZV9wYXRoOiAlcywgJXMsICVzIiAlIChwbmFtZSwgcHZlciwgcHR5cGUpKQorCisgICAgICAgICAgICByZXR1cm4gKHBuYW1lLCBwdmVyLCBwdHlwZSkKKworICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIF9tb2RlbGF0ZV92ZXJzaW9uKHNlbGYsIHZlcnNpb24pOgorICAgICAgICBpZiB2ZXJzaW9uWzBdIGluIFsnLicsICctJ106CisgICAgICAgICAgICBpZiB2ZXJzaW9uWzFdLmlzZGlnaXQoKToKKyAgICAgICAgICAgICAgICB2ZXJzaW9uID0gdmVyc2lvblsxXSArIHZlcnNpb25bMF0gKyB2ZXJzaW9uWzI6bGVuKHZlcnNpb24pXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB2ZXJzaW9uID0gdmVyc2lvblsxOmxlbih2ZXJzaW9uKV0KKworICAgICAgICB2ZXJzaW9uID0gcmUuc3ViKCctJywgJy4nLCB2ZXJzaW9uKQorICAgICAgICB2ZXJzaW9uID0gcmUuc3ViKCdfJywgJy4nLCB2ZXJzaW9uKQorICAgICAgICB2ZXJzaW9uID0gcmUuc3ViKCcocmMpKycsICcuMTAwMC4nLCB2ZXJzaW9uKQorICAgICAgICB2ZXJzaW9uID0gcmUuc3ViKCcoYmV0YSkrJywgJy4xMDAuJywgdmVyc2lvbikKKyAgICAgICAgdmVyc2lvbiA9IHJlLnN1YignKGFscGhhKSsnLCAnLjEwLicsIHZlcnNpb24pCisgICAgICAgIGlmIHZlcnNpb25bMF0gPT0gJ3YnOgorICAgICAgICAgICAgdmVyc2lvbiA9IHZlcnNpb25bMTpsZW4odmVyc2lvbildCisgICAgICAgIHJldHVybiB2ZXJzaW9uCisKKyAgICBkZWYgX3ZlcmNtcChzZWxmLCBvbGQsIG5ldyk6CisgICAgICAgICIiIgorICAgICAgICBDaGVjayB3aGV0aGVyICduZXcnIGlzIG5ld2VyIHRoYW4gJ29sZCcgdmVyc2lvbi4gV2UgdXNlIGV4aXN0aW5nIHZlcmNtcCgpIGZvciB0aGUKKyAgICAgICAgcHVycG9zZS4gUEUgaXMgY2xlYXJlZCBpbiBjb21wYXJpc29uIGFzIGl0J3Mgbm90IGZvciBidWlsZCwgYW5kIFBSIGlzIGNsZWFyZWQgdG9vCisgICAgICAgIGZvciBzaW1wbGljaXR5IGFzIGl0J3Mgc29tZWhvdyBkaWZmaWN1bHQgdG8gZ2V0IGZyb20gdmFyaW91cyB1cHN0cmVhbSBmb3JtYXQKKyAgICAgICAgIiIiCisKKyAgICAgICAgKG9sZHBuLCBvbGRwdiwgb2xkc3VmZml4KSA9IG9sZAorICAgICAgICAobmV3cG4sIG5ld3B2LCBuZXdzdWZmaXgpID0gbmV3CisKKyAgICAgICAgIiIiCisgICAgICAgIENoZWNrIGZvciBhIG5ldyBzdWZmaXggdHlwZSB0aGF0IHdlIGhhdmUgbmV2ZXIgaGVhcmQgb2YgYmVmb3JlCisgICAgICAgICIiIgorICAgICAgICBpZiAobmV3c3VmZml4KToKKyAgICAgICAgICAgIG0gPSBzZWxmLnN1ZmZpeF9yZWdleF9jb21wLnNlYXJjaChuZXdzdWZmaXgpCisgICAgICAgICAgICBpZiBub3QgbToKKyAgICAgICAgICAgICAgICBiYi53YXJuKCIlcyBoYXMgYSBwb3NzaWJsZSB1bmtub3duIHN1ZmZpeDogJXMiICUgKG5ld3BuLCBuZXdzdWZmaXgpKQorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgICIiIgorICAgICAgICBOb3Qgb3VyIHBhY2thZ2Ugc28gaWdub3JlIGl0CisgICAgICAgICIiIgorICAgICAgICBpZiBvbGRwbiAhPSBuZXdwbjoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIG9sZHB2ID0gc2VsZi5fbW9kZWxhdGVfdmVyc2lvbihvbGRwdikKKyAgICAgICAgbmV3cHYgPSBzZWxmLl9tb2RlbGF0ZV92ZXJzaW9uKG5ld3B2KQorCisgICAgICAgIHJldHVybiBiYi51dGlscy52ZXJjbXAoKCIwIiwgb2xkcHYsICIiKSwgKCIwIiwgbmV3cHYsICIiKSkKKworICAgIGRlZiBfZmV0Y2hfaW5kZXgoc2VsZiwgdXJpLCB1ZCwgZCk6CisgICAgICAgICIiIgorICAgICAgICBSdW4gZmV0Y2ggY2hlY2tzdGF0dXMgdG8gZ2V0IGRpcmVjdG9yeSBpbmZvcm1hdGlvbgorICAgICAgICAiIiIKKyAgICAgICAgZiA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgpCisKKyAgICAgICAgYWdlbnQgPSAiTW96aWxsYS81LjAgKFgxMTsgVTsgTGludXggaTY4NjsgZW4tVVM7IHJ2OjEuOS4yLjEyKSBHZWNrby8yMDEwMTAyNyBVYnVudHUvOS4xMCAoa2FybWljKSBGaXJlZm94LzMuNi4xMiIKKyAgICAgICAgZmV0Y2hjbWQgPSBzZWxmLmJhc2VjbWQKKyAgICAgICAgZmV0Y2hjbWQgKz0gIiAtTyAiICsgZi5uYW1lICsgIiAtLXVzZXItYWdlbnQ9JyIgKyBhZ2VudCArICInICciICsgdXJpICsgIiciCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX3J1bndnZXQodWQsIGQsIGZldGNoY21kLCBUcnVlKQorICAgICAgICAgICAgZmV0Y2hyZXN1bHQgPSBmLnJlYWQoKQorICAgICAgICBleGNlcHQgYmIuZmV0Y2gyLkJCRmV0Y2hFeGNlcHRpb246CisgICAgICAgICAgICBmZXRjaHJlc3VsdCA9ICIiCisKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHJldHVybiBmZXRjaHJlc3VsdAorCisgICAgZGVmIF9jaGVja19sYXRlc3RfdmVyc2lvbihzZWxmLCB1cmwsIHBhY2thZ2UsIHBhY2thZ2VfcmVnZXgsIGN1cnJlbnRfdmVyc2lvbiwgdWQsIGQpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBhIHBhY2thZ2UgaW5zaWRlIGEgZ2l2ZW4gZGlyZWN0b3J5IHBhdGgKKyAgICAgICAgSWYgZXJyb3Igb3Igbm8gdmVyc2lvbiwgcmV0dXJuICIiCisgICAgICAgICIiIgorICAgICAgICB2YWxpZCA9IDAKKyAgICAgICAgdmVyc2lvbiA9IFsnJywgJycsICcnXQorCisgICAgICAgIGJiLmRlYnVnKDMsICJWZXJzaW9uVVJMOiAlcyIgJSAodXJsKSkKKyAgICAgICAgc291cCA9IEJlYXV0aWZ1bFNvdXAoc2VsZi5fZmV0Y2hfaW5kZXgodXJsLCB1ZCwgZCkpCisgICAgICAgIGlmIG5vdCBzb3VwOgorICAgICAgICAgICAgYmIuZGVidWcoMywgIioqKiAlcyBOTyBTT1VQIiAlICh1cmwpKQorICAgICAgICAgICAgcmV0dXJuICIiCisKKyAgICAgICAgZm9yIGxpbmUgaW4gc291cC5maW5kX2FsbCgnYScsIGhyZWY9VHJ1ZSk6CisgICAgICAgICAgICBiYi5kZWJ1ZygzLCAibGluZVsnaHJlZiddID0gJyVzJyIgJSAobGluZVsnaHJlZiddKSkKKyAgICAgICAgICAgIGJiLmRlYnVnKDMsICJsaW5lID0gJyVzJyIgJSAoc3RyKGxpbmUpKSkKKworICAgICAgICAgICAgbmV3dmVyID0gc2VsZi5fcGFyc2VfcGF0aChwYWNrYWdlX3JlZ2V4LCBsaW5lWydocmVmJ10pCisgICAgICAgICAgICBpZiBub3QgbmV3dmVyOgorICAgICAgICAgICAgICAgIG5ld3ZlciA9IHNlbGYuX3BhcnNlX3BhdGgocGFja2FnZV9yZWdleCwgc3RyKGxpbmUpKQorCisgICAgICAgICAgICBpZiBuZXd2ZXI6CisgICAgICAgICAgICAgICAgYmIuZGVidWcoMywgIlVwc3RyZWFtIHZlcnNpb24gZm91bmQ6ICVzIiAlIG5ld3ZlclsxXSkKKyAgICAgICAgICAgICAgICBpZiB2YWxpZCA9PSAwOgorICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gbmV3dmVyCisgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gMQorICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5fdmVyY21wKHZlcnNpb24sIG5ld3ZlcikgPCAwOgorICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gbmV3dmVyCisgICAgICAgICAgICAgICAgCisgICAgICAgIHB1cHZlciA9IHJlLnN1YignXycsICcuJywgdmVyc2lvblsxXSkKKworICAgICAgICBiYi5kZWJ1ZygzLCAiKioqICVzIC0+IFVwc3RyZWFtVmVyc2lvbiA9ICVzIChDdXJyZW50VmVyc2lvbiA9ICVzKSIgJQorICAgICAgICAgICAgICAgIChwYWNrYWdlLCBwdXB2ZXIgb3IgIk4vQSIsIGN1cnJlbnRfdmVyc2lvblsxXSkpCisKKyAgICAgICAgaWYgdmFsaWQ6CisgICAgICAgICAgICByZXR1cm4gcHVwdmVyCisKKyAgICAgICAgcmV0dXJuICIiCisKKyAgICBkZWYgX2NoZWNrX2xhdGVzdF92ZXJzaW9uX2J5X2RpcihzZWxmLCBkaXJ2ZXIsIHBhY2thZ2UsIHBhY2thZ2VfcmVnZXgsCisgICAgICAgICAgICBjdXJyZW50X3ZlcnNpb24sIHVkLCBkKToKKyAgICAgICAgIiIiCisgICAgICAgICAgICBTY2FuIGV2ZXJ5IGRpcmVjdG9yeSBpbiBvcmRlciB0byBnZXQgdXBzdHJlYW0gdmVyc2lvbi4KKyAgICAgICAgIiIiCisgICAgICAgIHZlcnNpb25fZGlyID0gWycnLCAnJywgJyddCisgICAgICAgIHZlcnNpb24gPSBbJycsICcnLCAnJ10KKworICAgICAgICBkaXJ2ZXJfcmVnZXggPSByZS5jb21waWxlKCIoXEQqKSgoXGQrW1wuXC1fXSkrKFxkKykpIikKKyAgICAgICAgcyA9IGRpcnZlcl9yZWdleC5zZWFyY2goZGlydmVyKQorICAgICAgICBpZiBzOgorICAgICAgICAgICAgdmVyc2lvbl9kaXJbMV0gPSBzLmdyb3VwKDIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB2ZXJzaW9uX2RpclsxXSA9IGRpcnZlcgorCisgICAgICAgIGRpcnNfdXJpID0gYmIuZmV0Y2guZW5jb2RldXJsKFt1ZC50eXBlLCB1ZC5ob3N0LAorICAgICAgICAgICAgICAgIHVkLnBhdGguc3BsaXQoZGlydmVyKVswXSwgdWQudXNlciwgdWQucHN3ZCwge31dKQorICAgICAgICBiYi5kZWJ1ZygzLCAiRGlyVVJMOiAlcywgJXMiICUgKGRpcnNfdXJpLCBwYWNrYWdlKSkKKworICAgICAgICBzb3VwID0gQmVhdXRpZnVsU291cChzZWxmLl9mZXRjaF9pbmRleChkaXJzX3VyaSwgdWQsIGQpKQorICAgICAgICBpZiBub3Qgc291cDoKKyAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uWzFdCisKKyAgICAgICAgZm9yIGxpbmUgaW4gc291cC5maW5kX2FsbCgnYScsIGhyZWY9VHJ1ZSk6CisgICAgICAgICAgICBzID0gZGlydmVyX3JlZ2V4LnNlYXJjaChsaW5lWydocmVmJ10uc3RyaXAoIi8iKSkKKyAgICAgICAgICAgIGlmIHM6CisgICAgICAgICAgICAgICAgdmVyc2lvbl9kaXJfbmV3ID0gWycnLCBzLmdyb3VwKDIpLCAnJ10KKyAgICAgICAgICAgICAgICBpZiBzZWxmLl92ZXJjbXAodmVyc2lvbl9kaXIsIHZlcnNpb25fZGlyX25ldykgPD0gMDoKKyAgICAgICAgICAgICAgICAgICAgZGlydmVyX25ldyA9IHMuZ3JvdXAoMSkgKyBzLmdyb3VwKDIpCisgICAgICAgICAgICAgICAgICAgIHBhdGggPSB1ZC5wYXRoLnJlcGxhY2UoZGlydmVyLCBkaXJ2ZXJfbmV3LCBUcnVlKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAuc3BsaXQocGFja2FnZSlbMF0KKyAgICAgICAgICAgICAgICAgICAgdXJpID0gYmIuZmV0Y2guZW5jb2RldXJsKFt1ZC50eXBlLCB1ZC5ob3N0LCBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgdWQudXNlciwgdWQucHN3ZCwge31dKQorCisgICAgICAgICAgICAgICAgICAgIHB1cHZlciA9IHNlbGYuX2NoZWNrX2xhdGVzdF92ZXJzaW9uKHVyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlLCBwYWNrYWdlX3JlZ2V4LCBjdXJyZW50X3ZlcnNpb24sIHVkLCBkKQorICAgICAgICAgICAgICAgICAgICBpZiBwdXB2ZXI6CisgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uWzFdID0gcHVwdmVyCisKKyAgICAgICAgICAgICAgICAgICAgdmVyc2lvbl9kaXIgPSB2ZXJzaW9uX2Rpcl9uZXcKKworICAgICAgICByZXR1cm4gdmVyc2lvblsxXQorCisgICAgZGVmIF9pbml0X3JlZ2V4ZXMoc2VsZiwgcGFja2FnZSwgdWQsIGQpOgorICAgICAgICAiIiIKKyAgICAgICAgTWF0Y2ggYXMgbWFueSBwYXR0ZXJucyBhcyBwb3NzaWJsZSBzdWNoIGFzOgorICAgICAgICAgICAgICAgIGdub21lLWNvbW1vbi0yLjIwLjAudGFyLmd6IChtb3N0IGNvbW1vbiBmb3JtYXQpCisgICAgICAgICAgICAgICAgZ3RrKy0yLjkwLjEudGFyLmd6CisgICAgICAgICAgICAgICAgeGY4Ni1pbnB1dC1zeW5hcHRpY3MtMTIuNi45LnRhci5negorICAgICAgICAgICAgICAgIGRyaTJwcm90by0yLjMudGFyLmd6CisgICAgICAgICAgICAgICAgYmxrdG9vbF80Lm9yaWcudGFyLmd6CisgICAgICAgICAgICAgICAgbGliaWQzdGFnLTAuMTUuMWIudGFyLmd6CisgICAgICAgICAgICAgICAgdW56aXA1NTIudGFyLmd6CisgICAgICAgICAgICAgICAgaWN1NGMtM182LXNyYy50Z3oKKyAgICAgICAgICAgICAgICBnZW5leHQyZnNfMS4zLm9yaWcudGFyLmd6CisgICAgICAgICAgICAgICAgZ3N0LWZsdWVuZG8tbXAzCisgICAgICAgICIiIgorICAgICAgICAjIG1hdGNoIG1vc3QgcGF0dGVybnMgd2hpY2ggdXNlcyAiLSIgYXMgc2VwYXJhdG9yIHRvIHZlcnNpb24gZGlnaXRzCisgICAgICAgIHBuX3ByZWZpeDEgPSAiW2EtekEtWl1bYS16QS1aMC05XSooWy1fXVthLXpBLVpdXHcrKSpcKz9bLV9dIgorICAgICAgICAjIGEgbG9vc2UgcGF0dGVybiBzdWNoIGFzIGZvciB1bnppcDU1Mi50YXIuZ3oKKyAgICAgICAgcG5fcHJlZml4MiA9ICJbYS16QS1aXSsiCisgICAgICAgICMgYSBsb29zZSBwYXR0ZXJuIHN1Y2ggYXMgZm9yIDgwMzI1LXF1aWNreS0wLjQudGFyLmd6CisgICAgICAgIHBuX3ByZWZpeDMgPSAiWzAtOV0rWy1dP1thLXpBLVpdKyIKKyAgICAgICAgIyBTYXZlIHRoZSBQYWNrYWdlIE5hbWUgKHBuKSBSZWdleCBmb3IgdXNlIGxhdGVyCisgICAgICAgIHBuX3JlZ2V4ID0gIiglc3wlc3wlcykiICUgKHBuX3ByZWZpeDEsIHBuX3ByZWZpeDIsIHBuX3ByZWZpeDMpCisKKyAgICAgICAgIyBtYXRjaCB2ZXJzaW9uCisgICAgICAgIHB2ZXJfcmVnZXggPSAiKChbQS1aXSpcZCtbYS16QS1aXSpbXC5cLV9dKikrKSIKKworICAgICAgICAjIG1hdGNoIGFyY2gKKyAgICAgICAgcGFyY2hfcmVnZXggPSAiLXNvdXJjZXxfYWxsXyIKKworICAgICAgICAjIHNyYy5ycG0gZXh0ZW5zaW9uIHdhcyBhZGRlZCBvbmx5IGZvciBycG0gcGFja2FnZS4gQ2FuIGJlIHJlbW92ZWQgaWYgdGhlIHJwbQorICAgICAgICAjIHBhY2thZ2VkIHdpbGwgYWx3YXlzIGJlIGNvbnNpZGVyZWQgYXMgaGF2aW5nIHRvIGJlIG1hbnVhbGx5IHVwZ3JhZGVkCisgICAgICAgIHBzdWZmaXhfcmVnZXggPSAiKHRhclwuZ3p8dGd6fHRhclwuYnoyfHppcHx4enxycG18YnoyfG9yaWdcLnRhclwuZ3p8dGFyXC54enxzcmNcLnRhclwuZ3p8c3JjXC50Z3p8c3ZuclxkK1wudGFyXC5iejJ8c3RhYmxlXC50YXJcLmd6fHNyY1wucnBtKSIKKworICAgICAgICAjIG1hdGNoIG5hbWUsIHZlcnNpb24gYW5kIGFyY2hpdmUgdHlwZSBvZiBhIHBhY2thZ2UKKyAgICAgICAgcGFja2FnZV9yZWdleF9jb21wID0gcmUuY29tcGlsZSgiKD9QPG5hbWU+JXM/XC4/dj8pKD9QPHB2ZXI+JXMpKD9QPGFyY2g+JXMpP1tcLi1dKD9QPHR5cGU+JXMkKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChwbl9yZWdleCwgcHZlcl9yZWdleCwgcGFyY2hfcmVnZXgsIHBzdWZmaXhfcmVnZXgpKQorICAgICAgICBzZWxmLnN1ZmZpeF9yZWdleF9jb21wID0gcmUuY29tcGlsZShwc3VmZml4X3JlZ2V4KQorCisgICAgICAgICMgY29tcGlsZSByZWdleCwgY2FuIGJlIHNwZWNpZmljIGJ5IHBhY2thZ2Ugb3IgZ2VuZXJpYyByZWdleAorICAgICAgICBwbl9yZWdleCA9IGQuZ2V0VmFyKCdSRUdFWCcsIFRydWUpCisgICAgICAgIGlmIHBuX3JlZ2V4OgorICAgICAgICAgICAgcGFja2FnZV9jdXN0b21fcmVnZXhfY29tcCA9IHJlLmNvbXBpbGUocG5fcmVnZXgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB2ZXJzaW9uID0gc2VsZi5fcGFyc2VfcGF0aChwYWNrYWdlX3JlZ2V4X2NvbXAsIHBhY2thZ2UpCisgICAgICAgICAgICBpZiB2ZXJzaW9uOgorICAgICAgICAgICAgICAgIHBhY2thZ2VfY3VzdG9tX3JlZ2V4X2NvbXAgPSByZS5jb21waWxlKAorICAgICAgICAgICAgICAgICAgICAiKD9QPG5hbWU+JXMpKD9QPHB2ZXI+JXMpKD9QPGFyY2g+JXMpP1tcLi1dKD9QPHR5cGU+JXMpIiAlCisgICAgICAgICAgICAgICAgICAgIChyZS5lc2NhcGUodmVyc2lvblswXSksIHB2ZXJfcmVnZXgsIHBhcmNoX3JlZ2V4LCBwc3VmZml4X3JlZ2V4KSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGFja2FnZV9jdXN0b21fcmVnZXhfY29tcCA9IE5vbmUKKworICAgICAgICByZXR1cm4gcGFja2FnZV9jdXN0b21fcmVnZXhfY29tcAorCisgICAgZGVmIGxhdGVzdF92ZXJzaW9uc3RyaW5nKHNlbGYsIHVkLCBkKToKKyAgICAgICAgIiIiCisgICAgICAgIE1hbmlwdWxhdGUgdGhlIFVSTCBhbmQgdHJ5IHRvIG9idGFpbiB0aGUgbGF0ZXN0IHBhY2thZ2UgdmVyc2lvbgorCisgICAgICAgIHNhbml0eSBjaGVjayB0byBlbnN1cmUgc2FtZSBuYW1lIGFuZCB0eXBlLgorICAgICAgICAiIiIKKyAgICAgICAgcGFja2FnZSA9IHVkLnBhdGguc3BsaXQoIi8iKVstMV0KKyAgICAgICAgY3VycmVudF92ZXJzaW9uID0gWycnLCBkLmdldFZhcignUFYnLCBUcnVlKSwgJyddCisKKyAgICAgICAgIiIicG9zc2libGUgdG8gaGF2ZSBubyB2ZXJzaW9uIGluIHBrZyBuYW1lLCBzdWNoIGFzIHNwZWN0cnVtLWZ3IiIiCisgICAgICAgIGlmIG5vdCByZS5zZWFyY2goIlxkKyIsIHBhY2thZ2UpOgorICAgICAgICAgICAgY3VycmVudF92ZXJzaW9uWzFdID0gcmUuc3ViKCdfJywgJy4nLCBjdXJyZW50X3ZlcnNpb25bMV0pCisgICAgICAgICAgICBjdXJyZW50X3ZlcnNpb25bMV0gPSByZS5zdWIoJy0nLCAnLicsIGN1cnJlbnRfdmVyc2lvblsxXSkKKyAgICAgICAgICAgIHJldHVybiAoY3VycmVudF92ZXJzaW9uWzFdLCAnJykKKworICAgICAgICBwYWNrYWdlX3JlZ2V4ID0gc2VsZi5faW5pdF9yZWdleGVzKHBhY2thZ2UsIHVkLCBkKQorICAgICAgICBpZiBwYWNrYWdlX3JlZ2V4IGlzIE5vbmU6CisgICAgICAgICAgICBiYi53YXJuKCJsYXRlc3RfdmVyc2lvbnN0cmluZzogcGFja2FnZSAlcyBkb24ndCBtYXRjaCBwYXR0ZXJuIiAlIChwYWNrYWdlKSkKKyAgICAgICAgICAgIHJldHVybiAoJycsICcnKQorICAgICAgICBiYi5kZWJ1ZygzLCAibGF0ZXN0X3ZlcnNpb25zdHJpbmcsIHJlZ2V4OiAlcyIgJSAocGFja2FnZV9yZWdleC5wYXR0ZXJuKSkKKworICAgICAgICB1cmkgPSAiIgorICAgICAgICByZWdleF91cmkgPSBkLmdldFZhcigiUkVHRVhfVVJJIiwgVHJ1ZSkKKyAgICAgICAgaWYgbm90IHJlZ2V4X3VyaToKKyAgICAgICAgICAgIHBhdGggPSB1ZC5wYXRoLnNwbGl0KHBhY2thZ2UpWzBdCisKKyAgICAgICAgICAgICMgc2VhcmNoIGZvciB2ZXJzaW9uIG1hdGNoZXMgb24gZm9sZGVycyBpbnNpZGUgdGhlIHBhdGgsIGxpa2U6CisgICAgICAgICAgICAjICI1LjciIGluIGh0dHA6Ly9kb3dubG9hZC5nbm9tZS5vcmcvc291cmNlcy8ke1BOfS81LjcvJHtQTn0tJHtQVn0udGFyLmd6CisgICAgICAgICAgICBkaXJ2ZXJfcmVnZXggPSByZS5jb21waWxlKCIoP1A8ZGlydmVyPlteL10qKFxkK1wuKSpcZCsoWy1fXXJcZCspKikvIikKKyAgICAgICAgICAgIG0gPSBkaXJ2ZXJfcmVnZXguc2VhcmNoKHBhdGgpCisgICAgICAgICAgICBpZiBtOgorICAgICAgICAgICAgICAgIHBuID0gZC5nZXRWYXIoJ1BOJywgVHJ1ZSkKKyAgICAgICAgICAgICAgICBkaXJ2ZXIgPSBtLmdyb3VwKCdkaXJ2ZXInKQorCisgICAgICAgICAgICAgICAgZGlydmVyX3BuX3JlZ2V4ID0gcmUuY29tcGlsZSgiJXNcZD8iICUgKHJlLmVzY2FwZShwbikpKQorICAgICAgICAgICAgICAgIGlmIG5vdCBkaXJ2ZXJfcG5fcmVnZXguc2VhcmNoKGRpcnZlcik6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoc2VsZi5fY2hlY2tfbGF0ZXN0X3ZlcnNpb25fYnlfZGlyKGRpcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2UsIHBhY2thZ2VfcmVnZXgsIGN1cnJlbnRfdmVyc2lvbiwgdWQsIGQpLCAnJykKKworICAgICAgICAgICAgdXJpID0gYmIuZmV0Y2guZW5jb2RldXJsKFt1ZC50eXBlLCB1ZC5ob3N0LCBwYXRoLCB1ZC51c2VyLCB1ZC5wc3dkLCB7fV0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB1cmkgPSByZWdleF91cmkKKworICAgICAgICByZXR1cm4gKHNlbGYuX2NoZWNrX2xhdGVzdF92ZXJzaW9uKHVyaSwgcGFja2FnZSwgcGFja2FnZV9yZWdleCwKKyAgICAgICAgICAgICAgICBjdXJyZW50X3ZlcnNpb24sIHVkLCBkKSwgJycpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9tYWluLnB5IGIvYml0YmFrZS9saWIvYmIvbWFpbi5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44NzYyZjcyCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvbWFpbi5weQpAQCAtMCwwICsxLDQyNyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIworIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgIENocmlzIExhcnNvbgorIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgIFBoaWwgQmx1bmRlbGwKKyMgQ29weXJpZ2h0IChDKSAyMDAzIC0gMjAwNSBNaWNoYWVsICdNaWNrZXknIExhdWVyCisjIENvcHlyaWdodCAoQykgMjAwNSAgICAgICAgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIKKyMgQ29weXJpZ2h0IChDKSAyMDA1ICAgICAgICBST0FEIEdtYkgKKyMgQ29weXJpZ2h0IChDKSAyMDA2ICAgICAgICBSaWNoYXJkIFB1cmRpZQorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9wdHBhcnNlCitpbXBvcnQgd2FybmluZ3MKKworaW1wb3J0IGJiCitmcm9tIGJiIGltcG9ydCBldmVudAoraW1wb3J0IGJiLm1zZworZnJvbSBiYiBpbXBvcnQgY29va2VyCitmcm9tIGJiIGltcG9ydCB1aQorZnJvbSBiYiBpbXBvcnQgc2VydmVyCitmcm9tIGJiIGltcG9ydCBjb29rZXJkYXRhCisKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJCaXRCYWtlIikKKworY2xhc3MgQkJNYWluRXhjZXB0aW9uKEV4Y2VwdGlvbik6CisgICAgcGFzcworCitkZWYgcHJlc2VudF9vcHRpb25zKG9wdGlvbmxpc3QpOgorICAgIGlmIGxlbihvcHRpb25saXN0KSA+IDE6CisgICAgICAgIHJldHVybiAnIG9yICcuam9pbihbJywgJy5qb2luKG9wdGlvbmxpc3RbOi0xXSksIG9wdGlvbmxpc3RbLTFdXSkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gb3B0aW9ubGlzdFswXQorCitjbGFzcyBCaXRiYWtlSGVscEZvcm1hdHRlcihvcHRwYXJzZS5JbmRlbnRlZEhlbHBGb3JtYXR0ZXIpOgorICAgIGRlZiBmb3JtYXRfb3B0aW9uKHNlbGYsIG9wdGlvbik6CisgICAgICAgICMgV2UgbmVlZCB0byBkbyB0aGlzIGhlcmUgcmF0aGVyIHRoYW4gaW4gdGhlIHRleHQgd2Ugc3VwcGx5IHRvCisgICAgICAgICMgYWRkX29wdGlvbigpIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBjYWxsIGxpc3RfZXh0ZW5zaW9uX21vZHVsZXMoKQorICAgICAgICAjIG9uIGV2ZXJ5IGV4ZWN1dGlvbiAoc2luY2UgaXQgaW1wb3J0cyBhbGwgb2YgdGhlIG1vZHVsZXMpCisgICAgICAgICMgTm90ZSBhbHNvIHRoYXQgd2UgbW9kaWZ5IG9wdGlvbi5oZWxwIHJhdGhlciB0aGFuIHRoZSByZXR1cm5lZCB0ZXh0CisgICAgICAgICMgLSB0aGlzIGlzIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byByZS1mb3JtYXQgdGhlIHRleHQgb3Vyc2VsdmVzCisgICAgICAgIGlmIG9wdGlvbi5kZXN0ID09ICd1aSc6CisgICAgICAgICAgICB2YWxpZF91aXMgPSBsaXN0X2V4dGVuc2lvbl9tb2R1bGVzKGJiLnVpLCAnbWFpbicpCisgICAgICAgICAgICBvcHRpb24uaGVscCA9IG9wdGlvbi5oZWxwLnJlcGxhY2UoJ0BDSE9JQ0VTQCcsIHByZXNlbnRfb3B0aW9ucyh2YWxpZF91aXMpKQorICAgICAgICBlbGlmIG9wdGlvbi5kZXN0ID09ICdzZXJ2ZXJ0eXBlJzoKKyAgICAgICAgICAgIHZhbGlkX3NlcnZlcl90eXBlcyA9IGxpc3RfZXh0ZW5zaW9uX21vZHVsZXMoYmIuc2VydmVyLCAnQml0QmFrZVNlcnZlcicpCisgICAgICAgICAgICBvcHRpb24uaGVscCA9IG9wdGlvbi5oZWxwLnJlcGxhY2UoJ0BDSE9JQ0VTQCcsIHByZXNlbnRfb3B0aW9ucyh2YWxpZF9zZXJ2ZXJfdHlwZXMpKQorCisgICAgICAgIHJldHVybiBvcHRwYXJzZS5JbmRlbnRlZEhlbHBGb3JtYXR0ZXIuZm9ybWF0X29wdGlvbihzZWxmLCBvcHRpb24pCisKK2RlZiBsaXN0X2V4dGVuc2lvbl9tb2R1bGVzKHBrZywgY2hlY2thdHRyKToKKyAgICAiIiIKKyAgICBMaXN0cyBleHRlbnNpb24gbW9kdWxlcyBpbiBhIHNwZWNpZmljIFB5dGhvbiBwYWNrYWdlCisgICAgKGUuZy4gVUlzLCBzZXJ2ZXJzKS4gTk9URTogQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdpbGwgaW1wb3J0IGFsbCBvZiB0aGUKKyAgICBzdWJtb2R1bGVzIG9mIHRoZSBzcGVjaWZpZWQgbW9kdWxlIGluIG9yZGVyIHRvIGNoZWNrIGZvciB0aGUgc3BlY2lmaWVkCisgICAgYXR0cmlidXRlOyB0aGlzIGNhbiBoYXZlIHVudXN1YWwgc2lkZS1lZmZlY3RzLiBBcyBhIHJlc3VsdCwgdGhpcyBzaG91bGQKKyAgICBvbmx5IGJlIGNhbGxlZCB3aGVuIGRpc3BsYXlpbmcgaGVscCB0ZXh0IG9yIGVycm9yIG1lc3NhZ2VzLgorICAgIFBhcmFtZXRlcnM6CisgICAgICAgIHBrZzogcHJldmlvdXNseSBpbXBvcnRlZCBQeXRob24gcGFja2FnZSB0byBsaXN0CisgICAgICAgIGNoZWNrYXR0cjogYXR0cmlidXRlIHRvIGxvb2sgZm9yIGluIG1vZHVsZSB0byBkZXRlcm1pbmUgaWYgaXQncyB2YWxpZAorICAgICAgICAgICAgYXMgdGhlIHR5cGUgb2YgZXh0ZW5zaW9uIHlvdSBhcmUgbG9va2luZyBmb3IKKyAgICAiIiIKKyAgICBpbXBvcnQgcGtndXRpbAorICAgIHBrZ2RpciA9IG9zLnBhdGguZGlybmFtZShwa2cuX19maWxlX18pCisKKyAgICBtb2R1bGVzID0gW10KKyAgICBmb3IgXywgbW9kdWxlbmFtZSwgXyBpbiBwa2d1dGlsLml0ZXJfbW9kdWxlcyhbcGtnZGlyXSk6CisgICAgICAgIGlmIG9zLnBhdGguaXNkaXIob3MucGF0aC5qb2luKHBrZ2RpciwgbW9kdWxlbmFtZSkpOgorICAgICAgICAgICAgIyBpZ25vcmUgZGlyZWN0b3JpZXMKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1vZHVsZSA9IF9faW1wb3J0X18ocGtnLl9fbmFtZV9fLCBmcm9tbGlzdD1bbW9kdWxlbmFtZV0pCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICMgSWYgd2UgY2FuJ3QgaW1wb3J0IGl0LCBpdCdzIG5vdCB2YWxpZAorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgbW9kdWxlX2lmID0gZ2V0YXR0cihtb2R1bGUsIG1vZHVsZW5hbWUpCisgICAgICAgIGlmIGdldGF0dHIobW9kdWxlX2lmLCAnaGlkZGVuX2V4dGVuc2lvbicsIEZhbHNlKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIG5vdCBjaGVja2F0dHIgb3IgaGFzYXR0cihtb2R1bGVfaWYsIGNoZWNrYXR0cik6CisgICAgICAgICAgICBtb2R1bGVzLmFwcGVuZChtb2R1bGVuYW1lKQorICAgIHJldHVybiBtb2R1bGVzCisKK2RlZiBpbXBvcnRfZXh0ZW5zaW9uX21vZHVsZShwa2csIG1vZHVsZW5hbWUsIGNoZWNrYXR0cik6CisgICAgdHJ5OgorICAgICAgICAjIER5bmFtaWNhbGx5IGxvYWQgdGhlIFVJIGJhc2VkIG9uIHRoZSB1aSBuYW1lLiBBbHRob3VnaCB3ZQorICAgICAgICAjIHN1Z2dlc3QgYSBmaXhlZCBzZXQgdGhpcyBhbGxvd3MgeW91IHRvIGhhdmUgZmxleGliaWxpdHkgaW4gd2hpY2gKKyAgICAgICAgIyBvbmVzIGFyZSBhdmFpbGFibGUuCisgICAgICAgIG1vZHVsZSA9IF9faW1wb3J0X18ocGtnLl9fbmFtZV9fLCBmcm9tbGlzdCA9IFttb2R1bGVuYW1lXSkKKyAgICAgICAgcmV0dXJuIGdldGF0dHIobW9kdWxlLCBtb2R1bGVuYW1lKQorICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgcmFpc2UgQkJNYWluRXhjZXB0aW9uKCdGQVRBTDogVW5hYmxlIHRvIGltcG9ydCBleHRlbnNpb24gbW9kdWxlICIlcyIgZnJvbSAlcy4gVmFsaWQgZXh0ZW5zaW9uIG1vZHVsZXM6ICVzJyAlIChtb2R1bGVuYW1lLCBwa2cuX19uYW1lX18sIHByZXNlbnRfb3B0aW9ucyhsaXN0X2V4dGVuc2lvbl9tb2R1bGVzKHBrZywgY2hlY2thdHRyKSkpKQorCisKKyMgRGlzcGxheSBiaXRiYWtlL09FIHdhcm5pbmdzIHZpYSB0aGUgQml0QmFrZS5XYXJuaW5ncyBsb2dnZXIsIGlnbm9yaW5nIG90aGVycyIiIgord2FybmxvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJCaXRCYWtlLldhcm5pbmdzIikKK193YXJuaW5nc19zaG93d2FybmluZyA9IHdhcm5pbmdzLnNob3d3YXJuaW5nCitkZWYgX3Nob3d3YXJuaW5nKG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBmaWxlPU5vbmUsIGxpbmU9Tm9uZSk6CisgICAgaWYgZmlsZSBpcyBub3QgTm9uZToKKyAgICAgICAgaWYgX3dhcm5pbmdzX3Nob3d3YXJuaW5nIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgX3dhcm5pbmdzX3Nob3d3YXJuaW5nKG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBmaWxlLCBsaW5lKQorICAgIGVsc2U6CisgICAgICAgIHMgPSB3YXJuaW5ncy5mb3JtYXR3YXJuaW5nKG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vKQorICAgICAgICB3YXJubG9nLndhcm4ocykKKword2FybmluZ3Muc2hvd3dhcm5pbmcgPSBfc2hvd3dhcm5pbmcKK3dhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiKQord2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImRlZmF1bHQiLCBtb2R1bGU9Iig8c3RyaW5nPiR8KG9lfGJiKVwuKSIpCit3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgY2F0ZWdvcnk9UGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZykKK3dhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCBjYXRlZ29yeT1JbXBvcnRXYXJuaW5nKQord2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsIGNhdGVnb3J5PURlcHJlY2F0aW9uV2FybmluZywgbW9kdWxlPSI8c3RyaW5nPiQiKQord2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsIG1lc3NhZ2U9IldpdGgtc3RhdGVtZW50cyBub3cgZGlyZWN0bHkgc3VwcG9ydCBtdWx0aXBsZSBjb250ZXh0IG1hbmFnZXJzIikKKworY2xhc3MgQml0QmFrZUNvbmZpZ1BhcmFtZXRlcnMoY29va2VyZGF0YS5Db25maWdQYXJhbWV0ZXJzKToKKworICAgIGRlZiBwYXJzZUNvbW1hbmRMaW5lKHNlbGYsIGFyZ3Y9c3lzLmFyZ3YpOgorICAgICAgICBwYXJzZXIgPSBvcHRwYXJzZS5PcHRpb25QYXJzZXIoCisgICAgICAgICAgICBmb3JtYXR0ZXIgPSBCaXRiYWtlSGVscEZvcm1hdHRlcigpLAorICAgICAgICAgICAgdmVyc2lvbiA9ICJCaXRCYWtlIEJ1aWxkIFRvb2wgQ29yZSB2ZXJzaW9uICVzIiAlIGJiLl9fdmVyc2lvbl9fLAorICAgICAgICAgICAgdXNhZ2UgPSAiIiIlcHJvZyBbb3B0aW9uc10gW3JlY2lwZW5hbWUvdGFyZ2V0IHJlY2lwZTpkb190YXNrIC4uLl0KKworICAgIEV4ZWN1dGVzIHRoZSBzcGVjaWZpZWQgdGFzayAoZGVmYXVsdCBpcyAnYnVpbGQnKSBmb3IgYSBnaXZlbiBzZXQgb2YgdGFyZ2V0IHJlY2lwZXMgKC5iYiBmaWxlcykuCisgICAgSXQgaXMgYXNzdW1lZCB0aGVyZSBpcyBhIGNvbmYvYmJsYXllcnMuY29uZiBhdmFpbGFibGUgaW4gY3dkIG9yIGluIEJCUEFUSCB3aGljaAorICAgIHdpbGwgcHJvdmlkZSB0aGUgbGF5ZXIsIEJCRklMRVMgYW5kIG90aGVyIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uIiIiKQorCisgICAgICAgIHBhcnNlci5hZGRfb3B0aW9uKCItYiIsICItLWJ1aWxkZmlsZSIsIGhlbHAgPSAiRXhlY3V0ZSB0YXNrcyBmcm9tIGEgc3BlY2lmaWMgLmJiIHJlY2lwZSBkaXJlY3RseS4gV0FSTklORzogRG9lcyBub3QgaGFuZGxlIGFueSBkZXBlbmRlbmNpZXMgZnJvbSBvdGhlciByZWNpcGVzLiIsCisgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gInN0b3JlIiwgZGVzdCA9ICJidWlsZGZpbGUiLCBkZWZhdWx0ID0gTm9uZSkKKworICAgICAgICBwYXJzZXIuYWRkX29wdGlvbigiLWsiLCAiLS1jb250aW51ZSIsIGhlbHAgPSAiQ29udGludWUgYXMgbXVjaCBhcyBwb3NzaWJsZSBhZnRlciBhbiBlcnJvci4gV2hpbGUgdGhlIHRhcmdldCB0aGF0IGZhaWxlZCBhbmQgYW55dGhpbmcgZGVwZW5kaW5nIG9uIGl0IGNhbm5vdCBiZSBidWlsdCwgYXMgbXVjaCBhcyBwb3NzaWJsZSB3aWxsIGJlIGJ1aWx0IGJlZm9yZSBzdG9wcGluZy4iLAorICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9ICJzdG9yZV9mYWxzZSIsIGRlc3QgPSAiYWJvcnQiLCBkZWZhdWx0ID0gVHJ1ZSkKKworICAgICAgICBwYXJzZXIuYWRkX29wdGlvbigiLWEiLCAiLS10cnlhbHRjb25maWdzIiwgaGVscCA9ICJDb250aW51ZSB3aXRoIGJ1aWxkcyBieSB0cnlpbmcgdG8gdXNlIGFsdGVybmF0aXZlIHByb3ZpZGVycyB3aGVyZSBwb3NzaWJsZS4iLAorICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9ICJzdG9yZV90cnVlIiwgZGVzdCA9ICJ0cnlhbHRjb25maWdzIiwgZGVmYXVsdCA9IEZhbHNlKQorCisgICAgICAgIHBhcnNlci5hZGRfb3B0aW9uKCItZiIsICItLWZvcmNlIiwgaGVscCA9ICJGb3JjZSB0aGUgc3BlY2lmaWVkIHRhcmdldHMvdGFzayB0byBydW4gKGludmFsaWRhdGluZyBhbnkgZXhpc3Rpbmcgc3RhbXAgZmlsZSkuIiwKKyAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSAic3RvcmVfdHJ1ZSIsIGRlc3QgPSAiZm9yY2UiLCBkZWZhdWx0ID0gRmFsc2UpCisKKyAgICAgICAgcGFyc2VyLmFkZF9vcHRpb24oIi1jIiwgIi0tY21kIiwgaGVscCA9ICJTcGVjaWZ5IHRoZSB0YXNrIHRvIGV4ZWN1dGUuIFRoZSBleGFjdCBvcHRpb25zIGF2YWlsYWJsZSBkZXBlbmQgb24gdGhlIG1ldGFkYXRhLiBTb21lIGV4YW1wbGVzIG1pZ2h0IGJlICdjb21waWxlJyBvciAncG9wdWxhdGVfc3lzcm9vdCcgb3IgJ2xpc3R0YXNrcycgbWF5IGdpdmUgYSBsaXN0IG9mIHRoZSB0YXNrcyBhdmFpbGFibGUuIiwKKyAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSAic3RvcmUiLCBkZXN0ID0gImNtZCIpCisKKyAgICAgICAgcGFyc2VyLmFkZF9vcHRpb24oIi1DIiwgIi0tY2xlYXItc3RhbXAiLCBoZWxwID0gIkludmFsaWRhdGUgdGhlIHN0YW1wIGZvciB0aGUgc3BlY2lmaWVkIHRhc2sgc3VjaCBhcyAnY29tcGlsZScgYW5kIHRoZW4gcnVuIHRoZSBkZWZhdWx0IHRhc2sgZm9yIHRoZSBzcGVjaWZpZWQgdGFyZ2V0KHMpLiIsCisgICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9ICJzdG9yZSIsIGRlc3QgPSAiaW52YWxpZGF0ZV9zdGFtcCIpCisKKyAgICAgICAgcGFyc2VyLmFkZF9vcHRpb24oIi1yIiwgIi0tcmVhZCIsIGhlbHAgPSAiUmVhZCB0aGUgc3BlY2lmaWVkIGZpbGUgYmVmb3JlIGJpdGJha2UuY29uZi4iLAorICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9ICJhcHBlbmQiLCBkZXN0ID0gInByZWZpbGUiLCBkZWZhdWx0ID0gW10pCisKKyAgICAgICAgcGFyc2VyLmFkZF9vcHRpb24oIi1SIiwgIi0tcG9zdHJlYWQiLCBoZWxwID0gIlJlYWQgdGhlIHNwZWNpZmllZCBmaWxlIGFmdGVyIGJpdGJha2UuY29uZi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSAiYXBwZW5kIiwgZGVzdCA9ICJwb3N0ZmlsZSIsIGRlZmF1bHQgPSBbXSkKKworICAgICAgICBwYXJzZXIuYWRkX29wdGlvbigiLXYiLCAiLS12ZXJib3NlIiwgaGVscCA9ICJPdXRwdXQgbW9yZSBsb2cgbWVzc2FnZSBkYXRhIHRvIHRoZSB0ZXJtaW5hbC4iLAorICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9ICJzdG9yZV90cnVlIiwgZGVzdCA9ICJ2ZXJib3NlIiwgZGVmYXVsdCA9IEZhbHNlKQorCisgICAgICAgIHBhcnNlci5hZGRfb3B0aW9uKCItRCIsICItLWRlYnVnIiwgaGVscCA9ICJJbmNyZWFzZSB0aGUgZGVidWcgbGV2ZWwuIFlvdSBjYW4gc3BlY2lmeSB0aGlzIG1vcmUgdGhhbiBvbmNlLiIsCisgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gImNvdW50IiwgZGVzdD0iZGVidWciLCBkZWZhdWx0ID0gMCkKKworICAgICAgICBwYXJzZXIuYWRkX29wdGlvbigiLW4iLCAiLS1kcnktcnVuIiwgaGVscCA9ICJEb24ndCBleGVjdXRlLCBqdXN0IGdvIHRocm91Z2ggdGhlIG1vdGlvbnMuIiwKKyAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSAic3RvcmVfdHJ1ZSIsIGRlc3QgPSAiZHJ5X3J1biIsIGRlZmF1bHQgPSBGYWxzZSkKKworICAgICAgICBwYXJzZXIuYWRkX29wdGlvbigiLVMiLCAiLS1kdW1wLXNpZ25hdHVyZXMiLCBoZWxwID0gIkR1bXAgb3V0IHRoZSBzaWduYXR1cmUgY29uc3RydWN0aW9uIGluZm9ybWF0aW9uLCB3aXRoIG5vIHRhc2sgZXhlY3V0aW9uLiBUaGUgU0lHTkFUVVJFX0hBTkRMRVIgcGFyYW1ldGVyIGlzIHBhc3NlZCB0byB0aGUgaGFuZGxlci4gVHdvIGNvbW1vbiB2YWx1ZXMgYXJlIG5vbmUgYW5kIHByaW50ZGlmZiBidXQgdGhlIGhhbmRsZXIgbWF5IGRlZmluZSBtb3JlL2xlc3MuIG5vbmUgbWVhbnMgb25seSBkdW1wIHRoZSBzaWduYXR1cmUsIHByaW50ZGlmZiBtZWFucyBjb21wYXJlIHRoZSBkdW1wZWQgc2lnbmF0dXJlIHdpdGggdGhlIGNhY2hlZCBvbmUuIiwKKyAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSAiYXBwZW5kIiwgZGVzdCA9ICJkdW1wX3NpZ25hdHVyZXMiLCBkZWZhdWx0ID0gW10sIG1ldGF2YXI9IlNJR05BVFVSRV9IQU5ETEVSIikKKworICAgICAgICBwYXJzZXIuYWRkX29wdGlvbigiLXAiLCAiLS1wYXJzZS1vbmx5IiwgaGVscCA9ICJRdWl0IGFmdGVyIHBhcnNpbmcgdGhlIEJCIHJlY2lwZXMuIiwKKyAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSAic3RvcmVfdHJ1ZSIsIGRlc3QgPSAicGFyc2Vfb25seSIsIGRlZmF1bHQgPSBGYWxzZSkKKworICAgICAgICBwYXJzZXIuYWRkX29wdGlvbigiLXMiLCAiLS1zaG93LXZlcnNpb25zIiwgaGVscCA9ICJTaG93IGN1cnJlbnQgYW5kIHByZWZlcnJlZCB2ZXJzaW9ucyBvZiBhbGwgcmVjaXBlcy4iLAorICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9ICJzdG9yZV90cnVlIiwgZGVzdCA9ICJzaG93X3ZlcnNpb25zIiwgZGVmYXVsdCA9IEZhbHNlKQorCisgICAgICAgIHBhcnNlci5hZGRfb3B0aW9uKCItZSIsICItLWVudmlyb25tZW50IiwgaGVscCA9ICJTaG93IHRoZSBnbG9iYWwgb3IgcGVyLXJlY2lwZSBlbnZpcm9ubWVudCBjb21wbGV0ZSB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHdoZXJlIHZhcmlhYmxlcyB3ZXJlIHNldC9jaGFuZ2VkLiIsCisgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gInN0b3JlX3RydWUiLCBkZXN0ID0gInNob3dfZW52aXJvbm1lbnQiLCBkZWZhdWx0ID0gRmFsc2UpCisKKyAgICAgICAgcGFyc2VyLmFkZF9vcHRpb24oIi1nIiwgIi0tZ3JhcGh2aXoiLCBoZWxwID0gIlNhdmUgZGVwZW5kZW5jeSB0cmVlIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHRhcmdldHMgaW4gdGhlIGRvdCBzeW50YXguIiwKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gInN0b3JlX3RydWUiLCBkZXN0ID0gImRvdF9ncmFwaCIsIGRlZmF1bHQgPSBGYWxzZSkKKworICAgICAgICBwYXJzZXIuYWRkX29wdGlvbigiLUkiLCAiLS1pZ25vcmUtZGVwcyIsIGhlbHAgPSAiIiJBc3N1bWUgdGhlc2UgZGVwZW5kZW5jaWVzIGRvbid0IGV4aXN0IGFuZCBhcmUgYWxyZWFkeSBwcm92aWRlZCAoZXF1aXZhbGVudCB0byBBU1NVTUVfUFJPVklERUQpLiBVc2VmdWwgdG8gbWFrZSBkZXBlbmRlbmN5IGdyYXBocyBtb3JlIGFwcGVhbGluZyIiIiwKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gImFwcGVuZCIsIGRlc3QgPSAiZXh0cmFfYXNzdW1lX3Byb3ZpZGVkIiwgZGVmYXVsdCA9IFtdKQorCisgICAgICAgIHBhcnNlci5hZGRfb3B0aW9uKCItbCIsICItLWxvZy1kb21haW5zIiwgaGVscCA9ICIiIlNob3cgZGVidWcgbG9nZ2luZyBmb3IgdGhlIHNwZWNpZmllZCBsb2dnaW5nIGRvbWFpbnMiIiIsCisgICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9ICJhcHBlbmQiLCBkZXN0ID0gImRlYnVnX2RvbWFpbnMiLCBkZWZhdWx0ID0gW10pCisKKyAgICAgICAgcGFyc2VyLmFkZF9vcHRpb24oIi1QIiwgIi0tcHJvZmlsZSIsIGhlbHAgPSAiUHJvZmlsZSB0aGUgY29tbWFuZCBhbmQgc2F2ZSByZXBvcnRzLiIsCisgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gInN0b3JlX3RydWUiLCBkZXN0ID0gInByb2ZpbGUiLCBkZWZhdWx0ID0gRmFsc2UpCisKKyAgICAgICAgZW52X3VpID0gb3MuZW52aXJvbi5nZXQoJ0JJVEJBS0VfVUknLCBOb25lKQorICAgICAgICBkZWZhdWx0X3VpID0gZW52X3VpIG9yICdrbm90dHknCisgICAgICAgICMgQENIT0lDRVNAIGlzIHN1YnN0aXR1dGVkIG91dCBieSBCaXRiYWtlSGVscEZvcm1hdHRlciBhYm92ZQorICAgICAgICBwYXJzZXIuYWRkX29wdGlvbigiLXUiLCAiLS11aSIsIGhlbHAgPSAiVGhlIHVzZXIgaW50ZXJmYWNlIHRvIHVzZSAoQENIT0lDRVNAIC0gZGVmYXVsdCAlZGVmYXVsdCkuIiwKKyAgICAgICAgICAgICAgICAgICBhY3Rpb249InN0b3JlIiwgZGVzdD0idWkiLCBkZWZhdWx0PWRlZmF1bHRfdWkpCisKKyAgICAgICAgIyBAQ0hPSUNFU0AgaXMgc3Vic3RpdHV0ZWQgb3V0IGJ5IEJpdGJha2VIZWxwRm9ybWF0dGVyIGFib3ZlCisgICAgICAgIHBhcnNlci5hZGRfb3B0aW9uKCItdCIsICItLXNlcnZlcnR5cGUiLCBoZWxwID0gIkNob29zZSB3aGljaCBzZXJ2ZXIgdHlwZSB0byB1c2UgKEBDSE9JQ0VTQCAtIGRlZmF1bHQgJWRlZmF1bHQpLiIsCisgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gInN0b3JlIiwgZGVzdCA9ICJzZXJ2ZXJ0eXBlIiwgZGVmYXVsdCA9ICJwcm9jZXNzIikKKworICAgICAgICBwYXJzZXIuYWRkX29wdGlvbigiIiwgIi0tdG9rZW4iLCBoZWxwID0gIlNwZWNpZnkgdGhlIGNvbm5lY3Rpb24gdG9rZW4gdG8gYmUgdXNlZCB3aGVuIGNvbm5lY3RpbmcgdG8gYSByZW1vdGUgc2VydmVyLiIsCisgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gInN0b3JlIiwgZGVzdCA9ICJ4bWxycGN0b2tlbiIpCisKKyAgICAgICAgcGFyc2VyLmFkZF9vcHRpb24oIiIsICItLXJldmlzaW9ucy1jaGFuZ2VkIiwgaGVscCA9ICJTZXQgdGhlIGV4aXQgY29kZSBkZXBlbmRpbmcgb24gd2hldGhlciB1cHN0cmVhbSBmbG9hdGluZyByZXZpc2lvbnMgaGF2ZSBjaGFuZ2VkIG9yIG5vdC4iLAorICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9ICJzdG9yZV90cnVlIiwgZGVzdCA9ICJyZXZpc2lvbnNfY2hhbmdlZCIsIGRlZmF1bHQgPSBGYWxzZSkKKworICAgICAgICBwYXJzZXIuYWRkX29wdGlvbigiIiwgIi0tc2VydmVyLW9ubHkiLCBoZWxwID0gIlJ1biBiaXRiYWtlIHdpdGhvdXQgYSBVSSwgb25seSBzdGFydGluZyBhIHNlcnZlciAoY29va2VyKSBwcm9jZXNzLiIsCisgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gInN0b3JlX3RydWUiLCBkZXN0ID0gInNlcnZlcl9vbmx5IiwgZGVmYXVsdCA9IEZhbHNlKQorCisgICAgICAgIHBhcnNlci5hZGRfb3B0aW9uKCItQiIsICItLWJpbmQiLCBoZWxwID0gIlRoZSBuYW1lL2FkZHJlc3MgZm9yIHRoZSBiaXRiYWtlIHNlcnZlciB0byBiaW5kIHRvLiIsCisgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gInN0b3JlIiwgZGVzdCA9ICJiaW5kIiwgZGVmYXVsdCA9IEZhbHNlKQorCisgICAgICAgIHBhcnNlci5hZGRfb3B0aW9uKCIiLCAiLS1uby1zZXRzY2VuZSIsIGhlbHAgPSAiRG8gbm90IHJ1biBhbnkgc2V0c2NlbmUgdGFza3MuIHNzdGF0ZSB3aWxsIGJlIGlnbm9yZWQgYW5kIGV2ZXJ5dGhpbmcgbmVlZGVkLCBidWlsdC4iLAorICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9ICJzdG9yZV90cnVlIiwgZGVzdCA9ICJub3NldHNjZW5lIiwgZGVmYXVsdCA9IEZhbHNlKQorCisgICAgICAgIHBhcnNlci5hZGRfb3B0aW9uKCIiLCAiLS1yZW1vdGUtc2VydmVyIiwgaGVscCA9ICJDb25uZWN0IHRvIHRoZSBzcGVjaWZpZWQgc2VydmVyLiIsCisgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gInN0b3JlIiwgZGVzdCA9ICJyZW1vdGVfc2VydmVyIiwgZGVmYXVsdCA9IEZhbHNlKQorCisgICAgICAgIHBhcnNlci5hZGRfb3B0aW9uKCItbSIsICItLWtpbGwtc2VydmVyIiwgaGVscCA9ICJUZXJtaW5hdGUgdGhlIHJlbW90ZSBzZXJ2ZXIuIiwKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gInN0b3JlX3RydWUiLCBkZXN0ID0gImtpbGxfc2VydmVyIiwgZGVmYXVsdCA9IEZhbHNlKQorCisgICAgICAgIHBhcnNlci5hZGRfb3B0aW9uKCIiLCAiLS1vYnNlcnZlLW9ubHkiLCBoZWxwID0gIkNvbm5lY3QgdG8gYSBzZXJ2ZXIgYXMgYW4gb2JzZXJ2aW5nLW9ubHkgY2xpZW50LiIsCisgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gInN0b3JlX3RydWUiLCBkZXN0ID0gIm9ic2VydmVfb25seSIsIGRlZmF1bHQgPSBGYWxzZSkKKworICAgICAgICBwYXJzZXIuYWRkX29wdGlvbigiIiwgIi0tc3RhdHVzLW9ubHkiLCBoZWxwID0gIkNoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIHJlbW90ZSBiaXRiYWtlIHNlcnZlci4iLAorICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9ICJzdG9yZV90cnVlIiwgZGVzdCA9ICJzdGF0dXNfb25seSIsIGRlZmF1bHQgPSBGYWxzZSkKKworICAgICAgICBwYXJzZXIuYWRkX29wdGlvbigiLXciLCAiLS13cml0ZS1sb2ciLCBoZWxwID0gIldyaXRlcyB0aGUgZXZlbnQgbG9nIG9mIHRoZSBidWlsZCB0byBhIGJpdGJha2UgZXZlbnQganNvbiBmaWxlLiBVc2UgJycgKGVtcHR5IHN0cmluZykgdG8gYXNzaWduIHRoZSBuYW1lIGF1dG9tYXRpY2FsbHkuIiwKKyAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSAic3RvcmUiLCBkZXN0ID0gIndyaXRlZXZlbnRsb2ciKQorCisgICAgICAgIG9wdGlvbnMsIHRhcmdldHMgPSBwYXJzZXIucGFyc2VfYXJncyhhcmd2KQorCisgICAgICAgICMgc29tZSBlbnZpcm9ubWVudGFsIHZhcmlhYmxlcyBzZXQgYWxzbyBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyAgICAgICAgaWYgIkJCU0VSVkVSIiBpbiBvcy5lbnZpcm9uOgorICAgICAgICAgICAgb3B0aW9ucy5zZXJ2ZXJ0eXBlID0gInhtbHJwYyIKKyAgICAgICAgICAgIG9wdGlvbnMucmVtb3RlX3NlcnZlciA9IG9zLmVudmlyb25bIkJCU0VSVkVSIl0KKworICAgICAgICBpZiAiQkJUT0tFTiIgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgICAgIG9wdGlvbnMueG1scnBjdG9rZW4gPSBvcy5lbnZpcm9uWyJCQlRPS0VOIl0KKworICAgICAgICBpZiAiQkJFVkVOVExPRyIgaXMgb3MuZW52aXJvbjoKKyAgICAgICAgICAgIG9wdGlvbnMud3JpdGVldmVudGxvZyA9IG9zLmVudmlyb25bIkJCRVZFTlRMT0ciXQorCisgICAgICAgICMgZmlsbCBpbiBwcm9wZXIgbG9nIG5hbWUgaWYgbm90IHN1cHBsaWVkCisgICAgICAgIGlmIG9wdGlvbnMud3JpdGVldmVudGxvZyBpcyBub3QgTm9uZSBhbmQgbGVuKG9wdGlvbnMud3JpdGVldmVudGxvZykgPT0gMDoKKyAgICAgICAgICAgIGltcG9ydCBkYXRldGltZQorICAgICAgICAgICAgb3B0aW9ucy53cml0ZWV2ZW50bG9nID0gImJpdGJha2VfZXZlbnRsb2dfJXMuanNvbiIgJSBkYXRldGltZS5kYXRldGltZS5ub3coKS5zdHJmdGltZSgiJVklbSVkJUglTSVTIikKKworICAgICAgICAjIGlmIEJCU0VSVkVSIHNheXMgdG8gYXV0b2RldGVjdCwgbGV0J3MgZG8gdGhhdAorICAgICAgICBpZiBvcHRpb25zLnJlbW90ZV9zZXJ2ZXI6CisgICAgICAgICAgICBbaG9zdCwgcG9ydF0gPSBvcHRpb25zLnJlbW90ZV9zZXJ2ZXIuc3BsaXQoIjoiLCAyKQorICAgICAgICAgICAgcG9ydCA9IGludChwb3J0KQorICAgICAgICAgICAgIyB1c2UgYXV0b21hdGljIHBvcnQgaWYgcG9ydCBzZXQgdG8gLTEsIG1lYW5zIHJlYWQgaXQgZnJvbQorICAgICAgICAgICAgIyB0aGUgYml0YmFrZS5sb2NrIGZpbGU7IHRoaXMgaXMgYSBiaXQgdHJpY2t5LCBidXQgd2UgYWx3YXlzIGV4cGVjdAorICAgICAgICAgICAgIyB0byBiZSBpbiB0aGUgYmFzZSBvZiB0aGUgYnVpbGQgZGlyZWN0b3J5IGlmIHdlIG5lZWQgdG8gaGF2ZSBhCisgICAgICAgICAgICAjIGNoYW5jZSB0byBzdGFydCB0aGUgc2VydmVyIGxhdGVyLCBhbnl3YXkKKyAgICAgICAgICAgIGlmIHBvcnQgPT0gLTE6CisgICAgICAgICAgICAgICAgbG9ja19sb2NhdGlvbiA9ICIuL2JpdGJha2UubG9jayIKKyAgICAgICAgICAgICAgICAjIHdlIHRyeSB0byByZWFkIHRoZSBhZGRyZXNzIGF0IGFsbCB0aW1lczsgaWYgdGhlIHNlcnZlciBpcyBub3Qgc3RhcnRlZCwKKyAgICAgICAgICAgICAgICAjIHdlJ2xsIHRyeSB0byBzdGFydCBpdCBhZnRlciB0aGUgZmlyc3QgY29ubmVjdCBmYWlscywgYmVsb3cKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGxmID0gb3Blbihsb2NrX2xvY2F0aW9uLCAncicpCisgICAgICAgICAgICAgICAgICAgIHJlbW90ZWRlZiA9IGxmLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICAgICAgW2hvc3QsIHBvcnRdID0gcmVtb3RlZGVmLnNwbGl0KCI6IikKKyAgICAgICAgICAgICAgICAgICAgcG9ydCA9IGludChwb3J0KQorICAgICAgICAgICAgICAgICAgICBsZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucmVtb3RlX3NlcnZlciA9IHJlbW90ZWRlZgorICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgQkJNYWluRXhjZXB0aW9uKCJGYWlsZWQgdG8gcmVhZCBiaXRiYWtlLmxvY2sgKCVzKSwgaW52YWxpZCBwb3J0IiAlIHN0cihlKSkKKworICAgICAgICByZXR1cm4gb3B0aW9ucywgdGFyZ2V0c1sxOl0KKworCitkZWYgc3RhcnRfc2VydmVyKHNlcnZlcm1vZHVsZSwgY29uZmlnUGFyYW1zLCBjb25maWd1cmF0aW9uLCBmZWF0dXJlcyk6CisgICAgc2VydmVyID0gc2VydmVybW9kdWxlLkJpdEJha2VTZXJ2ZXIoKQorICAgIGlmIGNvbmZpZ1BhcmFtcy5iaW5kOgorICAgICAgICAoaG9zdCwgcG9ydCkgPSBjb25maWdQYXJhbXMuYmluZC5zcGxpdCgnOicpCisgICAgICAgIHNlcnZlci5pbml0U2VydmVyKChob3N0LCBpbnQocG9ydCkpKQorICAgICAgICBjb25maWd1cmF0aW9uLmludGVyZmFjZSA9IFsgc2VydmVyLnNlcnZlckltcGwuaG9zdCwgc2VydmVyLnNlcnZlckltcGwucG9ydCBdCisgICAgZWxzZToKKyAgICAgICAgc2VydmVyLmluaXRTZXJ2ZXIoKQorICAgICAgICBjb25maWd1cmF0aW9uLmludGVyZmFjZSA9IFtdCisKKyAgICB0cnk6CisgICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0U2VydmVyUmVnSWRsZUNhbGxiYWNrKHNlcnZlci5nZXRTZXJ2ZXJJZGxlQ0IoKSkKKworICAgICAgICBjb29rZXIgPSBiYi5jb29rZXIuQkJDb29rZXIoY29uZmlndXJhdGlvbiwgZmVhdHVyZXMpCisKKyAgICAgICAgc2VydmVyLmFkZGNvb2tlcihjb29rZXIpCisgICAgICAgIHNlcnZlci5zYXZlQ29ubmVjdGlvbkRldGFpbHMoKQorICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgZXhjX2luZm8gPSBzeXMuZXhjX2luZm8oKQorICAgICAgICB3aGlsZSBoYXNhdHRyKHNlcnZlciwgImV2ZW50X3F1ZXVlIik6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaW1wb3J0IHF1ZXVlCisgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAgICAgaW1wb3J0IFF1ZXVlIGFzIHF1ZXVlCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZXZlbnQgPSBzZXJ2ZXIuZXZlbnRfcXVldWUuZ2V0KGJsb2NrPUZhbHNlKQorICAgICAgICAgICAgZXhjZXB0IChxdWV1ZS5FbXB0eSwgSU9FcnJvcik6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGxvZ2dpbmcuTG9nUmVjb3JkKToKKyAgICAgICAgICAgICAgICBsb2dnZXIuaGFuZGxlKGV2ZW50KQorICAgICAgICByYWlzZSBleGNfaW5mb1sxXSwgTm9uZSwgZXhjX2luZm9bMl0KKyAgICBzZXJ2ZXIuZGV0YWNoKCkKKyAgICBjb29rZXIubG9jay5jbG9zZSgpCisgICAgcmV0dXJuIHNlcnZlcgorCisKK2RlZiBiaXRiYWtlX21haW4oY29uZmlnUGFyYW1zLCBjb25maWd1cmF0aW9uKToKKworICAgICMgUHl0aG9uIG11bHRpcHJvY2Vzc2luZyByZXF1aXJlcyAvZGV2L3NobSBvbiBMaW51eAorICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdsaW51eCcpIGFuZCBub3Qgb3MuYWNjZXNzKCcvZGV2L3NobScsIG9zLldfT0sgfCBvcy5YX09LKToKKyAgICAgICAgcmFpc2UgQkJNYWluRXhjZXB0aW9uKCJGQVRBTDogL2Rldi9zaG0gZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IHdyaXRhYmxlIikKKworICAgICMgVW5idWZmZXIgc3Rkb3V0IHRvIGF2b2lkIGxvZyB0cnVuY2F0aW9uIGluIHRoZSBldmVudAorICAgICMgb2YgYW4gdW5vcmRlcmx5IGV4aXQgYXMgd2VsbCBhcyB0byBwcm92aWRlIHRpbWVseQorICAgICMgdXBkYXRlcyB0byBsb2cgZmlsZXMgZm9yIHVzZSB3aXRoIHRhaWwKKyAgICB0cnk6CisgICAgICAgIGlmIHN5cy5zdGRvdXQubmFtZSA9PSAnPHN0ZG91dD4nOgorICAgICAgICAgICAgc3lzLnN0ZG91dCA9IG9zLmZkb3BlbihzeXMuc3Rkb3V0LmZpbGVubygpLCAndycsIDApCisgICAgZXhjZXB0OgorICAgICAgICBwYXNzCisKKworICAgIGNvbmZpZ3VyYXRpb24uc2V0Q29uZmlnUGFyYW1ldGVycyhjb25maWdQYXJhbXMpCisKKyAgICB1aV9tb2R1bGUgPSBpbXBvcnRfZXh0ZW5zaW9uX21vZHVsZShiYi51aSwgY29uZmlnUGFyYW1zLnVpLCAnbWFpbicpCisgICAgc2VydmVybW9kdWxlID0gaW1wb3J0X2V4dGVuc2lvbl9tb2R1bGUoYmIuc2VydmVyLCBjb25maWdQYXJhbXMuc2VydmVydHlwZSwgJ0JpdEJha2VTZXJ2ZXInKQorCisgICAgaWYgY29uZmlnUGFyYW1zLnNlcnZlcl9vbmx5OgorICAgICAgICBpZiBjb25maWdQYXJhbXMuc2VydmVydHlwZSAhPSAieG1scnBjIjoKKyAgICAgICAgICAgIHJhaXNlIEJCTWFpbkV4Y2VwdGlvbigiRkFUQUw6IElmICctLXNlcnZlci1vbmx5JyBpcyBkZWZpbmVkLCB3ZSBtdXN0IHNldCB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXJ0eXBlIGFzICd4bWxycGMnLlxuIikKKyAgICAgICAgaWYgbm90IGNvbmZpZ1BhcmFtcy5iaW5kOgorICAgICAgICAgICAgcmFpc2UgQkJNYWluRXhjZXB0aW9uKCJGQVRBTDogVGhlICctLXNlcnZlci1vbmx5JyBvcHRpb24gcmVxdWlyZXMgYSBuYW1lL2FkZHJlc3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0byBiaW5kIHRvIHdpdGggdGhlIC1CIG9wdGlvbi5cbiIpCisgICAgICAgIGlmIGNvbmZpZ1BhcmFtcy5yZW1vdGVfc2VydmVyOgorICAgICAgICAgICAgcmFpc2UgQkJNYWluRXhjZXB0aW9uKCJGQVRBTDogVGhlICctLXNlcnZlci1vbmx5JyBvcHRpb24gY29uZmxpY3RzIHdpdGggJXMuXG4iICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoInRoZSBCQlNFUlZFUiBlbnZpcm9ubWVudCB2YXJpYWJsZSIgaWYgIkJCU0VSVkVSIiBpbiBvcy5lbnZpcm9uIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAidGhlICctLXJlbW90ZS1zZXJ2ZXInIG9wdGlvbiIgKSkKKworICAgIGlmIGNvbmZpZ1BhcmFtcy5iaW5kIGFuZCBjb25maWdQYXJhbXMuc2VydmVydHlwZSAhPSAieG1scnBjIjoKKyAgICAgICAgcmFpc2UgQkJNYWluRXhjZXB0aW9uKCJGQVRBTDogSWYgJy1CJyBvciAnLS1iaW5kJyBpcyBkZWZpbmVkLCB3ZSBtdXN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXQgdGhlIHNlcnZlcnR5cGUgYXMgJ3htbHJwYycuXG4iKQorCisgICAgaWYgY29uZmlnUGFyYW1zLnJlbW90ZV9zZXJ2ZXIgYW5kIGNvbmZpZ1BhcmFtcy5zZXJ2ZXJ0eXBlICE9ICJ4bWxycGMiOgorICAgICAgICByYWlzZSBCQk1haW5FeGNlcHRpb24oIkZBVEFMOiBJZiAnLS1yZW1vdGUtc2VydmVyJyBpcyBkZWZpbmVkLCB3ZSBtdXN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXQgdGhlIHNlcnZlcnR5cGUgYXMgJ3htbHJwYycuXG4iKQorCisgICAgaWYgY29uZmlnUGFyYW1zLm9ic2VydmVfb25seSBhbmQgKG5vdCBjb25maWdQYXJhbXMucmVtb3RlX3NlcnZlciBvciBjb25maWdQYXJhbXMuYmluZCk6CisgICAgICAgIHJhaXNlIEJCTWFpbkV4Y2VwdGlvbigiRkFUQUw6ICctLW9ic2VydmUtb25seScgY2FuIG9ubHkgYmUgdXNlZCBieSBVSSBjbGllbnRzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25uZWN0aW5nIHRvIGEgc2VydmVyLlxuIikKKworICAgIGlmIGNvbmZpZ1BhcmFtcy5raWxsX3NlcnZlciBhbmQgbm90IGNvbmZpZ1BhcmFtcy5yZW1vdGVfc2VydmVyOgorICAgICAgICByYWlzZSBCQk1haW5FeGNlcHRpb24oIkZBVEFMOiAnLS1raWxsLXNlcnZlcicgY2FuIG9ubHkgYmUgdXNlZCB0byB0ZXJtaW5hdGUgYSByZW1vdGUgc2VydmVyIikKKworICAgIGlmICJCQkRFQlVHIiBpbiBvcy5lbnZpcm9uOgorICAgICAgICBsZXZlbCA9IGludChvcy5lbnZpcm9uWyJCQkRFQlVHIl0pCisgICAgICAgIGlmIGxldmVsID4gY29uZmlndXJhdGlvbi5kZWJ1ZzoKKyAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uZGVidWcgPSBsZXZlbAorCisgICAgYmIubXNnLmluaXRfbXNnY29uZmlnKGNvbmZpZ1BhcmFtcy52ZXJib3NlLCBjb25maWd1cmF0aW9uLmRlYnVnLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uZGVidWdfZG9tYWlucykKKworICAgICMgRW5zdXJlIGxvZ2dpbmcgbWVzc2FnZXMgZ2V0IHNlbnQgdG8gdGhlIFVJIGFzIGV2ZW50cworICAgIGhhbmRsZXIgPSBiYi5ldmVudC5Mb2dIYW5kbGVyKCkKKyAgICBpZiBub3QgY29uZmlnUGFyYW1zLnN0YXR1c19vbmx5OgorICAgICAgICAjIEluIHN0YXR1cyBvbmx5IG1vZGUgdGhlcmUgYXJlIG5vIGxvZ3MgYW5kIG5vIFVJCisgICAgICAgIGxvZ2dlci5hZGRIYW5kbGVyKGhhbmRsZXIpCisKKyAgICAjIENsZWFyIGF3YXkgYW55IHNwdXJpb3VzIGVudmlyb25tZW50IHZhcmlhYmxlcyB3aGlsZSB3ZSBzdG9rZSB1cCB0aGUgY29va2VyCisgICAgY2xlYW5lZHZhcnMgPSBiYi51dGlscy5jbGVhbl9lbnZpcm9ubWVudCgpCisKKyAgICBmZWF0dXJlc2V0ID0gW10KKyAgICBpZiBub3QgY29uZmlnUGFyYW1zLnNlcnZlcl9vbmx5OgorICAgICAgICAjIENvbGxlY3QgdGhlIGZlYXR1cmUgc2V0IGZvciB0aGUgVUkKKyAgICAgICAgZmVhdHVyZXNldCA9IGdldGF0dHIodWlfbW9kdWxlLCAiZmVhdHVyZVNldCIsIFtdKQorCisgICAgaWYgbm90IGNvbmZpZ1BhcmFtcy5yZW1vdGVfc2VydmVyOgorICAgICAgICAjIHdlIHN0YXJ0IGEgc2VydmVyIHdpdGggYSBnaXZlbiBjb25maWd1cmF0aW9uCisgICAgICAgIHNlcnZlciA9IHN0YXJ0X3NlcnZlcihzZXJ2ZXJtb2R1bGUsIGNvbmZpZ1BhcmFtcywgY29uZmlndXJhdGlvbiwgZmVhdHVyZXNldCkKKyAgICAgICAgYmIuZXZlbnQudWlfcXVldWUgPSBbXQorICAgIGVsc2U6CisgICAgICAgICMgd2Ugc3RhcnQgYSBzdHViIHNlcnZlciB0aGF0IGlzIGFjdHVhbGx5IGEgWE1MUlBDbGllbnQgdGhhdCBjb25uZWN0cyB0byBhIHJlYWwgc2VydmVyCisgICAgICAgIHNlcnZlciA9IHNlcnZlcm1vZHVsZS5CaXRCYWtlWE1MUlBDQ2xpZW50KGNvbmZpZ1BhcmFtcy5vYnNlcnZlX29ubHksIGNvbmZpZ1BhcmFtcy54bWxycGN0b2tlbikKKyAgICAgICAgc2VydmVyLnNhdmVDb25uZWN0aW9uRGV0YWlscyhjb25maWdQYXJhbXMucmVtb3RlX3NlcnZlcikKKworCisgICAgaWYgbm90IGNvbmZpZ1BhcmFtcy5zZXJ2ZXJfb25seToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VydmVyX2Nvbm5lY3Rpb24gPSBzZXJ2ZXIuZXN0YWJsaXNoQ29ubmVjdGlvbihmZWF0dXJlc2V0KQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICBiYi5mYXRhbCgiQ291bGQgbm90IGNvbm5lY3QgdG8gc2VydmVyICVzOiAlcyIgJSAoY29uZmlnUGFyYW1zLnJlbW90ZV9zZXJ2ZXIsIHN0cihlKSkpCisKKyAgICAgICAgIyBSZXN0b3JlIHRoZSBlbnZpcm9ubWVudCBpbiBjYXNlIHRoZSBVSSBuZWVkcyBpdAorICAgICAgICBmb3IgayBpbiBjbGVhbmVkdmFyczoKKyAgICAgICAgICAgIG9zLmVudmlyb25ba10gPSBjbGVhbmVkdmFyc1trXQorCisgICAgICAgIGxvZ2dlci5yZW1vdmVIYW5kbGVyKGhhbmRsZXIpCisKKworICAgICAgICBpZiBjb25maWdQYXJhbXMuc3RhdHVzX29ubHk6CisgICAgICAgICAgICBzZXJ2ZXJfY29ubmVjdGlvbi50ZXJtaW5hdGUoKQorICAgICAgICAgICAgcmV0dXJuIDAKKworICAgICAgICBpZiBjb25maWdQYXJhbXMua2lsbF9zZXJ2ZXI6CisgICAgICAgICAgICBzZXJ2ZXJfY29ubmVjdGlvbi5jb25uZWN0aW9uLnRlcm1pbmF0ZVNlcnZlcigpCisgICAgICAgICAgICBiYi5ldmVudC51aV9xdWV1ZSA9IFtdCisgICAgICAgICAgICByZXR1cm4gMAorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiB1aV9tb2R1bGUubWFpbihzZXJ2ZXJfY29ubmVjdGlvbi5jb25uZWN0aW9uLCBzZXJ2ZXJfY29ubmVjdGlvbi5ldmVudHMsIGNvbmZpZ1BhcmFtcykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGJiLmV2ZW50LnVpX3F1ZXVlID0gW10KKyAgICAgICAgICAgIHNlcnZlcl9jb25uZWN0aW9uLnRlcm1pbmF0ZSgpCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQoIkJpdGJha2Ugc2VydmVyIGFkZHJlc3M6ICVzLCBzZXJ2ZXIgcG9ydDogJXMiICUgKHNlcnZlci5zZXJ2ZXJJbXBsLmhvc3QsIHNlcnZlci5zZXJ2ZXJJbXBsLnBvcnQpKQorICAgICAgICByZXR1cm4gMAorCisgICAgcmV0dXJuIDEKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL21ldGhvZHBvb2wucHkgYi9iaXRiYWtlL2xpYi9iYi9tZXRob2Rwb29sLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMmU5ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9tZXRob2Rwb29sLnB5CkBAIC0wLDAgKzEsMjkgQEAKKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisjCisjCisjIENvcHlyaWdodCAoQykgICAgICAgMjAwNiBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlcgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworZnJvbSBiYi51dGlscyBpbXBvcnQgYmV0dGVyX2NvbXBpbGUsIGJldHRlcl9leGVjCisKK2RlZiBpbnNlcnRfbWV0aG9kKG1vZHVsZW5hbWUsIGNvZGUsIGZuKToKKyAgICAiIiIKKyAgICBBZGQgY29kZSBvZiBhIG1vZHVsZSBzaG91bGQgYmUgYWRkZWQuIFRoZSBtZXRob2RzCisgICAgd2lsbCBiZSBzaW1wbHkgYWRkZWQsIG5vIGNoZWNraW5nIHdpbGwgYmUgZG9uZQorICAgICIiIgorICAgIGNvbXAgPSBiZXR0ZXJfY29tcGlsZShjb2RlLCBtb2R1bGVuYW1lLCBmbiApCisgICAgYmV0dGVyX2V4ZWMoY29tcCwgTm9uZSwgY29kZSwgZm4pCisKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL21vbml0b3JkaXNrLnB5IGIvYml0YmFrZS9saWIvYmIvbW9uaXRvcmRpc2sucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY2NTIzYwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL21vbml0b3JkaXNrLnB5CkBAIC0wLDAgKzEsMjYzIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisjCisjIENvcHlyaWdodCAoQykgMjAxMiBSb2JlcnQgWWFuZworIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworaW1wb3J0IG9zLCBsb2dnaW5nLCByZSwgc3lzCitpbXBvcnQgYmIKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJCaXRCYWtlLk1vbml0b3IiKQorCitkZWYgcHJpbnRFcnIoaW5mbyk6CisgICAgbG9nZ2VyLmVycm9yKCIlc1xuICAgICAgIERpc2sgc3BhY2UgbW9uaXRvciB3aWxsIE5PVCBiZSBlbmFibGVkIiAlIGluZm8pCisKK2RlZiBjb252ZXJ0R01LKHVuaXQpOgorCisgICAgIiIiIENvbnZlcnQgdGhlIHNwYWNlIHVuaXQgRywgTSwgSywgdGhlIHVuaXQgaXMgY2FzZS1pbnNlbnNpdGl2ZSAiIiIKKworICAgIHVuaXRHID0gcmUubWF0Y2goJyhbMS05XVswLTldKilbZ0ddXHM/JCcsIHVuaXQpCisgICAgaWYgdW5pdEc6CisgICAgICAgIHJldHVybiBpbnQodW5pdEcuZ3JvdXAoMSkpICogKDEwMjQgKiogMykKKyAgICB1bml0TSA9IHJlLm1hdGNoKCcoWzEtOV1bMC05XSopW21NXVxzPyQnLCB1bml0KQorICAgIGlmIHVuaXRNOgorICAgICAgICByZXR1cm4gaW50KHVuaXRNLmdyb3VwKDEpKSAqICgxMDI0ICoqIDIpCisgICAgdW5pdEsgPSByZS5tYXRjaCgnKFsxLTldWzAtOV0qKVtrS11ccz8kJywgdW5pdCkKKyAgICBpZiB1bml0SzoKKyAgICAgICAgcmV0dXJuIGludCh1bml0Sy5ncm91cCgxKSkgKiAxMDI0CisgICAgdW5pdE4gPSByZS5tYXRjaCgnKFsxLTldWzAtOV0qKVxzPyQnLCB1bml0KQorICAgIGlmIHVuaXROOgorICAgICAgICByZXR1cm4gaW50KHVuaXROLmdyb3VwKDEpKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBOb25lCisKK2RlZiBnZXRNb3VudGVkRGV2KHBhdGgpOgorCisgICAgIiIiIEdldCB0aGUgZGV2aWNlIG1vdW50ZWQgYXQgdGhlIHBhdGgsIHVzZXMgL3Byb2MvbW91bnRzICIiIgorCisgICAgIyBHZXQgdGhlIG1vdW50IHBvaW50IG9mIHRoZSBmaWxlc3lzdGVtIGNvbnRhaW5pbmcgcGF0aAorICAgICMgc3RfZGV2IGlzIHRoZSBJRCBvZiBkZXZpY2UgY29udGFpbmluZyBmaWxlCisgICAgcGFyZW50RGV2ID0gb3Muc3RhdChwYXRoKS5zdF9kZXYKKyAgICBjdXJyZW50RGV2ID0gcGFyZW50RGV2CisgICAgIyBXaGVuIHRoZSBjdXJyZW50IGRpcmVjdG9yeSdzIGRldmljZSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUKKyAgICAjIHBhcmVudCdzLCB0aGVuIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpcyBhIG1vdW50IHBvaW50CisgICAgd2hpbGUgcGFyZW50RGV2ID09IGN1cnJlbnREZXY6CisgICAgICAgIG1vdW50UG9pbnQgPSBwYXRoCisgICAgICAgICMgVXNlIGRpcm5hbWUgdG8gZ2V0IHRoZSBwYXJlbnQncyBkaXJlY3RvcnkKKyAgICAgICAgcGF0aCA9IG9zLnBhdGguZGlybmFtZShwYXRoKQorICAgICAgICAjIFJlYWNoIHRoZSAiLyIKKyAgICAgICAgaWYgcGF0aCA9PSBtb3VudFBvaW50OgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgcGFyZW50RGV2PSBvcy5zdGF0KHBhdGgpLnN0X2RldgorCisgICAgdHJ5OgorICAgICAgICB3aXRoIG9wZW4oIi9wcm9jL21vdW50cyIsICJyIikgYXMgaWZwOgorICAgICAgICAgICAgZm9yIGxpbmUgaW4gaWZwOgorICAgICAgICAgICAgICAgIHByb2NMaW5lcyA9IGxpbmUucnN0cmlwKCdcbicpLnNwbGl0KCkKKyAgICAgICAgICAgICAgICBpZiBwcm9jTGluZXNbMV0gPT0gbW91bnRQb2ludDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb2NMaW5lc1swXQorICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yOgorICAgICAgICBwYXNzCisgICAgcmV0dXJuIE5vbmUKKworZGVmIGdldERpc2tEYXRhKEJCRGlycywgY29uZmlndXJhdGlvbik6CisKKyAgICAiIiJQcmVwYXJlIGRpc2sgZGF0YSBmb3IgZGlzayBzcGFjZSBtb25pdG9yIiIiCisKKyAgICAjIFNhdmUgdGhlIGRldmljZSBJRHMsIG5lZWQgdGhlIElEIHRvIGJlIHVuaXF1ZSAodGhlIGRpY3Rpb25hcnkncyBrZXkgaXMKKyAgICAjIHVuaXF1ZSksIHNvIHRoYXQgd2hlbiBtb3JlIHRoYW4gb25lIGRpcmVjdG9yeSBpcyBsb2NhdGVkIG9uIHRoZSBzYW1lCisgICAgIyBkZXZpY2UsIHdlIGp1c3QgbW9uaXRvciBpdCBvbmNlCisgICAgZGV2RGljdCA9IHt9CisgICAgZm9yIHBhdGhTcGFjZUlub2RlIGluIEJCRGlycy5zcGxpdCgpOgorICAgICAgICAjIFRoZSBpbnB1dCBmb3JtYXQgaXM6ICJkaXIsc3BhY2UsaW5vZGUiLCBkaXIgaXMgYSBtdXN0LCBzcGFjZQorICAgICAgICAjIGFuZCBpbm9kZSBhcmUgb3B0aW9uYWwKKyAgICAgICAgcGF0aFNwYWNlSW5vZGVSZSA9IHJlLm1hdGNoKCcoW14sXSopLChbXixdKiksKFteLF0qKSw/KC4qKScsIHBhdGhTcGFjZUlub2RlKQorICAgICAgICBpZiBub3QgcGF0aFNwYWNlSW5vZGVSZToKKyAgICAgICAgICAgIHByaW50RXJyKCJJbnZhbGlkIHZhbHVlIGluIEJCX0RJU0tNT05fRElSUzogJXMiICUgcGF0aFNwYWNlSW5vZGUpCisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIGFjdGlvbiA9IHBhdGhTcGFjZUlub2RlUmUuZ3JvdXAoMSkKKyAgICAgICAgaWYgYWN0aW9uIG5vdCBpbiAoIkFCT1JUIiwgIlNUT1BUQVNLUyIsICJXQVJOIik6CisgICAgICAgICAgICBwcmludEVycigiVW5rbm93biBkaXNrIHNwYWNlIG1vbml0b3IgYWN0aW9uOiAlcyIgJSBhY3Rpb24pCisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIHBhdGggPSBvcy5wYXRoLnJlYWxwYXRoKHBhdGhTcGFjZUlub2RlUmUuZ3JvdXAoMikpCisgICAgICAgIGlmIG5vdCBwYXRoOgorICAgICAgICAgICAgcHJpbnRFcnIoIkludmFsaWQgcGF0aCB2YWx1ZSBpbiBCQl9ESVNLTU9OX0RJUlM6ICVzIiAlIHBhdGhTcGFjZUlub2RlKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICAjIFRoZSBkaXNrIHNwYWNlIG9yIGlub2RlIGlzIG9wdGlvbmFsLCBidXQgaXQgc2hvdWxkIGhhdmUgYSBjb3JyZWN0CisgICAgICAgICMgdmFsdWUgb25jZSBpdCBpcyBzcGVjaWZpZWQKKyAgICAgICAgbWluU3BhY2UgPSBwYXRoU3BhY2VJbm9kZVJlLmdyb3VwKDMpCisgICAgICAgIGlmIG1pblNwYWNlOgorICAgICAgICAgICAgbWluU3BhY2UgPSBjb252ZXJ0R01LKG1pblNwYWNlKQorICAgICAgICAgICAgaWYgbm90IG1pblNwYWNlOgorICAgICAgICAgICAgICAgIHByaW50RXJyKCJJbnZhbGlkIGRpc2sgc3BhY2UgdmFsdWUgaW4gQkJfRElTS01PTl9ESVJTOiAlcyIgJSBwYXRoU3BhY2VJbm9kZVJlLmdyb3VwKDMpKQorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIE5vbmUgbWVhbnMgdGhhdCBpdCBpcyBub3Qgc3BlY2lmaWVkCisgICAgICAgICAgICBtaW5TcGFjZSA9IE5vbmUKKworICAgICAgICBtaW5Jbm9kZSA9IHBhdGhTcGFjZUlub2RlUmUuZ3JvdXAoNCkKKyAgICAgICAgaWYgbWluSW5vZGU6CisgICAgICAgICAgICBtaW5Jbm9kZSA9IGNvbnZlcnRHTUsobWluSW5vZGUpCisgICAgICAgICAgICBpZiBub3QgbWluSW5vZGU6CisgICAgICAgICAgICAgICAgcHJpbnRFcnIoIkludmFsaWQgaW5vZGUgdmFsdWUgaW4gQkJfRElTS01PTl9ESVJTOiAlcyIgJSBwYXRoU3BhY2VJbm9kZVJlLmdyb3VwKDQpKQorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIE5vbmUgbWVhbnMgdGhhdCBpdCBpcyBub3Qgc3BlY2lmaWVkCisgICAgICAgICAgICBtaW5Jbm9kZSA9IE5vbmUKKworICAgICAgICBpZiBtaW5TcGFjZSBpcyBOb25lIGFuZCBtaW5Jbm9kZSBpcyBOb25lOgorICAgICAgICAgICAgcHJpbnRFcnIoIk5vIGRpc2sgc3BhY2Ugb3IgaW5vZGUgdmFsdWUgaW4gZm91bmQgQkJfRElTS01PTl9ESVJTOiAlcyIgJSBwYXRoU3BhY2VJbm9kZSkKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICMgbWtkaXIgZm9yIHRoZSBkaXJlY3Rvcnkgc2luY2UgaXQgbWF5IG5vdCBleGlzdCwgZm9yIGV4YW1wbGUgdGhlCisgICAgICAgICMgRExfRElSIG1heSBub3QgZXhpc3QgYXQgdGhlIHZlcnkgYmVnaW5uaW5nCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhwYXRoKToKKyAgICAgICAgICAgIGJiLnV0aWxzLm1rZGlyaGllcihwYXRoKQorICAgICAgICBkZXYgPSBnZXRNb3VudGVkRGV2KHBhdGgpCisgICAgICAgICMgVXNlIHBhdGgvYWN0aW9uIGFzIHRoZSBrZXkKKyAgICAgICAgZGV2RGljdFtvcy5wYXRoLmpvaW4ocGF0aCwgYWN0aW9uKV0gPSBbZGV2LCBtaW5TcGFjZSwgbWluSW5vZGVdCisKKyAgICByZXR1cm4gZGV2RGljdAorCitkZWYgZ2V0SW50ZXJ2YWwoY29uZmlndXJhdGlvbik6CisKKyAgICAiIiIgR2V0IHRoZSBkaXNrIHNwYWNlIGludGVydmFsICIiIgorCisgICAgIyBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA1ME0gYW5kIDVLLgorICAgIHNwYWNlRGVmYXVsdCA9IDUwICogMTAyNCAqIDEwMjQKKyAgICBpbm9kZURlZmF1bHQgPSA1ICogMTAyNAorCisgICAgaW50ZXJ2YWwgPSBjb25maWd1cmF0aW9uLmdldFZhcigiQkJfRElTS01PTl9XQVJOSU5URVJWQUwiLCBUcnVlKQorICAgIGlmIG5vdCBpbnRlcnZhbDoKKyAgICAgICAgcmV0dXJuIHNwYWNlRGVmYXVsdCwgaW5vZGVEZWZhdWx0CisgICAgZWxzZToKKyAgICAgICAgIyBUaGUgZGlzayBzcGFjZSBvciBpbm9kZSBpbnRlcnZhbCBpcyBvcHRpb25hbCwgYnV0IGl0IHNob3VsZAorICAgICAgICAjIGhhdmUgYSBjb3JyZWN0IHZhbHVlIG9uY2UgaXQgaXMgc3BlY2lmaWVkCisgICAgICAgIGludGVydmFsUmUgPSByZS5tYXRjaCgnKFteLF0qKSw/XHMqKC4qKScsIGludGVydmFsKQorICAgICAgICBpZiBpbnRlcnZhbFJlOgorICAgICAgICAgICAgaW50ZXJ2YWxTcGFjZSA9IGludGVydmFsUmUuZ3JvdXAoMSkKKyAgICAgICAgICAgIGlmIGludGVydmFsU3BhY2U6CisgICAgICAgICAgICAgICAgaW50ZXJ2YWxTcGFjZSA9IGNvbnZlcnRHTUsoaW50ZXJ2YWxTcGFjZSkKKyAgICAgICAgICAgICAgICBpZiBub3QgaW50ZXJ2YWxTcGFjZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnIoIkludmFsaWQgZGlzayBzcGFjZSBpbnRlcnZhbCB2YWx1ZSBpbiBCQl9ESVNLTU9OX1dBUk5JTlRFUlZBTDogJXMiICUgaW50ZXJ2YWxSZS5ncm91cCgxKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUsIE5vbmUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaW50ZXJ2YWxTcGFjZSA9IHNwYWNlRGVmYXVsdAorICAgICAgICAgICAgaW50ZXJ2YWxJbm9kZSA9IGludGVydmFsUmUuZ3JvdXAoMikKKyAgICAgICAgICAgIGlmIGludGVydmFsSW5vZGU6CisgICAgICAgICAgICAgICAgaW50ZXJ2YWxJbm9kZSA9IGNvbnZlcnRHTUsoaW50ZXJ2YWxJbm9kZSkKKyAgICAgICAgICAgICAgICBpZiBub3QgaW50ZXJ2YWxJbm9kZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnIoIkludmFsaWQgZGlzayBpbm9kZSBpbnRlcnZhbCB2YWx1ZSBpbiBCQl9ESVNLTU9OX1dBUk5JTlRFUlZBTDogJXMiICUgaW50ZXJ2YWxSZS5ncm91cCgyKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUsIE5vbmUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaW50ZXJ2YWxJbm9kZSA9IGlub2RlRGVmYXVsdAorICAgICAgICAgICAgcmV0dXJuIGludGVydmFsU3BhY2UsIGludGVydmFsSW5vZGUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50RXJyKCJJbnZhbGlkIGludGVydmFsIHZhbHVlIGluIEJCX0RJU0tNT05fV0FSTklOVEVSVkFMOiAlcyIgJSBpbnRlcnZhbCkKKyAgICAgICAgICAgIHJldHVybiBOb25lLCBOb25lCisKK2NsYXNzIGRpc2tNb25pdG9yOgorCisgICAgIiIiUHJlcGFyZSB0aGUgZGlzayBzcGFjZSBtb25pdG9yIGRhdGEiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25maWd1cmF0aW9uKToKKworICAgICAgICBzZWxmLmVuYWJsZU1vbml0b3IgPSBGYWxzZQorICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uCisKKyAgICAgICAgQkJEaXJzID0gY29uZmlndXJhdGlvbi5nZXRWYXIoIkJCX0RJU0tNT05fRElSUyIsIFRydWUpIG9yIE5vbmUKKyAgICAgICAgaWYgQkJEaXJzOgorICAgICAgICAgICAgc2VsZi5kZXZEaWN0ID0gZ2V0RGlza0RhdGEoQkJEaXJzLCBjb25maWd1cmF0aW9uKQorICAgICAgICAgICAgaWYgc2VsZi5kZXZEaWN0OgorICAgICAgICAgICAgICAgIHNlbGYuc3BhY2VJbnRlcnZhbCwgc2VsZi5pbm9kZUludGVydmFsID0gZ2V0SW50ZXJ2YWwoY29uZmlndXJhdGlvbikKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnNwYWNlSW50ZXJ2YWwgYW5kIHNlbGYuaW5vZGVJbnRlcnZhbDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lbmFibGVNb25pdG9yID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAjIFRoZXNlIGFyZSBmb3Igc2F2aW5nIHRoZSBwcmV2aW91cyBkaXNrIGZyZWUgc3BhY2UgYW5kIGlub2RlLCB3ZQorICAgICAgICAgICAgICAgICAgICAjIHVzZSB0aGVtIHRvIGF2b2lkIHByaW50aW5nIHRvbyBtYW55IHdhcm5pbmcgbWVzc2FnZXMKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wcmVGcmVlUyA9IHt9CisgICAgICAgICAgICAgICAgICAgIHNlbGYucHJlRnJlZUkgPSB7fQorICAgICAgICAgICAgICAgICAgICAjIFRoaXMgaXMgZm9yIFNUT1BUQVNLUyBhbmQgQUJPUlQsIHRvIGF2b2lkIHByaW50aW5nIHRoZSBtZXNzYWdlCisgICAgICAgICAgICAgICAgICAgICMgcmVwZWF0ZWRseSB3aGlsZSB3YWl0aW5nIGZvciB0aGUgdGFza3MgdG8gZmluaXNoCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tlZCA9IHt9CisgICAgICAgICAgICAgICAgICAgIGZvciBrIGluIHNlbGYuZGV2RGljdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucHJlRnJlZVNba10gPSAwCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnByZUZyZWVJW2tdID0gMAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGVja2VkW2tdID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5zcGFjZUludGVydmFsIGlzIE5vbmUgYW5kIHNlbGYuaW5vZGVJbnRlcnZhbCBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lbmFibGVNb25pdG9yID0gRmFsc2UKKworICAgIGRlZiBjaGVjayhzZWxmLCBycSk6CisKKyAgICAgICAgIiIiIFRha2UgYWN0aW9uIGZvciB0aGUgbW9uaXRvciAiIiIKKworICAgICAgICBpZiBzZWxmLmVuYWJsZU1vbml0b3I6CisgICAgICAgICAgICBmb3IgayBpbiBzZWxmLmRldkRpY3Q6CisgICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguZGlybmFtZShrKQorICAgICAgICAgICAgICAgIGFjdGlvbiA9IG9zLnBhdGguYmFzZW5hbWUoaykKKyAgICAgICAgICAgICAgICBkZXYgPSBzZWxmLmRldkRpY3Rba11bMF0KKyAgICAgICAgICAgICAgICBtaW5TcGFjZSA9IHNlbGYuZGV2RGljdFtrXVsxXQorICAgICAgICAgICAgICAgIG1pbklub2RlID0gc2VsZi5kZXZEaWN0W2tdWzJdCisKKyAgICAgICAgICAgICAgICBzdCA9IG9zLnN0YXR2ZnMocGF0aCkKKworICAgICAgICAgICAgICAgICMgVGhlIGZyZWUgc3BhY2UsIGZsb2F0IHBvaW50IG51bWJlcgorICAgICAgICAgICAgICAgIGZyZWVTcGFjZSA9IHN0LmZfYmF2YWlsICogc3QuZl9mcnNpemUKKworICAgICAgICAgICAgICAgIGlmIG1pblNwYWNlIGFuZCBmcmVlU3BhY2UgPCBtaW5TcGFjZToKKyAgICAgICAgICAgICAgICAgICAgIyBBbHdheXMgc2hvdyB3YXJuaW5nLCB0aGUgc2VsZi5jaGVja2VkIHdvdWxkIGFsd2F5cyBiZSBGYWxzZSBpZiB0aGUgYWN0aW9uIGlzIFdBUk4KKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5wcmVGcmVlU1trXSA9PSAwIG9yIHNlbGYucHJlRnJlZVNba10gLSBmcmVlU3BhY2UgPiBzZWxmLnNwYWNlSW50ZXJ2YWwgYW5kIG5vdCBzZWxmLmNoZWNrZWRba106CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiVGhlIGZyZWUgc3BhY2Ugb2YgJXMgKCVzKSBpcyBydW5uaW5nIGxvdyAoJS4zZkdCIGxlZnQpIiAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhdGgsIGRldiwgZnJlZVNwYWNlIC8gMTAyNCAvIDEwMjQgLyAxMDI0LjApKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wcmVGcmVlU1trXSA9IGZyZWVTcGFjZQorCisgICAgICAgICAgICAgICAgICAgIGlmIGFjdGlvbiA9PSAiU1RPUFRBU0tTIiBhbmQgbm90IHNlbGYuY2hlY2tlZFtrXToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiTm8gbmV3IHRhc2tzIGNhbiBiZSBleGVjdXRlZCBzaW5jZSB0aGUgZGlzayBzcGFjZSBtb25pdG9yIGFjdGlvbiBpcyBcIlNUT1BUQVNLU1wiISIpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrZWRba10gPSBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICBycS5maW5pc2hfcnVucXVldWUoRmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICBiYi5ldmVudC5maXJlKGJiLmV2ZW50LkRpc2tGdWxsKGRldiwgJ2Rpc2snLCBmcmVlU3BhY2UsIHBhdGgpLCBzZWxmLmNvbmZpZ3VyYXRpb24pCisgICAgICAgICAgICAgICAgICAgIGVsaWYgYWN0aW9uID09ICJBQk9SVCIgYW5kIG5vdCBzZWxmLmNoZWNrZWRba106CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIkltbWVkaWF0ZWx5IGFib3J0IHNpbmNlIHRoZSBkaXNrIHNwYWNlIG1vbml0b3IgYWN0aW9uIGlzIFwiQUJPUlRcIiEiKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGVja2VkW2tdID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgcnEuZmluaXNoX3J1bnF1ZXVlKFRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICBiYi5ldmVudC5maXJlKGJiLmV2ZW50LkRpc2tGdWxsKGRldiwgJ2Rpc2snLCBmcmVlU3BhY2UsIHBhdGgpLCBzZWxmLmNvbmZpZ3VyYXRpb24pCisKKyAgICAgICAgICAgICAgICAjIFRoZSBmcmVlIGlub2RlcywgZmxvYXQgcG9pbnQgbnVtYmVyCisgICAgICAgICAgICAgICAgZnJlZUlub2RlID0gc3QuZl9mYXZhaWwKKworICAgICAgICAgICAgICAgIGlmIG1pbklub2RlIGFuZCBmcmVlSW5vZGUgPCBtaW5Jbm9kZToKKyAgICAgICAgICAgICAgICAgICAgIyBTb21lIGZpbGVzeXN0ZW1zIHVzZSBkeW5hbWljIGlub2RlcyBzbyBjYW4ndCBydW4gb3V0CisgICAgICAgICAgICAgICAgICAgICMgKGUuZy4gYnRyZnMpLiBUaGlzIGlzIHJlcG9ydGVkIGJ5IHRoZSBpbm9kZSBjb3VudCBiZWluZyAwLgorICAgICAgICAgICAgICAgICAgICBpZiBzdC5mX2ZpbGVzID09IDA6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRldkRpY3Rba11bMl0gPSBOb25lCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAjIEFsd2F5cyBzaG93IHdhcm5pbmcsIHRoZSBzZWxmLmNoZWNrZWQgd291bGQgYWx3YXlzIGJlIEZhbHNlIGlmIHRoZSBhY3Rpb24gaXMgV0FSTgorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnByZUZyZWVJW2tdID09IDAgb3Igc2VsZi5wcmVGcmVlSVtrXSAtIGZyZWVJbm9kZSA+IHNlbGYuaW5vZGVJbnRlcnZhbCBhbmQgbm90IHNlbGYuY2hlY2tlZFtrXToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJUaGUgZnJlZSBpbm9kZSBvZiAlcyAoJXMpIGlzIHJ1bm5pbmcgbG93ICglLjNmSyBsZWZ0KSIgJSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXRoLCBkZXYsIGZyZWVJbm9kZSAvIDEwMjQuMCkpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnByZUZyZWVJW2tdID0gZnJlZUlub2RlCisKKyAgICAgICAgICAgICAgICAgICAgaWYgYWN0aW9uICA9PSAiU1RPUFRBU0tTIiBhbmQgbm90IHNlbGYuY2hlY2tlZFtrXToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiTm8gbmV3IHRhc2tzIGNhbiBiZSBleGVjdXRlZCBzaW5jZSB0aGUgZGlzayBzcGFjZSBtb25pdG9yIGFjdGlvbiBpcyBcIlNUT1BUQVNLU1wiISIpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrZWRba10gPSBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICBycS5maW5pc2hfcnVucXVldWUoRmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICBiYi5ldmVudC5maXJlKGJiLmV2ZW50LkRpc2tGdWxsKGRldiwgJ2lub2RlJywgZnJlZUlub2RlLCBwYXRoKSwgc2VsZi5jb25maWd1cmF0aW9uKQorICAgICAgICAgICAgICAgICAgICBlbGlmIGFjdGlvbiAgPT0gIkFCT1JUIiBhbmQgbm90IHNlbGYuY2hlY2tlZFtrXToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiSW1tZWRpYXRlbHkgYWJvcnQgc2luY2UgdGhlIGRpc2sgc3BhY2UgbW9uaXRvciBhY3Rpb24gaXMgXCJBQk9SVFwiISIpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrZWRba10gPSBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICBycS5maW5pc2hfcnVucXVldWUoVHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJiLmV2ZW50LmZpcmUoYmIuZXZlbnQuRGlza0Z1bGwoZGV2LCAnaW5vZGUnLCBmcmVlSW5vZGUsIHBhdGgpLCBzZWxmLmNvbmZpZ3VyYXRpb24pCisgICAgICAgIHJldHVybgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvbXNnLnB5IGIvYml0YmFrZS9saWIvYmIvbXNnLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NmI1YWUKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9tc2cucHkKQEAgLTAsMCArMSwxOTkgQEAKKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisiIiIKK0JpdEJha2UgJ21zZycgaW1wbGVtZW50YXRpb24KKworTWVzc2FnZSBoYW5kbGluZyBpbmZyYXN0cnVjdHVyZSBmb3IgYml0YmFrZQorCisiIiIKKworIyBDb3B5cmlnaHQgKEMpIDIwMDYgICAgICAgIFJpY2hhcmQgUHVyZGllCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitpbXBvcnQgc3lzCitpbXBvcnQgY29weQoraW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBjb2xsZWN0aW9ucworZnJvbSBpdGVydG9vbHMgaW1wb3J0IGdyb3VwYnkKK2ltcG9ydCB3YXJuaW5ncworaW1wb3J0IGJiCitpbXBvcnQgYmIuZXZlbnQKKworY2xhc3MgQkJMb2dGb3JtYXR0ZXIobG9nZ2luZy5Gb3JtYXR0ZXIpOgorICAgICIiIkZvcm1hdHRlciB3aGljaCBlbnN1cmVzIHRoYXQgb3VyICdwbGFpbicgbWVzc2FnZXMgKGxvZ2dpbmcuSU5GTyArIDEpIGFyZSB1c2VkIGFzIGlzIiIiCisKKyAgICBERUJVRzMgPSBsb2dnaW5nLkRFQlVHIC0gMgorICAgIERFQlVHMiA9IGxvZ2dpbmcuREVCVUcgLSAxCisgICAgREVCVUcgPSBsb2dnaW5nLkRFQlVHCisgICAgVkVSQk9TRSA9IGxvZ2dpbmcuSU5GTyAtIDEKKyAgICBOT1RFID0gbG9nZ2luZy5JTkZPCisgICAgUExBSU4gPSBsb2dnaW5nLklORk8gKyAxCisgICAgRVJST1IgPSBsb2dnaW5nLkVSUk9SCisgICAgV0FSTklORyA9IGxvZ2dpbmcuV0FSTklORworICAgIENSSVRJQ0FMID0gbG9nZ2luZy5DUklUSUNBTAorCisgICAgbGV2ZWxuYW1lcyA9IHsKKyAgICAgICAgREVCVUczICAgOiAnREVCVUcnLAorICAgICAgICBERUJVRzIgICA6ICdERUJVRycsCisgICAgICAgIERFQlVHICAgOiAnREVCVUcnLAorICAgICAgICBWRVJCT1NFOiAnTk9URScsCisgICAgICAgIE5PVEUgICAgOiAnTk9URScsCisgICAgICAgIFBMQUlOICA6ICcnLAorICAgICAgICBXQVJOSU5HIDogJ1dBUk5JTkcnLAorICAgICAgICBFUlJPUiAgIDogJ0VSUk9SJywKKyAgICAgICAgQ1JJVElDQUw6ICdFUlJPUicsCisgICAgfQorCisgICAgY29sb3JfZW5hYmxlZCA9IEZhbHNlCisgICAgQkFTRUNPTE9SLCBCTEFDSywgUkVELCBHUkVFTiwgWUVMTE9XLCBCTFVFLCBNQUdFTlRBLCBDWUFOLCBXSElURSA9IHJhbmdlKDI5LDM4KQorCisgICAgQ09MT1JTID0geworICAgICAgICBERUJVRzMgIDogQ1lBTiwKKyAgICAgICAgREVCVUcyICA6IENZQU4sCisgICAgICAgIERFQlVHICAgOiBDWUFOLAorICAgICAgICBWRVJCT1NFIDogQkFTRUNPTE9SLAorICAgICAgICBOT1RFICAgIDogQkFTRUNPTE9SLAorICAgICAgICBQTEFJTiAgIDogQkFTRUNPTE9SLAorICAgICAgICBXQVJOSU5HIDogWUVMTE9XLAorICAgICAgICBFUlJPUiAgIDogUkVELAorICAgICAgICBDUklUSUNBTDogUkVELAorICAgIH0KKworICAgIEJMRCA9ICdcMDMzWzE7JWRtJworICAgIFNURCA9ICdcMDMzWyVkbScKKyAgICBSU1QgPSAnXDAzM1swbScKKworICAgIGRlZiBnZXRMZXZlbE5hbWUoc2VsZiwgbGV2ZWxubyk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmxldmVsbmFtZXNbbGV2ZWxub10KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgc2VsZi5sZXZlbG5hbWVzW2xldmVsbm9dID0gdmFsdWUgPSAnTGV2ZWwgJWQnICUgbGV2ZWxubworICAgICAgICAgICAgcmV0dXJuIHZhbHVlCisKKyAgICBkZWYgZm9ybWF0KHNlbGYsIHJlY29yZCk6CisgICAgICAgIHJlY29yZC5sZXZlbG5hbWUgPSBzZWxmLmdldExldmVsTmFtZShyZWNvcmQubGV2ZWxubykKKyAgICAgICAgaWYgcmVjb3JkLmxldmVsbm8gPT0gc2VsZi5QTEFJTjoKKyAgICAgICAgICAgIG1zZyA9IHJlY29yZC5nZXRNZXNzYWdlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHNlbGYuY29sb3JfZW5hYmxlZDoKKyAgICAgICAgICAgICAgICByZWNvcmQgPSBzZWxmLmNvbG9yaXplKHJlY29yZCkKKyAgICAgICAgICAgIG1zZyA9IGxvZ2dpbmcuRm9ybWF0dGVyLmZvcm1hdChzZWxmLCByZWNvcmQpCisKKyAgICAgICAgaWYgaGFzYXR0cihyZWNvcmQsICdiYl9leGNfaW5mbycpOgorICAgICAgICAgICAgZXR5cGUsIHZhbHVlLCB0YiA9IHJlY29yZC5iYl9leGNfaW5mbworICAgICAgICAgICAgZm9ybWF0dGVkID0gYmIuZXhjZXB0aW9ucy5mb3JtYXRfZXhjZXB0aW9uKGV0eXBlLCB2YWx1ZSwgdGIsIGxpbWl0PTUpCisgICAgICAgICAgICBtc2cgKz0gJ1xuJyArICcnLmpvaW4oZm9ybWF0dGVkKQorICAgICAgICByZXR1cm4gbXNnCisKKyAgICBkZWYgY29sb3JpemUoc2VsZiwgcmVjb3JkKToKKyAgICAgICAgY29sb3IgPSBzZWxmLkNPTE9SU1tyZWNvcmQubGV2ZWxub10KKyAgICAgICAgaWYgc2VsZi5jb2xvcl9lbmFibGVkIGFuZCBjb2xvciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJlY29yZCA9IGNvcHkuY29weShyZWNvcmQpCisgICAgICAgICAgICByZWNvcmQubGV2ZWxuYW1lID0gIiIuam9pbihbc2VsZi5CTEQgJSBjb2xvciwgcmVjb3JkLmxldmVsbmFtZSwgc2VsZi5SU1RdKQorICAgICAgICAgICAgcmVjb3JkLm1zZyA9ICIiLmpvaW4oW3NlbGYuU1REICUgY29sb3IsIHJlY29yZC5tc2csIHNlbGYuUlNUXSkKKyAgICAgICAgcmV0dXJuIHJlY29yZAorCisgICAgZGVmIGVuYWJsZV9jb2xvcihzZWxmKToKKyAgICAgICAgc2VsZi5jb2xvcl9lbmFibGVkID0gVHJ1ZQorCitjbGFzcyBCQkxvZ0ZpbHRlcihvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBoYW5kbGVyLCBsZXZlbCwgZGVidWdfZG9tYWlucyk6CisgICAgICAgIHNlbGYuc3RkbGV2ZWwgPSBsZXZlbAorICAgICAgICBzZWxmLmRlYnVnX2RvbWFpbnMgPSBkZWJ1Z19kb21haW5zCisgICAgICAgIGxvZ2xldmVsID0gbGV2ZWwKKyAgICAgICAgZm9yIGRvbWFpbiBpbiBkZWJ1Z19kb21haW5zOgorICAgICAgICAgICAgaWYgZGVidWdfZG9tYWluc1tkb21haW5dIDwgbG9nbGV2ZWw6CisgICAgICAgICAgICAgICAgbG9nbGV2ZWwgPSBkZWJ1Z19kb21haW5zW2RvbWFpbl0KKyAgICAgICAgaGFuZGxlci5zZXRMZXZlbChsb2dsZXZlbCkKKyAgICAgICAgaGFuZGxlci5hZGRGaWx0ZXIoc2VsZikKKworICAgIGRlZiBmaWx0ZXIoc2VsZiwgcmVjb3JkKToKKyAgICAgICAgaWYgcmVjb3JkLmxldmVsbm8gPj0gc2VsZi5zdGRsZXZlbDoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGlmIHJlY29yZC5uYW1lIGluIHNlbGYuZGVidWdfZG9tYWlucyBhbmQgcmVjb3JkLmxldmVsbm8gPj0gc2VsZi5kZWJ1Z19kb21haW5zW3JlY29yZC5uYW1lXToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorCitjbGFzcyBCQkxvZ0ZpbHRlclN0ZEVycihCQkxvZ0ZpbHRlcik6CisgICAgZGVmIGZpbHRlcihzZWxmLCByZWNvcmQpOgorICAgICAgICBpZiBub3QgQkJMb2dGaWx0ZXIuZmlsdGVyKHNlbGYsIHJlY29yZCk6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgaWYgcmVjb3JkLmxldmVsbm8gPj0gbG9nZ2luZy5FUlJPUjoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorCitjbGFzcyBCQkxvZ0ZpbHRlclN0ZE91dChCQkxvZ0ZpbHRlcik6CisgICAgZGVmIGZpbHRlcihzZWxmLCByZWNvcmQpOgorICAgICAgICBpZiBub3QgQkJMb2dGaWx0ZXIuZmlsdGVyKHNlbGYsIHJlY29yZCk6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgaWYgcmVjb3JkLmxldmVsbm8gPCBsb2dnaW5nLkVSUk9SOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyMgTWVzc2FnZSBjb250cm9sIGZ1bmN0aW9ucworIworCitsb2dnZXJEZWZhdWx0RGVidWdMZXZlbCA9IDAKK2xvZ2dlckRlZmF1bHRWZXJib3NlID0gRmFsc2UKK2xvZ2dlclZlcmJvc2VMb2dzID0gRmFsc2UKK2xvZ2dlckRlZmF1bHREb21haW5zID0gW10KKworZGVmIGluaXRfbXNnY29uZmlnKHZlcmJvc2UsIGRlYnVnLCBkZWJ1Z19kb21haW5zPU5vbmUpOgorICAgICIiIgorICAgIFNldCBkZWZhdWx0IHZlcmJvc2l0eSBhbmQgZGVidWcgbGV2ZWxzIGNvbmZpZyB0aGUgbG9nZ2VyCisgICAgIiIiCisgICAgYmIubXNnLmxvZ2dlckRlZmF1bHREZWJ1Z0xldmVsID0gZGVidWcKKyAgICBiYi5tc2cubG9nZ2VyRGVmYXVsdFZlcmJvc2UgPSB2ZXJib3NlCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgYmIubXNnLmxvZ2dlclZlcmJvc2VMb2dzID0gVHJ1ZQorICAgIGlmIGRlYnVnX2RvbWFpbnM6CisgICAgICAgIGJiLm1zZy5sb2dnZXJEZWZhdWx0RG9tYWlucyA9IGRlYnVnX2RvbWFpbnMKKyAgICBlbHNlOgorICAgICAgICBiYi5tc2cubG9nZ2VyRGVmYXVsdERvbWFpbnMgPSBbXQorCitkZWYgY29uc3RydWN0TG9nT3B0aW9ucygpOgorICAgIGRlYnVnID0gbG9nZ2VyRGVmYXVsdERlYnVnTGV2ZWwKKyAgICB2ZXJib3NlID0gbG9nZ2VyRGVmYXVsdFZlcmJvc2UKKyAgICBkb21haW5zID0gbG9nZ2VyRGVmYXVsdERvbWFpbnMKKworICAgIGlmIGRlYnVnOgorICAgICAgICBsZXZlbCA9IEJCTG9nRm9ybWF0dGVyLkRFQlVHIC0gZGVidWcgKyAxCisgICAgZWxpZiB2ZXJib3NlOgorICAgICAgICBsZXZlbCA9IEJCTG9nRm9ybWF0dGVyLlZFUkJPU0UKKyAgICBlbHNlOgorICAgICAgICBsZXZlbCA9IEJCTG9nRm9ybWF0dGVyLk5PVEUKKworICAgIGRlYnVnX2RvbWFpbnMgPSB7fQorICAgIGZvciAoZG9tYWluYXJnLCBpdGVyYXRvcikgaW4gZ3JvdXBieShkb21haW5zKToKKyAgICAgICAgZGxldmVsID0gbGVuKHR1cGxlKGl0ZXJhdG9yKSkKKyAgICAgICAgZGVidWdfZG9tYWluc1siQml0QmFrZS4lcyIgJSBkb21haW5hcmddID0gbG9nZ2luZy5ERUJVRyAtIGRsZXZlbCArIDEKKyAgICByZXR1cm4gbGV2ZWwsIGRlYnVnX2RvbWFpbnMKKworZGVmIGFkZERlZmF1bHRsb2dGaWx0ZXIoaGFuZGxlciwgY2xzID0gQkJMb2dGaWx0ZXIpOgorICAgIGxldmVsLCBkZWJ1Z19kb21haW5zID0gY29uc3RydWN0TG9nT3B0aW9ucygpCisKKyAgICBjbHMoaGFuZGxlciwgbGV2ZWwsIGRlYnVnX2RvbWFpbnMpCisKKyMKKyMgTWVzc2FnZSBoYW5kbGluZyBmdW5jdGlvbnMKKyMKKworZGVmIGZhdGFsKG1zZ2RvbWFpbiwgbXNnKToKKyAgICBpZiBtc2dkb21haW46CisgICAgICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJCaXRCYWtlLiVzIiAlIG1zZ2RvbWFpbikKKyAgICBlbHNlOgorICAgICAgICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiQml0QmFrZSIpCisgICAgbG9nZ2VyLmNyaXRpY2FsKG1zZykKKyAgICBzeXMuZXhpdCgxKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvbmFtZWR0dXBsZV93aXRoX2FiYy5weSBiL2JpdGJha2UvbGliL2JiL25hbWVkdHVwbGVfd2l0aF9hYmMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJmMmZjNgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL25hbWVkdHVwbGVfd2l0aF9hYmMucHkKQEAgLTAsMCArMSwyNTUgQEAKKyMgaHR0cDovL2NvZGUuYWN0aXZlc3RhdGUuY29tL3JlY2lwZXMvNTc3NjI5LW5hbWVkdHVwbGVhYmMtYWJzdHJhY3QtYmFzZS1jbGFzcy1taXgtaW4tZm9yLW5hbWVkLworIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAoYykgMjAxMSBKYW4gS2FsaXN6ZXdza2kgKHp1bykuIEF2YWlsYWJsZSB1bmRlciB0aGUgTUlUIExpY2Vuc2UuCisKKyIiIgorbmFtZWR0dXBsZV93aXRoX2FiYy5weToKKyogbmFtZWQgdHVwbGUgbWl4LWluICsgQUJDIChhYnN0cmFjdCBiYXNlIGNsYXNzKSByZWNpcGUsCisqIHdvcmtzIHVuZGVyIFB5dGhvbiAyLjYsIDIuNyBhcyB3ZWxsIGFzIDMueC4KKworSW1wb3J0IHRoaXMgbW9kdWxlIHRvIHBhdGNoIGNvbGxlY3Rpb25zLm5hbWVkdHVwbGUoKSBmYWN0b3J5IGZ1bmN0aW9uCistLSBlbnJpY2hpbmcgaXQgd2l0aCB0aGUgJ2FiYycgYXR0cmlidXRlIChhbiBhYnN0cmFjdCBiYXNlIGNsYXNzICsgbWl4LWluCitmb3IgbmFtZWQgdHVwbGVzKSBhbmQgZGVjb3JhdGluZyBpdCB3aXRoIGEgd3JhcHBlciB0aGF0IHJlZ2lzdGVycyBlYWNoCituZXdseSBjcmVhdGVkIG5hbWVkIHR1cGxlIGFzIGEgc3ViY2xhc3Mgb2YgbmFtZWR0dXBsZS5hYmMuCisKK0hvdyB0byBpbXBvcnQ6CisgICAgaW1wb3J0IGNvbGxlY3Rpb25zLCBuYW1lZHR1cGxlX3dpdGhfYWJjCitvcjoKKyAgICBpbXBvcnQgbmFtZWR0dXBsZV93aXRoX2FiYworICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IG5hbWVkdHVwbGUKKyAgICAjIF4gaW4gdGhpcyB2YXJpYW50IHlvdSBtdXN0IGltcG9ydCBuYW1lZHR1cGxlIGZ1bmN0aW9uCisgICAgIyAgICphZnRlciogaW1wb3J0aW5nIG5hbWVkdHVwbGVfd2l0aF9hYmMgbW9kdWxlCitvciBzaW1wbHk6CisgICAgZnJvbSBuYW1lZHR1cGxlX3dpdGhfYWJjIGltcG9ydCBuYW1lZHR1cGxlCisKK1NpbXBsZSB1c2FnZSBleGFtcGxlOgorICAgIGNsYXNzIENyZWRlbnRpYWxzKG5hbWVkdHVwbGUuYWJjKToKKyAgICAgICAgX2ZpZWxkcyA9ICd1c2VybmFtZSBwYXNzd29yZCcKKyAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gKCd7MC5fX2NsYXNzX18uX19uYW1lX199JworICAgICAgICAgICAgICAgICAgICAnKHVzZXJuYW1lPXswLnVzZXJuYW1lfSwgcGFzc3dvcmQ9Li4uKScuZm9ybWF0KHNlbGYpKQorICAgIHByaW50KENyZWRlbnRpYWxzKCJhbGljZSIsICJBbGljZSdzIHBhc3N3b3JkIikpCisKK0ZvciBtb3JlIGFkdmFuY2VkIGV4YW1wbGVzIC0tIHNlZSBiZWxvdyB0aGUgImlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ii4KKyIiIgorCitpbXBvcnQgY29sbGVjdGlvbnMKK2Zyb20gYWJjIGltcG9ydCBBQkNNZXRhLCBhYnN0cmFjdHByb3BlcnR5Citmcm9tIGZ1bmN0b29scyBpbXBvcnQgd3JhcHMKK2Zyb20gc3lzIGltcG9ydCB2ZXJzaW9uX2luZm8KKworX19hbGxfXyA9ICgnbmFtZWR0dXBsZScsKQorX25hbWVkdHVwbGUgPSBjb2xsZWN0aW9ucy5uYW1lZHR1cGxlCisKKworY2xhc3MgX05hbWVkVHVwbGVBQkNNZXRhKEFCQ01ldGEpOgorICAgICcnJ1RoZSBtZXRhY2xhc3MgZm9yIHRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzICsgbWl4LWluIGZvciBuYW1lZCB0dXBsZXMuJycnCisgICAgZGVmIF9fbmV3X18obWNscywgbmFtZSwgYmFzZXMsIG5hbWVzcGFjZSk6CisgICAgICAgIGZpZWxkcyA9IG5hbWVzcGFjZS5nZXQoJ19maWVsZHMnKQorICAgICAgICBmb3IgYmFzZSBpbiBiYXNlczoKKyAgICAgICAgICAgIGlmIGZpZWxkcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZmllbGRzID0gZ2V0YXR0cihiYXNlLCAnX2ZpZWxkcycsIE5vbmUpCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGZpZWxkcywgYWJzdHJhY3Rwcm9wZXJ0eSk6CisgICAgICAgICAgICBiYXNldHVwbGUgPSBfbmFtZWR0dXBsZShuYW1lLCBmaWVsZHMpCisgICAgICAgICAgICBiYXNlcyA9IChiYXNldHVwbGUsKSArIGJhc2VzCisgICAgICAgICAgICBuYW1lc3BhY2UucG9wKCdfZmllbGRzJywgTm9uZSkKKyAgICAgICAgICAgIG5hbWVzcGFjZS5zZXRkZWZhdWx0KCdfX2RvY19fJywgYmFzZXR1cGxlLl9fZG9jX18pCisgICAgICAgICAgICBuYW1lc3BhY2Uuc2V0ZGVmYXVsdCgnX19zbG90c19fJywgKCkpCisgICAgICAgIHJldHVybiBBQkNNZXRhLl9fbmV3X18obWNscywgbmFtZSwgYmFzZXMsIG5hbWVzcGFjZSkKKworCitleGVjKAorICAgICMgUHl0aG9uIDIueCBtZXRhY2xhc3MgZGVjbGFyYXRpb24gc3ludGF4CisgICAgIiIiY2xhc3MgX05hbWVkVHVwbGVBQkMob2JqZWN0KToKKyAgICAgICAgJycnVGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgKyBtaXgtaW4gZm9yIG5hbWVkIHR1cGxlcy4nJycKKyAgICAgICAgX19tZXRhY2xhc3NfXyA9IF9OYW1lZFR1cGxlQUJDTWV0YQorICAgICAgICBfZmllbGRzID0gYWJzdHJhY3Rwcm9wZXJ0eSgpIiIiIGlmIHZlcnNpb25faW5mb1swXSA8IDMgZWxzZQorICAgICMgUHl0aG9uIDMueCBtZXRhY2xhc3MgZGVjbGFyYXRpb24gc3ludGF4CisgICAgIiIiY2xhc3MgX05hbWVkVHVwbGVBQkMobWV0YWNsYXNzPV9OYW1lZFR1cGxlQUJDTWV0YSk6CisgICAgICAgICcnJ1RoZSBhYnN0cmFjdCBiYXNlIGNsYXNzICsgbWl4LWluIGZvciBuYW1lZCB0dXBsZXMuJycnCisgICAgICAgIF9maWVsZHMgPSBhYnN0cmFjdHByb3BlcnR5KCkiIiIKKykKKworCitfbmFtZWR0dXBsZS5hYmMgPSBfTmFtZWRUdXBsZUFCQworI19OYW1lZFR1cGxlQUJDLnJlZ2lzdGVyKHR5cGUodmVyc2lvbl9pbmZvKSkgICMgKGFuZCBzaW1pbGFyLCBpbiB0aGUgZnV0dXJlLi4uKQorCitAd3JhcHMoX25hbWVkdHVwbGUpCitkZWYgbmFtZWR0dXBsZSgqYXJncywgKiprd2FyZ3MpOgorICAgICcnJ05hbWVkIHR1cGxlIGZhY3Rvcnkgd2l0aCBuYW1lZHR1cGxlLmFiYyBzdWJjbGFzcyByZWdpc3RyYXRpb24uJycnCisgICAgY2xzID0gX25hbWVkdHVwbGUoKmFyZ3MsICoqa3dhcmdzKQorICAgIF9OYW1lZFR1cGxlQUJDLnJlZ2lzdGVyKGNscykKKyAgICByZXR1cm4gY2xzCisKK2NvbGxlY3Rpb25zLm5hbWVkdHVwbGUgPSBuYW1lZHR1cGxlCisKKworCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisKKyAgICAnJydFeGFtcGxlcyBhbmQgZXhwbGFuYXRpb25zJycnCisKKyAgICAjIFNpbXBsZSB1c2FnZQorCisgICAgY2xhc3MgTXlSZWNvcmQobmFtZWR0dXBsZS5hYmMpOgorICAgICAgICBfZmllbGRzID0gJ3ggeSB6JyAgIyBzdWNoIGZvcm0gd2lsbCBiZSB0cmFuc2Zvcm1lZCBpbnRvICgneCcsICd5JywgJ3onKQorICAgICAgICBkZWYgX215X2N1c3RvbV9tZXRob2Qoc2VsZik6CisgICAgICAgICAgICByZXR1cm4gbGlzdChzZWxmLl9hc2RpY3QoKS5pdGVtcygpKQorICAgICMgKHRoZSAnX2ZpZWxkcycgYXR0cmlidXRlIGJlbG9uZ3MgdG8gdGhlIG5hbWVkIHR1cGxlIHB1YmxpYyBBUEkgYW55d2F5KQorCisgICAgcmVjID0gTXlSZWNvcmQoMSwgMiwgMykKKyAgICBwcmludChyZWMpCisgICAgcHJpbnQocmVjLl9teV9jdXN0b21fbWV0aG9kKCkpCisgICAgcHJpbnQocmVjLl9yZXBsYWNlKHk9MjIyKSkKKyAgICBwcmludChyZWMuX3JlcGxhY2UoeT0yMjIpLl9teV9jdXN0b21fbWV0aG9kKCkpCisKKyAgICAjIEN1c3RvbSBhYnN0cmFjdCBjbGFzc2VzLi4uCisKKyAgICBjbGFzcyBNeUFic3RyYWN0UmVjb3JkKG5hbWVkdHVwbGUuYWJjKToKKyAgICAgICAgZGVmIF9teV9jdXN0b21fbWV0aG9kKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5fYXNkaWN0KCkuaXRlbXMoKSkKKworICAgIHRyeToKKyAgICAgICAgTXlBYnN0cmFjdFJlY29yZCgpICAjIChhYnN0cmFjdCBjbGFzc2VzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQpCisgICAgZXhjZXB0IFR5cGVFcnJvciBhcyBleGM6CisgICAgICAgIHByaW50KGV4YykKKworICAgIGNsYXNzIEFub3RoZXJBYnN0cmFjdFJlY29yZChNeUFic3RyYWN0UmVjb3JkKToKKyAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gJzw8PHswfT4+PicuZm9ybWF0KHN1cGVyKEFub3RoZXJBYnN0cmFjdFJlY29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZikuX19zdHJfXygpKQorCisgICAgIyAuLi5hbmQgdGhlaXIgbm9uLWFic3RyYWN0IHN1YmNsYXNzZXMKKworICAgIGNsYXNzIE15UmVjb3JkMihNeUFic3RyYWN0UmVjb3JkKToKKyAgICAgICAgX2ZpZWxkcyA9ICdhLCBiJworCisgICAgY2xhc3MgTXlSZWNvcmQzKEFub3RoZXJBYnN0cmFjdFJlY29yZCk6CisgICAgICAgIF9maWVsZHMgPSAncCcsICdxJywgJ3InCisKKyAgICByZWMyID0gTXlSZWNvcmQyKCdmb28nLCAnYmFyJykKKyAgICBwcmludChyZWMyKQorICAgIHByaW50KHJlYzIuX215X2N1c3RvbV9tZXRob2QoKSkKKyAgICBwcmludChyZWMyLl9yZXBsYWNlKGI9MjIyKSkKKyAgICBwcmludChyZWMyLl9yZXBsYWNlKGI9MjIyKS5fbXlfY3VzdG9tX21ldGhvZCgpKQorCisgICAgcmVjMyA9IE15UmVjb3JkMygnZm9vJywgJ2JhcicsICdiYXonKQorICAgIHByaW50KHJlYzMpCisgICAgcHJpbnQocmVjMy5fbXlfY3VzdG9tX21ldGhvZCgpKQorICAgIHByaW50KHJlYzMuX3JlcGxhY2UocT0yMjIpKQorICAgIHByaW50KHJlYzMuX3JlcGxhY2UocT0yMjIpLl9teV9jdXN0b21fbWV0aG9kKCkpCisKKyAgICMgWW91IGNhbiBhbHNvIHN1YmNsYXNzIG5vbi1hYnN0cmFjdCBvbmVzLi4uCisKKyAgICBjbGFzcyBNeVJlY29yZDMzKE15UmVjb3JkMyk6CisgICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuICc8IHswIXJ9LCAuLi4sIHswIXJ9ID4nLmZvcm1hdChzZWxmLnAsIHNlbGYucikKKworICAgIHJlYzMzID0gTXlSZWNvcmQzMygnZm9vJywgJ2JhcicsICdiYXonKQorICAgIHByaW50KHJlYzMzKQorICAgIHByaW50KHJlYzMzLl9teV9jdXN0b21fbWV0aG9kKCkpCisgICAgcHJpbnQocmVjMzMuX3JlcGxhY2UocT0yMjIpKQorICAgIHByaW50KHJlYzMzLl9yZXBsYWNlKHE9MjIyKS5fbXlfY3VzdG9tX21ldGhvZCgpKQorCisgICAgIyAuLi5hbmQgZXZlbiBvdmVycmlkZSB0aGUgbWFnaWMgJ19maWVsZHMnIGF0dHJpYnV0ZSBhZ2FpbgorCisgICAgY2xhc3MgTXlSZWNvcmQzNDUoTXlSZWNvcmQzKToKKyAgICAgICAgX2ZpZWxkcyA9ICdlIGYgZyBoIGkgaiBrJworCisgICAgcmVjMzQ1ID0gTXlSZWNvcmQzNDUoMSwgMiwgMywgNCwgMywgMiwgMSkKKyAgICBwcmludChyZWMzNDUpCisgICAgcHJpbnQocmVjMzQ1Ll9teV9jdXN0b21fbWV0aG9kKCkpCisgICAgcHJpbnQocmVjMzQ1Ll9yZXBsYWNlKGY9MjIyKSkKKyAgICBwcmludChyZWMzNDUuX3JlcGxhY2UoZj0yMjIpLl9teV9jdXN0b21fbWV0aG9kKCkpCisKKyAgICAjIE1peGluZy1pbiBzb21lIG90aGVyIGNsYXNzZXMgaXMgYWxzbyBwb3NzaWJsZToKKworICAgIGNsYXNzIE15TWl4SW4ob2JqZWN0KToKKyAgICAgICAgZGVmIG1ldGhvZChzZWxmKToKKyAgICAgICAgICAgIHJldHVybiAiTXlNaXhJbi5tZXRob2QoKSBjYWxsZWQiCisgICAgICAgIGRlZiBfbXlfY3VzdG9tX21ldGhvZChzZWxmKToKKyAgICAgICAgICAgIHJldHVybiAiTXlNaXhJbi5fbXlfY3VzdG9tX21ldGhvZCgpIGNhbGxlZCIKKyAgICAgICAgZGVmIGNvdW50KHNlbGYsIGl0ZW0pOgorICAgICAgICAgICAgcmV0dXJuICJNeU1peEluLmNvdW50KHswfSkgY2FsbGVkIi5mb3JtYXQoaXRlbSkKKyAgICAgICAgZGVmIF9hc2RpY3Qoc2VsZik6ICAjIChjYW5ub3Qgb3ZlcnJpZGUgYSBuYW1lZHR1cGxlIG1ldGhvZCwgc2VlIGJlbG93KQorICAgICAgICAgICAgcmV0dXJuICJNeU1peEluLl9hc2RpY3QoKSBjYWxsZWQiCisKKyAgICBjbGFzcyBNeVJlY29yZDQoTXlSZWNvcmQzMywgTXlNaXhJbik6ICAjIG1peC1pbiBvbiB0aGUgcmlnaHQKKyAgICAgICAgX2ZpZWxkcyA9ICdqIGsgbCB4JworCisgICAgY2xhc3MgTXlSZWNvcmQ1KE15TWl4SW4sIE15UmVjb3JkMzMpOiAgIyBtaXgtaW4gb24gdGhlIGxlZnQKKyAgICAgICAgX2ZpZWxkcyA9ICdqIGsgbCB4IHknCisKKyAgICByZWM0ID0gTXlSZWNvcmQ0KDEsIDIsIDMsIDIpCisgICAgcHJpbnQocmVjNCkKKyAgICBwcmludChyZWM0Lm1ldGhvZCgpKQorICAgIHByaW50KHJlYzQuX215X2N1c3RvbV9tZXRob2QoKSkgICMgTXlSZWNvcmQzMydzCisgICAgcHJpbnQocmVjNC5jb3VudCgyKSkgICMgdHVwbGUncworICAgIHByaW50KHJlYzQuX3JlcGxhY2Uoaz0yMjIpKQorICAgIHByaW50KHJlYzQuX3JlcGxhY2Uoaz0yMjIpLm1ldGhvZCgpKQorICAgIHByaW50KHJlYzQuX3JlcGxhY2Uoaz0yMjIpLl9teV9jdXN0b21fbWV0aG9kKCkpICAjIE15UmVjb3JkMzMncworICAgIHByaW50KHJlYzQuX3JlcGxhY2Uoaz0yMjIpLmNvdW50KDgpKSAgIyB0dXBsZSdzCisKKyAgICByZWM1ID0gTXlSZWNvcmQ1KDEsIDIsIDMsIDIsIDEpCisgICAgcHJpbnQocmVjNSkKKyAgICBwcmludChyZWM1Lm1ldGhvZCgpKQorICAgIHByaW50KHJlYzUuX215X2N1c3RvbV9tZXRob2QoKSkgICMgTXlNaXhJbidzCisgICAgcHJpbnQocmVjNS5jb3VudCgyKSkgICMgTXlNaXhJbidzCisgICAgcHJpbnQocmVjNS5fcmVwbGFjZShrPTIyMikpCisgICAgcHJpbnQocmVjNS5fcmVwbGFjZShrPTIyMikubWV0aG9kKCkpCisgICAgcHJpbnQocmVjNS5fcmVwbGFjZShrPTIyMikuX215X2N1c3RvbV9tZXRob2QoKSkgICMgTXlNaXhJbidzCisgICAgcHJpbnQocmVjNS5fcmVwbGFjZShrPTIyMikuY291bnQoMikpICAjIE15TWl4SW4ncworCisgICAgIyBOb3RlIHRoYXQgYmVoYXZpb3I6IHRoZSBzdGFuZGFyZCBuYW1lZHR1cGxlIG1ldGhvZHMgY2Fubm90IGJlCisgICAgIyBvdmVycmlkZGVuIGJ5IGEgZm9yZWlnbiBtaXgtaW4gLS0gZXZlbiBpZiB0aGUgbWl4LWluIGlzIGRlY2xhcmVkCisgICAgIyBhcyB0aGUgbGVmdG1vc3QgYmFzZSBjbGFzcyAoYnV0LCBvYnZpb3VzbHksIHlvdSBjYW4gb3ZlcnJpZGUgdGhlbQorICAgICMgaW4gdGhlIGRlZmluZWQgY2xhc3Mgb3IgaXRzIHN1YmNsYXNzZXMpOgorCisgICAgcHJpbnQocmVjNC5fYXNkaWN0KCkpICAjIChyZXR1cm5zIGEgZGljdCwgbm90ICJNeU1peEluLl9hc2RpY3QoKSBjYWxsZWQiKQorICAgIHByaW50KHJlYzUuX2FzZGljdCgpKSAgIyAocmV0dXJucyBhIGRpY3QsIG5vdCAiTXlNaXhJbi5fYXNkaWN0KCkgY2FsbGVkIikKKworICAgIGNsYXNzIE15UmVjb3JkNihNeVJlY29yZDMzKToKKyAgICAgICAgX2ZpZWxkcyA9ICdqIGsgbCB4IHkgeicKKyAgICAgICAgZGVmIF9hc2RpY3Qoc2VsZik6CisgICAgICAgICAgICByZXR1cm4gIk15UmVjb3JkNi5fYXNkaWN0KCkgY2FsbGVkIgorICAgIHJlYzYgPSBNeVJlY29yZDYoMSwgMiwgMywgMSwgMiwgMykKKyAgICBwcmludChyZWM2Ll9hc2RpY3QoKSkgICMgKHRoaXMgcmV0dXJucyAiTXlSZWNvcmQ2Ll9hc2RpY3QoKSBjYWxsZWQiKQorCisgICAgIyBBbGwgdGhhdCByZWNvcmQgY2xhc3NlcyBhcmUgcmVhbCBzdWJjbGFzc2VzIG9mIG5hbWVkdHVwbGUuYWJjOgorCisgICAgYXNzZXJ0IGlzc3ViY2xhc3MoTXlSZWNvcmQsIG5hbWVkdHVwbGUuYWJjKQorICAgIGFzc2VydCBpc3N1YmNsYXNzKE15QWJzdHJhY3RSZWNvcmQsIG5hbWVkdHVwbGUuYWJjKQorICAgIGFzc2VydCBpc3N1YmNsYXNzKEFub3RoZXJBYnN0cmFjdFJlY29yZCwgbmFtZWR0dXBsZS5hYmMpCisgICAgYXNzZXJ0IGlzc3ViY2xhc3MoTXlSZWNvcmQyLCBuYW1lZHR1cGxlLmFiYykKKyAgICBhc3NlcnQgaXNzdWJjbGFzcyhNeVJlY29yZDMsIG5hbWVkdHVwbGUuYWJjKQorICAgIGFzc2VydCBpc3N1YmNsYXNzKE15UmVjb3JkMzMsIG5hbWVkdHVwbGUuYWJjKQorICAgIGFzc2VydCBpc3N1YmNsYXNzKE15UmVjb3JkMzQ1LCBuYW1lZHR1cGxlLmFiYykKKyAgICBhc3NlcnQgaXNzdWJjbGFzcyhNeVJlY29yZDQsIG5hbWVkdHVwbGUuYWJjKQorICAgIGFzc2VydCBpc3N1YmNsYXNzKE15UmVjb3JkNSwgbmFtZWR0dXBsZS5hYmMpCisgICAgYXNzZXJ0IGlzc3ViY2xhc3MoTXlSZWNvcmQ2LCBuYW1lZHR1cGxlLmFiYykKKworICAgICMgLi4uYnV0IGFic3RyYWN0IG9uZXMgYXJlIG5vdCBzdWJjbGFzc2VzIG9mIHR1cGxlCisgICAgIyAoYW5kIHRoaXMgaXMgd2hhdCB5b3UgcHJvYmFibHkgd2FudCk6CisKKyAgICBhc3NlcnQgbm90IGlzc3ViY2xhc3MoTXlBYnN0cmFjdFJlY29yZCwgdHVwbGUpCisgICAgYXNzZXJ0IG5vdCBpc3N1YmNsYXNzKEFub3RoZXJBYnN0cmFjdFJlY29yZCwgdHVwbGUpCisKKyAgICBhc3NlcnQgaXNzdWJjbGFzcyhNeVJlY29yZCwgdHVwbGUpCisgICAgYXNzZXJ0IGlzc3ViY2xhc3MoTXlSZWNvcmQyLCB0dXBsZSkKKyAgICBhc3NlcnQgaXNzdWJjbGFzcyhNeVJlY29yZDMsIHR1cGxlKQorICAgIGFzc2VydCBpc3N1YmNsYXNzKE15UmVjb3JkMzMsIHR1cGxlKQorICAgIGFzc2VydCBpc3N1YmNsYXNzKE15UmVjb3JkMzQ1LCB0dXBsZSkKKyAgICBhc3NlcnQgaXNzdWJjbGFzcyhNeVJlY29yZDQsIHR1cGxlKQorICAgIGFzc2VydCBpc3N1YmNsYXNzKE15UmVjb3JkNSwgdHVwbGUpCisgICAgYXNzZXJ0IGlzc3ViY2xhc3MoTXlSZWNvcmQ2LCB0dXBsZSkKKworICAgICMgTmFtZWQgdHVwbGUgY2xhc3NlcyBjcmVhdGVkIHdpdGggbmFtZWR0dXBsZSgpIGZhY3RvcnkgZnVuY3Rpb24KKyAgICAjIChpbiB0aGUgInRyYWRpdGlvbmFsIiB3YXkpIGFyZSByZWdpc3RlcmVkIGFzICJ2aXJ0dWFsIiBzdWJjbGFzc2VzCisgICAgIyBvZiBuYW1lZHR1cGxlLmFiYzoKKworICAgIE15VHVwbGUgPSBuYW1lZHR1cGxlKCdNeVR1cGxlJywgJ2EgYiBjJykKKyAgICBtdCA9IE15VHVwbGUoMSwgMiwgMykKKyAgICBhc3NlcnQgaXNzdWJjbGFzcyhNeVR1cGxlLCBuYW1lZHR1cGxlLmFiYykKKyAgICBhc3NlcnQgaXNpbnN0YW5jZShtdCwgbmFtZWR0dXBsZS5hYmMpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9wYXJzZS9fX2luaXRfXy5weSBiL2JpdGJha2UvbGliL2JiL3BhcnNlL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZWM3MWYKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9wYXJzZS9fX2luaXRfXy5weQpAQCAtMCwwICsxLDE3MCBAQAorIiIiCitCaXRCYWtlIFBhcnNlcnMKKworRmlsZSBwYXJzZXJzIGZvciB0aGUgQml0QmFrZSBidWlsZCB0b29scy4KKworIiIiCisKKworIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgIENocmlzIExhcnNvbgorIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgIFBoaWwgQmx1bmRlbGwKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisjCisjIEJhc2VkIG9uIGZ1bmN0aW9ucyBmcm9tIHRoZSBiYXNlIGJiIG1vZHVsZSwgQ29weXJpZ2h0IDIwMDMgSG9sZ2VyIFNjaHVyaWcKKworaGFuZGxlcnMgPSBbXQorCitpbXBvcnQgZXJybm8KK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgb3MKK2ltcG9ydCBzdGF0CitpbXBvcnQgYmIKK2ltcG9ydCBiYi51dGlscworaW1wb3J0IGJiLnNpZ2dlbgorCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiQml0QmFrZS5QYXJzaW5nIikKKworY2xhc3MgUGFyc2VFcnJvcihFeGNlcHRpb24pOgorICAgICIiIkV4Y2VwdGlvbiByYWlzZWQgd2hlbiBwYXJzaW5nIGZhaWxzIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1zZywgZmlsZW5hbWUsIGxpbmVubz0wKToKKyAgICAgICAgc2VsZi5tc2cgPSBtc2cKKyAgICAgICAgc2VsZi5maWxlbmFtZSA9IGZpbGVuYW1lCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisgICAgICAgIEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBtc2csIGZpbGVuYW1lLCBsaW5lbm8pCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5saW5lbm86CisgICAgICAgICAgICByZXR1cm4gIlBhcnNlRXJyb3IgYXQgJXM6JWQ6ICVzIiAlIChzZWxmLmZpbGVuYW1lLCBzZWxmLmxpbmVubywgc2VsZi5tc2cpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gIlBhcnNlRXJyb3IgaW4gJXM6ICVzIiAlIChzZWxmLmZpbGVuYW1lLCBzZWxmLm1zZykKKworY2xhc3MgU2tpcFJlY2lwZShFeGNlcHRpb24pOgorICAgICIiIkV4Y2VwdGlvbiByYWlzZWQgdG8gc2tpcCB0aGlzIHJlY2lwZSIiIgorCitjbGFzcyBTa2lwUGFja2FnZShTa2lwUmVjaXBlKToKKyAgICAiIiJFeGNlcHRpb24gcmFpc2VkIHRvIHNraXAgdGhpcyByZWNpcGUgKHVzZSBTa2lwUmVjaXBlIGluIG5ldyBjb2RlKSIiIgorCitfX210aW1lX2NhY2hlID0ge30KK2RlZiBjYWNoZWRfbXRpbWUoZik6CisgICAgaWYgZiBub3QgaW4gX19tdGltZV9jYWNoZToKKyAgICAgICAgX19tdGltZV9jYWNoZVtmXSA9IG9zLnN0YXQoZilbc3RhdC5TVF9NVElNRV0KKyAgICByZXR1cm4gX19tdGltZV9jYWNoZVtmXQorCitkZWYgY2FjaGVkX210aW1lX25vZXJyb3IoZik6CisgICAgaWYgZiBub3QgaW4gX19tdGltZV9jYWNoZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgX19tdGltZV9jYWNoZVtmXSA9IG9zLnN0YXQoZilbc3RhdC5TVF9NVElNRV0KKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gMAorICAgIHJldHVybiBfX210aW1lX2NhY2hlW2ZdCisKK2RlZiB1cGRhdGVfbXRpbWUoZik6CisgICAgdHJ5OgorICAgICAgICBfX210aW1lX2NhY2hlW2ZdID0gb3Muc3RhdChmKVtzdGF0LlNUX01USU1FXQorICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICBpZiBmIGluIF9fbXRpbWVfY2FjaGU6CisgICAgICAgICAgICBkZWwgX19tdGltZV9jYWNoZVtmXQorICAgICAgICByZXR1cm4gMAorICAgIHJldHVybiBfX210aW1lX2NhY2hlW2ZdCisKK2RlZiB1cGRhdGVfY2FjaGUoZik6CisgICAgaWYgZiBpbiBfX210aW1lX2NhY2hlOgorICAgICAgICBsb2dnZXIuZGVidWcoMSwgIlVwZGF0aW5nIG10aW1lIGNhY2hlIGZvciAlcyIgJSBmKQorICAgICAgICB1cGRhdGVfbXRpbWUoZikKKworZGVmIG1hcmtfZGVwZW5kZW5jeShkLCBmKToKKyAgICBpZiBmLnN0YXJ0c3dpdGgoJy4vJyk6CisgICAgICAgIGYgPSAiJXMvJXMiICUgKG9zLmdldGN3ZCgpLCBmWzI6XSkKKyAgICBkZXBzID0gKGQuZ2V0VmFyKCdfX2RlcGVuZHMnLCBGYWxzZSkgb3IgW10pCisgICAgcyA9IChmLCBjYWNoZWRfbXRpbWVfbm9lcnJvcihmKSkKKyAgICBpZiBzIG5vdCBpbiBkZXBzOgorICAgICAgICBkZXBzLmFwcGVuZChzKQorICAgICAgICBkLnNldFZhcignX19kZXBlbmRzJywgZGVwcykKKworZGVmIGNoZWNrX2RlcGVuZGVuY3koZCwgZik6CisgICAgcyA9IChmLCBjYWNoZWRfbXRpbWVfbm9lcnJvcihmKSkKKyAgICBkZXBzID0gKGQuZ2V0VmFyKCdfX2RlcGVuZHMnLCBGYWxzZSkgb3IgW10pCisgICAgcmV0dXJuIHMgaW4gZGVwcworICAgCitkZWYgc3VwcG9ydHMoZm4sIGRhdGEpOgorICAgICIiIlJldHVybnMgdHJ1ZSBpZiB3ZSBoYXZlIGEgaGFuZGxlciBmb3IgdGhpcyBmaWxlLCBmYWxzZSBvdGhlcndpc2UiIiIKKyAgICBmb3IgaCBpbiBoYW5kbGVyczoKKyAgICAgICAgaWYgaFsnc3VwcG9ydHMnXShmbiwgZGF0YSk6CisgICAgICAgICAgICByZXR1cm4gMQorICAgIHJldHVybiAwCisKK2RlZiBoYW5kbGUoZm4sIGRhdGEsIGluY2x1ZGUgPSAwKToKKyAgICAiIiJDYWxsIHRoZSBoYW5kbGVyIHRoYXQgaXMgYXBwcm9wcmlhdGUgZm9yIHRoaXMgZmlsZSIiIgorICAgIGZvciBoIGluIGhhbmRsZXJzOgorICAgICAgICBpZiBoWydzdXBwb3J0cyddKGZuLCBkYXRhKToKKyAgICAgICAgICAgIHdpdGggZGF0YS5pbmNoaXN0b3J5LmluY2x1ZGUoZm4pOgorICAgICAgICAgICAgICAgIHJldHVybiBoWydoYW5kbGUnXShmbiwgZGF0YSwgaW5jbHVkZSkKKyAgICByYWlzZSBQYXJzZUVycm9yKCJub3QgYSBCaXRCYWtlIGZpbGUiLCBmbikKKworZGVmIGluaXQoZm4sIGRhdGEpOgorICAgIGZvciBoIGluIGhhbmRsZXJzOgorICAgICAgICBpZiBoWydzdXBwb3J0cyddKGZuKToKKyAgICAgICAgICAgIHJldHVybiBoWydpbml0J10oZGF0YSkKKworZGVmIGluaXRfcGFyc2VyKGQpOgorICAgIGJiLnBhcnNlLnNpZ2dlbiA9IGJiLnNpZ2dlbi5pbml0KGQpCisKK2RlZiByZXNvbHZlX2ZpbGUoZm4sIGQpOgorICAgIGlmIG5vdCBvcy5wYXRoLmlzYWJzKGZuKToKKyAgICAgICAgYmJwYXRoID0gZC5nZXRWYXIoIkJCUEFUSCIsIFRydWUpCisgICAgICAgIG5ld2ZuLCBhdHRlbXB0cyA9IGJiLnV0aWxzLndoaWNoKGJicGF0aCwgZm4sIGhpc3Rvcnk9VHJ1ZSkKKyAgICAgICAgZm9yIGFmIGluIGF0dGVtcHRzOgorICAgICAgICAgICAgbWFya19kZXBlbmRlbmN5KGQsIGFmKQorICAgICAgICBpZiBub3QgbmV3Zm46CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yKGVycm5vLkVOT0VOVCwgImZpbGUgJXMgbm90IGZvdW5kIGluICVzIiAlIChmbiwgYmJwYXRoKSkKKyAgICAgICAgZm4gPSBuZXdmbgorCisgICAgbWFya19kZXBlbmRlbmN5KGQsIGZuKQorICAgIGlmIG5vdCBvcy5wYXRoLmlzZmlsZShmbik6CisgICAgICAgIHJhaXNlIElPRXJyb3IoZXJybm8uRU5PRU5ULCAiZmlsZSAlcyBub3QgZm91bmQiICUgZm4pCisKKyAgICByZXR1cm4gZm4KKworIyBVc2VkIGJ5IE9wZW5FbWJlZGRlZCBtZXRhZGF0YQorX19wa2dzcGxpdF9jYWNoZV9fPXt9CitkZWYgdmFyc19mcm9tX2ZpbGUobXlwa2csIGQpOgorICAgIGlmIG5vdCBteXBrZyBvciBub3QgbXlwa2cuZW5kc3dpdGgoKCIuYmIiLCAiLmJiYXBwZW5kIikpOgorICAgICAgICByZXR1cm4gKE5vbmUsIE5vbmUsIE5vbmUpCisgICAgaWYgbXlwa2cgaW4gX19wa2dzcGxpdF9jYWNoZV9fOgorICAgICAgICByZXR1cm4gX19wa2dzcGxpdF9jYWNoZV9fW215cGtnXQorCisgICAgbXlmaWxlID0gb3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLmJhc2VuYW1lKG15cGtnKSkKKyAgICBwYXJ0cyA9IG15ZmlsZVswXS5zcGxpdCgnXycpCisgICAgX19wa2dzcGxpdF9jYWNoZV9fW215cGtnXSA9IHBhcnRzCisgICAgaWYgbGVuKHBhcnRzKSA+IDM6CisgICAgICAgIHJhaXNlIFBhcnNlRXJyb3IoIlVuYWJsZSB0byBnZW5lcmF0ZSBkZWZhdWx0IHZhcmlhYmxlcyBmcm9tIGZpbGVuYW1lICh0b28gbWFueSB1bmRlcnNjb3JlcykiLCBteXBrZykKKyAgICBleHAgPSAzIC0gbGVuKHBhcnRzKQorICAgIHRtcGxpc3QgPSBbXQorICAgIHdoaWxlIGV4cCAhPSAwOgorICAgICAgICBleHAgLT0gMQorICAgICAgICB0bXBsaXN0LmFwcGVuZChOb25lKQorICAgIHBhcnRzLmV4dGVuZCh0bXBsaXN0KQorICAgIHJldHVybiBwYXJ0cworCitkZWYgZ2V0X2ZpbGVfZGVwZW5kcyhkKToKKyAgICAnJydSZXR1cm4gdGhlIGRlcGVuZGVudCBmaWxlcycnJworICAgIGRlcF9maWxlcyA9IFtdCisgICAgZGVwZW5kcyA9IGQuZ2V0VmFyKCdfX2Jhc2VfZGVwZW5kcycsIFRydWUpIG9yIFtdCisgICAgZGVwZW5kcyA9IGRlcGVuZHMgKyAoZC5nZXRWYXIoJ19fZGVwZW5kcycsIFRydWUpIG9yIFtdKQorICAgIGZvciAoZm4sIF8pIGluIGRlcGVuZHM6CisgICAgICAgIGRlcF9maWxlcy5hcHBlbmQob3MucGF0aC5hYnNwYXRoKGZuKSkKKyAgICByZXR1cm4gIiAiLmpvaW4oZGVwX2ZpbGVzKQorCitmcm9tIGJiLnBhcnNlLnBhcnNlX3B5IGltcG9ydCBfX3ZlcnNpb25fXywgQ29uZkhhbmRsZXIsIEJCSGFuZGxlcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvcGFyc2UvYXN0LnB5IGIvYml0YmFrZS9saWIvYmIvcGFyc2UvYXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZGIxODAKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9wYXJzZS9hc3QucHkKQEAgLTAsMCArMSw0ODEgQEAKKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisiIiIKKyBBYnN0cmFjdFN5bnRheFRyZWUgY2xhc3NlcyBmb3IgdGhlIEJpdGJha2UgbGFuZ3VhZ2UKKyIiIgorCisjIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCBDaHJpcyBMYXJzb24KKyMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0IFBoaWwgQmx1bmRlbGwKKyMgQ29weXJpZ2h0IChDKSAyMDA5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0Citmcm9tIGZ1dHVyZV9idWlsdGlucyBpbXBvcnQgZmlsdGVyCitpbXBvcnQgcmUKK2ltcG9ydCBzdHJpbmcKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgYmIKK2ltcG9ydCBpdGVydG9vbHMKK2Zyb20gYmIgaW1wb3J0IG1ldGhvZHBvb2wKK2Zyb20gYmIucGFyc2UgaW1wb3J0IGxvZ2dlcgorCitfYmJ2ZXJzaW9uc19yZSA9IHJlLmNvbXBpbGUociJcWyg/UDxmcm9tPlswLTldKyktKD9QPHRvPlswLTldKylcXSIpCisKK2NsYXNzIFN0YXRlbWVudEdyb3VwKGxpc3QpOgorICAgIGRlZiBldmFsKHNlbGYsIGRhdGEpOgorICAgICAgICBmb3Igc3RhdGVtZW50IGluIHNlbGY6CisgICAgICAgICAgICBzdGF0ZW1lbnQuZXZhbChkYXRhKQorCitjbGFzcyBBc3ROb2RlKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm8pOgorICAgICAgICBzZWxmLmZpbGVuYW1lID0gZmlsZW5hbWUKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworY2xhc3MgSW5jbHVkZU5vZGUoQXN0Tm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm8sIHdoYXRfZmlsZSwgZm9yY2UpOgorICAgICAgICBBc3ROb2RlLl9faW5pdF9fKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm8pCisgICAgICAgIHNlbGYud2hhdF9maWxlID0gd2hhdF9maWxlCisgICAgICAgIHNlbGYuZm9yY2UgPSBmb3JjZQorCisgICAgZGVmIGV2YWwoc2VsZiwgZGF0YSk6CisgICAgICAgICIiIgorICAgICAgICBJbmNsdWRlIHRoZSBmaWxlIGFuZCBldmFsdWF0ZSB0aGUgc3RhdGVtZW50cworICAgICAgICAiIiIKKyAgICAgICAgcyA9IGRhdGEuZXhwYW5kKHNlbGYud2hhdF9maWxlKQorICAgICAgICBsb2dnZXIuZGVidWcoMiwgIkNPTkYgJXM6JXM6IGluY2x1ZGluZyAlcyIsIHNlbGYuZmlsZW5hbWUsIHNlbGYubGluZW5vLCBzKQorCisgICAgICAgICMgVE9ETzogQ2FjaGUgdGhvc2UgaW5jbHVkZXMuLi4gbWF5YmUgbm90IGhlcmUgdGhvdWdoCisgICAgICAgIGlmIHNlbGYuZm9yY2U6CisgICAgICAgICAgICBiYi5wYXJzZS5Db25mSGFuZGxlci5pbmNsdWRlKHNlbGYuZmlsZW5hbWUsIHMsIHNlbGYubGluZW5vLCBkYXRhLCAiaW5jbHVkZSByZXF1aXJlZCIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBiYi5wYXJzZS5Db25mSGFuZGxlci5pbmNsdWRlKHNlbGYuZmlsZW5hbWUsIHMsIHNlbGYubGluZW5vLCBkYXRhLCBGYWxzZSkKKworY2xhc3MgRXhwb3J0Tm9kZShBc3ROb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWUsIGxpbmVubywgdmFyKToKKyAgICAgICAgQXN0Tm9kZS5fX2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgbGluZW5vKQorICAgICAgICBzZWxmLnZhciA9IHZhcgorCisgICAgZGVmIGV2YWwoc2VsZiwgZGF0YSk6CisgICAgICAgIGRhdGEuc2V0VmFyRmxhZyhzZWxmLnZhciwgImV4cG9ydCIsIDEsIG9wID0gJ2V4cG9ydGVkJykKKworY2xhc3MgRGF0YU5vZGUoQXN0Tm9kZSk6CisgICAgIiIiCisgICAgVmFyaW91cyBkYXRhIHJlbGF0ZWQgdXBkYXRlcy4gRm9yIHRoZSBzYWtlIG9mIHNhbml0eQorICAgIHdlIGhhdmUgb25lIGNsYXNzIGRvaW5nIGFsbCB0aGlzLiBUaGlzIG1lYW5zIHRoYXQgYWxsCisgICAgdGhpcyBuZWVkIHRvIGJlIHJlLWV2YWx1YXRlZC4uLiB3ZSBtaWdodCBiZSBhYmxlIHRvIGRvCisgICAgdGhhdCBmYXN0ZXIgd2l0aCBtdWx0aXBsZSBjbGFzc2VzLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgbGluZW5vLCBncm91cGQpOgorICAgICAgICBBc3ROb2RlLl9faW5pdF9fKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm8pCisgICAgICAgIHNlbGYuZ3JvdXBkID0gZ3JvdXBkCisKKyAgICBkZWYgZ2V0RnVuYyhzZWxmLCBrZXksIGRhdGEpOgorICAgICAgICBpZiAnZmxhZycgaW4gc2VsZi5ncm91cGQgYW5kIHNlbGYuZ3JvdXBkWydmbGFnJ10gIT0gTm9uZToKKyAgICAgICAgICAgIHJldHVybiBkYXRhLmdldFZhckZsYWcoa2V5LCBzZWxmLmdyb3VwZFsnZmxhZyddLCBub3dlYWtkZWZhdWx0PVRydWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gZGF0YS5nZXRWYXIoa2V5LCBGYWxzZSwgbm93ZWFrZGVmYXVsdD1UcnVlLCBwYXJzaW5nPVRydWUpCisKKyAgICBkZWYgZXZhbChzZWxmLCBkYXRhKToKKyAgICAgICAgZ3JvdXBkID0gc2VsZi5ncm91cGQKKyAgICAgICAga2V5ID0gZ3JvdXBkWyJ2YXIiXQorICAgICAgICBsb2dpbmZvID0geworICAgICAgICAgICAgJ3ZhcmlhYmxlJzoga2V5LAorICAgICAgICAgICAgJ2ZpbGUnOiBzZWxmLmZpbGVuYW1lLAorICAgICAgICAgICAgJ2xpbmUnOiBzZWxmLmxpbmVubywKKyAgICAgICAgfQorICAgICAgICBpZiAiZXhwIiBpbiBncm91cGQgYW5kIGdyb3VwZFsiZXhwIl0gIT0gTm9uZToKKyAgICAgICAgICAgIGRhdGEuc2V0VmFyRmxhZyhrZXksICJleHBvcnQiLCAxLCBvcCA9ICdleHBvcnRlZCcsICoqbG9naW5mbykKKworICAgICAgICBvcCA9ICJzZXQiCisgICAgICAgIGlmICJxdWVzIiBpbiBncm91cGQgYW5kIGdyb3VwZFsicXVlcyJdICE9IE5vbmU6CisgICAgICAgICAgICB2YWwgPSBzZWxmLmdldEZ1bmMoa2V5LCBkYXRhKQorICAgICAgICAgICAgb3AgPSAic2V0PyIKKyAgICAgICAgICAgIGlmIHZhbCA9PSBOb25lOgorICAgICAgICAgICAgICAgIHZhbCA9IGdyb3VwZFsidmFsdWUiXQorICAgICAgICBlbGlmICJjb2xvbiIgaW4gZ3JvdXBkIGFuZCBncm91cGRbImNvbG9uIl0gIT0gTm9uZToKKyAgICAgICAgICAgIGUgPSBkYXRhLmNyZWF0ZUNvcHkoKQorICAgICAgICAgICAgYmIuZGF0YS51cGRhdGVfZGF0YShlKQorICAgICAgICAgICAgb3AgPSAiaW1tZWRpYXRlIgorICAgICAgICAgICAgdmFsID0gZS5leHBhbmQoZ3JvdXBkWyJ2YWx1ZSJdLCBrZXkgKyAiWzo9XSIpCisgICAgICAgIGVsaWYgImFwcGVuZCIgaW4gZ3JvdXBkIGFuZCBncm91cGRbImFwcGVuZCJdICE9IE5vbmU6CisgICAgICAgICAgICBvcCA9ICJhcHBlbmQiCisgICAgICAgICAgICB2YWwgPSAiJXMgJXMiICUgKChzZWxmLmdldEZ1bmMoa2V5LCBkYXRhKSBvciAiIiksIGdyb3VwZFsidmFsdWUiXSkKKyAgICAgICAgZWxpZiAicHJlcGVuZCIgaW4gZ3JvdXBkIGFuZCBncm91cGRbInByZXBlbmQiXSAhPSBOb25lOgorICAgICAgICAgICAgb3AgPSAicHJlcGVuZCIKKyAgICAgICAgICAgIHZhbCA9ICIlcyAlcyIgJSAoZ3JvdXBkWyJ2YWx1ZSJdLCAoc2VsZi5nZXRGdW5jKGtleSwgZGF0YSkgb3IgIiIpKQorICAgICAgICBlbGlmICJwb3N0ZG90IiBpbiBncm91cGQgYW5kIGdyb3VwZFsicG9zdGRvdCJdICE9IE5vbmU6CisgICAgICAgICAgICBvcCA9ICJwb3N0ZG90IgorICAgICAgICAgICAgdmFsID0gIiVzJXMiICUgKChzZWxmLmdldEZ1bmMoa2V5LCBkYXRhKSBvciAiIiksIGdyb3VwZFsidmFsdWUiXSkKKyAgICAgICAgZWxpZiAicHJlZG90IiBpbiBncm91cGQgYW5kIGdyb3VwZFsicHJlZG90Il0gIT0gTm9uZToKKyAgICAgICAgICAgIG9wID0gInByZWRvdCIKKyAgICAgICAgICAgIHZhbCA9ICIlcyVzIiAlIChncm91cGRbInZhbHVlIl0sIChzZWxmLmdldEZ1bmMoa2V5LCBkYXRhKSBvciAiIikpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB2YWwgPSBncm91cGRbInZhbHVlIl0KKworICAgICAgICBmbGFnID0gTm9uZQorICAgICAgICBpZiAnZmxhZycgaW4gZ3JvdXBkIGFuZCBncm91cGRbJ2ZsYWcnXSAhPSBOb25lOgorICAgICAgICAgICAgZmxhZyA9IGdyb3VwZFsnZmxhZyddCisgICAgICAgIGVsaWYgZ3JvdXBkWyJsYXp5cXVlcyJdOgorICAgICAgICAgICAgZmxhZyA9ICJfZGVmYXVsdHZhbCIKKworICAgICAgICBsb2dpbmZvWydvcCddID0gb3AKKyAgICAgICAgbG9naW5mb1snZGV0YWlsJ10gPSBncm91cGRbInZhbHVlIl0KKworICAgICAgICBpZiBmbGFnOgorICAgICAgICAgICAgZGF0YS5zZXRWYXJGbGFnKGtleSwgZmxhZywgdmFsLCAqKmxvZ2luZm8pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkYXRhLnNldFZhcihrZXksIHZhbCwgcGFyc2luZz1UcnVlLCAqKmxvZ2luZm8pCisKK2NsYXNzIE1ldGhvZE5vZGUoQXN0Tm9kZSk6CisgICAgdHJfdGJsID0gc3RyaW5nLm1ha2V0cmFucygnLy4rLUAlJicsICdfX19fX19fJykKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgbGluZW5vLCBmdW5jX25hbWUsIGJvZHkpOgorICAgICAgICBBc3ROb2RlLl9faW5pdF9fKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm8pCisgICAgICAgIHNlbGYuZnVuY19uYW1lID0gZnVuY19uYW1lCisgICAgICAgIHNlbGYuYm9keSA9IGJvZHkKKworICAgIGRlZiBldmFsKHNlbGYsIGRhdGEpOgorICAgICAgICB0ZXh0ID0gJ1xuJy5qb2luKHNlbGYuYm9keSkKKyAgICAgICAgaWYgc2VsZi5mdW5jX25hbWUgPT0gIl9fYW5vbnltb3VzIjoKKyAgICAgICAgICAgIGZ1bmNuYW1lID0gKCJfX2Fub25fJXNfJXMiICUgKHNlbGYubGluZW5vLCBzZWxmLmZpbGVuYW1lLnRyYW5zbGF0ZShNZXRob2ROb2RlLnRyX3RibCkpKQorICAgICAgICAgICAgdGV4dCA9ICJkZWYgJXMoZCk6XG4iICUgKGZ1bmNuYW1lKSArIHRleHQKKyAgICAgICAgICAgIGJiLm1ldGhvZHBvb2wuaW5zZXJ0X21ldGhvZChmdW5jbmFtZSwgdGV4dCwgc2VsZi5maWxlbmFtZSkKKyAgICAgICAgICAgIGFub25mdW5jcyA9IGRhdGEuZ2V0VmFyKCdfX0JCQU5PTkZVTkNTJywgRmFsc2UpIG9yIFtdCisgICAgICAgICAgICBhbm9uZnVuY3MuYXBwZW5kKGZ1bmNuYW1lKQorICAgICAgICAgICAgZGF0YS5zZXRWYXIoJ19fQkJBTk9ORlVOQ1MnLCBhbm9uZnVuY3MpCisgICAgICAgICAgICBkYXRhLnNldFZhcihmdW5jbmFtZSwgdGV4dCwgcGFyc2luZz1UcnVlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGF0YS5zZXRWYXJGbGFnKHNlbGYuZnVuY19uYW1lLCAiZnVuYyIsIDEpCisgICAgICAgICAgICBkYXRhLnNldFZhcihzZWxmLmZ1bmNfbmFtZSwgdGV4dCwgcGFyc2luZz1UcnVlKQorCitjbGFzcyBQeXRob25NZXRob2ROb2RlKEFzdE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgbGluZW5vLCBmdW5jdGlvbiwgbW9kdWxlbmFtZSwgYm9keSk6CisgICAgICAgIEFzdE5vZGUuX19pbml0X18oc2VsZiwgZmlsZW5hbWUsIGxpbmVubykKKyAgICAgICAgc2VsZi5mdW5jdGlvbiA9IGZ1bmN0aW9uCisgICAgICAgIHNlbGYubW9kdWxlbmFtZSA9IG1vZHVsZW5hbWUKKyAgICAgICAgc2VsZi5ib2R5ID0gYm9keQorCisgICAgZGVmIGV2YWwoc2VsZiwgZGF0YSk6CisgICAgICAgICMgTm90ZSB3ZSB3aWxsIGFkZCByb290IHRvIHBhcnNlZG1ldGhvZHMgYWZ0ZXIgaGF2aW5nIHBhcnNlCisgICAgICAgICMgJ3RoaXMnIGZpbGUuIFRoaXMgbWVhbnMgd2Ugd2lsbCBub3QgcGFyc2UgbWV0aG9kcyBmcm9tCisgICAgICAgICMgYmIgY2xhc3NlcyB0d2ljZQorICAgICAgICB0ZXh0ID0gJ1xuJy5qb2luKHNlbGYuYm9keSkKKyAgICAgICAgYmIubWV0aG9kcG9vbC5pbnNlcnRfbWV0aG9kKHNlbGYubW9kdWxlbmFtZSwgdGV4dCwgc2VsZi5maWxlbmFtZSkKKyAgICAgICAgZGF0YS5zZXRWYXJGbGFnKHNlbGYuZnVuY3Rpb24sICJmdW5jIiwgMSkKKyAgICAgICAgZGF0YS5zZXRWYXJGbGFnKHNlbGYuZnVuY3Rpb24sICJweXRob24iLCAxKQorICAgICAgICBkYXRhLnNldFZhcihzZWxmLmZ1bmN0aW9uLCB0ZXh0LCBwYXJzaW5nPVRydWUpCisKK2NsYXNzIE1ldGhvZEZsYWdzTm9kZShBc3ROb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWUsIGxpbmVubywga2V5LCBtKToKKyAgICAgICAgQXN0Tm9kZS5fX2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgbGluZW5vKQorICAgICAgICBzZWxmLmtleSA9IGtleQorICAgICAgICBzZWxmLm0gPSBtCisKKyAgICBkZWYgZXZhbChzZWxmLCBkYXRhKToKKyAgICAgICAgaWYgZGF0YS5nZXRWYXIoc2VsZi5rZXksIEZhbHNlKToKKyAgICAgICAgICAgICMgY2xlYW4gdXAgb2xkIHZlcnNpb24gb2YgdGhpcyBwaWVjZSBvZiBtZXRhZGF0YSwgYXMgaXRzCisgICAgICAgICAgICAjIGZsYWdzIGNvdWxkIGNhdXNlIHByb2JsZW1zCisgICAgICAgICAgICBkYXRhLnNldFZhckZsYWcoc2VsZi5rZXksICdweXRob24nLCBOb25lKQorICAgICAgICAgICAgZGF0YS5zZXRWYXJGbGFnKHNlbGYua2V5LCAnZmFrZXJvb3QnLCBOb25lKQorICAgICAgICBpZiBzZWxmLm0uZ3JvdXAoInB5IikgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBkYXRhLnNldFZhckZsYWcoc2VsZi5rZXksICJweXRob24iLCAiMSIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkYXRhLmRlbFZhckZsYWcoc2VsZi5rZXksICJweXRob24iKQorICAgICAgICBpZiBzZWxmLm0uZ3JvdXAoImZyIikgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBkYXRhLnNldFZhckZsYWcoc2VsZi5rZXksICJmYWtlcm9vdCIsICIxIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRhdGEuZGVsVmFyRmxhZyhzZWxmLmtleSwgImZha2Vyb290IikKKworY2xhc3MgRXhwb3J0RnVuY3NOb2RlKEFzdE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgbGluZW5vLCBmbnMsIGNsYXNzbmFtZSk6CisgICAgICAgIEFzdE5vZGUuX19pbml0X18oc2VsZiwgZmlsZW5hbWUsIGxpbmVubykKKyAgICAgICAgc2VsZi5uID0gZm5zLnNwbGl0KCkKKyAgICAgICAgc2VsZi5jbGFzc25hbWUgPSBjbGFzc25hbWUKKworICAgIGRlZiBldmFsKHNlbGYsIGRhdGEpOgorCisgICAgICAgIGZvciBmdW5jIGluIHNlbGYubjoKKyAgICAgICAgICAgIGNhbGxlZGZ1bmMgPSBzZWxmLmNsYXNzbmFtZSArICJfIiArIGZ1bmMKKworICAgICAgICAgICAgaWYgZGF0YS5nZXRWYXIoZnVuYywgRmFsc2UpIGFuZCBub3QgZGF0YS5nZXRWYXJGbGFnKGZ1bmMsICdleHBvcnRfZnVuYycpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIGRhdGEuZ2V0VmFyKGZ1bmMsIEZhbHNlKToKKyAgICAgICAgICAgICAgICBkYXRhLnNldFZhckZsYWcoZnVuYywgJ3B5dGhvbicsIE5vbmUpCisgICAgICAgICAgICAgICAgZGF0YS5zZXRWYXJGbGFnKGZ1bmMsICdmdW5jJywgTm9uZSkKKworICAgICAgICAgICAgZm9yIGZsYWcgaW4gWyAiZnVuYyIsICJweXRob24iIF06CisgICAgICAgICAgICAgICAgaWYgZGF0YS5nZXRWYXJGbGFnKGNhbGxlZGZ1bmMsIGZsYWcpOgorICAgICAgICAgICAgICAgICAgICBkYXRhLnNldFZhckZsYWcoZnVuYywgZmxhZywgZGF0YS5nZXRWYXJGbGFnKGNhbGxlZGZ1bmMsIGZsYWcpKQorICAgICAgICAgICAgZm9yIGZsYWcgaW4gWyAiZGlycyIgXToKKyAgICAgICAgICAgICAgICBpZiBkYXRhLmdldFZhckZsYWcoZnVuYywgZmxhZyk6CisgICAgICAgICAgICAgICAgICAgIGRhdGEuc2V0VmFyRmxhZyhjYWxsZWRmdW5jLCBmbGFnLCBkYXRhLmdldFZhckZsYWcoZnVuYywgZmxhZykpCisKKyAgICAgICAgICAgIGlmIGRhdGEuZ2V0VmFyRmxhZyhjYWxsZWRmdW5jLCAicHl0aG9uIik6CisgICAgICAgICAgICAgICAgZGF0YS5zZXRWYXIoZnVuYywgIiAgICBiYi5idWlsZC5leGVjX2Z1bmMoJyIgKyBjYWxsZWRmdW5jICsgIicsIGQpXG4iLCBwYXJzaW5nPVRydWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmICItIiBpbiBzZWxmLmNsYXNzbmFtZToKKyAgICAgICAgICAgICAgICAgICBiYi5mYXRhbCgiVGhlIGNsYXNzbmFtZSAlcyBjb250YWlucyBhIGRhc2ggY2hhcmFjdGVyIGFuZCBpcyBjYWxsaW5nIGFuIHNoIGZ1bmN0aW9uICVzIHVzaW5nIEVYUE9SVF9GVU5DVElPTlMuIFNpbmNlIGEgZGFzaCBpcyBpbGxlZ2FsIGluIHNoIGZ1bmN0aW9uIG5hbWVzLCB0aGlzIGNhbm5vdCB3b3JrLCBwbGVhc2UgcmVuYW1lIHRoZSBjbGFzcyBvciBkb24ndCB1c2UgRVhQT1JUX0ZVTkNUSU9OUy4iICUgKHNlbGYuY2xhc3NuYW1lLCBjYWxsZWRmdW5jKSkKKyAgICAgICAgICAgICAgICBkYXRhLnNldFZhcihmdW5jLCAiICAgICIgKyBjYWxsZWRmdW5jICsgIlxuIiwgcGFyc2luZz1UcnVlKQorICAgICAgICAgICAgZGF0YS5zZXRWYXJGbGFnKGZ1bmMsICdleHBvcnRfZnVuYycsICcxJykKKworY2xhc3MgQWRkVGFza05vZGUoQXN0Tm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm8sIGZ1bmMsIGJlZm9yZSwgYWZ0ZXIpOgorICAgICAgICBBc3ROb2RlLl9faW5pdF9fKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm8pCisgICAgICAgIHNlbGYuZnVuYyA9IGZ1bmMKKyAgICAgICAgc2VsZi5iZWZvcmUgPSBiZWZvcmUKKyAgICAgICAgc2VsZi5hZnRlciA9IGFmdGVyCisKKyAgICBkZWYgZXZhbChzZWxmLCBkYXRhKToKKyAgICAgICAgYmIuYnVpbGQuYWRkdGFzayhzZWxmLmZ1bmMsIHNlbGYuYmVmb3JlLCBzZWxmLmFmdGVyLCBkYXRhKQorCitjbGFzcyBEZWxUYXNrTm9kZShBc3ROb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWUsIGxpbmVubywgZnVuYyk6CisgICAgICAgIEFzdE5vZGUuX19pbml0X18oc2VsZiwgZmlsZW5hbWUsIGxpbmVubykKKyAgICAgICAgc2VsZi5mdW5jID0gZnVuYworCisgICAgZGVmIGV2YWwoc2VsZiwgZGF0YSk6CisgICAgICAgIGJiLmJ1aWxkLmRlbHRhc2soc2VsZi5mdW5jLCBkYXRhKQorCitjbGFzcyBCQkhhbmRsZXJOb2RlKEFzdE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgbGluZW5vLCBmbnMpOgorICAgICAgICBBc3ROb2RlLl9faW5pdF9fKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm8pCisgICAgICAgIHNlbGYuaHMgPSBmbnMuc3BsaXQoKQorCisgICAgZGVmIGV2YWwoc2VsZiwgZGF0YSk6CisgICAgICAgIGJiaGFuZHMgPSBkYXRhLmdldFZhcignX19CQkhBTkRMRVJTJywgRmFsc2UpIG9yIFtdCisgICAgICAgIGZvciBoIGluIHNlbGYuaHM6CisgICAgICAgICAgICBiYmhhbmRzLmFwcGVuZChoKQorICAgICAgICAgICAgZGF0YS5zZXRWYXJGbGFnKGgsICJoYW5kbGVyIiwgMSkKKyAgICAgICAgZGF0YS5zZXRWYXIoJ19fQkJIQU5ETEVSUycsIGJiaGFuZHMpCisKK2NsYXNzIEluaGVyaXROb2RlKEFzdE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgbGluZW5vLCBjbGFzc2VzKToKKyAgICAgICAgQXN0Tm9kZS5fX2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgbGluZW5vKQorICAgICAgICBzZWxmLmNsYXNzZXMgPSBjbGFzc2VzCisKKyAgICBkZWYgZXZhbChzZWxmLCBkYXRhKToKKyAgICAgICAgYmIucGFyc2UuQkJIYW5kbGVyLmluaGVyaXQoc2VsZi5jbGFzc2VzLCBzZWxmLmZpbGVuYW1lLCBzZWxmLmxpbmVubywgZGF0YSkKKworZGVmIGhhbmRsZUluY2x1ZGUoc3RhdGVtZW50cywgZmlsZW5hbWUsIGxpbmVubywgbSwgZm9yY2UpOgorICAgIHN0YXRlbWVudHMuYXBwZW5kKEluY2x1ZGVOb2RlKGZpbGVuYW1lLCBsaW5lbm8sIG0uZ3JvdXAoMSksIGZvcmNlKSkKKworZGVmIGhhbmRsZUV4cG9ydChzdGF0ZW1lbnRzLCBmaWxlbmFtZSwgbGluZW5vLCBtKToKKyAgICBzdGF0ZW1lbnRzLmFwcGVuZChFeHBvcnROb2RlKGZpbGVuYW1lLCBsaW5lbm8sIG0uZ3JvdXAoMSkpKQorCitkZWYgaGFuZGxlRGF0YShzdGF0ZW1lbnRzLCBmaWxlbmFtZSwgbGluZW5vLCBncm91cGQpOgorICAgIHN0YXRlbWVudHMuYXBwZW5kKERhdGFOb2RlKGZpbGVuYW1lLCBsaW5lbm8sIGdyb3VwZCkpCisKK2RlZiBoYW5kbGVNZXRob2Qoc3RhdGVtZW50cywgZmlsZW5hbWUsIGxpbmVubywgZnVuY19uYW1lLCBib2R5KToKKyAgICBzdGF0ZW1lbnRzLmFwcGVuZChNZXRob2ROb2RlKGZpbGVuYW1lLCBsaW5lbm8sIGZ1bmNfbmFtZSwgYm9keSkpCisKK2RlZiBoYW5kbGVQeXRob25NZXRob2Qoc3RhdGVtZW50cywgZmlsZW5hbWUsIGxpbmVubywgZnVuY25hbWUsIG1vZHVsZW5hbWUsIGJvZHkpOgorICAgIHN0YXRlbWVudHMuYXBwZW5kKFB5dGhvbk1ldGhvZE5vZGUoZmlsZW5hbWUsIGxpbmVubywgZnVuY25hbWUsIG1vZHVsZW5hbWUsIGJvZHkpKQorCitkZWYgaGFuZGxlTWV0aG9kRmxhZ3Moc3RhdGVtZW50cywgZmlsZW5hbWUsIGxpbmVubywga2V5LCBtKToKKyAgICBzdGF0ZW1lbnRzLmFwcGVuZChNZXRob2RGbGFnc05vZGUoZmlsZW5hbWUsIGxpbmVubywga2V5LCBtKSkKKworZGVmIGhhbmRsZUV4cG9ydEZ1bmNzKHN0YXRlbWVudHMsIGZpbGVuYW1lLCBsaW5lbm8sIG0sIGNsYXNzbmFtZSk6CisgICAgc3RhdGVtZW50cy5hcHBlbmQoRXhwb3J0RnVuY3NOb2RlKGZpbGVuYW1lLCBsaW5lbm8sIG0uZ3JvdXAoMSksIGNsYXNzbmFtZSkpCisKK2RlZiBoYW5kbGVBZGRUYXNrKHN0YXRlbWVudHMsIGZpbGVuYW1lLCBsaW5lbm8sIG0pOgorICAgIGZ1bmMgPSBtLmdyb3VwKCJmdW5jIikKKyAgICBiZWZvcmUgPSBtLmdyb3VwKCJiZWZvcmUiKQorICAgIGFmdGVyID0gbS5ncm91cCgiYWZ0ZXIiKQorICAgIGlmIGZ1bmMgaXMgTm9uZToKKyAgICAgICAgcmV0dXJuCisKKyAgICBzdGF0ZW1lbnRzLmFwcGVuZChBZGRUYXNrTm9kZShmaWxlbmFtZSwgbGluZW5vLCBmdW5jLCBiZWZvcmUsIGFmdGVyKSkKKworZGVmIGhhbmRsZURlbFRhc2soc3RhdGVtZW50cywgZmlsZW5hbWUsIGxpbmVubywgbSk6CisgICAgZnVuYyA9IG0uZ3JvdXAoImZ1bmMiKQorICAgIGlmIGZ1bmMgaXMgTm9uZToKKyAgICAgICAgcmV0dXJuCisKKyAgICBzdGF0ZW1lbnRzLmFwcGVuZChEZWxUYXNrTm9kZShmaWxlbmFtZSwgbGluZW5vLCBmdW5jKSkKKworZGVmIGhhbmRsZUJCSGFuZGxlcnMoc3RhdGVtZW50cywgZmlsZW5hbWUsIGxpbmVubywgbSk6CisgICAgc3RhdGVtZW50cy5hcHBlbmQoQkJIYW5kbGVyTm9kZShmaWxlbmFtZSwgbGluZW5vLCBtLmdyb3VwKDEpKSkKKworZGVmIGhhbmRsZUluaGVyaXQoc3RhdGVtZW50cywgZmlsZW5hbWUsIGxpbmVubywgbSk6CisgICAgY2xhc3NlcyA9IG0uZ3JvdXAoMSkKKyAgICBzdGF0ZW1lbnRzLmFwcGVuZChJbmhlcml0Tm9kZShmaWxlbmFtZSwgbGluZW5vLCBjbGFzc2VzKSkKKworZGVmIGZpbmFsaXplKGZuLCBkLCB2YXJpYW50ID0gTm9uZSk6CisgICAgYWxsX2hhbmRsZXJzID0ge30KKyAgICBmb3IgdmFyIGluIGQuZ2V0VmFyKCdfX0JCSEFORExFUlMnLCBGYWxzZSkgb3IgW106CisgICAgICAgICMgdHJ5IHRvIGFkZCB0aGUgaGFuZGxlcgorICAgICAgICBiYi5ldmVudC5yZWdpc3Rlcih2YXIsIGQuZ2V0VmFyKHZhciwgRmFsc2UpLCAoZC5nZXRWYXJGbGFnKHZhciwgImV2ZW50bWFzayIsIFRydWUpIG9yICIiKS5zcGxpdCgpKQorCisgICAgYmIuZXZlbnQuZmlyZShiYi5ldmVudC5SZWNpcGVQcmVGaW5hbGlzZShmbiksIGQpCisKKyAgICBiYi5kYXRhLmV4cGFuZEtleXMoZCkKKyAgICBiYi5kYXRhLnVwZGF0ZV9kYXRhKGQpCisgICAgY29kZSA9IFtdCisgICAgZm9yIGZ1bmNuYW1lIGluIGQuZ2V0VmFyKCJfX0JCQU5PTkZVTkNTIiwgRmFsc2UpIG9yIFtdOgorICAgICAgICBjb2RlLmFwcGVuZCgiJXMoZCkiICUgZnVuY25hbWUpCisgICAgYmIudXRpbHMuYmV0dGVyX2V4ZWMoIlxuIi5qb2luKGNvZGUpLCB7ImQiOiBkfSkKKyAgICBiYi5kYXRhLnVwZGF0ZV9kYXRhKGQpCisKKyAgICB0YXNrbGlzdCA9IGQuZ2V0VmFyKCdfX0JCVEFTS1MnLCBGYWxzZSkgb3IgW10KKyAgICBiYi5idWlsZC5hZGRfdGFza3ModGFza2xpc3QsIGQpCisKKyAgICBiYi5wYXJzZS5zaWdnZW4uZmluYWxpc2UoZm4sIGQsIHZhcmlhbnQpCisKKyAgICBkLnNldFZhcignQkJJTkNMVURFRCcsIGJiLnBhcnNlLmdldF9maWxlX2RlcGVuZHMoZCkpCisKKyAgICBiYi5ldmVudC5maXJlKGJiLmV2ZW50LlJlY2lwZVBhcnNlZChmbiksIGQpCisKK2RlZiBfY3JlYXRlX3ZhcmlhbnRzKGRhdGFzdG9yZXMsIG5hbWVzLCBmdW5jdGlvbiwgb25seWZpbmFsaXNlKToKKyAgICBkZWYgY3JlYXRlX3ZhcmlhbnQobmFtZSwgb3JpZ19kLCBhcmcgPSBOb25lKToKKyAgICAgICAgaWYgb25seWZpbmFsaXNlIGFuZCBuYW1lIG5vdCBpbiBvbmx5ZmluYWxpc2U6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgbmV3X2QgPSBiYi5kYXRhLmNyZWF0ZUNvcHkob3JpZ19kKQorICAgICAgICBmdW5jdGlvbihhcmcgb3IgbmFtZSwgbmV3X2QpCisgICAgICAgIGRhdGFzdG9yZXNbbmFtZV0gPSBuZXdfZAorCisgICAgZm9yIHZhcmlhbnQsIHZhcmlhbnRfZCBpbiBkYXRhc3RvcmVzLml0ZW1zKCk6CisgICAgICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICAgICAgaWYgbm90IHZhcmlhbnQ6CisgICAgICAgICAgICAgICAgIyBCYXNlZCBvbiBtYWluIHJlY2lwZQorICAgICAgICAgICAgICAgIGNyZWF0ZV92YXJpYW50KG5hbWUsIHZhcmlhbnRfZCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY3JlYXRlX3ZhcmlhbnQoIiVzLSVzIiAlICh2YXJpYW50LCBuYW1lKSwgdmFyaWFudF9kLCBuYW1lKQorCitkZWYgX2V4cGFuZF92ZXJzaW9ucyh2ZXJzaW9ucyk6CisgICAgZGVmIGV4cGFuZF9vbmUodmVyc2lvbiwgc3RhcnQsIGVuZCk6CisgICAgICAgIGZvciBpIGluIHhyYW5nZShzdGFydCwgZW5kICsgMSk6CisgICAgICAgICAgICB2ZXIgPSBfYmJ2ZXJzaW9uc19yZS5zdWIoc3RyKGkpLCB2ZXJzaW9uLCAxKQorICAgICAgICAgICAgeWllbGQgdmVyCisKKyAgICB2ZXJzaW9ucyA9IGl0ZXIodmVyc2lvbnMpCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdmVyc2lvbiA9IG5leHQodmVyc2lvbnMpCisgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgYnJlYWsKKworICAgICAgICByYW5nZV92ZXIgPSBfYmJ2ZXJzaW9uc19yZS5zZWFyY2godmVyc2lvbikKKyAgICAgICAgaWYgbm90IHJhbmdlX3ZlcjoKKyAgICAgICAgICAgIHlpZWxkIHZlcnNpb24KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5ld3ZlcnNpb25zID0gZXhwYW5kX29uZSh2ZXJzaW9uLCBpbnQocmFuZ2VfdmVyLmdyb3VwKCJmcm9tIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludChyYW5nZV92ZXIuZ3JvdXAoInRvIikpKQorICAgICAgICAgICAgdmVyc2lvbnMgPSBpdGVydG9vbHMuY2hhaW4obmV3dmVyc2lvbnMsIHZlcnNpb25zKQorCitkZWYgbXVsdGlfZmluYWxpemUoZm4sIGQpOgorICAgIGFwcGVuZHMgPSAoZC5nZXRWYXIoIl9fQkJBUFBFTkQiLCBUcnVlKSBvciAiIikuc3BsaXQoKQorICAgIGZvciBhcHBlbmQgaW4gYXBwZW5kczoKKyAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJBcHBlbmRpbmcgLmJiYXBwZW5kIGZpbGUgJXMgdG8gJXMiLCBhcHBlbmQsIGZuKQorICAgICAgICBiYi5wYXJzZS5CQkhhbmRsZXIuaGFuZGxlKGFwcGVuZCwgZCwgVHJ1ZSkKKworICAgIG9ubHlmaW5hbGlzZSA9IGQuZ2V0VmFyKCJfX09OTFlGSU5BTElTRSIsIEZhbHNlKQorCisgICAgc2FmZV9kID0gZAorICAgIGQgPSBiYi5kYXRhLmNyZWF0ZUNvcHkoc2FmZV9kKQorICAgIHRyeToKKyAgICAgICAgZmluYWxpemUoZm4sIGQpCisgICAgZXhjZXB0IGJiLnBhcnNlLlNraXBSZWNpcGUgYXMgZToKKyAgICAgICAgZC5zZXRWYXIoIl9fU0tJUFBFRCIsIGUuYXJnc1swXSkKKyAgICBkYXRhc3RvcmVzID0geyIiOiBzYWZlX2R9CisKKyAgICB2ZXJzaW9ucyA9IChkLmdldFZhcigiQkJWRVJTSU9OUyIsIFRydWUpIG9yICIiKS5zcGxpdCgpCisgICAgaWYgdmVyc2lvbnM6CisgICAgICAgIHB2ID0gb3JpZ19wdiA9IGQuZ2V0VmFyKCJQViIsIFRydWUpCisgICAgICAgIGJhc2V2ZXJzaW9ucyA9IHt9CisKKyAgICAgICAgZGVmIHZlcmZ1bmModmVyLCBkLCBwdl9kID0gTm9uZSk6CisgICAgICAgICAgICBpZiBwdl9kIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcHZfZCA9IGQKKworICAgICAgICAgICAgb3ZlcnJpZGVzID0gZC5nZXRWYXIoIk9WRVJSSURFUyIsIFRydWUpLnNwbGl0KCI6IikKKyAgICAgICAgICAgIHB2X2Quc2V0VmFyKCJQViIsIHZlcikKKyAgICAgICAgICAgIG92ZXJyaWRlcy5hcHBlbmQodmVyKQorICAgICAgICAgICAgYnB2ID0gYmFzZXZlcnNpb25zLmdldCh2ZXIpIG9yIG9yaWdfcHYKKyAgICAgICAgICAgIHB2X2Quc2V0VmFyKCJCUFYiLCBicHYpCisgICAgICAgICAgICBvdmVycmlkZXMuYXBwZW5kKGJwdikKKyAgICAgICAgICAgIGQuc2V0VmFyKCJPVkVSUklERVMiLCAiOiIuam9pbihvdmVycmlkZXMpKQorCisgICAgICAgIHZlcnNpb25zID0gbGlzdChfZXhwYW5kX3ZlcnNpb25zKHZlcnNpb25zKSkKKyAgICAgICAgZm9yIHBvcywgdmVyc2lvbiBpbiBlbnVtZXJhdGUobGlzdCh2ZXJzaW9ucykpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHB2LCBicHYgPSB2ZXJzaW9uLnNwbGl0KCI6IiwgMikKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdmVyc2lvbnNbcG9zXSA9IHB2CisgICAgICAgICAgICAgICAgYmFzZXZlcnNpb25zW3B2XSA9IGJwdgorCisgICAgICAgIGlmIHB2IGluIHZlcnNpb25zIGFuZCBub3QgYmFzZXZlcnNpb25zLmdldChwdik6CisgICAgICAgICAgICB2ZXJzaW9ucy5yZW1vdmUocHYpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwdiA9IHZlcnNpb25zLnBvcCgpCisKKyAgICAgICAgICAgICMgVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBvdXIgZXhpc3RpbmcgbWFpbiBkYXRhc3RvcmUKKyAgICAgICAgICAgICMgaGFzIGFscmVhZHkgYmVlbiBmaW5hbGl6ZWQgd2l0aCB0aGUgb2xkIFBWLCB3ZSBuZWVkIG9uZQorICAgICAgICAgICAgIyB0aGF0J3MgYmVlbiBmaW5hbGl6ZWQgd2l0aCB0aGUgbmV3IFBWLgorICAgICAgICAgICAgZCA9IGJiLmRhdGEuY3JlYXRlQ29weShzYWZlX2QpCisgICAgICAgICAgICB2ZXJmdW5jKHB2LCBkLCBzYWZlX2QpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZmluYWxpemUoZm4sIGQpCisgICAgICAgICAgICBleGNlcHQgYmIucGFyc2UuU2tpcFJlY2lwZSBhcyBlOgorICAgICAgICAgICAgICAgIGQuc2V0VmFyKCJfX1NLSVBQRUQiLCBlLmFyZ3NbMF0pCisKKyAgICAgICAgX2NyZWF0ZV92YXJpYW50cyhkYXRhc3RvcmVzLCB2ZXJzaW9ucywgdmVyZnVuYywgb25seWZpbmFsaXNlKQorCisgICAgZXh0ZW5kZWQgPSBkLmdldFZhcigiQkJDTEFTU0VYVEVORCIsIFRydWUpIG9yICIiCisgICAgaWYgZXh0ZW5kZWQ6CisgICAgICAgICMgdGhlIGZvbGxvd2luZyBpcyB0byBzdXBwb3J0IGJiZXh0ZW5kcyB3aXRoIGFyZ3VtZW50cywgZm9yIGUuZy4gbXVsdGlsaWIKKyAgICAgICAgIyBhbiBleGFtcGxlIGlzIGFzIGZvbGxvd3M6CisgICAgICAgICMgICBCQkNMQVNTRVhURU5EID0gIm11bHRpbGliOmxpYjMyIgorICAgICAgICAjIGl0IHdpbGwgY3JlYXRlIGZvby1saWIzMiwgaW5oZXJpdGluZyBtdWx0aWxpYi5iYmNsYXNzIGFuZCBzZXQKKyAgICAgICAgIyBCQkVYVEVORENVUlIgdG8gIm11bHRpbGliIiBhbmQgQkJFWFRFTkRWQVJJQU5UIHRvICJsaWIzMiIKKyAgICAgICAgZXh0ZW5kZWRtYXAgPSB7fQorICAgICAgICB2YXJpYW50bWFwID0ge30KKworICAgICAgICBmb3IgZXh0IGluIGV4dGVuZGVkLnNwbGl0KCk6CisgICAgICAgICAgICBlZXh0ID0gZXh0LnNwbGl0KCc6JywgMikKKyAgICAgICAgICAgIGlmIGxlbihlZXh0KSA+IDE6CisgICAgICAgICAgICAgICAgZXh0ZW5kZWRtYXBbZXh0XSA9IGVleHRbMF0KKyAgICAgICAgICAgICAgICB2YXJpYW50bWFwW2V4dF0gPSBlZXh0WzFdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGV4dGVuZGVkbWFwW2V4dF0gPSBleHQKKworICAgICAgICBwbiA9IGQuZ2V0VmFyKCJQTiIsIFRydWUpCisgICAgICAgIGRlZiBleHRlbmRmdW5jKG5hbWUsIGQpOgorICAgICAgICAgICAgaWYgbmFtZSAhPSBleHRlbmRlZG1hcFtuYW1lXToKKyAgICAgICAgICAgICAgICBkLnNldFZhcigiQkJFWFRFTkRDVVJSIiwgZXh0ZW5kZWRtYXBbbmFtZV0pCisgICAgICAgICAgICAgICAgZC5zZXRWYXIoIkJCRVhURU5EVkFSSUFOVCIsIHZhcmlhbnRtYXBbbmFtZV0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGQuc2V0VmFyKCJQTiIsICIlcy0lcyIgJSAocG4sIG5hbWUpKQorICAgICAgICAgICAgYmIucGFyc2UuQkJIYW5kbGVyLmluaGVyaXQoZXh0ZW5kZWRtYXBbbmFtZV0sIGZuLCAwLCBkKQorCisgICAgICAgIHNhZmVfZC5zZXRWYXIoIkJCQ0xBU1NFWFRFTkQiLCBleHRlbmRlZCkKKyAgICAgICAgX2NyZWF0ZV92YXJpYW50cyhkYXRhc3RvcmVzLCBleHRlbmRlZG1hcC5rZXlzKCksIGV4dGVuZGZ1bmMsIG9ubHlmaW5hbGlzZSkKKworICAgIGZvciB2YXJpYW50LCB2YXJpYW50X2QgaW4gZGF0YXN0b3Jlcy5pdGVyaXRlbXMoKToKKyAgICAgICAgaWYgdmFyaWFudDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpZiBub3Qgb25seWZpbmFsaXNlIG9yIHZhcmlhbnQgaW4gb25seWZpbmFsaXNlOgorICAgICAgICAgICAgICAgICAgICBmaW5hbGl6ZShmbiwgdmFyaWFudF9kLCB2YXJpYW50KQorICAgICAgICAgICAgZXhjZXB0IGJiLnBhcnNlLlNraXBSZWNpcGUgYXMgZToKKyAgICAgICAgICAgICAgICB2YXJpYW50X2Quc2V0VmFyKCJfX1NLSVBQRUQiLCBlLmFyZ3NbMF0pCisKKyAgICBpZiBsZW4oZGF0YXN0b3JlcykgPiAxOgorICAgICAgICB2YXJpYW50cyA9IGZpbHRlcihOb25lLCBkYXRhc3RvcmVzLml0ZXJrZXlzKCkpCisgICAgICAgIHNhZmVfZC5zZXRWYXIoIl9fVkFSSUFOVFMiLCAiICIuam9pbih2YXJpYW50cykpCisKKyAgICBkYXRhc3RvcmVzWyIiXSA9IGQKKyAgICByZXR1cm4gZGF0YXN0b3JlcwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvcGFyc2UvcGFyc2VfcHkvQkJIYW5kbGVyLnB5IGIvYml0YmFrZS9saWIvYmIvcGFyc2UvcGFyc2VfcHkvQkJIYW5kbGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMDk3YmEKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9wYXJzZS9wYXJzZV9weS9CQkhhbmRsZXIucHkKQEAgLTAsMCArMSwyNjUgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyIiIgorICAgY2xhc3MgZm9yIGhhbmRsaW5nIC5iYiBmaWxlcworCisgICBSZWFkcyBhIC5iYiBmaWxlIGFuZCBvYnRhaW5zIGl0cyBtZXRhZGF0YQorCisiIiIKKworCisjICBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgIENocmlzIExhcnNvbgorIyAgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0ICBQaGlsIEJsdW5kZWxsCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoraW1wb3J0IHJlLCBiYiwgb3MKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgYmIuYnVpbGQsIGJiLnV0aWxzCitmcm9tIGJiIGltcG9ydCBkYXRhCisKK2Zyb20gLiBpbXBvcnQgQ29uZkhhbmRsZXIKK2Zyb20gLi4gaW1wb3J0IHJlc29sdmVfZmlsZSwgYXN0LCBsb2dnZXIsIFBhcnNlRXJyb3IKK2Zyb20gLkNvbmZIYW5kbGVyIGltcG9ydCBpbmNsdWRlLCBpbml0CisKKyMgRm9yIGNvbXBhdGliaWxpdHkKK2JiLmRlcHJlY2F0ZV9pbXBvcnQoX19uYW1lX18sICJiYi5wYXJzZSIsIFsidmFyc19mcm9tX2ZpbGUiXSkKKworX19mdW5jX3N0YXJ0X3JlZ2V4cF9fICAgID0gcmUuY29tcGlsZSggciIoKCg/UDxweT5weXRob24pfCg/UDxmcj5mYWtlcm9vdCkpXHMqKSooP1A8ZnVuYz5bXHdcLlwtXCtce1x9XCRdKyk/XHMqXChccypcKVxzKnskIiApCitfX2luaGVyaXRfcmVnZXhwX18gICAgICAgPSByZS5jb21waWxlKCByImluaGVyaXRccysoLispIiApCitfX2V4cG9ydF9mdW5jX3JlZ2V4cF9fICAgPSByZS5jb21waWxlKCByIkVYUE9SVF9GVU5DVElPTlNccysoLispIiApCitfX2FkZHRhc2tfcmVnZXhwX18gICAgICAgPSByZS5jb21waWxlKCJhZGR0YXNrXHMrKD9QPGZ1bmM+XHcrKVxzKigoYmVmb3JlXHMqKD9QPGJlZm9yZT4oKC4qKD89YWZ0ZXIpKXwoLiopKSkpfChhZnRlclxzKig/UDxhZnRlcj4oKC4qKD89YmVmb3JlKSl8KC4qKSkpKSkqIikKK19fZGVsdGFza19yZWdleHBfXyAgICAgICA9IHJlLmNvbXBpbGUoImRlbHRhc2tccysoP1A8ZnVuYz5cdyspIikKK19fYWRkaGFuZGxlcl9yZWdleHBfXyAgICA9IHJlLmNvbXBpbGUoIHIiYWRkaGFuZGxlclxzKyguKykiICkKK19fZGVmX3JlZ2V4cF9fICAgICAgICAgICA9IHJlLmNvbXBpbGUoIHIiZGVmXHMrKFx3KykuKjoiICkKK19fcHl0aG9uX2Z1bmNfcmVnZXhwX18gICA9IHJlLmNvbXBpbGUoIHIiKFxzKy4qKXwoXiQpIiApCisKKworX19pbmZ1bmNfXyA9IFtdCitfX2lucHl0aG9uX18gPSBGYWxzZQorX19ib2R5X18gICA9IFtdCitfX2NsYXNzbmFtZV9fID0gIiIKKworY2FjaGVkX3N0YXRlbWVudHMgPSB7fQorCisjIFdlIG5lZWQgdG8gaW5kaWNhdGUgRU9GIHRvIHRoZSBmZWVkZXIuIFRoaXMgY29kZSBpcyBzbyBtZXNzeSB0aGF0CisjIGZhY3RvcmluZyBpdCBvdXQgdG8gYSBjbG9zZV9wYXJzZV9maWxlIG1ldGhvZCBpcyBvdXQgb2YgcXVlc3Rpb24uCisjIFdlIHdpbGwgdXNlIHRoZSBJTl9QWVRIT05fRU9GIGFzIGFuIGluZGljYXRvciB0byBqdXN0IGNsb3NlIHRoZSBtZXRob2QKKyMKKyMgVGhlIHR3byBwYXJ0cyB1c2luZyBpdCBhcmUgdGlnaHRseSBpbnRlZ3JhdGVkIGFueXdheQorSU5fUFlUSE9OX0VPRiA9IC05OTk5OTk5OTk5OTk5CisKKworCitkZWYgc3VwcG9ydHMoZm4sIGQpOgorICAgICIiIlJldHVybiBUcnVlIGlmIGZuIGhhcyBhIHN1cHBvcnRlZCBleHRlbnNpb24iIiIKKyAgICByZXR1cm4gb3MucGF0aC5zcGxpdGV4dChmbilbLTFdIGluIFsiLmJiIiwgIi5iYmNsYXNzIiwgIi5pbmMiXQorCitkZWYgaW5oZXJpdChmaWxlcywgZm4sIGxpbmVubywgZCk6CisgICAgX19pbmhlcml0X2NhY2hlID0gZC5nZXRWYXIoJ19faW5oZXJpdF9jYWNoZScsIEZhbHNlKSBvciBbXQorICAgIGZpbGVzID0gZC5leHBhbmQoZmlsZXMpLnNwbGl0KCkKKyAgICBmb3IgZmlsZSBpbiBmaWxlczoKKyAgICAgICAgaWYgbm90IG9zLnBhdGguaXNhYnMoZmlsZSkgYW5kIG5vdCBmaWxlLmVuZHN3aXRoKCIuYmJjbGFzcyIpOgorICAgICAgICAgICAgZmlsZSA9IG9zLnBhdGguam9pbignY2xhc3NlcycsICclcy5iYmNsYXNzJyAlIGZpbGUpCisKKyAgICAgICAgaWYgbm90IG9zLnBhdGguaXNhYnMoZmlsZSk6CisgICAgICAgICAgICBiYnBhdGggPSBkLmdldFZhcigiQkJQQVRIIiwgVHJ1ZSkKKyAgICAgICAgICAgIGFic19mbiwgYXR0ZW1wdHMgPSBiYi51dGlscy53aGljaChiYnBhdGgsIGZpbGUsIGhpc3Rvcnk9VHJ1ZSkKKyAgICAgICAgICAgIGZvciBhZiBpbiBhdHRlbXB0czoKKyAgICAgICAgICAgICAgICBpZiBhZiAhPSBhYnNfZm46CisgICAgICAgICAgICAgICAgICAgIGJiLnBhcnNlLm1hcmtfZGVwZW5kZW5jeShkLCBhZikKKyAgICAgICAgICAgIGlmIGFic19mbjoKKyAgICAgICAgICAgICAgICBmaWxlID0gYWJzX2ZuCisKKyAgICAgICAgaWYgbm90IGZpbGUgaW4gX19pbmhlcml0X2NhY2hlOgorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJJbmhlcml0aW5nICVzIChmcm9tICVzOiVkKSIgJSAoZmlsZSwgZm4sIGxpbmVubykpCisgICAgICAgICAgICBfX2luaGVyaXRfY2FjaGUuYXBwZW5kKCBmaWxlICkKKyAgICAgICAgICAgIGQuc2V0VmFyKCdfX2luaGVyaXRfY2FjaGUnLCBfX2luaGVyaXRfY2FjaGUpCisgICAgICAgICAgICBpbmNsdWRlKGZuLCBmaWxlLCBsaW5lbm8sIGQsICJpbmhlcml0IikKKyAgICAgICAgICAgIF9faW5oZXJpdF9jYWNoZSA9IGQuZ2V0VmFyKCdfX2luaGVyaXRfY2FjaGUnLCBGYWxzZSkgb3IgW10KKworZGVmIGdldF9zdGF0ZW1lbnRzKGZpbGVuYW1lLCBhYnNvbHV0ZV9maWxlbmFtZSwgYmFzZV9uYW1lKToKKyAgICBnbG9iYWwgY2FjaGVkX3N0YXRlbWVudHMKKworICAgIHRyeToKKyAgICAgICAgcmV0dXJuIGNhY2hlZF9zdGF0ZW1lbnRzW2Fic29sdXRlX2ZpbGVuYW1lXQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgZmlsZSA9IG9wZW4oYWJzb2x1dGVfZmlsZW5hbWUsICdyJykKKyAgICAgICAgc3RhdGVtZW50cyA9IGFzdC5TdGF0ZW1lbnRHcm91cCgpCisKKyAgICAgICAgbGluZW5vID0gMAorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgbGluZW5vID0gbGluZW5vICsgMQorICAgICAgICAgICAgcyA9IGZpbGUucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbm90IHM6IGJyZWFrCisgICAgICAgICAgICBzID0gcy5yc3RyaXAoKQorICAgICAgICAgICAgZmVlZGVyKGxpbmVubywgcywgZmlsZW5hbWUsIGJhc2VfbmFtZSwgc3RhdGVtZW50cykKKyAgICAgICAgZmlsZS5jbG9zZSgpCisgICAgICAgIGlmIF9faW5weXRob25fXzoKKyAgICAgICAgICAgICMgYWRkIGEgYmxhbmsgbGluZSB0byBjbG9zZSBvdXQgYW55IHB5dGhvbiBkZWZpbml0aW9uCisgICAgICAgICAgICBmZWVkZXIoSU5fUFlUSE9OX0VPRiwgIiIsIGZpbGVuYW1lLCBiYXNlX25hbWUsIHN0YXRlbWVudHMpCisKKyAgICAgICAgaWYgZmlsZW5hbWUuZW5kc3dpdGgoIi5iYmNsYXNzIikgb3IgZmlsZW5hbWUuZW5kc3dpdGgoIi5pbmMiKToKKyAgICAgICAgICAgIGNhY2hlZF9zdGF0ZW1lbnRzW2Fic29sdXRlX2ZpbGVuYW1lXSA9IHN0YXRlbWVudHMKKyAgICAgICAgcmV0dXJuIHN0YXRlbWVudHMKKworZGVmIGhhbmRsZShmbiwgZCwgaW5jbHVkZSk6CisgICAgZ2xvYmFsIF9fZnVuY19zdGFydF9yZWdleHBfXywgX19pbmhlcml0X3JlZ2V4cF9fLCBfX2V4cG9ydF9mdW5jX3JlZ2V4cF9fLCBfX2FkZHRhc2tfcmVnZXhwX18sIF9fYWRkaGFuZGxlcl9yZWdleHBfXywgX19pbmZ1bmNfXywgX19ib2R5X18sIF9fcmVzaWR1ZV9fLCBfX2NsYXNzbmFtZV9fCisgICAgX19ib2R5X18gPSBbXQorICAgIF9faW5mdW5jX18gPSBbXQorICAgIF9fY2xhc3NuYW1lX18gPSAiIgorICAgIF9fcmVzaWR1ZV9fID0gW10KKworICAgIGJhc2VfbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoZm4pCisgICAgKHJvb3QsIGV4dCkgPSBvcy5wYXRoLnNwbGl0ZXh0KGJhc2VfbmFtZSkKKyAgICBpbml0KGQpCisKKyAgICBpZiBleHQgPT0gIi5iYmNsYXNzIjoKKyAgICAgICAgX19jbGFzc25hbWVfXyA9IHJvb3QKKyAgICAgICAgX19pbmhlcml0X2NhY2hlID0gZC5nZXRWYXIoJ19faW5oZXJpdF9jYWNoZScsIEZhbHNlKSBvciBbXQorICAgICAgICBpZiBub3QgZm4gaW4gX19pbmhlcml0X2NhY2hlOgorICAgICAgICAgICAgX19pbmhlcml0X2NhY2hlLmFwcGVuZChmbikKKyAgICAgICAgICAgIGQuc2V0VmFyKCdfX2luaGVyaXRfY2FjaGUnLCBfX2luaGVyaXRfY2FjaGUpCisKKyAgICBpZiBpbmNsdWRlICE9IDA6CisgICAgICAgIG9sZGZpbGUgPSBkLmdldFZhcignRklMRScsIEZhbHNlKQorICAgIGVsc2U6CisgICAgICAgIG9sZGZpbGUgPSBOb25lCisKKyAgICBhYnNfZm4gPSByZXNvbHZlX2ZpbGUoZm4sIGQpCisKKyAgICBpZiBpbmNsdWRlOgorICAgICAgICBiYi5wYXJzZS5tYXJrX2RlcGVuZGVuY3koZCwgYWJzX2ZuKQorCisgICAgIyBhY3R1YWwgbG9hZGluZworICAgIHN0YXRlbWVudHMgPSBnZXRfc3RhdGVtZW50cyhmbiwgYWJzX2ZuLCBiYXNlX25hbWUpCisKKyAgICAjIERPTkUgV0lUSCBQQVJTSU5HLi4uIHRpbWUgdG8gZXZhbHVhdGUKKyAgICBpZiBleHQgIT0gIi5iYmNsYXNzIiBhbmQgYWJzX2ZuICE9IG9sZGZpbGU6CisgICAgICAgIGQuc2V0VmFyKCdGSUxFJywgYWJzX2ZuKQorCisgICAgdHJ5OgorICAgICAgICBzdGF0ZW1lbnRzLmV2YWwoZCkKKyAgICBleGNlcHQgYmIucGFyc2UuU2tpcFJlY2lwZToKKyAgICAgICAgYmIuZGF0YS5zZXRWYXIoIl9fU0tJUFBFRCIsIFRydWUsIGQpCisgICAgICAgIGlmIGluY2x1ZGUgPT0gMDoKKyAgICAgICAgICAgIHJldHVybiB7ICIiIDogZCB9CisKKyAgICBpZiBfX2luZnVuY19fOgorICAgICAgICByYWlzZSBQYXJzZUVycm9yKCJTaGVsbCBmdW5jdGlvbiAlcyBpcyBuZXZlciBjbG9zZWQiICUgX19pbmZ1bmNfX1swXSwgX19pbmZ1bmNfX1sxXSwgX19pbmZ1bmNfX1syXSkKKyAgICBpZiBfX3Jlc2lkdWVfXzoKKyAgICAgICAgcmFpc2UgUGFyc2VFcnJvcigiTGVmdG92ZXIgdW5wYXJzZWQgKGluY29tcGxldGU/KSBkYXRhICVzIGZyb20gJXMiICUgX19yZXNpZHVlX18sIGZuKQorCisgICAgaWYgZXh0ICE9ICIuYmJjbGFzcyIgYW5kIGluY2x1ZGUgPT0gMDoKKyAgICAgICAgcmV0dXJuIGFzdC5tdWx0aV9maW5hbGl6ZShmbiwgZCkKKworICAgIGlmIGV4dCAhPSAiLmJiY2xhc3MiIGFuZCBvbGRmaWxlIGFuZCBhYnNfZm4gIT0gb2xkZmlsZToKKyAgICAgICAgZC5zZXRWYXIoIkZJTEUiLCBvbGRmaWxlKQorCisgICAgcmV0dXJuIGQKKworZGVmIGZlZWRlcihsaW5lbm8sIHMsIGZuLCByb290LCBzdGF0ZW1lbnRzKToKKyAgICBnbG9iYWwgX19mdW5jX3N0YXJ0X3JlZ2V4cF9fLCBfX2luaGVyaXRfcmVnZXhwX18sIF9fZXhwb3J0X2Z1bmNfcmVnZXhwX18sIF9fYWRkdGFza19yZWdleHBfXywgX19hZGRoYW5kbGVyX3JlZ2V4cF9fLCBfX2RlZl9yZWdleHBfXywgX19weXRob25fZnVuY19yZWdleHBfXywgX19pbnB5dGhvbl9fLCBfX2luZnVuY19fLCBfX2JvZHlfXywgYmIsIF9fcmVzaWR1ZV9fLCBfX2NsYXNzbmFtZV9fCisgICAgaWYgX19pbmZ1bmNfXzoKKyAgICAgICAgaWYgcyA9PSAnfSc6CisgICAgICAgICAgICBfX2JvZHlfXy5hcHBlbmQoJycpCisgICAgICAgICAgICBhc3QuaGFuZGxlTWV0aG9kKHN0YXRlbWVudHMsIGZuLCBsaW5lbm8sIF9faW5mdW5jX19bMF0sIF9fYm9keV9fKQorICAgICAgICAgICAgX19pbmZ1bmNfXyA9IFtdCisgICAgICAgICAgICBfX2JvZHlfXyA9IFtdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBfX2JvZHlfXy5hcHBlbmQocykKKyAgICAgICAgcmV0dXJuCisKKyAgICBpZiBfX2lucHl0aG9uX186CisgICAgICAgIG0gPSBfX3B5dGhvbl9mdW5jX3JlZ2V4cF9fLm1hdGNoKHMpCisgICAgICAgIGlmIG0gYW5kIGxpbmVubyAhPSBJTl9QWVRIT05fRU9GOgorICAgICAgICAgICAgX19ib2R5X18uYXBwZW5kKHMpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFzdC5oYW5kbGVQeXRob25NZXRob2Qoc3RhdGVtZW50cywgZm4sIGxpbmVubywgX19pbnB5dGhvbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290LCBfX2JvZHlfXykKKyAgICAgICAgICAgIF9fYm9keV9fID0gW10KKyAgICAgICAgICAgIF9faW5weXRob25fXyA9IEZhbHNlCisKKyAgICAgICAgICAgIGlmIGxpbmVubyA9PSBJTl9QWVRIT05fRU9GOgorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgaWYgcyBhbmQgc1swXSA9PSAnIyc6CisgICAgICAgIGlmIGxlbihfX3Jlc2lkdWVfXykgIT0gMCBhbmQgX19yZXNpZHVlX19bMF1bMF0gIT0gIiMiOgorICAgICAgICAgICAgYmIuZmF0YWwoIlRoZXJlIGlzIGEgY29tbWVudCBvbiBsaW5lICVzIG9mIGZpbGUgJXMgKCVzKSB3aGljaCBpcyBpbiB0aGUgbWlkZGxlIG9mIGEgbXVsdGlsaW5lIGV4cHJlc3Npb24uXG5CaXRiYWtlIHVzZWQgdG8gaWdub3JlIHRoZXNlIGJ1dCBubyBsb25nZXIgZG9lcyBzbywgcGxlYXNlIGZpeCB5b3VyIG1ldGFkYXRhIGFzIGVycm9ycyBhcmUgbGlrZWx5IGFzIGEgcmVzdWx0IG9mIHRoaXMgY2hhbmdlLiIgJSAobGluZW5vLCBmbiwgcykpCisKKyAgICBpZiBsZW4oX19yZXNpZHVlX18pICE9IDAgYW5kIF9fcmVzaWR1ZV9fWzBdWzBdID09ICIjIiBhbmQgKG5vdCBzIG9yIHNbMF0gIT0gIiMiKToKKyAgICAgICAgYmIuZmF0YWwoIlRoZXJlIGlzIGEgY29uZnVzaW5nIG11bHRpbGluZSwgcGFydGlhbGx5IGNvbW1lbnRlZCBleHByZXNzaW9uIG9uIGxpbmUgJXMgb2YgZmlsZSAlcyAoJXMpLlxuUGxlYXNlIGNsYXJpZnkgd2hldGhlciB0aGlzIGlzIGFsbCBhIGNvbW1lbnQgb3Igc2hvdWxkIGJlIHBhcnNlZC4iICUgKGxpbmVubywgZm4sIHMpKQorCisgICAgaWYgcyBhbmQgc1stMV0gPT0gJ1xcJzoKKyAgICAgICAgX19yZXNpZHVlX18uYXBwZW5kKHNbOi0xXSkKKyAgICAgICAgcmV0dXJuCisKKyAgICBzID0gIiIuam9pbihfX3Jlc2lkdWVfXykgKyBzCisgICAgX19yZXNpZHVlX18gPSBbXQorCisgICAgIyBTa2lwIGVtcHR5IGxpbmVzCisgICAgaWYgcyA9PSAnJzoKKyAgICAgICAgcmV0dXJuICAgCisKKyAgICAjIFNraXAgY29tbWVudHMKKyAgICBpZiBzWzBdID09ICcjJzoKKyAgICAgICAgcmV0dXJuCisKKyAgICBtID0gX19mdW5jX3N0YXJ0X3JlZ2V4cF9fLm1hdGNoKHMpCisgICAgaWYgbToKKyAgICAgICAgX19pbmZ1bmNfXyA9IFttLmdyb3VwKCJmdW5jIikgb3IgIl9fYW5vbnltb3VzIiwgZm4sIGxpbmVub10KKyAgICAgICAgYXN0LmhhbmRsZU1ldGhvZEZsYWdzKHN0YXRlbWVudHMsIGZuLCBsaW5lbm8sIF9faW5mdW5jX19bMF0sIG0pCisgICAgICAgIHJldHVybgorCisgICAgbSA9IF9fZGVmX3JlZ2V4cF9fLm1hdGNoKHMpCisgICAgaWYgbToKKyAgICAgICAgX19ib2R5X18uYXBwZW5kKHMpCisgICAgICAgIF9faW5weXRob25fXyA9IG0uZ3JvdXAoMSkKKworICAgICAgICByZXR1cm4KKworICAgIG0gPSBfX2V4cG9ydF9mdW5jX3JlZ2V4cF9fLm1hdGNoKHMpCisgICAgaWYgbToKKyAgICAgICAgYXN0LmhhbmRsZUV4cG9ydEZ1bmNzKHN0YXRlbWVudHMsIGZuLCBsaW5lbm8sIG0sIF9fY2xhc3NuYW1lX18pCisgICAgICAgIHJldHVybgorCisgICAgbSA9IF9fYWRkdGFza19yZWdleHBfXy5tYXRjaChzKQorICAgIGlmIG06CisgICAgICAgIGFzdC5oYW5kbGVBZGRUYXNrKHN0YXRlbWVudHMsIGZuLCBsaW5lbm8sIG0pCisgICAgICAgIHJldHVybgorCisgICAgbSA9IF9fZGVsdGFza19yZWdleHBfXy5tYXRjaChzKQorICAgIGlmIG06CisgICAgICAgIGFzdC5oYW5kbGVEZWxUYXNrKHN0YXRlbWVudHMsIGZuLCBsaW5lbm8sIG0pCisgICAgICAgIHJldHVybgorCisgICAgbSA9IF9fYWRkaGFuZGxlcl9yZWdleHBfXy5tYXRjaChzKQorICAgIGlmIG06CisgICAgICAgIGFzdC5oYW5kbGVCQkhhbmRsZXJzKHN0YXRlbWVudHMsIGZuLCBsaW5lbm8sIG0pCisgICAgICAgIHJldHVybgorCisgICAgbSA9IF9faW5oZXJpdF9yZWdleHBfXy5tYXRjaChzKQorICAgIGlmIG06CisgICAgICAgIGFzdC5oYW5kbGVJbmhlcml0KHN0YXRlbWVudHMsIGZuLCBsaW5lbm8sIG0pCisgICAgICAgIHJldHVybgorCisgICAgcmV0dXJuIENvbmZIYW5kbGVyLmZlZWRlcihsaW5lbm8sIHMsIGZuLCBzdGF0ZW1lbnRzKQorCisjIEFkZCB1cyB0byB0aGUgaGFuZGxlcnMgbGlzdAorZnJvbSAuLiBpbXBvcnQgaGFuZGxlcnMKK2hhbmRsZXJzLmFwcGVuZCh7J3N1cHBvcnRzJzogc3VwcG9ydHMsICdoYW5kbGUnOiBoYW5kbGUsICdpbml0JzogaW5pdH0pCitkZWwgaGFuZGxlcnMKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3BhcnNlL3BhcnNlX3B5L0NvbmZIYW5kbGVyLnB5IGIvYml0YmFrZS9saWIvYmIvcGFyc2UvcGFyc2VfcHkvQ29uZkhhbmRsZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJkNzViMQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3BhcnNlL3BhcnNlX3B5L0NvbmZIYW5kbGVyLnB5CkBAIC0wLDAgKzEsMTkzIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisiIiIKKyAgIGNsYXNzIGZvciBoYW5kbGluZyBjb25maWd1cmF0aW9uIGRhdGEgZmlsZXMKKworICAgUmVhZHMgYSAuY29uZiBmaWxlIGFuZCBvYnRhaW5zIGl0cyBtZXRhZGF0YQorCisiIiIKKworIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgIENocmlzIExhcnNvbgorIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgIFBoaWwgQmx1bmRlbGwKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBlcnJubworaW1wb3J0IHJlCitpbXBvcnQgb3MKK2ltcG9ydCBiYi51dGlscworZnJvbSBiYi5wYXJzZSBpbXBvcnQgUGFyc2VFcnJvciwgcmVzb2x2ZV9maWxlLCBhc3QsIGxvZ2dlciwgaGFuZGxlCisKK19fY29uZmlnX3JlZ2V4cF9fICA9IHJlLmNvbXBpbGUoIHIiIiIKKyAgICBeCisgICAgKD9QPGV4cD5leHBvcnRccyopPworICAgICg/UDx2YXI+W2EtekEtWjAtOVwtfl8rLiR7fS9dKz8pCisgICAgKFxbKD9QPGZsYWc+W2EtekEtWjAtOVwtXysuXSspXF0pPworCisgICAgXHMqICgKKyAgICAgICAgKD9QPGNvbG9uPjo9KSB8CisgICAgICAgICg/UDxsYXp5cXVlcz5cP1w/PSkgfAorICAgICAgICAoP1A8cXVlcz5cPz0pIHwKKyAgICAgICAgKD9QPGFwcGVuZD5cKz0pIHwKKyAgICAgICAgKD9QPHByZXBlbmQ+PVwrKSB8CisgICAgICAgICg/UDxwcmVkb3Q+PVwuKSB8CisgICAgICAgICg/UDxwb3N0ZG90PlwuPSkgfAorICAgICAgICA9CisgICAgKSBccyoKKworICAgICg/ISdbXiddKidbXiddKickKQorICAgICg/IVwiW15cIl0qXCJbXlwiXSpcIiQpCisgICAgKD9QPGFwbz5bJ1wiXSkKKyAgICAoP1A8dmFsdWU+LiopCisgICAgKD9QPWFwbykKKyAgICAkCisgICAgIiIiLCByZS5YKQorX19pbmNsdWRlX3JlZ2V4cF9fID0gcmUuY29tcGlsZSggciJpbmNsdWRlXHMrKC4rKSIgKQorX19yZXF1aXJlX3JlZ2V4cF9fID0gcmUuY29tcGlsZSggciJyZXF1aXJlXHMrKC4rKSIgKQorX19leHBvcnRfcmVnZXhwX18gPSByZS5jb21waWxlKCByImV4cG9ydFxzKyhbYS16QS1aMC05XC1fKy4ke30vXSspJCIgKQorCitkZWYgaW5pdChkYXRhKToKKyAgICB0b3BkaXIgPSBkYXRhLmdldFZhcignVE9QRElSJywgRmFsc2UpCisgICAgaWYgbm90IHRvcGRpcjoKKyAgICAgICAgZGF0YS5zZXRWYXIoJ1RPUERJUicsIG9zLmdldGN3ZCgpKQorCisKK2RlZiBzdXBwb3J0cyhmbiwgZCk6CisgICAgcmV0dXJuIGZuWy01Ol0gPT0gIi5jb25mIgorCitkZWYgaW5jbHVkZShwYXJlbnRmbiwgZm4sIGxpbmVubywgZGF0YSwgZXJyb3Jfb3V0KToKKyAgICAiIiIKKyAgICBlcnJvcl9vdXQ6IEEgc3RyaW5nIGluZGljYXRpbmcgdGhlIHZlcmIgKGUuZy4gImluY2x1ZGUiLCAiaW5oZXJpdCIpIHRvIGJlCisgICAgdXNlZCBpbiBhIFBhcnNlRXJyb3IgdGhhdCB3aWxsIGJlIHJhaXNlZCBpZiB0aGUgZmlsZSB0byBiZSBpbmNsdWRlZCBjb3VsZAorICAgIG5vdCBiZSBpbmNsdWRlZC4gU3BlY2lmeSBGYWxzZSB0byBhdm9pZCByYWlzaW5nIGFuIGVycm9yIGluIHRoaXMgY2FzZS4KKyAgICAiIiIKKyAgICBpZiBwYXJlbnRmbiA9PSBmbjogIyBwcmV2ZW50IGluZmluaXRlIHJlY3Vyc2lvbgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZm4gPSBkYXRhLmV4cGFuZChmbikKKyAgICBwYXJlbnRmbiA9IGRhdGEuZXhwYW5kKHBhcmVudGZuKQorCisgICAgaWYgbm90IG9zLnBhdGguaXNhYnMoZm4pOgorICAgICAgICBkbmFtZSA9IG9zLnBhdGguZGlybmFtZShwYXJlbnRmbikKKyAgICAgICAgYmJwYXRoID0gIiVzOiVzIiAlIChkbmFtZSwgZGF0YS5nZXRWYXIoIkJCUEFUSCIsIFRydWUpKQorICAgICAgICBhYnNfZm4sIGF0dGVtcHRzID0gYmIudXRpbHMud2hpY2goYmJwYXRoLCBmbiwgaGlzdG9yeT1UcnVlKQorICAgICAgICBpZiBhYnNfZm4gYW5kIGJiLnBhcnNlLmNoZWNrX2RlcGVuZGVuY3koZGF0YSwgYWJzX2ZuKToKKyAgICAgICAgICAgIGxvZ2dlci53YXJuKCJEdXBsaWNhdGUgaW5jbHVzaW9uIGZvciAlcyBpbiAlcyIgJSAoYWJzX2ZuLCBkYXRhLmdldFZhcignRklMRScsIFRydWUpKSkKKyAgICAgICAgZm9yIGFmIGluIGF0dGVtcHRzOgorICAgICAgICAgICAgYmIucGFyc2UubWFya19kZXBlbmRlbmN5KGRhdGEsIGFmKQorICAgICAgICBpZiBhYnNfZm46CisgICAgICAgICAgICBmbiA9IGFic19mbgorICAgIGVsaWYgYmIucGFyc2UuY2hlY2tfZGVwZW5kZW5jeShkYXRhLCBmbik6CisgICAgICAgIGxvZ2dlci53YXJuKCJEdXBsaWNhdGUgaW5jbHVzaW9uIGZvciAlcyBpbiAlcyIgJSAoZm4sIGRhdGEuZ2V0VmFyKCdGSUxFJywgVHJ1ZSkpKQorCisgICAgdHJ5OgorICAgICAgICBiYi5wYXJzZS5oYW5kbGUoZm4sIGRhdGEsIFRydWUpCisgICAgZXhjZXB0IChJT0Vycm9yLCBPU0Vycm9yKSBhcyBleGM6CisgICAgICAgIGlmIGV4Yy5lcnJubyA9PSBlcnJuby5FTk9FTlQ6CisgICAgICAgICAgICBpZiBlcnJvcl9vdXQ6CisgICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFcnJvcigiQ291bGQgbm90ICVzIGZpbGUgJXMiICUgKGVycm9yX291dCwgZm4pLCBwYXJlbnRmbiwgbGluZW5vKQorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICJDT05GIGZpbGUgJyVzJyBub3QgZm91bmQiLCBmbikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIGVycm9yX291dDoKKyAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUVycm9yKCJDb3VsZCBub3QgJXMgZmlsZSAlczogJXMiICUgKGVycm9yX291dCwgZm4sIGV4Yy5zdHJlcnJvciksIHBhcmVudGZuLCBsaW5lbm8pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXJyb3IoIkVycm9yIHBhcnNpbmcgJXM6ICVzIiAlIChmbiwgZXhjLnN0cmVycm9yKSwgcGFyZW50Zm4sIGxpbmVubykKKworIyBXZSBoYXZlIGFuIGlzc3VlIHdoZXJlIGEgVUkgbWlnaHQgd2FudCB0byBlbmZvcmNlIHBhcnRpY3VsYXIgc2V0dGluZ3Mgc3VjaCBhcworIyBhbiBlbXB0eSBESVNUUk8gdmFyaWFibGUuIElmIGNvbmZpZ3VyYXRpb24gZmlsZXMgZG8gc29tZXRoaW5nIGxpa2UgYXNzaWduaW5nCisjIGEgd2VhayBkZWZhdWx0LCBpdCB0dXJucyBvdXQgdG8gYmUgdmVyeSBkaWZmaWN1bHQgdG8gZmlsdGVyIG91dCB0aGVzZSBjaGFuZ2VzLAorIyBwYXJ0aWN1bGFybHkgd2hlbiB0aGUgd2VhayBkZWZhdWx0IG1pZ2h0IGFwcGVhciBoYWxmIHdheSB0aG91Z2ggcGFyc2luZyBhIGNoYWluIAorIyBvZiBjb25maWd1cmF0aW9uIGZpbGVzLiBXZSB0aGVyZWZvcmUgbGV0IHRoZSBVSXMgaG9vayBpbnRvIGNvbmZpZ3VyYXRpb24gZmlsZQorIyBwYXJzaW5nLiBUaGlzIHR1cm5zIG91dCB0byBiZSBhIGhhcmQgcHJvYmxlbSB0byBzb2x2ZSBhbnkgb3RoZXIgd2F5LgorY29uZkZpbHRlcnMgPSBbXQorCitkZWYgaGFuZGxlKGZuLCBkYXRhLCBpbmNsdWRlKToKKyAgICBpbml0KGRhdGEpCisKKyAgICBpZiBpbmNsdWRlID09IDA6CisgICAgICAgIG9sZGZpbGUgPSBOb25lCisgICAgZWxzZToKKyAgICAgICAgb2xkZmlsZSA9IGRhdGEuZ2V0VmFyKCdGSUxFJywgRmFsc2UpCisKKyAgICBhYnNfZm4gPSByZXNvbHZlX2ZpbGUoZm4sIGRhdGEpCisgICAgZiA9IG9wZW4oYWJzX2ZuLCAncicpCisKKyAgICBpZiBpbmNsdWRlOgorICAgICAgICBiYi5wYXJzZS5tYXJrX2RlcGVuZGVuY3koZGF0YSwgYWJzX2ZuKQorCisgICAgc3RhdGVtZW50cyA9IGFzdC5TdGF0ZW1lbnRHcm91cCgpCisgICAgbGluZW5vID0gMAorICAgIHdoaWxlIFRydWU6CisgICAgICAgIGxpbmVubyA9IGxpbmVubyArIDEKKyAgICAgICAgcyA9IGYucmVhZGxpbmUoKQorICAgICAgICBpZiBub3QgczoKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHcgPSBzLnN0cmlwKCkKKyAgICAgICAgIyBza2lwIGVtcHR5IGxpbmVzCisgICAgICAgIGlmIG5vdCB3OgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgcyA9IHMucnN0cmlwKCkKKyAgICAgICAgd2hpbGUgc1stMV0gPT0gJ1xcJzoKKyAgICAgICAgICAgIHMyID0gZi5yZWFkbGluZSgpLnN0cmlwKCkKKyAgICAgICAgICAgIGxpbmVubyA9IGxpbmVubyArIDEKKyAgICAgICAgICAgIGlmIChub3QgczIgb3IgczIgYW5kIHMyWzBdICE9ICIjIikgYW5kIHNbMF0gPT0gIiMiIDoKKyAgICAgICAgICAgICAgICBiYi5mYXRhbCgiVGhlcmUgaXMgYSBjb25mdXNpbmcgbXVsdGlsaW5lLCBwYXJ0aWFsbHkgY29tbWVudGVkIGV4cHJlc3Npb24gb24gbGluZSAlcyBvZiBmaWxlICVzICglcykuXG5QbGVhc2UgY2xhcmlmeSB3aGV0aGVyIHRoaXMgaXMgYWxsIGEgY29tbWVudCBvciBzaG91bGQgYmUgcGFyc2VkLiIgJSAobGluZW5vLCBmbiwgcykpCisgICAgICAgICAgICBzID0gc1s6LTFdICsgczIKKyAgICAgICAgIyBza2lwIGNvbW1lbnRzCisgICAgICAgIGlmIHNbMF0gPT0gJyMnOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgZmVlZGVyKGxpbmVubywgcywgYWJzX2ZuLCBzdGF0ZW1lbnRzKQorCisgICAgIyBET05FIFdJVEggUEFSU0lORy4uLiB0aW1lIHRvIGV2YWx1YXRlCisgICAgZGF0YS5zZXRWYXIoJ0ZJTEUnLCBhYnNfZm4pCisgICAgc3RhdGVtZW50cy5ldmFsKGRhdGEpCisgICAgaWYgb2xkZmlsZToKKyAgICAgICAgZGF0YS5zZXRWYXIoJ0ZJTEUnLCBvbGRmaWxlKQorCisgICAgZi5jbG9zZSgpCisKKyAgICBmb3IgZiBpbiBjb25mRmlsdGVyczoKKyAgICAgICAgZihmbiwgZGF0YSkKKworICAgIHJldHVybiBkYXRhCisKK2RlZiBmZWVkZXIobGluZW5vLCBzLCBmbiwgc3RhdGVtZW50cyk6CisgICAgbSA9IF9fY29uZmlnX3JlZ2V4cF9fLm1hdGNoKHMpCisgICAgaWYgbToKKyAgICAgICAgZ3JvdXBkID0gbS5ncm91cGRpY3QoKQorICAgICAgICBhc3QuaGFuZGxlRGF0YShzdGF0ZW1lbnRzLCBmbiwgbGluZW5vLCBncm91cGQpCisgICAgICAgIHJldHVybgorCisgICAgbSA9IF9faW5jbHVkZV9yZWdleHBfXy5tYXRjaChzKQorICAgIGlmIG06CisgICAgICAgIGFzdC5oYW5kbGVJbmNsdWRlKHN0YXRlbWVudHMsIGZuLCBsaW5lbm8sIG0sIEZhbHNlKQorICAgICAgICByZXR1cm4KKworICAgIG0gPSBfX3JlcXVpcmVfcmVnZXhwX18ubWF0Y2gocykKKyAgICBpZiBtOgorICAgICAgICBhc3QuaGFuZGxlSW5jbHVkZShzdGF0ZW1lbnRzLCBmbiwgbGluZW5vLCBtLCBUcnVlKQorICAgICAgICByZXR1cm4KKworICAgIG0gPSBfX2V4cG9ydF9yZWdleHBfXy5tYXRjaChzKQorICAgIGlmIG06CisgICAgICAgIGFzdC5oYW5kbGVFeHBvcnQoc3RhdGVtZW50cywgZm4sIGxpbmVubywgbSkKKyAgICAgICAgcmV0dXJuCisKKyAgICByYWlzZSBQYXJzZUVycm9yKCJ1bnBhcnNlZCBsaW5lOiAnJXMnIiAlIHMsIGZuLCBsaW5lbm8pOworCisjIEFkZCB1cyB0byB0aGUgaGFuZGxlcnMgbGlzdAorZnJvbSBiYi5wYXJzZSBpbXBvcnQgaGFuZGxlcnMKK2hhbmRsZXJzLmFwcGVuZCh7J3N1cHBvcnRzJzogc3VwcG9ydHMsICdoYW5kbGUnOiBoYW5kbGUsICdpbml0JzogaW5pdH0pCitkZWwgaGFuZGxlcnMKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3BhcnNlL3BhcnNlX3B5L19faW5pdF9fLnB5IGIvYml0YmFrZS9saWIvYmIvcGFyc2UvcGFyc2VfcHkvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U2NThkMAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3BhcnNlL3BhcnNlX3B5L19faW5pdF9fLnB5CkBAIC0wLDAgKzEsMzMgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyIiIgorQml0QmFrZSBQYXJzZXJzCisKK0ZpbGUgcGFyc2VycyBmb3IgdGhlIEJpdEJha2UgYnVpbGQgdG9vbHMuCisKKyIiIgorCisjIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCAgQ2hyaXMgTGFyc29uCisjIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCAgUGhpbCBCbHVuZGVsbAorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKyMgQmFzZWQgb24gZnVuY3Rpb25zIGZyb20gdGhlIGJhc2UgYmIgbW9kdWxlLCBDb3B5cmlnaHQgMjAwMyBIb2xnZXIgU2NodXJpZworCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAorZnJvbSAuIGltcG9ydCBDb25mSGFuZGxlcgorZnJvbSAuIGltcG9ydCBCQkhhbmRsZXIKKworX192ZXJzaW9uX18gPSAnMS4wJwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvcGVyc2lzdF9kYXRhLnB5IGIvYml0YmFrZS9saWIvYmIvcGVyc2lzdF9kYXRhLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3OTViYzgKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9wZXJzaXN0X2RhdGEucHkKQEAgLTAsMCArMSwyMTcgQEAKKyIiIkJpdEJha2UgUGVyc2lzdGVudCBEYXRhIFN0b3JlCisKK1VzZWQgdG8gc3RvcmUgZGF0YSBpbiBhIGNlbnRyYWwgbG9jYXRpb24gc3VjaCB0aGF0IG90aGVyIHRocmVhZHMvdGFza3MgY2FuCithY2Nlc3MgdGhlbSBhdCBzb21lIGZ1dHVyZSBkYXRlLiAgQWN0cyBhcyBhIGNvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIHNxbGl0ZSwKK2N1cnJlbnRseSwgcHJvdmlkaW5nIGEga2V5L3ZhbHVlIHN0b3JlIGFjY2Vzc2VkIGJ5ICdkb21haW4nLgorIiIiCisKKyMgQ29weXJpZ2h0IChDKSAyMDA3ICAgICAgICBSaWNoYXJkIFB1cmRpZQorIyBDb3B5cmlnaHQgKEMpIDIwMTAgICAgICAgIENocmlzIExhcnNvbiA8Y2hyaXNfbGFyc29uQG1lbnRvci5jb20+CisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitpbXBvcnQgY29sbGVjdGlvbnMKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgb3MucGF0aAoraW1wb3J0IHN5cworaW1wb3J0IHdhcm5pbmdzCitmcm9tIGJiLmNvbXBhdCBpbXBvcnQgdG90YWxfb3JkZXJpbmcKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IE1hcHBpbmcKKwordHJ5OgorICAgIGltcG9ydCBzcWxpdGUzCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZnJvbSBweXNxbGl0ZTIgaW1wb3J0IGRiYXBpMiBhcyBzcWxpdGUzCisKK3NxbHZlcnNpb24gPSBzcWxpdGUzLnNxbGl0ZV92ZXJzaW9uX2luZm8KK2lmIHNxbHZlcnNpb25bMF0gPCAzIG9yIChzcWx2ZXJzaW9uWzBdID09IDMgYW5kIHNxbHZlcnNpb25bMV0gPCAzKToKKyAgICByYWlzZSBFeGNlcHRpb24oInNxbGl0ZTMgdmVyc2lvbiAzLjMuMCBvciBsYXRlciBpcyByZXF1aXJlZC4iKQorCisKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJCaXRCYWtlLlBlcnNpc3REYXRhIikKK2lmIGhhc2F0dHIoc3FsaXRlMywgJ2VuYWJsZV9zaGFyZWRfY2FjaGUnKToKKyAgICB0cnk6CisgICAgICAgIHNxbGl0ZTMuZW5hYmxlX3NoYXJlZF9jYWNoZShUcnVlKQorICAgIGV4Y2VwdCBzcWxpdGUzLk9wZXJhdGlvbmFsRXJyb3I6CisgICAgICAgIHBhc3MKKworCitAdG90YWxfb3JkZXJpbmcKK2NsYXNzIFNRTFRhYmxlKGNvbGxlY3Rpb25zLk11dGFibGVNYXBwaW5nKToKKyAgICAiIiJPYmplY3QgcmVwcmVzZW50aW5nIGEgdGFibGUvZG9tYWluIGluIHRoZSBkYXRhYmFzZSIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjYWNoZWZpbGUsIHRhYmxlKToKKyAgICAgICAgc2VsZi5jYWNoZWZpbGUgPSBjYWNoZWZpbGUKKyAgICAgICAgc2VsZi50YWJsZSA9IHRhYmxlCisgICAgICAgIHNlbGYuY3Vyc29yID0gY29ubmVjdChzZWxmLmNhY2hlZmlsZSkKKworICAgICAgICBzZWxmLl9leGVjdXRlKCJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyAlcyhrZXkgVEVYVCwgdmFsdWUgVEVYVCk7IgorICAgICAgICAgICAgICAgICAgICAgICUgdGFibGUpCisKKyAgICBkZWYgX2V4ZWN1dGUoc2VsZiwgKnF1ZXJ5KToKKyAgICAgICAgIiIiRXhlY3V0ZSBhIHF1ZXJ5LCB3YWl0aW5nIHRvIGFjcXVpcmUgYSBsb2NrIGlmIG5lY2Vzc2FyeSIiIgorICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5jdXJzb3IuZXhlY3V0ZSgqcXVlcnkpCisgICAgICAgICAgICBleGNlcHQgc3FsaXRlMy5PcGVyYXRpb25hbEVycm9yIGFzIGV4YzoKKyAgICAgICAgICAgICAgICBpZiAnZGF0YWJhc2UgaXMgbG9ja2VkJyBpbiBzdHIoZXhjKSBhbmQgY291bnQgPCA1MDA6CisgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyAxCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY3Vyc29yLmNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXJzb3IgPSBjb25uZWN0KHNlbGYuY2FjaGVmaWxlKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICBzZWxmLmN1cnNvci5fX2VudGVyX18oKQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsICpleGNpbmZvKToKKyAgICAgICAgc2VsZi5jdXJzb3IuX19leGl0X18oKmV4Y2luZm8pCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgZGF0YSA9IHNlbGYuX2V4ZWN1dGUoIlNFTEVDVCAqIGZyb20gJXMgd2hlcmUga2V5PT87IiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGFibGUsIFtrZXldKQorICAgICAgICBmb3Igcm93IGluIGRhdGE6CisgICAgICAgICAgICByZXR1cm4gcm93WzFdCisgICAgICAgIHJhaXNlIEtleUVycm9yKGtleSkKKworICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICBpZiBrZXkgbm90IGluIHNlbGY6CisgICAgICAgICAgICByYWlzZSBLZXlFcnJvcihrZXkpCisgICAgICAgIHNlbGYuX2V4ZWN1dGUoIkRFTEVURSBmcm9tICVzIHdoZXJlIGtleT0/OyIgJSBzZWxmLnRhYmxlLCBba2V5XSkKKworICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoa2V5LCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignT25seSBzdHJpbmcga2V5cyBhcmUgc3VwcG9ydGVkJykKKyAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ09ubHkgc3RyaW5nIHZhbHVlcyBhcmUgc3VwcG9ydGVkJykKKworICAgICAgICBkYXRhID0gc2VsZi5fZXhlY3V0ZSgiU0VMRUNUICogZnJvbSAlcyB3aGVyZSBrZXk9PzsiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50YWJsZSwgW2tleV0pCisgICAgICAgIGV4aXN0cyA9IGxlbihsaXN0KGRhdGEpKQorICAgICAgICBpZiBleGlzdHM6CisgICAgICAgICAgICBzZWxmLl9leGVjdXRlKCJVUERBVEUgJXMgU0VUIHZhbHVlPT8gV0hFUkUga2V5PT87IiAlIHNlbGYudGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZSwga2V5XSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2V4ZWN1dGUoIklOU0VSVCBpbnRvICVzKGtleSwgdmFsdWUpIHZhbHVlcyAoPywgPyk7IiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGFibGUsIFtrZXksIHZhbHVlXSkKKworICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwga2V5KToKKyAgICAgICAgcmV0dXJuIGtleSBpbiBzZXQoc2VsZikKKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICBkYXRhID0gc2VsZi5fZXhlY3V0ZSgiU0VMRUNUIENPVU5UKGtleSkgRlJPTSAlczsiICUgc2VsZi50YWJsZSkKKyAgICAgICAgZm9yIHJvdyBpbiBkYXRhOgorICAgICAgICAgICAgcmV0dXJuIHJvd1swXQorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICBkYXRhID0gc2VsZi5fZXhlY3V0ZSgiU0VMRUNUIGtleSBGUk9NICVzOyIgJSBzZWxmLnRhYmxlKQorICAgICAgICByZXR1cm4gKHJvd1swXSBmb3Igcm93IGluIGRhdGEpCisKKyAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIE1hcHBpbmcpOgorICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWQKKworICAgICAgICByZXR1cm4gbGVuKHNlbGYpIDwgbGVuKG90aGVyKQorCisgICAgZGVmIGdldF9ieV9wYXR0ZXJuKHNlbGYsIHBhdHRlcm4pOgorICAgICAgICBkYXRhID0gc2VsZi5fZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBrZXkgTElLRSA/OyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRhYmxlLCBbcGF0dGVybl0pCisgICAgICAgIHJldHVybiBbcm93WzFdIGZvciByb3cgaW4gZGF0YV0KKworICAgIGRlZiB2YWx1ZXMoc2VsZik6CisgICAgICAgIHJldHVybiBsaXN0KHNlbGYuaXRlcnZhbHVlcygpKQorCisgICAgZGVmIGl0ZXJ2YWx1ZXMoc2VsZik6CisgICAgICAgIGRhdGEgPSBzZWxmLl9leGVjdXRlKCJTRUxFQ1QgdmFsdWUgRlJPTSAlczsiICUgc2VsZi50YWJsZSkKKyAgICAgICAgcmV0dXJuIChyb3dbMF0gZm9yIHJvdyBpbiBkYXRhKQorCisgICAgZGVmIGl0ZW1zKHNlbGYpOgorICAgICAgICByZXR1cm4gbGlzdChzZWxmLml0ZXJpdGVtcygpKQorCisgICAgZGVmIGl0ZXJpdGVtcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2V4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXM7IiAlIHNlbGYudGFibGUpCisKKyAgICBkZWYgY2xlYXIoc2VsZik6CisgICAgICAgIHNlbGYuX2V4ZWN1dGUoIkRFTEVURSBGUk9NICVzOyIgJSBzZWxmLnRhYmxlKQorCisgICAgZGVmIGhhc19rZXkoc2VsZiwga2V5KToKKyAgICAgICAgcmV0dXJuIGtleSBpbiBzZWxmCisKKworY2xhc3MgUGVyc2lzdERhdGEob2JqZWN0KToKKyAgICAiIiJEZXByZWNhdGVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBiaXRiYWtlIHBlcnNpc3RlbnQgZGF0YSBzdG9yZSIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkKToKKyAgICAgICAgd2FybmluZ3Mud2FybigiVXNlIG9mIFBlcnNpc3REYXRhIGlzIGRlcHJlY2F0ZWQuICBQbGVhc2UgdXNlICIKKyAgICAgICAgICAgICAgICAgICAgICAicGVyc2lzdChkb21haW4sIGQpIGluc3RlYWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeT1EZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgc3RhY2tsZXZlbD0yKQorCisgICAgICAgIHNlbGYuZGF0YSA9IHBlcnNpc3QoZCkKKyAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJVc2luZyAnJXMnIGFzIHRoZSBwZXJzaXN0ZW50IGRhdGEgY2FjaGUiLAorICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhLmZpbGVuYW1lKQorCisgICAgZGVmIGFkZERvbWFpbihzZWxmLCBkb21haW4pOgorICAgICAgICAiIiIKKyAgICAgICAgQWRkIGEgZG9tYWluIChwZW5kaW5nIGRlcHJlY2F0aW9uKQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YVtkb21haW5dCisKKyAgICBkZWYgZGVsRG9tYWluKHNlbGYsIGRvbWFpbik6CisgICAgICAgICIiIgorICAgICAgICBSZW1vdmVzIGEgZG9tYWluIGFuZCBhbGwgdGhlIGRhdGEgaXQgY29udGFpbnMKKyAgICAgICAgIiIiCisgICAgICAgIGRlbCBzZWxmLmRhdGFbZG9tYWluXQorCisgICAgZGVmIGdldEtleVZhbHVlcyhzZWxmLCBkb21haW4pOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgbGlzdCBvZiBrZXkgKyB2YWx1ZSBwYWlycyBmb3IgYSBkb21haW4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLmRhdGFbZG9tYWluXS5pdGVtcygpCisKKyAgICBkZWYgZ2V0VmFsdWUoc2VsZiwgZG9tYWluLCBrZXkpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIHRoZSB2YWx1ZSBvZiBhIGtleSBmb3IgYSBkb21haW4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLmRhdGFbZG9tYWluXVtrZXldCisKKyAgICBkZWYgc2V0VmFsdWUoc2VsZiwgZG9tYWluLCBrZXksIHZhbHVlKToKKyAgICAgICAgIiIiCisgICAgICAgIFNldHMgdGhlIHZhbHVlIG9mIGEga2V5IGZvciBhIGRvbWFpbgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5kYXRhW2RvbWFpbl1ba2V5XSA9IHZhbHVlCisKKyAgICBkZWYgZGVsVmFsdWUoc2VsZiwgZG9tYWluLCBrZXkpOgorICAgICAgICAiIiIKKyAgICAgICAgRGVsZXRlcyBhIGtleS92YWx1ZSBwYWlyCisgICAgICAgICIiIgorICAgICAgICBkZWwgc2VsZi5kYXRhW2RvbWFpbl1ba2V5XQorCitkZWYgY29ubmVjdChkYXRhYmFzZSk6CisgICAgY29ubmVjdGlvbiA9IHNxbGl0ZTMuY29ubmVjdChkYXRhYmFzZSwgdGltZW91dD01LCBpc29sYXRpb25fbGV2ZWw9Tm9uZSkKKyAgICBjb25uZWN0aW9uLmV4ZWN1dGUoInByYWdtYSBzeW5jaHJvbm91cyA9IG9mZjsiKQorICAgIHJldHVybiBjb25uZWN0aW9uCisKK2RlZiBwZXJzaXN0KGRvbWFpbiwgZCk6CisgICAgIiIiQ29udmVuaWVuY2UgZmFjdG9yeSBmb3IgU1FMVGFibGUgb2JqZWN0cyBiYXNlZCB1cG9uIG1ldGFkYXRhIiIiCisgICAgaW1wb3J0IGJiLnV0aWxzCisgICAgY2FjaGVkaXIgPSAoZC5nZXRWYXIoIlBFUlNJU1RFTlRfRElSIiwgVHJ1ZSkgb3IKKyAgICAgICAgICAgICAgICBkLmdldFZhcigiQ0FDSEUiLCBUcnVlKSkKKyAgICBpZiBub3QgY2FjaGVkaXI6CisgICAgICAgIGxvZ2dlci5jcml0aWNhbCgiUGxlYXNlIHNldCB0aGUgJ1BFUlNJU1RFTlRfRElSJyBvciAnQ0FDSEUnIHZhcmlhYmxlIikKKyAgICAgICAgc3lzLmV4aXQoMSkKKworICAgIGJiLnV0aWxzLm1rZGlyaGllcihjYWNoZWRpcikKKyAgICBjYWNoZWZpbGUgPSBvcy5wYXRoLmpvaW4oY2FjaGVkaXIsICJiYl9wZXJzaXN0X2RhdGEuc3FsaXRlMyIpCisgICAgcmV0dXJuIFNRTFRhYmxlKGNhY2hlZmlsZSwgZG9tYWluKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvcHJvY2Vzcy5weSBiL2JpdGJha2UvbGliL2JiL3Byb2Nlc3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMwN2YyZAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3Byb2Nlc3MucHkKQEAgLTAsMCArMSwxNTYgQEAKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgc2lnbmFsCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IGVycm5vCitpbXBvcnQgc2VsZWN0CisKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCdCaXRCYWtlLlByb2Nlc3MnKQorCitkZWYgc3VicHJvY2Vzc19zZXR1cCgpOgorICAgICMgUHl0aG9uIGluc3RhbGxzIGEgU0lHUElQRSBoYW5kbGVyIGJ5IGRlZmF1bHQuIFRoaXMgaXMgdXN1YWxseSBub3Qgd2hhdAorICAgICMgbm9uLVB5dGhvbiBzdWJwcm9jZXNzZXMgZXhwZWN0LgorICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR1BJUEUsIHNpZ25hbC5TSUdfREZMKQorCitjbGFzcyBDbWRFcnJvcihSdW50aW1lRXJyb3IpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb21tYW5kLCBtc2c9Tm9uZSk6CisgICAgICAgIHNlbGYuY29tbWFuZCA9IGNvbW1hbmQKKyAgICAgICAgc2VsZi5tc2cgPSBtc2cKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzZWxmLmNvbW1hbmQsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgY21kID0gc3VicHJvY2Vzcy5saXN0MmNtZGxpbmUoc2VsZi5jb21tYW5kKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY21kID0gc2VsZi5jb21tYW5kCisKKyAgICAgICAgbXNnID0gIkV4ZWN1dGlvbiBvZiAnJXMnIGZhaWxlZCIgJSBjbWQKKyAgICAgICAgaWYgc2VsZi5tc2c6CisgICAgICAgICAgICBtc2cgKz0gJzogJXMnICUgc2VsZi5tc2cKKyAgICAgICAgcmV0dXJuIG1zZworCitjbGFzcyBOb3RGb3VuZEVycm9yKENtZEVycm9yKToKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIENtZEVycm9yLl9fc3RyX18oc2VsZikgKyAiOiBjb21tYW5kIG5vdCBmb3VuZCIKKworY2xhc3MgRXhlY3V0aW9uRXJyb3IoQ21kRXJyb3IpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb21tYW5kLCBleGl0Y29kZSwgc3Rkb3V0ID0gTm9uZSwgc3RkZXJyID0gTm9uZSk6CisgICAgICAgIENtZEVycm9yLl9faW5pdF9fKHNlbGYsIGNvbW1hbmQpCisgICAgICAgIHNlbGYuZXhpdGNvZGUgPSBleGl0Y29kZQorICAgICAgICBzZWxmLnN0ZG91dCA9IHN0ZG91dAorICAgICAgICBzZWxmLnN0ZGVyciA9IHN0ZGVycgorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIG1lc3NhZ2UgPSAiIgorICAgICAgICBpZiBzZWxmLnN0ZGVycjoKKyAgICAgICAgICAgIG1lc3NhZ2UgKz0gc2VsZi5zdGRlcnIKKyAgICAgICAgaWYgc2VsZi5zdGRvdXQ6CisgICAgICAgICAgICBtZXNzYWdlICs9IHNlbGYuc3Rkb3V0CisgICAgICAgIGlmIG1lc3NhZ2U6CisgICAgICAgICAgICBtZXNzYWdlID0gIjpcbiIgKyBtZXNzYWdlCisgICAgICAgIHJldHVybiAoQ21kRXJyb3IuX19zdHJfXyhzZWxmKSArCisgICAgICAgICAgICAgICAgIiB3aXRoIGV4aXQgY29kZSAlcyIgJSBzZWxmLmV4aXRjb2RlICsgbWVzc2FnZSkKKworY2xhc3MgUG9wZW4oc3VicHJvY2Vzcy5Qb3Blbik6CisgICAgZGVmYXVsdHMgPSB7CisgICAgICAgICJjbG9zZV9mZHMiOiBUcnVlLAorICAgICAgICAicHJlZXhlY19mbiI6IHN1YnByb2Nlc3Nfc2V0dXAsCisgICAgICAgICJzdGRvdXQiOiBzdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICJzdGRlcnIiOiBzdWJwcm9jZXNzLlNURE9VVCwKKyAgICAgICAgInN0ZGluIjogc3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAic2hlbGwiOiBGYWxzZSwKKyAgICB9CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgb3B0aW9ucyA9IGRpY3Qoc2VsZi5kZWZhdWx0cykKKyAgICAgICAgb3B0aW9ucy51cGRhdGUoa3dhcmdzKQorICAgICAgICBzdWJwcm9jZXNzLlBvcGVuLl9faW5pdF9fKHNlbGYsICphcmdzLCAqKm9wdGlvbnMpCisKK2RlZiBfbG9nZ2VkX2NvbW11bmljYXRlKHBpcGUsIGxvZywgaW5wdXQsIGV4dHJhZmlsZXMpOgorICAgIGlmIHBpcGUuc3RkaW46CisgICAgICAgIGlmIGlucHV0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcGlwZS5zdGRpbi53cml0ZShpbnB1dCkKKyAgICAgICAgcGlwZS5zdGRpbi5jbG9zZSgpCisKKyAgICBvdXRkYXRhLCBlcnJkYXRhID0gW10sIFtdCisgICAgcmluID0gW10KKworICAgIGlmIHBpcGUuc3Rkb3V0IGlzIG5vdCBOb25lOgorICAgICAgICBiYi51dGlscy5ub25ibG9ja2luZ2ZkKHBpcGUuc3Rkb3V0LmZpbGVubygpKQorICAgICAgICByaW4uYXBwZW5kKHBpcGUuc3Rkb3V0KQorICAgIGlmIHBpcGUuc3RkZXJyIGlzIG5vdCBOb25lOgorICAgICAgICBiYi51dGlscy5ub25ibG9ja2luZ2ZkKHBpcGUuc3RkZXJyLmZpbGVubygpKQorICAgICAgICByaW4uYXBwZW5kKHBpcGUuc3RkZXJyKQorICAgIGZvciBmb2JqLCBfIGluIGV4dHJhZmlsZXM6CisgICAgICAgIGJiLnV0aWxzLm5vbmJsb2NraW5nZmQoZm9iai5maWxlbm8oKSkKKyAgICAgICAgcmluLmFwcGVuZChmb2JqKQorCisgICAgZGVmIHJlYWRleHRyYXMoc2VsZWN0ZWQpOgorICAgICAgICBmb3IgZm9iaiwgZnVuYyBpbiBleHRyYWZpbGVzOgorICAgICAgICAgICAgaWYgZm9iaiBpbiBzZWxlY3RlZDoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBmb2JqLnJlYWQoKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGVycjoKKyAgICAgICAgICAgICAgICAgICAgaWYgZXJyLmVycm5vID09IGVycm5vLkVBR0FJTiBvciBlcnIuZXJybm8gPT0gZXJybm8uRVdPVUxEQkxPQ0s6CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gTm9uZQorICAgICAgICAgICAgICAgIGlmIGRhdGEgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGZ1bmMoZGF0YSkKKworICAgIHRyeToKKyAgICAgICAgd2hpbGUgcGlwZS5wb2xsKCkgaXMgTm9uZToKKyAgICAgICAgICAgIHJsaXN0ID0gcmluCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcix3LGUgPSBzZWxlY3Quc2VsZWN0IChybGlzdCwgW10sIFtdLCAxKQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVJTlRSOgorICAgICAgICAgICAgICAgICAgICByYWlzZQorCisgICAgICAgICAgICBpZiBwaXBlLnN0ZG91dCBpbiByOgorICAgICAgICAgICAgICAgIGRhdGEgPSBwaXBlLnN0ZG91dC5yZWFkKCkKKyAgICAgICAgICAgICAgICBpZiBkYXRhIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBvdXRkYXRhLmFwcGVuZChkYXRhKQorICAgICAgICAgICAgICAgICAgICBsb2cud3JpdGUoZGF0YSkKKworICAgICAgICAgICAgaWYgcGlwZS5zdGRlcnIgaW4gcjoKKyAgICAgICAgICAgICAgICBkYXRhID0gcGlwZS5zdGRlcnIucmVhZCgpCisgICAgICAgICAgICAgICAgaWYgZGF0YSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgZXJyZGF0YS5hcHBlbmQoZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLndyaXRlKGRhdGEpCisKKyAgICAgICAgICAgIHJlYWRleHRyYXMocikKKworICAgIGZpbmFsbHk6ICAgIAorICAgICAgICBsb2cuZmx1c2goKQorCisgICAgcmVhZGV4dHJhcyhbZm9iaiBmb3IgZm9iaiwgXyBpbiBleHRyYWZpbGVzXSkKKworICAgIGlmIHBpcGUuc3Rkb3V0IGlzIG5vdCBOb25lOgorICAgICAgICBwaXBlLnN0ZG91dC5jbG9zZSgpCisgICAgaWYgcGlwZS5zdGRlcnIgaXMgbm90IE5vbmU6CisgICAgICAgIHBpcGUuc3RkZXJyLmNsb3NlKCkKKyAgICByZXR1cm4gJycuam9pbihvdXRkYXRhKSwgJycuam9pbihlcnJkYXRhKQorCitkZWYgcnVuKGNtZCwgaW5wdXQ9Tm9uZSwgbG9nPU5vbmUsIGV4dHJhZmlsZXM9Tm9uZSwgKipvcHRpb25zKToKKyAgICAiIiJDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBydW4gYSBjb21tYW5kIGFuZCByZXR1cm4gaXRzIG91dHB1dCwgcmFpc2luZyBhbgorICAgIGV4Y2VwdGlvbiB3aGVuIHRoZSBjb21tYW5kIGZhaWxzIiIiCisKKyAgICBpZiBub3QgZXh0cmFmaWxlczoKKyAgICAgICAgZXh0cmFmaWxlcyA9IFtdCisKKyAgICBpZiBpc2luc3RhbmNlKGNtZCwgYmFzZXN0cmluZykgYW5kIG5vdCAic2hlbGwiIGluIG9wdGlvbnM6CisgICAgICAgIG9wdGlvbnNbInNoZWxsIl0gPSBUcnVlCisKKyAgICB0cnk6CisgICAgICAgIHBpcGUgPSBQb3BlbihjbWQsICoqb3B0aW9ucykKKyAgICBleGNlcHQgT1NFcnJvciBhcyBleGM6CisgICAgICAgIGlmIGV4Yy5lcnJubyA9PSAyOgorICAgICAgICAgICAgcmFpc2UgTm90Rm91bmRFcnJvcihjbWQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBDbWRFcnJvcihjbWQsIGV4YykKKworICAgIGlmIGxvZzoKKyAgICAgICAgc3Rkb3V0LCBzdGRlcnIgPSBfbG9nZ2VkX2NvbW11bmljYXRlKHBpcGUsIGxvZywgaW5wdXQsIGV4dHJhZmlsZXMpCisgICAgZWxzZToKKyAgICAgICAgc3Rkb3V0LCBzdGRlcnIgPSBwaXBlLmNvbW11bmljYXRlKGlucHV0KQorCisgICAgaWYgcGlwZS5yZXR1cm5jb2RlICE9IDA6CisgICAgICAgIHJhaXNlIEV4ZWN1dGlvbkVycm9yKGNtZCwgcGlwZS5yZXR1cm5jb2RlLCBzdGRvdXQsIHN0ZGVycikKKyAgICByZXR1cm4gc3Rkb3V0LCBzdGRlcnIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3Byb3ZpZGVycy5weSBiL2JpdGJha2UvbGliL2JiL3Byb3ZpZGVycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzdlMWZhCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvcHJvdmlkZXJzLnB5CkBAIC0wLDAgKzEsMzgxIEBACisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIworIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgIENocmlzIExhcnNvbgorIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgIFBoaWwgQmx1bmRlbGwKKyMgQ29weXJpZ2h0IChDKSAyMDAzIC0gMjAwNSBNaWNoYWVsICdNaWNrZXknIExhdWVyCisjIENvcHlyaWdodCAoQykgMjAwNSAgICAgICAgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIKKyMgQ29weXJpZ2h0IChDKSAyMDA1ICAgICAgICBST0FEIEdtYkgKKyMgQ29weXJpZ2h0IChDKSAyMDA2ICAgICAgICBSaWNoYXJkIFB1cmRpZQorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworaW1wb3J0IHJlCitpbXBvcnQgbG9nZ2luZworZnJvbSBiYiBpbXBvcnQgZGF0YSwgdXRpbHMKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlZmF1bHRkaWN0CitpbXBvcnQgYmIKKworbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoIkJpdEJha2UuUHJvdmlkZXIiKQorCitjbGFzcyBOb1Byb3ZpZGVyKGJiLkJCSGFuZGxlZEV4Y2VwdGlvbik6CisgICAgIiIiRXhjZXB0aW9uIHJhaXNlZCB3aGVuIG5vIHByb3ZpZGVyIG9mIGEgYnVpbGQgZGVwZW5kZW5jeSBjYW4gYmUgZm91bmQiIiIKKworY2xhc3MgTm9SUHJvdmlkZXIoYmIuQkJIYW5kbGVkRXhjZXB0aW9uKToKKyAgICAiIiJFeGNlcHRpb24gcmFpc2VkIHdoZW4gbm8gcHJvdmlkZXIgb2YgYSBydW50aW1lIGRlcGVuZGVuY3kgY2FuIGJlIGZvdW5kIiIiCisKK2NsYXNzIE11bHRpcGxlUlByb3ZpZGVyKGJiLkJCSGFuZGxlZEV4Y2VwdGlvbik6CisgICAgIiIiRXhjZXB0aW9uIHJhaXNlZCB3aGVuIG11bHRpcGxlIHByb3ZpZGVycyBvZiBhIHJ1bnRpbWUgZGVwZW5kZW5jeSBjYW4gYmUgZm91bmQiIiIKKworZGVmIGZpbmRQcm92aWRlcnMoY2ZnRGF0YSwgZGF0YUNhY2hlLCBwa2dfcG4gPSBOb25lKToKKyAgICAiIiIKKyAgICBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBnZXQgbGF0ZXN0IGFuZCBwcmVmZXJyZWQgcHJvdmlkZXJzIGluIHBrZ19wbgorICAgICIiIgorCisgICAgaWYgbm90IHBrZ19wbjoKKyAgICAgICAgcGtnX3BuID0gZGF0YUNhY2hlLnBrZ19wbgorCisgICAgIyBOZWVkIHRvIGVuc3VyZSBkYXRhIHN0b3JlIGlzIGV4cGFuZGVkCisgICAgbG9jYWxkYXRhID0gZGF0YS5jcmVhdGVDb3B5KGNmZ0RhdGEpCisgICAgYmIuZGF0YS51cGRhdGVfZGF0YShsb2NhbGRhdGEpCisgICAgYmIuZGF0YS5leHBhbmRLZXlzKGxvY2FsZGF0YSkKKworICAgIHByZWZlcnJlZF92ZXJzaW9ucyA9IHt9CisgICAgbGF0ZXN0X3ZlcnNpb25zID0ge30KKworICAgIGZvciBwbiBpbiBwa2dfcG46CisgICAgICAgIChsYXN0X3ZlciwgbGFzdF9maWxlLCBwcmVmX3ZlciwgcHJlZl9maWxlKSA9IGZpbmRCZXN0UHJvdmlkZXIocG4sIGxvY2FsZGF0YSwgZGF0YUNhY2hlLCBwa2dfcG4pCisgICAgICAgIHByZWZlcnJlZF92ZXJzaW9uc1twbl0gPSAocHJlZl92ZXIsIHByZWZfZmlsZSkKKyAgICAgICAgbGF0ZXN0X3ZlcnNpb25zW3BuXSA9IChsYXN0X3ZlciwgbGFzdF9maWxlKQorCisgICAgcmV0dXJuIChsYXRlc3RfdmVyc2lvbnMsIHByZWZlcnJlZF92ZXJzaW9ucykKKworCitkZWYgYWxsUHJvdmlkZXJzKGRhdGFDYWNoZSk6CisgICAgIiIiCisgICAgRmluZCBhbGwgcHJvdmlkZXJzIGZvciBlYWNoIHBuCisgICAgIiIiCisgICAgYWxsX3Byb3ZpZGVycyA9IGRlZmF1bHRkaWN0KGxpc3QpCisgICAgZm9yIChmbiwgcG4pIGluIGRhdGFDYWNoZS5wa2dfZm4uaXRlbXMoKToKKyAgICAgICAgdmVyID0gZGF0YUNhY2hlLnBrZ19wZXB2cHJbZm5dCisgICAgICAgIGFsbF9wcm92aWRlcnNbcG5dLmFwcGVuZCgodmVyLCBmbikpCisgICAgcmV0dXJuIGFsbF9wcm92aWRlcnMKKworCitkZWYgc29ydFByaW9yaXRpZXMocG4sIGRhdGFDYWNoZSwgcGtnX3BuID0gTm9uZSk6CisgICAgIiIiCisgICAgUmVvcmRlciBwa2dfcG4gYnkgZmlsZSBwcmlvcml0eSBhbmQgZGVmYXVsdCBwcmVmZXJlbmNlCisgICAgIiIiCisKKyAgICBpZiBub3QgcGtnX3BuOgorICAgICAgICBwa2dfcG4gPSBkYXRhQ2FjaGUucGtnX3BuCisKKyAgICBmaWxlcyA9IHBrZ19wbltwbl0KKyAgICBwcmlvcml0aWVzID0ge30KKyAgICBmb3IgZiBpbiBmaWxlczoKKyAgICAgICAgcHJpb3JpdHkgPSBkYXRhQ2FjaGUuYmJmaWxlX3ByaW9yaXR5W2ZdCisgICAgICAgIHByZWZlcmVuY2UgPSBkYXRhQ2FjaGUucGtnX2RwW2ZdCisgICAgICAgIGlmIHByaW9yaXR5IG5vdCBpbiBwcmlvcml0aWVzOgorICAgICAgICAgICAgcHJpb3JpdGllc1twcmlvcml0eV0gPSB7fQorICAgICAgICBpZiBwcmVmZXJlbmNlIG5vdCBpbiBwcmlvcml0aWVzW3ByaW9yaXR5XToKKyAgICAgICAgICAgIHByaW9yaXRpZXNbcHJpb3JpdHldW3ByZWZlcmVuY2VdID0gW10KKyAgICAgICAgcHJpb3JpdGllc1twcmlvcml0eV1bcHJlZmVyZW5jZV0uYXBwZW5kKGYpCisgICAgdG1wX3BuID0gW10KKyAgICBmb3IgcHJpIGluIHNvcnRlZChwcmlvcml0aWVzKToKKyAgICAgICAgdG1wX3ByZWYgPSBbXQorICAgICAgICBmb3IgcHJlZiBpbiBzb3J0ZWQocHJpb3JpdGllc1twcmldKToKKyAgICAgICAgICAgIHRtcF9wcmVmLmV4dGVuZChwcmlvcml0aWVzW3ByaV1bcHJlZl0pCisgICAgICAgIHRtcF9wbiA9IFt0bXBfcHJlZl0gKyB0bXBfcG4KKworICAgIHJldHVybiB0bXBfcG4KKworZGVmIHByZWZlcnJlZFZlcnNpb25NYXRjaChwZSwgcHYsIHByLCBwcmVmZXJyZWRfZSwgcHJlZmVycmVkX3YsIHByZWZlcnJlZF9yKToKKyAgICAiIiIKKyAgICBDaGVjayBpZiB0aGUgdmVyc2lvbiBwZSxwdixwciBpcyB0aGUgcHJlZmVycmVkIG9uZS4KKyAgICBJZiB0aGVyZSBpcyBwcmVmZXJyZWQgdmVyc2lvbiBkZWZpbmVkIGFuZCBlbmRzIHdpdGggJyUnLCB0aGVuIHB2IGhhcyB0byBzdGFydCB3aXRoIHRoYXQgdmVyc2lvbiBhZnRlciByZW1vdmluZyB0aGUgJyUnCisgICAgIiIiCisgICAgaWYgKHByID09IHByZWZlcnJlZF9yIG9yIHByZWZlcnJlZF9yID09IE5vbmUpOgorICAgICAgICBpZiAocGUgPT0gcHJlZmVycmVkX2Ugb3IgcHJlZmVycmVkX2UgPT0gTm9uZSk6CisgICAgICAgICAgICBpZiBwcmVmZXJyZWRfdiA9PSBwdjoKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgaWYgcHJlZmVycmVkX3YgIT0gTm9uZSBhbmQgcHJlZmVycmVkX3YuZW5kc3dpdGgoJyUnKSBhbmQgcHYuc3RhcnRzd2l0aChwcmVmZXJyZWRfdls6bGVuKHByZWZlcnJlZF92KS0xXSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICByZXR1cm4gRmFsc2UKKworZGVmIGZpbmRQcmVmZXJyZWRQcm92aWRlcihwbiwgY2ZnRGF0YSwgZGF0YUNhY2hlLCBwa2dfcG4gPSBOb25lLCBpdGVtID0gTm9uZSk6CisgICAgIiIiCisgICAgRmluZCB0aGUgZmlyc3QgcHJvdmlkZXIgaW4gcGtnX3BuIHdpdGggYSBQUkVGRVJSRURfVkVSU0lPTiBzZXQuCisgICAgIiIiCisKKyAgICBwcmVmZXJyZWRfZmlsZSA9IE5vbmUKKyAgICBwcmVmZXJyZWRfdmVyID0gTm9uZQorCisgICAgbG9jYWxkYXRhID0gZGF0YS5jcmVhdGVDb3B5KGNmZ0RhdGEpCisgICAgbG9jYWxkYXRhLnNldFZhcignT1ZFUlJJREVTJywgIiVzOnBuLSVzOiVzIiAlIChkYXRhLmdldFZhcignT1ZFUlJJREVTJywgbG9jYWxkYXRhKSwgcG4sIHBuKSkKKyAgICBiYi5kYXRhLnVwZGF0ZV9kYXRhKGxvY2FsZGF0YSkKKworICAgIHByZWZlcnJlZF92ID0gbG9jYWxkYXRhLmdldFZhcignUFJFRkVSUkVEX1ZFUlNJT04nLCBUcnVlKQorICAgIGlmIHByZWZlcnJlZF92OgorICAgICAgICBtID0gcmUubWF0Y2goJyhcZCs6KSooLiopKF8uKikqJywgcHJlZmVycmVkX3YpCisgICAgICAgIGlmIG06CisgICAgICAgICAgICBpZiBtLmdyb3VwKDEpOgorICAgICAgICAgICAgICAgIHByZWZlcnJlZF9lID0gbS5ncm91cCgxKVs6LTFdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByZWZlcnJlZF9lID0gTm9uZQorICAgICAgICAgICAgcHJlZmVycmVkX3YgPSBtLmdyb3VwKDIpCisgICAgICAgICAgICBpZiBtLmdyb3VwKDMpOgorICAgICAgICAgICAgICAgIHByZWZlcnJlZF9yID0gbS5ncm91cCgzKVsxOl0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJlZmVycmVkX3IgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmVmZXJyZWRfZSA9IE5vbmUKKyAgICAgICAgICAgIHByZWZlcnJlZF9yID0gTm9uZQorCisgICAgICAgIGZvciBmaWxlX3NldCBpbiBwa2dfcG46CisgICAgICAgICAgICBmb3IgZiBpbiBmaWxlX3NldDoKKyAgICAgICAgICAgICAgICBwZSwgcHYsIHByID0gZGF0YUNhY2hlLnBrZ19wZXB2cHJbZl0KKyAgICAgICAgICAgICAgICBpZiBwcmVmZXJyZWRWZXJzaW9uTWF0Y2gocGUsIHB2LCBwciwgcHJlZmVycmVkX2UsIHByZWZlcnJlZF92LCBwcmVmZXJyZWRfcik6CisgICAgICAgICAgICAgICAgICAgIHByZWZlcnJlZF9maWxlID0gZgorICAgICAgICAgICAgICAgICAgICBwcmVmZXJyZWRfdmVyID0gKHBlLCBwdiwgcHIpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBwcmVmZXJyZWRfZmlsZToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgcHJlZmVycmVkX3I6CisgICAgICAgICAgICBwdl9zdHIgPSAnJXMtJXMnICUgKHByZWZlcnJlZF92LCBwcmVmZXJyZWRfcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHB2X3N0ciA9IHByZWZlcnJlZF92CisgICAgICAgIGlmIG5vdCAocHJlZmVycmVkX2UgaXMgTm9uZSk6CisgICAgICAgICAgICBwdl9zdHIgPSAnJXM6JXMnICUgKHByZWZlcnJlZF9lLCBwdl9zdHIpCisgICAgICAgIGl0ZW1zdHIgPSAiIgorICAgICAgICBpZiBpdGVtOgorICAgICAgICAgICAgaXRlbXN0ciA9ICIgKGZvciBpdGVtICVzKSIgJSBpdGVtCisgICAgICAgIGlmIHByZWZlcnJlZF9maWxlIGlzIE5vbmU6CisgICAgICAgICAgICBsb2dnZXIuaW5mbygicHJlZmVycmVkIHZlcnNpb24gJXMgb2YgJXMgbm90IGF2YWlsYWJsZSVzIiwgcHZfc3RyLCBwbiwgaXRlbXN0cikKKyAgICAgICAgICAgIGF2YWlsYWJsZV92ZXJzID0gW10KKyAgICAgICAgICAgIGZvciBmaWxlX3NldCBpbiBwa2dfcG46CisgICAgICAgICAgICAgICAgZm9yIGYgaW4gZmlsZV9zZXQ6CisgICAgICAgICAgICAgICAgICAgIHBlLCBwdiwgcHIgPSBkYXRhQ2FjaGUucGtnX3BlcHZwcltmXQorICAgICAgICAgICAgICAgICAgICB2ZXJfc3RyID0gcHYKKyAgICAgICAgICAgICAgICAgICAgaWYgcGU6CisgICAgICAgICAgICAgICAgICAgICAgICB2ZXJfc3RyID0gIiVzOiVzIiAlIChwZSwgdmVyX3N0cikKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHZlcl9zdHIgaW4gYXZhaWxhYmxlX3ZlcnM6CisgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVfdmVycy5hcHBlbmQodmVyX3N0cikKKyAgICAgICAgICAgIGlmIGF2YWlsYWJsZV92ZXJzOgorICAgICAgICAgICAgICAgIGF2YWlsYWJsZV92ZXJzLnNvcnQoKQorICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJ2ZXJzaW9ucyBvZiAlcyBhdmFpbGFibGU6ICVzIiwgcG4sICcgJy5qb2luKGF2YWlsYWJsZV92ZXJzKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAic2VsZWN0aW5nICVzIGFzIFBSRUZFUlJFRF9WRVJTSU9OICVzIG9mIHBhY2thZ2UgJXMlcyIsIHByZWZlcnJlZF9maWxlLCBwdl9zdHIsIHBuLCBpdGVtc3RyKQorCisgICAgcmV0dXJuIChwcmVmZXJyZWRfdmVyLCBwcmVmZXJyZWRfZmlsZSkKKworCitkZWYgZmluZExhdGVzdFByb3ZpZGVyKHBuLCBjZmdEYXRhLCBkYXRhQ2FjaGUsIGZpbGVfc2V0KToKKyAgICAiIiIKKyAgICBSZXR1cm4gdGhlIGhpZ2hlc3QgdmVyc2lvbiBvZiB0aGUgcHJvdmlkZXJzIGluIGZpbGVfc2V0LgorICAgIFRha2UgZGVmYXVsdCBwcmVmZXJlbmNlcyBpbnRvIGFjY291bnQuCisgICAgIiIiCisgICAgbGF0ZXN0ID0gTm9uZQorICAgIGxhdGVzdF9wID0gMAorICAgIGxhdGVzdF9mID0gTm9uZQorICAgIGZvciBmaWxlX25hbWUgaW4gZmlsZV9zZXQ6CisgICAgICAgIHBlLCBwdiwgcHIgPSBkYXRhQ2FjaGUucGtnX3BlcHZwcltmaWxlX25hbWVdCisgICAgICAgIGRwID0gZGF0YUNhY2hlLnBrZ19kcFtmaWxlX25hbWVdCisKKyAgICAgICAgaWYgKGxhdGVzdCBpcyBOb25lKSBvciAoKGxhdGVzdF9wID09IGRwKSBhbmQgKHV0aWxzLnZlcmNtcChsYXRlc3QsIChwZSwgcHYsIHByKSkgPCAwKSkgb3IgKGRwID4gbGF0ZXN0X3ApOgorICAgICAgICAgICAgbGF0ZXN0ID0gKHBlLCBwdiwgcHIpCisgICAgICAgICAgICBsYXRlc3RfZiA9IGZpbGVfbmFtZQorICAgICAgICAgICAgbGF0ZXN0X3AgPSBkcAorCisgICAgcmV0dXJuIChsYXRlc3QsIGxhdGVzdF9mKQorCisKK2RlZiBmaW5kQmVzdFByb3ZpZGVyKHBuLCBjZmdEYXRhLCBkYXRhQ2FjaGUsIHBrZ19wbiA9IE5vbmUsIGl0ZW0gPSBOb25lKToKKyAgICAiIiIKKyAgICBJZiB0aGVyZSBpcyBhIFBSRUZFUlJFRF9WRVJTSU9OLCBmaW5kIHRoZSBoaWdoZXN0LXByaW9yaXR5IGJiZmlsZQorICAgIHByb3ZpZGluZyB0aGF0IHZlcnNpb24uICBJZiBub3QsIGZpbmQgdGhlIGxhdGVzdCB2ZXJzaW9uIHByb3ZpZGVkIGJ5CisgICAgYW4gYmJmaWxlIGluIHRoZSBoaWdoZXN0LXByaW9yaXR5IHNldC4KKyAgICAiIiIKKworICAgIHNvcnRwa2dfcG4gPSBzb3J0UHJpb3JpdGllcyhwbiwgZGF0YUNhY2hlLCBwa2dfcG4pCisgICAgIyBGaW5kIHRoZSBoaWdoZXN0IHByaW9yaXR5IHByb3ZpZGVyIHdpdGggYSBQUkVGRVJSRURfVkVSU0lPTiBzZXQKKyAgICAocHJlZmVycmVkX3ZlciwgcHJlZmVycmVkX2ZpbGUpID0gZmluZFByZWZlcnJlZFByb3ZpZGVyKHBuLCBjZmdEYXRhLCBkYXRhQ2FjaGUsIHNvcnRwa2dfcG4sIGl0ZW0pCisgICAgIyBGaW5kIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgaGlnaGVzdCBwcmlvcml0eSBwcm92aWRlcgorICAgIChsYXRlc3QsIGxhdGVzdF9mKSA9IGZpbmRMYXRlc3RQcm92aWRlcihwbiwgY2ZnRGF0YSwgZGF0YUNhY2hlLCBzb3J0cGtnX3BuWzBdKQorCisgICAgaWYgcHJlZmVycmVkX2ZpbGUgaXMgTm9uZToKKyAgICAgICAgcHJlZmVycmVkX2ZpbGUgPSBsYXRlc3RfZgorICAgICAgICBwcmVmZXJyZWRfdmVyID0gbGF0ZXN0CisKKyAgICByZXR1cm4gKGxhdGVzdCwgbGF0ZXN0X2YsIHByZWZlcnJlZF92ZXIsIHByZWZlcnJlZF9maWxlKQorCisKK2RlZiBfZmlsdGVyUHJvdmlkZXJzKHByb3ZpZGVycywgaXRlbSwgY2ZnRGF0YSwgZGF0YUNhY2hlKToKKyAgICAiIiIKKyAgICBUYWtlIGEgbGlzdCBvZiBwcm92aWRlcnMgYW5kIGZpbHRlci9yZW9yZGVyIGFjY29yZGluZyB0byB0aGUKKyAgICBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYW5kIHByZXZpb3VzIGJ1aWxkIHJlc3VsdHMKKyAgICAiIiIKKyAgICBlbGlnaWJsZSA9IFtdCisgICAgcHJlZmVycmVkX3ZlcnNpb25zID0ge30KKyAgICBzb3J0cGtnX3BuID0ge30KKworICAgICMgVGhlIG9yZGVyIG9mIHByb3ZpZGVycyBkZXBlbmRzIG9uIHRoZSBvcmRlciBvZiB0aGUgZmlsZXMgb24gdGhlIGRpc2sKKyAgICAjIHVwIHRvIGhlcmUuIFNvcnQgcGtnX3BuIHRvIG1ha2UgZGVwZW5kZW5jeSBpc3N1ZXMgcmVwcm9kdWNpYmxlIHJhdGhlcgorICAgICMgdGhhbiBlZmZlY3RpdmVseSByYW5kb20uCisgICAgcHJvdmlkZXJzLnNvcnQoKQorCisgICAgIyBDb2xsYXRlIHByb3ZpZGVycyBieSBQTgorICAgIHBrZ19wbiA9IHt9CisgICAgZm9yIHAgaW4gcHJvdmlkZXJzOgorICAgICAgICBwbiA9IGRhdGFDYWNoZS5wa2dfZm5bcF0KKyAgICAgICAgaWYgcG4gbm90IGluIHBrZ19wbjoKKyAgICAgICAgICAgIHBrZ19wbltwbl0gPSBbXQorICAgICAgICBwa2dfcG5bcG5dLmFwcGVuZChwKQorCisgICAgbG9nZ2VyLmRlYnVnKDEsICJwcm92aWRlcnMgZm9yICVzIGFyZTogJXMiLCBpdGVtLCBwa2dfcG4ua2V5cygpKQorCisgICAgIyBGaXJzdCBhZGQgUFJFRkVSUkVEX1ZFUlNJT05TCisgICAgZm9yIHBuIGluIHBrZ19wbjoKKyAgICAgICAgc29ydHBrZ19wbltwbl0gPSBzb3J0UHJpb3JpdGllcyhwbiwgZGF0YUNhY2hlLCBwa2dfcG4pCisgICAgICAgIHByZWZlcnJlZF92ZXJzaW9uc1twbl0gPSBmaW5kUHJlZmVycmVkUHJvdmlkZXIocG4sIGNmZ0RhdGEsIGRhdGFDYWNoZSwgc29ydHBrZ19wbltwbl0sIGl0ZW0pCisgICAgICAgIGlmIHByZWZlcnJlZF92ZXJzaW9uc1twbl1bMV06CisgICAgICAgICAgICBlbGlnaWJsZS5hcHBlbmQocHJlZmVycmVkX3ZlcnNpb25zW3BuXVsxXSkKKworICAgICMgTm93IGFkZCBsYXRlc3QgdmVyc2lvbnMKKyAgICBmb3IgcG4gaW4gc29ydHBrZ19wbjoKKyAgICAgICAgaWYgcG4gaW4gcHJlZmVycmVkX3ZlcnNpb25zIGFuZCBwcmVmZXJyZWRfdmVyc2lvbnNbcG5dWzFdOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgcHJlZmVycmVkX3ZlcnNpb25zW3BuXSA9IGZpbmRMYXRlc3RQcm92aWRlcihwbiwgY2ZnRGF0YSwgZGF0YUNhY2hlLCBzb3J0cGtnX3BuW3BuXVswXSkKKyAgICAgICAgZWxpZ2libGUuYXBwZW5kKHByZWZlcnJlZF92ZXJzaW9uc1twbl1bMV0pCisKKyAgICBpZiBsZW4oZWxpZ2libGUpID09IDA6CisgICAgICAgIGxvZ2dlci5lcnJvcigibm8gZWxpZ2libGUgcHJvdmlkZXJzIGZvciAlcyIsIGl0ZW0pCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIElmIHBuID09IGl0ZW0sIGdpdmUgaXQgYSBzbGlnaHQgZGVmYXVsdCBwcmVmZXJlbmNlCisgICAgIyBUaGlzIG1lYW5zIFBSRUZFUlJFRF9QUk9WSURFUl9mb29iYXIgZGVmYXVsdHMgdG8gZm9vYmFyIGlmIGF2YWlsYWJsZQorICAgIGZvciBwIGluIHByb3ZpZGVyczoKKyAgICAgICAgcG4gPSBkYXRhQ2FjaGUucGtnX2ZuW3BdCisgICAgICAgIGlmIHBuICE9IGl0ZW06CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAobmV3dmVycywgZm4pID0gcHJlZmVycmVkX3ZlcnNpb25zW3BuXQorICAgICAgICBpZiBub3QgZm4gaW4gZWxpZ2libGU6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBlbGlnaWJsZS5yZW1vdmUoZm4pCisgICAgICAgIGVsaWdpYmxlID0gW2ZuXSArIGVsaWdpYmxlCisKKyAgICByZXR1cm4gZWxpZ2libGUKKworCitkZWYgZmlsdGVyUHJvdmlkZXJzKHByb3ZpZGVycywgaXRlbSwgY2ZnRGF0YSwgZGF0YUNhY2hlKToKKyAgICAiIiIKKyAgICBUYWtlIGEgbGlzdCBvZiBwcm92aWRlcnMgYW5kIGZpbHRlci9yZW9yZGVyIGFjY29yZGluZyB0byB0aGUKKyAgICBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYW5kIHByZXZpb3VzIGJ1aWxkIHJlc3VsdHMKKyAgICBUYWtlcyBhICJub3JtYWwiIHRhcmdldCBpdGVtCisgICAgIiIiCisKKyAgICBlbGlnaWJsZSA9IF9maWx0ZXJQcm92aWRlcnMocHJvdmlkZXJzLCBpdGVtLCBjZmdEYXRhLCBkYXRhQ2FjaGUpCisKKyAgICBwcmVmZXJ2YXIgPSBjZmdEYXRhLmdldFZhcignUFJFRkVSUkVEX1BST1ZJREVSXyVzJyAlIGl0ZW0sIFRydWUpCisgICAgaWYgcHJlZmVydmFyOgorICAgICAgICBkYXRhQ2FjaGUucHJlZmVycmVkW2l0ZW1dID0gcHJlZmVydmFyCisKKyAgICBmb3VuZFVuaXF1ZSA9IEZhbHNlCisgICAgaWYgaXRlbSBpbiBkYXRhQ2FjaGUucHJlZmVycmVkOgorICAgICAgICBmb3IgcCBpbiBlbGlnaWJsZToKKyAgICAgICAgICAgIHBuID0gZGF0YUNhY2hlLnBrZ19mbltwXQorICAgICAgICAgICAgaWYgZGF0YUNhY2hlLnByZWZlcnJlZFtpdGVtXSA9PSBwbjoKKyAgICAgICAgICAgICAgICBsb2dnZXIudmVyYm9zZSgic2VsZWN0aW5nICVzIHRvIHNhdGlzZnkgJXMgZHVlIHRvIFBSRUZFUlJFRF9QUk9WSURFUlMiLCBwbiwgaXRlbSkKKyAgICAgICAgICAgICAgICBlbGlnaWJsZS5yZW1vdmUocCkKKyAgICAgICAgICAgICAgICBlbGlnaWJsZSA9IFtwXSArIGVsaWdpYmxlCisgICAgICAgICAgICAgICAgZm91bmRVbmlxdWUgPSBUcnVlCisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgIGxvZ2dlci5kZWJ1ZygxLCAic29ydGVkIHByb3ZpZGVycyBmb3IgJXMgYXJlOiAlcyIsIGl0ZW0sIGVsaWdpYmxlKQorCisgICAgcmV0dXJuIGVsaWdpYmxlLCBmb3VuZFVuaXF1ZQorCitkZWYgZmlsdGVyUHJvdmlkZXJzUnVuVGltZShwcm92aWRlcnMsIGl0ZW0sIGNmZ0RhdGEsIGRhdGFDYWNoZSk6CisgICAgIiIiCisgICAgVGFrZSBhIGxpc3Qgb2YgcHJvdmlkZXJzIGFuZCBmaWx0ZXIvcmVvcmRlciBhY2NvcmRpbmcgdG8gdGhlCisgICAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCBwcmV2aW91cyBidWlsZCByZXN1bHRzCisgICAgVGFrZXMgYSAicnVudGltZSIgdGFyZ2V0IGl0ZW0KKyAgICAiIiIKKworICAgIGVsaWdpYmxlID0gX2ZpbHRlclByb3ZpZGVycyhwcm92aWRlcnMsIGl0ZW0sIGNmZ0RhdGEsIGRhdGFDYWNoZSkKKworICAgICMgU2hvdWxkIHVzZSBkYXRhQ2FjaGUucHJlZmVycmVkIGhlcmU/CisgICAgcHJlZmVycmVkID0gW10KKyAgICBwcmVmZXJyZWRfdmFycyA9IFtdCisgICAgcG5zID0ge30KKyAgICBmb3IgcCBpbiBlbGlnaWJsZToKKyAgICAgICAgcG5zW2RhdGFDYWNoZS5wa2dfZm5bcF1dID0gcAorICAgIGZvciBwIGluIGVsaWdpYmxlOgorICAgICAgICBwbiA9IGRhdGFDYWNoZS5wa2dfZm5bcF0KKyAgICAgICAgcHJvdmlkZXMgPSBkYXRhQ2FjaGUucG5fcHJvdmlkZXNbcG5dCisgICAgICAgIGZvciBwcm92aWRlIGluIHByb3ZpZGVzOgorICAgICAgICAgICAgcHJlZmVydmFyID0gY2ZnRGF0YS5nZXRWYXIoJ1BSRUZFUlJFRF9QUk9WSURFUl8lcycgJSBwcm92aWRlLCBUcnVlKQorICAgICAgICAgICAgI2xvZ2dlci5kZWJ1ZygxLCAiY2hlY2tpbmcgUFJFRkVSUkVEX1BST1ZJREVSXyVzICh2YWx1ZSAlcykgYWdhaW5zdCAlcyIsIHByb3ZpZGUsIHByZWZlcnZhciwgcG5zLmtleXMoKSkKKyAgICAgICAgICAgIGlmIHByZWZlcnZhciBpbiBwbnMgYW5kIHBuc1twcmVmZXJ2YXJdIG5vdCBpbiBwcmVmZXJyZWQ6CisgICAgICAgICAgICAgICAgdmFyID0gIlBSRUZFUlJFRF9QUk9WSURFUl8lcyA9ICVzIiAlIChwcm92aWRlLCBwcmVmZXJ2YXIpCisgICAgICAgICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoInNlbGVjdGluZyAlcyB0byBzYXRpc2Z5IHJ1bnRpbWUgJXMgZHVlIHRvICVzIiwgcHJlZmVydmFyLCBpdGVtLCB2YXIpCisgICAgICAgICAgICAgICAgcHJlZmVycmVkX3ZhcnMuYXBwZW5kKHZhcikKKyAgICAgICAgICAgICAgICBwcmVmID0gcG5zW3ByZWZlcnZhcl0KKyAgICAgICAgICAgICAgICBlbGlnaWJsZS5yZW1vdmUocHJlZikKKyAgICAgICAgICAgICAgICBlbGlnaWJsZSA9IFtwcmVmXSArIGVsaWdpYmxlCisgICAgICAgICAgICAgICAgcHJlZmVycmVkLmFwcGVuZChwcmVmKQorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICBudW1iZXJQcmVmZXJyZWQgPSBsZW4ocHJlZmVycmVkKQorCisgICAgaWYgbnVtYmVyUHJlZmVycmVkID4gMToKKyAgICAgICAgbG9nZ2VyLmVycm9yKCJUcnlpbmcgdG8gcmVzb2x2ZSBydW50aW1lIGRlcGVuZGVuY3kgJXMgcmVzdWx0ZWQgaW4gY29uZmxpY3RpbmcgUFJFRkVSUkVEX1BST1ZJREVSIGVudHJpZXMgYmVpbmcgZm91bmQuXG5UaGUgcHJvdmlkZXJzIGZvdW5kIHdlcmU6ICVzXG5UaGUgUFJFRkVSUkVEX1BST1ZJREVSIGVudHJpZXMgcmVzdWx0aW5nIGluIHRoaXMgY29uZmxpY3Qgd2VyZTogJXMiLCBpdGVtLCBwcmVmZXJyZWQsIHByZWZlcnJlZF92YXJzKQorCisgICAgbG9nZ2VyLmRlYnVnKDEsICJzb3J0ZWQgcnVudGltZSBwcm92aWRlcnMgZm9yICVzIGFyZTogJXMiLCBpdGVtLCBlbGlnaWJsZSkKKworICAgIHJldHVybiBlbGlnaWJsZSwgbnVtYmVyUHJlZmVycmVkCisKK3JlZ2V4cF9jYWNoZSA9IHt9CisKK2RlZiBnZXRSdW50aW1lUHJvdmlkZXJzKGRhdGFDYWNoZSwgcmRlcGVuZCk6CisgICAgIiIiCisgICAgUmV0dXJuIGFueSBwcm92aWRlcnMgb2YgcnVudGltZSBkZXBlbmRlbmN5CisgICAgIiIiCisgICAgcnByb3ZpZGVycyA9IFtdCisKKyAgICBpZiByZGVwZW5kIGluIGRhdGFDYWNoZS5ycHJvdmlkZXJzOgorICAgICAgICBycHJvdmlkZXJzICs9IGRhdGFDYWNoZS5ycHJvdmlkZXJzW3JkZXBlbmRdCisKKyAgICBpZiByZGVwZW5kIGluIGRhdGFDYWNoZS5wYWNrYWdlczoKKyAgICAgICAgcnByb3ZpZGVycyArPSBkYXRhQ2FjaGUucGFja2FnZXNbcmRlcGVuZF0KKworICAgIGlmIHJwcm92aWRlcnM6CisgICAgICAgIHJldHVybiBycHJvdmlkZXJzCisKKyAgICAjIE9ubHkgc2VhcmNoIGR5bmFtaWMgcGFja2FnZXMgaWYgd2UgY2FuJ3QgZmluZCBhbnl0aGluZyBpbiBvdGhlciB2YXJpYWJsZXMKKyAgICBmb3IgcGF0dGVybiBpbiBkYXRhQ2FjaGUucGFja2FnZXNfZHluYW1pYzoKKyAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4ucmVwbGFjZSgnKycsICJcKyIpCisgICAgICAgIGlmIHBhdHRlcm4gaW4gcmVnZXhwX2NhY2hlOgorICAgICAgICAgICAgcmVnZXhwID0gcmVnZXhwX2NhY2hlW3BhdHRlcm5dCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmVnZXhwID0gcmUuY29tcGlsZShwYXR0ZXJuKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiRXJyb3IgcGFyc2luZyByZWd1bGFyIGV4cHJlc3Npb24gJyVzJyIsIHBhdHRlcm4pCisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIHJlZ2V4cF9jYWNoZVtwYXR0ZXJuXSA9IHJlZ2V4cAorICAgICAgICBpZiByZWdleHAubWF0Y2gocmRlcGVuZCk6CisgICAgICAgICAgICBycHJvdmlkZXJzICs9IGRhdGFDYWNoZS5wYWNrYWdlc19keW5hbWljW3BhdHRlcm5dCisgICAgICAgICAgICBsb2dnZXIuZGVidWcoMSwgIkFzc3VtaW5nICVzIGlzIGEgZHluYW1pYyBwYWNrYWdlLCBidXQgaXQgbWF5IG5vdCBleGlzdCIgJSByZGVwZW5kKQorCisgICAgcmV0dXJuIHJwcm92aWRlcnMKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3B5c2gvX19pbml0X18ucHkgYi9iaXRiYWtlL2xpYi9iYi9weXNoL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9weXNoL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9weXNoL2J1aWx0aW4ucHkgYi9iaXRiYWtlL2xpYi9iYi9weXNoL2J1aWx0aW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc0OGU0YQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3B5c2gvYnVpbHRpbi5weQpAQCAtMCwwICsxLDcxMCBAQAorIyBidWlsdGluLnB5IC0gYnVpbHRpbnMgYW5kIHV0aWxpdGllcyBkZWZpbml0aW9ucyBmb3IgcHlzaC4KKyMKKyMgQ29weXJpZ2h0IDIwMDcgUGF0cmljayBNZXphcmQKKyMKKyMgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisiIiJCdWlsdGluIGFuZCBpbnRlcm5hbCB1dGlsaXRpZXMgaW1wbGVtZW50YXRpb25zLgorCistIEJld2FyZSBub3QgdG8gdXNlIHB5dGhvbiBpbnRlcnByZXRlciBlbnZpcm9ubWVudCBhcyBpZiBpdCB3ZXJlIHRoZSBzaGVsbAorZW52aXJvbm1lbnQuIEZvciBpbnN0YW5jZSwgY29tbWFuZHMgd29ya2luZyBkaXJlY3RvcnkgbXVzdCBiZSBleHBsaWNpdGVseSBoYW5kbGVkCit0aHJvdWdoIGVudlsnUFdEJ10gaW5zdGVhZCBvZiByZWx5aW5nIG9uIHB5dGhvbiB3b3JraW5nIGRpcmVjdG9yeS4KKyIiIgoraW1wb3J0IGVycm5vCitpbXBvcnQgb3B0cGFyc2UKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworaW1wb3J0IHRpbWUKKworZGVmIGhhc19zdWJwcm9jZXNzX2J1ZygpOgorICAgIHJldHVybiBnZXRhdHRyKHN1YnByb2Nlc3MsICdsaXN0MmNtZGxpbmUnKSBhbmQgXAorICAgICAgICggICAgc3VicHJvY2Vzcy5saXN0MmNtZGxpbmUoWycnXSkgPT0gJycgb3IgXAorICAgICAgICAgICAgc3VicHJvY2Vzcy5saXN0MmNtZGxpbmUoWydmb298YmFyJ10pID09ICdmb298YmFyJykKKyAgICAgICAgICAgIAorIyBEZXRlY3QgcHl0aG9uIGJ1ZyAxNjM0MzQzOiAic3VicHJvY2VzcyBzd2FsbG93cyBlbXB0eSBhcmd1bWVudHMgdW5kZXIgd2luMzIiCisjIDxodHRwOi8vc291cmNlZm9yZ2UubmV0L3RyYWNrZXIvaW5kZXgucGhwP2Z1bmM9ZGV0YWlsJmFpZD0xNjM0MzQzJmdyb3VwX2lkPTU0NzAmYXRpZD0xMDU0NzA+CisjIEFsc28gZGV0ZWN0OiAiWyAxNzEwODAyIF0gc3VicHJvY2VzcyBtdXN0IGVzY2FwZSByZWRpcmVjdGlvbiBjaGFyYWN0ZXJzIHVuZGVyIHdpbjMyIgorIyA8aHR0cDovL3NvdXJjZWZvcmdlLm5ldC90cmFja2VyL2luZGV4LnBocD9mdW5jPWRldGFpbCZhaWQ9MTcxMDgwMiZncm91cF9pZD01NDcwJmF0aWQ9MTA1NDcwPgoraWYgaGFzX3N1YnByb2Nlc3NfYnVnKCk6CisgICAgaW1wb3J0IHN1YnByb2Nlc3NfZml4CisgICAgc3VicHJvY2Vzcy5saXN0MmNtZGxpbmUgPSBzdWJwcm9jZXNzX2ZpeC5saXN0MmNtZGxpbmUKKworZnJvbSBzaGVycm9ycyBpbXBvcnQgKgorCitjbGFzcyBOb25FeGl0aW5nUGFyc2VyKG9wdHBhcnNlLk9wdGlvblBhcnNlcik6CisgICAgIiIiT3B0aW9uUGFyc2VyIGRlZmF1bHQgYmVoYXZpb3VyIHVwb24gZXJyb3IgaXMgdG8gcHJpbnQgdGhlIGVycm9yIG1lc3NhZ2UgYW5kCisgICAgZXhpdC4gUmFpc2UgYSB1dGlsaXR5IGVycm9yIGluc3RlYWQuCisgICAgIiIiCisgICAgZGVmIGVycm9yKHNlbGYsIG1zZyk6CisgICAgICAgIHJhaXNlIFV0aWxpdHlFcnJvcihtc2cpCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgc2V0IHNwZWNpYWwgYnVpbHRpbgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorT1BUX1NFVCA9IE5vbkV4aXRpbmdQYXJzZXIodXNhZ2U9InNldCAtIHNldCBvciB1bnNldCBvcHRpb25zIGFuZCBwb3NpdGlvbmFsIHBhcmFtZXRlcnMiKQorT1BUX1NFVC5hZGRfb3B0aW9uKCAnLWYnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZXN0PSdoYXNfZicsIGRlZmF1bHQ9RmFsc2UsCisgICAgaGVscD0nVGhlIHNoZWxsIHNoYWxsIGRpc2FibGUgcGF0aG5hbWUgZXhwYW5zaW9uLicpCitPUFRfU0VULmFkZF9vcHRpb24oJy1lJywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVzdD0naGFzX2UnLCBkZWZhdWx0PUZhbHNlLAorICAgIGhlbHA9IiIiV2hlbiB0aGlzIG9wdGlvbiBpcyBvbiwgaWYgYSBzaW1wbGUgY29tbWFuZCBmYWlscyBmb3IgYW55IG9mIHRoZSBcCisgICAgcmVhc29ucyBsaXN0ZWQgaW4gQ29uc2VxdWVuY2VzIG9mIFNoZWxsIEVycm9ycyBvciByZXR1cm5zIGFuIGV4aXQgc3RhdHVzIFwKKyAgICB2YWx1ZSA+MCwgYW5kIGlzIG5vdCBwYXJ0IG9mIHRoZSBjb21wb3VuZCBsaXN0IGZvbGxvd2luZyBhIHdoaWxlLCB1bnRpbCwgXAorICAgIG9yIGlmIGtleXdvcmQsIGFuZCBpcyBub3QgYSBwYXJ0IG9mIGFuIEFORCBvciBPUiBsaXN0LCBhbmQgaXMgbm90IGEgXAorICAgIHBpcGVsaW5lIHByZWNlZGVkIGJ5IHRoZSAhIHJlc2VydmVkIHdvcmQsIHRoZW4gdGhlIHNoZWxsIHNoYWxsIGltbWVkaWF0ZWx5IFwKKyAgICBleGl0LiIiIikKK09QVF9TRVQuYWRkX29wdGlvbignLXgnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZXN0PSdoYXNfeCcsIGRlZmF1bHQ9RmFsc2UsCisgICAgaGVscD0iIiJUaGUgc2hlbGwgc2hhbGwgd3JpdGUgdG8gc3RhbmRhcmQgZXJyb3IgYSB0cmFjZSBmb3IgZWFjaCBjb21tYW5kIFwKKyAgICBhZnRlciBpdCBleHBhbmRzIHRoZSBjb21tYW5kIGFuZCBiZWZvcmUgaXQgZXhlY3V0ZXMgaXQuIEl0IGlzIHVuc3BlY2lmaWVkIFwKKyAgICB3aGV0aGVyIHRoZSBjb21tYW5kIHRoYXQgdHVybnMgdHJhY2luZyBvZmYgaXMgdHJhY2VkLiIiIikKKworZGVmIGJ1aWx0aW5fc2V0KG5hbWUsIGFyZ3MsIGludGVycCwgZW52LCBzdGRpbiwgc3Rkb3V0LCBzdGRlcnIsIGRlYnVnZmxhZ3MpOgorICAgIGlmICdkZWJ1Zy11dGlsaXR5JyBpbiBkZWJ1Z2ZsYWdzOgorICAgICAgICBwcmludCBpbnRlcnAubG9nKCcgJy5qb2luKFtuYW1lLCBzdHIoYXJncyksIGludGVycFsnUFdEJ11dKSArICdcbicpCisKKyAgICBvcHRpb24sIGFyZ3MgPSBPUFRfU0VULnBhcnNlX2FyZ3MoYXJncykKKyAgICBlbnYgPSBpbnRlcnAuZ2V0X2VudigpCisgICAgCisgICAgaWYgb3B0aW9uLmhhc19mOgorICAgICAgICBlbnYuc2V0X29wdCgnLWYnKQorICAgIGlmIG9wdGlvbi5oYXNfZToKKyAgICAgICAgZW52LnNldF9vcHQoJy1lJykKKyAgICBpZiBvcHRpb24uaGFzX3g6CisgICAgICAgIGVudi5zZXRfb3B0KCcteCcpCisgICAgcmV0dXJuIDAKKyAgICAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgc2hpZnQgc3BlY2lhbCBidWlsdGluCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCitkZWYgYnVpbHRpbl9zaGlmdChuYW1lLCBhcmdzLCBpbnRlcnAsIGVudiwgc3RkaW4sIHN0ZG91dCwgc3RkZXJyLCBkZWJ1Z2ZsYWdzKToKKyAgICBpZiAnZGVidWctdXRpbGl0eScgaW4gZGVidWdmbGFnczoKKyAgICAgICAgcHJpbnQgaW50ZXJwLmxvZygnICcuam9pbihbbmFtZSwgc3RyKGFyZ3MpLCBpbnRlcnBbJ1BXRCddXSkgKyAnXG4nKQorICAgICAgICAKKyAgICBwYXJhbXMgPSBpbnRlcnAuZ2V0X2VudigpLmdldF9wb3NpdGlvbmFsX2FyZ3MoKQorICAgIGlmIGFyZ3M6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG4gPSBpbnQoYXJnc1swXSkKKyAgICAgICAgICAgIGlmIG4gPiBsZW4ocGFyYW1zKToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gMQorICAgIGVsc2U6CisgICAgICAgIG4gPSAxCisgICAgICAgIAorICAgIHBhcmFtc1s6bl0gPSBbXQorICAgIGludGVycC5nZXRfZW52KCkuc2V0X3Bvc2l0aW9uYWxfYXJncyhwYXJhbXMpCisgICAgcmV0dXJuIDAKKyAgICAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgZXhwb3J0IHNwZWNpYWwgYnVpbHRpbgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorT1BUX0VYUE9SVCA9IE5vbkV4aXRpbmdQYXJzZXIodXNhZ2U9InNldCAtIHNldCBvciB1bnNldCBvcHRpb25zIGFuZCBwb3NpdGlvbmFsIHBhcmFtZXRlcnMiKQorT1BUX0VYUE9SVC5hZGRfb3B0aW9uKCctcCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlc3Q9J2hhc19wJywgZGVmYXVsdD1GYWxzZSkKKworZGVmIGJ1aWx0aW5fZXhwb3J0KG5hbWUsIGFyZ3MsIGludGVycCwgZW52LCBzdGRpbiwgc3Rkb3V0LCBzdGRlcnIsIGRlYnVnZmxhZ3MpOgorICAgIGlmICdkZWJ1Zy11dGlsaXR5JyBpbiBkZWJ1Z2ZsYWdzOgorICAgICAgICBwcmludCBpbnRlcnAubG9nKCcgJy5qb2luKFtuYW1lLCBzdHIoYXJncyksIGludGVycFsnUFdEJ11dKSArICdcbicpCisgICAgICAgIAorICAgIG9wdGlvbiwgYXJncyA9IE9QVF9FWFBPUlQucGFyc2VfYXJncyhhcmdzKQorICAgIGlmIG9wdGlvbi5oYXNfcDoKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCisgICAgCisgICAgZm9yIGFyZyBpbiBhcmdzOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBuYW1lLCB2YWx1ZSA9IGFyZy5zcGxpdCgnPScsIDEpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgbmFtZSwgdmFsdWUgPSBhcmcsIE5vbmUKKyAgICAgICAgZW52ID0gaW50ZXJwLmdldF9lbnYoKS5leHBvcnQobmFtZSwgdmFsdWUpCisgICAgCisgICAgcmV0dXJuIDAKKyAgICAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgcmV0dXJuIHNwZWNpYWwgYnVpbHRpbgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorZGVmIGJ1aWx0aW5fcmV0dXJuKG5hbWUsIGFyZ3MsIGludGVycCwgZW52LCBzdGRpbiwgc3Rkb3V0LCBzdGRlcnIsIGRlYnVnZmxhZ3MpOgorICAgIGlmICdkZWJ1Zy11dGlsaXR5JyBpbiBkZWJ1Z2ZsYWdzOgorICAgICAgICBwcmludCBpbnRlcnAubG9nKCcgJy5qb2luKFtuYW1lLCBzdHIoYXJncyksIGludGVycFsnUFdEJ11dKSArICdcbicpCisgICAgcmVzID0gMAorICAgIGlmIGFyZ3M6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlcyA9IGludChhcmdzWzBdKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHJlcyA9IDAKKyAgICAgICAgaWYgbm90IDA8PXJlczw9MjU1OgorICAgICAgICAgICAgcmVzID0gMAorICAgICAgICAgICAgCisgICAgIyBCVUc6IHNob3VsZCBiZSBsYXN0IGV4ZWN1dGVkIGNvbW1hbmQgZXhpdCBjb2RlICAgICAgICAKKyAgICByYWlzZSBSZXR1cm5TaWduYWwocmVzKQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjIHRyYXAgc3BlY2lhbCBidWlsdGluCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCitkZWYgYnVpbHRpbl90cmFwKG5hbWUsIGFyZ3MsIGludGVycCwgZW52LCBzdGRpbiwgc3Rkb3V0LCBzdGRlcnIsIGRlYnVnZmxhZ3MpOgorICAgIGlmICdkZWJ1Zy11dGlsaXR5JyBpbiBkZWJ1Z2ZsYWdzOgorICAgICAgICBwcmludCBpbnRlcnAubG9nKCcgJy5qb2luKFtuYW1lLCBzdHIoYXJncyksIGludGVycFsnUFdEJ11dKSArICdcbicpCisgICAgaWYgbGVuKGFyZ3MpIDwgMjoKKyAgICAgICAgc3RkZXJyLndyaXRlKCd0cmFwOiB1c2FnZTogdHJhcCBbW2FyZ10gc2lnbmFsX3NwZWMgLi4uXVxuJykKKyAgICAgICAgcmV0dXJuIDIKKworICAgIGFjdGlvbiA9IGFyZ3NbMF0KKyAgICBmb3Igc2lnIGluIGFyZ3NbMTpdOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBlbnYudHJhcHNbc2lnXSA9IGFjdGlvbgorICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICBzdGRlcnIud3JpdGUoJ3RyYXA6ICVzXG4nICUgc3RyKGUpKQorICAgIHJldHVybiAwCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgdW5zZXQgc3BlY2lhbCBidWlsdGluCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorT1BUX1VOU0VUID0gTm9uRXhpdGluZ1BhcnNlcigidW5zZXQgLSB1bnNldCB2YWx1ZXMgYW5kIGF0dHJpYnV0ZXMgb2YgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMiKQorT1BUX1VOU0VULmFkZF9vcHRpb24oICctZicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlc3Q9J2hhc19mJywgZGVmYXVsdD1GYWxzZSkKK09QVF9VTlNFVC5hZGRfb3B0aW9uKCAnLXYnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZXN0PSdoYXNfdicsIGRlZmF1bHQ9RmFsc2UpCisKK2RlZiBidWlsdGluX3Vuc2V0KG5hbWUsIGFyZ3MsIGludGVycCwgZW52LCBzdGRpbiwgc3Rkb3V0LCBzdGRlcnIsIGRlYnVnZmxhZ3MpOgorICAgIGlmICdkZWJ1Zy11dGlsaXR5JyBpbiBkZWJ1Z2ZsYWdzOgorICAgICAgICBwcmludCBpbnRlcnAubG9nKCcgJy5qb2luKFtuYW1lLCBzdHIoYXJncyksIGludGVycFsnUFdEJ11dKSArICdcbicpCisgICAgICAgIAorICAgIG9wdGlvbiwgYXJncyA9IE9QVF9VTlNFVC5wYXJzZV9hcmdzKGFyZ3MpCisgICAgCisgICAgc3RhdHVzID0gMAorICAgIGVudiA9IGludGVycC5nZXRfZW52KCkKKyAgICBmb3IgYXJnIGluIGFyZ3M6ICAgIAorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBvcHRpb24uaGFzX2Y6CisgICAgICAgICAgICAgICAgZW52LnJlbW92ZV9mdW5jdGlvbihhcmcpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGRlbCBlbnZbYXJnXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdCBWYXJBc3NpZ25tZW50RXJyb3I6CisgICAgICAgICAgICBzdGF0dXMgPSAxCisgICAgICAgICAgICAKKyAgICByZXR1cm4gc3RhdHVzCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgd2FpdCBzcGVjaWFsIGJ1aWx0aW4KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKK2RlZiBidWlsdGluX3dhaXQobmFtZSwgYXJncywgaW50ZXJwLCBlbnYsIHN0ZGluLCBzdGRvdXQsIHN0ZGVyciwgZGVidWdmbGFncyk6CisgICAgaWYgJ2RlYnVnLXV0aWxpdHknIGluIGRlYnVnZmxhZ3M6CisgICAgICAgIHByaW50IGludGVycC5sb2coJyAnLmpvaW4oW25hbWUsIHN0cihhcmdzKSwgaW50ZXJwWydQV0QnXV0pICsgJ1xuJykKKworICAgIHJldHVybiBpbnRlcnAud2FpdChbaW50KGFyZykgZm9yIGFyZyBpbiBhcmdzXSkKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyBjYXQgdXRpbGl0eQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2RlZiB1dGlsaXR5X2NhdChuYW1lLCBhcmdzLCBpbnRlcnAsIGVudiwgc3RkaW4sIHN0ZG91dCwgc3RkZXJyLCBkZWJ1Z2ZsYWdzKToKKyAgICBpZiAnZGVidWctdXRpbGl0eScgaW4gZGVidWdmbGFnczoKKyAgICAgICAgcHJpbnQgaW50ZXJwLmxvZygnICcuam9pbihbbmFtZSwgc3RyKGFyZ3MpLCBpbnRlcnBbJ1BXRCddXSkgKyAnXG4nKQorCisgICAgaWYgbm90IGFyZ3M6CisgICAgICAgIGFyZ3MgPSBbJy0nXQorCisgICAgc3RhdHVzID0gMAorICAgIGZvciBhcmcgaW4gYXJnczoKKyAgICAgICAgaWYgYXJnID09ICctJzoKKyAgICAgICAgICAgIGRhdGEgPSBzdGRpbi5yZWFkKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oZW52WydQV0QnXSwgYXJnKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGYgPSBmaWxlKHBhdGgsICdyYicpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gZi5yZWFkKCkKKyAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FTk9FTlQ6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgc3RhdHVzID0gMQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHN0ZG91dC53cml0ZShkYXRhKQorICAgICAgICBzdGRvdXQuZmx1c2goKQorICAgIHJldHVybiBzdGF0dXMKKyAgICAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgY2QgdXRpbGl0eQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorT1BUX0NEID0gTm9uRXhpdGluZ1BhcnNlcigiY2QgLSBjaGFuZ2UgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IikKKworZGVmIHV0aWxpdHlfY2QobmFtZSwgYXJncywgaW50ZXJwLCBlbnYsIHN0ZGluLCBzdGRvdXQsIHN0ZGVyciwgZGVidWdmbGFncyk6CisgICAgaWYgJ2RlYnVnLXV0aWxpdHknIGluIGRlYnVnZmxhZ3M6CisgICAgICAgIHByaW50IGludGVycC5sb2coJyAnLmpvaW4oW25hbWUsIHN0cihhcmdzKSwgaW50ZXJwWydQV0QnXV0pICsgJ1xuJykKKworICAgIG9wdGlvbiwgYXJncyA9IE9QVF9DRC5wYXJzZV9hcmdzKGFyZ3MpCisgICAgZW52ID0gaW50ZXJwLmdldF9lbnYoKQorICAgIAorICAgIGRpcmVjdG9yeSA9IE5vbmUKKyAgICBwcmludGRpciA9IEZhbHNlCisgICAgaWYgbm90IGFyZ3M6CisgICAgICAgIGhvbWUgPSBlbnYuZ2V0KCdIT01FJykKKyAgICAgICAgaWYgaG9tZToKKyAgICAgICAgICAgICMgVW5zcGVjaWZpZWQsIGRvIG5vdGhpbmcKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkaXJlY3RvcnkgPSBob21lCisgICAgZWxpZiBsZW4oYXJncyk9PTE6CisgICAgICAgIGRpcmVjdG9yeSA9IGFyZ3NbMF0KKyAgICAgICAgaWYgZGlyZWN0b3J5PT0nLSc6CisgICAgICAgICAgICBpZiAnT0xEUFdEJyBub3QgaW4gZW52OgorICAgICAgICAgICAgICAgIHJhaXNlIFV0aWxpdHlFcnJvcigiT0xEUFdEIG5vdCBzZXQiKQorICAgICAgICAgICAgcHJpbnRkaXIgPSBUcnVlCisgICAgICAgICAgICBkaXJlY3RvcnkgPSBlbnZbJ09MRFBXRCddCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgVXRpbGl0eUVycm9yKCJ0b28gbWFueSBhcmd1bWVudHMiKQorICAgICAgICAgICAgCisgICAgY3VycGF0aCA9IE5vbmUKKyAgICAjIEFic29sdXRlIGRpcmVjdG9yaWVzIHdpbGwgYmUgaGFuZGxlZCBjb3JyZWN0bHkgYnkgdGhlIG9zLnBhdGguam9pbiBjYWxsLgorICAgIGlmIG5vdCBkaXJlY3Rvcnkuc3RhcnRzd2l0aCgnLicpIGFuZCBub3QgZGlyZWN0b3J5LnN0YXJ0c3dpdGgoJy4uJyk6CisgICAgICAgIGNkcGF0aHMgPSBlbnYuZ2V0KCdDRFBBVEgnLCAnLicpLnNwbGl0KCc7JykKKyAgICAgICAgZm9yIGNkcGF0aCBpbiBjZHBhdGhzOgorICAgICAgICAgICAgcCA9IG9zLnBhdGguam9pbihjZHBhdGgsIGRpcmVjdG9yeSkKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIocCk6CisgICAgICAgICAgICAgICAgY3VycGF0aCA9IHAKKyAgICAgICAgICAgICAgICBicmVhaworICAgIAorICAgIGlmIGN1cnBhdGggaXMgTm9uZToKKyAgICAgICAgY3VycGF0aCA9IGRpcmVjdG9yeQorICAgIGN1cnBhdGggPSBvcy5wYXRoLmpvaW4oZW52WydQV0QnXSwgZGlyZWN0b3J5KQorCisgICAgZW52WydPTERQV0QnXSA9IGVudlsnUFdEJ10KKyAgICBlbnZbJ1BXRCddID0gY3VycGF0aAorICAgIGlmIHByaW50ZGlyOgorICAgICAgICBzdGRvdXQud3JpdGUoJyVzXG4nICUgY3VycGF0aCkKKyAgICByZXR1cm4gMAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjIGNvbG9uIHV0aWxpdHkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKK2RlZiB1dGlsaXR5X2NvbG9uKG5hbWUsIGFyZ3MsIGludGVycCwgZW52LCBzdGRpbiwgc3Rkb3V0LCBzdGRlcnIsIGRlYnVnZmxhZ3MpOgorICAgIGlmICdkZWJ1Zy11dGlsaXR5JyBpbiBkZWJ1Z2ZsYWdzOgorICAgICAgICBwcmludCBpbnRlcnAubG9nKCcgJy5qb2luKFtuYW1lLCBzdHIoYXJncyksIGludGVycFsnUFdEJ11dKSArICdcbicpCisgICAgcmV0dXJuIDAKKyAgICAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgZWNobyB1dGlsaXR5CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCitkZWYgdXRpbGl0eV9lY2hvKG5hbWUsIGFyZ3MsIGludGVycCwgZW52LCBzdGRpbiwgc3Rkb3V0LCBzdGRlcnIsIGRlYnVnZmxhZ3MpOgorICAgIGlmICdkZWJ1Zy11dGlsaXR5JyBpbiBkZWJ1Z2ZsYWdzOgorICAgICAgICBwcmludCBpbnRlcnAubG9nKCcgJy5qb2luKFtuYW1lLCBzdHIoYXJncyksIGludGVycFsnUFdEJ11dKSArICdcbicpCisgICAgICAgIAorICAgICMgRWNobyBvbmx5IHRha2VzIGFyZ3VtZW50cywgbm8gb3B0aW9ucy4gVXNlIHByaW50ZiBpZiB5b3UgbmVlZCBmYW5jeSBzdHVmZi4KKyAgICBvdXRwdXQgPSAnICcuam9pbihhcmdzKSArICdcbicKKyAgICBzdGRvdXQud3JpdGUob3V0cHV0KQorICAgIHN0ZG91dC5mbHVzaCgpCisgICAgcmV0dXJuIDAKKyAgICAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgZWdyZXAgdXRpbGl0eQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgZWdyZXAgaXMgdXN1YWxseSBhIHNoZWxsIHNjcmlwdC4KKyMgVW5mb3J0dW5hdGVseSwgcHlzaCBkb2VzIG5vdCBzdXBwb3J0IHNoZWxsIHNjcmlwdHMgKndpdGggYXJndW1lbnRzKiByaWdodCBub3csCisjIHNvIHRoZSByZWRpcmVjdGlvbiBpcyBpbXBsZW1lbnRlZCBoZXJlLCBhc3N1bWluZyBncmVwIGlzIGF2YWlsYWJsZS4KK2RlZiB1dGlsaXR5X2VncmVwKG5hbWUsIGFyZ3MsIGludGVycCwgZW52LCBzdGRpbiwgc3Rkb3V0LCBzdGRlcnIsIGRlYnVnZmxhZ3MpOgorICAgIGlmICdkZWJ1Zy11dGlsaXR5JyBpbiBkZWJ1Z2ZsYWdzOgorICAgICAgICBwcmludCBpbnRlcnAubG9nKCcgJy5qb2luKFtuYW1lLCBzdHIoYXJncyksIGludGVycFsnUFdEJ11dKSArICdcbicpCisgICAgICAgIAorICAgIHJldHVybiBydW5fY29tbWFuZCgnZ3JlcCcsIFsnLUUnXSArIGFyZ3MsIGludGVycCwgZW52LCBzdGRpbiwgc3Rkb3V0LCAKKyAgICAgICAgc3RkZXJyLCBkZWJ1Z2ZsYWdzKQorICAgIAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyBlbnYgdXRpbGl0eQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorZGVmIHV0aWxpdHlfZW52KG5hbWUsIGFyZ3MsIGludGVycCwgZW52LCBzdGRpbiwgc3Rkb3V0LCBzdGRlcnIsIGRlYnVnZmxhZ3MpOgorICAgIGlmICdkZWJ1Zy11dGlsaXR5JyBpbiBkZWJ1Z2ZsYWdzOgorICAgICAgICBwcmludCBpbnRlcnAubG9nKCcgJy5qb2luKFtuYW1lLCBzdHIoYXJncyksIGludGVycFsnUFdEJ11dKSArICdcbicpCisgICAgCisgICAgaWYgYXJncyBhbmQgYXJnc1swXT09Jy1pJzoKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignZW52OiAtaSBvcHRpb24gaXMgbm90IGltcGxlbWVudGVkJykKKyAgICAKKyAgICBpID0gMAorICAgIGZvciBhcmcgaW4gYXJnczoKKyAgICAgICAgaWYgJz0nIG5vdCBpbiBhcmc6CisgICAgICAgICAgICBicmVhaworICAgICAgICAjIFVwZGF0ZSB0aGUgY3VycmVudCBlbnZpcm9ubWVudAorICAgICAgICBuYW1lLCB2YWx1ZSA9IGFyZy5zcGxpdCgnPScsIDEpCisgICAgICAgIGVudltuYW1lXSA9IHZhbHVlCisgICAgICAgIGkgKz0gMQorICAgICAgICAKKyAgICBpZiBhcmdzW2k6XToKKyAgICAgICAgIyBGaW5kIHRoZW4gZXhlY3V0ZSB0aGUgc3BlY2lmaWVkIGludGVycHJldGVyCisgICAgICAgIHV0aWxpdHkgPSBlbnYuZmluZF9pbl9wYXRoKGFyZ3NbaV0pCisgICAgICAgIGlmIG5vdCB1dGlsaXR5OgorICAgICAgICAgICAgcmV0dXJuIDEyNworICAgICAgICBhcmdzW2k6aSsxXSA9IHV0aWxpdHkKKyAgICAgICAgbmFtZSA9IGFyZ3NbaV0KKyAgICAgICAgYXJncyA9IGFyZ3NbaSsxOl0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHJ1bl9jb21tYW5kKG5hbWUsIGFyZ3MsIGludGVycCwgZW52LCBzdGRpbiwgc3Rkb3V0LCBzdGRlcnIsIAorICAgICAgICAgICAgICAgIGRlYnVnZmxhZ3MpCisgICAgICAgIGV4Y2VwdCBVdGlsaXR5RXJyb3I6CisgICAgICAgICAgICBzdGRlcnIud3JpdGUoJ2VudjogZmFpbGVkIHRvIGV4ZWN1dGUgJXMnICUgJyAnLmpvaW4oW25hbWVdK2FyZ3MpKQorICAgICAgICAgICAgcmV0dXJuIDEyNiAgICAgICAgICAgIAorICAgIGVsc2U6CisgICAgICAgIGZvciBwYWlyIGluIGVudi5nZXRfdmFyaWFibGVzKCkuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICBzdGRvdXQud3JpdGUoJyVzPSVzXG4nICUgcGFpcikKKyAgICByZXR1cm4gMAorICAgIAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyBleGl0IHV0aWxpdHkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitkZWYgdXRpbGl0eV9leGl0KG5hbWUsIGFyZ3MsIGludGVycCwgZW52LCBzdGRpbiwgc3Rkb3V0LCBzdGRlcnIsIGRlYnVnZmxhZ3MpOgorICAgIGlmICdkZWJ1Zy11dGlsaXR5JyBpbiBkZWJ1Z2ZsYWdzOgorICAgICAgICBwcmludCBpbnRlcnAubG9nKCcgJy5qb2luKFtuYW1lLCBzdHIoYXJncyksIGludGVycFsnUFdEJ11dKSArICdcbicpCisgICAgICAgIAorICAgIHJlcyA9IE5vbmUKKyAgICBpZiBhcmdzOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXMgPSBpbnQoYXJnc1swXSkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICByZXMgPSBOb25lCisgICAgICAgIGlmIG5vdCAwPD1yZXM8PTI1NToKKyAgICAgICAgICAgIHJlcyA9IE5vbmUKKyAgICAgICAgICAgIAorICAgIGlmIHJlcyBpcyBOb25lOgorICAgICAgICAjIEJVRzogc2hvdWxkIGJlIGxhc3QgZXhlY3V0ZWQgY29tbWFuZCBleGl0IGNvZGUKKyAgICAgICAgcmVzID0gMAorICAgICAgICAKKyAgICByYWlzZSBFeGl0U2lnbmFsKHJlcykKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyBmZ3JlcCB1dGlsaXR5CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBzZWUgZWdyZXAKK2RlZiB1dGlsaXR5X2ZncmVwKG5hbWUsIGFyZ3MsIGludGVycCwgZW52LCBzdGRpbiwgc3Rkb3V0LCBzdGRlcnIsIGRlYnVnZmxhZ3MpOgorICAgIGlmICdkZWJ1Zy11dGlsaXR5JyBpbiBkZWJ1Z2ZsYWdzOgorICAgICAgICBwcmludCBpbnRlcnAubG9nKCcgJy5qb2luKFtuYW1lLCBzdHIoYXJncyksIGludGVycFsnUFdEJ11dKSArICdcbicpCisgICAgICAgIAorICAgIHJldHVybiBydW5fY29tbWFuZCgnZ3JlcCcsIFsnLUYnXSArIGFyZ3MsIGludGVycCwgZW52LCBzdGRpbiwgc3Rkb3V0LCAKKyAgICAgICAgc3RkZXJyLCBkZWJ1Z2ZsYWdzKQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjIGd1bnppcCB1dGlsaXR5CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBzZWUgZWdyZXAKK2RlZiB1dGlsaXR5X2d1bnppcChuYW1lLCBhcmdzLCBpbnRlcnAsIGVudiwgc3RkaW4sIHN0ZG91dCwgc3RkZXJyLCBkZWJ1Z2ZsYWdzKToKKyAgICBpZiAnZGVidWctdXRpbGl0eScgaW4gZGVidWdmbGFnczoKKyAgICAgICAgcHJpbnQgaW50ZXJwLmxvZygnICcuam9pbihbbmFtZSwgc3RyKGFyZ3MpLCBpbnRlcnBbJ1BXRCddXSkgKyAnXG4nKQorICAgICAgICAKKyAgICByZXR1cm4gcnVuX2NvbW1hbmQoJ2d6aXAnLCBbJy1kJ10gKyBhcmdzLCBpbnRlcnAsIGVudiwgc3RkaW4sIHN0ZG91dCwgCisgICAgICAgIHN0ZGVyciwgZGVidWdmbGFncykKKyAgICAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMga2lsbCB1dGlsaXR5CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZGVmIHV0aWxpdHlfa2lsbChuYW1lLCBhcmdzLCBpbnRlcnAsIGVudiwgc3RkaW4sIHN0ZG91dCwgc3RkZXJyLCBkZWJ1Z2ZsYWdzKToKKyAgICBpZiAnZGVidWctdXRpbGl0eScgaW4gZGVidWdmbGFnczoKKyAgICAgICAgcHJpbnQgaW50ZXJwLmxvZygnICcuam9pbihbbmFtZSwgc3RyKGFyZ3MpLCBpbnRlcnBbJ1BXRCddXSkgKyAnXG4nKQorICAgICAgICAKKyAgICBmb3IgYXJnIGluIGFyZ3M6CisgICAgICAgIHBpZCA9IGludChhcmcpCisgICAgICAgIHN0YXR1cyA9IHN1YnByb2Nlc3MuY2FsbChbJ3Bza2lsbCcsICcvVCcsIHN0cihwaWQpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hlbGw9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgIyBwc2tpbGwgaXMgYXN5bmNocm9ub3VzLCBoZW5jZSB0aGUgc3R1cGlkIHBvbGxpbmcgbG9vcAorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oWydwc2xpc3QnLCBzdHIocGlkKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoZWxsPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCkKKyAgICAgICAgICAgIG91dHB1dCA9IHAuY29tbXVuaWNhdGUoKVswXQorICAgICAgICAgICAgaWYgKCdwcm9jZXNzICVkIHdhcyBub3QnICUgcGlkKSBpbiBvdXRwdXQ6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMSkKKyAgICByZXR1cm4gc3RhdHVzCisgICAgCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjIG1rZGlyIHV0aWxpdHkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitPUFRfTUtESVIgPSBOb25FeGl0aW5nUGFyc2VyKCJta2RpciAtIG1ha2UgZGlyZWN0b3JpZXMuIikKK09QVF9NS0RJUi5hZGRfb3B0aW9uKCctcCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlc3Q9J2hhc19wJywgZGVmYXVsdD1GYWxzZSkKKworZGVmIHV0aWxpdHlfbWtkaXIobmFtZSwgYXJncywgaW50ZXJwLCBlbnYsIHN0ZGluLCBzdGRvdXQsIHN0ZGVyciwgZGVidWdmbGFncyk6CisgICAgaWYgJ2RlYnVnLXV0aWxpdHknIGluIGRlYnVnZmxhZ3M6CisgICAgICAgIHByaW50IGludGVycC5sb2coJyAnLmpvaW4oW25hbWUsIHN0cihhcmdzKSwgaW50ZXJwWydQV0QnXV0pICsgJ1xuJykKKyAgICAgICAgCisgICAgIyBUT0RPOiBpbXBsZW1lbnQgdW1hc2sKKyAgICAjIFRPRE86IGltcGxlbWVudCBwcm9wZXIgdXRpbGl0eSBlcnJvciByZXBvcnQKKyAgICBvcHRpb24sIGFyZ3MgPSBPUFRfTUtESVIucGFyc2VfYXJncyhhcmdzKQorICAgIGZvciBhcmcgaW4gYXJnczoKKyAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihlbnZbJ1BXRCddLCBhcmcpCisgICAgICAgIGlmIG9wdGlvbi5oYXNfcDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy5tYWtlZGlycyhwYXRoKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVFWElTVDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZWxzZTogICAgICAgICAgICAgICAKKyAgICAgICAgICAgIG9zLm1rZGlyKHBhdGgpCisgICAgcmV0dXJuIDAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyBuZXRzdGF0IHV0aWxpdHkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitkZWYgdXRpbGl0eV9uZXRzdGF0KG5hbWUsIGFyZ3MsIGludGVycCwgZW52LCBzdGRpbiwgc3Rkb3V0LCBzdGRlcnIsIGRlYnVnZmxhZ3MpOgorICAgICMgRG8geW91IHJlYWxseSBleHBlY3QgbWUgdG8gaW1wbGVtZW50IG5ldHN0YXQgPworICAgICMgVGhpcyBlbXB0eSBmb3JtIGlzIGVub3VnaCBmb3IgTWVyY3VyaWFsIHRlc3RzIHNpbmNlIGl0J3MKKyAgICAjIHN1cHBvc2VkIHRvIGdlbmVyYXRlIG5vdGhpbmcgdXBvbiBzdWNjZXNzLiBGYWtpbmcgdGhpcyB0ZXN0CisgICAgIyBpcyBub3QgYSBiaWcgZGVhbCBlaXRoZXIuCisgICAgaWYgJ2RlYnVnLXV0aWxpdHknIGluIGRlYnVnZmxhZ3M6CisgICAgICAgIHByaW50IGludGVycC5sb2coJyAnLmpvaW4oW25hbWUsIHN0cihhcmdzKSwgaW50ZXJwWydQV0QnXV0pICsgJ1xuJykKKyAgICByZXR1cm4gMAorICAgIAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyBwd2QgdXRpbGl0eQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorT1BUX1BXRCA9IE5vbkV4aXRpbmdQYXJzZXIoInB3ZCAtIHJldHVybiB3b3JraW5nIGRpcmVjdG9yeSBuYW1lIikKK09QVF9QV0QuYWRkX29wdGlvbignLUwnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZXN0PSdoYXNfTCcsIGRlZmF1bHQ9VHJ1ZSwKKyAgICBoZWxwPSIiIklmIHRoZSBQV0QgZW52aXJvbm1lbnQgdmFyaWFibGUgY29udGFpbnMgYW4gYWJzb2x1dGUgcGF0aG5hbWUgb2YgXAorICAgIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB0aGF0IGRvZXMgbm90IGNvbnRhaW4gdGhlIGZpbGVuYW1lcyBkb3Qgb3IgZG90LWRvdCwgXAorICAgIHB3ZCBzaGFsbCB3cml0ZSB0aGlzIHBhdGhuYW1lIHRvIHN0YW5kYXJkIG91dHB1dC4gT3RoZXJ3aXNlLCB0aGUgLUwgb3B0aW9uIFwKKyAgICBzaGFsbCBiZWhhdmUgYXMgdGhlIC1QIG9wdGlvbi4iIiIpCitPUFRfUFdELmFkZF9vcHRpb24oJy1QJywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVzdD0naGFzX0wnLCBkZWZhdWx0PUZhbHNlLAorICAgIGhlbHA9IiIiVGhlIGFic29sdXRlIHBhdGhuYW1lIHdyaXR0ZW4gc2hhbGwgbm90IGNvbnRhaW4gZmlsZW5hbWVzIHRoYXQsIGluIFwKKyAgICB0aGUgY29udGV4dCBvZiB0aGUgcGF0aG5hbWUsIHJlZmVyIHRvIGZpbGVzIG9mIHR5cGUgc3ltYm9saWMgbGluay4iIiIpCisKK2RlZiB1dGlsaXR5X3B3ZChuYW1lLCBhcmdzLCBpbnRlcnAsIGVudiwgc3RkaW4sIHN0ZG91dCwgc3RkZXJyLCBkZWJ1Z2ZsYWdzKToKKyAgICBpZiAnZGVidWctdXRpbGl0eScgaW4gZGVidWdmbGFnczoKKyAgICAgICAgcHJpbnQgaW50ZXJwLmxvZygnICcuam9pbihbbmFtZSwgc3RyKGFyZ3MpLCBpbnRlcnBbJ1BXRCddXSkgKyAnXG4nKQorCisgICAgb3B0aW9uLCBhcmdzID0gT1BUX1BXRC5wYXJzZV9hcmdzKGFyZ3MpICAgICAgICAKKyAgICBzdGRvdXQud3JpdGUoJyVzXG4nICUgZW52WydQV0QnXSkKKyAgICByZXR1cm4gMAorICAgIAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyBwcmludGYgdXRpbGl0eQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JFX1VORVNDQVBFID0gcmUuY29tcGlsZShyJyhcXHhbYS16QS1aMC05XXsyfXxcXFswLTddezEsM318XFwuKScpCisKK2RlZiB1dGlsaXR5X3ByaW50ZihuYW1lLCBhcmdzLCBpbnRlcnAsIGVudiwgc3RkaW4sIHN0ZG91dCwgc3RkZXJyLCBkZWJ1Z2ZsYWdzKToKKyAgICBpZiAnZGVidWctdXRpbGl0eScgaW4gZGVidWdmbGFnczoKKyAgICAgICAgcHJpbnQgaW50ZXJwLmxvZygnICcuam9pbihbbmFtZSwgc3RyKGFyZ3MpLCBpbnRlcnBbJ1BXRCddXSkgKyAnXG4nKQorICAgICAgICAKKyAgICBkZWYgcmVwbGFjZShtKToKKyAgICAgICAgYXNzZXJ0IG0uZ3JvdXAoKQorICAgICAgICBnID0gbS5ncm91cCgpWzE6XQorICAgICAgICBpZiBnLnN0YXJ0c3dpdGgoJ3gnKToKKyAgICAgICAgICAgIHJldHVybiBjaHIoaW50KGdbMTpdLCAxNikpCisgICAgICAgIGlmIGxlbihnKSA8PSAzIGFuZCBsZW4oW2MgZm9yIGMgaW4gZyBpZiBjIGluICcwMTIzNDU2NyddKSA9PSBsZW4oZyk6CisgICAgICAgICAgICAjIFlheSwgYW4gb2N0YWwgbnVtYmVyCisgICAgICAgICAgICByZXR1cm4gY2hyKGludChnLCA4KSkKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICdhJzogJ1xhJywKKyAgICAgICAgICAgICdiJzogJ1xiJywKKyAgICAgICAgICAgICdmJzogJ1xmJywKKyAgICAgICAgICAgICduJzogJ1xuJywKKyAgICAgICAgICAgICdyJzogJ1xyJywKKyAgICAgICAgICAgICd0JzogJ1x0JywKKyAgICAgICAgICAgICd2JzogJ1x2JywKKyAgICAgICAgICAgICdcXCc6ICdcXCcsCisgICAgICAgIH0uZ2V0KGcpCisgICAgICAgIAorICAgICMgQ29udmVydCBlc2NhcGUgc2VxdWVuY2VzCisgICAgZm9ybWF0ID0gcmUuc3ViKFJFX1VORVNDQVBFLCByZXBsYWNlLCBhcmdzWzBdKQorICAgIHN0ZG91dC53cml0ZShmb3JtYXQgJSB0dXBsZShhcmdzWzE6XSkpCisgICAgcmV0dXJuIDAKKyAgICAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgdHJ1ZSB1dGlsaXR5CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZGVmIHV0aWxpdHlfdHJ1ZShuYW1lLCBhcmdzLCBpbnRlcnAsIGVudiwgc3RkaW4sIHN0ZG91dCwgc3RkZXJyLCBkZWJ1Z2ZsYWdzKToKKyAgICBpZiAnZGVidWctdXRpbGl0eScgaW4gZGVidWdmbGFnczoKKyAgICAgICAgcHJpbnQgaW50ZXJwLmxvZygnICcuam9pbihbbmFtZSwgc3RyKGFyZ3MpLCBpbnRlcnBbJ1BXRCddXSkgKyAnXG4nKQorICAgIHJldHVybiAwCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgc2VkIHV0aWxpdHkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSRV9TRUQgPSByZS5jb21waWxlKHInXnMoLikuKlwxW2EtekEtWl0qJCcpCisKKyMgY3lnd2luIHNlZCBmYWlscyB3aXRoIHNvbWUgZXhwcmVzc2lvbnMgd2hlbiB0aGV5IGRvIG5vdCBlbmQgd2l0aCBhIHNpbmdsZSBzcGFjZS4KKyMgc2VlIHVuaXQgdGVzdHMgZm9yIGRldGFpbHMuIEludGVyZXN0aW5nbHksIHRoZSBzYW1lIGV4cHJlc3Npb25zIHdvcmtzIHBlcmZlY3RseQorIyBpbiBjeWd3aW4gc2hlbGwuCitkZWYgdXRpbGl0eV9zZWQobmFtZSwgYXJncywgaW50ZXJwLCBlbnYsIHN0ZGluLCBzdGRvdXQsIHN0ZGVyciwgZGVidWdmbGFncyk6CisgICAgaWYgJ2RlYnVnLXV0aWxpdHknIGluIGRlYnVnZmxhZ3M6CisgICAgICAgIHByaW50IGludGVycC5sb2coJyAnLmpvaW4oW25hbWUsIHN0cihhcmdzKSwgaW50ZXJwWydQV0QnXV0pICsgJ1xuJykKKyAgICAgICAgCisgICAgIyBTY2FuIHBhdHRlcm4gYXJndW1lbnRzIGFuZCBhcHBlbmQgYSBzcGFjZSBpZiBuZWNlc3NhcnkKKyAgICBmb3IgaSBpbiB4cmFuZ2UobGVuKGFyZ3MpKToKKyAgICAgICAgaWYgbm90IFJFX1NFRC5zZWFyY2goYXJnc1tpXSk6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBhcmdzW2ldID0gYXJnc1tpXSArICcgJworCisgICAgcmV0dXJuIHJ1bl9jb21tYW5kKG5hbWUsIGFyZ3MsIGludGVycCwgZW52LCBzdGRpbiwgc3Rkb3V0LCAKKyAgICAgICAgc3RkZXJyLCBkZWJ1Z2ZsYWdzKQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjIHNsZWVwIHV0aWxpdHkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitkZWYgdXRpbGl0eV9zbGVlcChuYW1lLCBhcmdzLCBpbnRlcnAsIGVudiwgc3RkaW4sIHN0ZG91dCwgc3RkZXJyLCBkZWJ1Z2ZsYWdzKToKKyAgICBpZiAnZGVidWctdXRpbGl0eScgaW4gZGVidWdmbGFnczoKKyAgICAgICAgcHJpbnQgaW50ZXJwLmxvZygnICcuam9pbihbbmFtZSwgc3RyKGFyZ3MpLCBpbnRlcnBbJ1BXRCddXSkgKyAnXG4nKQorICAgIHRpbWUuc2xlZXAoaW50KGFyZ3NbMF0pKQorICAgIHJldHVybiAwCisgICAgCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjIHNvcnQgdXRpbGl0eQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK09QVF9TT1JUID0gTm9uRXhpdGluZ1BhcnNlcigic29ydCAtIHNvcnQsIG1lcmdlLCBvciBzZXF1ZW5jZSBjaGVjayB0ZXh0IGZpbGVzIikKKworZGVmIHV0aWxpdHlfc29ydChuYW1lLCBhcmdzLCBpbnRlcnAsIGVudiwgc3RkaW4sIHN0ZG91dCwgc3RkZXJyLCBkZWJ1Z2ZsYWdzKToKKworICAgIGRlZiBzb3J0KHBhdGgpOgorICAgICAgICBpZiBwYXRoID09ICctJzoKKyAgICAgICAgICAgIGxpbmVzID0gc3RkaW4ucmVhZGxpbmVzKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmID0gZmlsZShwYXRoKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgbGluZXMgPSBmLnJlYWRsaW5lcygpCisgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvciBhcyBlOgorICAgICAgICAgICAgICAgIHN0ZGVyci53cml0ZShzdHIoZSkgKyAnXG4nKQorICAgICAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIAorICAgICAgICBpZiBsaW5lcyBhbmQgbGluZXNbLTFdWy0xXSE9J1xuJzoKKyAgICAgICAgICAgIGxpbmVzWy0xXSA9IGxpbmVzWy0xXSArICdcbicKKyAgICAgICAgcmV0dXJuIGxpbmVzCisgICAgCisgICAgaWYgJ2RlYnVnLXV0aWxpdHknIGluIGRlYnVnZmxhZ3M6CisgICAgICAgIHByaW50IGludGVycC5sb2coJyAnLmpvaW4oW25hbWUsIHN0cihhcmdzKSwgaW50ZXJwWydQV0QnXV0pICsgJ1xuJykKKyAgICAgICAgCisgICAgb3B0aW9uLCBhcmdzID0gT1BUX1NPUlQucGFyc2VfYXJncyhhcmdzKQorICAgIGFsbGxpbmVzID0gW10KKyAgICAKKyAgICBpZiBsZW4oYXJncyk8PTA6CisgICAgICAgIGFyZ3MgKz0gWyctJ10KKyAgICAgICAgCisgICAgIyBMb2FkIGFsbCBmaWxlcyBsaW5lcworICAgIGN1cmRpciA9IG9zLmdldGN3ZCgpCisgICAgdHJ5OgorICAgICAgICBvcy5jaGRpcihlbnZbJ1BXRCddKQorICAgICAgICBmb3IgcGF0aCBpbiBhcmdzOgorICAgICAgICAgICAgYWxsbGluZXMgKz0gc29ydChwYXRoKQorICAgIGZpbmFsbHk6CisgICAgICAgIG9zLmNoZGlyKGN1cmRpcikKKyAgICAgICAgICAgIAorICAgIGFsbGxpbmVzLnNvcnQoKQorICAgIGZvciBsaW5lIGluIGFsbGxpbmVzOgorICAgICAgICBzdGRvdXQud3JpdGUobGluZSkKKyAgICByZXR1cm4gMAorICAgIAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgaGcgdXRpbGl0eQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaGdjb21tYW5kcyA9IFsKKyAgICAnYWRkJywKKyAgICAnYWRkcmVtb3ZlJywKKyAgICAnY29tbWl0JywgJ2NpJywKKyAgICAnZGVidWdyZW5hbWUnLAorICAgICdkZWJ1Z3dhbGsnLAorICAgICdmYWxhYmFsYScsICMgRHVtbXkgY29tbWFuZCB1c2VkIGluIGEgbWVyY3VyaWFsIHRlc3QKKyAgICAnaW5jb21pbmcnLAorICAgICdsb2NhdGUnLAorICAgICdwdWxsJywKKyAgICAncHVzaCcsCisgICAgJ3Fpbml0JywKKyAgICAncmVtb3ZlJywgJ3JtJywKKyAgICAncmVuYW1lJywgJ212JywKKyAgICAncmV2ZXJ0JywgICAgCisgICAgJ3Nob3djb25maWcnLAorICAgICdzdGF0dXMnLCAnc3QnLAorICAgICdzdHJpcCcsCisgICAgXQorCitkZWYgcmV3cml0ZXNsYXNoZXMobmFtZSwgYXJncyk6CisgICAgIyBTZXZlcmFsIGhnIGNvbW1hbmRzIG91dHB1dCBmaWxlIHBhdGhzLCByZXdyaXRlIHRoZSBzZXBhcmF0b3JzCisgICAgaWYgbGVuKGFyZ3MpID4gMSBhbmQgbmFtZS5sb3dlcigpLmVuZHN3aXRoKCdweXRob24nKSBcCisgICAgICAgYW5kIGFyZ3NbMF0uZW5kc3dpdGgoJ2hnJyk6CisgICAgICAgIGZvciBjbWQgaW4gaGdjb21tYW5kczoKKyAgICAgICAgICAgIGlmIGNtZCBpbiBhcmdzWzE6XToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgCisgICAgIyBzdm4gb3V0cHV0IGNvbnRhaW5zIG1hbnkgcGF0aHMgd2l0aCBPUyBzcGVjaWZpYyBzZXBhcmF0b3JzLgorICAgICMgTm9ybWFsaXplIHRoZXNlIHRvIHVuaXggcGF0aHMuCisgICAgYmFzZSA9IG9zLnBhdGguYmFzZW5hbWUobmFtZSkKKyAgICBpZiBiYXNlLnN0YXJ0c3dpdGgoJ3N2bicpOgorICAgICAgICByZXR1cm4gVHJ1ZQorICAgIAorICAgIHJldHVybiBGYWxzZQorCitkZWYgcmV3cml0ZWhnKG91dHB1dCk6CisgICAgaWYgbm90IG91dHB1dDoKKyAgICAgICAgcmV0dXJuIG91dHB1dAorICAgICMgUmV3cml0ZSBvcyBzcGVjaWZpYyBtZXNzYWdlcworICAgIG91dHB1dCA9IG91dHB1dC5yZXBsYWNlKCc6IFRoZSBzeXN0ZW0gY2Fubm90IGZpbmQgdGhlIGZpbGUgc3BlY2lmaWVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5JykKKyAgICBvdXRwdXQgPSByZS5zdWIoJzogQWNjZXNzIGlzIGRlbmllZC4qJCcsICc6IFBlcm1pc3Npb24gZGVuaWVkJywgb3V0cHV0KQorICAgIG91dHB1dCA9IG91dHB1dC5yZXBsYWNlKCc6IE5vIGNvbm5lY3Rpb24gY291bGQgYmUgbWFkZSBiZWNhdXNlIHRoZSB0YXJnZXQgbWFjaGluZSBhY3RpdmVseSByZWZ1c2VkIGl0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOiBDb25uZWN0aW9uIHJlZnVzZWQnKQorICAgIHJldHVybiBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworZGVmIHJ1bl9jb21tYW5kKG5hbWUsIGFyZ3MsIGludGVycCwgZW52LCBzdGRpbiwgc3Rkb3V0LAorICAgICAgICAgICAgICAgIHN0ZGVyciwgZGVidWdmbGFncyk6CisgICAgIyBFeGVjdXRlIHRoZSBjb21tYW5kCisgICAgaWYgJ2RlYnVnLXV0aWxpdHknIGluIGRlYnVnZmxhZ3M6CisgICAgICAgIHByaW50IGludGVycC5sb2coJyAnLmpvaW4oW25hbWUsIHN0cihhcmdzKSwgaW50ZXJwWydQV0QnXV0pICsgJ1xuJykKKworICAgIGhnYmluID0gaW50ZXJwLm9wdGlvbnMoKS5oZ2JpbmFyeQorICAgIGlzaGcgPSBoZ2JpbiBhbmQgKCdoZycgaW4gbmFtZSBvciBhcmdzIGFuZCAnaGcnIGluIGFyZ3NbMF0pCisgICAgdW5peG91dHB1dCA9ICdjeWd3aW4nIGluIG5hbWUgb3IgaXNoZworICAgIAorICAgIGV4ZWNfZW52ID0gZW52LmdldF92YXJpYWJsZXMoKSAgICAgICAgCisgICAgdHJ5OgorICAgICAgICAjIEJVRzogY29tcGFyaW5nIGZpbGUgZGVzY3JpcHRvciBpcyBjbGVhcmx5IG5vdCBhIHJlbGlhYmxlIHdheSB0byB0ZWxsCisgICAgICAgICMgd2hldGhlciB0aGV5IHBvaW50IG9uIHRoZSBzYW1lIHVuZGVybHlpbmcgb2JqZWN0LiBCdXQgaW4gcHlzaCBsaW1pdGVkCisgICAgICAgICMgc2NvcGUgdGhpcyBpcyB1c3VhbGx5IHJpZ2h0LCB3ZSBkbyBub3QgZXhwZWN0IGNvbXBsaWNhdGVkIHJlZGlyZWN0aW9ucworICAgICAgICAjIGJlc2lkZXMgdXN1YWwgMj4mMS4KKyAgICAgICAgIyBTdGlsbCB0aGVyZSBpcyBvbmUgY2FzZSB3ZSBoYXZlIGJ1dCBjYW5ub3QgZGVhbCB3aXRoIGlzIHdoZW4gc3Rkb3V0CisgICAgICAgICMgYW5kIHN0ZGVyciBhcmUgcmVkaXJlY3RlZCAqYnkgcHlzaCBjYWxsZXIqLiBUaGlzIHRoZSByZWFzb24gZm9yIHRoZQorICAgICAgICAjIC0tcmVkaXJlY3QgcHlzaCgpIG9wdGlvbi4KKyAgICAgICAgIyBOb3csIHdlIHdhbnQgdG8ga25vdyB0aGV5IGFyZSB0aGUgc2FtZSBiZWNhdXNlIHdlIHNvbWV0aW1lcyBuZWVkIHRvIAorICAgICAgICAjIHRyYW5zZm9ybSB0aGUgY29tbWFuZCBvdXRwdXQsIG1vc3RseSByZW1vdmUgQ1ItTEYgdG8gZW5zdXJlIHRoYXQKKyAgICAgICAgIyBjb21tYW5kIG91dHB1dCBpcyB1bml4LWxpa2UuIEN5Z3dpbiB1dGlsaWVzIGFyZSBhIHNwZWNpYWwgY2FzZSBiZWNhdXNlCisgICAgICAgICMgdGhleSBleHBsaWNpdGVseSBzZXQgdGhlaXIgb3V0cHV0IHN0cmVhbXMgdG8gYmluYXJ5IG1vZGUsIHNvIHdlIGhhdmUKKyAgICAgICAgIyBub3RoaW5nIHRvIGRvLiBGb3IgYWxsIG90aGVycyBjb21tYW5kcywgd2UgaGF2ZSB0byBndWVzcyB3aGV0aGVyIHRoZXkKKyAgICAgICAgIyBhcmUgc2VuZGluZyB0ZXh0IGRhdGEsIGluIHdoaWNoIGNhc2UgdGhlIHRyYW5zZm9ybWF0aW9uIG11c3QgYmUgZG9uZS4KKyAgICAgICAgIyBBZ2FpbiwgdGhlIE5VTCBjaGFyYWN0ZXIgdGVzdCBpcyB1bnJlbGlhYmxlIGJ1dCBzaG91bGQgYmUgZW5vdWdoIGZvcgorICAgICAgICAjIGhnIHRlc3RzLgorICAgICAgICByZWRpcmVjdGVkID0gc3Rkb3V0LmZpbGVubygpPT1zdGRlcnIuZmlsZW5vKCkKKyAgICAgICAgaWYgbm90IHJlZGlyZWN0ZWQ6CisgICAgICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihbbmFtZV0gKyBhcmdzLCBjd2Q9ZW52WydQV0QnXSwgZW52PWV4ZWNfZW52LCAKKyAgICAgICAgICAgICAgICAgICAgc3RkaW49c3RkaW4sIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihbbmFtZV0gKyBhcmdzLCBjd2Q9ZW52WydQV0QnXSwgZW52PWV4ZWNfZW52LCAKKyAgICAgICAgICAgICAgICAgICAgc3RkaW49c3RkaW4sIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCkKKyAgICAgICAgb3V0LCBlcnIgPSBwLmNvbW11bmljYXRlKCkKKyAgICBleGNlcHQgV2luZG93c0Vycm9yIGFzIGU6CisgICAgICAgIHJhaXNlIFV0aWxpdHlFcnJvcihzdHIoZSkpCisKKyAgICBpZiBub3QgdW5peG91dHB1dDoKKyAgICAgICAgZGVmIGVuY29kZShzKToKKyAgICAgICAgICAgIGlmICdcMCcgaW4gczoKKyAgICAgICAgICAgICAgICByZXR1cm4gcworICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgnXHJcbicsICdcbicpCisgICAgZWxzZToKKyAgICAgICAgZW5jb2RlID0gbGFtYmRhIHM6IHMKKworICAgIGlmIHJld3JpdGVzbGFzaGVzKG5hbWUsIGFyZ3MpOgorICAgICAgICBlbmNvZGUxXyA9IGVuY29kZQorICAgICAgICBkZWYgZW5jb2RlKHMpOgorICAgICAgICAgICAgcyA9IGVuY29kZTFfKHMpCisgICAgICAgICAgICBzID0gcy5yZXBsYWNlKCdcXFxcJywgJ1xcJykKKyAgICAgICAgICAgIHMgPSBzLnJlcGxhY2UoJ1xcJywgJy8nKQorICAgICAgICAgICAgcmV0dXJuIHMKKworICAgIGlmIGlzaGc6CisgICAgICAgIGVuY29kZTJfID0gZW5jb2RlCisgICAgICAgIGRlZiBlbmNvZGUocyk6CisgICAgICAgICAgICByZXR1cm4gcmV3cml0ZWhnKGVuY29kZTJfKHMpKQorICAgIAorICAgIHN0ZG91dC53cml0ZShlbmNvZGUob3V0KSkKKyAgICBpZiBub3QgcmVkaXJlY3RlZDoKKyAgICAgICAgc3RkZXJyLndyaXRlKGVuY29kZShlcnIpKQorICAgIHJldHVybiBwLnJldHVybmNvZGUKKyAgICAgICAgICAgIApkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvcHlzaC9pbnRlcnAucHkgYi9iaXRiYWtlL2xpYi9iYi9weXNoL2ludGVycC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWQ4YzkyCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvcHlzaC9pbnRlcnAucHkKQEAgLTAsMCArMSwxMzY3IEBACisjIGludGVycC5weSAtIHNoZWxsIGludGVycHJldGVyIGZvciBweXNoLgorIworIyBDb3B5cmlnaHQgMjAwNyBQYXRyaWNrIE1lemFyZAorIworIyBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKyIiIkltcGxlbWVudCB0aGUgc2hlbGwgaW50ZXJwcmV0ZXIuCisKK01vc3QgcmVmZXJlbmNlcyBhcmUgbWFkZSB0byAiVGhlIE9wZW4gR3JvdXAgQmFzZSBTcGVjaWZpY2F0aW9ucyBJc3N1ZSA2Ii4KKzxodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDk2OTUzOTkvdXRpbGl0aWVzL3hjdV9jaGFwMDIuaHRtbD4KKyIiIgorIyBUT0RPOiBkb2N1bWVudCB0aGUgZmFjdCBpbnB1dCBzdHJlYW1zIG11c3QgaW1wbGVtZW50IGZpbGVubygpIHNvIFBvcGVuIHdpbGwgd29yayBjb3JyZWN0bHkuCisjIGl0IHJlcXVpcmVzIG5vbi1zdGRpbiBzdHJlYW0gdG8gYmUgaW1wbGVtZW50ZWQgYXMgZmlsZXMuIFN0aWxsIHRvIGJlIHRlc3RlZC4uLgorIyBET0M6IHBhdGhzZXAgaXMgdXNlZCBpbiBQQVRIIGluc3RlYWQgb2YgJzonLiBDbGVhcmx5LCB0aGVyZSBhcmUgcGF0aCBzeW50YXggaXNzdWVzIGhlcmUuCisjIFRPRE86IHN0b3AgY29tbWFuZCBleGVjdXRpb24gdXBvbiBlcnJvci4KKyMgVE9ETzogc29ydCBvdXQgdGhlIGZpbGVuYW1lL2lvX251bWJlciBtZXNzLiBJdCBzaG91bGQgYmUgcG9zc2libGUgdG8gdXNlIGZpbGVuYW1lcyBvbmx5LgorIyBUT0RPOiByZXZpZXcgc3Vic2hlbGwgaW1wbGVtZW50YXRpb24KKyMgVE9ETzogdGVzdCBlbnZpcm9ubWVudCBjbG9uaW5nIGZvciBub24tc3BlY2lhbCBidWlsdGlucworIyBUT0RPOiBzZXQgLXggc2hvdWxkIG5vdCByZWJ1aWxkIGNvbW1hbmRzIGZyb20gdG9rZW5zLCBhc3NpZ25tZW50cy9yZWRpcmVjdGlvbnMgYXJlIGxvc3QKKyMgVE9ETzogdW5pdCB0ZXN0IGZvciB2YXJpYWJsZSBhc3NpZ25tZW50CisjIFRPRE86IHRlc3QgZXJyb3IgbWFuYWdlbWVudCB3cnQgZXJyb3IgdHlwZS91dGlsaXR5IHR5cGUKKyMgVE9ETzogdGVzdCBmb3IgYmluYXJ5IG91dHB1dCBldmVyeXdoZXJlCisjIEJVRzogZGVidWctcGFyc2luZyBkb2VzIG5vdCBwYXNzIGxvZyBmaWxlIHRvIFBMWS4gTWF5YmUgYSBQTFkgdXBncmFkZSBpcyBuZWNlc3NhcnkuCitpbXBvcnQgYmFzZTY0CitpbXBvcnQgY1BpY2tsZSBhcyBwaWNrbGUKK2ltcG9ydCBlcnJubworaW1wb3J0IGdsb2IKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworaW1wb3J0IHRlbXBmaWxlCisKK3RyeToKKyAgICBzID0gc2V0KCkKKyAgICBkZWwgcworZXhjZXB0IE5hbWVFcnJvcjoKKyAgICBmcm9tIFNldCBpbXBvcnQgU2V0IGFzIHNldAorCitpbXBvcnQgYnVpbHRpbgorZnJvbSBzaGVycm9ycyBpbXBvcnQgKgoraW1wb3J0IHB5c2hsZXgKK2ltcG9ydCBweXNoeWFjYworCitkZWYgbWFwcGVuZChmdW5jLCAqYXJncywgKiprYXJncyk6CisgICAgIiIiTGlrZSBtYXAgYnV0IGFzc3VtZSBmdW5jIHJldHVybnMgYSBsaXN0LiBSZXR1cm5lZCBsaXN0cyBhcmUgbWVyZ2VkIGludG8KKyAgICBhIHNpbmdsZSBvbmUuCisgICAgIiIiCisgICAgcmV0dXJuIHJlZHVjZShsYW1iZGEgYSxiOiBhK2IsIG1hcChmdW5jLCAqYXJncywgKiprYXJncyksIFtdKQorCitjbGFzcyBGaWxlV3JhcHBlcjoKKyAgICAiIiJGaWxlIG9iamVjdCB3cmFwcGVyIHRvIGVhc2UgZGVidWdnaW5nLgorICAgIAorICAgIEFsbG93IG1vZGUgY2hlY2tpbmcgYW5kIGltcGxlbWVudCBmaWxlIGR1cGxpY2F0aW9uIHRocm91Z2ggYSBzaW1wbGUgCisgICAgcmVmZXJlbmNlIGNvdW50aW5nIHNjaGVtZS4gTm90IHN1cmUgdGhlIGxhdHRlciBpcyByZWFsbHkgdXNlZnVsIHNpbmNlCisgICAgb25seSByZWFsIGZpbGUgZGVzY3JpcHRvcnMgY2FuIGJlIHVzZWQuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZGUsIGZpbGUsIGNsb3NlPVRydWUpOgorICAgICAgICBpZiBtb2RlIG5vdCBpbiAoJ3InLCAndycsICdhJyk6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCdpbnZhbGlkIG1vZGU6ICVzJyAlIG1vZGUpCisgICAgICAgIHNlbGYuX21vZGUgPSBtb2RlCisgICAgICAgIHNlbGYuX2Nsb3NlID0gY2xvc2UKKyAgICAgICAgaWYgaXNpbnN0YW5jZShmaWxlLCBGaWxlV3JhcHBlcik6CisgICAgICAgICAgICBpZiBmaWxlLl9yZWZjb3VudFswXSA8PSAwOgorICAgICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoMCwgJ0Vycm9yJykKKyAgICAgICAgICAgIHNlbGYuX3JlZmNvdW50ID0gZmlsZS5fcmVmY291bnQKKyAgICAgICAgICAgIHNlbGYuX3JlZmNvdW50WzBdICs9IDEKKyAgICAgICAgICAgIHNlbGYuX2ZpbGUgPSBmaWxlLl9maWxlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9yZWZjb3VudCA9IFsxXQorICAgICAgICAgICAgc2VsZi5fZmlsZSA9IGZpbGUKKyAgICAgICAgCisgICAgZGVmIGR1cChzZWxmKToKKyAgICAgICAgcmV0dXJuIEZpbGVXcmFwcGVyKHNlbGYuX21vZGUsIHNlbGYsIHNlbGYuX2Nsb3NlKQorICAgICAgICAKKyAgICBkZWYgZmlsZW5vKHNlbGYpOgorICAgICAgICAiIiJmaWxlbm8oKSBzaG91bGQgYmUgb25seSBuZWNlc3NhcnkgZm9yIGlucHV0IHN0cmVhbXMuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9maWxlLmZpbGVubygpCisgICAgICAgIAorICAgIGRlZiByZWFkKHNlbGYsIHNpemU9LTEpOgorICAgICAgICBpZiBzZWxmLl9tb2RlIT0ncic6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yKDAsICdFcnJvcicpCisgICAgICAgIHJldHVybiBzZWxmLl9maWxlLnJlYWQoc2l6ZSkKKyAgICAgICAgCisgICAgZGVmIHJlYWRsaW5lcyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fZmlsZS5yZWFkbGluZXMoKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICAKKyAgICBkZWYgd3JpdGUoc2VsZiwgcyk6CisgICAgICAgIGlmIHNlbGYuX21vZGUgbm90IGluICgndycsICdhJyk6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yKDAsICdFcnJvcicpCisgICAgICAgIHJldHVybiBzZWxmLl9maWxlLndyaXRlKHMpCisgICAgICAgIAorICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgc2VsZi5fZmlsZS5mbHVzaCgpCisgICAgICAgIAorICAgIGRlZiBjbG9zZShzZWxmKTogICAgICAgIAorICAgICAgICBpZiBub3Qgc2VsZi5fcmVmY291bnQ6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgYXNzZXJ0ICBzZWxmLl9yZWZjb3VudFswXSA+IDAKKyAgICAgICAgCisgICAgICAgIHNlbGYuX3JlZmNvdW50WzBdIC09IDEgICAgCisgICAgICAgIGlmIHNlbGYuX3JlZmNvdW50WzBdID09IDA6CisgICAgICAgICAgICBzZWxmLl9tb2RlID0gJ2MnCisgICAgICAgICAgICBpZiBzZWxmLl9jbG9zZToKKyAgICAgICAgICAgICAgICBzZWxmLl9maWxlLmNsb3NlKCkKKyAgICAgICAgc2VsZi5fcmVmY291bnQgPSBOb25lCisgICAgICAgICAgICAgICAgCisgICAgZGVmIG1vZGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9tb2RlCisKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CisgICAgICAgIGlmIG5hbWUgPT0gJ25hbWUnOgorICAgICAgICAgICAgc2VsZi5uYW1lID0gZ2V0YXR0cihzZWxmLl9maWxlLCBuYW1lKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IobmFtZSkKKworICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICBzZWxmLmNsb3NlKCkKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgCitkZWYgd2luMzJfb3Blbl9kZXZudWxsKG1vZGUpOgorICAgIHJldHVybiBvcGVuKCdOVUwnLCBtb2RlKQorICAgIAorICAgICAgICAKK2NsYXNzIFJlZGlyZWN0aW9uczoKKyAgICAiIiJTdG9yZXMgb3BlbiBmaWxlcyBhbmQgdGhlaXIgbWFwcGluZyB0byBwc2V1ZG8tc2ggZmlsZSBkZXNjcmlwdG9yLgorICAgICIiIgorICAgICMgQlVHOiByZWRpcmVjdGlvbnMgYXJlIG5vdCBoYW5kbGVkIGNvcnJlY3RseTogMT4mMyAyPiYzIDM+JjQgZG9lcyAKKyAgICAjIG5vdCBtYWtlIDEgdG8gcmVkaXJlY3QgdG8gNAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdGRpbj1Ob25lLCBzdGRvdXQ9Tm9uZSwgc3RkZXJyPU5vbmUpOgorICAgICAgICBzZWxmLl9kZXNjcmlwdG9ycyA9IHt9CisgICAgICAgIGlmIHN0ZGluIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5fYWRkX2Rlc2NyaXB0b3IoMCwgc3RkaW4pCisgICAgICAgIGlmIHN0ZG91dCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX2FkZF9kZXNjcmlwdG9yKDEsIHN0ZG91dCkKKyAgICAgICAgaWYgc3RkZXJyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5fYWRkX2Rlc2NyaXB0b3IoMiwgc3RkZXJyKQorICAgICAgICAgICAgCisgICAgZGVmIGFkZF9oZXJlX2RvY3VtZW50KHNlbGYsIGludGVycCwgbmFtZSwgY29udGVudCwgaW9fbnVtYmVyPU5vbmUpOgorICAgICAgICBpZiBpb19udW1iZXIgaXMgTm9uZToKKyAgICAgICAgICAgIGlvX251bWJlciA9IDAKKyAgICAgICAgICAgIAorICAgICAgICBpZiBuYW1lPT1weXNobGV4LnVucXVvdGVfd29yZHRyZWUobmFtZSk6CisgICAgICAgICAgICBjb250ZW50ID0gaW50ZXJwLmV4cGFuZF9oZXJlX2RvY3VtZW50KCgnVE9LRU4nLCBjb250ZW50KSkKKyAgICAKKyAgICAgICAgIyBXcml0ZSBkb2N1bWVudCBjb250ZW50IGluIGEgdGVtcG9yYXJ5IGZpbGUKKyAgICAgICAgdG1wID0gdGVtcGZpbGUuVGVtcG9yYXJ5RmlsZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRtcC53cml0ZShjb250ZW50KQorICAgICAgICAgICAgdG1wLmZsdXNoKCkKKyAgICAgICAgICAgIHRtcC5zZWVrKDApCisgICAgICAgICAgICBzZWxmLl9hZGRfZGVzY3JpcHRvcihpb19udW1iZXIsIEZpbGVXcmFwcGVyKCdyJywgdG1wKSkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgdG1wLmNsb3NlKCkKKyAgICAgICAgICAgIHJhaXNlICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICBkZWYgYWRkKHNlbGYsIGludGVycCwgb3AsIGZpbGVuYW1lLCBpb19udW1iZXI9Tm9uZSk6CisgICAgICAgIGlmIG9wIG5vdCBpbiAoJzwnLCAnPicsICc+fCcsICc+PicsICc+JicpOgorICAgICAgICAgICAgIyBUT0RPOiBhZGQgZGVzY3JpcHRvciBkdXBsaWNhdGlvbiBhbmQgaGVyZV9kb2N1bWVudHMgICAgICAKKyAgICAgICAgICAgIHJhaXNlIFJlZGlyZWN0aW9uRXJyb3IoJ1Vuc3VwcG9ydGVkIHJlZGlyZWN0aW9uIG9wZXJhdG9yICIlcyInICUgb3ApCisgICAgICAgICAgICAKKyAgICAgICAgaWYgaW9fbnVtYmVyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaW9fbnVtYmVyID0gaW50KGlvX251bWJlcikKKyAgICAgICAgICAgIAorICAgICAgICBpZiAob3AgPT0gJz4mJyBhbmQgZmlsZW5hbWUuaXNkaWdpdCgpKSBvciBmaWxlbmFtZT09Jy0nOgorICAgICAgICAgICAgIyBObyBleHBhbnNpb24gZm9yIGZpbGUgZGVzY3JpcHRvcnMsIHF1b3RlIHRoZW0gaWYgeW91IHdhbnQgYSBmaWxlbmFtZQorICAgICAgICAgICAgZnVsbG5hbWUgPSBmaWxlbmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgZmlsZW5hbWUuc3RhcnRzd2l0aCgnLycpOgorICAgICAgICAgICAgICAgICMgVE9ETzogd2luMzIga2x1ZGdlCisgICAgICAgICAgICAgICAgaWYgZmlsZW5hbWU9PScvZGV2L251bGwnOgorICAgICAgICAgICAgICAgICAgICBmdWxsbmFtZSA9ICdOVUwnCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyBUT0RPOiBoYW5kbGUgYWJzb2x1dGUgcGF0aG5hbWVzLCB0aGV5IGFyZSB1bmxpa2VseSB0byBleGlzdCBvbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgIyBjdXJyZW50IHBsYXRmb3JtICh3aW4zMiBmb3IgaW5zdGFuY2UpLgorICAgICAgICAgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZnVsbG5hbWUgPSBpbnRlcnAuZXhwYW5kX3JlZGlyZWN0aW9uKCgnVE9LRU4nLCBmaWxlbmFtZSkpCisgICAgICAgICAgICAgICAgaWYgbm90IGZ1bGxuYW1lOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBSZWRpcmVjdGlvbkVycm9yKCclczogYW1iaWd1b3VzIHJlZGlyZWN0JyAlIGZpbGVuYW1lKQorICAgICAgICAgICAgICAgICMgQnVpbGQgYWJzb2x1dGUgcGF0aCBiYXNlZCBvbiBQV0QKKyAgICAgICAgICAgICAgICBmdWxsbmFtZSA9IG9zLnBhdGguam9pbihpbnRlcnAuZ2V0X2VudigpWydQV0QnXSwgZnVsbG5hbWUpCisgICAgICAgICAgICAKKyAgICAgICAgaWYgb3A9PSc8JzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9hZGRfaW5wdXRfcmVkaXJlY3Rpb24oaW50ZXJwLCBmdWxsbmFtZSwgaW9fbnVtYmVyKQorICAgICAgICBlbGlmIG9wIGluICgnPicsICc+fCcpOgorICAgICAgICAgICAgY2xvYmJlciA9ICgnPnwnPT1vcCkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9hZGRfb3V0cHV0X3JlZGlyZWN0aW9uKGludGVycCwgZnVsbG5hbWUsIGlvX251bWJlciwgY2xvYmJlcikKKyAgICAgICAgZWxpZiBvcD09Jz4+JzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9hZGRfb3V0cHV0X2FwcGVuZGluZyhpbnRlcnAsIGZ1bGxuYW1lLCBpb19udW1iZXIpCisgICAgICAgIGVsaWYgb3A9PSc+Jic6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZHVwX291dHB1dF9kZXNjcmlwdG9yKGZ1bGxuYW1lLCBpb19udW1iZXIpCisgICAgICAgIAorICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fZGVzY3JpcHRvcnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBmb3IgZGVzYyBpbiBzZWxmLl9kZXNjcmlwdG9ycy5pdGVydmFsdWVzKCk6CisgICAgICAgICAgICAgICAgZGVzYy5mbHVzaCgpCisgICAgICAgICAgICAgICAgZGVzYy5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLl9kZXNjcmlwdG9ycyA9IE5vbmUKKyAgICAgICAgICAgIAorICAgIGRlZiBzdGRpbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2Rlc2NyaXB0b3JzWzBdCisgICAgICAgICAgCisgICAgZGVmIHN0ZG91dChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2Rlc2NyaXB0b3JzWzFdIAorICAgICAgICAKKyAgICBkZWYgc3RkZXJyKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZGVzY3JpcHRvcnNbMl0gCisgICAgICAgICAgICAKKyAgICBkZWYgY2xvbmUoc2VsZik6CisgICAgICAgIGNsb25lID0gUmVkaXJlY3Rpb25zKCkKKyAgICAgICAgZm9yIGRlc2MsIGZpbGVvYmogaW4gc2VsZi5fZGVzY3JpcHRvcnMuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICBjbG9uZS5fZGVzY3JpcHRvcnNbZGVzY10gPSBmaWxlb2JqLmR1cCgpCisgICAgICAgIHJldHVybiBjbG9uZQorICAgICAgICAgICAKKyAgICBkZWYgX2FkZF9vdXRwdXRfcmVkaXJlY3Rpb24oc2VsZiwgaW50ZXJwLCBmaWxlbmFtZSwgaW9fbnVtYmVyLCBjbG9iYmVyKTogICAgCisgICAgICAgIGlmIGlvX251bWJlciBpcyBOb25lOgorICAgICAgICAgICAgIyBpb19udW1iZXIgZGVmYXVsdCB0byBzdGFuZGFyZCBvdXRwdXQKKyAgICAgICAgICAgIGlvX251bWJlciA9IDEKKyAgICAgICAgCisgICAgICAgIGlmIG5vdCBjbG9iYmVyIGFuZCBpbnRlcnAuZ2V0X2VudigpLmhhc19vcHQoJy1DJykgYW5kIG9zLnBhdGguaXNmaWxlKGZpbGVuYW1lKToKKyAgICAgICAgICAgICMgRmlsZSBhbHJlYWR5IGV4aXN0IGluIG5vLWNsb2JiZXIgbW9kZSwgYmFpbCBvdXQKKyAgICAgICAgICAgIHJhaXNlIFJlZGlyZWN0aW9uRXJyb3IoJ0ZpbGUgIiVzIiBhbHJlYWR5IGV4aXN0cycgJSBmaWxlbmFtZSkKKyAgICAgICAgICAgIAorICAgICAgICAjIE9wZW4gYW5kIHJlZ2lzdGVyCisgICAgICAgIHNlbGYuX2FkZF9maWxlX2Rlc2NyaXB0b3IoaW9fbnVtYmVyLCBmaWxlbmFtZSwgJ3cnKQorICAgICAgICAKKyAgICBkZWYgX2FkZF9vdXRwdXRfYXBwZW5kaW5nKHNlbGYsIGludGVycCwgZmlsZW5hbWUsIGlvX251bWJlcik6ICAgIAorICAgICAgICBpZiBpb19udW1iZXIgaXMgTm9uZToKKyAgICAgICAgICAgIGlvX251bWJlciA9IDEKKyAgICAgICAgc2VsZi5fYWRkX2ZpbGVfZGVzY3JpcHRvcihpb19udW1iZXIsIGZpbGVuYW1lLCAnYScpCisgICAgICAgICAgICAKKyAgICBkZWYgX2FkZF9pbnB1dF9yZWRpcmVjdGlvbihzZWxmLCBpbnRlcnAsIGZpbGVuYW1lLCBpb19udW1iZXIpOgorICAgICAgICBpZiBpb19udW1iZXIgaXMgTm9uZToKKyAgICAgICAgICAgIGlvX251bWJlciA9IDAKKyAgICAgICAgc2VsZi5fYWRkX2ZpbGVfZGVzY3JpcHRvcihpb19udW1iZXIsIGZpbGVuYW1lLCAncicpCisgICAgICAgIAorICAgIGRlZiBfYWRkX2ZpbGVfZGVzY3JpcHRvcihzZWxmLCBpb19udW1iZXIsIGZpbGVuYW1lLCBtb2RlKTogICAgCisgICAgICAgIHRyeTogICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIGZpbGVuYW1lLnN0YXJ0c3dpdGgoJy8nKToKKyAgICAgICAgICAgICAgICBpZiBmaWxlbmFtZT09Jy9kZXYvbnVsbCc6CisgICAgICAgICAgICAgICAgICAgIGYgPSB3aW4zMl9vcGVuX2Rldm51bGwobW9kZSsnYicpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyBUT0RPOiBoYW5kbGUgYWJzb2x1dGUgcGF0aG5hbWVzLCB0aGV5IGFyZSB1bmxpa2VseSB0byBleGlzdCBvbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgIyBjdXJyZW50IHBsYXRmb3JtICh3aW4zMiBmb3IgaW5zdGFuY2UpLgorICAgICAgICAgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdjYW5ub3Qgb3BlbiBhYnNvbHV0ZSBwYXRoICVzJyAlIHJlcHIoZmlsZW5hbWUpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmID0gZmlsZShmaWxlbmFtZSwgbW9kZSsnYicpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGU6CisgICAgICAgICAgICByYWlzZSBSZWRpcmVjdGlvbkVycm9yKHN0cihlKSkKKyAgICAgICAgICAgIAorICAgICAgICB3cmFwcGVyID0gTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3cmFwcGVyID0gRmlsZVdyYXBwZXIobW9kZSwgZikKKyAgICAgICAgICAgIGYgPSBOb25lCisgICAgICAgICAgICBzZWxmLl9hZGRfZGVzY3JpcHRvcihpb19udW1iZXIsIHdyYXBwZXIpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGlmIGY6IGYuY2xvc2UoKQorICAgICAgICAgICAgaWYgd3JhcHBlcjogd3JhcHBlci5jbG9zZSgpCisgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgCisgICAgZGVmIF9kdXBfb3V0cHV0X2Rlc2NyaXB0b3Ioc2VsZiwgc291cmNlX2ZkLCBkZXN0X2ZkKToKKyAgICAgICAgaWYgc291cmNlX2ZkIGlzIE5vbmU6CisgICAgICAgICAgICBzb3VyY2VfZmQgPSAxCisgICAgICAgIHNlbGYuX2R1cF9maWxlX2Rlc2NyaXB0b3Ioc291cmNlX2ZkLCBkZXN0X2ZkLCAndycpCisgICAgICAgICAgICAKKyAgICBkZWYgX2R1cF9maWxlX2Rlc2NyaXB0b3Ioc2VsZiwgc291cmNlX2ZkLCBkZXN0X2ZkLCBtb2RlKToKKyAgICAgICAgc291cmNlX2ZkID0gaW50KHNvdXJjZV9mZCkKKyAgICAgICAgaWYgc291cmNlX2ZkIG5vdCBpbiBzZWxmLl9kZXNjcmlwdG9yczoKKyAgICAgICAgICAgIHJhaXNlIFJlZGlyZWN0aW9uRXJyb3IoJyIlcyIgaXMgbm90IGEgdmFsaWQgZmlsZSBkZXNjcmlwdG9yJyAlIHN0cihzb3VyY2VfZmQpKQorICAgICAgICBzb3VyY2UgPSBzZWxmLl9kZXNjcmlwdG9yc1tzb3VyY2VfZmRdCisgICAgICAgIAorICAgICAgICBpZiBzb3VyY2UubW9kZSgpIT1tb2RlOgorICAgICAgICAgICAgcmFpc2UgUmVkaXJlY3Rpb25FcnJvcignRGVzY3JpcHRvciAlcyBjYW5ub3QgYmUgZHVwbGljYXRlZCBpbiBtb2RlICIlcyInICUgKHN0cihzb3VyY2UpLCBtb2RlKSkKKyAgICAgICAgCisgICAgICAgIGlmIGRlc3RfZmQ9PSctJzoKKyAgICAgICAgICAgICMgQ2xvc2UgdGhlIHNvdXJjZSBkZXNjcmlwdG9yCisgICAgICAgICAgICBkZWwgc2VsZi5fZGVzY3JpcHRvcnNbc291cmNlX2ZkXQorICAgICAgICAgICAgc291cmNlLmNsb3NlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRlc3RfZmQgPSBpbnQoZGVzdF9mZCkKKyAgICAgICAgICAgIGlmIGRlc3RfZmQgbm90IGluIHNlbGYuX2Rlc2NyaXB0b3JzOgorICAgICAgICAgICAgICAgIHJhaXNlIFJlZGlyZWN0aW9uRXJyb3IoJ0Nhbm5vdCByZXBsYWNlIGZpbGUgZGVzY3JpcHRvciAlcycgJSBzdHIoZGVzdF9mZCkpCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBkZXN0ID0gc2VsZi5fZGVzY3JpcHRvcnNbZGVzdF9mZF0KKyAgICAgICAgICAgIGlmIGRlc3QubW9kZSgpIT1tb2RlOgorICAgICAgICAgICAgICAgIHJhaXNlIFJlZGlyZWN0aW9uRXJyb3IoJ0Rlc2NyaXB0b3IgJXMgY2Fubm90IGJlIGNhbm5vdCBiZSByZWRpcmVjdGVkIGluIG1vZGUgIiVzIicgJSAoc3RyKGRlc3QpLCBtb2RlKSkKKyAgICAgICAgICAgIAorICAgICAgICAgICAgc2VsZi5fZGVzY3JpcHRvcnNbZGVzdF9mZF0gPSBzb3VyY2UuZHVwKCkKKyAgICAgICAgICAgIGRlc3QuY2xvc2UoKSAgICAgICAgCisgICAgICAgICAgICAKKyAgICBkZWYgX2FkZF9kZXNjcmlwdG9yKHNlbGYsIGlvX251bWJlciwgZmlsZSk6CisgICAgICAgIGlvX251bWJlciA9IGludChpb19udW1iZXIpCisgICAgICAgIAorICAgICAgICBpZiBpb19udW1iZXIgaW4gc2VsZi5fZGVzY3JpcHRvcnM6CisgICAgICAgICAgICAjIENsb3NlIHRoZSBjdXJyZW50IGRlc2NyaXB0b3IKKyAgICAgICAgICAgIGQgPSBzZWxmLl9kZXNjcmlwdG9yc1tpb19udW1iZXJdCisgICAgICAgICAgICBkZWwgc2VsZi5fZGVzY3JpcHRvcnNbaW9fbnVtYmVyXQorICAgICAgICAgICAgZC5jbG9zZSgpCisgICAgICAgICAgICAKKyAgICAgICAgc2VsZi5fZGVzY3JpcHRvcnNbaW9fbnVtYmVyXSA9IGZpbGUKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICBuYW1lcyA9IFsoJyVkPSVyJyAlIChrLCBnZXRhdHRyKHYsICduYW1lJywgTm9uZSkpKSBmb3Igayx2CisgICAgICAgICAgICAgICAgIGluIHNlbGYuX2Rlc2NyaXB0b3JzLml0ZXJpdGVtcygpXQorICAgICAgICBuYW1lcyA9ICcsJy5qb2luKG5hbWVzKQorICAgICAgICByZXR1cm4gJ1JlZGlyZWN0aW9ucyglcyknICUgbmFtZXMKKworICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICBzZWxmLmNsb3NlKCkKKyAgICAKK2RlZiBjeWd3aW5fdG9fd2luZG93c19wYXRoKHBhdGgpOgorICAgICIiIlR1cm4gL2N5Z2RyaXZlL2MvZm9vIGludG8gYzovZm9vLCBvciByZXR1cm4gcGF0aCBpZiBpdAorICAgIGlzIG5vdCBhIGN5Z3dpbiBwYXRoLgorICAgICIiIgorICAgIGlmIG5vdCBwYXRoLnN0YXJ0c3dpdGgoJy9jeWdkcml2ZS8nKToKKyAgICAgICAgcmV0dXJuIHBhdGgKKyAgICBwYXRoID0gcGF0aFtsZW4oJy9jeWdkcml2ZS8nKTpdCisgICAgcGF0aCA9IHBhdGhbOjFdICsgJzonICsgcGF0aFsxOl0KKyAgICByZXR1cm4gcGF0aAorICAgIAorZGVmIHdpbjMyX3RvX3VuaXhfcGF0aChwYXRoKToKKyAgICBpZiBwYXRoIGlzIG5vdCBOb25lOgorICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKCdcXCcsICcvJykKKyAgICByZXR1cm4gcGF0aCAgICAKKyAgICAKK19SRV9TSEVCQU5HID0gcmUuY29tcGlsZShyJ15cIyFccz8oW15cc10rKSg/OlxzKFteXHNdKykpPycpCitfU0hFQkFOR19DTURTID0geworICAgICcvdXNyL2Jpbi9lbnYnOiAnZW52JywKKyAgICAnL2Jpbi9zaCc6ICdweXNoJywKKyAgICAncHl0aG9uJzogJ3B5dGhvbicsCit9CisgICAgCitkZWYgcmVzb2x2ZV9zaGViYW5nKHBhdGgsIGlnbm9yZXNoZWxsPUZhbHNlKToKKyAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGFyZ3VtZW50cyBhcyBzaGViYW5nIGludGVycHJldGVyIGNhbGwgb3IgYW4gZW1wdHkgbGlzdAorICAgIGlmIHBhdGggZG9lcyBub3QgcmVmZXIgdG8gYW4gZXhlY3V0YWJsZSBzY3JpcHQuCisgICAgU2VlIDxodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvYXVzdGluL2RvY3MvYXVzdGluXzUxcjIudHh0Pi4KKyAgICAKKyAgICBpZ25vcmVzaGVsbCAtIHNldCB0byBUcnVlIHRvIGlnbm9yZSBzaCBzaGViYW5ncy4gUmV0dXJuIGFuIGVtcHR5IGxpc3QgaW5zdGVhZC4KKyAgICAiIiIKKyAgICB0cnk6CisgICAgICAgIGYgPSBmaWxlKHBhdGgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgQXQgbW9zdCA4MCBjaGFyYWN0ZXJzIGluIHRoZSBmaXJzdCBsaW5lCisgICAgICAgICAgICBoZWFkZXIgPSBmLnJlYWQoODApLnNwbGl0bGluZXMoKVswXQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICAKKyAgICAgICAgbSA9IF9SRV9TSEVCQU5HLnNlYXJjaChoZWFkZXIpCisgICAgICAgIGlmIG5vdCBtOgorICAgICAgICAgICAgcmV0dXJuIFtdCisgICAgICAgIGNtZCwgYXJnID0gbS5ncm91cCgxLDIpCisgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGNtZCk6CisgICAgICAgICAgICAjIEtlZXAgdGhpcyBvbmUsIHRoZSBoZyBzY3JpcHQgZm9yIGluc3RhbmNlIGNvbnRhaW5zIGEgd2VpcmQgd2luZG93cworICAgICAgICAgICAgIyBzaGViYW5nIHJlZmVyZW5jaW5nIHRoZSBjdXJyZW50IHB5dGhvbiBpbnN0YWxsLgorICAgICAgICAgICAgY21kZmlsZSA9IG9zLnBhdGguYmFzZW5hbWUoY21kKS5sb3dlcigpCisgICAgICAgICAgICBpZiBjbWRmaWxlID09ICdweXRob24uZXhlJzoKKyAgICAgICAgICAgICAgICBjbWQgPSAncHl0aG9uJworICAgICAgICAgICAgcGFzcworICAgICAgICBlbGlmIGNtZCBub3QgaW4gX1NIRUJBTkdfQ01EUzoKKyAgICAgICAgICAgIHJhaXNlIENvbW1hbmROb3RGb3VuZCgnVW5rbm93biBpbnRlcnByZXRlciAiJXMiIHJlZmVyZW5jZWQgaW4gJ1wKKyAgICAgICAgICAgICAgICAnc2hlYmFuZycgJSBoZWFkZXIpCisgICAgICAgIGNtZCA9IF9TSEVCQU5HX0NNRFMuZ2V0KGNtZCkKKyAgICAgICAgaWYgY21kIGlzIE5vbmUgb3IgKGlnbm9yZXNoZWxsIGFuZCBjbWQgPT0gJ3B5c2gnKToKKyAgICAgICAgICAgIHJldHVybiBbXQorICAgICAgICBpZiBhcmcgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBbY21kLCB3aW4zMl90b191bml4X3BhdGgocGF0aCldCisgICAgICAgIHJldHVybiBbY21kLCBhcmcsIHdpbjMyX3RvX3VuaXhfcGF0aChwYXRoKV0KKyAgICBleGNlcHQgSU9FcnJvciBhcyBlOgorICAgICAgICBpZiAgZS5lcnJubyE9ZXJybm8uRU5PRU5UIGFuZCBcCisgICAgICAgICAgICAoZS5lcnJubyE9ZXJybm8uRVBFUk0gYW5kIG5vdCBvcy5wYXRoLmlzZGlyKHBhdGgpKTogIyBPcGVuaW5nIGEgZGlyZWN0b3J5IHJhaXNlcyBFUEVSTQorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgcmV0dXJuIFtdCisgICAgICAgIAorZGVmIHdpbjMyX2ZpbmRfaW5fcGF0aChuYW1lLCBwYXRoKToKKyAgICBpZiBpc2luc3RhbmNlKHBhdGgsIHN0cik6CisgICAgICAgIHBhdGggPSBwYXRoLnNwbGl0KG9zLnBhdGhzZXApCisgICAgICAgIAorICAgIGV4dHMgPSBvcy5lbnZpcm9uLmdldCgnUEFUSEVYVCcsICcnKS5sb3dlcigpLnNwbGl0KG9zLnBhdGhzZXApCisgICAgZm9yIHAgaW4gcGF0aDoKKyAgICAgICAgcF9uYW1lID0gb3MucGF0aC5qb2luKHAsIG5hbWUpCisgICAgICAgIAorICAgICAgICBwcmVmaXggPSByZXNvbHZlX3NoZWJhbmcocF9uYW1lKQorICAgICAgICBpZiBwcmVmaXg6CisgICAgICAgICAgICByZXR1cm4gcHJlZml4CisgICAgICAgICAgICAKKyAgICAgICAgZm9yIGV4dCBpbiBleHRzOiAgICAKKyAgICAgICAgICAgIHBfbmFtZV9leHQgPSBwX25hbWUgKyBleHQKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBfbmFtZV9leHQpOgorICAgICAgICAgICAgICAgIHJldHVybiBbd2luMzJfdG9fdW5peF9wYXRoKHBfbmFtZV9leHQpXQorICAgIHJldHVybiBbXQorCitjbGFzcyBUcmFwcyhkaWN0KToKKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6CisgICAgICAgIGlmIGtleSBub3QgaW4gKCdFWElUJywpOgorICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCisgICAgICAgIHN1cGVyKFRyYXBzLCBzZWxmKS5fX3NldGl0ZW1fXyhrZXksIHZhbHVlKQorCisjIElGUyB3aGl0ZSBzcGFjZXMgY2hhcmFjdGVyIGNsYXNzCitfSUZTX1dISVRFU1BBQ0VTID0gKCcgJywgJ1x0JywgJ1xuJykKKworY2xhc3MgRW52aXJvbm1lbnQ6CisgICAgIiIiRW52aXJvbm1lbnQgaG9sZHMgZW52aXJvbm1lbnQgdmFyaWFibGVzLCBleHBvcnQgdGFibGUsIGZ1bmN0aW9uIAorICAgIGRlZmluaXRpb25zIGFuZCB3aGF0ZXZlciBpcyBkZWZpbmVkIGluIDIuMTIgIlNoZWxsIEV4ZWN1dGlvbiBFbnZpcm9ubWVudCIsCisgICAgcmVkaXJlY3Rpb24gZXhjZXB0ZWQuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHB3ZCk6CisgICAgICAgIHNlbGYuX29wdCA9IHNldCgpICAgICAgICNTaGVsbCBvcHRpb25zCisgICAgICAgIAorICAgICAgICBzZWxmLl9mdW5jdGlvbnMgPSB7fSAgICAgICAgCisgICAgICAgIHNlbGYuX2VudiA9IHsnPyc6ICcwJywgJyMnOiAnMCd9CisgICAgICAgIHNlbGYuX2V4cG9ydGVkID0gc2V0KFsKKyAgICAgICAgICAgICdIT01FJywgJ0lGUycsICdQQVRIJworICAgICAgICBdKQorICAgICAgICAKKyAgICAgICAgIyBTZXQgZW52aXJvbm1lbnQgdmFycyB3aXRoIHNpZGUtZWZmZWN0cworICAgICAgICBzZWxmLl9pZnNfd3MgPSBOb25lICAgICAjIFNldCBvZiBJRlMgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzCisgICAgICAgIHNlbGYuX2lmc19yZSA9IE5vbmUgICAgICMgUmVndWxhciBleHByZXNzaW9uIHVzZWQgdG8gc3BsaXQgYmV0d2VlbiB3b3JkcyB1c2luZyBJRlMgY2xhc3NlcworICAgICAgICBzZWxmWydJRlMnXSA9ICcnLmpvaW4oX0lGU19XSElURVNQQUNFUykgI0RlZmF1bHQgZW52aXJvbm1lbnQgdmFsdWVzCisgICAgICAgIHNlbGZbJ1BXRCddID0gcHdkCisgICAgICAgIHNlbGYudHJhcHMgPSBUcmFwcygpCisgICAgICAgIAorICAgIGRlZiBjbG9uZShzZWxmLCBzdWJzaGVsbD1GYWxzZSk6CisgICAgICAgIGVudiA9IEVudmlyb25tZW50KHNlbGZbJ1BXRCddKQorICAgICAgICBlbnYuX29wdCA9IHNldChzZWxmLl9vcHQpCisgICAgICAgIGZvciBrLHYgaW4gc2VsZi5nZXRfdmFyaWFibGVzKCkuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICBpZiBrIGluIHNlbGYuX2V4cG9ydGVkOgorICAgICAgICAgICAgICAgIGVudi5leHBvcnQoayx2KQorICAgICAgICAgICAgZWxpZiBzdWJzaGVsbDoKKyAgICAgICAgICAgICAgICBlbnZba10gPSB2CisgICAgICAgICAgICAgICAgCisgICAgICAgIGlmIHN1YnNoZWxsOgorICAgICAgICAgICAgZW52Ll9mdW5jdGlvbnMgPSBkaWN0KHNlbGYuX2Z1bmN0aW9ucykKKyAgICAgICAgICAgIAorICAgICAgICByZXR1cm4gZW52ICAgICAgICAKKyAgICAgICAgCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgIGlmIGtleSBpbiAoJ0AnLCAnKicsICctJywgJyQnKToKKyAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJyVzIGlzIG5vdCBpbXBsZW1lbnRlZCcgJSByZXByKGtleSkpCisgICAgICAgIHJldHVybiBzZWxmLl9lbnZba2V5XQorICAgICAgICAKKyAgICBkZWYgZ2V0KHNlbGYsIGtleSwgZGVmdmFsPU5vbmUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZltrZXldCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBkZWZ2YWwKKyAgICAgICAgCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgorICAgICAgICBpZiBrZXk9PSdJRlMnOgorICAgICAgICAgICAgIyBVcGRhdGUgdGhlIHdoaXRlc3BhY2Uvbm9uLXdoaXRlc3BhY2UgY2xhc3NlcworICAgICAgICAgICAgc2VsZi5fdXBkYXRlX2lmcyh2YWx1ZSkKKyAgICAgICAgZWxpZiBrZXk9PSdQV0QnOgorICAgICAgICAgICAgcHdkID0gb3MucGF0aC5hYnNwYXRoKHZhbHVlKQorICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIocHdkKToKKyAgICAgICAgICAgICAgICByYWlzZSBWYXJBc3NpZ25tZW50RXJyb3IoJ0ludmFsaWQgZGlyZWN0b3J5ICVzJyAlIHZhbHVlKQorICAgICAgICAgICAgdmFsdWUgPSBwd2QKKyAgICAgICAgZWxpZiBrZXkgaW4gKCc/JywgJyEnKToKKyAgICAgICAgICAgIHZhbHVlID0gc3RyKGludCh2YWx1ZSkpCisgICAgICAgIHNlbGYuX2VudltrZXldID0gdmFsdWUKKyAgICAgICAgCisgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgIGlmIGtleSBpbiAoJ0lGUycsICdQV0QnLCAnPycpOgorICAgICAgICAgICAgcmFpc2UgVmFyQXNzaWdubWVudEVycm9yKCclcyBjYW5ub3QgYmUgdW5zZXQnICUga2V5KQorICAgICAgICBkZWwgc2VsZi5fZW52W2tleV0KKworICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgaXRlbSk6CisgICAgICAgIHJldHVybiBpdGVtIGluIHNlbGYuX2VudgorICAgICAgICAKKyAgICBkZWYgc2V0X3Bvc2l0aW9uYWxfYXJncyhzZWxmLCBhcmdzKToKKyAgICAgICAgIiIiU2V0IHRoZSBjb250ZW50IG9mICdhcmdzJyBhcyBwb3NpdGlvbmFsIGFyZ3VtZW50IGZyb20gMSB0byBsZW4oYXJncykuCisgICAgICAgIFJldHVybiBwcmV2aW91cyBhcmd1bWVudCBhcyBhIGxpc3Qgb2Ygc3RyaW5ncy4KKyAgICAgICAgIiIiCisgICAgICAgICMgU2F2ZSBhbmQgcmVtb3ZlIHByZXZpb3VzIGFyZ3VtZW50cworICAgICAgICBwcmV2YXJncyA9IFtdICAgICAgICAKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKGludChzZWxmLl9lbnZbJyMnXSkpOgorICAgICAgICAgICAgaSA9IHN0cihpKzEpCisgICAgICAgICAgICBwcmV2YXJncy5hcHBlbmQoc2VsZi5fZW52W2ldKQorICAgICAgICAgICAgZGVsIHNlbGYuX2VudltpXQorICAgICAgICBzZWxmLl9lbnZbJyMnXSA9ICcwJworICAgICAgICAgICAgICAgIAorICAgICAgICAjU2V0IG5ldyBvbmVzCisgICAgICAgIGZvciBpLGFyZyBpbiBlbnVtZXJhdGUoYXJncyk6CisgICAgICAgICAgICBzZWxmLl9lbnZbc3RyKGkrMSldID0gc3RyKGFyZykKKyAgICAgICAgc2VsZi5fZW52WycjJ10gPSBzdHIobGVuKGFyZ3MpKQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIHByZXZhcmdzCisgICAgICAgIAorICAgIGRlZiBnZXRfcG9zaXRpb25hbF9hcmdzKHNlbGYpOgorICAgICAgICByZXR1cm4gW3NlbGYuX2VudltzdHIoaSsxKV0gZm9yIGkgaW4geHJhbmdlKGludChzZWxmLl9lbnZbJyMnXSkpXQorICAgICAgICAKKyAgICBkZWYgZ2V0X3ZhcmlhYmxlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGRpY3Qoc2VsZi5fZW52KQorICAgICAgICAKKyAgICBkZWYgZXhwb3J0KHNlbGYsIGtleSwgdmFsdWU9Tm9uZSk6CisgICAgICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZltrZXldID0gdmFsdWUKKyAgICAgICAgc2VsZi5fZXhwb3J0ZWQuYWRkKGtleSkKKyAgICAgICAgCisgICAgZGVmIGdldF9leHBvcnRlZChzZWxmKToKKyAgICAgICAgcmV0dXJuIFsoayxzZWxmLl9lbnYuZ2V0KGspKSBmb3IgayBpbiBzZWxmLl9leHBvcnRlZF0KKyAgICAgICAgICAgIAorICAgIGRlZiBzcGxpdF9maWVsZHMoc2VsZiwgd29yZCk6CisgICAgICAgIGlmIG5vdCBzZWxmLl9pZnNfd3Mgb3Igbm90IHdvcmQ6CisgICAgICAgICAgICByZXR1cm4gW3dvcmRdCisgICAgICAgIHJldHVybiByZS5zcGxpdChzZWxmLl9pZnNfcmUsIHdvcmQpCisgICAKKyAgICBkZWYgX3VwZGF0ZV9pZnMoc2VsZiwgdmFsdWUpOgorICAgICAgICAiIiJVcGRhdGUgdGhlIHNwbGl0X2ZpZWxkcyByZWxhdGVkIHZhcmlhYmxlcyB3aGVuIElGUyBjaGFyYWN0ZXIgc2V0IGlzCisgICAgICAgIGNoYW5nZWQuCisgICAgICAgICIiIgorICAgICAgICAjIFRPRE86IGhhbmRsZSBOVUxMIElGUworICAgICAgICAKKyAgICAgICAgIyBTZXBhcmF0ZSBjaGFyYWN0ZXJzIGluIHdoaXRlc3BhY2UgYW5kIG5vbi13aGl0ZXNwYWNlCisgICAgICAgIGNoYXJzID0gc2V0KHZhbHVlKQorICAgICAgICB3cyA9IFtjIGZvciBjIGluIGNoYXJzIGlmIGMgaW4gX0lGU19XSElURVNQQUNFU10KKyAgICAgICAgbndzID0gW2MgZm9yIGMgaW4gY2hhcnMgaWYgYyBub3QgaW4gX0lGU19XSElURVNQQUNFU10KKyAgICAgICAgCisgICAgICAgICMgS2VlcCB3aGl0ZXNwYWNlcyBpbiBhIHN0cmluZyBmb3IgbGVmdCBhbmQgcmlnaHQgc3RyaXBwaW5nCisgICAgICAgIHNlbGYuX2lmc193cyA9ICcnLmpvaW4od3MpCisgICAgICAgIAorICAgICAgICAjIEJ1aWxkIGEgcmVnZXhwIHRvIHNwbGl0IGZpZWxkcworICAgICAgICB0cmFpbGluZyA9ICdbJyArICcnLmpvaW4oW3JlLmVzY2FwZShjKSBmb3IgYyBpbiB3c10pICsgJ10nCisgICAgICAgIGlmIG53czoKKyAgICAgICAgICAgICMgRmlyc3QsIHRoZSBzaW5nbGUgbm9uLXdoaXRlc3BhY2Ugb2NjdXJlbmNlLgorICAgICAgICAgICAgbndzID0gJ1snICsgJycuam9pbihbcmUuZXNjYXBlKGMpIGZvciBjIGluIG53c10pICsgJ10nCisgICAgICAgICAgICBud3MgPSAnKD86JyArIHRyYWlsaW5nICsgJyonICsgbndzICsgdHJhaWxpbmcgKyAnKicgKyAnfCcgKyB0cmFpbGluZyArICcrKScKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgVGhlbiBtaXggYWxsIHBhcnRzIHdpdGggcXVhbnRpZmllcnMKKyAgICAgICAgICAgIG53cyA9IHRyYWlsaW5nICsgJysnCisgICAgICAgIHNlbGYuX2lmc19yZSA9IHJlLmNvbXBpbGUobndzKQorICAgICAgIAorICAgIGRlZiBoYXNfb3B0KHNlbGYsIG9wdCwgdmFsPU5vbmUpOgorICAgICAgICByZXR1cm4gKG9wdCwgdmFsKSBpbiBzZWxmLl9vcHQKKyAgICAgICAgCisgICAgZGVmIHNldF9vcHQoc2VsZiwgb3B0LCB2YWw9Tm9uZSk6CisgICAgICAgIHNlbGYuX29wdC5hZGQoKG9wdCwgdmFsKSkKKyAgICAgICAgCisgICAgZGVmIGZpbmRfaW5fcGF0aChzZWxmLCBuYW1lLCBwd2Q9RmFsc2UpOgorICAgICAgICBwYXRoID0gc2VsZi5fZW52LmdldCgnUEFUSCcsICcnKS5zcGxpdChvcy5wYXRoc2VwKQorICAgICAgICBpZiBwd2Q6CisgICAgICAgICAgICBwYXRoWzowXSA9IFtzZWxmWydQV0QnXV0KKyAgICAgICAgaWYgb3MubmFtZSA9PSAnbnQnOgorICAgICAgICAgICAgcmV0dXJuIHdpbjMyX2ZpbmRfaW5fcGF0aChuYW1lLCBzZWxmLl9lbnYuZ2V0KCdQQVRIJywgJycpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCisgICAgICAgICAgICAKKyAgICBkZWYgZGVmaW5lX2Z1bmN0aW9uKHNlbGYsIG5hbWUsIGJvZHkpOgorICAgICAgICBpZiBub3QgaXNfbmFtZShuYW1lKToKKyAgICAgICAgICAgIHJhaXNlIFNoZWxsU3ludGF4RXJyb3IoJyVzIGlzIG5vdCBhIHZhbGlkIGZ1bmN0aW9uIG5hbWUnICUgcmVwcihuYW1lKSkKKyAgICAgICAgc2VsZi5fZnVuY3Rpb25zW25hbWVdID0gYm9keQorICAgICAgICAKKyAgICBkZWYgcmVtb3ZlX2Z1bmN0aW9uKHNlbGYsIG5hbWUpOgorICAgICAgICBkZWwgc2VsZi5fZnVuY3Rpb25zW25hbWVdCisgICAgICAgIAorICAgIGRlZiBpc19mdW5jdGlvbihzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuIG5hbWUgaW4gc2VsZi5fZnVuY3Rpb25zCisgICAgICAgIAorICAgIGRlZiBnZXRfZnVuY3Rpb24oc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9mdW5jdGlvbnMuZ2V0KG5hbWUpCisgICAgICAgIAorICAgICAgIAorbmFtZV9jaGFyc2V0ID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5XycKK25hbWVfY2hhcnNldCA9IGRpY3QoemlwKG5hbWVfY2hhcnNldCxuYW1lX2NoYXJzZXQpKQorICAgICAgICAgICAKK2RlZiBtYXRjaF9uYW1lKHMpOgorICAgICIiIlJldHVybiB0aGUgbGVuZ3RoIGluIGNoYXJhY3RlcnMgb2YgdGhlIGxvbmdlc3QgcHJlZml4IG1hZGUgb2YgbmFtZQorICAgIGFsbG93ZWQgY2hhcmFjdGVycyBpbiBzLgorICAgICIiIgorICAgIGZvciBpLGMgaW4gZW51bWVyYXRlKHMpOgorICAgICAgICBpZiBjIG5vdCBpbiBuYW1lX2NoYXJzZXQ6CisgICAgICAgICAgICByZXR1cm4gc1s6aV0KKyAgICByZXR1cm4gcworICAgIAorZGVmIGlzX25hbWUocyk6CisgICAgcmV0dXJuIGxlbihbYyBmb3IgYyBpbiBzIGlmIGMgbm90IGluIG5hbWVfY2hhcnNldF0pPD0wCisgICAgCitkZWYgaXNfc3BlY2lhbF9wYXJhbShjKToKKyAgICByZXR1cm4gbGVuKGMpPT0xIGFuZCBjIGluICgnQCcsJyonLCcjJywnPycsJy0nLCckJywnIScsJzAnKQorICAgIAorZGVmIHV0aWxpdHlfbm90X2ltcGxlbWVudGVkKG5hbWUsICphcmdzLCAqKmt3YXJncyk6CisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignJXMgdXRpbGl0eSBpcyBub3QgaW1wbGVtZW50ZWQnICUgbmFtZSkKKyAgICAKKworY2xhc3MgVXRpbGl0eToKKyAgICAiIiJEZWZpbmUgdXRpbGl0aWVzIHByb3BlcnRpZXM6CisgICAgZnVuYyAtLSB1dGlsaXR5IGNhbGxhYmxlLiBTZWUgYnVpbHRpbiBtb2R1bGUgZm9yIHV0aWxpdHkgc2FtcGxlcy4KKyAgICBpc19zcGVjaWFsIC0tIHNlZSBYQ1UgMi44LgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmdW5jLCBpc19zcGVjaWFsPTApOgorICAgICAgICBzZWxmLmZ1bmMgPSBmdW5jCisgICAgICAgIHNlbGYuaXNfc3BlY2lhbCA9IGJvb2woaXNfc3BlY2lhbCkKKworCitkZWYgZW5jb2RlYXJncyhhcmdzKToKKyAgICBkZWYgZW5jb2RlYXJnKHMpOgorICAgICAgICBsaW5lcyA9IGJhc2U2NC5lbmNvZGVzdHJpbmcocykKKyAgICAgICAgbGluZXMgPSBbbC5zcGxpdGxpbmVzKClbMF0gZm9yIGwgaW4gbGluZXNdCisgICAgICAgIHJldHVybiAnJy5qb2luKGxpbmVzKQorCisgICAgcyA9IHBpY2tsZS5kdW1wcyhhcmdzKQorICAgIHJldHVybiBlbmNvZGVhcmcocykKKworZGVmIGRlY29kZWFyZ3Mocyk6CisgICAgcyA9IGJhc2U2NC5kZWNvZGVzdHJpbmcocykKKyAgICByZXR1cm4gcGlja2xlLmxvYWRzKHMpCisgICAgCisKK2NsYXNzIEdsb2JFcnJvcihFeGNlcHRpb24pOgorICAgIHBhc3MKKworY2xhc3MgT3B0aW9uczoKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICMgVHJ1ZSBpZiBNZXJjdXJpYWwgb3BlcmF0ZXMgd2l0aCBiaW5hcnkgc3RyZWFtcworICAgICAgICBzZWxmLmhnYmluYXJ5ID0gVHJ1ZQorCitjbGFzcyBJbnRlcnByZXRlcjoKKyAgICAjIEltcGxlbWVudGF0aW9uIGlzIHZlcnkgYmFzaWM6IHRoZSBleGVjdXRlKCkgbWV0aG9kIGp1c3QgbWFrZXMgYSBERlMgb24gdGhlCisgICAgIyBBU1QgYW5kIGV4ZWN1dGUgbm9kZXMgb25lIGJ5IG9uZS4gTm9kZXMgYXJlIHR1cGxlIChuYW1lLG9iaikgd2hlcmUgbmFtZQorICAgICMgaXMgYSBzdHJpbmcgaWRlbnRpZmllciBhbmQgb2JqIHRoZSBBU1QgZWxlbWVudCByZXR1cm5lZCBieSB0aGUgcGFyc2VyLgorICAgICMKKyAgICAjIEhhbmRsZXIgYXJlIG5hbWVkIGFmdGVyIHRoZSBub2RlIGlkZW50aWZpZXJzLgorICAgICMgVE9ETzogY2hlY2sgbm9kZSBuYW1lcyBhbmQgcmVtb3ZlIHRoZSBzd2l0Y2ggaW4gZXhlY3V0ZSB3aXRoIHNvbWUKKyAgICAjIGR5bmFtaWMgZ2V0YXR0cigpIGNhbGwgdG8gZmluZCBub2RlIGhhbmRsZXJzLgorICAgICIiIlNoZWxsIGludGVycHJldGVyLgorICAgIAorICAgIFRoZSBmb2xsb3dpbmcgZGVidWdnaW5nIGZsYWdzIGNhbiBiZSBwYXNzZWQ6CisgICAgZGVidWctcGFyc2luZyAtIGVuYWJsZSBQTFkgZGVidWdnaW5nLgorICAgIGRlYnVnLXRyZWUgLSBwcmludCB0aGUgZ2VuZXJhdGVkIEFTVC4KKyAgICBkZWJ1Zy1jbWQgLSB0cmFjZSBjb21tYW5kIGV4ZWN1dGlvbiBiZWZvcmUgd29yZCBleHBhbnNpb24sIHBsdXMgZXhpdCBzdGF0dXMuCisgICAgZGVidWctdXRpbGl0eSAtIHRyYWNlIHV0aWxpdHkgZXhlY3V0aW9uLgorICAgICIiIgorICAgIAorICAgICMgTGlzdCBzdXBwb3J0ZWQgY29tbWFuZHMuCisgICAgQ09NTUFORFMgPSB7CisgICAgICAgICdjYXQnOiAgICAgICBVdGlsaXR5KGJ1aWx0aW4udXRpbGl0eV9jYXQsKSwKKyAgICAgICAgJ2NkJzogICAgICAgVXRpbGl0eShidWlsdGluLnV0aWxpdHlfY2QsKSwKKyAgICAgICAgJzonOiAgICAgICAgVXRpbGl0eShidWlsdGluLnV0aWxpdHlfY29sb24sKSwKKyAgICAgICAgJ2VjaG8nOiAgICAgVXRpbGl0eShidWlsdGluLnV0aWxpdHlfZWNobyksCisgICAgICAgICdlbnYnOiAgICAgIFV0aWxpdHkoYnVpbHRpbi51dGlsaXR5X2VudiksCisgICAgICAgICdleGl0JzogICAgIFV0aWxpdHkoYnVpbHRpbi51dGlsaXR5X2V4aXQpLAorICAgICAgICAnZXhwb3J0JzogICBVdGlsaXR5KGJ1aWx0aW4uYnVpbHRpbl9leHBvcnQsICAgICBpc19zcGVjaWFsPTEpLAorICAgICAgICAnZWdyZXAnOiAgICBVdGlsaXR5KGJ1aWx0aW4udXRpbGl0eV9lZ3JlcCksCisgICAgICAgICdmZ3JlcCc6ICAgIFV0aWxpdHkoYnVpbHRpbi51dGlsaXR5X2ZncmVwKSwKKyAgICAgICAgJ2d1bnppcCc6ICAgVXRpbGl0eShidWlsdGluLnV0aWxpdHlfZ3VuemlwKSwKKyAgICAgICAgJ2tpbGwnOiAgICAgVXRpbGl0eShidWlsdGluLnV0aWxpdHlfa2lsbCksCisgICAgICAgICdta2Rpcic6ICAgIFV0aWxpdHkoYnVpbHRpbi51dGlsaXR5X21rZGlyKSwKKyAgICAgICAgJ25ldHN0YXQnOiAgVXRpbGl0eShidWlsdGluLnV0aWxpdHlfbmV0c3RhdCksCisgICAgICAgICdwcmludGYnOiAgIFV0aWxpdHkoYnVpbHRpbi51dGlsaXR5X3ByaW50ZiksCisgICAgICAgICdwd2QnOiAgICAgIFV0aWxpdHkoYnVpbHRpbi51dGlsaXR5X3B3ZCksCisgICAgICAgICdyZXR1cm4nOiAgIFV0aWxpdHkoYnVpbHRpbi5idWlsdGluX3JldHVybiwgICAgIGlzX3NwZWNpYWw9MSksCisgICAgICAgICdzZWQnOiAgICAgIFV0aWxpdHkoYnVpbHRpbi51dGlsaXR5X3NlZCwpLAorICAgICAgICAnc2V0JzogICAgICBVdGlsaXR5KGJ1aWx0aW4uYnVpbHRpbl9zZXQsKSwKKyAgICAgICAgJ3NoaWZ0JzogICAgVXRpbGl0eShidWlsdGluLmJ1aWx0aW5fc2hpZnQsKSwKKyAgICAgICAgJ3NsZWVwJzogICAgVXRpbGl0eShidWlsdGluLnV0aWxpdHlfc2xlZXAsKSwKKyAgICAgICAgJ3NvcnQnOiAgICAgVXRpbGl0eShidWlsdGluLnV0aWxpdHlfc29ydCwpLAorICAgICAgICAndHJhcCc6ICAgICBVdGlsaXR5KGJ1aWx0aW4uYnVpbHRpbl90cmFwLCAgICAgICBpc19zcGVjaWFsPTEpLAorICAgICAgICAndHJ1ZSc6ICAgICBVdGlsaXR5KGJ1aWx0aW4udXRpbGl0eV90cnVlKSwKKyAgICAgICAgJ3Vuc2V0JzogICAgVXRpbGl0eShidWlsdGluLmJ1aWx0aW5fdW5zZXQsICAgICAgaXNfc3BlY2lhbD0xKSwKKyAgICAgICAgJ3dhaXQnOiAgICAgVXRpbGl0eShidWlsdGluLmJ1aWx0aW5fd2FpdCwgICAgICAgaXNfc3BlY2lhbD0xKSwKKyAgICB9CisgICAgCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHB3ZCwgZGVidWdmbGFncyA9IFtdLCBlbnY9Tm9uZSwgcmVkaXJzPU5vbmUsIHN0ZGluPU5vbmUsCisgICAgICAgICAgICAgICAgIHN0ZG91dD1Ob25lLCBzdGRlcnI9Tm9uZSwgb3B0cz1PcHRpb25zKCkpOgorICAgICAgICBzZWxmLl9lbnYgPSBlbnYKKyAgICAgICAgaWYgc2VsZi5fZW52IGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl9lbnYgPSBFbnZpcm9ubWVudChwd2QpCisgICAgICAgIHNlbGYuX2NoaWxkcmVuID0ge30KKyAgICAgICAgICAgIAorICAgICAgICBzZWxmLl9yZWRpcnMgPSByZWRpcnMKKyAgICAgICAgc2VsZi5fY2xvc2VfcmVkaXJzID0gRmFsc2UKKyAgICAgICAgCisgICAgICAgIGlmIHNlbGYuX3JlZGlycyBpcyBOb25lOgorICAgICAgICAgICAgaWYgc3RkaW4gaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzdGRpbiA9IHN5cy5zdGRpbgorICAgICAgICAgICAgaWYgc3Rkb3V0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAgICAgICAgICAgaWYgc3RkZXJyIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc3RkZXJyID0gc3lzLnN0ZGVycgorICAgICAgICAgICAgc3RkaW4gPSBGaWxlV3JhcHBlcigncicsIHN0ZGluLCBGYWxzZSkKKyAgICAgICAgICAgIHN0ZG91dCA9IEZpbGVXcmFwcGVyKCd3Jywgc3Rkb3V0LCBGYWxzZSkKKyAgICAgICAgICAgIHN0ZGVyciA9IEZpbGVXcmFwcGVyKCd3Jywgc3RkZXJyLCBGYWxzZSkKKyAgICAgICAgICAgIHNlbGYuX3JlZGlycyA9IFJlZGlyZWN0aW9ucyhzdGRpbiwgc3Rkb3V0LCBzdGRlcnIpCisgICAgICAgICAgICBzZWxmLl9jbG9zZV9yZWRpcnMgPSBUcnVlCisgICAgICAgICAgICAKKyAgICAgICAgc2VsZi5fZGVidWdmbGFncyA9IGxpc3QoZGVidWdmbGFncykKKyAgICAgICAgc2VsZi5fbG9nZmlsZSA9IHN5cy5zdGRlcnIKKyAgICAgICAgc2VsZi5fb3B0aW9ucyA9IG9wdHMKKyAgICAgICAgCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAiIiJNdXN0IGJlIGNhbGxlZCB3aGVuIHRoZSBpbnRlcnByZXRlciBpcyBubyBsb25nZXIgdXNlZC4iIiIKKyAgICAgICAgc2NyaXB0ID0gc2VsZi5fZW52LnRyYXBzLmdldCgnRVhJVCcpCisgICAgICAgIGlmIHNjcmlwdDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmV4ZWN1dGVfc2NyaXB0KHNjcmlwdD1zY3JpcHQpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGlmIHNlbGYuX3JlZGlycyBpcyBub3QgTm9uZSBhbmQgc2VsZi5fY2xvc2VfcmVkaXJzOgorICAgICAgICAgICAgc2VsZi5fcmVkaXJzLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuX3JlZGlycyA9IE5vbmUKKyAgICAgICAgICAgIAorICAgIGRlZiBsb2coc2VsZiwgcyk6CisgICAgICAgIHNlbGYuX2xvZ2ZpbGUud3JpdGUocykKKyAgICAgICAgc2VsZi5fbG9nZmlsZS5mbHVzaCgpCisgICAgICAgICAgICAKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2VudltrZXldCisgICAgICAgIAorICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKKyAgICAgICAgc2VsZi5fZW52W2tleV0gPSB2YWx1ZQorCisgICAgZGVmIG9wdGlvbnMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9vcHRpb25zCisKKyAgICBkZWYgcmVkaXJlY3Qoc2VsZiwgcmVkaXJzLCBpb3MpOgorICAgICAgICBkZWYgYWRkX3JlZGlyKGlvKToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaW8sIHB5c2h5YWNjLklPUmVkaXJlY3QpOgorICAgICAgICAgICAgICAgIHJlZGlycy5hZGQoc2VsZiwgaW8ub3AsIGlvLmZpbGVuYW1lLCBpby5pb19udW1iZXIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJlZGlycy5hZGRfaGVyZV9kb2N1bWVudChzZWxmLCBpby5uYW1lLCBpby5jb250ZW50LCBpby5pb19udW1iZXIpCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBtYXAoYWRkX3JlZGlyLCBpb3MpCisgICAgICAgIHJldHVybiByZWRpcnMKKyAgICAgICAgICAgIAorICAgIGRlZiBleGVjdXRlX3NjcmlwdChzZWxmLCBzY3JpcHQ9Tm9uZSwgYXN0PU5vbmUsIHNvdXJjZWQ9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdHBhdGg9Tm9uZSk6CisgICAgICAgICIiIklmIHNjcmlwdCBpcyBub3QgTm9uZSwgcGFyc2UgdGhlIGlucHV0LiBPdGhlcndpc2UgdGFrZXMgdGhlIHN1cHBsaWVkCisgICAgICAgIEFTVC4gVGhlbiBleGVjdXRlIHRoZSBBU1QuCisgICAgICAgIFJldHVybiB0aGUgc2NyaXB0IGV4aXQgc3RhdHVzLgorICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2NyaXB0cGF0aCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLl9lbnZbJzAnXSA9IG9zLnBhdGguYWJzcGF0aChzY3JpcHRwYXRoKQorCisgICAgICAgICAgICBpZiBzY3JpcHQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgZGVidWdfcGFyc2luZyA9ICgnZGVidWctcGFyc2luZycgaW4gc2VsZi5fZGVidWdmbGFncykgICAgCisgICAgICAgICAgICAgICAgY21kcywgc2NyaXB0ID0gcHlzaHlhY2MucGFyc2Uoc2NyaXB0LCBUcnVlLCBkZWJ1Z19wYXJzaW5nKQorICAgICAgICAgICAgICAgIGlmICdkZWJ1Zy10cmVlJyBpbiBzZWxmLl9kZWJ1Z2ZsYWdzOgorICAgICAgICAgICAgICAgICAgICBweXNoeWFjYy5wcmludF9jb21tYW5kcyhjbWRzLCBzZWxmLl9sb2dmaWxlKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9sb2dmaWxlLmZsdXNoKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY21kcywgc2NyaXB0ID0gYXN0LCAnJyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHN0YXR1cyA9IDAKKyAgICAgICAgICAgIGZvciBjbWQgaW4gY21kczoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHNlbGYuZXhlY3V0ZShjbWQpCisgICAgICAgICAgICAgICAgZXhjZXB0IEV4aXRTaWduYWwgYXMgZToKKyAgICAgICAgICAgICAgICAgICAgaWYgc291cmNlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGludChlLmFyZ3NbMF0pCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXMKKyAgICAgICAgICAgICAgICBleGNlcHQgU2hlbGxFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZW52Wyc/J10gPSAxCisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgaWYgJ2RlYnVnLXV0aWxpdHknIGluIHNlbGYuX2RlYnVnZmxhZ3Mgb3IgJ2RlYnVnLWNtZCcgaW4gc2VsZi5fZGVidWdmbGFnczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2coJ3JldHVybmNvZGUgJyArIHN0cihzdGF0dXMpKyAnXG4nKQorICAgICAgICAgICAgcmV0dXJuIHN0YXR1cworICAgICAgICBleGNlcHQgQ29tbWFuZE5vdEZvdW5kIGFzIGU6CisgICAgICAgICAgICBwcmludCA+PnNlbGYuX3JlZGlycy5zdGRlcnIsIHN0cihlKQorICAgICAgICAgICAgc2VsZi5fcmVkaXJzLnN0ZGVyci5mbHVzaCgpCisgICAgICAgICAgICAjIENvbW1hbmQgbm90IGZvdW5kIGJ5IG5vbi1pbnRlcmFjdGl2ZSBzaGVsbAorICAgICAgICAgICAgIyByZXR1cm4gMTI3CisgICAgICAgICAgICByYWlzZQorICAgICAgICBleGNlcHQgUmVkaXJlY3Rpb25FcnJvciBhcyBlOgorICAgICAgICAgICAgIyBUT0RPOiBzaG91bGQgYmUgaGFuZGxlZCBkZXBlbmRpbmcgb24gdGhlIHV0aWxpdHkgc3RhdHVzCisgICAgICAgICAgICBwcmludCA+PnNlbGYuX3JlZGlycy5zdGRlcnIsIHN0cihlKQorICAgICAgICAgICAgc2VsZi5fcmVkaXJzLnN0ZGVyci5mbHVzaCgpCisgICAgICAgICAgICAjIENvbW1hbmQgbm90IGZvdW5kIGJ5IG5vbi1pbnRlcmFjdGl2ZSBzaGVsbAorICAgICAgICAgICAgIyByZXR1cm4gMTI3CisgICAgICAgICAgICByYWlzZQorCisgICAgZGVmIGRvdGNvbW1hbmQoc2VsZiwgZW52LCBhcmdzKToKKyAgICAgICAgaWYgbGVuKGFyZ3MpIDwgMToKKyAgICAgICAgICAgIHJhaXNlIFNoZWxsRXJyb3IoJy4gZXhwZWN0cyBhdCBsZWFzdCBvbmUgYXJndW1lbnQnKQorICAgICAgICBwYXRoID0gYXJnc1swXQorICAgICAgICBpZiAnLycgbm90IGluIHBhdGg6CisgICAgICAgICAgICBmb3VuZCA9IGVudi5maW5kX2luX3BhdGgoYXJnc1swXSwgVHJ1ZSkKKyAgICAgICAgICAgIGlmIGZvdW5kOgorICAgICAgICAgICAgICAgIHBhdGggPSBmb3VuZFswXQorICAgICAgICBzY3JpcHQgPSBmaWxlKHBhdGgpLnJlYWQoKQorICAgICAgICByZXR1cm4gc2VsZi5leGVjdXRlX3NjcmlwdChzY3JpcHQ9c2NyaXB0LCBzb3VyY2VkPVRydWUpCisKKyAgICBkZWYgZXhlY3V0ZShzZWxmLCB0b2tlbiwgcmVkaXJzPU5vbmUpOgorICAgICAgICAiIiJFeGVjdXRlIGFuZCBBU1Qgc3VidHJlZSB3aXRoIHN1cHBsaWVkIHJlZGlyZWN0aW9ucyBvdmVycmlkaW5nIGRlZmF1bHQKKyAgICAgICAgaW50ZXJwcmV0ZXIgb25lcy4KKyAgICAgICAgUmV0dXJuIHRoZSBleGl0IHN0YXR1cy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCB0b2tlbjoKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgICAgICAKKyAgICAgICAgaWYgcmVkaXJzIGlzIE5vbmU6CisgICAgICAgICAgICByZWRpcnMgPSBzZWxmLl9yZWRpcnMKKyAgICAgICAgICAgIAorICAgICAgICBpZiBpc2luc3RhbmNlKHRva2VuLCBsaXN0KToKKyAgICAgICAgICAgICMgQ29tbWFuZHMgc2VxdWVuY2UKKyAgICAgICAgICAgIHJlcyA9IDAKKyAgICAgICAgICAgIGZvciB0IGluIHRva2VuOgorICAgICAgICAgICAgICAgIHJlcyA9IHNlbGYuZXhlY3V0ZSh0LCByZWRpcnMpCisgICAgICAgICAgICByZXR1cm4gcmVzCisKKyAgICAgICAgdHlwZSwgdmFsdWUgPSB0b2tlbgorICAgICAgICBzdGF0dXMgPSAwCisgICAgICAgIGlmIHR5cGU9PSdzaW1wbGVfY29tbWFuZCc6CisgICAgICAgICAgICByZWRpcnNfY29weSA9IHJlZGlycy5jbG9uZSgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgIyBUT0RPOiBkZWZpbmUgYW5kIGhhbmRsZSBjb21tYW5kIHJldHVybiB2YWx1ZXMKKyAgICAgICAgICAgICAgICAjIFRPRE86IGltcGxlbWVudCBzZXQgLWUKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzZWxmLl9leGVjdXRlX3NpbXBsZV9jb21tYW5kKHZhbHVlLCByZWRpcnNfY29weSkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgcmVkaXJzX2NvcHkuY2xvc2UoKQorICAgICAgICBlbGlmIHR5cGU9PSdwaXBlbGluZSc6CisgICAgICAgICAgICBzdGF0dXMgPSBzZWxmLl9leGVjdXRlX3BpcGVsaW5lKHZhbHVlLCByZWRpcnMpCisgICAgICAgIGVsaWYgdHlwZT09J2FuZF9vcic6CisgICAgICAgICAgICBzdGF0dXMgPSBzZWxmLl9leGVjdXRlX2FuZF9vcih2YWx1ZSwgcmVkaXJzKQorICAgICAgICBlbGlmIHR5cGU9PSdmb3JfY2xhdXNlJzoKKyAgICAgICAgICAgIHN0YXR1cyA9IHNlbGYuX2V4ZWN1dGVfZm9yX2NsYXVzZSh2YWx1ZSwgcmVkaXJzKQorICAgICAgICBlbGlmIHR5cGU9PSd3aGlsZV9jbGF1c2UnOgorICAgICAgICAgICAgc3RhdHVzID0gc2VsZi5fZXhlY3V0ZV93aGlsZV9jbGF1c2UodmFsdWUsIHJlZGlycykKKyAgICAgICAgZWxpZiB0eXBlPT0nZnVuY3Rpb25fZGVmaW5pdGlvbic6CisgICAgICAgICAgICBzdGF0dXMgPSBzZWxmLl9leGVjdXRlX2Z1bmN0aW9uX2RlZmluaXRpb24odmFsdWUsIHJlZGlycykKKyAgICAgICAgZWxpZiB0eXBlPT0nYnJhY2VfZ3JvdXAnOgorICAgICAgICAgICAgc3RhdHVzID0gc2VsZi5fZXhlY3V0ZV9icmFjZV9ncm91cCh2YWx1ZSwgcmVkaXJzKQorICAgICAgICBlbGlmIHR5cGU9PSdpZl9jbGF1c2UnOgorICAgICAgICAgICAgc3RhdHVzID0gc2VsZi5fZXhlY3V0ZV9pZl9jbGF1c2UodmFsdWUsIHJlZGlycykKKyAgICAgICAgZWxpZiB0eXBlPT0nc3Vic2hlbGwnOgorICAgICAgICAgICAgc3RhdHVzID0gc2VsZi5zdWJzaGVsbChhc3Q9dmFsdWUuY21kcywgcmVkaXJzPXJlZGlycykKKyAgICAgICAgZWxpZiB0eXBlPT0nYXN5bmMnOgorICAgICAgICAgICAgc3RhdHVzID0gc2VsZi5fYXN5bmNsaXN0KHZhbHVlKQorICAgICAgICBlbGlmIHR5cGU9PSdyZWRpcmVjdF9saXN0JzoKKyAgICAgICAgICAgIHJlZGlyc19jb3B5ID0gc2VsZi5yZWRpcmVjdChyZWRpcnMuY2xvbmUoKSwgdmFsdWUucmVkaXJzKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHN0YXR1cyA9IHNlbGYuZXhlY3V0ZSh2YWx1ZS5jbWQsIHJlZGlyc19jb3B5KQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICByZWRpcnNfY29weS5jbG9zZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdVbnN1cHBvcnRlZCB0b2tlbiB0eXBlICcgKyB0eXBlKQorCisgICAgICAgIGlmIHN0YXR1cyA8IDA6CisgICAgICAgICAgICBzdGF0dXMgPSAyNTUKKyAgICAgICAgcmV0dXJuIHN0YXR1cworICAgICAgICAgICAgCisgICAgZGVmIF9leGVjdXRlX2lmX2NsYXVzZShzZWxmLCBpZl9jbGF1c2UsIHJlZGlycyk6CisgICAgICAgIGNvbmRfc3RhdHVzID0gc2VsZi5leGVjdXRlKGlmX2NsYXVzZS5jb25kLCByZWRpcnMpCisgICAgICAgIGlmIGNvbmRfc3RhdHVzPT0wOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZXhlY3V0ZShpZl9jbGF1c2UuaWZfY21kcywgcmVkaXJzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZXhlY3V0ZShpZl9jbGF1c2UuZWxzZV9jbWRzLCByZWRpcnMpCisgICAgICAKKyAgICBkZWYgX2V4ZWN1dGVfYnJhY2VfZ3JvdXAoc2VsZiwgZ3JvdXAsIHJlZGlycyk6CisgICAgICAgIHN0YXR1cyA9IDAKKyAgICAgICAgZm9yIGNtZCBpbiBncm91cC5jbWRzOgorICAgICAgICAgICAgc3RhdHVzID0gc2VsZi5leGVjdXRlKGNtZCwgcmVkaXJzKQorICAgICAgICByZXR1cm4gc3RhdHVzCisgICAgICAgICAgICAKKyAgICBkZWYgX2V4ZWN1dGVfZnVuY3Rpb25fZGVmaW5pdGlvbihzZWxmLCBmdW5kZWYsIHJlZGlycyk6CisgICAgICAgIHNlbGYuX2Vudi5kZWZpbmVfZnVuY3Rpb24oZnVuZGVmLm5hbWUsIGZ1bmRlZi5ib2R5KQorICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgCisgICAgZGVmIF9leGVjdXRlX3doaWxlX2NsYXVzZShzZWxmLCB3aGlsZV9jbGF1c2UsIHJlZGlycyk6CisgICAgICAgIHN0YXR1cyA9IDAKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIGNvbmRfc3RhdHVzID0gMAorICAgICAgICAgICAgZm9yIGNvbmQgaW4gd2hpbGVfY2xhdXNlLmNvbmRpdGlvbjoKKyAgICAgICAgICAgICAgICBjb25kX3N0YXR1cyA9IHNlbGYuZXhlY3V0ZShjb25kLCByZWRpcnMpCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBpZiBjb25kX3N0YXR1czoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yIGNtZCBpbiB3aGlsZV9jbGF1c2UuY21kczoKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzZWxmLmV4ZWN1dGUoY21kLCByZWRpcnMpCisgICAgICAgICAgICAgICAgCisgICAgICAgIHJldHVybiBzdGF0dXMKKyAgICAgICAgICAgIAorICAgIGRlZiBfZXhlY3V0ZV9mb3JfY2xhdXNlKHNlbGYsIGZvcl9jbGF1c2UsIHJlZGlycyk6CisgICAgICAgIGlmIG5vdCBpc19uYW1lKGZvcl9jbGF1c2UubmFtZSk6CisgICAgICAgICAgICByYWlzZSBTaGVsbFN5bnRheEVycm9yKCclcyBpcyBub3QgYSB2YWxpZCBuYW1lJyAlIHJlcHIoZm9yX2NsYXVzZS5uYW1lKSkKKyAgICAgICAgaXRlbXMgPSBtYXBwZW5kKHNlbGYuZXhwYW5kX3Rva2VuLCBmb3JfY2xhdXNlLml0ZW1zKQorICAgICAgICAKKyAgICAgICAgc3RhdHVzID0gMCAgICAKKyAgICAgICAgZm9yIGl0ZW0gaW4gaXRlbXM6CisgICAgICAgICAgICBzZWxmLl9lbnZbZm9yX2NsYXVzZS5uYW1lXSA9IGl0ZW0KKyAgICAgICAgICAgIGZvciBjbWQgaW4gZm9yX2NsYXVzZS5jbWRzOgorICAgICAgICAgICAgICAgIHN0YXR1cyA9IHNlbGYuZXhlY3V0ZShjbWQsIHJlZGlycykKKyAgICAgICAgcmV0dXJuIHN0YXR1cworICAgICAgICAgICAgCisgICAgZGVmIF9leGVjdXRlX2FuZF9vcihzZWxmLCBvcl9hbmQsIHJlZGlycyk6CisgICAgICAgIHJlcyA9IHNlbGYuZXhlY3V0ZShvcl9hbmQubGVmdCwgcmVkaXJzKSAgICAgICAgCisgICAgICAgIGlmIChvcl9hbmQub3A9PScmJicgYW5kIHJlcz09MCkgb3IgKG9yX2FuZC5vcCE9JyYmJyBhbmQgcmVzIT0wKToKKyAgICAgICAgICAgIHJlcyA9IHNlbGYuZXhlY3V0ZShvcl9hbmQucmlnaHQsIHJlZGlycykKKyAgICAgICAgcmV0dXJuIHJlcworICAgICAgICAgICAgCisgICAgZGVmIF9leGVjdXRlX3BpcGVsaW5lKHNlbGYsIHBpcGVsaW5lLCByZWRpcnMpOiAgICAgICAgICAgIAorICAgICAgICBpZiBsZW4ocGlwZWxpbmUuY29tbWFuZHMpPT0xOgorICAgICAgICAgICAgc3RhdHVzID0gc2VsZi5leGVjdXRlKHBpcGVsaW5lLmNvbW1hbmRzWzBdLCByZWRpcnMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIEV4ZWN1dGUgYWxsIGNvbW1hbmRzIG9uZSBhZnRlciB0aGUgb3RoZXIKKyAgICAgICAgICAgIHN0YXR1cyA9IDAKKyAgICAgICAgICAgIGlucGF0aCwgb3V0cGF0aCA9IE5vbmUsIE5vbmUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAjIENvbW1hbmRzIGlucHV0cyBhbmQgb3V0cHV0cyBjYW5ub3QgcmVhbGx5IGJlIHBsdWdnZWQgYXMgZG9uZQorICAgICAgICAgICAgICAgICMgYnkgYSByZWFsIHNoZWxsLiBSdW4gY29tbWFuZHMgc2VxdWVudGlhbGx5IGFuZCBjaGFpbiB0aGVpcgorICAgICAgICAgICAgICAgICMgaW5wdXQvb3V0cHV0IHRocm91Z2h0IHRlbXBvcmFyeSBmaWxlcy4KKyAgICAgICAgICAgICAgICB0bXBmZCwgaW5wYXRoID0gdGVtcGZpbGUubWtzdGVtcCgpCisgICAgICAgICAgICAgICAgb3MuY2xvc2UodG1wZmQpCisgICAgICAgICAgICAgICAgdG1wZmQsIG91dHBhdGggPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKKyAgICAgICAgICAgICAgICBvcy5jbG9zZSh0bXBmZCkKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpbnBhdGggPSB3aW4zMl90b191bml4X3BhdGgoaW5wYXRoKQorICAgICAgICAgICAgICAgIG91dHBhdGggPSB3aW4zMl90b191bml4X3BhdGgob3V0cGF0aCkKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBmb3IgaSwgY21kIGluIGVudW1lcmF0ZShwaXBlbGluZS5jb21tYW5kcyk6CisgICAgICAgICAgICAgICAgICAgIGNhbGxfcmVkaXJzID0gcmVkaXJzLmNsb25lKCkKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgaSE9MDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsX3JlZGlycy5hZGQoc2VsZiwgJzwnLCBpbnBhdGgpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBpIT1sZW4ocGlwZWxpbmUuY29tbWFuZHMpLTE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbF9yZWRpcnMuYWRkKHNlbGYsICc+Jywgb3V0cGF0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gc2VsZi5leGVjdXRlKGNtZCwgY2FsbF9yZWRpcnMpCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICMgQ2hhaW4gaW5wdXRzL291dHB1dHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucGF0aCwgb3V0cGF0aCA9IG91dHBhdGgsIGlucGF0aAorICAgICAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FsbF9yZWRpcnMuY2xvc2UoKSAgICAgICAgICAgIAorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBpZiBpbnBhdGg6IG9zLnJlbW92ZShpbnBhdGgpCisgICAgICAgICAgICAgICAgaWYgb3V0cGF0aDogb3MucmVtb3ZlKG91dHBhdGgpCisgICAgICAgIAorICAgICAgICBpZiBwaXBlbGluZS5yZXZlcnNlX3N0YXR1czoKKyAgICAgICAgICAgIHN0YXR1cyA9IGludChub3Qgc3RhdHVzKQorICAgICAgICBzZWxmLl9lbnZbJz8nXSA9IHN0YXR1cworICAgICAgICByZXR1cm4gc3RhdHVzCisgICAgICAgIAorICAgIGRlZiBfZXhlY3V0ZV9mdW5jdGlvbihzZWxmLCBuYW1lLCBhcmdzLCBpbnRlcnAsIGVudiwgc3RkaW4sIHN0ZG91dCwgc3RkZXJyLCAqb3RoZXJzKToKKyAgICAgICAgYXNzZXJ0IGludGVycCBpcyBzZWxmCisgICAgICAgIAorICAgICAgICBmdW5jID0gZW52LmdldF9mdW5jdGlvbihuYW1lKQorICAgICAgICAjU2V0IHBvc2l0aW9uYWwgcGFyYW1ldGVycworICAgICAgICBwcmV2YXJncyA9IE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcHJldmFyZ3MgPSBlbnYuc2V0X3Bvc2l0aW9uYWxfYXJncyhhcmdzKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJlZGlycyA9IFJlZGlyZWN0aW9ucyhzdGRpbi5kdXAoKSwgc3Rkb3V0LmR1cCgpLCBzdGRlcnIuZHVwKCkpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzZWxmLmV4ZWN1dGUoZnVuYywgcmVkaXJzKQorICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgIHJlZGlycy5jbG9zZSgpCisgICAgICAgICAgICBleGNlcHQgUmV0dXJuU2lnbmFsIGFzIGU6CisgICAgICAgICAgICAgICAgc3RhdHVzID0gaW50KGUuYXJnc1swXSkKKyAgICAgICAgICAgICAgICBlbnZbJz8nXSA9IHN0YXR1cworICAgICAgICAgICAgcmV0dXJuIHN0YXR1cworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgI1Jlc2V0IHBvc2l0aW9uYWwgcGFyYW1ldGVycworICAgICAgICAgICAgaWYgcHJldmFyZ3MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgZW52LnNldF9wb3NpdGlvbmFsX2FyZ3MocHJldmFyZ3MpCisgICAgICAgICAgICAgICAgCisgICAgZGVmIF9leGVjdXRlX3NpbXBsZV9jb21tYW5kKHNlbGYsIHRva2VuLCByZWRpcnMpOgorICAgICAgICAiIiJDYW4gcmFpc2UgUmV0dXJuU2lnbmFsIHdoZW4gcmV0dXJuIGJ1aWx0aW4gaXMgY2FsbGVkLCBFeGl0U2lnbmFsIHdoZW4KKyAgICAgICAgZXhpdCBpcyBjYWxsZWQsIGFuZCBvdGhlciBzaGVsbCBleGNlcHRpb25zIHVwb24gYnVpbHRpbiBmYWlsdXJlcy4KKyAgICAgICAgIiIiCisgICAgICAgIGRlYnVnX2NvbW1hbmQgPSAnZGVidWctY21kJyBpbiBzZWxmLl9kZWJ1Z2ZsYWdzCisgICAgICAgIGlmIGRlYnVnX2NvbW1hbmQ6CisgICAgICAgICAgICBzZWxmLmxvZygnd29yZCcgKyByZXByKHRva2VuLndvcmRzKSArICdcbicpCisgICAgICAgICAgICBzZWxmLmxvZygnYXNzaWducycgKyByZXByKHRva2VuLmFzc2lnbnMpICsgJ1xuJykKKyAgICAgICAgICAgIHNlbGYubG9nKCdyZWRpcnMnICsgcmVwcih0b2tlbi5yZWRpcnMpICsgJ1xuJykKKyAgICAgICAgCisgICAgICAgIGlzX3NwZWNpYWwgPSBOb25lCisgICAgICAgIGVudiA9IHNlbGYuX2VudgorICAgICAgICAKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBXb3JkIGV4cGFuc2lvbgorICAgICAgICAgICAgYXJncyA9IFtdCisgICAgICAgICAgICBmb3Igd29yZCBpbiB0b2tlbi53b3JkczogICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgYXJncyArPSBzZWxmLmV4cGFuZF90b2tlbih3b3JkKQorICAgICAgICAgICAgICAgIGlmIGlzX3NwZWNpYWwgaXMgTm9uZSBhbmQgYXJnczoKKyAgICAgICAgICAgICAgICAgICAgaXNfc3BlY2lhbCA9IGVudi5pc19mdW5jdGlvbihhcmdzWzBdKSBvciBcCisgICAgICAgICAgICAgICAgICAgICAgICAoYXJnc1swXSBpbiBzZWxmLkNPTU1BTkRTIGFuZCBzZWxmLkNPTU1BTkRTW2FyZ3NbMF1dLmlzX3NwZWNpYWwpCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIGRlYnVnX2NvbW1hbmQ6CisgICAgICAgICAgICAgICAgc2VsZi5sb2coJ19leGVjdXRlX3NpbXBsZV9jb21tYW5kJyArIHN0cihhcmdzKSArICdcbicpCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBpZiBub3QgYXJnczoKKyAgICAgICAgICAgICAgICAjIFJlZGlyZWN0aW9ucyBoYXBwZW4gaXMgYSBzdWJzaGVsbAorICAgICAgICAgICAgICAgIHJlZGlycyA9IHJlZGlycy5jbG9uZSgpCisgICAgICAgICAgICBlbGlmIG5vdCBpc19zcGVjaWFsOgorICAgICAgICAgICAgICAgIGVudiA9IHNlbGYuX2Vudi5jbG9uZSgpCisgICAgICAgICAgICAKKyAgICAgICAgICAgICMgUmVkaXJlY3Rpb25zCisgICAgICAgICAgICBzZWxmLnJlZGlyZWN0KHJlZGlycywgdG9rZW4ucmVkaXJzKQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgIyBWYXJpYWJsZXMgYXNzaWdubWVudHMKKyAgICAgICAgICAgIHJlcyA9IDAKKyAgICAgICAgICAgIGZvciB0eXBlLChrLHYpIGluIHRva2VuLmFzc2lnbnM6CisgICAgICAgICAgICAgICAgc3RhdHVzLCBleHBhbmRlZCA9IHNlbGYuZXhwYW5kX3ZhcmlhYmxlKChrLHYpKQorICAgICAgICAgICAgICAgIGlmIHN0YXR1cyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gc3RhdHVzCisgICAgICAgICAgICAgICAgaWYgYXJnczoKKyAgICAgICAgICAgICAgICAgICAgZW52LmV4cG9ydChrLCBleHBhbmRlZCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBlbnZba10gPSBleHBhbmRlZAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgYXJncyBhbmQgYXJnc1swXSBpbiAoJy4nLCAnc291cmNlJyk6CisgICAgICAgICAgICAgICAgcmVzID0gc2VsZi5kb3Rjb21tYW5kKGVudiwgYXJnc1sxOl0pCisgICAgICAgICAgICBlbGlmIGFyZ3M6CisgICAgICAgICAgICAgICAgaWYgYXJnc1swXSBpbiBzZWxmLkNPTU1BTkRTOgorICAgICAgICAgICAgICAgICAgICBjb21tYW5kID0gc2VsZi5DT01NQU5EU1thcmdzWzBdXQorICAgICAgICAgICAgICAgIGVsaWYgZW52LmlzX2Z1bmN0aW9uKGFyZ3NbMF0pOgorICAgICAgICAgICAgICAgICAgICBjb21tYW5kID0gVXRpbGl0eShzZWxmLl9leGVjdXRlX2Z1bmN0aW9uLCBpc19zcGVjaWFsPVRydWUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90ICcvJyBpbiBhcmdzWzBdLnJlcGxhY2UoJ1xcJywgJy8nKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtZCA9IGVudi5maW5kX2luX3BhdGgoYXJnc1swXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBjbWQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUT0RPOiB0ZXN0IGVycm9yIGNvZGUgb24gdW5rbm93biBjb21tYW5kID0+IDEyNworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIENvbW1hbmROb3RGb3VuZCgnVW5rbm93biBjb21tYW5kOiAiJXMiJyAlIGFyZ3NbMF0pCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAjIEhhbmRsZSBjb21tYW5kcyBsaWtlICcvY3lnZHJpdmUvYy9mb28uYmF0JworICAgICAgICAgICAgICAgICAgICAgICAgY21kID0gY3lnd2luX3RvX3dpbmRvd3NfcGF0aChhcmdzWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGNtZCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgQ29tbWFuZE5vdEZvdW5kKCclczogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeScgJSBhcmdzWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgc2hlYmFuZyA9IHJlc29sdmVfc2hlYmFuZyhjbWQpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzaGViYW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZCA9IHNoZWJhbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kID0gW2NtZF0KKyAgICAgICAgICAgICAgICAgICAgYXJnc1swOjFdID0gY21kCisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgPSBVdGlsaXR5KGJ1aWx0aW4ucnVuX2NvbW1hbmQpCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgIyBDb21tYW5kIGV4ZWN1dGlvbgorICAgICAgICAgICAgICAgIGlmICdkZWJ1Zy1jbWQnIGluIHNlbGYuX2RlYnVnZmxhZ3M6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nKCdyZWRpcmVjdGlvbnMgJyArIHN0cihyZWRpcnMpICsgJ1xuJykKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcmVzID0gY29tbWFuZC5mdW5jKGFyZ3NbMF0sIGFyZ3NbMTpdLCBzZWxmLCBlbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlycy5zdGRpbigpLCByZWRpcnMuc3Rkb3V0KCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcnMuc3RkZXJyKCksIHNlbGYuX2RlYnVnZmxhZ3MpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIHNlbGYuX2Vudi5oYXNfb3B0KCcteCcpOgorICAgICAgICAgICAgICAgICMgVHJhY2UgY29tbWFuZCBleGVjdXRpb24gaW4gc2hlbGwgZW52aXJvbm1lbnQKKyAgICAgICAgICAgICAgICAjIEJVRzogd291bGQgYmUgaGFyZCB0byByZXByb2R1Y2UgYSByZWFsIHNoZWxsIGJlaGF2aW91ciBzaW5jZQorICAgICAgICAgICAgICAgICMgdGhlIEFTVCBpcyBub3QgYW5ub3RhdGVkIHdpdGggc291cmNlIGxpbmVzL3Rva2Vucy4KKyAgICAgICAgICAgICAgICBzZWxmLl9yZWRpcnMuc3Rkb3V0KCkud3JpdGUoJyAnLmpvaW4oYXJncykpCisgICAgICAgICAgICAgICAgCisgICAgICAgIGV4Y2VwdCBSZXR1cm5TaWduYWw6CisgICAgICAgICAgICByYWlzZQorICAgICAgICBleGNlcHQgU2hlbGxFcnJvciBhcyBlOgorICAgICAgICAgICAgaWYgaXNfc3BlY2lhbCBvciBpc2luc3RhbmNlKGUsIChFeGl0U2lnbmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaGVsbFN5bnRheEVycm9yLCBFeHBhbnNpb25FcnJvcikpOgorICAgICAgICAgICAgICAgIHJhaXNlIGUKKyAgICAgICAgICAgIHNlbGYuX3JlZGlycy5zdGRlcnIoKS53cml0ZShzdHIoZSkrJ1xuJykKKyAgICAgICAgICAgIHJldHVybiAxCisKKyAgICAgICAgcmV0dXJuIHJlcworCisgICAgZGVmIGV4cGFuZF90b2tlbihzZWxmLCB3b3JkKToKKyAgICAgICAgIiIiRXhwYW5kIGEgd29yZCBhcyBzcGVjaWZpZWQgaW4gWzIuNiBXb3JkIEV4cGFuc2lvbnNdLiBSZXR1cm4gdGhlIGxpc3QKKyAgICAgICAgb2YgZXhwYW5kZWQgd29yZHMuCisgICAgICAgICIiIgorICAgICAgICBzdGF0dXMsIHd0cmVlcyA9IHNlbGYuX2V4cGFuZF93b3JkKHdvcmQpCisgICAgICAgIHJldHVybiBtYXAocHlzaGxleC53b3JkdHJlZV9hc19zdHJpbmcsIHd0cmVlcykKKyAgICAgICAgCisgICAgZGVmIGV4cGFuZF92YXJpYWJsZShzZWxmLCB3b3JkKToKKyAgICAgICAgIiIiUmV0dXJuIGEgc3RhdHVzIGNvZGUgKG9yIE5vbmUgaWYgbm8gY29tbWFuZCBleHBhbnNpb24gb2NjdXJyZWQpCisgICAgICAgIGFuZCBhIHNpbmdsZSB3b3JkLgorICAgICAgICAiIiIKKyAgICAgICAgc3RhdHVzLCB3dHJlZXMgPSBzZWxmLl9leHBhbmRfd29yZCh3b3JkLCBwYXRobmFtZT1GYWxzZSwgc3BsaXQ9RmFsc2UpCisgICAgICAgIHdvcmRzID0gbWFwKHB5c2hsZXgud29yZHRyZWVfYXNfc3RyaW5nLCB3dHJlZXMpCisgICAgICAgIGFzc2VydCBsZW4od29yZHMpPT0xCisgICAgICAgIHJldHVybiBzdGF0dXMsIHdvcmRzWzBdCisgICAgICAgIAorICAgIGRlZiBleHBhbmRfaGVyZV9kb2N1bWVudChzZWxmLCB3b3JkKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBleHBhbmRlZCBkb2N1bWVudCBhcyBhIHNpbmdsZSB3b3JkLiBUaGUgaGVyZSBkb2N1bWVudCBpcyAKKyAgICAgICAgYXNzdW1lZCB0byBiZSB1bnF1b3RlZC4KKyAgICAgICAgIiIiCisgICAgICAgIHN0YXR1cywgd3RyZWVzID0gc2VsZi5fZXhwYW5kX3dvcmQod29yZCwgcGF0aG5hbWU9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BsaXQ9RmFsc2UsIGhlcmVfZG9jdW1lbnQ9VHJ1ZSkKKyAgICAgICAgd29yZHMgPSBtYXAocHlzaGxleC53b3JkdHJlZV9hc19zdHJpbmcsIHd0cmVlcykKKyAgICAgICAgYXNzZXJ0IGxlbih3b3Jkcyk9PTEKKyAgICAgICAgcmV0dXJuIHdvcmRzWzBdCisgICAgICAgIAorICAgIGRlZiBleHBhbmRfcmVkaXJlY3Rpb24oc2VsZiwgd29yZCk6CisgICAgICAgICIiIlJldHVybiBhIHNpbmdsZSB3b3JkLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5leHBhbmRfdmFyaWFibGUod29yZClbMV0KKyAgICAgICAgCisgICAgZGVmIGdldF9lbnYoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9lbnYKKyAgICAgICAgCisgICAgZGVmIF9leHBhbmRfd29yZChzZWxmLCB0b2tlbiwgcGF0aG5hbWU9VHJ1ZSwgc3BsaXQ9VHJ1ZSwgaGVyZV9kb2N1bWVudD1GYWxzZSk6CisgICAgICAgIHd0cmVlID0gcHlzaGxleC5tYWtlX3dvcmR0cmVlKHRva2VuWzFdLCBoZXJlX2RvY3VtZW50PWhlcmVfZG9jdW1lbnQpCisgICAgICAgIAorICAgICAgICAjIFRPRE86IGltcGxlbWVudCB0aWxkZSBleHBhbnNpb24KKyAgICAgICAgZGVmIGV4cGFuZCh3dHJlZSk6CisgICAgICAgICAgICAiIiJSZXR1cm4gYSBwc2V1ZG8gd29yZHRyZWU6IHRoZSB0cmVlIG9yIGl0cyBzdWJlbGVtZW50cyBjYW4gYmUgZW1wdHkKKyAgICAgICAgICAgIGxpc3RzIHdoZW4gbm8gdmFsdWUgcmVzdWx0IGZyb20gdGhlIGV4cGFuc2lvbi4KKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgc3RhdHVzID0gTm9uZQorICAgICAgICAgICAgZm9yIHBhcnQgaW4gd3RyZWU6CisgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UocGFydCwgbGlzdCk6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgcGFydFswXWluICgiJyIsICdcXCcpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGVsaWYgcGFydFswXSBpbiAoJ2AnLCAnJCgnKToKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCByZXN1bHQgPSBzZWxmLl9leHBhbmRfY29tbWFuZChwYXJ0KQorICAgICAgICAgICAgICAgICAgICBwYXJ0WzpdID0gcmVzdWx0CisgICAgICAgICAgICAgICAgZWxpZiBwYXJ0WzBdIGluICgnJCcsICckeycpOgorICAgICAgICAgICAgICAgICAgICBwYXJ0WzpdID0gc2VsZi5fZXhwYW5kX3BhcmFtZXRlcihwYXJ0LCB3dHJlZVswXT09JyInLCBzcGxpdCkKKyAgICAgICAgICAgICAgICBlbGlmIHBhcnRbMF0gaW4gKCcnLCAnIicpOgorICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIHJlc3VsdCA9IGV4cGFuZChwYXJ0KQorICAgICAgICAgICAgICAgICAgICBwYXJ0WzpdID0gcmVzdWx0CisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignJXMgZXhwYW5zaW9uIGlzIG5vdCBpbXBsZW1lbnRlZCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIHBhcnRbMF0pCisgICAgICAgICAgICAjIFtdIGlzIHJldHVybmVkIHdoZW4gYW4gZXhwYW5zaW9uIHJlc3VsdCBpbiBuby1maWVsZCwKKyAgICAgICAgICAgICMgbGlrZSBhbiBlbXB0eSAkQAorICAgICAgICAgICAgd3RyZWUgPSBbcCBmb3IgcCBpbiB3dHJlZSBpZiBwICE9IFtdXQorICAgICAgICAgICAgaWYgbGVuKHd0cmVlKSA8IDM6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1cywgW10KKyAgICAgICAgICAgIHJldHVybiBzdGF0dXMsIHd0cmVlCisgICAgICAgIAorICAgICAgICBzdGF0dXMsIHd0cmVlID0gZXhwYW5kKHd0cmVlKQorICAgICAgICBpZiBsZW4od3RyZWUpID09IDA6CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzLCB3dHJlZQorICAgICAgICB3dHJlZSA9IHB5c2hsZXgubm9ybWFsaXplX3dvcmR0cmVlKHd0cmVlKQorICAgICAgICAKKyAgICAgICAgaWYgc3BsaXQ6CisgICAgICAgICAgICB3dHJlZXMgPSBzZWxmLl9zcGxpdF9maWVsZHMod3RyZWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB3dHJlZXMgPSBbd3RyZWVdCisgICAgICAgIAorICAgICAgICBpZiBwYXRobmFtZToKKyAgICAgICAgICAgIHd0cmVlcyA9IG1hcHBlbmQoc2VsZi5fZXhwYW5kX3BhdGhuYW1lLCB3dHJlZXMpCisgICAgICAgIAorICAgICAgICB3dHJlZXMgPSBtYXAoc2VsZi5fcmVtb3ZlX3F1b3Rlcywgd3RyZWVzKQorICAgICAgICByZXR1cm4gc3RhdHVzLCB3dHJlZXMKKyAgICAgICAgCisgICAgZGVmIF9leHBhbmRfY29tbWFuZChzZWxmLCB3dHJlZSk6CisgICAgICAgICMgQlVHOiB0aGVyZSBpcyBzb21ldGhpbmcgdG8gZG8gd2l0aCBiYWNrc2xhc2hlcyBhbmQgcXVvdGVkCisgICAgICAgICMgY2hhcmFjdGVycyBoZXJlCisgICAgICAgIGNvbW1hbmQgPSBweXNobGV4LndvcmR0cmVlX2FzX3N0cmluZyh3dHJlZVsxOi0xXSkKKyAgICAgICAgc3RhdHVzLCBvdXRwdXQgPSBzZWxmLnN1YnNoZWxsX291dHB1dChjb21tYW5kKQorICAgICAgICByZXR1cm4gc3RhdHVzLCBbJycsIG91dHB1dCwgJyddCisgICAgICAgIAorICAgIGRlZiBfZXhwYW5kX3BhcmFtZXRlcihzZWxmLCB3dHJlZSwgcXVvdGVkPUZhbHNlLCBzcGxpdD1GYWxzZSk6CisgICAgICAgICIiIlJldHVybiBhIHZhbGlkIHd0cmVlIG9yIGFuIGVtcHR5IGxpc3Qgd2hlbiBubyBwYXJhbWV0ZXIgcmVzdWx0cy4iIiIKKyAgICAgICAgIyBHZXQgdGhlIHBhcmFtZXRlciBuYW1lCisgICAgICAgICMgVE9ETzogaW1wbGVtZW50IHdlaXJkIGV4cGFuc2lvbiBydWxlcyB3aXRoICc6JworICAgICAgICBuYW1lID0gcHlzaGxleC53b3JkdHJlZV9hc19zdHJpbmcod3RyZWVbMTotMV0pCisgICAgICAgIGlmIG5vdCBpc19uYW1lKG5hbWUpIGFuZCBub3QgaXNfc3BlY2lhbF9wYXJhbShuYW1lKToKKyAgICAgICAgICAgIHJhaXNlIEV4cGFuc2lvbkVycm9yKCdCYWQgc3Vic3RpdHV0aW9uICIlcyInICUgbmFtZSkKKyAgICAgICAgIyBUT0RPOiBpbXBsZW1lbnQgc3BlY2lhbCBwYXJhbWV0ZXJzCisgICAgICAgIGlmIG5hbWUgaW4gKCdAJywgJyonKToKKyAgICAgICAgICAgIGFyZ3MgPSBzZWxmLl9lbnYuZ2V0X3Bvc2l0aW9uYWxfYXJncygpCisgICAgICAgICAgICBpZiBsZW4oYXJncykgPT0gMDoKKyAgICAgICAgICAgICAgICByZXR1cm4gW10KKyAgICAgICAgICAgIGlmIGxlbihhcmdzKTwyOgorICAgICAgICAgICAgICAgIHJldHVybiBbJycsICcnLmpvaW4oYXJncyksICcnXQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgc2VwID0gc2VsZi5fZW52LmdldCgnSUZTJywgJycpWzoxXQorICAgICAgICAgICAgaWYgc3BsaXQgYW5kIHF1b3RlZCBhbmQgbmFtZT09J0AnOgorICAgICAgICAgICAgICAgICMgSW50cm9kdWNlIGEgbmV3IHRva2VuIHRvIHRlbGwgdGhlIGNhbGxlciB0aGF0IHRoZXNlIHBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICAjIGNhdXNlIGEgc3BsaXQgYXMgc3BlY2lmaWVkIGluIDIuNS4yCisgICAgICAgICAgICAgICAgcmV0dXJuIFsnQCddICsgYXJncyArIFsnJ10KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIFsnJywgc2VwLmpvaW4oYXJncyksICcnXSAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIHJldHVybiBbJycsIHNlbGYuX2Vudi5nZXQobmFtZSwgJycpLCAnJ10KKyAgICAgICAgCisgICAgZGVmIF9zcGxpdF9maWVsZHMoc2VsZiwgd3RyZWUpOgorICAgICAgICBkZWYgaXNfZW1wdHkoc3BsaXQpOgorICAgICAgICAgICAgcmV0dXJuIHNwbGl0PT1bJycsICcnLCAnJ10KKyAgICAgICAgICAgIAorICAgICAgICBkZWYgc3BsaXRfcG9zaXRpb25hbChxdW90ZWQpOgorICAgICAgICAgICAgIyBSZXR1cm4gYSBsaXN0IG9mIHd0cmVlIHNwbGl0IGFjY29yZGluZyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgcnVsZXMuCisgICAgICAgICAgICAjIEFsbCByZW1haW5pbmcgJ0AnIGdyb3VwcyBhcmUgcmVtb3ZlZC4KKyAgICAgICAgICAgIGFzc2VydCBxdW90ZWRbMF09PSciJworICAgICAgICAgICAgCisgICAgICAgICAgICBzcGxpdHMgPSBbW11dCisgICAgICAgICAgICBmb3IgcGFydCBpbiBxdW90ZWQ6CisgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UocGFydCwgbGlzdCkgb3IgcGFydFswXSE9J0AnOgorICAgICAgICAgICAgICAgICAgICBzcGxpdHNbLTFdLmFwcGVuZChwYXJ0KQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgRW1wdHkgb3Igc2luZ2xlIGFyZ3VtZW50IGxpc3Qgd2VyZSBkZWFsdCB3aXRoIGFscmVhZHkKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGxlbihwYXJ0KT4zCisgICAgICAgICAgICAgICAgICAgICMgRmlyc3QgYXJndW1lbnQgbXVzdCBqb2luIHdpdGggdGhlIGJlZ2lubmluZyBwYXJ0IG9mIHRoZSBvcmlnaW5hbCB3b3JkCisgICAgICAgICAgICAgICAgICAgIHNwbGl0c1stMV0uYXBwZW5kKHBhcnRbMV0pCisgICAgICAgICAgICAgICAgICAgICMgQ3JlYXRlIGRvdWJsZS1xdW90ZXMgZXhwcmVzc2lvbnMgZm9yIGV2ZXJ5IGFyZ3VtZW50IGFmdGVyIHRoZSBmaXJzdAorICAgICAgICAgICAgICAgICAgICBmb3IgYXJnIGluIHBhcnRbMjotMV06CisgICAgICAgICAgICAgICAgICAgICAgICBzcGxpdHNbLTFdLmFwcGVuZCgnIicpCisgICAgICAgICAgICAgICAgICAgICAgICBzcGxpdHMuYXBwZW5kKFsnIicsIGFyZ10pCisgICAgICAgICAgICByZXR1cm4gc3BsaXRzCisgICAgICAgIAorICAgICAgICAjIEF0IHRoaXMgcG9pbnQsIGFsbCBleHBhbnNpb25zIGJ1dCBwYXRobmFtZXMgaGF2ZSBvY2N1cmVkLiBPbmx5IHF1b3RlZAorICAgICAgICAjIGFuZCBwb3NpdGlvbmFsIHNlcXVlbmNlcyByZW1haW4uIFRodXMsIGFsbCBjYW5kaWRhdGVzIGZvciBmaWVsZCBzcGxpdHRpbmcgCisgICAgICAgICMgYXJlIGluIHRoZSB0cmVlIHJvb3QsIG9yIGFyZSBwb3NpdGlvbmFsIHNwbGl0cyAoJ0AnKSBhbmQgbGllIGluIHJvb3QKKyAgICAgICAgIyBjaGlsZHJlbi4KKyAgICAgICAgaWYgbm90IHd0cmVlIG9yIHd0cmVlWzBdIG5vdCBpbiAoJycsICciJyk6CisgICAgICAgICAgICAjIFRoZSB3aG9sZSB0b2tlbiBpcyBxdW90ZWQgb3IgZW1wdHksIG5vdGhpbmcgdG8gc3BsaXQKKyAgICAgICAgICAgIHJldHVybiBbd3RyZWVdCisgICAgICAgICAgICAKKyAgICAgICAgaWYgd3RyZWVbMF09PSciJzoKKyAgICAgICAgICAgIHd0cmVlID0gWycnLCB3dHJlZSwgJyddCisgICAgICAgIAorICAgICAgICByZXN1bHQgPSBbWycnLCAnJ11dCisgICAgICAgIGZvciBwYXJ0IGluIHd0cmVlWzE6LTFdOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShwYXJ0LCBsaXN0KToKKyAgICAgICAgICAgICAgICBpZiBwYXJ0WzBdPT0nIic6CisgICAgICAgICAgICAgICAgICAgIHNwbGl0cyA9IHNwbGl0X3Bvc2l0aW9uYWwocGFydCkKKyAgICAgICAgICAgICAgICAgICAgaWYgbGVuKHNwbGl0cyk8PTE6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbLTFdICs9IFtwYXJ0LCAnJ10KKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgVGVybWluYXRlIHRoZSBjdXJyZW50IHNwbGl0CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbLTFdICs9IFtzcGxpdHNbMF0sICcnXQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHNwbGl0c1sxOi0xXQorICAgICAgICAgICAgICAgICAgICAgICAgIyBDcmVhdGUgYSBuZXcgc3BsaXQKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBbWycnLCBzcGxpdHNbLTFdLCAnJ11dCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0Wy0xXSArPSBbcGFydCwgJyddCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNwbGl0cyA9IHNlbGYuX2Vudi5zcGxpdF9maWVsZHMocGFydCkKKyAgICAgICAgICAgICAgICBpZiBsZW4oc3BsaXRzKTw9MToKKyAgICAgICAgICAgICAgICAgICAgIyBObyBzcGxpdAorICAgICAgICAgICAgICAgICAgICByZXN1bHRbLTFdWy0xXSArPSBwYXJ0CisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyBUZXJtaW5hdGUgdGhlIGN1cnJlbnQgcmVzdWx0aW5nIHBhcnQgYW5kIGNyZWF0ZSBhIG5ldyBvbmUKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0Wy0xXVstMV0gKz0gc3BsaXRzWzBdCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFstMV0uYXBwZW5kKCcnKQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gW1snJywgciwgJyddIGZvciByIGluIHNwbGl0c1sxOi0xXV0KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IFtbJycsIHNwbGl0c1stMV1dXQorICAgICAgICByZXN1bHRbLTFdLmFwcGVuZCgnJykKKyAgICAgICAgCisgICAgICAgICMgTGVhZGluZyBhbmQgdHJhaWxpbmcgZW1wdHkgZ3JvdXBzIGNvbWUgZnJvbSBsZWFkaW5nL3RyYWlsaW5nIGJsYW5rcworICAgICAgICBpZiByZXN1bHQgYW5kIGlzX2VtcHR5KHJlc3VsdFstMV0pOgorICAgICAgICAgICAgcmVzdWx0Wy0xOl0gPSBbXQorICAgICAgICBpZiByZXN1bHQgYW5kIGlzX2VtcHR5KHJlc3VsdFswXSk6CisgICAgICAgICAgICByZXN1bHRbOjFdID0gW10KKyAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICAgICAKKyAgICBkZWYgX2V4cGFuZF9wYXRobmFtZShzZWxmLCB3dHJlZSk6CisgICAgICAgICIiIlNlZSBbMi42LjYgUGF0aG5hbWUgRXhwYW5zaW9uXS4iIiIKKyAgICAgICAgaWYgc2VsZi5fZW52Lmhhc19vcHQoJy1mJyk6CisgICAgICAgICAgICByZXR1cm4gW3d0cmVlXQorICAgICAgICAKKyAgICAgICAgIyBBbGwgZXhwYW5zaW9ucyBoYXZlIGJlZW4gcGVyZm9ybWVkLCBvbmx5IHF1b3RlZCBzZXF1ZW5jZXMgc2hvdWxkIHJlbWFpbgorICAgICAgICAjIGluIHRoZSB0cmVlLiBHZW5lcmF0ZSB0aGUgcGF0dGVybiBieSBmb2xkaW5nIHRoZSB0cmVlLCBlc2NhcGluZyBzcGVjaWFsCisgICAgICAgICMgY2hhcmFjdGVycyB3aGVuIGFwcGVhciBxdW90ZWQKKyAgICAgICAgc3BlY2lhbF9jaGFycyA9ICcqP1tdJworICAgICAgICAKKyAgICAgICAgZGVmIG1ha2VfcGF0dGVybih3dHJlZSk6CisgICAgICAgICAgICBzdWJwYXR0ZXJuID0gW10KKyAgICAgICAgICAgIGZvciBwYXJ0IGluIHd0cmVlWzE6LTFdOgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocGFydCwgbGlzdCk6CisgICAgICAgICAgICAgICAgICAgIHBhcnQgPSBtYWtlX3BhdHRlcm4ocGFydCkKKyAgICAgICAgICAgICAgICBlbGlmIHd0cmVlWzBdIT0nJzoKKyAgICAgICAgICAgICAgICAgICAgZm9yIGMgaW4gcGFydDoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgTWV0YS1jaGFyYWN0ZXJzIGNhbm5vdCBiZSBxdW90ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGMgaW4gc3BlY2lhbF9jaGFyczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBHbG9iRXJyb3IoKQorICAgICAgICAgICAgICAgIHN1YnBhdHRlcm4uYXBwZW5kKHBhcnQpCisgICAgICAgICAgICByZXR1cm4gJycuam9pbihzdWJwYXR0ZXJuKQorICAgICAgICAgICAgCisgICAgICAgIGRlZiBwd2RfZ2xvYihwYXR0ZXJuKToKKyAgICAgICAgICAgIGN3ZCA9IG9zLmdldGN3ZCgpCisgICAgICAgICAgICBvcy5jaGRpcihzZWxmLl9lbnZbJ1BXRCddKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJldHVybiBnbG9iLmdsb2IocGF0dGVybikgCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIG9zLmNoZGlyKGN3ZCkgICAgCisgICAgICAgICAgICAKKyAgICAgICAgI1RPRE86IGNoZWNrIHdvcmtpbmcgZGlyZWN0b3J5IGlzc3VlcyBoZXJlIHdydCByZWxhdGl2ZSBwYXR0ZXJucworICAgICAgICB0cnk6CisgICAgICAgICAgICBwYXR0ZXJuID0gbWFrZV9wYXR0ZXJuKHd0cmVlKQorICAgICAgICAgICAgcGF0aHMgPSBwd2RfZ2xvYihwYXR0ZXJuKQorICAgICAgICBleGNlcHQgR2xvYkVycm9yOgorICAgICAgICAgICAgIyBCVUc6IE1ldGEtY2hhcmFjdGVycyB3ZXJlIGZvdW5kIGluIHF1b3RlZCBzZXF1ZW5jZXMuIFRoZSBzaG91bGQgCisgICAgICAgICAgICAjIGhhdmUgYmVlbiB1c2VkIGxpdGVyYWxseSBidXQgdGhpcyBpcyB1bnN1cHBvcnRlZCBpbiBjdXJyZW50IGdsb2IgbW9kdWxlLgorICAgICAgICAgICAgIyBJbnN0ZWFkIHdlIGNvbnNpZGVyIHRoZSB3aG9sZSB0cmVlIG11c3QgYmUgdXNlZCBsaXRlcmFsbHkgYW5kCisgICAgICAgICAgICAjIHRoZXJlZm9yZSB0aGVyZSBpcyBubyBwb2ludCBpbiBnbG9iYmluZy4gVGhpcyBpcyB3cm9uZyB3aGVuIG1ldGEKKyAgICAgICAgICAgICMgY2hhcmFjdGVycyBhcmUgbWl4ZWQgd2l0aCBxdW90ZWQgbWV0YSBpbiB0aGUgc2FtZSBwYXR0ZXJuIGxpa2U6CisgICAgICAgICAgICAjIDwgZm9vKiJweSoiID4KKyAgICAgICAgICAgIHBhdGhzID0gW10KKyAgICAgICAgICAgIAorICAgICAgICBpZiBub3QgcGF0aHM6CisgICAgICAgICAgICByZXR1cm4gW3d0cmVlXQorICAgICAgICByZXR1cm4gW1snJywgcGF0aCwgJyddIGZvciBwYXRoIGluIHBhdGhzXQorICAgICAgICAKKyAgICBkZWYgX3JlbW92ZV9xdW90ZXMoc2VsZiwgd3RyZWUpOgorICAgICAgICAiIiJTZWUgWzIuNi43IFF1b3RlIFJlbW92YWxdLiIiIgorICAgICAgICAKKyAgICAgICAgZGVmIHVucXVvdGUod3RyZWUpOgorICAgICAgICAgICAgdW5xdW90ZWQgPSBbXQorICAgICAgICAgICAgZm9yIHBhcnQgaW4gd3RyZWVbMTotMV06CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShwYXJ0LCBsaXN0KToKKyAgICAgICAgICAgICAgICAgICAgcGFydCA9IHVucXVvdGUocGFydCkKKyAgICAgICAgICAgICAgICB1bnF1b3RlZC5hcHBlbmQocGFydCkKKyAgICAgICAgICAgIHJldHVybiAnJy5qb2luKHVucXVvdGVkKQorICAgICAgICAgICAgCisgICAgICAgIHJldHVybiBbJycsIHVucXVvdGUod3RyZWUpLCAnJ10KKyAgICAgICAgCisgICAgZGVmIHN1YnNoZWxsKHNlbGYsIHNjcmlwdD1Ob25lLCBhc3Q9Tm9uZSwgcmVkaXJzPU5vbmUpOgorICAgICAgICAiIiJFeGVjdXRlIHRoZSBzY3JpcHQgb3IgQVNUIGluIGEgc3Vic2hlbGwsIHdpdGggaW5oZXJpdGVkIHJlZGlyZWN0aW9ucworICAgICAgICBpZiByZWRpcnMgaXMgbm90IE5vbmUuCisgICAgICAgICIiIgorICAgICAgICBpZiByZWRpcnM6CisgICAgICAgICAgICBzdWJfcmVkaXJzID0gcmVkaXJzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdWJfcmVkaXJzID0gcmVkaXJzLmNsb25lKCkKKyAgICAgICAgCisgICAgICAgIHN1YnNoZWxsID0gTm9uZSAgICAKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3Vic2hlbGwgPSBJbnRlcnByZXRlcihOb25lLCBzZWxmLl9kZWJ1Z2ZsYWdzLCBzZWxmLl9lbnYuY2xvbmUoVHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl9yZWRpcnMsIG9wdHM9c2VsZi5fb3B0aW9ucykKKyAgICAgICAgICAgIHJldHVybiBzdWJzaGVsbC5leGVjdXRlX3NjcmlwdChzY3JpcHQsIGFzdCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIG5vdCByZWRpcnM6IHN1Yl9yZWRpcnMuY2xvc2UoKQorICAgICAgICAgICAgaWYgc3Vic2hlbGw6IHN1YnNoZWxsLmNsb3NlKCkKKyAgICAgICAgCisgICAgZGVmIHN1YnNoZWxsX291dHB1dChzZWxmLCBzY3JpcHQpOgorICAgICAgICAiIiJFeGVjdXRlIHRoZSBzY3JpcHQgaW4gYSBzdWJzaGVsbCBhbmQgcmV0dXJuIHRoZSBjYXB0dXJlZCBvdXRwdXQuIiIiICAgICAgICAKKyAgICAgICAgIyBDcmVhdGUgdGVtcG9yYXJ5IGZpbGUgdG8gY2FwdHVyZSBzdWJzaGVsbCBvdXRwdXQKKyAgICAgICAgdG1wZmQsIHRtcHBhdGggPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdG1wZmlsZSA9IG9zLmZkb3Blbih0bXBmZCwgJ3diJykKKyAgICAgICAgICAgIHN0ZG91dCA9IEZpbGVXcmFwcGVyKCd3JywgdG1wZmlsZSkKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmVkaXJzID0gUmVkaXJlY3Rpb25zKHNlbGYuX3JlZGlycy5zdGRpbigpLmR1cCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9yZWRpcnMuc3RkZXJyKCkuZHVwKCkpICAgICAgICAgICAgCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc2VsZi5zdWJzaGVsbChzY3JpcHQ9c2NyaXB0LCByZWRpcnM9cmVkaXJzKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICByZWRpcnMuY2xvc2UoKQorICAgICAgICAgICAgICAgIHJlZGlycyA9IE5vbmUKKyAgICAgICAgICAgIAorICAgICAgICAgICAgIyBFeHRyYWN0IHN1YnNoZWxsIHN0YW5kYXJkIG91dHB1dAorICAgICAgICAgICAgdG1wZmlsZSA9IG9wZW4odG1wcGF0aCwgJ3JiJykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvdXRwdXQgPSB0bXBmaWxlLnJlYWQoKQorICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXMsIG91dHB1dC5yc3RyaXAoJ1xuJykKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgdG1wZmlsZS5jbG9zZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5yZW1vdmUodG1wcGF0aCkKKworICAgIGRlZiBfYXN5bmNsaXN0KHNlbGYsIGNtZCk6CisgICAgICAgIGFyZ3MgPSAoc2VsZi5fZW52LmdldF92YXJpYWJsZXMoKSwgY21kKQorICAgICAgICBhcmcgPSBlbmNvZGVhcmdzKGFyZ3MpCisgICAgICAgIGFzc2VydCBsZW4oYXJncykgPCAzMCoxMDI0CisgICAgICAgIGNtZCA9IFsncHlzaC5iYXQnLCAnLS1hc3QnLCAnLWMnLCBhcmddCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKGNtZCwgY3dkPXNlbGYuX2VudlsnUFdEJ10pCisgICAgICAgIHNlbGYuX2NoaWxkcmVuW3AucGlkXSA9IHAKKyAgICAgICAgc2VsZi5fZW52WychJ10gPSBwLnBpZAorICAgICAgICByZXR1cm4gMAorCisgICAgZGVmIHdhaXQoc2VsZiwgcGlkcz1Ob25lKToKKyAgICAgICAgaWYgbm90IHBpZHM6CisgICAgICAgICAgICBwaWRzID0gc2VsZi5fY2hpbGRyZW4ua2V5cygpCisKKyAgICAgICAgc3RhdHVzID0gMTI3CisgICAgICAgIGZvciBwaWQgaW4gcGlkczoKKyAgICAgICAgICAgIGlmIHBpZCBub3QgaW4gc2VsZi5fY2hpbGRyZW46CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHAgPSBzZWxmLl9jaGlsZHJlbi5wb3AocGlkKQorICAgICAgICAgICAgc3RhdHVzID0gcC53YWl0KCkKKworICAgICAgICByZXR1cm4gc3RhdHVzCisKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3B5c2gvbHNwcm9mLnB5IGIvYml0YmFrZS9saWIvYmIvcHlzaC9sc3Byb2YucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE4MzFjMgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3B5c2gvbHNwcm9mLnB5CkBAIC0wLDAgKzEsMTE2IEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisKK2ltcG9ydCBzeXMKK2Zyb20gX2xzcHJvZiBpbXBvcnQgUHJvZmlsZXIsIHByb2ZpbGVyX2VudHJ5CisKK19fYWxsX18gPSBbJ3Byb2ZpbGUnLCAnU3RhdHMnXQorCitkZWYgcHJvZmlsZShmLCAqYXJncywgKiprd2RzKToKKyAgICAiIiJYWFggZG9jc3RyaW5nIiIiCisgICAgcCA9IFByb2ZpbGVyKCkKKyAgICBwLmVuYWJsZShzdWJjYWxscz1UcnVlLCBidWlsdGlucz1UcnVlKQorICAgIHRyeToKKyAgICAgICAgZigqYXJncywgKiprd2RzKQorICAgIGZpbmFsbHk6CisgICAgICAgIHAuZGlzYWJsZSgpCisgICAgcmV0dXJuIFN0YXRzKHAuZ2V0c3RhdHMoKSkKKworCitjbGFzcyBTdGF0cyhvYmplY3QpOgorICAgICIiIlhYWCBkb2NzdHJpbmciIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5kYXRhID0gZGF0YQorCisgICAgZGVmIHNvcnQoc2VsZiwgY3JpdD0iaW5saW5ldGltZSIpOgorICAgICAgICAiIiJYWFggZG9jc3RyaW5nIiIiCisgICAgICAgIGlmIGNyaXQgbm90IGluIHByb2ZpbGVyX2VudHJ5Ll9fZGljdF9fOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQ2FuJ3Qgc29ydCBieSAlcyIgJSBjcml0KQorICAgICAgICBzZWxmLmRhdGEuc29ydChsYW1iZGEgYiwgYTogY21wKGdldGF0dHIoYSwgY3JpdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0YXR0cihiLCBjcml0KSkpCisgICAgICAgIGZvciBlIGluIHNlbGYuZGF0YToKKyAgICAgICAgICAgIGlmIGUuY2FsbHM6CisgICAgICAgICAgICAgICAgZS5jYWxscy5zb3J0KGxhbWJkYSBiLCBhOiBjbXAoZ2V0YXR0cihhLCBjcml0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRhdHRyKGIsIGNyaXQpKSkKKworICAgIGRlZiBwcHJpbnQoc2VsZiwgdG9wPU5vbmUsIGZpbGU9Tm9uZSwgbGltaXQ9Tm9uZSwgY2xpbWl0PU5vbmUpOgorICAgICAgICAiIiJYWFggZG9jc3RyaW5nIiIiCisgICAgICAgIGlmIGZpbGUgaXMgTm9uZToKKyAgICAgICAgICAgIGZpbGUgPSBzeXMuc3Rkb3V0CisgICAgICAgIGQgPSBzZWxmLmRhdGEKKyAgICAgICAgaWYgdG9wIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZCA9IGRbOnRvcF0KKyAgICAgICAgY29scyA9ICIlIDEycyAlMTJzICUxMS40ZiAlMTEuNGYgICAlc1xuIgorICAgICAgICBoY29scyA9ICIlIDEycyAlMTJzICUxMnMgJTEycyAlc1xuIgorICAgICAgICBjb2xzMiA9ICIrJTEycyAlMTJzICUxMS40ZiAlMTEuNGYgKyAgJXNcbiIKKyAgICAgICAgZmlsZS53cml0ZShoY29scyAlICgiQ2FsbENvdW50IiwgIlJlY3Vyc2l2ZSIsICJUb3RhbChtcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmxpbmUobXMpIiwgIm1vZHVsZTpsaW5lbm8oZnVuY3Rpb24pIikpCisgICAgICAgIGNvdW50ID0gMAorICAgICAgICBmb3IgZSBpbiBkOgorICAgICAgICAgICAgZmlsZS53cml0ZShjb2xzICUgKGUuY2FsbGNvdW50LCBlLnJlY2NhbGxjb3VudCwgZS50b3RhbHRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5pbmxpbmV0aW1lLCBsYWJlbChlLmNvZGUpKSkKKyAgICAgICAgICAgIGNvdW50ICs9IDEKKyAgICAgICAgICAgIGlmIGxpbWl0IGlzIG5vdCBOb25lIGFuZCBjb3VudCA9PSBsaW1pdDoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGNjb3VudCA9IDAKKyAgICAgICAgICAgIGlmIGUuY2FsbHM6CisgICAgICAgICAgICAgICAgZm9yIHNlIGluIGUuY2FsbHM6CisgICAgICAgICAgICAgICAgICAgIGZpbGUud3JpdGUoY29scyAlICgiKyVzIiAlIHNlLmNhbGxjb3VudCwgc2UucmVjY2FsbGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2UudG90YWx0aW1lLCBzZS5pbmxpbmV0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIislcyIgJSBsYWJlbChzZS5jb2RlKSkpCisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDEKKyAgICAgICAgICAgICAgICAgICAgY2NvdW50ICs9IDEKKyAgICAgICAgICAgICAgICAgICAgaWYgbGltaXQgaXMgbm90IE5vbmUgYW5kIGNvdW50ID09IGxpbWl0OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgICAgIGlmIGNsaW1pdCBpcyBub3QgTm9uZSBhbmQgY2NvdW50ID09IGNsaW1pdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICBkZWYgZnJlZXplKHNlbGYpOgorICAgICAgICAiIiJSZXBsYWNlIGFsbCByZWZlcmVuY2VzIHRvIGNvZGUgb2JqZWN0cyB3aXRoIHN0cmluZworICAgICAgICBkZXNjcmlwdGlvbnM7IHRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gcGlja2xlIHRoZSBpbnN0YW5jZS4iIiIKKworICAgICAgICAjIHRoaXMgY29kZSBpcyBwcm9iYWJseSByYXRoZXIgaWNraWVyIHRoYW4gaXQgbmVlZHMgdG8gYmUhCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLmRhdGEpKToKKyAgICAgICAgICAgIGUgPSBzZWxmLmRhdGFbaV0KKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGUuY29kZSwgc3RyKToKKyAgICAgICAgICAgICAgICBzZWxmLmRhdGFbaV0gPSB0eXBlKGUpKChsYWJlbChlLmNvZGUpLCkgKyBlWzE6XSkKKyAgICAgICAgICAgIGlmIGUuY2FsbHM6CisgICAgICAgICAgICAgICAgZm9yIGogaW4gcmFuZ2UobGVuKGUuY2FsbHMpKToKKyAgICAgICAgICAgICAgICAgICAgc2UgPSBlLmNhbGxzW2pdCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHNlLmNvZGUsIHN0cik6CisgICAgICAgICAgICAgICAgICAgICAgICBlLmNhbGxzW2pdID0gdHlwZShzZSkoKGxhYmVsKHNlLmNvZGUpLCkgKyBzZVsxOl0pCisKK19mbjJtb2QgPSB7fQorCitkZWYgbGFiZWwoY29kZSk6CisgICAgaWYgaXNpbnN0YW5jZShjb2RlLCBzdHIpOgorICAgICAgICByZXR1cm4gY29kZQorICAgIHRyeToKKyAgICAgICAgbW5hbWUgPSBfZm4ybW9kW2NvZGUuY29fZmlsZW5hbWVdCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICBmb3IgaywgdiBpbiBzeXMubW9kdWxlcy5pdGVtcygpOgorICAgICAgICAgICAgaWYgdiBpcyBOb25lOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBub3QgaGFzYXR0cih2LCAnX19maWxlX18nKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uodi5fX2ZpbGVfXywgc3RyKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgdi5fX2ZpbGVfXy5zdGFydHN3aXRoKGNvZGUuY29fZmlsZW5hbWUpOgorICAgICAgICAgICAgICAgIG1uYW1lID0gX2ZuMm1vZFtjb2RlLmNvX2ZpbGVuYW1lXSA9IGsKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgbW5hbWUgPSBfZm4ybW9kW2NvZGUuY29fZmlsZW5hbWVdID0gJzwlcz4nJWNvZGUuY29fZmlsZW5hbWUKKworICAgIHJldHVybiAnJXM6JWQoJXMpJyAlIChtbmFtZSwgY29kZS5jb19maXJzdGxpbmVubywgY29kZS5jb19uYW1lKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaW1wb3J0IG9zCisgICAgc3lzLmFyZ3YgPSBzeXMuYXJndlsxOl0KKyAgICBpZiBub3Qgc3lzLmFyZ3Y6CisgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICJ1c2FnZTogbHNwcm9mLnB5IDxzY3JpcHQ+IDxhcmd1bWVudHMuLi4+IgorICAgICAgICBzeXMuZXhpdCgyKQorICAgIHN5cy5wYXRoLmluc2VydCgwLCBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKHN5cy5hcmd2WzBdKSkpCisgICAgc3RhdHMgPSBwcm9maWxlKGV4ZWNmaWxlLCBzeXMuYXJndlswXSwgZ2xvYmFscygpLCBsb2NhbHMoKSkKKyAgICBzdGF0cy5zb3J0KCkKKyAgICBzdGF0cy5wcHJpbnQoKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvcHlzaC9weXNoLnB5IGIvYml0YmFrZS9saWIvYmIvcHlzaC9weXNoLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZTYxNDUKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9weXNoL3B5c2gucHkKQEAgLTAsMCArMSwxNjcgQEAKKyMgcHlzaC5weSAtIGNvbW1hbmQgcHJvY2Vzc2luZyBmb3IgcHlzaC4KKyMKKyMgQ29weXJpZ2h0IDIwMDcgUGF0cmljayBNZXphcmQKKyMKKyMgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCitpbXBvcnQgb3B0cGFyc2UKK2ltcG9ydCBvcworaW1wb3J0IHN5cworCitpbXBvcnQgaW50ZXJwCisKK1NIX09QVCA9IG9wdHBhcnNlLk9wdGlvblBhcnNlcihwcm9nPSdweXNoJywgdXNhZ2U9IiVwcm9nIFtPUFRJT05TXSIsIHZlcnNpb249JzAuMScpCitTSF9PUFQuYWRkX29wdGlvbignLWMnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZXN0PSdjb21tYW5kX3N0cmluZycsIGRlZmF1bHQ9Tm9uZSwgCisgICAgaGVscD0nQSBzdHJpbmcgdGhhdCBzaGFsbCBiZSBpbnRlcnByZXRlZCBieSB0aGUgc2hlbGwgYXMgb25lIG9yIG1vcmUgY29tbWFuZHMnKQorU0hfT1BULmFkZF9vcHRpb24oJy0tcmVkaXJlY3QtdG8nLCBkZXN0PSdyZWRpcmVjdF90bycsIGRlZmF1bHQ9Tm9uZSwgCisgICAgaGVscD0nUmVkaXJlY3Qgc2NyaXB0IGNvbW1hbmRzIHN0ZG91dCBhbmQgc3RkZXJyIHRvIHRoZSBzcGVjaWZpZWQgZmlsZScpCisjIFNlZSB1dGlsaXR5X2NvbW1hbmQgaW4gYnVpbHRpbi5weSBhYm91dCB0aGUgcmVhc29uIGZvciB0aGlzIGZsYWcuCitTSF9PUFQuYWRkX29wdGlvbignLS1yZWRpcmVjdGVkJywgZGVzdD0ncmVkaXJlY3RlZCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlZmF1bHQ9RmFsc2UsIAorICAgIGhlbHA9J1RlbGwgdGhlIGludGVycHJldGVyIHRoYXQgc3Rkb3V0IGFuZCBzdGRlcnIgYXJlIGFjdHVhbGx5IHRoZSBzYW1lIG9iamVjdHMsIHdoaWNoIGlzIHJlYWxseSBzdGRvdXQnKQorU0hfT1BULmFkZF9vcHRpb24oJy0tZGVidWctcGFyc2luZycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlc3Q9J2RlYnVnX3BhcnNpbmcnLCBkZWZhdWx0PUZhbHNlLCAKKyAgICBoZWxwPSdUcmFjZSBQTFkgZXhlY3V0aW9uJykKK1NIX09QVC5hZGRfb3B0aW9uKCctLWRlYnVnLXRyZWUnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZXN0PSdkZWJ1Z190cmVlJywgZGVmYXVsdD1GYWxzZSwgCisgICAgaGVscD0nRGlzcGxheSB0aGUgZ2VuZXJhdGVkIHN5bnRheCB0cmVlLicpCitTSF9PUFQuYWRkX29wdGlvbignLS1kZWJ1Zy1jbWQnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZXN0PSdkZWJ1Z19jbWQnLCBkZWZhdWx0PUZhbHNlLCAKKyAgICBoZWxwPSdUcmFjZSBjb21tYW5kIGV4ZWN1dGlvbiBiZWZvcmUgcGFyYW1ldGVycyBleHBhbnNpb24gYW5kIGV4aXQgc3RhdHVzLicpCitTSF9PUFQuYWRkX29wdGlvbignLS1kZWJ1Zy11dGlsaXR5JywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVzdD0nZGVidWdfdXRpbGl0eScsIGRlZmF1bHQ9RmFsc2UsIAorICAgIGhlbHA9J1RyYWNlIHV0aWxpdHkgY2FsbHMsIGFmdGVyIHBhcmFtZXRlcnMgZXhwYW5zaW9ucycpCitTSF9PUFQuYWRkX29wdGlvbignLS1hc3QnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZXN0PSdhc3QnLCBkZWZhdWx0PUZhbHNlLAorICAgIGhlbHA9J0VuY29kZWQgY29tbWFuZHMgdG8gZXhlY3V0ZSBpbiBhIHN1YnByb2Nlc3MnKQorU0hfT1BULmFkZF9vcHRpb24oJy0tcHJvZmlsZScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlZmF1bHQ9RmFsc2UsCisgICAgaGVscD0nUHJvZmlsZSBweXNoIHJ1bicpCisgICAgCisgICAgCitkZWYgc3BsaXRfYXJncyhhcmdzKToKKyAgICAjIFNlcGFyYXRlIHNoZWxsIGFyZ3VtZW50cyBmcm9tIGNvbW1hbmQgb25lcworICAgICMgSnVzdCBzdG9wIGF0IHRoZSBmaXJzdCBhcmd1bWVudCBub3Qgc3RhcnRpbmcgd2l0aCBhIGRhc2guIEkga25vdywgdGhpcyBpcyBjb21wbGV0ZWx5IGJyb2tlbiwKKyAgICAjIGl0IGlnbm9yZXMgZmlsZXMgc3RhcnRpbmcgd2l0aCBhIGRhc2ggb3IgbWF5IHRha2Ugb3B0aW9uIHZhbHVlcyBmb3IgY29tbWFuZCBmaWxlLiBUaGlzIGlzIG5vdAorICAgICMgc3VwcG9zZWQgdG8gaGFwcGVuIGZvciBub3cKKyAgICBjb21tYW5kX2luZGV4ID0gbGVuKGFyZ3MpCisgICAgZm9yIGksYXJnIGluIGVudW1lcmF0ZShhcmdzKToKKyAgICAgICAgaWYgbm90IGFyZy5zdGFydHN3aXRoKCctJyk6CisgICAgICAgICAgICBjb21tYW5kX2luZGV4ID0gaQorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIAorICAgIHJldHVybiBhcmdzWzpjb21tYW5kX2luZGV4XSwgYXJnc1tjb21tYW5kX2luZGV4Ol0KKworCitkZWYgZml4ZW52KGVudik6CisgICAgcGF0aCA9IGVudi5nZXQoJ1BBVEgnKQorICAgIGlmIHBhdGggaXMgbm90IE5vbmU6CisgICAgICAgIHBhcnRzID0gcGF0aC5zcGxpdChvcy5wYXRoc2VwKQorICAgICAgICAjIFJlbW92ZSBXaW5kb3dzIHV0aWxpdGllcyBmcm9tIFBBVEgsIHRoZXkgYXJlIHVzZWxlc3MgYXQgYmVzdCBhbmQKKyAgICAgICAgIyBzb21lIG9mIHRoZW0gKGZpbmQpIG1heSBiZSBjb25mdXNlZCB3aXRoIG90aGVyIHV0aWxpdGllcy4KKyAgICAgICAgcGFydHMgPSBbcCBmb3IgcCBpbiBwYXJ0cyBpZiAnc3lzdGVtMzInIG5vdCBpbiBwLmxvd2VyKCldCisgICAgICAgIGVudlsnUEFUSCddID0gb3MucGF0aHNlcC5qb2luKHBhcnRzKQorICAgIGlmIGVudi5nZXQoJ0hPTUUnKSBpcyBOb25lOgorICAgICAgICAjIFNldmVyYWwgdXRpbGl0aWVzLCBpbmNsdWRpbmcgY3ZzcHMsIGNhbm5vdCB3b3JrIHdpdGhvdXQKKyAgICAgICAgIyBhIGRlZmluZWQgSE9NRSBkaXJlY3RvcnkuCisgICAgICAgIGVudlsnSE9NRSddID0gb3MucGF0aC5leHBhbmR1c2VyKCd+JykKKyAgICByZXR1cm4gZW52CisKK2RlZiBfc2goY3dkLCBzaGFyZ3MsIGNtZGFyZ3MsIG9wdGlvbnMsIGRlYnVnZmxhZ3M9Tm9uZSwgZW52PU5vbmUpOgorICAgIGlmIG9zLmVudmlyb24uZ2V0KCdQWVNIX1RFWFQnKSAhPSAnMSc6CisgICAgICAgIGltcG9ydCBtc3ZjcnQKKyAgICAgICAgZm9yIGZwIGluIChzeXMuc3RkaW4sIHN5cy5zdGRvdXQsIHN5cy5zdGRlcnIpOgorICAgICAgICAgICAgbXN2Y3J0LnNldG1vZGUoZnAuZmlsZW5vKCksIG9zLk9fQklOQVJZKQorCisgICAgaGdiaW4gPSBvcy5lbnZpcm9uLmdldCgnUFlTSF9IR1RFWFQnKSAhPSAnMScKKyAgICAKKyAgICBpZiBkZWJ1Z2ZsYWdzIGlzIE5vbmU6CisgICAgICAgIGRlYnVnZmxhZ3MgPSBbXQorICAgICAgICBpZiBvcHRpb25zLmRlYnVnX3BhcnNpbmc6ICAgIGRlYnVnZmxhZ3MuYXBwZW5kKCdkZWJ1Zy1wYXJzaW5nJykKKyAgICAgICAgaWYgb3B0aW9ucy5kZWJ1Z191dGlsaXR5OiAgICBkZWJ1Z2ZsYWdzLmFwcGVuZCgnZGVidWctdXRpbGl0eScpCisgICAgICAgIGlmIG9wdGlvbnMuZGVidWdfY21kOiAgICAgICAgZGVidWdmbGFncy5hcHBlbmQoJ2RlYnVnLWNtZCcpCisgICAgICAgIGlmIG9wdGlvbnMuZGVidWdfdHJlZTogICAgICAgZGVidWdmbGFncy5hcHBlbmQoJ2RlYnVnLXRyZWUnKQorICAgIAorICAgIGlmIGVudiBpcyBOb25lOgorICAgICAgICBlbnYgPSBmaXhlbnYoZGljdChvcy5lbnZpcm9uKSkKKyAgICBpZiBjd2QgaXMgTm9uZToKKyAgICAgICAgY3dkID0gb3MuZ2V0Y3dkKCkKKworICAgIGlmIG5vdCBjbWRhcmdzOgorICAgICAgICAjIE5vdGhpbmcgdG8gZG8KKyAgICAgICAgcmV0dXJuIDAKKworICAgIGFzdCA9IE5vbmUKKyAgICBjb21tYW5kX2ZpbGUgPSBOb25lCisgICAgaWYgb3B0aW9ucy5jb21tYW5kX3N0cmluZzoKKyAgICAgICAgaW5wdXQgPSBjbWRhcmdzWzBdCisgICAgICAgIGlmIG5vdCBvcHRpb25zLmFzdDoKKyAgICAgICAgICAgIGlucHV0ICs9ICdcbicKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFyZ3MsIGlucHV0ID0gaW50ZXJwLmRlY29kZWFyZ3MoaW5wdXQpLCBOb25lCisgICAgICAgICAgICBlbnYsIGFzdCA9IGFyZ3MKKyAgICAgICAgICAgIGN3ZCA9IGVudi5nZXQoJ1BXRCcsIGN3ZCkKKyAgICBlbHNlOgorICAgICAgICBjb21tYW5kX2ZpbGUgPSBjbWRhcmdzWzBdCisgICAgICAgIGFyZ3VtZW50cyA9IGNtZGFyZ3NbMTpdCisKKyAgICAgICAgcHJlZml4ID0gaW50ZXJwLnJlc29sdmVfc2hlYmFuZyhjb21tYW5kX2ZpbGUsIGlnbm9yZXNoZWxsPVRydWUpCisgICAgICAgIGlmIHByZWZpeDoKKyAgICAgICAgICAgIGlucHV0ID0gJyAnLmpvaW4ocHJlZml4ICsgW2NvbW1hbmRfZmlsZV0gKyBhcmd1bWVudHMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFJlYWQgY29tbWFuZHMgZnJvbSBmaWxlCisgICAgICAgICAgICBmID0gZmlsZShjb21tYW5kX2ZpbGUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgIyBUcmFpbGluZyBuZXdsaW5lIHRvIGhlbHAgdGhlIHBhcnNlcgorICAgICAgICAgICAgICAgIGlucHV0ID0gZi5yZWFkKCkgKyAnXG4nCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgIAorICAgIHJlZGlyZWN0ID0gTm9uZQorICAgIHRyeToKKyAgICAgICAgaWYgb3B0aW9ucy5yZWRpcmVjdGVkOgorICAgICAgICAgICAgc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAgICAgICAgICAgc3RkZXJyID0gc3Rkb3V0CisgICAgICAgIGVsaWYgb3B0aW9ucy5yZWRpcmVjdF90bzoKKyAgICAgICAgICAgIHJlZGlyZWN0ID0gb3BlbihvcHRpb25zLnJlZGlyZWN0X3RvLCAnd2InKQorICAgICAgICAgICAgc3Rkb3V0ID0gcmVkaXJlY3QKKyAgICAgICAgICAgIHN0ZGVyciA9IHJlZGlyZWN0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgICAgICBzdGRlcnIgPSBzeXMuc3RkZXJyCisgICAgICAgICAgICAKKyAgICAgICAgIyBUT0RPOiBzZXQgYXJndW1lbnRzIHRvIGVudmlyb25tZW50IHZhcmlhYmxlcworICAgICAgICBvcHRzID0gaW50ZXJwLk9wdGlvbnMoKQorICAgICAgICBvcHRzLmhnYmluYXJ5ID0gaGdiaW4KKyAgICAgICAgaXAgPSBpbnRlcnAuSW50ZXJwcmV0ZXIoY3dkLCBkZWJ1Z2ZsYWdzLCBzdGRvdXQ9c3Rkb3V0LCBzdGRlcnI9c3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRzPW9wdHMpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgRXhwb3J0IGdpdmVuIGVudmlyb25tZW50IGluIHNoZWxsIG9iamVjdAorICAgICAgICAgICAgZm9yIGssdiBpbiBlbnYuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICAgICAgaXAuZ2V0X2VudigpLmV4cG9ydChrLHYpCisgICAgICAgICAgICByZXR1cm4gaXAuZXhlY3V0ZV9zY3JpcHQoaW5wdXQsIGFzdCwgc2NyaXB0cGF0aD1jb21tYW5kX2ZpbGUpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpcC5jbG9zZSgpCisgICAgZmluYWxseToKKyAgICAgICAgaWYgcmVkaXJlY3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZWRpcmVjdC5jbG9zZSgpCisKK2RlZiBzaChjd2Q9Tm9uZSwgYXJncz1Ob25lLCBkZWJ1Z2ZsYWdzPU5vbmUsIGVudj1Ob25lKToKKyAgICBpZiBhcmdzIGlzIE5vbmU6CisgICAgICAgIGFyZ3MgPSBzeXMuYXJndlsxOl0KKyAgICBzaGFyZ3MsIGNtZGFyZ3MgPSBzcGxpdF9hcmdzKGFyZ3MpCisgICAgb3B0aW9ucywgc2hhcmdzID0gU0hfT1BULnBhcnNlX2FyZ3Moc2hhcmdzKQorCisgICAgaWYgb3B0aW9ucy5wcm9maWxlOgorICAgICAgICBpbXBvcnQgbHNwcm9mCisgICAgICAgIHAgPSBsc3Byb2YuUHJvZmlsZXIoKQorICAgICAgICBwLmVuYWJsZShzdWJjYWxscz1UcnVlKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gX3NoKGN3ZCwgc2hhcmdzLCBjbWRhcmdzLCBvcHRpb25zLCBkZWJ1Z2ZsYWdzLCBlbnYpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBwLmRpc2FibGUoKQorICAgICAgICAgICAgc3RhdHMgPSBsc3Byb2YuU3RhdHMocC5nZXRzdGF0cygpKQorICAgICAgICAgICAgc3RhdHMuc29ydCgpCisgICAgICAgICAgICBzdGF0cy5wcHJpbnQodG9wPTEwLCBmaWxlPXN5cy5zdGRlcnIsIGNsaW1pdD01KQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBfc2goY3dkLCBzaGFyZ3MsIGNtZGFyZ3MsIG9wdGlvbnMsIGRlYnVnZmxhZ3MsIGVudikKKyAgICAgICAgICAgIAorZGVmIG1haW4oKToKKyAgICBzeXMuZXhpdChzaCgpKQorCitpZiBfX25hbWVfXz09J19fbWFpbl9fJzoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3B5c2gvcHlzaGxleC5weSBiL2JpdGJha2UvbGliL2JiL3B5c2gvcHlzaGxleC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzAxMjM2Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvcHlzaC9weXNobGV4LnB5CkBAIC0wLDAgKzEsODg4IEBACisjIHB5c2hsZXgucHkgLSBQTFkgY29tcGF0aWJsZSBsZXhlciBmb3IgcHlzaC4KKyMKKyMgQ29weXJpZ2h0IDIwMDcgUGF0cmljayBNZXphcmQKKyMKKyMgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisjIFRPRE86CisjIC0gcmV2aWV3IGFsbCAiY2hhciBpbiAnYWJjJyIgc25pcHBldHM6IHRoZSBlbXB0eSBzdHJpbmcgY2FuIGJlIG1hdGNoZWQKKyMgLSB0ZXN0IGxpbmUgY29udGludWF0aW9ucyB3aXRoaW4gcXVvdGVkL2V4cGFuc2lvbiBzdHJpbmdzCisjIC0gZW9mIGlzIGJ1Z2d5IHdydCBzdWJsZXhlcnMKKyMgLSB0aGUgbGV4ZXIgY2Fubm90IHJlYWxseSB3b3JrIGluIHB1bGwgbW9kZSBhcyBpdCB3b3VsZCBiZSByZXF1aXJlZCB0byBydW4KKyMgUExZIGluIHB1bGwgbW9kZS4gSXQgd2FzIGRlc2lnbmVkIHRvIHdvcmsgaW5jcmVtZW50YWxseSBhbmQgaXQgd291bGQgbm90IGJlCisjIHRoYXQgaGFyZCB0byBlbmFibGUgcHVsbCBtb2RlLgoraW1wb3J0IHJlCit0cnk6CisgICAgcyA9IHNldCgpCisgICAgZGVsIHMKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgZnJvbSBTZXQgaW1wb3J0IFNldCBhcyBzZXQKKworZnJvbSBwbHkgaW1wb3J0IGxleAorZnJvbSBzaGVycm9ycyBpbXBvcnQgKgorCitjbGFzcyBOZWVkTW9yZShFeGNlcHRpb24pOgorICAgIHBhc3MKKworZGVmIGlzX2JsYW5rKGMpOgorICAgIHJldHVybiBjIGluICgnICcsICdcdCcpCisgICAgCitfUkVfRElHSVRTID0gcmUuY29tcGlsZShyJ15cZCskJykKKworZGVmIGFyZV9kaWdpdHMocyk6CisgICAgcmV0dXJuIF9SRV9ESUdJVFMuc2VhcmNoKHMpIGlzIG5vdCBOb25lCisKK19PUEVSQVRPUlMgPSBkaWN0KFsKKyAgICAoJyYmJywgJ0FORF9JRicpLAorICAgICgnfHwnLCAnT1JfSUYnKSwKKyAgICAoJzs7JywgJ0RTRU1JJyksCisgICAgKCc8PCcsICdETEVTUycpLAorICAgICgnPj4nLCAnREdSRUFUJyksCisgICAgKCc8JicsICdMRVNTQU5EJyksCisgICAgKCc+JicsICdHUkVBVEFORCcpLAorICAgICgnPD4nLCAnTEVTU0dSRUFUJyksCisgICAgKCc8PC0nLCAnRExFU1NEQVNIJyksCisgICAgKCc+fCcsICdDTE9CQkVSJyksCisgICAgKCcmJywgJ0FNUCcpLAorICAgICgnOycsICdDT01NQScpLAorICAgICgnPCcsICdMRVNTJyksCisgICAgKCc+JywgJ0dSRUFURVInKSwKKyAgICAoJygnLCAnTFBBUkVOUycpLAorICAgICgnKScsICdSUEFSRU5TJyksCitdKQorCisjTWFrZSBhIGZ1bmN0aW9uIHRvIHNpbGVuY2UgcHljaGVja2VyICJMb2NhbCB2YXJpYWJsZSBzaGFkb3dzIGdsb2JhbCIKK2RlZiBtYWtlX3BhcnRpYWxfb3BzKCk6CisgICAgcGFydGlhbHMgPSB7fQorICAgIGZvciBrIGluIF9PUEVSQVRPUlM6CisgICAgICAgIGZvciBpIGluIHJhbmdlKDEsIGxlbihrKSsxKToKKyAgICAgICAgICAgIHBhcnRpYWxzW2tbOmldXSA9IE5vbmUKKyAgICByZXR1cm4gcGFydGlhbHMgIAorCitfUEFSVElBTF9PUEVSQVRPUlMgPSBtYWtlX3BhcnRpYWxfb3BzKCkgICAgCisgICAgICAgIAorZGVmIGlzX3BhcnRpYWxfb3Aocyk6CisgICAgIiIiUmV0dXJuIFRydWUgaWYgcyBtYXRjaGVzIGEgbm9uLWVtcHR5IHN1YnBhcnQgb2YgYW4gb3BlcmF0b3Igc3RhcnRpbmcKKyAgICBhdCBpdHMgZmlyc3QgY2hhcmFjdGVyLgorICAgICIiIgorICAgIHJldHVybiBzIGluIF9QQVJUSUFMX09QRVJBVE9SUworICAgIAorZGVmIGlzX29wKHMpOgorICAgICIiIklmIHMgbWF0Y2hlcyBhbiBvcGVyYXRvciwgcmV0dXJucyB0aGUgb3BlcmF0b3IgaWRlbnRpZmllci4gUmV0dXJuIE5vbmUKKyAgICBvdGhlcndpc2UuCisgICAgIiIiCisgICAgcmV0dXJuIF9PUEVSQVRPUlMuZ2V0KHMpCisKK19SRVNFUlZFRFMgPSBkaWN0KFsKKyAgICAoJ2lmJywgJ0lmJyksCisgICAgKCd0aGVuJywgJ1RoZW4nKSwKKyAgICAoJ2Vsc2UnLCAnRWxzZScpLAorICAgICgnZWxpZicsICdFbGlmJyksCisgICAgKCdmaScsICdGaScpLAorICAgICgnZG8nLCAnRG8nKSwKKyAgICAoJ2RvbmUnLCAnRG9uZScpLAorICAgICgnY2FzZScsICdDYXNlJyksCisgICAgKCdlc2FjJywgJ0VzYWMnKSwKKyAgICAoJ3doaWxlJywgJ1doaWxlJyksCisgICAgKCd1bnRpbCcsICdVbnRpbCcpLAorICAgICgnZm9yJywgJ0ZvcicpLAorICAgICgneycsICdMYnJhY2UnKSwKKyAgICAoJ30nLCAnUmJyYWNlJyksCisgICAgKCchJywgJ0JhbmcnKSwKKyAgICAoJ2luJywgJ0luJyksCisgICAgKCd8JywgJ1BJUEUnKSwKK10pCisgICAgCitkZWYgZ2V0X3Jlc2VydmVkKHMpOgorICAgIHJldHVybiBfUkVTRVJWRURTLmdldChzKQorICAgIAorX1JFX05BTUUgPSByZS5jb21waWxlKHInXlswLTlhLXpBLVpfXSskJykKKworZGVmIGlzX25hbWUocyk6CisgICAgcmV0dXJuIF9SRV9OQU1FLnNlYXJjaChzKSBpcyBub3QgTm9uZQorCitkZWYgZmluZF9jaGFycyhzZXEsIGNoYXJzKToKKyAgICBmb3IgaSx2IGluIGVudW1lcmF0ZShzZXEpOgorICAgICAgICBpZiB2IGluIGNoYXJzOgorICAgICAgICAgICAgcmV0dXJuIGksdgorICAgIHJldHVybiAtMSwgTm9uZQorCitjbGFzcyBXb3JkTGV4ZXI6CisgICAgIiIiV29yZExleGVyIHBhcnNlIHF1b3RlZCBvciBleHBhbnNpb24gZXhwcmVzc2lvbnMgYW5kIHJldHVybiBhbiBleHByZXNzaW9uCisgICAgdHJlZS4gVGhlIGlucHV0IHN0cmluZyBjYW4gYmUgYW55IHdlbGwgZm9ybWVkIHNlcXVlbmNlIGJlZ2lubmluZyB3aXRoIHF1b3RpbmcKKyAgICBvciBleHBhbnNpb24gY2hhcmFjdGVyLiBFbWJlZGRlZCBleHByZXNzaW9ucyBhcmUgaGFuZGxlZCByZWN1cnNpdmVseS4gVGhlCisgICAgcmVzdWx0aW5nIHRyZWUgaXMgbWFkZSBvZiBsaXN0cyBhbmQgc3RyaW5ncy4gTGlzdHMgcmVwcmVzZW50IHF1b3RlZCBvcgorICAgIGV4cGFuc2lvbiBleHByZXNzaW9ucy4gRWFjaCBsaXN0IGZpcnN0IGVsZW1lbnQgaXMgdGhlIG9wZW5pbmcgc2VwYXJhdG9yLAorICAgIHRoZSBsYXN0IG9uZSB0aGUgY2xvc2luZyBzZXBhcmF0b3IuIEluLWJldHdlZW4gY2FuIGJlIGFueSBudW1iZXIgb2Ygc3RyaW5ncworICAgIG9yIGxpc3RzIGZvciBzdWItZXhwcmVzc2lvbnMuIE5vbiBxdW90ZWQvZXhwYW5zaW9uIGV4cHJlc3Npb24gY2FuIHdyaXR0ZW4gYXMKKyAgICBzdHJpbmdzIG9yIGFzIGxpc3RzIHdpdGggZW1wdHkgc3RyaW5ncyBhcyBzdGFydGluZyBhbmQgZW5kaW5nIGRlbGltaXRlcnMuCisgICAgIiIiCisKKyAgICBOQU1FX0NIQVJTRVQgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODlfJworICAgIE5BTUVfQ0hBUlNFVCA9IGRpY3QoemlwKE5BTUVfQ0hBUlNFVCwgTkFNRV9DSEFSU0VUKSkKKyAgICAKKyAgICBTUEVDSUFMX0NIQVJTRVQgPSAnQCojPy0kITAnCisgICAgCisgICAgI0NoYXJhY3RlcnMgd2hpY2ggY2FuIGJlIGVzY2FwZWQgZGVwZW5kcyBvbiB0aGUgY3VycmVudCBkZWxpbWl0ZXJzCisgICAgRVNDQVBBQkxFID0geworICAgICAgICAnYCc6IHNldChbJyQnLCAnXFwnLCAnYCddKSwKKyAgICAgICAgJyInOiBzZXQoWyckJywgJ1xcJywgJ2AnLCAnIiddKSwKKyAgICAgICAgIiciOiBzZXQoKSwKKyAgICB9CisgICAgICAgIAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBoZXJlZG9jID0gRmFsc2UpOgorICAgICAgICAjIF9idWZmZXIgaXMgdGhlIHVucHJvY2Vzc2VkIGlucHV0IGNoYXJhY3RlcnMgYnVmZmVyCisgICAgICAgIHNlbGYuX2J1ZmZlciA9IFtdCisgICAgICAgICMgX3N0YWNrIGlzIGVtcHR5IG9yIGNvbnRhaW5zIGEgcXVvdGVkIGxpc3QgYmVpbmcgcHJvY2Vzc2VkCisgICAgICAgICMgKHRoaXMgaXMgdGhlIERGUyBwYXRoIHRvIHRoZSBxdW90ZWQgZXhwcmVzc2lvbiBiZWluZyBldmFsdWF0ZWQpLgorICAgICAgICBzZWxmLl9zdGFjayA9IFtdCisgICAgICAgIHNlbGYuX2VzY2FwYWJsZSA9IE5vbmUKKyAgICAgICAgIyBUcnVlIHdoZW4gcGFyc2luZyB1bnF1b3RlZCBoZXJlIGRvY3VtZW50cworICAgICAgICBzZWxmLl9oZXJlZG9jID0gaGVyZWRvYworICAgICAgICAKKyAgICBkZWYgYWRkKHNlbGYsIGRhdGEsIGVvZj1GYWxzZSk6CisgICAgICAgICIiIkZlZWQgdGhlIGxleGVyIHdpdGggbW9yZSBkYXRhLiBJZiB0aGUgcXVvdGVkIGV4cHJlc3Npb24gY2FuIGJlCisgICAgICAgIGRlbGltaXRlZCwgcmV0dXJuIGEgdHVwbGUgKGV4cHIsIHJlbWFpbmluZykgY29udGFpbmluZyB0aGUgZXhwcmVzc2lvbgorICAgICAgICB0cmVlIGFuZCB0aGUgdW5jb25zdW1lZCBkYXRhLgorICAgICAgICBPdGhlcndpc2UsIHJhaXNlIE5lZWRNb3JlLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fYnVmZmVyICs9IGxpc3QoZGF0YSkKKyAgICAgICAgc2VsZi5fcGFyc2UoZW9mKQorICAgICAgICAKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5fc3RhY2tbMF0KKyAgICAgICAgcmVtYWluaW5nID0gJycuam9pbihzZWxmLl9idWZmZXIpCisgICAgICAgIHNlbGYuX3N0YWNrID0gW10KKyAgICAgICAgc2VsZi5fYnVmZmVyID0gW10KKyAgICAgICAgcmV0dXJuIHJlc3VsdCwgcmVtYWluaW5nCisgICAgICAgIAorICAgIGRlZiBfaXNfZXNjYXBhYmxlKHNlbGYsIGMsIGRlbGltPU5vbmUpOgorICAgICAgICBpZiBkZWxpbSBpcyBOb25lOgorICAgICAgICAgICAgaWYgc2VsZi5faGVyZWRvYzoKKyAgICAgICAgICAgICAgICAjIEJhY2tzbGFzaGVzIHdvcmtzIGFzIGlmIHRoZXkgd2VyZSBkb3VibGUgcXVvdGVkIGluIHVucXVvdGVkCisgICAgICAgICAgICAgICAgIyBoZXJlLWRvY3VtZW50cworICAgICAgICAgICAgICAgIGRlbGltID0gJyInCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIGxlbihzZWxmLl9zdGFjayk8PTE6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICAgICAgZGVsaW0gPSBzZWxmLl9zdGFja1stMl1bMF0KKyAgICAgICAgICAgIAorICAgICAgICBlc2NhcGFibGVzID0gc2VsZi5FU0NBUEFCTEUuZ2V0KGRlbGltLCBOb25lKQorICAgICAgICByZXR1cm4gZXNjYXBhYmxlcyBpcyBOb25lIG9yIGMgaW4gZXNjYXBhYmxlcworICAgICAgICAKKyAgICBkZWYgX3BhcnNlX3NxdW90ZShzZWxmLCBidWYsIHJlc3VsdCwgZW9mKToKKyAgICAgICAgaWYgbm90IGJ1ZjoKKyAgICAgICAgICAgIHJhaXNlIE5lZWRNb3JlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcG9zID0gYnVmLmluZGV4KCInIikKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICByYWlzZSBOZWVkTW9yZSgpCisgICAgICAgIHJlc3VsdFstMV0gKz0gJycuam9pbihidWZbOnBvc10pCisgICAgICAgIHJlc3VsdCArPSBbIiciXQorICAgICAgICByZXR1cm4gcG9zKzEsIFRydWUKKyAgICAgICAgCisgICAgZGVmIF9wYXJzZV9icXVvdGUoc2VsZiwgYnVmLCByZXN1bHQsIGVvZik6CisgICAgICAgIGlmIG5vdCBidWY6CisgICAgICAgICAgICByYWlzZSBOZWVkTW9yZSgpCisgICAgICAgICAgICAKKyAgICAgICAgaWYgYnVmWzBdPT0nXG4nOgorICAgICAgICAgICAgI1JlbW92ZSBsaW5lIGNvbnRpbnVhdGlvbnMKKyAgICAgICAgICAgIHJlc3VsdFs6XSA9IFsnJywgJycsICcnXQorICAgICAgICBlbGlmIHNlbGYuX2lzX2VzY2FwYWJsZShidWZbMF0pOgorICAgICAgICAgICAgcmVzdWx0Wy0xXSArPSBidWZbMF0KKyAgICAgICAgICAgIHJlc3VsdCArPSBbJyddCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjS2VlcCBhcyBzdWNoCisgICAgICAgICAgICByZXN1bHRbOl0gPSBbJycsICdcXCcrYnVmWzBdLCAnJ10KKyAgICAgICAgCisgICAgICAgIHJldHVybiAxLCBUcnVlCisgICAgICAgIAorICAgIGRlZiBfcGFyc2VfZHF1b3RlKHNlbGYsIGJ1ZiwgcmVzdWx0LCBlb2YpOgorICAgICAgICBpZiBub3QgYnVmOgorICAgICAgICAgICAgcmFpc2UgTmVlZE1vcmUoKQorICAgICAgICBwb3MsIHNlcCA9IGZpbmRfY2hhcnMoYnVmLCAnJFxcYCInKQorICAgICAgICBpZiBwb3M9PS0xOgorICAgICAgICAgICAgcmFpc2UgTmVlZE1vcmUoKQorICAgICAgICAgICAgCisgICAgICAgIHJlc3VsdFstMV0gKz0gJycuam9pbihidWZbOnBvc10pCisgICAgICAgIGlmIHNlcD09JyInOgorICAgICAgICAgICAgcmVzdWx0ICs9IFsnIiddCisgICAgICAgICAgICByZXR1cm4gcG9zKzEsIFRydWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICNLZWVwIGV2ZXJ5dGhpbmcgdW50aWwgdGhlIHNlcGFyYXRvciBhbmQgZGVmZXIgcHJvY2Vzc2luZworICAgICAgICAgICAgcmV0dXJuIHBvcywgRmFsc2UKKyAgICAgICAgICAgIAorICAgIGRlZiBfcGFyc2VfY29tbWFuZChzZWxmLCBidWYsIHJlc3VsdCwgZW9mKToKKyAgICAgICAgaWYgbm90IGJ1ZjoKKyAgICAgICAgICAgIHJhaXNlIE5lZWRNb3JlKCkKKworICAgICAgICBjaGFycyA9ICckXFxgIlwnJworICAgICAgICBpZiByZXN1bHRbMF0gPT0gJyQoJzoKKyAgICAgICAgICAgIGNoYXJzICs9ICcpJworICAgICAgICBwb3MsIHNlcCA9IGZpbmRfY2hhcnMoYnVmLCBjaGFycykKKyAgICAgICAgaWYgcG9zID09IC0xOgorICAgICAgICAgICAgcmFpc2UgTmVlZE1vcmUoKQorICAgICAgICAgICAgCisgICAgICAgIHJlc3VsdFstMV0gKz0gJycuam9pbihidWZbOnBvc10pCisgICAgICAgIGlmIChyZXN1bHRbMF09PSckKCcgYW5kIHNlcD09JyknKSBvciAocmVzdWx0WzBdPT0nYCcgYW5kIHNlcD09J2AnKToKKyAgICAgICAgICAgIHJlc3VsdCArPSBbc2VwXQorICAgICAgICAgICAgcmV0dXJuIHBvcysxLCBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gcG9zLCBGYWxzZQorICAgICAgICAgICAgCisgICAgZGVmIF9wYXJzZV9wYXJhbWV0ZXIoc2VsZiwgYnVmLCByZXN1bHQsIGVvZik6CisgICAgICAgIGlmIG5vdCBidWY6CisgICAgICAgICAgICByYWlzZSBOZWVkTW9yZSgpCisgICAgICAgICAgICAKKyAgICAgICAgcG9zLCBzZXAgPSBmaW5kX2NoYXJzKGJ1ZiwgJyRcXGAiXCd9JykKKyAgICAgICAgaWYgcG9zPT0tMToKKyAgICAgICAgICAgIHJhaXNlIE5lZWRNb3JlKCkKKyAgICAgICAgICAgIAorICAgICAgICByZXN1bHRbLTFdICs9ICcnLmpvaW4oYnVmWzpwb3NdKQorICAgICAgICBpZiBzZXA9PSd9JzoKKyAgICAgICAgICAgIHJlc3VsdCArPSBbc2VwXQorICAgICAgICAgICAgcmV0dXJuIHBvcysxLCBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gcG9zLCBGYWxzZQorICAgICAgICAgICAgCisgICAgZGVmIF9wYXJzZV9kb2xsYXIoc2VsZiwgYnVmLCByZXN1bHQsIGVvZik6CisgICAgICAgIHNlcCA9IHJlc3VsdFswXQorICAgICAgICBpZiBzZXA9PSckJzogICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIG5vdCBidWY6CisgICAgICAgICAgICAgICAgI1RPRE86IGhhbmRsZSBlbXB0eSAkCisgICAgICAgICAgICAgICAgcmFpc2UgTmVlZE1vcmUoKQorICAgICAgICAgICAgaWYgYnVmWzBdPT0nKCc6CisgICAgICAgICAgICAgICAgaWYgbGVuKGJ1Zik9PTE6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIE5lZWRNb3JlKCkKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgYnVmWzFdPT0nKCc6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFswXSA9ICckKCgnCisgICAgICAgICAgICAgICAgICAgIGJ1Zls6Ml0gPSBbXQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFswXSA9ICckKCcKKyAgICAgICAgICAgICAgICAgICAgYnVmWzoxXSA9IFtdCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBlbGlmIGJ1ZlswXT09J3snOgorICAgICAgICAgICAgICAgIHJlc3VsdFswXSA9ICckeycKKyAgICAgICAgICAgICAgICBidWZbOjFdID0gW10KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgYnVmWzBdIGluIHNlbGYuU1BFQ0lBTF9DSEFSU0VUOgorICAgICAgICAgICAgICAgICAgICByZXN1bHRbLTFdID0gYnVmWzBdCisgICAgICAgICAgICAgICAgICAgIHJlYWQgPSAxCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZm9yIHJlYWQsYyBpbiBlbnVtZXJhdGUoYnVmKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGMgbm90IGluIHNlbGYuTkFNRV9DSEFSU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgZW9mOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIE5lZWRNb3JlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgKz0gMQorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFstMV0gKz0gJycuam9pbihidWZbMDpyZWFkXSkKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgbm90IHJlc3VsdFstMV06CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFs6XSA9IFsnJywgcmVzdWx0WzBdLCAnJ10KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gWycnXSAKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVhZCxUcnVlCisgICAgICAgIAorICAgICAgICBzZXAgPSByZXN1bHRbMF0gICAgCisgICAgICAgIGlmIHNlcD09JyQoJzoKKyAgICAgICAgICAgIHBhcnNlZnVuYyA9IHNlbGYuX3BhcnNlX2NvbW1hbmQKKyAgICAgICAgZWxpZiBzZXA9PSckeyc6CisgICAgICAgICAgICBwYXJzZWZ1bmMgPSBzZWxmLl9wYXJzZV9wYXJhbWV0ZXIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3Ioc2VwKQorICAgICAgICAgICAgCisgICAgICAgIHBvcywgY2xvc2VkID0gcGFyc2VmdW5jKGJ1ZiwgcmVzdWx0LCBlb2YpCisgICAgICAgIHJldHVybiBwb3MsIGNsb3NlZAorCisgICAgZGVmIF9wYXJzZShzZWxmLCBlb2YpOgorICAgICAgICBidWYgPSBzZWxmLl9idWZmZXIKKyAgICAgICAgc3RhY2sgPSBzZWxmLl9zdGFjaworICAgICAgICByZWN1cnNlID0gRmFsc2UKKyAgICAKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIGlmIG5vdCBzdGFjayBvciByZWN1cnNlOgorICAgICAgICAgICAgICAgIGlmIG5vdCBidWY6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIE5lZWRNb3JlKCkKKyAgICAgICAgICAgICAgICBpZiBidWZbMF0gbm90IGluICgnIlxcYCRcJycpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBTaGVsbFN5bnRheEVycm9yKCdJbnZhbGlkIHF1b3RlZCBzdHJpbmcgc2VxdWVuY2UnKQorICAgICAgICAgICAgICAgIHN0YWNrLmFwcGVuZChbYnVmWzBdLCAnJ10pCisgICAgICAgICAgICAgICAgYnVmWzoxXSA9IFtdCisgICAgICAgICAgICAgICAgcmVjdXJzZSA9IEZhbHNlCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICByZXN1bHQgPSBzdGFja1stMV0KKyAgICAgICAgICAgIGlmIHJlc3VsdFswXT09IiciOgorICAgICAgICAgICAgICAgIHBhcnNlZnVuYyA9IHNlbGYuX3BhcnNlX3NxdW90ZQorICAgICAgICAgICAgZWxpZiByZXN1bHRbMF09PSdcXCc6CisgICAgICAgICAgICAgICAgcGFyc2VmdW5jID0gc2VsZi5fcGFyc2VfYnF1b3RlCisgICAgICAgICAgICBlbGlmIHJlc3VsdFswXT09JyInOgorICAgICAgICAgICAgICAgIHBhcnNlZnVuYyA9IHNlbGYuX3BhcnNlX2RxdW90ZQorICAgICAgICAgICAgZWxpZiByZXN1bHRbMF09PSdgJzoKKyAgICAgICAgICAgICAgICBwYXJzZWZ1bmMgPSBzZWxmLl9wYXJzZV9jb21tYW5kCisgICAgICAgICAgICBlbGlmIHJlc3VsdFswXVswXT09JyQnOgorICAgICAgICAgICAgICAgIHBhcnNlZnVuYyA9IHNlbGYuX3BhcnNlX2RvbGxhcgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCkKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHJlYWQsIGNsb3NlZCA9IHBhcnNlZnVuYyhidWYsIHJlc3VsdCwgZW9mKQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgYnVmWzpyZWFkXSA9IFtdCisgICAgICAgICAgICBpZiBjbG9zZWQ6CisgICAgICAgICAgICAgICAgaWYgbGVuKHN0YWNrKT4xOgorICAgICAgICAgICAgICAgICAgICAjTWVyZ2UgaW4gcGFyZW50IGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgcGFyc2VkID0gc3RhY2sucG9wKCkKKyAgICAgICAgICAgICAgICAgICAgc3RhY2tbLTFdICs9IFtwYXJzZWRdCisgICAgICAgICAgICAgICAgICAgIHN0YWNrWy0xXSArPSBbJyddCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmVjdXJzZSA9IFRydWUKKworZGVmIG5vcm1hbGl6ZV93b3JkdHJlZSh3dHJlZSk6CisgICAgIiIiRm9sZCBiYWNrIGV2ZXJ5IGxpdGVyYWwgc2VxdWVuY2UgKGRlbGltaXRlZCB3aXRoIGVtcHR5IHN0cmluZ3MpIGludG8KKyAgICBwYXJlbnQgc2VxdWVuY2UuCisgICAgIiIiCisgICAgZGVmIG5vcm1hbGl6ZSh3dHJlZSk6CisgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgIGZvciBwYXJ0IGluIHd0cmVlWzE6LTFdOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShwYXJ0LCBsaXN0KToKKyAgICAgICAgICAgICAgICBwYXJ0ID0gbm9ybWFsaXplKHBhcnQpCisgICAgICAgICAgICAgICAgaWYgcGFydFswXT09Jyc6CisgICAgICAgICAgICAgICAgICAgICNNb3ZlIHRoZSBwYXJ0IGNvbnRlbnQgYmFjayBhdCBjdXJyZW50IGxldmVsCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBwYXJ0WzE6LTFdCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIG5vdCBwYXJ0OgorICAgICAgICAgICAgICAgICNSZW1vdmUgZW1wdHkgc3RyaW5ncworICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHBhcnQpCisgICAgICAgIGlmIG5vdCByZXN1bHQ6CisgICAgICAgICAgICByZXN1bHQgPSBbJyddICAgIAorICAgICAgICByZXR1cm4gW3d0cmVlWzBdXSArIHJlc3VsdCArIFt3dHJlZVstMV1dCisgICAgICAgICAgICAgICAgCisgICAgcmV0dXJuIG5vcm1hbGl6ZSh3dHJlZSkKKyAgICAKKyAgICAgICAgICAgICAgICAKK2RlZiBtYWtlX3dvcmR0cmVlKHRva2VuLCBoZXJlX2RvY3VtZW50PUZhbHNlKToKKyAgICAiIiJQYXJzZSBhIGRlbGltaXRlZCB0b2tlbiBhbmQgcmV0dXJuIGEgdHJlZSBzaW1pbGFyIHRvIHRoZSBvbmVzIHJldHVybmVkIGJ5CisgICAgV29yZExleGVyLiB0b2tlbiBtYXkgY29udGFpbiBhbnkgY29tYmluYXRpb25zIG9mIGV4cGFuc2lvbi9xdW90ZWQgZmllbGRzIGFuZAorICAgIG5vbi1vbmVzLgorICAgICIiIiAgICAKKyAgICB0cmVlID0gWycnXQorICAgIHJlbWFpbmluZyA9IHRva2VuCisgICAgZGVsaW1pdGVycyA9ICdcXCRgJworICAgIGlmIG5vdCBoZXJlX2RvY3VtZW50OgorICAgICAgICBkZWxpbWl0ZXJzICs9ICdcJyInCisgICAgCisgICAgd2hpbGUgMToKKyAgICAgICAgcG9zLCBzZXAgPSBmaW5kX2NoYXJzKHJlbWFpbmluZywgZGVsaW1pdGVycykKKyAgICAgICAgaWYgcG9zPT0tMToKKyAgICAgICAgICAgIHRyZWUgKz0gW3JlbWFpbmluZywgJyddCisgICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplX3dvcmR0cmVlKHRyZWUpCisgICAgICAgIHRyZWUuYXBwZW5kKHJlbWFpbmluZ1s6cG9zXSkKKyAgICAgICAgcmVtYWluaW5nID0gcmVtYWluaW5nW3BvczpdCisgICAgICAgIAorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXN1bHQsIHJlbWFpbmluZyA9IFdvcmRMZXhlcihoZXJlZG9jID0gaGVyZV9kb2N1bWVudCkuYWRkKHJlbWFpbmluZywgVHJ1ZSkKKyAgICAgICAgZXhjZXB0IE5lZWRNb3JlOgorICAgICAgICAgICAgcmFpc2UgU2hlbGxTeW50YXhFcnJvcignSW52YWxpZCB0b2tlbiAiJXMiJykKKyAgICAgICAgdHJlZS5hcHBlbmQocmVzdWx0KQorICAgICAgICAKKyAgICAgICAgICAgICAgICAKK2RlZiB3b3JkdHJlZV9hc19zdHJpbmcod3RyZWUpOgorICAgICIiIlJld3JpdGUgYW4gZXhwcmVzc2lvbiB0cmVlIGdlbmVyYXRlZCBieSBtYWtlX3dvcmR0cmVlIGFzIHN0cmluZy4iIiIKKyAgICBkZWYgdmlzaXQobm9kZSwgb3V0cHV0KToKKyAgICAgICAgZm9yIGNoaWxkIGluIG5vZGU6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGNoaWxkLCBsaXN0KToKKyAgICAgICAgICAgICAgICB2aXNpdChjaGlsZCwgb3V0cHV0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKGNoaWxkKQorICAgIAorICAgIG91dHB1dCA9IFtdCisgICAgdmlzaXQod3RyZWUsIG91dHB1dCkKKyAgICByZXR1cm4gJycuam9pbihvdXRwdXQpCisgICAgCisgICAgCitkZWYgdW5xdW90ZV93b3JkdHJlZSh3dHJlZSk6CisgICAgIiIiRm9sZCB0aGUgd29yZCB0cmVlIHdoaWxlIHJlbW92aW5nIHF1b3RlcyBldmVyeXdoZXJlLiBPdGhlciBleHBhbnNpb24KKyAgICBzZXF1ZW5jZXMgYXJlIGpvaW5lZCBhcyBzdWNoLgorICAgICIiIgorICAgIGRlZiB1bnF1b3RlKHd0cmVlKToKKyAgICAgICAgdW5xdW90ZWQgPSBbXQorICAgICAgICBpZiB3dHJlZVswXSBpbiAoJycsICInIiwgJyInLCAnXFwnKToKKyAgICAgICAgICAgIHd0cmVlID0gd3RyZWVbMTotMV0KKyAgICAgICAgICAgIAorICAgICAgICBmb3IgcGFydCBpbiB3dHJlZToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocGFydCwgbGlzdCk6CisgICAgICAgICAgICAgICAgcGFydCA9IHVucXVvdGUocGFydCkKKyAgICAgICAgICAgIHVucXVvdGVkLmFwcGVuZChwYXJ0KQorICAgICAgICByZXR1cm4gJycuam9pbih1bnF1b3RlZCkKKyAgICAgICAgICAgIAorICAgIHJldHVybiB1bnF1b3RlKHd0cmVlKQorICAgIAorICAgIAorY2xhc3MgSGVyZURvY0xleGVyOgorICAgICIiIkhlcmVEb2NMZXhlciBkZWxpbWl0cyB3aGF0ZXZlciBjb21lcyBmcm9tIHRoZSBoZXJlLWRvY3VtZW50IHN0YXJ0aW5nIG5ld2xpbmUKKyAgICBub3QgaW5jbHVkZWQgdG8gdGhlIGNsb3NpbmcgZGVsaW1pdGVyIGxpbmUgaW5jbHVkZWQuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9wLCBkZWxpbSk6CisgICAgICAgIGFzc2VydCBvcCBpbiAoJzw8JywgJzw8LScpCisgICAgICAgIGlmIG5vdCBkZWxpbToKKyAgICAgICAgICAgIHJhaXNlIFNoZWxsU3ludGF4RXJyb3IoJ2ludmFsaWQgaGVyZSBkb2N1bWVudCBkZWxpbWl0ZXIgJXMnICUgc3RyKGRlbGltKSkKKyAgICAgICAgICAgIAorICAgICAgICBzZWxmLl9vcCA9IG9wCisgICAgICAgIHNlbGYuX2RlbGltID0gZGVsaW0KKyAgICAgICAgc2VsZi5fYnVmZmVyID0gW10KKyAgICAgICAgc2VsZi5fdG9rZW4gPSBbXQorICAgICAgICAKKyAgICBkZWYgYWRkKHNlbGYsIGRhdGEsIGVvZik6CisgICAgICAgICIiIklmIHRoZSBoZXJlLWRvY3VtZW50IHdhcyBkZWxpbWl0ZWQsIHJldHVybiBhIHR1cGxlIChjb250ZW50LCByZW1haW5pbmcpLgorICAgICAgICBSYWlzZSBOZWVkTW9yZSgpIG90aGVyd2lzZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2J1ZmZlciArPSBsaXN0KGRhdGEpCisgICAgICAgIHNlbGYuX3BhcnNlKGVvZikKKyAgICAgICAgdG9rZW4gPSAnJy5qb2luKHNlbGYuX3Rva2VuKQorICAgICAgICByZW1haW5pbmcgPSAnJy5qb2luKHNlbGYuX2J1ZmZlcikKKyAgICAgICAgc2VsZi5fdG9rZW4sIHNlbGYuX3JlbWFpbmluZyA9IFtdLCBbXQorICAgICAgICByZXR1cm4gdG9rZW4sIHJlbWFpbmluZworICAgIAorICAgIGRlZiBfcGFyc2Uoc2VsZiwgZW9mKToKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICNMb29rIGZvciBmaXJzdCB1bmVzY2FwZWQgbmV3bGluZS4gUXVvdGVzIG1heSBiZSBpZ25vcmVkCisgICAgICAgICAgICBlc2NhcGVkID0gRmFsc2UKKyAgICAgICAgICAgIGZvciBpLGMgaW4gZW51bWVyYXRlKHNlbGYuX2J1ZmZlcik6CisgICAgICAgICAgICAgICAgaWYgZXNjYXBlZDoKKyAgICAgICAgICAgICAgICAgICAgZXNjYXBlZCA9IEZhbHNlCisgICAgICAgICAgICAgICAgZWxpZiBjPT0nXFwnOgorICAgICAgICAgICAgICAgICAgICBlc2NhcGVkID0gVHJ1ZQorICAgICAgICAgICAgICAgIGVsaWYgYz09J1xuJzoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaSA9IC0xCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgaT09LTEgb3Igc2VsZi5fYnVmZmVyW2ldIT0nXG4nOgorICAgICAgICAgICAgICAgIGlmIG5vdCBlb2Y6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIE5lZWRNb3JlKCkKKyAgICAgICAgICAgICAgICAjTm8gbW9yZSBkYXRhLCBtYXliZSB0aGUgbGFzdCBsaW5lIGlzIGNsb3NpbmcgZGVsaW1pdGVyCisgICAgICAgICAgICAgICAgbGluZSA9ICcnLmpvaW4oc2VsZi5fYnVmZmVyKQorICAgICAgICAgICAgICAgIGVvbCA9ICcnCisgICAgICAgICAgICAgICAgc2VsZi5fYnVmZmVyWzpdID0gW10KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbGluZSA9ICcnLmpvaW4oc2VsZi5fYnVmZmVyWzppXSkKKyAgICAgICAgICAgICAgICBlb2wgPSBzZWxmLl9idWZmZXJbaV0KKyAgICAgICAgICAgICAgICBzZWxmLl9idWZmZXJbOmkrMV0gPSBbXQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiBzZWxmLl9vcD09Jzw8LSc6CisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUubHN0cmlwKCdcdCcpCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBpZiBsaW5lPT1zZWxmLl9kZWxpbToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgc2VsZi5fdG9rZW4gKz0gW2xpbmUsIGVvbF0KKyAgICAgICAgICAgIGlmIGk9PS0xOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgCitjbGFzcyBUb2tlbjoKKyAgICAjVE9ETzogY2hlY2sgdGhpcyBpcyBzdGlsbCBpbiB1c2UKKyAgICBPUEVSQVRPUiA9ICdPUEVSQVRPUicKKyAgICBXT1JEID0gJ1dPUkQnCisgICAgCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnZhbHVlID0gJycKKyAgICAgICAgc2VsZi50eXBlID0gTm9uZQorICAgICAgICAKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgI0JlaGF2ZSBsaWtlIGEgdHdvIGVsZW1lbnRzIHR1cGxlCisgICAgICAgIGlmIGtleT09MDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnR5cGUKKyAgICAgICAgaWYga2V5PT0xOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudmFsdWUKKyAgICAgICAgcmFpc2UgSW5kZXhFcnJvcihrZXkpCisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIAorY2xhc3MgSGVyZURvYzoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgb3AsIG5hbWU9Tm9uZSk6CisgICAgICAgIHNlbGYub3AgPSBvcAorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYucGVuZGluZ3MgPSBbXQorICAgICAgICAgICAgICAgCitUS19DT01NQSAgICAgICAgPSAnQ09NTUEnCitUS19BTVBFUlNBTkQgICAgPSAnQU1QJworVEtfT1AgICAgICAgICAgID0gJ09QJworVEtfVE9LRU4gICAgICAgID0gJ1RPS0VOJworVEtfQ09NTUVOVCAgICAgID0gJ0NPTU1FTlQnCitUS19ORVdMSU5FICAgICAgPSAnTkVXTElORScgCitUS19JT05VTUJFUiAgICAgPSAnSU9fTlVNQkVSJworVEtfQVNTSUdOTUVOVCAgID0gJ0FTU0lHTk1FTlRfV09SRCcKK1RLX0hFUkVOQU1FICAgICA9ICdIRVJFTkFNRScKKworY2xhc3MgTGV4ZXI6CisgICAgIiIiTWFpbiBsZXhlci4KKyAgICAKKyAgICBDYWxsIGFkZCgpIHVudGlsIHRoZSBzY3JpcHQgQVNUIGlzIHJldHVybmVkLgorICAgICIiIgorICAgICMgSGVyZS1kb2N1bWVudCBoYW5kbGluZyBtYWtlcyB0aGUgd2hvbGUgdGhpbmcgbW9yZSBjb21wbGV4IGJlY2F1c2UgdGhleSBiYXNpY2FsbHkKKyAgICAjIGZvcmNlIHRva2VucyB0byBiZSByZW9yZGVyZWQ6IGhlcmUtY29udGVudCBtdXN0IGNvbWUgcmlnaHQgYWZ0ZXIgdGhlIG9wZXJhdG9yCisgICAgIyBhbmQgdGhlIGhlcmUtZG9jdW1lbnQgbmFtZSwgd2hpbGUgc29tZSBvdGhlciB0b2tlbnMgbWlnaHQgYmUgZm9sbG93aW5nIHRoZQorICAgICMgaGVyZS1kb2N1bWVudCBleHByZXNzaW9uIG9uIHRoZSBzYW1lIGxpbmUuCisgICAgIworICAgICMgU28sIGhlcmUtZG9jIHN0YXRlcyBhcmUgYmFzaWNhbGx5OgorICAgICMgICAqc2VsZi5fc3RhdGU9PVNUX05PUk1BTAorICAgICMgICAgICAgLSBzZWxmLl9oZXJlZG9jLm9wIGlzIE5vbmU6IG5vIGhlcmUtZG9jdW1lbnQKKyAgICAjICAgICAgIC0gc2VsZi5faGVyZWRvYy5vcCBpcyBub3QgTm9uZSBidXQgbmFtZSBpczogaGVyZS1kb2N1bWVudCBvcGVyYXRvciBtYXRjaGVkLAorICAgICMgICAgICAgICAgIHdhaXRpbmcgZm9yIHRoZSBkb2N1bWVudCBuYW1lL2RlbGltaXRlcgorICAgICMgICAgICAgLSBzZWxmLl9oZXJlZG9jLm9wIGFuZCBuYW1lIGFyZSBub3QgTm9uZTogaGVyZS1kb2N1bWVudCBpcyByZWFkeSwgZm9sbG93aW5nCisgICAgIyAgICAgICAgICAgdG9rZW5zIGFyZSBiZWluZyBzdG9yZWQgYW5kIHdpbGwgYmUgcHVzaGVkIGFnYWluIHdoZW4gdGhlIGRvY3VtZW50IGlzCisgICAgIyAgICAgICAgICAgY29tcGxldGVseSBwYXJzZWQuCisgICAgIyAgICpzZWxmLl9zdGF0ZT09U1RfSEVSRURPQworICAgICMgICAgICAgLSBUaGUgaGVyZS1kb2N1bWVudCBpcyBiZWluZyBkZWxpbWl0ZWQgYnkgc2VsZi5faGVyZWxleGVyLiBPbmNlIGl0IGlzIGRvbmUKKyAgICAjICAgICAgICAgICB0aGUgY29udGVudCBpcyBwdXNoZWQgaW4gZnJvbnQgb2YgdGhlIHBlbmRpbmcgdG9rZW4gbGlzdCB0aGVuIGFsbCB0aGVzZQorICAgICMgICAgICAgICAgIHRva2VucyBhcmUgcHVzaGVkIG9uY2UgYWdhaW4uCisgICAgU1RfTk9STUFMICAgICAgID0gJ1NUX05PUk1BTCcKKyAgICBTVF9PUCAgICAgICAgICAgPSAnU1RfT1AnCisgICAgU1RfQkFDS1NMQVNIICAgID0gJ1NUX0JBQ0tTTEFTSCcKKyAgICBTVF9RVU9URUQgICAgICAgPSAnU1RfUVVPVEVEJworICAgIFNUX0NPTU1FTlQgICAgICA9ICdTVF9DT01NRU5UJworICAgIFNUX0hFUkVET0MgICAgICA9ICdTVF9IRVJFRE9DJworICAgIAorICAgICNNYXRjaCBlbmQgb2YgYmFja3F1b3RlIHN0cmluZ3MKKyAgICBSRV9CQUNLUVVPVEVfRU5EID0gcmUuY29tcGlsZShyJyg/PCFcXCkoYCknKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcmVudF9zdGF0ZSA9IE5vbmUpOgorICAgICAgICBzZWxmLl9pbnB1dCA9IFtdCisgICAgICAgIHNlbGYuX3BvcyA9IDAKKyAgICAgICAgCisgICAgICAgIHNlbGYuX3Rva2VuID0gJycKKyAgICAgICAgc2VsZi5fdHlwZSA9IFRLX1RPS0VOCisgICAgICAgIAorICAgICAgICBzZWxmLl9zdGF0ZSA9IHNlbGYuU1RfTk9STUFMCisgICAgICAgIHNlbGYuX3BhcmVudF9zdGF0ZSA9IHBhcmVudF9zdGF0ZQorICAgICAgICBzZWxmLl93b3JkbGV4ZXIgPSBOb25lCisgICAgICAgIAorICAgICAgICBzZWxmLl9oZXJlZG9jID0gSGVyZURvYyhOb25lKQorICAgICAgICBzZWxmLl9oZXJlbGV4ZXIgPSBOb25lCisgICAgICAgIAorICAgICAgICAjIyMgRm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIG5vdCB1c2VkIGZvciBkZWxpbWl0aW5nIHRva2VuIGFuZCBjYW4gc2FmZWx5CisgICAgICAgICMjIyBiZSBjaGFuZ2VkIGFmdGVyIGhlcmUtZG9jdW1lbnQgZGV0ZWN0aW9uIChzZWUgX3B1c2hfdG9rZSkKKyAgICAgICAgCisgICAgICAgICMgQ291bnQgdGhlIG51bWJlciBvZiB0b2tlbnMgZm9sbG93aW5nIGEgJ0ZvcicgcmVzZXJ2ZWQgd29yZC4gTmVlZGVkIHRvCisgICAgICAgICMgcmV0dXJuIGFuICdJbicgcmVzZXJ2ZWQgd29yZCBpZiBpdCBjb21lcyBpbiB0aGlyZCBwbGFjZS4KKyAgICAgICAgc2VsZi5fZm9yX2NvdW50ID0gTm9uZQorICAgICAgICAKKyAgICBkZWYgYWRkKHNlbGYsIGRhdGEsIGVvZj1GYWxzZSk6CisgICAgICAgICIiIkZlZWQgdGhlIGxleGVyIHdpdGggZGF0YS4KKyAgICAgICAgCisgICAgICAgIFdoZW4gZW9mIGlzIHNldCB0byBUcnVlLCByZXR1cm5zIHVuY29uc3VtZWQgZGF0YSBvciByYWlzZSBpZiB0aGUgbGV4ZXIKKyAgICAgICAgaXMgaW4gdGhlIG1pZGRsZSBvZiBhIGRlbGltaXRpbmcgb3BlcmF0aW9uLgorICAgICAgICBSYWlzZSBOZWVkTW9yZSBvdGhlcndpc2UuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9pbnB1dCArPSBsaXN0KGRhdGEpCisgICAgICAgIHNlbGYuX3BhcnNlKGVvZikKKyAgICAgICAgc2VsZi5faW5wdXRbOnNlbGYuX3Bvc10gPSBbXQorICAgICAgICByZXR1cm4gJycuam9pbihzZWxmLl9pbnB1dCkKKyAgICAgICAgCisgICAgZGVmIF9wYXJzZShzZWxmLCBlb2YpOiAgICAgICAgICAgIAorICAgICAgICB3aGlsZSBzZWxmLl9zdGF0ZToKKyAgICAgICAgICAgIGlmIHNlbGYuX3Bvcz49bGVuKHNlbGYuX2lucHV0KToKKyAgICAgICAgICAgICAgICBpZiBub3QgZW9mOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBOZWVkTW9yZSgpCisgICAgICAgICAgICAgICAgZWxpZiBzZWxmLl9zdGF0ZSBub3QgaW4gKHNlbGYuU1RfT1AsIHNlbGYuU1RfUVVPVEVELCBzZWxmLlNUX0hFUkVET0MpOgorICAgICAgICAgICAgICAgICAgICAjRGVsaW1pdCB0aGUgY3VycmVudCB0b2tlbiBhbmQgbGVhdmUgY2xlYW5seQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9wdXNoX3Rva2VuKCcnKQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICNMZXQgdGhlIHN1YmxleGVyIGhhbmRsZSB0aGUgZW9mIHRoZW1zZWx2ZXMKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgc2VsZi5fc3RhdGU9PXNlbGYuU1RfTk9STUFMOgorICAgICAgICAgICAgICAgIHNlbGYuX3BhcnNlX25vcm1hbCgpCisgICAgICAgICAgICBlbGlmIHNlbGYuX3N0YXRlPT1zZWxmLlNUX0NPTU1FTlQ6CisgICAgICAgICAgICAgICAgc2VsZi5fcGFyc2VfY29tbWVudCgpCisgICAgICAgICAgICBlbGlmIHNlbGYuX3N0YXRlPT1zZWxmLlNUX09QOgorICAgICAgICAgICAgICAgIHNlbGYuX3BhcnNlX29wKGVvZikKKyAgICAgICAgICAgIGVsaWYgc2VsZi5fc3RhdGU9PXNlbGYuU1RfUVVPVEVEOgorICAgICAgICAgICAgICAgIHNlbGYuX3BhcnNlX3F1b3RlZChlb2YpCisgICAgICAgICAgICBlbGlmIHNlbGYuX3N0YXRlPT1zZWxmLlNUX0hFUkVET0M6CisgICAgICAgICAgICAgICAgc2VsZi5fcGFyc2VfaGVyZWRvYyhlb2YpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGFzc2VydCBGYWxzZSwgIlVua25vd24gc3RhdGUgIiArIHN0cihzZWxmLl9zdGF0ZSkKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgaWYgc2VsZi5faGVyZWRvYy5vcCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFNoZWxsU3ludGF4RXJyb3IoJ21pc3NpbmcgaGVyZS1kb2N1bWVudCBkZWxpbWl0ZXInKQorICAgICAgICAgICAgICAgIAorICAgIGRlZiBfcGFyc2Vfbm9ybWFsKHNlbGYpOgorICAgICAgICBjID0gc2VsZi5faW5wdXRbc2VsZi5fcG9zXQorICAgICAgICBpZiBjPT0nXG4nOgorICAgICAgICAgICAgc2VsZi5fcHVzaF90b2tlbihjKQorICAgICAgICAgICAgc2VsZi5fdG9rZW4gPSBjCisgICAgICAgICAgICBzZWxmLl90eXBlID0gVEtfTkVXTElORQorICAgICAgICAgICAgc2VsZi5fcHVzaF90b2tlbignJykKKyAgICAgICAgICAgIHNlbGYuX3BvcyArPSAxCisgICAgICAgIGVsaWYgYyBpbiAoJ1xcJywgJ1wnJywgJyInLCAnYCcsICckJyk6CisgICAgICAgICAgICBzZWxmLl9zdGF0ZSA9IHNlbGYuU1RfUVVPVEVECisgICAgICAgIGVsaWYgaXNfcGFydGlhbF9vcChjKToKKyAgICAgICAgICAgIHNlbGYuX3B1c2hfdG9rZW4oYykKKyAgICAgICAgICAgIAorICAgICAgICAgICAgc2VsZi5fdHlwZSA9IFRLX09QCisgICAgICAgICAgICBzZWxmLl90b2tlbiArPSBjCisgICAgICAgICAgICBzZWxmLl9wb3MgKz0gMQorICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSBzZWxmLlNUX09QCisgICAgICAgIGVsaWYgaXNfYmxhbmsoYyk6CisgICAgICAgICAgICBzZWxmLl9wdXNoX3Rva2VuKGMpCisgICAgICAgICAgICAKKyAgICAgICAgICAgICNEaXNjYXJkIGJsYW5rcworICAgICAgICAgICAgc2VsZi5fcG9zICs9IDEKKyAgICAgICAgZWxpZiBzZWxmLl90b2tlbjoKKyAgICAgICAgICAgIHNlbGYuX3Rva2VuICs9IGMKKyAgICAgICAgICAgIHNlbGYuX3BvcyArPSAxCisgICAgICAgIGVsaWYgYz09JyMnOgorICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSBzZWxmLlNUX0NPTU1FTlQKKyAgICAgICAgICAgIHNlbGYuX3R5cGUgPSBUS19DT01NRU5UCisgICAgICAgICAgICBzZWxmLl9wb3MgKz0gMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fcG9zICs9IDEKKyAgICAgICAgICAgIHNlbGYuX3Rva2VuICs9IGMgICAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgZGVmIF9wYXJzZV9vcChzZWxmLCBlb2YpOgorICAgICAgICBhc3NlcnQgc2VsZi5fdG9rZW4KKyAgICAgICAgCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBpZiBzZWxmLl9wb3M+PWxlbihzZWxmLl9pbnB1dCk6CisgICAgICAgICAgICAgICAgaWYgbm90IGVvZjoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgTmVlZE1vcmUoKQorICAgICAgICAgICAgICAgIGMgPSAnJworICAgICAgICAgICAgZWxzZTogICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgYyA9IHNlbGYuX2lucHV0W3NlbGYuX3Bvc10KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIG9wID0gc2VsZi5fdG9rZW4gKyBjCisgICAgICAgICAgICBpZiBjIGFuZCBpc19wYXJ0aWFsX29wKG9wKToKKyAgICAgICAgICAgICAgICAjU3RpbGwgcGFyc2luZyBhbiBvcGVyYXRvcgorICAgICAgICAgICAgICAgIHNlbGYuX3Rva2VuID0gb3AKKyAgICAgICAgICAgICAgICBzZWxmLl9wb3MgKz0gMQorICAgICAgICAgICAgZWxzZTogICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAjRW5kIG9mIG9wZXJhdG9yCisgICAgICAgICAgICAgICAgc2VsZi5fcHVzaF90b2tlbihjKSAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSBzZWxmLlNUX05PUk1BTAorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgCisgICAgZGVmIF9wYXJzZV9jb21tZW50KHNlbGYpOgorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgaWYgc2VsZi5fcG9zPj1sZW4oc2VsZi5faW5wdXQpOgorICAgICAgICAgICAgICAgIHJhaXNlIE5lZWRNb3JlKCkKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGMgPSBzZWxmLl9pbnB1dFtzZWxmLl9wb3NdCisgICAgICAgICAgICBpZiBjPT0nXG4nOgorICAgICAgICAgICAgICAgICNFbmQgb2YgY29tbWVudCwgZG8gbm90IGNvbnN1bWUgdGhlIGVuZCBvZiBsaW5lCisgICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSBzZWxmLlNUX05PUk1BTAorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuX3Rva2VuICs9IGMKKyAgICAgICAgICAgICAgICBzZWxmLl9wb3MgKz0gMQorICAgICAgICAgICAgICAgIAorICAgIGRlZiBfcGFyc2VfcXVvdGVkKHNlbGYsIGVvZik6CisgICAgICAgICIiIlByZWNvbmRpdGlvbjogdGhlIHN0YXJ0aW5nIGJhY2txdW90ZS9kb2xsYXIgaXMgc3RpbGwgaW4gdGhlIGlucHV0IHF1ZXVlLiIiIgorICAgICAgICBpZiBub3Qgc2VsZi5fd29yZGxleGVyOgorICAgICAgICAgICAgc2VsZi5fd29yZGxleGVyID0gV29yZExleGVyKCkKKyAgICAgICAgCisgICAgICAgIGlmIHNlbGYuX3BvczxsZW4oc2VsZi5faW5wdXQpOgorICAgICAgICAgICAgICNUcmFuc2ZlciBpbnB1dCBxdWV1ZSBjaGFyYWN0ZXIgaW50byB0aGUgc3VicGFyc2VyCisgICAgICAgICAgICBpbnB1dCA9IHNlbGYuX2lucHV0W3NlbGYuX3BvczpdCisgICAgICAgICAgICBzZWxmLl9wb3MgKz0gbGVuKGlucHV0KQorICAgICAgICAgICAgCisgICAgICAgIHd0cmVlLCByZW1haW5pbmcgPSBzZWxmLl93b3JkbGV4ZXIuYWRkKGlucHV0LCBlb2YpCisgICAgICAgIHNlbGYuX3dvcmRsZXhlciA9IE5vbmUKKyAgICAgICAgc2VsZi5fdG9rZW4gKz0gd29yZHRyZWVfYXNfc3RyaW5nKHd0cmVlKQorICAgICAgICAKKyAgICAgICAgI1B1dCB1bnBhcnNlZCBjaGFyYWN0ZXIgYmFjayBpbiB0aGUgaW5wdXQgcXVldWUKKyAgICAgICAgaWYgcmVtYWluaW5nOgorICAgICAgICAgICAgc2VsZi5faW5wdXRbc2VsZi5fcG9zOnNlbGYuX3Bvc10gPSBsaXN0KHJlbWFpbmluZykgICAgICAgICAgCisgICAgICAgIHNlbGYuX3N0YXRlID0gc2VsZi5TVF9OT1JNQUwKKyAgICAgICAgCisgICAgZGVmIF9wYXJzZV9oZXJlZG9jKHNlbGYsIGVvZik6CisgICAgICAgIGFzc2VydCBub3Qgc2VsZi5fdG9rZW4KKyAgICAgICAgCisgICAgICAgIGlmIHNlbGYuX2hlcmVsZXhlciBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5faGVyZWxleGVyID0gSGVyZURvY0xleGVyKHNlbGYuX2hlcmVkb2Mub3AsIHNlbGYuX2hlcmVkb2MubmFtZSkKKyAgICAgICAgCisgICAgICAgIGlmIHNlbGYuX3BvczxsZW4oc2VsZi5faW5wdXQpOgorICAgICAgICAgICAgICNUcmFuc2ZlciBpbnB1dCBxdWV1ZSBjaGFyYWN0ZXIgaW50byB0aGUgc3VicGFyc2VyCisgICAgICAgICAgICBpbnB1dCA9IHNlbGYuX2lucHV0W3NlbGYuX3BvczpdCisgICAgICAgICAgICBzZWxmLl9wb3MgKz0gbGVuKGlucHV0KQorICAgICAgICAKKyAgICAgICAgc2VsZi5fdG9rZW4sIHJlbWFpbmluZyA9IHNlbGYuX2hlcmVsZXhlci5hZGQoaW5wdXQsIGVvZikKKyAgICAgICAgCisgICAgICAgICNSZXNldCBoZXJlLWRvY3VtZW50IHN0YXRlCisgICAgICAgIHNlbGYuX2hlcmVsZXhlciA9IE5vbmUKKyAgICAgICAgaGVyZWRvYywgc2VsZi5faGVyZWRvYyA9IHNlbGYuX2hlcmVkb2MsIEhlcmVEb2MoTm9uZSkKKyAgICAgICAgaWYgcmVtYWluaW5nOgorICAgICAgICAgICAgc2VsZi5faW5wdXRbc2VsZi5fcG9zOnNlbGYuX3Bvc10gPSBsaXN0KHJlbWFpbmluZykKKyAgICAgICAgc2VsZi5fc3RhdGUgPSBzZWxmLlNUX05PUk1BTAorICAgICAgICAKKyAgICAgICAgI1B1c2ggcGVuZGluZyB0b2tlbnMKKyAgICAgICAgaGVyZWRvYy5wZW5kaW5nc1s6MF0gPSBbKHNlbGYuX3Rva2VuLCBzZWxmLl90eXBlLCBoZXJlZG9jLm5hbWUpXQorICAgICAgICBmb3IgdG9rZW4sIHR5cGUsIGRlbGltIGluIGhlcmVkb2MucGVuZGluZ3M6CisgICAgICAgICAgICBzZWxmLl90b2tlbiA9IHRva2VuCisgICAgICAgICAgICBzZWxmLl90eXBlID0gdHlwZQorICAgICAgICAgICAgc2VsZi5fcHVzaF90b2tlbihkZWxpbSkKKyAgICAgICAgICAgICAgICAgICAgIAorICAgIGRlZiBfcHVzaF90b2tlbihzZWxmLCBkZWxpbSk6CisgICAgICAgIGlmIG5vdCBzZWxmLl90b2tlbjoKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgICAgICAKKyAgICAgICAgaWYgc2VsZi5faGVyZWRvYy5vcCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIHNlbGYuX2hlcmVkb2MubmFtZSBpcyBOb25lOgorICAgICAgICAgICAgICAgICNIZXJlLWRvY3VtZW50IG5hbWUKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl90eXBlIT1US19UT0tFTjoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgU2hlbGxTeW50YXhFcnJvcigiZXhwZWN0aW5nIGhlcmUtZG9jdW1lbnQgbmFtZSwgZ290ICclcyciICUgc2VsZi5fdG9rZW4pCisgICAgICAgICAgICAgICAgc2VsZi5faGVyZWRvYy5uYW1lID0gdW5xdW90ZV93b3JkdHJlZShtYWtlX3dvcmR0cmVlKHNlbGYuX3Rva2VuKSkKKyAgICAgICAgICAgICAgICBzZWxmLl90eXBlID0gVEtfSEVSRU5BTUUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgI0NhcHR1cmUgYWxsIHRva2VucyB1bnRpbCB0aGUgbmV3bGluZSBzdGFydGluZyB0aGUgaGVyZS1kb2N1bWVudAorICAgICAgICAgICAgICAgIGlmIHNlbGYuX3R5cGU9PVRLX05FV0xJTkU6CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLl9zdGF0ZT09c2VsZi5TVF9OT1JNQUwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSBzZWxmLlNUX0hFUkVET0MgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc2VsZi5faGVyZWRvYy5wZW5kaW5ncy5hcHBlbmQoKHNlbGYuX3Rva2VuLCBzZWxmLl90eXBlLCBkZWxpbSkpICAgIAorICAgICAgICAgICAgICAgIHNlbGYuX3Rva2VuID0gJycKKyAgICAgICAgICAgICAgICBzZWxmLl90eXBlID0gVEtfVE9LRU4KKyAgICAgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICAgICAgICAgIAorICAgICAgICAjIEJFV0FSRTogZG8gbm90IGNoYW5nZSBwYXJzZXIgc3RhdGUgZnJvbSBoZXJlIHRvIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uOgorICAgICAgICAjIHdoZW4gcGFyc2luZyBiZXR3ZWVuIGFuIGhlcmUtZG9jdW1lbnQgb3BlcmF0b3IgdG8gdGhlIGVuZCBvZiB0aGUgbGluZQorICAgICAgICAjIHRva2VucyBhcmUgc3RvcmVkIGluIHNlbGYuX2hlcmVkb2MucGVuZGluZ3MuIFRoZXJlZm9yZSwgdGhleSB3aWxsIG5vdAorICAgICAgICAjIHJlYWNoIHRoZSBzZWN0aW9uIGJlbG93LgorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgI0NoZWNrIG9wZXJhdG9ycworICAgICAgICBpZiBzZWxmLl90eXBlPT1US19PUDoKKyAgICAgICAgICAgICNGYWxzZSBwb3NpdGl2ZSBiZWNhdXNlIG9mIHBhcnRpYWwgb3AgbWF0Y2hpbmcKKyAgICAgICAgICAgIG9wID0gaXNfb3Aoc2VsZi5fdG9rZW4pCisgICAgICAgICAgICBpZiBub3Qgb3A6CisgICAgICAgICAgICAgICAgc2VsZi5fdHlwZSA9IFRLX1RPS0VOCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICNNYXAgdG8gdGhlIHNwZWNpZmljIG9wZXJhdG9yCisgICAgICAgICAgICAgICAgc2VsZi5fdHlwZSA9IG9wCisgICAgICAgICAgICAgICAgaWYgc2VsZi5fdG9rZW4gaW4gKCc8PCcsICc8PC0nKToKKyAgICAgICAgICAgICAgICAgICAgI0RvbmUgaGVyZSByYXRoZXIgdGhhbiBpbiBfcGFyc2Vfb3AgYmVjYXVzZSB0aGVyZSBpcyBubyBuZWVkCisgICAgICAgICAgICAgICAgICAgICN0byBjaGFuZ2UgdGhlIHBhcnNlciBzdGF0ZSBzaW5jZSB3ZSBhcmUgc3RpbGwgd2FpdGluZyBmb3IKKyAgICAgICAgICAgICAgICAgICAgI3RoZSBoZXJlLWRvY3VtZW50IG5hbWUKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5faGVyZWRvYy5vcCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFNoZWxsU3ludGF4RXJyb3IoInN5bnRheCBlcnJvciBuZWFyIHRva2VuICclcyciICUgc2VsZi5fdG9rZW4pCisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLl9oZXJlZG9jLm9wIGlzIE5vbmUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5faGVyZWRvYy5vcCA9IHNlbGYuX3Rva2VuCisgICAgICAgICAgICAgICAgCisgICAgICAgIGlmIHNlbGYuX3R5cGU9PVRLX1RPS0VOOiAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgJz0nIGluIHNlbGYuX3Rva2VuIGFuZCBub3QgZGVsaW06CisgICAgICAgICAgICAgICAgaWYgc2VsZi5fdG9rZW4uc3RhcnRzd2l0aCgnPScpOgorICAgICAgICAgICAgICAgICAgICAjVG9rZW4gaXMgYSBXT1JELi4uIGEgVE9LRU4gdGhhdCBpcy4KKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHByZXYgPSBzZWxmLl90b2tlbls6c2VsZi5fdG9rZW4uZmluZCgnPScpXQorICAgICAgICAgICAgICAgICAgICBpZiBpc19uYW1lKHByZXYpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdHlwZSA9IFRLX0FTU0lHTk1FTlQKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICNKdXN0IGEgdG9rZW4gKHVuc3BlY2lmaWVkKQorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXNlcnZlZCA9IGdldF9yZXNlcnZlZChzZWxmLl90b2tlbikKKyAgICAgICAgICAgICAgICBpZiByZXNlcnZlZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgaWYgcmVzZXJ2ZWQ9PSdJbicgYW5kIHNlbGYuX2Zvcl9jb3VudCE9MjoKKyAgICAgICAgICAgICAgICAgICAgICAgICNTb3JyeSwgbm90IGEgcmVzZXJ2ZWQgd29yZCBhZnRlciBhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3R5cGUgPSByZXNlcnZlZAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgcmVzZXJ2ZWQgaW4gKCdGb3InLCAnQ2FzZScpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2Zvcl9jb3VudCA9IDAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGVsaWYgYXJlX2RpZ2l0cyhzZWxmLl90b2tlbikgYW5kIGRlbGltIGluICgnPCcsICc+Jyk6CisgICAgICAgICAgICAgICAgICAgICNEZXRlY3QgSU9fTlVNQkVSCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3R5cGUgPSBUS19JT05VTUJFUgorICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5fdG9rZW49PSc7JzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fdHlwZSA9IFRLX0NPTU1BCisgICAgICAgICAgICAgICAgZWxpZiBzZWxmLl90b2tlbj09JyYnOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl90eXBlID0gVEtfQU1QRVJTQU5ECisgICAgICAgIGVsaWYgc2VsZi5fdHlwZT09VEtfQ09NTUVOVDoKKyAgICAgICAgICAgICNDb21tZW50cyBhcmUgbm90IHBhcnQgb2Ygc2ggZ3JhbW1hciwgaWdub3JlIHRoZW0KKyAgICAgICAgICAgIHNlbGYuX3Rva2VuID0gJycKKyAgICAgICAgICAgIHNlbGYuX3R5cGUgPSBUS19UT0tFTgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgCisgICAgICAgIGlmIHNlbGYuX2Zvcl9jb3VudCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICNUcmFjayB0b2tlbiBjb3VudCBpbiAnRm9yJyBleHByZXNzaW9uIHRvIGRldGVjdCAnSW4nIHJlc2VydmVkIHdvcmRzLgorICAgICAgICAgICAgI0NhbiBvbmx5IGJlIGluIHRoaXJkIHBvc2l0aW9uLCBubyBuZWVkIHRvIGdvIGJleW9uZAorICAgICAgICAgICAgc2VsZi5fZm9yX2NvdW50ICs9IDEKKyAgICAgICAgICAgIGlmIHNlbGYuX2Zvcl9jb3VudD09MzoKKyAgICAgICAgICAgICAgICBzZWxmLl9mb3JfY291bnQgPSBOb25lCisgICAgICAgICAgICAgICAgCisgICAgICAgIHNlbGYub25fdG9rZW4oKHNlbGYuX3Rva2VuLCBzZWxmLl90eXBlKSkKKyAgICAgICAgc2VsZi5fdG9rZW4gPSAnJworICAgICAgICBzZWxmLl90eXBlID0gVEtfVE9LRU4KKyAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGRlZiBvbl90b2tlbihzZWxmLCB0b2tlbik6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKyAgICAgICAgICAgICAgICAgCisKK3Rva2VucyA9IFsKKyAgICBUS19UT0tFTiwKKyMgVG8gc2lsZW5jZSB5YWNjIHVudXNlZCB0b2tlbiB3YXJuaW5ncworIyAgICBUS19DT01NRU5ULAorICAgIFRLX05FV0xJTkUsCisgICAgVEtfSU9OVU1CRVIsCisgICAgVEtfQVNTSUdOTUVOVCwKKyAgICBUS19IRVJFTkFNRSwKK10gICAgICAgICAgICAKKworI0FkZCBzcGVjaWZpYyBvcGVyYXRvcnMKK3Rva2VucyArPSBfT1BFUkFUT1JTLnZhbHVlcygpCisjQWRkIHJlc2VydmVkIHdvcmRzCit0b2tlbnMgKz0gX1JFU0VSVkVEUy52YWx1ZXMoKQorICAgICAgICAgICAgCitjbGFzcyBQTFlMZXhlcihMZXhlcik6CisgICAgIiIiQnJpZGdlIExleGVyIGFuZCBQTFkgbGV4ZXIgaW50ZXJmYWNlLiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgTGV4ZXIuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5fdG9rZW5zID0gW10KKyAgICAgICAgc2VsZi5fY3VycmVudCA9IDAKKyAgICAgICAgc2VsZi5saW5lbm8gPSAwCisKKyAgICBkZWYgb25fdG9rZW4oc2VsZiwgdG9rZW4pOgorICAgICAgICB2YWx1ZSwgdHlwZSA9IHRva2VuCisKKyAgICAgICAgc2VsZi5saW5lbm8gPSAwCisgICAgICAgIHQgPSBsZXguTGV4VG9rZW4oKQorICAgICAgICB0LnZhbHVlID0gdmFsdWUKKyAgICAgICAgdC50eXBlID0gdHlwZQorICAgICAgICB0LmxleGVyID0gc2VsZgorICAgICAgICB0LmxleHBvcyA9IDAKKyAgICAgICAgdC5saW5lbm8gPSAwCisgICAgICAgIAorICAgICAgICBzZWxmLl90b2tlbnMuYXBwZW5kKHQpCisgICAgICAgIAorICAgIGRlZiBpc19lbXB0eShzZWxmKToKKyAgICAgICAgcmV0dXJuIG5vdCBib29sKHNlbGYuX3Rva2VucykKKyAgICAgICAgCisgICAgI1BMWSBjb21wbGlhbnQgaW50ZXJmYWNlCisgICAgZGVmIHRva2VuKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9jdXJyZW50Pj1sZW4oc2VsZi5fdG9rZW5zKToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHQgPSBzZWxmLl90b2tlbnNbc2VsZi5fY3VycmVudF0KKyAgICAgICAgc2VsZi5fY3VycmVudCArPSAxCisgICAgICAgIHJldHVybiB0ICAgICAgCisgICAgICAgIAorICAgICAgICAKK2RlZiBnZXRfdG9rZW5zKHMpOgorICAgICIiIlBhcnNlIHRoZSBpbnB1dCBzdHJpbmcgYW5kIHJldHVybiBhIHR1cGxlICh0b2tlbnMsIHVucHJvY2Vzc2VkKSB3aGVyZQorICAgIHRva2VucyBpcyBhIGxpc3Qgb2YgcGFyc2VkIHRva2VucyBhbmQgdW5wcm9jZXNzZWQgaXMgdGhlIHBhcnQgb2YgdGhlIGlucHV0CisgICAgc3RyaW5nIGxlZnQgdW50b3VjaGVkIGJ5IHRoZSBsZXhlci4KKyAgICAiIiIKKyAgICBsZXhlciA9IFBMWUxleGVyKCkKKyAgICB1bnRvdWNoZWQgPSBsZXhlci5hZGQocywgVHJ1ZSkgCisgICAgdG9rZW5zID0gW10KKyAgICB3aGlsZSAxOgorICAgICAgICB0b2tlbiA9IGxleGVyLnRva2VuKCkKKyAgICAgICAgaWYgdG9rZW4gaXMgTm9uZToKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHRva2Vucy5hcHBlbmQodG9rZW4pCisgICAgICAgIAorICAgIHRva2VucyA9IFsodC52YWx1ZSwgdC50eXBlKSBmb3IgdCBpbiB0b2tlbnNdCisgICAgcmV0dXJuIHRva2VucywgdW50b3VjaGVkICAgICAgICAKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3B5c2gvcHlzaHlhY2MucHkgYi9iaXRiYWtlL2xpYi9iYi9weXNoL3B5c2h5YWNjLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZTgwYWEKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9weXNoL3B5c2h5YWNjLnB5CkBAIC0wLDAgKzEsNzc5IEBACisjIHB5c2h5YWNjLnB5IC0gUExZIGdyYW1tYXIgZGVmaW5pdGlvbiBmb3IgcHlzaAorIworIyBDb3B5cmlnaHQgMjAwNyBQYXRyaWNrIE1lemFyZAorIworIyBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKyIiIlBMWSBncmFtbWFyIGZpbGUuCisiIiIKK2ltcG9ydCBvcy5wYXRoCitpbXBvcnQgc3lzCisKK2ltcG9ydCBweXNobGV4Cit0b2tlbnMgPSBweXNobGV4LnRva2VucworCitmcm9tIHBseSBpbXBvcnQgeWFjYworaW1wb3J0IHNoZXJyb3JzCisgICAgCitjbGFzcyBJT1JlZGlyZWN0OgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvcCwgZmlsZW5hbWUsIGlvX251bWJlcj1Ob25lKToKKyAgICAgICAgc2VsZi5vcCA9IG9wCisgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQorICAgICAgICBzZWxmLmlvX251bWJlciA9IGlvX251bWJlcgorICAgICAgICAKK2NsYXNzIEhlcmVEb2N1bWVudDoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgb3AsIG5hbWUsIGNvbnRlbnQsIGlvX251bWJlcj1Ob25lKToKKyAgICAgICAgc2VsZi5vcCA9IG9wCisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi5jb250ZW50ID0gY29udGVudAorICAgICAgICBzZWxmLmlvX251bWJlciA9IGlvX251bWJlcgorCitkZWYgbWFrZV9pb19yZWRpcmVjdChwKToKKyAgICAiIiJNYWtlIGFuIElPUmVkaXJlY3QgaW5zdGFuY2UgZnJvbSB0aGUgaW5wdXQgJ2lvX3JlZGlyZWN0JyBwcm9kdWN0aW9uLiIiIgorICAgIG5hbWUsIGlvX251bWJlciwgaW9fdGFyZ2V0ID0gcAorICAgIGFzc2VydCBuYW1lPT0naW9fcmVkaXJlY3QnCisgICAgCisgICAgaWYgaW9fdGFyZ2V0WzBdPT0naW9fZmlsZSc6CisgICAgICAgIGlvX3R5cGUsIGlvX29wLCBpb19maWxlID0gaW9fdGFyZ2V0CisgICAgICAgIHJldHVybiBJT1JlZGlyZWN0KGlvX29wLCBpb19maWxlLCBpb19udW1iZXIpCisgICAgZWxpZiBpb190YXJnZXRbMF09PSdpb19oZXJlJzoKKyAgICAgICAgaW9fdHlwZSwgaW9fb3AsIGlvX25hbWUsIGlvX2NvbnRlbnQgPSBpb190YXJnZXQKKyAgICAgICAgcmV0dXJuIEhlcmVEb2N1bWVudChpb19vcCwgaW9fbmFtZSwgaW9fY29udGVudCwgaW9fbnVtYmVyKQorICAgIGVsc2U6CisgICAgICAgIGFzc2VydCBGYWxzZSwgIkludmFsaWQgSU8gcmVkaXJlY3Rpb24gdG9rZW4gJXMiICUgcmVwcihpb190eXBlKQorICAgICAgICAKK2NsYXNzIFNpbXBsZUNvbW1hbmQ6CisgICAgIiIiCisgICAgYXNzaWducyBjb250YWlucyAobmFtZSwgdmFsdWUpIHBhaXJzLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3b3JkcywgcmVkaXJzLCBhc3NpZ25zKToKKyAgICAgICAgc2VsZi53b3JkcyA9IGxpc3Qod29yZHMpCisgICAgICAgIHNlbGYucmVkaXJzID0gbGlzdChyZWRpcnMpCisgICAgICAgIHNlbGYuYXNzaWducyA9IGxpc3QoYXNzaWducykKKworY2xhc3MgUGlwZWxpbmU6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbW1hbmRzLCByZXZlcnNlX3N0YXR1cz1GYWxzZSk6CisgICAgICAgIHNlbGYuY29tbWFuZHMgPSBsaXN0KGNvbW1hbmRzKQorICAgICAgICBhc3NlcnQgc2VsZi5jb21tYW5kcyAgICAjR3JhbW1hciBmb3JiaWRzIHRoaXMKKyAgICAgICAgc2VsZi5yZXZlcnNlX3N0YXR1cyA9IHJldmVyc2Vfc3RhdHVzCisgICAgICAgIAorY2xhc3MgQW5kT3I6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9wLCBsZWZ0LCByaWdodCk6CisgICAgICAgIHNlbGYub3AgPSBzdHIob3ApCisgICAgICAgIHNlbGYubGVmdCA9IGxlZnQKKyAgICAgICAgc2VsZi5yaWdodCA9IHJpZ2h0CisgICAgICAgIAorY2xhc3MgRm9yTG9vcDoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgaXRlbXMsIGNtZHMpOgorICAgICAgICBzZWxmLm5hbWUgPSBzdHIobmFtZSkKKyAgICAgICAgc2VsZi5pdGVtcyA9IGxpc3QoaXRlbXMpCisgICAgICAgIHNlbGYuY21kcyA9IGxpc3QoY21kcykKKyAgICAgICAgCitjbGFzcyBXaGlsZUxvb3A6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmRpdGlvbiwgY21kcyk6CisgICAgICAgIHNlbGYuY29uZGl0aW9uID0gbGlzdChjb25kaXRpb24pCisgICAgICAgIHNlbGYuY21kcyA9IGxpc3QoY21kcykKKyAgICAgICAgCitjbGFzcyBVbnRpbExvb3A6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmRpdGlvbiwgY21kcyk6CisgICAgICAgIHNlbGYuY29uZGl0aW9uID0gbGlzdChjb25kaXRpb24pCisgICAgICAgIHNlbGYuY21kcyA9IGxpc3QoY21kcykKKworY2xhc3MgRnVuRGVmOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBib2R5KToKKyAgICAgICAgc2VsZi5uYW1lID0gc3RyKG5hbWUpCisgICAgICAgIHNlbGYuYm9keSA9IGJvZHkKKyAgICAgICAgCitjbGFzcyBCcmFjZUdyb3VwOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjbWRzKToKKyAgICAgICAgc2VsZi5jbWRzID0gbGlzdChjbWRzKQorICAgICAgICAKK2NsYXNzIElmQ29uZDoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZCwgaWZfY21kcywgZWxzZV9jbWRzKToKKyAgICAgICAgc2VsZi5jb25kID0gbGlzdChjb25kKQorICAgICAgICBzZWxmLmlmX2NtZHMgPSBpZl9jbWRzCisgICAgICAgIHNlbGYuZWxzZV9jbWRzID0gZWxzZV9jbWRzCisKK2NsYXNzIENhc2U6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGl0ZW1zKToKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBzZWxmLml0ZW1zID0gaXRlbXMKKyAgICAgICAgCitjbGFzcyBTdWJTaGVsbDoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY21kcyk6CisgICAgICAgIHNlbGYuY21kcyA9IGNtZHMKKworY2xhc3MgUmVkaXJlY3RMaXN0OgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjbWQsIHJlZGlycyk6CisgICAgICAgIHNlbGYuY21kID0gY21kCisgICAgICAgIHNlbGYucmVkaXJzID0gbGlzdChyZWRpcnMpCisgICAgICAgIAorZGVmIGdldF9wcm9kdWN0aW9uKHByb2R1Y3Rpb25zLCBwdHlwZSk6CisgICAgIiIicHJvZHVjdGlvbnMgbXVzdCBiZSBhIGxpc3Qgb2YgcHJvZHVjdGlvbiB0dXBsZXMgbGlrZSAobmFtZSwgb2JqKSB3aGVyZQorICAgIG5hbWUgaXMgdGhlIHByb2R1Y3Rpb24gc3RyaW5nIGlkZW50aWZpZXIuCisgICAgUmV0dXJuIHRoZSBmaXJzdCBwcm9kdWN0aW9uIG5hbWVkICdwdHlwZScuIFJhaXNlIEtleUVycm9yIGlmIE5vbmUgY2FuIGJlCisgICAgZm91bmQuCisgICAgIiIiCisgICAgZm9yIHByb2R1Y3Rpb24gaW4gcHJvZHVjdGlvbnM6CisgICAgICAgIGlmIHByb2R1Y3Rpb24gaXMgbm90IE5vbmUgYW5kIHByb2R1Y3Rpb25bMF09PXB0eXBlOgorICAgICAgICAgICAgcmV0dXJuIHByb2R1Y3Rpb24KKyAgICByYWlzZSBLZXlFcnJvcihwdHlwZSkKKyAgICAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFBMWSBncmFtbWFyIGRlZmluaXRpb24KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2RlZiBwX211bHRpcGxlX2NvbW1hbmRzKHApOgorICAgICIiIm11bHRpcGxlX2NvbW1hbmRzIDogbmV3bGluZV9zZXF1ZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgIHwgY29tcGxldGVfY29tbWFuZAorICAgICAgICAgICAgICAgICAgICAgICAgIHwgbXVsdGlwbGVfY29tbWFuZHMgY29tcGxldGVfY29tbWFuZCIiIgorICAgIGlmIGxlbihwKT09MjoKKyAgICAgICAgaWYgcFsxXSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHBbMF0gPSBbcFsxXV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBbMF0gPSBbXQorICAgIGVsc2U6CisgICAgICAgIHBbMF0gPSBwWzFdICsgW3BbMl1dCisKK2RlZiBwX2NvbXBsZXRlX2NvbW1hbmQocCk6CisgICAgIiIiY29tcGxldGVfY29tbWFuZCA6IGxpc3Qgc2VwYXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICB8IGxpc3QiIiIKKyAgICBpZiBsZW4ocCk9PTMgYW5kIHBbMl0gYW5kIHBbMl1bMV0gPT0gJyYnOgorICAgICAgICBwWzBdID0gKCdhc3luYycsIHBbMV0pCisgICAgZWxzZToKKyAgICAgICAgcFswXSA9IHBbMV0KKyAgICAgICAgICAgICAgICAgCitkZWYgcF9saXN0KHApOgorICAgICIiImxpc3QgOiBsaXN0IHNlcGFyYXRvcl9vcCBhbmRfb3IKKyAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgYW5kX29yIiIiCisgICAgaWYgbGVuKHApPT0yOgorICAgICAgICBwWzBdID0gW3BbMV1dCisgICAgZWxzZToKKyAgICAgICAgI2lmIHBbMl0hPSc7JzoKKyAgICAgICAgIyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdBTkQtT1IgbGlzdCBhc3luY2hyb25vdXMgZXhlY3V0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCcpCisgICAgICAgIHBbMF0gPSBwWzFdICsgW3BbM11dCisgICAgICAgCitkZWYgcF9hbmRfb3IocCk6CisgICAgIiIiYW5kX29yIDogcGlwZWxpbmUKKyAgICAgICAgICAgICAgfCBhbmRfb3IgQU5EX0lGIGxpbmVicmVhayBwaXBlbGluZQorICAgICAgICAgICAgICB8IGFuZF9vciBPUl9JRiAgbGluZWJyZWFrIHBpcGVsaW5lIiIiCisgICAgaWYgbGVuKHApPT0yOgorICAgICAgICBwWzBdID0gcFsxXQorICAgIGVsc2U6CisgICAgICAgIHBbMF0gPSAoJ2FuZF9vcicsIEFuZE9yKHBbMl0sIHBbMV0sIHBbNF0pKQorICAgICAgICAKK2RlZiBwX21heWJlX2Jhbmdfd29yZChwKToKKyAgICAiIiJtYXliZV9iYW5nX3dvcmQgOiBCYW5nIiIiCisgICAgcFswXSA9ICgnbWF5YmVfYmFuZ193b3JkJywgcFsxXSkKKyAgICAgICAgICAgIAorZGVmIHBfcGlwZWxpbmUocCk6CisgICAgIiIicGlwZWxpbmUgOiBwaXBlX3NlcXVlbmNlCisgICAgICAgICAgICAgICAgfCBiYW5nX3dvcmQgcGlwZV9zZXF1ZW5jZSIiIgorICAgIGlmIGxlbihwKT09MzoKKyAgICAgICAgcFswXSA9ICgncGlwZWxpbmUnLCBQaXBlbGluZShwWzJdWzE6XSwgVHJ1ZSkpCisgICAgZWxzZToKKyAgICAgICAgcFswXSA9ICgncGlwZWxpbmUnLCBQaXBlbGluZShwWzFdWzE6XSkpCisKK2RlZiBwX3BpcGVfc2VxdWVuY2UocCk6CisgICAgIiIicGlwZV9zZXF1ZW5jZSA6IGNvbW1hbmQKKyAgICAgICAgICAgICAgICAgICAgIHwgcGlwZV9zZXF1ZW5jZSBQSVBFIGxpbmVicmVhayBjb21tYW5kIiIiCisgICAgaWYgbGVuKHApPT0yOgorICAgICAgICBwWzBdID0gWydwaXBlX3NlcXVlbmNlJywgcFsxXV0KKyAgICBlbHNlOgorICAgICAgICBwWzBdID0gcFsxXSArIFtwWzRdXQorCitkZWYgcF9jb21tYW5kKHApOgorICAgICIiImNvbW1hbmQgOiBzaW1wbGVfY29tbWFuZAorICAgICAgICAgICAgICAgfCBjb21wb3VuZF9jb21tYW5kCisgICAgICAgICAgICAgICB8IGNvbXBvdW5kX2NvbW1hbmQgcmVkaXJlY3RfbGlzdAorICAgICAgICAgICAgICAgfCBmdW5jdGlvbl9kZWZpbml0aW9uIiIiCisgICAgICAgIAorICAgIGlmIHBbMV1bMF0gaW4gKCAnc2ltcGxlX2NvbW1hbmQnLCAKKyAgICAgICAgICAgICAgICAgICAgJ2Zvcl9jbGF1c2UnLAorICAgICAgICAgICAgICAgICAgICAnd2hpbGVfY2xhdXNlJywKKyAgICAgICAgICAgICAgICAgICAgJ3VudGlsX2NsYXVzZScsCisgICAgICAgICAgICAgICAgICAgICdjYXNlX2NsYXVzZScsCisgICAgICAgICAgICAgICAgICAgICdpZl9jbGF1c2UnLAorICAgICAgICAgICAgICAgICAgICAnZnVuY3Rpb25fZGVmaW5pdGlvbicsCisgICAgICAgICAgICAgICAgICAgICdzdWJzaGVsbCcsCisgICAgICAgICAgICAgICAgICAgICdicmFjZV9ncm91cCcsKToKKyAgICAgICAgaWYgbGVuKHApID09IDI6CisgICAgICAgICAgICBwWzBdID0gcFsxXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcFswXSA9ICgncmVkaXJlY3RfbGlzdCcsIFJlZGlyZWN0TGlzdChwWzFdLCBwWzJdWzE6XSkpCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignJXMgY29tbWFuZCBpcyBub3QgaW1wbGVtZW50ZWQnICUgcmVwcihwWzFdWzBdKSkKKworZGVmIHBfY29tcG91bmRfY29tbWFuZChwKToKKyAgICAiIiJjb21wb3VuZF9jb21tYW5kIDogYnJhY2VfZ3JvdXAKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgc3Vic2hlbGwKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgZm9yX2NsYXVzZQorICAgICAgICAgICAgICAgICAgICAgICAgfCBjYXNlX2NsYXVzZQorICAgICAgICAgICAgICAgICAgICAgICAgfCBpZl9jbGF1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgd2hpbGVfY2xhdXNlCisgICAgICAgICAgICAgICAgICAgICAgICB8IHVudGlsX2NsYXVzZSIiIgorICAgIHBbMF0gPSBwWzFdCisKK2RlZiBwX3N1YnNoZWxsKHApOgorICAgICIiInN1YnNoZWxsIDogTFBBUkVOUyBjb21wb3VuZF9saXN0IFJQQVJFTlMiIiIKKyAgICBwWzBdID0gKCdzdWJzaGVsbCcsIFN1YlNoZWxsKHBbMl1bMTpdKSkKKworZGVmIHBfY29tcG91bmRfbGlzdChwKToKKyAgICAiIiJjb21wb3VuZF9saXN0IDogdGVybQorICAgICAgICAgICAgICAgICAgICAgfCBuZXdsaW5lX2xpc3QgdGVybQorICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgdGVybSBzZXBhcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgIHwgbmV3bGluZV9saXN0IHRlcm0gc2VwYXJhdG9yIiIiCisgICAgcHJvZHVjdGlvbnMgPSBwWzE6XSAgICAgICAgICAgCisgICAgdHJ5OgorICAgICAgICBzZXAgPSBnZXRfcHJvZHVjdGlvbihwcm9kdWN0aW9ucywgJ3NlcGFyYXRvcicpCisgICAgICAgIGlmIHNlcFsxXSE9JzsnOgorICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICBwYXNzCisgICAgdGVybSA9IGdldF9wcm9kdWN0aW9uKHByb2R1Y3Rpb25zLCAndGVybScpCisgICAgcFswXSA9IFsnY29tcG91bmRfbGlzdCddICsgdGVybVsxOl0KKworZGVmIHBfdGVybShwKToKKyAgICAiIiJ0ZXJtIDogdGVybSBzZXBhcmF0b3IgYW5kX29yCisgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIGFuZF9vciIiIgorICAgIGlmIGxlbihwKT09MjoKKyAgICAgICAgcFswXSA9IFsndGVybScsIHBbMV1dCisgICAgZWxzZToKKyAgICAgICAgaWYgcFsyXSBpcyBub3QgTm9uZSBhbmQgcFsyXVsxXSA9PSAnJic6CisgICAgICAgICAgICBwWzBdID0gWyd0ZXJtJywgKCdhc3luYycsIHBbMV1bMTpdKV0gKyBbcFszXV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBbMF0gPSBwWzFdICsgW3BbM11dCisgICAgICAgICAgICAKK2RlZiBwX21heWJlX2Zvcl93b3JkKHApOgorICAgICMgUmVhcnJhbmdlICdGb3InIHByaW9yaXR5IHdydCBUT0tFTi4gU2VlIHBfZm9yX3dvcmQKKyAgICAiIiJtYXliZV9mb3Jfd29yZCA6IEZvciIiIgorICAgIHBbMF0gPSAoJ21heWJlX2Zvcl93b3JkJywgcFsxXSkKKworZGVmIHBfZm9yX2NsYXVzZShwKToKKyAgICAiIiJmb3JfY2xhdXNlIDogZm9yX3dvcmQgbmFtZSBsaW5lYnJlYWsgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9fZ3JvdXAKKyAgICAgICAgICAgICAgICAgIHwgZm9yX3dvcmQgbmFtZSBsaW5lYnJlYWsgaW4gICAgICAgICAgc2VxdWVudGlhbF9zZXAgZG9fZ3JvdXAKKyAgICAgICAgICAgICAgICAgIHwgZm9yX3dvcmQgbmFtZSBsaW5lYnJlYWsgaW4gd29yZGxpc3Qgc2VxdWVudGlhbF9zZXAgZG9fZ3JvdXAiIiIKKyAgICBwcm9kdWN0aW9ucyA9IHBbMTpdCisgICAgZG9fZ3JvdXAgPSBnZXRfcHJvZHVjdGlvbihwcm9kdWN0aW9ucywgJ2RvX2dyb3VwJykKKyAgICB0cnk6CisgICAgICAgIGl0ZW1zID0gZ2V0X3Byb2R1Y3Rpb24ocHJvZHVjdGlvbnMsICdpbicpWzE6XQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignImluIiBvbWlzc2lvbiBpcyBub3QgaW1wbGVtZW50ZWQnKQorICAgICAgICAKKyAgICB0cnk6CisgICAgICAgIGl0ZW1zID0gZ2V0X3Byb2R1Y3Rpb24ocHJvZHVjdGlvbnMsICd3b3JkbGlzdCcpWzE6XQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgaXRlbXMgPSBbXQorICAgICAgICAKKyAgICBuYW1lID0gcFsyXQorICAgIHBbMF0gPSAoJ2Zvcl9jbGF1c2UnLCBGb3JMb29wKG5hbWUsIGl0ZW1zLCBkb19ncm91cFsxOl0pKQorCitkZWYgcF9uYW1lKHApOgorICAgICIiIm5hbWUgOiB0b2tlbiIiIiAjV2FzIE5BTUUgaW5zdGVhZCBvZiB0b2tlbgorICAgIHBbMF0gPSBwWzFdCisKK2RlZiBwX2luKHApOgorICAgICIiImluIDogSW4iIiIKKyAgICBwWzBdID0gKCdpbicsIHBbMV0pCisKK2RlZiBwX3dvcmRsaXN0KHApOgorICAgICIiIndvcmRsaXN0IDogd29yZGxpc3QgdG9rZW4KKyAgICAgICAgICAgICAgICB8ICAgICAgICAgIHRva2VuIiIiCisgICAgaWYgbGVuKHApPT0yOgorICAgICAgICBwWzBdID0gWyd3b3JkbGlzdCcsICgnVE9LRU4nLCBwWzFdKV0KKyAgICBlbHNlOgorICAgICAgICBwWzBdID0gcFsxXSArIFsoJ1RPS0VOJywgcFsyXSldCisKK2RlZiBwX2Nhc2VfY2xhdXNlKHApOgorICAgICIiImNhc2VfY2xhdXNlIDogQ2FzZSB0b2tlbiBsaW5lYnJlYWsgaW4gbGluZWJyZWFrIGNhc2VfbGlzdCAgICBFc2FjCisgICAgICAgICAgICAgICAgICAgfCBDYXNlIHRva2VuIGxpbmVicmVhayBpbiBsaW5lYnJlYWsgY2FzZV9saXN0X25zIEVzYWMKKyAgICAgICAgICAgICAgICAgICB8IENhc2UgdG9rZW4gbGluZWJyZWFrIGluIGxpbmVicmVhayAgICAgICAgICAgICAgRXNhYyIiIgorICAgIGlmIGxlbihwKSA8IDg6CisgICAgICAgIGl0ZW1zID0gW10KKyAgICBlbHNlOgorICAgICAgICBpdGVtcyA9IHBbNl1bMTpdCisgICAgbmFtZSA9IHBbMl0KKyAgICBwWzBdID0gKCdjYXNlX2NsYXVzZScsIENhc2UobmFtZSwgW2NbMV0gZm9yIGMgaW4gaXRlbXNdKSkKKyAgICAgICAKK2RlZiBwX2Nhc2VfbGlzdF9ucyhwKToKKyAgICAiIiJjYXNlX2xpc3RfbnMgOiBjYXNlX2xpc3QgY2FzZV9pdGVtX25zCisgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIGNhc2VfaXRlbV9ucyIiIgorICAgIHBfY2FzZV9saXN0KHApCisgICAgICAKK2RlZiBwX2Nhc2VfbGlzdChwKToKKyAgICAiIiJjYXNlX2xpc3QgOiBjYXNlX2xpc3QgY2FzZV9pdGVtCisgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIGNhc2VfaXRlbSIiIgorICAgIGlmIGxlbihwKT09MjoKKyAgICAgICAgcFswXSA9IFsnY2FzZV9saXN0JywgcFsxXV0KKyAgICBlbHNlOgorICAgICAgICBwWzBdID0gcFsxXSArIFtwWzJdXQorICAgICAgICAKK2RlZiBwX2Nhc2VfaXRlbV9ucyhwKToKKyAgICAiIiJjYXNlX2l0ZW1fbnMgOiAgICAgICAgIHBhdHRlcm4gUlBBUkVOUyAgICAgICAgICAgICAgIGxpbmVicmVhaworICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgcGF0dGVybiBSUEFSRU5TIGNvbXBvdW5kX2xpc3QgbGluZWJyZWFrCisgICAgICAgICAgICAgICAgICAgIHwgTFBBUkVOUyBwYXR0ZXJuIFJQQVJFTlMgICAgICAgICAgICAgICBsaW5lYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgfCBMUEFSRU5TIHBhdHRlcm4gUlBBUkVOUyBjb21wb3VuZF9saXN0IGxpbmVicmVhayIiIgorICAgIHBfY2FzZV9pdGVtKHApCisgICAgICAgICAgICAgICAgIAorZGVmIHBfY2FzZV9pdGVtKHApOgorICAgICIiImNhc2VfaXRlbSA6ICAgICAgICAgcGF0dGVybiBSUEFSRU5TIGxpbmVicmVhayAgICAgRFNFTUkgbGluZWJyZWFrCisgICAgICAgICAgICAgICAgIHwgICAgICAgICBwYXR0ZXJuIFJQQVJFTlMgY29tcG91bmRfbGlzdCBEU0VNSSBsaW5lYnJlYWsKKyAgICAgICAgICAgICAgICAgfCBMUEFSRU5TIHBhdHRlcm4gUlBBUkVOUyBsaW5lYnJlYWsgICAgIERTRU1JIGxpbmVicmVhaworICAgICAgICAgICAgICAgICB8IExQQVJFTlMgcGF0dGVybiBSUEFSRU5TIGNvbXBvdW5kX2xpc3QgRFNFTUkgbGluZWJyZWFrIiIiCisgICAgaWYgbGVuKHApIDwgNzoKKyAgICAgICAgbmFtZSA9IHBbMV1bMTpdCisgICAgZWxzZToKKyAgICAgICAgbmFtZSA9IHBbMl1bMTpdCisKKyAgICB0cnk6CisgICAgICAgIGNtZHMgPSBnZXRfcHJvZHVjdGlvbihwWzE6XSwgImNvbXBvdW5kX2xpc3QiKVsxOl0KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIGNtZHMgPSBbXQorCisgICAgcFswXSA9ICgnY2FzZV9pdGVtJywgKG5hbWUsIGNtZHMpKQorICAgICAgICAgICAgICAgICAKK2RlZiBwX3BhdHRlcm4ocCk6CisgICAgIiIicGF0dGVybiA6ICAgICAgICAgICAgICB0b2tlbgorICAgICAgICAgICAgICAgfCBwYXR0ZXJuIFBJUEUgdG9rZW4iIiIKKyAgICBpZiBsZW4ocCk9PTI6CisgICAgICAgIHBbMF0gPSBbJ3BhdHRlcm4nLCAoJ1RPS0VOJywgcFsxXSldCisgICAgZWxzZToKKyAgICAgICAgcFswXSA9IHBbMV0gKyBbKCdUT0tFTicsIHBbMl0pXQorCitkZWYgcF9tYXliZV9pZl93b3JkKHApOgorICAgICMgUmVhcnJhbmdlICdJZicgcHJpb3JpdHkgd3J0IFRPS0VOLiBTZWUgcF9pZl93b3JkCisgICAgIiIibWF5YmVfaWZfd29yZCA6IElmIiIiCisgICAgcFswXSA9ICgnbWF5YmVfaWZfd29yZCcsIHBbMV0pCisKK2RlZiBwX21heWJlX3RoZW5fd29yZChwKToKKyAgICAjIFJlYXJyYW5nZSAnVGhlbicgcHJpb3JpdHkgd3J0IFRPS0VOLiBTZWUgcF90aGVuX3dvcmQKKyAgICAiIiJtYXliZV90aGVuX3dvcmQgOiBUaGVuIiIiCisgICAgcFswXSA9ICgnbWF5YmVfdGhlbl93b3JkJywgcFsxXSkKKyAgICAgICAgICAgICAgICAgCitkZWYgcF9pZl9jbGF1c2UocCk6CisgICAgIiIiaWZfY2xhdXNlIDogaWZfd29yZCBjb21wb3VuZF9saXN0IHRoZW5fd29yZCBjb21wb3VuZF9saXN0IGVsc2VfcGFydCBGaQorICAgICAgICAgICAgICAgICB8IGlmX3dvcmQgY29tcG91bmRfbGlzdCB0aGVuX3dvcmQgY29tcG91bmRfbGlzdCAgICAgICAgICAgRmkiIiIKKyAgICBlbHNlX3BhcnQgPSBbXQorICAgIGlmIGxlbihwKT09NzoKKyAgICAgICAgZWxzZV9wYXJ0ID0gcFs1XQorICAgIHBbMF0gPSAoJ2lmX2NsYXVzZScsIElmQ29uZChwWzJdWzE6XSwgcFs0XVsxOl0sIGVsc2VfcGFydCkpCisgICAgICAgICAgICAgICAgIAorZGVmIHBfZWxzZV9wYXJ0KHApOgorICAgICIiImVsc2VfcGFydCA6IEVsaWYgY29tcG91bmRfbGlzdCB0aGVuX3dvcmQgY29tcG91bmRfbGlzdCBlbHNlX3BhcnQKKyAgICAgICAgICAgICAgICAgfCBFbGlmIGNvbXBvdW5kX2xpc3QgdGhlbl93b3JkIGNvbXBvdW5kX2xpc3QKKyAgICAgICAgICAgICAgICAgfCBFbHNlIGNvbXBvdW5kX2xpc3QiIiIKKyAgICBpZiBsZW4ocCk9PTM6CisgICAgICAgIHBbMF0gPSBwWzJdWzE6XQorICAgIGVsc2U6CisgICAgICAgIGVsc2VfcGFydCA9IFtdCisgICAgICAgIGlmIGxlbihwKT09NjoKKyAgICAgICAgICAgIGVsc2VfcGFydCA9IHBbNV0KKyAgICAgICAgcFswXSA9ICgnZWxpZicsIElmQ29uZChwWzJdWzE6XSwgcFs0XVsxOl0sIGVsc2VfcGFydCkpCisgICAgICAgICAgICAgICAgIAorZGVmIHBfd2hpbGVfY2xhdXNlKHApOgorICAgICIiIndoaWxlX2NsYXVzZSA6IFdoaWxlIGNvbXBvdW5kX2xpc3QgZG9fZ3JvdXAiIiIKKyAgICBwWzBdID0gKCd3aGlsZV9jbGF1c2UnLCBXaGlsZUxvb3AocFsyXVsxOl0sIHBbM11bMTpdKSkKKyAgICAKK2RlZiBwX21heWJlX3VudGlsX3dvcmQocCk6CisgICAgIyBSZWFycmFuZ2UgJ1VudGlsJyBwcmlvcml0eSB3cnQgVE9LRU4uIFNlZSBwX3VudGlsX3dvcmQKKyAgICAiIiJtYXliZV91bnRpbF93b3JkIDogVW50aWwiIiIKKyAgICBwWzBdID0gKCdtYXliZV91bnRpbF93b3JkJywgcFsxXSkKKyAgICAgICAgICAgCitkZWYgcF91bnRpbF9jbGF1c2UocCk6CisgICAgIiIidW50aWxfY2xhdXNlIDogdW50aWxfd29yZCBjb21wb3VuZF9saXN0IGRvX2dyb3VwIiIiCisgICAgcFswXSA9ICgndW50aWxfY2xhdXNlJywgVW50aWxMb29wKHBbMl1bMTpdLCBwWzNdWzE6XSkpCisgICAgICAgICAgICAgICAgIAorZGVmIHBfZnVuY3Rpb25fZGVmaW5pdGlvbihwKToKKyAgICAiIiJmdW5jdGlvbl9kZWZpbml0aW9uIDogZm5hbWUgTFBBUkVOUyBSUEFSRU5TIGxpbmVicmVhayBmdW5jdGlvbl9ib2R5IiIiCisgICAgcFswXSA9ICgnZnVuY3Rpb25fZGVmaW5pdGlvbicsIEZ1bkRlZihwWzFdLCBwWzVdKSkKKyAgICAgICAgICAgICAgICAgCitkZWYgcF9mdW5jdGlvbl9ib2R5KHApOgorICAgICIiImZ1bmN0aW9uX2JvZHkgOiBjb21wb3VuZF9jb21tYW5kCisgICAgICAgICAgICAgICAgICAgICB8IGNvbXBvdW5kX2NvbW1hbmQgcmVkaXJlY3RfbGlzdCIiIgorICAgIGlmIGxlbihwKSE9MjoKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignZnVuY3Rpb25zIHJlZGlyZWN0aW9ucyBsaXN0cyBhcmUgbm90IGltcGxlbWVudGVkJykgICAgCisgICAgcFswXSA9IHBbMV0gICAgCisKK2RlZiBwX2ZuYW1lKHApOgorICAgICIiImZuYW1lIDogVE9LRU4iIiIgI1dhcyBOQU1FIGluc3RlYWQgb2YgdG9rZW4KKyAgICBwWzBdID0gcFsxXQorCitkZWYgcF9icmFjZV9ncm91cChwKToKKyAgICAiIiJicmFjZV9ncm91cCA6IExicmFjZSBjb21wb3VuZF9saXN0IFJicmFjZSIiIgorICAgIHBbMF0gPSAoJ2JyYWNlX2dyb3VwJywgQnJhY2VHcm91cChwWzJdWzE6XSkpCisKK2RlZiBwX21heWJlX2RvbmVfd29yZChwKToKKyAgICAjU2VlIHBfYXNzaWdubWVudF93b3JkIGZvciBkZXRhaWxzLgorICAgICIiIm1heWJlX2RvbmVfd29yZCA6IERvbmUiIiIKKyAgICBwWzBdID0gKCdtYXliZV9kb25lX3dvcmQnLCBwWzFdKQorCitkZWYgcF9tYXliZV9kb193b3JkKHApOgorICAgICIiIm1heWJlX2RvX3dvcmQgOiBEbyIiIgorICAgIHBbMF0gPSAoJ21heWJlX2RvX3dvcmQnLCBwWzFdKQorCitkZWYgcF9kb19ncm91cChwKToKKyAgICAiIiJkb19ncm91cCA6IGRvX3dvcmQgY29tcG91bmRfbGlzdCBkb25lX3dvcmQiIiIKKyAgICAjRG8gZ3JvdXAgY29udGFpbnMgYSBsaXN0IG9mIEFuZE9yCisgICAgcFswXSA9IFsnZG9fZ3JvdXAnXSArIHBbMl1bMTpdCisKK2RlZiBwX3NpbXBsZV9jb21tYW5kKHApOgorICAgICIiInNpbXBsZV9jb21tYW5kIDogY21kX3ByZWZpeCBjbWRfd29yZCBjbWRfc3VmZml4CisgICAgICAgICAgICAgICAgICAgICAgfCBjbWRfcHJlZml4IGNtZF93b3JkCisgICAgICAgICAgICAgICAgICAgICAgfCBjbWRfcHJlZml4CisgICAgICAgICAgICAgICAgICAgICAgfCBjbWRfbmFtZSBjbWRfc3VmZml4CisgICAgICAgICAgICAgICAgICAgICAgfCBjbWRfbmFtZSIiIgorICAgIHdvcmRzLCByZWRpcnMsIGFzc2lnbnMgPSBbXSwgW10sIFtdCisgICAgZm9yIGUgaW4gcFsxOl06CisgICAgICAgIG5hbWUgPSBlWzBdCisgICAgICAgIGlmIG5hbWUgaW4gKCdjbWRfcHJlZml4JywgJ2NtZF9zdWZmaXgnKToKKyAgICAgICAgICAgIGZvciBzdWJlIGluIGVbMTpdOgorICAgICAgICAgICAgICAgIHN1Ym5hbWUgPSBzdWJlWzBdCisgICAgICAgICAgICAgICAgaWYgc3VibmFtZT09J2lvX3JlZGlyZWN0JzoKKyAgICAgICAgICAgICAgICAgICAgcmVkaXJzLmFwcGVuZChtYWtlX2lvX3JlZGlyZWN0KHN1YmUpKQorICAgICAgICAgICAgICAgIGVsaWYgc3VibmFtZT09J0FTU0lHTk1FTlRfV09SRCc6CisgICAgICAgICAgICAgICAgICAgIGFzc2lnbnMuYXBwZW5kKHN1YmUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgd29yZHMuYXBwZW5kKHN1YmUpCisgICAgICAgIGVsaWYgbmFtZSBpbiAoJ2NtZF93b3JkJywgJ2NtZF9uYW1lJyk6CisgICAgICAgICAgICB3b3Jkcy5hcHBlbmQoZSkKKyAgICAgICAgICAgIAorICAgIGNtZCA9IFNpbXBsZUNvbW1hbmQod29yZHMsIHJlZGlycywgYXNzaWducykKKyAgICBwWzBdID0gKCdzaW1wbGVfY29tbWFuZCcsIGNtZCkKKworZGVmIHBfY21kX25hbWUocCk6CisgICAgIiIiY21kX25hbWUgOiBUT0tFTiIiIgorICAgIHBbMF0gPSAoJ2NtZF9uYW1lJywgcFsxXSkKKyAgICAKK2RlZiBwX2NtZF93b3JkKHApOgorICAgICIiImNtZF93b3JkIDogdG9rZW4iIiIKKyAgICBwWzBdID0gKCdjbWRfd29yZCcsIHBbMV0pCisKK2RlZiBwX21heWJlX2Fzc2lnbm1lbnRfd29yZChwKToKKyAgICAjU2VlIHBfYXNzaWdubWVudF93b3JkIGZvciBkZXRhaWxzLgorICAgICIiIm1heWJlX2Fzc2lnbm1lbnRfd29yZCA6IEFTU0lHTk1FTlRfV09SRCIiIgorICAgIHBbMF0gPSAoJ21heWJlX2Fzc2lnbm1lbnRfd29yZCcsIHBbMV0pCisgICAgCitkZWYgcF9jbWRfcHJlZml4KHApOgorICAgICIiImNtZF9wcmVmaXggOiAgICAgICAgICAgIGlvX3JlZGlyZWN0CisgICAgICAgICAgICAgICAgICB8IGNtZF9wcmVmaXggaW9fcmVkaXJlY3QKKyAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICBhc3NpZ25tZW50X3dvcmQKKyAgICAgICAgICAgICAgICAgIHwgY21kX3ByZWZpeCBhc3NpZ25tZW50X3dvcmQiIiIKKyAgICB0cnk6CisgICAgICAgIHByZWZpeCA9IGdldF9wcm9kdWN0aW9uKHBbMTpdLCAnY21kX3ByZWZpeCcpCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICBwcmVmaXggPSBbJ2NtZF9wcmVmaXgnXQorICAgICAgICAKKyAgICB0cnk6CisgICAgICAgIHZhbHVlID0gZ2V0X3Byb2R1Y3Rpb24ocFsxOl0sICdhc3NpZ25tZW50X3dvcmQnKVsxXQorICAgICAgICB2YWx1ZSA9ICgnQVNTSUdOTUVOVF9XT1JEJywgdmFsdWUuc3BsaXQoJz0nLCAxKSkKKyAgICBleGNlcHQgS2V5RXJyb3I6ICAgICAgICAKKyAgICAgICAgdmFsdWUgPSBnZXRfcHJvZHVjdGlvbihwWzE6XSwgJ2lvX3JlZGlyZWN0JykKKyAgICBwWzBdID0gcHJlZml4ICsgW3ZhbHVlXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorZGVmIHBfY21kX3N1ZmZpeChwKToKKyAgICAiIiJjbWRfc3VmZml4ICAgOiAgICAgICAgICAgIGlvX3JlZGlyZWN0CisgICAgICAgICAgICAgICAgICAgIHwgY21kX3N1ZmZpeCBpb19yZWRpcmVjdAorICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgdG9rZW4KKyAgICAgICAgICAgICAgICAgICAgfCBjbWRfc3VmZml4IHRva2VuCisgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICBtYXliZV9mb3Jfd29yZAorICAgICAgICAgICAgICAgICAgICB8IGNtZF9zdWZmaXggbWF5YmVfZm9yX3dvcmQKKyAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIG1heWJlX2RvbmVfd29yZAorICAgICAgICAgICAgICAgICAgICB8IGNtZF9zdWZmaXggbWF5YmVfZG9uZV93b3JkCisgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICBtYXliZV9kb193b3JkCisgICAgICAgICAgICAgICAgICAgIHwgY21kX3N1ZmZpeCBtYXliZV9kb193b3JkCisgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICBtYXliZV91bnRpbF93b3JkCisgICAgICAgICAgICAgICAgICAgIHwgY21kX3N1ZmZpeCBtYXliZV91bnRpbF93b3JkCisgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICBtYXliZV9hc3NpZ25tZW50X3dvcmQKKyAgICAgICAgICAgICAgICAgICAgfCBjbWRfc3VmZml4IG1heWJlX2Fzc2lnbm1lbnRfd29yZAorICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgbWF5YmVfaWZfd29yZAorICAgICAgICAgICAgICAgICAgICB8IGNtZF9zdWZmaXggbWF5YmVfaWZfd29yZAorICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgbWF5YmVfdGhlbl93b3JkCisgICAgICAgICAgICAgICAgICAgIHwgY21kX3N1ZmZpeCBtYXliZV90aGVuX3dvcmQKKyAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIG1heWJlX2Jhbmdfd29yZAorICAgICAgICAgICAgICAgICAgICB8IGNtZF9zdWZmaXggbWF5YmVfYmFuZ193b3JkIiIiCisgICAgdHJ5OgorICAgICAgICBzdWZmaXggPSBnZXRfcHJvZHVjdGlvbihwWzE6XSwgJ2NtZF9zdWZmaXgnKQorICAgICAgICB0b2tlbiA9IHBbMl0KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIHN1ZmZpeCA9IFsnY21kX3N1ZmZpeCddCisgICAgICAgIHRva2VuID0gcFsxXQorICAgICAgICAKKyAgICBpZiBpc2luc3RhbmNlKHRva2VuLCB0dXBsZSk6CisgICAgICAgIGlmIHRva2VuWzBdPT0naW9fcmVkaXJlY3QnOgorICAgICAgICAgICAgcFswXSA9IHN1ZmZpeCArIFt0b2tlbl0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICNDb252ZXJ0IG1heWJlXyogIHRvIFRPS0VOIGlmIG5lY2Vzc2FyeQorICAgICAgICAgICAgcFswXSA9IHN1ZmZpeCArIFsoJ1RPS0VOJywgdG9rZW5bMV0pXQorICAgIGVsc2U6CisgICAgICAgIHBbMF0gPSBzdWZmaXggKyBbKCdUT0tFTicsIHRva2VuKV0KKyAgICAgICAgICAgICAgICAgCitkZWYgcF9yZWRpcmVjdF9saXN0KHApOgorICAgICIiInJlZGlyZWN0X2xpc3QgOiBpb19yZWRpcmVjdAorICAgICAgICAgICAgICAgICAgICAgfCByZWRpcmVjdF9saXN0IGlvX3JlZGlyZWN0IiIiCisgICAgaWYgbGVuKHApID09IDI6CisgICAgICAgIHBbMF0gPSBbJ3JlZGlyZWN0X2xpc3QnLCBtYWtlX2lvX3JlZGlyZWN0KHBbMV0pXQorICAgIGVsc2U6CisgICAgICAgIHBbMF0gPSBwWzFdICsgW21ha2VfaW9fcmVkaXJlY3QocFsyXSldCisgICAgCitkZWYgcF9pb19yZWRpcmVjdChwKToKKyAgICAiIiJpb19yZWRpcmVjdCA6ICAgICAgICAgICBpb19maWxlCisgICAgICAgICAgICAgICAgICAgfCBJT19OVU1CRVIgaW9fZmlsZQorICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIGlvX2hlcmUKKyAgICAgICAgICAgICAgICAgICB8IElPX05VTUJFUiBpb19oZXJlIiIiCisgICAgaWYgbGVuKHApPT0zOgorICAgICAgICBwWzBdID0gKCdpb19yZWRpcmVjdCcsIHBbMV0sIHBbMl0pCisgICAgZWxzZToKKyAgICAgICAgcFswXSA9ICgnaW9fcmVkaXJlY3QnLCBOb25lLCBwWzFdKQorICAgIAorZGVmIHBfaW9fZmlsZShwKToKKyAgICAjUmV0dXJuIHRoZSB0dXBsZSAob3BlcmF0b3IsIGZpbGVuYW1lKQorICAgICIiImlvX2ZpbGUgOiBMRVNTICAgICAgZmlsZW5hbWUKKyAgICAgICAgICAgICAgIHwgTEVTU0FORCAgIGZpbGVuYW1lCisgICAgICAgICAgICAgICB8IEdSRUFURVIgICBmaWxlbmFtZQorICAgICAgICAgICAgICAgfCBHUkVBVEFORCAgZmlsZW5hbWUKKyAgICAgICAgICAgICAgIHwgREdSRUFUICAgIGZpbGVuYW1lCisgICAgICAgICAgICAgICB8IExFU1NHUkVBVCBmaWxlbmFtZQorICAgICAgICAgICAgICAgfCBDTE9CQkVSICAgZmlsZW5hbWUiIiIKKyAgICAjRXh0cmFjdCB0aGUgZmlsZW5hbWUgZnJvbSB0aGUgZmlsZQorICAgIHBbMF0gPSAoJ2lvX2ZpbGUnLCBwWzFdLCBwWzJdWzFdKQorCitkZWYgcF9maWxlbmFtZShwKToKKyAgICAjUmV0dXJuIHRoZSBmaWxlbmFtZQorICAgICIiImZpbGVuYW1lIDogVE9LRU4iIiIKKyAgICBwWzBdID0gKCdmaWxlbmFtZScsIHBbMV0pCisgICAgICAgIAorZGVmIHBfaW9faGVyZShwKToKKyAgICAiIiJpb19oZXJlIDogRExFU1MgaGVyZV9lbmQKKyAgICAgICAgICAgICAgIHwgRExFU1NEQVNIIGhlcmVfZW5kIiIiCisgICAgcFswXSA9ICgnaW9faGVyZScsIHBbMV0sIHBbMl1bMV0sIHBbMl1bMl0pCisKK2RlZiBwX2hlcmVfZW5kKHApOgorICAgICIiImhlcmVfZW5kIDogSEVSRU5BTUUgVE9LRU4iIiIKKyAgICBwWzBdID0gKCdoZXJlX2RvY3VtZW50JywgcFsxXSwgcFsyXSkKKyAgICAKK2RlZiBwX25ld2xpbmVfc2VxdWVuY2UocCk6CisgICAgIyBOb3RoaW5nIGluIHRoZSBncmFtbWFyIGNhbiBoYW5kbGUgbGVhZGluZyBORVdMSU5FIHByb2R1Y3Rpb25zLCBzbyBhZGQKKyAgICAjIHRoaXMgb25lIHdpdGggdGhlIGxvd2VzdCBwb3NzaWJsZSBwcmlvcml0eSByZWxhdGl2ZWx5IHRvIG5ld2xpbmVfbGlzdC4KKyAgICAiIiJuZXdsaW5lX3NlcXVlbmNlIDogbmV3bGluZV9saXN0IiIiCisgICAgcFswXSA9IE5vbmUKKyAgICAKK2RlZiBwX25ld2xpbmVfbGlzdChwKToKKyAgICAiIiJuZXdsaW5lX2xpc3QgOiBORVdMSU5FCisgICAgICAgICAgICAgICAgICAgIHwgbmV3bGluZV9saXN0IE5FV0xJTkUiIiIKKyAgICBwWzBdID0gTm9uZQorICAgICAgICAgICAgICAgICAgICAKK2RlZiBwX2xpbmVicmVhayhwKToKKyAgICAiIiJsaW5lYnJlYWsgOiBuZXdsaW5lX2xpc3QKKyAgICAgICAgICAgICAgICAgfCBlbXB0eSIiIgorICAgIHBbMF0gPSBOb25lCisKK2RlZiBwX3NlcGFyYXRvcl9vcChwKTogICAgICAgICAgICAgICAgIAorICAgICIiInNlcGFyYXRvcl9vcCA6IENPTU1BCisgICAgICAgICAgICAgICAgICAgIHwgQU1QIiIiCisgICAgcFswXSA9IHBbMV0KKworZGVmIHBfc2VwYXJhdG9yKHApOgorICAgICIiInNlcGFyYXRvciA6IHNlcGFyYXRvcl9vcCBsaW5lYnJlYWsKKyAgICAgICAgICAgICAgICAgfCBuZXdsaW5lX2xpc3QiIiIKKyAgICBpZiBsZW4ocCk9PTI6CisgICAgICAgICNJZ25vcmUgbmV3bGluZXMKKyAgICAgICAgcFswXSA9IE5vbmUKKyAgICBlbHNlOgorICAgICAgICAjS2VlcCB0aGUgc2VwYXJhdG9yIG9wZXJhdG9yCisgICAgICAgIHBbMF0gPSAoJ3NlcGFyYXRvcicsIHBbMV0pCisgICAgICAgICAgICAgICAgIAorZGVmIHBfc2VxdWVudGlhbF9zZXAocCk6CisgICAgIiIic2VxdWVudGlhbF9zZXAgOiBDT01NQSBsaW5lYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICB8IG5ld2xpbmVfbGlzdCIiIgorICAgIHBbMF0gPSBOb25lCisKKyMgTG93IHByaW9yaXR5IFRPS0VOID0+IGZvcl93b3JkIGNvbnZlcnNpb24uCisjIExldCBtYXliZV9mb3Jfd29yZCBiZSB1c2VkIGFzIGEgdG9rZW4gd2hlbiBuZWNlc3NhcnkgaW4gaGlnaGVyIHByaW9yaXR5CisjIHJ1bGVzLiAKK2RlZiBwX2Zvcl93b3JkKHApOgorICAgICIiImZvcl93b3JkIDogbWF5YmVfZm9yX3dvcmQiIiIKKyAgICBwWzBdID0gcFsxXQorCitkZWYgcF9pZl93b3JkKHApOgorICAgICIiImlmX3dvcmQgOiBtYXliZV9pZl93b3JkIiIiCisgICAgcFswXSA9IHBbMV0KKworZGVmIHBfdGhlbl93b3JkKHApOgorICAgICIiInRoZW5fd29yZCA6IG1heWJlX3RoZW5fd29yZCIiIgorICAgIHBbMF0gPSBwWzFdCisKK2RlZiBwX2RvbmVfd29yZChwKToKKyAgICAiIiJkb25lX3dvcmQgOiBtYXliZV9kb25lX3dvcmQiIiIKKyAgICBwWzBdID0gcFsxXQorCitkZWYgcF9kb193b3JkKHApOgorICAgICIiImRvX3dvcmQgOiBtYXliZV9kb193b3JkIiIiCisgICAgcFswXSA9IHBbMV0KKyAgICAKK2RlZiBwX3VudGlsX3dvcmQocCk6CisgICAgIiIidW50aWxfd29yZCA6IG1heWJlX3VudGlsX3dvcmQiIiIKKyAgICBwWzBdID0gcFsxXQorICAgIAorZGVmIHBfYXNzaWdubWVudF93b3JkKHApOgorICAgICIiImFzc2lnbm1lbnRfd29yZCA6IG1heWJlX2Fzc2lnbm1lbnRfd29yZCIiIgorICAgIHBbMF0gPSAoJ2Fzc2lnbm1lbnRfd29yZCcsIHBbMV1bMV0pCisgICAgCitkZWYgcF9iYW5nX3dvcmQocCk6CisgICAgIiIiYmFuZ193b3JkIDogbWF5YmVfYmFuZ193b3JkIiIiCisgICAgcFswXSA9ICgnYmFuZ193b3JkJywgcFsxXVsxXSkKKworZGVmIHBfdG9rZW4ocCk6CisgICAgIiIidG9rZW4gOiBUT0tFTgorICAgICAgICAgICAgIHwgRmkiIiIKKyAgICBwWzBdID0gcFsxXQorCitkZWYgcF9lbXB0eShwKToKKyAgICAnZW1wdHkgOicKKyAgICBwWzBdID0gTm9uZQorICAgIAorIyBFcnJvciBydWxlIGZvciBzeW50YXggZXJyb3JzCitkZWYgcF9lcnJvcihwKToKKyAgICBtc2cgPSBbXQorICAgIHcgPSBtc2cuYXBwZW5kCisgICAgdygnJXJcbicgJSBwKQorICAgIHcoJ2ZvbGxvd2VkIGJ5OlxuJykKKyAgICBmb3IgaSBpbiByYW5nZSg1KToKKyAgICAgICAgbiA9IHlhY2MudG9rZW4oKQorICAgICAgICBpZiBub3QgbjoKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHcoJyAgJXJcbicgJSBuKQorICAgIHJhaXNlIHNoZXJyb3JzLlNoZWxsU3ludGF4RXJyb3IoJycuam9pbihtc2cpKQorCisjIEJ1aWxkIHRoZSBwYXJzZXIKK3RyeToKKyAgICBpbXBvcnQgcHlzaHRhYmxlcworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIG91dHB1dGRpciA9IG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykKKyAgICBpZiBub3Qgb3MuYWNjZXNzKG91dHB1dGRpciwgb3MuV19PSyk6CisgICAgICAgIG91dHB1dGRpciA9ICcnCisgICAgeWFjYy55YWNjKHRhYm1vZHVsZSA9ICdweXNodGFibGVzJywgb3V0cHV0ZGlyID0gb3V0cHV0ZGlyLCBkZWJ1ZyA9IDApCitlbHNlOgorICAgIHlhY2MueWFjYyh0YWJtb2R1bGUgPSAncHlzaC5weXNodGFibGVzJywgd3JpdGVfdGFibGVzID0gMCwgZGVidWcgPSAwKQorCisKK2RlZiBwYXJzZShpbnB1dCwgZW9mPUZhbHNlLCBkZWJ1Zz1GYWxzZSk6CisgICAgIiIiUGFyc2UgYSB3aG9sZSBzY3JpcHQgYXQgb25jZSBhbmQgcmV0dXJuIHRoZSBnZW5lcmF0ZWQgQVNUIGFuZCB1bmNvbnN1bWVkCisgICAgZGF0YSBpbiBhIHR1cGxlLgorICAgIAorICAgIE5PVEU6IGVvZiBpcyBwcm9iYWJseSBtZWFuaW5nbGVzcyBmb3Igbm93LCB0aGUgcGFyc2VyIGJlaW5nIHVuYWJsZSB0byB3b3JrCisgICAgaW4gcHVsbCBtb2RlLiBJdCBzaG91bGQgYmUgc2V0IHRvIFRydWUuCisgICAgIiIiCisgICAgbGV4ZXIgPSBweXNobGV4LlBMWUxleGVyKCkKKyAgICByZW1haW5pbmcgPSBsZXhlci5hZGQoaW5wdXQsIGVvZikKKyAgICBpZiBsZXhlci5pc19lbXB0eSgpOgorICAgICAgICByZXR1cm4gW10sIHJlbWFpbmluZworICAgIGlmIGRlYnVnOgorICAgICAgICBkZWJ1ZyA9IDIKKyAgICByZXR1cm4geWFjYy5wYXJzZShsZXhlcj1sZXhlciwgZGVidWc9ZGVidWcpLCByZW1haW5pbmcKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQVNUIHJlbmRlcmluZyBoZWxwZXJzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAKKworZGVmIGZvcm1hdF9jb21tYW5kcyh2KToKKyAgICAiIiJSZXR1cm4gYSB0cmVlIG1hZGUgb2Ygc3RyaW5ncyBhbmQgbGlzdHMuIE1ha2UgY29tbWFuZCB0cmVlcyBlYXNpZXIgdG8KKyAgICBkaXNwbGF5LgorICAgICIiIgorICAgIGlmIGlzaW5zdGFuY2UodiwgbGlzdCk6CisgICAgICAgIHJldHVybiBbZm9ybWF0X2NvbW1hbmRzKGMpIGZvciBjIGluIHZdCisgICAgaWYgaXNpbnN0YW5jZSh2LCB0dXBsZSk6CisgICAgICAgIGlmIGxlbih2KT09MiBhbmQgaXNpbnN0YW5jZSh2WzBdLCBzdHIpIGFuZCBub3QgaXNpbnN0YW5jZSh2WzFdLCBzdHIpOgorICAgICAgICAgICAgaWYgdlswXSA9PSAnYXN5bmMnOgorICAgICAgICAgICAgICAgIHJldHVybiBbJ0FzeW5jTGlzdCcsIG1hcChmb3JtYXRfY29tbWFuZHMsIHZbMV0pXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjQXZvaWQgZGVjb21wb3NpbmcgdHVwbGVzIGxpa2UgKCdwaXBlbGluZScsIFBpcGVsaW5lKC4uLikpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZvcm1hdF9jb21tYW5kcyh2WzFdKQorICAgICAgICByZXR1cm4gZm9ybWF0X2NvbW1hbmRzKGxpc3QodikpCisgICAgZWxpZiBpc2luc3RhbmNlKHYsIElmQ29uZCk6CisgICAgICAgIG5hbWUgPSBbJ0lmQ29uZCddCisgICAgICAgIG5hbWUgKz0gWydpZicsIG1hcChmb3JtYXRfY29tbWFuZHMsIHYuY29uZCldCisgICAgICAgIG5hbWUgKz0gWyd0aGVuJywgbWFwKGZvcm1hdF9jb21tYW5kcywgdi5pZl9jbWRzKV0KKyAgICAgICAgbmFtZSArPSBbJ2Vsc2UnLCBtYXAoZm9ybWF0X2NvbW1hbmRzLCB2LmVsc2VfY21kcyldCisgICAgICAgIHJldHVybiBuYW1lCisgICAgZWxpZiBpc2luc3RhbmNlKHYsIEZvckxvb3ApOgorICAgICAgICBuYW1lID0gWydGb3JMb29wJ10KKyAgICAgICAgbmFtZSArPSBbcmVwcih2Lm5hbWUpKycgaW4gJywgbWFwKHN0ciwgdi5pdGVtcyldCisgICAgICAgIG5hbWUgKz0gWydjb21tYW5kcycsIG1hcChmb3JtYXRfY29tbWFuZHMsIHYuY21kcyldCisgICAgICAgIHJldHVybiBuYW1lCisgICAgZWxpZiBpc2luc3RhbmNlKHYsIEFuZE9yKToKKyAgICAgICAgcmV0dXJuIFt2Lm9wLCBmb3JtYXRfY29tbWFuZHModi5sZWZ0KSwgZm9ybWF0X2NvbW1hbmRzKHYucmlnaHQpXQorICAgIGVsaWYgaXNpbnN0YW5jZSh2LCBQaXBlbGluZSk6CisgICAgICAgIG5hbWUgPSAnUGlwZWxpbmUnCisgICAgICAgIGlmIHYucmV2ZXJzZV9zdGF0dXM6CisgICAgICAgICAgICBuYW1lID0gJyEnICsgbmFtZQorICAgICAgICByZXR1cm4gW25hbWUsIGZvcm1hdF9jb21tYW5kcyh2LmNvbW1hbmRzKV0KKyAgICBlbGlmIGlzaW5zdGFuY2UodiwgQ2FzZSk6CisgICAgICAgIG5hbWUgPSBbJ0Nhc2UnXQorICAgICAgICBuYW1lICs9IFt2Lm5hbWUsIGZvcm1hdF9jb21tYW5kcyh2Lml0ZW1zKV0KKyAgICBlbGlmIGlzaW5zdGFuY2UodiwgU2ltcGxlQ29tbWFuZCk6CisgICAgICAgIG5hbWUgPSBbJ1NpbXBsZUNvbW1hbmQnXQorICAgICAgICBpZiB2LndvcmRzOiAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIG5hbWUgKz0gWyd3b3JkcycsIG1hcChzdHIsIHYud29yZHMpXQorICAgICAgICBpZiB2LmFzc2lnbnM6CisgICAgICAgICAgICBhc3NpZ25zID0gW3R1cGxlKGFbMV0pIGZvciBhIGluIHYuYXNzaWduc10KKyAgICAgICAgICAgIG5hbWUgKz0gWydhc3NpZ25zJywgbWFwKHN0ciwgYXNzaWducyldCisgICAgICAgIGlmIHYucmVkaXJzOgorICAgICAgICAgICAgbmFtZSArPSBbJ3JlZGlycycsIG1hcChmb3JtYXRfY29tbWFuZHMsIHYucmVkaXJzKV0KKyAgICAgICAgcmV0dXJuIG5hbWUKKyAgICBlbGlmIGlzaW5zdGFuY2UodiwgUmVkaXJlY3RMaXN0KToKKyAgICAgICAgbmFtZSA9IFsnUmVkaXJlY3RMaXN0J10KKyAgICAgICAgaWYgdi5yZWRpcnM6CisgICAgICAgICAgICBuYW1lICs9IFsncmVkaXJzJywgbWFwKGZvcm1hdF9jb21tYW5kcywgdi5yZWRpcnMpXQorICAgICAgICBuYW1lICs9IFsnY29tbWFuZCcsIGZvcm1hdF9jb21tYW5kcyh2LmNtZCldCisgICAgICAgIHJldHVybiBuYW1lCisgICAgZWxpZiBpc2luc3RhbmNlKHYsIElPUmVkaXJlY3QpOgorICAgICAgICByZXR1cm4gJyAnLmpvaW4obWFwKHN0ciwgKHYuaW9fbnVtYmVyLCB2Lm9wLCB2LmZpbGVuYW1lKSkpCisgICAgZWxpZiBpc2luc3RhbmNlKHYsIEhlcmVEb2N1bWVudCk6CisgICAgICAgIHJldHVybiAnICcuam9pbihtYXAoc3RyLCAodi5pb19udW1iZXIsIHYub3AsIHJlcHIodi5uYW1lKSwgcmVwcih2LmNvbnRlbnQpKSkpCisgICAgZWxpZiBpc2luc3RhbmNlKHYsIFN1YlNoZWxsKToKKyAgICAgICAgcmV0dXJuIFsnU3ViU2hlbGwnLCBtYXAoZm9ybWF0X2NvbW1hbmRzLCB2LmNtZHMpXQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiByZXByKHYpCisgICAgICAgICAgICAgCitkZWYgcHJpbnRfY29tbWFuZHMoY21kcywgb3V0cHV0PXN5cy5zdGRvdXQpOgorICAgICIiIlByZXR0eSBwcmludCBhIGNvbW1hbmQgdHJlZS4iIiIKKyAgICBkZWYgcHJpbnRfdHJlZShjbWQsIHNwYWNlcywgb3V0cHV0KToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShjbWQsIGxpc3QpOgorICAgICAgICAgICAgZm9yIGMgaW4gY21kOgorICAgICAgICAgICAgICAgIHByaW50X3RyZWUoYywgc3BhY2VzICsgMywgb3V0cHV0KSAgICAgICAgICAgICAgCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCA+Pm91dHB1dCwgJyAnKnNwYWNlcyArIHN0cihjbWQpCisgICAgCisgICAgZm9ybWF0dGVkID0gZm9ybWF0X2NvbW1hbmRzKGNtZHMpCisgICAgcHJpbnRfdHJlZShmb3JtYXR0ZWQsIDAsIG91dHB1dCkKKyAgICAKKyAgICAKK2RlZiBzdHJpbmdpZnlfY29tbWFuZHMoY21kcyk6IAorICAgICIiIlNlcmlhbGl6ZSBhIGNvbW1hbmQgdHJlZSBhcyBhIHN0cmluZy4KKyAgICAKKyAgICBSZXR1cm5lZCBzdHJpbmcgaXMgbm90IHByZXR0eSBhbmQgaXMgY3VycmVudGx5IHVzZWQgZm9yIHVuaXQgdGVzdHMgb25seS4KKyAgICAiIiIgICAKKyAgICBkZWYgc3RyaW5naWZ5KHZhbHVlKToKKyAgICAgICAgb3V0cHV0ID0gW10KKyAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgbGlzdCk6CisgICAgICAgICAgICBmb3JtYXR0ZWQgPSBbXQorICAgICAgICAgICAgZm9yIHYgaW4gdmFsdWU6CisgICAgICAgICAgICAgICAgZm9ybWF0dGVkLmFwcGVuZChzdHJpbmdpZnkodikpCisgICAgICAgICAgICBmb3JtYXR0ZWQgPSAnICcuam9pbihmb3JtYXR0ZWQpCisgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCcnLmpvaW4oWyc8JywgZm9ybWF0dGVkLCAnPiddKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG91dHB1dC5hcHBlbmQodmFsdWUpCisgICAgICAgIHJldHVybiAnICcuam9pbihvdXRwdXQpCisgICAgICAgICAgICAKKyAgICByZXR1cm4gc3RyaW5naWZ5KGZvcm1hdF9jb21tYW5kcyhjbWRzKSkKKyAgICAKKyAgICAgICAgCitkZWYgdmlzaXRfY29tbWFuZHMoY21kcywgY2FsbGFibGUpOgorICAgICIiIlZpc2l0IHRoZSBjb21tYW5kIHRyZWUgYW5kIGV4ZWN1dGUgY2FsbGFibGUgb24gZXZlcnkgUGlwZWxpbmUgYW5kIAorICAgIFNpbXBsZUNvbW1hbmQgaW5zdGFuY2VzLgorICAgICIiIgorICAgIGlmIGlzaW5zdGFuY2UoY21kcywgKHR1cGxlLCBsaXN0KSk6CisgICAgICAgIG1hcChsYW1iZGEgYzogdmlzaXRfY29tbWFuZHMoYyxjYWxsYWJsZSksIGNtZHMpCisgICAgZWxpZiBpc2luc3RhbmNlKGNtZHMsIChQaXBlbGluZSwgU2ltcGxlQ29tbWFuZCkpOgorICAgICAgICBjYWxsYWJsZShjbWRzKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvcHlzaC9zaGVycm9ycy5weSBiL2JpdGJha2UvbGliL2JiL3B5c2gvc2hlcnJvcnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlkMDUzMwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3B5c2gvc2hlcnJvcnMucHkKQEAgLTAsMCArMSw0MSBAQAorIyBzaGVycm9ycy5weSAtIHNoZWxsIGVycm9ycyBhbmQgc2lnbmFscworIworIyBDb3B5cmlnaHQgMjAwNyBQYXRyaWNrIE1lemFyZAorIworIyBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKyIiIkRlZmluZSBzaGVsbCBleGNlcHRpb25zIGFuZCBlcnJvciBjb2Rlcy4KKyIiIgorCitjbGFzcyBTaGVsbEVycm9yKEV4Y2VwdGlvbik6CisgICAgcGFzcworCitjbGFzcyBTaGVsbFN5bnRheEVycm9yKFNoZWxsRXJyb3IpOgorICAgIHBhc3MKKyAgICAKK2NsYXNzIFV0aWxpdHlFcnJvcihTaGVsbEVycm9yKToKKyAgICAiIiJSYWlzZWQgdXBvbiB1dGlsaXR5IHN5bnRheCBlcnJvciAob3B0aW9uIG9yIG9wZXJhbmQgZXJyb3IpLiIiIgorICAgIHBhc3MKKyAgIAorY2xhc3MgRXhwYW5zaW9uRXJyb3IoU2hlbGxFcnJvcik6CisgICAgcGFzcworICAgICAKK2NsYXNzIENvbW1hbmROb3RGb3VuZChTaGVsbEVycm9yKToKKyAgICAiIiJTcGVjaWZpZWQgY29tbWFuZCB3YXMgbm90IGZvdW5kLiIiIgorICAgIHBhc3MKKyAgICAKK2NsYXNzIFJlZGlyZWN0aW9uRXJyb3IoU2hlbGxFcnJvcik6CisgICAgcGFzcworICAgIAorY2xhc3MgVmFyQXNzaWdubWVudEVycm9yKFNoZWxsRXJyb3IpOgorICAgICIiIlZhcmlhYmxlIGFzc2lnbm1lbnQgZXJyb3IuIiIiCisgICAgcGFzcworICAgIAorY2xhc3MgRXhpdFNpZ25hbChTaGVsbEVycm9yKToKKyAgICAiIiJFeGl0IHNpZ25hbC4iIiIKKyAgICBwYXNzCisgICAgCitjbGFzcyBSZXR1cm5TaWduYWwoU2hlbGxFcnJvcik6CisgICAgIiIiRXhpdCBzaWduYWwuIiIiCisgICAgcGFzcwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvcHlzaC9zdWJwcm9jZXNzX2ZpeC5weSBiL2JpdGJha2UvbGliL2JiL3B5c2gvc3VicHJvY2Vzc19maXgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZlY2EyMgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3B5c2gvc3VicHJvY2Vzc19maXgucHkKQEAgLTAsMCArMSw3NyBAQAorIyBzdWJwcm9jZXNzIC0gU3VicHJvY2Vzc2VzIHdpdGggYWNjZXNzaWJsZSBJL08gc3RyZWFtcworIworIyBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG1vZHVsZSwgc2VlIFBFUCAzMjQuCisjCisjIFRoaXMgbW9kdWxlIHNob3VsZCByZW1haW4gY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjIsIHNlZSBQRVAgMjkxLgorIworIyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNSBieSBQZXRlciBBc3RyYW5kIDxhc3RyYW5kQGx5c2F0b3IubGl1LnNlPgorIworIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCisjIFNlZSBodHRwOi8vd3d3LnB5dGhvbi5vcmcvMi40L2xpY2Vuc2UgZm9yIGxpY2Vuc2luZyBkZXRhaWxzLgorCitkZWYgbGlzdDJjbWRsaW5lKHNlcSk6CisgICAgIiIiCisgICAgVHJhbnNsYXRlIGEgc2VxdWVuY2Ugb2YgYXJndW1lbnRzIGludG8gYSBjb21tYW5kIGxpbmUKKyAgICBzdHJpbmcsIHVzaW5nIHRoZSBzYW1lIHJ1bGVzIGFzIHRoZSBNUyBDIHJ1bnRpbWU6CisKKyAgICAxKSBBcmd1bWVudHMgYXJlIGRlbGltaXRlZCBieSB3aGl0ZSBzcGFjZSwgd2hpY2ggaXMgZWl0aGVyIGEKKyAgICAgICBzcGFjZSBvciBhIHRhYi4KKworICAgIDIpIEEgc3RyaW5nIHN1cnJvdW5kZWQgYnkgZG91YmxlIHF1b3RhdGlvbiBtYXJrcyBpcworICAgICAgIGludGVycHJldGVkIGFzIGEgc2luZ2xlIGFyZ3VtZW50LCByZWdhcmRsZXNzIG9mIHdoaXRlIHNwYWNlCisgICAgICAgY29udGFpbmVkIHdpdGhpbi4gIEEgcXVvdGVkIHN0cmluZyBjYW4gYmUgZW1iZWRkZWQgaW4gYW4KKyAgICAgICBhcmd1bWVudC4KKworICAgIDMpIEEgZG91YmxlIHF1b3RhdGlvbiBtYXJrIHByZWNlZGVkIGJ5IGEgYmFja3NsYXNoIGlzCisgICAgICAgaW50ZXJwcmV0ZWQgYXMgYSBsaXRlcmFsIGRvdWJsZSBxdW90YXRpb24gbWFyay4KKworICAgIDQpIEJhY2tzbGFzaGVzIGFyZSBpbnRlcnByZXRlZCBsaXRlcmFsbHksIHVubGVzcyB0aGV5CisgICAgICAgaW1tZWRpYXRlbHkgcHJlY2VkZSBhIGRvdWJsZSBxdW90YXRpb24gbWFyay4KKworICAgIDUpIElmIGJhY2tzbGFzaGVzIGltbWVkaWF0ZWx5IHByZWNlZGUgYSBkb3VibGUgcXVvdGF0aW9uIG1hcmssCisgICAgICAgZXZlcnkgcGFpciBvZiBiYWNrc2xhc2hlcyBpcyBpbnRlcnByZXRlZCBhcyBhIGxpdGVyYWwKKyAgICAgICBiYWNrc2xhc2guICBJZiB0aGUgbnVtYmVyIG9mIGJhY2tzbGFzaGVzIGlzIG9kZCwgdGhlIGxhc3QKKyAgICAgICBiYWNrc2xhc2ggZXNjYXBlcyB0aGUgbmV4dCBkb3VibGUgcXVvdGF0aW9uIG1hcmsgYXMKKyAgICAgICBkZXNjcmliZWQgaW4gcnVsZSAzLgorICAgICIiIgorCisgICAgIyBTZWUKKyAgICAjIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9lbi11cy92Y2NlbG5nL2h0bS9wcm9nc18xMi5hc3AKKyAgICByZXN1bHQgPSBbXQorICAgIG5lZWRxdW90ZSA9IEZhbHNlCisgICAgZm9yIGFyZyBpbiBzZXE6CisgICAgICAgIGJzX2J1ZiA9IFtdCisKKyAgICAgICAgIyBBZGQgYSBzcGFjZSB0byBzZXBhcmF0ZSB0aGlzIGFyZ3VtZW50IGZyb20gdGhlIG90aGVycworICAgICAgICBpZiByZXN1bHQ6CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCcgJykKKworICAgICAgICBuZWVkcXVvdGUgPSAoIiAiIGluIGFyZykgb3IgKCJcdCIgaW4gYXJnKSBvciAoInwiIGluIGFyZykgb3IgYXJnID09ICIiCisgICAgICAgIGlmIG5lZWRxdW90ZToKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJyInKQorCisgICAgICAgIGZvciBjIGluIGFyZzoKKyAgICAgICAgICAgIGlmIGMgPT0gJ1xcJzoKKyAgICAgICAgICAgICAgICAjIERvbid0IGtub3cgaWYgd2UgbmVlZCB0byBkb3VibGUgeWV0LgorICAgICAgICAgICAgICAgIGJzX2J1Zi5hcHBlbmQoYykKKyAgICAgICAgICAgIGVsaWYgYyA9PSAnIic6CisgICAgICAgICAgICAgICAgIyBEb3VibGUgYmFja3NwYWNlcy4KKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCdcXCcgKiBsZW4oYnNfYnVmKSoyKQorICAgICAgICAgICAgICAgIGJzX2J1ZiA9IFtdCisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnXFwiJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBOb3JtYWwgY2hhcgorICAgICAgICAgICAgICAgIGlmIGJzX2J1ZjoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV4dGVuZChic19idWYpCisgICAgICAgICAgICAgICAgICAgIGJzX2J1ZiA9IFtdCisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChjKQorCisgICAgICAgICMgQWRkIHJlbWFpbmluZyBiYWNrc3BhY2VzLCBpZiBhbnkuCisgICAgICAgIGlmIGJzX2J1ZjoKKyAgICAgICAgICAgIHJlc3VsdC5leHRlbmQoYnNfYnVmKQorCisgICAgICAgIGlmIG5lZWRxdW90ZToKKyAgICAgICAgICAgIHJlc3VsdC5leHRlbmQoYnNfYnVmKQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnIicpCisgICAgICAgICAgICAKKyAgICByZXR1cm4gJycuam9pbihyZXN1bHQpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9ydW5xdWV1ZS5weSBiL2JpdGJha2UvbGliL2JiL3J1bnF1ZXVlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNzFlZWQKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9ydW5xdWV1ZS5weQpAQCAtMCwwICsxLDIxOTUgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyIiIgorQml0QmFrZSAnUnVuUXVldWUnIGltcGxlbWVudGF0aW9uCisKK0hhbmRsZXMgcHJlcGFyYXRpb24gYW5kIGV4ZWN1dGlvbiBvZiBhIHF1ZXVlIG9mIHRhc2tzCisiIiIKKworIyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyAgUmljaGFyZCBQdXJkaWUKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBjb3B5CitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCBzaWduYWwKK2ltcG9ydCBzdGF0CitpbXBvcnQgZmNudGwKK2ltcG9ydCBlcnJubworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCByZQoraW1wb3J0IGJiCitmcm9tIGJiIGltcG9ydCBtc2csIGRhdGEsIGV2ZW50Citmcm9tIGJiIGltcG9ydCBtb25pdG9yZGlzaworaW1wb3J0IHN1YnByb2Nlc3MKKwordHJ5OgorICAgIGltcG9ydCBjUGlja2xlIGFzIHBpY2tsZQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGltcG9ydCBwaWNrbGUKKworYmJsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiQml0QmFrZSIpCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiQml0QmFrZS5SdW5RdWV1ZSIpCisKK19fZmluZF9tZDVfXyA9IHJlLmNvbXBpbGUoIHInKD9pKSg/PCFbYS16MC05XSlbYS1mMC05XXszMn0oPyFbYS16MC05XSknICkKKworY2xhc3MgUnVuUXVldWVTdGF0czoKKyAgICAiIiIKKyAgICBIb2xkcyBzdGF0aXN0aWNzIG9uIHRoZSB0YXNrcyBoYW5kbGVkIGJ5IHRoZSBhc3NvY2lhdGVkIHJ1blF1ZXVlCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRvdGFsKToKKyAgICAgICAgc2VsZi5jb21wbGV0ZWQgPSAwCisgICAgICAgIHNlbGYuc2tpcHBlZCA9IDAKKyAgICAgICAgc2VsZi5mYWlsZWQgPSAwCisgICAgICAgIHNlbGYuYWN0aXZlID0gMAorICAgICAgICBzZWxmLnRvdGFsID0gdG90YWwKKworICAgIGRlZiBjb3B5KHNlbGYpOgorICAgICAgICBvYmogPSBzZWxmLl9fY2xhc3NfXyhzZWxmLnRvdGFsKQorICAgICAgICBvYmouX19kaWN0X18udXBkYXRlKHNlbGYuX19kaWN0X18pCisgICAgICAgIHJldHVybiBvYmoKKworICAgIGRlZiB0YXNrRmFpbGVkKHNlbGYpOgorICAgICAgICBzZWxmLmFjdGl2ZSA9IHNlbGYuYWN0aXZlIC0gMQorICAgICAgICBzZWxmLmZhaWxlZCA9IHNlbGYuZmFpbGVkICsgMQorCisgICAgZGVmIHRhc2tDb21wbGV0ZWQoc2VsZiwgbnVtYmVyID0gMSk6CisgICAgICAgIHNlbGYuYWN0aXZlID0gc2VsZi5hY3RpdmUgLSBudW1iZXIKKyAgICAgICAgc2VsZi5jb21wbGV0ZWQgPSBzZWxmLmNvbXBsZXRlZCArIG51bWJlcgorCisgICAgZGVmIHRhc2tTa2lwcGVkKHNlbGYsIG51bWJlciA9IDEpOgorICAgICAgICBzZWxmLmFjdGl2ZSA9IHNlbGYuYWN0aXZlICsgbnVtYmVyCisgICAgICAgIHNlbGYuc2tpcHBlZCA9IHNlbGYuc2tpcHBlZCArIG51bWJlcgorCisgICAgZGVmIHRhc2tBY3RpdmUoc2VsZik6CisgICAgICAgIHNlbGYuYWN0aXZlID0gc2VsZi5hY3RpdmUgKyAxCisKKyMgVGhlc2UgdmFsdWVzIGluZGljYXRlIHRoZSBuZXh0IHN0ZXAgZHVlIHRvIGJlIHJ1biBpbiB0aGUKKyMgcnVuUXVldWUgc3RhdGUgbWFjaGluZQorcnVuUXVldWVQcmVwYXJlID0gMgorcnVuUXVldWVTY2VuZUluaXQgPSAzCitydW5RdWV1ZVNjZW5lUnVuID0gNAorcnVuUXVldWVSdW5Jbml0ID0gNQorcnVuUXVldWVSdW5uaW5nID0gNgorcnVuUXVldWVGYWlsZWQgPSA3CitydW5RdWV1ZUNsZWFuVXAgPSA4CitydW5RdWV1ZUNvbXBsZXRlID0gOQorCitjbGFzcyBSdW5RdWV1ZVNjaGVkdWxlcihvYmplY3QpOgorICAgICIiIgorICAgIENvbnRyb2wgdGhlIG9yZGVyIHRhc2tzIGFyZSBzY2hlZHVsZWQgaW4uCisgICAgIiIiCisgICAgbmFtZSA9ICJiYXNpYyIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBydW5xdWV1ZSwgcnFkYXRhKToKKyAgICAgICAgIiIiCisgICAgICAgIFRoZSBkZWZhdWx0IHNjaGVkdWxlciBqdXN0IHJldHVybnMgdGhlIGZpcnN0IGJ1aWxkYWJsZSB0YXNrICh0aGUKKyAgICAgICAgcHJpb3JpdHkgbWFwIGlzIHNvcnRlZCBieSB0YXNrIG51bWJlcikKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYucnEgPSBydW5xdWV1ZQorICAgICAgICBzZWxmLnJxZGF0YSA9IHJxZGF0YQorICAgICAgICBzZWxmLm51bVRhc2tzID0gbGVuKHNlbGYucnFkYXRhLnJ1bnFfZm5pZCkKKworICAgICAgICBzZWxmLnByaW9fbWFwID0gW10KKyAgICAgICAgc2VsZi5wcmlvX21hcC5leHRlbmQocmFuZ2Uoc2VsZi5udW1UYXNrcykpCisKKyAgICAgICAgc2VsZi5idWlsZGFibGUgPSBbXQorICAgICAgICBzZWxmLnN0YW1wcyA9IHt9CisgICAgICAgIGZvciB0YXNraWQgaW4geHJhbmdlKHNlbGYubnVtVGFza3MpOgorICAgICAgICAgICAgZm4gPSBzZWxmLnJxZGF0YS50YXNrRGF0YS5mbl9pbmRleFtzZWxmLnJxZGF0YS5ydW5xX2ZuaWRbdGFza2lkXV0KKyAgICAgICAgICAgIHRhc2tuYW1lID0gc2VsZi5ycWRhdGEucnVucV90YXNrW3Rhc2tpZF0KKyAgICAgICAgICAgIHNlbGYuc3RhbXBzW3Rhc2tpZF0gPSBiYi5idWlsZC5zdGFtcGZpbGUodGFza25hbWUsIHNlbGYucnFkYXRhLmRhdGFDYWNoZSwgZm4pCisgICAgICAgICAgICBpZiBzZWxmLnJxLnJ1bnFfYnVpbGRhYmxlW3Rhc2tpZF0gPT0gMToKKyAgICAgICAgICAgICAgICBzZWxmLmJ1aWxkYWJsZS5hcHBlbmQodGFza2lkKQorCisgICAgICAgIHNlbGYucmV2X3ByaW9fbWFwID0gTm9uZQorCisgICAgZGVmIG5leHRfYnVpbGRhYmxlX3Rhc2soc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gdGhlIGlkIG9mIHRoZSBmaXJzdCB0YXNrIHdlIGZpbmQgdGhhdCBpcyBidWlsZGFibGUKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuYnVpbGRhYmxlID0gW3ggZm9yIHggaW4gc2VsZi5idWlsZGFibGUgaWYgbm90IHNlbGYucnEucnVucV9ydW5uaW5nW3hdID09IDFdCisgICAgICAgIGlmIG5vdCBzZWxmLmJ1aWxkYWJsZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGlmIGxlbihzZWxmLmJ1aWxkYWJsZSkgPT0gMToKKyAgICAgICAgICAgIHRhc2tpZCA9IHNlbGYuYnVpbGRhYmxlWzBdCisgICAgICAgICAgICBzdGFtcCA9IHNlbGYuc3RhbXBzW3Rhc2tpZF0KKyAgICAgICAgICAgIGlmIHN0YW1wIG5vdCBpbiBzZWxmLnJxLmJ1aWxkX3N0YW1wcy5pdGVydmFsdWVzKCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHRhc2tpZAorCisgICAgICAgIGlmIG5vdCBzZWxmLnJldl9wcmlvX21hcDoKKyAgICAgICAgICAgIHNlbGYucmV2X3ByaW9fbWFwID0gcmFuZ2Uoc2VsZi5udW1UYXNrcykKKyAgICAgICAgICAgIGZvciB0YXNraWQgaW4geHJhbmdlKHNlbGYubnVtVGFza3MpOgorICAgICAgICAgICAgICAgIHNlbGYucmV2X3ByaW9fbWFwW3NlbGYucHJpb19tYXBbdGFza2lkXV0gPSB0YXNraWQKKworICAgICAgICBiZXN0ID0gTm9uZQorICAgICAgICBiZXN0cHJpbyA9IE5vbmUKKyAgICAgICAgZm9yIHRhc2tpZCBpbiBzZWxmLmJ1aWxkYWJsZToKKyAgICAgICAgICAgIHByaW8gPSBzZWxmLnJldl9wcmlvX21hcFt0YXNraWRdCisgICAgICAgICAgICBpZiBiZXN0cHJpbyBpcyBOb25lIG9yIGJlc3RwcmlvID4gcHJpbzoKKyAgICAgICAgICAgICAgICBzdGFtcCA9IHNlbGYuc3RhbXBzW3Rhc2tpZF0KKyAgICAgICAgICAgICAgICBpZiBzdGFtcCBpbiBzZWxmLnJxLmJ1aWxkX3N0YW1wcy5pdGVydmFsdWVzKCk6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgYmVzdHByaW8gPSBwcmlvCisgICAgICAgICAgICAgICAgYmVzdCA9IHRhc2tpZAorCisgICAgICAgIHJldHVybiBiZXN0CisKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiB0aGUgaWQgb2YgdGhlIHRhc2sgd2Ugc2hvdWxkIGJ1aWxkIG5leHQKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYucnEuc3RhdHMuYWN0aXZlIDwgc2VsZi5ycS5udW1iZXJfdGFza3M6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5uZXh0X2J1aWxkYWJsZV90YXNrKCkKKworICAgIGRlZiBuZXdidWlsYWJsZShzZWxmLCB0YXNrKToKKyAgICAgICAgc2VsZi5idWlsZGFibGUuYXBwZW5kKHRhc2spCisKK2NsYXNzIFJ1blF1ZXVlU2NoZWR1bGVyU3BlZWQoUnVuUXVldWVTY2hlZHVsZXIpOgorICAgICIiIgorICAgIEEgc2NoZWR1bGVyIG9wdGltaXNlZCBmb3Igc3BlZWQuIFRoZSBwcmlvcml0eSBtYXAgaXMgc29ydGVkIGJ5IHRhc2sgd2VpZ2h0LAorICAgIGhlYXZpZXIgd2VpZ2h0ZWQgdGFza3MgKHRhc2tzIG5lZWRlZCBieSB0aGUgbW9zdCBvdGhlciB0YXNrcykgYXJlIHJ1biBmaXJzdC4KKyAgICAiIiIKKyAgICBuYW1lID0gInNwZWVkIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJ1bnF1ZXVlLCBycWRhdGEpOgorICAgICAgICAiIiIKKyAgICAgICAgVGhlIHByaW9yaXR5IG1hcCBpcyBzb3J0ZWQgYnkgdGFzayB3ZWlnaHQuCisgICAgICAgICIiIgorICAgICAgICBSdW5RdWV1ZVNjaGVkdWxlci5fX2luaXRfXyhzZWxmLCBydW5xdWV1ZSwgcnFkYXRhKQorCisgICAgICAgIHNvcnR3ZWlnaHQgPSBzb3J0ZWQoY29weS5kZWVwY29weShzZWxmLnJxZGF0YS5ydW5xX3dlaWdodCkpCisgICAgICAgIGNvcHl3ZWlnaHQgPSBjb3B5LmRlZXBjb3B5KHNlbGYucnFkYXRhLnJ1bnFfd2VpZ2h0KQorICAgICAgICBzZWxmLnByaW9fbWFwID0gW10KKworICAgICAgICBmb3Igd2VpZ2h0IGluIHNvcnR3ZWlnaHQ6CisgICAgICAgICAgICBpZHggPSBjb3B5d2VpZ2h0LmluZGV4KHdlaWdodCkKKyAgICAgICAgICAgIHNlbGYucHJpb19tYXAuYXBwZW5kKGlkeCkKKyAgICAgICAgICAgIGNvcHl3ZWlnaHRbaWR4XSA9IC0xCisKKyAgICAgICAgc2VsZi5wcmlvX21hcC5yZXZlcnNlKCkKKworY2xhc3MgUnVuUXVldWVTY2hlZHVsZXJDb21wbGV0aW9uKFJ1blF1ZXVlU2NoZWR1bGVyU3BlZWQpOgorICAgICIiIgorICAgIEEgc2NoZWR1bGVyIG9wdGltaXNlZCB0byBjb21wbGV0ZSAuYmIgZmlsZXMgYXJlIHF1aWNrbHkgYXMgcG9zc2libGUuIFRoZQorICAgIHByaW9yaXR5IG1hcCBpcyBzb3J0ZWQgYnkgdGFzayB3ZWlnaHQsIGJ1dCB0aGVuIHJlb3JkZXJlZCBzbyBvbmNlIGEgZ2l2ZW4KKyAgICAuYmIgZmlsZSBzdGFydHMgdG8gYnVpbGQsIGl0J3MgY29tcGxldGVkIGFzIHF1aWNrbHkgYXMgcG9zc2libGUuIFRoaXMgd29ya3MKKyAgICB3ZWxsIHdoZXJlIGRpc2sgc3BhY2UgaXMgYXQgYSBwcmVtaXVtIGFuZCBjbGFzc2VzIGxpa2UgT0UncyBybV93b3JrIGFyZSBpbgorICAgIGZvcmNlLgorICAgICIiIgorICAgIG5hbWUgPSAiY29tcGxldGlvbiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBydW5xdWV1ZSwgcnFkYXRhKToKKyAgICAgICAgUnVuUXVldWVTY2hlZHVsZXJTcGVlZC5fX2luaXRfXyhzZWxmLCBydW5xdWV1ZSwgcnFkYXRhKQorCisgICAgICAgICNGSVhNRSAtIHdoaWxzdCB0aGlzIGdyb3VwcyBhbGwgZm5pZHMgdG9nZXRoZXIgaXQgZG9lcyBub3QgcmVvcmRlciB0aGUKKyAgICAgICAgI2ZuaWQgZ3JvdXBzIG9wdGltYWxseS4KKworICAgICAgICBiYXNlbWFwID0gY29weS5kZWVwY29weShzZWxmLnByaW9fbWFwKQorICAgICAgICBzZWxmLnByaW9fbWFwID0gW10KKyAgICAgICAgd2hpbGUgKGxlbihiYXNlbWFwKSA+IDApOgorICAgICAgICAgICAgZW50cnkgPSBiYXNlbWFwLnBvcCgwKQorICAgICAgICAgICAgc2VsZi5wcmlvX21hcC5hcHBlbmQoZW50cnkpCisgICAgICAgICAgICBmbmlkID0gc2VsZi5ycWRhdGEucnVucV9mbmlkW2VudHJ5XQorICAgICAgICAgICAgdG9kZWwgPSBbXQorICAgICAgICAgICAgZm9yIGVudHJ5IGluIGJhc2VtYXA6CisgICAgICAgICAgICAgICAgZW50cnlfZm5pZCA9IHNlbGYucnFkYXRhLnJ1bnFfZm5pZFtlbnRyeV0KKyAgICAgICAgICAgICAgICBpZiBlbnRyeV9mbmlkID09IGZuaWQ6CisgICAgICAgICAgICAgICAgICAgIHRvZGVsLmFwcGVuZChiYXNlbWFwLmluZGV4KGVudHJ5KSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wcmlvX21hcC5hcHBlbmQoZW50cnkpCisgICAgICAgICAgICB0b2RlbC5yZXZlcnNlKCkKKyAgICAgICAgICAgIGZvciBpZHggaW4gdG9kZWw6CisgICAgICAgICAgICAgICAgZGVsIGJhc2VtYXBbaWR4XQorCitjbGFzcyBSdW5RdWV1ZURhdGE6CisgICAgIiIiCisgICAgQml0QmFrZSBSdW4gUXVldWUgaW1wbGVtZW50YXRpb24KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcnEsIGNvb2tlciwgY2ZnRGF0YSwgZGF0YUNhY2hlLCB0YXNrRGF0YSwgdGFyZ2V0cyk6CisgICAgICAgIHNlbGYuY29va2VyID0gY29va2VyCisgICAgICAgIHNlbGYuZGF0YUNhY2hlID0gZGF0YUNhY2hlCisgICAgICAgIHNlbGYudGFza0RhdGEgPSB0YXNrRGF0YQorICAgICAgICBzZWxmLnRhcmdldHMgPSB0YXJnZXRzCisgICAgICAgIHNlbGYucnEgPSBycQorICAgICAgICBzZWxmLndhcm5fbXVsdGlfYmIgPSBGYWxzZQorCisgICAgICAgIHNlbGYuc3RhbXB3aGl0ZWxpc3QgPSBjZmdEYXRhLmdldFZhcigiQkJfU1RBTVBfV0hJVEVMSVNUIiwgVHJ1ZSkgb3IgIiIKKyAgICAgICAgc2VsZi5tdWx0aV9wcm92aWRlcl93aGl0ZWxpc3QgPSAoY2ZnRGF0YS5nZXRWYXIoIk1VTFRJX1BST1ZJREVSX1dISVRFTElTVCIsIFRydWUpIG9yICIiKS5zcGxpdCgpCisKKyAgICAgICAgc2VsZi5yZXNldCgpCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIHNlbGYucnVucV9mbmlkID0gW10KKyAgICAgICAgc2VsZi5ydW5xX3Rhc2sgPSBbXQorICAgICAgICBzZWxmLnJ1bnFfZGVwZW5kcyA9IFtdCisgICAgICAgIHNlbGYucnVucV9yZXZkZXBzID0gW10KKyAgICAgICAgc2VsZi5ydW5xX2hhc2ggPSBbXQorCisgICAgZGVmIHJ1bnFfZGVwZW5kc19uYW1lcyhzZWxmLCBpZHMpOgorICAgICAgICBpbXBvcnQgcmUKKyAgICAgICAgcmV0ID0gW10KKyAgICAgICAgZm9yIGlkIGluIHNlbGYucnVucV9kZXBlbmRzW2lkc106CisgICAgICAgICAgICBuYW0gPSBvcy5wYXRoLmJhc2VuYW1lKHNlbGYuZ2V0X3VzZXJfaWRzdHJpbmcoaWQpKQorICAgICAgICAgICAgbmFtID0gcmUuc3ViKCJfW14sXSosIiwgIiwiLCBuYW0pCisgICAgICAgICAgICByZXQuZXh0ZW5kKFtuYW1dKQorICAgICAgICByZXR1cm4gcmV0CisKKyAgICBkZWYgZ2V0X3Rhc2tfbmFtZShzZWxmLCB0YXNrKToKKyAgICAgICAgcmV0dXJuIHNlbGYucnVucV90YXNrW3Rhc2tdCisKKyAgICBkZWYgZ2V0X3Rhc2tfZmlsZShzZWxmLCB0YXNrKToKKyAgICAgICAgcmV0dXJuIHNlbGYudGFza0RhdGEuZm5faW5kZXhbc2VsZi5ydW5xX2ZuaWRbdGFza11dCisKKyAgICBkZWYgZ2V0X3Rhc2tfaGFzaChzZWxmLCB0YXNrKToKKyAgICAgICAgcmV0dXJuIHNlbGYucnVucV9oYXNoW3Rhc2tdCisKKyAgICBkZWYgZ2V0X3VzZXJfaWRzdHJpbmcoc2VsZiwgdGFzaywgdGFza19uYW1lX3N1ZmZpeCA9ICIiKToKKyAgICAgICAgZm4gPSBzZWxmLnRhc2tEYXRhLmZuX2luZGV4W3NlbGYucnVucV9mbmlkW3Rhc2tdXQorICAgICAgICB0YXNrbmFtZSA9IHNlbGYucnVucV90YXNrW3Rhc2tdICsgdGFza19uYW1lX3N1ZmZpeAorICAgICAgICByZXR1cm4gIiVzLCAlcyIgJSAoZm4sIHRhc2tuYW1lKQorCisgICAgZGVmIGdldF90YXNrX2lkKHNlbGYsIGZuaWQsIHRhc2tuYW1lKToKKyAgICAgICAgZm9yIGxpc3RpZCBpbiB4cmFuZ2UobGVuKHNlbGYucnVucV9mbmlkKSk6CisgICAgICAgICAgICBpZiBzZWxmLnJ1bnFfZm5pZFtsaXN0aWRdID09IGZuaWQgYW5kIHNlbGYucnVucV90YXNrW2xpc3RpZF0gPT0gdGFza25hbWU6CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpc3RpZAorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIGNpcmN1bGFyX2RlcGNoYWluc19oYW5kbGVyKHNlbGYsIHRhc2tzKToKKyAgICAgICAgIiIiCisgICAgICAgIFNvbWUgdGFza3MgYXJlbid0IGJ1aWxkYWJsZSwgbGlrZWx5IGR1ZSB0byBjaXJjdWxhciBkZXBlbmRlbmN5IGlzc3Vlcy4KKyAgICAgICAgSWRlbnRpZnkgdGhlIGNpcmN1bGFyIGRlcGVuZGVuY2llcyBhbmQgcHJpbnQgdGhlbSBpbiBhIHVzZXIgcmVhZGFibGUgZm9ybWF0LgorICAgICAgICAiIiIKKyAgICAgICAgZnJvbSBjb3B5IGltcG9ydCBkZWVwY29weQorCisgICAgICAgIHZhbGlkX2NoYWlucyA9IFtdCisgICAgICAgIGV4cGxvcmVkX2RlcHMgPSB7fQorICAgICAgICBtc2dzID0gW10KKworICAgICAgICBkZWYgY2hhaW5fcmVvcmRlcihjaGFpbik6CisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIFJlb3JkZXIgYSBkZXBlbmRlbmN5IGNoYWluIHNvIHRoZSBsb3dlc3QgdGFzayBpZCBpcyBmaXJzdAorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBsb3dlc3QgPSAwCisgICAgICAgICAgICBuZXdfY2hhaW4gPSBbXQorICAgICAgICAgICAgZm9yIGVudHJ5IGluIHhyYW5nZShsZW4oY2hhaW4pKToKKyAgICAgICAgICAgICAgICBpZiBjaGFpbltlbnRyeV0gPCBjaGFpbltsb3dlc3RdOgorICAgICAgICAgICAgICAgICAgICBsb3dlc3QgPSBlbnRyeQorICAgICAgICAgICAgbmV3X2NoYWluLmV4dGVuZChjaGFpbltsb3dlc3Q6XSkKKyAgICAgICAgICAgIG5ld19jaGFpbi5leHRlbmQoY2hhaW5bOmxvd2VzdF0pCisgICAgICAgICAgICByZXR1cm4gbmV3X2NoYWluCisKKyAgICAgICAgZGVmIGNoYWluX2NvbXBhcmVfZXF1YWwoY2hhaW4xLCBjaGFpbjIpOgorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBDb21wYXJlIHR3byBkZXBlbmRlbmN5IGNoYWlucyBhbmQgc2VlIGlmIHRoZXkncmUgdGhlIHNhbWUKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgaWYgbGVuKGNoYWluMSkgIT0gbGVuKGNoYWluMik6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICBmb3IgaW5kZXggaW4geHJhbmdlKGxlbihjaGFpbjEpKToKKyAgICAgICAgICAgICAgICBpZiBjaGFpbjFbaW5kZXhdICE9IGNoYWluMltpbmRleF06CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICBkZWYgY2hhaW5fYXJyYXlfY29udGFpbnMoY2hhaW4sIGNoYWluX2FycmF5KToKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgUmV0dXJuIFRydWUgaWYgY2hhaW5fYXJyYXkgY29udGFpbnMgY2hhaW4KKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgZm9yIGNoIGluIGNoYWluX2FycmF5OgorICAgICAgICAgICAgICAgIGlmIGNoYWluX2NvbXBhcmVfZXF1YWwoY2gsIGNoYWluKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIGRlZiBmaW5kX2NoYWlucyh0YXNraWQsIHByZXZfY2hhaW4pOgorICAgICAgICAgICAgcHJldl9jaGFpbi5hcHBlbmQodGFza2lkKQorICAgICAgICAgICAgdG90YWxfZGVwcyA9IFtdCisgICAgICAgICAgICB0b3RhbF9kZXBzLmV4dGVuZChzZWxmLnJ1bnFfcmV2ZGVwc1t0YXNraWRdKQorICAgICAgICAgICAgZm9yIHJldmRlcCBpbiBzZWxmLnJ1bnFfcmV2ZGVwc1t0YXNraWRdOgorICAgICAgICAgICAgICAgIGlmIHJldmRlcCBpbiBwcmV2X2NoYWluOgorICAgICAgICAgICAgICAgICAgICBpZHggPSBwcmV2X2NoYWluLmluZGV4KHJldmRlcCkKKyAgICAgICAgICAgICAgICAgICAgIyBUbyBwcmV2ZW50IGR1cGxpY2F0ZXMsIHJlb3JkZXIgdGhlIGNoYWluIHRvIHN0YXJ0IHdpdGggdGhlIGxvd2VzdCB0YXNraWQKKyAgICAgICAgICAgICAgICAgICAgIyBhbmQgc2VhcmNoIHRocm91Z2ggYW4gYXJyYXkgb2YgdGhvc2Ugd2UndmUgYWxyZWFkeSBwcmludGVkCisgICAgICAgICAgICAgICAgICAgIGNoYWluID0gcHJldl9jaGFpbltpZHg6XQorICAgICAgICAgICAgICAgICAgICBuZXdfY2hhaW4gPSBjaGFpbl9yZW9yZGVyKGNoYWluKQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgY2hhaW5fYXJyYXlfY29udGFpbnMobmV3X2NoYWluLCB2YWxpZF9jaGFpbnMpOgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRfY2hhaW5zLmFwcGVuZChuZXdfY2hhaW4pCisgICAgICAgICAgICAgICAgICAgICAgICBtc2dzLmFwcGVuZCgiRGVwZW5kZW5jeSBsb29wICMlZCBmb3VuZDpcbiIgJSBsZW4odmFsaWRfY2hhaW5zKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBkZXAgaW4gbmV3X2NoYWluOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ3MuYXBwZW5kKCIgIFRhc2sgJXMgKCVzKSAoZGVwZW5kZW50IFRhc2tzICVzKVxuIiAlIChkZXAsIHNlbGYuZ2V0X3VzZXJfaWRzdHJpbmcoZGVwKSwgc2VsZi5ydW5xX2RlcGVuZHNfbmFtZXMoZGVwKSkpCisgICAgICAgICAgICAgICAgICAgICAgICBtc2dzLmFwcGVuZCgiXG4iKQorICAgICAgICAgICAgICAgICAgICBpZiBsZW4odmFsaWRfY2hhaW5zKSA+IDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgbXNncy5hcHBlbmQoIkFib3J0ZWQgZGVwZW5kZW5jeSBsb29wcyBzZWFyY2ggYWZ0ZXIgMTAgbWF0Y2hlcy5cbiIpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbXNncworICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHNjYW4gPSBGYWxzZQorICAgICAgICAgICAgICAgIGlmIHJldmRlcCBub3QgaW4gZXhwbG9yZWRfZGVwczoKKyAgICAgICAgICAgICAgICAgICAgc2NhbiA9IFRydWUKKyAgICAgICAgICAgICAgICBlbGlmIHJldmRlcCBpbiBleHBsb3JlZF9kZXBzW3JldmRlcF06CisgICAgICAgICAgICAgICAgICAgIHNjYW4gPSBUcnVlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZm9yIGRlcCBpbiBwcmV2X2NoYWluOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZGVwIGluIGV4cGxvcmVkX2RlcHNbcmV2ZGVwXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuID0gVHJ1ZQorICAgICAgICAgICAgICAgIGlmIHNjYW46CisgICAgICAgICAgICAgICAgICAgIGZpbmRfY2hhaW5zKHJldmRlcCwgY29weS5kZWVwY29weShwcmV2X2NoYWluKSkKKyAgICAgICAgICAgICAgICBmb3IgZGVwIGluIGV4cGxvcmVkX2RlcHNbcmV2ZGVwXToKKyAgICAgICAgICAgICAgICAgICAgaWYgZGVwIG5vdCBpbiB0b3RhbF9kZXBzOgorICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxfZGVwcy5hcHBlbmQoZGVwKQorCisgICAgICAgICAgICBleHBsb3JlZF9kZXBzW3Rhc2tpZF0gPSB0b3RhbF9kZXBzCisKKyAgICAgICAgZm9yIHRhc2sgaW4gdGFza3M6CisgICAgICAgICAgICBmaW5kX2NoYWlucyh0YXNrLCBbXSkKKworICAgICAgICByZXR1cm4gbXNncworCisgICAgZGVmIGNhbGN1bGF0ZV90YXNrX3dlaWdodHMoc2VsZiwgZW5kcG9pbnRzKToKKyAgICAgICAgIiIiCisgICAgICAgIENhbGN1bGF0ZSBhIG51bWJlciByZXByZXNlbnRpbmcgdGhlICJ3ZWlnaHQiIG9mIGVhY2ggdGFzay4gSGVhdmllciB3ZWlnaHRlZCB0YXNrcworICAgICAgICBoYXZlIG1vcmUgZGVwZW5kZW5jaWVzIGFuZCBoZW5jZSBzaG91bGQgYmUgZXhlY3V0ZWQgc29vbmVyIGZvciBtYXhpbXVtIHNwZWVkLgorCisgICAgICAgIFRoaXMgZnVuY3Rpb24gYWxzbyBzYW5pdHkgY2hlY2tzIHRoZSB0YXNrIGxpc3QgZmluZGluZyB0YXNrcyB0aGF0IGFyZSBub3QKKyAgICAgICAgcG9zc2libGUgdG8gZXhlY3V0ZSBkdWUgdG8gY2lyY3VsYXIgZGVwZW5kZW5jaWVzLgorICAgICAgICAiIiIKKworICAgICAgICBudW1UYXNrcyA9IGxlbihzZWxmLnJ1bnFfZm5pZCkKKyAgICAgICAgd2VpZ2h0ID0gW10KKyAgICAgICAgZGVwc19sZWZ0ID0gW10KKyAgICAgICAgdGFza19kb25lID0gW10KKworICAgICAgICBmb3IgbGlzdGlkIGluIHhyYW5nZShudW1UYXNrcyk6CisgICAgICAgICAgICB0YXNrX2RvbmUuYXBwZW5kKEZhbHNlKQorICAgICAgICAgICAgd2VpZ2h0LmFwcGVuZCgxKQorICAgICAgICAgICAgZGVwc19sZWZ0LmFwcGVuZChsZW4oc2VsZi5ydW5xX3JldmRlcHNbbGlzdGlkXSkpCisKKyAgICAgICAgZm9yIGxpc3RpZCBpbiBlbmRwb2ludHM6CisgICAgICAgICAgICB3ZWlnaHRbbGlzdGlkXSA9IDEwCisgICAgICAgICAgICB0YXNrX2RvbmVbbGlzdGlkXSA9IFRydWUKKworICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgbmV4dF9wb2ludHMgPSBbXQorICAgICAgICAgICAgZm9yIGxpc3RpZCBpbiBlbmRwb2ludHM6CisgICAgICAgICAgICAgICAgZm9yIHJldmRlcCBpbiBzZWxmLnJ1bnFfZGVwZW5kc1tsaXN0aWRdOgorICAgICAgICAgICAgICAgICAgICB3ZWlnaHRbcmV2ZGVwXSA9IHdlaWdodFtyZXZkZXBdICsgd2VpZ2h0W2xpc3RpZF0KKyAgICAgICAgICAgICAgICAgICAgZGVwc19sZWZ0W3JldmRlcF0gPSBkZXBzX2xlZnRbcmV2ZGVwXSAtIDEKKyAgICAgICAgICAgICAgICAgICAgaWYgZGVwc19sZWZ0W3JldmRlcF0gPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfcG9pbnRzLmFwcGVuZChyZXZkZXApCisgICAgICAgICAgICAgICAgICAgICAgICB0YXNrX2RvbmVbcmV2ZGVwXSA9IFRydWUKKyAgICAgICAgICAgIGVuZHBvaW50cyA9IG5leHRfcG9pbnRzCisgICAgICAgICAgICBpZiBsZW4obmV4dF9wb2ludHMpID09IDA6CisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAjIENpcmN1bGFyIGRlcGVuZGVuY3kgc2FuaXR5IGNoZWNrCisgICAgICAgIHByb2JsZW1fdGFza3MgPSBbXQorICAgICAgICBmb3IgdGFzayBpbiB4cmFuZ2UobnVtVGFza3MpOgorICAgICAgICAgICAgaWYgdGFza19kb25lW3Rhc2tdIGlzIEZhbHNlIG9yIGRlcHNfbGVmdFt0YXNrXSAhPSAwOgorICAgICAgICAgICAgICAgIHByb2JsZW1fdGFza3MuYXBwZW5kKHRhc2spCisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICJUYXNrICVzICglcykgaXMgbm90IGJ1aWxkYWJsZSIsIHRhc2ssIHNlbGYuZ2V0X3VzZXJfaWRzdHJpbmcodGFzaykpCisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICIoQ29tcGxldGUgbWFya2VyIHdhcyAlcyBhbmQgdGhlIHJlbWFpbmluZyBkZXBlbmRlbmN5IGNvdW50IHdhcyAlcylcbiIsIHRhc2tfZG9uZVt0YXNrXSwgZGVwc19sZWZ0W3Rhc2tdKQorCisgICAgICAgIGlmIHByb2JsZW1fdGFza3M6CisgICAgICAgICAgICBtZXNzYWdlID0gIlVuYnVpbGRhYmxlIHRhc2tzIHdlcmUgZm91bmQuXG4iCisgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZSArICJUaGVzZSBhcmUgdXN1YWxseSBjYXVzZWQgYnkgY2lyY3VsYXIgZGVwZW5kZW5jaWVzIGFuZCBhbnkgY2lyY3VsYXIgZGVwZW5kZW5jeSBjaGFpbnMgZm91bmQgd2lsbCBiZSBwcmludGVkIGJlbG93LiBJbmNyZWFzZSB0aGUgZGVidWcgbGV2ZWwgdG8gc2VlIGEgbGlzdCBvZiB1bmJ1aWxkYWJsZSB0YXNrcy5cblxuIgorICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UgKyAiSWRlbnRpZnlpbmcgZGVwZW5kZW5jeSBsb29wcyAodGhpcyBtYXkgdGFrZSBhIHNob3J0IHdoaWxlKS4uLlxuIgorICAgICAgICAgICAgbG9nZ2VyLmVycm9yKG1lc3NhZ2UpCisKKyAgICAgICAgICAgIG1zZ3MgPSBzZWxmLmNpcmN1bGFyX2RlcGNoYWluc19oYW5kbGVyKHByb2JsZW1fdGFza3MpCisKKyAgICAgICAgICAgIG1lc3NhZ2UgPSAiXG4iCisgICAgICAgICAgICBmb3IgbXNnIGluIG1zZ3M6CisgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UgKyBtc2cKKyAgICAgICAgICAgIGJiLm1zZy5mYXRhbCgiUnVuUXVldWUiLCBtZXNzYWdlKQorCisgICAgICAgIHJldHVybiB3ZWlnaHQKKworICAgIGRlZiBwcmVwYXJlKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgVHVybiBhIHNldCBvZiB0YXNrRGF0YSBpbnRvIGEgUnVuUXVldWUgYW5kIGNvbXB1dGUgZGF0YSBuZWVkZWQKKyAgICAgICAgdG8gb3B0aW1pc2UgdGhlIGV4ZWN1dGlvbiBvcmRlci4KKyAgICAgICAgIiIiCisKKyAgICAgICAgcnVucV9idWlsZCA9IFtdCisgICAgICAgIHJlY3Vyc2l2ZXRhc2tzID0ge30KKyAgICAgICAgcmVjdXJzaXZlaXRhc2tzID0ge30KKyAgICAgICAgcmVjdXJzaXZldGFza3NzZWxmcmVmID0gc2V0KCkKKworICAgICAgICB0YXNrRGF0YSA9IHNlbGYudGFza0RhdGEKKworICAgICAgICBpZiBsZW4odGFza0RhdGEudGFza3NfbmFtZSkgPT0gMDoKKyAgICAgICAgICAgICMgTm90aGluZyB0byBkbworICAgICAgICAgICAgcmV0dXJuIDAKKworICAgICAgICBsb2dnZXIuaW5mbygiUHJlcGFyaW5nIFJ1blF1ZXVlIikKKworICAgICAgICAjIFN0ZXAgQSAtIFdvcmsgb3V0IGEgbGlzdCBvZiB0YXNrcyB0byBydW4KKyAgICAgICAgIworICAgICAgICAjIFRhc2tkYXRhIGdpdmVzIHVzIGEgbGlzdCBvZiBwb3NzaWJsZSBwcm92aWRlcnMgZm9yIGV2ZXJ5IGJ1aWxkIGFuZCBydW4KKyAgICAgICAgIyB0YXJnZXQgb3JkZXJlZCBieSBwcmlvcml0eS4gSXQgYWxzbyBnaXZlcyBpbmZvcm1hdGlvbiBvbiBlYWNoIG9mIHRob3NlCisgICAgICAgICMgcHJvdmlkZXJzLgorICAgICAgICAjCisgICAgICAgICMgVG8gY3JlYXRlIHRoZSBhY3R1YWwgbGlzdCBvZiB0YXNrcyB0byBleGVjdXRlIHdlIGZpeCB0aGUgbGlzdCBvZgorICAgICAgICAjIHByb3ZpZGVycyBhbmQgdGhlbiByZXNvbHZlIHRoZSBkZXBlbmRlbmNpZXMgaW50byB0YXNrIElEcy4gVGhpcworICAgICAgICAjIHByb2Nlc3MgaXMgcmVwZWF0ZWQgZm9yIGVhY2ggdHlwZSBvZiBkZXBlbmRlbmN5ICh0ZGVwZW5kcywgZGVwdGFzaywKKyAgICAgICAgIyByZGVwdGFzdCwgcmVjcmRlcHRhc2ssIGlkZXBlbmRzKS4KKworICAgICAgICBkZWYgYWRkX2J1aWxkX2RlcGVuZGVuY2llcyhkZXBpZHMsIHRhc2tuYW1lcywgZGVwZW5kcyk6CisgICAgICAgICAgICBmb3IgZGVwaWQgaW4gZGVwaWRzOgorICAgICAgICAgICAgICAgICMgV29uJ3QgYmUgaW4gYnVpbGRfdGFyZ2V0cyBpZiBBU1NVTUVfUFJPVklERUQKKyAgICAgICAgICAgICAgICBpZiBkZXBpZCBub3QgaW4gdGFza0RhdGEuYnVpbGRfdGFyZ2V0czoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBkZXBkYXRhID0gdGFza0RhdGEuYnVpbGRfdGFyZ2V0c1tkZXBpZF1bMF0KKyAgICAgICAgICAgICAgICBpZiBkZXBkYXRhIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZm9yIHRhc2tuYW1lIGluIHRhc2tuYW1lczoKKyAgICAgICAgICAgICAgICAgICAgdGFza2lkID0gdGFza0RhdGEuZ2V0dGFza19pZF9mcm9tZm5pZChkZXBkYXRhLCB0YXNrbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgdGFza2lkIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kcy5hZGQodGFza2lkKQorCisgICAgICAgIGRlZiBhZGRfcnVudGltZV9kZXBlbmRlbmNpZXMoZGVwaWRzLCB0YXNrbmFtZXMsIGRlcGVuZHMpOgorICAgICAgICAgICAgZm9yIGRlcGlkIGluIGRlcGlkczoKKyAgICAgICAgICAgICAgICBpZiBkZXBpZCBub3QgaW4gdGFza0RhdGEucnVuX3RhcmdldHM6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZGVwZGF0YSA9IHRhc2tEYXRhLnJ1bl90YXJnZXRzW2RlcGlkXVswXQorICAgICAgICAgICAgICAgIGlmIGRlcGRhdGEgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBmb3IgdGFza25hbWUgaW4gdGFza25hbWVzOgorICAgICAgICAgICAgICAgICAgICB0YXNraWQgPSB0YXNrRGF0YS5nZXR0YXNrX2lkX2Zyb21mbmlkKGRlcGRhdGEsIHRhc2tuYW1lKQorICAgICAgICAgICAgICAgICAgICBpZiB0YXNraWQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRzLmFkZCh0YXNraWQpCisKKyAgICAgICAgZGVmIGFkZF9yZXNvbHZlZF9kZXBlbmRlbmNpZXMoZGVwaWRzLCB0YXNrbmFtZXMsIGRlcGVuZHMpOgorICAgICAgICAgICAgZm9yIGRlcGlkIGluIGRlcGlkczoKKyAgICAgICAgICAgICAgICBmb3IgdGFza25hbWUgaW4gdGFza25hbWVzOgorICAgICAgICAgICAgICAgICAgICB0YXNraWQgPSB0YXNrRGF0YS5nZXR0YXNrX2lkX2Zyb21mbmlkKGRlcGlkLCB0YXNrbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgdGFza2lkIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kcy5hZGQodGFza2lkKQorCisgICAgICAgIGZvciB0YXNrIGluIHhyYW5nZShsZW4odGFza0RhdGEudGFza3NfbmFtZSkpOgorICAgICAgICAgICAgZGVwZW5kcyA9IHNldCgpCisgICAgICAgICAgICBmbmlkID0gdGFza0RhdGEudGFza3NfZm5pZFt0YXNrXQorICAgICAgICAgICAgZm4gPSB0YXNrRGF0YS5mbl9pbmRleFtmbmlkXQorICAgICAgICAgICAgdGFza19kZXBzID0gc2VsZi5kYXRhQ2FjaGUudGFza19kZXBzW2ZuXQorCisgICAgICAgICAgICAjbG9nZ2VyLmRlYnVnKDIsICJQcm9jZXNzaW5nICVzOiVzIiwgZm4sIHRhc2tEYXRhLnRhc2tzX25hbWVbdGFza10pCisKKyAgICAgICAgICAgIGlmIGZuaWQgbm90IGluIHRhc2tEYXRhLmZhaWxlZF9mbmlkczoKKworICAgICAgICAgICAgICAgICMgUmVzb2x2ZSB0YXNrIGludGVybmFsIGRlcGVuZGVuY2llcworICAgICAgICAgICAgICAgICMKKyAgICAgICAgICAgICAgICAjIGUuZy4gYWRkdGFzayBiZWZvcmUgWCBhZnRlciBZCisgICAgICAgICAgICAgICAgZGVwZW5kcyA9IHNldCh0YXNrRGF0YS50YXNrc190ZGVwZW5kc1t0YXNrXSkKKworICAgICAgICAgICAgICAgICMgUmVzb2x2ZSAnZGVwdGFzaycgZGVwZW5kZW5jaWVzCisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgICMgZS5nLiBkb19zb21ldGFza1tkZXB0YXNrXSA9ICJkb19zb21lb3RoZXJ0YXNrIgorICAgICAgICAgICAgICAgICMgKG1ha2VzIHN1cmUgc29tZXRhc2sgcnVucyBhZnRlciBzb21lb3RoZXJ0YXNrIG9mIGFsbCBERVBFTkRTKQorICAgICAgICAgICAgICAgIGlmICdkZXB0YXNrJyBpbiB0YXNrX2RlcHMgYW5kIHRhc2tEYXRhLnRhc2tzX25hbWVbdGFza10gaW4gdGFza19kZXBzWydkZXB0YXNrJ106CisgICAgICAgICAgICAgICAgICAgIHRhc2tuYW1lcyA9IHRhc2tfZGVwc1snZGVwdGFzayddW3Rhc2tEYXRhLnRhc2tzX25hbWVbdGFza11dLnNwbGl0KCkKKyAgICAgICAgICAgICAgICAgICAgYWRkX2J1aWxkX2RlcGVuZGVuY2llcyh0YXNrRGF0YS5kZXBpZHNbZm5pZF0sIHRhc2tuYW1lcywgZGVwZW5kcykKKworICAgICAgICAgICAgICAgICMgUmVzb2x2ZSAncmRlcHRhc2snIGRlcGVuZGVuY2llcworICAgICAgICAgICAgICAgICMKKyAgICAgICAgICAgICAgICAjIGUuZy4gZG9fc29tZXRhc2tbcmRlcHRhc2tdID0gImRvX3NvbWVvdGhlcnRhc2siCisgICAgICAgICAgICAgICAgIyAobWFrZXMgc3VyZSBzb21ldGFzayBydW5zIGFmdGVyIHNvbWVvdGhlcnRhc2sgb2YgYWxsIFJERVBFTkRTKQorICAgICAgICAgICAgICAgIGlmICdyZGVwdGFzaycgaW4gdGFza19kZXBzIGFuZCB0YXNrRGF0YS50YXNrc19uYW1lW3Rhc2tdIGluIHRhc2tfZGVwc1sncmRlcHRhc2snXToKKyAgICAgICAgICAgICAgICAgICAgdGFza25hbWVzID0gdGFza19kZXBzWydyZGVwdGFzayddW3Rhc2tEYXRhLnRhc2tzX25hbWVbdGFza11dLnNwbGl0KCkKKyAgICAgICAgICAgICAgICAgICAgYWRkX3J1bnRpbWVfZGVwZW5kZW5jaWVzKHRhc2tEYXRhLnJkZXBpZHNbZm5pZF0sIHRhc2tuYW1lcywgZGVwZW5kcykKKworICAgICAgICAgICAgICAgICMgUmVzb2x2ZSBpbnRlci10YXNrIGRlcGVuZGVuY2llcworICAgICAgICAgICAgICAgICMKKyAgICAgICAgICAgICAgICAjIGUuZy4gZG9fc29tZXRhc2tbZGVwZW5kc10gPSAidGFyZ2V0bmFtZTpkb19zb21lb3RoZXJ0YXNrIgorICAgICAgICAgICAgICAgICMgKG1ha2VzIHN1cmUgc29tZXRhc2sgcnVucyBhZnRlciB0YXJnZXRuYW1lJ3Mgc29tZW90aGVydGFzaykKKyAgICAgICAgICAgICAgICBpZGVwZW5kcyA9IHRhc2tEYXRhLnRhc2tzX2lkZXBlbmRzW3Rhc2tdCisgICAgICAgICAgICAgICAgZm9yIChkZXBpZCwgaWRlcGVuZHRhc2spIGluIGlkZXBlbmRzOgorICAgICAgICAgICAgICAgICAgICBpZiBkZXBpZCBpbiB0YXNrRGF0YS5idWlsZF90YXJnZXRzIGFuZCBub3QgZGVwaWQgaW4gdGFza0RhdGEuZmFpbGVkX2RlcHM6CisgICAgICAgICAgICAgICAgICAgICAgICAjIFdvbid0IGJlIGluIGJ1aWxkX3RhcmdldHMgaWYgQVNTVU1FX1BST1ZJREVECisgICAgICAgICAgICAgICAgICAgICAgICBkZXBkYXRhID0gdGFza0RhdGEuYnVpbGRfdGFyZ2V0c1tkZXBpZF1bMF0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRlcGRhdGEgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFza2lkID0gdGFza0RhdGEuZ2V0dGFza19pZF9mcm9tZm5pZChkZXBkYXRhLCBpZGVwZW5kdGFzaykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0YXNraWQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmIubXNnLmZhdGFsKCJSdW5RdWV1ZSIsICJUYXNrICVzIGluICVzIGRlcGVuZHMgdXBvbiBub24tZXhpc3RlbnQgdGFzayAlcyBpbiAlcyIgJSAodGFza0RhdGEudGFza3NfbmFtZVt0YXNrXSwgZm4sIGlkZXBlbmR0YXNrLCB0YXNrRGF0YS5mbl9pbmRleFtkZXBkYXRhXSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kcy5hZGQodGFza2lkKQorICAgICAgICAgICAgICAgIGlyZGVwZW5kcyA9IHRhc2tEYXRhLnRhc2tzX2lyZGVwZW5kc1t0YXNrXQorICAgICAgICAgICAgICAgIGZvciAoZGVwaWQsIGlkZXBlbmR0YXNrKSBpbiBpcmRlcGVuZHM6CisgICAgICAgICAgICAgICAgICAgIGlmIGRlcGlkIGluIHRhc2tEYXRhLnJ1bl90YXJnZXRzOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBXb24ndCBiZSBpbiBydW5fdGFyZ2V0cyBpZiBBU1NVTUVfUFJPVklERUQKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlcGRhdGEgPSB0YXNrRGF0YS5ydW5fdGFyZ2V0c1tkZXBpZF1bMF0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRlcGRhdGEgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFza2lkID0gdGFza0RhdGEuZ2V0dGFza19pZF9mcm9tZm5pZChkZXBkYXRhLCBpZGVwZW5kdGFzaykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0YXNraWQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmIubXNnLmZhdGFsKCJSdW5RdWV1ZSIsICJUYXNrICVzIGluICVzIHJkZXBlbmRzIHVwb24gbm9uLWV4aXN0ZW50IHRhc2sgJXMgaW4gJXMiICUgKHRhc2tEYXRhLnRhc2tzX25hbWVbdGFza10sIGZuLCBpZGVwZW5kdGFzaywgdGFza0RhdGEuZm5faW5kZXhbZGVwZGF0YV0pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZHMuYWRkKHRhc2tpZCkKKworICAgICAgICAgICAgICAgICMgUmVzb2x2ZSByZWN1cnNpdmUgJ3JlY3JkZXB0YXNrJyBkZXBlbmRlbmNpZXMgKFBhcnQgQSkKKyAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgIyBlLmcuIGRvX3NvbWV0YXNrW3JlY3JkZXB0YXNrXSA9ICJkb19zb21lb3RoZXJ0YXNrIgorICAgICAgICAgICAgICAgICMgKG1ha2VzIHN1cmUgc29tZXRhc2sgcnVucyBhZnRlciBzb21lb3RoZXJ0YXNrIG9mIGFsbCBERVBFTkRTLCBSREVQRU5EUyBhbmQgaW50ZXJ0YXNrIGRlcGVuZGVuY2llcywgcmVjdXJzaXZlbHkpCisgICAgICAgICAgICAgICAgIyBXZSBjb3ZlciB0aGUgcmVjdXJzaXZlIHBhcnQgb2YgdGhlIGRlcGVuZGVuY2llcyBiZWxvdworICAgICAgICAgICAgICAgIGlmICdyZWNyZGVwdGFzaycgaW4gdGFza19kZXBzIGFuZCB0YXNrRGF0YS50YXNrc19uYW1lW3Rhc2tdIGluIHRhc2tfZGVwc1sncmVjcmRlcHRhc2snXToKKyAgICAgICAgICAgICAgICAgICAgdGFza25hbWVzID0gdGFza19kZXBzWydyZWNyZGVwdGFzayddW3Rhc2tEYXRhLnRhc2tzX25hbWVbdGFza11dLnNwbGl0KCkKKyAgICAgICAgICAgICAgICAgICAgcmVjdXJzaXZldGFza3NbdGFza10gPSB0YXNrbmFtZXMKKyAgICAgICAgICAgICAgICAgICAgYWRkX2J1aWxkX2RlcGVuZGVuY2llcyh0YXNrRGF0YS5kZXBpZHNbZm5pZF0sIHRhc2tuYW1lcywgZGVwZW5kcykKKyAgICAgICAgICAgICAgICAgICAgYWRkX3J1bnRpbWVfZGVwZW5kZW5jaWVzKHRhc2tEYXRhLnJkZXBpZHNbZm5pZF0sIHRhc2tuYW1lcywgZGVwZW5kcykKKyAgICAgICAgICAgICAgICAgICAgaWYgdGFza0RhdGEudGFza3NfbmFtZVt0YXNrXSBpbiB0YXNrbmFtZXM6CisgICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNpdmV0YXNrc3NlbGZyZWYuYWRkKHRhc2spCisKKyAgICAgICAgICAgICAgICAgICAgaWYgJ3JlY2lkZXB0YXNrJyBpbiB0YXNrX2RlcHMgYW5kIHRhc2tEYXRhLnRhc2tzX25hbWVbdGFza10gaW4gdGFza19kZXBzWydyZWNpZGVwdGFzayddOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzaXZlaXRhc2tzW3Rhc2tdID0gW10KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0IGluIHRhc2tfZGVwc1sncmVjaWRlcHRhc2snXVt0YXNrRGF0YS50YXNrc19uYW1lW3Rhc2tdXS5zcGxpdCgpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld2RlcCA9IHRhc2tEYXRhLmdldHRhc2tfaWRfZnJvbWZuaWQoZm5pZCwgdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNpdmVpdGFza3NbdGFza10uYXBwZW5kKG5ld2RlcCkKKworICAgICAgICAgICAgc2VsZi5ydW5xX2ZuaWQuYXBwZW5kKHRhc2tEYXRhLnRhc2tzX2ZuaWRbdGFza10pCisgICAgICAgICAgICBzZWxmLnJ1bnFfdGFzay5hcHBlbmQodGFza0RhdGEudGFza3NfbmFtZVt0YXNrXSkKKyAgICAgICAgICAgIHNlbGYucnVucV9kZXBlbmRzLmFwcGVuZChkZXBlbmRzKQorICAgICAgICAgICAgc2VsZi5ydW5xX3JldmRlcHMuYXBwZW5kKHNldCgpKQorICAgICAgICAgICAgc2VsZi5ydW5xX2hhc2guYXBwZW5kKCIiKQorCisgICAgICAgICAgICBydW5xX2J1aWxkLmFwcGVuZCgwKQorCisgICAgICAgICMgUmVzb2x2ZSByZWN1cnNpdmUgJ3JlY3JkZXB0YXNrJyBkZXBlbmRlbmNpZXMgKFBhcnQgQikKKyAgICAgICAgIworICAgICAgICAjIGUuZy4gZG9fc29tZXRhc2tbcmVjcmRlcHRhc2tdID0gImRvX3NvbWVvdGhlcnRhc2siCisgICAgICAgICMgKG1ha2VzIHN1cmUgc29tZXRhc2sgcnVucyBhZnRlciBzb21lb3RoZXJ0YXNrIG9mIGFsbCBERVBFTkRTLCBSREVQRU5EUyBhbmQgaW50ZXJ0YXNrIGRlcGVuZGVuY2llcywgcmVjdXJzaXZlbHkpCisgICAgICAgICMgV2UgbmVlZCB0byBkbyB0aGlzIHNlcGFyYXRlbHkgc2luY2Ugd2UgbmVlZCBhbGwgb2Ygc2VsZi5ydW5xX2RlcGVuZHMgdG8gYmUgY29tcGxldGUgYmVmb3JlIHRoaXMgaXMgcHJvY2Vzc2VkCisgICAgICAgIGV4dHJhZGVwcyA9IHt9CisgICAgICAgIGZvciB0YXNrIGluIHJlY3Vyc2l2ZXRhc2tzOgorICAgICAgICAgICAgZXh0cmFkZXBzW3Rhc2tdID0gc2V0KHNlbGYucnVucV9kZXBlbmRzW3Rhc2tdKQorICAgICAgICAgICAgdGFza25hbWVzID0gcmVjdXJzaXZldGFza3NbdGFza10KKyAgICAgICAgICAgIHNlZW5kZXBzID0gc2V0KCkKKyAgICAgICAgICAgIHNlZW5mbmlkID0gW10KKworICAgICAgICAgICAgZGVmIGdlbmVyYXRlX3JlY2RlcHModCk6CisgICAgICAgICAgICAgICAgbmV3ZGVwcyA9IHNldCgpCisgICAgICAgICAgICAgICAgYWRkX3Jlc29sdmVkX2RlcGVuZGVuY2llcyhbdGFza0RhdGEudGFza3NfZm5pZFt0XV0sIHRhc2tuYW1lcywgbmV3ZGVwcykKKyAgICAgICAgICAgICAgICBleHRyYWRlcHNbdGFza10udXBkYXRlKG5ld2RlcHMpCisgICAgICAgICAgICAgICAgc2VlbmRlcHMuYWRkKHQpCisgICAgICAgICAgICAgICAgbmV3ZGVwcy5hZGQodCkKKyAgICAgICAgICAgICAgICBmb3IgaSBpbiBuZXdkZXBzOgorICAgICAgICAgICAgICAgICAgICBmb3IgbiBpbiBzZWxmLnJ1bnFfZGVwZW5kc1tpXToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG4gbm90IGluIHNlZW5kZXBzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlX3JlY2RlcHMobikKKyAgICAgICAgICAgIGdlbmVyYXRlX3JlY2RlcHModGFzaykKKworICAgICAgICAgICAgaWYgdGFzayBpbiByZWN1cnNpdmVpdGFza3M6CisgICAgICAgICAgICAgICAgZm9yIGRlcCBpbiByZWN1cnNpdmVpdGFza3NbdGFza106CisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlX3JlY2RlcHMoZGVwKQorCisgICAgICAgICMgUmVtb3ZlIGNpcmN1bGFyIHJlZmVyZW5jZXMgc28gdGhhdCBkb19hW3JlY3JkZXB0YXNrXSA9ICJkb19hIGRvX2IiIGNhbiB3b3JrCisgICAgICAgIGZvciB0YXNrIGluIHJlY3Vyc2l2ZXRhc2tzOgorICAgICAgICAgICAgZXh0cmFkZXBzW3Rhc2tdLmRpZmZlcmVuY2VfdXBkYXRlKHJlY3Vyc2l2ZXRhc2tzc2VsZnJlZikKKworICAgICAgICBmb3IgdGFzayBpbiB4cmFuZ2UobGVuKHRhc2tEYXRhLnRhc2tzX25hbWUpKToKKyAgICAgICAgICAgICMgQWRkIGluIGV4dHJhIGRlcGVuZGVuY2llcworICAgICAgICAgICAgaWYgdGFzayBpbiBleHRyYWRlcHM6CisgICAgICAgICAgICAgICAgIHNlbGYucnVucV9kZXBlbmRzW3Rhc2tdID0gZXh0cmFkZXBzW3Rhc2tdCisgICAgICAgICAgICAjIFJlbW92ZSBhbGwgc2VsZiByZWZlcmVuY2VzCisgICAgICAgICAgICBpZiB0YXNrIGluIHNlbGYucnVucV9kZXBlbmRzW3Rhc2tdOgorICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygyLCAiVGFzayAlcyAoJXMgJXMpIGNvbnRhaW5zIHNlbGYgcmVmZXJlbmNlISAlcyIsIHRhc2ssIHRhc2tEYXRhLmZuX2luZGV4W3Rhc2tEYXRhLnRhc2tzX2ZuaWRbdGFza11dLCB0YXNrRGF0YS50YXNrc19uYW1lW3Rhc2tdLCBzZWxmLnJ1bnFfZGVwZW5kc1t0YXNrXSkKKyAgICAgICAgICAgICAgICBzZWxmLnJ1bnFfZGVwZW5kc1t0YXNrXS5yZW1vdmUodGFzaykKKworICAgICAgICAjIFN0ZXAgQiAtIE1hcmsgYWxsIGFjdGl2ZSB0YXNrcworICAgICAgICAjCisgICAgICAgICMgU3RhcnQgd2l0aCB0aGUgdGFza3Mgd2Ugd2VyZSBhc2tlZCB0byBydW4gYW5kIG1hcmsgYWxsIGRlcGVuZGVuY2llcworICAgICAgICAjIGFzIGFjdGl2ZSB0b28uIElmIHRoZSB0YXNrIGlzIHRvIGJlICdmb3JjZWQnLCBjbGVhciBpdHMgc3RhbXAuIE9uY2UKKyAgICAgICAgIyBhbGwgYWN0aXZlIHRhc2tzIGFyZSBtYXJrZWQsIHBydW5lIHRoZSBvbmVzIHdlIGRvbid0IG5lZWQuCisKKyAgICAgICAgbG9nZ2VyLnZlcmJvc2UoIk1hcmtpbmcgQWN0aXZlIFRhc2tzIikKKworICAgICAgICBkZWYgbWFya19hY3RpdmUobGlzdGlkLCBkZXB0aCk6CisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIE1hcmsgYW4gaXRlbSBhcyBhY3RpdmUgYWxvbmcgd2l0aCBpdHMgZGVwZW5kcworICAgICAgICAgICAgKGNhbGxzIGl0c2VsZiByZWN1cnNpdmVseSkKKyAgICAgICAgICAgICIiIgorCisgICAgICAgICAgICBpZiBydW5xX2J1aWxkW2xpc3RpZF0gPT0gMToKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAgICAgcnVucV9idWlsZFtsaXN0aWRdID0gMQorCisgICAgICAgICAgICBkZXBlbmRzID0gc2VsZi5ydW5xX2RlcGVuZHNbbGlzdGlkXQorICAgICAgICAgICAgZm9yIGRlcGVuZCBpbiBkZXBlbmRzOgorICAgICAgICAgICAgICAgIG1hcmtfYWN0aXZlKGRlcGVuZCwgZGVwdGgrMSkKKworICAgICAgICBzZWxmLnRhcmdldF9wYWlycyA9IFtdCisgICAgICAgIGZvciB0YXJnZXQgaW4gc2VsZi50YXJnZXRzOgorICAgICAgICAgICAgdGFyZ2V0aWQgPSB0YXNrRGF0YS5nZXRidWlsZF9pZCh0YXJnZXRbMF0pCisKKyAgICAgICAgICAgIGlmIHRhcmdldGlkIG5vdCBpbiB0YXNrRGF0YS5idWlsZF90YXJnZXRzOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIHRhcmdldGlkIGluIHRhc2tEYXRhLmZhaWxlZF9kZXBzOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGZuaWQgPSB0YXNrRGF0YS5idWlsZF90YXJnZXRzW3RhcmdldGlkXVswXQorICAgICAgICAgICAgZm4gPSB0YXNrRGF0YS5mbl9pbmRleFtmbmlkXQorICAgICAgICAgICAgc2VsZi50YXJnZXRfcGFpcnMuYXBwZW5kKChmbiwgdGFyZ2V0WzFdKSkKKworICAgICAgICAgICAgaWYgZm5pZCBpbiB0YXNrRGF0YS5mYWlsZWRfZm5pZHM6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgdGFyZ2V0WzFdIG5vdCBpbiB0YXNrRGF0YS50YXNrc19sb29rdXBbZm5pZF06CisgICAgICAgICAgICAgICAgaW1wb3J0IGRpZmZsaWIKKyAgICAgICAgICAgICAgICBjbG9zZV9tYXRjaGVzID0gZGlmZmxpYi5nZXRfY2xvc2VfbWF0Y2hlcyh0YXJnZXRbMV0sIHRhc2tEYXRhLnRhc2tzX2xvb2t1cFtmbmlkXSwgY3V0b2ZmPTAuNykKKyAgICAgICAgICAgICAgICBpZiBjbG9zZV9tYXRjaGVzOgorICAgICAgICAgICAgICAgICAgICBleHRyYSA9ICIuIENsb3NlIG1hdGNoZXM6XG4gICVzIiAlICJcbiAgIi5qb2luKGNsb3NlX21hdGNoZXMpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZXh0cmEgPSAiIgorICAgICAgICAgICAgICAgIGJiLm1zZy5mYXRhbCgiUnVuUXVldWUiLCAiVGFzayAlcyBkb2VzIG5vdCBleGlzdCBmb3IgdGFyZ2V0ICVzJXMiICUgKHRhcmdldFsxXSwgdGFyZ2V0WzBdLCBleHRyYSkpCisKKyAgICAgICAgICAgIGxpc3RpZCA9IHRhc2tEYXRhLnRhc2tzX2xvb2t1cFtmbmlkXVt0YXJnZXRbMV1dCisKKyAgICAgICAgICAgIG1hcmtfYWN0aXZlKGxpc3RpZCwgMSkKKworICAgICAgICAjIFN0ZXAgQyAtIFBydW5lIGFsbCBpbmFjdGl2ZSB0YXNrcworICAgICAgICAjCisgICAgICAgICMgT25jZSBhbGwgYWN0aXZlIHRhc2tzIGFyZSBtYXJrZWQsIHBydW5lIHRoZSBvbmVzIHdlIGRvbid0IG5lZWQuCisKKyAgICAgICAgbWFwcyA9IFtdCisgICAgICAgIGRlbGNvdW50ID0gMAorICAgICAgICBmb3IgbGlzdGlkIGluIHhyYW5nZShsZW4oc2VsZi5ydW5xX2ZuaWQpKToKKyAgICAgICAgICAgIGlmIHJ1bnFfYnVpbGRbbGlzdGlkLWRlbGNvdW50XSA9PSAxOgorICAgICAgICAgICAgICAgIG1hcHMuYXBwZW5kKGxpc3RpZC1kZWxjb3VudCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZGVsIHNlbGYucnVucV9mbmlkW2xpc3RpZC1kZWxjb3VudF0KKyAgICAgICAgICAgICAgICBkZWwgc2VsZi5ydW5xX3Rhc2tbbGlzdGlkLWRlbGNvdW50XQorICAgICAgICAgICAgICAgIGRlbCBzZWxmLnJ1bnFfZGVwZW5kc1tsaXN0aWQtZGVsY291bnRdCisgICAgICAgICAgICAgICAgZGVsIHJ1bnFfYnVpbGRbbGlzdGlkLWRlbGNvdW50XQorICAgICAgICAgICAgICAgIGRlbCBzZWxmLnJ1bnFfcmV2ZGVwc1tsaXN0aWQtZGVsY291bnRdCisgICAgICAgICAgICAgICAgZGVsIHNlbGYucnVucV9oYXNoW2xpc3RpZC1kZWxjb3VudF0KKyAgICAgICAgICAgICAgICBkZWxjb3VudCA9IGRlbGNvdW50ICsgMQorICAgICAgICAgICAgICAgIG1hcHMuYXBwZW5kKC0xKQorCisgICAgICAgICMKKyAgICAgICAgIyBTdGVwIEQgLSBTYW5pdHkgY2hlY2tzIGFuZCBjb21wdXRhdGlvbgorICAgICAgICAjCisKKyAgICAgICAgIyBDaGVjayB0byBtYWtlIHN1cmUgd2Ugc3RpbGwgaGF2ZSB0YXNrcyB0byBydW4KKyAgICAgICAgaWYgbGVuKHNlbGYucnVucV9mbmlkKSA9PSAwOgorICAgICAgICAgICAgaWYgbm90IHRhc2tEYXRhLmFib3J0OgorICAgICAgICAgICAgICAgIGJiLm1zZy5mYXRhbCgiUnVuUXVldWUiLCAiQWxsIGJ1aWxkYWJsZSB0YXNrcyBoYXZlIGJlZW4gcnVuIGJ1dCB0aGUgYnVpbGQgaXMgaW5jb21wbGV0ZSAoLS1jb250aW51ZSBtb2RlKS4gRXJyb3JzIGZvciB0aGUgdGFza3MgdGhhdCBmYWlsZWQgd2lsbCBoYXZlIGJlZW4gcHJpbnRlZCBhYm92ZS4iKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBiYi5tc2cuZmF0YWwoIlJ1blF1ZXVlIiwgIk5vIGFjdGl2ZSB0YXNrcyBhbmQgbm90IGluIC0tY29udGludWUgbW9kZT8hIFBsZWFzZSByZXBvcnQgdGhpcyBidWcuIikKKworICAgICAgICBsb2dnZXIudmVyYm9zZSgiUHJ1bmVkICVzIGluYWN0aXZlIHRhc2tzLCAlcyBsZWZ0IiwgZGVsY291bnQsIGxlbihzZWxmLnJ1bnFfZm5pZCkpCisKKyAgICAgICAgIyBSZW1hcCB0aGUgZGVwZW5kZW5jaWVzIHRvIGFjY291bnQgZm9yIHRoZSBkZWxldGVkIHRhc2tzCisgICAgICAgICMgQ2hlY2sgd2UgZGlkbid0IGRlbGV0ZSBhIHRhc2sgd2UgZGVwZW5kIG9uCisgICAgICAgIGZvciBsaXN0aWQgaW4geHJhbmdlKGxlbihzZWxmLnJ1bnFfZm5pZCkpOgorICAgICAgICAgICAgbmV3ZGVwcyA9IFtdCisgICAgICAgICAgICBvcmlnZGVwcyA9IHNlbGYucnVucV9kZXBlbmRzW2xpc3RpZF0KKyAgICAgICAgICAgIGZvciBvcmlnZGVwIGluIG9yaWdkZXBzOgorICAgICAgICAgICAgICAgIGlmIG1hcHNbb3JpZ2RlcF0gPT0gLTE6CisgICAgICAgICAgICAgICAgICAgIGJiLm1zZy5mYXRhbCgiUnVuUXVldWUiLCAiSW52YWxpZCBtYXBwaW5nIC0gU2hvdWxkIG5ldmVyIGhhcHBlbiEiKQorICAgICAgICAgICAgICAgIG5ld2RlcHMuYXBwZW5kKG1hcHNbb3JpZ2RlcF0pCisgICAgICAgICAgICBzZWxmLnJ1bnFfZGVwZW5kc1tsaXN0aWRdID0gc2V0KG5ld2RlcHMpCisKKyAgICAgICAgbG9nZ2VyLnZlcmJvc2UoIkFzc2lnbiBXZWlnaHRpbmdzIikKKworICAgICAgICAjIEdlbmVyYXRlIGEgbGlzdCBvZiByZXZlcnNlIGRlcGVuZGVuY2llcyB0byBlYXNlIGZ1dHVyZSBjYWxjdWxhdGlvbnMKKyAgICAgICAgZm9yIGxpc3RpZCBpbiB4cmFuZ2UobGVuKHNlbGYucnVucV9mbmlkKSk6CisgICAgICAgICAgICBmb3IgZGVwIGluIHNlbGYucnVucV9kZXBlbmRzW2xpc3RpZF06CisgICAgICAgICAgICAgICAgc2VsZi5ydW5xX3JldmRlcHNbZGVwXS5hZGQobGlzdGlkKQorCisgICAgICAgICMgSWRlbnRpZnkgdGFza3MgYXQgdGhlIGVuZCBvZiBkZXBlbmRlbmN5IGNoYWlucworICAgICAgICAjIEVycm9yIG9uIGNpcmN1bGFyIGRlcGVuZGVuY3kgbG9vcHMgKGxlbmd0aCB0d28pCisgICAgICAgIGVuZHBvaW50cyA9IFtdCisgICAgICAgIGZvciBsaXN0aWQgaW4geHJhbmdlKGxlbihzZWxmLnJ1bnFfZm5pZCkpOgorICAgICAgICAgICAgcmV2ZGVwcyA9IHNlbGYucnVucV9yZXZkZXBzW2xpc3RpZF0KKyAgICAgICAgICAgIGlmIGxlbihyZXZkZXBzKSA9PSAwOgorICAgICAgICAgICAgICAgIGVuZHBvaW50cy5hcHBlbmQobGlzdGlkKQorICAgICAgICAgICAgZm9yIGRlcCBpbiByZXZkZXBzOgorICAgICAgICAgICAgICAgIGlmIGRlcCBpbiBzZWxmLnJ1bnFfZGVwZW5kc1tsaXN0aWRdOgorICAgICAgICAgICAgICAgICAgICAjc2VsZi5kdW1wX2RhdGEodGFza0RhdGEpCisgICAgICAgICAgICAgICAgICAgIGJiLm1zZy5mYXRhbCgiUnVuUXVldWUiLCAiVGFzayAlcyAoJXMpIGhhcyBjaXJjdWxhciBkZXBlbmRlbmN5IG9uICVzICglcykiICUgKHRhc2tEYXRhLmZuX2luZGV4W3NlbGYucnVucV9mbmlkW2RlcF1dLCBzZWxmLnJ1bnFfdGFza1tkZXBdLCB0YXNrRGF0YS5mbl9pbmRleFtzZWxmLnJ1bnFfZm5pZFtsaXN0aWRdXSwgc2VsZi5ydW5xX3Rhc2tbbGlzdGlkXSkpCisKKyAgICAgICAgbG9nZ2VyLnZlcmJvc2UoIkNvbXB1dGUgdG90YWxzIChoYXZlICVzIGVuZHBvaW50KHMpKSIsIGxlbihlbmRwb2ludHMpKQorCisgICAgICAgICMgQ2FsY3VsYXRlIHRhc2sgd2VpZ2h0cworICAgICAgICAjIENoZWNrIG9mIGhpZ2hlciBsZW5ndGggY2lyY3VsYXIgZGVwZW5kZW5jaWVzCisgICAgICAgIHNlbGYucnVucV93ZWlnaHQgPSBzZWxmLmNhbGN1bGF0ZV90YXNrX3dlaWdodHMoZW5kcG9pbnRzKQorCisgICAgICAgICMgU2FuaXR5IENoZWNrIC0gQ2hlY2sgZm9yIG11bHRpcGxlIHRhc2tzIGJ1aWxkaW5nIHRoZSBzYW1lIHByb3ZpZGVyCisgICAgICAgIHByb3ZfbGlzdCA9IHt9CisgICAgICAgIHNlZW5fZm4gPSBbXQorICAgICAgICBmb3IgdGFzayBpbiB4cmFuZ2UobGVuKHNlbGYucnVucV9mbmlkKSk6CisgICAgICAgICAgICBmbiA9IHRhc2tEYXRhLmZuX2luZGV4W3NlbGYucnVucV9mbmlkW3Rhc2tdXQorICAgICAgICAgICAgaWYgZm4gaW4gc2Vlbl9mbjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgc2Vlbl9mbi5hcHBlbmQoZm4pCisgICAgICAgICAgICBmb3IgcHJvdiBpbiBzZWxmLmRhdGFDYWNoZS5mbl9wcm92aWRlc1tmbl06CisgICAgICAgICAgICAgICAgaWYgcHJvdiBub3QgaW4gcHJvdl9saXN0OgorICAgICAgICAgICAgICAgICAgICBwcm92X2xpc3RbcHJvdl0gPSBbZm5dCisgICAgICAgICAgICAgICAgZWxpZiBmbiBub3QgaW4gcHJvdl9saXN0W3Byb3ZdOgorICAgICAgICAgICAgICAgICAgICBwcm92X2xpc3RbcHJvdl0uYXBwZW5kKGZuKQorICAgICAgICBmb3IgcHJvdiBpbiBwcm92X2xpc3Q6CisgICAgICAgICAgICBpZiBsZW4ocHJvdl9saXN0W3Byb3ZdKSA+IDEgYW5kIHByb3Ygbm90IGluIHNlbGYubXVsdGlfcHJvdmlkZXJfd2hpdGVsaXN0OgorICAgICAgICAgICAgICAgIHNlZW5fcG4gPSBbXQorICAgICAgICAgICAgICAgICMgSWYgdHdvIHZlcnNpb25zIG9mIHRoZSBzYW1lIFBOIGFyZSBiZWluZyBidWlsdCBpdHMgZmF0YWwsIHdlIGRvbid0IHN1cHBvcnQgaXQuCisgICAgICAgICAgICAgICAgZm9yIGZuIGluIHByb3ZfbGlzdFtwcm92XToKKyAgICAgICAgICAgICAgICAgICAgcG4gPSBzZWxmLmRhdGFDYWNoZS5wa2dfZm5bZm5dCisgICAgICAgICAgICAgICAgICAgIGlmIHBuIG5vdCBpbiBzZWVuX3BuOgorICAgICAgICAgICAgICAgICAgICAgICAgc2Vlbl9wbi5hcHBlbmQocG4pCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBiYi5mYXRhbCgiTXVsdGlwbGUgdmVyc2lvbnMgb2YgJXMgYXJlIGR1ZSB0byBiZSBidWlsdCAoJXMpLiBPbmx5IG9uZSB2ZXJzaW9uIG9mIGEgZ2l2ZW4gUE4gc2hvdWxkIGJlIGJ1aWx0IGluIGFueSBnaXZlbiBidWlsZC4gWW91IGxpa2VseSBuZWVkIHRvIHNldCBQUkVGRVJSRURfVkVSU0lPTl8lcyB0byBzZWxlY3QgdGhlIGNvcnJlY3QgdmVyc2lvbiBvciBkb24ndCBkZXBlbmQgb24gbXVsdGlwbGUgdmVyc2lvbnMuIiAlIChwbiwgIiAiLmpvaW4ocHJvdl9saXN0W3Byb3ZdKSwgcG4pKQorICAgICAgICAgICAgICAgIG1zZyA9ICJNdWx0aXBsZSAuYmIgZmlsZXMgYXJlIGR1ZSB0byBiZSBidWlsdCB3aGljaCBlYWNoIHByb3ZpZGUgJXMgKCVzKS4iICUgKHByb3YsICIgIi5qb2luKHByb3ZfbGlzdFtwcm92XSkpCisgICAgICAgICAgICAgICAgaWYgc2VsZi53YXJuX211bHRpX2JiOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2Fybihtc2cpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbXNnICs9ICJcbiBUaGlzIHVzdWFsbHkgbWVhbnMgb25lIHByb3ZpZGVzIHNvbWV0aGluZyB0aGUgb3RoZXIgZG9lc24ndCBhbmQgc2hvdWxkLiIKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKG1zZykKKworICAgICAgICAjIENyZWF0ZSBhIHdoaXRlbGlzdCB1c2FibGUgYnkgdGhlIHN0YW1wIGNoZWNrcworICAgICAgICBzdGFtcGZud2hpdGVsaXN0ID0gW10KKyAgICAgICAgZm9yIGVudHJ5IGluIHNlbGYuc3RhbXB3aGl0ZWxpc3Quc3BsaXQoKToKKyAgICAgICAgICAgIGVudHJ5aWQgPSBzZWxmLnRhc2tEYXRhLmdldGJ1aWxkX2lkKGVudHJ5KQorICAgICAgICAgICAgaWYgZW50cnlpZCBub3QgaW4gc2VsZi50YXNrRGF0YS5idWlsZF90YXJnZXRzOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBmbmlkID0gc2VsZi50YXNrRGF0YS5idWlsZF90YXJnZXRzW2VudHJ5aWRdWzBdCisgICAgICAgICAgICBmbiA9IHNlbGYudGFza0RhdGEuZm5faW5kZXhbZm5pZF0KKyAgICAgICAgICAgIHN0YW1wZm53aGl0ZWxpc3QuYXBwZW5kKGZuKQorICAgICAgICBzZWxmLnN0YW1wZm53aGl0ZWxpc3QgPSBzdGFtcGZud2hpdGVsaXN0CisKKyAgICAgICAgIyBJdGVyYXRlIG92ZXIgdGhlIHRhc2sgbGlzdCBsb29raW5nIGZvciB0YXNrcyB3aXRoIGEgJ3NldHNjZW5lJyBmdW5jdGlvbgorICAgICAgICBzZWxmLnJ1bnFfc2V0c2NlbmUgPSBbXQorICAgICAgICBpZiBub3Qgc2VsZi5jb29rZXIuY29uZmlndXJhdGlvbi5ub3NldHNjZW5lOgorICAgICAgICAgICAgZm9yIHRhc2sgaW4gcmFuZ2UobGVuKHNlbGYucnVucV9mbmlkKSk6CisgICAgICAgICAgICAgICAgc2V0c2NlbmUgPSB0YXNrRGF0YS5nZXR0YXNrX2lkKHNlbGYudGFza0RhdGEuZm5faW5kZXhbc2VsZi5ydW5xX2ZuaWRbdGFza11dLCBzZWxmLnJ1bnFfdGFza1t0YXNrXSArICJfc2V0c2NlbmUiLCBGYWxzZSkKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2V0c2NlbmU6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgc2VsZi5ydW5xX3NldHNjZW5lLmFwcGVuZCh0YXNrKQorCisgICAgICAgIGRlZiBpbnZhbGlkYXRlX3Rhc2soZm4sIHRhc2tuYW1lLCBlcnJvcl9ub3N0YW1wKToKKyAgICAgICAgICAgIHRhc2tkZXAgPSBzZWxmLmRhdGFDYWNoZS50YXNrX2RlcHNbZm5dCisgICAgICAgICAgICBmbmlkID0gc2VsZi50YXNrRGF0YS5nZXRmbl9pZChmbikKKyAgICAgICAgICAgIGlmIHRhc2tuYW1lIG5vdCBpbiB0YXNrRGF0YS50YXNrc19sb29rdXBbZm5pZF06CisgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIlRhc2sgJXMgZG9lcyBub3QgZXhpc3QsIGludmFsaWRhdGluZyB0aGlzIHRhc2sgd2lsbCBoYXZlIG5vIGVmZmVjdCIgJSB0YXNrbmFtZSkKKyAgICAgICAgICAgIGlmICdub3N0YW1wJyBpbiB0YXNrZGVwIGFuZCB0YXNrbmFtZSBpbiB0YXNrZGVwWydub3N0YW1wJ106CisgICAgICAgICAgICAgICAgaWYgZXJyb3Jfbm9zdGFtcDoKKyAgICAgICAgICAgICAgICAgICAgYmIuZmF0YWwoIlRhc2sgJXMgaXMgbWFya2VkIG5vc3RhbXAsIGNhbm5vdCBpbnZhbGlkYXRlIHRoaXMgdGFzayIgJSB0YXNrbmFtZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBiYi5kZWJ1ZygxLCAiVGFzayAlcyBpcyBtYXJrZWQgbm9zdGFtcCwgY2Fubm90IGludmFsaWRhdGUgdGhpcyB0YXNrIiAlIHRhc2tuYW1lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBsb2dnZXIudmVyYm9zZSgiSW52YWxpZGF0ZSB0YXNrICVzLCAlcyIsIHRhc2tuYW1lLCBmbikKKyAgICAgICAgICAgICAgICBiYi5wYXJzZS5zaWdnZW4uaW52YWxpZGF0ZV90YXNrKHRhc2tuYW1lLCBzZWxmLmRhdGFDYWNoZSwgZm4pCisKKyAgICAgICAgIyBJbnZhbGlkYXRlIHRhc2sgaWYgZm9yY2UgbW9kZSBhY3RpdmUKKyAgICAgICAgaWYgc2VsZi5jb29rZXIuY29uZmlndXJhdGlvbi5mb3JjZToKKyAgICAgICAgICAgIGZvciAoZm4sIHRhcmdldCkgaW4gc2VsZi50YXJnZXRfcGFpcnM6CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZV90YXNrKGZuLCB0YXJnZXQsIEZhbHNlKQorCisgICAgICAgICMgSW52YWxpZGF0ZSB0YXNrIGlmIGludmFsaWRhdGUgbW9kZSBhY3RpdmUKKyAgICAgICAgaWYgc2VsZi5jb29rZXIuY29uZmlndXJhdGlvbi5pbnZhbGlkYXRlX3N0YW1wOgorICAgICAgICAgICAgZm9yIChmbiwgdGFyZ2V0KSBpbiBzZWxmLnRhcmdldF9wYWlyczoKKyAgICAgICAgICAgICAgICBmb3Igc3QgaW4gc2VsZi5jb29rZXIuY29uZmlndXJhdGlvbi5pbnZhbGlkYXRlX3N0YW1wLnNwbGl0KCcsJyk6CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzdC5zdGFydHN3aXRoKCJkb18iKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ID0gImRvXyVzIiAlIHN0CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGVfdGFzayhmbiwgc3QsIFRydWUpCisKKyAgICAgICAgIyBJdGVyYXRlIG92ZXIgdGhlIHRhc2sgbGlzdCBhbmQgY2FsbCBpbnRvIHRoZSBzaWdnZW4gY29kZQorICAgICAgICBkZWFsdHdpdGggPSBzZXQoKQorICAgICAgICB0b2RlYWwgPSBzZXQocmFuZ2UobGVuKHNlbGYucnVucV9mbmlkKSkpCisgICAgICAgIHdoaWxlIGxlbih0b2RlYWwpID4gMDoKKyAgICAgICAgICAgIGZvciB0YXNrIGluIHRvZGVhbC5jb3B5KCk6CisgICAgICAgICAgICAgICAgaWYgbGVuKHNlbGYucnVucV9kZXBlbmRzW3Rhc2tdIC0gZGVhbHR3aXRoKSA9PSAwOgorICAgICAgICAgICAgICAgICAgICBkZWFsdHdpdGguYWRkKHRhc2spCisgICAgICAgICAgICAgICAgICAgIHRvZGVhbC5yZW1vdmUodGFzaykKKyAgICAgICAgICAgICAgICAgICAgcHJvY2RlcCA9IFtdCisgICAgICAgICAgICAgICAgICAgIGZvciBkZXAgaW4gc2VsZi5ydW5xX2RlcGVuZHNbdGFza106CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZGVwLmFwcGVuZChzZWxmLnRhc2tEYXRhLmZuX2luZGV4W3NlbGYucnVucV9mbmlkW2RlcF1dICsgIi4iICsgc2VsZi5ydW5xX3Rhc2tbZGVwXSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5ydW5xX2hhc2hbdGFza10gPSBiYi5wYXJzZS5zaWdnZW4uZ2V0X3Rhc2toYXNoKHNlbGYudGFza0RhdGEuZm5faW5kZXhbc2VsZi5ydW5xX2ZuaWRbdGFza11dLCBzZWxmLnJ1bnFfdGFza1t0YXNrXSwgcHJvY2RlcCwgc2VsZi5kYXRhQ2FjaGUpCisKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLnJ1bnFfZm5pZCkKKworICAgIGRlZiBkdW1wX2RhdGEoc2VsZiwgdGFza1F1ZXVlKToKKyAgICAgICAgIiIiCisgICAgICAgIER1bXAgc29tZSBkZWJ1ZyBpbmZvcm1hdGlvbiBvbiB0aGUgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzCisgICAgICAgICIiIgorICAgICAgICBsb2dnZXIuZGVidWcoMywgInJ1bl90YXNrczoiKQorICAgICAgICBmb3IgdGFzayBpbiB4cmFuZ2UobGVuKHNlbGYucnFkYXRhLnJ1bnFfdGFzaykpOgorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDMsICIgKCVzKSVzIC0gJXM6ICVzICAgRGVwcyAlcyBSZXZEZXBzICVzIiwgdGFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrUXVldWUuZm5faW5kZXhbc2VsZi5ycWRhdGEucnVucV9mbmlkW3Rhc2tdXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJxZGF0YS5ydW5xX3Rhc2tbdGFza10sCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ycWRhdGEucnVucV93ZWlnaHRbdGFza10sCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ycWRhdGEucnVucV9kZXBlbmRzW3Rhc2tdLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucnFkYXRhLnJ1bnFfcmV2ZGVwc1t0YXNrXSkKKworICAgICAgICBsb2dnZXIuZGVidWcoMywgInNvcnRlZF90YXNrczoiKQorICAgICAgICBmb3IgdGFzazEgaW4geHJhbmdlKGxlbihzZWxmLnJxZGF0YS5ydW5xX3Rhc2spKToKKyAgICAgICAgICAgIGlmIHRhc2sxIGluIHNlbGYucHJpb19tYXA6CisgICAgICAgICAgICAgICAgdGFzayA9IHNlbGYucHJpb19tYXBbdGFzazFdCisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDMsICIgKCVzKSVzIC0gJXM6ICVzICAgRGVwcyAlcyBSZXZEZXBzICVzIiwgdGFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tRdWV1ZS5mbl9pbmRleFtzZWxmLnJxZGF0YS5ydW5xX2ZuaWRbdGFza11dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ycWRhdGEucnVucV90YXNrW3Rhc2tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ycWRhdGEucnVucV93ZWlnaHRbdGFza10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJxZGF0YS5ydW5xX2RlcGVuZHNbdGFza10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJxZGF0YS5ydW5xX3JldmRlcHNbdGFza10pCisKK2NsYXNzIFJ1blF1ZXVlOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb29rZXIsIGNmZ0RhdGEsIGRhdGFDYWNoZSwgdGFza0RhdGEsIHRhcmdldHMpOgorCisgICAgICAgIHNlbGYuY29va2VyID0gY29va2VyCisgICAgICAgIHNlbGYuY2ZnRGF0YSA9IGNmZ0RhdGEKKyAgICAgICAgc2VsZi5ycWRhdGEgPSBSdW5RdWV1ZURhdGEoc2VsZiwgY29va2VyLCBjZmdEYXRhLCBkYXRhQ2FjaGUsIHRhc2tEYXRhLCB0YXJnZXRzKQorCisgICAgICAgIHNlbGYuc3RhbXBwb2xpY3kgPSBjZmdEYXRhLmdldFZhcigiQkJfU1RBTVBfUE9MSUNZIiwgVHJ1ZSkgb3IgInBlcmZpbGUiCisgICAgICAgIHNlbGYuaGFzaHZhbGlkYXRlID0gY2ZnRGF0YS5nZXRWYXIoIkJCX0hBU0hDSEVDS19GVU5DVElPTiIsIFRydWUpIG9yIE5vbmUKKyAgICAgICAgc2VsZi5zZXRzY2VuZXZlcmlmeSA9IGNmZ0RhdGEuZ2V0VmFyKCJCQl9TRVRTQ0VORV9WRVJJRllfRlVOQ1RJT04iLCBUcnVlKSBvciBOb25lCisgICAgICAgIHNlbGYuZGVwdmFsaWRhdGUgPSBjZmdEYXRhLmdldFZhcigiQkJfU0VUU0NFTkVfREVQVkFMSUQiLCBUcnVlKSBvciBOb25lCisKKyAgICAgICAgc2VsZi5zdGF0ZSA9IHJ1blF1ZXVlUHJlcGFyZQorCisgICAgICAgICMgRm9yIGRpc2sgc3BhY2UgbW9uaXRvcgorICAgICAgICBzZWxmLmRtID0gbW9uaXRvcmRpc2suZGlza01vbml0b3IoY2ZnRGF0YSkKKworICAgICAgICBzZWxmLnJxZXhlID0gTm9uZQorICAgICAgICBzZWxmLndvcmtlciA9IE5vbmUKKyAgICAgICAgc2VsZi53b3JrZXJwaXBlID0gTm9uZQorICAgICAgICBzZWxmLmZha2V3b3JrZXIgPSBOb25lCisgICAgICAgIHNlbGYuZmFrZXdvcmtlcnBpcGUgPSBOb25lCisKKyAgICBkZWYgX3N0YXJ0X3dvcmtlcihzZWxmLCBmYWtlcm9vdCA9IEZhbHNlLCBycWV4ZWMgPSBOb25lKToKKyAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJTdGFydGluZyBiaXRiYWtlLXdvcmtlciIpCisgICAgICAgIG1hZ2ljID0gImRlY2FmYmFkIgorICAgICAgICBpZiBzZWxmLmNvb2tlci5jb25maWd1cmF0aW9uLnByb2ZpbGU6CisgICAgICAgICAgICBtYWdpYyA9ICJkZWNhZmJhZGJhZCIKKyAgICAgICAgaWYgZmFrZXJvb3Q6CisgICAgICAgICAgICBmYWtlcm9vdGNtZCA9IHNlbGYuY2ZnRGF0YS5nZXRWYXIoIkZBS0VST09UQ01EIiwgVHJ1ZSkKKyAgICAgICAgICAgIGZha2Vyb290ZW52ID0gKHNlbGYuY2ZnRGF0YS5nZXRWYXIoIkZBS0VST09UQkFTRUVOViIsIFRydWUpIG9yICIiKS5zcGxpdCgpCisgICAgICAgICAgICBlbnYgPSBvcy5lbnZpcm9uLmNvcHkoKQorICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gKHZhci5zcGxpdCgnPScpIGZvciB2YXIgaW4gZmFrZXJvb3RlbnYpOgorICAgICAgICAgICAgICAgIGVudltrZXldID0gdmFsdWUKKyAgICAgICAgICAgIHdvcmtlciA9IHN1YnByb2Nlc3MuUG9wZW4oW2Zha2Vyb290Y21kLCAiYml0YmFrZS13b3JrZXIiLCBtYWdpY10sIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwgZW52PWVudikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHdvcmtlciA9IHN1YnByb2Nlc3MuUG9wZW4oWyJiaXRiYWtlLXdvcmtlciIsIG1hZ2ljXSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkaW49c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBiYi51dGlscy5ub25ibG9ja2luZ2ZkKHdvcmtlci5zdGRvdXQpCisgICAgICAgIHdvcmtlcnBpcGUgPSBydW5RdWV1ZVBpcGUod29ya2VyLnN0ZG91dCwgTm9uZSwgc2VsZi5jZmdEYXRhLCBzZWxmLCBycWV4ZWMpCisKKyAgICAgICAgd29ya2VyZGF0YSA9IHsKKyAgICAgICAgICAgICJ0YXNrZGVwcyIgOiBzZWxmLnJxZGF0YS5kYXRhQ2FjaGUudGFza19kZXBzLAorICAgICAgICAgICAgImZha2Vyb290ZW52IiA6IHNlbGYucnFkYXRhLmRhdGFDYWNoZS5mYWtlcm9vdGVudiwKKyAgICAgICAgICAgICJmYWtlcm9vdGRpcnMiIDogc2VsZi5ycWRhdGEuZGF0YUNhY2hlLmZha2Vyb290ZGlycywKKyAgICAgICAgICAgICJmYWtlcm9vdG5vZW52IiA6IHNlbGYucnFkYXRhLmRhdGFDYWNoZS5mYWtlcm9vdG5vZW52LAorICAgICAgICAgICAgInNpZ2RhdGEiIDogYmIucGFyc2Uuc2lnZ2VuLmdldF90YXNrZGF0YSgpLAorICAgICAgICAgICAgInJ1bnFfaGFzaCIgOiBzZWxmLnJxZGF0YS5ydW5xX2hhc2gsCisgICAgICAgICAgICAibG9nZGVmYXVsdGRlYnVnIiA6IGJiLm1zZy5sb2dnZXJEZWZhdWx0RGVidWdMZXZlbCwKKyAgICAgICAgICAgICJsb2dkZWZhdWx0dmVyYm9zZSIgOiBiYi5tc2cubG9nZ2VyRGVmYXVsdFZlcmJvc2UsCisgICAgICAgICAgICAibG9nZGVmYXVsdHZlcmJvc2Vsb2dzIiA6IGJiLm1zZy5sb2dnZXJWZXJib3NlTG9ncywKKyAgICAgICAgICAgICJsb2dkZWZhdWx0ZG9tYWluIiA6IGJiLm1zZy5sb2dnZXJEZWZhdWx0RG9tYWlucywKKyAgICAgICAgICAgICJwcmhvc3QiIDogc2VsZi5jb29rZXIucHJob3N0LAorICAgICAgICAgICAgImJ1aWxkbmFtZSIgOiBzZWxmLmNmZ0RhdGEuZ2V0VmFyKCJCVUlMRE5BTUUiLCBUcnVlKSwKKyAgICAgICAgICAgICJkYXRlIiA6IHNlbGYuY2ZnRGF0YS5nZXRWYXIoIkRBVEUiLCBUcnVlKSwKKyAgICAgICAgICAgICJ0aW1lIiA6IHNlbGYuY2ZnRGF0YS5nZXRWYXIoIlRJTUUiLCBUcnVlKSwKKyAgICAgICAgfQorCisgICAgICAgIHdvcmtlci5zdGRpbi53cml0ZSgiPGNvb2tlcmNvbmZpZz4iICsgcGlja2xlLmR1bXBzKHNlbGYuY29va2VyLmNvbmZpZ3VyYXRpb24pICsgIjwvY29va2VyY29uZmlnPiIpCisgICAgICAgIHdvcmtlci5zdGRpbi53cml0ZSgiPHdvcmtlcmRhdGE+IiArIHBpY2tsZS5kdW1wcyh3b3JrZXJkYXRhKSArICI8L3dvcmtlcmRhdGE+IikKKyAgICAgICAgd29ya2VyLnN0ZGluLmZsdXNoKCkKKworICAgICAgICByZXR1cm4gd29ya2VyLCB3b3JrZXJwaXBlCisKKyAgICBkZWYgX3RlYXJkb3duX3dvcmtlcihzZWxmLCB3b3JrZXIsIHdvcmtlcnBpcGUpOgorICAgICAgICBpZiBub3Qgd29ya2VyOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiVGVhcmRvd24gZm9yIGJpdGJha2Utd29ya2VyIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICB3b3JrZXIuc3RkaW4ud3JpdGUoIjxxdWl0PjwvcXVpdD4iKQorICAgICAgICAgICB3b3JrZXIuc3RkaW4uZmx1c2goKQorICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgcGFzcworICAgICAgICB3aGlsZSB3b3JrZXIucmV0dXJuY29kZSBpcyBOb25lOgorICAgICAgICAgICAgd29ya2VycGlwZS5yZWFkKCkKKyAgICAgICAgICAgIHdvcmtlci5wb2xsKCkKKyAgICAgICAgd2hpbGUgd29ya2VycGlwZS5yZWFkKCk6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICB3b3JrZXJwaXBlLmNsb3NlKCkKKworICAgIGRlZiBzdGFydF93b3JrZXIoc2VsZik6CisgICAgICAgIGlmIHNlbGYud29ya2VyOgorICAgICAgICAgICAgc2VsZi50ZWFyZG93bl93b3JrZXJzKCkKKyAgICAgICAgc2VsZi50ZWFyZG93biA9IEZhbHNlCisgICAgICAgIHNlbGYud29ya2VyLCBzZWxmLndvcmtlcnBpcGUgPSBzZWxmLl9zdGFydF93b3JrZXIoKQorCisgICAgZGVmIHN0YXJ0X2Zha2V3b3JrZXIoc2VsZiwgcnFleGVjKToKKyAgICAgICAgaWYgbm90IHNlbGYuZmFrZXdvcmtlcjoKKyAgICAgICAgICAgIHNlbGYuZmFrZXdvcmtlciwgc2VsZi5mYWtld29ya2VycGlwZSA9IHNlbGYuX3N0YXJ0X3dvcmtlcihUcnVlLCBycWV4ZWMpCisKKyAgICBkZWYgdGVhcmRvd25fd29ya2VycyhzZWxmKToKKyAgICAgICAgc2VsZi50ZWFyZG93biA9IFRydWUKKyAgICAgICAgc2VsZi5fdGVhcmRvd25fd29ya2VyKHNlbGYud29ya2VyLCBzZWxmLndvcmtlcnBpcGUpCisgICAgICAgIHNlbGYud29ya2VyID0gTm9uZQorICAgICAgICBzZWxmLndvcmtlcnBpcGUgPSBOb25lCisgICAgICAgIHNlbGYuX3RlYXJkb3duX3dvcmtlcihzZWxmLmZha2V3b3JrZXIsIHNlbGYuZmFrZXdvcmtlcnBpcGUpCisgICAgICAgIHNlbGYuZmFrZXdvcmtlciA9IE5vbmUKKyAgICAgICAgc2VsZi5mYWtld29ya2VycGlwZSA9IE5vbmUKKworICAgIGRlZiByZWFkX3dvcmtlcnMoc2VsZik6CisgICAgICAgIHNlbGYud29ya2VycGlwZS5yZWFkKCkKKyAgICAgICAgaWYgc2VsZi5mYWtld29ya2VycGlwZToKKyAgICAgICAgICAgIHNlbGYuZmFrZXdvcmtlcnBpcGUucmVhZCgpCisKKyAgICBkZWYgYWN0aXZlX2ZkcyhzZWxmKToKKyAgICAgICAgZmRzID0gW10KKyAgICAgICAgaWYgc2VsZi53b3JrZXJwaXBlOgorICAgICAgICAgICAgZmRzLmFwcGVuZChzZWxmLndvcmtlcnBpcGUuaW5wdXQpCisgICAgICAgIGlmIHNlbGYuZmFrZXdvcmtlcnBpcGU6CisgICAgICAgICAgICBmZHMuYXBwZW5kKHNlbGYuZmFrZXdvcmtlcnBpcGUuaW5wdXQpCisgICAgICAgIHJldHVybiBmZHMKKworICAgIGRlZiBjaGVja19zdGFtcF90YXNrKHNlbGYsIHRhc2ssIHRhc2tuYW1lID0gTm9uZSwgcmVjdXJzZSA9IEZhbHNlLCBjYWNoZSA9IE5vbmUpOgorICAgICAgICBkZWYgZ2V0X3RpbWVzdGFtcChmKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpZiBub3Qgb3MuYWNjZXNzKGYsIG9zLkZfT0spOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgICAgIHJldHVybiBvcy5zdGF0KGYpW3N0YXQuU1RfTVRJTUVdCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICBpZiBzZWxmLnN0YW1wcG9saWN5ID09ICJwZXJmaWxlIjoKKyAgICAgICAgICAgIGZ1bGxkZXB0cmVlID0gRmFsc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZ1bGxkZXB0cmVlID0gVHJ1ZQorICAgICAgICAgICAgc3RhbXB3aGl0ZWxpc3QgPSBbXQorICAgICAgICAgICAgaWYgc2VsZi5zdGFtcHBvbGljeSA9PSAid2hpdGVsaXN0IjoKKyAgICAgICAgICAgICAgICBzdGFtcHdoaXRlbGlzdCA9IHNlbGYucnFkYXRhLnN0YW1wZm53aGl0ZWxpc3QKKworICAgICAgICBmbiA9IHNlbGYucnFkYXRhLnRhc2tEYXRhLmZuX2luZGV4W3NlbGYucnFkYXRhLnJ1bnFfZm5pZFt0YXNrXV0KKyAgICAgICAgaWYgdGFza25hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIHRhc2tuYW1lID0gc2VsZi5ycWRhdGEucnVucV90YXNrW3Rhc2tdCisKKyAgICAgICAgc3RhbXBmaWxlID0gYmIuYnVpbGQuc3RhbXBmaWxlKHRhc2tuYW1lLCBzZWxmLnJxZGF0YS5kYXRhQ2FjaGUsIGZuKQorCisgICAgICAgICMgSWYgdGhlIHN0YW1wIGlzIG1pc3NpbmcsIGl0J3Mgbm90IGN1cnJlbnQKKyAgICAgICAgaWYgbm90IG9zLmFjY2VzcyhzdGFtcGZpbGUsIG9zLkZfT0spOgorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICJTdGFtcGZpbGUgJXMgbm90IGF2YWlsYWJsZSIsIHN0YW1wZmlsZSkKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAjIElmIGl0J3MgYSAnbm9zdGFtcCcgdGFzaywgaXQncyBub3QgY3VycmVudAorICAgICAgICB0YXNrZGVwID0gc2VsZi5ycWRhdGEuZGF0YUNhY2hlLnRhc2tfZGVwc1tmbl0KKyAgICAgICAgaWYgJ25vc3RhbXAnIGluIHRhc2tkZXAgYW5kIHRhc2tuYW1lIGluIHRhc2tkZXBbJ25vc3RhbXAnXToKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygyLCAiJXMuJXMgaXMgbm9zdGFtcFxuIiwgZm4sIHRhc2tuYW1lKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgaWYgdGFza25hbWUgIT0gImRvX3NldHNjZW5lIiBhbmQgdGFza25hbWUuZW5kc3dpdGgoIl9zZXRzY2VuZSIpOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICBpZiBjYWNoZSBpcyBOb25lOgorICAgICAgICAgICAgY2FjaGUgPSB7fQorCisgICAgICAgIGlzY3VycmVudCA9IFRydWUKKyAgICAgICAgdDEgPSBnZXRfdGltZXN0YW1wKHN0YW1wZmlsZSkKKyAgICAgICAgZm9yIGRlcCBpbiBzZWxmLnJxZGF0YS5ydW5xX2RlcGVuZHNbdGFza106CisgICAgICAgICAgICBpZiBpc2N1cnJlbnQ6CisgICAgICAgICAgICAgICAgZm4yID0gc2VsZi5ycWRhdGEudGFza0RhdGEuZm5faW5kZXhbc2VsZi5ycWRhdGEucnVucV9mbmlkW2RlcF1dCisgICAgICAgICAgICAgICAgdGFza25hbWUyID0gc2VsZi5ycWRhdGEucnVucV90YXNrW2RlcF0KKyAgICAgICAgICAgICAgICBzdGFtcGZpbGUyID0gYmIuYnVpbGQuc3RhbXBmaWxlKHRhc2tuYW1lMiwgc2VsZi5ycWRhdGEuZGF0YUNhY2hlLCBmbjIpCisgICAgICAgICAgICAgICAgc3RhbXBmaWxlMyA9IGJiLmJ1aWxkLnN0YW1wZmlsZSh0YXNrbmFtZTIgKyAiX3NldHNjZW5lIiwgc2VsZi5ycWRhdGEuZGF0YUNhY2hlLCBmbjIpCisgICAgICAgICAgICAgICAgdDIgPSBnZXRfdGltZXN0YW1wKHN0YW1wZmlsZTIpCisgICAgICAgICAgICAgICAgdDMgPSBnZXRfdGltZXN0YW1wKHN0YW1wZmlsZTMpCisgICAgICAgICAgICAgICAgaWYgdDMgYW5kIHQzID4gdDI6CisgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiBmbiA9PSBmbjIgb3IgKGZ1bGxkZXB0cmVlIGFuZCBmbjIgbm90IGluIHN0YW1wd2hpdGVsaXN0KToKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHQyOgorICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICdTdGFtcGZpbGUgJXMgZG9lcyBub3QgZXhpc3QnLCBzdGFtcGZpbGUyKQorICAgICAgICAgICAgICAgICAgICAgICAgaXNjdXJyZW50ID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgaWYgdDEgPCB0MjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygyLCAnU3RhbXBmaWxlICVzIDwgJXMnLCBzdGFtcGZpbGUsIHN0YW1wZmlsZTIpCisgICAgICAgICAgICAgICAgICAgICAgICBpc2N1cnJlbnQgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICBpZiByZWN1cnNlIGFuZCBpc2N1cnJlbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBkZXAgaW4gY2FjaGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNjdXJyZW50ID0gY2FjaGVbZGVwXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBpc2N1cnJlbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygyLCAnU3RhbXBmaWxlIGZvciBkZXBlbmRlbmN5ICVzOiVzIGludmFsaWQgKGNhY2hlZCknICUgKGZuMiwgdGFza25hbWUyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNjdXJyZW50ID0gc2VsZi5jaGVja19zdGFtcF90YXNrKGRlcCwgcmVjdXJzZT1UcnVlLCBjYWNoZT1jYWNoZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZVtkZXBdID0gaXNjdXJyZW50CisgICAgICAgIGlmIHJlY3Vyc2U6CisgICAgICAgICAgICBjYWNoZVt0YXNrXSA9IGlzY3VycmVudAorICAgICAgICByZXR1cm4gaXNjdXJyZW50CisKKyAgICBkZWYgX2V4ZWN1dGVfcnVucXVldWUoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBSdW4gdGhlIHRhc2tzIGluIGEgcXVldWUgcHJlcGFyZWQgYnkgcnFkYXRhLnByZXBhcmUoKQorICAgICAgICBVcG9uIGZhaWx1cmUsIG9wdGlvbmFsbHkgdHJ5IHRvIHJlY292ZXIgdGhlIGJ1aWxkIHVzaW5nIGFueSBhbHRlcm5hdGUgcHJvdmlkZXJzCisgICAgICAgIChpZiB0aGUgYWJvcnQgb24gZmFpbHVyZSBjb25maWd1cmF0aW9uIG9wdGlvbiBpc24ndCBzZXQpCisgICAgICAgICIiIgorCisgICAgICAgIHJldHZhbCA9IFRydWUKKworICAgICAgICBpZiBzZWxmLnN0YXRlIGlzIHJ1blF1ZXVlUHJlcGFyZToKKyAgICAgICAgICAgIHNlbGYucnFleGUgPSBSdW5RdWV1ZUV4ZWN1dGVEdW1teShzZWxmKQorICAgICAgICAgICAgaWYgc2VsZi5ycWRhdGEucHJlcGFyZSgpID09IDA6CisgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHJ1blF1ZXVlQ29tcGxldGUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHJ1blF1ZXVlU2NlbmVJbml0CisKKyAgICAgICAgICAgICAgICAjIHdlIGFyZSByZWFkeSB0byBydW4sIHNlZSBpZiBhbnkgVUkgY2xpZW50IG5lZWRzIHRoZSBkZXBlbmRlbmN5IGluZm8KKyAgICAgICAgICAgICAgICBpZiBiYi5jb29rZXIuQ29va2VyRmVhdHVyZXMuU0VORF9ERVBFTkRTX1RSRUUgaW4gc2VsZi5jb29rZXIuZmVhdHVyZXNldDoKKyAgICAgICAgICAgICAgICAgICAgZGVwZ3JhcGggPSBzZWxmLmNvb2tlci5idWlsZERlcGVuZFRyZWUoc2VsZiwgc2VsZi5ycWRhdGEudGFza0RhdGEpCisgICAgICAgICAgICAgICAgICAgIGJiLmV2ZW50LmZpcmUoYmIuZXZlbnQuRGVwVHJlZUdlbmVyYXRlZChkZXBncmFwaCksIHNlbGYuY29va2VyLmRhdGEpCisKKyAgICAgICAgaWYgc2VsZi5zdGF0ZSBpcyBydW5RdWV1ZVNjZW5lSW5pdDoKKyAgICAgICAgICAgIGR1bXAgPSBzZWxmLmNvb2tlci5jb25maWd1cmF0aW9uLmR1bXBfc2lnbmF0dXJlcworICAgICAgICAgICAgaWYgZHVtcDoKKyAgICAgICAgICAgICAgICBpZiAncHJpbnRkaWZmJyBpbiBkdW1wOgorICAgICAgICAgICAgICAgICAgICBpbnZhbGlkdGFza3MgPSBzZWxmLnByaW50X2RpZmZzY2VuZXRhc2tzKCkKKyAgICAgICAgICAgICAgICBzZWxmLmR1bXBfc2lnbmF0dXJlcyhkdW1wKQorICAgICAgICAgICAgICAgIGlmICdwcmludGRpZmYnIGluIGR1bXA6CisgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfZGlmZnNjZW5ldGFza3MoaW52YWxpZHRhc2tzKQorICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBydW5RdWV1ZUNvbXBsZXRlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuc3RhcnRfd29ya2VyKCkKKyAgICAgICAgICAgICAgICBzZWxmLnJxZXhlID0gUnVuUXVldWVFeGVjdXRlU2NlbmVxdWV1ZShzZWxmKQorCisgICAgICAgIGlmIHNlbGYuc3RhdGUgaW4gW3J1blF1ZXVlU2NlbmVSdW4sIHJ1blF1ZXVlUnVubmluZywgcnVuUXVldWVDbGVhblVwXToKKyAgICAgICAgICAgIHNlbGYuZG0uY2hlY2soc2VsZikKKworICAgICAgICBpZiBzZWxmLnN0YXRlIGlzIHJ1blF1ZXVlU2NlbmVSdW46CisgICAgICAgICAgICByZXR2YWwgPSBzZWxmLnJxZXhlLmV4ZWN1dGUoKQorCisgICAgICAgIGlmIHNlbGYuc3RhdGUgaXMgcnVuUXVldWVSdW5Jbml0OgorICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkV4ZWN1dGluZyBSdW5RdWV1ZSBUYXNrcyIpCisgICAgICAgICAgICBzZWxmLnJxZXhlID0gUnVuUXVldWVFeGVjdXRlVGFza3Moc2VsZikKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBydW5RdWV1ZVJ1bm5pbmcKKworICAgICAgICBpZiBzZWxmLnN0YXRlIGlzIHJ1blF1ZXVlUnVubmluZzoKKyAgICAgICAgICAgIHJldHZhbCA9IHNlbGYucnFleGUuZXhlY3V0ZSgpCisKKyAgICAgICAgaWYgc2VsZi5zdGF0ZSBpcyBydW5RdWV1ZUNsZWFuVXA6CisgICAgICAgICAgICByZXR2YWwgPSBzZWxmLnJxZXhlLmZpbmlzaCgpCisKKyAgICAgICAgaWYgKHNlbGYuc3RhdGUgaXMgcnVuUXVldWVDb21wbGV0ZSBvciBzZWxmLnN0YXRlIGlzIHJ1blF1ZXVlRmFpbGVkKSBhbmQgc2VsZi5ycWV4ZToKKyAgICAgICAgICAgIHNlbGYudGVhcmRvd25fd29ya2VycygpCisgICAgICAgICAgICBpZiBzZWxmLnJxZXhlLnN0YXRzLmZhaWxlZDoKKyAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiVGFza3MgU3VtbWFyeTogQXR0ZW1wdGVkICVkIHRhc2tzIG9mIHdoaWNoICVkIGRpZG4ndCBuZWVkIHRvIGJlIHJlcnVuIGFuZCAlZCBmYWlsZWQuIiwgc2VsZi5ycWV4ZS5zdGF0cy5jb21wbGV0ZWQgKyBzZWxmLnJxZXhlLnN0YXRzLmZhaWxlZCwgc2VsZi5ycWV4ZS5zdGF0cy5za2lwcGVkLCBzZWxmLnJxZXhlLnN0YXRzLmZhaWxlZCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBMZXQncyBhdm9pZCB0aGUgd29yZCAiZmFpbGVkIiBpZiBub3RoaW5nIGFjdHVhbGx5IGRpZAorICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJUYXNrcyBTdW1tYXJ5OiBBdHRlbXB0ZWQgJWQgdGFza3Mgb2Ygd2hpY2ggJWQgZGlkbid0IG5lZWQgdG8gYmUgcmVydW4gYW5kIGFsbCBzdWNjZWVkZWQuIiwgc2VsZi5ycWV4ZS5zdGF0cy5jb21wbGV0ZWQsIHNlbGYucnFleGUuc3RhdHMuc2tpcHBlZCkKKworICAgICAgICBpZiBzZWxmLnN0YXRlIGlzIHJ1blF1ZXVlRmFpbGVkOgorICAgICAgICAgICAgaWYgbm90IHNlbGYucnFkYXRhLnRhc2tEYXRhLnRyeWFsdGNvbmZpZ3M6CisgICAgICAgICAgICAgICAgcmFpc2UgYmIucnVucXVldWUuVGFza0ZhaWx1cmUoc2VsZi5ycWV4ZS5mYWlsZWRfZm5pZHMpCisgICAgICAgICAgICBmb3IgZm5pZCBpbiBzZWxmLnJxZXhlLmZhaWxlZF9mbmlkczoKKyAgICAgICAgICAgICAgICBzZWxmLnJxZGF0YS50YXNrRGF0YS5mYWlsX2ZuaWQoZm5pZCkKKyAgICAgICAgICAgIHNlbGYucnFkYXRhLnJlc2V0KCkKKworICAgICAgICBpZiBzZWxmLnN0YXRlIGlzIHJ1blF1ZXVlQ29tcGxldGU6CisgICAgICAgICAgICAjIEFsbCBkb25lCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICAjIExvb3AKKyAgICAgICAgcmV0dXJuIHJldHZhbAorCisgICAgZGVmIGV4ZWN1dGVfcnVucXVldWUoc2VsZik6CisgICAgICAgICMgQ2F0Y2ggdW5leHBlY3RlZCBleGNlcHRpb25zIGFuZCBlbnN1cmUgd2UgZXhpdCB3aGVuIGFuIGVycm9yIG9jY3Vycywgbm90IGxvb3AuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9leGVjdXRlX3J1bnF1ZXVlKCkKKyAgICAgICAgZXhjZXB0IGJiLnJ1bnF1ZXVlLlRhc2tGYWlsdXJlOgorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZXhjZXB0IFN5c3RlbUV4aXQ6CisgICAgICAgICAgICByYWlzZQorICAgICAgICBleGNlcHQgYmIuQkJIYW5kbGVkRXhjZXB0aW9uOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYudGVhcmRvd25fd29ya2VycygpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHJ1blF1ZXVlQ29tcGxldGUKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiQW4gdW5jYXVnaHQgZXhjZXB0aW9uIG9jY3VyZWQgaW4gcnVucXVldWUsIHBsZWFzZSBzZWUgdGhlIGZhaWx1cmUgYmVsb3c6IikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLnRlYXJkb3duX3dvcmtlcnMoKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBydW5RdWV1ZUNvbXBsZXRlCisgICAgICAgICAgICByYWlzZQorCisgICAgZGVmIGZpbmlzaF9ydW5xdWV1ZShzZWxmLCBub3cgPSBGYWxzZSk6CisgICAgICAgIGlmIG5vdCBzZWxmLnJxZXhlOgorICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHJ1blF1ZXVlQ29tcGxldGUKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIG5vdzoKKyAgICAgICAgICAgIHNlbGYucnFleGUuZmluaXNoX25vdygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnJxZXhlLmZpbmlzaCgpCisKKyAgICBkZWYgZHVtcF9zaWduYXR1cmVzKHNlbGYsIG9wdGlvbnMpOgorICAgICAgICBkb25lID0gc2V0KCkKKyAgICAgICAgYmIubm90ZSgiUmVwYXJzaW5nIGZpbGVzIHRvIGNvbGxlY3QgZGVwZW5kZW5jeSBkYXRhIikKKyAgICAgICAgZm9yIHRhc2sgaW4gcmFuZ2UobGVuKHNlbGYucnFkYXRhLnJ1bnFfZm5pZCkpOgorICAgICAgICAgICAgaWYgc2VsZi5ycWRhdGEucnVucV9mbmlkW3Rhc2tdIG5vdCBpbiBkb25lOgorICAgICAgICAgICAgICAgIGZuID0gc2VsZi5ycWRhdGEudGFza0RhdGEuZm5faW5kZXhbc2VsZi5ycWRhdGEucnVucV9mbmlkW3Rhc2tdXQorICAgICAgICAgICAgICAgIHRoZV9kYXRhID0gYmIuY2FjaGUuQ2FjaGUubG9hZERhdGFGdWxsKGZuLCBzZWxmLmNvb2tlci5jb2xsZWN0aW9uLmdldF9maWxlX2FwcGVuZHMoZm4pLCBzZWxmLmNvb2tlci5kYXRhKQorICAgICAgICAgICAgICAgIGRvbmUuYWRkKHNlbGYucnFkYXRhLnJ1bnFfZm5pZFt0YXNrXSkKKworICAgICAgICBiYi5wYXJzZS5zaWdnZW4uZHVtcF9zaWdzKHNlbGYucnFkYXRhLmRhdGFDYWNoZSwgb3B0aW9ucykKKworICAgICAgICByZXR1cm4KKworICAgIGRlZiBwcmludF9kaWZmc2NlbmV0YXNrcyhzZWxmKToKKworICAgICAgICB2YWxpZCA9IFtdCisgICAgICAgIHNxX2hhc2ggPSBbXQorICAgICAgICBzcV9oYXNoZm4gPSBbXQorICAgICAgICBzcV9mbiA9IFtdCisgICAgICAgIHNxX3Rhc2tuYW1lID0gW10KKyAgICAgICAgc3FfdGFzayA9IFtdCisgICAgICAgIG5vZXhlYyA9IFtdCisgICAgICAgIHN0YW1wcHJlc2VudCA9IFtdCisgICAgICAgIHZhbGlkX25ldyA9IHNldCgpCisKKyAgICAgICAgZm9yIHRhc2sgaW4geHJhbmdlKGxlbihzZWxmLnJxZGF0YS5ydW5xX2ZuaWQpKToKKyAgICAgICAgICAgIGZuID0gc2VsZi5ycWRhdGEudGFza0RhdGEuZm5faW5kZXhbc2VsZi5ycWRhdGEucnVucV9mbmlkW3Rhc2tdXQorICAgICAgICAgICAgdGFza25hbWUgPSBzZWxmLnJxZGF0YS5ydW5xX3Rhc2tbdGFza10KKyAgICAgICAgICAgIHRhc2tkZXAgPSBzZWxmLnJxZGF0YS5kYXRhQ2FjaGUudGFza19kZXBzW2ZuXQorCisgICAgICAgICAgICBpZiAnbm9leGVjJyBpbiB0YXNrZGVwIGFuZCB0YXNrbmFtZSBpbiB0YXNrZGVwWydub2V4ZWMnXToKKyAgICAgICAgICAgICAgICBub2V4ZWMuYXBwZW5kKHRhc2spCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgc3FfZm4uYXBwZW5kKGZuKQorICAgICAgICAgICAgc3FfaGFzaGZuLmFwcGVuZChzZWxmLnJxZGF0YS5kYXRhQ2FjaGUuaGFzaGZuW2ZuXSkKKyAgICAgICAgICAgIHNxX2hhc2guYXBwZW5kKHNlbGYucnFkYXRhLnJ1bnFfaGFzaFt0YXNrXSkKKyAgICAgICAgICAgIHNxX3Rhc2tuYW1lLmFwcGVuZCh0YXNrbmFtZSkKKyAgICAgICAgICAgIHNxX3Rhc2suYXBwZW5kKHRhc2spCisgICAgICAgIGxvY3MgPSB7ICJzcV9mbiIgOiBzcV9mbiwgInNxX3Rhc2siIDogc3FfdGFza25hbWUsICJzcV9oYXNoIiA6IHNxX2hhc2gsICJzcV9oYXNoZm4iIDogc3FfaGFzaGZuLCAiZCIgOiBzZWxmLmNvb2tlci5leHBhbmRlZF9kYXRhIH0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2FsbCA9IHNlbGYuaGFzaHZhbGlkYXRlICsgIihzcV9mbiwgc3FfdGFzaywgc3FfaGFzaCwgc3FfaGFzaGZuLCBkLCBzaWdpbmZvPVRydWUpIgorICAgICAgICAgICAgdmFsaWQgPSBiYi51dGlscy5iZXR0ZXJfZXZhbChjYWxsLCBsb2NzKQorICAgICAgICAjIEhhbmRsZSB2ZXJzaW9uIHdpdGggbm8gc2lnaW5mbyBwYXJhbWV0ZXIKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIGNhbGwgPSBzZWxmLmhhc2h2YWxpZGF0ZSArICIoc3FfZm4sIHNxX3Rhc2ssIHNxX2hhc2gsIHNxX2hhc2hmbiwgZCkiCisgICAgICAgICAgICB2YWxpZCA9IGJiLnV0aWxzLmJldHRlcl9ldmFsKGNhbGwsIGxvY3MpCisgICAgICAgIGZvciB2IGluIHZhbGlkOgorICAgICAgICAgICAgdmFsaWRfbmV3LmFkZChzcV90YXNrW3ZdKQorCisgICAgICAgICMgVGFza3Mgd2hpY2ggYXJlIGJvdGggc2V0c2NlbmUgYW5kIG5vZXhlYyBuZXZlciBjYXJlIGFib3V0IGRlcGVuZGVuY2llcworICAgICAgICAjIFdlIHRoZXJlZm9yZSBmaW5kIHRhc2tzIHdoaWNoIGFyZSBzZXRzY2VuZSBhbmQgbm9leGVjIGFuZCBtYXJrIHRoZWlyCisgICAgICAgICMgdW5pcXVlIGRlcGVuZGVuY2llcyBhcyB2YWxpZC4KKyAgICAgICAgZm9yIHRhc2sgaW4gbm9leGVjOgorICAgICAgICAgICAgaWYgdGFzayBub3QgaW4gc2VsZi5ycWRhdGEucnVucV9zZXRzY2VuZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZm9yIGRlcCBpbiBzZWxmLnJxZGF0YS5ydW5xX2RlcGVuZHNbdGFza106CisgICAgICAgICAgICAgICAgaGFzbm9leGVjcGFyZW50cyA9IFRydWUKKyAgICAgICAgICAgICAgICBmb3IgZGVwMiBpbiBzZWxmLnJxZGF0YS5ydW5xX3JldmRlcHNbZGVwXToKKyAgICAgICAgICAgICAgICAgICAgaWYgZGVwMiBpbiBzZWxmLnJxZGF0YS5ydW5xX3NldHNjZW5lIGFuZCBkZXAyIGluIG5vZXhlYzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGhhc25vZXhlY3BhcmVudHMgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGlmIGhhc25vZXhlY3BhcmVudHM6CisgICAgICAgICAgICAgICAgICAgIHZhbGlkX25ldy5hZGQoZGVwKQorCisgICAgICAgIGludmFsaWR0YXNrcyA9IHNldCgpCisgICAgICAgIGZvciB0YXNrIGluIHhyYW5nZShsZW4oc2VsZi5ycWRhdGEucnVucV9mbmlkKSk6CisgICAgICAgICAgICBpZiB0YXNrIG5vdCBpbiB2YWxpZF9uZXcgYW5kIHRhc2sgbm90IGluIG5vZXhlYzoKKyAgICAgICAgICAgICAgICBpbnZhbGlkdGFza3MuYWRkKHRhc2spCisKKyAgICAgICAgZm91bmQgPSBzZXQoKQorICAgICAgICBwcm9jZXNzZWQgPSBzZXQoKQorICAgICAgICBmb3IgdGFzayBpbiBpbnZhbGlkdGFza3M6CisgICAgICAgICAgICB0b3Byb2Nlc3MgPSBzZXQoW3Rhc2tdKQorICAgICAgICAgICAgd2hpbGUgdG9wcm9jZXNzOgorICAgICAgICAgICAgICAgIG5leHQgPSBzZXQoKQorICAgICAgICAgICAgICAgIGZvciB0IGluIHRvcHJvY2VzczoKKyAgICAgICAgICAgICAgICAgICAgZm9yIGRlcCBpbiBzZWxmLnJxZGF0YS5ydW5xX2RlcGVuZHNbdF06CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBkZXAgaW4gaW52YWxpZHRhc2tzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kLmFkZCh0YXNrKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZGVwIG5vdCBpbiBwcm9jZXNzZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkLmFkZChkZXApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC5hZGQoZGVwKQorICAgICAgICAgICAgICAgIHRvcHJvY2VzcyA9IG5leHQKKyAgICAgICAgICAgICAgICBpZiB0YXNrIGluIGZvdW5kOgorICAgICAgICAgICAgICAgICAgICB0b3Byb2Nlc3MgPSBzZXQoKQorCisgICAgICAgIHRhc2tsaXN0ID0gW10KKyAgICAgICAgZm9yIHRhc2sgaW4gaW52YWxpZHRhc2tzLmRpZmZlcmVuY2UoZm91bmQpOgorICAgICAgICAgICAgdGFza2xpc3QuYXBwZW5kKHNlbGYucnFkYXRhLmdldF91c2VyX2lkc3RyaW5nKHRhc2spKQorCisgICAgICAgIGlmIHRhc2tsaXN0OgorICAgICAgICAgICAgYmIucGxhaW4oIlRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBjdXJyZW50IGJ1aWxkIGFuZCBhbnkgY2FjaGVkIHRhc2tzIHN0YXJ0IGF0IHRoZSBmb2xsb3dpbmcgdGFza3M6XG4iICsgIlxuIi5qb2luKHRhc2tsaXN0KSkKKworICAgICAgICByZXR1cm4gaW52YWxpZHRhc2tzLmRpZmZlcmVuY2UoZm91bmQpCisKKyAgICBkZWYgd3JpdGVfZGlmZnNjZW5ldGFza3Moc2VsZiwgaW52YWxpZHRhc2tzKToKKworICAgICAgICAjIERlZmluZSByZWN1cnNpb24gY2FsbGJhY2sKKyAgICAgICAgZGVmIHJlY3Vyc2VjYihrZXksIGhhc2gxLCBoYXNoMik6CisgICAgICAgICAgICBoYXNoZXMgPSBbaGFzaDEsIGhhc2gyXQorICAgICAgICAgICAgaGFzaGZpbGVzID0gYmIuc2lnZ2VuLmZpbmRfc2lnaW5mbyhrZXksIE5vbmUsIGhhc2hlcywgc2VsZi5jZmdEYXRhKQorCisgICAgICAgICAgICByZWNvdXQgPSBbXQorICAgICAgICAgICAgaWYgbGVuKGhhc2hmaWxlcykgPT0gMjoKKyAgICAgICAgICAgICAgICBvdXQyID0gYmIuc2lnZ2VuLmNvbXBhcmVfc2lnZmlsZXMoaGFzaGZpbGVzW2hhc2gxXSwgaGFzaGZpbGVzW2hhc2gyXSwgcmVjdXJzZWNiKQorICAgICAgICAgICAgICAgIHJlY291dC5leHRlbmQobGlzdCgnICAnICsgbCBmb3IgbCBpbiBvdXQyKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmVjb3V0LmFwcGVuZCgiVW5hYmxlIHRvIGZpbmQgbWF0Y2hpbmcgc2lnZGF0YSBmb3IgJXMgd2l0aCBoYXNoZXMgJXMgb3IgJXMiICUgKGtleSwgaGFzaDEsIGhhc2gyKSkKKworICAgICAgICAgICAgcmV0dXJuIHJlY291dAorCisKKyAgICAgICAgZm9yIHRhc2sgaW4gaW52YWxpZHRhc2tzOgorICAgICAgICAgICAgZm4gPSBzZWxmLnJxZGF0YS50YXNrRGF0YS5mbl9pbmRleFtzZWxmLnJxZGF0YS5ydW5xX2ZuaWRbdGFza11dCisgICAgICAgICAgICBwbiA9IHNlbGYucnFkYXRhLmRhdGFDYWNoZS5wa2dfZm5bZm5dCisgICAgICAgICAgICB0YXNrbmFtZSA9IHNlbGYucnFkYXRhLnJ1bnFfdGFza1t0YXNrXQorICAgICAgICAgICAgaCA9IHNlbGYucnFkYXRhLnJ1bnFfaGFzaFt0YXNrXQorICAgICAgICAgICAgbWF0Y2hlcyA9IGJiLnNpZ2dlbi5maW5kX3NpZ2luZm8ocG4sIHRhc2tuYW1lLCBbXSwgc2VsZi5jZmdEYXRhKQorICAgICAgICAgICAgbWF0Y2ggPSBOb25lCisgICAgICAgICAgICBmb3IgbSBpbiBtYXRjaGVzOgorICAgICAgICAgICAgICAgIGlmIGggaW4gbToKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBtCisgICAgICAgICAgICBpZiBtYXRjaCBpcyBOb25lOgorICAgICAgICAgICAgICAgIGJiLmZhdGFsKCJDYW4ndCBmaW5kIGEgdGFzayB3ZSdyZSBzdXBwb3NlZCB0byBoYXZlIHdyaXR0ZW4gb3V0PyAoaGFzaDogJXMpPyIgJSBoKQorICAgICAgICAgICAgbWF0Y2hlcyA9IHtrIDogdiBmb3IgaywgdiBpbiBtYXRjaGVzLml0ZXJpdGVtcygpIGlmIGggbm90IGluIGt9CisgICAgICAgICAgICBpZiBtYXRjaGVzOgorICAgICAgICAgICAgICAgIGxhdGVzdG1hdGNoID0gc29ydGVkKG1hdGNoZXMua2V5cygpLCBrZXk9bGFtYmRhIGY6IG1hdGNoZXNbZl0pWy0xXQorICAgICAgICAgICAgICAgIHByZXZoID0gX19maW5kX21kNV9fLnNlYXJjaChsYXRlc3RtYXRjaCkuZ3JvdXAoMCkKKyAgICAgICAgICAgICAgICBvdXRwdXQgPSBiYi5zaWdnZW4uY29tcGFyZV9zaWdmaWxlcyhsYXRlc3RtYXRjaCwgbWF0Y2gsIHJlY3Vyc2VjYikKKyAgICAgICAgICAgICAgICBiYi5wbGFpbigiXG5UYXNrICVzOiVzIGNvdWxkbid0IGJlIHVzZWQgZnJvbSB0aGUgY2FjaGUgYmVjYXVzZTpcbiAgV2UgbmVlZCBoYXNoICVzLCBjbG9zZXN0IG1hdGNoaW5nIHRhc2sgd2FzICVzXG4gICIgJSAocG4sIHRhc2tuYW1lLCBoLCBwcmV2aCkgKyAnXG4gICcuam9pbihvdXRwdXQpKQorCitjbGFzcyBSdW5RdWV1ZUV4ZWN1dGU6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcnEpOgorICAgICAgICBzZWxmLnJxID0gcnEKKyAgICAgICAgc2VsZi5jb29rZXIgPSBycS5jb29rZXIKKyAgICAgICAgc2VsZi5jZmdEYXRhID0gcnEuY2ZnRGF0YQorICAgICAgICBzZWxmLnJxZGF0YSA9IHJxLnJxZGF0YQorCisgICAgICAgIHNlbGYubnVtYmVyX3Rhc2tzID0gaW50KHNlbGYuY2ZnRGF0YS5nZXRWYXIoIkJCX05VTUJFUl9USFJFQURTIiwgVHJ1ZSkgb3IgMSkKKyAgICAgICAgc2VsZi5zY2hlZHVsZXIgPSBzZWxmLmNmZ0RhdGEuZ2V0VmFyKCJCQl9TQ0hFRFVMRVIiLCBUcnVlKSBvciAic3BlZWQiCisKKyAgICAgICAgc2VsZi5ydW5xX2J1aWxkYWJsZSA9IFtdCisgICAgICAgIHNlbGYucnVucV9ydW5uaW5nID0gW10KKyAgICAgICAgc2VsZi5ydW5xX2NvbXBsZXRlID0gW10KKworICAgICAgICBzZWxmLmJ1aWxkX3N0YW1wcyA9IHt9CisgICAgICAgIHNlbGYuYnVpbGRfc3RhbXBzMiA9IFtdCisgICAgICAgIHNlbGYuZmFpbGVkX2ZuaWRzID0gW10KKworICAgICAgICBzZWxmLnN0YW1wY2FjaGUgPSB7fQorCisgICAgICAgIHJxLndvcmtlcnBpcGUuc2V0cnVucXVldWVleGVjKHNlbGYpCisgICAgICAgIGlmIHJxLmZha2V3b3JrZXJwaXBlOgorICAgICAgICAgICAgcnEuZmFrZXdvcmtlcnBpcGUuc2V0cnVucXVldWVleGVjKHNlbGYpCisKKyAgICAgICAgaWYgc2VsZi5udW1iZXJfdGFza3MgPD0gMDoKKyAgICAgICAgICAgICBiYi5mYXRhbCgiSW52YWxpZCBCQl9OVU1CRVJfVEhSRUFEUyAlcyIgJSBzZWxmLm51bWJlcl90YXNrcykKKworICAgIGRlZiBydW5xdWV1ZV9wcm9jZXNzX3dhaXRwaWQoc2VsZiwgdGFzaywgc3RhdHVzKToKKworICAgICAgICAjIHNlbGYuYnVpbGRfc3RhbXBzW3BpZF0gbWF5IG5vdCBleGlzdCB3aGVuIHVzZSBzaGFyZWQgd29yayBkaXJlY3RvcnkuCisgICAgICAgIGlmIHRhc2sgaW4gc2VsZi5idWlsZF9zdGFtcHM6CisgICAgICAgICAgICBzZWxmLmJ1aWxkX3N0YW1wczIucmVtb3ZlKHNlbGYuYnVpbGRfc3RhbXBzW3Rhc2tdKQorICAgICAgICAgICAgZGVsIHNlbGYuYnVpbGRfc3RhbXBzW3Rhc2tdCisKKyAgICAgICAgaWYgc3RhdHVzICE9IDA6CisgICAgICAgICAgICBzZWxmLnRhc2tfZmFpbCh0YXNrLCBzdGF0dXMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnRhc2tfY29tcGxldGUodGFzaykKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBmaW5pc2hfbm93KHNlbGYpOgorCisgICAgICAgIGZvciB3b3JrZXIgaW4gW3NlbGYucnEud29ya2VyLCBzZWxmLnJxLmZha2V3b3JrZXJdOgorICAgICAgICAgICAgaWYgbm90IHdvcmtlcjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdvcmtlci5zdGRpbi53cml0ZSgiPGZpbmlzaG5vdz48L2ZpbmlzaG5vdz4iKQorICAgICAgICAgICAgICAgIHdvcmtlci5zdGRpbi5mbHVzaCgpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICAjIHdvcmtlciBtdXN0IGhhdmUgZGllZD8KKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgaWYgbGVuKHNlbGYuZmFpbGVkX2ZuaWRzKSAhPSAwOgorICAgICAgICAgICAgc2VsZi5ycS5zdGF0ZSA9IHJ1blF1ZXVlRmFpbGVkCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLnJxLnN0YXRlID0gcnVuUXVldWVDb21wbGV0ZQorICAgICAgICByZXR1cm4KKworICAgIGRlZiBmaW5pc2goc2VsZik6CisgICAgICAgIHNlbGYucnEuc3RhdGUgPSBydW5RdWV1ZUNsZWFuVXAKKworICAgICAgICBpZiBzZWxmLnN0YXRzLmFjdGl2ZSA+IDA6CisgICAgICAgICAgICBiYi5ldmVudC5maXJlKHJ1blF1ZXVlRXhpdFdhaXQoc2VsZi5zdGF0cy5hY3RpdmUpLCBzZWxmLmNmZ0RhdGEpCisgICAgICAgICAgICBzZWxmLnJxLnJlYWRfd29ya2VycygpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5ycS5hY3RpdmVfZmRzKCkKKworICAgICAgICBpZiBsZW4oc2VsZi5mYWlsZWRfZm5pZHMpICE9IDA6CisgICAgICAgICAgICBzZWxmLnJxLnN0YXRlID0gcnVuUXVldWVGYWlsZWQKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgc2VsZi5ycS5zdGF0ZSA9IHJ1blF1ZXVlQ29tcGxldGUKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBjaGVja19kZXBlbmRlbmNpZXMoc2VsZiwgdGFzaywgdGFza2RlcHMsIHNldHNjZW5lID0gRmFsc2UpOgorICAgICAgICBpZiBub3Qgc2VsZi5ycS5kZXB2YWxpZGF0ZToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIHRhc2tkYXRhID0ge30KKyAgICAgICAgdGFza2RlcHMuYWRkKHRhc2spCisgICAgICAgIGZvciBkZXAgaW4gdGFza2RlcHM6CisgICAgICAgICAgICBpZiBzZXRzY2VuZToKKyAgICAgICAgICAgICAgICBkZXBpZCA9IHNlbGYucnFkYXRhLnJ1bnFfc2V0c2NlbmVbZGVwXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkZXBpZCA9IGRlcAorICAgICAgICAgICAgZm4gPSBzZWxmLnJxZGF0YS50YXNrRGF0YS5mbl9pbmRleFtzZWxmLnJxZGF0YS5ydW5xX2ZuaWRbZGVwaWRdXQorICAgICAgICAgICAgcG4gPSBzZWxmLnJxZGF0YS5kYXRhQ2FjaGUucGtnX2ZuW2ZuXQorICAgICAgICAgICAgdGFza25hbWUgPSBzZWxmLnJxZGF0YS5ydW5xX3Rhc2tbZGVwaWRdCisgICAgICAgICAgICB0YXNrZGF0YVtkZXBdID0gW3BuLCB0YXNrbmFtZSwgZm5dCisgICAgICAgIGNhbGwgPSBzZWxmLnJxLmRlcHZhbGlkYXRlICsgIih0YXNrLCB0YXNrZGF0YSwgbm90bmVlZGVkLCBkKSIKKyAgICAgICAgbG9jcyA9IHsgInRhc2siIDogdGFzaywgInRhc2tkYXRhIiA6IHRhc2tkYXRhLCAibm90bmVlZGVkIiA6IHNlbGYuc2NlbmVxdWV1ZV9ub3RuZWVkZWQsICJkIiA6IHNlbGYuY29va2VyLmV4cGFuZGVkX2RhdGEgfQorICAgICAgICB2YWxpZCA9IGJiLnV0aWxzLmJldHRlcl9ldmFsKGNhbGwsIGxvY3MpCisgICAgICAgIHJldHVybiB2YWxpZAorCitjbGFzcyBSdW5RdWV1ZUV4ZWN1dGVEdW1teShSdW5RdWV1ZUV4ZWN1dGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBycSk6CisgICAgICAgIHNlbGYucnEgPSBycQorICAgICAgICBzZWxmLnN0YXRzID0gUnVuUXVldWVTdGF0cygwKQorCisgICAgZGVmIGZpbmlzaChzZWxmKToKKyAgICAgICAgc2VsZi5ycS5zdGF0ZSA9IHJ1blF1ZXVlQ29tcGxldGUKKyAgICAgICAgcmV0dXJuCisKK2NsYXNzIFJ1blF1ZXVlRXhlY3V0ZVRhc2tzKFJ1blF1ZXVlRXhlY3V0ZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJxKToKKyAgICAgICAgUnVuUXVldWVFeGVjdXRlLl9faW5pdF9fKHNlbGYsIHJxKQorCisgICAgICAgIHNlbGYuc3RhdHMgPSBSdW5RdWV1ZVN0YXRzKGxlbihzZWxmLnJxZGF0YS5ydW5xX2ZuaWQpKQorCisgICAgICAgIHNlbGYuc3RhbXBjYWNoZSA9IHt9CisKKyAgICAgICAgaW5pdGlhbF9jb3ZlcmVkID0gc2VsZi5ycS5zY2VuZXF1ZXVlX2NvdmVyZWQuY29weSgpCisKKyAgICAgICAgIyBNYXJrIGluaXRpYWwgYnVpbGRhYmxlIHRhc2tzCisgICAgICAgIGZvciB0YXNrIGluIHhyYW5nZShzZWxmLnN0YXRzLnRvdGFsKToKKyAgICAgICAgICAgIHNlbGYucnVucV9ydW5uaW5nLmFwcGVuZCgwKQorICAgICAgICAgICAgc2VsZi5ydW5xX2NvbXBsZXRlLmFwcGVuZCgwKQorICAgICAgICAgICAgaWYgbGVuKHNlbGYucnFkYXRhLnJ1bnFfZGVwZW5kc1t0YXNrXSkgPT0gMDoKKyAgICAgICAgICAgICAgICBzZWxmLnJ1bnFfYnVpbGRhYmxlLmFwcGVuZCgxKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnJ1bnFfYnVpbGRhYmxlLmFwcGVuZCgwKQorICAgICAgICAgICAgaWYgbGVuKHNlbGYucnFkYXRhLnJ1bnFfcmV2ZGVwc1t0YXNrXSkgPiAwIGFuZCBzZWxmLnJxZGF0YS5ydW5xX3JldmRlcHNbdGFza10uaXNzdWJzZXQoc2VsZi5ycS5zY2VuZXF1ZXVlX2NvdmVyZWQpIGFuZCB0YXNrIG5vdCBpbiBzZWxmLnJxLnNjZW5lcXVldWVfbm90Y292ZXJlZDoKKyAgICAgICAgICAgICAgICBzZWxmLnJxLnNjZW5lcXVldWVfY292ZXJlZC5hZGQodGFzaykKKworICAgICAgICBmb3VuZCA9IFRydWUKKyAgICAgICAgd2hpbGUgZm91bmQ6CisgICAgICAgICAgICBmb3VuZCA9IEZhbHNlCisgICAgICAgICAgICBmb3IgdGFzayBpbiB4cmFuZ2Uoc2VsZi5zdGF0cy50b3RhbCk6CisgICAgICAgICAgICAgICAgaWYgdGFzayBpbiBzZWxmLnJxLnNjZW5lcXVldWVfY292ZXJlZDoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoMSwgJ0NvbnNpZGVyaW5nICVzICglcyk6ICVzJyAlICh0YXNrLCBzZWxmLnJxZGF0YS5nZXRfdXNlcl9pZHN0cmluZyh0YXNrKSwgc3RyKHNlbGYucnFkYXRhLnJ1bnFfcmV2ZGVwc1t0YXNrXSkpKQorCisgICAgICAgICAgICAgICAgaWYgbGVuKHNlbGYucnFkYXRhLnJ1bnFfcmV2ZGVwc1t0YXNrXSkgPiAwIGFuZCBzZWxmLnJxZGF0YS5ydW5xX3JldmRlcHNbdGFza10uaXNzdWJzZXQoc2VsZi5ycS5zY2VuZXF1ZXVlX2NvdmVyZWQpIGFuZCB0YXNrIG5vdCBpbiBzZWxmLnJxLnNjZW5lcXVldWVfbm90Y292ZXJlZDoKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIHNlbGYucnEuc2NlbmVxdWV1ZV9jb3ZlcmVkLmFkZCh0YXNrKQorCisgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAnU2tpcCBsaXN0IChwcmUgc2V0c2NlbmV2ZXJpZnkpICVzJywgc29ydGVkKHNlbGYucnEuc2NlbmVxdWV1ZV9jb3ZlcmVkKSkKKworICAgICAgICAjIEFsbG93IHRoZSBtZXRhZGF0YSB0byBlbGVjdCBmb3Igc2V0c2NlbmUgdGFza3MgdG8gcnVuIGFueXdheQorICAgICAgICBjb3ZlcmVkX3JlbW92ZSA9IHNldCgpCisgICAgICAgIGlmIHNlbGYucnEuc2V0c2NlbmV2ZXJpZnk6CisgICAgICAgICAgICBpbnZhbGlkdGFza3MgPSBbXQorICAgICAgICAgICAgZm9yIHRhc2sgaW4geHJhbmdlKGxlbihzZWxmLnJxZGF0YS5ydW5xX3Rhc2spKToKKyAgICAgICAgICAgICAgICBmbiA9IHNlbGYucnFkYXRhLnRhc2tEYXRhLmZuX2luZGV4W3NlbGYucnFkYXRhLnJ1bnFfZm5pZFt0YXNrXV0KKyAgICAgICAgICAgICAgICB0YXNrbmFtZSA9IHNlbGYucnFkYXRhLnJ1bnFfdGFza1t0YXNrXQorICAgICAgICAgICAgICAgIHRhc2tkZXAgPSBzZWxmLnJxZGF0YS5kYXRhQ2FjaGUudGFza19kZXBzW2ZuXQorCisgICAgICAgICAgICAgICAgaWYgJ25vZXhlYycgaW4gdGFza2RlcCBhbmQgdGFza25hbWUgaW4gdGFza2RlcFsnbm9leGVjJ106CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgc2VsZi5ycS5jaGVja19zdGFtcF90YXNrKHRhc2ssIHRhc2tuYW1lICsgIl9zZXRzY2VuZSIsIGNhY2hlPXNlbGYuc3RhbXBjYWNoZSk6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygyLCAnU2V0c2NlbmUgc3RhbXAgY3VycmVudCBmb3IgdGFzayAlcyglcyknLCB0YXNrLCBzZWxmLnJxZGF0YS5nZXRfdXNlcl9pZHN0cmluZyh0YXNrKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnJxLmNoZWNrX3N0YW1wX3Rhc2sodGFzaywgdGFza25hbWUsIHJlY3Vyc2UgPSBUcnVlLCBjYWNoZT1zZWxmLnN0YW1wY2FjaGUpOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoMiwgJ05vcm1hbCBzdGFtcCBjdXJyZW50IGZvciB0YXNrICVzKCVzKScsIHRhc2ssIHNlbGYucnFkYXRhLmdldF91c2VyX2lkc3RyaW5nKHRhc2spKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGludmFsaWR0YXNrcy5hcHBlbmQodGFzaykKKworICAgICAgICAgICAgY2FsbCA9IHNlbGYucnEuc2V0c2NlbmV2ZXJpZnkgKyAiKGNvdmVyZWQsIHRhc2tuYW1lcywgZm5pZHMsIGZucywgZCwgaW52YWxpZHRhc2tzPWludmFsaWR0YXNrcykiCisgICAgICAgICAgICBjYWxsMiA9IHNlbGYucnEuc2V0c2NlbmV2ZXJpZnkgKyAiKGNvdmVyZWQsIHRhc2tuYW1lcywgZm5pZHMsIGZucywgZCkiCisgICAgICAgICAgICBsb2NzID0geyAiY292ZXJlZCIgOiBzZWxmLnJxLnNjZW5lcXVldWVfY292ZXJlZCwgInRhc2tuYW1lcyIgOiBzZWxmLnJxZGF0YS5ydW5xX3Rhc2ssICJmbmlkcyIgOiBzZWxmLnJxZGF0YS5ydW5xX2ZuaWQsICJmbnMiIDogc2VsZi5ycWRhdGEudGFza0RhdGEuZm5faW5kZXgsICJkIiA6IHNlbGYuY29va2VyLmV4cGFuZGVkX2RhdGEsICJpbnZhbGlkdGFza3MiIDogaW52YWxpZHRhc2tzIH0KKyAgICAgICAgICAgICMgQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciB2ZXJzaW9ucyB3aXRob3V0IGludmFsaWR0YXNrcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNvdmVyZWRfcmVtb3ZlID0gYmIudXRpbHMuYmV0dGVyX2V2YWwoY2FsbCwgbG9jcykKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAgICAgY292ZXJlZF9yZW1vdmUgPSBiYi51dGlscy5iZXR0ZXJfZXZhbChjYWxsMiwgbG9jcykKKworICAgICAgICBkZWYgcmVtb3ZlY292ZXJlZHRhc2sodGFzayk6CisgICAgICAgICAgICBmbiA9IHNlbGYucnFkYXRhLnRhc2tEYXRhLmZuX2luZGV4W3NlbGYucnFkYXRhLnJ1bnFfZm5pZFt0YXNrXV0KKyAgICAgICAgICAgIHRhc2tuYW1lID0gc2VsZi5ycWRhdGEucnVucV90YXNrW3Rhc2tdICsgJ19zZXRzY2VuZScKKyAgICAgICAgICAgIGJiLmJ1aWxkLmRlbF9zdGFtcCh0YXNrbmFtZSwgc2VsZi5ycWRhdGEuZGF0YUNhY2hlLCBmbikKKyAgICAgICAgICAgIHNlbGYucnEuc2NlbmVxdWV1ZV9jb3ZlcmVkLnJlbW92ZSh0YXNrKQorCisgICAgICAgIHRvcmVtb3ZlID0gY292ZXJlZF9yZW1vdmUKKyAgICAgICAgZm9yIHRhc2sgaW4gdG9yZW1vdmU6CisgICAgICAgICAgICBsb2dnZXIuZGVidWcoMSwgJ05vdCBza2lwcGluZyB0YXNrICVzIGR1ZSB0byBzZXRzY2VuZXZlcmlmeScsIHRhc2spCisgICAgICAgIHdoaWxlIHRvcmVtb3ZlOgorICAgICAgICAgICAgY292ZXJlZF9yZW1vdmUgPSBbXQorICAgICAgICAgICAgZm9yIHRhc2sgaW4gdG9yZW1vdmU6CisgICAgICAgICAgICAgICAgcmVtb3ZlY292ZXJlZHRhc2sodGFzaykKKyAgICAgICAgICAgICAgICBmb3IgZGVwdGFzayBpbiBzZWxmLnJxZGF0YS5ydW5xX2RlcGVuZHNbdGFza106CisgICAgICAgICAgICAgICAgICAgIGlmIGRlcHRhc2sgbm90IGluIHNlbGYucnEuc2NlbmVxdWV1ZV9jb3ZlcmVkOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgaWYgZGVwdGFzayBpbiB0b3JlbW92ZSBvciBkZXB0YXNrIGluIGNvdmVyZWRfcmVtb3ZlIG9yIGRlcHRhc2sgaW4gaW5pdGlhbF9jb3ZlcmVkOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICdUYXNrICVzIGRlcGVuZHMgb24gdGFzayAlcyBzbyBub3Qgc2tpcHBpbmcnICUgKHRhc2ssIGRlcHRhc2spKQorICAgICAgICAgICAgICAgICAgICBjb3ZlcmVkX3JlbW92ZS5hcHBlbmQoZGVwdGFzaykKKyAgICAgICAgICAgIHRvcmVtb3ZlID0gY292ZXJlZF9yZW1vdmUKKworICAgICAgICBsb2dnZXIuZGVidWcoMSwgJ0Z1bGwgc2tpcCBsaXN0ICVzJywgc2VsZi5ycS5zY2VuZXF1ZXVlX2NvdmVyZWQpCisKKyAgICAgICAgZXZlbnQuZmlyZShiYi5ldmVudC5TdGFtcFVwZGF0ZShzZWxmLnJxZGF0YS50YXJnZXRfcGFpcnMsIHNlbGYucnFkYXRhLmRhdGFDYWNoZS5zdGFtcCksIHNlbGYuY2ZnRGF0YSkKKworICAgICAgICBzY2hlZHVsZXJzID0gc2VsZi5nZXRfc2NoZWR1bGVycygpCisgICAgICAgIGZvciBzY2hlZHVsZXIgaW4gc2NoZWR1bGVyczoKKyAgICAgICAgICAgIGlmIHNlbGYuc2NoZWR1bGVyID09IHNjaGVkdWxlci5uYW1lOgorICAgICAgICAgICAgICAgIHNlbGYuc2NoZWQgPSBzY2hlZHVsZXIoc2VsZiwgc2VsZi5ycWRhdGEpCisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJVc2luZyBydW5xdWV1ZSBzY2hlZHVsZXIgJyVzJyIsIHNjaGVkdWxlci5uYW1lKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBiYi5mYXRhbCgiSW52YWxpZCBzY2hlZHVsZXIgJyVzJy4gIEF2YWlsYWJsZSBzY2hlZHVsZXJzOiAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgKHNlbGYuc2NoZWR1bGVyLCAiLCAiLmpvaW4ob2JqLm5hbWUgZm9yIG9iaiBpbiBzY2hlZHVsZXJzKSkpCisKKyAgICBkZWYgZ2V0X3NjaGVkdWxlcnMoc2VsZik6CisgICAgICAgIHNjaGVkdWxlcnMgPSBzZXQob2JqIGZvciBvYmogaW4gZ2xvYmFscygpLnZhbHVlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHR5cGUob2JqKSBpcyB0eXBlIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc3N1YmNsYXNzKG9iaiwgUnVuUXVldWVTY2hlZHVsZXIpKQorCisgICAgICAgIHVzZXJfc2NoZWR1bGVycyA9IHNlbGYuY2ZnRGF0YS5nZXRWYXIoIkJCX1NDSEVEVUxFUlMiLCBUcnVlKQorICAgICAgICBpZiB1c2VyX3NjaGVkdWxlcnM6CisgICAgICAgICAgICBmb3Igc2NoZWQgaW4gdXNlcl9zY2hlZHVsZXJzLnNwbGl0KCk6CisgICAgICAgICAgICAgICAgaWYgbm90ICIuIiBpbiBzY2hlZDoKKyAgICAgICAgICAgICAgICAgICAgYmIubm90ZSgiSWdub3Jpbmcgc2NoZWR1bGVyICclcycgZnJvbSBCQl9TQ0hFRFVMRVJTOiBub3QgYW4gaW1wb3J0IiAlIHNjaGVkKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgbW9kbmFtZSwgbmFtZSA9IHNjaGVkLnJzcGxpdCgiLiIsIDEpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBtb2R1bGUgPSBfX2ltcG9ydF9fKG1vZG5hbWUsIGZyb21saXN0PShuYW1lLCkpCisgICAgICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yIGFzIGV4YzoKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmNyaXRpY2FsKCJVbmFibGUgdG8gaW1wb3J0IHNjaGVkdWxlciAnJXMnIGZyb20gJyVzJzogJXMiICUgKG5hbWUsIG1vZG5hbWUsIGV4YykpCisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFN5c3RlbUV4aXQoMSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZXJzLmFkZChnZXRhdHRyKG1vZHVsZSwgbmFtZSkpCisgICAgICAgIHJldHVybiBzY2hlZHVsZXJzCisKKyAgICBkZWYgc2V0YnVpbGRhYmxlKHNlbGYsIHRhc2spOgorICAgICAgICBzZWxmLnJ1bnFfYnVpbGRhYmxlW3Rhc2tdID0gMQorICAgICAgICBzZWxmLnNjaGVkLm5ld2J1aWxhYmxlKHRhc2spCisKKyAgICBkZWYgdGFza19jb21wbGV0ZW91dHJpZ2h0KHNlbGYsIHRhc2spOgorICAgICAgICAiIiIKKyAgICAgICAgTWFyayBhIHRhc2sgYXMgY29tcGxldGVkCisgICAgICAgIExvb2sgYXQgdGhlIHJldmVyc2UgZGVwZW5kZW5jaWVzIGFuZCBtYXJrIGFueSB0YXNrIHdpdGgKKyAgICAgICAgY29tcGxldGVkIGRlcGVuZGVuY2llcyBhcyBidWlsZGFibGUKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYucnVucV9jb21wbGV0ZVt0YXNrXSA9IDEKKyAgICAgICAgZm9yIHJldmRlcCBpbiBzZWxmLnJxZGF0YS5ydW5xX3JldmRlcHNbdGFza106CisgICAgICAgICAgICBpZiBzZWxmLnJ1bnFfcnVubmluZ1tyZXZkZXBdID09IDE6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIHNlbGYucnVucV9idWlsZGFibGVbcmV2ZGVwXSA9PSAxOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBhbGxkZXBzID0gMQorICAgICAgICAgICAgZm9yIGRlcCBpbiBzZWxmLnJxZGF0YS5ydW5xX2RlcGVuZHNbcmV2ZGVwXToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnJ1bnFfY29tcGxldGVbZGVwXSAhPSAxOgorICAgICAgICAgICAgICAgICAgICBhbGxkZXBzID0gMAorICAgICAgICAgICAgaWYgYWxsZGVwcyA9PSAxOgorICAgICAgICAgICAgICAgIHNlbGYuc2V0YnVpbGRhYmxlKHJldmRlcCkKKyAgICAgICAgICAgICAgICBmbiA9IHNlbGYucnFkYXRhLnRhc2tEYXRhLmZuX2luZGV4W3NlbGYucnFkYXRhLnJ1bnFfZm5pZFtyZXZkZXBdXQorICAgICAgICAgICAgICAgIHRhc2tuYW1lID0gc2VsZi5ycWRhdGEucnVucV90YXNrW3JldmRlcF0KKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoMSwgIk1hcmtpbmcgdGFzayAlcyAoJXMsICVzKSBhcyBidWlsZGFibGUiLCByZXZkZXAsIGZuLCB0YXNrbmFtZSkKKworICAgIGRlZiB0YXNrX2NvbXBsZXRlKHNlbGYsIHRhc2spOgorICAgICAgICBzZWxmLnN0YXRzLnRhc2tDb21wbGV0ZWQoKQorICAgICAgICBiYi5ldmVudC5maXJlKHJ1blF1ZXVlVGFza0NvbXBsZXRlZCh0YXNrLCBzZWxmLnN0YXRzLCBzZWxmLnJxKSwgc2VsZi5jZmdEYXRhKQorICAgICAgICBzZWxmLnRhc2tfY29tcGxldGVvdXRyaWdodCh0YXNrKQorCisgICAgZGVmIHRhc2tfZmFpbChzZWxmLCB0YXNrLCBleGl0Y29kZSk6CisgICAgICAgICIiIgorICAgICAgICBDYWxsZWQgd2hlbiBhIHRhc2sgaGFzIGZhaWxlZAorICAgICAgICBVcGRhdGVzIHRoZSBzdGF0ZSBlbmdpbmUgd2l0aCB0aGUgZmFpbHVyZQorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5zdGF0cy50YXNrRmFpbGVkKCkKKyAgICAgICAgZm5pZCA9IHNlbGYucnFkYXRhLnJ1bnFfZm5pZFt0YXNrXQorICAgICAgICBzZWxmLmZhaWxlZF9mbmlkcy5hcHBlbmQoZm5pZCkKKyAgICAgICAgYmIuZXZlbnQuZmlyZShydW5RdWV1ZVRhc2tGYWlsZWQodGFzaywgc2VsZi5zdGF0cywgZXhpdGNvZGUsIHNlbGYucnEpLCBzZWxmLmNmZ0RhdGEpCisgICAgICAgIGlmIHNlbGYucnFkYXRhLnRhc2tEYXRhLmFib3J0OgorICAgICAgICAgICAgc2VsZi5ycS5zdGF0ZSA9IHJ1blF1ZXVlQ2xlYW5VcAorCisgICAgZGVmIHRhc2tfc2tpcChzZWxmLCB0YXNrLCByZWFzb24pOgorICAgICAgICBzZWxmLnJ1bnFfcnVubmluZ1t0YXNrXSA9IDEKKyAgICAgICAgc2VsZi5zZXRidWlsZGFibGUodGFzaykKKyAgICAgICAgYmIuZXZlbnQuZmlyZShydW5RdWV1ZVRhc2tTa2lwcGVkKHRhc2ssIHNlbGYuc3RhdHMsIHNlbGYucnEsIHJlYXNvbiksIHNlbGYuY2ZnRGF0YSkKKyAgICAgICAgc2VsZi50YXNrX2NvbXBsZXRlb3V0cmlnaHQodGFzaykKKyAgICAgICAgc2VsZi5zdGF0cy50YXNrQ29tcGxldGVkKCkKKyAgICAgICAgc2VsZi5zdGF0cy50YXNrU2tpcHBlZCgpCisKKyAgICBkZWYgZXhlY3V0ZShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFJ1biB0aGUgdGFza3MgaW4gYSBxdWV1ZSBwcmVwYXJlZCBieSBycWRhdGEucHJlcGFyZSgpCisgICAgICAgICIiIgorCisgICAgICAgIHNlbGYucnEucmVhZF93b3JrZXJzKCkKKyAgICAgICAgCisKKyAgICAgICAgaWYgc2VsZi5zdGF0cy50b3RhbCA9PSAwOgorICAgICAgICAgICAgIyBub3RoaW5nIHRvIGRvCisgICAgICAgICAgICBzZWxmLnJxLnN0YXRlID0gcnVuUXVldWVDbGVhblVwCisKKyAgICAgICAgdGFzayA9IHNlbGYuc2NoZWQubmV4dCgpCisgICAgICAgIGlmIHRhc2sgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBmbiA9IHNlbGYucnFkYXRhLnRhc2tEYXRhLmZuX2luZGV4W3NlbGYucnFkYXRhLnJ1bnFfZm5pZFt0YXNrXV0KKyAgICAgICAgICAgIHRhc2tuYW1lID0gc2VsZi5ycWRhdGEucnVucV90YXNrW3Rhc2tdCisKKyAgICAgICAgICAgIGlmIHRhc2sgaW4gc2VsZi5ycS5zY2VuZXF1ZXVlX2NvdmVyZWQ6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICJTZXRzY2VuZSBjb3ZlcmVkIHRhc2sgJXMgKCVzKSIsIHRhc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucnFkYXRhLmdldF91c2VyX2lkc3RyaW5nKHRhc2spKQorICAgICAgICAgICAgICAgIHNlbGYudGFza19za2lwKHRhc2ssICJjb3ZlcmVkIikKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgICAgICBpZiBzZWxmLnJxLmNoZWNrX3N0YW1wX3Rhc2sodGFzaywgdGFza25hbWUsIGNhY2hlPXNlbGYuc3RhbXBjYWNoZSk6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICJTdGFtcCBjdXJyZW50IHRhc2sgJXMgKCVzKSIsIHRhc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucnFkYXRhLmdldF91c2VyX2lkc3RyaW5nKHRhc2spKQorICAgICAgICAgICAgICAgIHNlbGYudGFza19za2lwKHRhc2ssICJleGlzdGluZyIpCisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICAgICAgdGFza2RlcCA9IHNlbGYucnFkYXRhLmRhdGFDYWNoZS50YXNrX2RlcHNbZm5dCisgICAgICAgICAgICBpZiAnbm9leGVjJyBpbiB0YXNrZGVwIGFuZCB0YXNrbmFtZSBpbiB0YXNrZGVwWydub2V4ZWMnXToKKyAgICAgICAgICAgICAgICBzdGFydGV2ZW50ID0gcnVuUXVldWVUYXNrU3RhcnRlZCh0YXNrLCBzZWxmLnN0YXRzLCBzZWxmLnJxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZXhlYz1UcnVlKQorICAgICAgICAgICAgICAgIGJiLmV2ZW50LmZpcmUoc3RhcnRldmVudCwgc2VsZi5jZmdEYXRhKQorICAgICAgICAgICAgICAgIHNlbGYucnVucV9ydW5uaW5nW3Rhc2tdID0gMQorICAgICAgICAgICAgICAgIHNlbGYuc3RhdHMudGFza0FjdGl2ZSgpCisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuY29va2VyLmNvbmZpZ3VyYXRpb24uZHJ5X3J1bjoKKyAgICAgICAgICAgICAgICAgICAgYmIuYnVpbGQubWFrZV9zdGFtcCh0YXNrbmFtZSwgc2VsZi5ycWRhdGEuZGF0YUNhY2hlLCBmbikKKyAgICAgICAgICAgICAgICBzZWxmLnRhc2tfY29tcGxldGUodGFzaykKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzdGFydGV2ZW50ID0gcnVuUXVldWVUYXNrU3RhcnRlZCh0YXNrLCBzZWxmLnN0YXRzLCBzZWxmLnJxKQorICAgICAgICAgICAgICAgIGJiLmV2ZW50LmZpcmUoc3RhcnRldmVudCwgc2VsZi5jZmdEYXRhKQorCisgICAgICAgICAgICB0YXNrZGVwZGF0YSA9IHNlbGYuYnVpbGRfdGFza2RlcGRhdGEodGFzaykKKworICAgICAgICAgICAgdGFza2RlcCA9IHNlbGYucnFkYXRhLmRhdGFDYWNoZS50YXNrX2RlcHNbZm5dCisgICAgICAgICAgICBpZiAnZmFrZXJvb3QnIGluIHRhc2tkZXAgYW5kIHRhc2tuYW1lIGluIHRhc2tkZXBbJ2Zha2Vyb290J10gYW5kIG5vdCBzZWxmLmNvb2tlci5jb25maWd1cmF0aW9uLmRyeV9ydW46CisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYucnEuZmFrZXdvcmtlcjoKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ycS5zdGFydF9mYWtld29ya2VyKHNlbGYpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGV4YzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5jcml0aWNhbCgiRmFpbGVkIHRvIHNwYXduIGZha2Vyb290IHdvcmtlciB0byBydW4gJXM6JXM6ICVzIiAlIChmbiwgdGFza25hbWUsIHN0cihleGMpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucnEuc3RhdGUgPSBydW5RdWV1ZUZhaWxlZAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgICAgICBzZWxmLnJxLmZha2V3b3JrZXIuc3RkaW4ud3JpdGUoIjxydW50YXNrPiIgKyBwaWNrbGUuZHVtcHMoKGZuLCB0YXNrLCB0YXNrbmFtZSwgRmFsc2UsIHNlbGYuY29va2VyLmNvbGxlY3Rpb24uZ2V0X2ZpbGVfYXBwZW5kcyhmbiksIHRhc2tkZXBkYXRhKSkgKyAiPC9ydW50YXNrPiIpCisgICAgICAgICAgICAgICAgc2VsZi5ycS5mYWtld29ya2VyLnN0ZGluLmZsdXNoKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5ycS53b3JrZXIuc3RkaW4ud3JpdGUoIjxydW50YXNrPiIgKyBwaWNrbGUuZHVtcHMoKGZuLCB0YXNrLCB0YXNrbmFtZSwgRmFsc2UsIHNlbGYuY29va2VyLmNvbGxlY3Rpb24uZ2V0X2ZpbGVfYXBwZW5kcyhmbiksIHRhc2tkZXBkYXRhKSkgKyAiPC9ydW50YXNrPiIpCisgICAgICAgICAgICAgICAgc2VsZi5ycS53b3JrZXIuc3RkaW4uZmx1c2goKQorCisgICAgICAgICAgICBzZWxmLmJ1aWxkX3N0YW1wc1t0YXNrXSA9IGJiLmJ1aWxkLnN0YW1wZmlsZSh0YXNrbmFtZSwgc2VsZi5ycWRhdGEuZGF0YUNhY2hlLCBmbikKKyAgICAgICAgICAgIHNlbGYuYnVpbGRfc3RhbXBzMi5hcHBlbmQoc2VsZi5idWlsZF9zdGFtcHNbdGFza10pIAorICAgICAgICAgICAgc2VsZi5ydW5xX3J1bm5pbmdbdGFza10gPSAxCisgICAgICAgICAgICBzZWxmLnN0YXRzLnRhc2tBY3RpdmUoKQorICAgICAgICAgICAgaWYgc2VsZi5zdGF0cy5hY3RpdmUgPCBzZWxmLm51bWJlcl90YXNrczoKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgIGlmIHNlbGYuc3RhdHMuYWN0aXZlID4gMDoKKyAgICAgICAgICAgIHNlbGYucnEucmVhZF93b3JrZXJzKCkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnJxLmFjdGl2ZV9mZHMoKQorCisgICAgICAgIGlmIGxlbihzZWxmLmZhaWxlZF9mbmlkcykgIT0gMDoKKyAgICAgICAgICAgIHNlbGYucnEuc3RhdGUgPSBydW5RdWV1ZUZhaWxlZAorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICAjIFNhbml0eSBDaGVja3MKKyAgICAgICAgZm9yIHRhc2sgaW4geHJhbmdlKHNlbGYuc3RhdHMudG90YWwpOgorICAgICAgICAgICAgaWYgc2VsZi5ydW5xX2J1aWxkYWJsZVt0YXNrXSA9PSAwOgorICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiVGFzayAlcyBuZXZlciBidWlsZGFibGUhIiwgdGFzaykKKyAgICAgICAgICAgIGlmIHNlbGYucnVucV9ydW5uaW5nW3Rhc2tdID09IDA6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJUYXNrICVzIG5ldmVyIHJhbiEiLCB0YXNrKQorICAgICAgICAgICAgaWYgc2VsZi5ydW5xX2NvbXBsZXRlW3Rhc2tdID09IDA6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJUYXNrICVzIG5ldmVyIGNvbXBsZXRlZCEiLCB0YXNrKQorICAgICAgICBzZWxmLnJxLnN0YXRlID0gcnVuUXVldWVDb21wbGV0ZQorCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgYnVpbGRfdGFza2RlcGRhdGEoc2VsZiwgdGFzayk6CisgICAgICAgIHRhc2tkZXBkYXRhID0ge30KKyAgICAgICAgbmV4dCA9IHNlbGYucnFkYXRhLnJ1bnFfZGVwZW5kc1t0YXNrXQorICAgICAgICBuZXh0LmFkZCh0YXNrKQorICAgICAgICB3aGlsZSBuZXh0OgorICAgICAgICAgICAgYWRkaXRpb25hbCA9IFtdCisgICAgICAgICAgICBmb3IgcmV2ZGVwIGluIG5leHQ6CisgICAgICAgICAgICAgICAgZm4gPSBzZWxmLnJxZGF0YS50YXNrRGF0YS5mbl9pbmRleFtzZWxmLnJxZGF0YS5ydW5xX2ZuaWRbcmV2ZGVwXV0KKyAgICAgICAgICAgICAgICBwbiA9IHNlbGYucnFkYXRhLmRhdGFDYWNoZS5wa2dfZm5bZm5dCisgICAgICAgICAgICAgICAgdGFza25hbWUgPSBzZWxmLnJxZGF0YS5ydW5xX3Rhc2tbcmV2ZGVwXQorICAgICAgICAgICAgICAgIGRlcHMgPSBzZWxmLnJxZGF0YS5ydW5xX2RlcGVuZHNbcmV2ZGVwXQorICAgICAgICAgICAgICAgIHByb3ZpZGVzID0gc2VsZi5ycWRhdGEuZGF0YUNhY2hlLmZuX3Byb3ZpZGVzW2ZuXQorICAgICAgICAgICAgICAgIHRhc2tkZXBkYXRhW3JldmRlcF0gPSBbcG4sIHRhc2tuYW1lLCBmbiwgZGVwcywgcHJvdmlkZXNdCisgICAgICAgICAgICAgICAgZm9yIHJldmRlcDIgaW4gZGVwczoKKyAgICAgICAgICAgICAgICAgICAgaWYgcmV2ZGVwMiBub3QgaW4gdGFza2RlcGRhdGE6CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsLmFwcGVuZChyZXZkZXAyKQorICAgICAgICAgICAgbmV4dCA9IGFkZGl0aW9uYWwKKworICAgICAgICAjYmIubm90ZSgiVGFzayAlczogIiAlIHRhc2sgKyBzdHIodGFza2RlcGRhdGEpLnJlcGxhY2UoIl0sICIsICJdLFxuIikpCisgICAgICAgIHJldHVybiB0YXNrZGVwZGF0YQorCitjbGFzcyBSdW5RdWV1ZUV4ZWN1dGVTY2VuZXF1ZXVlKFJ1blF1ZXVlRXhlY3V0ZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJxKToKKyAgICAgICAgUnVuUXVldWVFeGVjdXRlLl9faW5pdF9fKHNlbGYsIHJxKQorCisgICAgICAgIHNlbGYuc2NlbmVxdWV1ZV9jb3ZlcmVkID0gc2V0KCkKKyAgICAgICAgc2VsZi5zY2VuZXF1ZXVlX25vdGNvdmVyZWQgPSBzZXQoKQorICAgICAgICBzZWxmLnNjZW5lcXVldWVfbm90bmVlZGVkID0gc2V0KCkKKworICAgICAgICAjIElmIHdlIGRvbid0IGhhdmUgYW55IHNldHNjZW5lIGZ1bmN0aW9ucywgc2tpcCB0aGlzIHN0ZXAKKyAgICAgICAgaWYgbGVuKHNlbGYucnFkYXRhLnJ1bnFfc2V0c2NlbmUpID09IDA6CisgICAgICAgICAgICBycS5zY2VuZXF1ZXVlX2NvdmVyZWQgPSBzZXQoKQorICAgICAgICAgICAgcnEuc3RhdGUgPSBydW5RdWV1ZVJ1bkluaXQKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHNlbGYuc3RhdHMgPSBSdW5RdWV1ZVN0YXRzKGxlbihzZWxmLnJxZGF0YS5ydW5xX3NldHNjZW5lKSkKKworICAgICAgICBzcV9yZXZkZXBzID0gW10KKyAgICAgICAgc3FfcmV2ZGVwc19uZXcgPSBbXQorICAgICAgICBzcV9yZXZkZXBzX3NxdWFzaCA9IFtdCisgICAgICAgIHNlbGYuc3FfaGFyZGRlcHMgPSB7fQorCisgICAgICAgICMgV2UgbmVlZCB0byBjb25zdHJ1Y3QgYSBkZXBlbmRlbmN5IGdyYXBoIGZvciB0aGUgc2V0c2NlbmUgZnVuY3Rpb25zLiBJbnRlcm1lZGlhdGUKKyAgICAgICAgIyBkZXBlbmRlbmNpZXMgYmV0d2VlbiB0aGUgc2V0c2NlbmUgdGFza3Mgb25seSBjb21wbGljYXRlIHRoZSBjb2RlLiBUaGlzIGNvZGUKKyAgICAgICAgIyB0aGVyZWZvcmUgYWltcyB0byBjb2xsYXBzZSB0aGUgaHVnZSBydW5xdWV1ZSBkZXBlbmRlbmN5IHRyZWUgaW50byBhIHNtYWxsZXIgb25lCisgICAgICAgICMgb25seSBjb250YWluaW5nIHRoZSBzZXRzY2VuZSBmdW5jdGlvbnMuCisKKyAgICAgICAgZm9yIHRhc2sgaW4geHJhbmdlKHNlbGYuc3RhdHMudG90YWwpOgorICAgICAgICAgICAgc2VsZi5ydW5xX3J1bm5pbmcuYXBwZW5kKDApCisgICAgICAgICAgICBzZWxmLnJ1bnFfY29tcGxldGUuYXBwZW5kKDApCisgICAgICAgICAgICBzZWxmLnJ1bnFfYnVpbGRhYmxlLmFwcGVuZCgwKQorCisgICAgICAgICMgRmlyc3QgcHJvY2VzcyB0aGUgY2hhaW5zIHVwIHRvIHRoZSBmaXJzdCBzZXRzY2VuZSB0YXNrLgorICAgICAgICBlbmRwb2ludHMgPSB7fQorICAgICAgICBmb3IgdGFzayBpbiB4cmFuZ2UobGVuKHNlbGYucnFkYXRhLnJ1bnFfZm5pZCkpOgorICAgICAgICAgICAgc3FfcmV2ZGVwcy5hcHBlbmQoY29weS5jb3B5KHNlbGYucnFkYXRhLnJ1bnFfcmV2ZGVwc1t0YXNrXSkpCisgICAgICAgICAgICBzcV9yZXZkZXBzX25ldy5hcHBlbmQoc2V0KCkpCisgICAgICAgICAgICBpZiAobGVuKHNlbGYucnFkYXRhLnJ1bnFfcmV2ZGVwc1t0YXNrXSkgPT0gMCkgYW5kIHRhc2sgbm90IGluIHNlbGYucnFkYXRhLnJ1bnFfc2V0c2NlbmU6CisgICAgICAgICAgICAgICAgZW5kcG9pbnRzW3Rhc2tdID0gc2V0KCkKKworICAgICAgICAjIFNlY29uZGx5IHByb2Nlc3MgdGhlIGNoYWlucyBiZXR3ZWVuIHNldHNjZW5lIHRhc2tzLgorICAgICAgICBmb3IgdGFzayBpbiBzZWxmLnJxZGF0YS5ydW5xX3NldHNjZW5lOgorICAgICAgICAgICAgZm9yIGRlcCBpbiBzZWxmLnJxZGF0YS5ydW5xX2RlcGVuZHNbdGFza106CisgICAgICAgICAgICAgICAgICAgIGlmIGRlcCBub3QgaW4gZW5kcG9pbnRzOgorICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRzW2RlcF0gPSBzZXQoKQorICAgICAgICAgICAgICAgICAgICBlbmRwb2ludHNbZGVwXS5hZGQodGFzaykKKworICAgICAgICBkZWYgcHJvY2Vzc19lbmRwb2ludHMoZW5kcG9pbnRzKToKKyAgICAgICAgICAgIG5ld2VuZHBvaW50cyA9IHt9CisgICAgICAgICAgICBmb3IgcG9pbnQsIHRhc2sgaW4gZW5kcG9pbnRzLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgdGFza3MgPSBzZXQoKQorICAgICAgICAgICAgICAgIGlmIHRhc2s6CisgICAgICAgICAgICAgICAgICAgIHRhc2tzIHw9IHRhc2sKKyAgICAgICAgICAgICAgICBpZiBzcV9yZXZkZXBzX25ld1twb2ludF06CisgICAgICAgICAgICAgICAgICAgIHRhc2tzIHw9IHNxX3JldmRlcHNfbmV3W3BvaW50XQorICAgICAgICAgICAgICAgIHNxX3JldmRlcHNfbmV3W3BvaW50XSA9IHNldCgpCisgICAgICAgICAgICAgICAgaWYgcG9pbnQgaW4gc2VsZi5ycWRhdGEucnVucV9zZXRzY2VuZToKKyAgICAgICAgICAgICAgICAgICAgc3FfcmV2ZGVwc19uZXdbcG9pbnRdID0gdGFza3MKKyAgICAgICAgICAgICAgICBmb3IgZGVwIGluIHNlbGYucnFkYXRhLnJ1bnFfZGVwZW5kc1twb2ludF06CisgICAgICAgICAgICAgICAgICAgIGlmIHBvaW50IGluIHNxX3JldmRlcHNbZGVwXToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNxX3JldmRlcHNbZGVwXS5yZW1vdmUocG9pbnQpCisgICAgICAgICAgICAgICAgICAgIGlmIHRhc2tzOgorICAgICAgICAgICAgICAgICAgICAgICAgc3FfcmV2ZGVwc19uZXdbZGVwXSB8PSB0YXNrcworICAgICAgICAgICAgICAgICAgICBpZiAobGVuKHNxX3JldmRlcHNbZGVwXSkgPT0gMCBvciBsZW4oc3FfcmV2ZGVwc19uZXdbZGVwXSkgIT0gMCkgYW5kIGRlcCBub3QgaW4gc2VsZi5ycWRhdGEucnVucV9zZXRzY2VuZToKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld2VuZHBvaW50c1tkZXBdID0gdGFzaworICAgICAgICAgICAgaWYgbGVuKG5ld2VuZHBvaW50cykgIT0gMDoKKyAgICAgICAgICAgICAgICBwcm9jZXNzX2VuZHBvaW50cyhuZXdlbmRwb2ludHMpCisKKyAgICAgICAgcHJvY2Vzc19lbmRwb2ludHMoZW5kcG9pbnRzKQorCisgICAgICAgICMgQnVpbGQgYSBsaXN0IG9mIHNldHNjZW5lIHRhc2tzIHdoaWNoIGFyZSAidW5za2lwcGFibGUiCisgICAgICAgICMgVGhlc2UgYXJlIGRpcmVjdCBlbmRwb2ludHMgcmVmZXJlbmNlZCBieSB0aGUgYnVpbGQKKyAgICAgICAgZW5kcG9pbnRzMiA9IHt9CisgICAgICAgIHNxX3JldmRlcHMyID0gW10KKyAgICAgICAgc3FfcmV2ZGVwc19uZXcyID0gW10KKyAgICAgICAgZGVmIHByb2Nlc3NfZW5kcG9pbnRzMihlbmRwb2ludHMpOgorICAgICAgICAgICAgbmV3ZW5kcG9pbnRzID0ge30KKyAgICAgICAgICAgIGZvciBwb2ludCwgdGFzayBpbiBlbmRwb2ludHMuaXRlbXMoKToKKyAgICAgICAgICAgICAgICB0YXNrcyA9IHNldChbcG9pbnRdKQorICAgICAgICAgICAgICAgIGlmIHRhc2s6CisgICAgICAgICAgICAgICAgICAgIHRhc2tzIHw9IHRhc2sKKyAgICAgICAgICAgICAgICBpZiBzcV9yZXZkZXBzX25ldzJbcG9pbnRdOgorICAgICAgICAgICAgICAgICAgICB0YXNrcyB8PSBzcV9yZXZkZXBzX25ldzJbcG9pbnRdCisgICAgICAgICAgICAgICAgc3FfcmV2ZGVwc19uZXcyW3BvaW50XSA9IHNldCgpCisgICAgICAgICAgICAgICAgaWYgcG9pbnQgaW4gc2VsZi5ycWRhdGEucnVucV9zZXRzY2VuZToKKyAgICAgICAgICAgICAgICAgICAgc3FfcmV2ZGVwc19uZXcyW3BvaW50XSA9IHRhc2tzCisgICAgICAgICAgICAgICAgZm9yIGRlcCBpbiBzZWxmLnJxZGF0YS5ydW5xX2RlcGVuZHNbcG9pbnRdOgorICAgICAgICAgICAgICAgICAgICBpZiBwb2ludCBpbiBzcV9yZXZkZXBzMltkZXBdOgorICAgICAgICAgICAgICAgICAgICAgICAgc3FfcmV2ZGVwczJbZGVwXS5yZW1vdmUocG9pbnQpCisgICAgICAgICAgICAgICAgICAgIGlmIHRhc2tzOgorICAgICAgICAgICAgICAgICAgICAgICAgc3FfcmV2ZGVwc19uZXcyW2RlcF0gfD0gdGFza3MKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxlbihzcV9yZXZkZXBzMltkZXBdKSA9PSAwIG9yIGxlbihzcV9yZXZkZXBzX25ldzJbZGVwXSkgIT0gMCkgYW5kIGRlcCBub3QgaW4gc2VsZi5ycWRhdGEucnVucV9zZXRzY2VuZToKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld2VuZHBvaW50c1tkZXBdID0gdGFza3MKKyAgICAgICAgICAgIGlmIGxlbihuZXdlbmRwb2ludHMpICE9IDA6CisgICAgICAgICAgICAgICAgcHJvY2Vzc19lbmRwb2ludHMyKG5ld2VuZHBvaW50cykKKyAgICAgICAgZm9yIHRhc2sgaW4geHJhbmdlKGxlbihzZWxmLnJxZGF0YS5ydW5xX2ZuaWQpKToKKyAgICAgICAgICAgIHNxX3JldmRlcHMyLmFwcGVuZChjb3B5LmNvcHkoc2VsZi5ycWRhdGEucnVucV9yZXZkZXBzW3Rhc2tdKSkKKyAgICAgICAgICAgIHNxX3JldmRlcHNfbmV3Mi5hcHBlbmQoc2V0KCkpCisgICAgICAgICAgICBpZiAobGVuKHNlbGYucnFkYXRhLnJ1bnFfcmV2ZGVwc1t0YXNrXSkgPT0gMCkgYW5kIHRhc2sgbm90IGluIHNlbGYucnFkYXRhLnJ1bnFfc2V0c2NlbmU6CisgICAgICAgICAgICAgICAgZW5kcG9pbnRzMlt0YXNrXSA9IHNldCgpCisgICAgICAgIHByb2Nlc3NfZW5kcG9pbnRzMihlbmRwb2ludHMyKQorICAgICAgICBzZWxmLnVuc2tpcHBhYmxlID0gW10KKyAgICAgICAgZm9yIHRhc2sgaW4gc2VsZi5ycWRhdGEucnVucV9zZXRzY2VuZToKKyAgICAgICAgICAgIGlmIHNxX3JldmRlcHNfbmV3Mlt0YXNrXToKKyAgICAgICAgICAgICAgICBzZWxmLnVuc2tpcHBhYmxlLmFwcGVuZChzZWxmLnJxZGF0YS5ydW5xX3NldHNjZW5lLmluZGV4KHRhc2spKQorCisgICAgICAgIGZvciB0YXNrIGluIHhyYW5nZShsZW4oc2VsZi5ycWRhdGEucnVucV9mbmlkKSk6CisgICAgICAgICAgICBpZiB0YXNrIGluIHNlbGYucnFkYXRhLnJ1bnFfc2V0c2NlbmU6CisgICAgICAgICAgICAgICAgZGVwcyA9IHNldCgpCisgICAgICAgICAgICAgICAgZm9yIGRlcCBpbiBzcV9yZXZkZXBzX25ld1t0YXNrXToKKyAgICAgICAgICAgICAgICAgICAgZGVwcy5hZGQoc2VsZi5ycWRhdGEucnVucV9zZXRzY2VuZS5pbmRleChkZXApKQorICAgICAgICAgICAgICAgIHNxX3JldmRlcHNfc3F1YXNoLmFwcGVuZChkZXBzKQorICAgICAgICAgICAgZWxpZiBsZW4oc3FfcmV2ZGVwc19uZXdbdGFza10pICE9IDA6CisgICAgICAgICAgICAgICAgYmIubXNnLmZhdGFsKCJSdW5RdWV1ZSIsICJTb21ldGhpbmcgd2VudCBiYWRseSB3cm9uZyBkdXJpbmcgc2NlbmVxdWV1ZSBnZW5lcmF0aW9uLCBhYm9ydGluZy4gUGxlYXNlIHJlcG9ydCB0aGlzIHByb2JsZW0uIikKKworICAgICAgICAjIFJlc29sdmUgc2V0c2NlbmUgaW50ZXItdGFzayBkZXBlbmRlbmNpZXMKKyAgICAgICAgIyBlLmcuIGRvX3NvbWV0YXNrX3NldHNjZW5lW2RlcGVuZHNdID0gInRhcmdldG5hbWU6ZG9fc29tZW90aGVydGFza19zZXRzY2VuZSIKKyAgICAgICAgIyBOb3RlIHRoYXQgYW55dGhpbmcgZXhwbGljaXRseSBkZXBlbmRlZCB1cG9uIHdpbGwgaGF2ZSBpdHMgcmV2ZXJzZSBkZXBlbmRlbmNpZXMgcmVtb3ZlZCB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmNpZXMKKyAgICAgICAgZm9yIHRhc2sgaW4gc2VsZi5ycWRhdGEucnVucV9zZXRzY2VuZToKKyAgICAgICAgICAgICAgICByZWFsaWQgPSBzZWxmLnJxZGF0YS50YXNrRGF0YS5nZXR0YXNrX2lkKHNlbGYucnFkYXRhLnRhc2tEYXRhLmZuX2luZGV4W3NlbGYucnFkYXRhLnJ1bnFfZm5pZFt0YXNrXV0sIHNlbGYucnFkYXRhLnJ1bnFfdGFza1t0YXNrXSArICJfc2V0c2NlbmUiLCBGYWxzZSkKKyAgICAgICAgICAgICAgICBpZGVwZW5kcyA9IHNlbGYucnFkYXRhLnRhc2tEYXRhLnRhc2tzX2lkZXBlbmRzW3JlYWxpZF0KKyAgICAgICAgICAgICAgICBmb3IgKGRlcGlkLCBpZGVwZW5kdGFzaykgaW4gaWRlcGVuZHM6CisgICAgICAgICAgICAgICAgICAgIGlmIGRlcGlkIG5vdCBpbiBzZWxmLnJxZGF0YS50YXNrRGF0YS5idWlsZF90YXJnZXRzOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgICAgICBkZXBkYXRhID0gc2VsZi5ycWRhdGEudGFza0RhdGEuYnVpbGRfdGFyZ2V0c1tkZXBpZF1bMF0KKyAgICAgICAgICAgICAgICAgICAgaWYgZGVwZGF0YSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGRlcCA9IHNlbGYucnFkYXRhLnRhc2tEYXRhLmZuX2luZGV4W2RlcGRhdGFdCisgICAgICAgICAgICAgICAgICAgIHRhc2tpZCA9IHNlbGYucnFkYXRhLmdldF90YXNrX2lkKHNlbGYucnFkYXRhLnRhc2tEYXRhLmdldGZuX2lkKGRlcCksIGlkZXBlbmR0YXNrLnJlcGxhY2UoIl9zZXRzY2VuZSIsICIiKSkKKyAgICAgICAgICAgICAgICAgICAgaWYgdGFza2lkIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBiYi5tc2cuZmF0YWwoIlJ1blF1ZXVlIiwgIlRhc2sgJXNfc2V0c2NlbmUgZGVwZW5kcyB1cG9uIG5vbi1leGlzdGVudCB0YXNrICVzOiVzIiAlIChzZWxmLnJxZGF0YS5nZXRfdXNlcl9pZHN0cmluZyh0YXNrKSwgZGVwLCBpZGVwZW5kdGFzaykpCisKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYucnFkYXRhLnJ1bnFfc2V0c2NlbmUuaW5kZXgodGFza2lkKSBpbiBzZWxmLnNxX2hhcmRkZXBzOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zcV9oYXJkZGVwc1tzZWxmLnJxZGF0YS5ydW5xX3NldHNjZW5lLmluZGV4KHRhc2tpZCldID0gc2V0KCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zcV9oYXJkZGVwc1tzZWxmLnJxZGF0YS5ydW5xX3NldHNjZW5lLmluZGV4KHRhc2tpZCldLmFkZChzZWxmLnJxZGF0YS5ydW5xX3NldHNjZW5lLmluZGV4KHRhc2spKQorCisgICAgICAgICAgICAgICAgICAgIHNxX3JldmRlcHNfc3F1YXNoW3NlbGYucnFkYXRhLnJ1bnFfc2V0c2NlbmUuaW5kZXgodGFzayldLmFkZChzZWxmLnJxZGF0YS5ydW5xX3NldHNjZW5lLmluZGV4KHRhc2tpZCkpCisgICAgICAgICAgICAgICAgICAgICMgSGF2ZSB0byB6ZXJvIHRoaXMgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzCisgICAgICAgICAgICAgICAgICAgIHNxX3JldmRlcHNfc3F1YXNoW3NlbGYucnFkYXRhLnJ1bnFfc2V0c2NlbmUuaW5kZXgodGFza2lkKV0gPSBzZXQoKQorCisgICAgICAgIGZvciB0YXNrIGluIHNlbGYuc3FfaGFyZGRlcHM6CisgICAgICAgICAgICAgZm9yIGRlcCBpbiBzZWxmLnNxX2hhcmRkZXBzW3Rhc2tdOgorICAgICAgICAgICAgICAgICBzcV9yZXZkZXBzX3NxdWFzaFtkZXBdLmFkZCh0YXNrKQorCisgICAgICAgICNmb3IgdGFzayBpbiB4cmFuZ2UobGVuKHNxX3JldmRlcHNfc3F1YXNoKSk6CisgICAgICAgICMgICAgcmVhbHRhc2sgPSBzZWxmLnJxZGF0YS5ydW5xX3NldHNjZW5lW3Rhc2tdCisgICAgICAgICMgICAgYmIud2FybigiVGFzayAlczogJXNfc2V0c2NlbmUgaXMgJXMgIiAlICh0YXNrLCBzZWxmLnJxZGF0YS5nZXRfdXNlcl9pZHN0cmluZyhyZWFsdGFzaykgLCBzcV9yZXZkZXBzX3NxdWFzaFt0YXNrXSkpCisKKyAgICAgICAgc2VsZi5zcV9kZXBzID0gW10KKyAgICAgICAgc2VsZi5zcV9yZXZkZXBzID0gc3FfcmV2ZGVwc19zcXVhc2gKKyAgICAgICAgc2VsZi5zcV9yZXZkZXBzMiA9IGNvcHkuZGVlcGNvcHkoc2VsZi5zcV9yZXZkZXBzKQorCisgICAgICAgIGZvciB0YXNrIGluIHhyYW5nZShsZW4oc2VsZi5zcV9yZXZkZXBzKSk6CisgICAgICAgICAgICBzZWxmLnNxX2RlcHMuYXBwZW5kKHNldCgpKQorICAgICAgICBmb3IgdGFzayBpbiB4cmFuZ2UobGVuKHNlbGYuc3FfcmV2ZGVwcykpOgorICAgICAgICAgICAgZm9yIGRlcCBpbiBzZWxmLnNxX3JldmRlcHNbdGFza106CisgICAgICAgICAgICAgICAgc2VsZi5zcV9kZXBzW2RlcF0uYWRkKHRhc2spCisKKyAgICAgICAgZm9yIHRhc2sgaW4geHJhbmdlKGxlbihzZWxmLnNxX3JldmRlcHMpKToKKyAgICAgICAgICAgIGlmIGxlbihzZWxmLnNxX3JldmRlcHNbdGFza10pID09IDA6CisgICAgICAgICAgICAgICAgc2VsZi5ydW5xX2J1aWxkYWJsZVt0YXNrXSA9IDEKKworICAgICAgICBzZWxmLm91dHJpZ2h0ZmFpbCA9IFtdCisgICAgICAgIGlmIHNlbGYucnEuaGFzaHZhbGlkYXRlOgorICAgICAgICAgICAgc3FfaGFzaCA9IFtdCisgICAgICAgICAgICBzcV9oYXNoZm4gPSBbXQorICAgICAgICAgICAgc3FfZm4gPSBbXQorICAgICAgICAgICAgc3FfdGFza25hbWUgPSBbXQorICAgICAgICAgICAgc3FfdGFzayA9IFtdCisgICAgICAgICAgICBub2V4ZWMgPSBbXQorICAgICAgICAgICAgc3RhbXBwcmVzZW50ID0gW10KKyAgICAgICAgICAgIGZvciB0YXNrIGluIHhyYW5nZShsZW4oc2VsZi5zcV9yZXZkZXBzKSk6CisgICAgICAgICAgICAgICAgcmVhbHRhc2sgPSBzZWxmLnJxZGF0YS5ydW5xX3NldHNjZW5lW3Rhc2tdCisgICAgICAgICAgICAgICAgZm4gPSBzZWxmLnJxZGF0YS50YXNrRGF0YS5mbl9pbmRleFtzZWxmLnJxZGF0YS5ydW5xX2ZuaWRbcmVhbHRhc2tdXQorICAgICAgICAgICAgICAgIHRhc2tuYW1lID0gc2VsZi5ycWRhdGEucnVucV90YXNrW3JlYWx0YXNrXQorICAgICAgICAgICAgICAgIHRhc2tkZXAgPSBzZWxmLnJxZGF0YS5kYXRhQ2FjaGUudGFza19kZXBzW2ZuXQorCisgICAgICAgICAgICAgICAgaWYgJ25vZXhlYycgaW4gdGFza2RlcCBhbmQgdGFza25hbWUgaW4gdGFza2RlcFsnbm9leGVjJ106CisgICAgICAgICAgICAgICAgICAgIG5vZXhlYy5hcHBlbmQodGFzaykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50YXNrX3NraXAodGFzaykKKyAgICAgICAgICAgICAgICAgICAgYmIuYnVpbGQubWFrZV9zdGFtcCh0YXNrbmFtZSArICJfc2V0c2NlbmUiLCBzZWxmLnJxZGF0YS5kYXRhQ2FjaGUsIGZuKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgaWYgc2VsZi5ycS5jaGVja19zdGFtcF90YXNrKHJlYWx0YXNrLCB0YXNrbmFtZSArICJfc2V0c2NlbmUiLCBjYWNoZT1zZWxmLnN0YW1wY2FjaGUpOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoMiwgJ1NldHNjZW5lIHN0YW1wIGN1cnJlbnQgZm9yIHRhc2sgJXMoJXMpJywgdGFzaywgc2VsZi5ycWRhdGEuZ2V0X3VzZXJfaWRzdHJpbmcocmVhbHRhc2spKQorICAgICAgICAgICAgICAgICAgICBzdGFtcHByZXNlbnQuYXBwZW5kKHRhc2spCisgICAgICAgICAgICAgICAgICAgIHNlbGYudGFza19za2lwKHRhc2spCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnJxLmNoZWNrX3N0YW1wX3Rhc2socmVhbHRhc2ssIHRhc2tuYW1lLCByZWN1cnNlID0gVHJ1ZSwgY2FjaGU9c2VsZi5zdGFtcGNhY2hlKToKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICdOb3JtYWwgc3RhbXAgY3VycmVudCBmb3IgdGFzayAlcyglcyknLCB0YXNrLCBzZWxmLnJxZGF0YS5nZXRfdXNlcl9pZHN0cmluZyhyZWFsdGFzaykpCisgICAgICAgICAgICAgICAgICAgIHN0YW1wcHJlc2VudC5hcHBlbmQodGFzaykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50YXNrX3NraXAodGFzaykKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIHNxX2ZuLmFwcGVuZChmbikKKyAgICAgICAgICAgICAgICBzcV9oYXNoZm4uYXBwZW5kKHNlbGYucnFkYXRhLmRhdGFDYWNoZS5oYXNoZm5bZm5dKQorICAgICAgICAgICAgICAgIHNxX2hhc2guYXBwZW5kKHNlbGYucnFkYXRhLnJ1bnFfaGFzaFtyZWFsdGFza10pCisgICAgICAgICAgICAgICAgc3FfdGFza25hbWUuYXBwZW5kKHRhc2tuYW1lKQorICAgICAgICAgICAgICAgIHNxX3Rhc2suYXBwZW5kKHRhc2spCisgICAgICAgICAgICBjYWxsID0gc2VsZi5ycS5oYXNodmFsaWRhdGUgKyAiKHNxX2ZuLCBzcV90YXNrLCBzcV9oYXNoLCBzcV9oYXNoZm4sIGQpIgorICAgICAgICAgICAgbG9jcyA9IHsgInNxX2ZuIiA6IHNxX2ZuLCAic3FfdGFzayIgOiBzcV90YXNrbmFtZSwgInNxX2hhc2giIDogc3FfaGFzaCwgInNxX2hhc2hmbiIgOiBzcV9oYXNoZm4sICJkIiA6IHNlbGYuY29va2VyLmV4cGFuZGVkX2RhdGEgfQorICAgICAgICAgICAgdmFsaWQgPSBiYi51dGlscy5iZXR0ZXJfZXZhbChjYWxsLCBsb2NzKQorCisgICAgICAgICAgICB2YWxpZF9uZXcgPSBzdGFtcHByZXNlbnQKKyAgICAgICAgICAgIGZvciB2IGluIHZhbGlkOgorICAgICAgICAgICAgICAgIHZhbGlkX25ldy5hcHBlbmQoc3FfdGFza1t2XSkKKworICAgICAgICAgICAgZm9yIHRhc2sgaW4geHJhbmdlKGxlbihzZWxmLnNxX3JldmRlcHMpKToKKyAgICAgICAgICAgICAgICBpZiB0YXNrIG5vdCBpbiB2YWxpZF9uZXcgYW5kIHRhc2sgbm90IGluIG5vZXhlYzoKKyAgICAgICAgICAgICAgICAgICAgcmVhbHRhc2sgPSBzZWxmLnJxZGF0YS5ydW5xX3NldHNjZW5lW3Rhc2tdCisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygyLCAnTm8gcGFja2FnZSBmb3VuZCwgc28gc2tpcHBpbmcgc2V0c2NlbmUgdGFzayAlcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJxZGF0YS5nZXRfdXNlcl9pZHN0cmluZyhyZWFsdGFzaykpCisgICAgICAgICAgICAgICAgICAgIHNlbGYub3V0cmlnaHRmYWlsLmFwcGVuZCh0YXNrKQorCisgICAgICAgIGxvZ2dlci5pbmZvKCdFeGVjdXRpbmcgU2V0U2NlbmUgVGFza3MnKQorCisgICAgICAgIHNlbGYucnEuc3RhdGUgPSBydW5RdWV1ZVNjZW5lUnVuCisKKyAgICBkZWYgc2NlbmVxdWV1ZV91cGRhdGVjb3VudGVycyhzZWxmLCB0YXNrLCBmYWlsID0gRmFsc2UpOgorICAgICAgICBmb3IgZGVwIGluIHNlbGYuc3FfZGVwc1t0YXNrXToKKyAgICAgICAgICAgIGlmIGZhaWwgYW5kIHRhc2sgaW4gc2VsZi5zcV9oYXJkZGVwcyBhbmQgZGVwIGluIHNlbGYuc3FfaGFyZGRlcHNbdGFza106CisgICAgICAgICAgICAgICAgcmVhbHRhc2sgPSBzZWxmLnJxZGF0YS5ydW5xX3NldHNjZW5lW3Rhc2tdCisgICAgICAgICAgICAgICAgcmVhbGRlcCA9IHNlbGYucnFkYXRhLnJ1bnFfc2V0c2NlbmVbZGVwXQorICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygyLCAiJXMgd2FzIHVuYXZhaWxhYmxlIGFuZCBpcyBhIGhhcmQgZGVwZW5kZW5jeSBvZiAlcyBzbyBza2lwcGluZyIgJSAoc2VsZi5ycWRhdGEuZ2V0X3VzZXJfaWRzdHJpbmcocmVhbHRhc2spLCBzZWxmLnJxZGF0YS5nZXRfdXNlcl9pZHN0cmluZyhyZWFsZGVwKSkpCisgICAgICAgICAgICAgICAgc2VsZi5zY2VuZXF1ZXVlX3VwZGF0ZWNvdW50ZXJzKGRlcCwgZmFpbCkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgdGFzayBub3QgaW4gc2VsZi5zcV9yZXZkZXBzMltkZXBdOgorICAgICAgICAgICAgICAgICMgTWF5IGFscmVhZHkgaGF2ZSBiZWVuIHJlbW92ZWQgYnkgdGhlIGZhaWwgY2FzZSBhYm92ZQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBzZWxmLnNxX3JldmRlcHMyW2RlcF0ucmVtb3ZlKHRhc2spCisgICAgICAgICAgICBpZiBsZW4oc2VsZi5zcV9yZXZkZXBzMltkZXBdKSA9PSAwOgorICAgICAgICAgICAgICAgIHNlbGYucnVucV9idWlsZGFibGVbZGVwXSA9IDEKKworICAgIGRlZiB0YXNrX2NvbXBsZXRlb3V0cmlnaHQoc2VsZiwgdGFzayk6CisgICAgICAgICIiIgorICAgICAgICBNYXJrIGEgdGFzayBhcyBjb21wbGV0ZWQKKyAgICAgICAgTG9vayBhdCB0aGUgcmV2ZXJzZSBkZXBlbmRlbmNpZXMgYW5kIG1hcmsgYW55IHRhc2sgd2l0aAorICAgICAgICBjb21wbGV0ZWQgZGVwZW5kZW5jaWVzIGFzIGJ1aWxkYWJsZQorICAgICAgICAiIiIKKworICAgICAgICBpbmRleCA9IHNlbGYucnFkYXRhLnJ1bnFfc2V0c2NlbmVbdGFza10KKyAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICdGb3VuZCB0YXNrICVzIHdoaWNoIGNvdWxkIGJlIGFjY2VsZXJhdGVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucnFkYXRhLmdldF91c2VyX2lkc3RyaW5nKGluZGV4KSkKKworICAgICAgICBzZWxmLnNjZW5lcXVldWVfY292ZXJlZC5hZGQodGFzaykKKyAgICAgICAgc2VsZi5zY2VuZXF1ZXVlX3VwZGF0ZWNvdW50ZXJzKHRhc2spCisKKyAgICBkZWYgdGFza19jb21wbGV0ZShzZWxmLCB0YXNrKToKKyAgICAgICAgc2VsZi5zdGF0cy50YXNrQ29tcGxldGVkKCkKKyAgICAgICAgYmIuZXZlbnQuZmlyZShzY2VuZVF1ZXVlVGFza0NvbXBsZXRlZCh0YXNrLCBzZWxmLnN0YXRzLCBzZWxmLnJxKSwgc2VsZi5jZmdEYXRhKQorICAgICAgICBzZWxmLnRhc2tfY29tcGxldGVvdXRyaWdodCh0YXNrKQorCisgICAgZGVmIHRhc2tfZmFpbChzZWxmLCB0YXNrLCByZXN1bHQpOgorICAgICAgICBzZWxmLnN0YXRzLnRhc2tGYWlsZWQoKQorICAgICAgICBiYi5ldmVudC5maXJlKHNjZW5lUXVldWVUYXNrRmFpbGVkKHRhc2ssIHNlbGYuc3RhdHMsIHJlc3VsdCwgc2VsZiksIHNlbGYuY2ZnRGF0YSkKKyAgICAgICAgc2VsZi5zY2VuZXF1ZXVlX25vdGNvdmVyZWQuYWRkKHRhc2spCisgICAgICAgIHNlbGYuc2NlbmVxdWV1ZV91cGRhdGVjb3VudGVycyh0YXNrLCBUcnVlKQorCisgICAgZGVmIHRhc2tfZmFpbG91dHJpZ2h0KHNlbGYsIHRhc2spOgorICAgICAgICBzZWxmLnJ1bnFfcnVubmluZ1t0YXNrXSA9IDEKKyAgICAgICAgc2VsZi5ydW5xX2J1aWxkYWJsZVt0YXNrXSA9IDEKKyAgICAgICAgc2VsZi5zdGF0cy50YXNrQ29tcGxldGVkKCkKKyAgICAgICAgc2VsZi5zdGF0cy50YXNrU2tpcHBlZCgpCisgICAgICAgIGluZGV4ID0gc2VsZi5ycWRhdGEucnVucV9zZXRzY2VuZVt0YXNrXQorICAgICAgICBzZWxmLnNjZW5lcXVldWVfbm90Y292ZXJlZC5hZGQodGFzaykKKyAgICAgICAgc2VsZi5zY2VuZXF1ZXVlX3VwZGF0ZWNvdW50ZXJzKHRhc2ssIFRydWUpCisKKyAgICBkZWYgdGFza19za2lwKHNlbGYsIHRhc2spOgorICAgICAgICBzZWxmLnJ1bnFfcnVubmluZ1t0YXNrXSA9IDEKKyAgICAgICAgc2VsZi5ydW5xX2J1aWxkYWJsZVt0YXNrXSA9IDEKKyAgICAgICAgc2VsZi50YXNrX2NvbXBsZXRlb3V0cmlnaHQodGFzaykKKyAgICAgICAgc2VsZi5zdGF0cy50YXNrQ29tcGxldGVkKCkKKyAgICAgICAgc2VsZi5zdGF0cy50YXNrU2tpcHBlZCgpCisKKyAgICBkZWYgZXhlY3V0ZShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFJ1biB0aGUgdGFza3MgaW4gYSBxdWV1ZSBwcmVwYXJlZCBieSBwcmVwYXJlX3J1bnF1ZXVlCisgICAgICAgICIiIgorCisgICAgICAgIHNlbGYucnEucmVhZF93b3JrZXJzKCkKKworICAgICAgICB0YXNrID0gTm9uZQorICAgICAgICBpZiBzZWxmLnN0YXRzLmFjdGl2ZSA8IHNlbGYubnVtYmVyX3Rhc2tzOgorICAgICAgICAgICAgIyBGaW5kIHRoZSBuZXh0IHNldHNjZW5lIHRvIHJ1bgorICAgICAgICAgICAgZm9yIG5leHR0YXNrIGluIHhyYW5nZShzZWxmLnN0YXRzLnRvdGFsKToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnJ1bnFfYnVpbGRhYmxlW25leHR0YXNrXSA9PSAxIGFuZCBzZWxmLnJ1bnFfcnVubmluZ1tuZXh0dGFza10gIT0gMToKKyAgICAgICAgICAgICAgICAgICAgaWYgbmV4dHRhc2sgaW4gc2VsZi51bnNraXBwYWJsZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygyLCAiU2V0c2NlbmUgdGFzayAlcyBpcyB1bnNraXBwYWJsZSIgJSBzZWxmLnJxZGF0YS5nZXRfdXNlcl9pZHN0cmluZyhzZWxmLnJxZGF0YS5ydW5xX3NldHNjZW5lW25leHR0YXNrXSkpICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiBuZXh0dGFzayBub3QgaW4gc2VsZi51bnNraXBwYWJsZSBhbmQgbGVuKHNlbGYuc3FfcmV2ZGVwc1tuZXh0dGFza10pID4gMCBhbmQgc2VsZi5zcV9yZXZkZXBzW25leHR0YXNrXS5pc3N1YnNldChzZWxmLnNjZW5lcXVldWVfY292ZXJlZCkgYW5kIHNlbGYuY2hlY2tfZGVwZW5kZW5jaWVzKG5leHR0YXNrLCBzZWxmLnNxX3JldmRlcHNbbmV4dHRhc2tdLCBUcnVlKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWx0YXNrID0gc2VsZi5ycWRhdGEucnVucV9zZXRzY2VuZVtuZXh0dGFza10KKyAgICAgICAgICAgICAgICAgICAgICAgIGZuID0gc2VsZi5ycWRhdGEudGFza0RhdGEuZm5faW5kZXhbc2VsZi5ycWRhdGEucnVucV9mbmlkW3JlYWx0YXNrXV0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kdGFyZ2V0ID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0YXJnZXQgaW4gc2VsZi5ycWRhdGEudGFyZ2V0X3BhaXJzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRhcmdldFswXSA9PSBmbiBhbmQgdGFyZ2V0WzFdID09IHNlbGYucnFkYXRhLnJ1bnFfdGFza1tyZWFsdGFza106CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kdGFyZ2V0ID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGZvdW5kdGFyZ2V0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygyLCAiU2tpcHBpbmcgc2V0c2NlbmUgZm9yIHRhc2sgJXMiICUgc2VsZi5ycWRhdGEuZ2V0X3VzZXJfaWRzdHJpbmcoc2VsZi5ycWRhdGEucnVucV9zZXRzY2VuZVtuZXh0dGFza10pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGFza19za2lwKG5leHR0YXNrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2NlbmVxdWV1ZV9ub3RuZWVkZWQuYWRkKG5leHR0YXNrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICAgICAgICAgIGlmIG5leHR0YXNrIGluIHNlbGYub3V0cmlnaHRmYWlsOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50YXNrX2ZhaWxvdXRyaWdodChuZXh0dGFzaykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICAgICAgICAgIHRhc2sgPSBuZXh0dGFzaworICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBpZiB0YXNrIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmVhbHRhc2sgPSBzZWxmLnJxZGF0YS5ydW5xX3NldHNjZW5lW3Rhc2tdCisgICAgICAgICAgICBmbiA9IHNlbGYucnFkYXRhLnRhc2tEYXRhLmZuX2luZGV4W3NlbGYucnFkYXRhLnJ1bnFfZm5pZFtyZWFsdGFza11dCisKKyAgICAgICAgICAgIHRhc2tuYW1lID0gc2VsZi5ycWRhdGEucnVucV90YXNrW3JlYWx0YXNrXSArICJfc2V0c2NlbmUiCisgICAgICAgICAgICBpZiBzZWxmLnJxLmNoZWNrX3N0YW1wX3Rhc2socmVhbHRhc2ssIHNlbGYucnFkYXRhLnJ1bnFfdGFza1tyZWFsdGFza10sIHJlY3Vyc2UgPSBUcnVlLCBjYWNoZT1zZWxmLnN0YW1wY2FjaGUpOgorICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygyLCAnU3RhbXAgZm9yIHVuZGVybHlpbmcgdGFzayAlcyglcykgaXMgY3VycmVudCwgc28gc2tpcHBpbmcgc2V0c2NlbmUgdmFyaWFudCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2ssIHNlbGYucnFkYXRhLmdldF91c2VyX2lkc3RyaW5nKHJlYWx0YXNrKSkKKyAgICAgICAgICAgICAgICBzZWxmLnRhc2tfZmFpbG91dHJpZ2h0KHRhc2spCisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICAgICAgaWYgc2VsZi5jb29rZXIuY29uZmlndXJhdGlvbi5mb3JjZToKKyAgICAgICAgICAgICAgICBmb3IgdGFyZ2V0IGluIHNlbGYucnFkYXRhLnRhcmdldF9wYWlyczoKKyAgICAgICAgICAgICAgICAgICAgaWYgdGFyZ2V0WzBdID09IGZuIGFuZCB0YXJnZXRbMV0gPT0gc2VsZi5ycWRhdGEucnVucV90YXNrW3JlYWx0YXNrXToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGFza19mYWlsb3V0cmlnaHQodGFzaykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgICAgIGlmIHNlbGYucnEuY2hlY2tfc3RhbXBfdGFzayhyZWFsdGFzaywgdGFza25hbWUsIGNhY2hlPXNlbGYuc3RhbXBjYWNoZSk6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICdTZXRzY2VuZSBzdGFtcCBjdXJyZW50IHRhc2sgJXMoJXMpLCBzbyBza2lwIGl0IGFuZCBpdHMgZGVwZW5kZW5jaWVzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzaywgc2VsZi5ycWRhdGEuZ2V0X3VzZXJfaWRzdHJpbmcocmVhbHRhc2spKQorICAgICAgICAgICAgICAgIHNlbGYudGFza19za2lwKHRhc2spCisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICAgICAgc3RhcnRldmVudCA9IHNjZW5lUXVldWVUYXNrU3RhcnRlZCh0YXNrLCBzZWxmLnN0YXRzLCBzZWxmLnJxKQorICAgICAgICAgICAgYmIuZXZlbnQuZmlyZShzdGFydGV2ZW50LCBzZWxmLmNmZ0RhdGEpCisKKyAgICAgICAgICAgIHRhc2tkZXAgPSBzZWxmLnJxZGF0YS5kYXRhQ2FjaGUudGFza19kZXBzW2ZuXQorICAgICAgICAgICAgaWYgJ2Zha2Vyb290JyBpbiB0YXNrZGVwIGFuZCB0YXNrbmFtZSBpbiB0YXNrZGVwWydmYWtlcm9vdCddOgorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnJxLmZha2V3b3JrZXI6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucnEuc3RhcnRfZmFrZXdvcmtlcihzZWxmKQorICAgICAgICAgICAgICAgIHNlbGYucnEuZmFrZXdvcmtlci5zdGRpbi53cml0ZSgiPHJ1bnRhc2s+IiArIHBpY2tsZS5kdW1wcygoZm4sIHJlYWx0YXNrLCB0YXNrbmFtZSwgVHJ1ZSwgc2VsZi5jb29rZXIuY29sbGVjdGlvbi5nZXRfZmlsZV9hcHBlbmRzKGZuKSwgTm9uZSkpICsgIjwvcnVudGFzaz4iKQorICAgICAgICAgICAgICAgIHNlbGYucnEuZmFrZXdvcmtlci5zdGRpbi5mbHVzaCgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYucnEud29ya2VyLnN0ZGluLndyaXRlKCI8cnVudGFzaz4iICsgcGlja2xlLmR1bXBzKChmbiwgcmVhbHRhc2ssIHRhc2tuYW1lLCBUcnVlLCBzZWxmLmNvb2tlci5jb2xsZWN0aW9uLmdldF9maWxlX2FwcGVuZHMoZm4pLCBOb25lKSkgKyAiPC9ydW50YXNrPiIpCisgICAgICAgICAgICAgICAgc2VsZi5ycS53b3JrZXIuc3RkaW4uZmx1c2goKQorCisgICAgICAgICAgICBzZWxmLnJ1bnFfcnVubmluZ1t0YXNrXSA9IDEKKyAgICAgICAgICAgIHNlbGYuc3RhdHMudGFza0FjdGl2ZSgpCisgICAgICAgICAgICBpZiBzZWxmLnN0YXRzLmFjdGl2ZSA8IHNlbGYubnVtYmVyX3Rhc2tzOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgaWYgc2VsZi5zdGF0cy5hY3RpdmUgPiAwOgorICAgICAgICAgICAgc2VsZi5ycS5yZWFkX3dvcmtlcnMoKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYucnEuYWN0aXZlX2ZkcygpCisKKyAgICAgICAgI2ZvciB0YXNrIGluIHhyYW5nZShzZWxmLnN0YXRzLnRvdGFsKToKKyAgICAgICAgIyAgICBpZiBzZWxmLnJ1bnFfcnVubmluZ1t0YXNrXSAhPSAxOgorICAgICAgICAjICAgICAgICBidWlsZGFibGUgPSBzZWxmLnJ1bnFfYnVpbGRhYmxlW3Rhc2tdCisgICAgICAgICMgICAgICAgIHJldmRlcHMgPSBzZWxmLnNxX3JldmRlcHNbdGFza10KKyAgICAgICAgIyAgICAgICAgYmIud2FybigiRm91bmQgd2UgZGlkbid0IHJ1biAlcyAlcyAlcyAlcyIgJSAodGFzaywgYnVpbGRhYmxlLCBzdHIocmV2ZGVwcyksIHNlbGYucnFkYXRhLmdldF91c2VyX2lkc3RyaW5nKHNlbGYucnFkYXRhLnJ1bnFfc2V0c2NlbmVbdGFza10pKSkKKworICAgICAgICAjIENvbnZlcnQgc2NlbmVxdWV1ZV9jb3ZlcmVkIHRhc2sgbnVtYmVycyBpbnRvIGZ1bGwgdGFza2dyYXBoIGlkcworICAgICAgICBvbGRjb3ZlcmVkID0gc2VsZi5zY2VuZXF1ZXVlX2NvdmVyZWQKKyAgICAgICAgc2VsZi5ycS5zY2VuZXF1ZXVlX2NvdmVyZWQgPSBzZXQoKQorICAgICAgICBmb3IgdGFzayBpbiBvbGRjb3ZlcmVkOgorICAgICAgICAgICAgc2VsZi5ycS5zY2VuZXF1ZXVlX2NvdmVyZWQuYWRkKHNlbGYucnFkYXRhLnJ1bnFfc2V0c2NlbmVbdGFza10pCisgICAgICAgIHNlbGYucnEuc2NlbmVxdWV1ZV9ub3Rjb3ZlcmVkID0gc2V0KCkKKyAgICAgICAgZm9yIHRhc2sgaW4gc2VsZi5zY2VuZXF1ZXVlX25vdGNvdmVyZWQ6CisgICAgICAgICAgICBzZWxmLnJxLnNjZW5lcXVldWVfbm90Y292ZXJlZC5hZGQoc2VsZi5ycWRhdGEucnVucV9zZXRzY2VuZVt0YXNrXSkKKworICAgICAgICBsb2dnZXIuZGVidWcoMSwgJ1dlIGNhbiBza2lwIHRhc2tzICVzJywgc29ydGVkKHNlbGYucnEuc2NlbmVxdWV1ZV9jb3ZlcmVkKSkKKworICAgICAgICBzZWxmLnJxLnN0YXRlID0gcnVuUXVldWVSdW5Jbml0CisKKyAgICAgICAgY29tcGxldGVldmVudCA9IHNjZW5lUXVldWVDb21wbGV0ZShzZWxmLnN0YXRzLCBzZWxmLnJxKQorICAgICAgICBiYi5ldmVudC5maXJlKGNvbXBsZXRlZXZlbnQsIHNlbGYuY2ZnRGF0YSkKKworICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHJ1bnF1ZXVlX3Byb2Nlc3Nfd2FpdHBpZChzZWxmLCB0YXNrLCBzdGF0dXMpOgorICAgICAgICB0YXNrID0gc2VsZi5ycS5ycWRhdGEucnVucV9zZXRzY2VuZS5pbmRleCh0YXNrKQorCisgICAgICAgIFJ1blF1ZXVlRXhlY3V0ZS5ydW5xdWV1ZV9wcm9jZXNzX3dhaXRwaWQoc2VsZiwgdGFzaywgc3RhdHVzKQorCitjbGFzcyBUYXNrRmFpbHVyZShFeGNlcHRpb24pOgorICAgICIiIgorICAgIEV4Y2VwdGlvbiByYWlzZWQgd2hlbiBhIHRhc2sgaW4gYSBydW5xdWV1ZSBmYWlscworICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4KToKKyAgICAgICAgc2VsZi5hcmdzID0geAorCisKK2NsYXNzIHJ1blF1ZXVlRXhpdFdhaXQoYmIuZXZlbnQuRXZlbnQpOgorICAgICIiIgorICAgIEV2ZW50IHdoZW4gd2FpdGluZyBmb3IgdGFzayBwcm9jZXNzZXMgdG8gZXhpdAorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlbWFpbik6CisgICAgICAgIHNlbGYucmVtYWluID0gcmVtYWluCisgICAgICAgIHNlbGYubWVzc2FnZSA9ICJXYWl0aW5nIGZvciAlcyBhY3RpdmUgdGFza3MgdG8gZmluaXNoIiAlIHJlbWFpbgorICAgICAgICBiYi5ldmVudC5FdmVudC5fX2luaXRfXyhzZWxmKQorCitjbGFzcyBydW5RdWV1ZUV2ZW50KGJiLmV2ZW50LkV2ZW50KToKKyAgICAiIiIKKyAgICBCYXNlIHJ1blF1ZXVlIGV2ZW50IGNsYXNzCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRhc2ssIHN0YXRzLCBycSk6CisgICAgICAgIHNlbGYudGFza2lkID0gdGFzaworICAgICAgICBzZWxmLnRhc2tzdHJpbmcgPSBycS5ycWRhdGEuZ2V0X3VzZXJfaWRzdHJpbmcodGFzaykKKyAgICAgICAgc2VsZi50YXNrbmFtZSA9IHJxLnJxZGF0YS5nZXRfdGFza19uYW1lKHRhc2spCisgICAgICAgIHNlbGYudGFza2ZpbGUgPSBycS5ycWRhdGEuZ2V0X3Rhc2tfZmlsZSh0YXNrKQorICAgICAgICBzZWxmLnRhc2toYXNoID0gcnEucnFkYXRhLmdldF90YXNrX2hhc2godGFzaykKKyAgICAgICAgc2VsZi5zdGF0cyA9IHN0YXRzLmNvcHkoKQorICAgICAgICBiYi5ldmVudC5FdmVudC5fX2luaXRfXyhzZWxmKQorCitjbGFzcyBzY2VuZVF1ZXVlRXZlbnQocnVuUXVldWVFdmVudCk6CisgICAgIiIiCisgICAgQmFzZSBzY2VuZVF1ZXVlIGV2ZW50IGNsYXNzCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRhc2ssIHN0YXRzLCBycSwgbm9leGVjPUZhbHNlKToKKyAgICAgICAgcnVuUXVldWVFdmVudC5fX2luaXRfXyhzZWxmLCB0YXNrLCBzdGF0cywgcnEpCisgICAgICAgIHJlYWx0YXNrID0gcnEucnFkYXRhLnJ1bnFfc2V0c2NlbmVbdGFza10KKyAgICAgICAgc2VsZi50YXNrc3RyaW5nID0gcnEucnFkYXRhLmdldF91c2VyX2lkc3RyaW5nKHJlYWx0YXNrLCAiX3NldHNjZW5lIikKKyAgICAgICAgc2VsZi50YXNrbmFtZSA9IHJxLnJxZGF0YS5nZXRfdGFza19uYW1lKHJlYWx0YXNrKSArICJfc2V0c2NlbmUiCisgICAgICAgIHNlbGYudGFza2ZpbGUgPSBycS5ycWRhdGEuZ2V0X3Rhc2tfZmlsZShyZWFsdGFzaykKKyAgICAgICAgc2VsZi50YXNraGFzaCA9IHJxLnJxZGF0YS5nZXRfdGFza19oYXNoKHJlYWx0YXNrKQorCitjbGFzcyBydW5RdWV1ZVRhc2tTdGFydGVkKHJ1blF1ZXVlRXZlbnQpOgorICAgICIiIgorICAgIEV2ZW50IG5vdGlmeWluZyBhIHRhc2sgd2FzIHN0YXJ0ZWQKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGFzaywgc3RhdHMsIHJxLCBub2V4ZWM9RmFsc2UpOgorICAgICAgICBydW5RdWV1ZUV2ZW50Ll9faW5pdF9fKHNlbGYsIHRhc2ssIHN0YXRzLCBycSkKKyAgICAgICAgc2VsZi5ub2V4ZWMgPSBub2V4ZWMKKworY2xhc3Mgc2NlbmVRdWV1ZVRhc2tTdGFydGVkKHNjZW5lUXVldWVFdmVudCk6CisgICAgIiIiCisgICAgRXZlbnQgbm90aWZ5aW5nIGEgc2V0c2NlbmUgdGFzayB3YXMgc3RhcnRlZAorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0YXNrLCBzdGF0cywgcnEsIG5vZXhlYz1GYWxzZSk6CisgICAgICAgIHNjZW5lUXVldWVFdmVudC5fX2luaXRfXyhzZWxmLCB0YXNrLCBzdGF0cywgcnEpCisgICAgICAgIHNlbGYubm9leGVjID0gbm9leGVjCisKK2NsYXNzIHJ1blF1ZXVlVGFza0ZhaWxlZChydW5RdWV1ZUV2ZW50KToKKyAgICAiIiIKKyAgICBFdmVudCBub3RpZnlpbmcgYSB0YXNrIGZhaWxlZAorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0YXNrLCBzdGF0cywgZXhpdGNvZGUsIHJxKToKKyAgICAgICAgcnVuUXVldWVFdmVudC5fX2luaXRfXyhzZWxmLCB0YXNrLCBzdGF0cywgcnEpCisgICAgICAgIHNlbGYuZXhpdGNvZGUgPSBleGl0Y29kZQorCitjbGFzcyBzY2VuZVF1ZXVlVGFza0ZhaWxlZChzY2VuZVF1ZXVlRXZlbnQpOgorICAgICIiIgorICAgIEV2ZW50IG5vdGlmeWluZyBhIHNldHNjZW5lIHRhc2sgZmFpbGVkCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRhc2ssIHN0YXRzLCBleGl0Y29kZSwgcnEpOgorICAgICAgICBzY2VuZVF1ZXVlRXZlbnQuX19pbml0X18oc2VsZiwgdGFzaywgc3RhdHMsIHJxKQorICAgICAgICBzZWxmLmV4aXRjb2RlID0gZXhpdGNvZGUKKworY2xhc3Mgc2NlbmVRdWV1ZUNvbXBsZXRlKHNjZW5lUXVldWVFdmVudCk6CisgICAgIiIiCisgICAgRXZlbnQgd2hlbiBhbGwgdGhlIHNjZW5lUXVldWUgdGFza3MgYXJlIGNvbXBsZXRlCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0YXRzLCBycSk6CisgICAgICAgIHNlbGYuc3RhdHMgPSBzdGF0cy5jb3B5KCkKKyAgICAgICAgYmIuZXZlbnQuRXZlbnQuX19pbml0X18oc2VsZikKKworY2xhc3MgcnVuUXVldWVUYXNrQ29tcGxldGVkKHJ1blF1ZXVlRXZlbnQpOgorICAgICIiIgorICAgIEV2ZW50IG5vdGlmeWluZyBhIHRhc2sgY29tcGxldGVkCisgICAgIiIiCisKK2NsYXNzIHNjZW5lUXVldWVUYXNrQ29tcGxldGVkKHNjZW5lUXVldWVFdmVudCk6CisgICAgIiIiCisgICAgRXZlbnQgbm90aWZ5aW5nIGEgc2V0c2NlbmUgdGFzayBjb21wbGV0ZWQKKyAgICAiIiIKKworY2xhc3MgcnVuUXVldWVUYXNrU2tpcHBlZChydW5RdWV1ZUV2ZW50KToKKyAgICAiIiIKKyAgICBFdmVudCBub3RpZnlpbmcgYSB0YXNrIHdhcyBza2lwcGVkCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRhc2ssIHN0YXRzLCBycSwgcmVhc29uKToKKyAgICAgICAgcnVuUXVldWVFdmVudC5fX2luaXRfXyhzZWxmLCB0YXNrLCBzdGF0cywgcnEpCisgICAgICAgIHNlbGYucmVhc29uID0gcmVhc29uCisKK2NsYXNzIHJ1blF1ZXVlUGlwZSgpOgorICAgICIiIgorICAgIEFic3RyYWN0aW9uIGZvciBhIHBpcGUgYmV0d2VlbiBhIHdvcmtlciB0aHJlYWQgYW5kIHRoZSBzZXJ2ZXIKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGlwZWluLCBwaXBlb3V0LCBkLCBycSwgcnFleGVjKToKKyAgICAgICAgc2VsZi5pbnB1dCA9IHBpcGVpbgorICAgICAgICBpZiBwaXBlb3V0OgorICAgICAgICAgICAgcGlwZW91dC5jbG9zZSgpCisgICAgICAgIGJiLnV0aWxzLm5vbmJsb2NraW5nZmQoc2VsZi5pbnB1dCkKKyAgICAgICAgc2VsZi5xdWV1ZSA9ICIiCisgICAgICAgIHNlbGYuZCA9IGQKKyAgICAgICAgc2VsZi5ycSA9IHJxCisgICAgICAgIHNlbGYucnFleGVjID0gcnFleGVjCisKKyAgICBkZWYgc2V0cnVucXVldWVleGVjKHNlbGYsIHJxZXhlYyk6CisgICAgICAgIHNlbGYucnFleGVjID0gcnFleGVjCisKKyAgICBkZWYgcmVhZChzZWxmKToKKyAgICAgICAgZm9yIHcgaW4gW3NlbGYucnEud29ya2VyLCBzZWxmLnJxLmZha2V3b3JrZXJdOgorICAgICAgICAgICAgaWYgbm90IHc6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHcucG9sbCgpCisgICAgICAgICAgICBpZiB3LnJldHVybmNvZGUgaXMgbm90IE5vbmUgYW5kIG5vdCBzZWxmLnJxLnRlYXJkb3duOgorICAgICAgICAgICAgICAgIG5hbWUgPSBOb25lCisgICAgICAgICAgICAgICAgaWYgc2VsZi5ycS53b3JrZXIgYW5kIHcucGlkID09IHNlbGYucnEud29ya2VyLnBpZDoKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJXb3JrZXIiCisgICAgICAgICAgICAgICAgZWxpZiBzZWxmLnJxLmZha2V3b3JrZXIgYW5kIHcucGlkID09IHNlbGYucnEuZmFrZXdvcmtlci5waWQ6CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiRmFrZXJvb3QiCisgICAgICAgICAgICAgICAgYmIuZXJyb3IoIiVzIHByb2Nlc3MgKCVzKSBleGl0ZWQgdW5leHBlY3RlZGx5ICglcyksIHNodXR0aW5nIGRvd24uLi4iICUgKG5hbWUsIHcucGlkLCBzdHIody5yZXR1cm5jb2RlKSkpCisgICAgICAgICAgICAgICAgc2VsZi5ycS5maW5pc2hfcnVucXVldWUoVHJ1ZSkKKworICAgICAgICBzdGFydCA9IGxlbihzZWxmLnF1ZXVlKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnF1ZXVlID0gc2VsZi5xdWV1ZSArIHNlbGYuaW5wdXQucmVhZCgxMDI0MDApCisgICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvcikgYXMgZToKKyAgICAgICAgICAgIGlmIGUuZXJybm8gIT0gZXJybm8uRUFHQUlOOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGVuZCA9IGxlbihzZWxmLnF1ZXVlKQorICAgICAgICBmb3VuZCA9IFRydWUKKyAgICAgICAgd2hpbGUgZm91bmQgYW5kIGxlbihzZWxmLnF1ZXVlKToKKyAgICAgICAgICAgIGZvdW5kID0gRmFsc2UKKyAgICAgICAgICAgIGluZGV4ID0gc2VsZi5xdWV1ZS5maW5kKCI8L2V2ZW50PiIpCisgICAgICAgICAgICB3aGlsZSBpbmRleCAhPSAtMSBhbmQgc2VsZi5xdWV1ZS5zdGFydHN3aXRoKCI8ZXZlbnQ+Iik6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBldmVudCA9IHBpY2tsZS5sb2FkcyhzZWxmLnF1ZXVlWzc6aW5kZXhdKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgICAgIGJiLm1zZy5mYXRhbCgiUnVuUXVldWUiLCAiZmFpbGVkIGxvYWQgcGlja2xlICclcyc6ICclcyciICUgKGUsIHNlbGYucXVldWVbNzppbmRleF0pKQorICAgICAgICAgICAgICAgIGJiLmV2ZW50LmZpcmVfZnJvbV93b3JrZXIoZXZlbnQsIHNlbGYuZCkKKyAgICAgICAgICAgICAgICBmb3VuZCA9IFRydWUKKyAgICAgICAgICAgICAgICBzZWxmLnF1ZXVlID0gc2VsZi5xdWV1ZVtpbmRleCs4Ol0KKyAgICAgICAgICAgICAgICBpbmRleCA9IHNlbGYucXVldWUuZmluZCgiPC9ldmVudD4iKQorICAgICAgICAgICAgaW5kZXggPSBzZWxmLnF1ZXVlLmZpbmQoIjwvZXhpdGNvZGU+IikKKyAgICAgICAgICAgIHdoaWxlIGluZGV4ICE9IC0xIGFuZCBzZWxmLnF1ZXVlLnN0YXJ0c3dpdGgoIjxleGl0Y29kZT4iKToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHRhc2ssIHN0YXR1cyA9IHBpY2tsZS5sb2FkcyhzZWxmLnF1ZXVlWzEwOmluZGV4XSkKKyAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBlOgorICAgICAgICAgICAgICAgICAgICBiYi5tc2cuZmF0YWwoIlJ1blF1ZXVlIiwgImZhaWxlZCBsb2FkIHBpY2tsZSAnJXMnOiAnJXMnIiAlIChlLCBzZWxmLnF1ZXVlWzEwOmluZGV4XSkpCisgICAgICAgICAgICAgICAgc2VsZi5ycWV4ZWMucnVucXVldWVfcHJvY2Vzc193YWl0cGlkKHRhc2ssIHN0YXR1cykKKyAgICAgICAgICAgICAgICBmb3VuZCA9IFRydWUKKyAgICAgICAgICAgICAgICBzZWxmLnF1ZXVlID0gc2VsZi5xdWV1ZVtpbmRleCsxMTpdCisgICAgICAgICAgICAgICAgaW5kZXggPSBzZWxmLnF1ZXVlLmZpbmQoIjwvZXhpdGNvZGU+IikKKyAgICAgICAgcmV0dXJuIChlbmQgPiBzdGFydCkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgd2hpbGUgc2VsZi5yZWFkKCk6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBpZiBsZW4oc2VsZi5xdWV1ZSkgPiAwOgorICAgICAgICAgICAgcHJpbnQoIldhcm5pbmcsIHdvcmtlciBsZWZ0IHBhcnRpYWwgbWVzc2FnZTogJXMiICUgc2VsZi5xdWV1ZSkKKyAgICAgICAgc2VsZi5pbnB1dC5jbG9zZSgpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9zZXJ2ZXIvX19pbml0X18ucHkgYi9iaXRiYWtlL2xpYi9iYi9zZXJ2ZXIvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE1ZTQ4MAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3NlcnZlci9fX2luaXRfXy5weQpAQCAtMCwwICsxLDk2IEBACisjCisjIEJpdEJha2UgQmFzZSBTZXJ2ZXIgQ29kZQorIworIyBDb3B5cmlnaHQgKEMpIDIwMDYgLSAyMDA3ICBNaWNoYWVsICdNaWNrZXknIExhdWVyCisjIENvcHlyaWdodCAoQykgMjAwNiAtIDIwMDggIFJpY2hhcmQgUHVyZGllCisjIENvcHlyaWdodCAoQykgMjAxMyAgICAgICAgIEFsZXhhbmRydSBEYW1pYW4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKyIiIiBCYXNlIGNvZGUgZm9yIEJpdGJha2Ugc2VydmVyIHByb2Nlc3MKKworSGF2ZSBhIGNvbW1vbiBiYXNlIGZvciB0aGF0IGFsbCBCaXRiYWtlIHNlcnZlciBjbGFzc2VzIGVuc3VyZXMgYSBjb25zaXN0ZW50CithcHByb2FjaCB0byB0aGUgaW50ZXJmYWNlLCBhbmQgbWluaW1pemUgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGNvZGUgZHVwbGljYXRpb24uCisKKyIiIgorCisiIiIgIEJhc2VJbXBsU2VydmVyKCkgdGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBYWFNlcnZlcigpIGltcGxlbWVudGF0aW9ucy4KKworICAgIFRoZXNlIGNsYXNzZXMgY29udGFpbiB0aGUgYWN0dWFsIGNvZGUgdGhhdCBydW5zIHRoZSBzZXJ2ZXIgc2lkZSwgaS5lLgorICAgIGxpc3RlbnMgZm9yIHRoZSBjb21tYW5kcyBhbmQgZXhlY3V0ZXMgdGhlbS4gQWx0aG91Z2ggdGhlc2UgaW1wbGVtZW50YXRpb25zCisgICAgY29udGFpbiBhbGwgdGhlIGRhdGEgb2YgdGhlIG9yaWdpbmFsIGJpdGJha2UgY29tbWFuZCwgaS5lIHRoZSBjb29rZXIgaW5zdGFuY2UsCisgICAgdGhleSBtYXkgd2VsbCBydW4gb24gYSBkaWZmZXJlbnQgcHJvY2VzcyBvciBldmVuIG1hY2hpbmUuCisKKyIiIgorCitjbGFzcyBCYXNlSW1wbFNlcnZlcigpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5faWRsZWZ1bnMgPSB7fQorCisgICAgZGVmIGFkZGNvb2tlcihzZWxmLCBjb29rZXIpOgorICAgICAgICBzZWxmLmNvb2tlciA9IGNvb2tlcgorCisgICAgZGVmIHJlZ2lzdGVyX2lkbGVfZnVuY3Rpb24oc2VsZiwgZnVuY3Rpb24sIGRhdGEpOgorICAgICAgICAiIiJSZWdpc3RlciBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGlsZSB0aGUgc2VydmVyIGlzIGlkbGUiIiIKKyAgICAgICAgYXNzZXJ0IGhhc2F0dHIoZnVuY3Rpb24sICdfX2NhbGxfXycpCisgICAgICAgIHNlbGYuX2lkbGVmdW5zW2Z1bmN0aW9uXSA9IGRhdGEKKworCisKKyIiIiBCaXRCYWtlQmFzZVNlcnZlckNvbm5lY3Rpb24gY2xhc3MgaXMgdGhlIGNvbW1vbiBhbmNlc3RvciB0byBhbGwKKyAgICBCaXRCYWtlU2VydmVyQ29ubmVjdGlvbiBjbGFzc2VzLgorCisgICAgVGhlc2UgY2xhc3NlcyBjb250cm9sIHRoZSByZW1vdGUgc2VydmVyLiBUaGUgb25seSBjb21tYW5kIGN1cnJlbnRseQorICAgIGltcGxlbWVudGVkIGlzIHRoZSB0ZXJtaW5hdGUoKSBjb21tYW5kLgorCisiIiIKKworY2xhc3MgQml0QmFrZUJhc2VTZXJ2ZXJDb25uZWN0aW9uKCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcnZlckltcGwpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVybWluYXRlKHNlbGYpOgorICAgICAgICBwYXNzCisKKworIiIiIEJpdEJha2VCYXNlU2VydmVyIGNsYXNzIGlzIHRoZSBjb21tb24gYW5jZXN0b3IgdG8gYWxsIEJpdGJha2Ugc2VydmVycworCisgICAgRGVyaXZlIHRoaXMgY2xhc3MgaW4gb3JkZXIgdG8gaW1wbGVtZW50IGEgQml0QmFrZVNlcnZlciB3aGljaCBpcyB0aGUKKyAgICBjb250cm9sbGluZyBzdHViIGZvciB0aGUgYWN0dWFsIHNlcnZlciBpbXBsZW1lbnRhdGlvbgorCisiIiIKK2NsYXNzIEJpdEJha2VCYXNlU2VydmVyKG9iamVjdCk6CisgICAgZGVmIGluaXRTZXJ2ZXIoc2VsZik6CisgICAgICAgIHNlbGYuc2VydmVySW1wbCA9IE5vbmUgICMgd2UgZW5zdXJlIGEgcnVudGltZSBjcmFzaCBpZiBub3Qgb3ZlcmxvYWRlZAorICAgICAgICBzZWxmLmNvbm5lY3Rpb24gPSBOb25lCisgICAgICAgIHJldHVybgorCisgICAgZGVmIGFkZGNvb2tlcihzZWxmLCBjb29rZXIpOgorICAgICAgICBzZWxmLmNvb2tlciA9IGNvb2tlcgorICAgICAgICBzZWxmLnNlcnZlckltcGwuYWRkY29va2VyKGNvb2tlcikKKworICAgIGRlZiBnZXRTZXJ2ZXJJZGxlQ0Ioc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnNlcnZlckltcGwucmVnaXN0ZXJfaWRsZV9mdW5jdGlvbgorCisgICAgZGVmIHNhdmVDb25uZWN0aW9uRGV0YWlscyhzZWxmKToKKyAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgZGV0YWNoKHNlbGYpOgorICAgICAgICByZXR1cm4KKworICAgIGRlZiBlc3RhYmxpc2hDb25uZWN0aW9uKHNlbGYsIGZlYXR1cmVzZXQpOgorICAgICAgICByYWlzZSAgICJNdXN0IHJlZGVmaW5lIHRoZSAlcy5lc3RhYmxpc2hDb25uZWN0aW9uKCkiICUgc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKworICAgIGRlZiBlbmRTZXNzaW9uKHNlbGYpOgorICAgICAgICBzZWxmLmNvbm5lY3Rpb24udGVybWluYXRlKCkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3NlcnZlci9wcm9jZXNzLnB5IGIvYml0YmFrZS9saWIvYmIvc2VydmVyL3Byb2Nlc3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZjYTM1MAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3NlcnZlci9wcm9jZXNzLnB5CkBAIC0wLDAgKzEsMjY0IEBACisjCisjIEJpdEJha2UgUHJvY2VzcyBiYXNlZCBzZXJ2ZXIuCisjCisjIENvcHlyaWdodCAoQykgMjAxMCBCb2IgRm9lcnN0ZXIgPHJvYmVydEBlcmFmeC5jb20+CisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCisiIiIKKyAgICBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIGEgbXVsdGlwcm9jZXNzaW5nLlByb2Nlc3MgYmFzZWQgc2VydmVyIGZvciBiaXRiYWtlLgorIiIiCisKK2ltcG9ydCBiYgoraW1wb3J0IGJiLmV2ZW50CitpbXBvcnQgaXRlcnRvb2xzCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG11bHRpcHJvY2Vzc2luZworaW1wb3J0IG9zCitpbXBvcnQgc2lnbmFsCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQoraW1wb3J0IHNlbGVjdAorZnJvbSBRdWV1ZSBpbXBvcnQgRW1wdHkKK2Zyb20gbXVsdGlwcm9jZXNzaW5nIGltcG9ydCBFdmVudCwgUHJvY2VzcywgdXRpbCwgUXVldWUsIFBpcGUsIHF1ZXVlcywgTWFuYWdlcgorCitmcm9tIC4gaW1wb3J0IEJpdEJha2VCYXNlU2VydmVyLCBCaXRCYWtlQmFzZVNlcnZlckNvbm5lY3Rpb24sIEJhc2VJbXBsU2VydmVyCisKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCdCaXRCYWtlJykKKworY2xhc3MgU2VydmVyQ29tbXVuaWNhdG9yKCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbm5lY3Rpb24sIGV2ZW50X2hhbmRsZSwgc2VydmVyKToKKyAgICAgICAgc2VsZi5jb25uZWN0aW9uID0gY29ubmVjdGlvbgorICAgICAgICBzZWxmLmV2ZW50X2hhbmRsZSA9IGV2ZW50X2hhbmRsZQorICAgICAgICBzZWxmLnNlcnZlciA9IHNlcnZlcgorCisgICAgZGVmIHJ1bkNvbW1hbmQoc2VsZiwgY29tbWFuZCk6CisgICAgICAgICMgQHRvZG8gdHJ5L2V4Y2VwdAorICAgICAgICBzZWxmLmNvbm5lY3Rpb24uc2VuZChjb21tYW5kKQorCisgICAgICAgIGlmIG5vdCBzZWxmLnNlcnZlci5pc19hbGl2ZSgpOgorICAgICAgICAgICAgcmFpc2UgU3lzdGVtRXhpdAorCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAjIGRvbid0IGxldCB0aGUgdXNlciBjdHJsLWMgd2hpbGUgd2UncmUgd2FpdGluZyBmb3IgYSByZXNwb25zZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlmIHNlbGYuY29ubmVjdGlvbi5wb2xsKDIwKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29ubmVjdGlvbi5yZWN2KCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBiYi5mYXRhbCgiVGltZW91dCB3aGlsZSBhdHRlbXB0aW5nIHRvIGNvbW11bmljYXRlIHdpdGggYml0YmFrZSBzZXJ2ZXIiKQorICAgICAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBnZXRFdmVudEhhbmRsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZXZlbnRfaGFuZGxlLnZhbHVlCisKK2NsYXNzIEV2ZW50QWRhcHRlcigpOgorICAgICIiIgorICAgIEFkYXB0ZXIgdG8gd3JhcCBvdXIgZXZlbnQgcXVldWUgc2luY2UgdGhlIGNhbGxlciAoYmIuZXZlbnQpIGV4cGVjdHMgdG8KKyAgICBjYWxsIGEgc2VuZCgpIG1ldGhvZCwgYnV0IG91ciBhY3R1YWwgcXVldWUgb25seSBoYXMgcHV0KCkKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcXVldWUpOgorICAgICAgICBzZWxmLnF1ZXVlID0gcXVldWUKKworICAgIGRlZiBzZW5kKHNlbGYsIGV2ZW50KToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5xdWV1ZS5wdXQoZXZlbnQpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXJyOgorICAgICAgICAgICAgcHJpbnQoIkV2ZW50QWRhcHRlciBwdWtlZDogJXMiICUgc3RyKGVycikpCisKKworY2xhc3MgUHJvY2Vzc1NlcnZlcihQcm9jZXNzLCBCYXNlSW1wbFNlcnZlcik6CisgICAgcHJvZmlsZV9maWxlbmFtZSA9ICJwcm9maWxlLmxvZyIKKyAgICBwcm9maWxlX3Byb2Nlc3NlZF9maWxlbmFtZSA9ICJwcm9maWxlLmxvZy5wcm9jZXNzZWQiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29tbWFuZF9jaGFubmVsLCBldmVudF9xdWV1ZSwgZmVhdHVyZWxpc3QpOgorICAgICAgICBCYXNlSW1wbFNlcnZlci5fX2luaXRfXyhzZWxmKQorICAgICAgICBQcm9jZXNzLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuY29tbWFuZF9jaGFubmVsID0gY29tbWFuZF9jaGFubmVsCisgICAgICAgIHNlbGYuZXZlbnRfcXVldWUgPSBldmVudF9xdWV1ZQorICAgICAgICBzZWxmLmV2ZW50ID0gRXZlbnRBZGFwdGVyKGV2ZW50X3F1ZXVlKQorICAgICAgICBzZWxmLmZlYXR1cmVsaXN0ID0gZmVhdHVyZWxpc3QKKyAgICAgICAgc2VsZi5xdWl0ID0gRmFsc2UKKworICAgICAgICBzZWxmLnF1aXRpbiwgc2VsZi5xdWl0b3V0ID0gUGlwZSgpCisgICAgICAgIHNlbGYuZXZlbnRfaGFuZGxlID0gbXVsdGlwcm9jZXNzaW5nLlZhbHVlKCJpIikKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIGZvciBldmVudCBpbiBiYi5ldmVudC51aV9xdWV1ZToKKyAgICAgICAgICAgIHNlbGYuZXZlbnRfcXVldWUucHV0KGV2ZW50KQorICAgICAgICBzZWxmLmV2ZW50X2hhbmRsZS52YWx1ZSA9IGJiLmV2ZW50LnJlZ2lzdGVyX1VJSGhhbmRsZXIoc2VsZiwgVHJ1ZSkKKworICAgICAgICBiYi5jb29rZXIuc2VydmVyX21haW4oc2VsZi5jb29rZXIsIHNlbGYubWFpbikKKworICAgIGRlZiBtYWluKHNlbGYpOgorICAgICAgICAjIElnbm9yZSBTSUdJTlQgd2l0aGluIHRoZSBzZXJ2ZXIsIGFzIGFsbCBTSUdJTlQgaGFuZGxpbmcgaXMgZG9uZSBieQorICAgICAgICAjIHRoZSBVSSBhbmQgY29tbXVuaWNhdGVkIHRvIHVzCisgICAgICAgIHNlbGYucXVpdGluLmNsb3NlKCkKKyAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHSU5ULCBzaWduYWwuU0lHX0lHTikKKyAgICAgICAgd2hpbGUgbm90IHNlbGYucXVpdDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmNvbW1hbmRfY2hhbm5lbC5wb2xsKCk6CisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgPSBzZWxmLmNvbW1hbmRfY2hhbm5lbC5yZWN2KCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5ydW5Db21tYW5kKGNvbW1hbmQpCisgICAgICAgICAgICAgICAgaWYgc2VsZi5xdWl0b3V0LnBvbGwoKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5xdWl0b3V0LnJlY3YoKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnF1aXQgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucnVuQ29tbWFuZChbInN0YXRlRm9yY2VTaHV0ZG93biJdKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgICAgICBzZWxmLmlkbGVfY29tbWFuZHMoLjEsIFtzZWxmLmNvbW1hbmRfY2hhbm5lbCwgc2VsZi5xdWl0b3V0XSkKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbignUnVubmluZyBjb21tYW5kICVzJywgY29tbWFuZCkKKworICAgICAgICBzZWxmLmV2ZW50X3F1ZXVlLmNsb3NlKCkKKyAgICAgICAgYmIuZXZlbnQudW5yZWdpc3Rlcl9VSUhoYW5kbGVyKHNlbGYuZXZlbnRfaGFuZGxlLnZhbHVlKQorICAgICAgICBzZWxmLmNvbW1hbmRfY2hhbm5lbC5jbG9zZSgpCisgICAgICAgIHNlbGYuY29va2VyLnNodXRkb3duKFRydWUpCisgICAgICAgIHNlbGYucXVpdG91dC5jbG9zZSgpCisKKyAgICBkZWYgaWRsZV9jb21tYW5kcyhzZWxmLCBkZWxheSwgZmRzPU5vbmUpOgorICAgICAgICBuZXh0c2xlZXAgPSBkZWxheQorICAgICAgICBpZiBub3QgZmRzOgorICAgICAgICAgICAgZmRzID0gW10KKworICAgICAgICBmb3IgZnVuY3Rpb24sIGRhdGEgaW4gc2VsZi5faWRsZWZ1bnMuaXRlbXMoKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR2YWwgPSBmdW5jdGlvbihzZWxmLCBkYXRhLCBGYWxzZSkKKyAgICAgICAgICAgICAgICBpZiByZXR2YWwgaXMgRmFsc2U6CisgICAgICAgICAgICAgICAgICAgIGRlbCBzZWxmLl9pZGxlZnVuc1tmdW5jdGlvbl0KKyAgICAgICAgICAgICAgICAgICAgbmV4dHNsZWVwID0gTm9uZQorICAgICAgICAgICAgICAgIGVsaWYgcmV0dmFsIGlzIFRydWU6CisgICAgICAgICAgICAgICAgICAgIG5leHRzbGVlcCA9IE5vbmUKKyAgICAgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UocmV0dmFsLCBmbG9hdCk6CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPCBuZXh0c2xlZXApOgorICAgICAgICAgICAgICAgICAgICAgICAgbmV4dHNsZWVwID0gcmV0dmFsCisgICAgICAgICAgICAgICAgZWxpZiBuZXh0c2xlZXAgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBmZHMgPSBmZHMgKyByZXR2YWwKKyAgICAgICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0OgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoKKyAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShleGMsIGJiLkJCSGFuZGxlZEV4Y2VwdGlvbik6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oJ1J1bm5pbmcgaWRsZSBmdW5jdGlvbicpCisgICAgICAgICAgICAgICAgZGVsIHNlbGYuX2lkbGVmdW5zW2Z1bmN0aW9uXQorICAgICAgICAgICAgICAgIHNlbGYucXVpdCA9IFRydWUKKworICAgICAgICBpZiBuZXh0c2xlZXAgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxlY3Quc2VsZWN0KGZkcyxbXSxbXSxuZXh0c2xlZXApCisKKyAgICBkZWYgcnVuQ29tbWFuZChzZWxmLCBjb21tYW5kKToKKyAgICAgICAgIiIiCisgICAgICAgIFJ1biBhIGNvb2tlciBjb21tYW5kIG9uIHRoZSBzZXJ2ZXIKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY29tbWFuZF9jaGFubmVsLnNlbmQoc2VsZi5jb29rZXIuY29tbWFuZC5ydW5Db21tYW5kKGNvbW1hbmQpKQorCisgICAgZGVmIHN0b3Aoc2VsZik6CisgICAgICAgIHNlbGYucXVpdGluLnNlbmQoInF1aXQiKQorICAgICAgICBzZWxmLnF1aXRpbi5jbG9zZSgpCisKK2NsYXNzIEJpdEJha2VQcm9jZXNzU2VydmVyQ29ubmVjdGlvbihCaXRCYWtlQmFzZVNlcnZlckNvbm5lY3Rpb24pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXJ2ZXJJbXBsLCB1aV9jaGFubmVsLCBldmVudF9xdWV1ZSk6CisgICAgICAgIHNlbGYucHJvY3NlcnZlciA9IHNlcnZlckltcGwKKyAgICAgICAgc2VsZi51aV9jaGFubmVsID0gdWlfY2hhbm5lbAorICAgICAgICBzZWxmLmV2ZW50X3F1ZXVlID0gZXZlbnRfcXVldWUKKyAgICAgICAgc2VsZi5jb25uZWN0aW9uID0gU2VydmVyQ29tbXVuaWNhdG9yKHNlbGYudWlfY2hhbm5lbCwgc2VsZi5wcm9jc2VydmVyLmV2ZW50X2hhbmRsZSwgc2VsZi5wcm9jc2VydmVyKQorICAgICAgICBzZWxmLmV2ZW50cyA9IHNlbGYuZXZlbnRfcXVldWUKKyAgICAgICAgc2VsZi50ZXJtaW5hdGVkID0gRmFsc2UKKworICAgIGRlZiBzaWd0ZXJtX3Rlcm1pbmF0ZShzZWxmKToKKyAgICAgICAgYmIuZXJyb3IoIlVJIHJlY2VpdmVkIFNJR1RFUk0iKQorICAgICAgICBzZWxmLnRlcm1pbmF0ZSgpCisKKyAgICBkZWYgdGVybWluYXRlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnRlcm1pbmF0ZWQ6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi50ZXJtaW5hdGVkID0gVHJ1ZQorICAgICAgICBkZWYgZmx1c2hldmVudHMoKToKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBldmVudCA9IHNlbGYuZXZlbnRfcXVldWUuZ2V0KGJsb2NrPUZhbHNlKQorICAgICAgICAgICAgICAgIGV4Y2VwdCAoRW1wdHksIElPRXJyb3IpOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGxvZ2dpbmcuTG9nUmVjb3JkKToKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmhhbmRsZShldmVudCkKKworICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdJTlQsIHNpZ25hbC5TSUdfSUdOKQorICAgICAgICBzZWxmLnByb2NzZXJ2ZXIuc3RvcCgpCisKKyAgICAgICAgd2hpbGUgc2VsZi5wcm9jc2VydmVyLmlzX2FsaXZlKCk6CisgICAgICAgICAgICBmbHVzaGV2ZW50cygpCisgICAgICAgICAgICBzZWxmLnByb2NzZXJ2ZXIuam9pbigwLjEpCisKKyAgICAgICAgc2VsZi51aV9jaGFubmVsLmNsb3NlKCkKKyAgICAgICAgc2VsZi5ldmVudF9xdWV1ZS5jbG9zZSgpCisgICAgICAgIHNlbGYuZXZlbnRfcXVldWUuc2V0ZXhpdCgpCisKKyMgV3JhcCBRdWV1ZSB0byBwcm92aWRlIEFQSSB3aGljaCBpc24ndCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMKK2NsYXNzIFByb2Nlc3NFdmVudFF1ZXVlKG11bHRpcHJvY2Vzc2luZy5xdWV1ZXMuUXVldWUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXhzaXplKToKKyAgICAgICAgbXVsdGlwcm9jZXNzaW5nLnF1ZXVlcy5RdWV1ZS5fX2luaXRfXyhzZWxmLCBtYXhzaXplKQorICAgICAgICBzZWxmLmV4aXQgPSBGYWxzZQorCisgICAgZGVmIHNldGV4aXQoc2VsZik6CisgICAgICAgIHNlbGYuZXhpdCA9IFRydWUKKworICAgIGRlZiB3YWl0RXZlbnQoc2VsZiwgdGltZW91dCk6CisgICAgICAgIGlmIHNlbGYuZXhpdDoKKyAgICAgICAgICAgIHN5cy5leGl0KDEpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLnNlcnZlci5pc19hbGl2ZSgpOgorICAgICAgICAgICAgICAgIHNlbGYuc2V0ZXhpdCgpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmdldChUcnVlLCB0aW1lb3V0KQorICAgICAgICBleGNlcHQgRW1wdHk6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIGdldEV2ZW50KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5zZXJ2ZXIuaXNfYWxpdmUoKToKKyAgICAgICAgICAgICAgICBzZWxmLnNldGV4aXQoKQorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICByZXR1cm4gc2VsZi5nZXQoRmFsc2UpCisgICAgICAgIGV4Y2VwdCBFbXB0eToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKworY2xhc3MgQml0QmFrZVNlcnZlcihCaXRCYWtlQmFzZVNlcnZlcik6CisgICAgZGVmIGluaXRTZXJ2ZXIoc2VsZik6CisgICAgICAgICMgZXN0YWJsaXNoIGNvbW11bmljYXRpb24gY2hhbm5lbHMuICBXZSB1c2UgYmlkaXJlY3Rpb25hbCBwaXBlcyBmb3IKKyAgICAgICAgIyB1aSA8LS0+IHNlcnZlciBjb21tYW5kL3Jlc3BvbnNlIHBhaXJzCisgICAgICAgICMgYW5kIGEgcXVldWUgZm9yIHNlcnZlciAtPiB1aSBldmVudCBub3RpZmljYXRpb25zCisgICAgICAgICMKKyAgICAgICAgc2VsZi51aV9jaGFubmVsLCBzZWxmLnNlcnZlcl9jaGFubmVsID0gUGlwZSgpCisgICAgICAgIHNlbGYuZXZlbnRfcXVldWUgPSBQcm9jZXNzRXZlbnRRdWV1ZSgwKQorICAgICAgICBzZWxmLnNlcnZlckltcGwgPSBQcm9jZXNzU2VydmVyKHNlbGYuc2VydmVyX2NoYW5uZWwsIHNlbGYuZXZlbnRfcXVldWUsIE5vbmUpCisgICAgICAgIHNlbGYuZXZlbnRfcXVldWUuc2VydmVyID0gc2VsZi5zZXJ2ZXJJbXBsCisKKyAgICBkZWYgZGV0YWNoKHNlbGYpOgorICAgICAgICBzZWxmLnNlcnZlckltcGwuc3RhcnQoKQorICAgICAgICByZXR1cm4KKworICAgIGRlZiBlc3RhYmxpc2hDb25uZWN0aW9uKHNlbGYsIGZlYXR1cmVzZXQpOgorCisgICAgICAgIHNlbGYuY29ubmVjdGlvbiA9IEJpdEJha2VQcm9jZXNzU2VydmVyQ29ubmVjdGlvbihzZWxmLnNlcnZlckltcGwsIHNlbGYudWlfY2hhbm5lbCwgc2VsZi5ldmVudF9xdWV1ZSkKKworICAgICAgICBfLCBlcnJvciA9IHNlbGYuY29ubmVjdGlvbi5jb25uZWN0aW9uLnJ1bkNvbW1hbmQoWyJzZXRGZWF0dXJlcyIsIGZlYXR1cmVzZXRdKQorICAgICAgICBpZiBlcnJvcjoKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiVW5hYmxlIHRvIHNldCB0aGUgY29va2VyIHRvIHRoZSBjb3JyZWN0IGZlYXR1cmVzZXQ6ICVzIiAlIGVycm9yKQorICAgICAgICAgICAgcmFpc2UgQmFzZUV4Y2VwdGlvbihlcnJvcikKKyAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHVEVSTSwgbGFtYmRhIGksIHM6IHNlbGYuY29ubmVjdGlvbi5zaWd0ZXJtX3Rlcm1pbmF0ZSgpKQorICAgICAgICByZXR1cm4gc2VsZi5jb25uZWN0aW9uCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9zZXJ2ZXIveG1scnBjLnB5IGIvYml0YmFrZS9saWIvYmIvc2VydmVyL3htbHJwYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzY0N2MxCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvc2VydmVyL3htbHJwYy5weQpAQCAtMCwwICsxLDM5MiBAQAorIworIyBCaXRCYWtlIFhNTFJQQyBTZXJ2ZXIKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA2IC0gMjAwNyAgTWljaGFlbCAnTWlja2V5JyBMYXVlcgorIyBDb3B5cmlnaHQgKEMpIDIwMDYgLSAyMDA4ICBSaWNoYXJkIFB1cmRpZQorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworIiIiCisgICAgVGhpcyBtb2R1bGUgaW1wbGVtZW50cyBhbiB4bWxycGMgc2VydmVyIGZvciBCaXRCYWtlLgorCisgICAgVXNlIHRoaXMgYnkgZGVyaXZpbmcgYSBjbGFzcyBmcm9tIEJpdEJha2VYTUxSUENTZXJ2ZXIgYW5kIHRoZW4gYWRkaW5nCisgICAgbWV0aG9kcyB3aGljaCB5b3Ugd2FudCB0byAiZXhwb3J0IiB2aWEgWE1MUlBDLiBJZiB0aGUgbWV0aG9kcyBoYXZlIHRoZQorICAgIHByZWZpeCB4bWxycGNfLCB0aGVuIHJlZ2lzdGVyaW5nIHRob3NlIGZ1bmN0aW9uIHdpbGwgaGFwcGVuIGF1dG9tYXRpY2FsbHksCisgICAgaWYgbm90LCB5b3UgbmVlZCB0byBjYWxsIHJlZ2lzdGVyX2Z1bmN0aW9uLgorCisgICAgVXNlIHJlZ2lzdGVyX2lkbGVfZnVuY3Rpb24oKSB0byBhZGQgYSBmdW5jdGlvbiB3aGljaCB0aGUgeG1scnBjIHNlcnZlcgorICAgIGNhbGxzIGZyb20gd2l0aGluIHNlcnZlcl9mb3JldmVyIHdoZW4gbm8gcmVxdWVzdHMgYXJlIHBlbmRpbmcuIE1ha2Ugc3VyZQorICAgIHRoYXQgdGhvc2UgZnVuY3Rpb25zIGFyZSBub24tYmxvY2tpbmcgb3IgZWxzZSB5b3Ugd2lsbCBpbnRyb2R1Y2UgbGF0ZW5jeQorICAgIGluIHRoZSBzZXJ2ZXIncyBtYWluIGxvb3AuCisiIiIKKworaW1wb3J0IGJiCitpbXBvcnQgeG1scnBjbGliLCBzeXMKK2Zyb20gYmIgaW1wb3J0IGRhZW1vbml6ZQorZnJvbSBiYi51aSBpbXBvcnQgdWlldmVudAoraW1wb3J0IGhhc2hsaWIsIHRpbWUKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBvcywgc2lnbmFsCitpbXBvcnQgdGhyZWFkaW5nCit0cnk6CisgICAgaW1wb3J0IGNQaWNrbGUgYXMgcGlja2xlCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgaW1wb3J0IHBpY2tsZQorCitERUJVRyA9IEZhbHNlCisKK2Zyb20gU2ltcGxlWE1MUlBDU2VydmVyIGltcG9ydCBTaW1wbGVYTUxSUENTZXJ2ZXIsIFNpbXBsZVhNTFJQQ1JlcXVlc3RIYW5kbGVyCitpbXBvcnQgaW5zcGVjdCwgc2VsZWN0LCBodHRwbGliCisKK2Zyb20gLiBpbXBvcnQgQml0QmFrZUJhc2VTZXJ2ZXIsIEJpdEJha2VCYXNlU2VydmVyQ29ubmVjdGlvbiwgQmFzZUltcGxTZXJ2ZXIKKworY2xhc3MgQkJUcmFuc3BvcnQoeG1scnBjbGliLlRyYW5zcG9ydCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRpbWVvdXQpOgorICAgICAgICBzZWxmLnRpbWVvdXQgPSB0aW1lb3V0CisgICAgICAgIHNlbGYuY29ubmVjdGlvbl90b2tlbiA9IE5vbmUKKyAgICAgICAgeG1scnBjbGliLlRyYW5zcG9ydC5fX2luaXRfXyhzZWxmKQorCisgICAgIyBNb2RpZmllZCBmcm9tIGRlZmF1bHQgdG8gcGFzcyB0aW1lb3V0IHRvIEhUVFBDb25uZWN0aW9uCisgICAgZGVmIG1ha2VfY29ubmVjdGlvbihzZWxmLCBob3N0KToKKyAgICAgICAgI3JldHVybiBhbiBleGlzdGluZyBjb25uZWN0aW9uIGlmIHBvc3NpYmxlLiAgVGhpcyBhbGxvd3MKKyAgICAgICAgI0hUVFAvMS4xIGtlZXAtYWxpdmUuCisgICAgICAgIGlmIHNlbGYuX2Nvbm5lY3Rpb24gYW5kIGhvc3QgPT0gc2VsZi5fY29ubmVjdGlvblswXToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9jb25uZWN0aW9uWzFdCisKKyAgICAgICAgIyBjcmVhdGUgYSBIVFRQIGNvbm5lY3Rpb24gb2JqZWN0IGZyb20gYSBob3N0IGRlc2NyaXB0b3IKKyAgICAgICAgY2hvc3QsIHNlbGYuX2V4dHJhX2hlYWRlcnMsIHg1MDkgPSBzZWxmLmdldF9ob3N0X2luZm8oaG9zdCkKKyAgICAgICAgI3N0b3JlIHRoZSBob3N0IGFyZ3VtZW50IGFsb25nIHdpdGggdGhlIGNvbm5lY3Rpb24gb2JqZWN0CisgICAgICAgIHNlbGYuX2Nvbm5lY3Rpb24gPSBob3N0LCBodHRwbGliLkhUVFBDb25uZWN0aW9uKGNob3N0LCB0aW1lb3V0PXNlbGYudGltZW91dCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX2Nvbm5lY3Rpb25bMV0KKworICAgIGRlZiBzZXRfY29ubmVjdGlvbl90b2tlbihzZWxmLCB0b2tlbik6CisgICAgICAgIHNlbGYuY29ubmVjdGlvbl90b2tlbiA9IHRva2VuCisKKyAgICBkZWYgc2VuZF9jb250ZW50KHNlbGYsIGgsIGJvZHkpOgorICAgICAgICBpZiBzZWxmLmNvbm5lY3Rpb25fdG9rZW46CisgICAgICAgICAgICBoLnB1dGhlYWRlcigiQml0YmFrZS10b2tlbiIsIHNlbGYuY29ubmVjdGlvbl90b2tlbikKKyAgICAgICAgeG1scnBjbGliLlRyYW5zcG9ydC5zZW5kX2NvbnRlbnQoc2VsZiwgaCwgYm9keSkKKworZGVmIF9jcmVhdGVfc2VydmVyKGhvc3QsIHBvcnQsIHRpbWVvdXQgPSA2MCk6CisgICAgdCA9IEJCVHJhbnNwb3J0KHRpbWVvdXQpCisgICAgcyA9IHhtbHJwY2xpYi5TZXJ2ZXJQcm94eSgiaHR0cDovLyVzOiVkLyIgJSAoaG9zdCwgcG9ydCksIHRyYW5zcG9ydD10LCBhbGxvd19ub25lPVRydWUpCisgICAgcmV0dXJuIHMsIHQKKworY2xhc3MgQml0QmFrZVNlcnZlckNvbW1hbmRzKCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2VydmVyKToKKyAgICAgICAgc2VsZi5zZXJ2ZXIgPSBzZXJ2ZXIKKyAgICAgICAgc2VsZi5oYXNfY2xpZW50ID0gRmFsc2UKKworICAgIGRlZiByZWdpc3RlckV2ZW50SGFuZGxlcihzZWxmLCBob3N0LCBwb3J0KToKKyAgICAgICAgIiIiCisgICAgICAgIFJlZ2lzdGVyIGEgcmVtb3RlIFVJIEV2ZW50IEhhbmRsZXIKKyAgICAgICAgIiIiCisgICAgICAgIHMsIHQgPSBfY3JlYXRlX3NlcnZlcihob3N0LCBwb3J0KQorCisgICAgICAgICMgd2UgZG9uJ3QgYWxsb3cgY29ubmVjdGlvbnMgaWYgdGhlIGNvb2tlciBpcyBydW5uaW5nCisgICAgICAgIGlmIChzZWxmLmNvb2tlci5zdGF0ZSBpbiBbYmIuY29va2VyLnN0YXRlLnBhcnNpbmcsIGJiLmNvb2tlci5zdGF0ZS5ydW5uaW5nXSk6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIHNlbGYuZXZlbnRfaGFuZGxlID0gYmIuZXZlbnQucmVnaXN0ZXJfVUlIaGFuZGxlcihzLCBUcnVlKQorICAgICAgICByZXR1cm4gc2VsZi5ldmVudF9oYW5kbGUKKworICAgIGRlZiB1bnJlZ2lzdGVyRXZlbnRIYW5kbGVyKHNlbGYsIGhhbmRsZXJOdW0pOgorICAgICAgICAiIiIKKyAgICAgICAgVW5yZWdpc3RlciBhIHJlbW90ZSBVSSBFdmVudCBIYW5kbGVyCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gYmIuZXZlbnQudW5yZWdpc3Rlcl9VSUhoYW5kbGVyKGhhbmRsZXJOdW0pCisKKyAgICBkZWYgcnVuQ29tbWFuZChzZWxmLCBjb21tYW5kKToKKyAgICAgICAgIiIiCisgICAgICAgIFJ1biBhIGNvb2tlciBjb21tYW5kIG9uIHRoZSBzZXJ2ZXIKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLmNvb2tlci5jb21tYW5kLnJ1bkNvbW1hbmQoY29tbWFuZCwgc2VsZi5zZXJ2ZXIucmVhZG9ubHkpCisKKyAgICBkZWYgZ2V0RXZlbnRIYW5kbGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmV2ZW50X2hhbmRsZQorCisgICAgZGVmIHRlcm1pbmF0ZVNlcnZlcihzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFRyaWdnZXIgdGhlIHNlcnZlciB0byBxdWl0CisgICAgICAgICIiIgorICAgICAgICBzZWxmLnNlcnZlci5xdWl0ID0gVHJ1ZQorICAgICAgICBwcmludCgiU2VydmVyIChjb29rZXIpIGV4aXRpbmciKQorICAgICAgICByZXR1cm4KKworICAgIGRlZiBhZGRDbGllbnQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuaGFzX2NsaWVudDoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHRva2VuID0gaGFzaGxpYi5tZDUoc3RyKHRpbWUudGltZSgpKSkuaGV4ZGlnZXN0KCkKKyAgICAgICAgc2VsZi5zZXJ2ZXIuc2V0X2Nvbm5lY3Rpb25fdG9rZW4odG9rZW4pCisgICAgICAgIHNlbGYuaGFzX2NsaWVudCA9IFRydWUKKyAgICAgICAgcmV0dXJuIHRva2VuCisKKyAgICBkZWYgcmVtb3ZlQ2xpZW50KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmhhc19jbGllbnQ6CisgICAgICAgICAgICBzZWxmLnNlcnZlci5zZXRfY29ubmVjdGlvbl90b2tlbihOb25lKQorICAgICAgICAgICAgc2VsZi5oYXNfY2xpZW50ID0gRmFsc2UKKyAgICAgICAgICAgIGlmIHNlbGYuc2VydmVyLnNpbmdsZV91c2U6CisgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXIucXVpdCA9IFRydWUKKworIyBUaGlzIHJlcXVlc3QgaGFuZGxlciBjaGVja3MgaWYgdGhlIHJlcXVlc3QgaGFzIGEgIkJpdGJha2UtdG9rZW4iIGhlYWRlcgorIyBmaWVsZCAodGhpcyBjb21lcyBmcm9tIHRoZSBjbGllbnQgc2lkZSkgYW5kIGNvbXBhcmVzIGl0IHdpdGggaXRzIGludGVybmFsCisjICJCaXRiYWtlLXRva2VuIiBmaWVsZCAodGhpcyBjb21lcyBmcm9tIHRoZSBzZXJ2ZXIpLiBJZiB0aGUgdHdvIGFyZSBub3QKKyMgZXF1YWwsIGl0IGlzIGFzc3VtZWQgdGhhdCBhIGNsaWVudCBpcyB0cnlpbmcgdG8gY29ubmVjdCB0byB0aGUgc2VydmVyCisjIHdoaWxlIGFub3RoZXIgY2xpZW50IGlzIGNvbm5lY3RlZCB0byB0aGUgc2VydmVyLiBJbiB0aGlzIGNhc2UsIGEgNTAzIGVycm9yCisjICgic2VydmljZSB1bmF2YWlsYWJsZSIpIGlzIHJldHVybmVkIHRvIHRoZSBjbGllbnQuCitjbGFzcyBCaXRCYWtlWE1MUlBDUmVxdWVzdEhhbmRsZXIoU2ltcGxlWE1MUlBDUmVxdWVzdEhhbmRsZXIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZXF1ZXN0LCBjbGllbnRfYWRkcmVzcywgc2VydmVyKToKKyAgICAgICAgc2VsZi5zZXJ2ZXIgPSBzZXJ2ZXIKKyAgICAgICAgU2ltcGxlWE1MUlBDUmVxdWVzdEhhbmRsZXIuX19pbml0X18oc2VsZiwgcmVxdWVzdCwgY2xpZW50X2FkZHJlc3MsIHNlcnZlcikKKworICAgIGRlZiBkb19QT1NUKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZW1vdGVfdG9rZW4gPSBzZWxmLmhlYWRlcnNbIkJpdGJha2UtdG9rZW4iXQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICByZW1vdGVfdG9rZW4gPSBOb25lCisgICAgICAgIGlmIHJlbW90ZV90b2tlbiAhPSBzZWxmLnNlcnZlci5jb25uZWN0aW9uX3Rva2VuIGFuZCByZW1vdGVfdG9rZW4gIT0gIm9ic2VydmVyIjoKKyAgICAgICAgICAgIHNlbGYucmVwb3J0XzUwMygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiByZW1vdGVfdG9rZW4gPT0gIm9ic2VydmVyIjoKKyAgICAgICAgICAgICAgICBzZWxmLnNlcnZlci5yZWFkb25seSA9IFRydWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXIucmVhZG9ubHkgPSBGYWxzZQorICAgICAgICAgICAgU2ltcGxlWE1MUlBDUmVxdWVzdEhhbmRsZXIuZG9fUE9TVChzZWxmKQorCisgICAgZGVmIHJlcG9ydF81MDMoc2VsZik6CisgICAgICAgIHNlbGYuc2VuZF9yZXNwb25zZSg1MDMpCisgICAgICAgIHJlc3BvbnNlID0gJ05vIG1vcmUgY2xpZW50IGFsbG93ZWQnCisgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoIkNvbnRlbnQtdHlwZSIsICJ0ZXh0L3BsYWluIikKKyAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiQ29udGVudC1sZW5ndGgiLCBzdHIobGVuKHJlc3BvbnNlKSkpCisgICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQorICAgICAgICBzZWxmLndmaWxlLndyaXRlKHJlc3BvbnNlKQorCisKK2NsYXNzIFhNTFJQQ1Byb3h5U2VydmVyKEJhc2VJbXBsU2VydmVyKToKKyAgICAiIiIgbm90IGEgcmVhbCB3b3JraW5nIHNlcnZlciwgYnV0IGEgc3R1YiBmb3IgYSBwcm94eSBzZXJ2ZXIgY29ubmVjdGlvbgorCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3QsIHBvcnQpOgorICAgICAgICBzZWxmLmhvc3QgPSBob3N0CisgICAgICAgIHNlbGYucG9ydCA9IHBvcnQKKworY2xhc3MgWE1MUlBDU2VydmVyKFNpbXBsZVhNTFJQQ1NlcnZlciwgQmFzZUltcGxTZXJ2ZXIpOgorICAgICMgcmVtb3ZlIHRoaXMgd2hlbiB5b3UncmUgZG9uZSB3aXRoIGRlYnVnZ2luZworICAgICMgYWxsb3dfcmV1c2VfYWRkcmVzcyA9IFRydWUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbnRlcmZhY2UpOgorICAgICAgICAiIiIKKyAgICAgICAgQ29uc3RydWN0b3IKKyAgICAgICAgIiIiCisgICAgICAgIEJhc2VJbXBsU2VydmVyLl9faW5pdF9fKHNlbGYpCisgICAgICAgIGlmIChpbnRlcmZhY2VbMV0gPT0gMCk6ICAgICAjIGFub255bW91cyBwb3J0LCBub3QgZ2V0dGluZyByZXVzZWQKKyAgICAgICAgICAgIHNlbGYuc2luZ2xlX3VzZSA9IFRydWUKKyAgICAgICAgIyBVc2UgYXV0byBwb3J0IGNvbmZpZ3VyYXRpb24KKyAgICAgICAgaWYgKGludGVyZmFjZVsxXSA9PSAtMSk6CisgICAgICAgICAgICBpbnRlcmZhY2UgPSAoaW50ZXJmYWNlWzBdLCAwKQorICAgICAgICBTaW1wbGVYTUxSUENTZXJ2ZXIuX19pbml0X18oc2VsZiwgaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhhbmRsZXI9Qml0QmFrZVhNTFJQQ1JlcXVlc3RIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nUmVxdWVzdHM9RmFsc2UsIGFsbG93X25vbmU9VHJ1ZSkKKyAgICAgICAgc2VsZi5ob3N0LCBzZWxmLnBvcnQgPSBzZWxmLnNvY2tldC5nZXRzb2NrbmFtZSgpCisgICAgICAgIHNlbGYuY29ubmVjdGlvbl90b2tlbiA9IE5vbmUKKyAgICAgICAgI3NlbGYucmVnaXN0ZXJfaW50cm9zcGVjdGlvbl9mdW5jdGlvbnMoKQorICAgICAgICBzZWxmLmNvbW1hbmRzID0gQml0QmFrZVNlcnZlckNvbW1hbmRzKHNlbGYpCisgICAgICAgIHNlbGYuYXV0b3JlZ2lzdGVyX2FsbF9mdW5jdGlvbnMoc2VsZi5jb21tYW5kcywgIiIpCisgICAgICAgIHNlbGYuaW50ZXJmYWNlID0gaW50ZXJmYWNlCisgICAgICAgIHNlbGYuc2luZ2xlX3VzZSA9IEZhbHNlCisKKyAgICBkZWYgYWRkY29va2VyKHNlbGYsIGNvb2tlcik6CisgICAgICAgIEJhc2VJbXBsU2VydmVyLmFkZGNvb2tlcihzZWxmLCBjb29rZXIpCisgICAgICAgIHNlbGYuY29tbWFuZHMuY29va2VyID0gY29va2VyCisKKyAgICBkZWYgYXV0b3JlZ2lzdGVyX2FsbF9mdW5jdGlvbnMoc2VsZiwgY29udGV4dCwgcHJlZml4KToKKyAgICAgICAgIiIiCisgICAgICAgIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgcmVnaXN0ZXJpbmcgYWxsIGZ1bmN0aW9ucyBpbiB0aGUgc2NvcGUKKyAgICAgICAgb2YgdGhpcyBjbGFzcyB0aGF0IHN0YXJ0IHdpdGggYSBjb21tb24gcHJlZml4CisgICAgICAgICIiIgorICAgICAgICBtZXRob2RsaXN0ID0gaW5zcGVjdC5nZXRtZW1iZXJzKGNvbnRleHQsIGluc3BlY3QuaXNtZXRob2QpCisgICAgICAgIGZvciBuYW1lLCBtZXRob2QgaW4gbWV0aG9kbGlzdDoKKyAgICAgICAgICAgIGlmIG5hbWUuc3RhcnRzd2l0aChwcmVmaXgpOgorICAgICAgICAgICAgICAgIHNlbGYucmVnaXN0ZXJfZnVuY3Rpb24obWV0aG9kLCBuYW1lW2xlbihwcmVmaXgpOl0pCisKKworICAgIGRlZiBzZXJ2ZV9mb3JldmVyKHNlbGYpOgorICAgICAgICAjIFN0YXJ0IHRoZSBhY3R1YWwgWE1MUlBDIHNlcnZlcgorICAgICAgICBiYi5jb29rZXIuc2VydmVyX21haW4oc2VsZi5jb29rZXIsIHNlbGYuX3NlcnZlX2ZvcmV2ZXIpCisKKyAgICBkZWYgX3NlcnZlX2ZvcmV2ZXIoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBTZXJ2ZSBSZXF1ZXN0cy4gT3ZlcmxvYWRlZCB0byBob25vciBhIHF1aXQgY29tbWFuZAorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5xdWl0ID0gRmFsc2UKKyAgICAgICAgd2hpbGUgbm90IHNlbGYucXVpdDoKKyAgICAgICAgICAgIGZkcyA9IFtzZWxmXQorICAgICAgICAgICAgbmV4dHNsZWVwID0gMC4xCisgICAgICAgICAgICBmb3IgZnVuY3Rpb24sIGRhdGEgaW4gc2VsZi5faWRsZWZ1bnMuaXRlbXMoKToKKyAgICAgICAgICAgICAgICByZXR2YWwgPSBOb25lCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBmdW5jdGlvbihzZWxmLCBkYXRhLCBGYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgcmV0dmFsIGlzIEZhbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgZGVsIHNlbGYuX2lkbGVmdW5zW2Z1bmN0aW9uXQorICAgICAgICAgICAgICAgICAgICBlbGlmIHJldHZhbCBpcyBUcnVlOgorICAgICAgICAgICAgICAgICAgICAgICAgbmV4dHNsZWVwID0gMAorICAgICAgICAgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UocmV0dmFsLCBmbG9hdCk6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsIDwgbmV4dHNsZWVwKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0c2xlZXAgPSByZXR2YWwKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGZkcyA9IGZkcyArIHJldHZhbAorICAgICAgICAgICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0OgorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgaW1wb3J0IHRyYWNlYmFjaworICAgICAgICAgICAgICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkKKyAgICAgICAgICAgICAgICAgICAgaWYgcmV0dmFsID09IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBmdW5jdGlvbiBleGVjdXRlIGZhaWxlZDsgZGVsZXRlIGl0CisgICAgICAgICAgICAgICAgICAgICAgICBkZWwgc2VsZi5faWRsZWZ1bnNbZnVuY3Rpb25dCisgICAgICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgc29ja3RpbWVvdXQgPSBzZWxmLnNvY2tldC5nZXR0aW1lb3V0KCkgb3IgbmV4dHNsZWVwCisgICAgICAgICAgICBzb2NrdGltZW91dCA9IG1pbihzb2NrdGltZW91dCwgbmV4dHNsZWVwKQorICAgICAgICAgICAgIyBNaXJyb3Igd2hhdCBCYXNlU2VydmVyIGhhbmRsZV9yZXF1ZXN0IHdvdWxkIGRvCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZmRfc2V0cyA9IHNlbGVjdC5zZWxlY3QoZmRzLCBbXSwgW10sIHNvY2t0aW1lb3V0KQorICAgICAgICAgICAgICAgIGlmIGZkX3NldHNbMF0gYW5kIHNlbGYgaW4gZmRfc2V0c1swXToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5faGFuZGxlX3JlcXVlc3Rfbm9ibG9jaygpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICAjIHdlIGlnbm9yZSBpbnRlcnJ1cHRlZCBjYWxscworICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAjIFRlbGwgaWRsZSBmdW5jdGlvbnMgd2UncmUgZXhpdGluZworICAgICAgICBmb3IgZnVuY3Rpb24sIGRhdGEgaW4gc2VsZi5faWRsZWZ1bnMuaXRlbXMoKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR2YWwgPSBmdW5jdGlvbihzZWxmLCBkYXRhLCBUcnVlKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5zZXJ2ZXJfY2xvc2UoKQorICAgICAgICByZXR1cm4KKworICAgIGRlZiBzZXRfY29ubmVjdGlvbl90b2tlbihzZWxmLCB0b2tlbik6CisgICAgICAgIHNlbGYuY29ubmVjdGlvbl90b2tlbiA9IHRva2VuCisKK2NsYXNzIEJpdEJha2VYTUxSUENTZXJ2ZXJDb25uZWN0aW9uKEJpdEJha2VCYXNlU2VydmVyQ29ubmVjdGlvbik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcnZlckltcGwsIGNsaWVudGluZm89KCJsb2NhbGhvc3QiLCAwKSwgb2JzZXJ2ZXJfb25seSA9IEZhbHNlLCBmZWF0dXJlc2V0ID0gTm9uZSk6CisgICAgICAgIHNlbGYuY29ubmVjdGlvbiwgc2VsZi50cmFuc3BvcnQgPSBfY3JlYXRlX3NlcnZlcihzZXJ2ZXJJbXBsLmhvc3QsIHNlcnZlckltcGwucG9ydCkKKyAgICAgICAgc2VsZi5jbGllbnRpbmZvID0gY2xpZW50aW5mbworICAgICAgICBzZWxmLnNlcnZlckltcGwgPSBzZXJ2ZXJJbXBsCisgICAgICAgIHNlbGYub2JzZXJ2ZXJfb25seSA9IG9ic2VydmVyX29ubHkKKyAgICAgICAgaWYgZmVhdHVyZXNldDoKKyAgICAgICAgICAgIHNlbGYuZmVhdHVyZXNldCA9IGZlYXR1cmVzZXQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmVhdHVyZXNldCA9IFtdCisKKyAgICBkZWYgY29ubmVjdChzZWxmLCB0b2tlbiA9IE5vbmUpOgorICAgICAgICBpZiB0b2tlbiBpcyBOb25lOgorICAgICAgICAgICAgaWYgc2VsZi5vYnNlcnZlcl9vbmx5OgorICAgICAgICAgICAgICAgIHRva2VuID0gIm9ic2VydmVyIgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0b2tlbiA9IHNlbGYuY29ubmVjdGlvbi5hZGRDbGllbnQoKQorCisgICAgICAgIGlmIHRva2VuIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIHNlbGYudHJhbnNwb3J0LnNldF9jb25uZWN0aW9uX3Rva2VuKHRva2VuKQorCisgICAgICAgIHNlbGYuZXZlbnRzID0gdWlldmVudC5CQlVJRXZlbnRRdWV1ZShzZWxmLmNvbm5lY3Rpb24sIHNlbGYuY2xpZW50aW5mbykKKyAgICAgICAgZm9yIGV2ZW50IGluIGJiLmV2ZW50LnVpX3F1ZXVlOgorICAgICAgICAgICAgc2VsZi5ldmVudHMucXVldWVfZXZlbnQoZXZlbnQpCisKKyAgICAgICAgXywgZXJyb3IgPSBzZWxmLmNvbm5lY3Rpb24ucnVuQ29tbWFuZChbInNldEZlYXR1cmVzIiwgc2VsZi5mZWF0dXJlc2V0XSkKKyAgICAgICAgaWYgZXJyb3I6CisgICAgICAgICAgICAjIGRpc2Nvbm5lY3QgdGhlIGNsaWVudCwgd2UgY2FuJ3QgbWFrZSB0aGUgc2V0RmVhdHVyZSB3b3JrCisgICAgICAgICAgICBzZWxmLmNvbm5lY3Rpb24ucmVtb3ZlQ2xpZW50KCkKKyAgICAgICAgICAgICMgbm8gbmVlZCB0byBsb2cgaXQgaGVyZSwgdGhlIGVycm9yIHNoYWxsIGJlIHNlbnQgdG8gdGhlIGNsaWVudAorICAgICAgICAgICAgcmFpc2UgQmFzZUV4Y2VwdGlvbihlcnJvcikKKworICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIHJlbW92ZUNsaWVudChzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYub2JzZXJ2ZXJfb25seToKKyAgICAgICAgICAgIHNlbGYuY29ubmVjdGlvbi5yZW1vdmVDbGllbnQoKQorCisgICAgZGVmIHRlcm1pbmF0ZShzZWxmKToKKyAgICAgICAgIyBEb24ndCB3YWl0IGZvciBzZXJ2ZXIgaW5kZWZpbml0ZWx5CisgICAgICAgIGltcG9ydCBzb2NrZXQKKyAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KDIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuZXZlbnRzLnN5c3RlbV9xdWl0KCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcGFzcworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmNvbm5lY3Rpb24ucmVtb3ZlQ2xpZW50KCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcGFzcworCitjbGFzcyBCaXRCYWtlU2VydmVyKEJpdEJha2VCYXNlU2VydmVyKToKKyAgICBkZWYgaW5pdFNlcnZlcihzZWxmLCBpbnRlcmZhY2UgPSAoImxvY2FsaG9zdCIsIDApKToKKyAgICAgICAgc2VsZi5pbnRlcmZhY2UgPSBpbnRlcmZhY2UKKyAgICAgICAgc2VsZi5zZXJ2ZXJJbXBsID0gWE1MUlBDU2VydmVyKGludGVyZmFjZSkKKworICAgIGRlZiBkZXRhY2goc2VsZik6CisgICAgICAgIGRhZW1vbml6ZS5jcmVhdGVEYWVtb24oc2VsZi5zZXJ2ZXJJbXBsLnNlcnZlX2ZvcmV2ZXIsICJiaXRiYWtlLWNvb2tlcmRhZW1vbi5sb2ciKQorICAgICAgICBkZWwgc2VsZi5jb29rZXIKKworICAgIGRlZiBlc3RhYmxpc2hDb25uZWN0aW9uKHNlbGYsIGZlYXR1cmVzZXQpOgorICAgICAgICBzZWxmLmNvbm5lY3Rpb24gPSBCaXRCYWtlWE1MUlBDU2VydmVyQ29ubmVjdGlvbihzZWxmLnNlcnZlckltcGwsIHNlbGYuaW50ZXJmYWNlLCBGYWxzZSwgZmVhdHVyZXNldCkKKyAgICAgICAgcmV0dXJuIHNlbGYuY29ubmVjdGlvbi5jb25uZWN0KCkKKworICAgIGRlZiBzZXRfY29ubmVjdGlvbl90b2tlbihzZWxmLCB0b2tlbik6CisgICAgICAgIHNlbGYuY29ubmVjdGlvbi50cmFuc3BvcnQuc2V0X2Nvbm5lY3Rpb25fdG9rZW4odG9rZW4pCisKK2NsYXNzIEJpdEJha2VYTUxSUENDbGllbnQoQml0QmFrZUJhc2VTZXJ2ZXIpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9ic2VydmVyX29ubHkgPSBGYWxzZSwgdG9rZW4gPSBOb25lKToKKyAgICAgICAgc2VsZi50b2tlbiA9IHRva2VuCisKKyAgICAgICAgc2VsZi5vYnNlcnZlcl9vbmx5ID0gb2JzZXJ2ZXJfb25seQorICAgICAgICAjIGlmIHdlIG5lZWQgZXh0cmEgY2FjaGVzLCBqdXN0IHRlbGwgdGhlIHNlcnZlciB0byBsb2FkIHRoZW0gYWxsCisgICAgICAgIHBhc3MKKworICAgIGRlZiBzYXZlQ29ubmVjdGlvbkRldGFpbHMoc2VsZiwgcmVtb3RlKToKKyAgICAgICAgc2VsZi5yZW1vdGUgPSByZW1vdGUKKworICAgIGRlZiBlc3RhYmxpc2hDb25uZWN0aW9uKHNlbGYsIGZlYXR1cmVzZXQpOgorICAgICAgICAjIFRoZSBmb3JtYXQgb2YgInJlbW90ZSIgbXVzdCBiZSAic2VydmVyOnBvcnQiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIFtob3N0LCBwb3J0XSA9IHNlbGYucmVtb3RlLnNwbGl0KCI6IikKKyAgICAgICAgICAgIHBvcnQgPSBpbnQocG9ydCkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgYmIud2FybigiRmFpbGVkIHRvIHJlYWQgcmVtb3RlIGRlZmluaXRpb24gKCVzKSIgJSBzdHIoZSkpCisgICAgICAgICAgICByYWlzZSBlCisKKyAgICAgICAgIyBXZSBuZWVkIG91ciBJUCBmb3IgdGhlIHNlcnZlciBjb25uZWN0aW9uLiBXZSBnZXQgdGhlIElQCisgICAgICAgICMgYnkgdHJ5aW5nIHRvIGNvbm5lY3Qgd2l0aCB0aGUgc2VydmVyCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19ER1JBTSkKKyAgICAgICAgICAgIHMuY29ubmVjdCgoaG9zdCwgcG9ydCkpCisgICAgICAgICAgICBpcCA9IHMuZ2V0c29ja25hbWUoKVswXQorICAgICAgICAgICAgcy5jbG9zZSgpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgIGJiLndhcm4oIkNvdWxkIG5vdCBjcmVhdGUgc29ja2V0IGZvciAlczolcyAoJXMpIiAlIChob3N0LCBwb3J0LCBzdHIoZSkpKQorICAgICAgICAgICAgcmFpc2UgZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnNlcnZlckltcGwgPSBYTUxSUENQcm94eVNlcnZlcihob3N0LCBwb3J0KQorICAgICAgICAgICAgc2VsZi5jb25uZWN0aW9uID0gQml0QmFrZVhNTFJQQ1NlcnZlckNvbm5lY3Rpb24oc2VsZi5zZXJ2ZXJJbXBsLCAoaXAsIDApLCBzZWxmLm9ic2VydmVyX29ubHksIGZlYXR1cmVzZXQpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5jb25uZWN0aW9uLmNvbm5lY3Qoc2VsZi50b2tlbikKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgYmIud2FybigiQ291bGQgbm90IGNvbm5lY3QgdG8gc2VydmVyIGF0ICVzOiVzICglcykiICUgKGhvc3QsIHBvcnQsIHN0cihlKSkpCisgICAgICAgICAgICByYWlzZSBlCisKKyAgICBkZWYgZW5kU2Vzc2lvbihzZWxmKToKKyAgICAgICAgc2VsZi5jb25uZWN0aW9uLnJlbW92ZUNsaWVudCgpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9zaGVsbC5weSBiL2JpdGJha2UvbGliL2JiL3NoZWxsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZDhkNTQKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9zaGVsbC5weQpAQCAtMCwwICsxLDgyMCBAQAorIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IE1pY2hhZWwgJ01pY2tleScgTGF1ZXIgPG1pY2tleUBWYW5pbGxlLmRlPgorIyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBWYW5pbGxlIE1lZGlhCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgVGhhbmtzIHRvOgorIyAqIEhvbGdlciBGcmV5dGhlciA8emVja2VAaGFuZGhlbGRzLm9yZz4KKyMgKiBKdXN0aW4gUGF0cmluIDxwYXBlcmNyYW5lQHJldmVyc2Vmb2xkLmNvbT4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyIiIgorQml0QmFrZSBTaGVsbAorCitJREVBUzoKKyAgICAqIGxpc3QgZGVmaW5lZCB0YXNrcyBwZXIgcGFja2FnZQorICAgICogbGlzdCBjbGFzc2VzCisgICAgKiB0b2dnbGUgZm9yY2UKKyAgICAqIGNvbW1hbmQgdG8gcmVwYXJzZSBqdXN0IG9uZSAob3IgbW9yZSkgYmJmaWxlKHMpCisgICAgKiBhdXRvbWF0aWMgY2hlY2sgaWYgcmVwYXJzaW5nIGlzIG5lY2Vzc2FyeSAoaW5vdGlmeT8pCisgICAgKiBmcm9udGVuZCBmb3IgYmIgZmlsZSBtYW5pcHVsYXRpb24KKyAgICAqIG1vcmUgc2hlbGwtbGlrZSBmZWF0dXJlczoKKyAgICAgICAgLSBvdXRwdXQgY29udHJvbCwgaS5lLiBwaXBlIG91dHB1dCBpbnRvIGdyZXAsIHNvcnQsIGV0Yy4KKyAgICAgICAgLSBqb2IgY29udHJvbCwgaS5lLiBicmluZyBydW5uaW5nIGNvbW1hbmRzIGludG8gYmFja2dyb3VuZCBhbmQgZm9yZWdyb3VuZAorICAgICogc3RhcnQgcGFyc2luZyBpbiBiYWNrZ3JvdW5kIHJpZ2h0IGFmdGVyIHN0YXJ0dXAKKyAgICAqIG5jdXJzZXMgaW50ZXJmYWNlCisKK1BST0JMRU1TOgorICAgICogZm9yY2UgZG9lc24ndCBhbHdheXMgd29yaworICAgICogcmVhZGxpbmUgY29tcGxldGlvbiBmb3IgY29tbWFuZHMgd2l0aCBtb3JlIHRoYW4gb25lIHBhcmFtZXRlcnMKKworIiIiCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEltcG9ydCBhbmQgc2V0dXAgZ2xvYmFsIHZhcmlhYmxlcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHJlZHVjZQordHJ5OgorICAgIHNldAorZXhjZXB0IE5hbWVFcnJvcjoKKyAgICBmcm9tIHNldHMgaW1wb3J0IFNldCBhcyBzZXQKK2ltcG9ydCBzeXMsIG9zLCByZWFkbGluZSwgc29ja2V0LCBodHRwbGliLCB1cmxsaWIsIGNvbW1hbmRzLCBwb3BlbjIsIHNobGV4LCBRdWV1ZSwgZm5tYXRjaAorZnJvbSBiYiBpbXBvcnQgZGF0YSwgcGFyc2UsIGJ1aWxkLCBjYWNoZSwgdGFza2RhdGEsIHJ1bnF1ZXVlLCBwcm92aWRlcnMgYXMgUHJvdmlkZXJzCisKK19fdmVyc2lvbl9fID0gIjAuNS4zLjEiCitfX2NyZWRpdHNfXyA9ICIiIkJpdEJha2UgU2hlbGwgVmVyc2lvbiAlcyAoQykgMjAwNSBNaWNoYWVsICdNaWNrZXknIExhdWVyIDxtaWNrZXlAVmFuaWxsZS5kZT4KK1R5cGUgJ2hlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLCBwcmVzcyBDVFJMLUQgdG8gZXhpdC4iIiIgJSBfX3ZlcnNpb25fXworCitjbWRzID0ge30KK2xlYXZlX21haW5sb29wID0gRmFsc2UKK2xhc3RfZXhjZXB0aW9uID0gTm9uZQorY29va2VyID0gTm9uZQorcGFyc2VkID0gRmFsc2UKK2RlYnVnID0gb3MuZW52aXJvbi5nZXQoICJCQlNIRUxMX0RFQlVHIiwgIiIgKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDbGFzcyBCaXRCYWtlU2hlbGxDb21tYW5kcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworY2xhc3MgQml0QmFrZVNoZWxsQ29tbWFuZHM6CisgICAgIiIiVGhpcyBjbGFzcyBjb250YWlucyB0aGUgdmFsaWQgY29tbWFuZHMgZm9yIHRoZSBzaGVsbCIiIgorCisgICAgZGVmIF9faW5pdF9fKCBzZWxmLCBzaGVsbCApOgorICAgICAgICAiIiJSZWdpc3RlciBhbGwgdGhlIGNvbW1hbmRzIiIiCisgICAgICAgIHNlbGYuX3NoZWxsID0gc2hlbGwKKyAgICAgICAgZm9yIGF0dHIgaW4gQml0QmFrZVNoZWxsQ29tbWFuZHMuX19kaWN0X186CisgICAgICAgICAgICBpZiBub3QgYXR0ci5zdGFydHN3aXRoKCAiXyIgKToKKyAgICAgICAgICAgICAgICBpZiBhdHRyLmVuZHN3aXRoKCAiXyIgKToKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZCA9IGF0dHJbOi0xXS5sb3dlcigpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZCA9IGF0dHJbOl0ubG93ZXIoKQorICAgICAgICAgICAgICAgIG1ldGhvZCA9IGdldGF0dHIoIEJpdEJha2VTaGVsbENvbW1hbmRzLCBhdHRyICkKKyAgICAgICAgICAgICAgICBkZWJ1Z091dCggInJlZ2lzdGVyaW5nIGNvbW1hbmQgJyVzJyIgJSBjb21tYW5kICkKKyAgICAgICAgICAgICAgICAjIHNjYW4gbnVtYmVyIG9mIGFyZ3VtZW50cworICAgICAgICAgICAgICAgIHVzYWdlID0gZ2V0YXR0ciggbWV0aG9kLCAidXNhZ2UiLCAiIiApCisgICAgICAgICAgICAgICAgaWYgdXNhZ2UgIT0gIjwuLi4+IjoKKyAgICAgICAgICAgICAgICAgICAgbnVtQXJncyA9IGxlbiggdXNhZ2Uuc3BsaXQoKSApCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbnVtQXJncyA9IC0xCisgICAgICAgICAgICAgICAgc2hlbGwucmVnaXN0ZXJDb21tYW5kKCBjb21tYW5kLCBtZXRob2QsIG51bUFyZ3MsICIlcyAlcyIgJSAoIGNvbW1hbmQsIHVzYWdlICksIG1ldGhvZC5fX2RvY19fICkKKworICAgIGRlZiBfY2hlY2tQYXJzZWQoIHNlbGYgKToKKyAgICAgICAgaWYgbm90IHBhcnNlZDoKKyAgICAgICAgICAgIHByaW50KCJTSEVMTDogVGhpcyBjb21tYW5kIG5lZWRzIHRvIHBhcnNlIGJiZmlsZXMuLi4iKQorICAgICAgICAgICAgc2VsZi5wYXJzZSggTm9uZSApCisKKyAgICBkZWYgX2ZpbmRQcm92aWRlciggc2VsZiwgaXRlbSApOgorICAgICAgICBzZWxmLl9jaGVja1BhcnNlZCgpCisgICAgICAgICMgTmVlZCB0byB1c2UgdGFza0RhdGEgZm9yIHRoaXMgaW5mb3JtYXRpb24KKyAgICAgICAgcHJlZmVycmVkID0gZGF0YS5nZXRWYXIoICJQUkVGRVJSRURfUFJPVklERVJfJXMiICUgaXRlbSwgY29va2VyLmNvbmZpZ3VyYXRpb24uZGF0YSwgMSApCisgICAgICAgIGlmIG5vdCBwcmVmZXJyZWQ6IHByZWZlcnJlZCA9IGl0ZW0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbHYsIGxmLCBwdiwgcGYgPSBQcm92aWRlcnMuZmluZEJlc3RQcm92aWRlcihwcmVmZXJyZWQsIGNvb2tlci5jb25maWd1cmF0aW9uLmRhdGEsIGNvb2tlci5zdGF0dXMpCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIGlmIGl0ZW0gaW4gY29va2VyLnN0YXR1cy5wcm92aWRlcnM6CisgICAgICAgICAgICAgICAgcGYgPSBjb29rZXIuc3RhdHVzLnByb3ZpZGVyc1tpdGVtXVswXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwZiA9IE5vbmUKKyAgICAgICAgcmV0dXJuIHBmCisKKyAgICBkZWYgYWxpYXMoIHNlbGYsIHBhcmFtcyApOgorICAgICAgICAiIiJSZWdpc3RlciBhIG5ldyBuYW1lIGZvciBhIGNvbW1hbmQiIiIKKyAgICAgICAgbmV3LCBvbGQgPSBwYXJhbXMKKyAgICAgICAgaWYgbm90IG9sZCBpbiBjbWRzOgorICAgICAgICAgICAgcHJpbnQoIkVSUk9SOiBDb21tYW5kICclcycgbm90IGtub3duIiAlIG9sZCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNtZHNbbmV3XSA9IGNtZHNbb2xkXQorICAgICAgICAgICAgcHJpbnQoIk9LIikKKyAgICBhbGlhcy51c2FnZSA9ICI8YWxpYXM+IDxjb21tYW5kPiIKKworICAgIGRlZiBidWZmZXIoIHNlbGYsIHBhcmFtcyApOgorICAgICAgICAiIiJEdW1wIHNwZWNpZmllZCBvdXRwdXQgYnVmZmVyIiIiCisgICAgICAgIGluZGV4ID0gcGFyYW1zWzBdCisgICAgICAgIHByaW50KHNlbGYuX3NoZWxsLm15b3V0LmJ1ZmZlciggaW50KCBpbmRleCApICkpCisgICAgYnVmZmVyLnVzYWdlID0gIjxpbmRleD4iCisKKyAgICBkZWYgYnVmZmVycyggc2VsZiwgcGFyYW1zICk6CisgICAgICAgICIiIlNob3cgdGhlIGF2YWlsYWJsZSBvdXRwdXQgYnVmZmVycyIiIgorICAgICAgICBjb21tYW5kcyA9IHNlbGYuX3NoZWxsLm15b3V0LmJ1ZmZlcmVkQ29tbWFuZHMoKQorICAgICAgICBpZiBub3QgY29tbWFuZHM6CisgICAgICAgICAgICBwcmludCgiU0hFTEw6IE5vIGJ1ZmZlcmVkIGNvbW1hbmRzIGF2YWlsYWJsZSB5ZXQuIFN0YXJ0IGRvaW5nIHNvbWV0aGluZy4iKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQoIj0iKjM1LCAiQXZhaWxhYmxlIE91dHB1dCBCdWZmZXJzIiwgIj0iKjI3KQorICAgICAgICAgICAgZm9yIGluZGV4LCBjbWQgaW4gZW51bWVyYXRlKCBjb21tYW5kcyApOgorICAgICAgICAgICAgICAgIHByaW50KCJ8ICVzICVzIiAlICggc3RyKCBpbmRleCApLmxqdXN0KCAzICksIGNtZCApKQorICAgICAgICAgICAgcHJpbnQoIj0iKjg4KQorCisgICAgZGVmIGJ1aWxkKCBzZWxmLCBwYXJhbXMsIGNtZCA9ICJidWlsZCIgKToKKyAgICAgICAgIiIiQnVpbGQgYSBwcm92aWRlZSIiIgorICAgICAgICBnbG9iYWwgbGFzdF9leGNlcHRpb24KKyAgICAgICAgZ2xvYmV4cHIgPSBwYXJhbXNbMF0KKyAgICAgICAgc2VsZi5fY2hlY2tQYXJzZWQoKQorICAgICAgICBuYW1lcyA9IGdsb2JmaWx0ZXIoIGNvb2tlci5zdGF0dXMucGtnX3BuLCBnbG9iZXhwciApCisgICAgICAgIGlmIGxlbiggbmFtZXMgKSA9PSAwOiBuYW1lcyA9IFsgZ2xvYmV4cHIgXQorICAgICAgICBwcmludCgiU0hFTEw6IEJ1aWxkaW5nICVzIiAlICcgJy5qb2luKCBuYW1lcyApKQorCisgICAgICAgIHRkID0gdGFza2RhdGEuVGFza0RhdGEoY29va2VyLmNvbmZpZ3VyYXRpb24uYWJvcnQpCisgICAgICAgIGxvY2FsZGF0YSA9IGRhdGEuY3JlYXRlQ29weShjb29rZXIuY29uZmlndXJhdGlvbi5kYXRhKQorICAgICAgICBkYXRhLnVwZGF0ZV9kYXRhKGxvY2FsZGF0YSkKKyAgICAgICAgZGF0YS5leHBhbmRLZXlzKGxvY2FsZGF0YSkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICB0YXNrcyA9IFtdCisgICAgICAgICAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgICAgICAgICB0ZC5hZGRfcHJvdmlkZXIobG9jYWxkYXRhLCBjb29rZXIuc3RhdHVzLCBuYW1lKQorICAgICAgICAgICAgICAgIHByb3ZpZGVycyA9IHRkLmdldF9wcm92aWRlcihuYW1lKQorCisgICAgICAgICAgICAgICAgaWYgbGVuKHByb3ZpZGVycykgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgUHJvdmlkZXJzLk5vUHJvdmlkZXIKKworICAgICAgICAgICAgICAgIHRhc2tzLmFwcGVuZChbbmFtZSwgImRvXyVzIiAlIGNtZF0pCisKKyAgICAgICAgICAgIHRkLmFkZF91bnJlc29sdmVkKGxvY2FsZGF0YSwgY29va2VyLnN0YXR1cykKKworICAgICAgICAgICAgcnEgPSBydW5xdWV1ZS5SdW5RdWV1ZShjb29rZXIsIGxvY2FsZGF0YSwgY29va2VyLnN0YXR1cywgdGQsIHRhc2tzKQorICAgICAgICAgICAgcnEucHJlcGFyZV9ydW5xdWV1ZSgpCisgICAgICAgICAgICBycS5leGVjdXRlX3J1bnF1ZXVlKCkKKworICAgICAgICBleGNlcHQgUHJvdmlkZXJzLk5vUHJvdmlkZXI6CisgICAgICAgICAgICBwcmludCgiRVJST1I6IE5vIFByb3ZpZGVyIikKKyAgICAgICAgICAgIGxhc3RfZXhjZXB0aW9uID0gUHJvdmlkZXJzLk5vUHJvdmlkZXIKKworICAgICAgICBleGNlcHQgcnVucXVldWUuVGFza0ZhaWx1cmUgYXMgZm5pZHM6CisgICAgICAgICAgICBsYXN0X2V4Y2VwdGlvbiA9IHJ1bnF1ZXVlLlRhc2tGYWlsdXJlCisKKyAgICAgICAgZXhjZXB0IGJ1aWxkLkZ1bmNGYWlsZWQgYXMgZToKKyAgICAgICAgICAgIHByaW50KCJFUlJPUjogQ291bGRuJ3QgYnVpbGQgJyVzJyIgJSBuYW1lcykKKyAgICAgICAgICAgIGxhc3RfZXhjZXB0aW9uID0gZQorCisKKyAgICBidWlsZC51c2FnZSA9ICI8cHJvdmlkZWU+IgorCisgICAgZGVmIGNsZWFuKCBzZWxmLCBwYXJhbXMgKToKKyAgICAgICAgIiIiQ2xlYW4gYSBwcm92aWRlZSIiIgorICAgICAgICBzZWxmLmJ1aWxkKCBwYXJhbXMsICJjbGVhbiIgKQorICAgIGNsZWFuLnVzYWdlID0gIjxwcm92aWRlZT4iCisKKyAgICBkZWYgY29tcGlsZSggc2VsZiwgcGFyYW1zICk6CisgICAgICAgICIiIkV4ZWN1dGUgJ2NvbXBpbGUnIG9uIGEgcHJvdmlkZWUiIiIKKyAgICAgICAgc2VsZi5idWlsZCggcGFyYW1zLCAiY29tcGlsZSIgKQorICAgIGNvbXBpbGUudXNhZ2UgPSAiPHByb3ZpZGVlPiIKKworICAgIGRlZiBjb25maWd1cmUoIHNlbGYsIHBhcmFtcyApOgorICAgICAgICAiIiJFeGVjdXRlICdjb25maWd1cmUnIG9uIGEgcHJvdmlkZWUiIiIKKyAgICAgICAgc2VsZi5idWlsZCggcGFyYW1zLCAiY29uZmlndXJlIiApCisgICAgY29uZmlndXJlLnVzYWdlID0gIjxwcm92aWRlZT4iCisKKyAgICBkZWYgaW5zdGFsbCggc2VsZiwgcGFyYW1zICk6CisgICAgICAgICIiIkV4ZWN1dGUgJ2luc3RhbGwnIG9uIGEgcHJvdmlkZWUiIiIKKyAgICAgICAgc2VsZi5idWlsZCggcGFyYW1zLCAiaW5zdGFsbCIgKQorICAgIGluc3RhbGwudXNhZ2UgPSAiPHByb3ZpZGVlPiIKKworICAgIGRlZiBlZGl0KCBzZWxmLCBwYXJhbXMgKToKKyAgICAgICAgIiIiQ2FsbCAkRURJVE9SIG9uIGEgcHJvdmlkZWUiIiIKKyAgICAgICAgbmFtZSA9IHBhcmFtc1swXQorICAgICAgICBiYmZpbGUgPSBzZWxmLl9maW5kUHJvdmlkZXIoIG5hbWUgKQorICAgICAgICBpZiBiYmZpbGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBvcy5zeXN0ZW0oICIlcyAlcyIgJSAoIG9zLmVudmlyb24uZ2V0KCAiRURJVE9SIiwgInZpIiApLCBiYmZpbGUgKSApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCgiRVJST1I6IE5vdGhpbmcgcHJvdmlkZXMgJyVzJyIgJSBuYW1lKQorICAgIGVkaXQudXNhZ2UgPSAiPHByb3ZpZGVlPiIKKworICAgIGRlZiBlbnZpcm9ubWVudCggc2VsZiwgcGFyYW1zICk6CisgICAgICAgICIiIkR1bXAgb3V0IHRoZSBvdXRlciBCaXRCYWtlIGVudmlyb25tZW50IiIiCisgICAgICAgIGNvb2tlci5zaG93RW52aXJvbm1lbnQoKQorCisgICAgZGVmIGV4aXRfKCBzZWxmLCBwYXJhbXMgKToKKyAgICAgICAgIiIiTGVhdmUgdGhlIEJpdEJha2UgU2hlbGwiIiIKKyAgICAgICAgZGVidWdPdXQoICJzZXR0aW5nIGxlYXZlX21haW5sb29wIHRvIHRydWUiICkKKyAgICAgICAgZ2xvYmFsIGxlYXZlX21haW5sb29wCisgICAgICAgIGxlYXZlX21haW5sb29wID0gVHJ1ZQorCisgICAgZGVmIGZldGNoKCBzZWxmLCBwYXJhbXMgKToKKyAgICAgICAgIiIiRmV0Y2ggYSBwcm92aWRlZSIiIgorICAgICAgICBzZWxmLmJ1aWxkKCBwYXJhbXMsICJmZXRjaCIgKQorICAgIGZldGNoLnVzYWdlID0gIjxwcm92aWRlZT4iCisKKyAgICBkZWYgZmlsZUJ1aWxkKCBzZWxmLCBwYXJhbXMsIGNtZCA9ICJidWlsZCIgKToKKyAgICAgICAgIiIiUGFyc2UgYW5kIGJ1aWxkIGEgLmJiIGZpbGUiIiIKKyAgICAgICAgZ2xvYmFsIGxhc3RfZXhjZXB0aW9uCisgICAgICAgIG5hbWUgPSBwYXJhbXNbMF0KKyAgICAgICAgYmYgPSBjb21wbGV0ZUZpbGVQYXRoKCBuYW1lICkKKyAgICAgICAgcHJpbnQoIlNIRUxMOiBDYWxsaW5nICclcycgb24gJyVzJyIgJSAoIGNtZCwgYmYgKSkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBjb29rZXIuYnVpbGRGaWxlKGJmLCBjbWQpCisgICAgICAgIGV4Y2VwdCBwYXJzZS5QYXJzZUVycm9yOgorICAgICAgICAgICAgcHJpbnQoIkVSUk9SOiBVbmFibGUgdG8gb3BlbiBvciBwYXJzZSAnJXMnIiAlIGJmKQorICAgICAgICBleGNlcHQgYnVpbGQuRnVuY0ZhaWxlZCBhcyBlOgorICAgICAgICAgICAgcHJpbnQoIkVSUk9SOiBDb3VsZG4ndCBidWlsZCAnJXMnIiAlIG5hbWUpCisgICAgICAgICAgICBsYXN0X2V4Y2VwdGlvbiA9IGUKKworICAgIGZpbGVCdWlsZC51c2FnZSA9ICI8YmJmaWxlPiIKKworICAgIGRlZiBmaWxlQ2xlYW4oIHNlbGYsIHBhcmFtcyApOgorICAgICAgICAiIiJDbGVhbiBhIC5iYiBmaWxlIiIiCisgICAgICAgIHNlbGYuZmlsZUJ1aWxkKCBwYXJhbXMsICJjbGVhbiIgKQorICAgIGZpbGVDbGVhbi51c2FnZSA9ICI8YmJmaWxlPiIKKworICAgIGRlZiBmaWxlRWRpdCggc2VsZiwgcGFyYW1zICk6CisgICAgICAgICIiIkNhbGwgJEVESVRPUiBvbiBhIC5iYiBmaWxlIiIiCisgICAgICAgIG5hbWUgPSBwYXJhbXNbMF0KKyAgICAgICAgb3Muc3lzdGVtKCAiJXMgJXMiICUgKCBvcy5lbnZpcm9uLmdldCggIkVESVRPUiIsICJ2aSIgKSwgY29tcGxldGVGaWxlUGF0aCggbmFtZSApICkgKQorICAgIGZpbGVFZGl0LnVzYWdlID0gIjxiYmZpbGU+IgorCisgICAgZGVmIGZpbGVSZWJ1aWxkKCBzZWxmLCBwYXJhbXMgKToKKyAgICAgICAgIiIiUmVidWlsZCAoY2xlYW4gJiBidWlsZCkgYSAuYmIgZmlsZSIiIgorICAgICAgICBzZWxmLmZpbGVCdWlsZCggcGFyYW1zLCAicmVidWlsZCIgKQorICAgIGZpbGVSZWJ1aWxkLnVzYWdlID0gIjxiYmZpbGU+IgorCisgICAgZGVmIGZpbGVSZXBhcnNlKCBzZWxmLCBwYXJhbXMgKToKKyAgICAgICAgIiIiKHJlKVBhcnNlIGEgYmIgZmlsZSIiIgorICAgICAgICBiYmZpbGUgPSBwYXJhbXNbMF0KKyAgICAgICAgcHJpbnQoIlNIRUxMOiBQYXJzaW5nICclcyciICUgYmJmaWxlKQorICAgICAgICBwYXJzZS51cGRhdGVfbXRpbWUoIGJiZmlsZSApCisgICAgICAgIGNvb2tlci5wYXJzZXIucmVwYXJzZShiYmZpbGUpCisgICAgICAgIGlmIEZhbHNlOiAjZnJvbUNhY2hlOgorICAgICAgICAgICAgcHJpbnQoIlNIRUxMOiBGaWxlIGhhcyBub3QgYmVlbiB1cGRhdGVkLCBub3QgcmVwYXJzaW5nIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50KCJTSEVMTDogUGFyc2VkIikKKyAgICBmaWxlUmVwYXJzZS51c2FnZSA9ICI8YmJmaWxlPiIKKworICAgIGRlZiBhYm9ydCggc2VsZiwgcGFyYW1zICk6CisgICAgICAgICIiIlRvZ2dsZSBhYm9ydCB0YXNrIGV4ZWN1dGlvbiBmbGFnIChzZWUgYml0YmFrZSAtaykiIiIKKyAgICAgICAgY29va2VyLmNvbmZpZ3VyYXRpb24uYWJvcnQgPSBub3QgY29va2VyLmNvbmZpZ3VyYXRpb24uYWJvcnQKKyAgICAgICAgcHJpbnQoIlNIRUxMOiBBYm9ydCBGbGFnIGlzIG5vdyAnJXMnIiAlIHJlcHIoIGNvb2tlci5jb25maWd1cmF0aW9uLmFib3J0ICkpCisKKyAgICBkZWYgZm9yY2UoIHNlbGYsIHBhcmFtcyApOgorICAgICAgICAiIiJUb2dnbGUgZm9yY2UgdGFzayBleGVjdXRpb24gZmxhZyAoc2VlIGJpdGJha2UgLWYpIiIiCisgICAgICAgIGNvb2tlci5jb25maWd1cmF0aW9uLmZvcmNlID0gbm90IGNvb2tlci5jb25maWd1cmF0aW9uLmZvcmNlCisgICAgICAgIHByaW50KCJTSEVMTDogRm9yY2UgRmxhZyBpcyBub3cgJyVzJyIgJSByZXByKCBjb29rZXIuY29uZmlndXJhdGlvbi5mb3JjZSApKQorCisgICAgZGVmIGhlbHAoIHNlbGYsIHBhcmFtcyApOgorICAgICAgICAiIiJTaG93IGEgY29tcHJlaGVuc2l2ZSBsaXN0IG9mIGNvbW1hbmRzIGFuZCB0aGVpciBwdXJwb3NlIiIiCisgICAgICAgIHByaW50KCI9IiozMCwgIkF2YWlsYWJsZSBDb21tYW5kcyIsICI9IiozMCkKKyAgICAgICAgZm9yIGNtZCBpbiBzb3J0ZWQoY21kcyk6CisgICAgICAgICAgICBmdW5jdGlvbiwgbnVtcGFyYW1zLCB1c2FnZSwgaGVscHRleHQgPSBjbWRzW2NtZF0KKyAgICAgICAgICAgIHByaW50KCJ8ICVzIHwgJXMiICUgKHVzYWdlLmxqdXN0KDMwKSwgaGVscHRleHQpKQorICAgICAgICBwcmludCgiPSIqNzgpCisKKyAgICBkZWYgbGFzdEVycm9yKCBzZWxmLCBwYXJhbXMgKToKKyAgICAgICAgIiIiU2hvdyB0aGUgcmVhc29uIG9yIGxvZyB0aGF0IHdhcyBwcm9kdWNlZCBieSB0aGUgbGFzdCBCaXRCYWtlIGV2ZW50IGV4Y2VwdGlvbiIiIgorICAgICAgICBpZiBsYXN0X2V4Y2VwdGlvbiBpcyBOb25lOgorICAgICAgICAgICAgcHJpbnQoIlNIRUxMOiBObyBFcnJvcnMgeWV0IChQaGV3KS4uLiIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZWFzb24sIGV2ZW50ID0gbGFzdF9leGNlcHRpb24uYXJncworICAgICAgICAgICAgcHJpbnQoIlNIRUxMOiBSZWFzb24gZm9yIHRoZSBsYXN0IGVycm9yOiAnJXMnIiAlIHJlYXNvbikKKyAgICAgICAgICAgIGlmICc6JyBpbiByZWFzb246CisgICAgICAgICAgICAgICAgbXNnLCBmaWxlbmFtZSA9IHJlYXNvbi5zcGxpdCggJzonICkKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN0cmlwKCkKKyAgICAgICAgICAgICAgICBwcmludCgiU0hFTEw6IER1bXBpbmcgbG9nIGZpbGUgZm9yIGxhc3QgZXJyb3I6IikKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHByaW50KG9wZW4oIGZpbGVuYW1lICkucmVhZCgpKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgICAgICBwcmludCgiRVJST1I6IENvdWxkbid0IG9wZW4gJyVzJyIgJSBmaWxlbmFtZSkKKworICAgIGRlZiBtYXRjaCggc2VsZiwgcGFyYW1zICk6CisgICAgICAgICIiIkR1bXAgYWxsIGZpbGVzIG9yIHByb3ZpZGVycyBtYXRjaGluZyBhIGdsb2IgZXhwcmVzc2lvbiIiIgorICAgICAgICB3aGF0LCBnbG9iZXhwciA9IHBhcmFtcworICAgICAgICBpZiB3aGF0ID09ICJmaWxlcyI6CisgICAgICAgICAgICBzZWxmLl9jaGVja1BhcnNlZCgpCisgICAgICAgICAgICBmb3Iga2V5IGluIGdsb2JmaWx0ZXIoIGNvb2tlci5zdGF0dXMucGtnX2ZuLCBnbG9iZXhwciApOiBwcmludChrZXkpCisgICAgICAgIGVsaWYgd2hhdCA9PSAicHJvdmlkZXJzIjoKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrUGFyc2VkKCkKKyAgICAgICAgICAgIGZvciBrZXkgaW4gZ2xvYmZpbHRlciggY29va2VyLnN0YXR1cy5wa2dfcG4sIGdsb2JleHByICk6IHByaW50KGtleSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50KCJVc2FnZTogbWF0Y2ggJXMiICUgc2VsZi5wcmludF8udXNhZ2UpCisgICAgbWF0Y2gudXNhZ2UgPSAiPGZpbGVzfHByb3ZpZGVycz4gPGdsb2I+IgorCisgICAgZGVmIG5ldyggc2VsZiwgcGFyYW1zICk6CisgICAgICAgICIiIkNyZWF0ZSBhIG5ldyAuYmIgZmlsZSBhbmQgb3BlbiB0aGUgZWRpdG9yIiIiCisgICAgICAgIGRpcm5hbWUsIGZpbGVuYW1lID0gcGFyYW1zCisgICAgICAgIHBhY2thZ2VzID0gJy8nLmpvaW4oIGRhdGEuZ2V0VmFyKCAiQkJGSUxFUyIsIGNvb2tlci5jb25maWd1cmF0aW9uLmRhdGEsIDEgKS5zcGxpdCgnLycpWzotMl0gKQorICAgICAgICBmdWxsZGlybmFtZSA9ICIlcy8lcyIgJSAoIHBhY2thZ2VzLCBkaXJuYW1lICkKKworICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoIGZ1bGxkaXJuYW1lICk6CisgICAgICAgICAgICBwcmludCgiU0hFTEw6IENyZWF0aW5nICclcyciICUgZnVsbGRpcm5hbWUpCisgICAgICAgICAgICBvcy5ta2RpciggZnVsbGRpcm5hbWUgKQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyggZnVsbGRpcm5hbWUgKSBhbmQgb3MucGF0aC5pc2RpciggZnVsbGRpcm5hbWUgKToKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKCAiJXMvJXMiICUgKCBmdWxsZGlybmFtZSwgZmlsZW5hbWUgKSApOgorICAgICAgICAgICAgICAgIHByaW50KCJTSEVMTDogRVJST1I6ICVzLyVzIGFscmVhZHkgZXhpc3RzIiAlICggZnVsbGRpcm5hbWUsIGZpbGVuYW1lICkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICBwcmludCgiU0hFTEw6IENyZWF0aW5nICclcy8lcyciICUgKCBmdWxsZGlybmFtZSwgZmlsZW5hbWUgKSkKKyAgICAgICAgICAgIG5ld3BhY2thZ2UgPSBvcGVuKCAiJXMvJXMiICUgKCBmdWxsZGlybmFtZSwgZmlsZW5hbWUgKSwgInciICkKKyAgICAgICAgICAgIHByaW50KCIiIkRFU0NSSVBUSU9OID0gIiIKK1NFQ1RJT04gPSAiIgorQVVUSE9SID0gIiIKK0hPTUVQQUdFID0gIiIKK01BSU5UQUlORVIgPSAiIgorTElDRU5TRSA9ICJHUEwiCitQUiA9ICJyMCIKKworU1JDX1VSSSA9ICIiCisKKyNpbmhlcml0IGJhc2UKKworI2RvX2NvbmZpZ3VyZSgpIHsKKyMKKyN9CisKKyNkb19jb21waWxlKCkgeworIworI30KKworI2RvX3N0YWdlKCkgeworIworI30KKworI2RvX2luc3RhbGwoKSB7CisjCisjfQorIiIiLCBmaWxlPW5ld3BhY2thZ2UpCisgICAgICAgICAgICBuZXdwYWNrYWdlLmNsb3NlKCkKKyAgICAgICAgICAgIG9zLnN5c3RlbSggIiVzICVzLyVzIiAlICggb3MuZW52aXJvbi5nZXQoICJFRElUT1IiICksIGZ1bGxkaXJuYW1lLCBmaWxlbmFtZSApICkKKyAgICBuZXcudXNhZ2UgPSAiPGRpcmVjdG9yeT4gPGZpbGVuYW1lPiIKKworICAgIGRlZiBwYWNrYWdlKCBzZWxmLCBwYXJhbXMgKToKKyAgICAgICAgIiIiRXhlY3V0ZSAncGFja2FnZScgb24gYSBwcm92aWRlZSIiIgorICAgICAgICBzZWxmLmJ1aWxkKCBwYXJhbXMsICJwYWNrYWdlIiApCisgICAgcGFja2FnZS51c2FnZSA9ICI8cHJvdmlkZWU+IgorCisgICAgZGVmIHBhc3RlQmluKCBzZWxmLCBwYXJhbXMgKToKKyAgICAgICAgIiIiU2VuZCBhIGNvbW1hbmQgKyBvdXRwdXQgYnVmZmVyIHRvIHRoZSBwYXN0ZWJpbiBhdCBodHRwOi8vcmFmYi5uZXQvcGFzdGUiIiIKKyAgICAgICAgaW5kZXggPSBwYXJhbXNbMF0KKyAgICAgICAgY29udGVudHMgPSBzZWxmLl9zaGVsbC5teW91dC5idWZmZXIoIGludCggaW5kZXggKSApCisgICAgICAgIHNlbmRUb1Bhc3RlYmluKCAib3V0cHV0IG9mICIgKyBwYXJhbXNbMF0sIGNvbnRlbnRzICkKKyAgICBwYXN0ZUJpbi51c2FnZSA9ICI8aW5kZXg+IgorCisgICAgZGVmIHBhc3RlTG9nKCBzZWxmLCBwYXJhbXMgKToKKyAgICAgICAgIiIiU2VuZCB0aGUgbGFzdCBldmVudCBleGNlcHRpb24gZXJyb3IgbG9nIChpZiB0aGVyZSBpcyBvbmUpIHRvIGh0dHA6Ly9yYWZiLm5ldC9wYXN0ZSIiIgorICAgICAgICBpZiBsYXN0X2V4Y2VwdGlvbiBpcyBOb25lOgorICAgICAgICAgICAgcHJpbnQoIlNIRUxMOiBObyBFcnJvcnMgeWV0IChQaGV3KS4uLiIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZWFzb24sIGV2ZW50ID0gbGFzdF9leGNlcHRpb24uYXJncworICAgICAgICAgICAgcHJpbnQoIlNIRUxMOiBSZWFzb24gZm9yIHRoZSBsYXN0IGVycm9yOiAnJXMnIiAlIHJlYXNvbikKKyAgICAgICAgICAgIGlmICc6JyBpbiByZWFzb246CisgICAgICAgICAgICAgICAgbXNnLCBmaWxlbmFtZSA9IHJlYXNvbi5zcGxpdCggJzonICkKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN0cmlwKCkKKyAgICAgICAgICAgICAgICBwcmludCgiU0hFTEw6IFBhc3RpbmcgbG9nIGZpbGUgdG8gcGFzdGViaW4uLi4iKQorCisgICAgICAgICAgICAgICAgZmlsZSA9IG9wZW4oIGZpbGVuYW1lICkucmVhZCgpCisgICAgICAgICAgICAgICAgc2VuZFRvUGFzdGViaW4oICJjb250ZW50cyBvZiAiICsgZmlsZW5hbWUsIGZpbGUgKQorCisgICAgZGVmIHBhdGNoKCBzZWxmLCBwYXJhbXMgKToKKyAgICAgICAgIiIiRXhlY3V0ZSAncGF0Y2gnIGNvbW1hbmQgb24gYSBwcm92aWRlZSIiIgorICAgICAgICBzZWxmLmJ1aWxkKCBwYXJhbXMsICJwYXRjaCIgKQorICAgIHBhdGNoLnVzYWdlID0gIjxwcm92aWRlZT4iCisKKyAgICBkZWYgcGFyc2UoIHNlbGYsIHBhcmFtcyApOgorICAgICAgICAiIiIoUmUtKXBhcnNlIC5iYiBmaWxlcyBhbmQgY2FsY3VsYXRlIHRoZSBkZXBlbmRlbmN5IGdyYXBoIiIiCisgICAgICAgIGNvb2tlci5zdGF0dXMgPSBjYWNoZS5DYWNoZURhdGEoY29va2VyLmNhY2hlc19hcnJheSkKKyAgICAgICAgaWdub3JlID0gZGF0YS5nZXRWYXIoIkFTU1VNRV9QUk9WSURFRCIsIGNvb2tlci5jb25maWd1cmF0aW9uLmRhdGEsIDEpIG9yICIiCisgICAgICAgIGNvb2tlci5zdGF0dXMuaWdub3JlZF9kZXBlbmRlbmNpZXMgPSBzZXQoIGlnbm9yZS5zcGxpdCgpICkKKyAgICAgICAgY29va2VyLmhhbmRsZUNvbGxlY3Rpb25zKCBkYXRhLmdldFZhcigiQkJGSUxFX0NPTExFQ1RJT05TIiwgY29va2VyLmNvbmZpZ3VyYXRpb24uZGF0YSwgMSkgKQorCisgICAgICAgIChmaWxlbGlzdCwgbWFza2VkKSA9IGNvb2tlci5jb2xsZWN0X2JiZmlsZXMoKQorICAgICAgICBjb29rZXIucGFyc2VfYmJmaWxlcyhmaWxlbGlzdCwgbWFza2VkLCBjb29rZXIubXlQcm9ncmVzc0NhbGxiYWNrKQorICAgICAgICBjb29rZXIuYnVpbGREZXBncmFwaCgpCisgICAgICAgIGdsb2JhbCBwYXJzZWQKKyAgICAgICAgcGFyc2VkID0gVHJ1ZQorICAgICAgICBwcmludCgpCisKKyAgICBkZWYgcmVwYXJzZSggc2VsZiwgcGFyYW1zICk6CisgICAgICAgICIiIihyZSlQYXJzZSBhIHByb3ZpZGVlJ3MgYmIgZmlsZSIiIgorICAgICAgICBiYmZpbGUgPSBzZWxmLl9maW5kUHJvdmlkZXIoIHBhcmFtc1swXSApCisgICAgICAgIGlmIGJiZmlsZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHByaW50KCJTSEVMTDogRm91bmQgYmJmaWxlICclcycgZm9yICclcyciICUgKCBiYmZpbGUsIHBhcmFtc1swXSApKQorICAgICAgICAgICAgc2VsZi5maWxlUmVwYXJzZSggWyBiYmZpbGUgXSApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCgiRVJST1I6IE5vdGhpbmcgcHJvdmlkZXMgJyVzJyIgJSBwYXJhbXNbMF0pCisgICAgcmVwYXJzZS51c2FnZSA9ICI8cHJvdmlkZWU+IgorCisgICAgZGVmIGdldHZhciggc2VsZiwgcGFyYW1zICk6CisgICAgICAgICIiIkR1bXAgdGhlIGNvbnRlbnRzIG9mIGFuIG91dGVyIEJpdEJha2UgZW52aXJvbm1lbnQgdmFyaWFibGUiIiIKKyAgICAgICAgdmFyID0gcGFyYW1zWzBdCisgICAgICAgIHZhbHVlID0gZGF0YS5nZXRWYXIoIHZhciwgY29va2VyLmNvbmZpZ3VyYXRpb24uZGF0YSwgMSApCisgICAgICAgIHByaW50KHZhbHVlKQorICAgIGdldHZhci51c2FnZSA9ICI8dmFyaWFibGU+IgorCisgICAgZGVmIHBlZWsoIHNlbGYsIHBhcmFtcyApOgorICAgICAgICAiIiJEdW1wIGNvbnRlbnRzIG9mIHZhcmlhYmxlIGRlZmluZWQgaW4gcHJvdmlkZWUncyBtZXRhZGF0YSIiIgorICAgICAgICBuYW1lLCB2YXIgPSBwYXJhbXMKKyAgICAgICAgYmJmaWxlID0gc2VsZi5fZmluZFByb3ZpZGVyKCBuYW1lICkKKyAgICAgICAgaWYgYmJmaWxlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgdGhlX2RhdGEgPSBjYWNoZS5DYWNoZS5sb2FkRGF0YUZ1bGwoYmJmaWxlLCBjb29rZXIuY29uZmlndXJhdGlvbi5kYXRhKQorICAgICAgICAgICAgdmFsdWUgPSB0aGVfZGF0YS5nZXRWYXIoIHZhciwgMSApCisgICAgICAgICAgICBwcmludCh2YWx1ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50KCJFUlJPUjogTm90aGluZyBwcm92aWRlcyAnJXMnIiAlIG5hbWUpCisgICAgcGVlay51c2FnZSA9ICI8cHJvdmlkZWU+IDx2YXJpYWJsZT4iCisKKyAgICBkZWYgcG9rZSggc2VsZiwgcGFyYW1zICk6CisgICAgICAgICIiIlNldCBjb250ZW50cyBvZiB2YXJpYWJsZSBkZWZpbmVkIGluIHByb3ZpZGVlJ3MgbWV0YWRhdGEiIiIKKyAgICAgICAgbmFtZSwgdmFyLCB2YWx1ZSA9IHBhcmFtcworICAgICAgICBiYmZpbGUgPSBzZWxmLl9maW5kUHJvdmlkZXIoIG5hbWUgKQorICAgICAgICBpZiBiYmZpbGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBwcmludCgiRVJST1I6IFNvcnJ5LCB0aGlzIGZ1bmN0aW9uYWxpdHkgaXMgY3VycmVudGx5IGJyb2tlbiIpCisgICAgICAgICAgICAjZCA9IGNvb2tlci5wa2dkYXRhW2JiZmlsZV0KKyAgICAgICAgICAgICNkYXRhLnNldFZhciggdmFyLCB2YWx1ZSwgZCApCisKKyAgICAgICAgICAgICMgbWFyayB0aGUgY2hhbmdlIHNlbWkgcGVyc2lzdGFudAorICAgICAgICAgICAgI2Nvb2tlci5wa2dkYXRhLnNldERpcnR5KGJiZmlsZSwgZCkKKyAgICAgICAgICAgICNwcmludCAiT0siCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCgiRVJST1I6IE5vdGhpbmcgcHJvdmlkZXMgJyVzJyIgJSBuYW1lKQorICAgIHBva2UudXNhZ2UgPSAiPHByb3ZpZGVlPiA8dmFyaWFibGU+IDx2YWx1ZT4iCisKKyAgICBkZWYgcHJpbnRfKCBzZWxmLCBwYXJhbXMgKToKKyAgICAgICAgIiIiRHVtcCBhbGwgZmlsZXMgb3IgcHJvdmlkZXJzIiIiCisgICAgICAgIHdoYXQgPSBwYXJhbXNbMF0KKyAgICAgICAgaWYgd2hhdCA9PSAiZmlsZXMiOgorICAgICAgICAgICAgc2VsZi5fY2hlY2tQYXJzZWQoKQorICAgICAgICAgICAgZm9yIGtleSBpbiBjb29rZXIuc3RhdHVzLnBrZ19mbjogcHJpbnQoa2V5KQorICAgICAgICBlbGlmIHdoYXQgPT0gInByb3ZpZGVycyI6CisgICAgICAgICAgICBzZWxmLl9jaGVja1BhcnNlZCgpCisgICAgICAgICAgICBmb3Iga2V5IGluIGNvb2tlci5zdGF0dXMucHJvdmlkZXJzOiBwcmludChrZXkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCgiVXNhZ2U6IHByaW50ICVzIiAlIHNlbGYucHJpbnRfLnVzYWdlKQorICAgIHByaW50Xy51c2FnZSA9ICI8ZmlsZXN8cHJvdmlkZXJzPiIKKworICAgIGRlZiBweXRob24oIHNlbGYsIHBhcmFtcyApOgorICAgICAgICAiIiJFbnRlciB0aGUgZXhwZXJ0IG1vZGUgLSBhbiBpbnRlcmFjdGl2ZSBCaXRCYWtlIFB5dGhvbiBJbnRlcnByZXRlciIiIgorICAgICAgICBzeXMucHMxID0gIkVYUEVSVCBCQj4+PiAiCisgICAgICAgIHN5cy5wczIgPSAiRVhQRVJUIEJCLi4uICIKKyAgICAgICAgaW1wb3J0IGNvZGUKKyAgICAgICAgaW50ZXJwcmV0ZXIgPSBjb2RlLkludGVyYWN0aXZlQ29uc29sZSggZGljdCggZ2xvYmFscygpICkgKQorICAgICAgICBpbnRlcnByZXRlci5pbnRlcmFjdCggIlNIRUxMOiBFeHBlcnQgTW9kZSAtIEJpdEJha2UgUHl0aG9uICVzXG5UeXBlICdoZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiwgcHJlc3MgQ1RSTC1EIHRvIHN3aXRjaCBiYWNrIHRvIEJCU0hFTEwuIiAlIHN5cy52ZXJzaW9uICkKKworICAgIGRlZiBzaG93ZGF0YSggc2VsZiwgcGFyYW1zICk6CisgICAgICAgICIiIkV4ZWN1dGUgJ3Nob3dkYXRhJyBvbiBhIHByb3ZpZGVlIiIiCisgICAgICAgIGNvb2tlci5zaG93RW52aXJvbm1lbnQoTm9uZSwgcGFyYW1zKQorICAgIHNob3dkYXRhLnVzYWdlID0gIjxwcm92aWRlZT4iCisKKyAgICBkZWYgc2V0VmFyKCBzZWxmLCBwYXJhbXMgKToKKyAgICAgICAgIiIiU2V0IGFuIG91dGVyIEJpdEJha2UgZW52aXJvbm1lbnQgdmFyaWFibGUiIiIKKyAgICAgICAgdmFyLCB2YWx1ZSA9IHBhcmFtcworICAgICAgICBkYXRhLnNldFZhciggdmFyLCB2YWx1ZSwgY29va2VyLmNvbmZpZ3VyYXRpb24uZGF0YSApCisgICAgICAgIHByaW50KCJPSyIpCisgICAgc2V0VmFyLnVzYWdlID0gIjx2YXJpYWJsZT4gPHZhbHVlPiIKKworICAgIGRlZiByZWJ1aWxkKCBzZWxmLCBwYXJhbXMgKToKKyAgICAgICAgIiIiQ2xlYW4gYW5kIHJlYnVpbGQgYSAuYmIgZmlsZSBvciBhIHByb3ZpZGVlIiIiCisgICAgICAgIHNlbGYuYnVpbGQoIHBhcmFtcywgImNsZWFuIiApCisgICAgICAgIHNlbGYuYnVpbGQoIHBhcmFtcywgImJ1aWxkIiApCisgICAgcmVidWlsZC51c2FnZSA9ICI8cHJvdmlkZWU+IgorCisgICAgZGVmIHNoZWxsKCBzZWxmLCBwYXJhbXMgKToKKyAgICAgICAgIiIiRXhlY3V0ZSBhIHNoZWxsIGNvbW1hbmQgYW5kIGR1bXAgdGhlIG91dHB1dCIiIgorICAgICAgICBpZiBwYXJhbXMgIT0gIiI6CisgICAgICAgICAgICBwcmludChjb21tYW5kcy5nZXRvdXRwdXQoICIgIi5qb2luKCBwYXJhbXMgKSApKQorICAgIHNoZWxsLnVzYWdlID0gIjwuLi4+IgorCisgICAgZGVmIHN0YWdlKCBzZWxmLCBwYXJhbXMgKToKKyAgICAgICAgIiIiRXhlY3V0ZSAnc3RhZ2UnIG9uIGEgcHJvdmlkZWUiIiIKKyAgICAgICAgc2VsZi5idWlsZCggcGFyYW1zLCAicG9wdWxhdGVfc3RhZ2luZyIgKQorICAgIHN0YWdlLnVzYWdlID0gIjxwcm92aWRlZT4iCisKKyAgICBkZWYgc3RhdHVzKCBzZWxmLCBwYXJhbXMgKToKKyAgICAgICAgIiIiPGp1c3QgZm9yIHRlc3Rpbmc+IiIiCisgICAgICAgIHByaW50KCItIiAqIDc4KQorICAgICAgICBwcmludCgiYnVpbGRpbmcgbGlzdCA9ICclcyciICUgY29va2VyLmJ1aWxkaW5nX2xpc3QpCisgICAgICAgIHByaW50KCJidWlsZCBwYXRoID0gJyVzJyIgJSBjb29rZXIuYnVpbGRfcGF0aCkKKyAgICAgICAgcHJpbnQoImNvbnNpZGVyX21zZ3NfY2FjaGUgPSAnJXMnIiAlIGNvb2tlci5jb25zaWRlcl9tc2dzX2NhY2hlKQorICAgICAgICBwcmludCgiYnVpbGQgc3RhdHMgPSAnJXMnIiAlIGNvb2tlci5zdGF0cykKKyAgICAgICAgaWYgbGFzdF9leGNlcHRpb24gaXMgbm90IE5vbmU6IHByaW50KCJsYXN0X2V4Y2VwdGlvbiA9ICclcyciICUgcmVwciggbGFzdF9leGNlcHRpb24uYXJncyApKQorICAgICAgICBwcmludCgibWVtb3J5IG91dHB1dCBjb250ZW50cyA9ICclcyciICUgc2VsZi5fc2hlbGwubXlvdXQuX2J1ZmZlcikKKworICAgIGRlZiB0ZXN0KCBzZWxmLCBwYXJhbXMgKToKKyAgICAgICAgIiIiPGp1c3QgZm9yIHRlc3Rpbmc+IiIiCisgICAgICAgIHByaW50KCJ0ZXN0Q29tbWFuZCBjYWxsZWQgd2l0aCAnJXMnIiAlIHBhcmFtcykKKworICAgIGRlZiB1bnBhY2soIHNlbGYsIHBhcmFtcyApOgorICAgICAgICAiIiJFeGVjdXRlICd1bnBhY2snIG9uIGEgcHJvdmlkZWUiIiIKKyAgICAgICAgc2VsZi5idWlsZCggcGFyYW1zLCAidW5wYWNrIiApCisgICAgdW5wYWNrLnVzYWdlID0gIjxwcm92aWRlZT4iCisKKyAgICBkZWYgd2hpY2goIHNlbGYsIHBhcmFtcyApOgorICAgICAgICAiIiJDb21wdXRlcyB0aGUgcHJvdmlkZXJzIGZvciBhIGdpdmVuIHByb3ZpZGVlIiIiCisgICAgICAgICMgTmVlZCB0byB1c2UgdGFza0RhdGEgZm9yIHRoaXMgaW5mb3JtYXRpb24KKyAgICAgICAgaXRlbSA9IHBhcmFtc1swXQorCisgICAgICAgIHNlbGYuX2NoZWNrUGFyc2VkKCkKKworICAgICAgICBwcmVmZXJyZWQgPSBkYXRhLmdldFZhciggIlBSRUZFUlJFRF9QUk9WSURFUl8lcyIgJSBpdGVtLCBjb29rZXIuY29uZmlndXJhdGlvbi5kYXRhLCAxICkKKyAgICAgICAgaWYgbm90IHByZWZlcnJlZDogcHJlZmVycmVkID0gaXRlbQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGx2LCBsZiwgcHYsIHBmID0gUHJvdmlkZXJzLmZpbmRCZXN0UHJvdmlkZXIocHJlZmVycmVkLCBjb29rZXIuY29uZmlndXJhdGlvbi5kYXRhLCBjb29rZXIuc3RhdHVzKQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBsdiwgbGYsIHB2LCBwZiA9IChOb25lLCkqNAorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHByb3ZpZGVycyA9IGNvb2tlci5zdGF0dXMucHJvdmlkZXJzW2l0ZW1dCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHByaW50KCJTSEVMTDogRVJST1I6IE5vdGhpbmcgcHJvdmlkZXMiLCBwcmVmZXJyZWQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmb3IgcHJvdmlkZXIgaW4gcHJvdmlkZXJzOgorICAgICAgICAgICAgICAgIGlmIHByb3ZpZGVyID09IHBmOiBwcm92aWRlciA9ICIgKCoqKikgJXMiICUgcHJvdmlkZXIKKyAgICAgICAgICAgICAgICBlbHNlOiAgICAgICAgICAgICAgcHJvdmlkZXIgPSAiICAgICAgICVzIiAlIHByb3ZpZGVyCisgICAgICAgICAgICAgICAgcHJpbnQocHJvdmlkZXIpCisgICAgd2hpY2gudXNhZ2UgPSAiPHByb3ZpZGVlPiIKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29tbW9uIGhlbHBlciBmdW5jdGlvbnMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2RlZiBjb21wbGV0ZUZpbGVQYXRoKCBiYmZpbGUgKToKKyAgICAiIiJHZXQgdGhlIGNvbXBsZXRlIGJiZmlsZSBwYXRoIiIiCisgICAgaWYgbm90IGNvb2tlci5zdGF0dXM6IHJldHVybiBiYmZpbGUKKyAgICBpZiBub3QgY29va2VyLnN0YXR1cy5wa2dfZm46IHJldHVybiBiYmZpbGUKKyAgICBmb3Iga2V5IGluIGNvb2tlci5zdGF0dXMucGtnX2ZuOgorICAgICAgICBpZiBrZXkuZW5kc3dpdGgoIGJiZmlsZSApOgorICAgICAgICAgICAgcmV0dXJuIGtleQorICAgIHJldHVybiBiYmZpbGUKKworZGVmIHNlbmRUb1Bhc3RlYmluKCBkZXNjLCBjb250ZW50ICk6CisgICAgIiIiU2VuZCBjb250ZW50IHRvIGh0dHA6Ly9vZS5wYXN0ZWJpbi5jb20iIiIKKyAgICBteWRhdGEgPSB7fQorICAgIG15ZGF0YVsibGFuZyJdID0gIlBsYWluIFRleHQiCisgICAgbXlkYXRhWyJkZXNjIl0gPSBkZXNjCisgICAgbXlkYXRhWyJjdnRfdGFicyJdID0gIk5vIgorICAgIG15ZGF0YVsibmljayJdID0gIiVzQCVzIiAlICggb3MuZW52aXJvbi5nZXQoICJVU0VSIiwgInVua25vd24iICksIHNvY2tldC5nZXRob3N0bmFtZSgpIG9yICJ1bmtub3duIiApCisgICAgbXlkYXRhWyJ0ZXh0Il0gPSBjb250ZW50CisgICAgcGFyYW1zID0gdXJsbGliLnVybGVuY29kZSggbXlkYXRhICkKKyAgICBoZWFkZXJzID0geyJDb250ZW50LXR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgIkFjY2VwdCI6ICJ0ZXh0L3BsYWluIn0KKworICAgIGhvc3QgPSAicmFmYi5uZXQiCisgICAgY29ubiA9IGh0dHBsaWIuSFRUUENvbm5lY3Rpb24oICIlczo4MCIgJSBob3N0ICkKKyAgICBjb25uLnJlcXVlc3QoIlBPU1QiLCAiL3Bhc3RlL3Bhc3RlLnBocCIsIHBhcmFtcywgaGVhZGVycyApCisKKyAgICByZXNwb25zZSA9IGNvbm4uZ2V0cmVzcG9uc2UoKQorICAgIGNvbm4uY2xvc2UoKQorCisgICAgaWYgcmVzcG9uc2Uuc3RhdHVzID09IDMwMjoKKyAgICAgICAgbG9jYXRpb24gPSByZXNwb25zZS5nZXRoZWFkZXIoICJsb2NhdGlvbiIgKSBvciAidW5rbm93biIKKyAgICAgICAgcHJpbnQoIlNIRUxMOiBQYXN0ZWQgdG8gaHR0cDovLyVzJXMiICUgKCBob3N0LCBsb2NhdGlvbiApKQorICAgIGVsc2U6CisgICAgICAgIHByaW50KCJFUlJPUjogJXMgJXMiICUgKCByZXNwb25zZS5zdGF0dXMsIHJlc3BvbnNlLnJlYXNvbiApKQorCitkZWYgY29tcGxldGVyKCB0ZXh0LCBzdGF0ZSApOgorICAgICIiIlJldHVybiBhIHBvc3NpYmxlIHJlYWRsaW5lIGNvbXBsZXRpb24iIiIKKyAgICBkZWJ1Z091dCggImNvbXBsZXRlciBjYWxsZWQgd2l0aCB0ZXh0PSclcycsIHN0YXRlPSclZCciICUgKCB0ZXh0LCBzdGF0ZSApICkKKworICAgIGlmIHN0YXRlID09IDA6CisgICAgICAgIGxpbmUgPSByZWFkbGluZS5nZXRfbGluZV9idWZmZXIoKQorICAgICAgICBpZiAiICIgaW4gbGluZToKKyAgICAgICAgICAgIGxpbmUgPSBsaW5lLnNwbGl0KCkKKyAgICAgICAgICAgICMgd2UgYXJlIGluIHNlY29uZCAob3IgbW9yZSkgYXJndW1lbnQKKyAgICAgICAgICAgIGlmIGxpbmVbMF0gaW4gY21kcyBhbmQgaGFzYXR0ciggY21kc1tsaW5lWzBdXVswXSwgInVzYWdlIiApOiAjIGtub3duIGNvbW1hbmQgYW5kIHVzYWdlCisgICAgICAgICAgICAgICAgdSA9IGdldGF0dHIoIGNtZHNbbGluZVswXV1bMF0sICJ1c2FnZSIgKS5zcGxpdCgpWzBdCisgICAgICAgICAgICAgICAgaWYgdSA9PSAiPHZhcmlhYmxlPiI6CisgICAgICAgICAgICAgICAgICAgIGFsbG1hdGNoZXMgPSBjb29rZXIuY29uZmlndXJhdGlvbi5kYXRhLmtleXMoKQorICAgICAgICAgICAgICAgIGVsaWYgdSA9PSAiPGJiZmlsZT4iOgorICAgICAgICAgICAgICAgICAgICBpZiBjb29rZXIuc3RhdHVzLnBrZ19mbiBpcyBOb25lOiBhbGxtYXRjaGVzID0gWyAiKE5vIE1hdGNoZXMgQXZhaWxhYmxlLiBQYXJzZWQgeWV0PykiIF0KKyAgICAgICAgICAgICAgICAgICAgZWxzZTogYWxsbWF0Y2hlcyA9IFsgeC5zcGxpdCgiLyIpWy0xXSBmb3IgeCBpbiBjb29rZXIuc3RhdHVzLnBrZ19mbiBdCisgICAgICAgICAgICAgICAgZWxpZiB1ID09ICI8cHJvdmlkZWU+IjoKKyAgICAgICAgICAgICAgICAgICAgaWYgY29va2VyLnN0YXR1cy5wa2dfZm4gaXMgTm9uZTogYWxsbWF0Y2hlcyA9IFsgIihObyBNYXRjaGVzIEF2YWlsYWJsZS4gUGFyc2VkIHlldD8pIiBdCisgICAgICAgICAgICAgICAgICAgIGVsc2U6IGFsbG1hdGNoZXMgPSBjb29rZXIuc3RhdHVzLnByb3ZpZGVycy5pdGVya2V5cygpCisgICAgICAgICAgICAgICAgZWxzZTogYWxsbWF0Y2hlcyA9IFsgIihObyB0YWIgY29tcGxldGlvbiBhdmFpbGFibGUgZm9yIHRoaXMgY29tbWFuZCkiIF0KKyAgICAgICAgICAgIGVsc2U6IGFsbG1hdGNoZXMgPSBbICIoTm8gdGFiIGNvbXBsZXRpb24gYXZhaWxhYmxlIGZvciB0aGlzIGNvbW1hbmQpIiBdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIHdlIGFyZSBpbiBmaXJzdCBhcmd1bWVudAorICAgICAgICAgICAgYWxsbWF0Y2hlcyA9IGNtZHMuaXRlcmtleXMoKQorCisgICAgICAgIGNvbXBsZXRlci5tYXRjaGVzID0gWyB4IGZvciB4IGluIGFsbG1hdGNoZXMgaWYgeFs6bGVuKHRleHQpXSA9PSB0ZXh0IF0KKyAgICAgICAgI3ByaW50ICJjb21wbGV0ZXIubWF0Y2hlcyA9ICclcyciICUgY29tcGxldGVyLm1hdGNoZXMKKyAgICBpZiBsZW4oIGNvbXBsZXRlci5tYXRjaGVzICkgPiBzdGF0ZToKKyAgICAgICAgcmV0dXJuIGNvbXBsZXRlci5tYXRjaGVzW3N0YXRlXQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBOb25lCisKK2RlZiBkZWJ1Z091dCggdGV4dCApOgorICAgIGlmIGRlYnVnOgorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCAiKCAlcyApXG4iICUgdGV4dCApCisKK2RlZiBjb2x1bW5pemUoIGFsaXN0LCB3aWR0aCA9IDgwICk6CisgICAgIiIiCisgICAgQSB3b3JkLXdyYXAgZnVuY3Rpb24gdGhhdCBwcmVzZXJ2ZXMgZXhpc3RpbmcgbGluZSBicmVha3MKKyAgICBhbmQgbW9zdCBzcGFjZXMgaW4gdGhlIHRleHQuIEV4cGVjdHMgdGhhdCBleGlzdGluZyBsaW5lCisgICAgYnJlYWtzIGFyZSBwb3NpeCBuZXdsaW5lcyAoXG4pLgorICAgICIiIgorICAgIHJldHVybiByZWR1Y2UobGFtYmRhIGxpbmUsIHdvcmQsIHdpZHRoPXdpZHRoOiAnJXMlcyVzJyAlCisgICAgICAgICAgICAgICAgICAobGluZSwKKyAgICAgICAgICAgICAgICAgICAnIFxuJ1sobGVuKGxpbmVbbGluZS5yZmluZCgnXG4nKSsxOl0pCisgICAgICAgICAgICAgICAgICAgICAgICAgKyBsZW4od29yZC5zcGxpdCgnXG4nLCAxKVswXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA+PSB3aWR0aCldLAorICAgICAgICAgICAgICAgICAgIHdvcmQpLAorICAgICAgICAgICAgICAgICAgYWxpc3QKKyAgICAgICAgICAgICAgICAgKQorCitkZWYgZ2xvYmZpbHRlciggbmFtZXMsIHBhdHRlcm4gKToKKyAgICByZXR1cm4gZm5tYXRjaC5maWx0ZXIoIG5hbWVzLCBwYXR0ZXJuICkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ2xhc3MgTWVtb3J5T3V0cHV0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitjbGFzcyBNZW1vcnlPdXRwdXQ6CisgICAgIiIiRmlsZS1saWtlIG91dHB1dCBjbGFzcyBidWZmZXJpbmcgdGhlIG91dHB1dCBvZiB0aGUgbGFzdCAxMCBjb21tYW5kcyIiIgorICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZGVsZWdhdGUgKToKKyAgICAgICAgc2VsZi5kZWxlZ2F0ZSA9IGRlbGVnYXRlCisgICAgICAgIHNlbGYuX2J1ZmZlciA9IFtdCisgICAgICAgIHNlbGYudGV4dCA9IFtdCisgICAgICAgIHNlbGYuX2NvbW1hbmQgPSBOb25lCisKKyAgICBkZWYgc3RhcnRDb21tYW5kKCBzZWxmLCBjb21tYW5kICk6CisgICAgICAgIHNlbGYuX2NvbW1hbmQgPSBjb21tYW5kCisgICAgICAgIHNlbGYudGV4dCA9IFtdCisgICAgZGVmIGVuZENvbW1hbmQoIHNlbGYgKToKKyAgICAgICAgaWYgc2VsZi5fY29tbWFuZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIGxlbiggc2VsZi5fYnVmZmVyICkgPT0gMTA6IGRlbCBzZWxmLl9idWZmZXJbMF0KKyAgICAgICAgICAgIHNlbGYuX2J1ZmZlci5hcHBlbmQoICggc2VsZi5fY29tbWFuZCwgc2VsZi50ZXh0ICkgKQorICAgIGRlZiByZW1vdmVMYXN0KCBzZWxmICk6CisgICAgICAgIGlmIHNlbGYuX2J1ZmZlcjoKKyAgICAgICAgICAgIGRlbCBzZWxmLl9idWZmZXJbIGxlbiggc2VsZi5fYnVmZmVyICkgLSAxIF0KKyAgICAgICAgc2VsZi50ZXh0ID0gW10KKyAgICAgICAgc2VsZi5fY29tbWFuZCA9IE5vbmUKKyAgICBkZWYgbGFzdEJ1ZmZlciggc2VsZiApOgorICAgICAgICBpZiBzZWxmLl9idWZmZXI6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fYnVmZmVyWyBsZW4oIHNlbGYuX2J1ZmZlciApIC0xIF1bMV0KKyAgICBkZWYgYnVmZmVyZWRDb21tYW5kcyggc2VsZiApOgorICAgICAgICByZXR1cm4gWyBjbWQgZm9yIGNtZCwgb3V0cHV0IGluIHNlbGYuX2J1ZmZlciBdCisgICAgZGVmIGJ1ZmZlciggc2VsZiwgaSApOgorICAgICAgICBpZiBpIDwgbGVuKCBzZWxmLl9idWZmZXIgKToKKyAgICAgICAgICAgIHJldHVybiAiQkI+PiAlc1xuJXMiICUgKCBzZWxmLl9idWZmZXJbaV1bMF0sICIiLmpvaW4oIHNlbGYuX2J1ZmZlcltpXVsxXSApICkKKyAgICAgICAgZWxzZTogcmV0dXJuICJFUlJPUjogSW52YWxpZCBidWZmZXIgbnVtYmVyLiBCdWZmZXIgbmVlZHMgdG8gYmUgaW4gKDAsICVkKSIgJSAoIGxlbiggc2VsZi5fYnVmZmVyICkgLSAxICkKKyAgICBkZWYgd3JpdGUoIHNlbGYsIHRleHQgKToKKyAgICAgICAgaWYgc2VsZi5fY29tbWFuZCBpcyBub3QgTm9uZSBhbmQgdGV4dCAhPSAiQkI+PiAiOiBzZWxmLnRleHQuYXBwZW5kKCB0ZXh0ICkKKyAgICAgICAgaWYgc2VsZi5kZWxlZ2F0ZSBpcyBub3QgTm9uZTogc2VsZi5kZWxlZ2F0ZS53cml0ZSggdGV4dCApCisgICAgZGVmIGZsdXNoKCBzZWxmICk6CisgICAgICAgIHJldHVybiBzZWxmLmRlbGVnYXRlLmZsdXNoKCkKKyAgICBkZWYgZmlsZW5vKCBzZWxmICk6CisgICAgICAgIHJldHVybiBzZWxmLmRlbGVnYXRlLmZpbGVubygpCisgICAgZGVmIGlzYXR0eSggc2VsZiApOgorICAgICAgICByZXR1cm4gc2VsZi5kZWxlZ2F0ZS5pc2F0dHkoKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDbGFzcyBCaXRCYWtlU2hlbGwKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2NsYXNzIEJpdEJha2VTaGVsbDoKKworICAgIGRlZiBfX2luaXRfXyggc2VsZiApOgorICAgICAgICAiIiJSZWdpc3RlciBjb21tYW5kcyBhbmQgc2V0IHVwIHJlYWRsaW5lIiIiCisgICAgICAgIHNlbGYuY29tbWFuZFEgPSBRdWV1ZS5RdWV1ZSgpCisgICAgICAgIHNlbGYuY29tbWFuZHMgPSBCaXRCYWtlU2hlbGxDb21tYW5kcyggc2VsZiApCisgICAgICAgIHNlbGYubXlvdXQgPSBNZW1vcnlPdXRwdXQoIHN5cy5zdGRvdXQgKQorICAgICAgICBzZWxmLmhpc3RvcnlmaWxlbmFtZSA9IG9zLnBhdGguZXhwYW5kdXNlciggIn4vLmJic2hfaGlzdG9yeSIgKQorICAgICAgICBzZWxmLnN0YXJ0dXBmaWxlbmFtZSA9IG9zLnBhdGguZXhwYW5kdXNlciggIn4vLmJic2hfc3RhcnR1cCIgKQorCisgICAgICAgIHJlYWRsaW5lLnNldF9jb21wbGV0ZXIoIGNvbXBsZXRlciApCisgICAgICAgIHJlYWRsaW5lLnNldF9jb21wbGV0ZXJfZGVsaW1zKCAiICIgKQorICAgICAgICByZWFkbGluZS5wYXJzZV9hbmRfYmluZCgidGFiOiBjb21wbGV0ZSIpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVhZGxpbmUucmVhZF9oaXN0b3J5X2ZpbGUoIHNlbGYuaGlzdG9yeWZpbGVuYW1lICkKKyAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICBwYXNzICAjIEl0IGRvZXNuJ3QgZXhpc3QgeWV0LgorCisgICAgICAgIHByaW50KF9fY3JlZGl0c19fKQorCisgICAgZGVmIGNsZWFudXAoIHNlbGYgKToKKyAgICAgICAgIiIiV3JpdGUgcmVhZGxpbmUgaGlzdG9yeSBhbmQgY2xlYW4gdXAgcmVzb3VyY2VzIiIiCisgICAgICAgIGRlYnVnT3V0KCAid3JpdGluZyBjb21tYW5kIGhpc3RvcnkiICkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVhZGxpbmUud3JpdGVfaGlzdG9yeV9maWxlKCBzZWxmLmhpc3RvcnlmaWxlbmFtZSApCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHByaW50KCJTSEVMTDogVW5hYmxlIHRvIHNhdmUgY29tbWFuZCBoaXN0b3J5IikKKworICAgIGRlZiByZWdpc3RlckNvbW1hbmQoIHNlbGYsIGNvbW1hbmQsIGZ1bmN0aW9uLCBudW1wYXJhbXMgPSAwLCB1c2FnZSA9ICIiLCBoZWxwdGV4dCA9ICIiICk6CisgICAgICAgICIiIlJlZ2lzdGVyIGEgY29tbWFuZCIiIgorICAgICAgICBpZiB1c2FnZSA9PSAiIjogdXNhZ2UgPSBjb21tYW5kCisgICAgICAgIGlmIGhlbHB0ZXh0ID09ICIiOiBoZWxwdGV4dCA9IGZ1bmN0aW9uLl9fZG9jX18gb3IgIjxub3QgeWV0IGRvY3VtZW50ZWQ+IgorICAgICAgICBjbWRzW2NvbW1hbmRdID0gKCBmdW5jdGlvbiwgbnVtcGFyYW1zLCB1c2FnZSwgaGVscHRleHQgKQorCisgICAgZGVmIHByb2Nlc3NDb21tYW5kKCBzZWxmLCBjb21tYW5kLCBwYXJhbXMgKToKKyAgICAgICAgIiIiUHJvY2VzcyBhIGNvbW1hbmQuIENoZWNrIG51bWJlciBvZiBwYXJhbXMgYW5kIHByaW50IGEgdXNhZ2Ugc3RyaW5nLCBpZiBhcHByb3ByaWF0ZSIiIgorICAgICAgICBkZWJ1Z091dCggInByb2Nlc3NpbmcgY29tbWFuZCAnJXMnLi4uIiAlIGNvbW1hbmQgKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmdW5jdGlvbiwgbnVtcGFyYW1zLCB1c2FnZSwgaGVscHRleHQgPSBjbWRzW2NvbW1hbmRdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHByaW50KCJTSEVMTDogRVJST1I6ICclcycgY29tbWFuZCBpcyBub3QgYSB2YWxpZCBjb21tYW5kLiIgJSBjb21tYW5kKQorICAgICAgICAgICAgc2VsZi5teW91dC5yZW1vdmVMYXN0KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIChudW1wYXJhbXMgIT0gLTEpIGFuZCAobm90IGxlbiggcGFyYW1zICkgPT0gbnVtcGFyYW1zKToKKyAgICAgICAgICAgICAgICBwcmludCgiVXNhZ2U6ICclcyciICUgdXNhZ2UpCisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmN0aW9uKCBzZWxmLmNvbW1hbmRzLCBwYXJhbXMgKQorICAgICAgICAgICAgZGVidWdPdXQoICJyZXN1bHQgd2FzICclcyciICUgcmVzdWx0ICkKKworICAgIGRlZiBwcm9jZXNzU3RhcnR1cEZpbGUoIHNlbGYgKToKKyAgICAgICAgIiIiUmVhZCBhbmQgZXhlY3V0ZSBhbGwgY29tbWFuZHMgZm91bmQgaW4gJEhPTUUvLmJic2hfc3RhcnR1cCIiIgorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyggc2VsZi5zdGFydHVwZmlsZW5hbWUgKToKKyAgICAgICAgICAgIHN0YXJ0dXBmaWxlID0gb3Blbiggc2VsZi5zdGFydHVwZmlsZW5hbWUsICJyIiApCisgICAgICAgICAgICBmb3IgY21kbGluZSBpbiBzdGFydHVwZmlsZToKKyAgICAgICAgICAgICAgICBkZWJ1Z091dCggInByb2Nlc3Npbmcgc3RhcnR1cCBsaW5lICclcyciICUgY21kbGluZSApCisgICAgICAgICAgICAgICAgaWYgbm90IGNtZGxpbmU6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgInwiIGluIGNtZGxpbmU6CisgICAgICAgICAgICAgICAgICAgIHByaW50KCJFUlJPUjogJ3wnIGluIHN0YXJ0dXAgZmlsZSBpcyBub3QgYWxsb3dlZC4gSWdub3JpbmcgbGluZSIpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgc2VsZi5jb21tYW5kUS5wdXQoIGNtZGxpbmUuc3RyaXAoKSApCisKKyAgICBkZWYgbWFpbiggc2VsZiApOgorICAgICAgICAiIiJUaGUgbWFpbiBjb21tYW5kIGxvb3AiIiIKKyAgICAgICAgd2hpbGUgbm90IGxlYXZlX21haW5sb29wOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlmIHNlbGYuY29tbWFuZFEuZW1wdHkoKToKKyAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHNlbGYubXlvdXQuZGVsZWdhdGUKKyAgICAgICAgICAgICAgICAgICAgY21kbGluZSA9IHJhd19pbnB1dCggIkJCPj4gIiApCisgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzZWxmLm15b3V0CisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgY21kbGluZSA9IHNlbGYuY29tbWFuZFEuZ2V0KCkKKyAgICAgICAgICAgICAgICBpZiBjbWRsaW5lOgorICAgICAgICAgICAgICAgICAgICBhbGxDb21tYW5kcyA9IGNtZGxpbmUuc3BsaXQoICc7JyApCisgICAgICAgICAgICAgICAgICAgIGZvciBjb21tYW5kIGluIGFsbENvbW1hbmRzOgorICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWNtZCA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICMKKyAgICAgICAgICAgICAgICAgICAgICAgICMgc3BlY2lhbCBjYXNlIGZvciBleHBlcnQgbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgY29tbWFuZCA9PSAncHl0aG9uJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc2VsZi5teW91dC5kZWxlZ2F0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc0NvbW1hbmQoIGNvbW1hbmQsICIiICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc2VsZi5teW91dAorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm15b3V0LnN0YXJ0Q29tbWFuZCggY29tbWFuZCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgJ3wnIGluIGNvbW1hbmQ6ICMgZGlzYWJsZSBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCwgcGlwZWNtZCA9IGNvbW1hbmQuc3BsaXQoICd8JyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlID0gc2VsZi5teW91dC5kZWxlZ2F0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm15b3V0LmRlbGVnYXRlID0gTm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VucyA9IHNobGV4LnNwbGl0KCBjb21tYW5kLCBUcnVlICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3NDb21tYW5kKCB0b2tlbnNbMF0sIHRva2Vuc1sxOl0gb3IgIiIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubXlvdXQuZW5kQ29tbWFuZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcGlwZWNtZCBpcyBub3QgTm9uZTogIyByZXN0b3JlIG91dHB1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm15b3V0LmRlbGVnYXRlID0gZGVsZWdhdGUKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlID0gcG9wZW4yLlBvcGVuNCggcGlwZWNtZCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGUudG9jaGlsZC53cml0ZSggIlxuIi5qb2luKCBzZWxmLm15b3V0Lmxhc3RCdWZmZXIoKSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZS50b2NoaWxkLmNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSggcGlwZS5mcm9tY2hpbGQucmVhZCgpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICMKKyAgICAgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoKKyAgICAgICAgICAgICAgICBwcmludCgpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgICAgICAgICAgcHJpbnQoKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBTdGFydCBmdW5jdGlvbiAtIGNhbGxlZCBmcm9tIHRoZSBCaXRCYWtlIGNvbW1hbmQgbGluZSB1dGlsaXR5CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitkZWYgc3RhcnQoIGFDb29rZXIgKToKKyAgICBnbG9iYWwgY29va2VyCisgICAgY29va2VyID0gYUNvb2tlcgorICAgIGJic2hlbGwgPSBCaXRCYWtlU2hlbGwoKQorICAgIGJic2hlbGwucHJvY2Vzc1N0YXJ0dXBGaWxlKCkKKyAgICBiYnNoZWxsLm1haW4oKQorICAgIGJic2hlbGwuY2xlYW51cCgpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgcHJpbnQoIlNIRUxMOiBTb3JyeSwgdGhpcyBwcm9ncmFtIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSBCaXRCYWtlLiIpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9zaWdnZW4ucHkgYi9iaXRiYWtlL2xpYi9iYi9zaWdnZW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk4NTI3MgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3NpZ2dlbi5weQpAQCAtMCwwICsxLDUyNiBAQAoraW1wb3J0IGhhc2hsaWIKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgYmIuZGF0YQorCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcignQml0QmFrZS5TaWdHZW4nKQorCit0cnk6CisgICAgaW1wb3J0IGNQaWNrbGUgYXMgcGlja2xlCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgaW1wb3J0IHBpY2tsZQorICAgIGxvZ2dlci5pbmZvKCdJbXBvcnRpbmcgY1BpY2tsZSBmYWlsZWQuICBGYWxsaW5nIGJhY2sgdG8gYSB2ZXJ5IHNsb3cgaW1wbGVtZW50YXRpb24uJykKKworZGVmIGluaXQoZCk6CisgICAgc2lnZ2VucyA9IFtvYmogZm9yIG9iaiBpbiBnbG9iYWxzKCkuaXRlcnZhbHVlcygpCisgICAgICAgICAgICAgICAgICAgICAgaWYgdHlwZShvYmopIGlzIHR5cGUgYW5kIGlzc3ViY2xhc3Mob2JqLCBTaWduYXR1cmVHZW5lcmF0b3IpXQorCisgICAgZGVzaXJlZCA9IGQuZ2V0VmFyKCJCQl9TSUdOQVRVUkVfSEFORExFUiIsIFRydWUpIG9yICJub29wIgorICAgIGZvciBzZyBpbiBzaWdnZW5zOgorICAgICAgICBpZiBkZXNpcmVkID09IHNnLm5hbWU6CisgICAgICAgICAgICByZXR1cm4gc2coZCkKKyAgICAgICAgICAgIGJyZWFrCisgICAgZWxzZToKKyAgICAgICAgbG9nZ2VyLmVycm9yKCJJbnZhbGlkIHNpZ25hdHVyZSBnZW5lcmF0b3IgJyVzJywgdXNpbmcgZGVmYXVsdCAnbm9vcCdcbiIKKyAgICAgICAgICAgICAgICAgICAgICJBdmFpbGFibGUgZ2VuZXJhdG9yczogJXMiLCBkZXNpcmVkLAorICAgICAgICAgICAgICAgICAgICAgJywgJy5qb2luKG9iai5uYW1lIGZvciBvYmogaW4gc2lnZ2VucykpCisgICAgICAgIHJldHVybiBTaWduYXR1cmVHZW5lcmF0b3IoZCkKKworY2xhc3MgU2lnbmF0dXJlR2VuZXJhdG9yKG9iamVjdCk6CisgICAgIiIiCisgICAgIiIiCisgICAgbmFtZSA9ICJub29wIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLnRhc2toYXNoID0ge30KKyAgICAgICAgc2VsZi5ydW50YXNrZGVwcyA9IHt9CisgICAgICAgIHNlbGYuZmlsZV9jaGVja3N1bV92YWx1ZXMgPSB7fQorCisgICAgZGVmIGZpbmFsaXNlKHNlbGYsIGZuLCBkLCB2YXJpZW50KToKKyAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgZ2V0X3Rhc2toYXNoKHNlbGYsIGZuLCB0YXNrLCBkZXBzLCBkYXRhQ2FjaGUpOgorICAgICAgICByZXR1cm4gIjAiCisKKyAgICBkZWYgc2V0X3Rhc2tkYXRhKHNlbGYsIGhhc2hlcywgZGVwcywgY2hlY2tzdW0pOgorICAgICAgICByZXR1cm4KKworICAgIGRlZiBzdGFtcGZpbGUoc2VsZiwgc3RhbXBiYXNlLCBmaWxlX25hbWUsIHRhc2tuYW1lLCBleHRyYWluZm8pOgorICAgICAgICByZXR1cm4gKCIlcy4lcy4lcyIgJSAoc3RhbXBiYXNlLCB0YXNrbmFtZSwgZXh0cmFpbmZvKSkucnN0cmlwKCcuJykKKworICAgIGRlZiBzdGFtcGNsZWFubWFzayhzZWxmLCBzdGFtcGJhc2UsIGZpbGVfbmFtZSwgdGFza25hbWUsIGV4dHJhaW5mbyk6CisgICAgICAgIHJldHVybiAoIiVzLiVzLiVzIiAlIChzdGFtcGJhc2UsIHRhc2tuYW1lLCBleHRyYWluZm8pKS5yc3RyaXAoJy4nKQorCisgICAgZGVmIGR1bXBfc2lndGFzayhzZWxmLCBmbiwgdGFzaywgc3RhbXBiYXNlLCBydW50aW1lKToKKyAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgaW52YWxpZGF0ZV90YXNrKHNlbGYsIHRhc2ssIGQsIGZuKToKKyAgICAgICAgYmIuYnVpbGQuZGVsX3N0YW1wKHRhc2ssIGQsIGZuKQorCisgICAgZGVmIGR1bXBfc2lncyhzZWxmLCBkYXRhQ2FjaGUsIG9wdGlvbnMpOgorICAgICAgICByZXR1cm4KKworICAgIGRlZiBnZXRfdGFza2RhdGEoc2VsZik6CisgICAgICAgcmV0dXJuIChzZWxmLnJ1bnRhc2tkZXBzLCBzZWxmLnRhc2toYXNoLCBzZWxmLmZpbGVfY2hlY2tzdW1fdmFsdWVzKQorCisgICAgZGVmIHNldF90YXNrZGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5ydW50YXNrZGVwcywgc2VsZi50YXNraGFzaCwgc2VsZi5maWxlX2NoZWNrc3VtX3ZhbHVlcyA9IGRhdGEKKworCitjbGFzcyBTaWduYXR1cmVHZW5lcmF0b3JCYXNpYyhTaWduYXR1cmVHZW5lcmF0b3IpOgorICAgICIiIgorICAgICIiIgorICAgIG5hbWUgPSAiYmFzaWMiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuYmFzZWhhc2ggPSB7fQorICAgICAgICBzZWxmLnRhc2toYXNoID0ge30KKyAgICAgICAgc2VsZi50YXNrZGVwcyA9IHt9CisgICAgICAgIHNlbGYucnVudGFza2RlcHMgPSB7fQorICAgICAgICBzZWxmLmZpbGVfY2hlY2tzdW1fdmFsdWVzID0ge30KKyAgICAgICAgc2VsZi5nZW5kZXBzID0ge30KKyAgICAgICAgc2VsZi5sb29rdXBjYWNoZSA9IHt9CisgICAgICAgIHNlbGYucGtnbmFtZWV4dHJhY3QgPSByZS5jb21waWxlKCIoP1A8Zm4+LiopXC4uKiIpCisgICAgICAgIHNlbGYuYmFzZXdoaXRlbGlzdCA9IHNldCgoZGF0YS5nZXRWYXIoIkJCX0hBU0hCQVNFX1dISVRFTElTVCIsIFRydWUpIG9yICIiKS5zcGxpdCgpKQorICAgICAgICBzZWxmLnRhc2t3aGl0ZWxpc3QgPSBOb25lCisgICAgICAgIHNlbGYuaW5pdF9ydW5kZXBjaGVjayhkYXRhKQorCisgICAgZGVmIGluaXRfcnVuZGVwY2hlY2soc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYudGFza3doaXRlbGlzdCA9IGRhdGEuZ2V0VmFyKCJCQl9IQVNIVEFTS19XSElURUxJU1QiLCBUcnVlKSBvciBOb25lCisgICAgICAgIGlmIHNlbGYudGFza3doaXRlbGlzdDoKKyAgICAgICAgICAgIHNlbGYudHdsID0gcmUuY29tcGlsZShzZWxmLnRhc2t3aGl0ZWxpc3QpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnR3bCA9IE5vbmUKKworICAgIGRlZiBfYnVpbGRfZGF0YShzZWxmLCBmbiwgZCk6CisKKyAgICAgICAgdGFza2xpc3QsIGdlbmRlcHMsIGxvb2t1cGNhY2hlID0gYmIuZGF0YS5nZW5lcmF0ZV9kZXBlbmRlbmNpZXMoZCkKKworICAgICAgICB0YXNrZGVwcyA9IHt9CisgICAgICAgIGJhc2VoYXNoID0ge30KKworICAgICAgICBmb3IgdGFzayBpbiB0YXNrbGlzdDoKKyAgICAgICAgICAgIGRhdGEgPSBsb29rdXBjYWNoZVt0YXNrXQorCisgICAgICAgICAgICBpZiBkYXRhIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgYmIuZXJyb3IoIlRhc2sgJXMgZnJvbSAlcyBzZWVtcyB0byBiZSBlbXB0eT8hIiAlICh0YXNrLCBmbikpCisgICAgICAgICAgICAgICAgZGF0YSA9ICcnCisKKyAgICAgICAgICAgIGdlbmRlcHNbdGFza10gLT0gc2VsZi5iYXNld2hpdGVsaXN0CisgICAgICAgICAgICBuZXdkZXBzID0gZ2VuZGVwc1t0YXNrXQorICAgICAgICAgICAgc2VlbiA9IHNldCgpCisgICAgICAgICAgICB3aGlsZSBuZXdkZXBzOgorICAgICAgICAgICAgICAgIG5leHRkZXBzID0gbmV3ZGVwcworICAgICAgICAgICAgICAgIHNlZW4gfD0gbmV4dGRlcHMKKyAgICAgICAgICAgICAgICBuZXdkZXBzID0gc2V0KCkKKyAgICAgICAgICAgICAgICBmb3IgZGVwIGluIG5leHRkZXBzOgorICAgICAgICAgICAgICAgICAgICBpZiBkZXAgaW4gc2VsZi5iYXNld2hpdGVsaXN0OgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgZ2VuZGVwc1tkZXBdIC09IHNlbGYuYmFzZXdoaXRlbGlzdAorICAgICAgICAgICAgICAgICAgICBuZXdkZXBzIHw9IGdlbmRlcHNbZGVwXQorICAgICAgICAgICAgICAgIG5ld2RlcHMgLT0gc2VlbgorCisgICAgICAgICAgICBhbGxkZXBzID0gc29ydGVkKHNlZW4pCisgICAgICAgICAgICBmb3IgZGVwIGluIGFsbGRlcHM6CisgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEgKyBkZXAKKyAgICAgICAgICAgICAgICB2YXIgPSBsb29rdXBjYWNoZVtkZXBdCisgICAgICAgICAgICAgICAgaWYgdmFyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSArIHN0cih2YXIpCisgICAgICAgICAgICBzZWxmLmJhc2VoYXNoW2ZuICsgIi4iICsgdGFza10gPSBoYXNobGliLm1kNShkYXRhKS5oZXhkaWdlc3QoKQorICAgICAgICAgICAgdGFza2RlcHNbdGFza10gPSBhbGxkZXBzCisKKyAgICAgICAgc2VsZi50YXNrZGVwc1tmbl0gPSB0YXNrZGVwcworICAgICAgICBzZWxmLmdlbmRlcHNbZm5dID0gZ2VuZGVwcworICAgICAgICBzZWxmLmxvb2t1cGNhY2hlW2ZuXSA9IGxvb2t1cGNhY2hlCisKKyAgICAgICAgcmV0dXJuIHRhc2tkZXBzCisKKyAgICBkZWYgZmluYWxpc2Uoc2VsZiwgZm4sIGQsIHZhcmlhbnQpOgorCisgICAgICAgIGlmIHZhcmlhbnQ6CisgICAgICAgICAgICBmbiA9ICJ2aXJ0dWFsOiIgKyB2YXJpYW50ICsgIjoiICsgZm4KKworICAgICAgICB0cnk6CisgICAgICAgICAgICB0YXNrZGVwcyA9IHNlbGYuX2J1aWxkX2RhdGEoZm4sIGQpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGJiLm5vdGUoIkVycm9yIGR1cmluZyBmaW5hbGlzZSBvZiAlcyIgJSBmbikKKyAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgI1Nsb3cgYnV0IGNhbiBiZSB1c2VmdWwgZm9yIGRlYnVnZ2luZyBtaXNtYXRjaGVkIGJhc2VoYXNoZXMKKyAgICAgICAgI2ZvciB0YXNrIGluIHNlbGYudGFza2RlcHNbZm5dOgorICAgICAgICAjICAgIHNlbGYuZHVtcF9zaWd0YXNrKGZuLCB0YXNrLCBkLmdldFZhcigiU1RBTVAiLCBUcnVlKSwgRmFsc2UpCisKKyAgICAgICAgZm9yIHRhc2sgaW4gdGFza2RlcHM6CisgICAgICAgICAgICBkLnNldFZhcigiQkJfQkFTRUhBU0hfdGFzay0lcyIgJSB0YXNrLCBzZWxmLmJhc2VoYXNoW2ZuICsgIi4iICsgdGFza10pCisKKyAgICBkZWYgcnVuZGVwX2NoZWNrKHNlbGYsIGZuLCByZWNpcGVuYW1lLCB0YXNrLCBkZXAsIGRlcG5hbWUsIGRhdGFDYWNoZSk6CisgICAgICAgICMgUmV0dXJuIFRydWUgaWYgd2Ugc2hvdWxkIGtlZXAgdGhlIGRlcGVuZGVuY3ksIEZhbHNlIHRvIGRyb3AgaXQKKyAgICAgICAgIyBXZSBvbmx5IG1hbmlwdWxhdGUgdGhlIGRlcGVuZGVuY2llcyBmb3IgcGFja2FnZXMgbm90IGluIHRoZSB3aGl0ZWxpc3QKKyAgICAgICAgaWYgc2VsZi50d2wgYW5kIG5vdCBzZWxmLnR3bC5zZWFyY2gocmVjaXBlbmFtZSk6CisgICAgICAgICAgICAjIHRoZW4gcHJvY2VzcyB0aGUgYWN0dWFsIGRlcGVuZGVuY2llcworICAgICAgICAgICAgaWYgc2VsZi50d2wuc2VhcmNoKGRlcG5hbWUpOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHJlYWRfdGFpbnQoc2VsZiwgZm4sIHRhc2ssIHN0YW1wYmFzZSk6CisgICAgICAgIHRhaW50ID0gTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIG9wZW4oc3RhbXBiYXNlICsgJy4nICsgdGFzayArICcudGFpbnQnLCAncicpIGFzIHRhaW50ZjoKKyAgICAgICAgICAgICAgICB0YWludCA9IHRhaW50Zi5yZWFkKCkKKyAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHJldHVybiB0YWludAorCisgICAgZGVmIGdldF90YXNraGFzaChzZWxmLCBmbiwgdGFzaywgZGVwcywgZGF0YUNhY2hlKToKKyAgICAgICAgayA9IGZuICsgIi4iICsgdGFzaworICAgICAgICBkYXRhID0gZGF0YUNhY2hlLmJhc2V0YXNraGFzaFtrXQorICAgICAgICBzZWxmLnJ1bnRhc2tkZXBzW2tdID0gW10KKyAgICAgICAgc2VsZi5maWxlX2NoZWNrc3VtX3ZhbHVlc1trXSA9IHt9CisgICAgICAgIHJlY2lwZW5hbWUgPSBkYXRhQ2FjaGUucGtnX2ZuW2ZuXQorICAgICAgICBmb3IgZGVwIGluIHNvcnRlZChkZXBzLCBrZXk9Y2xlYW5fYmFzZXBhdGgpOgorICAgICAgICAgICAgZGVwbmFtZSA9IGRhdGFDYWNoZS5wa2dfZm5bc2VsZi5wa2duYW1lZXh0cmFjdC5zZWFyY2goZGVwKS5ncm91cCgnZm4nKV0KKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLnJ1bmRlcF9jaGVjayhmbiwgcmVjaXBlbmFtZSwgdGFzaywgZGVwLCBkZXBuYW1lLCBkYXRhQ2FjaGUpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBkZXAgbm90IGluIHNlbGYudGFza2hhc2g6CisgICAgICAgICAgICAgICAgYmIuZmF0YWwoIiVzIGlzIG5vdCBpbiB0YXNraGFzaCwgY2FsbGVyIGlzbid0IGNhbGxpbmcgaW4gZGVwZW5kZW5jeSBvcmRlcj8iLCBkZXApCisgICAgICAgICAgICBkYXRhID0gZGF0YSArIHNlbGYudGFza2hhc2hbZGVwXQorICAgICAgICAgICAgc2VsZi5ydW50YXNrZGVwc1trXS5hcHBlbmQoZGVwKQorCisgICAgICAgIGlmIHRhc2sgaW4gZGF0YUNhY2hlLmZpbGVfY2hlY2tzdW1zW2ZuXToKKyAgICAgICAgICAgIGNoZWNrc3VtcyA9IGJiLmZldGNoMi5nZXRfZmlsZV9jaGVja3N1bXMoZGF0YUNhY2hlLmZpbGVfY2hlY2tzdW1zW2ZuXVt0YXNrXSwgcmVjaXBlbmFtZSkKKyAgICAgICAgICAgIGZvciAoZixjcykgaW4gY2hlY2tzdW1zOgorICAgICAgICAgICAgICAgIHNlbGYuZmlsZV9jaGVja3N1bV92YWx1ZXNba11bZl0gPSBjcworICAgICAgICAgICAgICAgIGlmIGNzOgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSArIGNzCisKKyAgICAgICAgdGFza2RlcCA9IGRhdGFDYWNoZS50YXNrX2RlcHNbZm5dCisgICAgICAgIGlmICdub3N0YW1wJyBpbiB0YXNrZGVwIGFuZCB0YXNrIGluIHRhc2tkZXBbJ25vc3RhbXAnXToKKyAgICAgICAgICAgICMgTm9zdGFtcCB0YXNrcyBuZWVkIGFuIGltcGxpY2l0IHRhaW50IHNvIHRoYXQgdGhleSBmb3JjZSBhbnkgZGVwZW5kZW50IHRhc2tzIHRvIHJ1bgorICAgICAgICAgICAgaW1wb3J0IHV1aWQKKyAgICAgICAgICAgIGRhdGEgPSBkYXRhICsgc3RyKHV1aWQudXVpZDQoKSkKKworICAgICAgICB0YWludCA9IHNlbGYucmVhZF90YWludChmbiwgdGFzaywgZGF0YUNhY2hlLnN0YW1wW2ZuXSkKKyAgICAgICAgaWYgdGFpbnQ6CisgICAgICAgICAgICBkYXRhID0gZGF0YSArIHRhaW50CisgICAgICAgICAgICBsb2dnZXIud2FybigiJXMgaXMgdGFpbnRlZCBmcm9tIGEgZm9yY2VkIHJ1biIgJSBrKQorCisgICAgICAgIGggPSBoYXNobGliLm1kNShkYXRhKS5oZXhkaWdlc3QoKQorICAgICAgICBzZWxmLnRhc2toYXNoW2tdID0gaAorICAgICAgICAjZC5zZXRWYXIoIkJCX1RBU0tIQVNIX3Rhc2stJXMiICUgdGFzaywgdGFza2hhc2hbdGFza10pCisgICAgICAgIHJldHVybiBoCisKKyAgICBkZWYgZHVtcF9zaWd0YXNrKHNlbGYsIGZuLCB0YXNrLCBzdGFtcGJhc2UsIHJ1bnRpbWUpOgorICAgICAgICBrID0gZm4gKyAiLiIgKyB0YXNrCisgICAgICAgIGlmIHJ1bnRpbWUgPT0gImN1c3RvbWZpbGUiOgorICAgICAgICAgICAgc2lnZmlsZSA9IHN0YW1wYmFzZQorICAgICAgICBlbGlmIHJ1bnRpbWUgYW5kIGsgaW4gc2VsZi50YXNraGFzaDoKKyAgICAgICAgICAgIHNpZ2ZpbGUgPSBzdGFtcGJhc2UgKyAiLiIgKyB0YXNrICsgIi5zaWdkYXRhIiArICIuIiArIHNlbGYudGFza2hhc2hba10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNpZ2ZpbGUgPSBzdGFtcGJhc2UgKyAiLiIgKyB0YXNrICsgIi5zaWdiYXNlZGF0YSIgKyAiLiIgKyBzZWxmLmJhc2VoYXNoW2tdCisKKyAgICAgICAgYmIudXRpbHMubWtkaXJoaWVyKG9zLnBhdGguZGlybmFtZShzaWdmaWxlKSkKKworICAgICAgICBkYXRhID0ge30KKyAgICAgICAgZGF0YVsnYmFzZXdoaXRlbGlzdCddID0gc2VsZi5iYXNld2hpdGVsaXN0CisgICAgICAgIGRhdGFbJ3Rhc2t3aGl0ZWxpc3QnXSA9IHNlbGYudGFza3doaXRlbGlzdAorICAgICAgICBkYXRhWyd0YXNrZGVwcyddID0gc2VsZi50YXNrZGVwc1tmbl1bdGFza10KKyAgICAgICAgZGF0YVsnYmFzZWhhc2gnXSA9IHNlbGYuYmFzZWhhc2hba10KKyAgICAgICAgZGF0YVsnZ2VuZGVwcyddID0ge30KKyAgICAgICAgZGF0YVsndmFydmFscyddID0ge30KKyAgICAgICAgZGF0YVsndmFydmFscyddW3Rhc2tdID0gc2VsZi5sb29rdXBjYWNoZVtmbl1bdGFza10KKyAgICAgICAgZm9yIGRlcCBpbiBzZWxmLnRhc2tkZXBzW2ZuXVt0YXNrXToKKyAgICAgICAgICAgIGlmIGRlcCBpbiBzZWxmLmJhc2V3aGl0ZWxpc3Q6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGRhdGFbJ2dlbmRlcHMnXVtkZXBdID0gc2VsZi5nZW5kZXBzW2ZuXVtkZXBdCisgICAgICAgICAgICBkYXRhWyd2YXJ2YWxzJ11bZGVwXSA9IHNlbGYubG9va3VwY2FjaGVbZm5dW2RlcF0KKworICAgICAgICBpZiBydW50aW1lIGFuZCBrIGluIHNlbGYudGFza2hhc2g6CisgICAgICAgICAgICBkYXRhWydydW50YXNrZGVwcyddID0gc2VsZi5ydW50YXNrZGVwc1trXQorICAgICAgICAgICAgZGF0YVsnZmlsZV9jaGVja3N1bV92YWx1ZXMnXSA9IFsob3MucGF0aC5iYXNlbmFtZShmKSwgY3MpIGZvciBmLGNzIGluIHNlbGYuZmlsZV9jaGVja3N1bV92YWx1ZXNba10uaXRlbXMoKV0KKyAgICAgICAgICAgIGRhdGFbJ3J1bnRhc2toYXNoZXMnXSA9IHt9CisgICAgICAgICAgICBmb3IgZGVwIGluIGRhdGFbJ3J1bnRhc2tkZXBzJ106CisgICAgICAgICAgICAgICAgZGF0YVsncnVudGFza2hhc2hlcyddW2RlcF0gPSBzZWxmLnRhc2toYXNoW2RlcF0KKworICAgICAgICB0YWludCA9IHNlbGYucmVhZF90YWludChmbiwgdGFzaywgc3RhbXBiYXNlKQorICAgICAgICBpZiB0YWludDoKKyAgICAgICAgICAgIGRhdGFbJ3RhaW50J10gPSB0YWludAorCisgICAgICAgIGZkLCB0bXBmaWxlID0gdGVtcGZpbGUubWtzdGVtcChkaXI9b3MucGF0aC5kaXJuYW1lKHNpZ2ZpbGUpLCBwcmVmaXg9InNpZ3Rhc2suIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBvcy5mZG9wZW4oZmQsICJ3YiIpIGFzIHN0cmVhbToKKyAgICAgICAgICAgICAgICBwID0gcGlja2xlLmR1bXAoZGF0YSwgc3RyZWFtLCAtMSkKKyAgICAgICAgICAgICAgICBzdHJlYW0uZmx1c2goKQorICAgICAgICAgICAgb3MuY2htb2QodG1wZmlsZSwgMDY2NCkKKyAgICAgICAgICAgIG9zLnJlbmFtZSh0bXBmaWxlLCBzaWdmaWxlKQorICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IpIGFzIGVycjoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsodG1wZmlsZSkKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHJhaXNlIGVycgorCisgICAgZGVmIGR1bXBfc2lncyhzZWxmLCBkYXRhQ2FjaGUsIG9wdGlvbnMpOgorICAgICAgICBmb3IgZm4gaW4gc2VsZi50YXNrZGVwczoKKyAgICAgICAgICAgIGZvciB0YXNrIGluIHNlbGYudGFza2RlcHNbZm5dOgorICAgICAgICAgICAgICAgIGsgPSBmbiArICIuIiArIHRhc2sKKyAgICAgICAgICAgICAgICBpZiBrIG5vdCBpbiBzZWxmLnRhc2toYXNoOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIGRhdGFDYWNoZS5iYXNldGFza2hhc2hba10gIT0gc2VsZi5iYXNlaGFzaFtrXToKKyAgICAgICAgICAgICAgICAgICAgYmIuZXJyb3IoIkJpdGJha2UncyBjYWNoZWQgYmFzZWhhc2ggZG9lcyBub3QgbWF0Y2ggdGhlIG9uZSB3ZSBqdXN0IGdlbmVyYXRlZCAoJXMpISIgJSBrKQorICAgICAgICAgICAgICAgICAgICBiYi5lcnJvcigiVGhlIG1pc21hdGNoZWQgaGFzaGVzIHdlcmUgJXMgYW5kICVzIiAlIChkYXRhQ2FjaGUuYmFzZXRhc2toYXNoW2tdLCBzZWxmLmJhc2VoYXNoW2tdKSkKKyAgICAgICAgICAgICAgICBzZWxmLmR1bXBfc2lndGFzayhmbiwgdGFzaywgZGF0YUNhY2hlLnN0YW1wW2ZuXSwgVHJ1ZSkKKworY2xhc3MgU2lnbmF0dXJlR2VuZXJhdG9yQmFzaWNIYXNoKFNpZ25hdHVyZUdlbmVyYXRvckJhc2ljKToKKyAgICBuYW1lID0gImJhc2ljaGFzaCIKKworICAgIGRlZiBzdGFtcGZpbGUoc2VsZiwgc3RhbXBiYXNlLCBmbiwgdGFza25hbWUsIGV4dHJhaW5mbywgY2xlYW49RmFsc2UpOgorICAgICAgICBpZiB0YXNrbmFtZSAhPSAiZG9fc2V0c2NlbmUiIGFuZCB0YXNrbmFtZS5lbmRzd2l0aCgiX3NldHNjZW5lIik6CisgICAgICAgICAgICBrID0gZm4gKyAiLiIgKyB0YXNrbmFtZVs6LTldCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBrID0gZm4gKyAiLiIgKyB0YXNrbmFtZQorICAgICAgICBpZiBjbGVhbjoKKyAgICAgICAgICAgIGggPSAiKiIKKyAgICAgICAgZWxpZiBrIGluIHNlbGYudGFza2hhc2g6CisgICAgICAgICAgICBoID0gc2VsZi50YXNraGFzaFtrXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBJZiBrIGlzIG5vdCBpbiBiYXNlaGFzaCwgdGhlbiBlcnJvcgorICAgICAgICAgICAgaCA9IHNlbGYuYmFzZWhhc2hba10KKyAgICAgICAgcmV0dXJuICgiJXMuJXMuJXMuJXMiICUgKHN0YW1wYmFzZSwgdGFza25hbWUsIGgsIGV4dHJhaW5mbykpLnJzdHJpcCgnLicpCisKKyAgICBkZWYgc3RhbXBjbGVhbm1hc2soc2VsZiwgc3RhbXBiYXNlLCBmbiwgdGFza25hbWUsIGV4dHJhaW5mbyk6CisgICAgICAgIHJldHVybiBzZWxmLnN0YW1wZmlsZShzdGFtcGJhc2UsIGZuLCB0YXNrbmFtZSwgZXh0cmFpbmZvLCBjbGVhbj1UcnVlKQorICAgICAgICAKKyAgICBkZWYgaW52YWxpZGF0ZV90YXNrKHNlbGYsIHRhc2ssIGQsIGZuKToKKyAgICAgICAgYmIubm90ZSgiVGFpbnRpbmcgaGFzaCB0byBmb3JjZSByZWJ1aWxkIG9mIHRhc2sgJXMsICVzIiAlIChmbiwgdGFzaykpCisgICAgICAgIGJiLmJ1aWxkLndyaXRlX3RhaW50KHRhc2ssIGQsIGZuKQorCitkZWYgZHVtcF90aGlzX3Rhc2sob3V0ZmlsZSwgZCk6CisgICAgaW1wb3J0IGJiLnBhcnNlCisgICAgZm4gPSBkLmdldFZhcigiQkJfRklMRU5BTUUiLCBUcnVlKQorICAgIHRhc2sgPSAiZG9fIiArIGQuZ2V0VmFyKCJCQl9DVVJSRU5UVEFTSyIsIFRydWUpCisgICAgYmIucGFyc2Uuc2lnZ2VuLmR1bXBfc2lndGFzayhmbiwgdGFzaywgb3V0ZmlsZSwgImN1c3RvbWZpbGUiKQorCitkZWYgY2xlYW5fYmFzZXBhdGgoYSk6CisgICAgYiA9IGEucnNwbGl0KCIvIiwgMilbMV0gKyBhLnJzcGxpdCgiLyIsIDIpWzJdCisgICAgaWYgYS5zdGFydHN3aXRoKCJ2aXJ0dWFsOiIpOgorICAgICAgICBiID0gYiArICI6IiArIGEucnNwbGl0KCI6IiwgMSlbMF0KKyAgICByZXR1cm4gYgorCitkZWYgY2xlYW5fYmFzZXBhdGhzKGEpOgorICAgIGIgPSB7fQorICAgIGZvciB4IGluIGE6CisgICAgICAgIGJbY2xlYW5fYmFzZXBhdGgoeCldID0gYVt4XQorICAgIHJldHVybiBiCisKK2RlZiBjbGVhbl9iYXNlcGF0aHNfbGlzdChhKToKKyAgICBiID0gW10KKyAgICBmb3IgeCBpbiBhOgorICAgICAgICBiLmFwcGVuZChjbGVhbl9iYXNlcGF0aCh4KSkKKyAgICByZXR1cm4gYgorCitkZWYgY29tcGFyZV9zaWdmaWxlcyhhLCBiLCByZWN1cnNlY2IgPSBOb25lKToKKyAgICBvdXRwdXQgPSBbXQorCisgICAgcDEgPSBwaWNrbGUuVW5waWNrbGVyKG9wZW4oYSwgInJiIikpCisgICAgYV9kYXRhID0gcDEubG9hZCgpCisgICAgcDIgPSBwaWNrbGUuVW5waWNrbGVyKG9wZW4oYiwgInJiIikpCisgICAgYl9kYXRhID0gcDIubG9hZCgpCisKKyAgICBkZWYgZGljdF9kaWZmKGEsIGIsIHdoaXRlbGlzdD1zZXQoKSk6CisgICAgICAgIHNhID0gc2V0KGEua2V5cygpKQorICAgICAgICBzYiA9IHNldChiLmtleXMoKSkKKyAgICAgICAgY29tbW9uID0gc2EgJiBzYgorICAgICAgICBjaGFuZ2VkID0gc2V0KCkKKyAgICAgICAgZm9yIGkgaW4gY29tbW9uOgorICAgICAgICAgICAgaWYgYVtpXSAhPSBiW2ldIGFuZCBpIG5vdCBpbiB3aGl0ZWxpc3Q6CisgICAgICAgICAgICAgICAgY2hhbmdlZC5hZGQoaSkKKyAgICAgICAgYWRkZWQgPSBzYiAtIHNhCisgICAgICAgIHJlbW92ZWQgPSBzYSAtIHNiCisgICAgICAgIHJldHVybiBjaGFuZ2VkLCBhZGRlZCwgcmVtb3ZlZAorCisgICAgZGVmIGZpbGVfY2hlY2tzdW1zX2RpZmYoYSwgYik6CisgICAgICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IENvdW50ZXIKKyAgICAgICAgIyBIYW5kbGUgb2xkIHNpZ2luZm8gZm9ybWF0CisgICAgICAgIGlmIGlzaW5zdGFuY2UoYSwgZGljdCk6CisgICAgICAgICAgICBhID0gWyhvcy5wYXRoLmJhc2VuYW1lKGYpLCBjcykgZm9yIGYsIGNzIGluIGEuaXRlbXMoKV0KKyAgICAgICAgaWYgaXNpbnN0YW5jZShiLCBkaWN0KToKKyAgICAgICAgICAgIGIgPSBbKG9zLnBhdGguYmFzZW5hbWUoZiksIGNzKSBmb3IgZiwgY3MgaW4gYi5pdGVtcygpXQorICAgICAgICAjIENvbXBhcmUgbGlzdHMsIGVuc3VyaW5nIHdlIGNhbiBoYW5kbGUgZHVwbGljYXRlIGZpbGVuYW1lcyBpZiB0aGV5IGV4aXN0CisgICAgICAgIHJlbW92ZWRjb3VudCA9IENvdW50ZXIoYSkKKyAgICAgICAgcmVtb3ZlZGNvdW50LnN1YnRyYWN0KGIpCisgICAgICAgIGFkZGVkY291bnQgPSBDb3VudGVyKGIpCisgICAgICAgIGFkZGVkY291bnQuc3VidHJhY3QoYSkKKyAgICAgICAgYWRkZWQgPSBbXQorICAgICAgICBmb3IgeCBpbiBiOgorICAgICAgICAgICAgaWYgYWRkZWRjb3VudFt4XSA+IDA6CisgICAgICAgICAgICAgICAgYWRkZWRjb3VudFt4XSAtPSAxCisgICAgICAgICAgICAgICAgYWRkZWQuYXBwZW5kKHgpCisgICAgICAgIHJlbW92ZWQgPSBbXQorICAgICAgICBjaGFuZ2VkID0gW10KKyAgICAgICAgZm9yIHggaW4gYToKKyAgICAgICAgICAgIGlmIHJlbW92ZWRjb3VudFt4XSA+IDA6CisgICAgICAgICAgICAgICAgcmVtb3ZlZGNvdW50W3hdIC09IDEKKyAgICAgICAgICAgICAgICBmb3IgeSBpbiBhZGRlZDoKKyAgICAgICAgICAgICAgICAgICAgaWYgeVswXSA9PSB4WzBdOgorICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZC5hcHBlbmQoKHhbMF0sIHhbMV0sIHlbMV0pKQorICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWQucmVtb3ZlKHkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZWQuYXBwZW5kKHgpCisgICAgICAgIGFkZGVkID0gW3hbMF0gZm9yIHggaW4gYWRkZWRdCisgICAgICAgIHJlbW92ZWQgPSBbeFswXSBmb3IgeCBpbiByZW1vdmVkXQorICAgICAgICByZXR1cm4gY2hhbmdlZCwgYWRkZWQsIHJlbW92ZWQKKworICAgIGlmICdiYXNld2hpdGVsaXN0JyBpbiBhX2RhdGEgYW5kIGFfZGF0YVsnYmFzZXdoaXRlbGlzdCddICE9IGJfZGF0YVsnYmFzZXdoaXRlbGlzdCddOgorICAgICAgICBvdXRwdXQuYXBwZW5kKCJiYXNld2hpdGVsaXN0IGNoYW5nZWQgZnJvbSAnJXMnIHRvICclcyciICUgKGFfZGF0YVsnYmFzZXdoaXRlbGlzdCddLCBiX2RhdGFbJ2Jhc2V3aGl0ZWxpc3QnXSkpCisgICAgICAgIGlmIGFfZGF0YVsnYmFzZXdoaXRlbGlzdCddIGFuZCBiX2RhdGFbJ2Jhc2V3aGl0ZWxpc3QnXToKKyAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoImNoYW5nZWQgaXRlbXM6ICVzIiAlIGFfZGF0YVsnYmFzZXdoaXRlbGlzdCddLnN5bW1ldHJpY19kaWZmZXJlbmNlKGJfZGF0YVsnYmFzZXdoaXRlbGlzdCddKSkKKworICAgIGlmICd0YXNrd2hpdGVsaXN0JyBpbiBhX2RhdGEgYW5kIGFfZGF0YVsndGFza3doaXRlbGlzdCddICE9IGJfZGF0YVsndGFza3doaXRlbGlzdCddOgorICAgICAgICBvdXRwdXQuYXBwZW5kKCJ0YXNrd2hpdGVsaXN0IGNoYW5nZWQgZnJvbSAnJXMnIHRvICclcyciICUgKGFfZGF0YVsndGFza3doaXRlbGlzdCddLCBiX2RhdGFbJ3Rhc2t3aGl0ZWxpc3QnXSkpCisgICAgICAgIGlmIGFfZGF0YVsndGFza3doaXRlbGlzdCddIGFuZCBiX2RhdGFbJ3Rhc2t3aGl0ZWxpc3QnXToKKyAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoImNoYW5nZWQgaXRlbXM6ICVzIiAlIGFfZGF0YVsndGFza3doaXRlbGlzdCddLnN5bW1ldHJpY19kaWZmZXJlbmNlKGJfZGF0YVsndGFza3doaXRlbGlzdCddKSkKKworICAgIGlmIGFfZGF0YVsndGFza2RlcHMnXSAhPSBiX2RhdGFbJ3Rhc2tkZXBzJ106CisgICAgICAgIG91dHB1dC5hcHBlbmQoIlRhc2sgZGVwZW5kZW5jaWVzIGNoYW5nZWQgZnJvbTpcbiVzXG50bzpcbiVzIiAlIChzb3J0ZWQoYV9kYXRhWyd0YXNrZGVwcyddKSwgc29ydGVkKGJfZGF0YVsndGFza2RlcHMnXSkpKQorCisgICAgaWYgYV9kYXRhWydiYXNlaGFzaCddICE9IGJfZGF0YVsnYmFzZWhhc2gnXToKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgiYmFzZWhhc2ggY2hhbmdlZCBmcm9tICVzIHRvICVzIiAlIChhX2RhdGFbJ2Jhc2VoYXNoJ10sIGJfZGF0YVsnYmFzZWhhc2gnXSkpCisKKyAgICBjaGFuZ2VkLCBhZGRlZCwgcmVtb3ZlZCA9IGRpY3RfZGlmZihhX2RhdGFbJ2dlbmRlcHMnXSwgYl9kYXRhWydnZW5kZXBzJ10sIGFfZGF0YVsnYmFzZXdoaXRlbGlzdCddICYgYl9kYXRhWydiYXNld2hpdGVsaXN0J10pCisgICAgaWYgY2hhbmdlZDoKKyAgICAgICAgZm9yIGRlcCBpbiBjaGFuZ2VkOgorICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiTGlzdCBvZiBkZXBlbmRlbmNpZXMgZm9yIHZhcmlhYmxlICVzIGNoYW5nZWQgZnJvbSAnJXMnIHRvICclcyciICUgKGRlcCwgYV9kYXRhWydnZW5kZXBzJ11bZGVwXSwgYl9kYXRhWydnZW5kZXBzJ11bZGVwXSkpCisgICAgICAgICAgICBpZiBhX2RhdGFbJ2dlbmRlcHMnXVtkZXBdIGFuZCBiX2RhdGFbJ2dlbmRlcHMnXVtkZXBdOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoImNoYW5nZWQgaXRlbXM6ICVzIiAlIGFfZGF0YVsnZ2VuZGVwcyddW2RlcF0uc3ltbWV0cmljX2RpZmZlcmVuY2UoYl9kYXRhWydnZW5kZXBzJ11bZGVwXSkpCisgICAgaWYgYWRkZWQ6CisgICAgICAgIGZvciBkZXAgaW4gYWRkZWQ6CisgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJEZXBlbmRlbmN5IG9uIHZhcmlhYmxlICVzIHdhcyBhZGRlZCIgJSAoZGVwKSkKKyAgICBpZiByZW1vdmVkOgorICAgICAgICBmb3IgZGVwIGluIHJlbW92ZWQ6CisgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJEZXBlbmRlbmN5IG9uIFZhcmlhYmxlICVzIHdhcyByZW1vdmVkIiAlIChkZXApKQorCisKKyAgICBjaGFuZ2VkLCBhZGRlZCwgcmVtb3ZlZCA9IGRpY3RfZGlmZihhX2RhdGFbJ3ZhcnZhbHMnXSwgYl9kYXRhWyd2YXJ2YWxzJ10pCisgICAgaWYgY2hhbmdlZDoKKyAgICAgICAgZm9yIGRlcCBpbiBjaGFuZ2VkOgorICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiVmFyaWFibGUgJXMgdmFsdWUgY2hhbmdlZCBmcm9tICclcycgdG8gJyVzJyIgJSAoZGVwLCBhX2RhdGFbJ3ZhcnZhbHMnXVtkZXBdLCBiX2RhdGFbJ3ZhcnZhbHMnXVtkZXBdKSkKKworICAgIGNoYW5nZWQsIGFkZGVkLCByZW1vdmVkID0gZmlsZV9jaGVja3N1bXNfZGlmZihhX2RhdGFbJ2ZpbGVfY2hlY2tzdW1fdmFsdWVzJ10sIGJfZGF0YVsnZmlsZV9jaGVja3N1bV92YWx1ZXMnXSkKKyAgICBpZiBjaGFuZ2VkOgorICAgICAgICBmb3IgZiwgb2xkLCBuZXcgaW4gY2hhbmdlZDoKKyAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIkNoZWNrc3VtIGZvciBmaWxlICVzIGNoYW5nZWQgZnJvbSAlcyB0byAlcyIgJSAoZiwgb2xkLCBuZXcpKQorICAgIGlmIGFkZGVkOgorICAgICAgICBmb3IgZiBpbiBhZGRlZDoKKyAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIkRlcGVuZGVuY3kgb24gY2hlY2tzdW0gb2YgZmlsZSAlcyB3YXMgYWRkZWQiICUgKGYpKQorICAgIGlmIHJlbW92ZWQ6CisgICAgICAgIGZvciBmIGluIHJlbW92ZWQ6CisgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJEZXBlbmRlbmN5IG9uIGNoZWNrc3VtIG9mIGZpbGUgJXMgd2FzIHJlbW92ZWQiICUgKGYpKQorCisKKyAgICBpZiBsZW4oYV9kYXRhWydydW50YXNrZGVwcyddKSAhPSBsZW4oYl9kYXRhWydydW50YXNrZGVwcyddKToKKyAgICAgICAgY2hhbmdlZCA9IFsiTnVtYmVyIG9mIHRhc2sgZGVwZW5kZW5jaWVzIGNoYW5nZWQiXQorICAgIGVsc2U6CisgICAgICAgIGNoYW5nZWQgPSBbXQorICAgICAgICBmb3IgaWR4LCB0YXNrIGluIGVudW1lcmF0ZShhX2RhdGFbJ3J1bnRhc2tkZXBzJ10pOgorICAgICAgICAgICAgYSA9IGFfZGF0YVsncnVudGFza2RlcHMnXVtpZHhdCisgICAgICAgICAgICBiID0gYl9kYXRhWydydW50YXNrZGVwcyddW2lkeF0KKyAgICAgICAgICAgIGlmIGFfZGF0YVsncnVudGFza2hhc2hlcyddW2FdICE9IGJfZGF0YVsncnVudGFza2hhc2hlcyddW2JdOgorICAgICAgICAgICAgICAgIGNoYW5nZWQuYXBwZW5kKCIlcyB3aXRoIGhhc2ggJXNcbiBjaGFuZ2VkIHRvXG4lcyB3aXRoIGhhc2ggJXMiICUgKGEsIGFfZGF0YVsncnVudGFza2hhc2hlcyddW2FdLCBiLCBiX2RhdGFbJ3J1bnRhc2toYXNoZXMnXVtiXSkpCisKKyAgICBpZiBjaGFuZ2VkOgorICAgICAgICBvdXRwdXQuYXBwZW5kKCJydW50YXNrZGVwcyBjaGFuZ2VkIGZyb20gJXMgdG8gJXMiICUgKGNsZWFuX2Jhc2VwYXRoc19saXN0KGFfZGF0YVsncnVudGFza2RlcHMnXSksIGNsZWFuX2Jhc2VwYXRoc19saXN0KGJfZGF0YVsncnVudGFza2RlcHMnXSkpKQorICAgICAgICBvdXRwdXQuYXBwZW5kKCJcbiIuam9pbihjaGFuZ2VkKSkKKworCisgICAgaWYgJ3J1bnRhc2toYXNoZXMnIGluIGFfZGF0YSBhbmQgJ3J1bnRhc2toYXNoZXMnIGluIGJfZGF0YToKKyAgICAgICAgYSA9IGFfZGF0YVsncnVudGFza2hhc2hlcyddCisgICAgICAgIGIgPSBiX2RhdGFbJ3J1bnRhc2toYXNoZXMnXQorICAgICAgICBjaGFuZ2VkLCBhZGRlZCwgcmVtb3ZlZCA9IGRpY3RfZGlmZihhLCBiKQorICAgICAgICBpZiBhZGRlZDoKKyAgICAgICAgICAgIGZvciBkZXAgaW4gYWRkZWQ6CisgICAgICAgICAgICAgICAgYmRlcF9mb3VuZCA9IEZhbHNlCisgICAgICAgICAgICAgICAgaWYgcmVtb3ZlZDoKKyAgICAgICAgICAgICAgICAgICAgZm9yIGJkZXAgaW4gcmVtb3ZlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGJbZGVwXSA9PSBhW2JkZXBdOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICNvdXRwdXQuYXBwZW5kKCJEZXBlbmRlbmN5IG9uIHRhc2sgJXMgd2FzIHJlcGxhY2VkIGJ5ICVzIHdpdGggc2FtZSBoYXNoIiAlIChkZXAsIGJkZXApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJkZXBfZm91bmQgPSBUcnVlCisgICAgICAgICAgICAgICAgaWYgbm90IGJkZXBfZm91bmQ6CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIkRlcGVuZGVuY3kgb24gdGFzayAlcyB3YXMgYWRkZWQgd2l0aCBoYXNoICVzIiAlIChjbGVhbl9iYXNlcGF0aChkZXApLCBiW2RlcF0pKQorICAgICAgICBpZiByZW1vdmVkOgorICAgICAgICAgICAgZm9yIGRlcCBpbiByZW1vdmVkOgorICAgICAgICAgICAgICAgIGFkZXBfZm91bmQgPSBGYWxzZQorICAgICAgICAgICAgICAgIGlmIGFkZGVkOgorICAgICAgICAgICAgICAgICAgICBmb3IgYWRlcCBpbiBhZGRlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGJbYWRlcF0gPT0gYVtkZXBdOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICNvdXRwdXQuYXBwZW5kKCJEZXBlbmRlbmN5IG9uIHRhc2sgJXMgd2FzIHJlcGxhY2VkIGJ5ICVzIHdpdGggc2FtZSBoYXNoIiAlIChhZGVwLCBkZXApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZXBfZm91bmQgPSBUcnVlCisgICAgICAgICAgICAgICAgaWYgbm90IGFkZXBfZm91bmQ6CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIkRlcGVuZGVuY3kgb24gdGFzayAlcyB3YXMgcmVtb3ZlZCB3aXRoIGhhc2ggJXMiICUgKGNsZWFuX2Jhc2VwYXRoKGRlcCksIGFbZGVwXSkpCisgICAgICAgIGlmIGNoYW5nZWQ6CisgICAgICAgICAgICBmb3IgZGVwIGluIGNoYW5nZWQ6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiSGFzaCBmb3IgZGVwZW5kZW50IHRhc2sgJXMgY2hhbmdlZCBmcm9tICVzIHRvICVzIiAlIChjbGVhbl9iYXNlcGF0aChkZXApLCBhW2RlcF0sIGJbZGVwXSkpCisgICAgICAgICAgICAgICAgaWYgY2FsbGFibGUocmVjdXJzZWNiKToKKyAgICAgICAgICAgICAgICAgICAgIyBJZiBhIGRlcGVuZGVudCBoYXNoIGNoYW5nZWQsIG1pZ2h0IGFzIHdlbGwgcHJpbnQgdGhlIGxpbmUgYWJvdmUgYW5kIHRoZW4gZGVmZXIgdG8gdGhlIGNoYW5nZXMgaW4gCisgICAgICAgICAgICAgICAgICAgICMgdGhhdCBoYXNoIHNpbmNlIGluIGFsbCBsaWtlbHlob29kLCB0aGV5J3JlIHRoZSBzYW1lIGNoYW5nZXMgdGhpcyB0YXNrIGFsc28gc2F3LgorICAgICAgICAgICAgICAgICAgICByZWNvdXQgPSByZWN1cnNlY2IoZGVwLCBhW2RlcF0sIGJbZGVwXSkKKyAgICAgICAgICAgICAgICAgICAgaWYgcmVjb3V0OgorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gW291dHB1dFstMV1dICsgcmVjb3V0CisKKyAgICBhX3RhaW50ID0gYV9kYXRhLmdldCgndGFpbnQnLCBOb25lKQorICAgIGJfdGFpbnQgPSBiX2RhdGEuZ2V0KCd0YWludCcsIE5vbmUpCisgICAgaWYgYV90YWludCAhPSBiX3RhaW50OgorICAgICAgICBvdXRwdXQuYXBwZW5kKCJUYWludCAoYnkgZm9yY2VkL2ludmFsaWRhdGVkIHRhc2spIGNoYW5nZWQgZnJvbSAlcyB0byAlcyIgJSAoYV90YWludCwgYl90YWludCkpCisKKyAgICByZXR1cm4gb3V0cHV0CisKKworZGVmIGR1bXBfc2lnZmlsZShhKToKKyAgICBvdXRwdXQgPSBbXQorCisgICAgcDEgPSBwaWNrbGUuVW5waWNrbGVyKG9wZW4oYSwgInJiIikpCisgICAgYV9kYXRhID0gcDEubG9hZCgpCisKKyAgICBvdXRwdXQuYXBwZW5kKCJiYXNld2hpdGVsaXN0OiAlcyIgJSAoYV9kYXRhWydiYXNld2hpdGVsaXN0J10pKQorCisgICAgb3V0cHV0LmFwcGVuZCgidGFza3doaXRlbGlzdDogJXMiICUgKGFfZGF0YVsndGFza3doaXRlbGlzdCddKSkKKworICAgIG91dHB1dC5hcHBlbmQoIlRhc2sgZGVwZW5kZW5jaWVzOiAlcyIgJSAoc29ydGVkKGFfZGF0YVsndGFza2RlcHMnXSkpKQorCisgICAgb3V0cHV0LmFwcGVuZCgiYmFzZWhhc2g6ICVzIiAlIChhX2RhdGFbJ2Jhc2VoYXNoJ10pKQorCisgICAgZm9yIGRlcCBpbiBhX2RhdGFbJ2dlbmRlcHMnXToKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgiTGlzdCBvZiBkZXBlbmRlbmNpZXMgZm9yIHZhcmlhYmxlICVzIGlzICVzIiAlIChkZXAsIGFfZGF0YVsnZ2VuZGVwcyddW2RlcF0pKQorCisgICAgZm9yIGRlcCBpbiBhX2RhdGFbJ3ZhcnZhbHMnXToKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgiVmFyaWFibGUgJXMgdmFsdWUgaXMgJXMiICUgKGRlcCwgYV9kYXRhWyd2YXJ2YWxzJ11bZGVwXSkpCisKKyAgICBpZiAncnVudGFza2RlcHMnIGluIGFfZGF0YToKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgiVGFza3MgdGhpcyB0YXNrIGRlcGVuZHMgb246ICVzIiAlIChhX2RhdGFbJ3J1bnRhc2tkZXBzJ10pKQorCisgICAgaWYgJ2ZpbGVfY2hlY2tzdW1fdmFsdWVzJyBpbiBhX2RhdGE6CisgICAgICAgIG91dHB1dC5hcHBlbmQoIlRoaXMgdGFzayBkZXBlbmRzIG9uIHRoZSBjaGVja3N1bXMgb2YgZmlsZXM6ICVzIiAlIChhX2RhdGFbJ2ZpbGVfY2hlY2tzdW1fdmFsdWVzJ10pKQorCisgICAgaWYgJ3J1bnRhc2toYXNoZXMnIGluIGFfZGF0YToKKyAgICAgICAgZm9yIGRlcCBpbiBhX2RhdGFbJ3J1bnRhc2toYXNoZXMnXToKKyAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIkhhc2ggZm9yIGRlcGVuZGVudCB0YXNrICVzIGlzICVzIiAlIChkZXAsIGFfZGF0YVsncnVudGFza2hhc2hlcyddW2RlcF0pKQorCisgICAgaWYgJ3RhaW50JyBpbiBhX2RhdGE6CisgICAgICAgIG91dHB1dC5hcHBlbmQoIlRhaW50ZWQgKGJ5IGZvcmNlZC9pbnZhbGlkYXRlZCB0YXNrKTogJXMiICUgYV9kYXRhWyd0YWludCddKQorCisgICAgZGF0YSA9IGFfZGF0YVsnYmFzZWhhc2gnXQorICAgIGZvciBkZXAgaW4gYV9kYXRhWydydW50YXNrZGVwcyddOgorICAgICAgICBkYXRhID0gZGF0YSArIGFfZGF0YVsncnVudGFza2hhc2hlcyddW2RlcF0KKworICAgIGZvciBjIGluIGFfZGF0YVsnZmlsZV9jaGVja3N1bV92YWx1ZXMnXToKKyAgICAgICAgZGF0YSA9IGRhdGEgKyBjWzFdCisKKyAgICBpZiAndGFpbnQnIGluIGFfZGF0YToKKyAgICAgICAgZGF0YSA9IGRhdGEgKyBhX2RhdGFbJ3RhaW50J10KKworICAgIGggPSBoYXNobGliLm1kNShkYXRhKS5oZXhkaWdlc3QoKQorICAgIG91dHB1dC5hcHBlbmQoIkNvbXB1dGVkIEhhc2ggaXMgJXMiICUgaCkKKworICAgIHJldHVybiBvdXRwdXQKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3Rhc2tkYXRhLnB5IGIvYml0YmFrZS9saWIvYmIvdGFza2RhdGEucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZhYjcwNAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3Rhc2tkYXRhLnB5CkBAIC0wLDAgKzEsNjU1IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisiIiIKK0JpdEJha2UgJ1Rhc2tEYXRhJyBpbXBsZW1lbnRhdGlvbgorCitUYXNrIGRhdGEgY29sbGVjdGlvbiBhbmQgaGFuZGxpbmcKKworIiIiCisKKyMgQ29weXJpZ2h0IChDKSAyMDA2ICBSaWNoYXJkIFB1cmRpZQorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCByZQoraW1wb3J0IGJiCisKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJCaXRCYWtlLlRhc2tEYXRhIikKKworZGVmIHJlX21hdGNoX3N0cmluZ3ModGFyZ2V0LCBzdHJpbmdzKToKKyAgICAiIiIKKyAgICBXaGV0aGVyIG9yIG5vdCB0aGUgc3RyaW5nICd0YXJnZXQnIG1hdGNoZXMKKyAgICBhbnkgb25lIHN0cmluZyBvZiB0aGUgc3RyaW5ncyB3aGljaCBjYW4gYmUgcmVndWxhciBleHByZXNzaW9uIHN0cmluZworICAgICIiIgorICAgIHJldHVybiBhbnkobmFtZSA9PSB0YXJnZXQgb3IgcmUubWF0Y2gobmFtZSwgdGFyZ2V0KQorICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gc3RyaW5ncykKKworY2xhc3MgVGFza0RhdGE6CisgICAgIiIiCisgICAgQml0QmFrZSBUYXNrIERhdGEgaW1wbGVtZW50YXRpb24KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYWJvcnQgPSBUcnVlLCB0cnlhbHRjb25maWdzID0gRmFsc2UsIHNraXBsaXN0ID0gTm9uZSwgYWxsb3dpbmNvbXBsZXRlID0gRmFsc2UpOgorICAgICAgICBzZWxmLmJ1aWxkX25hbWVzX2luZGV4ID0gW10KKyAgICAgICAgc2VsZi5ydW5fbmFtZXNfaW5kZXggPSBbXQorICAgICAgICBzZWxmLmZuX2luZGV4ID0gW10KKworICAgICAgICBzZWxmLmJ1aWxkX3RhcmdldHMgPSB7fQorICAgICAgICBzZWxmLnJ1bl90YXJnZXRzID0ge30KKworICAgICAgICBzZWxmLmV4dGVybmFsX3RhcmdldHMgPSBbXQorCisgICAgICAgIHNlbGYudGFza3NfZm5pZCA9IFtdCisgICAgICAgIHNlbGYudGFza3NfbmFtZSA9IFtdCisgICAgICAgIHNlbGYudGFza3NfdGRlcGVuZHMgPSBbXQorICAgICAgICBzZWxmLnRhc2tzX2lkZXBlbmRzID0gW10KKyAgICAgICAgc2VsZi50YXNrc19pcmRlcGVuZHMgPSBbXQorICAgICAgICAjIENhY2hlIHRvIHNwZWVkIHVwIHRhc2sgSUQgbG9va3VwcworICAgICAgICBzZWxmLnRhc2tzX2xvb2t1cCA9IHt9CisKKyAgICAgICAgc2VsZi5kZXBpZHMgPSB7fQorICAgICAgICBzZWxmLnJkZXBpZHMgPSB7fQorCisgICAgICAgIHNlbGYuY29uc2lkZXJfbXNnc19jYWNoZSA9IFtdCisKKyAgICAgICAgc2VsZi5mYWlsZWRfZGVwcyA9IFtdCisgICAgICAgIHNlbGYuZmFpbGVkX3JkZXBzID0gW10KKyAgICAgICAgc2VsZi5mYWlsZWRfZm5pZHMgPSBbXQorCisgICAgICAgIHNlbGYuYWJvcnQgPSBhYm9ydAorICAgICAgICBzZWxmLnRyeWFsdGNvbmZpZ3MgPSB0cnlhbHRjb25maWdzCisgICAgICAgIHNlbGYuYWxsb3dpbmNvbXBsZXRlID0gYWxsb3dpbmNvbXBsZXRlCisKKyAgICAgICAgc2VsZi5za2lwbGlzdCA9IHNraXBsaXN0CisKKyAgICBkZWYgZ2V0YnVpbGRfaWQoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYW4gSUQgbnVtYmVyIGZvciB0aGUgYnVpbGQgdGFyZ2V0IG5hbWUuCisgICAgICAgIElmIGl0IGRvZXNuJ3QgZXhpc3QsIGNyZWF0ZSBvbmUuCisgICAgICAgICIiIgorICAgICAgICBpZiBub3QgbmFtZSBpbiBzZWxmLmJ1aWxkX25hbWVzX2luZGV4OgorICAgICAgICAgICAgc2VsZi5idWlsZF9uYW1lc19pbmRleC5hcHBlbmQobmFtZSkKKyAgICAgICAgICAgIHJldHVybiBsZW4oc2VsZi5idWlsZF9uYW1lc19pbmRleCkgLSAxCisKKyAgICAgICAgcmV0dXJuIHNlbGYuYnVpbGRfbmFtZXNfaW5kZXguaW5kZXgobmFtZSkKKworICAgIGRlZiBnZXRydW5faWQoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYW4gSUQgbnVtYmVyIGZvciB0aGUgcnVuIHRhcmdldCBuYW1lLgorICAgICAgICBJZiBpdCBkb2Vzbid0IGV4aXN0LCBjcmVhdGUgb25lLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IG5hbWUgaW4gc2VsZi5ydW5fbmFtZXNfaW5kZXg6CisgICAgICAgICAgICBzZWxmLnJ1bl9uYW1lc19pbmRleC5hcHBlbmQobmFtZSkKKyAgICAgICAgICAgIHJldHVybiBsZW4oc2VsZi5ydW5fbmFtZXNfaW5kZXgpIC0gMQorCisgICAgICAgIHJldHVybiBzZWxmLnJ1bl9uYW1lc19pbmRleC5pbmRleChuYW1lKQorCisgICAgZGVmIGdldGZuX2lkKHNlbGYsIG5hbWUpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGFuIElEIG51bWJlciBmb3IgdGhlIGZpbGVuYW1lLgorICAgICAgICBJZiBpdCBkb2Vzbid0IGV4aXN0LCBjcmVhdGUgb25lLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IG5hbWUgaW4gc2VsZi5mbl9pbmRleDoKKyAgICAgICAgICAgIHNlbGYuZm5faW5kZXguYXBwZW5kKG5hbWUpCisgICAgICAgICAgICByZXR1cm4gbGVuKHNlbGYuZm5faW5kZXgpIC0gMQorCisgICAgICAgIHJldHVybiBzZWxmLmZuX2luZGV4LmluZGV4KG5hbWUpCisKKyAgICBkZWYgZ2V0dGFza19pZHMoc2VsZiwgZm5pZCk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYW4gYXJyYXkgb2YgdGhlIElEIG51bWJlcnMgbWF0Y2hpbmcgYSBnaXZlbiBmbmlkLgorICAgICAgICAiIiIKKyAgICAgICAgaWRzID0gW10KKyAgICAgICAgaWYgZm5pZCBpbiBzZWxmLnRhc2tzX2xvb2t1cDoKKyAgICAgICAgICAgIGZvciB0YXNrIGluIHNlbGYudGFza3NfbG9va3VwW2ZuaWRdOgorICAgICAgICAgICAgICAgIGlkcy5hcHBlbmQoc2VsZi50YXNrc19sb29rdXBbZm5pZF1bdGFza10pCisgICAgICAgIHJldHVybiBpZHMKKworICAgIGRlZiBnZXR0YXNrX2lkX2Zyb21mbmlkKHNlbGYsIGZuaWQsIHRhc2spOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGFuIElEIG51bWJlciBmb3IgdGhlIHRhc2sgbWF0Y2hpbmcgZm5pZCBhbmQgdGFzay4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGZuaWQgaW4gc2VsZi50YXNrc19sb29rdXA6CisgICAgICAgICAgICBpZiB0YXNrIGluIHNlbGYudGFza3NfbG9va3VwW2ZuaWRdOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnRhc2tzX2xvb2t1cFtmbmlkXVt0YXNrXQorCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgZ2V0dGFza19pZChzZWxmLCBmbiwgdGFzaywgY3JlYXRlID0gVHJ1ZSk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYW4gSUQgbnVtYmVyIGZvciB0aGUgdGFzayBtYXRjaGluZyBmbiBhbmQgdGFzay4KKyAgICAgICAgSWYgaXQgZG9lc24ndCBleGlzdCwgY3JlYXRlIG9uZSBieSBkZWZhdWx0LgorICAgICAgICBPcHRpb25hbGx5IHJldHVybiBOb25lIGluc3RlYWQuCisgICAgICAgICIiIgorICAgICAgICBmbmlkID0gc2VsZi5nZXRmbl9pZChmbikKKworICAgICAgICBpZiBmbmlkIGluIHNlbGYudGFza3NfbG9va3VwOgorICAgICAgICAgICAgaWYgdGFzayBpbiBzZWxmLnRhc2tzX2xvb2t1cFtmbmlkXToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi50YXNrc19sb29rdXBbZm5pZF1bdGFza10KKworICAgICAgICBpZiBub3QgY3JlYXRlOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICBzZWxmLnRhc2tzX25hbWUuYXBwZW5kKHRhc2spCisgICAgICAgIHNlbGYudGFza3NfZm5pZC5hcHBlbmQoZm5pZCkKKyAgICAgICAgc2VsZi50YXNrc190ZGVwZW5kcy5hcHBlbmQoW10pCisgICAgICAgIHNlbGYudGFza3NfaWRlcGVuZHMuYXBwZW5kKFtdKQorICAgICAgICBzZWxmLnRhc2tzX2lyZGVwZW5kcy5hcHBlbmQoW10pCisKKyAgICAgICAgbGlzdGlkID0gbGVuKHNlbGYudGFza3NfbmFtZSkgLSAxCisKKyAgICAgICAgaWYgZm5pZCBub3QgaW4gc2VsZi50YXNrc19sb29rdXA6CisgICAgICAgICAgICBzZWxmLnRhc2tzX2xvb2t1cFtmbmlkXSA9IHt9CisgICAgICAgIHNlbGYudGFza3NfbG9va3VwW2ZuaWRdW3Rhc2tdID0gbGlzdGlkCisKKyAgICAgICAgcmV0dXJuIGxpc3RpZAorCisgICAgZGVmIGFkZF90YXNrcyhzZWxmLCBmbiwgZGF0YUNhY2hlKToKKyAgICAgICAgIiIiCisgICAgICAgIEFkZCB0YXNrcyBmb3IgYSBnaXZlbiBmbiB0byB0aGUgZGF0YWJhc2UKKyAgICAgICAgIiIiCisKKyAgICAgICAgdGFza19kZXBzID0gZGF0YUNhY2hlLnRhc2tfZGVwc1tmbl0KKworICAgICAgICBmbmlkID0gc2VsZi5nZXRmbl9pZChmbikKKworICAgICAgICBpZiBmbmlkIGluIHNlbGYuZmFpbGVkX2ZuaWRzOgorICAgICAgICAgICAgYmIubXNnLmZhdGFsKCJUYXNrRGF0YSIsICJUcnlpbmcgdG8gcmUtYWRkIGEgZmFpbGVkIGZpbGU/IFNvbWV0aGluZyBpcyBicm9rZW4uLi4iKQorCisgICAgICAgICMgQ2hlY2sgaWYgd2UndmUgYWxyZWFkeSBzZWVuIHRoaXMgZm4KKyAgICAgICAgaWYgZm5pZCBpbiBzZWxmLnRhc2tzX2ZuaWQ6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBmb3IgdGFzayBpbiB0YXNrX2RlcHNbJ3Rhc2tzJ106CisKKyAgICAgICAgICAgICMgV29yayBvdXQgdGFzayBkZXBlbmRlbmNpZXMKKyAgICAgICAgICAgIHBhcmVudGlkcyA9IFtdCisgICAgICAgICAgICBmb3IgZGVwIGluIHRhc2tfZGVwc1sncGFyZW50cyddW3Rhc2tdOgorICAgICAgICAgICAgICAgIGlmIGRlcCBub3QgaW4gdGFza19kZXBzWyd0YXNrcyddOgorICAgICAgICAgICAgICAgICAgICBiYi5kZWJ1ZygyLCAiTm90IGFkZGluZyBkZXBlbmRlbnkgb2YgJXMgb24gJXMgc2luY2UgJXMgZG9lcyBub3QgZXhpc3QiICUgKHRhc2ssIGRlcCwgZGVwKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBwYXJlbnRpZCA9IHNlbGYuZ2V0dGFza19pZChmbiwgZGVwKQorICAgICAgICAgICAgICAgIHBhcmVudGlkcy5hcHBlbmQocGFyZW50aWQpCisgICAgICAgICAgICB0YXNraWQgPSBzZWxmLmdldHRhc2tfaWQoZm4sIHRhc2spCisgICAgICAgICAgICBzZWxmLnRhc2tzX3RkZXBlbmRzW3Rhc2tpZF0uZXh0ZW5kKHBhcmVudGlkcykKKworICAgICAgICAgICAgIyBUb3VjaCBhbGwgaW50ZXJ0YXNrIGRlcGVuZGVuY2llcworICAgICAgICAgICAgaWYgJ2RlcGVuZHMnIGluIHRhc2tfZGVwcyBhbmQgdGFzayBpbiB0YXNrX2RlcHNbJ2RlcGVuZHMnXToKKyAgICAgICAgICAgICAgICBpZHMgPSBbXQorICAgICAgICAgICAgICAgIGZvciBkZXAgaW4gdGFza19kZXBzWydkZXBlbmRzJ11bdGFza10uc3BsaXQoKToKKyAgICAgICAgICAgICAgICAgICAgaWYgZGVwOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgIjoiIG5vdCBpbiBkZXA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmIubXNnLmZhdGFsKCJUYXNrRGF0YSIsICJFcnJvciBmb3IgJXMsIGRlcGVuZGVuY3kgJXMgZG9lcyBub3QgY29udGFpbiAnOicgY2hhcmFjdGVyXG4uIFRhc2sgJ2RlcGVuZHMnIHNob3VsZCBiZSBzcGVjaWZpZWQgaW4gdGhlIGZvcm0gJ3BhY2thZ2VuYW1lOnRhc2snIiAlIChmbiwgZGVwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkcy5hcHBlbmQoKChzZWxmLmdldGJ1aWxkX2lkKGRlcC5zcGxpdCgiOiIpWzBdKSksIGRlcC5zcGxpdCgiOiIpWzFdKSkKKyAgICAgICAgICAgICAgICBzZWxmLnRhc2tzX2lkZXBlbmRzW3Rhc2tpZF0uZXh0ZW5kKGlkcykKKyAgICAgICAgICAgIGlmICdyZGVwZW5kcycgaW4gdGFza19kZXBzIGFuZCB0YXNrIGluIHRhc2tfZGVwc1sncmRlcGVuZHMnXToKKyAgICAgICAgICAgICAgICBpZHMgPSBbXQorICAgICAgICAgICAgICAgIGZvciBkZXAgaW4gdGFza19kZXBzWydyZGVwZW5kcyddW3Rhc2tdLnNwbGl0KCk6CisgICAgICAgICAgICAgICAgICAgIGlmIGRlcDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICI6IiBub3QgaW4gZGVwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiLm1zZy5mYXRhbCgiVGFza0RhdGEiLCAiRXJyb3IgZm9yICVzLCBkZXBlbmRlbmN5ICVzIGRvZXMgbm90IGNvbnRhaW4gJzonIGNoYXJhY3RlclxuLiBUYXNrICdyZGVwZW5kcycgc2hvdWxkIGJlIHNwZWNpZmllZCBpbiB0aGUgZm9ybSAncGFja2FnZW5hbWU6dGFzayciICUgKGZuLCBkZXApKQorICAgICAgICAgICAgICAgICAgICAgICAgaWRzLmFwcGVuZCgoKHNlbGYuZ2V0cnVuX2lkKGRlcC5zcGxpdCgiOiIpWzBdKSksIGRlcC5zcGxpdCgiOiIpWzFdKSkKKyAgICAgICAgICAgICAgICBzZWxmLnRhc2tzX2lyZGVwZW5kc1t0YXNraWRdLmV4dGVuZChpZHMpCisKKworICAgICAgICAjIFdvcmsgb3V0IGJ1aWxkIGRlcGVuZGVuY2llcworICAgICAgICBpZiBub3QgZm5pZCBpbiBzZWxmLmRlcGlkczoKKyAgICAgICAgICAgIGRlcGVuZGlkcyA9IHt9CisgICAgICAgICAgICBmb3IgZGVwZW5kIGluIGRhdGFDYWNoZS5kZXBzW2ZuXToKKyAgICAgICAgICAgICAgICBkZXBlbmRpZHNbc2VsZi5nZXRidWlsZF9pZChkZXBlbmQpXSA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYuZGVwaWRzW2ZuaWRdID0gZGVwZW5kaWRzLmtleXMoKQorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICJBZGRlZCBkZXBlbmRlbmNpZXMgJXMgZm9yICVzIiwgc3RyKGRhdGFDYWNoZS5kZXBzW2ZuXSksIGZuKQorCisgICAgICAgICMgV29yayBvdXQgcnVudGltZSBkZXBlbmRlbmNpZXMKKyAgICAgICAgaWYgbm90IGZuaWQgaW4gc2VsZi5yZGVwaWRzOgorICAgICAgICAgICAgcmRlcGVuZGlkcyA9IHt9CisgICAgICAgICAgICByZGVwZW5kcyA9IGRhdGFDYWNoZS5ydW5kZXBzW2ZuXQorICAgICAgICAgICAgcnJlY3MgPSBkYXRhQ2FjaGUucnVucmVjc1tmbl0KKyAgICAgICAgICAgIHJkZXBlbmRsaXN0ID0gW10KKyAgICAgICAgICAgIHJyZWNsaXN0ID0gW10KKyAgICAgICAgICAgIGZvciBwYWNrYWdlIGluIHJkZXBlbmRzOgorICAgICAgICAgICAgICAgIGZvciByZGVwZW5kIGluIHJkZXBlbmRzW3BhY2thZ2VdOgorICAgICAgICAgICAgICAgICAgICByZGVwZW5kbGlzdC5hcHBlbmQocmRlcGVuZCkKKyAgICAgICAgICAgICAgICAgICAgcmRlcGVuZGlkc1tzZWxmLmdldHJ1bl9pZChyZGVwZW5kKV0gPSBOb25lCisgICAgICAgICAgICBmb3IgcGFja2FnZSBpbiBycmVjczoKKyAgICAgICAgICAgICAgICBmb3IgcmRlcGVuZCBpbiBycmVjc1twYWNrYWdlXToKKyAgICAgICAgICAgICAgICAgICAgcnJlY2xpc3QuYXBwZW5kKHJkZXBlbmQpCisgICAgICAgICAgICAgICAgICAgIHJkZXBlbmRpZHNbc2VsZi5nZXRydW5faWQocmRlcGVuZCldID0gTm9uZQorICAgICAgICAgICAgaWYgcmRlcGVuZGxpc3Q6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICJBZGRlZCBydW50aW1lIGRlcGVuZGVuY2llcyAlcyBmb3IgJXMiLCBzdHIocmRlcGVuZGxpc3QpLCBmbikKKyAgICAgICAgICAgIGlmIHJyZWNsaXN0OgorICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygyLCAiQWRkZWQgcnVudGltZSByZWNvbW1lbmRhdGlvbnMgJXMgZm9yICVzIiwgc3RyKHJyZWNsaXN0KSwgZm4pCisgICAgICAgICAgICBzZWxmLnJkZXBpZHNbZm5pZF0gPSByZGVwZW5kaWRzLmtleXMoKQorCisgICAgICAgIGZvciBkZXAgaW4gc2VsZi5kZXBpZHNbZm5pZF06CisgICAgICAgICAgICBpZiBkZXAgaW4gc2VsZi5mYWlsZWRfZGVwczoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWxfZm5pZChmbmlkKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBmb3IgZGVwIGluIHNlbGYucmRlcGlkc1tmbmlkXToKKyAgICAgICAgICAgIGlmIGRlcCBpbiBzZWxmLmZhaWxlZF9yZGVwczoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWxfZm5pZChmbmlkKQorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgZGVmIGhhdmVfYnVpbGRfdGFyZ2V0KHNlbGYsIHRhcmdldCk6CisgICAgICAgICIiIgorICAgICAgICBIYXZlIHdlIGEgYnVpbGQgdGFyZ2V0IG1hdGNoaW5nIHRoaXMgbmFtZT8KKyAgICAgICAgIiIiCisgICAgICAgIHRhcmdldGlkID0gc2VsZi5nZXRidWlsZF9pZCh0YXJnZXQpCisKKyAgICAgICAgaWYgdGFyZ2V0aWQgaW4gc2VsZi5idWlsZF90YXJnZXRzOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgaGF2ZV9ydW50aW1lX3RhcmdldChzZWxmLCB0YXJnZXQpOgorICAgICAgICAiIiIKKyAgICAgICAgSGF2ZSB3ZSBhIHJ1bnRpbWUgdGFyZ2V0IG1hdGNoaW5nIHRoaXMgbmFtZT8KKyAgICAgICAgIiIiCisgICAgICAgIHRhcmdldGlkID0gc2VsZi5nZXRydW5faWQodGFyZ2V0KQorCisgICAgICAgIGlmIHRhcmdldGlkIGluIHNlbGYucnVuX3RhcmdldHM6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBhZGRfYnVpbGRfdGFyZ2V0KHNlbGYsIGZuLCBpdGVtKToKKyAgICAgICAgIiIiCisgICAgICAgIEFkZCBhIGJ1aWxkIHRhcmdldC4KKyAgICAgICAgSWYgYWxyZWFkeSBwcmVzZW50LCBhcHBlbmQgdGhlIHByb3ZpZGVyIGZuIHRvIHRoZSBsaXN0CisgICAgICAgICIiIgorICAgICAgICB0YXJnZXRpZCA9IHNlbGYuZ2V0YnVpbGRfaWQoaXRlbSkKKyAgICAgICAgZm5pZCA9IHNlbGYuZ2V0Zm5faWQoZm4pCisKKyAgICAgICAgaWYgdGFyZ2V0aWQgaW4gc2VsZi5idWlsZF90YXJnZXRzOgorICAgICAgICAgICAgaWYgZm5pZCBpbiBzZWxmLmJ1aWxkX3RhcmdldHNbdGFyZ2V0aWRdOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgc2VsZi5idWlsZF90YXJnZXRzW3RhcmdldGlkXS5hcHBlbmQoZm5pZCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmJ1aWxkX3RhcmdldHNbdGFyZ2V0aWRdID0gW2ZuaWRdCisKKyAgICBkZWYgYWRkX3J1bnRpbWVfdGFyZ2V0KHNlbGYsIGZuLCBpdGVtKToKKyAgICAgICAgIiIiCisgICAgICAgIEFkZCBhIHJ1bnRpbWUgdGFyZ2V0LgorICAgICAgICBJZiBhbHJlYWR5IHByZXNlbnQsIGFwcGVuZCB0aGUgcHJvdmlkZXIgZm4gdG8gdGhlIGxpc3QKKyAgICAgICAgIiIiCisgICAgICAgIHRhcmdldGlkID0gc2VsZi5nZXRydW5faWQoaXRlbSkKKyAgICAgICAgZm5pZCA9IHNlbGYuZ2V0Zm5faWQoZm4pCisKKyAgICAgICAgaWYgdGFyZ2V0aWQgaW4gc2VsZi5ydW5fdGFyZ2V0czoKKyAgICAgICAgICAgIGlmIGZuaWQgaW4gc2VsZi5ydW5fdGFyZ2V0c1t0YXJnZXRpZF06CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBzZWxmLnJ1bl90YXJnZXRzW3RhcmdldGlkXS5hcHBlbmQoZm5pZCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLnJ1bl90YXJnZXRzW3RhcmdldGlkXSA9IFtmbmlkXQorCisgICAgZGVmIG1hcmtfZXh0ZXJuYWxfdGFyZ2V0KHNlbGYsIGl0ZW0pOgorICAgICAgICAiIiIKKyAgICAgICAgTWFyayBhIGJ1aWxkIHRhcmdldCBhcyBiZWluZyBleHRlcm5hbGx5IHJlcXVlc3RlZAorICAgICAgICAiIiIKKyAgICAgICAgdGFyZ2V0aWQgPSBzZWxmLmdldGJ1aWxkX2lkKGl0ZW0pCisKKyAgICAgICAgaWYgdGFyZ2V0aWQgbm90IGluIHNlbGYuZXh0ZXJuYWxfdGFyZ2V0czoKKyAgICAgICAgICAgIHNlbGYuZXh0ZXJuYWxfdGFyZ2V0cy5hcHBlbmQodGFyZ2V0aWQpCisKKyAgICBkZWYgZ2V0X3VucmVzb2x2ZWRfYnVpbGRfdGFyZ2V0cyhzZWxmLCBkYXRhQ2FjaGUpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgbGlzdCBvZiBidWlsZCB0YXJnZXRzIHdobydzIHByb3ZpZGVycworICAgICAgICBhcmUgdW5rbm93bi4KKyAgICAgICAgIiIiCisgICAgICAgIHVucmVzb2x2ZWQgPSBbXQorICAgICAgICBmb3IgdGFyZ2V0IGluIHNlbGYuYnVpbGRfbmFtZXNfaW5kZXg6CisgICAgICAgICAgICBpZiByZV9tYXRjaF9zdHJpbmdzKHRhcmdldCwgZGF0YUNhY2hlLmlnbm9yZWRfZGVwZW5kZW5jaWVzKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgc2VsZi5idWlsZF9uYW1lc19pbmRleC5pbmRleCh0YXJnZXQpIGluIHNlbGYuZmFpbGVkX2RlcHM6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmhhdmVfYnVpbGRfdGFyZ2V0KHRhcmdldCk6CisgICAgICAgICAgICAgICAgdW5yZXNvbHZlZC5hcHBlbmQodGFyZ2V0KQorICAgICAgICByZXR1cm4gdW5yZXNvbHZlZAorCisgICAgZGVmIGdldF91bnJlc29sdmVkX3J1bl90YXJnZXRzKHNlbGYsIGRhdGFDYWNoZSk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBsaXN0IG9mIHJ1bnRpbWUgdGFyZ2V0cyB3aG8ncyBwcm92aWRlcnMKKyAgICAgICAgYXJlIHVua25vd24uCisgICAgICAgICIiIgorICAgICAgICB1bnJlc29sdmVkID0gW10KKyAgICAgICAgZm9yIHRhcmdldCBpbiBzZWxmLnJ1bl9uYW1lc19pbmRleDoKKyAgICAgICAgICAgIGlmIHJlX21hdGNoX3N0cmluZ3ModGFyZ2V0LCBkYXRhQ2FjaGUuaWdub3JlZF9kZXBlbmRlbmNpZXMpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBzZWxmLnJ1bl9uYW1lc19pbmRleC5pbmRleCh0YXJnZXQpIGluIHNlbGYuZmFpbGVkX3JkZXBzOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5oYXZlX3J1bnRpbWVfdGFyZ2V0KHRhcmdldCk6CisgICAgICAgICAgICAgICAgdW5yZXNvbHZlZC5hcHBlbmQodGFyZ2V0KQorICAgICAgICByZXR1cm4gdW5yZXNvbHZlZAorCisgICAgZGVmIGdldF9wcm92aWRlcihzZWxmLCBpdGVtKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIGxpc3Qgb2YgcHJvdmlkZXJzIG9mIGl0ZW0KKyAgICAgICAgIiIiCisgICAgICAgIHRhcmdldGlkID0gc2VsZi5nZXRidWlsZF9pZChpdGVtKQorCisgICAgICAgIHJldHVybiBzZWxmLmJ1aWxkX3RhcmdldHNbdGFyZ2V0aWRdCisKKyAgICBkZWYgZ2V0X2RlcGVuZGVlcyhzZWxmLCBpdGVtaWQpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgbGlzdCBvZiB0YXJnZXRzIHdoaWNoIGRlcGVuZCBvbiBpdGVtCisgICAgICAgICIiIgorICAgICAgICBkZXBlbmRlZXMgPSBbXQorICAgICAgICBmb3IgZm5pZCBpbiBzZWxmLmRlcGlkczoKKyAgICAgICAgICAgIGlmIGl0ZW1pZCBpbiBzZWxmLmRlcGlkc1tmbmlkXToKKyAgICAgICAgICAgICAgICBkZXBlbmRlZXMuYXBwZW5kKGZuaWQpCisgICAgICAgIHJldHVybiBkZXBlbmRlZXMKKworICAgIGRlZiBnZXRfZGVwZW5kZWVzX3N0cihzZWxmLCBpdGVtKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIGxpc3Qgb2YgdGFyZ2V0cyB3aGljaCBkZXBlbmQgb24gaXRlbSBhcyBhIHVzZXIgcmVhZGFibGUgc3RyaW5nCisgICAgICAgICIiIgorICAgICAgICBpdGVtaWQgPSBzZWxmLmdldGJ1aWxkX2lkKGl0ZW0pCisgICAgICAgIGRlcGVuZGVlcyA9IFtdCisgICAgICAgIGZvciBmbmlkIGluIHNlbGYuZGVwaWRzOgorICAgICAgICAgICAgaWYgaXRlbWlkIGluIHNlbGYuZGVwaWRzW2ZuaWRdOgorICAgICAgICAgICAgICAgIGRlcGVuZGVlcy5hcHBlbmQoc2VsZi5mbl9pbmRleFtmbmlkXSkKKyAgICAgICAgcmV0dXJuIGRlcGVuZGVlcworCisgICAgZGVmIGdldF9yZGVwZW5kZWVzKHNlbGYsIGl0ZW1pZCk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBsaXN0IG9mIHRhcmdldHMgd2hpY2ggZGVwZW5kIG9uIHJ1bnRpbWUgaXRlbQorICAgICAgICAiIiIKKyAgICAgICAgZGVwZW5kZWVzID0gW10KKyAgICAgICAgZm9yIGZuaWQgaW4gc2VsZi5yZGVwaWRzOgorICAgICAgICAgICAgaWYgaXRlbWlkIGluIHNlbGYucmRlcGlkc1tmbmlkXToKKyAgICAgICAgICAgICAgICBkZXBlbmRlZXMuYXBwZW5kKGZuaWQpCisgICAgICAgIHJldHVybiBkZXBlbmRlZXMKKworICAgIGRlZiBnZXRfcmRlcGVuZGVlc19zdHIoc2VsZiwgaXRlbSk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBsaXN0IG9mIHRhcmdldHMgd2hpY2ggZGVwZW5kIG9uIHJ1bnRpbWUgaXRlbSBhcyBhIHVzZXIgcmVhZGFibGUgc3RyaW5nCisgICAgICAgICIiIgorICAgICAgICBpdGVtaWQgPSBzZWxmLmdldHJ1bl9pZChpdGVtKQorICAgICAgICBkZXBlbmRlZXMgPSBbXQorICAgICAgICBmb3IgZm5pZCBpbiBzZWxmLnJkZXBpZHM6CisgICAgICAgICAgICBpZiBpdGVtaWQgaW4gc2VsZi5yZGVwaWRzW2ZuaWRdOgorICAgICAgICAgICAgICAgIGRlcGVuZGVlcy5hcHBlbmQoc2VsZi5mbl9pbmRleFtmbmlkXSkKKyAgICAgICAgcmV0dXJuIGRlcGVuZGVlcworCisgICAgZGVmIGdldF9yZWFzb25zKHNlbGYsIGl0ZW0sIHJ1bnRpbWU9RmFsc2UpOgorICAgICAgICAiIiIKKyAgICAgICAgR2V0IHRoZSByZWFzb24ocykgZm9yIGFuIGl0ZW0gbm90IGJlaW5nIHByb3ZpZGVkLCBpZiBhbnkKKyAgICAgICAgIiIiCisgICAgICAgIHJlYXNvbnMgPSBbXQorICAgICAgICBpZiBzZWxmLnNraXBsaXN0OgorICAgICAgICAgICAgZm9yIGZuIGluIHNlbGYuc2tpcGxpc3Q6CisgICAgICAgICAgICAgICAgc2tpcGl0ZW0gPSBzZWxmLnNraXBsaXN0W2ZuXQorICAgICAgICAgICAgICAgIGlmIHNraXBpdGVtLnBuID09IGl0ZW06CisgICAgICAgICAgICAgICAgICAgIHJlYXNvbnMuYXBwZW5kKCIlcyB3YXMgc2tpcHBlZDogJXMiICUgKHNraXBpdGVtLnBuLCBza2lwaXRlbS5za2lwcmVhc29uKSkKKyAgICAgICAgICAgICAgICBlbGlmIHJ1bnRpbWUgYW5kIGl0ZW0gaW4gc2tpcGl0ZW0ucnByb3ZpZGVzOgorICAgICAgICAgICAgICAgICAgICByZWFzb25zLmFwcGVuZCgiJXMgUlBST1ZJREVTICVzIGJ1dCB3YXMgc2tpcHBlZDogJXMiICUgKHNraXBpdGVtLnBuLCBpdGVtLCBza2lwaXRlbS5za2lwcmVhc29uKSkKKyAgICAgICAgICAgICAgICBlbGlmIG5vdCBydW50aW1lIGFuZCBpdGVtIGluIHNraXBpdGVtLnByb3ZpZGVzOgorICAgICAgICAgICAgICAgICAgICByZWFzb25zLmFwcGVuZCgiJXMgUFJPVklERVMgJXMgYnV0IHdhcyBza2lwcGVkOiAlcyIgJSAoc2tpcGl0ZW0ucG4sIGl0ZW0sIHNraXBpdGVtLnNraXByZWFzb24pKQorICAgICAgICByZXR1cm4gcmVhc29ucworCisgICAgZGVmIGdldF9jbG9zZV9tYXRjaGVzKHNlbGYsIGl0ZW0sIHByb3ZpZGVyX2xpc3QpOgorICAgICAgICBpbXBvcnQgZGlmZmxpYgorICAgICAgICBpZiBzZWxmLnNraXBsaXN0OgorICAgICAgICAgICAgc2tpcHBlZCA9IFtdCisgICAgICAgICAgICBmb3IgZm4gaW4gc2VsZi5za2lwbGlzdDoKKyAgICAgICAgICAgICAgICBza2lwcGVkLmFwcGVuZChzZWxmLnNraXBsaXN0W2ZuXS5wbikKKyAgICAgICAgICAgIGZ1bGxfbGlzdCA9IHByb3ZpZGVyX2xpc3QgKyBza2lwcGVkCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmdWxsX2xpc3QgPSBwcm92aWRlcl9saXN0CisgICAgICAgIHJldHVybiBkaWZmbGliLmdldF9jbG9zZV9tYXRjaGVzKGl0ZW0sIGZ1bGxfbGlzdCwgY3V0b2ZmPTAuNykKKworICAgIGRlZiBhZGRfcHJvdmlkZXIoc2VsZiwgY2ZnRGF0YSwgZGF0YUNhY2hlLCBpdGVtKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5hZGRfcHJvdmlkZXJfaW50ZXJuYWwoY2ZnRGF0YSwgZGF0YUNhY2hlLCBpdGVtKQorICAgICAgICBleGNlcHQgYmIucHJvdmlkZXJzLk5vUHJvdmlkZXI6CisgICAgICAgICAgICBpZiBzZWxmLmFib3J0OgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICBzZWxmLnJlbW92ZV9idWlsZHRhcmdldChzZWxmLmdldGJ1aWxkX2lkKGl0ZW0pKQorCisgICAgICAgIHNlbGYubWFya19leHRlcm5hbF90YXJnZXQoaXRlbSkKKworICAgIGRlZiBhZGRfcHJvdmlkZXJfaW50ZXJuYWwoc2VsZiwgY2ZnRGF0YSwgZGF0YUNhY2hlLCBpdGVtKToKKyAgICAgICAgIiIiCisgICAgICAgIEFkZCB0aGUgcHJvdmlkZXJzIG9mIGl0ZW0gdG8gdGhlIHRhc2sgZGF0YQorICAgICAgICBNYXJrIGVudHJpZXMgd2VyZSBzcGVjaWZpY2FsbHkgYWRkZWQgZXh0ZXJuYWxseSBhcyBhZ2FpbnN0IGRlcGVuZGVuY2llcworICAgICAgICBhZGRlZCBpbnRlcm5hbGx5IGR1cmluZyBkZXBlbmRlbmN5IHJlc29sdXRpb24KKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgcmVfbWF0Y2hfc3RyaW5ncyhpdGVtLCBkYXRhQ2FjaGUuaWdub3JlZF9kZXBlbmRlbmNpZXMpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgbm90IGl0ZW0gaW4gZGF0YUNhY2hlLnByb3ZpZGVyczoKKyAgICAgICAgICAgIGJiLmV2ZW50LmZpcmUoYmIuZXZlbnQuTm9Qcm92aWRlcihpdGVtLCBkZXBlbmRlZXM9c2VsZi5nZXRfZGVwZW5kZWVzX3N0cihpdGVtKSwgcmVhc29ucz1zZWxmLmdldF9yZWFzb25zKGl0ZW0pLCBjbG9zZV9tYXRjaGVzPXNlbGYuZ2V0X2Nsb3NlX21hdGNoZXMoaXRlbSwgZGF0YUNhY2hlLnByb3ZpZGVycy5rZXlzKCkpKSwgY2ZnRGF0YSkKKyAgICAgICAgICAgIHJhaXNlIGJiLnByb3ZpZGVycy5Ob1Byb3ZpZGVyKGl0ZW0pCisKKyAgICAgICAgaWYgc2VsZi5oYXZlX2J1aWxkX3RhcmdldChpdGVtKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGFsbF9wID0gZGF0YUNhY2hlLnByb3ZpZGVyc1tpdGVtXQorCisgICAgICAgIGVsaWdpYmxlLCBmb3VuZFVuaXF1ZSA9IGJiLnByb3ZpZGVycy5maWx0ZXJQcm92aWRlcnMoYWxsX3AsIGl0ZW0sIGNmZ0RhdGEsIGRhdGFDYWNoZSkKKyAgICAgICAgZWxpZ2libGUgPSBbcCBmb3IgcCBpbiBlbGlnaWJsZSBpZiBub3Qgc2VsZi5nZXRmbl9pZChwKSBpbiBzZWxmLmZhaWxlZF9mbmlkc10KKworICAgICAgICBpZiBub3QgZWxpZ2libGU6CisgICAgICAgICAgICBiYi5ldmVudC5maXJlKGJiLmV2ZW50Lk5vUHJvdmlkZXIoaXRlbSwgZGVwZW5kZWVzPXNlbGYuZ2V0X2RlcGVuZGVlc19zdHIoaXRlbSksIHJlYXNvbnM9WyJObyBlbGlnaWJsZSBQUk9WSURFUnMgZXhpc3QgZm9yICclcyciICUgaXRlbV0pLCBjZmdEYXRhKQorICAgICAgICAgICAgcmFpc2UgYmIucHJvdmlkZXJzLk5vUHJvdmlkZXIoaXRlbSkKKworICAgICAgICBpZiBsZW4oZWxpZ2libGUpID4gMSBhbmQgZm91bmRVbmlxdWUgPT0gRmFsc2U6CisgICAgICAgICAgICBpZiBpdGVtIG5vdCBpbiBzZWxmLmNvbnNpZGVyX21zZ3NfY2FjaGU6CisgICAgICAgICAgICAgICAgcHJvdmlkZXJzX2xpc3QgPSBbXQorICAgICAgICAgICAgICAgIGZvciBmbiBpbiBlbGlnaWJsZToKKyAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJzX2xpc3QuYXBwZW5kKGRhdGFDYWNoZS5wa2dfZm5bZm5dKQorICAgICAgICAgICAgICAgIGJiLmV2ZW50LmZpcmUoYmIuZXZlbnQuTXVsdGlwbGVQcm92aWRlcnMoaXRlbSwgcHJvdmlkZXJzX2xpc3QpLCBjZmdEYXRhKQorICAgICAgICAgICAgc2VsZi5jb25zaWRlcl9tc2dzX2NhY2hlLmFwcGVuZChpdGVtKQorCisgICAgICAgIGZvciBmbiBpbiBlbGlnaWJsZToKKyAgICAgICAgICAgIGZuaWQgPSBzZWxmLmdldGZuX2lkKGZuKQorICAgICAgICAgICAgaWYgZm5pZCBpbiBzZWxmLmZhaWxlZF9mbmlkczoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICJhZGRpbmcgJXMgdG8gc2F0aXNmeSAlcyIsIGZuLCBpdGVtKQorICAgICAgICAgICAgc2VsZi5hZGRfYnVpbGRfdGFyZ2V0KGZuLCBpdGVtKQorICAgICAgICAgICAgc2VsZi5hZGRfdGFza3MoZm4sIGRhdGFDYWNoZSkKKworCisgICAgICAgICAgICAjaXRlbSA9IGRhdGFDYWNoZS5wa2dfZm5bZm5dCisKKyAgICBkZWYgYWRkX3Jwcm92aWRlcihzZWxmLCBjZmdEYXRhLCBkYXRhQ2FjaGUsIGl0ZW0pOgorICAgICAgICAiIiIKKyAgICAgICAgQWRkIHRoZSBydW50aW1lIHByb3ZpZGVycyBvZiBpdGVtIHRvIHRoZSB0YXNrIGRhdGEKKyAgICAgICAgKHRha2VzIGl0ZW0gbmFtZXMgZnJvbSBSREVQRU5EUy9QQUNLQUdFUyBuYW1lc3BhY2UpCisgICAgICAgICIiIgorCisgICAgICAgIGlmIHJlX21hdGNoX3N0cmluZ3MoaXRlbSwgZGF0YUNhY2hlLmlnbm9yZWRfZGVwZW5kZW5jaWVzKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIHNlbGYuaGF2ZV9ydW50aW1lX3RhcmdldChpdGVtKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGFsbF9wID0gYmIucHJvdmlkZXJzLmdldFJ1bnRpbWVQcm92aWRlcnMoZGF0YUNhY2hlLCBpdGVtKQorCisgICAgICAgIGlmIG5vdCBhbGxfcDoKKyAgICAgICAgICAgIGJiLmV2ZW50LmZpcmUoYmIuZXZlbnQuTm9Qcm92aWRlcihpdGVtLCBydW50aW1lPVRydWUsIGRlcGVuZGVlcz1zZWxmLmdldF9yZGVwZW5kZWVzX3N0cihpdGVtKSwgcmVhc29ucz1zZWxmLmdldF9yZWFzb25zKGl0ZW0sIFRydWUpKSwgY2ZnRGF0YSkKKyAgICAgICAgICAgIHJhaXNlIGJiLnByb3ZpZGVycy5Ob1JQcm92aWRlcihpdGVtKQorCisgICAgICAgIGVsaWdpYmxlLCBudW1iZXJQcmVmZXJyZWQgPSBiYi5wcm92aWRlcnMuZmlsdGVyUHJvdmlkZXJzUnVuVGltZShhbGxfcCwgaXRlbSwgY2ZnRGF0YSwgZGF0YUNhY2hlKQorICAgICAgICBlbGlnaWJsZSA9IFtwIGZvciBwIGluIGVsaWdpYmxlIGlmIG5vdCBzZWxmLmdldGZuX2lkKHApIGluIHNlbGYuZmFpbGVkX2ZuaWRzXQorCisgICAgICAgIGlmIG5vdCBlbGlnaWJsZToKKyAgICAgICAgICAgIGJiLmV2ZW50LmZpcmUoYmIuZXZlbnQuTm9Qcm92aWRlcihpdGVtLCBydW50aW1lPVRydWUsIGRlcGVuZGVlcz1zZWxmLmdldF9yZGVwZW5kZWVzX3N0cihpdGVtKSwgcmVhc29ucz1bIk5vIGVsaWdpYmxlIFJQUk9WSURFUnMgZXhpc3QgZm9yICclcyciICUgaXRlbV0pLCBjZmdEYXRhKQorICAgICAgICAgICAgcmFpc2UgYmIucHJvdmlkZXJzLk5vUlByb3ZpZGVyKGl0ZW0pCisKKyAgICAgICAgaWYgbGVuKGVsaWdpYmxlKSA+IDEgYW5kIG51bWJlclByZWZlcnJlZCA9PSAwOgorICAgICAgICAgICAgaWYgaXRlbSBub3QgaW4gc2VsZi5jb25zaWRlcl9tc2dzX2NhY2hlOgorICAgICAgICAgICAgICAgIHByb3ZpZGVyc19saXN0ID0gW10KKyAgICAgICAgICAgICAgICBmb3IgZm4gaW4gZWxpZ2libGU6CisgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyc19saXN0LmFwcGVuZChkYXRhQ2FjaGUucGtnX2ZuW2ZuXSkKKyAgICAgICAgICAgICAgICBiYi5ldmVudC5maXJlKGJiLmV2ZW50Lk11bHRpcGxlUHJvdmlkZXJzKGl0ZW0sIHByb3ZpZGVyc19saXN0LCBydW50aW1lPVRydWUpLCBjZmdEYXRhKQorICAgICAgICAgICAgc2VsZi5jb25zaWRlcl9tc2dzX2NhY2hlLmFwcGVuZChpdGVtKQorCisgICAgICAgIGlmIG51bWJlclByZWZlcnJlZCA+IDE6CisgICAgICAgICAgICBpZiBpdGVtIG5vdCBpbiBzZWxmLmNvbnNpZGVyX21zZ3NfY2FjaGU6CisgICAgICAgICAgICAgICAgcHJvdmlkZXJzX2xpc3QgPSBbXQorICAgICAgICAgICAgICAgIGZvciBmbiBpbiBlbGlnaWJsZToKKyAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJzX2xpc3QuYXBwZW5kKGRhdGFDYWNoZS5wa2dfZm5bZm5dKQorICAgICAgICAgICAgICAgIGJiLmV2ZW50LmZpcmUoYmIuZXZlbnQuTXVsdGlwbGVQcm92aWRlcnMoaXRlbSwgcHJvdmlkZXJzX2xpc3QsIHJ1bnRpbWU9VHJ1ZSksIGNmZ0RhdGEpCisgICAgICAgICAgICBzZWxmLmNvbnNpZGVyX21zZ3NfY2FjaGUuYXBwZW5kKGl0ZW0pCisgICAgICAgICAgICByYWlzZSBiYi5wcm92aWRlcnMuTXVsdGlwbGVSUHJvdmlkZXIoaXRlbSkKKworICAgICAgICAjIHJ1biB0aHJvdWdoIHRoZSBsaXN0IHVudGlsIHdlIGZpbmQgb25lIHRoYXQgd2UgY2FuIGJ1aWxkCisgICAgICAgIGZvciBmbiBpbiBlbGlnaWJsZToKKyAgICAgICAgICAgIGZuaWQgPSBzZWxmLmdldGZuX2lkKGZuKQorICAgICAgICAgICAgaWYgZm5pZCBpbiBzZWxmLmZhaWxlZF9mbmlkczoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICJhZGRpbmcgJyVzJyB0byBzYXRpc2Z5IHJ1bnRpbWUgJyVzJyIsIGZuLCBpdGVtKQorICAgICAgICAgICAgc2VsZi5hZGRfcnVudGltZV90YXJnZXQoZm4sIGl0ZW0pCisgICAgICAgICAgICBzZWxmLmFkZF90YXNrcyhmbiwgZGF0YUNhY2hlKQorCisgICAgZGVmIGZhaWxfZm5pZChzZWxmLCBmbmlkLCBtaXNzaW5nX2xpc3Q9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBNYXJrIGEgZmlsZSBhcyBmYWlsZWQgKHVuYnVpbGRhYmxlKQorICAgICAgICBSZW1vdmUgYW55IHJlZmVyZW5jZXMgZnJvbSBidWlsZCBhbmQgcnVudGltZSBwcm92aWRlciBsaXN0cworCisgICAgICAgIG1pc3NpbmdfbGlzdCwgQSBsaXN0IG9mIG1pc3NpbmcgcmVxdWlyZW1lbnRzIGZvciB0aGlzIHRhcmdldAorICAgICAgICAiIiIKKyAgICAgICAgaWYgZm5pZCBpbiBzZWxmLmZhaWxlZF9mbmlkczoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBub3QgbWlzc2luZ19saXN0OgorICAgICAgICAgICAgbWlzc2luZ19saXN0ID0gW10KKyAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJGaWxlICclcycgaXMgdW5idWlsZGFibGUsIHJlbW92aW5nLi4uIiwgc2VsZi5mbl9pbmRleFtmbmlkXSkKKyAgICAgICAgc2VsZi5mYWlsZWRfZm5pZHMuYXBwZW5kKGZuaWQpCisgICAgICAgIGZvciB0YXJnZXQgaW4gc2VsZi5idWlsZF90YXJnZXRzOgorICAgICAgICAgICAgaWYgZm5pZCBpbiBzZWxmLmJ1aWxkX3RhcmdldHNbdGFyZ2V0XToKKyAgICAgICAgICAgICAgICBzZWxmLmJ1aWxkX3RhcmdldHNbdGFyZ2V0XS5yZW1vdmUoZm5pZCkKKyAgICAgICAgICAgICAgICBpZiBsZW4oc2VsZi5idWlsZF90YXJnZXRzW3RhcmdldF0pID09IDA6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucmVtb3ZlX2J1aWxkdGFyZ2V0KHRhcmdldCwgbWlzc2luZ19saXN0KQorICAgICAgICBmb3IgdGFyZ2V0IGluIHNlbGYucnVuX3RhcmdldHM6CisgICAgICAgICAgICBpZiBmbmlkIGluIHNlbGYucnVuX3RhcmdldHNbdGFyZ2V0XToKKyAgICAgICAgICAgICAgICBzZWxmLnJ1bl90YXJnZXRzW3RhcmdldF0ucmVtb3ZlKGZuaWQpCisgICAgICAgICAgICAgICAgaWYgbGVuKHNlbGYucnVuX3RhcmdldHNbdGFyZ2V0XSkgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5yZW1vdmVfcnVudGFyZ2V0KHRhcmdldCwgbWlzc2luZ19saXN0KQorCisgICAgZGVmIHJlbW92ZV9idWlsZHRhcmdldChzZWxmLCB0YXJnZXRpZCwgbWlzc2luZ19saXN0PU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgTWFyayBhIGJ1aWxkIHRhcmdldCBhcyBmYWlsZWQgKHVuYnVpbGRhYmxlKQorICAgICAgICBUcmlnZ2VyIHJlbW92YWwgb2YgYW55IGZpbGVzIHRoYXQgaGF2ZSB0aGlzIGFzIGEgZGVwZW5kZW5jeQorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IG1pc3NpbmdfbGlzdDoKKyAgICAgICAgICAgIG1pc3NpbmdfbGlzdCA9IFtzZWxmLmJ1aWxkX25hbWVzX2luZGV4W3RhcmdldGlkXV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1pc3NpbmdfbGlzdCA9IFtzZWxmLmJ1aWxkX25hbWVzX2luZGV4W3RhcmdldGlkXV0gKyBtaXNzaW5nX2xpc3QKKyAgICAgICAgbG9nZ2VyLnZlcmJvc2UoIlRhcmdldCAnJXMnIGlzIHVuYnVpbGRhYmxlLCByZW1vdmluZy4uLlxuTWlzc2luZyBvciB1bmJ1aWxkYWJsZSBkZXBlbmRlbmN5IGNoYWluIHdhczogJXMiLCBzZWxmLmJ1aWxkX25hbWVzX2luZGV4W3RhcmdldGlkXSwgbWlzc2luZ19saXN0KQorICAgICAgICBzZWxmLmZhaWxlZF9kZXBzLmFwcGVuZCh0YXJnZXRpZCkKKyAgICAgICAgZGVwZW5kZWVzID0gc2VsZi5nZXRfZGVwZW5kZWVzKHRhcmdldGlkKQorICAgICAgICBmb3IgZm5pZCBpbiBkZXBlbmRlZXM6CisgICAgICAgICAgICBzZWxmLmZhaWxfZm5pZChmbmlkLCBtaXNzaW5nX2xpc3QpCisgICAgICAgIGZvciB0YXNraWQgaW4geHJhbmdlKGxlbihzZWxmLnRhc2tzX2lkZXBlbmRzKSk6CisgICAgICAgICAgICBpZGVwZW5kcyA9IHNlbGYudGFza3NfaWRlcGVuZHNbdGFza2lkXQorICAgICAgICAgICAgZm9yIChpZGVwZW5kaWQsIGlkZXBlbmR0YXNrKSBpbiBpZGVwZW5kczoKKyAgICAgICAgICAgICAgICBpZiBpZGVwZW5kaWQgPT0gdGFyZ2V0aWQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbF9mbmlkKHNlbGYudGFza3NfZm5pZFt0YXNraWRdLCBtaXNzaW5nX2xpc3QpCisKKyAgICAgICAgaWYgc2VsZi5hYm9ydCBhbmQgdGFyZ2V0aWQgaW4gc2VsZi5leHRlcm5hbF90YXJnZXRzOgorICAgICAgICAgICAgdGFyZ2V0ID0gc2VsZi5idWlsZF9uYW1lc19pbmRleFt0YXJnZXRpZF0KKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiUmVxdWlyZWQgYnVpbGQgdGFyZ2V0ICclcycgaGFzIG5vIGJ1aWxkYWJsZSBwcm92aWRlcnMuXG5NaXNzaW5nIG9yIHVuYnVpbGRhYmxlIGRlcGVuZGVuY3kgY2hhaW4gd2FzOiAlcyIsIHRhcmdldCwgbWlzc2luZ19saXN0KQorICAgICAgICAgICAgcmFpc2UgYmIucHJvdmlkZXJzLk5vUHJvdmlkZXIodGFyZ2V0KQorCisgICAgZGVmIHJlbW92ZV9ydW50YXJnZXQoc2VsZiwgdGFyZ2V0aWQsIG1pc3NpbmdfbGlzdD1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIE1hcmsgYSBydW4gdGFyZ2V0IGFzIGZhaWxlZCAodW5idWlsZGFibGUpCisgICAgICAgIFRyaWdnZXIgcmVtb3ZhbCBvZiBhbnkgZmlsZXMgdGhhdCBoYXZlIHRoaXMgYXMgYSBkZXBlbmRlbmN5CisgICAgICAgICIiIgorICAgICAgICBpZiBub3QgbWlzc2luZ19saXN0OgorICAgICAgICAgICAgbWlzc2luZ19saXN0ID0gW3NlbGYucnVuX25hbWVzX2luZGV4W3RhcmdldGlkXV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1pc3NpbmdfbGlzdCA9IFtzZWxmLnJ1bl9uYW1lc19pbmRleFt0YXJnZXRpZF1dICsgbWlzc2luZ19saXN0CisKKyAgICAgICAgbG9nZ2VyLmluZm8oIlJ1bnRpbWUgdGFyZ2V0ICclcycgaXMgdW5idWlsZGFibGUsIHJlbW92aW5nLi4uXG5NaXNzaW5nIG9yIHVuYnVpbGRhYmxlIGRlcGVuZGVuY3kgY2hhaW4gd2FzOiAlcyIsIHNlbGYucnVuX25hbWVzX2luZGV4W3RhcmdldGlkXSwgbWlzc2luZ19saXN0KQorICAgICAgICBzZWxmLmZhaWxlZF9yZGVwcy5hcHBlbmQodGFyZ2V0aWQpCisgICAgICAgIGRlcGVuZGVlcyA9IHNlbGYuZ2V0X3JkZXBlbmRlZXModGFyZ2V0aWQpCisgICAgICAgIGZvciBmbmlkIGluIGRlcGVuZGVlczoKKyAgICAgICAgICAgIHNlbGYuZmFpbF9mbmlkKGZuaWQsIG1pc3NpbmdfbGlzdCkKKyAgICAgICAgZm9yIHRhc2tpZCBpbiB4cmFuZ2UobGVuKHNlbGYudGFza3NfaXJkZXBlbmRzKSk6CisgICAgICAgICAgICBpcmRlcGVuZHMgPSBzZWxmLnRhc2tzX2lyZGVwZW5kc1t0YXNraWRdCisgICAgICAgICAgICBmb3IgKGlkZXBlbmRpZCwgaWRlcGVuZHRhc2spIGluIGlyZGVwZW5kczoKKyAgICAgICAgICAgICAgICBpZiBpZGVwZW5kaWQgPT0gdGFyZ2V0aWQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbF9mbmlkKHNlbGYudGFza3NfZm5pZFt0YXNraWRdLCBtaXNzaW5nX2xpc3QpCisKKyAgICBkZWYgYWRkX3VucmVzb2x2ZWQoc2VsZiwgY2ZnRGF0YSwgZGF0YUNhY2hlKToKKyAgICAgICAgIiIiCisgICAgICAgIFJlc29sdmUgYWxsIHVucmVzb2x2ZWQgYnVpbGQgYW5kIHJ1bnRpbWUgdGFyZ2V0cworICAgICAgICAiIiIKKyAgICAgICAgbG9nZ2VyLmluZm8oIlJlc29sdmluZyBhbnkgbWlzc2luZyB0YXNrIHF1ZXVlIGRlcGVuZGVuY2llcyIpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBhZGRlZCA9IDAKKyAgICAgICAgICAgIGZvciB0YXJnZXQgaW4gc2VsZi5nZXRfdW5yZXNvbHZlZF9idWlsZF90YXJnZXRzKGRhdGFDYWNoZSk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9wcm92aWRlcl9pbnRlcm5hbChjZmdEYXRhLCBkYXRhQ2FjaGUsIHRhcmdldCkKKyAgICAgICAgICAgICAgICAgICAgYWRkZWQgPSBhZGRlZCArIDEKKyAgICAgICAgICAgICAgICBleGNlcHQgYmIucHJvdmlkZXJzLk5vUHJvdmlkZXI6CisgICAgICAgICAgICAgICAgICAgIHRhcmdldGlkID0gc2VsZi5nZXRidWlsZF9pZCh0YXJnZXQpCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuYWJvcnQgYW5kIHRhcmdldGlkIGluIHNlbGYuZXh0ZXJuYWxfdGFyZ2V0cyBhbmQgbm90IHNlbGYuYWxsb3dpbmNvbXBsZXRlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuYWxsb3dpbmNvbXBsZXRlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZW1vdmVfYnVpbGR0YXJnZXQodGFyZ2V0aWQpCisgICAgICAgICAgICBmb3IgdGFyZ2V0IGluIHNlbGYuZ2V0X3VucmVzb2x2ZWRfcnVuX3RhcmdldHMoZGF0YUNhY2hlKToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX3Jwcm92aWRlcihjZmdEYXRhLCBkYXRhQ2FjaGUsIHRhcmdldCkKKyAgICAgICAgICAgICAgICAgICAgYWRkZWQgPSBhZGRlZCArIDEKKyAgICAgICAgICAgICAgICBleGNlcHQgKGJiLnByb3ZpZGVycy5Ob1JQcm92aWRlciwgYmIucHJvdmlkZXJzLk11bHRpcGxlUlByb3ZpZGVyKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5yZW1vdmVfcnVudGFyZ2V0KHNlbGYuZ2V0cnVuX2lkKHRhcmdldCkpCisgICAgICAgICAgICBsb2dnZXIuZGVidWcoMSwgIlJlc29sdmVkICIgKyBzdHIoYWRkZWQpICsgIiBleHRyYSBkZXBlbmRlbmNpZXMiKQorICAgICAgICAgICAgaWYgYWRkZWQgPT0gMDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAjIHNlbGYuZHVtcF9kYXRhKCkKKworICAgIGRlZiBkdW1wX2RhdGEoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBEdW1wIHNvbWUgZGVidWcgaW5mb3JtYXRpb24gb24gdGhlIGludGVybmFsIGRhdGEgc3RydWN0dXJlcworICAgICAgICAiIiIKKyAgICAgICAgbG9nZ2VyLmRlYnVnKDMsICJidWlsZF9uYW1lczoiKQorICAgICAgICBsb2dnZXIuZGVidWcoMywgIiwgIi5qb2luKHNlbGYuYnVpbGRfbmFtZXNfaW5kZXgpKQorCisgICAgICAgIGxvZ2dlci5kZWJ1ZygzLCAicnVuX25hbWVzOiIpCisgICAgICAgIGxvZ2dlci5kZWJ1ZygzLCAiLCAiLmpvaW4oc2VsZi5ydW5fbmFtZXNfaW5kZXgpKQorCisgICAgICAgIGxvZ2dlci5kZWJ1ZygzLCAiYnVpbGRfdGFyZ2V0czoiKQorICAgICAgICBmb3IgYnVpbGRpZCBpbiB4cmFuZ2UobGVuKHNlbGYuYnVpbGRfbmFtZXNfaW5kZXgpKToKKyAgICAgICAgICAgIHRhcmdldCA9IHNlbGYuYnVpbGRfbmFtZXNfaW5kZXhbYnVpbGRpZF0KKyAgICAgICAgICAgIHRhcmdldHMgPSAiTm9uZSIKKyAgICAgICAgICAgIGlmIGJ1aWxkaWQgaW4gc2VsZi5idWlsZF90YXJnZXRzOgorICAgICAgICAgICAgICAgIHRhcmdldHMgPSBzZWxmLmJ1aWxkX3RhcmdldHNbYnVpbGRpZF0KKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygzLCAiICglcyklczogJXMiLCBidWlsZGlkLCB0YXJnZXQsIHRhcmdldHMpCisKKyAgICAgICAgbG9nZ2VyLmRlYnVnKDMsICJydW5fdGFyZ2V0czoiKQorICAgICAgICBmb3IgcnVuaWQgaW4geHJhbmdlKGxlbihzZWxmLnJ1bl9uYW1lc19pbmRleCkpOgorICAgICAgICAgICAgdGFyZ2V0ID0gc2VsZi5ydW5fbmFtZXNfaW5kZXhbcnVuaWRdCisgICAgICAgICAgICB0YXJnZXRzID0gIk5vbmUiCisgICAgICAgICAgICBpZiBydW5pZCBpbiBzZWxmLnJ1bl90YXJnZXRzOgorICAgICAgICAgICAgICAgIHRhcmdldHMgPSBzZWxmLnJ1bl90YXJnZXRzW3J1bmlkXQorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDMsICIgKCVzKSVzOiAlcyIsIHJ1bmlkLCB0YXJnZXQsIHRhcmdldHMpCisKKyAgICAgICAgbG9nZ2VyLmRlYnVnKDMsICJ0YXNrczoiKQorICAgICAgICBmb3IgdGFzayBpbiB4cmFuZ2UobGVuKHNlbGYudGFza3NfbmFtZSkpOgorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDMsICIgKCVzKSVzIC0gJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdGFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mbl9pbmRleFtzZWxmLnRhc2tzX2ZuaWRbdGFza11dLAorICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRhc2tzX25hbWVbdGFza10sCisgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGFza3NfdGRlcGVuZHNbdGFza10pCisKKyAgICAgICAgbG9nZ2VyLmRlYnVnKDMsICJkZXBlbmRlbmN5IGlkcyAocGVyIGZuKToiKQorICAgICAgICBmb3IgZm5pZCBpbiBzZWxmLmRlcGlkczoKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygzLCAiICVzICVzOiAlcyIsIGZuaWQsIHNlbGYuZm5faW5kZXhbZm5pZF0sIHNlbGYuZGVwaWRzW2ZuaWRdKQorCisgICAgICAgIGxvZ2dlci5kZWJ1ZygzLCAicnVudGltZSBkZXBlbmRlbmN5IGlkcyAocGVyIGZuKToiKQorICAgICAgICBmb3IgZm5pZCBpbiBzZWxmLnJkZXBpZHM6CisgICAgICAgICAgICBsb2dnZXIuZGVidWcoMywgIiAlcyAlczogJXMiLCBmbmlkLCBzZWxmLmZuX2luZGV4W2ZuaWRdLCBzZWxmLnJkZXBpZHNbZm5pZF0pCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi90ZXN0cy9fX2luaXRfXy5weSBiL2JpdGJha2UvbGliL2JiL3Rlc3RzL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi90ZXN0cy9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdGVzdHMvY29kZXBhcnNlci5weSBiL2JpdGJha2UvbGliL2JiL3Rlc3RzL2NvZGVwYXJzZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ1NGJjNQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3Rlc3RzL2NvZGVwYXJzZXIucHkKQEAgLTAsMCArMSwzNzUgQEAKKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisjCisjIEJpdEJha2UgVGVzdCBmb3IgY29kZXBhcnNlci5weQorIworIyBDb3B5cmlnaHQgKEMpIDIwMTAgQ2hyaXMgTGFyc29uCisjIENvcHlyaWdodCAoQykgMjAxMiBSaWNoYXJkIFB1cmRpZQorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgbG9nZ2luZworaW1wb3J0IGJiCisKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCdCaXRCYWtlLlRlc3RDb2RlUGFyc2VyJykKKworIyBiYi5kYXRhIHJlZmVyZW5jZXMgYmIucGFyc2UgYnV0IGNhbid0IGRpcmVjdGx5IGltcG9ydCBkdWUgdG8gY2lyY3VsYXIgZGVwZW5kZW5jaWVzLgorIyBIYWNrIGFyb3VuZCBpdCBmb3Igbm93IDooIAoraW1wb3J0IGJiLnBhcnNlCitpbXBvcnQgYmIuZGF0YQorCitjbGFzcyBSZWZlcmVuY2VUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZCA9IGJiLmRhdGEuaW5pdCgpCisKKyAgICBkZWYgc2V0RW1wdHlWYXJzKHNlbGYsIHZhcmxpc3QpOgorICAgICAgICBmb3IgayBpbiB2YXJsaXN0OgorICAgICAgICAgICAgc2VsZi5kLnNldFZhcihrLCAiIikKKworICAgIGRlZiBzZXRWYWx1ZXMoc2VsZiwgdmFsdWVzKToKKyAgICAgICAgZm9yIGssIHYgaW4gdmFsdWVzLml0ZW1zKCk6CisgICAgICAgICAgICBzZWxmLmQuc2V0VmFyKGssIHYpCisKKyAgICBkZWYgYXNzZXJ0UmVmZXJlbmNlcyhzZWxmLCByZWZzKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJlZmVyZW5jZXMsIHJlZnMpCisKKyAgICBkZWYgYXNzZXJ0RXhlY3Moc2VsZiwgZXhlY3MpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZXhlY3MsIGV4ZWNzKQorCitjbGFzcyBWYXJpYWJsZVJlZmVyZW5jZVRlc3QoUmVmZXJlbmNlVGVzdCk6CisKKyAgICBkZWYgcGFyc2VFeHByZXNzaW9uKHNlbGYsIGV4cCk6CisgICAgICAgIHBhcnNlZHZhciA9IHNlbGYuZC5leHBhbmRXaXRoUmVmcyhleHAsIE5vbmUpCisgICAgICAgIHNlbGYucmVmZXJlbmNlcyA9IHBhcnNlZHZhci5yZWZlcmVuY2VzCisKKyAgICBkZWYgdGVzdF9zaW1wbGVfcmVmZXJlbmNlKHNlbGYpOgorICAgICAgICBzZWxmLnNldEVtcHR5VmFycyhbIkZPTyJdKQorICAgICAgICBzZWxmLnBhcnNlRXhwcmVzc2lvbigiJHtGT099IikKKyAgICAgICAgc2VsZi5hc3NlcnRSZWZlcmVuY2VzKHNldChbIkZPTyJdKSkKKworICAgIGRlZiB0ZXN0X25lc3RlZF9yZWZlcmVuY2Uoc2VsZik6CisgICAgICAgIHNlbGYuc2V0RW1wdHlWYXJzKFsiQkFSIl0pCisgICAgICAgIHNlbGYuZC5zZXRWYXIoIkZPTyIsICJCQVIiKQorICAgICAgICBzZWxmLnBhcnNlRXhwcmVzc2lvbigiJHske0ZPT319IikKKyAgICAgICAgc2VsZi5hc3NlcnRSZWZlcmVuY2VzKHNldChbIkZPTyIsICJCQVIiXSkpCisKKyAgICBkZWYgdGVzdF9weXRob25fcmVmZXJlbmNlKHNlbGYpOgorICAgICAgICBzZWxmLnNldEVtcHR5VmFycyhbIkJBUiJdKQorICAgICAgICBzZWxmLnBhcnNlRXhwcmVzc2lvbigiJHtAYmIuZGF0YS5nZXRWYXIoJ0JBUicsIGQsIFRydWUpICsgJ2Zvbyd9IikKKyAgICAgICAgc2VsZi5hc3NlcnRSZWZlcmVuY2VzKHNldChbIkJBUiJdKSkKKworY2xhc3MgU2hlbGxSZWZlcmVuY2VUZXN0KFJlZmVyZW5jZVRlc3QpOgorCisgICAgZGVmIHBhcnNlRXhwcmVzc2lvbihzZWxmLCBleHApOgorICAgICAgICBwYXJzZWR2YXIgPSBzZWxmLmQuZXhwYW5kV2l0aFJlZnMoZXhwLCBOb25lKQorICAgICAgICBwYXJzZXIgPSBiYi5jb2RlcGFyc2VyLlNoZWxsUGFyc2VyKCJQYXJzZXJUZXN0IiwgbG9nZ2VyKQorICAgICAgICBwYXJzZXIucGFyc2Vfc2hlbGwocGFyc2VkdmFyLnZhbHVlKQorCisgICAgICAgIHNlbGYucmVmZXJlbmNlcyA9IHBhcnNlZHZhci5yZWZlcmVuY2VzCisgICAgICAgIHNlbGYuZXhlY3MgPSBwYXJzZXIuZXhlY3MKKworICAgIGRlZiB0ZXN0X3F1b3Rlc19pbnNpZGVfYXNzaWduKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlRXhwcmVzc2lvbignZm9vPWZvbyJiYXIiYmF6JykKKyAgICAgICAgc2VsZi5hc3NlcnRSZWZlcmVuY2VzKHNldChbXSkpCisKKyAgICBkZWYgdGVzdF9xdW90ZXNfaW5zaWRlX2FyZyhzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZUV4cHJlc3Npb24oJ3NlZCBzIyJiYXIgYmF6IiMiYWxwaGEgYmV0YSIjZycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXhlY3Moc2V0KFsic2VkIl0pKQorCisgICAgZGVmIHRlc3RfYXJnX2NvbnRpbnVhdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZUV4cHJlc3Npb24oInNlZCAtaSAtZSBzLGZvbyxiYXIsZyBcXFxuICoucGMiKQorICAgICAgICBzZWxmLmFzc2VydEV4ZWNzKHNldChbInNlZCJdKSkKKworICAgIGRlZiB0ZXN0X2RvbGxhcl9pbl9xdW90ZWQoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VFeHByZXNzaW9uKCdzZWQgLWkgLWUgImZvbyQiICoucGMnKQorICAgICAgICBzZWxmLmFzc2VydEV4ZWNzKHNldChbInNlZCJdKSkKKworICAgIGRlZiB0ZXN0X3F1b3Rlc19pbnNpZGVfYXJnX2NvbnRpbnVhdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5zZXRFbXB0eVZhcnMoWyJiaW5kaXIiLCAiRCIsICJsaWJkaXIiXSkKKyAgICAgICAgc2VsZi5wYXJzZUV4cHJlc3Npb24oIiIiCitzZWQgLWkgLWUgcyMibW9jX2xvY2F0aW9uPS4qJCIjIm1vY19sb2NhdGlvbj0ke2JpbmRpcn0vbW9jNCIjIFxcCistZSBzIyJ1aWNfbG9jYXRpb249LiokIiMidWljX2xvY2F0aW9uPSR7YmluZGlyfS91aWM0IiMgXFwKKyR7RH0ke2xpYmRpcn0vcGtnY29uZmlnLyoucGMKKyIiIikKKyAgICAgICAgc2VsZi5hc3NlcnRSZWZlcmVuY2VzKHNldChbImJpbmRpciIsICJEIiwgImxpYmRpciJdKSkKKworICAgIGRlZiB0ZXN0X2Fzc2lnbl9zdWJzaGVsbF9leHBhbnNpb24oc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VFeHByZXNzaW9uKCJmb289JChlY2hvIGJhcikiKQorICAgICAgICBzZWxmLmFzc2VydEV4ZWNzKHNldChbImVjaG8iXSkpCisKKyAgICBkZWYgdGVzdF9zaGVsbF91bmV4cGFuZGVkKHNlbGYpOgorICAgICAgICBzZWxmLnNldEVtcHR5VmFycyhbIlFUX0JBU0VfTkFNRSJdKQorICAgICAgICBzZWxmLnBhcnNlRXhwcmVzc2lvbignZWNobyAiJHtRVF9CQVNFX05BTUV9IicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXhlY3Moc2V0KFsiZWNobyJdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSZWZlcmVuY2VzKHNldChbIlFUX0JBU0VfTkFNRSJdKSkKKworICAgIGRlZiB0ZXN0X2luY29tcGxldGVfdmFyZXhwX3NpbmdsZV9xdW90ZXMoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VFeHByZXNzaW9uKCJzZWQgLWkgLWUgJ3M6SVB7OkkkezpnJyAkcGMiKQorICAgICAgICBzZWxmLmFzc2VydEV4ZWNzKHNldChbInNlZCJdKSkKKworCisgICAgZGVmIHRlc3RfdW50aWwoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VFeHByZXNzaW9uKCJ1bnRpbCBmYWxzZTsgZG8gZWNobyB0cnVlOyBkb25lIikKKyAgICAgICAgc2VsZi5hc3NlcnRFeGVjcyhzZXQoWyJmYWxzZSIsICJlY2hvIl0pKQorICAgICAgICBzZWxmLmFzc2VydFJlZmVyZW5jZXMoc2V0KCkpCisKKyAgICBkZWYgdGVzdF9jYXNlKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlRXhwcmVzc2lvbigiIiIKK2Nhc2UgJGZvbyBpbgorKikKK2JhcgorOzsKK2VzYWMKKyIiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFeGVjcyhzZXQoWyJiYXIiXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmVmZXJlbmNlcyhzZXQoKSkKKworICAgIGRlZiB0ZXN0X2Fzc2lnbl9leGVjKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlRXhwcmVzc2lvbigiYT1iIGM9J2ZvbyBiYXInIGFscGhhIDEgMiAzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFeGVjcyhzZXQoWyJhbHBoYSJdKSkKKworICAgIGRlZiB0ZXN0X3JlZGlyZWN0X3RvX2ZpbGUoc2VsZik6CisgICAgICAgIHNlbGYuc2V0RW1wdHlWYXJzKFsiZm9vIl0pCisgICAgICAgIHNlbGYucGFyc2VFeHByZXNzaW9uKCJlY2hvIGZvbyA+JHtmb299L2JhciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXhlY3Moc2V0KFsiZWNobyJdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSZWZlcmVuY2VzKHNldChbImZvbyJdKSkKKworICAgIGRlZiB0ZXN0X2hlcmVkb2Moc2VsZik6CisgICAgICAgIHNlbGYuc2V0RW1wdHlWYXJzKFsidGhldGEiXSkKKyAgICAgICAgc2VsZi5wYXJzZUV4cHJlc3Npb24oIiIiCitjYXQgPDxFTkQKK2FscGhhCitiZXRhCiske3RoZXRhfQorRU5ECisiIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmVmZXJlbmNlcyhzZXQoWyJ0aGV0YSJdKSkKKworICAgIGRlZiB0ZXN0X3JlZGlyZWN0X2Zyb21faGVyZWRvYyhzZWxmKToKKyAgICAgICAgdiA9IFsiQiIsICJTSEFET1dfTUFJTERJUiIsICJTSEFET1dfTUFJTEZJTEUiLCAiU0hBRE9XX1VUTVBESVIiLCAiU0hBRE9XX0xPR0RJUiIsICJiaW5kaXIiXQorICAgICAgICBzZWxmLnNldEVtcHR5VmFycyh2KQorICAgICAgICBzZWxmLnBhcnNlRXhwcmVzc2lvbigiIiIKK2NhdCA8PEVORCA+JHtCfS9jYWNoZWRwYXRocworc2hhZG93X2N2X21haWxkaXI9JHtTSEFET1dfTUFJTERJUn0KK3NoYWRvd19jdl9tYWlsZmlsZT0ke1NIQURPV19NQUlMRklMRX0KK3NoYWRvd19jdl91dG1wZGlyPSR7U0hBRE9XX1VUTVBESVJ9CitzaGFkb3dfY3ZfbG9nZGlyPSR7U0hBRE9XX0xPR0RJUn0KK3NoYWRvd19jdl9wYXNzd2RfZGlyPSR7YmluZGlyfQorRU5ECisiIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmVmZXJlbmNlcyhzZXQodikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXhlY3Moc2V0KFsiY2F0Il0pKQorCisjICAgIGRlZiB0ZXN0X2luY29tcGxldGVfY29tbWFuZF9leHBhbnNpb24oc2VsZik6CisjICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZWZ0cmFja2VyLlNoZWxsU3ludGF4RXJyb3IsIHJlZnRyYWNrZXIuZXhlY3MsCisjICAgICAgICAgICAgICAgICAgICAgICAgICBiYnZhbHVlLnNocGFyc2UoImNwIGZvb2AiLCBzZWxmLmQpLCBzZWxmLmQpCisKKyMgICAgZGVmIHRlc3Rfcm9ndWVfZG9sbGFyc2lnbihzZWxmKToKKyMgICAgICAgIHNlbGYuc2V0VmFsdWVzKHsiRCIgOiAiL3RtcCJ9KQorIyAgICAgICAgc2VsZi5wYXJzZUV4cHJlc3Npb24oImluc3RhbGwgLWQgJHtEfSQiKQorIyAgICAgICAgc2VsZi5hc3NlcnRSZWZlcmVuY2VzKHNldChbIkQiXSkpCisjICAgICAgICBzZWxmLmFzc2VydEV4ZWNzKHNldChbImluc3RhbGwiXSkpCisKKworY2xhc3MgUHl0aG9uUmVmZXJlbmNlVGVzdChSZWZlcmVuY2VUZXN0KToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5kID0gYmIuZGF0YS5pbml0KCkKKyAgICAgICAgaWYgaGFzYXR0cihiYi51dGlscywgIl9jb250ZXh0Iik6CisgICAgICAgICAgICBzZWxmLmNvbnRleHQgPSBiYi51dGlscy5fY29udGV4dAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaW1wb3J0IF9fYnVpbHRpbl9fCisgICAgICAgICAgICBzZWxmLmNvbnRleHQgPSBfX2J1aWx0aW5fXy5fX2RpY3RfXworCisgICAgZGVmIHBhcnNlRXhwcmVzc2lvbihzZWxmLCBleHApOgorICAgICAgICBwYXJzZWR2YXIgPSBzZWxmLmQuZXhwYW5kV2l0aFJlZnMoZXhwLCBOb25lKQorICAgICAgICBwYXJzZXIgPSBiYi5jb2RlcGFyc2VyLlB5dGhvblBhcnNlcigiUGFyc2VyVGVzdCIsIGxvZ2dlcikKKyAgICAgICAgcGFyc2VyLnBhcnNlX3B5dGhvbihwYXJzZWR2YXIudmFsdWUpCisKKyAgICAgICAgc2VsZi5yZWZlcmVuY2VzID0gcGFyc2VkdmFyLnJlZmVyZW5jZXMgfCBwYXJzZXIucmVmZXJlbmNlcworICAgICAgICBzZWxmLmV4ZWNzID0gcGFyc2VyLmV4ZWNzCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGluZGVudCh2YWx1ZSk6CisgICAgICAgICIiIlB5dGhvbiBTbmlwcGV0cyBoYXZlIHRvIGJlIGluZGVudGVkLCBweXRob24gdmFsdWVzIGRvbid0IGhhdmUgdG8KK2JlLiBUaGVzZSB1bml0IHRlc3RzIGFyZSB0ZXN0aW5nIHNuaXBwZXRzLiIiIgorICAgICAgICByZXR1cm4gIiAiICsgdmFsdWUKKworICAgIGRlZiB0ZXN0X2dldHZhcl9yZWZlcmVuY2Uoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VFeHByZXNzaW9uKCJiYi5kYXRhLmdldFZhcignZm9vJywgZCwgVHJ1ZSkiKQorICAgICAgICBzZWxmLmFzc2VydFJlZmVyZW5jZXMoc2V0KFsiZm9vIl0pKQorICAgICAgICBzZWxmLmFzc2VydEV4ZWNzKHNldCgpKQorCisgICAgZGVmIHRlc3RfZ2V0dmFyX2NvbXB1dGVkX3JlZmVyZW5jZShzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZUV4cHJlc3Npb24oImJiLmRhdGEuZ2V0VmFyKCdmJyArICdvJyArICdvJywgZCwgVHJ1ZSkiKQorICAgICAgICBzZWxmLmFzc2VydFJlZmVyZW5jZXMoc2V0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXhlY3Moc2V0KCkpCisKKyAgICBkZWYgdGVzdF9nZXR2YXJfZXhlY19yZWZlcmVuY2Uoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VFeHByZXNzaW9uKCJldmFsKCdiYi5kYXRhLmdldFZhcihcImZvb1wiLCBkLCBUcnVlKScpIikKKyAgICAgICAgc2VsZi5hc3NlcnRSZWZlcmVuY2VzKHNldCgpKQorICAgICAgICBzZWxmLmFzc2VydEV4ZWNzKHNldChbImV2YWwiXSkpCisKKyAgICBkZWYgdGVzdF92YXJfcmVmZXJlbmNlKHNlbGYpOgorICAgICAgICBzZWxmLmNvbnRleHRbImZvbyJdID0gbGFtYmRhIHg6IHgKKyAgICAgICAgc2VsZi5zZXRFbXB0eVZhcnMoWyJGT08iXSkKKyAgICAgICAgc2VsZi5wYXJzZUV4cHJlc3Npb24oImZvbygnJHtGT099JykiKQorICAgICAgICBzZWxmLmFzc2VydFJlZmVyZW5jZXMoc2V0KFsiRk9PIl0pKQorICAgICAgICBzZWxmLmFzc2VydEV4ZWNzKHNldChbImZvbyJdKSkKKyAgICAgICAgZGVsIHNlbGYuY29udGV4dFsiZm9vIl0KKworICAgIGRlZiB0ZXN0X3Zhcl9leGVjKHNlbGYpOgorICAgICAgICBmb3IgZXR5cGUgaW4gKCJmdW5jIiwgInRhc2siKToKKyAgICAgICAgICAgIHNlbGYuZC5zZXRWYXIoImRvX3NvbWV0aGluZyIsICJlY2hvICdoaSBtb20hICR7Rk9PfSciKQorICAgICAgICAgICAgc2VsZi5kLnNldFZhckZsYWcoImRvX3NvbWV0aGluZyIsIGV0eXBlLCBUcnVlKQorICAgICAgICAgICAgc2VsZi5wYXJzZUV4cHJlc3Npb24oImJiLmJ1aWxkLmV4ZWNfZnVuYygnZG9fc29tZXRoaW5nJywgZCkiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSZWZlcmVuY2VzKHNldChbXSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEV4ZWNzKHNldChbImRvX3NvbWV0aGluZyJdKSkKKworICAgIGRlZiB0ZXN0X2Z1bmN0aW9uX3JlZmVyZW5jZShzZWxmKToKKyAgICAgICAgc2VsZi5jb250ZXh0WyJ0ZXN0ZnVuYyJdID0gbGFtYmRhIG1zZzogYmIubXNnLm5vdGUoMSwgTm9uZSwgbXNnKQorICAgICAgICBzZWxmLmQuc2V0VmFyKCJGT08iLCAiSGVsbG8sIFdvcmxkISIpCisgICAgICAgIHNlbGYucGFyc2VFeHByZXNzaW9uKCJ0ZXN0ZnVuYygnJHtGT099JykiKQorICAgICAgICBzZWxmLmFzc2VydFJlZmVyZW5jZXMoc2V0KFsiRk9PIl0pKQorICAgICAgICBzZWxmLmFzc2VydEV4ZWNzKHNldChbInRlc3RmdW5jIl0pKQorICAgICAgICBkZWwgc2VsZi5jb250ZXh0WyJ0ZXN0ZnVuYyJdCisKKyAgICBkZWYgdGVzdF9xdWFsaWZpZWRfZnVuY3Rpb25fcmVmZXJlbmNlKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlRXhwcmVzc2lvbigidGltZS50aW1lKCkiKQorICAgICAgICBzZWxmLmFzc2VydEV4ZWNzKHNldChbInRpbWUudGltZSJdKSkKKworICAgIGRlZiB0ZXN0X3F1YWxpZmllZF9mdW5jdGlvbl9yZWZlcmVuY2VfMihzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZUV4cHJlc3Npb24oIm9zLnBhdGguZGlybmFtZSgnL2Zvby9iYXInKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXhlY3Moc2V0KFsib3MucGF0aC5kaXJuYW1lIl0pKQorCisgICAgZGVmIHRlc3RfcXVhbGlmaWVkX2Z1bmN0aW9uX3JlZmVyZW5jZV9uZXN0ZWQoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VFeHByZXNzaW9uKCJ0aW1lLnN0cmZ0aW1lKCclWSVtJWQnLHRpbWUuZ210aW1lKCkpIikKKyAgICAgICAgc2VsZi5hc3NlcnRFeGVjcyhzZXQoWyJ0aW1lLnN0cmZ0aW1lIiwgInRpbWUuZ210aW1lIl0pKQorCisgICAgZGVmIHRlc3RfZnVuY3Rpb25fcmVmZXJlbmNlX2NoYWluZWQoc2VsZik6CisgICAgICAgIHNlbGYuY29udGV4dFsidGVzdGdldCJdID0gbGFtYmRhOiAiXHRzdHJpcCBtZSAiCisgICAgICAgIHNlbGYucGFyc2VFeHByZXNzaW9uKCJ0ZXN0Z2V0KCkuc3RyaXAoKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXhlY3Moc2V0KFsidGVzdGdldCJdKSkKKyAgICAgICAgZGVsIHNlbGYuY29udGV4dFsidGVzdGdldCJdCisKKworY2xhc3MgRGVwZW5kZW5jeVJlZmVyZW5jZVRlc3QoUmVmZXJlbmNlVGVzdCk6CisKKyAgICBweWRhdGEgPSAiIiIKK2JiLmRhdGEuZ2V0VmFyKCdzb21ldmFyJywgZCwgVHJ1ZSkKK2RlZiB0ZXN0KGQpOgorICAgIGZvbyA9ICdiYXIgJXMnICUgJ2ZvbycKK2RlZiB0ZXN0MihkKToKKyAgICBkLmdldFZhcihmb28sIFRydWUpCisgICAgZC5nZXRWYXIoJ2JhcicsIEZhbHNlKQorICAgIHRlc3QyKGQpCisKK2RlZiBhKCk6CisgICAgXCJcIlwic29tZQorICAgIHN0dWZmCisgICAgXCJcIlwiCisgICAgcmV0dXJuICJoZWgiCisKK3Rlc3QoZCkKKworYmIuZGF0YS5leHBhbmQoYmIuZGF0YS5nZXRWYXIoInNvbWV0aGluZyIsIEZhbHNlLCBkKSwgZCkKK2JiLmRhdGEuZXhwYW5kKCIke2luZXhwYW5kfSBzb21ldGhpbmdlbHNlIiwgZCkKK2JiLmRhdGEuZ2V0VmFyKGEoKSwgZCwgRmFsc2UpCisiIiIKKworICAgIGRlZiB0ZXN0X3B5dGhvbihzZWxmKToKKyAgICAgICAgc2VsZi5kLnNldFZhcigiRk9PIiwgc2VsZi5weWRhdGEpCisgICAgICAgIHNlbGYuc2V0RW1wdHlWYXJzKFsiaW5leHBhbmQiLCAiYSIsICJ0ZXN0MiIsICJ0ZXN0Il0pCisgICAgICAgIHNlbGYuZC5zZXRWYXJGbGFncygiRk9PIiwgeyJmdW5jIjogVHJ1ZSwgInB5dGhvbiI6IFRydWV9KQorCisgICAgICAgIGRlcHMsIHZhbHVlcyA9IGJiLmRhdGEuYnVpbGRfZGVwZW5kZW5jaWVzKCJGT08iLCBzZXQoc2VsZi5kLmtleXMoKSksIHNldCgpLCBzZXQoKSwgc2VsZi5kKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGRlcHMsIHNldChbInNvbWV2YXIiLCAiYmFyIiwgInNvbWV0aGluZyIsICJpbmV4cGFuZCIsICJ0ZXN0IiwgInRlc3QyIiwgImEiXSkpCisKKworICAgIHNoZWxsZGF0YSA9ICIiIgorZm9vICgpIHsKK2JhcgorfQoreworZWNobyBiYXoKKyQoaGVoKQorZXZhbCBgbW9vYAorfQorYT1iCitjPWQKKygKK3RydWUgJiYgZmFsc2UKK3Rlc3QgLWYgZm9vCit0ZXN0dmFsPXNvbWV0aGluZworJHRlc3R2YWwKKykgfHwgYWllZQorISBpbnZlcnRlZAorZWNobyAke3NvbWV2YXJ9CisKK2Nhc2UgZm9vIGluCitiYXIpCitlY2hvIGJhcgorOzsKK2JheikKK2VjaG8gYmF6Cis7OworZm9vKikKK2VjaG8gZm9vCis7OworZXNhYworIiIiCisKKyAgICBkZWYgdGVzdF9zaGVsbChzZWxmKToKKyAgICAgICAgZXhlY3MgPSBbImJhciIsICJlY2hvIiwgImhlaCIsICJtb28iLCAidHJ1ZSIsICJhaWVlIl0KKyAgICAgICAgc2VsZi5kLnNldFZhcigic29tZXZhciIsICJoZWgiKQorICAgICAgICBzZWxmLmQuc2V0VmFyKCJpbnZlcnRlZCIsICJlY2hvIGludmVydGVkLi4uIikKKyAgICAgICAgc2VsZi5kLnNldFZhckZsYWcoImludmVydGVkIiwgImZ1bmMiLCBUcnVlKQorICAgICAgICBzZWxmLmQuc2V0VmFyKCJGT08iLCBzZWxmLnNoZWxsZGF0YSkKKyAgICAgICAgc2VsZi5kLnNldFZhckZsYWdzKCJGT08iLCB7ImZ1bmMiOiBUcnVlfSkKKyAgICAgICAgc2VsZi5zZXRFbXB0eVZhcnMoZXhlY3MpCisKKyAgICAgICAgZGVwcywgdmFsdWVzID0gYmIuZGF0YS5idWlsZF9kZXBlbmRlbmNpZXMoIkZPTyIsIHNldChzZWxmLmQua2V5cygpKSwgc2V0KCksIHNldCgpLCBzZWxmLmQpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZGVwcywgc2V0KFsic29tZXZhciIsICJpbnZlcnRlZCJdICsgZXhlY3MpKQorCisKKyAgICBkZWYgdGVzdF92YXJkZXBzKHNlbGYpOgorICAgICAgICBzZWxmLmQuc2V0VmFyKCJvZV9saWJpbnN0YWxsIiwgImVjaG8gdGVzdCIpCisgICAgICAgIHNlbGYuZC5zZXRWYXIoIkZPTyIsICJmb289b2VfbGliaW5zdGFsbDsgZXZhbCAkZm9vIikKKyAgICAgICAgc2VsZi5kLnNldFZhckZsYWcoIkZPTyIsICJ2YXJkZXBzIiwgIm9lX2xpYmluc3RhbGwiKQorCisgICAgICAgIGRlcHMsIHZhbHVlcyA9IGJiLmRhdGEuYnVpbGRfZGVwZW5kZW5jaWVzKCJGT08iLCBzZXQoc2VsZi5kLmtleXMoKSksIHNldCgpLCBzZXQoKSwgc2VsZi5kKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGRlcHMsIHNldChbIm9lX2xpYmluc3RhbGwiXSkpCisKKyAgICBkZWYgdGVzdF92YXJkZXBzX2V4cGFuZChzZWxmKToKKyAgICAgICAgc2VsZi5kLnNldFZhcigib2VfbGliaW5zdGFsbCIsICJlY2hvIHRlc3QiKQorICAgICAgICBzZWxmLmQuc2V0VmFyKCJGT08iLCAiZm9vPW9lX2xpYmluc3RhbGw7IGV2YWwgJGZvbyIpCisgICAgICAgIHNlbGYuZC5zZXRWYXJGbGFnKCJGT08iLCAidmFyZGVwcyIsICIke0Anb2VfbGliaW5zdGFsbCd9IikKKworICAgICAgICBkZXBzLCB2YWx1ZXMgPSBiYi5kYXRhLmJ1aWxkX2RlcGVuZGVuY2llcygiRk9PIiwgc2V0KHNlbGYuZC5rZXlzKCkpLCBzZXQoKSwgc2V0KCksIHNlbGYuZCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhkZXBzLCBzZXQoWyJvZV9saWJpbnN0YWxsIl0pKQorCisgICAgI0N1cnJlbnRseSBubyB3aWxkY2FyZCBzdXBwb3J0CisgICAgI2RlZiB0ZXN0X3ZhcmRlcHNfd2lsZGNhcmRzKHNlbGYpOgorICAgICMgICAgc2VsZi5kLnNldFZhcigib2VfbGliaW5zdGFsbCIsICJlY2hvIHRlc3QiKQorICAgICMgICAgc2VsZi5kLnNldFZhcigiRk9PIiwgImZvbz1vZV9saWJpbnN0YWxsOyBldmFsICRmb28iKQorICAgICMgICAgc2VsZi5kLnNldFZhckZsYWcoIkZPTyIsICJ2YXJkZXBzIiwgIm9lXyoiKQorICAgICMgICAgc2VsZi5hc3NlcnRFcXVhbHMoZGVwcywgc2V0KFsib2VfbGliaW5zdGFsbCJdKSkKKworCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi90ZXN0cy9jb3cucHkgYi9iaXRiYWtlL2xpYi9iYi90ZXN0cy9jb3cucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVjNTg0MQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3Rlc3RzL2Nvdy5weQpAQCAtMCwwICsxLDEzNiBAQAorIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyMKKyMgQml0QmFrZSBUZXN0cyBmb3IgQ29weS1vbi1Xcml0ZSAoY293LnB5KQorIworIyBDb3B5cmlnaHQgMjAwNiBIb2xnZXIgRnJleXRoZXIgPGZyZXl0aGVyQGhhbmRoZWxkcy5vcmc+CisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBvcworCitjbGFzcyBDT1dUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiCisgICAgVGVzdCBjYXNlIGZvciB0aGUgQ09XIG1vZHVsZSBmcm9tIG1pdGhybworICAgICIiIgorCisgICAgZGVmIHRlc3RHZXRTZXQoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBUZXN0IGFuZCBzZXQKKyAgICAgICAgIiIiCisgICAgICAgIGZyb20gYmIuQ09XIGltcG9ydCBDT1dEaWN0QmFzZQorICAgICAgICBhID0gQ09XRGljdEJhc2UuY29weSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoRmFsc2UsIGEuaGFzX2tleSgnYScpKQorCisgICAgICAgIGFbJ2EnXSA9ICdhJworICAgICAgICBhWydiJ10gPSAnYicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoVHJ1ZSwgYS5oYXNfa2V5KCdhJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKFRydWUsIGEuaGFzX2tleSgnYicpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnYScsIGFbJ2EnXSApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCdiJywgYVsnYiddICkKKworICAgIGRlZiB0ZXN0Q29weUNvcHkoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBUZXN0IHRoZSBjb3B5IG9mIGNvcGllcworICAgICAgICAiIiIKKworICAgICAgICBmcm9tIGJiLkNPVyBpbXBvcnQgQ09XRGljdEJhc2UKKworICAgICAgICAjIGNyZWF0ZSB0d28gQ09XIGRpY3QgJ2luc3RhbmNlcycKKyAgICAgICAgYiA9IENPV0RpY3RCYXNlLmNvcHkoKQorICAgICAgICBjID0gQ09XRGljdEJhc2UuY29weSgpCisKKyAgICAgICAgIyBhc3NpZ24gc29tZSBrZXlzIHRvIG9uZSBpbnN0YW5jZSwgc29tZSBrZXlzIHRvIGFub3RoZXIKKyAgICAgICAgYlsnYSddID0gMTAKKyAgICAgICAgYlsnYyddID0gMjAKKyAgICAgICAgY1snYSddID0gMzAKKworICAgICAgICAjIHRlc3Qgc2VwYXJhdGlvbiBvZiB0aGUgdHdvIGluc3RhbmNlcworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhGYWxzZSwgYy5oYXNfa2V5KCdjJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDMwLCBjWydhJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEwLCBiWydhJ10pCisKKyAgICAgICAgIyB0ZXN0IGNvcHkKKyAgICAgICAgYl8yID0gYi5jb3B5KCkKKyAgICAgICAgY18yID0gYy5jb3B5KCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhGYWxzZSwgY18yLmhhc19rZXkoJ2MnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMTAsIGJfMlsnYSddKQorCisgICAgICAgIGJfMlsnZCddID0gNDAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoRmFsc2UsIGNfMi5oYXNfa2V5KCdkJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKFRydWUsIGJfMi5oYXNfa2V5KCdkJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDQwLCBiXzJbJ2QnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoRmFsc2UsIGIuaGFzX2tleSgnZCcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhGYWxzZSwgYy5oYXNfa2V5KCdkJykpCisKKyAgICAgICAgY18yWydkJ10gPSAzMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhUcnVlLCBjXzIuaGFzX2tleSgnZCcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhUcnVlLCBiXzIuaGFzX2tleSgnZCcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygzMCwgY18yWydkJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDQwLCBiXzJbJ2QnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoRmFsc2UsIGIuaGFzX2tleSgnZCcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhGYWxzZSwgYy5oYXNfa2V5KCdkJykpCisKKyAgICAgICAgIyB0ZXN0IGNvcHkgb2YgdGhlIGNvcHkKKyAgICAgICAgY18zID0gY18yLmNvcHkoKQorICAgICAgICBiXzMgPSBiXzIuY29weSgpCisgICAgICAgIGJfM18yID0gYl8yLmNvcHkoKQorCisgICAgICAgIGNfM1snZSddID0gNDcxMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyg0NzExLCBjXzNbJ2UnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoRmFsc2UsIGNfMi5oYXNfa2V5KCdlJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKEZhbHNlLCBiXzMuaGFzX2tleSgnZScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhGYWxzZSwgYl8zXzIuaGFzX2tleSgnZScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhGYWxzZSwgYl8yLmhhc19rZXkoJ2UnKSkKKworICAgICAgICBiXzNbJ2UnXSA9ICd2aWVsJworICAgICAgICBzZWxmLmFzc2VydEVxdWFscygndmllbCcsIGJfM1snZSddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyg0NzExLCBjXzNbJ2UnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoRmFsc2UsIGNfMi5oYXNfa2V5KCdlJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKFRydWUsIGJfMy5oYXNfa2V5KCdlJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKEZhbHNlLCBiXzNfMi5oYXNfa2V5KCdlJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKEZhbHNlLCBiXzIuaGFzX2tleSgnZScpKQorCisgICAgZGVmIHRlc3RDb3coc2VsZik6CisgICAgICAgIGZyb20gYmIuQ09XIGltcG9ydCBDT1dEaWN0QmFzZQorICAgICAgICBjID0gQ09XRGljdEJhc2UuY29weSgpCisgICAgICAgIGNbJzEyMyddID0gMTAyNworICAgICAgICBjWydvdGhlciddID0gNDcxMQorICAgICAgICBjWydkJ10gPSB7ICdhYmMnIDogMTAsICdiY2QnIDogMjAgfQorCisgICAgICAgIGNvcHkgPSBjLmNvcHkoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEwMjcsIGNbJzEyMyddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyg0NzExLCBjWydvdGhlciddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh7J2FiYyc6MTAsICdiY2QnOjIwfSwgY1snZCddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygxMDI3LCBjb3B5WycxMjMnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoNDcxMSwgY29weVsnb3RoZXInXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeydhYmMnOjEwLCAnYmNkJzoyMH0sIGNvcHlbJ2QnXSkKKworICAgICAgICAjIGNvdyBpdCBub3cKKyAgICAgICAgY29weVsnMTIzJ10gPSAxMDI4CisgICAgICAgIGNvcHlbJ290aGVyJ10gPSA0NzEyCisgICAgICAgIGNvcHlbJ2QnXVsnYWJjJ10gPSAyMAorCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMTAyNywgY1snMTIzJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDQ3MTEsIGNbJ290aGVyJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHsnYWJjJzoxMCwgJ2JjZCc6MjB9LCBjWydkJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEwMjgsIGNvcHlbJzEyMyddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyg0NzEyLCBjb3B5WydvdGhlciddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh7J2FiYyc6MjAsICdiY2QnOjIwfSwgY29weVsnZCddKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdGVzdHMvZGF0YS5weSBiL2JpdGJha2UvbGliL2JiL3Rlc3RzL2RhdGEucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlhYWI1NwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3Rlc3RzL2RhdGEucHkKQEAgLTAsMCArMSw0NDEgQEAKKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisjCisjIEJpdEJha2UgVGVzdHMgZm9yIHRoZSBEYXRhIFN0b3JlIChkYXRhLnB5L2RhdGFfc21hcnQucHkpCisjCisjIENvcHlyaWdodCAoQykgMjAxMCBDaHJpcyBMYXJzb24KKyMgQ29weXJpZ2h0IChDKSAyMDEyIFJpY2hhcmQgUHVyZGllCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBiYgoraW1wb3J0IGJiLmRhdGEKK2ltcG9ydCBiYi5wYXJzZQoraW1wb3J0IGxvZ2dpbmcKKworY2xhc3MgTG9nUmVjb3JkKCk6CisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgbG9ncyA9IFtdCisgICAgICAgIGNsYXNzIExvZ0hhbmRsZXIobG9nZ2luZy5IYW5kbGVyKToKKyAgICAgICAgICAgIGRlZiBlbWl0KHNlbGYsIHJlY29yZCk6CisgICAgICAgICAgICAgICAgbG9ncy5hcHBlbmQocmVjb3JkKQorICAgICAgICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiQml0QmFrZSIpCisgICAgICAgIGhhbmRsZXIgPSBMb2dIYW5kbGVyKCkKKyAgICAgICAgc2VsZi5oYW5kbGVyID0gaGFuZGxlcgorICAgICAgICBsb2dnZXIuYWRkSGFuZGxlcihoYW5kbGVyKQorICAgICAgICByZXR1cm4gbG9ncworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCB0eXBlLCB2YWx1ZSwgdHJhY2ViYWNrKToKKyAgICAgICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoIkJpdEJha2UiKQorICAgICAgICBsb2dnZXIucmVtb3ZlSGFuZGxlcihzZWxmLmhhbmRsZXIpCisgICAgICAgIHJldHVybgorCitkZWYgbG9nQ29udGFpbnMoaXRlbSwgbG9ncyk6CisgICAgZm9yIGwgaW4gbG9nczoKKyAgICAgICAgbSA9IGwuZ2V0TWVzc2FnZSgpCisgICAgICAgIGlmIGl0ZW0gaW4gbToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCisKK2NsYXNzIERhdGFFeHBhbnNpb25zKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZCA9IGJiLmRhdGEuaW5pdCgpCisgICAgICAgIHNlbGYuZFsiZm9vIl0gPSAidmFsdWVfb2ZfZm9vIgorICAgICAgICBzZWxmLmRbImJhciJdID0gInZhbHVlX29mX2JhciIKKyAgICAgICAgc2VsZi5kWyJ2YWx1ZV9vZl9mb28iXSA9ICJ2YWx1ZV9vZl8ndmFsdWVfb2ZfZm9vJyIKKworICAgIGRlZiB0ZXN0X29uZV92YXIoc2VsZik6CisgICAgICAgIHZhbCA9IHNlbGYuZC5leHBhbmQoIiR7Zm9vfSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHZhbCksICJ2YWx1ZV9vZl9mb28iKQorCisgICAgZGVmIHRlc3RfaW5kaXJlY3Rfb25lX3ZhcihzZWxmKToKKyAgICAgICAgdmFsID0gc2VsZi5kLmV4cGFuZCgiJHske2Zvb319IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodmFsKSwgInZhbHVlX29mXyd2YWx1ZV9vZl9mb28nIikKKworICAgIGRlZiB0ZXN0X2luZGlyZWN0X2FuZF9hbm90aGVyKHNlbGYpOgorICAgICAgICB2YWwgPSBzZWxmLmQuZXhwYW5kKCIkeyR7Zm9vfX0gJHtiYXJ9IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodmFsKSwgInZhbHVlX29mXyd2YWx1ZV9vZl9mb28nIHZhbHVlX29mX2JhciIpCisKKyAgICBkZWYgdGVzdF9weXRob25fc25pcHBldChzZWxmKToKKyAgICAgICAgdmFsID0gc2VsZi5kLmV4cGFuZCgiJHtANSoxMn0iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih2YWwpLCAiNjAiKQorCisgICAgZGVmIHRlc3RfZXhwYW5kX2luX3B5dGhvbl9zbmlwcGV0KHNlbGYpOgorICAgICAgICB2YWwgPSBzZWxmLmQuZXhwYW5kKCIke0AnYm9vICcgKyAnJHtmb299J30iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih2YWwpLCAiYm9vIHZhbHVlX29mX2ZvbyIpCisKKyAgICBkZWYgdGVzdF9weXRob25fc25pcHBldF9nZXR2YXIoc2VsZik6CisgICAgICAgIHZhbCA9IHNlbGYuZC5leHBhbmQoIiR7QGQuZ2V0VmFyKCdmb28nLCBUcnVlKSArICcgJHtiYXJ9J30iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih2YWwpLCAidmFsdWVfb2ZfZm9vIHZhbHVlX29mX2JhciIpCisKKyAgICBkZWYgdGVzdF9weXRob25fc25pcHBldF9zeW50YXhfZXJyb3Ioc2VsZik6CisgICAgICAgIHNlbGYuZC5zZXRWYXIoIkZPTyIsICIke0Bmb28gPSA1fSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGJiLmRhdGFfc21hcnQuRXhwYW5zaW9uRXJyb3IsIHNlbGYuZC5nZXRWYXIsICJGT08iLCBUcnVlKQorCisgICAgZGVmIHRlc3RfcHl0aG9uX3NuaXBwZXRfcnVudGltZV9lcnJvcihzZWxmKToKKyAgICAgICAgc2VsZi5kLnNldFZhcigiRk9PIiwgIiR7QGludCgndGVzdCcpfSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGJiLmRhdGFfc21hcnQuRXhwYW5zaW9uRXJyb3IsIHNlbGYuZC5nZXRWYXIsICJGT08iLCBUcnVlKQorCisgICAgZGVmIHRlc3RfcHl0aG9uX3NuaXBwZXRfZXJyb3JfcGF0aChzZWxmKToKKyAgICAgICAgc2VsZi5kLnNldFZhcigiRk9PIiwgImZvbyB2YWx1ZSAke0JBUn0iKQorICAgICAgICBzZWxmLmQuc2V0VmFyKCJCQVIiLCAiYmFyIHZhbHVlICR7QGludCgndGVzdCcpfSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGJiLmRhdGFfc21hcnQuRXhwYW5zaW9uRXJyb3IsIHNlbGYuZC5nZXRWYXIsICJGT08iLCBUcnVlKQorCisgICAgZGVmIHRlc3RfdmFsdWVfY29udGFpbmluZ192YWx1ZShzZWxmKToKKyAgICAgICAgdmFsID0gc2VsZi5kLmV4cGFuZCgiJHtAZC5nZXRWYXIoJ2ZvbycsIFRydWUpICsgJyAke2Jhcn0nfSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHZhbCksICJ2YWx1ZV9vZl9mb28gdmFsdWVfb2ZfYmFyIikKKworICAgIGRlZiB0ZXN0X3JlZmVyZW5jZV91bmRlZmluZWRfdmFyKHNlbGYpOgorICAgICAgICB2YWwgPSBzZWxmLmQuZXhwYW5kKCIke3VuZGVmaW5lZHZhcn0gbWVoIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodmFsKSwgIiR7dW5kZWZpbmVkdmFyfSBtZWgiKQorCisgICAgZGVmIHRlc3RfZG91YmxlX3JlZmVyZW5jZShzZWxmKToKKyAgICAgICAgc2VsZi5kLnNldFZhcigiQkFSIiwgImJhciB2YWx1ZSIpCisgICAgICAgIHNlbGYuZC5zZXRWYXIoIkZPTyIsICIke0JBUn0gZm9vICR7QkFSfSIpCisgICAgICAgIHZhbCA9IHNlbGYuZC5nZXRWYXIoIkZPTyIsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHZhbCksICJiYXIgdmFsdWUgZm9vIGJhciB2YWx1ZSIpCisKKyAgICBkZWYgdGVzdF9kaXJlY3RfcmVjdXJzaW9uKHNlbGYpOgorICAgICAgICBzZWxmLmQuc2V0VmFyKCJGT08iLCAiJHtGT099IikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoYmIuZGF0YV9zbWFydC5FeHBhbnNpb25FcnJvciwgc2VsZi5kLmdldFZhciwgIkZPTyIsIFRydWUpCisKKyAgICBkZWYgdGVzdF9pbmRpcmVjdF9yZWN1cnNpb24oc2VsZik6CisgICAgICAgIHNlbGYuZC5zZXRWYXIoIkZPTyIsICIke0JBUn0iKQorICAgICAgICBzZWxmLmQuc2V0VmFyKCJCQVIiLCAiJHtCQVp9IikKKyAgICAgICAgc2VsZi5kLnNldFZhcigiQkFaIiwgIiR7Rk9PfSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGJiLmRhdGFfc21hcnQuRXhwYW5zaW9uRXJyb3IsIHNlbGYuZC5nZXRWYXIsICJGT08iLCBUcnVlKQorCisgICAgZGVmIHRlc3RfcmVjdXJzaW9uX2V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5kLnNldFZhcigiRk9PIiwgIiR7QkFSfSIpCisgICAgICAgIHNlbGYuZC5zZXRWYXIoIkJBUiIsICIkeyR7QCdGT08nfX0iKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhiYi5kYXRhX3NtYXJ0LkV4cGFuc2lvbkVycm9yLCBzZWxmLmQuZ2V0VmFyLCAiRk9PIiwgVHJ1ZSkKKworICAgIGRlZiB0ZXN0X2luY29tcGxldGVfdmFyZXhwX3NpbmdsZV9xdW90ZXMoc2VsZik6CisgICAgICAgIHNlbGYuZC5zZXRWYXIoIkZPTyIsICJzZWQgLWkgLWUgJ3M6SVB7OkkkezpnJyAkcGMiKQorICAgICAgICB2YWwgPSBzZWxmLmQuZ2V0VmFyKCJGT08iLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih2YWwpLCAic2VkIC1pIC1lICdzOklQezpJJHs6ZycgJHBjIikKKworICAgIGRlZiB0ZXN0X25vbnN0cmluZyhzZWxmKToKKyAgICAgICAgc2VsZi5kLnNldFZhcigiVEVTVCIsIDUpCisgICAgICAgIHZhbCA9IHNlbGYuZC5nZXRWYXIoIlRFU1QiLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih2YWwpLCAiNSIpCisKKyAgICBkZWYgdGVzdF9yZW5hbWUoc2VsZik6CisgICAgICAgIHNlbGYuZC5yZW5hbWVWYXIoImZvbyIsICJuZXdmb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZC5nZXRWYXIoIm5ld2ZvbyIsIEZhbHNlKSwgInZhbHVlX29mX2ZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kLmdldFZhcigiZm9vIiwgRmFsc2UpLCBOb25lKQorCisgICAgZGVmIHRlc3RfZGVsZXRpb24oc2VsZik6CisgICAgICAgIHNlbGYuZC5kZWxWYXIoImZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kLmdldFZhcigiZm9vIiwgRmFsc2UpLCBOb25lKQorCisgICAgZGVmIHRlc3Rfa2V5cyhzZWxmKToKKyAgICAgICAga2V5cyA9IHNlbGYuZC5rZXlzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChrZXlzLCBbJ3ZhbHVlX29mX2ZvbycsICdmb28nLCAnYmFyJ10pCisKKyAgICBkZWYgdGVzdF9rZXlzX2RlbGV0aW9uKHNlbGYpOgorICAgICAgICBuZXdkID0gYmIuZGF0YS5jcmVhdGVDb3B5KHNlbGYuZCkKKyAgICAgICAgbmV3ZC5kZWxWYXIoImJhciIpCisgICAgICAgIGtleXMgPSBuZXdkLmtleXMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGtleXMsIFsndmFsdWVfb2ZfZm9vJywgJ2ZvbyddKQorCitjbGFzcyBUZXN0TmVzdGVkRXhwYW5zaW9ucyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmQgPSBiYi5kYXRhLmluaXQoKQorICAgICAgICBzZWxmLmRbImZvbyJdID0gImZvbyIKKyAgICAgICAgc2VsZi5kWyJiYXIiXSA9ICJiYXIiCisgICAgICAgIHNlbGYuZFsidmFsdWVfb2ZfZm9vYmFyIl0gPSAiMTg3IgorCisgICAgZGVmIHRlc3RfcmVmcyhzZWxmKToKKyAgICAgICAgdmFsID0gc2VsZi5kLmV4cGFuZCgiJHt2YWx1ZV9vZl8ke2Zvb30ke2Jhcn19IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodmFsKSwgIjE4NyIpCisKKyAgICAjZGVmIHRlc3RfcHl0aG9uX3JlZnMoc2VsZik6CisgICAgIyAgICB2YWwgPSBzZWxmLmQuZXhwYW5kKCIke0Ake0AzfSoqMiArICR7QDR9KioyfSIpCisgICAgIyAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih2YWwpLCAiMjUiKQorCisgICAgZGVmIHRlc3RfcmVmX2luX3B5dGhvbl9yZWYoc2VsZik6CisgICAgICAgIHZhbCA9IHNlbGYuZC5leHBhbmQoIiR7QCcke2Zvb30nICsgJ2Jhcid9IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodmFsKSwgImZvb2JhciIpCisKKyAgICBkZWYgdGVzdF9weXRob25fcmVmX2luX3JlZihzZWxmKToKKyAgICAgICAgdmFsID0gc2VsZi5kLmV4cGFuZCgiJHske0AnZicrJ28nKydvJ319IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodmFsKSwgImZvbyIpCisKKyAgICBkZWYgdGVzdF9kZWVwX25lc3Rpbmcoc2VsZik6CisgICAgICAgIGRlcHRoID0gMTAwCisgICAgICAgIHZhbCA9IHNlbGYuZC5leHBhbmQoIiR7IiAqIGRlcHRoICsgImZvbyIgKyAifSIgKiBkZXB0aCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodmFsKSwgImZvbyIpCisKKyAgICAjZGVmIHRlc3RfZGVlcF9weXRob25fbmVzdGluZyhzZWxmKToKKyAgICAjICAgIGRlcHRoID0gNTAKKyAgICAjICAgIHZhbCA9IHNlbGYuZC5leHBhbmQoIiR7QCIgKiBkZXB0aCArICIxIiArICIrMX0iICogZGVwdGgpCisgICAgIyAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih2YWwpLCBzdHIoZGVwdGggKyAxKSkKKworICAgIGRlZiB0ZXN0X21peGVkKHNlbGYpOgorICAgICAgICB2YWwgPSBzZWxmLmQuZXhwYW5kKCIke3ZhbHVlX29mXyR7QCgnJHtmb299JysnYmFyJylbMDozXX0keyR7QCdCQVInLmxvd2VyKCl9fX0iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih2YWwpLCAiMTg3IikKKworICAgIGRlZiB0ZXN0X3J1bnRpbWUoc2VsZik6CisgICAgICAgIHZhbCA9IHNlbGYuZC5leHBhbmQoIiR7JHtAJ3ZhbHVlX29mJyArICdfZicrJ28nKydvJysnYicrJ2EnKydyJ319IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodmFsKSwgIjE4NyIpCisKK2NsYXNzIFRlc3RNZW1vaXplKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9tZW1vaXplZChzZWxmKToKKyAgICAgICAgZCA9IGJiLmRhdGEuaW5pdCgpCisgICAgICAgIGQuc2V0VmFyKCJGT08iLCAiYmFyIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuZ2V0VmFyKCJGT08iLCBGYWxzZSkgaXMgZC5nZXRWYXIoIkZPTyIsIEZhbHNlKSkKKworICAgIGRlZiB0ZXN0X25vdF9tZW1vaXplZChzZWxmKToKKyAgICAgICAgZDEgPSBiYi5kYXRhLmluaXQoKQorICAgICAgICBkMiA9IGJiLmRhdGEuaW5pdCgpCisgICAgICAgIGQxLnNldFZhcigiRk9PIiwgImJhciIpCisgICAgICAgIGQyLnNldFZhcigiRk9PIiwgImJhcjIiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZDEuZ2V0VmFyKCJGT08iLCBGYWxzZSkgaXMgbm90IGQyLmdldFZhcigiRk9PIiwgRmFsc2UpKQorCisgICAgZGVmIHRlc3RfY2hhbmdlZF9hZnRlcl9tZW1vaXplZChzZWxmKToKKyAgICAgICAgZCA9IGJiLmRhdGEuaW5pdCgpCisgICAgICAgIGQuc2V0VmFyKCJmb28iLCAidmFsdWUgb2YgZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZC5nZXRWYXIoImZvbyIsIEZhbHNlKSksICJ2YWx1ZSBvZiBmb28iKQorICAgICAgICBkLnNldFZhcigiZm9vIiwgInNlY29uZCB2YWx1ZSBvZiBmb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihkLmdldFZhcigiZm9vIiwgRmFsc2UpKSwgInNlY29uZCB2YWx1ZSBvZiBmb28iKQorCisgICAgZGVmIHRlc3Rfc2FtZV92YWx1ZShzZWxmKToKKyAgICAgICAgZCA9IGJiLmRhdGEuaW5pdCgpCisgICAgICAgIGQuc2V0VmFyKCJmb28iLCAidmFsdWUgb2YiKQorICAgICAgICBkLnNldFZhcigiYmFyIiwgInZhbHVlIG9mIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldFZhcigiZm9vIiwgRmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGQuZ2V0VmFyKCJiYXIiLCBGYWxzZSkpCisKK2NsYXNzIFRlc3RDb25jYXQodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5kID0gYmIuZGF0YS5pbml0KCkKKyAgICAgICAgc2VsZi5kLnNldFZhcigiRk9PIiwgImZvbyIpCisgICAgICAgIHNlbGYuZC5zZXRWYXIoIlZBTCIsICJ2YWwiKQorICAgICAgICBzZWxmLmQuc2V0VmFyKCJCQVIiLCAiYmFyIikKKworICAgIGRlZiB0ZXN0X3ByZXBlbmQoc2VsZik6CisgICAgICAgIHNlbGYuZC5zZXRWYXIoIlRFU1QiLCAiJHtWQUx9IikKKyAgICAgICAgc2VsZi5kLnByZXBlbmRWYXIoIlRFU1QiLCAiJHtGT099OiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kLmdldFZhcigiVEVTVCIsIFRydWUpLCAiZm9vOnZhbCIpCisKKyAgICBkZWYgdGVzdF9hcHBlbmQoc2VsZik6CisgICAgICAgIHNlbGYuZC5zZXRWYXIoIlRFU1QiLCAiJHtWQUx9IikKKyAgICAgICAgc2VsZi5kLmFwcGVuZFZhcigiVEVTVCIsICI6JHtCQVJ9IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmQuZ2V0VmFyKCJURVNUIiwgVHJ1ZSksICJ2YWw6YmFyIikKKworICAgIGRlZiB0ZXN0X211bHRpcGxlX2FwcGVuZChzZWxmKToKKyAgICAgICAgc2VsZi5kLnNldFZhcigiVEVTVCIsICIke1ZBTH0iKQorICAgICAgICBzZWxmLmQucHJlcGVuZFZhcigiVEVTVCIsICIke0ZPT306IikKKyAgICAgICAgc2VsZi5kLmFwcGVuZFZhcigiVEVTVCIsICI6dmFsMiIpCisgICAgICAgIHNlbGYuZC5hcHBlbmRWYXIoIlRFU1QiLCAiOiR7QkFSfSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kLmdldFZhcigiVEVTVCIsIFRydWUpLCAiZm9vOnZhbDp2YWwyOmJhciIpCisKK2NsYXNzIFRlc3RDb25jYXRPdmVycmlkZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmQgPSBiYi5kYXRhLmluaXQoKQorICAgICAgICBzZWxmLmQuc2V0VmFyKCJGT08iLCAiZm9vIikKKyAgICAgICAgc2VsZi5kLnNldFZhcigiVkFMIiwgInZhbCIpCisgICAgICAgIHNlbGYuZC5zZXRWYXIoIkJBUiIsICJiYXIiKQorCisgICAgZGVmIHRlc3RfcHJlcGVuZChzZWxmKToKKyAgICAgICAgc2VsZi5kLnNldFZhcigiVEVTVCIsICIke1ZBTH0iKQorICAgICAgICBzZWxmLmQuc2V0VmFyKCJURVNUX3ByZXBlbmQiLCAiJHtGT099OiIpCisgICAgICAgIGJiLmRhdGEudXBkYXRlX2RhdGEoc2VsZi5kKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZC5nZXRWYXIoIlRFU1QiLCBUcnVlKSwgImZvbzp2YWwiKQorCisgICAgZGVmIHRlc3RfYXBwZW5kKHNlbGYpOgorICAgICAgICBzZWxmLmQuc2V0VmFyKCJURVNUIiwgIiR7VkFMfSIpCisgICAgICAgIHNlbGYuZC5zZXRWYXIoIlRFU1RfYXBwZW5kIiwgIjoke0JBUn0iKQorICAgICAgICBiYi5kYXRhLnVwZGF0ZV9kYXRhKHNlbGYuZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmQuZ2V0VmFyKCJURVNUIiwgVHJ1ZSksICJ2YWw6YmFyIikKKworICAgIGRlZiB0ZXN0X211bHRpcGxlX2FwcGVuZChzZWxmKToKKyAgICAgICAgc2VsZi5kLnNldFZhcigiVEVTVCIsICIke1ZBTH0iKQorICAgICAgICBzZWxmLmQuc2V0VmFyKCJURVNUX3ByZXBlbmQiLCAiJHtGT099OiIpCisgICAgICAgIHNlbGYuZC5zZXRWYXIoIlRFU1RfYXBwZW5kIiwgIjp2YWwyIikKKyAgICAgICAgc2VsZi5kLnNldFZhcigiVEVTVF9hcHBlbmQiLCAiOiR7QkFSfSIpCisgICAgICAgIGJiLmRhdGEudXBkYXRlX2RhdGEoc2VsZi5kKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZC5nZXRWYXIoIlRFU1QiLCBUcnVlKSwgImZvbzp2YWw6dmFsMjpiYXIiKQorCisgICAgZGVmIHRlc3RfYXBwZW5kX3Vuc2V0KHNlbGYpOgorICAgICAgICBzZWxmLmQuc2V0VmFyKCJURVNUX3ByZXBlbmQiLCAiJHtGT099OiIpCisgICAgICAgIHNlbGYuZC5zZXRWYXIoIlRFU1RfYXBwZW5kIiwgIjp2YWwyIikKKyAgICAgICAgc2VsZi5kLnNldFZhcigiVEVTVF9hcHBlbmQiLCAiOiR7QkFSfSIpCisgICAgICAgIGJiLmRhdGEudXBkYXRlX2RhdGEoc2VsZi5kKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZC5nZXRWYXIoIlRFU1QiLCBUcnVlKSwgImZvbzo6dmFsMjpiYXIiKQorCisgICAgZGVmIHRlc3RfcmVtb3ZlKHNlbGYpOgorICAgICAgICBzZWxmLmQuc2V0VmFyKCJURVNUIiwgIiR7VkFMfSAke0JBUn0iKQorICAgICAgICBzZWxmLmQuc2V0VmFyKCJURVNUX3JlbW92ZSIsICJ2YWwiKQorICAgICAgICBiYi5kYXRhLnVwZGF0ZV9kYXRhKHNlbGYuZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmQuZ2V0VmFyKCJURVNUIiwgVHJ1ZSksICJiYXIiKQorCisgICAgZGVmIHRlc3RfZG91YmxlcmVmX3JlbW92ZShzZWxmKToKKyAgICAgICAgc2VsZi5kLnNldFZhcigiVEVTVCIsICIke1ZBTH0gJHtCQVJ9IikKKyAgICAgICAgc2VsZi5kLnNldFZhcigiVEVTVF9yZW1vdmUiLCAidmFsIikKKyAgICAgICAgc2VsZi5kLnNldFZhcigiVEVTVF9URVNUIiwgIiR7VEVTVH0gJHtURVNUfSIpCisgICAgICAgIGJiLmRhdGEudXBkYXRlX2RhdGEoc2VsZi5kKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZC5nZXRWYXIoIlRFU1RfVEVTVCIsIFRydWUpLCAiYmFyIGJhciIpCisKKyAgICBkZWYgdGVzdF9lbXB0eV9yZW1vdmUoc2VsZik6CisgICAgICAgIHNlbGYuZC5zZXRWYXIoIlRFU1QiLCAiIikKKyAgICAgICAgc2VsZi5kLnNldFZhcigiVEVTVF9yZW1vdmUiLCAidmFsIikKKyAgICAgICAgYmIuZGF0YS51cGRhdGVfZGF0YShzZWxmLmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kLmdldFZhcigiVEVTVCIsIFRydWUpLCAiIikKKworICAgIGRlZiB0ZXN0X3JlbW92ZV9leHBhbnNpb24oc2VsZik6CisgICAgICAgIHNlbGYuZC5zZXRWYXIoIkJBUiIsICJaIikKKyAgICAgICAgc2VsZi5kLnNldFZhcigiVEVTVCIsICIke0JBUn0vWCBZIikKKyAgICAgICAgc2VsZi5kLnNldFZhcigiVEVTVF9yZW1vdmUiLCAiJHtCQVJ9L1giKQorICAgICAgICBiYi5kYXRhLnVwZGF0ZV9kYXRhKHNlbGYuZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmQuZ2V0VmFyKCJURVNUIiwgVHJ1ZSksICJZIikKKworICAgIGRlZiB0ZXN0X3JlbW92ZV9leHBhbnNpb25faXRlbXMoc2VsZik6CisgICAgICAgIHNlbGYuZC5zZXRWYXIoIlRFU1QiLCAiQSBCIEMgRCIpCisgICAgICAgIHNlbGYuZC5zZXRWYXIoIkJBUiIsICJCIEQiKQorICAgICAgICBzZWxmLmQuc2V0VmFyKCJURVNUX3JlbW92ZSIsICIke0JBUn0iKQorICAgICAgICBiYi5kYXRhLnVwZGF0ZV9kYXRhKHNlbGYuZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmQuZ2V0VmFyKCJURVNUIiwgVHJ1ZSksICJBIEMiKQorCitjbGFzcyBUZXN0T3ZlcnJpZGVzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZCA9IGJiLmRhdGEuaW5pdCgpCisgICAgICAgIHNlbGYuZC5zZXRWYXIoIk9WRVJSSURFUyIsICJmb286YmFyOmxvY2FsIikKKyAgICAgICAgc2VsZi5kLnNldFZhcigiVEVTVCIsICJ0ZXN0dmFsdWUiKQorCisgICAgZGVmIHRlc3Rfbm9fb3ZlcnJpZGUoc2VsZik6CisgICAgICAgIGJiLmRhdGEudXBkYXRlX2RhdGEoc2VsZi5kKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZC5nZXRWYXIoIlRFU1QiLCBUcnVlKSwgInRlc3R2YWx1ZSIpCisKKyAgICBkZWYgdGVzdF9vbmVfb3ZlcnJpZGUoc2VsZik6CisgICAgICAgIHNlbGYuZC5zZXRWYXIoIlRFU1RfYmFyIiwgInRlc3R2YWx1ZTIiKQorICAgICAgICBiYi5kYXRhLnVwZGF0ZV9kYXRhKHNlbGYuZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmQuZ2V0VmFyKCJURVNUIiwgVHJ1ZSksICJ0ZXN0dmFsdWUyIikKKworICAgIGRlZiB0ZXN0X29uZV9vdmVycmlkZV91bnNldChzZWxmKToKKyAgICAgICAgc2VsZi5kLnNldFZhcigiVEVTVDJfYmFyIiwgInRlc3R2YWx1ZTIiKQorICAgICAgICBiYi5kYXRhLnVwZGF0ZV9kYXRhKHNlbGYuZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmQuZ2V0VmFyKCJURVNUMiIsIFRydWUpLCAidGVzdHZhbHVlMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0SXRlbXNFcXVhbChzZWxmLmQua2V5cygpLCBbJ1RFU1QnLCAnVEVTVDInLCAnT1ZFUlJJREVTJywgJ1RFU1QyX2JhciddKQorCisgICAgZGVmIHRlc3RfbXVsdGlwbGVfb3ZlcnJpZGUoc2VsZik6CisgICAgICAgIHNlbGYuZC5zZXRWYXIoIlRFU1RfYmFyIiwgInRlc3R2YWx1ZTIiKQorICAgICAgICBzZWxmLmQuc2V0VmFyKCJURVNUX2xvY2FsIiwgInRlc3R2YWx1ZTMiKQorICAgICAgICBzZWxmLmQuc2V0VmFyKCJURVNUX2ZvbyIsICJ0ZXN0dmFsdWU0IikKKyAgICAgICAgYmIuZGF0YS51cGRhdGVfZGF0YShzZWxmLmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kLmdldFZhcigiVEVTVCIsIFRydWUpLCAidGVzdHZhbHVlMyIpCisgICAgICAgIHNlbGYuYXNzZXJ0SXRlbXNFcXVhbChzZWxmLmQua2V5cygpLCBbJ1RFU1QnLCAnVEVTVF9mb28nLCAnT1ZFUlJJREVTJywgJ1RFU1RfYmFyJywgJ1RFU1RfbG9jYWwnXSkKKworICAgIGRlZiB0ZXN0X211bHRpcGxlX2NvbWJpbmVkX292ZXJyaWRlcyhzZWxmKToKKyAgICAgICAgc2VsZi5kLnNldFZhcigiVEVTVF9sb2NhbF9mb29fYmFyIiwgInRlc3R2YWx1ZTMiKQorICAgICAgICBiYi5kYXRhLnVwZGF0ZV9kYXRhKHNlbGYuZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmQuZ2V0VmFyKCJURVNUIiwgVHJ1ZSksICJ0ZXN0dmFsdWUzIikKKworICAgIGRlZiB0ZXN0X211bHRpcGxlX292ZXJyaWRlc191bnNldChzZWxmKToKKyAgICAgICAgc2VsZi5kLnNldFZhcigiVEVTVDJfbG9jYWxfZm9vX2JhciIsICJ0ZXN0dmFsdWUzIikKKyAgICAgICAgYmIuZGF0YS51cGRhdGVfZGF0YShzZWxmLmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kLmdldFZhcigiVEVTVDIiLCBUcnVlKSwgInRlc3R2YWx1ZTMiKQorCisgICAgZGVmIHRlc3Rfa2V5ZXhwYW5zaW9uX292ZXJyaWRlKHNlbGYpOgorICAgICAgICBzZWxmLmQuc2V0VmFyKCJMT0NBTCIsICJsb2NhbCIpCisgICAgICAgIHNlbGYuZC5zZXRWYXIoIlRFU1RfYmFyIiwgInRlc3R2YWx1ZTIiKQorICAgICAgICBzZWxmLmQuc2V0VmFyKCJURVNUXyR7TE9DQUx9IiwgInRlc3R2YWx1ZTMiKQorICAgICAgICBzZWxmLmQuc2V0VmFyKCJURVNUX2ZvbyIsICJ0ZXN0dmFsdWU0IikKKyAgICAgICAgYmIuZGF0YS51cGRhdGVfZGF0YShzZWxmLmQpCisgICAgICAgIGJiLmRhdGEuZXhwYW5kS2V5cyhzZWxmLmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kLmdldFZhcigiVEVTVCIsIFRydWUpLCAidGVzdHZhbHVlMyIpCisKKyAgICBkZWYgdGVzdF9yZW5hbWVfb3ZlcnJpZGUoc2VsZik6CisgICAgICAgIHNlbGYuZC5zZXRWYXIoIkFMVEVSTkFUSVZFX25jdXJzZXMtdG9vbHNfY2xhc3MtdGFyZ2V0IiwgImEiKQorICAgICAgICBzZWxmLmQuc2V0VmFyKCJPVkVSUklERVMiLCAiY2xhc3MtdGFyZ2V0IikKKyAgICAgICAgYmIuZGF0YS51cGRhdGVfZGF0YShzZWxmLmQpCisgICAgICAgIHNlbGYuZC5yZW5hbWVWYXIoIkFMVEVSTkFUSVZFX25jdXJzZXMtdG9vbHMiLCAiQUxURVJOQVRJVkVfbGliMzItbmN1cnNlcy10b29scyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kLmdldFZhcigiQUxURVJOQVRJVkVfbGliMzItbmN1cnNlcy10b29scyIsIFRydWUpLCAiYSIpCisKKyAgICBkZWYgdGVzdF91bmRlcnNjb3JlX292ZXJyaWRlKHNlbGYpOgorICAgICAgICBzZWxmLmQuc2V0VmFyKCJURVNUX2JhciIsICJ0ZXN0dmFsdWUyIikKKyAgICAgICAgc2VsZi5kLnNldFZhcigiVEVTVF9zb21lX3ZhbCIsICJ0ZXN0dmFsdWUzIikKKyAgICAgICAgc2VsZi5kLnNldFZhcigiVEVTVF9mb28iLCAidGVzdHZhbHVlNCIpCisgICAgICAgIHNlbGYuZC5zZXRWYXIoIk9WRVJSSURFUyIsICJmb286YmFyOnNvbWVfdmFsIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmQuZ2V0VmFyKCJURVNUIiwgVHJ1ZSksICJ0ZXN0dmFsdWUzIikKKworY2xhc3MgVGVzdEtleUV4cGFuc2lvbih1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmQgPSBiYi5kYXRhLmluaXQoKQorICAgICAgICBzZWxmLmQuc2V0VmFyKCJGT08iLCAiZm9vIikKKyAgICAgICAgc2VsZi5kLnNldFZhcigiQkFSIiwgImZvbyIpCisKKyAgICBkZWYgdGVzdF9rZXlleHBhbmQoc2VsZik6CisgICAgICAgIHNlbGYuZC5zZXRWYXIoIlZBTF8ke0ZPT30iLCAiQSIpCisgICAgICAgIHNlbGYuZC5zZXRWYXIoIlZBTF8ke0JBUn0iLCAiQiIpCisgICAgICAgIHdpdGggTG9nUmVjb3JkKCkgYXMgbG9nczoKKyAgICAgICAgICAgIGJiLmRhdGEuZXhwYW5kS2V5cyhzZWxmLmQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobG9nQ29udGFpbnMoIlZhcmlhYmxlIGtleSBWQUxfJHtGT099IChBKSByZXBsYWNlcyBvcmlnaW5hbCBrZXkgVkFMX2ZvbyAoQikiLCBsb2dzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmQuZ2V0VmFyKCJWQUxfZm9vIiwgVHJ1ZSksICJBIikKKworY2xhc3MgVGVzdEZsYWdzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZCA9IGJiLmRhdGEuaW5pdCgpCisgICAgICAgIHNlbGYuZC5zZXRWYXIoImZvbyIsICJ2YWx1ZSBvZiBmb28iKQorICAgICAgICBzZWxmLmQuc2V0VmFyRmxhZygiZm9vIiwgImZsYWcxIiwgInZhbHVlIG9mIGZsYWcxIikKKyAgICAgICAgc2VsZi5kLnNldFZhckZsYWcoImZvbyIsICJmbGFnMiIsICJ2YWx1ZSBvZiBmbGFnMiIpCisKKyAgICBkZWYgdGVzdF9zZXRmbGFnKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZC5nZXRWYXJGbGFnKCJmb28iLCAiZmxhZzEiKSwgInZhbHVlIG9mIGZsYWcxIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmQuZ2V0VmFyRmxhZygiZm9vIiwgImZsYWcyIiksICJ2YWx1ZSBvZiBmbGFnMiIpCisKKyAgICBkZWYgdGVzdF9kZWxmbGFnKHNlbGYpOgorICAgICAgICBzZWxmLmQuZGVsVmFyRmxhZygiZm9vIiwgImZsYWcyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmQuZ2V0VmFyRmxhZygiZm9vIiwgImZsYWcxIiksICJ2YWx1ZSBvZiBmbGFnMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kLmdldFZhckZsYWcoImZvbyIsICJmbGFnMiIpLCBOb25lKQorCisKK2NsYXNzIENvbnRhaW5zKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZCA9IGJiLmRhdGEuaW5pdCgpCisgICAgICAgIHNlbGYuZC5zZXRWYXIoIlNPTUVGTEFHIiwgImEgYiBjIikKKworICAgIGRlZiB0ZXN0X2NvbnRhaW5zKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoYmIudXRpbHMuY29udGFpbnMoIlNPTUVGTEFHIiwgImEiLCBUcnVlLCBGYWxzZSwgc2VsZi5kKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJiLnV0aWxzLmNvbnRhaW5zKCJTT01FRkxBRyIsICJiIiwgVHJ1ZSwgRmFsc2UsIHNlbGYuZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiYi51dGlscy5jb250YWlucygiU09NRUZMQUciLCAiYyIsIFRydWUsIEZhbHNlLCBzZWxmLmQpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiYi51dGlscy5jb250YWlucygiU09NRUZMQUciLCAiYSBiIiwgVHJ1ZSwgRmFsc2UsIHNlbGYuZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiYi51dGlscy5jb250YWlucygiU09NRUZMQUciLCAiYiBjIiwgVHJ1ZSwgRmFsc2UsIHNlbGYuZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiYi51dGlscy5jb250YWlucygiU09NRUZMQUciLCAiYyBhIiwgVHJ1ZSwgRmFsc2UsIHNlbGYuZCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJiLnV0aWxzLmNvbnRhaW5zKCJTT01FRkxBRyIsICJhIGIgYyIsIFRydWUsIEZhbHNlLCBzZWxmLmQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYmIudXRpbHMuY29udGFpbnMoIlNPTUVGTEFHIiwgImMgYiBhIiwgVHJ1ZSwgRmFsc2UsIHNlbGYuZCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShiYi51dGlscy5jb250YWlucygiU09NRUZMQUciLCAieCIsIFRydWUsIEZhbHNlLCBzZWxmLmQpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGJiLnV0aWxzLmNvbnRhaW5zKCJTT01FRkxBRyIsICJhIHgiLCBUcnVlLCBGYWxzZSwgc2VsZi5kKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShiYi51dGlscy5jb250YWlucygiU09NRUZMQUciLCAieCBjIGIiLCBUcnVlLCBGYWxzZSwgc2VsZi5kKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShiYi51dGlscy5jb250YWlucygiU09NRUZMQUciLCAieCBjIGIgYSIsIFRydWUsIEZhbHNlLCBzZWxmLmQpKQorCisgICAgZGVmIHRlc3RfY29udGFpbnNfYW55KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoYmIudXRpbHMuY29udGFpbnNfYW55KCJTT01FRkxBRyIsICJhIiwgVHJ1ZSwgRmFsc2UsIHNlbGYuZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiYi51dGlscy5jb250YWluc19hbnkoIlNPTUVGTEFHIiwgImIiLCBUcnVlLCBGYWxzZSwgc2VsZi5kKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJiLnV0aWxzLmNvbnRhaW5zX2FueSgiU09NRUZMQUciLCAiYyIsIFRydWUsIEZhbHNlLCBzZWxmLmQpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiYi51dGlscy5jb250YWluc19hbnkoIlNPTUVGTEFHIiwgImEgYiIsIFRydWUsIEZhbHNlLCBzZWxmLmQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYmIudXRpbHMuY29udGFpbnNfYW55KCJTT01FRkxBRyIsICJiIGMiLCBUcnVlLCBGYWxzZSwgc2VsZi5kKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJiLnV0aWxzLmNvbnRhaW5zX2FueSgiU09NRUZMQUciLCAiYyBhIiwgVHJ1ZSwgRmFsc2UsIHNlbGYuZCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJiLnV0aWxzLmNvbnRhaW5zX2FueSgiU09NRUZMQUciLCAiYSB4IiwgVHJ1ZSwgRmFsc2UsIHNlbGYuZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiYi51dGlscy5jb250YWluc19hbnkoIlNPTUVGTEFHIiwgInggYyIsIFRydWUsIEZhbHNlLCBzZWxmLmQpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoYmIudXRpbHMuY29udGFpbnNfYW55KCJTT01FRkxBRyIsICJ4IiwgVHJ1ZSwgRmFsc2UsIHNlbGYuZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoYmIudXRpbHMuY29udGFpbnNfYW55KCJTT01FRkxBRyIsICJ4IHkgeiIsIFRydWUsIEZhbHNlLCBzZWxmLmQpKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdGVzdHMvZmV0Y2gucHkgYi9iaXRiYWtlL2xpYi9iYi90ZXN0cy9mZXRjaC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTYxZjNhCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdGVzdHMvZmV0Y2gucHkKQEAgLTAsMCArMSw3NTkgQEAKKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisjCisjIEJpdEJha2UgVGVzdHMgZm9yIHRoZSBGZXRjaGVyIChmZXRjaDIvKQorIworIyBDb3B5cmlnaHQgKEMpIDIwMTIgUmljaGFyZCBQdXJkaWUKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisjCisKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IG9zCitmcm9tIGJiLmZldGNoMiBpbXBvcnQgVVJJCitmcm9tIGJiLmZldGNoMiBpbXBvcnQgRmV0Y2hNZXRob2QKK2ltcG9ydCBiYgorCitjbGFzcyBVUklUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICB0ZXN0X3VyaXMgPSB7CisgICAgICAgICJodHRwOi8vd3d3Lmdvb2dsZS5jb20vaW5kZXguaHRtbCIgOiB7CisgICAgICAgICAgICAndXJpJzogJ2h0dHA6Ly93d3cuZ29vZ2xlLmNvbS9pbmRleC5odG1sJywKKyAgICAgICAgICAgICdzY2hlbWUnOiAnaHR0cCcsCisgICAgICAgICAgICAnaG9zdG5hbWUnOiAnd3d3Lmdvb2dsZS5jb20nLAorICAgICAgICAgICAgJ3BvcnQnOiBOb25lLAorICAgICAgICAgICAgJ2hvc3Rwb3J0JzogJ3d3dy5nb29nbGUuY29tJywKKyAgICAgICAgICAgICdwYXRoJzogJy9pbmRleC5odG1sJywKKyAgICAgICAgICAgICd1c2VyaW5mbyc6ICcnLAorICAgICAgICAgICAgJ3VzZXJuYW1lJzogJycsCisgICAgICAgICAgICAncGFzc3dvcmQnOiAnJywKKyAgICAgICAgICAgICdwYXJhbXMnOiB7fSwKKyAgICAgICAgICAgICdxdWVyeSc6IHt9LAorICAgICAgICAgICAgJ3JlbGF0aXZlJzogRmFsc2UKKyAgICAgICAgfSwKKyAgICAgICAgImh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9pbmRleC5odG1sO3BhcmFtMT12YWx1ZTEiIDogeworICAgICAgICAgICAgJ3VyaSc6ICdodHRwOi8vd3d3Lmdvb2dsZS5jb20vaW5kZXguaHRtbDtwYXJhbTE9dmFsdWUxJywKKyAgICAgICAgICAgICdzY2hlbWUnOiAnaHR0cCcsCisgICAgICAgICAgICAnaG9zdG5hbWUnOiAnd3d3Lmdvb2dsZS5jb20nLAorICAgICAgICAgICAgJ3BvcnQnOiBOb25lLAorICAgICAgICAgICAgJ2hvc3Rwb3J0JzogJ3d3dy5nb29nbGUuY29tJywKKyAgICAgICAgICAgICdwYXRoJzogJy9pbmRleC5odG1sJywKKyAgICAgICAgICAgICd1c2VyaW5mbyc6ICcnLAorICAgICAgICAgICAgJ3VzZXJuYW1lJzogJycsCisgICAgICAgICAgICAncGFzc3dvcmQnOiAnJywKKyAgICAgICAgICAgICdwYXJhbXMnOiB7CisgICAgICAgICAgICAgICAgJ3BhcmFtMSc6ICd2YWx1ZTEnCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgJ3F1ZXJ5Jzoge30sCisgICAgICAgICAgICAncmVsYXRpdmUnOiBGYWxzZQorICAgICAgICB9LAorICAgICAgICAiaHR0cDovL3d3dy5leGFtcGxlLm9yZy9pbmRleC5odG1sP3BhcmFtMT12YWx1ZTEiIDogeworICAgICAgICAgICAgJ3VyaSc6ICdodHRwOi8vd3d3LmV4YW1wbGUub3JnL2luZGV4Lmh0bWw/cGFyYW0xPXZhbHVlMScsCisgICAgICAgICAgICAnc2NoZW1lJzogJ2h0dHAnLAorICAgICAgICAgICAgJ2hvc3RuYW1lJzogJ3d3dy5leGFtcGxlLm9yZycsCisgICAgICAgICAgICAncG9ydCc6IE5vbmUsCisgICAgICAgICAgICAnaG9zdHBvcnQnOiAnd3d3LmV4YW1wbGUub3JnJywKKyAgICAgICAgICAgICdwYXRoJzogJy9pbmRleC5odG1sJywKKyAgICAgICAgICAgICd1c2VyaW5mbyc6ICcnLAorICAgICAgICAgICAgJ3VzZXJuYW1lJzogJycsCisgICAgICAgICAgICAncGFzc3dvcmQnOiAnJywKKyAgICAgICAgICAgICdwYXJhbXMnOiB7fSwKKyAgICAgICAgICAgICdxdWVyeSc6IHsKKyAgICAgICAgICAgICAgICAncGFyYW0xJzogJ3ZhbHVlMScKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAncmVsYXRpdmUnOiBGYWxzZQorICAgICAgICB9LAorICAgICAgICAiaHR0cDovL3d3dy5leGFtcGxlLm9yZy9pbmRleC5odG1sP3FwYXJhbTE9cXZhbHVlMTtwYXJhbTI9dmFsdWUyIiA6IHsKKyAgICAgICAgICAgICd1cmknOiAnaHR0cDovL3d3dy5leGFtcGxlLm9yZy9pbmRleC5odG1sP3FwYXJhbTE9cXZhbHVlMTtwYXJhbTI9dmFsdWUyJywKKyAgICAgICAgICAgICdzY2hlbWUnOiAnaHR0cCcsCisgICAgICAgICAgICAnaG9zdG5hbWUnOiAnd3d3LmV4YW1wbGUub3JnJywKKyAgICAgICAgICAgICdwb3J0JzogTm9uZSwKKyAgICAgICAgICAgICdob3N0cG9ydCc6ICd3d3cuZXhhbXBsZS5vcmcnLAorICAgICAgICAgICAgJ3BhdGgnOiAnL2luZGV4Lmh0bWwnLAorICAgICAgICAgICAgJ3VzZXJpbmZvJzogJycsCisgICAgICAgICAgICAndXNlcm5hbWUnOiAnJywKKyAgICAgICAgICAgICdwYXNzd29yZCc6ICcnLAorICAgICAgICAgICAgJ3BhcmFtcyc6IHsKKyAgICAgICAgICAgICAgICAncGFyYW0yJzogJ3ZhbHVlMicKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAncXVlcnknOiB7CisgICAgICAgICAgICAgICAgJ3FwYXJhbTEnOiAncXZhbHVlMScKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAncmVsYXRpdmUnOiBGYWxzZQorICAgICAgICB9LAorICAgICAgICAiaHR0cDovL3d3dy5leGFtcGxlLmNvbTo4MDgwL2luZGV4Lmh0bWwiIDogeworICAgICAgICAgICAgJ3VyaSc6ICdodHRwOi8vd3d3LmV4YW1wbGUuY29tOjgwODAvaW5kZXguaHRtbCcsCisgICAgICAgICAgICAnc2NoZW1lJzogJ2h0dHAnLAorICAgICAgICAgICAgJ2hvc3RuYW1lJzogJ3d3dy5leGFtcGxlLmNvbScsCisgICAgICAgICAgICAncG9ydCc6IDgwODAsCisgICAgICAgICAgICAnaG9zdHBvcnQnOiAnd3d3LmV4YW1wbGUuY29tOjgwODAnLAorICAgICAgICAgICAgJ3BhdGgnOiAnL2luZGV4Lmh0bWwnLAorICAgICAgICAgICAgJ3VzZXJpbmZvJzogJycsCisgICAgICAgICAgICAndXNlcm5hbWUnOiAnJywKKyAgICAgICAgICAgICdwYXNzd29yZCc6ICcnLAorICAgICAgICAgICAgJ3BhcmFtcyc6IHt9LAorICAgICAgICAgICAgJ3F1ZXJ5Jzoge30sCisgICAgICAgICAgICAncmVsYXRpdmUnOiBGYWxzZQorICAgICAgICB9LAorICAgICAgICAiY3ZzOi8vYW5vbmN2c0BjdnMuaGFuZGhlbGRzLm9yZy9jdnM7bW9kdWxlPWZhbWlsaWFyL2Rpc3QvaXBrZyIgOiB7CisgICAgICAgICAgICAndXJpJzogJ2N2czovL2Fub25jdnNAY3ZzLmhhbmRoZWxkcy5vcmcvY3ZzO21vZHVsZT1mYW1pbGlhci9kaXN0L2lwa2cnLAorICAgICAgICAgICAgJ3NjaGVtZSc6ICdjdnMnLAorICAgICAgICAgICAgJ2hvc3RuYW1lJzogJ2N2cy5oYW5kaGVsZHMub3JnJywKKyAgICAgICAgICAgICdwb3J0JzogTm9uZSwKKyAgICAgICAgICAgICdob3N0cG9ydCc6ICdjdnMuaGFuZGhlbGRzLm9yZycsCisgICAgICAgICAgICAncGF0aCc6ICcvY3ZzJywKKyAgICAgICAgICAgICd1c2VyaW5mbyc6ICdhbm9uY3ZzJywKKyAgICAgICAgICAgICd1c2VybmFtZSc6ICdhbm9uY3ZzJywKKyAgICAgICAgICAgICdwYXNzd29yZCc6ICcnLAorICAgICAgICAgICAgJ3BhcmFtcyc6IHsKKyAgICAgICAgICAgICAgICAnbW9kdWxlJzogJ2ZhbWlsaWFyL2Rpc3QvaXBrZycKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAncXVlcnknOiB7fSwKKyAgICAgICAgICAgICdyZWxhdGl2ZSc6IEZhbHNlCisgICAgICAgIH0sCisgICAgICAgICJjdnM6Ly9hbm9uY3ZzOmFub255bW91c0BjdnMuaGFuZGhlbGRzLm9yZy9jdnM7dGFnPVYwLTk5LTgxO21vZHVsZT1mYW1pbGlhci9kaXN0L2lwa2ciOiB7CisgICAgICAgICAgICAndXJpJzogJ2N2czovL2Fub25jdnM6YW5vbnltb3VzQGN2cy5oYW5kaGVsZHMub3JnL2N2czt0YWc9VjAtOTktODE7bW9kdWxlPWZhbWlsaWFyL2Rpc3QvaXBrZycsCisgICAgICAgICAgICAnc2NoZW1lJzogJ2N2cycsCisgICAgICAgICAgICAnaG9zdG5hbWUnOiAnY3ZzLmhhbmRoZWxkcy5vcmcnLAorICAgICAgICAgICAgJ3BvcnQnOiBOb25lLAorICAgICAgICAgICAgJ2hvc3Rwb3J0JzogJ2N2cy5oYW5kaGVsZHMub3JnJywKKyAgICAgICAgICAgICdwYXRoJzogJy9jdnMnLAorICAgICAgICAgICAgJ3VzZXJpbmZvJzogJ2Fub25jdnM6YW5vbnltb3VzJywKKyAgICAgICAgICAgICd1c2VybmFtZSc6ICdhbm9uY3ZzJywKKyAgICAgICAgICAgICdwYXNzd29yZCc6ICdhbm9ueW1vdXMnLAorICAgICAgICAgICAgJ3BhcmFtcyc6IHsKKyAgICAgICAgICAgICAgICAndGFnJzogJ1YwLTk5LTgxJywKKyAgICAgICAgICAgICAgICAnbW9kdWxlJzogJ2ZhbWlsaWFyL2Rpc3QvaXBrZycKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAncXVlcnknOiB7fSwKKyAgICAgICAgICAgICdyZWxhdGl2ZSc6IEZhbHNlCisgICAgICAgIH0sCisgICAgICAgICJmaWxlOi8vZXhhbXBsZS5kaWZmIjogeyAjIE5PVEU6IE5vdCBSRkMgY29tcGxpYW50IQorICAgICAgICAgICAgJ3VyaSc6ICdmaWxlOmV4YW1wbGUuZGlmZicsCisgICAgICAgICAgICAnc2NoZW1lJzogJ2ZpbGUnLAorICAgICAgICAgICAgJ2hvc3RuYW1lJzogJycsCisgICAgICAgICAgICAncG9ydCc6IE5vbmUsCisgICAgICAgICAgICAnaG9zdHBvcnQnOiAnJywKKyAgICAgICAgICAgICdwYXRoJzogJ2V4YW1wbGUuZGlmZicsCisgICAgICAgICAgICAndXNlcmluZm8nOiAnJywKKyAgICAgICAgICAgICd1c2VybmFtZSc6ICcnLAorICAgICAgICAgICAgJ3Bhc3N3b3JkJzogJycsCisgICAgICAgICAgICAncGFyYW1zJzoge30sCisgICAgICAgICAgICAncXVlcnknOiB7fSwKKyAgICAgICAgICAgICdyZWxhdGl2ZSc6IFRydWUKKyAgICAgICAgfSwKKyAgICAgICAgImZpbGU6ZXhhbXBsZS5kaWZmIjogeyAjIE5PVEU6IFJGQyBjb21wbGlhbnQgdmVyc2lvbiBvZiB0aGUgZm9ybWVyCisgICAgICAgICAgICAndXJpJzogJ2ZpbGU6ZXhhbXBsZS5kaWZmJywKKyAgICAgICAgICAgICdzY2hlbWUnOiAnZmlsZScsCisgICAgICAgICAgICAnaG9zdG5hbWUnOiAnJywKKyAgICAgICAgICAgICdwb3J0JzogTm9uZSwKKyAgICAgICAgICAgICdob3N0cG9ydCc6ICcnLAorICAgICAgICAgICAgJ3BhdGgnOiAnZXhhbXBsZS5kaWZmJywKKyAgICAgICAgICAgICd1c2VyaW5mbyc6ICcnLAorICAgICAgICAgICAgJ3VzZXJpbmZvJzogJycsCisgICAgICAgICAgICAndXNlcm5hbWUnOiAnJywKKyAgICAgICAgICAgICdwYXNzd29yZCc6ICcnLAorICAgICAgICAgICAgJ3BhcmFtcyc6IHt9LAorICAgICAgICAgICAgJ3F1ZXJ5Jzoge30sCisgICAgICAgICAgICAncmVsYXRpdmUnOiBUcnVlCisgICAgICAgIH0sCisgICAgICAgICJmaWxlOi8vL3RtcC9leGFtcGxlLmRpZmYiOiB7CisgICAgICAgICAgICAndXJpJzogJ2ZpbGU6Ly8vdG1wL2V4YW1wbGUuZGlmZicsCisgICAgICAgICAgICAnc2NoZW1lJzogJ2ZpbGUnLAorICAgICAgICAgICAgJ2hvc3RuYW1lJzogJycsCisgICAgICAgICAgICAncG9ydCc6IE5vbmUsCisgICAgICAgICAgICAnaG9zdHBvcnQnOiAnJywKKyAgICAgICAgICAgICdwYXRoJzogJy90bXAvZXhhbXBsZS5kaWZmJywKKyAgICAgICAgICAgICd1c2VyaW5mbyc6ICcnLAorICAgICAgICAgICAgJ3VzZXJpbmZvJzogJycsCisgICAgICAgICAgICAndXNlcm5hbWUnOiAnJywKKyAgICAgICAgICAgICdwYXNzd29yZCc6ICcnLAorICAgICAgICAgICAgJ3BhcmFtcyc6IHt9LAorICAgICAgICAgICAgJ3F1ZXJ5Jzoge30sCisgICAgICAgICAgICAncmVsYXRpdmUnOiBGYWxzZQorICAgICAgICB9LAorICAgICAgICAiZ2l0Oi8vL3BhdGgvZXhhbXBsZS5naXQiOiB7CisgICAgICAgICAgICAndXJpJzogJ2dpdDovLy9wYXRoL2V4YW1wbGUuZ2l0JywKKyAgICAgICAgICAgICdzY2hlbWUnOiAnZ2l0JywKKyAgICAgICAgICAgICdob3N0bmFtZSc6ICcnLAorICAgICAgICAgICAgJ3BvcnQnOiBOb25lLAorICAgICAgICAgICAgJ2hvc3Rwb3J0JzogJycsCisgICAgICAgICAgICAncGF0aCc6ICcvcGF0aC9leGFtcGxlLmdpdCcsCisgICAgICAgICAgICAndXNlcmluZm8nOiAnJywKKyAgICAgICAgICAgICd1c2VyaW5mbyc6ICcnLAorICAgICAgICAgICAgJ3VzZXJuYW1lJzogJycsCisgICAgICAgICAgICAncGFzc3dvcmQnOiAnJywKKyAgICAgICAgICAgICdwYXJhbXMnOiB7fSwKKyAgICAgICAgICAgICdxdWVyeSc6IHt9LAorICAgICAgICAgICAgJ3JlbGF0aXZlJzogRmFsc2UKKyAgICAgICAgfSwKKyAgICAgICAgImdpdDpwYXRoL2V4YW1wbGUuZ2l0IjogeworICAgICAgICAgICAgJ3VyaSc6ICdnaXQ6cGF0aC9leGFtcGxlLmdpdCcsCisgICAgICAgICAgICAnc2NoZW1lJzogJ2dpdCcsCisgICAgICAgICAgICAnaG9zdG5hbWUnOiAnJywKKyAgICAgICAgICAgICdwb3J0JzogTm9uZSwKKyAgICAgICAgICAgICdob3N0cG9ydCc6ICcnLAorICAgICAgICAgICAgJ3BhdGgnOiAncGF0aC9leGFtcGxlLmdpdCcsCisgICAgICAgICAgICAndXNlcmluZm8nOiAnJywKKyAgICAgICAgICAgICd1c2VyaW5mbyc6ICcnLAorICAgICAgICAgICAgJ3VzZXJuYW1lJzogJycsCisgICAgICAgICAgICAncGFzc3dvcmQnOiAnJywKKyAgICAgICAgICAgICdwYXJhbXMnOiB7fSwKKyAgICAgICAgICAgICdxdWVyeSc6IHt9LAorICAgICAgICAgICAgJ3JlbGF0aXZlJzogVHJ1ZQorICAgICAgICB9LAorICAgICAgICAiZ2l0Oi8vZXhhbXBsZS5uZXQvcGF0aC9leGFtcGxlLmdpdCI6IHsKKyAgICAgICAgICAgICd1cmknOiAnZ2l0Oi8vZXhhbXBsZS5uZXQvcGF0aC9leGFtcGxlLmdpdCcsCisgICAgICAgICAgICAnc2NoZW1lJzogJ2dpdCcsCisgICAgICAgICAgICAnaG9zdG5hbWUnOiAnZXhhbXBsZS5uZXQnLAorICAgICAgICAgICAgJ3BvcnQnOiBOb25lLAorICAgICAgICAgICAgJ2hvc3Rwb3J0JzogJ2V4YW1wbGUubmV0JywKKyAgICAgICAgICAgICdwYXRoJzogJy9wYXRoL2V4YW1wbGUuZ2l0JywKKyAgICAgICAgICAgICd1c2VyaW5mbyc6ICcnLAorICAgICAgICAgICAgJ3VzZXJpbmZvJzogJycsCisgICAgICAgICAgICAndXNlcm5hbWUnOiAnJywKKyAgICAgICAgICAgICdwYXNzd29yZCc6ICcnLAorICAgICAgICAgICAgJ3BhcmFtcyc6IHt9LAorICAgICAgICAgICAgJ3F1ZXJ5Jzoge30sCisgICAgICAgICAgICAncmVsYXRpdmUnOiBGYWxzZQorICAgICAgICB9CisgICAgfQorCisgICAgZGVmIHRlc3RfdXJpKHNlbGYpOgorICAgICAgICBmb3IgdGVzdF91cmksIHJlZiBpbiBzZWxmLnRlc3RfdXJpcy5pdGVtcygpOgorICAgICAgICAgICAgdXJpID0gVVJJKHRlc3RfdXJpKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih1cmkpLCByZWZbJ3VyaSddKQorCisgICAgICAgICAgICAjIGV4cGVjdGVkIGF0dHJpYnV0ZXMKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJpLnNjaGVtZSwgcmVmWydzY2hlbWUnXSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmkudXNlcmluZm8sIHJlZlsndXNlcmluZm8nXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJpLnVzZXJuYW1lLCByZWZbJ3VzZXJuYW1lJ10pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVyaS5wYXNzd29yZCwgcmVmWydwYXNzd29yZCddKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVyaS5ob3N0bmFtZSwgcmVmWydob3N0bmFtZSddKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmkucG9ydCwgcmVmWydwb3J0J10pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVyaS5ob3N0cG9ydCwgcmVmWydob3N0cG9ydCddKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVyaS5wYXRoLCByZWZbJ3BhdGgnXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJpLnBhcmFtcywgcmVmWydwYXJhbXMnXSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmkucmVsYXRpdmUsIHJlZlsncmVsYXRpdmUnXSkKKworICAgIGRlZiB0ZXN0X2RpY3Qoc2VsZik6CisgICAgICAgIGZvciB0ZXN0IGluIHNlbGYudGVzdF91cmlzLnZhbHVlcygpOgorICAgICAgICAgICAgdXJpID0gVVJJKCkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmkuc2NoZW1lLCAnJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJpLnVzZXJpbmZvLCAnJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJpLnVzZXJuYW1lLCAnJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJpLnBhc3N3b3JkLCAnJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJpLmhvc3RuYW1lLCAnJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJpLnBvcnQsIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVyaS5wYXRoLCAnJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJpLnBhcmFtcywge30pCisKKworICAgICAgICAgICAgdXJpLnNjaGVtZSA9IHRlc3RbJ3NjaGVtZSddCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVyaS5zY2hlbWUsIHRlc3RbJ3NjaGVtZSddKQorCisgICAgICAgICAgICB1cmkudXNlcmluZm8gPSB0ZXN0Wyd1c2VyaW5mbyddCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVyaS51c2VyaW5mbywgdGVzdFsndXNlcmluZm8nXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJpLnVzZXJuYW1lLCB0ZXN0Wyd1c2VybmFtZSddKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmkucGFzc3dvcmQsIHRlc3RbJ3Bhc3N3b3JkJ10pCisKKyAgICAgICAgICAgICMgbWFrZSBzdXJlIGNoYW5naW5nIHRoZSB2YWx1ZXMgZG9lc24ndCBkbyBhbnl0aGluZyB1bmV4cGVjdGVkCisgICAgICAgICAgICB1cmkudXNlcm5hbWUgPSAnY2hhbmdlbWUnCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVyaS51c2VybmFtZSwgJ2NoYW5nZW1lJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJpLnBhc3N3b3JkLCB0ZXN0WydwYXNzd29yZCddKQorICAgICAgICAgICAgdXJpLnBhc3N3b3JkID0gJ2luc2VjdXJlJworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmkudXNlcm5hbWUsICdjaGFuZ2VtZScpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVyaS5wYXNzd29yZCwgJ2luc2VjdXJlJykKKworICAgICAgICAgICAgIyByZXNldCBiYWNrIGFmdGVyIG91ciB0cmlja2VyeQorICAgICAgICAgICAgdXJpLnVzZXJpbmZvID0gdGVzdFsndXNlcmluZm8nXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmkudXNlcmluZm8sIHRlc3RbJ3VzZXJpbmZvJ10pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVyaS51c2VybmFtZSwgdGVzdFsndXNlcm5hbWUnXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJpLnBhc3N3b3JkLCB0ZXN0WydwYXNzd29yZCddKQorCisgICAgICAgICAgICB1cmkuaG9zdG5hbWUgPSB0ZXN0Wydob3N0bmFtZSddCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVyaS5ob3N0bmFtZSwgdGVzdFsnaG9zdG5hbWUnXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJpLmhvc3Rwb3J0LCB0ZXN0Wydob3N0bmFtZSddKQorCisgICAgICAgICAgICB1cmkucG9ydCA9IHRlc3RbJ3BvcnQnXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmkucG9ydCwgdGVzdFsncG9ydCddKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmkuaG9zdHBvcnQsIHRlc3RbJ2hvc3Rwb3J0J10pCisKKyAgICAgICAgICAgIHVyaS5wYXRoID0gdGVzdFsncGF0aCddCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVyaS5wYXRoLCB0ZXN0WydwYXRoJ10pCisKKyAgICAgICAgICAgIHVyaS5wYXJhbXMgPSB0ZXN0WydwYXJhbXMnXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmkucGFyYW1zLCB0ZXN0WydwYXJhbXMnXSkKKworICAgICAgICAgICAgdXJpLnF1ZXJ5ID0gdGVzdFsncXVlcnknXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmkucXVlcnksIHRlc3RbJ3F1ZXJ5J10pCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHVyaSksIHRlc3RbJ3VyaSddKQorCisgICAgICAgICAgICB1cmkucGFyYW1zID0ge30KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJpLnBhcmFtcywge30pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih1cmkpLCAoc3RyKHVyaSkuc3BsaXQoIjsiKSlbMF0pCisKK2NsYXNzIEZldGNoZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5vcmlnZGlyID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgc2VsZi5kID0gYmIuZGF0YS5pbml0KCkKKyAgICAgICAgc2VsZi50ZW1wZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCisgICAgICAgIHNlbGYuZGxkaXIgPSBvcy5wYXRoLmpvaW4oc2VsZi50ZW1wZGlyLCAiZG93bmxvYWQiKQorICAgICAgICBvcy5ta2RpcihzZWxmLmRsZGlyKQorICAgICAgICBzZWxmLmQuc2V0VmFyKCJETF9ESVIiLCBzZWxmLmRsZGlyKQorICAgICAgICBzZWxmLnVucGFja2RpciA9IG9zLnBhdGguam9pbihzZWxmLnRlbXBkaXIsICJ1bnBhY2tlZCIpCisgICAgICAgIG9zLm1rZGlyKHNlbGYudW5wYWNrZGlyKQorICAgICAgICBwZXJzaXN0ZGlyID0gb3MucGF0aC5qb2luKHNlbGYudGVtcGRpciwgInBlcnNpc3RkYXRhIikKKyAgICAgICAgc2VsZi5kLnNldFZhcigiUEVSU0lTVEVOVF9ESVIiLCBwZXJzaXN0ZGlyKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBvcy5jaGRpcihzZWxmLm9yaWdkaXIpCisgICAgICAgIGJiLnV0aWxzLnBydW5lZGlyKHNlbGYudGVtcGRpcikKKworY2xhc3MgTWlycm9yVXJpVGVzdChGZXRjaGVyVGVzdCk6CisKKyAgICByZXBsYWNldXJpcyA9IHsKKyAgICAgICAgKCJnaXQ6Ly9naXQuaW52YWxpZC5pbmZyYWRlYWQub3JnL210ZC11dGlscy5naXQ7dGFnPTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiLCAiZ2l0Oi8vLiovLioiLCAiaHR0cDovL3NvbWV3aGVyZS5vcmcvc29tZWRpci8iKSAKKyAgICAgICAgICAgIDogImh0dHA6Ly9zb21ld2hlcmUub3JnL3NvbWVkaXIvZ2l0Ml9naXQuaW52YWxpZC5pbmZyYWRlYWQub3JnLm10ZC11dGlscy5naXQudGFyLmd6IiwKKyAgICAgICAgKCJnaXQ6Ly9naXQuaW52YWxpZC5pbmZyYWRlYWQub3JnL210ZC11dGlscy5naXQ7dGFnPTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiLCAiZ2l0Oi8vLiovKFteL10rLykqKFteL10qKSIsICJnaXQ6Ly9zb21ld2hlcmUub3JnL3NvbWVkaXIvXFwyO3Byb3RvY29sPWh0dHAiKSAKKyAgICAgICAgICAgIDogImdpdDovL3NvbWV3aGVyZS5vcmcvc29tZWRpci9tdGQtdXRpbHMuZ2l0O3RhZz0xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwO3Byb3RvY29sPWh0dHAiLCAKKyAgICAgICAgKCJnaXQ6Ly9naXQuaW52YWxpZC5pbmZyYWRlYWQub3JnL2Zvby9tdGQtdXRpbHMuZ2l0O3RhZz0xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiwgImdpdDovLy4qLyhbXi9dKy8pKihbXi9dKikiLCAiZ2l0Oi8vc29tZXdoZXJlLm9yZy9zb21lZGlyL1xcMjtwcm90b2NvbD1odHRwIikgCisgICAgICAgICAgICA6ICJnaXQ6Ly9zb21ld2hlcmUub3JnL3NvbWVkaXIvbXRkLXV0aWxzLmdpdDt0YWc9MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDtwcm90b2NvbD1odHRwIiwgCisgICAgICAgICgiZ2l0Oi8vZ2l0LmludmFsaWQuaW5mcmFkZWFkLm9yZy9mb28vbXRkLXV0aWxzLmdpdDt0YWc9MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIsICJnaXQ6Ly8uKi8oW14vXSsvKSooW14vXSopIiwgImdpdDovL3NvbWV3aGVyZS5vcmcvXFwyO3Byb3RvY29sPWh0dHAiKSAKKyAgICAgICAgICAgIDogImdpdDovL3NvbWV3aGVyZS5vcmcvbXRkLXV0aWxzLmdpdDt0YWc9MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDtwcm90b2NvbD1odHRwIiwgCisgICAgICAgICgiZ2l0Oi8vc29tZXNlcnZlci5vcmcvYml0YmFrZTt0YWc9MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIsICJnaXQ6Ly9zb21lc2VydmVyLm9yZy9iaXRiYWtlIiwgImdpdDovL2dpdC5vcGVuZW1iZWRkZWQub3JnL2JpdGJha2UiKQorICAgICAgICAgICAgOiAiZ2l0Oi8vZ2l0Lm9wZW5lbWJlZGRlZC5vcmcvYml0YmFrZTt0YWc9MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIsCisgICAgICAgICgiZmlsZTovL3NzdGF0ZS14eXoudGd6IiwgImZpbGU6Ly8uKiIsICJmaWxlOi8vL3NvbWV3aGVyZS8xMjM0L3NzdGF0ZS1jYWNoZSIpIAorICAgICAgICAgICAgOiAiZmlsZTovLy9zb21ld2hlcmUvMTIzNC9zc3RhdGUtY2FjaGUvc3N0YXRlLXh5ei50Z3oiLAorICAgICAgICAoImZpbGU6Ly9zc3RhdGUteHl6LnRneiIsICJmaWxlOi8vLioiLCAiZmlsZTovLy9zb21ld2hlcmUvMTIzNC9zc3RhdGUtY2FjaGUvIikgCisgICAgICAgICAgICA6ICJmaWxlOi8vL3NvbWV3aGVyZS8xMjM0L3NzdGF0ZS1jYWNoZS9zc3RhdGUteHl6LnRneiIsCisgICAgICAgICgiaHR0cDovL3NvbWV3aGVyZS5vcmcvc29tZWRpcjEvc29tZWRpcjIvc29tZWZpbGVfMS4yLjMudGFyLmd6IiwgImh0dHA6Ly8uKi8uKiIsICJodHRwOi8vc29tZXdoZXJlMi5vcmcvc29tZWRpcjMiKSAKKyAgICAgICAgICAgIDogImh0dHA6Ly9zb21ld2hlcmUyLm9yZy9zb21lZGlyMy9zb21lZmlsZV8xLjIuMy50YXIuZ3oiLAorICAgICAgICAoImh0dHA6Ly9zb21ld2hlcmUub3JnL3NvbWVkaXIxL3NvbWVmaWxlXzEuMi4zLnRhci5neiIsICJodHRwOi8vc29tZXdoZXJlLm9yZy9zb21lZGlyMS9zb21lZmlsZV8xLjIuMy50YXIuZ3oiLCAiaHR0cDovL3NvbWV3aGVyZTIub3JnL3NvbWVkaXIzL3NvbWVmaWxlXzEuMi4zLnRhci5neiIpIAorICAgICAgICAgICAgOiAiaHR0cDovL3NvbWV3aGVyZTIub3JnL3NvbWVkaXIzL3NvbWVmaWxlXzEuMi4zLnRhci5neiIsCisgICAgICAgICgiaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvc3VidmVyc2lvbi9zdWJ2ZXJzaW9uLTEuNy4xLnRhci5iejIiLCAiaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QiLCAiaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0IikKKyAgICAgICAgICAgIDogImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC9zdWJ2ZXJzaW9uL3N1YnZlcnNpb24tMS43LjEudGFyLmJ6MiIsCisgICAgICAgICgiaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvc3VidmVyc2lvbi9zdWJ2ZXJzaW9uLTEuNy4xLnRhci5iejIiLCAiaHR0cDovLy4qLy4qIiwgImZpbGU6Ly8vc29tZXBhdGgvZG93bmxvYWRzLyIpCisgICAgICAgICAgICA6ICJmaWxlOi8vL3NvbWVwYXRoL2Rvd25sb2Fkcy9zdWJ2ZXJzaW9uLTEuNy4xLnRhci5iejIiLAorICAgICAgICAoImdpdDovL2dpdC5pbnZhbGlkLmluZnJhZGVhZC5vcmcvbXRkLXV0aWxzLmdpdDt0YWc9MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIsICJnaXQ6Ly8uKi8uKiIsICJnaXQ6Ly9zb21ld2hlcmUub3JnL3NvbWVkaXIvQkFTRU5BTUU7cHJvdG9jb2w9aHR0cCIpIAorICAgICAgICAgICAgOiAiZ2l0Oi8vc29tZXdoZXJlLm9yZy9zb21lZGlyL210ZC11dGlscy5naXQ7dGFnPTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTA7cHJvdG9jb2w9aHR0cCIsIAorICAgICAgICAoImdpdDovL2dpdC5pbnZhbGlkLmluZnJhZGVhZC5vcmcvZm9vL210ZC11dGlscy5naXQ7dGFnPTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiLCAiZ2l0Oi8vLiovLioiLCAiZ2l0Oi8vc29tZXdoZXJlLm9yZy9zb21lZGlyL0JBU0VOQU1FO3Byb3RvY29sPWh0dHAiKSAKKyAgICAgICAgICAgIDogImdpdDovL3NvbWV3aGVyZS5vcmcvc29tZWRpci9tdGQtdXRpbHMuZ2l0O3RhZz0xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwO3Byb3RvY29sPWh0dHAiLCAKKyAgICAgICAgKCJnaXQ6Ly9naXQuaW52YWxpZC5pbmZyYWRlYWQub3JnL2Zvby9tdGQtdXRpbHMuZ2l0O3RhZz0xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiwgImdpdDovLy4qLy4qIiwgImdpdDovL3NvbWV3aGVyZS5vcmcvc29tZWRpci9NSVJST1JOQU1FO3Byb3RvY29sPWh0dHAiKSAKKyAgICAgICAgICAgIDogImdpdDovL3NvbWV3aGVyZS5vcmcvc29tZWRpci9naXQuaW52YWxpZC5pbmZyYWRlYWQub3JnLmZvby5tdGQtdXRpbHMuZ2l0O3RhZz0xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwO3Byb3RvY29sPWh0dHAiLCAKKworICAgICAgICAjUmVuYW1pbmcgZmlsZXMgZG9lc24ndCB3b3JrCisgICAgICAgICMoImh0dHA6Ly9zb21ld2hlcmUub3JnL3NvbWVkaXIxL3NvbWVmaWxlXzEuMi4zLnRhci5neiIsICJodHRwOi8vc29tZXdoZXJlLm9yZy9zb21lZGlyMS9zb21lZmlsZV8xLjIuMy50YXIuZ3oiLCAiaHR0cDovL3NvbWV3aGVyZTIub3JnL3NvbWVkaXIzL3NvbWVmaWxlXzIuMy40LnRhci5neiIpIDogImh0dHA6Ly9zb21ld2hlcmUyLm9yZy9zb21lZGlyMy9zb21lZmlsZV8yLjMuNC50YXIuZ3oiCisgICAgICAgICMoImZpbGU6Ly9zc3RhdGUteHl6LnRneiIsICJmaWxlOi8vLiovLioiLCAiZmlsZTovLy9zb21ld2hlcmUvMTIzNC9zc3RhdGUtY2FjaGUiKSA6ICJmaWxlOi8vL3NvbWV3aGVyZS8xMjM0L3NzdGF0ZS1jYWNoZS9zc3RhdGUteHl6LnRneiIsCisgICAgfQorCisgICAgbWlycm9ydmFyID0gImh0dHA6Ly8uKi8uKiBmaWxlOi8vL3NvbWVwYXRoL2Rvd25sb2Fkcy8gXG4iIFwKKyAgICAgICAgICAgICAgICAiZ2l0Oi8vc29tZXNlcnZlci5vcmcvYml0YmFrZSBnaXQ6Ly9naXQub3BlbmVtYmVkZGVkLm9yZy9iaXRiYWtlIFxuIiBcCisgICAgICAgICAgICAgICAgImh0dHBzOi8vLiovLiogZmlsZTovLy9zb21lb3RoZXJwYXRoL2Rvd25sb2Fkcy8gXG4iIFwKKyAgICAgICAgICAgICAgICAiaHR0cDovLy4qLy4qIGZpbGU6Ly8vc29tZW90aGVycGF0aC9kb3dubG9hZHMvIFxuIgorCisgICAgZGVmIHRlc3RfdXJpcmVwbGFjZShzZWxmKToKKyAgICAgICAgZm9yIGssIHYgaW4gc2VsZi5yZXBsYWNldXJpcy5pdGVtcygpOgorICAgICAgICAgICAgdWQgPSBiYi5mZXRjaC5GZXRjaERhdGEoa1swXSwgc2VsZi5kKQorICAgICAgICAgICAgdWQuc2V0dXBfbG9jYWxwYXRoKHNlbGYuZCkKKyAgICAgICAgICAgIG1pcnJvcnMgPSBiYi5mZXRjaDIubWlycm9yX2Zyb21fc3RyaW5nKCIlcyAlcyIgJSAoa1sxXSwga1syXSkpCisgICAgICAgICAgICBuZXd1cmlzLCB1ZHMgPSBiYi5mZXRjaDIuYnVpbGRfbWlycm9ydXJpcyh1ZCwgbWlycm9ycywgc2VsZi5kKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbdl0sIG5ld3VyaXMpCisKKyAgICBkZWYgdGVzdF91cmlsaXN0MShzZWxmKToKKyAgICAgICAgZmV0Y2hlciA9IGJiLmZldGNoLkZldGNoRGF0YSgiaHR0cDovL2Rvd25sb2Fkcy55b2N0b3Byb2plY3Qub3JnL3JlbGVhc2VzL2JpdGJha2UvYml0YmFrZS0xLjAudGFyLmd6Iiwgc2VsZi5kKQorICAgICAgICBtaXJyb3JzID0gYmIuZmV0Y2gyLm1pcnJvcl9mcm9tX3N0cmluZyhzZWxmLm1pcnJvcnZhcikKKyAgICAgICAgdXJpcywgdWRzID0gYmIuZmV0Y2gyLmJ1aWxkX21pcnJvcnVyaXMoZmV0Y2hlciwgbWlycm9ycywgc2VsZi5kKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVyaXMsIFsnZmlsZTovLy9zb21lcGF0aC9kb3dubG9hZHMvYml0YmFrZS0xLjAudGFyLmd6JywgJ2ZpbGU6Ly8vc29tZW90aGVycGF0aC9kb3dubG9hZHMvYml0YmFrZS0xLjAudGFyLmd6J10pCisKKyAgICBkZWYgdGVzdF91cmlsaXN0MihzZWxmKToKKyAgICAgICAgIyBDYXRjaCBodHRwczovLyAtPiBmaWxlczovLyBidWcKKyAgICAgICAgZmV0Y2hlciA9IGJiLmZldGNoLkZldGNoRGF0YSgiaHR0cHM6Ly9kb3dubG9hZHMueW9jdG9wcm9qZWN0Lm9yZy9yZWxlYXNlcy9iaXRiYWtlL2JpdGJha2UtMS4wLnRhci5neiIsIHNlbGYuZCkKKyAgICAgICAgbWlycm9ycyA9IGJiLmZldGNoMi5taXJyb3JfZnJvbV9zdHJpbmcoc2VsZi5taXJyb3J2YXIpCisgICAgICAgIHVyaXMsIHVkcyA9IGJiLmZldGNoMi5idWlsZF9taXJyb3J1cmlzKGZldGNoZXIsIG1pcnJvcnMsIHNlbGYuZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmlzLCBbJ2ZpbGU6Ly8vc29tZW90aGVycGF0aC9kb3dubG9hZHMvYml0YmFrZS0xLjAudGFyLmd6J10pCisKKyAgICBkZWYgdGVzdF9taXJyb3Jfb2ZfbWlycm9yKHNlbGYpOgorICAgICAgICAjIFRlc3QgaWYgbWlycm9yIG9mIGEgbWlycm9yIHdvcmtzCisgICAgICAgIG1pcnJvcnZhciA9IHNlbGYubWlycm9ydmFyICsgIiBodHRwOi8vLiovLiogaHR0cDovL290aGVyZG93bmxvYWRzLnlvY3RvcHJvamVjdC5vcmcvZG93bmxvYWRzLyBcbiIKKyAgICAgICAgbWlycm9ydmFyID0gbWlycm9ydmFyICsgIiBodHRwOi8vb3RoZXJkb3dubG9hZHMueW9jdG9wcm9qZWN0Lm9yZy8uKiBodHRwOi8vZG93bmxvYWRzMi55b2N0b3Byb2plY3Qub3JnL2Rvd25sb2Fkcy8gXG4iCisgICAgICAgIGZldGNoZXIgPSBiYi5mZXRjaC5GZXRjaERhdGEoImh0dHA6Ly9kb3dubG9hZHMueW9jdG9wcm9qZWN0Lm9yZy9yZWxlYXNlcy9iaXRiYWtlL2JpdGJha2UtMS4wLnRhci5neiIsIHNlbGYuZCkKKyAgICAgICAgbWlycm9ycyA9IGJiLmZldGNoMi5taXJyb3JfZnJvbV9zdHJpbmcobWlycm9ydmFyKQorICAgICAgICB1cmlzLCB1ZHMgPSBiYi5mZXRjaDIuYnVpbGRfbWlycm9ydXJpcyhmZXRjaGVyLCBtaXJyb3JzLCBzZWxmLmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJpcywgWydmaWxlOi8vL3NvbWVwYXRoL2Rvd25sb2Fkcy9iaXRiYWtlLTEuMC50YXIuZ3onLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbGU6Ly8vc29tZW90aGVycGF0aC9kb3dubG9hZHMvYml0YmFrZS0xLjAudGFyLmd6JywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdodHRwOi8vb3RoZXJkb3dubG9hZHMueW9jdG9wcm9qZWN0Lm9yZy9kb3dubG9hZHMvYml0YmFrZS0xLjAudGFyLmd6JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2h0dHA6Ly9kb3dubG9hZHMyLnlvY3RvcHJvamVjdC5vcmcvZG93bmxvYWRzL2JpdGJha2UtMS4wLnRhci5neiddKQorCisKK2NsYXNzIEZldGNoZXJMb2NhbFRlc3QoRmV0Y2hlclRlc3QpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgZGVmIHRvdWNoKGZuKToKKyAgICAgICAgICAgIHdpdGggZmlsZShmbiwgJ2EnKToKKyAgICAgICAgICAgICAgICBvcy51dGltZShmbiwgTm9uZSkKKworICAgICAgICBzdXBlcihGZXRjaGVyTG9jYWxUZXN0LCBzZWxmKS5zZXRVcCgpCisgICAgICAgIHNlbGYubG9jYWxzcmNkaXIgPSBvcy5wYXRoLmpvaW4oc2VsZi50ZW1wZGlyLCAnbG9jYWxzcmMnKQorICAgICAgICBvcy5tYWtlZGlycyhzZWxmLmxvY2Fsc3JjZGlyKQorICAgICAgICB0b3VjaChvcy5wYXRoLmpvaW4oc2VsZi5sb2NhbHNyY2RpciwgJ2EnKSkKKyAgICAgICAgdG91Y2gob3MucGF0aC5qb2luKHNlbGYubG9jYWxzcmNkaXIsICdiJykpCisgICAgICAgIG9zLm1ha2VkaXJzKG9zLnBhdGguam9pbihzZWxmLmxvY2Fsc3JjZGlyLCAnZGlyJykpCisgICAgICAgIHRvdWNoKG9zLnBhdGguam9pbihzZWxmLmxvY2Fsc3JjZGlyLCAnZGlyJywgJ2MnKSkKKyAgICAgICAgdG91Y2gob3MucGF0aC5qb2luKHNlbGYubG9jYWxzcmNkaXIsICdkaXInLCAnZCcpKQorICAgICAgICBvcy5tYWtlZGlycyhvcy5wYXRoLmpvaW4oc2VsZi5sb2NhbHNyY2RpciwgJ2RpcicsICdzdWJkaXInKSkKKyAgICAgICAgdG91Y2gob3MucGF0aC5qb2luKHNlbGYubG9jYWxzcmNkaXIsICdkaXInLCAnc3ViZGlyJywgJ2UnKSkKKyAgICAgICAgc2VsZi5kLnNldFZhcigiRklMRVNQQVRIIiwgc2VsZi5sb2NhbHNyY2RpcikKKworICAgIGRlZiBmZXRjaFVucGFjayhzZWxmLCB1cmlzKToKKyAgICAgICAgZmV0Y2hlciA9IGJiLmZldGNoLkZldGNoKHVyaXMsIHNlbGYuZCkKKyAgICAgICAgZmV0Y2hlci5kb3dubG9hZCgpCisgICAgICAgIGZldGNoZXIudW5wYWNrKHNlbGYudW5wYWNrZGlyKQorICAgICAgICBmbHN0ID0gW10KKyAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsoc2VsZi51bnBhY2tkaXIpOgorICAgICAgICAgICAgZm9yIGYgaW4gZmlsZXM6CisgICAgICAgICAgICAgICAgZmxzdC5hcHBlbmQob3MucGF0aC5yZWxwYXRoKG9zLnBhdGguam9pbihyb290LCBmKSwgc2VsZi51bnBhY2tkaXIpKQorICAgICAgICBmbHN0LnNvcnQoKQorICAgICAgICByZXR1cm4gZmxzdAorCisgICAgZGVmIHRlc3RfbG9jYWwoc2VsZik6CisgICAgICAgIHRyZWUgPSBzZWxmLmZldGNoVW5wYWNrKFsnZmlsZTovL2EnLCAnZmlsZTovL2Rpci9jJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHJlZSwgWydhJywgJ2Rpci9jJ10pCisKKyAgICBkZWYgdGVzdF9sb2NhbF93aWxkY2FyZChzZWxmKToKKyAgICAgICAgdHJlZSA9IHNlbGYuZmV0Y2hVbnBhY2soWydmaWxlOi8vYScsICdmaWxlOi8vZGlyLyonXSkKKyAgICAgICAgIyBGSVhNRTogdGhpcyBpcyBicm9rZW4gLSBpdCBzaG91bGQgcmV0dXJuIFsnYScsICdkaXIvYycsICdkaXIvZCcsICdkaXIvc3ViZGlyL2UnXQorICAgICAgICAjIHNlZSBodHRwczovL2J1Z3ppbGxhLnlvY3RvcHJvamVjdC5vcmcvc2hvd19idWcuY2dpP2lkPTYxMjgKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cmVlLCBbJ2EnLCAnYicsICdkaXIvYycsICdkaXIvZCcsICdkaXIvc3ViZGlyL2UnXSkKKworICAgIGRlZiB0ZXN0X2xvY2FsX2RpcihzZWxmKToKKyAgICAgICAgdHJlZSA9IHNlbGYuZmV0Y2hVbnBhY2soWydmaWxlOi8vYScsICdmaWxlOi8vZGlyJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHJlZSwgWydhJywgJ2Rpci9jJywgJ2Rpci9kJywgJ2Rpci9zdWJkaXIvZSddKQorCisgICAgZGVmIHRlc3RfbG9jYWxfc3ViZGlyKHNlbGYpOgorICAgICAgICB0cmVlID0gc2VsZi5mZXRjaFVucGFjayhbJ2ZpbGU6Ly9kaXIvc3ViZGlyJ10pCisgICAgICAgICMgRklYTUU6IHRoaXMgaXMgYnJva2VuIC0gaXQgc2hvdWxkIHJldHVybiBbJ2Rpci9zdWJkaXIvZSddCisgICAgICAgICMgc2VlIGh0dHBzOi8vYnVnemlsbGEueW9jdG9wcm9qZWN0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjEyOQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRyZWUsIFsnc3ViZGlyL2UnXSkKKworICAgIGRlZiB0ZXN0X2xvY2FsX3N1YmRpcl9maWxlKHNlbGYpOgorICAgICAgICB0cmVlID0gc2VsZi5mZXRjaFVucGFjayhbJ2ZpbGU6Ly9kaXIvc3ViZGlyL2UnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cmVlLCBbJ2Rpci9zdWJkaXIvZSddKQorCisgICAgZGVmIHRlc3RfbG9jYWxfc3ViZGlycGFyYW0oc2VsZik6CisgICAgICAgIHRyZWUgPSBzZWxmLmZldGNoVW5wYWNrKFsnZmlsZTovL2E7c3ViZGlyPWJhciddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRyZWUsIFsnYmFyL2EnXSkKKworICAgIGRlZiB0ZXN0X2xvY2FsX2RlZXBzdWJkaXJwYXJhbShzZWxmKToKKyAgICAgICAgdHJlZSA9IHNlbGYuZmV0Y2hVbnBhY2soWydmaWxlOi8vZGlyL3N1YmRpci9lO3N1YmRpcj1iYXInXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cmVlLCBbJ2Jhci9kaXIvc3ViZGlyL2UnXSkKKworY2xhc3MgRmV0Y2hlck5ldHdvcmtUZXN0KEZldGNoZXJUZXN0KToKKworICAgIGlmIG9zLmVudmlyb24uZ2V0KCJCQl9TS0lQX05FVFRFU1RTIikgPT0gInllcyI6CisgICAgICAgIHByaW50KCJVbnNldCBCQl9TS0lQX05FVFRFU1RTIHRvIHJ1biBuZXR3b3JrIHRlc3RzIikKKyAgICBlbHNlOgorICAgICAgICBkZWYgdGVzdF9mZXRjaChzZWxmKToKKyAgICAgICAgICAgIGZldGNoZXIgPSBiYi5mZXRjaC5GZXRjaChbImh0dHA6Ly9kb3dubG9hZHMueW9jdG9wcm9qZWN0Lm9yZy9yZWxlYXNlcy9iaXRiYWtlL2JpdGJha2UtMS4wLnRhci5neiIsICJodHRwOi8vZG93bmxvYWRzLnlvY3RvcHJvamVjdC5vcmcvcmVsZWFzZXMvYml0YmFrZS9iaXRiYWtlLTEuMS50YXIuZ3oiXSwgc2VsZi5kKQorICAgICAgICAgICAgZmV0Y2hlci5kb3dubG9hZCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnBhdGguZ2V0c2l6ZShzZWxmLmRsZGlyICsgIi9iaXRiYWtlLTEuMC50YXIuZ3oiKSwgNTc3NDkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnBhdGguZ2V0c2l6ZShzZWxmLmRsZGlyICsgIi9iaXRiYWtlLTEuMS50YXIuZ3oiKSwgNTc4OTIpCisgICAgICAgICAgICBzZWxmLmQuc2V0VmFyKCJCQl9OT19ORVRXT1JLIiwgIjEiKQorICAgICAgICAgICAgZmV0Y2hlciA9IGJiLmZldGNoLkZldGNoKFsiaHR0cDovL2Rvd25sb2Fkcy55b2N0b3Byb2plY3Qub3JnL3JlbGVhc2VzL2JpdGJha2UvYml0YmFrZS0xLjAudGFyLmd6IiwgImh0dHA6Ly9kb3dubG9hZHMueW9jdG9wcm9qZWN0Lm9yZy9yZWxlYXNlcy9iaXRiYWtlL2JpdGJha2UtMS4xLnRhci5neiJdLCBzZWxmLmQpCisgICAgICAgICAgICBmZXRjaGVyLmRvd25sb2FkKCkKKyAgICAgICAgICAgIGZldGNoZXIudW5wYWNrKHNlbGYudW5wYWNrZGlyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ob3MubGlzdGRpcihzZWxmLnVucGFja2RpciArICIvYml0YmFrZS0xLjAvIikpLCA5KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ob3MubGlzdGRpcihzZWxmLnVucGFja2RpciArICIvYml0YmFrZS0xLjEvIikpLCA5KQorCisgICAgICAgIGRlZiB0ZXN0X2ZldGNoX21pcnJvcihzZWxmKToKKyAgICAgICAgICAgIHNlbGYuZC5zZXRWYXIoIk1JUlJPUlMiLCAiaHR0cDovLy4qLy4qIGh0dHA6Ly9kb3dubG9hZHMueW9jdG9wcm9qZWN0Lm9yZy9yZWxlYXNlcy9iaXRiYWtlIikKKyAgICAgICAgICAgIGZldGNoZXIgPSBiYi5mZXRjaC5GZXRjaChbImh0dHA6Ly9pbnZhbGlkLnlvY3RvcHJvamVjdC5vcmcvcmVsZWFzZXMvYml0YmFrZS9iaXRiYWtlLTEuMC50YXIuZ3oiXSwgc2VsZi5kKQorICAgICAgICAgICAgZmV0Y2hlci5kb3dubG9hZCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnBhdGguZ2V0c2l6ZShzZWxmLmRsZGlyICsgIi9iaXRiYWtlLTEuMC50YXIuZ3oiKSwgNTc3NDkpCisKKyAgICAgICAgZGVmIHRlc3RfZmV0Y2hfbWlycm9yX29mX21pcnJvcihzZWxmKToKKyAgICAgICAgICAgIHNlbGYuZC5zZXRWYXIoIk1JUlJPUlMiLCAiaHR0cDovLy4qLy4qIGh0dHA6Ly9pbnZhbGlkMi55b2N0b3Byb2plY3Qub3JnLyBcbiBodHRwOi8vaW52YWxpZDIueW9jdG9wcm9qZWN0Lm9yZy8uKiBodHRwOi8vZG93bmxvYWRzLnlvY3RvcHJvamVjdC5vcmcvcmVsZWFzZXMvYml0YmFrZSIpCisgICAgICAgICAgICBmZXRjaGVyID0gYmIuZmV0Y2guRmV0Y2goWyJodHRwOi8vaW52YWxpZC55b2N0b3Byb2plY3Qub3JnL3JlbGVhc2VzL2JpdGJha2UvYml0YmFrZS0xLjAudGFyLmd6Il0sIHNlbGYuZCkKKyAgICAgICAgICAgIGZldGNoZXIuZG93bmxvYWQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5wYXRoLmdldHNpemUoc2VsZi5kbGRpciArICIvYml0YmFrZS0xLjAudGFyLmd6IiksIDU3NzQ5KQorCisgICAgICAgIGRlZiB0ZXN0X2ZldGNoX2ZpbGVfbWlycm9yX29mX21pcnJvcihzZWxmKToKKyAgICAgICAgICAgIHNlbGYuZC5zZXRWYXIoIk1JUlJPUlMiLCAiaHR0cDovLy4qLy4qIGZpbGU6Ly8vc29tZTF3aGVyZS8gXG4gZmlsZTovLy9zb21lMXdoZXJlLy4qIGZpbGU6Ly9zb21lMndoZXJlLyBcbiBmaWxlOi8vc29tZTJ3aGVyZS8uKiBodHRwOi8vZG93bmxvYWRzLnlvY3RvcHJvamVjdC5vcmcvcmVsZWFzZXMvYml0YmFrZSIpCisgICAgICAgICAgICBmZXRjaGVyID0gYmIuZmV0Y2guRmV0Y2goWyJodHRwOi8vaW52YWxpZC55b2N0b3Byb2plY3Qub3JnL3JlbGVhc2VzL2JpdGJha2UvYml0YmFrZS0xLjAudGFyLmd6Il0sIHNlbGYuZCkKKyAgICAgICAgICAgIG9zLm1rZGlyKHNlbGYuZGxkaXIgKyAiL3NvbWUyd2hlcmUiKQorICAgICAgICAgICAgZmV0Y2hlci5kb3dubG9hZCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnBhdGguZ2V0c2l6ZShzZWxmLmRsZGlyICsgIi9iaXRiYWtlLTEuMC50YXIuZ3oiKSwgNTc3NDkpCisKKyAgICAgICAgZGVmIHRlc3RfZmV0Y2hfcHJlbWlycm9yKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5kLnNldFZhcigiUFJFTUlSUk9SUyIsICJodHRwOi8vLiovLiogaHR0cDovL2Rvd25sb2Fkcy55b2N0b3Byb2plY3Qub3JnL3JlbGVhc2VzL2JpdGJha2UiKQorICAgICAgICAgICAgZmV0Y2hlciA9IGJiLmZldGNoLkZldGNoKFsiaHR0cDovL2ludmFsaWQueW9jdG9wcm9qZWN0Lm9yZy9yZWxlYXNlcy9iaXRiYWtlL2JpdGJha2UtMS4wLnRhci5neiJdLCBzZWxmLmQpCisgICAgICAgICAgICBmZXRjaGVyLmRvd25sb2FkKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MucGF0aC5nZXRzaXplKHNlbGYuZGxkaXIgKyAiL2JpdGJha2UtMS4wLnRhci5neiIpLCA1Nzc0OSkKKworICAgICAgICBkZWYgZ2l0ZmV0Y2hlcihzZWxmLCB1cmwxLCB1cmwyKToKKyAgICAgICAgICAgIGRlZiBjaGVja3JldmlzaW9uKHNlbGYsIGZldGNoZXIpOgorICAgICAgICAgICAgICAgIGZldGNoZXIudW5wYWNrKHNlbGYudW5wYWNrZGlyKQorICAgICAgICAgICAgICAgIHJldmlzaW9uID0gYmIucHJvY2Vzcy5ydW4oImdpdCByZXYtcGFyc2UgSEVBRCIsIHNoZWxsPVRydWUsIGN3ZD1zZWxmLnVucGFja2RpciArICIvZ2l0IilbMF0uc3RyaXAoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmV2aXNpb24sICIyNzBhMDViMGI0YmEwOTU5ZmUwNjI0ZDJhNDg4NWQ3YjcwNDI2ZGE1IikKKworICAgICAgICAgICAgc2VsZi5kLnNldFZhcigiQkJfR0VORVJBVEVfTUlSUk9SX1RBUkJBTExTIiwgIjEiKQorICAgICAgICAgICAgc2VsZi5kLnNldFZhcigiU1JDUkVWIiwgIjI3MGEwNWIwYjRiYTA5NTlmZTA2MjRkMmE0ODg1ZDdiNzA0MjZkYTUiKQorICAgICAgICAgICAgZmV0Y2hlciA9IGJiLmZldGNoLkZldGNoKFt1cmwxXSwgc2VsZi5kKQorICAgICAgICAgICAgZmV0Y2hlci5kb3dubG9hZCgpCisgICAgICAgICAgICBjaGVja3JldmlzaW9uKHNlbGYsIGZldGNoZXIpCisgICAgICAgICAgICAjIFdpcGUgb3V0IHRoZSBkbGRpciBjbG9uZSBhbmQgdGhlIHVucGFja2VkIHNvdXJjZSwgdHVybiBvZmYgdGhlIG5ldHdvcmsgYW5kIGNoZWNrIG1pcnJvciB0YXJiYWxsIHdvcmtzCisgICAgICAgICAgICBiYi51dGlscy5wcnVuZWRpcihzZWxmLmRsZGlyICsgIi9naXQyLyIpCisgICAgICAgICAgICBiYi51dGlscy5wcnVuZWRpcihzZWxmLnVucGFja2RpcikKKyAgICAgICAgICAgIHNlbGYuZC5zZXRWYXIoIkJCX05PX05FVFdPUksiLCAiMSIpCisgICAgICAgICAgICBmZXRjaGVyID0gYmIuZmV0Y2guRmV0Y2goW3VybDJdLCBzZWxmLmQpCisgICAgICAgICAgICBmZXRjaGVyLmRvd25sb2FkKCkKKyAgICAgICAgICAgIGNoZWNrcmV2aXNpb24oc2VsZiwgZmV0Y2hlcikKKworICAgICAgICBkZWYgdGVzdF9naXRmZXRjaChzZWxmKToKKyAgICAgICAgICAgIHVybDEgPSB1cmwyID0gImdpdDovL2dpdC5vcGVuZW1iZWRkZWQub3JnL2JpdGJha2UiCisgICAgICAgICAgICBzZWxmLmdpdGZldGNoZXIodXJsMSwgdXJsMikKKworICAgICAgICBkZWYgdGVzdF9naXRmZXRjaF9nb29kc3JjcmV2KHNlbGYpOgorICAgICAgICAgICAgIyBTUkNSRVYgaXMgc2V0IGJ1dCBtYXRjaGVzIHJldj0gcGFyYW1ldGVyCisgICAgICAgICAgICB1cmwxID0gdXJsMiA9ICJnaXQ6Ly9naXQub3BlbmVtYmVkZGVkLm9yZy9iaXRiYWtlO3Jldj0yNzBhMDViMGI0YmEwOTU5ZmUwNjI0ZDJhNDg4NWQ3YjcwNDI2ZGE1IgorICAgICAgICAgICAgc2VsZi5naXRmZXRjaGVyKHVybDEsIHVybDIpCisKKyAgICAgICAgZGVmIHRlc3RfZ2l0ZmV0Y2hfYmFkc3JjcmV2KHNlbGYpOgorICAgICAgICAgICAgIyBTUkNSRVYgaXMgc2V0IGJ1dCBkb2VzIG5vdCBtYXRjaCByZXY9IHBhcmFtZXRlcgorICAgICAgICAgICAgdXJsMSA9IHVybDIgPSAiZ2l0Oi8vZ2l0Lm9wZW5lbWJlZGRlZC5vcmcvYml0YmFrZTtyZXY9ZGVhZDA1YjBiNGJhMDk1OWZlMDYyNGQyYTQ4ODVkN2I3MDQyNmRhNSIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGJiLmZldGNoLkZldGNoRXJyb3IsIHNlbGYuZ2l0ZmV0Y2hlciwgdXJsMSwgdXJsMikKKworICAgICAgICBkZWYgdGVzdF9naXRmZXRjaF90YWdhbmRyZXYoc2VsZik6CisgICAgICAgICAgICAjIFNSQ1JFViBpcyBzZXQgYnV0IGRvZXMgbm90IG1hdGNoIHJldj0gcGFyYW1ldGVyCisgICAgICAgICAgICB1cmwxID0gdXJsMiA9ICJnaXQ6Ly9naXQub3BlbmVtYmVkZGVkLm9yZy9iaXRiYWtlO3Jldj0yNzBhMDViMGI0YmEwOTU5ZmUwNjI0ZDJhNDg4NWQ3YjcwNDI2ZGE1O3RhZz0yNzBhMDViMGI0YmEwOTU5ZmUwNjI0ZDJhNDg4NWQ3YjcwNDI2ZGE1IgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoYmIuZmV0Y2guRmV0Y2hFcnJvciwgc2VsZi5naXRmZXRjaGVyLCB1cmwxLCB1cmwyKQorCisgICAgICAgIGRlZiB0ZXN0X2dpdGZldGNoX3ByZW1pcnJvcihzZWxmKToKKyAgICAgICAgICAgIHVybDEgPSAiZ2l0Oi8vZ2l0Lm9wZW5lbWJlZGRlZC5vcmcvYml0YmFrZSIKKyAgICAgICAgICAgIHVybDIgPSAiZ2l0Oi8vc29tZXNlcnZlci5vcmcvYml0YmFrZSIKKyAgICAgICAgICAgIHNlbGYuZC5zZXRWYXIoIlBSRU1JUlJPUlMiLCAiZ2l0Oi8vc29tZXNlcnZlci5vcmcvYml0YmFrZSBnaXQ6Ly9naXQub3BlbmVtYmVkZGVkLm9yZy9iaXRiYWtlIFxuIikKKyAgICAgICAgICAgIHNlbGYuZ2l0ZmV0Y2hlcih1cmwxLCB1cmwyKQorCisgICAgICAgIGRlZiB0ZXN0X2dpdGZldGNoX3ByZW1pcnJvcjIoc2VsZik6CisgICAgICAgICAgICB1cmwxID0gdXJsMiA9ICJnaXQ6Ly9zb21lc2VydmVyLm9yZy9iaXRiYWtlIgorICAgICAgICAgICAgc2VsZi5kLnNldFZhcigiUFJFTUlSUk9SUyIsICJnaXQ6Ly9zb21lc2VydmVyLm9yZy9iaXRiYWtlIGdpdDovL2dpdC5vcGVuZW1iZWRkZWQub3JnL2JpdGJha2UgXG4iKQorICAgICAgICAgICAgc2VsZi5naXRmZXRjaGVyKHVybDEsIHVybDIpCisKKyAgICAgICAgZGVmIHRlc3RfZ2l0ZmV0Y2hfcHJlbWlycm9yMyhzZWxmKToKKyAgICAgICAgICAgIHJlYWx1cmwgPSAiZ2l0Oi8vZ2l0Lm9wZW5lbWJlZGRlZC5vcmcvYml0YmFrZSIKKyAgICAgICAgICAgIGR1bW15dXJsID0gImdpdDovL3NvbWVzZXJ2ZXIub3JnL2JpdGJha2UiCisgICAgICAgICAgICBzZWxmLnNvdXJjZWRpciA9IHNlbGYudW5wYWNrZGlyLnJlcGxhY2UoInVucGFja2VkIiwgInNvdXJjZW1pcnJvci5naXQiKQorICAgICAgICAgICAgb3MuY2hkaXIoc2VsZi50ZW1wZGlyKQorICAgICAgICAgICAgYmIucHJvY2Vzcy5ydW4oImdpdCBjbG9uZSAlcyAlcyAyPiAvZGV2L251bGwiICUgKHJlYWx1cmwsIHNlbGYuc291cmNlZGlyKSwgc2hlbGw9VHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuZC5zZXRWYXIoIlBSRU1JUlJPUlMiLCAiJXMgZ2l0Oi8vJXM7cHJvdG9jb2w9ZmlsZSBcbiIgJSAoZHVtbXl1cmwsIHNlbGYuc291cmNlZGlyKSkKKyAgICAgICAgICAgIHNlbGYuZ2l0ZmV0Y2hlcihkdW1teXVybCwgZHVtbXl1cmwpCisKKyAgICAgICAgZGVmIHRlc3RfZ2l0X3N1Ym1vZHVsZShzZWxmKToKKyAgICAgICAgICAgIGZldGNoZXIgPSBiYi5mZXRjaC5GZXRjaChbImdpdHNtOi8vZ2l0LnlvY3RvcHJvamVjdC5vcmcvZ2l0LXN1Ym1vZHVsZS10ZXN0O3Jldj1mMTJlNTdmMmVkZjBhYTUzNGNmMTYxNmZhOTgzZDE2NWE5MmIwODQyIl0sIHNlbGYuZCkKKyAgICAgICAgICAgIGZldGNoZXIuZG93bmxvYWQoKQorICAgICAgICAgICAgIyBQcmV2aW91cyBjd2QgaGFzIGJlZW4gZGVsZXRlZAorICAgICAgICAgICAgb3MuY2hkaXIob3MucGF0aC5kaXJuYW1lKHNlbGYudW5wYWNrZGlyKSkKKyAgICAgICAgICAgIGZldGNoZXIudW5wYWNrKHNlbGYudW5wYWNrZGlyKQorCisgICAgICAgIGRlZiB0ZXN0X3RydXN0ZWRfbmV0d29yayhzZWxmKToKKyAgICAgICAgICAgICMgRW5zdXJlIHRydXN0ZWRfbmV0d29yayByZXR1cm5zIEZhbHNlIHdoZW4gdGhlIGhvc3QgSVMgaW4gdGhlIGxpc3QuCisgICAgICAgICAgICB1cmwgPSAiZ2l0Oi8vU29tZXNlcnZlci5vcmcvZm9vO3Jldj0xIgorICAgICAgICAgICAgc2VsZi5kLnNldFZhcigiQkJfQUxMT1dFRF9ORVRXT1JLUyIsICJzZXJ2ZXIxLm9yZyBzb21lc2VydmVyLm9yZyBzZXJ2ZXIyLm9yZyBzZXJ2ZXIzLm9yZyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYmIuZmV0Y2gudHJ1c3RlZF9uZXR3b3JrKHNlbGYuZCwgdXJsKSkKKworICAgICAgICBkZWYgdGVzdF93aWxkX3RydXN0ZWRfbmV0d29yayhzZWxmKToKKyAgICAgICAgICAgICMgRW5zdXJlIHRydXN0ZWRfbmV0d29yayByZXR1cm5zIHRydWUgd2hlbiB0aGUgKi5ob3N0IElTIGluIHRoZSBsaXN0LgorICAgICAgICAgICAgdXJsID0gImdpdDovL1NvbWVzZXJ2ZXIub3JnL2ZvbztyZXY9MSIKKyAgICAgICAgICAgIHNlbGYuZC5zZXRWYXIoIkJCX0FMTE9XRURfTkVUV09SS1MiLCAic2VydmVyMS5vcmcgKi5zb21lc2VydmVyLm9yZyBzZXJ2ZXIyLm9yZyBzZXJ2ZXIzLm9yZyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYmIuZmV0Y2gudHJ1c3RlZF9uZXR3b3JrKHNlbGYuZCwgdXJsKSkKKworICAgICAgICBkZWYgdGVzdF9wcmVmaXhfd2lsZF90cnVzdGVkX25ldHdvcmsoc2VsZik6CisgICAgICAgICAgICAjIEVuc3VyZSB0cnVzdGVkX25ldHdvcmsgcmV0dXJucyB0cnVlIHdoZW4gdGhlIHByZWZpeCBtYXRjaGVzICouaG9zdC4KKyAgICAgICAgICAgIHVybCA9ICJnaXQ6Ly9naXQuU29tZXNlcnZlci5vcmcvZm9vO3Jldj0xIgorICAgICAgICAgICAgc2VsZi5kLnNldFZhcigiQkJfQUxMT1dFRF9ORVRXT1JLUyIsICJzZXJ2ZXIxLm9yZyAqLnNvbWVzZXJ2ZXIub3JnIHNlcnZlcjIub3JnIHNlcnZlcjMub3JnIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiYi5mZXRjaC50cnVzdGVkX25ldHdvcmsoc2VsZi5kLCB1cmwpKQorCisgICAgICAgIGRlZiB0ZXN0X3R3b19wcmVmaXhfd2lsZF90cnVzdGVkX25ldHdvcmsoc2VsZik6CisgICAgICAgICAgICAjIEVuc3VyZSB0cnVzdGVkX25ldHdvcmsgcmV0dXJucyB0cnVlIHdoZW4gdGhlIHByZWZpeCBtYXRjaGVzICouaG9zdC4KKyAgICAgICAgICAgIHVybCA9ICJnaXQ6Ly9zb21ldGhpbmcuZ2l0LlNvbWVzZXJ2ZXIub3JnL2ZvbztyZXY9MSIKKyAgICAgICAgICAgIHNlbGYuZC5zZXRWYXIoIkJCX0FMTE9XRURfTkVUV09SS1MiLCAic2VydmVyMS5vcmcgKi5zb21lc2VydmVyLm9yZyBzZXJ2ZXIyLm9yZyBzZXJ2ZXIzLm9yZyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYmIuZmV0Y2gudHJ1c3RlZF9uZXR3b3JrKHNlbGYuZCwgdXJsKSkKKworICAgICAgICBkZWYgdGVzdF91bnRydXN0ZWRfbmV0d29yayhzZWxmKToKKyAgICAgICAgICAgICMgRW5zdXJlIHRydXN0ZWRfbmV0d29yayByZXR1cm5zIEZhbHNlIHdoZW4gdGhlIGhvc3QgaXMgTk9UIGluIHRoZSBsaXN0LgorICAgICAgICAgICAgdXJsID0gImdpdDovL3NvbWVzZXJ2ZXIub3JnL2ZvbztyZXY9MSIKKyAgICAgICAgICAgIHNlbGYuZC5zZXRWYXIoIkJCX0FMTE9XRURfTkVUV09SS1MiLCAic2VydmVyMS5vcmcgc2VydmVyMi5vcmcgc2VydmVyMy5vcmciKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShiYi5mZXRjaC50cnVzdGVkX25ldHdvcmsoc2VsZi5kLCB1cmwpKQorCisgICAgICAgIGRlZiB0ZXN0X3dpbGRfdW50cnVzdGVkX25ldHdvcmsoc2VsZik6CisgICAgICAgICAgICAjIEVuc3VyZSB0cnVzdGVkX25ldHdvcmsgcmV0dXJucyBGYWxzZSB3aGVuIHRoZSBob3N0IGlzIE5PVCBpbiB0aGUgbGlzdC4KKyAgICAgICAgICAgIHVybCA9ICJnaXQ6Ly8qLnNvbWVzZXJ2ZXIub3JnL2ZvbztyZXY9MSIKKyAgICAgICAgICAgIHNlbGYuZC5zZXRWYXIoIkJCX0FMTE9XRURfTkVUV09SS1MiLCAic2VydmVyMS5vcmcgc2VydmVyMi5vcmcgc2VydmVyMy5vcmciKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShiYi5mZXRjaC50cnVzdGVkX25ldHdvcmsoc2VsZi5kLCB1cmwpKQorCisKK2NsYXNzIFVSTEhhbmRsZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkYXRhdGFibGUgPSB7CisgICAgICAgImh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9pbmRleC5odG1sIiA6ICgnaHR0cCcsICd3d3cuZ29vZ2xlLmNvbScsICcvaW5kZXguaHRtbCcsICcnLCAnJywge30pLAorICAgICAgICJjdnM6Ly9hbm9uY3ZzQGN2cy5oYW5kaGVsZHMub3JnL2N2czttb2R1bGU9ZmFtaWxpYXIvZGlzdC9pcGtnIiA6ICgnY3ZzJywgJ2N2cy5oYW5kaGVsZHMub3JnJywgJy9jdnMnLCAnYW5vbmN2cycsICcnLCB7J21vZHVsZSc6ICdmYW1pbGlhci9kaXN0L2lwa2cnfSksCisgICAgICAgImN2czovL2Fub25jdnM6YW5vbnltb3VzQGN2cy5oYW5kaGVsZHMub3JnL2N2czt0YWc9VjAtOTktODE7bW9kdWxlPWZhbWlsaWFyL2Rpc3QvaXBrZyIgOiAoJ2N2cycsICdjdnMuaGFuZGhlbGRzLm9yZycsICcvY3ZzJywgJ2Fub25jdnMnLCAnYW5vbnltb3VzJywgeyd0YWcnOiAnVjAtOTktODEnLCAnbW9kdWxlJzogJ2ZhbWlsaWFyL2Rpc3QvaXBrZyd9KSwKKyAgICAgICAiZ2l0Oi8vZ2l0Lm9wZW5lbWJlZGRlZC5vcmcvYml0YmFrZTticmFuY2g9QGZvbyIgOiAoJ2dpdCcsICdnaXQub3BlbmVtYmVkZGVkLm9yZycsICcvYml0YmFrZScsICcnLCAnJywgeydicmFuY2gnOiAnQGZvbyd9KQorICAgIH0KKworICAgIGRlZiB0ZXN0X2RlY29kZXVybChzZWxmKToKKyAgICAgICAgZm9yIGssIHYgaW4gc2VsZi5kYXRhdGFibGUuaXRlbXMoKToKKyAgICAgICAgICAgIHJlc3VsdCA9IGJiLmZldGNoLmRlY29kZXVybChrKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHYpCisKKyAgICBkZWYgdGVzdF9lbmNvZGV1cmwoc2VsZik6CisgICAgICAgIGZvciBrLCB2IGluIHNlbGYuZGF0YXRhYmxlLml0ZW1zKCk6CisgICAgICAgICAgICByZXN1bHQgPSBiYi5mZXRjaC5lbmNvZGV1cmwodikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBrKQorCitjbGFzcyBGZXRjaExhdGVzdFZlcnNpb25UZXN0KEZldGNoZXJUZXN0KToKKworICAgIHRlc3RfZ2l0X3VyaXMgPSB7CisgICAgICAgICMgdmVyc2lvbiBwYXR0ZXJuICJYLlkuWiIKKyAgICAgICAgKCJteC0xLjAiLCAiZ2l0Oi8vZ2l0aHViLmNvbS9jbHV0dGVyLXByb2plY3QvbXguZ2l0O2JyYW5jaD1teC0xLjQiLCAiOWIxZGI2YjgwNjBiZDAwYjEyMWE2OTJmOTQyNDA0YTI0YWUyOTYwZiIsICIiKQorICAgICAgICAgICAgOiAiMS45OS40IiwKKyAgICAgICAgIyB2ZXJzaW9uIHBhdHRlcm4gInZYLlkiCisgICAgICAgICgibXRkLXV0aWxzIiwgImdpdDovL2dpdC5pbmZyYWRlYWQub3JnL210ZC11dGlscy5naXQiLCAiY2EzOWViMWQ5OGU3MzYxMDljNjRmZjljMWFhMmE2ZWNjYTIyMmQ4ZiIsICIiKQorICAgICAgICAgICAgOiAiMS41LjAiLAorICAgICAgICAjIHZlcnNpb24gcGF0dGVybiAicGtnX25hbWUtWC5ZIgorICAgICAgICAoInByZXNlbnRwcm90byIsICJnaXQ6Ly9hbm9uZ2l0LmZyZWVkZXNrdG9wLm9yZy9naXQveG9yZy9wcm90by9wcmVzZW50cHJvdG8iLCAiMjRmM2E1NmU1NDFiMGE5ZTZjNmVlNzYwODFmNDQxMjIxYTEyMGVmOSIsICIiKQorICAgICAgICAgICAgOiAiMS4wIiwKKyAgICAgICAgIyB2ZXJzaW9uIHBhdHRlcm4gInBrZ19uYW1lLXZYLlkuWiIKKyAgICAgICAgKCJkdGMiLCAiZ2l0Oi8vZ2l0LnFlbXUub3JnL2R0Yy5naXQiLCAiNjVjYzRkMjc0OGEyYzJlNmYyN2YxY2YzOWUwN2E1ZGJhYmQ4MGViZiIsICIiKQorICAgICAgICAgICAgOiAiMS40LjAiLAorICAgICAgICAjIGNvbWJpbmF0aW9uIHZlcnNpb24gcGF0dGVybgorICAgICAgICAoInN5c3Byb2YiLCAiZ2l0Oi8vZ2l0Lmdub21lLm9yZy9zeXNwcm9mIiwgImNkNDRlZTY2NDRjMzY0MTUwN2ZiNTNiOGEyYTY5MTM3ZjI5NzEyMTkiLCAiIikKKyAgICAgICAgICAgIDogIjEuMi4wIiwKKyAgICAgICAgKCJ1LWJvb3QtbWtpbWFnZSIsICJnaXQ6Ly9naXQuZGVueC5kZS91LWJvb3QuZ2l0O2JyYW5jaD1tYXN0ZXI7cHJvdG9jb2w9Z2l0IiwgIjYyYzE3NWZiYjhhMGY5YTkyNmM4ODI5NGVhOWY3ZTg4ZWI4OThmNmMiLCAiIikKKyAgICAgICAgICAgIDogIjIwMTQuMDEiLAorICAgICAgICAjIHZlcnNpb24gcGF0dGVybiAieXl5eW1tZGQiCisgICAgICAgICgibW9iaWxlLWJyb2FkYmFuZC1wcm92aWRlci1pbmZvIiwgImdpdDovL2dpdC5nbm9tZS5vcmcvbW9iaWxlLWJyb2FkYmFuZC1wcm92aWRlci1pbmZvIiwgIjRlZDE5ZTExYzI5NzUxMDViNzFiOTU2NDQwYWNkYjI1ZDQ2YTM0N2QiLCAiIikKKyAgICAgICAgICAgIDogIjIwMTIwNjE0IiwKKyAgICAgICAgIyBwYWNrYWdlcyB3aXRoIGEgdmFsaWQgR0lUVEFHUkVHRVgKKyAgICAgICAgKCJ4Zjg2LXZpZGVvLW9tYXAiLCAiZ2l0Oi8vYW5vbmdpdC5mcmVlZGVza3RvcC5vcmcveG9yZy9kcml2ZXIveGY4Ni12aWRlby1vbWFwIiwgImFlMDM5NGU2ODdmMWE3N2U5NjZjZjcyZjg5NWRhOTE4NDBkZmZiOGYiLCAiKD9QPHB2ZXI+KFxkK1wuKFxkXC4/KSopKSIpCisgICAgICAgICAgICA6ICIwLjQuMyIsCisgICAgICAgICgiYnVpbGQtYXBwbGlhbmNlLWltYWdlIiwgImdpdDovL2dpdC55b2N0b3Byb2plY3Qub3JnL3Bva3kiLCAiYjM3ZGQ0NTFhNTI2MjJkNWI1NzAxODNhODE1ODNjYzM0YzJmZjU1NSIsICIoP1A8cHZlcj4oKFswLTldW1wufF9dPykrWzAtOV0pKSIpCisgICAgICAgICAgICA6ICIxMS4wLjAiLAorICAgICAgICAoImNoa2NvbmZpZy1hbHRlcm5hdGl2ZXMtbmF0aXZlIiwgImdpdDovL2dpdGh1Yi5jb20va2VyZ290aC9jaGtjb25maWc7YnJhbmNoPXN5c3Jvb3QiLCAiY2Q0MzdlY2JkODk4NmM4OTQ0NDJmOGZjZTFlMDA2MWUyMGYwNGRlZSIsICJjaGtjb25maWdcLSg/UDxwdmVyPigoXGQrW1wuXC1fXSopKykpIikKKyAgICAgICAgICAgIDogIjEuMy41OSIsCisgICAgICAgICgicmVtYWtlIiwgImdpdDovL2dpdGh1Yi5jb20vcm9ja3kvcmVtYWtlLmdpdCIsICJmMDU1MDhlNTIxOTg3Yzg0OTRjOTJkOWMyODcxYWVjNDYzMDdkNTFkIiwgIig/UDxwdmVyPihcZCtcLihcZCtcLikqXGQqKFwrZGJnXGQrKFwuXGQrKSopKikpIikKKyAgICAgICAgICAgIDogIjMuODIrZGJnMC45IiwKKyAgICB9CisKKyAgICB0ZXN0X3dnZXRfdXJpcyA9IHsKKyAgICAgICAgIyBwYWNrYWdlcyB3aXRoIHZlcnNpb25zIGluc2lkZSBkaXJlY3RvcnkgbmFtZQorICAgICAgICAoInV0aWwtbGludXgiLCAiaHR0cDovL2tlcm5lbC5vcmcvcHViL2xpbnV4L3V0aWxzL3V0aWwtbGludXgvdjIuMjMvdXRpbC1saW51eC0yLjI0LjIudGFyLmJ6MiIsICIiLCAiIikKKyAgICAgICAgICAgIDogIjIuMjQuMiIsCisgICAgICAgICgiZW5jaGFudCIsICJodHRwOi8vd3d3LmFiaXNvdXJjZS5jb20vZG93bmxvYWRzL2VuY2hhbnQvMS42LjAvZW5jaGFudC0xLjYuMC50YXIuZ3oiLCAiIiwgIiIpCisgICAgICAgICAgICA6ICIxLjYuMCIsCisgICAgICAgICgiY21ha2UiLCAiaHR0cDovL3d3dy5jbWFrZS5vcmcvZmlsZXMvdjIuOC9jbWFrZS0yLjguMTIuMS50YXIuZ3oiLCAiIiwgIiIpCisgICAgICAgICAgICA6ICIyLjguMTIuMSIsCisgICAgICAgICMgcGFja2FnZXMgd2l0aCB2ZXJzaW9ucyBvbmx5IGluIGN1cnJlbnQgZGlyZWN0b3J5CisgICAgICAgICgiZWdsaWMiLCAiaHR0cDovL2Rvd25sb2Fkcy55b2N0b3Byb2plY3Qub3JnL3JlbGVhc2VzL2VnbGliYy9lZ2xpYmMtMi4xOC1zdm5yMjM3ODcudGFyLmJ6MiIsICIiLCAiIikKKyAgICAgICAgICAgIDogIjIuMTkiLAorICAgICAgICAoImdudS1jb25maWciLCAiaHR0cDovL2Rvd25sb2Fkcy55b2N0b3Byb2plY3Qub3JnL3JlbGVhc2VzL2dudS1jb25maWcvZ251LWNvbmZpZy0yMDEyMDgxNC50YXIuYnoyIiwgIiIsICIiKQorICAgICAgICAgICAgOiAiMjAxMjA4MTQiLAorICAgICAgICAjIHBhY2thZ2VzIHdpdGggIjk5IiBpbiB0aGUgbmFtZSBvZiBwb3NzaWJsZSB2ZXJzaW9uCisgICAgICAgICgicHVsc2VhdWRpbyIsICJodHRwOi8vZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL3B1bHNlYXVkaW8vcmVsZWFzZXMvcHVsc2VhdWRpby00LjAudGFyLnh6IiwgIiIsICIiKQorICAgICAgICAgICAgOiAiNS4wIiwKKyAgICAgICAgKCJ4c2VydmVyLXhvcmciLCAiaHR0cDovL3hvcmcuZnJlZWRlc2t0b3Aub3JnL3JlbGVhc2VzL2luZGl2aWR1YWwveHNlcnZlci94b3JnLXNlcnZlci0xLjE1LjEudGFyLmJ6MiIsICIiLCAiIikKKyAgICAgICAgICAgIDogIjEuMTUuMSIsCisgICAgICAgICMgcGFja2FnZXMgd2l0aCB2YWxpZCBSRUdFWF9VUkkgYW5kIFJFR0VYCisgICAgICAgICgiY3VwcyIsICJodHRwOi8vd3d3LmN1cHMub3JnL3NvZnR3YXJlLzEuNy4yL2N1cHMtMS43LjItc291cmNlLnRhci5iejIiLCAiaHR0cDovL3d3dy5jdXBzLm9yZy9zb2Z0d2FyZS5waHAiLCAiKD9QPG5hbWU+Y3Vwc1wtKSg/UDxwdmVyPigoXGQrW1wuXC1fXSopKykpXC1zb3VyY2VcLnRhclwuZ3oiKQorICAgICAgICAgICAgOiAiMi4wLjAiLAorICAgICAgICAoImRiIiwgImh0dHA6Ly9kb3dubG9hZC5vcmFjbGUuY29tL2JlcmtlbGV5LWRiL2RiLTUuMy4yMS50YXIuZ3oiLCAiaHR0cDovL3d3dy5vcmFjbGUuY29tL3RlY2huZXR3b3JrL3Byb2R1Y3RzL2JlcmtlbGV5ZGIvZG93bmxvYWRzL2luZGV4LTA4Mjk0NC5odG1sIiwgImh0dHA6Ly9kb3dubG9hZC5vcmFjbGUuY29tL290bi9iZXJrZWxleS1kYi8oP1A8bmFtZT5kYi0pKD9QPHB2ZXI+KChcZCtbXC5cLV9dKikrKSlcLnRhclwuZ3oiKQorICAgICAgICAgICAgOiAiNi4xLjE5IiwKKyAgICB9CisgICAgaWYgb3MuZW52aXJvbi5nZXQoIkJCX1NLSVBfTkVUVEVTVFMiKSA9PSAieWVzIjoKKyAgICAgICAgcHJpbnQoIlVuc2V0IEJCX1NLSVBfTkVUVEVTVFMgdG8gcnVuIG5ldHdvcmsgdGVzdHMiKQorICAgIGVsc2U6CisgICAgICAgIGRlZiB0ZXN0X2dpdF9sYXRlc3RfdmVyc2lvbnN0cmluZyhzZWxmKToKKyAgICAgICAgICAgIGZvciBrLCB2IGluIHNlbGYudGVzdF9naXRfdXJpcy5pdGVtcygpOgorICAgICAgICAgICAgICAgIHNlbGYuZC5zZXRWYXIoIlBOIiwga1swXSkKKyAgICAgICAgICAgICAgICBzZWxmLmQuc2V0VmFyKCJTUkNSRVYiLCBrWzJdKQorICAgICAgICAgICAgICAgIHNlbGYuZC5zZXRWYXIoIkdJVFRBR1JFR0VYIiwga1szXSkKKyAgICAgICAgICAgICAgICB1ZCA9IGJiLmZldGNoMi5GZXRjaERhdGEoa1sxXSwgc2VsZi5kKQorICAgICAgICAgICAgICAgIHB1cHZlcj0gdWQubWV0aG9kLmxhdGVzdF92ZXJzaW9uc3RyaW5nKHVkLCBzZWxmLmQpCisgICAgICAgICAgICAgICAgdmVyc3RyaW5nID0gcHVwdmVyWzBdCisgICAgICAgICAgICAgICAgciA9IGJiLnV0aWxzLnZlcmNtcF9zdHJpbmcodiwgdmVyc3RyaW5nKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyID09IC0xIG9yIHIgPT0gMCwgbXNnPSJQYWNrYWdlICVzLCB2ZXJzaW9uOiAlcyA8PSAlcyIgJSAoa1swXSwgdiwgdmVyc3RyaW5nKSkKKworICAgICAgICBkZWYgdGVzdF93Z2V0X2xhdGVzdF92ZXJzaW9uc3RyaW5nKHNlbGYpOgorICAgICAgICAgICAgZm9yIGssIHYgaW4gc2VsZi50ZXN0X3dnZXRfdXJpcy5pdGVtcygpOgorICAgICAgICAgICAgICAgIHNlbGYuZC5zZXRWYXIoIlBOIiwga1swXSkKKyAgICAgICAgICAgICAgICBzZWxmLmQuc2V0VmFyKCJSRUdFWF9VUkkiLCBrWzJdKQorICAgICAgICAgICAgICAgIHNlbGYuZC5zZXRWYXIoIlJFR0VYIiwga1szXSkKKyAgICAgICAgICAgICAgICB1ZCA9IGJiLmZldGNoMi5GZXRjaERhdGEoa1sxXSwgc2VsZi5kKQorICAgICAgICAgICAgICAgIHB1cHZlciA9IHVkLm1ldGhvZC5sYXRlc3RfdmVyc2lvbnN0cmluZyh1ZCwgc2VsZi5kKQorICAgICAgICAgICAgICAgIHZlcnN0cmluZyA9IHB1cHZlclswXQorICAgICAgICAgICAgICAgIHIgPSBiYi51dGlscy52ZXJjbXBfc3RyaW5nKHYsIHZlcnN0cmluZykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUociA9PSAtMSBvciByID09IDAsIG1zZz0iUGFja2FnZSAlcywgdmVyc2lvbjogJXMgPD0gJXMiICUgKGtbMF0sIHYsIHZlcnN0cmluZykpCisKKworY2xhc3MgRmV0Y2hDaGVja1N0YXR1c1Rlc3QoRmV0Y2hlclRlc3QpOgorICAgIHRlc3Rfd2dldF91cmlzID0gWyJodHRwOi8vd3d3LmN1cHMub3JnL3NvZnR3YXJlLzEuNy4yL2N1cHMtMS43LjItc291cmNlLnRhci5iejIiLAorICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LmN1cHMub3JnL3NvZnR3YXJlL2lwcHRvb2wvaXBwdG9vbC0yMDEzMDczMS1saW51eC11YnVudHUtaTY4Ni50YXIuZ3oiLAorICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LmN1cHMub3JnLyIsCisgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9kb3dubG9hZHMueW9jdG9wcm9qZWN0Lm9yZy9yZWxlYXNlcy9zYXRvL3NhdG8tZW5naW5lLTAuMS50YXIuZ3oiLAorICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vZG93bmxvYWRzLnlvY3RvcHJvamVjdC5vcmcvcmVsZWFzZXMvc2F0by9zYXRvLWVuZ2luZS0wLjIudGFyLmd6IiwKKyAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2Rvd25sb2Fkcy55b2N0b3Byb2plY3Qub3JnL3JlbGVhc2VzL3NhdG8vc2F0by1lbmdpbmUtMC4zLnRhci5neiIsCisgICAgICAgICAgICAgICAgICAgICAgImh0dHBzOi8veW9jdG9wcm9qZWN0Lm9yZy8iLAorICAgICAgICAgICAgICAgICAgICAgICJodHRwczovL3lvY3RvcHJvamVjdC5vcmcvZG9jdW1lbnRhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9kb3dubG9hZHMueW9jdG9wcm9qZWN0Lm9yZy9yZWxlYXNlcy9vcGtnL29wa2ctMC4xLjcudGFyLmd6IiwKKyAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2Rvd25sb2Fkcy55b2N0b3Byb2plY3Qub3JnL3JlbGVhc2VzL29wa2cvb3BrZy0wLjMuMC50YXIuZ3oiLAorICAgICAgICAgICAgICAgICAgICAgICJmdHA6Ly9mdHAuZ251Lm9yZy9nbnUvYXV0b2NvbmYvYXV0b2NvbmYtMi42MC50YXIuZ3oiLAorICAgICAgICAgICAgICAgICAgICAgICJmdHA6Ly9mdHAuZ251Lm9yZy9nbnUvY2hlc3MvZ251Y2hlc3MtNS4wOC50YXIuZ3oiLAorICAgICAgICAgICAgICAgICAgICAgICJmdHA6Ly9mdHAuZ251Lm9yZy9nbnUvZ21wL2dtcC00LjAudGFyLmd6IiwKKyAgICAgICAgICAgICAgICAgICAgICBdCisKKyAgICBpZiBvcy5lbnZpcm9uLmdldCgiQkJfU0tJUF9ORVRURVNUUyIpID09ICJ5ZXMiOgorICAgICAgICBwcmludCgiVW5zZXQgQkJfU0tJUF9ORVRURVNUUyB0byBydW4gbmV0d29yayB0ZXN0cyIpCisgICAgZWxzZToKKworICAgICAgICBkZWYgdGVzdF93Z2V0X2NoZWNrc3RhdHVzKHNlbGYpOgorICAgICAgICAgICAgZmV0Y2ggPSBiYi5mZXRjaDIuRmV0Y2goc2VsZi50ZXN0X3dnZXRfdXJpcywgc2VsZi5kKQorICAgICAgICAgICAgZm9yIHUgaW4gc2VsZi50ZXN0X3dnZXRfdXJpczoKKyAgICAgICAgICAgICAgICB1ZCA9IGZldGNoLnVkW3VdCisgICAgICAgICAgICAgICAgbSA9IHVkLm1ldGhvZAorICAgICAgICAgICAgICAgIHJldCA9IG0uY2hlY2tzdGF0dXMoZmV0Y2gsIHVkLCBzZWxmLmQpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJldCwgbXNnPSJVUkkgJXMsIGNhbid0IGNoZWNrIHN0YXR1cyIgJSAodSkpCisKKworICAgICAgICBkZWYgdGVzdF93Z2V0X2NoZWNrc3RhdHVzX2Nvbm5lY3Rpb25fY2FjaGUoc2VsZik6CisgICAgICAgICAgICBmcm9tIGJiLmZldGNoMiBpbXBvcnQgRmV0Y2hDb25uZWN0aW9uQ2FjaGUKKworICAgICAgICAgICAgY29ubmVjdGlvbl9jYWNoZSA9IEZldGNoQ29ubmVjdGlvbkNhY2hlKCkKKyAgICAgICAgICAgIGZldGNoID0gYmIuZmV0Y2gyLkZldGNoKHNlbGYudGVzdF93Z2V0X3VyaXMsIHNlbGYuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25fY2FjaGUgPSBjb25uZWN0aW9uX2NhY2hlKQorCisgICAgICAgICAgICBmb3IgdSBpbiBzZWxmLnRlc3Rfd2dldF91cmlzOgorICAgICAgICAgICAgICAgIHVkID0gZmV0Y2gudWRbdV0KKyAgICAgICAgICAgICAgICBtID0gdWQubWV0aG9kCisgICAgICAgICAgICAgICAgcmV0ID0gbS5jaGVja3N0YXR1cyhmZXRjaCwgdWQsIHNlbGYuZCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocmV0LCBtc2c9IlVSSSAlcywgY2FuJ3QgY2hlY2sgc3RhdHVzIiAlICh1KSkKKworICAgICAgICAgICAgY29ubmVjdGlvbl9jYWNoZS5jbG9zZV9jb25uZWN0aW9ucygpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi90ZXN0cy9wYXJzZS5weSBiL2JpdGJha2UvbGliL2JiL3Rlc3RzL3BhcnNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZWI3NmEKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi90ZXN0cy9wYXJzZS5weQpAQCAtMCwwICsxLDE0NyBAQAorIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyMKKyMgQml0QmFrZSBUZXN0IGZvciBsaWIvYmIvcGFyc2UvCisjCisjIENvcHlyaWdodCAoQykgMjAxNSBSaWNoYXJkIFB1cmRpZQorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgYmIKK2ltcG9ydCBvcworCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcignQml0QmFrZS5UZXN0UGFyc2UnKQorCitpbXBvcnQgYmIucGFyc2UKK2ltcG9ydCBiYi5kYXRhCitpbXBvcnQgYmIuc2lnZ2VuCisKK2NsYXNzIFBhcnNlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICB0ZXN0ZmlsZSA9ICIiIgorQSA9ICIxIgorQiA9ICIyIgorZG9faW5zdGFsbCgpIHsKKwllY2hvICJoZWxsbyIKK30KKworQyA9ICIzIgorIiIiCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZCA9IGJiLmRhdGEuaW5pdCgpCisgICAgICAgIGJiLnBhcnNlLnNpZ2dlbiA9IGJiLnNpZ2dlbi5pbml0KHNlbGYuZCkKKworICAgIGRlZiBwYXJzZWhlbHBlcihzZWxmLCBjb250ZW50LCBzdWZmaXggPSAiLmJiIik6CisKKyAgICAgICAgZiA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZShzdWZmaXggPSBzdWZmaXgpCisgICAgICAgIGYud3JpdGUoY29udGVudCkKKyAgICAgICAgZi5mbHVzaCgpCisgICAgICAgIG9zLmNoZGlyKG9zLnBhdGguZGlybmFtZShmLm5hbWUpKQorICAgICAgICByZXR1cm4gZgorCisgICAgZGVmIHRlc3RfcGFyc2Vfc2ltcGxlKHNlbGYpOgorICAgICAgICBmID0gc2VsZi5wYXJzZWhlbHBlcihzZWxmLnRlc3RmaWxlKQorICAgICAgICBkID0gYmIucGFyc2UuaGFuZGxlKGYubmFtZSwgc2VsZi5kKVsnJ10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldFZhcigiQSIsIFRydWUpLCAiMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXRWYXIoIkIiLCBUcnVlKSwgIjIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0VmFyKCJDIiwgVHJ1ZSksICIzIikKKworICAgIGRlZiB0ZXN0X3BhcnNlX2luY29tcGxldGVfZnVuY3Rpb24oc2VsZik6CisgICAgICAgIHRlc3RmaWxlQiA9IHNlbGYudGVzdGZpbGUucmVwbGFjZSgifSIsICIiKQorICAgICAgICBmID0gc2VsZi5wYXJzZWhlbHBlcih0ZXN0ZmlsZUIpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoYmIucGFyc2UuUGFyc2VFcnJvcik6CisgICAgICAgICAgICBkID0gYmIucGFyc2UuaGFuZGxlKGYubmFtZSwgc2VsZi5kKVsnJ10KKworICAgIG92ZXJyaWRldGVzdCA9ICIiIgorUlJFQ09NTUVORFNfJHtQTn0gPSAiYSIKK1JSRUNPTU1FTkRTXyR7UE59X2xpYmMgPSAiYiIKK09WRVJSSURFUyA9ICJsaWJjOiR7UE59IgorUE4gPSAiZ3RrKyIKKyIiIgorCisgICAgZGVmIHRlc3RfcGFyc2Vfb3ZlcnJpZGVzKHNlbGYpOgorICAgICAgICBmID0gc2VsZi5wYXJzZWhlbHBlcihzZWxmLm92ZXJyaWRldGVzdCkKKyAgICAgICAgZCA9IGJiLnBhcnNlLmhhbmRsZShmLm5hbWUsIHNlbGYuZClbJyddCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXRWYXIoIlJSRUNPTU1FTkRTIiwgVHJ1ZSksICJiIikKKyAgICAgICAgYmIuZGF0YS5leHBhbmRLZXlzKGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXRWYXIoIlJSRUNPTU1FTkRTIiwgVHJ1ZSksICJiIikKKyAgICAgICAgZC5zZXRWYXIoIlJSRUNPTU1FTkRTX2d0aysiLCAiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXRWYXIoIlJSRUNPTU1FTkRTIiwgVHJ1ZSksICJjIikKKworICAgIG92ZXJyaWRldGVzdDIgPSAiIiIKK0VYVFJBX09FQ09ORiA9ICIiCitFWFRSQV9PRUNPTkZfY2xhc3MtdGFyZ2V0ID0gImIiCitFWFRSQV9PRUNPTkZfYXBwZW5kID0gIiBjIgorIiIiCisKKyAgICBkZWYgdGVzdF9wYXJzZV9vdmVycmlkZXMoc2VsZik6CisgICAgICAgIGYgPSBzZWxmLnBhcnNlaGVscGVyKHNlbGYub3ZlcnJpZGV0ZXN0MikKKyAgICAgICAgZCA9IGJiLnBhcnNlLmhhbmRsZShmLm5hbWUsIHNlbGYuZClbJyddCisgICAgICAgIGQuYXBwZW5kVmFyKCJFWFRSQV9PRUNPTkYiLCAiIGQiKQorICAgICAgICBkLnNldFZhcigiT1ZFUlJJREVTIiwgImNsYXNzLXRhcmdldCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXRWYXIoIkVYVFJBX09FQ09ORiIsIFRydWUpLCAiYiBjIGQiKQorCisgICAgb3ZlcnJpZGV0ZXN0MyA9ICIiIgorREVTQ1JJUFRJT04gPSAiQSIKK0RFU0NSSVBUSU9OXyR7UE59LWRldiA9ICIke0RFU0NSSVBUSU9OfSBCIgorUE4gPSAiYmMiCisiIiIKKworICAgIGRlZiB0ZXN0X3BhcnNlX2NvbWJpbmF0aW9ucyhzZWxmKToKKyAgICAgICAgZiA9IHNlbGYucGFyc2VoZWxwZXIoc2VsZi5vdmVycmlkZXRlc3QzKQorICAgICAgICBkID0gYmIucGFyc2UuaGFuZGxlKGYubmFtZSwgc2VsZi5kKVsnJ10KKyAgICAgICAgYmIuZGF0YS5leHBhbmRLZXlzKGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXRWYXIoIkRFU0NSSVBUSU9OX2JjLWRldiIsIFRydWUpLCAiQSBCIikKKyAgICAgICAgZC5zZXRWYXIoIkRFU0NSSVBUSU9OIiwgIkUiKQorICAgICAgICBkLnNldFZhcigiREVTQ1JJUFRJT05fYmMtZGV2IiwgIkMgRCIpCisgICAgICAgIGQuc2V0VmFyKCJPVkVSUklERVMiLCAiYmMtZGV2IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldFZhcigiREVTQ1JJUFRJT04iLCBUcnVlKSwgIkMgRCIpCisKKworICAgIGNsYXNzZXh0ZW5kID0gIiIiCitWQVJfdmFyX292ZXJyaWRlMSA9ICJCIgorRVhUUkEgPSAiOm92ZXJyaWRlMSIKK09WRVJSSURFUyA9ICJub3RoaW5nJHtFWFRSQX0iCisKK0JCQ0xBU1NFWFRFTkQgPSAiIyMjQ0xBU1MjIyMiCisiIiIKKyAgICBjbGFzc2V4dGVuZF9iYmNsYXNzID0gIiIiCitFWFRSQSA9ICIiCitweXRob24gKCkgeworICAgIGQucmVuYW1lVmFyKCJWQVJfdmFyIiwgIlZBUl92YXIyIikKK30KKyIiIgorCisgICAgIworICAgICMgVGVzdCBiYXNlZCB1cG9uIGEgcmVhbCB3b3JsZCBkYXRhIGNvcnJ1cHRpb24gaXNzdWUuIE9uZQorICAgICMgZGF0YSBzdG9yZSBjaGFuZ2luZyBhIHZhcmlhYmxlIHBva2VkIHRocm91Z2ggaW50byBhIGRpZmZlcmVudCBkYXRhCisgICAgIyBzdG9yZS4gVGhpcyB0ZXN0IGNhc2UgcmVwbGljYXRlcyB0aGF0IGlzc3VlIHdoZXJlIHRoZSB2YWx1ZSAnQicgd291bGQgCisgICAgIyBiZWNvbWUgdW5zZXQvZGlzYXBwZWFyLgorICAgICMKKyAgICBkZWYgdGVzdF9wYXJzZV9jbGFzc2V4dGVuZF9jb250YW1pbmF0aW9uKHNlbGYpOgorICAgICAgICBjbHMgPSBzZWxmLnBhcnNlaGVscGVyKHNlbGYuY2xhc3NleHRlbmRfYmJjbGFzcywgc3VmZml4PSIuYmJjbGFzcyIpCisgICAgICAgICNjbHNuYW1lID0gb3MucGF0aC5iYXNlbmFtZShjbHMubmFtZSkucmVwbGFjZSgiLmJiY2xhc3MiLCAiIikKKyAgICAgICAgc2VsZi5jbGFzc2V4dGVuZCA9IHNlbGYuY2xhc3NleHRlbmQucmVwbGFjZSgiIyMjQ0xBU1MjIyMiLCBjbHMubmFtZSkKKyAgICAgICAgZiA9IHNlbGYucGFyc2VoZWxwZXIoc2VsZi5jbGFzc2V4dGVuZCkKKyAgICAgICAgYWxsZGF0YSA9IGJiLnBhcnNlLmhhbmRsZShmLm5hbWUsIHNlbGYuZCkKKyAgICAgICAgZDEgPSBhbGxkYXRhWycnXQorICAgICAgICBkMiA9IGFsbGRhdGFbY2xzLm5hbWVdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEuZ2V0VmFyKCJWQVJfdmFyIiwgVHJ1ZSksICJCIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMi5nZXRWYXIoIlZBUl92YXIiLCBUcnVlKSwgTm9uZSkKKwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdGVzdHMvdXRpbHMucHkgYi9iaXRiYWtlL2xpYi9iYi90ZXN0cy91dGlscy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTcxNTA5Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdGVzdHMvdXRpbHMucHkKQEAgLTAsMCArMSwzNzggQEAKKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisjCisjIEJpdEJha2UgVGVzdHMgZm9yIHV0aWxzLnB5CisjCisjIENvcHlyaWdodCAoQykgMjAxMiBSaWNoYXJkIFB1cmRpZQorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgYmIKK2ltcG9ydCBvcworaW1wb3J0IHRlbXBmaWxlCisKK2NsYXNzIFZlckNtcFN0cmluZyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF92ZXJjbXBzdHJpbmcoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IGJiLnV0aWxzLnZlcmNtcF9zdHJpbmcoJzEnLCAnMicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQgPCAwKQorICAgICAgICByZXN1bHQgPSBiYi51dGlscy52ZXJjbXBfc3RyaW5nKCcyJywgJzEnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzdWx0ID4gMCkKKyAgICAgICAgcmVzdWx0ID0gYmIudXRpbHMudmVyY21wX3N0cmluZygnMScsICcxLjAnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzdWx0IDwgMCkKKyAgICAgICAgcmVzdWx0ID0gYmIudXRpbHMudmVyY21wX3N0cmluZygnMScsICcxLjEnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzdWx0IDwgMCkKKyAgICAgICAgcmVzdWx0ID0gYmIudXRpbHMudmVyY21wX3N0cmluZygnMS4xJywgJzFfcDInKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzdWx0IDwgMCkKKyAgICAgICAgcmVzdWx0ID0gYmIudXRpbHMudmVyY21wX3N0cmluZygnMS4wJywgJzEuMCsxLjEtYmV0YTEnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzdWx0IDwgMCkKKyAgICAgICAgcmVzdWx0ID0gYmIudXRpbHMudmVyY21wX3N0cmluZygnMS4xJywgJzEuMCsxLjEtYmV0YTEnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzdWx0ID4gMCkKKworICAgIGRlZiB0ZXN0X2V4cGxvZGVfZGVwX3ZlcnNpb25zKHNlbGYpOgorICAgICAgICBjb3JyZWN0cmVzdWx0ID0geyJmb28iIDogWyI9IDEuMTAiXX0KKyAgICAgICAgcmVzdWx0ID0gYmIudXRpbHMuZXhwbG9kZV9kZXBfdmVyc2lvbnMyKCJmb28gKD0gMS4xMCkiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgY29ycmVjdHJlc3VsdCkKKyAgICAgICAgcmVzdWx0ID0gYmIudXRpbHMuZXhwbG9kZV9kZXBfdmVyc2lvbnMyKCJmb28gKD0xLjEwKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBjb3JyZWN0cmVzdWx0KQorICAgICAgICByZXN1bHQgPSBiYi51dGlscy5leHBsb2RlX2RlcF92ZXJzaW9uczIoImZvbyAoID0gMS4xMCkiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgY29ycmVjdHJlc3VsdCkKKyAgICAgICAgcmVzdWx0ID0gYmIudXRpbHMuZXhwbG9kZV9kZXBfdmVyc2lvbnMyKCJmb28gKCA9MS4xMCkiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgY29ycmVjdHJlc3VsdCkKKyAgICAgICAgcmVzdWx0ID0gYmIudXRpbHMuZXhwbG9kZV9kZXBfdmVyc2lvbnMyKCJmb28gKCA9IDEuMTAgKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBjb3JyZWN0cmVzdWx0KQorICAgICAgICByZXN1bHQgPSBiYi51dGlscy5leHBsb2RlX2RlcF92ZXJzaW9uczIoImZvbyAoID0xLjEwICkiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgY29ycmVjdHJlc3VsdCkKKworICAgIGRlZiB0ZXN0X3ZlcmNtcF9zdHJpbmdfb3Aoc2VsZik6CisgICAgICAgIGNvbXBhcmVvcHMgPSBbKCcxJywgJzEnLCAnPScsIFRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICgnMScsICcxJywgJz09JywgVHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgKCcxJywgJzEnLCAnIT0nLCBGYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgKCcxJywgJzEnLCAnPicsIEZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAoJzEnLCAnMScsICc8JywgRmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICgnMScsICcxJywgJz49JywgVHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgKCcxJywgJzEnLCAnPD0nLCBUcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAoJzEnLCAnMCcsICc9JywgRmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICgnMScsICcwJywgJz09JywgRmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICgnMScsICcwJywgJyE9JywgVHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgKCcxJywgJzAnLCAnPicsIFRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICgnMScsICcwJywgJzwnLCBGYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgKCcxJywgJzAnLCAnPj4nLCBUcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAoJzEnLCAnMCcsICc8PCcsIEZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAoJzEnLCAnMCcsICc+PScsIFRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICgnMScsICcwJywgJzw9JywgRmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICgnMCcsICcxJywgJz0nLCBGYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgKCcwJywgJzEnLCAnPT0nLCBGYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgKCcwJywgJzEnLCAnIT0nLCBUcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAoJzAnLCAnMScsICc+JywgRmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICgnMCcsICcxJywgJzwnLCBUcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAoJzAnLCAnMScsICc+PicsIEZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAoJzAnLCAnMScsICc8PCcsIFRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICgnMCcsICcxJywgJz49JywgRmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICgnMCcsICcxJywgJzw9JywgVHJ1ZSldCisKKyAgICAgICAgZm9yIGFyZzEsIGFyZzIsIG9wLCBjb3JyZWN0cmVzdWx0IGluIGNvbXBhcmVvcHM6CisgICAgICAgICAgICByZXN1bHQgPSBiYi51dGlscy52ZXJjbXBfc3RyaW5nX29wKGFyZzEsIGFyZzIsIG9wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGNvcnJlY3RyZXN1bHQsICd2ZXJjbXBfc3RyaW5nX29wKCIlcyIsICIlcyIsICIlcyIpICE9ICVzJyAlIChhcmcxLCBhcmcyLCBvcCwgY29ycmVjdHJlc3VsdCkpCisKKyAgICAgICAgIyBDaGVjayB0aGF0IGNsZWFybHkgaW52YWxpZCBvcGVyYXRvciByYWlzZXMgYW4gZXhjZXB0aW9uCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGJiLnV0aWxzLlZlcnNpb25TdHJpbmdFeGNlcHRpb24sIGJiLnV0aWxzLnZlcmNtcF9zdHJpbmdfb3AsICcwJywgJzAnLCAnJCcpCisKKworY2xhc3MgUGF0aCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfdW5zYWZlX2RlbGV0ZV9wYXRoKHNlbGYpOgorICAgICAgICBjaGVja2l0ZW1zID0gWygnLycsIFRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICgnLy8nLCBUcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAoJy8vLycsIFRydWUpLAorICAgICAgICAgICAgICAgICAgICAgIChvcy5nZXRjd2QoKS5jb3VudChvcy5zZXApICogKCcuLicgKyBvcy5zZXApLCBUcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAob3MuZW52aXJvbi5nZXQoJ0hPTUUnLCAnL2hvbWUvdGVzdCcpLCBUcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAoJy9ob21lL3NvbWVvbmUnLCBUcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAoJy9ob21lL290aGVyLycsIFRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICgnL2hvbWUvb3RoZXIvc3ViZGlyJywgRmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICgnJywgRmFsc2UpXQorICAgICAgICBmb3IgYXJnMSwgY29ycmVjdHJlc3VsdCBpbiBjaGVja2l0ZW1zOgorICAgICAgICAgICAgcmVzdWx0ID0gYmIudXRpbHMuX2NoZWNrX3Vuc2FmZV9kZWxldGVfcGF0aChhcmcxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGNvcnJlY3RyZXN1bHQsICdfY2hlY2tfdW5zYWZlX2RlbGV0ZV9wYXRoKCIlcyIpICE9ICVzJyAlIChhcmcxLCBjb3JyZWN0cmVzdWx0KSkKKworCitjbGFzcyBFZGl0TWV0YWRhdGFGaWxlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBfb3JpZ2ZpbGUgPSAiIiIKKyMgQSBjb21tZW50CitIRUxMTyA9ICJvbGR2YWx1ZSIKKworVEhJUyA9ICJ0aGF0IgorCisjIEFub3RoZXIgY29tbWVudAorTk9DSEFOR0UgPSAic2FtZXZhbHVlIgorT1RIRVIgPSAnYW5vdGhlcnZhbHVlJworCitNVUxUSUxJTkUgPSAiYTEgXFwKKyAgICAgICAgICAgICBhMiBcXAorICAgICAgICAgICAgIGEzIgorCitNVUxUSUxJTkUyIDo9ICIgXFwKKyAgICAgICAgICAgICAgIGIxIFxcCisgICAgICAgICAgICAgICBiMiBcXAorICAgICAgICAgICAgICAgYjMgXFwKKyAgICAgICAgICAgICAgICIKKworCitNVUxUSUxJTkUzID0gIiBcXAorICAgICAgICAgICAgICBjMSBcXAorICAgICAgICAgICAgICBjMiBcXAorICAgICAgICAgICAgICBjMyBcXAorIgorCitkb19mdW5jdGlvbm5hbWUoKSB7CisgICAgY29tbWFuZDEgJHtWQUwxfSAke1ZBTDJ9CisgICAgY29tbWFuZDIgJHtWQUwzfSAke1ZBTDR9Cit9CisiIiIKKyAgICBkZWYgX3Rlc3RlZGl0ZmlsZShzZWxmLCB2YXJ2YWx1ZXMsIGNvbXBhcmV0bywgZHVtbXl2YXJzPU5vbmUpOgorICAgICAgICBpZiBkdW1teXZhcnMgaXMgTm9uZToKKyAgICAgICAgICAgIGR1bW15dmFycyA9IFtdCisgICAgICAgIHdpdGggdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKCd3JywgZGVsZXRlPUZhbHNlKSBhcyB0ZjoKKyAgICAgICAgICAgIHRmLndyaXRlKHNlbGYuX29yaWdmaWxlKQorICAgICAgICAgICAgdGYuY2xvc2UoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHZhcmNhbGxzID0gW10KKyAgICAgICAgICAgICAgICBkZWYgaGFuZGxlX2ZpbGUodmFybmFtZSwgb3JpZ3ZhbHVlLCBvcCwgbmV3bGluZXMpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKHZhcm5hbWUsIHZhcnZhbHVlcywgJ0NhbGxiYWNrIGNhbGxlZCBmb3IgdmFyaWFibGUgJXMgbm90IGluIHRoZSBsaXN0IScgJSB2YXJuYW1lKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKHZhcm5hbWUsIGR1bW15dmFycywgJ0NhbGxiYWNrIGNhbGxlZCBmb3IgdmFyaWFibGUgJXMgaW4gZHVtbXkgbGlzdCEnICUgdmFybmFtZSkKKyAgICAgICAgICAgICAgICAgICAgdmFyY2FsbHMuYXBwZW5kKHZhcm5hbWUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YXJ2YWx1ZXNbdmFybmFtZV0KKworICAgICAgICAgICAgICAgIGJiLnV0aWxzLmVkaXRfbWV0YWRhdGFfZmlsZSh0Zi5uYW1lLCB2YXJ2YWx1ZXMua2V5cygpLCBoYW5kbGVfZmlsZSkKKyAgICAgICAgICAgICAgICB3aXRoIG9wZW4odGYubmFtZSkgYXMgZjoKKyAgICAgICAgICAgICAgICAgICAgbW9kZmlsZSA9IGYucmVhZGxpbmVzKCkKKyAgICAgICAgICAgICAgICAjIEVuc3VyZSB0aGUgb3V0cHV0IG1hdGNoZXMgdGhlIGV4cGVjdGVkIG91dHB1dAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGFyZXRvLnNwbGl0bGluZXMoVHJ1ZSksIG1vZGZpbGUpCisgICAgICAgICAgICAgICAgIyBFbnN1cmUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdhcyBjYWxsZWQgZm9yIGV2ZXJ5IHZhcmlhYmxlIHdlIGFza2VkIGZvcgorICAgICAgICAgICAgICAgICMgKHBsdXMgYWxsb3cgdGVzdGluZyBiZWhhdmlvdXIgd2hlbiBhIHJlcXVlc3RlZCB2YXJpYWJsZSBpcyBub3QgcHJlc2VudCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvcnRlZCh2YXJ2YWx1ZXMua2V5cygpKSwgc29ydGVkKHZhcmNhbGxzICsgZHVtbXl2YXJzKSkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHRmLm5hbWUpCisKKworICAgIGRlZiB0ZXN0X2VkaXRfbWV0YWRhdGFfZmlsZV9ub2NoYW5nZShzZWxmKToKKyAgICAgICAgIyBUZXN0IGZpbGUgZG9lc24ndCBnZXQgbW9kaWZpZWQgd2l0aCBub3RoaW5nIHRvIGRvCisgICAgICAgIHNlbGYuX3Rlc3RlZGl0ZmlsZSh7fSwgc2VsZi5fb3JpZ2ZpbGUpCisgICAgICAgICMgVGVzdCBmaWxlIGRvZXNuJ3QgZ2V0IG1vZGlmaWVkIHdpdGggb25seSBkdW1teSB2YXJpYWJsZXMKKyAgICAgICAgc2VsZi5fdGVzdGVkaXRmaWxlKHsnRFVNTVkxJzogKCdzaG91bGRfbm90X3NldCcsIE5vbmUsIDAsIFRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgJ0RVTU1ZMic6ICgnc2hvdWxkX25vdF9zZXRfYWdhaW4nLCBOb25lLCAwLCBUcnVlKX0sIHNlbGYuX29yaWdmaWxlLCBkdW1teXZhcnM9WydEVU1NWTEnLCAnRFVNTVkyJ10pCisgICAgICAgICMgVGVzdCBmaWxlIGRvZXNuJ3QgZ2V0IG1vZGlmaWVkIHdpdGggc29tZSB0aGUgc2FtZSB2YWx1ZXMKKyAgICAgICAgc2VsZi5fdGVzdGVkaXRmaWxlKHsnVEhJUyc6ICgndGhhdCcsIE5vbmUsIDAsIFRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgJ09USEVSJzogKCdhbm90aGVydmFsdWUnLCBOb25lLCAwLCBUcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdNVUxUSUxJTkUzJzogKCcgICAgICAgICAgICAgICBjMSAgICAgICAgICAgICAgIGMyICAgICAgICAgICAgICAgYzMnLCBOb25lLCA0LCBGYWxzZSl9LCBzZWxmLl9vcmlnZmlsZSkKKworICAgIGRlZiB0ZXN0X2VkaXRfbWV0YWRhdGFfZmlsZV8xKHNlbGYpOgorCisgICAgICAgIG5ld2ZpbGUxID0gIiIiCisjIEEgY29tbWVudAorSEVMTE8gPSAibmV3dmFsdWUiCisKK1RISVMgPSAidGhhdCIKKworIyBBbm90aGVyIGNvbW1lbnQKK05PQ0hBTkdFID0gInNhbWV2YWx1ZSIKK09USEVSID0gJ2Fub3RoZXJ2YWx1ZScKKworTVVMVElMSU5FID0gImExIFxcCisgICAgICAgICAgICAgYTIgXFwKKyAgICAgICAgICAgICBhMyIKKworTVVMVElMSU5FMiA6PSAiIFxcCisgICAgICAgICAgICAgICBiMSBcXAorICAgICAgICAgICAgICAgYjIgXFwKKyAgICAgICAgICAgICAgIGIzIFxcCisgICAgICAgICAgICAgICAiCisKKworTVVMVElMSU5FMyA9ICIgXFwKKyAgICAgICAgICAgICAgYzEgXFwKKyAgICAgICAgICAgICAgYzIgXFwKKyAgICAgICAgICAgICAgYzMgXFwKKyIKKworZG9fZnVuY3Rpb25uYW1lKCkgeworICAgIGNvbW1hbmQxICR7VkFMMX0gJHtWQUwyfQorICAgIGNvbW1hbmQyICR7VkFMM30gJHtWQUw0fQorfQorIiIiCisgICAgICAgIHNlbGYuX3Rlc3RlZGl0ZmlsZSh7J0hFTExPJzogKCduZXd2YWx1ZScsIE5vbmUsIDQsIFRydWUpfSwgbmV3ZmlsZTEpCisKKworICAgIGRlZiB0ZXN0X2VkaXRfbWV0YWRhdGFfZmlsZV8yKHNlbGYpOgorCisgICAgICAgIG5ld2ZpbGUyID0gIiIiCisjIEEgY29tbWVudAorSEVMTE8gPSAib2xkdmFsdWUiCisKK1RISVMgPSAidGhhdCIKKworIyBBbm90aGVyIGNvbW1lbnQKK05PQ0hBTkdFID0gInNhbWV2YWx1ZSIKK09USEVSID0gJ2Fub3RoZXJ2YWx1ZScKKworTVVMVElMSU5FID0gIiBcXAorICAgIGQxIFxcCisgICAgZDIgXFwKKyAgICBkMyBcXAorICAgICIKKworTVVMVElMSU5FMiA6PSAiIFxcCisgICAgICAgICAgICAgICBiMSBcXAorICAgICAgICAgICAgICAgYjIgXFwKKyAgICAgICAgICAgICAgIGIzIFxcCisgICAgICAgICAgICAgICAiCisKKworTVVMVElMSU5FMyA9ICJub3dzaW5nbGUiCisKK2RvX2Z1bmN0aW9ubmFtZSgpIHsKKyAgICBjb21tYW5kMSAke1ZBTDF9ICR7VkFMMn0KKyAgICBjb21tYW5kMiAke1ZBTDN9ICR7VkFMNH0KK30KKyIiIgorICAgICAgICBzZWxmLl90ZXN0ZWRpdGZpbGUoeydNVUxUSUxJTkUnOiAoWydkMScsJ2QyJywnZDMnXSwgTm9uZSwgNCwgRmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgJ01VTFRJTElORTMnOiAoJ25vd3NpbmdsZScsIE5vbmUsIDQsIFRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgJ05PVFBSRVNFTlQnOiAoWydhJywgJ2InXSwgTm9uZSwgNCwgRmFsc2UpfSwgbmV3ZmlsZTIsIGR1bW15dmFycz1bJ05PVFBSRVNFTlQnXSkKKworCisgICAgZGVmIHRlc3RfZWRpdF9tZXRhZGF0YV9maWxlXzMoc2VsZik6CisKKyAgICAgICAgbmV3ZmlsZTMgPSAiIiIKKyMgQSBjb21tZW50CitIRUxMTyA9ICJvbGR2YWx1ZSIKKworIyBBbm90aGVyIGNvbW1lbnQKK05PQ0hBTkdFID0gInNhbWV2YWx1ZSIKK09USEVSID0gInlldGFub3RoZXJ2YWx1ZSIKKworTVVMVElMSU5FID0gImUxIFxcCisgICAgICAgICAgICAgZTIgXFwKKyAgICAgICAgICAgICBlMyBcXAorICAgICAgICAgICAgICIKKworTVVMVElMSU5FMiA6PSAiZjEgXFwKK1x0ZjIgXFwKK1x0IgorCisKK01VTFRJTElORTMgPSAiIFxcCisgICAgICAgICAgICAgIGMxIFxcCisgICAgICAgICAgICAgIGMyIFxcCisgICAgICAgICAgICAgIGMzIFxcCisiCisKK2RvX2Z1bmN0aW9ubmFtZSgpIHsKKyAgICBvdGhlcmNvbW1hbmRfb25lIGEgYiBjCisgICAgb3RoZXJjb21tYW5kX3R3byBkIGUgZgorfQorIiIiCisKKyAgICAgICAgc2VsZi5fdGVzdGVkaXRmaWxlKHsnZG9fZnVuY3Rpb25uYW1lKCknOiAoWydvdGhlcmNvbW1hbmRfb25lIGEgYiBjJywgJ290aGVyY29tbWFuZF90d28gZCBlIGYnXSwgTm9uZSwgNCwgRmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgJ01VTFRJTElORTInOiAoWydmMScsICdmMiddLCBOb25lLCAnXHQnLCBUcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdNVUxUSUxJTkUnOiAoWydlMScsICdlMicsICdlMyddLCBOb25lLCAtMSwgVHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAnVEhJUyc6IChOb25lLCBOb25lLCAwLCBGYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAnT1RIRVInOiAoJ3lldGFub3RoZXJ2YWx1ZScsIE5vbmUsIDAsIFRydWUpfSwgbmV3ZmlsZTMpCisKKworICAgIGRlZiB0ZXN0X2VkaXRfbWV0YWRhdGFfZmlsZV80KHNlbGYpOgorCisgICAgICAgIG5ld2ZpbGU0ID0gIiIiCisjIEEgY29tbWVudAorSEVMTE8gPSAib2xkdmFsdWUiCisKK1RISVMgPSAidGhhdCIKKworIyBBbm90aGVyIGNvbW1lbnQKK09USEVSID0gJ2Fub3RoZXJ2YWx1ZScKKworTVVMVElMSU5FID0gImExIFxcCisgICAgICAgICAgICAgYTIgXFwKKyAgICAgICAgICAgICBhMyIKKworTVVMVElMSU5FMiA6PSAiIFxcCisgICAgICAgICAgICAgICBiMSBcXAorICAgICAgICAgICAgICAgYjIgXFwKKyAgICAgICAgICAgICAgIGIzIFxcCisgICAgICAgICAgICAgICAiCisKKworIiIiCisKKyAgICAgICAgc2VsZi5fdGVzdGVkaXRmaWxlKHsnTk9DSEFOR0UnOiAoTm9uZSwgTm9uZSwgMCwgRmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgJ01VTFRJTElORTMnOiAoTm9uZSwgTm9uZSwgMCwgRmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgJ1RISVMnOiAoJ3RoYXQnLCBOb25lLCAwLCBGYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAnZG9fZnVuY3Rpb25uYW1lKCknOiAoTm9uZSwgTm9uZSwgMCwgRmFsc2UpfSwgbmV3ZmlsZTQpCisKKworICAgIGRlZiB0ZXN0X2VkaXRfbWV0YWRhdGEoc2VsZik6CisgICAgICAgIG5ld2ZpbGU1ID0gIiIiCisjIEEgY29tbWVudAorSEVMTE8gPSAiaGl0aGVyZSIKKworIyBBIG5ldyBjb21tZW50CitUSElTICs9ICJ0aGF0IgorCisjIEFub3RoZXIgY29tbWVudAorTk9DSEFOR0UgPSAic2FtZXZhbHVlIgorT1RIRVIgPSAnYW5vdGhlcnZhbHVlJworCitNVUxUSUxJTkUgPSAiYTEgXFwKKyAgICAgICAgICAgICBhMiBcXAorICAgICAgICAgICAgIGEzIgorCitNVUxUSUxJTkUyIDo9ICIgXFwKKyAgICAgICAgICAgICAgIGIxIFxcCisgICAgICAgICAgICAgICBiMiBcXAorICAgICAgICAgICAgICAgYjMgXFwKKyAgICAgICAgICAgICAgICIKKworCitNVUxUSUxJTkUzID0gIiBcXAorICAgICAgICAgICAgICBjMSBcXAorICAgICAgICAgICAgICBjMiBcXAorICAgICAgICAgICAgICBjMyBcXAorIgorCitORVdWQVIgPSAidmFsdWUiCisKK2RvX2Z1bmN0aW9ubmFtZSgpIHsKKyAgICBjb21tYW5kMSAke1ZBTDF9ICR7VkFMMn0KKyAgICBjb21tYW5kMiAke1ZBTDN9ICR7VkFMNH0KK30KKyIiIgorCisKKyAgICAgICAgZGVmIGhhbmRsZV92YXIodmFybmFtZSwgb3JpZ3ZhbHVlLCBvcCwgbmV3bGluZXMpOgorICAgICAgICAgICAgaWYgdmFybmFtZSA9PSAnVEhJUyc6CisgICAgICAgICAgICAgICAgbmV3bGluZXMuYXBwZW5kKCcjIEEgbmV3IGNvbW1lbnRcbicpCisgICAgICAgICAgICBlbGlmIHZhcm5hbWUgPT0gJ2RvX2Z1bmN0aW9ubmFtZSgpJzoKKyAgICAgICAgICAgICAgICBuZXdsaW5lcy5hcHBlbmQoJ05FV1ZBUiA9ICJ2YWx1ZSJcbicpCisgICAgICAgICAgICAgICAgbmV3bGluZXMuYXBwZW5kKCdcbicpCisgICAgICAgICAgICB2YWx1ZWl0ZW0gPSB2YXJ2YWx1ZXMuZ2V0KHZhcm5hbWUsIE5vbmUpCisgICAgICAgICAgICBpZiB2YWx1ZWl0ZW06CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlaXRlbQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gKG9yaWd2YWx1ZSwgb3AsIDAsIFRydWUpCisKKyAgICAgICAgdmFydmFsdWVzID0geydIRUxMTyc6ICgnaGl0aGVyZScsIE5vbmUsIDAsIFRydWUpLCAnVEhJUyc6ICgndGhhdCcsICcrPScsIDAsIFRydWUpfQorICAgICAgICB2YXJsaXN0ID0gWydIRUxMTycsICdUSElTJywgJ2RvX2Z1bmN0aW9ubmFtZSgpJ10KKyAgICAgICAgKHVwZGF0ZWQsIG5ld2xpbmVzKSA9IGJiLnV0aWxzLmVkaXRfbWV0YWRhdGEoc2VsZi5fb3JpZ2ZpbGUuc3BsaXRsaW5lcyhUcnVlKSwgdmFybGlzdCwgaGFuZGxlX3ZhcikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHVwZGF0ZWQsICdMaXN0IHNob3VsZCBiZSB1cGRhdGVkIGJ1dCBpc25cJ3QnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld2xpbmVzLCBuZXdmaWxlNS5zcGxpdGxpbmVzKFRydWUpKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdGluZm9pbC5weSBiL2JpdGJha2UvbGliL2JiL3RpbmZvaWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVhNDZkOAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3RpbmZvaWwucHkKQEAgLTAsMCArMSwxMDQgQEAKKyMgdGluZm9pbDogYSBzaW1wbGUgd3JhcHBlciBhcm91bmQgY29va2VyIGZvciBiaXRiYWtlLWJhc2VkIGNvbW1hbmQtbGluZSB1dGlsaXRpZXMKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEyIEludGVsIENvcnBvcmF0aW9uCisjIENvcHlyaWdodCAoQykgMjAxMSBNZW50b3IgR3JhcGhpY3MgQ29ycG9yYXRpb24KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgd2FybmluZ3MKK2ltcG9ydCBvcworaW1wb3J0IHN5cworCitpbXBvcnQgYmIuY2FjaGUKK2ltcG9ydCBiYi5jb29rZXIKK2ltcG9ydCBiYi5wcm92aWRlcnMKK2ltcG9ydCBiYi51dGlscworZnJvbSBiYi5jb29rZXIgaW1wb3J0IHN0YXRlLCBCQkNvb2tlciwgQ29va2VyRmVhdHVyZXMKK2Zyb20gYmIuY29va2VyZGF0YSBpbXBvcnQgQ29va2VyQ29uZmlndXJhdGlvbiwgQ29uZmlnUGFyYW1ldGVycworaW1wb3J0IGJiLmZldGNoMgorCitjbGFzcyBUaW5mb2lsOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvdXRwdXQ9c3lzLnN0ZG91dCwgdHJhY2tpbmc9RmFsc2UpOgorICAgICAgICAjIE5lZWRlZCB0byBhdm9pZCBkZXByZWNhdGlvbiB3YXJuaW5ncyB3aXRoIHB5dGhvbiAyLjYKKyAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsIGNhdGVnb3J5PURlcHJlY2F0aW9uV2FybmluZykKKworICAgICAgICAjIFNldCB1cCBsb2dnaW5nCisgICAgICAgIHNlbGYubG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoJ0JpdEJha2UnKQorICAgICAgICBjb25zb2xlID0gbG9nZ2luZy5TdHJlYW1IYW5kbGVyKG91dHB1dCkKKyAgICAgICAgYmIubXNnLmFkZERlZmF1bHRsb2dGaWx0ZXIoY29uc29sZSkKKyAgICAgICAgZm9ybWF0ID0gYmIubXNnLkJCTG9nRm9ybWF0dGVyKCIlKGxldmVsbmFtZSlzOiAlKG1lc3NhZ2UpcyIpCisgICAgICAgIGlmIG91dHB1dC5pc2F0dHkoKToKKyAgICAgICAgICAgIGZvcm1hdC5lbmFibGVfY29sb3IoKQorICAgICAgICBjb25zb2xlLnNldEZvcm1hdHRlcihmb3JtYXQpCisgICAgICAgIHNlbGYubG9nZ2VyLmFkZEhhbmRsZXIoY29uc29sZSkKKworICAgICAgICBzZWxmLmNvbmZpZyA9IENvb2tlckNvbmZpZ3VyYXRpb24oKQorICAgICAgICBjb25maWdwYXJhbXMgPSBUaW5mb2lsQ29uZmlnUGFyYW1ldGVycyhwYXJzZV9vbmx5PVRydWUpCisgICAgICAgIHNlbGYuY29uZmlnLnNldENvbmZpZ1BhcmFtZXRlcnMoY29uZmlncGFyYW1zKQorICAgICAgICBzZWxmLmNvbmZpZy5zZXRTZXJ2ZXJSZWdJZGxlQ2FsbGJhY2soc2VsZi5yZWdpc3Rlcl9pZGxlX2Z1bmN0aW9uKQorICAgICAgICBmZWF0dXJlcyA9IFtdCisgICAgICAgIGlmIHRyYWNraW5nOgorICAgICAgICAgICAgZmVhdHVyZXMuYXBwZW5kKENvb2tlckZlYXR1cmVzLkJBU0VEQVRBU1RPUkVfVFJBQ0tJTkcpCisgICAgICAgIHNlbGYuY29va2VyID0gQkJDb29rZXIoc2VsZi5jb25maWcsIGZlYXR1cmVzKQorICAgICAgICBzZWxmLmNvbmZpZ19kYXRhID0gc2VsZi5jb29rZXIuZGF0YQorICAgICAgICBiYi5wcm92aWRlcnMubG9nZ2VyLnNldExldmVsKGxvZ2dpbmcuRVJST1IpCisgICAgICAgIHNlbGYuY29va2VyX2RhdGEgPSBOb25lCisKKyAgICBkZWYgcmVnaXN0ZXJfaWRsZV9mdW5jdGlvbihzZWxmLCBmdW5jdGlvbiwgZGF0YSk6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBwYXJzZVJlY2lwZXMoc2VsZik6CisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIlBhcnNpbmcgcmVjaXBlcy4uIikKKyAgICAgICAgc2VsZi5sb2dnZXIuc2V0TGV2ZWwobG9nZ2luZy5XQVJOSU5HKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdoaWxlIHNlbGYuY29va2VyLnN0YXRlIGluIChzdGF0ZS5pbml0aWFsLCBzdGF0ZS5wYXJzaW5nKToKKyAgICAgICAgICAgICAgICBzZWxmLmNvb2tlci51cGRhdGVDYWNoZSgpCisgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgIHNlbGYuY29va2VyLnNodXRkb3duKCkKKyAgICAgICAgICAgIHNlbGYuY29va2VyLnVwZGF0ZUNhY2hlKCkKKyAgICAgICAgICAgIHN5cy5leGl0KDIpCisKKyAgICAgICAgc2VsZi5sb2dnZXIuc2V0TGV2ZWwobG9nZ2luZy5JTkZPKQorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJkb25lLlxuIikKKworICAgICAgICBzZWxmLmNvb2tlcl9kYXRhID0gc2VsZi5jb29rZXIucmVjaXBlY2FjaGUKKworICAgIGRlZiBwcmVwYXJlKHNlbGYsIGNvbmZpZ19vbmx5ID0gRmFsc2UpOgorICAgICAgICBpZiBub3Qgc2VsZi5jb29rZXJfZGF0YToKKyAgICAgICAgICAgIGlmIGNvbmZpZ19vbmx5OgorICAgICAgICAgICAgICAgIHNlbGYuY29va2VyLnBhcnNlQ29uZmlndXJhdGlvbigpCisgICAgICAgICAgICAgICAgc2VsZi5jb29rZXJfZGF0YSA9IHNlbGYuY29va2VyLnJlY2lwZWNhY2hlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYucGFyc2VSZWNpcGVzKCkKKworICAgIGRlZiBzaHV0ZG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jb29rZXIuc2h1dGRvd24oZm9yY2U9VHJ1ZSkKKyAgICAgICAgc2VsZi5jb29rZXIucG9zdF9zZXJ2ZSgpCisgICAgICAgIHNlbGYuY29va2VyLnVubG9ja0JpdGJha2UoKQorCitjbGFzcyBUaW5mb2lsQ29uZmlnUGFyYW1ldGVycyhDb25maWdQYXJhbWV0ZXJzKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqKm9wdGlvbnMpOgorICAgICAgICBzZWxmLmluaXRpYWxfb3B0aW9ucyA9IG9wdGlvbnMKKyAgICAgICAgc3VwZXIoVGluZm9pbENvbmZpZ1BhcmFtZXRlcnMsIHNlbGYpLl9faW5pdF9fKCkKKworICAgIGRlZiBwYXJzZUNvbW1hbmRMaW5lKHNlbGYsIGFyZ3Y9c3lzLmFyZ3YpOgorICAgICAgICBjbGFzcyBEdW1teU9wdGlvbnM6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgaW5pdGlhbF9vcHRpb25zKToKKyAgICAgICAgICAgICAgICBmb3Iga2V5LCB2YWwgaW4gaW5pdGlhbF9vcHRpb25zLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwga2V5LCB2YWwpCisKKyAgICAgICAgcmV0dXJuIER1bW15T3B0aW9ucyhzZWxmLmluaXRpYWxfb3B0aW9ucyksIE5vbmUKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL19faW5pdF9fLnB5IGIvYml0YmFrZS9saWIvYmIvdWkvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ4MDVlZAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsMTcgQEAKKyMKKyMgQml0QmFrZSBVSSBJbXBsZW1lbnRhdGlvbgorIworIyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBSaWNoYXJkIFB1cmRpZQorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2J1aWxkaW5mb2hlbHBlci5weSBiL2JpdGJha2UvbGliL2JiL3VpL2J1aWxkaW5mb2hlbHBlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDFlZDUxCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvYnVpbGRpbmZvaGVscGVyLnB5CkBAIC0wLDAgKzEsMTMzOSBAQAorIworIyBCaXRCYWtlIFRvYXN0ZXJVSSBJbXBsZW1lbnRhdGlvbgorIworIyBDb3B5cmlnaHQgKEMpIDIwMTMgICAgICAgIEludGVsIENvcnBvcmF0aW9uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitpbXBvcnQgc3lzCitpbXBvcnQgYmIKK2ltcG9ydCByZQoraW1wb3J0IG9zCisKK29zLmVudmlyb25bIkRKQU5HT19TRVRUSU5HU19NT0RVTEUiXSA9ICJ0b2FzdGVyLnRvYXN0ZXJtYWluLnNldHRpbmdzIgorCisKK2Zyb20gZGphbmdvLnV0aWxzIGltcG9ydCB0aW1lem9uZQorCisKK2RlZiBfY29uZmlndXJlX3RvYXN0ZXIoKToKKyAgICAiIiIgQWRkIHRvYXN0ZXIgdG8gc3lzIHBhdGggZm9yIGltcG9ydGluZyBtb2R1bGVzCisgICAgIiIiCisgICAgc3lzLnBhdGguYXBwZW5kKG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpKSwgJ3RvYXN0ZXInKSkKK19jb25maWd1cmVfdG9hc3RlcigpCisKK2Zyb20gdG9hc3Rlci5vcm0ubW9kZWxzIGltcG9ydCBCdWlsZCwgVGFzaywgUmVjaXBlLCBMYXllcl9WZXJzaW9uLCBMYXllciwgVGFyZ2V0LCBMb2dNZXNzYWdlLCBIZWxwVGV4dAorZnJvbSB0b2FzdGVyLm9ybS5tb2RlbHMgaW1wb3J0IFRhcmdldF9JbWFnZV9GaWxlLCBCdWlsZEFydGlmYWN0Citmcm9tIHRvYXN0ZXIub3JtLm1vZGVscyBpbXBvcnQgVmFyaWFibGUsIFZhcmlhYmxlSGlzdG9yeQorZnJvbSB0b2FzdGVyLm9ybS5tb2RlbHMgaW1wb3J0IFBhY2thZ2UsIFBhY2thZ2VfRmlsZSwgVGFyZ2V0X0luc3RhbGxlZF9QYWNrYWdlLCBUYXJnZXRfRmlsZQorZnJvbSB0b2FzdGVyLm9ybS5tb2RlbHMgaW1wb3J0IFRhc2tfRGVwZW5kZW5jeSwgUGFja2FnZV9EZXBlbmRlbmN5Citmcm9tIHRvYXN0ZXIub3JtLm1vZGVscyBpbXBvcnQgUmVjaXBlX0RlcGVuZGVuY3kKKworZnJvbSB0b2FzdGVyLm9ybS5tb2RlbHMgaW1wb3J0IFByb2plY3QKK2Zyb20gYmxkY29udHJvbC5tb2RlbHMgaW1wb3J0IEJ1aWxkRW52aXJvbm1lbnQsIEJ1aWxkUmVxdWVzdAorCitmcm9tIGJiLm1zZyBpbXBvcnQgQkJMb2dGb3JtYXR0ZXIgYXMgZm9ybWF0dGVyCitmcm9tIGRqYW5nby5kYiBpbXBvcnQgbW9kZWxzCitmcm9tIHBwcmludCBpbXBvcnQgcGZvcm1hdAoraW1wb3J0IGxvZ2dpbmcKKworZnJvbSBkamFuZ28uZGIgaW1wb3J0IHRyYW5zYWN0aW9uLCBjb25uZWN0aW9uCisKKyMgcHlsaW50OiBkaXNhYmxlPWludmFsaWQtbmFtZQorIyB0aGUgbG9nZ2VyIG5hbWUgaXMgc3RhbmRhcmQgdGhyb3VnaG91dCBCaXRCYWtlCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiVG9hc3RlckxvZ2dlciIpCisKKworY2xhc3MgTm90RXhpc3RpbmcoRXhjZXB0aW9uKToKKyAgICBwYXNzCisKK2NsYXNzIE9STVdyYXBwZXIob2JqZWN0KToKKyAgICAiIiIgVGhpcyBjbGFzcyBjcmVhdGVzIHRoZSBkaWN0aW9uYXJpZXMgbmVlZGVkIHRvIHN0b3JlIGluZm9ybWF0aW9uIGluIHRoZSBkYXRhYmFzZQorICAgICAgICBmb2xsb3dpbmcgdGhlIGZvcm1hdCBkZWZpbmVkIGJ5IHRoZSBEamFuZ28gbW9kZWxzLiBJdCBpcyBhbHNvIHVzZWQgdG8gc2F2ZSB0aGlzCisgICAgICAgIGluZm9ybWF0aW9uIGluIHRoZSBkYXRhYmFzZS4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5sYXllcl92ZXJzaW9uX29iamVjdHMgPSBbXQorICAgICAgICBzZWxmLnRhc2tfb2JqZWN0cyA9IHt9CisgICAgICAgIHNlbGYucmVjaXBlX29iamVjdHMgPSB7fQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfYnVpbGRfa2V5KCoqa3dhcmdzKToKKyAgICAgICAga2V5ID0gIjAiCisgICAgICAgIGZvciBrIGluIHNvcnRlZChrd2FyZ3Mua2V5cygpKToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoa3dhcmdzW2tdLCBtb2RlbHMuTW9kZWwpOgorICAgICAgICAgICAgICAgIGtleSArPSAiLSVkIiAlIGt3YXJnc1trXS5pZAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBrZXkgKz0gIi0lcyIgJSBzdHIoa3dhcmdzW2tdKQorICAgICAgICByZXR1cm4ga2V5CisKKworICAgIGRlZiBfY2FjaGVkX2dldF9vcl9jcmVhdGUoc2VsZiwgY2xhenosICoqa3dhcmdzKToKKyAgICAgICAgIiIiIFRoaXMgaXMgYSBtZW1vcnktY2FjaGVkIGdldF9vcl9jcmVhdGUuIFdlIGFzc3VtZSB0aGF0IHRoZSBvYmplY3RzIHdpbGwgbm90IGJlIGNyZWF0ZWQgaW4gdGhlCisgICAgICAgICAgICBkYXRhYmFzZSB0aHJvdWdoIGFueSBvdGhlciBtZWFucy4KKyAgICAgICAgIiIiCisKKyAgICAgICAgYXNzZXJ0IGlzc3ViY2xhc3MoY2xhenosIG1vZGVscy5Nb2RlbCksICJfY2FjaGVkX2dldF9vcl9jcmVhdGUgbmVlZHMgdG8gZ2V0IHRoZSBjbGFzcyBhcyBmaXJzdCBhcmd1bWVudCIKKworICAgICAgICBrZXkgPSBPUk1XcmFwcGVyLl9idWlsZF9rZXkoKiprd2FyZ3MpCisgICAgICAgIGRpY3RuYW1lID0gIm9iamVjdHNfJXMiICUgY2xhenouX19uYW1lX18KKyAgICAgICAgaWYgbm90IGRpY3RuYW1lIGluIHZhcnMoc2VsZikua2V5cygpOgorICAgICAgICAgICAgdmFycyhzZWxmKVtkaWN0bmFtZV0gPSB7fQorCisgICAgICAgIGNyZWF0ZWQgPSBGYWxzZQorICAgICAgICBpZiBub3Qga2V5IGluIHZhcnMoc2VsZilbZGljdG5hbWVdLmtleXMoKToKKyAgICAgICAgICAgIHZhcnMoc2VsZilbZGljdG5hbWVdW2tleV0gPSBjbGF6ei5vYmplY3RzLmNyZWF0ZSgqKmt3YXJncykKKyAgICAgICAgICAgIGNyZWF0ZWQgPSBUcnVlCisKKyAgICAgICAgcmV0dXJuICh2YXJzKHNlbGYpW2RpY3RuYW1lXVtrZXldLCBjcmVhdGVkKQorCisKKyAgICBkZWYgX2NhY2hlZF9nZXQoc2VsZiwgY2xhenosICoqa3dhcmdzKToKKyAgICAgICAgIiIiIFRoaXMgaXMgYSBtZW1vcnktY2FjaGVkIGdldC4gV2UgYXNzdW1lIHRoYXQgdGhlIG9iamVjdHMgd2lsbCBub3QgY2hhbmdlICBpbiB0aGUgZGF0YWJhc2UgYmV0d2VlbiBnZXRzLgorICAgICAgICAiIiIKKyAgICAgICAgYXNzZXJ0IGlzc3ViY2xhc3MoY2xhenosIG1vZGVscy5Nb2RlbCksICJfY2FjaGVkX2dldCBuZWVkcyB0byBnZXQgdGhlIGNsYXNzIGFzIGZpcnN0IGFyZ3VtZW50IgorCisgICAgICAgIGtleSA9IE9STVdyYXBwZXIuX2J1aWxkX2tleSgqKmt3YXJncykKKyAgICAgICAgZGljdG5hbWUgPSAib2JqZWN0c18lcyIgJSBjbGF6ei5fX25hbWVfXworCisgICAgICAgIGlmIG5vdCBkaWN0bmFtZSBpbiB2YXJzKHNlbGYpLmtleXMoKToKKyAgICAgICAgICAgIHZhcnMoc2VsZilbZGljdG5hbWVdID0ge30KKworICAgICAgICBpZiBub3Qga2V5IGluIHZhcnMoc2VsZilbZGljdG5hbWVdLmtleXMoKToKKyAgICAgICAgICAgIHZhcnMoc2VsZilbZGljdG5hbWVdW2tleV0gPSBjbGF6ei5vYmplY3RzLmdldCgqKmt3YXJncykKKworICAgICAgICByZXR1cm4gdmFycyhzZWxmKVtkaWN0bmFtZV1ba2V5XQorCisgICAgIyBweWxpbnQ6IGRpc2FibGU9bm8tc2VsZi11c2UKKyAgICAjIHdlIGRpc2FibGUgZGV0ZWN0aW9uIG9mIG5vIHNlbGYgdXNlIGluIGZ1bmN0aW9ucyBiZWNhdXNlIHRoZSBtZXRob2RzIGFjdHVhbGx5IHdvcmsgb24gdGhlIG9iamVjdAorICAgICMgZXZlbiBpZiB0aGV5IGRvbid0IHRvdWNoIHNlbGYgYW55d2hlcmUKKworICAgICMgcHlsaW50OiBkaXNhYmxlPWJhZC1jb250aW51YXRpb24KKyAgICAjIHdlIGRvIG5vdCBmb2xsb3cgdGhlIHB5dGhvbiBjb252ZW50aW9ucyBmb3IgY29udGludWF0aW9uIGluZGVudGF0aW9uIGR1ZSB0byBsb25nIGxpbmVzIGhlcmUKKworICAgIGRlZiBjcmVhdGVfYnVpbGRfb2JqZWN0KHNlbGYsIGJ1aWxkX2luZm8sIGJyYmUsIHByb2plY3RfaWQpOgorICAgICAgICBhc3NlcnQgJ21hY2hpbmUnIGluIGJ1aWxkX2luZm8KKyAgICAgICAgYXNzZXJ0ICdkaXN0cm8nIGluIGJ1aWxkX2luZm8KKyAgICAgICAgYXNzZXJ0ICdkaXN0cm9fdmVyc2lvbicgaW4gYnVpbGRfaW5mbworICAgICAgICBhc3NlcnQgJ3N0YXJ0ZWRfb24nIGluIGJ1aWxkX2luZm8KKyAgICAgICAgYXNzZXJ0ICdjb29rZXJfbG9nX3BhdGgnIGluIGJ1aWxkX2luZm8KKyAgICAgICAgYXNzZXJ0ICdidWlsZF9uYW1lJyBpbiBidWlsZF9pbmZvCisgICAgICAgIGFzc2VydCAnYml0YmFrZV92ZXJzaW9uJyBpbiBidWlsZF9pbmZvCisKKyAgICAgICAgcHJqID0gTm9uZQorICAgICAgICBidWlsZHJlcXVlc3QgPSBOb25lCisgICAgICAgIGlmIGJyYmUgaXMgbm90IE5vbmU6ICAgICAgICAgICAgIyB0aGlzIGJ1aWxkIHdhcyB0cmlnZ2VyZWQgYnkgYSByZXF1ZXN0IGZyb20gYSB1c2VyCisgICAgICAgICAgICBsb2dnZXIuZGVidWcoMSwgImJ1aWxkaW5mb2hlbHBlcjogYnJiZSBpcyAlcyIgJSBicmJlKQorICAgICAgICAgICAgYnIsIF8gPSBicmJlLnNwbGl0KCI6IikKKyAgICAgICAgICAgIGJ1aWxkcmVxdWVzdCA9IEJ1aWxkUmVxdWVzdC5vYmplY3RzLmdldChwayA9IGJyKQorICAgICAgICAgICAgcHJqID0gYnVpbGRyZXF1ZXN0LnByb2plY3QKKworICAgICAgICBlbGlmIHByb2plY3RfaWQgaXMgbm90IE5vbmU6ICAgICMgdGhpcyBidWlsZCB3YXMgdHJpZ2dlcmVkIGJ5IGFuIGV4dGVybmFsIHN5c3RlbSBmb3IgYSBzcGVjaWZpYyBwcm9qZWN0CisgICAgICAgICAgICBsb2dnZXIuZGVidWcoMSwgImJ1aWxkaW5mb2hlbHBlcjogcHJvamVjdCBpcyAlcyIgJSBwcmopCisgICAgICAgICAgICBwcmogPSBQcm9qZWN0Lm9iamVjdHMuZ2V0KHBrID0gcHJvamVjdF9pZCkKKworICAgICAgICBlbHNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGhpcyBidWlsZCB3YXMgdHJpZ2dlcmVkIGJ5IGEgbGVnYWN5IHN5c3RlbSwgb3IgY29tbWFuZCBsaW5lIGludGVyYWN0aXZlIG1vZGUKKyAgICAgICAgICAgIHByaiA9IFByb2plY3Qub2JqZWN0cy5nZXRfZGVmYXVsdF9wcm9qZWN0KCkKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiYnVpbGRpbmZvaGVscGVyOiBwcm9qZWN0IGlzIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRpbmcgdG8gJXMiICUgcHJqKQorCisKKyAgICAgICAgaWYgYnVpbGRyZXF1ZXN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYnVpbGQgPSBidWlsZHJlcXVlc3QuYnVpbGQKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJVcGRhdGluZyBleGlzdGluZyBidWlsZCwgd2l0aCAlcyIsIGJ1aWxkX2luZm8pCisgICAgICAgICAgICBidWlsZC5wcm9qZWN0ID0gcHJqCisgICAgICAgICAgICBidWlsZC5tYWNoaW5lPWJ1aWxkX2luZm9bJ21hY2hpbmUnXQorICAgICAgICAgICAgYnVpbGQuZGlzdHJvPWJ1aWxkX2luZm9bJ2Rpc3RybyddCisgICAgICAgICAgICBidWlsZC5kaXN0cm9fdmVyc2lvbj1idWlsZF9pbmZvWydkaXN0cm9fdmVyc2lvbiddCisgICAgICAgICAgICBidWlsZC5jb29rZXJfbG9nX3BhdGg9YnVpbGRfaW5mb1snY29va2VyX2xvZ19wYXRoJ10KKyAgICAgICAgICAgIGJ1aWxkLmJ1aWxkX25hbWU9YnVpbGRfaW5mb1snYnVpbGRfbmFtZSddCisgICAgICAgICAgICBidWlsZC5iaXRiYWtlX3ZlcnNpb249YnVpbGRfaW5mb1snYml0YmFrZV92ZXJzaW9uJ10KKyAgICAgICAgICAgIGJ1aWxkLnNhdmUoKQorCisgICAgICAgICAgICBUYXJnZXQub2JqZWN0cy5maWx0ZXIoYnVpbGQgPSBidWlsZCkuZGVsZXRlKCkKKworICAgICAgICBlbHNlOgorICAgICAgICAgICAgYnVpbGQgPSBCdWlsZC5vYmplY3RzLmNyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QgPSBwcmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNoaW5lPWJ1aWxkX2luZm9bJ21hY2hpbmUnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3Rybz1idWlsZF9pbmZvWydkaXN0cm8nXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3Ryb192ZXJzaW9uPWJ1aWxkX2luZm9bJ2Rpc3Ryb192ZXJzaW9uJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGVkX29uPWJ1aWxkX2luZm9bJ3N0YXJ0ZWRfb24nXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZF9vbj1idWlsZF9pbmZvWydzdGFydGVkX29uJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29rZXJfbG9nX3BhdGg9YnVpbGRfaW5mb1snY29va2VyX2xvZ19wYXRoJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZF9uYW1lPWJ1aWxkX2luZm9bJ2J1aWxkX25hbWUnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdGJha2VfdmVyc2lvbj1idWlsZF9pbmZvWydiaXRiYWtlX3ZlcnNpb24nXSkKKworICAgICAgICBsb2dnZXIuZGVidWcoMSwgImJ1aWxkaW5mb2hlbHBlcjogYnVpbGQgaXMgY3JlYXRlZCAlcyIgJSBidWlsZCkKKworICAgICAgICBpZiBidWlsZHJlcXVlc3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBidWlsZHJlcXVlc3QuYnVpbGQgPSBidWlsZAorICAgICAgICAgICAgYnVpbGRyZXF1ZXN0LnNhdmUoKQorCisgICAgICAgIHJldHVybiBidWlsZAorCisgICAgZGVmIGNyZWF0ZV90YXJnZXRfb2JqZWN0cyhzZWxmLCB0YXJnZXRfaW5mbyk6CisgICAgICAgIGFzc2VydCAnYnVpbGQnIGluIHRhcmdldF9pbmZvCisgICAgICAgIGFzc2VydCAndGFyZ2V0cycgaW4gdGFyZ2V0X2luZm8KKworICAgICAgICB0YXJnZXRzID0gW10KKyAgICAgICAgZm9yIHRndF9uYW1lIGluIHRhcmdldF9pbmZvWyd0YXJnZXRzJ106CisgICAgICAgICAgICB0Z3Rfb2JqZWN0ID0gVGFyZ2V0Lm9iamVjdHMuY3JlYXRlKCBidWlsZCA9IHRhcmdldF9pbmZvWydidWlsZCddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGd0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19pbWFnZSA9IEZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgdGFyZ2V0cy5hcHBlbmQodGd0X29iamVjdCkKKyAgICAgICAgcmV0dXJuIHRhcmdldHMKKworICAgIGRlZiB1cGRhdGVfYnVpbGRfb2JqZWN0KHNlbGYsIGJ1aWxkLCBlcnJvcnMsIHdhcm5pbmdzLCB0YXNrZmFpbHVyZXMpOgorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShidWlsZCxCdWlsZCkKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoZXJyb3JzLCBpbnQpCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHdhcm5pbmdzLCBpbnQpCisKKyAgICAgICAgb3V0Y29tZSA9IEJ1aWxkLlNVQ0NFRURFRAorICAgICAgICBpZiBlcnJvcnMgb3IgdGFza2ZhaWx1cmVzOgorICAgICAgICAgICAgb3V0Y29tZSA9IEJ1aWxkLkZBSUxFRAorCisgICAgICAgIGJ1aWxkLmNvbXBsZXRlZF9vbiA9IHRpbWV6b25lLm5vdygpCisgICAgICAgIGJ1aWxkLm91dGNvbWUgPSBvdXRjb21lCisgICAgICAgIGJ1aWxkLnNhdmUoKQorCisgICAgZGVmIHVwZGF0ZV90YXJnZXRfc2V0X2xpY2Vuc2VfbWFuaWZlc3Qoc2VsZiwgdGFyZ2V0LCBsaWNlbnNlX21hbmlmZXN0X3BhdGgpOgorICAgICAgICB0YXJnZXQubGljZW5zZV9tYW5pZmVzdF9wYXRoID0gbGljZW5zZV9tYW5pZmVzdF9wYXRoCisgICAgICAgIHRhcmdldC5zYXZlKCkKKworICAgIGRlZiBnZXRfdXBkYXRlX3Rhc2tfb2JqZWN0KHNlbGYsIHRhc2tfaW5mb3JtYXRpb24sIG11c3RfZXhpc3QgPSBGYWxzZSk6CisgICAgICAgIGFzc2VydCAnYnVpbGQnIGluIHRhc2tfaW5mb3JtYXRpb24KKyAgICAgICAgYXNzZXJ0ICdyZWNpcGUnIGluIHRhc2tfaW5mb3JtYXRpb24KKyAgICAgICAgYXNzZXJ0ICd0YXNrX25hbWUnIGluIHRhc2tfaW5mb3JtYXRpb24KKworICAgICAgICAjIHdlIHVzZSBtdXN0X2V4aXN0IGluZm8gZm9yIGRhdGFiYXNlIGxvb2stdXAgb3B0aW1pemF0aW9uCisgICAgICAgIHRhc2tfb2JqZWN0LCBjcmVhdGVkID0gc2VsZi5fY2FjaGVkX2dldF9vcl9jcmVhdGUoVGFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkPXRhc2tfaW5mb3JtYXRpb25bJ2J1aWxkJ10sCisgICAgICAgICAgICAgICAgICAgICAgICByZWNpcGU9dGFza19pbmZvcm1hdGlvblsncmVjaXBlJ10sCisgICAgICAgICAgICAgICAgICAgICAgICB0YXNrX25hbWU9dGFza19pbmZvcm1hdGlvblsndGFza19uYW1lJ10KKyAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgaWYgY3JlYXRlZCBhbmQgbXVzdF9leGlzdDoKKyAgICAgICAgICAgIHRhc2tfaW5mb3JtYXRpb25bJ2RlYnVnJ10gPSAiYnVpbGQgaWQgJWQsIHJlY2lwZSBpZCAlZCIgJSAodGFza19pbmZvcm1hdGlvblsnYnVpbGQnXS5waywgdGFza19pbmZvcm1hdGlvblsncmVjaXBlJ10ucGspCisgICAgICAgICAgICByYWlzZSBOb3RFeGlzdGluZygiVGFzayBvYmplY3QgY3JlYXRlZCB3aGVuIGV4cGVjdGVkIHRvIGV4aXN0IiwgdGFza19pbmZvcm1hdGlvbikKKworICAgICAgICBvYmplY3RfY2hhbmdlZCA9IEZhbHNlCisgICAgICAgIGZvciB2IGluIHZhcnModGFza19vYmplY3QpOgorICAgICAgICAgICAgaWYgdiBpbiB0YXNrX2luZm9ybWF0aW9uLmtleXMoKToKKyAgICAgICAgICAgICAgICBpZiB2YXJzKHRhc2tfb2JqZWN0KVt2XSAhPSB0YXNrX2luZm9ybWF0aW9uW3ZdOgorICAgICAgICAgICAgICAgICAgICB2YXJzKHRhc2tfb2JqZWN0KVt2XSA9IHRhc2tfaW5mb3JtYXRpb25bdl0KKyAgICAgICAgICAgICAgICAgICAgb2JqZWN0X2NoYW5nZWQgPSBUcnVlCisKKyAgICAgICAgIyB1cGRhdGUgc2V0c2NlbmUtcmVsYXRlZCBpbmZvcm1hdGlvbiBpZiB0aGUgdGFzayBoYXMgYSBzZXRzY2VuZQorICAgICAgICBpZiB0YXNrX29iamVjdC5vdXRjb21lID09IFRhc2suT1VUQ09NRV9DT1ZFUkVEIGFuZCAxID09IHRhc2tfb2JqZWN0LmdldF9yZWxhdGVkX3NldHNjZW5lKCkuY291bnQoKToKKyAgICAgICAgICAgIHRhc2tfb2JqZWN0Lm91dGNvbWUgPSBUYXNrLk9VVENPTUVfQ0FDSEVECisgICAgICAgICAgICBvYmplY3RfY2hhbmdlZCA9IFRydWUKKworICAgICAgICAgICAgb3V0Y29tZV90YXNrX3NldHNjZW5lID0gVGFzay5vYmplY3RzLmdldCh0YXNrX2V4ZWN1dGVkPVRydWUsIGJ1aWxkID0gdGFza19vYmplY3QuYnVpbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNpcGUgPSB0YXNrX29iamVjdC5yZWNpcGUsIHRhc2tfbmFtZT10YXNrX29iamVjdC50YXNrX25hbWUrIl9zZXRzY2VuZSIpLm91dGNvbWUKKyAgICAgICAgICAgIGlmIG91dGNvbWVfdGFza19zZXRzY2VuZSA9PSBUYXNrLk9VVENPTUVfU1VDQ0VTUzoKKyAgICAgICAgICAgICAgICB0YXNrX29iamVjdC5zc3RhdGVfcmVzdWx0ID0gVGFzay5TU1RBVEVfUkVTVE9SRUQKKyAgICAgICAgICAgICAgICBvYmplY3RfY2hhbmdlZCA9IFRydWUKKyAgICAgICAgICAgIGVsaWYgb3V0Y29tZV90YXNrX3NldHNjZW5lID09IFRhc2suT1VUQ09NRV9GQUlMRUQ6CisgICAgICAgICAgICAgICAgdGFza19vYmplY3Quc3N0YXRlX3Jlc3VsdCA9IFRhc2suU1NUQVRFX0ZBSUxFRAorICAgICAgICAgICAgICAgIG9iamVjdF9jaGFuZ2VkID0gVHJ1ZQorCisgICAgICAgICMgbWFyayBkb3duIGR1cmF0aW9uIGlmIHdlIGhhdmUgYSBzdGFydCB0aW1lIGFuZCBhIGN1cnJlbnQgdGltZQorICAgICAgICBpZiAnc3RhcnRfdGltZScgaW4gdGFza19pbmZvcm1hdGlvbi5rZXlzKCkgYW5kICdlbmRfdGltZScgaW4gdGFza19pbmZvcm1hdGlvbi5rZXlzKCk6CisgICAgICAgICAgICBkdXJhdGlvbiA9IHRhc2tfaW5mb3JtYXRpb25bJ2VuZF90aW1lJ10gLSB0YXNrX2luZm9ybWF0aW9uWydzdGFydF90aW1lJ10KKyAgICAgICAgICAgIHRhc2tfb2JqZWN0LmVsYXBzZWRfdGltZSA9IGR1cmF0aW9uCisgICAgICAgICAgICBvYmplY3RfY2hhbmdlZCA9IFRydWUKKyAgICAgICAgICAgIGRlbCB0YXNrX2luZm9ybWF0aW9uWydzdGFydF90aW1lJ10KKyAgICAgICAgICAgIGRlbCB0YXNrX2luZm9ybWF0aW9uWydlbmRfdGltZSddCisKKyAgICAgICAgaWYgb2JqZWN0X2NoYW5nZWQ6CisgICAgICAgICAgICB0YXNrX29iamVjdC5zYXZlKCkKKyAgICAgICAgcmV0dXJuIHRhc2tfb2JqZWN0CisKKworICAgIGRlZiBnZXRfdXBkYXRlX3JlY2lwZV9vYmplY3Qoc2VsZiwgcmVjaXBlX2luZm9ybWF0aW9uLCBtdXN0X2V4aXN0ID0gRmFsc2UpOgorICAgICAgICBhc3NlcnQgJ2xheWVyX3ZlcnNpb24nIGluIHJlY2lwZV9pbmZvcm1hdGlvbgorICAgICAgICBhc3NlcnQgJ2ZpbGVfcGF0aCcgaW4gcmVjaXBlX2luZm9ybWF0aW9uCisgICAgICAgIGFzc2VydCAncGF0aGZsYWdzJyBpbiByZWNpcGVfaW5mb3JtYXRpb24KKworICAgICAgICBhc3NlcnQgbm90IHJlY2lwZV9pbmZvcm1hdGlvblsnZmlsZV9wYXRoJ10uc3RhcnRzd2l0aCgiLyIpICAgICAgIyB3ZSBzaG91bGQgaGF2ZSBsYXllci1yZWxhdGl2ZSBwYXRocyBhdCBhbGwgdGltZXMKKworICAgICAgICByZWNpcGVfb2JqZWN0LCBjcmVhdGVkID0gc2VsZi5fY2FjaGVkX2dldF9vcl9jcmVhdGUoUmVjaXBlLCBsYXllcl92ZXJzaW9uPXJlY2lwZV9pbmZvcm1hdGlvblsnbGF5ZXJfdmVyc2lvbiddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfcGF0aD1yZWNpcGVfaW5mb3JtYXRpb25bJ2ZpbGVfcGF0aCddLCBwYXRoZmxhZ3MgPSByZWNpcGVfaW5mb3JtYXRpb25bJ3BhdGhmbGFncyddKQorICAgICAgICBpZiBjcmVhdGVkIGFuZCBtdXN0X2V4aXN0OgorICAgICAgICAgICAgcmFpc2UgTm90RXhpc3RpbmcoIlJlY2lwZSBvYmplY3QgY3JlYXRlZCB3aGVuIGV4cGVjdGVkIHRvIGV4aXN0IiwgcmVjaXBlX2luZm9ybWF0aW9uKQorCisgICAgICAgIG9iamVjdF9jaGFuZ2VkID0gRmFsc2UKKyAgICAgICAgZm9yIHYgaW4gdmFycyhyZWNpcGVfb2JqZWN0KToKKyAgICAgICAgICAgIGlmIHYgaW4gcmVjaXBlX2luZm9ybWF0aW9uLmtleXMoKToKKyAgICAgICAgICAgICAgICBvYmplY3RfY2hhbmdlZCA9IFRydWUKKyAgICAgICAgICAgICAgICB2YXJzKHJlY2lwZV9vYmplY3QpW3ZdID0gcmVjaXBlX2luZm9ybWF0aW9uW3ZdCisKKyAgICAgICAgaWYgb2JqZWN0X2NoYW5nZWQ6CisgICAgICAgICAgICByZWNpcGVfb2JqZWN0LnNhdmUoKQorCisgICAgICAgIHJldHVybiByZWNpcGVfb2JqZWN0CisKKyAgICBkZWYgZ2V0X3VwZGF0ZV9sYXllcl92ZXJzaW9uX29iamVjdChzZWxmLCBidWlsZF9vYmosIGxheWVyX29iaiwgbGF5ZXJfdmVyc2lvbl9pbmZvcm1hdGlvbik6CisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGJ1aWxkX29iaiwgQnVpbGQpCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGxheWVyX29iaiwgTGF5ZXIpCisgICAgICAgIGFzc2VydCAnYnJhbmNoJyBpbiBsYXllcl92ZXJzaW9uX2luZm9ybWF0aW9uCisgICAgICAgIGFzc2VydCAnY29tbWl0JyBpbiBsYXllcl92ZXJzaW9uX2luZm9ybWF0aW9uCisgICAgICAgIGFzc2VydCAncHJpb3JpdHknIGluIGxheWVyX3ZlcnNpb25faW5mb3JtYXRpb24KKyAgICAgICAgYXNzZXJ0ICdsb2NhbF9wYXRoJyBpbiBsYXllcl92ZXJzaW9uX2luZm9ybWF0aW9uCisKKyAgICAgICAgbGF5ZXJfdmVyc2lvbl9vYmplY3QsIF8gPSBMYXllcl9WZXJzaW9uLm9iamVjdHMuZ2V0X29yX2NyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkID0gYnVpbGRfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIgPSBsYXllcl9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmFuY2ggPSBsYXllcl92ZXJzaW9uX2luZm9ybWF0aW9uWydicmFuY2gnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1pdCA9IGxheWVyX3ZlcnNpb25faW5mb3JtYXRpb25bJ2NvbW1pdCddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkgPSBsYXllcl92ZXJzaW9uX2luZm9ybWF0aW9uWydwcmlvcml0eSddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxfcGF0aCA9IGxheWVyX3ZlcnNpb25faW5mb3JtYXRpb25bJ2xvY2FsX3BhdGgnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLmxheWVyX3ZlcnNpb25fb2JqZWN0cy5hcHBlbmQobGF5ZXJfdmVyc2lvbl9vYmplY3QpCisKKyAgICAgICAgcmV0dXJuIGxheWVyX3ZlcnNpb25fb2JqZWN0CisKKyAgICBkZWYgZ2V0X3VwZGF0ZV9sYXllcl9vYmplY3Qoc2VsZiwgbGF5ZXJfaW5mb3JtYXRpb24sIGJyYmUpOgorICAgICAgICBhc3NlcnQgJ25hbWUnIGluIGxheWVyX2luZm9ybWF0aW9uCisgICAgICAgIGFzc2VydCAnbGF5ZXJfaW5kZXhfdXJsJyBpbiBsYXllcl9pbmZvcm1hdGlvbgorCisgICAgICAgIGlmIGJyYmUgaXMgTm9uZToKKyAgICAgICAgICAgIGxheWVyX29iamVjdCwgXyA9IExheWVyLm9iamVjdHMuZ2V0X29yX2NyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1sYXllcl9pbmZvcm1hdGlvblsnbmFtZSddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcl9pbmRleF91cmw9bGF5ZXJfaW5mb3JtYXRpb25bJ2xheWVyX2luZGV4X3VybCddKQorICAgICAgICAgICAgcmV0dXJuIGxheWVyX29iamVjdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyB3ZSBhcmUgdW5kZXIgbWFuYWdlZCBtb2RlOyB3ZSBtdXN0IG1hdGNoIHRoZSBsYXllciB1c2VkIGluIHRoZSBQcm9qZWN0IExheWVyCisgICAgICAgICAgICBicl9pZCwgYmVfaWQgPSBicmJlLnNwbGl0KCI6IikKKworICAgICAgICAgICAgIyBmaW5kIGxheWVyIGJ5IGNoZWNrb3V0IHBhdGg7CisgICAgICAgICAgICBmcm9tIGJsZGNvbnRyb2wgaW1wb3J0IGJiY29udHJvbGxlcgorICAgICAgICAgICAgYmMgPSBiYmNvbnRyb2xsZXIuZ2V0QnVpbGRFbnZpcm9ubWVudENvbnRyb2xsZXIocGsgPSBiZV9pZCkKKworICAgICAgICAgICAgIyB3ZSBtaWdodCBoYXZlIGEgcmFjZSBjb25kaXRpb24gaGVyZSwgYXMgdGhlIHByb2plY3QgbGF5ZXJzIG1heSBjaGFuZ2UgYmV0d2VlbiB0aGUgYnVpbGQgdHJpZ2dlciBhbmQgdGhlIGFjdHVhbCBidWlsZCBleGVjdXRpb24KKyAgICAgICAgICAgICMgYnV0IHdlIGNhbiBvbmx5IG1hdGNoIG9uIHRoZSBsYXllciBuYW1lLCBzbyB0aGUgd29yc3QgdGhpbmcgY2FuIGhhcHBlbiBpcyBhIG1pcy1pZGVudGlmaWNhdGlvbiBvZiB0aGUgbGF5ZXIsIG5vdCBhIHRvdGFsIGZhaWx1cmUKKworICAgICAgICAgICAgIyBub3RlIHRoYXQgdGhpcyBpcyBkaWZmZXJlbnQKKyAgICAgICAgICAgIGJ1aWxkcmVxdWVzdCA9IEJ1aWxkUmVxdWVzdC5vYmplY3RzLmdldChwayA9IGJyX2lkKQorICAgICAgICAgICAgZm9yIGJybCBpbiBidWlsZHJlcXVlc3QuYnJsYXllcl9zZXQuYWxsKCk6CisgICAgICAgICAgICAgICAgbG9jYWxkaXJuYW1lID0gb3MucGF0aC5qb2luKGJjLmdldEdpdENsb25lRGlyZWN0b3J5KGJybC5naXR1cmwsIGJybC5jb21taXQpLCBicmwuZGlycGF0aCkKKyAgICAgICAgICAgICAgICAjIHdlIGdldCBhIHJlbGF0aXZlIHBhdGgsIHVubGVzcyBydW5uaW5nIGluIEhFQUQgbW9kZSB3aGVyZSB0aGUgcGF0aCBpcyBhYnNvbHV0ZQorICAgICAgICAgICAgICAgIGlmIG5vdCBsb2NhbGRpcm5hbWUuc3RhcnRzd2l0aCgiLyIpOgorICAgICAgICAgICAgICAgICAgICBsb2NhbGRpcm5hbWUgPSBvcy5wYXRoLmpvaW4oYmMuYmUuc291cmNlZGlyLCBsb2NhbGRpcm5hbWUpCisgICAgICAgICAgICAgICAgI2xvZ2dlci5kZWJ1ZygxLCAiTG9jYWxkaXJuYW1lICVzIGxjYWxfcGF0aCAlcyIgJSAobG9jYWxkaXJuYW1lLCBsYXllcl9pbmZvcm1hdGlvblsnbG9jYWxfcGF0aCddKSkKKyAgICAgICAgICAgICAgICBpZiBsb2NhbGRpcm5hbWUuc3RhcnRzd2l0aChsYXllcl9pbmZvcm1hdGlvblsnbG9jYWxfcGF0aCddKToKKyAgICAgICAgICAgICAgICAgICAgIyB3ZSBtYXRjaGVkIHRoZSBCUkxheWVyLCBidXQgd2UgbmVlZCB0aGUgbGF5ZXJfdmVyc2lvbiB0aGF0IGdlbmVyYXRlZCB0aGlzIEJSOyByZXZlcnNlIG9mIHRoZSBQcm9qZWN0LnNjaGVkdWxlX2J1aWxkKCkKKyAgICAgICAgICAgICAgICAgICAgI2xvZ2dlci5kZWJ1ZygxLCAiTWF0Y2hlZCAlcyB0byBCUmxheWVyICVzIiAlIChwZm9ybWF0KGxheWVyX2luZm9ybWF0aW9uWyJsb2NhbF9wYXRoIl0pLCBsb2NhbGRpcm5hbWUpKQorICAgICAgICAgICAgICAgICAgICBmb3IgcGwgaW4gYnVpbGRyZXF1ZXN0LnByb2plY3QucHJvamVjdGxheWVyX3NldC5maWx0ZXIobGF5ZXJjb21taXRfX2xheWVyX19uYW1lID0gYnJsLm5hbWUpOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgcGwubGF5ZXJjb21taXQubGF5ZXIudmNzX3VybCA9PSBicmwuZ2l0dXJsIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllciA9IHBsLmxheWVyY29tbWl0LmxheWVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIuc2F2ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxheWVyCisKKyAgICAgICAgICAgIHJhaXNlIE5vdEV4aXN0aW5nKCJVbmlkZW50aWZpZWQgbGF5ZXIgJXMiICUgcGZvcm1hdChsYXllcl9pbmZvcm1hdGlvbikpCisKKworICAgIGRlZiBzYXZlX3RhcmdldF9maWxlX2luZm9ybWF0aW9uKHNlbGYsIGJ1aWxkX29iaiwgdGFyZ2V0X29iaiwgZmlsZWRhdGEpOgorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShidWlsZF9vYmosIEJ1aWxkKQorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh0YXJnZXRfb2JqLCBUYXJnZXQpCisgICAgICAgIGRpcnMgPSBmaWxlZGF0YVsnZGlycyddCisgICAgICAgIGZpbGVzID0gZmlsZWRhdGFbJ2ZpbGVzJ10KKyAgICAgICAgc3ltcyA9IGZpbGVkYXRhWydzeW1zJ10KKworICAgICAgICAjIHdlIGluc2VydCBkaXJlY3Rvcmllcywgb3JkZXJlZCBieSBuYW1lIGRlcHRoCisgICAgICAgIGZvciBkIGluIHNvcnRlZChkaXJzLCBrZXk9bGFtYmRhIHg6bGVuKHhbLTFdLnNwbGl0KCIvIikpKToKKyAgICAgICAgICAgICh1c2VyLCBncm91cCwgc2l6ZSkgPSBkWzE6NF0KKyAgICAgICAgICAgIHBlcm1pc3Npb24gPSBkWzBdWzE6XQorICAgICAgICAgICAgcGF0aCA9IGRbNF0ubHN0cmlwKCIuIikKKyAgICAgICAgICAgIGlmIGxlbihwYXRoKSA9PSAwOgorICAgICAgICAgICAgICAgICMgd2UgY3JlYXRlIHRoZSByb290IGRpcmVjdG9yeSBhcyBhIHNwZWNpYWwgY2FzZQorICAgICAgICAgICAgICAgIHBhdGggPSAiLyIKKyAgICAgICAgICAgICAgICB0Zl9vYmogPSBUYXJnZXRfRmlsZS5vYmplY3RzLmNyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5vZGV0eXBlID0gVGFyZ2V0X0ZpbGUuSVRZUEVfRElSRUNUT1JZLAorICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbiA9IHBlcm1pc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICBvd25lciA9IHVzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBncm91cCA9IGdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIHRmX29iai5kaXJlY3RvcnkgPSB0Zl9vYmoKKyAgICAgICAgICAgICAgICB0Zl9vYmouc2F2ZSgpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHBhcmVudF9wYXRoID0gIi8iLmpvaW4ocGF0aC5zcGxpdCgiLyIpWzpsZW4ocGF0aC5zcGxpdCgiLyIpKSAtIDFdKQorICAgICAgICAgICAgaWYgbGVuKHBhcmVudF9wYXRoKSA9PSAwOgorICAgICAgICAgICAgICAgIHBhcmVudF9wYXRoID0gIi8iCisgICAgICAgICAgICBwYXJlbnRfb2JqID0gc2VsZi5fY2FjaGVkX2dldChUYXJnZXRfRmlsZSwgdGFyZ2V0ID0gdGFyZ2V0X29iaiwgcGF0aCA9IHBhcmVudF9wYXRoLCBpbm9kZXR5cGUgPSBUYXJnZXRfRmlsZS5JVFlQRV9ESVJFQ1RPUlkpCisgICAgICAgICAgICB0Zl9vYmogPSBUYXJnZXRfRmlsZS5vYmplY3RzLmNyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5vZGV0eXBlID0gVGFyZ2V0X0ZpbGUuSVRZUEVfRElSRUNUT1JZLAorICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbiA9IHBlcm1pc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICBvd25lciA9IHVzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBncm91cCA9IGdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5ID0gcGFyZW50X29iaikKKworCisgICAgICAgICMgd2UgaW5zZXJ0IGZpbGVzCisgICAgICAgIGZvciBkIGluIGZpbGVzOgorICAgICAgICAgICAgKHVzZXIsIGdyb3VwLCBzaXplKSA9IGRbMTo0XQorICAgICAgICAgICAgcGVybWlzc2lvbiA9IGRbMF1bMTpdCisgICAgICAgICAgICBwYXRoID0gZFs0XS5sc3RyaXAoIi4iKQorICAgICAgICAgICAgcGFyZW50X3BhdGggPSAiLyIuam9pbihwYXRoLnNwbGl0KCIvIilbOmxlbihwYXRoLnNwbGl0KCIvIikpIC0gMV0pCisgICAgICAgICAgICBpbm9kZXR5cGUgPSBUYXJnZXRfRmlsZS5JVFlQRV9SRUdVTEFSCisgICAgICAgICAgICBpZiBkWzBdLnN0YXJ0c3dpdGgoJ2InKToKKyAgICAgICAgICAgICAgICBpbm9kZXR5cGUgPSBUYXJnZXRfRmlsZS5JVFlQRV9CTE9DSworICAgICAgICAgICAgaWYgZFswXS5zdGFydHN3aXRoKCdjJyk6CisgICAgICAgICAgICAgICAgaW5vZGV0eXBlID0gVGFyZ2V0X0ZpbGUuSVRZUEVfQ0hBUkFDVEVSCisgICAgICAgICAgICBpZiBkWzBdLnN0YXJ0c3dpdGgoJ3AnKToKKyAgICAgICAgICAgICAgICBpbm9kZXR5cGUgPSBUYXJnZXRfRmlsZS5JVFlQRV9GSUZPCisKKyAgICAgICAgICAgIHRmX29iaiA9IFRhcmdldF9GaWxlLm9iamVjdHMuY3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbm9kZXR5cGUgPSBpbm9kZXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uID0gcGVybWlzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyID0gdXNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gZ3JvdXApCisgICAgICAgICAgICBwYXJlbnRfb2JqID0gc2VsZi5fY2FjaGVkX2dldChUYXJnZXRfRmlsZSwgdGFyZ2V0ID0gdGFyZ2V0X29iaiwgcGF0aCA9IHBhcmVudF9wYXRoLCBpbm9kZXR5cGUgPSBUYXJnZXRfRmlsZS5JVFlQRV9ESVJFQ1RPUlkpCisgICAgICAgICAgICB0Zl9vYmouZGlyZWN0b3J5ID0gcGFyZW50X29iagorICAgICAgICAgICAgdGZfb2JqLnNhdmUoKQorCisgICAgICAgICMgd2UgaW5zZXJ0IHN5bWxpbmtzCisgICAgICAgIGZvciBkIGluIHN5bXM6CisgICAgICAgICAgICAodXNlciwgZ3JvdXAsIHNpemUpID0gZFsxOjRdCisgICAgICAgICAgICBwZXJtaXNzaW9uID0gZFswXVsxOl0KKyAgICAgICAgICAgIHBhdGggPSBkWzRdLmxzdHJpcCgiLiIpCisgICAgICAgICAgICBmaWxldGFyZ2V0X3BhdGggPSBkWzZdCisKKyAgICAgICAgICAgIHBhcmVudF9wYXRoID0gIi8iLmpvaW4ocGF0aC5zcGxpdCgiLyIpWzpsZW4ocGF0aC5zcGxpdCgiLyIpKSAtIDFdKQorICAgICAgICAgICAgaWYgbm90IGZpbGV0YXJnZXRfcGF0aC5zdGFydHN3aXRoKCIvIik6CisgICAgICAgICAgICAgICAgIyB3ZSBoYXZlIGEgcmVsYXRpdmUgcGF0aCwgZ2V0IGEgbm9ybWFsaXplZCBhYnNvbHV0ZSBvbmUKKyAgICAgICAgICAgICAgICBmaWxldGFyZ2V0X3BhdGggPSBwYXJlbnRfcGF0aCArICIvIiArIGZpbGV0YXJnZXRfcGF0aAorICAgICAgICAgICAgICAgIGZjcCA9IGZpbGV0YXJnZXRfcGF0aC5zcGxpdCgiLyIpCisgICAgICAgICAgICAgICAgZmNwbCA9IFtdCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gZmNwOgorICAgICAgICAgICAgICAgICAgICBpZiBpID09ICIuLiI6CisgICAgICAgICAgICAgICAgICAgICAgICBmY3BsLnBvcCgpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBmY3BsLmFwcGVuZChpKQorICAgICAgICAgICAgICAgIGZpbGV0YXJnZXRfcGF0aCA9ICIvIi5qb2luKGZjcGwpCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmaWxldGFyZ2V0X29iaiA9IFRhcmdldF9GaWxlLm9iamVjdHMuZ2V0KHRhcmdldCA9IHRhcmdldF9vYmosIHBhdGggPSBmaWxldGFyZ2V0X3BhdGgpCisgICAgICAgICAgICBleGNlcHQgVGFyZ2V0X0ZpbGUuRG9lc05vdEV4aXN0OgorICAgICAgICAgICAgICAgICMgd2UgbWlnaHQgaGF2ZSBhbiBpbnZhbGlkIGxpbms7IG5vIHdheSB0byBkZXRlY3QgdGhpcy4ganVzdCBzZXQgaXQgdG8gTm9uZQorICAgICAgICAgICAgICAgIGZpbGV0YXJnZXRfb2JqID0gTm9uZQorCisgICAgICAgICAgICBwYXJlbnRfb2JqID0gVGFyZ2V0X0ZpbGUub2JqZWN0cy5nZXQodGFyZ2V0ID0gdGFyZ2V0X29iaiwgcGF0aCA9IHBhcmVudF9wYXRoLCBpbm9kZXR5cGUgPSBUYXJnZXRfRmlsZS5JVFlQRV9ESVJFQ1RPUlkpCisKKyAgICAgICAgICAgIHRmX29iaiA9IFRhcmdldF9GaWxlLm9iamVjdHMuY3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbm9kZXR5cGUgPSBUYXJnZXRfRmlsZS5JVFlQRV9TWU1MSU5LLAorICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbiA9IHBlcm1pc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICBvd25lciA9IHVzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBncm91cCA9IGdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5ID0gcGFyZW50X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bV90YXJnZXQgPSBmaWxldGFyZ2V0X29iaikKKworCisgICAgZGVmIHNhdmVfdGFyZ2V0X3BhY2thZ2VfaW5mb3JtYXRpb24oc2VsZiwgYnVpbGRfb2JqLCB0YXJnZXRfb2JqLCBwYWNrYWdlZGljdCwgcGtncG5tYXAsIHJlY2lwZXMpOgorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShidWlsZF9vYmosIEJ1aWxkKQorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh0YXJnZXRfb2JqLCBUYXJnZXQpCisKKyAgICAgICAgZXJyb3Jtc2cgPSAiIgorICAgICAgICBmb3IgcCBpbiBwYWNrYWdlZGljdDoKKyAgICAgICAgICAgIHNlYXJjaG5hbWUgPSBwCisgICAgICAgICAgICBpZiAnT1BLR04nIGluIHBrZ3BubWFwW3BdLmtleXMoKToKKyAgICAgICAgICAgICAgICBzZWFyY2huYW1lID0gcGtncG5tYXBbcF1bJ09QS0dOJ10KKworICAgICAgICAgICAgcGFja2FnZWRpY3RbcF1bJ29iamVjdCddLCBjcmVhdGVkID0gUGFja2FnZS5vYmplY3RzLmdldF9vcl9jcmVhdGUoIGJ1aWxkID0gYnVpbGRfb2JqLCBuYW1lID0gc2VhcmNobmFtZSApCisgICAgICAgICAgICBpZiBjcmVhdGVkIG9yIHBhY2thZ2VkaWN0W3BdWydvYmplY3QnXS5zaXplID09IC0xOiAgICAjIHNhdmUgdGhlIGRhdGEgYW55d2F5IHdlIGNhbiwgbm90IGp1c3QgaWYgaXQgd2FzIG5vdCBjcmVhdGVkIGhlcmU7IGJ1ZyBbWU9DVE8gIzY4ODddCisgICAgICAgICAgICAgICAgIyBmaWxsIGluIGV2ZXJ5dGhpbmcgd2UgY2FuIGZyb20gdGhlIHJ1bnRpbWUtcmV2ZXJzZSBwYWNrYWdlIGRhdGEKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VkaWN0W3BdWydvYmplY3QnXS5yZWNpcGUgPSByZWNpcGVzW3BrZ3BubWFwW3BdWydQTiddXQorICAgICAgICAgICAgICAgICAgICBwYWNrYWdlZGljdFtwXVsnb2JqZWN0J10udmVyc2lvbiA9IHBrZ3BubWFwW3BdWydQViddCisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VkaWN0W3BdWydvYmplY3QnXS5pbnN0YWxsZWRfbmFtZSA9IHAKKyAgICAgICAgICAgICAgICAgICAgcGFja2FnZWRpY3RbcF1bJ29iamVjdCddLnJldmlzaW9uID0gcGtncG5tYXBbcF1bJ1BSJ10KKyAgICAgICAgICAgICAgICAgICAgcGFja2FnZWRpY3RbcF1bJ29iamVjdCddLmxpY2Vuc2UgPSBwa2dwbm1hcFtwXVsnTElDRU5TRSddCisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VkaWN0W3BdWydvYmplY3QnXS5zZWN0aW9uID0gcGtncG5tYXBbcF1bJ1NFQ1RJT04nXQorICAgICAgICAgICAgICAgICAgICBwYWNrYWdlZGljdFtwXVsnb2JqZWN0J10uc3VtbWFyeSA9IHBrZ3BubWFwW3BdWydTVU1NQVJZJ10KKyAgICAgICAgICAgICAgICAgICAgcGFja2FnZWRpY3RbcF1bJ29iamVjdCddLmRlc2NyaXB0aW9uID0gcGtncG5tYXBbcF1bJ0RFU0NSSVBUSU9OJ10KKyAgICAgICAgICAgICAgICAgICAgcGFja2FnZWRpY3RbcF1bJ29iamVjdCddLnNpemUgPSBpbnQocGtncG5tYXBbcF1bJ1BLR1NJWkUnXSkKKworICAgICAgICAgICAgICAgICMgbm8gZmlsZXMgcmVjb3JkZWQgZm9yIHRoaXMgcGFja2FnZSwgc28gc2F2ZSBmaWxlcyBpbmZvCisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VmaWxlX29iamVjdHMgPSBbXQorICAgICAgICAgICAgICAgICAgICBmb3IgdGFyZ2V0cGF0aCBpbiBwa2dwbm1hcFtwXVsnRklMRVNfSU5GTyddOgorICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ZmlsZXNpemUgPSBwa2dwbm1hcFtwXVsnRklMRVNfSU5GTyddW3RhcmdldHBhdGhdCisgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlZmlsZV9vYmplY3RzLmFwcGVuZChQYWNrYWdlX0ZpbGUoIHBhY2thZ2UgPSBwYWNrYWdlZGljdFtwXVsnb2JqZWN0J10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHRhcmdldHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHRhcmdldGZpbGVzaXplKSkKKyAgICAgICAgICAgICAgICAgICAgaWYgbGVuKHBhY2thZ2VmaWxlX29iamVjdHMpOgorICAgICAgICAgICAgICAgICAgICAgICAgUGFja2FnZV9GaWxlLm9iamVjdHMuYnVsa19jcmVhdGUocGFja2FnZWZpbGVfb2JqZWN0cykKKyAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICAgICAgZXJyb3Jtc2cgKz0gIiAgc3RwaTogS2V5IGVycm9yLCBwYWNrYWdlICVzIGtleSAlcyBcbiIgJSAoIHAsIGUgKQorCisgICAgICAgICAgICAjIHNhdmUgZGlzayBpbnN0YWxsZWQgc2l6ZQorICAgICAgICAgICAgcGFja2FnZWRpY3RbcF1bJ29iamVjdCddLmluc3RhbGxlZF9zaXplID0gcGFja2FnZWRpY3RbcF1bJ3NpemUnXQorICAgICAgICAgICAgcGFja2FnZWRpY3RbcF1bJ29iamVjdCddLnNhdmUoKQorCisgICAgICAgICAgICBUYXJnZXRfSW5zdGFsbGVkX1BhY2thZ2Uub2JqZWN0cy5jcmVhdGUodGFyZ2V0ID0gdGFyZ2V0X29iaiwgcGFja2FnZSA9IHBhY2thZ2VkaWN0W3BdWydvYmplY3QnXSkKKworICAgICAgICBwYWNrYWdlZGVwc19vYmpzID0gW10KKyAgICAgICAgZm9yIHAgaW4gcGFja2FnZWRpY3Q6CisgICAgICAgICAgICBmb3IgKHB4LGRlcHR5cGUpIGluIHBhY2thZ2VkaWN0W3BdWydkZXBlbmRzJ106CisgICAgICAgICAgICAgICAgaWYgZGVwdHlwZSA9PSAnZGVwZW5kcyc6CisgICAgICAgICAgICAgICAgICAgIHRkZXB0eXBlID0gUGFja2FnZV9EZXBlbmRlbmN5LlRZUEVfVFJERVBFTkRTCisgICAgICAgICAgICAgICAgZWxpZiBkZXB0eXBlID09ICdyZWNvbW1lbmRzJzoKKyAgICAgICAgICAgICAgICAgICAgdGRlcHR5cGUgPSBQYWNrYWdlX0RlcGVuZGVuY3kuVFlQRV9UUkVDT01NRU5EUworCisgICAgICAgICAgICAgICAgcGFja2FnZWRlcHNfb2Jqcy5hcHBlbmQoUGFja2FnZV9EZXBlbmRlbmN5KCBwYWNrYWdlID0gcGFja2FnZWRpY3RbcF1bJ29iamVjdCddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZHNfb24gPSBwYWNrYWdlZGljdFtweF1bJ29iamVjdCddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcF90eXBlID0gdGRlcHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0X29iaikpCisKKyAgICAgICAgaWYgbGVuKHBhY2thZ2VkZXBzX29ianMpID4gMDoKKyAgICAgICAgICAgIFBhY2thZ2VfRGVwZW5kZW5jeS5vYmplY3RzLmJ1bGtfY3JlYXRlKHBhY2thZ2VkZXBzX29ianMpCisKKyAgICAgICAgaWYgbGVuKGVycm9ybXNnKSA+IDA6CisgICAgICAgICAgICBsb2dnZXIud2FybigiYnVpbGRpbmZvaGVscGVyOiB0YXJnZXRfcGFja2FnZV9pbmZvIGNvdWxkIG5vdCBpZGVudGlmeSByZWNpcGVzOiBcbiVzIiwgZXJyb3Jtc2cpCisKKyAgICBkZWYgc2F2ZV90YXJnZXRfaW1hZ2VfZmlsZV9pbmZvcm1hdGlvbihzZWxmLCB0YXJnZXRfb2JqLCBmaWxlX25hbWUsIGZpbGVfc2l6ZSk6CisgICAgICAgIFRhcmdldF9JbWFnZV9GaWxlLm9iamVjdHMuY3JlYXRlKCB0YXJnZXQgPSB0YXJnZXRfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfbmFtZSA9IGZpbGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3NpemUgPSBmaWxlX3NpemUpCisKKyAgICBkZWYgc2F2ZV9hcnRpZmFjdF9pbmZvcm1hdGlvbihzZWxmLCBidWlsZF9vYmosIGZpbGVfbmFtZSwgZmlsZV9zaXplKToKKyAgICAgICAgIyB3ZSBza2lwIHRoZSBpbWFnZSBmaWxlcyBmcm9tIG90aGVyIGJ1aWxkcworICAgICAgICBpZiBUYXJnZXRfSW1hZ2VfRmlsZS5vYmplY3RzLmZpbHRlcihmaWxlX25hbWUgPSBmaWxlX25hbWUpLmNvdW50KCkgPiAwOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBkbyBub3QgdXBkYXRlIGFydGlmYWN0cyBmb3VuZCBpbiBvdGhlciBidWlsZHMKKyAgICAgICAgaWYgQnVpbGRBcnRpZmFjdC5vYmplY3RzLmZpbHRlcihmaWxlX25hbWUgPSBmaWxlX25hbWUpLmNvdW50KCkgPiAwOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgQnVpbGRBcnRpZmFjdC5vYmplY3RzLmNyZWF0ZShidWlsZCA9IGJ1aWxkX29iaiwgZmlsZV9uYW1lID0gZmlsZV9uYW1lLCBmaWxlX3NpemUgPSBmaWxlX3NpemUpCisKKyAgICBkZWYgY3JlYXRlX2xvZ21lc3NhZ2Uoc2VsZiwgbG9nX2luZm9ybWF0aW9uKToKKyAgICAgICAgYXNzZXJ0ICdidWlsZCcgaW4gbG9nX2luZm9ybWF0aW9uCisgICAgICAgIGFzc2VydCAnbGV2ZWwnIGluIGxvZ19pbmZvcm1hdGlvbgorICAgICAgICBhc3NlcnQgJ21lc3NhZ2UnIGluIGxvZ19pbmZvcm1hdGlvbgorCisgICAgICAgIGxvZ19vYmplY3QgPSBMb2dNZXNzYWdlLm9iamVjdHMuY3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGQgPSBsb2dfaW5mb3JtYXRpb25bJ2J1aWxkJ10sCisgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IGxvZ19pbmZvcm1hdGlvblsnbGV2ZWwnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBsb2dfaW5mb3JtYXRpb25bJ21lc3NhZ2UnXSkKKworICAgICAgICBmb3IgdiBpbiB2YXJzKGxvZ19vYmplY3QpOgorICAgICAgICAgICAgaWYgdiBpbiBsb2dfaW5mb3JtYXRpb24ua2V5cygpOgorICAgICAgICAgICAgICAgIHZhcnMobG9nX29iamVjdClbdl0gPSBsb2dfaW5mb3JtYXRpb25bdl0KKworICAgICAgICByZXR1cm4gbG9nX29iamVjdC5zYXZlKCkKKworCisgICAgZGVmIHNhdmVfYnVpbGRfcGFja2FnZV9pbmZvcm1hdGlvbihzZWxmLCBidWlsZF9vYmosIHBhY2thZ2VfaW5mbywgcmVjaXBlcyk6CisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGJ1aWxkX29iaiwgQnVpbGQpCisKKyAgICAgICAgIyBjcmVhdGUgYW5kIHNhdmUgdGhlIG9iamVjdAorICAgICAgICBwbmFtZSA9IHBhY2thZ2VfaW5mb1snUEtHJ10KKyAgICAgICAgaWYgJ09QS0dOJyBpbiBwYWNrYWdlX2luZm8ua2V5cygpOgorICAgICAgICAgICAgcG5hbWUgPSBwYWNrYWdlX2luZm9bJ09QS0dOJ10KKworICAgICAgICBicF9vYmplY3QsIF8gPSBQYWNrYWdlLm9iamVjdHMuZ2V0X29yX2NyZWF0ZSggYnVpbGQgPSBidWlsZF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gcG5hbWUgKQorCisgICAgICAgIGJwX29iamVjdC5pbnN0YWxsZWRfbmFtZSA9IHBhY2thZ2VfaW5mb1snUEtHJ10KKyAgICAgICAgYnBfb2JqZWN0LnJlY2lwZSA9IHJlY2lwZXNbcGFja2FnZV9pbmZvWydQTiddXQorICAgICAgICBicF9vYmplY3QudmVyc2lvbiA9IHBhY2thZ2VfaW5mb1snUEtHViddCisgICAgICAgIGJwX29iamVjdC5yZXZpc2lvbiA9IHBhY2thZ2VfaW5mb1snUEtHUiddCisgICAgICAgIGJwX29iamVjdC5zdW1tYXJ5ID0gcGFja2FnZV9pbmZvWydTVU1NQVJZJ10KKyAgICAgICAgYnBfb2JqZWN0LmRlc2NyaXB0aW9uID0gcGFja2FnZV9pbmZvWydERVNDUklQVElPTiddCisgICAgICAgIGJwX29iamVjdC5zaXplID0gaW50KHBhY2thZ2VfaW5mb1snUEtHU0laRSddKQorICAgICAgICBicF9vYmplY3Quc2VjdGlvbiA9IHBhY2thZ2VfaW5mb1snU0VDVElPTiddCisgICAgICAgIGJwX29iamVjdC5saWNlbnNlID0gcGFja2FnZV9pbmZvWydMSUNFTlNFJ10KKyAgICAgICAgYnBfb2JqZWN0LnNhdmUoKQorCisgICAgICAgICMgc2F2ZSBhbnkgYXR0YWNoZWQgZmlsZSBpbmZvcm1hdGlvbgorICAgICAgICBwYWNrYWdlZmlsZV9vYmplY3RzID0gW10KKyAgICAgICAgZm9yIHBhdGggaW4gcGFja2FnZV9pbmZvWydGSUxFU19JTkZPJ106CisgICAgICAgICAgICBwYWNrYWdlZmlsZV9vYmplY3RzLmFwcGVuZChQYWNrYWdlX0ZpbGUoIHBhY2thZ2UgPSBicF9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHBhY2thZ2VfaW5mb1snRklMRVNfSU5GTyddW3BhdGhdICkpCisgICAgICAgIGlmIGxlbihwYWNrYWdlZmlsZV9vYmplY3RzKToKKyAgICAgICAgICAgIFBhY2thZ2VfRmlsZS5vYmplY3RzLmJ1bGtfY3JlYXRlKHBhY2thZ2VmaWxlX29iamVjdHMpCisKKyAgICAgICAgZGVmIF9wb19ieW5hbWUocCk6CisgICAgICAgICAgICBwa2csIGNyZWF0ZWQgPSBQYWNrYWdlLm9iamVjdHMuZ2V0X29yX2NyZWF0ZShidWlsZCA9IGJ1aWxkX29iaiwgbmFtZSA9IHApCisgICAgICAgICAgICBpZiBjcmVhdGVkOgorICAgICAgICAgICAgICAgIHBrZy5zaXplID0gLTEKKyAgICAgICAgICAgICAgICBwa2cuc2F2ZSgpCisgICAgICAgICAgICByZXR1cm4gcGtnCisKKyAgICAgICAgcGFja2FnZWRlcHNfb2JqcyA9IFtdCisgICAgICAgICMgc2F2ZSBzb2Z0IGRlcGVuZGVuY3kgaW5mb3JtYXRpb24KKyAgICAgICAgaWYgJ1JERVBFTkRTJyBpbiBwYWNrYWdlX2luZm8gYW5kIHBhY2thZ2VfaW5mb1snUkRFUEVORFMnXToKKyAgICAgICAgICAgIGZvciBwIGluIGJiLnV0aWxzLmV4cGxvZGVfZGVwcyhwYWNrYWdlX2luZm9bJ1JERVBFTkRTJ10pOgorICAgICAgICAgICAgICAgIHBhY2thZ2VkZXBzX29ianMuYXBwZW5kKFBhY2thZ2VfRGVwZW5kZW5jeSggIHBhY2thZ2UgPSBicF9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgIGRlcGVuZHNfb24gPSBfcG9fYnluYW1lKHApLCBkZXBfdHlwZSA9IFBhY2thZ2VfRGVwZW5kZW5jeS5UWVBFX1JERVBFTkRTKSkKKyAgICAgICAgaWYgJ1JQUk9WSURFUycgaW4gcGFja2FnZV9pbmZvIGFuZCBwYWNrYWdlX2luZm9bJ1JQUk9WSURFUyddOgorICAgICAgICAgICAgZm9yIHAgaW4gYmIudXRpbHMuZXhwbG9kZV9kZXBzKHBhY2thZ2VfaW5mb1snUlBST1ZJREVTJ10pOgorICAgICAgICAgICAgICAgIHBhY2thZ2VkZXBzX29ianMuYXBwZW5kKFBhY2thZ2VfRGVwZW5kZW5jeSggIHBhY2thZ2UgPSBicF9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgIGRlcGVuZHNfb24gPSBfcG9fYnluYW1lKHApLCBkZXBfdHlwZSA9IFBhY2thZ2VfRGVwZW5kZW5jeS5UWVBFX1JQUk9WSURFUykpCisgICAgICAgIGlmICdSUkVDT01NRU5EUycgaW4gcGFja2FnZV9pbmZvIGFuZCBwYWNrYWdlX2luZm9bJ1JSRUNPTU1FTkRTJ106CisgICAgICAgICAgICBmb3IgcCBpbiBiYi51dGlscy5leHBsb2RlX2RlcHMocGFja2FnZV9pbmZvWydSUkVDT01NRU5EUyddKToKKyAgICAgICAgICAgICAgICBwYWNrYWdlZGVwc19vYmpzLmFwcGVuZChQYWNrYWdlX0RlcGVuZGVuY3koICBwYWNrYWdlID0gYnBfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICBkZXBlbmRzX29uID0gX3BvX2J5bmFtZShwKSwgZGVwX3R5cGUgPSBQYWNrYWdlX0RlcGVuZGVuY3kuVFlQRV9SUkVDT01NRU5EUykpCisgICAgICAgIGlmICdSU1VHR0VTVFMnIGluIHBhY2thZ2VfaW5mbyBhbmQgcGFja2FnZV9pbmZvWydSU1VHR0VTVFMnXToKKyAgICAgICAgICAgIGZvciBwIGluIGJiLnV0aWxzLmV4cGxvZGVfZGVwcyhwYWNrYWdlX2luZm9bJ1JTVUdHRVNUUyddKToKKyAgICAgICAgICAgICAgICBwYWNrYWdlZGVwc19vYmpzLmFwcGVuZChQYWNrYWdlX0RlcGVuZGVuY3koICBwYWNrYWdlID0gYnBfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICBkZXBlbmRzX29uID0gX3BvX2J5bmFtZShwKSwgZGVwX3R5cGUgPSBQYWNrYWdlX0RlcGVuZGVuY3kuVFlQRV9SU1VHR0VTVFMpKQorICAgICAgICBpZiAnUlJFUExBQ0VTJyBpbiBwYWNrYWdlX2luZm8gYW5kIHBhY2thZ2VfaW5mb1snUlJFUExBQ0VTJ106CisgICAgICAgICAgICBmb3IgcCBpbiBiYi51dGlscy5leHBsb2RlX2RlcHMocGFja2FnZV9pbmZvWydSUkVQTEFDRVMnXSk6CisgICAgICAgICAgICAgICAgcGFja2FnZWRlcHNfb2Jqcy5hcHBlbmQoUGFja2FnZV9EZXBlbmRlbmN5KCAgcGFja2FnZSA9IGJwX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgZGVwZW5kc19vbiA9IF9wb19ieW5hbWUocCksIGRlcF90eXBlID0gUGFja2FnZV9EZXBlbmRlbmN5LlRZUEVfUlJFUExBQ0VTKSkKKyAgICAgICAgaWYgJ1JDT05GTElDVFMnIGluIHBhY2thZ2VfaW5mbyBhbmQgcGFja2FnZV9pbmZvWydSQ09ORkxJQ1RTJ106CisgICAgICAgICAgICBmb3IgcCBpbiBiYi51dGlscy5leHBsb2RlX2RlcHMocGFja2FnZV9pbmZvWydSQ09ORkxJQ1RTJ10pOgorICAgICAgICAgICAgICAgIHBhY2thZ2VkZXBzX29ianMuYXBwZW5kKFBhY2thZ2VfRGVwZW5kZW5jeSggIHBhY2thZ2UgPSBicF9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgIGRlcGVuZHNfb24gPSBfcG9fYnluYW1lKHApLCBkZXBfdHlwZSA9IFBhY2thZ2VfRGVwZW5kZW5jeS5UWVBFX1JDT05GTElDVFMpKQorCisgICAgICAgIGlmIGxlbihwYWNrYWdlZGVwc19vYmpzKSA+IDA6CisgICAgICAgICAgICBQYWNrYWdlX0RlcGVuZGVuY3kub2JqZWN0cy5idWxrX2NyZWF0ZShwYWNrYWdlZGVwc19vYmpzKQorCisgICAgICAgIHJldHVybiBicF9vYmplY3QKKworICAgIGRlZiBzYXZlX2J1aWxkX3ZhcmlhYmxlcyhzZWxmLCBidWlsZF9vYmosIHZhcmR1bXApOgorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShidWlsZF9vYmosIEJ1aWxkKQorCisgICAgICAgIGhlbHB0ZXh0X29iamVjdHMgPSBbXQorICAgICAgICBmb3IgayBpbiB2YXJkdW1wOgorICAgICAgICAgICAgZGVzYyA9IHZhcmR1bXBba11bJ2RvYyddCisgICAgICAgICAgICBpZiBkZXNjIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgdmFyX3dvcmRzID0gW3dvcmQgZm9yIHdvcmQgaW4gay5zcGxpdCgnXycpXQorICAgICAgICAgICAgICAgIHJvb3RfdmFyID0gIl8iLmpvaW4oW3dvcmQgZm9yIHdvcmQgaW4gdmFyX3dvcmRzIGlmIHdvcmQuaXN1cHBlcigpXSkKKyAgICAgICAgICAgICAgICBpZiByb290X3ZhciBhbmQgcm9vdF92YXIgIT0gayBhbmQgcm9vdF92YXIgaW4gdmFyZHVtcDoKKyAgICAgICAgICAgICAgICAgICAgZGVzYyA9IHZhcmR1bXBbcm9vdF92YXJdWydkb2MnXQorICAgICAgICAgICAgaWYgZGVzYyBpcyBOb25lOgorICAgICAgICAgICAgICAgIGRlc2MgPSAnJworICAgICAgICAgICAgaWYgbGVuKGRlc2MpOgorICAgICAgICAgICAgICAgIGhlbHB0ZXh0X29iamVjdHMuYXBwZW5kKEhlbHBUZXh0KGJ1aWxkPWJ1aWxkX29iaiwKKyAgICAgICAgICAgICAgICAgICAgYXJlYT1IZWxwVGV4dC5WQVJJQUJMRSwKKyAgICAgICAgICAgICAgICAgICAga2V5PWssCisgICAgICAgICAgICAgICAgICAgIHRleHQ9ZGVzYykpCisgICAgICAgICAgICBpZiBub3QgYm9vbCh2YXJkdW1wW2tdWydmdW5jJ10pOgorICAgICAgICAgICAgICAgIHZhbHVlID0gdmFyZHVtcFtrXVsndiddCisgICAgICAgICAgICAgICAgaWYgdmFsdWUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAnJworICAgICAgICAgICAgICAgIHZhcmlhYmxlX29iaiA9IFZhcmlhYmxlLm9iamVjdHMuY3JlYXRlKCBidWlsZCA9IGJ1aWxkX29iaiwKKyAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVfbmFtZSA9IGssCisgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlX3ZhbHVlID0gdmFsdWUsCisgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gZGVzYykKKworICAgICAgICAgICAgICAgIHZhcmhpc3Rfb2JqZWN0cyA9IFtdCisgICAgICAgICAgICAgICAgZm9yIHZoIGluIHZhcmR1bXBba11bJ2hpc3RvcnknXToKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90ICdkb2N1bWVudGF0aW9uLmNvbmYnIGluIHZoWydmaWxlJ106CisgICAgICAgICAgICAgICAgICAgICAgICB2YXJoaXN0X29iamVjdHMuYXBwZW5kKFZhcmlhYmxlSGlzdG9yeSggdmFyaWFibGUgPSB2YXJpYWJsZV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfbmFtZSA9IHZoWydmaWxlJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbnVtYmVyID0gdmhbJ2xpbmUnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gdmhbJ29wJ10pKQorICAgICAgICAgICAgICAgIGlmIGxlbih2YXJoaXN0X29iamVjdHMpOgorICAgICAgICAgICAgICAgICAgICBWYXJpYWJsZUhpc3Rvcnkub2JqZWN0cy5idWxrX2NyZWF0ZSh2YXJoaXN0X29iamVjdHMpCisKKyAgICAgICAgSGVscFRleHQub2JqZWN0cy5idWxrX2NyZWF0ZShoZWxwdGV4dF9vYmplY3RzKQorCisKK2NsYXNzIE1vY2tFdmVudChvYmplY3QpOgorICAgICIiIiBUaGlzIG9iamVjdCBpcyB1c2VkIHRvIGNyZWF0ZSBldmVudCwgZm9yIHdoaWNoIG5vcm1hbCBldmVudC1wcm9jZXNzaW5nIG1ldGhvZHMgY2FuCisgICAgICAgIGJlIHVzZWQsIG91dCBvZiBkYXRhIHRoYXQgaXMgbm90IGNvbWluZyB2aWEgYW4gYWN0dWFsIGV2ZW50CisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLm1zZyA9IE5vbmUKKyAgICAgICAgc2VsZi5sZXZlbG5vID0gTm9uZQorICAgICAgICBzZWxmLnRhc2tuYW1lID0gTm9uZQorICAgICAgICBzZWxmLnRhc2toYXNoID0gTm9uZQorICAgICAgICBzZWxmLnBhdGhuYW1lID0gTm9uZQorICAgICAgICBzZWxmLmxpbmVubyA9IE5vbmUKKworCitjbGFzcyBCdWlsZEluZm9IZWxwZXIob2JqZWN0KToKKyAgICAiIiIgVGhpcyBjbGFzcyBnYXRoZXJzIHRoZSBidWlsZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzZXJ2ZXIgYW5kIHNlbmRzIGl0CisgICAgICAgIHRvd2FyZHMgdGhlIE9STSB3cmFwcGVyIGZvciBzdG9yaW5nIGluIHRoZSBkYXRhYmFzZQorICAgICAgICBJdCBpcyBpbnN0YW50aWF0ZWQgb25jZSBwZXIgYnVpbGQKKyAgICAgICAgS2VlcHMgaW4gbWVtb3J5IGFsbCBkYXRhIHRoYXQgbmVlZHMgbWF0Y2hpbmcgYmVmb3JlIHdyaXRpbmcgaXQgdG8gdGhlIGRhdGFiYXNlCisgICAgIiIiCisKKyAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgIyB0aGUgY29kZSB3aWxsIGxvb2sgaW50byB0aGUgcHJvdGVjdGVkIHZhcmlhYmxlcyBvZiB0aGUgZXZlbnQ7IG5vIGVhc3kgd2F5IGFyb3VuZCB0aGlzCisgICAgIyBweWxpbnQ6IGRpc2FibGU9YmFkLWNvbnRpbnVhdGlvbgorICAgICMgd2UgZG8gbm90IGZvbGxvdyB0aGUgcHl0aG9uIGNvbnZlbnRpb25zIGZvciBjb250aW51YXRpb24gaW5kZW50YXRpb24gZHVlIHRvIGxvbmcgbGluZXMgaGVyZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcnZlciwgaGFzX2J1aWxkX2hpc3RvcnkgPSBGYWxzZSk6CisgICAgICAgIHNlbGYuaW50ZXJuYWxfc3RhdGUgPSB7fQorICAgICAgICBzZWxmLmludGVybmFsX3N0YXRlWyd0YXNrZGF0YSddID0ge30KKyAgICAgICAgc2VsZi50YXNrX29yZGVyID0gMAorICAgICAgICBzZWxmLmF1dG9jb21taXRfc3RlcCA9IDEKKyAgICAgICAgc2VsZi5zZXJ2ZXIgPSBzZXJ2ZXIKKyAgICAgICAgIyB3ZSB1c2UgbWFudWFsIHRyYW5zYWN0aW9ucyBpZiB0aGUgZGF0YWJhc2UgZG9lc24ndCBhdXRvY29tbWl0IG9uIHVzCisgICAgICAgIGlmIG5vdCBjb25uZWN0aW9uLmZlYXR1cmVzLmF1dG9jb21taXRzX3doZW5fYXV0b2NvbW1pdF9pc19vZmY6CisgICAgICAgICAgICB0cmFuc2FjdGlvbi5zZXRfYXV0b2NvbW1pdChGYWxzZSkKKyAgICAgICAgc2VsZi5vcm1fd3JhcHBlciA9IE9STVdyYXBwZXIoKQorICAgICAgICBzZWxmLmhhc19idWlsZF9oaXN0b3J5ID0gaGFzX2J1aWxkX2hpc3RvcnkKKyAgICAgICAgc2VsZi50bXBfZGlyID0gc2VsZi5zZXJ2ZXIucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIlRNUERJUiJdKVswXQorICAgICAgICBzZWxmLmJyYmUgICAgPSBzZWxmLnNlcnZlci5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiVE9BU1RFUl9CUkJFIl0pWzBdCisgICAgICAgIHNlbGYucHJvamVjdCA9IHNlbGYuc2VydmVyLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJUT0FTVEVSX1BST0pFQ1QiXSlbMF0KKyAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJidWlsZGluZm9oZWxwZXI6IEJ1aWxkIGluZm8gaGVscGVyIGluaXRlZCAlcyIgJSB2YXJzKHNlbGYpKQorCisKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIyMgbWV0aG9kcyB0byBjb252ZXJ0IGV2ZW50L2V4dGVybmFsIGluZm8gaW50byBvYmplY3RzIHRoYXQgdGhlIE9STSBsYXllciB1c2VzCisKKworICAgIGRlZiBfZ2V0X2J1aWxkX2luZm9ybWF0aW9uKHNlbGYpOgorICAgICAgICBidWlsZF9pbmZvID0ge30KKyAgICAgICAgIyBHZW5lcmF0ZSBhbiBpZGVudGlmaWVyIGZvciBlYWNoIG5ldyBidWlsZAorCisgICAgICAgIGJ1aWxkX2luZm9bJ21hY2hpbmUnXSA9IHNlbGYuc2VydmVyLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJNQUNISU5FIl0pWzBdCisgICAgICAgIGJ1aWxkX2luZm9bJ2Rpc3RybyddID0gc2VsZi5zZXJ2ZXIucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIkRJU1RSTyJdKVswXQorICAgICAgICBidWlsZF9pbmZvWydkaXN0cm9fdmVyc2lvbiddID0gc2VsZi5zZXJ2ZXIucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIkRJU1RST19WRVJTSU9OIl0pWzBdCisgICAgICAgIGJ1aWxkX2luZm9bJ3N0YXJ0ZWRfb24nXSA9IHRpbWV6b25lLm5vdygpCisgICAgICAgIGJ1aWxkX2luZm9bJ2NvbXBsZXRlZF9vbiddID0gdGltZXpvbmUubm93KCkKKyAgICAgICAgYnVpbGRfaW5mb1snY29va2VyX2xvZ19wYXRoJ10gPSBzZWxmLnNlcnZlci5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiQkJfQ09OU09MRUxPRyJdKVswXQorICAgICAgICBidWlsZF9pbmZvWydidWlsZF9uYW1lJ10gPSBzZWxmLnNlcnZlci5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiQlVJTEROQU1FIl0pWzBdCisgICAgICAgIGJ1aWxkX2luZm9bJ2JpdGJha2VfdmVyc2lvbiddID0gc2VsZi5zZXJ2ZXIucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIkJCX1ZFUlNJT04iXSlbMF0KKworICAgICAgICByZXR1cm4gYnVpbGRfaW5mbworCisgICAgZGVmIF9nZXRfdGFza19pbmZvcm1hdGlvbihzZWxmLCBldmVudCwgcmVjaXBlKToKKyAgICAgICAgYXNzZXJ0ICd0YXNrbmFtZScgaW4gdmFycyhldmVudCkKKworICAgICAgICB0YXNrX2luZm9ybWF0aW9uID0ge30KKyAgICAgICAgdGFza19pbmZvcm1hdGlvblsnYnVpbGQnXSA9IHNlbGYuaW50ZXJuYWxfc3RhdGVbJ2J1aWxkJ10KKyAgICAgICAgdGFza19pbmZvcm1hdGlvblsnb3V0Y29tZSddID0gVGFzay5PVVRDT01FX05BCisgICAgICAgIHRhc2tfaW5mb3JtYXRpb25bJ3JlY2lwZSddID0gcmVjaXBlCisgICAgICAgIHRhc2tfaW5mb3JtYXRpb25bJ3Rhc2tfbmFtZSddID0gZXZlbnQudGFza25hbWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBzb21lIHRhc2tzIGRvbid0IGNvbWUgd2l0aCBhIGhhc2guIGFuZCB0aGF0J3Mgb2sKKyAgICAgICAgICAgIHRhc2tfaW5mb3JtYXRpb25bJ3NzdGF0ZV9jaGVja3N1bSddID0gZXZlbnQudGFza2hhc2gKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICByZXR1cm4gdGFza19pbmZvcm1hdGlvbgorCisgICAgZGVmIF9nZXRfbGF5ZXJfdmVyc2lvbl9mb3JfcGF0aChzZWxmLCBwYXRoKToKKyAgICAgICAgYXNzZXJ0IHBhdGguc3RhcnRzd2l0aCgiLyIpCisgICAgICAgIGFzc2VydCAnYnVpbGQnIGluIHNlbGYuaW50ZXJuYWxfc3RhdGUKKworICAgICAgICBpZiBzZWxmLmJyYmUgaXMgTm9uZToKKyAgICAgICAgICAgIGRlZiBfc2xrZXlfaW50ZXJhY3RpdmUobGF5ZXJfdmVyc2lvbik6CisgICAgICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UobGF5ZXJfdmVyc2lvbiwgTGF5ZXJfVmVyc2lvbikKKyAgICAgICAgICAgICAgICByZXR1cm4gbGVuKGxheWVyX3ZlcnNpb24ubG9jYWxfcGF0aCkKKworICAgICAgICAgICAgIyBIZXVyaXN0aWNzOiB3ZSBhbHdheXMgbWF0Y2ggcmVjaXBlIHRvIHRoZSBkZWVwZXN0IGxheWVyIHBhdGggaW4gdGhlIGRpc2NvdmVyZWQgbGF5ZXJzCisgICAgICAgICAgICBmb3IgbHZvIGluIHNvcnRlZChzZWxmLm9ybV93cmFwcGVyLmxheWVyX3ZlcnNpb25fb2JqZWN0cywgcmV2ZXJzZT1UcnVlLCBrZXk9X3Nsa2V5X2ludGVyYWN0aXZlKToKKyAgICAgICAgICAgICAgICAjIHdlIGNhbiBtYXRjaCB0byB0aGUgcmVjaXBlIGZpbGUgcGF0aAorICAgICAgICAgICAgICAgIGlmIHBhdGguc3RhcnRzd2l0aChsdm8ubG9jYWxfcGF0aCk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsdm8KKworICAgICAgICBlbHNlOgorICAgICAgICAgICAgYnJfaWQsIGJlX2lkID0gc2VsZi5icmJlLnNwbGl0KCI6IikKKyAgICAgICAgICAgIGZyb20gYmxkY29udHJvbC5iYmNvbnRyb2xsZXIgaW1wb3J0IGdldEJ1aWxkRW52aXJvbm1lbnRDb250cm9sbGVyCisgICAgICAgICAgICBiYyA9IGdldEJ1aWxkRW52aXJvbm1lbnRDb250cm9sbGVyKHBrID0gYmVfaWQpCisKKyAgICAgICAgICAgIGRlZiBfc2xrZXlfbWFuYWdlZChsYXllcl92ZXJzaW9uKToKKyAgICAgICAgICAgICAgICByZXR1cm4gbGVuKGJjLmdldEdpdENsb25lRGlyZWN0b3J5KGxheWVyX3ZlcnNpb24uZ2l0dXJsLCBsYXllcl92ZXJzaW9uLmNvbW1pdCkgKyBsYXllcl92ZXJzaW9uLmRpcnBhdGgpCisKKyAgICAgICAgICAgICMgSGV1cmlzdGljczogd2UgbWF0Y2ggdGhlIHBhdGggdG8gd2hlcmUgdGhlIGxheWVycyBoYXZlIGJlZW4gY2hlY2tlZCBvdXQKKyAgICAgICAgICAgIGZvciBicmwgaW4gc29ydGVkKEJ1aWxkUmVxdWVzdC5vYmplY3RzLmdldChwayA9IGJyX2lkKS5icmxheWVyX3NldC5hbGwoKSwgcmV2ZXJzZSA9IFRydWUsIGtleSA9IF9zbGtleV9tYW5hZ2VkKToKKyAgICAgICAgICAgICAgICBsb2NhbGRpcm5hbWUgPSBvcy5wYXRoLmpvaW4oYmMuZ2V0R2l0Q2xvbmVEaXJlY3RvcnkoYnJsLmdpdHVybCwgYnJsLmNvbW1pdCksIGJybC5kaXJwYXRoKQorICAgICAgICAgICAgICAgICMgd2UgZ2V0IGEgcmVsYXRpdmUgcGF0aCwgdW5sZXNzIHJ1bm5pbmcgaW4gSEVBRCBtb2RlIHdoZXJlIHRoZSBwYXRoIGlzIGFic29sdXRlCisgICAgICAgICAgICAgICAgaWYgbm90IGxvY2FsZGlybmFtZS5zdGFydHN3aXRoKCIvIik6CisgICAgICAgICAgICAgICAgICAgIGxvY2FsZGlybmFtZSA9IG9zLnBhdGguam9pbihiYy5iZS5zb3VyY2VkaXIsIGxvY2FsZGlybmFtZSkKKyAgICAgICAgICAgICAgICBpZiBwYXRoLnN0YXJ0c3dpdGgobG9jYWxkaXJuYW1lKToKKyAgICAgICAgICAgICAgICAgICAgI2xvZ2dlci53YXJuKCItLSBtYW5hZ2VkOiBtYXRjaGVkIHBhdGggJXMgd2l0aCBsYXllciAlcyAiICUgKHBhdGgsIGxvY2FsZGlybmFtZSkpCisgICAgICAgICAgICAgICAgICAgICMgd2UgbWF0Y2hlZCB0aGUgQlJMYXllciwgYnV0IHdlIG5lZWQgdGhlIGxheWVyX3ZlcnNpb24gdGhhdCBnZW5lcmF0ZWQgdGhpcyBicgorICAgICAgICAgICAgICAgICAgICBmb3IgbHZvIGluIHNlbGYub3JtX3dyYXBwZXIubGF5ZXJfdmVyc2lvbl9vYmplY3RzOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgYnJsLm5hbWUgPT0gbHZvLmxheWVyLm5hbWU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGx2bworCisgICAgICAgICNpZiB3ZSBnZXQgaGVyZSwgd2UgZGlkbid0IHJlYWQgbGF5ZXJzIGNvcnJlY3RseTsgZHVtcCB3aGF0ZXZlciBpbmZvcm1hdGlvbiB3ZSBoYXZlIG9uIHRoZSBlcnJvciBsb2cKKyAgICAgICAgbG9nZ2VyLndhcm4oIkNvdWxkIG5vdCBtYXRjaCBsYXllciB2ZXJzaW9uIGZvciByZWNpcGUgcGF0aCAlcyA6ICVzIiwgcGF0aCwgc2VsZi5vcm1fd3JhcHBlci5sYXllcl92ZXJzaW9uX29iamVjdHMpCisKKyAgICAgICAgI21vY2t1cCB0aGUgbmV3IGxheWVyCisgICAgICAgIHVua25vd25fbGF5ZXIsIF8gPSBMYXllci5vYmplY3RzLmdldF9vcl9jcmVhdGUobmFtZT0iX19GSVhNRV9fdW5pZGVudGlmaWVkX2xheWVyIiwgbGF5ZXJfaW5kZXhfdXJsPSIiKQorICAgICAgICB1bmtub3duX2xheWVyX3ZlcnNpb25fb2JqLCBfID0gTGF5ZXJfVmVyc2lvbi5vYmplY3RzLmdldF9vcl9jcmVhdGUobGF5ZXIgPSB1bmtub3duX2xheWVyLCBidWlsZCA9IHNlbGYuaW50ZXJuYWxfc3RhdGVbJ2J1aWxkJ10pCisKKyAgICAgICAgIyBhcHBlbmQgaXQgc28gd2UgZG9uJ3QgcnVuIGludG8gdGhpcyBlcnJvciBhZ2FpbiBhbmQgYWdhaW4KKyAgICAgICAgc2VsZi5vcm1fd3JhcHBlci5sYXllcl92ZXJzaW9uX29iamVjdHMuYXBwZW5kKHVua25vd25fbGF5ZXJfdmVyc2lvbl9vYmopCisKKyAgICAgICAgcmV0dXJuIHVua25vd25fbGF5ZXJfdmVyc2lvbl9vYmoKKworICAgIGRlZiBfZ2V0X3JlY2lwZV9pbmZvcm1hdGlvbl9mcm9tX3Rhc2tmaWxlKHNlbGYsIHRhc2tmaWxlKToKKyAgICAgICAgbG9jYWxmaWxlcGF0aCA9IHRhc2tmaWxlLnNwbGl0KCI6IilbLTFdCisgICAgICAgIGZpbGVwYXRoX2ZsYWdzID0gIjoiLmpvaW4oc29ydGVkKHRhc2tmaWxlLnNwbGl0KCI6IilbOi0xXSkpCisgICAgICAgIGxheWVyX3ZlcnNpb25fb2JqID0gc2VsZi5fZ2V0X2xheWVyX3ZlcnNpb25fZm9yX3BhdGgobG9jYWxmaWxlcGF0aCkKKworCisKKyAgICAgICAgcmVjaXBlX2luZm8gPSB7fQorICAgICAgICByZWNpcGVfaW5mb1snbGF5ZXJfdmVyc2lvbiddID0gbGF5ZXJfdmVyc2lvbl9vYmoKKyAgICAgICAgcmVjaXBlX2luZm9bJ2ZpbGVfcGF0aCddID0gbG9jYWxmaWxlcGF0aAorICAgICAgICByZWNpcGVfaW5mb1sncGF0aGZsYWdzJ10gPSBmaWxlcGF0aF9mbGFncworCisgICAgICAgIGlmIHJlY2lwZV9pbmZvWydmaWxlX3BhdGgnXS5zdGFydHN3aXRoKHJlY2lwZV9pbmZvWydsYXllcl92ZXJzaW9uJ10ubG9jYWxfcGF0aCk6CisgICAgICAgICAgICByZWNpcGVfaW5mb1snZmlsZV9wYXRoJ10gPSByZWNpcGVfaW5mb1snZmlsZV9wYXRoJ11bbGVuKHJlY2lwZV9pbmZvWydsYXllcl92ZXJzaW9uJ10ubG9jYWxfcGF0aCk6XS5sc3RyaXAoIi8iKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJSZWNpcGUgZmlsZSBwYXRoICVzIGlzIG5vdCB1bmRlciBsYXllciB2ZXJzaW9uIGF0ICVzIiAlIChyZWNpcGVfaW5mb1snZmlsZV9wYXRoJ10sIHJlY2lwZV9pbmZvWydsYXllcl92ZXJzaW9uJ10ubG9jYWxfcGF0aCkpCisKKyAgICAgICAgcmV0dXJuIHJlY2lwZV9pbmZvCisKKyAgICBkZWYgX2dldF9wYXRoX2luZm9ybWF0aW9uKHNlbGYsIHRhc2tfb2JqZWN0KToKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodGFza19vYmplY3QsIFRhc2spCisgICAgICAgIGJ1aWxkX3N0YXRzX2Zvcm1hdCA9ICJ7dG1wZGlyfS9idWlsZHN0YXRzL3t0YXJnZXR9LXttYWNoaW5lfS97YnVpbGRuYW1lfS97cGFja2FnZX0vIgorICAgICAgICBidWlsZF9zdGF0c19wYXRoID0gW10KKworICAgICAgICBmb3IgdCBpbiBzZWxmLmludGVybmFsX3N0YXRlWyd0YXJnZXRzJ106CisgICAgICAgICAgICB0YXJnZXQgPSB0LnRhcmdldAorICAgICAgICAgICAgbWFjaGluZSA9IHNlbGYuaW50ZXJuYWxfc3RhdGVbJ2J1aWxkJ10ubWFjaGluZQorICAgICAgICAgICAgYnVpbGRuYW1lID0gc2VsZi5pbnRlcm5hbF9zdGF0ZVsnYnVpbGQnXS5idWlsZF9uYW1lCisgICAgICAgICAgICBwZSwgcHYgPSB0YXNrX29iamVjdC5yZWNpcGUudmVyc2lvbi5zcGxpdCgiOiIsMSkKKyAgICAgICAgICAgIGlmIGxlbihwZSkgPiAwOgorICAgICAgICAgICAgICAgIHBhY2thZ2UgPSB0YXNrX29iamVjdC5yZWNpcGUubmFtZSArICItIiArIHBlICsgIl8iICsgcHYKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGFja2FnZSA9IHRhc2tfb2JqZWN0LnJlY2lwZS5uYW1lICsgIi0iICsgcHYKKworICAgICAgICAgICAgYnVpbGRfc3RhdHNfcGF0aC5hcHBlbmQoYnVpbGRfc3RhdHNfZm9ybWF0LmZvcm1hdCh0bXBkaXI9c2VsZi50bXBfZGlyLCB0YXJnZXQ9dGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNoaW5lPW1hY2hpbmUsIGJ1aWxkbmFtZT1idWlsZG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2U9cGFja2FnZSkpCisKKyAgICAgICAgcmV0dXJuIGJ1aWxkX3N0YXRzX3BhdGgKKworCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjIyBleHRlcm5hbCBhdmFpbGFibGUgbWV0aG9kcyB0byBzdG9yZSBpbmZvcm1hdGlvbgorICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX2dldF9kYXRhX2Zyb21fZXZlbnQoZXZlbnQpOgorICAgICAgICBldmRhdGEgPSBOb25lCisgICAgICAgIGlmICdfbG9jYWxkYXRhJyBpbiB2YXJzKGV2ZW50KToKKyAgICAgICAgICAgIGV2ZGF0YSA9IGV2ZW50Ll9sb2NhbGRhdGEKKyAgICAgICAgZWxpZiAnZGF0YScgaW4gdmFycyhldmVudCk6CisgICAgICAgICAgICBldmRhdGEgPSBldmVudC5kYXRhCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIkV2ZW50IHdpdGggbmVpdGhlciBfbG9jYWxkYXRhIG9yIGRhdGEgcHJvcGVydGllcyIpCisgICAgICAgIHJldHVybiBldmRhdGEKKworICAgIGRlZiBzdG9yZV9sYXllcl9pbmZvKHNlbGYsIGV2ZW50KToKKyAgICAgICAgbGF5ZXJpbmZvcyA9IEJ1aWxkSW5mb0hlbHBlci5fZ2V0X2RhdGFfZnJvbV9ldmVudChldmVudCkKKyAgICAgICAgc2VsZi5pbnRlcm5hbF9zdGF0ZVsnbHZzJ10gPSB7fQorICAgICAgICBmb3IgbGF5ZXIgaW4gbGF5ZXJpbmZvczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmludGVybmFsX3N0YXRlWydsdnMnXVtzZWxmLm9ybV93cmFwcGVyLmdldF91cGRhdGVfbGF5ZXJfb2JqZWN0KGxheWVyaW5mb3NbbGF5ZXJdLCBzZWxmLmJyYmUpXSA9IGxheWVyaW5mb3NbbGF5ZXJdWyd2ZXJzaW9uJ10KKyAgICAgICAgICAgICAgICBzZWxmLmludGVybmFsX3N0YXRlWydsdnMnXVtzZWxmLm9ybV93cmFwcGVyLmdldF91cGRhdGVfbGF5ZXJfb2JqZWN0KGxheWVyaW5mb3NbbGF5ZXJdLCBzZWxmLmJyYmUpXVsnbG9jYWxfcGF0aCddID0gbGF5ZXJpbmZvc1tsYXllcl1bJ2xvY2FsX3BhdGgnXQorICAgICAgICAgICAgZXhjZXB0IE5vdEV4aXN0aW5nIGFzIG5lZToKKyAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiYnVpbGRpbmZvaGVscGVyOiBjYW5ub3QgaWRlbnRpZnkgbGF5ZXIgZXhjZXB0aW9uOiVzICIsIG5lZSkKKworCisgICAgZGVmIHN0b3JlX3N0YXJ0ZWRfYnVpbGQoc2VsZiwgZXZlbnQpOgorICAgICAgICBhc3NlcnQgJ19wa2dzJyBpbiB2YXJzKGV2ZW50KQorICAgICAgICBidWlsZF9pbmZvcm1hdGlvbiA9IHNlbGYuX2dldF9idWlsZF9pbmZvcm1hdGlvbigpCisKKyAgICAgICAgYnVpbGRfb2JqID0gc2VsZi5vcm1fd3JhcHBlci5jcmVhdGVfYnVpbGRfb2JqZWN0KGJ1aWxkX2luZm9ybWF0aW9uLCBzZWxmLmJyYmUsIHNlbGYucHJvamVjdCkKKworICAgICAgICBzZWxmLmludGVybmFsX3N0YXRlWydidWlsZCddID0gYnVpbGRfb2JqCisKKyAgICAgICAgIyBzYXZlIGxheWVyIHZlcnNpb24gaW5mb3JtYXRpb24gZm9yIHRoaXMgYnVpbGQKKyAgICAgICAgaWYgbm90ICdsdnMnIGluIHNlbGYuaW50ZXJuYWxfc3RhdGU6CisgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIkxheWVyIHZlcnNpb24gaW5mb3JtYXRpb24gbm90IGZvdW5kOyBDaGVjayBpZiB0aGUgYml0YmFrZSBzZXJ2ZXIgd2FzIGNvbmZpZ3VyZWQgdG8gaW5oZXJpdCB0b2FzdGVyLmJiY2xhc3MuIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZvciBsYXllcl9vYmogaW4gc2VsZi5pbnRlcm5hbF9zdGF0ZVsnbHZzJ106CisgICAgICAgICAgICAgICAgc2VsZi5vcm1fd3JhcHBlci5nZXRfdXBkYXRlX2xheWVyX3ZlcnNpb25fb2JqZWN0KGJ1aWxkX29iaiwgbGF5ZXJfb2JqLCBzZWxmLmludGVybmFsX3N0YXRlWydsdnMnXVtsYXllcl9vYmpdKQorCisgICAgICAgICAgICBkZWwgc2VsZi5pbnRlcm5hbF9zdGF0ZVsnbHZzJ10KKworICAgICAgICAjIGNyZWF0ZSB0YXJnZXQgaW5mb3JtYXRpb24KKyAgICAgICAgdGFyZ2V0X2luZm9ybWF0aW9uID0ge30KKyAgICAgICAgdGFyZ2V0X2luZm9ybWF0aW9uWyd0YXJnZXRzJ10gPSBldmVudC5fcGtncworICAgICAgICB0YXJnZXRfaW5mb3JtYXRpb25bJ2J1aWxkJ10gPSBidWlsZF9vYmoKKworICAgICAgICBzZWxmLmludGVybmFsX3N0YXRlWyd0YXJnZXRzJ10gPSBzZWxmLm9ybV93cmFwcGVyLmNyZWF0ZV90YXJnZXRfb2JqZWN0cyh0YXJnZXRfaW5mb3JtYXRpb24pCisKKyAgICAgICAgIyBTYXZlIGJ1aWxkIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgZGF0YSA9IHNlbGYuc2VydmVyLnJ1bkNvbW1hbmQoWyJnZXRBbGxLZXlzV2l0aEZsYWdzIiwgWyJkb2MiLCAiZnVuYyJdXSlbMF0KKworICAgICAgICAjIGNvbnZlcnQgdGhlIHBhdGhzIGZyb20gYWJzb2x1dGUgdG8gcmVsYXRpdmUgdG8gZWl0aGVyIHRoZSBidWlsZCBkaXJlY3Rvcnkgb3IgbGF5ZXIgY2hlY2tvdXRzCisgICAgICAgIHBhdGhfcHJlZml4ZXMgPSBbXQorCisgICAgICAgIGlmIHNlbGYuYnJiZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIF8sIGJlX2lkID0gc2VsZi5icmJlLnNwbGl0KCI6IikKKyAgICAgICAgICAgIGJlID0gQnVpbGRFbnZpcm9ubWVudC5vYmplY3RzLmdldChwayA9IGJlX2lkKQorICAgICAgICAgICAgcGF0aF9wcmVmaXhlcy5hcHBlbmQoYmUuYnVpbGRkaXIpCisKKyAgICAgICAgZm9yIGxheWVyIGluIHNvcnRlZChzZWxmLm9ybV93cmFwcGVyLmxheWVyX3ZlcnNpb25fb2JqZWN0cywga2V5ID0gbGFtYmRhIHg6bGVuKHgubG9jYWxfcGF0aCksIHJldmVyc2U9VHJ1ZSk6CisgICAgICAgICAgICBwYXRoX3ByZWZpeGVzLmFwcGVuZChsYXllci5sb2NhbF9wYXRoKQorCisgICAgICAgICMgd2Ugc3RyaXAgdGhlIHByZWZpeGVzCisgICAgICAgIGZvciBrIGluIGRhdGE6CisgICAgICAgICAgICBpZiBub3QgYm9vbChkYXRhW2tdWydmdW5jJ10pOgorICAgICAgICAgICAgICAgIGZvciB2aCBpbiBkYXRhW2tdWydoaXN0b3J5J106CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCAnZG9jdW1lbnRhdGlvbi5jb25mJyBpbiB2aFsnZmlsZSddOgorICAgICAgICAgICAgICAgICAgICAgICAgYWJzX2ZpbGVfbmFtZSA9IHZoWydmaWxlJ10KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBwcCBpbiBwYXRoX3ByZWZpeGVzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGFic19maWxlX25hbWUuc3RhcnRzd2l0aChwcCArICIvIik6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZoWydmaWxlJ109YWJzX2ZpbGVfbmFtZVtsZW4ocHAgKyAiLyIpOl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAjIHNhdmUgdGhlIHZhcmlhYmxlcworICAgICAgICBzZWxmLm9ybV93cmFwcGVyLnNhdmVfYnVpbGRfdmFyaWFibGVzKGJ1aWxkX29iaiwgZGF0YSkKKworICAgICAgICByZXR1cm4gc2VsZi5icmJlCisKKworICAgIGRlZiB1cGRhdGVfdGFyZ2V0X2ltYWdlX2ZpbGUoc2VsZiwgZXZlbnQpOgorICAgICAgICBldmRhdGEgPSBCdWlsZEluZm9IZWxwZXIuX2dldF9kYXRhX2Zyb21fZXZlbnQoZXZlbnQpCisKKyAgICAgICAgZm9yIHQgaW4gc2VsZi5pbnRlcm5hbF9zdGF0ZVsndGFyZ2V0cyddOgorICAgICAgICAgICAgaWYgdC5pc19pbWFnZSA9PSBUcnVlOgorICAgICAgICAgICAgICAgIG91dHB1dF9maWxlcyA9IGxpc3QoZXZkYXRhLnZpZXdrZXlzKCkpCisgICAgICAgICAgICAgICAgZm9yIG91dHB1dCBpbiBvdXRwdXRfZmlsZXM6CisgICAgICAgICAgICAgICAgICAgIGlmIHQudGFyZ2V0IGluIG91dHB1dCBhbmQgJ3Jvb3RmcycgaW4gb3V0cHV0IGFuZCBub3Qgb3V0cHV0LmVuZHN3aXRoKCIubWFuaWZlc3QiKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3JtX3dyYXBwZXIuc2F2ZV90YXJnZXRfaW1hZ2VfZmlsZV9pbmZvcm1hdGlvbih0LCBvdXRwdXQsIGV2ZGF0YVtvdXRwdXRdKQorCisgICAgZGVmIHVwZGF0ZV9hcnRpZmFjdF9pbWFnZV9maWxlKHNlbGYsIGV2ZW50KToKKyAgICAgICAgZXZkYXRhID0gQnVpbGRJbmZvSGVscGVyLl9nZXRfZGF0YV9mcm9tX2V2ZW50KGV2ZW50KQorICAgICAgICBmb3IgYXJ0aWZhY3RfcGF0aCBpbiBldmRhdGEua2V5cygpOgorICAgICAgICAgICAgc2VsZi5vcm1fd3JhcHBlci5zYXZlX2FydGlmYWN0X2luZm9ybWF0aW9uKHNlbGYuaW50ZXJuYWxfc3RhdGVbJ2J1aWxkJ10sIGFydGlmYWN0X3BhdGgsIGV2ZGF0YVthcnRpZmFjdF9wYXRoXSkKKworICAgIGRlZiB1cGRhdGVfYnVpbGRfaW5mb3JtYXRpb24oc2VsZiwgZXZlbnQsIGVycm9ycywgd2FybmluZ3MsIHRhc2tmYWlsdXJlcyk6CisgICAgICAgIGlmICdidWlsZCcgaW4gc2VsZi5pbnRlcm5hbF9zdGF0ZToKKyAgICAgICAgICAgIHNlbGYub3JtX3dyYXBwZXIudXBkYXRlX2J1aWxkX29iamVjdChzZWxmLmludGVybmFsX3N0YXRlWydidWlsZCddLCBlcnJvcnMsIHdhcm5pbmdzLCB0YXNrZmFpbHVyZXMpCisKKworICAgIGRlZiBzdG9yZV9saWNlbnNlX21hbmlmZXN0X3BhdGgoc2VsZiwgZXZlbnQpOgorICAgICAgICBkZXBsb3lfZGlyID0gQnVpbGRJbmZvSGVscGVyLl9nZXRfZGF0YV9mcm9tX2V2ZW50KGV2ZW50KVsnZGVwbG95X2RpciddCisgICAgICAgIGltYWdlX25hbWUgPSBCdWlsZEluZm9IZWxwZXIuX2dldF9kYXRhX2Zyb21fZXZlbnQoZXZlbnQpWydpbWFnZV9uYW1lJ10KKyAgICAgICAgcGF0aCA9IGRlcGxveV9kaXIgKyAiL2xpY2Vuc2VzLyIgKyBpbWFnZV9uYW1lICsgIi9saWNlbnNlLm1hbmlmZXN0IgorICAgICAgICBmb3IgdGFyZ2V0IGluIHNlbGYuaW50ZXJuYWxfc3RhdGVbJ3RhcmdldHMnXToKKyAgICAgICAgICAgIGlmIHRhcmdldC50YXJnZXQgaW4gaW1hZ2VfbmFtZToKKyAgICAgICAgICAgICAgICBzZWxmLm9ybV93cmFwcGVyLnVwZGF0ZV90YXJnZXRfc2V0X2xpY2Vuc2VfbWFuaWZlc3QodGFyZ2V0LCBwYXRoKQorCisKKyAgICBkZWYgc3RvcmVfc3RhcnRlZF90YXNrKHNlbGYsIGV2ZW50KToKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoZXZlbnQsIChiYi5ydW5xdWV1ZS5zY2VuZVF1ZXVlVGFza1N0YXJ0ZWQsIGJiLnJ1bnF1ZXVlLnJ1blF1ZXVlVGFza1N0YXJ0ZWQsIGJiLnJ1bnF1ZXVlLnJ1blF1ZXVlVGFza1NraXBwZWQpKQorICAgICAgICBhc3NlcnQgJ3Rhc2tmaWxlJyBpbiB2YXJzKGV2ZW50KQorICAgICAgICBsb2NhbGZpbGVwYXRoID0gZXZlbnQudGFza2ZpbGUuc3BsaXQoIjoiKVstMV0KKyAgICAgICAgYXNzZXJ0IGxvY2FsZmlsZXBhdGguc3RhcnRzd2l0aCgiLyIpCisKKyAgICAgICAgaWRlbnRpZmllciA9IGV2ZW50LnRhc2tmaWxlICsgIjoiICsgZXZlbnQudGFza25hbWUKKworICAgICAgICByZWNpcGVfaW5mb3JtYXRpb24gPSBzZWxmLl9nZXRfcmVjaXBlX2luZm9ybWF0aW9uX2Zyb21fdGFza2ZpbGUoZXZlbnQudGFza2ZpbGUpCisgICAgICAgIHJlY2lwZSA9IHNlbGYub3JtX3dyYXBwZXIuZ2V0X3VwZGF0ZV9yZWNpcGVfb2JqZWN0KHJlY2lwZV9pbmZvcm1hdGlvbiwgVHJ1ZSkKKworICAgICAgICB0YXNrX2luZm9ybWF0aW9uID0gc2VsZi5fZ2V0X3Rhc2tfaW5mb3JtYXRpb24oZXZlbnQsIHJlY2lwZSkKKyAgICAgICAgdGFza19pbmZvcm1hdGlvblsnb3V0Y29tZSddID0gVGFzay5PVVRDT01FX05BCisKKyAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIucnVucXVldWUucnVuUXVldWVUYXNrU2tpcHBlZCk6CisgICAgICAgICAgICBhc3NlcnQgJ3JlYXNvbicgaW4gdmFycyhldmVudCkKKyAgICAgICAgICAgIHRhc2tfaW5mb3JtYXRpb25bJ3Rhc2tfZXhlY3V0ZWQnXSA9IEZhbHNlCisgICAgICAgICAgICBpZiBldmVudC5yZWFzb24gPT0gImNvdmVyZWQiOgorICAgICAgICAgICAgICAgIHRhc2tfaW5mb3JtYXRpb25bJ291dGNvbWUnXSA9IFRhc2suT1VUQ09NRV9DT1ZFUkVECisgICAgICAgICAgICBpZiBldmVudC5yZWFzb24gPT0gImV4aXN0aW5nIjoKKyAgICAgICAgICAgICAgICB0YXNrX2luZm9ybWF0aW9uWydvdXRjb21lJ10gPSBUYXNrLk9VVENPTUVfUFJFQlVJTFQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRhc2tfaW5mb3JtYXRpb25bJ3Rhc2tfZXhlY3V0ZWQnXSA9IFRydWUKKyAgICAgICAgICAgIGlmICdub2V4ZWMnIGluIHZhcnMoZXZlbnQpIGFuZCBldmVudC5ub2V4ZWMgPT0gVHJ1ZToKKyAgICAgICAgICAgICAgICB0YXNrX2luZm9ybWF0aW9uWyd0YXNrX2V4ZWN1dGVkJ10gPSBGYWxzZQorICAgICAgICAgICAgICAgIHRhc2tfaW5mb3JtYXRpb25bJ291dGNvbWUnXSA9IFRhc2suT1VUQ09NRV9FTVBUWQorICAgICAgICAgICAgICAgIHRhc2tfaW5mb3JtYXRpb25bJ3NjcmlwdF90eXBlJ10gPSBUYXNrLkNPRElOR19OQQorCisgICAgICAgICMgZG8gbm90IGFzc2lnbiBvcmRlciBudW1iZXJzIHRvIHNjZW5lIHRhc2tzCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGV2ZW50LCBiYi5ydW5xdWV1ZS5zY2VuZVF1ZXVlVGFza1N0YXJ0ZWQpOgorICAgICAgICAgICAgc2VsZi50YXNrX29yZGVyICs9IDEKKyAgICAgICAgICAgIHRhc2tfaW5mb3JtYXRpb25bJ29yZGVyJ10gPSBzZWxmLnRhc2tfb3JkZXIKKworICAgICAgICBzZWxmLm9ybV93cmFwcGVyLmdldF91cGRhdGVfdGFza19vYmplY3QodGFza19pbmZvcm1hdGlvbikKKworICAgICAgICBzZWxmLmludGVybmFsX3N0YXRlWyd0YXNrZGF0YSddW2lkZW50aWZpZXJdID0geworICAgICAgICAgICAgICAgICAgICAgICAgJ291dGNvbWUnOiB0YXNrX2luZm9ybWF0aW9uWydvdXRjb21lJ10sCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgZGVmIHN0b3JlX3Rhc2tzX3N0YXRzKHNlbGYsIGV2ZW50KToKKyAgICAgICAgZm9yICh0YXNrZmlsZSwgdGFza25hbWUsIHRhc2tzdGF0cywgcmVjaXBlbmFtZSkgaW4gQnVpbGRJbmZvSGVscGVyLl9nZXRfZGF0YV9mcm9tX2V2ZW50KGV2ZW50KToKKyAgICAgICAgICAgIGxvY2FsZmlsZXBhdGggPSB0YXNrZmlsZS5zcGxpdCgiOiIpWy0xXQorICAgICAgICAgICAgYXNzZXJ0IGxvY2FsZmlsZXBhdGguc3RhcnRzd2l0aCgiLyIpCisKKyAgICAgICAgICAgIHJlY2lwZV9pbmZvcm1hdGlvbiA9IHNlbGYuX2dldF9yZWNpcGVfaW5mb3JtYXRpb25fZnJvbV90YXNrZmlsZSh0YXNrZmlsZSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpZiByZWNpcGVfaW5mb3JtYXRpb25bJ2ZpbGVfcGF0aCddLnN0YXJ0c3dpdGgocmVjaXBlX2luZm9ybWF0aW9uWydsYXllcl92ZXJzaW9uJ10ubG9jYWxfcGF0aCk6CisgICAgICAgICAgICAgICAgICAgIHJlY2lwZV9pbmZvcm1hdGlvblsnZmlsZV9wYXRoJ10gPSByZWNpcGVfaW5mb3JtYXRpb25bJ2ZpbGVfcGF0aCddW2xlbihyZWNpcGVfaW5mb3JtYXRpb25bJ2xheWVyX3ZlcnNpb24nXS5sb2NhbF9wYXRoKTpdLmxzdHJpcCgiLyIpCisKKyAgICAgICAgICAgICAgICByZWNpcGVfb2JqZWN0ID0gUmVjaXBlLm9iamVjdHMuZ2V0KGxheWVyX3ZlcnNpb24gPSByZWNpcGVfaW5mb3JtYXRpb25bJ2xheWVyX3ZlcnNpb24nXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3BhdGhfX2VuZHN3aXRoID0gcmVjaXBlX2luZm9ybWF0aW9uWydmaWxlX3BhdGgnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gcmVjaXBlbmFtZSkKKyAgICAgICAgICAgIGV4Y2VwdCBSZWNpcGUuRG9lc05vdEV4aXN0OgorICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiQ291bGQgbm90IGZpbmQgcmVjaXBlIGZvciByZWNpcGVfaW5mb3JtYXRpb24gJXMgbmFtZSAlcyIgLCBwZm9ybWF0KHJlY2lwZV9pbmZvcm1hdGlvbiksIHJlY2lwZW5hbWUpCisgICAgICAgICAgICAgICAgcmFpc2UKKworICAgICAgICAgICAgdGFza19pbmZvcm1hdGlvbiA9IHt9CisgICAgICAgICAgICB0YXNrX2luZm9ybWF0aW9uWydidWlsZCddID0gc2VsZi5pbnRlcm5hbF9zdGF0ZVsnYnVpbGQnXQorICAgICAgICAgICAgdGFza19pbmZvcm1hdGlvblsncmVjaXBlJ10gPSByZWNpcGVfb2JqZWN0CisgICAgICAgICAgICB0YXNrX2luZm9ybWF0aW9uWyd0YXNrX25hbWUnXSA9IHRhc2tuYW1lCisgICAgICAgICAgICB0YXNrX2luZm9ybWF0aW9uWydjcHVfdXNhZ2UnXSA9IHRhc2tzdGF0c1snY3B1X3VzYWdlJ10KKyAgICAgICAgICAgIHRhc2tfaW5mb3JtYXRpb25bJ2Rpc2tfaW8nXSA9IHRhc2tzdGF0c1snZGlza19pbyddCisgICAgICAgICAgICBpZiAnZWxhcHNlZF90aW1lJyBpbiB0YXNrc3RhdHM6CisgICAgICAgICAgICAgICAgdGFza19pbmZvcm1hdGlvblsnZWxhcHNlZF90aW1lJ10gPSB0YXNrc3RhdHNbJ2VsYXBzZWRfdGltZSddCisgICAgICAgICAgICBzZWxmLm9ybV93cmFwcGVyLmdldF91cGRhdGVfdGFza19vYmplY3QodGFza19pbmZvcm1hdGlvbiwgVHJ1ZSkgICMgbXVzdCBleGlzdAorCisgICAgZGVmIHVwZGF0ZV9hbmRfc3RvcmVfdGFzayhzZWxmLCBldmVudCk6CisgICAgICAgIGFzc2VydCAndGFza2ZpbGUnIGluIHZhcnMoZXZlbnQpCisgICAgICAgIGxvY2FsZmlsZXBhdGggPSBldmVudC50YXNrZmlsZS5zcGxpdCgiOiIpWy0xXQorICAgICAgICBhc3NlcnQgbG9jYWxmaWxlcGF0aC5zdGFydHN3aXRoKCIvIikKKworICAgICAgICBpZGVudGlmaWVyID0gZXZlbnQudGFza2ZpbGUgKyAiOiIgKyBldmVudC50YXNrbmFtZQorICAgICAgICBpZiBub3QgaWRlbnRpZmllciBpbiBzZWxmLmludGVybmFsX3N0YXRlWyd0YXNrZGF0YSddOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuYnVpbGQuVGFza0Jhc2UpOgorICAgICAgICAgICAgICAgICMgd2UgZG8gYSBiaXQgb2YgZ3Vlc3NpbmcKKyAgICAgICAgICAgICAgICBjYW5kaWRhdGVzID0gW3ggZm9yIHggaW4gc2VsZi5pbnRlcm5hbF9zdGF0ZVsndGFza2RhdGEnXS5rZXlzKCkgaWYgeC5lbmRzd2l0aChpZGVudGlmaWVyKV0KKyAgICAgICAgICAgICAgICBpZiBsZW4oY2FuZGlkYXRlcykgPT0gMToKKyAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllciA9IGNhbmRpZGF0ZXNbMF0KKworICAgICAgICBhc3NlcnQgaWRlbnRpZmllciBpbiBzZWxmLmludGVybmFsX3N0YXRlWyd0YXNrZGF0YSddCisgICAgICAgIGlkZW50aWZpZXJsaXN0ID0gaWRlbnRpZmllci5zcGxpdCgiOiIpCisgICAgICAgIHJlYWx0YXNrZmlsZSA9ICI6Ii5qb2luKGlkZW50aWZpZXJsaXN0WzA6bGVuKGlkZW50aWZpZXJsaXN0KS0xXSkKKyAgICAgICAgcmVjaXBlX2luZm9ybWF0aW9uID0gc2VsZi5fZ2V0X3JlY2lwZV9pbmZvcm1hdGlvbl9mcm9tX3Rhc2tmaWxlKHJlYWx0YXNrZmlsZSkKKyAgICAgICAgcmVjaXBlID0gc2VsZi5vcm1fd3JhcHBlci5nZXRfdXBkYXRlX3JlY2lwZV9vYmplY3QocmVjaXBlX2luZm9ybWF0aW9uLCBUcnVlKQorICAgICAgICB0YXNrX2luZm9ybWF0aW9uID0gc2VsZi5fZ2V0X3Rhc2tfaW5mb3JtYXRpb24oZXZlbnQscmVjaXBlKQorCisgICAgICAgIGlmICd0aW1lJyBpbiB2YXJzKGV2ZW50KToKKyAgICAgICAgICAgIGlmIG5vdCAnc3RhcnRfdGltZScgaW4gc2VsZi5pbnRlcm5hbF9zdGF0ZVsndGFza2RhdGEnXVtpZGVudGlmaWVyXToKKyAgICAgICAgICAgICAgICBzZWxmLmludGVybmFsX3N0YXRlWyd0YXNrZGF0YSddW2lkZW50aWZpZXJdWydzdGFydF90aW1lJ10gPSBldmVudC50aW1lCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHRhc2tfaW5mb3JtYXRpb25bJ2VuZF90aW1lJ10gPSBldmVudC50aW1lCisgICAgICAgICAgICAgICAgdGFza19pbmZvcm1hdGlvblsnc3RhcnRfdGltZSddID0gc2VsZi5pbnRlcm5hbF9zdGF0ZVsndGFza2RhdGEnXVtpZGVudGlmaWVyXVsnc3RhcnRfdGltZSddCisKKyAgICAgICAgdGFza19pbmZvcm1hdGlvblsnb3V0Y29tZSddID0gc2VsZi5pbnRlcm5hbF9zdGF0ZVsndGFza2RhdGEnXVtpZGVudGlmaWVyXVsnb3V0Y29tZSddCisKKyAgICAgICAgaWYgJ2xvZ2ZpbGUnIGluIHZhcnMoZXZlbnQpOgorICAgICAgICAgICAgdGFza19pbmZvcm1hdGlvblsnbG9nZmlsZSddID0gZXZlbnQubG9nZmlsZQorCisgICAgICAgIGlmICdfbWVzc2FnZScgaW4gdmFycyhldmVudCk6CisgICAgICAgICAgICB0YXNrX2luZm9ybWF0aW9uWydtZXNzYWdlJ10gPSBldmVudC5fbWVzc2FnZQorCisgICAgICAgIGlmICd0YXNrZmxhZ3MnIGluIHZhcnMoZXZlbnQpOgorICAgICAgICAgICAgIyB3aXRoIFRhc2tTdGFydGVkLCB3ZSBnZXQgZXZlbiBtb3JlIGluZm9ybWF0aW9uCisgICAgICAgICAgICBpZiAncHl0aG9uJyBpbiBldmVudC50YXNrZmxhZ3Mua2V5cygpIGFuZCBldmVudC50YXNrZmxhZ3NbJ3B5dGhvbiddID09ICcxJzoKKyAgICAgICAgICAgICAgICB0YXNrX2luZm9ybWF0aW9uWydzY3JpcHRfdHlwZSddID0gVGFzay5DT0RJTkdfUFlUSE9OCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHRhc2tfaW5mb3JtYXRpb25bJ3NjcmlwdF90eXBlJ10gPSBUYXNrLkNPRElOR19TSEVMTAorCisgICAgICAgIGlmIHRhc2tfaW5mb3JtYXRpb25bJ291dGNvbWUnXSA9PSBUYXNrLk9VVENPTUVfTkE6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCAoYmIucnVucXVldWUucnVuUXVldWVUYXNrQ29tcGxldGVkLCBiYi5ydW5xdWV1ZS5zY2VuZVF1ZXVlVGFza0NvbXBsZXRlZCkpOgorICAgICAgICAgICAgICAgIHRhc2tfaW5mb3JtYXRpb25bJ291dGNvbWUnXSA9IFRhc2suT1VUQ09NRV9TVUNDRVNTCisgICAgICAgICAgICAgICAgZGVsIHNlbGYuaW50ZXJuYWxfc3RhdGVbJ3Rhc2tkYXRhJ11baWRlbnRpZmllcl0KKworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgKGJiLnJ1bnF1ZXVlLnJ1blF1ZXVlVGFza0ZhaWxlZCwgYmIucnVucXVldWUuc2NlbmVRdWV1ZVRhc2tGYWlsZWQpKToKKyAgICAgICAgICAgICAgICB0YXNrX2luZm9ybWF0aW9uWydvdXRjb21lJ10gPSBUYXNrLk9VVENPTUVfRkFJTEVECisgICAgICAgICAgICAgICAgZGVsIHNlbGYuaW50ZXJuYWxfc3RhdGVbJ3Rhc2tkYXRhJ11baWRlbnRpZmllcl0KKworICAgICAgICBpZiBub3QgY29ubmVjdGlvbi5mZWF0dXJlcy5hdXRvY29tbWl0c193aGVuX2F1dG9jb21taXRfaXNfb2ZmOgorICAgICAgICAgICAgIyB3ZSBmb3JjZSBhIHN5bmMgcG9pbnQgaGVyZSwgdG8gZ2V0IHRoZSBwcm9ncmVzcyBiYXIgdG8gc2hvdworICAgICAgICAgICAgaWYgc2VsZi5hdXRvY29tbWl0X3N0ZXAgJSAzID09IDA6CisgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24uc2V0X2F1dG9jb21taXQoVHJ1ZSkKKyAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbi5zZXRfYXV0b2NvbW1pdChGYWxzZSkKKyAgICAgICAgICAgIHNlbGYuYXV0b2NvbW1pdF9zdGVwICs9IDEKKworICAgICAgICBzZWxmLm9ybV93cmFwcGVyLmdldF91cGRhdGVfdGFza19vYmplY3QodGFza19pbmZvcm1hdGlvbiwgVHJ1ZSkgIyBtdXN0IGV4aXN0CisKKworICAgIGRlZiBzdG9yZV9taXNzZWRfc3RhdGVfdGFza3Moc2VsZiwgZXZlbnQpOgorICAgICAgICBmb3IgKGZuLCB0YXNrbmFtZSwgdGFza2hhc2gsIHNzdGF0ZWZpbGUpIGluIEJ1aWxkSW5mb0hlbHBlci5fZ2V0X2RhdGFfZnJvbV9ldmVudChldmVudClbJ21pc3NlZCddOgorCisgICAgICAgICAgICAjIGlkZW50aWZpZXIgPSBmbiArIHRhc2tuYW1lICsgIl9zZXRzY2VuZSIKKyAgICAgICAgICAgIHJlY2lwZV9pbmZvcm1hdGlvbiA9IHNlbGYuX2dldF9yZWNpcGVfaW5mb3JtYXRpb25fZnJvbV90YXNrZmlsZShmbikKKyAgICAgICAgICAgIHJlY2lwZSA9IHNlbGYub3JtX3dyYXBwZXIuZ2V0X3VwZGF0ZV9yZWNpcGVfb2JqZWN0KHJlY2lwZV9pbmZvcm1hdGlvbikKKyAgICAgICAgICAgIG1ldmVudCA9IE1vY2tFdmVudCgpCisgICAgICAgICAgICBtZXZlbnQudGFza25hbWUgPSB0YXNrbmFtZQorICAgICAgICAgICAgbWV2ZW50LnRhc2toYXNoID0gdGFza2hhc2gKKyAgICAgICAgICAgIHRhc2tfaW5mb3JtYXRpb24gPSBzZWxmLl9nZXRfdGFza19pbmZvcm1hdGlvbihtZXZlbnQscmVjaXBlKQorCisgICAgICAgICAgICB0YXNrX2luZm9ybWF0aW9uWydzdGFydF90aW1lJ10gPSB0aW1lem9uZS5ub3coKQorICAgICAgICAgICAgdGFza19pbmZvcm1hdGlvblsnb3V0Y29tZSddID0gVGFzay5PVVRDT01FX05BCisgICAgICAgICAgICB0YXNrX2luZm9ybWF0aW9uWydzc3RhdGVfY2hlY2tzdW0nXSA9IHRhc2toYXNoCisgICAgICAgICAgICB0YXNrX2luZm9ybWF0aW9uWydzc3RhdGVfcmVzdWx0J10gPSBUYXNrLlNTVEFURV9NSVNTCisgICAgICAgICAgICB0YXNrX2luZm9ybWF0aW9uWydwYXRoX3RvX3NzdGF0ZV9vYmonXSA9IHNzdGF0ZWZpbGUKKworICAgICAgICAgICAgc2VsZi5vcm1fd3JhcHBlci5nZXRfdXBkYXRlX3Rhc2tfb2JqZWN0KHRhc2tfaW5mb3JtYXRpb24pCisKKyAgICAgICAgZm9yIChmbiwgdGFza25hbWUsIHRhc2toYXNoLCBzc3RhdGVmaWxlKSBpbiBCdWlsZEluZm9IZWxwZXIuX2dldF9kYXRhX2Zyb21fZXZlbnQoZXZlbnQpWydmb3VuZCddOgorCisgICAgICAgICAgICAjIGlkZW50aWZpZXIgPSBmbiArIHRhc2tuYW1lICsgIl9zZXRzY2VuZSIKKyAgICAgICAgICAgIHJlY2lwZV9pbmZvcm1hdGlvbiA9IHNlbGYuX2dldF9yZWNpcGVfaW5mb3JtYXRpb25fZnJvbV90YXNrZmlsZShmbikKKyAgICAgICAgICAgIHJlY2lwZSA9IHNlbGYub3JtX3dyYXBwZXIuZ2V0X3VwZGF0ZV9yZWNpcGVfb2JqZWN0KHJlY2lwZV9pbmZvcm1hdGlvbikKKyAgICAgICAgICAgIG1ldmVudCA9IE1vY2tFdmVudCgpCisgICAgICAgICAgICBtZXZlbnQudGFza25hbWUgPSB0YXNrbmFtZQorICAgICAgICAgICAgbWV2ZW50LnRhc2toYXNoID0gdGFza2hhc2gKKyAgICAgICAgICAgIHRhc2tfaW5mb3JtYXRpb24gPSBzZWxmLl9nZXRfdGFza19pbmZvcm1hdGlvbihtZXZlbnQscmVjaXBlKQorCisgICAgICAgICAgICB0YXNrX2luZm9ybWF0aW9uWydwYXRoX3RvX3NzdGF0ZV9vYmonXSA9IHNzdGF0ZWZpbGUKKworICAgICAgICAgICAgc2VsZi5vcm1fd3JhcHBlci5nZXRfdXBkYXRlX3Rhc2tfb2JqZWN0KHRhc2tfaW5mb3JtYXRpb24pCisKKworICAgIGRlZiBzdG9yZV90YXJnZXRfcGFja2FnZV9kYXRhKHNlbGYsIGV2ZW50KToKKyAgICAgICAgIyBmb3IgYWxsIGltYWdlIHRhcmdldHMKKyAgICAgICAgZm9yIHRhcmdldCBpbiBzZWxmLmludGVybmFsX3N0YXRlWyd0YXJnZXRzJ106CisgICAgICAgICAgICBpZiB0YXJnZXQuaXNfaW1hZ2U6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBwa2dkYXRhID0gQnVpbGRJbmZvSGVscGVyLl9nZXRfZGF0YV9mcm9tX2V2ZW50KGV2ZW50KVsncGtnZGF0YSddCisgICAgICAgICAgICAgICAgICAgIGltZ2RhdGEgPSBCdWlsZEluZm9IZWxwZXIuX2dldF9kYXRhX2Zyb21fZXZlbnQoZXZlbnQpWydpbWdkYXRhJ11bdGFyZ2V0LnRhcmdldF0KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5vcm1fd3JhcHBlci5zYXZlX3RhcmdldF9wYWNrYWdlX2luZm9ybWF0aW9uKHNlbGYuaW50ZXJuYWxfc3RhdGVbJ2J1aWxkJ10sIHRhcmdldCwgaW1nZGF0YSwgcGtnZGF0YSwgc2VsZi5pbnRlcm5hbF9zdGF0ZVsncmVjaXBlcyddKQorICAgICAgICAgICAgICAgICAgICBmaWxlZGF0YSA9IEJ1aWxkSW5mb0hlbHBlci5fZ2V0X2RhdGFfZnJvbV9ldmVudChldmVudClbJ2ZpbGVkYXRhJ11bdGFyZ2V0LnRhcmdldF0KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5vcm1fd3JhcHBlci5zYXZlX3RhcmdldF9maWxlX2luZm9ybWF0aW9uKHNlbGYuaW50ZXJuYWxfc3RhdGVbJ2J1aWxkJ10sIHRhcmdldCwgZmlsZWRhdGEpCisgICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgICAgICAjIHdlIG11c3QgaGF2ZSBub3QgZ290IHRoZSBkYXRhIGZvciB0aGlzIGltYWdlLCBub3RoaW5nIHRvIHNhdmUKKyAgICAgICAgICAgICAgICAgICAgcGFzcworCisKKworICAgIGRlZiBzdG9yZV9kZXBlbmRlbmN5X2luZm9ybWF0aW9uKHNlbGYsIGV2ZW50KToKKyAgICAgICAgYXNzZXJ0ICdfZGVwZ3JhcGgnIGluIHZhcnMoZXZlbnQpCisgICAgICAgIGFzc2VydCAnbGF5ZXItcHJpb3JpdGllcycgaW4gZXZlbnQuX2RlcGdyYXBoCisgICAgICAgIGFzc2VydCAncG4nIGluIGV2ZW50Ll9kZXBncmFwaAorICAgICAgICBhc3NlcnQgJ3RkZXBlbmRzJyBpbiBldmVudC5fZGVwZ3JhcGgKKworICAgICAgICBlcnJvcm1zZyA9ICIiCisKKyAgICAgICAgIyBzYXZlIGxheWVyIHZlcnNpb24gcHJpb3JpdGllcworICAgICAgICBpZiAnbGF5ZXItcHJpb3JpdGllcycgaW4gZXZlbnQuX2RlcGdyYXBoLmtleXMoKToKKyAgICAgICAgICAgIGZvciBsdiBpbiBldmVudC5fZGVwZ3JhcGhbJ2xheWVyLXByaW9yaXRpZXMnXToKKyAgICAgICAgICAgICAgICAoXywgcGF0aCwgXywgcHJpb3JpdHkpID0gbHYKKyAgICAgICAgICAgICAgICBsYXllcl92ZXJzaW9uX29iaiA9IHNlbGYuX2dldF9sYXllcl92ZXJzaW9uX2Zvcl9wYXRoKHBhdGhbMTpdKSAjIHBhdGhzIHN0YXJ0IHdpdGggYSBeCisgICAgICAgICAgICAgICAgYXNzZXJ0IGxheWVyX3ZlcnNpb25fb2JqIGlzIG5vdCBOb25lCisgICAgICAgICAgICAgICAgbGF5ZXJfdmVyc2lvbl9vYmoucHJpb3JpdHkgPSBwcmlvcml0eQorICAgICAgICAgICAgICAgIGxheWVyX3ZlcnNpb25fb2JqLnNhdmUoKQorCisgICAgICAgICMgc2F2ZSByZWNpcGUgaW5mb3JtYXRpb24KKyAgICAgICAgc2VsZi5pbnRlcm5hbF9zdGF0ZVsncmVjaXBlcyddID0ge30KKyAgICAgICAgZm9yIHBuIGluIGV2ZW50Ll9kZXBncmFwaFsncG4nXToKKworICAgICAgICAgICAgZmlsZV9uYW1lID0gZXZlbnQuX2RlcGdyYXBoWydwbiddW3BuXVsnZmlsZW5hbWUnXS5zcGxpdCgiOiIpWy0xXQorICAgICAgICAgICAgcGF0aGZsYWdzID0gIjoiLmpvaW4oc29ydGVkKGV2ZW50Ll9kZXBncmFwaFsncG4nXVtwbl1bJ2ZpbGVuYW1lJ10uc3BsaXQoIjoiKVs6LTFdKSkKKyAgICAgICAgICAgIGxheWVyX3ZlcnNpb25fb2JqID0gc2VsZi5fZ2V0X2xheWVyX3ZlcnNpb25fZm9yX3BhdGgoZmlsZV9uYW1lKQorCisgICAgICAgICAgICBhc3NlcnQgbGF5ZXJfdmVyc2lvbl9vYmogaXMgbm90IE5vbmUKKworICAgICAgICAgICAgcmVjaXBlX2luZm8gPSB7fQorICAgICAgICAgICAgcmVjaXBlX2luZm9bJ25hbWUnXSA9IHBuCisgICAgICAgICAgICByZWNpcGVfaW5mb1snbGF5ZXJfdmVyc2lvbiddID0gbGF5ZXJfdmVyc2lvbl9vYmoKKworICAgICAgICAgICAgaWYgJ3ZlcnNpb24nIGluIGV2ZW50Ll9kZXBncmFwaFsncG4nXVtwbl06CisgICAgICAgICAgICAgICAgcmVjaXBlX2luZm9bJ3ZlcnNpb24nXSA9IGV2ZW50Ll9kZXBncmFwaFsncG4nXVtwbl1bJ3ZlcnNpb24nXS5sc3RyaXAoIjoiKQorCisgICAgICAgICAgICBpZiAnc3VtbWFyeScgaW4gZXZlbnQuX2RlcGdyYXBoWydwbiddW3BuXToKKyAgICAgICAgICAgICAgICByZWNpcGVfaW5mb1snc3VtbWFyeSddID0gZXZlbnQuX2RlcGdyYXBoWydwbiddW3BuXVsnc3VtbWFyeSddCisKKyAgICAgICAgICAgIGlmICdsaWNlbnNlJyBpbiBldmVudC5fZGVwZ3JhcGhbJ3BuJ11bcG5dOgorICAgICAgICAgICAgICAgIHJlY2lwZV9pbmZvWydsaWNlbnNlJ10gPSBldmVudC5fZGVwZ3JhcGhbJ3BuJ11bcG5dWydsaWNlbnNlJ10KKworICAgICAgICAgICAgaWYgJ2Rlc2NyaXB0aW9uJyBpbiBldmVudC5fZGVwZ3JhcGhbJ3BuJ11bcG5dOgorICAgICAgICAgICAgICAgIHJlY2lwZV9pbmZvWydkZXNjcmlwdGlvbiddID0gZXZlbnQuX2RlcGdyYXBoWydwbiddW3BuXVsnZGVzY3JpcHRpb24nXQorCisgICAgICAgICAgICBpZiAnc2VjdGlvbicgaW4gZXZlbnQuX2RlcGdyYXBoWydwbiddW3BuXToKKyAgICAgICAgICAgICAgICByZWNpcGVfaW5mb1snc2VjdGlvbiddID0gZXZlbnQuX2RlcGdyYXBoWydwbiddW3BuXVsnc2VjdGlvbiddCisKKyAgICAgICAgICAgIGlmICdob21lcGFnZScgaW4gZXZlbnQuX2RlcGdyYXBoWydwbiddW3BuXToKKyAgICAgICAgICAgICAgICByZWNpcGVfaW5mb1snaG9tZXBhZ2UnXSA9IGV2ZW50Ll9kZXBncmFwaFsncG4nXVtwbl1bJ2hvbWVwYWdlJ10KKworICAgICAgICAgICAgaWYgJ2J1Z3RyYWNrZXInIGluIGV2ZW50Ll9kZXBncmFwaFsncG4nXVtwbl06CisgICAgICAgICAgICAgICAgcmVjaXBlX2luZm9bJ2J1Z3RyYWNrZXInXSA9IGV2ZW50Ll9kZXBncmFwaFsncG4nXVtwbl1bJ2J1Z3RyYWNrZXInXQorCisgICAgICAgICAgICByZWNpcGVfaW5mb1snZmlsZV9wYXRoJ10gPSBmaWxlX25hbWUKKyAgICAgICAgICAgIHJlY2lwZV9pbmZvWydwYXRoZmxhZ3MnXSA9IHBhdGhmbGFncworCisgICAgICAgICAgICBpZiByZWNpcGVfaW5mb1snZmlsZV9wYXRoJ10uc3RhcnRzd2l0aChyZWNpcGVfaW5mb1snbGF5ZXJfdmVyc2lvbiddLmxvY2FsX3BhdGgpOgorICAgICAgICAgICAgICAgIHJlY2lwZV9pbmZvWydmaWxlX3BhdGgnXSA9IHJlY2lwZV9pbmZvWydmaWxlX3BhdGgnXVtsZW4ocmVjaXBlX2luZm9bJ2xheWVyX3ZlcnNpb24nXS5sb2NhbF9wYXRoKTpdLmxzdHJpcCgiLyIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiUmVjaXBlIGZpbGUgcGF0aCAlcyBpcyBub3QgdW5kZXIgbGF5ZXIgdmVyc2lvbiBhdCAlcyIgJSAocmVjaXBlX2luZm9bJ2ZpbGVfcGF0aCddLCByZWNpcGVfaW5mb1snbGF5ZXJfdmVyc2lvbiddLmxvY2FsX3BhdGgpKQorCisgICAgICAgICAgICByZWNpcGUgPSBzZWxmLm9ybV93cmFwcGVyLmdldF91cGRhdGVfcmVjaXBlX29iamVjdChyZWNpcGVfaW5mbykKKyAgICAgICAgICAgIHJlY2lwZS5pc19pbWFnZSA9IEZhbHNlCisgICAgICAgICAgICBpZiAnaW5oZXJpdHMnIGluIGV2ZW50Ll9kZXBncmFwaFsncG4nXVtwbl0ua2V5cygpOgorICAgICAgICAgICAgICAgIGZvciBjbHMgaW4gZXZlbnQuX2RlcGdyYXBoWydwbiddW3BuXVsnaW5oZXJpdHMnXToKKyAgICAgICAgICAgICAgICAgICAgaWYgY2xzLmVuZHN3aXRoKCcvaW1hZ2UuYmJjbGFzcycpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVjaXBlLmlzX2ltYWdlID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIHJlY2lwZS5pc19pbWFnZToKKyAgICAgICAgICAgICAgICBmb3IgdCBpbiBzZWxmLmludGVybmFsX3N0YXRlWyd0YXJnZXRzJ106CisgICAgICAgICAgICAgICAgICAgIGlmIHBuID09IHQudGFyZ2V0OgorICAgICAgICAgICAgICAgICAgICAgICAgdC5pc19pbWFnZSA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIHQuc2F2ZSgpCisgICAgICAgICAgICBzZWxmLmludGVybmFsX3N0YXRlWydyZWNpcGVzJ11bcG5dID0gcmVjaXBlCisKKyAgICAgICAgIyB3ZSdsbCBub3QgZ2V0IHJlY2lwZXMgZm9yIGtleSB3LyB2YWx1ZXMgbGlzdGVkIGluIEFTU1VNRV9QUk9WSURFRAorCisgICAgICAgIGFzc3VtZV9wcm92aWRlZCA9IHNlbGYuc2VydmVyLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJBU1NVTUVfUFJPVklERUQiXSlbMF0uc3BsaXQoKQorCisgICAgICAgICMgc2F2ZSByZWNpcGUgZGVwZW5kZW5jeQorICAgICAgICAjIGJ1aWxkdGltZQorICAgICAgICByZWNpcGVkZXBzX29iamVjdHMgPSBbXQorICAgICAgICBmb3IgcmVjaXBlIGluIGV2ZW50Ll9kZXBncmFwaFsnZGVwZW5kcyddOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRhcmdldCA9IHNlbGYuaW50ZXJuYWxfc3RhdGVbJ3JlY2lwZXMnXVtyZWNpcGVdCisgICAgICAgICAgICAgICAgZm9yIGRlcCBpbiBldmVudC5fZGVwZ3JhcGhbJ2RlcGVuZHMnXVtyZWNpcGVdOgorICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5ID0gc2VsZi5pbnRlcm5hbF9zdGF0ZVsncmVjaXBlcyddW2RlcF0KKyAgICAgICAgICAgICAgICAgICAgcmVjaXBlZGVwc19vYmplY3RzLmFwcGVuZChSZWNpcGVfRGVwZW5kZW5jeSggcmVjaXBlID0gdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZHNfb24gPSBkZXBlbmRlbmN5LCBkZXBfdHlwZSA9IFJlY2lwZV9EZXBlbmRlbmN5LlRZUEVfREVQRU5EUykpCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICBpZiBlIG5vdCBpbiBhc3N1bWVfcHJvdmlkZWQgYW5kIG5vdCBzdHIoZSkuc3RhcnRzd2l0aCgidmlydHVhbC8iKToKKyAgICAgICAgICAgICAgICAgICAgZXJyb3Jtc2cgKz0gIiAgc3RwZDogS2V5RXJyb3Igc2F2aW5nIHJlY2lwZSBkZXBlbmRlbmN5IGZvciAlcywgJXMgXG4iICUgKHJlY2lwZSwgZSkKKyAgICAgICAgUmVjaXBlX0RlcGVuZGVuY3kub2JqZWN0cy5idWxrX2NyZWF0ZShyZWNpcGVkZXBzX29iamVjdHMpCisKKyAgICAgICAgIyBzYXZlIGFsbCB0YXNrIGluZm9ybWF0aW9uCisgICAgICAgIGRlZiBfc2F2ZV9hX3Rhc2sodGFza2Rlc2MpOgorICAgICAgICAgICAgc3BlYyA9IHJlLnNwbGl0KHInXC4nLCB0YXNrZGVzYykKKyAgICAgICAgICAgIHBuID0gIi4iLmpvaW4oc3BlY1swOi0xXSkKKyAgICAgICAgICAgIHRhc2tuYW1lID0gc3BlY1stMV0KKyAgICAgICAgICAgIGUgPSBldmVudAorICAgICAgICAgICAgZS50YXNrbmFtZSA9IHBuCisgICAgICAgICAgICByZWNpcGUgPSBzZWxmLmludGVybmFsX3N0YXRlWydyZWNpcGVzJ11bcG5dCisgICAgICAgICAgICB0YXNrX2luZm8gPSBzZWxmLl9nZXRfdGFza19pbmZvcm1hdGlvbihlLCByZWNpcGUpCisgICAgICAgICAgICB0YXNrX2luZm9bJ3Rhc2tfbmFtZSddID0gdGFza25hbWUKKyAgICAgICAgICAgIHRhc2tfb2JqID0gc2VsZi5vcm1fd3JhcHBlci5nZXRfdXBkYXRlX3Rhc2tfb2JqZWN0KHRhc2tfaW5mbykKKyAgICAgICAgICAgIHJldHVybiB0YXNrX29iagorCisgICAgICAgICMgY3JlYXRlIHRhc2tzCisgICAgICAgIHRhc2tzID0ge30KKyAgICAgICAgZm9yIHRhc2tkZXNjIGluIGV2ZW50Ll9kZXBncmFwaFsndGRlcGVuZHMnXToKKyAgICAgICAgICAgIHRhc2tzW3Rhc2tkZXNjXSA9IF9zYXZlX2FfdGFzayh0YXNrZGVzYykKKworICAgICAgICAjIGNyZWF0ZSBkZXBlbmRlbmNpZXMgYmV0d2VlbiB0YXNrcworICAgICAgICB0YXNrZGVwc19vYmplY3RzID0gW10KKyAgICAgICAgZm9yIHRhc2tkZXNjIGluIGV2ZW50Ll9kZXBncmFwaFsndGRlcGVuZHMnXToKKyAgICAgICAgICAgIHRhcmdldCA9IHRhc2tzW3Rhc2tkZXNjXQorICAgICAgICAgICAgZm9yIHRhc2tkZXAgaW4gZXZlbnQuX2RlcGdyYXBoWyd0ZGVwZW5kcyddW3Rhc2tkZXNjXToKKyAgICAgICAgICAgICAgICBpZiB0YXNrZGVwIG5vdCBpbiB0YXNrczoKKyAgICAgICAgICAgICAgICAgICAgIyBGZXRjaCB0YXNrcyBpbmZvIGlzIG5vdCBjb2xsZWN0ZWQgcHJldmlvdXNseQorICAgICAgICAgICAgICAgICAgICBkZXAgPSBfc2F2ZV9hX3Rhc2sodGFza2RlcCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBkZXAgPSB0YXNrc1t0YXNrZGVwXQorICAgICAgICAgICAgICAgIHRhc2tkZXBzX29iamVjdHMuYXBwZW5kKFRhc2tfRGVwZW5kZW5jeSggdGFzayA9IHRhcmdldCwgZGVwZW5kc19vbiA9IGRlcCApKQorICAgICAgICBUYXNrX0RlcGVuZGVuY3kub2JqZWN0cy5idWxrX2NyZWF0ZSh0YXNrZGVwc19vYmplY3RzKQorCisgICAgICAgIGlmIGxlbihlcnJvcm1zZykgPiAwOgorICAgICAgICAgICAgbG9nZ2VyLndhcm4oImJ1aWxkaW5mb2hlbHBlcjogZGVwZW5kZW5jeSBpbmZvIG5vdCBpZGVudGlmeSByZWNpcGVzOiBcbiVzIiwgZXJyb3Jtc2cpCisKKworICAgIGRlZiBzdG9yZV9idWlsZF9wYWNrYWdlX2luZm9ybWF0aW9uKHNlbGYsIGV2ZW50KToKKyAgICAgICAgcGFja2FnZV9pbmZvID0gQnVpbGRJbmZvSGVscGVyLl9nZXRfZGF0YV9mcm9tX2V2ZW50KGV2ZW50KQorICAgICAgICBzZWxmLm9ybV93cmFwcGVyLnNhdmVfYnVpbGRfcGFja2FnZV9pbmZvcm1hdGlvbihzZWxmLmludGVybmFsX3N0YXRlWydidWlsZCddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmludGVybmFsX3N0YXRlWydyZWNpcGVzJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorCisgICAgZGVmIF9zdG9yZV9idWlsZF9kb25lKHNlbGYsIGVycm9yY29kZSk6CisgICAgICAgIGxvZ2dlci5pbmZvKCJCdWlsZCBleGl0ZWQgd2l0aCBlcnJvcmNvZGUgJWQiLCBlcnJvcmNvZGUpCisgICAgICAgIGJyX2lkLCBiZV9pZCA9IHNlbGYuYnJiZS5zcGxpdCgiOiIpCisgICAgICAgIGJlID0gQnVpbGRFbnZpcm9ubWVudC5vYmplY3RzLmdldChwayA9IGJlX2lkKQorICAgICAgICBiZS5sb2NrID0gQnVpbGRFbnZpcm9ubWVudC5MT0NLX0xPQ0sKKyAgICAgICAgYmUuc2F2ZSgpCisgICAgICAgIGJyID0gQnVpbGRSZXF1ZXN0Lm9iamVjdHMuZ2V0KHBrID0gYnJfaWQpCisgICAgICAgIGlmIGVycm9yY29kZSA9PSAwOgorICAgICAgICAgICAgIyByZXF1ZXN0IGFyY2hpdmFsIG9mIHRoZSBwcm9qZWN0IGFydGlmYWN0cworICAgICAgICAgICAgYnIuc3RhdGUgPSBCdWlsZFJlcXVlc3QuUkVRX0FSQ0hJVkUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJyLnN0YXRlID0gQnVpbGRSZXF1ZXN0LlJFUV9GQUlMRUQKKyAgICAgICAgYnIuc2F2ZSgpCisKKworICAgIGRlZiBzdG9yZV9sb2dfZXJyb3Ioc2VsZiwgdGV4dCk6CisgICAgICAgIG1vY2tldmVudCA9IE1vY2tFdmVudCgpCisgICAgICAgIG1vY2tldmVudC5sZXZlbG5vID0gZm9ybWF0dGVyLkVSUk9SCisgICAgICAgIG1vY2tldmVudC5tc2cgPSB0ZXh0CisgICAgICAgIG1vY2tldmVudC5wYXRobmFtZSA9ICctLSBOb25lJworICAgICAgICBtb2NrZXZlbnQubGluZW5vID0gTG9nTWVzc2FnZS5FUlJPUgorICAgICAgICBzZWxmLnN0b3JlX2xvZ19ldmVudChtb2NrZXZlbnQpCisKKyAgICBkZWYgc3RvcmVfbG9nX2V4Y2VwdGlvbihzZWxmLCB0ZXh0LCBiYWNrdHJhY2UgPSAiIik6CisgICAgICAgIG1vY2tldmVudCA9IE1vY2tFdmVudCgpCisgICAgICAgIG1vY2tldmVudC5sZXZlbG5vID0gLTEKKyAgICAgICAgbW9ja2V2ZW50Lm1zZyA9IHRleHQKKyAgICAgICAgbW9ja2V2ZW50LnBhdGhuYW1lID0gYmFja3RyYWNlCisgICAgICAgIG1vY2tldmVudC5saW5lbm8gPSAtMQorICAgICAgICBzZWxmLnN0b3JlX2xvZ19ldmVudChtb2NrZXZlbnQpCisKKworICAgIGRlZiBzdG9yZV9sb2dfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICBpZiBldmVudC5sZXZlbG5vIDwgZm9ybWF0dGVyLldBUk5JTkc6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiAnYXJncycgaW4gdmFycyhldmVudCk6CisgICAgICAgICAgICBldmVudC5tc2cgPSBldmVudC5tc2cgJSBldmVudC5hcmdzCisKKyAgICAgICAgaWYgbm90ICdidWlsZCcgaW4gc2VsZi5pbnRlcm5hbF9zdGF0ZToKKyAgICAgICAgICAgIGlmIHNlbGYuYnJiZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIGlmIG5vdCAnYmFja2xvZycgaW4gc2VsZi5pbnRlcm5hbF9zdGF0ZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5pbnRlcm5hbF9zdGF0ZVsnYmFja2xvZyddID0gW10KKyAgICAgICAgICAgICAgICBzZWxmLmludGVybmFsX3N0YXRlWydiYWNrbG9nJ10uYXBwZW5kKGV2ZW50KQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZWxzZTogICAjIHdlJ3JlIHVuZGVyIFRvYXN0ZXIgY29udHJvbCwgdGhlIGJ1aWxkIGlzIGFscmVhZHkgY3JlYXRlZAorICAgICAgICAgICAgICAgIGJyLCBfID0gc2VsZi5icmJlLnNwbGl0KCI6IikKKyAgICAgICAgICAgICAgICBidWlsZHJlcXVlc3QgPSBCdWlsZFJlcXVlc3Qub2JqZWN0cy5nZXQocGsgPSBicikKKyAgICAgICAgICAgICAgICBzZWxmLmludGVybmFsX3N0YXRlWydidWlsZCddID0gYnVpbGRyZXF1ZXN0LmJ1aWxkCisKKyAgICAgICAgaWYgJ2J1aWxkJyBpbiBzZWxmLmludGVybmFsX3N0YXRlIGFuZCAnYmFja2xvZycgaW4gc2VsZi5pbnRlcm5hbF9zdGF0ZToKKyAgICAgICAgICAgICMgaWYgd2UgaGF2ZSBhIGJhY2tsb2cgb2YgZXZlbnRzLCBkbyBvdXIgYmVzdCB0byBzYXZlIHRoZW0gaGVyZQorICAgICAgICAgICAgaWYgbGVuKHNlbGYuaW50ZXJuYWxfc3RhdGVbJ2JhY2tsb2cnXSk6CisgICAgICAgICAgICAgICAgdGVtcGV2ZW50ID0gc2VsZi5pbnRlcm5hbF9zdGF0ZVsnYmFja2xvZyddLnBvcCgpCisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJidWlsZGluZm9oZWxwZXI6IFNhdmluZyBzdG9yZWQgZXZlbnQgJXMgIiAlIHRlbXBldmVudCkKKyAgICAgICAgICAgICAgICBzZWxmLnN0b3JlX2xvZ19ldmVudCh0ZW1wZXZlbnQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJidWlsZGluZm9oZWxwZXI6IEFsbCBldmVudHMgc2F2ZWQiKQorICAgICAgICAgICAgICAgIGRlbCBzZWxmLmludGVybmFsX3N0YXRlWydiYWNrbG9nJ10KKworICAgICAgICBsb2dfaW5mb3JtYXRpb24gPSB7fQorICAgICAgICBsb2dfaW5mb3JtYXRpb25bJ2J1aWxkJ10gPSBzZWxmLmludGVybmFsX3N0YXRlWydidWlsZCddCisgICAgICAgIGlmIGV2ZW50LmxldmVsbm8gPT0gZm9ybWF0dGVyLkVSUk9SOgorICAgICAgICAgICAgbG9nX2luZm9ybWF0aW9uWydsZXZlbCddID0gTG9nTWVzc2FnZS5FUlJPUgorICAgICAgICBlbGlmIGV2ZW50LmxldmVsbm8gPT0gZm9ybWF0dGVyLldBUk5JTkc6CisgICAgICAgICAgICBsb2dfaW5mb3JtYXRpb25bJ2xldmVsJ10gPSBMb2dNZXNzYWdlLldBUk5JTkcKKyAgICAgICAgZWxpZiBldmVudC5sZXZlbG5vID09IC0yOiAgICMgdG9hc3RlciBzZWxmLWxvZ2dpbmcKKyAgICAgICAgICAgIGxvZ19pbmZvcm1hdGlvblsnbGV2ZWwnXSA9IC0yCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsb2dfaW5mb3JtYXRpb25bJ2xldmVsJ10gPSBMb2dNZXNzYWdlLklORk8KKworICAgICAgICBsb2dfaW5mb3JtYXRpb25bJ21lc3NhZ2UnXSA9IGV2ZW50Lm1zZworICAgICAgICBsb2dfaW5mb3JtYXRpb25bJ3BhdGhuYW1lJ10gPSBldmVudC5wYXRobmFtZQorICAgICAgICBsb2dfaW5mb3JtYXRpb25bJ2xpbmVubyddID0gZXZlbnQubGluZW5vCisgICAgICAgIGxvZ2dlci5pbmZvKCJMb2dnaW5nIGVycm9yIDI6ICVzIiwgbG9nX2luZm9ybWF0aW9uKQorICAgICAgICBzZWxmLm9ybV93cmFwcGVyLmNyZWF0ZV9sb2dtZXNzYWdlKGxvZ19pbmZvcm1hdGlvbikKKworICAgIGRlZiBjbG9zZShzZWxmLCBlcnJvcmNvZGUpOgorICAgICAgICBpZiBzZWxmLmJyYmUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLl9zdG9yZV9idWlsZF9kb25lKGVycm9yY29kZSkKKworICAgICAgICBpZiAnYmFja2xvZycgaW4gc2VsZi5pbnRlcm5hbF9zdGF0ZToKKyAgICAgICAgICAgIGlmICdidWlsZCcgaW4gc2VsZi5pbnRlcm5hbF9zdGF0ZToKKyAgICAgICAgICAgICAgICAjIHdlIHNhdmUgbWlzc2VkIGV2ZW50cyBpbiB0aGUgZGF0YWJhc2UgZm9yIHRoZSBjdXJyZW50IGJ1aWxkCisgICAgICAgICAgICAgICAgdGVtcGV2ZW50ID0gc2VsZi5pbnRlcm5hbF9zdGF0ZVsnYmFja2xvZyddLnBvcCgpCisgICAgICAgICAgICAgICAgc2VsZi5zdG9yZV9sb2dfZXZlbnQodGVtcGV2ZW50KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIHdlIGhhdmUgbm8gYnVpbGQsIGFuZCB3ZSBzdGlsbCBoYXZlIGV2ZW50czsgc29tZXRoaW5nIGFtYXppbmdseSB3cm9uZyBoYXBwZW5kCisgICAgICAgICAgICAgICAgZm9yIGV2ZW50IGluIHNlbGYuaW50ZXJuYWxfc3RhdGVbJ2JhY2tsb2cnXToKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJVTlNBVkVEIGxvZzogJXMiLCBldmVudC5tc2cpCisKKyAgICAgICAgaWYgbm90IGNvbm5lY3Rpb24uZmVhdHVyZXMuYXV0b2NvbW1pdHNfd2hlbl9hdXRvY29tbWl0X2lzX29mZjoKKyAgICAgICAgICAgIHRyYW5zYWN0aW9uLnNldF9hdXRvY29tbWl0KFRydWUpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvX19pbml0X18ucHkgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdjYmUxYQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9fX2luaXRfXy5weQpAQCAtMCwwICsxLDE3IEBACisjCisjIEd0aysgVUkgcGllY2VzIGZvciBCaXRCYWtlCisjCisjIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IFJpY2hhcmQgUHVyZGllCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2J1aWxkZGV0YWlsc3BhZ2UucHkgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvYnVpbGRkZXRhaWxzcGFnZS5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43ZmM2OTBlCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2J1aWxkZGV0YWlsc3BhZ2UucHkKQEAgLTAsMCArMSw0MzcgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBCaXRCYWtlIEdyYXBoaWNhbCBHVEsgVXNlciBJbnRlcmZhY2UKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEyICAgICAgICBJbnRlbCBDb3Jwb3JhdGlvbgorIworIyBBdXRob3JlZCBieSBEb25neGlhbyBYdSA8ZG9uZ3hpYW8ueHVAaW50ZWwuY29tPgorIyBBdXRob3JlZCBieSBTaGFuZSBXYW5nIDxzaGFuZS53YW5nQGludGVsLmNvbT4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBndGsKK2ltcG9ydCBwYW5nbworaW1wb3J0IGdvYmplY3QKK2ltcG9ydCBiYi5wcm9jZXNzCitmcm9tIGJiLnVpLmNydW1icy5wcm9ncmVzc2JhciBpbXBvcnQgSG9iUHJvZ3Jlc3NCYXIKK2Zyb20gYmIudWkuY3J1bWJzLmhvYndpZGdldCBpbXBvcnQgaGljLCBIb2JOb3RlYm9vaywgSG9iQWx0QnV0dG9uLCBIb2JXYXJwQ2VsbFJlbmRlcmVyVGV4dCwgSG9iQnV0dG9uLCBIb2JJbmZvQnV0dG9uCitmcm9tIGJiLnVpLmNydW1icy5ydW5uaW5nYnVpbGQgaW1wb3J0IFJ1bm5pbmdCdWlsZFRyZWVWaWV3Citmcm9tIGJiLnVpLmNydW1icy5ydW5uaW5nYnVpbGQgaW1wb3J0IEJ1aWxkRmFpbHVyZVRyZWVWaWV3Citmcm9tIGJiLnVpLmNydW1icy5ob2JwYWdlcyBpbXBvcnQgSG9iUGFnZQorZnJvbSBiYi51aS5jcnVtYnMuaG9iY29sb3IgaW1wb3J0IEhvYkNvbG9ycworCitjbGFzcyBCdWlsZENvbmZpZ3VyYXRpb25UcmVlVmlldyhndGsuVHJlZVZpZXcpOgorICAgIGRlZiBfX2luaXRfXyAoc2VsZik6CisgICAgICAgIGd0ay5UcmVlVmlldy5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLnNldF9ydWxlc19oaW50KEZhbHNlKQorICAgICAgICBzZWxmLnNldF9oZWFkZXJzX3Zpc2libGUoRmFsc2UpCisgICAgICAgIHNlbGYuc2V0X3Byb3BlcnR5KCJob3Zlci1leHBhbmQiLCBUcnVlKQorICAgICAgICBzZWxmLmdldF9zZWxlY3Rpb24oKS5zZXRfbW9kZShndGsuU0VMRUNUSU9OX1NJTkdMRSkKKworICAgICAgICAjIFRoZSBpY29uIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgd2UncmUgYnVpbGRpbmcgb3IgZmFpbGVkLgorICAgICAgICByZW5kZXJlcjAgPSBndGsuQ2VsbFJlbmRlcmVyVGV4dCgpCisgICAgICAgIHJlbmRlcmVyMC5zZXRfcHJvcGVydHkoJ2ZvbnQtZGVzYycsIHBhbmdvLkZvbnREZXNjcmlwdGlvbignY291cmllciBib2xkIDEyJykpCisgICAgICAgIGNvbDAgPSBndGsuVHJlZVZpZXdDb2x1bW4gKCJOYW1lIiwgcmVuZGVyZXIwLCB0ZXh0PTApCisgICAgICAgIHNlbGYuYXBwZW5kX2NvbHVtbiAoY29sMCkKKworICAgICAgICAjIFRoZSBtZXNzYWdlIG9mIGNvbmZpZ3VyYXRpb24uCisgICAgICAgIHJlbmRlcmVyMSA9IEhvYldhcnBDZWxsUmVuZGVyZXJUZXh0KGNvbF9udW1iZXI9MSkKKyAgICAgICAgY29sMSA9IGd0ay5UcmVlVmlld0NvbHVtbiAoIlZhbHVlcyIsIHJlbmRlcmVyMSwgdGV4dD0xKQorICAgICAgICBzZWxmLmFwcGVuZF9jb2x1bW4gKGNvbDEpCisKKyAgICBkZWYgc2V0X3ZhcnMoc2VsZiwga2V5PSIiLCB2YXI9WyIiXSk6CisgICAgICAgIGQgPSB7fQorICAgICAgICBpZiB0eXBlKHZhcikgPT0gc3RyOgorICAgICAgICAgICAgZCA9IHtrZXk6IFt2YXJdfQorICAgICAgICBlbGlmIHR5cGUodmFyKSA9PSBsaXN0IGFuZCBsZW4odmFyKSA+IDE6CisgICAgICAgICAgICAjY3JlYXRlIHRoZSBzdWIgaXRlbSBsaW5lCisgICAgICAgICAgICBsID0gW10KKyAgICAgICAgICAgIHRleHQgPSAiIgorICAgICAgICAgICAgZm9yIGl0ZW0gaW4gdmFyOgorICAgICAgICAgICAgICAgIHRleHQgPSAiIC0gIiArIGl0ZW0KKyAgICAgICAgICAgICAgICBsLmFwcGVuZCh0ZXh0KQorICAgICAgICAgICAgZCA9IHtrZXk6IHZhcn0KKworICAgICAgICByZXR1cm4gZAorCisgICAgZGVmIHNldF9jb25maWdfbW9kZWwoc2VsZiwgc2hvd192YXJzKToKKyAgICAgICAgbGlzdG1vZGVsID0gZ3RrLlRyZWVTdG9yZShnb2JqZWN0LlRZUEVfU1RSSU5HLCBnb2JqZWN0LlRZUEVfU1RSSU5HKQorICAgICAgICBwYXJlbnQgPSBOb25lCisgICAgICAgIGZvciB2YXIgaW4gc2hvd192YXJzOgorICAgICAgICAgICAgZm9yIHN1Yml0ZW0gaW4gdmFyLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgbmFtZSA9IHN1Yml0ZW1bMF0KKyAgICAgICAgICAgICAgICBpc19wYXJlbnQgPSBUcnVlCisgICAgICAgICAgICAgICAgZm9yIHZhbHVlIGluIHN1Yml0ZW1bMV06CisgICAgICAgICAgICAgICAgICAgIGlmIGlzX3BhcmVudDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IGxpc3Rtb2RlbC5hcHBlbmQocGFyZW50LCAobmFtZSwgdmFsdWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgaXNfcGFyZW50ID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Rtb2RlbC5hcHBlbmQocGFyZW50LCAoTm9uZSwgdmFsdWUpKQorICAgICAgICAgICAgICAgICAgICBuYW1lID0gIiAgICAgLSAiCisgICAgICAgICAgICAgICAgcGFyZW50ID0gTm9uZQorICAgICAgICAjIHJlbmV3IHRoZSB0cmVlIG1vZGVsIGFmdGVyIGdldCB0aGUgY29uZmlndXJhdGlvbiBtZXNzYWdlcworICAgICAgICBzZWxmLnNldF9tb2RlbChsaXN0bW9kZWwpCisKKyAgICBkZWYgc2hvdyhzZWxmLCBzcmNfY29uZmlnX2luZm8sIHNyY19wYXJhbXMpOgorICAgICAgICB2YXJzID0gW10KKyAgICAgICAgdmFycy5hcHBlbmQoc2VsZi5zZXRfdmFycygiQkIgdmVyc2lvbjoiLCBzcmNfcGFyYW1zLmJiX3ZlcnNpb24pKQorICAgICAgICB2YXJzLmFwcGVuZChzZWxmLnNldF92YXJzKCJUYXJnZXQgYXJjaDoiLCBzcmNfcGFyYW1zLnRhcmdldF9hcmNoKSkKKyAgICAgICAgdmFycy5hcHBlbmQoc2VsZi5zZXRfdmFycygiVGFyZ2V0IE9TOiIsIHNyY19wYXJhbXMudGFyZ2V0X29zKSkKKyAgICAgICAgdmFycy5hcHBlbmQoc2VsZi5zZXRfdmFycygiTWFjaGluZToiLCBzcmNfY29uZmlnX2luZm8uY3Vycl9tYWNoKSkKKyAgICAgICAgdmFycy5hcHBlbmQoc2VsZi5zZXRfdmFycygiRGlzdHJvOiIsIHNyY19jb25maWdfaW5mby5jdXJyX2Rpc3RybykpCisgICAgICAgIHZhcnMuYXBwZW5kKHNlbGYuc2V0X3ZhcnMoIkRpc3RybyB2ZXJzaW9uOiIsIHNyY19wYXJhbXMuZGlzdHJvX3ZlcnNpb24pKQorICAgICAgICB2YXJzLmFwcGVuZChzZWxmLnNldF92YXJzKCJTREsgbWFjaGluZToiLCBzcmNfY29uZmlnX2luZm8uY3Vycl9zZGtfbWFjaGluZSkpCisgICAgICAgIHZhcnMuYXBwZW5kKHNlbGYuc2V0X3ZhcnMoIlR1bmUgZmVhdHVyZXM6Iiwgc3JjX3BhcmFtcy50dW5lX3BrZ2FyY2gpKQorICAgICAgICB2YXJzLmFwcGVuZChzZWxmLnNldF92YXJzKCJMYXllcnM6Iiwgc3JjX2NvbmZpZ19pbmZvLmxheWVycykpCisKKyAgICAgICAgZm9yIHBhdGggaW4gc3JjX2NvbmZpZ19pbmZvLmxheWVyczoKKyAgICAgICAgICAgIGltcG9ydCBvcywgb3MucGF0aAorICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocGF0aCk6CisgICAgICAgICAgICAgICAgYnJhbmNoID0gYmIucHJvY2Vzcy5ydW4oJ2NkICVzOyBnaXQgYnJhbmNoIHwgZ3JlcCAiXiogIiB8IHRyIC1kICIqICInICUgcGF0aClbMF0KKyAgICAgICAgICAgICAgICBpZiBicmFuY2guc3RhcnRzd2l0aCgiZmF0YWw6Iik6CisgICAgICAgICAgICAgICAgICAgIGJyYW5jaCA9ICIodW5rbm93bikiCisgICAgICAgICAgICAgICAgaWYgYnJhbmNoOgorICAgICAgICAgICAgICAgICAgICBicmFuY2ggPSBicmFuY2guc3RyaXAoJ1xuJykKKyAgICAgICAgICAgICAgICAgICAgdmFycy5hcHBlbmQoc2VsZi5zZXRfdmFycygiQnJhbmNoOiIsIGJyYW5jaCkpCisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICBzZWxmLnNldF9jb25maWdfbW9kZWwodmFycykKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgc2VsZi5zZXRfbW9kZWwoTm9uZSkKKworIworIyBCdWlsZERldGFpbHNQYWdlCisjCisKK2NsYXNzIEJ1aWxkRGV0YWlsc1BhZ2UgKEhvYlBhZ2UpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBzdXBlcihCdWlsZERldGFpbHNQYWdlLCBzZWxmKS5fX2luaXRfXyhidWlsZGVyLCAiQnVpbGRpbmcgLi4uIikKKworICAgICAgICBzZWxmLm51bV9vZl9pc3N1ZXMgPSAwCisgICAgICAgIHNlbGYuZW5kcGF0aCA9ICgwLCkKKyAgICAgICAgIyBjcmVhdGUgdmlzdWFsIGVsZW1lbnRzCisgICAgICAgIHNlbGYuY3JlYXRlX3Zpc3VhbF9lbGVtZW50cygpCisKKyAgICBkZWYgY3JlYXRlX3Zpc3VhbF9lbGVtZW50cyhzZWxmKToKKyAgICAgICAgIyBjcmVhdGUgdmlzdWFsIGVsZW1lbnRzCisgICAgICAgIHNlbGYudmJveCA9IGd0ay5WQm94KEZhbHNlLCAxMikKKworICAgICAgICBzZWxmLnByb2dyZXNzX2JveCA9IGd0ay5WQm94KEZhbHNlLCAxMikKKyAgICAgICAgc2VsZi50YXNrX3N0YXR1cyA9IGd0ay5MYWJlbCgiXG4iKSAjIHRvIGVuc3VyZSBsYXlvdXQgaXMgY29ycmVjdAorICAgICAgICBzZWxmLnRhc2tfc3RhdHVzLnNldF9hbGlnbm1lbnQoMC4wLCAwLjUpCisgICAgICAgIHNlbGYucHJvZ3Jlc3NfYm94LnBhY2tfc3RhcnQoc2VsZi50YXNrX3N0YXR1cywgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICBzZWxmLnByb2dyZXNzX2hib3ggPSBndGsuSEJveChGYWxzZSwgNikKKyAgICAgICAgc2VsZi5wcm9ncmVzc19ib3gucGFja19lbmQoc2VsZi5wcm9ncmVzc19oYm94LCBleHBhbmQ9VHJ1ZSwgZmlsbD1UcnVlKQorICAgICAgICBzZWxmLnByb2dyZXNzX2JhciA9IEhvYlByb2dyZXNzQmFyKCkKKyAgICAgICAgc2VsZi5wcm9ncmVzc19oYm94LnBhY2tfc3RhcnQoc2VsZi5wcm9ncmVzc19iYXIsIGV4cGFuZD1UcnVlLCBmaWxsPVRydWUpCisgICAgICAgIHNlbGYuc3RvcF9idXR0b24gPSBIb2JBbHRCdXR0b24oIlN0b3AiKQorICAgICAgICBzZWxmLnN0b3BfYnV0dG9uLmNvbm5lY3QoImNsaWNrZWQiLCBzZWxmLnN0b3BfYnV0dG9uX2NsaWNrZWRfY2IpCisgICAgICAgIHNlbGYuc3RvcF9idXR0b24uc2V0X3NlbnNpdGl2ZShGYWxzZSkKKyAgICAgICAgc2VsZi5wcm9ncmVzc19oYm94LnBhY2tfZW5kKHNlbGYuc3RvcF9idXR0b24sIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKworICAgICAgICBzZWxmLm5vdGVib29rID0gSG9iTm90ZWJvb2soKQorICAgICAgICBzZWxmLmNvbmZpZ190diA9IEJ1aWxkQ29uZmlndXJhdGlvblRyZWVWaWV3KCkKKyAgICAgICAgc2VsZi5zY3JvbGxlZF92aWV3X2NvbmZpZyA9IGd0ay5TY3JvbGxlZFdpbmRvdyAoKQorICAgICAgICBzZWxmLnNjcm9sbGVkX3ZpZXdfY29uZmlnLnNldF9wb2xpY3koZ3RrLlBPTElDWV9ORVZFUiwgZ3RrLlBPTElDWV9BTFdBWVMpCisgICAgICAgIHNlbGYuc2Nyb2xsZWRfdmlld19jb25maWcuYWRkKHNlbGYuY29uZmlnX3R2KQorICAgICAgICBzZWxmLm5vdGVib29rLmFwcGVuZF9wYWdlKHNlbGYuc2Nyb2xsZWRfdmlld19jb25maWcsICJCdWlsZCBjb25maWd1cmF0aW9uIikKKworICAgICAgICBzZWxmLmZhaWx1cmVfdHYgPSBCdWlsZEZhaWx1cmVUcmVlVmlldygpCisgICAgICAgIHNlbGYuZmFpbHVyZV9tb2RlbCA9IHNlbGYuYnVpbGRlci5oYW5kbGVyLmJ1aWxkLm1vZGVsLmZhaWx1cmVfbW9kZWwoKQorICAgICAgICBzZWxmLmZhaWx1cmVfdHYuc2V0X21vZGVsKHNlbGYuZmFpbHVyZV9tb2RlbCkKKyAgICAgICAgc2VsZi5zY3JvbGxlZF92aWV3X2ZhaWx1cmUgPSBndGsuU2Nyb2xsZWRXaW5kb3cgKCkKKyAgICAgICAgc2VsZi5zY3JvbGxlZF92aWV3X2ZhaWx1cmUuc2V0X3BvbGljeShndGsuUE9MSUNZX05FVkVSLCBndGsuUE9MSUNZX0FMV0FZUykKKyAgICAgICAgc2VsZi5zY3JvbGxlZF92aWV3X2ZhaWx1cmUuYWRkKHNlbGYuZmFpbHVyZV90dikKKyAgICAgICAgc2VsZi5ub3RlYm9vay5hcHBlbmRfcGFnZShzZWxmLnNjcm9sbGVkX3ZpZXdfZmFpbHVyZSwgIklzc3VlcyIpCisKKyAgICAgICAgc2VsZi5idWlsZF90diA9IFJ1bm5pbmdCdWlsZFRyZWVWaWV3KHJlYWRvbmx5PVRydWUsIGhvYj1UcnVlKQorICAgICAgICBzZWxmLmJ1aWxkX3R2LnNldF9tb2RlbChzZWxmLmJ1aWxkZXIuaGFuZGxlci5idWlsZC5tb2RlbCkKKyAgICAgICAgc2VsZi5zY3JvbGxlZF92aWV3X2J1aWxkID0gZ3RrLlNjcm9sbGVkV2luZG93ICgpCisgICAgICAgIHNlbGYuc2Nyb2xsZWRfdmlld19idWlsZC5zZXRfcG9saWN5KGd0ay5QT0xJQ1lfTkVWRVIsIGd0ay5QT0xJQ1lfQUxXQVlTKQorICAgICAgICBzZWxmLnNjcm9sbGVkX3ZpZXdfYnVpbGQuYWRkKHNlbGYuYnVpbGRfdHYpCisgICAgICAgIHNlbGYubm90ZWJvb2suYXBwZW5kX3BhZ2Uoc2VsZi5zY3JvbGxlZF92aWV3X2J1aWxkLCAiTG9nIikKKworICAgICAgICBzZWxmLmJ1aWxkZXIuaGFuZGxlci5idWlsZC5tb2RlbC5jb25uZWN0X2FmdGVyKCJyb3ctY2hhbmdlZCIsIHNlbGYuc2Nyb2xsX3RvX3ByZXNlbnRfcm93LCBzZWxmLnNjcm9sbGVkX3ZpZXdfYnVpbGQuZ2V0X3ZhZGp1c3RtZW50KCksIHNlbGYuYnVpbGRfdHYpCisKKyAgICAgICAgc2VsZi5idXR0b25fYm94ID0gZ3RrLkhCb3goRmFsc2UsIDYpCisgICAgICAgIHNlbGYuYmFja19idXR0b24gPSBIb2JBbHRCdXR0b24oJyZsdDsmbHQ7IEJhY2snKQorICAgICAgICBzZWxmLmJhY2tfYnV0dG9uLmNvbm5lY3QoImNsaWNrZWQiLCBzZWxmLmJhY2tfYnV0dG9uX2NsaWNrZWRfY2IpCisgICAgICAgIHNlbGYuYnV0dG9uX2JveC5wYWNrX3N0YXJ0KHNlbGYuYmFja19idXR0b24sIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKworICAgIGRlZiB1cGRhdGVfYnVpbGRfc3RhdHVzKHNlbGYsIGN1cnJlbnQsIHRvdGFsLCB0YXNrKToKKyAgICAgICAgcmVjaXBlX3BhdGgsIHJlY2lwZV90YXNrID0gdGFzay5zcGxpdCgiLCAiKQorICAgICAgICByZWNpcGUgPSBvcy5wYXRoLmJhc2VuYW1lKHJlY2lwZV9wYXRoKS5yc3RyaXAoIi5iYiIpCisgICAgICAgIHRza19tc2cgPSAiPGI+UnVubmluZyB0YXNrICVzIG9mICVzOjwvYj4gJXNcbjxiPlJlY2lwZTo8L2I+ICVzIiAlIChjdXJyZW50LCB0b3RhbCwgcmVjaXBlX3Rhc2ssIHJlY2lwZSkKKyAgICAgICAgc2VsZi50YXNrX3N0YXR1cy5zZXRfbWFya3VwKHRza19tc2cpCisgICAgICAgIHNlbGYuc3RvcF9idXR0b24uc2V0X3NlbnNpdGl2ZShUcnVlKQorCisgICAgZGVmIHJlc2V0X2J1aWxkX3N0YXR1cyhzZWxmKToKKyAgICAgICAgc2VsZi50YXNrX3N0YXR1cy5zZXRfbWFya3VwKCJcbiIpICMgdG8gZW5zdXJlIGxheW91dCBpcyBjb3JyZWN0CisgICAgICAgIHNlbGYuZW5kcGF0aCA9ICgwLCkKKworICAgIGRlZiBzaG93X2lzc3VlcyhzZWxmKToKKyAgICAgICAgc2VsZi5udW1fb2ZfaXNzdWVzICs9IDEKKyAgICAgICAgc2VsZi5ub3RlYm9vay5zaG93X2luZGljYXRvcl9pY29uKCJJc3N1ZXMiLCBzZWxmLm51bV9vZl9pc3N1ZXMpCisgICAgICAgIHNlbGYubm90ZWJvb2sucXVldWVfZHJhdygpCisKKyAgICBkZWYgcmVzZXRfaXNzdWVzKHNlbGYpOgorICAgICAgICBzZWxmLm51bV9vZl9pc3N1ZXMgPSAwCisgICAgICAgIHNlbGYubm90ZWJvb2suaGlkZV9pbmRpY2F0b3JfaWNvbigiSXNzdWVzIikKKworICAgIGRlZiBfcmVtb3ZlX2FsbF93aWRnZXQoc2VsZik6CisgICAgICAgIGNoaWxkcmVuID0gc2VsZi52Ym94LmdldF9jaGlsZHJlbigpIG9yIFtdCisgICAgICAgIGZvciBjaGlsZCBpbiBjaGlsZHJlbjoKKyAgICAgICAgICAgIHNlbGYudmJveC5yZW1vdmUoY2hpbGQpCisgICAgICAgIGNoaWxkcmVuID0gc2VsZi5ib3hfZ3JvdXBfYXJlYS5nZXRfY2hpbGRyZW4oKSBvciBbXQorICAgICAgICBmb3IgY2hpbGQgaW4gY2hpbGRyZW46CisgICAgICAgICAgICBzZWxmLmJveF9ncm91cF9hcmVhLnJlbW92ZShjaGlsZCkKKyAgICAgICAgY2hpbGRyZW4gPSBzZWxmLmdldF9jaGlsZHJlbigpIG9yIFtdCisgICAgICAgIGZvciBjaGlsZCBpbiBjaGlsZHJlbjoKKyAgICAgICAgICAgIHNlbGYucmVtb3ZlKGNoaWxkKQorCisgICAgZGVmIGFkZF9idWlsZF9mYWlsX3RvcF9iYXIoc2VsZiwgYWN0aW9ucywgbG9nX2ZpbGU9Tm9uZSk6CisgICAgICAgIHByaW1hcnlfYWN0aW9uID0gIkVkaXQgJXMiICUgYWN0aW9ucworCisgICAgICAgIGNvbG9yID0gSG9iQ29sb3JzLkVSUk9SCisgICAgICAgIGJ1aWxkX2ZhaWxfdG9wID0gZ3RrLkV2ZW50Qm94KCkKKyAgICAgICAgI2J1aWxkX2ZhaWxfdG9wLnNldF9zaXplX3JlcXVlc3QoLTEsIDIwMCkKKyAgICAgICAgYnVpbGRfZmFpbF90b3AubW9kaWZ5X2JnKGd0ay5TVEFURV9OT1JNQUwsIGd0ay5nZGsuY29sb3JfcGFyc2UoY29sb3IpKQorCisgICAgICAgIGJ1aWxkX2ZhaWxfdGFiID0gZ3RrLlRhYmxlKDE0LCA0NiwgVHJ1ZSkKKyAgICAgICAgYnVpbGRfZmFpbF90b3AuYWRkKGJ1aWxkX2ZhaWxfdGFiKQorCisgICAgICAgIGljb24gPSBndGsuSW1hZ2UoKQorICAgICAgICBpY29uX3BpeF9idWZmZXIgPSBndGsuZ2RrLnBpeGJ1Zl9uZXdfZnJvbV9maWxlKGhpYy5JQ09OX0lORElfRVJST1JfRklMRSkKKyAgICAgICAgaWNvbi5zZXRfZnJvbV9waXhidWYoaWNvbl9waXhfYnVmZmVyKQorICAgICAgICBidWlsZF9mYWlsX3RhYi5hdHRhY2goaWNvbiwgMSwgNCwgMCwgNikKKworICAgICAgICBsYWJlbCA9IGd0ay5MYWJlbCgpCisgICAgICAgIGxhYmVsLnNldF9hbGlnbm1lbnQoMC4wLCAwLjUpCisgICAgICAgIGxhYmVsLnNldF9tYXJrdXAoIjxzcGFuIHNpemU9J3gtbGFyZ2UnPjxiPiVzPC9iPjwvc3Bhbj4iICUgc2VsZi50aXRsZSkKKyAgICAgICAgYnVpbGRfZmFpbF90YWIuYXR0YWNoKGxhYmVsLCA0LCAyNiwgMCwgNikKKworICAgICAgICBsYWJlbCA9IGd0ay5MYWJlbCgpCisgICAgICAgIGxhYmVsLnNldF9hbGlnbm1lbnQoMC4wLCAwLjUpCisgICAgICAgICMgRW5zdXJlIHZhcmlhYmxlIGRpc2tfZnVsbCBpcyBkZWZpbmVkCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYuYnVpbGRlciwgJ2Rpc2tfZnVsbCcpOgorICAgICAgICAgICAgc2VsZi5idWlsZGVyLmRpc2tfZnVsbCA9IEZhbHNlCisKKyAgICAgICAgaWYgc2VsZi5idWlsZGVyLmRpc2tfZnVsbDoKKyAgICAgICAgICAgIG1hcmt1cCA9ICI8c3BhbiBzaXplPSdtZWRpdW0nPlRoZXJlIGlzIG5vIGRpc2sgc3BhY2UgbGVmdCwgc28gSG9iIGNhbm5vdCBmaW5pc2ggYnVpbGRpbmcgeW91ciBpbWFnZS4gRnJlZSB1cCBzb21lIGRpc2sgc3BhY2VcbiIKKyAgICAgICAgICAgIG1hcmt1cCArPSAiYW5kIHJlc3RhcnQgdGhlIGJ1aWxkLiBDaGVjayB0aGUgXCJJc3N1ZXNcIiB0YWIgZm9yIG1vcmUgZGV0YWlsczwvc3Bhbj4iCisgICAgICAgICAgICBsYWJlbC5zZXRfbWFya3VwKG1hcmt1cCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxhYmVsLnNldF9tYXJrdXAoIjxzcGFuIHNpemU9J21lZGl1bSc+Q2hlY2sgdGhlIFwiSXNzdWVzXCIgaW5mb3JtYXRpb24gZm9yIG1vcmUgZGV0YWlsczwvc3Bhbj4iKQorICAgICAgICBidWlsZF9mYWlsX3RhYi5hdHRhY2gobGFiZWwsIDQsIDQwLCA0LCA5KQorCisgICAgICAgICMgY3JlYXRlIGJ1dHRvbiAnRWRpdCBwYWNrYWdlcycKKyAgICAgICAgYWN0aW9uX2J1dHRvbiA9IEhvYkJ1dHRvbihwcmltYXJ5X2FjdGlvbikKKyAgICAgICAgI2FjdGlvbl9idXR0b24uc2V0X3NpemVfcmVxdWVzdCgtMSwgNDApCisgICAgICAgIGFjdGlvbl9idXR0b24uc2V0X3Rvb2x0aXBfdGV4dCgiRWRpdCB0aGUgJXMgcGFyYW1ldGVycyIgJSBhY3Rpb25zKQorICAgICAgICBhY3Rpb25fYnV0dG9uLmNvbm5lY3QoJ2NsaWNrZWQnLCBzZWxmLmZhaWx1cmVfcHJpbWFyeV9hY3Rpb25fYnV0dG9uX2NsaWNrZWRfY2IsIHByaW1hcnlfYWN0aW9uKQorCisgICAgICAgIGlmIGxvZ19maWxlOgorICAgICAgICAgICAgb3Blbl9sb2dfYnV0dG9uID0gSG9iQWx0QnV0dG9uKCJPcGVuIGxvZyIpCisgICAgICAgICAgICBvcGVuX2xvZ19idXR0b24uc2V0X3JlbGllZihndGsuUkVMSUVGX0hBTEYpCisgICAgICAgICAgICBvcGVuX2xvZ19idXR0b24uc2V0X3Rvb2x0aXBfdGV4dCgiT3BlbiB0aGUgYnVpbGQncyBsb2cgZmlsZSIpCisgICAgICAgICAgICBvcGVuX2xvZ19idXR0b24uY29ubmVjdCgnY2xpY2tlZCcsIHNlbGYub3Blbl9sb2dfYnV0dG9uX2NsaWNrZWRfY2IsIGxvZ19maWxlKQorCisgICAgICAgIGF0dGFjaF9wb3MgPSAoMjQgaWYgbG9nX2ZpbGUgZWxzZSAxNCkKKyAgICAgICAgZmlsZV9idWdfYnV0dG9uID0gSG9iQWx0QnV0dG9uKCdGaWxlIGEgYnVnJykKKyAgICAgICAgZmlsZV9idWdfYnV0dG9uLnNldF9yZWxpZWYoZ3RrLlJFTElFRl9IQUxGKQorICAgICAgICBmaWxlX2J1Z19idXR0b24uc2V0X3Rvb2x0aXBfdGV4dCgiT3BlbiB0aGUgWW9jdG8gUHJvamVjdCBidWcgdHJhY2tpbmcgd2Vic2l0ZSIpCisgICAgICAgIGZpbGVfYnVnX2J1dHRvbi5jb25uZWN0KCdjbGlja2VkJywgc2VsZi5mYWlsdXJlX2FjdGl2YXRlX2ZpbGVfYnVnX2xpbmtfY2IpCisKKyAgICAgICAgaWYgbm90IHNlbGYuYnVpbGRlci5kaXNrX2Z1bGw6CisgICAgICAgICAgICBidWlsZF9mYWlsX3RhYi5hdHRhY2goYWN0aW9uX2J1dHRvbiwgNCwgMTMsIDksIDEyKQorICAgICAgICAgICAgaWYgbG9nX2ZpbGU6CisgICAgICAgICAgICAgICAgYnVpbGRfZmFpbF90YWIuYXR0YWNoKG9wZW5fbG9nX2J1dHRvbiwgMTQsIDIzLCA5LCAxMikKKyAgICAgICAgICAgIGJ1aWxkX2ZhaWxfdGFiLmF0dGFjaChmaWxlX2J1Z19idXR0b24sIGF0dGFjaF9wb3MsIGF0dGFjaF9wb3MgKyA5LCA5LCAxMikKKworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVzdGFydF9idWlsZCA9IEhvYkJ1dHRvbigiUmVzdGFydCB0aGUgYnVpbGQiKQorICAgICAgICAgICAgcmVzdGFydF9idWlsZC5zZXRfdG9vbHRpcF90ZXh0KCJSZXN0YXJ0IHRoZSBidWlsZCIpCisgICAgICAgICAgICByZXN0YXJ0X2J1aWxkLmNvbm5lY3QoJ2NsaWNrZWQnLCBzZWxmLnJlc3RhcnRfYnVpbGRfYnV0dG9uX2NsaWNrZWRfY2IpCisKKyAgICAgICAgICAgIGJ1aWxkX2ZhaWxfdGFiLmF0dGFjaChyZXN0YXJ0X2J1aWxkLCA0LCAxMywgOSwgMTIpCisgICAgICAgICAgICBidWlsZF9mYWlsX3RhYi5hdHRhY2goYWN0aW9uX2J1dHRvbiwgMTQsIDIzLCA5LCAxMikKKyAgICAgICAgICAgIGlmIGxvZ19maWxlOgorICAgICAgICAgICAgICAgIGJ1aWxkX2ZhaWxfdGFiLmF0dGFjaChvcGVuX2xvZ19idXR0b24sIGF0dGFjaF9wb3MsIGF0dGFjaF9wb3MgKyA5LCA5LCAxMikKKworICAgICAgICBzZWxmLmJ1aWxkZXIuZGlza19mdWxsID0gRmFsc2UKKyAgICAgICAgcmV0dXJuIGJ1aWxkX2ZhaWxfdG9wCisKKyAgICBkZWYgc2hvd19mYWlsX3BhZ2Uoc2VsZiwgdGl0bGUpOgorICAgICAgICBzZWxmLl9yZW1vdmVfYWxsX3dpZGdldCgpCisgICAgICAgIHNlbGYudGl0bGUgPSAiSG9iIGNhbm5vdCBidWlsZCB5b3VyICVzIiAlIHRpdGxlCisKKyAgICAgICAgc2VsZi5idWlsZF9mYWlsX2JhciA9IHNlbGYuYWRkX2J1aWxkX2ZhaWxfdG9wX2Jhcih0aXRsZSwgc2VsZi5idWlsZGVyLmN1cnJlbnRfbG9nZmlsZSkKKworICAgICAgICBzZWxmLnBhY2tfc3RhcnQoc2VsZi5ncm91cF9hbGlnbiwgZXhwYW5kPVRydWUsIGZpbGw9VHJ1ZSkKKyAgICAgICAgc2VsZi5ib3hfZ3JvdXBfYXJlYS5wYWNrX3N0YXJ0KHNlbGYuYnVpbGRfZmFpbF9iYXIsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgc2VsZi5ib3hfZ3JvdXBfYXJlYS5wYWNrX3N0YXJ0KHNlbGYudmJveCwgZXhwYW5kPVRydWUsIGZpbGw9VHJ1ZSkKKworICAgICAgICBzZWxmLnZib3gucGFja19zdGFydChzZWxmLm5vdGVib29rLCBleHBhbmQ9VHJ1ZSwgZmlsbD1UcnVlKQorICAgICAgICBzZWxmLnNob3dfYWxsKCkKKyAgICAgICAgc2VsZi5ub3RlYm9vay5zZXRfcGFnZSgiSXNzdWVzIikKKyAgICAgICAgc2VsZi5iYWNrX2J1dHRvbi5oaWRlKCkKKworICAgIGRlZiBhZGRfYnVpbGRfc3RvcF90b3BfYmFyKHNlbGYsIGFjdGlvbiwgbG9nX2ZpbGU9Tm9uZSk6CisgICAgICAgIGNvbG9yID0gSG9iQ29sb3JzLkxJR0hUX0dSQVkKKyAgICAgICAgYnVpbGRfc3RvcF90b3AgPSBndGsuRXZlbnRCb3goKQorICAgICAgICAjYnVpbGRfc3RvcF90b3Auc2V0X3NpemVfcmVxdWVzdCgtMSwgMjAwKQorICAgICAgICBidWlsZF9zdG9wX3RvcC5tb2RpZnlfYmcoZ3RrLlNUQVRFX05PUk1BTCwgZ3RrLmdkay5jb2xvcl9wYXJzZShjb2xvcikpCisgICAgICAgIGJ1aWxkX3N0b3BfdG9wLnNldF9mbGFncyhndGsuQ0FOX0RFRkFVTFQpCisgICAgICAgIGJ1aWxkX3N0b3BfdG9wLmdyYWJfZGVmYXVsdCgpCisKKyAgICAgICAgYnVpbGRfc3RvcF90YWIgPSBndGsuVGFibGUoMTEsIDQ2LCBUcnVlKQorICAgICAgICBidWlsZF9zdG9wX3RvcC5hZGQoYnVpbGRfc3RvcF90YWIpCisKKyAgICAgICAgaWNvbiA9IGd0ay5JbWFnZSgpCisgICAgICAgIGljb25fcGl4X2J1ZmZlciA9IGd0ay5nZGsucGl4YnVmX25ld19mcm9tX2ZpbGUoaGljLklDT05fSU5GT19IT1ZFUl9GSUxFKQorICAgICAgICBpY29uLnNldF9mcm9tX3BpeGJ1ZihpY29uX3BpeF9idWZmZXIpCisgICAgICAgIGJ1aWxkX3N0b3BfdGFiLmF0dGFjaChpY29uLCAxLCA0LCAwLCA2KQorCisgICAgICAgIGxhYmVsID0gZ3RrLkxhYmVsKCkKKyAgICAgICAgbGFiZWwuc2V0X2FsaWdubWVudCgwLjAsIDAuNSkKKyAgICAgICAgbGFiZWwuc2V0X21hcmt1cCgiPHNwYW4gc2l6ZT0neC1sYXJnZSc+PGI+JXM8L2I+PC9zcGFuPiIgJSBzZWxmLnRpdGxlKQorICAgICAgICBidWlsZF9zdG9wX3RhYi5hdHRhY2gobGFiZWwsIDQsIDI2LCAwLCA2KQorCisgICAgICAgIGFjdGlvbl9idXR0b24gPSBIb2JCdXR0b24oIkVkaXQgJXMiICUgYWN0aW9uKQorICAgICAgICBhY3Rpb25fYnV0dG9uLnNldF9zaXplX3JlcXVlc3QoLTEsIDQwKQorICAgICAgICBpZiBhY3Rpb24gPT0gImltYWdlIjoKKyAgICAgICAgICAgIGFjdGlvbl9idXR0b24uc2V0X3Rvb2x0aXBfdGV4dCgiRWRpdCB0aGUgaW1hZ2UgcGFyYW1ldGVycyIpCisgICAgICAgIGVsaWYgYWN0aW9uID09ICJyZWNpcGVzIjoKKyAgICAgICAgICAgIGFjdGlvbl9idXR0b24uc2V0X3Rvb2x0aXBfdGV4dCgiRWRpdCB0aGUgaW5jbHVkZWQgcmVjaXBlcyIpCisgICAgICAgIGVsaWYgYWN0aW9uID09ICJwYWNrYWdlcyI6CisgICAgICAgICAgICBhY3Rpb25fYnV0dG9uLnNldF90b29sdGlwX3RleHQoIkVkaXQgdGhlIGluY2x1ZGVkIHBhY2thZ2VzIikKKyAgICAgICAgYWN0aW9uX2J1dHRvbi5jb25uZWN0KCdjbGlja2VkJywgc2VsZi5zdG9wX3ByaW1hcnlfYWN0aW9uX2J1dHRvbl9jbGlja2VkX2NiLCBhY3Rpb24pCisgICAgICAgIGJ1aWxkX3N0b3BfdGFiLmF0dGFjaChhY3Rpb25fYnV0dG9uLCA0LCAxMywgNiwgOSkKKworICAgICAgICBpZiBsb2dfZmlsZToKKyAgICAgICAgICAgIG9wZW5fbG9nX2J1dHRvbiA9IEhvYkFsdEJ1dHRvbigiT3BlbiBsb2ciKQorICAgICAgICAgICAgb3Blbl9sb2dfYnV0dG9uLnNldF9yZWxpZWYoZ3RrLlJFTElFRl9IQUxGKQorICAgICAgICAgICAgb3Blbl9sb2dfYnV0dG9uLnNldF90b29sdGlwX3RleHQoIk9wZW4gdGhlIGJ1aWxkJ3MgbG9nIGZpbGUiKQorICAgICAgICAgICAgb3Blbl9sb2dfYnV0dG9uLmNvbm5lY3QoJ2NsaWNrZWQnLCBzZWxmLm9wZW5fbG9nX2J1dHRvbl9jbGlja2VkX2NiLCBsb2dfZmlsZSkKKyAgICAgICAgICAgIGJ1aWxkX3N0b3BfdGFiLmF0dGFjaChvcGVuX2xvZ19idXR0b24sIDE0LCAyMywgNiwgOSkKKworICAgICAgICBhdHRhY2hfcG9zID0gKDI0IGlmIGxvZ19maWxlIGVsc2UgMTQpCisgICAgICAgIGJ1aWxkX2J1dHRvbiA9IEhvYkFsdEJ1dHRvbigiQnVpbGQgbmV3IGltYWdlIikKKyAgICAgICAgI2J1aWxkX2J1dHRvbi5zZXRfc2l6ZV9yZXF1ZXN0KC0xLCA0MCkKKyAgICAgICAgYnVpbGRfYnV0dG9uLnNldF90b29sdGlwX3RleHQoIkNyZWF0ZSBhIG5ldyBpbWFnZSBmcm9tIHNjcmF0Y2giKQorICAgICAgICBidWlsZF9idXR0b24uY29ubmVjdCgnY2xpY2tlZCcsIHNlbGYubmV3X2ltYWdlX2J1dHRvbl9jbGlja2VkX2NiKQorICAgICAgICBidWlsZF9zdG9wX3RhYi5hdHRhY2goYnVpbGRfYnV0dG9uLCBhdHRhY2hfcG9zLCBhdHRhY2hfcG9zICsgOSwgNiwgOSkKKworICAgICAgICByZXR1cm4gYnVpbGRfc3RvcF90b3AsIGFjdGlvbl9idXR0b24KKworICAgIGRlZiBzaG93X3N0b3BfcGFnZShzZWxmLCBhY3Rpb24pOgorICAgICAgICBzZWxmLl9yZW1vdmVfYWxsX3dpZGdldCgpCisgICAgICAgIHNlbGYudGl0bGUgPSAiQnVpbGQgc3RvcHBlZCIKKyAgICAgICAgc2VsZi5idWlsZF9zdG9wX2JhciwgYWN0aW9uX2J1dHRvbiA9IHNlbGYuYWRkX2J1aWxkX3N0b3BfdG9wX2JhcihhY3Rpb24sIHNlbGYuYnVpbGRlci5jdXJyZW50X2xvZ2ZpbGUpCisKKyAgICAgICAgc2VsZi5wYWNrX3N0YXJ0KHNlbGYuZ3JvdXBfYWxpZ24sIGV4cGFuZD1UcnVlLCBmaWxsPVRydWUpCisgICAgICAgIHNlbGYuYm94X2dyb3VwX2FyZWEucGFja19zdGFydChzZWxmLmJ1aWxkX3N0b3BfYmFyLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIHNlbGYuYm94X2dyb3VwX2FyZWEucGFja19zdGFydChzZWxmLnZib3gsIGV4cGFuZD1UcnVlLCBmaWxsPVRydWUpCisKKyAgICAgICAgc2VsZi52Ym94LnBhY2tfc3RhcnQoc2VsZi5ub3RlYm9vaywgZXhwYW5kPVRydWUsIGZpbGw9VHJ1ZSkKKyAgICAgICAgc2VsZi5zaG93X2FsbCgpCisgICAgICAgIHNlbGYuYmFja19idXR0b24uaGlkZSgpCisgICAgICAgIHJldHVybiBhY3Rpb25fYnV0dG9uCisKKyAgICBkZWYgc2hvd19wYWdlKHNlbGYsIHN0ZXApOgorICAgICAgICBzZWxmLl9yZW1vdmVfYWxsX3dpZGdldCgpCisgICAgICAgIGlmIHN0ZXAgPT0gc2VsZi5idWlsZGVyLlBBQ0tBR0VfR0VORVJBVElORyBvciBzdGVwID09IHNlbGYuYnVpbGRlci5GQVNUX0lNQUdFX0dFTkVSQVRJTkc6CisgICAgICAgICAgICBzZWxmLnRpdGxlID0gIkJ1aWxkaW5nIHBhY2thZ2VzIC4uLiIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudGl0bGUgPSAiQnVpbGRpbmcgaW1hZ2UgLi4uIgorICAgICAgICBzZWxmLmJ1aWxkX2RldGFpbHNfdG9wID0gc2VsZi5hZGRfb250b190b3BfYmFyKE5vbmUpCisgICAgICAgIHNlbGYucGFja19zdGFydChzZWxmLmJ1aWxkX2RldGFpbHNfdG9wLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIHNlbGYucGFja19zdGFydChzZWxmLmdyb3VwX2FsaWduLCBleHBhbmQ9VHJ1ZSwgZmlsbD1UcnVlKQorCisgICAgICAgIHNlbGYuYm94X2dyb3VwX2FyZWEucGFja19zdGFydChzZWxmLnZib3gsIGV4cGFuZD1UcnVlLCBmaWxsPVRydWUpCisKKyAgICAgICAgc2VsZi5wcm9ncmVzc19iYXIucmVzZXQoKQorICAgICAgICBzZWxmLmNvbmZpZ190di5yZXNldCgpCisgICAgICAgIHNlbGYudmJveC5wYWNrX3N0YXJ0KHNlbGYucHJvZ3Jlc3NfYm94LCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgc2VsZi52Ym94LnBhY2tfc3RhcnQoc2VsZi5ub3RlYm9vaywgZXhwYW5kPVRydWUsIGZpbGw9VHJ1ZSkKKworICAgICAgICBzZWxmLmJveF9ncm91cF9hcmVhLnBhY2tfZW5kKHNlbGYuYnV0dG9uX2JveCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICBzZWxmLnNob3dfYWxsKCkKKyAgICAgICAgc2VsZi5ub3RlYm9vay5zZXRfcGFnZSgiTG9nIikKKyAgICAgICAgc2VsZi5iYWNrX2J1dHRvbi5oaWRlKCkKKworICAgICAgICBzZWxmLnJlc2V0X2J1aWxkX3N0YXR1cygpCisgICAgICAgIHNlbGYucmVzZXRfaXNzdWVzKCkKKworICAgIGRlZiB1cGRhdGVfcHJvZ3Jlc3NfYmFyKHNlbGYsIHRpdGxlLCBmcmFjdGlvbiwgc3RhdHVzPU5vbmUpOgorICAgICAgICBzZWxmLnByb2dyZXNzX2Jhci51cGRhdGUoZnJhY3Rpb24pCisgICAgICAgIHNlbGYucHJvZ3Jlc3NfYmFyLnNldF90aXRsZSh0aXRsZSkKKyAgICAgICAgc2VsZi5wcm9ncmVzc19iYXIuc2V0X3Jjc3R5bGUoc3RhdHVzKQorCisgICAgZGVmIGJhY2tfYnV0dG9uX2NsaWNrZWRfY2Ioc2VsZiwgYnV0dG9uKToKKyAgICAgICAgc2VsZi5idWlsZGVyLnNob3dfY29uZmlndXJhdGlvbigpCisKKyAgICBkZWYgbmV3X2ltYWdlX2J1dHRvbl9jbGlja2VkX2NiKHNlbGYsIGJ1dHRvbik6CisgICAgICAgIHNlbGYuYnVpbGRlci5yZXNldCgpCisKKyAgICBkZWYgc2hvd19iYWNrX2J1dHRvbihzZWxmKToKKyAgICAgICAgc2VsZi5iYWNrX2J1dHRvbi5zaG93KCkKKworICAgIGRlZiBzdG9wX2J1dHRvbl9jbGlja2VkX2NiKHNlbGYsIGJ1dHRvbik6CisgICAgICAgIHNlbGYuYnVpbGRlci5zdG9wX2J1aWxkKCkKKworICAgIGRlZiBoaWRlX3N0b3BfYnV0dG9uKHNlbGYpOgorICAgICAgICBzZWxmLnN0b3BfYnV0dG9uLnNldF9zZW5zaXRpdmUoRmFsc2UpCisgICAgICAgIHNlbGYuc3RvcF9idXR0b24uaGlkZSgpCisKKyAgICBkZWYgc2Nyb2xsX3RvX3ByZXNlbnRfcm93KHNlbGYsIG1vZGVsLCBwYXRoLCBpdGVyLCB2X2FkaiwgdHJlZXZpZXcpOgorICAgICAgICBpZiB0cmVldmlldyBhbmQgdl9hZGo6CisgICAgICAgICAgICBpZiBwYXRoWzBdID4gc2VsZi5lbmRwYXRoWzBdOiAjIGNoZWNrIHRoZSBldmVudCBpcyBhIG5ldyByb3cgYXBwZW5kIG9yIG5vdAorICAgICAgICAgICAgICAgIHNlbGYuZW5kcGF0aCA9IHBhdGgKKyAgICAgICAgICAgICAgICAjIGNoZWNrIHRoZSBndGsuYWRqdXN0bWVudCBwb3NpdGlvbiBpcyBhdCBlbmQgYm91bmRhcnkgb3Igbm90CisgICAgICAgICAgICAgICAgaWYgKHZfYWRqLnVwcGVyIDw9IHZfYWRqLnBhZ2Vfc2l6ZSkgb3IgKHZfYWRqLnZhbHVlID09IHZfYWRqLnVwcGVyIC0gdl9hZGoucGFnZV9zaXplKToKKyAgICAgICAgICAgICAgICAgICAgdHJlZXZpZXcuc2Nyb2xsX3RvX2NlbGwocGF0aCkKKworICAgIGRlZiBzaG93X2NvbmZpZ3VyYXRpb25zKHNlbGYsIGNvbmZpZ3VyYXRpb25zLCBwYXJhbXMpOgorICAgICAgICBzZWxmLmNvbmZpZ190di5zaG93KGNvbmZpZ3VyYXRpb25zLCBwYXJhbXMpCisKKyAgICBkZWYgZmFpbHVyZV9wcmltYXJ5X2FjdGlvbl9idXR0b25fY2xpY2tlZF9jYihzZWxmLCBidXR0b24sIGFjdGlvbik6CisgICAgICAgIGlmICJFZGl0IHJlY2lwZXMiIGluIGFjdGlvbjoKKyAgICAgICAgICAgIHNlbGYuYnVpbGRlci5zaG93X3JlY2lwZXMoKQorICAgICAgICBlbGlmICJFZGl0IHBhY2thZ2VzIiBpbiBhY3Rpb246CisgICAgICAgICAgICBzZWxmLmJ1aWxkZXIuc2hvd19wYWNrYWdlcygpCisgICAgICAgIGVsaWYgIkVkaXQgaW1hZ2UiIGluIGFjdGlvbjoKKyAgICAgICAgICAgIHNlbGYuYnVpbGRlci5zaG93X2NvbmZpZ3VyYXRpb24oKQorCisgICAgZGVmIHJlc3RhcnRfYnVpbGRfYnV0dG9uX2NsaWNrZWRfY2Ioc2VsZiwgYnV0dG9uKToKKyAgICAgICAgc2VsZi5idWlsZGVyLmp1c3RfYmFrZSgpCisKKyAgICBkZWYgc3RvcF9wcmltYXJ5X2FjdGlvbl9idXR0b25fY2xpY2tlZF9jYihzZWxmLCBidXR0b24sIGFjdGlvbik6CisgICAgICAgIGlmICJyZWNpcGVzIiBpbiBhY3Rpb246CisgICAgICAgICAgICBzZWxmLmJ1aWxkZXIuc2hvd19yZWNpcGVzKCkKKyAgICAgICAgZWxpZiAicGFja2FnZXMiIGluIGFjdGlvbjoKKyAgICAgICAgICAgIHNlbGYuYnVpbGRlci5zaG93X3BhY2thZ2VzKCkKKyAgICAgICAgZWxpZiAiaW1hZ2UiIGluIGFjdGlvbjoKKyAgICAgICAgICAgIHNlbGYuYnVpbGRlci5zaG93X2NvbmZpZ3VyYXRpb24oKQorCisgICAgZGVmIG9wZW5fbG9nX2J1dHRvbl9jbGlja2VkX2NiKHNlbGYsIGJ1dHRvbiwgbG9nX2ZpbGUpOgorICAgICAgICBpZiBsb2dfZmlsZToKKyAgICAgICAgICAgIGxvZ19maWxlID0gImZpbGU6Ly8vIiArIGxvZ19maWxlCisgICAgICAgICAgICBndGsuc2hvd191cmkoc2NyZWVuPWJ1dHRvbi5nZXRfc2NyZWVuKCksIHVyaT1sb2dfZmlsZSwgdGltZXN0YW1wPTApCisKKyAgICBkZWYgZmFpbHVyZV9hY3RpdmF0ZV9maWxlX2J1Z19saW5rX2NiKHNlbGYsIGJ1dHRvbik6CisgICAgICAgIGJ1dHRvbi5jaGlsZC5lbWl0KCdhY3RpdmF0ZS1saW5rJywgImh0dHA6Ly9idWd6aWxsYS55b2N0b3Byb2plY3Qub3JnIikKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9idWlsZGVyLnB5IGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2J1aWxkZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGNjNDEwNAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9idWlsZGVyLnB5CkBAIC0wLDAgKzEsMTQ3NSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIEJpdEJha2UgR3JhcGhpY2FsIEdUSyBVc2VyIEludGVyZmFjZQorIworIyBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiAgIEludGVsIENvcnBvcmF0aW9uCisjCisjIEF1dGhvcmVkIGJ5IEpvc2h1YSBMb2NrIDxqb3NoQGxpbnV4LmludGVsLmNvbT4KKyMgQXV0aG9yZWQgYnkgRG9uZ3hpYW8gWHUgPGRvbmd4aWFvLnh1QGludGVsLmNvbT4KKyMgQXV0aG9yZWQgYnkgU2hhbmUgV2FuZyA8c2hhbmUud2FuZ0BpbnRlbC5jb20+CisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitpbXBvcnQgZ2xpYgoraW1wb3J0IGd0aywgZ29iamVjdAoraW1wb3J0IGNvcHkKK2ltcG9ydCBvcworaW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzaGxleAoraW1wb3J0IHJlCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IHN5cworaW1wb3J0IHNpZ25hbAoraW1wb3J0IHRpbWUKK2Zyb20gYmIudWkuY3J1bWJzLmltYWdlY29uZmlndXJhdGlvbnBhZ2UgaW1wb3J0IEltYWdlQ29uZmlndXJhdGlvblBhZ2UKK2Zyb20gYmIudWkuY3J1bWJzLnJlY2lwZXNlbGVjdGlvbnBhZ2UgaW1wb3J0IFJlY2lwZVNlbGVjdGlvblBhZ2UKK2Zyb20gYmIudWkuY3J1bWJzLnBhY2thZ2VzZWxlY3Rpb25wYWdlIGltcG9ydCBQYWNrYWdlU2VsZWN0aW9uUGFnZQorZnJvbSBiYi51aS5jcnVtYnMuYnVpbGRkZXRhaWxzcGFnZSBpbXBvcnQgQnVpbGREZXRhaWxzUGFnZQorZnJvbSBiYi51aS5jcnVtYnMuaW1hZ2VkZXRhaWxzcGFnZSBpbXBvcnQgSW1hZ2VEZXRhaWxzUGFnZQorZnJvbSBiYi51aS5jcnVtYnMuc2FuaXR5Y2hlY2twYWdlIGltcG9ydCBTYW5pdHlDaGVja1BhZ2UKK2Zyb20gYmIudWkuY3J1bWJzLmhvYndpZGdldCBpbXBvcnQgaHdjLCBIb2JCdXR0b24sIEhvYkFsdEJ1dHRvbgorZnJvbSBiYi51aS5jcnVtYnMucGVyc2lzdGVudHRvb2x0aXAgaW1wb3J0IFBlcnNpc3RlbnRUb29sdGlwCitpbXBvcnQgYmIudWkuY3J1bWJzLnV0aWxzCitmcm9tIGJiLnVpLmNydW1icy5oaWcuY3J1bWJzbWVzc2FnZWRpYWxvZyBpbXBvcnQgQ3J1bWJzTWVzc2FnZURpYWxvZworZnJvbSBiYi51aS5jcnVtYnMuaGlnLnNpbXBsZXNldHRpbmdzZGlhbG9nIGltcG9ydCBTaW1wbGVTZXR0aW5nc0RpYWxvZworZnJvbSBiYi51aS5jcnVtYnMuaGlnLmFkdmFuY2Vkc2V0dGluZ3NkaWFsb2cgaW1wb3J0IEFkdmFuY2VkU2V0dGluZ3NEaWFsb2cKK2Zyb20gYmIudWkuY3J1bWJzLmhpZy5kZXBsb3lpbWFnZWRpYWxvZyBpbXBvcnQgRGVwbG95SW1hZ2VEaWFsb2cKK2Zyb20gYmIudWkuY3J1bWJzLmhpZy5sYXllcnNlbGVjdGlvbmRpYWxvZyBpbXBvcnQgTGF5ZXJTZWxlY3Rpb25EaWFsb2cKK2Zyb20gYmIudWkuY3J1bWJzLmhpZy5pbWFnZXNlbGVjdGlvbmRpYWxvZyBpbXBvcnQgSW1hZ2VTZWxlY3Rpb25EaWFsb2cKK2Zyb20gYmIudWkuY3J1bWJzLmhpZy5wYXJzaW5nd2FybmluZ3NkaWFsb2cgaW1wb3J0IFBhcnNpbmdXYXJuaW5nc0RpYWxvZworZnJvbSBiYi51aS5jcnVtYnMuaGlnLnByb3BlcnR5ZGlhbG9nIGltcG9ydCBQcm9wZXJ0eURpYWxvZworCitob2JWZXIgPSAyMDEyMDgwOAorCitjbGFzcyBDb25maWd1cmF0aW9uOgorICAgICcnJ1JlcHJlc2VudHMgdGhlIGRhdGEgc3RydWN0dXJlIG9mIGNvbmZpZ3VyYXRpb24uJycnCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgcGFyc2VfcHJveHlfc3RyaW5nKGNscywgcHJveHkpOgorICAgICAgICBwYXR0ZXJuID0gIl5ccyooKGh0dHB8aHR0cHN8ZnRwfHNvY2tzfGN2cyk6Ly8pPygoXFMrKTooXFMrKUApPyhbXlxzOl0rKSg6KFxkKykpPy8/IgorICAgICAgICBtYXRjaCA9IHJlLnNlYXJjaChwYXR0ZXJuLCBwcm94eSkKKyAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICByZXR1cm4gbWF0Y2guZ3JvdXAoMiksIG1hdGNoLmdyb3VwKDQpLCBtYXRjaC5ncm91cCg1KSwgbWF0Y2guZ3JvdXAoNiksIG1hdGNoLmdyb3VwKDgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gTm9uZSwgTm9uZSwgTm9uZSwgIiIsICIiCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgbWFrZV9ob3N0X3N0cmluZyhjbHMsIHByb3QsIHVzZXIsIHBhc3N3ZCwgaG9zdCwgZGVmYXVsdF9wcm90PSIiKToKKyAgICAgICAgaWYgaG9zdCA9PSBOb25lIG9yIGhvc3QgPT0gIiI6CisgICAgICAgICAgICByZXR1cm4gIiIKKworICAgICAgICBwYXNzd2QgPSBwYXNzd2Qgb3IgIiIKKworICAgICAgICBpZiB1c2VyICE9IE5vbmUgYW5kIHVzZXIgIT0gIiI6CisgICAgICAgICAgICBpZiBwcm90ID09IE5vbmUgb3IgcHJvdCA9PSAiIjoKKyAgICAgICAgICAgICAgICBwcm90ID0gZGVmYXVsdF9wcm90CisgICAgICAgICAgICByZXR1cm4gcHJvdCArICI6Ly8iICsgdXNlciArICI6IiArIHBhc3N3ZCArICJAIiArIGhvc3QKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHByb3QgPT0gTm9uZSBvciBwcm90ID09ICIiOgorICAgICAgICAgICAgICAgIHJldHVybiBob3N0CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBwcm90ICsgIjovLyIgKyBob3N0CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgbWFrZV9wb3J0X3N0cmluZyhjbHMsIHBvcnQpOgorICAgICAgICBwb3J0ID0gcG9ydCBvciAiIgorICAgICAgICByZXR1cm4gcG9ydAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIG1ha2VfcHJveHlfc3RyaW5nKGNscywgcHJvdCwgdXNlciwgcGFzc3dkLCBob3N0LCBwb3J0LCBkZWZhdWx0X3Byb3Q9IiIpOgorICAgICAgICBpZiBob3N0ID09IE5vbmUgb3IgaG9zdCA9PSAiIjojIG9yIHBvcnQgPT0gTm9uZSBvciBwb3J0ID09ICIiOgorICAgICAgICAgICAgcmV0dXJuICIiCisKKyAgICAgICAgcmV0dXJuIENvbmZpZ3VyYXRpb24ubWFrZV9ob3N0X3N0cmluZyhwcm90LCB1c2VyLCBwYXNzd2QsIGhvc3QsIGRlZmF1bHRfcHJvdCkgKyAoIjoiICsgQ29uZmlndXJhdGlvbi5tYWtlX3BvcnRfc3RyaW5nKHBvcnQpIGlmIHBvcnQgZWxzZSAiIikKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5jdXJyX21hY2ggPSAiIgorICAgICAgICBzZWxmLnNlbGVjdGVkX2ltYWdlID0gTm9uZQorICAgICAgICAjIHNldHRpbmdzCisgICAgICAgIHNlbGYuY3Vycl9kaXN0cm8gPSAiIgorICAgICAgICBzZWxmLmRsZGlyID0gc2VsZi5zc3RhdGVkaXIgPSBzZWxmLnNzdGF0ZW1pcnJvciA9ICIiCisgICAgICAgIHNlbGYucG1ha2UgPSBzZWxmLmJidGhyZWFkID0gMAorICAgICAgICBzZWxmLmN1cnJfcGFja2FnZV9mb3JtYXQgPSAiIgorICAgICAgICBzZWxmLmltYWdlX3Jvb3Rmc19zaXplID0gc2VsZi5pbWFnZV9leHRyYV9zaXplID0gMAorICAgICAgICBzZWxmLmltYWdlX292ZXJoZWFkX2ZhY3RvciA9IDEKKyAgICAgICAgc2VsZi5pbmNvbXBhdF9saWNlbnNlID0gIiIKKyAgICAgICAgc2VsZi5jdXJyX3Nka19tYWNoaW5lID0gIiIKKyAgICAgICAgc2VsZi5jb25mX3ZlcnNpb24gPSBzZWxmLmxjb25mX3ZlcnNpb24gPSAiIgorICAgICAgICBzZWxmLmV4dHJhX3NldHRpbmcgPSB7fQorICAgICAgICBzZWxmLnRvb2xjaGFpbl9idWlsZCA9IEZhbHNlCisgICAgICAgIHNlbGYuaW1hZ2VfZnN0eXBlcyA9ICIiCisgICAgICAgIHNlbGYuaW1hZ2Vfc2l6ZSA9IE5vbmUKKyAgICAgICAgc2VsZi5pbWFnZV9wYWNrYWdlcyA9IFtdCisgICAgICAgICMgYmJsYXllcnMuY29uZgorICAgICAgICBzZWxmLmxheWVycyA9IFtdCisgICAgICAgICMgaW1hZ2UvcmVjaXBlcy9wYWNrYWdlcworICAgICAgICBzZWxmLmNsZWFyX3NlbGVjdGlvbigpCisKKyAgICAgICAgc2VsZi51c2VyX3NlbGVjdGVkX3BhY2thZ2VzID0gW10KKworICAgICAgICBzZWxmLmRlZmF1bHRfdGFzayA9ICJidWlsZCIKKworICAgICAgICAjIHByb3h5IHNldHRpbmdzCisgICAgICAgIHNlbGYuZW5hYmxlX3Byb3h5ID0gTm9uZQorICAgICAgICBzZWxmLnNhbWVfcHJveHkgPSBGYWxzZQorICAgICAgICBzZWxmLnByb3hpZXMgPSB7CisgICAgICAgICAgICAiaHR0cCIgIDogW05vbmUsIE5vbmUsIE5vbmUsICIiLCAiIl0sICAjIHByb3RvY29sIDogW3Byb3QsIHVzZXIsIHBhc3N3ZCwgaG9zdCwgcG9ydF0KKyAgICAgICAgICAgICJodHRwcyIgOiBbTm9uZSwgTm9uZSwgTm9uZSwgIiIsICIiXSwKKyAgICAgICAgICAgICJmdHAiICAgOiBbTm9uZSwgTm9uZSwgTm9uZSwgIiIsICIiXSwKKyAgICAgICAgICAgICJzb2NrcyIgOiBbTm9uZSwgTm9uZSwgTm9uZSwgIiIsICIiXSwKKyAgICAgICAgICAgICJjdnMiICAgOiBbTm9uZSwgTm9uZSwgTm9uZSwgIiIsICIiXSwKKyAgICAgICAgfQorCisgICAgZGVmIGNsZWFyX3NlbGVjdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5zZWxlY3RlZF9yZWNpcGVzID0gW10KKyAgICAgICAgc2VsZi5zZWxlY3RlZF9wYWNrYWdlcyA9IFtdCisgICAgICAgIHNlbGYuaW5pdGlhbF9zZWxlY3RlZF9pbWFnZSA9IE5vbmUKKyAgICAgICAgc2VsZi5pbml0aWFsX3NlbGVjdGVkX3BhY2thZ2VzID0gW10KKyAgICAgICAgc2VsZi5pbml0aWFsX3VzZXJfc2VsZWN0ZWRfcGFja2FnZXMgPSBbXQorCisgICAgZGVmIHNwbGl0X3Byb3h5KHNlbGYsIHByb3RvY29sLCBwcm94eSk6CisgICAgICAgIGVudHJ5ID0gW10KKyAgICAgICAgcHJvdCwgdXNlciwgcGFzc3dkLCBob3N0LCBwb3J0ID0gQ29uZmlndXJhdGlvbi5wYXJzZV9wcm94eV9zdHJpbmcocHJveHkpCisgICAgICAgIGVudHJ5LmFwcGVuZChwcm90KQorICAgICAgICBlbnRyeS5hcHBlbmQodXNlcikKKyAgICAgICAgZW50cnkuYXBwZW5kKHBhc3N3ZCkKKyAgICAgICAgZW50cnkuYXBwZW5kKGhvc3QpCisgICAgICAgIGVudHJ5LmFwcGVuZChwb3J0KQorICAgICAgICBzZWxmLnByb3hpZXNbcHJvdG9jb2xdID0gZW50cnkKKworICAgIGRlZiBjb21iaW5lX3Byb3h5KHNlbGYsIHByb3RvY29sKToKKyAgICAgICAgZW50cnkgPSBzZWxmLnByb3hpZXNbcHJvdG9jb2xdCisgICAgICAgIHJldHVybiBDb25maWd1cmF0aW9uLm1ha2VfcHJveHlfc3RyaW5nKGVudHJ5WzBdLCBlbnRyeVsxXSwgZW50cnlbMl0sIGVudHJ5WzNdLCBlbnRyeVs0XSwgcHJvdG9jb2wpCisKKyAgICBkZWYgY29tYmluZV9ob3N0X29ubHkoc2VsZiwgcHJvdG9jb2wpOgorICAgICAgICBlbnRyeSA9IHNlbGYucHJveGllc1twcm90b2NvbF0KKyAgICAgICAgcmV0dXJuIENvbmZpZ3VyYXRpb24ubWFrZV9ob3N0X3N0cmluZyhlbnRyeVswXSwgZW50cnlbMV0sIGVudHJ5WzJdLCBlbnRyeVszXSwgcHJvdG9jb2wpCisKKyAgICBkZWYgY29tYmluZV9wb3J0X29ubHkoc2VsZiwgcHJvdG9jb2wpOgorICAgICAgICBlbnRyeSA9IHNlbGYucHJveGllc1twcm90b2NvbF0KKyAgICAgICAgcmV0dXJuIENvbmZpZ3VyYXRpb24ubWFrZV9wb3J0X3N0cmluZyhlbnRyeVs0XSkKKworICAgIGRlZiB1cGRhdGUoc2VsZiwgcGFyYW1zKToKKyAgICAgICAgIyBzZXR0aW5ncworICAgICAgICBzZWxmLmN1cnJfZGlzdHJvID0gcGFyYW1zWyJkaXN0cm8iXQorICAgICAgICBzZWxmLmRsZGlyID0gcGFyYW1zWyJkbGRpciJdCisgICAgICAgIHNlbGYuc3N0YXRlZGlyID0gcGFyYW1zWyJzc3RhdGVkaXIiXQorICAgICAgICBzZWxmLnNzdGF0ZW1pcnJvciA9IHBhcmFtc1sic3N0YXRlbWlycm9yIl0KKyAgICAgICAgc2VsZi5wbWFrZSA9IGludChwYXJhbXNbInBtYWtlIl0uc3BsaXQoKVsxXSkKKyAgICAgICAgc2VsZi5iYnRocmVhZCA9IHBhcmFtc1siYmJ0aHJlYWQiXQorICAgICAgICBzZWxmLmN1cnJfcGFja2FnZV9mb3JtYXQgPSAiICIuam9pbihwYXJhbXNbInBjbGFzcyJdLnNwbGl0KCJwYWNrYWdlXyIpKS5zdHJpcCgpCisgICAgICAgIHNlbGYuaW1hZ2Vfcm9vdGZzX3NpemUgPSBwYXJhbXNbImltYWdlX3Jvb3Rmc19zaXplIl0KKyAgICAgICAgc2VsZi5pbWFnZV9leHRyYV9zaXplID0gcGFyYW1zWyJpbWFnZV9leHRyYV9zaXplIl0KKyAgICAgICAgc2VsZi5pbWFnZV9vdmVyaGVhZF9mYWN0b3IgPSBwYXJhbXNbJ2ltYWdlX292ZXJoZWFkX2ZhY3RvciddCisgICAgICAgIHNlbGYuaW5jb21wYXRfbGljZW5zZSA9IHBhcmFtc1siaW5jb21wYXRfbGljZW5zZSJdCisgICAgICAgIHNlbGYuY3Vycl9zZGtfbWFjaGluZSA9IHBhcmFtc1sic2RrX21hY2hpbmUiXQorICAgICAgICBzZWxmLmNvbmZfdmVyc2lvbiA9IHBhcmFtc1siY29uZl92ZXJzaW9uIl0KKyAgICAgICAgc2VsZi5sY29uZl92ZXJzaW9uID0gcGFyYW1zWyJsY29uZl92ZXJzaW9uIl0KKyAgICAgICAgc2VsZi5pbWFnZV9mc3R5cGVzID0gcGFyYW1zWyJpbWFnZV9mc3R5cGVzIl0KKyAgICAgICAgIyBzZWxmLmV4dHJhX3NldHRpbmcvc2VsZi50b29sY2hhaW5fYnVpbGQKKyAgICAgICAgIyBiYmxheWVycy5jb25mCisgICAgICAgIHNlbGYubGF5ZXJzID0gcGFyYW1zWyJsYXllciJdLnNwbGl0KCkKKyAgICAgICAgc2VsZi5sYXllcnNfbm9uX3JlbW92YWJsZSA9IHBhcmFtc1sibGF5ZXJzX25vbl9yZW1vdmFibGUiXS5zcGxpdCgpCisgICAgICAgIHNlbGYuZGVmYXVsdF90YXNrID0gcGFyYW1zWyJkZWZhdWx0X3Rhc2siXQorCisgICAgICAgICMgcHJveHkgc2V0dGluZ3MKKyAgICAgICAgc2VsZi5lbmFibGVfcHJveHkgPSBwYXJhbXNbImh0dHBfcHJveHkiXSAhPSAiIiBvciBwYXJhbXNbImh0dHBzX3Byb3h5Il0gIT0gIiIgXAorICAgICAgICAgICAgb3IgcGFyYW1zWyJmdHBfcHJveHkiXSAhPSAiIiBvciBwYXJhbXNbInNvY2tzX3Byb3h5Il0gIT0gIiIgXAorICAgICAgICAgICAgb3IgcGFyYW1zWyJjdnNfcHJveHlfaG9zdCJdICE9ICIiIG9yIHBhcmFtc1siY3ZzX3Byb3h5X3BvcnQiXSAhPSAiIgorICAgICAgICBzZWxmLnNwbGl0X3Byb3h5KCJodHRwIiwgcGFyYW1zWyJodHRwX3Byb3h5Il0pCisgICAgICAgIHNlbGYuc3BsaXRfcHJveHkoImh0dHBzIiwgcGFyYW1zWyJodHRwc19wcm94eSJdKQorICAgICAgICBzZWxmLnNwbGl0X3Byb3h5KCJmdHAiLCBwYXJhbXNbImZ0cF9wcm94eSJdKQorICAgICAgICBzZWxmLnNwbGl0X3Byb3h5KCJzb2NrcyIsIHBhcmFtc1sic29ja3NfcHJveHkiXSkKKyAgICAgICAgc2VsZi5zcGxpdF9wcm94eSgiY3ZzIiwgcGFyYW1zWyJjdnNfcHJveHlfaG9zdCJdICsgIjoiICsgcGFyYW1zWyJjdnNfcHJveHlfcG9ydCJdKQorCisgICAgZGVmIHNhdmUoc2VsZiwgaGFuZGxlciwgZGVmYXVsdHM9RmFsc2UpOgorICAgICAgICAjIGJibGF5ZXJzLmNvbmYKKyAgICAgICAgaGFuZGxlci5zZXRfdmFyX2luX2ZpbGUoIkJCTEFZRVJTIiwgc2VsZi5sYXllcnMsICJiYmxheWVycy5jb25mIikKKyAgICAgICAgIyBsb2NhbC5jb25mCisgICAgICAgIGlmIG5vdCBkZWZhdWx0czoKKyAgICAgICAgICAgIGhhbmRsZXIuZWFybHlfYXNzaWduX3Zhcl9pbl9maWxlKCJNQUNISU5FIiwgc2VsZi5jdXJyX21hY2gsICJsb2NhbC5jb25mIikKKyAgICAgICAgaGFuZGxlci5zZXRfdmFyX2luX2ZpbGUoIkRJU1RSTyIsIHNlbGYuY3Vycl9kaXN0cm8sICJsb2NhbC5jb25mIikKKyAgICAgICAgaGFuZGxlci5zZXRfdmFyX2luX2ZpbGUoIkRMX0RJUiIsIHNlbGYuZGxkaXIsICJsb2NhbC5jb25mIikKKyAgICAgICAgaGFuZGxlci5zZXRfdmFyX2luX2ZpbGUoIlNTVEFURV9ESVIiLCBzZWxmLnNzdGF0ZWRpciwgImxvY2FsLmNvbmYiKQorICAgICAgICBzc3RhdGVfbWlycm9yX2xpc3QgPSBzZWxmLnNzdGF0ZW1pcnJvci5zcGxpdCgiXFxuICIpCisgICAgICAgIHNzdGF0ZV9taXJyb3JfbGlzdF9tb2RpZmllZCA9IFtdCisgICAgICAgIGZvciBtaXJyb3IgaW4gc3N0YXRlX21pcnJvcl9saXN0OgorICAgICAgICAgICAgaWYgbWlycm9yICE9ICIiOgorICAgICAgICAgICAgICAgIG1pcnJvciA9IG1pcnJvciArICJcXG4iCisgICAgICAgICAgICAgICAgc3N0YXRlX21pcnJvcl9saXN0X21vZGlmaWVkLmFwcGVuZChtaXJyb3IpCisgICAgICAgIGhhbmRsZXIuc2V0X3Zhcl9pbl9maWxlKCJTU1RBVEVfTUlSUk9SUyIsIHNzdGF0ZV9taXJyb3JfbGlzdF9tb2RpZmllZCwgImxvY2FsLmNvbmYiKQorICAgICAgICBoYW5kbGVyLnNldF92YXJfaW5fZmlsZSgiUEFSQUxMRUxfTUFLRSIsICItaiAlcyIgJSBzZWxmLnBtYWtlLCAibG9jYWwuY29uZiIpCisgICAgICAgIGhhbmRsZXIuc2V0X3Zhcl9pbl9maWxlKCJCQl9OVU1CRVJfVEhSRUFEUyIsIHNlbGYuYmJ0aHJlYWQsICJsb2NhbC5jb25mIikKKyAgICAgICAgaGFuZGxlci5zZXRfdmFyX2luX2ZpbGUoIlBBQ0tBR0VfQ0xBU1NFUyIsICIgIi5qb2luKFsicGFja2FnZV8iICsgaSBmb3IgaSBpbiBzZWxmLmN1cnJfcGFja2FnZV9mb3JtYXQuc3BsaXQoKV0pLCAibG9jYWwuY29uZiIpCisgICAgICAgIGhhbmRsZXIuc2V0X3Zhcl9pbl9maWxlKCJJTUFHRV9ST09URlNfU0laRSIsIHNlbGYuaW1hZ2Vfcm9vdGZzX3NpemUsICJsb2NhbC5jb25mIikKKyAgICAgICAgaGFuZGxlci5zZXRfdmFyX2luX2ZpbGUoIklNQUdFX0VYVFJBX1NQQUNFIiwgc2VsZi5pbWFnZV9leHRyYV9zaXplLCAibG9jYWwuY29uZiIpCisgICAgICAgIGhhbmRsZXIuc2V0X3Zhcl9pbl9maWxlKCJJTkNPTVBBVElCTEVfTElDRU5TRSIsIHNlbGYuaW5jb21wYXRfbGljZW5zZSwgImxvY2FsLmNvbmYiKQorICAgICAgICBoYW5kbGVyLnNldF92YXJfaW5fZmlsZSgiU0RLTUFDSElORSIsIHNlbGYuY3Vycl9zZGtfbWFjaGluZSwgImxvY2FsLmNvbmYiKQorICAgICAgICBoYW5kbGVyLnNldF92YXJfaW5fZmlsZSgiQ09ORl9WRVJTSU9OIiwgc2VsZi5jb25mX3ZlcnNpb24sICJsb2NhbC5jb25mIikKKyAgICAgICAgaGFuZGxlci5zZXRfdmFyX2luX2ZpbGUoIkxDT05GX1ZFUlNJT04iLCBzZWxmLmxjb25mX3ZlcnNpb24sICJiYmxheWVycy5jb25mIikKKyAgICAgICAgaGFuZGxlci5zZXRfZXh0cmFfY29uZmlnKHNlbGYuZXh0cmFfc2V0dGluZykKKyAgICAgICAgaGFuZGxlci5zZXRfdmFyX2luX2ZpbGUoIlRPT0xDSEFJTl9CVUlMRCIsIHNlbGYudG9vbGNoYWluX2J1aWxkLCAibG9jYWwuY29uZiIpCisgICAgICAgIGhhbmRsZXIuc2V0X3Zhcl9pbl9maWxlKCJJTUFHRV9GU1RZUEVTIiwgc2VsZi5pbWFnZV9mc3R5cGVzLCAibG9jYWwuY29uZiIpCisgICAgICAgIGlmIG5vdCBkZWZhdWx0czoKKyAgICAgICAgICAgICMgaW1hZ2UvcmVjaXBlcy9wYWNrYWdlcworICAgICAgICAgICAgaGFuZGxlci5zZXRfdmFyX2luX2ZpbGUoIl9fU0VMRUNURURfSU1BR0VfXyIsIHNlbGYuc2VsZWN0ZWRfaW1hZ2UsICJsb2NhbC5jb25mIikKKyAgICAgICAgICAgIGhhbmRsZXIuc2V0X3Zhcl9pbl9maWxlKCJERVBFTkRTIiwgc2VsZi5zZWxlY3RlZF9yZWNpcGVzLCAibG9jYWwuY29uZiIpCisgICAgICAgICAgICBoYW5kbGVyLnNldF92YXJfaW5fZmlsZSgiSU1BR0VfSU5TVEFMTCIsIHNlbGYudXNlcl9zZWxlY3RlZF9wYWNrYWdlcywgImxvY2FsLmNvbmYiKQorICAgICAgICAjIHByb3h5CisgICAgICAgIGlmIHNlbGYuZW5hYmxlX3Byb3h5ID09IFRydWU6CisgICAgICAgICAgICBoYW5kbGVyLnNldF92YXJfaW5fZmlsZSgiaHR0cF9wcm94eSIsIHNlbGYuY29tYmluZV9wcm94eSgiaHR0cCIpLCAibG9jYWwuY29uZiIpCisgICAgICAgICAgICBoYW5kbGVyLnNldF92YXJfaW5fZmlsZSgiaHR0cHNfcHJveHkiLCBzZWxmLmNvbWJpbmVfcHJveHkoImh0dHBzIiksICJsb2NhbC5jb25mIikKKyAgICAgICAgICAgIGhhbmRsZXIuc2V0X3Zhcl9pbl9maWxlKCJmdHBfcHJveHkiLCBzZWxmLmNvbWJpbmVfcHJveHkoImZ0cCIpLCAibG9jYWwuY29uZiIpCisgICAgICAgICAgICBoYW5kbGVyLnNldF92YXJfaW5fZmlsZSgiYWxsX3Byb3h5Iiwgc2VsZi5jb21iaW5lX3Byb3h5KCJzb2NrcyIpLCAibG9jYWwuY29uZiIpCisgICAgICAgICAgICBoYW5kbGVyLnNldF92YXJfaW5fZmlsZSgiQ1ZTX1BST1hZX0hPU1QiLCBzZWxmLmNvbWJpbmVfaG9zdF9vbmx5KCJjdnMiKSwgImxvY2FsLmNvbmYiKQorICAgICAgICAgICAgaGFuZGxlci5zZXRfdmFyX2luX2ZpbGUoIkNWU19QUk9YWV9QT1JUIiwgc2VsZi5jb21iaW5lX3BvcnRfb25seSgiY3ZzIiksICJsb2NhbC5jb25mIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGhhbmRsZXIuc2V0X3Zhcl9pbl9maWxlKCJodHRwX3Byb3h5IiwgIiIsICJsb2NhbC5jb25mIikKKyAgICAgICAgICAgIGhhbmRsZXIuc2V0X3Zhcl9pbl9maWxlKCJodHRwc19wcm94eSIsICIiLCAibG9jYWwuY29uZiIpCisgICAgICAgICAgICBoYW5kbGVyLnNldF92YXJfaW5fZmlsZSgiZnRwX3Byb3h5IiwgIiIsICJsb2NhbC5jb25mIikKKyAgICAgICAgICAgIGhhbmRsZXIuc2V0X3Zhcl9pbl9maWxlKCJhbGxfcHJveHkiLCAiIiwgImxvY2FsLmNvbmYiKQorICAgICAgICAgICAgaGFuZGxlci5zZXRfdmFyX2luX2ZpbGUoIkNWU19QUk9YWV9IT1NUIiwgIiIsICJsb2NhbC5jb25mIikKKyAgICAgICAgICAgIGhhbmRsZXIuc2V0X3Zhcl9pbl9maWxlKCJDVlNfUFJPWFlfUE9SVCIsICIiLCAibG9jYWwuY29uZiIpCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcyA9ICJWRVJTSU9OOiAnJXMnLCBCQkxBWUVSUzogJyVzJywgTUFDSElORTogJyVzJywgRElTVFJPOiAnJXMnLCBETF9ESVI6ICclcycsIiAlIFwKKyAgICAgICAgICAgIChob2JWZXIsICIgIi5qb2luKHNlbGYubGF5ZXJzKSwgc2VsZi5jdXJyX21hY2gsIHNlbGYuY3Vycl9kaXN0cm8sIHNlbGYuZGxkaXIgKQorICAgICAgICBzICs9ICJTU1RBVEVfRElSOiAnJXMnLCBTU1RBVEVfTUlSUk9SOiAnJXMnLCBQQVJBTExFTF9NQUtFOiAnLWogJXMnLCBCQl9OVU1CRVJfVEhSRUFEUzogJyVzJywgUEFDS0FHRV9DTEFTU0VTOiAnJXMnLCAiICUgXAorICAgICAgICAgICAgKHNlbGYuc3N0YXRlZGlyLCBzZWxmLnNzdGF0ZW1pcnJvciwgc2VsZi5wbWFrZSwgc2VsZi5iYnRocmVhZCwgIiAiLmpvaW4oWyJwYWNrYWdlXyIgKyBpIGZvciBpIGluIHNlbGYuY3Vycl9wYWNrYWdlX2Zvcm1hdC5zcGxpdCgpXSkpCisgICAgICAgIHMgKz0gIklNQUdFX1JPT1RGU19TSVpFOiAnJXMnLCBJTUFHRV9FWFRSQV9TUEFDRTogJyVzJywgSU5DT01QQVRJQkxFX0xJQ0VOU0U6ICclcycsIFNES01BQ0hJTkU6ICclcycsIENPTkZfVkVSU0lPTjogJyVzJywgIiAlIFwKKyAgICAgICAgICAgIChzZWxmLmltYWdlX3Jvb3Rmc19zaXplLCBzZWxmLmltYWdlX2V4dHJhX3NpemUsIHNlbGYuaW5jb21wYXRfbGljZW5zZSwgc2VsZi5jdXJyX3Nka19tYWNoaW5lLCBzZWxmLmNvbmZfdmVyc2lvbikKKyAgICAgICAgcyArPSAiTENPTkZfVkVSU0lPTjogJyVzJywgRVhUUkFfU0VUVElORzogJyVzJywgVE9PTENIQUlOX0JVSUxEOiAnJXMnLCBJTUFHRV9GU1RZUEVTOiAnJXMnLCBfX1NFTEVDVEVEX0lNQUdFX186ICclcycsICIgJSBcCisgICAgICAgICAgICAoc2VsZi5sY29uZl92ZXJzaW9uLCBzZWxmLmV4dHJhX3NldHRpbmcsIHNlbGYudG9vbGNoYWluX2J1aWxkLCBzZWxmLmltYWdlX2ZzdHlwZXMsIHNlbGYuc2VsZWN0ZWRfaW1hZ2UpCisgICAgICAgIHMgKz0gIkRFUEVORFM6ICclcycsIElNQUdFX0lOU1RBTEw6ICclcycsIGVuYWJsZV9wcm94eTogJyVzJywgdXNlX3NhbWVfcHJveHk6ICclcycsIGh0dHBfcHJveHk6ICclcycsICIgJSBcCisgICAgICAgICAgICAoc2VsZi5zZWxlY3RlZF9yZWNpcGVzLCBzZWxmLnVzZXJfc2VsZWN0ZWRfcGFja2FnZXMsIHNlbGYuZW5hYmxlX3Byb3h5LCBzZWxmLnNhbWVfcHJveHksIHNlbGYuY29tYmluZV9wcm94eSgiaHR0cCIpKQorICAgICAgICBzICs9ICJodHRwc19wcm94eTogJyVzJywgZnRwX3Byb3h5OiAnJXMnLCBhbGxfcHJveHk6ICclcycsIENWU19QUk9YWV9IT1NUOiAnJXMnLCBDVlNfUFJPWFlfUE9SVDogJyVzJyIgJSBcCisgICAgICAgICAgICAoc2VsZi5jb21iaW5lX3Byb3h5KCJodHRwcyIpLCBzZWxmLmNvbWJpbmVfcHJveHkoImZ0cCIpLCBzZWxmLmNvbWJpbmVfcHJveHkoInNvY2tzIiksCisgICAgICAgICAgICAgc2VsZi5jb21iaW5lX2hvc3Rfb25seSgiY3ZzIiksIHNlbGYuY29tYmluZV9wb3J0X29ubHkoImN2cyIpKQorICAgICAgICByZXR1cm4gcworCitjbGFzcyBQYXJhbWV0ZXJzOgorICAgICcnJ1JlcHJlc2VudHMgb3RoZXIgdmFyaWFibGVzIGxpa2UgYXZhaWxhYmxlIG1hY2hpbmVzLCBldGMuJycnCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICMgVmFyaWFibGVzCisgICAgICAgIHNlbGYubWF4X3RocmVhZHMgPSA2NTUzNQorICAgICAgICBzZWxmLmNvcmVfYmFzZSA9ICIiCisgICAgICAgIHNlbGYuaW1hZ2VfYWRkciA9ICIiCisgICAgICAgIHNlbGYuaW1hZ2VfdHlwZXMgPSBbXQorICAgICAgICBzZWxmLnJ1bm5hYmxlX2ltYWdlX3R5cGVzID0gW10KKyAgICAgICAgc2VsZi5ydW5uYWJsZV9tYWNoaW5lX3BhdHRlcm5zID0gW10KKyAgICAgICAgc2VsZi5kZXBsb3lhYmxlX2ltYWdlX3R5cGVzID0gW10KKyAgICAgICAgc2VsZi50bXBkaXIgPSAiIgorCisgICAgICAgIHNlbGYuYWxsX21hY2hpbmVzID0gW10KKyAgICAgICAgc2VsZi5hbGxfcGFja2FnZV9mb3JtYXRzID0gW10KKyAgICAgICAgc2VsZi5hbGxfZGlzdHJvcyA9IFtdCisgICAgICAgIHNlbGYuYWxsX3Nka19tYWNoaW5lcyA9IFtdCisgICAgICAgIHNlbGYuYWxsX2xheWVycyA9IFtdCisgICAgICAgIHNlbGYuaW1hZ2VfbmFtZXMgPSBbXQorICAgICAgICBzZWxmLmltYWdlX3doaXRlX3BhdHRlcm4gPSAiIgorICAgICAgICBzZWxmLmltYWdlX2JsYWNrX3BhdHRlcm4gPSAiIgorCisgICAgICAgICMgZm9yIGJ1aWxkIGxvZyB0byBzaG93CisgICAgICAgIHNlbGYuYmJfdmVyc2lvbiA9ICIiCisgICAgICAgIHNlbGYudGFyZ2V0X2FyY2ggPSAiIgorICAgICAgICBzZWxmLnRhcmdldF9vcyA9ICIiCisgICAgICAgIHNlbGYuZGlzdHJvX3ZlcnNpb24gPSAiIgorICAgICAgICBzZWxmLnR1bmVfcGtnYXJjaCA9ICIiCisKKyAgICBkZWYgdXBkYXRlKHNlbGYsIHBhcmFtcyk6CisgICAgICAgIHNlbGYubWF4X3RocmVhZHMgPSBwYXJhbXNbIm1heF90aHJlYWRzIl0KKyAgICAgICAgc2VsZi5jb3JlX2Jhc2UgPSBwYXJhbXNbImNvcmVfYmFzZSJdCisgICAgICAgIHNlbGYuaW1hZ2VfYWRkciA9IHBhcmFtc1siaW1hZ2VfYWRkciJdCisgICAgICAgIHNlbGYuaW1hZ2VfdHlwZXMgPSBwYXJhbXNbImltYWdlX3R5cGVzIl0uc3BsaXQoKQorICAgICAgICBzZWxmLnJ1bm5hYmxlX2ltYWdlX3R5cGVzID0gcGFyYW1zWyJydW5uYWJsZV9pbWFnZV90eXBlcyJdLnNwbGl0KCkKKyAgICAgICAgc2VsZi5ydW5uYWJsZV9tYWNoaW5lX3BhdHRlcm5zID0gcGFyYW1zWyJydW5uYWJsZV9tYWNoaW5lX3BhdHRlcm5zIl0uc3BsaXQoKQorICAgICAgICBzZWxmLmRlcGxveWFibGVfaW1hZ2VfdHlwZXMgPSBwYXJhbXNbImRlcGxveWFibGVfaW1hZ2VfdHlwZXMiXS5zcGxpdCgpCisgICAgICAgIHNlbGYudG1wZGlyID0gcGFyYW1zWyJ0bXBkaXIiXQorICAgICAgICBzZWxmLmltYWdlX3doaXRlX3BhdHRlcm4gPSBwYXJhbXNbImltYWdlX3doaXRlX3BhdHRlcm4iXQorICAgICAgICBzZWxmLmltYWdlX2JsYWNrX3BhdHRlcm4gPSBwYXJhbXNbImltYWdlX2JsYWNrX3BhdHRlcm4iXQorICAgICAgICBzZWxmLmtlcm5lbF9pbWFnZV90eXBlID0gcGFyYW1zWyJrZXJuZWxfaW1hZ2VfdHlwZSJdCisgICAgICAgICMgZm9yIGJ1aWxkIGxvZyB0byBzaG93CisgICAgICAgIHNlbGYuYmJfdmVyc2lvbiA9IHBhcmFtc1siYmJfdmVyc2lvbiJdCisgICAgICAgIHNlbGYudGFyZ2V0X2FyY2ggPSBwYXJhbXNbInRhcmdldF9hcmNoIl0KKyAgICAgICAgc2VsZi50YXJnZXRfb3MgPSBwYXJhbXNbInRhcmdldF9vcyJdCisgICAgICAgIHNlbGYuZGlzdHJvX3ZlcnNpb24gPSBwYXJhbXNbImRpc3Ryb192ZXJzaW9uIl0KKyAgICAgICAgc2VsZi50dW5lX3BrZ2FyY2ggPSBwYXJhbXNbInR1bmVfcGtnYXJjaCJdCisKK2RlZiBob2JfY29uZl9maWx0ZXIoZm4sIGRhdGEpOgorICAgIGlmIGZuLmVuZHN3aXRoKCIvbG9jYWwuY29uZiIpOgorICAgICAgICBkaXN0cm8gPSBkYXRhLmdldFZhcigiRElTVFJPX0hPQiIsIEZhbHNlKQorICAgICAgICBpZiBkaXN0cm86CisgICAgICAgICAgICBpZiBkaXN0cm8gIT0gImRlZmF1bHRzZXR1cCI6CisgICAgICAgICAgICAgICAgZGF0YS5zZXRWYXIoIkRJU1RSTyIsIGRpc3RybykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZGF0YS5kZWxWYXIoIkRJU1RSTyIpCisKKyAgICAgICAga2V5cyA9IFsiTUFDSElORV9IT0IiLCAiU0RLTUFDSElORV9IT0IiLCAiUEFDS0FHRV9DTEFTU0VTX0hPQiIsIFwKKyAgICAgICAgICAgICAgICAiQkJfTlVNQkVSX1RIUkVBRFNfSE9CIiwgIlBBUkFMTEVMX01BS0VfSE9CIiwgIkRMX0RJUl9IT0IiLCBcCisgICAgICAgICAgICAgICAgIlNTVEFURV9ESVJfSE9CIiwgIlNTVEFURV9NSVJST1JTX0hPQiIsICJJTkNPTVBBVElCTEVfTElDRU5TRV9IT0IiXQorICAgICAgICBmb3Iga2V5IGluIGtleXM6CisgICAgICAgICAgICB2YXJfaG9iID0gZGF0YS5nZXRWYXIoa2V5LCBGYWxzZSkKKyAgICAgICAgICAgIGlmIHZhcl9ob2I6CisgICAgICAgICAgICAgICAgZGF0YS5zZXRWYXIoa2V5LnNwbGl0KCJfSE9CIilbMF0sIHZhcl9ob2IpCisgICAgICAgIHJldHVybgorCisgICAgaWYgZm4uZW5kc3dpdGgoIi9iYmxheWVycy5jb25mIik6CisgICAgICAgIGxheWVycyA9IGRhdGEuZ2V0VmFyKCJCQkxBWUVSU19IT0IiLCBGYWxzZSkKKyAgICAgICAgaWYgbGF5ZXJzOgorICAgICAgICAgICAgZGF0YS5zZXRWYXIoIkJCTEFZRVJTIiwgbGF5ZXJzKQorICAgICAgICByZXR1cm4KKworY2xhc3MgQnVpbGRlcihndGsuV2luZG93KToKKworICAgIChJTklUSUFMX0NIRUNLUywKKyAgICAgTUFDSElORV9TRUxFQ1RJT04sCisgICAgIFJDUFBLR0lORk9fUE9QVUxBVElORywKKyAgICAgUkNQUEtHSU5GT19QT1BVTEFURUQsCisgICAgIEJBU0VJTUdfU0VMRUNURUQsCisgICAgIFJFQ0lQRV9TRUxFQ1RJT04sCisgICAgIFBBQ0tBR0VfR0VORVJBVElORywKKyAgICAgUEFDS0FHRV9HRU5FUkFURUQsCisgICAgIFBBQ0tBR0VfU0VMRUNUSU9OLAorICAgICBGQVNUX0lNQUdFX0dFTkVSQVRJTkcsCisgICAgIElNQUdFX0dFTkVSQVRJTkcsCisgICAgIElNQUdFX0dFTkVSQVRFRCwKKyAgICAgTVlfSU1BR0VfT1BFTkVELAorICAgICBCQUNLLAorICAgICBFTkRfTk9PUCkgPSByYW5nZSgxNSkKKworICAgIChTQU5JVFlfQ0hFQ0ssCisgICAgIElNQUdFX0NPTkZJR1VSQVRJT04sCisgICAgIFJFQ0lQRV9ERVRBSUxTLAorICAgICBCVUlMRF9ERVRBSUxTLAorICAgICBQQUNLQUdFX0RFVEFJTFMsCisgICAgIElNQUdFX0RFVEFJTFMsCisgICAgIEVORF9UQUIpID0gcmFuZ2UoNykKKworICAgIF9fc3RlcDJwYWdlX18gPSB7CisgICAgICAgIElOSVRJQUxfQ0hFQ0tTICAgICAgICA6IFNBTklUWV9DSEVDSywKKyAgICAgICAgTUFDSElORV9TRUxFQ1RJT04gICAgIDogSU1BR0VfQ09ORklHVVJBVElPTiwKKyAgICAgICAgUkNQUEtHSU5GT19QT1BVTEFUSU5HIDogSU1BR0VfQ09ORklHVVJBVElPTiwKKyAgICAgICAgUkNQUEtHSU5GT19QT1BVTEFURUQgIDogSU1BR0VfQ09ORklHVVJBVElPTiwKKyAgICAgICAgQkFTRUlNR19TRUxFQ1RFRCAgICAgIDogSU1BR0VfQ09ORklHVVJBVElPTiwKKyAgICAgICAgUkVDSVBFX1NFTEVDVElPTiAgICAgIDogUkVDSVBFX0RFVEFJTFMsCisgICAgICAgIFBBQ0tBR0VfR0VORVJBVElORyAgICA6IEJVSUxEX0RFVEFJTFMsCisgICAgICAgIFBBQ0tBR0VfR0VORVJBVEVEICAgICA6IFBBQ0tBR0VfREVUQUlMUywKKyAgICAgICAgUEFDS0FHRV9TRUxFQ1RJT04gICAgIDogUEFDS0FHRV9ERVRBSUxTLAorICAgICAgICBGQVNUX0lNQUdFX0dFTkVSQVRJTkcgOiBCVUlMRF9ERVRBSUxTLAorICAgICAgICBJTUFHRV9HRU5FUkFUSU5HICAgICAgOiBCVUlMRF9ERVRBSUxTLAorICAgICAgICBJTUFHRV9HRU5FUkFURUQgICAgICAgOiBJTUFHRV9ERVRBSUxTLAorICAgICAgICBNWV9JTUFHRV9PUEVORUQgICAgICAgOiBJTUFHRV9ERVRBSUxTLAorICAgICAgICBFTkRfTk9PUCAgICAgICAgICAgICAgOiBOb25lLAorICAgIH0KKworICAgIFNBTklUWV9DSEVDS19NSU5fRElTUExBWV9USU1FID0gNQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvYkhhbmRsZXIsIHJlY2lwZV9tb2RlbCwgcGFja2FnZV9tb2RlbCk6CisgICAgICAgIHN1cGVyKEJ1aWxkZXIsIHNlbGYpLl9faW5pdF9fKCkKKworICAgICAgICBzZWxmLmhvYl9pbWFnZSA9ICJob2ItaW1hZ2UiCisKKyAgICAgICAgIyBoYW5kbGVyCisgICAgICAgIHNlbGYuaGFuZGxlciA9IGhvYkhhbmRsZXIKKworICAgICAgICAjIGxvZ2dlcgorICAgICAgICBzZWxmLmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJCaXRCYWtlIikKKyAgICAgICAgc2VsZi5jb25zb2xlbG9nID0gTm9uZQorICAgICAgICBzZWxmLmN1cnJlbnRfbG9nZmlsZSA9IE5vbmUKKworICAgICAgICAjIGNvbmZpZ3VyYXRpb24gYW5kIHBhcmFtZXRlcnMKKyAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uID0gQ29uZmlndXJhdGlvbigpCisgICAgICAgIHNlbGYucGFyYW1ldGVycyA9IFBhcmFtZXRlcnMoKQorCisgICAgICAgICMgYnVpbGQgc3RlcAorICAgICAgICBzZWxmLmN1cnJlbnRfc3RlcCA9IE5vbmUKKyAgICAgICAgc2VsZi5wcmV2aW91c19zdGVwID0gTm9uZQorCisgICAgICAgIHNlbGYuc3RvcHBpbmcgPSBGYWxzZQorCisgICAgICAgICMgcmVjaXBlIG1vZGVsIGFuZCBwYWNrYWdlIG1vZGVsCisgICAgICAgIHNlbGYucmVjaXBlX21vZGVsID0gcmVjaXBlX21vZGVsCisgICAgICAgIHNlbGYucGFja2FnZV9tb2RlbCA9IHBhY2thZ2VfbW9kZWwKKworICAgICAgICAjIEluZGljYXRlIHdoZXRoZXIgdXNlciBoYXMgY3VzdG9taXplZCB0aGUgaW1hZ2UKKyAgICAgICAgc2VsZi5jdXN0b21pemVkID0gRmFsc2UKKworICAgICAgICAjIEluZGljYXRlIHdoZXRoZXIgdGhlIFVJIGlzIHdvcmtpbmcKKyAgICAgICAgc2VsZi5zZW5zaXRpdmUgPSBUcnVlCisKKyAgICAgICAgIyBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBzYW5pdHkgY2hlY2sgcmFuCisgICAgICAgIHNlbGYuc2FuaXR5X2NoZWNrZWQgPSBGYWxzZQorCisgICAgICAgICMgc2F2ZSBwYXJzaW5nIHdhcm5pbmdzCisgICAgICAgIHNlbGYucGFyc2luZ193YXJuaW5ncyA9IFtdCisKKyAgICAgICAgIyBjcmVhdGUgdmlzdWFsIGVsZW1lbnRzCisgICAgICAgIHNlbGYuY3JlYXRlX3Zpc3VhbF9lbGVtZW50cygpCisKKyAgICAgICAgIyBjb25uZWN0IHRoZSBzaWduYWxzIHRvIGZ1bmN0aW9ucworICAgICAgICBzZWxmLmNvbm5lY3QoImRlbGV0ZS1ldmVudCIsIHNlbGYuZGVzdHJveV93aW5kb3dfY2IpCisgICAgICAgIHNlbGYucmVjaXBlX21vZGVsLmNvbm5lY3QgKCJyZWNpcGUtc2VsZWN0aW9uLWNoYW5nZWQiLCAgc2VsZi5yZWNpcGVsaXN0X2NoYW5nZWRfY2IpCisgICAgICAgIHNlbGYucGFja2FnZV9tb2RlbC5jb25uZWN0KCJwYWNrYWdlLXNlbGVjdGlvbi1jaGFuZ2VkIiwgc2VsZi5wYWNrYWdlbGlzdF9jaGFuZ2VkX2NiKQorICAgICAgICBzZWxmLmhhbmRsZXIuY29ubmVjdCgiY29uZmlnLXVwZGF0ZWQiLCAgICAgICAgICAgc2VsZi5oYW5kbGVyX2NvbmZpZ191cGRhdGVkX2NiKQorICAgICAgICBzZWxmLmhhbmRsZXIuY29ubmVjdCgicGFja2FnZS1mb3JtYXRzLXVwZGF0ZWQiLCAgc2VsZi5oYW5kbGVyX3BhY2thZ2VfZm9ybWF0c191cGRhdGVkX2NiKQorICAgICAgICBzZWxmLmhhbmRsZXIuY29ubmVjdCgicGFyc2luZy1zdGFydGVkIiwgICAgICAgICAgc2VsZi5oYW5kbGVyX3BhcnNpbmdfc3RhcnRlZF9jYikKKyAgICAgICAgc2VsZi5oYW5kbGVyLmNvbm5lY3QoInBhcnNpbmciLCAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlcl9wYXJzaW5nX2NiKQorICAgICAgICBzZWxmLmhhbmRsZXIuY29ubmVjdCgicGFyc2luZy1jb21wbGV0ZWQiLCAgICAgICAgc2VsZi5oYW5kbGVyX3BhcnNpbmdfY29tcGxldGVkX2NiKQorICAgICAgICBzZWxmLmhhbmRsZXIuYnVpbGQuY29ubmVjdCgiYnVpbGQtc3RhcnRlZCIsICAgICAgc2VsZi5oYW5kbGVyX2J1aWxkX3N0YXJ0ZWRfY2IpCisgICAgICAgIHNlbGYuaGFuZGxlci5idWlsZC5jb25uZWN0KCJidWlsZC1zdWNjZWVkZWQiLCAgICBzZWxmLmhhbmRsZXJfYnVpbGRfc3VjY2VlZGVkX2NiKQorICAgICAgICBzZWxmLmhhbmRsZXIuYnVpbGQuY29ubmVjdCgiYnVpbGQtZmFpbGVkIiwgICAgICAgc2VsZi5oYW5kbGVyX2J1aWxkX2ZhaWxlZF9jYikKKyAgICAgICAgc2VsZi5oYW5kbGVyLmJ1aWxkLmNvbm5lY3QoImJ1aWxkLWFib3J0ZWQiLCAgICAgIHNlbGYuaGFuZGxlcl9idWlsZF9hYm9ydGVkX2NiKQorICAgICAgICBzZWxmLmhhbmRsZXIuYnVpbGQuY29ubmVjdCgidGFzay1zdGFydGVkIiwgICAgICAgc2VsZi5oYW5kbGVyX3Rhc2tfc3RhcnRlZF9jYikKKyAgICAgICAgc2VsZi5oYW5kbGVyLmJ1aWxkLmNvbm5lY3QoImRpc2stZnVsbCIsICAgICAgICAgIHNlbGYuaGFuZGxlcl9kaXNrX2Z1bGxfY2IpCisgICAgICAgIHNlbGYuaGFuZGxlci5idWlsZC5jb25uZWN0KCJsb2ctZXJyb3IiLCAgICAgICAgICBzZWxmLmhhbmRsZXJfYnVpbGRfZmFpbHVyZV9jYikKKyAgICAgICAgc2VsZi5oYW5kbGVyLmJ1aWxkLmNvbm5lY3QoImxvZy13YXJuaW5nIiwgICAgICAgIHNlbGYuaGFuZGxlcl9idWlsZF9mYWlsdXJlX2NiKQorICAgICAgICBzZWxmLmhhbmRsZXIuYnVpbGQuY29ubmVjdCgibG9nIiwgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVyX2J1aWxkX2xvZ19jYikKKyAgICAgICAgc2VsZi5oYW5kbGVyLmJ1aWxkLmNvbm5lY3QoIm5vLXByb3ZpZGVyIiwgICAgICAgIHNlbGYuaGFuZGxlcl9ub19wcm92aWRlcl9jYikKKyAgICAgICAgc2VsZi5oYW5kbGVyLmNvbm5lY3QoImdlbmVyYXRpbmctZGF0YSIsICAgICAgICAgIHNlbGYuaGFuZGxlcl9nZW5lcmF0aW5nX2RhdGFfY2IpCisgICAgICAgIHNlbGYuaGFuZGxlci5jb25uZWN0KCJkYXRhLWdlbmVyYXRlZCIsICAgICAgICAgICBzZWxmLmhhbmRsZXJfZGF0YV9nZW5lcmF0ZWRfY2IpCisgICAgICAgIHNlbGYuaGFuZGxlci5jb25uZWN0KCJjb21tYW5kLXN1Y2NlZWRlZCIsICAgICAgICBzZWxmLmhhbmRsZXJfY29tbWFuZF9zdWNjZWVkZWRfY2IpCisgICAgICAgIHNlbGYuaGFuZGxlci5jb25uZWN0KCJjb21tYW5kLWZhaWxlZCIsICAgICAgICAgICBzZWxmLmhhbmRsZXJfY29tbWFuZF9mYWlsZWRfY2IpCisgICAgICAgIHNlbGYuaGFuZGxlci5jb25uZWN0KCJwYXJzaW5nLXdhcm5pbmciLCAgICAgICAgICBzZWxmLmhhbmRsZXJfcGFyc2luZ193YXJuaW5nX2NiKQorICAgICAgICBzZWxmLmhhbmRsZXIuY29ubmVjdCgic2FuaXR5LWZhaWxlZCIsICAgICAgICAgICAgc2VsZi5oYW5kbGVyX3Nhbml0eV9mYWlsZWRfY2IpCisgICAgICAgIHNlbGYuaGFuZGxlci5jb25uZWN0KCJyZWNpcGUtcG9wdWxhdGVkIiwgICAgICAgICBzZWxmLmhhbmRsZXJfcmVjaXBlX3BvcHVsYXRlZF9jYikKKyAgICAgICAgc2VsZi5oYW5kbGVyLmNvbm5lY3QoInBhY2thZ2UtcG9wdWxhdGVkIiwgICAgICAgIHNlbGYuaGFuZGxlcl9wYWNrYWdlX3BvcHVsYXRlZF9jYikKKworICAgICAgICBzZWxmLmhhbmRsZXIuYXBwZW5kX3RvX2JiZmlsZXMoIiR7VE9QRElSfS9yZWNpcGVzL2ltYWdlcy9jdXN0b20vKi5iYiIpCisgICAgICAgIHNlbGYuaGFuZGxlci5hcHBlbmRfdG9fYmJmaWxlcygiJHtUT1BESVJ9L3JlY2lwZXMvaW1hZ2VzLyouYmIiKQorICAgICAgICBzZWxmLmluaXRpYXRlX25ld19idWlsZF9hc3luYygpCisKKyAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHSU5ULCBzZWxmLmV2ZW50X2hhbmRsZV9TSUdJTlQpCisKKyAgICBkZWYgY3JlYXRlX3Zpc3VhbF9lbGVtZW50cyhzZWxmKToKKyAgICAgICAgc2VsZi5zZXRfdGl0bGUoIkhvYiIpCisgICAgICAgIHNlbGYuc2V0X2ljb25fbmFtZSgiYXBwbGljYXRpb25zLWRldmVsb3BtZW50IikKKyAgICAgICAgc2VsZi5zZXRfcmVzaXphYmxlKFRydWUpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2luZG93X3dpZHRoID0gc2VsZi5nZXRfc2NyZWVuKCkuZ2V0X3dpZHRoKCkKKyAgICAgICAgICAgIHdpbmRvd19oZWlnaHQgPSBzZWxmLmdldF9zY3JlZW4oKS5nZXRfaGVpZ2h0KCkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcHJpbnQgIlBsZWFzZSBzZXQgRElTUExBWSB2YXJpYWJsZSBiZWZvcmUgcnVubmluZyBIb2IuIgorICAgICAgICAgICAgc3lzLmV4aXQoMSkKKworICAgICAgICBpZiB3aW5kb3dfd2lkdGggPj0gaHdjLk1BSU5fV0lOX1dJRFRIOgorICAgICAgICAgICAgd2luZG93X3dpZHRoID0gaHdjLk1BSU5fV0lOX1dJRFRICisgICAgICAgICAgICB3aW5kb3dfaGVpZ2h0ID0gaHdjLk1BSU5fV0lOX0hFSUdIVAorICAgICAgICBzZWxmLnNldF9zaXplX3JlcXVlc3Qod2luZG93X3dpZHRoLCB3aW5kb3dfaGVpZ2h0KQorCisgICAgICAgIHNlbGYudmJveCA9IGd0ay5WQm94KEZhbHNlLCAwKQorICAgICAgICBzZWxmLnZib3guc2V0X2JvcmRlcl93aWR0aCgwKQorICAgICAgICBzZWxmLmFkZChzZWxmLnZib3gpCisKKyAgICAgICAgIyBjcmVhdGUgcGFnZXMKKyAgICAgICAgc2VsZi5pbWFnZV9jb25maWd1cmF0aW9uX3BhZ2UgPSBJbWFnZUNvbmZpZ3VyYXRpb25QYWdlKHNlbGYpCisgICAgICAgIHNlbGYucmVjaXBlX2RldGFpbHNfcGFnZSAgICAgID0gUmVjaXBlU2VsZWN0aW9uUGFnZShzZWxmKQorICAgICAgICBzZWxmLmJ1aWxkX2RldGFpbHNfcGFnZSAgICAgICA9IEJ1aWxkRGV0YWlsc1BhZ2Uoc2VsZikKKyAgICAgICAgc2VsZi5wYWNrYWdlX2RldGFpbHNfcGFnZSAgICAgPSBQYWNrYWdlU2VsZWN0aW9uUGFnZShzZWxmKQorICAgICAgICBzZWxmLmltYWdlX2RldGFpbHNfcGFnZSAgICAgICA9IEltYWdlRGV0YWlsc1BhZ2Uoc2VsZikKKyAgICAgICAgc2VsZi5zYW5pdHlfY2hlY2tfcGFnZSAgICAgICAgPSBTYW5pdHlDaGVja1BhZ2Uoc2VsZikKKyAgICAgICAgc2VsZi5kaXNwbGF5X3Nhbml0eV9jaGVjayA9IEZhbHNlCisgICAgICAgIHNlbGYuc2FuaXR5X2NoZWNrX3Bvc3RfZnVuYyA9IEZhbHNlCisgICAgICAgIHNlbGYuaGFkX25ldHdvcmtfZXJyb3IgPSBGYWxzZQorCisgICAgICAgIHNlbGYubmIgPSBndGsuTm90ZWJvb2soKQorICAgICAgICBzZWxmLm5iLnNldF9zaG93X3RhYnMoRmFsc2UpCisgICAgICAgIHNlbGYubmIuaW5zZXJ0X3BhZ2Uoc2VsZi5zYW5pdHlfY2hlY2tfcGFnZSwgICAgICAgIE5vbmUsIHNlbGYuU0FOSVRZX0NIRUNLKQorICAgICAgICBzZWxmLm5iLmluc2VydF9wYWdlKHNlbGYuaW1hZ2VfY29uZmlndXJhdGlvbl9wYWdlLCBOb25lLCBzZWxmLklNQUdFX0NPTkZJR1VSQVRJT04pCisgICAgICAgIHNlbGYubmIuaW5zZXJ0X3BhZ2Uoc2VsZi5yZWNpcGVfZGV0YWlsc19wYWdlLCAgICAgIE5vbmUsIHNlbGYuUkVDSVBFX0RFVEFJTFMpCisgICAgICAgIHNlbGYubmIuaW5zZXJ0X3BhZ2Uoc2VsZi5idWlsZF9kZXRhaWxzX3BhZ2UsICAgICAgIE5vbmUsIHNlbGYuQlVJTERfREVUQUlMUykKKyAgICAgICAgc2VsZi5uYi5pbnNlcnRfcGFnZShzZWxmLnBhY2thZ2VfZGV0YWlsc19wYWdlLCAgICAgTm9uZSwgc2VsZi5QQUNLQUdFX0RFVEFJTFMpCisgICAgICAgIHNlbGYubmIuaW5zZXJ0X3BhZ2Uoc2VsZi5pbWFnZV9kZXRhaWxzX3BhZ2UsICAgICAgIE5vbmUsIHNlbGYuSU1BR0VfREVUQUlMUykKKyAgICAgICAgc2VsZi52Ym94LnBhY2tfc3RhcnQoc2VsZi5uYiwgZXhwYW5kPVRydWUsIGZpbGw9VHJ1ZSkKKworICAgICAgICBzZWxmLnNob3dfYWxsKCkKKyAgICAgICAgc2VsZi5uYi5zZXRfY3VycmVudF9wYWdlKDApCisKKyAgICBkZWYgc2FuaXR5X2NoZWNrX3RpbWVvdXQoc2VsZik6CisgICAgICAgICMgVGhlIG1pbmltdW0gdGltZSBmb3Igc2hvd2luZyB0aGUgJ3Nhbml0eSBjaGVjaycgcGFnZSBoYXMgcGFzc2UKKyAgICAgICAgIyBJZiBzb21lb25lIHNldCB0aGUgJ3Nhbml0eV9jaGVja19wb3N0X3N0ZXAnIG1lYW53aGlsZSwgZXhlY3V0ZSBpdCBub3cKKyAgICAgICAgc2VsZi5kaXNwbGF5X3Nhbml0eV9jaGVjayA9IEZhbHNlCisgICAgICAgIGlmIHNlbGYuc2FuaXR5X2NoZWNrX3Bvc3RfZnVuYzoKKyAgICAgICAgICB0ZW1wID0gc2VsZi5zYW5pdHlfY2hlY2tfcG9zdF9mdW5jCisgICAgICAgICAgc2VsZi5zYW5pdHlfY2hlY2tfcG9zdF9mdW5jID0gTm9uZQorICAgICAgICAgIHRlbXAoKQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBzaG93X3Nhbml0eV9jaGVja19wYWdlKHNlbGYpOgorICAgICAgICAjIFRoaXMgd2luZG93IG11c3Qgc3RheSBvbiBzY3JlZW4gZm9yIGF0IGxlYXN0IDUgc2Vjb25kcywgYWNjb3JkaW5nIHRvIHRoZSBkZXNpZ24gZG9jdW1lbnQKKyAgICAgICAgc2VsZi5uYi5zZXRfY3VycmVudF9wYWdlKHNlbGYuU0FOSVRZX0NIRUNLKQorICAgICAgICBzZWxmLnNhbml0eV9jaGVja19wb3N0X3N0ZXAgPSBOb25lCisgICAgICAgIHNlbGYuZGlzcGxheV9zYW5pdHlfY2hlY2sgPSBUcnVlCisgICAgICAgIHNlbGYuc2FuaXR5X2NoZWNrX3BhZ2Uuc3RhcnQoKQorICAgICAgICBnb2JqZWN0LnRpbWVvdXRfYWRkKHNlbGYuU0FOSVRZX0NIRUNLX01JTl9ESVNQTEFZX1RJTUUgKiAxMDAwLCBzZWxmLnNhbml0eV9jaGVja190aW1lb3V0KQorCisgICAgZGVmIGV4ZWN1dGVfYWZ0ZXJfc2FuaXR5X2NoZWNrKHNlbGYsIGZ1bmMpOgorICAgICAgICBpZiBub3Qgc2VsZi5kaXNwbGF5X3Nhbml0eV9jaGVjazoKKyAgICAgICAgICBmdW5jKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBzZWxmLnNhbml0eV9jaGVja19wb3N0X2Z1bmMgPSBmdW5jCisKKyAgICBkZWYgZ2VuZXJhdGVfY29uZmlndXJhdGlvbihzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuc2FuaXR5X2NoZWNrZWQ6CisgICAgICAgICAgICBzZWxmLnNob3dfc2FuaXR5X2NoZWNrX3BhZ2UoKQorICAgICAgICBzZWxmLmhhbmRsZXIuZ2VuZXJhdGVfY29uZmlndXJhdGlvbigpCisKKyAgICBkZWYgaW5pdGlhdGVfbmV3X2J1aWxkX2FzeW5jKHNlbGYpOgorICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uc2VsZWN0ZWRfaW1hZ2UgPSBOb25lCisgICAgICAgIHNlbGYuc3dpdGNoX3BhZ2Uoc2VsZi5NQUNISU5FX1NFTEVDVElPTikKKyAgICAgICAgc2VsZi5oYW5kbGVyLmluaXRfY29va2VyKCkKKyAgICAgICAgc2VsZi5oYW5kbGVyLnNldF9leHRyYV9pbmhlcml0KCJpbWFnZV90eXBlcyIpCisgICAgICAgIHNlbGYuZ2VuZXJhdGVfY29uZmlndXJhdGlvbigpCisKKyAgICBkZWYgdXBkYXRlX2NvbmZpZ19hc3luYyhzZWxmKToKKyAgICAgICAgc2VsZi5zZXRfdXNlcl9jb25maWcoKQorICAgICAgICBzZWxmLmdlbmVyYXRlX2NvbmZpZ3VyYXRpb24oKQorICAgICAgICBzZWxmLnN3aXRjaF9wYWdlKHNlbGYuTUFDSElORV9TRUxFQ1RJT04pCisKKyAgICBkZWYgc2FuaXR5X2NoZWNrKHNlbGYpOgorICAgICAgICBzZWxmLmhhbmRsZXIudHJpZ2dlcl9zYW5pdHlfY2hlY2soKQorCisgICAgZGVmIHBvcHVsYXRlX3JlY2lwZV9wYWNrYWdlX2luZm9fYXN5bmMoc2VsZik6CisgICAgICAgIHNlbGYuc3dpdGNoX3BhZ2Uoc2VsZi5SQ1BQS0dJTkZPX1BPUFVMQVRJTkcpCisgICAgICAgICMgUGFyc2UgcmVjaXBlcworICAgICAgICBzZWxmLnNldF91c2VyX2NvbmZpZygpCisgICAgICAgIHNlbGYuaGFuZGxlci5nZW5lcmF0ZV9yZWNpcGVzKCkKKworICAgIGRlZiBnZW5lcmF0ZV9wYWNrYWdlc19hc3luYyhzZWxmLCBsb2cgPSBGYWxzZSk6CisgICAgICAgIHNlbGYuc3dpdGNoX3BhZ2Uoc2VsZi5QQUNLQUdFX0dFTkVSQVRJTkcpCisgICAgICAgIGlmIGxvZzoKKyAgICAgICAgICAgIHNlbGYuY3VycmVudF9sb2dmaWxlID0gc2VsZi5oYW5kbGVyLmdldF9sb2dmaWxlKCkKKyAgICAgICAgICAgIHNlbGYuZG9fbG9nKHNlbGYuY3VycmVudF9sb2dmaWxlKQorICAgICAgICAjIEJ1aWxkIHBhY2thZ2VzCisgICAgICAgIF8sIGFsbF9yZWNpcGVzID0gc2VsZi5yZWNpcGVfbW9kZWwuZ2V0X3NlbGVjdGVkX3JlY2lwZXMoKQorICAgICAgICBzZWxmLnNldF91c2VyX2NvbmZpZygpCisgICAgICAgIHNlbGYuaGFuZGxlci5yZXNldF9idWlsZCgpCisgICAgICAgIHNlbGYuaGFuZGxlci5nZW5lcmF0ZV9wYWNrYWdlcyhhbGxfcmVjaXBlcywgc2VsZi5jb25maWd1cmF0aW9uLmRlZmF1bHRfdGFzaykKKworICAgIGRlZiByZXN0b3JlX2luaXRpYWxfc2VsZWN0ZWRfcGFja2FnZXMoc2VsZik6CisgICAgICAgIHNlbGYucGFja2FnZV9tb2RlbC5zZXRfc2VsZWN0ZWRfcGFja2FnZXMoc2VsZi5jb25maWd1cmF0aW9uLmluaXRpYWxfdXNlcl9zZWxlY3RlZF9wYWNrYWdlcywgVHJ1ZSkKKyAgICAgICAgc2VsZi5wYWNrYWdlX21vZGVsLnNldF9zZWxlY3RlZF9wYWNrYWdlcyhzZWxmLmNvbmZpZ3VyYXRpb24uaW5pdGlhbF9zZWxlY3RlZF9wYWNrYWdlcykKKyAgICAgICAgZm9yIHBhY2thZ2UgaW4gc2VsZi5jb25maWd1cmF0aW9uLnNlbGVjdGVkX3BhY2thZ2VzOgorICAgICAgICAgICAgaWYgcGFja2FnZSBub3QgaW4gc2VsZi5jb25maWd1cmF0aW9uLmluaXRpYWxfc2VsZWN0ZWRfcGFja2FnZXM6CisgICAgICAgICAgICAgICAgc2VsZi5wYWNrYWdlX21vZGVsLmV4Y2x1ZGVfaXRlbShzZWxmLnBhY2thZ2VfbW9kZWwuZmluZF9wYXRoX2Zvcl9pdGVtKHBhY2thZ2UpKQorCisgICAgZGVmIGZhc3RfZ2VuZXJhdGVfaW1hZ2VfYXN5bmMoc2VsZiwgbG9nID0gRmFsc2UpOgorICAgICAgICBzZWxmLnN3aXRjaF9wYWdlKHNlbGYuRkFTVF9JTUFHRV9HRU5FUkFUSU5HKQorICAgICAgICBpZiBsb2c6CisgICAgICAgICAgICBzZWxmLmN1cnJlbnRfbG9nZmlsZSA9IHNlbGYuaGFuZGxlci5nZXRfbG9nZmlsZSgpCisgICAgICAgICAgICBzZWxmLmRvX2xvZyhzZWxmLmN1cnJlbnRfbG9nZmlsZSkKKyAgICAgICAgIyBCdWlsZCBwYWNrYWdlcworICAgICAgICBfLCBhbGxfcmVjaXBlcyA9IHNlbGYucmVjaXBlX21vZGVsLmdldF9zZWxlY3RlZF9yZWNpcGVzKCkKKyAgICAgICAgc2VsZi5zZXRfdXNlcl9jb25maWcoKQorICAgICAgICBzZWxmLmhhbmRsZXIucmVzZXRfYnVpbGQoKQorICAgICAgICBzZWxmLmhhbmRsZXIuZ2VuZXJhdGVfcGFja2FnZXMoYWxsX3JlY2lwZXMsIHNlbGYuY29uZmlndXJhdGlvbi5kZWZhdWx0X3Rhc2spCisKKyAgICBkZWYgZ2VuZXJhdGVfaW1hZ2VfYXN5bmMoc2VsZiwgY29udCA9IEZhbHNlKToKKyAgICAgICAgc2VsZi5zd2l0Y2hfcGFnZShzZWxmLklNQUdFX0dFTkVSQVRJTkcpCisgICAgICAgIHNlbGYuaGFuZGxlci5yZXNldF9idWlsZCgpCisgICAgICAgIGlmIG5vdCBjb250OgorICAgICAgICAgICAgc2VsZi5jdXJyZW50X2xvZ2ZpbGUgPSBzZWxmLmhhbmRsZXIuZ2V0X2xvZ2ZpbGUoKQorICAgICAgICAgICAgc2VsZi5kb19sb2coc2VsZi5jdXJyZW50X2xvZ2ZpbGUpCisgICAgICAgICMgQnVpbGQgaW1hZ2UKKyAgICAgICAgc2VsZi5zZXRfdXNlcl9jb25maWcoKQorICAgICAgICB0b29sY2hhaW5fcGFja2FnZXMgPSBbXQorICAgICAgICBiYXNlX2ltYWdlID0gTm9uZQorICAgICAgICBpZiBzZWxmLmNvbmZpZ3VyYXRpb24udG9vbGNoYWluX2J1aWxkOgorICAgICAgICAgICAgdG9vbGNoYWluX3BhY2thZ2VzID0gc2VsZi5wYWNrYWdlX21vZGVsLmdldF9zZWxlY3RlZF9wYWNrYWdlc190b29sY2hhaW4oKQorICAgICAgICBpZiBzZWxmLmNvbmZpZ3VyYXRpb24uc2VsZWN0ZWRfaW1hZ2UgPT0gc2VsZi5yZWNpcGVfbW9kZWwuX19jdXN0b21faW1hZ2VfXzoKKyAgICAgICAgICAgIHBhY2thZ2VzID0gc2VsZi5wYWNrYWdlX21vZGVsLmdldF9zZWxlY3RlZF9wYWNrYWdlcygpCisgICAgICAgICAgICBpbWFnZSA9IHNlbGYuaG9iX2ltYWdlCisgICAgICAgICAgICBiYXNlX2ltYWdlID0gc2VsZi5jb25maWd1cmF0aW9uLmluaXRpYWxfc2VsZWN0ZWRfaW1hZ2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhY2thZ2VzID0gW10KKyAgICAgICAgICAgIGltYWdlID0gc2VsZi5jb25maWd1cmF0aW9uLnNlbGVjdGVkX2ltYWdlCisgICAgICAgIHNlbGYuaGFuZGxlci5nZW5lcmF0ZV9pbWFnZShpbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VfaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xjaGFpbl9wYWNrYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi5kZWZhdWx0X3Rhc2spCisKKyAgICBkZWYgZ2VuZXJhdGVfbmV3X2ltYWdlKHNlbGYsIGltYWdlLCBkZXNjcmlwdGlvbik6CisgICAgICAgIGJhc2VfaW1hZ2UgPSBzZWxmLmNvbmZpZ3VyYXRpb24uaW5pdGlhbF9zZWxlY3RlZF9pbWFnZQorICAgICAgICBpZiBiYXNlX2ltYWdlID09IHNlbGYucmVjaXBlX21vZGVsLl9fY3VzdG9tX2ltYWdlX186CisgICAgICAgICAgICBiYXNlX2ltYWdlID0gTm9uZQorICAgICAgICBwYWNrYWdlcyA9IHNlbGYucGFja2FnZV9tb2RlbC5nZXRfc2VsZWN0ZWRfcGFja2FnZXMoKQorICAgICAgICBzZWxmLmhhbmRsZXIuZ2VuZXJhdGVfbmV3X2ltYWdlKGltYWdlLCBiYXNlX2ltYWdlLCBwYWNrYWdlcywgZGVzY3JpcHRpb24pCisKKyAgICBkZWYgZW5zdXJlX2RpcihzZWxmLCBkaXJlY3RvcnkpOgorICAgICAgICBzZWxmLmhhbmRsZXIuZW5zdXJlX2RpcihkaXJlY3RvcnkpCisKKyAgICBkZWYgZ2V0X3BhcmFtZXRlcnNfc3luYyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaGFuZGxlci5nZXRfcGFyYW1ldGVycygpCisKKyAgICBkZWYgcmVxdWVzdF9wYWNrYWdlX2luZm9fYXN5bmMoc2VsZik6CisgICAgICAgIHNlbGYuaGFuZGxlci5yZXF1ZXN0X3BhY2thZ2VfaW5mbygpCisKKyAgICBkZWYgY2FuY2VsX2J1aWxkX3N5bmMoc2VsZiwgZm9yY2U9RmFsc2UpOgorICAgICAgICBzZWxmLmhhbmRsZXIuY2FuY2VsX2J1aWxkKGZvcmNlKQorCisgICAgZGVmIGNhbmNlbF9wYXJzZV9zeW5jKHNlbGYpOgorICAgICAgICBzZWxmLmhhbmRsZXIuY2FuY2VsX3BhcnNlKCkKKworICAgIGRlZiBzd2l0Y2hfcGFnZShzZWxmLCBuZXh0X3N0ZXApOgorICAgICAgICAjIE1haW4gV29ya2Zsb3cgKEJ1c2luZXNzIExvZ2ljKQorICAgICAgICBzZWxmLm5iLnNldF9jdXJyZW50X3BhZ2Uoc2VsZi5fX3N0ZXAycGFnZV9fW25leHRfc3RlcF0pCisKKyAgICAgICAgaWYgbmV4dF9zdGVwID09IHNlbGYuTUFDSElORV9TRUxFQ1RJT046ICMgaW5pdCBzdGVwCisgICAgICAgICAgICBzZWxmLmltYWdlX2NvbmZpZ3VyYXRpb25fcGFnZS5zaG93X21hY2hpbmUoKQorCisgICAgICAgIGVsaWYgbmV4dF9zdGVwID09IHNlbGYuUkNQUEtHSU5GT19QT1BVTEFUSU5HOgorICAgICAgICAgICAgIyBNQUNISU5FIENIQU5HRUQgYWN0aW9uIG9yIFNFVFRJTkdTIENIQU5HRUQKKyAgICAgICAgICAgICMgc2hvdyB0aGUgcHJvZ3Jlc3MgYmFyCisgICAgICAgICAgICBzZWxmLmltYWdlX2NvbmZpZ3VyYXRpb25fcGFnZS5zaG93X2luZm9fcG9wdWxhdGluZygpCisKKyAgICAgICAgZWxpZiBuZXh0X3N0ZXAgPT0gc2VsZi5SQ1BQS0dJTkZPX1BPUFVMQVRFRDoKKyAgICAgICAgICAgIHNlbGYuaW1hZ2VfY29uZmlndXJhdGlvbl9wYWdlLnNob3dfaW5mb19wb3B1bGF0ZWQoKQorCisgICAgICAgIGVsaWYgbmV4dF9zdGVwID09IHNlbGYuQkFTRUlNR19TRUxFQ1RFRDoKKyAgICAgICAgICAgIHNlbGYuaW1hZ2VfY29uZmlndXJhdGlvbl9wYWdlLnNob3dfYmFzZWltZ19zZWxlY3RlZCgpCisKKyAgICAgICAgZWxpZiBuZXh0X3N0ZXAgPT0gc2VsZi5SRUNJUEVfU0VMRUNUSU9OOgorICAgICAgICAgICAgaWYgc2VsZi5yZWNpcGVfbW9kZWwuZ2V0X3NlbGVjdGVkX2ltYWdlKCkgPT0gc2VsZi5yZWNpcGVfbW9kZWwuX19jdXN0b21faW1hZ2VfXzoKKyAgICAgICAgICAgICAgICBzZWxmLnJlY2lwZV9kZXRhaWxzX3BhZ2Uuc2V0X3JlY2lwZV9jdXJyX3RhYihzZWxmLnJlY2lwZV9kZXRhaWxzX3BhZ2UuQUxMKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnJlY2lwZV9kZXRhaWxzX3BhZ2Uuc2V0X3JlY2lwZV9jdXJyX3RhYihzZWxmLnJlY2lwZV9kZXRhaWxzX3BhZ2UuSU5DTFVERUQpCisKKyAgICAgICAgZWxpZiBuZXh0X3N0ZXAgPT0gc2VsZi5QQUNLQUdFX1NFTEVDVElPTjoKKyAgICAgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi5pbml0aWFsX3NlbGVjdGVkX3BhY2thZ2VzID0gc2VsZi5jb25maWd1cmF0aW9uLnNlbGVjdGVkX3BhY2thZ2VzCisgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uaW5pdGlhbF91c2VyX3NlbGVjdGVkX3BhY2thZ2VzID0gc2VsZi5jb25maWd1cmF0aW9uLnVzZXJfc2VsZWN0ZWRfcGFja2FnZXMKKyAgICAgICAgICAgIHNlbGYucGFja2FnZV9kZXRhaWxzX3BhZ2Uuc2V0X3RpdGxlKCJFZGl0IHBhY2thZ2VzIikKKyAgICAgICAgICAgIGlmIHNlbGYucmVjaXBlX21vZGVsLmdldF9zZWxlY3RlZF9pbWFnZSgpID09IHNlbGYucmVjaXBlX21vZGVsLl9fY3VzdG9tX2ltYWdlX186CisgICAgICAgICAgICAgICAgc2VsZi5wYWNrYWdlX2RldGFpbHNfcGFnZS5zZXRfcGFja2FnZXNfY3Vycl90YWIoc2VsZi5wYWNrYWdlX2RldGFpbHNfcGFnZS5BTEwpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYucGFja2FnZV9kZXRhaWxzX3BhZ2Uuc2V0X3BhY2thZ2VzX2N1cnJfdGFiKHNlbGYucGFja2FnZV9kZXRhaWxzX3BhZ2UuSU5DTFVERUQpCisgICAgICAgICAgICBzZWxmLnBhY2thZ2VfZGV0YWlsc19wYWdlLnNob3dfcGFnZShzZWxmLmN1cnJlbnRfbG9nZmlsZSkKKworCisgICAgICAgIGVsaWYgbmV4dF9zdGVwID09IHNlbGYuUEFDS0FHRV9HRU5FUkFUSU5HIG9yIG5leHRfc3RlcCA9PSBzZWxmLkZBU1RfSU1BR0VfR0VORVJBVElORzoKKyAgICAgICAgICAgICMgYm90aCBQQUNLQUdFX0dFTkVSQVRJTkcgYW5kIEZBU1RfSU1BR0VfR0VORVJBVElORyBzaGFyZSB0aGUgc2FtZSBwYWdlCisgICAgICAgICAgICBzZWxmLmJ1aWxkX2RldGFpbHNfcGFnZS5zaG93X3BhZ2UobmV4dF9zdGVwKQorCisgICAgICAgIGVsaWYgbmV4dF9zdGVwID09IHNlbGYuUEFDS0FHRV9HRU5FUkFURUQ6CisgICAgICAgICAgICBzZWxmLnBhY2thZ2VfZGV0YWlsc19wYWdlLnNldF90aXRsZSgiU3RlcCAyIG9mIDI6IEVkaXQgcGFja2FnZXMiKQorICAgICAgICAgICAgaWYgc2VsZi5yZWNpcGVfbW9kZWwuZ2V0X3NlbGVjdGVkX2ltYWdlKCkgPT0gc2VsZi5yZWNpcGVfbW9kZWwuX19jdXN0b21faW1hZ2VfXzoKKyAgICAgICAgICAgICAgICBzZWxmLnBhY2thZ2VfZGV0YWlsc19wYWdlLnNldF9wYWNrYWdlc19jdXJyX3RhYihzZWxmLnBhY2thZ2VfZGV0YWlsc19wYWdlLkFMTCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5wYWNrYWdlX2RldGFpbHNfcGFnZS5zZXRfcGFja2FnZXNfY3Vycl90YWIoc2VsZi5wYWNrYWdlX2RldGFpbHNfcGFnZS5JTkNMVURFRCkKKyAgICAgICAgICAgIHNlbGYucGFja2FnZV9kZXRhaWxzX3BhZ2Uuc2hvd19wYWdlKHNlbGYuY3VycmVudF9sb2dmaWxlKQorCisgICAgICAgIGVsaWYgbmV4dF9zdGVwID09IHNlbGYuSU1BR0VfR0VORVJBVElORzoKKyAgICAgICAgICAgICMgYWZ0ZXIgcGFja2FnZXMgYXJlIGdlbmVyYXRlZCwgc2VsZWN0ZWRfcGFja2FnZXMgbmVlZCB0bworICAgICAgICAgICAgIyBiZSB1cGRhdGVkIGluIHBhY2thZ2VfbW9kZWwgcGVyIHNlbGVjdGVkX2ltYWdlIGluIHJlY2lwZV9tb2RlbAorICAgICAgICAgICAgc2VsZi5idWlsZF9kZXRhaWxzX3BhZ2Uuc2hvd19wYWdlKG5leHRfc3RlcCkKKworICAgICAgICBlbGlmIG5leHRfc3RlcCA9PSBzZWxmLklNQUdFX0dFTkVSQVRFRDoKKyAgICAgICAgICAgIHNlbGYuaW1hZ2VfZGV0YWlsc19wYWdlLnNob3dfcGFnZShuZXh0X3N0ZXApCisKKyAgICAgICAgZWxpZiBuZXh0X3N0ZXAgPT0gc2VsZi5NWV9JTUFHRV9PUEVORUQ6CisgICAgICAgICAgICBzZWxmLmltYWdlX2RldGFpbHNfcGFnZS5zaG93X3BhZ2UobmV4dF9zdGVwKQorCisgICAgICAgIHNlbGYucHJldmlvdXNfc3RlcCA9IHNlbGYuY3VycmVudF9zdGVwCisgICAgICAgIHNlbGYuY3VycmVudF9zdGVwID0gbmV4dF9zdGVwCisKKyAgICBkZWYgc2V0X3VzZXJfY29uZmlnX3Byb3hpZXMoc2VsZik6CisgICAgICAgIGlmIHNlbGYuY29uZmlndXJhdGlvbi5lbmFibGVfcHJveHkgPT0gVHJ1ZToKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlci5zZXRfaHR0cF9wcm94eShzZWxmLmNvbmZpZ3VyYXRpb24uY29tYmluZV9wcm94eSgiaHR0cCIpKQorICAgICAgICAgICAgc2VsZi5oYW5kbGVyLnNldF9odHRwc19wcm94eShzZWxmLmNvbmZpZ3VyYXRpb24uY29tYmluZV9wcm94eSgiaHR0cHMiKSkKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlci5zZXRfZnRwX3Byb3h5KHNlbGYuY29uZmlndXJhdGlvbi5jb21iaW5lX3Byb3h5KCJmdHAiKSkKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlci5zZXRfc29ja3NfcHJveHkoc2VsZi5jb25maWd1cmF0aW9uLmNvbWJpbmVfcHJveHkoInNvY2tzIikpCisgICAgICAgICAgICBzZWxmLmhhbmRsZXIuc2V0X2N2c19wcm94eShzZWxmLmNvbmZpZ3VyYXRpb24uY29tYmluZV9ob3N0X29ubHkoImN2cyIpLCBzZWxmLmNvbmZpZ3VyYXRpb24uY29tYmluZV9wb3J0X29ubHkoImN2cyIpKQorICAgICAgICBlbGlmIHNlbGYuY29uZmlndXJhdGlvbi5lbmFibGVfcHJveHkgPT0gRmFsc2U6CisgICAgICAgICAgICBzZWxmLmhhbmRsZXIuc2V0X2h0dHBfcHJveHkoIiIpCisgICAgICAgICAgICBzZWxmLmhhbmRsZXIuc2V0X2h0dHBzX3Byb3h5KCIiKQorICAgICAgICAgICAgc2VsZi5oYW5kbGVyLnNldF9mdHBfcHJveHkoIiIpCisgICAgICAgICAgICBzZWxmLmhhbmRsZXIuc2V0X3NvY2tzX3Byb3h5KCIiKQorICAgICAgICAgICAgc2VsZi5oYW5kbGVyLnNldF9jdnNfcHJveHkoIiIsICIiKQorCisgICAgZGVmIHNldF91c2VyX2NvbmZpZ19leHRyYShzZWxmKToKKyAgICAgICAgc2VsZi5oYW5kbGVyLnNldF9yb290ZnNfc2l6ZShzZWxmLmNvbmZpZ3VyYXRpb24uaW1hZ2Vfcm9vdGZzX3NpemUpCisgICAgICAgIHNlbGYuaGFuZGxlci5zZXRfZXh0cmFfc2l6ZShzZWxmLmNvbmZpZ3VyYXRpb24uaW1hZ2VfZXh0cmFfc2l6ZSkKKyAgICAgICAgc2VsZi5oYW5kbGVyLnNldF9pbmNvbXBhdGlibGVfbGljZW5zZShzZWxmLmNvbmZpZ3VyYXRpb24uaW5jb21wYXRfbGljZW5zZSkKKyAgICAgICAgc2VsZi5oYW5kbGVyLnNldF9zZGtfbWFjaGluZShzZWxmLmNvbmZpZ3VyYXRpb24uY3Vycl9zZGtfbWFjaGluZSkKKyAgICAgICAgc2VsZi5oYW5kbGVyLnNldF9pbWFnZV9mc3R5cGVzKHNlbGYuY29uZmlndXJhdGlvbi5pbWFnZV9mc3R5cGVzKQorICAgICAgICBzZWxmLmhhbmRsZXIuc2V0X2V4dHJhX2NvbmZpZyhzZWxmLmNvbmZpZ3VyYXRpb24uZXh0cmFfc2V0dGluZykKKyAgICAgICAgc2VsZi5oYW5kbGVyLnNldF9leHRyYV9pbmhlcml0KCJwYWNrYWdlaW5mbyBpbWFnZV90eXBlcyIpCisgICAgICAgIHNlbGYuc2V0X3VzZXJfY29uZmlnX3Byb3hpZXMoKQorCisgICAgZGVmIHNldF91c2VyX2NvbmZpZyhzZWxmKToKKyAgICAgICAgIyBzZXQgYmIgbGF5ZXJzCisgICAgICAgIHNlbGYuaGFuZGxlci5zZXRfYmJsYXllcnMoc2VsZi5jb25maWd1cmF0aW9uLmxheWVycykKKyAgICAgICAgIyBzZXQgbG9jYWwgY29uZmlndXJhdGlvbgorICAgICAgICBzZWxmLmhhbmRsZXIuc2V0X21hY2hpbmUoc2VsZi5jb25maWd1cmF0aW9uLmN1cnJfbWFjaCkKKyAgICAgICAgc2VsZi5oYW5kbGVyLnNldF9wYWNrYWdlX2Zvcm1hdChzZWxmLmNvbmZpZ3VyYXRpb24uY3Vycl9wYWNrYWdlX2Zvcm1hdCkKKyAgICAgICAgc2VsZi5oYW5kbGVyLnNldF9kaXN0cm8oc2VsZi5jb25maWd1cmF0aW9uLmN1cnJfZGlzdHJvKQorICAgICAgICBzZWxmLmhhbmRsZXIuc2V0X2RsX2RpcihzZWxmLmNvbmZpZ3VyYXRpb24uZGxkaXIpCisgICAgICAgIHNlbGYuaGFuZGxlci5zZXRfc3N0YXRlX2RpcihzZWxmLmNvbmZpZ3VyYXRpb24uc3N0YXRlZGlyKQorICAgICAgICBzZWxmLmhhbmRsZXIuc2V0X3NzdGF0ZV9taXJyb3JzKHNlbGYuY29uZmlndXJhdGlvbi5zc3RhdGVtaXJyb3IpCisgICAgICAgIHNlbGYuaGFuZGxlci5zZXRfcG1ha2Uoc2VsZi5jb25maWd1cmF0aW9uLnBtYWtlKQorICAgICAgICBzZWxmLmhhbmRsZXIuc2V0X2JidGhyZWFkcyhzZWxmLmNvbmZpZ3VyYXRpb24uYmJ0aHJlYWQpCisgICAgICAgIHNlbGYuc2V0X3VzZXJfY29uZmlnX2V4dHJhKCkKKworICAgIGRlZiB1cGRhdGVfcmVjaXBlX21vZGVsKHNlbGYsIHNlbGVjdGVkX2ltYWdlLCBzZWxlY3RlZF9yZWNpcGVzKToKKyAgICAgICAgc2VsZi5yZWNpcGVfbW9kZWwuc2V0X3NlbGVjdGVkX2ltYWdlKHNlbGVjdGVkX2ltYWdlKQorICAgICAgICBzZWxmLnJlY2lwZV9tb2RlbC5zZXRfc2VsZWN0ZWRfcmVjaXBlcyhzZWxlY3RlZF9yZWNpcGVzKQorCisgICAgZGVmIHVwZGF0ZV9wYWNrYWdlX21vZGVsKHNlbGYsIHNlbGVjdGVkX3BhY2thZ2VzLCB1c2VyX3NlbGVjdGVkX3BhY2thZ2VzPU5vbmUpOgorICAgICAgICBpZiB1c2VyX3NlbGVjdGVkX3BhY2thZ2VzOgorICAgICAgICAgICAgbGVmdCA9IHNlbGYucGFja2FnZV9tb2RlbC5zZXRfc2VsZWN0ZWRfcGFja2FnZXModXNlcl9zZWxlY3RlZF9wYWNrYWdlcywgVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi51c2VyX3NlbGVjdGVkX3BhY2thZ2VzICs9IGxlZnQKKyAgICAgICAgbGVmdCA9IHNlbGYucGFja2FnZV9tb2RlbC5zZXRfc2VsZWN0ZWRfcGFja2FnZXMoc2VsZWN0ZWRfcGFja2FnZXMpCisgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi5zZWxlY3RlZF9wYWNrYWdlcyArPSBsZWZ0CisKKyAgICBkZWYgdXBkYXRlX2NvbmZpZ3VyYXRpb25fcGFyYW1ldGVycyhzZWxmLCBwYXJhbXMpOgorICAgICAgICBpZiBwYXJhbXM6CisgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24udXBkYXRlKHBhcmFtcykKKyAgICAgICAgICAgIHNlbGYucGFyYW1ldGVycy51cGRhdGUocGFyYW1zKQorCisgICAgZGVmIHNldF9iYXNlX2ltYWdlKHNlbGYpOgorICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uaW5pdGlhbF9zZWxlY3RlZF9pbWFnZSA9IHNlbGYuY29uZmlndXJhdGlvbi5zZWxlY3RlZF9pbWFnZQorICAgICAgICBpZiBzZWxmLmNvbmZpZ3VyYXRpb24uc2VsZWN0ZWRfaW1hZ2UgIT0gc2VsZi5yZWNpcGVfbW9kZWwuX19jdXN0b21faW1hZ2VfXzoKKyAgICAgICAgICAgIHNlbGYuaG9iX2ltYWdlID0gc2VsZi5jb25maWd1cmF0aW9uLnNlbGVjdGVkX2ltYWdlICsgIi1lZGl0ZWQiCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi5jdXJyX21hY2ggPSAiIgorICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uY2xlYXJfc2VsZWN0aW9uKCkKKyAgICAgICAgc2VsZi5pbWFnZV9jb25maWd1cmF0aW9uX3BhZ2Uuc3dpdGNoX21hY2hpbmVfY29tYm8oKQorICAgICAgICBzZWxmLnN3aXRjaF9wYWdlKHNlbGYuTUFDSElORV9TRUxFQ1RJT04pCisKKyAgICAjIENhbGxiYWNrIEZ1bmN0aW9ucworICAgIGRlZiBoYW5kbGVyX2NvbmZpZ191cGRhdGVkX2NiKHNlbGYsIGhhbmRsZXIsIHdoaWNoLCB2YWx1ZXMpOgorICAgICAgICBpZiB3aGljaCA9PSAiZGlzdHJvIjoKKyAgICAgICAgICAgIHNlbGYucGFyYW1ldGVycy5hbGxfZGlzdHJvcyA9IHZhbHVlcworICAgICAgICBlbGlmIHdoaWNoID09ICJtYWNoaW5lIjoKKyAgICAgICAgICAgIHNlbGYucGFyYW1ldGVycy5hbGxfbWFjaGluZXMgPSB2YWx1ZXMKKyAgICAgICAgICAgIHNlbGYuaW1hZ2VfY29uZmlndXJhdGlvbl9wYWdlLnVwZGF0ZV9tYWNoaW5lX2NvbWJvKCkKKyAgICAgICAgZWxpZiB3aGljaCA9PSAibWFjaGluZS1zZGsiOgorICAgICAgICAgICAgc2VsZi5wYXJhbWV0ZXJzLmFsbF9zZGtfbWFjaGluZXMgPSB2YWx1ZXMKKworICAgIGRlZiBoYW5kbGVyX3BhY2thZ2VfZm9ybWF0c191cGRhdGVkX2NiKHNlbGYsIGhhbmRsZXIsIGZvcm1hdHMpOgorICAgICAgICBzZWxmLnBhcmFtZXRlcnMuYWxsX3BhY2thZ2VfZm9ybWF0cyA9IGZvcm1hdHMKKworICAgIGRlZiBzd2l0Y2hfdG9faW1hZ2VfY29uZmlndXJhdGlvbl9oZWxwZXIoc2VsZik6CisgICAgICAgIHNlbGYuc2FuaXR5X2NoZWNrX3BhZ2Uuc3RvcCgpCisgICAgICAgIHNlbGYuc3dpdGNoX3BhZ2Uoc2VsZi5JTUFHRV9DT05GSUdVUkFUSU9OKQorICAgICAgICBzZWxmLmltYWdlX2NvbmZpZ3VyYXRpb25fcGFnZS5zd2l0Y2hfbWFjaGluZV9jb21ibygpCisKKyAgICBkZWYgc2hvd19uZXR3b3JrX2Vycm9yX2RpYWxvZ19oZWxwZXIoc2VsZik6CisgICAgICAgIHNlbGYuc2FuaXR5X2NoZWNrX3BhZ2Uuc3RvcCgpCisgICAgICAgIHNlbGYuc2hvd19uZXR3b3JrX2Vycm9yX2RpYWxvZygpCisKKyAgICBkZWYgaGFuZGxlcl9jb21tYW5kX3N1Y2NlZWRlZF9jYihzZWxmLCBoYW5kbGVyLCBpbml0Y21kKToKKyAgICAgICAgaWYgaW5pdGNtZCA9PSBzZWxmLmhhbmRsZXIuR0VORVJBVEVfQ09ORklHVVJBVElPTjoKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmNvbmZpZ3VyYXRpb24uY3Vycl9tYWNoOgorICAgICAgICAgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi5jdXJyX21hY2ggPSBzZWxmLmhhbmRsZXIucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIkhPQl9NQUNISU5FIl0pIG9yICIiCisgICAgICAgICAgICBzZWxmLnVwZGF0ZV9jb25maWd1cmF0aW9uX3BhcmFtZXRlcnMoc2VsZi5nZXRfcGFyYW1ldGVyc19zeW5jKCkpCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5zYW5pdHlfY2hlY2tlZDoKKyAgICAgICAgICAgICAgICBzZWxmLnNhbml0eV9jaGVjaygpCisgICAgICAgICAgICAgICAgc2VsZi5zYW5pdHlfY2hlY2tlZCA9IFRydWUKKyAgICAgICAgZWxpZiBpbml0Y21kID09IHNlbGYuaGFuZGxlci5TQU5JVFlfQ0hFQ0s6CisgICAgICAgICAgICBpZiBzZWxmLmhhZF9uZXR3b3JrX2Vycm9yOgorICAgICAgICAgICAgICAgIHNlbGYuaGFkX25ldHdvcmtfZXJyb3IgPSBGYWxzZQorICAgICAgICAgICAgICAgIHNlbGYuZXhlY3V0ZV9hZnRlcl9zYW5pdHlfY2hlY2soc2VsZi5zaG93X25ldHdvcmtfZXJyb3JfZGlhbG9nX2hlbHBlcikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBTd2l0Y2ggdG8gdGhlICdpbWFnZSBjb25maWd1cmF0aW9uJyBwYWdlIG5vdywgYnV0IHdlIG1pZ2h0IG5lZWQKKyAgICAgICAgICAgICAgICAjIHRvIHdhaXQgZm9yIHRoZSBtaW5pbXVtIGRpc3BsYXkgdGltZSBvZiB0aGUgc2FuaXR5IGNoZWNrIHBhZ2UKKyAgICAgICAgICAgICAgICBzZWxmLmV4ZWN1dGVfYWZ0ZXJfc2FuaXR5X2NoZWNrKHNlbGYuc3dpdGNoX3RvX2ltYWdlX2NvbmZpZ3VyYXRpb25faGVscGVyKQorICAgICAgICBlbGlmIGluaXRjbWQgaW4gW3NlbGYuaGFuZGxlci5HRU5FUkFURV9SRUNJUEVTLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlci5HRU5FUkFURV9QQUNLQUdFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZXIuR0VORVJBVEVfSU1BR0VdOgorICAgICAgICAgICAgc2VsZi51cGRhdGVfY29uZmlndXJhdGlvbl9wYXJhbWV0ZXJzKHNlbGYuZ2V0X3BhcmFtZXRlcnNfc3luYygpKQorICAgICAgICAgICAgc2VsZi5yZXF1ZXN0X3BhY2thZ2VfaW5mb19hc3luYygpCisgICAgICAgIGVsaWYgaW5pdGNtZCA9PSBzZWxmLmhhbmRsZXIuUE9QVUxBVEVfUEFDS0FHRUlORk86CisgICAgICAgICAgICBpZiBzZWxmLmN1cnJlbnRfc3RlcCA9PSBzZWxmLlJDUFBLR0lORk9fUE9QVUxBVElORzoKKyAgICAgICAgICAgICAgICBzZWxmLnN3aXRjaF9wYWdlKHNlbGYuUkNQUEtHSU5GT19QT1BVTEFURUQpCisgICAgICAgICAgICAgICAgc2VsZi5yY3Bwa2dsaXN0X3BvcHVsYXRlZCgpCisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgIHNlbGYucmNwcGtnbGlzdF9wb3B1bGF0ZWQoKQorICAgICAgICAgICAgaWYgc2VsZi5jdXJyZW50X3N0ZXAgPT0gc2VsZi5GQVNUX0lNQUdFX0dFTkVSQVRJTkc6CisgICAgICAgICAgICAgICAgc2VsZi5nZW5lcmF0ZV9pbWFnZV9hc3luYyhUcnVlKQorCisgICAgZGVmIHNob3dfZXJyb3JfZGlhbG9nKHNlbGYsIG1zZyk6CisgICAgICAgIGxibCA9ICI8Yj5Ib2IgZm91bmQgYW4gZXJyb3I8L2I+IgorICAgICAgICBkaWFsb2cgPSBDcnVtYnNNZXNzYWdlRGlhbG9nKHNlbGYsIGxibCwgZ3RrLk1FU1NBR0VfRVJST1IsIG1zZykKKyAgICAgICAgYnV0dG9uID0gZGlhbG9nLmFkZF9idXR0b24oIkNsb3NlIiwgZ3RrLlJFU1BPTlNFX09LKQorICAgICAgICBIb2JCdXR0b24uc3R5bGVfYnV0dG9uKGJ1dHRvbikKKyAgICAgICAgcmVzcG9uc2UgPSBkaWFsb2cucnVuKCkKKyAgICAgICAgZGlhbG9nLmRlc3Ryb3koKQorCisgICAgZGVmIHNob3dfd2FybmluZ19kaWFsb2coc2VsZik6CisgICAgICAgIGRpYWxvZyA9IFBhcnNpbmdXYXJuaW5nc0RpYWxvZyh0aXRsZSA9ICJWaWV3IHdhcm5pbmdzIiwKKyAgICAgICAgICAgICAgICB3YXJuaW5ncyA9IHNlbGYucGFyc2luZ193YXJuaW5ncywKKyAgICAgICAgICAgICAgICBwYXJlbnQgPSBOb25lLAorICAgICAgICAgICAgICAgIGZsYWdzID0gZ3RrLkRJQUxPR19ERVNUUk9ZX1dJVEhfUEFSRU5UCisgICAgICAgICAgICAgICAgICAgICAgIHwgZ3RrLkRJQUxPR19OT19TRVBBUkFUT1IpCisgICAgICAgIHJlc3BvbnNlID0gZGlhbG9nLnJ1bigpCisgICAgICAgIGRpYWxvZy5kZXN0cm95KCkKKworICAgIGRlZiBzaG93X25ldHdvcmtfZXJyb3JfZGlhbG9nKHNlbGYpOgorICAgICAgICBsYmwgPSAiPGI+SG9iIGNhbm5vdCBjb25uZWN0IHRvIHRoZSBuZXR3b3JrPC9iPiIKKyAgICAgICAgbXNnID0gbXNnICsgIlBsZWFzZSBjaGVjayB5b3VyIG5ldHdvcmsgY29ubmVjdGlvbi4gSWYgeW91IGFyZSB1c2luZyBhIHByb3h5IHNlcnZlciwgcGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBjb25maWd1cmVkIGNvcnJlY3RseS4iCisgICAgICAgIGRpYWxvZyA9IENydW1ic01lc3NhZ2VEaWFsb2coc2VsZiwgbGJsLCBndGsuTUVTU0FHRV9FUlJPUiwgbXNnKQorICAgICAgICBidXR0b24gPSBkaWFsb2cuYWRkX2J1dHRvbigiQ2xvc2UiLCBndGsuUkVTUE9OU0VfT0spCisgICAgICAgIEhvYkJ1dHRvbi5zdHlsZV9idXR0b24oYnV0dG9uKQorICAgICAgICBidXR0b24gPSBkaWFsb2cuYWRkX2J1dHRvbigiUHJveHkgc2V0dGluZ3MiLCBndGsuUkVTUE9OU0VfQ0FOQ0VMKQorICAgICAgICBIb2JCdXR0b24uc3R5bGVfYnV0dG9uKGJ1dHRvbikKKyAgICAgICAgcmVzID0gZGlhbG9nLnJ1bigpCisgICAgICAgIGRpYWxvZy5kZXN0cm95KCkKKyAgICAgICAgaWYgcmVzID09IGd0ay5SRVNQT05TRV9DQU5DRUw6CisgICAgICAgICAgICByZXMsIHNldHRpbmdzX2NoYW5nZWQgPSBzZWxmLnNob3dfc2ltcGxlX3NldHRpbmdzX2RpYWxvZyhTaW1wbGVTZXR0aW5nc0RpYWxvZy5QUk9YSUVTX1BBR0VfSUQpCisgICAgICAgICAgICBpZiBub3QgcmVzOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgaWYgc2V0dGluZ3NfY2hhbmdlZDoKKyAgICAgICAgICAgICAgICBzZWxmLnJlcGFyc2VfcG9zdF9hZHZfc2V0dGluZ3MoKQorCisgICAgZGVmIGhhbmRsZXJfY29tbWFuZF9mYWlsZWRfY2Ioc2VsZiwgaGFuZGxlciwgbXNnKToKKyAgICAgICAgaWYgbXNnOgorICAgICAgICAgICAgc2VsZi5zaG93X2Vycm9yX2RpYWxvZyhtc2cpCisgICAgICAgIHNlbGYucmVzZXQoKQorCisgICAgZGVmIGhhbmRsZXJfcGFyc2luZ193YXJuaW5nX2NiKHNlbGYsIGhhbmRsZXIsIHdhcm5fbXNnKToKKyAgICAgICAgc2VsZi5wYXJzaW5nX3dhcm5pbmdzLmFwcGVuZCh3YXJuX21zZykKKworICAgIGRlZiBoYW5kbGVyX3Nhbml0eV9mYWlsZWRfY2Ioc2VsZiwgaGFuZGxlciwgbXNnLCBuZXR3b3JrX2Vycm9yKToKKyAgICAgICAgc2VsZi5yZXNldCgpCisgICAgICAgIGlmIG5ldHdvcmtfZXJyb3I6CisgICAgICAgICAgICAjIE1hcmsgdGhpcyBpbiBhbiBpbnRlcm5hbCBmaWVsZC4gVGhlICJuZXR3b3JrIGVycm9yIiBkaWFsb2cgd2lsbCBiZQorICAgICAgICAgICAgIyBzaG93biBsYXRlciwgd2hlbiBhIFNhbml0eUNoZWNrUGFzc2VkIGV2ZW50IHdpbGwgYmUgaGFuZGxlZAorICAgICAgICAgICAgIyAoYXMgc2VudCBieSBzYW5pdHkuYmJjbGFzcykKKyAgICAgICAgICAgIHNlbGYuaGFkX25ldHdvcmtfZXJyb3IgPSBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtc2cgPSBtc2cucmVwbGFjZSgieW91ciBsb2NhbC5jb25mIiwgIlNldHRpbmdzIikKKyAgICAgICAgICAgIHNlbGYuc2hvd19lcnJvcl9kaWFsb2cobXNnKQorICAgICAgICAgICAgc2VsZi5yZXNldCgpCisKKyAgICBkZWYgd2luZG93X3NlbnNpdGl2ZShzZWxmLCBzZW5zaXRpdmUpOgorICAgICAgICBzZWxmLmltYWdlX2NvbmZpZ3VyYXRpb25fcGFnZS5tYWNoaW5lX2NvbWJvLnNldF9zZW5zaXRpdmUoc2Vuc2l0aXZlKQorICAgICAgICBzZWxmLmltYWdlX2NvbmZpZ3VyYXRpb25fcGFnZS5tYWNoaW5lX2NvbWJvLmNoaWxkLnNldF9zZW5zaXRpdmUoc2Vuc2l0aXZlKQorICAgICAgICBzZWxmLmltYWdlX2NvbmZpZ3VyYXRpb25fcGFnZS5pbWFnZV9jb21iby5zZXRfc2Vuc2l0aXZlKHNlbnNpdGl2ZSkKKyAgICAgICAgc2VsZi5pbWFnZV9jb25maWd1cmF0aW9uX3BhZ2UuaW1hZ2VfY29tYm8uY2hpbGQuc2V0X3NlbnNpdGl2ZShzZW5zaXRpdmUpCisgICAgICAgIHNlbGYuaW1hZ2VfY29uZmlndXJhdGlvbl9wYWdlLmxheWVyX2J1dHRvbi5zZXRfc2Vuc2l0aXZlKHNlbnNpdGl2ZSkKKyAgICAgICAgc2VsZi5pbWFnZV9jb25maWd1cmF0aW9uX3BhZ2UubGF5ZXJfaW5mb19pY29uLnNldF9zZW5zaXRpdmUoc2Vuc2l0aXZlKQorICAgICAgICBzZWxmLmltYWdlX2NvbmZpZ3VyYXRpb25fcGFnZS50b29sYmFyLnNldF9zZW5zaXRpdmUoc2Vuc2l0aXZlKQorICAgICAgICBzZWxmLmltYWdlX2NvbmZpZ3VyYXRpb25fcGFnZS52aWV3X2Fkdl9jb25maWd1cmF0aW9uX2J1dHRvbi5zZXRfc2Vuc2l0aXZlKHNlbnNpdGl2ZSkKKyAgICAgICAgc2VsZi5pbWFnZV9jb25maWd1cmF0aW9uX3BhZ2UuY29uZmlnX2J1aWxkX2J1dHRvbi5zZXRfc2Vuc2l0aXZlKHNlbnNpdGl2ZSkKKworICAgICAgICBzZWxmLnJlY2lwZV9kZXRhaWxzX3BhZ2Uuc2V0X3NlbnNpdGl2ZShzZW5zaXRpdmUpCisgICAgICAgIHNlbGYucGFja2FnZV9kZXRhaWxzX3BhZ2Uuc2V0X3NlbnNpdGl2ZShzZW5zaXRpdmUpCisgICAgICAgIHNlbGYuYnVpbGRfZGV0YWlsc19wYWdlLnNldF9zZW5zaXRpdmUoc2Vuc2l0aXZlKQorICAgICAgICBzZWxmLmltYWdlX2RldGFpbHNfcGFnZS5zZXRfc2Vuc2l0aXZlKHNlbnNpdGl2ZSkKKworICAgICAgICBpZiBzZW5zaXRpdmU6CisgICAgICAgICAgICBzZWxmLndpbmRvdy5zZXRfY3Vyc29yKE5vbmUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLndpbmRvdy5zZXRfY3Vyc29yKGd0ay5nZGsuQ3Vyc29yKGd0ay5nZGsuV0FUQ0gpKQorICAgICAgICBzZWxmLnNlbnNpdGl2ZSA9IHNlbnNpdGl2ZQorCisKKyAgICBkZWYgaGFuZGxlcl9nZW5lcmF0aW5nX2RhdGFfY2Ioc2VsZiwgaGFuZGxlcik6CisgICAgICAgIHNlbGYud2luZG93X3NlbnNpdGl2ZShGYWxzZSkKKworICAgIGRlZiBoYW5kbGVyX2RhdGFfZ2VuZXJhdGVkX2NiKHNlbGYsIGhhbmRsZXIpOgorICAgICAgICBzZWxmLndpbmRvd19zZW5zaXRpdmUoVHJ1ZSkKKworICAgIGRlZiByY3Bwa2dsaXN0X3BvcHVsYXRlZChzZWxmKToKKyAgICAgICAgc2VsZWN0ZWRfaW1hZ2UgPSBzZWxmLmNvbmZpZ3VyYXRpb24uc2VsZWN0ZWRfaW1hZ2UKKyAgICAgICAgc2VsZWN0ZWRfcmVjaXBlcyA9IHNlbGYuY29uZmlndXJhdGlvbi5zZWxlY3RlZF9yZWNpcGVzWzpdCisgICAgICAgIHNlbGVjdGVkX3BhY2thZ2VzID0gc2VsZi5jb25maWd1cmF0aW9uLnNlbGVjdGVkX3BhY2thZ2VzWzpdCisgICAgICAgIHVzZXJfc2VsZWN0ZWRfcGFja2FnZXMgPSBzZWxmLmNvbmZpZ3VyYXRpb24udXNlcl9zZWxlY3RlZF9wYWNrYWdlc1s6XQorCisgICAgICAgIHNlbGYuaW1hZ2VfY29uZmlndXJhdGlvbl9wYWdlLnVwZGF0ZV9pbWFnZV9jb21ibyhzZWxmLnJlY2lwZV9tb2RlbCwgc2VsZWN0ZWRfaW1hZ2UpCisgICAgICAgIHNlbGYuaW1hZ2VfY29uZmlndXJhdGlvbl9wYWdlLnVwZGF0ZV9pbWFnZV9kZXNjKCkKKyAgICAgICAgc2VsZi51cGRhdGVfcmVjaXBlX21vZGVsKHNlbGVjdGVkX2ltYWdlLCBzZWxlY3RlZF9yZWNpcGVzKQorICAgICAgICBzZWxmLnVwZGF0ZV9wYWNrYWdlX21vZGVsKHNlbGVjdGVkX3BhY2thZ2VzLCB1c2VyX3NlbGVjdGVkX3BhY2thZ2VzKQorCisgICAgZGVmIHJlY2lwZWxpc3RfY2hhbmdlZF9jYihzZWxmLCByZWNpcGVfbW9kZWwpOgorICAgICAgICBzZWxmLnJlY2lwZV9kZXRhaWxzX3BhZ2UucmVmcmVzaF9zZWxlY3Rpb24oKQorCisgICAgZGVmIHBhY2thZ2VsaXN0X2NoYW5nZWRfY2Ioc2VsZiwgcGFja2FnZV9tb2RlbCk6CisgICAgICAgIHNlbGYucGFja2FnZV9kZXRhaWxzX3BhZ2UucmVmcmVzaF9zZWxlY3Rpb24oKQorCisgICAgZGVmIGhhbmRsZXJfcmVjaXBlX3BvcHVsYXRlZF9jYihzZWxmLCBoYW5kbGVyKToKKyAgICAgICAgc2VsZi5pbWFnZV9jb25maWd1cmF0aW9uX3BhZ2UudXBkYXRlX3Byb2dyZXNzX2JhcigiUG9wdWxhdGluZyByZWNpcGVzIiwgMC45OSkKKworICAgIGRlZiBoYW5kbGVyX3BhY2thZ2VfcG9wdWxhdGVkX2NiKHNlbGYsIGhhbmRsZXIpOgorICAgICAgICBzZWxmLmltYWdlX2NvbmZpZ3VyYXRpb25fcGFnZS51cGRhdGVfcHJvZ3Jlc3NfYmFyKCJQb3B1bGF0aW5nIHBhY2thZ2VzIiwgMS4wKQorCisgICAgZGVmIGhhbmRsZXJfcGFyc2luZ19zdGFydGVkX2NiKHNlbGYsIGhhbmRsZXIsIG1lc3NhZ2UpOgorICAgICAgICBpZiBzZWxmLmN1cnJlbnRfc3RlcCAhPSBzZWxmLlJDUFBLR0lORk9fUE9QVUxBVElORzoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGZyYWN0aW9uID0gMAorICAgICAgICBpZiBtZXNzYWdlWyJldmVudG5hbWUiXSA9PSAiVHJlZURhdGFQcmVwYXJhdGlvblN0YXJ0ZWQiOgorICAgICAgICAgICAgZnJhY3Rpb24gPSAwLjYgKyBmcmFjdGlvbgorICAgICAgICAgICAgc2VsZi5pbWFnZV9jb25maWd1cmF0aW9uX3BhZ2Uuc3RvcF9idXR0b24uc2V0X3NlbnNpdGl2ZShGYWxzZSkKKyAgICAgICAgICAgIHNlbGYuaW1hZ2VfY29uZmlndXJhdGlvbl9wYWdlLnVwZGF0ZV9wcm9ncmVzc19iYXIoIkdlbmVyYXRpbmcgZGVwZW5kZW5jeSB0cmVlIiwgZnJhY3Rpb24pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmltYWdlX2NvbmZpZ3VyYXRpb25fcGFnZS5zdG9wX2J1dHRvbi5zZXRfc2Vuc2l0aXZlKFRydWUpCisgICAgICAgICAgICBzZWxmLmltYWdlX2NvbmZpZ3VyYXRpb25fcGFnZS51cGRhdGVfcHJvZ3Jlc3NfYmFyKG1lc3NhZ2VbInRpdGxlIl0sIGZyYWN0aW9uKQorCisgICAgZGVmIGhhbmRsZXJfcGFyc2luZ19jYihzZWxmLCBoYW5kbGVyLCBtZXNzYWdlKToKKyAgICAgICAgaWYgc2VsZi5jdXJyZW50X3N0ZXAgIT0gc2VsZi5SQ1BQS0dJTkZPX1BPUFVMQVRJTkc6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBmcmFjdGlvbiA9IG1lc3NhZ2VbImN1cnJlbnQiXSAqIDEuMC9tZXNzYWdlWyJ0b3RhbCJdCisgICAgICAgIGlmIG1lc3NhZ2VbImV2ZW50bmFtZSJdID09ICJUcmVlRGF0YVByZXBhcmF0aW9uUHJvZ3Jlc3MiOgorICAgICAgICAgICAgZnJhY3Rpb24gPSAwLjYgKyAwLjM4ICogZnJhY3Rpb24KKyAgICAgICAgICAgIHNlbGYuaW1hZ2VfY29uZmlndXJhdGlvbl9wYWdlLnVwZGF0ZV9wcm9ncmVzc19iYXIoIkdlbmVyYXRpbmcgZGVwZW5kZW5jeSB0cmVlIiwgZnJhY3Rpb24pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmcmFjdGlvbiA9IDAuNiAqIGZyYWN0aW9uCisgICAgICAgICAgICBzZWxmLmltYWdlX2NvbmZpZ3VyYXRpb25fcGFnZS51cGRhdGVfcHJvZ3Jlc3NfYmFyKG1lc3NhZ2VbInRpdGxlIl0sIGZyYWN0aW9uKQorCisgICAgZGVmIGhhbmRsZXJfcGFyc2luZ19jb21wbGV0ZWRfY2Ioc2VsZiwgaGFuZGxlciwgbWVzc2FnZSk6CisgICAgICAgIGlmIHNlbGYuY3VycmVudF9zdGVwICE9IHNlbGYuUkNQUEtHSU5GT19QT1BVTEFUSU5HOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgbWVzc2FnZVsiZXZlbnRuYW1lIl0gPT0gIlRyZWVEYXRhUHJlcGFyYXRpb25Db21wbGV0ZWQiOgorICAgICAgICAgICAgZnJhY3Rpb24gPSAwLjk4CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmcmFjdGlvbiA9IDAuNgorICAgICAgICBzZWxmLmltYWdlX2NvbmZpZ3VyYXRpb25fcGFnZS51cGRhdGVfcHJvZ3Jlc3NfYmFyKCJHZW5lcmF0aW5nIGRlcGVuZGVuY3kgdHJlZSIsIGZyYWN0aW9uKQorCisgICAgZGVmIGhhbmRsZXJfYnVpbGRfc3RhcnRlZF9jYihzZWxmLCBydW5uaW5nX2J1aWxkKToKKyAgICAgICAgaWYgc2VsZi5jdXJyZW50X3N0ZXAgPT0gc2VsZi5GQVNUX0lNQUdFX0dFTkVSQVRJTkc6CisgICAgICAgICAgICBmcmFjdGlvbiA9IDAKKyAgICAgICAgZWxpZiBzZWxmLmN1cnJlbnRfc3RlcCA9PSBzZWxmLklNQUdFX0dFTkVSQVRJTkc6CisgICAgICAgICAgICBpZiBzZWxmLnByZXZpb3VzX3N0ZXAgPT0gc2VsZi5GQVNUX0lNQUdFX0dFTkVSQVRJTkc6CisgICAgICAgICAgICAgICAgZnJhY3Rpb24gPSAwLjkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZnJhY3Rpb24gPSAwCisgICAgICAgIGVsaWYgc2VsZi5jdXJyZW50X3N0ZXAgPT0gc2VsZi5QQUNLQUdFX0dFTkVSQVRJTkc6CisgICAgICAgICAgICBmcmFjdGlvbiA9IDAKKyAgICAgICAgc2VsZi5idWlsZF9kZXRhaWxzX3BhZ2UudXBkYXRlX3Byb2dyZXNzX2JhcigiQnVpbGQgU3RhcnRlZDogIiwgZnJhY3Rpb24pCisgICAgICAgIHNlbGYuYnVpbGRfZGV0YWlsc19wYWdlLnNob3dfY29uZmlndXJhdGlvbnMoc2VsZi5jb25maWd1cmF0aW9uLCBzZWxmLnBhcmFtZXRlcnMpCisKKyAgICBkZWYgYnVpbGRfc3VjY2VlZGVkKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmN1cnJlbnRfc3RlcCA9PSBzZWxmLkZBU1RfSU1BR0VfR0VORVJBVElORzoKKyAgICAgICAgICAgIGZyYWN0aW9uID0gMC45CisgICAgICAgIGVsaWYgc2VsZi5jdXJyZW50X3N0ZXAgPT0gc2VsZi5JTUFHRV9HRU5FUkFUSU5HOgorICAgICAgICAgICAgZnJhY3Rpb24gPSAxLjAKKyAgICAgICAgICAgIHZlcnNpb24gPSAiIgorICAgICAgICAgICAgc2VsZi5wYXJhbWV0ZXJzLmltYWdlX25hbWVzID0gW10KKyAgICAgICAgICAgIHNlbGVjdGVkX2ltYWdlID0gc2VsZi5yZWNpcGVfbW9kZWwuZ2V0X3NlbGVjdGVkX2ltYWdlKCkKKyAgICAgICAgICAgIGlmIHNlbGVjdGVkX2ltYWdlID09IHNlbGYucmVjaXBlX21vZGVsLl9fY3VzdG9tX2ltYWdlX186CisgICAgICAgICAgICAgICAgaWYgc2VsZi5jb25maWd1cmF0aW9uLmluaXRpYWxfc2VsZWN0ZWRfaW1hZ2UgIT0gc2VsZWN0ZWRfaW1hZ2U6CisgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gPSBzZWxmLnJlY2lwZV9tb2RlbC5nZXRfY3VzdG9tX2ltYWdlX3ZlcnNpb24oKQorICAgICAgICAgICAgICAgIGxpbmtuYW1lID0gc2VsZi5ob2JfaW1hZ2UgKyB2ZXJzaW9uICsgIi0iICsgc2VsZi5jb25maWd1cmF0aW9uLmN1cnJfbWFjaAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBsaW5rbmFtZSA9IHNlbGVjdGVkX2ltYWdlICsgJy0nICsgc2VsZi5jb25maWd1cmF0aW9uLmN1cnJfbWFjaAorICAgICAgICAgICAgaW1hZ2VfZXh0ZW5zaW9uID0gc2VsZi5nZXRfaW1hZ2VfZXh0ZW5zaW9uKCkKKyAgICAgICAgICAgIGZvciBpbWFnZV90eXBlIGluIHNlbGYucGFyYW1ldGVycy5pbWFnZV90eXBlczoKKyAgICAgICAgICAgICAgICBpZiBpbWFnZV90eXBlIGluIGltYWdlX2V4dGVuc2lvbjoKKyAgICAgICAgICAgICAgICAgICAgcmVhbF90eXBlcyA9IGltYWdlX2V4dGVuc2lvbltpbWFnZV90eXBlXQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJlYWxfdHlwZXMgPSBbaW1hZ2VfdHlwZV0KKyAgICAgICAgICAgICAgICBmb3IgcmVhbF9pbWFnZV90eXBlIGluIHJlYWxfdHlwZXM6CisgICAgICAgICAgICAgICAgICAgIGxpbmtwYXRoID0gc2VsZi5wYXJhbWV0ZXJzLmltYWdlX2FkZHIgKyAnLycgKyBsaW5rbmFtZSArICcuJyArIHJlYWxfaW1hZ2VfdHlwZQorICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhsaW5rcGF0aCk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcmFtZXRlcnMuaW1hZ2VfbmFtZXMuYXBwZW5kKG9zLnJlYWRsaW5rKGxpbmtwYXRoKSkKKyAgICAgICAgZWxpZiBzZWxmLmN1cnJlbnRfc3RlcCA9PSBzZWxmLlBBQ0tBR0VfR0VORVJBVElORzoKKyAgICAgICAgICAgIGZyYWN0aW9uID0gMS4wCisgICAgICAgIHNlbGYuYnVpbGRfZGV0YWlsc19wYWdlLnVwZGF0ZV9wcm9ncmVzc19iYXIoIkJ1aWxkIENvbXBsZXRlZDogIiwgZnJhY3Rpb24pCisgICAgICAgIHNlbGYuaGFuZGxlci5idWlsZF9zdWNjZWVkZWRfYXN5bmMoKQorICAgICAgICBzZWxmLnN0b3BwaW5nID0gRmFsc2UKKworICAgICAgICBpZiBzZWxmLmN1cnJlbnRfc3RlcCA9PSBzZWxmLlBBQ0tBR0VfR0VORVJBVElORzoKKyAgICAgICAgICAgIHNlbGYuc3dpdGNoX3BhZ2Uoc2VsZi5QQUNLQUdFX0dFTkVSQVRFRCkKKyAgICAgICAgZWxpZiBzZWxmLmN1cnJlbnRfc3RlcCA9PSBzZWxmLklNQUdFX0dFTkVSQVRJTkc6CisgICAgICAgICAgICBzZWxmLnN3aXRjaF9wYWdlKHNlbGYuSU1BR0VfR0VORVJBVEVEKQorCisgICAgZGVmIGJ1aWxkX2ZhaWxlZChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5zdG9wcGluZzoKKyAgICAgICAgICAgIHN0YXR1cyA9ICJzdG9wIgorICAgICAgICAgICAgbWVzc2FnZSA9ICJCdWlsZCBzdG9wcGVkOiAiCisgICAgICAgICAgICBmcmFjdGlvbiA9IHNlbGYuYnVpbGRfZGV0YWlsc19wYWdlLnByb2dyZXNzX2Jhci5nZXRfZnJhY3Rpb24oKQorICAgICAgICAgICAgc3RvcF90b19uZXh0X2VkaXQgPSAiIgorICAgICAgICAgICAgaWYgc2VsZi5jdXJyZW50X3N0ZXAgPT0gc2VsZi5GQVNUX0lNQUdFX0dFTkVSQVRJTkc6CisgICAgICAgICAgICAgICAgc3RvcF90b19uZXh0X2VkaXQgPSAiaW1hZ2UgY29uZmlndXJhdGlvbiIKKyAgICAgICAgICAgIGVsaWYgc2VsZi5jdXJyZW50X3N0ZXAgPT0gc2VsZi5JTUFHRV9HRU5FUkFUSU5HOgorICAgICAgICAgICAgICAgIGlmIHNlbGYucHJldmlvdXNfc3RlcCA9PSBzZWxmLkZBU1RfSU1BR0VfR0VORVJBVElORzoKKyAgICAgICAgICAgICAgICAgICAgc3RvcF90b19uZXh0X2VkaXQgPSAiaW1hZ2UgY29uZmlndXJhdGlvbiIKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzdG9wX3RvX25leHRfZWRpdCA9ICJwYWNrYWdlcyIKKyAgICAgICAgICAgIGVsaWYgc2VsZi5jdXJyZW50X3N0ZXAgPT0gc2VsZi5QQUNLQUdFX0dFTkVSQVRJTkc6CisgICAgICAgICAgICAgICAgc3RvcF90b19uZXh0X2VkaXQgPSAicmVjaXBlcyIKKyAgICAgICAgICAgIGJ1dHRvbiA9IHNlbGYuYnVpbGRfZGV0YWlsc19wYWdlLnNob3dfc3RvcF9wYWdlKHN0b3BfdG9fbmV4dF9lZGl0LnNwbGl0KCcgJylbMF0pCisgICAgICAgICAgICBzZWxmLnNldF9kZWZhdWx0KGJ1dHRvbikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZhaWxfdG9fbmV4dF9lZGl0ID0gIiIKKyAgICAgICAgICAgIGlmIHNlbGYuY3VycmVudF9zdGVwID09IHNlbGYuRkFTVF9JTUFHRV9HRU5FUkFUSU5HOgorICAgICAgICAgICAgICAgIGZhaWxfdG9fbmV4dF9lZGl0ID0gImltYWdlIGNvbmZpZ3VyYXRpb24iCisgICAgICAgICAgICAgICAgZnJhY3Rpb24gPSAwLjkKKyAgICAgICAgICAgIGVsaWYgc2VsZi5jdXJyZW50X3N0ZXAgPT0gc2VsZi5JTUFHRV9HRU5FUkFUSU5HOgorICAgICAgICAgICAgICAgIGlmIHNlbGYucHJldmlvdXNfc3RlcCA9PSBzZWxmLkZBU1RfSU1BR0VfR0VORVJBVElORzoKKyAgICAgICAgICAgICAgICAgICAgZmFpbF90b19uZXh0X2VkaXQgPSAiaW1hZ2UgY29uZmlndXJhdGlvbiIKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBmYWlsX3RvX25leHRfZWRpdCA9ICJwYWNrYWdlcyIKKyAgICAgICAgICAgICAgICBmcmFjdGlvbiA9IDEuMAorICAgICAgICAgICAgZWxpZiBzZWxmLmN1cnJlbnRfc3RlcCA9PSBzZWxmLlBBQ0tBR0VfR0VORVJBVElORzoKKyAgICAgICAgICAgICAgICBmYWlsX3RvX25leHRfZWRpdCA9ICJyZWNpcGVzIgorICAgICAgICAgICAgICAgIGZyYWN0aW9uID0gMS4wCisgICAgICAgICAgICBzZWxmLmJ1aWxkX2RldGFpbHNfcGFnZS5zaG93X2ZhaWxfcGFnZShmYWlsX3RvX25leHRfZWRpdC5zcGxpdCgnICcpWzBdKQorICAgICAgICAgICAgc3RhdHVzID0gImZhaWwiCisgICAgICAgICAgICBtZXNzYWdlID0gIkJ1aWxkIGZhaWxlZDogIgorICAgICAgICBzZWxmLmJ1aWxkX2RldGFpbHNfcGFnZS51cGRhdGVfcHJvZ3Jlc3NfYmFyKG1lc3NhZ2UsIGZyYWN0aW9uLCBzdGF0dXMpCisgICAgICAgIHNlbGYuYnVpbGRfZGV0YWlsc19wYWdlLnNob3dfYmFja19idXR0b24oKQorICAgICAgICBzZWxmLmJ1aWxkX2RldGFpbHNfcGFnZS5oaWRlX3N0b3BfYnV0dG9uKCkKKyAgICAgICAgc2VsZi5oYW5kbGVyLmJ1aWxkX2ZhaWxlZF9hc3luYygpCisgICAgICAgIHNlbGYuc3RvcHBpbmcgPSBGYWxzZQorCisgICAgZGVmIGhhbmRsZXJfYnVpbGRfc3VjY2VlZGVkX2NiKHNlbGYsIHJ1bm5pbmdfYnVpbGQpOgorICAgICAgICBpZiBub3Qgc2VsZi5zdG9wcGluZzoKKyAgICAgICAgICAgIHNlbGYuYnVpbGRfc3VjY2VlZGVkKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYnVpbGRfZmFpbGVkKCkKKworCisgICAgZGVmIGhhbmRsZXJfYnVpbGRfZmFpbGVkX2NiKHNlbGYsIHJ1bm5pbmdfYnVpbGQpOgorICAgICAgICBzZWxmLmJ1aWxkX2ZhaWxlZCgpCisKKyAgICBkZWYgaGFuZGxlcl9idWlsZF9hYm9ydGVkX2NiKHNlbGYsIHJ1bm5pbmdfYnVpbGQpOgorICAgICAgICBzZWxmLmJ1aWxkX2ZhaWxlZCgpCisKKyAgICBkZWYgaGFuZGxlcl9ub19wcm92aWRlcl9jYihzZWxmLCBydW5uaW5nX2J1aWxkLCBtc2cpOgorICAgICAgICBkaWFsb2cgPSBDcnVtYnNNZXNzYWdlRGlhbG9nKHNlbGYsIGdsaWIubWFya3VwX2VzY2FwZV90ZXh0KG1zZyksIGd0ay5NRVNTQUdFX0lORk8pCisgICAgICAgIGJ1dHRvbiA9IGRpYWxvZy5hZGRfYnV0dG9uKCJDbG9zZSIsIGd0ay5SRVNQT05TRV9PSykKKyAgICAgICAgSG9iQnV0dG9uLnN0eWxlX2J1dHRvbihidXR0b24pCisgICAgICAgIGRpYWxvZy5ydW4oKQorICAgICAgICBkaWFsb2cuZGVzdHJveSgpCisgICAgICAgIHNlbGYuYnVpbGRfZmFpbGVkKCkKKworICAgIGRlZiBoYW5kbGVyX3Rhc2tfc3RhcnRlZF9jYihzZWxmLCBydW5uaW5nX2J1aWxkLCBtZXNzYWdlKTogCisgICAgICAgIGZyYWN0aW9uID0gbWVzc2FnZVsiY3VycmVudCJdICogMS4wL21lc3NhZ2VbInRvdGFsIl0KKyAgICAgICAgdGl0bGUgPSAiQnVpbGQgcGFja2FnZXMiCisgICAgICAgIGlmIHNlbGYuY3VycmVudF9zdGVwID09IHNlbGYuRkFTVF9JTUFHRV9HRU5FUkFUSU5HOgorICAgICAgICAgICAgaWYgbWVzc2FnZVsiZXZlbnRuYW1lIl0gPT0gInNjZW5lUXVldWVUYXNrU3RhcnRlZCI6CisgICAgICAgICAgICAgICAgZnJhY3Rpb24gPSAwLjI3ICogZnJhY3Rpb24KKyAgICAgICAgICAgIGVsaWYgbWVzc2FnZVsiZXZlbnRuYW1lIl0gPT0gInJ1blF1ZXVlVGFza1N0YXJ0ZWQiOgorICAgICAgICAgICAgICAgIGZyYWN0aW9uID0gMC4yNyArIDAuNjMgKiBmcmFjdGlvbgorICAgICAgICBlbGlmIHNlbGYuY3VycmVudF9zdGVwID09IHNlbGYuSU1BR0VfR0VORVJBVElORzoKKyAgICAgICAgICAgIHRpdGxlID0gIkJ1aWxkIGltYWdlIgorICAgICAgICAgICAgaWYgc2VsZi5wcmV2aW91c19zdGVwID09IHNlbGYuRkFTVF9JTUFHRV9HRU5FUkFUSU5HOgorICAgICAgICAgICAgICAgIGlmIG1lc3NhZ2VbImV2ZW50bmFtZSJdID09ICJzY2VuZVF1ZXVlVGFza1N0YXJ0ZWQiOgorICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbiA9IDAuMjcgKyAwLjYzICsgMC4wMyAqIGZyYWN0aW9uCisgICAgICAgICAgICAgICAgZWxpZiBtZXNzYWdlWyJldmVudG5hbWUiXSA9PSAicnVuUXVldWVUYXNrU3RhcnRlZCI6CisgICAgICAgICAgICAgICAgICAgIGZyYWN0aW9uID0gMC4yNyArIDAuNjMgKyAwLjAzICsgMC4wNyAqIGZyYWN0aW9uCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIG1lc3NhZ2VbImV2ZW50bmFtZSJdID09ICJzY2VuZVF1ZXVlVGFza1N0YXJ0ZWQiOgorICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbiA9IDAuMiAqIGZyYWN0aW9uCisgICAgICAgICAgICAgICAgZWxpZiBtZXNzYWdlWyJldmVudG5hbWUiXSA9PSAicnVuUXVldWVUYXNrU3RhcnRlZCI6CisgICAgICAgICAgICAgICAgICAgIGZyYWN0aW9uID0gMC4yICsgMC44ICogZnJhY3Rpb24KKyAgICAgICAgZWxpZiBzZWxmLmN1cnJlbnRfc3RlcCA9PSBzZWxmLlBBQ0tBR0VfR0VORVJBVElORzoKKyAgICAgICAgICAgIGlmIG1lc3NhZ2VbImV2ZW50bmFtZSJdID09ICJzY2VuZVF1ZXVlVGFza1N0YXJ0ZWQiOgorICAgICAgICAgICAgICAgIGZyYWN0aW9uID0gMC4yICogZnJhY3Rpb24KKyAgICAgICAgICAgIGVsaWYgbWVzc2FnZVsiZXZlbnRuYW1lIl0gPT0gInJ1blF1ZXVlVGFza1N0YXJ0ZWQiOgorICAgICAgICAgICAgICAgIGZyYWN0aW9uID0gMC4yICsgMC44ICogZnJhY3Rpb24KKyAgICAgICAgc2VsZi5idWlsZF9kZXRhaWxzX3BhZ2UudXBkYXRlX3Byb2dyZXNzX2Jhcih0aXRsZSArICI6ICIsIGZyYWN0aW9uKQorICAgICAgICBzZWxmLmJ1aWxkX2RldGFpbHNfcGFnZS51cGRhdGVfYnVpbGRfc3RhdHVzKG1lc3NhZ2VbImN1cnJlbnQiXSwgbWVzc2FnZVsidG90YWwiXSwgbWVzc2FnZVsidGFzayJdKQorCisgICAgZGVmIGhhbmRsZXJfZGlza19mdWxsX2NiKHNlbGYsIHJ1bm5pbmdfYnVpbGQpOgorICAgICAgICBzZWxmLmRpc2tfZnVsbCA9IFRydWUKKworICAgIGRlZiBoYW5kbGVyX2J1aWxkX2ZhaWx1cmVfY2Ioc2VsZiwgcnVubmluZ19idWlsZCk6CisgICAgICAgIHNlbGYuYnVpbGRfZGV0YWlsc19wYWdlLnNob3dfaXNzdWVzKCkKKworICAgIGRlZiBoYW5kbGVyX2J1aWxkX2xvZ19jYihzZWxmLCBydW5uaW5nX2J1aWxkLCBmdW5jLCBvYmopOgorICAgICAgICBpZiBoYXNhdHRyKHNlbGYubG9nZ2VyLCBmdW5jKToKKyAgICAgICAgICAgIGdldGF0dHIoc2VsZi5sb2dnZXIsIGZ1bmMpKG9iaikKKworICAgIGRlZiBkZXN0cm95X3dpbmRvd19jYihzZWxmLCB3aWRnZXQsIGV2ZW50KToKKyAgICAgICAgaWYgbm90IHNlbGYuc2Vuc2l0aXZlOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgZWxpZiBzZWxmLmhhbmRsZXIuYnVpbGRpbmc6CisgICAgICAgICAgICBzZWxmLnN0b3BfYnVpbGQoKQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGd0ay5tYWluX3F1aXQoKQorCisgICAgZGVmIGV2ZW50X2hhbmRsZV9TSUdJTlQoc2VsZiwgc2lnbmFsLCBmcmFtZSk6CisgICAgICAgIGZvciB3IGluIGd0ay53aW5kb3dfbGlzdF90b3BsZXZlbHMoKToKKyAgICAgICAgICAgIGlmIHcuZ2V0X21vZGFsKCk6CisgICAgICAgICAgICAgICAgdy5yZXNwb25zZShndGsuUkVTUE9OU0VfREVMRVRFX0VWRU5UKQorICAgICAgICBzeXMuZXhpdCgwKQorCisgICAgZGVmIGJ1aWxkX3BhY2thZ2VzKHNlbGYpOgorICAgICAgICBfLCBhbGxfcmVjaXBlcyA9IHNlbGYucmVjaXBlX21vZGVsLmdldF9zZWxlY3RlZF9yZWNpcGVzKCkKKyAgICAgICAgaWYgbm90IGFsbF9yZWNpcGVzOgorICAgICAgICAgICAgbGJsID0gIjxiPk5vIHNlbGVjdGlvbnMgbWFkZTwvYj4iCisgICAgICAgICAgICBtc2cgPSAiWW91IGhhdmUgbm90IG1hZGUgYW55IHNlbGVjdGlvbnMiCisgICAgICAgICAgICBtc2cgPSBtc2cgKyAiIHNvIHRoZXJlIGlzbid0IGFueXRoaW5nIHRvIGJha2UgYXQgdGhpcyB0aW1lLiIKKyAgICAgICAgICAgIGRpYWxvZyA9IENydW1ic01lc3NhZ2VEaWFsb2coc2VsZiwgbGJsLCBndGsuTUVTU0FHRV9JTkZPLCBtc2cpCisgICAgICAgICAgICBidXR0b24gPSBkaWFsb2cuYWRkX2J1dHRvbigiQ2xvc2UiLCBndGsuUkVTUE9OU0VfT0spCisgICAgICAgICAgICBIb2JCdXR0b24uc3R5bGVfYnV0dG9uKGJ1dHRvbikKKyAgICAgICAgICAgIGRpYWxvZy5ydW4oKQorICAgICAgICAgICAgZGlhbG9nLmRlc3Ryb3koKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuZ2VuZXJhdGVfcGFja2FnZXNfYXN5bmMoVHJ1ZSkKKworICAgIGRlZiBidWlsZF9pbWFnZShzZWxmKToKKyAgICAgICAgc2VsZWN0ZWRfcGFja2FnZXMgPSBzZWxmLnBhY2thZ2VfbW9kZWwuZ2V0X3NlbGVjdGVkX3BhY2thZ2VzKCkKKyAgICAgICAgaWYgbm90IHNlbGVjdGVkX3BhY2thZ2VzOiAgICAgIAorICAgICAgICAgICAgbGJsID0gIjxiPk5vIHNlbGVjdGlvbnMgbWFkZTwvYj4iCisgICAgICAgICAgICBtc2cgPSAiWW91IGhhdmUgbm90IG1hZGUgYW55IHNlbGVjdGlvbnMiCisgICAgICAgICAgICBtc2cgPSBtc2cgKyAiIHNvIHRoZXJlIGlzbid0IGFueXRoaW5nIHRvIGJha2UgYXQgdGhpcyB0aW1lLiIKKyAgICAgICAgICAgIGRpYWxvZyA9IENydW1ic01lc3NhZ2VEaWFsb2coc2VsZiwgbGJsLCBndGsuTUVTU0FHRV9JTkZPLCBtc2cpCisgICAgICAgICAgICBidXR0b24gPSBkaWFsb2cuYWRkX2J1dHRvbigiQ2xvc2UiLCBndGsuUkVTUE9OU0VfT0spCisgICAgICAgICAgICBIb2JCdXR0b24uc3R5bGVfYnV0dG9uKGJ1dHRvbikKKyAgICAgICAgICAgIGRpYWxvZy5ydW4oKQorICAgICAgICAgICAgZGlhbG9nLmRlc3Ryb3koKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuZ2VuZXJhdGVfaW1hZ2VfYXN5bmMoVHJ1ZSkKKworICAgIGRlZiBqdXN0X2Jha2Uoc2VsZik6CisgICAgICAgIHNlbGVjdGVkX2ltYWdlID0gc2VsZi5yZWNpcGVfbW9kZWwuZ2V0X3NlbGVjdGVkX2ltYWdlKCkKKyAgICAgICAgc2VsZWN0ZWRfcGFja2FnZXMgPSBzZWxmLnBhY2thZ2VfbW9kZWwuZ2V0X3NlbGVjdGVkX3BhY2thZ2VzKCkgb3IgW10KKworICAgICAgICAjIElmIG5vIGJhc2UgaW1hZ2UgYW5kIG5vIHNlbGVjdGVkIHBhY2thZ2VzIGRvbid0IGJ1aWxkIGFueXRoaW5nCisgICAgICAgIGlmIG5vdCAoc2VsZWN0ZWRfcGFja2FnZXMgb3Igc2VsZWN0ZWRfaW1hZ2UgIT0gc2VsZi5yZWNpcGVfbW9kZWwuX19jdXN0b21faW1hZ2VfXyk6CisgICAgICAgICAgICBsYmwgPSAiPGI+Tm8gc2VsZWN0aW9ucyBtYWRlPC9iPiIKKyAgICAgICAgICAgIG1zZyA9ICJZb3UgaGF2ZSBub3QgbWFkZSBhbnkgc2VsZWN0aW9ucyIKKyAgICAgICAgICAgIG1zZyA9IG1zZyArICIgc28gdGhlcmUgaXNuJ3QgYW55dGhpbmcgdG8gYmFrZSBhdCB0aGlzIHRpbWUuIgorICAgICAgICAgICAgZGlhbG9nID0gQ3J1bWJzTWVzc2FnZURpYWxvZyhzZWxmLCBsYmwsIGd0ay5NRVNTQUdFX0lORk8sIG1zZykKKyAgICAgICAgICAgIGJ1dHRvbiA9IGRpYWxvZy5hZGRfYnV0dG9uKCJDbG9zZSIsIGd0ay5SRVNQT05TRV9PSykKKyAgICAgICAgICAgIEhvYkJ1dHRvbi5zdHlsZV9idXR0b24oYnV0dG9uKQorICAgICAgICAgICAgZGlhbG9nLnJ1bigpCisgICAgICAgICAgICBkaWFsb2cuZGVzdHJveSgpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLmZhc3RfZ2VuZXJhdGVfaW1hZ2VfYXN5bmMoVHJ1ZSkKKworICAgIGRlZiBzaG93X3JlY2lwZV9wcm9wZXJ0eV9kaWFsb2coc2VsZiwgcHJvcGVydGllcyk6CisgICAgICAgIGluZm9ybWF0aW9uID0ge30KKyAgICAgICAgZGlhbG9nID0gUHJvcGVydHlEaWFsb2codGl0bGUgPSBwcm9wZXJ0aWVzWyJuYW1lIl0gKycgJysgInByb3BlcnRpZXMiLAorICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gPSBwcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gZ3RrLkRJQUxPR19ERVNUUk9ZX1dJVEhfUEFSRU5UCisgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZ3RrLkRJQUxPR19OT19TRVBBUkFUT1IpCisKKyAgICAgICAgZGlhbG9nLnNldF9tb2RhbChGYWxzZSkKKworICAgICAgICBidXR0b24gPSBkaWFsb2cuYWRkX2J1dHRvbigiQ2xvc2UiLCBndGsuUkVTUE9OU0VfTk8pCisgICAgICAgIEhvYkFsdEJ1dHRvbi5zdHlsZV9idXR0b24oYnV0dG9uKQorICAgICAgICBidXR0b24uY29ubmVjdCgiY2xpY2tlZCIsIGxhbWJkYSB3OiBkaWFsb2cuZGVzdHJveSgpKQorCisgICAgICAgIGRpYWxvZy5ydW4oKQorCisgICAgZGVmIHNob3dfcGFja2FnZXNfcHJvcGVydHlfZGlhbG9nKHNlbGYsIHByb3BlcnRpZXMpOgorICAgICAgICBpbmZvcm1hdGlvbiA9IHt9CisgICAgICAgIGRpYWxvZyA9IFByb3BlcnR5RGlhbG9nKHRpdGxlID0gcHJvcGVydGllc1sibmFtZSJdICsnICcrICJwcm9wZXJ0aWVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uID0gcHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IGd0ay5ESUFMT0dfREVTVFJPWV9XSVRIX1BBUkVOVAorICAgICAgICAgICAgICAgICAgICAgICAgICB8IGd0ay5ESUFMT0dfTk9fU0VQQVJBVE9SKQorCisgICAgICAgIGRpYWxvZy5zZXRfbW9kYWwoRmFsc2UpCisKKyAgICAgICAgYnV0dG9uID0gZGlhbG9nLmFkZF9idXR0b24oIkNsb3NlIiwgZ3RrLlJFU1BPTlNFX05PKQorICAgICAgICBIb2JBbHRCdXR0b24uc3R5bGVfYnV0dG9uKGJ1dHRvbikKKyAgICAgICAgYnV0dG9uLmNvbm5lY3QoImNsaWNrZWQiLCBsYW1iZGEgdzogZGlhbG9nLmRlc3Ryb3koKSkKKworICAgICAgICBkaWFsb2cucnVuKCkKKworICAgIGRlZiBzaG93X2xheWVyX3NlbGVjdGlvbl9kaWFsb2coc2VsZik6CisgICAgICAgIGRpYWxvZyA9IExheWVyU2VsZWN0aW9uRGlhbG9nKHRpdGxlID0gIkxheWVycyIsCisgICAgICAgICAgICAgICAgICAgICBsYXllcnMgPSBjb3B5LmRlZXBjb3B5KHNlbGYuY29uZmlndXJhdGlvbi5sYXllcnMpLAorICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzX25vbl9yZW1vdmFibGUgPSBjb3B5LmRlZXBjb3B5KHNlbGYuY29uZmlndXJhdGlvbi5sYXllcnNfbm9uX3JlbW92YWJsZSksCisgICAgICAgICAgICAgICAgICAgICBhbGxfbGF5ZXJzID0gc2VsZi5wYXJhbWV0ZXJzLmFsbF9sYXllcnMsCisgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSBndGsuRElBTE9HX01PREFMCisgICAgICAgICAgICAgICAgICAgICAgICAgfCBndGsuRElBTE9HX0RFU1RST1lfV0lUSF9QQVJFTlQKKyAgICAgICAgICAgICAgICAgICAgICAgICB8IGd0ay5ESUFMT0dfTk9fU0VQQVJBVE9SKQorICAgICAgICBidXR0b24gPSBkaWFsb2cuYWRkX2J1dHRvbigiQ2FuY2VsIiwgZ3RrLlJFU1BPTlNFX05PKQorICAgICAgICBIb2JBbHRCdXR0b24uc3R5bGVfYnV0dG9uKGJ1dHRvbikKKyAgICAgICAgYnV0dG9uID0gZGlhbG9nLmFkZF9idXR0b24oIk9LIiwgZ3RrLlJFU1BPTlNFX1lFUykKKyAgICAgICAgSG9iQnV0dG9uLnN0eWxlX2J1dHRvbihidXR0b24pCisgICAgICAgIHJlc3BvbnNlID0gZGlhbG9nLnJ1bigpCisgICAgICAgIGlmIHJlc3BvbnNlID09IGd0ay5SRVNQT05TRV9ZRVM6CisgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24ubGF5ZXJzID0gZGlhbG9nLmxheWVycworICAgICAgICAgICAgIyBETyByZWZyZXNoIGxheWVycworICAgICAgICAgICAgaWYgZGlhbG9nLmxheWVyc19jaGFuZ2VkOgorICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlX2NvbmZpZ19hc3luYygpCisgICAgICAgIGRpYWxvZy5kZXN0cm95KCkKKworICAgIGRlZiBnZXRfaW1hZ2VfZXh0ZW5zaW9uKHNlbGYpOgorICAgICAgICBpbWFnZV9leHRlbnNpb24gPSB7fQorICAgICAgICBmb3IgdHlwZSBpbiBzZWxmLnBhcmFtZXRlcnMuaW1hZ2VfdHlwZXM6CisgICAgICAgICAgICBleHQgPSBzZWxmLmhhbmRsZXIucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIklNQUdFX0VYVEVOU0lPTl8lcyIgJSB0eXBlXSkKKyAgICAgICAgICAgIGlmIGV4dDoKKyAgICAgICAgICAgICAgICBpbWFnZV9leHRlbnNpb25bdHlwZV0gPSBleHQuc3BsaXQoJyAnKQorCisgICAgICAgIHJldHVybiBpbWFnZV9leHRlbnNpb24KKworICAgIGRlZiBzaG93X2xvYWRfbXlfaW1hZ2VzX2RpYWxvZyhzZWxmKToKKyAgICAgICAgaW1hZ2VfZXh0ZW5zaW9uID0gc2VsZi5nZXRfaW1hZ2VfZXh0ZW5zaW9uKCkKKyAgICAgICAgZGlhbG9nID0gSW1hZ2VTZWxlY3Rpb25EaWFsb2coc2VsZi5wYXJhbWV0ZXJzLmltYWdlX2FkZHIsIHNlbGYucGFyYW1ldGVycy5pbWFnZV90eXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9wZW4gTXkgSW1hZ2VzIiwgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0ay5GSUxFX0NIT09TRVJfQUNUSU9OX1NBVkUsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZV9leHRlbnNpb24pCisgICAgICAgIGJ1dHRvbiA9IGRpYWxvZy5hZGRfYnV0dG9uKCJDYW5jZWwiLCBndGsuUkVTUE9OU0VfTk8pCisgICAgICAgIEhvYkFsdEJ1dHRvbi5zdHlsZV9idXR0b24oYnV0dG9uKQorICAgICAgICBidXR0b24gPSBkaWFsb2cuYWRkX2J1dHRvbigiT3BlbiIsIGd0ay5SRVNQT05TRV9ZRVMpCisgICAgICAgIEhvYkJ1dHRvbi5zdHlsZV9idXR0b24oYnV0dG9uKQorICAgICAgICByZXNwb25zZSA9IGRpYWxvZy5ydW4oKQorICAgICAgICBpZiByZXNwb25zZSA9PSBndGsuUkVTUE9OU0VfWUVTOgorICAgICAgICAgICAgaWYgbm90IGRpYWxvZy5pbWFnZV9uYW1lczoKKyAgICAgICAgICAgICAgICBsYmwgPSAiPGI+Tm8gc2VsZWN0aW9ucyBtYWRlPC9iPiIKKyAgICAgICAgICAgICAgICBtc2cgPSAiWW91IGhhdmUgbm90IG1hZGUgYW55IHNlbGVjdGlvbnMiCisgICAgICAgICAgICAgICAgY3J1bWJzX2RpYWxvZyA9IENydW1ic01lc3NhZ2VEaWFsb2coc2VsZiwgbGJsLCBndGsuTUVTU0FHRV9JTkZPLCBtc2cpCisgICAgICAgICAgICAgICAgYnV0dG9uID0gY3J1bWJzX2RpYWxvZy5hZGRfYnV0dG9uKCJDbG9zZSIsIGd0ay5SRVNQT05TRV9PSykKKyAgICAgICAgICAgICAgICBIb2JCdXR0b24uc3R5bGVfYnV0dG9uKGJ1dHRvbikKKyAgICAgICAgICAgICAgICBjcnVtYnNfZGlhbG9nLnJ1bigpCisgICAgICAgICAgICAgICAgY3J1bWJzX2RpYWxvZy5kZXN0cm95KCkKKyAgICAgICAgICAgICAgICBkaWFsb2cuZGVzdHJveSgpCisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgIHNlbGYucGFyYW1ldGVycy5pbWFnZV9hZGRyID0gZGlhbG9nLmltYWdlX2ZvbGRlcgorICAgICAgICAgICAgc2VsZi5wYXJhbWV0ZXJzLmltYWdlX25hbWVzID0gZGlhbG9nLmltYWdlX25hbWVzWzpdCisgICAgICAgICAgICBzZWxmLnN3aXRjaF9wYWdlKHNlbGYuTVlfSU1BR0VfT1BFTkVEKQorCisgICAgICAgIGRpYWxvZy5kZXN0cm95KCkKKworICAgIGRlZiBzaG93X2Fkdl9zZXR0aW5nc19kaWFsb2coc2VsZiwgdGFiPU5vbmUpOgorICAgICAgICBkaWFsb2cgPSBBZHZhbmNlZFNldHRpbmdzRGlhbG9nKHRpdGxlID0gIkFkdmFuY2VkIGNvbmZpZ3VyYXRpb24iLAorICAgICAgICAgICAgY29uZmlndXJhdGlvbiA9IGNvcHkuZGVlcGNvcHkoc2VsZi5jb25maWd1cmF0aW9uKSwKKyAgICAgICAgICAgIGFsbF9pbWFnZV90eXBlcyA9IHNlbGYucGFyYW1ldGVycy5pbWFnZV90eXBlcywKKyAgICAgICAgICAgIGFsbF9wYWNrYWdlX2Zvcm1hdHMgPSBzZWxmLnBhcmFtZXRlcnMuYWxsX3BhY2thZ2VfZm9ybWF0cywKKyAgICAgICAgICAgIGFsbF9kaXN0cm9zID0gc2VsZi5wYXJhbWV0ZXJzLmFsbF9kaXN0cm9zLAorICAgICAgICAgICAgYWxsX3Nka19tYWNoaW5lcyA9IHNlbGYucGFyYW1ldGVycy5hbGxfc2RrX21hY2hpbmVzLAorICAgICAgICAgICAgbWF4X3RocmVhZHMgPSBzZWxmLnBhcmFtZXRlcnMubWF4X3RocmVhZHMsCisgICAgICAgICAgICBwYXJlbnQgPSBzZWxmLAorICAgICAgICAgICAgZmxhZ3MgPSBndGsuRElBTE9HX01PREFMCisgICAgICAgICAgICAgICAgICAgIHwgZ3RrLkRJQUxPR19ERVNUUk9ZX1dJVEhfUEFSRU5UCisgICAgICAgICAgICAgICAgICAgIHwgZ3RrLkRJQUxPR19OT19TRVBBUkFUT1IpCisgICAgICAgIGJ1dHRvbiA9IGRpYWxvZy5hZGRfYnV0dG9uKCJDYW5jZWwiLCBndGsuUkVTUE9OU0VfTk8pCisgICAgICAgIEhvYkFsdEJ1dHRvbi5zdHlsZV9idXR0b24oYnV0dG9uKQorICAgICAgICBidXR0b24gPSBkaWFsb2cuYWRkX2J1dHRvbigiU2F2ZSIsIGd0ay5SRVNQT05TRV9ZRVMpCisgICAgICAgIEhvYkJ1dHRvbi5zdHlsZV9idXR0b24oYnV0dG9uKQorICAgICAgICBkaWFsb2cuc2V0X3NhdmVfYnV0dG9uKGJ1dHRvbikKKyAgICAgICAgcmVzcG9uc2UgPSBkaWFsb2cucnVuKCkKKyAgICAgICAgc2V0dGluZ3NfY2hhbmdlZCA9IEZhbHNlCisgICAgICAgIGlmIHJlc3BvbnNlID09IGd0ay5SRVNQT05TRV9ZRVM6CisgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24gPSBkaWFsb2cuY29uZmlndXJhdGlvbgorICAgICAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLnNhdmUoc2VsZi5oYW5kbGVyLCBUcnVlKSAjIHJlbWVtYmVyIHNldHRpbmdzCisgICAgICAgICAgICBzZXR0aW5nc19jaGFuZ2VkID0gZGlhbG9nLnNldHRpbmdzX2NoYW5nZWQKKyAgICAgICAgZGlhbG9nLmRlc3Ryb3koKQorICAgICAgICByZXR1cm4gcmVzcG9uc2UgPT0gZ3RrLlJFU1BPTlNFX1lFUywgc2V0dGluZ3NfY2hhbmdlZAorCisgICAgZGVmIHNob3dfc2ltcGxlX3NldHRpbmdzX2RpYWxvZyhzZWxmLCB0YWI9Tm9uZSk6CisgICAgICAgIGRpYWxvZyA9IFNpbXBsZVNldHRpbmdzRGlhbG9nKHRpdGxlID0gIlNldHRpbmdzIiwKKyAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gPSBjb3B5LmRlZXBjb3B5KHNlbGYuY29uZmlndXJhdGlvbiksCisgICAgICAgICAgICBhbGxfaW1hZ2VfdHlwZXMgPSBzZWxmLnBhcmFtZXRlcnMuaW1hZ2VfdHlwZXMsCisgICAgICAgICAgICBhbGxfcGFja2FnZV9mb3JtYXRzID0gc2VsZi5wYXJhbWV0ZXJzLmFsbF9wYWNrYWdlX2Zvcm1hdHMsCisgICAgICAgICAgICBhbGxfZGlzdHJvcyA9IHNlbGYucGFyYW1ldGVycy5hbGxfZGlzdHJvcywKKyAgICAgICAgICAgIGFsbF9zZGtfbWFjaGluZXMgPSBzZWxmLnBhcmFtZXRlcnMuYWxsX3Nka19tYWNoaW5lcywKKyAgICAgICAgICAgIG1heF90aHJlYWRzID0gc2VsZi5wYXJhbWV0ZXJzLm1heF90aHJlYWRzLAorICAgICAgICAgICAgcGFyZW50ID0gc2VsZiwKKyAgICAgICAgICAgIGZsYWdzID0gZ3RrLkRJQUxPR19NT0RBTAorICAgICAgICAgICAgICAgICAgICB8IGd0ay5ESUFMT0dfREVTVFJPWV9XSVRIX1BBUkVOVAorICAgICAgICAgICAgICAgICAgICB8IGd0ay5ESUFMT0dfTk9fU0VQQVJBVE9SLAorICAgICAgICAgICAgaGFuZGxlciA9IHNlbGYuaGFuZGxlcikKKyAgICAgICAgYnV0dG9uID0gZGlhbG9nLmFkZF9idXR0b24oIkNhbmNlbCIsIGd0ay5SRVNQT05TRV9OTykKKyAgICAgICAgSG9iQWx0QnV0dG9uLnN0eWxlX2J1dHRvbihidXR0b24pCisgICAgICAgIGJ1dHRvbiA9IGRpYWxvZy5hZGRfYnV0dG9uKCJTYXZlIiwgZ3RrLlJFU1BPTlNFX1lFUykKKyAgICAgICAgSG9iQnV0dG9uLnN0eWxlX2J1dHRvbihidXR0b24pCisgICAgICAgIGlmIHRhYjoKKyAgICAgICAgICAgIGRpYWxvZy5zd2l0Y2hfdG9fcGFnZSh0YWIpCisgICAgICAgIHJlc3BvbnNlID0gZGlhbG9nLnJ1bigpCisgICAgICAgIHNldHRpbmdzX2NoYW5nZWQgPSBGYWxzZQorICAgICAgICBpZiByZXNwb25zZSA9PSBndGsuUkVTUE9OU0VfWUVTOgorICAgICAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uID0gZGlhbG9nLmNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi5zYXZlKHNlbGYuaGFuZGxlciwgVHJ1ZSkgIyByZW1lbWJlciBzZXR0aW5ncworICAgICAgICAgICAgc2V0dGluZ3NfY2hhbmdlZCA9IGRpYWxvZy5zZXR0aW5nc19jaGFuZ2VkCisgICAgICAgICAgICBpZiBkaWFsb2cucHJveHlfc2V0dGluZ3NfY2hhbmdlZDoKKyAgICAgICAgICAgICAgICBzZWxmLnNldF91c2VyX2NvbmZpZ19wcm94aWVzKCkKKyAgICAgICAgZWxpZiBkaWFsb2cucHJveHlfdGVzdF9yYW46CisgICAgICAgICAgICAjIFRoZSB1c2VyIG1pZ2h0IGhhdmUgbW9kaWZpZWQgdGhlIHByb3hpZXMgaW4gdGhlICJQcm94eSIKKyAgICAgICAgICAgICMgdGFiLCB3aGljaCBpbiB0dXJuIG1hZGUgdGhlIHByb3h5IHNldHRpbmdzIG1vZGlmeSBpbiBiYi4KKyAgICAgICAgICAgICMgSWYgIkNhbmNlbCIgd2FzIHByZXNzZWQsIHJlc3RvcmUgdGhlIHByZXZpb3VzIHByb3h5CisgICAgICAgICAgICAjIHNldHRpbmdzIGluc2lkZSBiYi4KKyAgICAgICAgICAgIHNlbGYuc2V0X3VzZXJfY29uZmlnX3Byb3hpZXMoKQorICAgICAgICBkaWFsb2cuZGVzdHJveSgpCisgICAgICAgIHJldHVybiByZXNwb25zZSA9PSBndGsuUkVTUE9OU0VfWUVTLCBzZXR0aW5nc19jaGFuZ2VkCisKKyAgICBkZWYgcmVwYXJzZV9wb3N0X2Fkdl9zZXR0aW5ncyhzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuY29uZmlndXJhdGlvbi5jdXJyX21hY2g6CisgICAgICAgICAgICBzZWxmLnVwZGF0ZV9jb25maWdfYXN5bmMoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLmNsZWFyX3NlbGVjdGlvbigpCisgICAgICAgICAgICAjIERPIHJlcGFyc2UgcmVjaXBlcworICAgICAgICAgICAgc2VsZi5wb3B1bGF0ZV9yZWNpcGVfcGFja2FnZV9pbmZvX2FzeW5jKCkKKworICAgIGRlZiBkZXBsb3lfaW1hZ2Uoc2VsZiwgaW1hZ2VfbmFtZSk6CisgICAgICAgIGlmIG5vdCBpbWFnZV9uYW1lOgorICAgICAgICAgICAgbGJsID0gIjxiPlBsZWFzZSBzZWxlY3QgYW4gaW1hZ2UgdG8gZGVwbG95LjwvYj4iCisgICAgICAgICAgICBkaWFsb2cgPSBDcnVtYnNNZXNzYWdlRGlhbG9nKHNlbGYsIGxibCwgZ3RrLk1FU1NBR0VfSU5GTykKKyAgICAgICAgICAgIGJ1dHRvbiA9IGRpYWxvZy5hZGRfYnV0dG9uKCJDbG9zZSIsIGd0ay5SRVNQT05TRV9PSykKKyAgICAgICAgICAgIEhvYkJ1dHRvbi5zdHlsZV9idXR0b24oYnV0dG9uKQorICAgICAgICAgICAgZGlhbG9nLnJ1bigpCisgICAgICAgICAgICBkaWFsb2cuZGVzdHJveSgpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpbWFnZV9wYXRoID0gb3MucGF0aC5qb2luKHNlbGYucGFyYW1ldGVycy5pbWFnZV9hZGRyLCBpbWFnZV9uYW1lKQorICAgICAgICBkaWFsb2cgPSBEZXBsb3lJbWFnZURpYWxvZyh0aXRsZSA9ICJVc2IgSW1hZ2UgTWFrZXIiLAorICAgICAgICAgICAgaW1hZ2VfcGF0aCA9IGltYWdlX3BhdGgsCisgICAgICAgICAgICBwYXJlbnQgPSBzZWxmLAorICAgICAgICAgICAgZmxhZ3MgPSBndGsuRElBTE9HX01PREFMCisgICAgICAgICAgICAgICAgICAgIHwgZ3RrLkRJQUxPR19ERVNUUk9ZX1dJVEhfUEFSRU5UCisgICAgICAgICAgICAgICAgICAgIHwgZ3RrLkRJQUxPR19OT19TRVBBUkFUT1IpCisgICAgICAgIGJ1dHRvbiA9IGRpYWxvZy5hZGRfYnV0dG9uKCJDbG9zZSIsIGd0ay5SRVNQT05TRV9OTykKKyAgICAgICAgSG9iQWx0QnV0dG9uLnN0eWxlX2J1dHRvbihidXR0b24pCisgICAgICAgIGJ1dHRvbiA9IGRpYWxvZy5hZGRfYnV0dG9uKCJNYWtlIHVzYiBpbWFnZSIsIGd0ay5SRVNQT05TRV9ZRVMpCisgICAgICAgIEhvYkJ1dHRvbi5zdHlsZV9idXR0b24oYnV0dG9uKQorICAgICAgICByZXNwb25zZSA9IGRpYWxvZy5ydW4oKQorICAgICAgICBkaWFsb2cuZGVzdHJveSgpCisKKyAgICBkZWYgc2hvd19sb2FkX2tlcm5lbF9kaWFsb2coc2VsZik6CisgICAgICAgIGRpYWxvZyA9IGd0ay5GaWxlQ2hvb3NlckRpYWxvZygiTG9hZCBLZXJuZWwgRmlsZXMiLCBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RrLkZJTEVfQ0hPT1NFUl9BQ1RJT05fU0FWRSkKKyAgICAgICAgYnV0dG9uID0gZGlhbG9nLmFkZF9idXR0b24oIkNhbmNlbCIsIGd0ay5SRVNQT05TRV9OTykKKyAgICAgICAgSG9iQWx0QnV0dG9uLnN0eWxlX2J1dHRvbihidXR0b24pCisgICAgICAgIGJ1dHRvbiA9IGRpYWxvZy5hZGRfYnV0dG9uKCJPcGVuIiwgZ3RrLlJFU1BPTlNFX1lFUykKKyAgICAgICAgSG9iQnV0dG9uLnN0eWxlX2J1dHRvbihidXR0b24pCisgICAgICAgIGZpbHRlciA9IGd0ay5GaWxlRmlsdGVyKCkKKyAgICAgICAgZmlsdGVyLnNldF9uYW1lKCJLZXJuZWwgRmlsZXMiKQorICAgICAgICBmaWx0ZXIuYWRkX3BhdHRlcm4oIiouYmluIikKKyAgICAgICAgZGlhbG9nLmFkZF9maWx0ZXIoZmlsdGVyKQorCisgICAgICAgIGRpYWxvZy5zZXRfY3VycmVudF9mb2xkZXIoc2VsZi5wYXJhbWV0ZXJzLmltYWdlX2FkZHIpCisKKyAgICAgICAgcmVzcG9uc2UgPSBkaWFsb2cucnVuKCkKKyAgICAgICAga2VybmVsX3BhdGggPSAiIgorICAgICAgICBpZiByZXNwb25zZSA9PSBndGsuUkVTUE9OU0VfWUVTOgorICAgICAgICAgICAga2VybmVsX3BhdGggPSBkaWFsb2cuZ2V0X2ZpbGVuYW1lKCkKKworICAgICAgICBkaWFsb2cuZGVzdHJveSgpCisKKyAgICAgICAgcmV0dXJuIGtlcm5lbF9wYXRoCisKKyAgICBkZWYgcnVucWVtdV9pbWFnZShzZWxmLCBpbWFnZV9uYW1lLCBrZXJuZWxfbmFtZSk6CisgICAgICAgIGlmIG5vdCBpbWFnZV9uYW1lIG9yIG5vdCBrZXJuZWxfbmFtZToKKyAgICAgICAgICAgIGxibCA9ICI8Yj5QbGVhc2Ugc2VsZWN0ICVzIHRvIGxhdW5jaCBpbiBRRU1VLjwvYj4iICUgKCJhIGtlcm5lbCIgaWYgaW1hZ2VfbmFtZSBlbHNlICJhbiBpbWFnZSIpCisgICAgICAgICAgICBkaWFsb2cgPSBDcnVtYnNNZXNzYWdlRGlhbG9nKHNlbGYsIGxibCwgZ3RrLk1FU1NBR0VfSU5GTykKKyAgICAgICAgICAgIGJ1dHRvbiA9IGRpYWxvZy5hZGRfYnV0dG9uKCJDbG9zZSIsIGd0ay5SRVNQT05TRV9PSykKKyAgICAgICAgICAgIEhvYkJ1dHRvbi5zdHlsZV9idXR0b24oYnV0dG9uKQorICAgICAgICAgICAgZGlhbG9nLnJ1bigpCisgICAgICAgICAgICBkaWFsb2cuZGVzdHJveSgpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBrZXJuZWxfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnBhcmFtZXRlcnMuaW1hZ2VfYWRkciwga2VybmVsX25hbWUpCisgICAgICAgIGltYWdlX3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5wYXJhbWV0ZXJzLmltYWdlX2FkZHIsIGltYWdlX25hbWUpCisKKyAgICAgICAgc291cmNlX2Vudl9wYXRoID0gb3MucGF0aC5qb2luKHNlbGYucGFyYW1ldGVycy5jb3JlX2Jhc2UsICJvZS1pbml0LWJ1aWxkLWVudiIpCisgICAgICAgIHRtcF9wYXRoID0gc2VsZi5wYXJhbWV0ZXJzLnRtcGRpcgorICAgICAgICBjbWRsaW5lID0gYmIudWkuY3J1bWJzLnV0aWxzLndoaWNoX3Rlcm1pbmFsKCkKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoaW1hZ2VfcGF0aCkgYW5kIG9zLnBhdGguZXhpc3RzKGtlcm5lbF9wYXRoKSBcCisgICAgICAgICAgIGFuZCBvcy5wYXRoLmV4aXN0cyhzb3VyY2VfZW52X3BhdGgpIGFuZCBvcy5wYXRoLmV4aXN0cyh0bXBfcGF0aCkgXAorICAgICAgICAgICBhbmQgY21kbGluZToKKyAgICAgICAgICAgIGNtZGxpbmUgKz0gIlwnIGJhc2ggLWMgXCJleHBvcnQgT0VfVE1QRElSPSIgKyB0bXBfcGF0aCArICI7ICIKKyAgICAgICAgICAgIGNtZGxpbmUgKz0gInNvdXJjZSAiICsgc291cmNlX2Vudl9wYXRoICsgIiAiICsgb3MuZ2V0Y3dkKCkgKyAiOyAiCisgICAgICAgICAgICBjbWRsaW5lICs9ICJydW5xZW11ICIgKyBrZXJuZWxfcGF0aCArICIgIiArIGltYWdlX3BhdGggKyAiXCJcJyIKKyAgICAgICAgICAgIHN1YnByb2Nlc3MuUG9wZW4oc2hsZXguc3BsaXQoY21kbGluZSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsYmwgPSAiPGI+UGF0aCBlcnJvcjwvYj4iCisgICAgICAgICAgICBtc2cgPSAiT25lIG9mIHlvdXIgcGF0aHMgaXMgd3JvbmcsIgorICAgICAgICAgICAgbXNnID0gbXNnICsgIiBwbGVhc2UgbWFrZSBzdXJlIHRoZSBmb2xsb3dpbmcgcGF0aHMgZXhpc3Q6XG4iCisgICAgICAgICAgICBtc2cgPSBtc2cgKyAiaW1hZ2UgcGF0aDoiICsgaW1hZ2VfcGF0aCArICJcbiIKKyAgICAgICAgICAgIG1zZyA9IG1zZyArICJrZXJuZWwgcGF0aDoiICsga2VybmVsX3BhdGggKyAiXG4iCisgICAgICAgICAgICBtc2cgPSBtc2cgKyAic291cmNlIGVudmlyb25tZW50IHBhdGg6IiArIHNvdXJjZV9lbnZfcGF0aCArICJcbiIKKyAgICAgICAgICAgIG1zZyA9IG1zZyArICJ0bXAgcGF0aDogIiArIHRtcF9wYXRoICsgIi4iCisgICAgICAgICAgICBtc2cgPSBtc2cgKyAiWW91IG1heSBiZSBtaXNzaW5nIGVpdGhlciB4dGVybSBvciB2dGUgZm9yIHRlcm1pbmFsIHNlcnZpY2VzLiIKKyAgICAgICAgICAgIGRpYWxvZyA9IENydW1ic01lc3NhZ2VEaWFsb2coc2VsZiwgbGJsLCBndGsuTUVTU0FHRV9FUlJPUiwgbXNnKQorICAgICAgICAgICAgYnV0dG9uID0gZGlhbG9nLmFkZF9idXR0b24oIkNsb3NlIiwgZ3RrLlJFU1BPTlNFX09LKQorICAgICAgICAgICAgSG9iQnV0dG9uLnN0eWxlX2J1dHRvbihidXR0b24pCisgICAgICAgICAgICBkaWFsb2cucnVuKCkKKyAgICAgICAgICAgIGRpYWxvZy5kZXN0cm95KCkKKworICAgIGRlZiBzaG93X3BhY2thZ2VzKHNlbGYpOgorICAgICAgICBzZWxmLnBhY2thZ2VfZGV0YWlsc19wYWdlLnJlZnJlc2hfdGFibGVzKCkKKyAgICAgICAgc2VsZi5zd2l0Y2hfcGFnZShzZWxmLlBBQ0tBR0VfU0VMRUNUSU9OKQorCisgICAgZGVmIHNob3dfcmVjaXBlcyhzZWxmKToKKyAgICAgICAgc2VsZi5zd2l0Y2hfcGFnZShzZWxmLlJFQ0lQRV9TRUxFQ1RJT04pCisKKyAgICBkZWYgc2hvd19pbWFnZV9kZXRhaWxzKHNlbGYpOgorICAgICAgICBzZWxmLnN3aXRjaF9wYWdlKHNlbGYuSU1BR0VfR0VORVJBVEVEKQorCisgICAgZGVmIHNob3dfY29uZmlndXJhdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5zd2l0Y2hfcGFnZShzZWxmLkJBU0VJTUdfU0VMRUNURUQpCisKKyAgICBkZWYgc3RvcF9idWlsZChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5zdG9wcGluZzoKKyAgICAgICAgICAgIGxibCA9ICI8Yj5Gb3JjZSBTdG9wIGJ1aWxkPzwvYj4iCisgICAgICAgICAgICBtc2cgPSAiWW91J3ZlIGFscmVhZHkgc2VsZWN0ZWQgU3RvcCBvbmNlLCIKKyAgICAgICAgICAgIG1zZyA9IG1zZyArICIgd291bGQgeW91IGxpa2UgdG8gJ0ZvcmNlIFN0b3AnIHRoZSBidWlsZD9cblxuIgorICAgICAgICAgICAgbXNnID0gbXNnICsgIlRoaXMgd2lsbCBzdG9wIHRoZSBidWlsZCBhcyBxdWlja2x5IGFzIHBvc3NpYmxlIGJ1dCBtYXkiCisgICAgICAgICAgICBtc2cgPSBtc2cgKyAiIHdlbGwgbGVhdmUgeW91ciBidWlsZCBkaXJlY3RvcnkgaW4gYW4gIHVudXNhYmxlIHN0YXRlIgorICAgICAgICAgICAgbXNnID0gbXNnICsgIiB0aGF0IHJlcXVpcmVzIG1hbnVhbCBzdGVwcyB0byBmaXguIgorICAgICAgICAgICAgZGlhbG9nID0gQ3J1bWJzTWVzc2FnZURpYWxvZyhzZWxmLCBsYmwsIGd0ay5NRVNTQUdFX1dBUk5JTkcsIG1zZykKKyAgICAgICAgICAgIGJ1dHRvbiA9IGRpYWxvZy5hZGRfYnV0dG9uKCJDYW5jZWwiLCBndGsuUkVTUE9OU0VfQ0FOQ0VMKQorICAgICAgICAgICAgSG9iQWx0QnV0dG9uLnN0eWxlX2J1dHRvbihidXR0b24pCisgICAgICAgICAgICBidXR0b24gPSBkaWFsb2cuYWRkX2J1dHRvbigiRm9yY2UgU3RvcCIsIGd0ay5SRVNQT05TRV9ZRVMpCisgICAgICAgICAgICBIb2JCdXR0b24uc3R5bGVfYnV0dG9uKGJ1dHRvbikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxibCA9ICI8Yj5TdG9wIGJ1aWxkPzwvYj4iCisgICAgICAgICAgICBtc2cgPSAiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHN0b3AgdGhpcyIKKyAgICAgICAgICAgIG1zZyA9IG1zZyArICIgYnVpbGQ/XG5cbidTdG9wJyB3aWxsIHN0b3AgdGhlIGJ1aWxkIGFzIHNvb24gYXMgYWxsIGluIgorICAgICAgICAgICAgbXNnID0gbXNnICsgIiBwcm9ncmVzcyBidWlsZCB0YXNrcyBhcmUgZmluaXNoZWQuIEhvd2V2ZXIgaWYgYSIKKyAgICAgICAgICAgIG1zZyA9IG1zZyArICIgbGVuZ3RoeSBjb21waWxhdGlvbiBwaGFzZSBpcyBpbiBwcm9ncmVzcyB0aGlzIG1heSB0YWtlIgorICAgICAgICAgICAgbXNnID0gbXNnICsgIiBzb21lIHRpbWUuXG5cbiIKKyAgICAgICAgICAgIG1zZyA9IG1zZyArICInRm9yY2UgU3RvcCcgd2lsbCBzdG9wIHRoZSBidWlsZCBhcyBxdWlja2x5IGFzIgorICAgICAgICAgICAgbXNnID0gbXNnICsgIiBwb3NzaWJsZSBidXQgbWF5IHdlbGwgbGVhdmUgeW91ciBidWlsZCBkaXJlY3RvcnkgaW4gYW4iCisgICAgICAgICAgICBtc2cgPSBtc2cgKyAiIHVudXNhYmxlIHN0YXRlIHRoYXQgcmVxdWlyZXMgbWFudWFsIHN0ZXBzIHRvIGZpeC4iCisgICAgICAgICAgICBkaWFsb2cgPSBDcnVtYnNNZXNzYWdlRGlhbG9nKHNlbGYsIGxibCwgZ3RrLk1FU1NBR0VfV0FSTklORywgbXNnKQorICAgICAgICAgICAgYnV0dG9uID0gZGlhbG9nLmFkZF9idXR0b24oIkNhbmNlbCIsIGd0ay5SRVNQT05TRV9DQU5DRUwpCisgICAgICAgICAgICBIb2JBbHRCdXR0b24uc3R5bGVfYnV0dG9uKGJ1dHRvbikKKyAgICAgICAgICAgIGJ1dHRvbiA9IGRpYWxvZy5hZGRfYnV0dG9uKCJGb3JjZSBzdG9wIiwgZ3RrLlJFU1BPTlNFX1lFUykKKyAgICAgICAgICAgIEhvYkFsdEJ1dHRvbi5zdHlsZV9idXR0b24oYnV0dG9uKQorICAgICAgICAgICAgYnV0dG9uID0gZGlhbG9nLmFkZF9idXR0b24oIlN0b3AiLCBndGsuUkVTUE9OU0VfT0spCisgICAgICAgICAgICBIb2JCdXR0b24uc3R5bGVfYnV0dG9uKGJ1dHRvbikKKyAgICAgICAgcmVzcG9uc2UgPSBkaWFsb2cucnVuKCkKKyAgICAgICAgZGlhbG9nLmRlc3Ryb3koKQorICAgICAgICBpZiByZXNwb25zZSAhPSBndGsuUkVTUE9OU0VfQ0FOQ0VMOgorICAgICAgICAgICAgc2VsZi5zdG9wcGluZyA9IFRydWUKKyAgICAgICAgaWYgcmVzcG9uc2UgPT0gZ3RrLlJFU1BPTlNFX09LOgorICAgICAgICAgICAgc2VsZi5idWlsZF9kZXRhaWxzX3BhZ2UucHJvZ3Jlc3NfYmFyLnNldF9zdG9wX3RpdGxlKCJTdG9wcGluZyB0aGUgYnVpbGQuLi4uIikKKyAgICAgICAgICAgIHNlbGYuYnVpbGRfZGV0YWlsc19wYWdlLnByb2dyZXNzX2Jhci5zZXRfcmNzdHlsZSgic3RvcCIpCisgICAgICAgICAgICBzZWxmLmNhbmNlbF9idWlsZF9zeW5jKCkKKyAgICAgICAgZWxpZiByZXNwb25zZSA9PSBndGsuUkVTUE9OU0VfWUVTOgorICAgICAgICAgICAgc2VsZi5jYW5jZWxfYnVpbGRfc3luYyhUcnVlKQorCisgICAgZGVmIGRvX2xvZyhzZWxmLCBjb25zb2xlbG9nZmlsZSA9IE5vbmUpOgorICAgICAgICBpZiBjb25zb2xlbG9nZmlsZToKKyAgICAgICAgICAgIGJiLnV0aWxzLm1rZGlyaGllcihvcy5wYXRoLmRpcm5hbWUoY29uc29sZWxvZ2ZpbGUpKQorICAgICAgICAgICAgaWYgc2VsZi5jb25zb2xlbG9nOgorICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLnJlbW92ZUhhbmRsZXIoc2VsZi5jb25zb2xlbG9nKQorICAgICAgICAgICAgICAgIHNlbGYuY29uc29sZWxvZyA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYuY29uc29sZWxvZyA9IGxvZ2dpbmcuRmlsZUhhbmRsZXIoY29uc29sZWxvZ2ZpbGUpCisgICAgICAgICAgICBiYi5tc2cuYWRkRGVmYXVsdGxvZ0ZpbHRlcihzZWxmLmNvbnNvbGVsb2cpCisgICAgICAgICAgICBmb3JtYXQgPSBiYi5tc2cuQkJMb2dGb3JtYXR0ZXIoIiUobGV2ZWxuYW1lKXM6ICUobWVzc2FnZSlzIikKKyAgICAgICAgICAgIHNlbGYuY29uc29sZWxvZy5zZXRGb3JtYXR0ZXIoZm9ybWF0KQorCisgICAgICAgICAgICBzZWxmLmxvZ2dlci5hZGRIYW5kbGVyKHNlbGYuY29uc29sZWxvZykKKworICAgIGRlZiBnZXRfdG9wZGlyKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5oYW5kbGVyLmdldF90b3BkaXIoKQorCisgICAgZGVmIHdhaXQoc2VsZiwgZGVsYXkpOgorICAgICAgICB0aW1lX3N0YXJ0ID0gdGltZS50aW1lKCkKKyAgICAgICAgdGltZV9lbmQgPSB0aW1lX3N0YXJ0ICsgZGVsYXkKKyAgICAgICAgd2hpbGUgdGltZV9lbmQgPiB0aW1lLnRpbWUoKToKKyAgICAgICAgICAgIHdoaWxlIGd0ay5ldmVudHNfcGVuZGluZygpOgorICAgICAgICAgICAgICAgIGd0ay5tYWluX2l0ZXJhdGlvbigpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvYnVpbGRtYW5hZ2VyLnB5IGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2J1aWxkbWFuYWdlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODU4ZDc1Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2J1aWxkbWFuYWdlci5weQpAQCAtMCwwICsxLDQ1NSBAQAorIworIyBCaXRCYWtlIEdyYXBoaWNhbCBHVEsgVXNlciBJbnRlcmZhY2UKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA4ICAgICAgICBJbnRlbCBDb3Jwb3JhdGlvbgorIworIyBBdXRob3JlZCBieSBSb2IgQnJhZGZvcmQgPHJvYkBsaW51eC5pbnRlbC5jb20+CisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitpbXBvcnQgZ3RrCitpbXBvcnQgZ29iamVjdAoraW1wb3J0IHRocmVhZGluZworaW1wb3J0IG9zCitpbXBvcnQgZGF0ZXRpbWUKK2ltcG9ydCB0aW1lCisKK2NsYXNzIEJ1aWxkQ29uZmlndXJhdGlvbjoKKyAgICAiIiIgUmVwcmVzZW50cyBhIHBvdGVudGlhbCAqb3IqIGhpc3RvcmljICpvciogY29uY3JldGUgYnVpbGQuIEl0CisgICAgZW5jb21wYXNzZXMgYWxsIHRoZSB0aGluZ3MgdGhhdCB3ZSBuZWVkIHRvIHRlbGwgYml0YmFrZSB0byBkbyB0byBtYWtlIGl0CisgICAgYnVpbGQgd2hhdCB3ZSB3YW50IGl0IHRvIGJ1aWxkLgorCisgICAgSXQgYWxzbyBzdG9yZWQgdGhlIG1ldGFkYXRhIFVSTCBhbmQgdGhlIHNldCBvZiBwb3NzaWJsZSBtYWNoaW5lcyAoYW5kIHRoZQorICAgIGRpc3Ryb3MgLyBpbWFnZXMgLyB1cmlzIGZvciB0aGVzZS4gQXBhcnQgZnJvbSB0aGUgbWV0ZGF0YSBVUkwgdGhlc2UgYXJlCisgICAgbm90IHNlcmlhbGlzZWQgdG8gZmlsZSAoc2luY2UgdGhleSBtYXkgYmUgdHJhbnNpZW50KS4gSW4gc29tZSB3YXlzIHRoaXMKKyAgICBmdW5jdGlvbmFsaXR5IG1pZ2h0IGJlIHNoaWZ0ZWQgdG8gdGhlIGxvYWRlciBjbGFzcy4iIiIKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZik6CisgICAgICAgIHNlbGYubWV0YWRhdGFfdXJsID0gTm9uZQorCisgICAgICAgICMgVHVwbGUgb2YgKGRpc3Ryb3MsIGltYWdlLCB1cmxzKQorICAgICAgICBzZWxmLm1hY2hpbmVfb3B0aW9ucyA9IHt9CisKKyAgICAgICAgc2VsZi5tYWNoaW5lID0gTm9uZQorICAgICAgICBzZWxmLmRpc3RybyA9IE5vbmUKKyAgICAgICAgc2VsZi5pbWFnZSA9IE5vbmUKKyAgICAgICAgc2VsZi51cmxzID0gW10KKyAgICAgICAgc2VsZi5leHRyYV91cmxzID0gW10KKyAgICAgICAgc2VsZi5leHRyYV9wa2dzID0gW10KKworICAgIGRlZiBnZXRfbWFjaGluZXNfbW9kZWwgKHNlbGYpOgorICAgICAgICBtb2RlbCA9IGd0ay5MaXN0U3RvcmUgKGdvYmplY3QuVFlQRV9TVFJJTkcpCisgICAgICAgIGZvciBtYWNoaW5lIGluIHNlbGYubWFjaGluZV9vcHRpb25zLmtleXMoKToKKyAgICAgICAgICAgIG1vZGVsLmFwcGVuZCAoW21hY2hpbmVdKQorCisgICAgICAgIHJldHVybiBtb2RlbAorCisgICAgZGVmIGdldF9kaXN0cm9fYW5kX2ltYWdlc19tb2RlbHMgKHNlbGYsIG1hY2hpbmUpOgorICAgICAgICBkaXN0cm9fbW9kZWwgPSBndGsuTGlzdFN0b3JlIChnb2JqZWN0LlRZUEVfU1RSSU5HKQorCisgICAgICAgIGZvciBkaXN0cm8gaW4gc2VsZi5tYWNoaW5lX29wdGlvbnNbbWFjaGluZV1bMF06CisgICAgICAgICAgICBkaXN0cm9fbW9kZWwuYXBwZW5kIChbZGlzdHJvXSkKKworICAgICAgICBpbWFnZV9tb2RlbCA9IGd0ay5MaXN0U3RvcmUgKGdvYmplY3QuVFlQRV9TVFJJTkcpCisKKyAgICAgICAgZm9yIGltYWdlIGluIHNlbGYubWFjaGluZV9vcHRpb25zW21hY2hpbmVdWzFdOgorICAgICAgICAgICAgaW1hZ2VfbW9kZWwuYXBwZW5kIChbaW1hZ2VdKQorCisgICAgICAgIHJldHVybiAoZGlzdHJvX21vZGVsLCBpbWFnZV9tb2RlbCkKKworICAgIGRlZiBnZXRfcmVwb3MgKHNlbGYpOgorICAgICAgICBzZWxmLnVybHMgPSBzZWxmLm1hY2hpbmVfb3B0aW9uc1tzZWxmLm1hY2hpbmVdWzJdCisgICAgICAgIHJldHVybiBzZWxmLnVybHMKKworICAgICMgSXQgbWlnaHQgYmUgYSBsb3QgbG90IGJldHRlciBpZiB3ZSBzdG9yZWQgdGhlc2UgaW4gbGlrZSwgYml0YmFrZSBjb25mCisgICAgIyBmaWxlIGZvcm1hdC4KKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGxvYWRfZnJvbV9maWxlIChmaWxlbmFtZSk6CisKKyAgICAgICAgY29uZiA9IEJ1aWxkQ29uZmlndXJhdGlvbigpCisgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgInIiKSBhcyBmOgorICAgICAgICAgICAgZm9yIGxpbmUgaW4gZjoKKyAgICAgICAgICAgICAgICBkYXRhID0gbGluZS5zcGxpdCAoIjsiKVsxXQorICAgICAgICAgICAgICAgIGlmIChsaW5lLnN0YXJ0c3dpdGggKCJtZXRhZGF0YS11cmw7IikpOgorICAgICAgICAgICAgICAgICAgICBjb25mLm1ldGFkYXRhX3VybCA9IGRhdGEuc3RyaXAoKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIChsaW5lLnN0YXJ0c3dpdGggKCJ1cmw7IikpOgorICAgICAgICAgICAgICAgICAgICBjb25mLnVybHMgKz0gW2RhdGEuc3RyaXAoKV0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiAobGluZS5zdGFydHN3aXRoICgiZXh0cmEtdXJsOyIpKToKKyAgICAgICAgICAgICAgICAgICAgY29uZi5leHRyYV91cmxzICs9IFtkYXRhLnN0cmlwKCldCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgKGxpbmUuc3RhcnRzd2l0aCAoIm1hY2hpbmU7IikpOgorICAgICAgICAgICAgICAgICAgICBjb25mLm1hY2hpbmUgPSBkYXRhLnN0cmlwKCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiAobGluZS5zdGFydHN3aXRoICgiZGlzdHJpYnV0aW9uOyIpKToKKyAgICAgICAgICAgICAgICAgICAgY29uZi5kaXN0cm8gPSBkYXRhLnN0cmlwKCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiAobGluZS5zdGFydHN3aXRoICgiaW1hZ2U7IikpOgorICAgICAgICAgICAgICAgICAgICBjb25mLmltYWdlID0gZGF0YS5zdHJpcCgpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgcmV0dXJuIGNvbmYKKworICAgICMgU2VyaWFsaXNlIHRvIGEgZmlsZS4gVGhpcyBpcyBwYXJ0IG9mIHRoZSBidWlsZCBwcm9jZXNzIGFuZCB3ZSB1c2UgdGhpcworICAgICMgdG8gYmUgYWJsZSB0byByZXBlYXQgYSBnaXZlbiBidWlsZCAodXNpbmcgdGhlIHNhbWUgc2V0IG9mIHBhcmFtZXRlcnMpCisgICAgIyBidXQgYWxzbyBzbyB0aGF0IHdlIGNhbiBpbmNsdWRlIHRoZSBkZXRhaWxzIG9mIHRoZSBpbWFnZSAvIG1hY2hpbmUgLworICAgICMgZGlzdHJvIGluIHRoZSBidWlsZCBtYW5hZ2VyIHRyZWUgdmlldy4KKyAgICBkZWYgd3JpdGVfdG9fZmlsZSAoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBmID0gb3BlbiAoZmlsZW5hbWUsICJ3IikKKworICAgICAgICBsaW5lcyA9IFtdCisKKyAgICAgICAgaWYgKHNlbGYubWV0YWRhdGFfdXJsKToKKyAgICAgICAgICAgIGxpbmVzICs9IFsibWV0YWRhdGEtdXJsOyVzXG4iICUgKHNlbGYubWV0YWRhdGFfdXJsKV0KKworICAgICAgICBmb3IgdXJsIGluIHNlbGYudXJsczoKKyAgICAgICAgICAgIGxpbmVzICs9IFsidXJsOyVzXG4iICUgKHVybCldCisKKyAgICAgICAgZm9yIHVybCBpbiBzZWxmLmV4dHJhX3VybHM6CisgICAgICAgICAgICBsaW5lcyArPSBbImV4dHJhLXVybDslc1xuIiAlICh1cmwpXQorCisgICAgICAgIGlmIChzZWxmLm1hY2hpbmUpOgorICAgICAgICAgICAgbGluZXMgKz0gWyJtYWNoaW5lOyVzXG4iICUgKHNlbGYubWFjaGluZSldCisKKyAgICAgICAgaWYgKHNlbGYuZGlzdHJvKToKKyAgICAgICAgICAgIGxpbmVzICs9IFsiZGlzdHJpYnV0aW9uOyVzXG4iICUgKHNlbGYuZGlzdHJvKV0KKworICAgICAgICBpZiAoc2VsZi5pbWFnZSk6CisgICAgICAgICAgICBsaW5lcyArPSBbImltYWdlOyVzXG4iICUgKHNlbGYuaW1hZ2UpXQorCisgICAgICAgIGYud3JpdGVsaW5lcyAobGluZXMpCisgICAgICAgIGYuY2xvc2UgKCkKKworY2xhc3MgQnVpbGRSZXN1bHQoZ29iamVjdC5HT2JqZWN0KToKKyAgICAiIiIgUmVwcmVzZW50cyBhbiBoaXN0b3JpYyBidWlsZC4gUGVyaGFwcyBub3Qgc3VjY2Vzc2Z1bC4gQnV0IGl0IGluY2x1ZGVzCisgICAgdGhpbmdzIHN1Y2ggYXMgdGhlIGZpbGVzIHRoYXQgYXJlIGluIHRoZSBkaXJlY3RvcnkgKHRoZSBvdXRwdXQgZnJvbSB0aGUKKyAgICBidWlsZCkgYXMgd2VsbCBhcyBhIGRlc2VyaWFsaXNlZCBCdWlsZENvbmZpZ3VyYXRpb24gZmlsZSB0aGF0IGlzIHN0b3JlZCBpbgorICAgICIuY29uZiIgaW4gdGhlIGRpcmVjdG9yeSBmb3IgdGhlIGJ1aWxkLgorCisgICAgVGhpcyBpcyBHT2JqZWN0IHNvIHRoYXQgaXQgY2FuIGJlIGluY2x1ZGVkIGluIHRoZSBUcmVlU3RvcmUuIiIiCisKKyAgICAoU1RBVEVfQ09NUExFVEUsIFNUQVRFX0ZBSUxFRCwgU1RBVEVfT05HT0lORykgPSBcCisgICAgICAgICgwLCAxLCAyKQorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCBwYXJlbnQsIGlkZW50aWZpZXIpOgorICAgICAgICBnb2JqZWN0LkdPYmplY3QuX19pbml0X18gKHNlbGYpCisgICAgICAgIHNlbGYuZGF0ZSA9IE5vbmUKKworICAgICAgICBzZWxmLmZpbGVzID0gW10KKyAgICAgICAgc2VsZi5zdGF0dXMgPSBOb25lCisgICAgICAgIHNlbGYuaWRlbnRpZmllciA9IGlkZW50aWZpZXIKKyAgICAgICAgc2VsZi5wYXRoID0gb3MucGF0aC5qb2luIChwYXJlbnQsIGlkZW50aWZpZXIpCisKKyAgICAgICAgIyBFeHRyYWN0IHRoZSBkYXRlLCBzaW5jZSB0aGUgZGlyZWN0b3J5IG5hbWUgaXMgb2YgdGhlCisgICAgICAgICMgZm9ybWF0IGJ1aWxkLTx5ZWFyPjxtb250aD48ZGF5Pi08b3JkaW5hbD4gd2UgY2FuIGVhc2lseQorICAgICAgICAjIHB1bGwgaXQgb3V0LgorICAgICAgICAjIFRPRE86IEJldHRlciB0byBzdGF0IGEgZmlsZT8KKyAgICAgICAgKF8sIGRhdGUsIHJldmlzaW9uKSA9IGlkZW50aWZpZXIuc3BsaXQgKCItIikKKyAgICAgICAgcHJpbnQoZGF0ZSkKKworICAgICAgICB5ZWFyID0gaW50IChkYXRlWzA6NF0pCisgICAgICAgIG1vbnRoID0gaW50IChkYXRlWzQ6Nl0pCisgICAgICAgIGRheSA9IGludCAoZGF0ZVs2OjhdKQorCisgICAgICAgIHNlbGYuZGF0ZSA9IGRhdGV0aW1lLmRhdGUgKHllYXIsIG1vbnRoLCBkYXkpCisKKyAgICAgICAgc2VsZi5jb25mID0gTm9uZQorCisgICAgICAgICMgQnkgZGVmYXVsdCBidWlsZHMgYXJlIFNUQVRFX0ZBSUxFRCB1bmxlc3Mgd2UgZmluZCBhICJjb21wbGV0ZSIgZmlsZQorICAgICAgICAjIGluIHdoaWNoIGNhc2UgdGhleSBhcmUgU1RBVEVfQ09NUExFVEUKKyAgICAgICAgc2VsZi5zdGF0ZSA9IEJ1aWxkUmVzdWx0LlNUQVRFX0ZBSUxFRAorICAgICAgICBmb3IgZmlsZSBpbiBvcy5saXN0ZGlyIChzZWxmLnBhdGgpOgorICAgICAgICAgICAgaWYgKGZpbGUuc3RhcnRzd2l0aCAoIi5jb25mIikpOgorICAgICAgICAgICAgICAgIGNvbmZmaWxlID0gb3MucGF0aC5qb2luIChzZWxmLnBhdGgsIGZpbGUpCisgICAgICAgICAgICAgICAgc2VsZi5jb25mID0gQnVpbGRDb25maWd1cmF0aW9uLmxvYWRfZnJvbV9maWxlIChjb25mZmlsZSkKKyAgICAgICAgICAgIGVsaWYgKGZpbGUuc3RhcnRzd2l0aCAoImNvbXBsZXRlIikpOgorICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBCdWlsZFJlc3VsdC5TVEFURV9DT01QTEVURQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9maWxlIChmaWxlKQorCisgICAgZGVmIGFkZF9maWxlIChzZWxmLCBmaWxlKToKKyAgICAgICAgIyBKdXN0IGFkZCB0aGUgZmlsZSBmb3Igbm93LiBEb24ndCBjYXJlIGFib3V0IHRoZSB0eXBlLgorICAgICAgICBzZWxmLmZpbGVzICs9IFsoZmlsZSwgTm9uZSldCisKK2NsYXNzIEJ1aWxkTWFuYWdlck1vZGVsIChndGsuVHJlZVN0b3JlKToKKyAgICAiIiIgTW9kZWwgZm9yIHRoZSBCdWlsZE1hbmFnZXJUcmVlVmlldy4gVGhpcyBkZXJpdmVzIGZyb20gZ3RrLlRyZWVTdG9yZQorICAgIGJ1dCBpdCBhYnN0cmFjdHMgbmljZWx5IHdoYXQgdGhlIGNvbHVtbnMgbWVhbiBhbmQgdGhlIHNldHVwIG9mIHRoZSBjb2x1bW5zCisgICAgaW4gdGhlIG1vZGVsLiAiIiIKKworICAgIChDT0xfSURFTlQsIENPTF9ERVNDLCBDT0xfTUFDSElORSwgQ09MX0RJU1RSTywgQ09MX0JVSUxEX1JFU1VMVCwgQ09MX0RBVEUsIENPTF9TVEFURSkgPSBcCisgICAgICAgICgwLCAxLCAyLCAzLCA0LCA1LCA2KQorCisgICAgZGVmIF9faW5pdF9fIChzZWxmKToKKyAgICAgICAgZ3RrLlRyZWVTdG9yZS5fX2luaXRfXyAoc2VsZiwKKyAgICAgICAgICAgIGdvYmplY3QuVFlQRV9TVFJJTkcsCisgICAgICAgICAgICBnb2JqZWN0LlRZUEVfU1RSSU5HLAorICAgICAgICAgICAgZ29iamVjdC5UWVBFX1NUUklORywKKyAgICAgICAgICAgIGdvYmplY3QuVFlQRV9TVFJJTkcsCisgICAgICAgICAgICBnb2JqZWN0LlRZUEVfT0JKRUNULAorICAgICAgICAgICAgZ29iamVjdC5UWVBFX0lOVDY0LAorICAgICAgICAgICAgZ29iamVjdC5UWVBFX0lOVCkKKworY2xhc3MgQnVpbGRNYW5hZ2VyIChnb2JqZWN0LkdPYmplY3QpOgorICAgICIiIiBUaGlzIGNsYXNzIG1hbmFnZXMgdGhlIGhpc3RvcmljIGJ1aWxkcyB0aGF0IGhhdmUgYmVlbiBmb3VuZCBpbiB0aGUKKyAgICAicmVzdWx0cyIgZGlyZWN0b3J5IGJ1dCBpcyBhbHNvIHVzZWQgZm9yIHN0YXJ0aW5nIGEgbmV3IGJ1aWxkLiIiIgorCisgICAgX19nc2lnbmFsc19fID0geworICAgICAgICAncG9wdWxhdGlvbi1maW5pc2hlZCcgOiAoZ29iamVjdC5TSUdOQUxfUlVOX0xBU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpKSwKKyAgICAgICAgJ3BvcHVsYXRlLWVycm9yJyA6IChnb2JqZWN0LlNJR05BTF9SVU5fTEFTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSkKKyAgICB9CisKKyAgICBkZWYgdXBkYXRlX2J1aWxkX3Jlc3VsdCAoc2VsZiwgcmVzdWx0LCBpdGVyKToKKyAgICAgICAgIyBDb252ZXJ0IHRoZSBkYXRlIGludG8gc29tZXRoaW5nIHdlIGNhbiBzb3J0IGJ5LgorICAgICAgICBkYXRlID0gbG9uZyAodGltZS5ta3RpbWUgKHJlc3VsdC5kYXRlLnRpbWV0dXBsZSgpKSkKKworICAgICAgICAjIEFkZCBhIHRvcCBsZXZlbCBlbnRyeSBmb3IgdGhlIGJ1aWxkCisKKyAgICAgICAgc2VsZi5tb2RlbC5zZXQgKGl0ZXIsCisgICAgICAgICAgICBCdWlsZE1hbmFnZXJNb2RlbC5DT0xfSURFTlQsIHJlc3VsdC5pZGVudGlmaWVyLAorICAgICAgICAgICAgQnVpbGRNYW5hZ2VyTW9kZWwuQ09MX0RFU0MsIHJlc3VsdC5jb25mLmltYWdlLAorICAgICAgICAgICAgQnVpbGRNYW5hZ2VyTW9kZWwuQ09MX01BQ0hJTkUsIHJlc3VsdC5jb25mLm1hY2hpbmUsCisgICAgICAgICAgICBCdWlsZE1hbmFnZXJNb2RlbC5DT0xfRElTVFJPLCByZXN1bHQuY29uZi5kaXN0cm8sCisgICAgICAgICAgICBCdWlsZE1hbmFnZXJNb2RlbC5DT0xfQlVJTERfUkVTVUxULCByZXN1bHQsCisgICAgICAgICAgICBCdWlsZE1hbmFnZXJNb2RlbC5DT0xfREFURSwgZGF0ZSwKKyAgICAgICAgICAgIEJ1aWxkTWFuYWdlck1vZGVsLkNPTF9TVEFURSwgcmVzdWx0LnN0YXRlKQorCisgICAgICAgICMgQW5kIHRoZW4gd2UgdXNlIHRoZSBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5IGFzIHRoZSBjaGlsZHJlbiBmb3IgdGhlCisgICAgICAgICMgdG9wIGxldmVsIGl0ZXIuCisgICAgICAgIGZvciBmaWxlIGluIHJlc3VsdC5maWxlczoKKyAgICAgICAgICAgIHNlbGYubW9kZWwuYXBwZW5kIChpdGVyLCAoTm9uZSwgZmlsZVswXSwgTm9uZSwgTm9uZSwgTm9uZSwgZGF0ZSwgLTEpKQorCisgICAgIyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhcyBhbiBpZGxlIGJ5IHRoZSBCdWlsZE1hbmFnZXJQb3B1bGF0ZXJUaHJlYWQKKyAgICBkZWYgYWRkX2J1aWxkX3Jlc3VsdCAoc2VsZiwgcmVzdWx0KToKKyAgICAgICAgZ3RrLmdkay50aHJlYWRzX2VudGVyKCkKKyAgICAgICAgc2VsZi5rbm93bl9idWlsZHMgKz0gW3Jlc3VsdF0KKworICAgICAgICBzZWxmLnVwZGF0ZV9idWlsZF9yZXN1bHQgKHJlc3VsdCwgc2VsZi5tb2RlbC5hcHBlbmQgKE5vbmUpKQorCisgICAgICAgIGd0ay5nZGsudGhyZWFkc19sZWF2ZSgpCisKKyAgICBkZWYgbm90aWZ5X2J1aWxkX2ZpbmlzaGVkIChzZWxmKToKKyAgICAgICAgIyBUaGlzIGlzIGEgYml0IG9mIGEgaGFjay4gSWYgd2UgaGF2ZSBhIHJ1bm5pbmcgYnVpbGQgcnVubmluZyB0aGVuIHdlCisgICAgICAgICMgd2lsbCBoYXZlIGEgcm93IGluIHRoZSBtb2RlbCBpbiBTVEFURV9PTkdPSU5HLiBGaW5kIGl0IGFuZCBtYWtlIGl0CisgICAgICAgICMgYXMgaWYgaXQgd2FzIGEgcHJvcGVyIGhpc3RvcmljIGJ1aWxkICh3ZWxsLCBpdCBpcyBjb21wbGV0ZWQgbm93Li4uLikKKworICAgICAgICAjIFdlIG5lZWQgdG8gdXNlIHRoZSBpdGVycyBoZXJlIHJhdGhlciB0aGFuIHRoZSBQeXRob24gaXRlcmF0b3IKKyAgICAgICAgIyBpbnRlcmZhY2UgdG8gdGhlIG1vZGVsIHNpbmNlIHdlIG5lZWQgdG8gcGFzcyBpdCBpbnRvCisgICAgICAgICMgdXBkYXRlX2J1aWxkX3Jlc3VsdAorCisgICAgICAgIGl0ZXIgPSBzZWxmLm1vZGVsLmdldF9pdGVyX2ZpcnN0KCkKKworICAgICAgICB3aGlsZSAoaXRlcik6CisgICAgICAgICAgICAoaWRlbnQsIHN0YXRlKSA9IHNlbGYubW9kZWwuZ2V0KGl0ZXIsCisgICAgICAgICAgICAgICAgQnVpbGRNYW5hZ2VyTW9kZWwuQ09MX0lERU5ULAorICAgICAgICAgICAgICAgIEJ1aWxkTWFuYWdlck1vZGVsLkNPTF9TVEFURSkKKworICAgICAgICAgICAgaWYgc3RhdGUgPT0gQnVpbGRSZXN1bHQuU1RBVEVfT05HT0lORzoKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBCdWlsZFJlc3VsdCAoc2VsZi5yZXN1bHRzX2RpcmVjdG9yeSwgaWRlbnQpCisgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVfYnVpbGRfcmVzdWx0IChyZXN1bHQsIGl0ZXIpCisgICAgICAgICAgICBpdGVyID0gc2VsZi5tb2RlbC5pdGVyX25leHQoaXRlcikKKworICAgIGRlZiBub3RpZnlfYnVpbGRfc3VjY2VlZGVkIChzZWxmKToKKyAgICAgICAgIyBXcml0ZSB0aGUgImNvbXBsZXRlIiBmaWxlIHNvIHRoYXQgd2hlbiB3ZSBjcmVhdGUgdGhlIEJ1aWxkUmVzdWx0CisgICAgICAgICMgb2JqZWN0IHdlIHB1dCBpbnRvIHRoZSBtb2RlbAorCisgICAgICAgIGNvbXBsZXRlX2ZpbGVfcGF0aCA9IG9zLnBhdGguam9pbiAoc2VsZi5jdXJfYnVpbGRfZGlyZWN0b3J5LCAiY29tcGxldGUiKQorICAgICAgICBmID0gZmlsZSAoY29tcGxldGVfZmlsZV9wYXRoLCAidyIpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBzZWxmLm5vdGlmeV9idWlsZF9maW5pc2hlZCgpCisKKyAgICBkZWYgbm90aWZ5X2J1aWxkX2ZhaWxlZCAoc2VsZik6CisgICAgICAgICMgV2l0aG91dCBhICJjb21wbGV0ZSIgZmlsZSB0aGVuIHRoaXMgd2lsbCBtYXJrIHRoZSBidWlsZCBhcyBmYWlsZWQ6CisgICAgICAgIHNlbGYubm90aWZ5X2J1aWxkX2ZpbmlzaGVkKCkKKworICAgICMgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXMgYW4gaWRsZQorICAgIGRlZiBlbWl0X3BvcHVsYXRpb25fZmluaXNoZWRfc2lnbmFsIChzZWxmKToKKyAgICAgICAgZ3RrLmdkay50aHJlYWRzX2VudGVyKCkKKyAgICAgICAgc2VsZi5lbWl0ICgicG9wdWxhdGlvbi1maW5pc2hlZCIpCisgICAgICAgIGd0ay5nZGsudGhyZWFkc19sZWF2ZSgpCisKKyAgICBjbGFzcyBCdWlsZE1hbmFnZXJQb3B1bGF0ZXJUaHJlYWQgKHRocmVhZGluZy5UaHJlYWQpOgorICAgICAgICBkZWYgX19pbml0X18gKHNlbGYsIG1hbmFnZXIsIGRpcmVjdG9yeSk6CisgICAgICAgICAgICB0aHJlYWRpbmcuVGhyZWFkLl9faW5pdF9fIChzZWxmKQorICAgICAgICAgICAgc2VsZi5tYW5hZ2VyID0gbWFuYWdlcgorICAgICAgICAgICAgc2VsZi5kaXJlY3RvcnkgPSBkaXJlY3RvcnkKKworICAgICAgICBkZWYgcnVuIChzZWxmKToKKyAgICAgICAgICAgICMgRm9yIGVhY2ggb2YgdGhlICJidWlsZC08Li4uPiIgZGlyZWN0b3JpZXMgLi4KKworICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMgKHNlbGYuZGlyZWN0b3J5KToKKyAgICAgICAgICAgICAgICBmb3IgZGlyZWN0b3J5IGluIG9zLmxpc3RkaXIgKHNlbGYuZGlyZWN0b3J5KToKKworICAgICAgICAgICAgICAgICAgICBpZiBub3QgZGlyZWN0b3J5LnN0YXJ0c3dpdGggKCJidWlsZC0iKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRfcmVzdWx0ID0gQnVpbGRSZXN1bHQgKHNlbGYuZGlyZWN0b3J5LCBkaXJlY3RvcnkpCisgICAgICAgICAgICAgICAgICAgIHNlbGYubWFuYWdlci5hZGRfYnVpbGRfcmVzdWx0IChidWlsZF9yZXN1bHQpCisKKyAgICAgICAgICAgIGdvYmplY3QuaWRsZV9hZGQgKEJ1aWxkTWFuYWdlci5lbWl0X3BvcHVsYXRpb25fZmluaXNoZWRfc2lnbmFsLAorICAgICAgICAgICAgICAgIHNlbGYubWFuYWdlcikKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgc2VydmVyLCByZXN1bHRzX2RpcmVjdG9yeSk6CisgICAgICAgIGdvYmplY3QuR09iamVjdC5fX2luaXRfXyAoc2VsZikKKworICAgICAgICAjIFRoZSBidWlsZHMgdGhhdCB3ZSd2ZSBmb3VuZCBmcm9tIHdhbGtpbmcgdGhlIHJlc3VsdCBkaXJlY3RvcnkKKyAgICAgICAgc2VsZi5rbm93bl9idWlsZHMgPSBbXQorCisgICAgICAgICMgU2F2ZSBvdXQgdGhlIGJpdGJha2Ugc2VydmVyLCB3ZSBuZWVkIHRoaXMgZm9yIGlzc3VpbmcgY29tbWFuZHMgdG8KKyAgICAgICAgIyB0aGUgY29va2VyOgorICAgICAgICBzZWxmLnNlcnZlciA9IHNlcnZlcgorCisgICAgICAgICMgVGhlIFRyZWVTdG9yZSB0aGF0IHdlIHVzZQorICAgICAgICBzZWxmLm1vZGVsID0gQnVpbGRNYW5hZ2VyTW9kZWwgKCkKKworICAgICAgICAjIFRoZSByZXN1bHRzIGRpcmVjdG9yeSBpcyB3aGVyZSB3ZSBjcmVhdGUgKGFuZCBsb29rIGZvcikgdGhlCisgICAgICAgICMgYnVpbGQtPHh5ej4tPG4+IGRpcmVjdG9yaWVzLiBXZSBuZWVkIHRvIHBvcHVsYXRlIG91cnNlbHZlcyBmcm9tCisgICAgICAgICMgZGlyZWN0b3J5CisgICAgICAgIHNlbGYucmVzdWx0c19kaXJlY3RvcnkgPSByZXN1bHRzX2RpcmVjdG9yeQorICAgICAgICBzZWxmLnBvcHVsYXRlX2Zyb21fZGlyZWN0b3J5IChzZWxmLnJlc3VsdHNfZGlyZWN0b3J5KQorCisgICAgZGVmIHBvcHVsYXRlX2Zyb21fZGlyZWN0b3J5IChzZWxmLCBkaXJlY3RvcnkpOgorICAgICAgICB0aHJlYWQgPSBCdWlsZE1hbmFnZXIuQnVpbGRNYW5hZ2VyUG9wdWxhdGVyVGhyZWFkIChzZWxmLCBkaXJlY3RvcnkpCisgICAgICAgIHRocmVhZC5zdGFydCgpCisKKyAgICAjIENvbWUgdXAgd2l0aCB0aGUgbmFtZSBmb3IgdGhlIG5leHQgYnVpbGQgaWRlbnQgYnkgY29tYmluaW5nICJidWlsZC0iCisgICAgIyB3aXRoIHRoZSBkYXRlIGZvcm1hdHRlZCBhcyB5eXl5bW1kZCBhbmQgdGhlbiBhbiBvcmRpbmFsLiBXZSBkbyB0aGlzIGJ5CisgICAgIyBhbiBvcHRpbWlzdGljIGFsZ29yaXRobSBpbmNyZW1lbnRpbmcgdGhlIG9yZGluYWwgaWYgd2UgZmluZCB0aGF0IGl0CisgICAgIyBhbHJlYWR5IGV4aXN0cy4KKyAgICBkZWYgZ2V0X25leHRfYnVpbGRfaWRlbnQgKHNlbGYpOgorICAgICAgICB0b2RheSA9IGRhdGV0aW1lLmRhdGUudG9kYXkgKCkKKyAgICAgICAgZGF0ZXN0ciA9IHN0ciAodG9kYXkueWVhcikgKyBzdHIgKHRvZGF5Lm1vbnRoKSArIHN0ciAodG9kYXkuZGF5KQorCisgICAgICAgIHJldmlzaW9uID0gMAorICAgICAgICB0ZXN0X25hbWUgPSAiYnVpbGQtJXMtJWQiICUgKGRhdGVzdHIsIHJldmlzaW9uKQorICAgICAgICB0ZXN0X3BhdGggPSBvcy5wYXRoLmpvaW4gKHNlbGYucmVzdWx0c19kaXJlY3RvcnksIHRlc3RfbmFtZSkKKworICAgICAgICB3aGlsZSAob3MucGF0aC5leGlzdHMgKHRlc3RfcGF0aCkpOgorICAgICAgICAgICAgcmV2aXNpb24gKz0gMQorICAgICAgICAgICAgdGVzdF9uYW1lID0gImJ1aWxkLSVzLSVkIiAlIChkYXRlc3RyLCByZXZpc2lvbikKKyAgICAgICAgICAgIHRlc3RfcGF0aCA9IG9zLnBhdGguam9pbiAoc2VsZi5yZXN1bHRzX2RpcmVjdG9yeSwgdGVzdF9uYW1lKQorCisgICAgICAgIHJldHVybiB0ZXN0X25hbWUKKworICAgICMgVGFrZSBhIEJ1aWxkQ29uZmlndXJhdGlvbiBhbmQgdGhlbiB0cnkgYW5kIGJ1aWxkIGl0IGJhc2VkIG9uIHRoZQorICAgICMgcGFyYW1ldGVycyBvZiB0aGF0IGNvbmZpZ3VyYXRpb24uIFMKKyAgICBkZWYgZG9fYnVpbGQgKHNlbGYsIGNvbmYpOgorICAgICAgICBzZXJ2ZXIgPSBzZWxmLnNlcnZlcgorCisgICAgICAgICMgV29yayBvdXQgdGhlIGJ1aWxkIGRpcmVjdG9yeS4gTm90ZSB3ZSBhY3R1YWxseSBjcmVhdGUgdGhlCisgICAgICAgICMgZGlyZWN0b3JpZXMgaGVyZSBzaW5jZSB3ZSBuZWVkIHRvIHdyaXRlIHRoZSAiLmNvbmYiIGZpbGUuIE90aGVyd2lzZQorICAgICAgICAjIHdlIGNvdWxkIGhhdmUgcmVsaWVkIG9uIGJpdGJha2UncyBidWlsZGVyIHRocmVhZCB0byBhY3R1YWxseSBtYWtlCisgICAgICAgICMgdGhlIGRpcmVjdG9yaWVzIGFzIGl0IHByb2NlZWRzIHdpdGggdGhlIGJ1aWxkLgorICAgICAgICBpZGVudCA9IHNlbGYuZ2V0X25leHRfYnVpbGRfaWRlbnQgKCkKKyAgICAgICAgYnVpbGRfZGlyZWN0b3J5ID0gb3MucGF0aC5qb2luIChzZWxmLnJlc3VsdHNfZGlyZWN0b3J5LAorICAgICAgICAgICAgaWRlbnQpCisgICAgICAgIHNlbGYuY3VyX2J1aWxkX2RpcmVjdG9yeSA9IGJ1aWxkX2RpcmVjdG9yeQorICAgICAgICBvcy5tYWtlZGlycyAoYnVpbGRfZGlyZWN0b3J5KQorCisgICAgICAgIGNvbmZmaWxlID0gb3MucGF0aC5qb2luIChidWlsZF9kaXJlY3RvcnksICIuY29uZiIpCisgICAgICAgIGNvbmYud3JpdGVfdG9fZmlsZSAoY29uZmZpbGUpCisKKyAgICAgICAgIyBBZGQgYSByb3cgdG8gdGhlIG1vZGVsIHJlcHJlc2VudGluZyB0aGlzIG9uZ29pbmcgYnVpbGQuIEl0J3Mga2luZGEgYQorICAgICAgICAjIGZha2UgZW50cnkuIElmIHRoaXMgYnVpbGQgY29tcGxldGVzIG9yIGZhaWxzIHRoZW4gdGhpcyBnZXRzIHVwZGF0ZWQKKyAgICAgICAgIyB3aXRoIHRoZSByZWFsIHN0dWZmIGxpa2UgdGhlIGhpc3RvcmljIGJ1aWxkcworICAgICAgICBkYXRlID0gbG9uZyAodGltZS50aW1lKCkpCisgICAgICAgIHNlbGYubW9kZWwuYXBwZW5kIChOb25lLCAoaWRlbnQsIGNvbmYuaW1hZ2UsIGNvbmYubWFjaGluZSwgY29uZi5kaXN0cm8sCisgICAgICAgICAgICBOb25lLCBkYXRlLCBCdWlsZFJlc3VsdC5TVEFURV9PTkdPSU5HKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VydmVyLnJ1bkNvbW1hbmQoWyJzZXRWYXJpYWJsZSIsICJCVUlMRF9JTUFHRVNfRlJPTV9GRUVEUyIsIDFdKQorICAgICAgICAgICAgc2VydmVyLnJ1bkNvbW1hbmQoWyJzZXRWYXJpYWJsZSIsICJNQUNISU5FIiwgY29uZi5tYWNoaW5lXSkKKyAgICAgICAgICAgIHNlcnZlci5ydW5Db21tYW5kKFsic2V0VmFyaWFibGUiLCAiRElTVFJPIiwgY29uZi5kaXN0cm9dKQorICAgICAgICAgICAgc2VydmVyLnJ1bkNvbW1hbmQoWyJzZXRWYXJpYWJsZSIsICJQQUNLQUdFX0NMQVNTRVMiLCAicGFja2FnZV9pcGsiXSkKKyAgICAgICAgICAgIHNlcnZlci5ydW5Db21tYW5kKFsic2V0VmFyaWFibGUiLCAiQkJGSUxFUyIsIFwKKyAgICAgICAgICAgICAgIiIiJHtPRVJPT1R9L21ldGEvcGFja2FnZXMvKi8qLmJiICR7T0VST09UfS9tZXRhLW1vYmxpbi9wYWNrYWdlcy8qLyouYmIiIiJdKQorICAgICAgICAgICAgc2VydmVyLnJ1bkNvbW1hbmQoWyJzZXRWYXJpYWJsZSIsICJUTVBESVIiLCAiJHtPRVJPT1R9L2J1aWxkL3RtcCJdKQorICAgICAgICAgICAgc2VydmVyLnJ1bkNvbW1hbmQoWyJzZXRWYXJpYWJsZSIsICJJUEtfRkVFRF9VUklTIiwgXAorICAgICAgICAgICAgICAgICIgIi5qb2luKGNvbmYuZ2V0X3JlcG9zKCkpXSkKKyAgICAgICAgICAgIHNlcnZlci5ydW5Db21tYW5kKFsic2V0VmFyaWFibGUiLCAiREVQTE9ZX0RJUl9JTUFHRSIsCisgICAgICAgICAgICAgICAgYnVpbGRfZGlyZWN0b3J5XSkKKyAgICAgICAgICAgIHNlcnZlci5ydW5Db21tYW5kKFsiYnVpbGRUYXJnZXRzIiwgW2NvbmYuaW1hZ2VdLCAicm9vdGZzIl0pCisKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgcHJpbnQoZSkKKworY2xhc3MgQnVpbGRNYW5hZ2VyVHJlZVZpZXcgKGd0ay5UcmVlVmlldyk6CisgICAgIiIiIFRoZSB0cmVlIHZpZXcgZm9yIHRoZSBidWlsZCBtYW5hZ2VyLiBUaGlzIHNob3dzIHRoZSBoaXN0b3JpYyBidWlsZHMKKyAgICBhbmQgc28gZm9ydGguICIiIgorCisgICAgIyBXZSB1c2UgdGhpcyBmdW5jdGlvbiB0byBjb250cm9sIHdoYXQgZ29lcyBpbiB0aGUgY2VsbCBzaW5jZSB3ZSBzdG9yZQorICAgICMgdGhlIGRhdGUgaW4gdGhlIG1vZGVsIGFzIHNlY29uZHMgc2luY2UgdGhlIGVwb2NoIChmb3Igc29ydGluZykgYW5kIHNvIHdlCisgICAgIyBuZWVkIHRvIG1ha2UgaXQgaHVtYW4gcmVhZGFibGUuCisgICAgZGVmIGRhdGVfZm9ybWF0X2N1c3RvbV9jZWxsX2RhdGFfZnVuYyAoc2VsZiwgY29sLCBjZWxsLCBtb2RlbCwgaXRlcik6CisgICAgICAgIGRhdGUgPSBtb2RlbC5nZXQgKGl0ZXIsIEJ1aWxkTWFuYWdlck1vZGVsLkNPTF9EQVRFKVswXQorICAgICAgICBkYXRlc3RyID0gdGltZS5zdHJmdGltZSgiJUEgJWQgJUIgJVkiLCB0aW1lLmxvY2FsdGltZShkYXRlKSkKKyAgICAgICAgY2VsbC5zZXRfcHJvcGVydHkgKCJ0ZXh0IiwgZGF0ZXN0cikKKworICAgICMgVGhpcyBmb3JtYXQgZnVuY3Rpb24gY29udHJvbHMgd2hhdCBnb2VzIGluIHRoZSBjZWxsLiBXZSB1c2UgdGhpcyB0byBtYXAKKyAgICAjIHRoZSBpbnRlZ2VyIHN0YXRlIHRvIGEgc3RyaW5nIGFuZCBhbHNvIHRvIGNvbG91cmlzZSB0aGUgdGV4dAorICAgIGRlZiBzdGF0ZV9mb3JtYXRfY3VzdG9tX2NlbGxfZGF0YV9mdW4gKHNlbGYsIGNvbCwgY2VsbCwgbW9kZWwsIGl0ZXIpOgorICAgICAgICBzdGF0ZSA9IG1vZGVsLmdldCAoaXRlciwgQnVpbGRNYW5hZ2VyTW9kZWwuQ09MX1NUQVRFKVswXQorCisgICAgICAgIGlmIChzdGF0ZSA9PSBCdWlsZFJlc3VsdC5TVEFURV9PTkdPSU5HKToKKyAgICAgICAgICAgIGNlbGwuc2V0X3Byb3BlcnR5ICgidGV4dCIsICJBY3RpdmUiKQorICAgICAgICAgICAgY2VsbC5zZXRfcHJvcGVydHkgKCJmb3JlZ3JvdW5kIiwgIiMwMDAwMDAiKQorICAgICAgICBlbGlmIChzdGF0ZSA9PSBCdWlsZFJlc3VsdC5TVEFURV9GQUlMRUQpOgorICAgICAgICAgICAgY2VsbC5zZXRfcHJvcGVydHkgKCJ0ZXh0IiwgIkZhaWxlZCIpCisgICAgICAgICAgICBjZWxsLnNldF9wcm9wZXJ0eSAoImZvcmVncm91bmQiLCAiI2ZmMDAwMCIpCisgICAgICAgIGVsaWYgKHN0YXRlID09IEJ1aWxkUmVzdWx0LlNUQVRFX0NPTVBMRVRFKToKKyAgICAgICAgICAgIGNlbGwuc2V0X3Byb3BlcnR5ICgidGV4dCIsICJDb21wbGV0ZSIpCisgICAgICAgICAgICBjZWxsLnNldF9wcm9wZXJ0eSAoImZvcmVncm91bmQiLCAiIzAwZmYwMCIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjZWxsLnNldF9wcm9wZXJ0eSAoInRleHQiLCAiIikKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZik6CisgICAgICAgIGd0ay5UcmVlVmlldy5fX2luaXRfXyhzZWxmKQorCisgICAgICAgICMgTWlzYyBkZXNjcmlwdGlvbnkgdGhpbmcKKyAgICAgICAgcmVuZGVyZXIgPSBndGsuQ2VsbFJlbmRlcmVyVGV4dCAoKQorICAgICAgICBjb2wgPSBndGsuVHJlZVZpZXdDb2x1bW4gKE5vbmUsIHJlbmRlcmVyLAorICAgICAgICAgICAgdGV4dD1CdWlsZE1hbmFnZXJNb2RlbC5DT0xfREVTQykKKyAgICAgICAgc2VsZi5hcHBlbmRfY29sdW1uIChjb2wpCisKKyAgICAgICAgIyBNYWNoaW5lCisgICAgICAgIHJlbmRlcmVyID0gZ3RrLkNlbGxSZW5kZXJlclRleHQgKCkKKyAgICAgICAgY29sID0gZ3RrLlRyZWVWaWV3Q29sdW1uICgiTWFjaGluZSIsIHJlbmRlcmVyLAorICAgICAgICAgICAgdGV4dD1CdWlsZE1hbmFnZXJNb2RlbC5DT0xfTUFDSElORSkKKyAgICAgICAgc2VsZi5hcHBlbmRfY29sdW1uIChjb2wpCisKKyAgICAgICAgIyBkaXN0cm8KKyAgICAgICAgcmVuZGVyZXIgPSBndGsuQ2VsbFJlbmRlcmVyVGV4dCAoKQorICAgICAgICBjb2wgPSBndGsuVHJlZVZpZXdDb2x1bW4gKCJEaXN0cmlidXRpb24iLCByZW5kZXJlciwKKyAgICAgICAgICAgIHRleHQ9QnVpbGRNYW5hZ2VyTW9kZWwuQ09MX0RJU1RSTykKKyAgICAgICAgc2VsZi5hcHBlbmRfY29sdW1uIChjb2wpCisKKyAgICAgICAgIyBkYXRlICh1c2luZyBhIGN1c3RvbSBmdW5jdGlvbiBmb3IgZm9ybWF0dGluZyB0aGUgY2VsbCBjb250ZW50cyBpdAorICAgICAgICAjIHRha2VzIGVwb2NoIC0+IGh1bWFuIHJlYWRhYmxlIHN0cmluZykKKyAgICAgICAgcmVuZGVyZXIgPSBndGsuQ2VsbFJlbmRlcmVyVGV4dCAoKQorICAgICAgICBjb2wgPSBndGsuVHJlZVZpZXdDb2x1bW4gKCJEYXRlIiwgcmVuZGVyZXIsCisgICAgICAgICAgICB0ZXh0PUJ1aWxkTWFuYWdlck1vZGVsLkNPTF9EQVRFKQorICAgICAgICBzZWxmLmFwcGVuZF9jb2x1bW4gKGNvbCkKKyAgICAgICAgY29sLnNldF9jZWxsX2RhdGFfZnVuYyAocmVuZGVyZXIsCisgICAgICAgICAgICBzZWxmLmRhdGVfZm9ybWF0X2N1c3RvbV9jZWxsX2RhdGFfZnVuYykKKworICAgICAgICAjIEZvciBzdGF0dXMuCisgICAgICAgIHJlbmRlcmVyID0gZ3RrLkNlbGxSZW5kZXJlclRleHQgKCkKKyAgICAgICAgY29sID0gZ3RrLlRyZWVWaWV3Q29sdW1uICgiU3RhdHVzIiwgcmVuZGVyZXIsCisgICAgICAgICAgICB0ZXh0ID0gQnVpbGRNYW5hZ2VyTW9kZWwuQ09MX1NUQVRFKQorICAgICAgICBzZWxmLmFwcGVuZF9jb2x1bW4gKGNvbCkKKyAgICAgICAgY29sLnNldF9jZWxsX2RhdGFfZnVuYyAocmVuZGVyZXIsCisgICAgICAgICAgICBzZWxmLnN0YXRlX2Zvcm1hdF9jdXN0b21fY2VsbF9kYXRhX2Z1bikKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9oaWcvX19pbml0X18ucHkgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaGlnL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaGlnL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaGlnL2FkdmFuY2Vkc2V0dGluZ3NkaWFsb2cucHkgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaGlnL2FkdmFuY2Vkc2V0dGluZ3NkaWFsb2cucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBiMzU1MwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9oaWcvYWR2YW5jZWRzZXR0aW5nc2RpYWxvZy5weQpAQCAtMCwwICsxLDM0MSBAQAorIworIyBCaXRCYWtlIEdyYXBoaWNhbCBHVEsgVXNlciBJbnRlcmZhY2UKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgICBJbnRlbCBDb3Jwb3JhdGlvbgorIworIyBBdXRob3JlZCBieSBKb3NodWEgTG9jayA8am9zaEBsaW51eC5pbnRlbC5jb20+CisjIEF1dGhvcmVkIGJ5IERvbmd4aWFvIFh1IDxkb25neGlhby54dUBpbnRlbC5jb20+CisjIEF1dGhvcmVkIGJ5IFNoYW5lIFdhbmcgPHNoYW5lLndhbmdAaW50ZWwuY29tPgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworaW1wb3J0IGd0aworaW1wb3J0IGhhc2hsaWIKK2Zyb20gYmIudWkuY3J1bWJzLmhvYndpZGdldCBpbXBvcnQgSG9iSW5mb0J1dHRvbiwgSG9iQnV0dG9uCitmcm9tIGJiLnVpLmNydW1icy5wcm9ncmVzc2JhciBpbXBvcnQgSG9iUHJvZ3Jlc3NCYXIKK2Zyb20gYmIudWkuY3J1bWJzLmhpZy5zZXR0aW5nc3VpaGVscGVyIGltcG9ydCBTZXR0aW5nc1VJSGVscGVyCitmcm9tIGJiLnVpLmNydW1icy5oaWcuY3J1bWJzZGlhbG9nIGltcG9ydCBDcnVtYnNEaWFsb2cKK2Zyb20gYmIudWkuY3J1bWJzLmhpZy5jcnVtYnNtZXNzYWdlZGlhbG9nIGltcG9ydCBDcnVtYnNNZXNzYWdlRGlhbG9nCitmcm9tIGJiLnVpLmNydW1icy5oaWcucHJveHlkZXRhaWxzZGlhbG9nIGltcG9ydCBQcm94eURldGFpbHNEaWFsb2cKKworIiIiCitUaGUgZm9sbG93aW5nIGFyZSBjb252ZW5pZW5jZSBjbGFzc2VzIGZvciBpbXBsZW1lbnRpbmcgR05PTUUgSElHIGNvbXBsaWFudAorQml0QmFrZSBHVUkncworSW4gc3VtbWFyeTogc3BhY2luZyA9IDEycHgsIGJvcmRlci13aWR0aCA9IDZweAorIiIiCisKK2NsYXNzIEFkdmFuY2VkU2V0dGluZ3NEaWFsb2cgKENydW1ic0RpYWxvZywgU2V0dGluZ3NVSUhlbHBlcik6CisgICAgCisgICAgZGVmIGRldGFpbHNfY2Ioc2VsZiwgYnV0dG9uLCBwYXJlbnQsIHByb3RvY29sKToKKyAgICAgICAgZGlhbG9nID0gUHJveHlEZXRhaWxzRGlhbG9nKHRpdGxlID0gcHJvdG9jb2wudXBwZXIoKSArICIgUHJveHkgRGV0YWlscyIsCisgICAgICAgICAgICB1c2VyID0gc2VsZi5jb25maWd1cmF0aW9uLnByb3hpZXNbcHJvdG9jb2xdWzFdLAorICAgICAgICAgICAgcGFzc3dkID0gc2VsZi5jb25maWd1cmF0aW9uLnByb3hpZXNbcHJvdG9jb2xdWzJdLAorICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LAorICAgICAgICAgICAgZmxhZ3MgPSBndGsuRElBTE9HX01PREFMCisgICAgICAgICAgICAgICAgICAgIHwgZ3RrLkRJQUxPR19ERVNUUk9ZX1dJVEhfUEFSRU5UCisgICAgICAgICAgICAgICAgICAgIHwgZ3RrLkRJQUxPR19OT19TRVBBUkFUT1IpCisgICAgICAgIGRpYWxvZy5hZGRfYnV0dG9uKGd0ay5TVE9DS19DTE9TRSwgZ3RrLlJFU1BPTlNFX09LKQorICAgICAgICByZXNwb25zZSA9IGRpYWxvZy5ydW4oKQorICAgICAgICBpZiByZXNwb25zZSA9PSBndGsuUkVTUE9OU0VfT0s6CisgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24ucHJveGllc1twcm90b2NvbF1bMV0gPSBkaWFsb2cudXNlcgorICAgICAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLnByb3hpZXNbcHJvdG9jb2xdWzJdID0gZGlhbG9nLnBhc3N3ZAorICAgICAgICAgICAgc2VsZi5yZWZyZXNoX3Byb3h5X2NvbXBvbmVudHMoKQorICAgICAgICBkaWFsb2cuZGVzdHJveSgpCisKKyAgICBkZWYgc2V0X3NhdmVfYnV0dG9uKHNlbGYsIGJ1dHRvbik6CisgICAgICAgIHNlbGYuc2F2ZV9idXR0b24gPSBidXR0b24KKworICAgIGRlZiByb290ZnNfY29tYm9fY2hhbmdlZF9jYihzZWxmLCByb290ZnNfY29tYm8sIGFsbF9wYWNrYWdlX2Zvcm1hdCwgY2hlY2tfaGJveCk6CisgICAgICAgIGNvbWJvX2l0ZW0gPSBzZWxmLnJvb3Rmc19jb21iby5nZXRfYWN0aXZlX3RleHQoKQorICAgICAgICBtb2RpZmllZCA9IEZhbHNlCisgICAgICAgIGZvciBjaGlsZCBpbiBjaGVja19oYm94LmdldF9jaGlsZHJlbigpOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShjaGlsZCwgZ3RrLkNoZWNrQnV0dG9uKToKKyAgICAgICAgICAgICAgICBjaGVja19oYm94LnJlbW92ZShjaGlsZCkKKyAgICAgICAgICAgICAgICBtb2RpZmllZCA9IFRydWUKKyAgICAgICAgZm9yIGZvcm1hdCBpbiBhbGxfcGFja2FnZV9mb3JtYXQ6CisgICAgICAgICAgICBpZiBmb3JtYXQgIT0gY29tYm9faXRlbToKKyAgICAgICAgICAgICAgICBjaGVja19idXR0b24gPSBndGsuQ2hlY2tCdXR0b24oZm9ybWF0KQorICAgICAgICAgICAgICAgIGNoZWNrX2hib3gucGFja19zdGFydChjaGVja19idXR0b24sIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgICAgICAgICBtb2RpZmllZCA9IFRydWUKKyAgICAgICAgaWYgbW9kaWZpZWQ6CisgICAgICAgICAgICBjaGVja19oYm94LnJlbW92ZShzZWxmLnBrZ2ZtdF9pbmZvKQorICAgICAgICAgICAgY2hlY2tfaGJveC5wYWNrX3N0YXJ0KHNlbGYucGtnZm10X2luZm8sIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgY2hlY2tfaGJveC5zaG93X2FsbCgpCisKKyAgICBkZWYgZ2VuX3BrZ2ZtdF93aWRnZXQoc2VsZiwgY3Vycl9wYWNrYWdlX2Zvcm1hdCwgYWxsX3BhY2thZ2VfZm9ybWF0LCB0b29sdGlwX2NvbWJvPSIiLCB0b29sdGlwX2V4dHJhPSIiKToKKyAgICAgICAgcGtnZm10X3Zib3ggPSBndGsuVkJveChGYWxzZSwgNikKKworICAgICAgICBsYWJlbCA9IHNlbGYuZ2VuX2xhYmVsX3dpZGdldCgiUm9vdCBmaWxlIHN5c3RlbSBwYWNrYWdlIGZvcm1hdCIpCisgICAgICAgIHBrZ2ZtdF92Ym94LnBhY2tfc3RhcnQobGFiZWwsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKworICAgICAgICByb290ZnNfZm9ybWF0ID0gIiIKKyAgICAgICAgaWYgY3Vycl9wYWNrYWdlX2Zvcm1hdDoKKyAgICAgICAgICAgIHJvb3Rmc19mb3JtYXQgPSBjdXJyX3BhY2thZ2VfZm9ybWF0LnNwbGl0KClbMF0KKworICAgICAgICByb290ZnNfZm9ybWF0X3dpZGdldCwgcm9vdGZzX2NvbWJvID0gc2VsZi5nZW5fY29tYm9fd2lkZ2V0KHJvb3Rmc19mb3JtYXQsIGFsbF9wYWNrYWdlX2Zvcm1hdCwgdG9vbHRpcF9jb21ibykKKyAgICAgICAgcGtnZm10X3Zib3gucGFja19zdGFydChyb290ZnNfZm9ybWF0X3dpZGdldCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorCisgICAgICAgIGxhYmVsID0gc2VsZi5nZW5fbGFiZWxfd2lkZ2V0KCJBZGRpdGlvbmFsIHBhY2thZ2UgZm9ybWF0cyIpCisgICAgICAgIHBrZ2ZtdF92Ym94LnBhY2tfc3RhcnQobGFiZWwsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKworICAgICAgICBjaGVja19oYm94ID0gZ3RrLkhCb3goRmFsc2UsIDEyKQorICAgICAgICBwa2dmbXRfdmJveC5wYWNrX3N0YXJ0KGNoZWNrX2hib3gsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgZm9yIGZvcm1hdCBpbiBhbGxfcGFja2FnZV9mb3JtYXQ6CisgICAgICAgICAgICBpZiBmb3JtYXQgIT0gcm9vdGZzX2Zvcm1hdDoKKyAgICAgICAgICAgICAgICBjaGVja19idXR0b24gPSBndGsuQ2hlY2tCdXR0b24oZm9ybWF0KQorICAgICAgICAgICAgICAgIGlzX2FjdGl2ZSA9IChmb3JtYXQgaW4gY3Vycl9wYWNrYWdlX2Zvcm1hdC5zcGxpdCgpKQorICAgICAgICAgICAgICAgIGNoZWNrX2J1dHRvbi5zZXRfYWN0aXZlKGlzX2FjdGl2ZSkKKyAgICAgICAgICAgICAgICBjaGVja19oYm94LnBhY2tfc3RhcnQoY2hlY2tfYnV0dG9uLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgc2VsZi5wa2dmbXRfaW5mbyA9IEhvYkluZm9CdXR0b24odG9vbHRpcF9leHRyYSwgc2VsZikKKyAgICAgICAgY2hlY2tfaGJveC5wYWNrX3N0YXJ0KHNlbGYucGtnZm10X2luZm8sIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKworICAgICAgICByb290ZnNfY29tYm8uY29ubmVjdCgiY2hhbmdlZCIsIHNlbGYucm9vdGZzX2NvbWJvX2NoYW5nZWRfY2IsIGFsbF9wYWNrYWdlX2Zvcm1hdCwgY2hlY2tfaGJveCkKKworICAgICAgICBwa2dmbXRfdmJveC5zaG93X2FsbCgpCisKKyAgICAgICAgcmV0dXJuIHBrZ2ZtdF92Ym94LCByb290ZnNfY29tYm8sIGNoZWNrX2hib3gKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0aXRsZSwgY29uZmlndXJhdGlvbiwgYWxsX2ltYWdlX3R5cGVzLAorICAgICAgICAgICAgYWxsX3BhY2thZ2VfZm9ybWF0cywgYWxsX2Rpc3Ryb3MsIGFsbF9zZGtfbWFjaGluZXMsCisgICAgICAgICAgICBtYXhfdGhyZWFkcywgcGFyZW50LCBmbGFncywgYnV0dG9ucz1Ob25lKToKKyAgICAgICAgc3VwZXIoQWR2YW5jZWRTZXR0aW5nc0RpYWxvZywgc2VsZikuX19pbml0X18odGl0bGUsIHBhcmVudCwgZmxhZ3MsIGJ1dHRvbnMpCisKKyAgICAgICAgIyBjbGFzcyBtZW1iZXJzIGZyb20gb3RoZXIgb2JqZWN0cworICAgICAgICAjIGJpdGJha2Ugc2V0dGluZ3MgZnJvbSBCdWlsZGVyLkNvbmZpZ3VyYXRpb24KKyAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbgorICAgICAgICBzZWxmLmltYWdlX3R5cGVzID0gYWxsX2ltYWdlX3R5cGVzCisgICAgICAgIHNlbGYuYWxsX3BhY2thZ2VfZm9ybWF0cyA9IGFsbF9wYWNrYWdlX2Zvcm1hdHMKKyAgICAgICAgc2VsZi5hbGxfZGlzdHJvcyA9IGFsbF9kaXN0cm9zWzpdCisgICAgICAgIHNlbGYuYWxsX3Nka19tYWNoaW5lcyA9IGFsbF9zZGtfbWFjaGluZXMKKyAgICAgICAgc2VsZi5tYXhfdGhyZWFkcyA9IG1heF90aHJlYWRzCisKKyAgICAgICAgIyBjbGFzcyBtZW1iZXJzIGZvciBpbnRlcm5hbCB1c2UKKyAgICAgICAgc2VsZi5kaXN0cm9fY29tYm8gPSBOb25lCisgICAgICAgIHNlbGYuZGxkaXJfdGV4dCA9IE5vbmUKKyAgICAgICAgc2VsZi5zc3RhdGVkaXJfdGV4dCA9IE5vbmUKKyAgICAgICAgc2VsZi5zc3RhdGVtaXJyb3JfdGV4dCA9IE5vbmUKKyAgICAgICAgc2VsZi5iYl9zcGlubmVyID0gTm9uZQorICAgICAgICBzZWxmLnBtYWtlX3NwaW5uZXIgPSBOb25lCisgICAgICAgIHNlbGYucm9vdGZzX3NpemVfc3Bpbm5lciA9IE5vbmUKKyAgICAgICAgc2VsZi5leHRyYV9zaXplX3NwaW5uZXIgPSBOb25lCisgICAgICAgIHNlbGYuZ3BsdjNfY2hlY2tib3ggPSBOb25lCisgICAgICAgIHNlbGYuc2RrX2NoZWNrYm94ID0gTm9uZQorICAgICAgICBzZWxmLmltYWdlX3R5cGVzX2NoZWNrYnV0dG9ucyA9IHt9CisKKyAgICAgICAgc2VsZi5tZDUgPSBzZWxmLmNvbmZpZ19tZDUoKQorICAgICAgICBzZWxmLnNldHRpbmdzX2NoYW5nZWQgPSBGYWxzZQorCisgICAgICAgICMgY3JlYXRlIHZpc3VhbCBlbGVtZW50cyBvbiB0aGUgZGlhbG9nCisgICAgICAgIHNlbGYuc2F2ZV9idXR0b24gPSBOb25lCisgICAgICAgIHNlbGYuY3JlYXRlX3Zpc3VhbF9lbGVtZW50cygpCisgICAgICAgIHNlbGYuY29ubmVjdCgicmVzcG9uc2UiLCBzZWxmLnJlc3BvbnNlX2NiKQorCisgICAgZGVmIF9nZXRfc29ydGVkX3ZhbHVlKHNlbGYsIHZhcik6CisgICAgICAgIHJldHVybiAiICIuam9pbihzb3J0ZWQoc3RyKHZhcikuc3BsaXQoKSkpICsgIlxuIgorCisgICAgZGVmIGNvbmZpZ19tZDUoc2VsZik6CisgICAgICAgIGRhdGEgPSAiIgorICAgICAgICBkYXRhICs9ICgiUEFDS0FHRV9DTEFTU0VTOiAiICAgICAgKyBzZWxmLmNvbmZpZ3VyYXRpb24uY3Vycl9wYWNrYWdlX2Zvcm1hdCArICdcbicpCisgICAgICAgIGRhdGEgKz0gKCJESVNUUk86ICIgICAgICAgICAgICAgICArIHNlbGYuX2dldF9zb3J0ZWRfdmFsdWUoc2VsZi5jb25maWd1cmF0aW9uLmN1cnJfZGlzdHJvKSkKKyAgICAgICAgZGF0YSArPSAoIklNQUdFX1JPT1RGU19TSVpFOiAiICAgICsgc2VsZi5fZ2V0X3NvcnRlZF92YWx1ZShzZWxmLmNvbmZpZ3VyYXRpb24uaW1hZ2Vfcm9vdGZzX3NpemUpKQorICAgICAgICBkYXRhICs9ICgiSU1BR0VfRVhUUkFfU0laRTogIiAgICAgKyBzZWxmLl9nZXRfc29ydGVkX3ZhbHVlKHNlbGYuY29uZmlndXJhdGlvbi5pbWFnZV9leHRyYV9zaXplKSkKKyAgICAgICAgZGF0YSArPSAoIklOQ09NUEFUSUJMRV9MSUNFTlNFOiAiICsgc2VsZi5fZ2V0X3NvcnRlZF92YWx1ZShzZWxmLmNvbmZpZ3VyYXRpb24uaW5jb21wYXRfbGljZW5zZSkpCisgICAgICAgIGRhdGEgKz0gKCJTREtfTUFDSElORTogIiAgICAgICAgICArIHNlbGYuX2dldF9zb3J0ZWRfdmFsdWUoc2VsZi5jb25maWd1cmF0aW9uLmN1cnJfc2RrX21hY2hpbmUpKQorICAgICAgICBkYXRhICs9ICgiVE9PTENIQUlOX0JVSUxEOiAiICAgICAgKyBzZWxmLl9nZXRfc29ydGVkX3ZhbHVlKHNlbGYuY29uZmlndXJhdGlvbi50b29sY2hhaW5fYnVpbGQpKQorICAgICAgICBkYXRhICs9ICgiSU1BR0VfRlNUWVBFUzogIiAgICAgICAgKyBzZWxmLl9nZXRfc29ydGVkX3ZhbHVlKHNlbGYuY29uZmlndXJhdGlvbi5pbWFnZV9mc3R5cGVzKSkKKyAgICAgICAgcmV0dXJuIGhhc2hsaWIubWQ1KGRhdGEpLmhleGRpZ2VzdCgpCisKKyAgICBkZWYgY3JlYXRlX3Zpc3VhbF9lbGVtZW50cyhzZWxmKToKKyAgICAgICAgc2VsZi5uYiA9IGd0ay5Ob3RlYm9vaygpCisgICAgICAgIHNlbGYubmIuc2V0X3Nob3dfdGFicyhUcnVlKQorICAgICAgICBzZWxmLm5iLmFwcGVuZF9wYWdlKHNlbGYuY3JlYXRlX2ltYWdlX3R5cGVzX3BhZ2UoKSwgZ3RrLkxhYmVsKCJJbWFnZSB0eXBlcyIpKQorICAgICAgICBzZWxmLm5iLmFwcGVuZF9wYWdlKHNlbGYuY3JlYXRlX291dHB1dF9wYWdlKCksIGd0ay5MYWJlbCgiT3V0cHV0IikpCisgICAgICAgIHNlbGYubmIuc2V0X2N1cnJlbnRfcGFnZSgwKQorICAgICAgICBzZWxmLnZib3gucGFja19zdGFydChzZWxmLm5iLCBleHBhbmQ9VHJ1ZSwgZmlsbD1UcnVlKQorICAgICAgICBzZWxmLnZib3gucGFja19lbmQoZ3RrLkhTZXBhcmF0b3IoKSwgZXhwYW5kPVRydWUsIGZpbGw9VHJ1ZSkKKworICAgICAgICBzZWxmLnNob3dfYWxsKCkKKworICAgIGRlZiBnZXRfbnVtX2NoZWNrZWRfaW1hZ2VfdHlwZXMoc2VsZik6CisgICAgICAgIHRvdGFsID0gMAorICAgICAgICBmb3IgYiBpbiBzZWxmLmltYWdlX3R5cGVzX2NoZWNrYnV0dG9ucy52YWx1ZXMoKToKKyAgICAgICAgICAgIGlmIGIuZ2V0X2FjdGl2ZSgpOgorICAgICAgICAgICAgICB0b3RhbCA9IHRvdGFsICsgMQorICAgICAgICByZXR1cm4gdG90YWwKKworICAgIGRlZiBzZXRfc2F2ZV9idXR0b25fc3RhdGUoc2VsZik6CisgICAgICAgIGlmIHNlbGYuc2F2ZV9idXR0b246CisgICAgICAgICAgICBzZWxmLnNhdmVfYnV0dG9uLnNldF9zZW5zaXRpdmUoc2VsZi5nZXRfbnVtX2NoZWNrZWRfaW1hZ2VfdHlwZXMoKSA+IDApCisKKyAgICBkZWYgaW1hZ2VfdHlwZV9jaGVja2J1dHRvbl9jbGlja2VkX2NiKHNlbGYsIGJ1dHRvbik6CisgICAgICAgIHNlbGYuc2V0X3NhdmVfYnV0dG9uX3N0YXRlKCkKKyAgICAgICAgaWYgc2VsZi5nZXRfbnVtX2NoZWNrZWRfaW1hZ2VfdHlwZXMoKSA9PSAwOgorICAgICAgICAgICAgIyBTaG93IGFuIGVycm9yIGRpYWxvZworICAgICAgICAgICAgbGJsID0gIjxiPlNlbGVjdCBhbiBpbWFnZSB0eXBlPC9iPiIKKyAgICAgICAgICAgIG1zZyA9ICJZb3UgbmVlZCB0byBzZWxlY3QgYXQgbGVhc3Qgb25lIGltYWdlIHR5cGUuIgorICAgICAgICAgICAgZGlhbG9nID0gQ3J1bWJzTWVzc2FnZURpYWxvZyhzZWxmLCBsYmwsIGd0ay5NRVNTQUdFX1dBUk5JTkcsIG1zZykKKyAgICAgICAgICAgIGJ1dHRvbiA9IGRpYWxvZy5hZGRfYnV0dG9uKCJPSyIsIGd0ay5SRVNQT05TRV9PSykKKyAgICAgICAgICAgIEhvYkJ1dHRvbi5zdHlsZV9idXR0b24oYnV0dG9uKQorICAgICAgICAgICAgcmVzcG9uc2UgPSBkaWFsb2cucnVuKCkKKyAgICAgICAgICAgIGRpYWxvZy5kZXN0cm95KCkKKworICAgIGRlZiBjcmVhdGVfaW1hZ2VfdHlwZXNfcGFnZShzZWxmKToKKyAgICAgICAgbWFpbl92Ym94ID0gZ3RrLlZCb3goRmFsc2UsIDE2KQorICAgICAgICBtYWluX3Zib3guc2V0X2JvcmRlcl93aWR0aCg2KQorCisgICAgICAgIGFkdmFuY2VkX3Zib3ggPSBndGsuVkJveChGYWxzZSwgNikKKyAgICAgICAgYWR2YW5jZWRfdmJveC5zZXRfYm9yZGVyX3dpZHRoKDYpCisKKyAgICAgICAgZGlzdHJvX3Zib3ggPSBndGsuVkJveChGYWxzZSwgNikgICAgICAgIAorICAgICAgICBsYWJlbCA9IHNlbGYuZ2VuX2xhYmVsX3dpZGdldCgiRGlzdHJvOiIpCisgICAgICAgIHRvb2x0aXAgPSAiU2VsZWN0cyB0aGUgWW9jdG8gUHJvamVjdCBkaXN0cmlidXRpb24geW91IHdhbnQiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGkgPSBzZWxmLmFsbF9kaXN0cm9zLmluZGV4KCAiZGVmYXVsdHNldHVwIiApCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgaSA9IC0xCisgICAgICAgIGlmIGkgIT0gLTE6CisgICAgICAgICAgICBzZWxmLmFsbF9kaXN0cm9zWyBpIF0gPSAiRGVmYXVsdCIKKyAgICAgICAgICAgIGlmIHNlbGYuY29uZmlndXJhdGlvbi5jdXJyX2Rpc3RybyA9PSAiZGVmYXVsdHNldHVwIjoKKyAgICAgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uY3Vycl9kaXN0cm8gPSAiRGVmYXVsdCIKKyAgICAgICAgZGlzdHJvX3dpZGdldCwgc2VsZi5kaXN0cm9fY29tYm8gPSBzZWxmLmdlbl9jb21ib193aWRnZXQoc2VsZi5jb25maWd1cmF0aW9uLmN1cnJfZGlzdHJvLCBzZWxmLmFsbF9kaXN0cm9zLCI8Yj5EaXN0cm88L2I+IiArICIqIiArIHRvb2x0aXApCisgICAgICAgIGRpc3Ryb192Ym94LnBhY2tfc3RhcnQobGFiZWwsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgZGlzdHJvX3Zib3gucGFja19zdGFydChkaXN0cm9fd2lkZ2V0LCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIG1haW5fdmJveC5wYWNrX3N0YXJ0KGRpc3Ryb192Ym94LCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKworICAgICAgICByb3dzID0gKGxlbihzZWxmLmltYWdlX3R5cGVzKSsxKS8zCisgICAgICAgIHRhYmxlID0gZ3RrLlRhYmxlKHJvd3MgKyAxLCAxMCwgVHJ1ZSkKKyAgICAgICAgYWR2YW5jZWRfdmJveC5wYWNrX3N0YXJ0KHRhYmxlLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgdG9vbHRpcCA9ICJJbWFnZSBmaWxlIHN5c3RlbSB0eXBlcyB5b3Ugd2FudC4iCisgICAgICAgIGluZm8gPSBIb2JJbmZvQnV0dG9uKCI8Yj5JbWFnZSB0eXBlczwvYj4iICsgIioiICsgdG9vbHRpcCwgc2VsZikKKyAgICAgICAgbGFiZWwgPSBzZWxmLmdlbl9sYWJlbF93aWRnZXQoIkltYWdlIHR5cGVzOiIpCisgICAgICAgIGFsaWduID0gZ3RrLkFsaWdubWVudCgwLCAwLjUsIDAsIDApCisgICAgICAgIHRhYmxlLmF0dGFjaChhbGlnbiwgMCwgNCwgMCwgMSkKKyAgICAgICAgYWxpZ24uYWRkKGxhYmVsKQorICAgICAgICB0YWJsZS5hdHRhY2goaW5mbywgNCwgNSwgMCwgMSkKKworICAgICAgICBpID0gMQorICAgICAgICBqID0gMQorICAgICAgICBmb3IgaW1hZ2VfdHlwZSBpbiBzb3J0ZWQoc2VsZi5pbWFnZV90eXBlcyk6CisgICAgICAgICAgICBzZWxmLmltYWdlX3R5cGVzX2NoZWNrYnV0dG9uc1tpbWFnZV90eXBlXSA9IGd0ay5DaGVja0J1dHRvbihpbWFnZV90eXBlKQorICAgICAgICAgICAgc2VsZi5pbWFnZV90eXBlc19jaGVja2J1dHRvbnNbaW1hZ2VfdHlwZV0uY29ubmVjdCgidG9nZ2xlZCIsIHNlbGYuaW1hZ2VfdHlwZV9jaGVja2J1dHRvbl9jbGlja2VkX2NiKQorICAgICAgICAgICAgYXJ0aWNsZSA9ICIiCisgICAgICAgICAgICBpZiBpbWFnZV90eXBlLnN0YXJ0c3dpdGgoKCJhIiwgImUiLCAiaSIsICJvIiwgInUiKSk6CisgICAgICAgICAgICAgICAgYXJ0aWNsZSA9ICJuIgorICAgICAgICAgICAgaWYgaW1hZ2VfdHlwZSA9PSAibGl2ZSI6CisgICAgICAgICAgICAgICAgc2VsZi5pbWFnZV90eXBlc19jaGVja2J1dHRvbnNbaW1hZ2VfdHlwZV0uc2V0X3Rvb2x0aXBfdGV4dCgiQnVpbGQgaXNvIGFuZCBoZGRpbWcgaW1hZ2VzIikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5pbWFnZV90eXBlc19jaGVja2J1dHRvbnNbaW1hZ2VfdHlwZV0uc2V0X3Rvb2x0aXBfdGV4dCgiQnVpbGQgYSVzICVzIGltYWdlIiAlIChhcnRpY2xlLCBpbWFnZV90eXBlKSkKKyAgICAgICAgICAgIHRhYmxlLmF0dGFjaChzZWxmLmltYWdlX3R5cGVzX2NoZWNrYnV0dG9uc1tpbWFnZV90eXBlXSwgaiAtIDEsIGogKyAzLCBpLCBpICsgMSkKKyAgICAgICAgICAgIGlmIGltYWdlX3R5cGUgaW4gc2VsZi5jb25maWd1cmF0aW9uLmltYWdlX2ZzdHlwZXMuc3BsaXQoKToKKyAgICAgICAgICAgICAgICBzZWxmLmltYWdlX3R5cGVzX2NoZWNrYnV0dG9uc1tpbWFnZV90eXBlXS5zZXRfYWN0aXZlKFRydWUpCisgICAgICAgICAgICBpICs9IDEKKyAgICAgICAgICAgIGlmIGkgPiByb3dzOgorICAgICAgICAgICAgICAgIGkgPSAxCisgICAgICAgICAgICAgICAgaiA9IGogKyA0CisKKyAgICAgICAgbWFpbl92Ym94LnBhY2tfc3RhcnQoYWR2YW5jZWRfdmJveCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICBzZWxmLnNldF9zYXZlX2J1dHRvbl9zdGF0ZSgpCisgICAgICAgIAorICAgICAgICByZXR1cm4gbWFpbl92Ym94CisKKyAgICBkZWYgY3JlYXRlX291dHB1dF9wYWdlKHNlbGYpOgorICAgICAgICBhZHZhbmNlZF92Ym94ID0gZ3RrLlZCb3goRmFsc2UsIDYpCisgICAgICAgIGFkdmFuY2VkX3Zib3guc2V0X2JvcmRlcl93aWR0aCg2KQorCisgICAgICAgIGFkdmFuY2VkX3Zib3gucGFja19zdGFydChzZWxmLmdlbl9sYWJlbF93aWRnZXQoJzxzcGFuIHdlaWdodD0iYm9sZCI+UGFja2FnZSBmb3JtYXQ8L3NwYW4+JyksIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgc3ViX3Zib3ggPSBndGsuVkJveChGYWxzZSwgNikKKyAgICAgICAgYWR2YW5jZWRfdmJveC5wYWNrX3N0YXJ0KHN1Yl92Ym94LCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIHRvb2x0aXBfY29tYm8gPSAiU2VsZWN0cyB0aGUgcGFja2FnZSBmb3JtYXQgdXNlZCB0byBnZW5lcmF0ZSByb290ZnMuIgorICAgICAgICB0b29sdGlwX2V4dHJhID0gIlNlbGVjdHMgZXh0cmEgcGFja2FnZSBmb3JtYXRzIHRvIGJ1aWxkIgorICAgICAgICBwa2dmbXRfd2lkZ2V0LCBzZWxmLnJvb3Rmc19jb21ibywgc2VsZi5jaGVja19oYm94ID0gc2VsZi5nZW5fcGtnZm10X3dpZGdldChzZWxmLmNvbmZpZ3VyYXRpb24uY3Vycl9wYWNrYWdlX2Zvcm1hdCwgc2VsZi5hbGxfcGFja2FnZV9mb3JtYXRzLCI8Yj5Sb290IGZpbGUgc3lzdGVtIHBhY2thZ2UgZm9ybWF0PC9iPiIgKyAiKiIgKyB0b29sdGlwX2NvbWJvLCI8Yj5BZGRpdGlvbmFsIHBhY2thZ2UgZm9ybWF0czwvYj4iICsgIioiICsgdG9vbHRpcF9leHRyYSkKKyAgICAgICAgc3ViX3Zib3gucGFja19zdGFydChwa2dmbXRfd2lkZ2V0LCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgYWR2YW5jZWRfdmJveC5wYWNrX3N0YXJ0KHNlbGYuZ2VuX2xhYmVsX3dpZGdldCgnPHNwYW4gd2VpZ2h0PSJib2xkIj5JbWFnZSBzaXplPC9zcGFuPicpLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIHN1Yl92Ym94ID0gZ3RrLlZCb3goRmFsc2UsIDYpCisgICAgICAgIGFkdmFuY2VkX3Zib3gucGFja19zdGFydChzdWJfdmJveCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICBsYWJlbCA9IHNlbGYuZ2VuX2xhYmVsX3dpZGdldCgiSW1hZ2UgYmFzaWMgc2l6ZSAoaW4gTUIpIikKKyAgICAgICAgdG9vbHRpcCA9ICJEZWZpbmVzIHRoZSBzaXplIGZvciB0aGUgZ2VuZXJhdGVkIGltYWdlLiBUaGUgT3BlbkVtYmVkZGVkIGJ1aWxkIHN5c3RlbSBkZXRlcm1pbmVzIHRoZSBmaW5hbCBzaXplIGZvciB0aGUgZ2VuZXJhdGVkIGltYWdlIHVzaW5nIGFuIGFsZ29yaXRobSB0aGF0IHRha2VzIGludG8gYWNjb3VudCB0aGUgaW5pdGlhbCBkaXNrIHNwYWNlIHVzZWQgZm9yIHRoZSBnZW5lcmF0ZWQgaW1hZ2UsIHRoZSBJbWFnZSBiYXNpYyBzaXplIHZhbHVlLCBhbmQgdGhlIEFkZGl0aW9uYWwgZnJlZSBzcGFjZSB2YWx1ZS5cblxuRm9yIG1vcmUgaW5mb3JtYXRpb24sIGNoZWNrIHRoZSA8YSBocmVmPVwiaHR0cDovL3d3dy55b2N0b3Byb2plY3Qub3JnL2RvY3MvY3VycmVudC9wb2t5LXJlZi1tYW51YWwvcG9reS1yZWYtbWFudWFsLmh0bWwjdmFyLUlNQUdFX1JPT1RGU19TSVpFXCI+WW9jdG8gUHJvamVjdCBSZWZlcmVuY2UgTWFudWFsPC9hPi4iCisgICAgICAgIHJvb3Rmc19zaXplX3dpZGdldCwgc2VsZi5yb290ZnNfc2l6ZV9zcGlubmVyID0gc2VsZi5nZW5fc3Bpbm5lcl93aWRnZXQoaW50KHNlbGYuY29uZmlndXJhdGlvbi5pbWFnZV9yb290ZnNfc2l6ZSoxLjAvMTAyNCksIDAsIDY1NTM2LCI8Yj5JbWFnZSBiYXNpYyBzaXplPC9iPiIgKyAiKiIgKyB0b29sdGlwKQorICAgICAgICBzdWJfdmJveC5wYWNrX3N0YXJ0KGxhYmVsLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIHN1Yl92Ym94LnBhY2tfc3RhcnQocm9vdGZzX3NpemVfd2lkZ2V0LCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgc3ViX3Zib3ggPSBndGsuVkJveChGYWxzZSwgNikKKyAgICAgICAgYWR2YW5jZWRfdmJveC5wYWNrX3N0YXJ0KHN1Yl92Ym94LCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIGxhYmVsID0gc2VsZi5nZW5fbGFiZWxfd2lkZ2V0KCJBZGRpdGlvbmFsIGZyZWUgc3BhY2UgKGluIE1CKSIpCisgICAgICAgIHRvb2x0aXAgPSAiU2V0cyBleHRyYSBmcmVlIGRpc2sgc3BhY2UgdG8gYmUgYWRkZWQgdG8gdGhlIGdlbmVyYXRlZCBpbWFnZS4gVXNlIHRoaXMgdmFyaWFibGUgd2hlbiB5b3Ugd2FudCB0byBlbnN1cmUgdGhhdCBhIHNwZWNpZmljIGFtb3VudCBvZiBmcmVlIGRpc2sgc3BhY2UgaXMgYXZhaWxhYmxlIG9uIGEgZGV2aWNlIGFmdGVyIGFuIGltYWdlIGlzIGluc3RhbGxlZCBhbmQgcnVubmluZy4iCisgICAgICAgIGV4dHJhX3NpemVfd2lkZ2V0LCBzZWxmLmV4dHJhX3NpemVfc3Bpbm5lciA9IHNlbGYuZ2VuX3NwaW5uZXJfd2lkZ2V0KGludChzZWxmLmNvbmZpZ3VyYXRpb24uaW1hZ2VfZXh0cmFfc2l6ZSoxLjAvMTAyNCksIDAsIDY1NTM2LCI8Yj5BZGRpdGlvbmFsIGZyZWUgc3BhY2U8L2I+IiArICIqIiArIHRvb2x0aXApCisgICAgICAgIHN1Yl92Ym94LnBhY2tfc3RhcnQobGFiZWwsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgc3ViX3Zib3gucGFja19zdGFydChleHRyYV9zaXplX3dpZGdldCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorCisgICAgICAgIGFkdmFuY2VkX3Zib3gucGFja19zdGFydChzZWxmLmdlbl9sYWJlbF93aWRnZXQoJzxzcGFuIHdlaWdodD0iYm9sZCI+TGljZW5zaW5nPC9zcGFuPicpLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIHNlbGYuZ3BsdjNfY2hlY2tib3ggPSBndGsuQ2hlY2tCdXR0b24oIkV4Y2x1ZGUgR1BMdjMgcGFja2FnZXMiKQorICAgICAgICBzZWxmLmdwbHYzX2NoZWNrYm94LnNldF90b29sdGlwX3RleHQoIkNoZWNrIHRoaXMgYm94IHRvIHByZXZlbnQgR1BMdjMgcGFja2FnZXMgZnJvbSBiZWluZyBpbmNsdWRlZCBpbiB5b3VyIGltYWdlIikKKyAgICAgICAgaWYgIkdQTHYzIiBpbiBzZWxmLmNvbmZpZ3VyYXRpb24uaW5jb21wYXRfbGljZW5zZS5zcGxpdCgpOgorICAgICAgICAgICAgc2VsZi5ncGx2M19jaGVja2JveC5zZXRfYWN0aXZlKFRydWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmdwbHYzX2NoZWNrYm94LnNldF9hY3RpdmUoRmFsc2UpCisgICAgICAgIGFkdmFuY2VkX3Zib3gucGFja19zdGFydChzZWxmLmdwbHYzX2NoZWNrYm94LCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgYWR2YW5jZWRfdmJveC5wYWNrX3N0YXJ0KHNlbGYuZ2VuX2xhYmVsX3dpZGdldCgnPHNwYW4gd2VpZ2h0PSJib2xkIj5TREs8L3NwYW4+JyksIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgc3ViX2hib3ggPSBndGsuSEJveChGYWxzZSwgNikKKyAgICAgICAgYWR2YW5jZWRfdmJveC5wYWNrX3N0YXJ0KHN1Yl9oYm94LCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIHNlbGYuc2RrX2NoZWNrYm94ID0gZ3RrLkNoZWNrQnV0dG9uKCJQb3B1bGF0ZSBTREsiKQorICAgICAgICB0b29sdGlwID0gIkNoZWNrIHRoaXMgYm94IHRvIGdlbmVyYXRlIGFuIFNESyB0YXJiYWxsIHRoYXQgY29uc2lzdHMgb2YgdGhlIGNyb3NzLXRvb2xjaGFpbiBhbmQgYSBzeXNyb290IHRoYXQgY29udGFpbnMgZGV2ZWxvcG1lbnQgcGFja2FnZXMgZm9yIHlvdXIgaW1hZ2UuIgorICAgICAgICBzZWxmLnNka19jaGVja2JveC5zZXRfdG9vbHRpcF90ZXh0KHRvb2x0aXApCisgICAgICAgIHNlbGYuc2RrX2NoZWNrYm94LnNldF9hY3RpdmUoc2VsZi5jb25maWd1cmF0aW9uLnRvb2xjaGFpbl9idWlsZCkKKyAgICAgICAgc3ViX2hib3gucGFja19zdGFydChzZWxmLnNka19jaGVja2JveCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorCisgICAgICAgIHRvb2x0aXAgPSAiU2VsZWN0IHRoZSBob3N0IHBsYXRmb3JtIGZvciB3aGljaCB5b3Ugd2FudCB0byBydW4gdGhlIHRvb2xjaGFpbiBjb250YWluZWQgaW4gdGhlIFNESyB0YXJiYWxsLiIKKyAgICAgICAgc2RrX21hY2hpbmVfd2lkZ2V0LCBzZWxmLnNka19tYWNoaW5lX2NvbWJvID0gc2VsZi5nZW5fY29tYm9fd2lkZ2V0KHNlbGYuY29uZmlndXJhdGlvbi5jdXJyX3Nka19tYWNoaW5lLCBzZWxmLmFsbF9zZGtfbWFjaGluZXMsIjxiPlBvcHVsYXRlIFNESzwvYj4iICsgIioiICsgdG9vbHRpcCkKKyAgICAgICAgc3ViX2hib3gucGFja19zdGFydChzZGtfbWFjaGluZV93aWRnZXQsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKworICAgICAgICByZXR1cm4gYWR2YW5jZWRfdmJveAorCisgICAgZGVmIHJlc3BvbnNlX2NiKHNlbGYsIGRpYWxvZywgcmVzcG9uc2VfaWQpOgorICAgICAgICBwYWNrYWdlX2Zvcm1hdCA9IFtdCisgICAgICAgIHBhY2thZ2VfZm9ybWF0LmFwcGVuZChzZWxmLnJvb3Rmc19jb21iby5nZXRfYWN0aXZlX3RleHQoKSkKKyAgICAgICAgZm9yIGNoaWxkIGluIHNlbGYuY2hlY2tfaGJveDoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoY2hpbGQsIGd0ay5DaGVja0J1dHRvbikgYW5kIGNoaWxkLmdldF9hY3RpdmUoKToKKyAgICAgICAgICAgICAgICBwYWNrYWdlX2Zvcm1hdC5hcHBlbmQoY2hpbGQuZ2V0X2xhYmVsKCkpCisgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi5jdXJyX3BhY2thZ2VfZm9ybWF0ID0gIiAiLmpvaW4ocGFja2FnZV9mb3JtYXQpCisKKyAgICAgICAgZGlzdHJvID0gc2VsZi5kaXN0cm9fY29tYm8uZ2V0X2FjdGl2ZV90ZXh0KCkKKyAgICAgICAgaWYgZGlzdHJvID09ICJEZWZhdWx0IjoKKyAgICAgICAgICAgIGRpc3RybyA9ICJkZWZhdWx0c2V0dXAiCisgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi5jdXJyX2Rpc3RybyA9IGRpc3RybworICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uaW1hZ2Vfcm9vdGZzX3NpemUgPSBzZWxmLnJvb3Rmc19zaXplX3NwaW5uZXIuZ2V0X3ZhbHVlX2FzX2ludCgpICogMTAyNAorICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uaW1hZ2VfZXh0cmFfc2l6ZSA9IHNlbGYuZXh0cmFfc2l6ZV9zcGlubmVyLmdldF92YWx1ZV9hc19pbnQoKSAqIDEwMjQKKworICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uaW1hZ2VfZnN0eXBlcyA9ICIiCisgICAgICAgIGZvciBpbWFnZV90eXBlIGluIHNlbGYuaW1hZ2VfdHlwZXM6CisgICAgICAgICAgICBpZiBzZWxmLmltYWdlX3R5cGVzX2NoZWNrYnV0dG9uc1tpbWFnZV90eXBlXS5nZXRfYWN0aXZlKCk6CisgICAgICAgICAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLmltYWdlX2ZzdHlwZXMgKz0gKCIgIiArIGltYWdlX3R5cGUpCisgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi5pbWFnZV9mc3R5cGVzLnN0cmlwKCkKKworICAgICAgICBpZiBzZWxmLmdwbHYzX2NoZWNrYm94LmdldF9hY3RpdmUoKToKKyAgICAgICAgICAgIGlmICJHUEx2MyIgbm90IGluIHNlbGYuY29uZmlndXJhdGlvbi5pbmNvbXBhdF9saWNlbnNlLnNwbGl0KCk6CisgICAgICAgICAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLmluY29tcGF0X2xpY2Vuc2UgKz0gIiBHUEx2MyIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmICJHUEx2MyIgaW4gc2VsZi5jb25maWd1cmF0aW9uLmluY29tcGF0X2xpY2Vuc2Uuc3BsaXQoKToKKyAgICAgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uaW5jb21wYXRfbGljZW5zZSA9IHNlbGYuY29uZmlndXJhdGlvbi5pbmNvbXBhdF9saWNlbnNlLnNwbGl0KCkucmVtb3ZlKCJHUEx2MyIpCisgICAgICAgICAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLmluY29tcGF0X2xpY2Vuc2UgPSAiICIuam9pbihzZWxmLmNvbmZpZ3VyYXRpb24uaW5jb21wYXRfbGljZW5zZSBvciBbXSkKKyAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLmluY29tcGF0X2xpY2Vuc2UgPSBzZWxmLmNvbmZpZ3VyYXRpb24uaW5jb21wYXRfbGljZW5zZS5zdHJpcCgpCisKKyAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLnRvb2xjaGFpbl9idWlsZCA9IHNlbGYuc2RrX2NoZWNrYm94LmdldF9hY3RpdmUoKQorICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uY3Vycl9zZGtfbWFjaGluZSA9IHNlbGYuc2RrX21hY2hpbmVfY29tYm8uZ2V0X2FjdGl2ZV90ZXh0KCkKKyAgICAgICAgbWQ1ID0gc2VsZi5jb25maWdfbWQ1KCkKKyAgICAgICAgc2VsZi5zZXR0aW5nc19jaGFuZ2VkID0gKHNlbGYubWQ1ICE9IG1kNSkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9oaWcvY3J1bWJzZGlhbG9nLnB5IGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2hpZy9jcnVtYnNkaWFsb2cucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY3OWY5YQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9oaWcvY3J1bWJzZGlhbG9nLnB5CkBAIC0wLDAgKzEsNDQgQEAKKyMKKyMgQml0QmFrZSBHcmFwaGljYWwgR1RLIFVzZXIgSW50ZXJmYWNlCisjCisjIENvcHlyaWdodCAoQykgMjAxMS0yMDEyICAgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgQXV0aG9yZWQgYnkgSm9zaHVhIExvY2sgPGpvc2hAbGludXguaW50ZWwuY29tPgorIyBBdXRob3JlZCBieSBEb25neGlhbyBYdSA8ZG9uZ3hpYW8ueHVAaW50ZWwuY29tPgorIyBBdXRob3JlZCBieSBTaGFuZSBXYW5nIDxzaGFuZS53YW5nQGludGVsLmNvbT4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBndGsKKworIiIiCitUaGUgZm9sbG93aW5nIGFyZSBjb252ZW5pZW5jZSBjbGFzc2VzIGZvciBpbXBsZW1lbnRpbmcgR05PTUUgSElHIGNvbXBsaWFudAorQml0QmFrZSBHVUkncworSW4gc3VtbWFyeTogc3BhY2luZyA9IDEycHgsIGJvcmRlci13aWR0aCA9IDZweAorIiIiCisKK2NsYXNzIENydW1ic0RpYWxvZyhndGsuRGlhbG9nKToKKyAgICAiIiIKKyAgICBBIEdOT01FIEhJRyBjb21wbGlhbnQgZGlhbG9nIHdpZGdldC4KKyAgICBBZGQgYnV0dG9ucyB3aXRoIGd0ay5EaWFsb2cuYWRkX2J1dHRvbiBvciBndGsuRGlhbG9nLmFkZF9idXR0b25zCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRpdGxlPSIiLCBwYXJlbnQ9Tm9uZSwgZmxhZ3M9MCwgYnV0dG9ucz1Ob25lKToKKyAgICAgICAgc3VwZXIoQ3J1bWJzRGlhbG9nLCBzZWxmKS5fX2luaXRfXyh0aXRsZSwgcGFyZW50LCBmbGFncywgYnV0dG9ucykKKworICAgICAgICBzZWxmLnNldF9wcm9wZXJ0eSgiaGFzLXNlcGFyYXRvciIsIEZhbHNlKSAjIG5vdGU6IGRlcHJlY2F0ZWQgaW4gMi4yMgorCisgICAgICAgIHNlbGYuc2V0X2JvcmRlcl93aWR0aCg2KQorICAgICAgICBzZWxmLnZib3guc2V0X3Byb3BlcnR5KCJzcGFjaW5nIiwgMTIpCisgICAgICAgIHNlbGYuYWN0aW9uX2FyZWEuc2V0X3Byb3BlcnR5KCJzcGFjaW5nIiwgMTIpCisgICAgICAgIHNlbGYuYWN0aW9uX2FyZWEuc2V0X3Byb3BlcnR5KCJib3JkZXItd2lkdGgiLCA2KQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2hpZy9jcnVtYnNtZXNzYWdlZGlhbG9nLnB5IGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2hpZy9jcnVtYnNtZXNzYWdlZGlhbG9nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiOTk4ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaGlnL2NydW1ic21lc3NhZ2VkaWFsb2cucHkKQEAgLTAsMCArMSw3MCBAQAorIworIyBCaXRCYWtlIEdyYXBoaWNhbCBHVEsgVXNlciBJbnRlcmZhY2UKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgICBJbnRlbCBDb3Jwb3JhdGlvbgorIworIyBBdXRob3JlZCBieSBKb3NodWEgTG9jayA8am9zaEBsaW51eC5pbnRlbC5jb20+CisjIEF1dGhvcmVkIGJ5IERvbmd4aWFvIFh1IDxkb25neGlhby54dUBpbnRlbC5jb20+CisjIEF1dGhvcmVkIGJ5IFNoYW5lIFdhbmcgPHNoYW5lLndhbmdAaW50ZWwuY29tPgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworaW1wb3J0IGdsaWIKK2ltcG9ydCBndGsKK2Zyb20gYmIudWkuY3J1bWJzLmhvYndpZGdldCBpbXBvcnQgSG9iSWNvbkNoZWNrZXIKK2Zyb20gYmIudWkuY3J1bWJzLmhpZy5jcnVtYnNkaWFsb2cgaW1wb3J0IENydW1ic0RpYWxvZworCisiIiIKK1RoZSBmb2xsb3dpbmcgYXJlIGNvbnZlbmllbmNlIGNsYXNzZXMgZm9yIGltcGxlbWVudGluZyBHTk9NRSBISUcgY29tcGxpYW50CitCaXRCYWtlIEdVSSdzCitJbiBzdW1tYXJ5OiBzcGFjaW5nID0gMTJweCwgYm9yZGVyLXdpZHRoID0gNnB4CisiIiIKKworY2xhc3MgQ3J1bWJzTWVzc2FnZURpYWxvZyhndGsuTWVzc2FnZURpYWxvZyk6CisgICAgIiIiCisgICAgQSBHTk9NRSBISUcgY29tcGxpYW50IGRpYWxvZyB3aWRnZXQuCisgICAgQWRkIGJ1dHRvbnMgd2l0aCBndGsuRGlhbG9nLmFkZF9idXR0b24gb3IgZ3RrLkRpYWxvZy5hZGRfYnV0dG9ucworICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnQgPSBOb25lLCBsYWJlbD0iIiwgZGlhbG9nX3R5cGUgPSBndGsuTUVTU0FHRV9RVUVTVElPTiwgbXNnPSIiKToKKyAgICAgICAgc3VwZXIoQ3J1bWJzTWVzc2FnZURpYWxvZywgc2VsZikuX19pbml0X18oTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RrLkRJQUxPR19NT0RBTCB8IGd0ay5ESUFMT0dfREVTVFJPWV9XSVRIX1BBUkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhbG9nX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0ay5CVVRUT05TX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUpCisKKyAgICAgICAgc2VsZi5zZXRfc2tpcF90YXNrYmFyX2hpbnQoRmFsc2UpCisKKyAgICAgICAgc2VsZi5zZXRfbWFya3VwKGxhYmVsKQorCisgICAgICAgIGlmIDAgPD0gbGVuKG1zZykgPCAzMDA6CisgICAgICAgICAgICBzZWxmLmZvcm1hdF9zZWNvbmRhcnlfbWFya3VwKG1zZykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHZib3ggPSBzZWxmLmdldF9tZXNzYWdlX2FyZWEoKQorICAgICAgICAgICAgdmJveC5zZXRfYm9yZGVyX3dpZHRoKDEpCisgICAgICAgICAgICB2Ym94LnNldF9wcm9wZXJ0eSgic3BhY2luZyIsIDEyKQorICAgICAgICAgICAgc2VsZi50ZXh0V2luZG93ID0gZ3RrLlNjcm9sbGVkV2luZG93KCkKKyAgICAgICAgICAgIHNlbGYudGV4dFdpbmRvdy5zZXRfc2hhZG93X3R5cGUoZ3RrLlNIQURPV19JTikKKyAgICAgICAgICAgIHNlbGYudGV4dFdpbmRvdy5zZXRfcG9saWN5KGd0ay5QT0xJQ1lfQVVUT01BVElDLCBndGsuUE9MSUNZX0FVVE9NQVRJQykKKyAgICAgICAgICAgIHNlbGYubXNnVmlldyA9IGd0ay5UZXh0VmlldygpCisgICAgICAgICAgICBzZWxmLm1zZ1ZpZXcuc2V0X2VkaXRhYmxlKEZhbHNlKQorICAgICAgICAgICAgc2VsZi5tc2dWaWV3LnNldF93cmFwX21vZGUoZ3RrLldSQVBfV09SRCkKKyAgICAgICAgICAgIHNlbGYubXNnVmlldy5zZXRfY3Vyc29yX3Zpc2libGUoRmFsc2UpCisgICAgICAgICAgICBzZWxmLm1zZ1ZpZXcuc2V0X3NpemVfcmVxdWVzdCgzMDAsIDMwMCkKKyAgICAgICAgICAgIHNlbGYuYnVmID0gZ3RrLlRleHRCdWZmZXIoKQorICAgICAgICAgICAgc2VsZi5idWYuc2V0X3RleHQobXNnKQorICAgICAgICAgICAgc2VsZi5tc2dWaWV3LnNldF9idWZmZXIoc2VsZi5idWYpCisgICAgICAgICAgICBzZWxmLnRleHRXaW5kb3cuYWRkKHNlbGYubXNnVmlldykKKyAgICAgICAgICAgIHNlbGYubXNnVmlldy5zaG93KCkKKyAgICAgICAgICAgIHZib3guYWRkKHNlbGYudGV4dFdpbmRvdykKKyAgICAgICAgICAgIHNlbGYudGV4dFdpbmRvdy5zaG93KCkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9oaWcvZGVwbG95aW1hZ2VkaWFsb2cucHkgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaGlnL2RlcGxveWltYWdlZGlhbG9nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExM2ZmZjkKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaGlnL2RlcGxveWltYWdlZGlhbG9nLnB5CkBAIC0wLDAgKzEsMjE5IEBACisjCisjIEJpdEJha2UgR3JhcGhpY2FsIEdUSyBVc2VyIEludGVyZmFjZQorIworIyBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiAgIEludGVsIENvcnBvcmF0aW9uCisjCisjIEF1dGhvcmVkIGJ5IEpvc2h1YSBMb2NrIDxqb3NoQGxpbnV4LmludGVsLmNvbT4KKyMgQXV0aG9yZWQgYnkgRG9uZ3hpYW8gWHUgPGRvbmd4aWFvLnh1QGludGVsLmNvbT4KKyMgQXV0aG9yZWQgYnkgU2hhbmUgV2FuZyA8c2hhbmUud2FuZ0BpbnRlbC5jb20+CisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitpbXBvcnQgZ2xvYgoraW1wb3J0IGd0aworaW1wb3J0IGdvYmplY3QKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc2hsZXgKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgdGVtcGZpbGUKK2Zyb20gYmIudWkuY3J1bWJzLmhvYndpZGdldCBpbXBvcnQgaGljLCBIb2JCdXR0b24KK2Zyb20gYmIudWkuY3J1bWJzLnByb2dyZXNzYmFyIGltcG9ydCBIb2JQcm9ncmVzc0JhcgoraW1wb3J0IGJiLnVpLmNydW1icy51dGlscworaW1wb3J0IGJiLnByb2Nlc3MKK2Zyb20gYmIudWkuY3J1bWJzLmhpZy5jcnVtYnNkaWFsb2cgaW1wb3J0IENydW1ic0RpYWxvZworZnJvbSBiYi51aS5jcnVtYnMuaGlnLmNydW1ic21lc3NhZ2VkaWFsb2cgaW1wb3J0IENydW1ic01lc3NhZ2VEaWFsb2cKKworIiIiCitUaGUgZm9sbG93aW5nIGFyZSBjb252ZW5pZW5jZSBjbGFzc2VzIGZvciBpbXBsZW1lbnRpbmcgR05PTUUgSElHIGNvbXBsaWFudAorQml0QmFrZSBHVUkncworSW4gc3VtbWFyeTogc3BhY2luZyA9IDEycHgsIGJvcmRlci13aWR0aCA9IDZweAorIiIiCisKK2NsYXNzIERlcGxveUltYWdlRGlhbG9nIChDcnVtYnNEaWFsb2cpOgorCisgICAgX19kdW1teV91c2JfXyA9ICItLXNlbGVjdCBhIHVzYiBkcml2ZS0tIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRpdGxlLCBpbWFnZV9wYXRoLCBwYXJlbnQsIGZsYWdzLCBidXR0b25zPU5vbmUsIHN0YW5kYWxvbmU9RmFsc2UpOgorICAgICAgICBzdXBlcihEZXBsb3lJbWFnZURpYWxvZywgc2VsZikuX19pbml0X18odGl0bGUsIHBhcmVudCwgZmxhZ3MsIGJ1dHRvbnMpCisKKyAgICAgICAgc2VsZi5pbWFnZV9wYXRoID0gaW1hZ2VfcGF0aAorICAgICAgICBzZWxmLnN0YW5kYWxvbmUgPSBzdGFuZGFsb25lCisKKyAgICAgICAgc2VsZi5jcmVhdGVfdmlzdWFsX2VsZW1lbnRzKCkKKyAgICAgICAgc2VsZi5jb25uZWN0KCJyZXNwb25zZSIsIHNlbGYucmVzcG9uc2VfY2IpCisKKyAgICBkZWYgY3JlYXRlX3Zpc3VhbF9lbGVtZW50cyhzZWxmKToKKyAgICAgICAgc2VsZi5zZXRfc2l6ZV9yZXF1ZXN0KDYwMCwgNDAwKQorICAgICAgICBsYWJlbCA9IGd0ay5MYWJlbCgpCisgICAgICAgIGxhYmVsLnNldF9hbGlnbm1lbnQoMC4wLCAwLjUpCisgICAgICAgIG1hcmt1cCA9ICI8c3BhbiBmb250X2Rlc2M9JzEyJz5UaGUgaW1hZ2UgdG8gYmUgd3JpdHRlbiBpbnRvIHVzYiBkcml2ZTo8L3NwYW4+IgorICAgICAgICBsYWJlbC5zZXRfbWFya3VwKG1hcmt1cCkKKyAgICAgICAgc2VsZi52Ym94LnBhY2tfc3RhcnQobGFiZWwsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSwgcGFkZGluZz0yKQorCisgICAgICAgIHRhYmxlID0gZ3RrLlRhYmxlKDIsIDEwLCBGYWxzZSkKKyAgICAgICAgdGFibGUuc2V0X2NvbF9zcGFjaW5ncyg1KQorICAgICAgICB0YWJsZS5zZXRfcm93X3NwYWNpbmdzKDUpCisgICAgICAgIHNlbGYudmJveC5wYWNrX3N0YXJ0KHRhYmxlLCBleHBhbmQ9VHJ1ZSwgZmlsbD1UcnVlKQorCisgICAgICAgIHNjcm9sbCA9IGd0ay5TY3JvbGxlZFdpbmRvdygpCisgICAgICAgIHNjcm9sbC5zZXRfcG9saWN5KGd0ay5QT0xJQ1lfTkVWRVIsIGd0ay5QT0xJQ1lfQVVUT01BVElDKQorICAgICAgICBzY3JvbGwuc2V0X3NoYWRvd190eXBlKGd0ay5TSEFET1dfSU4pCisgICAgICAgIHR2ID0gZ3RrLlRleHRWaWV3KCkKKyAgICAgICAgdHYuc2V0X2VkaXRhYmxlKEZhbHNlKQorICAgICAgICB0di5zZXRfd3JhcF9tb2RlKGd0ay5XUkFQX1dPUkQpCisgICAgICAgIHR2LnNldF9jdXJzb3JfdmlzaWJsZShGYWxzZSkKKyAgICAgICAgc2VsZi5idWYgPSBndGsuVGV4dEJ1ZmZlcigpCisgICAgICAgIHNlbGYuYnVmLnNldF90ZXh0KHNlbGYuaW1hZ2VfcGF0aCkKKyAgICAgICAgdHYuc2V0X2J1ZmZlcihzZWxmLmJ1ZikKKyAgICAgICAgc2Nyb2xsLmFkZCh0dikKKyAgICAgICAgdGFibGUuYXR0YWNoKHNjcm9sbCwgMCwgMTAsIDAsIDEpCisKKyAgICAgICAgIyBUaGVyZSBhcmUgMiB3YXlzIHRvIHVzZSBEZXBsb3lJbWFnZURpYWxvZworICAgICAgICAjIE9uZSB3YXkgaXMgdGhhdCBjYWxsZWQgYnkgSE9CIHdoZW4gdGhlICdEZXBsb3kgSW1hZ2UnIGJ1dHRvbiBpcyBjbGlja2VkCisgICAgICAgICMgVGhlIG90aGVyIHdheSBpcyB0aGF0IGNhbGxlZCBieSBhIHN0YW5kYWxvbmUgc2NyaXB0LgorICAgICAgICAjIEZvbGxvd2luZyBibG9jayBvZiBjb2RlcyBoYW5kbGVzIHRoZSBsYXR0ZXIgd2F5LiBJdCBhZGRzIGEgJ1NlbGVjdCBJbWFnZScgYnV0dG9uIGFuZAorICAgICAgICAjIGVtaXQgYSBzaWduYWwgd2hlbiB0aGUgYnV0dG9uIGlzIGNsaWNrZWQuCisgICAgICAgIGlmIHNlbGYuc3RhbmRhbG9uZToKKyAgICAgICAgICAgICAgICBnb2JqZWN0LnNpZ25hbF9uZXcoInNlbGVjdF9pbWFnZV9jbGlja2VkIiwgc2VsZiwgZ29iamVjdC5TSUdOQUxfUlVOX0ZJUlNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfTk9ORSwgKCkpCisgICAgICAgICAgICAgICAgaWNvbiA9IGd0ay5JbWFnZSgpCisgICAgICAgICAgICAgICAgcGl4X2J1ZmZlciA9IGd0ay5nZGsucGl4YnVmX25ld19mcm9tX2ZpbGUoaGljLklDT05fSU1BR0VTX0RJU1BMQVlfRklMRSkKKyAgICAgICAgICAgICAgICBpY29uLnNldF9mcm9tX3BpeGJ1ZihwaXhfYnVmZmVyKQorICAgICAgICAgICAgICAgIGJ1dHRvbiA9IGd0ay5CdXR0b24oIlNlbGVjdCBJbWFnZSIpCisgICAgICAgICAgICAgICAgYnV0dG9uLnNldF9pbWFnZShpY29uKQorICAgICAgICAgICAgICAgICNidXR0b24uc2V0X3NpemVfcmVxdWVzdCgxNDAsIDUwKQorICAgICAgICAgICAgICAgIHRhYmxlLmF0dGFjaChidXR0b24sIDksIDEwLCAxLCAyLCBndGsuRklMTCwgMCwgMCwgMCkKKyAgICAgICAgICAgICAgICBidXR0b24uY29ubmVjdCgiY2xpY2tlZCIsIHNlbGYuc2VsZWN0X2ltYWdlX2J1dHRvbl9jbGlja2VkX2NiKQorCisgICAgICAgIHNlcGFyYXRvciA9IGd0ay5IU2VwYXJhdG9yKCkKKyAgICAgICAgc2VsZi52Ym94LnBhY2tfc3RhcnQoc2VwYXJhdG9yLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UsIHBhZGRpbmc9MTApCisKKyAgICAgICAgc2VsZi51c2JfZGVzYyA9IGd0ay5MYWJlbCgpCisgICAgICAgIHNlbGYudXNiX2Rlc2Muc2V0X2FsaWdubWVudCgwLjAsIDAuNSkKKyAgICAgICAgbWFya3VwID0gIjxzcGFuIGZvbnRfZGVzYz0nMTInPllvdSBoYXZlbid0IGNob3NlbiBhbnkgVVNCIGRyaXZlLjwvc3Bhbj4iCisgICAgICAgIHNlbGYudXNiX2Rlc2Muc2V0X21hcmt1cChtYXJrdXApCisKKyAgICAgICAgc2VsZi51c2JfY29tYm8gPSBndGsuY29tYm9fYm94X25ld190ZXh0KCkKKyAgICAgICAgc2VsZi51c2JfY29tYm8uY29ubmVjdCgiY2hhbmdlZCIsIHNlbGYudXNiX2NvbWJvX2NoYW5nZWRfY2IpCisgICAgICAgIG1vZGVsID0gc2VsZi51c2JfY29tYm8uZ2V0X21vZGVsKCkKKyAgICAgICAgbW9kZWwuY2xlYXIoKQorICAgICAgICBzZWxmLnVzYl9jb21iby5hcHBlbmRfdGV4dChzZWxmLl9fZHVtbXlfdXNiX18pCisgICAgICAgIGZvciB1c2IgaW4gc2VsZi5maW5kX2FsbF91c2JfZGV2aWNlcygpOgorICAgICAgICAgICAgc2VsZi51c2JfY29tYm8uYXBwZW5kX3RleHQoIi9kZXYvIiArIHVzYikKKyAgICAgICAgc2VsZi51c2JfY29tYm8uc2V0X2FjdGl2ZSgwKQorICAgICAgICBzZWxmLnZib3gucGFja19zdGFydChzZWxmLnVzYl9jb21ibywgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICBzZWxmLnZib3gucGFja19zdGFydChzZWxmLnVzYl9kZXNjLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UsIHBhZGRpbmc9MikKKworICAgICAgICBzZWxmLnByb2dyZXNzX2JhciA9IEhvYlByb2dyZXNzQmFyKCkKKyAgICAgICAgc2VsZi52Ym94LnBhY2tfc3RhcnQoc2VsZi5wcm9ncmVzc19iYXIsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgc2VwYXJhdG9yID0gZ3RrLkhTZXBhcmF0b3IoKQorICAgICAgICBzZWxmLnZib3gucGFja19zdGFydChzZXBhcmF0b3IsIGV4cGFuZD1GYWxzZSwgZmlsbD1UcnVlLCBwYWRkaW5nPTEwKQorCisgICAgICAgIHNlbGYudmJveC5zaG93X2FsbCgpCisgICAgICAgIHNlbGYucHJvZ3Jlc3NfYmFyLmhpZGUoKQorCisgICAgZGVmIHNldF9pbWFnZV90ZXh0X2J1ZmZlcihzZWxmLCBpbWFnZV9wYXRoKToKKyAgICAgICAgc2VsZi5idWYuc2V0X3RleHQoaW1hZ2VfcGF0aCkKKworICAgIGRlZiBzZXRfaW1hZ2VfcGF0aChzZWxmLCBpbWFnZV9wYXRoKToKKyAgICAgICAgc2VsZi5pbWFnZV9wYXRoID0gaW1hZ2VfcGF0aAorCisgICAgZGVmIHBvcGVuX3JlYWQoc2VsZiwgY21kKToKKyAgICAgICAgdG1wb3V0LCBlcnJvcnMgPSBiYi5wcm9jZXNzLnJ1bigiJXMiICUgY21kKQorICAgICAgICByZXR1cm4gdG1wb3V0LnN0cmlwKCkKKworICAgIGRlZiBmaW5kX2FsbF91c2JfZGV2aWNlcyhzZWxmKToKKyAgICAgICAgdXNiX2RldnMgPSBbIG9zLnJlYWRsaW5rKHUpCisgICAgICAgICAgICBmb3IgdSBpbiBnbG9iLmdsb2IoJy9kZXYvZGlzay9ieS1pZC91c2IqJykKKyAgICAgICAgICAgIGlmIG5vdCByZS5zZWFyY2gocidwYXJ0XGQrJywgdSkgXQorICAgICAgICByZXR1cm4gWyAnJXMnICUgdVt1LnJmaW5kKCcvJykrMTpdIGZvciB1IGluIHVzYl9kZXZzIF0KKworICAgIGRlZiBnZXRfdXNiX2luZm8oc2VsZiwgZGV2KToKKyAgICAgICAgcmV0dXJuICIlcyAlcyIgJSBcCisgICAgICAgICAgICAoc2VsZi5wb3Blbl9yZWFkKCdjYXQgL3N5cy9jbGFzcy9ibG9jay8lcy9kZXZpY2UvdmVuZG9yJyAlIGRldiksCisgICAgICAgICAgICBzZWxmLnBvcGVuX3JlYWQoJ2NhdCAvc3lzL2NsYXNzL2Jsb2NrLyVzL2RldmljZS9tb2RlbCcgJSBkZXYpKQorCisgICAgZGVmIHNlbGVjdF9pbWFnZV9idXR0b25fY2xpY2tlZF9jYihzZWxmLCBidXR0b24pOgorICAgICAgICAgICAgc2VsZi5lbWl0KCdzZWxlY3RfaW1hZ2VfY2xpY2tlZCcpCisKKyAgICBkZWYgdXNiX2NvbWJvX2NoYW5nZWRfY2Ioc2VsZiwgdXNiX2NvbWJvKToKKyAgICAgICAgY29tYm9faXRlbSA9IHNlbGYudXNiX2NvbWJvLmdldF9hY3RpdmVfdGV4dCgpCisgICAgICAgIGlmIG5vdCBjb21ib19pdGVtIG9yIGNvbWJvX2l0ZW0gPT0gc2VsZi5fX2R1bW15X3VzYl9fOgorICAgICAgICAgICAgbWFya3VwID0gIjxzcGFuIGZvbnRfZGVzYz0nMTInPllvdSBoYXZlbid0IGNob3NlbiBhbnkgVVNCIGRyaXZlLjwvc3Bhbj4iCisgICAgICAgICAgICBzZWxmLnVzYl9kZXNjLnNldF9tYXJrdXAobWFya3VwKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbWFya3VwID0gIjxzcGFuIGZvbnRfZGVzYz0nMTInPiIgKyBzZWxmLmdldF91c2JfaW5mbyhjb21ib19pdGVtLmxzdHJpcCgiL2Rldi8iKSkgKyAiPC9zcGFuPiIKKyAgICAgICAgICAgIHNlbGYudXNiX2Rlc2Muc2V0X21hcmt1cChtYXJrdXApCisKKyAgICBkZWYgcmVzcG9uc2VfY2Ioc2VsZiwgZGlhbG9nLCByZXNwb25zZV9pZCk6CisgICAgICAgIGlmIHJlc3BvbnNlX2lkID09IGd0ay5SRVNQT05TRV9ZRVM6CisgICAgICAgICAgICBsYmwgPSAnJworICAgICAgICAgICAgbXNnID0gJycKKyAgICAgICAgICAgIGNvbWJvX2l0ZW0gPSBzZWxmLnVzYl9jb21iby5nZXRfYWN0aXZlX3RleHQoKQorICAgICAgICAgICAgaWYgY29tYm9faXRlbSBhbmQgY29tYm9faXRlbSAhPSBzZWxmLl9fZHVtbXlfdXNiX18gYW5kIHNlbGYuaW1hZ2VfcGF0aDoKKyAgICAgICAgICAgICAgICBjbWRsaW5lID0gYmIudWkuY3J1bWJzLnV0aWxzLndoaWNoX3Rlcm1pbmFsKCkKKyAgICAgICAgICAgICAgICBpZiBjbWRsaW5lOgorICAgICAgICAgICAgICAgICAgICB0bXBmaWxlID0gdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKCkKKyAgICAgICAgICAgICAgICAgICAgY21kbGluZSArPSAiXCJzdWRvIGRkIGlmPSIgKyBzZWxmLmltYWdlX3BhdGggKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgb2Y9IiArIGNvbWJvX2l0ZW0gKyAiICYmIHN5bmM7IGVjaG8gJD8gPiAiICsgdG1wZmlsZS5uYW1lICsgIlwiIgorICAgICAgICAgICAgICAgICAgICBzdWJwcm9jZXNzLmNhbGwoc2hsZXguc3BsaXQoY21kbGluZSkpCisKKyAgICAgICAgICAgICAgICAgICAgaWYgaW50KHRtcGZpbGUucmVhZGxpbmUoKS5zdHJpcCgpKSA9PSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgbGJsID0gIjxiPkRlcGxveSBpbWFnZSBzdWNjZXNzZnVsbHkuPC9iPiIKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxibCA9ICI8Yj5GYWlsZWQgdG8gZGVwbG95IGltYWdlLjwvYj4iCisgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSAiUGxlYXNlIGNoZWNrIGltYWdlIDxiPiVzPC9iPiBleGlzdHMgYW5kIFVTQiBkZXZpY2UgPGI+JXM8L2I+IGlzIHdyaXRhYmxlLiIgJSAoc2VsZi5pbWFnZV9wYXRoLCBjb21ib19pdGVtKQorICAgICAgICAgICAgICAgICAgICB0bXBmaWxlLmNsb3NlKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuaW1hZ2VfcGF0aDoKKyAgICAgICAgICAgICAgICAgICAgbGJsID0gIjxiPk5vIHNlbGVjdGlvbiBtYWRlLjwvYj4iCisgICAgICAgICAgICAgICAgICAgIG1zZyA9ICJZb3UgaGF2ZSBub3Qgc2VsZWN0ZWQgYW4gaW1hZ2UgdG8gZGVwbG95LiIKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBsYmwgPSAiPGI+Tm8gc2VsZWN0aW9uIG1hZGUuPC9iPiIKKyAgICAgICAgICAgICAgICAgICAgbXNnID0gIllvdSBoYXZlIG5vdCBzZWxlY3RlZCBhIFVTQiBkZXZpY2UuIgorICAgICAgICAgICAgaWYgbGVuKGxibCk6CisgICAgICAgICAgICAgICAgY3J1bWJzX2RpYWxvZyA9IENydW1ic01lc3NhZ2VEaWFsb2coc2VsZiwgbGJsLCBndGsuTUVTU0FHRV9JTkZPLCBtc2cpCisgICAgICAgICAgICAgICAgYnV0dG9uID0gY3J1bWJzX2RpYWxvZy5hZGRfYnV0dG9uKCJDbG9zZSIsIGd0ay5SRVNQT05TRV9PSykKKyAgICAgICAgICAgICAgICBIb2JCdXR0b24uc3R5bGVfYnV0dG9uKGJ1dHRvbikKKyAgICAgICAgICAgICAgICBjcnVtYnNfZGlhbG9nLnJ1bigpCisgICAgICAgICAgICAgICAgY3J1bWJzX2RpYWxvZy5kZXN0cm95KCkKKworICAgIGRlZiB1cGRhdGVfcHJvZ3Jlc3NfYmFyKHNlbGYsIHRpdGxlLCBmcmFjdGlvbiwgc3RhdHVzPU5vbmUpOgorICAgICAgICBzZWxmLnByb2dyZXNzX2Jhci51cGRhdGUoZnJhY3Rpb24pCisgICAgICAgIHNlbGYucHJvZ3Jlc3NfYmFyLnNldF90aXRsZSh0aXRsZSkKKyAgICAgICAgc2VsZi5wcm9ncmVzc19iYXIuc2V0X3Jjc3R5bGUoc3RhdHVzKQorCisgICAgZGVmIHdyaXRlX2ZpbGUoc2VsZiwgaWZpbGUsIG9maWxlKToKKyAgICAgICAgc2VsZi5wcm9ncmVzc19iYXIucmVzZXQoKQorICAgICAgICBzZWxmLnByb2dyZXNzX2Jhci5zaG93KCkKKworICAgICAgICBmX2Zyb20gPSBvcy5vcGVuKGlmaWxlLCBvcy5PX1JET05MWSkKKyAgICAgICAgZl90byA9IG9zLm9wZW4ob2ZpbGUsIG9zLk9fV1JPTkxZKQorCisgICAgICAgIHRvdGFsX3NpemUgPSBvcy5zdGF0KGlmaWxlKS5zdF9zaXplCisgICAgICAgIHdyaXR0ZW5fc2l6ZSA9IDAKKworICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgYnVmID0gb3MucmVhZChmX2Zyb20sIDEwMjQqMTAyNCkKKyAgICAgICAgICAgIGlmIG5vdCBidWY6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIG9zLndyaXRlKGZfdG8sIGJ1ZikKKyAgICAgICAgICAgIHdyaXR0ZW5fc2l6ZSArPSAxMDI0KjEwMjQKKyAgICAgICAgICAgIHNlbGYudXBkYXRlX3Byb2dyZXNzX2JhcigiV3JpdGluZyB0byB1c2I6Iiwgd3JpdHRlbl9zaXplICogMS4wL3RvdGFsX3NpemUpCisKKyAgICAgICAgc2VsZi51cGRhdGVfcHJvZ3Jlc3NfYmFyKCJXcml0aW5nIGNvbXBsZXRlZDoiLCAxLjApCisgICAgICAgIG9zLmNsb3NlKGZfZnJvbSkKKyAgICAgICAgb3MuY2xvc2UoZl90bykKKyAgICAgICAgc2VsZi5wcm9ncmVzc19iYXIuaGlkZSgpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaGlnL2ltYWdlc2VsZWN0aW9uZGlhbG9nLnB5IGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2hpZy9pbWFnZXNlbGVjdGlvbmRpYWxvZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTIxNmFkCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2hpZy9pbWFnZXNlbGVjdGlvbmRpYWxvZy5weQpAQCAtMCwwICsxLDE3MiBAQAorIworIyBCaXRCYWtlIEdyYXBoaWNhbCBHVEsgVXNlciBJbnRlcmZhY2UKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgICBJbnRlbCBDb3Jwb3JhdGlvbgorIworIyBBdXRob3JlZCBieSBKb3NodWEgTG9jayA8am9zaEBsaW51eC5pbnRlbC5jb20+CisjIEF1dGhvcmVkIGJ5IERvbmd4aWFvIFh1IDxkb25neGlhby54dUBpbnRlbC5jb20+CisjIEF1dGhvcmVkIGJ5IFNoYW5lIFdhbmcgPHNoYW5lLndhbmdAaW50ZWwuY29tPgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworaW1wb3J0IGd0aworaW1wb3J0IGdvYmplY3QKK2ltcG9ydCBvcworZnJvbSBiYi51aS5jcnVtYnMuaG9id2lkZ2V0IGltcG9ydCBIb2JWaWV3VGFibGUsIEhvYkluZm9CdXR0b24sIEhvYkJ1dHRvbiwgSG9iQWx0QnV0dG9uCitmcm9tIGJiLnVpLmNydW1icy5oaWcuY3J1bWJzZGlhbG9nIGltcG9ydCBDcnVtYnNEaWFsb2cKK2Zyb20gYmIudWkuY3J1bWJzLmhpZy5sYXllcnNlbGVjdGlvbmRpYWxvZyBpbXBvcnQgTGF5ZXJTZWxlY3Rpb25EaWFsb2cKKworIiIiCitUaGUgZm9sbG93aW5nIGFyZSBjb252ZW5pZW5jZSBjbGFzc2VzIGZvciBpbXBsZW1lbnRpbmcgR05PTUUgSElHIGNvbXBsaWFudAorQml0QmFrZSBHVUkncworSW4gc3VtbWFyeTogc3BhY2luZyA9IDEycHgsIGJvcmRlci13aWR0aCA9IDZweAorIiIiCisKK2NsYXNzIEltYWdlU2VsZWN0aW9uRGlhbG9nIChDcnVtYnNEaWFsb2cpOgorCisgICAgX19jb2x1bW5zX18gPSBbeworICAgICAgICAgICAgJ2NvbF9uYW1lJyA6ICdJbWFnZSBuYW1lJywKKyAgICAgICAgICAgICdjb2xfaWQnICAgOiAwLAorICAgICAgICAgICAgJ2NvbF9zdHlsZSc6ICd0ZXh0JywKKyAgICAgICAgICAgICdjb2xfbWluJyAgOiA0MDAsCisgICAgICAgICAgICAnY29sX21heCcgIDogNDAwCisgICAgICAgIH0sIHsKKyAgICAgICAgICAgICdjb2xfbmFtZScgOiAnU2VsZWN0JywKKyAgICAgICAgICAgICdjb2xfaWQnICAgOiAxLAorICAgICAgICAgICAgJ2NvbF9zdHlsZSc6ICdyYWRpbyB0b2dnbGUnLAorICAgICAgICAgICAgJ2NvbF9taW4nICA6IDE2MCwKKyAgICAgICAgICAgICdjb2xfbWF4JyAgOiAxNjAKKyAgICB9XQorCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaW1hZ2VfZm9sZGVyLCBpbWFnZV90eXBlcywgdGl0bGUsIHBhcmVudCwgZmxhZ3MsIGJ1dHRvbnM9Tm9uZSwgaW1hZ2VfZXh0ZW5zaW9uID0ge30pOgorICAgICAgICBzdXBlcihJbWFnZVNlbGVjdGlvbkRpYWxvZywgc2VsZikuX19pbml0X18odGl0bGUsIHBhcmVudCwgZmxhZ3MsIGJ1dHRvbnMpCisgICAgICAgIHNlbGYuY29ubmVjdCgicmVzcG9uc2UiLCBzZWxmLnJlc3BvbnNlX2NiKQorCisgICAgICAgIHNlbGYuaW1hZ2VfZm9sZGVyID0gaW1hZ2VfZm9sZGVyCisgICAgICAgIHNlbGYuaW1hZ2VfdHlwZXMgID0gaW1hZ2VfdHlwZXMKKyAgICAgICAgc2VsZi5pbWFnZV9saXN0ID0gW10KKyAgICAgICAgc2VsZi5pbWFnZV9uYW1lcyA9IFtdCisgICAgICAgIHNlbGYuaW1hZ2VfZXh0ZW5zaW9uID0gaW1hZ2VfZXh0ZW5zaW9uCisKKyAgICAgICAgIyBjcmVhdGUgdmlzdWFsIGVsZW1lbnRzIG9uIHRoZSBkaWFsb2cKKyAgICAgICAgc2VsZi5jcmVhdGVfdmlzdWFsX2VsZW1lbnRzKCkKKworICAgICAgICBzZWxmLmltYWdlX3N0b3JlID0gZ3RrLkxpc3RTdG9yZShnb2JqZWN0LlRZUEVfU1RSSU5HLCBnb2JqZWN0LlRZUEVfQk9PTEVBTikKKyAgICAgICAgc2VsZi5maWxsX2ltYWdlX3N0b3JlKCkKKworICAgIGRlZiBjcmVhdGVfdmlzdWFsX2VsZW1lbnRzKHNlbGYpOgorICAgICAgICBoYm94ID0gZ3RrLkhCb3goRmFsc2UsIDYpCisKKyAgICAgICAgc2VsZi52Ym94LnBhY2tfc3RhcnQoaGJveCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorCisgICAgICAgIGVudHJ5ID0gZ3RrLkVudHJ5KCkKKyAgICAgICAgZW50cnkuc2V0X3RleHQoc2VsZi5pbWFnZV9mb2xkZXIpCisgICAgICAgIHRhYmxlID0gZ3RrLlRhYmxlKDEsIDEwLCBUcnVlKQorICAgICAgICB0YWJsZS5zZXRfc2l6ZV9yZXF1ZXN0KDU2MCwgLTEpCisgICAgICAgIGhib3gucGFja19zdGFydCh0YWJsZSwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICB0YWJsZS5hdHRhY2goZW50cnksIDAsIDksIDAsIDEpCisgICAgICAgIGltYWdlID0gZ3RrLkltYWdlKCkKKyAgICAgICAgaW1hZ2Uuc2V0X2Zyb21fc3RvY2soZ3RrLlNUT0NLX09QRU4sIGd0ay5JQ09OX1NJWkVfQlVUVE9OKQorICAgICAgICBvcGVuX2J1dHRvbiA9IGd0ay5CdXR0b24oKQorICAgICAgICBvcGVuX2J1dHRvbi5zZXRfaW1hZ2UoaW1hZ2UpCisgICAgICAgIG9wZW5fYnV0dG9uLmNvbm5lY3QoImNsaWNrZWQiLCBzZWxmLnNlbGVjdF9wYXRoX2NiLCBzZWxmLCBlbnRyeSkKKyAgICAgICAgdGFibGUuYXR0YWNoKG9wZW5fYnV0dG9uLCA5LCAxMCwgMCwgMSkKKworICAgICAgICBzZWxmLmltYWdlX3RhYmxlID0gSG9iVmlld1RhYmxlKHNlbGYuX19jb2x1bW5zX18sICJJbWFnZXMiKQorICAgICAgICBzZWxmLmltYWdlX3RhYmxlLnNldF9zaXplX3JlcXVlc3QoLTEsIDMwMCkKKyAgICAgICAgc2VsZi5pbWFnZV90YWJsZS5jb25uZWN0KCJ0b2dnbGVkIiwgc2VsZi50b2dnbGVkX2NiKQorICAgICAgICBzZWxmLmltYWdlX3RhYmxlLmNvbm5lY3RfZ3JvdXBfc2VsZWN0aW9uKHNlbGYudGFibGVfc2VsZWN0ZWRfY2IpCisgICAgICAgIHNlbGYuaW1hZ2VfdGFibGUuY29ubmVjdCgicm93LWFjdGl2YXRlZCIsIHNlbGYucm93X2FjdGl2ZWRfY2IpCisgICAgICAgIHNlbGYudmJveC5wYWNrX3N0YXJ0KHNlbGYuaW1hZ2VfdGFibGUsIGV4cGFuZD1UcnVlLCBmaWxsPVRydWUpCisKKyAgICAgICAgc2VsZi5zaG93X2FsbCgpCisKKyAgICBkZWYgY2hhbmdlX2ltYWdlX2NiKHNlbGYsIG1vZGVsLCBwYXRoLCBjb2x1bW5pZCk6CisgICAgICAgIGlmIG5vdCBtb2RlbDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpdGVyID0gbW9kZWwuZ2V0X2l0ZXJfZmlyc3QoKQorICAgICAgICB3aGlsZSBpdGVyOgorICAgICAgICAgICAgcm93cGF0aCA9IG1vZGVsLmdldF9wYXRoKGl0ZXIpCisgICAgICAgICAgICBtb2RlbFtyb3dwYXRoXVtjb2x1bW5pZF0gPSBGYWxzZQorICAgICAgICAgICAgaXRlciA9IG1vZGVsLml0ZXJfbmV4dChpdGVyKQorCisgICAgICAgIG1vZGVsW3BhdGhdW2NvbHVtbmlkXSA9IFRydWUKKworICAgIGRlZiB0b2dnbGVkX2NiKHNlbGYsIHRhYmxlLCBjZWxsLCBwYXRoLCBjb2x1bW5pZCwgdHJlZSk6CisgICAgICAgIG1vZGVsID0gdHJlZS5nZXRfbW9kZWwoKQorICAgICAgICBzZWxmLmNoYW5nZV9pbWFnZV9jYihtb2RlbCwgcGF0aCwgY29sdW1uaWQpCisKKyAgICBkZWYgdGFibGVfc2VsZWN0ZWRfY2Ioc2VsZiwgc2VsZWN0aW9uKToKKyAgICAgICAgbW9kZWwsIHBhdGhzID0gc2VsZWN0aW9uLmdldF9zZWxlY3RlZF9yb3dzKCkKKyAgICAgICAgaWYgcGF0aHM6CisgICAgICAgICAgICBzZWxmLmNoYW5nZV9pbWFnZV9jYihtb2RlbCwgcGF0aHNbMF0sIDEpCisKKyAgICBkZWYgcm93X2FjdGl2ZWRfY2Ioc2VsZiwgdGFiLCBtb2RlbCwgcGF0aCk6CisgICAgICAgIHNlbGYuY2hhbmdlX2ltYWdlX2NiKG1vZGVsLCBwYXRoLCAxKQorICAgICAgICBzZWxmLmVtaXQoJ3Jlc3BvbnNlJywgZ3RrLlJFU1BPTlNFX1lFUykKKworICAgIGRlZiBzZWxlY3RfcGF0aF9jYihzZWxmLCBhY3Rpb24sIHBhcmVudCwgZW50cnkpOgorICAgICAgICBkaWFsb2cgPSBndGsuRmlsZUNob29zZXJEaWFsb2coIiIsIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0ay5GSUxFX0NIT09TRVJfQUNUSU9OX1NFTEVDVF9GT0xERVIpCisgICAgICAgIHRleHQgPSBlbnRyeS5nZXRfdGV4dCgpCisgICAgICAgIGRpYWxvZy5zZXRfY3VycmVudF9mb2xkZXIodGV4dCBpZiBsZW4odGV4dCkgPiAwIGVsc2Ugb3MuZ2V0Y3dkKCkpCisgICAgICAgIGJ1dHRvbiA9IGRpYWxvZy5hZGRfYnV0dG9uKCJDYW5jZWwiLCBndGsuUkVTUE9OU0VfTk8pCisgICAgICAgIEhvYkFsdEJ1dHRvbi5zdHlsZV9idXR0b24oYnV0dG9uKQorICAgICAgICBidXR0b24gPSBkaWFsb2cuYWRkX2J1dHRvbigiT3BlbiIsIGd0ay5SRVNQT05TRV9ZRVMpCisgICAgICAgIEhvYkJ1dHRvbi5zdHlsZV9idXR0b24oYnV0dG9uKQorICAgICAgICByZXNwb25zZSA9IGRpYWxvZy5ydW4oKQorICAgICAgICBpZiByZXNwb25zZSA9PSBndGsuUkVTUE9OU0VfWUVTOgorICAgICAgICAgICAgcGF0aCA9IGRpYWxvZy5nZXRfZmlsZW5hbWUoKQorICAgICAgICAgICAgZW50cnkuc2V0X3RleHQocGF0aCkKKyAgICAgICAgICAgIHNlbGYuaW1hZ2VfZm9sZGVyID0gcGF0aAorICAgICAgICAgICAgc2VsZi5maWxsX2ltYWdlX3N0b3JlKCkKKworICAgICAgICBkaWFsb2cuZGVzdHJveSgpCisKKyAgICBkZWYgZmlsbF9pbWFnZV9zdG9yZShzZWxmKToKKyAgICAgICAgc2VsZi5pbWFnZV9saXN0ID0gW10KKyAgICAgICAgc2VsZi5pbWFnZV9zdG9yZS5jbGVhcigpCisgICAgICAgIGltYWdlc2V0ID0gc2V0KCkKKyAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsoc2VsZi5pbWFnZV9mb2xkZXIpOgorICAgICAgICAgICAgIyBpZ25vcmUgdGhlIHN1YiBkaXJlY3RvcmllcworICAgICAgICAgICAgZGlyc1s6XSA9IFtdCisgICAgICAgICAgICBmb3IgZiBpbiBmaWxlczoKKyAgICAgICAgICAgICAgICBmb3IgaW1hZ2VfdHlwZSBpbiBzZWxmLmltYWdlX3R5cGVzOgorICAgICAgICAgICAgICAgICAgICBpZiBpbWFnZV90eXBlIGluIHNlbGYuaW1hZ2VfZXh0ZW5zaW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVhbF90eXBlcyA9IHNlbGYuaW1hZ2VfZXh0ZW5zaW9uW2ltYWdlX3R5cGVdCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICByZWFsX3R5cGVzID0gW2ltYWdlX3R5cGVdCisgICAgICAgICAgICAgICAgICAgIGZvciByZWFsX2ltYWdlX3R5cGUgaW4gcmVhbF90eXBlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGYuZW5kc3dpdGgoJy4nICsgcmVhbF9pbWFnZV90eXBlKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZXNldC5hZGQoZi5yc3BsaXQoJy4nICsgcmVhbF9pbWFnZV90eXBlKVswXS5yc3BsaXQoJy5yb290ZnMnKVswXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmltYWdlX2xpc3QuYXBwZW5kKGYpCisKKyAgICAgICAgZm9yIGltYWdlIGluIGltYWdlc2V0OgorICAgICAgICAgICAgc2VsZi5pbWFnZV9zdG9yZS5zZXQoc2VsZi5pbWFnZV9zdG9yZS5hcHBlbmQoKSwgMCwgaW1hZ2UsIDEsIEZhbHNlKQorCisgICAgICAgIHNlbGYuaW1hZ2VfdGFibGUuc2V0X21vZGVsKHNlbGYuaW1hZ2Vfc3RvcmUpCisKKyAgICBkZWYgcmVzcG9uc2VfY2Ioc2VsZiwgZGlhbG9nLCByZXNwb25zZV9pZCk6CisgICAgICAgIHNlbGYuaW1hZ2VfbmFtZXMgPSBbXQorICAgICAgICBpZiByZXNwb25zZV9pZCA9PSBndGsuUkVTUE9OU0VfWUVTOgorICAgICAgICAgICAgaXRlciA9IHNlbGYuaW1hZ2Vfc3RvcmUuZ2V0X2l0ZXJfZmlyc3QoKQorICAgICAgICAgICAgd2hpbGUgaXRlcjoKKyAgICAgICAgICAgICAgICBwYXRoID0gc2VsZi5pbWFnZV9zdG9yZS5nZXRfcGF0aChpdGVyKQorICAgICAgICAgICAgICAgIGlmIHNlbGYuaW1hZ2Vfc3RvcmVbcGF0aF1bMV06CisgICAgICAgICAgICAgICAgICAgIGZvciBmIGluIHNlbGYuaW1hZ2VfbGlzdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGYuc3RhcnRzd2l0aChzZWxmLmltYWdlX3N0b3JlW3BhdGhdWzBdICsgJy4nKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmltYWdlX25hbWVzLmFwcGVuZChmKQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGl0ZXIgPSBzZWxmLmltYWdlX3N0b3JlLml0ZXJfbmV4dChpdGVyKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2hpZy9sYXllcnNlbGVjdGlvbmRpYWxvZy5weSBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9oaWcvbGF5ZXJzZWxlY3Rpb25kaWFsb2cucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJkNTdiNgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9oaWcvbGF5ZXJzZWxlY3Rpb25kaWFsb2cucHkKQEAgLTAsMCArMSwyOTggQEAKKyMKKyMgQml0QmFrZSBHcmFwaGljYWwgR1RLIFVzZXIgSW50ZXJmYWNlCisjCisjIENvcHlyaWdodCAoQykgMjAxMS0yMDEyICAgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgQXV0aG9yZWQgYnkgSm9zaHVhIExvY2sgPGpvc2hAbGludXguaW50ZWwuY29tPgorIyBBdXRob3JlZCBieSBEb25neGlhbyBYdSA8ZG9uZ3hpYW8ueHVAaW50ZWwuY29tPgorIyBBdXRob3JlZCBieSBTaGFuZSBXYW5nIDxzaGFuZS53YW5nQGludGVsLmNvbT4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBndGsKK2ltcG9ydCBnb2JqZWN0CitpbXBvcnQgb3MKK2ltcG9ydCB0ZW1wZmlsZQorZnJvbSBiYi51aS5jcnVtYnMuaG9id2lkZ2V0IGltcG9ydCBoaWMsIEhvYkJ1dHRvbiwgSG9iQWx0QnV0dG9uCitmcm9tIGJiLnVpLmNydW1icy5oaWcuY3J1bWJzZGlhbG9nIGltcG9ydCBDcnVtYnNEaWFsb2cKK2Zyb20gYmIudWkuY3J1bWJzLmhpZy5jcnVtYnNtZXNzYWdlZGlhbG9nIGltcG9ydCBDcnVtYnNNZXNzYWdlRGlhbG9nCisKKyIiIgorVGhlIGZvbGxvd2luZyBhcmUgY29udmVuaWVuY2UgY2xhc3NlcyBmb3IgaW1wbGVtZW50aW5nIEdOT01FIEhJRyBjb21wbGlhbnQKK0JpdEJha2UgR1VJJ3MKK0luIHN1bW1hcnk6IHNwYWNpbmcgPSAxMnB4LCBib3JkZXItd2lkdGggPSA2cHgKKyIiIgorCitjbGFzcyBDZWxsUmVuZGVyZXJQaXhidWZBY3RpdmF0YWJsZShndGsuQ2VsbFJlbmRlcmVyUGl4YnVmKToKKyAgICAiIiIKKyAgICBBIGN1c3RvbSBDZWxsUmVuZGVyZXIgaW1wbGVtZW50YXRpb24gd2hpY2ggaXMgYWN0aXZhdGFibGUKKyAgICBzbyB0aGF0IHdlIGNhbiBoYW5kbGUgdXNlciBjbGlja3MKKyAgICAiIiIKKyAgICBfX2dzaWduYWxzX18gICAgPSB7ICdjbGlja2VkJyA6IChnb2JqZWN0LlNJR05BTF9SVU5fTEFTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ29iamVjdC5UWVBFX1NUUklORywpKSwgfQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBndGsuQ2VsbFJlbmRlcmVyUGl4YnVmLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuc2V0X3Byb3BlcnR5KCdtb2RlJywgZ3RrLkNFTExfUkVOREVSRVJfTU9ERV9BQ1RJVkFUQUJMRSkKKyAgICAgICAgc2VsZi5zZXRfcHJvcGVydHkoJ2ZvbGxvdy1zdGF0ZScsIFRydWUpCisKKyAgICAiIiIKKyAgICBSZXNwb25kIHRvIGEgdXNlciBjbGljayBvbiBhIGNlbGwKKyAgICAiIiIKKyAgICBkZWYgZG9fYWN0aXZhdGUoc2VsZiwgZXZlbiwgd2lkZ2V0LCBwYXRoLCBiYWNrZ3JvdW5kX2FyZWEsIGNlbGxfYXJlYSwgZmxhZ3MpOgorICAgICAgICBzZWxmLmVtaXQoJ2NsaWNrZWQnLCBwYXRoKQorCisjCisjIExheWVyU2VsZWN0aW9uRGlhbG9nCisjCitjbGFzcyBMYXllclNlbGVjdGlvbkRpYWxvZyAoQ3J1bWJzRGlhbG9nKToKKworICAgIFRBUkdFVFMgPSBbCisgICAgICAgICgiTVlfVFJFRV9NT0RFTF9ST1ciLCBndGsuVEFSR0VUX1NBTUVfV0lER0VULCAwKSwKKyAgICAgICAgKCJ0ZXh0L3BsYWluIiwgMCwgMSksCisgICAgICAgICgiVEVYVCIsIDAsIDIpLAorICAgICAgICAoIlNUUklORyIsIDAsIDMpLAorICAgICAgICBdCisKKyAgICBkZWYgZ2VuX2xhYmVsX3dpZGdldChzZWxmLCBjb250ZW50KToKKyAgICAgICAgbGFiZWwgPSBndGsuTGFiZWwoKQorICAgICAgICBsYWJlbC5zZXRfYWxpZ25tZW50KDAsIDApCisgICAgICAgIGxhYmVsLnNldF9tYXJrdXAoY29udGVudCkKKyAgICAgICAgbGFiZWwuc2hvdygpCisgICAgICAgIHJldHVybiBsYWJlbAorCisgICAgZGVmIGxheWVyX3dpZGdldF90b2dnbGVkX2NiKHNlbGYsIGNlbGwsIHBhdGgsIGxheWVyX3N0b3JlKToKKyAgICAgICAgbmFtZSA9IGxheWVyX3N0b3JlW3BhdGhdWzBdCisgICAgICAgIHRvZ2dsZSA9IG5vdCBsYXllcl9zdG9yZVtwYXRoXVsxXQorICAgICAgICBsYXllcl9zdG9yZVtwYXRoXVsxXSA9IHRvZ2dsZQorCisgICAgZGVmIGxheWVyX3dpZGdldF9hZGRfY2xpY2tlZF9jYihzZWxmLCBhY3Rpb24sIGxheWVyX3N0b3JlLCBwYXJlbnQpOgorICAgICAgICBkaWFsb2cgPSBndGsuRmlsZUNob29zZXJEaWFsb2coIkFkZCBuZXcgbGF5ZXIiLCBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGsuRklMRV9DSE9PU0VSX0FDVElPTl9TRUxFQ1RfRk9MREVSKQorICAgICAgICBidXR0b24gPSBkaWFsb2cuYWRkX2J1dHRvbigiQ2FuY2VsIiwgZ3RrLlJFU1BPTlNFX05PKQorICAgICAgICBIb2JBbHRCdXR0b24uc3R5bGVfYnV0dG9uKGJ1dHRvbikKKyAgICAgICAgYnV0dG9uID0gZGlhbG9nLmFkZF9idXR0b24oIk9wZW4iLCBndGsuUkVTUE9OU0VfWUVTKQorICAgICAgICBIb2JCdXR0b24uc3R5bGVfYnV0dG9uKGJ1dHRvbikKKyAgICAgICAgbGFiZWwgPSBndGsuTGFiZWwoIlNlbGVjdCB0aGUgbGF5ZXIgeW91IHdpc2ggdG8gYWRkIikKKyAgICAgICAgbGFiZWwuc2hvdygpCisgICAgICAgIGRpYWxvZy5zZXRfZXh0cmFfd2lkZ2V0KGxhYmVsKQorICAgICAgICByZXNwb25zZSA9IGRpYWxvZy5ydW4oKQorICAgICAgICBwYXRoID0gZGlhbG9nLmdldF9maWxlbmFtZSgpCisgICAgICAgIGRpYWxvZy5kZXN0cm95KCkKKworICAgICAgICBsYmwgPSAiPGI+RXJyb3I8L2I+IgorICAgICAgICBtc2cgPSAiVW5hYmxlIHRvIGxvYWQgbGF5ZXIgPGk+JXM8L2k+IGJlY2F1c2UgIiAlIHBhdGgKKyAgICAgICAgaWYgcmVzcG9uc2UgPT0gZ3RrLlJFU1BPTlNFX1lFUzoKKyAgICAgICAgICAgIGltcG9ydCBvcworICAgICAgICAgICAgaW1wb3J0IG9zLnBhdGgKKyAgICAgICAgICAgIGxheWVycyA9IFtdCisgICAgICAgICAgICBpdCA9IGxheWVyX3N0b3JlLmdldF9pdGVyX2ZpcnN0KCkKKyAgICAgICAgICAgIHdoaWxlIGl0OgorICAgICAgICAgICAgICAgIGxheWVycy5hcHBlbmQobGF5ZXJfc3RvcmUuZ2V0X3ZhbHVlKGl0LCAwKSkKKyAgICAgICAgICAgICAgICBpdCA9IGxheWVyX3N0b3JlLml0ZXJfbmV4dChpdCkKKworICAgICAgICAgICAgaWYgbm90IHBhdGg6CisgICAgICAgICAgICAgICAgbXNnICs9ICJpdCBpcyBhbiBpbnZhbGlkIHBhdGguIgorICAgICAgICAgICAgZWxpZiBub3Qgb3MucGF0aC5leGlzdHMocGF0aCsiL2NvbmYvbGF5ZXIuY29uZiIpOgorICAgICAgICAgICAgICAgIG1zZyArPSAidGhlcmUgaXMgbm8gbGF5ZXIuY29uZiBpbnNpZGUgdGhlIGRpcmVjdG9yeS4iCisgICAgICAgICAgICBlbGlmIHBhdGggaW4gbGF5ZXJzOgorICAgICAgICAgICAgICAgIG1zZyArPSAiaXQgaXMgYWxyZWFkeSBpbiBsb2FkZWQgbGF5ZXJzLiIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbGF5ZXJfc3RvcmUuYXBwZW5kKFtwYXRoXSkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGRpYWxvZyA9IENydW1ic01lc3NhZ2VEaWFsb2cocGFyZW50LCBsYmwsIGd0ay5NRVNTQUdFX0VSUk9SLCBtc2cpCisgICAgICAgICAgICBkaWFsb2cuYWRkX2J1dHRvbihndGsuU1RPQ0tfQ0xPU0UsIGd0ay5SRVNQT05TRV9PSykKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZGlhbG9nLnJ1bigpCisgICAgICAgICAgICBkaWFsb2cuZGVzdHJveSgpCisKKyAgICBkZWYgbGF5ZXJfd2lkZ2V0X2RlbF9jbGlja2VkX2NiKHNlbGYsIGFjdGlvbiwgdHJlZV9zZWxlY3Rpb24sIGxheWVyX3N0b3JlKToKKyAgICAgICAgbW9kZWwsIGl0ZXIgPSB0cmVlX3NlbGVjdGlvbi5nZXRfc2VsZWN0ZWQoKQorICAgICAgICBpZiBpdGVyOgorICAgICAgICAgICAgbGF5ZXJfc3RvcmUucmVtb3ZlKGl0ZXIpCisKKworICAgIGRlZiBnZW5fbGF5ZXJfd2lkZ2V0KHNlbGYsIGxheWVycywgbGF5ZXJzX2F2YWlsLCB3aW5kb3csIHRvb2x0aXA9IiIpOgorICAgICAgICBoYm94ID0gZ3RrLkhCb3goRmFsc2UsIDYpCisKKyAgICAgICAgbGF5ZXJfdHYgPSBndGsuVHJlZVZpZXcoKQorICAgICAgICBsYXllcl90di5zZXRfcnVsZXNfaGludChUcnVlKQorICAgICAgICBsYXllcl90di5zZXRfaGVhZGVyc192aXNpYmxlKEZhbHNlKQorICAgICAgICB0cmVlX3NlbGVjdGlvbiA9IGxheWVyX3R2LmdldF9zZWxlY3Rpb24oKQorICAgICAgICB0cmVlX3NlbGVjdGlvbi5zZXRfbW9kZShndGsuU0VMRUNUSU9OX1NJTkdMRSkKKworICAgICAgICAjIEFsbG93IGVuYWJsZSBkcmFnIGFuZCBkcm9wIG9mIHJvd3MgaW5jbHVkaW5nIHJvdyBtb3ZlCisgICAgICAgIGRuZF9pbnRlcm5hbF90YXJnZXQgPSAnJworICAgICAgICBkbmRfdGFyZ2V0cyA9IFsoZG5kX2ludGVybmFsX3RhcmdldCwgZ3RrLlRBUkdFVF9TQU1FX1dJREdFVCwgMCldCisgICAgICAgIGxheWVyX3R2LmVuYWJsZV9tb2RlbF9kcmFnX3NvdXJjZSggZ3RrLmdkay5CVVRUT04xX01BU0ssCisgICAgICAgICAgICBkbmRfdGFyZ2V0cywKKyAgICAgICAgICAgIGd0ay5nZGsuQUNUSU9OX01PVkUpCisgICAgICAgIGxheWVyX3R2LmVuYWJsZV9tb2RlbF9kcmFnX2Rlc3QoZG5kX3RhcmdldHMsCisgICAgICAgICAgICBndGsuZ2RrLkFDVElPTl9NT1ZFKQorICAgICAgICBsYXllcl90di5jb25uZWN0KCJkcmFnX2RhdGFfZ2V0Iiwgc2VsZi5kcmFnX2RhdGFfZ2V0X2NiKQorICAgICAgICBsYXllcl90di5jb25uZWN0KCJkcmFnX2RhdGFfcmVjZWl2ZWQiLCBzZWxmLmRyYWdfZGF0YV9yZWNlaXZlZF9jYikKKworICAgICAgICBjb2wwPSBndGsuVHJlZVZpZXdDb2x1bW4oJ1BhdGgnKQorICAgICAgICBjZWxsMCA9IGd0ay5DZWxsUmVuZGVyZXJUZXh0KCkKKyAgICAgICAgY2VsbDAuc2V0X3BhZGRpbmcoNSwyKQorICAgICAgICBjb2wwLnBhY2tfc3RhcnQoY2VsbDAsIFRydWUpCisgICAgICAgIGNvbDAuc2V0X2NlbGxfZGF0YV9mdW5jKGNlbGwwLCBzZWxmLmRyYXdfbGF5ZXJfcGF0aF9jYikKKyAgICAgICAgbGF5ZXJfdHYuYXBwZW5kX2NvbHVtbihjb2wwKQorCisgICAgICAgIHNjcm9sbCA9IGd0ay5TY3JvbGxlZFdpbmRvdygpCisgICAgICAgIHNjcm9sbC5zZXRfcG9saWN5KGd0ay5QT0xJQ1lfTkVWRVIsIGd0ay5QT0xJQ1lfQVVUT01BVElDKQorICAgICAgICBzY3JvbGwuc2V0X3NoYWRvd190eXBlKGd0ay5TSEFET1dfSU4pCisgICAgICAgIHNjcm9sbC5hZGQobGF5ZXJfdHYpCisKKyAgICAgICAgdGFibGVfbGF5ZXIgPSBndGsuVGFibGUoMiwgMTAsIEZhbHNlKQorICAgICAgICBoYm94LnBhY2tfc3RhcnQodGFibGVfbGF5ZXIsIGV4cGFuZD1UcnVlLCBmaWxsPVRydWUpCisKKyAgICAgICAgdGFibGVfbGF5ZXIuYXR0YWNoKHNjcm9sbCwgMCwgMTAsIDAsIDEpCisKKyAgICAgICAgbGF5ZXJfc3RvcmUgPSBndGsuTGlzdFN0b3JlKGdvYmplY3QuVFlQRV9TVFJJTkcpCisgICAgICAgIGZvciBsYXllciBpbiBsYXllcnM6CisgICAgICAgICAgICBsYXllcl9zdG9yZS5hcHBlbmQoW2xheWVyXSkKKworICAgICAgICBjb2wxID0gZ3RrLlRyZWVWaWV3Q29sdW1uKCdFbmFibGVkJykKKyAgICAgICAgbGF5ZXJfdHYuYXBwZW5kX2NvbHVtbihjb2wxKQorCisgICAgICAgIGNlbGwxID0gQ2VsbFJlbmRlcmVyUGl4YnVmQWN0aXZhdGFibGUoKQorICAgICAgICBjZWxsMS5zZXRfZml4ZWRfc2l6ZSgtMSwzNSkKKyAgICAgICAgY2VsbDEuY29ubmVjdCgiY2xpY2tlZCIsIHNlbGYuZGVsX2NlbGxfY2xpY2tlZF9jYiwgbGF5ZXJfc3RvcmUpCisgICAgICAgIGNvbDEucGFja19zdGFydChjZWxsMSwgVHJ1ZSkKKyAgICAgICAgY29sMS5zZXRfY2VsbF9kYXRhX2Z1bmMoY2VsbDEsIHNlbGYuZHJhd19kZWxldGVfYnV0dG9uX2NiLCBsYXllcl90dikKKworICAgICAgICBhZGRfYnV0dG9uID0gZ3RrLkJ1dHRvbigpCisgICAgICAgIGFkZF9idXR0b24uc2V0X3JlbGllZihndGsuUkVMSUVGX05PTkUpCisgICAgICAgIGJveCA9IGd0ay5IQm94KEZhbHNlLCA2KQorICAgICAgICBib3guc2hvdygpCisgICAgICAgIGFkZF9idXR0b24uYWRkKGJveCkKKyAgICAgICAgYWRkX2J1dHRvbi5jb25uZWN0KCJlbnRlci1ub3RpZnktZXZlbnQiLCBzZWxmLmFkZF9ob3Zlcl9jYikKKyAgICAgICAgYWRkX2J1dHRvbi5jb25uZWN0KCJsZWF2ZS1ub3RpZnktZXZlbnQiLCBzZWxmLmFkZF9sZWF2ZV9jYikKKyAgICAgICAgc2VsZi5pbSA9IGd0ay5JbWFnZSgpCisgICAgICAgIHNlbGYuaW0uc2V0X2Zyb21fZmlsZShoaWMuSUNPTl9JTkRJX0FERF9GSUxFKQorICAgICAgICBzZWxmLmltLnNob3coKQorICAgICAgICBib3gucGFja19zdGFydChzZWxmLmltLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UsIHBhZGRpbmc9NikKKyAgICAgICAgbGJsID0gZ3RrLkxhYmVsKCJBZGQgbGF5ZXIiKQorICAgICAgICBsYmwuc2V0X2FsaWdubWVudCgwLjAsIDAuNSkKKyAgICAgICAgbGJsLnNob3coKQorICAgICAgICBib3gucGFja19zdGFydChsYmwsIGV4cGFuZD1UcnVlLCBmaWxsPVRydWUsIHBhZGRpbmc9NikKKyAgICAgICAgYWRkX2J1dHRvbi5jb25uZWN0KCJjbGlja2VkIiwgc2VsZi5sYXllcl93aWRnZXRfYWRkX2NsaWNrZWRfY2IsIGxheWVyX3N0b3JlLCB3aW5kb3cpCisgICAgICAgIHRhYmxlX2xheWVyLmF0dGFjaChhZGRfYnV0dG9uLCAwLCAxMCwgMSwgMiwgZ3RrLkVYUEFORCB8IGd0ay5GSUxMLCAwLCAwLCA2KQorICAgICAgICBsYXllcl90di5zZXRfbW9kZWwobGF5ZXJfc3RvcmUpCisKKyAgICAgICAgaGJveC5zaG93X2FsbCgpCisKKyAgICAgICAgcmV0dXJuIGhib3gsIGxheWVyX3N0b3JlCisKKyAgICBkZWYgZHJhZ19kYXRhX2dldF9jYihzZWxmLCB0cmVldmlldywgY29udGV4dCwgc2VsZWN0aW9uLCB0YXJnZXRfaWQsIGV0aW1lKToKKyAgICAgICAgdHJlZXNlbGVjdGlvbiA9IHRyZWV2aWV3LmdldF9zZWxlY3Rpb24oKQorICAgICAgICBtb2RlbCwgaXRlciA9IHRyZWVzZWxlY3Rpb24uZ2V0X3NlbGVjdGVkKCkKKyAgICAgICAgZGF0YSA9IG1vZGVsLmdldF92YWx1ZShpdGVyLCAwKQorICAgICAgICBzZWxlY3Rpb24uc2V0KHNlbGVjdGlvbi50YXJnZXQsIDgsIGRhdGEpCisKKyAgICBkZWYgZHJhZ19kYXRhX3JlY2VpdmVkX2NiKHNlbGYsIHRyZWV2aWV3LCBjb250ZXh0LCB4LCB5LCBzZWxlY3Rpb24sIGluZm8sIGV0aW1lKToKKyAgICAgICAgbW9kZWwgPSB0cmVldmlldy5nZXRfbW9kZWwoKQorICAgICAgICBkYXRhID0gc2VsZWN0aW9uLmRhdGEKKyAgICAgICAgZHJvcF9pbmZvID0gdHJlZXZpZXcuZ2V0X2Rlc3Rfcm93X2F0X3Bvcyh4LCB5KQorICAgICAgICBpZiBkcm9wX2luZm86CisgICAgICAgICAgICBwYXRoLCBwb3NpdGlvbiA9IGRyb3BfaW5mbworICAgICAgICAgICAgaXRlciA9IG1vZGVsLmdldF9pdGVyKHBhdGgpCisgICAgICAgICAgICBpZiAocG9zaXRpb24gPT0gZ3RrLlRSRUVfVklFV19EUk9QX0JFRk9SRSBvciBwb3NpdGlvbiA9PSBndGsuVFJFRV9WSUVXX0RST1BfSU5UT19PUl9CRUZPUkUpOgorICAgICAgICAgICAgICAgIG1vZGVsLmluc2VydF9iZWZvcmUoaXRlciwgW2RhdGFdKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBtb2RlbC5pbnNlcnRfYWZ0ZXIoaXRlciwgW2RhdGFdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbW9kZWwuYXBwZW5kKFtkYXRhXSkKKyAgICAgICAgaWYgY29udGV4dC5hY3Rpb24gPT0gZ3RrLmdkay5BQ1RJT05fTU9WRToKKyAgICAgICAgICAgIGNvbnRleHQuZmluaXNoKFRydWUsIFRydWUsIGV0aW1lKQorICAgICAgICByZXR1cm4KKworICAgIGRlZiBhZGRfaG92ZXJfY2Ioc2VsZiwgYnV0dG9uLCBldmVudCk6CisgICAgICAgIHNlbGYuaW0uc2V0X2Zyb21fZmlsZShoaWMuSUNPTl9JTkRJX0FERF9IT1ZFUl9GSUxFKQorCisgICAgZGVmIGFkZF9sZWF2ZV9jYihzZWxmLCBidXR0b24sIGV2ZW50KToKKyAgICAgICAgc2VsZi5pbS5zZXRfZnJvbV9maWxlKGhpYy5JQ09OX0lORElfQUREX0ZJTEUpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGl0bGUsIGxheWVycywgbGF5ZXJzX25vbl9yZW1vdmFibGUsIGFsbF9sYXllcnMsIHBhcmVudCwgZmxhZ3MsIGJ1dHRvbnM9Tm9uZSk6CisgICAgICAgIHN1cGVyKExheWVyU2VsZWN0aW9uRGlhbG9nLCBzZWxmKS5fX2luaXRfXyh0aXRsZSwgcGFyZW50LCBmbGFncywgYnV0dG9ucykKKworICAgICAgICAjIGNsYXNzIG1lbWJlcnMgZnJvbSBvdGhlciBvYmplY3RzCisgICAgICAgIHNlbGYubGF5ZXJzID0gbGF5ZXJzCisgICAgICAgIHNlbGYubGF5ZXJzX25vbl9yZW1vdmFibGUgPSBsYXllcnNfbm9uX3JlbW92YWJsZQorICAgICAgICBzZWxmLmFsbF9sYXllcnMgPSBhbGxfbGF5ZXJzCisgICAgICAgIHNlbGYubGF5ZXJzX2NoYW5nZWQgPSBGYWxzZQorCisgICAgICAgICMgaWNvbiBmb3IgcmVtb3ZlIGJ1dHRvbiBpbiBUcmVlVmlldworICAgICAgICBpbSA9IGd0ay5JbWFnZSgpCisgICAgICAgIGltLnNldF9mcm9tX2ZpbGUoaGljLklDT05fSU5ESV9SRU1PVkVfRklMRSkKKyAgICAgICAgc2VsZi5yZW1faWNvbiA9IGltLmdldF9waXhidWYoKQorCisgICAgICAgICMgY2xhc3MgbWVtYmVycyBmb3IgaW50ZXJuYWwgdXNlCisgICAgICAgIHNlbGYubGF5ZXJfc3RvcmUgPSBOb25lCisKKyAgICAgICAgIyBjcmVhdGUgdmlzdWFsIGVsZW1lbnRzIG9uIHRoZSBkaWFsb2cKKyAgICAgICAgc2VsZi5jcmVhdGVfdmlzdWFsX2VsZW1lbnRzKCkKKyAgICAgICAgc2VsZi5jb25uZWN0KCJyZXNwb25zZSIsIHNlbGYucmVzcG9uc2VfY2IpCisKKyAgICBkZWYgY3JlYXRlX3Zpc3VhbF9lbGVtZW50cyhzZWxmKToKKyAgICAgICAgbGF5ZXJfd2lkZ2V0LCBzZWxmLmxheWVyX3N0b3JlID0gc2VsZi5nZW5fbGF5ZXJfd2lkZ2V0KHNlbGYubGF5ZXJzLCBzZWxmLmFsbF9sYXllcnMsIHNlbGYsIE5vbmUpCisgICAgICAgIGxheWVyX3dpZGdldC5zZXRfc2l6ZV9yZXF1ZXN0KDQ1MCwgMjUwKQorICAgICAgICBzZWxmLnZib3gucGFja19zdGFydChsYXllcl93aWRnZXQsIGV4cGFuZD1UcnVlLCBmaWxsPVRydWUpCisgICAgICAgIHNlbGYuc2hvd19hbGwoKQorCisgICAgZGVmIHJlc3BvbnNlX2NiKHNlbGYsIGRpYWxvZywgcmVzcG9uc2VfaWQpOgorICAgICAgICBtb2RlbCA9IHNlbGYubGF5ZXJfc3RvcmUKKyAgICAgICAgaXQgPSBtb2RlbC5nZXRfaXRlcl9maXJzdCgpCisgICAgICAgIGxheWVycyA9IFtdCisgICAgICAgIHdoaWxlIGl0OgorICAgICAgICAgICAgbGF5ZXJzLmFwcGVuZChtb2RlbC5nZXRfdmFsdWUoaXQsIDApKQorICAgICAgICAgICAgaXQgPSBtb2RlbC5pdGVyX25leHQoaXQpCisKKyAgICAgICAgc2VsZi5sYXllcnNfY2hhbmdlZCA9IChzZWxmLmxheWVycyAhPSBsYXllcnMpCisgICAgICAgIHNlbGYubGF5ZXJzID0gbGF5ZXJzCisKKyAgICAiIiIKKyAgICBBIGN1c3RvbSBjZWxsX2RhdGFfZnVuYyB0byBkcmF3IGEgZGVsZXRlICdidXR0b24nIGluIHRoZSBUcmVlVmlldyBmb3IgbGF5ZXJzCisgICAgb3RoZXIgdGhhbiB0aGUgbWV0YSBsYXllci4gVGhlIGRlbGV0aW9uIG9mIHdoaWNoIGlzIHByZXZlbnRlZCBzbyB0aGF0IHRoZQorICAgIHVzZXIgY2FuJ3Qgc2hvb3QgdGhlbXNlbHZlcyBpbiB0aGUgZm9vdCB0b28gYmFkbHkuCisgICAgIiIiCisgICAgZGVmIGRyYXdfZGVsZXRlX2J1dHRvbl9jYihzZWxmLCBjb2wsIGNlbGwsIG1vZGVsLCBpdCwgdHYpOgorICAgICAgICBwYXRoID0gIG1vZGVsLmdldF92YWx1ZShpdCwgMCkKKyAgICAgICAgaWYgcGF0aCBpbiBzZWxmLmxheWVyc19ub25fcmVtb3ZhYmxlOgorICAgICAgICAgICAgY2VsbC5zZXRfc2Vuc2l0aXZlKEZhbHNlKQorICAgICAgICAgICAgY2VsbC5zZXRfcHJvcGVydHkoJ3BpeGJ1ZicsIE5vbmUpCisgICAgICAgICAgICBjZWxsLnNldF9wcm9wZXJ0eSgnbW9kZScsIGd0ay5DRUxMX1JFTkRFUkVSX01PREVfSU5FUlQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjZWxsLnNldF9wcm9wZXJ0eSgncGl4YnVmJywgc2VsZi5yZW1faWNvbikKKyAgICAgICAgICAgIGNlbGwuc2V0X3NlbnNpdGl2ZShUcnVlKQorICAgICAgICAgICAgY2VsbC5zZXRfcHJvcGVydHkoJ21vZGUnLCBndGsuQ0VMTF9SRU5ERVJFUl9NT0RFX0FDVElWQVRBQkxFKQorCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAiIiIKKyAgICBBIGN1c3RvbSBjZWxsX2RhdGFfZnVuYyB0byB3cml0ZSBhbiBleHRyYSBtZXNzYWdlIGludG8gdGhlIGxheWVyIHBhdGggY2VsbAorICAgIGZvciB0aGUgbWV0YSBsYXllci4gV2Ugc2hvdWxkIGluZm9ybSB0aGUgdXNlciB0aGF0IHRoZXkgY2FuJ3QgcmVtb3ZlIGl0IGZvcgorICAgIHRoZWlyIG93biBzYWZldHkuCisgICAgIiIiCisgICAgZGVmIGRyYXdfbGF5ZXJfcGF0aF9jYihzZWxmLCBjb2wsIGNlbGwsIG1vZGVsLCBpdCk6CisgICAgICAgIHBhdGggPSBtb2RlbC5nZXRfdmFsdWUoaXQsIDApCisgICAgICAgIGlmIHBhdGggaW4gc2VsZi5sYXllcnNfbm9uX3JlbW92YWJsZToKKyAgICAgICAgICAgIGNlbGwuc2V0X3Byb3BlcnR5KCdtYXJrdXAnLCAiPGI+SXQgY2Fubm90IGJlIHJlbW92ZWQ8L2I+XG4lcyIgJSBwYXRoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY2VsbC5zZXRfcHJvcGVydHkoJ3RleHQnLCBwYXRoKQorCisgICAgZGVmIGRlbF9jZWxsX2NsaWNrZWRfY2Ioc2VsZiwgY2VsbCwgcGF0aCwgbW9kZWwpOgorICAgICAgICBpdCA9IG1vZGVsLmdldF9pdGVyX2Zyb21fc3RyaW5nKHBhdGgpCisgICAgICAgIG1vZGVsLnJlbW92ZShpdCkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9oaWcvcGFyc2luZ3dhcm5pbmdzZGlhbG9nLnB5IGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2hpZy9wYXJzaW5nd2FybmluZ3NkaWFsb2cucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNiYWMzOQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9oaWcvcGFyc2luZ3dhcm5pbmdzZGlhbG9nLnB5CkBAIC0wLDAgKzEsMTYzIEBACisjCisjIEJpdEJha2UgR3JhcGhpY2FsIEdUSyBVc2VyIEludGVyZmFjZQorIworIyBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiAgIEludGVsIENvcnBvcmF0aW9uCisjCisjIEF1dGhvcmVkIGJ5IENyaXN0aWFuYSBWb2ljdSA8Y3Jpc3RpYW5hLnZvaWN1QGludGVsLmNvbT4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBndGsKK2ltcG9ydCBnb2JqZWN0Citmcm9tIGJiLnVpLmNydW1icy5ob2J3aWRnZXQgaW1wb3J0IEhvYkFsdEJ1dHRvbgorZnJvbSBiYi51aS5jcnVtYnMuaGlnLmNydW1ic2RpYWxvZyBpbXBvcnQgQ3J1bWJzRGlhbG9nCisKKyIiIgorVGhlIGZvbGxvd2luZyBhcmUgY29udmVuaWVuY2UgY2xhc3NlcyBmb3IgaW1wbGVtZW50aW5nIEdOT01FIEhJRyBjb21wbGlhbnQKK0JpdEJha2UgR1VJJ3MKK0luIHN1bW1hcnk6IHNwYWNpbmcgPSAxMnB4LCBib3JkZXItd2lkdGggPSA2cHgKKyIiIgorCisjCisjIFBhcnNpbmdXYXJuaW5nc0RpYWxvZworIworY2xhc3MgUGFyc2luZ1dhcm5pbmdzRGlhbG9nIChDcnVtYnNEaWFsb2cpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRpdGxlLCB3YXJuaW5ncywgcGFyZW50LCBmbGFncywgYnV0dG9ucz1Ob25lKToKKyAgICAgICAgc3VwZXIoUGFyc2luZ1dhcm5pbmdzRGlhbG9nLCBzZWxmKS5fX2luaXRfXyh0aXRsZSwgcGFyZW50LCBmbGFncywgYnV0dG9ucykKKworICAgICAgICBzZWxmLndhcm5pbmdzID0gd2FybmluZ3MKKyAgICAgICAgc2VsZi53YXJuaW5nX29uID0gMAorICAgICAgICBzZWxmLndhcm5fbmIgPSBsZW4od2FybmluZ3MpCisKKyAgICAgICAgIyBjcmVhdGUgdmlzdWFsIGVsZW1lbnRzIG9uIHRoZSBkaWFsb2cKKyAgICAgICAgc2VsZi5jcmVhdGVfdmlzdWFsX2VsZW1lbnRzKCkKKworICAgIGRlZiBjYW5jZWxfYnV0dG9uX2NiKHNlbGYsIGJ1dHRvbik6CisgICAgICAgIHNlbGYuZGVzdHJveSgpCisKKyAgICBkZWYgcHJldmlvdXNfYnV0dG9uX2NiKHNlbGYsIGJ1dHRvbik6CisgICAgICAgIHNlbGYud2FybmluZ19vbiA9IHNlbGYud2FybmluZ19vbiAtIDEKKyAgICAgICAgc2VsZi5yZWZyZXNoX2NvbXBvbmVudHMoKQorCisgICAgZGVmIG5leHRfYnV0dG9uX2NiKHNlbGYsIGJ1dHRvbik6CisgICAgICAgIHNlbGYud2FybmluZ19vbiA9IHNlbGYud2FybmluZ19vbiArIDEKKyAgICAgICAgc2VsZi5yZWZyZXNoX2NvbXBvbmVudHMoKQorCisgICAgZGVmIHJlZnJlc2hfY29tcG9uZW50cyhzZWxmKToKKyAgICAgICAgbGJsID0gc2VsZi53YXJuaW5nc1tzZWxmLndhcm5pbmdfb25dCisgICAgICAgICN3aGVuIHRoZSB3YXJuaW5nIHRleHQgaGFzIG1vcmUgdGhhbiA0MDAgY2hhcnMsIGl0IHVzZXMgYSBzY3JvbGwgYmFyCisgICAgICAgIGlmIDA8PSBsZW4obGJsKSA8IDQwMDoKKyAgICAgICAgICAgIHNlbGYud2FybmluZ19sYWJlbC5zZXRfc2l6ZV9yZXF1ZXN0KDMyMCwgMjMwKQorICAgICAgICAgICAgc2VsZi53YXJuaW5nX2xhYmVsLnNldF91c2VfbWFya3VwKFRydWUpCisgICAgICAgICAgICBzZWxmLndhcm5pbmdfbGFiZWwuc2V0X2xpbmVfd3JhcChUcnVlKQorICAgICAgICAgICAgc2VsZi53YXJuaW5nX2xhYmVsLnNldF9tYXJrdXAobGJsKQorICAgICAgICAgICAgc2VsZi53YXJuaW5nX2xhYmVsLnNldF9wcm9wZXJ0eSgieWFsaWduIiwgMC4wMCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudGV4dFdpbmRvdy5zZXRfc2hhZG93X3R5cGUoZ3RrLlNIQURPV19JTikKKyAgICAgICAgICAgIHNlbGYudGV4dFdpbmRvdy5zZXRfcG9saWN5KGd0ay5QT0xJQ1lfQVVUT01BVElDLCBndGsuUE9MSUNZX0FVVE9NQVRJQykKKyAgICAgICAgICAgIHNlbGYubXNnVmlldyA9IGd0ay5UZXh0VmlldygpCisgICAgICAgICAgICBzZWxmLm1zZ1ZpZXcuc2V0X2VkaXRhYmxlKEZhbHNlKQorICAgICAgICAgICAgc2VsZi5tc2dWaWV3LnNldF93cmFwX21vZGUoZ3RrLldSQVBfV09SRCkKKyAgICAgICAgICAgIHNlbGYubXNnVmlldy5zZXRfY3Vyc29yX3Zpc2libGUoRmFsc2UpCisgICAgICAgICAgICBzZWxmLm1zZ1ZpZXcuc2V0X3NpemVfcmVxdWVzdCgzMjAsIDIzMCkKKyAgICAgICAgICAgIHNlbGYuYnVmID0gZ3RrLlRleHRCdWZmZXIoKQorICAgICAgICAgICAgc2VsZi5idWYuc2V0X3RleHQobGJsKQorICAgICAgICAgICAgc2VsZi5tc2dWaWV3LnNldF9idWZmZXIoc2VsZi5idWYpCisgICAgICAgICAgICBzZWxmLnRleHRXaW5kb3cuYWRkKHNlbGYubXNnVmlldykKKyAgICAgICAgICAgIHNlbGYubXNnVmlldy5zaG93KCkKKworICAgICAgICBpZiBzZWxmLndhcm5pbmdfb249PTA6CisgICAgICAgICAgICBzZWxmLnByZXZpb3VzX2J1dHRvbi5zZXRfc2Vuc2l0aXZlKEZhbHNlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5wcmV2aW91c19idXR0b24uc2V0X3NlbnNpdGl2ZShUcnVlKQorCisgICAgICAgIGlmIHNlbGYud2FybmluZ19vbj09c2VsZi53YXJuX25iLTE6CisgICAgICAgICAgICBzZWxmLm5leHRfYnV0dG9uLnNldF9zZW5zaXRpdmUoRmFsc2UpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLm5leHRfYnV0dG9uLnNldF9zZW5zaXRpdmUoVHJ1ZSkKKworICAgICAgICBpZiBzZWxmLndhcm5fbmI+MToKKyAgICAgICAgICAgIHNlbGYuaGVhZGluZyA9ICJXYXJuaW5nICIgKyBzdHIoc2VsZi53YXJuaW5nX29uICsgMSkgKyAiIG9mICIgKyBzdHIoc2VsZi53YXJuX25iKQorICAgICAgICAgICAgc2VsZi5oZWFkaW5nX2xhYmVsLnNldF9tYXJrdXAoJzxzcGFuIHdlaWdodD0iYm9sZCI+JXM8L3NwYW4+JyAlIHNlbGYuaGVhZGluZykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuaGVhZGluZyA9ICJXYXJuaW5nIgorICAgICAgICAgICAgc2VsZi5oZWFkaW5nX2xhYmVsLnNldF9tYXJrdXAoJzxzcGFuIHdlaWdodD0iYm9sZCI+JXM8L3NwYW4+JyAlIHNlbGYuaGVhZGluZykKKworICAgICAgICBzZWxmLnNob3dfYWxsKCkKKworICAgICAgICBpZiAwPD0gbGVuKGxibCkgPCA0MDA6CisgICAgICAgICAgICBzZWxmLnRleHRXaW5kb3cuaGlkZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLndhcm5pbmdfbGFiZWwuaGlkZSgpCisKKyAgICBkZWYgY3JlYXRlX3Zpc3VhbF9lbGVtZW50cyhzZWxmKToKKyAgICAgICAgc2VsZi5zZXRfc2l6ZV9yZXF1ZXN0KDM1MCwgMzUwKQorICAgICAgICBzZWxmLmhlYWRpbmdfbGFiZWwgPSBndGsuTGFiZWwoKQorICAgICAgICBzZWxmLmhlYWRpbmdfbGFiZWwuc2V0X2FsaWdubWVudCgwLCAwKQorICAgICAgICBzZWxmLndhcm5pbmdfbGFiZWwgPSBndGsuTGFiZWwoKQorICAgICAgICBzZWxmLndhcm5pbmdfbGFiZWwuc2V0X3NlbGVjdGFibGUoVHJ1ZSkKKyAgICAgICAgc2VsZi53YXJuaW5nX2xhYmVsLnNldF9hbGlnbm1lbnQoMCwgMCkKKyAgICAgICAgc2VsZi50ZXh0V2luZG93ID0gZ3RrLlNjcm9sbGVkV2luZG93KCkKKworICAgICAgICB0YWJsZSA9IGd0ay5UYWJsZSgxLCAxMCwgRmFsc2UpCisKKyAgICAgICAgY2FuY2VsX2J1dHRvbiA9IGd0ay5CdXR0b24oKQorICAgICAgICBjYW5jZWxfYnV0dG9uLnNldF9sYWJlbCgiQ2xvc2UiKQorICAgICAgICBjYW5jZWxfYnV0dG9uLmNvbm5lY3QoImNsaWNrZWQiLCBzZWxmLmNhbmNlbF9idXR0b25fY2IpCisgICAgICAgIGNhbmNlbF9idXR0b24uc2V0X3NpemVfcmVxdWVzdCgxMTAsIDMwKQorCisgICAgICAgIHNlbGYucHJldmlvdXNfYnV0dG9uID0gZ3RrLkJ1dHRvbigpCisgICAgICAgIGltYWdlMSA9IGd0ay5pbWFnZV9uZXdfZnJvbV9zdG9jayhndGsuU1RPQ0tfR09fQkFDSywgZ3RrLklDT05fU0laRV9CVVRUT04pCisgICAgICAgIGltYWdlMS5zaG93KCkKKyAgICAgICAgYm94ID0gZ3RrLkhCb3goRmFsc2UsIDYpCisgICAgICAgIGJveC5zaG93KCkKKyAgICAgICAgc2VsZi5wcmV2aW91c19idXR0b24uYWRkKGJveCkKKyAgICAgICAgbGJsID0gZ3RrLkxhYmVsKCJQcmV2aW91cyIpCisgICAgICAgIGxibC5zaG93KCkKKyAgICAgICAgYm94LnBhY2tfc3RhcnQoaW1hZ2UxLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UsIHBhZGRpbmc9MykKKyAgICAgICAgYm94LnBhY2tfc3RhcnQobGJsLCBleHBhbmQ9VHJ1ZSwgZmlsbD1UcnVlLCBwYWRkaW5nPTMpCisgICAgICAgIHNlbGYucHJldmlvdXNfYnV0dG9uLmNvbm5lY3QoImNsaWNrZWQiLCBzZWxmLnByZXZpb3VzX2J1dHRvbl9jYikKKyAgICAgICAgc2VsZi5wcmV2aW91c19idXR0b24uc2V0X3NpemVfcmVxdWVzdCgxMTAsIDMwKQorCisgICAgICAgIHNlbGYubmV4dF9idXR0b24gPSBndGsuQnV0dG9uKCkKKyAgICAgICAgaW1hZ2UyID0gZ3RrLmltYWdlX25ld19mcm9tX3N0b2NrKGd0ay5TVE9DS19HT19GT1JXQVJELCBndGsuSUNPTl9TSVpFX0JVVFRPTikKKyAgICAgICAgaW1hZ2UyLnNob3coKQorICAgICAgICBib3ggPSBndGsuSEJveChGYWxzZSwgNikKKyAgICAgICAgYm94LnNob3coKQorICAgICAgICBzZWxmLm5leHRfYnV0dG9uLmFkZChib3gpCisgICAgICAgIGxibCA9IGd0ay5MYWJlbCgiTmV4dCIpCisgICAgICAgIGxibC5zaG93KCkKKyAgICAgICAgYm94LnBhY2tfc3RhcnQobGJsLCBleHBhbmQ9VHJ1ZSwgZmlsbD1UcnVlLCBwYWRkaW5nPTMpCisgICAgICAgIGJveC5wYWNrX3N0YXJ0KGltYWdlMiwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlLCBwYWRkaW5nPTMpCisgICAgICAgIHNlbGYubmV4dF9idXR0b24uY29ubmVjdCgiY2xpY2tlZCIsIHNlbGYubmV4dF9idXR0b25fY2IpCisgICAgICAgIHNlbGYubmV4dF9idXR0b24uc2V0X3NpemVfcmVxdWVzdCgxMTAsIDMwKQorCisgICAgICAgICN3aGVuIHRoZXJlIG1vcmUgdGhhbiBvbmUgd2FybmluZywgd2UgbmVlZCAicHJldmlvdXMiIGFuZCAibmV4dCIgYnV0dG9uCisgICAgICAgIGlmIHNlbGYud2Fybl9uYj4xOgorICAgICAgICAgICAgc2VsZi52Ym94LnBhY2tfc3RhcnQoc2VsZi5oZWFkaW5nX2xhYmVsLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgICAgICBzZWxmLnZib3gucGFja19zdGFydChzZWxmLndhcm5pbmdfbGFiZWwsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgICAgIHNlbGYudmJveC5wYWNrX3N0YXJ0KHNlbGYudGV4dFdpbmRvdywgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICAgICAgdGFibGUuYXR0YWNoKGNhbmNlbF9idXR0b24sIDYsIDcsIDAsIDEsIHhvcHRpb25zPWd0ay5TSFJJTkspCisgICAgICAgICAgICB0YWJsZS5hdHRhY2goc2VsZi5wcmV2aW91c19idXR0b24sIDcsIDgsIDAsIDEsIHhvcHRpb25zPWd0ay5TSFJJTkspCisgICAgICAgICAgICB0YWJsZS5hdHRhY2goc2VsZi5uZXh0X2J1dHRvbiwgOCwgOSwgMCwgMSwgeG9wdGlvbnM9Z3RrLlNIUklOSykKKyAgICAgICAgICAgIHNlbGYudmJveC5wYWNrX2VuZCh0YWJsZSwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi52Ym94LnBhY2tfc3RhcnQoc2VsZi5oZWFkaW5nX2xhYmVsLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgICAgICBzZWxmLnZib3gucGFja19zdGFydChzZWxmLndhcm5pbmdfbGFiZWwsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgICAgIHNlbGYudmJveC5wYWNrX3N0YXJ0KHNlbGYudGV4dFdpbmRvdywgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICAgICAgY2FuY2VsX2J1dHRvbiA9IHNlbGYuYWRkX2J1dHRvbigiQ2xvc2UiLCBndGsuUkVTUE9OU0VfQ0FOQ0VMKQorICAgICAgICAgICAgSG9iQWx0QnV0dG9uLnN0eWxlX2J1dHRvbihjYW5jZWxfYnV0dG9uKQorCisgICAgICAgIHNlbGYucmVmcmVzaF9jb21wb25lbnRzKCkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9oaWcvcHJvcGVydHlkaWFsb2cucHkgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaGlnL3Byb3BlcnR5ZGlhbG9nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YjljZTYKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaGlnL3Byb3BlcnR5ZGlhbG9nLnB5CkBAIC0wLDAgKzEsNDM3IEBACisjCisjIEJpdEJha2UgR3JhcGhpY2FsIEdUSyBVc2VyIEludGVyZmFjZQorIworIyBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMyAgIEludGVsIENvcnBvcmF0aW9uCisjCisjIEF1dGhvcmVkIGJ5IEFuZHJlaSBEaW51IDxhbmRyZWkuYWRyaWFueC5kaW51QGludGVsLmNvbT4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBzdHJpbmcKK2ltcG9ydCBndGsKK2ltcG9ydCBnb2JqZWN0CitpbXBvcnQgb3MKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IGdsaWIKK2Zyb20gYmIudWkuY3J1bWJzLmhpZy5jcnVtYnNkaWFsb2cgaW1wb3J0IENydW1ic0RpYWxvZworZnJvbSBiYi51aS5jcnVtYnMuaGlnLnNldHRpbmdzdWloZWxwZXIgaW1wb3J0IFNldHRpbmdzVUlIZWxwZXIKK2Zyb20gYmIudWkuY3J1bWJzLmhpZy5jcnVtYnNtZXNzYWdlZGlhbG9nIGltcG9ydCBDcnVtYnNNZXNzYWdlRGlhbG9nCitmcm9tIGJiLnVpLmNydW1icy5oaWcubGF5ZXJzZWxlY3Rpb25kaWFsb2cgaW1wb3J0IExheWVyU2VsZWN0aW9uRGlhbG9nCisKKyIiIgorVGhlIGZvbGxvd2luZyBhcmUgY29udmVuaWVuY2UgY2xhc3NlcyBmb3IgaW1wbGVtZW50aW5nIEdOT01FIEhJRyBjb21wbGlhbnQKK0JpdEJha2UgR1VJJ3MKK0luIHN1bW1hcnk6IHNwYWNpbmcgPSAxMnB4LCBib3JkZXItd2lkdGggPSA2cHgKKyIiIgorCitjbGFzcyBQcm9wZXJ0eURpYWxvZyhDcnVtYnNEaWFsb2cpOgorCQorCWRlZiBfX2luaXRfXyhzZWxmLCB0aXRsZSwgcGFyZW50LCBpbmZvcm1hdGlvbiwgZmxhZ3MsIGJ1dHRvbnM9Tm9uZSk6CisJCQorCQlzdXBlcihQcm9wZXJ0eURpYWxvZywgc2VsZikuX19pbml0X18odGl0bGUsIHBhcmVudCwgZmxhZ3MsIGJ1dHRvbnMpCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc2VsZi5wcm9wZXJ0aWVzID0gaW5mb3JtYXRpb24KKworICAgICAgICAgICAgICAgIGlmIGxlbihzZWxmLnByb3BlcnRpZXMpID09IDEwOgorCQkgICAgICAgIHNlbGYuY3JlYXRlX3JlY2lwZV92aXN1YWxfZWxlbWVudHMoKQorICAgICAgICAgICAgICAgIGVsaWYgbGVuKHNlbGYucHJvcGVydGllcykgPT0gNToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlX3BhY2thZ2VfdmlzdWFsX2VsZW1lbnRzKCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jcmVhdGVfaW5mb3JtYXRpb25fdmlzdWFsX2VsZW1lbnRzKCkKKworCisgICAgICAgIGRlZiBjcmVhdGVfaW5mb3JtYXRpb25fdmlzdWFsX2VsZW1lbnRzKHNlbGYpOgorCisgICAgICAgICAgICAgICAgSE9CX0lDT05fQkFTRV9ESVIgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKSksICgiaWNvbnMvIikpCisgICAgICAgICAgICAgICAgSUNPTl9QQUNLQUdFU19ESVNQTEFZX0ZJTEUgICAgPSBvcy5wYXRoLmpvaW4oSE9CX0lDT05fQkFTRV9ESVIsICgnaW5mby9pbmZvX2Rpc3BsYXkucG5nJykpCisKKyAgICAgICAgICAgICAgICBzZWxmLnNldF9yZXNpemFibGUoRmFsc2UpCisKKyAgICAgICAgICAgICAgICBzZWxmLnRhYmxlID0gZ3RrLlRhYmxlKDEsMSxGYWxzZSkKKyAgICAgICAgICAgICAgICBzZWxmLnRhYmxlLnNldF9yb3dfc3BhY2luZ3MoMCkKKyAgICAgICAgICAgICAgICBzZWxmLnRhYmxlLnNldF9jb2xfc3BhY2luZ3MoMCkKKworICAgICAgICAgICAgICAgIHNlbGYuaW1hZ2UgPSBndGsuSW1hZ2UoKQorICAgICAgICAgICAgICAgIHNlbGYuaW1hZ2Uuc2V0X2Zyb21fZmlsZShJQ09OX1BBQ0tBR0VTX0RJU1BMQVlfRklMRSkKKyAgICAgICAgICAgICAgICBzZWxmLmltYWdlLnNldF9wcm9wZXJ0eSgieGFsaWduIiwwKQorICAgICAgICAgICAgICAgICNzZWxmLnZib3guYWRkKHNlbGYuaW1hZ2UpCisKKyAgICAgICAgICAgICAgICBpbWFnZV9pbmZvID0gc2VsZi5wcm9wZXJ0aWVzLnNwbGl0KCIqIilbMF0KKyAgICAgICAgICAgICAgICBpbmZvID0gc2VsZi5wcm9wZXJ0aWVzLnNwbGl0KCIqIilbMV0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB2Ym94ID0gZ3RrLlZCb3goVHJ1ZSwgc3BhY2luZz0zMCkgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQgPSBndGsuTGFiZWwoKQorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X2xpbmVfd3JhcChGYWxzZSkKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9tYXJrdXAoaW1hZ2VfaW5mbykKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9wcm9wZXJ0eSgieGFsaWduIiwgMCkKKworICAgICAgICAgICAgICAgIHNlbGYuaW5mb19sYWJlbCA9IGd0ay5MYWJlbCgpCisgICAgICAgICAgICAgICAgc2VsZi5pbmZvX2xhYmVsLnNldF9saW5lX3dyYXAoVHJ1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLmluZm9fbGFiZWwuc2V0X21hcmt1cChpbmZvKQorICAgICAgICAgICAgICAgIHNlbGYuaW5mb19sYWJlbC5zZXRfcHJvcGVydHkoInlhbGlnbiIsIDAuNSkKKworICAgICAgICAgICAgICAgIHNlbGYudGFibGUuYXR0YWNoKHNlbGYuaW1hZ2UsIDAsMSwwLDEsIHhvcHRpb25zPWd0ay5GSUxMfGd0ay5FWFBBTkQsIHlvcHRpb25zPWd0ay5GSUxMLHhwYWRkaW5nPTUseXBhZGRpbmc9NSkKKyAgICAgICAgICAgICAgICBzZWxmLnRhYmxlLmF0dGFjaChzZWxmLmxhYmVsX3Nob3J0LCAwLDEsMCwxLCB4b3B0aW9ucz1ndGsuRklMTHxndGsuRVhQQU5ELCB5b3B0aW9ucz1ndGsuRklMTCx4cGFkZGluZz00MCx5cGFkZGluZz01KQorICAgICAgICAgICAgICAgIHNlbGYudGFibGUuYXR0YWNoKHNlbGYuaW5mb19sYWJlbCwgMCwxLDEsMiwgeG9wdGlvbnM9Z3RrLkZJTEx8Z3RrLkVYUEFORCwgeW9wdGlvbnM9Z3RrLkZJTEwseHBhZGRpbmc9NDAseXBhZGRpbmc9MTApCisgICAgICAgIAorICAgICAgICAgICAgICAgIHNlbGYudmJveC5hZGQoc2VsZi50YWJsZSkKKyAgICAgICAgICAgICAgICBzZWxmLmNvbm5lY3QoJ2RlbGV0ZS1ldmVudCcsIGxhbWJkYSB3LCBlOiBzZWxmLmRlc3Ryb3koKSBvciBUcnVlKSAKKworICAgICAgICBkZWYgdHJlZVZpZXdUb29sdGlwKCBzZWxmLCB3aWRnZXQsIGUsIHRvb2x0aXBzLCBjZWxsLCBlbXB0eVRleHQ9IiIgKToKKyAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhdGgsY29sLHgseSkgPSB3aWRnZXQuZ2V0X3BhdGhfYXRfcG9zKCBpbnQoZS54KSwgaW50KGUueSkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgPSB3aWRnZXQuZ2V0X21vZGVsKCkuZ2V0X2l0ZXIocGF0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gd2lkZ2V0LmdldF9tb2RlbCgpLmdldF92YWx1ZShpdCxjZWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdmFsdWUgaW4gc2VsZi50b29sdGlwX2l0ZW1zOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwcy5zZXRfdGlwKHdpZGdldCwgc2VsZi50b29sdGlwX2l0ZW1zW3ZhbHVlXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcHMuZW5hYmxlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBzLnNldF90aXAod2lkZ2V0LCBlbXB0eVRleHQpCisgICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBzLnNldF90aXAod2lkZ2V0LCBlbXB0eVRleHQpCisKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgZGVmIGNyZWF0ZV9wYWNrYWdlX3Zpc3VhbF9lbGVtZW50cyhzZWxmKToKKworICAgICAgICAgICAgICAgIGltcG9ydCBqc29uCisKKyAgICAgICAgICAgICAgICBuYW1lID0gc2VsZi5wcm9wZXJ0aWVzWyduYW1lJ10KKyAgICAgICAgICAgICAgICBiaW5iID0gc2VsZi5wcm9wZXJ0aWVzWydiaW5iJ10KKyAgICAgICAgICAgICAgICBzaXplID0gc2VsZi5wcm9wZXJ0aWVzWydzaXplJ10KKyAgICAgICAgICAgICAgICByZWNpcGUgPSBzZWxmLnByb3BlcnRpZXNbJ3JlY2lwZSddCisgICAgICAgICAgICAgICAgZmlsZV9saXN0ID0ganNvbi5sb2FkcyhzZWxmLnByb3BlcnRpZXNbJ2ZpbGVzX2xpc3QnXSkKKworICAgICAgICAgICAgICAgIGZpbGVzX3RlbXAgPSAnJworICAgICAgICAgICAgICAgIHBhdGhzX3RlbXAgPSAnJworICAgICAgICAgICAgICAgIGZpbGVzX2JpbmIgPSBbXQorICAgICAgICAgICAgICAgIHBhdGhzX2JpbmIgPSBbXQorCisgICAgICAgICAgICAgICAgc2VsZi50b29sdGlwX2l0ZW1zID0ge30KKworICAgICAgICAgICAgICAgIHNlbGYuc2V0X3Jlc2l6YWJsZShGYWxzZSkKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAjY2xlYW5pbmcgb3V0IHRoZSByZWNpcGUgdmFyaWFibGUKKyAgICAgICAgICAgICAgICByZWNpcGUgPSByZWNpcGUuc3BsaXQoIisiKVswXQorCisgICAgICAgICAgICAgICAgdmJveCA9IGd0ay5WQm94KFRydWUsc3BhY2luZyA9IDApCisKKyAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBOQU1FIFJPVyArIENPTCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQgPSBndGsuTGFiZWwoKQorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X3NpemVfcmVxdWVzdCgzMDAsLTEpCisgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfc2VsZWN0YWJsZShUcnVlKQorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X2xpbmVfd3JhcChUcnVlKQorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X21hcmt1cCgiPHNwYW4gd2VpZ2h0PVwiYm9sZFwiPk5hbWU6IDwvc3Bhbj4iICsgbmFtZSkKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9wcm9wZXJ0eSgieGFsaWduIiwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc2VsZi52Ym94LmFkZChzZWxmLmxhYmVsX3Nob3J0KQorCisgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgU0laRSBST1cgKyBDT0wgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQgPSBndGsuTGFiZWwoKQorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X3NpemVfcmVxdWVzdCgzMDAsLTEpCisgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfc2VsZWN0YWJsZShUcnVlKQorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X2xpbmVfd3JhcChUcnVlKQorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X21hcmt1cCgiPHNwYW4gd2VpZ2h0PVwiYm9sZFwiPlNpemU6IDwvc3Bhbj4iICsgc2l6ZSkKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9wcm9wZXJ0eSgieGFsaWduIiwgMCkKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzZWxmLnZib3guYWRkKHNlbGYubGFiZWxfc2hvcnQpCisKKyAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFJFQ0lQRSBST1cgKyBDT0wgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQgPSBndGsuTGFiZWwoKQorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X3NpemVfcmVxdWVzdCgzMDAsLTEpCisgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfc2VsZWN0YWJsZShUcnVlKQorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X2xpbmVfd3JhcChUcnVlKQorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X21hcmt1cCgiPHNwYW4gd2VpZ2h0PVwiYm9sZFwiPlJlY2lwZTogPC9zcGFuPiIgKyByZWNpcGUpCisgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfcHJvcGVydHkoInhhbGlnbiIsIDApCisKKyAgICAgICAgICAgICAgICBzZWxmLnZib3guYWRkKHNlbGYubGFiZWxfc2hvcnQpCisKKyAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJJTkIgUk9XICsgQ09MICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIGJpbmIgIT0gJyc6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0ID0gZ3RrLkxhYmVsKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X3NlbGVjdGFibGUoVHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X2xpbmVfd3JhcChUcnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfbWFya3VwKCI8c3BhbiB3ZWlnaHQ9XCJib2xkXCI+QnJvdWdodCBpbiBieTogPC9zcGFuPiIpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9wcm9wZXJ0eSgieGFsaWduIiwgMCkgICAgICAgICAgICAgICAgCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfaW5mbyA9IGd0ay5MYWJlbCgpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX2luZm8uc2V0X3NpemVfcmVxdWVzdCgzMDAsLTEpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX2luZm8uc2V0X3NlbGVjdGFibGUoVHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfaW5mby5zZXRfbGluZV93cmFwKFRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX2luZm8uc2V0X21hcmt1cChiaW5iKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9pbmZvLnNldF9wcm9wZXJ0eSgieGFsaWduIiwgMCkgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnZib3guYWRkKHNlbGYubGFiZWxfc2hvcnQpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnZib3guYWRkKHNlbGYubGFiZWxfaW5mbykKKworICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBGSUxFUyBCUk9VR0hUIEJZIFBBQ0tBR0VTICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyAgICAgICAgICAgICAgICBpZiBmaWxlX2xpc3Q6CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRleHRXaW5kb3cgPSBndGsuU2Nyb2xsZWRXaW5kb3coKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50ZXh0V2luZG93LnNldF9zaGFkb3dfdHlwZShndGsuU0hBRE9XX0lOKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50ZXh0V2luZG93LnNldF9wb2xpY3koZ3RrLlBPTElDWV9BVVRPTUFUSUMsIGd0ay5QT0xJQ1lfQVVUT01BVElDKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50ZXh0V2luZG93LnNldF9zaXplX3JlcXVlc3QoMTAwLCAxNzApCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VmaWxlc19zdG9yZSA9IGd0ay5MaXN0U3RvcmUoc3RyKQorCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhY2thZ2VmaWxlc190diA9IGd0ay5UcmVlVmlldygpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhY2thZ2VmaWxlc190di5zZXRfcnVsZXNfaGludChUcnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYWNrYWdlZmlsZXNfdHYuc2V0X2hlYWRlcnNfdmlzaWJsZShUcnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50ZXh0V2luZG93LmFkZChzZWxmLnBhY2thZ2VmaWxlc190dikKKworICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jZWxsMSA9IGd0ay5DZWxsUmVuZGVyZXJUZXh0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbDEgPSBndGsuVHJlZVZpZXdDb2x1bW4oJ1BhY2thZ2UgZmlsZXMnLCBzZWxmLmNlbGwxKQorICAgICAgICAgICAgICAgICAgICAgICAgY29sMS5zZXRfY2VsbF9kYXRhX2Z1bmMoc2VsZi5jZWxsMSwgc2VsZi5yZWdleF9maWVsZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGFja2FnZWZpbGVzX3R2LmFwcGVuZF9jb2x1bW4oY29sMSkKKworICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMgPSBmaWxlX2xpc3Qua2V5cygpCisgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy5zb3J0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpdGVtIGluIGl0ZW1zOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxscGF0aCA9IGl0ZW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgbGVuKGl0ZW0pID4gMzU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSA9IGl0ZW1bOmxlbihpdGVtKS8yXSArICIiICsgaXRlbVtsZW4oaXRlbSkvMisxOl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGVuKGl0ZW0pID09IDM1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBpdGVtWzpsZW4oaXRlbSkvMl0gKyAiLi4uIiArIGl0ZW1bbGVuKGl0ZW0pLzIrMzpdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50b29sdGlwX2l0ZW1zW2l0ZW1dID0gZnVsbHBhdGgKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlZmlsZXNfc3RvcmUuYXBwZW5kKFtzdHIoaXRlbSldKQorCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhY2thZ2VmaWxlc190di5zZXRfbW9kZWwocGFja2FnZWZpbGVzX3N0b3JlKQorCisgICAgICAgICAgICAgICAgICAgICAgICB0aXBzID0gZ3RrLlRvb2x0aXBzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpcHMuc2V0X3RpcChzZWxmLnBhY2thZ2VmaWxlc190diwgIiIpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhY2thZ2VmaWxlc190di5jb25uZWN0KCJtb3Rpb24tbm90aWZ5LWV2ZW50Iiwgc2VsZi50cmVlVmlld1Rvb2x0aXAsIHRpcHMsIDApCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhY2thZ2VmaWxlc190di5zZXRfZXZlbnRzKGd0ay5nZGsuUE9JTlRFUl9NT1RJT05fTUFTSykKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi52Ym94LmFkZChzZWxmLnRleHRXaW5kb3cpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgICAgICAgICAgICAgIHNlbGYudmJveC5zaG93X2FsbCgpCisKKworICAgICAgICBkZWYgcmVnZXhfZmllbGQoc2VsZiwgY29sdW1uLCBjZWxsLCBtb2RlbCwgaXRlcik6CisgICAgICAgICAgICAgICAgY2VsbC5zZXRfcHJvcGVydHkoJ3RleHQnLCBtb2RlbC5nZXRfdmFsdWUoaXRlciwgMCkpCisgICAgICAgICAgICAgICAgcmV0dXJuCisKKworCWRlZiBjcmVhdGVfcmVjaXBlX3Zpc3VhbF9lbGVtZW50cyhzZWxmKToKKworICAgICAgICAgICAgICAgIHN1bW1hcnkgPSBzZWxmLnByb3BlcnRpZXNbJ3N1bW1hcnknXQorCQluYW1lID0gc2VsZi5wcm9wZXJ0aWVzWyduYW1lJ10KKwkJdmVyc2lvbiA9IHNlbGYucHJvcGVydGllc1sndmVyc2lvbiddCisJCXJldmlzaW9uID0gc2VsZi5wcm9wZXJ0aWVzWydyZXZpc2lvbiddCisJCWJpbmIgPSBzZWxmLnByb3BlcnRpZXNbJ2JpbmInXQorCQlncm91cCA9IHNlbGYucHJvcGVydGllc1snZ3JvdXAnXQorCQlsaWNlbnNlID0gc2VsZi5wcm9wZXJ0aWVzWydsaWNlbnNlJ10KKwkJaG9tZXBhZ2UgPSBzZWxmLnByb3BlcnRpZXNbJ2hvbWVwYWdlJ10KKwkJYnVndHJhY2tlciA9IHNlbGYucHJvcGVydGllc1snYnVndHJhY2tlciddCisJCWRlc2NyaXB0aW9uID0gc2VsZi5wcm9wZXJ0aWVzWydkZXNjcmlwdGlvbiddCisKKyAgICAgICAgICAgICAgICBzZWxmLnNldF9yZXNpemFibGUoRmFsc2UpCisJCQorICAgICAgICAgICAgICAgICNjbGVhbmluZyBvdXQgdGhlIHZlcnNpb24gdmFyaWFibGUgYW5kIGFsc28gdGhlIHN1bW1hcnkKKyAgICAgICAgICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbi5zcGxpdCgiOiIpWzFdCisgICAgICAgICAgICAgICAgaWYgbGVuKHZlcnNpb24pID4gMzA6CisgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbi5zcGxpdCgiKyIpWzBdCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gPSB2ZXJzaW9uLnNwbGl0KCItIilbMF0KKyAgICAgICAgICAgICAgICBsaWNlbnNlID0gbGljZW5zZS5yZXBsYWNlKCImIiAsICJhbmQiKQorICAgICAgICAgICAgICAgIGlmIChob21lcGFnZSA9PSAnJyk6CisgICAgICAgICAgICAgICAgICAgICAgICBob21lcGFnZSA9ICd1bmtub3duJworICAgICAgICAgICAgICAgIGlmIChidWd0cmFja2VyID09ICcnKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1Z3RyYWNrZXIgPSAndW5rbm93bicKKyAgICAgICAgICAgICAgICBzdW1tYXJ5ID0gc3VtbWFyeS5zcGxpdCgiKyIpWzBdCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgI2NhbGN1bGF0aW5nIHRoZSByb3dzIG5lZWRlZCBmb3IgdGhlIHRhYmxlCisgICAgICAgICAgICAgICAgYmluYl9pdGVtc19jb3VudCA9IGxlbihiaW5iLnNwbGl0KCcsJykpCisgICAgICAgICAgICAgICAgYmluYl9pdGVtcyA9IGJpbmIuc3BsaXQoJywnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCisJCXZib3ggPSBndGsuVkJveChGYWxzZSxzcGFjaW5nID0gMCkKKworICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1VNTUFSWSBMQUJFTCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIHN1bW1hcnkgIT0gJyc6ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydCA9IGd0ay5MYWJlbCgpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF93aWR0aF9jaGFycygzNykKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X3NlbGVjdGFibGUoVHJ1ZSkgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9saW5lX3dyYXAoVHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X21hcmt1cCgiPGI+IiArIHN1bW1hcnkgKyAiPC9iPiIpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9wcm9wZXJ0eSgieGFsaWduIiwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi52Ym94LmFkZChzZWxmLmxhYmVsX3Nob3J0KQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBOQU1FIFJPVyArIENPTCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydCA9IGd0ay5MYWJlbCgpCisgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfc2VsZWN0YWJsZShUcnVlKQorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X2xpbmVfd3JhcChUcnVlKQorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X21hcmt1cCgiPHNwYW4gd2VpZ2h0PVwiYm9sZFwiPk5hbWU6IDwvc3Bhbj4iICsgbmFtZSkKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9wcm9wZXJ0eSgieGFsaWduIiwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc2VsZi52Ym94LmFkZChzZWxmLmxhYmVsX3Nob3J0KQorCisgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFZFUlNJT04gUk9XICsgQ09MICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQgPSBndGsuTGFiZWwoKQorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X3NlbGVjdGFibGUoVHJ1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9saW5lX3dyYXAoVHJ1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9tYXJrdXAoIjxzcGFuIHdlaWdodD1cImJvbGRcIj5WZXJzaW9uOiA8L3NwYW4+IiArIHZlcnNpb24pCisgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfcHJvcGVydHkoInhhbGlnbiIsIDApCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc2VsZi52Ym94LmFkZChzZWxmLmxhYmVsX3Nob3J0KQorCisgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBSRVZJU0lPTiBST1cgKyBDT0wgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydCA9IGd0ay5MYWJlbCgpCisgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfbGluZV93cmFwKFRydWUpCisgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfc2VsZWN0YWJsZShUcnVlKQorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X21hcmt1cCgiPHNwYW4gd2VpZ2h0PVwiYm9sZFwiPlJldmlzaW9uOiA8L3NwYW4+IiArIHJldmlzaW9uKQorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X3Byb3BlcnR5KCJ4YWxpZ24iLCAwKSAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzZWxmLnZib3guYWRkKHNlbGYubGFiZWxfc2hvcnQpCisKKyAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEdST1VQIFJPVyArIENPTCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydCA9IGd0ay5MYWJlbCgpCisgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfc2VsZWN0YWJsZShUcnVlKSAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfbGluZV93cmFwKFRydWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9tYXJrdXAoIjxzcGFuIHdlaWdodD1cImJvbGRcIj5Hcm91cDogPC9zcGFuPiIgKyBncm91cCkKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9wcm9wZXJ0eSgieGFsaWduIiwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc2VsZi52Ym94LmFkZChzZWxmLmxhYmVsX3Nob3J0KQorCisgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEhPTUVQQUdFIFJPVyArIENPTCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIGhvbWVwYWdlICE9ICd1bmtub3duJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfaW5mbyA9IGd0ay5MYWJlbCgpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX2luZm8uc2V0X3NlbGVjdGFibGUoVHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfaW5mby5zZXRfbGluZV93cmFwKFRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBsZW4oaG9tZXBhZ2UpID4gMzU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfaW5mby5zZXRfbWFya3VwKCI8YSBocmVmPVwiIiArIGhvbWVwYWdlICsgIlwiPiIgKyBob21lcGFnZVswOjM1XSArICIuLi4iICsgIjwvYT4iKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9pbmZvLnNldF9tYXJrdXAoIjxhIGhyZWY9XCIiICsgaG9tZXBhZ2UgKyAiXCI+IiArIGhvbWVwYWdlWzA6NjBdICsgIjwvYT4iKQorCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX2luZm8uc2V0X3Byb3BlcnR5KCJ4YWxpZ24iLCAwKQorICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQgPSBndGsuTGFiZWwoKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfc2VsZWN0YWJsZShUcnVlKSAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfbGluZV93cmFwKFRydWUpICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9tYXJrdXAoIjxiPkhvbWVwYWdlOiA8L2I+IikgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9wcm9wZXJ0eSgieGFsaWduIiwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi52Ym94LmFkZChzZWxmLmxhYmVsX3Nob3J0KQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi52Ym94LmFkZChzZWxmLmxhYmVsX2luZm8pCisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQlVHVFJBQ0tFUiBST1cgKyBDT0wgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIGJ1Z3RyYWNrZXIgIT0gJ3Vua25vd24nOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9pbmZvID0gZ3RrLkxhYmVsKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfaW5mby5zZXRfc2VsZWN0YWJsZShUcnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9pbmZvLnNldF9saW5lX3dyYXAoVHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxlbihidWd0cmFja2VyKSA+IDM1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX2luZm8uc2V0X21hcmt1cCgiPGEgaHJlZj1cIiIgKyBidWd0cmFja2VyICsgIlwiPiIgKyBidWd0cmFja2VyWzA6MzVdICsgIi4uLiIgKyAiPC9hPiIpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX2luZm8uc2V0X21hcmt1cCgiPGEgaHJlZj1cIiIgKyBidWd0cmFja2VyICsgIlwiPiIgKyBidWd0cmFja2VyWzA6NjBdICsgIjwvYT4iKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9pbmZvLnNldF9wcm9wZXJ0eSgieGFsaWduIiwgMCkgIAorCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0ID0gZ3RrLkxhYmVsKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X3NlbGVjdGFibGUoVHJ1ZSkgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfbGluZV93cmFwKFRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9tYXJrdXAoIjxiPkJ1Z3RyYWNrZXI6IDwvYj4iKSAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X3Byb3BlcnR5KCJ4YWxpZ24iLCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnZib3guYWRkKHNlbGYubGFiZWxfc2hvcnQpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnZib3guYWRkKHNlbGYubGFiZWxfaW5mbykKKworICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBMSUNFTlNFIFJPVyArIENPTCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfaW5mbyA9IGd0ay5MYWJlbCgpCisgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9pbmZvLnNldF9zZWxlY3RhYmxlKFRydWUpCisgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9pbmZvLnNldF9saW5lX3dyYXAoVHJ1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX2luZm8uc2V0X21hcmt1cChsaWNlbnNlKQorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfaW5mby5zZXRfcHJvcGVydHkoInhhbGlnbiIsIDApCisKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0ID0gZ3RrLkxhYmVsKCkKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9zZWxlY3RhYmxlKFRydWUpICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X2xpbmVfd3JhcChUcnVlKSAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9tYXJrdXAoIjxzcGFuIHdlaWdodD1cImJvbGRcIj5MaWNlbnNlOiA8L3NwYW4+IikKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9wcm9wZXJ0eSgieGFsaWduIiwgMCkKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzZWxmLnZib3guYWRkKHNlbGYubGFiZWxfc2hvcnQpCisgICAgICAgICAgICAgICAgc2VsZi52Ym94LmFkZChzZWxmLmxhYmVsX2luZm8pCisKKyAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCSU5CIFJPVytDT0wgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgYmluYiAhPSAnJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQgPSBndGsuTGFiZWwoKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfc2VsZWN0YWJsZShUcnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfbGluZV93cmFwKFRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9tYXJrdXAoIjxzcGFuIHdlaWdodD1cImJvbGRcIj5Ccm91Z2h0IGluIGJ5OiA8L3NwYW4+IikKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X3Byb3BlcnR5KCJ4YWxpZ24iLCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi52Ym94LmFkZChzZWxmLmxhYmVsX3Nob3J0KQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9pbmZvID0gZ3RrLkxhYmVsKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfaW5mby5zZXRfc2VsZWN0YWJsZShUcnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9pbmZvLnNldF93aWR0aF9jaGFycygzNikKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxlbihiaW5iKSA+IDIwMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxlZF93aW5kb3cgPSBndGsuU2Nyb2xsZWRXaW5kb3coKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbGVkX3dpbmRvdy5zZXRfcG9saWN5KGd0ay5QT0xJQ1lfTkVWRVIsZ3RrLlBPTElDWV9BTFdBWVMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsZWRfd2luZG93LnNldF9zaXplX3JlcXVlc3QoMTAwLDEwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX2luZm8uc2V0X21hcmt1cChiaW5iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfaW5mby5zZXRfcGFkZGluZyg2LDYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9pbmZvLnNldF9hbGlnbm1lbnQoMCwwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfaW5mby5zZXRfbGluZV93cmFwKFRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsZWRfd2luZG93LmFkZF93aXRoX3ZpZXdwb3J0KHNlbGYubGFiZWxfaW5mbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnZib3guYWRkKHNjcm9sbGVkX3dpbmRvdykKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9pbmZvLnNldF9tYXJrdXAoYmluYikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX2luZm8uc2V0X3Byb3BlcnR5KCJ4YWxpZ24iLCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfaW5mby5zZXRfbGluZV93cmFwKFRydWUpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudmJveC5hZGQoc2VsZi5sYWJlbF9pbmZvKQorCisgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgREVTQ1JJUFRJT04gVEFHIFJPVyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydCA9IGd0ay5MYWJlbCgpCisgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfbGluZV93cmFwKFRydWUpCisgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfbWFya3VwKCI8c3BhbiB3ZWlnaHQ9XCJib2xkXCI+RGVzY3JpcHRpb24gPC9zcGFuPiIpCisgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfcHJvcGVydHkoInhhbGlnbiIsIDApCisgICAgICAgICAgICAgICAgc2VsZi52Ym94LmFkZChzZWxmLmxhYmVsX3Nob3J0KQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIERFU0NSSVBUSU9OIElORk9STUFUSU9OIFJPVyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBoYm94ID0gZ3RrLkhCb3goVHJ1ZSxzcGFjaW5nID0gMCkKKworICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQgPSBndGsuTGFiZWwoKQorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X3NlbGVjdGFibGUoVHJ1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF93aWR0aF9jaGFycygzNikKKyAgICAgICAgICAgICAgICBpZiBsZW4oZGVzY3JpcHRpb24pID4gMjAwOgorICAgICAgICAgICAgICAgICAgICBzY3JvbGxlZF93aW5kb3cgPSBndGsuU2Nyb2xsZWRXaW5kb3coKQorICAgICAgICAgICAgICAgICAgICBzY3JvbGxlZF93aW5kb3cuc2V0X3BvbGljeShndGsuUE9MSUNZX05FVkVSLGd0ay5QT0xJQ1lfQUxXQVlTKQorICAgICAgICAgICAgICAgICAgICBzY3JvbGxlZF93aW5kb3cuc2V0X3NpemVfcmVxdWVzdCgxMDAsMTAwKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9tYXJrdXAoZGVzY3JpcHRpb24pCisgICAgICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X3BhZGRpbmcoNiw2KQorICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9hbGlnbm1lbnQoMCwwKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9saW5lX3dyYXAoVHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgc2Nyb2xsZWRfd2luZG93LmFkZF93aXRoX3ZpZXdwb3J0KHNlbGYubGFiZWxfc2hvcnQpCisgICAgICAgICAgICAgICAgICAgIHNlbGYudmJveC5hZGQoc2Nyb2xsZWRfd2luZG93KQorICAgICAgICAgICAgICAgIGVsc2U6ICAgIAorICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9tYXJrdXAoZGVzY3JpcHRpb24pCisgICAgICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X3Byb3BlcnR5KCJ4YWxpZ24iLCAwKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9saW5lX3dyYXAoVHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi52Ym94LmFkZChzZWxmLmxhYmVsX3Nob3J0KQorCisgICAgICAgICAgICAgICAgc2VsZi52Ym94LnNob3dfYWxsKCkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9oaWcvcHJveHlkZXRhaWxzZGlhbG9nLnB5IGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2hpZy9wcm94eWRldGFpbHNkaWFsb2cucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjllN2RmZgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9oaWcvcHJveHlkZXRhaWxzZGlhbG9nLnB5CkBAIC0wLDAgKzEsOTAgQEAKKyMKKyMgQml0QmFrZSBHcmFwaGljYWwgR1RLIFVzZXIgSW50ZXJmYWNlCisjCisjIENvcHlyaWdodCAoQykgMjAxMS0yMDEyICAgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgQXV0aG9yZWQgYnkgSm9zaHVhIExvY2sgPGpvc2hAbGludXguaW50ZWwuY29tPgorIyBBdXRob3JlZCBieSBEb25neGlhbyBYdSA8ZG9uZ3hpYW8ueHVAaW50ZWwuY29tPgorIyBBdXRob3JlZCBieSBTaGFuZSBXYW5nIDxzaGFuZS53YW5nQGludGVsLmNvbT4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBndGsKK2Zyb20gYmIudWkuY3J1bWJzLmhpZy5jcnVtYnNkaWFsb2cgaW1wb3J0IENydW1ic0RpYWxvZworCisiIiIKK1RoZSBmb2xsb3dpbmcgYXJlIGNvbnZlbmllbmNlIGNsYXNzZXMgZm9yIGltcGxlbWVudGluZyBHTk9NRSBISUcgY29tcGxpYW50CitCaXRCYWtlIEdVSSdzCitJbiBzdW1tYXJ5OiBzcGFjaW5nID0gMTJweCwgYm9yZGVyLXdpZHRoID0gNnB4CisiIiIKKworY2xhc3MgUHJveHlEZXRhaWxzRGlhbG9nIChDcnVtYnNEaWFsb2cpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRpdGxlLCB1c2VyLCBwYXNzd2QsIHBhcmVudCwgZmxhZ3MsIGJ1dHRvbnM9Tm9uZSk6CisgICAgICAgIHN1cGVyKFByb3h5RGV0YWlsc0RpYWxvZywgc2VsZikuX19pbml0X18odGl0bGUsIHBhcmVudCwgZmxhZ3MsIGJ1dHRvbnMpCisgICAgICAgIHNlbGYuY29ubmVjdCgicmVzcG9uc2UiLCBzZWxmLnJlc3BvbnNlX2NiKQorCisgICAgICAgIHNlbGYuYXV0aCA9IG5vdCAodXNlciA9PSBOb25lIG9yIHBhc3N3ZCA9PSBOb25lIG9yIHVzZXIgPT0gIiIpCisgICAgICAgIHNlbGYudXNlciA9IHVzZXIgb3IgIiIKKyAgICAgICAgc2VsZi5wYXNzd2QgPSBwYXNzd2Qgb3IgIiIKKworICAgICAgICAjIGNyZWF0ZSB2aXN1YWwgZWxlbWVudHMgb24gdGhlIGRpYWxvZworICAgICAgICBzZWxmLmNyZWF0ZV92aXN1YWxfZWxlbWVudHMoKQorCisgICAgZGVmIGNyZWF0ZV92aXN1YWxfZWxlbWVudHMoc2VsZik6CisgICAgICAgIHNlbGYuYXV0aF9jaGVja2JveCA9IGd0ay5DaGVja0J1dHRvbigiVXNlIGF1dGhlbnRpY2F0aW9uIikKKyAgICAgICAgc2VsZi5hdXRoX2NoZWNrYm94LnNldF90b29sdGlwX3RleHQoIkNoZWNrIHRoaXMgYm94IHRvIHNldCB0aGUgdXNlcm5hbWUgYW5kIHRoZSBwYXNzd29yZCIpCisgICAgICAgIHNlbGYuYXV0aF9jaGVja2JveC5zZXRfYWN0aXZlKHNlbGYuYXV0aCkKKyAgICAgICAgc2VsZi5hdXRoX2NoZWNrYm94LmNvbm5lY3QoInRvZ2dsZWQiLCBzZWxmLmF1dGhfY2hlY2tib3hfdG9nZ2xlZF9jYikKKyAgICAgICAgc2VsZi52Ym94LnBhY2tfc3RhcnQoc2VsZi5hdXRoX2NoZWNrYm94LCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgaGJveCA9IGd0ay5IQm94KEZhbHNlLCA2KQorICAgICAgICBzZWxmLnVzZXJfbGFiZWwgPSBndGsuTGFiZWwoIlVzZXJuYW1lOiIpCisgICAgICAgIHNlbGYudXNlcl90ZXh0ID0gZ3RrLkVudHJ5KCkKKyAgICAgICAgc2VsZi51c2VyX3RleHQuc2V0X3RleHQoc2VsZi51c2VyKQorICAgICAgICBoYm94LnBhY2tfc3RhcnQoc2VsZi51c2VyX2xhYmVsLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIGhib3gucGFja19lbmQoc2VsZi51c2VyX3RleHQsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgc2VsZi52Ym94LnBhY2tfc3RhcnQoaGJveCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorCisgICAgICAgIGhib3ggPSBndGsuSEJveChGYWxzZSwgNikKKyAgICAgICAgc2VsZi5wYXNzd2RfbGFiZWwgPSBndGsuTGFiZWwoIlBhc3N3b3JkOiIpCisgICAgICAgIHNlbGYucGFzc3dkX3RleHQgPSBndGsuRW50cnkoKQorICAgICAgICBzZWxmLnBhc3N3ZF90ZXh0LnNldF90ZXh0KHNlbGYucGFzc3dkKQorICAgICAgICBoYm94LnBhY2tfc3RhcnQoc2VsZi5wYXNzd2RfbGFiZWwsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgaGJveC5wYWNrX2VuZChzZWxmLnBhc3N3ZF90ZXh0LCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIHNlbGYudmJveC5wYWNrX3N0YXJ0KGhib3gsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKworICAgICAgICBzZWxmLnJlZnJlc2hfYXV0aF9jb21wb25lbnRzKCkKKyAgICAgICAgc2VsZi5zaG93X2FsbCgpCisKKyAgICBkZWYgcmVmcmVzaF9hdXRoX2NvbXBvbmVudHMoc2VsZik6CisgICAgICAgIHNlbGYudXNlcl9sYWJlbC5zZXRfc2Vuc2l0aXZlKHNlbGYuYXV0aCkKKyAgICAgICAgc2VsZi51c2VyX3RleHQuc2V0X2VkaXRhYmxlKHNlbGYuYXV0aCkKKyAgICAgICAgc2VsZi51c2VyX3RleHQuc2V0X3NlbnNpdGl2ZShzZWxmLmF1dGgpCisgICAgICAgIHNlbGYucGFzc3dkX2xhYmVsLnNldF9zZW5zaXRpdmUoc2VsZi5hdXRoKQorICAgICAgICBzZWxmLnBhc3N3ZF90ZXh0LnNldF9lZGl0YWJsZShzZWxmLmF1dGgpCisgICAgICAgIHNlbGYucGFzc3dkX3RleHQuc2V0X3NlbnNpdGl2ZShzZWxmLmF1dGgpCisKKyAgICBkZWYgYXV0aF9jaGVja2JveF90b2dnbGVkX2NiKHNlbGYsIGJ1dHRvbik6CisgICAgICAgIHNlbGYuYXV0aCA9IHNlbGYuYXV0aF9jaGVja2JveC5nZXRfYWN0aXZlKCkKKyAgICAgICAgc2VsZi5yZWZyZXNoX2F1dGhfY29tcG9uZW50cygpCisKKyAgICBkZWYgcmVzcG9uc2VfY2Ioc2VsZiwgZGlhbG9nLCByZXNwb25zZV9pZCk6CisgICAgICAgIGlmIHJlc3BvbnNlX2lkID09IGd0ay5SRVNQT05TRV9PSzoKKyAgICAgICAgICAgIGlmIHNlbGYuYXV0aDoKKyAgICAgICAgICAgICAgICBzZWxmLnVzZXIgPSBzZWxmLnVzZXJfdGV4dC5nZXRfdGV4dCgpCisgICAgICAgICAgICAgICAgc2VsZi5wYXNzd2QgPSBzZWxmLnBhc3N3ZF90ZXh0LmdldF90ZXh0KCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi51c2VyID0gTm9uZQorICAgICAgICAgICAgICAgIHNlbGYucGFzc3dkID0gTm9uZQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2hpZy9yZXRyaWV2ZWltYWdlZGlhbG9nLnB5IGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2hpZy9yZXRyaWV2ZWltYWdlZGlhbG9nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMTcxMzkKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaGlnL3JldHJpZXZlaW1hZ2VkaWFsb2cucHkKQEAgLTAsMCArMSw1MSBAQAorIworIyBCaXRCYWtlIEdyYXBoaWNhbCBHVEsgVXNlciBJbnRlcmZhY2UKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEzICAgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgQXV0aG9yZWQgYnkgQ3Jpc3RpYW5hIFZvaWN1IDxjcmlzdGlhbmEudm9pY3VAaW50ZWwuY29tPgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworaW1wb3J0IGd0aworCitjbGFzcyBSZXRyaWV2ZUltYWdlRGlhbG9nIChndGsuRmlsZUNob29zZXJEaWFsb2cpOgorICAgICIiIgorICAgIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjcmVhdGUgYSBkaWFsb2cgdGhhdCBwZXJtaXRzIHRvIHJldHJpZXZlCisgICAgYSBjdXN0b20gaW1hZ2Ugc2F2ZWQgcHJldmlvdXNseSBmcm9tIEhvYi4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGlyZWN0b3J5LHRpdGxlLCBwYXJlbnQsIGZsYWdzLCBidXR0b25zPU5vbmUpOgorICAgICAgICBzdXBlcihSZXRyaWV2ZUltYWdlRGlhbG9nLCBzZWxmKS5fX2luaXRfXyh0aXRsZSwgTm9uZSwgZ3RrLkZJTEVfQ0hPT1NFUl9BQ1RJT05fT1BFTiwKKyAgICAgICAgICAgIChndGsuU1RPQ0tfQ0FOQ0VMLCBndGsuUkVTUE9OU0VfQ0FOQ0VMLGd0ay5TVE9DS19PUEVOLCBndGsuUkVTUE9OU0VfT0spKQorICAgICAgICBzZWxmLmRpcmVjdG9yeSA9IGRpcmVjdG9yeQorCisgICAgICAgICMgY3JlYXRlIHZpc3VhbCBlbGVtZW50cyBvbiB0aGUgZGlhbG9nCisgICAgICAgIHNlbGYuY3JlYXRlX3Zpc3VhbF9lbGVtZW50cygpCisKKyAgICBkZWYgY3JlYXRlX3Zpc3VhbF9lbGVtZW50cyhzZWxmKToKKyAgICAgICAgc2VsZi5zZXRfc2hvd19oaWRkZW4oVHJ1ZSkKKyAgICAgICAgc2VsZi5zZXRfZGVmYXVsdF9yZXNwb25zZShndGsuUkVTUE9OU0VfT0spCisgICAgICAgIHNlbGYuc2V0X2N1cnJlbnRfZm9sZGVyKHNlbGYuZGlyZWN0b3J5KQorCisgICAgICAgIHZib3ggPSBzZWxmLmdldF9jaGlsZHJlbigpWzBdLmdldF9jaGlsZHJlbigpWzBdLmdldF9jaGlsZHJlbigpWzBdCisgICAgICAgIGZvciBjaGlsZCBpbiB2Ym94LmdldF9jaGlsZHJlbigpWzBdLmdldF9jaGlsZHJlbigpWzBdLmdldF9jaGlsZHJlbigpWzBdLmdldF9jaGlsZHJlbigpOgorICAgICAgICAgICAgdmJveC5nZXRfY2hpbGRyZW4oKVswXS5nZXRfY2hpbGRyZW4oKVswXS5nZXRfY2hpbGRyZW4oKVswXS5yZW1vdmUoY2hpbGQpCisKKyAgICAgICAgbGFiZWwxID0gZ3RrLkxhYmVsKCkKKyAgICAgICAgbGFiZWwxLnNldF90ZXh0KCJGaWxlIHN5c3RlbSIgKyBzZWxmLmRpcmVjdG9yeSkKKyAgICAgICAgbGFiZWwxLnNob3coKQorICAgICAgICB2Ym94LmdldF9jaGlsZHJlbigpWzBdLmdldF9jaGlsZHJlbigpWzBdLmdldF9jaGlsZHJlbigpWzBdLnBhY2tfc3RhcnQobGFiZWwxLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UsIHBhZGRpbmc9MCkKKyAgICAgICAgdmJveC5nZXRfY2hpbGRyZW4oKVswXS5nZXRfY2hpbGRyZW4oKVsxXS5nZXRfY2hpbGRyZW4oKVswXS5oaWRlKCkKKworICAgICAgICBzZWxmLmdldF9jaGlsZHJlbigpWzBdLmdldF9jaGlsZHJlbigpWzFdLmdldF9jaGlsZHJlbigpWzBdLnNldF9sYWJlbCgiU2VsZWN0IikKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9oaWcvc2F2ZWltYWdlZGlhbG9nLnB5IGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2hpZy9zYXZlaW1hZ2VkaWFsb2cucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE5NWY3MAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9oaWcvc2F2ZWltYWdlZGlhbG9nLnB5CkBAIC0wLDAgKzEsMTU5IEBACisjCisjIEJpdEJha2UgR3JhcGhpY2FsIEdUSyBVc2VyIEludGVyZmFjZQorIworIyBDb3B5cmlnaHQgKEMpIDIwMTMgICBJbnRlbCBDb3Jwb3JhdGlvbgorIworIyBBdXRob3JlZCBieSBDcmlzdGlhbmEgVm9pY3UgPGNyaXN0aWFuYS52b2ljdUBpbnRlbC5jb20+CisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitpbXBvcnQgZ3RrCitpbXBvcnQgZ2xpYgorZnJvbSBiYi51aS5jcnVtYnMuaGlnLmNydW1ic2RpYWxvZyBpbXBvcnQgQ3J1bWJzRGlhbG9nCitmcm9tIGJiLnVpLmNydW1icy5oaWcuY3J1bWJzbWVzc2FnZWRpYWxvZyBpbXBvcnQgQ3J1bWJzTWVzc2FnZURpYWxvZworZnJvbSBiYi51aS5jcnVtYnMuaG9id2lkZ2V0IGltcG9ydCBIb2JCdXR0b24KKworY2xhc3MgU2F2ZUltYWdlRGlhbG9nIChDcnVtYnNEaWFsb2cpOgorICAgICIiIgorICAgIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjcmVhdGUgYSBkaWFsb2cgdGhhdCBwZXJtaXRzIHRvIHNhdmUKKyAgICBhIGN1c3RvbSBpbWFnZSBpbiBhIHByZWRlZmluZWQgZGlyZWN0b3J5LgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkaXJlY3RvcnksIG5hbWUsIGRlc2NyaXB0aW9uLCB0aXRsZSwgcGFyZW50LCBmbGFncywgYnV0dG9ucz1Ob25lKToKKyAgICAgICAgc3VwZXIoU2F2ZUltYWdlRGlhbG9nLCBzZWxmKS5fX2luaXRfXyh0aXRsZSwgcGFyZW50LCBmbGFncywgYnV0dG9ucykKKyAgICAgICAgc2VsZi5kaXJlY3RvcnkgPSBkaXJlY3RvcnkKKyAgICAgICAgc2VsZi5idWlsZGVyID0gcGFyZW50CisgICAgICAgIHNlbGYubmFtZV9maWVsZCA9IG5hbWUKKyAgICAgICAgc2VsZi5kZXNjcmlwdGlvbl9maWVsZCA9IGRlc2NyaXB0aW9uCisKKyAgICAgICAgIyBjcmVhdGUgdmlzdWFsIGVsZW1lbnRzIG9uIHRoZSBkaWFsb2cKKyAgICAgICAgc2VsZi5jcmVhdGVfdmlzdWFsX2VsZW1lbnRzKCkKKworICAgIGRlZiBjcmVhdGVfdmlzdWFsX2VsZW1lbnRzKHNlbGYpOgorICAgICAgICBzZWxmLnNldF9kZWZhdWx0X3Jlc3BvbnNlKGd0ay5SRVNQT05TRV9PSykKKyAgICAgICAgc2VsZi52Ym94LnNldF9ib3JkZXJfd2lkdGgoNikKKworICAgICAgICBzdWJfdmJveCA9IGd0ay5WQm94KEZhbHNlLCAxMikKKyAgICAgICAgc2VsZi52Ym94LnBhY2tfc3RhcnQoc3ViX3Zib3gsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgbGFiZWwgPSBndGsuTGFiZWwoKQorICAgICAgICBsYWJlbC5zZXRfYWxpZ25tZW50KDAsIDApCisgICAgICAgIGxhYmVsLnNldF9tYXJrdXAoIjxiPk5hbWU8L2I+IikKKyAgICAgICAgc3ViX2xhYmVsID0gZ3RrLkxhYmVsKCkKKyAgICAgICAgc3ViX2xhYmVsLnNldF9hbGlnbm1lbnQoMCwgMCkKKyAgICAgICAgY29udGVudCA9ICJJbWFnZSByZWNpcGUgbmFtZXMgc2hvdWxkIGJlIGFsbCBsb3dlcmNhc2UgYW5kIGluY2x1ZGUgb25seSBhbHBoYW51bWVyaWNcbiIKKyAgICAgICAgY29udGVudCArPSAiY2hhcmFjdGVycy4gVGhlIG9ubHkgc3BlY2lhbCBjaGFyYWN0ZXIgeW91IGNhbiB1c2UgaXMgdGhlIEFTQ0lJIGh5cGhlbiAoLSkuIgorICAgICAgICBzdWJfbGFiZWwuc2V0X21hcmt1cChjb250ZW50KQorICAgICAgICBzZWxmLm5hbWVfZW50cnkgPSBndGsuRW50cnkoKQorICAgICAgICBzZWxmLm5hbWVfZW50cnkuc2V0X3RleHQoc2VsZi5uYW1lX2ZpZWxkKQorICAgICAgICBzZWxmLm5hbWVfZW50cnkuc2V0X3NpemVfcmVxdWVzdCgzNTAsMzApCisgICAgICAgIHNlbGYubmFtZV9lbnRyeS5jb25uZWN0KCJjaGFuZ2VkIiwgc2VsZi5uYW1lX2VudHJ5X2NoYW5nZWQpCisgICAgICAgIHN1Yl92Ym94LnBhY2tfc3RhcnQobGFiZWwsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgc3ViX3Zib3gucGFja19zdGFydChzdWJfbGFiZWwsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgc3ViX3Zib3gucGFja19zdGFydChzZWxmLm5hbWVfZW50cnksIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKworICAgICAgICBzdWJfdmJveCA9IGd0ay5WQm94KEZhbHNlLCAxMikKKyAgICAgICAgc2VsZi52Ym94LnBhY2tfc3RhcnQoc3ViX3Zib3gsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgbGFiZWwgPSBndGsuTGFiZWwoKQorICAgICAgICBsYWJlbC5zZXRfYWxpZ25tZW50KDAsIDApCisgICAgICAgIGxhYmVsLnNldF9tYXJrdXAoIjxiPkRlc2NyaXB0aW9uPC9iPiAob3B0aW9uYWwpIikKKyAgICAgICAgc3ViX2xhYmVsID0gZ3RrLkxhYmVsKCkKKyAgICAgICAgc3ViX2xhYmVsLnNldF9hbGlnbm1lbnQoMCwgMCkKKyAgICAgICAgc3ViX2xhYmVsLnNldF9tYXJrdXAoIlRoZSBkZXNjcmlwdGlvbiBzaG91bGQgYmUgbGVzcyB0aGFuIDE1MCBjaGFyYWN0ZXJzIGxvbmcuIikKKyAgICAgICAgc2VsZi5kZXNjcmlwdGlvbl9lbnRyeSA9IGd0ay5UZXh0VmlldygpCisgICAgICAgIGRlc2NyaXB0aW9uX2J1ZmZlciA9IHNlbGYuZGVzY3JpcHRpb25fZW50cnkuZ2V0X2J1ZmZlcigpCisgICAgICAgIGRlc2NyaXB0aW9uX2J1ZmZlci5zZXRfdGV4dChzZWxmLmRlc2NyaXB0aW9uX2ZpZWxkKQorICAgICAgICBkZXNjcmlwdGlvbl9idWZmZXIuY29ubmVjdCgiaW5zZXJ0LXRleHQiLCBzZWxmLmxpbWl0X2Rlc2NyaXB0aW9uX2xlbmd0aCkKKyAgICAgICAgc2VsZi5kZXNjcmlwdGlvbl9lbnRyeS5zZXRfd3JhcF9tb2RlKGd0ay5XUkFQX1dPUkQpCisgICAgICAgIHNlbGYuZGVzY3JpcHRpb25fZW50cnkuc2V0X3NpemVfcmVxdWVzdCgzNTAsNTApCisgICAgICAgIHN1Yl92Ym94LnBhY2tfc3RhcnQobGFiZWwsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgc3ViX3Zib3gucGFja19zdGFydChzdWJfbGFiZWwsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgc3ViX3Zib3gucGFja19zdGFydChzZWxmLmRlc2NyaXB0aW9uX2VudHJ5LCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgc3ViX3Zib3ggPSBndGsuVkJveChGYWxzZSwgMTIpCisgICAgICAgIHNlbGYudmJveC5wYWNrX3N0YXJ0KHN1Yl92Ym94LCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIGxhYmVsID0gZ3RrLkxhYmVsKCkKKyAgICAgICAgbGFiZWwuc2V0X2FsaWdubWVudCgwLCAwKQorICAgICAgICBsYWJlbC5zZXRfbWFya3VwKCJZb3VyIGltYWdlIHJlY2lwZSB3aWxsIGJlIHNhdmVkIHRvOiIpCisgICAgICAgIHN1Yl9sYWJlbCA9IGd0ay5MYWJlbCgpCisgICAgICAgIHN1Yl9sYWJlbC5zZXRfYWxpZ25tZW50KDAsIDApCisgICAgICAgIHN1Yl9sYWJlbC5zZXRfbWFya3VwKHNlbGYuZGlyZWN0b3J5KQorICAgICAgICBzdWJfdmJveC5wYWNrX3N0YXJ0KGxhYmVsLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIHN1Yl92Ym94LnBhY2tfc3RhcnQoc3ViX2xhYmVsLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgdGFibGUgPSBndGsuVGFibGUoMSwgNCwgVHJ1ZSkKKworICAgICAgICBjYW5jZWxfYnV0dG9uID0gZ3RrLkJ1dHRvbigpCisgICAgICAgIGNhbmNlbF9idXR0b24uc2V0X2xhYmVsKCJDYW5jZWwiKQorICAgICAgICBjYW5jZWxfYnV0dG9uLmNvbm5lY3QoImNsaWNrZWQiLCBzZWxmLmNhbmNlbF9idXR0b25fY2IpCisgICAgICAgIGNhbmNlbF9idXR0b24uc2V0X3NpemVfcmVxdWVzdCgxMTAsIDMwKQorCisgICAgICAgIHNlbGYuc2F2ZV9idXR0b24gPSBndGsuQnV0dG9uKCkKKyAgICAgICAgc2VsZi5zYXZlX2J1dHRvbi5zZXRfbGFiZWwoIlNhdmUiKQorICAgICAgICBzZWxmLnNhdmVfYnV0dG9uLmNvbm5lY3QoImNsaWNrZWQiLCBzZWxmLnNhdmVfYnV0dG9uX2NiKQorICAgICAgICBzZWxmLnNhdmVfYnV0dG9uLnNldF9zaXplX3JlcXVlc3QoMTEwLCAzMCkKKyAgICAgICAgaWYgc2VsZi5uYW1lX2VudHJ5LmdldF90ZXh0KCkgPT0gJyc6CisgICAgICAgICAgICBzZWxmLnNhdmVfYnV0dG9uLnNldF9zZW5zaXRpdmUoRmFsc2UpCisKKyAgICAgICAgdGFibGUuYXR0YWNoKGNhbmNlbF9idXR0b24sIDIsIDMsIDAsIDEpCisgICAgICAgIHRhYmxlLmF0dGFjaChzZWxmLnNhdmVfYnV0dG9uLCAzLCA0LCAwLCAxKQorICAgICAgICBzZWxmLnZib3gucGFja19lbmQodGFibGUsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKworICAgICAgICBzZWxmLnNob3dfYWxsKCkKKworICAgIGRlZiBsaW1pdF9kZXNjcmlwdGlvbl9sZW5ndGgoc2VsZiwgdGV4dGJ1ZmZlciwgaXRlciwgdGV4dCwgbGVuZ3RoKToKKyAgICAgICAgYnVmZmVyX2JvdW5kcyA9IHRleHRidWZmZXIuZ2V0X2JvdW5kcygpCisgICAgICAgIGVudGlyZV90ZXh0ID0gdGV4dGJ1ZmZlci5nZXRfdGV4dCgqYnVmZmVyX2JvdW5kcykKKyAgICAgICAgZW50aXJlX3RleHQgKz0gdGV4dAorICAgICAgICBpZiBsZW4oZW50aXJlX3RleHQpPjE1MCBvciB0ZXh0PT0iXG4iOgorICAgICAgICAgICAgdGV4dGJ1ZmZlci5lbWl0X3N0b3BfYnlfbmFtZSgiaW5zZXJ0LXRleHQiKQorCisgICAgZGVmIG5hbWVfZW50cnlfY2hhbmdlZChzZWxmLCBlbnRyeSk6CisgICAgICAgIHRleHQgPSBlbnRyeS5nZXRfdGV4dCgpCisgICAgICAgIGlmIHRleHQgPT0gJyc6CisgICAgICAgICAgICBzZWxmLnNhdmVfYnV0dG9uLnNldF9zZW5zaXRpdmUoRmFsc2UpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnNhdmVfYnV0dG9uLnNldF9zZW5zaXRpdmUoVHJ1ZSkKKworICAgIGRlZiBjYW5jZWxfYnV0dG9uX2NiKHNlbGYsIGJ1dHRvbik6CisgICAgICAgIHNlbGYuZGVzdHJveSgpCisKKyAgICBkZWYgc2F2ZV9idXR0b25fY2Ioc2VsZiwgYnV0dG9uKToKKyAgICAgICAgdGV4dCA9IHNlbGYubmFtZV9lbnRyeS5nZXRfdGV4dCgpCisgICAgICAgIG5ld190ZXh0ID0gdGV4dC5yZXBsYWNlKCItIiwiIikKKyAgICAgICAgZGVzY3JpcHRpb25fYnVmZmVyID0gc2VsZi5kZXNjcmlwdGlvbl9lbnRyeS5nZXRfYnVmZmVyKCkKKyAgICAgICAgZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbl9idWZmZXIuZ2V0X3RleHQoZGVzY3JpcHRpb25fYnVmZmVyLmdldF9zdGFydF9pdGVyKCksZGVzY3JpcHRpb25fYnVmZmVyLmdldF9lbmRfaXRlcigpKQorICAgICAgICBpZiBuZXdfdGV4dC5pc2xvd2VyKCkgYW5kIG5ld190ZXh0LmlzYWxudW0oKToKKyAgICAgICAgICAgIHNlbGYuYnVpbGRlci5pbWFnZV9kZXRhaWxzX3BhZ2UuaW1hZ2Vfc2F2ZWQgPSBUcnVlCisgICAgICAgICAgICBzZWxmLmJ1aWxkZXIuY3VzdG9taXplZCA9IEZhbHNlCisgICAgICAgICAgICBzZWxmLmJ1aWxkZXIuZ2VuZXJhdGVfbmV3X2ltYWdlKHNlbGYuZGlyZWN0b3J5K3RleHQsIGRlc2NyaXB0aW9uKQorICAgICAgICAgICAgc2VsZi5idWlsZGVyLnJlY2lwZV9tb2RlbC5zZXRfaW5fbGlzdCh0ZXh0LCBkZXNjcmlwdGlvbikKKyAgICAgICAgICAgIHNlbGYuYnVpbGRlci5yZWNpcGVfbW9kZWwuc2V0X3NlbGVjdGVkX2ltYWdlKHRleHQpCisgICAgICAgICAgICBzZWxmLmJ1aWxkZXIuaW1hZ2VfZGV0YWlsc19wYWdlLnNob3dfcGFnZShzZWxmLmJ1aWxkZXIuSU1BR0VfR0VORVJBVEVEKQorICAgICAgICAgICAgc2VsZi5idWlsZGVyLmltYWdlX2RldGFpbHNfcGFnZS5uYW1lX2ZpZWxkX3RlbXBsYXRlID0gdGV4dAorICAgICAgICAgICAgc2VsZi5idWlsZGVyLmltYWdlX2RldGFpbHNfcGFnZS5kZXNjcmlwdGlvbl9maWVsZF90ZW1wbGF0ZSA9IGRlc2NyaXB0aW9uCisgICAgICAgICAgICBzZWxmLmRlc3Ryb3koKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zaG93X2ludmFsaWRfaW5wdXRfZXJyb3JfZGlhbG9nKCkKKworICAgIGRlZiBzaG93X2ludmFsaWRfaW5wdXRfZXJyb3JfZGlhbG9nKHNlbGYpOgorICAgICAgICBsYmwgPSAiPGI+SW52YWxpZCBjaGFyYWN0ZXJzIGluIGltYWdlIHJlY2lwZSBuYW1lPC9iPiIKKyAgICAgICAgbXNnID0gIkltYWdlIHJlY2lwZSBuYW1lcyBzaG91bGQgYmUgYWxsIGxvd2VyY2FzZSBhbmRcbiIKKyAgICAgICAgbXNnICs9ICJpbmNsdWRlIG9ubHkgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuIFRoZSBvbmx5XG4iCisgICAgICAgIG1zZyArPSAic3BlY2lhbCBjaGFyYWN0ZXIgeW91IGNhbiB1c2UgaXMgdGhlIEFTQ0lJIGh5cGhlbiAoLSkuIgorICAgICAgICBkaWFsb2cgPSBDcnVtYnNNZXNzYWdlRGlhbG9nKHNlbGYsIGxibCwgZ3RrLk1FU1NBR0VfRVJST1IsIG1zZykKKyAgICAgICAgYnV0dG9uID0gZGlhbG9nLmFkZF9idXR0b24oIkNsb3NlIiwgZ3RrLlJFU1BPTlNFX09LKQorICAgICAgICBIb2JCdXR0b24uc3R5bGVfYnV0dG9uKGJ1dHRvbikKKworICAgICAgICByZXMgPSBkaWFsb2cucnVuKCkKKyAgICAgICAgc2VsZi5uYW1lX2VudHJ5LmdyYWJfZm9jdXMoKQorICAgICAgICBkaWFsb2cuZGVzdHJveSgpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaGlnL3NldHRpbmdzdWloZWxwZXIucHkgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaGlnL3NldHRpbmdzdWloZWxwZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAyODVjOQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9oaWcvc2V0dGluZ3N1aWhlbHBlci5weQpAQCAtMCwwICsxLDEyMiBAQAorIworIyBCaXRCYWtlIEdyYXBoaWNhbCBHVEsgVXNlciBJbnRlcmZhY2UKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgICBJbnRlbCBDb3Jwb3JhdGlvbgorIworIyBBdXRob3JlZCBieSBKb3NodWEgTG9jayA8am9zaEBsaW51eC5pbnRlbC5jb20+CisjIEF1dGhvcmVkIGJ5IERvbmd4aWFvIFh1IDxkb25neGlhby54dUBpbnRlbC5jb20+CisjIEF1dGhvcmVkIGJ5IFNoYW5lIFdhbmcgPHNoYW5lLndhbmdAaW50ZWwuY29tPgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworaW1wb3J0IGd0aworaW1wb3J0IG9zCitmcm9tIGJiLnVpLmNydW1icy5ob2J3aWRnZXQgaW1wb3J0IEhvYkluZm9CdXR0b24sIEhvYkJ1dHRvbiwgSG9iQWx0QnV0dG9uCisKKyIiIgorVGhlIGZvbGxvd2luZyBhcmUgY29udmVuaWVuY2UgY2xhc3NlcyBmb3IgaW1wbGVtZW50aW5nIEdOT01FIEhJRyBjb21wbGlhbnQKK0JpdEJha2UgR1VJJ3MKK0luIHN1bW1hcnk6IHNwYWNpbmcgPSAxMnB4LCBib3JkZXItd2lkdGggPSA2cHgKKyIiIgorCitjbGFzcyBTZXR0aW5nc1VJSGVscGVyKCk6CisKKyAgICBkZWYgZ2VuX2xhYmVsX3dpZGdldChzZWxmLCBjb250ZW50KToKKyAgICAgICAgbGFiZWwgPSBndGsuTGFiZWwoKQorICAgICAgICBsYWJlbC5zZXRfYWxpZ25tZW50KDAsIDApCisgICAgICAgIGxhYmVsLnNldF9tYXJrdXAoY29udGVudCkKKyAgICAgICAgbGFiZWwuc2hvdygpCisgICAgICAgIHJldHVybiBsYWJlbAorCisgICAgZGVmIGdlbl9sYWJlbF9pbmZvX3dpZGdldChzZWxmLCBjb250ZW50LCB0b29sdGlwKToKKyAgICAgICAgdGFibGUgPSBndGsuVGFibGUoMSwgMTAsIEZhbHNlKQorICAgICAgICBsYWJlbCA9IHNlbGYuZ2VuX2xhYmVsX3dpZGdldChjb250ZW50KQorICAgICAgICBpbmZvID0gSG9iSW5mb0J1dHRvbih0b29sdGlwLCBzZWxmKQorICAgICAgICB0YWJsZS5hdHRhY2gobGFiZWwsIDAsIDEsIDAsIDEsIHhvcHRpb25zPWd0ay5GSUxMKQorICAgICAgICB0YWJsZS5hdHRhY2goaW5mbywgMSwgMiwgMCwgMSwgeG9wdGlvbnM9Z3RrLkZJTEwsIHhwYWRkaW5nPTEwKQorICAgICAgICByZXR1cm4gdGFibGUKKworICAgIGRlZiBnZW5fc3Bpbm5lcl93aWRnZXQoc2VsZiwgY29udGVudCwgbG93ZXIsIHVwcGVyLCB0b29sdGlwPSIiKToKKyAgICAgICAgaGJveCA9IGd0ay5IQm94KEZhbHNlLCAxMikKKyAgICAgICAgYWRqdXN0ID0gZ3RrLkFkanVzdG1lbnQodmFsdWU9Y29udGVudCwgbG93ZXI9bG93ZXIsIHVwcGVyPXVwcGVyLCBzdGVwX2luY3I9MSkKKyAgICAgICAgc3Bpbm5lciA9IGd0ay5TcGluQnV0dG9uKGFkanVzdG1lbnQ9YWRqdXN0LCBjbGltYl9yYXRlPTEsIGRpZ2l0cz0wKQorCisgICAgICAgIHNwaW5uZXIuc2V0X3ZhbHVlKGNvbnRlbnQpCisgICAgICAgIGhib3gucGFja19zdGFydChzcGlubmVyLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgaW5mbyA9IEhvYkluZm9CdXR0b24odG9vbHRpcCwgc2VsZikKKyAgICAgICAgaGJveC5wYWNrX3N0YXJ0KGluZm8sIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKworICAgICAgICBoYm94LnNob3dfYWxsKCkKKyAgICAgICAgcmV0dXJuIGhib3gsIHNwaW5uZXIKKworICAgIGRlZiBnZW5fY29tYm9fd2lkZ2V0KHNlbGYsIGN1cnJfaXRlbSwgYWxsX2l0ZW0sIHRvb2x0aXA9IiIpOgorICAgICAgICBoYm94ID0gZ3RrLkhCb3goRmFsc2UsIDEyKQorICAgICAgICBjb21ibyA9IGd0ay5jb21ib19ib3hfbmV3X3RleHQoKQorICAgICAgICBoYm94LnBhY2tfc3RhcnQoY29tYm8sIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKworICAgICAgICBpbmRleCA9IDAKKyAgICAgICAgZm9yIGl0ZW0gaW4gYWxsX2l0ZW0gb3IgW106CisgICAgICAgICAgICBjb21iby5hcHBlbmRfdGV4dChpdGVtKQorICAgICAgICAgICAgaWYgaXRlbSA9PSBjdXJyX2l0ZW06CisgICAgICAgICAgICAgICAgY29tYm8uc2V0X2FjdGl2ZShpbmRleCkKKyAgICAgICAgICAgIGluZGV4ICs9IDEKKworICAgICAgICBpbmZvID0gSG9iSW5mb0J1dHRvbih0b29sdGlwLCBzZWxmKQorICAgICAgICBoYm94LnBhY2tfc3RhcnQoaW5mbywgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorCisgICAgICAgIGhib3guc2hvd19hbGwoKQorICAgICAgICByZXR1cm4gaGJveCwgY29tYm8KKworICAgIGRlZiBlbnRyeV93aWRnZXRfc2VsZWN0X3BhdGhfY2Ioc2VsZiwgYWN0aW9uLCBwYXJlbnQsIGVudHJ5KToKKyAgICAgICAgZGlhbG9nID0gZ3RrLkZpbGVDaG9vc2VyRGlhbG9nKCIiLCBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGsuRklMRV9DSE9PU0VSX0FDVElPTl9TRUxFQ1RfRk9MREVSKQorICAgICAgICB0ZXh0ID0gZW50cnkuZ2V0X3RleHQoKQorICAgICAgICBkaWFsb2cuc2V0X2N1cnJlbnRfZm9sZGVyKHRleHQgaWYgbGVuKHRleHQpID4gMCBlbHNlIG9zLmdldGN3ZCgpKQorICAgICAgICBidXR0b24gPSBkaWFsb2cuYWRkX2J1dHRvbigiQ2FuY2VsIiwgZ3RrLlJFU1BPTlNFX05PKQorICAgICAgICBIb2JBbHRCdXR0b24uc3R5bGVfYnV0dG9uKGJ1dHRvbikKKyAgICAgICAgYnV0dG9uID0gZGlhbG9nLmFkZF9idXR0b24oIk9wZW4iLCBndGsuUkVTUE9OU0VfWUVTKQorICAgICAgICBIb2JCdXR0b24uc3R5bGVfYnV0dG9uKGJ1dHRvbikKKyAgICAgICAgcmVzcG9uc2UgPSBkaWFsb2cucnVuKCkKKyAgICAgICAgaWYgcmVzcG9uc2UgPT0gZ3RrLlJFU1BPTlNFX1lFUzoKKyAgICAgICAgICAgIHBhdGggPSBkaWFsb2cuZ2V0X2ZpbGVuYW1lKCkKKyAgICAgICAgICAgIGVudHJ5LnNldF90ZXh0KHBhdGgpCisKKyAgICAgICAgZGlhbG9nLmRlc3Ryb3koKQorCisgICAgZGVmIGdlbl9lbnRyeV93aWRnZXQoc2VsZiwgY29udGVudCwgcGFyZW50LCB0b29sdGlwPSIiLCBuZWVkX2J1dHRvbj1UcnVlKToKKyAgICAgICAgaGJveCA9IGd0ay5IQm94KEZhbHNlLCAxMikKKyAgICAgICAgZW50cnkgPSBndGsuRW50cnkoKQorICAgICAgICBlbnRyeS5zZXRfdGV4dChjb250ZW50KQorICAgICAgICBlbnRyeS5zZXRfc2l6ZV9yZXF1ZXN0KDM1MCwzMCkKKworICAgICAgICBpZiBuZWVkX2J1dHRvbjoKKyAgICAgICAgICAgIHRhYmxlID0gZ3RrLlRhYmxlKDEsIDEwLCBGYWxzZSkKKyAgICAgICAgICAgIGhib3gucGFja19zdGFydCh0YWJsZSwgZXhwYW5kPVRydWUsIGZpbGw9VHJ1ZSkKKyAgICAgICAgICAgIHRhYmxlLmF0dGFjaChlbnRyeSwgMCwgOSwgMCwgMSwgeG9wdGlvbnM9Z3RrLlNIUklOSykKKyAgICAgICAgICAgIGltYWdlID0gZ3RrLkltYWdlKCkKKyAgICAgICAgICAgIGltYWdlLnNldF9mcm9tX3N0b2NrKGd0ay5TVE9DS19PUEVOLGd0ay5JQ09OX1NJWkVfQlVUVE9OKQorICAgICAgICAgICAgb3Blbl9idXR0b24gPSBndGsuQnV0dG9uKCkKKyAgICAgICAgICAgIG9wZW5fYnV0dG9uLnNldF9pbWFnZShpbWFnZSkKKyAgICAgICAgICAgIG9wZW5fYnV0dG9uLmNvbm5lY3QoImNsaWNrZWQiLCBzZWxmLmVudHJ5X3dpZGdldF9zZWxlY3RfcGF0aF9jYiwgcGFyZW50LCBlbnRyeSkKKyAgICAgICAgICAgIHRhYmxlLmF0dGFjaChvcGVuX2J1dHRvbiwgOSwgMTAsIDAsIDEsIHhvcHRpb25zPWd0ay5TSFJJTkspCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBoYm94LnBhY2tfc3RhcnQoZW50cnksIGV4cGFuZD1UcnVlLCBmaWxsPVRydWUpCisKKyAgICAgICAgaWYgdG9vbHRpcCAhPSAiIjoKKyAgICAgICAgICAgIGluZm8gPSBIb2JJbmZvQnV0dG9uKHRvb2x0aXAsIHNlbGYpCisgICAgICAgICAgICBoYm94LnBhY2tfc3RhcnQoaW5mbywgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorCisgICAgICAgIGhib3guc2hvd19hbGwoKQorICAgICAgICByZXR1cm4gaGJveCwgZW50cnkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9oaWcvc2ltcGxlc2V0dGluZ3NkaWFsb2cucHkgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaGlnL3NpbXBsZXNldHRpbmdzZGlhbG9nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZWIzZDgKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaGlnL3NpbXBsZXNldHRpbmdzZGlhbG9nLnB5CkBAIC0wLDAgKzEsODkxIEBACisjCisjIEJpdEJha2UgR3JhcGhpY2FsIEdUSyBVc2VyIEludGVyZmFjZQorIworIyBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiAgIEludGVsIENvcnBvcmF0aW9uCisjCisjIEF1dGhvcmVkIGJ5IEpvc2h1YSBMb2NrIDxqb3NoQGxpbnV4LmludGVsLmNvbT4KKyMgQXV0aG9yZWQgYnkgRG9uZ3hpYW8gWHUgPGRvbmd4aWFvLnh1QGludGVsLmNvbT4KKyMgQXV0aG9yZWQgYnkgU2hhbmUgV2FuZyA8c2hhbmUud2FuZ0BpbnRlbC5jb20+CisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitpbXBvcnQgZ3RrCitpbXBvcnQgZ29iamVjdAoraW1wb3J0IGhhc2hsaWIKK2Zyb20gYmIudWkuY3J1bWJzLmhvYndpZGdldCBpbXBvcnQgaGljLCBIb2JJbmZvQnV0dG9uLCBIb2JCdXR0b24sIEhvYkFsdEJ1dHRvbiAKK2Zyb20gYmIudWkuY3J1bWJzLnByb2dyZXNzYmFyIGltcG9ydCBIb2JQcm9ncmVzc0JhcgorZnJvbSBiYi51aS5jcnVtYnMuaGlnLnNldHRpbmdzdWloZWxwZXIgaW1wb3J0IFNldHRpbmdzVUlIZWxwZXIKK2Zyb20gYmIudWkuY3J1bWJzLmhpZy5jcnVtYnNkaWFsb2cgaW1wb3J0IENydW1ic0RpYWxvZworZnJvbSBiYi51aS5jcnVtYnMuaGlnLmNydW1ic21lc3NhZ2VkaWFsb2cgaW1wb3J0IENydW1ic01lc3NhZ2VEaWFsb2cKK2Zyb20gYmIudWkuY3J1bWJzLmhpZy5wcm94eWRldGFpbHNkaWFsb2cgaW1wb3J0IFByb3h5RGV0YWlsc0RpYWxvZworCisiIiIKK1RoZSBmb2xsb3dpbmcgYXJlIGNvbnZlbmllbmNlIGNsYXNzZXMgZm9yIGltcGxlbWVudGluZyBHTk9NRSBISUcgY29tcGxpYW50CitCaXRCYWtlIEdVSSdzCitJbiBzdW1tYXJ5OiBzcGFjaW5nID0gMTJweCwgYm9yZGVyLXdpZHRoID0gNnB4CisiIiIKKworY2xhc3MgU2ltcGxlU2V0dGluZ3NEaWFsb2cgKENydW1ic0RpYWxvZywgU2V0dGluZ3NVSUhlbHBlcik6CisKKyAgICAoQlVJTERfRU5WX1BBR0VfSUQsCisgICAgIFNIQVJFRF9TVEFURV9QQUdFX0lELAorICAgICBQUk9YSUVTX1BBR0VfSUQsCisgICAgIE9USEVSU19QQUdFX0lEKSA9IHJhbmdlKDQpCisKKyAgICAoVEVTVF9ORVRXT1JLX05PTkUsCisgICAgIFRFU1RfTkVUV09SS19JTklUSUFMLAorICAgICBURVNUX05FVFdPUktfUlVOTklORywKKyAgICAgVEVTVF9ORVRXT1JLX1BBU1NFRCwKKyAgICAgVEVTVF9ORVRXT1JLX0ZBSUxFRCwKKyAgICAgVEVTVF9ORVRXT1JLX0NBTkNFTEVEKSA9IHJhbmdlKDYpCisKKyAgICBUQVJHRVRTID0gWworICAgICAgICAoIk1ZX1RSRUVfTU9ERUxfUk9XIiwgZ3RrLlRBUkdFVF9TQU1FX1dJREdFVCwgMCksCisgICAgICAgICgidGV4dC9wbGFpbiIsIDAsIDEpLAorICAgICAgICAoIlRFWFQiLCAwLCAyKSwKKyAgICAgICAgKCJTVFJJTkciLCAwLCAzKSwKKyAgICAgICAgXQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRpdGxlLCBjb25maWd1cmF0aW9uLCBhbGxfaW1hZ2VfdHlwZXMsCisgICAgICAgICAgICBhbGxfcGFja2FnZV9mb3JtYXRzLCBhbGxfZGlzdHJvcywgYWxsX3Nka19tYWNoaW5lcywKKyAgICAgICAgICAgIG1heF90aHJlYWRzLCBwYXJlbnQsIGZsYWdzLCBoYW5kbGVyLCBidXR0b25zPU5vbmUpOgorICAgICAgICBzdXBlcihTaW1wbGVTZXR0aW5nc0RpYWxvZywgc2VsZikuX19pbml0X18odGl0bGUsIHBhcmVudCwgZmxhZ3MsIGJ1dHRvbnMpCisKKyAgICAgICAgIyBjbGFzcyBtZW1iZXJzIGZyb20gb3RoZXIgb2JqZWN0cworICAgICAgICAjIGJpdGJha2Ugc2V0dGluZ3MgZnJvbSBCdWlsZGVyLkNvbmZpZ3VyYXRpb24KKyAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbgorICAgICAgICBzZWxmLmltYWdlX3R5cGVzID0gYWxsX2ltYWdlX3R5cGVzCisgICAgICAgIHNlbGYuYWxsX3BhY2thZ2VfZm9ybWF0cyA9IGFsbF9wYWNrYWdlX2Zvcm1hdHMKKyAgICAgICAgc2VsZi5hbGxfZGlzdHJvcyA9IGFsbF9kaXN0cm9zCisgICAgICAgIHNlbGYuYWxsX3Nka19tYWNoaW5lcyA9IGFsbF9zZGtfbWFjaGluZXMKKyAgICAgICAgc2VsZi5tYXhfdGhyZWFkcyA9IG1heF90aHJlYWRzCisKKyAgICAgICAgIyBjbGFzcyBtZW1iZXJzIGZvciBpbnRlcm5hbCB1c2UKKyAgICAgICAgc2VsZi5kbGRpcl90ZXh0ID0gTm9uZQorICAgICAgICBzZWxmLnNzdGF0ZWRpcl90ZXh0ID0gTm9uZQorICAgICAgICBzZWxmLnNzdGF0ZW1pcnJvcnNfbGlzdCA9IFtdCisgICAgICAgIHNlbGYuc3N0YXRlbWlycm9yc19jaGFuZ2VkID0gMAorICAgICAgICBzZWxmLmJiX3NwaW5uZXIgPSBOb25lCisgICAgICAgIHNlbGYucG1ha2Vfc3Bpbm5lciA9IE5vbmUKKyAgICAgICAgc2VsZi5yb290ZnNfc2l6ZV9zcGlubmVyID0gTm9uZQorICAgICAgICBzZWxmLmV4dHJhX3NpemVfc3Bpbm5lciA9IE5vbmUKKyAgICAgICAgc2VsZi5ncGx2M19jaGVja2JveCA9IE5vbmUKKyAgICAgICAgc2VsZi50b29sY2hhaW5fY2hlY2tib3ggPSBOb25lCisgICAgICAgIHNlbGYuc2V0dGluZ19zdG9yZSA9IE5vbmUKKyAgICAgICAgc2VsZi5pbWFnZV90eXBlc19jaGVja2J1dHRvbnMgPSB7fQorCisgICAgICAgIHNlbGYubWQ1ID0gc2VsZi5jb25maWdfbWQ1KCkKKyAgICAgICAgc2VsZi5wcm94eV9tZDUgPSBzZWxmLmNvbmZpZ19wcm94eV9tZDUoKQorICAgICAgICBzZWxmLnNldHRpbmdzX2NoYW5nZWQgPSBGYWxzZQorICAgICAgICBzZWxmLnByb3h5X3NldHRpbmdzX2NoYW5nZWQgPSBGYWxzZQorICAgICAgICBzZWxmLmhhbmRsZXIgPSBoYW5kbGVyCisgICAgICAgIHNlbGYucHJveHlfdGVzdF9yYW4gPSBGYWxzZQorICAgICAgICBzZWxmLnNlbGVjdGVkX21pcnJvcl9yb3cgPSAwCisgICAgICAgIHNlbGYubmV3X21pcnJvciA9IEZhbHNlCisKKyAgICAgICAgIyBjcmVhdGUgdmlzdWFsIGVsZW1lbnRzIG9uIHRoZSBkaWFsb2cKKyAgICAgICAgc2VsZi5jcmVhdGVfdmlzdWFsX2VsZW1lbnRzKCkKKyAgICAgICAgc2VsZi5jb25uZWN0KCJyZXNwb25zZSIsIHNlbGYucmVzcG9uc2VfY2IpCisKKyAgICBkZWYgX2dldF9zb3J0ZWRfdmFsdWUoc2VsZiwgdmFyKToKKyAgICAgICAgcmV0dXJuICIgIi5qb2luKHNvcnRlZChzdHIodmFyKS5zcGxpdCgpKSkgKyAiXG4iCisKKyAgICBkZWYgY29uZmlnX3Byb3h5X21kNShzZWxmKToKKyAgICAgICAgZGF0YSA9ICgiRU5BQkxFX1BST1hZOiAiICAgICAgICAgKyBzZWxmLl9nZXRfc29ydGVkX3ZhbHVlKHNlbGYuY29uZmlndXJhdGlvbi5lbmFibGVfcHJveHkpKQorICAgICAgICBpZiBzZWxmLmNvbmZpZ3VyYXRpb24uZW5hYmxlX3Byb3h5OgorICAgICAgICAgICAgZm9yIHByb3RvY29sIGluIHNlbGYuY29uZmlndXJhdGlvbi5wcm94aWVzLmtleXMoKToKKyAgICAgICAgICAgICAgICBkYXRhICs9IChwcm90b2NvbCArICI6ICIgKyBzZWxmLl9nZXRfc29ydGVkX3ZhbHVlKHNlbGYuY29uZmlndXJhdGlvbi5jb21iaW5lX3Byb3h5KHByb3RvY29sKSkpCisgICAgICAgIHJldHVybiBoYXNobGliLm1kNShkYXRhKS5oZXhkaWdlc3QoKQorCisgICAgZGVmIGNvbmZpZ19tZDUoc2VsZik6CisgICAgICAgIGRhdGEgPSAiIgorICAgICAgICBmb3Iga2V5IGluIHNlbGYuY29uZmlndXJhdGlvbi5leHRyYV9zZXR0aW5nLmtleXMoKToKKyAgICAgICAgICAgIGRhdGEgKz0gKGtleSArICI6ICIgKyBzZWxmLl9nZXRfc29ydGVkX3ZhbHVlKHNlbGYuY29uZmlndXJhdGlvbi5leHRyYV9zZXR0aW5nW2tleV0pKQorICAgICAgICByZXR1cm4gaGFzaGxpYi5tZDUoZGF0YSkuaGV4ZGlnZXN0KCkKKworICAgIGRlZiBnZW5fcHJveHlfZW50cnlfd2lkZ2V0KHNlbGYsIHByb3RvY29sLCBwYXJlbnQsIG5lZWRfYnV0dG9uPVRydWUsIGxpbmU9MCk6CisgICAgICAgIGxhYmVsID0gZ3RrLkxhYmVsKHByb3RvY29sLnVwcGVyKCkgKyAiIHByb3h5IikKKyAgICAgICAgc2VsZi5wcm94eV90YWJsZS5hdHRhY2gobGFiZWwsIDAsIDEsIGxpbmUsIGxpbmUrMSwgeHBhZGRpbmc9MjQpCisKKyAgICAgICAgcHJveHlfZW50cnkgPSBndGsuRW50cnkoKQorICAgICAgICBwcm94eV9lbnRyeS5zZXRfc2l6ZV9yZXF1ZXN0KDMwMCwgLTEpCisgICAgICAgIHNlbGYucHJveHlfdGFibGUuYXR0YWNoKHByb3h5X2VudHJ5LCAxLCAyLCBsaW5lLCBsaW5lKzEsIHlwYWRkaW5nPTQpCisKKyAgICAgICAgc2VsZi5wcm94eV90YWJsZS5hdHRhY2goZ3RrLkxhYmVsKCI6IiksIDIsIDMsIGxpbmUsIGxpbmUrMSwgeHBhZGRpbmc9MTIsIHlwYWRkaW5nPTQpCisKKyAgICAgICAgcG9ydF9lbnRyeSA9IGd0ay5FbnRyeSgpCisgICAgICAgIHBvcnRfZW50cnkuc2V0X3NpemVfcmVxdWVzdCg2MCwgLTEpCisgICAgICAgIHNlbGYucHJveHlfdGFibGUuYXR0YWNoKHBvcnRfZW50cnksIDMsIDQsIGxpbmUsIGxpbmUrMSwgeXBhZGRpbmc9NCkKKworICAgICAgICBkZXRhaWxzX2J1dHRvbiA9IEhvYkFsdEJ1dHRvbigiRGV0YWlscyIpCisgICAgICAgIGRldGFpbHNfYnV0dG9uLmNvbm5lY3QoImNsaWNrZWQiLCBzZWxmLmRldGFpbHNfY2IsIHBhcmVudCwgcHJvdG9jb2wpCisgICAgICAgIHNlbGYucHJveHlfdGFibGUuYXR0YWNoKGRldGFpbHNfYnV0dG9uLCA0LCA1LCBsaW5lLCBsaW5lKzEsIHhwYWRkaW5nPTQsIHlvcHRpb25zPWd0ay5FWFBBTkQpCisKKyAgICAgICAgcmV0dXJuIHByb3h5X2VudHJ5LCBwb3J0X2VudHJ5LCBkZXRhaWxzX2J1dHRvbgorCisgICAgZGVmIHJlZnJlc2hfcHJveHlfY29tcG9uZW50cyhzZWxmKToKKyAgICAgICAgc2VsZi5zYW1lX2NoZWNrYm94LnNldF9zZW5zaXRpdmUoc2VsZi5jb25maWd1cmF0aW9uLmVuYWJsZV9wcm94eSkKKworICAgICAgICBzZWxmLmh0dHBfcHJveHkuc2V0X3RleHQoc2VsZi5jb25maWd1cmF0aW9uLmNvbWJpbmVfaG9zdF9vbmx5KCJodHRwIikpCisgICAgICAgIHNlbGYuaHR0cF9wcm94eS5zZXRfZWRpdGFibGUoc2VsZi5jb25maWd1cmF0aW9uLmVuYWJsZV9wcm94eSkKKyAgICAgICAgc2VsZi5odHRwX3Byb3h5LnNldF9zZW5zaXRpdmUoc2VsZi5jb25maWd1cmF0aW9uLmVuYWJsZV9wcm94eSkKKyAgICAgICAgc2VsZi5odHRwX3Byb3h5X3BvcnQuc2V0X3RleHQoc2VsZi5jb25maWd1cmF0aW9uLmNvbWJpbmVfcG9ydF9vbmx5KCJodHRwIikpCisgICAgICAgIHNlbGYuaHR0cF9wcm94eV9wb3J0LnNldF9lZGl0YWJsZShzZWxmLmNvbmZpZ3VyYXRpb24uZW5hYmxlX3Byb3h5KQorICAgICAgICBzZWxmLmh0dHBfcHJveHlfcG9ydC5zZXRfc2Vuc2l0aXZlKHNlbGYuY29uZmlndXJhdGlvbi5lbmFibGVfcHJveHkpCisgICAgICAgIHNlbGYuaHR0cF9wcm94eV9kZXRhaWxzLnNldF9zZW5zaXRpdmUoc2VsZi5jb25maWd1cmF0aW9uLmVuYWJsZV9wcm94eSkKKworICAgICAgICBzZWxmLmh0dHBzX3Byb3h5LnNldF90ZXh0KHNlbGYuY29uZmlndXJhdGlvbi5jb21iaW5lX2hvc3Rfb25seSgiaHR0cHMiKSkKKyAgICAgICAgc2VsZi5odHRwc19wcm94eS5zZXRfZWRpdGFibGUoc2VsZi5jb25maWd1cmF0aW9uLmVuYWJsZV9wcm94eSBhbmQgKG5vdCBzZWxmLmNvbmZpZ3VyYXRpb24uc2FtZV9wcm94eSkpCisgICAgICAgIHNlbGYuaHR0cHNfcHJveHkuc2V0X3NlbnNpdGl2ZShzZWxmLmNvbmZpZ3VyYXRpb24uZW5hYmxlX3Byb3h5IGFuZCAobm90IHNlbGYuY29uZmlndXJhdGlvbi5zYW1lX3Byb3h5KSkKKyAgICAgICAgc2VsZi5odHRwc19wcm94eV9wb3J0LnNldF90ZXh0KHNlbGYuY29uZmlndXJhdGlvbi5jb21iaW5lX3BvcnRfb25seSgiaHR0cHMiKSkKKyAgICAgICAgc2VsZi5odHRwc19wcm94eV9wb3J0LnNldF9lZGl0YWJsZShzZWxmLmNvbmZpZ3VyYXRpb24uZW5hYmxlX3Byb3h5IGFuZCAobm90IHNlbGYuY29uZmlndXJhdGlvbi5zYW1lX3Byb3h5KSkKKyAgICAgICAgc2VsZi5odHRwc19wcm94eV9wb3J0LnNldF9zZW5zaXRpdmUoc2VsZi5jb25maWd1cmF0aW9uLmVuYWJsZV9wcm94eSBhbmQgKG5vdCBzZWxmLmNvbmZpZ3VyYXRpb24uc2FtZV9wcm94eSkpCisgICAgICAgIHNlbGYuaHR0cHNfcHJveHlfZGV0YWlscy5zZXRfc2Vuc2l0aXZlKHNlbGYuY29uZmlndXJhdGlvbi5lbmFibGVfcHJveHkgYW5kIChub3Qgc2VsZi5jb25maWd1cmF0aW9uLnNhbWVfcHJveHkpKQorCisgICAgICAgIHNlbGYuZnRwX3Byb3h5LnNldF90ZXh0KHNlbGYuY29uZmlndXJhdGlvbi5jb21iaW5lX2hvc3Rfb25seSgiZnRwIikpCisgICAgICAgIHNlbGYuZnRwX3Byb3h5LnNldF9lZGl0YWJsZShzZWxmLmNvbmZpZ3VyYXRpb24uZW5hYmxlX3Byb3h5IGFuZCAobm90IHNlbGYuY29uZmlndXJhdGlvbi5zYW1lX3Byb3h5KSkKKyAgICAgICAgc2VsZi5mdHBfcHJveHkuc2V0X3NlbnNpdGl2ZShzZWxmLmNvbmZpZ3VyYXRpb24uZW5hYmxlX3Byb3h5IGFuZCAobm90IHNlbGYuY29uZmlndXJhdGlvbi5zYW1lX3Byb3h5KSkKKyAgICAgICAgc2VsZi5mdHBfcHJveHlfcG9ydC5zZXRfdGV4dChzZWxmLmNvbmZpZ3VyYXRpb24uY29tYmluZV9wb3J0X29ubHkoImZ0cCIpKQorICAgICAgICBzZWxmLmZ0cF9wcm94eV9wb3J0LnNldF9lZGl0YWJsZShzZWxmLmNvbmZpZ3VyYXRpb24uZW5hYmxlX3Byb3h5IGFuZCAobm90IHNlbGYuY29uZmlndXJhdGlvbi5zYW1lX3Byb3h5KSkKKyAgICAgICAgc2VsZi5mdHBfcHJveHlfcG9ydC5zZXRfc2Vuc2l0aXZlKHNlbGYuY29uZmlndXJhdGlvbi5lbmFibGVfcHJveHkgYW5kIChub3Qgc2VsZi5jb25maWd1cmF0aW9uLnNhbWVfcHJveHkpKQorICAgICAgICBzZWxmLmZ0cF9wcm94eV9kZXRhaWxzLnNldF9zZW5zaXRpdmUoc2VsZi5jb25maWd1cmF0aW9uLmVuYWJsZV9wcm94eSBhbmQgKG5vdCBzZWxmLmNvbmZpZ3VyYXRpb24uc2FtZV9wcm94eSkpCisKKyAgICAgICAgc2VsZi5zb2Nrc19wcm94eS5zZXRfdGV4dChzZWxmLmNvbmZpZ3VyYXRpb24uY29tYmluZV9ob3N0X29ubHkoInNvY2tzIikpCisgICAgICAgIHNlbGYuc29ja3NfcHJveHkuc2V0X2VkaXRhYmxlKHNlbGYuY29uZmlndXJhdGlvbi5lbmFibGVfcHJveHkgYW5kIChub3Qgc2VsZi5jb25maWd1cmF0aW9uLnNhbWVfcHJveHkpKQorICAgICAgICBzZWxmLnNvY2tzX3Byb3h5LnNldF9zZW5zaXRpdmUoc2VsZi5jb25maWd1cmF0aW9uLmVuYWJsZV9wcm94eSBhbmQgKG5vdCBzZWxmLmNvbmZpZ3VyYXRpb24uc2FtZV9wcm94eSkpCisgICAgICAgIHNlbGYuc29ja3NfcHJveHlfcG9ydC5zZXRfdGV4dChzZWxmLmNvbmZpZ3VyYXRpb24uY29tYmluZV9wb3J0X29ubHkoInNvY2tzIikpCisgICAgICAgIHNlbGYuc29ja3NfcHJveHlfcG9ydC5zZXRfZWRpdGFibGUoc2VsZi5jb25maWd1cmF0aW9uLmVuYWJsZV9wcm94eSBhbmQgKG5vdCBzZWxmLmNvbmZpZ3VyYXRpb24uc2FtZV9wcm94eSkpCisgICAgICAgIHNlbGYuc29ja3NfcHJveHlfcG9ydC5zZXRfc2Vuc2l0aXZlKHNlbGYuY29uZmlndXJhdGlvbi5lbmFibGVfcHJveHkgYW5kIChub3Qgc2VsZi5jb25maWd1cmF0aW9uLnNhbWVfcHJveHkpKQorICAgICAgICBzZWxmLnNvY2tzX3Byb3h5X2RldGFpbHMuc2V0X3NlbnNpdGl2ZShzZWxmLmNvbmZpZ3VyYXRpb24uZW5hYmxlX3Byb3h5IGFuZCAobm90IHNlbGYuY29uZmlndXJhdGlvbi5zYW1lX3Byb3h5KSkKKworICAgICAgICBzZWxmLmN2c19wcm94eS5zZXRfdGV4dChzZWxmLmNvbmZpZ3VyYXRpb24uY29tYmluZV9ob3N0X29ubHkoImN2cyIpKQorICAgICAgICBzZWxmLmN2c19wcm94eS5zZXRfZWRpdGFibGUoc2VsZi5jb25maWd1cmF0aW9uLmVuYWJsZV9wcm94eSBhbmQgKG5vdCBzZWxmLmNvbmZpZ3VyYXRpb24uc2FtZV9wcm94eSkpCisgICAgICAgIHNlbGYuY3ZzX3Byb3h5LnNldF9zZW5zaXRpdmUoc2VsZi5jb25maWd1cmF0aW9uLmVuYWJsZV9wcm94eSBhbmQgKG5vdCBzZWxmLmNvbmZpZ3VyYXRpb24uc2FtZV9wcm94eSkpCisgICAgICAgIHNlbGYuY3ZzX3Byb3h5X3BvcnQuc2V0X3RleHQoc2VsZi5jb25maWd1cmF0aW9uLmNvbWJpbmVfcG9ydF9vbmx5KCJjdnMiKSkKKyAgICAgICAgc2VsZi5jdnNfcHJveHlfcG9ydC5zZXRfZWRpdGFibGUoc2VsZi5jb25maWd1cmF0aW9uLmVuYWJsZV9wcm94eSBhbmQgKG5vdCBzZWxmLmNvbmZpZ3VyYXRpb24uc2FtZV9wcm94eSkpCisgICAgICAgIHNlbGYuY3ZzX3Byb3h5X3BvcnQuc2V0X3NlbnNpdGl2ZShzZWxmLmNvbmZpZ3VyYXRpb24uZW5hYmxlX3Byb3h5IGFuZCAobm90IHNlbGYuY29uZmlndXJhdGlvbi5zYW1lX3Byb3h5KSkKKyAgICAgICAgc2VsZi5jdnNfcHJveHlfZGV0YWlscy5zZXRfc2Vuc2l0aXZlKHNlbGYuY29uZmlndXJhdGlvbi5lbmFibGVfcHJveHkgYW5kIChub3Qgc2VsZi5jb25maWd1cmF0aW9uLnNhbWVfcHJveHkpKQorCisgICAgICAgIGlmIHNlbGYuY29uZmlndXJhdGlvbi5zYW1lX3Byb3h5OgorICAgICAgICAgICAgaWYgc2VsZi5odHRwX3Byb3h5LmdldF90ZXh0KCk6CisgICAgICAgICAgICAgICAgW3cuc2V0X3RleHQoc2VsZi5odHRwX3Byb3h5LmdldF90ZXh0KCkpIGZvciB3IGluIHNlbGYuc2FtZV9wcm94eV9hZGRyZXNzZXNdCisgICAgICAgICAgICBpZiBzZWxmLmh0dHBfcHJveHlfcG9ydC5nZXRfdGV4dCgpOgorICAgICAgICAgICAgICAgIFt3LnNldF90ZXh0KHNlbGYuaHR0cF9wcm94eV9wb3J0LmdldF90ZXh0KCkpIGZvciB3IGluIHNlbGYuc2FtZV9wcm94eV9wb3J0c10KKworICAgIGRlZiBwcm94eV9jaGVja2JveF90b2dnbGVkX2NiKHNlbGYsIGJ1dHRvbik6CisgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi5lbmFibGVfcHJveHkgPSBzZWxmLnByb3h5X2NoZWNrYm94LmdldF9hY3RpdmUoKQorICAgICAgICBpZiBub3Qgc2VsZi5jb25maWd1cmF0aW9uLmVuYWJsZV9wcm94eToKKyAgICAgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi5zYW1lX3Byb3h5ID0gRmFsc2UKKyAgICAgICAgICAgIHNlbGYuc2FtZV9jaGVja2JveC5zZXRfYWN0aXZlKHNlbGYuY29uZmlndXJhdGlvbi5zYW1lX3Byb3h5KQorICAgICAgICBzZWxmLnNhdmVfcHJveHlfZGF0YSgpCisgICAgICAgIHNlbGYucmVmcmVzaF9wcm94eV9jb21wb25lbnRzKCkKKworICAgIGRlZiBzYW1lX2NoZWNrYm94X3RvZ2dsZWRfY2Ioc2VsZiwgYnV0dG9uKToKKyAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLnNhbWVfcHJveHkgPSBzZWxmLnNhbWVfY2hlY2tib3guZ2V0X2FjdGl2ZSgpCisgICAgICAgIHNlbGYuc2F2ZV9wcm94eV9kYXRhKCkKKyAgICAgICAgc2VsZi5yZWZyZXNoX3Byb3h5X2NvbXBvbmVudHMoKQorCisgICAgZGVmIHNhdmVfcHJveHlfZGF0YShzZWxmKToKKyAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLnNwbGl0X3Byb3h5KCJodHRwIiwgc2VsZi5odHRwX3Byb3h5LmdldF90ZXh0KCkgKyAiOiIgKyBzZWxmLmh0dHBfcHJveHlfcG9ydC5nZXRfdGV4dCgpKQorICAgICAgICBpZiBzZWxmLmNvbmZpZ3VyYXRpb24uc2FtZV9wcm94eToKKyAgICAgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi5zcGxpdF9wcm94eSgiaHR0cHMiLCBzZWxmLmh0dHBfcHJveHkuZ2V0X3RleHQoKSArICI6IiArIHNlbGYuaHR0cF9wcm94eV9wb3J0LmdldF90ZXh0KCkpCisgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uc3BsaXRfcHJveHkoImZ0cCIsIHNlbGYuaHR0cF9wcm94eS5nZXRfdGV4dCgpICsgIjoiICsgc2VsZi5odHRwX3Byb3h5X3BvcnQuZ2V0X3RleHQoKSkKKyAgICAgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi5zcGxpdF9wcm94eSgic29ja3MiLCBzZWxmLmh0dHBfcHJveHkuZ2V0X3RleHQoKSArICI6IiArIHNlbGYuaHR0cF9wcm94eV9wb3J0LmdldF90ZXh0KCkpCisgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uc3BsaXRfcHJveHkoImN2cyIsIHNlbGYuaHR0cF9wcm94eS5nZXRfdGV4dCgpICsgIjoiICsgc2VsZi5odHRwX3Byb3h5X3BvcnQuZ2V0X3RleHQoKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi5zcGxpdF9wcm94eSgiaHR0cHMiLCBzZWxmLmh0dHBzX3Byb3h5LmdldF90ZXh0KCkgKyAiOiIgKyBzZWxmLmh0dHBzX3Byb3h5X3BvcnQuZ2V0X3RleHQoKSkKKyAgICAgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi5zcGxpdF9wcm94eSgiZnRwIiwgc2VsZi5mdHBfcHJveHkuZ2V0X3RleHQoKSArICI6IiArIHNlbGYuZnRwX3Byb3h5X3BvcnQuZ2V0X3RleHQoKSkKKyAgICAgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi5zcGxpdF9wcm94eSgic29ja3MiLCBzZWxmLnNvY2tzX3Byb3h5LmdldF90ZXh0KCkgKyAiOiIgKyBzZWxmLnNvY2tzX3Byb3h5X3BvcnQuZ2V0X3RleHQoKSkKKyAgICAgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi5zcGxpdF9wcm94eSgiY3ZzIiwgc2VsZi5jdnNfcHJveHkuZ2V0X3RleHQoKSArICI6IiArIHNlbGYuY3ZzX3Byb3h5X3BvcnQuZ2V0X3RleHQoKSkgICAgICAgCisKKyAgICBkZWYgcmVzcG9uc2VfY2Ioc2VsZiwgZGlhbG9nLCByZXNwb25zZV9pZCk6CisgICAgICAgIGlmIHJlc3BvbnNlX2lkID09IGd0ay5SRVNQT05TRV9ZRVM6CisgICAgICAgICAgICBpZiBzZWxmLnByb3h5X2NoZWNrYm94LmdldF9hY3RpdmUoKToKKyAgICAgICAgICAgICAgICAjIENoZWNrIHRoYXQgYWxsIHByb3h5IGVudHJpZXMgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgcG9ydAorICAgICAgICAgICAgICAgIGZvciBwcm94eSwgcG9ydCBpbiB6aXAoc2VsZi5hbGxfcHJveHlfYWRkcmVzc2VzLCBzZWxmLmFsbF9wcm94eV9wb3J0cyk6CisgICAgICAgICAgICAgICAgICAgIGlmIHByb3h5LmdldF90ZXh0KCkgYW5kIG5vdCBwb3J0LmdldF90ZXh0KCk6CisgICAgICAgICAgICAgICAgICAgICAgICBsYmwgPSAiPGI+RW50ZXIgYWxsIHBvcnQgbnVtYmVyczwvYj4iCisgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSAiUHJveHkgc2VydmVycyByZXF1aXJlIGEgcG9ydCBudW1iZXIuIFBsZWFzZSBtYWtlIHN1cmUgeW91IGhhdmUgZW50ZXJlZCBhIHBvcnQgbnVtYmVyIGZvciBlYWNoIHByb3h5IHNlcnZlci4iCisgICAgICAgICAgICAgICAgICAgICAgICBkaWFsb2cgPSBDcnVtYnNNZXNzYWdlRGlhbG9nKHNlbGYsIGxibCwgZ3RrLk1FU1NBR0VfV0FSTklORywgbXNnKQorICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uID0gZGlhbG9nLmFkZF9idXR0b24oIkNsb3NlIiwgZ3RrLlJFU1BPTlNFX09LKQorICAgICAgICAgICAgICAgICAgICAgICAgSG9iQnV0dG9uLnN0eWxlX2J1dHRvbihidXR0b24pCisgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IGRpYWxvZy5ydW4oKQorICAgICAgICAgICAgICAgICAgICAgICAgZGlhbG9nLmRlc3Ryb3koKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lbWl0X3N0b3BfYnlfbmFtZSgicmVzcG9uc2UiKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLmRsZGlyID0gc2VsZi5kbGRpcl90ZXh0LmdldF90ZXh0KCkKKyAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLnNzdGF0ZWRpciA9IHNlbGYuc3N0YXRlZGlyX3RleHQuZ2V0X3RleHQoKQorICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uc3N0YXRlbWlycm9yID0gIiIKKyAgICAgICAgZm9yIG1pcnJvciBpbiBzZWxmLnNzdGF0ZW1pcnJvcnNfbGlzdDoKKyAgICAgICAgICAgIGlmIG1pcnJvclsxXSAhPSAiIiBhbmQgbWlycm9yWzJdLnN0YXJ0c3dpdGgoImZpbGU6Ly8iKToKKyAgICAgICAgICAgICAgICBzbWlycm9yID0gbWlycm9yWzJdICsgIiAiICsgbWlycm9yWzFdICsgIiBcXG4gIgorICAgICAgICAgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi5zc3RhdGVtaXJyb3IgKz0gc21pcnJvcgorICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uYmJ0aHJlYWQgPSBzZWxmLmJiX3NwaW5uZXIuZ2V0X3ZhbHVlX2FzX2ludCgpCisgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi5wbWFrZSA9IHNlbGYucG1ha2Vfc3Bpbm5lci5nZXRfdmFsdWVfYXNfaW50KCkKKyAgICAgICAgc2VsZi5zYXZlX3Byb3h5X2RhdGEoKQorICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uZXh0cmFfc2V0dGluZyA9IHt9CisgICAgICAgIGl0ID0gc2VsZi5zZXR0aW5nX3N0b3JlLmdldF9pdGVyX2ZpcnN0KCkKKyAgICAgICAgd2hpbGUgaXQ6CisgICAgICAgICAgICBrZXkgPSBzZWxmLnNldHRpbmdfc3RvcmUuZ2V0X3ZhbHVlKGl0LCAwKQorICAgICAgICAgICAgdmFsdWUgPSBzZWxmLnNldHRpbmdfc3RvcmUuZ2V0X3ZhbHVlKGl0LCAxKQorICAgICAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLmV4dHJhX3NldHRpbmdba2V5XSA9IHZhbHVlCisgICAgICAgICAgICBpdCA9IHNlbGYuc2V0dGluZ19zdG9yZS5pdGVyX25leHQoaXQpCisKKyAgICAgICAgbWQ1ID0gc2VsZi5jb25maWdfbWQ1KCkKKyAgICAgICAgc2VsZi5zZXR0aW5nc19jaGFuZ2VkID0gKHNlbGYubWQ1ICE9IG1kNSkKKyAgICAgICAgc2VsZi5wcm94eV9zZXR0aW5nc19jaGFuZ2VkID0gKHNlbGYucHJveHlfbWQ1ICE9IHNlbGYuY29uZmlnX3Byb3h5X21kNSgpKQorCisgICAgZGVmIGNyZWF0ZV9idWlsZF9lbnZpcm9ubWVudF9wYWdlKHNlbGYpOgorICAgICAgICBhZHZhbmNlZF92Ym94ID0gZ3RrLlZCb3goRmFsc2UsIDYpCisgICAgICAgIGFkdmFuY2VkX3Zib3guc2V0X2JvcmRlcl93aWR0aCg2KQorCisgICAgICAgIGFkdmFuY2VkX3Zib3gucGFja19zdGFydChzZWxmLmdlbl9sYWJlbF93aWRnZXQoJzxzcGFuIHdlaWdodD0iYm9sZCI+UGFyYWxsZWwgdGhyZWFkczwvc3Bhbj4nKSwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICBzdWJfdmJveCA9IGd0ay5WQm94KEZhbHNlLCA2KQorICAgICAgICBhZHZhbmNlZF92Ym94LnBhY2tfc3RhcnQoc3ViX3Zib3gsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgbGFiZWwgPSBzZWxmLmdlbl9sYWJlbF93aWRnZXQoIkJpdEJha2UgcGFyYWxsZWwgdGhyZWFkcyIpCisgICAgICAgIHRvb2x0aXAgPSAiU2V0cyB0aGUgbnVtYmVyIG9mIHRocmVhZHMgdGhhdCBCaXRCYWtlIHRhc2tzIGNhbiBzaW11bHRhbmVvdXNseSBydW4uIFNlZSB0aGUgPGEgaHJlZj1cIiIKKyAgICAgICAgdG9vbHRpcCArPSAiaHR0cDovL3d3dy55b2N0b3Byb2plY3Qub3JnL2RvY3MvY3VycmVudC9wb2t5LXJlZi1tYW51YWwvIgorICAgICAgICB0b29sdGlwICs9ICJwb2t5LXJlZi1tYW51YWwuaHRtbCN2YXItQkJfTlVNQkVSX1RIUkVBRFNcIj5Qb2t5IHJlZmVyZW5jZSBtYW51YWw8L2E+IGZvciBpbmZvcm1hdGlvbiIKKyAgICAgICAgYmJ0aHJlYWRfd2lkZ2V0LCBzZWxmLmJiX3NwaW5uZXIgPSBzZWxmLmdlbl9zcGlubmVyX3dpZGdldChzZWxmLmNvbmZpZ3VyYXRpb24uYmJ0aHJlYWQsIDEsIHNlbGYubWF4X3RocmVhZHMsIjxiPkJpdEJha2UgcHJhbGxhbGVsIHRocmVhZHM8L2I+IiArICIqIiArIHRvb2x0aXApCisgICAgICAgIHN1Yl92Ym94LnBhY2tfc3RhcnQobGFiZWwsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgc3ViX3Zib3gucGFja19zdGFydChiYnRocmVhZF93aWRnZXQsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKworICAgICAgICBzdWJfdmJveCA9IGd0ay5WQm94KEZhbHNlLCA2KQorICAgICAgICBhZHZhbmNlZF92Ym94LnBhY2tfc3RhcnQoc3ViX3Zib3gsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgbGFiZWwgPSBzZWxmLmdlbl9sYWJlbF93aWRnZXQoIk1ha2UgcGFyYWxsZWwgdGhyZWFkcyIpCisgICAgICAgIHRvb2x0aXAgPSAiU2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgdGhyZWFkcyB0aGUgaG9zdCBjYW4gdXNlIGR1cmluZyB0aGUgYnVpbGQuIFNlZSB0aGUgPGEgaHJlZj1cIiIKKyAgICAgICAgdG9vbHRpcCArPSAiaHR0cDovL3d3dy55b2N0b3Byb2plY3Qub3JnL2RvY3MvY3VycmVudC9wb2t5LXJlZi1tYW51YWwvIgorICAgICAgICB0b29sdGlwICs9ICJwb2t5LXJlZi1tYW51YWwuaHRtbCN2YXItUEFSQUxMRUxfTUFLRVwiPlBva3kgcmVmZXJlbmNlIG1hbnVhbDwvYT4gZm9yIGluZm9ybWF0aW9uIgorICAgICAgICBwbWFrZV93aWRnZXQsIHNlbGYucG1ha2Vfc3Bpbm5lciA9IHNlbGYuZ2VuX3NwaW5uZXJfd2lkZ2V0KHNlbGYuY29uZmlndXJhdGlvbi5wbWFrZSwgMSwgc2VsZi5tYXhfdGhyZWFkcywiPGI+TWFrZSBwYXJhbGxlbCB0aHJlYWRzPC9iPiIgKyAiKiIgKyB0b29sdGlwKQorICAgICAgICBzdWJfdmJveC5wYWNrX3N0YXJ0KGxhYmVsLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIHN1Yl92Ym94LnBhY2tfc3RhcnQocG1ha2Vfd2lkZ2V0LCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgYWR2YW5jZWRfdmJveC5wYWNrX3N0YXJ0KHNlbGYuZ2VuX2xhYmVsX3dpZGdldCgnPHNwYW4gd2VpZ2h0PSJib2xkIj5Eb3dubG9hZGVkIHNvdXJjZSBjb2RlPC9zcGFuPicpLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIHN1Yl92Ym94ID0gZ3RrLlZCb3goRmFsc2UsIDYpCisgICAgICAgIGFkdmFuY2VkX3Zib3gucGFja19zdGFydChzdWJfdmJveCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICBsYWJlbCA9IHNlbGYuZ2VuX2xhYmVsX3dpZGdldCgiRG93bmxvYWRzIGRpcmVjdG9yeSIpCisgICAgICAgIHRvb2x0aXAgPSAiU2VsZWN0IGEgZm9sZGVyIHRoYXQgY2FjaGVzIHRoZSB1cHN0cmVhbSBwcm9qZWN0IHNvdXJjZSBjb2RlIgorICAgICAgICBkbGRpcl93aWRnZXQsIHNlbGYuZGxkaXJfdGV4dCA9IHNlbGYuZ2VuX2VudHJ5X3dpZGdldChzZWxmLmNvbmZpZ3VyYXRpb24uZGxkaXIsIHNlbGYsIjxiPkRvd25sb2FkZWQgc291cmNlIGNvZGU8L2I+IiArICIqIiArIHRvb2x0aXApCisgICAgICAgIHN1Yl92Ym94LnBhY2tfc3RhcnQobGFiZWwsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgc3ViX3Zib3gucGFja19zdGFydChkbGRpcl93aWRnZXQsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKworICAgICAgICByZXR1cm4gYWR2YW5jZWRfdmJveAorCisgICAgZGVmIGNyZWF0ZV9zaGFyZWRfc3RhdGVfcGFnZShzZWxmKToKKyAgICAgICAgYWR2YW5jZWRfdmJveCA9IGd0ay5WQm94KEZhbHNlKQorICAgICAgICBhZHZhbmNlZF92Ym94LnNldF9ib3JkZXJfd2lkdGgoMTIpCisKKyAgICAgICAgc3ViX3Zib3ggPSBndGsuVkJveChGYWxzZSkKKyAgICAgICAgYWR2YW5jZWRfdmJveC5wYWNrX3N0YXJ0KHN1Yl92Ym94LCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UsIHBhZGRpbmc9MjQpCisgICAgICAgIGNvbnRlbnQgPSAiPHNwYW4+U2hhcmVkIHN0YXRlIGRpcmVjdG9yeTwvc3Bhbj4iCisgICAgICAgIHRvb2x0aXAgPSAiU2VsZWN0IGEgZm9sZGVyIHRoYXQgY2FjaGVzIHlvdXIgcHJlYnVpbHQgcmVzdWx0cyIKKyAgICAgICAgbGFiZWwgPSBzZWxmLmdlbl9sYWJlbF9pbmZvX3dpZGdldChjb250ZW50LCI8Yj5TaGFyZWQgc3RhdGUgZGlyZWN0b3J5PC9iPiIgKyAiKiIgKyB0b29sdGlwKQorICAgICAgICBzc3RhdGVkaXJfd2lkZ2V0LCBzZWxmLnNzdGF0ZWRpcl90ZXh0ID0gc2VsZi5nZW5fZW50cnlfd2lkZ2V0KHNlbGYuY29uZmlndXJhdGlvbi5zc3RhdGVkaXIsIHNlbGYpCisgICAgICAgIHN1Yl92Ym94LnBhY2tfc3RhcnQobGFiZWwsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgc3ViX3Zib3gucGFja19zdGFydChzc3RhdGVkaXJfd2lkZ2V0LCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UsIHBhZGRpbmc9NikKKworICAgICAgICBjb250ZW50ID0gIjxzcGFuIHdlaWdodD1cImJvbGRcIj5TaGFyZWQgc3RhdGUgbWlycm9yczwvc3Bhbj4iCisgICAgICAgIHRvb2x0aXAgPSAiVVJMcyBwb2ludGluZyB0byBwcmUtYnVpbHQgbWlycm9ycyB0aGF0IHdpbGwgc3BlZWQgeW91ciBidWlsZC4gIgorICAgICAgICB0b29sdGlwICs9ICJTZWxlY3QgdGhlIFwnU3RhbmRhcmRcJyBjb25maWd1cmF0aW9uIGlmIHRoZSBzdHJ1Y3R1cmUgb2YgeW91ciAiCisgICAgICAgIHRvb2x0aXAgKz0gIm1pcnJvciByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgeW91ciBsb2NhbCBzaGFyZWQgc3RhdGUgZGlyZWN0b3J5LiAiCisgICAgICAgIHRvb2x0aXAgKz0gIkZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHNoYXJlZCBzdGF0ZSBtaXJyb3JzLCBjaGVjayB0aGUgPGEgaHJlZj1cIiIKKyAgICAgICAgdG9vbHRpcCArPSAiaHR0cDovL3d3dy55b2N0b3Byb2plY3Qub3JnL2RvY3MvY3VycmVudC9wb2t5LXJlZi1tYW51YWwvIgorICAgICAgICB0b29sdGlwICs9ICJwb2t5LXJlZi1tYW51YWwuaHRtbCNzaGFyZWQtc3RhdGVcIj5Zb2N0byBQcm9qZWN0IFJlZmVyZW5jZSBNYW51YWw8L2E+LiIKKyAgICAgICAgdGFibGUgPSBzZWxmLmdlbl9sYWJlbF9pbmZvX3dpZGdldChjb250ZW50LCI8Yj5TaGFyZWQgc3RhdGUgbWlycm9yczwvYj4iICsgIioiICsgdG9vbHRpcCkKKyAgICAgICAgYWR2YW5jZWRfdmJveC5wYWNrX3N0YXJ0KHRhYmxlLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UsIHBhZGRpbmc9NikKKworICAgICAgICBzdWJfdmJveCA9IGd0ay5WQm94KEZhbHNlKQorICAgICAgICBhZHZhbmNlZF92Ym94LnBhY2tfc3RhcnQoc3ViX3Zib3gsIGd0ay5UUlVFLCBndGsuVFJVRSwgMCkKKworICAgICAgICBpZiBzZWxmLnNzdGF0ZW1pcnJvcnNfY2hhbmdlZCA9PSAwOgorICAgICAgICAgICAgc2VsZi5zc3RhdGVtaXJyb3JzX2NoYW5nZWQgPSAxCisgICAgICAgICAgICBzc3RhdGVtaXJyb3JzID0gc2VsZi5jb25maWd1cmF0aW9uLnNzdGF0ZW1pcnJvcgorICAgICAgICAgICAgaWYgc3N0YXRlbWlycm9ycyA9PSAiIjoKKyAgICAgICAgICAgICAgICBzbV9saXN0ID0gWyJTdGFuZGFyZCIsICIiLCAiZmlsZTovLyguKikiXQorICAgICAgICAgICAgICAgIHNlbGYuc3N0YXRlbWlycm9yc19saXN0LmFwcGVuZChzbV9saXN0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzc3RhdGVtaXJyb3JzID0gW3ggZm9yIHggaW4gc3N0YXRlbWlycm9ycy5zcGxpdCgnXFxuJyldCisgICAgICAgICAgICAgICAgZm9yIHNzdGF0ZW1pcnJvciBpbiBzc3RhdGVtaXJyb3JzOgorICAgICAgICAgICAgICAgICAgICBzc3RhdGVtaXJyb3JfZmllbGRzID0gW3ggZm9yIHggaW4gc3N0YXRlbWlycm9yLnNwbGl0KCcgJykgaWYgeC5zdHJpcCgpXQorICAgICAgICAgICAgICAgICAgICBpZiBsZW4oc3N0YXRlbWlycm9yX2ZpZWxkcykgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNzdGF0ZW1pcnJvcl9maWVsZHNbMF0gPT0gImZpbGU6Ly8oLiopIiBvciBzc3RhdGVtaXJyb3JfZmllbGRzWzBdID09ICJmaWxlOi8vLioiOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtX2xpc3QgPSBbIlN0YW5kYXJkIiwgc3N0YXRlbWlycm9yX2ZpZWxkc1sxXSwgc3N0YXRlbWlycm9yX2ZpZWxkc1swXV0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21fbGlzdCA9IFsiQ3VzdG9tIiwgc3N0YXRlbWlycm9yX2ZpZWxkc1sxXSwgc3N0YXRlbWlycm9yX2ZpZWxkc1swXV0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3N0YXRlbWlycm9yc19saXN0LmFwcGVuZChzbV9saXN0KQorCisgICAgICAgIHNzdGF0ZW1pcnJvcnNfd2lkZ2V0LCBzc3RhdGVtaXJyb3JzX3N0b3JlID0gc2VsZi5nZW5fc2hhcmVkX3NzdGF0ZV93aWRnZXQoc2VsZi5zc3RhdGVtaXJyb3JzX2xpc3QsIHNlbGYpCisgICAgICAgIHN1Yl92Ym94LnBhY2tfc3RhcnQoc3N0YXRlbWlycm9yc193aWRnZXQsIGV4cGFuZD1UcnVlLCBmaWxsPVRydWUpCisKKyAgICAgICAgdGFibGUgPSBndGsuVGFibGUoMSwgMTAsIEZhbHNlKQorICAgICAgICB0YWJsZS5zZXRfY29sX3NwYWNpbmdzKDYpCisgICAgICAgIGFkZF9taXJyb3JfYnV0dG9uID0gSG9iQWx0QnV0dG9uKCJBZGQgbWlycm9yIikKKyAgICAgICAgYWRkX21pcnJvcl9idXR0b24uY29ubmVjdCgiY2xpY2tlZCIsIHNlbGYuYWRkX21pcnJvcikKKyAgICAgICAgYWRkX21pcnJvcl9idXR0b24uc2V0X3NpemVfcmVxdWVzdCgxMjAsMzApCisgICAgICAgIHRhYmxlLmF0dGFjaChhZGRfbWlycm9yX2J1dHRvbiwgMSwgMiwgMCwgMSwgeG9wdGlvbnM9Z3RrLlNIUklOSykKKworICAgICAgICBzZWxmLmRlbGV0ZV9idXR0b24gPSBIb2JBbHRCdXR0b24oIkRlbGV0ZSBtaXJyb3IiKQorICAgICAgICBzZWxmLmRlbGV0ZV9idXR0b24uY29ubmVjdCgiY2xpY2tlZCIsIHNlbGYuZGVsZXRlX2NiKQorICAgICAgICBzZWxmLmRlbGV0ZV9idXR0b24uc2V0X3NpemVfcmVxdWVzdCgxMjAsIDMwKQorICAgICAgICB0YWJsZS5hdHRhY2goc2VsZi5kZWxldGVfYnV0dG9uLCAzLCA0LCAwLCAxLCB4b3B0aW9ucz1ndGsuU0hSSU5LKQorCisgICAgICAgIGFkdmFuY2VkX3Zib3gucGFja19zdGFydCh0YWJsZSwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlLCBwYWRkaW5nPTYpCisKKyAgICAgICAgcmV0dXJuIGFkdmFuY2VkX3Zib3gKKworICAgIGRlZiBnZW5fc2hhcmVkX3NzdGF0ZV93aWRnZXQoc2VsZiwgc3N0YXRlbWlycm9yc19saXN0LCB3aW5kb3cpOgorICAgICAgICBoYm94ID0gZ3RrLkhCb3goRmFsc2UpCisKKyAgICAgICAgc3N0YXRlbWlycm9yc19zdG9yZSA9IGd0ay5MaXN0U3RvcmUoc3RyLCBzdHIsIHN0cikKKyAgICAgICAgZm9yIHNzdGF0ZW1pcnJvciBpbiBzc3RhdGVtaXJyb3JzX2xpc3Q6CisgICAgICAgICAgICBzc3RhdGVtaXJyb3JzX3N0b3JlLmFwcGVuZChzc3RhdGVtaXJyb3IpCisKKyAgICAgICAgc2VsZi5zc3RhdGVtaXJyb3JzX3R2ID0gZ3RrLlRyZWVWaWV3KCkKKyAgICAgICAgc2VsZi5zc3RhdGVtaXJyb3JzX3R2LnNldF9ydWxlc19oaW50KFRydWUpCisgICAgICAgIHNlbGYuc3N0YXRlbWlycm9yc190di5zZXRfaGVhZGVyc192aXNpYmxlKFRydWUpCisgICAgICAgIHRyZWVfc2VsZWN0aW9uID0gc2VsZi5zc3RhdGVtaXJyb3JzX3R2LmdldF9zZWxlY3Rpb24oKQorICAgICAgICB0cmVlX3NlbGVjdGlvbi5zZXRfbW9kZShndGsuU0VMRUNUSU9OX1NJTkdMRSkKKworICAgICAgICAjIEFsbG93IGVuYWJsZSBkcmFnIGFuZCBkcm9wIG9mIHJvd3MgaW5jbHVkaW5nIHJvdyBtb3ZlCisgICAgICAgIHNlbGYuc3N0YXRlbWlycm9yc190di5lbmFibGVfbW9kZWxfZHJhZ19zb3VyY2UoIGd0ay5nZGsuQlVUVE9OMV9NQVNLLAorICAgICAgICAgICAgc2VsZi5UQVJHRVRTLAorICAgICAgICAgICAgZ3RrLmdkay5BQ1RJT05fREVGQVVMVHwKKyAgICAgICAgICAgIGd0ay5nZGsuQUNUSU9OX01PVkUpCisgICAgICAgIHNlbGYuc3N0YXRlbWlycm9yc190di5lbmFibGVfbW9kZWxfZHJhZ19kZXN0KHNlbGYuVEFSR0VUUywKKyAgICAgICAgICAgIGd0ay5nZGsuQUNUSU9OX0RFRkFVTFQpCisgICAgICAgIHNlbGYuc3N0YXRlbWlycm9yc190di5jb25uZWN0KCJkcmFnX2RhdGFfZ2V0Iiwgc2VsZi5kcmFnX2RhdGFfZ2V0X2NiKQorICAgICAgICBzZWxmLnNzdGF0ZW1pcnJvcnNfdHYuY29ubmVjdCgiZHJhZ19kYXRhX3JlY2VpdmVkIiwgc2VsZi5kcmFnX2RhdGFfcmVjZWl2ZWRfY2IpCisKKworICAgICAgICBzZWxmLnNjcm9sbCA9IGd0ay5TY3JvbGxlZFdpbmRvdygpCisgICAgICAgIHNlbGYuc2Nyb2xsLnNldF9wb2xpY3koZ3RrLlBPTElDWV9ORVZFUiwgZ3RrLlBPTElDWV9BVVRPTUFUSUMpCisgICAgICAgIHNlbGYuc2Nyb2xsLnNldF9zaGFkb3dfdHlwZShndGsuU0hBRE9XX0lOKQorICAgICAgICBzZWxmLnNjcm9sbC5jb25uZWN0KCdzaXplLWFsbG9jYXRlJywgc2VsZi5zY3JvbGxfY2hhbmdlZCkKKyAgICAgICAgc2VsZi5zY3JvbGwuYWRkKHNlbGYuc3N0YXRlbWlycm9yc190dikKKworICAgICAgICAjbGlzdCBzdG9yZSBmb3IgY2VsbCByZW5kZXJlcgorICAgICAgICBtID0gZ3RrLkxpc3RTdG9yZShnb2JqZWN0LlRZUEVfU1RSSU5HKQorICAgICAgICBtLmFwcGVuZChbIlN0YW5kYXJkIl0pCisgICAgICAgIG0uYXBwZW5kKFsiQ3VzdG9tIl0pCisKKyAgICAgICAgY2VsbDAgPSBndGsuQ2VsbFJlbmRlcmVyQ29tYm8oKQorICAgICAgICBjZWxsMC5zZXRfcHJvcGVydHkoIm1vZGVsIixtKQorICAgICAgICBjZWxsMC5zZXRfcHJvcGVydHkoInRleHQtY29sdW1uIiwgMCkKKyAgICAgICAgY2VsbDAuc2V0X3Byb3BlcnR5KCJlZGl0YWJsZSIsIFRydWUpCisgICAgICAgIGNlbGwwLnNldF9wcm9wZXJ0eSgiaGFzLWVudHJ5IiwgRmFsc2UpCisgICAgICAgIGNvbDAgPSBndGsuVHJlZVZpZXdDb2x1bW4oIkNvbmZpZ3VyYXRpb24iKQorICAgICAgICBjb2wwLnBhY2tfc3RhcnQoY2VsbDAsIEZhbHNlKQorICAgICAgICBjb2wwLmFkZF9hdHRyaWJ1dGUoY2VsbDAsICJ0ZXh0IiwgMCkKKyAgICAgICAgY29sMC5zZXRfY2VsbF9kYXRhX2Z1bmMoY2VsbDAsIHNlbGYuY29uZmlndXJhdGlvbl9maWVsZCkKKyAgICAgICAgc2VsZi5zc3RhdGVtaXJyb3JzX3R2LmFwcGVuZF9jb2x1bW4oY29sMCkKKworICAgICAgICBjZWxsMC5jb25uZWN0KCJlZGl0ZWQiLCBzZWxmLmNvbWJvX2NoYW5nZWQsIHNzdGF0ZW1pcnJvcnNfc3RvcmUpCisKKyAgICAgICAgc2VsZi5jZWxsMSA9IGd0ay5DZWxsUmVuZGVyZXJUZXh0KCkKKyAgICAgICAgc2VsZi5jZWxsMS5zZXRfcGFkZGluZyg1LDIpCisgICAgICAgIGNvbDEgPSBndGsuVHJlZVZpZXdDb2x1bW4oJ1JlZ2V4Jywgc2VsZi5jZWxsMSkKKyAgICAgICAgY29sMS5zZXRfY2VsbF9kYXRhX2Z1bmMoc2VsZi5jZWxsMSwgc2VsZi5yZWdleF9maWVsZCkKKyAgICAgICAgc2VsZi5zc3RhdGVtaXJyb3JzX3R2LmFwcGVuZF9jb2x1bW4oY29sMSkKKworICAgICAgICBzZWxmLmNlbGwxLmNvbm5lY3QoImVkaXRlZCIsIHNlbGYucmVnZXhfY2hhbmdlZCwgc3N0YXRlbWlycm9yc19zdG9yZSkKKworICAgICAgICBjZWxsMiA9IGd0ay5DZWxsUmVuZGVyZXJUZXh0KCkKKyAgICAgICAgY2VsbDIuc2V0X3BhZGRpbmcoNSwyKQorICAgICAgICBjZWxsMi5zZXRfcHJvcGVydHkoImVkaXRhYmxlIiwgVHJ1ZSkKKyAgICAgICAgY29sMiA9IGd0ay5UcmVlVmlld0NvbHVtbignVVJMJywgY2VsbDIpCisgICAgICAgIGNvbDIuc2V0X2NlbGxfZGF0YV9mdW5jKGNlbGwyLCBzZWxmLnVybF9maWVsZCkKKyAgICAgICAgc2VsZi5zc3RhdGVtaXJyb3JzX3R2LmFwcGVuZF9jb2x1bW4oY29sMikKKworICAgICAgICBjZWxsMi5jb25uZWN0KCJlZGl0ZWQiLCBzZWxmLnVybF9jaGFuZ2VkLCBzc3RhdGVtaXJyb3JzX3N0b3JlKQorCisgICAgICAgIHNlbGYuc3N0YXRlbWlycm9yc190di5zZXRfbW9kZWwoc3N0YXRlbWlycm9yc19zdG9yZSkKKyAgICAgICAgc2VsZi5zc3RhdGVtaXJyb3JzX3R2LnNldF9jdXJzb3Ioc2VsZi5zZWxlY3RlZF9taXJyb3Jfcm93KQorICAgICAgICBoYm94LnBhY2tfc3RhcnQoc2VsZi5zY3JvbGwsIGV4cGFuZD1UcnVlLCBmaWxsPVRydWUpCisgICAgICAgIGhib3guc2hvd19hbGwoKQorCisgICAgICAgIHJldHVybiBoYm94LCBzc3RhdGVtaXJyb3JzX3N0b3JlCisKKyAgICBkZWYgZHJhZ19kYXRhX2dldF9jYihzZWxmLCB0cmVldmlldywgY29udGV4dCwgc2VsZWN0aW9uLCB0YXJnZXRfaWQsIGV0aW1lKToKKyAgICAgICAgdHJlZXNlbGVjdGlvbiA9IHRyZWV2aWV3LmdldF9zZWxlY3Rpb24oKQorICAgICAgICBtb2RlbCwgaXRlciA9IHRyZWVzZWxlY3Rpb24uZ2V0X3NlbGVjdGVkKCkKKyAgICAgICAgZGF0YSA9IG1vZGVsLmdldF9zdHJpbmdfZnJvbV9pdGVyKGl0ZXIpCisgICAgICAgIHNlbGVjdGlvbi5zZXQoc2VsZWN0aW9uLnRhcmdldCwgOCwgZGF0YSkKKworICAgIGRlZiBkcmFnX2RhdGFfcmVjZWl2ZWRfY2Ioc2VsZiwgdHJlZXZpZXcsIGNvbnRleHQsIHgsIHksIHNlbGVjdGlvbiwgaW5mbywgZXRpbWUpOgorICAgICAgICBtb2RlbCA9IHRyZWV2aWV3LmdldF9tb2RlbCgpCisgICAgICAgIGRhdGEgPSBbXQorICAgICAgICB0cmVlX2l0ZXIgPSBtb2RlbC5nZXRfaXRlcl9mcm9tX3N0cmluZyhzZWxlY3Rpb24uZGF0YSkKKyAgICAgICAgZGF0YS5hcHBlbmQobW9kZWwuZ2V0X3ZhbHVlKHRyZWVfaXRlciwgMCkpCisgICAgICAgIGRhdGEuYXBwZW5kKG1vZGVsLmdldF92YWx1ZSh0cmVlX2l0ZXIsIDEpKQorICAgICAgICBkYXRhLmFwcGVuZChtb2RlbC5nZXRfdmFsdWUodHJlZV9pdGVyLCAyKSkKKworICAgICAgICBkcm9wX2luZm8gPSB0cmVldmlldy5nZXRfZGVzdF9yb3dfYXRfcG9zKHgsIHkpCisgICAgICAgIGlmIGRyb3BfaW5mbzoKKyAgICAgICAgICAgIHBhdGgsIHBvc2l0aW9uID0gZHJvcF9pbmZvCisgICAgICAgICAgICBpdGVyID0gbW9kZWwuZ2V0X2l0ZXIocGF0aCkKKyAgICAgICAgICAgIGlmIChwb3NpdGlvbiA9PSBndGsuVFJFRV9WSUVXX0RST1BfQkVGT1JFIG9yIHBvc2l0aW9uID09IGd0ay5UUkVFX1ZJRVdfRFJPUF9JTlRPX09SX0JFRk9SRSk6CisgICAgICAgICAgICAgICAgbW9kZWwuaW5zZXJ0X2JlZm9yZShpdGVyLCBkYXRhKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBtb2RlbC5pbnNlcnRfYWZ0ZXIoaXRlciwgZGF0YSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1vZGVsLmFwcGVuZChkYXRhKQorICAgICAgICBpZiBjb250ZXh0LmFjdGlvbiA9PSBndGsuZ2RrLkFDVElPTl9NT1ZFOgorICAgICAgICAgICAgY29udGV4dC5maW5pc2goVHJ1ZSwgVHJ1ZSwgZXRpbWUpCisgICAgICAgIHJldHVybgorCisgICAgZGVmIGRlbGV0ZV9jYihzZWxmLCBidXR0b24pOgorICAgICAgICBzZWxlY3Rpb24gPSBzZWxmLnNzdGF0ZW1pcnJvcnNfdHYuZ2V0X3NlbGVjdGlvbigpCisgICAgICAgIHRyZWVfbW9kZWwsIHRyZWVfaXRlciA9IHNlbGVjdGlvbi5nZXRfc2VsZWN0ZWQoKQorICAgICAgICBpbmRleCA9IGludCh0cmVlX21vZGVsLmdldF9zdHJpbmdfZnJvbV9pdGVyKHRyZWVfaXRlcikpCisgICAgICAgIGlmIGluZGV4ID09IDA6CisgICAgICAgICAgICBzZWxmLnNlbGVjdGVkX21pcnJvcl9yb3cgPSBpbmRleAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zZWxlY3RlZF9taXJyb3Jfcm93ID0gaW5kZXggLSAxCisgICAgICAgIHNlbGYuc3N0YXRlbWlycm9yc19saXN0LnBvcChpbmRleCkKKyAgICAgICAgc2VsZi5yZWZyZXNoX3NoYXJlZF9zdGF0ZV9wYWdlKCkKKyAgICAgICAgaWYgbm90IHNlbGYuc3N0YXRlbWlycm9yc19saXN0OgorICAgICAgICAgICAgc2VsZi5kZWxldGVfYnV0dG9uLnNldF9zZW5zaXRpdmUoRmFsc2UpCisKKyAgICBkZWYgYWRkX21pcnJvcihzZWxmLCBidXR0b24pOgorICAgICAgICBzZWxmLm5ld19taXJyb3IgPSBUcnVlCisgICAgICAgIHRvb2x0aXAgPSAiU2VsZWN0IHRoZSBwcmUtYnVpbHQgbWlycm9yIHRoYXQgd2lsbCBzcGVlZCB5b3VyIGJ1aWxkIgorICAgICAgICBpbmRleCA9IGxlbihzZWxmLnNzdGF0ZW1pcnJvcnNfbGlzdCkKKyAgICAgICAgc2VsZi5zZWxlY3RlZF9taXJyb3Jfcm93ID0gaW5kZXgKKyAgICAgICAgc21fbGlzdCA9IFsiU3RhbmRhcmQiLCAiIiwgImZpbGU6Ly8oLiopIl0KKyAgICAgICAgc2VsZi5zc3RhdGVtaXJyb3JzX2xpc3QuYXBwZW5kKHNtX2xpc3QpCisgICAgICAgIHNlbGYucmVmcmVzaF9zaGFyZWRfc3RhdGVfcGFnZSgpCisKKyAgICBkZWYgc2Nyb2xsX2NoYW5nZWQoc2VsZiwgd2lkZ2V0LCBldmVudCwgZGF0YT1Ob25lKToKKyAgICAgICAgaWYgc2VsZi5uZXdfbWlycm9yID09IFRydWU6CisgICAgICAgICAgICBhZGogPSB3aWRnZXQuZ2V0X3ZhZGp1c3RtZW50KCkKKyAgICAgICAgICAgIGFkai5zZXRfdmFsdWUoYWRqLnVwcGVyIC0gYWRqLnBhZ2Vfc2l6ZSkKKyAgICAgICAgICAgIHNlbGYubmV3X21pcnJvciA9IEZhbHNlCisKKyAgICBkZWYgY29tYm9fY2hhbmdlZChzZWxmLCB3aWRnZXQsIHBhdGgsIHRleHQsIG1vZGVsKToKKyAgICAgICAgbW9kZWxbcGF0aF1bMF0gPSB0ZXh0CisgICAgICAgIHNlbGVjdGlvbiA9IHNlbGYuc3N0YXRlbWlycm9yc190di5nZXRfc2VsZWN0aW9uKCkKKyAgICAgICAgdHJlZV9tb2RlbCwgdHJlZV9pdGVyID0gc2VsZWN0aW9uLmdldF9zZWxlY3RlZCgpCisgICAgICAgIGluZGV4ID0gaW50KHRyZWVfbW9kZWwuZ2V0X3N0cmluZ19mcm9tX2l0ZXIodHJlZV9pdGVyKSkKKyAgICAgICAgc2VsZi5zc3RhdGVtaXJyb3JzX2xpc3RbaW5kZXhdWzBdID0gdGV4dAorCisgICAgZGVmIHJlZ2V4X2NoYW5nZWQoc2VsZiwgY2VsbCwgcGF0aCwgbmV3X3RleHQsIHVzZXJfZGF0YSk6CisgICAgICAgIHVzZXJfZGF0YVtwYXRoXVsyXSA9IG5ld190ZXh0CisgICAgICAgIHNlbGVjdGlvbiA9IHNlbGYuc3N0YXRlbWlycm9yc190di5nZXRfc2VsZWN0aW9uKCkKKyAgICAgICAgdHJlZV9tb2RlbCwgdHJlZV9pdGVyID0gc2VsZWN0aW9uLmdldF9zZWxlY3RlZCgpCisgICAgICAgIGluZGV4ID0gaW50KHRyZWVfbW9kZWwuZ2V0X3N0cmluZ19mcm9tX2l0ZXIodHJlZV9pdGVyKSkKKyAgICAgICAgc2VsZi5zc3RhdGVtaXJyb3JzX2xpc3RbaW5kZXhdWzJdID0gbmV3X3RleHQKKyAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgdXJsX2NoYW5nZWQoc2VsZiwgY2VsbCwgcGF0aCwgbmV3X3RleHQsIHVzZXJfZGF0YSk6CisgICAgICAgIGlmIG5ld190ZXh0IT0iRW50ZXIgdGhlIG1pcnJvciBVUkwiIGFuZCBuZXdfdGV4dCE9Ik1hdGNoIHJlZ2V4IGFuZCByZXBsYWNlIGl0IHdpdGggdGhpcyBVUkwiOgorICAgICAgICAgICAgdXNlcl9kYXRhW3BhdGhdWzFdID0gbmV3X3RleHQKKyAgICAgICAgICAgIHNlbGVjdGlvbiA9IHNlbGYuc3N0YXRlbWlycm9yc190di5nZXRfc2VsZWN0aW9uKCkKKyAgICAgICAgICAgIHRyZWVfbW9kZWwsIHRyZWVfaXRlciA9IHNlbGVjdGlvbi5nZXRfc2VsZWN0ZWQoKQorICAgICAgICAgICAgaW5kZXggPSBpbnQodHJlZV9tb2RlbC5nZXRfc3RyaW5nX2Zyb21faXRlcih0cmVlX2l0ZXIpKQorICAgICAgICAgICAgc2VsZi5zc3RhdGVtaXJyb3JzX2xpc3RbaW5kZXhdWzFdID0gbmV3X3RleHQKKyAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgY29uZmlndXJhdGlvbl9maWVsZChzZWxmLCBjb2x1bW4sIGNlbGwsIG1vZGVsLCBpdGVyKToKKyAgICAgICAgY2VsbC5zZXRfcHJvcGVydHkoJ3RleHQnLCBtb2RlbC5nZXRfdmFsdWUoaXRlciwgMCkpCisgICAgICAgIGlmIG1vZGVsLmdldF92YWx1ZShpdGVyLCAwKSA9PSAiU3RhbmRhcmQiOgorICAgICAgICAgICAgc2VsZi5jZWxsMS5zZXRfcHJvcGVydHkoInNlbnNpdGl2ZSIsIEZhbHNlKQorICAgICAgICAgICAgc2VsZi5jZWxsMS5zZXRfcHJvcGVydHkoImVkaXRhYmxlIiwgRmFsc2UpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmNlbGwxLnNldF9wcm9wZXJ0eSgic2Vuc2l0aXZlIiwgVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuY2VsbDEuc2V0X3Byb3BlcnR5KCJlZGl0YWJsZSIsIFRydWUpCisgICAgICAgIHJldHVybgorCisgICAgZGVmIHJlZ2V4X2ZpZWxkKHNlbGYsIGNvbHVtbiwgY2VsbCwgbW9kZWwsIGl0ZXIpOgorICAgICAgICBjZWxsLnNldF9wcm9wZXJ0eSgndGV4dCcsIG1vZGVsLmdldF92YWx1ZShpdGVyLCAyKSkKKyAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgdXJsX2ZpZWxkKHNlbGYsIGNvbHVtbiwgY2VsbCwgbW9kZWwsIGl0ZXIpOgorICAgICAgICB0ZXh0ID0gbW9kZWwuZ2V0X3ZhbHVlKGl0ZXIsIDEpCisgICAgICAgIGlmIHRleHQgPT0gIiI6CisgICAgICAgICAgICBpZiBtb2RlbC5nZXRfdmFsdWUoaXRlciwgMCkgPT0gIlN0YW5kYXJkIjoKKyAgICAgICAgICAgICAgICB0ZXh0ID0gIkVudGVyIHRoZSBtaXJyb3IgVVJMIgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0ZXh0ID0gIk1hdGNoIHJlZ2V4IGFuZCByZXBsYWNlIGl0IHdpdGggdGhpcyBVUkwiCisgICAgICAgIGNlbGwuc2V0X3Byb3BlcnR5KCd0ZXh0JywgdGV4dCkKKyAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgcmVmcmVzaF9zaGFyZWRfc3RhdGVfcGFnZShzZWxmKToKKyAgICAgICAgcGFnZV9udW0gPSBzZWxmLm5iLmdldF9jdXJyZW50X3BhZ2UoKQorICAgICAgICBzZWxmLm5iLnJlbW92ZV9wYWdlKHBhZ2VfbnVtKTsKKyAgICAgICAgc2VsZi5uYi5pbnNlcnRfcGFnZShzZWxmLmNyZWF0ZV9zaGFyZWRfc3RhdGVfcGFnZSgpLCBndGsuTGFiZWwoIlNoYXJlZCBzdGF0ZSIpLHBhZ2VfbnVtKQorICAgICAgICBzZWxmLnNob3dfYWxsKCkKKyAgICAgICAgc2VsZi5uYi5zZXRfY3VycmVudF9wYWdlKHBhZ2VfbnVtKQorCisgICAgZGVmIHRlc3RfcHJveHlfZW5kZWQoc2VsZiwgcGFzc2VkKToKKyAgICAgICAgc2VsZi5wcm94eV90ZXN0X3J1bm5pbmcgPSBGYWxzZQorICAgICAgICBzZWxmLnNldF90ZXN0X3Byb3h5X3N0YXRlKHNlbGYuVEVTVF9ORVRXT1JLX1BBU1NFRCBpZiBwYXNzZWQgZWxzZSBzZWxmLlRFU1RfTkVUV09SS19GQUlMRUQpCisgICAgICAgIHNlbGYuc2V0X3NlbnNpdGl2ZShUcnVlKQorICAgICAgICBzZWxmLnJlZnJlc2hfcHJveHlfY29tcG9uZW50cygpCisKKyAgICBkZWYgdGltZXJfZnVuYyhzZWxmKToKKyAgICAgICAgc2VsZi50ZXN0X3Byb3h5X3Byb2dyZXNzLnB1bHNlKCkKKyAgICAgICAgcmV0dXJuIHNlbGYucHJveHlfdGVzdF9ydW5uaW5nCisKKyAgICBkZWYgdGVzdF9uZXR3b3JrX2J1dHRvbl9jYihzZWxmLCBiKToKKyAgICAgICAgc2VsZi5zZXRfdGVzdF9wcm94eV9zdGF0ZShzZWxmLlRFU1RfTkVUV09SS19SVU5OSU5HKQorICAgICAgICBzZWxmLnNldF9zZW5zaXRpdmUoRmFsc2UpCisgICAgICAgIHNlbGYuc2F2ZV9wcm94eV9kYXRhKCkKKyAgICAgICAgaWYgc2VsZi5jb25maWd1cmF0aW9uLmVuYWJsZV9wcm94eSA9PSBUcnVlOgorICAgICAgICAgICAgc2VsZi5oYW5kbGVyLnNldF9odHRwX3Byb3h5KHNlbGYuY29uZmlndXJhdGlvbi5jb21iaW5lX3Byb3h5KCJodHRwIikpCisgICAgICAgICAgICBzZWxmLmhhbmRsZXIuc2V0X2h0dHBzX3Byb3h5KHNlbGYuY29uZmlndXJhdGlvbi5jb21iaW5lX3Byb3h5KCJodHRwcyIpKQorICAgICAgICAgICAgc2VsZi5oYW5kbGVyLnNldF9mdHBfcHJveHkoc2VsZi5jb25maWd1cmF0aW9uLmNvbWJpbmVfcHJveHkoImZ0cCIpKQorICAgICAgICAgICAgc2VsZi5oYW5kbGVyLnNldF9zb2Nrc19wcm94eShzZWxmLmNvbmZpZ3VyYXRpb24uY29tYmluZV9wcm94eSgic29ja3MiKSkKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlci5zZXRfY3ZzX3Byb3h5KHNlbGYuY29uZmlndXJhdGlvbi5jb21iaW5lX2hvc3Rfb25seSgiY3ZzIiksIHNlbGYuY29uZmlndXJhdGlvbi5jb21iaW5lX3BvcnRfb25seSgiY3ZzIikpCisgICAgICAgIGVsaWYgc2VsZi5jb25maWd1cmF0aW9uLmVuYWJsZV9wcm94eSA9PSBGYWxzZToKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlci5zZXRfaHR0cF9wcm94eSgiIikKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlci5zZXRfaHR0cHNfcHJveHkoIiIpCisgICAgICAgICAgICBzZWxmLmhhbmRsZXIuc2V0X2Z0cF9wcm94eSgiIikKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlci5zZXRfc29ja3NfcHJveHkoIiIpCisgICAgICAgICAgICBzZWxmLmhhbmRsZXIuc2V0X2N2c19wcm94eSgiIiwgIiIpCisgICAgICAgIHNlbGYucHJveHlfdGVzdF9yYW4gPSBUcnVlCisgICAgICAgIHNlbGYucHJveHlfdGVzdF9ydW5uaW5nID0gVHJ1ZQorICAgICAgICBnb2JqZWN0LnRpbWVvdXRfYWRkKDEwMCwgc2VsZi50aW1lcl9mdW5jKQorICAgICAgICBzZWxmLmhhbmRsZXIudHJpZ2dlcl9uZXR3b3JrX3Rlc3QoKQorCisgICAgZGVmIHRlc3RfcHJveHlfZm9jdXNfZXZlbnQoc2VsZiwgdywgZGlyZWN0aW9uKToKKyAgICAgICAgaWYgc2VsZi50ZXN0X3Byb3h5X3N0YXRlIGluIFtzZWxmLlRFU1RfTkVUV09SS19QQVNTRUQsIHNlbGYuVEVTVF9ORVRXT1JLX0ZBSUxFRF06CisgICAgICAgICAgICBzZWxmLnNldF90ZXN0X3Byb3h5X3N0YXRlKHNlbGYuVEVTVF9ORVRXT1JLX0lOSVRJQUwpCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIGh0dHBfcHJveHlfY2hhbmdlZChzZWxmLCBlKToKKyAgICAgICAgaWYgbm90IHNlbGYuY29uZmlndXJhdGlvbi5zYW1lX3Byb3h5OgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIGUgPT0gc2VsZi5odHRwX3Byb3h5OgorICAgICAgICAgICAgW3cuc2V0X3RleHQoc2VsZi5odHRwX3Byb3h5LmdldF90ZXh0KCkpIGZvciB3IGluIHNlbGYuc2FtZV9wcm94eV9hZGRyZXNzZXNdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBbdy5zZXRfdGV4dChzZWxmLmh0dHBfcHJveHlfcG9ydC5nZXRfdGV4dCgpKSBmb3IgdyBpbiBzZWxmLnNhbWVfcHJveHlfcG9ydHNdCisKKyAgICBkZWYgcHJveHlfYWRkcmVzc19mb2N1c19vdXRfZXZlbnQoc2VsZiwgdywgZGlyZWN0aW9uKToKKyAgICAgICAgdGV4dCA9IHcuZ2V0X3RleHQoKQorICAgICAgICBpZiBub3QgdGV4dDoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBpZiB0ZXh0LmZpbmQoIi8vIikgPT0gLTE6CisgICAgICAgICAgICB3LnNldF90ZXh0KCJodHRwOi8vIiArIHRleHQpCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIHNldF90ZXN0X3Byb3h5X3N0YXRlKHNlbGYsIHN0YXRlKToKKyAgICAgICAgaWYgc2VsZi50ZXN0X3Byb3h5X3N0YXRlID09IHN0YXRlOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIFtzZWxmLnByb3h5X3RhYmxlLnJlbW92ZSh3KSBmb3IgdyBpbiBzZWxmLnRlc3RfZ3VpX2VsZW1lbnRzXQorICAgICAgICBpZiBzdGF0ZSA9PSBzZWxmLlRFU1RfTkVUV09SS19JTklUSUFMOgorICAgICAgICAgICAgc2VsZi5wcm94eV90YWJsZS5hdHRhY2goc2VsZi50ZXN0X25ldHdvcmtfYnV0dG9uLCAxLCAyLCA1LCA2KQorICAgICAgICAgICAgc2VsZi50ZXN0X25ldHdvcmtfYnV0dG9uLnNob3coKQorICAgICAgICBlbGlmIHN0YXRlID09IHNlbGYuVEVTVF9ORVRXT1JLX1JVTk5JTkc6CisgICAgICAgICAgICBzZWxmLnRlc3RfcHJveHlfcHJvZ3Jlc3Muc2V0X3Jjc3R5bGUoInJ1bm5pbmciKQorICAgICAgICAgICAgc2VsZi50ZXN0X3Byb3h5X3Byb2dyZXNzLnNldF90ZXh0KCJUZXN0aW5nIG5ldHdvcmsgY29uZmlndXJhdGlvbiIpCisgICAgICAgICAgICBzZWxmLnByb3h5X3RhYmxlLmF0dGFjaChzZWxmLnRlc3RfcHJveHlfcHJvZ3Jlc3MsIDAsIDUsIDUsIDYsIHhwYWRkaW5nPTQpCisgICAgICAgICAgICBzZWxmLnRlc3RfcHJveHlfcHJvZ3Jlc3Muc2hvdygpCisgICAgICAgIGVsc2U6ICMgcGFzc2VkIG9yIGZhaWxlZAorICAgICAgICAgICAgc2VsZi5kdW1teV9wcm9ncmVzcy51cGRhdGUoMS4wKQorICAgICAgICAgICAgaWYgc3RhdGUgPT0gc2VsZi5URVNUX05FVFdPUktfUEFTU0VEOgorICAgICAgICAgICAgICAgIHNlbGYuZHVtbXlfcHJvZ3Jlc3Muc2V0X3RleHQoIllvdXIgbmV0d29yayBpcyBwcm9wZXJseSBjb25maWd1cmVkIikKKyAgICAgICAgICAgICAgICBzZWxmLmR1bW15X3Byb2dyZXNzLnNldF9yY3N0eWxlKCJydW5uaW5nIikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5kdW1teV9wcm9ncmVzcy5zZXRfdGV4dCgiTmV0d29yayB0ZXN0IGZhaWxlZCIpCisgICAgICAgICAgICAgICAgc2VsZi5kdW1teV9wcm9ncmVzcy5zZXRfcmNzdHlsZSgiZmFpbCIpCisgICAgICAgICAgICBzZWxmLnByb3h5X3RhYmxlLmF0dGFjaChzZWxmLmR1bW15X3Byb2dyZXNzLCAwLCA0LCA1LCA2KQorICAgICAgICAgICAgc2VsZi5wcm94eV90YWJsZS5hdHRhY2goc2VsZi5yZXRlc3RfbmV0d29ya19idXR0b24sIDQsIDUsIDUsIDYsIHhwYWRkaW5nPTQpCisgICAgICAgICAgICBzZWxmLmR1bW15X3Byb2dyZXNzLnNob3coKQorICAgICAgICAgICAgc2VsZi5yZXRlc3RfbmV0d29ya19idXR0b24uc2hvdygpCisgICAgICAgIHNlbGYudGVzdF9wcm94eV9zdGF0ZSA9IHN0YXRlCisKKyAgICBkZWYgY3JlYXRlX25ldHdvcmtfcGFnZShzZWxmKToKKyAgICAgICAgYWR2YW5jZWRfdmJveCA9IGd0ay5WQm94KEZhbHNlLCA2KQorICAgICAgICBhZHZhbmNlZF92Ym94LnNldF9ib3JkZXJfd2lkdGgoNikKKyAgICAgICAgc2VsZi5zYW1lX3Byb3h5X2FkZHJlc3NlcyA9IFtdCisgICAgICAgIHNlbGYuc2FtZV9wcm94eV9wb3J0cyA9IFtdCisgICAgICAgIHNlbGYuYWxsX3Byb3h5X3BvcnRzID0gW10KKyAgICAgICAgc2VsZi5hbGxfcHJveHlfYWRkcmVzc2VzID0gW10KKworICAgICAgICBzdWJfdmJveCA9IGd0ay5WQm94KEZhbHNlLCA2KQorICAgICAgICBhZHZhbmNlZF92Ym94LnBhY2tfc3RhcnQoc3ViX3Zib3gsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgbGFiZWwgPSBzZWxmLmdlbl9sYWJlbF93aWRnZXQoIjxzcGFuIHdlaWdodD1cImJvbGRcIj5TZXQgdGhlIHByb3hpZXMgdXNlZCB3aGVuIGZldGNoaW5nIHNvdXJjZSBjb2RlPC9zcGFuPiIpCisgICAgICAgIHRvb2x0aXAgPSAiU2V0IHRoZSBwcm94aWVzIHVzZWQgd2hlbiBmZXRjaGluZyBzb3VyY2UgY29kZS4gIEEgYmxhbmsgZmllbGQgdXNlcyBhIGRpcmVjdCBpbnRlcm5ldCBjb25uZWN0aW9uLiIKKyAgICAgICAgaW5mbyA9IEhvYkluZm9CdXR0b24oIjxzcGFuIHdlaWdodD1cImJvbGRcIj5TZXQgdGhlIHByb3hpZXMgdXNlZCB3aGVuIGZldGNoaW5nIHNvdXJjZSBjb2RlPC9zcGFuPiIgKyAiKiIgKyB0b29sdGlwLCBzZWxmKQorICAgICAgICBoYm94ID0gZ3RrLkhCb3goRmFsc2UsIDEyKQorICAgICAgICBoYm94LnBhY2tfc3RhcnQobGFiZWwsIGV4cGFuZD1UcnVlLCBmaWxsPVRydWUpCisgICAgICAgIGhib3gucGFja19zdGFydChpbmZvLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIHN1Yl92Ym94LnBhY2tfc3RhcnQoaGJveCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorCisgICAgICAgIHByb3h5X3Rlc3RfZm9jdXMgPSBbXQorICAgICAgICBzZWxmLmRpcmVjdF9jaGVja2JveCA9IGd0ay5SYWRpb0J1dHRvbihOb25lLCAiRGlyZWN0IG5ldHdvcmsgY29ubmVjdGlvbiIpCisgICAgICAgIHByb3h5X3Rlc3RfZm9jdXMuYXBwZW5kKHNlbGYuZGlyZWN0X2NoZWNrYm94KQorICAgICAgICBzZWxmLmRpcmVjdF9jaGVja2JveC5zZXRfdG9vbHRpcF90ZXh0KCJDaGVjayB0aGlzIGJveCB0byB1c2UgYSBkaXJlY3QgaW50ZXJuZXQgY29ubmVjdGlvbiB3aXRoIG5vIHByb3h5IikKKyAgICAgICAgc2VsZi5kaXJlY3RfY2hlY2tib3guc2V0X2FjdGl2ZShub3Qgc2VsZi5jb25maWd1cmF0aW9uLmVuYWJsZV9wcm94eSkKKyAgICAgICAgc3ViX3Zib3gucGFja19zdGFydChzZWxmLmRpcmVjdF9jaGVja2JveCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorCisgICAgICAgIHNlbGYucHJveHlfY2hlY2tib3ggPSBndGsuUmFkaW9CdXR0b24oc2VsZi5kaXJlY3RfY2hlY2tib3gsICJNYW51YWwgcHJveHkgY29uZmlndXJhdGlvbiIpCisgICAgICAgIHByb3h5X3Rlc3RfZm9jdXMuYXBwZW5kKHNlbGYucHJveHlfY2hlY2tib3gpCisgICAgICAgIHNlbGYucHJveHlfY2hlY2tib3guc2V0X3Rvb2x0aXBfdGV4dCgiQ2hlY2sgdGhpcyBib3ggdG8gbWFudWFsbHkgc2V0IHVwIGEgc3BlY2lmaWMgcHJveHkiKQorICAgICAgICBzZWxmLnByb3h5X2NoZWNrYm94LnNldF9hY3RpdmUoc2VsZi5jb25maWd1cmF0aW9uLmVuYWJsZV9wcm94eSkKKyAgICAgICAgc3ViX3Zib3gucGFja19zdGFydChzZWxmLnByb3h5X2NoZWNrYm94LCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgc2VsZi5zYW1lX2NoZWNrYm94ID0gZ3RrLkNoZWNrQnV0dG9uKCJVc2UgdGhlIEhUVFAgcHJveHkgZm9yIGFsbCBwcm90b2NvbHMiKQorICAgICAgICBwcm94eV90ZXN0X2ZvY3VzLmFwcGVuZChzZWxmLnNhbWVfY2hlY2tib3gpCisgICAgICAgIHNlbGYuc2FtZV9jaGVja2JveC5zZXRfdG9vbHRpcF90ZXh0KCJDaGVjayB0aGlzIGJveCB0byB1c2UgdGhlIEhUVFAgcHJveHkgZm9yIGFsbCBmaXZlIHByb3hpZXMiKQorICAgICAgICBzZWxmLnNhbWVfY2hlY2tib3guc2V0X2FjdGl2ZShzZWxmLmNvbmZpZ3VyYXRpb24uc2FtZV9wcm94eSkKKyAgICAgICAgaGJveCA9IGd0ay5IQm94KEZhbHNlLCAxMikKKyAgICAgICAgaGJveC5wYWNrX3N0YXJ0KHNlbGYuc2FtZV9jaGVja2JveCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlLCBwYWRkaW5nPTI0KQorICAgICAgICBzdWJfdmJveC5wYWNrX3N0YXJ0KGhib3gsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKworICAgICAgICBzZWxmLnByb3h5X3RhYmxlID0gZ3RrLlRhYmxlKDYsIDUsIEZhbHNlKQorICAgICAgICBzZWxmLmh0dHBfcHJveHksIHNlbGYuaHR0cF9wcm94eV9wb3J0LCBzZWxmLmh0dHBfcHJveHlfZGV0YWlscyA9IHNlbGYuZ2VuX3Byb3h5X2VudHJ5X3dpZGdldCgKKyAgICAgICAgICAgICJodHRwIiwgc2VsZiwgVHJ1ZSwgMCkKKyAgICAgICAgcHJveHlfdGVzdF9mb2N1cyArPVtzZWxmLmh0dHBfcHJveHksIHNlbGYuaHR0cF9wcm94eV9wb3J0XQorICAgICAgICBzZWxmLmh0dHBfcHJveHkuY29ubmVjdCgiY2hhbmdlZCIsIHNlbGYuaHR0cF9wcm94eV9jaGFuZ2VkKQorICAgICAgICBzZWxmLmh0dHBfcHJveHlfcG9ydC5jb25uZWN0KCJjaGFuZ2VkIiwgc2VsZi5odHRwX3Byb3h5X2NoYW5nZWQpCisKKyAgICAgICAgc2VsZi5odHRwc19wcm94eSwgc2VsZi5odHRwc19wcm94eV9wb3J0LCBzZWxmLmh0dHBzX3Byb3h5X2RldGFpbHMgPSBzZWxmLmdlbl9wcm94eV9lbnRyeV93aWRnZXQoCisgICAgICAgICAgICAiaHR0cHMiLCBzZWxmLCBUcnVlLCAxKQorICAgICAgICBwcm94eV90ZXN0X2ZvY3VzICs9IFtzZWxmLmh0dHBzX3Byb3h5LCBzZWxmLmh0dHBzX3Byb3h5X3BvcnRdCisgICAgICAgIHNlbGYuc2FtZV9wcm94eV9hZGRyZXNzZXMuYXBwZW5kKHNlbGYuaHR0cHNfcHJveHkpCisgICAgICAgIHNlbGYuc2FtZV9wcm94eV9wb3J0cy5hcHBlbmQoc2VsZi5odHRwc19wcm94eV9wb3J0KQorCisgICAgICAgIHNlbGYuZnRwX3Byb3h5LCBzZWxmLmZ0cF9wcm94eV9wb3J0LCBzZWxmLmZ0cF9wcm94eV9kZXRhaWxzID0gc2VsZi5nZW5fcHJveHlfZW50cnlfd2lkZ2V0KAorICAgICAgICAgICAgImZ0cCIsIHNlbGYsIFRydWUsIDIpCisgICAgICAgIHByb3h5X3Rlc3RfZm9jdXMgKz0gW3NlbGYuZnRwX3Byb3h5LCBzZWxmLmZ0cF9wcm94eV9wb3J0XQorICAgICAgICBzZWxmLnNhbWVfcHJveHlfYWRkcmVzc2VzLmFwcGVuZChzZWxmLmZ0cF9wcm94eSkKKyAgICAgICAgc2VsZi5zYW1lX3Byb3h5X3BvcnRzLmFwcGVuZChzZWxmLmZ0cF9wcm94eV9wb3J0KQorCisgICAgICAgIHNlbGYuc29ja3NfcHJveHksIHNlbGYuc29ja3NfcHJveHlfcG9ydCwgc2VsZi5zb2Nrc19wcm94eV9kZXRhaWxzID0gc2VsZi5nZW5fcHJveHlfZW50cnlfd2lkZ2V0KAorICAgICAgICAgICAgInNvY2tzIiwgc2VsZiwgVHJ1ZSwgMykKKyAgICAgICAgcHJveHlfdGVzdF9mb2N1cyArPSBbc2VsZi5zb2Nrc19wcm94eSwgc2VsZi5zb2Nrc19wcm94eV9wb3J0XQorICAgICAgICBzZWxmLnNhbWVfcHJveHlfYWRkcmVzc2VzLmFwcGVuZChzZWxmLnNvY2tzX3Byb3h5KQorICAgICAgICBzZWxmLnNhbWVfcHJveHlfcG9ydHMuYXBwZW5kKHNlbGYuc29ja3NfcHJveHlfcG9ydCkKKworICAgICAgICBzZWxmLmN2c19wcm94eSwgc2VsZi5jdnNfcHJveHlfcG9ydCwgc2VsZi5jdnNfcHJveHlfZGV0YWlscyA9IHNlbGYuZ2VuX3Byb3h5X2VudHJ5X3dpZGdldCgKKyAgICAgICAgICAgICJjdnMiLCBzZWxmLCBUcnVlLCA0KQorICAgICAgICBwcm94eV90ZXN0X2ZvY3VzICs9IFtzZWxmLmN2c19wcm94eSwgc2VsZi5jdnNfcHJveHlfcG9ydF0KKyAgICAgICAgc2VsZi5zYW1lX3Byb3h5X2FkZHJlc3Nlcy5hcHBlbmQoc2VsZi5jdnNfcHJveHkpCisgICAgICAgIHNlbGYuc2FtZV9wcm94eV9wb3J0cy5hcHBlbmQoc2VsZi5jdnNfcHJveHlfcG9ydCkKKyAgICAgICAgc2VsZi5hbGxfcHJveHlfcG9ydHMgPSBzZWxmLnNhbWVfcHJveHlfcG9ydHMgKyBbc2VsZi5odHRwX3Byb3h5X3BvcnRdCisgICAgICAgIHNlbGYuYWxsX3Byb3h5X2FkZHJlc3NlcyA9IHNlbGYuc2FtZV9wcm94eV9hZGRyZXNzZXMgKyBbc2VsZi5odHRwX3Byb3h5XQorICAgICAgICBzdWJfdmJveC5wYWNrX3N0YXJ0KHNlbGYucHJveHlfdGFibGUsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgc2VsZi5wcm94eV90YWJsZS5zaG93X2FsbCgpCisKKyAgICAgICAgIyBDcmVhdGUgdGhlIGdyYXBoaWNhbCBlbGVtZW50cyBmb3IgdGhlIG5ldHdvcmsgdGVzdCBmZWF0dXJlLCBidXQgZG9uJ3QgZGlzcGxheSB0aGVtIHlldAorICAgICAgICBzZWxmLnRlc3RfbmV0d29ya19idXR0b24gPSBIb2JBbHRCdXR0b24oIlRlc3QgbmV0d29yayBjb25maWd1cmF0aW9uIikKKyAgICAgICAgc2VsZi50ZXN0X25ldHdvcmtfYnV0dG9uLmNvbm5lY3QoImNsaWNrZWQiLCBzZWxmLnRlc3RfbmV0d29ya19idXR0b25fY2IpCisgICAgICAgIHNlbGYudGVzdF9wcm94eV9wcm9ncmVzcyA9IEhvYlByb2dyZXNzQmFyKCkKKyAgICAgICAgc2VsZi5kdW1teV9wcm9ncmVzcyA9IEhvYlByb2dyZXNzQmFyKCkKKyAgICAgICAgc2VsZi5yZXRlc3RfbmV0d29ya19idXR0b24gPSBIb2JBbHRCdXR0b24oIlJldGVzdCIpCisgICAgICAgIHNlbGYucmV0ZXN0X25ldHdvcmtfYnV0dG9uLmNvbm5lY3QoImNsaWNrZWQiLCBzZWxmLnRlc3RfbmV0d29ya19idXR0b25fY2IpCisgICAgICAgIHNlbGYudGVzdF9ndWlfZWxlbWVudHMgPSBbc2VsZi50ZXN0X25ldHdvcmtfYnV0dG9uLCBzZWxmLnRlc3RfcHJveHlfcHJvZ3Jlc3MsIHNlbGYuZHVtbXlfcHJvZ3Jlc3MsIHNlbGYucmV0ZXN0X25ldHdvcmtfYnV0dG9uXQorICAgICAgICAjIEluaXRpYWxpemUgdGhlIG5ldHdvcmsgdGVzdGVyCisgICAgICAgIHNlbGYudGVzdF9wcm94eV9zdGF0ZSA9IHNlbGYuVEVTVF9ORVRXT1JLX05PTkUKKyAgICAgICAgc2VsZi5zZXRfdGVzdF9wcm94eV9zdGF0ZShzZWxmLlRFU1RfTkVUV09SS19JTklUSUFMKQorICAgICAgICBzZWxmLnByb3h5X3Rlc3RfcGFzc2VkX2lkID0gc2VsZi5oYW5kbGVyLmNvbm5lY3QoIm5ldHdvcmstcGFzc2VkIiwgbGFtYmRhIGg6c2VsZi50ZXN0X3Byb3h5X2VuZGVkKFRydWUpKQorICAgICAgICBzZWxmLnByb3h5X3Rlc3RfZmFpbGVkX2lkID0gc2VsZi5oYW5kbGVyLmNvbm5lY3QoIm5ldHdvcmstZmFpbGVkIiwgbGFtYmRhIGg6c2VsZi50ZXN0X3Byb3h5X2VuZGVkKEZhbHNlKSkKKyAgICAgICAgW3cuY29ubmVjdCgiZm9jdXMtaW4tZXZlbnQiLCBzZWxmLnRlc3RfcHJveHlfZm9jdXNfZXZlbnQpIGZvciB3IGluIHByb3h5X3Rlc3RfZm9jdXNdCisgICAgICAgIFt3LmNvbm5lY3QoImZvY3VzLW91dC1ldmVudCIsIHNlbGYucHJveHlfYWRkcmVzc19mb2N1c19vdXRfZXZlbnQpIGZvciB3IGluIHNlbGYuYWxsX3Byb3h5X2FkZHJlc3Nlc10KKworICAgICAgICBzZWxmLmRpcmVjdF9jaGVja2JveC5jb25uZWN0KCJ0b2dnbGVkIiwgc2VsZi5wcm94eV9jaGVja2JveF90b2dnbGVkX2NiKQorICAgICAgICBzZWxmLnByb3h5X2NoZWNrYm94LmNvbm5lY3QoInRvZ2dsZWQiLCBzZWxmLnByb3h5X2NoZWNrYm94X3RvZ2dsZWRfY2IpCisgICAgICAgIHNlbGYuc2FtZV9jaGVja2JveC5jb25uZWN0KCJ0b2dnbGVkIiwgc2VsZi5zYW1lX2NoZWNrYm94X3RvZ2dsZWRfY2IpCisKKyAgICAgICAgc2VsZi5yZWZyZXNoX3Byb3h5X2NvbXBvbmVudHMoKQorICAgICAgICByZXR1cm4gYWR2YW5jZWRfdmJveAorCisgICAgZGVmIHN3aXRjaF90b19wYWdlKHNlbGYsIHBhZ2VfaWQpOgorICAgICAgICBzZWxmLm5iLnNldF9jdXJyZW50X3BhZ2UocGFnZV9pZCkKKworICAgIGRlZiBkZXRhaWxzX2NiKHNlbGYsIGJ1dHRvbiwgcGFyZW50LCBwcm90b2NvbCk6CisgICAgICAgIHNlbGYuc2F2ZV9wcm94eV9kYXRhKCkKKyAgICAgICAgZGlhbG9nID0gUHJveHlEZXRhaWxzRGlhbG9nKHRpdGxlID0gcHJvdG9jb2wudXBwZXIoKSArICIgUHJveHkgRGV0YWlscyIsCisgICAgICAgICAgICB1c2VyID0gc2VsZi5jb25maWd1cmF0aW9uLnByb3hpZXNbcHJvdG9jb2xdWzFdLAorICAgICAgICAgICAgcGFzc3dkID0gc2VsZi5jb25maWd1cmF0aW9uLnByb3hpZXNbcHJvdG9jb2xdWzJdLAorICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LAorICAgICAgICAgICAgZmxhZ3MgPSBndGsuRElBTE9HX01PREFMCisgICAgICAgICAgICAgICAgICAgIHwgZ3RrLkRJQUxPR19ERVNUUk9ZX1dJVEhfUEFSRU5UCisgICAgICAgICAgICAgICAgICAgIHwgZ3RrLkRJQUxPR19OT19TRVBBUkFUT1IpCisgICAgICAgIGRpYWxvZy5hZGRfYnV0dG9uKGd0ay5TVE9DS19DTE9TRSwgZ3RrLlJFU1BPTlNFX09LKQorICAgICAgICByZXNwb25zZSA9IGRpYWxvZy5ydW4oKQorICAgICAgICBpZiByZXNwb25zZSA9PSBndGsuUkVTUE9OU0VfT0s6CisgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24ucHJveGllc1twcm90b2NvbF1bMV0gPSBkaWFsb2cudXNlcgorICAgICAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLnByb3hpZXNbcHJvdG9jb2xdWzJdID0gZGlhbG9nLnBhc3N3ZAorICAgICAgICAgICAgc2VsZi5yZWZyZXNoX3Byb3h5X2NvbXBvbmVudHMoKQorICAgICAgICBkaWFsb2cuZGVzdHJveSgpICAgIAorCisgICAgZGVmIHJvb3Rmc19jb21ib19jaGFuZ2VkX2NiKHNlbGYsIHJvb3Rmc19jb21ibywgYWxsX3BhY2thZ2VfZm9ybWF0LCBjaGVja19oYm94KToKKyAgICAgICAgY29tYm9faXRlbSA9IHNlbGYucm9vdGZzX2NvbWJvLmdldF9hY3RpdmVfdGV4dCgpCisgICAgICAgIGZvciBjaGlsZCBpbiBjaGVja19oYm94LmdldF9jaGlsZHJlbigpOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShjaGlsZCwgZ3RrLkNoZWNrQnV0dG9uKToKKyAgICAgICAgICAgICAgICBjaGVja19oYm94LnJlbW92ZShjaGlsZCkKKyAgICAgICAgZm9yIGZvcm1hdCBpbiBhbGxfcGFja2FnZV9mb3JtYXQ6CisgICAgICAgICAgICBpZiBmb3JtYXQgIT0gY29tYm9faXRlbToKKyAgICAgICAgICAgICAgICBjaGVja19idXR0b24gPSBndGsuQ2hlY2tCdXR0b24oZm9ybWF0KQorICAgICAgICAgICAgICAgIGNoZWNrX2hib3gucGFja19zdGFydChjaGVja19idXR0b24sIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgY2hlY2tfaGJveC5zaG93X2FsbCgpCisKKyAgICBkZWYgZ2VuX3BrZ2ZtdF93aWRnZXQoc2VsZiwgY3Vycl9wYWNrYWdlX2Zvcm1hdCwgYWxsX3BhY2thZ2VfZm9ybWF0LCB0b29sdGlwX2NvbWJvPSIiLCB0b29sdGlwX2V4dHJhPSIiKToKKyAgICAgICAgcGtnZm10X2hib3ggPSBndGsuSEJveChGYWxzZSwgMjQpCisKKyAgICAgICAgcm9vdGZzX3Zib3ggPSBndGsuVkJveChGYWxzZSwgNikKKyAgICAgICAgcGtnZm10X2hib3gucGFja19zdGFydChyb290ZnNfdmJveCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorCisgICAgICAgIGxhYmVsID0gc2VsZi5nZW5fbGFiZWxfd2lkZ2V0KCJSb290IGZpbGUgc3lzdGVtIHBhY2thZ2UgZm9ybWF0IikKKyAgICAgICAgcm9vdGZzX3Zib3gucGFja19zdGFydChsYWJlbCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorCisgICAgICAgIHJvb3Rmc19mb3JtYXQgPSAiIgorICAgICAgICBpZiBjdXJyX3BhY2thZ2VfZm9ybWF0OgorICAgICAgICAgICAgcm9vdGZzX2Zvcm1hdCA9IGN1cnJfcGFja2FnZV9mb3JtYXQuc3BsaXQoKVswXQorCisgICAgICAgIHJvb3Rmc19mb3JtYXRfd2lkZ2V0LCByb290ZnNfY29tYm8gPSBzZWxmLmdlbl9jb21ib193aWRnZXQocm9vdGZzX2Zvcm1hdCwgYWxsX3BhY2thZ2VfZm9ybWF0LCB0b29sdGlwX2NvbWJvKQorICAgICAgICByb290ZnNfdmJveC5wYWNrX3N0YXJ0KHJvb3Rmc19mb3JtYXRfd2lkZ2V0LCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgZXh0cmFfdmJveCA9IGd0ay5WQm94KEZhbHNlLCA2KQorICAgICAgICBwa2dmbXRfaGJveC5wYWNrX3N0YXJ0KGV4dHJhX3Zib3gsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKworICAgICAgICBsYWJlbCA9IHNlbGYuZ2VuX2xhYmVsX3dpZGdldCgiQWRkaXRpb25hbCBwYWNrYWdlIGZvcm1hdHMiKQorICAgICAgICBleHRyYV92Ym94LnBhY2tfc3RhcnQobGFiZWwsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKworICAgICAgICBjaGVja19oYm94ID0gZ3RrLkhCb3goRmFsc2UsIDEyKQorICAgICAgICBleHRyYV92Ym94LnBhY2tfc3RhcnQoY2hlY2tfaGJveCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICBmb3IgZm9ybWF0IGluIGFsbF9wYWNrYWdlX2Zvcm1hdDoKKyAgICAgICAgICAgIGlmIGZvcm1hdCAhPSByb290ZnNfZm9ybWF0OgorICAgICAgICAgICAgICAgIGNoZWNrX2J1dHRvbiA9IGd0ay5DaGVja0J1dHRvbihmb3JtYXQpCisgICAgICAgICAgICAgICAgaXNfYWN0aXZlID0gKGZvcm1hdCBpbiBjdXJyX3BhY2thZ2VfZm9ybWF0LnNwbGl0KCkpCisgICAgICAgICAgICAgICAgY2hlY2tfYnV0dG9uLnNldF9hY3RpdmUoaXNfYWN0aXZlKQorICAgICAgICAgICAgICAgIGNoZWNrX2hib3gucGFja19zdGFydChjaGVja19idXR0b24sIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKworICAgICAgICBpbmZvID0gSG9iSW5mb0J1dHRvbih0b29sdGlwX2V4dHJhLCBzZWxmKQorICAgICAgICBjaGVja19oYm94LnBhY2tfZW5kKGluZm8sIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKworICAgICAgICByb290ZnNfY29tYm8uY29ubmVjdCgiY2hhbmdlZCIsIHNlbGYucm9vdGZzX2NvbWJvX2NoYW5nZWRfY2IsIGFsbF9wYWNrYWdlX2Zvcm1hdCwgY2hlY2tfaGJveCkKKworICAgICAgICBwa2dmbXRfaGJveC5zaG93X2FsbCgpCisKKyAgICAgICAgcmV0dXJuIHBrZ2ZtdF9oYm94LCByb290ZnNfY29tYm8sIGNoZWNrX2hib3gKKworICAgIGRlZiBlZGl0YWJsZV9zZXR0aW5nc19jZWxsX2VkaXRlZChzZWxmLCBjZWxsLCBwYXRoX3N0cmluZywgbmV3X3RleHQsIG1vZGVsKToKKyAgICAgICAgaXQgPSBtb2RlbC5nZXRfaXRlcl9mcm9tX3N0cmluZyhwYXRoX3N0cmluZykKKyAgICAgICAgY29sdW1uID0gY2VsbC5nZXRfZGF0YSgiY29sdW1uIikKKyAgICAgICAgbW9kZWwuc2V0KGl0LCBjb2x1bW4sIG5ld190ZXh0KQorCisgICAgZGVmIGVkaXRhYmxlX3NldHRpbmdzX2FkZF9pdGVtX2NsaWNrZWQoc2VsZiwgYnV0dG9uLCBtb2RlbCk6CisgICAgICAgIG5ld19pdGVtID0gWyIjI0tFWSMjIiwgIiMjVkFMVUUjIyJdCisKKyAgICAgICAgaXRlciA9IG1vZGVsLmFwcGVuZCgpCisgICAgICAgIG1vZGVsLnNldCAoaXRlciwKKyAgICAgICAgICAgIDAsIG5ld19pdGVtWzBdLAorICAgICAgICAgICAgMSwgbmV3X2l0ZW1bMV0sCisgICAgICAgKQorCisgICAgZGVmIGVkaXRhYmxlX3NldHRpbmdzX3JlbW92ZV9pdGVtX2NsaWNrZWQoc2VsZiwgYnV0dG9uLCB0cmVldmlldyk6CisgICAgICAgIHNlbGVjdGlvbiA9IHRyZWV2aWV3LmdldF9zZWxlY3Rpb24oKQorICAgICAgICBtb2RlbCwgaXRlciA9IHNlbGVjdGlvbi5nZXRfc2VsZWN0ZWQoKQorCisgICAgICAgIGlmIGl0ZXI6CisgICAgICAgICAgICBwYXRoID0gbW9kZWwuZ2V0X3BhdGgoaXRlcilbMF0KKyAgICAgICAgICAgIG1vZGVsLnJlbW92ZShpdGVyKQorIAorICAgIGRlZiBnZW5fZWRpdGFibGVfc2V0dGluZ3Moc2VsZiwgc2V0dGluZywgdG9vbHRpcD0iIik6CisgICAgICAgIHNldHRpbmdfaGJveCA9IGd0ay5IQm94KEZhbHNlLCAxMikKKworICAgICAgICB2Ym94ID0gZ3RrLlZCb3goRmFsc2UsIDEyKQorICAgICAgICBzZXR0aW5nX2hib3gucGFja19zdGFydCh2Ym94LCBleHBhbmQ9VHJ1ZSwgZmlsbD1UcnVlKQorCisgICAgICAgIHNldHRpbmdfc3RvcmUgPSBndGsuTGlzdFN0b3JlKGdvYmplY3QuVFlQRV9TVFJJTkcsIGdvYmplY3QuVFlQRV9TVFJJTkcpCisgICAgICAgIGZvciBrZXkgaW4gc2V0dGluZy5rZXlzKCk6CisgICAgICAgICAgICBzZXR0aW5nX3N0b3JlLnNldChzZXR0aW5nX3N0b3JlLmFwcGVuZCgpLCAwLCBrZXksIDEsIHNldHRpbmdba2V5XSkKKworICAgICAgICBzZXR0aW5nX3RyZWUgPSBndGsuVHJlZVZpZXcoc2V0dGluZ19zdG9yZSkKKyAgICAgICAgc2V0dGluZ190cmVlLnNldF9oZWFkZXJzX3Zpc2libGUoVHJ1ZSkKKyAgICAgICAgc2V0dGluZ190cmVlLnNldF9zaXplX3JlcXVlc3QoMzAwLCAxMDApCisKKyAgICAgICAgY29sID0gZ3RrLlRyZWVWaWV3Q29sdW1uKCdLZXknKQorICAgICAgICBjb2wuc2V0X21pbl93aWR0aCgxMDApCisgICAgICAgIGNvbC5zZXRfbWF4X3dpZHRoKDE1MCkKKyAgICAgICAgY29sLnNldF9yZXNpemFibGUoVHJ1ZSkKKyAgICAgICAgY29sMSA9IGd0ay5UcmVlVmlld0NvbHVtbignVmFsdWUnKQorICAgICAgICBjb2wxLnNldF9taW5fd2lkdGgoMTAwKQorICAgICAgICBjb2wxLnNldF9tYXhfd2lkdGgoMTUwKQorICAgICAgICBjb2wxLnNldF9yZXNpemFibGUoVHJ1ZSkKKyAgICAgICAgc2V0dGluZ190cmVlLmFwcGVuZF9jb2x1bW4oY29sKQorICAgICAgICBzZXR0aW5nX3RyZWUuYXBwZW5kX2NvbHVtbihjb2wxKQorICAgICAgICBjZWxsID0gZ3RrLkNlbGxSZW5kZXJlclRleHQoKQorICAgICAgICBjZWxsLnNldF9wcm9wZXJ0eSgnd2lkdGgtY2hhcnMnLCAxMCkKKyAgICAgICAgY2VsbC5zZXRfcHJvcGVydHkoJ2VkaXRhYmxlJywgVHJ1ZSkKKyAgICAgICAgY2VsbC5zZXRfZGF0YSgiY29sdW1uIiwgMCkKKyAgICAgICAgY2VsbC5jb25uZWN0KCJlZGl0ZWQiLCBzZWxmLmVkaXRhYmxlX3NldHRpbmdzX2NlbGxfZWRpdGVkLCBzZXR0aW5nX3N0b3JlKQorICAgICAgICBjZWxsMSA9IGd0ay5DZWxsUmVuZGVyZXJUZXh0KCkKKyAgICAgICAgY2VsbDEuc2V0X3Byb3BlcnR5KCd3aWR0aC1jaGFycycsIDEwKQorICAgICAgICBjZWxsMS5zZXRfcHJvcGVydHkoJ2VkaXRhYmxlJywgVHJ1ZSkKKyAgICAgICAgY2VsbDEuc2V0X2RhdGEoImNvbHVtbiIsIDEpCisgICAgICAgIGNlbGwxLmNvbm5lY3QoImVkaXRlZCIsIHNlbGYuZWRpdGFibGVfc2V0dGluZ3NfY2VsbF9lZGl0ZWQsIHNldHRpbmdfc3RvcmUpCisgICAgICAgIGNvbC5wYWNrX3N0YXJ0KGNlbGwsIFRydWUpCisgICAgICAgIGNvbDEucGFja19lbmQoY2VsbDEsIFRydWUpCisgICAgICAgIGNvbC5zZXRfYXR0cmlidXRlcyhjZWxsLCB0ZXh0PTApCisgICAgICAgIGNvbDEuc2V0X2F0dHJpYnV0ZXMoY2VsbDEsIHRleHQ9MSkKKworICAgICAgICBzY3JvbGwgPSBndGsuU2Nyb2xsZWRXaW5kb3coKQorICAgICAgICBzY3JvbGwuc2V0X3NoYWRvd190eXBlKGd0ay5TSEFET1dfSU4pCisgICAgICAgIHNjcm9sbC5zZXRfcG9saWN5KGd0ay5QT0xJQ1lfQVVUT01BVElDLCBndGsuUE9MSUNZX0FVVE9NQVRJQykKKyAgICAgICAgc2Nyb2xsLmFkZChzZXR0aW5nX3RyZWUpCisgICAgICAgIHZib3gucGFja19zdGFydChzY3JvbGwsIGV4cGFuZD1UcnVlLCBmaWxsPVRydWUpCisKKyAgICAgICAgIyBzb21lIGJ1dHRvbnMKKyAgICAgICAgaGJveCA9IGd0ay5IQm94KFRydWUsIDYpCisgICAgICAgIHZib3gucGFja19zdGFydChoYm94LCBGYWxzZSwgRmFsc2UpCisKKyAgICAgICAgYnV0dG9uID0gZ3RrLkJ1dHRvbihzdG9jaz1ndGsuU1RPQ0tfQUREKQorICAgICAgICBidXR0b24uY29ubmVjdCgiY2xpY2tlZCIsIHNlbGYuZWRpdGFibGVfc2V0dGluZ3NfYWRkX2l0ZW1fY2xpY2tlZCwgc2V0dGluZ19zdG9yZSkKKyAgICAgICAgaGJveC5wYWNrX3N0YXJ0KGJ1dHRvbikKKworICAgICAgICBidXR0b24gPSBndGsuQnV0dG9uKHN0b2NrPWd0ay5TVE9DS19SRU1PVkUpCisgICAgICAgIGJ1dHRvbi5jb25uZWN0KCJjbGlja2VkIiwgc2VsZi5lZGl0YWJsZV9zZXR0aW5nc19yZW1vdmVfaXRlbV9jbGlja2VkLCBzZXR0aW5nX3RyZWUpCisgICAgICAgIGhib3gucGFja19zdGFydChidXR0b24pCisKKyAgICAgICAgaW5mbyA9IEhvYkluZm9CdXR0b24odG9vbHRpcCwgc2VsZikKKyAgICAgICAgc2V0dGluZ19oYm94LnBhY2tfc3RhcnQoaW5mbywgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorCisgICAgICAgIHJldHVybiBzZXR0aW5nX2hib3gsIHNldHRpbmdfc3RvcmUKKworICAgIGRlZiBjcmVhdGVfb3RoZXJzX3BhZ2Uoc2VsZik6CisgICAgICAgIGFkdmFuY2VkX3Zib3ggPSBndGsuVkJveChGYWxzZSwgNikKKyAgICAgICAgYWR2YW5jZWRfdmJveC5zZXRfYm9yZGVyX3dpZHRoKDYpCisKKyAgICAgICAgc3ViX3Zib3ggPSBndGsuVkJveChGYWxzZSwgNikKKyAgICAgICAgYWR2YW5jZWRfdmJveC5wYWNrX3N0YXJ0KHN1Yl92Ym94LCBleHBhbmQ9VHJ1ZSwgZmlsbD1UcnVlKQorICAgICAgICBsYWJlbCA9IHNlbGYuZ2VuX2xhYmVsX3dpZGdldCgiPHNwYW4gd2VpZ2h0PVwiYm9sZFwiPkFkZCB5b3VyIG93biB2YXJpYWJsZXM6PC9zcGFuPiIpCisgICAgICAgIHRvb2x0aXAgPSAiVGhlc2UgYXJlIGtleS92YWx1ZSBwYWlycyBmb3IgeW91ciBleHRyYSBzZXR0aW5ncy4gQ2xpY2sgXCdBZGRcJyBhbmQgdGhlbiBkaXJlY3RseSBlZGl0IHRoZSBrZXkgYW5kIHRoZSB2YWx1ZSIKKyAgICAgICAgc2V0dGluZ193aWRnZXQsIHNlbGYuc2V0dGluZ19zdG9yZSA9IHNlbGYuZ2VuX2VkaXRhYmxlX3NldHRpbmdzKHNlbGYuY29uZmlndXJhdGlvbi5leHRyYV9zZXR0aW5nLCI8Yj5BZGQgeW91ciBvd24gdmFyaWFibGVzPC9iPiIgKyAiKiIgKyB0b29sdGlwKQorICAgICAgICBzdWJfdmJveC5wYWNrX3N0YXJ0KGxhYmVsLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIHN1Yl92Ym94LnBhY2tfc3RhcnQoc2V0dGluZ193aWRnZXQsIGV4cGFuZD1UcnVlLCBmaWxsPVRydWUpCisKKyAgICAgICAgcmV0dXJuIGFkdmFuY2VkX3Zib3gKKworICAgIGRlZiBjcmVhdGVfdmlzdWFsX2VsZW1lbnRzKHNlbGYpOgorICAgICAgICBzZWxmLm5iID0gZ3RrLk5vdGVib29rKCkKKyAgICAgICAgc2VsZi5uYi5zZXRfc2hvd190YWJzKFRydWUpICAgICAgICAKKyAgICAgICAgc2VsZi5uYi5hcHBlbmRfcGFnZShzZWxmLmNyZWF0ZV9idWlsZF9lbnZpcm9ubWVudF9wYWdlKCksIGd0ay5MYWJlbCgiQnVpbGQgZW52aXJvbm1lbnQiKSkKKyAgICAgICAgc2VsZi5uYi5hcHBlbmRfcGFnZShzZWxmLmNyZWF0ZV9zaGFyZWRfc3RhdGVfcGFnZSgpLCBndGsuTGFiZWwoIlNoYXJlZCBzdGF0ZSIpKQorICAgICAgICBzZWxmLm5iLmFwcGVuZF9wYWdlKHNlbGYuY3JlYXRlX25ldHdvcmtfcGFnZSgpLCBndGsuTGFiZWwoIk5ldHdvcmsiKSkgICAgICAgIAorICAgICAgICBzZWxmLm5iLmFwcGVuZF9wYWdlKHNlbGYuY3JlYXRlX290aGVyc19wYWdlKCksIGd0ay5MYWJlbCgiT3RoZXJzIikpCisgICAgICAgIHNlbGYubmIuc2V0X2N1cnJlbnRfcGFnZSgwKQorICAgICAgICBzZWxmLnZib3gucGFja19zdGFydChzZWxmLm5iLCBleHBhbmQ9VHJ1ZSwgZmlsbD1UcnVlKQorICAgICAgICBzZWxmLnZib3gucGFja19lbmQoZ3RrLkhTZXBhcmF0b3IoKSwgZXhwYW5kPVRydWUsIGZpbGw9VHJ1ZSkKKworICAgICAgICBzZWxmLnNob3dfYWxsKCkKKworICAgIGRlZiBkZXN0cm95KHNlbGYpOgorICAgICAgICBzZWxmLmhhbmRsZXIuZGlzY29ubmVjdChzZWxmLnByb3h5X3Rlc3RfcGFzc2VkX2lkKQorICAgICAgICBzZWxmLmhhbmRsZXIuZGlzY29ubmVjdChzZWxmLnByb3h5X3Rlc3RfZmFpbGVkX2lkKQorICAgICAgICBzdXBlcihTaW1wbGVTZXR0aW5nc0RpYWxvZywgc2VsZikuZGVzdHJveSgpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaG9iY29sb3IucHkgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaG9iY29sb3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMxNjU0MgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9ob2Jjb2xvci5weQpAQCAtMCwwICsxLDM4IEBACisjCisjIEJpdEJha2UgR3JhcGhpY2FsIEdUSyBVc2VyIEludGVyZmFjZQorIworIyBDb3B5cmlnaHQgKEMpIDIwMTIgICAgICAgIEludGVsIENvcnBvcmF0aW9uCisjCisjIEF1dGhvcmVkIGJ5IFNoYW5lIFdhbmcgPHNoYW5lLndhbmdAaW50ZWwuY29tPgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworY2xhc3MgSG9iQ29sb3JzOgorICAgIFdISVRFICAgICAgICA9ICIjZmZmZmZmIgorICAgIFBBTEVfR1JFRU4gICA9ICIjYWFmZmFhIgorICAgIE9SQU5HRSAgICAgICA9ICIjZWI4ZTY4IgorICAgIFBBTEVfUkVEICAgICA9ICIjZmZhYWFhIgorICAgIEdSQVkgICAgICAgICA9ICIjYWFhYWFhIgorICAgIExJR0hUX0dSQVkgICA9ICIjZGRkZGRkIgorICAgIFNMSUdIVF9EQVJLICA9ICIjNWY1ZjVmIgorICAgIERBUksgICAgICAgICA9ICIjM2MzYjM3IgorICAgIEJMQUNLICAgICAgICA9ICIjMDAwMDAwIgorICAgIFBBTEVfQkxVRSAgICA9ICIjNTNiOGZmIgorICAgIERFRVBfUkVEICAgICA9ICIjYWEzZTNlIgorICAgIEtIQUtJICAgICAgICA9ICIjZmZmNjhmIgorCisgICAgT0sgPSBXSElURQorICAgIFJVTk5JTkcgPSBQQUxFX0dSRUVOCisgICAgV0FSTklORyA9IE9SQU5HRQorICAgIEVSUk9SID0gUEFMRV9SRUQKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9ob2JldmVudGhhbmRsZXIucHkgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaG9iZXZlbnRoYW5kbGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MWZiMzMKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaG9iZXZlbnRoYW5kbGVyLnB5CkBAIC0wLDAgKzEsNjQ1IEBACisjCisjIEJpdEJha2UgR3JhcGhpY2FsIEdUSyBVc2VyIEludGVyZmFjZQorIworIyBDb3B5cmlnaHQgKEMpIDIwMTEgICAgICAgIEludGVsIENvcnBvcmF0aW9uCisjCisjIEF1dGhvcmVkIGJ5IEpvc2h1YSBMb2NrIDxqb3NoQGxpbnV4LmludGVsLmNvbT4KKyMgQXV0aG9yZWQgYnkgRG9uZ3hpYW8gWHUgPGRvbmd4aWFvLnh1QGludGVsLmNvbT4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBnb2JqZWN0CitpbXBvcnQgbG9nZ2luZworaW1wb3J0IGFzdAorZnJvbSBiYi51aS5jcnVtYnMucnVubmluZ2J1aWxkIGltcG9ydCBSdW5uaW5nQnVpbGQKKworY2xhc3MgSG9iSGFuZGxlcihnb2JqZWN0LkdPYmplY3QpOgorCisgICAgIiIiCisgICAgVGhpcyBvYmplY3QgZG9lcyBCaXRCYWtlIGV2ZW50IGhhbmRsaW5nIGZvciB0aGUgaG9iIGd1aS4KKyAgICAiIiIKKyAgICBfX2dzaWduYWxzX18gPSB7CisgICAgICAgICAicGFja2FnZS1mb3JtYXRzLXVwZGF0ZWQiIDogKGdvYmplY3QuU0lHTkFMX1JVTl9MQVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ29iamVjdC5UWVBFX1BZT0JKRUNULCkpLAorICAgICAgICAgImNvbmZpZy11cGRhdGVkIiAgICAgICAgICA6IChnb2JqZWN0LlNJR05BTF9SVU5fTEFTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdvYmplY3QuVFlQRV9TVFJJTkcsIGdvYmplY3QuVFlQRV9QWU9CSkVDVCwpKSwKKyAgICAgICAgICJjb21tYW5kLXN1Y2NlZWRlZCIgICAgICAgOiAoZ29iamVjdC5TSUdOQUxfUlVOX0xBU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnb2JqZWN0LlRZUEVfSU5ULCkpLAorICAgICAgICAgImNvbW1hbmQtZmFpbGVkIiAgICAgICAgICA6IChnb2JqZWN0LlNJR05BTF9SVU5fTEFTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdvYmplY3QuVFlQRV9TVFJJTkcsKSksCisgICAgICAgICAicGFyc2luZy13YXJuaW5nIiAgICAgICAgIDogKGdvYmplY3QuU0lHTkFMX1JVTl9MQVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ29iamVjdC5UWVBFX1NUUklORywpKSwKKyAgICAgICAgICJzYW5pdHktZmFpbGVkIiAgICAgICAgICAgOiAoZ29iamVjdC5TSUdOQUxfUlVOX0xBU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnb2JqZWN0LlRZUEVfU1RSSU5HLCBnb2JqZWN0LlRZUEVfSU5UKSksCisgICAgICAgICAiZ2VuZXJhdGluZy1kYXRhIiAgICAgICAgIDogKGdvYmplY3QuU0lHTkFMX1JVTl9MQVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSksCisgICAgICAgICAiZGF0YS1nZW5lcmF0ZWQiICAgICAgICAgIDogKGdvYmplY3QuU0lHTkFMX1JVTl9MQVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSksCisgICAgICAgICAicGFyc2luZy1zdGFydGVkIiAgICAgICAgIDogKGdvYmplY3QuU0lHTkFMX1JVTl9MQVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ29iamVjdC5UWVBFX1BZT0JKRUNULCkpLAorICAgICAgICAgInBhcnNpbmciICAgICAgICAgICAgICAgICA6IChnb2JqZWN0LlNJR05BTF9SVU5fTEFTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdvYmplY3QuVFlQRV9QWU9CSkVDVCwpKSwKKyAgICAgICAgICJwYXJzaW5nLWNvbXBsZXRlZCIgICAgICAgOiAoZ29iamVjdC5TSUdOQUxfUlVOX0xBU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnb2JqZWN0LlRZUEVfUFlPQkpFQ1QsKSksCisgICAgICAgICAicmVjaXBlLXBvcHVsYXRlZCIgICAgICAgIDogKGdvYmplY3QuU0lHTkFMX1JVTl9MQVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSksCisgICAgICAgICAicGFja2FnZS1wb3B1bGF0ZWQiICAgICAgIDogKGdvYmplY3QuU0lHTkFMX1JVTl9MQVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSksCisgICAgICAgICAibmV0d29yay1wYXNzZWQiICAgICAgICAgIDogKGdvYmplY3QuU0lHTkFMX1JVTl9MQVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSksCisgICAgICAgICAibmV0d29yay1mYWlsZWQiICAgICAgICAgIDogKGdvYmplY3QuU0lHTkFMX1JVTl9MQVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSksCisgICAgfQorCisgICAgKEdFTkVSQVRFX0NPTkZJR1VSQVRJT04sIEdFTkVSQVRFX1JFQ0lQRVMsIEdFTkVSQVRFX1BBQ0tBR0VTLCBHRU5FUkFURV9JTUFHRSwgUE9QVUxBVEVfUEFDS0FHRUlORk8sIFNBTklUWV9DSEVDSywgTkVUV09SS19URVNUKSA9IHJhbmdlKDcpCisgICAgKFNVQl9QQVRIX0xBWUVSUywgU1VCX0ZJTEVTX0RJU1RSTywgU1VCX0ZJTEVTX01BQ0gsIFNVQl9GSUxFU19TREtNQUNILCBTVUJfTUFUQ0hfQ0xBU1MsIFNVQl9QQVJTRV9DT05GSUcsIFNVQl9TQU5JVFlfQ0hFQ0ssCisgICAgIFNVQl9HTkVSQVRFX1RHVFMsIFNVQl9HRU5FUkFURV9QS0dJTkZPLCBTVUJfQlVJTERfUkVDSVBFUywgU1VCX0JVSUxEX0lNQUdFLCBTVUJfTkVUV09SS19URVNUKSA9IHJhbmdlKDEyKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcnZlciwgcmVjaXBlX21vZGVsLCBwYWNrYWdlX21vZGVsKToKKyAgICAgICAgc3VwZXIoSG9iSGFuZGxlciwgc2VsZikuX19pbml0X18oKQorCisgICAgICAgIHNlbGYuYnVpbGQgPSBSdW5uaW5nQnVpbGQoc2VxdWVudGlhbD1UcnVlKQorCisgICAgICAgIHNlbGYucmVjaXBlX21vZGVsID0gcmVjaXBlX21vZGVsCisgICAgICAgIHNlbGYucGFja2FnZV9tb2RlbCA9IHBhY2thZ2VfbW9kZWwKKworICAgICAgICBzZWxmLmNvbW1hbmRzX2FzeW5jID0gW10KKyAgICAgICAgc2VsZi5nZW5lcmF0aW5nID0gRmFsc2UKKyAgICAgICAgc2VsZi5jdXJyZW50X3BoYXNlID0gTm9uZQorICAgICAgICBzZWxmLmJ1aWxkaW5nID0gRmFsc2UKKyAgICAgICAgc2VsZi5yZWNpcGVfcXVldWUgPSBbXQorICAgICAgICBzZWxmLnBhY2thZ2VfcXVldWUgPSBbXQorCisgICAgICAgIHNlbGYuc2VydmVyID0gc2VydmVyCisgICAgICAgIHNlbGYuZXJyb3JfbXNnID0gIiIKKyAgICAgICAgc2VsZi5pbml0Y21kID0gTm9uZQorICAgICAgICBzZWxmLnBhcnNpbmcgPSBGYWxzZQorCisgICAgZGVmIHNldF9idXN5KHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5nZW5lcmF0aW5nOgorICAgICAgICAgICAgc2VsZi5lbWl0KCJnZW5lcmF0aW5nLWRhdGEiKQorICAgICAgICAgICAgc2VsZi5nZW5lcmF0aW5nID0gVHJ1ZQorCisgICAgZGVmIGNsZWFyX2J1c3koc2VsZik6CisgICAgICAgIGlmIHNlbGYuZ2VuZXJhdGluZzoKKyAgICAgICAgICAgIHNlbGYuZW1pdCgiZGF0YS1nZW5lcmF0ZWQiKQorICAgICAgICAgICAgc2VsZi5nZW5lcmF0aW5nID0gRmFsc2UKKworICAgIGRlZiBydW5Db21tYW5kKHNlbGYsIGNvbW1hbmRsaW5lKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzdWx0LCBlcnJvciA9IHNlbGYuc2VydmVyLnJ1bkNvbW1hbmQoY29tbWFuZGxpbmUpCisgICAgICAgICAgICBpZiBlcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIkVycm9yIHJ1bm5pbmcgY29tbWFuZCAnJXMnOiAlcyIgJSAoY29tbWFuZGxpbmUsIGVycm9yKSkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgc2VsZi5jb21tYW5kc19hc3luYyA9IFtdCisgICAgICAgICAgICBzZWxmLmNsZWFyX2J1c3koKQorICAgICAgICAgICAgc2VsZi5lbWl0KCJjb21tYW5kLWZhaWxlZCIsICJIb2IgRXhjZXB0aW9uIC0gJXMiICUgKHN0cihlKSkpCisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIHJ1bl9uZXh0X2NvbW1hbmQoc2VsZiwgaW5pdGNtZD1Ob25lKToKKyAgICAgICAgaWYgaW5pdGNtZCAhPSBOb25lOgorICAgICAgICAgICAgc2VsZi5pbml0Y21kID0gaW5pdGNtZAorCisgICAgICAgIGlmIHNlbGYuY29tbWFuZHNfYXN5bmM6CisgICAgICAgICAgICBzZWxmLnNldF9idXN5KCkKKyAgICAgICAgICAgIG5leHRfY29tbWFuZCA9IHNlbGYuY29tbWFuZHNfYXN5bmMucG9wKDApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmNsZWFyX2J1c3koKQorICAgICAgICAgICAgaWYgc2VsZi5pbml0Y21kICE9IE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5lbWl0KCJjb21tYW5kLXN1Y2NlZWRlZCIsIHNlbGYuaW5pdGNtZCkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIG5leHRfY29tbWFuZCA9PSBzZWxmLlNVQl9QQVRIX0xBWUVSUzoKKyAgICAgICAgICAgIHNlbGYucnVuQ29tbWFuZChbImZpbmRDb25maWdGaWxlUGF0aCIsICJiYmxheWVycy5jb25mIl0pCisgICAgICAgIGVsaWYgbmV4dF9jb21tYW5kID09IHNlbGYuU1VCX0ZJTEVTX0RJU1RSTzoKKyAgICAgICAgICAgIHNlbGYucnVuQ29tbWFuZChbImZpbmRDb25maWdGaWxlcyIsICJESVNUUk8iXSkKKyAgICAgICAgZWxpZiBuZXh0X2NvbW1hbmQgPT0gc2VsZi5TVUJfRklMRVNfTUFDSDoKKyAgICAgICAgICAgIHNlbGYucnVuQ29tbWFuZChbImZpbmRDb25maWdGaWxlcyIsICJNQUNISU5FIl0pCisgICAgICAgIGVsaWYgbmV4dF9jb21tYW5kID09IHNlbGYuU1VCX0ZJTEVTX1NES01BQ0g6CisgICAgICAgICAgICBzZWxmLnJ1bkNvbW1hbmQoWyJmaW5kQ29uZmlnRmlsZXMiLCAiTUFDSElORS1TREsiXSkKKyAgICAgICAgZWxpZiBuZXh0X2NvbW1hbmQgPT0gc2VsZi5TVUJfTUFUQ0hfQ0xBU1M6CisgICAgICAgICAgICBzZWxmLnJ1bkNvbW1hbmQoWyJmaW5kRmlsZXNNYXRjaGluZ0luRGlyIiwgInJvb3Rmc18iLCAiY2xhc3NlcyJdKQorICAgICAgICBlbGlmIG5leHRfY29tbWFuZCA9PSBzZWxmLlNVQl9QQVJTRV9DT05GSUc6CisgICAgICAgICAgICBzZWxmLnJ1bkNvbW1hbmQoWyJyZXNldENvb2tlciJdKQorICAgICAgICBlbGlmIG5leHRfY29tbWFuZCA9PSBzZWxmLlNVQl9HTkVSQVRFX1RHVFM6CisgICAgICAgICAgICBzZWxmLnJ1bkNvbW1hbmQoWyJnZW5lcmF0ZVRhcmdldHNUcmVlIiwgImNsYXNzZXMvaW1hZ2UuYmJjbGFzcyIsIFtdXSkKKyAgICAgICAgZWxpZiBuZXh0X2NvbW1hbmQgPT0gc2VsZi5TVUJfR0VORVJBVEVfUEtHSU5GTzoKKyAgICAgICAgICAgIHNlbGYucnVuQ29tbWFuZChbInRyaWdnZXJFdmVudCIsICJiYi5ldmVudC5SZXF1ZXN0UGFja2FnZUluZm8oKSJdKQorICAgICAgICBlbGlmIG5leHRfY29tbWFuZCA9PSBzZWxmLlNVQl9TQU5JVFlfQ0hFQ0s6CisgICAgICAgICAgICBzZWxmLnJ1bkNvbW1hbmQoWyJ0cmlnZ2VyRXZlbnQiLCAiYmIuZXZlbnQuU2FuaXR5Q2hlY2soKSJdKQorICAgICAgICBlbGlmIG5leHRfY29tbWFuZCA9PSBzZWxmLlNVQl9ORVRXT1JLX1RFU1Q6CisgICAgICAgICAgICBzZWxmLnJ1bkNvbW1hbmQoWyJ0cmlnZ2VyRXZlbnQiLCAiYmIuZXZlbnQuTmV0d29ya1Rlc3QoKSJdKQorICAgICAgICBlbGlmIG5leHRfY29tbWFuZCA9PSBzZWxmLlNVQl9CVUlMRF9SRUNJUEVTOgorICAgICAgICAgICAgc2VsZi5jbGVhcl9idXN5KCkKKyAgICAgICAgICAgIHNlbGYuYnVpbGRpbmcgPSBUcnVlCisgICAgICAgICAgICBzZWxmLnJ1bkNvbW1hbmQoWyJidWlsZFRhcmdldHMiLCBzZWxmLnJlY2lwZV9xdWV1ZSwgc2VsZi5kZWZhdWx0X3Rhc2tdKQorICAgICAgICAgICAgc2VsZi5yZWNpcGVfcXVldWUgPSBbXQorICAgICAgICBlbGlmIG5leHRfY29tbWFuZCA9PSBzZWxmLlNVQl9CVUlMRF9JTUFHRToKKyAgICAgICAgICAgIHNlbGYuY2xlYXJfYnVzeSgpCisgICAgICAgICAgICBzZWxmLmJ1aWxkaW5nID0gVHJ1ZQorICAgICAgICAgICAgdGFyZ2V0ID0gc2VsZi5pbWFnZQorCisgICAgICAgICAgICBpZiBzZWxmLmJhc2VfaW1hZ2U6CisgICAgICAgICAgICAgICAgIyBSZXF1ZXN0IHRoZSBidWlsZCBvZiBhIGN1c3RvbSBpbWFnZQorICAgICAgICAgICAgICAgIHNlbGYuZ2VuZXJhdGVfaG9iX2Jhc2VfaW1hZ2UodGFyZ2V0KQorICAgICAgICAgICAgICAgIHNlbGYuc2V0X3Zhcl9pbl9maWxlKCJMSU5HVUFTX0lOU1RBTEwiLCAiIiwgImxvY2FsLmNvbmYiKQorICAgICAgICAgICAgICAgIGhvYkltYWdlID0gc2VsZi5ydW5Db21tYW5kKFsibWF0Y2hGaWxlIiwgdGFyZ2V0ICsgIi5iYiJdKQorICAgICAgICAgICAgICAgIGlmIHNlbGYuYmFzZV9pbWFnZSAhPSBzZWxmLnJlY2lwZV9tb2RlbC5fX2N1c3RvbV9pbWFnZV9fOgorICAgICAgICAgICAgICAgICAgICBiYXNlSW1hZ2UgPSBzZWxmLnJ1bkNvbW1hbmQoWyJtYXRjaEZpbGUiLCBzZWxmLmJhc2VfaW1hZ2UgKyAiLmJiIl0pCisgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gPSBzZWxmLnJ1bkNvbW1hbmQoWyJnZW5lcmF0ZU5ld0ltYWdlIiwgaG9iSW1hZ2UsIGJhc2VJbWFnZSwgc2VsZi5wYWNrYWdlX3F1ZXVlLCBUcnVlLCAiIl0pCisgICAgICAgICAgICAgICAgICAgIHRhcmdldCArPSB2ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgIHNlbGYucmVjaXBlX21vZGVsLnNldF9jdXN0b21faW1hZ2VfdmVyc2lvbih2ZXJzaW9uKQorCisgICAgICAgICAgICB0YXJnZXRzID0gW3RhcmdldF0KKyAgICAgICAgICAgIGlmIHNlbGYudG9vbGNoYWluX3BhY2thZ2VzOgorICAgICAgICAgICAgICAgIHNlbGYuc2V0X3Zhcl9pbl9maWxlKCJUT09MQ0hBSU5fVEFSR0VUX1RBU0siLCAiICIuam9pbihzZWxmLnRvb2xjaGFpbl9wYWNrYWdlcyksICJsb2NhbC5jb25mIikKKyAgICAgICAgICAgICAgICB0YXJnZXRzLmFwcGVuZCh0YXJnZXQgKyAiOmRvX3BvcHVsYXRlX3NkayIpCisKKyAgICAgICAgICAgIHNlbGYucnVuQ29tbWFuZChbImJ1aWxkVGFyZ2V0cyIsIHRhcmdldHMsIHNlbGYuZGVmYXVsdF90YXNrXSkKKworICAgIGRlZiBkaXNwbGF5X2Vycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmNsZWFyX2J1c3koKQorICAgICAgICBzZWxmLmVtaXQoImNvbW1hbmQtZmFpbGVkIiwgc2VsZi5lcnJvcl9tc2cpCisgICAgICAgIHNlbGYuZXJyb3JfbXNnID0gIiIKKyAgICAgICAgaWYgc2VsZi5idWlsZGluZzoKKyAgICAgICAgICAgIHNlbGYuYnVpbGRpbmcgPSBGYWxzZQorCisgICAgZGVmIGhhbmRsZV9ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgIGlmIG5vdCBldmVudDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLmJ1aWxkaW5nOgorICAgICAgICAgICAgc2VsZi5jdXJyZW50X3BoYXNlID0gImJ1aWxkaW5nIgorICAgICAgICAgICAgc2VsZi5idWlsZC5oYW5kbGVfZXZlbnQoZXZlbnQpCisKKyAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuUGFja2FnZUluZm8pOgorICAgICAgICAgICAgc2VsZi5wYWNrYWdlX21vZGVsLnBvcHVsYXRlKGV2ZW50Ll9wa2dpbmZvbGlzdCkKKyAgICAgICAgICAgIHNlbGYuZW1pdCgicGFja2FnZS1wb3B1bGF0ZWQiKQorICAgICAgICAgICAgc2VsZi5ydW5fbmV4dF9jb21tYW5kKCkKKworICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LlNhbml0eUNoZWNrUGFzc2VkKToKKyAgICAgICAgICAgIHJlcGFyc2UgPSBzZWxmLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJCQl9JTlZBTElEQ09ORiJdKSBvciBOb25lCisgICAgICAgICAgICBpZiByZXBhcnNlIGlzIFRydWU6CisgICAgICAgICAgICAgICAgc2VsZi5zZXRfdmFyX2luX2ZpbGUoIkJCX0lOVkFMSURDT05GIiwgRmFsc2UsICJsb2NhbC5jb25mIikKKyAgICAgICAgICAgICAgICBzZWxmLnJ1bkNvbW1hbmQoWyJzZXRQcmVQb3N0Q29uZkZpbGVzIiwgImNvbmYvLmhvYi5jb25mIiwgIiJdKQorICAgICAgICAgICAgICAgIHNlbGYuY29tbWFuZHNfYXN5bmMucHJlcGVuZChzZWxmLlNVQl9QQVJTRV9DT05GSUcpCisgICAgICAgICAgICBzZWxmLnJ1bl9uZXh0X2NvbW1hbmQoKQorCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuU2FuaXR5Q2hlY2tGYWlsZWQpOgorICAgICAgICAgICAgc2VsZi5lbWl0KCJzYW5pdHktZmFpbGVkIiwgZXZlbnQuX21zZywgZXZlbnQuX25ldHdvcmtfZXJyb3IpCisKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGV2ZW50LCBsb2dnaW5nLkxvZ1JlY29yZCk6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5idWlsZGluZzoKKyAgICAgICAgICAgICAgICBpZiBldmVudC5sZXZlbG5vID49IGxvZ2dpbmcuRVJST1I6CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlciA9IGJiLm1zZy5CQkxvZ0Zvcm1hdHRlcigpCisgICAgICAgICAgICAgICAgICAgIG1zZyA9IGZvcm1hdHRlci5mb3JtYXQoZXZlbnQpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JfbXNnICs9IG1zZyArICdcbicKKyAgICAgICAgICAgICAgICBlbGlmIGV2ZW50LmxldmVsbm8gPj0gbG9nZ2luZy5XQVJOSU5HIGFuZCBzZWxmLnBhcnNpbmcgPT0gVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVyID0gYmIubXNnLkJCTG9nRm9ybWF0dGVyKCkKKyAgICAgICAgICAgICAgICAgICAgbXNnID0gZm9ybWF0dGVyLmZvcm1hdChldmVudCkKKyAgICAgICAgICAgICAgICAgICAgd2Fybl9tc2cgPSBtc2cgKyAnXG4nCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgicGFyc2luZy13YXJuaW5nIiwgd2Fybl9tc2cpCisKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5UYXJnZXRzVHJlZUdlbmVyYXRlZCk6CisgICAgICAgICAgICBzZWxmLmN1cnJlbnRfcGhhc2UgPSAiZGF0YSBnZW5lcmF0aW9uIgorICAgICAgICAgICAgaWYgZXZlbnQuX21vZGVsOgorICAgICAgICAgICAgICAgIHNlbGYucmVjaXBlX21vZGVsLnBvcHVsYXRlKGV2ZW50Ll9tb2RlbCkKKyAgICAgICAgICAgICAgICBzZWxmLmVtaXQoInJlY2lwZS1wb3B1bGF0ZWQiKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LkNvbmZpZ0ZpbGVzRm91bmQpOgorICAgICAgICAgICAgc2VsZi5jdXJyZW50X3BoYXNlID0gImNvbmZpZ3VyYXRpb24gbG9va3VwIgorICAgICAgICAgICAgdmFyID0gZXZlbnQuX3ZhcmlhYmxlCisgICAgICAgICAgICB2YWx1ZXMgPSBldmVudC5fdmFsdWVzCisgICAgICAgICAgICB2YWx1ZXMuc29ydCgpCisgICAgICAgICAgICBzZWxmLmVtaXQoImNvbmZpZy11cGRhdGVkIiwgdmFyLCB2YWx1ZXMpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuQ29uZmlnRmlsZVBhdGhGb3VuZCk6CisgICAgICAgICAgICBzZWxmLmN1cnJlbnRfcGhhc2UgPSAiY29uZmlndXJhdGlvbiBsb29rdXAiCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuRmlsZXNNYXRjaGluZ0ZvdW5kKToKKyAgICAgICAgICAgIHNlbGYuY3VycmVudF9waGFzZSA9ICJjb25maWd1cmF0aW9uIGxvb2t1cCIKKyAgICAgICAgICAgICMgRklYTUU6IGhhcmQgY29kaW5nLCBzaG91bGQgYXQgbGVhc3QgYmUgYSB2YXJpYWJsZSBzaGFyZWQgYmV0d2VlbgorICAgICAgICAgICAgIyBoZXJlIGFuZCB0aGUgY2FsbGVyCisgICAgICAgICAgICBpZiBldmVudC5fcGF0dGVybiA9PSAicm9vdGZzXyI6CisgICAgICAgICAgICAgICAgZm9ybWF0cyA9IFtdCisgICAgICAgICAgICAgICAgZm9yIG1hdGNoIGluIGV2ZW50Ll9tYXRjaGVzOgorICAgICAgICAgICAgICAgICAgICBjbGFzc25hbWUsIHNlcCwgY2xzID0gbWF0Y2gucnBhcnRpdGlvbigiLiIpCisgICAgICAgICAgICAgICAgICAgIGZzLCBzZXAsIGZvcm1hdCA9IGNsYXNzbmFtZS5ycGFydGl0aW9uKCJfIikKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0cy5hcHBlbmQoZm9ybWF0KQorICAgICAgICAgICAgICAgIGZvcm1hdHMuc29ydCgpCisgICAgICAgICAgICAgICAgc2VsZi5lbWl0KCJwYWNrYWdlLWZvcm1hdHMtdXBkYXRlZCIsIGZvcm1hdHMpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShldmVudCwgYmIuY29tbWFuZC5Db21tYW5kQ29tcGxldGVkKToKKyAgICAgICAgICAgIHNlbGYuY3VycmVudF9waGFzZSA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYucnVuX25leHRfY29tbWFuZCgpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShldmVudCwgYmIuY29tbWFuZC5Db21tYW5kRmFpbGVkKToKKyAgICAgICAgICAgIGlmIGV2ZW50LmVycm9yIG5vdCBpbiAoIkZvcmNlZCBzaHV0ZG93biIsICJTdG9wcGVkIGJ1aWxkIik6CisgICAgICAgICAgICAgICAgc2VsZi5lcnJvcl9tc2cgKz0gZXZlbnQuZXJyb3IKKyAgICAgICAgICAgIHNlbGYuY29tbWFuZHNfYXN5bmMgPSBbXQorICAgICAgICAgICAgc2VsZi5kaXNwbGF5X2Vycm9yKCkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGV2ZW50LCAoYmIuZXZlbnQuUGFyc2VTdGFydGVkLAorICAgICAgICAgICAgICAgICBiYi5ldmVudC5DYWNoZUxvYWRTdGFydGVkLAorICAgICAgICAgICAgICAgICBiYi5ldmVudC5UcmVlRGF0YVByZXBhcmF0aW9uU3RhcnRlZCwKKyAgICAgICAgICAgICAgICAgKSk6CisgICAgICAgICAgICBtZXNzYWdlID0ge30KKyAgICAgICAgICAgIG1lc3NhZ2VbImV2ZW50bmFtZSJdID0gYmIuZXZlbnQuZ2V0TmFtZShldmVudCkKKyAgICAgICAgICAgIG1lc3NhZ2VbImN1cnJlbnQiXSA9IDAKKyAgICAgICAgICAgIG1lc3NhZ2VbInRvdGFsIl0gPSBOb25lCisgICAgICAgICAgICBtZXNzYWdlWyJ0aXRsZSJdID0gIlBhcnNpbmcgcmVjaXBlcyIKKyAgICAgICAgICAgIHNlbGYuZW1pdCgicGFyc2luZy1zdGFydGVkIiwgbWVzc2FnZSkKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LlBhcnNlU3RhcnRlZCk6CisgICAgICAgICAgICAgICAgc2VsZi5wYXJzaW5nID0gVHJ1ZQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZXZlbnQsIChiYi5ldmVudC5QYXJzZVByb2dyZXNzLAorICAgICAgICAgICAgICAgIGJiLmV2ZW50LkNhY2hlTG9hZFByb2dyZXNzLAorICAgICAgICAgICAgICAgIGJiLmV2ZW50LlRyZWVEYXRhUHJlcGFyYXRpb25Qcm9ncmVzcykpOgorICAgICAgICAgICAgbWVzc2FnZSA9IHt9CisgICAgICAgICAgICBtZXNzYWdlWyJldmVudG5hbWUiXSA9IGJiLmV2ZW50LmdldE5hbWUoZXZlbnQpCisgICAgICAgICAgICBtZXNzYWdlWyJjdXJyZW50Il0gPSBldmVudC5jdXJyZW50CisgICAgICAgICAgICBtZXNzYWdlWyJ0b3RhbCJdID0gZXZlbnQudG90YWwKKyAgICAgICAgICAgIG1lc3NhZ2VbInRpdGxlIl0gPSAiUGFyc2luZyByZWNpcGVzIgorICAgICAgICAgICAgc2VsZi5lbWl0KCJwYXJzaW5nIiwgbWVzc2FnZSkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGV2ZW50LCAoYmIuZXZlbnQuUGFyc2VDb21wbGV0ZWQsCisgICAgICAgICAgICAgICAgYmIuZXZlbnQuQ2FjaGVMb2FkQ29tcGxldGVkLAorICAgICAgICAgICAgICAgIGJiLmV2ZW50LlRyZWVEYXRhUHJlcGFyYXRpb25Db21wbGV0ZWQpKToKKyAgICAgICAgICAgIG1lc3NhZ2UgPSB7fQorICAgICAgICAgICAgbWVzc2FnZVsiZXZlbnRuYW1lIl0gPSBiYi5ldmVudC5nZXROYW1lKGV2ZW50KQorICAgICAgICAgICAgbWVzc2FnZVsiY3VycmVudCJdID0gZXZlbnQudG90YWwKKyAgICAgICAgICAgIG1lc3NhZ2VbInRvdGFsIl0gPSBldmVudC50b3RhbAorICAgICAgICAgICAgbWVzc2FnZVsidGl0bGUiXSA9ICJQYXJzaW5nIHJlY2lwZXMiCisgICAgICAgICAgICBzZWxmLmVtaXQoInBhcnNpbmctY29tcGxldGVkIiwgbWVzc2FnZSkKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LlBhcnNlQ29tcGxldGVkKToKKyAgICAgICAgICAgICAgICBzZWxmLnBhcnNpbmcgPSBGYWxzZQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50Lk5ldHdvcmtUZXN0RmFpbGVkKToKKyAgICAgICAgICAgIHNlbGYuZW1pdCgibmV0d29yay1mYWlsZWQiKQorICAgICAgICAgICAgc2VsZi5ydW5fbmV4dF9jb21tYW5kKCkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5OZXR3b3JrVGVzdFBhc3NlZCk6CisgICAgICAgICAgICBzZWxmLmVtaXQoIm5ldHdvcmstcGFzc2VkIikKKyAgICAgICAgICAgIHNlbGYucnVuX25leHRfY29tbWFuZCgpCisKKyAgICAgICAgaWYgc2VsZi5lcnJvcl9tc2cgYW5kIG5vdCBzZWxmLmNvbW1hbmRzX2FzeW5jOgorICAgICAgICAgICAgc2VsZi5kaXNwbGF5X2Vycm9yKCkKKworICAgICAgICByZXR1cm4KKworICAgIGRlZiBpbml0X2Nvb2tlcihzZWxmKToKKyAgICAgICAgc2VsZi5ydW5Db21tYW5kKFsiY3JlYXRlQ29uZmlnRmlsZSIsICIuaG9iLmNvbmYiXSkKKworICAgIGRlZiBzZXRfZXh0cmFfaW5oZXJpdChzZWxmLCBiYmNsYXNzKToKKyAgICAgICAgc2VsZi5hcHBlbmRfdmFyX2luX2ZpbGUoIklOSEVSSVQiLCBiYmNsYXNzLCAiLmhvYi5jb25mIikKKworICAgIGRlZiBzZXRfYmJsYXllcnMoc2VsZiwgYmJsYXllcnMpOgorICAgICAgICBzZWxmLnNldF92YXJfaW5fZmlsZSgiQkJMQVlFUlMiLCAiICIuam9pbihiYmxheWVycyksICJiYmxheWVycy5jb25mIikKKworICAgIGRlZiBzZXRfbWFjaGluZShzZWxmLCBtYWNoaW5lKToKKyAgICAgICAgaWYgbWFjaGluZToKKyAgICAgICAgICAgIHNlbGYuZWFybHlfYXNzaWduX3Zhcl9pbl9maWxlKCJNQUNISU5FIiwgbWFjaGluZSwgImxvY2FsLmNvbmYiKQorCisgICAgZGVmIHNldF9zZGtfbWFjaGluZShzZWxmLCBzZGtfbWFjaGluZSk6CisgICAgICAgIHNlbGYuc2V0X3Zhcl9pbl9maWxlKCJTREtNQUNISU5FIiwgc2RrX21hY2hpbmUsICJsb2NhbC5jb25mIikKKworICAgIGRlZiBzZXRfaW1hZ2VfZnN0eXBlcyhzZWxmLCBpbWFnZV9mc3R5cGVzKToKKyAgICAgICAgc2VsZi5zZXRfdmFyX2luX2ZpbGUoIklNQUdFX0ZTVFlQRVMiLCBpbWFnZV9mc3R5cGVzLCAibG9jYWwuY29uZiIpCisKKyAgICBkZWYgc2V0X2Rpc3RybyhzZWxmLCBkaXN0cm8pOgorICAgICAgICBzZWxmLnNldF92YXJfaW5fZmlsZSgiRElTVFJPIiwgZGlzdHJvLCAibG9jYWwuY29uZiIpCisKKyAgICBkZWYgc2V0X3BhY2thZ2VfZm9ybWF0KHNlbGYsIGZvcm1hdCk6CisgICAgICAgIHBhY2thZ2VfY2xhc3NlcyA9ICIiCisgICAgICAgIGZvciBwa2dmbXQgaW4gZm9ybWF0LnNwbGl0KCk6CisgICAgICAgICAgICBwYWNrYWdlX2NsYXNzZXMgKz0gKCJwYWNrYWdlXyVzIiAlIHBrZ2ZtdCArICIgIikKKyAgICAgICAgc2VsZi5zZXRfdmFyX2luX2ZpbGUoIlBBQ0tBR0VfQ0xBU1NFUyIsIHBhY2thZ2VfY2xhc3NlcywgImxvY2FsLmNvbmYiKQorCisgICAgZGVmIHNldF9iYnRocmVhZHMoc2VsZiwgdGhyZWFkcyk6CisgICAgICAgIHNlbGYuc2V0X3Zhcl9pbl9maWxlKCJCQl9OVU1CRVJfVEhSRUFEUyIsIHRocmVhZHMsICJsb2NhbC5jb25mIikKKworICAgIGRlZiBzZXRfcG1ha2Uoc2VsZiwgdGhyZWFkcyk6CisgICAgICAgIHBtYWtlID0gIi1qICVzIiAlIHRocmVhZHMKKyAgICAgICAgc2VsZi5zZXRfdmFyX2luX2ZpbGUoIlBBUkFMTEVMX01BS0UiLCBwbWFrZSwgImxvY2FsLmNvbmYiKQorCisgICAgZGVmIHNldF9kbF9kaXIoc2VsZiwgZGlyZWN0b3J5KToKKyAgICAgICAgc2VsZi5zZXRfdmFyX2luX2ZpbGUoIkRMX0RJUiIsIGRpcmVjdG9yeSwgImxvY2FsLmNvbmYiKQorCisgICAgZGVmIHNldF9zc3RhdGVfZGlyKHNlbGYsIGRpcmVjdG9yeSk6CisgICAgICAgIHNlbGYuc2V0X3Zhcl9pbl9maWxlKCJTU1RBVEVfRElSIiwgZGlyZWN0b3J5LCAibG9jYWwuY29uZiIpCisKKyAgICBkZWYgc2V0X3NzdGF0ZV9taXJyb3JzKHNlbGYsIHVybCk6CisgICAgICAgIHNlbGYuc2V0X3Zhcl9pbl9maWxlKCJTU1RBVEVfTUlSUk9SUyIsIHVybCwgImxvY2FsLmNvbmYiKQorCisgICAgZGVmIHNldF9leHRyYV9zaXplKHNlbGYsIGltYWdlX2V4dHJhX3NpemUpOgorICAgICAgICBzZWxmLnNldF92YXJfaW5fZmlsZSgiSU1BR0VfUk9PVEZTX0VYVFJBX1NQQUNFIiwgc3RyKGltYWdlX2V4dHJhX3NpemUpLCAibG9jYWwuY29uZiIpCisKKyAgICBkZWYgc2V0X3Jvb3Rmc19zaXplKHNlbGYsIGltYWdlX3Jvb3Rmc19zaXplKToKKyAgICAgICAgc2VsZi5zZXRfdmFyX2luX2ZpbGUoIklNQUdFX1JPT1RGU19TSVpFIiwgc3RyKGltYWdlX3Jvb3Rmc19zaXplKSwgImxvY2FsLmNvbmYiKQorCisgICAgZGVmIHNldF9pbmNvbXBhdGlibGVfbGljZW5zZShzZWxmLCBpbmNvbXBhdF9saWNlbnNlKToKKyAgICAgICAgc2VsZi5zZXRfdmFyX2luX2ZpbGUoIklOQ09NUEFUSUJMRV9MSUNFTlNFIiwgaW5jb21wYXRfbGljZW5zZSwgImxvY2FsLmNvbmYiKQorCisgICAgZGVmIHNldF9leHRyYV9zZXR0aW5nKHNlbGYsIGV4dHJhX3NldHRpbmcpOgorICAgICAgICBzZWxmLnNldF92YXJfaW5fZmlsZSgiRVhUUkFfU0VUVElORyIsIGV4dHJhX3NldHRpbmcsICJsb2NhbC5jb25mIikKKworICAgIGRlZiBzZXRfZXh0cmFfY29uZmlnKHNlbGYsIGV4dHJhX3NldHRpbmcpOgorICAgICAgICBvbGRfZXh0cmFfc2V0dGluZyA9IHNlbGYucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIkVYVFJBX1NFVFRJTkciXSkgb3Ige30KKyAgICAgICAgb2xkX2V4dHJhX3NldHRpbmcgPSBzdHIob2xkX2V4dHJhX3NldHRpbmcpCisKKyAgICAgICAgb2xkX2V4dHJhX3NldHRpbmcgPSBhc3QubGl0ZXJhbF9ldmFsKG9sZF9leHRyYV9zZXR0aW5nKQorICAgICAgICBpZiBub3QgdHlwZShvbGRfZXh0cmFfc2V0dGluZykgPT0gZGljdDoKKyAgICAgICAgICAgIG9sZF9leHRyYV9zZXR0aW5nID0ge30KKworICAgICAgICAjIHNldHRpbmdzIG5vdCBjaGFuZ2VkCisgICAgICAgIGlmIG9sZF9leHRyYV9zZXR0aW5nID09IGV4dHJhX3NldHRpbmc6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIHJlbW92ZSB0aGUgb2xkIEVYVFJBIFNFVFRJTkcgdmFyaWFibGUKKyAgICAgICAgc2VsZi5yZW1vdmVfdmFyX2Zyb21fZmlsZSgiRVhUUkFfU0VUVElORyIpCisKKyAgICAgICAgIyByZW1vdmUgb2xkIHNldHRpbmdzIGZyb20gY29uZgorICAgICAgICBmb3Iga2V5IGluIG9sZF9leHRyYV9zZXR0aW5nLmtleXMoKToKKyAgICAgICAgICAgIGlmIGtleSBub3QgaW4gZXh0cmFfc2V0dGluZzoKKyAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZV92YXJfZnJvbV9maWxlKGtleSkKKworICAgICAgICAjIGFkZCBuZXcgc2V0dGluZ3MKKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gZXh0cmFfc2V0dGluZy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIHNlbGYuc2V0X3Zhcl9pbl9maWxlKGtleSwgdmFsdWUsICJsb2NhbC5jb25mIikKKworICAgICAgICBpZiBleHRyYV9zZXR0aW5nOgorICAgICAgICAgICAgc2VsZi5zZXRfdmFyX2luX2ZpbGUoIkVYVFJBX1NFVFRJTkciLCBleHRyYV9zZXR0aW5nLCAibG9jYWwuY29uZiIpCisKKyAgICBkZWYgc2V0X2h0dHBfcHJveHkoc2VsZiwgaHR0cF9wcm94eSk6CisgICAgICAgIHNlbGYuc2V0X3Zhcl9pbl9maWxlKCJodHRwX3Byb3h5IiwgaHR0cF9wcm94eSwgImxvY2FsLmNvbmYiKQorCisgICAgZGVmIHNldF9odHRwc19wcm94eShzZWxmLCBodHRwc19wcm94eSk6CisgICAgICAgIHNlbGYuc2V0X3Zhcl9pbl9maWxlKCJodHRwc19wcm94eSIsIGh0dHBzX3Byb3h5LCAibG9jYWwuY29uZiIpCisKKyAgICBkZWYgc2V0X2Z0cF9wcm94eShzZWxmLCBmdHBfcHJveHkpOgorICAgICAgICBzZWxmLnNldF92YXJfaW5fZmlsZSgiZnRwX3Byb3h5IiwgZnRwX3Byb3h5LCAibG9jYWwuY29uZiIpCisKKyAgICBkZWYgc2V0X3NvY2tzX3Byb3h5KHNlbGYsIHNvY2tzX3Byb3h5KToKKyAgICAgICAgc2VsZi5zZXRfdmFyX2luX2ZpbGUoImFsbF9wcm94eSIsIHNvY2tzX3Byb3h5LCAibG9jYWwuY29uZiIpCisKKyAgICBkZWYgc2V0X2N2c19wcm94eShzZWxmLCBob3N0LCBwb3J0KToKKyAgICAgICAgc2VsZi5zZXRfdmFyX2luX2ZpbGUoIkNWU19QUk9YWV9IT1NUIiwgaG9zdCwgImxvY2FsLmNvbmYiKQorICAgICAgICBzZWxmLnNldF92YXJfaW5fZmlsZSgiQ1ZTX1BST1hZX1BPUlQiLCBwb3J0LCAibG9jYWwuY29uZiIpCisKKyAgICBkZWYgcmVxdWVzdF9wYWNrYWdlX2luZm8oc2VsZik6CisgICAgICAgIHNlbGYuY29tbWFuZHNfYXN5bmMuYXBwZW5kKHNlbGYuU1VCX0dFTkVSQVRFX1BLR0lORk8pCisgICAgICAgIHNlbGYucnVuX25leHRfY29tbWFuZChzZWxmLlBPUFVMQVRFX1BBQ0tBR0VJTkZPKQorCisgICAgZGVmIHRyaWdnZXJfc2FuaXR5X2NoZWNrKHNlbGYpOgorICAgICAgICBzZWxmLmNvbW1hbmRzX2FzeW5jLmFwcGVuZChzZWxmLlNVQl9TQU5JVFlfQ0hFQ0spCisgICAgICAgIHNlbGYucnVuX25leHRfY29tbWFuZChzZWxmLlNBTklUWV9DSEVDSykKKworICAgIGRlZiB0cmlnZ2VyX25ldHdvcmtfdGVzdChzZWxmKToKKyAgICAgICAgc2VsZi5jb21tYW5kc19hc3luYy5hcHBlbmQoc2VsZi5TVUJfTkVUV09SS19URVNUKQorICAgICAgICBzZWxmLnJ1bl9uZXh0X2NvbW1hbmQoc2VsZi5ORVRXT1JLX1RFU1QpCisKKyAgICBkZWYgZ2VuZXJhdGVfY29uZmlndXJhdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5ydW5Db21tYW5kKFsic2V0UHJlUG9zdENvbmZGaWxlcyIsICJjb25mLy5ob2IuY29uZiIsICIiXSkKKyAgICAgICAgc2VsZi5jb21tYW5kc19hc3luYy5hcHBlbmQoc2VsZi5TVUJfUEFSU0VfQ09ORklHKQorICAgICAgICBzZWxmLmNvbW1hbmRzX2FzeW5jLmFwcGVuZChzZWxmLlNVQl9QQVRIX0xBWUVSUykKKyAgICAgICAgc2VsZi5jb21tYW5kc19hc3luYy5hcHBlbmQoc2VsZi5TVUJfRklMRVNfRElTVFJPKQorICAgICAgICBzZWxmLmNvbW1hbmRzX2FzeW5jLmFwcGVuZChzZWxmLlNVQl9GSUxFU19NQUNIKQorICAgICAgICBzZWxmLmNvbW1hbmRzX2FzeW5jLmFwcGVuZChzZWxmLlNVQl9GSUxFU19TREtNQUNIKQorICAgICAgICBzZWxmLmNvbW1hbmRzX2FzeW5jLmFwcGVuZChzZWxmLlNVQl9NQVRDSF9DTEFTUykKKyAgICAgICAgc2VsZi5ydW5fbmV4dF9jb21tYW5kKHNlbGYuR0VORVJBVEVfQ09ORklHVVJBVElPTikKKworICAgIGRlZiBnZW5lcmF0ZV9yZWNpcGVzKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bkNvbW1hbmQoWyJzZXRQcmVQb3N0Q29uZkZpbGVzIiwgImNvbmYvLmhvYi5jb25mIiwgIiJdKQorICAgICAgICBzZWxmLmNvbW1hbmRzX2FzeW5jLmFwcGVuZChzZWxmLlNVQl9QQVJTRV9DT05GSUcpCisgICAgICAgIHNlbGYuY29tbWFuZHNfYXN5bmMuYXBwZW5kKHNlbGYuU1VCX0dORVJBVEVfVEdUUykKKyAgICAgICAgc2VsZi5ydW5fbmV4dF9jb21tYW5kKHNlbGYuR0VORVJBVEVfUkVDSVBFUykKKworICAgIGRlZiBnZW5lcmF0ZV9wYWNrYWdlcyhzZWxmLCB0Z3RzLCBkZWZhdWx0X3Rhc2s9ImJ1aWxkIik6CisgICAgICAgIHRhcmdldHMgPSBbXQorICAgICAgICB0YXJnZXRzLmV4dGVuZCh0Z3RzKQorICAgICAgICBzZWxmLnJlY2lwZV9xdWV1ZSA9IHRhcmdldHMKKyAgICAgICAgc2VsZi5kZWZhdWx0X3Rhc2sgPSBkZWZhdWx0X3Rhc2sKKyAgICAgICAgc2VsZi5ydW5Db21tYW5kKFsic2V0UHJlUG9zdENvbmZGaWxlcyIsICJjb25mLy5ob2IuY29uZiIsICIiXSkKKyAgICAgICAgc2VsZi5jb21tYW5kc19hc3luYy5hcHBlbmQoc2VsZi5TVUJfUEFSU0VfQ09ORklHKQorICAgICAgICBzZWxmLmNvbW1hbmRzX2FzeW5jLmFwcGVuZChzZWxmLlNVQl9CVUlMRF9SRUNJUEVTKQorICAgICAgICBzZWxmLnJ1bl9uZXh0X2NvbW1hbmQoc2VsZi5HRU5FUkFURV9QQUNLQUdFUykKKworICAgIGRlZiBnZW5lcmF0ZV9pbWFnZShzZWxmLCBpbWFnZSwgYmFzZV9pbWFnZSwgaW1hZ2VfcGFja2FnZXM9Tm9uZSwgdG9vbGNoYWluX3BhY2thZ2VzPU5vbmUsIGRlZmF1bHRfdGFzaz0iYnVpbGQiKToKKyAgICAgICAgc2VsZi5pbWFnZSA9IGltYWdlCisgICAgICAgIHNlbGYuYmFzZV9pbWFnZSA9IGJhc2VfaW1hZ2UKKyAgICAgICAgaWYgaW1hZ2VfcGFja2FnZXM6CisgICAgICAgICAgICBzZWxmLnBhY2thZ2VfcXVldWUgPSBpbWFnZV9wYWNrYWdlcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5wYWNrYWdlX3F1ZXVlID0gW10KKyAgICAgICAgaWYgdG9vbGNoYWluX3BhY2thZ2VzOgorICAgICAgICAgICAgc2VsZi50b29sY2hhaW5fcGFja2FnZXMgPSB0b29sY2hhaW5fcGFja2FnZXMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudG9vbGNoYWluX3BhY2thZ2VzID0gW10KKyAgICAgICAgc2VsZi5kZWZhdWx0X3Rhc2sgPSBkZWZhdWx0X3Rhc2sKKyAgICAgICAgc2VsZi5ydW5Db21tYW5kKFsic2V0UHJlUG9zdENvbmZGaWxlcyIsICJjb25mLy5ob2IuY29uZiIsICIiXSkKKyAgICAgICAgc2VsZi5jb21tYW5kc19hc3luYy5hcHBlbmQoc2VsZi5TVUJfUEFSU0VfQ09ORklHKQorICAgICAgICBzZWxmLmNvbW1hbmRzX2FzeW5jLmFwcGVuZChzZWxmLlNVQl9CVUlMRF9JTUFHRSkKKyAgICAgICAgc2VsZi5ydW5fbmV4dF9jb21tYW5kKHNlbGYuR0VORVJBVEVfSU1BR0UpCisKKyAgICBkZWYgZ2VuZXJhdGVfbmV3X2ltYWdlKHNlbGYsIGltYWdlLCBiYXNlX2ltYWdlLCBwYWNrYWdlX3F1ZXVlLCBkZXNjcmlwdGlvbik6CisgICAgICAgIGlmIGJhc2VfaW1hZ2U6CisgICAgICAgICAgICBiYXNlX2ltYWdlID0gc2VsZi5ydW5Db21tYW5kKFsibWF0Y2hGaWxlIiwgc2VsZi5iYXNlX2ltYWdlICsgIi5iYiJdKQorICAgICAgICBzZWxmLnJ1bkNvbW1hbmQoWyJnZW5lcmF0ZU5ld0ltYWdlIiwgaW1hZ2UsIGJhc2VfaW1hZ2UsIHBhY2thZ2VfcXVldWUsIEZhbHNlLCBkZXNjcmlwdGlvbl0pCisKKyAgICBkZWYgZ2VuZXJhdGVfaG9iX2Jhc2VfaW1hZ2Uoc2VsZiwgaG9iX2ltYWdlKToKKyAgICAgICAgaW1hZ2VfZGlyID0gc2VsZi5nZXRfdG9wZGlyKCkgKyAiL3JlY2lwZXMvaW1hZ2VzLyIKKyAgICAgICAgcmVjaXBlX25hbWUgPSBob2JfaW1hZ2UgKyAiLmJiIgorICAgICAgICBzZWxmLmVuc3VyZV9kaXIoaW1hZ2VfZGlyKQorICAgICAgICBzZWxmLmdlbmVyYXRlX25ld19pbWFnZShpbWFnZV9kaXIgKyByZWNpcGVfbmFtZSwgTm9uZSwgW10sICIiKQorCisgICAgZGVmIGVuc3VyZV9kaXIoc2VsZiwgZGlyZWN0b3J5KToKKyAgICAgICAgc2VsZi5ydW5Db21tYW5kKFsiZW5zdXJlRGlyIiwgZGlyZWN0b3J5XSkKKworICAgIGRlZiBidWlsZF9zdWNjZWVkZWRfYXN5bmMoc2VsZik6CisgICAgICAgIHNlbGYuYnVpbGRpbmcgPSBGYWxzZQorCisgICAgZGVmIGJ1aWxkX2ZhaWxlZF9hc3luYyhzZWxmKToKKyAgICAgICAgc2VsZi5pbml0Y21kID0gTm9uZQorICAgICAgICBzZWxmLmNvbW1hbmRzX2FzeW5jID0gW10KKyAgICAgICAgc2VsZi5idWlsZGluZyA9IEZhbHNlCisKKyAgICBkZWYgY2FuY2VsX3BhcnNlKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bkNvbW1hbmQoWyJzdGF0ZUZvcmNlU2h1dGRvd24iXSkKKworICAgIGRlZiBjYW5jZWxfYnVpbGQoc2VsZiwgZm9yY2U9RmFsc2UpOgorICAgICAgICBpZiBmb3JjZToKKyAgICAgICAgICAgICMgRm9yY2UgdGhlIGNvb2tlciB0byBzdG9wIGFzIHF1aWNrbHkgYXMgcG9zc2libGUKKyAgICAgICAgICAgIHNlbGYucnVuQ29tbWFuZChbInN0YXRlRm9yY2VTaHV0ZG93biJdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBXYWl0IGZvciB0YXNrcyB0byBjb21wbGV0ZSBiZWZvcmUgc2h1dHRpbmcgZG93biwgdGhpcyBoZWxwcworICAgICAgICAgICAgIyBsZWF2ZSB0aGUgd29ya2RpciBpbiBhIHVzYWJsZSBzdGF0ZQorICAgICAgICAgICAgc2VsZi5ydW5Db21tYW5kKFsic3RhdGVTaHV0ZG93biJdKQorCisgICAgZGVmIHJlc2V0X2J1aWxkKHNlbGYpOgorICAgICAgICBzZWxmLmJ1aWxkLnJlc2V0KCkKKworICAgIGRlZiBnZXRfbG9nZmlsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc2VydmVyLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJCQl9DT05TT0xFTE9HIl0pWzBdCisKKyAgICBkZWYgZ2V0X3RvcGRpcihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIlRPUERJUiJdKSBvciAiIgorCisgICAgZGVmIF9yZW1vdmVfcmVkdW5kYW50KHNlbGYsIHN0cmluZyk6CisgICAgICAgIHJldCA9IFtdCisgICAgICAgIGZvciBpIGluIHN0cmluZy5zcGxpdCgpOgorICAgICAgICAgICAgaWYgaSBub3QgaW4gcmV0OgorICAgICAgICAgICAgICAgIHJldC5hcHBlbmQoaSkKKyAgICAgICAgcmV0dXJuICIgIi5qb2luKHJldCkKKworICAgIGRlZiBzZXRfdmFyX2luX2ZpbGUoc2VsZiwgdmFyLCB2YWwsIGRlZmF1bHRfZmlsZT1Ob25lKToKKyAgICAgICAgc2VsZi5ydW5Db21tYW5kKFsiZW5hYmxlRGF0YVRyYWNraW5nIl0pCisgICAgICAgIHNlbGYuc2VydmVyLnJ1bkNvbW1hbmQoWyJzZXRWYXJGaWxlIiwgdmFyLCB2YWwsIGRlZmF1bHRfZmlsZSwgInNldCJdKQorICAgICAgICBzZWxmLnJ1bkNvbW1hbmQoWyJkaXNhYmxlRGF0YVRyYWNraW5nIl0pCisKKyAgICBkZWYgZWFybHlfYXNzaWduX3Zhcl9pbl9maWxlKHNlbGYsIHZhciwgdmFsLCBkZWZhdWx0X2ZpbGU9Tm9uZSk6CisgICAgICAgIHNlbGYucnVuQ29tbWFuZChbImVuYWJsZURhdGFUcmFja2luZyJdKQorICAgICAgICBzZWxmLnNlcnZlci5ydW5Db21tYW5kKFsic2V0VmFyRmlsZSIsIHZhciwgdmFsLCBkZWZhdWx0X2ZpbGUsICJlYXJseUFzc2lnbiJdKQorICAgICAgICBzZWxmLnJ1bkNvbW1hbmQoWyJkaXNhYmxlRGF0YVRyYWNraW5nIl0pCisKKyAgICBkZWYgcmVtb3ZlX3Zhcl9mcm9tX2ZpbGUoc2VsZiwgdmFyKToKKyAgICAgICAgc2VsZi5zZXJ2ZXIucnVuQ29tbWFuZChbInJlbW92ZVZhckZpbGUiLCB2YXJdKQorCisgICAgZGVmIGFwcGVuZF92YXJfaW5fZmlsZShzZWxmLCB2YXIsIHZhbCwgZGVmYXVsdF9maWxlPU5vbmUpOgorICAgICAgICBzZWxmLnNlcnZlci5ydW5Db21tYW5kKFsic2V0VmFyRmlsZSIsIHZhciwgdmFsLCBkZWZhdWx0X2ZpbGUsICJhcHBlbmQiXSkKKworICAgIGRlZiBhcHBlbmRfdG9fYmJmaWxlcyhzZWxmLCB2YWwpOgorICAgICAgICBiYmZpbGVzID0gc2VsZi5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiQkJGSUxFUyIsICJGYWxzZSJdKSBvciAiIgorICAgICAgICBiYmZpbGVzID0gYmJmaWxlcy5zcGxpdCgpCisgICAgICAgIGlmIHZhbCBub3QgaW4gYmJmaWxlczoKKyAgICAgICAgICAgIHNlbGYuYXBwZW5kX3Zhcl9pbl9maWxlKCJCQkZJTEVTIiwgdmFsLCAiYmJsYXllcnMuY29uZiIpCisKKyAgICBkZWYgZ2V0X3BhcmFtZXRlcnMoc2VsZik6CisgICAgICAgICMgcmV0cmlldmUgdGhlIHBhcmFtZXRlcnMgZnJvbSBiaXRiYWtlCisgICAgICAgIHBhcmFtcyA9IHt9CisgICAgICAgIHBhcmFtc1siY29yZV9iYXNlIl0gPSBzZWxmLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJDT1JFQkFTRSJdKSBvciAiIgorICAgICAgICBwYXJhbXNbImxheWVyIl0gPSBzZWxmLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJCQkxBWUVSUyJdKSBvciAiIgorICAgICAgICBwYXJhbXNbImxheWVyc19ub25fcmVtb3ZhYmxlIl0gPSBzZWxmLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJCQkxBWUVSU19OT05fUkVNT1ZBQkxFIl0pIG9yICIiCisgICAgICAgIHBhcmFtc1siZGxkaXIiXSA9IHNlbGYucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIkRMX0RJUiJdKSBvciAiIgorICAgICAgICBwYXJhbXNbIm1hY2hpbmUiXSA9IHNlbGYucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIk1BQ0hJTkUiXSkgb3IgIiIKKyAgICAgICAgcGFyYW1zWyJkaXN0cm8iXSA9IHNlbGYucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIkRJU1RSTyJdKSBvciAiZGVmYXVsdHNldHVwIgorICAgICAgICBwYXJhbXNbInBjbGFzcyJdID0gc2VsZi5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiUEFDS0FHRV9DTEFTU0VTIl0pIG9yICIiCisgICAgICAgIHBhcmFtc1sic3N0YXRlZGlyIl0gPSBzZWxmLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJTU1RBVEVfRElSIl0pIG9yICIiCisgICAgICAgIHBhcmFtc1sic3N0YXRlbWlycm9yIl0gPSBzZWxmLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJTU1RBVEVfTUlSUk9SUyJdKSBvciAiIgorCisgICAgICAgIG51bV90aHJlYWRzID0gc2VsZi5ydW5Db21tYW5kKFsiZ2V0Q3B1Q291bnQiXSkKKyAgICAgICAgaWYgbm90IG51bV90aHJlYWRzOgorICAgICAgICAgICAgbnVtX3RocmVhZHMgPSAxCisgICAgICAgICAgICBtYXhfdGhyZWFkcyA9IDY1NTM2CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbnVtX3RocmVhZHMgPSBpbnQobnVtX3RocmVhZHMpCisgICAgICAgICAgICAgICAgbWF4X3RocmVhZHMgPSAxNiAqIG51bV90aHJlYWRzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgbnVtX3RocmVhZHMgPSAxCisgICAgICAgICAgICAgICAgbWF4X3RocmVhZHMgPSA2NTUzNgorICAgICAgICBwYXJhbXNbIm1heF90aHJlYWRzIl0gPSBtYXhfdGhyZWFkcworCisgICAgICAgIGJidGhyZWFkID0gc2VsZi5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiQkJfTlVNQkVSX1RIUkVBRFMiXSkKKyAgICAgICAgaWYgbm90IGJidGhyZWFkOgorICAgICAgICAgICAgYmJ0aHJlYWQgPSBudW1fdGhyZWFkcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGJidGhyZWFkID0gaW50KGJidGhyZWFkKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGJidGhyZWFkID0gbnVtX3RocmVhZHMKKyAgICAgICAgcGFyYW1zWyJiYnRocmVhZCJdID0gYmJ0aHJlYWQKKworICAgICAgICBwbWFrZSA9IHNlbGYucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIlBBUkFMTEVMX01BS0UiXSkKKyAgICAgICAgaWYgbm90IHBtYWtlOgorICAgICAgICAgICAgcG1ha2UgPSBudW1fdGhyZWFkcworICAgICAgICBlbGlmIGlzaW5zdGFuY2UocG1ha2UsIGludCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcG1ha2UgPSBpbnQocG1ha2UubHN0cmlwKCItaiAiKSkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwbWFrZSA9IG51bV90aHJlYWRzCisgICAgICAgIHBhcmFtc1sicG1ha2UiXSA9ICItaiAlcyIgJSBwbWFrZQorCisgICAgICAgIHBhcmFtc1siaW1hZ2VfYWRkciJdID0gc2VsZi5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiREVQTE9ZX0RJUl9JTUFHRSJdKSBvciAiIgorCisgICAgICAgIGltYWdlX2V4dHJhX3NpemUgPSBzZWxmLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJJTUFHRV9ST09URlNfRVhUUkFfU1BBQ0UiXSkKKyAgICAgICAgaWYgbm90IGltYWdlX2V4dHJhX3NpemU6CisgICAgICAgICAgICBpbWFnZV9leHRyYV9zaXplID0gMAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGltYWdlX2V4dHJhX3NpemUgPSBpbnQoaW1hZ2VfZXh0cmFfc2l6ZSkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBpbWFnZV9leHRyYV9zaXplID0gMAorICAgICAgICBwYXJhbXNbImltYWdlX2V4dHJhX3NpemUiXSA9IGltYWdlX2V4dHJhX3NpemUKKworICAgICAgICBpbWFnZV9yb290ZnNfc2l6ZSA9IHNlbGYucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIklNQUdFX1JPT1RGU19TSVpFIl0pCisgICAgICAgIGlmIG5vdCBpbWFnZV9yb290ZnNfc2l6ZToKKyAgICAgICAgICAgIGltYWdlX3Jvb3Rmc19zaXplID0gMAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGltYWdlX3Jvb3Rmc19zaXplID0gaW50KGltYWdlX3Jvb3Rmc19zaXplKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGltYWdlX3Jvb3Rmc19zaXplID0gMAorICAgICAgICBwYXJhbXNbImltYWdlX3Jvb3Rmc19zaXplIl0gPSBpbWFnZV9yb290ZnNfc2l6ZQorCisgICAgICAgIGltYWdlX292ZXJoZWFkX2ZhY3RvciA9IHNlbGYucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIklNQUdFX09WRVJIRUFEX0ZBQ1RPUiJdKQorICAgICAgICBpZiBub3QgaW1hZ2Vfb3ZlcmhlYWRfZmFjdG9yOgorICAgICAgICAgICAgaW1hZ2Vfb3ZlcmhlYWRfZmFjdG9yID0gMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGltYWdlX292ZXJoZWFkX2ZhY3RvciA9IGZsb2F0KGltYWdlX292ZXJoZWFkX2ZhY3RvcikKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBpbWFnZV9vdmVyaGVhZF9mYWN0b3IgPSAxCisgICAgICAgIHBhcmFtc1snaW1hZ2Vfb3ZlcmhlYWRfZmFjdG9yJ10gPSBpbWFnZV9vdmVyaGVhZF9mYWN0b3IKKworICAgICAgICBwYXJhbXNbImluY29tcGF0X2xpY2Vuc2UiXSA9IHNlbGYuX3JlbW92ZV9yZWR1bmRhbnQoc2VsZi5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiSU5DT01QQVRJQkxFX0xJQ0VOU0UiXSkgb3IgIiIpCisgICAgICAgIHBhcmFtc1sic2RrX21hY2hpbmUiXSA9IHNlbGYucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIlNES01BQ0hJTkUiXSkgb3Igc2VsZi5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiU0RLX0FSQ0giXSkgb3IgIiIKKworICAgICAgICBwYXJhbXNbImltYWdlX2ZzdHlwZXMiXSA9IHNlbGYuX3JlbW92ZV9yZWR1bmRhbnQoc2VsZi5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiSU1BR0VfRlNUWVBFUyJdKSBvciAiIikKKworICAgICAgICBwYXJhbXNbImltYWdlX3R5cGVzIl0gPSBzZWxmLl9yZW1vdmVfcmVkdW5kYW50KHNlbGYucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIklNQUdFX1RZUEVTIl0pIG9yICIiKQorCisgICAgICAgIHBhcmFtc1siY29uZl92ZXJzaW9uIl0gPSBzZWxmLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJDT05GX1ZFUlNJT04iXSkgb3IgIiIKKyAgICAgICAgcGFyYW1zWyJsY29uZl92ZXJzaW9uIl0gPSBzZWxmLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJMQ09ORl9WRVJTSU9OIl0pIG9yICIiCisKKyAgICAgICAgcGFyYW1zWyJydW5uYWJsZV9pbWFnZV90eXBlcyJdID0gc2VsZi5fcmVtb3ZlX3JlZHVuZGFudChzZWxmLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJSVU5OQUJMRV9JTUFHRV9UWVBFUyJdKSBvciAiIikKKyAgICAgICAgcGFyYW1zWyJydW5uYWJsZV9tYWNoaW5lX3BhdHRlcm5zIl0gPSBzZWxmLl9yZW1vdmVfcmVkdW5kYW50KHNlbGYucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIlJVTk5BQkxFX01BQ0hJTkVfUEFUVEVSTlMiXSkgb3IgIiIpCisgICAgICAgIHBhcmFtc1siZGVwbG95YWJsZV9pbWFnZV90eXBlcyJdID0gc2VsZi5fcmVtb3ZlX3JlZHVuZGFudChzZWxmLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJERVBMT1lBQkxFX0lNQUdFX1RZUEVTIl0pIG9yICIiKQorICAgICAgICBwYXJhbXNbImtlcm5lbF9pbWFnZV90eXBlIl0gPSBzZWxmLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJLRVJORUxfSU1BR0VUWVBFIl0pIG9yICIiCisgICAgICAgIHBhcmFtc1sidG1wZGlyIl0gPSBzZWxmLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJUTVBESVIiXSkgb3IgIiIKKyAgICAgICAgcGFyYW1zWyJkaXN0cm9fdmVyc2lvbiJdID0gc2VsZi5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiRElTVFJPX1ZFUlNJT04iXSkgb3IgIiIKKyAgICAgICAgcGFyYW1zWyJ0YXJnZXRfb3MiXSA9IHNlbGYucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIlRBUkdFVF9PUyJdKSBvciAiIgorICAgICAgICBwYXJhbXNbInRhcmdldF9hcmNoIl0gPSBzZWxmLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJUQVJHRVRfQVJDSCJdKSBvciAiIgorICAgICAgICBwYXJhbXNbInR1bmVfcGtnYXJjaCJdID0gc2VsZi5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiVFVORV9QS0dBUkNIIl0pICBvciAiIgorICAgICAgICBwYXJhbXNbImJiX3ZlcnNpb24iXSA9IHNlbGYucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIkJCX01JTl9WRVJTSU9OIl0pIG9yICIiCisKKyAgICAgICAgcGFyYW1zWyJkZWZhdWx0X3Rhc2siXSA9IHNlbGYucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIkJCX0RFRkFVTFRfVEFTSyJdKSBvciAiYnVpbGQiCisKKyAgICAgICAgcGFyYW1zWyJzb2Nrc19wcm94eSJdID0gc2VsZi5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiYWxsX3Byb3h5Il0pIG9yICIiCisgICAgICAgIHBhcmFtc1siaHR0cF9wcm94eSJdID0gc2VsZi5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiaHR0cF9wcm94eSJdKSBvciAiIgorICAgICAgICBwYXJhbXNbImZ0cF9wcm94eSJdID0gc2VsZi5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiZnRwX3Byb3h5Il0pIG9yICIiCisgICAgICAgIHBhcmFtc1siaHR0cHNfcHJveHkiXSA9IHNlbGYucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgImh0dHBzX3Byb3h5Il0pIG9yICIiCisKKyAgICAgICAgcGFyYW1zWyJjdnNfcHJveHlfaG9zdCJdID0gc2VsZi5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiQ1ZTX1BST1hZX0hPU1QiXSkgb3IgIiIKKyAgICAgICAgcGFyYW1zWyJjdnNfcHJveHlfcG9ydCJdID0gc2VsZi5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiQ1ZTX1BST1hZX1BPUlQiXSkgb3IgIiIKKworICAgICAgICBwYXJhbXNbImltYWdlX3doaXRlX3BhdHRlcm4iXSA9IHNlbGYucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIkJCVUlfSU1BR0VfV0hJVEVfUEFUVEVSTiJdKSBvciAiIgorICAgICAgICBwYXJhbXNbImltYWdlX2JsYWNrX3BhdHRlcm4iXSA9IHNlbGYucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIkJCVUlfSU1BR0VfQkxBQ0tfUEFUVEVSTiJdKSBvciAiIgorICAgICAgICByZXR1cm4gcGFyYW1zCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaG9ibGlzdG1vZGVsLnB5IGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2hvYmxpc3Rtb2RlbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGRmMTU2Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2hvYmxpc3Rtb2RlbC5weQpAQCAtMCwwICsxLDkwMyBAQAorIworIyBCaXRCYWtlIEdyYXBoaWNhbCBHVEsgVXNlciBJbnRlcmZhY2UKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDExICAgICAgICBJbnRlbCBDb3Jwb3JhdGlvbgorIworIyBBdXRob3JlZCBieSBKb3NodWEgTG9jayA8am9zaEBsaW51eC5pbnRlbC5jb20+CisjIEF1dGhvcmVkIGJ5IERvbmd4aWFvIFh1IDxkb25neGlhby54dUBpbnRlbC5jb20+CisjIEF1dGhvcmVkIGJ5IFNoYW5lIFdhbmcgPHNoYW5lLndhbmdAaW50ZWwuY29tPgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworaW1wb3J0IGd0aworaW1wb3J0IGdvYmplY3QKK2Zyb20gYmIudWkuY3J1bWJzLmhvYnBhZ2VzIGltcG9ydCBIb2JQYWdlCisKKyMKKyMgUGFja2FnZUxpc3RNb2RlbAorIworY2xhc3MgUGFja2FnZUxpc3RNb2RlbChndGsuTGlzdFN0b3JlKToKKyAgICAiIiIKKyAgICBUaGlzIGNsYXNzIGRlZmluZXMgYW4gZ3RrLkxpc3RTdG9yZSBzdWJjbGFzcyB3aGljaCB3aWxsIGNvbnZlcnQgdGhlIG91dHB1dAorICAgIG9mIHRoZSBiYi5ldmVudC5UYXJnZXRzVHJlZUdlbmVyYXRlZCBldmVudCBpbnRvIGEgZ3RrLkxpc3RTdG9yZSB3aGlsc3QgYWxzbworICAgIHByb3ZpZGluZyBjb252ZW5pZW5jZSBmdW5jdGlvbnMgdG8gYWNjZXNzIGd0ay5UcmVlTW9kZWwgc3ViY2xhc3NlcyB3aGljaAorICAgIHByb3ZpZGUgZmlsdGVyZWQgdmlld3Mgb2YgdGhlIGRhdGEuCisgICAgIiIiCisKKyAgICAoQ09MX05BTUUsIENPTF9WRVIsIENPTF9SRVYsIENPTF9STk0sIENPTF9TRUMsIENPTF9TVU0sIENPTF9SREVQLCBDT0xfUlBST1YsIENPTF9TSVpFLCBDT0xfUkNQLCBDT0xfQklOQiwgQ09MX0lOQywgQ09MX0ZBREVfSU5DLCBDT0xfRk9OVCwgQ09MX0ZMSVNUKSA9IHJhbmdlKDE1KQorCisgICAgX19nc2lnbmFsc19fID0geworICAgICAgICAicGFja2FnZS1zZWxlY3Rpb24tY2hhbmdlZCIgOiAoZ29iamVjdC5TSUdOQUxfUlVOX0xBU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSksCisgICAgfQorCisgICAgX190b29sY2hhaW5fcmVxdWlyZWRfcGFja2FnZXNfXyA9IFsicGFja2FnZWdyb3VwLWNvcmUtc3RhbmRhbG9uZS1zZGstdGFyZ2V0IiwgInBhY2thZ2Vncm91cC1jb3JlLXN0YW5kYWxvbmUtc2RrLXRhcmdldC1kYmciXQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnJwcm92X3BrZyA9IHt9CisgICAgICAgIGd0ay5MaXN0U3RvcmUuX19pbml0X18gKHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9CT09MRUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfQk9PTEVBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX1NUUklORykKKyAgICAgICAgc2VsZi5zb3J0X2NvbHVtbl9pZCwgc2VsZi5zb3J0X29yZGVyID0gUGFja2FnZUxpc3RNb2RlbC5DT0xfTkFNRSwgZ3RrLlNPUlRfQVNDRU5ESU5HCisKKyAgICAiIiIKKyAgICBGaW5kIHRoZSBtb2RlbCBwYXRoIGZvciB0aGUgaXRlbV9uYW1lCisgICAgUmV0dXJucyB0aGUgcGF0aCBpbiB0aGUgbW9kZWwgb3IgTm9uZQorICAgICIiIgorICAgIGRlZiBmaW5kX3BhdGhfZm9yX2l0ZW0oc2VsZiwgaXRlbV9uYW1lKToKKyAgICAgICAgcGtnID0gaXRlbV9uYW1lCisgICAgICAgIGlmIGl0ZW1fbmFtZSBub3QgaW4gc2VsZi5wbl9wYXRoLmtleXMoKToKKyAgICAgICAgICAgIGlmIGl0ZW1fbmFtZSBub3QgaW4gc2VsZi5ycHJvdl9wa2cua2V5cygpOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICBwa2cgPSBzZWxmLnJwcm92X3BrZ1tpdGVtX25hbWVdCisgICAgICAgICAgICBpZiBwa2cgbm90IGluIHNlbGYucG5fcGF0aC5rZXlzKCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICByZXR1cm4gc2VsZi5wbl9wYXRoW3BrZ10KKworICAgIGRlZiBmaW5kX2l0ZW1fZm9yX3BhdGgoc2VsZiwgaXRlbV9wYXRoKToKKyAgICAgICAgcmV0dXJuIHNlbGZbaXRlbV9wYXRoXVtzZWxmLkNPTF9OQU1FXQorCisgICAgIiIiCisgICAgSGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIGFuIGl0ZW0gaXMgYW4gaXRlbSBzcGVjaWZpZWQgYnkgZmlsdGVyCisgICAgIiIiCisgICAgZGVmIHRyZWVfbW9kZWxfZmlsdGVyKHNlbGYsIG1vZGVsLCBpdCwgZmlsdGVyKToKKyAgICAgICAgbmFtZSA9IG1vZGVsLmdldF92YWx1ZShpdCwgc2VsZi5DT0xfTkFNRSkKKworICAgICAgICBmb3Iga2V5IGluIGZpbHRlci5rZXlzKCk6CisgICAgICAgICAgICBpZiBrZXkgPT0gc2VsZi5DT0xfTkFNRToKKyAgICAgICAgICAgICAgICBpZiBmaWx0ZXJba2V5XSAhPSAnU2VhcmNoIHBhY2thZ2VzIGJ5IG5hbWUnOgorICAgICAgICAgICAgICAgICAgICBpZiBuYW1lIGFuZCBmaWx0ZXJba2V5XSBub3QgaW4gbmFtZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBtb2RlbC5nZXRfdmFsdWUoaXQsIGtleSkgbm90IGluIGZpbHRlcltrZXldOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgc2VsZi5maWx0ZXJlZF9uYiArPSAxCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAiIiIKKyAgICBDcmVhdGUsIGlmIHJlcXVpcmVkLCBhbmQgcmV0dXJuIGEgZmlsdGVyZWQgZ3RrLlRyZWVNb2RlbFNvcnQKKyAgICBjb250YWluaW5nIG9ubHkgdGhlIGl0ZW1zIHNwZWNpZmllZCBieSBmaWx0ZXIKKyAgICAiIiIKKyAgICBkZWYgdHJlZV9tb2RlbChzZWxmLCBmaWx0ZXIsIGV4Y2x1ZGVkX2l0ZW1zX2FoZWFkPUZhbHNlLCBpbmNsdWRlZF9pdGVtc19haGVhZD1GYWxzZSwgc2VhcmNoX2RhdGE9Tm9uZSwgaW5pdGlhbD1GYWxzZSk6CisgICAgICAgIG1vZGVsID0gc2VsZi5maWx0ZXJfbmV3KCkKKyAgICAgICAgc2VsZi5maWx0ZXJlZF9uYiA9IDAKKyAgICAgICAgbW9kZWwuc2V0X3Zpc2libGVfZnVuYyhzZWxmLnRyZWVfbW9kZWxfZmlsdGVyLCBmaWx0ZXIpCisKKyAgICAgICAgc29ydCA9IGd0ay5UcmVlTW9kZWxTb3J0KG1vZGVsKQorICAgICAgICBzb3J0LmNvbm5lY3QgKCdzb3J0LWNvbHVtbi1jaGFuZ2VkJywgc2VsZi5zb3J0X2NvbHVtbl9jaGFuZ2VkX2NiKQorICAgICAgICBpZiBpbml0aWFsOgorICAgICAgICAgICAgc29ydC5zZXRfc29ydF9jb2x1bW5faWQoUGFja2FnZUxpc3RNb2RlbC5DT0xfTkFNRSwgZ3RrLlNPUlRfQVNDRU5ESU5HKQorICAgICAgICAgICAgc29ydC5zZXRfZGVmYXVsdF9zb3J0X2Z1bmMoTm9uZSkKKyAgICAgICAgZWxpZiBleGNsdWRlZF9pdGVtc19haGVhZDoKKyAgICAgICAgICAgIHNvcnQuc2V0X2RlZmF1bHRfc29ydF9mdW5jKHNlbGYuZXhjbHVkZV9pdGVtX3NvcnRfZnVuYywgc2VhcmNoX2RhdGEpCisgICAgICAgIGVsaWYgaW5jbHVkZWRfaXRlbXNfYWhlYWQ6CisgICAgICAgICAgICBzb3J0LnNldF9kZWZhdWx0X3NvcnRfZnVuYyhzZWxmLmluY2x1ZGVfaXRlbV9zb3J0X2Z1bmMsIHNlYXJjaF9kYXRhKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VhcmNoX2RhdGEgYW5kIHNlYXJjaF9kYXRhIT0nU2VhcmNoIHJlY2lwZXMgYnkgbmFtZScgYW5kIHNlYXJjaF9kYXRhIT0nU2VhcmNoIHBhY2thZ2UgZ3JvdXBzIGJ5IG5hbWUnOgorICAgICAgICAgICAgICAgIHNvcnQuc2V0X2RlZmF1bHRfc29ydF9mdW5jKHNlbGYuc29ydF9mdW5jLCBzZWFyY2hfZGF0YSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc29ydC5zZXRfc29ydF9jb2x1bW5faWQoc2VsZi5zb3J0X2NvbHVtbl9pZCwgc2VsZi5zb3J0X29yZGVyKQorICAgICAgICAgICAgICAgIHNvcnQuc2V0X2RlZmF1bHRfc29ydF9mdW5jKE5vbmUpCisKKyAgICAgICAgc29ydC5zZXRfc29ydF9mdW5jKFBhY2thZ2VMaXN0TW9kZWwuQ09MX0lOQywgc2VsZi5zb3J0X2NvbHVtbiwgUGFja2FnZUxpc3RNb2RlbC5DT0xfSU5DKQorICAgICAgICBzb3J0LnNldF9zb3J0X2Z1bmMoUGFja2FnZUxpc3RNb2RlbC5DT0xfU0laRSwgc2VsZi5zb3J0X2NvbHVtbiwgUGFja2FnZUxpc3RNb2RlbC5DT0xfU0laRSkKKyAgICAgICAgc29ydC5zZXRfc29ydF9mdW5jKFBhY2thZ2VMaXN0TW9kZWwuQ09MX0JJTkIsIHNlbGYuc29ydF9iaW5iX2NvbHVtbikKKyAgICAgICAgc29ydC5zZXRfc29ydF9mdW5jKFBhY2thZ2VMaXN0TW9kZWwuQ09MX1JDUCwgc2VsZi5zb3J0X2NvbHVtbiwgUGFja2FnZUxpc3RNb2RlbC5DT0xfUkNQKQorICAgICAgICByZXR1cm4gc29ydAorCisgICAgZGVmIHNvcnRfY29sdW1uX2NoYW5nZWRfY2IgKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLnNvcnRfY29sdW1uX2lkLCBzZWxmLnNvcnRfb3JkZXIgPSBkYXRhLmdldF9zb3J0X2NvbHVtbl9pZCAoKQorCisgICAgZGVmIHNvcnRfY29sdW1uKHNlbGYsIG1vZGVsLCByb3cxLCByb3cyLCBjb2wpOgorICAgICAgICB2YWx1ZTEgPSBtb2RlbC5nZXRfdmFsdWUocm93MSwgY29sKQorICAgICAgICB2YWx1ZTIgPSBtb2RlbC5nZXRfdmFsdWUocm93MiwgY29sKQorICAgICAgICBpZiBjb2w9PVBhY2thZ2VMaXN0TW9kZWwuQ09MX1NJWkU6CisgICAgICAgICAgICB2YWx1ZTEgPSBIb2JQYWdlLl9zdHJpbmdfdG9fc2l6ZSh2YWx1ZTEpCisgICAgICAgICAgICB2YWx1ZTIgPSBIb2JQYWdlLl9zdHJpbmdfdG9fc2l6ZSh2YWx1ZTIpCisKKyAgICAgICAgY21wX3JlcyA9IGNtcCh2YWx1ZTEsIHZhbHVlMikKKyAgICAgICAgaWYgY21wX3JlcyE9MDoKKyAgICAgICAgICAgIGlmIGNvbD09UGFja2FnZUxpc3RNb2RlbC5DT0xfSU5DOgorICAgICAgICAgICAgICAgIHJldHVybiAtY21wX3JlcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gY21wX3JlcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmFtZTEgPSBtb2RlbC5nZXRfdmFsdWUocm93MSwgUGFja2FnZUxpc3RNb2RlbC5DT0xfTkFNRSkKKyAgICAgICAgICAgIG5hbWUyID0gbW9kZWwuZ2V0X3ZhbHVlKHJvdzIsIFBhY2thZ2VMaXN0TW9kZWwuQ09MX05BTUUpCisgICAgICAgICAgICByZXR1cm4gY21wKG5hbWUxLG5hbWUyKQorCisgICAgZGVmIHNvcnRfYmluYl9jb2x1bW4oc2VsZiwgbW9kZWwsIHJvdzEsIHJvdzIpOgorICAgICAgICB2YWx1ZTEgPSBtb2RlbC5nZXRfdmFsdWUocm93MSwgUGFja2FnZUxpc3RNb2RlbC5DT0xfQklOQikKKyAgICAgICAgdmFsdWUyID0gbW9kZWwuZ2V0X3ZhbHVlKHJvdzIsIFBhY2thZ2VMaXN0TW9kZWwuQ09MX0JJTkIpCisgICAgICAgIHZhbHVlMV9saXN0ID0gdmFsdWUxLnNwbGl0KCcsICcpCisgICAgICAgIHZhbHVlMl9saXN0ID0gdmFsdWUyLnNwbGl0KCcsICcpCisKKyAgICAgICAgdmFsdWUxID0gdmFsdWUxX2xpc3RbMF0KKyAgICAgICAgdmFsdWUyID0gdmFsdWUyX2xpc3RbMF0KKworICAgICAgICBjbXBfcmVzID0gY21wKHZhbHVlMSwgdmFsdWUyKQorICAgICAgICBpZiBjbXBfcmVzPT0wOgorICAgICAgICAgICAgY21wX3NpemUgPSBjbXAobGVuKHZhbHVlMV9saXN0KSwgbGVuKHZhbHVlMl9saXN0KSkKKyAgICAgICAgICAgIGlmIGNtcF9zaXplPT0wOgorICAgICAgICAgICAgICAgIG5hbWUxID0gbW9kZWwuZ2V0X3ZhbHVlKHJvdzEsIFBhY2thZ2VMaXN0TW9kZWwuQ09MX05BTUUpCisgICAgICAgICAgICAgICAgbmFtZTIgPSBtb2RlbC5nZXRfdmFsdWUocm93MiwgUGFja2FnZUxpc3RNb2RlbC5DT0xfTkFNRSkKKyAgICAgICAgICAgICAgICByZXR1cm4gY21wKG5hbWUxLG5hbWUyKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gY21wX3NpemUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBjbXBfcmVzCisKKyAgICBkZWYgZXhjbHVkZV9pdGVtX3NvcnRfZnVuYyhzZWxmLCBtb2RlbCwgaXRlcjEsIGl0ZXIyLCB1c2VyX2RhdGE9Tm9uZSk6CisgICAgICAgIGlmIHVzZXJfZGF0YToKKyAgICAgICAgICAgIHZhbDEgPSBtb2RlbC5nZXRfdmFsdWUoaXRlcjEsIFBhY2thZ2VMaXN0TW9kZWwuQ09MX05BTUUpCisgICAgICAgICAgICB2YWwyID0gbW9kZWwuZ2V0X3ZhbHVlKGl0ZXIyLCBQYWNrYWdlTGlzdE1vZGVsLkNPTF9OQU1FKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY21wX3ZhbHModmFsMSwgdmFsMiwgdXNlcl9kYXRhKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdmFsMSA9IG1vZGVsLmdldF92YWx1ZShpdGVyMSwgUGFja2FnZUxpc3RNb2RlbC5DT0xfRkFERV9JTkMpCisgICAgICAgICAgICB2YWwyID0gbW9kZWwuZ2V0X3ZhbHVlKGl0ZXIyLCBQYWNrYWdlTGlzdE1vZGVsLkNPTF9JTkMpCisgICAgICAgICAgICByZXR1cm4gKCh2YWwxID09IFRydWUpIGFuZCAodmFsMiA9PSBGYWxzZSkpCisKKyAgICBkZWYgaW5jbHVkZV9pdGVtX3NvcnRfZnVuYyhzZWxmLCBtb2RlbCwgaXRlcjEsIGl0ZXIyLCB1c2VyX2RhdGE9Tm9uZSk6CisgICAgICAgIGlmIHVzZXJfZGF0YToKKyAgICAgICAgICAgIHZhbDEgPSBtb2RlbC5nZXRfdmFsdWUoaXRlcjEsIFBhY2thZ2VMaXN0TW9kZWwuQ09MX05BTUUpCisgICAgICAgICAgICB2YWwyID0gbW9kZWwuZ2V0X3ZhbHVlKGl0ZXIyLCBQYWNrYWdlTGlzdE1vZGVsLkNPTF9OQU1FKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY21wX3ZhbHModmFsMSwgdmFsMiwgdXNlcl9kYXRhKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdmFsMSA9IG1vZGVsLmdldF92YWx1ZShpdGVyMSwgUGFja2FnZUxpc3RNb2RlbC5DT0xfSU5DKQorICAgICAgICAgICAgdmFsMiA9IG1vZGVsLmdldF92YWx1ZShpdGVyMiwgUGFja2FnZUxpc3RNb2RlbC5DT0xfSU5DKQorICAgICAgICAgICAgcmV0dXJuICgodmFsMSA9PSBGYWxzZSkgYW5kICh2YWwyID09IFRydWUpKQorCisgICAgZGVmIHNvcnRfZnVuYyhzZWxmLCBtb2RlbCwgaXRlcjEsIGl0ZXIyLCB1c2VyX2RhdGEpOgorICAgICAgICB2YWwxID0gbW9kZWwuZ2V0X3ZhbHVlKGl0ZXIxLCBQYWNrYWdlTGlzdE1vZGVsLkNPTF9OQU1FKQorICAgICAgICB2YWwyID0gbW9kZWwuZ2V0X3ZhbHVlKGl0ZXIyLCBQYWNrYWdlTGlzdE1vZGVsLkNPTF9OQU1FKQorICAgICAgICByZXR1cm4gc2VsZi5jbXBfdmFscyh2YWwxLCB2YWwyLCB1c2VyX2RhdGEpCisKKyAgICBkZWYgY21wX3ZhbHMoc2VsZiwgdmFsMSwgdmFsMiwgdXNlcl9kYXRhKToKKyAgICAgICAgaWYgdmFsMSBpcyBOb25lIG9yIHZhbDIgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIGVsaWYgdmFsMS5zdGFydHN3aXRoKHVzZXJfZGF0YSkgYW5kIG5vdCB2YWwyLnN0YXJ0c3dpdGgodXNlcl9kYXRhKToKKyAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICBlbGlmIG5vdCB2YWwxLnN0YXJ0c3dpdGgodXNlcl9kYXRhKSBhbmQgdmFsMi5zdGFydHN3aXRoKHVzZXJfZGF0YSk6CisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGNtcCh2YWwxLCB2YWwyKQorCisgICAgZGVmIGNvbnZlcnRfdnBhdGhfdG9fcGF0aChzZWxmLCB2aWV3X21vZGVsLCB2aWV3X3BhdGgpOgorICAgICAgICAjIHZpZXdfbW9kZWwgaXMgdGhlIG1vZGVsIHNvcnRlZAorICAgICAgICAjIGdldCB0aGUgcGF0aCBvZiB0aGUgbW9kZWwgZmlsdGVyZWQKKyAgICAgICAgZmlsdGVyZWRfbW9kZWxfcGF0aCA9IHZpZXdfbW9kZWwuY29udmVydF9wYXRoX3RvX2NoaWxkX3BhdGgodmlld19wYXRoKQorICAgICAgICAjIGdldCB0aGUgbW9kZWwgZmlsdGVyZWQKKyAgICAgICAgZmlsdGVyZWRfbW9kZWwgPSB2aWV3X21vZGVsLmdldF9tb2RlbCgpCisgICAgICAgICMgZ2V0IHRoZSBwYXRoIG9mIHRoZSBvcmlnaW5hbCBtb2RlbAorICAgICAgICBwYXRoID0gZmlsdGVyZWRfbW9kZWwuY29udmVydF9wYXRoX3RvX2NoaWxkX3BhdGgoZmlsdGVyZWRfbW9kZWxfcGF0aCkKKyAgICAgICAgcmV0dXJuIHBhdGgKKworICAgIGRlZiBjb252ZXJ0X3BhdGhfdG9fdnBhdGgoc2VsZiwgdmlld19tb2RlbCwgcGF0aCk6CisgICAgICAgIGl0ID0gdmlld19tb2RlbC5nZXRfaXRlcl9maXJzdCgpCisgICAgICAgIHdoaWxlIGl0OgorICAgICAgICAgICAgbmFtZSA9IHNlbGYuZmluZF9pdGVtX2Zvcl9wYXRoKHBhdGgpCisgICAgICAgICAgICB2aWV3X25hbWUgPSB2aWV3X21vZGVsLmdldF92YWx1ZShpdCwgUGFja2FnZUxpc3RNb2RlbC5DT0xfTkFNRSkKKyAgICAgICAgICAgIGlmIHZpZXdfbmFtZSA9PSBuYW1lOgorICAgICAgICAgICAgICAgIHZpZXdfcGF0aCA9IHZpZXdfbW9kZWwuZ2V0X3BhdGgoaXQpCisgICAgICAgICAgICAgICAgcmV0dXJuIHZpZXdfcGF0aAorICAgICAgICAgICAgaXQgPSB2aWV3X21vZGVsLml0ZXJfbmV4dChpdCkKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICIiIgorICAgIFRoZSBwb3B1bGF0ZSgpIGZ1bmN0aW9uIHRha2VzIGFzIGlucHV0IHRoZSBkYXRhIGZyb20gYQorICAgIGJiLmV2ZW50LlBhY2thZ2VJbmZvIGV2ZW50IGFuZCBwb3B1bGF0ZXMgdGhlIHBhY2thZ2UgbGlzdC4KKyAgICAiIiIKKyAgICBkZWYgcG9wdWxhdGUoc2VsZiwgcGtnaW5mb2xpc3QpOgorICAgICAgICAjIEZpcnN0IGNsZWFyIHRoZSBtb2RlbCwgaW4gY2FzZSByZXBvcHVsYXRpbmcKKyAgICAgICAgc2VsZi5jbGVhcigpCisKKyAgICAgICAgZGVmIGdldHBrZ3ZhbHVlKHBrZ2RpY3QsIGtleSwgcGtnbmFtZSwgZGVmYXVsdHZhbCA9IE5vbmUpOgorICAgICAgICAgICAgdmFsdWUgPSBwa2dkaWN0LmdldCgnJXNfJXMnICUgKGtleSwgcGtnbmFtZSksIE5vbmUpCisgICAgICAgICAgICBpZiBub3QgdmFsdWU6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBwa2dkaWN0LmdldChrZXksIGRlZmF1bHR2YWwpCisgICAgICAgICAgICByZXR1cm4gdmFsdWUKKworICAgICAgICBmb3IgcGtnaW5mbyBpbiBwa2dpbmZvbGlzdDoKKyAgICAgICAgICAgIHBuID0gcGtnaW5mb1snUE4nXQorICAgICAgICAgICAgcHYgPSBwa2dpbmZvWydQViddCisgICAgICAgICAgICBwciA9IHBrZ2luZm9bJ1BSJ10KKyAgICAgICAgICAgIHBrZyA9IHBrZ2luZm9bJ1BLRyddCisgICAgICAgICAgICBwa2d2ID0gZ2V0cGtndmFsdWUocGtnaW5mbywgJ1BLR1YnLCBwa2cpCisgICAgICAgICAgICBwa2dyID0gZ2V0cGtndmFsdWUocGtnaW5mbywgJ1BLR1InLCBwa2cpCisgICAgICAgICAgICAjIFBLR1NJWkUgaXMgYXJ0aWZpY2lhbCwgd2lsbCBhbHdheXMgYmUgb3ZlcnJpZGRlbiB3aXRoIHRoZSBwYWNrYWdlIG5hbWUgaWYgcHJlc2VudAorICAgICAgICAgICAgcGtnc2l6ZSA9IGludChwa2dpbmZvLmdldCgnUEtHU0laRV8lcycgJSBwa2csICIwIikpCisgICAgICAgICAgICAjIFBLR18lcyBpcyB0aGUgcmVuYW1lZCB2ZXJzaW9uCisgICAgICAgICAgICBwa2dfcmVuYW1lID0gcGtnaW5mby5nZXQoJ1BLR18lcycgJSBwa2csICIiKQorICAgICAgICAgICAgIyBUaGUgcmVzdCBtYXkgYmUgb3ZlcnJpZGRlbiBvciBub3QKKyAgICAgICAgICAgIHNlY3Rpb24gPSBnZXRwa2d2YWx1ZShwa2dpbmZvLCAnU0VDVElPTicsIHBrZywgIiIpCisgICAgICAgICAgICBzdW1tYXJ5ID0gZ2V0cGtndmFsdWUocGtnaW5mbywgJ1NVTU1BUlknLCBwa2csICIiKQorICAgICAgICAgICAgcmRlcCA9IGdldHBrZ3ZhbHVlKHBrZ2luZm8sICdSREVQRU5EUycsIHBrZywgIiIpCisgICAgICAgICAgICBycmVjID0gZ2V0cGtndmFsdWUocGtnaW5mbywgJ1JSRUNPTU1FTkRTJywgcGtnLCAiIikKKyAgICAgICAgICAgIHJwcm92ID0gZ2V0cGtndmFsdWUocGtnaW5mbywgJ1JQUk9WSURFUycsIHBrZywgIiIpCisgICAgICAgICAgICBmaWxlc19saXN0ID0gZ2V0cGtndmFsdWUocGtnaW5mbywgJ0ZJTEVTX0lORk8nLCBwa2csICIiKQorICAgICAgICAgICAgZm9yIGkgaW4gcnByb3Yuc3BsaXQoKToKKyAgICAgICAgICAgICAgICBzZWxmLnJwcm92X3BrZ1tpXSA9IHBrZworCisgICAgICAgICAgICByZWNpcGUgPSBwbiArICctJyArIHB2ICsgJy0nICsgcHIKKworICAgICAgICAgICAgYWxsb3dfZW1wdHkgPSBnZXRwa2d2YWx1ZShwa2dpbmZvLCAnQUxMT1dfRU1QVFknLCBwa2csICIiKQorCisgICAgICAgICAgICBpZiBwa2dzaXplID09IDAgYW5kIG5vdCBhbGxvd19lbXB0eToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBzaXplID0gSG9iUGFnZS5fc2l6ZV90b19zdHJpbmcocGtnc2l6ZSkKKyAgICAgICAgICAgIHNlbGYuc2V0KHNlbGYuYXBwZW5kKCksIHNlbGYuQ09MX05BTUUsIHBrZywgc2VsZi5DT0xfVkVSLCBwa2d2LAorICAgICAgICAgICAgICAgICAgICAgc2VsZi5DT0xfUkVWLCBwa2dyLCBzZWxmLkNPTF9STk0sIHBrZ19yZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICBzZWxmLkNPTF9TRUMsIHNlY3Rpb24sIHNlbGYuQ09MX1NVTSwgc3VtbWFyeSwKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuQ09MX1JERVAsIHJkZXAgKyAnICcgKyBycmVjLAorICAgICAgICAgICAgICAgICAgICAgc2VsZi5DT0xfUlBST1YsIHJwcm92LCBzZWxmLkNPTF9TSVpFLCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgc2VsZi5DT0xfUkNQLCByZWNpcGUsIHNlbGYuQ09MX0JJTkIsICIiLAorICAgICAgICAgICAgICAgICAgICAgc2VsZi5DT0xfSU5DLCBGYWxzZSwgc2VsZi5DT0xfRk9OVCwgJzEwJywgc2VsZi5DT0xfRkxJU1QsIGZpbGVzX2xpc3QpCisKKyAgICAgICAgc2VsZi5wbl9wYXRoID0ge30KKyAgICAgICAgaXQgPSBzZWxmLmdldF9pdGVyX2ZpcnN0KCkKKyAgICAgICAgd2hpbGUgaXQ6CisgICAgICAgICAgICBwbiA9IHNlbGYuZ2V0X3ZhbHVlKGl0LCBzZWxmLkNPTF9OQU1FKQorICAgICAgICAgICAgcGF0aCA9IHNlbGYuZ2V0X3BhdGgoaXQpCisgICAgICAgICAgICBzZWxmLnBuX3BhdGhbcG5dID0gcGF0aAorICAgICAgICAgICAgaXQgPSBzZWxmLml0ZXJfbmV4dChpdCkKKworICAgICIiIgorICAgIFVwZGF0ZSB0aGUgbW9kZWwsIHNlbmQgb3V0IHRoZSBub3RpZmljYXRpb24uCisgICAgIiIiCisgICAgZGVmIHNlbGVjdGlvbl9jaGFuZ2Vfbm90aWZpY2F0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmVtaXQoInBhY2thZ2Utc2VsZWN0aW9uLWNoYW5nZWQiKQorCisgICAgIiIiCisgICAgQ2hlY2sgd2hldGhlciB0aGUgaXRlbSBhdCBpdGVtX3BhdGggaXMgaW5jbHVkZWQgb3Igbm90CisgICAgIiIiCisgICAgZGVmIHBhdGhfaW5jbHVkZWQoc2VsZiwgaXRlbV9wYXRoKToKKyAgICAgICAgcmV0dXJuIHNlbGZbaXRlbV9wYXRoXVtzZWxmLkNPTF9JTkNdCisKKyAgICAiIiIKKyAgICBBZGQgdGhpcyBpdGVtLCBhbmQgYW55IG9mIGl0cyBkZXBlbmRlbmNpZXMsIHRvIHRoZSBpbWFnZSBjb250ZW50cworICAgICIiIgorICAgIGRlZiBpbmNsdWRlX2l0ZW0oc2VsZiwgaXRlbV9wYXRoLCBiaW5iPSIiKToKKyAgICAgICAgaWYgc2VsZi5wYXRoX2luY2x1ZGVkKGl0ZW1fcGF0aCk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpdGVtX25hbWUgPSBzZWxmW2l0ZW1fcGF0aF1bc2VsZi5DT0xfTkFNRV0KKyAgICAgICAgaXRlbV9kZXBzID0gc2VsZltpdGVtX3BhdGhdW3NlbGYuQ09MX1JERVBdCisKKyAgICAgICAgc2VsZltpdGVtX3BhdGhdW3NlbGYuQ09MX0lOQ10gPSBUcnVlCisKKyAgICAgICAgaXRlbV9iaW4gPSBzZWxmW2l0ZW1fcGF0aF1bc2VsZi5DT0xfQklOQl0uc3BsaXQoJywgJykKKyAgICAgICAgaWYgYmluYiBhbmQgbm90IGJpbmIgaW4gaXRlbV9iaW46CisgICAgICAgICAgICBpdGVtX2Jpbi5hcHBlbmQoYmluYikKKyAgICAgICAgICAgIHNlbGZbaXRlbV9wYXRoXVtzZWxmLkNPTF9CSU5CXSA9ICcsICcuam9pbihpdGVtX2JpbikubHN0cmlwKCcsICcpCisKKyAgICAgICAgaWYgaXRlbV9kZXBzOgorICAgICAgICAgICAgIyBFbnN1cmUgYWxsIG9mIHRoZSBpdGVtcyBkZXBzIGFyZSBpbmNsdWRlZCBhbmQsIHdoZXJlIGFwcHJvcHJpYXRlLAorICAgICAgICAgICAgIyBhZGQgdGhpcyBpdGVtIHRvIHRoZWlyIENPTF9CSU5CCisgICAgICAgICAgICBmb3IgZGVwIGluIGl0ZW1fZGVwcy5zcGxpdCgiICIpOgorICAgICAgICAgICAgICAgIGlmIGRlcC5zdGFydHN3aXRoKCcoJyk6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgIyBJZiB0aGUgY29udGVudHMgbW9kZWwgZG9lc24ndCBhbHJlYWR5IGNvbnRhaW4gZGVwLCBhZGQgaXQKKyAgICAgICAgICAgICAgICBkZXBfcGF0aCA9IHNlbGYuZmluZF9wYXRoX2Zvcl9pdGVtKGRlcCkKKyAgICAgICAgICAgICAgICBpZiBub3QgZGVwX3BhdGg6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZGVwX2luY2x1ZGVkID0gc2VsZi5wYXRoX2luY2x1ZGVkKGRlcF9wYXRoKQorCisgICAgICAgICAgICAgICAgaWYgZGVwX2luY2x1ZGVkIGFuZCBub3QgZGVwIGluIGl0ZW1fYmluOgorICAgICAgICAgICAgICAgICAgICAjIGRvbid0IHNldCB0aGUgQ09MX0JJTkIgdG8gdGhpcyBpdGVtIGlmIHRoZSB0YXJnZXQgaXMgYW4KKyAgICAgICAgICAgICAgICAgICAgIyBpdGVtIGluIG91ciBvd24gQ09MX0JJTkIKKyAgICAgICAgICAgICAgICAgICAgZGVwX2JpbiA9IHNlbGZbZGVwX3BhdGhdW3NlbGYuQ09MX0JJTkJdLnNwbGl0KCcsICcpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBpdGVtX25hbWUgaW4gZGVwX2JpbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlcF9iaW4uYXBwZW5kKGl0ZW1fbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZbZGVwX3BhdGhdW3NlbGYuQ09MX0JJTkJdID0gJywgJy5qb2luKGRlcF9iaW4pLmxzdHJpcCgnLCAnKQorICAgICAgICAgICAgICAgIGVsaWYgbm90IGRlcF9pbmNsdWRlZDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5pbmNsdWRlX2l0ZW0oZGVwX3BhdGgsIGJpbmI9aXRlbV9uYW1lKQorCisgICAgZGVmIGV4Y2x1ZGVfaXRlbShzZWxmLCBpdGVtX3BhdGgpOgorICAgICAgICBpZiBub3Qgc2VsZi5wYXRoX2luY2x1ZGVkKGl0ZW1fcGF0aCk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmW2l0ZW1fcGF0aF1bc2VsZi5DT0xfSU5DXSA9IEZhbHNlCisKKyAgICAgICAgaXRlbV9uYW1lID0gc2VsZltpdGVtX3BhdGhdW3NlbGYuQ09MX05BTUVdCisgICAgICAgIGl0ZW1fZGVwcyA9IHNlbGZbaXRlbV9wYXRoXVtzZWxmLkNPTF9SREVQXQorICAgICAgICBpZiBpdGVtX2RlcHM6CisgICAgICAgICAgICBmb3IgZGVwIGluIGl0ZW1fZGVwcy5zcGxpdCgiICIpOgorICAgICAgICAgICAgICAgIGlmIGRlcC5zdGFydHN3aXRoKCcoJyk6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZGVwX3BhdGggPSBzZWxmLmZpbmRfcGF0aF9mb3JfaXRlbShkZXApCisgICAgICAgICAgICAgICAgaWYgbm90IGRlcF9wYXRoOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGRlcF9iaW4gPSBzZWxmW2RlcF9wYXRoXVtzZWxmLkNPTF9CSU5CXS5zcGxpdCgnLCAnKQorICAgICAgICAgICAgICAgIGlmIGl0ZW1fbmFtZSBpbiBkZXBfYmluOgorICAgICAgICAgICAgICAgICAgICBkZXBfYmluLnJlbW92ZShpdGVtX25hbWUpCisgICAgICAgICAgICAgICAgICAgIHNlbGZbZGVwX3BhdGhdW3NlbGYuQ09MX0JJTkJdID0gJywgJy5qb2luKGRlcF9iaW4pLmxzdHJpcCgnLCAnKQorCisgICAgICAgIGl0ZW1fYmluID0gc2VsZltpdGVtX3BhdGhdW3NlbGYuQ09MX0JJTkJdLnNwbGl0KCcsICcpCisgICAgICAgIGlmIGl0ZW1fYmluOgorICAgICAgICAgICAgZm9yIGJpbmIgaW4gaXRlbV9iaW46CisgICAgICAgICAgICAgICAgYmluYl9wYXRoID0gc2VsZi5maW5kX3BhdGhfZm9yX2l0ZW0oYmluYikKKyAgICAgICAgICAgICAgICBpZiBub3QgYmluYl9wYXRoOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHNlbGYuZXhjbHVkZV9pdGVtKGJpbmJfcGF0aCkKKworICAgICIiIgorICAgIEVtcHR5IHNlbGYuY29udGVudHMgYnkgc2V0dGluZyB0aGUgaW5jbHVkZSBvZiBlYWNoIGVudHJ5IHRvIE5vbmUKKyAgICAiIiIKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIGl0ID0gc2VsZi5nZXRfaXRlcl9maXJzdCgpCisgICAgICAgIHdoaWxlIGl0OgorICAgICAgICAgICAgc2VsZi5zZXQoaXQsCisgICAgICAgICAgICAgICAgICAgICBzZWxmLkNPTF9JTkMsIEZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgc2VsZi5DT0xfQklOQiwgIiIpCisgICAgICAgICAgICBpdCA9IHNlbGYuaXRlcl9uZXh0KGl0KQorCisgICAgICAgIHNlbGYuc2VsZWN0aW9uX2NoYW5nZV9ub3RpZmljYXRpb24oKQorCisgICAgZGVmIGdldF9zZWxlY3RlZF9wYWNrYWdlcyhzZWxmKToKKyAgICAgICAgcGFja2FnZWxpc3QgPSBbXQorCisgICAgICAgIGl0ID0gc2VsZi5nZXRfaXRlcl9maXJzdCgpCisgICAgICAgIHdoaWxlIGl0OgorICAgICAgICAgICAgaWYgc2VsZi5nZXRfdmFsdWUoaXQsIHNlbGYuQ09MX0lOQyk6CisgICAgICAgICAgICAgICAgbmFtZSA9IHNlbGYuZ2V0X3ZhbHVlKGl0LCBzZWxmLkNPTF9OQU1FKQorICAgICAgICAgICAgICAgIHBhY2thZ2VsaXN0LmFwcGVuZChuYW1lKQorICAgICAgICAgICAgaXQgPSBzZWxmLml0ZXJfbmV4dChpdCkKKworICAgICAgICByZXR1cm4gcGFja2FnZWxpc3QKKworICAgIGRlZiBnZXRfdXNlcl9zZWxlY3RlZF9wYWNrYWdlcyhzZWxmKToKKyAgICAgICAgcGFja2FnZWxpc3QgPSBbXQorCisgICAgICAgIGl0ID0gc2VsZi5nZXRfaXRlcl9maXJzdCgpCisgICAgICAgIHdoaWxlIGl0OgorICAgICAgICAgICAgaWYgc2VsZi5nZXRfdmFsdWUoaXQsIHNlbGYuQ09MX0lOQyk6CisgICAgICAgICAgICAgICAgYmluYiA9IHNlbGYuZ2V0X3ZhbHVlKGl0LCBzZWxmLkNPTF9CSU5CKQorICAgICAgICAgICAgICAgIGlmIGJpbmIgPT0gIlVzZXIgU2VsZWN0ZWQiOgorICAgICAgICAgICAgICAgICAgICBuYW1lID0gc2VsZi5nZXRfdmFsdWUoaXQsIHNlbGYuQ09MX05BTUUpCisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VsaXN0LmFwcGVuZChuYW1lKQorICAgICAgICAgICAgaXQgPSBzZWxmLml0ZXJfbmV4dChpdCkKKworICAgICAgICByZXR1cm4gcGFja2FnZWxpc3QKKworICAgIGRlZiBnZXRfc2VsZWN0ZWRfcGFja2FnZXNfdG9vbGNoYWluKHNlbGYpOgorICAgICAgICBwYWNrYWdlbGlzdCA9IFtdCisKKyAgICAgICAgaXQgPSBzZWxmLmdldF9pdGVyX2ZpcnN0KCkKKyAgICAgICAgd2hpbGUgaXQ6CisgICAgICAgICAgICBpZiBzZWxmLmdldF92YWx1ZShpdCwgc2VsZi5DT0xfSU5DKToKKyAgICAgICAgICAgICAgICBuYW1lID0gc2VsZi5nZXRfdmFsdWUoaXQsIHNlbGYuQ09MX05BTUUpCisgICAgICAgICAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgiLWRldiIpIG9yIG5hbWUuZW5kc3dpdGgoIi1kYmciKToKKyAgICAgICAgICAgICAgICAgICAgcGFja2FnZWxpc3QuYXBwZW5kKG5hbWUpCisgICAgICAgICAgICBpdCA9IHNlbGYuaXRlcl9uZXh0KGl0KQorCisgICAgICAgIHJldHVybiBsaXN0KHNldChwYWNrYWdlbGlzdCArIHNlbGYuX190b29sY2hhaW5fcmVxdWlyZWRfcGFja2FnZXNfXykpOworCisgICAgIiIiCisgICAgUGFja2FnZSBtb2RlbCBtYXkgYmUgaW5jb21wbGV0ZSwgdGhlcmVmb3JlIHdoZW4gY2FsbGluZyB0aGUKKyAgICBzZXRfc2VsZWN0ZWRfcGFja2FnZXMoKSwgc29tZSBwYWNrYWdlcyB3aWxsIG5vdCBiZSBzZXQgaW5jbHVkZWQuCisgICAgUmV0dXJuIHRoZSB1bi1zZXQgcGFja2FnZXMgbGlzdC4KKyAgICAiIiIKKyAgICBkZWYgc2V0X3NlbGVjdGVkX3BhY2thZ2VzKHNlbGYsIHBhY2thZ2VsaXN0LCB1c2VyX3NlbGVjdGVkPUZhbHNlKToKKyAgICAgICAgbGVmdCA9IFtdCisgICAgICAgIGJpbmIgPSAnVXNlciBTZWxlY3RlZCcgaWYgdXNlcl9zZWxlY3RlZCBlbHNlICcnCisgICAgICAgIGZvciBwbiBpbiBwYWNrYWdlbGlzdDoKKyAgICAgICAgICAgIGlmIHBuIGluIHNlbGYucG5fcGF0aC5rZXlzKCk6CisgICAgICAgICAgICAgICAgcGF0aCA9IHNlbGYucG5fcGF0aFtwbl0KKyAgICAgICAgICAgICAgICBzZWxmLmluY2x1ZGVfaXRlbShpdGVtX3BhdGg9cGF0aCwgYmluYj1iaW5iKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBsZWZ0LmFwcGVuZChwbikKKworICAgICAgICBzZWxmLnNlbGVjdGlvbl9jaGFuZ2Vfbm90aWZpY2F0aW9uKCkKKyAgICAgICAgcmV0dXJuIGxlZnQKKworICAgICIiIgorICAgIFJldHVybiB0aGUgc2VsZWN0ZWQgcGFja2FnZSBzaXplLCB1bml0IGlzIEIuCisgICAgIiIiCisgICAgZGVmIGdldF9wYWNrYWdlc19zaXplKHNlbGYpOgorICAgICAgICBwYWNrYWdlc19zaXplID0gMAorICAgICAgICBpdCA9IHNlbGYuZ2V0X2l0ZXJfZmlyc3QoKQorICAgICAgICB3aGlsZSBpdDoKKyAgICAgICAgICAgIGlmIHNlbGYuZ2V0X3ZhbHVlKGl0LCBzZWxmLkNPTF9JTkMpOgorICAgICAgICAgICAgICAgIHN0cl9zaXplID0gc2VsZi5nZXRfdmFsdWUoaXQsIHNlbGYuQ09MX1NJWkUpCisgICAgICAgICAgICAgICAgaWYgbm90IHN0cl9zaXplOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgcGFja2FnZXNfc2l6ZSArPSBIb2JQYWdlLl9zdHJpbmdfdG9fc2l6ZShzdHJfc2l6ZSkKKworICAgICAgICAgICAgaXQgPSBzZWxmLml0ZXJfbmV4dChpdCkKKyAgICAgICAgcmV0dXJuIHBhY2thZ2VzX3NpemUKKworICAgICIiIgorICAgIFJlc3luYyB0aGUgc3RhdGUgb2YgaW5jbHVkZWQgaXRlbXMgdG8gYSBiYWNrdXAgY29sdW1uIGJlZm9yZSBwZXJmb3JtaW5nIHRoZSBmYWRlb3V0IHZpc2libGUgZWZmZWN0CisgICAgIiIiCisgICAgZGVmIHJlc3luY19mYWRlb3V0X2NvbHVtbihzZWxmLCBtb2RlbF9maXJzdF9pdGVyPU5vbmUpOgorICAgICAgICBpdCA9IG1vZGVsX2ZpcnN0X2l0ZXIKKyAgICAgICAgd2hpbGUgaXQ6CisgICAgICAgICAgICBhY3RpdmUgPSBzZWxmLmdldF92YWx1ZShpdCwgc2VsZi5DT0xfSU5DKQorICAgICAgICAgICAgc2VsZi5zZXQoaXQsIHNlbGYuQ09MX0ZBREVfSU5DLCBhY3RpdmUpCisgICAgICAgICAgICBpdCA9IHNlbGYuaXRlcl9uZXh0KGl0KQorCisjCisjIFJlY2lwZUxpc3RNb2RlbAorIworY2xhc3MgUmVjaXBlTGlzdE1vZGVsKGd0ay5MaXN0U3RvcmUpOgorICAgICIiIgorICAgIFRoaXMgY2xhc3MgZGVmaW5lcyBhbiBndGsuTGlzdFN0b3JlIHN1YmNsYXNzIHdoaWNoIHdpbGwgY29udmVydCB0aGUgb3V0cHV0CisgICAgb2YgdGhlIGJiLmV2ZW50LlRhcmdldHNUcmVlR2VuZXJhdGVkIGV2ZW50IGludG8gYSBndGsuTGlzdFN0b3JlIHdoaWxzdCBhbHNvCisgICAgcHJvdmlkaW5nIGNvbnZlbmllbmNlIGZ1bmN0aW9ucyB0byBhY2Nlc3MgZ3RrLlRyZWVNb2RlbCBzdWJjbGFzc2VzIHdoaWNoCisgICAgcHJvdmlkZSBmaWx0ZXJlZCB2aWV3cyBvZiB0aGUgZGF0YS4KKyAgICAiIiIKKyAgICAoQ09MX05BTUUsIENPTF9ERVNDLCBDT0xfTElDLCBDT0xfR1JPVVAsIENPTF9ERVBTLCBDT0xfQklOQiwgQ09MX1RZUEUsIENPTF9JTkMsIENPTF9JTUcsIENPTF9JTlNUQUxMLCBDT0xfUE4sIENPTF9GQURFX0lOQywgQ09MX1NVTU1BUlksIENPTF9WRVJTSU9OLAorICAgICBDT0xfUkVWSVNJT04sIENPTF9IT01FUEFHRSwgQ09MX0JVR1RSQUNLRVIsIENPTF9GSUxFKSA9IHJhbmdlKDE4KQorCisgICAgX19jdXN0b21faW1hZ2VfXyA9ICJTdGFydCB3aXRoIGFuIGVtcHR5IGltYWdlIHJlY2lwZSIKKworICAgIF9fZ3NpZ25hbHNfXyA9IHsKKyAgICAgICAgInJlY2lwZS1zZWxlY3Rpb24tY2hhbmdlZCIgOiAoZ29iamVjdC5TSUdOQUxfUlVOX0xBU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSksCisgICAgICAgIH0KKworICAgICIiIgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgZ3RrLkxpc3RTdG9yZS5fX2luaXRfXyAoc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX0JPT0xFQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9CT09MRUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfQk9PTEVBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX1NUUklORykKKyAgICAgICAgc2VsZi5zb3J0X2NvbHVtbl9pZCwgc2VsZi5zb3J0X29yZGVyID0gUmVjaXBlTGlzdE1vZGVsLkNPTF9OQU1FLCBndGsuU09SVF9BU0NFTkRJTkcKKworICAgICIiIgorICAgIEZpbmQgdGhlIG1vZGVsIHBhdGggZm9yIHRoZSBpdGVtX25hbWUKKyAgICBSZXR1cm5zIHRoZSBwYXRoIGluIHRoZSBtb2RlbCBvciBOb25lCisgICAgIiIiCisgICAgZGVmIGZpbmRfcGF0aF9mb3JfaXRlbShzZWxmLCBpdGVtX25hbWUpOgorICAgICAgICBpZiBzZWxmLm5vbl90YXJnZXRfbmFtZShpdGVtX25hbWUpIG9yIGl0ZW1fbmFtZSBub3QgaW4gc2VsZi5wbl9wYXRoLmtleXMoKToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5wbl9wYXRoW2l0ZW1fbmFtZV0KKworICAgIGRlZiBmaW5kX2l0ZW1fZm9yX3BhdGgoc2VsZiwgaXRlbV9wYXRoKToKKyAgICAgICAgcmV0dXJuIHNlbGZbaXRlbV9wYXRoXVtzZWxmLkNPTF9OQU1FXQorCisgICAgIiIiCisgICAgSGVscGVyIG1ldGhvZCB0byBkZXRlcm1pbmUgd2hldGhlciBuYW1lIGlzIGEgdGFyZ2V0IHBuCisgICAgIiIiCisgICAgZGVmIG5vbl90YXJnZXRfbmFtZShzZWxmLCBuYW1lKToKKyAgICAgICAgaWYgbmFtZSBhbmQgKCctbmF0aXZlJyBpbiBuYW1lKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgIiIiCisgICAgSGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIGFuIGl0ZW0gaXMgYW4gaXRlbSBzcGVjaWZpZWQgYnkgZmlsdGVyCisgICAgIiIiCisgICAgZGVmIHRyZWVfbW9kZWxfZmlsdGVyKHNlbGYsIG1vZGVsLCBpdCwgZmlsdGVyKToKKyAgICAgICAgbmFtZSA9IG1vZGVsLmdldF92YWx1ZShpdCwgc2VsZi5DT0xfTkFNRSkKKyAgICAgICAgaWYgc2VsZi5ub25fdGFyZ2V0X25hbWUobmFtZSk6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBmb3Iga2V5IGluIGZpbHRlci5rZXlzKCk6CisgICAgICAgICAgICBpZiBrZXkgPT0gc2VsZi5DT0xfTkFNRToKKyAgICAgICAgICAgICAgICBpZiBmaWx0ZXJba2V5XSAhPSAnU2VhcmNoIHJlY2lwZXMgYnkgbmFtZScgYW5kIGZpbHRlcltrZXldICE9ICdTZWFyY2ggcGFja2FnZSBncm91cHMgYnkgbmFtZSc6CisgICAgICAgICAgICAgICAgICAgIGlmIGZpbHRlcltrZXldIG5vdCBpbiBuYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIG1vZGVsLmdldF92YWx1ZShpdCwga2V5KSBub3QgaW4gZmlsdGVyW2tleV06CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBzZWxmLmZpbHRlcmVkX25iICs9IDEKKworICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGV4Y2x1ZGVfaXRlbV9zb3J0X2Z1bmMoc2VsZiwgbW9kZWwsIGl0ZXIxLCBpdGVyMiwgdXNlcl9kYXRhPU5vbmUpOgorICAgICAgICBpZiB1c2VyX2RhdGE6CisgICAgICAgICAgICB2YWwxID0gbW9kZWwuZ2V0X3ZhbHVlKGl0ZXIxLCBSZWNpcGVMaXN0TW9kZWwuQ09MX05BTUUpCisgICAgICAgICAgICB2YWwyID0gbW9kZWwuZ2V0X3ZhbHVlKGl0ZXIyLCBSZWNpcGVMaXN0TW9kZWwuQ09MX05BTUUpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5jbXBfdmFscyh2YWwxLCB2YWwyLCB1c2VyX2RhdGEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB2YWwxID0gbW9kZWwuZ2V0X3ZhbHVlKGl0ZXIxLCBSZWNpcGVMaXN0TW9kZWwuQ09MX0ZBREVfSU5DKQorICAgICAgICAgICAgdmFsMiA9IG1vZGVsLmdldF92YWx1ZShpdGVyMiwgUmVjaXBlTGlzdE1vZGVsLkNPTF9JTkMpCisgICAgICAgICAgICByZXR1cm4gKCh2YWwxID09IFRydWUpIGFuZCAodmFsMiA9PSBGYWxzZSkpCisKKyAgICBkZWYgaW5jbHVkZV9pdGVtX3NvcnRfZnVuYyhzZWxmLCBtb2RlbCwgaXRlcjEsIGl0ZXIyLCB1c2VyX2RhdGE9Tm9uZSk6CisgICAgICAgIGlmIHVzZXJfZGF0YToKKyAgICAgICAgICAgIHZhbDEgPSBtb2RlbC5nZXRfdmFsdWUoaXRlcjEsIFJlY2lwZUxpc3RNb2RlbC5DT0xfTkFNRSkKKyAgICAgICAgICAgIHZhbDIgPSBtb2RlbC5nZXRfdmFsdWUoaXRlcjIsIFJlY2lwZUxpc3RNb2RlbC5DT0xfTkFNRSkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNtcF92YWxzKHZhbDEsIHZhbDIsIHVzZXJfZGF0YSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHZhbDEgPSBtb2RlbC5nZXRfdmFsdWUoaXRlcjEsIFJlY2lwZUxpc3RNb2RlbC5DT0xfSU5DKQorICAgICAgICAgICAgdmFsMiA9IG1vZGVsLmdldF92YWx1ZShpdGVyMiwgUmVjaXBlTGlzdE1vZGVsLkNPTF9JTkMpCisgICAgICAgICAgICByZXR1cm4gKCh2YWwxID09IEZhbHNlKSBhbmQgKHZhbDIgPT0gVHJ1ZSkpCisKKyAgICBkZWYgc29ydF9mdW5jKHNlbGYsIG1vZGVsLCBpdGVyMSwgaXRlcjIsIHVzZXJfZGF0YSk6CisgICAgICAgIHZhbDEgPSBtb2RlbC5nZXRfdmFsdWUoaXRlcjEsIFJlY2lwZUxpc3RNb2RlbC5DT0xfTkFNRSkKKyAgICAgICAgdmFsMiA9IG1vZGVsLmdldF92YWx1ZShpdGVyMiwgUmVjaXBlTGlzdE1vZGVsLkNPTF9OQU1FKQorICAgICAgICByZXR1cm4gc2VsZi5jbXBfdmFscyh2YWwxLCB2YWwyLCB1c2VyX2RhdGEpCisKKyAgICBkZWYgY21wX3ZhbHMoc2VsZiwgdmFsMSwgdmFsMiwgdXNlcl9kYXRhKToKKyAgICAgICAgaWYgdmFsMSBpcyBOb25lIG9yIHZhbDIgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIGVsaWYgdmFsMS5zdGFydHN3aXRoKHVzZXJfZGF0YSkgYW5kIG5vdCB2YWwyLnN0YXJ0c3dpdGgodXNlcl9kYXRhKToKKyAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICBlbGlmIG5vdCB2YWwxLnN0YXJ0c3dpdGgodXNlcl9kYXRhKSBhbmQgdmFsMi5zdGFydHN3aXRoKHVzZXJfZGF0YSk6CisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGNtcCh2YWwxLCB2YWwyKQorCisgICAgIiIiCisgICAgQ3JlYXRlLCBpZiByZXF1aXJlZCwgYW5kIHJldHVybiBhIGZpbHRlcmVkIGd0ay5UcmVlTW9kZWxTb3J0CisgICAgY29udGFpbmluZyBvbmx5IHRoZSBpdGVtcyBzcGVjaWZpZWQgYnkgZmlsdGVyCisgICAgIiIiCisgICAgZGVmIHRyZWVfbW9kZWwoc2VsZiwgZmlsdGVyLCBleGNsdWRlZF9pdGVtc19haGVhZD1GYWxzZSwgaW5jbHVkZWRfaXRlbXNfYWhlYWQ9RmFsc2UsIHNlYXJjaF9kYXRhPU5vbmUsIGluaXRpYWw9RmFsc2UpOgorICAgICAgICBtb2RlbCA9IHNlbGYuZmlsdGVyX25ldygpCisgICAgICAgIHNlbGYuZmlsdGVyZWRfbmIgPSAwCisgICAgICAgIG1vZGVsLnNldF92aXNpYmxlX2Z1bmMoc2VsZi50cmVlX21vZGVsX2ZpbHRlciwgZmlsdGVyKQorCisgICAgICAgIHNvcnQgPSBndGsuVHJlZU1vZGVsU29ydChtb2RlbCkKKyAgICAgICAgc29ydC5jb25uZWN0ICgnc29ydC1jb2x1bW4tY2hhbmdlZCcsIHNlbGYuc29ydF9jb2x1bW5fY2hhbmdlZF9jYikKKyAgICAgICAgaWYgaW5pdGlhbDoKKyAgICAgICAgICAgIHNvcnQuc2V0X3NvcnRfY29sdW1uX2lkKFJlY2lwZUxpc3RNb2RlbC5DT0xfTkFNRSwgZ3RrLlNPUlRfQVNDRU5ESU5HKQorICAgICAgICAgICAgc29ydC5zZXRfZGVmYXVsdF9zb3J0X2Z1bmMoTm9uZSkKKyAgICAgICAgZWxpZiBleGNsdWRlZF9pdGVtc19haGVhZDoKKyAgICAgICAgICAgIHNvcnQuc2V0X2RlZmF1bHRfc29ydF9mdW5jKHNlbGYuZXhjbHVkZV9pdGVtX3NvcnRfZnVuYywgc2VhcmNoX2RhdGEpCisgICAgICAgIGVsaWYgaW5jbHVkZWRfaXRlbXNfYWhlYWQ6CisgICAgICAgICAgICBzb3J0LnNldF9kZWZhdWx0X3NvcnRfZnVuYyhzZWxmLmluY2x1ZGVfaXRlbV9zb3J0X2Z1bmMsIHNlYXJjaF9kYXRhKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VhcmNoX2RhdGEgYW5kIHNlYXJjaF9kYXRhIT0nU2VhcmNoIHJlY2lwZXMgYnkgbmFtZScgYW5kIHNlYXJjaF9kYXRhIT0nU2VhcmNoIHBhY2thZ2UgZ3JvdXBzIGJ5IG5hbWUnOgorICAgICAgICAgICAgICAgIHNvcnQuc2V0X2RlZmF1bHRfc29ydF9mdW5jKHNlbGYuc29ydF9mdW5jLCBzZWFyY2hfZGF0YSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc29ydC5zZXRfc29ydF9jb2x1bW5faWQoc2VsZi5zb3J0X2NvbHVtbl9pZCwgc2VsZi5zb3J0X29yZGVyKQorICAgICAgICAgICAgICAgIHNvcnQuc2V0X2RlZmF1bHRfc29ydF9mdW5jKE5vbmUpCisKKyAgICAgICAgc29ydC5zZXRfc29ydF9mdW5jKFJlY2lwZUxpc3RNb2RlbC5DT0xfSU5DLCBzZWxmLnNvcnRfY29sdW1uLCBSZWNpcGVMaXN0TW9kZWwuQ09MX0lOQykKKyAgICAgICAgc29ydC5zZXRfc29ydF9mdW5jKFJlY2lwZUxpc3RNb2RlbC5DT0xfR1JPVVAsIHNlbGYuc29ydF9jb2x1bW4sIFJlY2lwZUxpc3RNb2RlbC5DT0xfR1JPVVApCisgICAgICAgIHNvcnQuc2V0X3NvcnRfZnVuYyhSZWNpcGVMaXN0TW9kZWwuQ09MX0JJTkIsIHNlbGYuc29ydF9iaW5iX2NvbHVtbikKKyAgICAgICAgc29ydC5zZXRfc29ydF9mdW5jKFJlY2lwZUxpc3RNb2RlbC5DT0xfTElDLCBzZWxmLnNvcnRfY29sdW1uLCBSZWNpcGVMaXN0TW9kZWwuQ09MX0xJQykKKyAgICAgICAgcmV0dXJuIHNvcnQKKworICAgIGRlZiBzb3J0X2NvbHVtbl9jaGFuZ2VkX2NiIChzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5zb3J0X2NvbHVtbl9pZCwgc2VsZi5zb3J0X29yZGVyID0gZGF0YS5nZXRfc29ydF9jb2x1bW5faWQgKCkKKworICAgIGRlZiBzb3J0X2NvbHVtbihzZWxmLCBtb2RlbCwgcm93MSwgcm93MiwgY29sKToKKyAgICAgICAgdmFsdWUxID0gbW9kZWwuZ2V0X3ZhbHVlKHJvdzEsIGNvbCkKKyAgICAgICAgdmFsdWUyID0gbW9kZWwuZ2V0X3ZhbHVlKHJvdzIsIGNvbCkKKyAgICAgICAgY21wX3JlcyA9IGNtcCh2YWx1ZTEsIHZhbHVlMikKKyAgICAgICAgaWYgY21wX3JlcyE9MDoKKyAgICAgICAgICAgIGlmIGNvbD09UmVjaXBlTGlzdE1vZGVsLkNPTF9JTkM6CisgICAgICAgICAgICAgICAgcmV0dXJuIC1jbXBfcmVzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBjbXBfcmVzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuYW1lMSA9IG1vZGVsLmdldF92YWx1ZShyb3cxLCBSZWNpcGVMaXN0TW9kZWwuQ09MX05BTUUpCisgICAgICAgICAgICBuYW1lMiA9IG1vZGVsLmdldF92YWx1ZShyb3cyLCBSZWNpcGVMaXN0TW9kZWwuQ09MX05BTUUpCisgICAgICAgICAgICByZXR1cm4gY21wKG5hbWUxLG5hbWUyKQorCisgICAgZGVmIHNvcnRfYmluYl9jb2x1bW4oc2VsZiwgbW9kZWwsIHJvdzEsIHJvdzIpOgorICAgICAgICB2YWx1ZTEgPSBtb2RlbC5nZXRfdmFsdWUocm93MSwgUmVjaXBlTGlzdE1vZGVsLkNPTF9CSU5CKQorICAgICAgICB2YWx1ZTIgPSBtb2RlbC5nZXRfdmFsdWUocm93MiwgUmVjaXBlTGlzdE1vZGVsLkNPTF9CSU5CKQorICAgICAgICB2YWx1ZTFfbGlzdCA9IHZhbHVlMS5zcGxpdCgnLCAnKQorICAgICAgICB2YWx1ZTJfbGlzdCA9IHZhbHVlMi5zcGxpdCgnLCAnKQorCisgICAgICAgIHZhbHVlMSA9IHZhbHVlMV9saXN0WzBdCisgICAgICAgIHZhbHVlMiA9IHZhbHVlMl9saXN0WzBdCisKKyAgICAgICAgY21wX3JlcyA9IGNtcCh2YWx1ZTEsIHZhbHVlMikKKyAgICAgICAgaWYgY21wX3Jlcz09MDoKKyAgICAgICAgICAgIGNtcF9zaXplID0gY21wKGxlbih2YWx1ZTFfbGlzdCksIGxlbih2YWx1ZTJfbGlzdCkpCisgICAgICAgICAgICBpZiBjbXBfc2l6ZT09MDoKKyAgICAgICAgICAgICAgICBuYW1lMSA9IG1vZGVsLmdldF92YWx1ZShyb3cxLCBSZWNpcGVMaXN0TW9kZWwuQ09MX05BTUUpCisgICAgICAgICAgICAgICAgbmFtZTIgPSBtb2RlbC5nZXRfdmFsdWUocm93MiwgUmVjaXBlTGlzdE1vZGVsLkNPTF9OQU1FKQorICAgICAgICAgICAgICAgIHJldHVybiBjbXAobmFtZTEsbmFtZTIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBjbXBfc2l6ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGNtcF9yZXMKKworICAgIGRlZiBjb252ZXJ0X3ZwYXRoX3RvX3BhdGgoc2VsZiwgdmlld19tb2RlbCwgdmlld19wYXRoKToKKyAgICAgICAgZmlsdGVyZWRfbW9kZWxfcGF0aCA9IHZpZXdfbW9kZWwuY29udmVydF9wYXRoX3RvX2NoaWxkX3BhdGgodmlld19wYXRoKQorICAgICAgICBmaWx0ZXJlZF9tb2RlbCA9IHZpZXdfbW9kZWwuZ2V0X21vZGVsKCkKKworICAgICAgICAjIGdldCB0aGUgcGF0aCBvZiB0aGUgb3JpZ2luYWwgbW9kZWwKKyAgICAgICAgcGF0aCA9IGZpbHRlcmVkX21vZGVsLmNvbnZlcnRfcGF0aF90b19jaGlsZF9wYXRoKGZpbHRlcmVkX21vZGVsX3BhdGgpCisgICAgICAgIHJldHVybiBwYXRoCisKKyAgICBkZWYgY29udmVydF9wYXRoX3RvX3ZwYXRoKHNlbGYsIHZpZXdfbW9kZWwsIHBhdGgpOgorICAgICAgICBpdCA9IHZpZXdfbW9kZWwuZ2V0X2l0ZXJfZmlyc3QoKQorICAgICAgICB3aGlsZSBpdDoKKyAgICAgICAgICAgIG5hbWUgPSBzZWxmLmZpbmRfaXRlbV9mb3JfcGF0aChwYXRoKQorICAgICAgICAgICAgdmlld19uYW1lID0gdmlld19tb2RlbC5nZXRfdmFsdWUoaXQsIFJlY2lwZUxpc3RNb2RlbC5DT0xfTkFNRSkKKyAgICAgICAgICAgIGlmIHZpZXdfbmFtZSA9PSBuYW1lOgorICAgICAgICAgICAgICAgIHZpZXdfcGF0aCA9IHZpZXdfbW9kZWwuZ2V0X3BhdGgoaXQpCisgICAgICAgICAgICAgICAgcmV0dXJuIHZpZXdfcGF0aAorICAgICAgICAgICAgaXQgPSB2aWV3X21vZGVsLml0ZXJfbmV4dChpdCkKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICIiIgorICAgIFRoZSBwb3B1bGF0ZSgpIGZ1bmN0aW9uIHRha2VzIGFzIGlucHV0IHRoZSBkYXRhIGZyb20gYQorICAgIGJiLmV2ZW50LlRhcmdldHNUcmVlR2VuZXJhdGVkIGV2ZW50IGFuZCBwb3B1bGF0ZXMgdGhlIFJlY2lwZUxpc3QuCisgICAgIiIiCisgICAgZGVmIHBvcHVsYXRlKHNlbGYsIGV2ZW50X21vZGVsKToKKyAgICAgICAgIyBGaXJzdCBjbGVhciB0aGUgbW9kZWwsIGluIGNhc2UgcmVwb3B1bGF0aW5nCisgICAgICAgIHNlbGYuY2xlYXIoKQorCisgICAgICAgICMgZHVtbXkgaW1hZ2UgZm9yIHByb21wdAorICAgICAgICBzZWxmLnNldF9pbl9saXN0KHNlbGYuX19jdXN0b21faW1hZ2VfXywgICJVc2UgJ0VkaXQgaW1hZ2UgcmVjaXBlJyB0byBjdXN0b21pemUgcmVjaXBlcyBhbmQgcGFja2FnZXMgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0byBiZSBpbmNsdWRlZCBpbiB5b3VyIGltYWdlICIpCisKKyAgICAgICAgZm9yIGl0ZW0gaW4gZXZlbnRfbW9kZWxbInBuIl06CisgICAgICAgICAgICBuYW1lID0gaXRlbQorICAgICAgICAgICAgZGVzYyA9IGV2ZW50X21vZGVsWyJwbiJdW2l0ZW1dWyJkZXNjcmlwdGlvbiJdCisgICAgICAgICAgICBsaWMgPSBldmVudF9tb2RlbFsicG4iXVtpdGVtXVsibGljZW5zZSJdCisgICAgICAgICAgICBncm91cCA9IGV2ZW50X21vZGVsWyJwbiJdW2l0ZW1dWyJzZWN0aW9uIl0KKyAgICAgICAgICAgIGluaGVyaXRzID0gZXZlbnRfbW9kZWxbInBuIl1baXRlbV1bImluaGVyaXRzIl0KKyAgICAgICAgICAgIHN1bW1hcnkgPSBldmVudF9tb2RlbFsicG4iXVtpdGVtXVsic3VtbWFyeSJdCisgICAgICAgICAgICB2ZXJzaW9uID0gZXZlbnRfbW9kZWxbInBuIl1baXRlbV1bInZlcnNpb24iXQorICAgICAgICAgICAgcmV2aXNpb24gPSBldmVudF9tb2RlbFsicG4iXVtpdGVtXVsicHJldmlzaW9uIl0KKyAgICAgICAgICAgIGhvbWVwYWdlID0gZXZlbnRfbW9kZWxbInBuIl1baXRlbV1bImhvbWVwYWdlIl0KKyAgICAgICAgICAgIGJ1Z3RyYWNrZXIgPSBldmVudF9tb2RlbFsicG4iXVtpdGVtXVsiYnVndHJhY2tlciJdCisgICAgICAgICAgICBmaWxlbmFtZSA9IGV2ZW50X21vZGVsWyJwbiJdW2l0ZW1dWyJmaWxlbmFtZSJdCisgICAgICAgICAgICBpbnN0YWxsID0gW10KKworICAgICAgICAgICAgZGVwZW5kcyA9IGV2ZW50X21vZGVsWyJkZXBlbmRzIl0uZ2V0KGl0ZW0sIFtdKSArIGV2ZW50X21vZGVsWyJyZGVwZW5kcy1wbiJdLmdldChpdGVtLCBbXSkKKworICAgICAgICAgICAgaWYgKCdwYWNrYWdlZ3JvdXAuYmJjbGFzcycgaW4gIiAiLmpvaW4oaW5oZXJpdHMpKToKKyAgICAgICAgICAgICAgICBhdHlwZSA9ICdwYWNrYWdlZ3JvdXAnCisgICAgICAgICAgICBlbGlmICgnL2ltYWdlLmJiY2xhc3MnIGluICIgIi5qb2luKGluaGVyaXRzKSk6CisgICAgICAgICAgICAgICAgaWYgImVkaXRlZCIgbm90IGluIG5hbWU6CisgICAgICAgICAgICAgICAgICAgIGF0eXBlID0gJ2ltYWdlJworICAgICAgICAgICAgICAgICAgICBpbnN0YWxsID0gZXZlbnRfbW9kZWxbInJkZXBlbmRzLXBrZyJdLmdldChpdGVtLCBbXSkgKyBldmVudF9tb2RlbFsicnJlY3MtcGtnIl0uZ2V0KGl0ZW0sIFtdKQorICAgICAgICAgICAgZWxpZiAoJ21ldGEtJyBpbiBuYW1lKToKKyAgICAgICAgICAgICAgICBhdHlwZSA9ICd0b29sY2hhaW4nCisgICAgICAgICAgICBlbGlmIChuYW1lID09ICdkdW1teS1pbWFnZScgb3IgbmFtZSA9PSAnZHVtbXktdG9vbGNoYWluJyk6CisgICAgICAgICAgICAgICAgYXR5cGUgPSAnZHVtbXknCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGF0eXBlID0gJ3JlY2lwZScKKworICAgICAgICAgICAgc2VsZi5zZXQoc2VsZi5hcHBlbmQoKSwgc2VsZi5DT0xfTkFNRSwgaXRlbSwgc2VsZi5DT0xfREVTQywgZGVzYywKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuQ09MX0xJQywgbGljLCBzZWxmLkNPTF9HUk9VUCwgZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICBzZWxmLkNPTF9ERVBTLCAiICIuam9pbihkZXBlbmRzKSwgc2VsZi5DT0xfQklOQiwgIiIsCisgICAgICAgICAgICAgICAgICAgICBzZWxmLkNPTF9UWVBFLCBhdHlwZSwgc2VsZi5DT0xfSU5DLCBGYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuQ09MX0lNRywgRmFsc2UsIHNlbGYuQ09MX0lOU1RBTEwsICIgIi5qb2luKGluc3RhbGwpLCBzZWxmLkNPTF9QTiwgaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuQ09MX1NVTU1BUlksIHN1bW1hcnksIHNlbGYuQ09MX1ZFUlNJT04sIHZlcnNpb24sIHNlbGYuQ09MX1JFVklTSU9OLCByZXZpc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuQ09MX0hPTUVQQUdFLCBob21lcGFnZSwgc2VsZi5DT0xfQlVHVFJBQ0tFUiwgYnVndHJhY2tlciwKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuQ09MX0ZJTEUsIGZpbGVuYW1lKQorCisgICAgICAgIHNlbGYucG5fcGF0aCA9IHt9CisgICAgICAgIGl0ID0gc2VsZi5nZXRfaXRlcl9maXJzdCgpCisgICAgICAgIHdoaWxlIGl0OgorICAgICAgICAgICAgcG4gPSBzZWxmLmdldF92YWx1ZShpdCwgc2VsZi5DT0xfTkFNRSkKKyAgICAgICAgICAgIHBhdGggPSBzZWxmLmdldF9wYXRoKGl0KQorICAgICAgICAgICAgc2VsZi5wbl9wYXRoW3BuXSA9IHBhdGgKKyAgICAgICAgICAgIGl0ID0gc2VsZi5pdGVyX25leHQoaXQpCisKKyAgICBkZWYgc2V0X2luX2xpc3Qoc2VsZiwgaXRlbSwgZGVzYyk6CisgICAgICAgIHNlbGYuc2V0KHNlbGYuYXBwZW5kKCksIHNlbGYuQ09MX05BTUUsIGl0ZW0sCisgICAgICAgICAgICAgICAgIHNlbGYuQ09MX0RFU0MsIGRlc2MsCisgICAgICAgICAgICAgICAgIHNlbGYuQ09MX0xJQywgIiIsIHNlbGYuQ09MX0dST1VQLCAiIiwKKyAgICAgICAgICAgICAgICAgc2VsZi5DT0xfREVQUywgIiIsIHNlbGYuQ09MX0JJTkIsICIiLAorICAgICAgICAgICAgICAgICBzZWxmLkNPTF9UWVBFLCAiaW1hZ2UiLCBzZWxmLkNPTF9JTkMsIEZhbHNlLAorICAgICAgICAgICAgICAgICBzZWxmLkNPTF9JTUcsIEZhbHNlLCBzZWxmLkNPTF9JTlNUQUxMLCAiIiwgc2VsZi5DT0xfUE4sIGl0ZW0sCisgICAgICAgICAgICAgICAgIHNlbGYuQ09MX1NVTU1BUlksICIiLCBzZWxmLkNPTF9WRVJTSU9OLCAiIiwgc2VsZi5DT0xfUkVWSVNJT04sICIiLAorICAgICAgICAgICAgICAgICBzZWxmLkNPTF9IT01FUEFHRSwgIiIsIHNlbGYuQ09MX0JVR1RSQUNLRVIsICIiKQorICAgICAgICBzZWxmLnBuX3BhdGggPSB7fQorICAgICAgICBpdCA9IHNlbGYuZ2V0X2l0ZXJfZmlyc3QoKQorICAgICAgICB3aGlsZSBpdDoKKyAgICAgICAgICAgIHBuID0gc2VsZi5nZXRfdmFsdWUoaXQsIHNlbGYuQ09MX05BTUUpCisgICAgICAgICAgICBwYXRoID0gc2VsZi5nZXRfcGF0aChpdCkKKyAgICAgICAgICAgIHNlbGYucG5fcGF0aFtwbl0gPSBwYXRoCisgICAgICAgICAgICBpdCA9IHNlbGYuaXRlcl9uZXh0KGl0KQorCisgICAgIiIiCisgICAgVXBkYXRlIHRoZSBtb2RlbCwgc2VuZCBvdXQgdGhlIG5vdGlmaWNhdGlvbi4KKyAgICAiIiIKKyAgICBkZWYgc2VsZWN0aW9uX2NoYW5nZV9ub3RpZmljYXRpb24oc2VsZik6CisgICAgICAgIHNlbGYuZW1pdCgicmVjaXBlLXNlbGVjdGlvbi1jaGFuZ2VkIikKKworICAgIGRlZiBwYXRoX2luY2x1ZGVkKHNlbGYsIGl0ZW1fcGF0aCk6CisgICAgICAgIHJldHVybiBzZWxmW2l0ZW1fcGF0aF1bc2VsZi5DT0xfSU5DXQorCisgICAgIiIiCisgICAgQWRkIHRoaXMgaXRlbSwgYW5kIGFueSBvZiBpdHMgZGVwZW5kZW5jaWVzLCB0byB0aGUgaW1hZ2UgY29udGVudHMKKyAgICAiIiIKKyAgICBkZWYgaW5jbHVkZV9pdGVtKHNlbGYsIGl0ZW1fcGF0aCwgYmluYj0iIiwgaW1hZ2VfY29udGVudHM9RmFsc2UpOgorICAgICAgICBpZiBzZWxmLnBhdGhfaW5jbHVkZWQoaXRlbV9wYXRoKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGl0ZW1fbmFtZSA9IHNlbGZbaXRlbV9wYXRoXVtzZWxmLkNPTF9OQU1FXQorICAgICAgICBpdGVtX2RlcHMgPSBzZWxmW2l0ZW1fcGF0aF1bc2VsZi5DT0xfREVQU10KKworICAgICAgICBzZWxmW2l0ZW1fcGF0aF1bc2VsZi5DT0xfSU5DXSA9IFRydWUKKworICAgICAgICBpdGVtX2JpbiA9IHNlbGZbaXRlbV9wYXRoXVtzZWxmLkNPTF9CSU5CXS5zcGxpdCgnLCAnKQorICAgICAgICBpZiBiaW5iIGFuZCBub3QgYmluYiBpbiBpdGVtX2JpbjoKKyAgICAgICAgICAgIGl0ZW1fYmluLmFwcGVuZChiaW5iKQorICAgICAgICAgICAgc2VsZltpdGVtX3BhdGhdW3NlbGYuQ09MX0JJTkJdID0gJywgJy5qb2luKGl0ZW1fYmluKS5sc3RyaXAoJywgJykKKworICAgICAgICAjIFdlIHdhbnQgdG8gZG8gc29tZSBtYWdpYyB3aXRoIHRoaW5ncyB3aGljaCBhcmUgYnJvdWdodCBpbiBieSB0aGUKKyAgICAgICAgIyBiYXNlIGltYWdlIHNvIHRhZyB0aGVtIGFzIHNvCisgICAgICAgIGlmIGltYWdlX2NvbnRlbnRzOgorICAgICAgICAgICAgc2VsZltpdGVtX3BhdGhdW3NlbGYuQ09MX0lNR10gPSBUcnVlCisKKyAgICAgICAgaWYgaXRlbV9kZXBzOgorICAgICAgICAgICAgIyBFbnN1cmUgYWxsIG9mIHRoZSBpdGVtcyBkZXBzIGFyZSBpbmNsdWRlZCBhbmQsIHdoZXJlIGFwcHJvcHJpYXRlLAorICAgICAgICAgICAgIyBhZGQgdGhpcyBpdGVtIHRvIHRoZWlyIENPTF9CSU5CCisgICAgICAgICAgICBmb3IgZGVwIGluIGl0ZW1fZGVwcy5zcGxpdCgiICIpOgorICAgICAgICAgICAgICAgICMgSWYgdGhlIGNvbnRlbnRzIG1vZGVsIGRvZXNuJ3QgYWxyZWFkeSBjb250YWluIGRlcCwgYWRkIGl0CisgICAgICAgICAgICAgICAgZGVwX3BhdGggPSBzZWxmLmZpbmRfcGF0aF9mb3JfaXRlbShkZXApCisgICAgICAgICAgICAgICAgaWYgbm90IGRlcF9wYXRoOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGRlcF9pbmNsdWRlZCA9IHNlbGYucGF0aF9pbmNsdWRlZChkZXBfcGF0aCkKKworICAgICAgICAgICAgICAgIGlmIGRlcF9pbmNsdWRlZCBhbmQgbm90IGRlcCBpbiBpdGVtX2JpbjoKKyAgICAgICAgICAgICAgICAgICAgIyBkb24ndCBzZXQgdGhlIENPTF9CSU5CIHRvIHRoaXMgaXRlbSBpZiB0aGUgdGFyZ2V0IGlzIGFuCisgICAgICAgICAgICAgICAgICAgICMgaXRlbSBpbiBvdXIgb3duIENPTF9CSU5CCisgICAgICAgICAgICAgICAgICAgIGRlcF9iaW4gPSBzZWxmW2RlcF9wYXRoXVtzZWxmLkNPTF9CSU5CXS5zcGxpdCgnLCAnKQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgaXRlbV9uYW1lIGluIGRlcF9iaW46CisgICAgICAgICAgICAgICAgICAgICAgICBkZXBfYmluLmFwcGVuZChpdGVtX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmW2RlcF9wYXRoXVtzZWxmLkNPTF9CSU5CXSA9ICcsICcuam9pbihkZXBfYmluKS5sc3RyaXAoJywgJykKKyAgICAgICAgICAgICAgICBlbGlmIG5vdCBkZXBfaW5jbHVkZWQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5jbHVkZV9pdGVtKGRlcF9wYXRoLCBiaW5iPWl0ZW1fbmFtZSwgaW1hZ2VfY29udGVudHM9aW1hZ2VfY29udGVudHMpCisgICAgICAgIGRlcF9iaW4gPSBzZWxmW2l0ZW1fcGF0aF1bc2VsZi5DT0xfQklOQl0uc3BsaXQoJywgJykKKyAgICAgICAgaWYgc2VsZltpdGVtX3BhdGhdW3NlbGYuQ09MX05BTUVdIGluIGRlcF9iaW46CisgICAgICAgICAgICBkZXBfYmluLnJlbW92ZShzZWxmW2l0ZW1fcGF0aF1bc2VsZi5DT0xfTkFNRV0pCisgICAgICAgIHNlbGZbaXRlbV9wYXRoXVtzZWxmLkNPTF9CSU5CXSA9ICcsICcuam9pbihkZXBfYmluKS5sc3RyaXAoJywgJykKKworICAgIGRlZiBleGNsdWRlX2l0ZW0oc2VsZiwgaXRlbV9wYXRoKToKKyAgICAgICAgaWYgbm90IHNlbGYucGF0aF9pbmNsdWRlZChpdGVtX3BhdGgpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgc2VsZltpdGVtX3BhdGhdW3NlbGYuQ09MX0lOQ10gPSBGYWxzZQorCisgICAgICAgIGl0ZW1fbmFtZSA9IHNlbGZbaXRlbV9wYXRoXVtzZWxmLkNPTF9OQU1FXQorICAgICAgICBpdGVtX2RlcHMgPSBzZWxmW2l0ZW1fcGF0aF1bc2VsZi5DT0xfREVQU10KKyAgICAgICAgaWYgaXRlbV9kZXBzOgorICAgICAgICAgICAgZm9yIGRlcCBpbiBpdGVtX2RlcHMuc3BsaXQoIiAiKToKKyAgICAgICAgICAgICAgICBkZXBfcGF0aCA9IHNlbGYuZmluZF9wYXRoX2Zvcl9pdGVtKGRlcCkKKyAgICAgICAgICAgICAgICBpZiBub3QgZGVwX3BhdGg6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZGVwX2JpbiA9IHNlbGZbZGVwX3BhdGhdW3NlbGYuQ09MX0JJTkJdLnNwbGl0KCcsICcpCisgICAgICAgICAgICAgICAgaWYgaXRlbV9uYW1lIGluIGRlcF9iaW46CisgICAgICAgICAgICAgICAgICAgIGRlcF9iaW4ucmVtb3ZlKGl0ZW1fbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZltkZXBfcGF0aF1bc2VsZi5DT0xfQklOQl0gPSAnLCAnLmpvaW4oZGVwX2JpbikubHN0cmlwKCcsICcpCisKKyAgICAgICAgaXRlbV9iaW4gPSBzZWxmW2l0ZW1fcGF0aF1bc2VsZi5DT0xfQklOQl0uc3BsaXQoJywgJykKKyAgICAgICAgaWYgaXRlbV9iaW46CisgICAgICAgICAgICBmb3IgYmluYiBpbiBpdGVtX2JpbjoKKyAgICAgICAgICAgICAgICBiaW5iX3BhdGggPSBzZWxmLmZpbmRfcGF0aF9mb3JfaXRlbShiaW5iKQorICAgICAgICAgICAgICAgIGlmIG5vdCBiaW5iX3BhdGg6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgc2VsZi5leGNsdWRlX2l0ZW0oYmluYl9wYXRoKQorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICBpdCA9IHNlbGYuZ2V0X2l0ZXJfZmlyc3QoKQorICAgICAgICB3aGlsZSBpdDoKKyAgICAgICAgICAgIHNlbGYuc2V0KGl0LAorICAgICAgICAgICAgICAgICAgICAgc2VsZi5DT0xfSU5DLCBGYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuQ09MX0JJTkIsICIiLAorICAgICAgICAgICAgICAgICAgICAgc2VsZi5DT0xfSU1HLCBGYWxzZSkKKyAgICAgICAgICAgIGl0ID0gc2VsZi5pdGVyX25leHQoaXQpCisKKyAgICAgICAgc2VsZi5zZWxlY3Rpb25fY2hhbmdlX25vdGlmaWNhdGlvbigpCisKKyAgICAiIiIKKyAgICBSZXR1cm5zIHR3byBsaXN0cy4gT25lIG9mIHVzZXIgc2VsZWN0ZWQgcmVjaXBlcyBhbmQgdGhlIG90aGVyIGNvbnRhaW5pbmcKKyAgICBhbGwgc2VsZWN0ZWQgcmVjaXBlcworICAgICIiIgorICAgIGRlZiBnZXRfc2VsZWN0ZWRfcmVjaXBlcyhzZWxmKToKKyAgICAgICAgYWxscmVjaXBlcyA9IFtdCisgICAgICAgIHVzZXJyZWNpcGVzID0gW10KKworICAgICAgICBpdCA9IHNlbGYuZ2V0X2l0ZXJfZmlyc3QoKQorICAgICAgICB3aGlsZSBpdDoKKyAgICAgICAgICAgIGlmIHNlbGYuZ2V0X3ZhbHVlKGl0LCBzZWxmLkNPTF9JTkMpOgorICAgICAgICAgICAgICAgIG5hbWUgPSBzZWxmLmdldF92YWx1ZShpdCwgc2VsZi5DT0xfUE4pCisgICAgICAgICAgICAgICAgdHlwZSA9IHNlbGYuZ2V0X3ZhbHVlKGl0LCBzZWxmLkNPTF9UWVBFKQorICAgICAgICAgICAgICAgIGlmIHR5cGUgIT0gImltYWdlIjoKKyAgICAgICAgICAgICAgICAgICAgYWxscmVjaXBlcy5hcHBlbmQobmFtZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsID0gIlVzZXIgU2VsZWN0ZWQiIGluIHNlbGYuZ2V0X3ZhbHVlKGl0LCBzZWxmLkNPTF9CSU5CKQorICAgICAgICAgICAgICAgICAgICBpZiBzZWw6CisgICAgICAgICAgICAgICAgICAgICAgICB1c2VycmVjaXBlcy5hcHBlbmQobmFtZSkKKyAgICAgICAgICAgIGl0ID0gc2VsZi5pdGVyX25leHQoaXQpCisKKyAgICAgICAgcmV0dXJuIGxpc3Qoc2V0KHVzZXJyZWNpcGVzKSksIGxpc3Qoc2V0KGFsbHJlY2lwZXMpKQorCisgICAgZGVmIHNldF9zZWxlY3RlZF9yZWNpcGVzKHNlbGYsIHJlY2lwZWxpc3QpOgorICAgICAgICBmb3IgcG4gaW4gcmVjaXBlbGlzdDoKKyAgICAgICAgICAgIGlmIHBuIGluIHNlbGYucG5fcGF0aC5rZXlzKCk6CisgICAgICAgICAgICAgICAgcGF0aCA9IHNlbGYucG5fcGF0aFtwbl0KKyAgICAgICAgICAgICAgICBzZWxmLmluY2x1ZGVfaXRlbShpdGVtX3BhdGg9cGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5iPSJVc2VyIFNlbGVjdGVkIikKKyAgICAgICAgc2VsZi5zZWxlY3Rpb25fY2hhbmdlX25vdGlmaWNhdGlvbigpCisKKyAgICBkZWYgZ2V0X3NlbGVjdGVkX2ltYWdlKHNlbGYpOgorICAgICAgICBpdCA9IHNlbGYuZ2V0X2l0ZXJfZmlyc3QoKQorICAgICAgICB3aGlsZSBpdDoKKyAgICAgICAgICAgIGlmIHNlbGYuZ2V0X3ZhbHVlKGl0LCBzZWxmLkNPTF9JTkMpOgorICAgICAgICAgICAgICAgIG5hbWUgPSBzZWxmLmdldF92YWx1ZShpdCwgc2VsZi5DT0xfUE4pCisgICAgICAgICAgICAgICAgdHlwZSA9IHNlbGYuZ2V0X3ZhbHVlKGl0LCBzZWxmLkNPTF9UWVBFKQorICAgICAgICAgICAgICAgIGlmIHR5cGUgPT0gImltYWdlIjoKKyAgICAgICAgICAgICAgICAgICAgc2VsID0gIlVzZXIgU2VsZWN0ZWQiIGluIHNlbGYuZ2V0X3ZhbHVlKGl0LCBzZWxmLkNPTF9CSU5CKQorICAgICAgICAgICAgICAgICAgICBpZiBzZWw6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZQorICAgICAgICAgICAgaXQgPSBzZWxmLml0ZXJfbmV4dChpdCkKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBzZXRfc2VsZWN0ZWRfaW1hZ2Uoc2VsZiwgaW1nKToKKyAgICAgICAgaWYgbm90IGltZzoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLnJlc2V0KCkKKyAgICAgICAgcGF0aCA9IHNlbGYuZmluZF9wYXRoX2Zvcl9pdGVtKGltZykKKyAgICAgICAgc2VsZi5pbmNsdWRlX2l0ZW0oaXRlbV9wYXRoPXBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmI9IlVzZXIgU2VsZWN0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZV9jb250ZW50cz1UcnVlKQorICAgICAgICBzZWxmLnNlbGVjdGlvbl9jaGFuZ2Vfbm90aWZpY2F0aW9uKCkKKworICAgIGRlZiBzZXRfY3VzdG9tX2ltYWdlX3ZlcnNpb24oc2VsZiwgdmVyc2lvbik6CisgICAgICAgIHNlbGYuY3VzdG9tX2ltYWdlX3ZlcnNpb24gPSB2ZXJzaW9uCisKKyAgICBkZWYgZ2V0X2N1c3RvbV9pbWFnZV92ZXJzaW9uKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5jdXN0b21faW1hZ2VfdmVyc2lvbgorCisgICAgZGVmIGlzX2N1c3RvbV9pbWFnZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2V0X3NlbGVjdGVkX2ltYWdlKCkgPT0gc2VsZi5fX2N1c3RvbV9pbWFnZV9fCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaG9icGFnZXMucHkgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaG9icGFnZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGZkMzU5OAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9ob2JwYWdlcy5weQpAQCAtMCwwICsxLDEyOCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIEJpdEJha2UgR3JhcGhpY2FsIEdUSyBVc2VyIEludGVyZmFjZQorIworIyBDb3B5cmlnaHQgKEMpIDIwMTIgICAgICAgIEludGVsIENvcnBvcmF0aW9uCisjCisjIEF1dGhvcmVkIGJ5IERvbmd4aWFvIFh1IDxkb25neGlhby54dUBpbnRlbC5jb20+CisjIEF1dGhvcmVkIGJ5IFNoYW5lIFdhbmcgPHNoYW5lLndhbmdAaW50ZWwuY29tPgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworaW1wb3J0IGd0aworZnJvbSBiYi51aS5jcnVtYnMuaG9iY29sb3IgaW1wb3J0IEhvYkNvbG9ycworZnJvbSBiYi51aS5jcnVtYnMuaG9id2lkZ2V0IGltcG9ydCBod2MKKworIworIyBIb2JQYWdlOiB0aGUgc3VwZXIgY2xhc3MgZm9yIGFsbCBIb2ItcmVsYXRlZCBwYWdlcworIyAgICAKK2NsYXNzIEhvYlBhZ2UgKGd0ay5WQm94KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBidWlsZGVyLCB0aXRsZSA9IE5vbmUpOgorICAgICAgICBzdXBlcihIb2JQYWdlLCBzZWxmKS5fX2luaXRfXyhGYWxzZSwgMCkKKyAgICAgICAgc2VsZi5idWlsZGVyID0gYnVpbGRlcgorICAgICAgICBzZWxmLmJ1aWxkZXJfd2lkdGgsIHNlbGYuYnVpbGRlcl9oZWlnaHQgPSBzZWxmLmJ1aWxkZXIuc2l6ZV9yZXF1ZXN0KCkKKworICAgICAgICBpZiBub3QgdGl0bGU6CisgICAgICAgICAgICBzZWxmLnRpdGxlID0gIkhvYiAtLSBJbWFnZSBDcmVhdG9yIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi50aXRsZSA9IHRpdGxlCisgICAgICAgIHNlbGYudGl0bGVfbGFiZWwgPSBndGsuTGFiZWwoKQorCisgICAgICAgIHNlbGYuYm94X2dyb3VwX2FyZWEgPSBndGsuVkJveChGYWxzZSwgMTIpCisgICAgICAgIHNlbGYuYm94X2dyb3VwX2FyZWEuc2V0X3NpemVfcmVxdWVzdChzZWxmLmJ1aWxkZXJfd2lkdGggLSA3MyAtIDczLCBzZWxmLmJ1aWxkZXJfaGVpZ2h0IC0gODggLSAxNSAtIDE1KQorICAgICAgICBzZWxmLmdyb3VwX2FsaWduID0gZ3RrLkFsaWdubWVudCh4YWxpZ24gPSAwLCB5YWxpZ249MC41LCB4c2NhbGU9MSwgeXNjYWxlPTEpCisgICAgICAgIHNlbGYuZ3JvdXBfYWxpZ24uc2V0X3BhZGRpbmcoMTUsIDE1LCA3MywgNzMpCisgICAgICAgIHNlbGYuZ3JvdXBfYWxpZ24uYWRkKHNlbGYuYm94X2dyb3VwX2FyZWEpCisgICAgICAgIHNlbGYuYm94X2dyb3VwX2FyZWEuc2V0X2hvbW9nZW5lb3VzKEZhbHNlKQorCisgICAgZGVmIHNldF90aXRsZShzZWxmLCB0aXRsZSk6CisgICAgICAgIHNlbGYudGl0bGUgPSB0aXRsZQorICAgICAgICBzZWxmLnRpdGxlX2xhYmVsLnNldF9tYXJrdXAoIjxzcGFuIHNpemU9J3gtbGFyZ2UnPiVzPC9zcGFuPiIgJSBzZWxmLnRpdGxlKQorCisgICAgZGVmIGFkZF9vbnRvX3RvcF9iYXIoc2VsZiwgd2lkZ2V0ID0gTm9uZSwgcGFkZGluZyA9IDApOgorICAgICAgICAjIHRoZSB0b3AgYnV0dG9uIG9jY3VwaWVzIDEvNyBvZiB0aGUgcGFnZSBoZWlnaHQKKyAgICAgICAgIyBzZXR1cCBhbiBldmVudCBib3gKKyAgICAgICAgZXZlbnRib3ggPSBndGsuRXZlbnRCb3goKQorICAgICAgICBzdHlsZSA9IGV2ZW50Ym94LmdldF9zdHlsZSgpLmNvcHkoKQorICAgICAgICBzdHlsZS5iZ1tndGsuU1RBVEVfTk9STUFMXSA9IGV2ZW50Ym94LmdldF9jb2xvcm1hcCgpLmFsbG9jX2NvbG9yKEhvYkNvbG9ycy5MSUdIVF9HUkFZLCBGYWxzZSwgRmFsc2UpCisgICAgICAgIGV2ZW50Ym94LnNldF9zdHlsZShzdHlsZSkKKyAgICAgICAgZXZlbnRib3guc2V0X3NpemVfcmVxdWVzdCgtMSwgODgpCisKKyAgICAgICAgaGJveCA9IGd0ay5IQm94KCkKKworICAgICAgICBzZWxmLnRpdGxlX2xhYmVsID0gZ3RrLkxhYmVsKCkKKyAgICAgICAgc2VsZi50aXRsZV9sYWJlbC5zZXRfbWFya3VwKCI8c3BhbiBzaXplPSd4LWxhcmdlJz4lczwvc3Bhbj4iICUgc2VsZi50aXRsZSkKKyAgICAgICAgaGJveC5wYWNrX3N0YXJ0KHNlbGYudGl0bGVfbGFiZWwsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSwgcGFkZGluZz0yMCkKKworICAgICAgICBpZiB3aWRnZXQ6CisgICAgICAgICAgICAjIGFkZCB0aGUgd2lkZ2V0IGluIHRoZSBldmVudCBib3gKKyAgICAgICAgICAgIGhib3gucGFja19lbmQod2lkZ2V0LCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UsIHBhZGRpbmc9cGFkZGluZykKKyAgICAgICAgZXZlbnRib3guYWRkKGhib3gpCisKKyAgICAgICAgcmV0dXJuIGV2ZW50Ym94CisKKyAgICBkZWYgc3Bhbl90YWcoc2VsZiwgc2l6ZT0ibWVkaXVtIiwgd2VpZ2h0PSJub3JtYWwiLCBmb3Jncm91bmQ9IiMxYzFjMWMiKToKKyAgICAgICAgc3Bhbl90YWcgPSAid2VpZ2h0PSclcycgZm9yZWdyb3VuZD0nJXMnIHNpemU9JyVzJyIgJSAod2VpZ2h0LCBmb3Jncm91bmQsIHNpemUpCisgICAgICAgIHJldHVybiBzcGFuX3RhZworCisgICAgZGVmIGFwcGVuZF90b29sYmFyX2J1dHRvbihzZWxmLCB0b29sYmFyLCBidXR0b25uYW1lLCBpY29uX2Rpc3AsIGljb25faG92b3IsIHRpcCwgY2IpOgorICAgICAgICAjIENyZWF0ZSBhIGJ1dHRvbiBhbmQgYXBwZW5kIGl0IG9uIHRoZSB0b29sYmFyIGFjY29yZGluZyB0byBidXR0b24gbmFtZQorICAgICAgICBpY29uID0gZ3RrLkltYWdlKCkKKyAgICAgICAgaWNvbl9kaXNwbGF5ID0gaWNvbl9kaXNwCisgICAgICAgIGljb25faG92ZXIgPSBpY29uX2hvdm9yCisgICAgICAgIHBpeF9idWZmZXIgPSBndGsuZ2RrLnBpeGJ1Zl9uZXdfZnJvbV9maWxlKGljb25fZGlzcGxheSkKKyAgICAgICAgaWNvbi5zZXRfZnJvbV9waXhidWYocGl4X2J1ZmZlcikKKyAgICAgICAgdGlwX3RleHQgPSB0aXAKKyAgICAgICAgYnV0dG9uID0gdG9vbGJhci5hcHBlbmRfaXRlbShidXR0b25uYW1lLCB0aXAsIE5vbmUsIGljb24sIGNiKQorICAgICAgICByZXR1cm4gYnV0dG9uCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIF9zaXplX3RvX3N0cmluZyhzaXplKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgbm90IHNpemU6CisgICAgICAgICAgICAgICAgc2l6ZV9zdHIgPSAiMCBCIgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBsZW4oc3RyKGludChzaXplKSkpID4gNjoKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV9zdHIgPSAnJS4xZicgJSAoc2l6ZSoxLjAvKDEwMjQqMTAyNCkpICsgJyBNQicKKyAgICAgICAgICAgICAgICBlbGlmIGxlbihzdHIoaW50KHNpemUpKSkgPiAzOgorICAgICAgICAgICAgICAgICAgICBzaXplX3N0ciA9ICclLjFmJyAlIChzaXplKjEuMC8xMDI0KSArICcgS0InCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV9zdHIgPSBzdHIoc2l6ZSkgKyAnIEInCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNpemVfc3RyID0gIjAgQiIKKyAgICAgICAgcmV0dXJuIHNpemVfc3RyCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIF9zdHJpbmdfdG9fc2l6ZShzdHJfc2l6ZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIG5vdCBzdHJfc2l6ZToKKyAgICAgICAgICAgICAgICBzaXplID0gMAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB1bml0ID0gc3RyX3NpemUuc3BsaXQoKQorICAgICAgICAgICAgICAgIGlmIGxlbih1bml0KSA+IDE6CisgICAgICAgICAgICAgICAgICAgIGlmIHVuaXRbMV0gPT0gJ01CJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBmbG9hdCh1bml0WzBdKSoxMDI0KjEwMjQKKyAgICAgICAgICAgICAgICAgICAgZWxpZiB1bml0WzFdID09ICdLQic6CisgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gZmxvYXQodW5pdFswXSkqMTAyNAorICAgICAgICAgICAgICAgICAgICBlbGlmIHVuaXRbMV0gPT0gJ0InOgorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGZsb2F0KHVuaXRbMF0pCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNpemUgPSBmbG9hdCh1bml0WzBdKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzaXplID0gMAorICAgICAgICByZXR1cm4gc2l6ZQorCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaG9id2lkZ2V0LnB5IGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2hvYndpZGdldC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjk2OWMxCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2hvYndpZGdldC5weQpAQCAtMCwwICsxLDkwNCBAQAorIyBCaXRCYWtlIEdyYXBoaWNhbCBHVEsgVXNlciBJbnRlcmZhY2UKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgICBJbnRlbCBDb3Jwb3JhdGlvbgorIworIyBBdXRob3JlZCBieSBEb25neGlhbyBYdSA8ZG9uZ3hpYW8ueHVAaW50ZWwuY29tPgorIyBBdXRob3JlZCBieSBTaGFuZSBXYW5nIDxzaGFuZS53YW5nQGludGVsLmNvbT4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCitpbXBvcnQgZ3RrCitpbXBvcnQgZ29iamVjdAoraW1wb3J0IG9zCitpbXBvcnQgb3MucGF0aAoraW1wb3J0IHN5cworaW1wb3J0IHBhbmdvLCBwYW5nb2NhaXJvCitpbXBvcnQgY2Fpcm8KK2ltcG9ydCBtYXRoCisKK2Zyb20gYmIudWkuY3J1bWJzLmhvYmNvbG9yIGltcG9ydCBIb2JDb2xvcnMKK2Zyb20gYmIudWkuY3J1bWJzLnBlcnNpc3RlbnR0b29sdGlwIGltcG9ydCBQZXJzaXN0ZW50VG9vbHRpcAorCitjbGFzcyBod2M6CisKKyAgICBNQUlOX1dJTl9XSURUSCAgID0gMTAyNAorICAgIE1BSU5fV0lOX0hFSUdIVCAgPSA3MDAKKworY2xhc3MgaGljOgorCisgICAgSE9CX0lDT05fQkFTRV9ESVIgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKSksICgidWkvaWNvbnMvIikpCisKKyAgICBJQ09OX1JDSVBFX0RJU1BMQVlfRklMRSAgICAgICA9IG9zLnBhdGguam9pbihIT0JfSUNPTl9CQVNFX0RJUiwgKCdyZWNpcGUvcmVjaXBlX2Rpc3BsYXkucG5nJykpCisgICAgSUNPTl9SQ0lQRV9IT1ZFUl9GSUxFICAgICAgICAgPSBvcy5wYXRoLmpvaW4oSE9CX0lDT05fQkFTRV9ESVIsICgncmVjaXBlL3JlY2lwZV9ob3Zlci5wbmcnKSkKKyAgICBJQ09OX1BBQ0tBR0VTX0RJU1BMQVlfRklMRSAgICA9IG9zLnBhdGguam9pbihIT0JfSUNPTl9CQVNFX0RJUiwgKCdwYWNrYWdlcy9wYWNrYWdlc19kaXNwbGF5LnBuZycpKQorICAgIElDT05fUEFDS0FHRVNfSE9WRVJfRklMRSAgICAgID0gb3MucGF0aC5qb2luKEhPQl9JQ09OX0JBU0VfRElSLCAoJ3BhY2thZ2VzL3BhY2thZ2VzX2hvdmVyLnBuZycpKQorICAgIElDT05fTEFZRVJTX0RJU1BMQVlfRklMRSAgICAgID0gb3MucGF0aC5qb2luKEhPQl9JQ09OX0JBU0VfRElSLCAoJ2xheWVycy9sYXllcnNfZGlzcGxheS5wbmcnKSkKKyAgICBJQ09OX0xBWUVSU19IT1ZFUl9GSUxFICAgICAgICA9IG9zLnBhdGguam9pbihIT0JfSUNPTl9CQVNFX0RJUiwgKCdsYXllcnMvbGF5ZXJzX2hvdmVyLnBuZycpKQorICAgIElDT05fSU1BR0VTX0RJU1BMQVlfRklMRSAgICAgID0gb3MucGF0aC5qb2luKEhPQl9JQ09OX0JBU0VfRElSLCAoJ2ltYWdlcy9pbWFnZXNfZGlzcGxheS5wbmcnKSkKKyAgICBJQ09OX0lNQUdFU19IT1ZFUl9GSUxFICAgICAgICA9IG9zLnBhdGguam9pbihIT0JfSUNPTl9CQVNFX0RJUiwgKCdpbWFnZXMvaW1hZ2VzX2hvdmVyLnBuZycpKQorICAgIElDT05fU0VUVElOR1NfRElTUExBWV9GSUxFICAgID0gb3MucGF0aC5qb2luKEhPQl9JQ09OX0JBU0VfRElSLCAoJ3NldHRpbmdzL3NldHRpbmdzX2Rpc3BsYXkucG5nJykpCisgICAgSUNPTl9TRVRUSU5HU19IT1ZFUl9GSUxFICAgICAgPSBvcy5wYXRoLmpvaW4oSE9CX0lDT05fQkFTRV9ESVIsICgnc2V0dGluZ3Mvc2V0dGluZ3NfaG92ZXIucG5nJykpCisgICAgSUNPTl9JTkZPX0RJU1BMQVlfRklMRSAgICAgICAgPSBvcy5wYXRoLmpvaW4oSE9CX0lDT05fQkFTRV9ESVIsICgnaW5mby9pbmZvX2Rpc3BsYXkucG5nJykpCisgICAgSUNPTl9JTkZPX0hPVkVSX0ZJTEUgICAgICAgICAgPSBvcy5wYXRoLmpvaW4oSE9CX0lDT05fQkFTRV9ESVIsICgnaW5mby9pbmZvX2hvdmVyLnBuZycpKQorICAgIElDT05fSU5ESV9DT05GSVJNX0ZJTEUgICAgICAgID0gb3MucGF0aC5qb2luKEhPQl9JQ09OX0JBU0VfRElSLCAoJ2luZGljYXRvcnMvY29uZmlybWF0aW9uLnBuZycpKQorICAgIElDT05fSU5ESV9FUlJPUl9GSUxFICAgICAgICAgID0gb3MucGF0aC5qb2luKEhPQl9JQ09OX0JBU0VfRElSLCAoJ2luZGljYXRvcnMvZGVuaWVkLnBuZycpKQorICAgIElDT05fSU5ESV9SRU1PVkVfRklMRSAgICAgICAgID0gb3MucGF0aC5qb2luKEhPQl9JQ09OX0JBU0VfRElSLCAoJ2luZGljYXRvcnMvcmVtb3ZlLnBuZycpKQorICAgIElDT05fSU5ESV9SRU1PVkVfSE9WRVJfRklMRSAgID0gb3MucGF0aC5qb2luKEhPQl9JQ09OX0JBU0VfRElSLCAoJ2luZGljYXRvcnMvcmVtb3ZlLWhvdmVyLnBuZycpKQorICAgIElDT05fSU5ESV9BRERfRklMRSAgICAgICAgICAgID0gb3MucGF0aC5qb2luKEhPQl9JQ09OX0JBU0VfRElSLCAoJ2luZGljYXRvcnMvYWRkLnBuZycpKQorICAgIElDT05fSU5ESV9BRERfSE9WRVJfRklMRSAgICAgID0gb3MucGF0aC5qb2luKEhPQl9JQ09OX0JBU0VfRElSLCAoJ2luZGljYXRvcnMvYWRkLWhvdmVyLnBuZycpKQorICAgIElDT05fSU5ESV9SRUZSRVNIX0ZJTEUgICAgICAgID0gb3MucGF0aC5qb2luKEhPQl9JQ09OX0JBU0VfRElSLCAoJ2luZGljYXRvcnMvcmVmcmVzaC5wbmcnKSkKKyAgICBJQ09OX0lORElfQUxFUlRfRklMRSAgICAgICAgICA9IG9zLnBhdGguam9pbihIT0JfSUNPTl9CQVNFX0RJUiwgKCdpbmRpY2F0b3JzL2FsZXJ0LnBuZycpKQorICAgIElDT05fSU5ESV9USUNLX0ZJTEUgICAgICAgICAgID0gb3MucGF0aC5qb2luKEhPQl9JQ09OX0JBU0VfRElSLCAoJ2luZGljYXRvcnMvdGljay5wbmcnKSkKKyAgICBJQ09OX0lORElfSU5GT19GSUxFICAgICAgICAgICA9IG9zLnBhdGguam9pbihIT0JfSUNPTl9CQVNFX0RJUiwgKCdpbmRpY2F0b3JzL2luZm8ucG5nJykpCisKK2NsYXNzIEhvYlZpZXdUYWJsZSAoZ3RrLlZCb3gpOgorICAgICIiIgorICAgIEEgVkJveCB0byBjb250YWluIHRoZSB0YWJsZSBmb3IgZGlmZmVyZW50IHJlY2lwZSB2aWV3cyBhbmQgcGFja2FnZSB2aWV3CisgICAgIiIiCisgICAgX19nc2lnbmFsc19fID0geworICAgICAgICAgInRvZ2dsZWQiICAgICAgIDogKGdvYmplY3QuU0lHTkFMX1JVTl9MQVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdvYmplY3QuVFlQRV9QWU9CSkVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9JTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX1BZT0JKRUNULCkpLAorICAgICAgICAgInJvdy1hY3RpdmF0ZWQiIDogKGdvYmplY3QuU0lHTkFMX1JVTl9MQVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdvYmplY3QuVFlQRV9QWU9CSkVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfUFlPQkpFQ1QsKSksCisgICAgICAgICAiY2VsbC1mYWRlaW5vdXQtc3RvcHBlZCIgOiAoZ29iamVjdC5TSUdOQUxfUlVOX0xBU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ29iamVjdC5UWVBFX1BZT0JKRUNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9QWU9CSkVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfUFlPQkpFQ1QsKSksCisgICAgfQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbHVtbnMsIG5hbWUpOgorICAgICAgICBndGsuVkJveC5fX2luaXRfXyhzZWxmLCBGYWxzZSwgNikKKyAgICAgICAgc2VsZi50YWJsZV90cmVlID0gZ3RrLlRyZWVWaWV3KCkKKyAgICAgICAgc2VsZi50YWJsZV90cmVlLnNldF9oZWFkZXJzX3Zpc2libGUoVHJ1ZSkKKyAgICAgICAgc2VsZi50YWJsZV90cmVlLnNldF9oZWFkZXJzX2NsaWNrYWJsZShUcnVlKQorICAgICAgICBzZWxmLnRhYmxlX3RyZWUuc2V0X3J1bGVzX2hpbnQoVHJ1ZSkKKyAgICAgICAgc2VsZi50YWJsZV90cmVlLnNldF9lbmFibGVfdHJlZV9saW5lcyhUcnVlKQorICAgICAgICBzZWxmLnRhYmxlX3RyZWUuZ2V0X3NlbGVjdGlvbigpLnNldF9tb2RlKGd0ay5TRUxFQ1RJT05fU0lOR0xFKQorICAgICAgICBzZWxmLnRvZ2dsZV9jb2x1bW5zID0gW10KKyAgICAgICAgc2VsZi50YWJsZV90cmVlLmNvbm5lY3QoInJvdy1hY3RpdmF0ZWQiLCBzZWxmLnJvd19hY3RpdmF0ZWRfY2IpCisgICAgICAgIHNlbGYudG9wX2JhciA9IE5vbmUKKyAgICAgICAgc2VsZi50YWJfbmFtZSA9IG5hbWUKKworICAgICAgICBmb3IgaSwgY29sdW1uIGluIGVudW1lcmF0ZShjb2x1bW5zKToKKyAgICAgICAgICAgIGNvbF9uYW1lID0gY29sdW1uWydjb2xfbmFtZSddCisgICAgICAgICAgICBjb2wgPSBndGsuVHJlZVZpZXdDb2x1bW4oY29sX25hbWUpCisgICAgICAgICAgICBjb2wuc2V0X2NsaWNrYWJsZShUcnVlKQorICAgICAgICAgICAgY29sLnNldF9yZXNpemFibGUoVHJ1ZSkKKyAgICAgICAgICAgIGlmIHNlbGYudGFiX25hbWUuc3RhcnRzd2l0aCgnSW5jbHVkZWQnKToKKyAgICAgICAgICAgICAgICBpZiBjb2xfbmFtZSE9J0luY2x1ZGVkJzoKKyAgICAgICAgICAgICAgICAgICAgY29sLnNldF9zb3J0X2NvbHVtbl9pZChjb2x1bW5bJ2NvbF9pZCddKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjb2wuc2V0X3NvcnRfY29sdW1uX2lkKGNvbHVtblsnY29sX2lkJ10pCisgICAgICAgICAgICBpZiAnY29sX21pbicgaW4gY29sdW1uLmtleXMoKToKKyAgICAgICAgICAgICAgICBjb2wuc2V0X21pbl93aWR0aChjb2x1bW5bJ2NvbF9taW4nXSkKKyAgICAgICAgICAgIGlmICdjb2xfbWF4JyBpbiBjb2x1bW4ua2V5cygpOgorICAgICAgICAgICAgICAgIGNvbC5zZXRfbWF4X3dpZHRoKGNvbHVtblsnY29sX21heCddKQorICAgICAgICAgICAgaWYgJ2V4cGFuZCcgaW4gY29sdW1uLmtleXMoKToKKyAgICAgICAgICAgICAgICBjb2wuc2V0X2V4cGFuZChUcnVlKQorICAgICAgICAgICAgc2VsZi50YWJsZV90cmVlLmFwcGVuZF9jb2x1bW4oY29sKQorCisgICAgICAgICAgICBpZiAobm90ICdjb2xfc3R5bGUnIGluIGNvbHVtbi5rZXlzKCkpIG9yIGNvbHVtblsnY29sX3N0eWxlJ10gPT0gJ3RleHQnOgorICAgICAgICAgICAgICAgIGNlbGwgPSBndGsuQ2VsbFJlbmRlcmVyVGV4dCgpCisgICAgICAgICAgICAgICAgY29sLnBhY2tfc3RhcnQoY2VsbCwgVHJ1ZSkKKyAgICAgICAgICAgICAgICBjb2wuc2V0X2F0dHJpYnV0ZXMoY2VsbCwgdGV4dD1jb2x1bW5bJ2NvbF9pZCddKQorICAgICAgICAgICAgICAgIGlmICdjb2xfdF9pZCcgaW4gY29sdW1uLmtleXMoKToKKyAgICAgICAgICAgICAgICAgICAgY29sLmFkZF9hdHRyaWJ1dGUoY2VsbCwgJ2ZvbnQnLCBjb2x1bW5bJ2NvbF90X2lkJ10pCisgICAgICAgICAgICBlbGlmIGNvbHVtblsnY29sX3N0eWxlJ10gPT0gJ2NoZWNrIHRvZ2dsZSc6CisgICAgICAgICAgICAgICAgY2VsbCA9IEhvYkNlbGxSZW5kZXJlclRvZ2dsZSgpCisgICAgICAgICAgICAgICAgY2VsbC5zZXRfcHJvcGVydHkoJ2FjdGl2YXRhYmxlJywgVHJ1ZSkKKyAgICAgICAgICAgICAgICBjZWxsLmNvbm5lY3QoInRvZ2dsZWQiLCBzZWxmLnRvZ2dsZWRfY2IsIGksIHNlbGYudGFibGVfdHJlZSkKKyAgICAgICAgICAgICAgICBjZWxsLmNvbm5lY3RfcmVuZGVyX3N0YXRlX2NoYW5nZWQoc2VsZi5zdG9wX2NlbGxfZmFkZWlub3V0X2NiLCBzZWxmLnRhYmxlX3RyZWUpCisgICAgICAgICAgICAgICAgc2VsZi50b2dnbGVfaWQgPSBpCisgICAgICAgICAgICAgICAgY29sLnBhY2tfZW5kKGNlbGwsIFRydWUpCisgICAgICAgICAgICAgICAgY29sLnNldF9hdHRyaWJ1dGVzKGNlbGwsIGFjdGl2ZT1jb2x1bW5bJ2NvbF9pZCddKQorICAgICAgICAgICAgICAgIHNlbGYudG9nZ2xlX2NvbHVtbnMuYXBwZW5kKGNvbF9uYW1lKQorICAgICAgICAgICAgICAgIGlmICdjb2xfZ3JvdXAnIGluIGNvbHVtbi5rZXlzKCk6CisgICAgICAgICAgICAgICAgICAgIGNvbC5zZXRfY2VsbF9kYXRhX2Z1bmMoY2VsbCwgc2VsZi5zZXRfZ3JvdXBfbnVtYmVyX2NiKQorICAgICAgICAgICAgZWxpZiBjb2x1bW5bJ2NvbF9zdHlsZSddID09ICdyYWRpbyB0b2dnbGUnOgorICAgICAgICAgICAgICAgIGNlbGwgPSBndGsuQ2VsbFJlbmRlcmVyVG9nZ2xlKCkKKyAgICAgICAgICAgICAgICBjZWxsLnNldF9wcm9wZXJ0eSgnYWN0aXZhdGFibGUnLCBUcnVlKQorICAgICAgICAgICAgICAgIGNlbGwuc2V0X3JhZGlvKFRydWUpCisgICAgICAgICAgICAgICAgY2VsbC5jb25uZWN0KCJ0b2dnbGVkIiwgc2VsZi50b2dnbGVkX2NiLCBpLCBzZWxmLnRhYmxlX3RyZWUpCisgICAgICAgICAgICAgICAgc2VsZi50b2dnbGVfaWQgPSBpCisgICAgICAgICAgICAgICAgY29sLnBhY2tfZW5kKGNlbGwsIFRydWUpCisgICAgICAgICAgICAgICAgY29sLnNldF9hdHRyaWJ1dGVzKGNlbGwsIGFjdGl2ZT1jb2x1bW5bJ2NvbF9pZCddKQorICAgICAgICAgICAgICAgIHNlbGYudG9nZ2xlX2NvbHVtbnMuYXBwZW5kKGNvbF9uYW1lKQorICAgICAgICAgICAgZWxpZiBjb2x1bW5bJ2NvbF9zdHlsZSddID09ICdiaW5iJzoKKyAgICAgICAgICAgICAgICBjZWxsID0gZ3RrLkNlbGxSZW5kZXJlclRleHQoKQorICAgICAgICAgICAgICAgIGNvbC5wYWNrX3N0YXJ0KGNlbGwsIFRydWUpCisgICAgICAgICAgICAgICAgY29sLnNldF9jZWxsX2RhdGFfZnVuYyhjZWxsLCBzZWxmLmRpc3BsYXlfYmluYl9jYiwgY29sdW1uWydjb2xfaWQnXSkKKyAgICAgICAgICAgICAgICBpZiAnY29sX3RfaWQnIGluIGNvbHVtbi5rZXlzKCk6CisgICAgICAgICAgICAgICAgICAgIGNvbC5hZGRfYXR0cmlidXRlKGNlbGwsICdmb250JywgY29sdW1uWydjb2xfdF9pZCddKQorCisgICAgICAgIHNlbGYuc2Nyb2xsID0gZ3RrLlNjcm9sbGVkV2luZG93KCkKKyAgICAgICAgc2VsZi5zY3JvbGwuc2V0X3BvbGljeShndGsuUE9MSUNZX05FVkVSLCBndGsuUE9MSUNZX0FVVE9NQVRJQykKKyAgICAgICAgc2VsZi5zY3JvbGwuYWRkKHNlbGYudGFibGVfdHJlZSkKKworICAgICAgICBzZWxmLnBhY2tfZW5kKHNlbGYuc2Nyb2xsLCBUcnVlLCBUcnVlLCAwKQorCisgICAgZGVmIGFkZF9ub19yZXN1bHRfYmFyKHNlbGYsIGVudHJ5KToKKyAgICAgICAgY29sb3IgPSBIb2JDb2xvcnMuS0hBS0kKKyAgICAgICAgc2VsZi50b3BfYmFyID0gZ3RrLkV2ZW50Qm94KCkKKyAgICAgICAgc2VsZi50b3BfYmFyLnNldF9zaXplX3JlcXVlc3QoLTEsIDcwKQorICAgICAgICBzZWxmLnRvcF9iYXIubW9kaWZ5X2JnKGd0ay5TVEFURV9OT1JNQUwsIGd0ay5nZGsuY29sb3JfcGFyc2UoY29sb3IpKQorICAgICAgICBzZWxmLnRvcF9iYXIuc2V0X2ZsYWdzKGd0ay5DQU5fREVGQVVMVCkKKyAgICAgICAgc2VsZi50b3BfYmFyLmdyYWJfZGVmYXVsdCgpCisKKyAgICAgICAgbm9fcmVzdWx0X3RhYiA9IGd0ay5UYWJsZSg1LCAyMCwgVHJ1ZSkKKyAgICAgICAgc2VsZi50b3BfYmFyLmFkZChub19yZXN1bHRfdGFiKQorCisgICAgICAgIGxhYmVsID0gZ3RrLkxhYmVsKCkKKyAgICAgICAgbGFiZWwuc2V0X2FsaWdubWVudCgwLjAsIDAuNSkKKyAgICAgICAgdGl0bGUgPSAiTm8gcmVzdWx0cyBtYXRjaGluZyB5b3VyIHNlYXJjaCIKKyAgICAgICAgbGFiZWwuc2V0X21hcmt1cCgiPHNwYW4gc2l6ZT0neC1sYXJnZSc+PGI+JXM8L2I+PC9zcGFuPiIgJSB0aXRsZSkKKyAgICAgICAgbm9fcmVzdWx0X3RhYi5hdHRhY2gobGFiZWwsIDEsIDE0LCAxLCA0KQorCisgICAgICAgIGNsZWFyX2J1dHRvbiA9IEhvYkJ1dHRvbigiQ2xlYXIgc2VhcmNoIikKKyAgICAgICAgY2xlYXJfYnV0dG9uLnNldF90b29sdGlwX3RleHQoIkNsZWFyIHNlYXJjaCBxdWVyeSIpCisgICAgICAgIGNsZWFyX2J1dHRvbi5jb25uZWN0KCdjbGlja2VkJywgc2VsZi5zZXRfc2VhcmNoX2VudHJ5X2NsZWFyX2NiLCBlbnRyeSkKKyAgICAgICAgbm9fcmVzdWx0X3RhYi5hdHRhY2goY2xlYXJfYnV0dG9uLCAxNiwgMTksIDEsIDQpCisKKyAgICAgICAgc2VsZi5wYWNrX3N0YXJ0KHNlbGYudG9wX2JhciwgRmFsc2UsIFRydWUsIDEyKQorICAgICAgICBzZWxmLnRvcF9iYXIuc2hvd19hbGwoKQorCisgICAgZGVmIHNldF9zZWFyY2hfZW50cnlfY2xlYXJfY2Ioc2VsZiwgYnV0dG9uLCBzZWFyY2gpOgorICAgICAgICBpZiBzZWFyY2guZ2V0X2VkaXRhYmxlKCkgPT0gVHJ1ZToKKyAgICAgICAgICAgIHNlYXJjaC5zZXRfdGV4dCgiIikKKyAgICAgICAgc2VhcmNoLnNldF9pY29uX3NlbnNpdGl2ZShndGsuRU5UUllfSUNPTl9TRUNPTkRBUlksIEZhbHNlKQorICAgICAgICBzZWFyY2guZ3JhYl9mb2N1cygpCisKKyAgICBkZWYgZGlzcGxheV9iaW5iX2NiKHNlbGYsIGNvbCwgY2VsbCwgbW9kZWwsIGl0LCBjb2xfaWQpOgorICAgICAgICBiaW5iID0gIG1vZGVsLmdldF92YWx1ZShpdCwgY29sX2lkKQorICAgICAgICAjIEp1c3QgZGlzcGxheSB0aGUgZmlyc3QgaXRlbQorICAgICAgICBpZiBiaW5iOgorICAgICAgICAgICAgYmluID0gYmluYi5zcGxpdCgnLCAnKQorICAgICAgICAgICAgdG90YWxfbm8gPSBsZW4oYmluKQorICAgICAgICAgICAgaWYgdG90YWxfbm8gPiAxIGFuZCBiaW5bMF0gPT0gIlVzZXIgU2VsZWN0ZWQiOgorICAgICAgICAgICAgICAgIGlmIHRvdGFsX25vID4gMjoKKyAgICAgICAgICAgICAgICAgICAgcHJlc2VudF9iaW5iID0gYmluWzFdICsgJyAoKycgKyBzdHIodG90YWxfbm8gLSAxKSArICcpJworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHByZXNlbnRfYmluYiA9IGJpblsxXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiB0b3RhbF9ubyA+IDE6CisgICAgICAgICAgICAgICAgICAgIHByZXNlbnRfYmluYiA9IGJpblswXSArICcgKCsnICsgc3RyKHRvdGFsX25vIC0gMSkgKyAnKScKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBwcmVzZW50X2JpbmIgPSBiaW5bMF0KKyAgICAgICAgICAgIGNlbGwuc2V0X3Byb3BlcnR5KCd0ZXh0JywgcHJlc2VudF9iaW5iKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY2VsbC5zZXRfcHJvcGVydHkoJ3RleHQnLCAiIikKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBzZXRfbW9kZWwoc2VsZiwgdHJlZV9tb2RlbCk6CisgICAgICAgIHNlbGYudGFibGVfdHJlZS5zZXRfbW9kZWwodHJlZV9tb2RlbCkKKworICAgIGRlZiB0b2dnbGVfZGVmYXVsdChzZWxmKToKKyAgICAgICAgbW9kZWwgPSBzZWxmLnRhYmxlX3RyZWUuZ2V0X21vZGVsKCkKKyAgICAgICAgaWYgbm90IG1vZGVsOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGl0ZXIgPSBtb2RlbC5nZXRfaXRlcl9maXJzdCgpCisgICAgICAgIGlmIGl0ZXI6CisgICAgICAgICAgICByb3dwYXRoID0gbW9kZWwuZ2V0X3BhdGgoaXRlcikKKyAgICAgICAgICAgIG1vZGVsW3Jvd3BhdGhdW3NlbGYudG9nZ2xlX2lkXSA9IFRydWUKKworICAgIGRlZiB0b2dnbGVkX2NiKHNlbGYsIGNlbGwsIHBhdGgsIGNvbHVtbmlkLCB0cmVlKToKKyAgICAgICAgc2VsZi5lbWl0KCJ0b2dnbGVkIiwgY2VsbCwgcGF0aCwgY29sdW1uaWQsIHRyZWUpCisKKyAgICBkZWYgcm93X2FjdGl2YXRlZF9jYihzZWxmLCB0cmVlLCBwYXRoLCB2aWV3X2NvbHVtbik6CisgICAgICAgIGlmIG5vdCB2aWV3X2NvbHVtbi5nZXRfdGl0bGUoKSBpbiBzZWxmLnRvZ2dsZV9jb2x1bW5zOgorICAgICAgICAgICAgc2VsZi5lbWl0KCJyb3ctYWN0aXZhdGVkIiwgdHJlZS5nZXRfbW9kZWwoKSwgcGF0aCkKKworICAgIGRlZiBzdG9wX2NlbGxfZmFkZWlub3V0X2NiKHNlbGYsIGN0cmwsIGNlbGwsIHRyZWUpOgorICAgICAgICBzZWxmLmVtaXQoImNlbGwtZmFkZWlub3V0LXN0b3BwZWQiLCBjdHJsLCBjZWxsLCB0cmVlKQorCisgICAgZGVmIHNldF9ncm91cF9udW1iZXJfY2Ioc2VsZiwgY29sLCBjZWxsLCBtb2RlbCwgaXRlcik6CisgICAgICAgIGlmIG1vZGVsIGFuZCAobW9kZWwuaXRlcl9wYXJlbnQoaXRlcikgPT0gTm9uZSk6CisgICAgICAgICAgICBjZWxsLmNlbGxfYXR0clsibnVtYmVyX29mX2NoaWxkcmVuIl0gPSBtb2RlbC5pdGVyX25fY2hpbGRyZW4oaXRlcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNlbGwuY2VsbF9hdHRyWyJudW1iZXJfb2ZfY2hpbGRyZW4iXSA9IDAKKworICAgIGRlZiBjb25uZWN0X2dyb3VwX3NlbGVjdGlvbihzZWxmLCBjYl9mdW5jKToKKyAgICAgICAgc2VsZi50YWJsZV90cmVlLmdldF9zZWxlY3Rpb24oKS5jb25uZWN0KCJjaGFuZ2VkIiwgY2JfZnVuYykKKworIiIiCitBIG1ldGhvZCB0byBjYWxjdWxhdGUgYSBzb2Z0ZW5lZCB2YWx1ZSBmb3IgdGhlIGNvbG91ciBvZiB3aWRnZXQgd2hlbiBpbiB0aGUKK3Byb3ZpZGVkIHN0YXRlLgorCit3aWRnZXQ6IHRoZSB3aWRnZXQgd2hvc2Ugc3R5bGUgdG8gdXNlCitzdGF0ZTogdGhlIHN0YXRlIG9mIHRoZSB3aWRnZXQgdG8gdXNlIHRoZSBzdHlsZSBmb3IKKworUmV0dXJucyBhIHN0cmluZyB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIHNvZnRlbmVkIGNvbG91cgorIiIiCitkZWYgc29mdGVuX2NvbG9yKHdpZGdldCwgc3RhdGU9Z3RrLlNUQVRFX05PUk1BTCk6CisgICAgIyB0aGlzIGNvbG91ciBtdW5naW5nIHJvdXRpbmUgaXMgaGVhdmlseSBpbnNwaXJlZCBidSBnZHVfdXRpbF9nZXRfbWl4X2NvbG9yKCkKKyAgICAjIGZyb20gZ25vbWUtZGlzay11dGlsaXR5OgorICAgICMgaHR0cDovL2dpdC5nbm9tZS5vcmcvYnJvd3NlL2dub21lLWRpc2stdXRpbGl0eS90cmVlL3NyYy9nZHUtZ3RrL2dkdS1ndGsuYz9oPWdub21lLTMtMAorICAgIGJsZW5kID0gMC43CisgICAgc3R5bGUgPSB3aWRnZXQuZ2V0X3N0eWxlKCkKKyAgICBjb2xvciA9IHN0eWxlLnRleHRbc3RhdGVdCisgICAgY29sb3IucmVkID0gY29sb3IucmVkICogYmxlbmQgKyBzdHlsZS5iYXNlW3N0YXRlXS5yZWQgKiAoMS4wIC0gYmxlbmQpCisgICAgY29sb3IuZ3JlZW4gPSBjb2xvci5ncmVlbiAqIGJsZW5kICsgc3R5bGUuYmFzZVtzdGF0ZV0uZ3JlZW4gKiAoMS4wIC0gYmxlbmQpCisgICAgY29sb3IuYmx1ZSA9IGNvbG9yLmJsdWUgKiBibGVuZCArIHN0eWxlLmJhc2Vbc3RhdGVdLmJsdWUgKiAoMS4wIC0gYmxlbmQpCisgICAgcmV0dXJuIGNvbG9yLnRvX3N0cmluZygpCisKK2NsYXNzIEJhc2VIb2JCdXR0b24oZ3RrLkJ1dHRvbik6CisgICAgIiIiCisgICAgQSBndGsuQnV0dG9uIHN1YmNsYXNzIHdoaWNoIGZvbGxvd3MgdGhlIHZpc3VhbCBkZXNpZ24gb2YgSG9iIGZvciBwcmltYXJ5CisgICAgYWN0aW9uIGJ1dHRvbnMKKworICAgIGxhYmVsOiB0aGUgdGV4dCB0byBkaXNwbGF5IGFzIHRoZSBidXR0b24ncyBsYWJlbAorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsYWJlbCk6CisgICAgICAgIGd0ay5CdXR0b24uX19pbml0X18oc2VsZiwgbGFiZWwpCisgICAgICAgIEhvYkJ1dHRvbi5zdHlsZV9idXR0b24oc2VsZikKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgc3R5bGVfYnV0dG9uKGJ1dHRvbik6CisgICAgICAgIHN0eWxlID0gYnV0dG9uLmdldF9zdHlsZSgpCisgICAgICAgIHN0eWxlID0gZ3RrLnJjX2dldF9zdHlsZV9ieV9wYXRocyhndGsuc2V0dGluZ3NfZ2V0X2RlZmF1bHQoKSwgJ2d0ay1idXR0b24nLCAnZ3RrLWJ1dHRvbicsIGdvYmplY3QuVFlQRV9OT05FKQorCisgICAgICAgIGJ1dHRvbi5zZXRfZmxhZ3MoZ3RrLkNBTl9ERUZBVUxUKQorICAgICAgICBidXR0b24uZ3JhYl9kZWZhdWx0KCkKKworIyAgICAgICAgbGFiZWwgPSAiPHNwYW4gc2l6ZT0neC1sYXJnZSc+PGI+JXM8L2I+PC9zcGFuPiIgJSBnb2JqZWN0Lm1hcmt1cF9lc2NhcGVfdGV4dChidXR0b24uZ2V0X2xhYmVsKCkpCisgICAgICAgIGxhYmVsID0gYnV0dG9uLmdldF9sYWJlbCgpCisgICAgICAgIGJ1dHRvbi5zZXRfbGFiZWwobGFiZWwpCisgICAgICAgIGJ1dHRvbi5jaGlsZC5zZXRfdXNlX21hcmt1cChUcnVlKQorCitjbGFzcyBIb2JCdXR0b24oQmFzZUhvYkJ1dHRvbik6CisgICAgIiIiCisgICAgQSBndGsuQnV0dG9uIHN1YmNsYXNzIHdoaWNoIGZvbGxvd3MgdGhlIHZpc3VhbCBkZXNpZ24gb2YgSG9iIGZvciBwcmltYXJ5CisgICAgYWN0aW9uIGJ1dHRvbnMKKworICAgIGxhYmVsOiB0aGUgdGV4dCB0byBkaXNwbGF5IGFzIHRoZSBidXR0b24ncyBsYWJlbAorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsYWJlbCk6CisgICAgICAgIEJhc2VIb2JCdXR0b24uX19pbml0X18oc2VsZiwgbGFiZWwpCisgICAgICAgIEhvYkJ1dHRvbi5zdHlsZV9idXR0b24oc2VsZikKKworY2xhc3MgSG9iQWx0QnV0dG9uKEJhc2VIb2JCdXR0b24pOgorICAgICIiIgorICAgIEEgZ3RrLkJ1dHRvbiBzdWJjbGFzcyB3aGljaCBoYXMgbm8gcmVsaWVmLCBhbmQgc28gaXMgbW9yZSBkaXNjcmV0ZQorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsYWJlbCk6CisgICAgICAgIEJhc2VIb2JCdXR0b24uX19pbml0X18oc2VsZiwgbGFiZWwpCisgICAgICAgIEhvYkFsdEJ1dHRvbi5zdHlsZV9idXR0b24oc2VsZikKKworICAgICIiIgorICAgIEEgY2FsbGJhY2sgZm9yIHRoZSBzdGF0ZS1jaGFuZ2VkIGV2ZW50IHRvIGVuc3VyZSB0aGUgdGV4dCBpcyBkaXNwbGF5ZWQKKyAgICBkaWZmZXJlbnRseSB3aGVuIHRoZSB3aWRnZXQgaXMgbm90IHNlbnNpdGl2ZQorICAgICIiIgorICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgZGVzZW5zaXRpc2Vfb25fc3RhdGVfY2hhbmdlX2NiKGJ1dHRvbiwgc3RhdGUpOgorICAgICAgICBpZiBub3QgYnV0dG9uLmdldF9wcm9wZXJ0eSgic2Vuc2l0aXZlIik6CisgICAgICAgICAgICBIb2JBbHRCdXR0b24uc2V0X3RleHQoYnV0dG9uLCBGYWxzZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEhvYkFsdEJ1dHRvbi5zZXRfdGV4dChidXR0b24sIFRydWUpCisKKyAgICAiIiIKKyAgICBTZXQgdGhlIGJ1dHRvbiBsYWJlbCB3aXRoIGFuIGFwcHJvcHJpYXRlIGNvbG91ciBmb3IgdGhlIGN1cnJlbnQgd2lkZ2V0IHN0YXRlCisgICAgIiIiCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBzZXRfdGV4dChidXR0b24sIHNlbnNpdGl2ZT1UcnVlKToKKyAgICAgICAgaWYgc2Vuc2l0aXZlOgorICAgICAgICAgICAgY29sb3VyID0gSG9iQ29sb3JzLlBBTEVfQkxVRQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29sb3VyID0gSG9iQ29sb3JzLkxJR0hUX0dSQVkKKyAgICAgICAgYnV0dG9uLnNldF9sYWJlbCgiPHNwYW4gc2l6ZT0nbGFyZ2UnIGNvbG9yPSclcyc+PGI+JXM8L2I+PC9zcGFuPiIgJSAoY29sb3VyLCBnb2JqZWN0Lm1hcmt1cF9lc2NhcGVfdGV4dChidXR0b24udGV4dCkpKQorICAgICAgICBidXR0b24uY2hpbGQuc2V0X3VzZV9tYXJrdXAoVHJ1ZSkKKworY2xhc3MgSG9iSW1hZ2VCdXR0b24oZ3RrLkJ1dHRvbik6CisgICAgIiIiCisgICAgQSBndGsuQnV0dG9uIHdpdGggYW4gaWNvbiBhbmQgdHdvIHJvd3Mgb2YgdGV4dCwgdGhlIHNlY29uZCBvZiB3aGljaCBpcworICAgIGRpc3BsYXllZCBpbiBhIGJsZW5kZWQgY29sb3VyLgorCisgICAgcHJpbWFyeV90ZXh0OiB0aGUgbWFpbiBidXR0b24gbGFiZWwKKyAgICBzZWNvbmRhcnlfdGV4dDogb3B0aW9uYWwgc2Vjb25kIGxpbmUgb2YgdGV4dAorICAgIGljb25fcGF0aDogcGF0aCB0byB0aGUgaWNvbiBmaWxlIHRvIGRpc3BsYXkgb24gdGhlIGJ1dHRvbgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcmltYXJ5X3RleHQsIHNlY29uZGFyeV90ZXh0PSIiLCBpY29uX3BhdGg9IiIsIGhvdmVyX2ljb25fcGF0aD0iIik6CisgICAgICAgIGd0ay5CdXR0b24uX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5zZXRfcmVsaWVmKGd0ay5SRUxJRUZfTk9ORSkKKworICAgICAgICBzZWxmLmljb25fcGF0aCA9IGljb25fcGF0aAorICAgICAgICBzZWxmLmhvdmVyX2ljb25fcGF0aCA9IGhvdmVyX2ljb25fcGF0aAorCisgICAgICAgIGhib3ggPSBndGsuSEJveChGYWxzZSwgMTApCisgICAgICAgIGhib3guc2hvdygpCisgICAgICAgIHNlbGYuYWRkKGhib3gpCisgICAgICAgIHNlbGYuaWNvbiA9IGd0ay5JbWFnZSgpCisgICAgICAgIHNlbGYuaWNvbi5zZXRfZnJvbV9maWxlKHNlbGYuaWNvbl9wYXRoKQorICAgICAgICBzZWxmLmljb24uc2V0X2FsaWdubWVudCgwLjUsIDAuMCkKKyAgICAgICAgc2VsZi5pY29uLnNob3coKQorICAgICAgICBpZiBzZWxmLmhvdmVyX2ljb25fcGF0aCBhbmQgbGVuKHNlbGYuaG92ZXJfaWNvbl9wYXRoKToKKyAgICAgICAgICAgIHNlbGYuY29ubmVjdCgiZW50ZXItbm90aWZ5LWV2ZW50Iiwgc2VsZi5zZXRfaG92ZXJfaWNvbl9jYikKKyAgICAgICAgICAgIHNlbGYuY29ubmVjdCgibGVhdmUtbm90aWZ5LWV2ZW50Iiwgc2VsZi5zZXRfaWNvbl9jYikKKyAgICAgICAgaGJveC5wYWNrX3N0YXJ0KHNlbGYuaWNvbiwgRmFsc2UsIEZhbHNlLCAwKQorICAgICAgICBsYWJlbCA9IGd0ay5MYWJlbCgpCisgICAgICAgIGxhYmVsLnNldF9hbGlnbm1lbnQoMC4wLCAwLjUpCisgICAgICAgIGNvbG91ciA9IHNvZnRlbl9jb2xvcihsYWJlbCkKKyAgICAgICAgbWFyayA9ICI8c3BhbiBzaXplPSd4LWxhcmdlJz4lczwvc3Bhbj5cbjxzcGFuIHNpemU9J21lZGl1bScgZmdjb2xvcj0nJXMnIHdlaWdodD0ndWx0cmFsaWdodCc+JXM8L3NwYW4+IiAlIChwcmltYXJ5X3RleHQsIGNvbG91ciwgc2Vjb25kYXJ5X3RleHQpCisgICAgICAgIGxhYmVsLnNldF9tYXJrdXAobWFyaykKKyAgICAgICAgbGFiZWwuc2hvdygpCisgICAgICAgIGhib3gucGFja19zdGFydChsYWJlbCwgVHJ1ZSwgVHJ1ZSwgMCkKKworICAgIGRlZiBzZXRfaG92ZXJfaWNvbl9jYihzZWxmLCB3aWRnZXQsIGV2ZW50KToKKyAgICAgICAgc2VsZi5pY29uLnNldF9mcm9tX2ZpbGUoc2VsZi5ob3Zlcl9pY29uX3BhdGgpCisKKyAgICBkZWYgc2V0X2ljb25fY2Ioc2VsZiwgd2lkZ2V0LCBldmVudCk6CisgICAgICAgIHNlbGYuaWNvbi5zZXRfZnJvbV9maWxlKHNlbGYuaWNvbl9wYXRoKQorCitjbGFzcyBIb2JJbmZvQnV0dG9uKGd0ay5FdmVudEJveCk6CisgICAgIiIiCisgICAgVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgYnV0dG9uLWxpa2Ugd2lkZ2V0IHBlciB0aGUgSG9iIHZpc3VhbCBhbmQgVVggZGVzaWducworICAgIHdoaWNoIHdpbGwgZGlzcGxheSBhIHBlcnNpc3RlbnQgdG9vbHRpcCwgd2l0aCB0aGUgY29udGVudHMgb2YgdGlwX21hcmt1cCwgd2hlbgorICAgIGNsaWNrZWQuCisKKyAgICB0aXBfbWFya3VwOiB0aGUgUGFuZ28gTWFya3VwIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgcGVyc2lzdGVudCB0b29sdGlwCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRpcF9tYXJrdXAsIHBhcmVudD1Ob25lKToKKyAgICAgICAgZ3RrLkV2ZW50Qm94Ll9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuaW1hZ2UgPSBndGsuSW1hZ2UoKQorICAgICAgICBzZWxmLmltYWdlLnNldF9mcm9tX2ZpbGUoCisgICAgICAgIGhpYy5JQ09OX0lORk9fRElTUExBWV9GSUxFKQorICAgICAgICBzZWxmLmltYWdlLnNob3coKQorICAgICAgICBzZWxmLmFkZChzZWxmLmltYWdlKQorICAgICAgICBzZWxmLnRpcF9tYXJrdXAgPSB0aXBfbWFya3VwCisgICAgICAgIHNlbGYubXlfcGFyZW50ID0gcGFyZW50CisKKyAgICAgICAgc2VsZi5zZXRfZXZlbnRzKGd0ay5nZGsuQlVUVE9OX1JFTEVBU0UgfAorICAgICAgICAgICAgICAgICAgICAgICAgZ3RrLmdkay5FTlRFUl9OT1RJRllfTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgICBndGsuZ2RrLkxFQVZFX05PVElGWV9NQVNLKQorCisgICAgICAgIHNlbGYuY29ubmVjdCgiYnV0dG9uLXJlbGVhc2UtZXZlbnQiLCBzZWxmLmJ1dHRvbl9yZWxlYXNlX2NiKQorICAgICAgICBzZWxmLmNvbm5lY3QoImVudGVyLW5vdGlmeS1ldmVudCIsIHNlbGYubW91c2VfaW5fY2IpCisgICAgICAgIHNlbGYuY29ubmVjdCgibGVhdmUtbm90aWZ5LWV2ZW50Iiwgc2VsZi5tb3VzZV9vdXRfY2IpCisKKyAgICAiIiIKKyAgICBXaGVuIHRoZSBtb3VzZSBjbGljayBpcyByZWxlYXNlZCBlbXVsYXRlIGEgYnV0dG9uLWNsaWNrIGFuZCBzaG93IHRoZSBhc3NvY2lhdGVkCisgICAgUGVyc2lzdGVudFRvb2x0aXAKKyAgICAiIiIKKyAgICBkZWYgYnV0dG9uX3JlbGVhc2VfY2Ioc2VsZiwgd2lkZ2V0LCBldmVudCk6CisgICAgICAgIGZyb20gYmIudWkuY3J1bWJzLmhpZy5wcm9wZXJ0eWRpYWxvZyBpbXBvcnQgUHJvcGVydHlEaWFsb2cKKyAgICAgICAgc2VsZi5kaWFsb2cgPSBQcm9wZXJ0eURpYWxvZyh0aXRsZSA9ICcnLAorICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBzZWxmLm15X3BhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gPSBzZWxmLnRpcF9tYXJrdXAsCisgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gZ3RrLkRJQUxPR19ERVNUUk9ZX1dJVEhfUEFSRU5UCisgICAgICAgICAgICAgICAgICAgICAgICB8IGd0ay5ESUFMT0dfTk9fU0VQQVJBVE9SKQorCisgICAgICAgIGJ1dHRvbiA9IHNlbGYuZGlhbG9nLmFkZF9idXR0b24oIkNsb3NlIiwgZ3RrLlJFU1BPTlNFX0NBTkNFTCkKKyAgICAgICAgSG9iQWx0QnV0dG9uLnN0eWxlX2J1dHRvbihidXR0b24pCisgICAgICAgIGJ1dHRvbi5jb25uZWN0KCJjbGlja2VkIiwgbGFtYmRhIHc6IHNlbGYuZGlhbG9nLmRlc3Ryb3koKSkKKyAgICAgICAgc2VsZi5kaWFsb2cuc2hvd19hbGwoKQorICAgICAgICBzZWxmLmRpYWxvZy5ydW4oKQorCisgICAgIiIiCisgICAgQ2hhbmdlIHRvIHRoZSBwcmVsaWdodCBpbWFnZSB3aGVuIHRoZSBtb3VzZSBlbnRlcnMgdGhlIHdpZGdldAorICAgICIiIgorICAgIGRlZiBtb3VzZV9pbl9jYihzZWxmLCB3aWRnZXQsIGV2ZW50KToKKyAgICAgICAgc2VsZi5pbWFnZS5zZXRfZnJvbV9maWxlKGhpYy5JQ09OX0lORk9fSE9WRVJfRklMRSkKKworICAgICIiIgorICAgIENoYW5nZSB0byB0aGUgc3RvY2sgaW1hZ2Ugd2hlbiB0aGUgbW91c2UgZW50ZXJzIHRoZSB3aWRnZXQKKyAgICAiIiIKKyAgICBkZWYgbW91c2Vfb3V0X2NiKHNlbGYsIHdpZGdldCwgZXZlbnQpOgorICAgICAgICBzZWxmLmltYWdlLnNldF9mcm9tX2ZpbGUoaGljLklDT05fSU5GT19ESVNQTEFZX0ZJTEUpCisKK2NsYXNzIEhvYkluZGljYXRvcihndGsuRHJhd2luZ0FyZWEpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb3VudCk6CisgICAgICAgIGd0ay5EcmF3aW5nQXJlYS5fX2luaXRfXyhzZWxmKQorICAgICAgICAjIFNldCBubyB3aW5kb3cgZm9yIHRyYW5zcGFyZW50IGJhY2tncm91bmQKKyAgICAgICAgc2VsZi5zZXRfaGFzX3dpbmRvdyhGYWxzZSkKKyAgICAgICAgc2VsZi5zZXRfc2l6ZV9yZXF1ZXN0KDM4LDM4KQorICAgICAgICAjIFdlIG5lZWQgdG8gcGFzcyB0aHJvdWdoIGJ1dHRvbiBjbGlja3MKKyAgICAgICAgc2VsZi5hZGRfZXZlbnRzKGd0ay5nZGsuQlVUVE9OX1BSRVNTX01BU0sgfCBndGsuZ2RrLkJVVFRPTl9SRUxFQVNFX01BU0spCisKKyAgICAgICAgc2VsZi5jb25uZWN0KCdleHBvc2UtZXZlbnQnLCBzZWxmLmV4cG9zZSkKKworICAgICAgICBzZWxmLmNvdW50ID0gY291bnQKKyAgICAgICAgc2VsZi5jb2xvciA9IEhvYkNvbG9ycy5HUkFZCisKKyAgICBkZWYgZXhwb3NlKHNlbGYsIHdpZGdldCwgZXZlbnQpOgorICAgICAgICBpZiBzZWxmLmNvdW50IGFuZCBzZWxmLmNvdW50ID4gMDoKKyAgICAgICAgICAgIGN0eCA9IHdpZGdldC53aW5kb3cuY2Fpcm9fY3JlYXRlKCkKKworICAgICAgICAgICAgeCwgeSwgdywgaCA9IHNlbGYuYWxsb2NhdGlvbgorCisgICAgICAgICAgICBjdHguc2V0X29wZXJhdG9yKGNhaXJvLk9QRVJBVE9SX09WRVIpCisgICAgICAgICAgICBjdHguc2V0X3NvdXJjZV9jb2xvcihndGsuZ2RrLmNvbG9yX3BhcnNlKHNlbGYuY29sb3IpKQorICAgICAgICAgICAgY3R4LnRyYW5zbGF0ZSh3LzIsIGgvMikKKyAgICAgICAgICAgIGN0eC5hcmMoeCwgeSwgbWluKHcsaCkvMiAtIDIsIDAsIDIqbWF0aC5waSkKKyAgICAgICAgICAgIGN0eC5maWxsX3ByZXNlcnZlKCkKKworICAgICAgICAgICAgbGF5b3V0ID0gc2VsZi5jcmVhdGVfcGFuZ29fbGF5b3V0KHN0cihzZWxmLmNvdW50KSkKKyAgICAgICAgICAgIHRleHR3LCB0ZXh0aCA9IGxheW91dC5nZXRfcGl4ZWxfc2l6ZSgpCisgICAgICAgICAgICB4ID0gKHcvMiktKHRleHR3LzIpICsgeAorICAgICAgICAgICAgeSA9IChoLzIpIC0gKHRleHRoLzIpICsgeQorICAgICAgICAgICAgY3R4Lm1vdmVfdG8oeCwgeSkKKyAgICAgICAgICAgIHNlbGYud2luZG93LmRyYXdfbGF5b3V0KHNlbGYuc3R5bGUubGlnaHRfZ2NbZ3RrLlNUQVRFX05PUk1BTF0sIGludCh4KSwgaW50KHkpLCBsYXlvdXQpCisKKyAgICBkZWYgc2V0X2NvdW50KHNlbGYsIGNvdW50KToKKyAgICAgICAgc2VsZi5jb3VudCA9IGNvdW50CisKKyAgICBkZWYgc2V0X2FjdGl2ZShzZWxmLCBhY3RpdmUpOgorICAgICAgICBpZiBhY3RpdmU6CisgICAgICAgICAgICBzZWxmLmNvbG9yID0gSG9iQ29sb3JzLkRFRVBfUkVECisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmNvbG9yID0gSG9iQ29sb3JzLkdSQVkKKworY2xhc3MgSG9iVGFiTGFiZWwoZ3RrLkhCb3gpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXh0LCBjb3VudD0wKToKKyAgICAgICAgZ3RrLkhCb3guX19pbml0X18oc2VsZiwgRmFsc2UsIDApCisgICAgICAgIHNlbGYuaW5kaWNhdG9yID0gSG9iSW5kaWNhdG9yKGNvdW50KQorICAgICAgICBzZWxmLmluZGljYXRvci5zaG93KCkKKyAgICAgICAgc2VsZi5wYWNrX2VuZChzZWxmLmluZGljYXRvciwgRmFsc2UsIEZhbHNlKQorICAgICAgICBzZWxmLmxibCA9IGd0ay5MYWJlbCh0ZXh0KQorICAgICAgICBzZWxmLmxibC5zZXRfYWxpZ25tZW50KDAuMCwgMC41KQorICAgICAgICBzZWxmLmxibC5zaG93KCkKKyAgICAgICAgc2VsZi5wYWNrX2VuZChzZWxmLmxibCwgVHJ1ZSwgVHJ1ZSwgNikKKworICAgIGRlZiBzZXRfY291bnQoc2VsZiwgY291bnQpOgorICAgICAgICBzZWxmLmluZGljYXRvci5zZXRfY291bnQoY291bnQpCisKKyAgICBkZWYgc2V0X2FjdGl2ZShzZWxmLCBhY3RpdmU9VHJ1ZSk6CisgICAgICAgIHNlbGYuaW5kaWNhdG9yLnNldF9hY3RpdmUoYWN0aXZlKQorCitjbGFzcyBIb2JOb3RlYm9vayhndGsuTm90ZWJvb2spOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgZ3RrLk5vdGVib29rLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuc2V0X3Byb3BlcnR5KCdob21vZ2VuZW91cycsIFRydWUpCisKKyAgICAgICAgc2VsZi5wYWdlcyA9IFtdCisKKyAgICAgICAgc2VsZi5zZWFyY2ggPSBOb25lCisgICAgICAgIHNlbGYuc2VhcmNoX2ZvY3VzID0gRmFsc2UKKyAgICAgICAgc2VsZi5wYWdlX2NoYW5nZWQgPSBGYWxzZQorCisgICAgICAgIHNlbGYuY29ubmVjdCgic3dpdGNoLXBhZ2UiLCBzZWxmLnBhZ2VfY2hhbmdlZF9jYikKKworICAgICAgICBzZWxmLnNob3dfYWxsKCkKKworICAgIGRlZiBwYWdlX2NoYW5nZWRfY2Ioc2VsZiwgbmIsIHBhZ2UsIHBhZ2VfbnVtKToKKyAgICAgICAgZm9yIHAsIGxibCBpbiBlbnVtZXJhdGUoc2VsZi5wYWdlcyk6CisgICAgICAgICAgICBpZiBwID09IHBhZ2VfbnVtOgorICAgICAgICAgICAgICAgIGxibC5zZXRfYWN0aXZlKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbGJsLnNldF9hY3RpdmUoRmFsc2UpCisKKyAgICAgICAgaWYgc2VsZi5zZWFyY2g6CisgICAgICAgICAgICBzZWxmLnBhZ2VfY2hhbmdlZCA9IFRydWUKKyAgICAgICAgICAgIHNlbGYucmVzZXRfZW50cnkoc2VsZi5zZWFyY2gsIHBhZ2VfbnVtKQorCisgICAgZGVmIGFwcGVuZF9wYWdlKHNlbGYsIGNoaWxkLCB0YWJfbGFiZWwsIHRhYl90b29sdGlwPU5vbmUpOgorICAgICAgICBsYWJlbCA9IEhvYlRhYkxhYmVsKHRhYl9sYWJlbCkKKyAgICAgICAgaWYgdGFiX3Rvb2x0aXA6CisgICAgICAgICAgICBsYWJlbC5zZXRfdG9vbHRpcF90ZXh0KHRhYl90b29sdGlwKQorICAgICAgICBsYWJlbC5zZXRfYWN0aXZlKEZhbHNlKQorICAgICAgICBzZWxmLnBhZ2VzLmFwcGVuZChsYWJlbCkKKyAgICAgICAgZ3RrLk5vdGVib29rLmFwcGVuZF9wYWdlKHNlbGYsIGNoaWxkLCBsYWJlbCkKKworICAgIGRlZiBzZXRfZW50cnkoc2VsZiwgbmFtZXMsIHRpcHMpOgorICAgICAgICBzZWxmLnNlYXJjaCA9IGd0ay5FbnRyeSgpCisgICAgICAgIHNlbGYuc2VhcmNoX25hbWVzID0gbmFtZXMKKyAgICAgICAgc2VsZi5zZWFyY2hfdGlwcyA9IHRpcHMKKyAgICAgICAgc3R5bGUgPSBzZWxmLnNlYXJjaC5nZXRfc3R5bGUoKQorICAgICAgICBzdHlsZS50ZXh0W2d0ay5TVEFURV9OT1JNQUxdID0gc2VsZi5nZXRfY29sb3JtYXAoKS5hbGxvY19jb2xvcihIb2JDb2xvcnMuR1JBWSwgRmFsc2UsIEZhbHNlKQorICAgICAgICBzZWxmLnNlYXJjaC5zZXRfc3R5bGUoc3R5bGUpCisgICAgICAgIHNlbGYuc2VhcmNoLnNldF90ZXh0KG5hbWVzWzBdKQorICAgICAgICBzZWxmLnNlYXJjaC5zZXRfdG9vbHRpcF90ZXh0KHNlbGYuc2VhcmNoX3RpcHNbMF0pCisgICAgICAgIHNlbGYuc2VhcmNoLnByb3BzLmhhc190b29sdGlwID0gVHJ1ZQorCisgICAgICAgIHNlbGYuc2VhcmNoLnNldF9lZGl0YWJsZShGYWxzZSkKKyAgICAgICAgc2VsZi5zZWFyY2guc2V0X2ljb25fZnJvbV9zdG9jayhndGsuRU5UUllfSUNPTl9TRUNPTkRBUlksIGd0ay5TVE9DS19DTEVBUikKKyAgICAgICAgc2VsZi5zZWFyY2guc2V0X2ljb25fc2Vuc2l0aXZlKGd0ay5FTlRSWV9JQ09OX1NFQ09OREFSWSwgRmFsc2UpCisgICAgICAgIHNlbGYuc2VhcmNoLmNvbm5lY3QoImljb24tcmVsZWFzZSIsIHNlbGYuc2V0X3NlYXJjaF9lbnRyeV9jbGVhcl9jYikKKyAgICAgICAgc2VsZi5zZWFyY2guc2V0X3dpZHRoX2NoYXJzKDMwKQorICAgICAgICBzZWxmLnNlYXJjaC5zaG93KCkKKworICAgICAgICBzZWxmLnNlYXJjaC5jb25uZWN0KCJmb2N1cy1pbi1ldmVudCIsIHNlbGYuc2V0X3NlYXJjaF9lbnRyeV9lZGl0YWJsZV9jYikKKyAgICAgICAgc2VsZi5zZWFyY2guY29ubmVjdCgiZm9jdXMtb3V0LWV2ZW50Iiwgc2VsZi5zZXRfc2VhcmNoX2VudHJ5X3Jlc2V0X2NiKQorICAgICAgICBzZWxmLnNldF9hY3Rpb25fd2lkZ2V0KHNlbGYuc2VhcmNoLCBndGsuUEFDS19FTkQpCisKKyAgICBkZWYgc2hvd19pbmRpY2F0b3JfaWNvbihzZWxmLCB0aXRsZSwgbnVtYmVyKToKKyAgICAgICAgZm9yIGNoaWxkIGluIHNlbGYucGFnZXM6CisgICAgICAgICAgICBpZiBjaGlsZC5sYmwuZ2V0X2xhYmVsKCkgPT0gdGl0bGU6CisgICAgICAgICAgICAgICAgY2hpbGQuc2V0X2NvdW50KG51bWJlcikKKworICAgIGRlZiBoaWRlX2luZGljYXRvcl9pY29uKHNlbGYsIHRpdGxlKToKKyAgICAgICAgZm9yIGNoaWxkIGluIHNlbGYucGFnZXM6CisgICAgICAgICAgICBpZiBjaGlsZC5sYmwuZ2V0X2xhYmVsKCkgPT0gdGl0bGU6CisgICAgICAgICAgICAgICAgY2hpbGQuc2V0X2NvdW50KDApCisKKyAgICBkZWYgc2V0X3NlYXJjaF9lbnRyeV9lZGl0YWJsZV9jYihzZWxmLCBzZWFyY2gsIGV2ZW50KToKKyAgICAgICAgc2VsZi5zZWFyY2hfZm9jdXMgPSBUcnVlCisgICAgICAgIHNlYXJjaC5zZXRfZWRpdGFibGUoVHJ1ZSkKKyAgICAgICAgdGV4dCA9IHNlYXJjaC5nZXRfdGV4dCgpCisgICAgICAgIGlmIHRleHQgaW4gc2VsZi5zZWFyY2hfbmFtZXM6CisgICAgICAgICAgICBzZWFyY2guc2V0X3RleHQoIiIpCisgICAgICAgIHN0eWxlID0gc2VsZi5zZWFyY2guZ2V0X3N0eWxlKCkKKyAgICAgICAgc3R5bGUudGV4dFtndGsuU1RBVEVfTk9STUFMXSA9IHNlbGYuZ2V0X2NvbG9ybWFwKCkuYWxsb2NfY29sb3IoSG9iQ29sb3JzLkJMQUNLLCBGYWxzZSwgRmFsc2UpCisgICAgICAgIHNlYXJjaC5zZXRfc3R5bGUoc3R5bGUpCisKKyAgICBkZWYgc2V0X3NlYXJjaF9lbnRyeV9yZXNldF9jYihzZWxmLCBzZWFyY2gsIGV2ZW50KToKKyAgICAgICAgcGFnZV9udW0gPSBzZWxmLmdldF9jdXJyZW50X3BhZ2UoKQorICAgICAgICB0ZXh0ID0gc2VhcmNoLmdldF90ZXh0KCkKKyAgICAgICAgaWYgbm90IHRleHQ6CisgICAgICAgICAgICBzZWxmLnJlc2V0X2VudHJ5KHNlYXJjaCwgcGFnZV9udW0pCisKKyAgICBkZWYgcmVzZXRfZW50cnkoc2VsZiwgZW50cnksIHBhZ2VfbnVtKToKKyAgICAgICAgc3R5bGUgPSBlbnRyeS5nZXRfc3R5bGUoKQorICAgICAgICBzdHlsZS50ZXh0W2d0ay5TVEFURV9OT1JNQUxdID0gc2VsZi5nZXRfY29sb3JtYXAoKS5hbGxvY19jb2xvcihIb2JDb2xvcnMuR1JBWSwgRmFsc2UsIEZhbHNlKQorICAgICAgICBlbnRyeS5zZXRfc3R5bGUoc3R5bGUpCisgICAgICAgIGVudHJ5LnNldF90ZXh0KHNlbGYuc2VhcmNoX25hbWVzW3BhZ2VfbnVtXSkKKyAgICAgICAgZW50cnkuc2V0X3Rvb2x0aXBfdGV4dChzZWxmLnNlYXJjaF90aXBzW3BhZ2VfbnVtXSkKKyAgICAgICAgZW50cnkuc2V0X2VkaXRhYmxlKEZhbHNlKQorICAgICAgICBlbnRyeS5zZXRfaWNvbl9zZW5zaXRpdmUoZ3RrLkVOVFJZX0lDT05fU0VDT05EQVJZLCBGYWxzZSkKKworICAgIGRlZiBzZXRfc2VhcmNoX2VudHJ5X2NsZWFyX2NiKHNlbGYsIHNlYXJjaCwgaWNvbl9wb3MsIGV2ZW50KToKKyAgICAgICAgaWYgc2VhcmNoLmdldF9lZGl0YWJsZSgpID09IFRydWU6CisgICAgICAgICAgICBzZWFyY2guc2V0X3RleHQoIiIpCisgICAgICAgIHNlYXJjaC5zZXRfaWNvbl9zZW5zaXRpdmUoZ3RrLkVOVFJZX0lDT05fU0VDT05EQVJZLCBGYWxzZSkKKyAgICAgICAgc2VhcmNoLmdyYWJfZm9jdXMoKQorCisgICAgZGVmIHNldF9wYWdlKHNlbGYsIHRpdGxlKToKKyAgICAgICAgZm9yIGNoaWxkIGluIHNlbGYucGFnZXM6CisgICAgICAgICAgICBpZiBjaGlsZC5sYmwuZ2V0X2xhYmVsKCkgPT0gdGl0bGU6CisgICAgICAgICAgICAgICAgY2hpbGQuZ3JhYl9mb2N1cygpCisgICAgICAgICAgICAgICAgc2VsZi5zZXRfY3VycmVudF9wYWdlKHNlbGYucGFnZXMuaW5kZXgoY2hpbGQpKQorICAgICAgICAgICAgICAgIHJldHVybgorCitjbGFzcyBIb2JXYXJwQ2VsbFJlbmRlcmVyVGV4dChndGsuQ2VsbFJlbmRlcmVyVGV4dCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbF9udW1iZXIpOgorICAgICAgICBndGsuQ2VsbFJlbmRlcmVyVGV4dC5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLnNldF9wcm9wZXJ0eSgid3JhcC1tb2RlIiwgcGFuZ28uV1JBUF9XT1JEX0NIQVIpCisgICAgICAgIHNlbGYuc2V0X3Byb3BlcnR5KCJ3cmFwLXdpZHRoIiwgMzAwKSAjIGRlZmF1bHQgdmFsdWUgd3JhcCB3aWR0aCBpcyAzMDAKKyAgICAgICAgc2VsZi5jb2xfbiA9IGNvbF9udW1iZXIKKworICAgIGRlZiBkb19yZW5kZXIoc2VsZiwgd2luZG93LCB3aWRnZXQsIGJhY2tncm91bmRfYXJlYSwgY2VsbF9hcmVhLCBleHBvc2VfYXJlYSwgZmxhZ3MpOgorICAgICAgICBpZiB3aWRnZXQ6CisgICAgICAgICAgICBzZWxmLnByb3BzLndyYXBfd2lkdGggPSBzZWxmLmdldF9yZXNpemVkX3dyYXBfd2lkdGgod2lkZ2V0LCB3aWRnZXQuZ2V0X2NvbHVtbihzZWxmLmNvbF9uKSkKKyAgICAgICAgcmV0dXJuIGd0ay5DZWxsUmVuZGVyZXJUZXh0LmRvX3JlbmRlcihzZWxmLCB3aW5kb3csIHdpZGdldCwgYmFja2dyb3VuZF9hcmVhLCBjZWxsX2FyZWEsIGV4cG9zZV9hcmVhLCBmbGFncykKKworICAgIGRlZiBnZXRfcmVzaXplZF93cmFwX3dpZHRoKHNlbGYsIHRyZWV2aWV3LCBjb2x1bW4pOgorICAgICAgICBvdGhlckNvbHMgPSBbXQorICAgICAgICBmb3IgY29sIGluIHRyZWV2aWV3LmdldF9jb2x1bW5zKCk6CisgICAgICAgICAgICBpZiBjb2wgIT0gY29sdW1uOgorICAgICAgICAgICAgICAgIG90aGVyQ29scy5hcHBlbmQoY29sKQorICAgICAgICBhZGp3aWR0aCA9IHRyZWV2aWV3LmFsbG9jYXRpb24ud2lkdGggLSBzdW0oYy5nZXRfd2lkdGgoKSBmb3IgYyBpbiBvdGhlckNvbHMpCisgICAgICAgIGFkandpZHRoIC09IHRyZWV2aWV3LnN0eWxlX2dldF9wcm9wZXJ0eSgiaG9yaXpvbnRhbC1zZXBhcmF0b3IiKSAqIDQKKyAgICAgICAgaWYgc2VsZi5wcm9wcy53cmFwX3dpZHRoID09IGFkandpZHRoIG9yIGFkandpZHRoIDw9IDA6CisgICAgICAgICAgICAgICAgYWRqd2lkdGggPSBzZWxmLnByb3BzLndyYXBfd2lkdGgKKyAgICAgICAgcmV0dXJuIGFkandpZHRoCisKK2dvYmplY3QudHlwZV9yZWdpc3RlcihIb2JXYXJwQ2VsbFJlbmRlcmVyVGV4dCkKKworY2xhc3MgSG9iSWNvbkNoZWNrZXIoaGljKToKKyAgICBkZWYgc2V0X2hvYl9pY29uX3RvX3N0b2NrX2ljb24oc2VsZiwgZmlsZV9wYXRoLCBzdG9ja19pZD0iIik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBpeGJ1ZiA9IGd0ay5nZGsucGl4YnVmX25ld19mcm9tX2ZpbGUoZmlsZV9wYXRoKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBlOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICBpZiBzdG9ja19pZCBhbmQgKGd0ay5pY29uX2ZhY3RvcnlfbG9va3VwX2RlZmF1bHQoc3RvY2tfaWQpID09IE5vbmUpOgorICAgICAgICAgICAgaWNvbl9mYWN0b3J5ID0gZ3RrLkljb25GYWN0b3J5KCkKKyAgICAgICAgICAgIGljb25fZmFjdG9yeS5hZGRfZGVmYXVsdCgpCisgICAgICAgICAgICBpY29uX2ZhY3RvcnkuYWRkKHN0b2NrX2lkLCBndGsuSWNvblNldChwaXhidWYpKQorICAgICAgICAgICAgZ3RrLnN0b2NrX2FkZChbKHN0b2NrX2lkLCAnX2xhYmVsJywgMCwgMCwgJycpXSkKKworICAgICAgICAgICAgcmV0dXJuIGljb25fZmFjdG9yeS5sb29rdXAoc3RvY2tfaWQpCisKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICIiIgorICAgIEZvciBtYWtlIGhvYiBpY29uIGNvbnNpc3RlbnRseSBieSByZXF1ZXN0LCBhbmQgYXZvaWQgaWNvbiB2aWV3IGRpZmYgYnkgc3lzdGVtIG9yIGd0ayB2ZXJzaW9uLCB3ZSB1c2Ugc29tZSAnaG9iIGljb24nIHRvIHJlcGxhY2UgdGhlICdndGsgaWNvbicuCisgICAgdGhpcyBmdW5jdGlvbiBjaGVjayB0aGUgc3RvY2tfaWQgYW5kIG1ha2UgaG9iX2lkIHRvIHJlcGxhY2VkIHRoZSBndGtfaWQgdGhlbiByZXR1cm4gaXQgb3IgIiIKKyAgICAiIiIKKyAgICBkZWYgY2hlY2tfc3RvY2tfaWNvbihzZWxmLCBzdG9ja19uYW1lPSIiKToKKyAgICAgICAgSE9CX0NIRUNLX1NUT0NLX05BTUUgPSB7CisgICAgICAgICAgICAoJ2hpYy1kaWFsb2ctaW5mbycsICdndGstZGlhbG9nLWluZm8nLCAnZGlhbG9nLWluZm8nKSAgICAgICAgICAgOiBzZWxmLklDT05fSU5ESV9JTkZPX0ZJTEUsCisgICAgICAgICAgICAoJ2hpYy1vaycsICAgICAgICAgICdndGstb2snLCAgICAgICAgICAgJ29rJykgICAgICAgICAgICAgICAgICAgOiBzZWxmLklDT05fSU5ESV9USUNLX0ZJTEUsCisgICAgICAgICAgICAoJ2hpYy1kaWFsb2ctZXJyb3InLCAnZ3RrLWRpYWxvZy1lcnJvcicsICdkaWFsb2ctZXJyb3InKSAgICAgICAgOiBzZWxmLklDT05fSU5ESV9FUlJPUl9GSUxFLAorICAgICAgICAgICAgKCdoaWMtZGlhbG9nLXdhcm5pbmcnLCAnZ3RrLWRpYWxvZy13YXJuaW5nJywgJ2RpYWxvZy13YXJuaW5nJykgIDogc2VsZi5JQ09OX0lORElfQUxFUlRfRklMRSwKKyAgICAgICAgICAgICgnaGljLXRhc2stcmVmcmVzaCcsICdndGstZXhlY3V0ZScsICdleGVjdXRlJykgICAgICAgICAgICAgICAgICA6IHNlbGYuSUNPTl9JTkRJX1JFRlJFU0hfRklMRSwKKyAgICAgICAgfQorICAgICAgICB2YWxpZF9zdG9ja19pZCA9IHN0b2NrX25hbWUKKyAgICAgICAgaWYgc3RvY2tfbmFtZToKKyAgICAgICAgICAgIGZvciBuYW1lcywgcGF0aCBpbiBIT0JfQ0hFQ0tfU1RPQ0tfTkFNRS5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgICAgICBpZiBzdG9ja19uYW1lIGluIG5hbWVzOgorICAgICAgICAgICAgICAgICAgICB2YWxpZF9zdG9ja19pZCA9IG5hbWVzWzBdCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBndGsuaWNvbl9mYWN0b3J5X2xvb2t1cF9kZWZhdWx0KHZhbGlkX3N0b2NrX2lkKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0X2hvYl9pY29uX3RvX3N0b2NrX2ljb24ocGF0aCwgdmFsaWRfc3RvY2tfaWQpCisKKyAgICAgICAgcmV0dXJuIHZhbGlkX3N0b2NrX2lkCisKK2NsYXNzIEhvYkNlbGxSZW5kZXJlckNvbnRyb2xsZXIoZ29iamVjdC5HT2JqZWN0KToKKyAgICAoTU9ERV9DWUNMRV9SVU5OSU5HLCBNT0RFX09ORV9TSE9SVCkgPSByYW5nZSgyKQorICAgIF9fZ3NpZ25hbHNfXyA9IHsKKyAgICAgICAgInJ1bi10aW1lci1zdG9wcGVkIiA6IChnb2JqZWN0LlNJR05BTF9SVU5fTEFTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpKSwKKyAgICB9CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJ1bm5pbmdtb2RlPU1PREVfQ1lDTEVfUlVOTklORywgaXNfZHJhd19yb3c9RmFsc2UpOgorICAgICAgICBnb2JqZWN0LkdPYmplY3QuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi50aW1lb3V0X2lkID0gTm9uZQorICAgICAgICBzZWxmLmN1cnJlbnRfYW5nbGVfcG9zID0gMC4wCisgICAgICAgIHNlbGYuc3RlcF9hbmdsZSA9IDAuMAorICAgICAgICBzZWxmLnRyZWVfaGVhZGVyc19oZWlnaHQgPSAwCisgICAgICAgIHNlbGYucnVubmluZ19jZWxsX2FyZWFzID0gW10KKyAgICAgICAgc2VsZi5ydW5uaW5nX21vZGUgPSBydW5uaW5nbW9kZQorICAgICAgICBzZWxmLmlzX3F1ZXVlX2RyYXdfcm93X2FyZWEgPSBpc19kcmF3X3JvdworICAgICAgICBzZWxmLmZvcmNlX3N0b3BfZW5hYmxlID0gRmFsc2UKKworICAgIGRlZiBpc19hY3RpdmUoc2VsZik6CisgICAgICAgIGlmIHNlbGYudGltZW91dF9pZDoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiByZXNldF9ydW4oc2VsZik6CisgICAgICAgIHNlbGYuZm9yY2Vfc3RvcCgpCisgICAgICAgIHNlbGYucnVubmluZ19jZWxsX2FyZWFzID0gW10KKyAgICAgICAgc2VsZi5jdXJyZW50X2FuZ2xlX3BvcyA9IDAuMAorICAgICAgICBzZWxmLnN0ZXBfYW5nbGUgPSAwLjAKKworICAgICcnJyB0aW1lX2l0ZXJ2YWw6ICgxfjEwMDApbXMsIHdoaWNoIHdpbGwgYmUgYXMgdGhlIGJhc2ljIGludGVydmFsIGNvdW50IGZvciB0aW1lcgorICAgICAgICBpbml0X3VzcmRhdGE6IHRoZSBjdXJyZW50IGRhdGEgd2hpY2ggcmVsYXRlZCB0aGUgcHJvZ3Jlc3MtYmFyIHdpbGwgYmUgYXQKKyAgICAgICAgbWluX3VzcmRhdGE6IHRoZSByYW5nZSBvZiBtaW4gb2YgdXNlciBkYXRhCisgICAgICAgIG1heF91c3JkYXRhOiB0aGUgcmFuZ2Ugb2YgbWF4IG9mIHVzZXIgZGF0YQorICAgICAgICBzdGVwOiBlYWNoIHN0ZXAgd2hpY2ggeW91IHdhbnQgdG8gcHJvZ3Jlc3MKKyAgICAgICAgTm90ZTogdGhlIGluaXRfdXNyZGF0YSBzaG91bGQgaW4gdGhlIHJhbmdlIG9mIGZyb20gbWluIHRvIG1heCwgYW5kIG1heCBzaG91bGQgPiBtaW4KKyAgICAgICAgICAgICBzdGVwIHNob3VsZCA8IChtYXggLSBtaW4pCisgICAgJycnCisgICAgZGVmIHN0YXJ0X3J1bihzZWxmLCB0aW1lX2l0ZXJ2YWwsIGluaXRfdXNyZGF0YSwgbWluX3VzcmRhdGEsIG1heF91c3JkYXRhLCBzdGVwLCB0cmVlKToKKyAgICAgICAgaWYgKG5vdCB0aW1lX2l0ZXJ2YWwpIG9yIChub3QgbWF4X3VzcmRhdGEpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHVzcl9yYW5nZSA9IChtYXhfdXNyZGF0YSAtIG1pbl91c3JkYXRhKSAqIDEuMAorICAgICAgICBzZWxmLmN1cnJlbnRfYW5nbGVfcG9zID0gKGluaXRfdXNyZGF0YSAqIDEuMCkgLyB1c3JfcmFuZ2UKKyAgICAgICAgc2VsZi5zdGVwX2FuZ2xlID0gKHN0ZXAgKiAxKSAvIHVzcl9yYW5nZQorICAgICAgICBzZWxmLnRpbWVvdXRfaWQgPSBnb2JqZWN0LnRpbWVvdXRfYWRkKGludCh0aW1lX2l0ZXJ2YWwpLAorICAgICAgICBzZWxmLm1ha2VfaW1hZ2Vfb25fcHJvZ3Jlc3NpbmdfY2IsIHRyZWUpCisgICAgICAgIHNlbGYudHJlZV9oZWFkZXJzX2hlaWdodCA9IHNlbGYuZ2V0X3RyZWV2aWV3X2hlYWRlcnNfaGVpZ2h0KHRyZWUpCisgICAgICAgIHNlbGYuZm9yY2Vfc3RvcF9lbmFibGUgPSBGYWxzZQorCisgICAgZGVmIGZvcmNlX3N0b3Aoc2VsZik6CisgICAgICAgIHNlbGYuZW1pdCgicnVuLXRpbWVyLXN0b3BwZWQiKQorICAgICAgICBzZWxmLmZvcmNlX3N0b3BfZW5hYmxlID0gVHJ1ZQorICAgICAgICBpZiBzZWxmLnRpbWVvdXRfaWQ6CisgICAgICAgICAgICBpZiBnb2JqZWN0LnNvdXJjZV9yZW1vdmUoc2VsZi50aW1lb3V0X2lkKToKKyAgICAgICAgICAgICAgICBzZWxmLnRpbWVvdXRfaWQgPSBOb25lCisKKyAgICBkZWYgb25fZHJhd19waXhidWZfY2Ioc2VsZiwgcGl4YnVmLCBjciwgeCwgeSwgaW1nX3dpZHRoLCBpbWdfaGVpZ2h0LCBkb19yZWZyZXNoPVRydWUpOgorICAgICAgICBpZiBwaXhidWY6CisgICAgICAgICAgICByID0gbWF4KGltZ193aWR0aC8yLCBpbWdfaGVpZ2h0LzIpCisgICAgICAgICAgICBjci50cmFuc2xhdGUoeCArIHIsIHkgKyByKQorICAgICAgICAgICAgaWYgZG9fcmVmcmVzaDoKKyAgICAgICAgICAgICAgICBjci5yb3RhdGUoMiAqIG1hdGgucGkgKiBzZWxmLmN1cnJlbnRfYW5nbGVfcG9zKQorCisgICAgICAgICAgICBjci5zZXRfc291cmNlX3BpeGJ1ZihwaXhidWYsIC1pbWdfd2lkdGgvMiwgLWltZ19oZWlnaHQvMikKKyAgICAgICAgICAgIGNyLnBhaW50KCkKKworICAgIGRlZiBvbl9kcmF3X2ZhZGVpbm91dF9jYihzZWxmLCBjciwgY29sb3IsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGRvX2ZhZGVvdXQ9VHJ1ZSk6CisgICAgICAgIGlmIGRvX2ZhZGVvdXQ6CisgICAgICAgICAgICBhbHBoYSA9IHNlbGYuY3VycmVudF9hbmdsZV9wb3MgKiAwLjgKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFscGhhID0gKDEuMCAtIHNlbGYuY3VycmVudF9hbmdsZV9wb3MpICogMC44CisKKyAgICAgICAgY3Iuc2V0X3NvdXJjZV9yZ2JhKGNvbG9yLnJlZCwgY29sb3IuZ3JlZW4sIGNvbG9yLmJsdWUsIGFscGhhKQorICAgICAgICBjci5yZWN0YW5nbGUoeCwgeSwgd2lkdGgsIGhlaWdodCkKKyAgICAgICAgY3IuZmlsbCgpCisKKyAgICBkZWYgZ2V0X3RyZWV2aWV3X2hlYWRlcnNfaGVpZ2h0KHNlbGYsIHRyZWUpOgorICAgICAgICBpZiB0cmVlIGFuZCAodHJlZS5nZXRfcHJvcGVydHkoImhlYWRlcnMtdmlzaWJsZSIpID09IFRydWUpOgorICAgICAgICAgICAgaGVpZ2h0ID0gdHJlZS5nZXRfYWxsb2NhdGlvbigpLmhlaWdodCAtIHRyZWUuZ2V0X2Jpbl93aW5kb3coKS5nZXRfc2l6ZSgpWzFdCisgICAgICAgICAgICByZXR1cm4gaGVpZ2h0CisKKyAgICAgICAgcmV0dXJuIDAKKworICAgIGRlZiBtYWtlX2ltYWdlX29uX3Byb2dyZXNzaW5nX2NiKHNlbGYsIHRyZWUpOgorICAgICAgICBzZWxmLmN1cnJlbnRfYW5nbGVfcG9zICs9IHNlbGYuc3RlcF9hbmdsZQorICAgICAgICBpZiBzZWxmLnJ1bm5pbmdfbW9kZSA9PSBzZWxmLk1PREVfQ1lDTEVfUlVOTklORzoKKyAgICAgICAgICAgIGlmIChzZWxmLmN1cnJlbnRfYW5nbGVfcG9zID49IDEpOgorICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudF9hbmdsZV9wb3MgPSAwCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBzZWxmLmN1cnJlbnRfYW5nbGVfcG9zID4gMToKKyAgICAgICAgICAgICAgICBzZWxmLmZvcmNlX3N0b3AoKQorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIGlmIHNlbGYuaXNfcXVldWVfZHJhd19yb3dfYXJlYToKKyAgICAgICAgICAgIGZvciBwYXRoIGluIHNlbGYucnVubmluZ19jZWxsX2FyZWFzOgorICAgICAgICAgICAgICAgIHJlY3QgPSB0cmVlLmdldF9jZWxsX2FyZWEocGF0aCwgdHJlZS5nZXRfY29sdW1uKDApKQorICAgICAgICAgICAgICAgIHJvd194LCBfLCByb3dfd2lkdGgsIF8gPSB0cmVlLmdldF92aXNpYmxlX3JlY3QoKQorICAgICAgICAgICAgICAgIHRyZWUucXVldWVfZHJhd19hcmVhKHJvd194LCByZWN0LnkgKyBzZWxmLnRyZWVfaGVhZGVyc19oZWlnaHQsIHJvd193aWR0aCwgcmVjdC5oZWlnaHQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmb3IgcmVjdCBpbiBzZWxmLnJ1bm5pbmdfY2VsbF9hcmVhczoKKyAgICAgICAgICAgICAgICB0cmVlLnF1ZXVlX2RyYXdfYXJlYShyZWN0LngsIHJlY3QueSArIHNlbGYudHJlZV9oZWFkZXJzX2hlaWdodCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpCisKKyAgICAgICAgcmV0dXJuIChub3Qgc2VsZi5mb3JjZV9zdG9wX2VuYWJsZSkKKworICAgIGRlZiBhcHBlbmRfcnVubmluZ19jZWxsX2FyZWEoc2VsZiwgY2VsbF9hcmVhKToKKyAgICAgICAgaWYgY2VsbF9hcmVhIGFuZCAoY2VsbF9hcmVhIG5vdCBpbiBzZWxmLnJ1bm5pbmdfY2VsbF9hcmVhcyk6CisgICAgICAgICAgICBzZWxmLnJ1bm5pbmdfY2VsbF9hcmVhcy5hcHBlbmQoY2VsbF9hcmVhKQorCisgICAgZGVmIHJlbW92ZV9ydW5uaW5nX2NlbGxfYXJlYShzZWxmLCBjZWxsX2FyZWEpOgorICAgICAgICBpZiBjZWxsX2FyZWEgaW4gc2VsZi5ydW5uaW5nX2NlbGxfYXJlYXM6CisgICAgICAgICAgICBzZWxmLnJ1bm5pbmdfY2VsbF9hcmVhcy5yZW1vdmUoY2VsbF9hcmVhKQorICAgICAgICBpZiBub3Qgc2VsZi5ydW5uaW5nX2NlbGxfYXJlYXM6CisgICAgICAgICAgICBzZWxmLnJlc2V0X3J1bigpCisKK2dvYmplY3QudHlwZV9yZWdpc3RlcihIb2JDZWxsUmVuZGVyZXJDb250cm9sbGVyKQorCitjbGFzcyBIb2JDZWxsUmVuZGVyZXJQaXhidWYoZ3RrLkNlbGxSZW5kZXJlclBpeGJ1Zik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBndGsuQ2VsbFJlbmRlcmVyUGl4YnVmLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuY29udHJvbCA9IEhvYkNlbGxSZW5kZXJlckNvbnRyb2xsZXIoKQorICAgICAgICAjIGFkZCBpY29uIGNoZWNrZXIgZm9yIG1ha2UgdGhlIGd0ay1pY29uIHRyYW5zZmVyIHRvIGhvYi1pY29uCisgICAgICAgIHNlbGYuY2hlY2tlciA9IEhvYkljb25DaGVja2VyKCkKKyAgICAgICAgc2VsZi5zZXRfcHJvcGVydHkoInN0b2NrLXNpemUiLCBndGsuSUNPTl9TSVpFX0RORCkKKworICAgIGRlZiBnZXRfcGl4YnVmX2Zyb21fc3RvY2tfaWNvbihzZWxmLCB3aWRnZXQsIHN0b2NrX2lkPSIiLCBzaXplPWd0ay5JQ09OX1NJWkVfRElBTE9HKToKKyAgICAgICAgaWYgd2lkZ2V0IGFuZCBzdG9ja19pZCBhbmQgZ3RrLmljb25fZmFjdG9yeV9sb29rdXBfZGVmYXVsdChzdG9ja19pZCk6CisgICAgICAgICAgICByZXR1cm4gd2lkZ2V0LnJlbmRlcl9pY29uKHN0b2NrX2lkLCBzaXplKQorCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgc2V0X2ljb25fbmFtZV90b19pZChzZWxmLCBuZXdfbmFtZSk6CisgICAgICAgIGlmIG5ld19uYW1lIGFuZCB0eXBlKG5ld19uYW1lKSA9PSBzdHI6CisgICAgICAgICAgICAjIGNoZWNrIHRoZSBuYW1lIGlzIG5lZWQgdG8gdHJhbnNmZXIgdG8gaG9iIGljb24gb3Igbm90CisgICAgICAgICAgICBuYW1lID0gc2VsZi5jaGVja2VyLmNoZWNrX3N0b2NrX2ljb24obmV3X25hbWUpCisgICAgICAgICAgICBpZiBuYW1lLnN0YXJ0c3dpdGgoImhpYyIpIG9yIG5hbWUuc3RhcnRzd2l0aCgiZ3RrIik6CisgICAgICAgICAgICAgICAgc3RvY2tfaWQgPSBuYW1lCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN0b2NrX2lkID0gJ2d0ay0nICsgbmFtZQorCisgICAgICAgIHJldHVybiBzdG9ja19pZAorCisgICAgJycnIHJlbmRlciBjZWxsIGV4YWN0bHksICJpY29uLW5hbWUiIGlzIHByaW9yaXR5CisgICAgICAgIGlmIHVzZSB0aGUgJ2hpYy10YXNrLXJlZnJlc2gnIHdpbGwgbWFrZSB0aGUgcGl4IGFuaW1hdGlvbgorICAgICAgICBpZiAncGl4JyB3aWxsIGNoYW5nZSB0aGUgcGl4YnVmIGZvciBpdCBmcm9tIHRoZSBwaXhidWYgb3IgaW1hZ2UuCisgICAgJycnCisgICAgZGVmIGRvX3JlbmRlcihzZWxmLCB3aW5kb3csIHRyZWUsIGJhY2tncm91bmRfYXJlYSxjZWxsX2FyZWEsIGV4cG9zZV9hcmVhLCBmbGFncyk6CisgICAgICAgIGlmIChub3Qgc2VsZi5jb250cm9sKSBvciAobm90IHRyZWUpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgeCwgeSwgdywgaCA9IHNlbGYub25fZ2V0X3NpemUodHJlZSwgY2VsbF9hcmVhKQorICAgICAgICB4ICs9IGNlbGxfYXJlYS54CisgICAgICAgIHkgKz0gY2VsbF9hcmVhLnkKKyAgICAgICAgdyAtPSAyICogc2VsZi5nZXRfcHJvcGVydHkoInhwYWQiKQorICAgICAgICBoIC09IDIgKiBzZWxmLmdldF9wcm9wZXJ0eSgieXBhZCIpCisKKyAgICAgICAgc3RvY2tfaWQgPSAiIgorICAgICAgICBpZiBzZWxmLnByb3BzLmljb25fbmFtZToKKyAgICAgICAgICAgIHN0b2NrX2lkID0gc2VsZi5zZXRfaWNvbl9uYW1lX3RvX2lkKHNlbGYucHJvcHMuaWNvbl9uYW1lKQorICAgICAgICBlbGlmIHNlbGYucHJvcHMuc3RvY2tfaWQ6CisgICAgICAgICAgICBzdG9ja19pZCA9IHNlbGYucHJvcHMuc3RvY2tfaWQKKyAgICAgICAgZWxpZiBzZWxmLnByb3BzLnBpeGJ1ZjoKKyAgICAgICAgICAgIHBpeCA9IHNlbGYucHJvcHMucGl4YnVmCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBzdG9ja19pZDoKKyAgICAgICAgICAgIHBpeCA9IHNlbGYuZ2V0X3BpeGJ1Zl9mcm9tX3N0b2NrX2ljb24odHJlZSwgc3RvY2tfaWQsIHNlbGYucHJvcHMuc3RvY2tfc2l6ZSkKKyAgICAgICAgaWYgc3RvY2tfaWQgPT0gJ2hpYy10YXNrLXJlZnJlc2gnOgorICAgICAgICAgICAgc2VsZi5jb250cm9sLmFwcGVuZF9ydW5uaW5nX2NlbGxfYXJlYShjZWxsX2FyZWEpCisgICAgICAgICAgICBpZiBzZWxmLmNvbnRyb2wuaXNfYWN0aXZlKCk6CisgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLm9uX2RyYXdfcGl4YnVmX2NiKHBpeCwgd2luZG93LmNhaXJvX2NyZWF0ZSgpLCB4LCB5LCB3LCBoLCBUcnVlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2wuc3RhcnRfcnVuKDIwMCwgMCwgMCwgMTAwMCwgMTUwLCB0cmVlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5jb250cm9sLnJlbW92ZV9ydW5uaW5nX2NlbGxfYXJlYShjZWxsX2FyZWEpCisgICAgICAgICAgICBzZWxmLmNvbnRyb2wub25fZHJhd19waXhidWZfY2IocGl4LCB3aW5kb3cuY2Fpcm9fY3JlYXRlKCksIHgsIHksIHcsIGgsIEZhbHNlKQorCisgICAgZGVmIG9uX2dldF9zaXplKHNlbGYsIHdpZGdldCwgY2VsbF9hcmVhKToKKyAgICAgICAgaWYgc2VsZi5wcm9wcy5pY29uX25hbWUgb3Igc2VsZi5wcm9wcy5waXhidWYgb3Igc2VsZi5wcm9wcy5zdG9ja19pZDoKKyAgICAgICAgICAgIHcsIGggPSBndGsuaWNvbl9zaXplX2xvb2t1cChzZWxmLnByb3BzLnN0b2NrX3NpemUpCisgICAgICAgICAgICBjYWxjX3dpZHRoID0gc2VsZi5nZXRfcHJvcGVydHkoInhwYWQiKSAqIDIgKyB3CisgICAgICAgICAgICBjYWxjX2hlaWdodCA9IHNlbGYuZ2V0X3Byb3BlcnR5KCJ5cGFkIikgKiAyICsgaAorICAgICAgICAgICAgeF9vZmZzZXQgPSAwCisgICAgICAgICAgICB5X29mZnNldCA9IDAKKyAgICAgICAgICAgIGlmIGNlbGxfYXJlYSBhbmQgdyA+IDAgYW5kIGggPiAwOgorICAgICAgICAgICAgICAgIHhfb2Zmc2V0ID0gc2VsZi5nZXRfcHJvcGVydHkoInhhbGlnbiIpICogKGNlbGxfYXJlYS53aWR0aCAtIGNhbGNfd2lkdGggLSBzZWxmLmdldF9wcm9wZXJ0eSgieHBhZCIpKQorICAgICAgICAgICAgICAgIHlfb2Zmc2V0ID0gc2VsZi5nZXRfcHJvcGVydHkoInlhbGlnbiIpICogKGNlbGxfYXJlYS5oZWlnaHQgLSBjYWxjX2hlaWdodCAtIHNlbGYuZ2V0X3Byb3BlcnR5KCJ5cGFkIikpCisKKyAgICAgICAgICAgIHJldHVybiB4X29mZnNldCwgeV9vZmZzZXQsIHcsIGgKKworICAgICAgICByZXR1cm4gMCwgMCwgMCwgMAorCitnb2JqZWN0LnR5cGVfcmVnaXN0ZXIoSG9iQ2VsbFJlbmRlcmVyUGl4YnVmKQorCitjbGFzcyBIb2JDZWxsUmVuZGVyZXJUb2dnbGUoZ3RrLkNlbGxSZW5kZXJlclRvZ2dsZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBndGsuQ2VsbFJlbmRlcmVyVG9nZ2xlLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuY3RybCA9IEhvYkNlbGxSZW5kZXJlckNvbnRyb2xsZXIoaXNfZHJhd19yb3c9VHJ1ZSkKKyAgICAgICAgc2VsZi5jdHJsLnJ1bm5pbmdfbW9kZSA9IHNlbGYuY3RybC5NT0RFX09ORV9TSE9SVAorICAgICAgICBzZWxmLmNlbGxfYXR0ciA9IHsiZmFkZW91dCI6IEZhbHNlLCAibnVtYmVyX29mX2NoaWxkcmVuIjogMH0KKworICAgIGRlZiBkb19yZW5kZXIoc2VsZiwgd2luZG93LCB3aWRnZXQsIGJhY2tncm91bmRfYXJlYSwgY2VsbF9hcmVhLCBleHBvc2VfYXJlYSwgZmxhZ3MpOgorICAgICAgICBpZiAobm90IHNlbGYuY3RybCkgb3IgKG5vdCB3aWRnZXQpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgZmxhZ3MgJiBndGsuQ0VMTF9SRU5ERVJFUl9TRUxFQ1RFRDoKKyAgICAgICAgICAgIHN0YXRlID0gZ3RrLlNUQVRFX1NFTEVDVEVECisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdGF0ZSA9IGd0ay5TVEFURV9OT1JNQUwKKworICAgICAgICBpZiBzZWxmLmN0cmwuaXNfYWN0aXZlKCk6CisgICAgICAgICAgICBwYXRoID0gd2lkZ2V0LmdldF9wYXRoX2F0X3BvcyhjZWxsX2FyZWEueCArIGNlbGxfYXJlYS53aWR0aC8yLCBjZWxsX2FyZWEueSArIGNlbGxfYXJlYS5oZWlnaHQvMikKKyAgICAgICAgICAgICMgc29tZXRpbWVzIHRoZSBwYXJhbWV0ZXJzIG9mIGNlbGxfYXJlYSB3aWxsIGJlIGEgbmVnYXRpdmUgbnVtYmVyLHN1Y2ggYXMgcHVsbCB1cCBkb3duIHRoZSBzY3JvbGwgYmFyCisgICAgICAgICAgICAjIGl0J3Mgb3ZlciB0aGUgdHJlZSBjb250YWluZXIgcmFuZ2UsIHNvIHRoZSBwYXRoIHdpbGwgYmUgYmFkCisgICAgICAgICAgICBpZiBub3QgcGF0aDogcmV0dXJuCisgICAgICAgICAgICBwYXRoID0gcGF0aFswXQorICAgICAgICAgICAgaWYgcGF0aCBpbiBzZWxmLmN0cmwucnVubmluZ19jZWxsX2FyZWFzOgorICAgICAgICAgICAgICAgIGNyID0gd2luZG93LmNhaXJvX2NyZWF0ZSgpCisgICAgICAgICAgICAgICAgY29sb3IgPSB3aWRnZXQuZ2V0X3N0eWxlKCkuYmFzZVtzdGF0ZV0KKworICAgICAgICAgICAgICAgIHJvd194LCBfLCByb3dfd2lkdGgsIF8gPSB3aWRnZXQuZ2V0X3Zpc2libGVfcmVjdCgpCisgICAgICAgICAgICAgICAgYm9yZGVyX3kgPSBzZWxmLmdldF9wcm9wZXJ0eSgieXBhZCIpCisgICAgICAgICAgICAgICAgc2VsZi5jdHJsLm9uX2RyYXdfZmFkZWlub3V0X2NiKGNyLCBjb2xvciwgcm93X3gsIGNlbGxfYXJlYS55IC0gYm9yZGVyX3ksIHJvd193aWR0aCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsX2FyZWEuaGVpZ2h0ICsgYm9yZGVyX3kgKiAyLCBzZWxmLmNlbGxfYXR0clsiZmFkZW91dCJdKQorICAgICAgICAjIGRyYXcgbnVtYmVyIG9mIGEgZ3JvdXAKKyAgICAgICAgaWYgc2VsZi5jZWxsX2F0dHJbIm51bWJlcl9vZl9jaGlsZHJlbiJdOgorICAgICAgICAgICAgdGV4dCA9ICIlZCBwa2ciICUgc2VsZi5jZWxsX2F0dHJbIm51bWJlcl9vZl9jaGlsZHJlbiJdCisgICAgICAgICAgICBwYW5nb2xheW91dCA9IHdpZGdldC5jcmVhdGVfcGFuZ29fbGF5b3V0KHRleHQpCisgICAgICAgICAgICB0ZXh0dywgdGV4dGggPSBwYW5nb2xheW91dC5nZXRfcGl4ZWxfc2l6ZSgpCisgICAgICAgICAgICB4ID0gY2VsbF9hcmVhLnggKyAoY2VsbF9hcmVhLndpZHRoLzIpIC0gKHRleHR3LzIpCisgICAgICAgICAgICB5ID0gY2VsbF9hcmVhLnkgKyAoY2VsbF9hcmVhLmhlaWdodC8yKSAtICh0ZXh0aC8yKQorCisgICAgICAgICAgICB3aWRnZXQuc3R5bGUucGFpbnRfbGF5b3V0KHdpbmRvdywgc3RhdGUsIFRydWUsIGNlbGxfYXJlYSwgd2lkZ2V0LCAiY2hlY2tib3giLCB4LCB5LCBwYW5nb2xheW91dCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBndGsuQ2VsbFJlbmRlcmVyVG9nZ2xlLmRvX3JlbmRlcihzZWxmLCB3aW5kb3csIHdpZGdldCwgYmFja2dyb3VuZF9hcmVhLCBjZWxsX2FyZWEsIGV4cG9zZV9hcmVhLCBmbGFncykKKworICAgICcnJ2RlbGF5OiBub3JtYWxseSBkZWxheSB0aW1lIGlzIDEwMDBtcworICAgICAgIGNlbGxfbGlzdDogd2hpbGNoIGNlbGxzIG5lZWQgdG8gYmUgcmVuZGVyCisgICAgJycnCisgICAgZGVmIGZhZGVvdXQoc2VsZiwgdHJlZSwgZGVsYXksIGNlbGxfbGlzdD1Ob25lKToKKyAgICAgICAgaWYgKGRlbGF5IDwgMjAwKSBvciAobm90IHRyZWUpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuY2VsbF9hdHRyWyJmYWRlb3V0Il0gPSBUcnVlCisgICAgICAgIHNlbGYuY3RybC5ydW5uaW5nX2NlbGxfYXJlYXMgPSBjZWxsX2xpc3QKKyAgICAgICAgc2VsZi5jdHJsLnN0YXJ0X3J1bigyMDAsIDAsIDAsIGRlbGF5LCAoZGVsYXkgKiAyMDAgLyAxMDAwKSwgdHJlZSkKKworICAgIGRlZiBjb25uZWN0X3JlbmRlcl9zdGF0ZV9jaGFuZ2VkKHNlbGYsIGZ1bmMsIHVzcmRhdGE9Tm9uZSk6CisgICAgICAgIGlmIG5vdCBmdW5jOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIHVzcmRhdGE6CisgICAgICAgICAgICBzZWxmLmN0cmwuY29ubmVjdCgicnVuLXRpbWVyLXN0b3BwZWQiLCBmdW5jLCBzZWxmLCB1c3JkYXRhKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5jdHJsLmNvbm5lY3QoInJ1bi10aW1lci1zdG9wcGVkIiwgZnVuYywgc2VsZikKKworZ29iamVjdC50eXBlX3JlZ2lzdGVyKEhvYkNlbGxSZW5kZXJlclRvZ2dsZSkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9pbWFnZWNvbmZpZ3VyYXRpb25wYWdlLnB5IGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2ltYWdlY29uZmlndXJhdGlvbnBhZ2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc2NmJlYQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9pbWFnZWNvbmZpZ3VyYXRpb25wYWdlLnB5CkBAIC0wLDAgKzEsNTYxIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgQml0QmFrZSBHcmFwaGljYWwgR1RLIFVzZXIgSW50ZXJmYWNlCisjCisjIENvcHlyaWdodCAoQykgMjAxMiAgICAgICAgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgQXV0aG9yZWQgYnkgRG9uZ3hpYW8gWHUgPGRvbmd4aWFvLnh1QGludGVsLmNvbT4KKyMgQXV0aG9yZWQgYnkgU2hhbmUgV2FuZyA8c2hhbmUud2FuZ0BpbnRlbC5jb20+CisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitpbXBvcnQgZ3RrCitpbXBvcnQgZ2xpYgoraW1wb3J0IHJlCitmcm9tIGJiLnVpLmNydW1icy5wcm9ncmVzc2JhciBpbXBvcnQgSG9iUHJvZ3Jlc3NCYXIKK2Zyb20gYmIudWkuY3J1bWJzLmhvYmNvbG9yIGltcG9ydCBIb2JDb2xvcnMKK2Zyb20gYmIudWkuY3J1bWJzLmhvYndpZGdldCBpbXBvcnQgaGljLCBIb2JJbWFnZUJ1dHRvbiwgSG9iSW5mb0J1dHRvbiwgSG9iQWx0QnV0dG9uLCBIb2JCdXR0b24KK2Zyb20gYmIudWkuY3J1bWJzLmhvYmxpc3Rtb2RlbCBpbXBvcnQgUmVjaXBlTGlzdE1vZGVsCitmcm9tIGJiLnVpLmNydW1icy5ob2JwYWdlcyBpbXBvcnQgSG9iUGFnZQorZnJvbSBiYi51aS5jcnVtYnMuaGlnLnJldHJpZXZlaW1hZ2VkaWFsb2cgaW1wb3J0IFJldHJpZXZlSW1hZ2VEaWFsb2cKKworIworIyBJbWFnZUNvbmZpZ3VyYXRpb25QYWdlCisjCitjbGFzcyBJbWFnZUNvbmZpZ3VyYXRpb25QYWdlIChIb2JQYWdlKToKKworICAgIF9fZHVtbXlfbWFjaGluZV9fID0gIi0tc2VsZWN0IGEgbWFjaGluZS0tIgorICAgIF9fZHVtbXlfaW1hZ2VfXyAgID0gIi0tc2VsZWN0IGFuIGltYWdlIHJlY2lwZS0tIgorICAgIF9fY3VzdG9tX2ltYWdlX18gID0gIlNlbGVjdCBmcm9tIG15IGltYWdlIHJlY2lwZXMiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYnVpbGRlcik6CisgICAgICAgIHN1cGVyKEltYWdlQ29uZmlndXJhdGlvblBhZ2UsIHNlbGYpLl9faW5pdF9fKGJ1aWxkZXIsICJJbWFnZSBjb25maWd1cmF0aW9uIikKKworICAgICAgICBzZWxmLmltYWdlX2NvbWJvX2lkID0gTm9uZQorICAgICAgICAjIHdlIHVzZSBtYWNoaW5lX2NvbWJvX2NoYW5nZWRfYnlfbWFudWFsIHRvIGlkZW50aWZ5IHRoZSBtYWNoaW5lIGlzIGNoYW5nZWQgYnkgY29kZQorICAgICAgICAjIG9yIGJ5IG1hbnVhbC4gSWYgYnkgbWFudWFsLCBhbGwgdXNlcidzIHJlY2lwZSBzZWxlY3Rpb24gYW5kIHBhY2thZ2Ugc2VsZWN0aW9uIGFyZQorICAgICAgICAjIGNsZWFyZWQuCisgICAgICAgIHNlbGYubWFjaGluZV9jb21ib19jaGFuZ2VkX2J5X21hbnVhbCA9IFRydWUKKyAgICAgICAgc2VsZi5zdG9wcGluZyA9IEZhbHNlCisgICAgICAgIHNlbGYud2FybmluZ19zaGlmdCA9IDAKKyAgICAgICAgc2VsZi5jdXN0b21faW1hZ2Vfc2VsZWN0ZWQgPSBOb25lCisgICAgICAgIHNlbGYuY3JlYXRlX3Zpc3VhbF9lbGVtZW50cygpCisKKyAgICBkZWYgY3JlYXRlX3Zpc3VhbF9lbGVtZW50cyhzZWxmKToKKyAgICAgICAgIyBjcmVhdGUgdmlzdWFsIGVsZW1lbnRzCisgICAgICAgIHNlbGYudG9vbGJhciA9IGd0ay5Ub29sYmFyKCkKKyAgICAgICAgc2VsZi50b29sYmFyLnNldF9vcmllbnRhdGlvbihndGsuT1JJRU5UQVRJT05fSE9SSVpPTlRBTCkKKyAgICAgICAgc2VsZi50b29sYmFyLnNldF9zdHlsZShndGsuVE9PTEJBUl9CT1RIKQorCisgICAgICAgIG15X2ltYWdlc19idXR0b24gPSBzZWxmLmFwcGVuZF90b29sYmFyX2J1dHRvbihzZWxmLnRvb2xiYXIsCisgICAgICAgICAgICAiSW1hZ2VzIiwKKyAgICAgICAgICAgIGhpYy5JQ09OX0lNQUdFU19ESVNQTEFZX0ZJTEUsCisgICAgICAgICAgICBoaWMuSUNPTl9JTUFHRVNfSE9WRVJfRklMRSwKKyAgICAgICAgICAgICJPcGVuIHByZXZpb3VzbHkgYnVpbHQgaW1hZ2VzIiwKKyAgICAgICAgICAgIHNlbGYubXlfaW1hZ2VzX2J1dHRvbl9jbGlja2VkX2NiKQorICAgICAgICBzZXR0aW5nc19idXR0b24gPSBzZWxmLmFwcGVuZF90b29sYmFyX2J1dHRvbihzZWxmLnRvb2xiYXIsCisgICAgICAgICAgICAiU2V0dGluZ3MiLAorICAgICAgICAgICAgaGljLklDT05fU0VUVElOR1NfRElTUExBWV9GSUxFLAorICAgICAgICAgICAgaGljLklDT05fU0VUVElOR1NfSE9WRVJfRklMRSwKKyAgICAgICAgICAgICJWaWV3IGFkZGl0aW9uYWwgYnVpbGQgc2V0dGluZ3MiLAorICAgICAgICAgICAgc2VsZi5zZXR0aW5nc19idXR0b25fY2xpY2tlZF9jYikKKworICAgICAgICBzZWxmLmNvbmZpZ190b3BfYnV0dG9uID0gc2VsZi5hZGRfb250b190b3BfYmFyKHNlbGYudG9vbGJhcikKKworICAgICAgICBzZWxmLmd0YWJsZSA9IGd0ay5UYWJsZSg0MCwgNDAsIFRydWUpCisgICAgICAgIHNlbGYuY3JlYXRlX2NvbmZpZ19tYWNoaW5lKCkKKyAgICAgICAgc2VsZi5jcmVhdGVfY29uZmlnX2Jhc2VpbWcoKQorICAgICAgICBzZWxmLmNvbmZpZ19idWlsZF9idXR0b24gPSBzZWxmLmNyZWF0ZV9jb25maWdfYnVpbGRfYnV0dG9uKCkKKworICAgIGRlZiBfcmVtb3ZlX2FsbF93aWRnZXQoc2VsZik6CisgICAgICAgIGNoaWxkcmVuID0gc2VsZi5ndGFibGUuZ2V0X2NoaWxkcmVuKCkgb3IgW10KKyAgICAgICAgZm9yIGNoaWxkIGluIGNoaWxkcmVuOgorICAgICAgICAgICAgc2VsZi5ndGFibGUucmVtb3ZlKGNoaWxkKQorICAgICAgICBjaGlsZHJlbiA9IHNlbGYuYm94X2dyb3VwX2FyZWEuZ2V0X2NoaWxkcmVuKCkgb3IgW10KKyAgICAgICAgZm9yIGNoaWxkIGluIGNoaWxkcmVuOgorICAgICAgICAgICAgc2VsZi5ib3hfZ3JvdXBfYXJlYS5yZW1vdmUoY2hpbGQpCisgICAgICAgIGNoaWxkcmVuID0gc2VsZi5nZXRfY2hpbGRyZW4oKSBvciBbXQorICAgICAgICBmb3IgY2hpbGQgaW4gY2hpbGRyZW46CisgICAgICAgICAgICBzZWxmLnJlbW92ZShjaGlsZCkKKworICAgIGRlZiBfcGFja19jb21wb25lbnRzKHNlbGYsIHBhY2tfY29uZmlnX2J1aWxkX2J1dHRvbiA9IEZhbHNlKToKKyAgICAgICAgc2VsZi5fcmVtb3ZlX2FsbF93aWRnZXQoKQorICAgICAgICBzZWxmLnBhY2tfc3RhcnQoc2VsZi5jb25maWdfdG9wX2J1dHRvbiwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICBzZWxmLnBhY2tfc3RhcnQoc2VsZi5ncm91cF9hbGlnbiwgZXhwYW5kPVRydWUsIGZpbGw9VHJ1ZSkKKworICAgICAgICBzZWxmLmJveF9ncm91cF9hcmVhLnBhY2tfc3RhcnQoc2VsZi5ndGFibGUsIGV4cGFuZD1UcnVlLCBmaWxsPVRydWUpCisgICAgICAgIGlmIHBhY2tfY29uZmlnX2J1aWxkX2J1dHRvbjoKKyAgICAgICAgICAgIHNlbGYuYm94X2dyb3VwX2FyZWEucGFja19lbmQoc2VsZi5jb25maWdfYnVpbGRfYnV0dG9uLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBib3ggPSBndGsuSEJveChGYWxzZSwgNikKKyAgICAgICAgICAgIGJveC5zaG93KCkKKyAgICAgICAgICAgIHN1YmJveCA9IGd0ay5IQm94KEZhbHNlLCAwKQorICAgICAgICAgICAgc3ViYm94LnNldF9zaXplX3JlcXVlc3QoMjA1LCA0OSkKKyAgICAgICAgICAgIHN1YmJveC5zaG93KCkKKyAgICAgICAgICAgIGJveC5hZGQoc3ViYm94KQorICAgICAgICAgICAgc2VsZi5ib3hfZ3JvdXBfYXJlYS5wYWNrX2VuZChib3gsIEZhbHNlLCBGYWxzZSkKKworICAgIGRlZiBzaG93X21hY2hpbmUoc2VsZik6CisgICAgICAgIHNlbGYucHJvZ3Jlc3NfYmFyLnJlc2V0KCkKKyAgICAgICAgc2VsZi5fcGFja19jb21wb25lbnRzKHBhY2tfY29uZmlnX2J1aWxkX2J1dHRvbiA9IEZhbHNlKQorICAgICAgICBzZWxmLnNldF9jb25maWdfbWFjaGluZV9sYXlvdXQoc2hvd19wcm9ncmVzc19iYXIgPSBGYWxzZSkKKyAgICAgICAgc2VsZi5zaG93X2FsbCgpCisKKyAgICBkZWYgdXBkYXRlX3Byb2dyZXNzX2JhcihzZWxmLCB0aXRsZSwgZnJhY3Rpb24sIHN0YXR1cz1Ob25lKToKKyAgICAgICAgaWYgc2VsZi5zdG9wcGluZyA9PSBGYWxzZToKKyAgICAgICAgICAgIHNlbGYucHJvZ3Jlc3NfYmFyLnVwZGF0ZShmcmFjdGlvbikKKyAgICAgICAgICAgIHNlbGYucHJvZ3Jlc3NfYmFyLnNldF90ZXh0KHRpdGxlKQorICAgICAgICAgICAgc2VsZi5wcm9ncmVzc19iYXIuc2V0X3Jjc3R5bGUoc3RhdHVzKQorCisgICAgZGVmIHNob3dfaW5mb19wb3B1bGF0aW5nKHNlbGYpOgorICAgICAgICBzZWxmLl9wYWNrX2NvbXBvbmVudHMocGFja19jb25maWdfYnVpbGRfYnV0dG9uID0gRmFsc2UpCisgICAgICAgIHNlbGYuc2V0X2NvbmZpZ19tYWNoaW5lX2xheW91dChzaG93X3Byb2dyZXNzX2JhciA9IFRydWUpCisgICAgICAgIHNlbGYuc2hvd19hbGwoKQorCisgICAgZGVmIHNob3dfaW5mb19wb3B1bGF0ZWQoc2VsZik6CisgICAgICAgIHNlbGYucHJvZ3Jlc3NfYmFyLnJlc2V0KCkKKyAgICAgICAgc2VsZi5fcGFja19jb21wb25lbnRzKHBhY2tfY29uZmlnX2J1aWxkX2J1dHRvbiA9IEZhbHNlKQorICAgICAgICBzZWxmLnNldF9jb25maWdfbWFjaGluZV9sYXlvdXQoc2hvd19wcm9ncmVzc19iYXIgPSBGYWxzZSkKKyAgICAgICAgc2VsZi5zZXRfY29uZmlnX2Jhc2VpbWdfbGF5b3V0KCkKKyAgICAgICAgc2VsZi5zaG93X2FsbCgpCisKKyAgICBkZWYgc2hvd19iYXNlaW1nX3NlbGVjdGVkKHNlbGYpOgorICAgICAgICBzZWxmLnByb2dyZXNzX2Jhci5yZXNldCgpCisgICAgICAgIHNlbGYuX3BhY2tfY29tcG9uZW50cyhwYWNrX2NvbmZpZ19idWlsZF9idXR0b24gPSBUcnVlKQorICAgICAgICBzZWxmLnNldF9jb25maWdfbWFjaGluZV9sYXlvdXQoc2hvd19wcm9ncmVzc19iYXIgPSBGYWxzZSkKKyAgICAgICAgc2VsZi5zZXRfY29uZmlnX2Jhc2VpbWdfbGF5b3V0KCkKKyAgICAgICAgc2VsZi5zaG93X2FsbCgpCisgICAgICAgIGlmIHNlbGYuYnVpbGRlci5yZWNpcGVfbW9kZWwuZ2V0X3NlbGVjdGVkX2ltYWdlKCkgPT0gc2VsZi5idWlsZGVyLnJlY2lwZV9tb2RlbC5fX2N1c3RvbV9pbWFnZV9fOgorICAgICAgICAgICAgc2VsZi5qdXN0X2Jha2VfYnV0dG9uLmhpZGUoKQorCisgICAgZGVmIGFkZF93YXJuaW5nc19iYXIoc2VsZik6CisgICAgICAgICNjcmVhdGUgdGhlIHdhcm5pbmdzIGJhciBzaG93biB3aGVuIHJlY2lwZXMgcGFyc2luZyBnZW5lcmF0ZXMgd2FybmluZ3MKKyAgICAgICAgY29sb3IgPSBIb2JDb2xvcnMuS0hBS0kKKyAgICAgICAgd2FybmluZ3NfYmFyID0gZ3RrLkV2ZW50Qm94KCkKKyAgICAgICAgd2FybmluZ3NfYmFyLm1vZGlmeV9iZyhndGsuU1RBVEVfTk9STUFMLCBndGsuZ2RrLmNvbG9yX3BhcnNlKGNvbG9yKSkKKyAgICAgICAgd2FybmluZ3NfYmFyLnNldF9mbGFncyhndGsuQ0FOX0RFRkFVTFQpCisgICAgICAgIHdhcm5pbmdzX2Jhci5ncmFiX2RlZmF1bHQoKQorCisgICAgICAgIGJ1aWxkX3N0b3BfdGFiID0gZ3RrLlRhYmxlKDEwLCAyMCwgVHJ1ZSkKKyAgICAgICAgd2FybmluZ3NfYmFyLmFkZChidWlsZF9zdG9wX3RhYikKKworICAgICAgICBpY29uID0gZ3RrLkltYWdlKCkKKyAgICAgICAgaWNvbl9waXhfYnVmZmVyID0gZ3RrLmdkay5waXhidWZfbmV3X2Zyb21fZmlsZShoaWMuSUNPTl9JTkRJX0FMRVJUX0ZJTEUpCisgICAgICAgIGljb24uc2V0X2Zyb21fcGl4YnVmKGljb25fcGl4X2J1ZmZlcikKKyAgICAgICAgYnVpbGRfc3RvcF90YWIuYXR0YWNoKGljb24sIDAsIDIsIDAsIDEwKQorCisgICAgICAgIGxhYmVsID0gZ3RrLkxhYmVsKCkKKyAgICAgICAgbGFiZWwuc2V0X2FsaWdubWVudCgwLjAsIDAuNSkKKyAgICAgICAgd2FybmluZ3NfbmIgPSBsZW4oc2VsZi5idWlsZGVyLnBhcnNpbmdfd2FybmluZ3MpCisgICAgICAgIGlmIHdhcm5pbmdzX25iID09IDE6CisgICAgICAgICAgICBsYWJlbC5zZXRfbWFya3VwKCI8c3BhbiBzaXplPSd4LWxhcmdlJz48Yj4xIHJlY2lwZSBwYXJzaW5nIHdhcm5pbmc8L2I+PC9zcGFuPiIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsYWJlbC5zZXRfbWFya3VwKCI8c3BhbiBzaXplPSd4LWxhcmdlJz48Yj4lcyByZWNpcGUgcGFyc2luZyB3YXJuaW5nczwvYj48L3NwYW4+IiAlIHdhcm5pbmdzX25iKQorICAgICAgICBidWlsZF9zdG9wX3RhYi5hdHRhY2gobGFiZWwsIDIsIDEyLCAwLCAxMCkKKworICAgICAgICB2aWV3X3dhcm5pbmdzX2J1dHRvbiA9IEhvYkJ1dHRvbigiVmlldyB3YXJuaW5ncyIpCisgICAgICAgIHZpZXdfd2FybmluZ3NfYnV0dG9uLmNvbm5lY3QoJ2NsaWNrZWQnLCBzZWxmLnZpZXdfd2FybmluZ3NfYnV0dG9uX2NsaWNrZWRfY2IpCisgICAgICAgIGJ1aWxkX3N0b3BfdGFiLmF0dGFjaCh2aWV3X3dhcm5pbmdzX2J1dHRvbiwgMTUsIDE5LCAxLCA5KQorCisgICAgICAgIHJldHVybiB3YXJuaW5nc19iYXIKKworICAgIGRlZiBkaXNhYmxlX3dhcm5pbmdzX2JhcihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5idWlsZGVyLnBhcnNpbmdfd2FybmluZ3M6CisgICAgICAgICAgICBpZiBoYXNhdHRyKHNlbGYsICd3YXJuaW5nc19iYXInKToKKyAgICAgICAgICAgICAgICBzZWxmLndhcm5pbmdzX2Jhci5oaWRlX2FsbCgpCisgICAgICAgICAgICBzZWxmLmJ1aWxkZXIucGFyc2luZ193YXJuaW5ncyA9IFtdCisKKyAgICBkZWYgY3JlYXRlX2NvbmZpZ19tYWNoaW5lKHNlbGYpOgorICAgICAgICBzZWxmLm1hY2hpbmVfdGl0bGUgPSBndGsuTGFiZWwoKQorICAgICAgICBzZWxmLm1hY2hpbmVfdGl0bGUuc2V0X2FsaWdubWVudCgwLjAsIDAuNSkKKyAgICAgICAgbWFyayA9ICI8c3BhbiAlcz5TZWxlY3QgYSBtYWNoaW5lPC9zcGFuPiIgJSBzZWxmLnNwYW5fdGFnKCd4LWxhcmdlJywgJ2JvbGQnKQorICAgICAgICBzZWxmLm1hY2hpbmVfdGl0bGUuc2V0X21hcmt1cChtYXJrKQorCisgICAgICAgIHNlbGYubWFjaGluZV90aXRsZV9kZXNjID0gZ3RrLkxhYmVsKCkKKyAgICAgICAgc2VsZi5tYWNoaW5lX3RpdGxlX2Rlc2Muc2V0X2FsaWdubWVudCgwLjAsIDAuNSkKKyAgICAgICAgbWFyayA9ICgiPHNwYW4gJXM+WW91ciBzZWxlY3Rpb24gaXMgdGhlIHByb2ZpbGUgb2YgdGhlIHRhcmdldCBtYWNoaW5lIGZvciB3aGljaCB5b3UiCisgICAgICAgICIgYXJlIGJ1aWxkaW5nIHRoZSBpbWFnZS5cbjwvc3Bhbj4iKSAlIChzZWxmLnNwYW5fdGFnKCdtZWRpdW0nKSkKKyAgICAgICAgc2VsZi5tYWNoaW5lX3RpdGxlX2Rlc2Muc2V0X21hcmt1cChtYXJrKQorCisgICAgICAgIHNlbGYubWFjaGluZV9jb21ibyA9IGd0ay5jb21ib19ib3hfbmV3X3RleHQoKQorICAgICAgICBzZWxmLm1hY2hpbmVfY29tYm8uY29ubmVjdCgiY2hhbmdlZCIsIHNlbGYubWFjaGluZV9jb21ib19jaGFuZ2VkX2NiKQorCisgICAgICAgIGljb25fZmlsZSA9IGhpYy5JQ09OX0xBWUVSU19ESVNQTEFZX0ZJTEUKKyAgICAgICAgaG92ZXJfZmlsZSA9IGhpYy5JQ09OX0xBWUVSU19IT1ZFUl9GSUxFCisgICAgICAgIHNlbGYubGF5ZXJfYnV0dG9uID0gSG9iSW1hZ2VCdXR0b24oIkxheWVycyIsICJBZGQgc3VwcG9ydCBmb3IgbWFjaGluZXMsIHNvZnR3YXJlLCBldGMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbl9maWxlLCBob3Zlcl9maWxlKQorICAgICAgICBzZWxmLmxheWVyX2J1dHRvbi5jb25uZWN0KCJjbGlja2VkIiwgc2VsZi5sYXllcl9idXR0b25fY2xpY2tlZF9jYikKKworICAgICAgICBtYXJrdXAgPSAiTGF5ZXJzIGFyZSBhIHBvd2VyZnVsIG1lY2hhbmlzbSB0byBleHRlbmQgdGhlIFlvY3RvIFByb2plY3QgIgorICAgICAgICBtYXJrdXAgKz0gIndpdGggeW91ciBvd24gZnVuY3Rpb25hbGl0eS5cbiIKKyAgICAgICAgbWFya3VwICs9ICJGb3IgbW9yZSBvbiBsYXllcnMsIGNoZWNrIHRoZSA8YSBocmVmPVwiIgorICAgICAgICBtYXJrdXAgKz0gImh0dHA6Ly93d3cueW9jdG9wcm9qZWN0Lm9yZy9kb2NzL2N1cnJlbnQvZGV2LW1hbnVhbC8iCisgICAgICAgIG1hcmt1cCArPSAiZGV2LW1hbnVhbC5odG1sI3VuZGVyc3RhbmRpbmctYW5kLXVzaW5nLWxheWVyc1wiPnJlZmVyZW5jZSBtYW51YWw8L2E+LiIKKyAgICAgICAgc2VsZi5sYXllcl9pbmZvX2ljb24gPSBIb2JJbmZvQnV0dG9uKCI8Yj5MYXllcnM8L2I+IiArICIqIiArIG1hcmt1cCwgc2VsZi5nZXRfcGFyZW50KCkpCisgICAgICAgIHNlbGYucHJvZ3Jlc3NfYmFyID0gSG9iUHJvZ3Jlc3NCYXIoKQorICAgICAgICBzZWxmLnN0b3BfYnV0dG9uID0gSG9iQWx0QnV0dG9uKCJTdG9wIikKKyAgICAgICAgc2VsZi5zdG9wX2J1dHRvbi5jb25uZWN0KCJjbGlja2VkIiwgc2VsZi5zdG9wX2J1dHRvbl9jbGlja2VkX2NiKQorICAgICAgICBzZWxmLm1hY2hpbmVfc2VwYXJhdG9yID0gZ3RrLkhTZXBhcmF0b3IoKQorCisgICAgZGVmIHNldF9jb25maWdfbWFjaGluZV9sYXlvdXQoc2VsZiwgc2hvd19wcm9ncmVzc19iYXIgPSBGYWxzZSk6CisgICAgICAgIHNlbGYuZ3RhYmxlLmF0dGFjaChzZWxmLm1hY2hpbmVfdGl0bGUsIDAsIDQwLCAwLCA0KQorICAgICAgICBzZWxmLmd0YWJsZS5hdHRhY2goc2VsZi5tYWNoaW5lX3RpdGxlX2Rlc2MsIDAsIDQwLCA0LCA2KQorICAgICAgICBzZWxmLmd0YWJsZS5hdHRhY2goc2VsZi5tYWNoaW5lX2NvbWJvLCAwLCAxMiwgNywgMTApCisgICAgICAgIHNlbGYuZ3RhYmxlLmF0dGFjaChzZWxmLmxheWVyX2J1dHRvbiwgMTQsIDM2LCA3LCAxMikKKyAgICAgICAgc2VsZi5ndGFibGUuYXR0YWNoKHNlbGYubGF5ZXJfaW5mb19pY29uLCAzNiwgNDAsIDcsIDExKQorICAgICAgICBpZiBzaG93X3Byb2dyZXNzX2JhcjoKKyAgICAgICAgICAgICNzZWxmLmd0YWJsZS5hdHRhY2goc2VsZi5wcm9ncmVzc19ib3gsIDAsIDQwLCAxNSwgMTgpCisgICAgICAgICAgICBzZWxmLmd0YWJsZS5hdHRhY2goc2VsZi5wcm9ncmVzc19iYXIsIDAsIDM3LCAxNSwgMTgpCisgICAgICAgICAgICBzZWxmLmd0YWJsZS5hdHRhY2goc2VsZi5zdG9wX2J1dHRvbiwgMzcsIDQwLCAxNSwgMTgsIDAsIDApCisgICAgICAgIGlmIHNlbGYuYnVpbGRlci5wYXJzaW5nX3dhcm5pbmdzOgorICAgICAgICAgICAgc2VsZi53YXJuaW5nc19iYXIgPSBzZWxmLmFkZF93YXJuaW5nc19iYXIoKQorICAgICAgICAgICAgc2VsZi5ndGFibGUuYXR0YWNoKHNlbGYud2FybmluZ3NfYmFyLCAwLCA0MCwgMTQsIDE4KQorICAgICAgICAgICAgc2VsZi53YXJuaW5nX3NoaWZ0ID0gNAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi53YXJuaW5nX3NoaWZ0ID0gMAorICAgICAgICBzZWxmLmd0YWJsZS5hdHRhY2goc2VsZi5tYWNoaW5lX3NlcGFyYXRvciwgMCwgNDAsIDEzLCAxNCkKKworICAgIGRlZiBjcmVhdGVfY29uZmlnX2Jhc2VpbWcoc2VsZik6CisgICAgICAgIHNlbGYuaW1hZ2VfdGl0bGUgPSBndGsuTGFiZWwoKQorICAgICAgICBzZWxmLmltYWdlX3RpdGxlLnNldF9hbGlnbm1lbnQoMCwgMS4wKQorICAgICAgICBtYXJrID0gIjxzcGFuICVzPlNlbGVjdCBhbiBpbWFnZSByZWNpcGU8L3NwYW4+IiAlIHNlbGYuc3Bhbl90YWcoJ3gtbGFyZ2UnLCAnYm9sZCcpCisgICAgICAgIHNlbGYuaW1hZ2VfdGl0bGUuc2V0X21hcmt1cChtYXJrKQorCisgICAgICAgIHNlbGYuaW1hZ2VfdGl0bGVfZGVzYyA9IGd0ay5MYWJlbCgpCisgICAgICAgIHNlbGYuaW1hZ2VfdGl0bGVfZGVzYy5zZXRfYWxpZ25tZW50KDAsIDAuNSkKKworICAgICAgICBtYXJrID0gKCI8c3BhbiAlcz5JbWFnZSByZWNpcGVzIGFyZSBhIHN0YXJ0aW5nIHBvaW50IGZvciB0aGUgdHlwZSBvZiBpbWFnZSB5b3Ugd2FudC4gIgorICAgICAgICAgICAgICAgICJZb3UgY2FuIGJ1aWxkIHRoZW0gYXMgXG4iCisgICAgICAgICAgICAgICAgInRoZXkgYXJlIG9yIGVkaXQgdGhlbSB0byBzdWl0IHlvdXIgbmVlZHMuXG48L3NwYW4+IikgJSBzZWxmLnNwYW5fdGFnKCdtZWRpdW0nKQorICAgICAgICBzZWxmLmltYWdlX3RpdGxlX2Rlc2Muc2V0X21hcmt1cChtYXJrKQorCisgICAgICAgIHNlbGYuaW1hZ2VfY29tYm8gPSBndGsuY29tYm9fYm94X25ld190ZXh0KCkKKyAgICAgICAgc2VsZi5pbWFnZV9jb21iby5zZXRfcm93X3NlcGFyYXRvcl9mdW5jKHNlbGYuY29tYm9fc2VwYXJhdG9yX2Z1bmMsIE5vbmUpCisgICAgICAgIHNlbGYuaW1hZ2VfY29tYm9faWQgPSBzZWxmLmltYWdlX2NvbWJvLmNvbm5lY3QoImNoYW5nZWQiLCBzZWxmLmltYWdlX2NvbWJvX2NoYW5nZWRfY2IpCisKKyAgICAgICAgc2VsZi5pbWFnZV9kZXNjID0gZ3RrLkxhYmVsKCkKKyAgICAgICAgc2VsZi5pbWFnZV9kZXNjLnNldF9hbGlnbm1lbnQoMC4wLCAwLjUpCisgICAgICAgIHNlbGYuaW1hZ2VfZGVzYy5zZXRfc2l6ZV9yZXF1ZXN0KDI1NiwgLTEpCisgICAgICAgIHNlbGYuaW1hZ2VfZGVzYy5zZXRfanVzdGlmeShndGsuSlVTVElGWV9MRUZUKQorICAgICAgICBzZWxmLmltYWdlX2Rlc2Muc2V0X2xpbmVfd3JhcChUcnVlKQorCisgICAgICAgICMgYnV0dG9uIHRvIHZpZXcgcmVjaXBlcworICAgICAgICBpY29uX2ZpbGUgPSBoaWMuSUNPTl9SQ0lQRV9ESVNQTEFZX0ZJTEUKKyAgICAgICAgaG92ZXJfZmlsZSA9IGhpYy5JQ09OX1JDSVBFX0hPVkVSX0ZJTEUKKyAgICAgICAgc2VsZi52aWV3X2Fkdl9jb25maWd1cmF0aW9uX2J1dHRvbiA9IEhvYkltYWdlQnV0dG9uKCJBZHZhbmNlZCBjb25maWd1cmF0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlbGVjdCBpbWFnZSB0eXBlcywgcGFja2FnZSBmb3JtYXRzLCBldGMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uX2ZpbGUsIGhvdmVyX2ZpbGUpICAgICAgICAKKyAgICAgICAgc2VsZi52aWV3X2Fkdl9jb25maWd1cmF0aW9uX2J1dHRvbi5jb25uZWN0KCJjbGlja2VkIiwgc2VsZi52aWV3X2Fkdl9jb25maWd1cmF0aW9uX2J1dHRvbl9jbGlja2VkX2NiKQorCisgICAgICAgIHNlbGYuaW1hZ2Vfc2VwYXJhdG9yID0gZ3RrLkhTZXBhcmF0b3IoKQorCisgICAgZGVmIGNvbWJvX3NlcGFyYXRvcl9mdW5jKHNlbGYsIG1vZGVsLCBpdGVyLCB1c2VyX2RhdGEpOgorICAgICAgICBuYW1lID0gbW9kZWwuZ2V0X3ZhbHVlKGl0ZXIsIDApCisgICAgICAgIGlmIG5hbWUgPT0gIi0tU2VwYXJhdG9yLS0iOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBzZXRfY29uZmlnX2Jhc2VpbWdfbGF5b3V0KHNlbGYpOgorICAgICAgICBzZWxmLmd0YWJsZS5hdHRhY2goc2VsZi5pbWFnZV90aXRsZSwgMCwgNDAsIDE1K3NlbGYud2FybmluZ19zaGlmdCwgMTcrc2VsZi53YXJuaW5nX3NoaWZ0KQorICAgICAgICBzZWxmLmd0YWJsZS5hdHRhY2goc2VsZi5pbWFnZV90aXRsZV9kZXNjLCAwLCA0MCwgMTgrc2VsZi53YXJuaW5nX3NoaWZ0LCAyMitzZWxmLndhcm5pbmdfc2hpZnQpCisgICAgICAgIHNlbGYuZ3RhYmxlLmF0dGFjaChzZWxmLmltYWdlX2NvbWJvLCAwLCAxMiwgMjMrc2VsZi53YXJuaW5nX3NoaWZ0LCAyNitzZWxmLndhcm5pbmdfc2hpZnQpCisgICAgICAgIHNlbGYuZ3RhYmxlLmF0dGFjaChzZWxmLmltYWdlX2Rlc2MsIDAsIDEyLCAyNytzZWxmLndhcm5pbmdfc2hpZnQsIDMzK3NlbGYud2FybmluZ19zaGlmdCkKKyAgICAgICAgc2VsZi5ndGFibGUuYXR0YWNoKHNlbGYudmlld19hZHZfY29uZmlndXJhdGlvbl9idXR0b24sIDE0LCAzNiwgMjMrc2VsZi53YXJuaW5nX3NoaWZ0LCAyOCtzZWxmLndhcm5pbmdfc2hpZnQpCisgICAgICAgIHNlbGYuZ3RhYmxlLmF0dGFjaChzZWxmLmltYWdlX3NlcGFyYXRvciwgMCwgNDAsIDM1K3NlbGYud2FybmluZ19zaGlmdCwgMzYrc2VsZi53YXJuaW5nX3NoaWZ0KQorCisgICAgZGVmIGNyZWF0ZV9jb25maWdfYnVpbGRfYnV0dG9uKHNlbGYpOgorICAgICAgICAjIENyZWF0ZSB0aGUgIkJ1aWxkIHBhY2thZ2VzIiBhbmQgIkJ1aWxkIGltYWdlIiBidXR0b25zIGF0IHRoZSBib3R0b20KKyAgICAgICAgYnV0dG9uX2JveCA9IGd0ay5IQm94KEZhbHNlLCA2KQorCisgICAgICAgICMgY3JlYXRlIGJ1dHRvbiAiQnVpbGQgaW1hZ2UiCisgICAgICAgIHNlbGYuanVzdF9iYWtlX2J1dHRvbiA9IEhvYkJ1dHRvbigiQnVpbGQgaW1hZ2UiKQorICAgICAgICBzZWxmLmp1c3RfYmFrZV9idXR0b24uc2V0X3Rvb2x0aXBfdGV4dCgiQnVpbGQgdGhlIGltYWdlIHJlY2lwZSBhcyBpdCBpcyIpCisgICAgICAgIHNlbGYuanVzdF9iYWtlX2J1dHRvbi5jb25uZWN0KCJjbGlja2VkIiwgc2VsZi5qdXN0X2Jha2VfYnV0dG9uX2NsaWNrZWRfY2IpCisgICAgICAgIGJ1dHRvbl9ib3gucGFja19lbmQoc2VsZi5qdXN0X2Jha2VfYnV0dG9uLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgIyBjcmVhdGUgYnV0dG9uICJFZGl0IGltYWdlIHJlY2lwZSIKKyAgICAgICAgc2VsZi5lZGl0X2ltYWdlX2J1dHRvbiA9IEhvYkFsdEJ1dHRvbigiRWRpdCBpbWFnZSByZWNpcGUiKQorICAgICAgICBzZWxmLmVkaXRfaW1hZ2VfYnV0dG9uLnNldF90b29sdGlwX3RleHQoIkN1c3RvbWl6ZSB0aGUgcmVjaXBlcyBhbmQgcGFja2FnZXMgdG8gYmUgaW5jbHVkZWQgaW4geW91ciBpbWFnZSIpCisgICAgICAgIHNlbGYuZWRpdF9pbWFnZV9idXR0b24uY29ubmVjdCgiY2xpY2tlZCIsIHNlbGYuZWRpdF9pbWFnZV9idXR0b25fY2xpY2tlZF9jYikKKyAgICAgICAgYnV0dG9uX2JveC5wYWNrX2VuZChzZWxmLmVkaXRfaW1hZ2VfYnV0dG9uLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgcmV0dXJuIGJ1dHRvbl9ib3gKKworICAgIGRlZiBzdG9wX2J1dHRvbl9jbGlja2VkX2NiKHNlbGYsIGJ1dHRvbik6CisgICAgICAgIHNlbGYuc3RvcHBpbmcgPSBUcnVlCisgICAgICAgIHNlbGYucHJvZ3Jlc3NfYmFyLnNldF90ZXh0KCJTdG9wcGluZyByZWNpcGUgcGFyc2luZyIpCisgICAgICAgIHNlbGYucHJvZ3Jlc3NfYmFyLnNldF9yY3N0eWxlKCJzdG9wIikKKyAgICAgICAgc2VsZi5idWlsZGVyLmNhbmNlbF9wYXJzZV9zeW5jKCkKKworICAgIGRlZiB2aWV3X3dhcm5pbmdzX2J1dHRvbl9jbGlja2VkX2NiKHNlbGYsIGJ1dHRvbik6CisgICAgICAgIHNlbGYuYnVpbGRlci5zaG93X3dhcm5pbmdfZGlhbG9nKCkKKworICAgIGRlZiBtYWNoaW5lX2NvbWJvX2NoYW5nZWRfaWRsZV9jYihzZWxmKToKKyAgICAgICAgc2VsZi5idWlsZGVyLndpbmRvdy5zZXRfY3Vyc29yKE5vbmUpCisKKyAgICBkZWYgbWFjaGluZV9jb21ib19jaGFuZ2VkX2NiKHNlbGYsIG1hY2hpbmVfY29tYm8pOgorICAgICAgICBzZWxmLnN0b3BwaW5nID0gRmFsc2UKKyAgICAgICAgc2VsZi5idWlsZGVyLnBhcnNpbmdfd2FybmluZ3MgPSBbXQorICAgICAgICBjb21ib19pdGVtID0gbWFjaGluZV9jb21iby5nZXRfYWN0aXZlX3RleHQoKQorICAgICAgICBpZiBub3QgY29tYm9faXRlbSBvciBjb21ib19pdGVtID09IHNlbGYuX19kdW1teV9tYWNoaW5lX186CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLmJ1aWxkZXIud2luZG93LnNldF9jdXJzb3IoZ3RrLmdkay5DdXJzb3IoZ3RrLmdkay5XQVRDSCkpCisgICAgICAgIHNlbGYuYnVpbGRlci53YWl0KDAuMSkgI3dhaXQgZm9yIGNvbWJvIGFuZCBjdXJzb3IgdG8gdXBkYXRlCisKKyAgICAgICAgIyByZW1vdmUgX19kdW1teV9tYWNoaW5lX18gaXRlbSBmcm9tIHRoZSBzdG9yZSBsaXN0IGFmdGVyIGZpcnN0IHVzZXIgc2VsZWN0aW9uCisgICAgICAgICMgYmVjYXVzZSBpdCBpcyBubyBsb25nZXIgdmFsaWQKKyAgICAgICAgY29tYm9fc3RvcmUgPSBtYWNoaW5lX2NvbWJvLmdldF9tb2RlbCgpCisgICAgICAgIGlmIGxlbihjb21ib19zdG9yZSkgYW5kIChjb21ib19zdG9yZVswXVswXSA9PSBzZWxmLl9fZHVtbXlfbWFjaGluZV9fKToKKyAgICAgICAgICAgIG1hY2hpbmVfY29tYm8ucmVtb3ZlX3RleHQoMCkKKworICAgICAgICBzZWxmLmJ1aWxkZXIuY29uZmlndXJhdGlvbi5jdXJyX21hY2ggPSBjb21ib19pdGVtCisgICAgICAgIGlmIHNlbGYubWFjaGluZV9jb21ib19jaGFuZ2VkX2J5X21hbnVhbDoKKyAgICAgICAgICAgIHNlbGYuYnVpbGRlci5jb25maWd1cmF0aW9uLmNsZWFyX3NlbGVjdGlvbigpCisgICAgICAgICMgcmVzZXQgbWFjaGluZV9jb21ib19jaGFuZ2VkX2J5X21hbnVhbAorICAgICAgICBzZWxmLm1hY2hpbmVfY29tYm9fY2hhbmdlZF9ieV9tYW51YWwgPSBUcnVlCisKKyAgICAgICAgc2VsZi5idWlsZGVyLmNvbmZpZ3VyYXRpb24uc2VsZWN0ZWRfaW1hZ2UgPSBOb25lCisKKyAgICAgICAgIyBEbyByZXBhcnNlIHJlY2lwZXMKKyAgICAgICAgc2VsZi5idWlsZGVyLnBvcHVsYXRlX3JlY2lwZV9wYWNrYWdlX2luZm9fYXN5bmMoKQorCisgICAgICAgIGdsaWIuaWRsZV9hZGQoc2VsZi5tYWNoaW5lX2NvbWJvX2NoYW5nZWRfaWRsZV9jYikKKworICAgIGRlZiB1cGRhdGVfbWFjaGluZV9jb21ibyhzZWxmKToKKyAgICAgICAgc2VsZi5kaXNhYmxlX3dhcm5pbmdzX2JhcigpCisgICAgICAgIGFsbF9tYWNoaW5lcyA9IFtzZWxmLl9fZHVtbXlfbWFjaGluZV9fXSArIHNlbGYuYnVpbGRlci5wYXJhbWV0ZXJzLmFsbF9tYWNoaW5lcworCisgICAgICAgIG1vZGVsID0gc2VsZi5tYWNoaW5lX2NvbWJvLmdldF9tb2RlbCgpCisgICAgICAgIG1vZGVsLmNsZWFyKCkKKyAgICAgICAgZm9yIG1hY2hpbmUgaW4gYWxsX21hY2hpbmVzOgorICAgICAgICAgICAgc2VsZi5tYWNoaW5lX2NvbWJvLmFwcGVuZF90ZXh0KG1hY2hpbmUpCisgICAgICAgIHNlbGYubWFjaGluZV9jb21iby5zZXRfYWN0aXZlKDApCisKKyAgICBkZWYgc3dpdGNoX21hY2hpbmVfY29tYm8oc2VsZik6CisgICAgICAgIHNlbGYuZGlzYWJsZV93YXJuaW5nc19iYXIoKQorICAgICAgICBzZWxmLm1hY2hpbmVfY29tYm9fY2hhbmdlZF9ieV9tYW51YWwgPSBGYWxzZQorICAgICAgICBtb2RlbCA9IHNlbGYubWFjaGluZV9jb21iby5nZXRfbW9kZWwoKQorICAgICAgICBhY3RpdmUgPSAwCisgICAgICAgIHdoaWxlIGFjdGl2ZSA8IGxlbihtb2RlbCk6CisgICAgICAgICAgICBpZiBtb2RlbFthY3RpdmVdWzBdID09IHNlbGYuYnVpbGRlci5jb25maWd1cmF0aW9uLmN1cnJfbWFjaDoKKyAgICAgICAgICAgICAgICBzZWxmLm1hY2hpbmVfY29tYm8uc2V0X2FjdGl2ZShhY3RpdmUpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBhY3RpdmUgKz0gMQorCisgICAgICAgIGlmIG1vZGVsWzBdWzBdICE9IHNlbGYuX19kdW1teV9tYWNoaW5lX186CisgICAgICAgICAgICBzZWxmLm1hY2hpbmVfY29tYm8uaW5zZXJ0X3RleHQoMCwgc2VsZi5fX2R1bW15X21hY2hpbmVfXykKKworICAgICAgICBzZWxmLm1hY2hpbmVfY29tYm8uc2V0X2FjdGl2ZSgwKQorCisgICAgZGVmIHVwZGF0ZV9pbWFnZV9kZXNjKHNlbGYpOgorICAgICAgICBkZXNjID0gIiIKKyAgICAgICAgc2VsZWN0ZWRfaW1hZ2UgPSBzZWxmLmltYWdlX2NvbWJvLmdldF9hY3RpdmVfdGV4dCgpCisgICAgICAgIGlmIHNlbGVjdGVkX2ltYWdlIGFuZCBzZWxlY3RlZF9pbWFnZSBpbiBzZWxmLmJ1aWxkZXIucmVjaXBlX21vZGVsLnBuX3BhdGgua2V5cygpOgorICAgICAgICAgICAgaW1hZ2VfcGF0aCA9IHNlbGYuYnVpbGRlci5yZWNpcGVfbW9kZWwucG5fcGF0aFtzZWxlY3RlZF9pbWFnZV0KKyAgICAgICAgICAgIGltYWdlX2l0ZXIgPSBzZWxmLmJ1aWxkZXIucmVjaXBlX21vZGVsLmdldF9pdGVyKGltYWdlX3BhdGgpCisgICAgICAgICAgICBkZXNjID0gc2VsZi5idWlsZGVyLnJlY2lwZV9tb2RlbC5nZXRfdmFsdWUoaW1hZ2VfaXRlciwgc2VsZi5idWlsZGVyLnJlY2lwZV9tb2RlbC5DT0xfREVTQykKKworICAgICAgICBtYXJrID0gKCI8c3BhbiAlcz4lczwvc3Bhbj5cbiIpICUgKHNlbGYuc3Bhbl90YWcoJ3NtYWxsJyksIGRlc2MpCisgICAgICAgIHNlbGYuaW1hZ2VfZGVzYy5zZXRfbWFya3VwKG1hcmspCisKKyAgICBkZWYgaW1hZ2VfY29tYm9fY2hhbmdlZF9pZGxlX2NiKHNlbGYsIHNlbGVjdGVkX2ltYWdlLCBzZWxlY3RlZF9yZWNpcGVzLCBzZWxlY3RlZF9wYWNrYWdlcyk6CisgICAgICAgIHNlbGYuYnVpbGRlci51cGRhdGVfcmVjaXBlX21vZGVsKHNlbGVjdGVkX2ltYWdlLCBzZWxlY3RlZF9yZWNpcGVzKQorICAgICAgICBzZWxmLmJ1aWxkZXIudXBkYXRlX3BhY2thZ2VfbW9kZWwoc2VsZWN0ZWRfcGFja2FnZXMpCisgICAgICAgIHNlbGYuYnVpbGRlci53aW5kb3dfc2Vuc2l0aXZlKFRydWUpCisKKyAgICBkZWYgaW1hZ2VfY29tYm9fY2hhbmdlZF9jYihzZWxmLCBjb21ibyk6CisgICAgICAgIHNlbGYuYnVpbGRlci53aW5kb3dfc2Vuc2l0aXZlKEZhbHNlKQorICAgICAgICBzZWxlY3RlZF9pbWFnZSA9IHNlbGYuaW1hZ2VfY29tYm8uZ2V0X2FjdGl2ZV90ZXh0KCkKKyAgICAgICAgaWYgc2VsZWN0ZWRfaW1hZ2UgPT0gc2VsZi5fX2N1c3RvbV9pbWFnZV9fOgorICAgICAgICAgICAgdG9wZGlyID0gc2VsZi5idWlsZGVyLmdldF90b3BkaXIoKQorICAgICAgICAgICAgaW1hZ2VzX2RpciA9IHRvcGRpciArICIvcmVjaXBlcy9pbWFnZXMvY3VzdG9tLyIKKyAgICAgICAgICAgIHNlbGYuYnVpbGRlci5lbnN1cmVfZGlyKGltYWdlc19kaXIpCisKKyAgICAgICAgICAgIGRpYWxvZyA9IFJldHJpZXZlSW1hZ2VEaWFsb2coaW1hZ2VzX2RpciwgIlNlbGVjdCBmcm9tIG15IGltYWdlIHJlY2lwZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYnVpbGRlciwgZ3RrLkRJQUxPR19NT0RBTCB8IGd0ay5ESUFMT0dfREVTVFJPWV9XSVRIX1BBUkVOVCkKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZGlhbG9nLnJ1bigpCisgICAgICAgICAgICBpZiByZXNwb25zZSA9PSBndGsuUkVTUE9OU0VfT0s6CisgICAgICAgICAgICAgICAgaW1hZ2VfbmFtZSA9IGRpYWxvZy5nZXRfZmlsZW5hbWUoKQorICAgICAgICAgICAgICAgIGhlYWQsIHRhaWwgPSBvcy5wYXRoLnNwbGl0KGltYWdlX25hbWUpCisgICAgICAgICAgICAgICAgc2VsZWN0ZWRfaW1hZ2UgPSBvcy5wYXRoLnNwbGl0ZXh0KHRhaWwpWzBdCisgICAgICAgICAgICAgICAgc2VsZi5jdXN0b21faW1hZ2Vfc2VsZWN0ZWQgPSBzZWxlY3RlZF9pbWFnZQorICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlX2ltYWdlX2NvbWJvKHNlbGYuYnVpbGRlci5yZWNpcGVfbW9kZWwsIHNlbGVjdGVkX2ltYWdlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxlY3RlZF9pbWFnZSA9IHNlbGYuX19kdW1teV9pbWFnZV9fCisgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVfaW1hZ2VfY29tYm8oc2VsZi5idWlsZGVyLnJlY2lwZV9tb2RlbCwgTm9uZSkKKyAgICAgICAgICAgIGRpYWxvZy5kZXN0cm95KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHNlbGYuY3VzdG9tX2ltYWdlX3NlbGVjdGVkOgorICAgICAgICAgICAgICAgIHNlbGYuY3VzdG9tX2ltYWdlX3NlbGVjdGVkID0gTm9uZQorICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlX2ltYWdlX2NvbWJvKHNlbGYuYnVpbGRlci5yZWNpcGVfbW9kZWwsIHNlbGVjdGVkX2ltYWdlKQorCisgICAgICAgIGlmIG5vdCBzZWxlY3RlZF9pbWFnZSBvciAoc2VsZWN0ZWRfaW1hZ2UgPT0gc2VsZi5fX2R1bW15X2ltYWdlX18pOgorICAgICAgICAgICAgc2VsZi5idWlsZGVyLndpbmRvd19zZW5zaXRpdmUoVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuanVzdF9iYWtlX2J1dHRvbi5oaWRlKCkKKyAgICAgICAgICAgIHNlbGYuZWRpdF9pbWFnZV9idXR0b24uaGlkZSgpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIHJlbW92ZSBfX2R1bW15X2ltYWdlX18gaXRlbSBmcm9tIHRoZSBzdG9yZSBsaXN0IGFmdGVyIGZpcnN0IHVzZXIgc2VsZWN0aW9uCisgICAgICAgICMgYmVjYXVzZSBpdCBpcyBubyBsb25nZXIgdmFsaWQKKyAgICAgICAgY29tYm9fc3RvcmUgPSBjb21iby5nZXRfbW9kZWwoKQorICAgICAgICBpZiBsZW4oY29tYm9fc3RvcmUpIGFuZCAoY29tYm9fc3RvcmVbMF1bMF0gPT0gc2VsZi5fX2R1bW15X2ltYWdlX18pOgorICAgICAgICAgICAgY29tYm8ucmVtb3ZlX3RleHQoMCkKKworICAgICAgICBzZWxmLmJ1aWxkZXIuY3VzdG9taXplZCA9IEZhbHNlCisKKyAgICAgICAgc2VsZWN0ZWRfcmVjaXBlcyA9IFtdCisKKyAgICAgICAgaW1hZ2VfcGF0aCA9IHNlbGYuYnVpbGRlci5yZWNpcGVfbW9kZWwucG5fcGF0aFtzZWxlY3RlZF9pbWFnZV0KKyAgICAgICAgaW1hZ2VfaXRlciA9IHNlbGYuYnVpbGRlci5yZWNpcGVfbW9kZWwuZ2V0X2l0ZXIoaW1hZ2VfcGF0aCkKKyAgICAgICAgc2VsZWN0ZWRfcGFja2FnZXMgPSBzZWxmLmJ1aWxkZXIucmVjaXBlX21vZGVsLmdldF92YWx1ZShpbWFnZV9pdGVyLCBzZWxmLmJ1aWxkZXIucmVjaXBlX21vZGVsLkNPTF9JTlNUQUxMKS5zcGxpdCgpCisgICAgICAgIHNlbGYudXBkYXRlX2ltYWdlX2Rlc2MoKQorCisgICAgICAgIHNlbGYuYnVpbGRlci5yZWNpcGVfbW9kZWwucmVzZXQoKQorICAgICAgICBzZWxmLmJ1aWxkZXIucGFja2FnZV9tb2RlbC5yZXNldCgpCisKKyAgICAgICAgc2VsZi5zaG93X2Jhc2VpbWdfc2VsZWN0ZWQoKQorCisgICAgICAgIGlmIHNlbGVjdGVkX2ltYWdlID09IHNlbGYuYnVpbGRlci5yZWNpcGVfbW9kZWwuX19jdXN0b21faW1hZ2VfXzoKKyAgICAgICAgICAgIHNlbGYuanVzdF9iYWtlX2J1dHRvbi5oaWRlKCkKKworICAgICAgICBnbGliLmlkbGVfYWRkKHNlbGYuaW1hZ2VfY29tYm9fY2hhbmdlZF9pZGxlX2NiLCBzZWxlY3RlZF9pbWFnZSwgc2VsZWN0ZWRfcmVjaXBlcywgc2VsZWN0ZWRfcGFja2FnZXMpCisKKyAgICBkZWYgX2ltYWdlX2NvbWJvX2Nvbm5lY3Rfc2lnbmFsKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5pbWFnZV9jb21ib19pZDoKKyAgICAgICAgICAgIHNlbGYuaW1hZ2VfY29tYm9faWQgPSBzZWxmLmltYWdlX2NvbWJvLmNvbm5lY3QoImNoYW5nZWQiLCBzZWxmLmltYWdlX2NvbWJvX2NoYW5nZWRfY2IpCisKKyAgICBkZWYgX2ltYWdlX2NvbWJvX2Rpc2Nvbm5lY3Rfc2lnbmFsKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmltYWdlX2NvbWJvX2lkOgorICAgICAgICAgICAgc2VsZi5pbWFnZV9jb21iby5kaXNjb25uZWN0KHNlbGYuaW1hZ2VfY29tYm9faWQpCisgICAgICAgICAgICBzZWxmLmltYWdlX2NvbWJvX2lkID0gTm9uZQorCisgICAgZGVmIHVwZGF0ZV9pbWFnZV9jb21ibyhzZWxmLCByZWNpcGVfbW9kZWwsIHNlbGVjdGVkX2ltYWdlKToKKyAgICAgICAgIyBVcGRhdGUgdGhlIGltYWdlIGNvbWJvIGFjY29yZGluZyB0byB0aGUgaW1hZ2VzIGluIHRoZSByZWNpcGVfbW9kZWwKKyAgICAgICAgIyBwb3B1bGF0ZSBpbWFnZSBjb21ibworICAgICAgICBmaWx0ZXIgPSB7UmVjaXBlTGlzdE1vZGVsLkNPTF9UWVBFIDogWydpbWFnZSddfQorICAgICAgICBpbWFnZV9tb2RlbCA9IHJlY2lwZV9tb2RlbC50cmVlX21vZGVsKGZpbHRlcikKKyAgICAgICAgaW1hZ2VfbW9kZWwuc2V0X3NvcnRfY29sdW1uX2lkKHJlY2lwZV9tb2RlbC5DT0xfTkFNRSwgZ3RrLlNPUlRfQVNDRU5ESU5HKQorICAgICAgICBhY3RpdmUgPSAwCisgICAgICAgIGNudCA9IDAKKworICAgICAgICB3aGl0ZV9wYXR0ZXJuID0gW10KKyAgICAgICAgaWYgc2VsZi5idWlsZGVyLnBhcmFtZXRlcnMuaW1hZ2Vfd2hpdGVfcGF0dGVybjoKKyAgICAgICAgICAgIGZvciBpIGluIHNlbGYuYnVpbGRlci5wYXJhbWV0ZXJzLmltYWdlX3doaXRlX3BhdHRlcm4uc3BsaXQoKToKKyAgICAgICAgICAgICAgICB3aGl0ZV9wYXR0ZXJuLmFwcGVuZChyZS5jb21waWxlKGkpKQorCisgICAgICAgIGJsYWNrX3BhdHRlcm4gPSBbXQorICAgICAgICBpZiBzZWxmLmJ1aWxkZXIucGFyYW1ldGVycy5pbWFnZV9ibGFja19wYXR0ZXJuOgorICAgICAgICAgICAgZm9yIGkgaW4gc2VsZi5idWlsZGVyLnBhcmFtZXRlcnMuaW1hZ2VfYmxhY2tfcGF0dGVybi5zcGxpdCgpOgorICAgICAgICAgICAgICAgIGJsYWNrX3BhdHRlcm4uYXBwZW5kKHJlLmNvbXBpbGUoaSkpCisgICAgICAgIGJsYWNrX3BhdHRlcm4uYXBwZW5kKHJlLmNvbXBpbGUoImhvYi1pbWFnZSIpKQorICAgICAgICBibGFja19wYXR0ZXJuLmFwcGVuZChyZS5jb21waWxlKCJlZGl0ZWQoLVswLTldKikqLmJiJCIpKQorCisgICAgICAgIGl0ID0gaW1hZ2VfbW9kZWwuZ2V0X2l0ZXJfZmlyc3QoKQorICAgICAgICBzZWxmLl9pbWFnZV9jb21ib19kaXNjb25uZWN0X3NpZ25hbCgpCisgICAgICAgIG1vZGVsID0gc2VsZi5pbWFnZV9jb21iby5nZXRfbW9kZWwoKQorICAgICAgICBtb2RlbC5jbGVhcigpCisgICAgICAgICMgU2V0IGEgaW5kaWNhdG9yIHRleHQgdG8gY29tYm8gc3RvcmUgd2hlbiBmaXJzdCBvcGVuCisgICAgICAgIGlmIG5vdCBzZWxlY3RlZF9pbWFnZToKKyAgICAgICAgICAgIHNlbGYuaW1hZ2VfY29tYm8uYXBwZW5kX3RleHQoc2VsZi5fX2R1bW15X2ltYWdlX18pCisgICAgICAgICAgICBjbnQgPSBjbnQgKyAxCisKKyAgICAgICAgc2VsZi5pbWFnZV9jb21iby5hcHBlbmRfdGV4dChzZWxmLl9fY3VzdG9tX2ltYWdlX18pCisgICAgICAgIHNlbGYuaW1hZ2VfY29tYm8uYXBwZW5kX3RleHQoIi0tU2VwYXJhdG9yLS0iKQorICAgICAgICBjbnQgPSBjbnQgKyAyCisKKyAgICAgICAgdG9wZGlyID0gc2VsZi5idWlsZGVyLmdldF90b3BkaXIoKQorICAgICAgICAjIGFwcGVuZCBhbmQgc2V0IGFjdGl2ZQorICAgICAgICB3aGlsZSBpdDoKKyAgICAgICAgICAgIHBhdGggPSBpbWFnZV9tb2RlbC5nZXRfcGF0aChpdCkKKyAgICAgICAgICAgIGl0ID0gaW1hZ2VfbW9kZWwuaXRlcl9uZXh0KGl0KQorICAgICAgICAgICAgaW1hZ2VfbmFtZSA9IGltYWdlX21vZGVsW3BhdGhdW3JlY2lwZV9tb2RlbC5DT0xfTkFNRV0KKyAgICAgICAgICAgIGlmIGltYWdlX25hbWUgPT0gc2VsZi5idWlsZGVyLnJlY2lwZV9tb2RlbC5fX2N1c3RvbV9pbWFnZV9fOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIGJsYWNrX3BhdHRlcm46CisgICAgICAgICAgICAgICAgYWxsb3cgPSBUcnVlCisgICAgICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gYmxhY2tfcGF0dGVybjoKKyAgICAgICAgICAgICAgICAgICAgaWYgcGF0dGVybi5zZWFyY2goaW1hZ2VfbmFtZSk6CisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvdyA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxpZiB3aGl0ZV9wYXR0ZXJuOgorICAgICAgICAgICAgICAgIGFsbG93ID0gRmFsc2UKKyAgICAgICAgICAgICAgICBmb3IgcGF0dGVybiBpbiB3aGl0ZV9wYXR0ZXJuOgorICAgICAgICAgICAgICAgICAgICBpZiBwYXR0ZXJuLnNlYXJjaChpbWFnZV9uYW1lKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYWxsb3cgPSBUcnVlCisKKyAgICAgICAgICAgIGZpbGVfbmFtZSA9IGltYWdlX21vZGVsW3BhdGhdW3JlY2lwZV9tb2RlbC5DT0xfRklMRV0KKyAgICAgICAgICAgIGlmIGZpbGVfbmFtZSBhbmQgdG9wZGlyIGluIGZpbGVfbmFtZToKKyAgICAgICAgICAgICAgICBhbGxvdyA9IEZhbHNlCisKKyAgICAgICAgICAgIGlmIGFsbG93OgorICAgICAgICAgICAgICAgIHNlbGYuaW1hZ2VfY29tYm8uYXBwZW5kX3RleHQoaW1hZ2VfbmFtZSkKKyAgICAgICAgICAgICAgICBpZiBpbWFnZV9uYW1lID09IHNlbGVjdGVkX2ltYWdlOgorICAgICAgICAgICAgICAgICAgICBhY3RpdmUgPSBjbnQKKyAgICAgICAgICAgICAgICBjbnQgPSBjbnQgKyAxCisgICAgICAgIHNlbGYuaW1hZ2VfY29tYm8uYXBwZW5kX3RleHQoc2VsZi5idWlsZGVyLnJlY2lwZV9tb2RlbC5fX2N1c3RvbV9pbWFnZV9fKQorCisgICAgICAgIGlmIHNlbGVjdGVkX2ltYWdlID09IHNlbGYuYnVpbGRlci5yZWNpcGVfbW9kZWwuX19jdXN0b21faW1hZ2VfXzoKKyAgICAgICAgICAgIGFjdGl2ZSA9IGNudAorCisgICAgICAgIGlmIHNlbGYuY3VzdG9tX2ltYWdlX3NlbGVjdGVkOgorICAgICAgICAgICAgc2VsZi5pbWFnZV9jb21iby5hcHBlbmRfdGV4dCgiLS1TZXBhcmF0b3ItLSIpCisgICAgICAgICAgICBzZWxmLmltYWdlX2NvbWJvLmFwcGVuZF90ZXh0KHNlbGYuY3VzdG9tX2ltYWdlX3NlbGVjdGVkKQorICAgICAgICAgICAgY250ID0gY250ICsgMgorICAgICAgICAgICAgaWYgc2VsZi5jdXN0b21faW1hZ2Vfc2VsZWN0ZWQgPT0gc2VsZWN0ZWRfaW1hZ2U6CisgICAgICAgICAgICAgICAgYWN0aXZlID0gY250CisKKyAgICAgICAgc2VsZi5pbWFnZV9jb21iby5zZXRfYWN0aXZlKGFjdGl2ZSkKKworICAgICAgICBpZiBhY3RpdmUgIT0gMDoKKyAgICAgICAgICAgIHNlbGYuc2hvd19iYXNlaW1nX3NlbGVjdGVkKCkKKworICAgICAgICBzZWxmLl9pbWFnZV9jb21ib19jb25uZWN0X3NpZ25hbCgpCisKKyAgICBkZWYgbGF5ZXJfYnV0dG9uX2NsaWNrZWRfY2Ioc2VsZiwgYnV0dG9uKToKKyAgICAgICAgIyBDcmVhdGUgYSBsYXllciBzZWxlY3Rpb24gZGlhbG9nCisgICAgICAgIHNlbGYuYnVpbGRlci5zaG93X2xheWVyX3NlbGVjdGlvbl9kaWFsb2coKQorCisgICAgZGVmIHZpZXdfYWR2X2NvbmZpZ3VyYXRpb25fYnV0dG9uX2NsaWNrZWRfY2Ioc2VsZiwgYnV0dG9uKToKKyAgICAgICAgIyBDcmVhdGUgYW4gYWR2YW5jZWQgc2V0dGluZ3MgZGlhbG9nCisgICAgICAgIHJlc3BvbnNlLCBzZXR0aW5nc19jaGFuZ2VkID0gc2VsZi5idWlsZGVyLnNob3dfYWR2X3NldHRpbmdzX2RpYWxvZygpCisgICAgICAgIGlmIG5vdCByZXNwb25zZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZXR0aW5nc19jaGFuZ2VkOgorICAgICAgICAgICAgc2VsZi5idWlsZGVyLndpbmRvdy5zZXRfY3Vyc29yKGd0ay5nZGsuQ3Vyc29yKGd0ay5nZGsuV0FUQ0gpKQorICAgICAgICAgICAgc2VsZi5idWlsZGVyLndhaXQoMC4xKSAjd2FpdCBmb3IgYWR2X3NldHRpbmdzX2RpYWxvZyB0byB0ZXJtaW5hdGUKKyAgICAgICAgICAgIHNlbGYuYnVpbGRlci5yZXBhcnNlX3Bvc3RfYWR2X3NldHRpbmdzKCkKKyAgICAgICAgICAgIHNlbGYuYnVpbGRlci53aW5kb3cuc2V0X2N1cnNvcihOb25lKQorCisgICAgZGVmIGp1c3RfYmFrZV9idXR0b25fY2xpY2tlZF9jYihzZWxmLCBidXR0b24pOgorICAgICAgICBzZWxmLmJ1aWxkZXIucGFyc2luZ193YXJuaW5ncyA9IFtdCisgICAgICAgIHNlbGYuYnVpbGRlci5qdXN0X2Jha2UoKQorCisgICAgZGVmIGVkaXRfaW1hZ2VfYnV0dG9uX2NsaWNrZWRfY2Ioc2VsZiwgYnV0dG9uKToKKyAgICAgICAgc2VsZi5idWlsZGVyLnNldF9iYXNlX2ltYWdlKCkKKyAgICAgICAgc2VsZi5idWlsZGVyLnNob3dfcmVjaXBlcygpCisKKyAgICBkZWYgbXlfaW1hZ2VzX2J1dHRvbl9jbGlja2VkX2NiKHNlbGYsIGJ1dHRvbik6CisgICAgICAgIHNlbGYuYnVpbGRlci5zaG93X2xvYWRfbXlfaW1hZ2VzX2RpYWxvZygpCisKKyAgICBkZWYgc2V0dGluZ3NfYnV0dG9uX2NsaWNrZWRfY2Ioc2VsZiwgYnV0dG9uKToKKyAgICAgICAgIyBDcmVhdGUgYW4gYWR2YW5jZWQgc2V0dGluZ3MgZGlhbG9nCisgICAgICAgIHJlc3BvbnNlLCBzZXR0aW5nc19jaGFuZ2VkID0gc2VsZi5idWlsZGVyLnNob3dfc2ltcGxlX3NldHRpbmdzX2RpYWxvZygpCisgICAgICAgIGlmIG5vdCByZXNwb25zZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZXR0aW5nc19jaGFuZ2VkOgorICAgICAgICAgICAgc2VsZi5idWlsZGVyLnJlcGFyc2VfcG9zdF9hZHZfc2V0dGluZ3MoKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2ltYWdlZGV0YWlsc3BhZ2UucHkgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaW1hZ2VkZXRhaWxzcGFnZS5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNTJlOTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2ltYWdlZGV0YWlsc3BhZ2UucHkKQEAgLTAsMCArMSw2NjkgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBCaXRCYWtlIEdyYXBoaWNhbCBHVEsgVXNlciBJbnRlcmZhY2UKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEyICAgICAgICBJbnRlbCBDb3Jwb3JhdGlvbgorIworIyBBdXRob3JlZCBieSBEb25neGlhbyBYdSA8ZG9uZ3hpYW8ueHVAaW50ZWwuY29tPgorIyBBdXRob3JlZCBieSBTaGFuZSBXYW5nIDxzaGFuZS53YW5nQGludGVsLmNvbT4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBnb2JqZWN0CitpbXBvcnQgZ3RrCitmcm9tIGJiLnVpLmNydW1icy5ob2Jjb2xvciBpbXBvcnQgSG9iQ29sb3JzCitmcm9tIGJiLnVpLmNydW1icy5ob2J3aWRnZXQgaW1wb3J0IGhpYywgSG9iVmlld1RhYmxlLCBIb2JBbHRCdXR0b24sIEhvYkJ1dHRvbgorZnJvbSBiYi51aS5jcnVtYnMuaG9icGFnZXMgaW1wb3J0IEhvYlBhZ2UKK2ltcG9ydCBzdWJwcm9jZXNzCitmcm9tIGJiLnVpLmNydW1icy5oaWcuY3J1bWJzZGlhbG9nIGltcG9ydCBDcnVtYnNEaWFsb2cKK2Zyb20gYmIudWkuY3J1bWJzLmhpZy5zYXZlaW1hZ2VkaWFsb2cgaW1wb3J0IFNhdmVJbWFnZURpYWxvZworCisjCisjIEltYWdlRGV0YWlsc1BhZ2UKKyMKK2NsYXNzIEltYWdlRGV0YWlsc1BhZ2UgKEhvYlBhZ2UpOgorCisgICAgY2xhc3MgRGV0YWlsQm94IChndGsuRXZlbnRCb3gpOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgd2lkZ2V0ID0gTm9uZSwgdmFybGlzdCA9IE5vbmUsIHZhbGxpc3QgPSBOb25lLCBpY29uID0gTm9uZSwgYnV0dG9uID0gTm9uZSwgYnV0dG9uMj1Ob25lLCBjb2xvciA9IEhvYkNvbG9ycy5MSUdIVF9HUkFZKToKKyAgICAgICAgICAgIGd0ay5FdmVudEJveC5fX2luaXRfXyhzZWxmKQorCisgICAgICAgICAgICAjIHNldCBjb2xvcgorICAgICAgICAgICAgc3R5bGUgPSBzZWxmLmdldF9zdHlsZSgpLmNvcHkoKQorICAgICAgICAgICAgc3R5bGUuYmdbZ3RrLlNUQVRFX05PUk1BTF0gPSBzZWxmLmdldF9jb2xvcm1hcCgpLmFsbG9jX2NvbG9yKGNvbG9yLCBGYWxzZSwgRmFsc2UpCisgICAgICAgICAgICBzZWxmLnNldF9zdHlsZShzdHlsZSkKKworICAgICAgICAgICAgc2VsZi5yb3cgPSBndGsuVGFibGUoMSwgMiwgRmFsc2UpCisgICAgICAgICAgICBzZWxmLnJvdy5zZXRfYm9yZGVyX3dpZHRoKDEwKQorICAgICAgICAgICAgc2VsZi5hZGQoc2VsZi5yb3cpCisgICAgICAgIAorICAgICAgICAgICAgdG90YWxfcm93cyA9IDAKKyAgICAgICAgICAgIGlmIHdpZGdldDoKKyAgICAgICAgICAgICAgICB0b3RhbF9yb3dzID0gMTAKKyAgICAgICAgICAgIGlmIHZhcmxpc3QgYW5kIHZhbGxpc3Q6CisgICAgICAgICAgICAgICAgIyBwYWNrIHRoZSBpY29uIGFuZCB0aGUgdGV4dCBvbiB0aGUgbGVmdAorICAgICAgICAgICAgICAgIHRvdGFsX3Jvd3MgKz0gbGVuKHZhcmxpc3QpCisgICAgICAgICAgICBzZWxmLnRhYmxlID0gZ3RrLlRhYmxlKHRvdGFsX3Jvd3MsIDIwLCBUcnVlKQorICAgICAgICAgICAgc2VsZi50YWJsZS5zZXRfcm93X3NwYWNpbmdzKDYpCisgICAgICAgICAgICBzZWxmLnRhYmxlLnNldF9zaXplX3JlcXVlc3QoMTAwLCAtMSkKKyAgICAgICAgICAgIHNlbGYucm93LmF0dGFjaChzZWxmLnRhYmxlLCAwLCAxLCAwLCAxLCB4b3B0aW9ucz1ndGsuRklMTHxndGsuRVhQQU5ELCB5b3B0aW9ucz1ndGsuRklMTCkKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY29saWQgPSAwCisgICAgICAgICAgICByb3dpZCA9IDAKKyAgICAgICAgICAgIHNlbGYubGluZV93aWRnZXRzID0ge30KKyAgICAgICAgICAgIGlmIGljb246CisgICAgICAgICAgICAgICAgc2VsZi50YWJsZS5hdHRhY2goaWNvbiwgY29saWQsIGNvbGlkICsgMiwgMCwgMSkKKyAgICAgICAgICAgICAgICBjb2xpZCA9IGNvbGlkICsgMgorICAgICAgICAgICAgaWYgd2lkZ2V0OgorICAgICAgICAgICAgICAgIHNlbGYudGFibGUuYXR0YWNoKHdpZGdldCwgY29saWQsIDIwLCAwLCAxMCkKKyAgICAgICAgICAgICAgICByb3dpZCA9IDEwCisgICAgICAgICAgICBpZiB2YXJsaXN0IGFuZCB2YWxsaXN0OgorICAgICAgICAgICAgICAgIGZvciByb3cgaW4gcmFuZ2Uocm93aWQsIHRvdGFsX3Jvd3MpOgorICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHJvdyAtIHJvd2lkCisgICAgICAgICAgICAgICAgICAgIHNlbGYubGluZV93aWRnZXRzW3Zhcmxpc3RbaW5kZXhdXSA9IHNlbGYudGV4dDJsYWJlbCh2YXJsaXN0W2luZGV4XSwgdmFsbGlzdFtpbmRleF0pCisgICAgICAgICAgICAgICAgICAgIHNlbGYudGFibGUuYXR0YWNoKHNlbGYubGluZV93aWRnZXRzW3Zhcmxpc3RbaW5kZXhdXSwgY29saWQsIDIwLCByb3csIHJvdyArIDEpCisgICAgICAgICAgICAjIHBhY2sgdGhlIGJ1dHRvbiBvbiB0aGUgcmlnaHQKKyAgICAgICAgICAgIGlmIGJ1dHRvbjoKKyAgICAgICAgICAgICAgICBzZWxmLmJib3ggPSBndGsuVkJveCgpCisgICAgICAgICAgICAgICAgc2VsZi5iYm94LnBhY2tfc3RhcnQoYnV0dG9uLCBleHBhbmQ9VHJ1ZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgICAgICAgICBpZiBidXR0b24yOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmJib3gucGFja19zdGFydChidXR0b24yLCBleHBhbmQ9VHJ1ZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgICAgICAgICBzZWxmLmJib3guc2V0X3NpemVfcmVxdWVzdCgxNTAsLTEpCisgICAgICAgICAgICAgICAgc2VsZi5yb3cuYXR0YWNoKHNlbGYuYmJveCwgMSwgMiwgMCwgMSwgeG9wdGlvbnM9Z3RrLkZJTEwsIHlvcHRpb25zPWd0ay5FWFBBTkQpCisgICAgICAgICAgICAgICAgCisgICAgICAgIGRlZiB1cGRhdGVfbGluZV93aWRnZXRzKHNlbGYsIHZhcmlhYmxlLCB2YWx1ZSk6CisgICAgICAgICAgICBpZiBsZW4oc2VsZi5saW5lX3dpZGdldHMpID09IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzZWxmLmxpbmVfd2lkZ2V0c1t2YXJpYWJsZV0sIGd0ay5MYWJlbCk6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBzZWxmLmxpbmVfd2lkZ2V0c1t2YXJpYWJsZV0uc2V0X21hcmt1cChzZWxmLmZvcm1hdF9saW5lKHZhcmlhYmxlLCB2YWx1ZSkpCisKKyAgICAgICAgZGVmIHdyYXBfbGluZShzZWxmLCBpbnB1dHMpOgorICAgICAgICAgICAgIyB3cmFwIHRoZSBsb25nIHRleHQgb2YgaW5wdXRzCisgICAgICAgICAgICB3cmFwX3dpZHRoX2NoYXJzID0gNzUKKyAgICAgICAgICAgIG91dHB1dHMgPSAiIgorICAgICAgICAgICAgdG1wcyA9IGlucHV0cworICAgICAgICAgICAgbGVzc19jaGFycyA9IGxlbihpbnB1dHMpCisgICAgICAgICAgICB3aGlsZSAobGVzc19jaGFycyAtIHdyYXBfd2lkdGhfY2hhcnMpID4gMDoKKyAgICAgICAgICAgICAgICBsZXNzX2NoYXJzIC09IHdyYXBfd2lkdGhfY2hhcnMKKyAgICAgICAgICAgICAgICBvdXRwdXRzICs9IHRtcHNbOndyYXBfd2lkdGhfY2hhcnNdICsgIlxuICAgICAgICAgICAgICAgIgorICAgICAgICAgICAgICAgIHRtcHMgPSBpbnB1dHNbbGVzc19jaGFyczpdCisgICAgICAgICAgICBvdXRwdXRzICs9IHRtcHMKKyAgICAgICAgICAgIHJldHVybiBvdXRwdXRzCisKKyAgICAgICAgZGVmIGZvcm1hdF9saW5lKHNlbGYsIHZhcmlhYmxlLCB2YWx1ZSk6CisgICAgICAgICAgICB3cmFwZWRfdmFsdWUgPSBzZWxmLndyYXBfbGluZSh2YWx1ZSkKKyAgICAgICAgICAgIG1hcmt1cCA9ICI8c3BhbiB3ZWlnaHQ9XCdib2xkXCc+JXM8L3NwYW4+IiAlIHZhcmlhYmxlCisgICAgICAgICAgICBtYXJrdXAgKz0gIjxzcGFuIHdlaWdodD1cJ25vcm1hbFwnIGZvcmVncm91bmQ9XCcjMWMxYzFjXCcgZm9udF9kZXNjPVwnMTRweFwnPiVzPC9zcGFuPiIgJSB3cmFwZWRfdmFsdWUKKyAgICAgICAgICAgIHJldHVybiBtYXJrdXAKKworICAgICAgICBkZWYgdGV4dDJsYWJlbChzZWxmLCB2YXJpYWJsZSwgdmFsdWUpOgorICAgICAgICAgICAgIyBhcHBlbmQgdGhlIG5hbWU6dmFsdWUgdG8gdGhlIGxlZnQgYm94CisgICAgICAgICAgICAjIHN1Y2ggYXMgIk5hbWU6IGhvYi1jb3JlLW1pbmltYWwtdmFyaWFudC0yMDExLTEyLTE1LWJlYWdsZWJvYXJkIgorICAgICAgICAgICAgbGFiZWwgPSBndGsuTGFiZWwoKQorICAgICAgICAgICAgbGFiZWwuc2V0X2FsaWdubWVudCgwLjAsIDAuNSkKKyAgICAgICAgICAgIGxhYmVsLnNldF9tYXJrdXAoc2VsZi5mb3JtYXRfbGluZSh2YXJpYWJsZSwgdmFsdWUpKQorICAgICAgICAgICAgcmV0dXJuIGxhYmVsCisKKyAgICBjbGFzcyBCdWlsZERldGFpbEJveCAoZ3RrLkV2ZW50Qm94KToKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhcmxpc3QgPSBOb25lLCB2YWxsaXN0ID0gTm9uZSwgaWNvbiA9IE5vbmUsIGNvbG9yID0gSG9iQ29sb3JzLkxJR0hUX0dSQVkpOgorICAgICAgICAgICAgZ3RrLkV2ZW50Qm94Ll9faW5pdF9fKHNlbGYpCisKKyAgICAgICAgICAgICMgc2V0IGNvbG9yCisgICAgICAgICAgICBzdHlsZSA9IHNlbGYuZ2V0X3N0eWxlKCkuY29weSgpCisgICAgICAgICAgICBzdHlsZS5iZ1tndGsuU1RBVEVfTk9STUFMXSA9IHNlbGYuZ2V0X2NvbG9ybWFwKCkuYWxsb2NfY29sb3IoY29sb3IsIEZhbHNlLCBGYWxzZSkKKyAgICAgICAgICAgIHNlbGYuc2V0X3N0eWxlKHN0eWxlKQorCisgICAgICAgICAgICBzZWxmLmhib3ggPSBndGsuSEJveCgpCisgICAgICAgICAgICBzZWxmLmhib3guc2V0X2JvcmRlcl93aWR0aCgxMCkKKyAgICAgICAgICAgIHNlbGYuYWRkKHNlbGYuaGJveCkKKworICAgICAgICAgICAgdG90YWxfcm93cyA9IDAKKyAgICAgICAgICAgIGlmIHZhcmxpc3QgYW5kIHZhbGxpc3Q6CisgICAgICAgICAgICAgICAgIyBwYWNrIHRoZSBpY29uIGFuZCB0aGUgdGV4dCBvbiB0aGUgbGVmdAorICAgICAgICAgICAgICAgIHRvdGFsX3Jvd3MgKz0gbGVuKHZhcmxpc3QpCisgICAgICAgICAgICBzZWxmLnRhYmxlID0gZ3RrLlRhYmxlKHRvdGFsX3Jvd3MsIDIwLCBUcnVlKQorICAgICAgICAgICAgc2VsZi50YWJsZS5zZXRfcm93X3NwYWNpbmdzKDYpCisgICAgICAgICAgICBzZWxmLnRhYmxlLnNldF9zaXplX3JlcXVlc3QoMTAwLCAtMSkKKyAgICAgICAgICAgIHNlbGYuaGJveC5wYWNrX3N0YXJ0KHNlbGYudGFibGUsIGV4cGFuZD1UcnVlLCBmaWxsPVRydWUsIHBhZGRpbmc9MTUpCisKKyAgICAgICAgICAgIGNvbGlkID0gMAorICAgICAgICAgICAgcm93aWQgPSAwCisgICAgICAgICAgICBzZWxmLmxpbmVfd2lkZ2V0cyA9IHt9CisgICAgICAgICAgICBpZiBpY29uOgorICAgICAgICAgICAgICAgIHNlbGYudGFibGUuYXR0YWNoKGljb24sIGNvbGlkLCBjb2xpZCArIDIsIDAsIDEpCisgICAgICAgICAgICAgICAgY29saWQgPSBjb2xpZCArIDIKKyAgICAgICAgICAgIGlmIHZhcmxpc3QgYW5kIHZhbGxpc3Q6CisgICAgICAgICAgICAgICAgZm9yIHJvdyBpbiByYW5nZShyb3dpZCwgdG90YWxfcm93cyk6CisgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gcm93IC0gcm93aWQKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5saW5lX3dpZGdldHNbdmFybGlzdFtpbmRleF1dID0gc2VsZi50ZXh0MmxhYmVsKHZhcmxpc3RbaW5kZXhdLCB2YWxsaXN0W2luZGV4XSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50YWJsZS5hdHRhY2goc2VsZi5saW5lX3dpZGdldHNbdmFybGlzdFtpbmRleF1dLCBjb2xpZCwgMjAsIHJvdywgcm93ICsgMSkKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgZGVmIHVwZGF0ZV9saW5lX3dpZGdldHMoc2VsZiwgdmFyaWFibGUsIHZhbHVlKToKKyAgICAgICAgICAgIGlmIGxlbihzZWxmLmxpbmVfd2lkZ2V0cykgPT0gMDoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHNlbGYubGluZV93aWRnZXRzW3ZhcmlhYmxlXSwgZ3RrLkxhYmVsKToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHNlbGYubGluZV93aWRnZXRzW3ZhcmlhYmxlXS5zZXRfbWFya3VwKHNlbGYuZm9ybWF0X2xpbmUodmFyaWFibGUsIHZhbHVlKSkKKworICAgICAgICBkZWYgd3JhcF9saW5lKHNlbGYsIGlucHV0cyk6CisgICAgICAgICAgICAjIHdyYXAgdGhlIGxvbmcgdGV4dCBvZiBpbnB1dHMKKyAgICAgICAgICAgIHdyYXBfd2lkdGhfY2hhcnMgPSA3NQorICAgICAgICAgICAgb3V0cHV0cyA9ICIiCisgICAgICAgICAgICB0bXBzID0gaW5wdXRzCisgICAgICAgICAgICBsZXNzX2NoYXJzID0gbGVuKGlucHV0cykKKyAgICAgICAgICAgIHdoaWxlIChsZXNzX2NoYXJzIC0gd3JhcF93aWR0aF9jaGFycykgPiAwOgorICAgICAgICAgICAgICAgIGxlc3NfY2hhcnMgLT0gd3JhcF93aWR0aF9jaGFycworICAgICAgICAgICAgICAgIG91dHB1dHMgKz0gdG1wc1s6d3JhcF93aWR0aF9jaGFyc10gKyAiXG4gICAgICAgICAgICAgICAiCisgICAgICAgICAgICAgICAgdG1wcyA9IGlucHV0c1tsZXNzX2NoYXJzOl0KKyAgICAgICAgICAgIG91dHB1dHMgKz0gdG1wcworICAgICAgICAgICAgcmV0dXJuIG91dHB1dHMKKworICAgICAgICBkZWYgZm9ybWF0X2xpbmUoc2VsZiwgdmFyaWFibGUsIHZhbHVlKToKKyAgICAgICAgICAgIHdyYXBlZF92YWx1ZSA9IHNlbGYud3JhcF9saW5lKHZhbHVlKQorICAgICAgICAgICAgbWFya3VwID0gIjxzcGFuIHdlaWdodD1cJ2JvbGRcJz4lczwvc3Bhbj4iICUgdmFyaWFibGUKKyAgICAgICAgICAgIG1hcmt1cCArPSAiPHNwYW4gd2VpZ2h0PVwnbm9ybWFsXCcgZm9yZWdyb3VuZD1cJyMxYzFjMWNcJyBmb250X2Rlc2M9XCcxNHB4XCc+JXM8L3NwYW4+IiAlIHdyYXBlZF92YWx1ZQorICAgICAgICAgICAgcmV0dXJuIG1hcmt1cAorCisgICAgICAgIGRlZiB0ZXh0MmxhYmVsKHNlbGYsIHZhcmlhYmxlLCB2YWx1ZSk6CisgICAgICAgICAgICAjIGFwcGVuZCB0aGUgbmFtZTp2YWx1ZSB0byB0aGUgbGVmdCBib3gKKyAgICAgICAgICAgICMgc3VjaCBhcyAiTmFtZTogaG9iLWNvcmUtbWluaW1hbC12YXJpYW50LTIwMTEtMTItMTUtYmVhZ2xlYm9hcmQiCisgICAgICAgICAgICBsYWJlbCA9IGd0ay5MYWJlbCgpCisgICAgICAgICAgICBsYWJlbC5zZXRfYWxpZ25tZW50KDAuMCwgMC41KQorICAgICAgICAgICAgbGFiZWwuc2V0X21hcmt1cChzZWxmLmZvcm1hdF9saW5lKHZhcmlhYmxlLCB2YWx1ZSkpCisgICAgICAgICAgICByZXR1cm4gbGFiZWwKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgc3VwZXIoSW1hZ2VEZXRhaWxzUGFnZSwgc2VsZikuX19pbml0X18oYnVpbGRlciwgIkltYWdlIGRldGFpbHMiKQorCisgICAgICAgIHNlbGYuaW1hZ2Vfc3RvcmUgPSBbXQorICAgICAgICBzZWxmLmJ1dHRvbl9pZHMgPSB7fQorICAgICAgICBzZWxmLmRldGFpbHNfYm90dG9tX2J1dHRvbnMgPSBndGsuSEJveChGYWxzZSwgNikKKyAgICAgICAgc2VsZi5pbWFnZV9zYXZlZCA9IEZhbHNlCisgICAgICAgIHNlbGYuY3JlYXRlX3Zpc3VhbF9lbGVtZW50cygpCisgICAgICAgIHNlbGYubmFtZV9maWVsZF90ZW1wbGF0ZSA9ICIiCisgICAgICAgIHNlbGYuZGVzY3JpcHRpb25fZmllbGRfdGVtcGxhdGUgPSAiIgorCisgICAgZGVmIGNyZWF0ZV92aXN1YWxfZWxlbWVudHMoc2VsZik6CisgICAgICAgICMgY3JlYXRlIHZpc3VhbCBlbGVtZW50cworICAgICAgICAjIGNyZWF0ZSB0aGUgdG9vbGJhcgorICAgICAgICBzZWxmLnRvb2xiYXIgPSBndGsuVG9vbGJhcigpCisgICAgICAgIHNlbGYudG9vbGJhci5zZXRfb3JpZW50YXRpb24oZ3RrLk9SSUVOVEFUSU9OX0hPUklaT05UQUwpCisgICAgICAgIHNlbGYudG9vbGJhci5zZXRfc3R5bGUoZ3RrLlRPT0xCQVJfQk9USCkKKworICAgICAgICBteV9pbWFnZXNfYnV0dG9uID0gc2VsZi5hcHBlbmRfdG9vbGJhcl9idXR0b24oc2VsZi50b29sYmFyLAorICAgICAgICAgICAgIkltYWdlcyIsCisgICAgICAgICAgICBoaWMuSUNPTl9JTUFHRVNfRElTUExBWV9GSUxFLAorICAgICAgICAgICAgaGljLklDT05fSU1BR0VTX0hPVkVSX0ZJTEUsCisgICAgICAgICAgICAiT3BlbiBwcmV2aW91c2x5IGJ1aWx0IGltYWdlcyIsCisgICAgICAgICAgICBzZWxmLm15X2ltYWdlc19idXR0b25fY2xpY2tlZF9jYikKKyAgICAgICAgc2V0dGluZ3NfYnV0dG9uID0gc2VsZi5hcHBlbmRfdG9vbGJhcl9idXR0b24oc2VsZi50b29sYmFyLAorICAgICAgICAgICAgIlNldHRpbmdzIiwKKyAgICAgICAgICAgIGhpYy5JQ09OX1NFVFRJTkdTX0RJU1BMQVlfRklMRSwKKyAgICAgICAgICAgIGhpYy5JQ09OX1NFVFRJTkdTX0hPVkVSX0ZJTEUsCisgICAgICAgICAgICAiVmlldyBhZGRpdGlvbmFsIGJ1aWxkIHNldHRpbmdzIiwKKyAgICAgICAgICAgIHNlbGYuc2V0dGluZ3NfYnV0dG9uX2NsaWNrZWRfY2IpCisKKyAgICAgICAgc2VsZi5kZXRhaWxzX3RvcF9idXR0b25zID0gc2VsZi5hZGRfb250b190b3BfYmFyKHNlbGYudG9vbGJhcikKKworICAgIGRlZiBfcmVtb3ZlX2FsbF93aWRnZXQoc2VsZik6CisgICAgICAgIGNoaWxkcmVuID0gc2VsZi5nZXRfY2hpbGRyZW4oKSBvciBbXQorICAgICAgICBmb3IgY2hpbGQgaW4gY2hpbGRyZW46CisgICAgICAgICAgICBzZWxmLnJlbW92ZShjaGlsZCkKKyAgICAgICAgY2hpbGRyZW4gPSBzZWxmLmJveF9ncm91cF9hcmVhLmdldF9jaGlsZHJlbigpIG9yIFtdCisgICAgICAgIGZvciBjaGlsZCBpbiBjaGlsZHJlbjoKKyAgICAgICAgICAgIHNlbGYuYm94X2dyb3VwX2FyZWEucmVtb3ZlKGNoaWxkKQorICAgICAgICBjaGlsZHJlbiA9IHNlbGYuZGV0YWlsc19ib3R0b21fYnV0dG9ucy5nZXRfY2hpbGRyZW4oKSBvciBbXQorICAgICAgICBmb3IgY2hpbGQgaW4gY2hpbGRyZW46CisgICAgICAgICAgICBzZWxmLmRldGFpbHNfYm90dG9tX2J1dHRvbnMucmVtb3ZlKGNoaWxkKQorCisgICAgZGVmIHNob3dfcGFnZShzZWxmLCBzdGVwKToKKyAgICAgICAgc2VsZi5idWlsZF9zdWNjZWVkZWQgPSAoc3RlcCA9PSBzZWxmLmJ1aWxkZXIuSU1BR0VfR0VORVJBVEVEKQorICAgICAgICBpbWFnZV9hZGRyID0gc2VsZi5idWlsZGVyLnBhcmFtZXRlcnMuaW1hZ2VfYWRkcgorICAgICAgICBpbWFnZV9uYW1lcyA9IHNlbGYuYnVpbGRlci5wYXJhbWV0ZXJzLmltYWdlX25hbWVzCisgICAgICAgIGlmIHNlbGYuYnVpbGRfc3VjY2VlZGVkOgorICAgICAgICAgICAgbWFjaGluZSA9IHNlbGYuYnVpbGRlci5jb25maWd1cmF0aW9uLmN1cnJfbWFjaAorICAgICAgICAgICAgYmFzZV9pbWFnZSA9IHNlbGYuYnVpbGRlci5yZWNpcGVfbW9kZWwuZ2V0X3NlbGVjdGVkX2ltYWdlKCkKKyAgICAgICAgICAgIGxheWVycyA9IHNlbGYuYnVpbGRlci5jb25maWd1cmF0aW9uLmxheWVycworICAgICAgICAgICAgcGtnX251bSA9ICIlcyIgJSBsZW4oc2VsZi5idWlsZGVyLnBhY2thZ2VfbW9kZWwuZ2V0X3NlbGVjdGVkX3BhY2thZ2VzKCkpCisgICAgICAgICAgICBsb2dfZmlsZSA9IHNlbGYuYnVpbGRlci5jdXJyZW50X2xvZ2ZpbGUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBrZ19udW0gPSAiTi9BIgorICAgICAgICAgICAgbG9nX2ZpbGUgPSBOb25lCisKKyAgICAgICAgIyByZW1vdmUKKyAgICAgICAgZm9yIGJ1dHRvbl9pZCwgYnV0dG9uIGluIHNlbGYuYnV0dG9uX2lkcy5pdGVtcygpOgorICAgICAgICAgICAgYnV0dG9uLmRpc2Nvbm5lY3QoYnV0dG9uX2lkKQorICAgICAgICBzZWxmLl9yZW1vdmVfYWxsX3dpZGdldCgpCisKKyAgICAgICAgIyByZXBhY2sKKyAgICAgICAgc2VsZi5wYWNrX3N0YXJ0KHNlbGYuZGV0YWlsc190b3BfYnV0dG9ucywgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICBzZWxmLnBhY2tfc3RhcnQoc2VsZi5ncm91cF9hbGlnbiwgZXhwYW5kPVRydWUsIGZpbGw9VHJ1ZSkKKworICAgICAgICBzZWxmLmJ1aWxkX3Jlc3VsdCA9IE5vbmUKKyAgICAgICAgaWYgc2VsZi5pbWFnZV9zYXZlZCBvciAoc2VsZi5idWlsZF9zdWNjZWVkZWQgYW5kIHNlbGYuYnVpbGRlci5jdXJyZW50X3N0ZXAgPT0gc2VsZi5idWlsZGVyLklNQUdFX0dFTkVSQVRJTkcpOgorICAgICAgICAgICAgIyBidWlsZGluZyBpcyB0aGUgcHJldmlvdXMgc3RlcAorICAgICAgICAgICAgaWNvbiA9IGd0ay5JbWFnZSgpCisgICAgICAgICAgICBwaXhtYXBfcGF0aCA9IGhpYy5JQ09OX0lORElfQ09ORklSTV9GSUxFCisgICAgICAgICAgICBjb2xvciA9IEhvYkNvbG9ycy5SVU5OSU5HCisgICAgICAgICAgICBwaXhfYnVmZmVyID0gZ3RrLmdkay5waXhidWZfbmV3X2Zyb21fZmlsZShwaXhtYXBfcGF0aCkKKyAgICAgICAgICAgIGljb24uc2V0X2Zyb21fcGl4YnVmKHBpeF9idWZmZXIpCisgICAgICAgICAgICB2YXJsaXN0ID0gWyIiXQorICAgICAgICAgICAgaWYgc2VsZi5pbWFnZV9zYXZlZDoKKyAgICAgICAgICAgICAgICB2YWxsaXN0ID0gWyJZb3VyIGltYWdlIHJlY2lwZSBoYXMgYmVlbiBzYXZlZCJdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHZhbGxpc3QgPSBbIllvdXIgaW1hZ2UgaXMgcmVhZHkiXQorICAgICAgICAgICAgc2VsZi5idWlsZF9yZXN1bHQgPSBzZWxmLkJ1aWxkRGV0YWlsQm94KHZhcmxpc3Q9dmFybGlzdCwgdmFsbGlzdD12YWxsaXN0LCBpY29uPWljb24sIGNvbG9yPWNvbG9yKQorICAgICAgICAgICAgc2VsZi5ib3hfZ3JvdXBfYXJlYS5wYWNrX3N0YXJ0KHNlbGYuYnVpbGRfcmVzdWx0LCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgc2VsZi5idXR0b25saXN0ID0gWyJCdWlsZCBuZXcgaW1hZ2UiLCAiU2F2ZSBpbWFnZSByZWNpcGUiLCAiUnVuIGltYWdlIiwgIkRlcGxveSBpbWFnZSJdCisKKyAgICAgICAgIyBOYW1lCisgICAgICAgIHNlbGYuaW1hZ2Vfc3RvcmUgPSBbXQorICAgICAgICBzZWxmLnRvZ2dsZWRfaW1hZ2UgPSAiIgorICAgICAgICBkZWZhdWx0X2ltYWdlX3NpemUgPSAwCisgICAgICAgIHNlbGYubnVtX3RvZ2dsZWQgPSAwCisgICAgICAgIGkgPSAwCisgICAgICAgIGZvciBpbWFnZV9uYW1lIGluIGltYWdlX25hbWVzOgorICAgICAgICAgICAgaW1hZ2Vfc2l6ZSA9IEhvYlBhZ2UuX3NpemVfdG9fc3RyaW5nKG9zLnN0YXQob3MucGF0aC5qb2luKGltYWdlX2FkZHIsIGltYWdlX25hbWUpKS5zdF9zaXplKQorCisgICAgICAgICAgICBpbWFnZV9hdHRyID0gKCJydW4iIGlmIChzZWxmLnRlc3RfdHlwZV9ydW5uYWJsZShpbWFnZV9uYW1lKSBhbmQgc2VsZi50ZXN0X21hY2hfcnVubmFibGUoaW1hZ2VfbmFtZSkpIGVsc2UgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoImRlcGxveSIgaWYgc2VsZi50ZXN0X2RlcGxveWFibGUoaW1hZ2VfbmFtZSkgZWxzZSAiIikpCisgICAgICAgICAgICBpc190b2dnbGVkID0gKGltYWdlX2F0dHIgIT0gIiIpCisKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLnRvZ2dsZWRfaW1hZ2U6CisgICAgICAgICAgICAgICAgaWYgaSA9PSAobGVuKGltYWdlX25hbWVzKSAtIDEpOgorICAgICAgICAgICAgICAgICAgICBpc190b2dnbGVkID0gVHJ1ZQorICAgICAgICAgICAgICAgIGlmIGlzX3RvZ2dsZWQ6CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfaW1hZ2Vfc2l6ZSA9IGltYWdlX3NpemUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50b2dnbGVkX2ltYWdlID0gaW1hZ2VfbmFtZQorCisgICAgICAgICAgICBzcGxpdF9zdHVmZiA9IGltYWdlX25hbWUuc3BsaXQoJy4nKQorICAgICAgICAgICAgaWYgInJvb3RmcyIgaW4gc3BsaXRfc3R1ZmY6CisgICAgICAgICAgICAgICAgaW1hZ2VfdHlwZSA9IGltYWdlX25hbWVbKGxlbihzcGxpdF9zdHVmZlswXSkgKyBsZW4oIi5yb290ZnMiKSArIDEpOl0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaW1hZ2VfdHlwZSA9IGltYWdlX25hbWVbKGxlbihzcGxpdF9zdHVmZlswXSkgKyAxKTpdCisKKyAgICAgICAgICAgIHNlbGYuaW1hZ2Vfc3RvcmUuYXBwZW5kKHsnbmFtZSc6IGltYWdlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6IGltYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2l6ZSc6IGltYWdlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXNfdG9nZ2xlZCc6IGlzX3RvZ2dsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9uX2F0dHInOiBpbWFnZV9hdHRyLH0pCisKKyAgICAgICAgICAgIGkgPSBpICsgMQorICAgICAgICAgICAgc2VsZi5udW1fdG9nZ2xlZCArPSBpc190b2dnbGVkCisKKyAgICAgICAgaXNfcnVubmFibGUgPSBzZWxmLmNyZWF0ZV9ib3R0b21fYnV0dG9ucyhzZWxmLmJ1dHRvbmxpc3QsIHNlbGYudG9nZ2xlZF9pbWFnZSkKKworICAgICAgICAjIEdlbmVyYXRlZCBpbWFnZSBmaWxlcyBpbmZvCisgICAgICAgIHZhcmxpc3QgPSBbIk5hbWU6ICIsICJGaWxlcyBjcmVhdGVkOiAiLCAiRGlyZWN0b3J5OiAiXQorICAgICAgICB2YWxsaXN0ID0gW10KKworICAgICAgICB2YWxsaXN0LmFwcGVuZChpbWFnZV9uYW1lLnNwbGl0KCcuJylbMF0pCisgICAgICAgIHZhbGxpc3QuYXBwZW5kKCcsICAnLmpvaW4oZmlsZWl0ZW1bJ3R5cGUnXSBmb3IgZmlsZWl0ZW0gaW4gc2VsZi5pbWFnZV9zdG9yZSkpCisgICAgICAgIHZhbGxpc3QuYXBwZW5kKGltYWdlX2FkZHIpCisKKyAgICAgICAgdmlld19maWxlc19idXR0b24gPSBIb2JBbHRCdXR0b24oIlZpZXcgZmlsZXMiKQorICAgICAgICB2aWV3X2ZpbGVzX2J1dHRvbi5jb25uZWN0KCJjbGlja2VkIiwgc2VsZi52aWV3X2ZpbGVzX2NsaWNrZWRfY2IsIGltYWdlX2FkZHIpCisgICAgICAgIHZpZXdfZmlsZXNfYnV0dG9uLnNldF90b29sdGlwX3RleHQoIk9wZW4gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBpbWFnZSBmaWxlcyIpCisgICAgICAgIG9wZW5fbG9nX2J1dHRvbiA9IE5vbmUKKyAgICAgICAgaWYgbG9nX2ZpbGU6CisgICAgICAgICAgICBvcGVuX2xvZ19idXR0b24gPSBIb2JBbHRCdXR0b24oIk9wZW4gbG9nIikKKyAgICAgICAgICAgIG9wZW5fbG9nX2J1dHRvbi5jb25uZWN0KCJjbGlja2VkIiwgc2VsZi5vcGVuX2xvZ19jbGlja2VkX2NiLCBsb2dfZmlsZSkKKyAgICAgICAgICAgIG9wZW5fbG9nX2J1dHRvbi5zZXRfdG9vbHRpcF90ZXh0KCJPcGVuIHRoZSBidWlsZCdzIGxvZyBmaWxlIikKKyAgICAgICAgc2VsZi5pbWFnZV9kZXRhaWwgPSBzZWxmLkRldGFpbEJveCh2YXJsaXN0PXZhcmxpc3QsIHZhbGxpc3Q9dmFsbGlzdCwgYnV0dG9uPXZpZXdfZmlsZXNfYnV0dG9uLCBidXR0b24yPW9wZW5fbG9nX2J1dHRvbikKKyAgICAgICAgc2VsZi5ib3hfZ3JvdXBfYXJlYS5wYWNrX3N0YXJ0KHNlbGYuaW1hZ2VfZGV0YWlsLCBleHBhbmQ9RmFsc2UsIGZpbGw9VHJ1ZSkKKworICAgICAgICAjIFRoZSBkZWZhdWx0IGtlcm5lbCBib3ggZm9yIHRoZSBxZW11IGltYWdlcworICAgICAgICBzZWxmLnNlbF9rZXJuZWwgPSAiIgorICAgICAgICBzZWxmLmtlcm5lbF9kZXRhaWwgPSBOb25lCisgICAgICAgIGlmICdxZW11JyBpbiBpbWFnZV9uYW1lOgorICAgICAgICAgICAgc2VsZi5zZWxfa2VybmVsID0gc2VsZi5nZXRfa2VybmVsX2ZpbGVfbmFtZSgpCisKKyAgICAgICAgIyAgICB2YXJsaXN0ID0gWyJLZXJuZWw6ICJdCisgICAgICAgICMgICAgdmFsbGlzdCA9IFtdCisgICAgICAgICMgICAgdmFsbGlzdC5hcHBlbmQoc2VsZi5zZWxfa2VybmVsKQorCisgICAgICAgICMgICAgY2hhbmdlX2tlcm5lbF9idXR0b24gPSBIb2JBbHRCdXR0b24oIkNoYW5nZSIpCisgICAgICAgICMgICAgY2hhbmdlX2tlcm5lbF9idXR0b24uY29ubmVjdCgiY2xpY2tlZCIsIHNlbGYuY2hhbmdlX2tlcm5lbF9jYikKKyAgICAgICAgIyAgICBjaGFuZ2Vfa2VybmVsX2J1dHRvbi5zZXRfdG9vbHRpcF90ZXh0KCJDaGFuZ2UgcWVtdSBrZXJuZWwgZmlsZSIpCisgICAgICAgICMgICAgc2VsZi5rZXJuZWxfZGV0YWlsID0gc2VsZi5EZXRhaWxCb3godmFybGlzdD12YXJsaXN0LCB2YWxsaXN0PXZhbGxpc3QsIGJ1dHRvbj1jaGFuZ2Vfa2VybmVsX2J1dHRvbikKKyAgICAgICAgIyAgICBzZWxmLmJveF9ncm91cF9hcmVhLnBhY2tfc3RhcnQoc2VsZi5rZXJuZWxfZGV0YWlsLCBleHBhbmQ9VHJ1ZSwgZmlsbD1UcnVlKQorCisgICAgICAgICMgTWFjaGluZSwgSW1hZ2UgcmVjaXBlIGFuZCBMYXllcnMKKyAgICAgICAgbGF5ZXJfbnVtX2xpbWl0ID0gMTUKKyAgICAgICAgdmFybGlzdCA9IFsiTWFjaGluZTogIiwgIkltYWdlIHJlY2lwZTogIiwgIkxheWVyczogIl0KKyAgICAgICAgdmFsbGlzdCA9IFtdCisgICAgICAgIHNlbGYuc2V0dGluZ19kZXRhaWwgPSBOb25lCisgICAgICAgIGlmIHNlbGYuYnVpbGRfc3VjY2VlZGVkOgorICAgICAgICAgICAgdmFsbGlzdC5hcHBlbmQobWFjaGluZSkKKyAgICAgICAgICAgIGlmIHNlbGYuYnVpbGRlci5yZWNpcGVfbW9kZWwuaXNfY3VzdG9tX2ltYWdlKCk6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5idWlsZGVyLmNvbmZpZ3VyYXRpb24uaW5pdGlhbF9zZWxlY3RlZF9pbWFnZSA9PSBzZWxmLmJ1aWxkZXIucmVjaXBlX21vZGVsLl9fY3VzdG9tX2ltYWdlX186CisgICAgICAgICAgICAgICAgICAgIGJhc2VfaW1hZ2UgPSJOZXcgaW1hZ2UgcmVjaXBlIgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGJhc2VfaW1hZ2UgPSBzZWxmLmJ1aWxkZXIuY29uZmlndXJhdGlvbi5pbml0aWFsX3NlbGVjdGVkX2ltYWdlICsgIiAoZWRpdGVkKSIKKyAgICAgICAgICAgIHZhbGxpc3QuYXBwZW5kKGJhc2VfaW1hZ2UpCisgICAgICAgICAgICBpID0gMAorICAgICAgICAgICAgZm9yIGxheWVyIGluIGxheWVyczoKKyAgICAgICAgICAgICAgICBpZiBpID4gbGF5ZXJfbnVtX2xpbWl0OgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHZhcmxpc3QuYXBwZW5kKCIgLSAiKQorICAgICAgICAgICAgICAgIGkgKz0gMQorICAgICAgICAgICAgdmFsbGlzdC5hcHBlbmQoIiIpCisgICAgICAgICAgICBpID0gMAorICAgICAgICAgICAgZm9yIGxheWVyIGluIGxheWVyczoKKyAgICAgICAgICAgICAgICBpZiBpID4gbGF5ZXJfbnVtX2xpbWl0OgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGVsaWYgaSA9PSBsYXllcl9udW1fbGltaXQ6CisgICAgICAgICAgICAgICAgICAgIHZhbGxpc3QuYXBwZW5kKCJhbmQgbW9yZS4uLiIpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdmFsbGlzdC5hcHBlbmQobGF5ZXIpCisgICAgICAgICAgICAgICAgaSArPSAxCisKKyAgICAgICAgICAgIGVkaXRfY29uZmlnX2J1dHRvbiA9IEhvYkFsdEJ1dHRvbigiRWRpdCBjb25maWd1cmF0aW9uIikKKyAgICAgICAgICAgIGVkaXRfY29uZmlnX2J1dHRvbi5zZXRfdG9vbHRpcF90ZXh0KCJFZGl0IG1hY2hpbmUgYW5kIGltYWdlIHJlY2lwZSIpCisgICAgICAgICAgICBlZGl0X2NvbmZpZ19idXR0b24uY29ubmVjdCgiY2xpY2tlZCIsIHNlbGYuZWRpdF9jb25maWdfYnV0dG9uX2NsaWNrZWRfY2IpCisgICAgICAgICAgICBzZWxmLnNldHRpbmdfZGV0YWlsID0gc2VsZi5EZXRhaWxCb3godmFybGlzdD12YXJsaXN0LCB2YWxsaXN0PXZhbGxpc3QsIGJ1dHRvbj1lZGl0X2NvbmZpZ19idXR0b24pCisgICAgICAgICAgICBzZWxmLmJveF9ncm91cF9hcmVhLnBhY2tfc3RhcnQoc2VsZi5zZXR0aW5nX2RldGFpbCwgZXhwYW5kPVRydWUsIGZpbGw9VHJ1ZSkKKworICAgICAgICAjIFBhY2thZ2VzIGluY2x1ZGVkLCBhbmQgVG90YWwgaW1hZ2Ugc2l6ZQorICAgICAgICB2YXJsaXN0ID0gWyJQYWNrYWdlcyBpbmNsdWRlZDogIiwgIlRvdGFsIGltYWdlIHNpemU6ICJdCisgICAgICAgIHZhbGxpc3QgPSBbXQorICAgICAgICB2YWxsaXN0LmFwcGVuZChwa2dfbnVtKQorICAgICAgICB2YWxsaXN0LmFwcGVuZChkZWZhdWx0X2ltYWdlX3NpemUpCisgICAgICAgIHNlbGYuYnVpbGRlci5jb25maWd1cmF0aW9uLmltYWdlX3NpemUgPSBkZWZhdWx0X2ltYWdlX3NpemUKKyAgICAgICAgc2VsZi5idWlsZGVyLmNvbmZpZ3VyYXRpb24uaW1hZ2VfcGFja2FnZXMgPSBzZWxmLmJ1aWxkZXIuY29uZmlndXJhdGlvbi5zZWxlY3RlZF9wYWNrYWdlcworICAgICAgICBpZiBzZWxmLmJ1aWxkX3N1Y2NlZWRlZDoKKyAgICAgICAgICAgIGVkaXRfcGFja2FnZXNfYnV0dG9uID0gSG9iQWx0QnV0dG9uKCJFZGl0IHBhY2thZ2VzIikKKyAgICAgICAgICAgIGVkaXRfcGFja2FnZXNfYnV0dG9uLnNldF90b29sdGlwX3RleHQoIkVkaXQgdGhlIHBhY2thZ2VzIGluY2x1ZGVkIGluIHlvdXIgaW1hZ2UiKQorICAgICAgICAgICAgZWRpdF9wYWNrYWdlc19idXR0b24uY29ubmVjdCgiY2xpY2tlZCIsIHNlbGYuZWRpdF9wYWNrYWdlc19idXR0b25fY2xpY2tlZF9jYikKKyAgICAgICAgZWxzZTogIyBnZXQgdG8gdGhpcyBwYWdlIGZyb20gIk15IGltYWdlcyIKKyAgICAgICAgICAgIGVkaXRfcGFja2FnZXNfYnV0dG9uID0gTm9uZQorICAgICAgICBzZWxmLnBhY2thZ2VfZGV0YWlsID0gc2VsZi5EZXRhaWxCb3godmFybGlzdD12YXJsaXN0LCB2YWxsaXN0PXZhbGxpc3QsIGJ1dHRvbj1lZGl0X3BhY2thZ2VzX2J1dHRvbikKKyAgICAgICAgc2VsZi5ib3hfZ3JvdXBfYXJlYS5wYWNrX3N0YXJ0KHNlbGYucGFja2FnZV9kZXRhaWwsIGV4cGFuZD1UcnVlLCBmaWxsPVRydWUpCisKKyAgICAgICAgIyBwYWNrIHRoZSBidXR0b25zIGF0IHRoZSBib3R0b20sIGF0IHRoaXMgdGltZSB0aGV5IGFyZSBhbHJlYWR5IGNyZWF0ZWQuCisgICAgICAgIGlmIHNlbGYuYnVpbGRfc3VjY2VlZGVkOgorICAgICAgICAgICAgc2VsZi5ib3hfZ3JvdXBfYXJlYS5wYWNrX2VuZChzZWxmLmRldGFpbHNfYm90dG9tX2J1dHRvbnMsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgZWxzZTogIyBmb3IgIk15IGltYWdlcyIgcGFnZQorICAgICAgICAgICAgc2VsZi5kZXRhaWxzX3NlcGFyYXRvciA9IGd0ay5IU2VwYXJhdG9yKCkKKyAgICAgICAgICAgIHNlbGYuYm94X2dyb3VwX2FyZWEucGFja19zdGFydChzZWxmLmRldGFpbHNfc2VwYXJhdG9yLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgICAgICBzZWxmLmJveF9ncm91cF9hcmVhLnBhY2tfc3RhcnQoc2VsZi5kZXRhaWxzX2JvdHRvbV9idXR0b25zLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgc2VsZi5zaG93X2FsbCgpCisgICAgICAgIGlmIHNlbGYua2VybmVsX2RldGFpbCBhbmQgKG5vdCBpc19ydW5uYWJsZSk6CisgICAgICAgICAgICBzZWxmLmtlcm5lbF9kZXRhaWwuaGlkZSgpCisgICAgICAgIHNlbGYuaW1hZ2Vfc2F2ZWQgPSBGYWxzZQorCisgICAgZGVmIHZpZXdfZmlsZXNfY2xpY2tlZF9jYihzZWxmLCBidXR0b24sIGltYWdlX2FkZHIpOgorICAgICAgICBzdWJwcm9jZXNzLmNhbGwoInhkZy1vcGVuIC8lcyIgJSBpbWFnZV9hZGRyLCBzaGVsbD1UcnVlKQorCisgICAgZGVmIG9wZW5fbG9nX2NsaWNrZWRfY2Ioc2VsZiwgYnV0dG9uLCBsb2dfZmlsZSk6CisgICAgICAgIGlmIGxvZ19maWxlOgorICAgICAgICAgICAgbG9nX2ZpbGUgPSAiZmlsZTovLy8iICsgbG9nX2ZpbGUKKyAgICAgICAgICAgIGd0ay5zaG93X3VyaShzY3JlZW49YnV0dG9uLmdldF9zY3JlZW4oKSwgdXJpPWxvZ19maWxlLCB0aW1lc3RhbXA9MCkKKworICAgIGRlZiByZWZyZXNoX3BhY2thZ2VfZGV0YWlsX2JveChzZWxmLCBpbWFnZV9zaXplKToKKyAgICAgICAgc2VsZi5wYWNrYWdlX2RldGFpbC51cGRhdGVfbGluZV93aWRnZXRzKCJUb3RhbCBpbWFnZSBzaXplOiAiLCBpbWFnZV9zaXplKQorCisgICAgZGVmIHRlc3RfdHlwZV9ydW5uYWJsZShzZWxmLCBpbWFnZV9uYW1lKToKKyAgICAgICAgdHlwZV9ydW5uYWJsZSA9IEZhbHNlCisgICAgICAgIGZvciB0IGluIHNlbGYuYnVpbGRlci5wYXJhbWV0ZXJzLnJ1bm5hYmxlX2ltYWdlX3R5cGVzOgorICAgICAgICAgICAgaWYgaW1hZ2VfbmFtZS5lbmRzd2l0aCh0KToKKyAgICAgICAgICAgICAgICB0eXBlX3J1bm5hYmxlID0gVHJ1ZQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHJldHVybiB0eXBlX3J1bm5hYmxlCisKKyAgICBkZWYgdGVzdF9tYWNoX3J1bm5hYmxlKHNlbGYsIGltYWdlX25hbWUpOgorICAgICAgICBtYWNoX3J1bm5hYmxlID0gRmFsc2UKKyAgICAgICAgZm9yIHQgaW4gc2VsZi5idWlsZGVyLnBhcmFtZXRlcnMucnVubmFibGVfbWFjaGluZV9wYXR0ZXJuczoKKyAgICAgICAgICAgIGlmIHQgaW4gaW1hZ2VfbmFtZToKKyAgICAgICAgICAgICAgICBtYWNoX3J1bm5hYmxlID0gVHJ1ZQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHJldHVybiBtYWNoX3J1bm5hYmxlCisKKyAgICBkZWYgdGVzdF9kZXBsb3lhYmxlKHNlbGYsIGltYWdlX25hbWUpOgorICAgICAgICBpZiBzZWxmLmJ1aWxkZXIuY29uZmlndXJhdGlvbi5jdXJyX21hY2guc3RhcnRzd2l0aCgicWVtdSIpOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGRlcGxveWFibGUgPSBGYWxzZQorICAgICAgICBmb3IgdCBpbiBzZWxmLmJ1aWxkZXIucGFyYW1ldGVycy5kZXBsb3lhYmxlX2ltYWdlX3R5cGVzOgorICAgICAgICAgICAgaWYgaW1hZ2VfbmFtZS5lbmRzd2l0aCh0KToKKyAgICAgICAgICAgICAgICBkZXBsb3lhYmxlID0gVHJ1ZQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHJldHVybiBkZXBsb3lhYmxlCisKKyAgICBkZWYgZ2V0X2tlcm5lbF9maWxlX25hbWUoc2VsZiwga2VybmVsX2FkZHI9IiIpOgorICAgICAgICBrZXJuZWxfbmFtZSA9ICIiCisKKyAgICAgICAgaWYgbm90IGtlcm5lbF9hZGRyOgorICAgICAgICAgICAga2VybmVsX2FkZHIgPSBzZWxmLmJ1aWxkZXIucGFyYW1ldGVycy5pbWFnZV9hZGRyCisKKyAgICAgICAgZmlsZXMgPSBbZiBmb3IgZiBpbiBvcy5saXN0ZGlyKGtlcm5lbF9hZGRyKSBpZiBmWzBdIDw+ICcuJ10KKyAgICAgICAgZm9yIGNoZWNrX2ZpbGUgaW4gZmlsZXM6CisgICAgICAgICAgICBpZiBjaGVja19maWxlLmVuZHN3aXRoKCIuYmluIik6CisgICAgICAgICAgICAgICAgbmFtZV9zcGxpdHMgPSBjaGVja19maWxlLnNwbGl0KCIuIilbMF0KKyAgICAgICAgICAgICAgICBpZiBzZWxmLmJ1aWxkZXIucGFyYW1ldGVycy5rZXJuZWxfaW1hZ2VfdHlwZSBpbiBuYW1lX3NwbGl0cy5zcGxpdCgiLSIpOgorICAgICAgICAgICAgICAgICAgICBrZXJuZWxfbmFtZSA9IGNoZWNrX2ZpbGUKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICByZXR1cm4ga2VybmVsX25hbWUKKworICAgIGRlZiBzaG93X2J1aWxkZWRfaW1hZ2VzX2RpYWxvZyhzZWxmLCB3aWRnZXQsIHByaW1hcnlfYWN0aW9uPSIiKToKKyAgICAgICAgdGl0bGUgPSBwcmltYXJ5X2FjdGlvbiBpZiBwcmltYXJ5X2FjdGlvbiBlbHNlICJZb3VyIGJ1aWxkZWQgaW1hZ2VzIgorICAgICAgICBkaWFsb2cgPSBDcnVtYnNEaWFsb2codGl0bGUsIHNlbGYuYnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0ay5ESUFMT0dfTU9EQUwgfCBndGsuRElBTE9HX0RFU1RST1lfV0lUSF9QQVJFTlQpCisgICAgICAgIGRpYWxvZy5zZXRfYm9yZGVyX3dpZHRoKDEyKQorCisgICAgICAgIGxhYmVsID0gZ3RrLkxhYmVsKCkKKyAgICAgICAgbGFiZWwuc2V0X3VzZV9tYXJrdXAoVHJ1ZSkKKyAgICAgICAgbGFiZWwuc2V0X2FsaWdubWVudCgwLjAsIDAuNSkKKyAgICAgICAgbGFiZWwuc2V0X3BhZGRpbmcoMTIsMCkKKyAgICAgICAgaWYgcHJpbWFyeV9hY3Rpb24gPT0gIlJ1biBpbWFnZSI6CisgICAgICAgICAgICBsYWJlbC5zZXRfbWFya3VwKCI8c3BhbiBmb250X2Rlc2M9JzEyJz5TZWxlY3QgdGhlIGltYWdlIGZpbGUgeW91IHdhbnQgdG8gcnVuOjwvc3Bhbj4iKQorICAgICAgICBlbGlmIHByaW1hcnlfYWN0aW9uID09ICJEZXBsb3kgaW1hZ2UiOgorICAgICAgICAgICAgbGFiZWwuc2V0X21hcmt1cCgiPHNwYW4gZm9udF9kZXNjPScxMic+U2VsZWN0IHRoZSBpbWFnZSBmaWxlIHlvdSB3YW50IHRvIGRlcGxveTo8L3NwYW4+IikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxhYmVsLnNldF9tYXJrdXAoIjxzcGFuIGZvbnRfZGVzYz0nMTInPlNlbGVjdCB0aGUgaW1hZ2UgZmlsZSB5b3Ugd2FudCB0byAlczwvc3Bhbj4iICUgcHJpbWFyeV9hY3Rpb24pCisgICAgICAgIGRpYWxvZy52Ym94LnBhY2tfc3RhcnQobGFiZWwsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKworICAgICAgICAjIGZpbHRlciBjcmVhdGVkIGltYWdlcyBhcyBhY3Rpb24gYXR0cmlidXRpb24gKGRlcGxveSBvciBydW4pCisgICAgICAgIGFjdGlvbl9hdHRyID0gIiIKKyAgICAgICAgYWN0aW9uX2ltYWdlcyA9IFtdCisgICAgICAgIGZvciBmaWxlaXRlbSBpbiBzZWxmLmltYWdlX3N0b3JlOgorICAgICAgICAgICAgYWN0aW9uX2F0dHIgPSBmaWxlaXRlbVsnYWN0aW9uX2F0dHInXQorICAgICAgICAgICAgaWYgIChhY3Rpb25fYXR0ciA9PSAncnVuJyBhbmQgcHJpbWFyeV9hY3Rpb24gPT0gIlJ1biBpbWFnZSIpIFwKKyAgICAgICAgICAgICBvciAoYWN0aW9uX2F0dHIgPT0gJ2RlcGxveScgYW5kIHByaW1hcnlfYWN0aW9uID09ICJEZXBsb3kgaW1hZ2UiKToKKyAgICAgICAgICAgICAgICBhY3Rpb25faW1hZ2VzLmFwcGVuZChmaWxlaXRlbSkKKworICAgICAgICAjIHBhY2sgdGhlIGNvcnJlc3BvbmRpbmcgJ3J1bm5hYmxlJyBvciAnZGVwbG95JyByYWRpb19idXR0b25zLCBpZiB0aGVyZSBoYXMgbm8gbW9yZSB0aGFuIG9uZSBmaWxlLgorICAgICAgICAjIGFzc3VtZSB0aGF0IHRoZXJlIGRvZXMgbm90IGJvdGggaGF2ZSAnZGVwbG95JyBhbmQgJ3J1bm5hYmxlJyBmaWxlcyBpbiB0aGUgc2FtZSBidWlsZGluZyByZXN1bHQKKyAgICAgICAgIyBpbiBwb3NzaWJsZSBhcyBkZXNpZ24uCisgICAgICAgIGN1cnJfcm93ID0gMAorICAgICAgICByb3dzID0gKGxlbihhY3Rpb25faW1hZ2VzKSkgaWYgbGVuKGFjdGlvbl9pbWFnZXMpIDwgMTAgZWxzZSAxMAorICAgICAgICB0YWJsZSA9IGd0ay5UYWJsZShyb3dzLCAxMCwgVHJ1ZSkKKyAgICAgICAgdGFibGUuc2V0X3Jvd19zcGFjaW5ncyg2KQorICAgICAgICB0YWJsZS5zZXRfY29sX3NwYWNpbmcoMCwgMTIpCisgICAgICAgIHRhYmxlLnNldF9jb2xfc3BhY2luZyg1LCAxMikKKworICAgICAgICBzZWxfcGFyZW50X2J0biA9IE5vbmUKKyAgICAgICAgZm9yIGZpbGVpdGVtIGluIGFjdGlvbl9pbWFnZXM6CisgICAgICAgICAgICBzZWxfYnRuID0gZ3RrLlJhZGlvQnV0dG9uKHNlbF9wYXJlbnRfYnRuLCBmaWxlaXRlbVsndHlwZSddKQorICAgICAgICAgICAgc2VsX3BhcmVudF9idG4gPSBzZWxfYnRuIGlmIG5vdCBzZWxfcGFyZW50X2J0biBlbHNlIHNlbF9wYXJlbnRfYnRuCisgICAgICAgICAgICBzZWxfYnRuLnNldF9hY3RpdmUoZmlsZWl0ZW1bJ2lzX3RvZ2dsZWQnXSkKKyAgICAgICAgICAgIHNlbF9idG4uY29ubmVjdCgndG9nZ2xlZCcsIHNlbGYudGFibGVfc2VsZWN0ZWRfY2IsIGZpbGVpdGVtKQorICAgICAgICAgICAgaWYgY3Vycl9yb3cgPCAxMDoKKyAgICAgICAgICAgICAgICB0YWJsZS5hdHRhY2goc2VsX2J0biwgMCwgNCwgY3Vycl9yb3csIGN1cnJfcm93ICsgMSwgeHBhZGRpbmc9MjQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHRhYmxlLmF0dGFjaChzZWxfYnRuLCA1LCA5LCBjdXJyX3JvdyAtIDEwLCBjdXJyX3JvdyAtIDksIHhwYWRkaW5nPTI0KQorICAgICAgICAgICAgY3Vycl9yb3cgKz0gMQorCisgICAgICAgIGRpYWxvZy52Ym94LnBhY2tfc3RhcnQodGFibGUsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSwgcGFkZGluZz02KQorCisgICAgICAgIGJ1dHRvbiA9IGRpYWxvZy5hZGRfYnV0dG9uKCJDYW5jZWwiLCBndGsuUkVTUE9OU0VfQ0FOQ0VMKQorICAgICAgICBIb2JBbHRCdXR0b24uc3R5bGVfYnV0dG9uKGJ1dHRvbikKKworICAgICAgICBpZiBwcmltYXJ5X2FjdGlvbjoKKyAgICAgICAgICAgIGJ1dHRvbiA9IGRpYWxvZy5hZGRfYnV0dG9uKHByaW1hcnlfYWN0aW9uLCBndGsuUkVTUE9OU0VfWUVTKQorICAgICAgICAgICAgSG9iQnV0dG9uLnN0eWxlX2J1dHRvbihidXR0b24pCisKKyAgICAgICAgZGlhbG9nLnNob3dfYWxsKCkKKworICAgICAgICByZXNwb25zZSA9IGRpYWxvZy5ydW4oKQorICAgICAgICBkaWFsb2cuZGVzdHJveSgpCisKKyAgICAgICAgaWYgcmVzcG9uc2UgIT0gZ3RrLlJFU1BPTlNFX1lFUzoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGZvciBmaWxlaXRlbSBpbiBzZWxmLmltYWdlX3N0b3JlOgorICAgICAgICAgICAgaWYgZmlsZWl0ZW1bJ2lzX3RvZ2dsZWQnXToKKyAgICAgICAgICAgICAgICBpZiBmaWxlaXRlbVsnYWN0aW9uX2F0dHInXSA9PSAncnVuJzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5idWlsZGVyLnJ1bnFlbXVfaW1hZ2UoZmlsZWl0ZW1bJ25hbWUnXSwgc2VsZi5zZWxfa2VybmVsKQorICAgICAgICAgICAgICAgIGVsaWYgZmlsZWl0ZW1bJ2FjdGlvbl9hdHRyJ10gPT0gJ2RlcGxveSc6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYnVpbGRlci5kZXBsb3lfaW1hZ2UoZmlsZWl0ZW1bJ25hbWUnXSkKKworICAgIGRlZiB0YWJsZV9zZWxlY3RlZF9jYihzZWxmLCB0YnV0dG9uLCBpbWFnZSk6CisgICAgICAgIGltYWdlWydpc190b2dnbGVkJ10gPSB0YnV0dG9uLmdldF9hY3RpdmUoKQorICAgICAgICBpZiBpbWFnZVsnaXNfdG9nZ2xlZCddOgorICAgICAgICAgICAgc2VsZi50b2dnbGVkX2ltYWdlID0gaW1hZ2VbJ25hbWUnXQorCisgICAgZGVmIGNoYW5nZV9rZXJuZWxfY2Ioc2VsZiwgd2lkZ2V0KToKKyAgICAgICAga2VybmVsX3BhdGggPSBzZWxmLmJ1aWxkZXIuc2hvd19sb2FkX2tlcm5lbF9kaWFsb2coKQorICAgICAgICBpZiBrZXJuZWxfcGF0aCBhbmQgc2VsZi5rZXJuZWxfZGV0YWlsOgorICAgICAgICAgICAgaW1wb3J0IG9zLnBhdGgKKyAgICAgICAgICAgIHNlbGYuc2VsX2tlcm5lbCA9IG9zLnBhdGguYmFzZW5hbWUoa2VybmVsX3BhdGgpCisgICAgICAgICAgICBtYXJrdXAgPSBzZWxmLmtlcm5lbF9kZXRhaWwuZm9ybWF0X2xpbmUoIktlcm5lbDogIiwgc2VsZi5zZWxfa2VybmVsKQorICAgICAgICAgICAgbGFiZWwgPSAoKHNlbGYua2VybmVsX2RldGFpbC5nZXRfY2hpbGRyZW4oKVswXSkuZ2V0X2NoaWxkcmVuKClbMF0pLmdldF9jaGlsZHJlbigpWzBdCisgICAgICAgICAgICBsYWJlbC5zZXRfbWFya3VwKG1hcmt1cCkKKworICAgIGRlZiBjcmVhdGVfYm90dG9tX2J1dHRvbnMoc2VsZiwgYnV0dG9ubGlzdCwgaW1hZ2VfbmFtZSk6CisgICAgICAgICMgQ3JlYXRlIHRoZSBidXR0b25zIGF0IHRoZSBib3R0b20KKyAgICAgICAgY3JlYXRlZCA9IEZhbHNlCisgICAgICAgIHBhY2tlZCA9IEZhbHNlCisgICAgICAgIHNlbGYuYnV0dG9uX2lkcyA9IHt9CisgICAgICAgIGlzX3J1bm5hYmxlID0gRmFsc2UKKworICAgICAgICAjIGNyZWF0ZSBidXR0b24gIkRlcGxveSBpbWFnZSIKKyAgICAgICAgbmFtZSA9ICJEZXBsb3kgaW1hZ2UiCisgICAgICAgIGlmIG5hbWUgaW4gYnV0dG9ubGlzdCBhbmQgc2VsZi50ZXN0X2RlcGxveWFibGUoaW1hZ2VfbmFtZSk6CisgICAgICAgICAgICBkZXBsb3lfYnV0dG9uID0gSG9iQnV0dG9uKCdEZXBsb3kgaW1hZ2UnKQorICAgICAgICAgICAgI2RlcGxveV9idXR0b24uc2V0X3NpemVfcmVxdWVzdCgyMDUsIDQ5KQorICAgICAgICAgICAgZGVwbG95X2J1dHRvbi5zZXRfdG9vbHRpcF90ZXh0KCJCdXJuIGEgbGl2ZSBpbWFnZSB0byBhIFVTQiBkcml2ZSBvciBmbGFzaCBtZW1vcnkiKQorICAgICAgICAgICAgZGVwbG95X2J1dHRvbi5zZXRfZmxhZ3MoZ3RrLkNBTl9ERUZBVUxUKQorICAgICAgICAgICAgYnV0dG9uX2lkID0gZGVwbG95X2J1dHRvbi5jb25uZWN0KCJjbGlja2VkIiwgc2VsZi5kZXBsb3lfYnV0dG9uX2NsaWNrZWRfY2IpCisgICAgICAgICAgICBzZWxmLmJ1dHRvbl9pZHNbYnV0dG9uX2lkXSA9IGRlcGxveV9idXR0b24KKyAgICAgICAgICAgIHNlbGYuZGV0YWlsc19ib3R0b21fYnV0dG9ucy5wYWNrX2VuZChkZXBsb3lfYnV0dG9uLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgICAgICBjcmVhdGVkID0gVHJ1ZQorICAgICAgICAgICAgcGFja2VkID0gVHJ1ZQorCisgICAgICAgIG5hbWUgPSAiUnVuIGltYWdlIgorICAgICAgICBpZiBuYW1lIGluIGJ1dHRvbmxpc3QgYW5kIHNlbGYudGVzdF90eXBlX3J1bm5hYmxlKGltYWdlX25hbWUpIGFuZCBzZWxmLnRlc3RfbWFjaF9ydW5uYWJsZShpbWFnZV9uYW1lKToKKyAgICAgICAgICAgIGlmIGNyZWF0ZWQgPT0gVHJ1ZToKKyAgICAgICAgICAgICAgICAjIHNlcGFyYXRvcgorICAgICAgICAgICAgICAgICNsYWJlbCA9IGd0ay5MYWJlbCgiIG9yICIpCisgICAgICAgICAgICAgICAgI3NlbGYuZGV0YWlsc19ib3R0b21fYnV0dG9ucy5wYWNrX2VuZChsYWJlbCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorCisgICAgICAgICAgICAgICAgIyBjcmVhdGUgYnV0dG9uICJSdW4gaW1hZ2UiCisgICAgICAgICAgICAgICAgcnVuX2J1dHRvbiA9IEhvYkFsdEJ1dHRvbigiUnVuIGltYWdlIikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBjcmVhdGUgYnV0dG9uICJSdW4gaW1hZ2UiIGFzIHRoZSBwcmltYXJ5IGJ1dHRvbgorICAgICAgICAgICAgICAgIHJ1bl9idXR0b24gPSBIb2JCdXR0b24oIlJ1biBpbWFnZSIpCisgICAgICAgICAgICAgICAgI3J1bl9idXR0b24uc2V0X3NpemVfcmVxdWVzdCgyMDUsIDQ5KQorICAgICAgICAgICAgICAgIHJ1bl9idXR0b24uc2V0X2ZsYWdzKGd0ay5DQU5fREVGQVVMVCkKKyAgICAgICAgICAgICAgICBwYWNrZWQgPSBUcnVlCisgICAgICAgICAgICBydW5fYnV0dG9uLnNldF90b29sdGlwX3RleHQoIlN0YXJ0IHVwIGFuIGltYWdlIHdpdGggcWVtdSBlbXVsYXRvciIpCisgICAgICAgICAgICBidXR0b25faWQgPSBydW5fYnV0dG9uLmNvbm5lY3QoImNsaWNrZWQiLCBzZWxmLnJ1bl9idXR0b25fY2xpY2tlZF9jYikKKyAgICAgICAgICAgIHNlbGYuYnV0dG9uX2lkc1tidXR0b25faWRdID0gcnVuX2J1dHRvbgorICAgICAgICAgICAgc2VsZi5kZXRhaWxzX2JvdHRvbV9idXR0b25zLnBhY2tfZW5kKHJ1bl9idXR0b24sIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgICAgIGNyZWF0ZWQgPSBUcnVlCisgICAgICAgICAgICBpc19ydW5uYWJsZSA9IFRydWUKKworICAgICAgICBuYW1lID0gIlNhdmUgaW1hZ2UgcmVjaXBlIgorICAgICAgICBpZiBuYW1lIGluIGJ1dHRvbmxpc3QgYW5kIHNlbGYuYnVpbGRlci5yZWNpcGVfbW9kZWwuaXNfY3VzdG9tX2ltYWdlKCk6CisgICAgICAgICAgICBzYXZlX2J1dHRvbiA9IEhvYkFsdEJ1dHRvbigiU2F2ZSBpbWFnZSByZWNpcGUiKQorICAgICAgICAgICAgc2F2ZV9idXR0b24uc2V0X3Rvb2x0aXBfdGV4dCgiS2VlcCB5b3VyIGNoYW5nZXMgc2F2aW5nIHRoZW0gYXMgYW4gaW1hZ2UgcmVjaXBlIikKKyAgICAgICAgICAgIHNhdmVfYnV0dG9uLnNldF9zZW5zaXRpdmUobm90IHNlbGYuaW1hZ2Vfc2F2ZWQpCisgICAgICAgICAgICBidXR0b25faWQgPSBzYXZlX2J1dHRvbi5jb25uZWN0KCJjbGlja2VkIiwgc2VsZi5zYXZlX2J1dHRvbl9jbGlja2VkX2NiKQorICAgICAgICAgICAgc2VsZi5idXR0b25faWRzW2J1dHRvbl9pZF0gPSBzYXZlX2J1dHRvbgorICAgICAgICAgICAgc2VsZi5kZXRhaWxzX2JvdHRvbV9idXR0b25zLnBhY2tfZW5kKHNhdmVfYnV0dG9uLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgbmFtZSA9ICJCdWlsZCBuZXcgaW1hZ2UiCisgICAgICAgIGlmIG5hbWUgaW4gYnV0dG9ubGlzdDoKKyAgICAgICAgICAgICMgY3JlYXRlIGJ1dHRvbiAiQnVpbGQgbmV3IGltYWdlIgorICAgICAgICAgICAgaWYgcGFja2VkOgorICAgICAgICAgICAgICAgIGJ1aWxkX25ld19idXR0b24gPSBIb2JBbHRCdXR0b24oIkJ1aWxkIG5ldyBpbWFnZSIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGJ1aWxkX25ld19idXR0b24gPSBIb2JCdXR0b24oIkJ1aWxkIG5ldyBpbWFnZSIpCisgICAgICAgICAgICAgICAgYnVpbGRfbmV3X2J1dHRvbi5zZXRfZmxhZ3MoZ3RrLkNBTl9ERUZBVUxUKQorICAgICAgICAgICAgI2J1aWxkX25ld19idXR0b24uc2V0X3NpemVfcmVxdWVzdCgyMDUsIDQ5KQorICAgICAgICAgICAgc2VsZi5kZXRhaWxzX2JvdHRvbV9idXR0b25zLnBhY2tfZW5kKGJ1aWxkX25ld19idXR0b24sIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgICAgIGJ1aWxkX25ld19idXR0b24uc2V0X3Rvb2x0aXBfdGV4dCgiQ3JlYXRlIGEgbmV3IGltYWdlIGZyb20gc2NyYXRjaCIpCisgICAgICAgICAgICBidXR0b25faWQgPSBidWlsZF9uZXdfYnV0dG9uLmNvbm5lY3QoImNsaWNrZWQiLCBzZWxmLmJ1aWxkX25ld19idXR0b25fY2xpY2tlZF9jYikKKyAgICAgICAgICAgIHNlbGYuYnV0dG9uX2lkc1tidXR0b25faWRdID0gYnVpbGRfbmV3X2J1dHRvbgorCisgICAgICAgIHJldHVybiBpc19ydW5uYWJsZQorCisgICAgZGVmIGRlcGxveV9idXR0b25fY2xpY2tlZF9jYihzZWxmLCBidXR0b24pOgorICAgICAgICBpZiBzZWxmLnRvZ2dsZWRfaW1hZ2U6CisgICAgICAgICAgICBpZiBzZWxmLm51bV90b2dnbGVkID4gMToKKyAgICAgICAgICAgICAgICBzZWxmLnNldF9zZW5zaXRpdmUoRmFsc2UpCisgICAgICAgICAgICAgICAgc2VsZi5zaG93X2J1aWxkZWRfaW1hZ2VzX2RpYWxvZyhOb25lLCAiRGVwbG95IGltYWdlIikKKyAgICAgICAgICAgICAgICBzZWxmLnNldF9zZW5zaXRpdmUoVHJ1ZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5idWlsZGVyLmRlcGxveV9pbWFnZShzZWxmLnRvZ2dsZWRfaW1hZ2UpCisKKyAgICBkZWYgcnVuX2J1dHRvbl9jbGlja2VkX2NiKHNlbGYsIGJ1dHRvbik6CisgICAgICAgIGlmIHNlbGYudG9nZ2xlZF9pbWFnZToKKyAgICAgICAgICAgIGlmIHNlbGYubnVtX3RvZ2dsZWQgPiAxOgorICAgICAgICAgICAgICAgIHNlbGYuc2V0X3NlbnNpdGl2ZShGYWxzZSkKKyAgICAgICAgICAgICAgICBzZWxmLnNob3dfYnVpbGRlZF9pbWFnZXNfZGlhbG9nKE5vbmUsICJSdW4gaW1hZ2UiKQorICAgICAgICAgICAgICAgIHNlbGYuc2V0X3NlbnNpdGl2ZShUcnVlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmJ1aWxkZXIucnVucWVtdV9pbWFnZShzZWxmLnRvZ2dsZWRfaW1hZ2UsIHNlbGYuc2VsX2tlcm5lbCkKKworICAgIGRlZiBzYXZlX2J1dHRvbl9jbGlja2VkX2NiKHNlbGYsIGJ1dHRvbik6CisgICAgICAgIHRvcGRpciA9IHNlbGYuYnVpbGRlci5nZXRfdG9wZGlyKCkKKyAgICAgICAgaW1hZ2VzX2RpciA9IHRvcGRpciArICIvcmVjaXBlcy9pbWFnZXMvY3VzdG9tLyIKKyAgICAgICAgc2VsZi5idWlsZGVyLmVuc3VyZV9kaXIoaW1hZ2VzX2RpcikKKworICAgICAgICBzZWxmLm5hbWVfZmllbGRfdGVtcGxhdGUgPSBzZWxmLmJ1aWxkZXIuaW1hZ2VfY29uZmlndXJhdGlvbl9wYWdlLmN1c3RvbV9pbWFnZV9zZWxlY3RlZAorICAgICAgICBpZiBzZWxmLm5hbWVfZmllbGRfdGVtcGxhdGU6CisgICAgICAgICAgICBpbWFnZV9wYXRoID0gc2VsZi5idWlsZGVyLnJlY2lwZV9tb2RlbC5wbl9wYXRoW3NlbGYubmFtZV9maWVsZF90ZW1wbGF0ZV0KKyAgICAgICAgICAgIGltYWdlX2l0ZXIgPSBzZWxmLmJ1aWxkZXIucmVjaXBlX21vZGVsLmdldF9pdGVyKGltYWdlX3BhdGgpCisgICAgICAgICAgICBzZWxmLmRlc2NyaXB0aW9uX2ZpZWxkX3RlbXBsYXRlID0gc2VsZi5idWlsZGVyLnJlY2lwZV9tb2RlbC5nZXRfdmFsdWUoaW1hZ2VfaXRlciwgc2VsZi5idWlsZGVyLnJlY2lwZV9tb2RlbC5DT0xfREVTQykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYubmFtZV9maWVsZF90ZW1wbGF0ZSA9ICIiCisKKyAgICAgICAgZGlhbG9nID0gU2F2ZUltYWdlRGlhbG9nKGltYWdlc19kaXIsIHNlbGYubmFtZV9maWVsZF90ZW1wbGF0ZSwgc2VsZi5kZXNjcmlwdGlvbl9maWVsZF90ZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgIlNhdmUgaW1hZ2UgcmVjaXBlIiwgc2VsZi5idWlsZGVyLCBndGsuRElBTE9HX01PREFMIHwgZ3RrLkRJQUxPR19ERVNUUk9ZX1dJVEhfUEFSRU5UKQorICAgICAgICByZXNwb25zZSA9IGRpYWxvZy5ydW4oKQorICAgICAgICBkaWFsb2cuZGVzdHJveSgpCisKKyAgICBkZWYgYnVpbGRfbmV3X2J1dHRvbl9jbGlja2VkX2NiKHNlbGYsIGJ1dHRvbik6CisgICAgICAgIHNlbGYuYnVpbGRlci5pbml0aWF0ZV9uZXdfYnVpbGRfYXN5bmMoKQorCisgICAgZGVmIGVkaXRfY29uZmlnX2J1dHRvbl9jbGlja2VkX2NiKHNlbGYsIGJ1dHRvbik6CisgICAgICAgIHNlbGYuYnVpbGRlci5zaG93X2NvbmZpZ3VyYXRpb24oKQorCisgICAgZGVmIGVkaXRfcGFja2FnZXNfYnV0dG9uX2NsaWNrZWRfY2Ioc2VsZiwgYnV0dG9uKToKKyAgICAgICAgc2VsZi5idWlsZGVyLnNob3dfcGFja2FnZXMoKQorCisgICAgZGVmIG15X2ltYWdlc19idXR0b25fY2xpY2tlZF9jYihzZWxmLCBidXR0b24pOgorICAgICAgICBzZWxmLmJ1aWxkZXIuc2hvd19sb2FkX215X2ltYWdlc19kaWFsb2coKQorCisgICAgZGVmIHNldHRpbmdzX2J1dHRvbl9jbGlja2VkX2NiKHNlbGYsIGJ1dHRvbik6CisgICAgICAgICMgQ3JlYXRlIGFuIGFkdmFuY2VkIHNldHRpbmdzIGRpYWxvZworICAgICAgICByZXNwb25zZSwgc2V0dGluZ3NfY2hhbmdlZCA9IHNlbGYuYnVpbGRlci5zaG93X3NpbXBsZV9zZXR0aW5nc19kaWFsb2coKQorICAgICAgICBpZiBub3QgcmVzcG9uc2U6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2V0dGluZ3NfY2hhbmdlZDoKKyAgICAgICAgICAgIHNlbGYuYnVpbGRlci5yZXBhcnNlX3Bvc3RfYWR2X3NldHRpbmdzKCkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9wYWNrYWdlc2VsZWN0aW9ucGFnZS5weSBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9wYWNrYWdlc2VsZWN0aW9ucGFnZS5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YzYyYjM2Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL3BhY2thZ2VzZWxlY3Rpb25wYWdlLnB5CkBAIC0wLDAgKzEsMzU1IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgQml0QmFrZSBHcmFwaGljYWwgR1RLIFVzZXIgSW50ZXJmYWNlCisjCisjIENvcHlyaWdodCAoQykgMjAxMiAgICAgICAgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgQXV0aG9yZWQgYnkgRG9uZ3hpYW8gWHUgPGRvbmd4aWFvLnh1QGludGVsLmNvbT4KKyMgQXV0aG9yZWQgYnkgU2hhbmUgV2FuZyA8c2hhbmUud2FuZ0BpbnRlbC5jb20+CisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitpbXBvcnQgZ3RrCitpbXBvcnQgZ2xpYgorZnJvbSBiYi51aS5jcnVtYnMuaG9iY29sb3IgaW1wb3J0IEhvYkNvbG9ycworZnJvbSBiYi51aS5jcnVtYnMuaG9id2lkZ2V0IGltcG9ydCBIb2JWaWV3VGFibGUsIEhvYk5vdGVib29rLCBIb2JBbHRCdXR0b24sIEhvYkJ1dHRvbgorZnJvbSBiYi51aS5jcnVtYnMuaG9ibGlzdG1vZGVsIGltcG9ydCBQYWNrYWdlTGlzdE1vZGVsCitmcm9tIGJiLnVpLmNydW1icy5ob2JwYWdlcyBpbXBvcnQgSG9iUGFnZQorCisjCisjIFBhY2thZ2VTZWxlY3Rpb25QYWdlCisjCitjbGFzcyBQYWNrYWdlU2VsZWN0aW9uUGFnZSAoSG9iUGFnZSk6CisKKyAgICBwYWdlcyA9IFsKKyAgICAgICAgeworICAgICAgICAgJ25hbWUnICAgICAgOiAnSW5jbHVkZWQgcGFja2FnZXMnLAorICAgICAgICAgJ3Rvb2x0aXAnICAgOiAnVGhlIHBhY2thZ2VzIGN1cnJlbnRseSBpbmNsdWRlZCBmb3IgeW91ciBpbWFnZScsCisgICAgICAgICAnZmlsdGVyJyAgICA6IHsgUGFja2FnZUxpc3RNb2RlbC5DT0xfSU5DIDogW1RydWVdIH0sCisgICAgICAgICAnc2VhcmNoJyAgICA6ICdTZWFyY2ggcGFja2FnZXMgYnkgbmFtZScsCisgICAgICAgICAnc2VhcmNodGlwJyA6ICdFbnRlciBhIHBhY2thZ2UgbmFtZSB0byBmaW5kIGl0JywKKyAgICAgICAgICdjb2x1bW5zJyAgIDogW3sKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9uYW1lJyA6ICdQYWNrYWdlIG5hbWUnLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX2lkJyAgIDogUGFja2FnZUxpc3RNb2RlbC5DT0xfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9zdHlsZSc6ICd0ZXh0JywKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9taW4nICA6IDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9tYXgnICA6IDMwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgJ2V4cGFuZCcgICA6ICdUcnVlJworICAgICAgICAgICAgICAgICAgICAgIH0sIHsKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9uYW1lJyA6ICdTaXplJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9pZCcgICA6IFBhY2thZ2VMaXN0TW9kZWwuQ09MX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfc3R5bGUnOiAndGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbWluJyAgOiAxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbWF4JyAgOiAzMDAsCisgICAgICAgICAgICAgICAgICAgICAgICdleHBhbmQnICAgOiAnVHJ1ZScKKyAgICAgICAgICAgICAgICAgICAgICB9LCB7CisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbmFtZScgOiAnUmVjaXBlJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9pZCcgICA6IFBhY2thZ2VMaXN0TW9kZWwuQ09MX1JDUCwKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9zdHlsZSc6ICd0ZXh0JywKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9taW4nICA6IDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9tYXgnICA6IDI1MCwKKyAgICAgICAgICAgICAgICAgICAgICAgJ2V4cGFuZCcgICA6ICdUcnVlJworICAgICAgICAgICAgICAgICAgICAgIH0sIHsKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9uYW1lJyA6ICdCcm91Z2h0IGluIGJ5ICgrb3RoZXJzKScsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfaWQnICAgOiBQYWNrYWdlTGlzdE1vZGVsLkNPTF9CSU5CLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX3N0eWxlJzogJ2JpbmInLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX21pbicgIDogMTAwLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX21heCcgIDogMzUwLAorICAgICAgICAgICAgICAgICAgICAgICAnZXhwYW5kJyAgIDogJ1RydWUnCisgICAgICAgICAgICAgICAgICAgICAgfSwgeworICAgICAgICAgICAgICAgICAgICAgICAnY29sX25hbWUnIDogJ0luY2x1ZGVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9pZCcgICA6IFBhY2thZ2VMaXN0TW9kZWwuQ09MX0lOQywKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9zdHlsZSc6ICdjaGVjayB0b2dnbGUnLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX21pbicgIDogMTAwLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX21heCcgIDogMTAwCisgICAgICAgICAgICAgICAgICAgICB9XQorICAgICAgICB9LCB7CisgICAgICAgICAnbmFtZScgICAgICA6ICdBbGwgcGFja2FnZXMnLAorICAgICAgICAgJ3Rvb2x0aXAnICAgOiAnQWxsIHBhY2thZ2VzIHRoYXQgaGF2ZSBiZWVuIGJ1aWx0JywKKyAgICAgICAgICdmaWx0ZXInICAgIDoge30sCisgICAgICAgICAnc2VhcmNoJyAgICA6ICdTZWFyY2ggcGFja2FnZXMgYnkgbmFtZScsCisgICAgICAgICAnc2VhcmNodGlwJyA6ICdFbnRlciBhIHBhY2thZ2UgbmFtZSB0byBmaW5kIGl0JywKKyAgICAgICAgICdjb2x1bW5zJyAgIDogW3sKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9uYW1lJyA6ICdQYWNrYWdlIG5hbWUnLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX2lkJyAgIDogUGFja2FnZUxpc3RNb2RlbC5DT0xfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9zdHlsZSc6ICd0ZXh0JywKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9taW4nICA6IDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9tYXgnICA6IDQwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgJ2V4cGFuZCcgICA6ICdUcnVlJworICAgICAgICAgICAgICAgICAgICAgIH0sIHsKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9uYW1lJyA6ICdTaXplJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9pZCcgICA6IFBhY2thZ2VMaXN0TW9kZWwuQ09MX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfc3R5bGUnOiAndGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbWluJyAgOiAxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbWF4JyAgOiA1MDAsCisgICAgICAgICAgICAgICAgICAgICAgICdleHBhbmQnICAgOiAnVHJ1ZScKKyAgICAgICAgICAgICAgICAgICAgICB9LCB7CisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbmFtZScgOiAnUmVjaXBlJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9pZCcgICA6IFBhY2thZ2VMaXN0TW9kZWwuQ09MX1JDUCwKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9zdHlsZSc6ICd0ZXh0JywKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9taW4nICA6IDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9tYXgnICA6IDI1MCwKKyAgICAgICAgICAgICAgICAgICAgICAgJ2V4cGFuZCcgICA6ICdUcnVlJworICAgICAgICAgICAgICAgICAgICAgIH0sIHsKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9uYW1lJyA6ICdJbmNsdWRlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfaWQnICAgOiBQYWNrYWdlTGlzdE1vZGVsLkNPTF9JTkMsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfc3R5bGUnOiAnY2hlY2sgdG9nZ2xlJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9taW4nICA6IDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9tYXgnICA6IDEwMAorICAgICAgICAgICAgICAgICAgICAgIH1dCisgICAgICAgIH0KKyAgICBdCisgICAgCisgICAgKElOQ0xVREVELAorICAgICBBTEwpID0gcmFuZ2UoMikKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgc3VwZXIoUGFja2FnZVNlbGVjdGlvblBhZ2UsIHNlbGYpLl9faW5pdF9fKGJ1aWxkZXIsICJFZGl0IHBhY2thZ2VzIikKKworICAgICAgICAjIHNldCBpbnZpc2libGUgbWVtYmVycworICAgICAgICBzZWxmLnJlY2lwZV9tb2RlbCA9IHNlbGYuYnVpbGRlci5yZWNpcGVfbW9kZWwKKyAgICAgICAgc2VsZi5wYWNrYWdlX21vZGVsID0gc2VsZi5idWlsZGVyLnBhY2thZ2VfbW9kZWwKKworICAgICAgICAjIGNyZWF0ZSB2aXN1YWwgZWxlbWVudHMKKyAgICAgICAgc2VsZi5jcmVhdGVfdmlzdWFsX2VsZW1lbnRzKCkKKworICAgIGRlZiBpbmNsdWRlZF9jbGlja2VkX2NiKHNlbGYsIGJ1dHRvbik6CisgICAgICAgIHNlbGYuaW5zLnNldF9jdXJyZW50X3BhZ2Uoc2VsZi5JTkNMVURFRCkKKworICAgIGRlZiBjcmVhdGVfdmlzdWFsX2VsZW1lbnRzKHNlbGYpOgorICAgICAgICBzZWxmLmxhYmVsID0gZ3RrLkxhYmVsKCJQYWNrYWdlcyBpbmNsdWRlZDogMFxuU2VsZWN0ZWQgcGFja2FnZXMgc2l6ZTogMCBNQiIpCisgICAgICAgIHNlbGYuZXZlbnRib3ggPSBzZWxmLmFkZF9vbnRvX3RvcF9iYXIoc2VsZi5sYWJlbCwgNzMpCisgICAgICAgIHNlbGYucGFja19zdGFydChzZWxmLmV2ZW50Ym94LCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIHNlbGYucGFja19zdGFydChzZWxmLmdyb3VwX2FsaWduLCBleHBhbmQ9VHJ1ZSwgZmlsbD1UcnVlKQorCisgICAgICAgICMgc2V0IHZpc2libGUgbWVtYmVycworICAgICAgICBzZWxmLmlucyA9IEhvYk5vdGVib29rKCkKKyAgICAgICAgc2VsZi50YWJsZXMgPSBbXSAjIHdlIG5lZWQgdG8gbW9kaWZ5IHRhYmxlIHdoZW4gdGhlIGRpYWxvZyBpcyBzaG93bgorCisgICAgICAgIHNlYXJjaF9uYW1lcyA9IFtdCisgICAgICAgIHNlYXJjaF90aXBzID0gW10KKyAgICAgICAgIyBhcHBlbmQgdGhlIHRhYgorICAgICAgICBmb3IgcGFnZSBpbiBzZWxmLnBhZ2VzOgorICAgICAgICAgICAgY29sdW1ucyA9IHBhZ2VbJ2NvbHVtbnMnXQorICAgICAgICAgICAgbmFtZSA9IHBhZ2VbJ25hbWUnXQorICAgICAgICAgICAgdGFiID0gSG9iVmlld1RhYmxlKGNvbHVtbnMsIG5hbWUpCisgICAgICAgICAgICBzZWFyY2hfbmFtZXMuYXBwZW5kKHBhZ2VbJ3NlYXJjaCddKQorICAgICAgICAgICAgc2VhcmNoX3RpcHMuYXBwZW5kKHBhZ2VbJ3NlYXJjaHRpcCddKQorICAgICAgICAgICAgZmlsdGVyID0gcGFnZVsnZmlsdGVyJ10KKyAgICAgICAgICAgIHNvcnRfbW9kZWwgPSBzZWxmLnBhY2thZ2VfbW9kZWwudHJlZV9tb2RlbChmaWx0ZXIsIGluaXRpYWw9VHJ1ZSkKKyAgICAgICAgICAgIHRhYi5zZXRfbW9kZWwoc29ydF9tb2RlbCkKKyAgICAgICAgICAgIHRhYi5jb25uZWN0KCJ0b2dnbGVkIiwgc2VsZi50YWJsZV90b2dnbGVkX2NiLCBuYW1lKQorICAgICAgICAgICAgdGFiLmNvbm5lY3QoImJ1dHRvbi1yZWxlYXNlLWV2ZW50Iiwgc2VsZi5idXR0b25fY2xpY2tfY2IpCisgICAgICAgICAgICB0YWIuY29ubmVjdCgiY2VsbC1mYWRlaW5vdXQtc3RvcHBlZCIsIHNlbGYuYWZ0ZXJfZmFkZW91dF9jaGVja2luX2luY2x1ZGUsIGZpbHRlcikKKyAgICAgICAgICAgIHNlbGYuaW5zLmFwcGVuZF9wYWdlKHRhYiwgcGFnZVsnbmFtZSddLCBwYWdlWyd0b29sdGlwJ10pCisgICAgICAgICAgICBzZWxmLnRhYmxlcy5hcHBlbmQodGFiKQorCisgICAgICAgIHNlbGYuaW5zLnNldF9lbnRyeShzZWFyY2hfbmFtZXMsIHNlYXJjaF90aXBzKQorICAgICAgICBzZWxmLmlucy5zZWFyY2guY29ubmVjdCgiY2hhbmdlZCIsIHNlbGYuc2VhcmNoX2VudHJ5X2NoYW5nZWQpCisKKyAgICAgICAgIyBhZGQgYWxsIGludG8gdGhlIGRpYWxvZworICAgICAgICBzZWxmLmJveF9ncm91cF9hcmVhLnBhY2tfc3RhcnQoc2VsZi5pbnMsIGV4cGFuZD1UcnVlLCBmaWxsPVRydWUpCisKKyAgICAgICAgc2VsZi5idXR0b25fYm94ID0gZ3RrLkhCb3goRmFsc2UsIDYpCisgICAgICAgIHNlbGYuYm94X2dyb3VwX2FyZWEucGFja19zdGFydChzZWxmLmJ1dHRvbl9ib3gsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKworICAgICAgICBzZWxmLmJ1aWxkX2ltYWdlX2J1dHRvbiA9IEhvYkJ1dHRvbignQnVpbGQgaW1hZ2UnKQorICAgICAgICAjc2VsZi5idWlsZF9pbWFnZV9idXR0b24uc2V0X3NpemVfcmVxdWVzdCgyMDUsIDQ5KQorICAgICAgICBzZWxmLmJ1aWxkX2ltYWdlX2J1dHRvbi5zZXRfdG9vbHRpcF90ZXh0KCJCdWlsZCB0YXJnZXQgaW1hZ2UiKQorICAgICAgICBzZWxmLmJ1aWxkX2ltYWdlX2J1dHRvbi5zZXRfZmxhZ3MoZ3RrLkNBTl9ERUZBVUxUKQorICAgICAgICBzZWxmLmJ1aWxkX2ltYWdlX2J1dHRvbi5ncmFiX2RlZmF1bHQoKQorICAgICAgICBzZWxmLmJ1aWxkX2ltYWdlX2J1dHRvbi5jb25uZWN0KCJjbGlja2VkIiwgc2VsZi5idWlsZF9pbWFnZV9jbGlja2VkX2NiKQorICAgICAgICBzZWxmLmJ1dHRvbl9ib3gucGFja19lbmQoc2VsZi5idWlsZF9pbWFnZV9idXR0b24sIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKworICAgICAgICBzZWxmLmJhY2tfYnV0dG9uID0gSG9iQWx0QnV0dG9uKCdDYW5jZWwnKQorICAgICAgICBzZWxmLmJhY2tfYnV0dG9uLmNvbm5lY3QoImNsaWNrZWQiLCBzZWxmLmJhY2tfYnV0dG9uX2NsaWNrZWRfY2IpCisgICAgICAgIHNlbGYuYnV0dG9uX2JveC5wYWNrX2VuZChzZWxmLmJhY2tfYnV0dG9uLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICBkZWYgc2VhcmNoX2VudHJ5X2NoYW5nZWQoc2VsZiwgZW50cnkpOgorICAgICAgICB0ZXh0ID0gZW50cnkuZ2V0X3RleHQoKQorICAgICAgICBpZiBzZWxmLmlucy5zZWFyY2hfZm9jdXM6CisgICAgICAgICAgICBzZWxmLmlucy5zZWFyY2hfZm9jdXMgPSBGYWxzZQorICAgICAgICBlbGlmIHNlbGYuaW5zLnBhZ2VfY2hhbmdlZDoKKyAgICAgICAgICAgIHNlbGYuaW5zLnBhZ2VfY2hhbmdlID0gRmFsc2UKKyAgICAgICAgICAgIHNlbGYuZmlsdGVyX3NlYXJjaChlbnRyeSkKKyAgICAgICAgZWxpZiB0ZXh0IG5vdCBpbiBzZWxmLmlucy5zZWFyY2hfbmFtZXM6CisgICAgICAgICAgICBzZWxmLmZpbHRlcl9zZWFyY2goZW50cnkpCisKKyAgICBkZWYgZmlsdGVyX3NlYXJjaChzZWxmLCBlbnRyeSk6CisgICAgICAgIHRleHQgPSBlbnRyeS5nZXRfdGV4dCgpCisgICAgICAgIGN1cnJlbnRfdGFiID0gc2VsZi5pbnMuZ2V0X2N1cnJlbnRfcGFnZSgpCisgICAgICAgIGZpbHRlciA9IHNlbGYucGFnZXNbY3VycmVudF90YWJdWydmaWx0ZXInXQorICAgICAgICBmaWx0ZXJbUGFja2FnZUxpc3RNb2RlbC5DT0xfTkFNRV0gPSB0ZXh0CisgICAgICAgIHNlbGYudGFibGVzW2N1cnJlbnRfdGFiXS5zZXRfbW9kZWwoc2VsZi5wYWNrYWdlX21vZGVsLnRyZWVfbW9kZWwoZmlsdGVyLCBzZWFyY2hfZGF0YT10ZXh0KSkKKyAgICAgICAgaWYgc2VsZi5wYWNrYWdlX21vZGVsLmZpbHRlcmVkX25iID09IDA6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5pbnMuZ2V0X250aF9wYWdlKGN1cnJlbnRfdGFiKS50b3BfYmFyOgorICAgICAgICAgICAgICAgIHNlbGYuaW5zLmdldF9udGhfcGFnZShjdXJyZW50X3RhYikuYWRkX25vX3Jlc3VsdF9iYXIoZW50cnkpCisgICAgICAgICAgICAgICAgc2VsZi5pbnMuZ2V0X250aF9wYWdlKGN1cnJlbnRfdGFiKS50b3BfYmFyLnNldF9ub19zaG93X2FsbChUcnVlKQorICAgICAgICAgICAgc2VsZi5pbnMuZ2V0X250aF9wYWdlKGN1cnJlbnRfdGFiKS50b3BfYmFyLnNob3coKQorICAgICAgICAgICAgc2VsZi5pbnMuZ2V0X250aF9wYWdlKGN1cnJlbnRfdGFiKS5zY3JvbGwuaGlkZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBzZWxmLmlucy5nZXRfbnRoX3BhZ2UoY3VycmVudF90YWIpLnRvcF9iYXI6CisgICAgICAgICAgICAgICAgc2VsZi5pbnMuZ2V0X250aF9wYWdlKGN1cnJlbnRfdGFiKS50b3BfYmFyLmhpZGUoKQorICAgICAgICAgICAgc2VsZi5pbnMuZ2V0X250aF9wYWdlKGN1cnJlbnRfdGFiKS5zY3JvbGwuc2hvdygpCisgICAgICAgIGlmIGVudHJ5LmdldF90ZXh0KCkgPT0gJyc6CisgICAgICAgICAgICBlbnRyeS5zZXRfaWNvbl9zZW5zaXRpdmUoZ3RrLkVOVFJZX0lDT05fU0VDT05EQVJZLCBGYWxzZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGVudHJ5LnNldF9pY29uX3NlbnNpdGl2ZShndGsuRU5UUllfSUNPTl9TRUNPTkRBUlksIFRydWUpCisKKyAgICBkZWYgYnV0dG9uX2NsaWNrX2NiKHNlbGYsIHdpZGdldCwgZXZlbnQpOgorICAgICAgICBwYXRoLCBjb2wgPSB3aWRnZXQudGFibGVfdHJlZS5nZXRfY3Vyc29yKCkKKyAgICAgICAgdHJlZV9tb2RlbCA9IHdpZGdldC50YWJsZV90cmVlLmdldF9tb2RlbCgpCisgICAgICAgIGlmIHBhdGggYW5kIGNvbC5nZXRfdGl0bGUoKSAhPSAnSW5jbHVkZWQnOiAjIGVsc2UgYWN0aXZhdGlvbiBpcyBsaWtlbHkgYSByZW1vdmFsCisgICAgICAgICAgICBwcm9wZXJ0aWVzID0geydiaW5iJzogJycgLCAnbmFtZSc6ICcnLCAnc2l6ZSc6JycsICdyZWNpcGUnOicnLCAnZmlsZXNfbGlzdCc6Jyd9CisgICAgICAgICAgICBwcm9wZXJ0aWVzWydiaW5iJ10gPSB0cmVlX21vZGVsLmdldF92YWx1ZSh0cmVlX21vZGVsLmdldF9pdGVyKHBhdGgpLCBQYWNrYWdlTGlzdE1vZGVsLkNPTF9CSU5CKQorICAgICAgICAgICAgcHJvcGVydGllc1snbmFtZSddID0gdHJlZV9tb2RlbC5nZXRfdmFsdWUodHJlZV9tb2RlbC5nZXRfaXRlcihwYXRoKSwgUGFja2FnZUxpc3RNb2RlbC5DT0xfTkFNRSkKKyAgICAgICAgICAgIHByb3BlcnRpZXNbJ3NpemUnXSA9IHRyZWVfbW9kZWwuZ2V0X3ZhbHVlKHRyZWVfbW9kZWwuZ2V0X2l0ZXIocGF0aCksIFBhY2thZ2VMaXN0TW9kZWwuQ09MX1NJWkUpCisgICAgICAgICAgICBwcm9wZXJ0aWVzWydyZWNpcGUnXSA9IHRyZWVfbW9kZWwuZ2V0X3ZhbHVlKHRyZWVfbW9kZWwuZ2V0X2l0ZXIocGF0aCksIFBhY2thZ2VMaXN0TW9kZWwuQ09MX1JDUCkKKyAgICAgICAgICAgIHByb3BlcnRpZXNbJ2ZpbGVzX2xpc3QnXSA9IHRyZWVfbW9kZWwuZ2V0X3ZhbHVlKHRyZWVfbW9kZWwuZ2V0X2l0ZXIocGF0aCksIFBhY2thZ2VMaXN0TW9kZWwuQ09MX0ZMSVNUKQorCisgICAgICAgICAgICBzZWxmLmJ1aWxkZXIuc2hvd19yZWNpcGVfcHJvcGVydHlfZGlhbG9nKHByb3BlcnRpZXMpCisKKyAgICBkZWYgb3Blbl9sb2dfY2xpY2tlZF9jYihzZWxmLCBidXR0b24sIGxvZ19maWxlKToKKyAgICAgICAgaWYgbG9nX2ZpbGU6CisgICAgICAgICAgICBsb2dfZmlsZSA9ICJmaWxlOi8vLyIgKyBsb2dfZmlsZQorICAgICAgICAgICAgZ3RrLnNob3dfdXJpKHNjcmVlbj1idXR0b24uZ2V0X3NjcmVlbigpLCB1cmk9bG9nX2ZpbGUsIHRpbWVzdGFtcD0wKQorCisgICAgZGVmIHNob3dfcGFnZShzZWxmLCBsb2dfZmlsZSk6CisgICAgICAgIGNoaWxkcmVuID0gc2VsZi5idXR0b25fYm94LmdldF9jaGlsZHJlbigpIG9yIFtdCisgICAgICAgIGZvciBjaGlsZCBpbiBjaGlsZHJlbjoKKyAgICAgICAgICAgIHNlbGYuYnV0dG9uX2JveC5yZW1vdmUoY2hpbGQpCisgICAgICAgICMgcmUtcGFja2VkIHRoZSBidXR0b25zIGFzIHJlcXVlc3QsIGFkZCB0aGUgJ29wZW4gbG9nJyBidXR0b24gaWYgYnVpbGQgc3VjY2VzcworICAgICAgICBzZWxmLmJ1dHRvbl9ib3gucGFja19lbmQoc2VsZi5idWlsZF9pbWFnZV9idXR0b24sIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgaWYgbG9nX2ZpbGU6CisgICAgICAgICAgICBvcGVuX2xvZ19idXR0b24gPSBIb2JBbHRCdXR0b24oIk9wZW4gbG9nIikKKyAgICAgICAgICAgIG9wZW5fbG9nX2J1dHRvbi5jb25uZWN0KCJjbGlja2VkIiwgc2VsZi5vcGVuX2xvZ19jbGlja2VkX2NiLCBsb2dfZmlsZSkKKyAgICAgICAgICAgIG9wZW5fbG9nX2J1dHRvbi5zZXRfdG9vbHRpcF90ZXh0KCJPcGVuIHRoZSBidWlsZCdzIGxvZyBmaWxlIikKKyAgICAgICAgICAgIHNlbGYuYnV0dG9uX2JveC5wYWNrX2VuZChvcGVuX2xvZ19idXR0b24sIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgc2VsZi5idXR0b25fYm94LnBhY2tfZW5kKHNlbGYuYmFja19idXR0b24sIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgc2VsZi5zaG93X2FsbCgpCisKKyAgICBkZWYgYnVpbGRfaW1hZ2VfY2xpY2tlZF9jYihzZWxmLCBidXR0b24pOgorICAgICAgICBzZWxmLmJ1aWxkZXIucGFyc2luZ193YXJuaW5ncyA9IFtdCisgICAgICAgIHNlbGYuYnVpbGRlci5idWlsZF9pbWFnZSgpCisKKyAgICBkZWYgcmVmcmVzaF90YWJsZXMoc2VsZik6CisgICAgICAgIHNlbGYuaW5zLnJlc2V0X2VudHJ5KHNlbGYuaW5zLnNlYXJjaCwgMCkKKyAgICAgICAgZm9yIHRhYiBpbiBzZWxmLnRhYmxlczoKKyAgICAgICAgICAgIGluZGV4ID0gc2VsZi50YWJsZXMuaW5kZXgodGFiKQorICAgICAgICAgICAgZmlsdGVyID0gc2VsZi5wYWdlc1tpbmRleF1bJ2ZpbHRlciddCisgICAgICAgICAgICB0YWIuc2V0X21vZGVsKHNlbGYucGFja2FnZV9tb2RlbC50cmVlX21vZGVsKGZpbHRlciwgaW5pdGlhbD1UcnVlKSkKKworICAgIGRlZiBiYWNrX2J1dHRvbl9jbGlja2VkX2NiKHNlbGYsIGJ1dHRvbik6CisgICAgICAgIGlmIHNlbGYuYnVpbGRlci5wcmV2aW91c19zdGVwID09ICBzZWxmLmJ1aWxkZXIuSU1BR0VfR0VORVJBVEVEOgorICAgICAgICAgICAgc2VsZi5idWlsZGVyLnJlc3RvcmVfaW5pdGlhbF9zZWxlY3RlZF9wYWNrYWdlcygpCisgICAgICAgICAgICBzZWxmLnJlZnJlc2hfc2VsZWN0aW9uKCkKKyAgICAgICAgICAgIHNlbGYuYnVpbGRlci5zaG93X2ltYWdlX2RldGFpbHMoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5idWlsZGVyLnNob3dfY29uZmlndXJhdGlvbigpCisgICAgICAgIHNlbGYucmVmcmVzaF90YWJsZXMoKQorCisgICAgZGVmIHJlZnJlc2hfc2VsZWN0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmJ1aWxkZXIuY29uZmlndXJhdGlvbi5zZWxlY3RlZF9wYWNrYWdlcyA9IHNlbGYucGFja2FnZV9tb2RlbC5nZXRfc2VsZWN0ZWRfcGFja2FnZXMoKQorICAgICAgICBzZWxmLmJ1aWxkZXIuY29uZmlndXJhdGlvbi51c2VyX3NlbGVjdGVkX3BhY2thZ2VzID0gc2VsZi5wYWNrYWdlX21vZGVsLmdldF91c2VyX3NlbGVjdGVkX3BhY2thZ2VzKCkKKyAgICAgICAgc2VsZWN0ZWRfcGFja2FnZXNfbnVtID0gbGVuKHNlbGYuYnVpbGRlci5jb25maWd1cmF0aW9uLnNlbGVjdGVkX3BhY2thZ2VzKQorICAgICAgICBzZWxlY3RlZF9wYWNrYWdlc19zaXplID0gc2VsZi5wYWNrYWdlX21vZGVsLmdldF9wYWNrYWdlc19zaXplKCkKKyAgICAgICAgc2VsZWN0ZWRfcGFja2FnZXNfc2l6ZV9zdHIgPSBIb2JQYWdlLl9zaXplX3RvX3N0cmluZyhzZWxlY3RlZF9wYWNrYWdlc19zaXplKQorCisgICAgICAgIGlmIHNlbGYuYnVpbGRlci5jb25maWd1cmF0aW9uLmltYWdlX3BhY2thZ2VzID09IHNlbGYuYnVpbGRlci5jb25maWd1cmF0aW9uLnNlbGVjdGVkX3BhY2thZ2VzOgorICAgICAgICAgICAgaW1hZ2VfdG90YWxfc2l6ZV9zdHIgPSBzZWxmLmJ1aWxkZXIuY29uZmlndXJhdGlvbi5pbWFnZV9zaXplCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpbWFnZV9vdmVyaGVhZF9mYWN0b3IgPSBzZWxmLmJ1aWxkZXIuY29uZmlndXJhdGlvbi5pbWFnZV9vdmVyaGVhZF9mYWN0b3IKKyAgICAgICAgICAgIGltYWdlX3Jvb3Rmc19zaXplID0gc2VsZi5idWlsZGVyLmNvbmZpZ3VyYXRpb24uaW1hZ2Vfcm9vdGZzX3NpemUgLyAxMDI0ICMgaW1hZ2Vfcm9vdGZzX3NpemUgaXMgS0IKKyAgICAgICAgICAgIGltYWdlX2V4dHJhX3NpemUgPSBzZWxmLmJ1aWxkZXIuY29uZmlndXJhdGlvbi5pbWFnZV9leHRyYV9zaXplIC8gMTAyNCAjIGltYWdlX2V4dHJhX3NpemUgaXMgS0IKKyAgICAgICAgICAgIGJhc2Vfc2l6ZSA9IGltYWdlX292ZXJoZWFkX2ZhY3RvciAqIHNlbGVjdGVkX3BhY2thZ2VzX3NpemUKKyAgICAgICAgICAgIGltYWdlX3RvdGFsX3NpemUgPSBtYXgoYmFzZV9zaXplLCBpbWFnZV9yb290ZnNfc2l6ZSkgKyBpbWFnZV9leHRyYV9zaXplCisgICAgICAgICAgICBpZiAienlwcGVyIiBpbiBzZWxmLmJ1aWxkZXIuY29uZmlndXJhdGlvbi5zZWxlY3RlZF9wYWNrYWdlczoKKyAgICAgICAgICAgICAgICBpbWFnZV90b3RhbF9zaXplICs9ICg1MTIwMCAqIDEwMjQpCisgICAgICAgICAgICBpbWFnZV90b3RhbF9zaXplX3N0ciA9IEhvYlBhZ2UuX3NpemVfdG9fc3RyaW5nKGltYWdlX3RvdGFsX3NpemUpCisKKyAgICAgICAgc2VsZi5sYWJlbC5zZXRfbGFiZWwoIlBhY2thZ2VzIGluY2x1ZGVkOiAlc1xuU2VsZWN0ZWQgcGFja2FnZXMgc2l6ZTogJXNcbkVzdGltYXRlZCBpbWFnZSBzaXplOiAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZF9wYWNrYWdlc19udW0sIHNlbGVjdGVkX3BhY2thZ2VzX3NpemVfc3RyLCBpbWFnZV90b3RhbF9zaXplX3N0cikpCisgICAgICAgIHNlbGYuaW5zLnNob3dfaW5kaWNhdG9yX2ljb24oIkluY2x1ZGVkIHBhY2thZ2VzIiwgc2VsZWN0ZWRfcGFja2FnZXNfbnVtKQorCisgICAgZGVmIHRvZ2dsZV9pdGVtX2lkbGVfY2Ioc2VsZiwgcGF0aCwgdmlld190cmVlLCBjZWxsLCBwYWdlbmFtZSk6CisgICAgICAgIGlmIG5vdCBzZWxmLnBhY2thZ2VfbW9kZWwucGF0aF9pbmNsdWRlZChwYXRoKToKKyAgICAgICAgICAgIHNlbGYucGFja2FnZV9tb2RlbC5pbmNsdWRlX2l0ZW0oaXRlbV9wYXRoPXBhdGgsIGJpbmI9IlVzZXIgU2VsZWN0ZWQiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5wcmVfZmFkZW91dF9jaGVja291dF9pbmNsdWRlKHZpZXdfdHJlZSkKKyAgICAgICAgICAgIHNlbGYucGFja2FnZV9tb2RlbC5leGNsdWRlX2l0ZW0oaXRlbV9wYXRoPXBhdGgpCisgICAgICAgICAgICBzZWxmLnJlbmRlcl9mYWRlb3V0KHZpZXdfdHJlZSwgY2VsbCkKKworICAgICAgICBzZWxmLnJlZnJlc2hfc2VsZWN0aW9uKCkKKyAgICAgICAgaWYgbm90IHNlbGYuYnVpbGRlci5jdXN0b21pemVkOgorICAgICAgICAgICAgc2VsZi5idWlsZGVyLmN1c3RvbWl6ZWQgPSBUcnVlCisgICAgICAgICAgICBzZWxmLmJ1aWxkZXIuc2V0X2Jhc2VfaW1hZ2UoKQorICAgICAgICAgICAgc2VsZi5idWlsZGVyLmNvbmZpZ3VyYXRpb24uc2VsZWN0ZWRfaW1hZ2UgPSBzZWxmLnJlY2lwZV9tb2RlbC5fX2N1c3RvbV9pbWFnZV9fCisgICAgICAgICAgICBzZWxmLmJ1aWxkZXIucmNwcGtnbGlzdF9wb3B1bGF0ZWQoKQorCisgICAgICAgIHNlbGYuYnVpbGRlci53aW5kb3dfc2Vuc2l0aXZlKFRydWUpCisgICAgICAgIHZpZXdfbW9kZWwgPSB2aWV3X3RyZWUuZ2V0X21vZGVsKCkKKyAgICAgICAgdnBhdGggPSBzZWxmLnBhY2thZ2VfbW9kZWwuY29udmVydF9wYXRoX3RvX3ZwYXRoKHZpZXdfbW9kZWwsIHBhdGgpCisgICAgICAgIHZpZXdfdHJlZS5zZXRfY3Vyc29yKHZwYXRoKQorCisgICAgZGVmIHRhYmxlX3RvZ2dsZWRfY2Ioc2VsZiwgdGFibGUsIGNlbGwsIHZpZXdfcGF0aCwgdG9nZ2xlZF9jb2x1bW5pZCwgdmlld190cmVlLCBwYWdlbmFtZSk6CisgICAgICAgICMgQ2xpY2sgdG8gaW5jbHVkZSBhIHBhY2thZ2UKKyAgICAgICAgc2VsZi5idWlsZGVyLndpbmRvd19zZW5zaXRpdmUoRmFsc2UpCisgICAgICAgIHZpZXdfbW9kZWwgPSB2aWV3X3RyZWUuZ2V0X21vZGVsKCkKKyAgICAgICAgcGF0aCA9IHNlbGYucGFja2FnZV9tb2RlbC5jb252ZXJ0X3ZwYXRoX3RvX3BhdGgodmlld19tb2RlbCwgdmlld19wYXRoKQorICAgICAgICBnbGliLmlkbGVfYWRkKHNlbGYudG9nZ2xlX2l0ZW1faWRsZV9jYiwgcGF0aCwgdmlld190cmVlLCBjZWxsLCBwYWdlbmFtZSkKKworICAgIGRlZiBwcmVfZmFkZW91dF9jaGVja291dF9pbmNsdWRlKHNlbGYsIHRyZWUpOgorICAgICAgICAjYWZ0ZXIgdGhlIGZhZGVvdXQgdGhlIHRhYmxlIHdpbGwgYmUgc29ydGVkIGFzIGJlZm9yZQorICAgICAgICBzZWxmLnNvcnRfY29sdW1uX2lkID0gc2VsZi5wYWNrYWdlX21vZGVsLnNvcnRfY29sdW1uX2lkCisgICAgICAgIHNlbGYuc29ydF9vcmRlciA9IHNlbGYucGFja2FnZV9tb2RlbC5zb3J0X29yZGVyCisKKyAgICAgICAgc2VsZi5wYWNrYWdlX21vZGVsLnJlc3luY19mYWRlb3V0X2NvbHVtbihzZWxmLnBhY2thZ2VfbW9kZWwuZ2V0X2l0ZXJfZmlyc3QoKSkKKyAgICAgICAgIyBDaGVjayBvdXQgYSBtb2RlbCB3aGljaCBiYXNlIG9uIHRoZSBjb2x1bW4gQ09MX0ZBREVfSU5DLAorICAgICAgICAjIGl0J3Mgc2F2ZSB0aGUgcHJldiBzdGF0ZSBvZiBjb2x1bW4gQ09MX0lOQyBiZWZvcmUgZG8gZXhjbHVkZV9pdGVtCisgICAgICAgIGZpbHRlciA9IHsgUGFja2FnZUxpc3RNb2RlbC5DT0xfRkFERV9JTkMgIDogW1RydWVdfQorICAgICAgICBuZXdfbW9kZWwgPSBzZWxmLnBhY2thZ2VfbW9kZWwudHJlZV9tb2RlbChmaWx0ZXIsIGV4Y2x1ZGVkX2l0ZW1zX2FoZWFkPVRydWUpCisgICAgICAgIHRyZWUuc2V0X21vZGVsKG5ld19tb2RlbCkKKyAgICAgICAgdHJlZS5leHBhbmRfYWxsKCkKKworICAgIGRlZiBnZXRfZXhjbHVkZWRfcm93cyhzZWxmLCB0b19yZW5kZXJfY2VsbHMsIG1vZGVsLCBpdCk6CisgICAgICAgIHdoaWxlIGl0OgorICAgICAgICAgICAgcGF0aCA9IG1vZGVsLmdldF9wYXRoKGl0KQorICAgICAgICAgICAgcHJldl9jZWxsX2lzX2FjdGl2ZSA9IG1vZGVsLmdldF92YWx1ZShpdCwgUGFja2FnZUxpc3RNb2RlbC5DT0xfRkFERV9JTkMpCisgICAgICAgICAgICBjdXJyX2NlbGxfaXNfYWN0aXZlID0gbW9kZWwuZ2V0X3ZhbHVlKGl0LCBQYWNrYWdlTGlzdE1vZGVsLkNPTF9JTkMpCisgICAgICAgICAgICBpZiAocHJldl9jZWxsX2lzX2FjdGl2ZSA9PSBUcnVlKSBhbmQgKGN1cnJfY2VsbF9pc19hY3RpdmUgPT0gRmFsc2UpOgorICAgICAgICAgICAgICAgIHRvX3JlbmRlcl9jZWxscy5hcHBlbmQocGF0aCkKKyAgICAgICAgICAgIGlmIG1vZGVsLml0ZXJfaGFzX2NoaWxkKGl0KToKKyAgICAgICAgICAgICAgICBzZWxmLmdldF9leGNsdWRlZF9yb3dzKHRvX3JlbmRlcl9jZWxscywgbW9kZWwsIG1vZGVsLml0ZXJfY2hpbGRyZW4oaXQpKQorICAgICAgICAgICAgaXQgPSBtb2RlbC5pdGVyX25leHQoaXQpCisKKyAgICAgICAgcmV0dXJuIHRvX3JlbmRlcl9jZWxscworCisgICAgZGVmIHJlbmRlcl9mYWRlb3V0KHNlbGYsIHRyZWUsIGNlbGwpOgorICAgICAgICBpZiAobm90IGNlbGwpIG9yIChub3QgdHJlZSk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgdG9fcmVuZGVyX2NlbGxzID0gW10KKyAgICAgICAgdmlld19tb2RlbCA9IHRyZWUuZ2V0X21vZGVsKCkKKyAgICAgICAgc2VsZi5nZXRfZXhjbHVkZWRfcm93cyh0b19yZW5kZXJfY2VsbHMsIHZpZXdfbW9kZWwsIHZpZXdfbW9kZWwuZ2V0X2l0ZXJfZmlyc3QoKSkKKworICAgICAgICBjZWxsLmZhZGVvdXQodHJlZSwgMTAwMCwgdG9fcmVuZGVyX2NlbGxzKQorCisgICAgZGVmIGFmdGVyX2ZhZGVvdXRfY2hlY2tpbl9pbmNsdWRlKHNlbGYsIHRhYmxlLCBjdHJsLCBjZWxsLCB0cmVlLCBmaWx0ZXIpOgorICAgICAgICBzZWxmLnBhY2thZ2VfbW9kZWwuc29ydF9jb2x1bW5faWQgPSBzZWxmLnNvcnRfY29sdW1uX2lkCisgICAgICAgIHNlbGYucGFja2FnZV9tb2RlbC5zb3J0X29yZGVyID0gc2VsZi5zb3J0X29yZGVyCisgICAgICAgIHRyZWUuc2V0X21vZGVsKHNlbGYucGFja2FnZV9tb2RlbC50cmVlX21vZGVsKGZpbHRlcikpCisgICAgICAgIHRyZWUuZXhwYW5kX2FsbCgpCisKKyAgICBkZWYgc2V0X3BhY2thZ2VzX2N1cnJfdGFiKHNlbGYsIGN1cnJfcGFnZSk6CisgICAgICAgIHNlbGYuaW5zLnNldF9jdXJyZW50X3BhZ2UoY3Vycl9wYWdlKQorCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvcGVyc2lzdGVudHRvb2x0aXAucHkgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvcGVyc2lzdGVudHRvb2x0aXAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI3YzE5NAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9wZXJzaXN0ZW50dG9vbHRpcC5weQpAQCAtMCwwICsxLDE4NiBAQAorIworIyBCaXRCYWtlIEdyYXBoaWNhbCBHVEsgVXNlciBJbnRlcmZhY2UKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEyICAgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgQXV0aG9yZWQgYnkgSm9zaHVhIExvY2sgPGpvc2hAbGludXguaW50ZWwuY29tPgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworaW1wb3J0IGdvYmplY3QKK2ltcG9ydCBndGsKK3RyeToKKyAgICBpbXBvcnQgZ2NvbmYKK2V4Y2VwdDoKKyAgICBwYXNzCisKK2NsYXNzIFBlcnNpc3RlbnRUb29sdGlwKGd0ay5XaW5kb3cpOgorICAgICIiIgorICAgIEEgdG9vbHRpcCB3aGljaCBwZXJzaXN0cyBvbmNlIHNob3duIHVudGlsIHRoZSB1c2VyIGRpc21pc3NlcyBpdCB3aXRoIHRoZSBFc2MKKyAgICBrZXkgb3IgYnkgY2xpY2tpbmcgdGhlIGNsb3NlIGJ1dHRvbi4KKworICAgICMgRklYTUU6IHRoZSBQZXJzaXN0ZW50VG9vbHRpcCBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgYW55d2hlcmUgb2ZmCisgICAgIyBpdC4gV2UgY2FuJ3QgZG8gdGhpcyB3aXRoIGZvY3VzLW91dC1ldmVudCBiZWN1YXNlIG1vZGFsIGVuc3VyZXMgd2UgaGF2ZSBmb2N1cz8KKworICAgIG1hcmt1cDogc29tZSBQYW5nbyB0ZXh0IG1hcmt1cCB0byBkaXNwbGF5IGluIHRoZSB0b29sdGlwCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hcmt1cCwgcGFyZW50X3dpbj1Ob25lKToKKyAgICAgICAgZ3RrLldpbmRvdy5fX2luaXRfXyhzZWxmLCBndGsuV0lORE9XX1BPUFVQKQorCisgICAgICAgICMgSW5oZXJpdCB0aGUgc3lzdGVtIHRoZW1lIGZvciBhIHRvb2x0aXAKKyAgICAgICAgc3R5bGUgPSBndGsucmNfZ2V0X3N0eWxlX2J5X3BhdGhzKGd0ay5zZXR0aW5nc19nZXRfZGVmYXVsdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2d0ay10b29sdGlwJywgJ2d0ay10b29sdGlwJywgZ29iamVjdC5UWVBFX05PTkUpCisgICAgICAgIHNlbGYuc2V0X3N0eWxlKHN0eWxlKQorCisgICAgICAgICMgVGhlIHBsYWNlbWVudCBvZiB0aGUgY2xvc2UgYnV0dG9uIG9uIHRoZSB0aXAgc2hvdWxkIHJlZmxlY3QgaG93IHRoZQorICAgICAgICAjIHdpbmRvdyBtYW5hZ2VyIG9mIHRoZSB1c2VycyBzeXN0ZW0gcGxhY2VzIGNsb3NlIGJ1dHRvbnMuIFRyeSB0byByZWFkCisgICAgICAgICMgdGhlIG1ldGFjaXR5IGdjb25mIGtleSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgY2xvc2UgYnV0dG9uIGlzIG9uIHRoZQorICAgICAgICAjIGxlZnQgb3IgdGhlIHJpZ2h0LgorICAgICAgICAjIEluIHRoZSBjYXNlIHRoYXQgd2UgY2FuJ3QgZGV0ZXJtaW5lIHRoZSB1c2VycyBjb25maWd1cmF0aW9uIHdlIGRlZmF1bHQKKyAgICAgICAgIyB0byBjbG9zZSBidXR0b25zIGJlaW5nIG9uIHRoZSByaWdodC4KKyAgICAgICAgX19idXR0b25fcmlnaHQgPSBUcnVlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNsaWVudCA9IGdjb25mLmNsaWVudF9nZXRfZGVmYXVsdCgpCisgICAgICAgICAgICBvcmRlciA9IGNsaWVudC5nZXRfc3RyaW5nKCIvYXBwcy9tZXRhY2l0eS9nZW5lcmFsL2J1dHRvbl9sYXlvdXQiKQorICAgICAgICAgICAgaWYgb3JkZXIgYW5kIG9yZGVyLmVuZHN3aXRoKCI6Iik6CisgICAgICAgICAgICAgICAgX19idXR0b25fcmlnaHQgPSBGYWxzZQorICAgICAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgICMgV2UgbmVlZCB0byBlbnN1cmUgd2UncmUgb25seSBzaG93biBvbmNlCisgICAgICAgIHNlbGYuc2hvd24gPSBGYWxzZQorCisgICAgICAgICMgV2UgZG9uJ3Qgd2FudCBhbnkgV00gZGVjb3JhdGlvbnMKKyAgICAgICAgc2VsZi5zZXRfZGVjb3JhdGVkKEZhbHNlKQorICAgICAgICAjIFdlIGRvbid0IHdhbnQgdG8gc2hvdyBpbiB0aGUgdGFza2JhciBvciB3aW5kb3cgc3dpdGNoZXIKKyAgICAgICAgc2VsZi5zZXRfc2tpcF9wYWdlcl9oaW50KFRydWUpCisgICAgICAgIHNlbGYuc2V0X3NraXBfdGFza2Jhcl9oaW50KFRydWUpCisgICAgICAgICMgV2UgbXVzdCBiZSBtb2RhbCB0byBlbnN1cmUgd2UgZ3JhYiBmb2N1cyB3aGVuIHByZXNlbnRlZCBmcm9tIGEgZ3RrLkRpYWxvZworICAgICAgICBzZWxmLnNldF9tb2RhbChUcnVlKQorCisgICAgICAgIHNlbGYuc2V0X2JvcmRlcl93aWR0aCgwKQorICAgICAgICBzZWxmLnNldF9wb3NpdGlvbihndGsuV0lOX1BPU19NT1VTRSkKKyAgICAgICAgc2VsZi5zZXRfb3BhY2l0eSgwLjk1KQorCisgICAgICAgICMgRW5zdXJlIGEgcmVhc29uYWJsZSBtaW5pbXVtIHNpemUKKyAgICAgICAgc2VsZi5zZXRfZ2VvbWV0cnlfaGludHMoc2VsZiwgMTAwLCA1MCkKKworICAgICAgICAjIFNldCB0aGlzIHdpbmRvdyBhcyBhIHRyYW5zaWVudCB3aW5kb3cgZm9yIHBhcmVudChtYWluIHdpbmRvdykKKyAgICAgICAgaWYgcGFyZW50X3dpbjoKKyAgICAgICAgICAgIHNlbGYuc2V0X3RyYW5zaWVudF9mb3IocGFyZW50X3dpbikKKyAgICAgICAgICAgIHNlbGYuc2V0X2Rlc3Ryb3lfd2l0aF9wYXJlbnQoVHJ1ZSkKKyAgICAgICAgIyBEcmF3IG91ciBsYWJlbCBhbmQgY2xvc2UgYnV0dG9ucworICAgICAgICBoYm94ID0gZ3RrLkhCb3goRmFsc2UsIDApCisgICAgICAgIGhib3guc2hvdygpCisgICAgICAgIHNlbGYuYWRkKGhib3gpCisKKyAgICAgICAgaW1nID0gZ3RrLkltYWdlKCkKKyAgICAgICAgaW1nLnNldF9mcm9tX3N0b2NrKGd0ay5TVE9DS19DTE9TRSwgZ3RrLklDT05fU0laRV9CVVRUT04pCisKKyAgICAgICAgc2VsZi5idXR0b24gPSBndGsuQnV0dG9uKCkKKyAgICAgICAgc2VsZi5idXR0b24uc2V0X2ltYWdlKGltZykKKyAgICAgICAgc2VsZi5idXR0b24uY29ubmVjdCgiY2xpY2tlZCIsIHNlbGYuX2Rpc21pc3NfY2IpCisgICAgICAgIHNlbGYuYnV0dG9uLnNldF9mbGFncyhndGsuQ0FOX0RFRkFVTFQpCisgICAgICAgIHNlbGYuYnV0dG9uLmdyYWJfZm9jdXMoKQorICAgICAgICBzZWxmLmJ1dHRvbi5zaG93KCkKKyAgICAgICAgdmJveCA9IGd0ay5WQm94KEZhbHNlLCAwKQorICAgICAgICB2Ym94LnNob3coKQorICAgICAgICB2Ym94LnBhY2tfc3RhcnQoc2VsZi5idXR0b24sIEZhbHNlLCBGYWxzZSwgMCkKKyAgICAgICAgaWYgX19idXR0b25fcmlnaHQ6CisgICAgICAgICAgICBoYm94LnBhY2tfZW5kKHZib3gsIFRydWUsIFRydWUsIDApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBoYm94LnBhY2tfc3RhcnQodmJveCwgVHJ1ZSwgVHJ1ZSwgMCkKKworICAgICAgICBzZWxmLnNldF9kZWZhdWx0KHNlbGYuYnV0dG9uKQorCisgICAgICAgIGJpbiA9IGd0ay5IQm94KFRydWUsIDYpCisgICAgICAgIGJpbi5zZXRfYm9yZGVyX3dpZHRoKDYpCisgICAgICAgIGJpbi5zaG93KCkKKyAgICAgICAgc2VsZi5sYWJlbCA9IGd0ay5MYWJlbCgpCisgICAgICAgIHNlbGYubGFiZWwuc2V0X2xpbmVfd3JhcChUcnVlKQorICAgICAgICAjIFdlIHdhbnQgdG8gbWF0Y2ggdGhlIGNvbG91cnMgb2YgdGhlIG5vcm1hbCB0b29sdGlwcywgYXMgZGljdGF0ZWQgYnkKKyAgICAgICAgIyB0aGUgdXNlcnMgZ3RrKy0yLjAgdGhlbWUsIHdoZXJldmVyIHBvc3NpYmxlIC0gb24gc29tZSBzeXN0ZW1zIHRoaXMKKyAgICAgICAgIyByZXF1aXJlcyBleHBsaWNpdGx5IHNldHRpbmcgYSBmZ19jb2xvciBmb3IgdGhlIGxhYmVsIHdoaWNoIG1hdGNoZXMgdGhlCisgICAgICAgICMgdG9vbHRpcF9mZ19jb2xvcgorICAgICAgICBzZXR0aW5ncyA9IGd0ay5zZXR0aW5nc19nZXRfZGVmYXVsdCgpCisgICAgICAgIGNvbG91cnMgPSBzZXR0aW5ncy5nZXRfcHJvcGVydHkoJ2d0ay1jb2xvci1zY2hlbWUnKS5zcGxpdCgnXG4nKQorICAgICAgICAjIHJlbW92ZSBhbnkgZW1wdHkgbGluZXMsIHRoZXJlJ3MgbGlrZWx5IHRvIGJlIGEgdHJhaWxpbmcgb25lIGFmdGVyCisgICAgICAgICMgY2FsbGluZyBzcGxpdCBvbiBhIGRpY3Rpb25hcnktbGlrZSBzdHJpbmcKKyAgICAgICAgY29sb3VycyA9IGZpbHRlcihOb25lLCBjb2xvdXJzKQorICAgICAgICBmb3IgY29sIGluIGNvbG91cnM6CisgICAgICAgICAgICBpdGVtLCB2YWwgPSBjb2wuc3BsaXQoJzogJykKKyAgICAgICAgICAgIGlmIGl0ZW0gPT0gJ3Rvb2x0aXBfZmdfY29sb3InOgorICAgICAgICAgICAgICAgIHN0eWxlID0gc2VsZi5sYWJlbC5nZXRfc3R5bGUoKQorICAgICAgICAgICAgICAgIHN0eWxlLmZnW2d0ay5TVEFURV9OT1JNQUxdID0gZ3RrLmdkay5jb2xvcl9wYXJzZSh2YWwpCisgICAgICAgICAgICAgICAgc2VsZi5sYWJlbC5zZXRfc3R5bGUoc3R5bGUpCisgICAgICAgICAgICAgICAgYnJlYWsgIyB3ZSBvbmx5IGNhcmUgZm9yIHRoZSB0b29sdGlwX2ZnX2NvbG9yCisKKyAgICAgICAgc2VsZi5sYWJlbC5zZXRfbWFya3VwKG1hcmt1cCkKKyAgICAgICAgc2VsZi5sYWJlbC5zaG93KCkKKyAgICAgICAgYmluLmFkZChzZWxmLmxhYmVsKQorICAgICAgICBoYm94LnBhY2tfZW5kKGJpbiwgVHJ1ZSwgVHJ1ZSwgNikKKworICAgICAgICAjIGFkZCB0aGUgb3JpZ2luYWwgVVJMIGRpc3BsYXkgZm9yIHVzZXIgcmVmZXJlbmNlCisgICAgICAgIGlmICdhIGhyZWYnIGluIG1hcmt1cDoKKyAgICAgICAgICAgIGhib3guc2V0X3Rvb2x0aXBfdGV4dChzZWxmLmdldF9tYXJrdXBfdXJsKG1hcmt1cCkpCisgICAgICAgIGhib3guc2hvdygpCisKKyAgICAgICAgc2VsZi5jb25uZWN0KCJrZXktcHJlc3MtZXZlbnQiLCBzZWxmLl9jYXRjaF9lc2NfY2IpCisKKyAgICAiIiIKKyAgICBDYWxsYmFjayB3aGVuIHRoZSBQZXJzaXN0ZW50VG9vbHRpcCdzIGNsb3NlIGJ1dHRvbiBpcyBjbGlja2VkLgorICAgIEhpZGVzIHRoZSBQZXJzaXN0ZW50VG9vbHRpcC4KKyAgICAiIiIKKyAgICBkZWYgX2Rpc21pc3NfY2Ioc2VsZiwgYnV0dG9uKToKKyAgICAgICAgc2VsZi5oaWRlKCkKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgICIiIgorICAgIENhbGxiYWNrIHdoZW4gdGhlIEVzYyBrZXkgaXMgZGV0ZWN0ZWQuIEhpZGVzIHRoZSBQZXJzaXN0ZW50VG9vbHRpcC4KKyAgICAiIiIKKyAgICBkZWYgX2NhdGNoX2VzY19jYihzZWxmLCB3aWRnZXQsIGV2ZW50KToKKyAgICAgICAga2V5bmFtZSA9IGd0ay5nZGsua2V5dmFsX25hbWUoZXZlbnQua2V5dmFsKQorICAgICAgICBpZiBrZXluYW1lID09ICJFc2NhcGUiOgorICAgICAgICAgICAgc2VsZi5oaWRlKCkKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgICIiIgorICAgIENhbGxlZCB0byBwcmVzZW50IHRoZSBQZXJzaXN0ZW50VG9vbHRpcC4KKyAgICBPdmVycmlkZXMgdGhlIHN1cGVyY2xhc3NlcyBzaG93KCkgbWV0aG9kIHRvIGluY2x1ZGUgc3RhdGUgdHJhY2tpbmcuCisgICAgIiIiCisgICAgZGVmIHNob3coc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLnNob3duOgorICAgICAgICAgICAgc2VsZi5zaG93biA9IFRydWUKKyAgICAgICAgICAgIGd0ay5XaW5kb3cuc2hvdyhzZWxmKQorCisgICAgIiIiCisgICAgQ2FsbGVkIHRvIGhpZGUgdGhlIFBlcnNpc3RlbnRUb29sdGlwLgorICAgIE92ZXJyaWRlcyB0aGUgc3VwZXJjbGFzc2VzIGhpZGUoKSBtZXRob2QgdG8gaW5jbHVkZSBzdGF0ZSB0cmFja2luZy4KKyAgICAiIiIKKyAgICBkZWYgaGlkZShzZWxmKToKKyAgICAgICAgc2VsZi5zaG93biA9IEZhbHNlCisgICAgICAgIGd0ay5XaW5kb3cuaGlkZShzZWxmKQorCisgICAgIiIiCisgICAgQ2FsbGVkIHRvIGdldCB0aGUgaHlwZXJsaW5rIFVSTCBmcm9tIG1hcmt1cCB0ZXh0LgorICAgICIiIgorICAgIGRlZiBnZXRfbWFya3VwX3VybChzZWxmLCBtYXJrdXApOgorICAgICAgICB1cmwgPSAiaHR0cDoiCisgICAgICAgIGlmIG1hcmt1cCBhbmQgdHlwZShtYXJrdXApID09IHN0cjoKKyAgICAgICAgICAgIHMgPSBtYXJrdXAKKyAgICAgICAgICAgIGlmICdodHRwOicgaW4gczoKKyAgICAgICAgICAgICAgICBpbXBvcnQgcmUKKyAgICAgICAgICAgICAgICB1cmwgPSByZS5zZWFyY2goJyhodHRwOlteLFxcICJdKyknLCBzKS5ncm91cCgwKQorCisgICAgICAgIHJldHVybiB1cmwKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9wcm9ncmVzcy5weSBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9wcm9ncmVzcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDI4YTExCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL3Byb2dyZXNzLnB5CkBAIC0wLDAgKzEsMjMgQEAKK2ltcG9ydCBndGsKKworY2xhc3MgUHJvZ3Jlc3NCYXIoZ3RrLkRpYWxvZyk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcmVudCk6CisKKyAgICAgICAgZ3RrLkRpYWxvZy5fX2luaXRfXyhzZWxmLCBmbGFncz0oZ3RrLkRJQUxPR19NT0RBTCB8IGd0ay5ESUFMT0dfREVTVFJPWV9XSVRIX1BBUkVOVCkpCisgICAgICAgIHNlbGYuc2V0X3RpdGxlKCJQYXJzaW5nIG1ldGFkYXRhLCBwbGVhc2Ugd2FpdC4uLiIpCisgICAgICAgIHNlbGYuc2V0X2RlZmF1bHRfc2l6ZSg1MDAsIDApCisgICAgICAgIHNlbGYuc2V0X3RyYW5zaWVudF9mb3IocGFyZW50KQorICAgICAgICBzZWxmLnByb2dyZXNzID0gZ3RrLlByb2dyZXNzQmFyKCkKKyAgICAgICAgc2VsZi52Ym94LnBhY2tfc3RhcnQoc2VsZi5wcm9ncmVzcykKKyAgICAgICAgc2VsZi5zaG93X2FsbCgpCisKKyAgICBkZWYgc2V0X3RleHQoc2VsZiwgbXNnKToKKyAgICAgICAgc2VsZi5wcm9ncmVzcy5zZXRfdGV4dChtc2cpCisKKyAgICBkZWYgdXBkYXRlKHNlbGYsIHgsIHkpOgorICAgICAgICBzZWxmLnByb2dyZXNzLnNldF9mcmFjdGlvbihmbG9hdCh4KS9mbG9hdCh5KSkKKyAgICAgICAgc2VsZi5wcm9ncmVzcy5zZXRfdGV4dCgiJTJkICUlIiAlICh4KjEwMC95KSkKKworICAgIGRlZiBwdWxzZShzZWxmKToKKyAgICAgICAgc2VsZi5wcm9ncmVzcy5zZXRfdGV4dCgiTG9hZGluZy4uLiIpCisgICAgICAgIHNlbGYucHJvZ3Jlc3MucHVsc2UoKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL3Byb2dyZXNzYmFyLnB5IGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL3Byb2dyZXNzYmFyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMmM2NjAKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvcHJvZ3Jlc3NiYXIucHkKQEAgLTAsMCArMSw1OSBAQAorIyBCaXRCYWtlIEdyYXBoaWNhbCBHVEsgVXNlciBJbnRlcmZhY2UKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDExICAgICAgICBJbnRlbCBDb3Jwb3JhdGlvbgorIworIyBBdXRob3JlZCBieSBTaGFuZSBXYW5nIDxzaGFuZS53YW5nQGludGVsLmNvbT4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBndGsKK2Zyb20gYmIudWkuY3J1bWJzLmhvYmNvbG9yIGltcG9ydCBIb2JDb2xvcnMKKworY2xhc3MgSG9iUHJvZ3Jlc3NCYXIgKGd0ay5Qcm9ncmVzc0Jhcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBndGsuUHJvZ3Jlc3NCYXIuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5zZXRfcmNzdHlsZShUcnVlKQorICAgICAgICBzZWxmLnBlcmNlbnRhZ2UgPSAwCisKKyAgICBkZWYgc2V0X3Jjc3R5bGUoc2VsZiwgc3RhdHVzKToKKyAgICAgICAgcmNzdHlsZSA9IGd0ay5SY1N0eWxlKCkKKyAgICAgICAgcmNzdHlsZS5mZ1syXSA9IGd0ay5nZGsuQ29sb3IoSG9iQ29sb3JzLkJMQUNLKQorICAgICAgICBpZiBzdGF0dXMgPT0gInN0b3AiOgorICAgICAgICAgICAgcmNzdHlsZS5iZ1szXSA9IGd0ay5nZGsuQ29sb3IoSG9iQ29sb3JzLldBUk5JTkcpCisgICAgICAgIGVsaWYgc3RhdHVzID09ICJmYWlsIjoKKyAgICAgICAgICAgIHJjc3R5bGUuYmdbM10gPSBndGsuZ2RrLkNvbG9yKEhvYkNvbG9ycy5FUlJPUikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJjc3R5bGUuYmdbM10gPSBndGsuZ2RrLkNvbG9yKEhvYkNvbG9ycy5SVU5OSU5HKQorICAgICAgICBzZWxmLm1vZGlmeV9zdHlsZShyY3N0eWxlKQorCisgICAgZGVmIHNldF90aXRsZShzZWxmLCB0ZXh0PU5vbmUpOgorICAgICAgICBpZiBub3QgdGV4dDoKKyAgICAgICAgICAgIHRleHQgPSAiIgorICAgICAgICB0ZXh0ICs9ICIgJS4wZiUlIiAlIHNlbGYucGVyY2VudGFnZQorICAgICAgICBzZWxmLnNldF90ZXh0KHRleHQpCisKKyAgICBkZWYgc2V0X3N0b3BfdGl0bGUoc2VsZiwgdGV4dD1Ob25lKToKKwlpZiBub3QgdGV4dDoKKwkgICAgdGV4dCA9ICIiCisJc2VsZi5zZXRfdGV4dCh0ZXh0KQorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICBzZWxmLnNldF9mcmFjdGlvbigwKQorICAgICAgICBzZWxmLnNldF90ZXh0KCIiKQorICAgICAgICBzZWxmLnNldF9yY3N0eWxlKFRydWUpCisgICAgICAgIHNlbGYucGVyY2VudGFnZSA9IDAKKworICAgIGRlZiB1cGRhdGUoc2VsZiwgZnJhY3Rpb24pOgorICAgICAgICBzZWxmLnBlcmNlbnRhZ2UgPSBpbnQoZnJhY3Rpb24gKiAxMDApCisgICAgICAgIHNlbGYuc2V0X2ZyYWN0aW9uKGZyYWN0aW9uKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL3B1Y2Noby5nbGFkZSBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9wdWNjaG8uZ2xhZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc1NTNhNgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9wdWNjaG8uZ2xhZGUKQEAgLTAsMCArMSw2MDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPCFET0NUWVBFIGdsYWRlLWludGVyZmFjZSBTWVNURU0gImdsYWRlLTIuMC5kdGQiPgorPCEtLUdlbmVyYXRlZCB3aXRoIGdsYWRlMyAzLjQuNSBvbiBNb24gTm92IDEwIDEyOjI0OjEyIDIwMDggLS0+Cis8Z2xhZGUtaW50ZXJmYWNlPgorICA8d2lkZ2V0IGNsYXNzPSJHdGtEaWFsb2ciIGlkPSJidWlsZF9kaWFsb2ciPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0aXRsZSIgdHJhbnNsYXRhYmxlPSJ5ZXMiPlN0YXJ0IGEgYnVpbGQ8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ3aW5kb3dfcG9zaXRpb24iPkdUS19XSU5fUE9TX0NFTlRFUl9PTl9QQVJFTlQ8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0eXBlX2hpbnQiPkdES19XSU5ET1dfVFlQRV9ISU5UX0RJQUxPRzwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc19zZXBhcmF0b3IiPkZhbHNlPC9wcm9wZXJ0eT4KKyAgICA8Y2hpbGQgaW50ZXJuYWwtY2hpbGQ9InZib3giPgorICAgICAgPHdpZGdldCBjbGFzcz0iR3RrVkJveCIgaWQ9ImRpYWxvZy12Ym94MSI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InNwYWNpbmciPjI8L3Byb3BlcnR5PgorICAgICAgICA8Y2hpbGQ+CisgICAgICAgICAgPHdpZGdldCBjbGFzcz0iR3RrVGFibGUiIGlkPSJidWlsZF90YWJsZSI+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYm9yZGVyX3dpZHRoIj42PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJuX3Jvd3MiPjc8L3Byb3BlcnR5PgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im5fY29sdW1ucyI+MzwvcHJvcGVydHk+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY29sdW1uX3NwYWNpbmciPjU8L3Byb3BlcnR5PgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InJvd19zcGFjaW5nIj42PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDxjaGlsZD4KKyAgICAgICAgICAgICAgPHdpZGdldCBjbGFzcz0iR3RrQWxpZ25tZW50IiBpZD0ic3RhdHVzX2FsaWdubWVudCI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsZWZ0X3BhZGRpbmciPjEyPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8Y2hpbGQ+CisgICAgICAgICAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJHdGtIQm94IiBpZD0ic3RhdHVzX2hib3giPgorICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3BhY2luZyI+NjwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgIDxjaGlsZD4KKyAgICAgICAgICAgICAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJHdGtJbWFnZSIgaWQ9InN0YXR1c19pbWFnZSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibm9fc2hvd19hbGwiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InhhbGlnbiI+MDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3RvY2siPmd0ay1kaWFsb2ctZXJyb3I8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgICAgICAgICAgICAgIDxwYWNraW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImV4cGFuZCI+RmFsc2U8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImZpbGwiPkZhbHNlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3BhY2tpbmc+CisgICAgICAgICAgICAgICAgICAgIDwvY2hpbGQ+CisgICAgICAgICAgICAgICAgICAgIDxjaGlsZD4KKyAgICAgICAgICAgICAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJHdGtMYWJlbCIgaWQ9InN0YXR1c19sYWJlbCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieGFsaWduIj4wPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPklmIHlvdSBzZWUgdGhpcyB0ZXh0IHNvbWV0aGluZyBpcyB3cm9uZy4uLjwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idXNlX21hcmt1cCI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idXNlX3VuZGVybGluZSI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgPC93aWRnZXQ+CisgICAgICAgICAgICAgICAgICAgICAgPHBhY2tpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icG9zaXRpb24iPjE8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgIDwvcGFja2luZz4KKyAgICAgICAgICAgICAgICAgICAgPC9jaGlsZD4KKyAgICAgICAgICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgICAgICAgIDwvY2hpbGQ+CisgICAgICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgICAgICA8cGFja2luZz4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icmlnaHRfYXR0YWNoIj4zPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idG9wX2F0dGFjaCI+MjwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJvdHRvbV9hdHRhY2giPjM8L3Byb3BlcnR5PgorICAgICAgICAgICAgICA8L3BhY2tpbmc+CisgICAgICAgICAgICA8L2NoaWxkPgorICAgICAgICAgICAgPGNoaWxkPgorICAgICAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJHdGtMYWJlbCIgaWQ9ImxhYmVsMiI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ4YWxpZ24iPjA8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPiZsdDtiJmd0O0J1aWxkIGNvbmZpZ3VyYXRpb24mbHQ7L2ImZ3Q7PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idXNlX21hcmt1cCI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgICAgICA8cGFja2luZz4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icmlnaHRfYXR0YWNoIj4zPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idG9wX2F0dGFjaCI+MzwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJvdHRvbV9hdHRhY2giPjQ8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ5X29wdGlvbnMiPjwvcHJvcGVydHk+CisgICAgICAgICAgICAgIDwvcGFja2luZz4KKyAgICAgICAgICAgIDwvY2hpbGQ+CisgICAgICAgICAgICA8Y2hpbGQ+CisgICAgICAgICAgICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0NvbWJvQm94IiBpZD0iaW1hZ2VfY29tYm8iPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2Vuc2l0aXZlIj5GYWxzZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgICAgICA8cGFja2luZz4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGVmdF9hdHRhY2giPjE8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyaWdodF9hdHRhY2giPjI8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b3BfYXR0YWNoIj42PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYm90dG9tX2F0dGFjaCI+NzwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Inlfb3B0aW9ucyI+PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgPC9wYWNraW5nPgorICAgICAgICAgICAgPC9jaGlsZD4KKyAgICAgICAgICAgIDxjaGlsZD4KKyAgICAgICAgICAgICAgPHdpZGdldCBjbGFzcz0iR3RrTGFiZWwiIGlkPSJpbWFnZV9sYWJlbCI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzZW5zaXRpdmUiPkZhbHNlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieGFsaWduIj4wPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieHBhZCI+MTI8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPkltYWdlOjwvcHJvcGVydHk+CisgICAgICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgICAgICA8cGFja2luZz4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idG9wX2F0dGFjaCI+NjwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJvdHRvbV9hdHRhY2giPjc8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ5X29wdGlvbnMiPjwvcHJvcGVydHk+CisgICAgICAgICAgICAgIDwvcGFja2luZz4KKyAgICAgICAgICAgIDwvY2hpbGQ+CisgICAgICAgICAgICA8Y2hpbGQ+CisgICAgICAgICAgICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0NvbWJvQm94IiBpZD0iZGlzdHJpYnV0aW9uX2NvbWJvIj4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNlbnNpdGl2ZSI+RmFsc2U8L3Byb3BlcnR5PgorICAgICAgICAgICAgICA8L3dpZGdldD4KKyAgICAgICAgICAgICAgPHBhY2tpbmc+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxlZnRfYXR0YWNoIj4xPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icmlnaHRfYXR0YWNoIj4yPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idG9wX2F0dGFjaCI+NTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJvdHRvbV9hdHRhY2giPjY8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ5X29wdGlvbnMiPjwvcHJvcGVydHk+CisgICAgICAgICAgICAgIDwvcGFja2luZz4KKyAgICAgICAgICAgIDwvY2hpbGQ+CisgICAgICAgICAgICA8Y2hpbGQ+CisgICAgICAgICAgICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0xhYmVsIiBpZD0iZGlzdHJpYnV0aW9uX2xhYmVsIj4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNlbnNpdGl2ZSI+RmFsc2U8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ4YWxpZ24iPjA8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ4cGFkIj4xMjwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+RGlzdHJpYnV0aW9uOjwvcHJvcGVydHk+CisgICAgICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgICAgICA8cGFja2luZz4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idG9wX2F0dGFjaCI+NTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJvdHRvbV9hdHRhY2giPjY8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ5X29wdGlvbnMiPjwvcHJvcGVydHk+CisgICAgICAgICAgICAgIDwvcGFja2luZz4KKyAgICAgICAgICAgIDwvY2hpbGQ+CisgICAgICAgICAgICA8Y2hpbGQ+CisgICAgICAgICAgICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0NvbWJvQm94IiBpZD0ibWFjaGluZV9jb21ibyI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzZW5zaXRpdmUiPkZhbHNlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgPC93aWRnZXQ+CisgICAgICAgICAgICAgIDxwYWNraW5nPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsZWZ0X2F0dGFjaCI+MTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InJpZ2h0X2F0dGFjaCI+MjwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRvcF9hdHRhY2giPjQ8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJib3R0b21fYXR0YWNoIj41PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieV9vcHRpb25zIj48L3Byb3BlcnR5PgorICAgICAgICAgICAgICA8L3BhY2tpbmc+CisgICAgICAgICAgICA8L2NoaWxkPgorICAgICAgICAgICAgPGNoaWxkPgorICAgICAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJHdGtMYWJlbCIgaWQ9Im1hY2hpbmVfbGFiZWwiPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2Vuc2l0aXZlIj5GYWxzZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InhhbGlnbiI+MDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InhwYWQiPjEyPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5NYWNoaW5lOjwvcHJvcGVydHk+CisgICAgICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgICAgICA8cGFja2luZz4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idG9wX2F0dGFjaCI+NDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJvdHRvbV9hdHRhY2giPjU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ5X29wdGlvbnMiPjwvcHJvcGVydHk+CisgICAgICAgICAgICAgIDwvcGFja2luZz4KKyAgICAgICAgICAgIDwvY2hpbGQ+CisgICAgICAgICAgICA8Y2hpbGQ+CisgICAgICAgICAgICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0J1dHRvbiIgaWQ9InJlZnJlc2hfYnV0dG9uIj4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNlbnNpdGl2ZSI+RmFsc2U8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjYW5fZm9jdXMiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZWNlaXZlc19kZWZhdWx0Ij5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5ndGstcmVmcmVzaDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InVzZV9zdG9jayI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InJlc3BvbnNlX2lkIj4wPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgPC93aWRnZXQ+CisgICAgICAgICAgICAgIDxwYWNraW5nPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsZWZ0X2F0dGFjaCI+MjwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InJpZ2h0X2F0dGFjaCI+MzwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRvcF9hdHRhY2giPjE8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJib3R0b21fYXR0YWNoIj4yPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieV9vcHRpb25zIj48L3Byb3BlcnR5PgorICAgICAgICAgICAgICA8L3BhY2tpbmc+CisgICAgICAgICAgICA8L2NoaWxkPgorICAgICAgICAgICAgPGNoaWxkPgorICAgICAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJHdGtFbnRyeSIgaWQ9ImxvY2F0aW9uX2VudHJ5Ij4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNhbl9mb2N1cyI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9IndpZHRoX2NoYXJzIj4zMjwvcHJvcGVydHk+CisgICAgICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgICAgICA8cGFja2luZz4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGVmdF9hdHRhY2giPjE8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyaWdodF9hdHRhY2giPjI8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b3BfYXR0YWNoIj4xPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYm90dG9tX2F0dGFjaCI+MjwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Inlfb3B0aW9ucyI+PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgPC9wYWNraW5nPgorICAgICAgICAgICAgPC9jaGlsZD4KKyAgICAgICAgICAgIDxjaGlsZD4KKyAgICAgICAgICAgICAgPHdpZGdldCBjbGFzcz0iR3RrTGFiZWwiIGlkPSJsYWJlbDMiPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieGFsaWduIj4wPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieHBhZCI+MTI8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPkxvY2F0aW9uOjwvcHJvcGVydHk+CisgICAgICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgICAgICA8cGFja2luZz4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idG9wX2F0dGFjaCI+MTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJvdHRvbV9hdHRhY2giPjI8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ5X29wdGlvbnMiPjwvcHJvcGVydHk+CisgICAgICAgICAgICAgIDwvcGFja2luZz4KKyAgICAgICAgICAgIDwvY2hpbGQ+CisgICAgICAgICAgICA8Y2hpbGQ+CisgICAgICAgICAgICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0xhYmVsIiBpZD0ibGFiZWwxIj4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InhhbGlnbiI+MDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+Jmx0O2ImZ3Q7UmVwb3NpdG9yeSZsdDsvYiZndDs8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfbWFya3VwIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgPC93aWRnZXQ+CisgICAgICAgICAgICAgIDxwYWNraW5nPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyaWdodF9hdHRhY2giPjM8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ5X29wdGlvbnMiPjwvcHJvcGVydHk+CisgICAgICAgICAgICAgIDwvcGFja2luZz4KKyAgICAgICAgICAgIDwvY2hpbGQ+CisgICAgICAgICAgICA8Y2hpbGQ+CisgICAgICAgICAgICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0FsaWdubWVudCIgaWQ9ImFsaWdubWVudDEiPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8Y2hpbGQ+CisgICAgICAgICAgICAgICAgICA8cGxhY2Vob2xkZXIvPgorICAgICAgICAgICAgICAgIDwvY2hpbGQ+CisgICAgICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgICAgICA8cGFja2luZz4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGVmdF9hdHRhY2giPjI8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyaWdodF9hdHRhY2giPjM8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b3BfYXR0YWNoIj40PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYm90dG9tX2F0dGFjaCI+NTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Inlfb3B0aW9ucyI+PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgPC9wYWNraW5nPgorICAgICAgICAgICAgPC9jaGlsZD4KKyAgICAgICAgICAgIDxjaGlsZD4KKyAgICAgICAgICAgICAgPHdpZGdldCBjbGFzcz0iR3RrQWxpZ25tZW50IiBpZD0iYWxpZ25tZW50MiI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxjaGlsZD4KKyAgICAgICAgICAgICAgICAgIDxwbGFjZWhvbGRlci8+CisgICAgICAgICAgICAgICAgPC9jaGlsZD4KKyAgICAgICAgICAgICAgPC93aWRnZXQ+CisgICAgICAgICAgICAgIDxwYWNraW5nPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsZWZ0X2F0dGFjaCI+MjwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InJpZ2h0X2F0dGFjaCI+MzwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRvcF9hdHRhY2giPjU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJib3R0b21fYXR0YWNoIj42PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieV9vcHRpb25zIj48L3Byb3BlcnR5PgorICAgICAgICAgICAgICA8L3BhY2tpbmc+CisgICAgICAgICAgICA8L2NoaWxkPgorICAgICAgICAgICAgPGNoaWxkPgorICAgICAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJHdGtBbGlnbm1lbnQiIGlkPSJhbGlnbm1lbnQzIj4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPGNoaWxkPgorICAgICAgICAgICAgICAgICAgPHBsYWNlaG9sZGVyLz4KKyAgICAgICAgICAgICAgICA8L2NoaWxkPgorICAgICAgICAgICAgICA8L3dpZGdldD4KKyAgICAgICAgICAgICAgPHBhY2tpbmc+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxlZnRfYXR0YWNoIj4yPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icmlnaHRfYXR0YWNoIj4zPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idG9wX2F0dGFjaCI+NjwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJvdHRvbV9hdHRhY2giPjc8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ5X29wdGlvbnMiPjwvcHJvcGVydHk+CisgICAgICAgICAgICAgIDwvcGFja2luZz4KKyAgICAgICAgICAgIDwvY2hpbGQ+CisgICAgICAgICAgPC93aWRnZXQ+CisgICAgICAgICAgPHBhY2tpbmc+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icG9zaXRpb24iPjE8L3Byb3BlcnR5PgorICAgICAgICAgIDwvcGFja2luZz4KKyAgICAgICAgPC9jaGlsZD4KKyAgICAgICAgPGNoaWxkIGludGVybmFsLWNoaWxkPSJhY3Rpb25fYXJlYSI+CisgICAgICAgICAgPHdpZGdldCBjbGFzcz0iR3RrSEJ1dHRvbkJveCIgaWQ9ImRpYWxvZy1hY3Rpb25fYXJlYTEiPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxheW91dF9zdHlsZSI+R1RLX0JVVFRPTkJPWF9FTkQ8L3Byb3BlcnR5PgorICAgICAgICAgICAgPGNoaWxkPgorICAgICAgICAgICAgICA8cGxhY2Vob2xkZXIvPgorICAgICAgICAgICAgPC9jaGlsZD4KKyAgICAgICAgICAgIDxjaGlsZD4KKyAgICAgICAgICAgICAgPHBsYWNlaG9sZGVyLz4KKyAgICAgICAgICAgIDwvY2hpbGQ+CisgICAgICAgICAgICA8Y2hpbGQ+CisgICAgICAgICAgICAgIDxwbGFjZWhvbGRlci8+CisgICAgICAgICAgICA8L2NoaWxkPgorICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgIDxwYWNraW5nPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImV4cGFuZCI+RmFsc2U8L3Byb3BlcnR5PgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InBhY2tfdHlwZSI+R1RLX1BBQ0tfRU5EPC9wcm9wZXJ0eT4KKyAgICAgICAgICA8L3BhY2tpbmc+CisgICAgICAgIDwvY2hpbGQ+CisgICAgICA8L3dpZGdldD4KKyAgICA8L2NoaWxkPgorICA8L3dpZGdldD4KKyAgPHdpZGdldCBjbGFzcz0iR3RrRGlhbG9nIiBpZD0iZGlhbG9nMiI+CisgICAgPHByb3BlcnR5IG5hbWU9IndpbmRvd19wb3NpdGlvbiI+R1RLX1dJTl9QT1NfQ0VOVEVSX09OX1BBUkVOVDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InR5cGVfaGludCI+R0RLX1dJTkRPV19UWVBFX0hJTlRfRElBTE9HPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGFzX3NlcGFyYXRvciI+RmFsc2U8L3Byb3BlcnR5PgorICAgIDxjaGlsZCBpbnRlcm5hbC1jaGlsZD0idmJveCI+CisgICAgICA8d2lkZ2V0IGNsYXNzPSJHdGtWQm94IiBpZD0iZGlhbG9nLXZib3gyIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3BhY2luZyI+MjwvcHJvcGVydHk+CisgICAgICAgIDxjaGlsZD4KKyAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJHdGtUYWJsZSIgaWQ9InRhYmxlMiI+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYm9yZGVyX3dpZHRoIj42PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJuX3Jvd3MiPjc8L3Byb3BlcnR5PgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im5fY29sdW1ucyI+MzwvcHJvcGVydHk+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY29sdW1uX3NwYWNpbmciPjY8L3Byb3BlcnR5PgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InJvd19zcGFjaW5nIj42PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDxjaGlsZD4KKyAgICAgICAgICAgICAgPHdpZGdldCBjbGFzcz0iR3RrTGFiZWwiIGlkPSJsYWJlbDciPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieGFsaWduIj4wPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj4mbHQ7YiZndDtSZXBvc2l0b3JpZXMmbHQ7L2ImZ3Q7PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idXNlX21hcmt1cCI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgICAgICA8cGFja2luZz4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icmlnaHRfYXR0YWNoIj4zPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieV9vcHRpb25zIj48L3Byb3BlcnR5PgorICAgICAgICAgICAgICA8L3BhY2tpbmc+CisgICAgICAgICAgICA8L2NoaWxkPgorICAgICAgICAgICAgPGNoaWxkPgorICAgICAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJHdGtBbGlnbm1lbnQiIGlkPSJhbGlnbm1lbnQ0Ij4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InhhbGlnbiI+MDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxlZnRfcGFkZGluZyI+MTI8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxjaGlsZD4KKyAgICAgICAgICAgICAgICAgIDx3aWRnZXQgY2xhc3M9Ikd0a1Njcm9sbGVkV2luZG93IiBpZD0ic2Nyb2xsZWR3aW5kb3cxIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY2FuX2ZvY3VzIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImhzY3JvbGxiYXJfcG9saWN5Ij5HVEtfUE9MSUNZX0FVVE9NQVRJQzwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2c2Nyb2xsYmFyX3BvbGljeSI+R1RLX1BPTElDWV9BVVRPTUFUSUM8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICA8Y2hpbGQ+CisgICAgICAgICAgICAgICAgICAgICAgPHdpZGdldCBjbGFzcz0iR3RrVHJlZVZpZXciIGlkPSJ0cmVldmlldzEiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNhbl9mb2N1cyI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGVhZGVyc19jbGlja2FibGUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgICAgICAgICAgICA8L2NoaWxkPgorICAgICAgICAgICAgICAgICAgPC93aWRnZXQ+CisgICAgICAgICAgICAgICAgPC9jaGlsZD4KKyAgICAgICAgICAgICAgPC93aWRnZXQ+CisgICAgICAgICAgICAgIDxwYWNraW5nPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyaWdodF9hdHRhY2giPjM8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b3BfYXR0YWNoIj4yPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYm90dG9tX2F0dGFjaCI+MzwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Inlfb3B0aW9ucyI+PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgPC9wYWNraW5nPgorICAgICAgICAgICAgPC9jaGlsZD4KKyAgICAgICAgICAgIDxjaGlsZD4KKyAgICAgICAgICAgICAgPHdpZGdldCBjbGFzcz0iR3RrRW50cnkiIGlkPSJlbnRyeTEiPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY2FuX2ZvY3VzIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgPC93aWRnZXQ+CisgICAgICAgICAgICAgIDxwYWNraW5nPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsZWZ0X2F0dGFjaCI+MTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InJpZ2h0X2F0dGFjaCI+MzwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRvcF9hdHRhY2giPjE8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJib3R0b21fYXR0YWNoIj4yPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieV9vcHRpb25zIj48L3Byb3BlcnR5PgorICAgICAgICAgICAgICA8L3BhY2tpbmc+CisgICAgICAgICAgICA8L2NoaWxkPgorICAgICAgICAgICAgPGNoaWxkPgorICAgICAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJHdGtMYWJlbCIgaWQ9ImxhYmVsOSI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ4YWxpZ24iPjA8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPiZsdDtiJmd0O0FkZGl0aW9uYWwgcGFja2FnZXMmbHQ7L2ImZ3Q7PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idXNlX21hcmt1cCI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgICAgICA8cGFja2luZz4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icmlnaHRfYXR0YWNoIj4zPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idG9wX2F0dGFjaCI+NDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJvdHRvbV9hdHRhY2giPjU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ5X29wdGlvbnMiPjwvcHJvcGVydHk+CisgICAgICAgICAgICAgIDwvcGFja2luZz4KKyAgICAgICAgICAgIDwvY2hpbGQ+CisgICAgICAgICAgICA8Y2hpbGQ+CisgICAgICAgICAgICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0FsaWdubWVudCIgaWQ9ImFsaWdubWVudDYiPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieGFsaWduIj4wPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieHNjYWxlIj4wPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8Y2hpbGQ+CisgICAgICAgICAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJHdGtMYWJlbCIgaWQ9ImxhYmVsOCI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InhhbGlnbiI+MDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ5YWxpZ24iPjA8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieHBhZCI+MTI8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5Mb2NhdGlvbjogPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgICAgICAgIDwvY2hpbGQ+CisgICAgICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgICAgICA8cGFja2luZz4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idG9wX2F0dGFjaCI+MTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJvdHRvbV9hdHRhY2giPjI8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ5X29wdGlvbnMiPjwvcHJvcGVydHk+CisgICAgICAgICAgICAgIDwvcGFja2luZz4KKyAgICAgICAgICAgIDwvY2hpbGQ+CisgICAgICAgICAgICA8Y2hpbGQ+CisgICAgICAgICAgICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0FsaWdubWVudCIgaWQ9ImFsaWdubWVudDciPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieGFsaWduIj4xPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieHNjYWxlIj4wPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8Y2hpbGQ+CisgICAgICAgICAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJHdGtIQnV0dG9uQm94IiBpZD0iaGJ1dHRvbmJveDEiPgorICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzcGFjaW5nIj41PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgPGNoaWxkPgorICAgICAgICAgICAgICAgICAgICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0J1dHRvbiIgaWQ9ImJ1dHRvbjciPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNhbl9mb2N1cyI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVjZWl2ZXNfZGVmYXVsdCI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5ndGstcmVtb3ZlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2Vfc3RvY2siPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InJlc3BvbnNlX2lkIj4wPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3dpZGdldD4KKyAgICAgICAgICAgICAgICAgICAgPC9jaGlsZD4KKyAgICAgICAgICAgICAgICAgICAgPGNoaWxkPgorICAgICAgICAgICAgICAgICAgICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0J1dHRvbiIgaWQ9ImJ1dHRvbjYiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNhbl9mb2N1cyI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVjZWl2ZXNfZGVmYXVsdCI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5ndGstZWRpdDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idXNlX3N0b2NrIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXNwb25zZV9pZCI+MDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgPC93aWRnZXQ+CisgICAgICAgICAgICAgICAgICAgICAgPHBhY2tpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icG9zaXRpb24iPjE8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgIDwvcGFja2luZz4KKyAgICAgICAgICAgICAgICAgICAgPC9jaGlsZD4KKyAgICAgICAgICAgICAgICAgICAgPGNoaWxkPgorICAgICAgICAgICAgICAgICAgICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0J1dHRvbiIgaWQ9ImJ1dHRvbjUiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNhbl9mb2N1cyI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVjZWl2ZXNfZGVmYXVsdCI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5ndGstYWRkPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2Vfc3RvY2siPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InJlc3BvbnNlX2lkIj4wPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3dpZGdldD4KKyAgICAgICAgICAgICAgICAgICAgICA8cGFja2luZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwb3NpdGlvbiI+MjwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgPC9wYWNraW5nPgorICAgICAgICAgICAgICAgICAgICA8L2NoaWxkPgorICAgICAgICAgICAgICAgICAgPC93aWRnZXQ+CisgICAgICAgICAgICAgICAgPC9jaGlsZD4KKyAgICAgICAgICAgICAgPC93aWRnZXQ+CisgICAgICAgICAgICAgIDxwYWNraW5nPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsZWZ0X2F0dGFjaCI+MTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InJpZ2h0X2F0dGFjaCI+MzwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRvcF9hdHRhY2giPjM8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJib3R0b21fYXR0YWNoIj40PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieV9vcHRpb25zIj48L3Byb3BlcnR5PgorICAgICAgICAgICAgICA8L3BhY2tpbmc+CisgICAgICAgICAgICA8L2NoaWxkPgorICAgICAgICAgICAgPGNoaWxkPgorICAgICAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJHdGtBbGlnbm1lbnQiIGlkPSJhbGlnbm1lbnQ1Ij4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPGNoaWxkPgorICAgICAgICAgICAgICAgICAgPHBsYWNlaG9sZGVyLz4KKyAgICAgICAgICAgICAgICA8L2NoaWxkPgorICAgICAgICAgICAgICA8L3dpZGdldD4KKyAgICAgICAgICAgICAgPHBhY2tpbmc+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRvcF9hdHRhY2giPjM8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJib3R0b21fYXR0YWNoIj40PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieV9vcHRpb25zIj48L3Byb3BlcnR5PgorICAgICAgICAgICAgICA8L3BhY2tpbmc+CisgICAgICAgICAgICA8L2NoaWxkPgorICAgICAgICAgICAgPGNoaWxkPgorICAgICAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJHdGtMYWJlbCIgaWQ9ImxhYmVsMTAiPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieGFsaWduIj4wPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieWFsaWduIj4wPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieHBhZCI+MTI8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPlNlYXJjaDo8L3Byb3BlcnR5PgorICAgICAgICAgICAgICA8L3dpZGdldD4KKyAgICAgICAgICAgICAgPHBhY2tpbmc+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRvcF9hdHRhY2giPjU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJib3R0b21fYXR0YWNoIj42PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieV9vcHRpb25zIj48L3Byb3BlcnR5PgorICAgICAgICAgICAgICA8L3BhY2tpbmc+CisgICAgICAgICAgICA8L2NoaWxkPgorICAgICAgICAgICAgPGNoaWxkPgorICAgICAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJHdGtFbnRyeSIgaWQ9ImVudHJ5MiI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjYW5fZm9jdXMiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICA8L3dpZGdldD4KKyAgICAgICAgICAgICAgPHBhY2tpbmc+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxlZnRfYXR0YWNoIj4xPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icmlnaHRfYXR0YWNoIj4zPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idG9wX2F0dGFjaCI+NTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJvdHRvbV9hdHRhY2giPjY8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ5X29wdGlvbnMiPjwvcHJvcGVydHk+CisgICAgICAgICAgICAgIDwvcGFja2luZz4KKyAgICAgICAgICAgIDwvY2hpbGQ+CisgICAgICAgICAgICA8Y2hpbGQ+CisgICAgICAgICAgICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0FsaWdubWVudCIgaWQ9ImFsaWdubWVudDgiPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieGFsaWduIj4wPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGVmdF9wYWRkaW5nIj4xMjwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPGNoaWxkPgorICAgICAgICAgICAgICAgICAgPHdpZGdldCBjbGFzcz0iR3RrU2Nyb2xsZWRXaW5kb3ciIGlkPSJzY3JvbGxlZHdpbmRvdzIiPgorICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjYW5fZm9jdXMiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iaHNjcm9sbGJhcl9wb2xpY3kiPkdUS19QT0xJQ1lfQVVUT01BVElDPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZzY3JvbGxiYXJfcG9saWN5Ij5HVEtfUE9MSUNZX0FVVE9NQVRJQzwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgIDxjaGlsZD4KKyAgICAgICAgICAgICAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJHdGtUcmVlVmlldyIgaWQ9InRyZWV2aWV3MiI+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY2FuX2ZvY3VzIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoZWFkZXJzX2NsaWNrYWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgPC93aWRnZXQ+CisgICAgICAgICAgICAgICAgICAgIDwvY2hpbGQ+CisgICAgICAgICAgICAgICAgICA8L3dpZGdldD4KKyAgICAgICAgICAgICAgICA8L2NoaWxkPgorICAgICAgICAgICAgICA8L3dpZGdldD4KKyAgICAgICAgICAgICAgPHBhY2tpbmc+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InJpZ2h0X2F0dGFjaCI+MzwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRvcF9hdHRhY2giPjY8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJib3R0b21fYXR0YWNoIj43PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieV9vcHRpb25zIj48L3Byb3BlcnR5PgorICAgICAgICAgICAgICA8L3BhY2tpbmc+CisgICAgICAgICAgICA8L2NoaWxkPgorICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgIDxwYWNraW5nPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InBvc2l0aW9uIj4xPC9wcm9wZXJ0eT4KKyAgICAgICAgICA8L3BhY2tpbmc+CisgICAgICAgIDwvY2hpbGQ+CisgICAgICAgIDxjaGlsZCBpbnRlcm5hbC1jaGlsZD0iYWN0aW9uX2FyZWEiPgorICAgICAgICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0hCdXR0b25Cb3giIGlkPSJkaWFsb2ctYWN0aW9uX2FyZWEyIj4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsYXlvdXRfc3R5bGUiPkdUS19CVVRUT05CT1hfRU5EPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDxjaGlsZD4KKyAgICAgICAgICAgICAgPHdpZGdldCBjbGFzcz0iR3RrQnV0dG9uIiBpZD0iYnV0dG9uNCI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjYW5fZm9jdXMiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZWNlaXZlc19kZWZhdWx0Ij5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5ndGstY2xvc2U8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2Vfc3RvY2siPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXNwb25zZV9pZCI+MDwvcHJvcGVydHk+CisgICAgICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgICAgPC9jaGlsZD4KKyAgICAgICAgICA8L3dpZGdldD4KKyAgICAgICAgICA8cGFja2luZz4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJleHBhbmQiPkZhbHNlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwYWNrX3R5cGUiPkdUS19QQUNLX0VORDwvcHJvcGVydHk+CisgICAgICAgICAgPC9wYWNraW5nPgorICAgICAgICA8L2NoaWxkPgorICAgICAgPC93aWRnZXQ+CisgICAgPC9jaGlsZD4KKyAgPC93aWRnZXQ+CisgIDx3aWRnZXQgY2xhc3M9Ikd0a1dpbmRvdyIgaWQ9Im1haW5fd2luZG93Ij4KKyAgICA8Y2hpbGQ+CisgICAgICA8d2lkZ2V0IGNsYXNzPSJHdGtWQm94IiBpZD0ibWFpbl93aW5kb3dfdmJveCI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgPGNoaWxkPgorICAgICAgICAgIDx3aWRnZXQgY2xhc3M9Ikd0a1Rvb2xiYXIiIGlkPSJtYWluX3Rvb2xiYXIiPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgPGNoaWxkPgorICAgICAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJHdGtUb29sQnV0dG9uIiBpZD0ibWFpbl90b29sYnV0dG9uX2J1aWxkIj4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+QnVpbGQ8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzdG9ja19pZCI+Z3RrLWV4ZWN1dGU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICA8L3dpZGdldD4KKyAgICAgICAgICAgICAgPHBhY2tpbmc+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImV4cGFuZCI+RmFsc2U8L3Byb3BlcnR5PgorICAgICAgICAgICAgICA8L3BhY2tpbmc+CisgICAgICAgICAgICA8L2NoaWxkPgorICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgIDxwYWNraW5nPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImV4cGFuZCI+RmFsc2U8L3Byb3BlcnR5PgorICAgICAgICAgIDwvcGFja2luZz4KKyAgICAgICAgPC9jaGlsZD4KKyAgICAgICAgPGNoaWxkPgorICAgICAgICAgIDx3aWRnZXQgY2xhc3M9Ikd0a1ZQYW5lZCIgaWQ9InZwYW5lZDEiPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNhbl9mb2N1cyI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICA8Y2hpbGQ+CisgICAgICAgICAgICAgIDx3aWRnZXQgY2xhc3M9Ikd0a1Njcm9sbGVkV2luZG93IiBpZD0icmVzdWx0c19zY3JvbGxlZHdpbmRvdyI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjYW5fZm9jdXMiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoc2Nyb2xsYmFyX3BvbGljeSI+R1RLX1BPTElDWV9BVVRPTUFUSUM8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2c2Nyb2xsYmFyX3BvbGljeSI+R1RLX1BPTElDWV9BVVRPTUFUSUM8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxjaGlsZD4KKyAgICAgICAgICAgICAgICAgIDxwbGFjZWhvbGRlci8+CisgICAgICAgICAgICAgICAgPC9jaGlsZD4KKyAgICAgICAgICAgICAgPC93aWRnZXQ+CisgICAgICAgICAgICAgIDxwYWNraW5nPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXNpemUiPkZhbHNlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2hyaW5rIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgPC9wYWNraW5nPgorICAgICAgICAgICAgPC9jaGlsZD4KKyAgICAgICAgICAgIDxjaGlsZD4KKyAgICAgICAgICAgICAgPHdpZGdldCBjbGFzcz0iR3RrU2Nyb2xsZWRXaW5kb3ciIGlkPSJwcm9ncmVzc19zY3JvbGxlZHdpbmRvdyI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjYW5fZm9jdXMiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoc2Nyb2xsYmFyX3BvbGljeSI+R1RLX1BPTElDWV9BVVRPTUFUSUM8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2c2Nyb2xsYmFyX3BvbGljeSI+R1RLX1BPTElDWV9BVVRPTUFUSUM8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxjaGlsZD4KKyAgICAgICAgICAgICAgICAgIDxwbGFjZWhvbGRlci8+CisgICAgICAgICAgICAgICAgPC9jaGlsZD4KKyAgICAgICAgICAgICAgPC93aWRnZXQ+CisgICAgICAgICAgICAgIDxwYWNraW5nPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXNpemUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaHJpbmsiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICA8L3BhY2tpbmc+CisgICAgICAgICAgICA8L2NoaWxkPgorICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgIDxwYWNraW5nPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InBvc2l0aW9uIj4xPC9wcm9wZXJ0eT4KKyAgICAgICAgICA8L3BhY2tpbmc+CisgICAgICAgIDwvY2hpbGQ+CisgICAgICA8L3dpZGdldD4KKyAgICA8L2NoaWxkPgorICA8L3dpZGdldD4KKzwvZ2xhZGUtaW50ZXJmYWNlPgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL3JlY2lwZXNlbGVjdGlvbnBhZ2UucHkgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvcmVjaXBlc2VsZWN0aW9ucGFnZS5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41OGRiNDNmCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL3JlY2lwZXNlbGVjdGlvbnBhZ2UucHkKQEAgLTAsMCArMSwzMzUgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBCaXRCYWtlIEdyYXBoaWNhbCBHVEsgVXNlciBJbnRlcmZhY2UKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEyICAgICAgICBJbnRlbCBDb3Jwb3JhdGlvbgorIworIyBBdXRob3JlZCBieSBEb25neGlhbyBYdSA8ZG9uZ3hpYW8ueHVAaW50ZWwuY29tPgorIyBBdXRob3JlZCBieSBTaGFuZSBXYW5nIDxzaGFuZS53YW5nQGludGVsLmNvbT4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBndGsKK2ltcG9ydCBnbGliCitmcm9tIGJiLnVpLmNydW1icy5ob2Jjb2xvciBpbXBvcnQgSG9iQ29sb3JzCitmcm9tIGJiLnVpLmNydW1icy5ob2J3aWRnZXQgaW1wb3J0IEhvYlZpZXdUYWJsZSwgSG9iTm90ZWJvb2ssIEhvYkFsdEJ1dHRvbiwgSG9iQnV0dG9uCitmcm9tIGJiLnVpLmNydW1icy5ob2JsaXN0bW9kZWwgaW1wb3J0IFJlY2lwZUxpc3RNb2RlbAorZnJvbSBiYi51aS5jcnVtYnMuaG9icGFnZXMgaW1wb3J0IEhvYlBhZ2UKKworIworIyBSZWNpcGVTZWxlY3Rpb25QYWdlCisjCitjbGFzcyBSZWNpcGVTZWxlY3Rpb25QYWdlIChIb2JQYWdlKToKKyAgICBwYWdlcyA9IFsKKyAgICAgICAgeworICAgICAgICAgJ25hbWUnICAgICAgOiAnSW5jbHVkZWQgcmVjaXBlcycsCisgICAgICAgICAndG9vbHRpcCcgICA6ICdUaGUgcmVjaXBlcyBjdXJyZW50bHkgaW5jbHVkZWQgZm9yIHlvdXIgaW1hZ2UnLAorICAgICAgICAgJ2ZpbHRlcicgICAgOiB7IFJlY2lwZUxpc3RNb2RlbC5DT0xfSU5DICA6IFtUcnVlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgUmVjaXBlTGlzdE1vZGVsLkNPTF9UWVBFIDogWydyZWNpcGUnLCAncGFja2FnZWdyb3VwJ10gfSwKKyAgICAgICAgICdzZWFyY2gnICAgIDogJ1NlYXJjaCByZWNpcGVzIGJ5IG5hbWUnLAorICAgICAgICAgJ3NlYXJjaHRpcCcgOiAnRW50ZXIgYSByZWNpcGUgbmFtZSB0byBmaW5kIGl0JywKKyAgICAgICAgICdjb2x1bW5zJyAgIDogW3sKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9uYW1lJyA6ICdSZWNpcGUgbmFtZScsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfaWQnICAgOiBSZWNpcGVMaXN0TW9kZWwuQ09MX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfc3R5bGUnOiAndGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbWluJyAgOiAxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbWF4JyAgOiA0MDAsCisgICAgICAgICAgICAgICAgICAgICAgICdleHBhbmQnICAgOiAnVHJ1ZScKKyAgICAgICAgICAgICAgICAgICAgICB9LCB7CisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbmFtZScgOiAnR3JvdXAnLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX2lkJyAgIDogUmVjaXBlTGlzdE1vZGVsLkNPTF9HUk9VUCwKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9zdHlsZSc6ICd0ZXh0JywKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9taW4nICA6IDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9tYXgnICA6IDMwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgJ2V4cGFuZCcgICA6ICdUcnVlJworICAgICAgICAgICAgICAgICAgICAgIH0sIHsKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9uYW1lJyA6ICdCcm91Z2h0IGluIGJ5ICgrb3RoZXJzKScsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfaWQnICAgOiBSZWNpcGVMaXN0TW9kZWwuQ09MX0JJTkIsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfc3R5bGUnOiAnYmluYicsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbWluJyAgOiAxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbWF4JyAgOiA1MDAsCisgICAgICAgICAgICAgICAgICAgICAgICdleHBhbmQnICAgOiAnVHJ1ZScKKyAgICAgICAgICAgICAgICAgICAgICB9LCB7CisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbmFtZScgOiAnSW5jbHVkZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX2lkJyAgIDogUmVjaXBlTGlzdE1vZGVsLkNPTF9JTkMsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfc3R5bGUnOiAnY2hlY2sgdG9nZ2xlJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9taW4nICA6IDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9tYXgnICA6IDEwMAorICAgICAgICAgICAgICAgICAgICAgIH1dCisgICAgICAgIH0sIHsKKyAgICAgICAgICduYW1lJyAgICAgIDogJ0FsbCByZWNpcGVzJywKKyAgICAgICAgICd0b29sdGlwJyAgIDogJ0FsbCByZWNpcGVzIGluIHlvdXIgY29uZmlndXJlZCBsYXllcnMnLAorICAgICAgICAgJ2ZpbHRlcicgICAgOiB7IFJlY2lwZUxpc3RNb2RlbC5DT0xfVFlQRSA6IFsncmVjaXBlJ10gfSwKKyAgICAgICAgICdzZWFyY2gnICAgIDogJ1NlYXJjaCByZWNpcGVzIGJ5IG5hbWUnLAorICAgICAgICAgJ3NlYXJjaHRpcCcgOiAnRW50ZXIgYSByZWNpcGUgbmFtZSB0byBmaW5kIGl0JywKKyAgICAgICAgICdjb2x1bW5zJyAgIDogW3sKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9uYW1lJyA6ICdSZWNpcGUgbmFtZScsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfaWQnICAgOiBSZWNpcGVMaXN0TW9kZWwuQ09MX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfc3R5bGUnOiAndGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbWluJyAgOiAxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbWF4JyAgOiA0MDAsCisgICAgICAgICAgICAgICAgICAgICAgICdleHBhbmQnICAgOiAnVHJ1ZScKKyAgICAgICAgICAgICAgICAgICAgICB9LCB7CisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbmFtZScgOiAnR3JvdXAnLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX2lkJyAgIDogUmVjaXBlTGlzdE1vZGVsLkNPTF9HUk9VUCwKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9zdHlsZSc6ICd0ZXh0JywKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9taW4nICA6IDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9tYXgnICA6IDQwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgJ2V4cGFuZCcgICA6ICdUcnVlJworICAgICAgICAgICAgICAgICAgICAgIH0sIHsKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9uYW1lJyA6ICdMaWNlbnNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9pZCcgICA6IFJlY2lwZUxpc3RNb2RlbC5DT0xfTElDLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX3N0eWxlJzogJ3RleHQnLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX21pbicgIDogMTAwLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX21heCcgIDogNDAwLAorICAgICAgICAgICAgICAgICAgICAgICAnZXhwYW5kJyAgIDogJ1RydWUnCisgICAgICAgICAgICAgICAgICAgICAgfSwgeworICAgICAgICAgICAgICAgICAgICAgICAnY29sX25hbWUnIDogJ0luY2x1ZGVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9pZCcgICA6IFJlY2lwZUxpc3RNb2RlbC5DT0xfSU5DLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX3N0eWxlJzogJ2NoZWNrIHRvZ2dsZScsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbWluJyAgOiAxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbWF4JyAgOiAxMDAKKyAgICAgICAgICAgICAgICAgICAgICB9XQorICAgICAgICB9LCB7CisgICAgICAgICAnbmFtZScgICAgICA6ICdQYWNrYWdlIEdyb3VwcycsCisgICAgICAgICAndG9vbHRpcCcgICA6ICdBbGwgcGFja2FnZSBncm91cHMgaW4geW91ciBjb25maWd1cmVkIGxheWVycycsCisgICAgICAgICAnZmlsdGVyJyAgICA6IHsgUmVjaXBlTGlzdE1vZGVsLkNPTF9UWVBFIDogWydwYWNrYWdlZ3JvdXAnXSB9LAorICAgICAgICAgJ3NlYXJjaCcgICAgOiAnU2VhcmNoIHBhY2thZ2UgZ3JvdXBzIGJ5IG5hbWUnLAorICAgICAgICAgJ3NlYXJjaHRpcCcgOiAnRW50ZXIgYSBwYWNrYWdlIGdyb3VwIG5hbWUgdG8gZmluZCBpdCcsCisgICAgICAgICAnY29sdW1ucycgICA6IFt7CisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbmFtZScgOiAnUGFja2FnZSBncm91cCBuYW1lJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9pZCcgICA6IFJlY2lwZUxpc3RNb2RlbC5DT0xfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9zdHlsZSc6ICd0ZXh0JywKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9taW4nICA6IDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9tYXgnICA6IDQwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgJ2V4cGFuZCcgICA6ICdUcnVlJworICAgICAgICAgICAgICAgICAgICAgIH0sIHsKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9uYW1lJyA6ICdJbmNsdWRlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfaWQnICAgOiBSZWNpcGVMaXN0TW9kZWwuQ09MX0lOQywKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9zdHlsZSc6ICdjaGVjayB0b2dnbGUnLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX21pbicgIDogMTAwLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX21heCcgIDogMTAwCisgICAgICAgICAgICAgICAgICAgICAgfV0KKyAgICAgICAgfQorICAgIF0KKyAgICAKKyAgICAoSU5DTFVERUQsCisgICAgIEFMTCwKKyAgICAgVEFTS1MpID0gcmFuZ2UoMykKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBidWlsZGVyID0gTm9uZSk6CisgICAgICAgIHN1cGVyKFJlY2lwZVNlbGVjdGlvblBhZ2UsIHNlbGYpLl9faW5pdF9fKGJ1aWxkZXIsICJTdGVwIDEgb2YgMjogRWRpdCByZWNpcGVzIikKKworICAgICAgICAjIHNldCBpbnZpc2libGUgbWVtYmVycworICAgICAgICBzZWxmLnJlY2lwZV9tb2RlbCA9IHNlbGYuYnVpbGRlci5yZWNpcGVfbW9kZWwKKworICAgICAgICAjIGNyZWF0ZSB2aXN1YWwgZWxlbWVudHMKKyAgICAgICAgc2VsZi5jcmVhdGVfdmlzdWFsX2VsZW1lbnRzKCkKKworICAgIGRlZiBpbmNsdWRlZF9jbGlja2VkX2NiKHNlbGYsIGJ1dHRvbik6CisgICAgICAgIHNlbGYuaW5zLnNldF9jdXJyZW50X3BhZ2Uoc2VsZi5JTkNMVURFRCkKKworICAgIGRlZiBjcmVhdGVfdmlzdWFsX2VsZW1lbnRzKHNlbGYpOgorICAgICAgICBzZWxmLmV2ZW50Ym94ID0gc2VsZi5hZGRfb250b190b3BfYmFyKE5vbmUsIDczKQorICAgICAgICBzZWxmLnBhY2tfc3RhcnQoc2VsZi5ldmVudGJveCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICBzZWxmLnBhY2tfc3RhcnQoc2VsZi5ncm91cF9hbGlnbiwgZXhwYW5kPVRydWUsIGZpbGw9VHJ1ZSkKKworICAgICAgICAjIHNldCB2aXNpYmxlIG1lbWJlcnMKKyAgICAgICAgc2VsZi5pbnMgPSBIb2JOb3RlYm9vaygpCisgICAgICAgIHNlbGYudGFibGVzID0gW10gIyB3ZSBuZWVkIG1vZGlmeSB0YWJsZSB3aGVuIHRoZSBkaWFsb2cgaXMgc2hvd24KKworICAgICAgICBzZWFyY2hfbmFtZXMgPSBbXQorICAgICAgICBzZWFyY2hfdGlwcyA9IFtdCisgICAgICAgICMgYXBwZW5kIHRoZSB0YWJzIGluIG9yZGVyCisgICAgICAgIGZvciBwYWdlIGluIHNlbGYucGFnZXM6CisgICAgICAgICAgICBjb2x1bW5zID0gcGFnZVsnY29sdW1ucyddCisgICAgICAgICAgICBuYW1lID0gcGFnZVsnbmFtZSddCisgICAgICAgICAgICB0YWIgPSBIb2JWaWV3VGFibGUoY29sdW1ucywgbmFtZSkKKyAgICAgICAgICAgIHNlYXJjaF9uYW1lcy5hcHBlbmQocGFnZVsnc2VhcmNoJ10pCisgICAgICAgICAgICBzZWFyY2hfdGlwcy5hcHBlbmQocGFnZVsnc2VhcmNodGlwJ10pCisgICAgICAgICAgICBmaWx0ZXIgPSBwYWdlWydmaWx0ZXInXQorICAgICAgICAgICAgc29ydF9tb2RlbCA9IHNlbGYucmVjaXBlX21vZGVsLnRyZWVfbW9kZWwoZmlsdGVyLCBpbml0aWFsPVRydWUpCisgICAgICAgICAgICB0YWIuc2V0X21vZGVsKHNvcnRfbW9kZWwpCisgICAgICAgICAgICB0YWIuY29ubmVjdCgidG9nZ2xlZCIsIHNlbGYudGFibGVfdG9nZ2xlZF9jYiwgbmFtZSkKKyAgICAgICAgICAgIHRhYi5jb25uZWN0KCJidXR0b24tcmVsZWFzZS1ldmVudCIsIHNlbGYuYnV0dG9uX2NsaWNrX2NiKQorICAgICAgICAgICAgdGFiLmNvbm5lY3QoImNlbGwtZmFkZWlub3V0LXN0b3BwZWQiLCBzZWxmLmFmdGVyX2ZhZGVvdXRfY2hlY2tpbl9pbmNsdWRlLCBmaWx0ZXIpCisgICAgICAgICAgICBzZWxmLmlucy5hcHBlbmRfcGFnZSh0YWIsIHBhZ2VbJ25hbWUnXSwgcGFnZVsndG9vbHRpcCddKQorICAgICAgICAgICAgc2VsZi50YWJsZXMuYXBwZW5kKHRhYikKKworICAgICAgICBzZWxmLmlucy5zZXRfZW50cnkoc2VhcmNoX25hbWVzLCBzZWFyY2hfdGlwcykKKyAgICAgICAgc2VsZi5pbnMuc2VhcmNoLmNvbm5lY3QoImNoYW5nZWQiLCBzZWxmLnNlYXJjaF9lbnRyeV9jaGFuZ2VkKQorCisgICAgICAgICMgYWRkIGFsbCBpbnRvIHRoZSB3aW5kb3cKKyAgICAgICAgc2VsZi5ib3hfZ3JvdXBfYXJlYS5wYWNrX3N0YXJ0KHNlbGYuaW5zLCBleHBhbmQ9VHJ1ZSwgZmlsbD1UcnVlKQorCisgICAgICAgIGJ1dHRvbl9ib3ggPSBndGsuSEJveChGYWxzZSwgNikKKyAgICAgICAgc2VsZi5ib3hfZ3JvdXBfYXJlYS5wYWNrX2VuZChidXR0b25fYm94LCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgc2VsZi5idWlsZF9wYWNrYWdlc19idXR0b24gPSBIb2JCdXR0b24oJ0J1aWxkIHBhY2thZ2VzJykKKyAgICAgICAgI3NlbGYuYnVpbGRfcGFja2FnZXNfYnV0dG9uLnNldF9zaXplX3JlcXVlc3QoMjA1LCA0OSkKKyAgICAgICAgc2VsZi5idWlsZF9wYWNrYWdlc19idXR0b24uc2V0X3Rvb2x0aXBfdGV4dCgiQnVpbGQgc2VsZWN0ZWQgcmVjaXBlcyBpbnRvIHBhY2thZ2VzIikKKyAgICAgICAgc2VsZi5idWlsZF9wYWNrYWdlc19idXR0b24uc2V0X2ZsYWdzKGd0ay5DQU5fREVGQVVMVCkKKyAgICAgICAgc2VsZi5idWlsZF9wYWNrYWdlc19idXR0b24uZ3JhYl9kZWZhdWx0KCkKKyAgICAgICAgc2VsZi5idWlsZF9wYWNrYWdlc19idXR0b24uY29ubmVjdCgiY2xpY2tlZCIsIHNlbGYuYnVpbGRfcGFja2FnZXNfY2xpY2tlZF9jYikKKyAgICAgICAgYnV0dG9uX2JveC5wYWNrX2VuZChzZWxmLmJ1aWxkX3BhY2thZ2VzX2J1dHRvbiwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorCisgICAgICAgIHNlbGYuYmFja19idXR0b24gPSBIb2JBbHRCdXR0b24oJ0NhbmNlbCcpCisgICAgICAgIHNlbGYuYmFja19idXR0b24uY29ubmVjdCgiY2xpY2tlZCIsIHNlbGYuYmFja19idXR0b25fY2xpY2tlZF9jYikKKyAgICAgICAgYnV0dG9uX2JveC5wYWNrX2VuZChzZWxmLmJhY2tfYnV0dG9uLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICBkZWYgc2VhcmNoX2VudHJ5X2NoYW5nZWQoc2VsZiwgZW50cnkpOgorICAgICAgICB0ZXh0ID0gZW50cnkuZ2V0X3RleHQoKQorICAgICAgICBpZiBzZWxmLmlucy5zZWFyY2hfZm9jdXM6CisgICAgICAgICAgICBzZWxmLmlucy5zZWFyY2hfZm9jdXMgPSBGYWxzZQorICAgICAgICBlbGlmIHNlbGYuaW5zLnBhZ2VfY2hhbmdlZDoKKyAgICAgICAgICAgIHNlbGYuaW5zLnBhZ2VfY2hhbmdlID0gRmFsc2UKKyAgICAgICAgICAgIHNlbGYuZmlsdGVyX3NlYXJjaChlbnRyeSkKKyAgICAgICAgZWxpZiB0ZXh0IG5vdCBpbiBzZWxmLmlucy5zZWFyY2hfbmFtZXM6CisgICAgICAgICAgICBzZWxmLmZpbHRlcl9zZWFyY2goZW50cnkpCisKKyAgICBkZWYgZmlsdGVyX3NlYXJjaChzZWxmLCBlbnRyeSk6CisgICAgICAgIHRleHQgPSBlbnRyeS5nZXRfdGV4dCgpCisgICAgICAgIGN1cnJlbnRfdGFiID0gc2VsZi5pbnMuZ2V0X2N1cnJlbnRfcGFnZSgpCisgICAgICAgIGZpbHRlciA9IHNlbGYucGFnZXNbY3VycmVudF90YWJdWydmaWx0ZXInXQorICAgICAgICBmaWx0ZXJbUmVjaXBlTGlzdE1vZGVsLkNPTF9OQU1FXSA9IHRleHQKKyAgICAgICAgc2VsZi50YWJsZXNbY3VycmVudF90YWJdLnNldF9tb2RlbChzZWxmLnJlY2lwZV9tb2RlbC50cmVlX21vZGVsKGZpbHRlciwgc2VhcmNoX2RhdGE9dGV4dCkpCisgICAgICAgIGlmIHNlbGYucmVjaXBlX21vZGVsLmZpbHRlcmVkX25iID09IDA6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5pbnMuZ2V0X250aF9wYWdlKGN1cnJlbnRfdGFiKS50b3BfYmFyOgorICAgICAgICAgICAgICAgIHNlbGYuaW5zLmdldF9udGhfcGFnZShjdXJyZW50X3RhYikuYWRkX25vX3Jlc3VsdF9iYXIoZW50cnkpCisgICAgICAgICAgICAgICAgc2VsZi5pbnMuZ2V0X250aF9wYWdlKGN1cnJlbnRfdGFiKS50b3BfYmFyLnNldF9ub19zaG93X2FsbChUcnVlKQorICAgICAgICAgICAgc2VsZi5pbnMuZ2V0X250aF9wYWdlKGN1cnJlbnRfdGFiKS50b3BfYmFyLnNob3coKQorICAgICAgICAgICAgc2VsZi5pbnMuZ2V0X250aF9wYWdlKGN1cnJlbnRfdGFiKS5zY3JvbGwuaGlkZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBzZWxmLmlucy5nZXRfbnRoX3BhZ2UoY3VycmVudF90YWIpLnRvcF9iYXI6CisgICAgICAgICAgICAgICAgc2VsZi5pbnMuZ2V0X250aF9wYWdlKGN1cnJlbnRfdGFiKS50b3BfYmFyLmhpZGUoKQorICAgICAgICAgICAgc2VsZi5pbnMuZ2V0X250aF9wYWdlKGN1cnJlbnRfdGFiKS5zY3JvbGwuc2hvdygpCisgICAgICAgIGlmIGVudHJ5LmdldF90ZXh0KCkgPT0gJyc6CisgICAgICAgICAgICBlbnRyeS5zZXRfaWNvbl9zZW5zaXRpdmUoZ3RrLkVOVFJZX0lDT05fU0VDT05EQVJZLCBGYWxzZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGVudHJ5LnNldF9pY29uX3NlbnNpdGl2ZShndGsuRU5UUllfSUNPTl9TRUNPTkRBUlksIFRydWUpCisKKyAgICBkZWYgYnV0dG9uX2NsaWNrX2NiKHNlbGYsIHdpZGdldCwgZXZlbnQpOgorICAgICAgICBwYXRoLCBjb2wgPSB3aWRnZXQudGFibGVfdHJlZS5nZXRfY3Vyc29yKCkKKyAgICAgICAgdHJlZV9tb2RlbCA9IHdpZGdldC50YWJsZV90cmVlLmdldF9tb2RlbCgpCisgICAgICAgIGlmIHBhdGggYW5kIGNvbC5nZXRfdGl0bGUoKSAhPSAnSW5jbHVkZWQnOiAjIGVsc2UgYWN0aXZhdGlvbiBpcyBsaWtlbHkgYSByZW1vdmFsCisgICAgICAgICAgICBwcm9wZXJ0aWVzID0geydzdW1tYXJ5JzogJycsICduYW1lJzogJycsICd2ZXJzaW9uJzogJycsICdyZXZpc2lvbic6ICcnLCAnYmluYic6ICcnLCAnZ3JvdXAnOiAnJywgJ2xpY2Vuc2UnOiAnJywgJ2hvbWVwYWdlJzogJycsICdidWd0cmFja2VyJzogJycsICdkZXNjcmlwdGlvbic6ICcnfQorICAgICAgICAgICAgcHJvcGVydGllc1snc3VtbWFyeSddID0gdHJlZV9tb2RlbC5nZXRfdmFsdWUodHJlZV9tb2RlbC5nZXRfaXRlcihwYXRoKSwgUmVjaXBlTGlzdE1vZGVsLkNPTF9TVU1NQVJZKQorICAgICAgICAgICAgcHJvcGVydGllc1snbmFtZSddID0gdHJlZV9tb2RlbC5nZXRfdmFsdWUodHJlZV9tb2RlbC5nZXRfaXRlcihwYXRoKSwgUmVjaXBlTGlzdE1vZGVsLkNPTF9OQU1FKQorICAgICAgICAgICAgcHJvcGVydGllc1sndmVyc2lvbiddID0gdHJlZV9tb2RlbC5nZXRfdmFsdWUodHJlZV9tb2RlbC5nZXRfaXRlcihwYXRoKSwgUmVjaXBlTGlzdE1vZGVsLkNPTF9WRVJTSU9OKQorICAgICAgICAgICAgcHJvcGVydGllc1sncmV2aXNpb24nXSA9IHRyZWVfbW9kZWwuZ2V0X3ZhbHVlKHRyZWVfbW9kZWwuZ2V0X2l0ZXIocGF0aCksIFJlY2lwZUxpc3RNb2RlbC5DT0xfUkVWSVNJT04pCisgICAgICAgICAgICBwcm9wZXJ0aWVzWydiaW5iJ10gPSB0cmVlX21vZGVsLmdldF92YWx1ZSh0cmVlX21vZGVsLmdldF9pdGVyKHBhdGgpLCBSZWNpcGVMaXN0TW9kZWwuQ09MX0JJTkIpCisgICAgICAgICAgICBwcm9wZXJ0aWVzWydncm91cCddID0gdHJlZV9tb2RlbC5nZXRfdmFsdWUodHJlZV9tb2RlbC5nZXRfaXRlcihwYXRoKSwgUmVjaXBlTGlzdE1vZGVsLkNPTF9HUk9VUCkKKyAgICAgICAgICAgIHByb3BlcnRpZXNbJ2xpY2Vuc2UnXSA9IHRyZWVfbW9kZWwuZ2V0X3ZhbHVlKHRyZWVfbW9kZWwuZ2V0X2l0ZXIocGF0aCksIFJlY2lwZUxpc3RNb2RlbC5DT0xfTElDKQorICAgICAgICAgICAgcHJvcGVydGllc1snaG9tZXBhZ2UnXSA9IHRyZWVfbW9kZWwuZ2V0X3ZhbHVlKHRyZWVfbW9kZWwuZ2V0X2l0ZXIocGF0aCksIFJlY2lwZUxpc3RNb2RlbC5DT0xfSE9NRVBBR0UpCisgICAgICAgICAgICBwcm9wZXJ0aWVzWydidWd0cmFja2VyJ10gPSB0cmVlX21vZGVsLmdldF92YWx1ZSh0cmVlX21vZGVsLmdldF9pdGVyKHBhdGgpLCBSZWNpcGVMaXN0TW9kZWwuQ09MX0JVR1RSQUNLRVIpCisgICAgICAgICAgICBwcm9wZXJ0aWVzWydkZXNjcmlwdGlvbiddID0gdHJlZV9tb2RlbC5nZXRfdmFsdWUodHJlZV9tb2RlbC5nZXRfaXRlcihwYXRoKSwgUmVjaXBlTGlzdE1vZGVsLkNPTF9ERVNDKQorICAgICAgICAgICAgc2VsZi5idWlsZGVyLnNob3dfcmVjaXBlX3Byb3BlcnR5X2RpYWxvZyhwcm9wZXJ0aWVzKQorCisgICAgZGVmIGJ1aWxkX3BhY2thZ2VzX2NsaWNrZWRfY2Ioc2VsZiwgYnV0dG9uKToKKyAgICAgICAgc2VsZi5yZWZyZXNoX3RhYmxlcygpCisgICAgICAgIHNlbGYuYnVpbGRlci5idWlsZF9wYWNrYWdlcygpCisKKyAgICBkZWYgcmVmcmVzaF90YWJsZXMoc2VsZik6CisgICAgICAgIHNlbGYuaW5zLnJlc2V0X2VudHJ5KHNlbGYuaW5zLnNlYXJjaCwgMCkKKyAgICAgICAgZm9yIHRhYiBpbiBzZWxmLnRhYmxlczoKKyAgICAgICAgICAgIGluZGV4ID0gc2VsZi50YWJsZXMuaW5kZXgodGFiKQorICAgICAgICAgICAgZmlsdGVyID0gc2VsZi5wYWdlc1tpbmRleF1bJ2ZpbHRlciddCisgICAgICAgICAgICB0YWIuc2V0X21vZGVsKHNlbGYucmVjaXBlX21vZGVsLnRyZWVfbW9kZWwoZmlsdGVyLCBzZWFyY2hfZGF0YT0iIiwgaW5pdGlhbD1UcnVlKSkKKworICAgIGRlZiBiYWNrX2J1dHRvbl9jbGlja2VkX2NiKHNlbGYsIGJ1dHRvbik6CisgICAgICAgIHNlbGYuYnVpbGRlci5yZWNpcGVfbW9kZWwuc2V0X3NlbGVjdGVkX2ltYWdlKHNlbGYuYnVpbGRlci5jb25maWd1cmF0aW9uLmluaXRpYWxfc2VsZWN0ZWRfaW1hZ2UpCisgICAgICAgIHNlbGYuYnVpbGRlci5pbWFnZV9jb25maWd1cmF0aW9uX3BhZ2UudXBkYXRlX2ltYWdlX2NvbWJvKHNlbGYuYnVpbGRlci5yZWNpcGVfbW9kZWwsIHNlbGYuYnVpbGRlci5jb25maWd1cmF0aW9uLmluaXRpYWxfc2VsZWN0ZWRfaW1hZ2UpCisgICAgICAgIHNlbGYuYnVpbGRlci5pbWFnZV9jb25maWd1cmF0aW9uX3BhZ2UudXBkYXRlX2ltYWdlX2Rlc2MoKQorICAgICAgICBzZWxmLmJ1aWxkZXIuc2hvd19jb25maWd1cmF0aW9uKCkKKyAgICAgICAgc2VsZi5yZWZyZXNoX3RhYmxlcygpCisKKyAgICBkZWYgcmVmcmVzaF9zZWxlY3Rpb24oc2VsZik6CisgICAgICAgIHNlbGYuYnVpbGRlci5jb25maWd1cmF0aW9uLnNlbGVjdGVkX2ltYWdlID0gc2VsZi5yZWNpcGVfbW9kZWwuZ2V0X3NlbGVjdGVkX2ltYWdlKCkKKyAgICAgICAgXywgc2VsZi5idWlsZGVyLmNvbmZpZ3VyYXRpb24uc2VsZWN0ZWRfcmVjaXBlcyA9IHNlbGYucmVjaXBlX21vZGVsLmdldF9zZWxlY3RlZF9yZWNpcGVzKCkKKyAgICAgICAgc2VsZi5pbnMuc2hvd19pbmRpY2F0b3JfaWNvbigiSW5jbHVkZWQgcmVjaXBlcyIsIGxlbihzZWxmLmJ1aWxkZXIuY29uZmlndXJhdGlvbi5zZWxlY3RlZF9yZWNpcGVzKSkKKworICAgIGRlZiB0b2dnbGVfaXRlbV9pZGxlX2NiKHNlbGYsIHBhdGgsIHZpZXdfdHJlZSwgY2VsbCwgcGFnZW5hbWUpOgorICAgICAgICBpZiBub3Qgc2VsZi5yZWNpcGVfbW9kZWwucGF0aF9pbmNsdWRlZChwYXRoKToKKyAgICAgICAgICAgIHNlbGYucmVjaXBlX21vZGVsLmluY2x1ZGVfaXRlbShpdGVtX3BhdGg9cGF0aCwgYmluYj0iVXNlciBTZWxlY3RlZCIsIGltYWdlX2NvbnRlbnRzPUZhbHNlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5wcmVfZmFkZW91dF9jaGVja291dF9pbmNsdWRlKHZpZXdfdHJlZSwgcGFnZW5hbWUpCisgICAgICAgICAgICBzZWxmLnJlY2lwZV9tb2RlbC5leGNsdWRlX2l0ZW0oaXRlbV9wYXRoPXBhdGgpCisgICAgICAgICAgICBzZWxmLnJlbmRlcl9mYWRlb3V0KHZpZXdfdHJlZSwgY2VsbCkKKworICAgICAgICBzZWxmLnJlZnJlc2hfc2VsZWN0aW9uKCkKKyAgICAgICAgaWYgbm90IHNlbGYuYnVpbGRlci5jdXN0b21pemVkOgorICAgICAgICAgICAgc2VsZi5idWlsZGVyLmN1c3RvbWl6ZWQgPSBUcnVlCisgICAgICAgICAgICBzZWxmLmJ1aWxkZXIuY29uZmlndXJhdGlvbi5zZWxlY3RlZF9pbWFnZSA9IHNlbGYucmVjaXBlX21vZGVsLl9fY3VzdG9tX2ltYWdlX18KKyAgICAgICAgICAgIHNlbGYuYnVpbGRlci5yY3Bwa2dsaXN0X3BvcHVsYXRlZCgpCisKKyAgICAgICAgc2VsZi5idWlsZGVyLndpbmRvd19zZW5zaXRpdmUoVHJ1ZSkKKworICAgICAgICB2aWV3X21vZGVsID0gdmlld190cmVlLmdldF9tb2RlbCgpCisgICAgICAgIHZwYXRoID0gc2VsZi5yZWNpcGVfbW9kZWwuY29udmVydF9wYXRoX3RvX3ZwYXRoKHZpZXdfbW9kZWwsIHBhdGgpCisgICAgICAgIHZpZXdfdHJlZS5zZXRfY3Vyc29yKHZwYXRoKQorCisgICAgZGVmIHRhYmxlX3RvZ2dsZWRfY2Ioc2VsZiwgdGFibGUsIGNlbGwsIHZpZXdfcGF0aCwgdG9nZ2xlZF9jb2x1bW5pZCwgdmlld190cmVlLCBwYWdlbmFtZSk6CisgICAgICAgICMgQ2xpY2sgdG8gaW5jbHVkZSBhIHJlY2lwZQorICAgICAgICBzZWxmLmJ1aWxkZXIud2luZG93X3NlbnNpdGl2ZShGYWxzZSkKKyAgICAgICAgdmlld19tb2RlbCA9IHZpZXdfdHJlZS5nZXRfbW9kZWwoKQorICAgICAgICBwYXRoID0gc2VsZi5yZWNpcGVfbW9kZWwuY29udmVydF92cGF0aF90b19wYXRoKHZpZXdfbW9kZWwsIHZpZXdfcGF0aCkKKyAgICAgICAgZ2xpYi5pZGxlX2FkZChzZWxmLnRvZ2dsZV9pdGVtX2lkbGVfY2IsIHBhdGgsIHZpZXdfdHJlZSwgY2VsbCwgcGFnZW5hbWUpCisKKyAgICBkZWYgcHJlX2ZhZGVvdXRfY2hlY2tvdXRfaW5jbHVkZShzZWxmLCB0cmVlLCBwYWdlbmFtZSk6CisgICAgICAgICNhZnRlciB0aGUgZmFkZW91dCB0aGUgdGFibGUgd2lsbCBiZSBzb3J0ZWQgYXMgYmVmb3JlCisgICAgICAgIHNlbGYuc29ydF9jb2x1bW5faWQgPSBzZWxmLnJlY2lwZV9tb2RlbC5zb3J0X2NvbHVtbl9pZAorICAgICAgICBzZWxmLnNvcnRfb3JkZXIgPSBzZWxmLnJlY2lwZV9tb2RlbC5zb3J0X29yZGVyCisKKyAgICAgICAgI3Jlc3luYyB0aGUgaW5jbHVkZWQgaXRlbXMgdG8gYSBiYWNrdXAgZmFkZSBpbmNsdWRlIGNvbHVtbgorICAgICAgICBpdCA9IHNlbGYucmVjaXBlX21vZGVsLmdldF9pdGVyX2ZpcnN0KCkKKyAgICAgICAgd2hpbGUgaXQ6CisgICAgICAgICAgICBhY3RpdmUgPSBzZWxmLnJlY2lwZV9tb2RlbC5nZXRfdmFsdWUoaXQsIHNlbGYucmVjaXBlX21vZGVsLkNPTF9JTkMpCisgICAgICAgICAgICBzZWxmLnJlY2lwZV9tb2RlbC5zZXQoaXQsIHNlbGYucmVjaXBlX21vZGVsLkNPTF9GQURFX0lOQywgYWN0aXZlKQorICAgICAgICAgICAgaXQgPSBzZWxmLnJlY2lwZV9tb2RlbC5pdGVyX25leHQoaXQpCisgICAgICAgICMgQ2hlY2sgb3V0IGEgbW9kZWwgd2hpY2ggYmFzZSBvbiB0aGUgY29sdW1uIENPTF9GQURFX0lOQywKKyAgICAgICAgIyBpdCdzIHNhdmUgdGhlIHByZXYgc3RhdGUgb2YgY29sdW1uIENPTF9JTkMgYmVmb3JlIGRvIGV4Y2x1ZGVfaXRlbQorICAgICAgICBmaWx0ZXIgPSB7IFJlY2lwZUxpc3RNb2RlbC5DT0xfRkFERV9JTkM6W1RydWVdIH0KKyAgICAgICAgaWYgcGFnZW5hbWUgPT0gIkluY2x1ZGVkIHJlY2lwZXMiOgorICAgICAgICAgICAgZmlsdGVyW1JlY2lwZUxpc3RNb2RlbC5DT0xfVFlQRV0gPSBbJ3JlY2lwZScsICdwYWNrYWdlZ3JvdXAnXQorICAgICAgICBlbGlmIHBhZ2VuYW1lID09ICJBbGwgcmVjaXBlcyI6CisgICAgICAgICAgICBmaWx0ZXJbUmVjaXBlTGlzdE1vZGVsLkNPTF9UWVBFXSA9IFsncmVjaXBlJ10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZpbHRlcltSZWNpcGVMaXN0TW9kZWwuQ09MX1RZUEVdID0gWydwYWNrYWdlZ3JvdXAnXQorCisgICAgICAgIG5ld19tb2RlbCA9IHNlbGYucmVjaXBlX21vZGVsLnRyZWVfbW9kZWwoZmlsdGVyLCBleGNsdWRlZF9pdGVtc19haGVhZD1UcnVlKQorICAgICAgICB0cmVlLnNldF9tb2RlbChuZXdfbW9kZWwpCisKKyAgICBkZWYgcmVuZGVyX2ZhZGVvdXQoc2VsZiwgdHJlZSwgY2VsbCk6CisgICAgICAgIGlmIChub3QgY2VsbCkgb3IgKG5vdCB0cmVlKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB0b19yZW5kZXJfY2VsbHMgPSBbXQorICAgICAgICBtb2RlbCA9IHRyZWUuZ2V0X21vZGVsKCkKKyAgICAgICAgaXQgPSBtb2RlbC5nZXRfaXRlcl9maXJzdCgpCisgICAgICAgIHdoaWxlIGl0OgorICAgICAgICAgICAgcGF0aCA9IG1vZGVsLmdldF9wYXRoKGl0KQorICAgICAgICAgICAgcHJldl9jZWxsX2lzX2FjdGl2ZSA9IG1vZGVsLmdldF92YWx1ZShpdCwgUmVjaXBlTGlzdE1vZGVsLkNPTF9GQURFX0lOQykKKyAgICAgICAgICAgIGN1cnJfY2VsbF9pc19hY3RpdmUgPSBtb2RlbC5nZXRfdmFsdWUoaXQsIFJlY2lwZUxpc3RNb2RlbC5DT0xfSU5DKQorICAgICAgICAgICAgaWYgKHByZXZfY2VsbF9pc19hY3RpdmUgPT0gVHJ1ZSkgYW5kIChjdXJyX2NlbGxfaXNfYWN0aXZlID09IEZhbHNlKToKKyAgICAgICAgICAgICAgICB0b19yZW5kZXJfY2VsbHMuYXBwZW5kKHBhdGgpCisgICAgICAgICAgICBpdCA9IG1vZGVsLml0ZXJfbmV4dChpdCkKKworICAgICAgICBjZWxsLmZhZGVvdXQodHJlZSwgMTAwMCwgdG9fcmVuZGVyX2NlbGxzKQorCisgICAgZGVmIGFmdGVyX2ZhZGVvdXRfY2hlY2tpbl9pbmNsdWRlKHNlbGYsIHRhYmxlLCBjdHJsLCBjZWxsLCB0cmVlLCBmaWx0ZXIpOgorICAgICAgICBzZWxmLnJlY2lwZV9tb2RlbC5zb3J0X2NvbHVtbl9pZCA9IHNlbGYuc29ydF9jb2x1bW5faWQKKyAgICAgICAgc2VsZi5yZWNpcGVfbW9kZWwuc29ydF9vcmRlciA9IHNlbGYuc29ydF9vcmRlcgorICAgICAgICB0cmVlLnNldF9tb2RlbChzZWxmLnJlY2lwZV9tb2RlbC50cmVlX21vZGVsKGZpbHRlcikpCisKKyAgICBkZWYgc2V0X3JlY2lwZV9jdXJyX3RhYihzZWxmLCBjdXJyX3BhZ2UpOgorICAgICAgICBzZWxmLmlucy5zZXRfY3VycmVudF9wYWdlKGN1cnJfcGFnZSkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9ydW5uaW5nYnVpbGQucHkgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvcnVubmluZ2J1aWxkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YTk1NWQKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvcnVubmluZ2J1aWxkLnB5CkBAIC0wLDAgKzEsNTUxIEBACisKKyMKKyMgQml0QmFrZSBHcmFwaGljYWwgR1RLIFVzZXIgSW50ZXJmYWNlCisjCisjIENvcHlyaWdodCAoQykgMjAwOCAgICAgICAgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgQXV0aG9yZWQgYnkgUm9iIEJyYWRmb3JkIDxyb2JAbGludXguaW50ZWwuY29tPgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworaW1wb3J0IGd0aworaW1wb3J0IGdvYmplY3QKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgdGltZQoraW1wb3J0IHVybGxpYgoraW1wb3J0IHVybGxpYjIKK2ltcG9ydCBwYW5nbworZnJvbSBiYi51aS5jcnVtYnMuaG9iY29sb3IgaW1wb3J0IEhvYkNvbG9ycworZnJvbSBiYi51aS5jcnVtYnMuaG9id2lkZ2V0IGltcG9ydCBIb2JXYXJwQ2VsbFJlbmRlcmVyVGV4dCwgSG9iQ2VsbFJlbmRlcmVyUGl4YnVmCisKK2NsYXNzIFJ1bm5pbmdCdWlsZE1vZGVsIChndGsuVHJlZVN0b3JlKToKKyAgICAoQ09MX0xPRywgQ09MX1BBQ0tBR0UsIENPTF9UQVNLLCBDT0xfTUVTU0FHRSwgQ09MX0lDT04sIENPTF9DT0xPUiwgQ09MX05VTV9BQ1RJVkUpID0gcmFuZ2UoNykKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZik6CisgICAgICAgIGd0ay5UcmVlU3RvcmUuX19pbml0X18gKHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9JTlQpCisKKyAgICBkZWYgZmFpbHVyZV9tb2RlbF9maWx0ZXIoc2VsZiwgbW9kZWwsIGl0KToKKyAgICAgICAgY29sb3IgPSBtb2RlbC5nZXQoaXQsIHNlbGYuQ09MX0NPTE9SKVswXQorICAgICAgICBpZiBub3QgY29sb3I6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgaWYgY29sb3IgPT0gSG9iQ29sb3JzLkVSUk9SIG9yIGNvbG9yID09IEhvYkNvbG9ycy5XQVJOSU5HOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgZmFpbHVyZV9tb2RlbChzZWxmKToKKyAgICAgICAgbW9kZWwgPSBzZWxmLmZpbHRlcl9uZXcoKQorICAgICAgICBtb2RlbC5zZXRfdmlzaWJsZV9mdW5jKHNlbGYuZmFpbHVyZV9tb2RlbF9maWx0ZXIpCisgICAgICAgIHJldHVybiBtb2RlbAorCisgICAgZGVmIGZvcmVhY2hfY2VsbF9mdW5jKHNlbGYsIG1vZGVsLCBwYXRoLCBpdGVyLCB1c3JfZGF0YT1Ob25lKToKKyAgICAgICAgaWYgbW9kZWwuZ2V0X3ZhbHVlKGl0ZXIsIHNlbGYuQ09MX0lDT04pID09ICJndGstZXhlY3V0ZSI6CisgICAgICAgICAgICBtb2RlbC5zZXQoaXRlciwgc2VsZi5DT0xfSUNPTiwgIiIpCisKKyAgICBkZWYgY2xvc2VfdGFza19yZWZyZXNoKHNlbGYpOgorICAgICAgICBzZWxmLmZvcmVhY2goc2VsZi5mb3JlYWNoX2NlbGxfZnVuYywgTm9uZSkKKworY2xhc3MgUnVubmluZ0J1aWxkIChnb2JqZWN0LkdPYmplY3QpOgorICAgIF9fZ3NpZ25hbHNfXyA9IHsKKyAgICAgICAgICAnYnVpbGQtc3RhcnRlZCcgICA6ICAoZ29iamVjdC5TSUdOQUxfUlVOX0xBU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpKSwKKyAgICAgICAgICAnYnVpbGQtc3VjY2VlZGVkJyA6ICAoZ29iamVjdC5TSUdOQUxfUlVOX0xBU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpKSwKKyAgICAgICAgICAnYnVpbGQtZmFpbGVkJyAgICA6ICAoZ29iamVjdC5TSUdOQUxfUlVOX0xBU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpKSwKKyAgICAgICAgICAnYnVpbGQtY29tcGxldGUnICA6ICAoZ29iamVjdC5TSUdOQUxfUlVOX0xBU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpKSwKKyAgICAgICAgICAnYnVpbGQtYWJvcnRlZCcgICA6ICAoZ29iamVjdC5TSUdOQUxfUlVOX0xBU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpKSwKKyAgICAgICAgICAndGFzay1zdGFydGVkJyAgICA6ICAoZ29iamVjdC5TSUdOQUxfUlVOX0xBU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnb2JqZWN0LlRZUEVfUFlPQkpFQ1QsKSksCisgICAgICAgICAgJ2xvZy1lcnJvcicgICAgICAgOiAgKGdvYmplY3QuU0lHTkFMX1JVTl9MQVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSksCisgICAgICAgICAgJ2xvZy13YXJuaW5nJyAgICAgOiAgKGdvYmplY3QuU0lHTkFMX1JVTl9MQVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSksCisgICAgICAgICAgJ2Rpc2stZnVsbCcgICAgICAgOiAgKGdvYmplY3QuU0lHTkFMX1JVTl9MQVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSksCisgICAgICAgICAgJ25vLXByb3ZpZGVyJyAgICAgOiAgKGdvYmplY3QuU0lHTkFMX1JVTl9MQVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ29iamVjdC5UWVBFX1BZT0JKRUNULCkpLAorICAgICAgICAgICdsb2cnICAgICAgICAgICAgIDogIChnb2JqZWN0LlNJR05BTF9SVU5fTEFTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdvYmplY3QuVFlQRV9TVFJJTkcsIGdvYmplY3QuVFlQRV9QWU9CSkVDVCwpKSwKKyAgICAgICAgICB9CisgICAgcGlkc190b190YXNrID0ge30KKyAgICB0YXNrc190b19pdGVyID0ge30KKworICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgc2VxdWVudGlhbD1GYWxzZSk6CisgICAgICAgIGdvYmplY3QuR09iamVjdC5fX2luaXRfXyAoc2VsZikKKyAgICAgICAgc2VsZi5tb2RlbCA9IFJ1bm5pbmdCdWlsZE1vZGVsKCkKKyAgICAgICAgc2VsZi5zZXF1ZW50aWFsID0gc2VxdWVudGlhbAorICAgICAgICBzZWxmLmJ1aWxkYWJvcnRlZCA9IEZhbHNlCisKKyAgICBkZWYgcmVzZXQgKHNlbGYpOgorICAgICAgICBzZWxmLnBpZHNfdG9fdGFzay5jbGVhcigpCisgICAgICAgIHNlbGYudGFza3NfdG9faXRlci5jbGVhcigpCisgICAgICAgIHNlbGYubW9kZWwuY2xlYXIoKQorCisgICAgZGVmIGhhbmRsZV9ldmVudCAoc2VsZiwgZXZlbnQsIHBiYXI9Tm9uZSk6CisgICAgICAgICMgSGFuZGxlIGFuIGV2ZW50IGZyb20gdGhlIGV2ZW50IHF1ZXVlLCB0aGlzIG1heSByZXN1bHQgaW4gdXBkYXRpbmcKKyAgICAgICAgIyB0aGUgbW9kZWwgYW5kIHRodXMgdGhlIFVJLiBPciBpdCBtYXkgYmUgdG8gdGVsbCB1cyB0aGF0IHRoZSBidWlsZAorICAgICAgICAjIGhhcyBmaW5pc2hlZCBzdWNjZXNzZnVsbHkgKG9yIG5vdCwgYXMgdGhlIGNhc2UgbWF5IGJlLikKKworICAgICAgICBwYXJlbnQgPSBOb25lCisgICAgICAgIHBpZCA9IDAKKyAgICAgICAgcGFja2FnZSA9IE5vbmUKKyAgICAgICAgdGFzayA9IE5vbmUKKworICAgICAgICAjIElmIHdlIGhhdmUgYSBwaWQgYXR0YWNoZWQgdG8gdGhpcyBtZXNzYWdlL2V2ZW50IHRyeSBhbmQgZ2V0IHRoZQorICAgICAgICAjIChwYWNrYWdlLCB0YXNrKSBwYWlyIGZvciBpdC4gSWYgd2UgZ2V0IHRoYXQgdGhlbiBnZXQgdGhlIHBhcmVudCBpdGVyCisgICAgICAgICMgZm9yIHRoZSBtZXNzYWdlLgorICAgICAgICBpZiBoYXNhdHRyKGV2ZW50LCAncGlkJyk6CisgICAgICAgICAgICBwaWQgPSBldmVudC5waWQKKyAgICAgICAgaWYgaGFzYXR0cihldmVudCwgJ3Byb2Nlc3MnKToKKyAgICAgICAgICAgIHBpZCA9IGV2ZW50LnByb2Nlc3MKKworICAgICAgICBpZiBwaWQgYW5kIHBpZCBpbiBzZWxmLnBpZHNfdG9fdGFzazoKKyAgICAgICAgICAgIChwYWNrYWdlLCB0YXNrKSA9IHNlbGYucGlkc190b190YXNrW3BpZF0KKyAgICAgICAgICAgIHBhcmVudCA9IHNlbGYudGFza3NfdG9faXRlclsocGFja2FnZSwgdGFzayldCisKKyAgICAgICAgaWYoaXNpbnN0YW5jZShldmVudCwgbG9nZ2luZy5Mb2dSZWNvcmQpKToKKyAgICAgICAgICAgIGlmIGV2ZW50LnRhc2twaWQgPT0gMCBvciBldmVudC5sZXZlbG5vID4gbG9nZ2luZy5JTkZPOgorICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgibG9nIiwgImhhbmRsZSIsIGV2ZW50KQorICAgICAgICAgICAgIyBGSVhNRTogdGhpcyBpcyBhIGhhY2shIE1vcmUgaW5mbyBpbiBZb2N0byAjMTQzMworICAgICAgICAgICAgIyBodHRwOi8vYnVnemlsbGEucG9reWxpbnV4Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQzMywgdGVtcG9yYXJpbHkKKyAgICAgICAgICAgICMgbWFzayB0aGUgZXJyb3IgbWVzc2FnZSBhcyBpdCdzIG5vdCBpbmZvcm1hdGl2ZSBmb3IgdGhlIHVzZXIuCisgICAgICAgICAgICBpZiBldmVudC5tc2cuc3RhcnRzd2l0aCgiRXhlY3V0aW9uIG9mIGV2ZW50IGhhbmRsZXIgJ3J1bl9idWlsZHN0YXRzJyBmYWlsZWQiKToKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAgICAgaWYgKGV2ZW50LmxldmVsbm8gPCBsb2dnaW5nLklORk8gb3IKKyAgICAgICAgICAgICAgICBldmVudC5tc2cuc3RhcnRzd2l0aCgiUnVubmluZyB0YXNrIikpOgorICAgICAgICAgICAgICAgIHJldHVybiAjIGRvbid0IGFkZCB0aGVzZSB0byB0aGUgbGlzdAorCisgICAgICAgICAgICBpZiBldmVudC5sZXZlbG5vID49IGxvZ2dpbmcuRVJST1I6CisgICAgICAgICAgICAgICAgaWNvbiA9ICJkaWFsb2ctZXJyb3IiCisgICAgICAgICAgICAgICAgY29sb3IgPSBIb2JDb2xvcnMuRVJST1IKKyAgICAgICAgICAgICAgICBzZWxmLmVtaXQoImxvZy1lcnJvciIpCisgICAgICAgICAgICBlbGlmIGV2ZW50LmxldmVsbm8gPj0gbG9nZ2luZy5XQVJOSU5HOgorICAgICAgICAgICAgICAgIGljb24gPSAiZGlhbG9nLXdhcm5pbmciCisgICAgICAgICAgICAgICAgY29sb3IgPSBIb2JDb2xvcnMuV0FSTklORworICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgibG9nLXdhcm5pbmciKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpY29uID0gTm9uZQorICAgICAgICAgICAgICAgIGNvbG9yID0gSG9iQ29sb3JzLk9LCisKKyAgICAgICAgICAgICMgaWYgd2Uga25vdyB3aGljaCBwYWNrYWdlIHdlIGJlbG9uZyB0bywgd2UnbGwgYXBwZW5kIG9udG8gaXRzIGxpc3QuCisgICAgICAgICAgICAjIG90aGVyd2lzZSwgd2UnbGwganVtcCB0byB0aGUgdG9wIG9mIHRoZSBtYXN0ZXIgbGlzdAorICAgICAgICAgICAgaWYgc2VsZi5zZXF1ZW50aWFsIG9yIG5vdCBwYXJlbnQ6CisgICAgICAgICAgICAgICAgdHJlZV9hZGQgPSBzZWxmLm1vZGVsLmFwcGVuZAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0cmVlX2FkZCA9IHNlbGYubW9kZWwucHJlcGVuZAorICAgICAgICAgICAgdHJlZV9hZGQocGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgKE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICB0YXNrLAorICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldE1lc3NhZ2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICBpY29uLAorICAgICAgICAgICAgICAgICAgICAgIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgIDApKQorCisgICAgICAgICAgICAjIGlmIHRoZXJlIGFyZSB3YXJuaW5ncyB3aGlsZSBwcm9jZXNzaW5nIGEgcGFja2FnZQorICAgICAgICAgICAgIyAgKHBhcmVudCksIG1hcmsgdGhlIHRhc2sgd2l0aCB3YXJuaW5nIGNvbG9yOworICAgICAgICAgICAgIyBpbiBjYXNlIHRoZXJlIGFyZSBlcnJvcnMsIHRoZSB1cGRhdGVzIHdpbGwgYmUKKyAgICAgICAgICAgICMgIGhhbmRsZWQgb24gVGFza0ZhaWxlZC4KKyAgICAgICAgICAgIGlmIGNvbG9yID09IEhvYkNvbG9ycy5XQVJOSU5HIGFuZCBwYXJlbnQ6CisgICAgICAgICAgICAgICAgc2VsZi5tb2RlbC5zZXQocGFyZW50LCBzZWxmLm1vZGVsLkNPTF9DT0xPUiwgY29sb3IpCisgICAgICAgICAgICAgICAgaWYgdGFzazogI3RoZW4gd2UgaGF2ZSBhIHBhcmVudCAocGFja2FnZSksIGFuZCB1cGRhdGUgaXQncyBjb2xvcgorICAgICAgICAgICAgICAgICAgICBzZWxmLm1vZGVsLnNldChzZWxmLnRhc2tzX3RvX2l0ZXJbKHBhY2thZ2UsIE5vbmUpXSwgc2VsZi5tb2RlbC5DT0xfQ09MT1IsIGNvbG9yKQorCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShldmVudCwgYmIuYnVpbGQuVGFza1N0YXJ0ZWQpOgorICAgICAgICAgICAgKHBhY2thZ2UsIHRhc2spID0gKGV2ZW50Ll9wYWNrYWdlLCBldmVudC5fdGFzaykKKworICAgICAgICAgICAgIyBTYXZlIG91dCB0aGlzIFBJRC4KKyAgICAgICAgICAgIHNlbGYucGlkc190b190YXNrW3BpZF0gPSAocGFja2FnZSwgdGFzaykKKworICAgICAgICAgICAgIyBDaGVjayBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhpcyBwYWNrYWdlIGluIG91ciBtb2RlbC4gSWYgc28gdGhlbgorICAgICAgICAgICAgIyB0aGF0IGNhbiBiZSB0aGUgcGFyZW50IGZvciB0aGUgdGFzay4gT3RoZXJ3aXNlIHdlIGNyZWF0ZSBhIG5ldworICAgICAgICAgICAgIyB0b3AgbGV2ZWwgZm9yIHRoZSBwYWNrYWdlLgorICAgICAgICAgICAgaWYgKChwYWNrYWdlLCBOb25lKSBpbiBzZWxmLnRhc2tzX3RvX2l0ZXIpOgorICAgICAgICAgICAgICAgIHBhcmVudCA9IHNlbGYudGFza3NfdG9faXRlclsocGFja2FnZSwgTm9uZSldCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuc2VxdWVudGlhbDoKKyAgICAgICAgICAgICAgICAgICAgYWRkID0gc2VsZi5tb2RlbC5hcHBlbmQKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBhZGQgPSBzZWxmLm1vZGVsLnByZXBlbmQKKyAgICAgICAgICAgICAgICBwYXJlbnQgPSBhZGQoTm9uZSwgKE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQYWNrYWdlOiAlcyIgJSAocGFja2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSG9iQ29sb3JzLk9LLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkpCisgICAgICAgICAgICAgICAgc2VsZi50YXNrc190b19pdGVyWyhwYWNrYWdlLCBOb25lKV0gPSBwYXJlbnQKKworICAgICAgICAgICAgIyBCZWNhdXNlIHRoaXMgcGFyZW50IHBhY2thZ2Ugbm93IGhhcyBhbiBhY3RpdmUgY2hpbGQgbWFyayBpdCBhcworICAgICAgICAgICAgIyBzdWNoLgorICAgICAgICAgICAgc2VsZi5tb2RlbC5zZXQocGFyZW50LCBzZWxmLm1vZGVsLkNPTF9JQ09OLCAiZ3RrLWV4ZWN1dGUiKQorICAgICAgICAgICAgcGFyZW50X2NvbG9yID0gc2VsZi5tb2RlbC5nZXQocGFyZW50LCBzZWxmLm1vZGVsLkNPTF9DT0xPUilbMF0KKyAgICAgICAgICAgIGlmIHBhcmVudF9jb2xvciAhPSBIb2JDb2xvcnMuRVJST1IgYW5kIHBhcmVudF9jb2xvciAhPSBIb2JDb2xvcnMuV0FSTklORzoKKyAgICAgICAgICAgICAgICBzZWxmLm1vZGVsLnNldChwYXJlbnQsIHNlbGYubW9kZWwuQ09MX0NPTE9SLCBIb2JDb2xvcnMuUlVOTklORykKKworICAgICAgICAgICAgIyBBZGQgYW4gZW50cnkgaW4gdGhlIG1vZGVsIGZvciB0aGlzIHRhc2sKKyAgICAgICAgICAgIGkgPSBzZWxmLm1vZGVsLmFwcGVuZCAocGFyZW50LCAoTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRhc2s6ICVzIiAlICh0YXNrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImd0ay1leGVjdXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSG9iQ29sb3JzLlJVTk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApKQorCisgICAgICAgICAgICAjIHVwZGF0ZSB0aGUgcGFyZW50J3MgYWN0aXZlIHRhc2sgY291bnQKKyAgICAgICAgICAgIG51bV9hY3RpdmUgPSBzZWxmLm1vZGVsLmdldChwYXJlbnQsIHNlbGYubW9kZWwuQ09MX05VTV9BQ1RJVkUpWzBdICsgMQorICAgICAgICAgICAgc2VsZi5tb2RlbC5zZXQocGFyZW50LCBzZWxmLm1vZGVsLkNPTF9OVU1fQUNUSVZFLCBudW1fYWN0aXZlKQorCisgICAgICAgICAgICAjIFNhdmUgb3V0IHRoZSBpdGVyIHNvIHRoYXQgd2UgY2FuIGZpbmQgaXQgd2hlbiB3ZSBoYXZlIGEgbWVzc2FnZQorICAgICAgICAgICAgIyB0aGF0IHdlIG5lZWQgdG8gYXR0YWNoIHRvIGEgdGFzay4KKyAgICAgICAgICAgIHNlbGYudGFza3NfdG9faXRlclsocGFja2FnZSwgdGFzayldID0gaQorCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShldmVudCwgYmIuYnVpbGQuVGFza0Jhc2UpOgorICAgICAgICAgICAgc2VsZi5lbWl0KCJsb2ciLCAiaW5mbyIsIGV2ZW50Ll9tZXNzYWdlKQorICAgICAgICAgICAgY3VycmVudCA9IHNlbGYudGFza3NfdG9faXRlclsocGFja2FnZSwgdGFzayldCisgICAgICAgICAgICBwYXJlbnQgPSBzZWxmLnRhc2tzX3RvX2l0ZXJbKHBhY2thZ2UsIE5vbmUpXQorCisgICAgICAgICAgICAjIHJlbW92ZSB0aGlzIHRhc2sgZnJvbSB0aGUgcGFyZW50J3MgYWN0aXZlIGNvdW50CisgICAgICAgICAgICBudW1fYWN0aXZlID0gc2VsZi5tb2RlbC5nZXQocGFyZW50LCBzZWxmLm1vZGVsLkNPTF9OVU1fQUNUSVZFKVswXSAtIDEKKyAgICAgICAgICAgIHNlbGYubW9kZWwuc2V0KHBhcmVudCwgc2VsZi5tb2RlbC5DT0xfTlVNX0FDVElWRSwgbnVtX2FjdGl2ZSkKKworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuYnVpbGQuVGFza0ZhaWxlZCk6CisgICAgICAgICAgICAgICAgIyBNYXJrIHRoZSB0YXNrIGFuZCBwYXJlbnQgYXMgZmFpbGVkCisgICAgICAgICAgICAgICAgaWNvbiA9ICJkaWFsb2ctZXJyb3IiCisgICAgICAgICAgICAgICAgY29sb3IgPSBIb2JDb2xvcnMuRVJST1IKKworICAgICAgICAgICAgICAgIGxvZ2ZpbGUgPSBldmVudC5sb2dmaWxlCisgICAgICAgICAgICAgICAgaWYgbG9nZmlsZSBhbmQgb3MucGF0aC5leGlzdHMobG9nZmlsZSk6CisgICAgICAgICAgICAgICAgICAgIHdpdGggb3Blbihsb2dmaWxlKSBhcyBmOgorICAgICAgICAgICAgICAgICAgICAgICAgbG9nZGF0YSA9IGYucmVhZCgpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1vZGVsLmFwcGVuZChjdXJyZW50LCAoJ3Bhc3RlYmluJywgTm9uZSwgTm9uZSwgbG9nZGF0YSwgJ2d0ay1lcnJvcicsIEhvYkNvbG9ycy5PSywgMCkpCisKKyAgICAgICAgICAgICAgICBmb3IgaSBpbiAoY3VycmVudCwgcGFyZW50KToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5tb2RlbC5zZXQoaSwgc2VsZi5tb2RlbC5DT0xfSUNPTiwgaWNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tb2RlbC5DT0xfQ09MT1IsIGNvbG9yKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIE1hcmsgdGhlIHBhcmVudCBwYWNrYWdlIGFuZCB0aGUgdGFzayBhcyBpbmFjdGl2ZSwKKyAgICAgICAgICAgICAgICAjIGJ1dCBtYWtlIHN1cmUgdG8gcHJlc2VydmUgZXJyb3IsIHdhcm5pbmdzIGFuZCBhY3RpdmUKKyAgICAgICAgICAgICAgICAjIHN0YXRlcworICAgICAgICAgICAgICAgIHBhcmVudF9jb2xvciA9IHNlbGYubW9kZWwuZ2V0KHBhcmVudCwgc2VsZi5tb2RlbC5DT0xfQ09MT1IpWzBdCisgICAgICAgICAgICAgICAgdGFza19jb2xvciA9IHNlbGYubW9kZWwuZ2V0KGN1cnJlbnQsIHNlbGYubW9kZWwuQ09MX0NPTE9SKVswXQorCisgICAgICAgICAgICAgICAgIyBNYXJrIHRoZSB0YXNrIGFzIGluYWN0aXZlCisgICAgICAgICAgICAgICAgc2VsZi5tb2RlbC5zZXQoY3VycmVudCwgc2VsZi5tb2RlbC5DT0xfSUNPTiwgTm9uZSkKKyAgICAgICAgICAgICAgICBpZiB0YXNrX2NvbG9yICE9IEhvYkNvbG9ycy5FUlJPUjoKKyAgICAgICAgICAgICAgICAgICAgaWYgdGFza19jb2xvciA9PSBIb2JDb2xvcnMuV0FSTklORzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubW9kZWwuc2V0KGN1cnJlbnQsIHNlbGYubW9kZWwuQ09MX0lDT04sICdkaWFsb2ctd2FybmluZycpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1vZGVsLnNldChjdXJyZW50LCBzZWxmLm1vZGVsLkNPTF9DT0xPUiwgSG9iQ29sb3JzLk9LKQorCisgICAgICAgICAgICAgICAgIyBNYXJrIHRoZSBwYXJlbnQgYXMgaW5hY3RpdmUKKyAgICAgICAgICAgICAgICBpZiBwYXJlbnRfY29sb3IgIT0gSG9iQ29sb3JzLkVSUk9SOgorICAgICAgICAgICAgICAgICAgICBpZiBwYXJlbnRfY29sb3IgPT0gSG9iQ29sb3JzLldBUk5JTkc6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1vZGVsLnNldChwYXJlbnQsIHNlbGYubW9kZWwuQ09MX0lDT04sICJkaWFsb2ctd2FybmluZyIpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1vZGVsLnNldChwYXJlbnQsIHNlbGYubW9kZWwuQ09MX0lDT04sIE5vbmUpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBudW1fYWN0aXZlID09IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tb2RlbC5zZXQocGFyZW50LCBzZWxmLm1vZGVsLkNPTF9DT0xPUiwgSG9iQ29sb3JzLk9LKQorCisgICAgICAgICAgICAjIENsZWFyIHRoZSBpdGVycyBhbmQgdGhlIHBpZHMgc2luY2Ugd2hlbiB0aGUgdGFzayBnb2VzIGF3YXkgdGhlCisgICAgICAgICAgICAjIHBpZCB3aWxsIG5vIGxvbmdlciBiZSB1c2VkIGZvciBtZXNzYWdlcworICAgICAgICAgICAgZGVsIHNlbGYudGFza3NfdG9faXRlclsocGFja2FnZSwgdGFzayldCisgICAgICAgICAgICBkZWwgc2VsZi5waWRzX3RvX3Rhc2tbcGlkXQorCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuQnVpbGRTdGFydGVkKToKKworICAgICAgICAgICAgc2VsZi5lbWl0KCJidWlsZC1zdGFydGVkIikKKyAgICAgICAgICAgIHNlbGYubW9kZWwucHJlcGVuZChOb25lLCAoTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJ1aWxkIFN0YXJ0ZWQgKCVzKSIgJSB0aW1lLnN0cmZ0aW1lKCclbS8lZC8lWSAlSDolTTolUycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIb2JDb2xvcnMuT0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApKQorICAgICAgICAgICAgaWYgcGJhcjoKKyAgICAgICAgICAgICAgICBwYmFyLnVwZGF0ZSgwLCBzZWxmLnByb2dyZXNzX3RvdGFsKQorICAgICAgICAgICAgICAgIHBiYXIuc2V0X3RpdGxlKGJiLmV2ZW50LmdldE5hbWUoZXZlbnQpKQorCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuQnVpbGRDb21wbGV0ZWQpOgorICAgICAgICAgICAgZmFpbHVyZXMgPSBpbnQgKGV2ZW50Ll9mYWlsdXJlcykKKyAgICAgICAgICAgIHNlbGYubW9kZWwucHJlcGVuZChOb25lLCAoTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJ1aWxkIENvbXBsZXRlZCAoJXMpIiAlIHRpbWUuc3RyZnRpbWUoJyVtLyVkLyVZICVIOiVNOiVTJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhvYkNvbG9ycy5PSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkpCisKKyAgICAgICAgICAgICMgRW1pdCB0aGUgYXBwcm9wcmlhdGUgc2lnbmFsIGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIGZhaWx1cmVzCisgICAgICAgICAgICBpZiBzZWxmLmJ1aWxkYWJvcnRlZDoKKyAgICAgICAgICAgICAgICBzZWxmLmVtaXQgKCJidWlsZC1hYm9ydGVkIikKKyAgICAgICAgICAgICAgICBzZWxmLmJ1aWxkYWJvcnRlZCA9IEZhbHNlCisgICAgICAgICAgICBlbGlmIChmYWlsdXJlcyA+PSAxKToKKyAgICAgICAgICAgICAgICBzZWxmLmVtaXQgKCJidWlsZC1mYWlsZWQiKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmVtaXQgKCJidWlsZC1zdWNjZWVkZWQiKQorICAgICAgICAgICAgIyBFbWl0IGEgZ2VuZXJpYyAiYnVpbGQtY29tcGxldGUiIHNpZ25hbCBmb3IgdGhpbmdzIHdpc2hpbmcgdG8KKyAgICAgICAgICAgICMgaGFuZGxlIHdoZW4gdGhlIGJ1aWxkIGlzIGZpbmlzaGVkCisgICAgICAgICAgICBzZWxmLmVtaXQoImJ1aWxkLWNvbXBsZXRlIikKKyAgICAgICAgICAgICMgcmVzZXQgdGhlIGFsbCBjZWxsJ3MgaWNvbiBpbmRpY2F0b3IKKyAgICAgICAgICAgIHNlbGYubW9kZWwuY2xvc2VfdGFza19yZWZyZXNoKCkKKyAgICAgICAgICAgIGlmIHBiYXI6CisgICAgICAgICAgICAgICAgcGJhci5zZXRfdGV4dChldmVudC5tc2cpCisKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5EaXNrRnVsbCk6CisgICAgICAgICAgICBzZWxmLmJ1aWxkYWJvcnRlZCA9IFRydWUKKyAgICAgICAgICAgIHNlbGYuZW1pdCgiZGlzay1mdWxsIikKKworICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmNvbW1hbmQuQ29tbWFuZEZhaWxlZCk6CisgICAgICAgICAgICBzZWxmLmVtaXQoImxvZyIsICJlcnJvciIsICJDb21tYW5kIGV4ZWN1dGlvbiBmYWlsZWQ6ICVzIiAlIChldmVudC5lcnJvcikpCisgICAgICAgICAgICBpZiBldmVudC5lcnJvci5zdGFydHN3aXRoKCJFeGl0ZWQgd2l0aCIpOgorICAgICAgICAgICAgICAgICMgSWYgdGhlIGNvbW1hbmQgZmFpbHMgd2l0aCBhbiBleGl0IGNvZGUgd2UncmUgZG9uZSwgZW1pdCB0aGUKKyAgICAgICAgICAgICAgICAjIGdlbmVyaWMgc2lnbmFsIGZvciB0aGUgVUkgdG8gbm90aWZ5IHRoZSB1c2VyCisgICAgICAgICAgICAgICAgc2VsZi5lbWl0KCJidWlsZC1jb21wbGV0ZSIpCisgICAgICAgICAgICAgICAgIyByZXNldCB0aGUgYWxsIGNlbGwncyBpY29uIGluZGljYXRvcgorICAgICAgICAgICAgICAgIHNlbGYubW9kZWwuY2xvc2VfdGFza19yZWZyZXNoKCkKKworICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LkNhY2hlTG9hZFN0YXJ0ZWQpIGFuZCBwYmFyOgorICAgICAgICAgICAgcGJhci5zZXRfdGl0bGUoIkxvYWRpbmcgY2FjaGUiKQorICAgICAgICAgICAgc2VsZi5wcm9ncmVzc190b3RhbCA9IGV2ZW50LnRvdGFsCisgICAgICAgICAgICBwYmFyLnVwZGF0ZSgwLCBzZWxmLnByb2dyZXNzX3RvdGFsKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LkNhY2hlTG9hZFByb2dyZXNzKSBhbmQgcGJhcjoKKyAgICAgICAgICAgIHBiYXIudXBkYXRlKGV2ZW50LmN1cnJlbnQsIHNlbGYucHJvZ3Jlc3NfdG90YWwpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuQ2FjaGVMb2FkQ29tcGxldGVkKSBhbmQgcGJhcjoKKyAgICAgICAgICAgIHBiYXIudXBkYXRlKHNlbGYucHJvZ3Jlc3NfdG90YWwsIHNlbGYucHJvZ3Jlc3NfdG90YWwpCisgICAgICAgICAgICBwYmFyLmhpZGUoKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LlBhcnNlU3RhcnRlZCkgYW5kIHBiYXI6CisgICAgICAgICAgICBpZiBldmVudC50b3RhbCA9PSAwOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgcGJhci5zZXRfdGl0bGUoIlByb2Nlc3NpbmcgcmVjaXBlcyIpCisgICAgICAgICAgICBzZWxmLnByb2dyZXNzX3RvdGFsID0gZXZlbnQudG90YWwKKyAgICAgICAgICAgIHBiYXIudXBkYXRlKDAsIHNlbGYucHJvZ3Jlc3NfdG90YWwpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuUGFyc2VQcm9ncmVzcykgYW5kIHBiYXI6CisgICAgICAgICAgICBwYmFyLnVwZGF0ZShldmVudC5jdXJyZW50LCBzZWxmLnByb2dyZXNzX3RvdGFsKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LlBhcnNlQ29tcGxldGVkKSBhbmQgcGJhcjoKKyAgICAgICAgICAgIHBiYXIuaGlkZSgpCisgICAgICAgICN1c2luZyBydW5xdWV1ZSBldmVudHMgYXMgbWFueSBhcyBwb3NzaWJsZSB0byB1cGRhdGUgdGhlIHByb2dyZXNzIGJhcgorICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLnJ1bnF1ZXVlLnJ1blF1ZXVlVGFza0ZhaWxlZCk6CisgICAgICAgICAgICBzZWxmLmVtaXQoImxvZyIsICJlcnJvciIsICJUYXNrICVzICglcykgZmFpbGVkIHdpdGggZXhpdCBjb2RlICclcyciICUgKGV2ZW50LnRhc2tpZCwgZXZlbnQudGFza3N0cmluZywgZXZlbnQuZXhpdGNvZGUpKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLnJ1bnF1ZXVlLnNjZW5lUXVldWVUYXNrRmFpbGVkKToKKyAgICAgICAgICAgIHNlbGYuZW1pdCgibG9nIiwgIndhcm4iLCAiU2V0c2NlbmUgdGFzayAlcyAoJXMpIGZhaWxlZCB3aXRoIGV4aXQgY29kZSAnJXMnIC0gcmVhbCB0YXNrIHdpbGwgYmUgcnVuIGluc3RlYWQiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChldmVudC50YXNraWQsIGV2ZW50LnRhc2tzdHJpbmcsIGV2ZW50LmV4aXRjb2RlKSkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGV2ZW50LCAoYmIucnVucXVldWUucnVuUXVldWVUYXNrU3RhcnRlZCwgYmIucnVucXVldWUuc2NlbmVRdWV1ZVRhc2tTdGFydGVkKSk6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ydW5xdWV1ZS5zY2VuZVF1ZXVlVGFza1N0YXJ0ZWQpOgorICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgibG9nIiwgImluZm8iLCAiUnVubmluZyBzZXRzY2VuZSB0YXNrICVkIG9mICVkICglcykiICUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXZlbnQuc3RhdHMuY29tcGxldGVkICsgZXZlbnQuc3RhdHMuYWN0aXZlICsgZXZlbnQuc3RhdHMuZmFpbGVkICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0YXRzLnRvdGFsLCBldmVudC50YXNrc3RyaW5nKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgZXZlbnQubm9leGVjOgorICAgICAgICAgICAgICAgICAgICB0YXNrdHlwZSA9ICdub2V4ZWMgdGFzaycKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB0YXNrdHlwZSA9ICd0YXNrJworICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgibG9nIiwgImluZm8iLCAiUnVubmluZyAlcyAlcyBvZiAlcyAoSUQ6ICVzLCAlcykiICUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGFza3R5cGUsIGV2ZW50LnN0YXRzLmNvbXBsZXRlZCArIGV2ZW50LnN0YXRzLmFjdGl2ZSArIGV2ZW50LnN0YXRzLmZhaWxlZCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5zdGF0cy50b3RhbCwgZXZlbnQudGFza2lkLCBldmVudC50YXNrc3RyaW5nKSkKKyAgICAgICAgICAgIG1lc3NhZ2UgPSB7fQorICAgICAgICAgICAgbWVzc2FnZVsiZXZlbnRuYW1lIl0gPSBiYi5ldmVudC5nZXROYW1lKGV2ZW50KQorICAgICAgICAgICAgbnVtX29mX2NvbXBsZXRlZCA9IGV2ZW50LnN0YXRzLmNvbXBsZXRlZCArIGV2ZW50LnN0YXRzLmZhaWxlZAorICAgICAgICAgICAgbWVzc2FnZVsiY3VycmVudCJdID0gbnVtX29mX2NvbXBsZXRlZAorICAgICAgICAgICAgbWVzc2FnZVsidG90YWwiXSA9IGV2ZW50LnN0YXRzLnRvdGFsCisgICAgICAgICAgICBtZXNzYWdlWyJ0aXRsZSJdID0gIiIKKyAgICAgICAgICAgIG1lc3NhZ2VbInRhc2siXSA9IGV2ZW50LnRhc2tzdHJpbmcKKyAgICAgICAgICAgIHNlbGYuZW1pdCgidGFzay1zdGFydGVkIiwgbWVzc2FnZSkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5NdWx0aXBsZVByb3ZpZGVycyk6CisgICAgICAgICAgICBzZWxmLmVtaXQoImxvZyIsICJpbmZvIiwgIm11bHRpcGxlIHByb3ZpZGVycyBhcmUgYXZhaWxhYmxlIGZvciAlcyVzICglcykiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChldmVudC5faXNfcnVudGltZSBhbmQgInJ1bnRpbWUgIiBvciAiIiwgZXZlbnQuX2l0ZW0sICIsICIuam9pbihldmVudC5fY2FuZGlkYXRlcykpKQorICAgICAgICAgICAgc2VsZi5lbWl0KCJsb2ciLCAiaW5mbyIsICJjb25zaWRlciBkZWZpbmluZyBhIFBSRUZFUlJFRF9QUk9WSURFUiBlbnRyeSB0byBtYXRjaCAlcyIgJSAoZXZlbnQuX2l0ZW0pKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50Lk5vUHJvdmlkZXIpOgorICAgICAgICAgICAgbXNnID0gIiIKKyAgICAgICAgICAgIGlmIGV2ZW50Ll9ydW50aW1lOgorICAgICAgICAgICAgICAgIHIgPSAiUiIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgciA9ICIiCisKKyAgICAgICAgICAgIGV4dHJhID0gJycKKyAgICAgICAgICAgIGlmIG5vdCBldmVudC5fcmVhc29uczoKKyAgICAgICAgICAgICAgICBpZiBldmVudC5fY2xvc2VfbWF0Y2hlczoKKyAgICAgICAgICAgICAgICAgICAgZXh0cmEgPSAiLiBDbG9zZSBtYXRjaGVzOlxuICAlcyIgJSAnXG4gICcuam9pbihldmVudC5fY2xvc2VfbWF0Y2hlcykKKworICAgICAgICAgICAgaWYgZXZlbnQuX2RlcGVuZGVlczoKKyAgICAgICAgICAgICAgICBtc2cgPSAiTm90aGluZyAlc1BST1ZJREVTICclcycgKGJ1dCAlcyAlc0RFUEVORFMgb24gb3Igb3RoZXJ3aXNlIHJlcXVpcmVzIGl0KSVzXG4iICUgKHIsIGV2ZW50Ll9pdGVtLCAiLCAiLmpvaW4oZXZlbnQuX2RlcGVuZGVlcyksIHIsIGV4dHJhKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBtc2cgPSAiTm90aGluZyAlc1BST1ZJREVTICclcyclc1xuIiAlIChyLCBldmVudC5faXRlbSwgZXh0cmEpCisgICAgICAgICAgICBpZiBldmVudC5fcmVhc29uczoKKyAgICAgICAgICAgICAgICBmb3IgcmVhc29uIGluIGV2ZW50Ll9yZWFzb25zOgorICAgICAgICAgICAgICAgICAgICBtc2cgKz0gKCIlc1xuIiAlIHJlYXNvbikKKyAgICAgICAgICAgIHNlbGYuZW1pdCgibm8tcHJvdmlkZXIiLCBtc2cpCisgICAgICAgICAgICBzZWxmLmVtaXQoImxvZyIsICJlcnJvciIsIG1zZykKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5Mb2dFeGVjVFRZKToKKyAgICAgICAgICAgIGljb24gPSAiZGlhbG9nLXdhcm5pbmciCisgICAgICAgICAgICBjb2xvciA9IEhvYkNvbG9ycy5XQVJOSU5HCisgICAgICAgICAgICBpZiBzZWxmLnNlcXVlbnRpYWwgb3Igbm90IHBhcmVudDoKKyAgICAgICAgICAgICAgICB0cmVlX2FkZCA9IHNlbGYubW9kZWwuYXBwZW5kCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHRyZWVfYWRkID0gc2VsZi5tb2RlbC5wcmVwZW5kCisgICAgICAgICAgICB0cmVlX2FkZChwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAoTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlLAorICAgICAgICAgICAgICAgICAgICAgIHRhc2ssCisgICAgICAgICAgICAgICAgICAgICAgZXZlbnQubXNnLAorICAgICAgICAgICAgICAgICAgICAgIGljb24sCisgICAgICAgICAgICAgICAgICAgICAgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgMCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShldmVudCwgKGJiLmV2ZW50LkJ1aWxkQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmIuZXZlbnQuU3RhbXBVcGRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiLmV2ZW50LkNvbmZpZ1BhcnNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmIuZXZlbnQuUmVjaXBlUGFyc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYi5ldmVudC5SZWNpcGVQcmVGaW5hbGlzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmIucnVucXVldWUucnVuUXVldWVFdmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmIucnVucXVldWUucnVuUXVldWVFeGl0V2FpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmIuZXZlbnQuT3BlcmF0aW9uU3RhcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmIuZXZlbnQuT3BlcmF0aW9uQ29tcGxldGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYi5ldmVudC5PcGVyYXRpb25Qcm9ncmVzcykpOgorICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgibG9nIiwgImVycm9yIiwgIlVua25vd24gZXZlbnQ6ICVzIiAlIChldmVudC5lcnJvciBpZiBoYXNhdHRyKGV2ZW50LCAnZXJyb3InKSBlbHNlICdlcnJvcicpKQorCisgICAgICAgIHJldHVybgorCisKK2RlZiBkb19wYXN0ZWJpbih0ZXh0KToKKyAgICB1cmwgPSAnaHR0cDovL3Bhc3RlYmluLmNvbS9hcGlfcHVibGljLnBocCcKKyAgICBwYXJhbXMgPSB7J3Bhc3RlX2NvZGUnOiB0ZXh0LCAncGFzdGVfZm9ybWF0JzogJ3RleHQnfQorCisgICAgcmVxID0gdXJsbGliMi5SZXF1ZXN0KHVybCwgdXJsbGliLnVybGVuY29kZShwYXJhbXMpKQorICAgIHJlc3BvbnNlID0gdXJsbGliMi51cmxvcGVuKHJlcSkKKyAgICBwYXN0ZV91cmwgPSByZXNwb25zZS5yZWFkKCkKKworICAgIHJldHVybiBwYXN0ZV91cmwKKworCitjbGFzcyBSdW5uaW5nQnVpbGRUcmVlVmlldyAoZ3RrLlRyZWVWaWV3KToKKyAgICBfX2dzaWduYWxzX18gPSB7CisgICAgICAgICJidXR0b25fcHJlc3NfZXZlbnQiIDogIm92ZXJyaWRlIgorICAgICAgICB9CisgICAgZGVmIF9faW5pdF9fIChzZWxmLCByZWFkb25seT1GYWxzZSwgaG9iPUZhbHNlKToKKyAgICAgICAgZ3RrLlRyZWVWaWV3Ll9faW5pdF9fIChzZWxmKQorICAgICAgICBzZWxmLnJlYWRvbmx5ID0gcmVhZG9ubHkKKworICAgICAgICAjIFRoZSBpY29uIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgd2UncmUgYnVpbGRpbmcgb3IgZmFpbGVkLgorICAgICAgICAjIGFkZCAnaG9iJyBmbGFnIGJlY2F1c2UgdGhlcmUgaGFzIG5vdCBvbmx5IGhvYiB0byBzaGFyZSB0aGlzIGNvZGUKKyAgICAgICAgaWYgaG9iOgorICAgICAgICAgICAgcmVuZGVyZXIgPSBIb2JDZWxsUmVuZGVyZXJQaXhidWYgKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlbmRlcmVyID0gZ3RrLkNlbGxSZW5kZXJlclBpeGJ1ZigpCisgICAgICAgIGNvbCA9IGd0ay5UcmVlVmlld0NvbHVtbiAoIlN0YXR1cyIsIHJlbmRlcmVyKQorICAgICAgICBjb2wuYWRkX2F0dHJpYnV0ZSAocmVuZGVyZXIsICJpY29uLW5hbWUiLCA0KQorICAgICAgICBzZWxmLmFwcGVuZF9jb2x1bW4gKGNvbCkKKworICAgICAgICAjIFRoZSBtZXNzYWdlIG9mIHRoZSBidWlsZC4KKyAgICAgICAgIyBhZGQgJ2hvYicgZmxhZyBiZWNhdXNlIHRoZXJlIGhhcyBub3Qgb25seSBob2IgdG8gc2hhcmUgdGhpcyBjb2RlCisgICAgICAgIGlmIGhvYjoKKyAgICAgICAgICAgIHNlbGYubWVzc2FnZV9yZW5kZXJlciA9IEhvYldhcnBDZWxsUmVuZGVyZXJUZXh0IChjb2xfbnVtYmVyPTEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLm1lc3NhZ2VfcmVuZGVyZXIgPSBndGsuQ2VsbFJlbmRlcmVyVGV4dCAoKQorICAgICAgICBzZWxmLm1lc3NhZ2VfY29sdW1uID0gZ3RrLlRyZWVWaWV3Q29sdW1uICgiTWVzc2FnZSIsIHNlbGYubWVzc2FnZV9yZW5kZXJlciwgdGV4dD0zKQorICAgICAgICBzZWxmLm1lc3NhZ2VfY29sdW1uLmFkZF9hdHRyaWJ1dGUoc2VsZi5tZXNzYWdlX3JlbmRlcmVyLCAnYmFja2dyb3VuZCcsIDUpCisgICAgICAgIHNlbGYubWVzc2FnZV9yZW5kZXJlci5zZXRfcHJvcGVydHkoJ2VkaXRhYmxlJywgKG5vdCBzZWxmLnJlYWRvbmx5KSkKKyAgICAgICAgc2VsZi5hcHBlbmRfY29sdW1uIChzZWxmLm1lc3NhZ2VfY29sdW1uKQorCisgICAgZGVmIGRvX2J1dHRvbl9wcmVzc19ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgIGd0ay5UcmVlVmlldy5kb19idXR0b25fcHJlc3NfZXZlbnQoc2VsZiwgZXZlbnQpCisKKyAgICAgICAgaWYgZXZlbnQuYnV0dG9uID09IDM6CisgICAgICAgICAgICBzZWxlY3Rpb24gPSBzdXBlcihSdW5uaW5nQnVpbGRUcmVlVmlldywgc2VsZikuZ2V0X3NlbGVjdGlvbigpCisgICAgICAgICAgICAobW9kZWwsIGl0KSA9IHNlbGVjdGlvbi5nZXRfc2VsZWN0ZWQoKQorICAgICAgICAgICAgaWYgaXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgY2FuX3Bhc3RlID0gbW9kZWwuZ2V0KGl0LCBtb2RlbC5DT0xfTE9HKVswXQorICAgICAgICAgICAgICAgIGlmIGNhbl9wYXN0ZSA9PSAncGFzdGViaW4nOgorICAgICAgICAgICAgICAgICAgICAjIGJ1aWxkIGEgc2ltcGxlIG1lbnUgd2l0aCBhIHBhc3RlYmluIG9wdGlvbgorICAgICAgICAgICAgICAgICAgICBtZW51ID0gZ3RrLk1lbnUoKQorICAgICAgICAgICAgICAgICAgICBtZW51aXRlbSA9IGd0ay5NZW51SXRlbSgiQ29weSIpCisgICAgICAgICAgICAgICAgICAgIG1lbnUuYXBwZW5kKG1lbnVpdGVtKQorICAgICAgICAgICAgICAgICAgICBtZW51aXRlbS5jb25uZWN0KCJhY3RpdmF0ZSIsIHNlbGYuY2xpcGJvYXJkX2hhbmRsZXIsIChtb2RlbCwgaXQpKQorICAgICAgICAgICAgICAgICAgICBtZW51aXRlbS5zaG93KCkKKyAgICAgICAgICAgICAgICAgICAgbWVudWl0ZW0gPSBndGsuTWVudUl0ZW0oIlNlbmQgbG9nIHRvIHBhc3RlYmluIikKKyAgICAgICAgICAgICAgICAgICAgbWVudS5hcHBlbmQobWVudWl0ZW0pCisgICAgICAgICAgICAgICAgICAgIG1lbnVpdGVtLmNvbm5lY3QoImFjdGl2YXRlIiwgc2VsZi5wYXN0ZWJpbl9oYW5kbGVyLCAobW9kZWwsIGl0KSkKKyAgICAgICAgICAgICAgICAgICAgbWVudWl0ZW0uc2hvdygpCisgICAgICAgICAgICAgICAgICAgIG1lbnUuc2hvdygpCisgICAgICAgICAgICAgICAgICAgIG1lbnUucG9wdXAoTm9uZSwgTm9uZSwgTm9uZSwgZXZlbnQuYnV0dG9uLCBldmVudC50aW1lKQorCisgICAgZGVmIF9hZGRfdG9fY2xpcGJvYXJkKHNlbGYsIGNsaXBwaW5nKToKKyAgICAgICAgIiIiCisgICAgICAgIEFkZCB0aGUgY29udGVudHMgb2YgY2xpcHBpbmcgdG8gdGhlIHN5c3RlbSBjbGlwYm9hcmQuCisgICAgICAgICIiIgorICAgICAgICBjbGlwYm9hcmQgPSBndGsuY2xpcGJvYXJkX2dldCgpCisgICAgICAgIGNsaXBib2FyZC5zZXRfdGV4dChjbGlwcGluZykKKyAgICAgICAgY2xpcGJvYXJkLnN0b3JlKCkKKworICAgIGRlZiBwYXN0ZWJpbl9oYW5kbGVyKHNlbGYsIHdpZGdldCwgZGF0YSk6CisgICAgICAgICIiIgorICAgICAgICBTZW5kIHRoZSBsb2cgZGF0YSB0byBwYXN0ZWJpbiwgdGhlbiBhZGQgdGhlIG5ldyBwYXN0ZSB1cmwgdG8gdGhlCisgICAgICAgIGNsaXBib2FyZC4KKyAgICAgICAgIiIiCisgICAgICAgIChtb2RlbCwgaXQpID0gZGF0YQorICAgICAgICBwYXN0ZV91cmwgPSBkb19wYXN0ZWJpbihtb2RlbC5nZXQoaXQsIG1vZGVsLkNPTF9NRVNTQUdFKVswXSkKKworICAgICAgICAjIEB0b2RvIFByb3ZpZGUgdmlzdWFsIGZlZWRiYWNrIHRvIHRoZSB1c2VyIHRoYXQgaXQgaXMgZG9uZSBhbmQgdGhhdAorICAgICAgICAjIGl0IHdvcmtlZC4KKyAgICAgICAgcHJpbnQgcGFzdGVfdXJsCisKKyAgICAgICAgc2VsZi5fYWRkX3RvX2NsaXBib2FyZChwYXN0ZV91cmwpCisKKyAgICBkZWYgY2xpcGJvYXJkX2hhbmRsZXIoc2VsZiwgd2lkZ2V0LCBkYXRhKToKKyAgICAgICAgIiIiCisgICAgICAgICIiIgorICAgICAgICAobW9kZWwsIGl0KSA9IGRhdGEKKyAgICAgICAgbWVzc2FnZSA9IG1vZGVsLmdldChpdCwgbW9kZWwuQ09MX01FU1NBR0UpWzBdCisKKyAgICAgICAgc2VsZi5fYWRkX3RvX2NsaXBib2FyZChtZXNzYWdlKQorCitjbGFzcyBCdWlsZEZhaWx1cmVUcmVlVmlldyhndGsuVHJlZVZpZXcpOgorCisgICAgZGVmIF9faW5pdF9fIChzZWxmKToKKyAgICAgICAgZ3RrLlRyZWVWaWV3Ll9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuc2V0X3J1bGVzX2hpbnQoRmFsc2UpCisgICAgICAgIHNlbGYuc2V0X2hlYWRlcnNfdmlzaWJsZShGYWxzZSkKKyAgICAgICAgc2VsZi5nZXRfc2VsZWN0aW9uKCkuc2V0X21vZGUoZ3RrLlNFTEVDVElPTl9TSU5HTEUpCisKKyAgICAgICAgIyBUaGUgaWNvbiB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHdlJ3JlIGJ1aWxkaW5nIG9yIGZhaWxlZC4KKyAgICAgICAgcmVuZGVyZXIgPSBIb2JDZWxsUmVuZGVyZXJQaXhidWYgKCkKKyAgICAgICAgY29sID0gZ3RrLlRyZWVWaWV3Q29sdW1uICgiU3RhdHVzIiwgcmVuZGVyZXIpCisgICAgICAgIGNvbC5hZGRfYXR0cmlidXRlIChyZW5kZXJlciwgImljb24tbmFtZSIsIFJ1bm5pbmdCdWlsZE1vZGVsLkNPTF9JQ09OKQorICAgICAgICBzZWxmLmFwcGVuZF9jb2x1bW4gKGNvbCkKKworICAgICAgICAjIFRoZSBtZXNzYWdlIG9mIHRoZSBidWlsZC4KKyAgICAgICAgc2VsZi5tZXNzYWdlX3JlbmRlcmVyID0gSG9iV2FycENlbGxSZW5kZXJlclRleHQgKGNvbF9udW1iZXI9MSkKKyAgICAgICAgc2VsZi5tZXNzYWdlX2NvbHVtbiA9IGd0ay5UcmVlVmlld0NvbHVtbiAoIk1lc3NhZ2UiLCBzZWxmLm1lc3NhZ2VfcmVuZGVyZXIsIHRleHQ9UnVubmluZ0J1aWxkTW9kZWwuQ09MX01FU1NBR0UsIGJhY2tncm91bmQ9UnVubmluZ0J1aWxkTW9kZWwuQ09MX0NPTE9SKQorICAgICAgICBzZWxmLmFwcGVuZF9jb2x1bW4gKHNlbGYubWVzc2FnZV9jb2x1bW4pCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvc2FuaXR5Y2hlY2twYWdlLnB5IGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL3Nhbml0eWNoZWNrcGFnZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmNlMmVjCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL3Nhbml0eWNoZWNrcGFnZS5weQpAQCAtMCwwICsxLDg1IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgQml0QmFrZSBHcmFwaGljYWwgR1RLIFVzZXIgSW50ZXJmYWNlCisjCisjIENvcHlyaWdodCAoQykgMjAxMiAgICAgICAgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgQXV0aG9yZWQgYnkgQm9nZGFuIE1hcmluZXNjdSA8Ym9nZGFuLmEubWFyaW5lc2N1QGludGVsLmNvbT4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBndGssIGdvYmplY3QKK2Zyb20gYmIudWkuY3J1bWJzLnByb2dyZXNzYmFyIGltcG9ydCBIb2JQcm9ncmVzc0JhcgorZnJvbSBiYi51aS5jcnVtYnMuaG9id2lkZ2V0IGltcG9ydCBoaWMKK2Zyb20gYmIudWkuY3J1bWJzLmhvYnBhZ2VzIGltcG9ydCBIb2JQYWdlCisKKyMKKyMgU2FuaXR5Q2hlY2tQYWdlCisjCitjbGFzcyBTYW5pdHlDaGVja1BhZ2UgKEhvYlBhZ2UpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBzdXBlcihTYW5pdHlDaGVja1BhZ2UsIHNlbGYpLl9faW5pdF9fKGJ1aWxkZXIpCisgICAgICAgIHNlbGYucnVubmluZyA9IEZhbHNlCisgICAgICAgIHNlbGYuY3JlYXRlX3Zpc3VhbF9lbGVtZW50cygpCisgICAgICAgIHNlbGYuc2hvd19hbGwoKQorCisgICAgZGVmIG1ha2VfbGFiZWwoc2VsZiwgdGV4dCwgYm9sZD1UcnVlKToKKyAgICAgICAgbGFiZWwgPSBndGsuTGFiZWwoKQorICAgICAgICBsYWJlbC5zZXRfYWxpZ25tZW50KDAuMCwgMC41KQorICAgICAgICBtYXJrID0gIjxzcGFuICVzPiVzPC9zcGFuPiIgJSAoc2VsZi5zcGFuX3RhZygneC1sYXJnZScsICdib2xkJykgaWYgYm9sZCBlbHNlIHNlbGYuc3Bhbl90YWcoJ21lZGl1bScpLCB0ZXh0KQorICAgICAgICBsYWJlbC5zZXRfbWFya3VwKG1hcmspCisgICAgICAgIHJldHVybiBsYWJlbAorCisgICAgZGVmIHN0YXJ0KHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5ydW5uaW5nOgorICAgICAgICAgIHNlbGYucnVubmluZyA9IFRydWUKKyAgICAgICAgICBnb2JqZWN0LnRpbWVvdXRfYWRkKDEwMCwgc2VsZi50aW1lcl9mdW5jKQorCisgICAgZGVmIHN0b3Aoc2VsZik6CisgICAgICAgIHNlbGYucnVubmluZyA9IEZhbHNlCisKKyAgICBkZWYgaXNfcnVubmluZyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucnVubmluZworCisgICAgZGVmIHRpbWVyX2Z1bmMoc2VsZik6CisgICAgICAgIHNlbGYucHJvZ3Jlc3NfYmFyLnB1bHNlKCkKKyAgICAgICAgcmV0dXJuIHNlbGYucnVubmluZworCisgICAgZGVmIGNyZWF0ZV92aXN1YWxfZWxlbWVudHMoc2VsZik6CisgICAgICAgICMgVGFibGUnZCBsYXlvdXQuICdyb3dzJyBhbmQgJ2NvbHMnIGdpdmUgdGhlIHRhYmxlIHNpemUKKyAgICAgICAgcm93cywgY29scyA9IDMwLCA1MAorICAgICAgICBzZWxmLnRhYmxlID0gZ3RrLlRhYmxlKHJvd3MsIGNvbHMsIFRydWUpCisgICAgICAgIHNlbGYucGFja19zdGFydChzZWxmLnRhYmxlLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIHN4LCBzeSA9IDIsIDIKKyAgICAgICAgIyAnaW5mbycgaWNvbgorICAgICAgICBpbWFnZSA9IGd0ay5JbWFnZSgpCisgICAgICAgIGltYWdlLnNldF9mcm9tX2ZpbGUoaGljLklDT05fSU5GT19ESVNQTEFZX0ZJTEUpCisgICAgICAgIHNlbGYudGFibGUuYXR0YWNoKGltYWdlLCBzeCwgc3ggKyAyLCBzeSwgc3kgKyAzICkKKyAgICAgICAgaW1hZ2Uuc2hvdygpCisgICAgICAgICMgJ0NoZWNraW5nJyBtZXNzYWdlCisgICAgICAgIGxhYmVsID0gc2VsZi5tYWtlX2xhYmVsKCdIb2IgaXMgY2hlY2tpbmcgZm9yIGNvcnJlY3QgYnVpbGQgc3lzdGVtIHNldHVwJykKKyAgICAgICAgc2VsZi50YWJsZS5hdHRhY2gobGFiZWwsIHN4ICsgMiwgY29scywgc3ksIHN5ICsgMywgeHBhZGRpbmc9NSApCisgICAgICAgIGxhYmVsLnNob3coKQorICAgICAgICAjICdTaG91bGRuJ3QgdGFrZSBsb25nJyBtZXNzYWdlLgorICAgICAgICBsYWJlbCA9IHNlbGYubWFrZV9sYWJlbCgiVGhlIGNoZWNrIHNob3VsZG4ndCB0YWtlIGxvbmcuIiwgRmFsc2UpCisgICAgICAgIHNlbGYudGFibGUuYXR0YWNoKGxhYmVsLCBzeCArIDIsIGNvbHMsIHN5ICsgMywgc3kgKyA0LCB4cGFkZGluZz01KQorICAgICAgICBsYWJlbC5zaG93KCkKKyAgICAgICAgIyBQcm9ncmVzcyBiYXIKKyAgICAgICAgc2VsZi5wcm9ncmVzc19iYXIgPSBIb2JQcm9ncmVzc0JhcigpCisgICAgICAgIHNlbGYudGFibGUuYXR0YWNoKHNlbGYucHJvZ3Jlc3NfYmFyLCBzeCArIDIsIGNvbHMgLSAzLCBzeSArIDUsIHN5ICsgNywgeHBhZGRpbmc9NSkKKyAgICAgICAgc2VsZi5wcm9ncmVzc19iYXIuc2hvdygpCisgICAgICAgICMgQWxsIGRvbmUKKyAgICAgICAgc2VsZi50YWJsZS5zaG93KCkKKwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL3V0aWxzLnB5IGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL3V0aWxzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzOTg2NGYKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvdXRpbHMucHkKQEAgLTAsMCArMSwzNCBAQAorIworIyBCaXRCYWtlIFVJIFV0aWxzIAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTIgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKyMgVGhpcyB1dGlsaXR5IG1ldGhvZCBsb29rcyBmb3IgeHRlcm0gb3IgdnRlIGFuZCByZXR1cm4gdGhlIAorIyBmcmlzdCB0byBleGlzdCwgY3VycmVudGx5IHdlIGFyZSBrZWVwaW5nIHRoaXMgc2ltcGxlLCBidXQgCisjIHdlIHdpbGwgbGlrZWx5IG1vdmUgdGhlIG9lLnRlcm1pbmFsIGltcGxlbWVudGF0aW9uIGludG8gCisjIGJpdGJha2Ugd2hpY2ggd2lsbCBhbGxvdyBtb3JlIGZsZXhpYmlsaXR5LgorCitpbXBvcnQgb3MKK2ltcG9ydCBiYgorCitkZWYgd2hpY2hfdGVybWluYWwoKToKKyAgICB0ZXJtID0gYmIudXRpbHMud2hpY2gob3MuZW52aXJvblsiUEFUSCJdLCAieHRlcm0iKQorICAgIGlmIHRlcm06CisgICAgICAgIHJldHVybiB0ZXJtICsgIiAtZSAiCisgICAgdGVybSA9IGJiLnV0aWxzLndoaWNoKG9zLmVudmlyb25bIlBBVEgiXSwgInZ0ZSIpCisgICAgaWYgdGVybToKKyAgICAgICAgcmV0dXJuIHRlcm0gKyAiIC1jICIKKyAgICByZXR1cm4gTm9uZQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvZGVwZXhwLnB5IGIvYml0YmFrZS9saWIvYmIvdWkvZGVwZXhwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MGFhZmMKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9kZXBleHAucHkKQEAgLTAsMCArMSwzMzMgQEAKKyMKKyMgQml0QmFrZSBHcmFwaGljYWwgR1RLIGJhc2VkIERlcGVuZGVuY3kgRXhwbG9yZXIKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA3ICAgICAgICBSb3NzIEJ1cnRvbgorIyBDb3B5cmlnaHQgKEMpIDIwMDcgLSAyMDA4IFJpY2hhcmQgUHVyZGllCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitpbXBvcnQgc3lzCitpbXBvcnQgZ29iamVjdAoraW1wb3J0IGd0aworaW1wb3J0IFF1ZXVlCitpbXBvcnQgdGhyZWFkaW5nCitpbXBvcnQgeG1scnBjbGliCitpbXBvcnQgYmIKK2ltcG9ydCBiYi5ldmVudAorZnJvbSBiYi51aS5jcnVtYnMucHJvZ3Jlc3NiYXIgaW1wb3J0IEhvYlByb2dyZXNzQmFyCisKKyMgUGFja2FnZSBNb2RlbAorKENPTF9QS0dfTkFNRSkgPSAoMCkKKworIyBEZXBlbmRlbmN5IE1vZGVsCisoVFlQRV9ERVAsIFRZUEVfUkRFUCkgPSAoMCwgMSkKKyhDT0xfREVQX1RZUEUsIENPTF9ERVBfUEFSRU5ULCBDT0xfREVQX1BBQ0tBR0UpID0gKDAsIDEsIDIpCisKKworY2xhc3MgUGFja2FnZURlcFZpZXcoZ3RrLlRyZWVWaWV3KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kZWwsIGRlcF90eXBlLCBsYWJlbCk6CisgICAgICAgIGd0ay5UcmVlVmlldy5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLmN1cnJlbnQgPSBOb25lCisgICAgICAgIHNlbGYuZGVwX3R5cGUgPSBkZXBfdHlwZQorICAgICAgICBzZWxmLmZpbHRlcl9tb2RlbCA9IG1vZGVsLmZpbHRlcl9uZXcoKQorICAgICAgICBzZWxmLmZpbHRlcl9tb2RlbC5zZXRfdmlzaWJsZV9mdW5jKHNlbGYuX2ZpbHRlcikKKyAgICAgICAgc2VsZi5zZXRfbW9kZWwoc2VsZi5maWx0ZXJfbW9kZWwpCisgICAgICAgICNzZWxmLmNvbm5lY3QoInJvdy1hY3RpdmF0ZWQiLCBzZWxmLm9uX3BhY2thZ2VfYWN0aXZhdGVkLCBDT0xfREVQX1BBQ0tBR0UpCisgICAgICAgIHNlbGYuYXBwZW5kX2NvbHVtbihndGsuVHJlZVZpZXdDb2x1bW4obGFiZWwsIGd0ay5DZWxsUmVuZGVyZXJUZXh0KCksIHRleHQ9Q09MX0RFUF9QQUNLQUdFKSkKKworICAgIGRlZiBfZmlsdGVyKHNlbGYsIG1vZGVsLCBpdGVyKToKKyAgICAgICAgKHRoaXNfdHlwZSwgcGFja2FnZSkgPSBtb2RlbC5nZXQoaXRlciwgQ09MX0RFUF9UWVBFLCBDT0xfREVQX1BBUkVOVCkKKyAgICAgICAgaWYgdGhpc190eXBlICE9IHNlbGYuZGVwX3R5cGU6IHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gcGFja2FnZSA9PSBzZWxmLmN1cnJlbnQKKworICAgIGRlZiBzZXRfY3VycmVudF9wYWNrYWdlKHNlbGYsIHBhY2thZ2UpOgorICAgICAgICBzZWxmLmN1cnJlbnQgPSBwYWNrYWdlCisgICAgICAgIHNlbGYuZmlsdGVyX21vZGVsLnJlZmlsdGVyKCkKKworCitjbGFzcyBQYWNrYWdlUmV2ZXJzZURlcFZpZXcoZ3RrLlRyZWVWaWV3KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kZWwsIGxhYmVsKToKKyAgICAgICAgZ3RrLlRyZWVWaWV3Ll9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuY3VycmVudCA9IE5vbmUKKyAgICAgICAgc2VsZi5maWx0ZXJfbW9kZWwgPSBtb2RlbC5maWx0ZXJfbmV3KCkKKyAgICAgICAgc2VsZi5maWx0ZXJfbW9kZWwuc2V0X3Zpc2libGVfZnVuYyhzZWxmLl9maWx0ZXIpCisgICAgICAgIHNlbGYuc2V0X21vZGVsKHNlbGYuZmlsdGVyX21vZGVsKQorICAgICAgICBzZWxmLmFwcGVuZF9jb2x1bW4oZ3RrLlRyZWVWaWV3Q29sdW1uKGxhYmVsLCBndGsuQ2VsbFJlbmRlcmVyVGV4dCgpLCB0ZXh0PUNPTF9ERVBfUEFSRU5UKSkKKworICAgIGRlZiBfZmlsdGVyKHNlbGYsIG1vZGVsLCBpdGVyKToKKyAgICAgICAgcGFja2FnZSA9IG1vZGVsLmdldF92YWx1ZShpdGVyLCBDT0xfREVQX1BBQ0tBR0UpCisgICAgICAgIHJldHVybiBwYWNrYWdlID09IHNlbGYuY3VycmVudAorCisgICAgZGVmIHNldF9jdXJyZW50X3BhY2thZ2Uoc2VsZiwgcGFja2FnZSk6CisgICAgICAgIHNlbGYuY3VycmVudCA9IHBhY2thZ2UKKyAgICAgICAgc2VsZi5maWx0ZXJfbW9kZWwucmVmaWx0ZXIoKQorCisKK2NsYXNzIERlcEV4cGxvcmVyKGd0ay5XaW5kb3cpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgZ3RrLldpbmRvdy5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLnNldF90aXRsZSgiRGVwZW5kZW5jeSBFeHBsb3JlciIpCisgICAgICAgIHNlbGYuc2V0X2RlZmF1bHRfc2l6ZSg1MDAsIDUwMCkKKyAgICAgICAgc2VsZi5jb25uZWN0KCJkZWxldGUtZXZlbnQiLCBndGsubWFpbl9xdWl0KQorCisgICAgICAgICMgQ3JlYXRlIHRoZSBkYXRhIG1vZGVscworICAgICAgICBzZWxmLnBrZ19tb2RlbCA9IGd0ay5MaXN0U3RvcmUoZ29iamVjdC5UWVBFX1NUUklORykKKyAgICAgICAgc2VsZi5wa2dfbW9kZWwuc2V0X3NvcnRfY29sdW1uX2lkKENPTF9QS0dfTkFNRSwgZ3RrLlNPUlRfQVNDRU5ESU5HKQorICAgICAgICBzZWxmLmRlcGVuZHNfbW9kZWwgPSBndGsuTGlzdFN0b3JlKGdvYmplY3QuVFlQRV9JTlQsIGdvYmplY3QuVFlQRV9TVFJJTkcsIGdvYmplY3QuVFlQRV9TVFJJTkcpCisgICAgICAgIHNlbGYuZGVwZW5kc19tb2RlbC5zZXRfc29ydF9jb2x1bW5faWQoQ09MX0RFUF9QQUNLQUdFLCBndGsuU09SVF9BU0NFTkRJTkcpCisKKyAgICAgICAgcGFuZSA9IGd0ay5IUGFuZWQoKQorICAgICAgICBwYW5lLnNldF9wb3NpdGlvbigyNTApCisgICAgICAgIHNlbGYuYWRkKHBhbmUpCisKKyAgICAgICAgIyBUaGUgbWFzdGVyIGxpc3Qgb2YgcGFja2FnZXMKKyAgICAgICAgc2Nyb2xsZWQgPSBndGsuU2Nyb2xsZWRXaW5kb3coKQorICAgICAgICBzY3JvbGxlZC5zZXRfcG9saWN5KGd0ay5QT0xJQ1lfQVVUT01BVElDLCBndGsuUE9MSUNZX0FVVE9NQVRJQykKKyAgICAgICAgc2Nyb2xsZWQuc2V0X3NoYWRvd190eXBlKGd0ay5TSEFET1dfSU4pCisKKyAgICAgICAgc2VsZi5wa2dfdHJlZXZpZXcgPSBndGsuVHJlZVZpZXcoc2VsZi5wa2dfbW9kZWwpCisgICAgICAgIHNlbGYucGtnX3RyZWV2aWV3LmdldF9zZWxlY3Rpb24oKS5jb25uZWN0KCJjaGFuZ2VkIiwgc2VsZi5vbl9jdXJzb3JfY2hhbmdlZCkKKyAgICAgICAgY29sdW1uID0gZ3RrLlRyZWVWaWV3Q29sdW1uKCJQYWNrYWdlIiwgZ3RrLkNlbGxSZW5kZXJlclRleHQoKSwgdGV4dD1DT0xfUEtHX05BTUUpCisgICAgICAgIHNlbGYucGtnX3RyZWV2aWV3LmFwcGVuZF9jb2x1bW4oY29sdW1uKQorICAgICAgICBwYW5lLmFkZDEoc2Nyb2xsZWQpCisgICAgICAgIHNjcm9sbGVkLmFkZChzZWxmLnBrZ190cmVldmlldykKKworICAgICAgICBib3ggPSBndGsuVkJveChob21vZ2VuZW91cz1UcnVlLCBzcGFjaW5nPTQpCisKKyAgICAgICAgIyBSdW50aW1lIERlcGVuZHMKKyAgICAgICAgc2Nyb2xsZWQgPSBndGsuU2Nyb2xsZWRXaW5kb3coKQorICAgICAgICBzY3JvbGxlZC5zZXRfcG9saWN5KGd0ay5QT0xJQ1lfQVVUT01BVElDLCBndGsuUE9MSUNZX0FVVE9NQVRJQykKKyAgICAgICAgc2Nyb2xsZWQuc2V0X3NoYWRvd190eXBlKGd0ay5TSEFET1dfSU4pCisgICAgICAgIHNlbGYucmRlcF90cmVldmlldyA9IFBhY2thZ2VEZXBWaWV3KHNlbGYuZGVwZW5kc19tb2RlbCwgVFlQRV9SREVQLCAiUnVudGltZSBEZXBlbmRzIikKKyAgICAgICAgc2VsZi5yZGVwX3RyZWV2aWV3LmNvbm5lY3QoInJvdy1hY3RpdmF0ZWQiLCBzZWxmLm9uX3BhY2thZ2VfYWN0aXZhdGVkLCBDT0xfREVQX1BBQ0tBR0UpCisgICAgICAgIHNjcm9sbGVkLmFkZChzZWxmLnJkZXBfdHJlZXZpZXcpCisgICAgICAgIGJveC5hZGQoc2Nyb2xsZWQpCisKKyAgICAgICAgIyBCdWlsZCBEZXBlbmRzCisgICAgICAgIHNjcm9sbGVkID0gZ3RrLlNjcm9sbGVkV2luZG93KCkKKyAgICAgICAgc2Nyb2xsZWQuc2V0X3BvbGljeShndGsuUE9MSUNZX0FVVE9NQVRJQywgZ3RrLlBPTElDWV9BVVRPTUFUSUMpCisgICAgICAgIHNjcm9sbGVkLnNldF9zaGFkb3dfdHlwZShndGsuU0hBRE9XX0lOKQorICAgICAgICBzZWxmLmRlcF90cmVldmlldyA9IFBhY2thZ2VEZXBWaWV3KHNlbGYuZGVwZW5kc19tb2RlbCwgVFlQRV9ERVAsICJCdWlsZCBEZXBlbmRzIikKKyAgICAgICAgc2VsZi5kZXBfdHJlZXZpZXcuY29ubmVjdCgicm93LWFjdGl2YXRlZCIsIHNlbGYub25fcGFja2FnZV9hY3RpdmF0ZWQsIENPTF9ERVBfUEFDS0FHRSkKKyAgICAgICAgc2Nyb2xsZWQuYWRkKHNlbGYuZGVwX3RyZWV2aWV3KQorICAgICAgICBib3guYWRkKHNjcm9sbGVkKQorICAgICAgICBwYW5lLmFkZDIoYm94KQorCisgICAgICAgICMgUmV2ZXJzZSBEZXBlbmRzCisgICAgICAgIHNjcm9sbGVkID0gZ3RrLlNjcm9sbGVkV2luZG93KCkKKyAgICAgICAgc2Nyb2xsZWQuc2V0X3BvbGljeShndGsuUE9MSUNZX0FVVE9NQVRJQywgZ3RrLlBPTElDWV9BVVRPTUFUSUMpCisgICAgICAgIHNjcm9sbGVkLnNldF9zaGFkb3dfdHlwZShndGsuU0hBRE9XX0lOKQorICAgICAgICBzZWxmLnJldmRlcF90cmVldmlldyA9IFBhY2thZ2VSZXZlcnNlRGVwVmlldyhzZWxmLmRlcGVuZHNfbW9kZWwsICJSZXZlcnNlIERlcGVuZHMiKQorICAgICAgICBzZWxmLnJldmRlcF90cmVldmlldy5jb25uZWN0KCJyb3ctYWN0aXZhdGVkIiwgc2VsZi5vbl9wYWNrYWdlX2FjdGl2YXRlZCwgQ09MX0RFUF9QQVJFTlQpCisgICAgICAgIHNjcm9sbGVkLmFkZChzZWxmLnJldmRlcF90cmVldmlldykKKyAgICAgICAgYm94LmFkZChzY3JvbGxlZCkKKyAgICAgICAgcGFuZS5hZGQyKGJveCkKKworICAgICAgICBzZWxmLnNob3dfYWxsKCkKKworICAgIGRlZiBvbl9wYWNrYWdlX2FjdGl2YXRlZChzZWxmLCB0cmVldmlldywgcGF0aCwgY29sdW1uLCBkYXRhX2NvbCk6CisgICAgICAgIG1vZGVsID0gdHJlZXZpZXcuZ2V0X21vZGVsKCkKKyAgICAgICAgcGFja2FnZSA9IG1vZGVsLmdldF92YWx1ZShtb2RlbC5nZXRfaXRlcihwYXRoKSwgZGF0YV9jb2wpCisKKyAgICAgICAgcGtnX3BhdGggPSBbXQorICAgICAgICBkZWYgZmluZGVyKG1vZGVsLCBwYXRoLCBpdGVyLCBuZWVkbGUpOgorICAgICAgICAgICAgcGFja2FnZSA9IG1vZGVsLmdldF92YWx1ZShpdGVyLCBDT0xfUEtHX05BTUUpCisgICAgICAgICAgICBpZiBwYWNrYWdlID09IG5lZWRsZToKKyAgICAgICAgICAgICAgICBwa2dfcGF0aC5hcHBlbmQocGF0aCkKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgc2VsZi5wa2dfbW9kZWwuZm9yZWFjaChmaW5kZXIsIHBhY2thZ2UpCisgICAgICAgIGlmIHBrZ19wYXRoOgorICAgICAgICAgICAgc2VsZi5wa2dfdHJlZXZpZXcuZ2V0X3NlbGVjdGlvbigpLnNlbGVjdF9wYXRoKHBrZ19wYXRoWzBdKQorICAgICAgICAgICAgc2VsZi5wa2dfdHJlZXZpZXcuc2Nyb2xsX3RvX2NlbGwocGtnX3BhdGhbMF0pCisKKyAgICBkZWYgb25fY3Vyc29yX2NoYW5nZWQoc2VsZiwgc2VsZWN0aW9uKToKKyAgICAgICAgKG1vZGVsLCBpdCkgPSBzZWxlY3Rpb24uZ2V0X3NlbGVjdGVkKCkKKyAgICAgICAgaWYgaXQgaXMgTm9uZToKKyAgICAgICAgICAgIGN1cnJlbnRfcGFja2FnZSA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGN1cnJlbnRfcGFja2FnZSA9IG1vZGVsLmdldF92YWx1ZShpdCwgQ09MX1BLR19OQU1FKQorICAgICAgICBzZWxmLnJkZXBfdHJlZXZpZXcuc2V0X2N1cnJlbnRfcGFja2FnZShjdXJyZW50X3BhY2thZ2UpCisgICAgICAgIHNlbGYuZGVwX3RyZWV2aWV3LnNldF9jdXJyZW50X3BhY2thZ2UoY3VycmVudF9wYWNrYWdlKQorICAgICAgICBzZWxmLnJldmRlcF90cmVldmlldy5zZXRfY3VycmVudF9wYWNrYWdlKGN1cnJlbnRfcGFja2FnZSkKKworCisgICAgZGVmIHBhcnNlKHNlbGYsIGRlcGdyYXBoKToKKyAgICAgICAgZm9yIHBhY2thZ2UgaW4gZGVwZ3JhcGhbInBuIl06CisgICAgICAgICAgICBzZWxmLnBrZ19tb2RlbC5pbnNlcnQoMCwgKHBhY2thZ2UsKSkKKworICAgICAgICBmb3IgcGFja2FnZSBpbiBkZXBncmFwaFsiZGVwZW5kcyJdOgorICAgICAgICAgICAgZm9yIGRlcGVuZCBpbiBkZXBncmFwaFsiZGVwZW5kcyJdW3BhY2thZ2VdOgorICAgICAgICAgICAgICAgIHNlbGYuZGVwZW5kc19tb2RlbC5pbnNlcnQgKDAsIChUWVBFX0RFUCwgcGFja2FnZSwgZGVwZW5kKSkKKworICAgICAgICBmb3IgcGFja2FnZSBpbiBkZXBncmFwaFsicmRlcGVuZHMtcG4iXToKKyAgICAgICAgICAgIGZvciByZGVwZW5kIGluIGRlcGdyYXBoWyJyZGVwZW5kcy1wbiJdW3BhY2thZ2VdOgorICAgICAgICAgICAgICAgIHNlbGYuZGVwZW5kc19tb2RlbC5pbnNlcnQgKDAsIChUWVBFX1JERVAsIHBhY2thZ2UsIHJkZXBlbmQpKQorCisKK2NsYXNzIGd0a3RocmVhZCh0aHJlYWRpbmcuVGhyZWFkKToKKyAgICBxdWl0ID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2h1dGRvd24pOgorICAgICAgICB0aHJlYWRpbmcuVGhyZWFkLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuc2V0RGFlbW9uKFRydWUpCisgICAgICAgIHNlbGYuc2h1dGRvd24gPSBzaHV0ZG93bgorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgZ29iamVjdC50aHJlYWRzX2luaXQoKQorICAgICAgICBndGsuZ2RrLnRocmVhZHNfaW5pdCgpCisgICAgICAgIGd0ay5tYWluKCkKKyAgICAgICAgZ3RrdGhyZWFkLnF1aXQuc2V0KCkKKworCitkZWYgbWFpbihzZXJ2ZXIsIGV2ZW50SGFuZGxlciwgcGFyYW1zKToKKyAgICB0cnk6CisgICAgICAgIHBhcmFtcy51cGRhdGVGcm9tU2VydmVyKHNlcnZlcikKKyAgICAgICAgY21kbGluZSA9IHBhcmFtcy5wYXJzZUFjdGlvbnMoKQorICAgICAgICBpZiBub3QgY21kbGluZToKKyAgICAgICAgICAgIHByaW50KCJOb3RoaW5nIHRvIGRvLiAgVXNlICdiaXRiYWtlIHdvcmxkJyB0byBidWlsZCBldmVyeXRoaW5nLCBvciBydW4gJ2JpdGJha2UgLS1oZWxwJyBmb3IgdXNhZ2UgaW5mb3JtYXRpb24uIikKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIGlmICdtc2cnIGluIGNtZGxpbmUgYW5kIGNtZGxpbmVbJ21zZyddOgorICAgICAgICAgICAgcHJpbnQoY21kbGluZVsnbXNnJ10pCisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICBjbWRsaW5lID0gY21kbGluZVsnYWN0aW9uJ10KKyAgICAgICAgaWYgbm90IGNtZGxpbmUgb3IgY21kbGluZVswXSAhPSAiZ2VuZXJhdGVEb3RHcmFwaCI6CisgICAgICAgICAgICBwcmludCgiVGhpcyBVSSByZXF1aXJlcyB0aGUgLWcgb3B0aW9uIikKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIHJldCwgZXJyb3IgPSBzZXJ2ZXIucnVuQ29tbWFuZChbImdlbmVyYXRlRGVwVHJlZUV2ZW50IiwgY21kbGluZVsxXSwgY21kbGluZVsyXV0pCisgICAgICAgIGlmIGVycm9yOgorICAgICAgICAgICAgcHJpbnQoIkVycm9yIHJ1bm5pbmcgY29tbWFuZCAnJXMnOiAlcyIgJSAoY21kbGluZSwgZXJyb3IpKQorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgZWxpZiByZXQgIT0gVHJ1ZToKKyAgICAgICAgICAgIHByaW50KCJFcnJvciBydW5uaW5nIGNvbW1hbmQgJyVzJzogcmV0dXJuZWQgJXMiICUgKGNtZGxpbmUsIHJldCkpCisgICAgICAgICAgICByZXR1cm4gMQorICAgIGV4Y2VwdCB4bWxycGNsaWIuRmF1bHQgYXMgeDoKKyAgICAgICAgcHJpbnQoIlhNTFJQQyBGYXVsdCBnZXR0aW5nIGNvbW1hbmRsaW5lOlxuICVzIiAlIHgpCisgICAgICAgIHJldHVybgorCisgICAgdHJ5OgorICAgICAgICBndGsuaW5pdF9jaGVjaygpCisgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiUGxlYXNlIHNldCBESVNQTEFZIHZhcmlhYmxlIGJlZm9yZSBydW5uaW5nIHRoaXMgY29tbWFuZCBcbiIpCisgICAgICAgIHJldHVybgorCisgICAgc2h1dGRvd24gPSAwCisKKyAgICBndGtndWkgPSBndGt0aHJlYWQoc2h1dGRvd24pCisgICAgZ3RrZ3VpLnN0YXJ0KCkKKworICAgIGd0ay5nZGsudGhyZWFkc19lbnRlcigpCisgICAgZGVwID0gRGVwRXhwbG9yZXIoKQorICAgIGJhcmRpYWxvZyA9IGd0ay5EaWFsb2cocGFyZW50PWRlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzPWd0ay5ESUFMT0dfTU9EQUx8Z3RrLkRJQUxPR19ERVNUUk9ZX1dJVEhfUEFSRU5UKQorICAgIGJhcmRpYWxvZy5zZXRfZGVmYXVsdF9zaXplKDQwMCwgNTApCisgICAgcGJhciA9IEhvYlByb2dyZXNzQmFyKCkKKyAgICBiYXJkaWFsb2cudmJveC5wYWNrX3N0YXJ0KHBiYXIpCisgICAgYmFyZGlhbG9nLnNob3dfYWxsKCkKKyAgICBiYXJkaWFsb2cuY29ubmVjdCgiZGVsZXRlLWV2ZW50IiwgZ3RrLm1haW5fcXVpdCkKKyAgICBndGsuZ2RrLnRocmVhZHNfbGVhdmUoKQorCisgICAgcHJvZ3Jlc3NfdG90YWwgPSAwCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZXZlbnQgPSBldmVudEhhbmRsZXIud2FpdEV2ZW50KDAuMjUpCisgICAgICAgICAgICBpZiBndGt0aHJlYWQucXVpdC5pc1NldCgpOgorICAgICAgICAgICAgICAgIF8sIGVycm9yID0gc2VydmVyLnJ1bkNvbW1hbmQoWyJzdGF0ZUZvcmNlU2h1dGRvd24iXSkKKyAgICAgICAgICAgICAgICBpZiBlcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQoJ1VuYWJsZSB0byBjbGVhbmx5IHN0b3A6ICVzJyAlIGVycm9yKQorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgIGlmIGV2ZW50IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuQ2FjaGVMb2FkU3RhcnRlZCk6CisgICAgICAgICAgICAgICAgcHJvZ3Jlc3NfdG90YWwgPSBldmVudC50b3RhbAorICAgICAgICAgICAgICAgIGd0ay5nZGsudGhyZWFkc19lbnRlcigpCisgICAgICAgICAgICAgICAgYmFyZGlhbG9nLnNldF90aXRsZSgiTG9hZGluZyBDYWNoZSIpCisgICAgICAgICAgICAgICAgcGJhci51cGRhdGUoMCkKKyAgICAgICAgICAgICAgICBndGsuZ2RrLnRocmVhZHNfbGVhdmUoKQorCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5DYWNoZUxvYWRQcm9ncmVzcyk6CisgICAgICAgICAgICAgICAgeCA9IGV2ZW50LmN1cnJlbnQKKyAgICAgICAgICAgICAgICBndGsuZ2RrLnRocmVhZHNfZW50ZXIoKQorICAgICAgICAgICAgICAgIHBiYXIudXBkYXRlKHggKiAxLjAgLyBwcm9ncmVzc190b3RhbCkKKyAgICAgICAgICAgICAgICBwYmFyLnNldF90aXRsZSgnJykKKyAgICAgICAgICAgICAgICBndGsuZ2RrLnRocmVhZHNfbGVhdmUoKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LkNhY2hlTG9hZENvbXBsZXRlZCk6CisgICAgICAgICAgICAgICAgYmFyZGlhbG9nLmhpZGUoKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LlBhcnNlU3RhcnRlZCk6CisgICAgICAgICAgICAgICAgcHJvZ3Jlc3NfdG90YWwgPSBldmVudC50b3RhbAorICAgICAgICAgICAgICAgIGlmIHByb2dyZXNzX3RvdGFsID09IDA6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZ3RrLmdkay50aHJlYWRzX2VudGVyKCkKKyAgICAgICAgICAgICAgICBwYmFyLnVwZGF0ZSgwKQorICAgICAgICAgICAgICAgIGJhcmRpYWxvZy5zZXRfdGl0bGUoIlByb2Nlc3NpbmcgcmVjaXBlcyIpCisKKyAgICAgICAgICAgICAgICBndGsuZ2RrLnRocmVhZHNfbGVhdmUoKQorCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5QYXJzZVByb2dyZXNzKToKKyAgICAgICAgICAgICAgICB4ID0gZXZlbnQuY3VycmVudAorICAgICAgICAgICAgICAgIGd0ay5nZGsudGhyZWFkc19lbnRlcigpCisgICAgICAgICAgICAgICAgcGJhci51cGRhdGUoeCAqIDEuMCAvIHByb2dyZXNzX3RvdGFsKQorICAgICAgICAgICAgICAgIHBiYXIuc2V0X3RpdGxlKCcnKQorICAgICAgICAgICAgICAgIGd0ay5nZGsudGhyZWFkc19sZWF2ZSgpCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuUGFyc2VDb21wbGV0ZWQpOgorICAgICAgICAgICAgICAgIGJhcmRpYWxvZy5oaWRlKCkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5EZXBUcmVlR2VuZXJhdGVkKToKKyAgICAgICAgICAgICAgICBndGsuZ2RrLnRocmVhZHNfZW50ZXIoKQorICAgICAgICAgICAgICAgIGRlcC5wYXJzZShldmVudC5fZGVwZ3JhcGgpCisgICAgICAgICAgICAgICAgZ3RrLmdkay50aHJlYWRzX2xlYXZlKCkKKworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuY29tbWFuZC5Db21tYW5kQ29tcGxldGVkKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5jb21tYW5kLkNvbW1hbmRGYWlsZWQpOgorICAgICAgICAgICAgICAgIHByaW50KCJDb21tYW5kIGV4ZWN1dGlvbiBmYWlsZWQ6ICVzIiAlIGV2ZW50LmVycm9yKQorICAgICAgICAgICAgICAgIHJldHVybiBldmVudC5leGl0Y29kZQorCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5jb21tYW5kLkNvbW1hbmRFeGl0KToKKyAgICAgICAgICAgICAgICByZXR1cm4gZXZlbnQuZXhpdGNvZGUKKworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuY29va2VyLkNvb2tlckV4aXQpOgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yIGFzIGlvZXJyb3I6CisgICAgICAgICAgICAjIGlnbm9yZSBpbnRlcnJ1cHRlZCBpbworICAgICAgICAgICAgaWYgaW9lcnJvci5hcmdzWzBdID09IDQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgICAgICBpZiBzaHV0ZG93biA9PSAyOgorICAgICAgICAgICAgICAgIHByaW50KCJcblRoaXJkIEtleWJvYXJkIEludGVycnVwdCwgZXhpdC5cbiIpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIHNodXRkb3duID09IDE6CisgICAgICAgICAgICAgICAgcHJpbnQoIlxuU2Vjb25kIEtleWJvYXJkIEludGVycnVwdCwgc3RvcHBpbmcuLi5cbiIpCisgICAgICAgICAgICAgICAgXywgZXJyb3IgPSBzZXJ2ZXIucnVuQ29tbWFuZChbInN0YXRlRm9yY2VTaHV0ZG93biJdKQorICAgICAgICAgICAgICAgIGlmIGVycm9yOgorICAgICAgICAgICAgICAgICAgICBwcmludCgnVW5hYmxlIHRvIGNsZWFubHkgc3RvcDogJXMnICUgZXJyb3IpCisgICAgICAgICAgICBpZiBzaHV0ZG93biA9PSAwOgorICAgICAgICAgICAgICAgIHByaW50KCJcbktleWJvYXJkIEludGVycnVwdCwgY2xvc2luZyBkb3duLi4uXG4iKQorICAgICAgICAgICAgICAgIF8sIGVycm9yID0gc2VydmVyLnJ1bkNvbW1hbmQoWyJzdGF0ZVNodXRkb3duIl0pCisgICAgICAgICAgICAgICAgaWYgZXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHByaW50KCdVbmFibGUgdG8gY2xlYW5seSBzaHV0ZG93bjogJXMnICUgZXJyb3IpCisgICAgICAgICAgICBzaHV0ZG93biA9IHNodXRkb3duICsgMQorICAgICAgICAgICAgcGFzcwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvZ29nZ2xlLnB5IGIvYml0YmFrZS9saWIvYmIvdWkvZ29nZ2xlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZWU3YjQKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9nb2dnbGUucHkKQEAgLTAsMCArMSwxMjEgQEAKKyMKKyMgQml0QmFrZSBHcmFwaGljYWwgR1RLIFVzZXIgSW50ZXJmYWNlCisjCisjIENvcHlyaWdodCAoQykgMjAwOCAgICAgICAgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgQXV0aG9yZWQgYnkgUm9iIEJyYWRmb3JkIDxyb2JAbGludXguaW50ZWwuY29tPgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworaW1wb3J0IGdvYmplY3QKK2ltcG9ydCBndGsKK2ltcG9ydCB4bWxycGNsaWIKK2Zyb20gYmIudWkuY3J1bWJzLnJ1bm5pbmdidWlsZCBpbXBvcnQgUnVubmluZ0J1aWxkVHJlZVZpZXcsIFJ1bm5pbmdCdWlsZAorZnJvbSBiYi51aS5jcnVtYnMucHJvZ3Jlc3MgaW1wb3J0IFByb2dyZXNzQmFyCisKK2ltcG9ydCBRdWV1ZQorCisKK2RlZiBldmVudF9oYW5kbGVfaWRsZV9mdW5jIChldmVudEhhbmRsZXIsIGJ1aWxkLCBwYmFyKToKKworICAgICMgQ29uc3VtZSBhcyBtYW55IG1lc3NhZ2VzIGFzIHdlIGNhbiBpbiB0aGUgdGltZSBhdmFpbGFibGUgdG8gdXMKKyAgICBldmVudCA9IGV2ZW50SGFuZGxlci5nZXRFdmVudCgpCisgICAgd2hpbGUgZXZlbnQ6CisgICAgICAgIGJ1aWxkLmhhbmRsZV9ldmVudCAoZXZlbnQsIHBiYXIpCisgICAgICAgIGV2ZW50ID0gZXZlbnRIYW5kbGVyLmdldEV2ZW50KCkKKworICAgIHJldHVybiBUcnVlCisKK2RlZiBzY3JvbGxfdHZfY2IgKG1vZGVsLCBwYXRoLCBpdGVyLCB2aWV3KToKKyAgICB2aWV3LnNjcm9sbF90b19jZWxsIChwYXRoKQorCisKKyMgQHRvZG8gaG9vayB0aGVzZSBpbnRvIHRoZSBHVUkgc28gdGhlIHVzZXIgaGFzIGZlZWRiYWNrLi4uCitkZWYgcnVubmluZ19idWlsZF9mYWlsZWRfY2IgKHJ1bm5pbmdfYnVpbGQpOgorICAgIHBhc3MKKworCitkZWYgcnVubmluZ19idWlsZF9zdWNjZWVkZWRfY2IgKHJ1bm5pbmdfYnVpbGQpOgorICAgIHBhc3MKKworCitjbGFzcyBNYWluV2luZG93IChndGsuV2luZG93KToKKyAgICBkZWYgX19pbml0X18gKHNlbGYpOgorICAgICAgICBndGsuV2luZG93Ll9faW5pdF9fIChzZWxmLCBndGsuV0lORE9XX1RPUExFVkVMKQorCisgICAgICAgICMgU2V0dXAgdHJlZSB2aWV3IGFuZCB0aGUgc2Nyb2xsZWQgd2luZG93CisgICAgICAgIHNjcm9sbGVkX3dpbmRvdyA9IGd0ay5TY3JvbGxlZFdpbmRvdyAoKQorICAgICAgICBzZWxmLmFkZCAoc2Nyb2xsZWRfd2luZG93KQorICAgICAgICBzZWxmLmN1cl9idWlsZF90diA9IFJ1bm5pbmdCdWlsZFRyZWVWaWV3KCkKKyAgICAgICAgc2VsZi5jb25uZWN0KCJkZWxldGUtZXZlbnQiLCBndGsubWFpbl9xdWl0KQorICAgICAgICBzZWxmLnNldF9kZWZhdWx0X3NpemUoNjQwLCA0ODApCisgICAgICAgIHNjcm9sbGVkX3dpbmRvdy5hZGQgKHNlbGYuY3VyX2J1aWxkX3R2KQorCisKK2RlZiBtYWluIChzZXJ2ZXIsIGV2ZW50SGFuZGxlciwgcGFyYW1zKToKKyAgICBnb2JqZWN0LnRocmVhZHNfaW5pdCgpCisgICAgZ3RrLmdkay50aHJlYWRzX2luaXQoKQorCisgICAgd2luZG93ID0gTWFpbldpbmRvdyAoKQorICAgIHdpbmRvdy5zaG93X2FsbCAoKQorICAgIHBiYXIgPSBQcm9ncmVzc0Jhcih3aW5kb3cpCisgICAgcGJhci5jb25uZWN0KCJkZWxldGUtZXZlbnQiLCBndGsubWFpbl9xdWl0KQorCisgICAgIyBDcmVhdGUgdGhlIG9iamVjdCBmb3IgdGhlIGN1cnJlbnQgYnVpbGQKKyAgICBydW5uaW5nX2J1aWxkID0gUnVubmluZ0J1aWxkICgpCisgICAgd2luZG93LmN1cl9idWlsZF90di5zZXRfbW9kZWwgKHJ1bm5pbmdfYnVpbGQubW9kZWwpCisgICAgcnVubmluZ19idWlsZC5tb2RlbC5jb25uZWN0KCJyb3ctaW5zZXJ0ZWQiLCBzY3JvbGxfdHZfY2IsIHdpbmRvdy5jdXJfYnVpbGRfdHYpCisgICAgcnVubmluZ19idWlsZC5jb25uZWN0ICgiYnVpbGQtc3VjY2VlZGVkIiwgcnVubmluZ19idWlsZF9zdWNjZWVkZWRfY2IpCisgICAgcnVubmluZ19idWlsZC5jb25uZWN0ICgiYnVpbGQtZmFpbGVkIiwgcnVubmluZ19idWlsZF9mYWlsZWRfY2IpCisKKyAgICB0cnk6CisgICAgICAgIHBhcmFtcy51cGRhdGVGcm9tU2VydmVyKHNlcnZlcikKKyAgICAgICAgY21kbGluZSA9IHBhcmFtcy5wYXJzZUFjdGlvbnMoKQorICAgICAgICBpZiBub3QgY21kbGluZToKKyAgICAgICAgICAgIHByaW50KCJOb3RoaW5nIHRvIGRvLiAgVXNlICdiaXRiYWtlIHdvcmxkJyB0byBidWlsZCBldmVyeXRoaW5nLCBvciBydW4gJ2JpdGJha2UgLS1oZWxwJyBmb3IgdXNhZ2UgaW5mb3JtYXRpb24uIikKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIGlmICdtc2cnIGluIGNtZGxpbmUgYW5kIGNtZGxpbmVbJ21zZyddOgorICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGNtZGxpbmVbJ21zZyddKQorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgY21kbGluZSA9IGNtZGxpbmVbJ2FjdGlvbiddCisgICAgICAgIHJldCwgZXJyb3IgPSBzZXJ2ZXIucnVuQ29tbWFuZChjbWRsaW5lKQorICAgICAgICBpZiBlcnJvcjoKKyAgICAgICAgICAgIHByaW50KCJFcnJvciBydW5uaW5nIGNvbW1hbmQgJyVzJzogJXMiICUgKGNtZGxpbmUsIGVycm9yKSkKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIGVsaWYgcmV0ICE9IFRydWU6CisgICAgICAgICAgICBwcmludCgiRXJyb3IgcnVubmluZyBjb21tYW5kICclcyc6IHJldHVybmVkICVzIiAlIChjbWRsaW5lLCByZXQpKQorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICBleGNlcHQgeG1scnBjbGliLkZhdWx0IGFzIHg6CisgICAgICAgIHByaW50KCJYTUxSUEMgRmF1bHQgZ2V0dGluZyBjb21tYW5kbGluZTpcbiAlcyIgJSB4KQorICAgICAgICByZXR1cm4gMQorCisgICAgIyBVc2UgYSB0aW1lb3V0IGZ1bmN0aW9uIGZvciBwcm9iaW5nIHRoZSBldmVudCBxdWV1ZSB0byBmaW5kIG91dCBpZiB3ZQorICAgICMgaGF2ZSBhIG1lc3NhZ2Ugd2FpdGluZyBmb3IgdXMuCisgICAgZ29iamVjdC50aW1lb3V0X2FkZCAoMTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X2hhbmRsZV9pZGxlX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bm5pbmdfYnVpbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGJhcikKKworICAgIHRyeToKKyAgICAgICAgZ3RrLm1haW4oKQorICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yIGFzIGlvZXJyb3I6CisgICAgICAgICMgaWdub3JlIGludGVycnVwdGVkIGlvCisgICAgICAgIGlmIGlvZXJyb3IuYXJnc1swXSA9PSA0OgorICAgICAgICAgICAgcGFzcworICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgcGFzcworICAgIGZpbmFsbHk6CisgICAgICAgIHNlcnZlci5ydW5Db21tYW5kKFsic3RhdGVGb3JjZVNodXRkb3duIl0pCisKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2hvYi5weSBiL2JpdGJha2UvbGliL2JiL3VpL2hvYi5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kYTViNDExCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvaG9iLnB5CkBAIC0wLDAgKzEsMTA5IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgQml0QmFrZSBHcmFwaGljYWwgR1RLIFVzZXIgSW50ZXJmYWNlCisjCisjIENvcHlyaWdodCAoQykgMjAxMSAgICAgICAgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgQXV0aG9yZWQgYnkgSm9zaHVhIExvY2sgPGpvc2hAbGludXguaW50ZWwuY29tPgorIyBBdXRob3JlZCBieSBEb25neGlhbyBYdSA8ZG9uZ3hpYW8ueHVAaW50ZWwuY29tPgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworaW1wb3J0IHN5cworaW1wb3J0IG9zCityZXF1aXJlbWVudHMgPSAiRkFUQUw6IEhvYiByZXF1aXJlcyBHdGsrIDIuMjAuMCBvciBoaWdoZXIsIFB5R3RrIDIuMjEuMCBvciBoaWdoZXIiCit0cnk6CisgICAgaW1wb3J0IGdvYmplY3QKKyAgICBpbXBvcnQgZ3RrCisgICAgaW1wb3J0IHB5Z3RrCisgICAgcHlndGsucmVxdWlyZSgnMi4wJykgIyB0byBiZSBjZXJ0YWluIHdlIGRvbid0IGhhdmUgZ3RrKyAxLnggIT8hCisgICAgZ3RrdmVyID0gZ3RrLmd0a192ZXJzaW9uCisgICAgcHlndGt2ZXIgPSBndGsucHlndGtfdmVyc2lvbgorICAgIGlmIGd0a3ZlciAgPCAoMiwgMjAsIDApIG9yIHB5Z3RrdmVyIDwgKDIsIDIxLCAwKToKKyAgICAgICAgc3lzLmV4aXQoIiVzLFxuWW91IGhhdmUgR3RrKyAlcyBhbmQgUHlHdGsgJXMuIiAlIChyZXF1aXJlbWVudHMsCisgICAgICAgICAgICAgICAgIi4iLmpvaW4obWFwKHN0ciwgZ3RrdmVyKSksCisgICAgICAgICAgICAgICAgIi4iLmpvaW4obWFwKHN0ciwgcHlndGt2ZXIpKSkpCitleGNlcHQgSW1wb3J0RXJyb3IgYXMgZXhjOgorICAgIHN5cy5leGl0KCIlcyAoJXMpLiIgJSAocmVxdWlyZW1lbnRzLCBzdHIoZXhjKSkpCitzeXMucGF0aC5pbnNlcnQoMCwgb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKSkpCit0cnk6CisgICAgaW1wb3J0IGJiCitleGNlcHQgUnVudGltZUVycm9yIGFzIGV4YzoKKyAgICBzeXMuZXhpdChzdHIoZXhjKSkKK2Zyb20gYmIudWkgaW1wb3J0IHVpaGVscGVyCitmcm9tIGJiLnVpLmNydW1icy5ob2JsaXN0bW9kZWwgaW1wb3J0IFJlY2lwZUxpc3RNb2RlbCwgUGFja2FnZUxpc3RNb2RlbAorZnJvbSBiYi51aS5jcnVtYnMuaG9iZXZlbnRoYW5kbGVyIGltcG9ydCBIb2JIYW5kbGVyCitmcm9tIGJiLnVpLmNydW1icy5idWlsZGVyIGltcG9ydCBCdWlsZGVyCisKK2ZlYXR1cmVTZXQgPSBbYmIuY29va2VyLkNvb2tlckZlYXR1cmVzLkhPQl9FWFRSQV9DQUNIRVMsIGJiLmNvb2tlci5Db29rZXJGZWF0dXJlcy5CQVNFREFUQVNUT1JFX1RSQUNLSU5HXQorCitkZWYgZXZlbnRfaGFuZGxlX2lkbGVfZnVuYyhldmVudEhhbmRsZXIsIGhvYkhhbmRsZXIpOgorICAgICMgQ29uc3VtZSBhcyBtYW55IG1lc3NhZ2VzIGFzIHdlIGNhbiBpbiB0aGUgdGltZSBhdmFpbGFibGUgdG8gdXMKKyAgICBpZiBub3QgZXZlbnRIYW5kbGVyOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBldmVudCA9IGV2ZW50SGFuZGxlci5nZXRFdmVudCgpCisgICAgd2hpbGUgZXZlbnQ6CisgICAgICAgIGhvYkhhbmRsZXIuaGFuZGxlX2V2ZW50KGV2ZW50KQorICAgICAgICBldmVudCA9IGV2ZW50SGFuZGxlci5nZXRFdmVudCgpCisgICAgcmV0dXJuIFRydWUKKworX2V2dF9saXN0ID0gWyAiYmIucnVucXVldWUucnVuUXVldWVFeGl0V2FpdCIsICJiYi5ldmVudC5Mb2dFeGVjVFRZIiwgImxvZ2dpbmcuTG9nUmVjb3JkIiwKKyAgICAgICAgICAgICAgImJiLmJ1aWxkLlRhc2tGYWlsZWQiLCAiYmIuYnVpbGQuVGFza0Jhc2UiLCAiYmIuZXZlbnQuUGFyc2VTdGFydGVkIiwKKyAgICAgICAgICAgICAgImJiLmV2ZW50LlBhcnNlUHJvZ3Jlc3MiLCAiYmIuZXZlbnQuUGFyc2VDb21wbGV0ZWQiLCAiYmIuZXZlbnQuQ2FjaGVMb2FkU3RhcnRlZCIsCisgICAgICAgICAgICAgICJiYi5ldmVudC5DYWNoZUxvYWRQcm9ncmVzcyIsICJiYi5ldmVudC5DYWNoZUxvYWRDb21wbGV0ZWQiLCAiYmIuY29tbWFuZC5Db21tYW5kRmFpbGVkIiwKKyAgICAgICAgICAgICAgImJiLmNvbW1hbmQuQ29tbWFuZEV4aXQiLCAiYmIuY29tbWFuZC5Db21tYW5kQ29tcGxldGVkIiwgICJiYi5jb29rZXIuQ29va2VyRXhpdCIsCisgICAgICAgICAgICAgICJiYi5ldmVudC5NdWx0aXBsZVByb3ZpZGVycyIsICJiYi5ldmVudC5Ob1Byb3ZpZGVyIiwgImJiLnJ1bnF1ZXVlLnNjZW5lUXVldWVUYXNrU3RhcnRlZCIsCisgICAgICAgICAgICAgICJiYi5ydW5xdWV1ZS5ydW5RdWV1ZVRhc2tTdGFydGVkIiwgImJiLnJ1bnF1ZXVlLnJ1blF1ZXVlVGFza0ZhaWxlZCIsICJiYi5ydW5xdWV1ZS5zY2VuZVF1ZXVlVGFza0ZhaWxlZCIsCisgICAgICAgICAgICAgICJiYi5ldmVudC5CdWlsZEJhc2UiLCAiYmIuYnVpbGQuVGFza1N0YXJ0ZWQiLCAiYmIuYnVpbGQuVGFza1N1Y2NlZWRlZCIsICJiYi5idWlsZC5UYXNrRmFpbGVkU2lsZW50IiwKKyAgICAgICAgICAgICAgImJiLmV2ZW50LlNhbml0eUNoZWNrUGFzc2VkIiwgImJiLmV2ZW50LlNhbml0eUNoZWNrRmFpbGVkIiwgImJiLmV2ZW50LlBhY2thZ2VJbmZvIiwKKyAgICAgICAgICAgICAgImJiLmV2ZW50LlRhcmdldHNUcmVlR2VuZXJhdGVkIiwgImJiLmV2ZW50LkNvbmZpZ0ZpbGVzRm91bmQiLCAiYmIuZXZlbnQuQ29uZmlnRmlsZVBhdGhGb3VuZCIsCisgICAgICAgICAgICAgICJiYi5ldmVudC5GaWxlc01hdGNoaW5nRm91bmQiLCAiYmIuZXZlbnQuTmV0d29ya1Rlc3RGYWlsZWQiLCAiYmIuZXZlbnQuTmV0d29ya1Rlc3RQYXNzZWQiLAorICAgICAgICAgICAgICAiYmIuZXZlbnQuQnVpbGRTdGFydGVkIiwgImJiLmV2ZW50LkJ1aWxkQ29tcGxldGVkIiwgImJiLmV2ZW50LkRpc2tGdWxsIl0KKworZGVmIG1haW4gKHNlcnZlciwgZXZlbnRIYW5kbGVyLCBwYXJhbXMpOgorICAgIHBhcmFtcy51cGRhdGVGcm9tU2VydmVyKHNlcnZlcikKKyAgICBnb2JqZWN0LnRocmVhZHNfaW5pdCgpCisKKyAgICAjIFRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIEhvYiBhbmQgdGhlIGJpdGJha2Ugc2VydmVyIGFyZQorICAgICMgcnVubmluZyBvbiBkaWZmZXJlbnQgbWFjaGluZXMKKyAgICAjIHJlY2lwZSBtb2RlbCBhbmQgcGFja2FnZSBtb2RlbAorICAgIHJlY2lwZV9tb2RlbCA9IFJlY2lwZUxpc3RNb2RlbCgpCisgICAgcGFja2FnZV9tb2RlbCA9IFBhY2thZ2VMaXN0TW9kZWwoKQorCisgICAgbGxldmVsLCBkZWJ1Z19kb21haW5zID0gYmIubXNnLmNvbnN0cnVjdExvZ09wdGlvbnMoKQorICAgIHNlcnZlci5ydW5Db21tYW5kKFsic2V0RXZlbnRNYXNrIiwgc2VydmVyLmdldEV2ZW50SGFuZGxlKCksIGxsZXZlbCwgZGVidWdfZG9tYWlucywgX2V2dF9saXN0XSkKKyAgICBob2JIYW5kbGVyID0gSG9iSGFuZGxlcihzZXJ2ZXIsIHJlY2lwZV9tb2RlbCwgcGFja2FnZV9tb2RlbCkKKyAgICBidWlsZGVyID0gQnVpbGRlcihob2JIYW5kbGVyLCByZWNpcGVfbW9kZWwsIHBhY2thZ2VfbW9kZWwpCisKKyAgICAjIFRoaXMgdGltZW91dCBmdW5jdGlvbiByZWd1bGFybHkgcHJvYmVzIHRoZSBldmVudCBxdWV1ZSB0byBmaW5kIG91dCBpZiB3ZQorICAgICMgaGF2ZSBhbnkgbWVzc2FnZXMgd2FpdGluZyBmb3IgdXMuCisgICAgZ29iamVjdC50aW1lb3V0X2FkZCgxMCwgZXZlbnRfaGFuZGxlX2lkbGVfZnVuYywgZXZlbnRIYW5kbGVyLCBob2JIYW5kbGVyKQorCisgICAgdHJ5OgorICAgICAgICBndGsubWFpbigpCisgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3IgYXMgaW9lcnJvcjoKKyAgICAgICAgIyBpZ25vcmUgaW50ZXJydXB0ZWQgaW8KKyAgICAgICAgaWYgaW9lcnJvci5hcmdzWzBdID09IDQ6CisgICAgICAgICAgICBwYXNzCisgICAgZmluYWxseToKKyAgICAgICAgaG9iSGFuZGxlci5jYW5jZWxfYnVpbGQoZm9yY2UgPSBUcnVlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRyeToKKyAgICAgICAgcmV0ID0gbWFpbigpCisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgcmV0ID0gMQorICAgICAgICBpbXBvcnQgdHJhY2ViYWNrCisgICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoMTUpCisgICAgc3lzLmV4aXQocmV0KQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvaW1hZ2VzL2ltYWdlc19kaXNwbGF5LnBuZyBiL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2ltYWdlcy9pbWFnZXNfZGlzcGxheS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdmODcxMAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2ltYWdlcy9pbWFnZXNfZGlzcGxheS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvaW1hZ2VzL2ltYWdlc19ob3Zlci5wbmcgYi9iaXRiYWtlL2xpYi9iYi91aS9pY29ucy9pbWFnZXMvaW1hZ2VzX2hvdmVyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDljZDk5Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvaW1hZ2VzL2ltYWdlc19ob3Zlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvaW5kaWNhdG9ycy9hZGQtaG92ZXIucG5nIGIvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvaW5kaWNhdG9ycy9hZGQtaG92ZXIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNmRmNzcKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9pY29ucy9pbmRpY2F0b3JzL2FkZC1ob3Zlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvaW5kaWNhdG9ycy9hZGQucG5nIGIvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvaW5kaWNhdG9ycy9hZGQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZTcwOTAKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9pY29ucy9pbmRpY2F0b3JzL2FkZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvaW5kaWNhdG9ycy9hbGVydC5wbmcgYi9iaXRiYWtlL2xpYi9iYi91aS9pY29ucy9pbmRpY2F0b3JzL2FsZXJ0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWM2ZjU1Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvaW5kaWNhdG9ycy9hbGVydC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvaW5kaWNhdG9ycy9jb25maXJtYXRpb24ucG5nIGIvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvaW5kaWNhdG9ycy9jb25maXJtYXRpb24ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNTQwMmQKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9pY29ucy9pbmRpY2F0b3JzL2NvbmZpcm1hdGlvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvaW5kaWNhdG9ycy9kZW5pZWQucG5nIGIvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvaW5kaWNhdG9ycy9kZW5pZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMzVjN2QKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9pY29ucy9pbmRpY2F0b3JzL2RlbmllZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvaW5kaWNhdG9ycy9lcnJvci5wbmcgYi9iaXRiYWtlL2xpYi9iYi91aS9pY29ucy9pbmRpY2F0b3JzL2Vycm9yLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDZhOGMxCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvaW5kaWNhdG9ycy9lcnJvci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvaW5kaWNhdG9ycy9pbmZvLnBuZyBiL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2luZGljYXRvcnMvaW5mby5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU4ZThkOAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2luZGljYXRvcnMvaW5mby5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvaW5kaWNhdG9ycy9pc3N1ZXMucG5nIGIvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvaW5kaWNhdG9ycy9pc3N1ZXMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYzc0NjEKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9pY29ucy9pbmRpY2F0b3JzL2lzc3Vlcy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvaW5kaWNhdG9ycy9yZWZyZXNoLnBuZyBiL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2luZGljYXRvcnMvcmVmcmVzaC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI2YzQxOQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2luZGljYXRvcnMvcmVmcmVzaC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvaW5kaWNhdG9ycy9yZW1vdmUtaG92ZXIucG5nIGIvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvaW5kaWNhdG9ycy9yZW1vdmUtaG92ZXIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNTdjNjkKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9pY29ucy9pbmRpY2F0b3JzL3JlbW92ZS1ob3Zlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvaW5kaWNhdG9ycy9yZW1vdmUucG5nIGIvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvaW5kaWNhdG9ycy9yZW1vdmUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YzNjMjkKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9pY29ucy9pbmRpY2F0b3JzL3JlbW92ZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvaW5kaWNhdG9ycy90aWNrLnBuZyBiL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2luZGljYXRvcnMvdGljay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVhYWQzNgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2luZGljYXRvcnMvdGljay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvaW5mby9pbmZvX2Rpc3BsYXkucG5nIGIvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvaW5mby9pbmZvX2Rpc3BsYXkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZmJiYTIKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9pY29ucy9pbmZvL2luZm9fZGlzcGxheS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvaW5mby9pbmZvX2hvdmVyLnBuZyBiL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2luZm8vaW5mb19ob3Zlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlkMjk0ZAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2luZm8vaW5mb19ob3Zlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvbGF5ZXJzL2xheWVyc19kaXNwbGF5LnBuZyBiL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2xheWVycy9sYXllcnNfZGlzcGxheS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdmOTA1MwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2xheWVycy9sYXllcnNfZGlzcGxheS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvbGF5ZXJzL2xheWVyc19ob3Zlci5wbmcgYi9iaXRiYWtlL2xpYi9iYi91aS9pY29ucy9sYXllcnMvbGF5ZXJzX2hvdmVyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmYzY2UwCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvbGF5ZXJzL2xheWVyc19ob3Zlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvcGFja2FnZXMvcGFja2FnZXNfZGlzcGxheS5wbmcgYi9iaXRiYWtlL2xpYi9iYi91aS9pY29ucy9wYWNrYWdlcy9wYWNrYWdlc19kaXNwbGF5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWQwYTUwCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvcGFja2FnZXMvcGFja2FnZXNfZGlzcGxheS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvcGFja2FnZXMvcGFja2FnZXNfaG92ZXIucG5nIGIvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvcGFja2FnZXMvcGFja2FnZXNfaG92ZXIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwODExNjUKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9pY29ucy9wYWNrYWdlcy9wYWNrYWdlc19ob3Zlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvcmVjaXBlL3JlY2lwZV9kaXNwbGF5LnBuZyBiL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL3JlY2lwZS9yZWNpcGVfZGlzcGxheS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk4MDliYwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL3JlY2lwZS9yZWNpcGVfZGlzcGxheS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvcmVjaXBlL3JlY2lwZV9ob3Zlci5wbmcgYi9iaXRiYWtlL2xpYi9iYi91aS9pY29ucy9yZWNpcGUvcmVjaXBlX2hvdmVyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTQ4ZGE5Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvcmVjaXBlL3JlY2lwZV9ob3Zlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvc2V0dGluZ3Mvc2V0dGluZ3NfZGlzcGxheS5wbmcgYi9iaXRiYWtlL2xpYi9iYi91aS9pY29ucy9zZXR0aW5ncy9zZXR0aW5nc19kaXNwbGF5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGM0NjRkCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvc2V0dGluZ3Mvc2V0dGluZ3NfZGlzcGxheS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvc2V0dGluZ3Mvc2V0dGluZ3NfaG92ZXIucG5nIGIvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvc2V0dGluZ3Mvc2V0dGluZ3NfaG92ZXIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MmEwYmYKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9pY29ucy9zZXR0aW5ncy9zZXR0aW5nc19ob3Zlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvdGVtcGxhdGVzL3RlbXBsYXRlc19kaXNwbGF5LnBuZyBiL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL3RlbXBsYXRlcy90ZW1wbGF0ZXNfZGlzcGxheS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUzYzdhZgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL3RlbXBsYXRlcy90ZW1wbGF0ZXNfZGlzcGxheS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvdGVtcGxhdGVzL3RlbXBsYXRlc19ob3Zlci5wbmcgYi9iaXRiYWtlL2xpYi9iYi91aS9pY29ucy90ZW1wbGF0ZXMvdGVtcGxhdGVzX2hvdmVyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmI3MTY1Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvdGVtcGxhdGVzL3RlbXBsYXRlc19ob3Zlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkva25vdHR5LnB5IGIvYml0YmFrZS9saWIvYmIvdWkva25vdHR5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZWUyNDIKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9rbm90dHkucHkKQEAgLTAsMCArMSw1NjQgQEAKKyMKKyMgQml0QmFrZSAoTm8pVFRZIFVJIEltcGxlbWVudGF0aW9uCisjCisjIEhhbmRsaW5nIG91dHB1dCB0byBUVFlzIG9yIGZpbGVzIChubyBUVFkpCisjCisjIENvcHlyaWdodCAoQykgMjAwNi0yMDEyIFJpY2hhcmQgUHVyZGllCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHhtbHJwY2xpYgoraW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBwcm9ncmVzc2JhcgoraW1wb3J0IHNpZ25hbAoraW1wb3J0IGJiLm1zZworaW1wb3J0IHRpbWUKK2ltcG9ydCBmY250bAoraW1wb3J0IHN0cnVjdAoraW1wb3J0IGNvcHkKK2ltcG9ydCBhdGV4aXQKK2Zyb20gYmIudWkgaW1wb3J0IHVpaGVscGVyCisKK2ZlYXR1cmVTZXQgPSBbYmIuY29va2VyLkNvb2tlckZlYXR1cmVzLlNFTkRfU0FOSVRZRVZFTlRTXQorCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiQml0QmFrZSIpCitpbnRlcmFjdGl2ZSA9IHN5cy5zdGRvdXQuaXNhdHR5KCkKKworY2xhc3MgQkJQcm9ncmVzcyhwcm9ncmVzc2Jhci5Qcm9ncmVzc0Jhcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1zZywgbWF4dmFsKToKKyAgICAgICAgc2VsZi5tc2cgPSBtc2cKKyAgICAgICAgd2lkZ2V0cyA9IFtwcm9ncmVzc2Jhci5QZXJjZW50YWdlKCksICcgJywgcHJvZ3Jlc3NiYXIuQmFyKCksICcgJywKKyAgICAgICAgICAgcHJvZ3Jlc3NiYXIuRVRBKCldCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fcmVzaXplX2RlZmF1bHQgPSBzaWduYWwuZ2V0c2lnbmFsKHNpZ25hbC5TSUdXSU5DSCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5fcmVzaXplX2RlZmF1bHQgPSBOb25lCisgICAgICAgIHByb2dyZXNzYmFyLlByb2dyZXNzQmFyLl9faW5pdF9fKHNlbGYsIG1heHZhbCwgW3NlbGYubXNnICsgIjogIl0gKyB3aWRnZXRzLCBmZD1zeXMuc3Rkb3V0KQorCisgICAgZGVmIF9oYW5kbGVfcmVzaXplKHNlbGYsIHNpZ251bSwgZnJhbWUpOgorICAgICAgICBwcm9ncmVzc2Jhci5Qcm9ncmVzc0Jhci5faGFuZGxlX3Jlc2l6ZShzZWxmLCBzaWdudW0sIGZyYW1lKQorICAgICAgICBpZiBzZWxmLl9yZXNpemVfZGVmYXVsdDoKKyAgICAgICAgICAgIHNlbGYuX3Jlc2l6ZV9kZWZhdWx0KHNpZ251bSwgZnJhbWUpCisgICAgZGVmIGZpbmlzaChzZWxmKToKKyAgICAgICAgcHJvZ3Jlc3NiYXIuUHJvZ3Jlc3NCYXIuZmluaXNoKHNlbGYpCisgICAgICAgIGlmIHNlbGYuX3Jlc2l6ZV9kZWZhdWx0OgorICAgICAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHV0lOQ0gsIHNlbGYuX3Jlc2l6ZV9kZWZhdWx0KQorCitjbGFzcyBOb25JbnRlcmFjdGl2ZVByb2dyZXNzKG9iamVjdCk6CisgICAgZm9iaiA9IHN5cy5zdGRvdXQKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtc2csIG1heHZhbCk6CisgICAgICAgIHNlbGYubXNnID0gbXNnCisgICAgICAgIHNlbGYubWF4dmFsID0gbWF4dmFsCisKKyAgICBkZWYgc3RhcnQoc2VsZik6CisgICAgICAgIHNlbGYuZm9iai53cml0ZSgiJXMuLi4iICUgc2VsZi5tc2cpCisgICAgICAgIHNlbGYuZm9iai5mbHVzaCgpCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgdXBkYXRlKHNlbGYsIHZhbHVlKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGZpbmlzaChzZWxmKToKKyAgICAgICAgc2VsZi5mb2JqLndyaXRlKCJkb25lLlxuIikKKyAgICAgICAgc2VsZi5mb2JqLmZsdXNoKCkKKworZGVmIG5ld19wcm9ncmVzcyhtc2csIG1heHZhbCk6CisgICAgaWYgaW50ZXJhY3RpdmU6CisgICAgICAgIHJldHVybiBCQlByb2dyZXNzKG1zZywgbWF4dmFsKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBOb25JbnRlcmFjdGl2ZVByb2dyZXNzKG1zZywgbWF4dmFsKQorCitkZWYgcGx1cmFsaXNlKHNpbmd1bGFyLCBwbHVyYWwsIHF0eSk6CisgICAgaWYocXR5ID09IDEpOgorICAgICAgICByZXR1cm4gc2luZ3VsYXIgJSBxdHkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gcGx1cmFsICUgcXR5CisKKworY2xhc3MgSW50ZXJhY3RDb25zb2xlTG9nRmlsdGVyKGxvZ2dpbmcuRmlsdGVyKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGYsIGZvcm1hdCk6CisgICAgICAgIHNlbGYudGYgPSB0ZgorICAgICAgICBzZWxmLmZvcm1hdCA9IGZvcm1hdAorCisgICAgZGVmIGZpbHRlcihzZWxmLCByZWNvcmQpOgorICAgICAgICBpZiByZWNvcmQubGV2ZWxubyA9PSBzZWxmLmZvcm1hdC5OT1RFIGFuZCAocmVjb3JkLm1zZy5zdGFydHN3aXRoKCJSdW5uaW5nIikgb3IgcmVjb3JkLm1zZy5zdGFydHN3aXRoKCJyZWNpcGUgIikpOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHNlbGYudGYuY2xlYXJGb290ZXIoKQorICAgICAgICByZXR1cm4gVHJ1ZQorCitjbGFzcyBUZXJtaW5hbEZpbHRlcihvYmplY3QpOgorICAgIGNvbHVtbnMgPSA4MAorCisgICAgZGVmIHNpZ3dpbmNoX2hhbmRsZShzZWxmLCBzaWdudW0sIGZyYW1lKToKKyAgICAgICAgc2VsZi5jb2x1bW5zID0gc2VsZi5nZXRUZXJtaW5hbENvbHVtbnMoKQorICAgICAgICBpZiBzZWxmLl9zaWd3aW5jaF9kZWZhdWx0OgorICAgICAgICAgICAgc2VsZi5fc2lnd2luY2hfZGVmYXVsdChzaWdudW0sIGZyYW1lKQorCisgICAgZGVmIGdldFRlcm1pbmFsQ29sdW1ucyhzZWxmKToKKyAgICAgICAgZGVmIGlvY3RsX0dXSU5TWihmZCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY3IgPSBzdHJ1Y3QudW5wYWNrKCdoaCcsIGZjbnRsLmlvY3RsKGZkLCBzZWxmLnRlcm1pb3MuVElPQ0dXSU5TWiwgJzEyMzQnKSkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgcmV0dXJuIGNyCisgICAgICAgIGNyID0gaW9jdGxfR1dJTlNaKHN5cy5zdGRvdXQuZmlsZW5vKCkpCisgICAgICAgIGlmIG5vdCBjcjoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmZCA9IG9zLm9wZW4ob3MuY3Rlcm1pZCgpLCBvcy5PX1JET05MWSkKKyAgICAgICAgICAgICAgICBjciA9IGlvY3RsX0dXSU5TWihmZCkKKyAgICAgICAgICAgICAgICBvcy5jbG9zZShmZCkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGlmIG5vdCBjcjoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjciA9IChlbnZbJ0xJTkVTJ10sIGVudlsnQ09MVU1OUyddKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGNyID0gKDI1LCA4MCkKKyAgICAgICAgcmV0dXJuIGNyWzFdCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFpbiwgaGVscGVyLCBjb25zb2xlLCBlcnJjb25zb2xlLCBmb3JtYXQpOgorICAgICAgICBzZWxmLm1haW4gPSBtYWluCisgICAgICAgIHNlbGYuaGVscGVyID0gaGVscGVyCisgICAgICAgIHNlbGYuY3V1ID0gTm9uZQorICAgICAgICBzZWxmLnN0ZGluYmFja3VwID0gTm9uZQorICAgICAgICBzZWxmLmludGVyYWN0aXZlID0gc3lzLnN0ZG91dC5pc2F0dHkoKQorICAgICAgICBzZWxmLmZvb3Rlcl9wcmVzZW50ID0gRmFsc2UKKyAgICAgICAgc2VsZi5sYXN0cGlkcyA9IFtdCisKKyAgICAgICAgaWYgbm90IHNlbGYuaW50ZXJhY3RpdmU6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgY3Vyc2VzCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHN5cy5leGl0KCJGQVRBTDogVGhlIGtub3R0eSB1aSBjb3VsZCBub3QgbG9hZCB0aGUgcmVxdWlyZWQgY3Vyc2VzIHB5dGhvbiBtb2R1bGUuIikKKworICAgICAgICBpbXBvcnQgdGVybWlvcworICAgICAgICBzZWxmLmN1cnNlcyA9IGN1cnNlcworICAgICAgICBzZWxmLnRlcm1pb3MgPSB0ZXJtaW9zCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZkID0gc3lzLnN0ZGluLmZpbGVubygpCisgICAgICAgICAgICBzZWxmLnN0ZGluYmFja3VwID0gdGVybWlvcy50Y2dldGF0dHIoZmQpCisgICAgICAgICAgICBuZXcgPSBjb3B5LmRlZXBjb3B5KHNlbGYuc3RkaW5iYWNrdXApCisgICAgICAgICAgICBuZXdbM10gPSBuZXdbM10gJiB+dGVybWlvcy5FQ0hPCisgICAgICAgICAgICB0ZXJtaW9zLnRjc2V0YXR0cihmZCwgdGVybWlvcy5UQ1NBRFJBSU4sIG5ldykKKyAgICAgICAgICAgIGN1cnNlcy5zZXR1cHRlcm0oKQorICAgICAgICAgICAgaWYgY3Vyc2VzLnRpZ2V0bnVtKCJjb2xvcnMiKSA+IDI6CisgICAgICAgICAgICAgICAgZm9ybWF0LmVuYWJsZV9jb2xvcigpCisgICAgICAgICAgICBzZWxmLmVkID0gY3Vyc2VzLnRpZ2V0c3RyKCJlZCIpCisgICAgICAgICAgICBpZiBzZWxmLmVkOgorICAgICAgICAgICAgICAgIHNlbGYuY3V1ID0gY3Vyc2VzLnRpZ2V0c3RyKCJjdXUiKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuX3NpZ3dpbmNoX2RlZmF1bHQgPSBzaWduYWwuZ2V0c2lnbmFsKHNpZ25hbC5TSUdXSU5DSCkKKyAgICAgICAgICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdXSU5DSCwgc2VsZi5zaWd3aW5jaF9oYW5kbGUpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgc2VsZi5jb2x1bW5zID0gc2VsZi5nZXRUZXJtaW5hbENvbHVtbnMoKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmN1dSA9IE5vbmUKKyAgICAgICAgY29uc29sZS5hZGRGaWx0ZXIoSW50ZXJhY3RDb25zb2xlTG9nRmlsdGVyKHNlbGYsIGZvcm1hdCkpCisgICAgICAgIGVycmNvbnNvbGUuYWRkRmlsdGVyKEludGVyYWN0Q29uc29sZUxvZ0ZpbHRlcihzZWxmLCBmb3JtYXQpKQorCisgICAgZGVmIGNsZWFyRm9vdGVyKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmZvb3Rlcl9wcmVzZW50OgorICAgICAgICAgICAgbGluZXMgPSBzZWxmLmZvb3Rlcl9wcmVzZW50CisgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKHNlbGYuY3Vyc2VzLnRwYXJtKHNlbGYuY3V1LCBsaW5lcykpCisgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKHNlbGYuY3Vyc2VzLnRwYXJtKHNlbGYuZWQpKQorICAgICAgICBzZWxmLmZvb3Rlcl9wcmVzZW50ID0gRmFsc2UKKworICAgIGRlZiB1cGRhdGVGb290ZXIoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLmN1dToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBhY3RpdmV0YXNrcyA9IHNlbGYuaGVscGVyLnJ1bm5pbmdfdGFza3MKKyAgICAgICAgZmFpbGVkdGFza3MgPSBzZWxmLmhlbHBlci5mYWlsZWRfdGFza3MKKyAgICAgICAgcnVubmluZ3BpZHMgPSBzZWxmLmhlbHBlci5ydW5uaW5nX3BpZHMKKyAgICAgICAgaWYgc2VsZi5mb290ZXJfcHJlc2VudCBhbmQgKHNlbGYubGFzdGNvdW50ID09IHNlbGYuaGVscGVyLnRhc2tudW1iZXJfY3VycmVudCkgYW5kIChzZWxmLmxhc3RwaWRzID09IHJ1bm5pbmdwaWRzKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLmZvb3Rlcl9wcmVzZW50OgorICAgICAgICAgICAgc2VsZi5jbGVhckZvb3RlcigpCisgICAgICAgIGlmIChub3Qgc2VsZi5oZWxwZXIudGFza251bWJlcl90b3RhbCBvciBzZWxmLmhlbHBlci50YXNrbnVtYmVyX2N1cnJlbnQgPT0gc2VsZi5oZWxwZXIudGFza251bWJlcl90b3RhbCkgYW5kIG5vdCBsZW4oYWN0aXZldGFza3MpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHRhc2tzID0gW10KKyAgICAgICAgZm9yIHQgaW4gcnVubmluZ3BpZHM6CisgICAgICAgICAgICB0YXNrcy5hcHBlbmQoIiVzIChwaWQgJXMpIiAlIChhY3RpdmV0YXNrc1t0XVsidGl0bGUiXSwgdCkpCisKKyAgICAgICAgaWYgc2VsZi5tYWluLnNodXRkb3duOgorICAgICAgICAgICAgY29udGVudCA9ICJXYWl0aW5nIGZvciAlcyBydW5uaW5nIHRhc2tzIHRvIGZpbmlzaDoiICUgbGVuKGFjdGl2ZXRhc2tzKQorICAgICAgICBlbGlmIG5vdCBsZW4oYWN0aXZldGFza3MpOgorICAgICAgICAgICAgY29udGVudCA9ICJObyBjdXJyZW50bHkgcnVubmluZyB0YXNrcyAoJXMgb2YgJXMpIiAlIChzZWxmLmhlbHBlci50YXNrbnVtYmVyX2N1cnJlbnQsIHNlbGYuaGVscGVyLnRhc2tudW1iZXJfdG90YWwpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjb250ZW50ID0gIkN1cnJlbnRseSAlcyBydW5uaW5nIHRhc2tzICglcyBvZiAlcyk6IiAlIChsZW4oYWN0aXZldGFza3MpLCBzZWxmLmhlbHBlci50YXNrbnVtYmVyX2N1cnJlbnQsIHNlbGYuaGVscGVyLnRhc2tudW1iZXJfdG90YWwpCisgICAgICAgIHByaW50KGNvbnRlbnQpCisgICAgICAgIGxpbmVzID0gMSArIGludChsZW4oY29udGVudCkgLyAoc2VsZi5jb2x1bW5zICsgMSkpCisgICAgICAgIGZvciB0YXNrbnVtLCB0YXNrIGluIGVudW1lcmF0ZSh0YXNrcyk6CisgICAgICAgICAgICBjb250ZW50ID0gIiVzOiAlcyIgJSAodGFza251bSwgdGFzaykKKyAgICAgICAgICAgIHByaW50KGNvbnRlbnQpCisgICAgICAgICAgICBsaW5lcyA9IGxpbmVzICsgMSArIGludChsZW4oY29udGVudCkgLyAoc2VsZi5jb2x1bW5zICsgMSkpCisgICAgICAgIHNlbGYuZm9vdGVyX3ByZXNlbnQgPSBsaW5lcworICAgICAgICBzZWxmLmxhc3RwaWRzID0gcnVubmluZ3BpZHNbOl0KKyAgICAgICAgc2VsZi5sYXN0Y291bnQgPSBzZWxmLmhlbHBlci50YXNrbnVtYmVyX2N1cnJlbnQKKworICAgIGRlZiBmaW5pc2goc2VsZik6CisgICAgICAgIGlmIHNlbGYuc3RkaW5iYWNrdXA6CisgICAgICAgICAgICBmZCA9IHN5cy5zdGRpbi5maWxlbm8oKQorICAgICAgICAgICAgc2VsZi50ZXJtaW9zLnRjc2V0YXR0cihmZCwgc2VsZi50ZXJtaW9zLlRDU0FEUkFJTiwgc2VsZi5zdGRpbmJhY2t1cCkKKworZGVmIF9sb2dfc2V0dGluZ3NfZnJvbV9zZXJ2ZXIoc2VydmVyKToKKyAgICAjIEdldCB2YWx1ZXMgb2YgdmFyaWFibGVzIHdoaWNoIGNvbnRyb2wgb3VyIG91dHB1dAorICAgIGluY2x1ZGVsb2dzLCBlcnJvciA9IHNlcnZlci5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiQkJJTkNMVURFTE9HUyJdKQorICAgIGlmIGVycm9yOgorICAgICAgICBsb2dnZXIuZXJyb3IoIlVuYWJsZSB0byBnZXQgdGhlIHZhbHVlIG9mIEJCSU5DTFVERUxPR1MgdmFyaWFibGU6ICVzIiAlIGVycm9yKQorICAgICAgICByYWlzZSBCYXNlRXhjZXB0aW9uKGVycm9yKQorICAgIGxvZ2xpbmVzLCBlcnJvciA9IHNlcnZlci5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiQkJJTkNMVURFTE9HU19MSU5FUyJdKQorICAgIGlmIGVycm9yOgorICAgICAgICBsb2dnZXIuZXJyb3IoIlVuYWJsZSB0byBnZXQgdGhlIHZhbHVlIG9mIEJCSU5DTFVERUxPR1NfTElORVMgdmFyaWFibGU6ICVzIiAlIGVycm9yKQorICAgICAgICByYWlzZSBCYXNlRXhjZXB0aW9uKGVycm9yKQorICAgIGNvbnNvbGVsb2dmaWxlLCBlcnJvciA9IHNlcnZlci5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiQkJfQ09OU09MRUxPRyJdKQorICAgIGlmIGVycm9yOgorICAgICAgICBsb2dnZXIuZXJyb3IoIlVuYWJsZSB0byBnZXQgdGhlIHZhbHVlIG9mIEJCX0NPTlNPTEVMT0cgdmFyaWFibGU6ICVzIiAlIGVycm9yKQorICAgICAgICByYWlzZSBCYXNlRXhjZXB0aW9uKGVycm9yKQorICAgIHJldHVybiBpbmNsdWRlbG9ncywgbG9nbGluZXMsIGNvbnNvbGVsb2dmaWxlCisKK19ldnRfbGlzdCA9IFsgImJiLnJ1bnF1ZXVlLnJ1blF1ZXVlRXhpdFdhaXQiLCAiYmIuZXZlbnQuTG9nRXhlY1RUWSIsICJsb2dnaW5nLkxvZ1JlY29yZCIsCisgICAgICAgICAgICAgICJiYi5idWlsZC5UYXNrRmFpbGVkIiwgImJiLmJ1aWxkLlRhc2tCYXNlIiwgImJiLmV2ZW50LlBhcnNlU3RhcnRlZCIsCisgICAgICAgICAgICAgICJiYi5ldmVudC5QYXJzZVByb2dyZXNzIiwgImJiLmV2ZW50LlBhcnNlQ29tcGxldGVkIiwgImJiLmV2ZW50LkNhY2hlTG9hZFN0YXJ0ZWQiLAorICAgICAgICAgICAgICAiYmIuZXZlbnQuQ2FjaGVMb2FkUHJvZ3Jlc3MiLCAiYmIuZXZlbnQuQ2FjaGVMb2FkQ29tcGxldGVkIiwgImJiLmNvbW1hbmQuQ29tbWFuZEZhaWxlZCIsCisgICAgICAgICAgICAgICJiYi5jb21tYW5kLkNvbW1hbmRFeGl0IiwgImJiLmNvbW1hbmQuQ29tbWFuZENvbXBsZXRlZCIsICAiYmIuY29va2VyLkNvb2tlckV4aXQiLAorICAgICAgICAgICAgICAiYmIuZXZlbnQuTXVsdGlwbGVQcm92aWRlcnMiLCAiYmIuZXZlbnQuTm9Qcm92aWRlciIsICJiYi5ydW5xdWV1ZS5zY2VuZVF1ZXVlVGFza1N0YXJ0ZWQiLAorICAgICAgICAgICAgICAiYmIucnVucXVldWUucnVuUXVldWVUYXNrU3RhcnRlZCIsICJiYi5ydW5xdWV1ZS5ydW5RdWV1ZVRhc2tGYWlsZWQiLCAiYmIucnVucXVldWUuc2NlbmVRdWV1ZVRhc2tGYWlsZWQiLAorICAgICAgICAgICAgICAiYmIuZXZlbnQuQnVpbGRCYXNlIiwgImJiLmJ1aWxkLlRhc2tTdGFydGVkIiwgImJiLmJ1aWxkLlRhc2tTdWNjZWVkZWQiLCAiYmIuYnVpbGQuVGFza0ZhaWxlZFNpbGVudCJdCisKK2RlZiBtYWluKHNlcnZlciwgZXZlbnRIYW5kbGVyLCBwYXJhbXMsIHRmID0gVGVybWluYWxGaWx0ZXIpOgorCisgICAgaW5jbHVkZWxvZ3MsIGxvZ2xpbmVzLCBjb25zb2xlbG9nZmlsZSA9IF9sb2dfc2V0dGluZ3NfZnJvbV9zZXJ2ZXIoc2VydmVyKQorCisgICAgaWYgc3lzLnN0ZGluLmlzYXR0eSgpIGFuZCBzeXMuc3Rkb3V0LmlzYXR0eSgpOgorICAgICAgICBsb2dfZXhlY190dHkgPSBUcnVlCisgICAgZWxzZToKKyAgICAgICAgbG9nX2V4ZWNfdHR5ID0gRmFsc2UKKworICAgIGhlbHBlciA9IHVpaGVscGVyLkJCVUlIZWxwZXIoKQorCisgICAgY29uc29sZSA9IGxvZ2dpbmcuU3RyZWFtSGFuZGxlcihzeXMuc3Rkb3V0KQorICAgIGVycmNvbnNvbGUgPSBsb2dnaW5nLlN0cmVhbUhhbmRsZXIoc3lzLnN0ZGVycikKKyAgICBmb3JtYXRfc3RyID0gIiUobGV2ZWxuYW1lKXM6ICUobWVzc2FnZSlzIgorICAgIGZvcm1hdCA9IGJiLm1zZy5CQkxvZ0Zvcm1hdHRlcihmb3JtYXRfc3RyKQorICAgIGJiLm1zZy5hZGREZWZhdWx0bG9nRmlsdGVyKGNvbnNvbGUsIGJiLm1zZy5CQkxvZ0ZpbHRlclN0ZE91dCkKKyAgICBiYi5tc2cuYWRkRGVmYXVsdGxvZ0ZpbHRlcihlcnJjb25zb2xlLCBiYi5tc2cuQkJMb2dGaWx0ZXJTdGRFcnIpCisgICAgY29uc29sZS5zZXRGb3JtYXR0ZXIoZm9ybWF0KQorICAgIGVycmNvbnNvbGUuc2V0Rm9ybWF0dGVyKGZvcm1hdCkKKyAgICBsb2dnZXIuYWRkSGFuZGxlcihjb25zb2xlKQorICAgIGxvZ2dlci5hZGRIYW5kbGVyKGVycmNvbnNvbGUpCisKKyAgICBpZiBwYXJhbXMub3B0aW9ucy5yZW1vdGVfc2VydmVyIGFuZCBwYXJhbXMub3B0aW9ucy5raWxsX3NlcnZlcjoKKyAgICAgICAgc2VydmVyLnRlcm1pbmF0ZVNlcnZlcigpCisgICAgICAgIHJldHVybgorCisgICAgaWYgY29uc29sZWxvZ2ZpbGUgYW5kIG5vdCBwYXJhbXMub3B0aW9ucy5zaG93X2Vudmlyb25tZW50IGFuZCBub3QgcGFyYW1zLm9wdGlvbnMuc2hvd192ZXJzaW9uczoKKyAgICAgICAgYmIudXRpbHMubWtkaXJoaWVyKG9zLnBhdGguZGlybmFtZShjb25zb2xlbG9nZmlsZSkpCisgICAgICAgIGNvbmxvZ2Zvcm1hdCA9IGJiLm1zZy5CQkxvZ0Zvcm1hdHRlcihmb3JtYXRfc3RyKQorICAgICAgICBjb25zb2xlbG9nID0gbG9nZ2luZy5GaWxlSGFuZGxlcihjb25zb2xlbG9nZmlsZSkKKyAgICAgICAgYmIubXNnLmFkZERlZmF1bHRsb2dGaWx0ZXIoY29uc29sZWxvZykKKyAgICAgICAgY29uc29sZWxvZy5zZXRGb3JtYXR0ZXIoY29ubG9nZm9ybWF0KQorICAgICAgICBsb2dnZXIuYWRkSGFuZGxlcihjb25zb2xlbG9nKQorCisgICAgbGxldmVsLCBkZWJ1Z19kb21haW5zID0gYmIubXNnLmNvbnN0cnVjdExvZ09wdGlvbnMoKQorICAgIHNlcnZlci5ydW5Db21tYW5kKFsic2V0RXZlbnRNYXNrIiwgc2VydmVyLmdldEV2ZW50SGFuZGxlKCksIGxsZXZlbCwgZGVidWdfZG9tYWlucywgX2V2dF9saXN0XSkKKworICAgIGlmIG5vdCBwYXJhbXMub2JzZXJ2ZV9vbmx5OgorICAgICAgICBwYXJhbXMudXBkYXRlRnJvbVNlcnZlcihzZXJ2ZXIpCisgICAgICAgIHBhcmFtcy51cGRhdGVUb1NlcnZlcihzZXJ2ZXIsIG9zLmVudmlyb24uY29weSgpKQorICAgICAgICBjbWRsaW5lID0gcGFyYW1zLnBhcnNlQWN0aW9ucygpCisgICAgICAgIGlmIG5vdCBjbWRsaW5lOgorICAgICAgICAgICAgcHJpbnQoIk5vdGhpbmcgdG8gZG8uICBVc2UgJ2JpdGJha2Ugd29ybGQnIHRvIGJ1aWxkIGV2ZXJ5dGhpbmcsIG9yIHJ1biAnYml0YmFrZSAtLWhlbHAnIGZvciB1c2FnZSBpbmZvcm1hdGlvbi4iKQorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgaWYgJ21zZycgaW4gY21kbGluZSBhbmQgY21kbGluZVsnbXNnJ106CisgICAgICAgICAgICBsb2dnZXIuZXJyb3IoY21kbGluZVsnbXNnJ10pCisgICAgICAgICAgICByZXR1cm4gMQorCisgICAgICAgIHJldCwgZXJyb3IgPSBzZXJ2ZXIucnVuQ29tbWFuZChjbWRsaW5lWydhY3Rpb24nXSkKKyAgICAgICAgaWYgZXJyb3I6CisgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIkNvbW1hbmQgJyVzJyBmYWlsZWQ6ICVzIiAlIChjbWRsaW5lLCBlcnJvcikpCisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICBlbGlmIHJldCAhPSBUcnVlOgorICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJDb21tYW5kICclcycgZmFpbGVkOiByZXR1cm5lZCAlcyIgJSAoY21kbGluZSwgcmV0KSkKKyAgICAgICAgICAgIHJldHVybiAxCisKKworICAgIHBhcnNlcHJvZ3Jlc3MgPSBOb25lCisgICAgY2FjaGVwcm9ncmVzcyA9IE5vbmUKKyAgICBtYWluLnNodXRkb3duID0gMAorICAgIGludGVycnVwdGVkID0gRmFsc2UKKyAgICByZXR1cm5fdmFsdWUgPSAwCisgICAgZXJyb3JzID0gMAorICAgIHdhcm5pbmdzID0gMAorICAgIHRhc2tmYWlsdXJlcyA9IFtdCisKKyAgICB0ZXJtZmlsdGVyID0gdGYobWFpbiwgaGVscGVyLCBjb25zb2xlLCBlcnJjb25zb2xlLCBmb3JtYXQpCisgICAgYXRleGl0LnJlZ2lzdGVyKHRlcm1maWx0ZXIuZmluaXNoKQorCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZXZlbnQgPSBldmVudEhhbmRsZXIud2FpdEV2ZW50KDApCisgICAgICAgICAgICBpZiBldmVudCBpcyBOb25lOgorICAgICAgICAgICAgICAgIGlmIG1haW4uc2h1dGRvd24gPiAxOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHRlcm1maWx0ZXIudXBkYXRlRm9vdGVyKCkKKyAgICAgICAgICAgICAgICBldmVudCA9IGV2ZW50SGFuZGxlci53YWl0RXZlbnQoMC4yNSkKKyAgICAgICAgICAgICAgICBpZiBldmVudCBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaGVscGVyLmV2ZW50SGFuZGxlcihldmVudCkKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLnJ1bnF1ZXVlLnJ1blF1ZXVlRXhpdFdhaXQpOgorICAgICAgICAgICAgICAgIGlmIG5vdCBtYWluLnNodXRkb3duOgorICAgICAgICAgICAgICAgICAgICBtYWluLnNodXRkb3duID0gMQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5Mb2dFeGVjVFRZKToKKyAgICAgICAgICAgICAgICBpZiBsb2dfZXhlY190dHk6CisgICAgICAgICAgICAgICAgICAgIHRyaWVzID0gZXZlbnQucmV0cmllcworICAgICAgICAgICAgICAgICAgICB3aGlsZSB0cmllczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KCJUcnlpbmcgdG8gcnVuOiAlcyIgJSBldmVudC5wcm9nKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3Muc3lzdGVtKGV2ZW50LnByb2cpID09IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoZXZlbnQuc2xlZXBfZGVsYXkpCisgICAgICAgICAgICAgICAgICAgICAgICB0cmllcyAtPSAxCisgICAgICAgICAgICAgICAgICAgIGlmIHRyaWVzOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBsb2dnZXIud2FybihldmVudC5tc2cpCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgbG9nZ2luZy5Mb2dSZWNvcmQpOgorICAgICAgICAgICAgICAgIGlmIGV2ZW50LmxldmVsbm8gPj0gZm9ybWF0LkVSUk9SOgorICAgICAgICAgICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMgKyAxCisgICAgICAgICAgICAgICAgICAgIHJldHVybl92YWx1ZSA9IDEKKyAgICAgICAgICAgICAgICBlbGlmIGV2ZW50LmxldmVsbm8gPT0gZm9ybWF0LldBUk5JTkc6CisgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzID0gd2FybmluZ3MgKyAxCisgICAgICAgICAgICAgICAgIyBGb3IgIm5vcm1hbCIgbG9nZ2luZyBjb25kaXRpb25zLCBkb24ndCBzaG93IG5vdGUgbG9ncyBmcm9tIHRhc2tzCisgICAgICAgICAgICAgICAgIyBidXQgZG8gc2hvdyB0aGVtIGlmIHRoZSB1c2VyIGhhcyBjaGFuZ2VkIHRoZSBkZWZhdWx0IGxvZyBsZXZlbCB0bworICAgICAgICAgICAgICAgICMgaW5jbHVkZSB2ZXJib3NlL2RlYnVnIG1lc3NhZ2VzCisgICAgICAgICAgICAgICAgaWYgZXZlbnQudGFza3BpZCAhPSAwIGFuZCBldmVudC5sZXZlbG5vIDw9IGZvcm1hdC5OT1RFIGFuZCAoZXZlbnQubGV2ZWxubyA8IGxsZXZlbCBvciAoZXZlbnQubGV2ZWxubyA9PSBmb3JtYXQuTk9URSBhbmQgbGxldmVsICE9IGZvcm1hdC5WRVJCT1NFKSk6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgbG9nZ2VyLmhhbmRsZShldmVudCkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5idWlsZC5UYXNrRmFpbGVkU2lsZW50KToKKyAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiTG9nZmlsZSBmb3IgZmFpbGVkIHNldHNjZW5lIHRhc2sgaXMgJXMiICUgZXZlbnQubG9nZmlsZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuYnVpbGQuVGFza0ZhaWxlZCk6CisgICAgICAgICAgICAgICAgcmV0dXJuX3ZhbHVlID0gMQorICAgICAgICAgICAgICAgIGxvZ2ZpbGUgPSBldmVudC5sb2dmaWxlCisgICAgICAgICAgICAgICAgaWYgbG9nZmlsZSBhbmQgb3MucGF0aC5leGlzdHMobG9nZmlsZSk6CisgICAgICAgICAgICAgICAgICAgIHRlcm1maWx0ZXIuY2xlYXJGb290ZXIoKQorICAgICAgICAgICAgICAgICAgICBiYi5lcnJvcigiTG9nZmlsZSBvZiBmYWlsdXJlIHN0b3JlZCBpbjogJXMiICUgbG9nZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgaW5jbHVkZWxvZ3MgYW5kIG5vdCBldmVudC5lcnJwcmludGVkOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQoIkxvZyBkYXRhIGZvbGxvd3M6IikKKyAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBvcGVuKGxvZ2ZpbGUsICJyIikKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzID0gW10KKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCA9IGYucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGwgPT0gJyc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCA9IGwucnN0cmlwKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBsb2dsaW5lczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKCcgfCAlcycgJSBsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBsZW4obGluZXMpID4gaW50KGxvZ2xpbmVzKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzLnBvcCgwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KCd8ICVzJyAlIGwpCisgICAgICAgICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxpbmVzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIGxpbmVzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludChsaW5lKQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuYnVpbGQuVGFza0Jhc2UpOgorICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGV2ZW50Ll9tZXNzYWdlKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5QYXJzZVN0YXJ0ZWQpOgorICAgICAgICAgICAgICAgIGlmIGV2ZW50LnRvdGFsID09IDA6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgcGFyc2Vwcm9ncmVzcyA9IG5ld19wcm9ncmVzcygiUGFyc2luZyByZWNpcGVzIiwgZXZlbnQudG90YWwpLnN0YXJ0KCkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuUGFyc2VQcm9ncmVzcyk6CisgICAgICAgICAgICAgICAgcGFyc2Vwcm9ncmVzcy51cGRhdGUoZXZlbnQuY3VycmVudCkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuUGFyc2VDb21wbGV0ZWQpOgorICAgICAgICAgICAgICAgIGlmIG5vdCBwYXJzZXByb2dyZXNzOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgcGFyc2Vwcm9ncmVzcy5maW5pc2goKQorICAgICAgICAgICAgICAgIHByaW50KCgiUGFyc2luZyBvZiAlZCAuYmIgZmlsZXMgY29tcGxldGUgKCVkIGNhY2hlZCwgJWQgcGFyc2VkKS4gJWQgdGFyZ2V0cywgJWQgc2tpcHBlZCwgJWQgbWFza2VkLCAlZCBlcnJvcnMuIgorICAgICAgICAgICAgICAgICAgICAlICggZXZlbnQudG90YWwsIGV2ZW50LmNhY2hlZCwgZXZlbnQucGFyc2VkLCBldmVudC52aXJ0dWFscywgZXZlbnQuc2tpcHBlZCwgZXZlbnQubWFza2VkLCBldmVudC5lcnJvcnMpKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5DYWNoZUxvYWRTdGFydGVkKToKKyAgICAgICAgICAgICAgICBjYWNoZXByb2dyZXNzID0gbmV3X3Byb2dyZXNzKCJMb2FkaW5nIGNhY2hlIiwgZXZlbnQudG90YWwpLnN0YXJ0KCkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuQ2FjaGVMb2FkUHJvZ3Jlc3MpOgorICAgICAgICAgICAgICAgIGNhY2hlcHJvZ3Jlc3MudXBkYXRlKGV2ZW50LmN1cnJlbnQpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LkNhY2hlTG9hZENvbXBsZXRlZCk6CisgICAgICAgICAgICAgICAgY2FjaGVwcm9ncmVzcy5maW5pc2goKQorICAgICAgICAgICAgICAgIHByaW50KCJMb2FkZWQgJWQgZW50cmllcyBmcm9tIGRlcGVuZGVuY3kgY2FjaGUuIiAlIGV2ZW50Lm51bV9lbnRyaWVzKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmNvbW1hbmQuQ29tbWFuZEZhaWxlZCk6CisgICAgICAgICAgICAgICAgcmV0dXJuX3ZhbHVlID0gZXZlbnQuZXhpdGNvZGUKKyAgICAgICAgICAgICAgICBpZiBldmVudC5lcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzICsgMQorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIkNvbW1hbmQgZXhlY3V0aW9uIGZhaWxlZDogJXMiLCBldmVudC5lcnJvcikKKyAgICAgICAgICAgICAgICBtYWluLnNodXRkb3duID0gMgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5jb21tYW5kLkNvbW1hbmRFeGl0KToKKyAgICAgICAgICAgICAgICBpZiBub3QgcmV0dXJuX3ZhbHVlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm5fdmFsdWUgPSBldmVudC5leGl0Y29kZQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCAoYmIuY29tbWFuZC5Db21tYW5kQ29tcGxldGVkLCBiYi5jb29rZXIuQ29va2VyRXhpdCkpOgorICAgICAgICAgICAgICAgIG1haW4uc2h1dGRvd24gPSAyCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50Lk11bHRpcGxlUHJvdmlkZXJzKToKKyAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygibXVsdGlwbGUgcHJvdmlkZXJzIGFyZSBhdmFpbGFibGUgZm9yICVzJXMgKCVzKSIsIGV2ZW50Ll9pc19ydW50aW1lIGFuZCAicnVudGltZSAiIG9yICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50Ll9pdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsICIuam9pbihldmVudC5fY2FuZGlkYXRlcykpCisgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oImNvbnNpZGVyIGRlZmluaW5nIGEgUFJFRkVSUkVEX1BST1ZJREVSIGVudHJ5IHRvIG1hdGNoICVzIiwgZXZlbnQuX2l0ZW0pCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50Lk5vUHJvdmlkZXIpOgorICAgICAgICAgICAgICAgIHJldHVybl92YWx1ZSA9IDEKKyAgICAgICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMgKyAxCisgICAgICAgICAgICAgICAgaWYgZXZlbnQuX3J1bnRpbWU6CisgICAgICAgICAgICAgICAgICAgIHIgPSAiUiIKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByID0gIiIKKworICAgICAgICAgICAgICAgIGV4dHJhID0gJycKKyAgICAgICAgICAgICAgICBpZiBub3QgZXZlbnQuX3JlYXNvbnM6CisgICAgICAgICAgICAgICAgICAgIGlmIGV2ZW50Ll9jbG9zZV9tYXRjaGVzOgorICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmEgPSAiLiBDbG9zZSBtYXRjaGVzOlxuICAlcyIgJSAnXG4gICcuam9pbihldmVudC5fY2xvc2VfbWF0Y2hlcykKKworICAgICAgICAgICAgICAgIGlmIGV2ZW50Ll9kZXBlbmRlZXM6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiTm90aGluZyAlc1BST1ZJREVTICclcycgKGJ1dCAlcyAlc0RFUEVORFMgb24gb3Igb3RoZXJ3aXNlIHJlcXVpcmVzIGl0KSVzIiwgciwgZXZlbnQuX2l0ZW0sICIsICIuam9pbihldmVudC5fZGVwZW5kZWVzKSwgciwgZXh0cmEpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJOb3RoaW5nICVzUFJPVklERVMgJyVzJyVzIiwgciwgZXZlbnQuX2l0ZW0sIGV4dHJhKQorICAgICAgICAgICAgICAgIGlmIGV2ZW50Ll9yZWFzb25zOgorICAgICAgICAgICAgICAgICAgICBmb3IgcmVhc29uIGluIGV2ZW50Ll9yZWFzb25zOgorICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCIlcyIsIHJlYXNvbikKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ydW5xdWV1ZS5zY2VuZVF1ZXVlVGFza1N0YXJ0ZWQpOgorICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJSdW5uaW5nIHNldHNjZW5lIHRhc2sgJWQgb2YgJWQgKCVzKSIgJSAoZXZlbnQuc3RhdHMuY29tcGxldGVkICsgZXZlbnQuc3RhdHMuYWN0aXZlICsgZXZlbnQuc3RhdHMuZmFpbGVkICsgMSwgZXZlbnQuc3RhdHMudG90YWwsIGV2ZW50LnRhc2tzdHJpbmcpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLnJ1bnF1ZXVlLnJ1blF1ZXVlVGFza1N0YXJ0ZWQpOgorICAgICAgICAgICAgICAgIGlmIGV2ZW50Lm5vZXhlYzoKKyAgICAgICAgICAgICAgICAgICAgdGFza3R5cGUgPSAnbm9leGVjIHRhc2snCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdGFza3R5cGUgPSAndGFzaycKKyAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiUnVubmluZyAlcyAlcyBvZiAlcyAoSUQ6ICVzLCAlcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2t0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0YXRzLmNvbXBsZXRlZCArIGV2ZW50LnN0YXRzLmFjdGl2ZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0YXRzLmZhaWxlZCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RhdHMudG90YWwsIGV2ZW50LnRhc2tpZCwgZXZlbnQudGFza3N0cmluZykKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ydW5xdWV1ZS5ydW5RdWV1ZVRhc2tGYWlsZWQpOgorICAgICAgICAgICAgICAgIHRhc2tmYWlsdXJlcy5hcHBlbmQoZXZlbnQudGFza3N0cmluZykKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIlRhc2sgJXMgKCVzKSBmYWlsZWQgd2l0aCBleGl0IGNvZGUgJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnRhc2tpZCwgZXZlbnQudGFza3N0cmluZywgZXZlbnQuZXhpdGNvZGUpCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIucnVucXVldWUuc2NlbmVRdWV1ZVRhc2tGYWlsZWQpOgorICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJTZXRzY2VuZSB0YXNrICVzICglcykgZmFpbGVkIHdpdGggZXhpdCBjb2RlICclcycgLSByZWFsIHRhc2sgd2lsbCBiZSBydW4gaW5zdGVhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnRhc2tpZCwgZXZlbnQudGFza3N0cmluZywgZXZlbnQuZXhpdGNvZGUpCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuRGVwVHJlZUdlbmVyYXRlZCk6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgIyBpZ25vcmUKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIChiYi5ldmVudC5CdWlsZEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmIuZXZlbnQuTWV0YWRhdGFFdmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYi5ldmVudC5TdGFtcFVwZGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYi5ldmVudC5Db25maWdQYXJzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmIuZXZlbnQuUmVjaXBlUGFyc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiLmV2ZW50LlJlY2lwZVByZUZpbmFsaXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiLnJ1bnF1ZXVlLnJ1blF1ZXVlRXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmIuZXZlbnQuT3BlcmF0aW9uU3RhcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYi5ldmVudC5PcGVyYXRpb25Db21wbGV0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmIuZXZlbnQuT3BlcmF0aW9uUHJvZ3Jlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmIuZXZlbnQuRGlza0Z1bGwpKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIlVua25vd24gZXZlbnQ6ICVzIiwgZXZlbnQpCisKKyAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3IgYXMgaW9lcnJvcjoKKyAgICAgICAgICAgIHRlcm1maWx0ZXIuY2xlYXJGb290ZXIoKQorICAgICAgICAgICAgIyBpZ25vcmUgaW50ZXJydXB0ZWQgaW8KKyAgICAgICAgICAgIGlmIGlvZXJyb3IuYXJnc1swXSA9PSA0OgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKHN0cihpb2Vycm9yKSkKKyAgICAgICAgICAgIGlmIG5vdCBwYXJhbXMub2JzZXJ2ZV9vbmx5OgorICAgICAgICAgICAgICAgIF8sIGVycm9yID0gc2VydmVyLnJ1bkNvbW1hbmQoWyJzdGF0ZUZvcmNlU2h1dGRvd24iXSkKKyAgICAgICAgICAgIG1haW4uc2h1dGRvd24gPSAyCisgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgIHRlcm1maWx0ZXIuY2xlYXJGb290ZXIoKQorICAgICAgICAgICAgaWYgcGFyYW1zLm9ic2VydmVfb25seToKKyAgICAgICAgICAgICAgICBwcmludCgiXG5LZXlib2FyZCBJbnRlcnJ1cHQsIGV4aXRpbmcgb2JzZXJ2ZXIuLi4iKQorICAgICAgICAgICAgICAgIG1haW4uc2h1dGRvd24gPSAyCisgICAgICAgICAgICBpZiBub3QgcGFyYW1zLm9ic2VydmVfb25seSBhbmQgbWFpbi5zaHV0ZG93biA9PSAxOgorICAgICAgICAgICAgICAgIHByaW50KCJcblNlY29uZCBLZXlib2FyZCBJbnRlcnJ1cHQsIHN0b3BwaW5nLi4uXG4iKQorICAgICAgICAgICAgICAgIF8sIGVycm9yID0gc2VydmVyLnJ1bkNvbW1hbmQoWyJzdGF0ZUZvcmNlU2h1dGRvd24iXSkKKyAgICAgICAgICAgICAgICBpZiBlcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJVbmFibGUgdG8gY2xlYW5seSBzdG9wOiAlcyIgJSBlcnJvcikKKyAgICAgICAgICAgIGlmIG5vdCBwYXJhbXMub2JzZXJ2ZV9vbmx5IGFuZCBtYWluLnNodXRkb3duID09IDA6CisgICAgICAgICAgICAgICAgcHJpbnQoIlxuS2V5Ym9hcmQgSW50ZXJydXB0LCBjbG9zaW5nIGRvd24uLi5cbiIpCisgICAgICAgICAgICAgICAgaW50ZXJydXB0ZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgXywgZXJyb3IgPSBzZXJ2ZXIucnVuQ29tbWFuZChbInN0YXRlU2h1dGRvd24iXSkKKyAgICAgICAgICAgICAgICBpZiBlcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJVbmFibGUgdG8gY2xlYW5seSBzaHV0ZG93bjogJXMiICUgZXJyb3IpCisgICAgICAgICAgICBtYWluLnNodXRkb3duID0gbWFpbi5zaHV0ZG93biArIDEKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZShzdHIoZSkpCisgICAgICAgICAgICBpZiBub3QgcGFyYW1zLm9ic2VydmVfb25seToKKyAgICAgICAgICAgICAgICBfLCBlcnJvciA9IHNlcnZlci5ydW5Db21tYW5kKFsic3RhdGVGb3JjZVNodXRkb3duIl0pCisgICAgICAgICAgICBtYWluLnNodXRkb3duID0gMgorICAgIHRyeToKKyAgICAgICAgc3VtbWFyeSA9ICIiCisgICAgICAgIGlmIHRhc2tmYWlsdXJlczoKKyAgICAgICAgICAgIHN1bW1hcnkgKz0gcGx1cmFsaXNlKCJcblN1bW1hcnk6ICVzIHRhc2sgZmFpbGVkOiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG5TdW1tYXJ5OiAlcyB0YXNrcyBmYWlsZWQ6IiwgbGVuKHRhc2tmYWlsdXJlcykpCisgICAgICAgICAgICBmb3IgZmFpbHVyZSBpbiB0YXNrZmFpbHVyZXM6CisgICAgICAgICAgICAgICAgc3VtbWFyeSArPSAiXG4gICVzIiAlIGZhaWx1cmUKKyAgICAgICAgaWYgd2FybmluZ3M6CisgICAgICAgICAgICBzdW1tYXJ5ICs9IHBsdXJhbGlzZSgiXG5TdW1tYXJ5OiBUaGVyZSB3YXMgJXMgV0FSTklORyBtZXNzYWdlIHNob3duLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG5TdW1tYXJ5OiBUaGVyZSB3ZXJlICVzIFdBUk5JTkcgbWVzc2FnZXMgc2hvd24uIiwgd2FybmluZ3MpCisgICAgICAgIGlmIHJldHVybl92YWx1ZSBhbmQgZXJyb3JzOgorICAgICAgICAgICAgc3VtbWFyeSArPSBwbHVyYWxpc2UoIlxuU3VtbWFyeTogVGhlcmUgd2FzICVzIEVSUk9SIG1lc3NhZ2Ugc2hvd24sIHJldHVybmluZyBhIG5vbi16ZXJvIGV4aXQgY29kZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuU3VtbWFyeTogVGhlcmUgd2VyZSAlcyBFUlJPUiBtZXNzYWdlcyBzaG93biwgcmV0dXJuaW5nIGEgbm9uLXplcm8gZXhpdCBjb2RlLiIsIGVycm9ycykKKyAgICAgICAgaWYgc3VtbWFyeToKKyAgICAgICAgICAgIHByaW50KHN1bW1hcnkpCisKKyAgICAgICAgaWYgaW50ZXJydXB0ZWQ6CisgICAgICAgICAgICBwcmludCgiRXhlY3V0aW9uIHdhcyBpbnRlcnJ1cHRlZCwgcmV0dXJuaW5nIGEgbm9uLXplcm8gZXhpdCBjb2RlLiIpCisgICAgICAgICAgICBpZiByZXR1cm5fdmFsdWUgPT0gMDoKKyAgICAgICAgICAgICAgICByZXR1cm5fdmFsdWUgPSAxCisgICAgZXhjZXB0IElPRXJyb3IgYXMgZToKKyAgICAgICAgaW1wb3J0IGVycm5vCisgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRVBJUEU6CisgICAgICAgICAgICBwYXNzCisKKyAgICByZXR1cm4gcmV0dXJuX3ZhbHVlCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi91aS9uY3Vyc2VzLnB5IGIvYml0YmFrZS9saWIvYmIvdWkvbmN1cnNlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTg5YTc3Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvbmN1cnNlcy5weQpAQCAtMCwwICsxLDM3MyBAQAorIworIyBCaXRCYWtlIEN1cnNlcyBVSSBJbXBsZW1lbnRhdGlvbgorIworIyBJbXBsZW1lbnRzIGFuIG5jdXJzZXMgZnJvbnRlbmQgZm9yIHRoZSBCaXRCYWtlIHV0aWxpdHkuCisjCisjIENvcHlyaWdodCAoQykgMjAwNiBNaWNoYWVsICdNaWNrZXknIExhdWVyCisjIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IFJpY2hhcmQgUHVyZGllCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCisiIiIKKyAgICBXZSBoYXZlIHRoZSBmb2xsb3dpbmcgd2luZG93czoKKworICAgICAgICAxLikgTWFpbiBXaW5kb3c6IFNob3dzIHdoYXQgd2UgYXJlIHVsdGltYXRlbHkgYnVpbGRpbmcgYW5kIGhvdyBmYXIgd2UgYXJlLiBJbmNsdWRlcyBzdGF0dXMgYmFyCisgICAgICAgIDIuKSBUaHJlYWQgQWN0aXZpdHkgV2luZG93OiBTaG93cyBvbmUgc3RhdHVzIGxpbmUgZm9yIGV2ZXJ5IGNvbmN1cnJlbnQgYml0YmFrZSB0aHJlYWQuCisgICAgICAgIDMuKSBDb21tYW5kIExpbmUgV2luZG93OiBDb250YWlucyBhbiBpbnRlcmFjdGl2ZSBjb21tYW5kIGxpbmUgd2hlcmUgeW91IGNhbiBpbnRlcmFjdCB3LyBCaXRiYWtlLgorCisgICAgQmFzaWMgd2luZG93IGxheW91dCBpcyBsaWtlIHRoYXQ6CisKKyAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgICAgfCA8TWFpbiBXaW5kb3c+ICAgICAgICAgICAgICAgfCA8VGhyZWFkIEFjdGl2aXR5IFdpbmRvdz4gIHwKKyAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAwOiBmb28gZG9fY29tcGlsZSBjb21wbGV0ZXwKKyAgICAgICAgfCBCdWlsZGluZyBHdGsrLTIuNi4xMCAgICAgICAgfCAxOiBiYXIgZG9fcGF0Y2ggY29tcGxldGUgIHwKKyAgICAgICAgfCBTdGF0dXM6IDYwJSAgICAgICAgICAgICAgICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgICAgfDxDb21tYW5kIExpbmUgV2luZG93PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgfD4+PiB3aGljaCB2aXJ0dWFsL2tlcm5lbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgfG9wZW56YXVydXMta2VybmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgfD4+PiBfICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKworIiIiCisKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbgoraW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBvcywgc3lzLCBpdGVydG9vbHMsIHRpbWUsIHN1YnByb2Nlc3MKKwordHJ5OgorICAgIGltcG9ydCBjdXJzZXMKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBzeXMuZXhpdCgiRkFUQUw6IFRoZSBuY3Vyc2VzIHVpIGNvdWxkIG5vdCBsb2FkIHRoZSByZXF1aXJlZCBjdXJzZXMgcHl0aG9uIG1vZHVsZS4iKQorCitpbXBvcnQgYmIKK2ltcG9ydCB4bWxycGNsaWIKK2Zyb20gYmIgaW1wb3J0IHVpCitmcm9tIGJiLnVpIGltcG9ydCB1aWhlbHBlcgorCitwYXJzZXNwaW4gPSBpdGVydG9vbHMuY3ljbGUoIHInfC8tXFwnICkKKworWCA9IDAKK1kgPSAxCitXSURUSCA9IDIKK0hFSUdIVCA9IDMKKworTUFYU1RBVFVTTEVOR1RIID0gMzIKKworY2xhc3MgTkN1cnNlc1VJOgorICAgICIiIgorICAgIE5DdXJzZXMgVUkgQ2xhc3MKKyAgICAiIiIKKyAgICBjbGFzcyBXaW5kb3c6CisgICAgICAgICIiIkJhc2UgV2luZG93IENsYXNzIiIiCisgICAgICAgIGRlZiBfX2luaXRfXyggc2VsZiwgeCwgeSwgd2lkdGgsIGhlaWdodCwgZmc9Y3Vyc2VzLkNPTE9SX0JMQUNLLCBiZz1jdXJzZXMuQ09MT1JfV0hJVEUgKToKKyAgICAgICAgICAgIHNlbGYud2luID0gY3Vyc2VzLm5ld3dpbiggaGVpZ2h0LCB3aWR0aCwgeSwgeCApCisgICAgICAgICAgICBzZWxmLmRpbWVuc2lvbnMgPSAoIHgsIHksIHdpZHRoLCBoZWlnaHQgKQorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBpZiBjdXJzZXMuaGFzX2NvbG9ycygpOgorICAgICAgICAgICAgICAgIGNvbG9yID0gMQorICAgICAgICAgICAgICAgIGN1cnNlcy5pbml0X3BhaXIoIGNvbG9yLCBmZywgYmcgKQorICAgICAgICAgICAgICAgIHNlbGYud2luLmJrZ2RzZXQoIG9yZCgnICcpLCBjdXJzZXMuY29sb3JfcGFpcihjb2xvcikgKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLndpbi5ia2dkc2V0KCBvcmQoJyAnKSwgY3Vyc2VzLkFfQk9MRCApCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHNlbGYuZXJhc2UoKQorICAgICAgICAgICAgc2VsZi5zZXRTY3JvbGxpbmcoKQorICAgICAgICAgICAgc2VsZi53aW4ubm91dHJlZnJlc2goKQorCisgICAgICAgIGRlZiBlcmFzZSggc2VsZiApOgorICAgICAgICAgICAgc2VsZi53aW4uZXJhc2UoKQorCisgICAgICAgIGRlZiBzZXRTY3JvbGxpbmcoIHNlbGYsIGIgPSBUcnVlICk6CisgICAgICAgICAgICBzZWxmLndpbi5zY3JvbGxvayggYiApCisgICAgICAgICAgICBzZWxmLndpbi5pZGxvayggYiApCisKKyAgICAgICAgZGVmIHNldEJveGVkKCBzZWxmICk6CisgICAgICAgICAgICBzZWxmLmJveGVkID0gVHJ1ZQorICAgICAgICAgICAgc2VsZi53aW4uYm94KCkKKyAgICAgICAgICAgIHNlbGYud2luLm5vdXRyZWZyZXNoKCkKKworICAgICAgICBkZWYgc2V0VGV4dCggc2VsZiwgeCwgeSwgdGV4dCwgKmFyZ3MgKToKKyAgICAgICAgICAgIHNlbGYud2luLmFkZHN0ciggeSwgeCwgdGV4dCwgKmFyZ3MgKQorICAgICAgICAgICAgc2VsZi53aW4ubm91dHJlZnJlc2goKQorCisgICAgICAgIGRlZiBhcHBlbmRUZXh0KCBzZWxmLCB0ZXh0LCAqYXJncyApOgorICAgICAgICAgICAgc2VsZi53aW4uYWRkc3RyKCB0ZXh0LCAqYXJncyApCisgICAgICAgICAgICBzZWxmLndpbi5ub3V0cmVmcmVzaCgpCisKKyAgICAgICAgZGVmIGRyYXdIbGluZSggc2VsZiwgeSApOgorICAgICAgICAgICAgc2VsZi53aW4uaGxpbmUoIHksIDAsIGN1cnNlcy5BQ1NfSExJTkUsIHNlbGYuZGltZW5zaW9uc1tXSURUSF0gKQorICAgICAgICAgICAgc2VsZi53aW4ubm91dHJlZnJlc2goKQorCisgICAgY2xhc3MgRGVjb3JhdGVkV2luZG93KCBXaW5kb3cgKToKKyAgICAgICAgIiIiQmFzZSBjbGFzcyBmb3Igd2luZG93cyB3aXRoIGEgYm94IGFuZCBhIHRpdGxlIGJhciIiIgorICAgICAgICBkZWYgX19pbml0X18oIHNlbGYsIHRpdGxlLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmZz1jdXJzZXMuQ09MT1JfQkxBQ0ssIGJnPWN1cnNlcy5DT0xPUl9XSElURSApOgorICAgICAgICAgICAgTkN1cnNlc1VJLldpbmRvdy5fX2luaXRfXyggc2VsZiwgeCsxLCB5KzMsIHdpZHRoLTIsIGhlaWdodC00LCBmZywgYmcgKQorICAgICAgICAgICAgc2VsZi5kZWNvcmF0aW9uID0gTkN1cnNlc1VJLldpbmRvdyggeCwgeSwgd2lkdGgsIGhlaWdodCwgZmcsIGJnICkKKyAgICAgICAgICAgIHNlbGYuZGVjb3JhdGlvbi5zZXRCb3hlZCgpCisgICAgICAgICAgICBzZWxmLmRlY29yYXRpb24ud2luLmhsaW5lKCAyLCAxLCBjdXJzZXMuQUNTX0hMSU5FLCB3aWR0aC0yICkKKyAgICAgICAgICAgIHNlbGYuc2V0VGl0bGUoIHRpdGxlICkKKworICAgICAgICBkZWYgc2V0VGl0bGUoIHNlbGYsIHRpdGxlICk6CisgICAgICAgICAgICBzZWxmLmRlY29yYXRpb24uc2V0VGV4dCggMSwgMSwgdGl0bGUuY2VudGVyKCBzZWxmLmRpbWVuc2lvbnNbV0lEVEhdLTIgKSwgY3Vyc2VzLkFfQk9MRCApCisKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKKyMgICAgY2xhc3MgVGl0bGVXaW5kb3coIFdpbmRvdyApOgorICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIworIyAgICAgICAgIiIiVGl0bGUgV2luZG93IiIiCisjICAgICAgICBkZWYgX19pbml0X18oIHNlbGYsIHgsIHksIHdpZHRoLCBoZWlnaHQgKToKKyMgICAgICAgICAgICBOQ3Vyc2VzVUkuV2luZG93Ll9faW5pdF9fKCBzZWxmLCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICkKKyMgICAgICAgICAgICB2ZXJzaW9uID0gYmIuX192ZXJzaW9uX18KKyMgICAgICAgICAgICB0aXRsZSA9ICJCaXRCYWtlICVzIiAlIHZlcnNpb24KKyMgICAgICAgICAgICBjcmVkaXQgPSAiKEMpIDIwMDMtMjAwNyBUZWFtIEJpdEJha2UiCisjICAgICAgICAgICAgI3NlbGYud2luLmhsaW5lKCAyLCAxLCBjdXJzZXMuQUNTX0hMSU5FLCB3aWR0aC0yICkKKyMgICAgICAgICAgICBzZWxmLndpbi5ib3JkZXIoKQorIyAgICAgICAgICAgIHNlbGYuc2V0VGV4dCggMSwgMSwgdGl0bGUuY2VudGVyKCBzZWxmLmRpbWVuc2lvbnNbV0lEVEhdLTIgKSwgY3Vyc2VzLkFfQk9MRCApCisjICAgICAgICAgICAgc2VsZi5zZXRUZXh0KCAxLCAyLCBjcmVkaXQuY2VudGVyKCBzZWxmLmRpbWVuc2lvbnNbV0lEVEhdLTIgKSwgY3Vyc2VzLkFfQk9MRCApCisKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKKyAgICBjbGFzcyBUaHJlYWRBY3Rpdml0eVdpbmRvdyggRGVjb3JhdGVkV2luZG93ICk6CisgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCisgICAgICAgICIiIlRocmVhZCBBY3Rpdml0eSBXaW5kb3ciIiIKKyAgICAgICAgZGVmIF9faW5pdF9fKCBzZWxmLCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICk6CisgICAgICAgICAgICBOQ3Vyc2VzVUkuRGVjb3JhdGVkV2luZG93Ll9faW5pdF9fKCBzZWxmLCAiVGhyZWFkIEFjdGl2aXR5IiwgeCwgeSwgd2lkdGgsIGhlaWdodCApCisKKyAgICAgICAgZGVmIHNldFN0YXR1cyggc2VsZiwgdGhyZWFkLCB0ZXh0ICk6CisgICAgICAgICAgICBsaW5lID0gIiUwMmQ6ICVzIiAlICggdGhyZWFkLCB0ZXh0ICkKKyAgICAgICAgICAgIHdpZHRoID0gc2VsZi5kaW1lbnNpb25zW1dJRFRIXQorICAgICAgICAgICAgaWYgKCBsZW4obGluZSkgPiB3aWR0aCApOgorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lWzp3aWR0aC0zXSArICIuLi4iCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLmxqdXN0KCB3aWR0aCApCisgICAgICAgICAgICBzZWxmLnNldFRleHQoIDAsIHRocmVhZCwgbGluZSApCisKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKKyAgICBjbGFzcyBNYWluV2luZG93KCBEZWNvcmF0ZWRXaW5kb3cgKToKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKKyAgICAgICAgIiIiTWFpbiBXaW5kb3ciIiIKKyAgICAgICAgZGVmIF9faW5pdF9fKCBzZWxmLCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICk6CisgICAgICAgICAgICBzZWxmLlN0YXR1c1Bvc2l0aW9uID0gd2lkdGggLSBNQVhTVEFUVVNMRU5HVEgKKyAgICAgICAgICAgIE5DdXJzZXNVSS5EZWNvcmF0ZWRXaW5kb3cuX19pbml0X18oIHNlbGYsIE5vbmUsIHgsIHksIHdpZHRoLCBoZWlnaHQgKQorICAgICAgICAgICAgY3Vyc2VzLm5sKCkKKworICAgICAgICBkZWYgc2V0VGl0bGUoIHNlbGYsIHRpdGxlICk6CisgICAgICAgICAgICB0aXRsZSA9ICJCaXRCYWtlICVzIiAlIGJiLl9fdmVyc2lvbl9fCisgICAgICAgICAgICBzZWxmLmRlY29yYXRpb24uc2V0VGV4dCggMiwgMSwgdGl0bGUsIGN1cnNlcy5BX0JPTEQgKQorICAgICAgICAgICAgc2VsZi5kZWNvcmF0aW9uLnNldFRleHQoIHNlbGYuU3RhdHVzUG9zaXRpb24gLSA4LCAxLCAiU3RhdHVzOiIsIGN1cnNlcy5BX0JPTEQgKQorCisgICAgICAgIGRlZiBzZXRTdGF0dXMoc2VsZiwgc3RhdHVzKToKKyAgICAgICAgICAgIHdoaWxlIGxlbihzdGF0dXMpIDwgTUFYU1RBVFVTTEVOR1RIOgorICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXR1cyArICIgIgorICAgICAgICAgICAgc2VsZi5kZWNvcmF0aW9uLnNldFRleHQoIHNlbGYuU3RhdHVzUG9zaXRpb24sIDEsIHN0YXR1cywgY3Vyc2VzLkFfQk9MRCApCisKKworICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIworICAgIGNsYXNzIFNoZWxsT3V0cHV0V2luZG93KCBEZWNvcmF0ZWRXaW5kb3cgKToKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKKyAgICAgICAgIiIiSW50ZXJhY3RpdmUgQ29tbWFuZCBMaW5lIE91dHB1dCIiIgorICAgICAgICBkZWYgX19pbml0X18oIHNlbGYsIHgsIHksIHdpZHRoLCBoZWlnaHQgKToKKyAgICAgICAgICAgIE5DdXJzZXNVSS5EZWNvcmF0ZWRXaW5kb3cuX19pbml0X18oIHNlbGYsICJDb21tYW5kIExpbmUgV2luZG93IiwgeCwgeSwgd2lkdGgsIGhlaWdodCApCisKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKKyAgICBjbGFzcyBTaGVsbElucHV0V2luZG93KCBXaW5kb3cgKToKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKKyAgICAgICAgIiIiSW50ZXJhY3RpdmUgQ29tbWFuZCBMaW5lIElucHV0IiIiCisgICAgICAgIGRlZiBfX2luaXRfXyggc2VsZiwgeCwgeSwgd2lkdGgsIGhlaWdodCApOgorICAgICAgICAgICAgTkN1cnNlc1VJLldpbmRvdy5fX2luaXRfXyggc2VsZiwgeCwgeSwgd2lkdGgsIGhlaWdodCApCisKKyMgcHV0IHRoYXQgdG8gdGhlIHRvcCBhZ2FpbiBmcm9tIGN1cnNlcy50ZXh0cGFkIGltcG9ydCBUZXh0Ym94CisjICAgICAgICAgICAgc2VsZi50ZXh0Ym94ID0gVGV4dGJveCggc2VsZi53aW4gKQorIyAgICAgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKCkKKyMgICAgICAgICAgICB0LnJ1biA9IHNlbGYudGV4dGJveC5lZGl0CisjICAgICAgICAgICAgdC5zdGFydCgpCisKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKKyAgICBkZWYgbWFpbihzZWxmLCBzdGRzY3IsIHNlcnZlciwgZXZlbnRIYW5kbGVyLCBwYXJhbXMpOgorICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIworICAgICAgICBoZWlnaHQsIHdpZHRoID0gc3Rkc2NyLmdldG1heHl4KCkKKworICAgICAgICAjIGZvciBub3cgc3BsaXQgaXQgbGlrZSB0aGF0OgorICAgICAgICAjIE1BSU5feSArIFRIUkVBRF95ID0gMi8zIHNjcmVlbiBhdCB0aGUgdG9wCisgICAgICAgICMgTUFJTl94ID0gMi8zIGxlZnQsIFRIUkVBRF95ID0gMS8zIHJpZ2h0CisgICAgICAgICMgQ0xJX3kgPSAxLzMgb2Ygc2NyZWVuIGF0IHRoZSBib3R0b20KKyAgICAgICAgIyBDTElfeCA9IGZ1bGwKKworICAgICAgICBtYWluX2xlZnQgPSAwCisgICAgICAgIG1haW5fdG9wID0gMAorICAgICAgICBtYWluX2hlaWdodCA9ICggaGVpZ2h0IC8vIDMgKiAyICkKKyAgICAgICAgbWFpbl93aWR0aCA9ICggd2lkdGggLy8gMyApICogMgorICAgICAgICBjbG9fbGVmdCA9IG1haW5fbGVmdAorICAgICAgICBjbG9fdG9wID0gbWFpbl90b3AgKyBtYWluX2hlaWdodAorICAgICAgICBjbG9faGVpZ2h0ID0gaGVpZ2h0IC0gbWFpbl9oZWlnaHQgLSBtYWluX3RvcCAtIDEKKyAgICAgICAgY2xvX3dpZHRoID0gd2lkdGgKKyAgICAgICAgY2xpX2xlZnQgPSBtYWluX2xlZnQKKyAgICAgICAgY2xpX3RvcCA9IGNsb190b3AgKyBjbG9faGVpZ2h0CisgICAgICAgIGNsaV9oZWlnaHQgPSAxCisgICAgICAgIGNsaV93aWR0aCA9IHdpZHRoCisgICAgICAgIHRocmVhZF9sZWZ0ID0gbWFpbl9sZWZ0ICsgbWFpbl93aWR0aAorICAgICAgICB0aHJlYWRfdG9wID0gbWFpbl90b3AKKyAgICAgICAgdGhyZWFkX2hlaWdodCA9IG1haW5faGVpZ2h0CisgICAgICAgIHRocmVhZF93aWR0aCA9IHdpZHRoIC0gbWFpbl93aWR0aAorCisgICAgICAgICN0dyA9IHNlbGYuVGl0bGVXaW5kb3coIDAsIDAsIHdpZHRoLCBtYWluX3RvcCApCisgICAgICAgIG13ID0gc2VsZi5NYWluV2luZG93KCBtYWluX2xlZnQsIG1haW5fdG9wLCBtYWluX3dpZHRoLCBtYWluX2hlaWdodCApCisgICAgICAgIHRhdyA9IHNlbGYuVGhyZWFkQWN0aXZpdHlXaW5kb3coIHRocmVhZF9sZWZ0LCB0aHJlYWRfdG9wLCB0aHJlYWRfd2lkdGgsIHRocmVhZF9oZWlnaHQgKQorICAgICAgICBjbG8gPSBzZWxmLlNoZWxsT3V0cHV0V2luZG93KCBjbG9fbGVmdCwgY2xvX3RvcCwgY2xvX3dpZHRoLCBjbG9faGVpZ2h0ICkKKyAgICAgICAgY2xpID0gc2VsZi5TaGVsbElucHV0V2luZG93KCBjbGlfbGVmdCwgY2xpX3RvcCwgY2xpX3dpZHRoLCBjbGlfaGVpZ2h0ICkKKyAgICAgICAgY2xpLnNldFRleHQoIDAsIDAsICJCQj4iICkKKworICAgICAgICBtdy5zZXRTdGF0dXMoIklkbGUiKQorCisgICAgICAgIGhlbHBlciA9IHVpaGVscGVyLkJCVUlIZWxwZXIoKQorICAgICAgICBzaHV0ZG93biA9IDAKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBwYXJhbXMudXBkYXRlRnJvbVNlcnZlcihzZXJ2ZXIpCisgICAgICAgICAgICBjbWRsaW5lID0gcGFyYW1zLnBhcnNlQWN0aW9ucygpCisgICAgICAgICAgICBpZiBub3QgY21kbGluZToKKyAgICAgICAgICAgICAgICBwcmludCgiTm90aGluZyB0byBkby4gIFVzZSAnYml0YmFrZSB3b3JsZCcgdG8gYnVpbGQgZXZlcnl0aGluZywgb3IgcnVuICdiaXRiYWtlIC0taGVscCcgZm9yIHVzYWdlIGluZm9ybWF0aW9uLiIpCisgICAgICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgICAgIGlmICdtc2cnIGluIGNtZGxpbmUgYW5kIGNtZGxpbmVbJ21zZyddOgorICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihjbWRsaW5lWydtc2cnXSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICAgICAgY21kbGluZSA9IGNtZGxpbmVbJ2FjdGlvbiddCisgICAgICAgICAgICByZXQsIGVycm9yID0gc2VydmVyLnJ1bkNvbW1hbmQoY21kbGluZSkKKyAgICAgICAgICAgIGlmIGVycm9yOgorICAgICAgICAgICAgICAgIHByaW50KCJFcnJvciBydW5uaW5nIGNvbW1hbmQgJyVzJzogJXMiICUgKGNtZGxpbmUsIGVycm9yKSkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGVsaWYgcmV0ICE9IFRydWU6CisgICAgICAgICAgICAgICAgcHJpbnQoIkNvdWxkbid0IGdldCBkZWZhdWx0IGNvbW1hbmRsaW5kISAlcyIgJSByZXQpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGV4Y2VwdCB4bWxycGNsaWIuRmF1bHQgYXMgeDoKKyAgICAgICAgICAgIHByaW50KCJYTUxSUEMgRmF1bHQgZ2V0dGluZyBjb21tYW5kbGluZTpcbiAlcyIgJSB4KQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZXhpdGZsYWcgPSBGYWxzZQorICAgICAgICB3aGlsZSBub3QgZXhpdGZsYWc6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZXZlbnQgPSBldmVudEhhbmRsZXIud2FpdEV2ZW50KDAuMjUpCisgICAgICAgICAgICAgICAgaWYgbm90IGV2ZW50OgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgaGVscGVyLmV2ZW50SGFuZGxlcihldmVudCkKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5idWlsZC5UYXNrQmFzZSk6CisgICAgICAgICAgICAgICAgICAgIG13LmFwcGVuZFRleHQoIk5PVEU6ICVzXG4iICUgZXZlbnQuX21lc3NhZ2UpCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgbG9nZ2luZy5Mb2dSZWNvcmQpOgorICAgICAgICAgICAgICAgICAgICBtdy5hcHBlbmRUZXh0KGxvZ2dpbmcuZ2V0TGV2ZWxOYW1lKGV2ZW50LmxldmVsbm8pICsgJzogJyArIGV2ZW50LmdldE1lc3NhZ2UoKSArICdcbicpCisKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5DYWNoZUxvYWRTdGFydGVkKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZV90b3RhbCA9IGV2ZW50LnRvdGFsCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuQ2FjaGVMb2FkUHJvZ3Jlc3MpOgorICAgICAgICAgICAgICAgICAgICB4ID0gZXZlbnQuY3VycmVudAorICAgICAgICAgICAgICAgICAgICB5ID0gc2VsZi5wYXJzZV90b3RhbAorICAgICAgICAgICAgICAgICAgICBtdy5zZXRTdGF0dXMoIkxvYWRpbmcgQ2FjaGU6ICAgJXMgWyUyZCAlJV0iICUgKCBuZXh0KHBhcnNlc3BpbiksIHgqMTAwL3kgKSApCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuQ2FjaGVMb2FkQ29tcGxldGVkKToKKyAgICAgICAgICAgICAgICAgICAgbXcuc2V0U3RhdHVzKCJJZGxlIikKKyAgICAgICAgICAgICAgICAgICAgbXcuYXBwZW5kVGV4dCgiTG9hZGVkICVkIGVudHJpZXMgZnJvbSBkZXBlbmRlbmN5IGNhY2hlLlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlICggZXZlbnQubnVtX2VudHJpZXMpKQorCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuUGFyc2VTdGFydGVkKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZV90b3RhbCA9IGV2ZW50LnRvdGFsCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuUGFyc2VQcm9ncmVzcyk6CisgICAgICAgICAgICAgICAgICAgIHggPSBldmVudC5jdXJyZW50CisgICAgICAgICAgICAgICAgICAgIHkgPSBzZWxmLnBhcnNlX3RvdGFsCisgICAgICAgICAgICAgICAgICAgIG13LnNldFN0YXR1cygiUGFyc2luZyBSZWNpcGVzOiAlcyBbJTJkICUlXSIgJSAoIG5leHQocGFyc2VzcGluKSwgeCoxMDAveSApICkKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5QYXJzZUNvbXBsZXRlZCk6CisgICAgICAgICAgICAgICAgICAgIG13LnNldFN0YXR1cygiSWRsZSIpCisgICAgICAgICAgICAgICAgICAgIG13LmFwcGVuZFRleHQoIlBhcnNpbmcgZmluaXNoZWQuICVkIGNhY2hlZCwgJWQgcGFyc2VkLCAlZCBza2lwcGVkLCAlZCBtYXNrZWQuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKCBldmVudC5jYWNoZWQsIGV2ZW50LnBhcnNlZCwgZXZlbnQuc2tpcHBlZCwgZXZlbnQubWFza2VkICkpCisKKyMgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuYnVpbGQuVGFza0ZhaWxlZCk6CisjICAgICAgICAgICAgICAgICAgICBpZiBldmVudC5sb2dmaWxlOgorIyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRhdGEuZ2V0VmFyKCJCQklOQ0xVREVMT0dTIiwgZCk6CisjICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiLmVycm9yKCJsb2cgZGF0YSBmb2xsb3dzICglcykiICUgbG9nZmlsZSkKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyX29mX2xpbmVzID0gZGF0YS5nZXRWYXIoIkJCSU5DTFVERUxPR1NfTElORVMiLCBkKQorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBudW1iZXJfb2ZfbGluZXM6CisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJwcm9jZXNzLmNhbGwoJ3RhaWwgLW4lcyAlcycgJSAobnVtYmVyX29mX2xpbmVzLCBsb2dmaWxlKSwgc2hlbGw9VHJ1ZSkKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBvcGVuKGxvZ2ZpbGUsICJyIikKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCA9IGYucmVhZGxpbmUoKQorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGwgPT0gJyc6CisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCA9IGwucnN0cmlwKCkKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAnfCAlcycgJSBsCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyMgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYi5lcnJvcigic2VlIGxvZyBpbiAlcyIgJSBsb2dmaWxlKQorCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuY29tbWFuZC5Db21tYW5kQ29tcGxldGVkKToKKyAgICAgICAgICAgICAgICAgICAgIyBzdG9wIHNvIHRoZSB1c2VyIGNhbiBzZWUgdGhlIHJlc3VsdCBvZiB0aGUgYnVpbGQsIGJ1dAorICAgICAgICAgICAgICAgICAgICAjIGFsc28gYWxsb3cgdGhlbSB0byBub3cgZXhpdCB3aXRoIGEgc2luZ2xlIF5DCisgICAgICAgICAgICAgICAgICAgIHNodXRkb3duID0gMgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmNvbW1hbmQuQ29tbWFuZEZhaWxlZCk6CisgICAgICAgICAgICAgICAgICAgIG13LmFwcGVuZFRleHQoIkNvbW1hbmQgZXhlY3V0aW9uIGZhaWxlZDogJXMiICUgZXZlbnQuZXJyb3IpCisgICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoMikKKyAgICAgICAgICAgICAgICAgICAgZXhpdGZsYWcgPSBUcnVlCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuY29tbWFuZC5Db21tYW5kRXhpdCk6CisgICAgICAgICAgICAgICAgICAgIGV4aXRmbGFnID0gVHJ1ZQorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmNvb2tlci5Db29rZXJFeGl0KToKKyAgICAgICAgICAgICAgICAgICAgZXhpdGZsYWcgPSBUcnVlCisKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5Mb2dFeGVjVFRZKToKKyAgICAgICAgICAgICAgICAgICAgbXcuYXBwZW5kVGV4dCgnV0FSTjogJyArIGV2ZW50Lm1zZyArICdcbicpCisgICAgICAgICAgICAgICAgaWYgaGVscGVyLm5lZWRVcGRhdGU6CisgICAgICAgICAgICAgICAgICAgIGFjdGl2ZXRhc2tzLCBmYWlsZWR0YXNrcyA9IGhlbHBlci5nZXRUYXNrcygpCisgICAgICAgICAgICAgICAgICAgIHRhdy5lcmFzZSgpCisgICAgICAgICAgICAgICAgICAgIHRhdy5zZXRUZXh0KDAsIDAsICIiKQorICAgICAgICAgICAgICAgICAgICBpZiBhY3RpdmV0YXNrczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhdy5hcHBlbmRUZXh0KCJBY3RpdmUgVGFza3M6XG4iKQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRhc2sgaW4gYWN0aXZldGFza3MuaXRlcnZhbHVlcygpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhdy5hcHBlbmRUZXh0KHRhc2tbInRpdGxlIl0gKyAnXG4nKQorICAgICAgICAgICAgICAgICAgICBpZiBmYWlsZWR0YXNrczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhdy5hcHBlbmRUZXh0KCJGYWlsZWQgVGFza3M6XG4iKQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRhc2sgaW4gZmFpbGVkdGFza3M6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGF3LmFwcGVuZFRleHQodGFza1sidGl0bGUiXSArICdcbicpCisKKyAgICAgICAgICAgICAgICBjdXJzZXMuZG91cGRhdGUoKQorICAgICAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3IgYXMgaW9lcnJvcjoKKyAgICAgICAgICAgICAgICAjIGlnbm9yZSBpbnRlcnJ1cHRlZCBpbworICAgICAgICAgICAgICAgIGlmIGlvZXJyb3IuYXJnc1swXSA9PSA0OgorICAgICAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgICAgICBpZiBzaHV0ZG93biA9PSAyOgorICAgICAgICAgICAgICAgICAgICBtdy5hcHBlbmRUZXh0KCJUaGlyZCBLZXlib2FyZCBJbnRlcnJ1cHQsIGV4aXQuXG4iKQorICAgICAgICAgICAgICAgICAgICBleGl0ZmxhZyA9IFRydWUKKyAgICAgICAgICAgICAgICBpZiBzaHV0ZG93biA9PSAxOgorICAgICAgICAgICAgICAgICAgICBtdy5hcHBlbmRUZXh0KCJTZWNvbmQgS2V5Ym9hcmQgSW50ZXJydXB0LCBzdG9wcGluZy4uLlxuIikKKyAgICAgICAgICAgICAgICAgICAgXywgZXJyb3IgPSBzZXJ2ZXIucnVuQ29tbWFuZChbInN0YXRlRm9yY2VTaHV0ZG93biJdKQorICAgICAgICAgICAgICAgICAgICBpZiBlcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KCJVbmFibGUgdG8gY2xlYW5seSBzdG9wOiAlcyIgJSBlcnJvcikKKyAgICAgICAgICAgICAgICBpZiBzaHV0ZG93biA9PSAwOgorICAgICAgICAgICAgICAgICAgICBtdy5hcHBlbmRUZXh0KCJLZXlib2FyZCBJbnRlcnJ1cHQsIGNsb3NpbmcgZG93bi4uLlxuIikKKyAgICAgICAgICAgICAgICAgICAgXywgZXJyb3IgPSBzZXJ2ZXIucnVuQ29tbWFuZChbInN0YXRlU2h1dGRvd24iXSkKKyAgICAgICAgICAgICAgICAgICAgaWYgZXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCgiVW5hYmxlIHRvIGNsZWFubHkgc2h1dGRvd246ICVzIiAlIGVycm9yKQorICAgICAgICAgICAgICAgIHNodXRkb3duID0gc2h1dGRvd24gKyAxCisgICAgICAgICAgICAgICAgcGFzcworCitkZWYgbWFpbihzZXJ2ZXIsIGV2ZW50SGFuZGxlciwgcGFyYW1zKToKKyAgICBpZiBub3Qgb3MuaXNhdHR5KHN5cy5zdGRvdXQuZmlsZW5vKCkpOgorICAgICAgICBwcmludCgiRkFUQUw6IFVuYWJsZSB0byBydW4gJ25jdXJzZXMnIFVJIHdpdGhvdXQgYSBUVFkuIikKKyAgICAgICAgcmV0dXJuCisgICAgdWkgPSBOQ3Vyc2VzVUkoKQorICAgIHRyeToKKyAgICAgICAgY3Vyc2VzLndyYXBwZXIodWkubWFpbiwgc2VydmVyLCBldmVudEhhbmRsZXIsIHBhcmFtcykKKyAgICBleGNlcHQ6CisgICAgICAgIGltcG9ydCB0cmFjZWJhY2sKKyAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi91aS9wdWNjaG8ucHkgYi9iaXRiYWtlL2xpYi9iYi91aS9wdWNjaG8ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NlNDU5MAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL3B1Y2Noby5weQpAQCAtMCwwICsxLDQyNSBAQAorIworIyBCaXRCYWtlIEdyYXBoaWNhbCBHVEsgVXNlciBJbnRlcmZhY2UKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA4ICAgICAgICBJbnRlbCBDb3Jwb3JhdGlvbgorIworIyBBdXRob3JlZCBieSBSb2IgQnJhZGZvcmQgPHJvYkBsaW51eC5pbnRlbC5jb20+CisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitpbXBvcnQgZ3RrCitpbXBvcnQgZ29iamVjdAoraW1wb3J0IGd0ay5nbGFkZQoraW1wb3J0IHRocmVhZGluZworaW1wb3J0IHVybGxpYjIKK2ltcG9ydCBvcworaW1wb3J0IGNvbnRleHRsaWIKKworZnJvbSBiYi51aS5jcnVtYnMuYnVpbGRtYW5hZ2VyIGltcG9ydCBCdWlsZE1hbmFnZXIsIEJ1aWxkQ29uZmlndXJhdGlvbgorZnJvbSBiYi51aS5jcnVtYnMuYnVpbGRtYW5hZ2VyIGltcG9ydCBCdWlsZE1hbmFnZXJUcmVlVmlldworCitmcm9tIGJiLnVpLmNydW1icy5ydW5uaW5nYnVpbGQgaW1wb3J0IFJ1bm5pbmdCdWlsZCwgUnVubmluZ0J1aWxkVHJlZVZpZXcKKworIyBUaGUgbWV0YWRhdGEgbG9hZGVyIGlzIHVzZWQgYnkgdGhlIEJ1aWxkU2V0dXBEaWFsb2cgdG8gZG93bmxvYWQgdGhlCisjIGF2YWlsYWJsZSBvcHRpb25zIHRvIHBvcHVsYXRlIHRoZSBkaWFsb2cKK2NsYXNzIE1ldGFEYXRhTG9hZGVyKGdvYmplY3QuR09iamVjdCk6CisgICAgIiIiIFRoaXMgY2xhc3MgcHJvdmlkZXMgdGhlIG1lY2hhbmlzbSBmb3IgbG9hZGluZyB0aGUgbWV0YWRhdGEgKHRoZQorICAgIGZldGNoaW5nIGFuZCBwYXJzaW5nKSBmcm9tIGEgZ2l2ZW4gVVJMLiBUaGUgbWV0YWRhdGEgZW5jb21wYXNzZXMgZGV0YWlscworICAgIG9uIHdoYXQgbWFjaGluZXMgYXJlIGF2YWlsYWJsZS4gVGhlIGRpc3RyaWJ1dGlvbiBhbmQgaW1hZ2VzIGF2YWlsYWJsZSBmb3IKKyAgICB0aGUgbWFjaGluZSBhbmQgdGhlIHRoZSB1cmlzIHRvIHVzZSBmb3IgYnVpbGRpbmcgdGhlIGdpdmVuIG1hY2hpbmUuIiIiCisgICAgX19nc2lnbmFsc19fID0geworICAgICAgICAnc3VjY2VzcycgOiAoZ29iamVjdC5TSUdOQUxfUlVOX0xBU1QsCisgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICgpKSwKKyAgICAgICAgJ2Vycm9yJyA6IChnb2JqZWN0LlNJR05BTF9SVU5fTEFTVCwKKyAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAoZ29iamVjdC5UWVBFX1NUUklORywpKQorICAgICAgICB9CisKKyAgICAjIFdlIHVzZSB0aGVzZSBsaXR0bGUgaGVscGVyIGZ1bmN0aW9ucyB0byBlbnN1cmUgdGhhdCB3ZSB0YWtlIHRoZSBnZGsgbG9jaworICAgICMgd2hlbiBlbWl0dGluZyB0aGUgc2lnbmFsLiBUaGVzZSBmdW5jdGlvbnMgYXJlIGNhbGxlZCBhcyBpZGxlcyAoc28gdGhhdAorICAgICMgdGhleSBoYXBwZW4gaW4gdGhlIGd0ayAvIG1haW4gdGhyZWFkJ3MgbWFpbiBsb29wLgorICAgIGRlZiBlbWl0X2Vycm9yX3NpZ25hbCAoc2VsZiwgcmVtYXJrKToKKyAgICAgICAgZ3RrLmdkay50aHJlYWRzX2VudGVyKCkKKyAgICAgICAgc2VsZi5lbWl0ICgiZXJyb3IiLCByZW1hcmspCisgICAgICAgIGd0ay5nZGsudGhyZWFkc19sZWF2ZSgpCisKKyAgICBkZWYgZW1pdF9zdWNjZXNzX3NpZ25hbCAoc2VsZik6CisgICAgICAgIGd0ay5nZGsudGhyZWFkc19lbnRlcigpCisgICAgICAgIHNlbGYuZW1pdCAoInN1Y2Nlc3MiKQorICAgICAgICBndGsuZ2RrLnRocmVhZHNfbGVhdmUoKQorCisgICAgZGVmIF9faW5pdF9fIChzZWxmKToKKyAgICAgICAgZ29iamVjdC5HT2JqZWN0Ll9faW5pdF9fIChzZWxmKQorCisgICAgY2xhc3MgTG9hZGVyVGhyZWFkKHRocmVhZGluZy5UaHJlYWQpOgorICAgICAgICAiIiIgVGhpcyBjbGFzcyBwcm92aWRlcyBhbiBhc3luY2hyb25vdXMgbG9hZGVyIGZvciB0aGUgbWV0YWRhdGEgKGJ5CisgICAgICAgIHVzaW5nIHRocmVhZHMgYW5kIHNpZ25hbHMpLiBUaGlzIGlzIHVzZWZ1bCBzaW5jZSB0aGUgbWV0YWRhdGEgbWF5IGJlCisgICAgICAgIGF0IGEgcmVtb3RlIFVSTC4iIiIKKyAgICAgICAgY2xhc3MgTG9hZGVySW1wb3J0RXhjZXB0aW9uIChFeGNlcHRpb24pOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsb2FkZXIsIHVybCk6CisgICAgICAgICAgICB0aHJlYWRpbmcuVGhyZWFkLl9faW5pdF9fIChzZWxmKQorICAgICAgICAgICAgc2VsZi51cmwgPSB1cmwKKyAgICAgICAgICAgIHNlbGYubG9hZGVyID0gbG9hZGVyCisKKyAgICAgICAgZGVmIHJ1biAoc2VsZik6CisgICAgICAgICAgICByZXN1bHQgPSB7fQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdpdGggY29udGV4dGxpYi5jbG9zaW5nICh1cmxsaWIyLnVybG9wZW4gKHNlbGYudXJsKSkgYXMgZjoKKyAgICAgICAgICAgICAgICAgICAgIyBQYXJzZSB0aGUgbWV0YWRhdGEgZm9ybWF0LiBUaGUgZm9ybWF0IGlzLi4uLgorICAgICAgICAgICAgICAgICAgICAjIDxtYWNoaW5lPjs8ZGVmYXVsdCBkaXN0cm8+fDxkaXN0cm8+Li4uOzxkZWZhdWx0IGltYWdlPnw8aW1hZ2U+Li4uOzx0eXBlIyN1cmw+fC4uLgorICAgICAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBmOgorICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cyA9IGxpbmUuc3BsaXQoIjsiKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiAoY29tcG9uZW50cykgPCA0KToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBNZXRhRGF0YUxvYWRlci5Mb2FkZXJUaHJlYWQuTG9hZGVySW1wb3J0RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICBtYWNoaW5lID0gY29tcG9uZW50c1swXQorICAgICAgICAgICAgICAgICAgICAgICAgZGlzdHJvcyA9IGNvbXBvbmVudHNbMV0uc3BsaXQoInwiKQorICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VzID0gY29tcG9uZW50c1syXS5zcGxpdCgifCIpCisgICAgICAgICAgICAgICAgICAgICAgICB1cmxzID0gY29tcG9uZW50c1szXS5zcGxpdCgifCIpCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFttYWNoaW5lXSA9IChkaXN0cm9zLCBpbWFnZXMsIHVybHMpCisKKyAgICAgICAgICAgICAgICAjIENyZWF0ZSBhbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgKnBvdGVudGlhbCoKKyAgICAgICAgICAgICAgICAjIGNvbmZpZ3VyYXRpb24uIEl0IGNhbiBiZWNvbWUgY29uY3JldGUgaWYgdGhlIG1hY2hpbmUsIGRpc3RybworICAgICAgICAgICAgICAgICMgYW5kIGltYWdlIGFyZSBhbGwgY2hvc2VuIGluIHRoZSBVSQorICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gPSBCdWlsZENvbmZpZ3VyYXRpb24oKQorICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24ubWV0YWRhdGFfdXJsID0gc2VsZi51cmwKKyAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLm1hY2hpbmVfb3B0aW9ucyA9IHJlc3VsdAorICAgICAgICAgICAgICAgIHNlbGYubG9hZGVyLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uCisKKyAgICAgICAgICAgICAgICAjIEVtaXQgdGhhdCB3ZSd2ZSBhY3R1YWxseSBnb3QgYSBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAgICAgZ29iamVjdC5pZGxlX2FkZCAoTWV0YURhdGFMb2FkZXIuZW1pdF9zdWNjZXNzX3NpZ25hbCwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2FkZXIpCisKKyAgICAgICAgICAgIGV4Y2VwdCBNZXRhRGF0YUxvYWRlci5Mb2FkZXJUaHJlYWQuTG9hZGVySW1wb3J0RXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICAgICAgZ29iamVjdC5pZGxlX2FkZCAoTWV0YURhdGFMb2FkZXIuZW1pdF9lcnJvcl9zaWduYWwsIHNlbGYubG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAiUmVwb3NpdG9yeSBtZXRhZGF0YSBjb3JydXB0IikKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgICAgICBnb2JqZWN0LmlkbGVfYWRkIChNZXRhRGF0YUxvYWRlci5lbWl0X2Vycm9yX3NpZ25hbCwgc2VsZi5sb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZG93bmxvYWQgcmVwb3NpdG9yeSBtZXRhZGF0YSIpCisgICAgICAgICAgICAgICAgcHJpbnQoZSkKKworICAgIGRlZiB0cnlfZmV0Y2hfZnJvbV91cmwgKHNlbGYsIHVybCk6CisgICAgICAgICMgVHJ5IGFuZCBkb3dubG9hZCB0aGUgbWV0YWRhdGEuIEZpcmluZyBhIHNpZ25hbCBpZiBzdWNjZXNzZnVsCisgICAgICAgIHRocmVhZCA9IE1ldGFEYXRhTG9hZGVyLkxvYWRlclRocmVhZChzZWxmLCB1cmwpCisgICAgICAgIHRocmVhZC5zdGFydCgpCisKK2NsYXNzIEJ1aWxkU2V0dXBEaWFsb2cgKGd0ay5EaWFsb2cpOgorICAgIFJFU1BPTlNFX0JVSUxEID0gMQorCisgICAgIyBBIGxpdHRsZSBoZWxwZXIgbWV0aG9kIHRoYXQganVzdCBzZXRzIHRoZSBzdGF0ZXMgb24gdGhlIHdpZGdldHMgYmFzZWQgb24KKyAgICAjIHdoZXRoZXIgd2UndmUgZ290IGdvb2QgbWV0YWRhdGEgb3Igbm90LgorICAgIGRlZiBzZXRfY29uZmlndXJhYmxlIChzZWxmLCBjb25maWd1cmFibGUpOgorICAgICAgICBpZiAoc2VsZi5jb25maWd1cmFibGUgPT0gY29uZmlndXJhYmxlKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHNlbGYuY29uZmlndXJhYmxlID0gY29uZmlndXJhYmxlCisgICAgICAgIGZvciB3aWRnZXQgaW4gc2VsZi5jb25mX3dpZGdldHM6CisgICAgICAgICAgICB3aWRnZXQuc2V0X3NlbnNpdGl2ZSAoY29uZmlndXJhYmxlKQorCisgICAgICAgIGlmIG5vdCBjb25maWd1cmFibGU6CisgICAgICAgICAgICBzZWxmLm1hY2hpbmVfY29tYm8uc2V0X2FjdGl2ZSAoLTEpCisgICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbl9jb21iby5zZXRfYWN0aXZlICgtMSkKKyAgICAgICAgICAgIHNlbGYuaW1hZ2VfY29tYm8uc2V0X2FjdGl2ZSAoLTEpCisKKyAgICAjIEdUSyB3aWRnZXQgY2FsbGJhY2tzCisgICAgZGVmIHJlZnJlc2hfYnV0dG9uX2NsaWNrZWQgKHNlbGYsIGJ1dHRvbik6CisgICAgICAgICMgUmVmcmVzaCBidXR0b24gY2xpY2tlZC4KKworICAgICAgICB1cmwgPSBzZWxmLmxvY2F0aW9uX2VudHJ5LmdldF9jaGFycyAoMCwgLTEpCisgICAgICAgIHNlbGYubG9hZGVyLnRyeV9mZXRjaF9mcm9tX3VybCh1cmwpCisKKyAgICBkZWYgcmVwb3NpdG9yeV9lbnRyeV9lZGl0YWJsZV9jaGFuZ2VkIChzZWxmLCBlbnRyeSk6CisgICAgICAgIGlmIChsZW4gKGVudHJ5LmdldF9jaGFycyAoMCwgLTEpKSA+IDApOgorICAgICAgICAgICAgc2VsZi5yZWZyZXNoX2J1dHRvbi5zZXRfc2Vuc2l0aXZlIChUcnVlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5yZWZyZXNoX2J1dHRvbi5zZXRfc2Vuc2l0aXZlIChGYWxzZSkKKyAgICAgICAgICAgIHNlbGYuY2xlYXJfc3RhdHVzX21lc3NhZ2UoKQorCisgICAgICAgICMgSWYgd2Ugd2VyZSBwcmV2aW91c2x5IGNvbmZpZ3VyYWJsZSB3ZSBhcmUgbm8gbG9uZ2VyIHNpbmNlIHRoZQorICAgICAgICAjIGxvY2F0aW9uIGVudHJ5IGhhcyBiZWVuIGNoYW5nZWQKKyAgICAgICAgc2VsZi5zZXRfY29uZmlndXJhYmxlIChGYWxzZSkKKworICAgIGRlZiBtYWNoaW5lX2NvbWJvX2NoYW5nZWQgKHNlbGYsIGNvbWJvYm94KToKKyAgICAgICAgYWN0aXZlX2l0ZXIgPSBjb21ib2JveC5nZXRfYWN0aXZlX2l0ZXIoKQorCisgICAgICAgIGlmIG5vdCBhY3RpdmVfaXRlcjoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIG1vZGVsID0gY29tYm9ib3guZ2V0X21vZGVsKCkKKworICAgICAgICBpZiBtb2RlbDoKKyAgICAgICAgICAgIGNob3Nlbl9tYWNoaW5lID0gbW9kZWwuZ2V0IChhY3RpdmVfaXRlciwgMClbMF0KKworICAgICAgICAoZGlzdHJvc19tb2RlbCwgaW1hZ2VzX21vZGVsKSA9IFwKKyAgICAgICAgICAgIHNlbGYubG9hZGVyLmNvbmZpZ3VyYXRpb24uZ2V0X2Rpc3Ryb19hbmRfaW1hZ2VzX21vZGVscyAoY2hvc2VuX21hY2hpbmUpCisKKyAgICAgICAgc2VsZi5kaXN0cmlidXRpb25fY29tYm8uc2V0X21vZGVsIChkaXN0cm9zX21vZGVsKQorICAgICAgICBzZWxmLmltYWdlX2NvbWJvLnNldF9tb2RlbCAoaW1hZ2VzX21vZGVsKQorCisgICAgIyBDYWxsYmFja3MgZnJvbSB0aGUgbG9hZGVyCisgICAgZGVmIGxvYWRlcl9zdWNjZXNzX2NiIChzZWxmLCBsb2FkZXIpOgorICAgICAgICBzZWxmLnN0YXR1c19pbWFnZS5zZXRfZnJvbV9pY29uX25hbWUgKCJpbmZvIiwKKyAgICAgICAgICAgIGd0ay5JQ09OX1NJWkVfQlVUVE9OKQorICAgICAgICBzZWxmLnN0YXR1c19pbWFnZS5zaG93KCkKKyAgICAgICAgc2VsZi5zdGF0dXNfbGFiZWwuc2V0X2xhYmVsICgiUmVwb3NpdG9yeSBtZXRhZGF0YSBzdWNjZXNzZnVsbHkgZG93bmxvYWRlZCIpCisKKyAgICAgICAgIyBTZXQgdGhlIG1vZGVscyBvbiB0aGUgY29tYm8gYm94ZXMgYmFzZWQgb24gdGhlIG1vZGVscyBnZW5lcmF0ZWQgZnJvbQorICAgICAgICAjIHRoZSBjb25maWd1cmF0aW9uIHRoYXQgdGhlIGxvYWRlciBoYXMgY3JlYXRlZAorCisgICAgICAgICMgV2UganVzdCBuZWVkIHRvIHNldCB0aGUgbWFjaGluZSBoZXJlLCB0aGF0IHRoZW4gZGV0ZXJtaW5lcyB0aGUKKyAgICAgICAgIyBkaXN0cm8gYW5kIGltYWdlIG9wdGlvbnMuIEN1bm5pbmcgaHVoPyA6LSkKKworICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24gPSBzZWxmLmxvYWRlci5jb25maWd1cmF0aW9uCisgICAgICAgIG1vZGVsID0gc2VsZi5jb25maWd1cmF0aW9uLmdldF9tYWNoaW5lc19tb2RlbCAoKQorICAgICAgICBzZWxmLm1hY2hpbmVfY29tYm8uc2V0X21vZGVsIChtb2RlbCkKKworICAgICAgICBzZWxmLnNldF9jb25maWd1cmFibGUgKFRydWUpCisKKyAgICBkZWYgbG9hZGVyX2Vycm9yX2NiIChzZWxmLCBsb2FkZXIsIG1lc3NhZ2UpOgorICAgICAgICBzZWxmLnN0YXR1c19pbWFnZS5zZXRfZnJvbV9pY29uX25hbWUgKCJlcnJvciIsCisgICAgICAgICAgICBndGsuSUNPTl9TSVpFX0JVVFRPTikKKyAgICAgICAgc2VsZi5zdGF0dXNfaW1hZ2Uuc2hvdygpCisgICAgICAgIHNlbGYuc3RhdHVzX2xhYmVsLnNldF90ZXh0ICgiRXJyb3IgZG93bmxvYWRpbmcgcmVwb3NpdG9yeSBtZXRhZGF0YSIpCisgICAgICAgIGZvciB3aWRnZXQgaW4gc2VsZi5jb25mX3dpZGdldHM6CisgICAgICAgICAgICB3aWRnZXQuc2V0X3NlbnNpdGl2ZSAoRmFsc2UpCisKKyAgICBkZWYgY2xlYXJfc3RhdHVzX21lc3NhZ2UgKHNlbGYpOgorICAgICAgICBzZWxmLnN0YXR1c19pbWFnZS5oaWRlKCkKKyAgICAgICAgc2VsZi5zdGF0dXNfbGFiZWwuc2V0X2xhYmVsICgKKyAgICAgICAgICAgICIiIjxpPkVudGVyIHRoZSByZXBvc2l0b3J5IGxvY2F0aW9uIGFuZCBwcmVzcyBfUmVmcmVzaDwvaT4iIiIpCisKKyAgICBkZWYgX19pbml0X18gKHNlbGYpOgorICAgICAgICBndGsuRGlhbG9nLl9faW5pdF9fIChzZWxmKQorCisgICAgICAgICMgQ2FuY2VsCisgICAgICAgIHNlbGYuYWRkX2J1dHRvbiAoZ3RrLlNUT0NLX0NBTkNFTCwgZ3RrLlJFU1BPTlNFX0NBTkNFTCkKKworICAgICAgICAjIEJ1aWxkCisgICAgICAgIGJ1dHRvbiA9IGd0ay5CdXR0b24gKCJfQnVpbGQiLCBOb25lLCBUcnVlKQorICAgICAgICBpbWFnZSA9IGd0ay5JbWFnZSAoKQorICAgICAgICBpbWFnZS5zZXRfZnJvbV9zdG9jayAoZ3RrLlNUT0NLX0VYRUNVVEUsIGd0ay5JQ09OX1NJWkVfQlVUVE9OKQorICAgICAgICBidXR0b24uc2V0X2ltYWdlIChpbWFnZSkKKyAgICAgICAgc2VsZi5hZGRfYWN0aW9uX3dpZGdldCAoYnV0dG9uLCBCdWlsZFNldHVwRGlhbG9nLlJFU1BPTlNFX0JVSUxEKQorICAgICAgICBidXR0b24uc2hvd19hbGwgKCkKKworICAgICAgICAjIFB1bGwgaW4gKmp1c3QqIHRoZSB0YWJsZSBmcm9tIHRoZSBHbGFkZSBYTUwgZGF0YS4KKyAgICAgICAgZ3htbCA9IGd0ay5nbGFkZS5YTUwgKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykgKyAiL2NydW1icy9wdWNjaG8uZ2xhZGUiLAorICAgICAgICAgICAgcm9vdCA9ICJidWlsZF90YWJsZSIpCisgICAgICAgIHRhYmxlID0gZ3htbC5nZXRfd2lkZ2V0ICgiYnVpbGRfdGFibGUiKQorICAgICAgICBzZWxmLnZib3gucGFja19zdGFydCAodGFibGUsIFRydWUsIEZhbHNlLCAwKQorCisgICAgICAgICMgR3JhYiBhbGwgdGhlIHdpZGdldHMgdGhhdCB3ZSBuZWVkIHRvIHR1cm4gb24vb2ZmIHdoZW4gd2UgcmVmcmVzaC4uLgorICAgICAgICBzZWxmLmNvbmZfd2lkZ2V0cyA9IFtdCisgICAgICAgIHNlbGYuY29uZl93aWRnZXRzICs9IFtneG1sLmdldF93aWRnZXQgKCJtYWNoaW5lX2xhYmVsIildCisgICAgICAgIHNlbGYuY29uZl93aWRnZXRzICs9IFtneG1sLmdldF93aWRnZXQgKCJkaXN0cmlidXRpb25fbGFiZWwiKV0KKyAgICAgICAgc2VsZi5jb25mX3dpZGdldHMgKz0gW2d4bWwuZ2V0X3dpZGdldCAoImltYWdlX2xhYmVsIildCisgICAgICAgIHNlbGYuY29uZl93aWRnZXRzICs9IFtneG1sLmdldF93aWRnZXQgKCJtYWNoaW5lX2NvbWJvIildCisgICAgICAgIHNlbGYuY29uZl93aWRnZXRzICs9IFtneG1sLmdldF93aWRnZXQgKCJkaXN0cmlidXRpb25fY29tYm8iKV0KKyAgICAgICAgc2VsZi5jb25mX3dpZGdldHMgKz0gW2d4bWwuZ2V0X3dpZGdldCAoImltYWdlX2NvbWJvIildCisKKyAgICAgICAgIyBHcmFiIHRoZSBzdGF0dXMgd2lkZ2V0cworICAgICAgICBzZWxmLnN0YXR1c19pbWFnZSA9IGd4bWwuZ2V0X3dpZGdldCAoInN0YXR1c19pbWFnZSIpCisgICAgICAgIHNlbGYuc3RhdHVzX2xhYmVsID0gZ3htbC5nZXRfd2lkZ2V0ICgic3RhdHVzX2xhYmVsIikKKworICAgICAgICAjIEdyYWIgdGhlIHJlZnJlc2ggYnV0dG9uIGFuZCBjb25uZWN0IHRvIHRoZSBjbGlja2VkIHNpZ25hbAorICAgICAgICBzZWxmLnJlZnJlc2hfYnV0dG9uID0gZ3htbC5nZXRfd2lkZ2V0ICgicmVmcmVzaF9idXR0b24iKQorICAgICAgICBzZWxmLnJlZnJlc2hfYnV0dG9uLmNvbm5lY3QgKCJjbGlja2VkIiwgc2VsZi5yZWZyZXNoX2J1dHRvbl9jbGlja2VkKQorCisgICAgICAgICMgR3JhYiB0aGUgbG9jYXRpb24gZW50cnkgYW5kIGNvbm5lY3QgdG8gZWRpdGFibGU6OmNoYW5nZWQKKyAgICAgICAgc2VsZi5sb2NhdGlvbl9lbnRyeSA9IGd4bWwuZ2V0X3dpZGdldCAoImxvY2F0aW9uX2VudHJ5IikKKyAgICAgICAgc2VsZi5sb2NhdGlvbl9lbnRyeS5jb25uZWN0ICgiY2hhbmdlZCIsCisgICAgICAgICAgICBzZWxmLnJlcG9zaXRvcnlfZW50cnlfZWRpdGFibGVfY2hhbmdlZCkKKworICAgICAgICAjIEdyYWIgdGhlIG1hY2hpbmUgY29tYm8gYW5kIGhvb2sgb250byB0aGUgY2hhbmdlZCBzaWduYWwuIFRoaXMgdGhlbgorICAgICAgICAjIGFsbG93cyB1cyB0byBwb3B1bGF0ZSB0aGUgZGlzdHJvIGFuZCBpbWFnZSBjb21ib3MKKyAgICAgICAgc2VsZi5tYWNoaW5lX2NvbWJvID0gZ3htbC5nZXRfd2lkZ2V0ICgibWFjaGluZV9jb21ibyIpCisgICAgICAgIHNlbGYubWFjaGluZV9jb21iby5jb25uZWN0ICgiY2hhbmdlZCIsIHNlbGYubWFjaGluZV9jb21ib19jaGFuZ2VkKQorCisgICAgICAgICMgU2V0dXAgdGhlIGNvbWJvCisgICAgICAgIGNlbGwgPSBndGsuQ2VsbFJlbmRlcmVyVGV4dCgpCisgICAgICAgIHNlbGYubWFjaGluZV9jb21iby5wYWNrX3N0YXJ0KGNlbGwsIFRydWUpCisgICAgICAgIHNlbGYubWFjaGluZV9jb21iby5hZGRfYXR0cmlidXRlKGNlbGwsICd0ZXh0JywgMCkKKworICAgICAgICAjIEdyYWIgdGhlIGRpc3RybyBhbmQgaW1hZ2UgY29tYm9zLiBXZSBuZWVkIHRoZXNlIHRvIHBvcHVsYXRlIHdpdGgKKyAgICAgICAgIyBtb2RlbHMgb25jZSB0aGUgbWFjaGluZSBpcyBjaG9zZW4KKyAgICAgICAgc2VsZi5kaXN0cmlidXRpb25fY29tYm8gPSBneG1sLmdldF93aWRnZXQgKCJkaXN0cmlidXRpb25fY29tYm8iKQorICAgICAgICBjZWxsID0gZ3RrLkNlbGxSZW5kZXJlclRleHQoKQorICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbl9jb21iby5wYWNrX3N0YXJ0KGNlbGwsIFRydWUpCisgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uX2NvbWJvLmFkZF9hdHRyaWJ1dGUoY2VsbCwgJ3RleHQnLCAwKQorCisgICAgICAgIHNlbGYuaW1hZ2VfY29tYm8gPSBneG1sLmdldF93aWRnZXQgKCJpbWFnZV9jb21ibyIpCisgICAgICAgIGNlbGwgPSBndGsuQ2VsbFJlbmRlcmVyVGV4dCgpCisgICAgICAgIHNlbGYuaW1hZ2VfY29tYm8ucGFja19zdGFydChjZWxsLCBUcnVlKQorICAgICAgICBzZWxmLmltYWdlX2NvbWJvLmFkZF9hdHRyaWJ1dGUoY2VsbCwgJ3RleHQnLCAwKQorCisgICAgICAgICMgUHV0IHRoZSBkZWZhdWx0IGRlc2NyaXB0aXZlIHRleHQgaW4gdGhlIHN0YXR1cyBib3gKKyAgICAgICAgc2VsZi5jbGVhcl9zdGF0dXNfbWVzc2FnZSgpCisKKyAgICAgICAgIyBNYXJrIGFzIG5vbi1jb25maWd1cmFibGUsIHRoaXMgaXMganVzdCBncmV5cyBvdXQgdGhlIHdpZGdldHMgdGhlCisgICAgICAgICMgdXNlciBjYW4ndCB5ZXQgdXNlCisgICAgICAgIHNlbGYuY29uZmlndXJhYmxlID0gRmFsc2UKKyAgICAgICAgc2VsZi5zZXRfY29uZmlndXJhYmxlKEZhbHNlKQorCisgICAgICAgICMgU2hvdyB0aGUgdGFibGUKKyAgICAgICAgdGFibGUuc2hvd19hbGwgKCkKKworICAgICAgICAjIFRoZSBsb2FkZXIgYW5kIHNvbWUgc2lnbmFscyBjb25uZWN0ZWQgdG8gaXQgdG8gdXBkYXRlIHRoZSBzdGF0dXMKKyAgICAgICAgIyBhcmVhCisgICAgICAgIHNlbGYubG9hZGVyID0gTWV0YURhdGFMb2FkZXIoKQorICAgICAgICBzZWxmLmxvYWRlci5jb25uZWN0ICgic3VjY2VzcyIsIHNlbGYubG9hZGVyX3N1Y2Nlc3NfY2IpCisgICAgICAgIHNlbGYubG9hZGVyLmNvbm5lY3QgKCJlcnJvciIsIHNlbGYubG9hZGVyX2Vycm9yX2NiKQorCisgICAgZGVmIHVwZGF0ZV9jb25maWd1cmF0aW9uIChzZWxmKToKKyAgICAgICAgIiIiIEEgcG9vcmx5IG5hbWVkIGZ1bmN0aW9uIGJ1dCBpdCB1cGRhdGVzIHRoZSBpbnRlcm5hbCBjb25maWd1cmF0aW9uCisgICAgICAgIGZyb20gdGhlIHdpZGdldHMuIFRoaXMgY2FuIG1ha2UgdGhhdCBjb25maWd1cmF0aW9uIGNvbmNyZXRlIGFuZCBjYW4KKyAgICAgICAgdGh1cyBiZSB1c2VkIGZvciBidWlsZGluZyAiIiIKKyAgICAgICAgIyBFeHRyYWN0IHRoZSBjaG9zZW4gbWFjaGluZSBmcm9tIHRoZSBjb21ibworICAgICAgICBtb2RlbCA9IHNlbGYubWFjaGluZV9jb21iby5nZXRfbW9kZWwoKQorICAgICAgICBhY3RpdmVfaXRlciA9IHNlbGYubWFjaGluZV9jb21iby5nZXRfYWN0aXZlX2l0ZXIoKQorICAgICAgICBpZiAoYWN0aXZlX2l0ZXIpOgorICAgICAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLm1hY2hpbmUgPSBtb2RlbC5nZXQoYWN0aXZlX2l0ZXIsIDApWzBdCisKKyAgICAgICAgIyBFeHRyYWN0IHRoZSBjaG9zZW4gZGlzdHJvIGZyb20gdGhlIGNvbWJvCisgICAgICAgIG1vZGVsID0gc2VsZi5kaXN0cmlidXRpb25fY29tYm8uZ2V0X21vZGVsKCkKKyAgICAgICAgYWN0aXZlX2l0ZXIgPSBzZWxmLmRpc3RyaWJ1dGlvbl9jb21iby5nZXRfYWN0aXZlX2l0ZXIoKQorICAgICAgICBpZiAoYWN0aXZlX2l0ZXIpOgorICAgICAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLmRpc3RybyA9IG1vZGVsLmdldChhY3RpdmVfaXRlciwgMClbMF0KKworICAgICAgICAjIEV4dHJhY3QgdGhlIGNob3NlbiBpbWFnZSBmcm9tIHRoZSBjb21ibworICAgICAgICBtb2RlbCA9IHNlbGYuaW1hZ2VfY29tYm8uZ2V0X21vZGVsKCkKKyAgICAgICAgYWN0aXZlX2l0ZXIgPSBzZWxmLmltYWdlX2NvbWJvLmdldF9hY3RpdmVfaXRlcigpCisgICAgICAgIGlmIChhY3RpdmVfaXRlcik6CisgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uaW1hZ2UgPSBtb2RlbC5nZXQoYWN0aXZlX2l0ZXIsIDApWzBdCisKKyMgVGhpcyBmdW5jdGlvbiBvcGVyYXRlcyB0byBwdWxsIGV2ZW50cyBvdXQgZnJvbSB0aGUgZXZlbnQgcXVldWUgYW5kIHRoZW4gcHVzaAorIyB0aGVtIGludG8gdGhlIFJ1bm5pbmdCdWlsZCAod2hpY2ggdGhlbiBkcml2ZXMgdGhlIFJ1bm5pbmdCdWlsZCB3aGljaCB0aGVuCisjIHB1c2hlcyB0aHJvdWdoIGFuZCB1cGRhdGVzIHRoZSBwcm9ncmVzcyB0cmVlIHZpZXcuKQorIworIyBUT0RPOiBTaG91bGQgYmUgYSBtZXRob2Qgb24gdGhlIFJ1bm5pbmdCdWlsZCBjbGFzcworZGVmIGV2ZW50X2hhbmRsZV90aW1lb3V0IChldmVudEhhbmRsZXIsIGJ1aWxkKToKKyAgICAjIENvbnN1bWUgYXMgbWFueSBtZXNzYWdlcyBhcyB3ZSBjYW4gLi4uCisgICAgZXZlbnQgPSBldmVudEhhbmRsZXIuZ2V0RXZlbnQoKQorICAgIHdoaWxlIGV2ZW50OgorICAgICAgICBidWlsZC5oYW5kbGVfZXZlbnQgKGV2ZW50KQorICAgICAgICBldmVudCA9IGV2ZW50SGFuZGxlci5nZXRFdmVudCgpCisgICAgcmV0dXJuIFRydWUKKworY2xhc3MgTWFpbldpbmRvdyAoZ3RrLldpbmRvdyk6CisKKyAgICAjIENhbGxiYWNrIHRoYXQgZ2V0cyBmaXJlZCB3aGVuIHRoZSB1c2VyIGhpdHMgYSBidXR0b24gaW4gdGhlCisgICAgIyBCdWlsZFNldHVwRGlhbG9nLgorICAgIGRlZiBidWlsZF9kaWFsb2dfYm94X3Jlc3BvbnNlX2NiIChzZWxmLCBkaWFsb2csIHJlc3BvbnNlX2lkKToKKyAgICAgICAgY29uZiA9IE5vbmUKKyAgICAgICAgaWYgKHJlc3BvbnNlX2lkID09IEJ1aWxkU2V0dXBEaWFsb2cuUkVTUE9OU0VfQlVJTEQpOgorICAgICAgICAgICAgZGlhbG9nLnVwZGF0ZV9jb25maWd1cmF0aW9uKCkKKyAgICAgICAgICAgIHByaW50KGRpYWxvZy5jb25maWd1cmF0aW9uLm1hY2hpbmUsIGRpYWxvZy5jb25maWd1cmF0aW9uLmRpc3RybywgXAorICAgICAgICAgICAgICAgIGRpYWxvZy5jb25maWd1cmF0aW9uLmltYWdlKQorICAgICAgICAgICAgY29uZiA9IGRpYWxvZy5jb25maWd1cmF0aW9uCisKKyAgICAgICAgZGlhbG9nLmRlc3Ryb3koKQorCisgICAgICAgIGlmIGNvbmY6CisgICAgICAgICAgICBzZWxmLm1hbmFnZXIuZG9fYnVpbGQgKGNvbmYpCisKKyAgICBkZWYgYnVpbGRfYnV0dG9uX2NsaWNrZWRfY2IgKHNlbGYsIGJ1dHRvbik6CisgICAgICAgIGRpYWxvZyA9IEJ1aWxkU2V0dXBEaWFsb2cgKCkKKworICAgICAgICAjIEZvciBzb21lIHVua25vd24gcmVhc29uIERpYWxvZy5ydW4gY2F1c2VzIG5pY2UgbGl0dGxlIGRlYWRsb2NrcyAuLi4gOi0oCisgICAgICAgIGRpYWxvZy5jb25uZWN0ICgicmVzcG9uc2UiLCBzZWxmLmJ1aWxkX2RpYWxvZ19ib3hfcmVzcG9uc2VfY2IpCisgICAgICAgIGRpYWxvZy5zaG93KCkKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZik6CisgICAgICAgIGd0ay5XaW5kb3cuX19pbml0X18gKHNlbGYpCisKKyAgICAgICAgIyBQdWxsIGluICpqdXN0KiB0aGUgbWFpbiB2Ym94IGZyb20gdGhlIEdsYWRlIFhNTCBkYXRhIGFuZCB0aGVuIHBhY2sKKyAgICAgICAgIyB0aGF0IGluc2lkZSB0aGUgd2luZG93CisgICAgICAgIGd4bWwgPSBndGsuZ2xhZGUuWE1MIChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pICsgIi9jcnVtYnMvcHVjY2hvLmdsYWRlIiwKKyAgICAgICAgICAgIHJvb3QgPSAibWFpbl93aW5kb3dfdmJveCIpCisgICAgICAgIHZib3ggPSBneG1sLmdldF93aWRnZXQgKCJtYWluX3dpbmRvd192Ym94IikKKyAgICAgICAgc2VsZi5hZGQgKHZib3gpCisKKyAgICAgICAgIyBDcmVhdGUgdGhlIHRyZWUgdmlld3MgZm9yIHRoZSBidWlsZCBtYW5hZ2VyIHZpZXcgYW5kIHRoZSBwcm9ncmVzcyB2aWV3CisgICAgICAgIHNlbGYuYnVpbGRfbWFuYWdlcl92aWV3ID0gQnVpbGRNYW5hZ2VyVHJlZVZpZXcoKQorICAgICAgICBzZWxmLnJ1bm5pbmdfYnVpbGRfdmlldyA9IFJ1bm5pbmdCdWlsZFRyZWVWaWV3KCkKKworICAgICAgICAjIEdyYWIgdGhlIHNjcm9sbGVkIHdpbmRvd3MgdGhhdCB3ZSBwdXQgdGhlIHRyZWUgdmlld3MgaW50bworICAgICAgICBzZWxmLnJlc3VsdHNfc2Nyb2xsZWR3aW5kb3cgPSBneG1sLmdldF93aWRnZXQgKCJyZXN1bHRzX3Njcm9sbGVkd2luZG93IikKKyAgICAgICAgc2VsZi5wcm9ncmVzc19zY3JvbGxlZHdpbmRvdyA9IGd4bWwuZ2V0X3dpZGdldCAoInByb2dyZXNzX3Njcm9sbGVkd2luZG93IikKKworICAgICAgICAjIFB1dCB0aGUgdHJlZSB2aWV3cyBpbnNpZGUgLi4uCisgICAgICAgIHNlbGYucmVzdWx0c19zY3JvbGxlZHdpbmRvdy5hZGQgKHNlbGYuYnVpbGRfbWFuYWdlcl92aWV3KQorICAgICAgICBzZWxmLnByb2dyZXNzX3Njcm9sbGVkd2luZG93LmFkZCAoc2VsZi5ydW5uaW5nX2J1aWxkX3ZpZXcpCisKKyAgICAgICAgIyBIb29rIHVwIHRoZSBidWlsZCBidXR0b24uLi4KKyAgICAgICAgc2VsZi5idWlsZF9idXR0b24gPSBneG1sLmdldF93aWRnZXQgKCJtYWluX3Rvb2xidXR0b25fYnVpbGQiKQorICAgICAgICBzZWxmLmJ1aWxkX2J1dHRvbi5jb25uZWN0ICgiY2xpY2tlZCIsIHNlbGYuYnVpbGRfYnV0dG9uX2NsaWNrZWRfY2IpCisKKyMgSSdtIG5vdCB2ZXJ5IGhhcHB5IGFib3V0IHRoZSBjdXJyZW50IG93bmVyc2hpcCBvZiB0aGUgUnVubmluZ0J1aWxkLiBJIGhhdmUKKyMgbXkgc3VzcGljaW9ucyB0aGF0IHRoaXMgb2JqZWN0IHNob3VsZCBiZSBoZWxkIGJ5IHRoZSBCdWlsZE1hbmFnZXIgc2luY2Ugd2UKKyMgY2FyZSBhYm91dCB0aGUgc2lnbmFscyBpbiB0aGUgbWFuYWdlcgorCitkZWYgcnVubmluZ19idWlsZF9zdWNjZWVkZWRfY2IgKHJ1bm5pbmdfYnVpbGQsIG1hbmFnZXIpOgorICAgICMgTm90aWZ5IHRoZSBtYW5hZ2VyIHRoYXQgYSBidWlsZCBoYXMgc3VjY2VlZGVkLiBUaGlzIGlzIG5lY2Vzc2FyeSBhcyBwYXJ0CisgICAgIyBvZiB0aGUgJ2hhY2snIHRoYXQgd2UgdXNlIGZvciBtYWtpbmcgdGhlIHJvdyBpbiB0aGUgbW9kZWwgLyB2aWV3CisgICAgIyByZXByZXNlbnRpbmcgdGhlIG9uZ29pbmcgYnVpbGQgY2hhbmdlIGludG8gYSByb3cgcmVwcmVzZW50aW5nIHRoZQorICAgICMgY29tcGxldGVkIGJ1aWxkLiBTaW5jZSB3ZSBrbm93IG9ubHkgb25lIGJ1aWxkIGNhbiBiZSBydW5uaW5nIGEgdGltZSB0aGVuCisgICAgIyB3ZSBjYW4gaGFuZGxlIHRoaXMuCisKKyAgICAjIEZJWE1FOiBSZWZhY3RvciBhbGwgdGhpcyBzbyB0aGF0IHRoZSBSdW5uaW5nQnVpbGQgaXMgb3duZWQgYnkgdGhlCisgICAgIyBCdWlsZE1hbmFnZXIuIEl0IGNhbiB0aGVuIGhvb2sgb250byB0aGUgc2lnbmFscyBkaXJlY3RseSBhbmQgZHJpdmUKKyAgICAjIGludGVyZXN0aW5nIHRoaW5ncyBpdCBjYXJlcyBhYm91dC4KKyAgICBtYW5hZ2VyLm5vdGlmeV9idWlsZF9zdWNjZWVkZWQgKCkKKyAgICBwcmludCgiYnVpbGQgc3VjY2VlZGVkIikKKworZGVmIHJ1bm5pbmdfYnVpbGRfZmFpbGVkX2NiIChydW5uaW5nX2J1aWxkLCBtYW5hZ2VyKToKKyAgICAjIEFzIGFib3ZlCisgICAgcHJpbnQoImJ1aWxkIGZhaWxlZCIpCisgICAgbWFuYWdlci5ub3RpZnlfYnVpbGRfZmFpbGVkICgpCisKK2RlZiBtYWluIChzZXJ2ZXIsIGV2ZW50SGFuZGxlcik6CisgICAgIyBJbml0aWFsaXNlIHRocmVhZGluZy4uLgorICAgIGdvYmplY3QudGhyZWFkc19pbml0KCkKKyAgICBndGsuZ2RrLnRocmVhZHNfaW5pdCgpCisKKyAgICBtYWluX3dpbmRvdyA9IE1haW5XaW5kb3cgKCkKKyAgICBtYWluX3dpbmRvdy5zaG93X2FsbCAoKQorCisgICAgIyBTZXQgdXAgdGhlIGJ1aWxkIG1hbmFnZXIgc3R1ZmYgaW4gZ2VuZXJhbAorICAgIGJ1aWxkc19kaXIgPSBvcy5wYXRoLmpvaW4gKG9zLmdldGN3ZCgpLCAgInJlc3VsdHMiKQorICAgIG1hbmFnZXIgPSBCdWlsZE1hbmFnZXIgKHNlcnZlciwgYnVpbGRzX2RpcikKKyAgICBtYWluX3dpbmRvdy5idWlsZF9tYW5hZ2VyX3ZpZXcuc2V0X21vZGVsIChtYW5hZ2VyLm1vZGVsKQorCisgICAgIyBEbyB0aGUgcnVubmluZyBidWlsZCBzZXR1cAorICAgIHJ1bm5pbmdfYnVpbGQgPSBSdW5uaW5nQnVpbGQgKCkKKyAgICBtYWluX3dpbmRvdy5ydW5uaW5nX2J1aWxkX3ZpZXcuc2V0X21vZGVsIChydW5uaW5nX2J1aWxkLm1vZGVsKQorICAgIHJ1bm5pbmdfYnVpbGQuY29ubmVjdCAoImJ1aWxkLXN1Y2NlZWRlZCIsIHJ1bm5pbmdfYnVpbGRfc3VjY2VlZGVkX2NiLAorICAgICAgICBtYW5hZ2VyKQorICAgIHJ1bm5pbmdfYnVpbGQuY29ubmVjdCAoImJ1aWxkLWZhaWxlZCIsIHJ1bm5pbmdfYnVpbGRfZmFpbGVkX2NiLCBtYW5hZ2VyKQorCisgICAgIyBXZSBuZWVkIHRvIHNhdmUgdGhlIG1hbmFnZXIgaW50byB0aGUgTWFpbldpbmRvdyBzbyB0aGF0IHRoZSB0b29sYmFyCisgICAgIyBidXR0b24gY2FuIHVzZSBpdC4KKyAgICAjIEZJWE1FOiBSZWZhY3RvciA/CisgICAgbWFpbl93aW5kb3cubWFuYWdlciA9IG1hbmFnZXIKKworICAgICMgVXNlIGEgdGltZW91dCBmdW5jdGlvbiBmb3IgcHJvYmluZyB0aGUgZXZlbnQgcXVldWUgdG8gZmluZCBvdXQgaWYgd2UKKyAgICAjIGhhdmUgYSBtZXNzYWdlIHdhaXRpbmcgZm9yIHVzLgorICAgIGdvYmplY3QudGltZW91dF9hZGQgKDIwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF9oYW5kbGVfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBldmVudEhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZ19idWlsZCkKKworICAgIGd0ay5tYWluKCkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL3RvYXN0ZXJ1aS5weSBiL2JpdGJha2UvbGliL2JiL3VpL3RvYXN0ZXJ1aS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzdlODdkCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvdG9hc3RlcnVpLnB5CkBAIC0wLDAgKzEsMzU1IEBACisjCisjIEJpdEJha2UgVG9hc3RlclVJIEltcGxlbWVudGF0aW9uCisjIGJhc2VkIG9uIChObylUVFkgVUkgSW1wbGVtZW50YXRpb24gYnkgUmljaGFyZCBQdXJkaWUKKyMKKyMgSGFuZGxpbmcgb3V0cHV0IHRvIFRUWXMgb3IgZmlsZXMgKG5vIFRUWSkKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA2LTIwMTIgUmljaGFyZCBQdXJkaWUKKyMgQ29weXJpZ2h0IChDKSAyMDEzICAgICAgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24KK2ltcG9ydCBzeXMKK3RyeToKKyAgICBpbXBvcnQgYmIKK2V4Y2VwdCBSdW50aW1lRXJyb3IgYXMgZXhjOgorICAgIHN5cy5leGl0KHN0cihleGMpKQorCitmcm9tIGJiLnVpIGltcG9ydCB1aWhlbHBlcgorZnJvbSBiYi51aS5idWlsZGluZm9oZWxwZXIgaW1wb3J0IEJ1aWxkSW5mb0hlbHBlcgorCitpbXBvcnQgYmIubXNnCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9zCisKKyMgcHlsaW50OiBkaXNhYmxlPWludmFsaWQtbmFtZQorIyBtb2R1bGUgcHJvcGVydGllcyBmb3IgVUkgbW9kdWxlcyBhcmUgcmVhZCBieSBiaXRiYWtlIGFuZCB0aGUgY29udHJhY3Qgc2hvdWxkIG5vdCBiZSBicm9rZW4KKworCitmZWF0dXJlU2V0ID0gW2JiLmNvb2tlci5Db29rZXJGZWF0dXJlcy5IT0JfRVhUUkFfQ0FDSEVTLCBiYi5jb29rZXIuQ29va2VyRmVhdHVyZXMuU0VORF9ERVBFTkRTX1RSRUUsIGJiLmNvb2tlci5Db29rZXJGZWF0dXJlcy5CQVNFREFUQVNUT1JFX1RSQUNLSU5HLCBiYi5jb29rZXIuQ29va2VyRmVhdHVyZXMuU0VORF9TQU5JVFlFVkVOVFNdCisKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJUb2FzdGVyTG9nZ2VyIikKK2ludGVyYWN0aXZlID0gc3lzLnN0ZG91dC5pc2F0dHkoKQorCisKKworZGVmIF9sb2dfc2V0dGluZ3NfZnJvbV9zZXJ2ZXIoc2VydmVyKToKKyAgICAjIEdldCB2YWx1ZXMgb2YgdmFyaWFibGVzIHdoaWNoIGNvbnRyb2wgb3VyIG91dHB1dAorICAgIGluY2x1ZGVsb2dzLCBlcnJvciA9IHNlcnZlci5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiQkJJTkNMVURFTE9HUyJdKQorICAgIGlmIGVycm9yOgorICAgICAgICBsb2dnZXIuZXJyb3IoIlVuYWJsZSB0byBnZXQgdGhlIHZhbHVlIG9mIEJCSU5DTFVERUxPR1MgdmFyaWFibGU6ICVzIiwgZXJyb3IpCisgICAgICAgIHJhaXNlIEJhc2VFeGNlcHRpb24oZXJyb3IpCisgICAgbG9nbGluZXMsIGVycm9yID0gc2VydmVyLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJCQklOQ0xVREVMT0dTX0xJTkVTIl0pCisgICAgaWYgZXJyb3I6CisgICAgICAgIGxvZ2dlci5lcnJvcigiVW5hYmxlIHRvIGdldCB0aGUgdmFsdWUgb2YgQkJJTkNMVURFTE9HU19MSU5FUyB2YXJpYWJsZTogJXMiLCBlcnJvcikKKyAgICAgICAgcmFpc2UgQmFzZUV4Y2VwdGlvbihlcnJvcikKKyAgICBjb25zb2xlbG9nZmlsZSwgZXJyb3IgPSBzZXJ2ZXIucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIkJCX0NPTlNPTEVMT0ciXSkKKyAgICBpZiBlcnJvcjoKKyAgICAgICAgbG9nZ2VyLmVycm9yKCJVbmFibGUgdG8gZ2V0IHRoZSB2YWx1ZSBvZiBCQl9DT05TT0xFTE9HIHZhcmlhYmxlOiAlcyIsIGVycm9yKQorICAgICAgICByYWlzZSBCYXNlRXhjZXB0aW9uKGVycm9yKQorICAgIHJldHVybiBpbmNsdWRlbG9ncywgbG9nbGluZXMsIGNvbnNvbGVsb2dmaWxlCisKKworZGVmIG1haW4oc2VydmVyLCBldmVudEhhbmRsZXIsIHBhcmFtcyApOgorICAgIGhlbHBlciA9IHVpaGVscGVyLkJCVUlIZWxwZXIoKQorCisgICAgY29uc29sZSA9IGxvZ2dpbmcuU3RyZWFtSGFuZGxlcihzeXMuc3Rkb3V0KQorICAgIGZvcm1hdF9zdHIgPSAiJShsZXZlbG5hbWUpczogJShtZXNzYWdlKXMiCisgICAgZm9ybWF0dGVyID0gYmIubXNnLkJCTG9nRm9ybWF0dGVyKGZvcm1hdF9zdHIpCisgICAgYmIubXNnLmFkZERlZmF1bHRsb2dGaWx0ZXIoY29uc29sZSkKKyAgICBjb25zb2xlLnNldEZvcm1hdHRlcihmb3JtYXR0ZXIpCisgICAgbG9nZ2VyLmFkZEhhbmRsZXIoY29uc29sZSkKKyAgICBsb2dnZXIuc2V0TGV2ZWwobG9nZ2luZy5JTkZPKQorCisgICAgXywgXywgY29uc29sZWxvZ2ZpbGUgPSBfbG9nX3NldHRpbmdzX2Zyb21fc2VydmVyKHNlcnZlcikKKworICAgICMgdmVyaWZ5IGFuZCB3YXJuCisgICAgYnVpbGRfaGlzdG9yeV9lbmFibGVkID0gVHJ1ZQorICAgIGluaGVyaXRsaXN0LCBfID0gc2VydmVyLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJJTkhFUklUIl0pCisKKyAgICBpZiBub3QgImJ1aWxkaGlzdG9yeSIgaW4gaW5oZXJpdGxpc3Quc3BsaXQoIiAiKToKKyAgICAgICAgbG9nZ2VyLndhcm4oImJ1aWxkaGlzdG9yeSBpcyBub3QgZW5hYmxlZC4gUGxlYXNlIGVuYWJsZSBJTkhFUklUICs9IFwiYnVpbGRoaXN0b3J5XCIgdG8gc2VlIGltYWdlIGRldGFpbHMuIikKKyAgICAgICAgYnVpbGRfaGlzdG9yeV9lbmFibGVkID0gRmFsc2UKKworICAgIGlmIG5vdCBwYXJhbXMub2JzZXJ2ZV9vbmx5OgorICAgICAgICBsb2dnZXIuZXJyb3IoIlRvYXN0ZXJVSSBjYW4gb25seSB3b3JrIGluIG9ic2VydmVyIG1vZGUiKQorICAgICAgICByZXR1cm4gMQorCisKKyAgICBtYWluLnNodXRkb3duID0gMAorICAgIGludGVycnVwdGVkID0gRmFsc2UKKyAgICByZXR1cm5fdmFsdWUgPSAwCisgICAgZXJyb3JzID0gMAorICAgIHdhcm5pbmdzID0gMAorICAgIHRhc2tmYWlsdXJlcyA9IFtdCisgICAgZmlyc3QgPSBUcnVlCisKKyAgICBidWlsZGluZm9oZWxwZXIgPSBCdWlsZEluZm9IZWxwZXIoc2VydmVyLCBidWlsZF9oaXN0b3J5X2VuYWJsZWQpCisKKyAgICBpZiBidWlsZGluZm9oZWxwZXIuYnJiZSBpcyBub3QgTm9uZSBhbmQgY29uc29sZWxvZ2ZpbGU6CisgICAgICAgICMgaWYgd2UgYXJlIHVuZGVyIG1hbmFnZWQgbW9kZSB3ZSBoYXZlIG5vIG90aGVyIFVJIGFuZCB3ZSBuZWVkIHRvIHdyaXRlIG91ciBvd24gZmlsZQorICAgICAgICBiYi51dGlscy5ta2RpcmhpZXIob3MucGF0aC5kaXJuYW1lKGNvbnNvbGVsb2dmaWxlKSkKKyAgICAgICAgY29ubG9nZm9ybWF0ID0gYmIubXNnLkJCTG9nRm9ybWF0dGVyKGZvcm1hdF9zdHIpCisgICAgICAgIGNvbnNvbGVsb2cgPSBsb2dnaW5nLkZpbGVIYW5kbGVyKGNvbnNvbGVsb2dmaWxlKQorICAgICAgICBiYi5tc2cuYWRkRGVmYXVsdGxvZ0ZpbHRlcihjb25zb2xlbG9nKQorICAgICAgICBjb25zb2xlbG9nLnNldEZvcm1hdHRlcihjb25sb2dmb3JtYXQpCisgICAgICAgIGxvZ2dlci5hZGRIYW5kbGVyKGNvbnNvbGVsb2cpCisKKworICAgIHdoaWxlIFRydWU6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGV2ZW50ID0gZXZlbnRIYW5kbGVyLndhaXRFdmVudCgwLjI1KQorICAgICAgICAgICAgaWYgZmlyc3Q6CisgICAgICAgICAgICAgICAgZmlyc3QgPSBGYWxzZQorICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJUb2FzdGVyVUkgd2FpdGluZyBmb3IgZXZlbnRzIikKKworICAgICAgICAgICAgaWYgZXZlbnQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBpZiBtYWluLnNodXRkb3duID4gMDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBoZWxwZXIuZXZlbnRIYW5kbGVyKGV2ZW50KQorCisgICAgICAgICAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgICAgICAgICAjIHRoZSBjb2RlIHdpbGwgbG9vayBpbnRvIHRoZSBwcm90ZWN0ZWQgdmFyaWFibGVzIG9mIHRoZSBldmVudDsgbm8gZWFzeSB3YXkgYXJvdW5kIHRoaXMKKworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuQnVpbGRTdGFydGVkKToKKyAgICAgICAgICAgICAgICBidWlsZGluZm9oZWxwZXIuc3RvcmVfc3RhcnRlZF9idWlsZChldmVudCkKKworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgKGJiLmJ1aWxkLlRhc2tTdGFydGVkLCBiYi5idWlsZC5UYXNrU3VjY2VlZGVkLCBiYi5idWlsZC5UYXNrRmFpbGVkU2lsZW50KSk6CisgICAgICAgICAgICAgICAgYnVpbGRpbmZvaGVscGVyLnVwZGF0ZV9hbmRfc3RvcmVfdGFzayhldmVudCkKKyAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiTG9nZmlsZSBmb3IgdGFzayAlcyIsIGV2ZW50LmxvZ2ZpbGUpCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuYnVpbGQuVGFza0Jhc2UpOgorICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGV2ZW50Ll9tZXNzYWdlKQorCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5Mb2dFeGVjVFRZKToKKyAgICAgICAgICAgICAgICBsb2dnZXIud2FybihldmVudC5tc2cpCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgbG9nZ2luZy5Mb2dSZWNvcmQpOgorICAgICAgICAgICAgICAgIGlmIGV2ZW50LmxldmVsbm8gPT0gLTE6CisgICAgICAgICAgICAgICAgICAgIGV2ZW50LmxldmVsbm8gPSBmb3JtYXR0ZXIuRVJST1IKKworICAgICAgICAgICAgICAgIGJ1aWxkaW5mb2hlbHBlci5zdG9yZV9sb2dfZXZlbnQoZXZlbnQpCisgICAgICAgICAgICAgICAgaWYgZXZlbnQubGV2ZWxubyA+PSBmb3JtYXR0ZXIuRVJST1I6CisgICAgICAgICAgICAgICAgICAgIGVycm9ycyA9IGVycm9ycyArIDEKKyAgICAgICAgICAgICAgICBlbGlmIGV2ZW50LmxldmVsbm8gPT0gZm9ybWF0dGVyLldBUk5JTkc6CisgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzID0gd2FybmluZ3MgKyAxCisgICAgICAgICAgICAgICAgIyBGb3IgIm5vcm1hbCIgbG9nZ2luZyBjb25kaXRpb25zLCBkb24ndCBzaG93IG5vdGUgbG9ncyBmcm9tIHRhc2tzCisgICAgICAgICAgICAgICAgIyBidXQgZG8gc2hvdyB0aGVtIGlmIHRoZSB1c2VyIGhhcyBjaGFuZ2VkIHRoZSBkZWZhdWx0IGxvZyBsZXZlbCB0bworICAgICAgICAgICAgICAgICMgaW5jbHVkZSB2ZXJib3NlL2RlYnVnIG1lc3NhZ2VzCisgICAgICAgICAgICAgICAgaWYgZXZlbnQudGFza3BpZCAhPSAwIGFuZCBldmVudC5sZXZlbG5vIDw9IGZvcm1hdHRlci5OT1RFOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgbG9nZ2VyLmhhbmRsZShldmVudCkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5idWlsZC5UYXNrRmFpbGVkKToKKyAgICAgICAgICAgICAgICBidWlsZGluZm9oZWxwZXIudXBkYXRlX2FuZF9zdG9yZV90YXNrKGV2ZW50KQorICAgICAgICAgICAgICAgIGxvZ2ZpbGUgPSBldmVudC5sb2dmaWxlCisgICAgICAgICAgICAgICAgaWYgbG9nZmlsZSBhbmQgb3MucGF0aC5leGlzdHMobG9nZmlsZSk6CisgICAgICAgICAgICAgICAgICAgIGJiLmVycm9yKCJMb2dmaWxlIG9mIGZhaWx1cmUgc3RvcmVkIGluOiAlcyIgJSBsb2dmaWxlKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICMgdGhlc2UgZXZlbnRzIGFyZSB1bnByb2Nlc3NlZCBub3csIGJ1dCBtYXkgYmUgdXNlZCBpbiB0aGUgZnV0dXJlIHRvIGxvZworICAgICAgICAgICAgIyB0aW1pbmcgYW5kIGVycm9yIGluZm9ybWF0aW9ucyBmcm9tIHRoZSBwYXJzaW5nIHBoYXNlIGluIFRvYXN0ZXIKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIChiYi5ldmVudC5TYW5pdHlDaGVja1Bhc3NlZCwgYmIuZXZlbnQuU2FuaXR5Q2hlY2spKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuUGFyc2VTdGFydGVkKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuUGFyc2VQcm9ncmVzcyk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LlBhcnNlQ29tcGxldGVkKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuQ2FjaGVMb2FkU3RhcnRlZCk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LkNhY2hlTG9hZFByb2dyZXNzKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuQ2FjaGVMb2FkQ29tcGxldGVkKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuTXVsdGlwbGVQcm92aWRlcnMpOgorICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJtdWx0aXBsZSBwcm92aWRlcnMgYXJlIGF2YWlsYWJsZSBmb3IgJXMlcyAoJXMpIiwgZXZlbnQuX2lzX3J1bnRpbWUgYW5kICJydW50aW1lICIgb3IgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuX2l0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgIi5qb2luKGV2ZW50Ll9jYW5kaWRhdGVzKSkKKyAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiY29uc2lkZXIgZGVmaW5pbmcgYSBQUkVGRVJSRURfUFJPVklERVIgZW50cnkgdG8gbWF0Y2ggJXMiLCBldmVudC5faXRlbSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5Ob1Byb3ZpZGVyKToKKyAgICAgICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMgKyAxCisgICAgICAgICAgICAgICAgaWYgZXZlbnQuX3J1bnRpbWU6CisgICAgICAgICAgICAgICAgICAgIHIgPSAiUiIKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByID0gIiIKKworICAgICAgICAgICAgICAgIGlmIGV2ZW50Ll9kZXBlbmRlZXM6CisgICAgICAgICAgICAgICAgICAgIHRleHQgPSAiTm90aGluZyAlc1BST1ZJREVTICclcycgKGJ1dCAlcyAlc0RFUEVORFMgb24gb3Igb3RoZXJ3aXNlIHJlcXVpcmVzIGl0KSIgJSAociwgZXZlbnQuX2l0ZW0sICIsICIuam9pbihldmVudC5fZGVwZW5kZWVzKSwgcikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gIk5vdGhpbmcgJXNQUk9WSURFUyAnJXMnIiAlIChyLCBldmVudC5faXRlbSkKKworICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcih0ZXh0KQorICAgICAgICAgICAgICAgIGlmIGV2ZW50Ll9yZWFzb25zOgorICAgICAgICAgICAgICAgICAgICBmb3IgcmVhc29uIGluIGV2ZW50Ll9yZWFzb25zOgorICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCIlcyIsIHJlYXNvbikKKyAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gcmVhc29uCisgICAgICAgICAgICAgICAgYnVpbGRpbmZvaGVscGVyLnN0b3JlX2xvZ19lcnJvcih0ZXh0KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LkNvbmZpZ1BhcnNlZCk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LlJlY2lwZVBhcnNlZCk6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgIyBlbmQgb2Ygc2F2ZWQgZXZlbnRzCisKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIChiYi5ydW5xdWV1ZS5zY2VuZVF1ZXVlVGFza1N0YXJ0ZWQsIGJiLnJ1bnF1ZXVlLnJ1blF1ZXVlVGFza1N0YXJ0ZWQsIGJiLnJ1bnF1ZXVlLnJ1blF1ZXVlVGFza1NraXBwZWQpKToKKyAgICAgICAgICAgICAgICBidWlsZGluZm9oZWxwZXIuc3RvcmVfc3RhcnRlZF90YXNrKGV2ZW50KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLnJ1bnF1ZXVlLnJ1blF1ZXVlVGFza0NvbXBsZXRlZCk6CisgICAgICAgICAgICAgICAgYnVpbGRpbmZvaGVscGVyLnVwZGF0ZV9hbmRfc3RvcmVfdGFzayhldmVudCkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ydW5xdWV1ZS5ydW5RdWV1ZVRhc2tGYWlsZWQpOgorICAgICAgICAgICAgICAgIGJ1aWxkaW5mb2hlbHBlci51cGRhdGVfYW5kX3N0b3JlX3Rhc2soZXZlbnQpCisgICAgICAgICAgICAgICAgdGFza2ZhaWx1cmVzLmFwcGVuZChldmVudC50YXNrc3RyaW5nKQorICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiVGFzayAlcyAoJXMpIGZhaWxlZCB3aXRoIGV4aXQgY29kZSAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQudGFza2lkLCBldmVudC50YXNrc3RyaW5nLCBldmVudC5leGl0Y29kZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCAoYmIucnVucXVldWUuc2NlbmVRdWV1ZVRhc2tDb21wbGV0ZWQsIGJiLnJ1bnF1ZXVlLnNjZW5lUXVldWVUYXNrRmFpbGVkKSk6CisgICAgICAgICAgICAgICAgYnVpbGRpbmZvaGVscGVyLnVwZGF0ZV9hbmRfc3RvcmVfdGFzayhldmVudCkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIChiYi5ldmVudC5UcmVlRGF0YVByZXBhcmF0aW9uU3RhcnRlZCwgYmIuZXZlbnQuVHJlZURhdGFQcmVwYXJhdGlvbkNvbXBsZXRlZCkpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIChiYi5ldmVudC5CdWlsZENvbXBsZXRlZCwgYmIuY29tbWFuZC5Db21tYW5kRmFpbGVkKSk6CisKKyAgICAgICAgICAgICAgICBlcnJvcmNvZGUgPSAwCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuY29tbWFuZC5Db21tYW5kRmFpbGVkKToKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JzICs9IDEKKyAgICAgICAgICAgICAgICAgICAgZXJyb3Jjb2RlID0gMQorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIkNvbW1hbmQgZXhlY3V0aW9uIGZhaWxlZDogJXMiLCBldmVudC5lcnJvcikKKworICAgICAgICAgICAgICAgICMgdXBkYXRlIHRoZSBidWlsZCBpbmZvIGhlbHBlciBvbiBCdWlsZENvbXBsZXRlZCwgbm90IG9uIENvbW1hbmRYWFgKKyAgICAgICAgICAgICAgICBidWlsZGluZm9oZWxwZXIudXBkYXRlX2J1aWxkX2luZm9ybWF0aW9uKGV2ZW50LCBlcnJvcnMsIHdhcm5pbmdzLCB0YXNrZmFpbHVyZXMpCisgICAgICAgICAgICAgICAgYnVpbGRpbmZvaGVscGVyLmNsb3NlKGVycm9yY29kZSkKKyAgICAgICAgICAgICAgICAjIG1hcmsgdGhlIGxvZyBvdXRwdXQ7IGNvbnRyb2xsZXJzIG1heSBraWxsIHRoZSB0b2FzdGVyVUkgYWZ0ZXIgc2VlaW5nIHRoaXMgbG9nCisgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIlRvYXN0ZXJVSSBidWlsZCBkb25lIDEsIGJyYmU6ICVzIiwgYnVpbGRpbmZvaGVscGVyLmJyYmUgKQorCisgICAgICAgICAgICAgICAgIyB3ZSBzdGFydCBhIG5ldyBidWlsZCBpbmZvCisgICAgICAgICAgICAgICAgaWYgYnVpbGRpbmZvaGVscGVyLmJyYmUgaXMgbm90IE5vbmU6CisKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJUb2FzdGVyVUkgdW5kZXIgQnVpbGRFbnZpcm9ubWVudCBtYW5hZ2VtZW50IC0gZXhpdGluZyBhZnRlciB0aGUgYnVpbGQiKQorICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIudGVybWluYXRlU2VydmVyKCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoIlRvYXN0ZXJVSSBwcmVwYXJlZCBmb3IgbmV3IGJ1aWxkIikKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gMAorICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncyA9IDAKKyAgICAgICAgICAgICAgICAgICAgdGFza2ZhaWx1cmVzID0gW10KKyAgICAgICAgICAgICAgICAgICAgYnVpbGRpbmZvaGVscGVyID0gQnVpbGRJbmZvSGVscGVyKHNlcnZlciwgYnVpbGRfaGlzdG9yeV9lbmFibGVkKQorCisgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIlRvYXN0ZXJVSSBidWlsZCBkb25lIDIiKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIChiYi5jb21tYW5kLkNvbW1hbmRDb21wbGV0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmIuY29tbWFuZC5Db21tYW5kRmFpbGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiLmNvbW1hbmQuQ29tbWFuZEV4aXQpKToKKyAgICAgICAgICAgICAgICBlcnJvcmNvZGUgPSAwCisKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5NZXRhZGF0YUV2ZW50KToKKyAgICAgICAgICAgICAgICBpZiBldmVudC50eXBlID09ICJTaW5nbGVQYWNrYWdlSW5mbyI6CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkaW5mb2hlbHBlci5zdG9yZV9idWlsZF9wYWNrYWdlX2luZm9ybWF0aW9uKGV2ZW50KQorICAgICAgICAgICAgICAgIGVsaWYgZXZlbnQudHlwZSA9PSAiTGF5ZXJJbmZvIjoKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRpbmZvaGVscGVyLnN0b3JlX2xheWVyX2luZm8oZXZlbnQpCisgICAgICAgICAgICAgICAgZWxpZiBldmVudC50eXBlID09ICJCdWlsZFN0YXRzTGlzdCI6CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkaW5mb2hlbHBlci5zdG9yZV90YXNrc19zdGF0cyhldmVudCkKKyAgICAgICAgICAgICAgICBlbGlmIGV2ZW50LnR5cGUgPT0gIkltYWdlUGtnTGlzdCI6CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkaW5mb2hlbHBlci5zdG9yZV90YXJnZXRfcGFja2FnZV9kYXRhKGV2ZW50KQorICAgICAgICAgICAgICAgIGVsaWYgZXZlbnQudHlwZSA9PSAiTWlzc2VkU3N0YXRlIjoKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRpbmZvaGVscGVyLnN0b3JlX21pc3NlZF9zdGF0ZV90YXNrcyhldmVudCkKKyAgICAgICAgICAgICAgICBlbGlmIGV2ZW50LnR5cGUgPT0gIkltYWdlRmlsZVNpemUiOgorICAgICAgICAgICAgICAgICAgICBidWlsZGluZm9oZWxwZXIudXBkYXRlX3RhcmdldF9pbWFnZV9maWxlKGV2ZW50KQorICAgICAgICAgICAgICAgIGVsaWYgZXZlbnQudHlwZSA9PSAiQXJ0aWZhY3RGaWxlU2l6ZSI6CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkaW5mb2hlbHBlci51cGRhdGVfYXJ0aWZhY3RfaW1hZ2VfZmlsZShldmVudCkKKyAgICAgICAgICAgICAgICBlbGlmIGV2ZW50LnR5cGUgPT0gIkxpY2Vuc2VNYW5pZmVzdFBhdGgiOgorICAgICAgICAgICAgICAgICAgICBidWlsZGluZm9oZWxwZXIuc3RvcmVfbGljZW5zZV9tYW5pZmVzdF9wYXRoKGV2ZW50KQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiVW5wcm9jZXNzZWQgTWV0YWRhdGFFdmVudCAlcyAiLCBzdHIoZXZlbnQpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmNvb2tlci5Db29rZXJFeGl0KToKKyAgICAgICAgICAgICAgICAjIGV4aXQgd2hlbiB0aGUgc2VydmVyIGV4aXRzCisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgIyBpZ25vcmUKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIChiYi5ldmVudC5CdWlsZEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmIuZXZlbnQuU3RhbXBVcGRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmIuZXZlbnQuUmVjaXBlUHJlRmluYWxpc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmIucnVucXVldWUucnVuUXVldWVFdmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYi5ydW5xdWV1ZS5ydW5RdWV1ZUV4aXRXYWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiLmV2ZW50Lk9wZXJhdGlvblByb2dyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiLmNvbW1hbmQuQ29tbWFuZEZhaWxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYi5jb21tYW5kLkNvbW1hbmRFeGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiLmNvbW1hbmQuQ29tbWFuZENvbXBsZXRlZCkpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LkRlcFRyZWVHZW5lcmF0ZWQpOgorICAgICAgICAgICAgICAgIGJ1aWxkaW5mb2hlbHBlci5zdG9yZV9kZXBlbmRlbmN5X2luZm9ybWF0aW9uKGV2ZW50KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiVW5rbm93biBldmVudDogJXMiLCBldmVudCkKKyAgICAgICAgICAgIHJldHVybl92YWx1ZSArPSAxCisKKyAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3IgYXMgaW9lcnJvcjoKKyAgICAgICAgICAgICMgaWdub3JlIGludGVycnVwdGVkIGlvCisgICAgICAgICAgICBpZiBpb2Vycm9yLmFyZ3NbMF0gPT0gNDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgIG1haW4uc2h1dGRvd24gPSAxCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgICMgcHJpbnQgZXJyb3JzIHRvIGxvZworICAgICAgICAgICAgaW1wb3J0IHRyYWNlYmFjaworICAgICAgICAgICAgZnJvbSBwcHJpbnQgaW1wb3J0IHBmb3JtYXQKKyAgICAgICAgICAgIGV4Y2VwdGlvbl9kYXRhID0gdHJhY2ViYWNrLmZvcm1hdF9leGMoKQorICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCIlc1xuJXMiICwgZSwgZXhjZXB0aW9uX2RhdGEpCisKKyAgICAgICAgICAgIF8sIF8sIHRiID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgICAgIGlmIHRiIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGN1cnIgPSB0YgorICAgICAgICAgICAgICAgIHdoaWxlIGN1cnIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJFcnJvciBkYXRhIGR1bXAgJXNcbiVzXG4iICwgdHJhY2ViYWNrLmZvcm1hdF90YihjdXJyLDEpLCBwZm9ybWF0KGN1cnIudGJfZnJhbWUuZl9sb2NhbHMpKQorICAgICAgICAgICAgICAgICAgICBjdXJyID0gY3Vyci50Yl9uZXh0CisKKyAgICAgICAgICAgICMgc2F2ZSB0aGVtIHRvIGRhdGFiYXNlLCBpZiBwb3NzaWJsZTsgaWYgaXQgZmFpbHMsIHdlIGFscmVhZHkgbG9nZ2VkIHRvIGNvbnNvbGUuCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgYnVpbGRpbmZvaGVscGVyLnN0b3JlX2xvZ19leGNlcHRpb24oIiVzXG4lcyIgJSAoc3RyKGUpLCBleGNlcHRpb25fZGF0YSkpCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGNlOgorICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiQ1JJVElDQUwgLSBGYWlsZWQgdG8gdG8gc2F2ZSB0b2FzdGVyIGV4Y2VwdGlvbiB0byB0aGUgZGF0YWJhc2U6ICVzIiwgc3RyKGNlKSkKKworICAgICAgICAgICAgIyBtYWtlIHN1cmUgd2UgcmV0dXJuIHdpdGggYW4gZXJyb3IKKyAgICAgICAgICAgIHJldHVybl92YWx1ZSArPSAxCisKKyAgICBpZiBpbnRlcnJ1cHRlZDoKKyAgICAgICAgaWYgcmV0dXJuX3ZhbHVlID09IDA6CisgICAgICAgICAgICByZXR1cm5fdmFsdWUgKz0gMQorCisgICAgbG9nZ2VyLndhcm4oIlJldHVybiB2YWx1ZSBpcyAlZCIsIHJldHVybl92YWx1ZSkKKyAgICByZXR1cm4gcmV0dXJuX3ZhbHVlCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi91aS91aWV2ZW50LnB5IGIvYml0YmFrZS9saWIvYmIvdWkvdWlldmVudC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmM1MGM3Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvdWlldmVudC5weQpAQCAtMCwwICsxLDE1NSBAQAorIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA2IC0gMjAwNyAgTWljaGFlbCAnTWlja2V5JyBMYXVlcgorIyBDb3B5cmlnaHQgKEMpIDIwMDYgLSAyMDA3ICBSaWNoYXJkIFB1cmRpZQorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworCisiIiIKK1VzZSB0aGlzIGNsYXNzIHRvIGZvcmsgb2ZmIGEgdGhyZWFkIHRvIHJlY2lldmUgZXZlbnQgY2FsbGJhY2tzIGZyb20gdGhlIGJpdGJha2UKK3NlcnZlciBhbmQgcXVldWUgdGhlbSBmb3IgdGhlIFVJIHRvIHByb2Nlc3MuIFRoaXMgcHJvY2VzcyBtdXN0IGJlIHVzZWQgdG8gYXZvaWQKK2NsaWVudC9zZXJ2ZXIgZGVhZGxvY2tzLgorIiIiCisKK2ltcG9ydCBzb2NrZXQsIHRocmVhZGluZywgcGlja2xlCitmcm9tIFNpbXBsZVhNTFJQQ1NlcnZlciBpbXBvcnQgU2ltcGxlWE1MUlBDU2VydmVyLCBTaW1wbGVYTUxSUENSZXF1ZXN0SGFuZGxlcgorCitjbGFzcyBCQlVJRXZlbnRRdWV1ZToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgQkJTZXJ2ZXIsIGNsaWVudGluZm89KCJsb2NhbGhvc3QsIDAiKSk6CisKKyAgICAgICAgc2VsZi5ldmVudFF1ZXVlID0gW10KKyAgICAgICAgc2VsZi5ldmVudFF1ZXVlTG9jayA9IHRocmVhZGluZy5Mb2NrKCkKKyAgICAgICAgc2VsZi5ldmVudFF1ZXVlTm90aWZ5ID0gdGhyZWFkaW5nLkV2ZW50KCkKKworICAgICAgICBzZWxmLkJCU2VydmVyID0gQkJTZXJ2ZXIKKyAgICAgICAgc2VsZi5jbGllbnRpbmZvID0gY2xpZW50aW5mbworCisgICAgICAgIHNlcnZlciA9IFVJWE1MUlBDU2VydmVyKHNlbGYuY2xpZW50aW5mbykKKyAgICAgICAgc2VsZi5ob3N0LCBzZWxmLnBvcnQgPSBzZXJ2ZXIuc29ja2V0LmdldHNvY2tuYW1lKCkKKworICAgICAgICBzZXJ2ZXIucmVnaXN0ZXJfZnVuY3Rpb24oIHNlbGYuc3lzdGVtX3F1aXQsICJldmVudC5xdWl0IiApCisgICAgICAgIHNlcnZlci5yZWdpc3Rlcl9mdW5jdGlvbiggc2VsZi5zZW5kX2V2ZW50LCAiZXZlbnQuc2VuZHBpY2tsZSIgKQorICAgICAgICBzZXJ2ZXIuc29ja2V0LnNldHRpbWVvdXQoMSkKKworICAgICAgICBzZWxmLkV2ZW50SGFuZGxlciA9IE5vbmUKKyAgICAgICAgY291bnRfdHJpZXMgPSAwCisKKyAgICAgICAgIyB0aGUgZXZlbnQgaGFuZGxlciByZWdpc3RyYXRpb24gbWF5IGZhaWwgaGVyZSBkdWUgdG8gY29va2VyIGJlaW5nIGluIGludmFsaWQgc3RhdGUKKyAgICAgICAgIyB0aGlzIGlzIGEgdHJhbnNpZW50IHNpdHVhdGlvbiwgYW5kIHdlIHNob3VsZCByZXRyeSBhIGNvdXBsZSBvZiB0aW1lcyBiZWZvcmUKKyAgICAgICAgIyBnaXZpbmcgdXAKKworICAgICAgICB3aGlsZSBzZWxmLkV2ZW50SGFuZGxlciA9PSBOb25lIGFuZCBjb3VudF90cmllcyA8IDU6CisgICAgICAgICAgICBzZWxmLkV2ZW50SGFuZGxlID0gc2VsZi5CQlNlcnZlci5yZWdpc3RlckV2ZW50SGFuZGxlcihzZWxmLmhvc3QsIHNlbGYucG9ydCkKKworICAgICAgICAgICAgaWYgKHNlbGYuRXZlbnRIYW5kbGUgIT0gTm9uZSk6CisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgYmIud2FybigiQ291bGQgbm90IHJlZ2lzdGVyIFVJIGV2ZW50IGhhbmRsZXIgJXM6JWQsIHJldHJ5IiAlIChzZWxmLmhvc3QsIHNlbGYucG9ydCkpCisgICAgICAgICAgICBjb3VudF90cmllcyArPSAxCisgICAgICAgICAgICBpbXBvcnQgdGltZQorICAgICAgICAgICAgdGltZS5zbGVlcCgxKQorCisKKyAgICAgICAgaWYgc2VsZi5FdmVudEhhbmRsZSA9PSBOb25lOgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJDb3VsZCBub3QgcmVnaXN0ZXIgVUkgZXZlbnQgaGFuZGxlciIpCisKKyAgICAgICAgc2VsZi5zZXJ2ZXIgPSBzZXJ2ZXIKKworICAgICAgICBzZWxmLnQgPSB0aHJlYWRpbmcuVGhyZWFkKCkKKyAgICAgICAgc2VsZi50LnNldERhZW1vbihUcnVlKQorICAgICAgICBzZWxmLnQucnVuID0gc2VsZi5zdGFydENhbGxiYWNrSGFuZGxlcgorICAgICAgICBzZWxmLnQuc3RhcnQoKQorCisgICAgZGVmIGdldEV2ZW50KHNlbGYpOgorCisgICAgICAgIHNlbGYuZXZlbnRRdWV1ZUxvY2suYWNxdWlyZSgpCisKKyAgICAgICAgaWYgbGVuKHNlbGYuZXZlbnRRdWV1ZSkgPT0gMDoKKyAgICAgICAgICAgIHNlbGYuZXZlbnRRdWV1ZUxvY2sucmVsZWFzZSgpCisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIGl0ZW0gPSBzZWxmLmV2ZW50UXVldWUucG9wKDApCisKKyAgICAgICAgaWYgbGVuKHNlbGYuZXZlbnRRdWV1ZSkgPT0gMDoKKyAgICAgICAgICAgIHNlbGYuZXZlbnRRdWV1ZU5vdGlmeS5jbGVhcigpCisKKyAgICAgICAgc2VsZi5ldmVudFF1ZXVlTG9jay5yZWxlYXNlKCkKKyAgICAgICAgcmV0dXJuIGl0ZW0KKworICAgIGRlZiB3YWl0RXZlbnQoc2VsZiwgZGVsYXkpOgorICAgICAgICBzZWxmLmV2ZW50UXVldWVOb3RpZnkud2FpdChkZWxheSkKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2V0RXZlbnQoKQorCisgICAgZGVmIHF1ZXVlX2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgc2VsZi5ldmVudFF1ZXVlTG9jay5hY3F1aXJlKCkKKyAgICAgICAgc2VsZi5ldmVudFF1ZXVlLmFwcGVuZChldmVudCkKKyAgICAgICAgc2VsZi5ldmVudFF1ZXVlTm90aWZ5LnNldCgpCisgICAgICAgIHNlbGYuZXZlbnRRdWV1ZUxvY2sucmVsZWFzZSgpCisKKyAgICBkZWYgc2VuZF9ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgIHNlbGYucXVldWVfZXZlbnQocGlja2xlLmxvYWRzKGV2ZW50KSkKKworICAgIGRlZiBzdGFydENhbGxiYWNrSGFuZGxlcihzZWxmKToKKworICAgICAgICBzZWxmLnNlcnZlci50aW1lb3V0ID0gMQorICAgICAgICB3aGlsZSBub3Qgc2VsZi5zZXJ2ZXIucXVpdDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLnNlcnZlci5oYW5kbGVfcmVxdWVzdCgpCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICAgICAgaW1wb3J0IHRyYWNlYmFjaworICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiQkJVSUV2ZW50UXVldWUuc3RhcnRDYWxsYmFja0hhbmRsZXI6IEV4Y2VwdGlvbiB3aGlsZSB0cnlpbmcgdG8gaGFuZGxlIHJlcXVlc3Q6ICVzXG4lcyIgJSAoZSwgdHJhY2ViYWNrLmZvcm1hdF9leGMoZSkpKQorCisgICAgICAgIHNlbGYuc2VydmVyLnNlcnZlcl9jbG9zZSgpCisKKyAgICBkZWYgc3lzdGVtX3F1aXQoIHNlbGYgKToKKyAgICAgICAgIiIiCisgICAgICAgIFNodXQgZG93biB0aGUgY2FsbGJhY2sgdGhyZWFkCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLkJCU2VydmVyLnVucmVnaXN0ZXJFdmVudEhhbmRsZXIoc2VsZi5FdmVudEhhbmRsZSkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLnNlcnZlci5xdWl0ID0gVHJ1ZQorCitjbGFzcyBVSVhNTFJQQ1NlcnZlciAoU2ltcGxlWE1MUlBDU2VydmVyKToKKworICAgIGRlZiBfX2luaXRfXyggc2VsZiwgaW50ZXJmYWNlICk6CisgICAgICAgIHNlbGYucXVpdCA9IEZhbHNlCisgICAgICAgIFNpbXBsZVhNTFJQQ1NlcnZlci5fX2luaXRfXyggc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVyPVNpbXBsZVhNTFJQQ1JlcXVlc3RIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nUmVxdWVzdHM9RmFsc2UsIGFsbG93X25vbmU9VHJ1ZSkKKworICAgIGRlZiBnZXRfcmVxdWVzdChzZWxmKToKKyAgICAgICAgd2hpbGUgbm90IHNlbGYucXVpdDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzb2NrLCBhZGRyID0gc2VsZi5zb2NrZXQuYWNjZXB0KCkKKyAgICAgICAgICAgICAgICBzb2NrLnNldHRpbWVvdXQoMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKHNvY2ssIGFkZHIpCisgICAgICAgICAgICBleGNlcHQgc29ja2V0LnRpbWVvdXQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICByZXR1cm4gKE5vbmUsIE5vbmUpCisKKyAgICBkZWYgY2xvc2VfcmVxdWVzdChzZWxmLCByZXF1ZXN0KToKKyAgICAgICAgaWYgcmVxdWVzdCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIFNpbXBsZVhNTFJQQ1NlcnZlci5jbG9zZV9yZXF1ZXN0KHNlbGYsIHJlcXVlc3QpCisKKyAgICBkZWYgcHJvY2Vzc19yZXF1ZXN0KHNlbGYsIHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKToKKyAgICAgICAgaWYgcmVxdWVzdCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIFNpbXBsZVhNTFJQQ1NlcnZlci5wcm9jZXNzX3JlcXVlc3Qoc2VsZiwgcmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpCisKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL3VpaGVscGVyLnB5IGIvYml0YmFrZS9saWIvYmIvdWkvdWloZWxwZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcwMzM4NwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL3VpaGVscGVyLnB5CkBAIC0wLDAgKzEsMTAwIEBACisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIworIyBDb3B5cmlnaHQgKEMpIDIwMDYgLSAyMDA3ICBNaWNoYWVsICdNaWNrZXknIExhdWVyCisjIENvcHlyaWdodCAoQykgMjAwNiAtIDIwMDcgIFJpY2hhcmQgUHVyZGllCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitpbXBvcnQgYmIuYnVpbGQKKworY2xhc3MgQkJVSUhlbHBlcjoKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYubmVlZFVwZGF0ZSA9IEZhbHNlCisgICAgICAgIHNlbGYucnVubmluZ190YXNrcyA9IHt9CisgICAgICAgICMgUnVubmluZyBQSURzIHByZXNlcnZlcyB0aGUgb3JkZXIgdGFza3Mgd2VyZSBleGVjdXRlZCBpbgorICAgICAgICBzZWxmLnJ1bm5pbmdfcGlkcyA9IFtdCisgICAgICAgIHNlbGYuZmFpbGVkX3Rhc2tzID0gW10KKyAgICAgICAgc2VsZi50YXNrbnVtYmVyX2N1cnJlbnQgPSAwCisgICAgICAgIHNlbGYudGFza251bWJlcl90b3RhbCA9IDAKKworICAgIGRlZiBldmVudEhhbmRsZXIoc2VsZiwgZXZlbnQpOgorICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5idWlsZC5UYXNrU3RhcnRlZCk6CisgICAgICAgICAgICBzZWxmLnJ1bm5pbmdfdGFza3NbZXZlbnQucGlkXSA9IHsgJ3RpdGxlJyA6ICIlcyAlcyIgJSAoZXZlbnQuX3BhY2thZ2UsIGV2ZW50Ll90YXNrKSB9CisgICAgICAgICAgICBzZWxmLnJ1bm5pbmdfcGlkcy5hcHBlbmQoZXZlbnQucGlkKQorICAgICAgICAgICAgc2VsZi5uZWVkVXBkYXRlID0gVHJ1ZQorICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5idWlsZC5UYXNrU3VjY2VlZGVkKToKKyAgICAgICAgICAgIGRlbCBzZWxmLnJ1bm5pbmdfdGFza3NbZXZlbnQucGlkXQorICAgICAgICAgICAgc2VsZi5ydW5uaW5nX3BpZHMucmVtb3ZlKGV2ZW50LnBpZCkKKyAgICAgICAgICAgIHNlbGYubmVlZFVwZGF0ZSA9IFRydWUKKyAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuYnVpbGQuVGFza0ZhaWxlZFNpbGVudCk6CisgICAgICAgICAgICBkZWwgc2VsZi5ydW5uaW5nX3Rhc2tzW2V2ZW50LnBpZF0KKyAgICAgICAgICAgIHNlbGYucnVubmluZ19waWRzLnJlbW92ZShldmVudC5waWQpCisgICAgICAgICAgICAjIERvbid0IGFkZCB0byB0aGUgZmFpbGVkIHRhc2tzIGxpc3Qgc2luY2UgdGhpcyBpcyBlLmcuIGEgc2V0c2NlbmUgdGFzayBmYWlsdXJlCisgICAgICAgICAgICBzZWxmLm5lZWRVcGRhdGUgPSBUcnVlCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmJ1aWxkLlRhc2tGYWlsZWQpOgorICAgICAgICAgICAgZGVsIHNlbGYucnVubmluZ190YXNrc1tldmVudC5waWRdCisgICAgICAgICAgICBzZWxmLnJ1bm5pbmdfcGlkcy5yZW1vdmUoZXZlbnQucGlkKQorICAgICAgICAgICAgc2VsZi5mYWlsZWRfdGFza3MuYXBwZW5kKCB7ICd0aXRsZScgOiAiJXMgJXMiICUgKGV2ZW50Ll9wYWNrYWdlLCBldmVudC5fdGFzayl9KQorICAgICAgICAgICAgc2VsZi5uZWVkVXBkYXRlID0gVHJ1ZQorICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ydW5xdWV1ZS5ydW5RdWV1ZVRhc2tTdGFydGVkKSBvciBpc2luc3RhbmNlKGV2ZW50LCBiYi5ydW5xdWV1ZS5zY2VuZVF1ZXVlVGFza1N0YXJ0ZWQpOgorICAgICAgICAgICAgc2VsZi50YXNrbnVtYmVyX2N1cnJlbnQgPSBldmVudC5zdGF0cy5jb21wbGV0ZWQgKyBldmVudC5zdGF0cy5hY3RpdmUgKyBldmVudC5zdGF0cy5mYWlsZWQgKyAxCisgICAgICAgICAgICBzZWxmLnRhc2tudW1iZXJfdG90YWwgPSBldmVudC5zdGF0cy50b3RhbAorICAgICAgICAgICAgc2VsZi5uZWVkVXBkYXRlID0gVHJ1ZQorCisgICAgZGVmIGdldFRhc2tzKHNlbGYpOgorICAgICAgICBzZWxmLm5lZWRVcGRhdGUgPSBGYWxzZQorICAgICAgICByZXR1cm4gKHNlbGYucnVubmluZ190YXNrcywgc2VsZi5mYWlsZWRfdGFza3MpCisKKyAgICBkZWYgZmluZFNlcnZlckRldGFpbHMoc2VsZik6CisgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgaW1wb3J0IG9wdHBhcnNlCisgICAgICAgIGZyb20gYmIuc2VydmVyLnhtbHJwYyBpbXBvcnQgQml0YmFrZVNlcnZlckluZm8sIEJpdEJha2VTZXJ2ZXJDb25uZWN0aW9uCisgICAgICAgIGhvc3QgPSAiIgorICAgICAgICBwb3J0ID0gMAorICAgICAgICBiaW5kID0gIiIKKyAgICAgICAgcGFyc2VyID0gb3B0cGFyc2UuT3B0aW9uUGFyc2VyKAorICAgICAgICAgICAgdXNhZ2UgPSAiIiIlcHJvZyAtSCBob3N0IC1QIHBvcnQgLUIgYmluZGFkZHIiIiIpCisKKyAgICAgICAgcGFyc2VyLmFkZF9vcHRpb24oIi1IIiwgIi0taG9zdCIsIGhlbHAgPSAiQml0YmFrZSBzZXJ2ZXIncyBJUCBhZGRyZXNzIiwKKyAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSAic3RvcmUiLCBkZXN0ID0gImhvc3QiLCBkZWZhdWx0ID0gTm9uZSkKKworICAgICAgICBwYXJzZXIuYWRkX29wdGlvbigiLVAiLCAiLS1wb3J0IiwgaGVscCA9ICJCaXRiYWtlIHNlcnZlcidzIFBvcnQgbnVtYmVyIiwKKyAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSAic3RvcmUiLCBkZXN0ID0gInBvcnQiLCBkZWZhdWx0ID0gTm9uZSkKKworICAgICAgICBwYXJzZXIuYWRkX29wdGlvbigiLUIiLCAiLS1iaW5kIiwgaGVscCA9ICJIb2IyIGxvY2FsIGJpbmQgYWRkcmVzcyIsCisgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gInN0b3JlIiwgZGVzdCA9ICJiaW5kIiwgZGVmYXVsdCA9IE5vbmUpCisKKyAgICAgICAgb3B0aW9ucywgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKHN5cy5hcmd2KQorICAgICAgICBmb3Iga2V5LCB2YWwgaW4gb3B0aW9ucy5fX2RpY3RfXy5pdGVtcygpOgorICAgICAgICAgICAgaWYga2V5ID09ICdob3N0JyBhbmQgdmFsOgorICAgICAgICAgICAgICAgIGhvc3QgPSB2YWwKKyAgICAgICAgICAgIGVsaWYga2V5ID09ICdwb3J0JyBhbmQgdmFsOgorICAgICAgICAgICAgICAgIHBvcnQgPSBpbnQodmFsKQorICAgICAgICAgICAgZWxpZiBrZXkgPT0gJ2JpbmQnIGFuZCB2YWw6CisgICAgICAgICAgICAgICAgYmluZCA9IHZhbAorCisgICAgICAgIGlmIG5vdCBob3N0IG9yIG5vdCBwb3J0IG9yIG5vdCBiaW5kOgorICAgICAgICAgICAgcGFyc2VyLnByaW50X3VzYWdlKCkKKyAgICAgICAgICAgIHN5cy5leGl0KDEpCisKKyAgICAgICAgc2VydmVyaW5mbyA9IEJpdGJha2VTZXJ2ZXJJbmZvKGhvc3QsIHBvcnQpCisgICAgICAgIGNsaWVudGluZm8gPSAoYmluZCwgMCkKKyAgICAgICAgY29ubmVjdGlvbiA9IEJpdEJha2VTZXJ2ZXJDb25uZWN0aW9uKHNlcnZlcmluZm8sIGNsaWVudGluZm8pCisKKyAgICAgICAgc2VydmVyID0gY29ubmVjdGlvbi5jb25uZWN0aW9uCisgICAgICAgIGV2ZW50SGFuZGxlciA9IGNvbm5lY3Rpb24uZXZlbnRzCisKKyAgICAgICAgcmV0dXJuIHNlcnZlciwgZXZlbnRIYW5kbGVyLCBob3N0LCBiaW5kCisKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3V0aWxzLnB5IGIvYml0YmFrZS9saWIvYmIvdXRpbHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFmYWE0OQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3V0aWxzLnB5CkBAIC0wLDAgKzEsMTMxMiBAQAorIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyIiIgorQml0QmFrZSBVdGlsaXR5IEZ1bmN0aW9ucworIiIiCisKKyMgQ29weXJpZ2h0IChDKSAyMDA0IE1pY2hhZWwgTGF1ZXIKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCByZSwgZmNudGwsIG9zLCBzdHJpbmcsIHN0YXQsIHNodXRpbCwgdGltZQoraW1wb3J0IHN5cworaW1wb3J0IGVycm5vCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IGJiCitpbXBvcnQgYmIubXNnCitpbXBvcnQgbXVsdGlwcm9jZXNzaW5nCitpbXBvcnQgZmNudGwKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgZ2xvYgoraW1wb3J0IGZubWF0Y2gKK2ltcG9ydCB0cmFjZWJhY2sKK2ltcG9ydCBlcnJubworaW1wb3J0IHNpZ25hbAorZnJvbSBjb21tYW5kcyBpbXBvcnQgZ2V0c3RhdHVzb3V0cHV0Citmcm9tIGNvbnRleHRsaWIgaW1wb3J0IGNvbnRleHRtYW5hZ2VyCitmcm9tIGN0eXBlcyBpbXBvcnQgY2RsbAorCisKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJCaXRCYWtlLlV0aWwiKQorCitkZWYgY2xlYW5fY29udGV4dCgpOgorICAgIHJldHVybiB7CisgICAgICAgICJvcyI6IG9zLAorICAgICAgICAiYmIiOiBiYiwKKyAgICAgICAgInRpbWUiOiB0aW1lLAorICAgIH0KKworZGVmIGdldF9jb250ZXh0KCk6CisgICAgcmV0dXJuIF9jb250ZXh0CisgICAgCisKK2RlZiBzZXRfY29udGV4dChjdHgpOgorICAgIF9jb250ZXh0ID0gY3R4CisKKyMgQ29udGV4dCB1c2VkIGluIGJldHRlcl9leGVjLCBldmFsCitfY29udGV4dCA9IGNsZWFuX2NvbnRleHQoKQorCitjbGFzcyBWZXJzaW9uU3RyaW5nRXhjZXB0aW9uKEV4Y2VwdGlvbik6CisgICAgIiIiRXhjZXB0aW9uIHJhaXNlZCB3aGVuIGFuIGludmFsaWQgdmVyc2lvbiBzcGVjaWZpY2F0aW9uIGlzIGZvdW5kIiIiCisKK2RlZiBleHBsb2RlX3ZlcnNpb24ocyk6CisgICAgciA9IFtdCisgICAgYWxwaGFfcmVnZXhwID0gcmUuY29tcGlsZSgnXihbYS16QS1aXSspKC4qKSQnKQorICAgIG51bWVyaWNfcmVnZXhwID0gcmUuY29tcGlsZSgnXihcZCspKC4qKSQnKQorICAgIHdoaWxlIChzICE9ICcnKToKKyAgICAgICAgaWYgc1swXSBpbiBzdHJpbmcuZGlnaXRzOgorICAgICAgICAgICAgbSA9IG51bWVyaWNfcmVnZXhwLm1hdGNoKHMpCisgICAgICAgICAgICByLmFwcGVuZCgoMCwgaW50KG0uZ3JvdXAoMSkpKSkKKyAgICAgICAgICAgIHMgPSBtLmdyb3VwKDIpCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBpZiBzWzBdIGluIHN0cmluZy5sZXR0ZXJzOgorICAgICAgICAgICAgbSA9IGFscGhhX3JlZ2V4cC5tYXRjaChzKQorICAgICAgICAgICAgci5hcHBlbmQoKDEsIG0uZ3JvdXAoMSkpKQorICAgICAgICAgICAgcyA9IG0uZ3JvdXAoMikKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIHNbMF0gPT0gJ34nOgorICAgICAgICAgICAgci5hcHBlbmQoKC0xLCBzWzBdKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHIuYXBwZW5kKCgyLCBzWzBdKSkKKyAgICAgICAgcyA9IHNbMTpdCisgICAgcmV0dXJuIHIKKworZGVmIHNwbGl0X3ZlcnNpb24ocyk6CisgICAgIiIiU3BsaXQgYSB2ZXJzaW9uIHN0cmluZyBpbnRvIGl0cyBjb25zdGl0dWVudCBwYXJ0cyAoUEUsIFBWLCBQUikiIiIKKyAgICBzID0gcy5zdHJpcCgiIDw+PSIpCisgICAgZSA9IDAKKyAgICBpZiBzLmNvdW50KCc6Jyk6CisgICAgICAgIGUgPSBpbnQocy5zcGxpdCgiOiIpWzBdKQorICAgICAgICBzID0gcy5zcGxpdCgiOiIpWzFdCisgICAgciA9ICIiCisgICAgaWYgcy5jb3VudCgnLScpOgorICAgICAgICByID0gcy5yc3BsaXQoIi0iLCAxKVsxXQorICAgICAgICBzID0gcy5yc3BsaXQoIi0iLCAxKVswXQorICAgIHYgPSBzCisgICAgcmV0dXJuIChlLCB2LCByKQorCitkZWYgdmVyY21wX3BhcnQoYSwgYik6CisgICAgdmEgPSBleHBsb2RlX3ZlcnNpb24oYSkKKyAgICB2YiA9IGV4cGxvZGVfdmVyc2lvbihiKQorICAgIHdoaWxlIFRydWU6CisgICAgICAgIGlmIHZhID09IFtdOgorICAgICAgICAgICAgKG9hLCBjYSkgPSAoMCwgTm9uZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIChvYSwgY2EpID0gdmEucG9wKDApCisgICAgICAgIGlmIHZiID09IFtdOgorICAgICAgICAgICAgKG9iLCBjYikgPSAoMCwgTm9uZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIChvYiwgY2IpID0gdmIucG9wKDApCisgICAgICAgIGlmIChvYSwgY2EpID09ICgwLCBOb25lKSBhbmQgKG9iLCBjYikgPT0gKDAsIE5vbmUpOgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgaWYgb2EgPCBvYjoKKyAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICBlbGlmIG9hID4gb2I6CisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICBlbGlmIGNhIDwgY2I6CisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgZWxpZiBjYSA+IGNiOgorICAgICAgICAgICAgcmV0dXJuIDEKKworZGVmIHZlcmNtcCh0YSwgdGIpOgorICAgIChlYSwgdmEsIHJhKSA9IHRhCisgICAgKGViLCB2YiwgcmIpID0gdGIKKworICAgIHIgPSBpbnQoZWEgb3IgMCkgLSBpbnQoZWIgb3IgMCkKKyAgICBpZiAociA9PSAwKToKKyAgICAgICAgciA9IHZlcmNtcF9wYXJ0KHZhLCB2YikKKyAgICBpZiAociA9PSAwKToKKyAgICAgICAgciA9IHZlcmNtcF9wYXJ0KHJhLCByYikKKyAgICByZXR1cm4gcgorCitkZWYgdmVyY21wX3N0cmluZyhhLCBiKToKKyAgICB0YSA9IHNwbGl0X3ZlcnNpb24oYSkKKyAgICB0YiA9IHNwbGl0X3ZlcnNpb24oYikKKyAgICByZXR1cm4gdmVyY21wKHRhLCB0YikKKworZGVmIHZlcmNtcF9zdHJpbmdfb3AoYSwgYiwgb3ApOgorICAgICIiIgorICAgIENvbXBhcmUgdHdvIHZlcnNpb25zIGFuZCBjaGVjayBpZiB0aGUgc3BlY2lmaWVkIGNvbXBhcmlzb24gb3BlcmF0b3IgbWF0Y2hlcyB0aGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uLgorICAgIFRoaXMgZnVuY3Rpb24gaXMgZmFpcmx5IGxpYmVyYWwgYWJvdXQgd2hhdCBvcGVyYXRvcnMgaXQgd2lsbCBhY2NlcHQgc2luY2UgdGhlcmUgYXJlIGEgdmFyaWV0eSBvZiBzdHlsZXMKKyAgICBkZXBlbmRpbmcgb24gdGhlIGNvbnRleHQuCisgICAgIiIiCisgICAgcmVzID0gdmVyY21wX3N0cmluZyhhLCBiKQorICAgIGlmIG9wIGluICgnPScsICc9PScpOgorICAgICAgICByZXR1cm4gcmVzID09IDAKKyAgICBlbGlmIG9wID09ICc8PSc6CisgICAgICAgIHJldHVybiByZXMgPD0gMAorICAgIGVsaWYgb3AgPT0gJz49JzoKKyAgICAgICAgcmV0dXJuIHJlcyA+PSAwCisgICAgZWxpZiBvcCBpbiAoJz4nLCAnPj4nKToKKyAgICAgICAgcmV0dXJuIHJlcyA+IDAKKyAgICBlbGlmIG9wIGluICgnPCcsICc8PCcpOgorICAgICAgICByZXR1cm4gcmVzIDwgMAorICAgIGVsaWYgb3AgPT0gJyE9JzoKKyAgICAgICAgcmV0dXJuIHJlcyAhPSAwCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgVmVyc2lvblN0cmluZ0V4Y2VwdGlvbignVW5zdXBwb3J0ZWQgY29tcGFyaXNvbiBvcGVyYXRvciAiJXMiJyAlIG9wKQorCitkZWYgZXhwbG9kZV9kZXBzKHMpOgorICAgICIiIgorICAgIFRha2UgYW4gUkRFUEVORFMgc3R5bGUgc3RyaW5nIG9mIGZvcm1hdDoKKyAgICAiREVQRU5EMSAob3B0aW9uYWwgdmVyc2lvbikgREVQRU5EMiAob3B0aW9uYWwgdmVyc2lvbikgLi4uIgorICAgIGFuZCByZXR1cm4gYSBsaXN0IG9mIGRlcGVuZGVuY2llcy4KKyAgICBWZXJzaW9uIGluZm9ybWF0aW9uIGlzIGlnbm9yZWQuCisgICAgIiIiCisgICAgciA9IFtdCisgICAgbCA9IHMuc3BsaXQoKQorICAgIGZsYWcgPSBGYWxzZQorICAgIGZvciBpIGluIGw6CisgICAgICAgIGlmIGlbMF0gPT0gJygnOgorICAgICAgICAgICAgZmxhZyA9IFRydWUKKyAgICAgICAgICAgICNqID0gW10KKyAgICAgICAgaWYgbm90IGZsYWc6CisgICAgICAgICAgICByLmFwcGVuZChpKQorICAgICAgICAjZWxzZToKKyAgICAgICAgIyAgICBqLmFwcGVuZChpKQorICAgICAgICBpZiBmbGFnIGFuZCBpLmVuZHN3aXRoKCcpJyk6CisgICAgICAgICAgICBmbGFnID0gRmFsc2UKKyAgICAgICAgICAgICMgSWdub3JlIHZlcnNpb24KKyAgICAgICAgICAgICNyWy0xXSArPSAnICcgKyAnICcuam9pbihqKQorICAgIHJldHVybiByCisKK2RlZiBleHBsb2RlX2RlcF92ZXJzaW9uczIocyk6CisgICAgIiIiCisgICAgVGFrZSBhbiBSREVQRU5EUyBzdHlsZSBzdHJpbmcgb2YgZm9ybWF0OgorICAgICJERVBFTkQxIChvcHRpb25hbCB2ZXJzaW9uKSBERVBFTkQyIChvcHRpb25hbCB2ZXJzaW9uKSAuLi4iCisgICAgYW5kIHJldHVybiBhIGRpY3Rpb25hcnkgb2YgZGVwZW5kZW5jaWVzIGFuZCB2ZXJzaW9ucy4KKyAgICAiIiIKKyAgICByID0ge30KKyAgICBsID0gcy5yZXBsYWNlKCIsIiwgIiIpLnNwbGl0KCkKKyAgICBsYXN0ZGVwID0gTm9uZQorICAgIGxhc3RjbXAgPSAiIgorICAgIGxhc3R2ZXIgPSAiIgorICAgIGluY21wID0gRmFsc2UKKyAgICBpbnZlcnNpb24gPSBGYWxzZQorICAgIGZvciBpIGluIGw6CisgICAgICAgIGlmIGlbMF0gPT0gJygnOgorICAgICAgICAgICAgaW5jbXAgPSBUcnVlCisgICAgICAgICAgICBpID0gaVsxOl0uc3RyaXAoKQorICAgICAgICAgICAgaWYgbm90IGk6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBpZiBpbmNtcDoKKyAgICAgICAgICAgIGluY21wID0gRmFsc2UKKyAgICAgICAgICAgIGludmVyc2lvbiA9IFRydWUKKyAgICAgICAgICAgICMgVGhpcyBsaXN0IGlzIGJhc2VkIG9uIGJlaGF2aW9yIGFuZCBzdXBwb3J0ZWQgY29tcGFyaXNvbnMgZnJvbSBkZWIsIG9wa2cgYW5kIHJwbS4KKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgRXZlbiB0aG91Z2ggPTwsIDw8LCA9PSwgIT0sID0+LCBhbmQgPj4gbWF5IG5vdCBiZSBzdXBwb3J0ZWQsIAorICAgICAgICAgICAgIyB3ZSBsaXN0IGVhY2ggcG9zc2libHkgdmFsaWQgaXRlbS4gCisgICAgICAgICAgICAjIFRoZSBidWlsZCBzeXN0ZW0gaXMgcmVzcG9uc2libGUgZm9yIHZhbGlkYXRpb24gb2Ygd2hhdCBpdCBzdXBwb3J0cy4KKyAgICAgICAgICAgIGlmIGkuc3RhcnRzd2l0aCgoJzw9JywgJz08JywgJzw8JywgJz09JywgJyE9JywgJz49JywgJz0+JywgJz4+JykpOgorICAgICAgICAgICAgICAgIGxhc3RjbXAgPSBpWzA6Ml0KKyAgICAgICAgICAgICAgICBpID0gaVsyOl0KKyAgICAgICAgICAgIGVsaWYgaS5zdGFydHN3aXRoKCgnPCcsICc+JywgJz0nKSk6CisgICAgICAgICAgICAgICAgbGFzdGNtcCA9IGlbMDoxXQorICAgICAgICAgICAgICAgIGkgPSBpWzE6XQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIFRoaXMgaXMgYW4gdW5zdXBwb3J0ZWQgY2FzZSEKKyAgICAgICAgICAgICAgICByYWlzZSBWZXJzaW9uU3RyaW5nRXhjZXB0aW9uKCdJbnZhbGlkIHZlcnNpb24gc3BlY2lmaWNhdGlvbiBpbiAiKCVzIiAtIGludmFsaWQgb3IgbWlzc2luZyBvcGVyYXRvcicgJSBpKQorICAgICAgICAgICAgICAgIGxhc3RjbXAgPSAoaSBvciAiIikKKyAgICAgICAgICAgICAgICBpID0gIiIKKyAgICAgICAgICAgIGkuc3RyaXAoKQorICAgICAgICAgICAgaWYgbm90IGk6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBpZiBpbnZlcnNpb246CisgICAgICAgICAgICBpZiBpLmVuZHN3aXRoKCcpJyk6CisgICAgICAgICAgICAgICAgaSA9IGlbOi0xXSBvciAiIgorICAgICAgICAgICAgICAgIGludmVyc2lvbiA9IEZhbHNlCisgICAgICAgICAgICAgICAgaWYgbGFzdHZlciBhbmQgaToKKyAgICAgICAgICAgICAgICAgICAgbGFzdHZlciArPSAiICIKKyAgICAgICAgICAgIGlmIGk6CisgICAgICAgICAgICAgICAgbGFzdHZlciArPSBpCisgICAgICAgICAgICAgICAgaWYgbGFzdGRlcCBub3QgaW4gcjoKKyAgICAgICAgICAgICAgICAgICAgcltsYXN0ZGVwXSA9IFtdCisgICAgICAgICAgICAgICAgcltsYXN0ZGVwXS5hcHBlbmQobGFzdGNtcCArICIgIiArIGxhc3R2ZXIpCisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICNpZiBub3QgaW52ZXJzaW9uOgorICAgICAgICBsYXN0ZGVwID0gaQorICAgICAgICBsYXN0dmVyID0gIiIKKyAgICAgICAgbGFzdGNtcCA9ICIiCisgICAgICAgIGlmIG5vdCAoaSBpbiByIGFuZCByW2ldKToKKyAgICAgICAgICAgIHJbbGFzdGRlcF0gPSBbXQorCisgICAgcmV0dXJuIHIKKworZGVmIGV4cGxvZGVfZGVwX3ZlcnNpb25zKHMpOgorICAgIHIgPSBleHBsb2RlX2RlcF92ZXJzaW9uczIocykKKyAgICBmb3IgZCBpbiByOgorICAgICAgICBpZiBub3QgcltkXToKKyAgICAgICAgICAgIHJbZF0gPSBOb25lCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBpZiBsZW4ocltkXSkgPiAxOgorICAgICAgICAgICAgYmIud2FybigiZXhwbG9kZV9kZXBfdmVyc2lvbnMoKTogSXRlbSAlcyBhcHBlYXJlZCBpbiBkZXBlbmRlbmN5IHN0cmluZyAnJXMnIG11bHRpcGxlIHRpbWVzIHdpdGggZGlmZmVyZW50IHZhbHVlcy4gIGV4cGxvZGVfZGVwX3ZlcnNpb25zIGNhbm5vdCBjb3BlIHdpdGggdGhpcy4iICUgKGQsIHMpKQorICAgICAgICByW2RdID0gcltkXVswXQorICAgIHJldHVybiByCisKK2RlZiBqb2luX2RlcHMoZGVwcywgY29tbWFzZXA9VHJ1ZSk6CisgICAgIiIiCisgICAgVGFrZSB0aGUgcmVzdWx0IGZyb20gZXhwbG9kZV9kZXBfdmVyc2lvbnMgYW5kIGdlbmVyYXRlIGEgZGVwZW5kZW5jeSBzdHJpbmcKKyAgICAiIiIKKyAgICByZXN1bHQgPSBbXQorICAgIGZvciBkZXAgaW4gZGVwczoKKyAgICAgICAgaWYgZGVwc1tkZXBdOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShkZXBzW2RlcF0sIGxpc3QpOgorICAgICAgICAgICAgICAgIGZvciB2IGluIGRlcHNbZGVwXToKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChkZXAgKyAiICgiICsgdiArICIpIikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChkZXAgKyAiICgiICsgZGVwc1tkZXBdICsgIikiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChkZXApCisgICAgaWYgY29tbWFzZXA6CisgICAgICAgIHJldHVybiAiLCAiLmpvaW4ocmVzdWx0KQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiAiICIuam9pbihyZXN1bHQpCisKK2RlZiBfcHJpbnRfdHJhY2UoYm9keSwgbGluZSk6CisgICAgIiIiCisgICAgUHJpbnQgdGhlIEVudmlyb25tZW50IG9mIGEgVGV4dCBCb2R5CisgICAgIiIiCisgICAgZXJyb3IgPSBbXQorICAgICMgcHJpbnQgdGhlIGVudmlyb25tZW50IG9mIHRoZSBtZXRob2QKKyAgICBtaW5fbGluZSA9IG1heCgxLCBsaW5lLTQpCisgICAgbWF4X2xpbmUgPSBtaW4obGluZSArIDQsIGxlbihib2R5KSkKKyAgICBmb3IgaSBpbiByYW5nZShtaW5fbGluZSwgbWF4X2xpbmUgKyAxKToKKyAgICAgICAgaWYgbGluZSA9PSBpOgorICAgICAgICAgICAgZXJyb3IuYXBwZW5kKCcgKioqICUuNGQ6JXMnICUgKGksIGJvZHlbaS0xXS5yc3RyaXAoKSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlcnJvci5hcHBlbmQoJyAgICAgJS40ZDolcycgJSAoaSwgYm9keVtpLTFdLnJzdHJpcCgpKSkKKyAgICByZXR1cm4gZXJyb3IKKworZGVmIGJldHRlcl9jb21waWxlKHRleHQsIGZpbGUsIHJlYWxmaWxlLCBtb2RlID0gImV4ZWMiKToKKyAgICAiIiIKKyAgICBBIGJldHRlciBjb21waWxlIG1ldGhvZC4gVGhpcyBtZXRob2QKKyAgICB3aWxsIHByaW50IHRoZSBvZmZlbmRpbmcgbGluZXMuCisgICAgIiIiCisgICAgdHJ5OgorICAgICAgICByZXR1cm4gY29tcGlsZSh0ZXh0LCBmaWxlLCBtb2RlKQorICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgZXJyb3IgPSBbXQorICAgICAgICAjIHNwbGl0IHRoZSB0ZXh0IGludG8gbGluZXMgYWdhaW4KKyAgICAgICAgYm9keSA9IHRleHQuc3BsaXQoJ1xuJykKKyAgICAgICAgZXJyb3IuYXBwZW5kKCJFcnJvciBpbiBjb21waWxpbmcgcHl0aG9uIGZ1bmN0aW9uIGluICVzOlxuIiAlIHJlYWxmaWxlKQorICAgICAgICBpZiBlLmxpbmVubzoKKyAgICAgICAgICAgIGVycm9yLmFwcGVuZCgiVGhlIGNvZGUgbGluZXMgcmVzdWx0aW5nIGluIHRoaXMgZXJyb3Igd2VyZToiKQorICAgICAgICAgICAgZXJyb3IuZXh0ZW5kKF9wcmludF90cmFjZShib2R5LCBlLmxpbmVubykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlcnJvci5hcHBlbmQoIlRoZSBmdW5jdGlvbiBjYXVzaW5nIHRoaXMgZXJyb3Igd2FzOiIpCisgICAgICAgICAgICBmb3IgbGluZSBpbiBib2R5OgorICAgICAgICAgICAgICAgIGVycm9yLmFwcGVuZChsaW5lKQorICAgICAgICBlcnJvci5hcHBlbmQoIiVzOiAlcyIgJSAoZS5fX2NsYXNzX18uX19uYW1lX18sIHN0cihlKSkpCisKKyAgICAgICAgbG9nZ2VyLmVycm9yKCJcbiIuam9pbihlcnJvcikpCisKKyAgICAgICAgZSA9IGJiLkJCSGFuZGxlZEV4Y2VwdGlvbihlKQorICAgICAgICByYWlzZSBlCisKK2RlZiBfcHJpbnRfZXhjZXB0aW9uKHQsIHZhbHVlLCB0YiwgcmVhbGZpbGUsIHRleHQsIGNvbnRleHQpOgorICAgIGVycm9yID0gW10KKyAgICB0cnk6CisgICAgICAgIGV4Y2VwdGlvbiA9IHRyYWNlYmFjay5mb3JtYXRfZXhjZXB0aW9uX29ubHkodCwgdmFsdWUpCisgICAgICAgIGVycm9yLmFwcGVuZCgnRXJyb3IgZXhlY3V0aW5nIGEgcHl0aG9uIGZ1bmN0aW9uIGluICVzOlxuJyAlIHJlYWxmaWxlKQorCisgICAgICAgICMgU3RyaXAgJ3VzJyBmcm9tIHRoZSBzdGFjayAoYmV0dGVyX2V4ZWMgY2FsbCkKKyAgICAgICAgdGIgPSB0Yi50Yl9uZXh0CisKKyAgICAgICAgdGV4dGFycmF5ID0gdGV4dC5zcGxpdCgnXG4nKQorCisgICAgICAgIGxpbmVmYWlsZWQgPSB0Yi50Yl9saW5lbm8KKworICAgICAgICB0YmV4dHJhY3QgPSB0cmFjZWJhY2suZXh0cmFjdF90Yih0YikKKyAgICAgICAgdGJmb3JtYXQgPSB0cmFjZWJhY2suZm9ybWF0X2xpc3QodGJleHRyYWN0KQorICAgICAgICBlcnJvci5hcHBlbmQoIlRoZSBzdGFjayB0cmFjZSBvZiBweXRob24gY2FsbHMgdGhhdCByZXN1bHRlZCBpbiB0aGlzIGV4Y2VwdGlvbi9mYWlsdXJlIHdhczoiKQorICAgICAgICBlcnJvci5hcHBlbmQoIkZpbGU6ICclcycsIGxpbmVubzogJXMsIGZ1bmN0aW9uOiAlcyIgJSAodGJleHRyYWN0WzBdWzBdLCB0YmV4dHJhY3RbMF1bMV0sIHRiZXh0cmFjdFswXVsyXSkpCisgICAgICAgIGVycm9yLmV4dGVuZChfcHJpbnRfdHJhY2UodGV4dGFycmF5LCBsaW5lZmFpbGVkKSkKKworICAgICAgICAjIFNlZSBpZiB0aGlzIGlzIGEgZnVuY3Rpb24gd2UgY29uc3RydWN0ZWQgYW5kIGhhcyBjYWxscyBiYWNrIGludG8gb3RoZXIgZnVuY3Rpb25zIGluCisgICAgICAgICMgInRleHQiLiBJZiBzbywgdHJ5IGFuZCBpbXByb3ZlIHRoZSBjb250ZXh0IG9mIHRoZSBlcnJvciBieSBkaXZpbmcgZG93biB0aGUgdHJhY2UKKyAgICAgICAgbGV2ZWwgPSAwCisgICAgICAgIG5leHR0YiA9IHRiLnRiX25leHQKKyAgICAgICAgd2hpbGUgbmV4dHRiIGlzIG5vdCBOb25lIGFuZCAobGV2ZWwrMSkgPCBsZW4odGJleHRyYWN0KToKKyAgICAgICAgICAgIGVycm9yLmFwcGVuZCgiRmlsZTogJyVzJywgbGluZW5vOiAlcywgZnVuY3Rpb246ICVzIiAlICh0YmV4dHJhY3RbbGV2ZWwrMV1bMF0sIHRiZXh0cmFjdFtsZXZlbCsxXVsxXSwgdGJleHRyYWN0W2xldmVsKzFdWzJdKSkKKyAgICAgICAgICAgIGlmIHRiZXh0cmFjdFtsZXZlbF1bMF0gPT0gdGJleHRyYWN0W2xldmVsKzFdWzBdIGFuZCB0YmV4dHJhY3RbbGV2ZWwrMV1bMl0gPT0gdGJleHRyYWN0W2xldmVsXVswXToKKyAgICAgICAgICAgICAgICAjIFRoZSBjb2RlIHdhcyBwb3NzaWJseSBpbiB0aGUgc3RyaW5nIHdlIGNvbXBpbGVkIG91cnNlbHZlcworICAgICAgICAgICAgICAgIGVycm9yLmV4dGVuZChfcHJpbnRfdHJhY2UodGV4dGFycmF5LCB0YmV4dHJhY3RbbGV2ZWwrMV1bMV0pKQorICAgICAgICAgICAgZWxpZiB0YmV4dHJhY3RbbGV2ZWwrMV1bMF0uc3RhcnRzd2l0aCgiLyIpOgorICAgICAgICAgICAgICAgICMgVGhlIGNvZGUgbG9va3MgbGlrZSBpdCBtaWdodCBiZSBpbiBhIGZpbGUsIHRyeSBhbmQgbG9hZCBpdAorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgd2l0aCBvcGVuKHRiZXh0cmFjdFtsZXZlbCsxXVswXSwgInIiKSBhcyBmOgorICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IGYucmVhZGxpbmVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLmV4dGVuZChfcHJpbnRfdHJhY2UodGV4dCwgdGJleHRyYWN0W2xldmVsKzFdWzFdKSkKKyAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgIGVycm9yLmFwcGVuZCh0YmZvcm1hdFtsZXZlbCsxXSkKKyAgICAgICAgICAgIGVsaWYgImQiIGluIGNvbnRleHQgYW5kIHRiZXh0cmFjdFtsZXZlbCsxXVsyXToKKyAgICAgICAgICAgICAgICAjIFRyeSBhbmQgZmluZCB0aGUgY29kZSBpbiB0aGUgZGF0YXN0b3JlIGJhc2VkIG9uIHRoZSBmdW5jdGlvbm5hbWUKKyAgICAgICAgICAgICAgICBkID0gY29udGV4dFsiZCJdCisgICAgICAgICAgICAgICAgZnVuY3Rpb25uYW1lID0gdGJleHRyYWN0W2xldmVsKzFdWzJdCisgICAgICAgICAgICAgICAgdGV4dCA9IGQuZ2V0VmFyKGZ1bmN0aW9ubmFtZSwgVHJ1ZSkKKyAgICAgICAgICAgICAgICBpZiB0ZXh0OgorICAgICAgICAgICAgICAgICAgICBlcnJvci5leHRlbmQoX3ByaW50X3RyYWNlKHRleHQuc3BsaXQoJ1xuJyksIHRiZXh0cmFjdFtsZXZlbCsxXVsxXSkpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZXJyb3IuYXBwZW5kKHRiZm9ybWF0W2xldmVsKzFdKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBlcnJvci5hcHBlbmQodGJmb3JtYXRbbGV2ZWwrMV0pCisgICAgICAgICAgICBuZXh0dGIgPSB0Yi50Yl9uZXh0CisgICAgICAgICAgICBsZXZlbCA9IGxldmVsICsgMQorCisgICAgICAgIGVycm9yLmFwcGVuZCgiRXhjZXB0aW9uOiAlcyIgJSAnJy5qb2luKGV4Y2VwdGlvbikpCisgICAgZmluYWxseToKKyAgICAgICAgbG9nZ2VyLmVycm9yKCJcbiIuam9pbihlcnJvcikpCisKK2RlZiBiZXR0ZXJfZXhlYyhjb2RlLCBjb250ZXh0LCB0ZXh0ID0gTm9uZSwgcmVhbGZpbGUgPSAiPGNvZGU+Iik6CisgICAgIiIiCisgICAgU2ltaWxpYXIgdG8gYmV0dGVyX2NvbXBpbGUsIGJldHRlcl9leGVjIHdpbGwKKyAgICBwcmludCB0aGUgbGluZXMgdGhhdCBhcmUgcmVzcG9uc2libGUgZm9yIHRoZQorICAgIGVycm9yLgorICAgICIiIgorICAgIGltcG9ydCBiYi5wYXJzZQorICAgIGlmIG5vdCB0ZXh0OgorICAgICAgICB0ZXh0ID0gY29kZQorICAgIGlmIG5vdCBoYXNhdHRyKGNvZGUsICJjb19maWxlbmFtZSIpOgorICAgICAgICBjb2RlID0gYmV0dGVyX2NvbXBpbGUoY29kZSwgcmVhbGZpbGUsIHJlYWxmaWxlKQorICAgIHRyeToKKyAgICAgICAgZXhlYyhjb2RlLCBnZXRfY29udGV4dCgpLCBjb250ZXh0KQorICAgIGV4Y2VwdCAoYmIuQkJIYW5kbGVkRXhjZXB0aW9uLCBiYi5wYXJzZS5Ta2lwUmVjaXBlLCBiYi5idWlsZC5GdW5jRmFpbGVkLCBiYi5kYXRhX3NtYXJ0LkV4cGFuc2lvbkVycm9yKToKKyAgICAgICAgIyBFcnJvciBhbHJlYWR5IHNob3duIHNvIHBhc3N0aHJvdWdoLCBubyBuZWVkIGZvciB0cmFjZWJhY2sKKyAgICAgICAgcmFpc2UKKyAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICh0LCB2YWx1ZSwgdGIpID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgX3ByaW50X2V4Y2VwdGlvbih0LCB2YWx1ZSwgdGIsIHJlYWxmaWxlLCB0ZXh0LCBjb250ZXh0KQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIkV4Y2VwdGlvbiBoYW5kbGVyIGVycm9yOiAlcyIgJSBzdHIoZSkpCisKKyAgICAgICAgZSA9IGJiLkJCSGFuZGxlZEV4Y2VwdGlvbihlKQorICAgICAgICByYWlzZSBlCisKK2RlZiBzaW1wbGVfZXhlYyhjb2RlLCBjb250ZXh0KToKKyAgICBleGVjKGNvZGUsIGdldF9jb250ZXh0KCksIGNvbnRleHQpCisKK2RlZiBiZXR0ZXJfZXZhbChzb3VyY2UsIGxvY2Fscyk6CisgICAgcmV0dXJuIGV2YWwoc291cmNlLCBnZXRfY29udGV4dCgpLCBsb2NhbHMpCisKK0Bjb250ZXh0bWFuYWdlcgorZGVmIGZpbGVzbG9ja2VkKGZpbGVzKToKKyAgICAiIiJDb250ZXh0IG1hbmFnZXIgZm9yIGxvY2tpbmcgYW5kIHVubG9ja2luZyBmaWxlIGxvY2tzLiIiIgorICAgIGxvY2tzID0gW10KKyAgICBpZiBmaWxlczoKKyAgICAgICAgZm9yIGxvY2tmaWxlIGluIGZpbGVzOgorICAgICAgICAgICAgbG9ja3MuYXBwZW5kKGJiLnV0aWxzLmxvY2tmaWxlKGxvY2tmaWxlKSkKKworICAgIHlpZWxkCisKKyAgICBmb3IgbG9jayBpbiBsb2NrczoKKyAgICAgICAgYmIudXRpbHMudW5sb2NrZmlsZShsb2NrKQorCitAY29udGV4dG1hbmFnZXIKK2RlZiB0aW1lb3V0KHNlY29uZHMpOgorICAgIGRlZiB0aW1lb3V0X2hhbmRsZXIoc2lnbnVtLCBmcmFtZSk6CisgICAgICAgIHBhc3MKKworICAgIG9yaWdpbmFsX2hhbmRsZXIgPSBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdBTFJNLCB0aW1lb3V0X2hhbmRsZXIpCisKKyAgICB0cnk6CisgICAgICAgIHNpZ25hbC5hbGFybShzZWNvbmRzKQorICAgICAgICB5aWVsZAorICAgIGZpbmFsbHk6CisgICAgICAgIHNpZ25hbC5hbGFybSgwKQorICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdBTFJNLCBvcmlnaW5hbF9oYW5kbGVyKQorCitkZWYgbG9ja2ZpbGUobmFtZSwgc2hhcmVkPUZhbHNlLCByZXRyeT1UcnVlLCBibG9jaz1GYWxzZSk6CisgICAgIiIiCisgICAgVXNlIHRoZSBzcGVjaWZpZWQgZmlsZSBhcyBhIGxvY2sgZmlsZSwgcmV0dXJuIHdoZW4gdGhlIGxvY2sgaGFzCisgICAgYmVlbiBhY3F1aXJlZC4gUmV0dXJucyBhIHZhcmlhYmxlIHRvIHBhc3MgdG8gdW5sb2NrZmlsZSgpLgorICAgIFBhcmFtZXRlcnM6CisgICAgICAgIHJldHJ5OiBUcnVlIHRvIHJlLXRyeSBsb2NraW5nIGlmIGl0IGZhaWxzLCBGYWxzZSBvdGhlcndpc2UKKyAgICAgICAgYmxvY2s6IFRydWUgdG8gYmxvY2sgdW50aWwgdGhlIGxvY2sgc3VjY2VlZHMsIEZhbHNlIG90aGVyd2lzZQorICAgIFRoZSByZXRyeSBhbmQgYmxvY2sgcGFyYW1ldGVycyBhcmUga2luZCBvZiBlcXVpdmFsZW50IHVubGVzcyB5b3UKKyAgICBjb25zaWRlciB0aGUgcG9zc2liaWxpdHkgb2Ygc2VuZGluZyBhIHNpZ25hbCB0byB0aGUgcHJvY2VzcyB0byBicmVhaworICAgIG91dCAtIGF0IHdoaWNoIHBvaW50IHlvdSB3YW50IGJsb2NrPVRydWUgcmF0aGVyIHRoYW4gcmV0cnk9VHJ1ZS4KKyAgICAiIiIKKyAgICBkaXJuYW1lID0gb3MucGF0aC5kaXJuYW1lKG5hbWUpCisgICAgbWtkaXJoaWVyKGRpcm5hbWUpCisKKyAgICBpZiBub3Qgb3MuYWNjZXNzKGRpcm5hbWUsIG9zLldfT0spOgorICAgICAgICBsb2dnZXIuZXJyb3IoIlVuYWJsZSB0byBhY3F1aXJlIGxvY2sgJyVzJywgZGlyZWN0b3J5IGlzIG5vdCB3cml0YWJsZSIsCisgICAgICAgICAgICAgICAgICAgICBuYW1lKQorICAgICAgICBzeXMuZXhpdCgxKQorCisgICAgb3AgPSBmY250bC5MT0NLX0VYCisgICAgaWYgc2hhcmVkOgorICAgICAgICBvcCA9IGZjbnRsLkxPQ0tfU0gKKyAgICBpZiBub3QgcmV0cnkgYW5kIG5vdCBibG9jazoKKyAgICAgICAgb3AgPSBvcCB8IGZjbnRsLkxPQ0tfTkIKKworICAgIHdoaWxlIFRydWU6CisgICAgICAgICMgSWYgd2UgbGVhdmUgdGhlIGxvY2tmaWxlcyBseWluZyBhcm91bmQgdGhlcmUgaXMgbm8gcHJvYmxlbQorICAgICAgICAjIGJ1dCB3ZSBzaG91bGQgY2xlYW4gdXAgYWZ0ZXIgb3Vyc2VsdmVzLiBUaGlzIGdpdmVzIHBvdGVudGlhbAorICAgICAgICAjIGZvciByYWNlcyB0aG91Z2guIFRvIHdvcmsgYXJvdW5kIHRoaXMsIHdoZW4gd2UgYWNxdWlyZSB0aGUgbG9jaworICAgICAgICAjIHdlIGNoZWNrIHRoZSBmaWxlIHdlIGxvY2tlZCB3YXMgc3RpbGwgdGhlIGxvY2sgZmlsZSBvbiBkaXNrLgorICAgICAgICAjIGJ5IGNvbXBhcmluZyBpbm9kZSBudW1iZXJzLiBJZiB0aGV5IGRvbid0IG1hdGNoIG9yIHRoZSBsb2NrZmlsZQorICAgICAgICAjIG5vIGxvbmdlciBleGlzdHMsIHdlIHN0YXJ0IGFnYWluLgorCisgICAgICAgICMgVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB1bmZhaXIgc2luY2UgdGhlIGxhc3QgcGVyc29uIHRvIHJlcXVlc3QgdGhlCisgICAgICAgICMgbG9jayBpcyB0aGUgbW9zdCBsaWtlbHkgdG8gd2luIGl0LgorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxmID0gb3BlbihuYW1lLCAnYSsnKQorICAgICAgICAgICAgZmlsZW5vID0gbGYuZmlsZW5vKCkKKyAgICAgICAgICAgIGZjbnRsLmZsb2NrKGZpbGVubywgb3ApCisgICAgICAgICAgICBzdGF0aW5mbyA9IG9zLmZzdGF0KGZpbGVubykKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGxmLm5hbWUpOgorICAgICAgICAgICAgICAgIHN0YXRpbmZvMiA9IG9zLnN0YXQobGYubmFtZSkKKyAgICAgICAgICAgICAgICBpZiBzdGF0aW5mby5zdF9pbm8gPT0gc3RhdGluZm8yLnN0X2lubzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxmCisgICAgICAgICAgICBsZi5jbG9zZSgpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbGYuY2xvc2UoKQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBwYXNzCisgICAgICAgIGlmIG5vdCByZXRyeToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKK2RlZiB1bmxvY2tmaWxlKGxmKToKKyAgICAiIiIKKyAgICBVbmxvY2sgYSBmaWxlIGxvY2tlZCB1c2luZyBsb2NrZmlsZSgpCisgICAgIiIiCisgICAgdHJ5OgorICAgICAgICAjIElmIHdlIGhhZCBhIHNoYXJlZCBsb2NrLCB3ZSBuZWVkIHRvIHByb21vdGUgdG8gZXhjbHVzaXZlIGJlZm9yZQorICAgICAgICAjIHJlbW92aW5nIHRoZSBsb2NrZmlsZS4gQXR0ZW1wdCB0aGlzLCBpZ25vcmUgZmFpbHVyZXMuCisgICAgICAgIGZjbnRsLmZsb2NrKGxmLmZpbGVubygpLCBmY250bC5MT0NLX0VYfGZjbnRsLkxPQ0tfTkIpCisgICAgICAgIG9zLnVubGluayhsZi5uYW1lKQorICAgIGV4Y2VwdCAoSU9FcnJvciwgT1NFcnJvcik6CisgICAgICAgIHBhc3MKKyAgICBmY250bC5mbG9jayhsZi5maWxlbm8oKSwgZmNudGwuTE9DS19VTikKKyAgICBsZi5jbG9zZSgpCisKK2RlZiBtZDVfZmlsZShmaWxlbmFtZSk6CisgICAgIiIiCisgICAgUmV0dXJuIHRoZSBoZXggc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBNRDUgY2hlY2tzdW0gb2YgZmlsZW5hbWUuCisgICAgIiIiCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgaGFzaGxpYgorICAgICAgICBtID0gaGFzaGxpYi5tZDUoKQorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgaW1wb3J0IG1kNQorICAgICAgICBtID0gbWQ1Lm5ldygpCisKKyAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICJyYiIpIGFzIGY6CisgICAgICAgIGZvciBsaW5lIGluIGY6CisgICAgICAgICAgICBtLnVwZGF0ZShsaW5lKQorICAgIHJldHVybiBtLmhleGRpZ2VzdCgpCisKK2RlZiBzaGEyNTZfZmlsZShmaWxlbmFtZSk6CisgICAgIiIiCisgICAgUmV0dXJuIHRoZSBoZXggc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSAyNTYtYml0IFNIQSBjaGVja3N1bSBvZgorICAgIGZpbGVuYW1lLiAgT24gUHl0aG9uIDIuNCB0aGlzIHdpbGwgcmV0dXJuIE5vbmUsIHNvIGNhbGxlcnMgd2lsbCBuZWVkIHRvCisgICAgaGFuZGxlIHRoYXQgYnkgZWl0aGVyIHNraXBwaW5nIFNIQSBjaGVja3MsIG9yIHJ1bm5pbmcgYSBzdGFuZGFsb25lIHNoYTI1NnN1bQorICAgIGJpbmFyeS4KKyAgICAiIiIKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCBoYXNobGliCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgcyA9IGhhc2hsaWIuc2hhMjU2KCkKKyAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICJyYiIpIGFzIGY6CisgICAgICAgIGZvciBsaW5lIGluIGY6CisgICAgICAgICAgICBzLnVwZGF0ZShsaW5lKQorICAgIHJldHVybiBzLmhleGRpZ2VzdCgpCisKK2RlZiBwcmVzZXJ2ZWRfZW52dmFyc19leHBvcnRlZCgpOgorICAgICIiIlZhcmlhYmxlcyB3aGljaCBhcmUgdGFrZW4gZnJvbSB0aGUgZW52aXJvbm1lbnQgYW5kIHBsYWNlZCBpbiBhbmQgZXhwb3J0ZWQKKyAgICBmcm9tIHRoZSBtZXRhZGF0YSIiIgorICAgIHJldHVybiBbCisgICAgICAgICdCQl9UQVNLSEFTSCcsCisgICAgICAgICdIT01FJywKKyAgICAgICAgJ0xPR05BTUUnLAorICAgICAgICAnUEFUSCcsCisgICAgICAgICdQV0QnLAorICAgICAgICAnU0hFTEwnLAorICAgICAgICAnVEVSTScsCisgICAgICAgICdVU0VSJywKKyAgICBdCisKK2RlZiBwcmVzZXJ2ZWRfZW52dmFycygpOgorICAgICIiIlZhcmlhYmxlcyB3aGljaCBhcmUgdGFrZW4gZnJvbSB0aGUgZW52aXJvbm1lbnQgYW5kIHBsYWNlZCBpbiB0aGUgbWV0YWRhdGEiIiIKKyAgICB2ID0gWworICAgICAgICAnQkJQQVRIJywKKyAgICAgICAgJ0JCX1BSRVNFUlZFX0VOVicsCisgICAgICAgICdCQl9FTlZfV0hJVEVMSVNUJywKKyAgICAgICAgJ0JCX0VOVl9FWFRSQVdISVRFJywKKyAgICBdCisgICAgcmV0dXJuIHYgKyBwcmVzZXJ2ZWRfZW52dmFyc19leHBvcnRlZCgpCisKK2RlZiBmaWx0ZXJfZW52aXJvbm1lbnQoZ29vZF92YXJzKToKKyAgICAiIiIKKyAgICBDcmVhdGUgYSBwcmlzdGluZSBlbnZpcm9ubWVudCBmb3IgYml0YmFrZS4gVGhpcyB3aWxsIHJlbW92ZSB2YXJpYWJsZXMgdGhhdAorICAgIGFyZSBub3Qga25vd24gYW5kIG1heSBpbmZsdWVuY2UgdGhlIGJ1aWxkIGluIGEgbmVnYXRpdmUgd2F5LgorICAgICIiIgorCisgICAgcmVtb3ZlZF92YXJzID0ge30KKyAgICBmb3Iga2V5IGluIG9zLmVudmlyb24ua2V5cygpOgorICAgICAgICBpZiBrZXkgaW4gZ29vZF92YXJzOgorICAgICAgICAgICAgY29udGludWUKKworICAgICAgICByZW1vdmVkX3ZhcnNba2V5XSA9IG9zLmVudmlyb25ba2V5XQorICAgICAgICBvcy51bnNldGVudihrZXkpCisgICAgICAgIGRlbCBvcy5lbnZpcm9uW2tleV0KKworICAgIGlmIHJlbW92ZWRfdmFyczoKKyAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJSZW1vdmVkIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGZyb20gdGhlIGVudmlyb25tZW50OiAlcyIsICIsICIuam9pbihyZW1vdmVkX3ZhcnMua2V5cygpKSkKKworICAgIHJldHVybiByZW1vdmVkX3ZhcnMKKworZGVmIGFwcHJvdmVkX3ZhcmlhYmxlcygpOgorICAgICIiIgorICAgIERldGVybWluZSBhbmQgcmV0dXJuIHRoZSBsaXN0IG9mIHdoaXRlbGlzdGVkIHZhcmlhYmxlcyB3aGljaCBhcmUgYXBwcm92ZWQKKyAgICB0byByZW1haW4gaW4gdGhlIGVudmlyb25tZW50LgorICAgICIiIgorICAgIGlmICdCQl9QUkVTRVJWRV9FTlYnIGluIG9zLmVudmlyb246CisgICAgICAgIHJldHVybiBvcy5lbnZpcm9uLmtleXMoKQorICAgIGFwcHJvdmVkID0gW10KKyAgICBpZiAnQkJfRU5WX1dISVRFTElTVCcgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgYXBwcm92ZWQgPSBvcy5lbnZpcm9uWydCQl9FTlZfV0hJVEVMSVNUJ10uc3BsaXQoKQorICAgICAgICBhcHByb3ZlZC5leHRlbmQoWydCQl9FTlZfV0hJVEVMSVNUJ10pCisgICAgZWxzZToKKyAgICAgICAgYXBwcm92ZWQgPSBwcmVzZXJ2ZWRfZW52dmFycygpCisgICAgaWYgJ0JCX0VOVl9FWFRSQVdISVRFJyBpbiBvcy5lbnZpcm9uOgorICAgICAgICBhcHByb3ZlZC5leHRlbmQob3MuZW52aXJvblsnQkJfRU5WX0VYVFJBV0hJVEUnXS5zcGxpdCgpKQorICAgICAgICBpZiAnQkJfRU5WX0VYVFJBV0hJVEUnIG5vdCBpbiBhcHByb3ZlZDoKKyAgICAgICAgICAgIGFwcHJvdmVkLmV4dGVuZChbJ0JCX0VOVl9FWFRSQVdISVRFJ10pCisgICAgcmV0dXJuIGFwcHJvdmVkCisKK2RlZiBjbGVhbl9lbnZpcm9ubWVudCgpOgorICAgICIiIgorICAgIENsZWFuIHVwIGFueSBzcHVyaW91cyBlbnZpcm9ubWVudCB2YXJpYWJsZXMuIFRoaXMgd2lsbCByZW1vdmUgYW55CisgICAgdmFyaWFibGVzIHRoZSB1c2VyIGhhc24ndCBjaG9zZW4gdG8gcHJlc2VydmUuCisgICAgIiIiCisgICAgaWYgJ0JCX1BSRVNFUlZFX0VOVicgbm90IGluIG9zLmVudmlyb246CisgICAgICAgIGdvb2RfdmFycyA9IGFwcHJvdmVkX3ZhcmlhYmxlcygpCisgICAgICAgIHJldHVybiBmaWx0ZXJfZW52aXJvbm1lbnQoZ29vZF92YXJzKQorCisgICAgcmV0dXJuIHt9CisKK2RlZiBlbXB0eV9lbnZpcm9ubWVudCgpOgorICAgICIiIgorICAgIFJlbW92ZSBhbGwgdmFyaWFibGVzIGZyb20gdGhlIGVudmlyb25tZW50LgorICAgICIiIgorICAgIGZvciBzIGluIG9zLmVudmlyb24ua2V5cygpOgorICAgICAgICBvcy51bnNldGVudihzKQorICAgICAgICBkZWwgb3MuZW52aXJvbltzXQorCitkZWYgYnVpbGRfZW52aXJvbm1lbnQoZCk6CisgICAgIiIiCisgICAgQnVpbGQgYW4gZW52aXJvbm1lbnQgZnJvbSBhbGwgZXhwb3J0ZWQgdmFyaWFibGVzLgorICAgICIiIgorICAgIGltcG9ydCBiYi5kYXRhCisgICAgZm9yIHZhciBpbiBiYi5kYXRhLmtleXMoZCk6CisgICAgICAgIGV4cG9ydCA9IGQuZ2V0VmFyRmxhZyh2YXIsICJleHBvcnQiKQorICAgICAgICBpZiBleHBvcnQ6CisgICAgICAgICAgICBvcy5lbnZpcm9uW3Zhcl0gPSBkLmdldFZhcih2YXIsIFRydWUpIG9yICIiCisKK2RlZiBfY2hlY2tfdW5zYWZlX2RlbGV0ZV9wYXRoKHBhdGgpOgorICAgICIiIgorICAgIEJhc2ljIHNhZmVndWFyZCBhZ2FpbnN0IHJlY3Vyc2l2ZWx5IGRlbGV0aW5nIHNvbWV0aGluZyB3ZSBzaG91bGRuJ3QuIElmIGl0IHJldHVybnMgVHJ1ZSwKKyAgICB0aGUgY2FsbGVyIHNob3VsZCByYWlzZSBhbiBleGNlcHRpb24gd2l0aCBhbiBhcHByb3ByaWF0ZSBtZXNzYWdlLgorICAgIE5PVEU6IFRoaXMgaXMgTk9UIG1lYW50IHRvIGJlIGEgc2VjdXJpdHkgbWVjaGFuaXNtIC0ganVzdCBhIGd1YXJkIGFnYWluc3Qgc2lsbHkgbWlzdGFrZXMKKyAgICB3aXRoIHBvdGVudGlhbGx5IGRpc2FzdHJvdXMgcmVzdWx0cy4KKyAgICAiIiIKKyAgICBleHRyYSA9ICcnCisgICAgIyBIT01FIG1pZ2h0IG5vdCBiZSAvaG9tZS9zb21ldGhpbmcsIHNvIGluIGNhc2Ugd2UgY2FuIGdldCBpdCwgY2hlY2sgYWdhaW5zdCBpdAorICAgIGhvbWVkaXIgPSBvcy5lbnZpcm9uLmdldCgnSE9NRScsICcnKQorICAgIGlmIGhvbWVkaXI6CisgICAgICAgIGV4dHJhID0gJ3wlcycgJSBob21lZGlyCisgICAgaWYgcmUubWF0Y2goJygvfC8vfC9ob21lfC9ob21lL1teL10qJXMpJCcgJSBleHRyYSwgb3MucGF0aC5hYnNwYXRoKHBhdGgpKToKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICByZXR1cm4gRmFsc2UKKworZGVmIHJlbW92ZShwYXRoLCByZWN1cnNlPUZhbHNlKToKKyAgICAiIiJFcXVpdmFsZW50IHRvIHJtIC1mIG9yIHJtIC1yZiIiIgorICAgIGlmIG5vdCBwYXRoOgorICAgICAgICByZXR1cm4KKyAgICBpZiByZWN1cnNlOgorICAgICAgICBmb3IgbmFtZSBpbiBnbG9iLmdsb2IocGF0aCk6CisgICAgICAgICAgICBpZiBfY2hlY2tfdW5zYWZlX2RlbGV0ZV9wYXRoKHBhdGgpOgorICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignYmIudXRpbHMucmVtb3ZlOiBjYWxsZWQgd2l0aCBkYW5nZXJvdXMgcGF0aCAiJXMiIGFuZCByZWN1cnNlPVRydWUsIHJlZnVzaW5nIHRvIGRlbGV0ZSEnICUgcGF0aCkKKyAgICAgICAgIyBzaHV0aWwucm10cmVlKG5hbWUpIHdvdWxkIGJlIGlkZWFsIGJ1dCBpdHMgdG9vIHNsb3cKKyAgICAgICAgc3VicHJvY2Vzcy5jYWxsKFsncm0nLCAnLXJmJ10gKyBnbG9iLmdsb2IocGF0aCkpCisgICAgICAgIHJldHVybgorICAgIGZvciBuYW1lIGluIGdsb2IuZ2xvYihwYXRoKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGV4YzoKKyAgICAgICAgICAgIGlmIGV4Yy5lcnJubyAhPSBlcnJuby5FTk9FTlQ6CisgICAgICAgICAgICAgICAgcmFpc2UKKworZGVmIHBydW5lZGlyKHRvcGRpcik6CisgICAgIyBEZWxldGUgZXZlcnl0aGluZyByZWFjaGFibGUgZnJvbSB0aGUgZGlyZWN0b3J5IG5hbWVkIGluICd0b3BkaXInLgorICAgICMgQ0FVVElPTjogIFRoaXMgaXMgZGFuZ2Vyb3VzIQorICAgIGlmIF9jaGVja191bnNhZmVfZGVsZXRlX3BhdGgodG9wZGlyKToKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCdiYi51dGlscy5wcnVuZWRpcjogY2FsbGVkIHdpdGggZGFuZ2Vyb3VzIHBhdGggIiVzIiwgcmVmdXNpbmcgdG8gZGVsZXRlIScgJSB0b3BkaXIpCisgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsodG9wZGlyLCB0b3Bkb3duID0gRmFsc2UpOgorICAgICAgICBmb3IgbmFtZSBpbiBmaWxlczoKKyAgICAgICAgICAgIG9zLnJlbW92ZShvcy5wYXRoLmpvaW4ocm9vdCwgbmFtZSkpCisgICAgICAgIGZvciBuYW1lIGluIGRpcnM6CisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzbGluayhvcy5wYXRoLmpvaW4ocm9vdCwgbmFtZSkpOgorICAgICAgICAgICAgICAgIG9zLnJlbW92ZShvcy5wYXRoLmpvaW4ocm9vdCwgbmFtZSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG9zLnJtZGlyKG9zLnBhdGguam9pbihyb290LCBuYW1lKSkKKyAgICBvcy5ybWRpcih0b3BkaXIpCisKKyMKKyMgQ291bGQgYWxzbyB1c2UgcmV0dXJuIHJlLmNvbXBpbGUoIiglcykiICUgInwiLmpvaW4obWFwKHJlLmVzY2FwZSwgc3VmZml4ZXMpKSkuc3ViKGxhbWJkYSBtbzogIiIsIHZhcikKKyMgYnV0IHRoYXRzIHBvc3NpYmx5IGluc2FuZSBhbmQgc3VmZml4ZXMgaXMgcHJvYmFibHkgZ29pbmcgdG8gYmUgc21hbGwKKyMKK2RlZiBwcnVuZV9zdWZmaXgodmFyLCBzdWZmaXhlcywgZCk6CisgICAgIyBTZWUgaWYgdmFyIGVuZHMgd2l0aCBhbnkgb2YgdGhlIHN1ZmZpeGVzIGxpc3RlZCBhbmQKKyAgICAjIHJlbW92ZSBpdCBpZiBmb3VuZAorICAgIGZvciBzdWZmaXggaW4gc3VmZml4ZXM6CisgICAgICAgIGlmIHZhci5lbmRzd2l0aChzdWZmaXgpOgorICAgICAgICAgICAgcmV0dXJuIHZhci5yZXBsYWNlKHN1ZmZpeCwgIiIpCisgICAgcmV0dXJuIHZhcgorCitkZWYgbWtkaXJoaWVyKGRpcmVjdG9yeSk6CisgICAgIiIiQ3JlYXRlIGEgZGlyZWN0b3J5IGxpa2UgJ21rZGlyIC1wJywgYnV0IGRvZXMgbm90IGNvbXBsYWluIGlmCisgICAgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzIGxpa2Ugb3MubWFrZWRpcnMKKyAgICAiIiIKKworICAgIHRyeToKKyAgICAgICAgb3MubWFrZWRpcnMoZGlyZWN0b3J5KQorICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CisgICAgICAgIGlmIGUuZXJybm8gIT0gZXJybm8uRUVYSVNUOgorICAgICAgICAgICAgcmFpc2UgZQorCitkZWYgbW92ZWZpbGUoc3JjLCBkZXN0LCBuZXdtdGltZSA9IE5vbmUsIHNzdGF0ID0gTm9uZSk6CisgICAgIiIiTW92ZXMgYSBmaWxlIGZyb20gc3JjIHRvIGRlc3QsIHByZXNlcnZpbmcgYWxsIHBlcm1pc3Npb25zIGFuZAorICAgIGF0dHJpYnV0ZXM7IG10aW1lIHdpbGwgYmUgcHJlc2VydmVkIGV2ZW4gd2hlbiBtb3ZpbmcgYWNyb3NzCisgICAgZmlsZXN5c3RlbXMuICBSZXR1cm5zIHRydWUgb24gc3VjY2VzcyBhbmQgZmFsc2Ugb24gZmFpbHVyZS4gTW92ZSBpcworICAgIGF0b21pYy4KKyAgICAiIiIKKworICAgICNwcmludCAibW92ZWZpbGUoIiArIHNyYyArICIsIiArIGRlc3QgKyAiLCIgKyBzdHIobmV3bXRpbWUpICsgIiwiICsgc3RyKHNzdGF0KSArICIpIgorICAgIHRyeToKKyAgICAgICAgaWYgbm90IHNzdGF0OgorICAgICAgICAgICAgc3N0YXQgPSBvcy5sc3RhdChzcmMpCisgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICBwcmludCgibW92ZWZpbGU6IFN0YXRpbmcgc291cmNlIGZpbGUgZmFpbGVkLi4uIiwgZSkKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlc3RleGlzdHMgPSAxCisgICAgdHJ5OgorICAgICAgICBkc3RhdCA9IG9zLmxzdGF0KGRlc3QpCisgICAgZXhjZXB0OgorICAgICAgICBkc3RhdCA9IG9zLmxzdGF0KG9zLnBhdGguZGlybmFtZShkZXN0KSkKKyAgICAgICAgZGVzdGV4aXN0cyA9IDAKKworICAgIGlmIGRlc3RleGlzdHM6CisgICAgICAgIGlmIHN0YXQuU19JU0xOSyhkc3RhdFtzdGF0LlNUX01PREVdKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsoZGVzdCkKKyAgICAgICAgICAgICAgICBkZXN0ZXhpc3RzID0gMAorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGlmIHN0YXQuU19JU0xOSyhzc3RhdFtzdGF0LlNUX01PREVdKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGFyZ2V0ID0gb3MucmVhZGxpbmsoc3JjKQorICAgICAgICAgICAgaWYgZGVzdGV4aXN0cyBhbmQgbm90IHN0YXQuU19JU0RJUihkc3RhdFtzdGF0LlNUX01PREVdKToKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsoZGVzdCkKKyAgICAgICAgICAgIG9zLnN5bWxpbmsodGFyZ2V0LCBkZXN0KQorICAgICAgICAgICAgI29zLmxjaG93bihkZXN0LHNzdGF0W3N0YXQuU1RfVUlEXSxzc3RhdFtzdGF0LlNUX0dJRF0pCisgICAgICAgICAgICBvcy51bmxpbmsoc3JjKQorICAgICAgICAgICAgcmV0dXJuIG9zLmxzdGF0KGRlc3QpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgIHByaW50KCJtb3ZlZmlsZTogZmFpbGVkIHRvIHByb3Blcmx5IGNyZWF0ZSBzeW1saW5rOiIsIGRlc3QsICItPiIsIHRhcmdldCwgZSkKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICByZW5hbWVmYWlsZWQgPSAxCisgICAgaWYgc3N0YXRbc3RhdC5TVF9ERVZdID09IGRzdGF0W3N0YXQuU1RfREVWXToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBvcy5yZW5hbWUgbmVlZHMgdG8ga25vdyB0aGUgZGVzdCBwYXRoIGVuZGluZyB3aXRoIGZpbGUgbmFtZQorICAgICAgICAgICAgIyBzbyBhcHBlbmQgdGhlIGZpbGUgbmFtZSB0byBhIHBhdGggb25seSBpZiBpdCdzIGEgZGlyIHNwZWNpZmllZAorICAgICAgICAgICAgc3JjZm5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHNyYykKKyAgICAgICAgICAgIGRlc3RwYXRoID0gb3MucGF0aC5qb2luKGRlc3QsIHNyY2ZuYW1lKSBpZiBvcy5wYXRoLmlzZGlyKGRlc3QpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgZGVzdAorICAgICAgICAgICAgb3MucmVuYW1lKHNyYywgZGVzdHBhdGgpCisgICAgICAgICAgICByZW5hbWVmYWlsZWQgPSAwCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgIGlmIGVbMF0gIT0gZXJybm8uRVhERVY6CisgICAgICAgICAgICAgICAgIyBTb21lIHJhbmRvbSBlcnJvci4KKyAgICAgICAgICAgICAgICBwcmludCgibW92ZWZpbGU6IEZhaWxlZCB0byBtb3ZlIiwgc3JjLCAidG8iLCBkZXN0LCBlKQorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICAjIEludmFsaWQgY3Jvc3MtZGV2aWNlLWxpbmsgJ2JpbmQnIG1vdW50ZWQgb3IgYWN0dWFsbHkgQ3Jvc3MtRGV2aWNlCisKKyAgICBpZiByZW5hbWVmYWlsZWQ6CisgICAgICAgIGRpZGNvcHkgPSAwCisgICAgICAgIGlmIHN0YXQuU19JU1JFRyhzc3RhdFtzdGF0LlNUX01PREVdKToKKyAgICAgICAgICAgIHRyeTogIyBGb3Igc2FmZXR5IGNvcHkgdGhlbiBtb3ZlIGl0IG92ZXIuCisgICAgICAgICAgICAgICAgc2h1dGlsLmNvcHlmaWxlKHNyYywgZGVzdCArICIjbmV3IikKKyAgICAgICAgICAgICAgICBvcy5yZW5hbWUoZGVzdCArICIjbmV3IiwgZGVzdCkKKyAgICAgICAgICAgICAgICBkaWRjb3B5ID0gMQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgICAgIHByaW50KCdtb3ZlZmlsZTogY29weScsIHNyYywgJy0+JywgZGVzdCwgJ2ZhaWxlZC4nLCBlKQorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjd2UgZG9uJ3QgeWV0IGhhbmRsZSBzcGVjaWFsLCBzbyB3ZSBuZWVkIHRvIGZhbGwgYmFjayB0byAvYmluL212CisgICAgICAgICAgICBhID0gZ2V0c3RhdHVzb3V0cHV0KCIvYmluL212IC1mICIgKyAiJyIgKyBzcmMgKyAiJyAnIiArIGRlc3QgKyAiJyIpCisgICAgICAgICAgICBpZiBhWzBdICE9IDA6CisgICAgICAgICAgICAgICAgcHJpbnQoIm1vdmVmaWxlOiBGYWlsZWQgdG8gbW92ZSBzcGVjaWFsIGZpbGU6IiArIHNyYyArICInIHRvICciICsgZGVzdCArICInIiwgYSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZSAjIGZhaWx1cmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgZGlkY29weToKKyAgICAgICAgICAgICAgICBvcy5sY2hvd24oZGVzdCwgc3N0YXRbc3RhdC5TVF9VSURdLCBzc3RhdFtzdGF0LlNUX0dJRF0pCisgICAgICAgICAgICAgICAgb3MuY2htb2QoZGVzdCwgc3RhdC5TX0lNT0RFKHNzdGF0W3N0YXQuU1RfTU9ERV0pKSAjIFN0aWNreSBpcyByZXNldCBvbiBjaG93bgorICAgICAgICAgICAgICAgIG9zLnVubGluayhzcmMpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgIHByaW50KCJtb3ZlZmlsZTogRmFpbGVkIHRvIGNob3duL2NobW9kL3VubGluayIsIGRlc3QsIGUpCisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgaWYgbmV3bXRpbWU6CisgICAgICAgIG9zLnV0aW1lKGRlc3QsIChuZXdtdGltZSwgbmV3bXRpbWUpKQorICAgIGVsc2U6CisgICAgICAgIG9zLnV0aW1lKGRlc3QsIChzc3RhdFtzdGF0LlNUX0FUSU1FXSwgc3N0YXRbc3RhdC5TVF9NVElNRV0pKQorICAgICAgICBuZXdtdGltZSA9IHNzdGF0W3N0YXQuU1RfTVRJTUVdCisgICAgcmV0dXJuIG5ld210aW1lCisKK2RlZiBjb3B5ZmlsZShzcmMsIGRlc3QsIG5ld210aW1lID0gTm9uZSwgc3N0YXQgPSBOb25lKToKKyAgICAiIiIKKyAgICBDb3BpZXMgYSBmaWxlIGZyb20gc3JjIHRvIGRlc3QsIHByZXNlcnZpbmcgYWxsIHBlcm1pc3Npb25zIGFuZAorICAgIGF0dHJpYnV0ZXM7IG10aW1lIHdpbGwgYmUgcHJlc2VydmVkIGV2ZW4gd2hlbiBtb3ZpbmcgYWNyb3NzCisgICAgZmlsZXN5c3RlbXMuICBSZXR1cm5zIHRydWUgb24gc3VjY2VzcyBhbmQgZmFsc2Ugb24gZmFpbHVyZS4KKyAgICAiIiIKKyAgICAjcHJpbnQgImNvcHlmaWxlKCIgKyBzcmMgKyAiLCIgKyBkZXN0ICsgIiwiICsgc3RyKG5ld210aW1lKSArICIsIiArIHN0cihzc3RhdCkgKyAiKSIKKyAgICB0cnk6CisgICAgICAgIGlmIG5vdCBzc3RhdDoKKyAgICAgICAgICAgIHNzdGF0ID0gb3MubHN0YXQoc3JjKQorICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgbG9nZ2VyLndhcm4oImNvcHlmaWxlOiBzdGF0IG9mICVzIGZhaWxlZCAoJXMpIiAlIChzcmMsIGUpKQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlc3RleGlzdHMgPSAxCisgICAgdHJ5OgorICAgICAgICBkc3RhdCA9IG9zLmxzdGF0KGRlc3QpCisgICAgZXhjZXB0OgorICAgICAgICBkc3RhdCA9IG9zLmxzdGF0KG9zLnBhdGguZGlybmFtZShkZXN0KSkKKyAgICAgICAgZGVzdGV4aXN0cyA9IDAKKworICAgIGlmIGRlc3RleGlzdHM6CisgICAgICAgIGlmIHN0YXQuU19JU0xOSyhkc3RhdFtzdGF0LlNUX01PREVdKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsoZGVzdCkKKyAgICAgICAgICAgICAgICBkZXN0ZXhpc3RzID0gMAorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGlmIHN0YXQuU19JU0xOSyhzc3RhdFtzdGF0LlNUX01PREVdKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGFyZ2V0ID0gb3MucmVhZGxpbmsoc3JjKQorICAgICAgICAgICAgaWYgZGVzdGV4aXN0cyBhbmQgbm90IHN0YXQuU19JU0RJUihkc3RhdFtzdGF0LlNUX01PREVdKToKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsoZGVzdCkKKyAgICAgICAgICAgIG9zLnN5bWxpbmsodGFyZ2V0LCBkZXN0KQorICAgICAgICAgICAgI29zLmxjaG93bihkZXN0LHNzdGF0W3N0YXQuU1RfVUlEXSxzc3RhdFtzdGF0LlNUX0dJRF0pCisgICAgICAgICAgICByZXR1cm4gb3MubHN0YXQoZGVzdCkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvcHlmaWxlOiBmYWlsZWQgdG8gY3JlYXRlIHN5bWxpbmsgJXMgdG8gJXMgKCVzKSIgJSAoZGVzdCwgdGFyZ2V0LCBlKSkKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgaWYgc3RhdC5TX0lTUkVHKHNzdGF0W3N0YXQuU1RfTU9ERV0pOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzcmNjaG93biA9IEZhbHNlCisgICAgICAgICAgICBpZiBub3Qgb3MuYWNjZXNzKHNyYywgb3MuUl9PSyk6CisgICAgICAgICAgICAgICAgIyBNYWtlIHN1cmUgd2UgY2FuIHJlYWQgaXQKKyAgICAgICAgICAgICAgICBzcmNjaG93biA9IFRydWUKKyAgICAgICAgICAgICAgICBvcy5jaG1vZChzcmMsIHNzdGF0W3N0YXQuU1RfTU9ERV0gfCBzdGF0LlNfSVJVU1IpCisKKyAgICAgICAgICAgICMgRm9yIHNhZmV0eSBjb3B5IHRoZW4gbW92ZSBpdCBvdmVyLgorICAgICAgICAgICAgc2h1dGlsLmNvcHlmaWxlKHNyYywgZGVzdCArICIjbmV3IikKKyAgICAgICAgICAgIG9zLnJlbmFtZShkZXN0ICsgIiNuZXciLCBkZXN0KQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICBsb2dnZXIud2FybigiY29weWZpbGU6IGNvcHkgJXMgdG8gJXMgZmFpbGVkICglcykiICUgKHNyYywgZGVzdCwgZSkpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIHNyY2Nob3duOgorICAgICAgICAgICAgICAgIG9zLmNobW9kKHNyYywgc3N0YXRbc3RhdC5TVF9NT0RFXSkKKyAgICAgICAgICAgICAgICBvcy51dGltZShzcmMsIChzc3RhdFtzdGF0LlNUX0FUSU1FXSwgc3N0YXRbc3RhdC5TVF9NVElNRV0pKQorCisgICAgZWxzZToKKyAgICAgICAgI3dlIGRvbid0IHlldCBoYW5kbGUgc3BlY2lhbCwgc28gd2UgbmVlZCB0byBmYWxsIGJhY2sgdG8gL2Jpbi9tdgorICAgICAgICBhID0gZ2V0c3RhdHVzb3V0cHV0KCIvYmluL2NwIC1mICIgKyAiJyIgKyBzcmMgKyAiJyAnIiArIGRlc3QgKyAiJyIpCisgICAgICAgIGlmIGFbMF0gIT0gMDoKKyAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3B5ZmlsZTogZmFpbGVkIHRvIGNvcHkgc3BlY2lhbCBmaWxlICVzIHRvICVzICglcykiICUgKHNyYywgZGVzdCwgYSkpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UgIyBmYWlsdXJlCisgICAgdHJ5OgorICAgICAgICBvcy5sY2hvd24oZGVzdCwgc3N0YXRbc3RhdC5TVF9VSURdLCBzc3RhdFtzdGF0LlNUX0dJRF0pCisgICAgICAgIG9zLmNobW9kKGRlc3QsIHN0YXQuU19JTU9ERShzc3RhdFtzdGF0LlNUX01PREVdKSkgIyBTdGlja3kgaXMgcmVzZXQgb24gY2hvd24KKyAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgIGxvZ2dlci53YXJuKCJjb3B5ZmlsZTogZmFpbGVkIHRvIGNob3duL2NobW9kICVzICglcykiICUgKGRlc3QsIGUpKQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGlmIG5ld210aW1lOgorICAgICAgICBvcy51dGltZShkZXN0LCAobmV3bXRpbWUsIG5ld210aW1lKSkKKyAgICBlbHNlOgorICAgICAgICBvcy51dGltZShkZXN0LCAoc3N0YXRbc3RhdC5TVF9BVElNRV0sIHNzdGF0W3N0YXQuU1RfTVRJTUVdKSkKKyAgICAgICAgbmV3bXRpbWUgPSBzc3RhdFtzdGF0LlNUX01USU1FXQorICAgIHJldHVybiBuZXdtdGltZQorCitkZWYgd2hpY2gocGF0aCwgaXRlbSwgZGlyZWN0aW9uID0gMCwgaGlzdG9yeSA9IEZhbHNlKToKKyAgICAiIiIKKyAgICBMb2NhdGUgYSBmaWxlIGluIGEgUEFUSAorICAgICIiIgorCisgICAgaGlzdCA9IFtdCisgICAgcGF0aHMgPSAocGF0aCBvciAiIikuc3BsaXQoJzonKQorICAgIGlmIGRpcmVjdGlvbiAhPSAwOgorICAgICAgICBwYXRocy5yZXZlcnNlKCkKKworICAgIGZvciBwIGluIHBhdGhzOgorICAgICAgICBuZXh0ID0gb3MucGF0aC5qb2luKHAsIGl0ZW0pCisgICAgICAgIGhpc3QuYXBwZW5kKG5leHQpCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG5leHQpOgorICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNhYnMobmV4dCk6CisgICAgICAgICAgICAgICAgbmV4dCA9IG9zLnBhdGguYWJzcGF0aChuZXh0KQorICAgICAgICAgICAgaWYgaGlzdG9yeToKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV4dCwgaGlzdAorICAgICAgICAgICAgcmV0dXJuIG5leHQKKworICAgIGlmIGhpc3Rvcnk6CisgICAgICAgIHJldHVybiAiIiwgaGlzdAorICAgIHJldHVybiAiIgorCitkZWYgdG9fYm9vbGVhbihzdHJpbmcsIGRlZmF1bHQ9Tm9uZSk6CisgICAgaWYgbm90IHN0cmluZzoKKyAgICAgICAgcmV0dXJuIGRlZmF1bHQKKworICAgIG5vcm1hbGl6ZWQgPSBzdHJpbmcubG93ZXIoKQorICAgIGlmIG5vcm1hbGl6ZWQgaW4gKCJ5IiwgInllcyIsICIxIiwgInRydWUiKToKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICBlbGlmIG5vcm1hbGl6ZWQgaW4gKCJuIiwgIm5vIiwgIjAiLCAiZmFsc2UiKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCB2YWx1ZSBmb3IgdG9fYm9vbGVhbjogJXMiICUgc3RyaW5nKQorCitkZWYgY29udGFpbnModmFyaWFibGUsIGNoZWNrdmFsdWVzLCB0cnVldmFsdWUsIGZhbHNldmFsdWUsIGQpOgorICAgIHZhbCA9IGQuZ2V0VmFyKHZhcmlhYmxlLCBUcnVlKQorICAgIGlmIG5vdCB2YWw6CisgICAgICAgIHJldHVybiBmYWxzZXZhbHVlCisgICAgdmFsID0gc2V0KHZhbC5zcGxpdCgpKQorICAgIGlmIGlzaW5zdGFuY2UoY2hlY2t2YWx1ZXMsIGJhc2VzdHJpbmcpOgorICAgICAgICBjaGVja3ZhbHVlcyA9IHNldChjaGVja3ZhbHVlcy5zcGxpdCgpKQorICAgIGVsc2U6CisgICAgICAgIGNoZWNrdmFsdWVzID0gc2V0KGNoZWNrdmFsdWVzKQorICAgIGlmIGNoZWNrdmFsdWVzLmlzc3Vic2V0KHZhbCk6IAorICAgICAgICByZXR1cm4gdHJ1ZXZhbHVlCisgICAgcmV0dXJuIGZhbHNldmFsdWUKKworZGVmIGNvbnRhaW5zX2FueSh2YXJpYWJsZSwgY2hlY2t2YWx1ZXMsIHRydWV2YWx1ZSwgZmFsc2V2YWx1ZSwgZCk6CisgICAgdmFsID0gZC5nZXRWYXIodmFyaWFibGUsIFRydWUpCisgICAgaWYgbm90IHZhbDoKKyAgICAgICAgcmV0dXJuIGZhbHNldmFsdWUKKyAgICB2YWwgPSBzZXQodmFsLnNwbGl0KCkpCisgICAgaWYgaXNpbnN0YW5jZShjaGVja3ZhbHVlcywgYmFzZXN0cmluZyk6CisgICAgICAgIGNoZWNrdmFsdWVzID0gc2V0KGNoZWNrdmFsdWVzLnNwbGl0KCkpCisgICAgZWxzZToKKyAgICAgICAgY2hlY2t2YWx1ZXMgPSBzZXQoY2hlY2t2YWx1ZXMpCisgICAgaWYgY2hlY2t2YWx1ZXMgJiB2YWw6CisgICAgICAgIHJldHVybiB0cnVldmFsdWUKKyAgICByZXR1cm4gZmFsc2V2YWx1ZQorCitkZWYgY3B1X2NvdW50KCk6CisgICAgcmV0dXJuIG11bHRpcHJvY2Vzc2luZy5jcHVfY291bnQoKQorCitkZWYgbm9uYmxvY2tpbmdmZChmZCk6CisgICAgZmNudGwuZmNudGwoZmQsIGZjbnRsLkZfU0VURkwsIGZjbnRsLmZjbnRsKGZkLCBmY250bC5GX0dFVEZMKSB8IG9zLk9fTk9OQkxPQ0spCisKK2RlZiBwcm9jZXNzX3Byb2ZpbGVsb2coZm4sIHBvdXQgPSBOb25lKToKKyAgICAjIEVpdGhlciBjYWxsIHdpdGggYSBsaXN0IG9mIGZpbGVuYW1lcyBhbmQgc2V0IHBvdXQgb3IgYSBmaWxlbmFtZSBhbmQgb3B0aW9uYWxseSBwb3V0LgorICAgIGlmIG5vdCBwb3V0OgorICAgICAgICBwb3V0ID0gZm4gKyAnLnByb2Nlc3NlZCcKKyAgICBwb3V0ID0gb3Blbihwb3V0LCAndycpCisgICAKKyAgICBpbXBvcnQgcHN0YXRzCisgICAgaWYgaXNpbnN0YW5jZShmbiwgbGlzdCk6CisgICAgICAgIHAgPSBwc3RhdHMuU3RhdHMoKmZuLCBzdHJlYW09cG91dCkKKyAgICBlbHNlOgorICAgICAgICBwID0gcHN0YXRzLlN0YXRzKGZuLCBzdHJlYW09cG91dCkKKyAgICBwLnNvcnRfc3RhdHMoJ3RpbWUnKQorICAgIHAucHJpbnRfc3RhdHMoKQorICAgIHAucHJpbnRfY2FsbGVycygpCisgICAgcC5zb3J0X3N0YXRzKCdjdW11bGF0aXZlJykKKyAgICBwLnByaW50X3N0YXRzKCkKKworICAgIHBvdXQuZmx1c2goKQorICAgIHBvdXQuY2xvc2UoKSAgCisKKyMKKyMgV2FzIHByZXNlbnQgdG8gd29yayBhcm91bmQgbXVsdGlwcm9jZXNzaW5nIHBvb2wgYnVncyBpbiBweXRob24gPCAyLjcuMworIworZGVmIG11bHRpcHJvY2Vzc2luZ3Bvb2woKmFyZ3MsICoqa3dhcmdzKToKKworICAgIGltcG9ydCBtdWx0aXByb2Nlc3NpbmcucG9vbAorICAgICNpbXBvcnQgbXVsdGlwcm9jZXNzaW5nLnV0aWwKKyAgICAjbXVsdGlwcm9jZXNzaW5nLnV0aWwubG9nX3RvX3N0ZGVycigxMCkKKyAgICAjIERlYWwgd2l0aCBhIG11bHRpcHJvY2Vzc2luZyBidWcgd2hlcmUgc2lnbmFscyB0byB0aGUgcHJvY2Vzc2VzIHdvdWxkIGJlIGRlbGF5ZWQgdW50aWwgdGhlIHdvcmsKKyAgICAjIGNvbXBsZXRlcy4gUHV0dGluZyBpbiBhIHRpbWVvdXQgbWVhbnMgdGhlIHNpZ25hbHMgKGxpa2UgU0lHSU5UL1NJR1RFUk0pIGdldCBwcm9jZXNzZWQuCisgICAgZGVmIHdyYXBwZXIoZnVuYyk6CisgICAgICAgIGRlZiB3cmFwKHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CisgICAgICAgICAgICByZXR1cm4gZnVuYyhzZWxmLCB0aW1lb3V0PXRpbWVvdXQgaWYgdGltZW91dCBpcyBub3QgTm9uZSBlbHNlIDFlMTAwKQorICAgICAgICByZXR1cm4gd3JhcAorICAgIG11bHRpcHJvY2Vzc2luZy5wb29sLklNYXBJdGVyYXRvci5uZXh0ID0gd3JhcHBlcihtdWx0aXByb2Nlc3NpbmcucG9vbC5JTWFwSXRlcmF0b3IubmV4dCkKKworICAgIHJldHVybiBtdWx0aXByb2Nlc3NpbmcuUG9vbCgqYXJncywgKiprd2FyZ3MpCisKK2RlZiBleGVjX2ZsYXRfcHl0aG9uX2Z1bmMoZnVuYywgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAiIiJFeGVjdXRlIGEgZmxhdCBweXRob24gZnVuY3Rpb24gKGRlZmluZWQgd2l0aCBkZWYgZnVuY25hbWUoYXJncyk6Li4uKSIiIgorICAgICMgUHJlcGFyZSBhIHNtYWxsIHBpZWNlIG9mIHB5dGhvbiBjb2RlIHdoaWNoIGNhbGxzIHRoZSByZXF1ZXN0ZWQgZnVuY3Rpb24KKyAgICAjIFRvIGRvIHRoaXMgd2UgbmVlZCB0byBwcmVwYXJlIHR3byB0aGluZ3MgLSBhIHNldCBvZiB2YXJpYWJsZXMgd2UgY2FuIHVzZSB0byBwYXNzCisgICAgIyB0aGUgdmFsdWVzIG9mIGFyZ3VtZW50cyBpbnRvIHRoZSBjYWxsaW5nIGZ1bmN0aW9uLCBhbmQgdGhlIGxpc3Qgb2YgYXJndW1lbnRzIGZvcgorICAgICMgdGhlIGZ1bmN0aW9uIGJlaW5nIGNhbGxlZAorICAgIGNvbnRleHQgPSB7fQorICAgIGZ1bmNhcmdzID0gW10KKyAgICAjIEhhbmRsZSB1bm5hbWVkIGFyZ3VtZW50cworICAgIGFpZHggPSAxCisgICAgZm9yIGFyZyBpbiBhcmdzOgorICAgICAgICBhcmduYW1lID0gJ2FyZ18lcycgJSBhaWR4CisgICAgICAgIGNvbnRleHRbYXJnbmFtZV0gPSBhcmcKKyAgICAgICAgZnVuY2FyZ3MuYXBwZW5kKGFyZ25hbWUpCisgICAgICAgIGFpZHggKz0gMQorICAgICMgSGFuZGxlIGtleXdvcmQgYXJndW1lbnRzCisgICAgY29udGV4dC51cGRhdGUoa3dhcmdzKQorICAgIGZ1bmNhcmdzLmV4dGVuZChbJyVzPSVzJyAlIChhcmcsIGFyZykgZm9yIGFyZyBpbiBrd2FyZ3MuaXRlcmtleXMoKV0pCisgICAgY29kZSA9ICdyZXR2YWwgPSAlcyglcyknICUgKGZ1bmMsICcsICcuam9pbihmdW5jYXJncykpCisgICAgY29tcCA9IGJiLnV0aWxzLmJldHRlcl9jb21waWxlKGNvZGUsICc8c3RyaW5nPicsICc8c3RyaW5nPicpCisgICAgYmIudXRpbHMuYmV0dGVyX2V4ZWMoY29tcCwgY29udGV4dCwgY29kZSwgJzxzdHJpbmc+JykKKyAgICByZXR1cm4gY29udGV4dFsncmV0dmFsJ10KKworZGVmIGVkaXRfbWV0YWRhdGEobWV0YV9saW5lcywgdmFyaWFibGVzLCB2YXJmdW5jLCBtYXRjaF9vdmVycmlkZXM9RmFsc2UpOgorICAgICIiIkVkaXQgbGluZXMgZnJvbSBhIHJlY2lwZSBvciBjb25maWcgZmlsZSBhbmQgbW9kaWZ5IG9uZSBvciBtb3JlCisgICAgc3BlY2lmaWVkIHZhcmlhYmxlIHZhbHVlcyBzZXQgaW4gdGhlIGZpbGUgdXNpbmcgYSBzcGVjaWZpZWQgY2FsbGJhY2sKKyAgICBmdW5jdGlvbi4gTGluZXMgYXJlIGV4cGVjdGVkIHRvIGhhdmUgdHJhaWxpbmcgbmV3bGluZXMuCisgICAgUGFyYW1ldGVyczoKKyAgICAgICAgbWV0YV9saW5lczogbGluZXMgZnJvbSB0aGUgZmlsZTsgY2FuIGJlIGEgbGlzdCBvciBhbiBpdGVyYWJsZQorICAgICAgICAgICAgKGUuZy4gZmlsZSBwb2ludGVyKQorICAgICAgICB2YXJpYWJsZXM6IGEgbGlzdCBvZiB2YXJpYWJsZSBuYW1lcyB0byBsb29rIGZvci4gRnVuY3Rpb25zCisgICAgICAgICAgICBtYXkgYWxzbyBiZSBzcGVjaWZpZWQsIGJ1dCBtdXN0IGJlIHNwZWNpZmllZCB3aXRoICcoKScgYXQKKyAgICAgICAgICAgIHRoZSBlbmQgb2YgdGhlIG5hbWUuIE5vdGUgdGhhdCB0aGUgZnVuY3Rpb24gZG9lc24ndCBoYXZlCisgICAgICAgICAgICBhbnkgaW50cmluc2ljIHVuZGVyc3RhbmRpbmcgb2YgX2FwcGVuZCwgX3ByZXBlbmQsIF9yZW1vdmUsCisgICAgICAgICAgICBvciBvdmVycmlkZXMsIHNvIHRoZXNlIGFyZSBjb25zaWRlcmVkIGFzIHBhcnQgb2YgdGhlIG5hbWUuCisgICAgICAgICAgICBUaGVzZSB2YWx1ZXMgZ28gaW50byBhIHJlZ3VsYXIgZXhwcmVzc2lvbiwgc28gcmVndWxhcgorICAgICAgICAgICAgZXhwcmVzc2lvbiBzeW50YXggaXMgYWxsb3dlZC4KKyAgICAgICAgdmFyZnVuYzogY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIGZvciBldmVyeSB2YXJpYWJsZSBtYXRjaGluZworICAgICAgICAgICAgb25lIG9mIHRoZSBlbnRyaWVzIGluIHRoZSB2YXJpYWJsZXMgcGFyYW1ldGVyLiBUaGUgZnVuY3Rpb24KKyAgICAgICAgICAgIHNob3VsZCB0YWtlIGZvdXIgYXJndW1lbnRzOgorICAgICAgICAgICAgICAgIHZhcm5hbWU6IG5hbWUgb2YgdmFyaWFibGUgbWF0Y2hlZAorICAgICAgICAgICAgICAgIG9yaWd2YWx1ZTogY3VycmVudCB2YWx1ZSBpbiBmaWxlCisgICAgICAgICAgICAgICAgb3A6IHRoZSBvcGVyYXRvciAoZS5nLiAnKz0nKQorICAgICAgICAgICAgICAgIG5ld2xpbmVzOiBsaXN0IG9mIGxpbmVzIHVwIHRvIHRoaXMgcG9pbnQuIFlvdSBjYW4gdXNlCisgICAgICAgICAgICAgICAgICAgIHRoaXMgdG8gcHJlcGVuZCBsaW5lcyBiZWZvcmUgdGhpcyB2YXJpYWJsZSBzZXR0aW5nCisgICAgICAgICAgICAgICAgICAgIGlmIHlvdSB3aXNoLgorICAgICAgICAgICAgYW5kIHNob3VsZCByZXR1cm4gYSB0aHJlZS1lbGVtZW50IHR1cGxlOgorICAgICAgICAgICAgICAgIG5ld3ZhbHVlOiBuZXcgdmFsdWUgdG8gc3Vic3RpdHV0ZSBpbiwgb3IgTm9uZSB0byBkcm9wCisgICAgICAgICAgICAgICAgICAgIHRoZSB2YXJpYWJsZSBzZXR0aW5nIGVudGlyZWx5LiAoSWYgdGhlIHJlbW92YWwKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyBpbiB0d28gY29uc2VjdXRpdmUgYmxhbmsgbGluZXMsIG9uZSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgYmxhbmsgbGluZXMgd2lsbCBhbHNvIGJlIGRyb3BwZWQpLgorICAgICAgICAgICAgICAgIG5ld29wOiB0aGUgb3BlcmF0b3IgdG8gdXNlIC0gaWYgeW91IHNwZWNpZnkgTm9uZSBoZXJlLAorICAgICAgICAgICAgICAgICAgICB0aGUgb3JpZ2luYWwgb3BlcmF0aW9uIHdpbGwgYmUgdXNlZC4KKyAgICAgICAgICAgICAgICBpbmRlbnQ6IG51bWJlciBvZiBzcGFjZXMgdG8gaW5kZW50IG11bHRpLWxpbmUgZW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgb3IgLTEgdG8gaW5kZW50IHVwIHRvIHRoZSBsZXZlbCBvZiB0aGUgYXNzaWdubWVudAorICAgICAgICAgICAgICAgICAgICBhbmQgb3BlbmluZyBxdW90ZSwgb3IgYSBzdHJpbmcgdG8gdXNlIGFzIHRoZSBpbmRlbnQuCisgICAgICAgICAgICAgICAgbWluYnJlYWs6IFRydWUgdG8gYWxsb3cgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYQorICAgICAgICAgICAgICAgICAgICBtdWx0aS1saW5lIHZhbHVlIHRvIGNvbnRpbnVlIG9uIHRoZSBzYW1lIGxpbmUgYXMKKyAgICAgICAgICAgICAgICAgICAgdGhlIGFzc2lnbm1lbnQsIEZhbHNlIHRvIGluZGVudCBiZWZvcmUgdGhlIGZpcnN0CisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuCisgICAgICAgIG1hdGNoX292ZXJyaWRlczogVHJ1ZSB0byBtYXRjaCBpdGVtcyB3aXRoIF9vdmVycmlkZXMgb24gdGhlIGVuZCwKKyAgICAgICAgICAgIEZhbHNlIG90aGVyd2lzZQorICAgIFJldHVybnMgYSB0dXBsZToKKyAgICAgICAgdXBkYXRlZDoKKyAgICAgICAgICAgIFRydWUgaWYgY2hhbmdlcyB3ZXJlIG1hZGUsIEZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgbmV3bGluZXM6CisgICAgICAgICAgICBMaW5lcyBhZnRlciBwcm9jZXNzaW5nCisgICAgIiIiCisKKyAgICB2YXJfcmVzID0ge30KKyAgICBpZiBtYXRjaF9vdmVycmlkZXM6CisgICAgICAgIG92ZXJyaWRlX3JlID0gJyhfW2EtekEtWjAtOS1fJCgpe31dKyk/JworICAgIGVsc2U6CisgICAgICAgIG92ZXJyaWRlX3JlID0gJycKKyAgICBmb3IgdmFyIGluIHZhcmlhYmxlczoKKyAgICAgICAgaWYgdmFyLmVuZHN3aXRoKCcoKScpOgorICAgICAgICAgICAgdmFyX3Jlc1t2YXJdID0gcmUuY29tcGlsZSgnXiglcyVzKVsgXFx0XSpcKFsgXFx0XSpcKVsgXFx0XSp7JyAlICh2YXJbOi0yXS5yc3RyaXAoKSwgb3ZlcnJpZGVfcmUpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdmFyX3Jlc1t2YXJdID0gcmUuY29tcGlsZSgnXiglcyVzKVsgXFx0XSpbPys6Ll0qPVsrLl0qWyBcXHRdKihbIlwnXSknICUgKHZhciwgb3ZlcnJpZGVfcmUpKQorCisgICAgdXBkYXRlZCA9IEZhbHNlCisgICAgdmFyc2V0X3N0YXJ0ID0gJycKKyAgICB2YXJsaW5lcyA9IFtdCisgICAgbmV3bGluZXMgPSBbXQorICAgIGluX3ZhciA9IE5vbmUKKyAgICBmdWxsX3ZhbHVlID0gJycKKyAgICB2YXJfZW5kID0gJycKKworICAgIGRlZiBoYW5kbGVfdmFyX2VuZCgpOgorICAgICAgICBwcmVydW5fbmV3bGluZXMgPSBuZXdsaW5lc1s6XQorICAgICAgICBvcCA9IHZhcnNldF9zdGFydFtsZW4oaW5fdmFyKTpdLnN0cmlwKCkKKyAgICAgICAgKG5ld3ZhbHVlLCBuZXdvcCwgaW5kZW50LCBtaW5icmVhaykgPSB2YXJmdW5jKGluX3ZhciwgZnVsbF92YWx1ZSwgb3AsIG5ld2xpbmVzKQorICAgICAgICBjaGFuZ2VkID0gKHByZXJ1bl9uZXdsaW5lcyAhPSBuZXdsaW5lcykKKworICAgICAgICBpZiBuZXd2YWx1ZSBpcyBOb25lOgorICAgICAgICAgICAgIyBEcm9wIHRoZSB2YWx1ZQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgZWxpZiBuZXd2YWx1ZSAhPSBmdWxsX3ZhbHVlIG9yIChuZXdvcCBub3QgaW4gW05vbmUsIG9wXSk6CisgICAgICAgICAgICBpZiBuZXdvcCBub3QgaW4gW05vbmUsIG9wXToKKyAgICAgICAgICAgICAgICAjIENhbGxiYWNrIGNoYW5nZWQgdGhlIG9wZXJhdG9yCisgICAgICAgICAgICAgICAgdmFyc2V0X25ldyA9ICIlcyAlcyIgJSAoaW5fdmFyLCBuZXdvcCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdmFyc2V0X25ldyA9IHZhcnNldF9zdGFydAorCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGluZGVudCwgKGludCwgbG9uZykpOgorICAgICAgICAgICAgICAgIGlmIGluZGVudCA9PSAtMToKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50c3BjID0gJyAnICogKGxlbih2YXJzZXRfbmV3KSArIDIpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50c3BjID0gJyAnICogaW5kZW50CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGluZGVudHNwYyA9IGluZGVudAorICAgICAgICAgICAgaWYgaW5fdmFyLmVuZHN3aXRoKCcoKScpOgorICAgICAgICAgICAgICAgICMgQSBmdW5jdGlvbiBkZWZpbml0aW9uCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShuZXd2YWx1ZSwgbGlzdCk6CisgICAgICAgICAgICAgICAgICAgIG5ld2xpbmVzLmFwcGVuZCgnJXMge1xuJXMlc1xufVxuJyAlICh2YXJzZXRfbmV3LCBpbmRlbnRzcGMsICgnXG4lcycgJSBpbmRlbnRzcGMpLmpvaW4obmV3dmFsdWUpKSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpZiBub3QgbmV3dmFsdWUuc3RhcnRzd2l0aCgnXG4nKToKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld3ZhbHVlID0gJ1xuJyArIG5ld3ZhbHVlCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBuZXd2YWx1ZS5lbmRzd2l0aCgnXG4nKToKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld3ZhbHVlID0gbmV3dmFsdWUgKyAnXG4nCisgICAgICAgICAgICAgICAgICAgIG5ld2xpbmVzLmFwcGVuZCgnJXMgeyVzfVxuJyAlICh2YXJzZXRfbmV3LCBuZXd2YWx1ZSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgTm9ybWFsIHZhcmlhYmxlCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShuZXd2YWx1ZSwgbGlzdCk6CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBuZXd2YWx1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgRW1wdHkgbGlzdCAtPiBlbXB0eSBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld2xpbmVzLmFwcGVuZCgnJXMgIiJcbicgJSB2YXJzZXRfbmV3KQorICAgICAgICAgICAgICAgICAgICBlbGlmIG1pbmJyZWFrOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBGaXJzdCBpdGVtIG9uIGZpcnN0IGxpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxlbihuZXd2YWx1ZSkgPT0gMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdsaW5lcy5hcHBlbmQoJyVzICIlcyJcbicgJSAodmFyc2V0X25ldywgbmV3dmFsdWVbMF0pKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdsaW5lcy5hcHBlbmQoJyVzICIlcyBcXFxuJyAlICh2YXJzZXRfbmV3LCBuZXd2YWx1ZVswXSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGl0ZW0gaW4gbmV3dmFsdWVbMTpdOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdsaW5lcy5hcHBlbmQoJyVzJXMgXFxcbicgJSAoaW5kZW50c3BjLCBpdGVtKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdsaW5lcy5hcHBlbmQoJyVzIlxuJyAlIGluZGVudHNwYykKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgTm8gaXRlbSBvbiBmaXJzdCBsaW5lCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdsaW5lcy5hcHBlbmQoJyVzICIgXFxcbicgJSB2YXJzZXRfbmV3KQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGl0ZW0gaW4gbmV3dmFsdWU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3bGluZXMuYXBwZW5kKCclcyVzIFxcXG4nICUgKGluZGVudHNwYywgaXRlbSkpCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdsaW5lcy5hcHBlbmQoJyVzIlxuJyAlIGluZGVudHNwYykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBuZXdsaW5lcy5hcHBlbmQoJyVzICIlcyJcbicgJSAodmFyc2V0X25ldywgbmV3dmFsdWUpKQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgUHV0IHRoZSBvbGQgbGluZXMgYmFjayB3aGVyZSB0aGV5IHdlcmUKKyAgICAgICAgICAgIG5ld2xpbmVzLmV4dGVuZCh2YXJsaW5lcykKKyAgICAgICAgICAgICMgSWYgbmV3bGluZXMgd2FzIHRvdWNoZWQgYnkgdGhlIGZ1bmN0aW9uLCB3ZSdsbCBuZWVkIHRvIHJldHVybiBUcnVlCisgICAgICAgICAgICByZXR1cm4gY2hhbmdlZAorCisgICAgY2hlY2tzcGMgPSBGYWxzZQorCisgICAgZm9yIGxpbmUgaW4gbWV0YV9saW5lczoKKyAgICAgICAgaWYgaW5fdmFyOgorICAgICAgICAgICAgdmFsdWUgPSBsaW5lLnJzdHJpcCgpCisgICAgICAgICAgICB2YXJsaW5lcy5hcHBlbmQobGluZSkKKyAgICAgICAgICAgIGlmIGluX3Zhci5lbmRzd2l0aCgnKCknKToKKyAgICAgICAgICAgICAgICBmdWxsX3ZhbHVlICs9ICdcbicgKyB2YWx1ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmdWxsX3ZhbHVlICs9IHZhbHVlWzotMV0KKyAgICAgICAgICAgIGlmIHZhbHVlLmVuZHN3aXRoKHZhcl9lbmQpOgorICAgICAgICAgICAgICAgIGlmIGluX3Zhci5lbmRzd2l0aCgnKCknKToKKyAgICAgICAgICAgICAgICAgICAgaWYgZnVsbF92YWx1ZS5jb3VudCgneycpIC0gZnVsbF92YWx1ZS5jb3VudCgnfScpID49IDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGZ1bGxfdmFsdWUgPSBmdWxsX3ZhbHVlWzotMV0KKyAgICAgICAgICAgICAgICBpZiBoYW5kbGVfdmFyX2VuZCgpOgorICAgICAgICAgICAgICAgICAgICB1cGRhdGVkID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBjaGVja3NwYyA9IFRydWUKKyAgICAgICAgICAgICAgICBpbl92YXIgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBza2lwID0gRmFsc2UKKyAgICAgICAgICAgIGZvciAodmFybmFtZSwgdmFyX3JlKSBpbiB2YXJfcmVzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgICAgIHJlcyA9IHZhcl9yZS5tYXRjaChsaW5lKQorICAgICAgICAgICAgICAgIGlmIHJlczoKKyAgICAgICAgICAgICAgICAgICAgaXNmdW5jID0gdmFybmFtZS5lbmRzd2l0aCgnKCknKQorICAgICAgICAgICAgICAgICAgICBpZiBpc2Z1bmM6CisgICAgICAgICAgICAgICAgICAgICAgICBzcGxpdHZhbHVlID0gbGluZS5zcGxpdCgneycsIDEpCisgICAgICAgICAgICAgICAgICAgICAgICB2YXJfZW5kID0gJ30nCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICB2YXJfZW5kID0gcmVzLmdyb3VwcygpWy0xXQorICAgICAgICAgICAgICAgICAgICAgICAgc3BsaXR2YWx1ZSA9IGxpbmUuc3BsaXQodmFyX2VuZCwgMSkKKyAgICAgICAgICAgICAgICAgICAgdmFyc2V0X3N0YXJ0ID0gc3BsaXR2YWx1ZVswXS5yc3RyaXAoKQorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNwbGl0dmFsdWVbMV0ucnN0cmlwKCkKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGlzZnVuYyBhbmQgdmFsdWUuZW5kc3dpdGgoJ1xcJyk6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlWzotMV0KKyAgICAgICAgICAgICAgICAgICAgZnVsbF92YWx1ZSA9IHZhbHVlCisgICAgICAgICAgICAgICAgICAgIHZhcmxpbmVzID0gW2xpbmVdCisgICAgICAgICAgICAgICAgICAgIGluX3ZhciA9IHJlcy5ncm91cCgxKQorICAgICAgICAgICAgICAgICAgICBpZiBpc2Z1bmM6CisgICAgICAgICAgICAgICAgICAgICAgICBpbl92YXIgKz0gJygpJworICAgICAgICAgICAgICAgICAgICBpZiB2YWx1ZS5lbmRzd2l0aCh2YXJfZW5kKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxfdmFsdWUgPSBmdWxsX3ZhbHVlWzotMV0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGhhbmRsZV92YXJfZW5kKCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZCA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja3NwYyA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGluX3ZhciA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgc2tpcCA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIG5vdCBza2lwOgorICAgICAgICAgICAgICAgIGlmIGNoZWNrc3BjOgorICAgICAgICAgICAgICAgICAgICBjaGVja3NwYyA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgIGlmIG5ld2xpbmVzWy0xXSA9PSAnXG4nIGFuZCBsaW5lID09ICdcbic6CisgICAgICAgICAgICAgICAgICAgICAgICAjIFNxdWFzaCBibGFuayBsaW5lIGlmIHRoZXJlIGFyZSB0d28gY29uc2VjdXRpdmUgYmxhbmtzIGFmdGVyIGEgcmVtb3ZhbAorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBuZXdsaW5lcy5hcHBlbmQobGluZSkKKyAgICByZXR1cm4gKHVwZGF0ZWQsIG5ld2xpbmVzKQorCisKK2RlZiBlZGl0X21ldGFkYXRhX2ZpbGUobWV0YV9maWxlLCB2YXJpYWJsZXMsIHZhcmZ1bmMpOgorICAgICIiIkVkaXQgYSByZWNpcGUgb3IgY29uZmlnIGZpbGUgYW5kIG1vZGlmeSBvbmUgb3IgbW9yZSBzcGVjaWZpZWQKKyAgICB2YXJpYWJsZSB2YWx1ZXMgc2V0IGluIHRoZSBmaWxlIHVzaW5nIGEgc3BlY2lmaWVkIGNhbGxiYWNrIGZ1bmN0aW9uLgorICAgIFRoZSBmaWxlIGlzIG9ubHkgd3JpdHRlbiB0byBpZiB0aGUgdmFsdWUocykgYWN0dWFsbHkgY2hhbmdlLgorICAgIFRoaXMgaXMgYmFzaWNhbGx5IHRoZSBmaWxlIHZlcnNpb24gb2YgZWRpdF9tZXRhZGF0YSgpLCBzZWUgdGhhdAorICAgIGZ1bmN0aW9uJ3MgZGVzY3JpcHRpb24gZm9yIHBhcmFtZXRlci91c2FnZSBpbmZvcm1hdGlvbi4KKyAgICBSZXR1cm5zIFRydWUgaWYgdGhlIGZpbGUgd2FzIHdyaXR0ZW4gdG8sIEZhbHNlIG90aGVyd2lzZS4KKyAgICAiIiIKKyAgICB3aXRoIG9wZW4obWV0YV9maWxlLCAncicpIGFzIGY6CisgICAgICAgICh1cGRhdGVkLCBuZXdsaW5lcykgPSBlZGl0X21ldGFkYXRhKGYsIHZhcmlhYmxlcywgdmFyZnVuYykKKyAgICBpZiB1cGRhdGVkOgorICAgICAgICB3aXRoIG9wZW4obWV0YV9maWxlLCAndycpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlbGluZXMobmV3bGluZXMpCisgICAgcmV0dXJuIHVwZGF0ZWQKKworCitkZWYgZWRpdF9iYmxheWVyc19jb25mKGJibGF5ZXJzX2NvbmYsIGFkZCwgcmVtb3ZlKToKKyAgICAiIiJFZGl0IGJibGF5ZXJzLmNvbmYsIGFkZGluZyBhbmQvb3IgcmVtb3ZpbmcgbGF5ZXJzIiIiCisKKyAgICBpbXBvcnQgZm5tYXRjaAorCisgICAgZGVmIHJlbW92ZV90cmFpbGluZ19zZXAocHRoKToKKyAgICAgICAgaWYgcHRoIGFuZCBwdGhbLTFdID09IG9zLnNlcDoKKyAgICAgICAgICAgIHB0aCA9IHB0aFs6LTFdCisgICAgICAgIHJldHVybiBwdGgKKworICAgIGRlZiBsYXllcmxpc3RfcGFyYW0odmFsdWUpOgorICAgICAgICBpZiBub3QgdmFsdWU6CisgICAgICAgICAgICByZXR1cm4gW10KKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKHZhbHVlLCBsaXN0KToKKyAgICAgICAgICAgIHJldHVybiBbcmVtb3ZlX3RyYWlsaW5nX3NlcCh4KSBmb3IgeCBpbiB2YWx1ZV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBbcmVtb3ZlX3RyYWlsaW5nX3NlcCh2YWx1ZSldCisKKyAgICBub3RhZGRlZCA9IFtdCisgICAgbm90cmVtb3ZlZCA9IFtdCisKKyAgICBhZGRsYXllcnMgPSBsYXllcmxpc3RfcGFyYW0oYWRkKQorICAgIHJlbW92ZWxheWVycyA9IGxheWVybGlzdF9wYXJhbShyZW1vdmUpCisKKyAgICAjIE5lZWQgdG8gdXNlIGEgbGlzdCBoZXJlIGJlY2F1c2Ugd2UgY2FuJ3Qgc2V0IG5vbi1sb2NhbCB2YXJpYWJsZXMgZnJvbSBhIGNhbGxiYWNrIGluIHB5dGhvbiAyLngKKyAgICBiYmxheWVyY2FsbHMgPSBbXQorCisgICAgZGVmIGhhbmRsZV9iYmxheWVycyh2YXJuYW1lLCBvcmlndmFsdWUsIG9wLCBuZXdsaW5lcyk6CisgICAgICAgIGJibGF5ZXJjYWxscy5hcHBlbmQodmFybmFtZSkKKyAgICAgICAgdXBkYXRlZCA9IEZhbHNlCisgICAgICAgIGJibGF5ZXJzID0gW3JlbW92ZV90cmFpbGluZ19zZXAoeCkgZm9yIHggaW4gb3JpZ3ZhbHVlLnNwbGl0KCldCisgICAgICAgIGlmIHJlbW92ZWxheWVyczoKKyAgICAgICAgICAgIGZvciByZW1vdmVsYXllciBpbiByZW1vdmVsYXllcnM6CisgICAgICAgICAgICAgICAgbWF0Y2hlZCA9IEZhbHNlCisgICAgICAgICAgICAgICAgZm9yIGxheWVyIGluIGJibGF5ZXJzOgorICAgICAgICAgICAgICAgICAgICBpZiBmbm1hdGNoLmZubWF0Y2gobGF5ZXIsIHJlbW92ZWxheWVyKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgYmJsYXllcnMucmVtb3ZlKGxheWVyKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBpZiBub3QgbWF0Y2hlZDoKKyAgICAgICAgICAgICAgICAgICAgbm90cmVtb3ZlZC5hcHBlbmQocmVtb3ZlbGF5ZXIpCisgICAgICAgIGlmIGFkZGxheWVyczoKKyAgICAgICAgICAgIGZvciBhZGRsYXllciBpbiBhZGRsYXllcnM6CisgICAgICAgICAgICAgICAgaWYgYWRkbGF5ZXIgbm90IGluIGJibGF5ZXJzOgorICAgICAgICAgICAgICAgICAgICB1cGRhdGVkID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBiYmxheWVycy5hcHBlbmQoYWRkbGF5ZXIpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbm90YWRkZWQuYXBwZW5kKGFkZGxheWVyKQorCisgICAgICAgIGlmIHVwZGF0ZWQ6CisgICAgICAgICAgICByZXR1cm4gKGJibGF5ZXJzLCBOb25lLCAyLCBGYWxzZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAob3JpZ3ZhbHVlLCBOb25lLCAyLCBGYWxzZSkKKworICAgIGVkaXRfbWV0YWRhdGFfZmlsZShiYmxheWVyc19jb25mLCBbJ0JCTEFZRVJTJ10sIGhhbmRsZV9iYmxheWVycykKKworICAgIGlmIG5vdCBiYmxheWVyY2FsbHM6CisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignVW5hYmxlIHRvIGZpbmQgQkJMQVlFUlMgaW4gJXMnICUgYmJsYXllcnNfY29uZikKKworICAgIHJldHVybiAobm90YWRkZWQsIG5vdHJlbW92ZWQpCisKKworZGVmIGdldF9maWxlX2xheWVyKGZpbGVuYW1lLCBkKToKKyAgICAiIiJEZXRlcm1pbmUgdGhlIGNvbGxlY3Rpb24gKGFzIGRlZmluZWQgYnkgYSBsYXllcidzIGxheWVyLmNvbmYgZmlsZSkgY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIGZpbGUiIiIKKyAgICBjb2xsZWN0aW9ucyA9IChkLmdldFZhcignQkJGSUxFX0NPTExFQ1RJT05TJywgVHJ1ZSkgb3IgJycpLnNwbGl0KCkKKyAgICBjb2xsZWN0aW9uX3JlcyA9IHt9CisgICAgZm9yIGNvbGxlY3Rpb24gaW4gY29sbGVjdGlvbnM6CisgICAgICAgIGNvbGxlY3Rpb25fcmVzW2NvbGxlY3Rpb25dID0gZC5nZXRWYXIoJ0JCRklMRV9QQVRURVJOXyVzJyAlIGNvbGxlY3Rpb24sIFRydWUpIG9yICcnCisKKyAgICBkZWYgcGF0aF90b19sYXllcihwYXRoKToKKyAgICAgICAgIyBVc2UgbG9uZ2VzdCBwYXRoIHNvIHdlIGhhbmRsZSBuZXN0ZWQgbGF5ZXJzCisgICAgICAgIG1hdGNobGVuID0gMAorICAgICAgICBtYXRjaCA9IE5vbmUKKyAgICAgICAgZm9yIGNvbGxlY3Rpb24sIHJlZ2V4IGluIGNvbGxlY3Rpb25fcmVzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgaWYgbGVuKHJlZ2V4KSA+IG1hdGNobGVuIGFuZCByZS5tYXRjaChyZWdleCwgcGF0aCk6CisgICAgICAgICAgICAgICAgbWF0Y2hsZW4gPSBsZW4ocmVnZXgpCisgICAgICAgICAgICAgICAgbWF0Y2ggPSBjb2xsZWN0aW9uCisgICAgICAgIHJldHVybiBtYXRjaAorCisgICAgcmVzdWx0ID0gTm9uZQorICAgIGJiZmlsZXMgPSAoZC5nZXRWYXIoJ0JCRklMRVMnLCBUcnVlKSBvciAnJykuc3BsaXQoKQorICAgIGJiZmlsZXNtYXRjaCA9IEZhbHNlCisgICAgZm9yIGJiZmlsZXNlbnRyeSBpbiBiYmZpbGVzOgorICAgICAgICBpZiBmbm1hdGNoLmZubWF0Y2goZmlsZW5hbWUsIGJiZmlsZXNlbnRyeSk6CisgICAgICAgICAgICBiYmZpbGVzbWF0Y2ggPSBUcnVlCisgICAgICAgICAgICByZXN1bHQgPSBwYXRoX3RvX2xheWVyKGJiZmlsZXNlbnRyeSkKKworICAgIGlmIG5vdCBiYmZpbGVzbWF0Y2g6CisgICAgICAgICMgUHJvYmFibHkgYSBiYmNsYXNzCisgICAgICAgIHJlc3VsdCA9IHBhdGhfdG9fbGF5ZXIoZmlsZW5hbWUpCisKKyAgICByZXR1cm4gcmVzdWx0CisKKworIyBDb25zdGFudCB0YWtlbiBmcm9tIGh0dHA6Ly9saW51eC5kaWUubmV0L2luY2x1ZGUvbGludXgvcHJjdGwuaAorUFJfU0VUX1BERUFUSFNJRyA9IDEKKworY2xhc3MgUHJDdGxFcnJvcihFeGNlcHRpb24pOgorICAgIHBhc3MKKworZGVmIHNpZ25hbF9vbl9wYXJlbnRfZXhpdChzaWduYW1lKToKKyAgICAiIiIKKyAgICBUcmlnZ2VyIHNpZ25hbWUgdG8gYmUgc2VudCB3aGVuIHRoZSBwYXJlbnQgcHJvY2VzcyBkaWVzCisgICAgIiIiCisgICAgc2lnbnVtID0gZ2V0YXR0cihzaWduYWwsIHNpZ25hbWUpCisgICAgIyBodHRwOi8vbGludXguZGllLm5ldC9tYW4vMi9wcmN0bAorICAgIHJlc3VsdCA9IGNkbGxbJ2xpYmMuc28uNiddLnByY3RsKFBSX1NFVF9QREVBVEhTSUcsIHNpZ251bSkKKyAgICBpZiByZXN1bHQgIT0gMDoKKyAgICAgICAgcmFpc2UgUHJDdGxFcnJvcigncHJjdGwgZmFpbGVkIHdpdGggZXJyb3IgY29kZSAlcycgJSByZXN1bHQpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iczQvQVVUSE9SUy50eHQgYi9iaXRiYWtlL2xpYi9iczQvQVVUSE9SUy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFjOGZjYwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JzNC9BVVRIT1JTLnR4dApAQCAtMCwwICsxLDQzIEBACitCZWhvbGQsIG1vcnRhbCwgdGhlIG9yaWdpbnMgb2YgQmVhdXRpZnVsIFNvdXAuLi4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitMZW9uYXJkIFJpY2hhcmRzb24gaXMgdGhlIHByaW1hcnkgcHJvZ3JhbW1lci4KKworQWFyb24gRGVWb3JlIGlzIGF3ZXNvbWUuCisKK01hcmsgUGlsZ3JpbSBwcm92aWRlZCB0aGUgZW5jb2RpbmcgZGV0ZWN0aW9uIGNvZGUgdGhhdCBmb3JtcyB0aGUgYmFzZQorb2YgVW5pY29kZURhbW1pdC4KKworVGhvbWFzIEtsdXl2ZXIgYW5kIEV6aW8gTWVsb3R0aSBmaW5pc2hlZCB0aGUgd29yayBvZiBnZXR0aW5nIEJlYXV0aWZ1bAorU291cCA0IHdvcmtpbmcgdW5kZXIgUHl0aG9uIDMuCisKK1NpbW9uIFdpbGxpc29uIHdyb3RlIHNvdXBzZWxlY3QsIHdoaWNoIHdhcyB1c2VkIHRvIG1ha2UgQmVhdXRpZnVsIFNvdXAKK3N1cHBvcnQgQ1NTIHNlbGVjdG9ycy4KKworU2FtIFJ1YnkgaGVscGVkIHdpdGggYSBsb3Qgb2YgZWRnZSBjYXNlcy4KKworSm9uYXRoYW4gRWxsaXMgd2FzIGF3YXJkZWQgdGhlIHByZXN0aWdvdXMgQmVhdSBQb3RhZ2UgRCdPciBmb3IgaGlzCit3b3JrIGluIHNvbHZpbmcgdGhlIG5lc3RhYmxlIHRhZ3MgY29udW5kcnVtLgorCitBbiBpbmNvbXBsZXRlIGxpc3Qgb2YgcGVvcGxlIGhhdmUgY29udHJpYnV0ZWQgcGF0Y2hlcyB0byBCZWF1dGlmdWwKK1NvdXA6CisKKyBJc3R2YW4gQWxiZXJ0LCBBbmRyZXcgTGluLCBBbnRob255IEJheHRlciwgQW5kcmV3IEJveWtvLCBUb255IENoYW5nLAorIFplcGh5ciBGYW5nLCBGdXp6eSwgUm9tYW4gR2F1Zm1hbiwgWW9uaSBHaWxhZCwgUmljaGllIEhpbmRsZSwgUGV0ZXJpcworIEtydW1pbnMsIEtlbnQgSm9obnNvbiwgQmVuIExhc3QsIFJvYmVydCBMZWZ0d2ljaCwgU3RhZmZhbiBNYWxtZ3JlbiwKKyBLc2VuaWEgTWFyYXNhbm92YSwgSlAgTW9pbnMsIEFkYW0gTW9uc2VuLCBKb2huIE5hZ2xlLCAiSm9uIiwgRWQKKyBPc2tpZXdpY3osIEdyZWcgUGhpbGxpcHMsIEdpbGVzIFJhZGZvcmQsIEFydGh1ciBSdWRvbHBoLCBNYXJrbworIFNhbWFzdHVyLCBKb3VuaSBTZXBw5G5lbiwgQWxleGFuZGVyIFNjaG1vbGNrLCBBbmR5IFRoZXllcnMsIEdseW4KKyBXZWJzdGVyLCBQYXVsIFdyaWdodCwgRGFubnkgWW9vCisKK0FuIGluY29tcGxldGUgbGlzdCBvZiBwZW9wbGUgd2hvIG1hZGUgc3VnZ2VzdGlvbnMgb3IgZm91bmQgYnVncyBvcgorZm91bmQgd2F5cyB0byBicmVhayBCZWF1dGlmdWwgU291cDoKKworIEhhbm5vIEL2Y2ssIE1hdHRlbyBCZXJ0aW5pLCBDaHJpcyBDdXJ2ZXksIFNpbW9uIEN1c2FjaywgQnJ1Y2UgRWNrZWwsCisgTWF0dCBFcm5zdCwgTWljaGFlbCBGb29yZCwgVG9tIEhhcnJpcywgQmlsbCBkZSBoT3JhLCBEb25hbGQgSG93ZXMsCisgTWF0dCBQYXR0ZXJzb24sIFNjb3R0IFJvYmVydHMsIFN0ZXZlIFN0cmFzc21hbm4sIE1pa2UgV2lsbGlhbXMsCisgd2FyY2hpbGQgYXQgcmVkaG8gZG90IGNvbSwgU2FtaSBLdWlzbWEsIENhcmxvcyBSb2NoYSwgQm9iIEh1dGNoaXNvbiwKKyBKb3JlbiBNYywgTWljaGFsIE1pZ3Vyc2tpLCBKb2huIEtsZXZlbiwgVGltIEhlYW5leSwgVHJpcHAgTGlsbGV5LCBFZAorIFN1bW1lcnMsIERlbm5pcyBTdXRjaCwgQ2hyaXMgU21pdGgsIEFhcm9uIFN3ZWVwXlcgU3dhcnR6LCBTdHVhcnQKKyBUdXJuZXIsIEdyZWcgRWR3YXJkcywgS2V2aW4gSiBLYWx1cHNvbiwgTmlrb3MgS291cmVtZW5vcywgQXJ0dXIgZGUKKyBTb3VzYSBSb2NoYSwgWWljaHVuIFdlaSwgUGVyIFZvZ25zZW4KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JzNC9DT1BZSU5HLnR4dCBiL2JpdGJha2UvbGliL2JzNC9DT1BZSU5HLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjY4ZDEzCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYnM0L0NPUFlJTkcudHh0CkBAIC0wLDAgKzEsMjYgQEAKK0JlYXV0aWZ1bCBTb3VwIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBNSVQgbGljZW5zZToKKworIENvcHlyaWdodCAoYykgMjAwNC0yMDEyIExlb25hcmQgUmljaGFyZHNvbgorCisgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgU09GVFdBUkUsIERBTU1JVC4KKworQmVhdXRpZnVsIFNvdXAgaW5jb3Jwb3JhdGVzIGNvZGUgZnJvbSB0aGUgaHRtbDVsaWIgbGlicmFyeSwgd2hpY2ggaXMKK2Fsc28gbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYnM0L05FV1MudHh0IGIvYml0YmFrZS9saWIvYnM0L05FV1MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YTYwYTIKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iczQvTkVXUy50eHQKQEAgLTAsMCArMSwxMDY2IEBACis9IDQuMy4yICgyMDEzMTAwMikgPQorCisqIEZpeGVkIGEgYnVnIGluIHdoaWNoIHNob3J0IFVuaWNvZGUgaW5wdXQgd2FzIGltcHJvcGVybHkgZW5jb2RlZCB0bworICBBU0NJSSB3aGVuIGNoZWNraW5nIHdoZXRoZXIgb3Igbm90IGl0IHdhcyB0aGUgbmFtZSBvZiBhIGZpbGUgb24KKyAgZGlzay4gW2J1Zz0xMjI3MDE2XQorCisqIEZpeGVkIGEgY3Jhc2ggd2hlbiBhIHNob3J0IGlucHV0IGNvbnRhaW5zIGRhdGEgbm90IHZhbGlkIGluCisgIGZpbGVuYW1lcy4gW2J1Zz0xMjMyNjA0XQorCisqIEZpeGVkIGEgYnVnIHRoYXQgY2F1c2VkIFVuaWNvZGUgZGF0YSBwdXQgaW50byBVbmljb2RlRGFtbWl0IHRvCisgIHJldHVybiBOb25lIGluc3RlYWQgb2YgdGhlIG9yaWdpbmFsIGRhdGEuIFtidWc9MTIxNDk4M10KKworKiBDb21iaW5lZCB0d28gdGVzdHMgdG8gc3RvcCBhIHNwdXJpb3VzIHRlc3QgZmFpbHVyZSB3aGVuIHRlc3RzIGFyZQorICBydW4gYnkgbm9zZXRlc3RzLiBbYnVnPTEyMTI0NDVdCisKKz0gNC4zLjEgKDIwMTMwODE1KSA9CisKKyogRml4ZWQgeWV0IGFub3RoZXIgcHJvYmxlbSB3aXRoIHRoZSBodG1sNWxpYiB0cmVlIGJ1aWxkZXIsIGNhdXNlZCBieQorICBodG1sNWxpYidzIHRlbmRlbmN5IHRvIHJlYXJyYW5nZSB0aGUgdHJlZSBkdXJpbmcKKyAgcGFyc2luZy4gW2J1Zz0xMTg5MjY3XQorCisqIEZpeGVkIGEgYnVnIHRoYXQgY2F1c2VkIHRoZSBvcHRpbWl6ZWQgdmVyc2lvbiBvZiBmaW5kX2FsbCgpIHRvCisgIHJldHVybiBub3RoaW5nLiBbYnVnPTEyMTI2NTVdCisKKz0gNC4zLjAgKDIwMTMwODEyKSA9CisKKyogSW5zdGVhZCBvZiBjb252ZXJ0aW5nIGluY29taW5nIGRhdGEgdG8gVW5pY29kZSBhbmQgZmVlZGluZyBpdCB0byB0aGUKKyAgbHhtbCB0cmVlIGJ1aWxkZXIgaW4gY2h1bmtzLCBCZWF1dGlmdWwgU291cCBub3cgbWFrZXMgc3VjY2Vzc2l2ZQorICBndWVzc2VzIGF0IHRoZSBlbmNvZGluZyBvZiB0aGUgaW5jb21pbmcgZGF0YSwgYW5kIHRlbGxzIGx4bWwgdG8KKyAgcGFyc2UgdGhlIGRhdGEgYXMgdGhhdCBlbmNvZGluZy4gR2l2aW5nIGx4bWwgbW9yZSBjb250cm9sIG92ZXIgdGhlCisgIHBhcnNpbmcgcHJvY2VzcyBpbXByb3ZlcyBwZXJmb3JtYW5jZSBhbmQgYXZvaWRzIGEgbnVtYmVyIG9mIGJ1Z3MgYW5kCisgIGlzc3VlcyB3aXRoIHRoZSBseG1sIHBhcnNlciB3aGljaCBoYWQgcHJldmlvdXNseSByZXF1aXJlZCBlbGFib3JhdGUKKyAgd29ya2Fyb3VuZHM6CisKKyAgLSBBbiBpc3N1ZSBpbiB3aGljaCBseG1sIHJlZnVzZXMgdG8gcGFyc2UgVW5pY29kZSBzdHJpbmdzIG9uIHNvbWUKKyAgICBzeXN0ZW1zLiBbYnVnPTExODA1MjddCisKKyAgLSBBIHJldHVybmluZyBidWcgdGhhdCB0cnVuY2F0ZWQgZG9jdW1lbnRzIGxvbmdlciB0aGFuIGEgKHZlcnkKKyAgICBzbWFsbCkgc2l6ZS4gW2J1Zz05NjM4ODBdCisKKyAgLSBBIHJldHVybmluZyBidWcgaW4gd2hpY2ggZXh0cmEgc3BhY2VzIHdlcmUgYWRkZWQgdG8gYSBkb2N1bWVudCBpZgorICAgIHRoZSBkb2N1bWVudCBkZWZpbmVkIGEgY2hhcnNldCBvdGhlciB0aGFuIFVURi04LiBbYnVnPTk3MjQ2Nl0KKworICBUaGlzIHJlcXVpcmVkIGEgbWFqb3Igb3ZlcmhhdWwgb2YgdGhlIHRyZWUgYnVpbGRlciBhcmNoaXRlY3R1cmUuIElmCisgIHlvdSB3cm90ZSB5b3VyIG93biB0cmVlIGJ1aWxkZXIgYW5kIGRpZG4ndCB0ZWxsIG1lLCB5b3UnbGwgbmVlZCB0bworICBtb2RpZnkgeW91ciBwcmVwYXJlX21hcmt1cCgpIG1ldGhvZC4KKworKiBUaGUgVW5pY29kZURhbW1pdCBjb2RlIHRoYXQgbWFrZXMgZ3Vlc3NlcyBhdCBlbmNvZGluZ3MgaGFzIGJlZW4KKyAgc3BsaXQgaW50byBpdHMgb3duIGNsYXNzLCBFbmNvZGluZ0RldGVjdG9yLiBBIGxvdCBvZiBhcHBhcmVudGx5CisgIHJlZHVuZGFudCBjb2RlIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSBVbmljb2RlLCBEYW1taXQsIGFuZCBzb21lCisgIHVuZG9jdW1lbnRlZCBmZWF0dXJlcyBoYXZlIGFsc28gYmVlbiByZW1vdmVkLgorCisqIEJlYXV0aWZ1bCBTb3VwIHdpbGwgaXNzdWUgYSB3YXJuaW5nIGlmIGluc3RlYWQgb2YgbWFya3VwIHlvdSBwYXNzIGl0CisgIGEgVVJMIG9yIHRoZSBuYW1lIG9mIGEgZmlsZSBvbiBkaXNrIChhIGNvbW1vbiBiZWdpbm5lcidzIG1pc3Rha2UpLgorCisqIEEgbnVtYmVyIG9mIG9wdGltaXphdGlvbnMgaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGx4bWwgdHJlZQorICBidWlsZGVyIGJ5IGFib3V0IDMzJSwgdGhlIGh0bWwucGFyc2VyIHRyZWUgYnVpbGRlciBieSBhYm91dCAyMCUsIGFuZAorICB0aGUgaHRtbDVsaWIgdHJlZSBidWlsZGVyIGJ5IGFib3V0IDE1JS4KKworKiBBbGwgZmluZF9hbGwgY2FsbHMgc2hvdWxkIG5vdyByZXR1cm4gYSBSZXN1bHRTZXQgb2JqZWN0LiBQYXRjaCBieQorICBBYXJvbiBEZVZvcmUuIFtidWc9MTE5NDAzNF0KKworPSA0LjIuMSAoMjAxMzA1MzEpID0KKworKiBUaGUgZGVmYXVsdCBYTUwgZm9ybWF0dGVyIHdpbGwgbm93IHJlcGxhY2UgYW1wZXJzYW5kcyBldmVuIGlmIHRoZXkKKyAgYXBwZWFyIHRvIGJlIHBhcnQgb2YgZW50aXRpZXMuIFRoYXQgaXMsICImbHQ7IiB3aWxsIGJlY29tZQorICAiJmFtcDtsdDsiLiBUaGUgb2xkIGNvZGUgd2FzIGxlZnQgb3ZlciBmcm9tIEJlYXV0aWZ1bCBTb3VwIDMsIHdoaWNoCisgIGRpZG4ndCBhbHdheXMgdHVybiBlbnRpdGllcyBpbnRvIFVuaWNvZGUgY2hhcmFjdGVycy4KKworICBJZiB5b3UgcmVhbGx5IHdhbnQgdGhlIG9sZCBiZWhhdmlvciAobWF5YmUgYmVjYXVzZSB5b3UgYWRkIG5ldworICBzdHJpbmdzIHRvIHRoZSB0cmVlLCB0aG9zZSBzdHJpbmdzIGluY2x1ZGUgZW50aXRpZXMsIGFuZCB5b3Ugd2FudAorICB0aGUgZm9ybWF0dGVyIHRvIGxlYXZlIHRoZW0gYWxvbmUgb24gb3V0cHV0KSwgaXQgY2FuIGJlIGZvdW5kIGluCisgIEVudGl0eVN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlX3htbF9jb250YWluaW5nX2VudGl0aWVzKCkuIFtidWc9MTE4MjE4M10KKworKiBHYXZlIG5ld19zdHJpbmcoKSB0aGUgYWJpbGl0eSB0byBjcmVhdGUgc3ViY2xhc3NlcyBvZgorICBOYXZpZ2FibGVTdHJpbmcuIFtidWc9MTE4MTk4Nl0KKworKiBGaXhlZCBhbm90aGVyIGJ1ZyBieSB3aGljaCB0aGUgaHRtbDVsaWIgdHJlZSBidWlsZGVyIGNvdWxkIGNyZWF0ZSBhCisgIGRpc2Nvbm5lY3RlZCB0cmVlLiBbYnVnPTExODIwODldCisKKyogVGhlIC5wcmV2aW91c19lbGVtZW50IG9mIGEgQmVhdXRpZnVsU291cCBvYmplY3QgaXMgbm93IGFsd2F5cyBOb25lLAorICBub3QgdGhlIGxhc3QgZWxlbWVudCB0byBiZSBwYXJzZWQuIFtidWc9MTE4MjA4OV0KKworKiBGaXhlZCB0ZXN0IGZhaWx1cmVzIHdoZW4gbHhtbCBpcyBub3QgaW5zdGFsbGVkLiBbYnVnPTExODE1ODldCisKKyogaHRtbDVsaWIgbm93IHN1cHBvcnRzIFB5dGhvbiAzLiBGaXhlZCBzb21lIFB5dGhvbiAyLXNwZWNpZmljCisgIGNvZGUgaW4gdGhlIGh0bWw1bGliIHRlc3Qgc3VpdGUuIFtidWc9MTE4MTYyNF0KKworKiBUaGUgaHRtbC5wYXJzZXIgdHJlZWJ1aWxkZXIgY2FuIG5vdyBoYW5kbGUgbnVtZXJpYyBhdHRyaWJ1dGVzIGluCisgIHRleHQgd2hlbiB0aGUgaGV4aWRlY2ltYWwgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHN0YXJ0cyB3aXRoIGEKKyAgY2FwaXRhbCBYLiBQYXRjaCBieSBUaW0gU2hpcmxleS4gW2J1Zz0xMTg2MjQyXQorCis9IDQuMi4wICgyMDEzMDUxNCkgPQorCisqIFRoZSBUYWcuc2VsZWN0KCkgbWV0aG9kIG5vdyBzdXBwb3J0cyBhIG11Y2ggd2lkZXIgdmFyaWV0eSBvZiBDU1MKKyAgc2VsZWN0b3JzLgorCisgLSBBZGRlZCBzdXBwb3J0IGZvciB0aGUgYWRqYWNlbnQgc2libGluZyBjb21iaW5hdG9yICgrKSBhbmQgdGhlCisgICBnZW5lcmFsIHNpYmxpbmcgY29tYmluYXRvciAofikuIFRlc3RzIGJ5ICJsaXF1aWRlciIuIFtidWc9MTA4MjE0NF0KKworIC0gVGhlIGNvbWJpbmF0b3JzICg+LCArLCBhbmQgfikgY2FuIG5vdyBjb21iaW5lIHdpdGggYW55IHN1cHBvcnRlZAorICAgc2VsZWN0b3IsIG5vdCBqdXN0IG9uZSB0aGF0IHNlbGVjdHMgYmFzZWQgb24gdGFnIG5hbWUuCisKKyAtIEFkZGVkIGxpbWl0ZWQgc3VwcG9ydCBmb3IgdGhlICJudGgtb2YtdHlwZSIgcHNldWRvLWNsYXNzLiBDb2RlCisgICBieSBTdmVuIFNsb290d2VnLiBbYnVnPTExMDk5NTJdCisKKyogVGhlIEJlYXV0aWZ1bFNvdXAgY2xhc3MgaXMgbm93IGFsaWFzZWQgdG8gIl9zIiBhbmQgIl9zb3VwIiwgbWFraW5nCisgIGl0IHF1aWNrZXIgdG8gdHlwZSB0aGUgaW1wb3J0IHN0YXRlbWVudCBpbiBhbiBpbnRlcmFjdGl2ZSBzZXNzaW9uOgorCisgIGZyb20gYnM0IGltcG9ydCBfcworICAgb3IKKyAgZnJvbSBiczQgaW1wb3J0IF9zb3VwCisKKyAgVGhlIGFsaWFzIG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSwgc28gZG9uJ3QgdXNlIHRoaXMgaW4gY29kZSB5b3UncmUKKyAgZ29pbmcgdG8gcnVuIG1vcmUgdGhhbiBvbmNlLgorCisqIEFkZGVkIHRoZSAnZGlhZ25vc2UnIHN1Ym1vZHVsZSwgd2hpY2ggaW5jbHVkZXMgc2V2ZXJhbCB1c2VmdWwKKyAgZnVuY3Rpb25zIGZvciByZXBvcnRpbmcgcHJvYmxlbXMgYW5kIGRvaW5nIHRlY2ggc3VwcG9ydC4KKworICAtIGRpYWdub3NlKGRhdGEpIHRyaWVzIHRoZSBnaXZlbiBtYXJrdXAgb24gZXZlcnkgaW5zdGFsbGVkIHBhcnNlciwKKyAgICByZXBvcnRpbmcgZXhjZXB0aW9ucyBhbmQgZGlzcGxheWluZyBzdWNjZXNzZXMuIElmIGEgcGFyc2VyIGlzIG5vdAorICAgIGluc3RhbGxlZCwgZGlhZ25vc2UoKSBtZW50aW9ucyB0aGlzIGZhY3QuCisKKyAgLSBseG1sX3RyYWNlKGRhdGEsIGh0bWw9VHJ1ZSkgcnVucyB0aGUgZ2l2ZW4gbWFya3VwIHRocm91Z2ggbHhtbCdzCisgICAgWE1MIHBhcnNlciBvciBIVE1MIHBhcnNlciwgYW5kIHByaW50cyBvdXQgdGhlIHBhcnNlciBldmVudHMgYXMKKyAgICB0aGV5IGhhcHBlbi4gVGhpcyBoZWxwcyB5b3UgcXVpY2tseSBkZXRlcm1pbmUgd2hldGhlciBhIGdpdmVuCisgICAgcHJvYmxlbSBvY2N1cnMgaW4gbHhtbCBjb2RlIG9yIEJlYXV0aWZ1bCBTb3VwIGNvZGUuCisKKyAgLSBodG1scGFyc2VyX3RyYWNlKGRhdGEpIGlzIHRoZSBzYW1lIHRoaW5nLCBidXQgZm9yIFB5dGhvbidzCisgICAgYnVpbHQtaW4gSFRNTFBhcnNlciBjbGFzcy4KKworKiBJbiBhbiBIVE1MIGRvY3VtZW50LCB0aGUgY29udGVudHMgb2YgYSA8c2NyaXB0PiBvciA8c3R5bGU+IHRhZyB3aWxsCisgIG5vIGxvbmdlciB1bmRlcmdvIGVudGl0eSBzdWJzdGl0dXRpb24gYnkgZGVmYXVsdC4gWE1MIGRvY3VtZW50cyB3b3JrCisgIHRoZSBzYW1lIHdheSB0aGV5IGRpZCBiZWZvcmUuIFtidWc9MTA4NTk1M10KKworKiBNZXRob2RzIGxpa2UgZ2V0X3RleHQoKSBhbmQgcHJvcGVydGllcyBsaWtlIC5zdHJpbmdzIG5vdyBvbmx5IGdpdmUKKyAgeW91IHN0cmluZ3MgdGhhdCBhcmUgdmlzaWJsZSBpbiB0aGUgZG9jdW1lbnQtLW5vIGNvbW1lbnRzIG9yCisgIHByb2Nlc3NpbmcgY29tbWFuZHMuIFtidWc9MTA1MDE2NF0KKworKiBUaGUgcHJldHRpZnkoKSBtZXRob2Qgbm93IGxlYXZlcyB0aGUgY29udGVudHMgb2YgPHByZT4gdGFncworICBhbG9uZS4gW2J1Zz0xMDk1NjU0XQorCisqIEZpeCBhIGJ1ZyBpbiB0aGUgaHRtbDVsaWIgdHJlZWJ1aWxkZXIgd2hpY2ggc29tZXRpbWVzIGNyZWF0ZWQKKyAgZGlzY29ubmVjdGVkIHRyZWVzLiBbYnVnPTEwMzk1MjddCisKKyogRml4IGEgYnVnIGluIHRoZSBseG1sIHRyZWVidWlsZGVyIHdoaWNoIGNyYXNoZWQgd2hlbiBhIHRhZyBpbmNsdWRlZAorICBhbiBhdHRyaWJ1dGUgZnJvbSB0aGUgcHJlZGVmaW5lZCAieG1sOiIgbmFtZXNwYWNlLiBbYnVnPTEwNjU2MTddCisKKyogRml4IGEgYnVnIGJ5IHdoaWNoIGtleXdvcmQgYXJndW1lbnRzIHRvIGZpbmRfcGFyZW50KCkgd2VyZSBub3QKKyAgYmVpbmcgcGFzc2VkIG9uLiBbYnVnPTExMjY3MzRdCisKKyogU3RvcCBhIGNyYXNoIHdoZW4gdW53aXNlbHkgbWVzc2luZyB3aXRoIGEgdGFnIHRoYXQncyBiZWVuCisgIGRlY29tcG9zZWQuIFtidWc9MTA5NzY5OV0KKworKiBOb3cgdGhhdCBseG1sJ3Mgc2VnZmF1bHQgb24gaW52YWxpZCBkb2N0eXBlIGhhcyBiZWVuIGZpeGVkLCBmaXhlZCBhCisgIGNvcnJlc3BvbmRpbmcgcHJvYmxlbSBvbiB0aGUgQmVhdXRpZnVsIFNvdXAgZW5kIHRoYXQgd2FzIHByZXZpb3VzbHkKKyAgaW52aXNpYmxlLiBbYnVnPTk4NDkzNl0KKworKiBGaXhlZCBhbiBleGNlcHRpb24gd2hlbiBhbiBvdmVyc3BlY2lmaWVkIENTUyBzZWxlY3RvciBkaWRuJ3QgbWF0Y2gKKyAgYW55dGhpbmcuIENvZGUgYnkgU3RlZmFhbiBMaXBwZW5zLiBbYnVnPTExNjgxNjddCisKKz0gNC4xLjMgKDIwMTIwODIwKSA9CisKKyogU2tpcHBlZCBhIHRlc3QgdW5kZXIgUHl0aG9uIDIuNiBhbmQgUHl0aG9uIDMuMSB0byBhdm9pZCBhIHNwdXJpb3VzCisgIHRlc3QgZmFpbHVyZSBjYXVzZWQgYnkgdGhlIGxvdXN5IEhUTUxQYXJzZXIgaW4gdGhvc2UKKyAgdmVyc2lvbnMuIFtidWc9MTAzODUwM10KKworKiBSYWlzZSBhIG1vcmUgc3BlY2lmaWMgZXJyb3IgKEZlYXR1cmVOb3RGb3VuZCkgd2hlbiBhIHJlcXVlc3RlZAorICBwYXJzZXIgb3IgcGFyc2VyIGZlYXR1cmUgaXMgbm90IGluc3RhbGxlZC4gUmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorICBpbnN0ZWFkIG9mIFZhbHVlRXJyb3Igd2hlbiB0aGUgdXNlciBjYWxscyBpbnNlcnRfYmVmb3JlKCkgb3IKKyAgaW5zZXJ0X2FmdGVyKCkgb24gdGhlIEJlYXV0aWZ1bFNvdXAgb2JqZWN0IGl0c2VsZi4gUGF0Y2ggYnkgQWFyb24KKyAgRGV2b3JlLiBbYnVnPTEwMzgzMDFdCisKKz0gNC4xLjIgKDIwMTIwODE3KSA9CisKKyogQXMgcGVyIFBFUC04LCBhbGxvdyBzZWFyY2hpbmcgYnkgQ1NTIGNsYXNzIHVzaW5nIHRoZSAnY2xhc3NfJworICBrZXl3b3JkIGFyZ3VtZW50LiBbYnVnPTEwMzc2MjRdCisKKyogRGlzcGxheSBuYW1lc3BhY2UgcHJlZml4ZXMgZm9yIG5hbWVzcGFjZWQgYXR0cmlidXRlIG5hbWVzLCBpbnN0ZWFkIG9mCisgIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZXMgZ2l2ZW4gYnkgdGhlIGx4bWwgcGFyc2VyLiBbYnVnPTEwMzc1OTddCisKKyogRml4ZWQgYSBjcmFzaCBvbiBlbmNvZGluZyB3aGVuIGFuIGF0dHJpYnV0ZSBuYW1lIGNvbnRhaW5lZAorICBub24tQVNDSUkgY2hhcmFjdGVycy4KKworKiBXaGVuIHNuaWZmaW5nIGVuY29kaW5ncywgaWYgdGhlIGNjaGFyZGV0IGxpYnJhcnkgaXMgaW5zdGFsbGVkLAorICBCZWF1dGlmdWwgU291cCB1c2VzIGl0IGluc3RlYWQgb2YgY2hhcmRldC4gY2NoYXJkZXQgaXMgbXVjaAorICBmYXN0ZXIuIFtidWc9MTAyMDc0OF0KKworKiBVc2UgbG9nZ2luZy53YXJuaW5nKCkgaW5zdGVhZCBvZiB3YXJuaW5nLndhcm4oKSB0byBub3RpZnkgdGhlIHVzZXIKKyAgdGhhdCBjaGFyYWN0ZXJzIHdlcmUgcmVwbGFjZWQgd2l0aCBSRVBMQUNFTUVOVAorICBDSEFSQUNURVIuIFtidWc9MTAxMzg2Ml0KKworPSA0LjEuMSAoMjAxMjA3MDMpID0KKworKiBGaXhlZCBhbiBodG1sNWxpYiB0cmVlIGJ1aWxkZXIgY3Jhc2ggd2hpY2ggaGFwcGVuZWQgd2hlbiBodG1sNWxpYgorICBtb3ZlZCBhIHRhZyB3aXRoIGEgbXVsdGl2YWx1ZWQgYXR0cmlidXRlIGZyb20gb25lIHBhcnQgb2YgdGhlIHRyZWUKKyAgdG8gYW5vdGhlci4gW2J1Zz0xMDE5NjAzXQorCisqIENvcnJlY3RseSBkaXNwbGF5IGNsb3NpbmcgdGFncyB3aXRoIGFuIFhNTCBuYW1lc3BhY2UgZGVjbGFyZWQuIFBhdGNoCisgIGJ5IEFuZHJlYXMgS29zdHlya2EuIFtidWc9MTAxOTYzNV0KKworKiBGaXhlZCBhIHR5cG8gdGhhdCBtYWRlIHBhcnNpbmcgc2lnbmlmaWNhbnRseSBzbG93ZXIgdGhhbiBpdCBzaG91bGQKKyAgaGF2ZSBiZWVuLCBhbmQgYWxzbyB3YWl0ZWQgdG9vIGxvbmcgdG8gY2xvc2UgdGFncyB3aXRoIFhNTAorICBuYW1lc3BhY2VzLiBbYnVnPTEwMjAyNjhdCisKKyogZ2V0X3RleHQoKSBub3cgcmV0dXJucyBhbiBlbXB0eSBVbmljb2RlIHN0cmluZyBpZiB0aGVyZSBpcyBubyB0ZXh0LAorICByYXRoZXIgdGhhbiBhbiBlbXB0eSBieXRlc3RyaW5nLiBbYnVnPTEwMjAzODddCisKKz0gNC4xLjAgKDIwMTIwNTI5KSA9CisKKyogQWRkZWQgZXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIGZpeGluZyBXaW5kb3dzLTEyNTIgY2hhcmFjdGVycworICBlbWJlZGRlZCBpbiBVVEYtOCBkb2N1bWVudHMuIChVbmljb2RlRGFtbWl0LmRldHdpbmdsZSgpKQorCisqIEZpeGVkIHRoZSBoYW5kbGluZyBvZiAmcXVvdDsgd2l0aCB0aGUgYnVpbHQtaW4gcGFyc2VyLiBbYnVnPTk5Mzg3MV0KKworKiBDb21tZW50cywgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMsIGRvY3VtZW50IHR5cGUgZGVjbGFyYXRpb25zLCBhbmQKKyAgbWFya3VwIGRlY2xhcmF0aW9ucyBhcmUgbm93IHRyZWF0ZWQgYXMgcHJlZm9ybWF0dGVkIHN0cmluZ3MsIHRoZSB3YXkKKyAgQ0RhdGEgYmxvY2tzIGFyZS4gW2J1Zz0xMDAxMDI1XQorCisqIEZpeGVkIGEgYnVnIHdpdGggdGhlIGx4bWwgdHJlZWJ1aWxkZXIgdGhhdCBwcmV2ZW50ZWQgdGhlIHVzZXIgZnJvbQorICBhZGRpbmcgYXR0cmlidXRlcyB0byBhIHRhZyB0aGF0IGRpZG4ndCBvcmlnaW5hbGx5IGhhdmUKKyAgYXR0cmlidXRlcy4gW2J1Zz0xMDAyMzc4XSBUaGFua3MgdG8gT2xpdmVyIEJlYXR0aWUgZm9yIHRoZSBwYXRjaC4KKworKiBGaXhlZCBzb21lIGVkZ2UtY2FzZSBidWdzIGhhdmluZyB0byBkbyB3aXRoIGluc2VydGluZyBhbiBlbGVtZW50CisgIGludG8gYSB0YWcgaXQncyBhbHJlYWR5IGluc2lkZSwgYW5kIHJlcGxhY2luZyBvbmUgb2YgYSB0YWcncworICBjaGlsZHJlbiB3aXRoIGFub3RoZXIuIFtidWc9OTk3NTI5XQorCisqIEFkZGVkIHRoZSBhYmlsaXR5IHRvIHNlYXJjaCBmb3IgYXR0cmlidXRlIHZhbHVlcyBzcGVjaWZpZWQgaW4gVVRGLTguIFtidWc9MTAwMzk3NF0KKworICBUaGlzIGNhdXNlZCBhIG1ham9yIHJlZmFjdG9yaW5nIG9mIHRoZSBzZWFyY2ggY29kZS4gQWxsIHRoZSB0ZXN0cworICBwYXNzLCBidXQgaXQncyBwb3NzaWJsZSB0aGF0IHNvbWUgc2VhcmNoZXMgd2lsbCBiZWhhdmUgZGlmZmVyZW50bHkuCisKKz0gNC4wLjUgKDIwMTIwNDI3KSA9CisKKyogQWRkZWQgYSBuZXcgbWV0aG9kLCB3cmFwKCksIHdoaWNoIHdyYXBzIGFuIGVsZW1lbnQgaW4gYSB0YWcuCisKKyogUmVuYW1lZCByZXBsYWNlX3dpdGhfY2hpbGRyZW4oKSB0byB1bndyYXAoKSwgd2hpY2ggaXMgZWFzaWVyIHRvCisgIHVuZGVyc3RhbmQgYW5kIGFsc28gdGhlIGpRdWVyeSBuYW1lIG9mIHRoZSBmdW5jdGlvbi4KKworKiBNYWRlIGVuY29kaW5nIHN1YnN0aXR1dGlvbiBpbiA8bWV0YT4gdGFncyBjb21wbGV0ZWx5IHRyYW5zcGFyZW50IChubworICBtb3JlICVTT1VQLUVOQ09ESU5HJSkuCisKKyogRml4ZWQgYSBidWcgaW4gZGVjb2RpbmcgZGF0YSB0aGF0IGNvbnRhaW5lZCBhIGJ5dGUtb3JkZXIgbWFyaywgc3VjaAorICBhcyBkYXRhIGVuY29kZWQgaW4gVVRGLTE2TEUuIFtidWc9OTg4OTgwXQorCisqIEZpeGVkIGEgYnVnIHRoYXQgbWFkZSB0aGUgSFRNTFBhcnNlciB0cmVlYnVpbGRlciBnZW5lcmF0ZSBYTUwKKyAgZGVmaW5pdGlvbnMgZW5kaW5nIHdpdGggdHdvIHF1ZXN0aW9uIG1hcmtzIGluc3RlYWQgb2YKKyAgb25lLiBbYnVnPTk4NDI1OF0KKworKiBVcG9uIGRvY3VtZW50IGdlbmVyYXRpb24sIENEYXRhIG9iamVjdHMgYXJlIG5vIGxvbmdlciBydW4gdGhyb3VnaAorICB0aGUgZm9ybWF0dGVyLiBbYnVnPTk4ODkwNV0KKworKiBUaGUgdGVzdCBzdWl0ZSBub3cgcGFzc2VzIHdoZW4gbHhtbCBpcyBub3QgaW5zdGFsbGVkLCB3aGV0aGVyIG9yIG5vdAorICBodG1sNWxpYiBpcyBpbnN0YWxsZWQuIFtidWc9OTg3MDA0XQorCisqIFByaW50IGEgd2FybmluZyBvbiBIVE1MUGFyc2VFcnJvcnMgdG8gbGV0IHBlb3BsZSBrbm93IHRoZXkgc2hvdWxkCisgIGluc3RhbGwgYSBiZXR0ZXIgcGFyc2VyIGxpYnJhcnkuCisKKz0gNC4wLjQgKDIwMTIwNDE2KSA9CisKKyogRml4ZWQgYSBidWcgdGhhdCBzb21ldGltZXMgY3JlYXRlZCBkaXNjb25uZWN0ZWQgdHJlZXMuCisKKyogRml4ZWQgYSBidWcgd2l0aCB0aGUgc3RyaW5nIHNldHRlciB0aGF0IG1vdmVkIGEgc3RyaW5nIGFyb3VuZCB0aGUKKyAgdHJlZSBpbnN0ZWFkIG9mIGNvcHlpbmcgaXQuIFtidWc9OTgzMDUwXQorCisqIEF0dHJpYnV0ZSB2YWx1ZXMgYXJlIG5vdyBydW4gdGhyb3VnaCB0aGUgcHJvdmlkZWQgb3V0cHV0IGZvcm1hdHRlci4KKyAgUHJldmlvdXNseSB0aGV5IHdlcmUgYWx3YXlzIHJ1biB0aHJvdWdoIHRoZSAnbWluaW1hbCcgZm9ybWF0dGVyLiBJbgorICB0aGUgZnV0dXJlIEkgbWF5IG1ha2UgaXQgcG9zc2libGUgdG8gc3BlY2lmeSBkaWZmZXJlbnQgZm9ybWF0dGVycworICBmb3IgYXR0cmlidXRlIHZhbHVlcyBhbmQgc3RyaW5ncywgYnV0IGZvciBub3csIGNvbnNpc3RlbnQgYmVoYXZpb3IKKyAgaXMgYmV0dGVyIHRoYW4gaW5jb25zaXN0ZW50IGJlaGF2aW9yLiBbYnVnPTk4MDIzN10KKworKiBBZGRlZCB0aGUgbWlzc2luZyByZW5kZXJDb250ZW50cyBtZXRob2QgZnJvbSBCZWF1dGlmdWwgU291cCAzLiBBbHNvCisgIGFkZGVkIGFuIGVuY29kZV9jb250ZW50cygpIG1ldGhvZCB0byBnbyBhbG9uZyB3aXRoIGRlY29kZV9jb250ZW50cygpLgorCisqIEdpdmUgYSBtb3JlIHVzZWZ1bCBlcnJvciB3aGVuIHRoZSB1c2VyIHRyaWVzIHRvIHJ1biB0aGUgUHl0aG9uIDIKKyAgdmVyc2lvbiBvZiBCUyB1bmRlciBQeXRob24gMy4KKworKiBVbmljb2RlRGFtbWl0IGNhbiBub3cgY29udmVydCBNaWNyb3NvZnQgc21hcnQgcXVvdGVzIHRvIEFTQ0lJIHdpdGgKKyAgVW5pY29kZURhbW1pdChtYXJrdXAsIHNtYXJ0X3F1b3Rlc190bz0iYXNjaWkiKS4KKworPSA0LjAuMyAoMjAxMjA0MDMpID0KKworKiBGaXhlZCBhIHR5cG8gdGhhdCBjYXVzZWQgc29tZSB2ZXJzaW9ucyBvZiBQeXRob24gMyB0byBjb252ZXJ0IHRoZQorICBCZWF1dGlmdWwgU291cCBjb2RlYmFzZSBpbmNvcnJlY3RseS4KKworKiBHb3QgcmlkIG9mIHRoZSA0LjAuMiB3b3JrYXJvdW5kIGZvciBIVE1MIGRvY3VtZW50cy0taXQgd2FzCisgIHVubmVjZXNzYXJ5IGFuZCB0aGUgd29ya2Fyb3VuZCB3YXMgdHJpZ2dlcmluZyBhIChwb3NzaWJseSBkaWZmZXJlbnQsCisgIGJ1dCByZWxhdGVkKSBidWcgaW4gbHhtbC4gW2J1Zz05NzI0NjZdCisKKz0gNC4wLjIgKDIwMTIwMzI2KSA9CisKKyogV29ya2VkIGFyb3VuZCBhIHBvc3NpYmxlIGJ1ZyBpbiBseG1sIHRoYXQgcHJldmVudHMgbm9uLXRpbnkgWE1MCisgIGRvY3VtZW50cyBmcm9tIGJlaW5nIHBhcnNlZC4gW2J1Zz05NjM4ODAsIGJ1Zz05NjM5MzZdCisKKyogRml4ZWQgYSBidWcgd2hlcmUgc3BlY2lmeWluZyBgdGV4dGAgd2hpbGUgYWxzbyBzZWFyY2hpbmcgZm9yIGEgdGFnCisgIG9ubHkgd29ya2VkIGlmIGB0ZXh0YCB3YW50ZWQgYW4gZXhhY3Qgc3RyaW5nIG1hdGNoLiBbYnVnPTk1NTk0Ml0KKworPSA0LjAuMSAoMjAxMjAzMTQpID0KKworKiBUaGlzIGlzIHRoZSBmaXJzdCBvZmZpY2lhbCByZWxlYXNlIG9mIEJlYXV0aWZ1bCBTb3VwIDQuIFRoZXJlIGlzIG5vCisgIDQuMC4wIHJlbGVhc2UsIHRvIGVsaW1pbmF0ZSBhbnkgcG9zc2liaWxpdHkgdGhhdCBwYWNrYWdpbmcgc29mdHdhcmUKKyAgbWlnaHQgdHJlYXQgIjQuMC4wIiBhcyBiZWluZyBhbiBlYXJsaWVyIHZlcnNpb24gdGhhbiAiNC4wLjBiMTAiLgorCisqIEJyb3VnaHQgQlMgdXAgdG8gZGF0ZSB3aXRoIHRoZSBsYXRlc3QgcmVsZWFzZSBvZiBzb3Vwc2VsZWN0LCBhZGRpbmcKKyAgQ1NTIHNlbGVjdG9yIHN1cHBvcnQgZm9yIGRpcmVjdCBkZXNjZW5kYW50IG1hdGNoZXMgYW5kIG11bHRpcGxlIENTUworICBjbGFzcyBtYXRjaGVzLgorCis9IDQuMC4wYjEwICgyMDEyMDMwMikgPQorCisqIEFkZGVkIHN1cHBvcnQgZm9yIHNpbXBsZSBDU1Mgc2VsZWN0b3JzLCB0YWtlbiBmcm9tIHRoZSBzb3Vwc2VsZWN0IHByb2plY3QuCisKKyogRml4ZWQgYSBjcmFzaCB3aGVuIHVzaW5nIGh0bWw1bGliLiBbYnVnPTk0MzI0Nl0KKworKiBJbiBIVE1MNS1zdHlsZSA8bWV0YSBjaGFyc2V0PSJmb28iPiB0YWdzLCB0aGUgdmFsdWUgb2YgdGhlICJjaGFyc2V0IgorICBhdHRyaWJ1dGUgaXMgbm93IHJlcGxhY2VkIHdpdGggdGhlIGFwcHJvcHJpYXRlIGVuY29kaW5nIG9uCisgIG91dHB1dC4gW2J1Zz05NDI3MTRdCisKKyogRml4ZWQgYSBidWcgdGhhdCBjYXVzZWQgY2FsbGluZyBhIHRhZyB0byBzb21ldGltZXMgY2FsbCBmaW5kX2FsbCgpCisgIHdpdGggdGhlIHdyb25nIGFyZ3VtZW50cy4gW2J1Zz05NDQ0MjZdCisKKyogRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBicm91Z2h0IGJhY2sgdGhlIEJlYXV0aWZ1bFN0b25lU291cAorICBjbGFzcyBhcyBhIGRlcHJlY2F0ZWQgd3JhcHBlciBhcm91bmQgQmVhdXRpZnVsU291cC4KKworPSA0LjAuMGI5ICgyMDEyMDIyOCkgPQorCisqIEZpeGVkIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgRE9DVFlQRXMgdGhhdCBoYXZlIGJvdGggYSBwdWJsaWMKKyAgSUQgYW5kIGEgc3lzdGVtIElELgorCisqIEZpeGVkIHRoZSBnZW5lcmF0ZWQgWE1MIGRlY2xhcmF0aW9uLgorCisqIFJlbmFtZWQgVGFnLm5zcHJlZml4IHRvIFRhZy5wcmVmaXgsIGZvciBjb25zaXN0ZW5jeSB3aXRoCisgIE5hbWVzcGFjZWRBdHRyaWJ1dGUuCisKKyogRml4ZWQgYSB0ZXN0IGZhaWx1cmUgdGhhdCBvY2N1cmVkIG9uIFB5dGhvbiAzLnggd2hlbiBjaGFyZGV0IHdhcworICBpbnN0YWxsZWQuCisKKyogTWFkZSBwcmV0dGlmeSgpIHJldHVybiBVbmljb2RlIGJ5IGRlZmF1bHQsIHNvIGl0IHdpbGwgbG9vayBuaWNlIG9uCisgIFB5dGhvbiAzIHdoZW4gcGFzc2VkIGludG8gcHJpbnQoKS4KKworPSA0LjAuMGI4ICgyMDEyMDIyNCkgPQorCisqIEFsbCB0cmVlIGJ1aWxkZXJzIG5vdyBwcmVzZXJ2ZSBuYW1lc3BhY2UgaW5mb3JtYXRpb24gaW4gdGhlCisgIGRvY3VtZW50cyB0aGV5IHBhcnNlLiBJZiB5b3UgdXNlIHRoZSBodG1sNWxpYiBwYXJzZXIgb3IgbHhtbCdzIFhNTAorICBwYXJzZXIsIHlvdSBjYW4gYWNjZXNzIHRoZSBuYW1lc3BhY2UgVVJMIGZvciBhIHRhZyBhcyB0YWcubmFtZXNwYWNlLgorCisgIEhvd2V2ZXIsIHRoZXJlIGlzIG5vIHNwZWNpYWwgc3VwcG9ydCBmb3IgbmFtZXNwYWNlLW9yaWVudGVkCisgIHNlYXJjaGluZyBvciB0cmVlIG1hbmlwdWxhdGlvbi4gV2hlbiB5b3Ugc2VhcmNoIHRoZSB0cmVlLCB5b3UgbmVlZAorICB0byB1c2UgbmFtZXNwYWNlIHByZWZpeGVzIGV4YWN0bHkgYXMgdGhleSdyZSB1c2VkIGluIHRoZSBvcmlnaW5hbAorICBkb2N1bWVudC4KKworKiBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgRE9DVFlQRSBhbHdheXMgZW5kcyBpbiBhIG5ld2xpbmUuCisKKyogSXNzdWUgYSB3YXJuaW5nIGlmIHRoZSB1c2VyIHRyaWVzIHRvIHVzZSBhIFNvdXBTdHJhaW5lciBpbgorICBjb25qdW5jdGlvbiB3aXRoIHRoZSBodG1sNWxpYiB0cmVlIGJ1aWxkZXIsIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydAorICB0aGVtLgorCis9IDQuMC4wYjcgKDIwMTIwMjIzKSA9CisKKyogVXBvbiBkZWNvZGluZyB0byBzdHJpbmcsIGFueSBjaGFyYWN0ZXJzIHRoYXQgY2FuJ3QgYmUgcmVwcmVzZW50ZWQgaW4KKyAgeW91ciBjaG9zZW4gZW5jb2Rpbmcgd2lsbCBiZSBjb252ZXJ0ZWQgaW50byBudW1lcmljIFhNTCBlbnRpdHkKKyAgcmVmZXJlbmNlcy4KKworKiBJc3N1ZSBhIHdhcm5pbmcgaWYgY2hhcmFjdGVycyB3ZXJlIHJlcGxhY2VkIHdpdGggUkVQTEFDRU1FTlQKKyAgQ0hBUkFDVEVSIGR1cmluZyBVbmljb2RlIGNvbnZlcnNpb24uCisKKyogUmVzdG9yZWQgY29tcGF0aWJpbGl0eSB3aXRoIFB5dGhvbiAyLjYuCisKKyogVGhlIGluc3RhbGwgcHJvY2VzcyBubyBsb25nZXIgaW5zdGFsbHMgZG9jcyBvciBhdXhpbGxhcnkgdGV4dCBmaWxlcy4KKworKiBJdCdzIG5vdyBwb3NzaWJsZSB0byBkZWVwY29weSBhIEJlYXV0aWZ1bFNvdXAgb2JqZWN0IGNyZWF0ZWQgd2l0aAorICBQeXRob24ncyBidWlsdC1pbiBIVE1MIHBhcnNlci4KKworKiBBYm91dCAxMDAgdW5pdCB0ZXN0cyB0aGF0ICJ0ZXN0IiB0aGUgYmVoYXZpb3Igb2YgdmFyaW91cyBwYXJzZXJzIG9uCisgIGludmFsaWQgbWFya3VwIGhhdmUgYmVlbiByZW1vdmVkLiBMZWdpdGltYXRlIGNoYW5nZXMgdG8gdGhvc2UKKyAgcGFyc2VycyBjYXVzZWQgdGhlc2UgdGVzdHMgdG8gZmFpbCwgaW5kaWNhdGluZyB0aGF0IHBlcmhhcHMKKyAgQmVhdXRpZnVsIFNvdXAgc2hvdWxkIG5vdCB0ZXN0IHRoZSBiZWhhdmlvciBvZiBmb3JlaWduCisgIGxpYnJhcmllcy4KKworICBUaGUgcHJvYmxlbWF0aWMgdW5pdCB0ZXN0cyBoYXZlIGJlZW4gcmVmb3JtdWxhdGVkIGFzIGluZm9ybWF0aW9uYWwKKyAgY29tcGFyaXNvbnMgZ2VuZXJhdGVkIGJ5IHRoZSBzY3JpcHQKKyAgc2NyaXB0cy9kZW1vbnN0cmF0ZV9wYXJzZXJfZGlmZmVyZW5jZXMucHkuCisKKyAgVGhpcyBtYWtlcyBCZWF1dGlmdWwgU291cCBjb21wYXRpYmxlIHdpdGggaHRtbDVsaWIgdmVyc2lvbiAwLjk1IGFuZAorICBmdXR1cmUgdmVyc2lvbnMgb2YgSFRNTFBhcnNlci4KKworPSA0LjAuMGI2ICgyMDEyMDIxNikgPQorCisqIE11bHRpLXZhbHVlZCBhdHRyaWJ1dGVzIGxpa2UgImNsYXNzIiBhbHdheXMgaGF2ZSBhIGxpc3Qgb2YgdmFsdWVzLAorICBldmVuIGlmIHRoZXJlJ3Mgb25seSBvbmUgdmFsdWUgaW4gdGhlIGxpc3QuCisKKyogQWRkZWQgYSBudW1iZXIgb2YgbXVsdGktdmFsdWVkIGF0dHJpYnV0ZXMgZGVmaW5lZCBpbiBIVE1MNS4KKworKiBTdG9wcGVkIGdlbmVyYXRpbmcgYSBzcGFjZSBiZWZvcmUgdGhlIHNsYXNoIHRoYXQgY2xvc2VzIGFuCisgIGVtcHR5LWVsZW1lbnQgdGFnLiBUaGlzIG1heSBjb21lIGJhY2sgaWYgSSBhZGQgYSBzcGVjaWFsIFhIVE1MIG1vZGUKKyAgKGh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS8jQ18yKSwgYnV0IHJpZ2h0IG5vdyBpdCdzIHByZXR0eQorICB1c2VsZXNzLgorCisqIFBhc3NpbmcgdGV4dCBhbG9uZyB3aXRoIHRhZy1zcGVjaWZpYyBhcmd1bWVudHMgdG8gYSBmaW5kKiBtZXRob2Q6CisKKyAgIGZpbmQoImEiLCB0ZXh0PSJDbGljayBoZXJlIikKKworICB3aWxsIGZpbmQgdGFncyB0aGF0IGNvbnRhaW4gdGhlIGdpdmVuIHRleHQgYXMgdGhlaXIKKyAgLnN0cmluZy4gUHJldmlvdXNseSwgdGhlIHRhZy1zcGVjaWZpYyBhcmd1bWVudHMgd2VyZSBpZ25vcmVkIGFuZAorICBvbmx5IHN0cmluZ3Mgd2VyZSBzZWFyY2hlZC4KKworKiBGaXhlZCBhIGJ1ZyB0aGF0IGNhdXNlZCB0aGUgaHRtbDVsaWIgdHJlZSBidWlsZGVyIHRvIGJ1aWxkIGEKKyAgcGFydGlhbGx5IGRpc2Nvbm5lY3RlZCB0cmVlLiBHZW5lcmFsbHkgY2xlYW5lZCB1cCB0aGUgaHRtbDVsaWIgdHJlZQorICBidWlsZGVyLgorCisqIElmIHlvdSByZXN0cmljdCBhIG11bHRpLXZhbHVlZCBhdHRyaWJ1dGUgbGlrZSAiY2xhc3MiIHRvIGEgc3RyaW5nCisgIHRoYXQgY29udGFpbnMgc3BhY2VzLCBCZWF1dGlmdWwgU291cCB3aWxsIG9ubHkgY29uc2lkZXIgaXQgYSBtYXRjaAorICBpZiB0aGUgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhhdCBzcGVjaWZpYyBzdHJpbmcuCisKKz0gNC4wLjBiNSAoMjAxMjAyMDkpID0KKworKiBSYXRpb25hbGl6ZWQgQmVhdXRpZnVsIFNvdXAncyB0cmVhdG1lbnQgb2YgQ1NTIGNsYXNzLiBBIHRhZworICBiZWxvbmdpbmcgdG8gbXVsdGlwbGUgQ1NTIGNsYXNzZXMgaXMgdHJlYXRlZCBhcyBoYXZpbmcgYSBsaXN0IG9mCisgIHZhbHVlcyBmb3IgdGhlICdjbGFzcycgYXR0cmlidXRlLiBTZWFyY2hpbmcgZm9yIGEgQ1NTIGNsYXNzIHdpbGwKKyAgbWF0Y2ggKmFueSogb2YgdGhlIENTUyBjbGFzc2VzLgorCisgIFRoaXMgYWN0dWFsbHkgYWZmZWN0cyBhbGwgYXR0cmlidXRlcyB0aGF0IHRoZSBIVE1MIHN0YW5kYXJkIGRlZmluZXMKKyAgYXMgdGFraW5nIG11bHRpcGxlIHZhbHVlcyAoY2xhc3MsIHJlbCwgcmV2LCBhcmNoaXZlLCBhY2NlcHQtY2hhcnNldCwKKyAgYW5kIGhlYWRlcnMpLCBidXQgJ2NsYXNzJyBpcyBieSBmYXIgdGhlIG1vc3QgY29tbW9uLiBbYnVnPTQxMDM0XQorCisqIElmIHlvdSBwYXNzIGFueXRoaW5nIG90aGVyIHRoYW4gYSBkaWN0aW9uYXJ5IGFzIHRoZSBzZWNvbmQgYXJndW1lbnQKKyAgdG8gb25lIG9mIHRoZSBmaW5kKiBtZXRob2RzLCBpdCdsbCBhc3N1bWUgeW91IHdhbnQgdG8gdXNlIHRoYXQKKyAgb2JqZWN0IHRvIHNlYXJjaCBhZ2FpbnN0IGEgdGFnJ3MgQ1NTIGNsYXNzZXMuIFByZXZpb3VzbHkgdGhpcyBvbmx5CisgIHdvcmtlZCBpZiB5b3UgcGFzc2VkIGluIGEgc3RyaW5nLgorCisqIEZpeGVkIGEgYnVnIHRoYXQgY2F1c2VkIGEgY3Jhc2ggd2hlbiB5b3UgcGFzc2VkIGEgZGljdGlvbmFyeSBhcyBhbgorICBhdHRyaWJ1dGUgdmFsdWUgKHBvc3NpYmx5IGJlY2F1c2UgeW91IG1pc3R5cGVkICJhdHRycyIpLiBbYnVnPTg0MjQxOV0KKworKiBVbmljb2RlLCBEYW1taXQgbm93IGRldGVjdHMgdGhlIGVuY29kaW5nIGluIEhUTUwgNS1zdHlsZSA8bWV0YT4gdGFncworICBsaWtlIDxtZXRhIGNoYXJzZXQ9InV0Zi04IiAvPi4gW2J1Zz04MzcyNjhdCisKKyogSWYgVW5pY29kZSwgRGFtbWl0IGNhbid0IGZpZ3VyZSBvdXQgYSBjb25zaXN0ZW50IGVuY29kaW5nIGZvciBhCisgIHBhZ2UsIGl0IHdpbGwgdHJ5IGVhY2ggb2YgaXRzIGd1ZXNzZXMgYWdhaW4sIHdpdGggZXJyb3JzPSJyZXBsYWNlIgorICBpbnN0ZWFkIG9mIGVycm9ycz0ic3RyaWN0Ii4gVGhpcyBtYXkgbWVhbiB0aGF0IHNvbWUgZGF0YSBnZXRzCisgIHJlcGxhY2VkIHdpdGggUkVQTEFDRU1FTlQgQ0hBUkFDVEVSLCBidXQgYXQgbGVhc3QgbW9zdCBvZiBpdCB3aWxsCisgIGdldCB0dXJuZWQgaW50byBVbmljb2RlLiBbYnVnPTc1NDkwM10KKworKiBQYXRjaGVkIG92ZXIgYSBidWcgaW4gaHRtbDVsaWIgKD8pIHRoYXQgd2FzIGNyYXNoaW5nIEJlYXV0aWZ1bCBTb3VwCisgIG9uIGNlcnRhaW4ga2luZHMgb2YgbWFya3VwLiBbYnVnPTgzODgwMF0KKworKiBGaXhlZCBhIGJ1ZyB0aGF0IHdyZWNrZWQgdGhlIHRyZWUgaWYgeW91IHJlcGxhY2VkIGFuIGVsZW1lbnQgd2l0aCBhbgorICBlbXB0eSBzdHJpbmcuIFtidWc9NzI4Njk3XQorCisqIEltcHJvdmVkIFVuaWNvZGUsIERhbW1pdCdzIGJlaGF2aW9yIHdoZW4geW91IGdpdmUgaXQgVW5pY29kZSB0bworICBiZWdpbiB3aXRoLgorCis9IDQuMC4wYjQgKDIwMTIwMjA4KSA9CisKKyogQWRkZWQgQmVhdXRpZnVsU291cC5uZXdfc3RyaW5nKCkgdG8gZ28gYWxvbmcgd2l0aCBCZWF1dGlmdWxTb3VwLm5ld190YWcoKQorCisqIEJlYXV0aWZ1bFNvdXAubmV3X3RhZygpIHdpbGwgZm9sbG93IHRoZSBydWxlcyBvZiB3aGF0ZXZlcgorICB0cmVlLWJ1aWxkZXIgd2FzIHVzZWQgdG8gY3JlYXRlIHRoZSBvcmlnaW5hbCBCZWF1dGlmdWxTb3VwIG9iamVjdC4gQQorICBuZXcgPHA+IHRhZyB3aWxsIGxvb2sgbGlrZSAiPHAgLz4iIGlmIHRoZSBzb3VwIG9iamVjdCB3YXMgY3JlYXRlZCB0bworICBwYXJzZSBYTUwsIGJ1dCBpdCB3aWxsIGxvb2sgbGlrZSAiPHA+PC9wPiIgaWYgdGhlIHNvdXAgb2JqZWN0IHdhcworICBjcmVhdGVkIHRvIHBhcnNlIEhUTUwuCisKKyogV2UgcGFzcyBpbiBzdHJpY3Q9RmFsc2UgdG8gaHRtbC5wYXJzZXIgb24gUHl0aG9uIDMsIGdyZWF0bHkKKyAgaW1wcm92aW5nIGh0bWwucGFyc2VyJ3MgYWJpbGl0eSB0byBoYW5kbGUgYmFkIEhUTUwuCisKKyogV2UgYWxzbyBtb25rZXlwYXRjaCBhIHNlcmlvdXMgYnVnIGluIGh0bWwucGFyc2VyIHRoYXQgbWFkZQorICBzdHJpY3Q9RmFsc2UgZGlzYXN0cm91cyBvbiBQeXRob24gMy4yLjIuCisKKyogUmVwbGFjZWQgdGhlICJzdWJzdGl0dXRlX2h0bWxfZW50aXRpZXMiIGFyZ3VtZW50IHdpdGggdGhlCisgIG1vcmUgZ2VuZXJhbCAiZm9ybWF0dGVyIiBhcmd1bWVudC4KKworKiBCYXJlIGFtcGVyc2FuZHMgYW5kIGFuZ2xlIGJyYWNrZXRzIGFyZSBhbHdheXMgY29udmVydGVkIHRvIFhNTAorICBlbnRpdGllcyB1bmxlc3MgdGhlIHVzZXIgcHJldmVudHMgaXQuCisKKyogQWRkZWQgUGFnZUVsZW1lbnQuaW5zZXJ0X2JlZm9yZSgpIGFuZCBQYWdlRWxlbWVudC5pbnNlcnRfYWZ0ZXIoKSwKKyAgd2hpY2ggbGV0IHlvdSBwdXQgYW4gZWxlbWVudCBpbnRvIHRoZSBwYXJzZSB0cmVlIHdpdGggcmVzcGVjdCB0bworICBzb21lIG90aGVyIGVsZW1lbnQuCisKKyogUmFpc2UgYW4gZXhjZXB0aW9uIHdoZW4gdGhlIHVzZXIgdHJpZXMgdG8gZG8gc29tZXRoaW5nIG5vbnNlbnNpY2FsCisgIGxpa2UgaW5zZXJ0IGEgdGFnIGludG8gaXRzZWxmLgorCisKKz0gNC4wLjBiMyAoMjAxMjAyMDMpID0KKworQmVhdXRpZnVsIFNvdXAgNCBpcyBhIG5lYXJseS1jb21wbGV0ZSByZXdyaXRlIHRoYXQgcmVtb3ZlcyBCZWF1dGlmdWwKK1NvdXAncyBjdXN0b20gSFRNTCBwYXJzZXIgaW4gZmF2b3Igb2YgYSBzeXN0ZW0gdGhhdCBsZXRzIHlvdSB3cml0ZSBhCitsaXR0bGUgZ2x1ZSBjb2RlIGFuZCBwbHVnIGluIGFueSBIVE1MIG9yIFhNTCBwYXJzZXIgeW91IHdhbnQuCisKK0JlYXV0aWZ1bCBTb3VwIDQuMCBjb21lcyB3aXRoIGdsdWUgY29kZSBmb3IgZm91ciBwYXJzZXJzOgorCisgKiBQeXRob24ncyBzdGFuZGFyZCBIVE1MUGFyc2VyIChodG1sLnBhcnNlciBpbiBQeXRob24gMykKKyAqIGx4bWwncyBIVE1MIGFuZCBYTUwgcGFyc2VycworICogaHRtbDVsaWIncyBIVE1MIHBhcnNlcgorCitIVE1MUGFyc2VyIGlzIHRoZSBkZWZhdWx0LCBidXQgSSByZWNvbW1lbmQgeW91IGluc3RhbGwgbHhtbCBpZiB5b3UKK2Nhbi4KKworRm9yIGNvbXBsZXRlIGRvY3VtZW50YXRpb24sIHNlZSB0aGUgU3BoaW54IGRvY3VtZW50YXRpb24gaW4KK2JzNC9kb2Mvc291cmNlLy4gV2hhdCBmb2xsb3dzIGlzIGEgc3VtbWFyeSBvZiB0aGUgY2hhbmdlcyBmcm9tCitCZWF1dGlmdWwgU291cCAzLgorCis9PT0gVGhlIG1vZHVsZSBuYW1lIGhhcyBjaGFuZ2VkID09PQorCitQcmV2aW91c2x5IHlvdSBpbXBvcnRlZCB0aGUgQmVhdXRpZnVsU291cCBjbGFzcyBmcm9tIGEgbW9kdWxlIGFsc28KK2NhbGxlZCBCZWF1dGlmdWxTb3VwLiBUbyBzYXZlIGtleXN0cm9rZXMgYW5kIG1ha2UgaXQgY2xlYXIgd2hpY2gKK3ZlcnNpb24gb2YgdGhlIEFQSSBpcyBpbiB1c2UsIHRoZSBtb2R1bGUgaXMgbm93IGNhbGxlZCAnYnM0JzoKKworICAgID4+PiBmcm9tIGJzNCBpbXBvcnQgQmVhdXRpZnVsU291cAorCis9PT0gSXQgd29ya3Mgd2l0aCBQeXRob24gMyA9PT0KKworQmVhdXRpZnVsIFNvdXAgMy4xLjAgd29ya2VkIHdpdGggUHl0aG9uIDMsIGJ1dCB0aGUgcGFyc2VyIGl0IHVzZWQgd2FzCitzbyBiYWQgdGhhdCBpdCBiYXJlbHkgd29ya2VkIGF0IGFsbC4gQmVhdXRpZnVsIFNvdXAgNCB3b3JrcyB3aXRoCitQeXRob24gMywgYW5kIHNpbmNlIGl0cyBwYXJzZXIgaXMgcGx1Z2dhYmxlLCB5b3UgZG9uJ3Qgc2FjcmlmaWNlCitxdWFsaXR5LgorCitTcGVjaWFsIHRoYW5rcyB0byBUaG9tYXMgS2x1eXZlciBhbmQgRXppbyBNZWxvdHRpIGZvciBnZXR0aW5nIFB5dGhvbiAzCitzdXBwb3J0IHRvIHRoZSBmaW5pc2ggbGluZS4gRXppbyBNZWxvdHRpIGlzIGFsc28gdG8gdGhhbmsgZm9yIGdyZWF0bHkKK2ltcHJvdmluZyB0aGUgSFRNTCBwYXJzZXIgdGhhdCBjb21lcyB3aXRoIFB5dGhvbiAzLjIuCisKKz09PSBDREFUQSBzZWN0aW9ucyBhcmUgbm9ybWFsIHRleHQsIGlmIHRoZXkncmUgdW5kZXJzdG9vZCBhdCBhbGwuID09PQorCitDdXJyZW50bHksIHRoZSBseG1sIGFuZCBodG1sNWxpYiBIVE1MIHBhcnNlcnMgaWdub3JlIENEQVRBIHNlY3Rpb25zIGluCittYXJrdXA6CisKKyA8cD48IVtDREFUQVtmb29dXT48L3A+ID0+IDxwPjwvcD4KKworQSBmdXR1cmUgdmVyc2lvbiBvZiBodG1sNWxpYiB3aWxsIHR1cm4gQ0RBVEEgc2VjdGlvbnMgaW50byB0ZXh0IG5vZGVzLAorYnV0IG9ubHkgd2l0aGluIHRhZ3MgbGlrZSA8c3ZnPiBhbmQgPG1hdGg+OgorCisgPHN2Zz48IVtDREFUQVtmb29dXT48L3N2Zz4gPT4gPHA+Zm9vPC9wPgorCitUaGUgZGVmYXVsdCBYTUwgcGFyc2VyICh3aGljaCB1c2VzIGx4bWwgYmVoaW5kIHRoZSBzY2VuZXMpIHR1cm5zIENEQVRBCitzZWN0aW9ucyBpbnRvIG9yZGluYXJ5IHRleHQgZWxlbWVudHM6CisKKyA8cD48IVtDREFUQVtmb29dXT48L3A+ID0+IDxwPmZvbzwvcD4KKworSW4gdGhlb3J5IGl0J3MgcG9zc2libGUgdG8gcHJlc2VydmUgdGhlIENEQVRBIHNlY3Rpb25zIHdoZW4gdXNpbmcgdGhlCitYTUwgcGFyc2VyLCBidXQgSSBkb24ndCBzZWUgaG93IHRvIGdldCBpdCB0byB3b3JrIGluIHByYWN0aWNlLgorCis9PT0gTWlzY2VsbGFuZW91cyBvdGhlciBzdHVmZiA9PT0KKworSWYgdGhlIEJlYXV0aWZ1bFNvdXAgaW5zdGFuY2UgaGFzIC5pc194bWwgc2V0IHRvIFRydWUsIGFuIGFwcHJvcHJpYXRlCitYTUwgZGVjbGFyYXRpb24gd2lsbCBiZSBlbWl0dGVkIHdoZW4gdGhlIHRyZWUgaXMgdHJhbnNmb3JtZWQgaW50byBhCitzdHJpbmc6CisKKyAgICA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI+CisgICAgPG1hcmt1cD4KKyAgICAgLi4uCisgICAgPC9tYXJrdXA+CisKK1RoZSBbJ2x4bWwnLCAneG1sJ10gdHJlZSBidWlsZGVyIHNldHMgLmlzX3htbCB0byBUcnVlOyB0aGUgb3RoZXIgdHJlZQorYnVpbGRlcnMgc2V0IGl0IHRvIEZhbHNlLiBJZiB5b3Ugd2FudCB0byBwYXJzZSBYSFRNTCB3aXRoIGFuIEhUTUwKK3BhcnNlciwgeW91IGNhbiBzZXQgaXQgbWFudWFsbHkuCisKKworPSAzLjIuMCA9CisKK1RoZSAzLjEgc2VyaWVzIHdhc24ndCB2ZXJ5IHVzZWZ1bCwgc28gSSByZW5hbWVkIHRoZSAzLjAgc2VyaWVzIHRvIDMuMgordG8gbWFrZSBpdCBvYnZpb3VzIHdoaWNoIG9uZSB5b3Ugc2hvdWxkIHVzZS4KKworPSAzLjEuMCA9CisKK0EgaHlicmlkIHZlcnNpb24gdGhhdCBzdXBwb3J0cyAyLjQgYW5kIGNhbiBiZSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZAordG8gcnVuIHVuZGVyIFB5dGhvbiAzLjAuIFRoZXJlIGFyZSB0aHJlZSBiYWNrd2FyZHMtaW5jb21wYXRpYmxlCitjaGFuZ2VzIHlvdSBzaG91bGQgYmUgYXdhcmUgb2YsIGJ1dCBubyBuZXcgZmVhdHVyZXMgb3IgZGVsaWJlcmF0ZQorYmVoYXZpb3IgY2hhbmdlcy4KKworMS4gc3RyKCkgbWF5IG5vIGxvbmdlciBkbyB3aGF0IHlvdSB3YW50LiBUaGlzIGlzIGJlY2F1c2UgdGhlIG1lYW5pbmcKK29mIHN0cigpIGludmVydHMgYmV0d2VlbiBQeXRob24gMiBhbmQgMzsgaW4gUHl0aG9uIDIgaXQgZ2l2ZXMgeW91IGEKK2J5dGUgc3RyaW5nLCBpbiBQeXRob24gMyBpdCBnaXZlcyB5b3UgYSBVbmljb2RlIHN0cmluZy4KKworVGhlIGVmZmVjdCBvZiB0aGlzIGlzIHRoYXQgeW91IGNhbid0IHBhc3MgYW4gZW5jb2RpbmcgdG8gLl9fc3RyX18KK2FueW1vcmUuIFVzZSBlbmNvZGUoKSB0byBnZXQgYSBzdHJpbmcgYW5kIGRlY29kZSgpIHRvIGdldCBVbmljb2RlLCBhbmQKK3lvdSdsbCBiZSByZWFkeSAod2VsbCwgcmVhZGllcikgZm9yIFB5dGhvbiAzLgorCisyLiBCZWF1dGlmdWwgU291cCBpcyBub3cgYmFzZWQgb24gSFRNTFBhcnNlciByYXRoZXIgdGhhbiBTR01MUGFyc2VyLAord2hpY2ggaXMgZ29uZSBpbiBQeXRob24gMy4gVGhlcmUncyBzb21lIGJhZCBIVE1MIHRoYXQgU0dNTFBhcnNlcgoraGFuZGxlZCBidXQgSFRNTFBhcnNlciBkb2Vzbid0LCB1c3VhbGx5IHRvIGRvIHdpdGggYXR0cmlidXRlIHZhbHVlcwordGhhdCBhcmVuJ3QgY2xvc2VkIG9yIGhhdmUgYnJhY2tldHMgaW5zaWRlIHRoZW06CisKKyAgPGEgaHJlZj0iZm9vPC9hPiwgPC9hPjxhIGhyZWY9ImJhciI+YmF6PC9hPgorICA8YSBiPSI8YT4iPicsICc8YSBiPSImbHQ7YSZndDsiPjwvYT48YT4iPjwvYT4KKworQSBsYXRlciB2ZXJzaW9uIG9mIEJlYXV0aWZ1bCBTb3VwIHdpbGwgYWxsb3cgeW91IHRvIHBsdWcgaW4gZGlmZmVyZW50CitwYXJzZXJzIHRvIG1ha2UgdHJhZGVvZmZzIGJldHdlZW4gc3BlZWQgYW5kIHRoZSBhYmlsaXR5IHRvIGhhbmRsZSBiYWQKK0hUTUwuCisKKzMuIEluIFB5dGhvbiAzIChidXQgbm90IFB5dGhvbiAyKSwgSFRNTFBhcnNlciBjb252ZXJ0cyBlbnRpdGllcyB3aXRoaW4KK2F0dHJpYnV0ZXMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgVW5pY29kZSBjaGFyYWN0ZXJzLiBJbiBQeXRob24gMiBpdCdzCitwb3NzaWJsZSB0byBwYXJzZSB0aGlzIHN0cmluZyBhbmQgbGVhdmUgdGhlICZlYWN1dGU7IGludGFjdC4KKworIDxhIGhyZWY9Imh0dHA6Ly9jcnVtbXkuY29tP3NhY3ImZWFjdXRlOyZibGV1Ij4KKworSW4gUHl0aG9uIDMsIHRoZSAmZWFjdXRlOyBpcyBhbHdheXMgY29udmVydGVkIHRvIFx4ZTkgZHVyaW5nCitwYXJzaW5nLgorCisKKz0gMy4wLjdhID0KKworQWRkZWQgYW4gaW1wb3J0IHRoYXQgbWFrZXMgQlMgd29yayBpbiBQeXRob24gMi4zLgorCisKKz0gMy4wLjcgPQorCitGaXhlZCBhIFVuaWNvZGVEZWNvZGVFcnJvciB3aGVuIHVucGlja2xpbmcgZG9jdW1lbnRzIHRoYXQgY29udGFpbgorbm9uLUFTQ0lJIGNoYXJhY3RlcnMuCisKK0ZpeGVkIGEgVHlwZUVycm9yIHRoYXQgb2NjdXJlZCBpbiBzb21lIGNpcmN1bXN0YW5jZXMgd2hlbiBhIHRhZworY29udGFpbmVkIG5vIHRleHQuCisKK0p1bXAgdGhyb3VnaCBob29wcyB0byBhdm9pZCB0aGUgdXNlIG9mIGNoYXJkZXQsIHdoaWNoIGNhbiBiZSBleHRyZW1lbHkKK3Nsb3cgaW4gc29tZSBjaXJjdW1zdGFuY2VzLiBVVEYtOCBkb2N1bWVudHMgc2hvdWxkIG5ldmVyIHRyaWdnZXIgdGhlCit1c2Ugb2YgY2hhcmRldC4KKworV2hpdGVzcGFjZSBpcyBwcmVzZXJ2ZWQgaW5zaWRlIDxwcmU+IGFuZCA8dGV4dGFyZWE+IHRhZ3MgdGhhdCBjb250YWluCitub3RoaW5nIGJ1dCB3aGl0ZXNwYWNlLgorCitCZWF1dGlmdWwgU291cCBjYW4gbm93IHBhcnNlIGEgZG9jdHlwZSB0aGF0J3Mgc2NvcGVkIHRvIGFuIFhNTCBuYW1lc3BhY2UuCisKKworPSAzLjAuNiA9CisKK0dvdCByaWQgb2YgYSB2ZXJ5IG9sZCBkZWJ1ZyBsaW5lIHRoYXQgcHJldmVudGVkIGNoYXJkZXQgZnJvbSB3b3JraW5nLgorCitBZGRlZCBhIFRhZy5kZWNvbXBvc2UoKSBtZXRob2QgdGhhdCBjb21wbGV0ZWx5IGRpc2Nvbm5lY3RzIGEgdHJlZSBvciBhCitzdWJzZXQgb2YgYSB0cmVlLCBicmVha2luZyBpdCB1cCBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIHRoYXQgYXJlCitlYXN5IGZvciB0aGUgZ2FyYmFnZSBjb2xsZWN0ZXIgdG8gY29sbGVjdC4KKworVGFnLmV4dHJhY3QoKSBub3cgcmV0dXJucyB0aGUgdGFnIHRoYXQgd2FzIGV4dHJhY3RlZC4KKworVGFnLmZpbmROZXh0KCkgbm93IGRvZXMgc29tZXRoaW5nIHdpdGggdGhlIGtleXdvcmQgYXJndW1lbnRzIHlvdSBwYXNzCitpdCBpbnN0ZWFkIG9mIGRyb3BwaW5nIHRoZW0gb24gdGhlIGZsb29yLgorCitGaXhlZCBhIFVuaWNvZGUgY29udmVyc2lvbiBidWcuCisKK0ZpeGVkIGEgYnVnIHRoYXQgZ2FyYmxlZCBzb21lIDxtZXRhPiB0YWdzIHdoZW4gcmV3cml0aW5nIHRoZW0uCisKKworPSAzLjAuNSA9CisKK1NvdXAgb2JqZWN0cyBjYW4gbm93IGJlIHBpY2tsZWQsIGFuZCBjb3BpZWQgd2l0aCBjb3B5LmRlZXBjb3B5LgorCitUYWcuYXBwZW5kIG5vdyB3b3JrcyBwcm9wZXJseSBvbiBleGlzdGluZyBCUyBvYmplY3RzLiAoSXQgd2Fzbid0CitvcmlnaW5hbGx5IGludGVuZGVkIGZvciBvdXRzaWRlIHVzZSwgYnV0IGl0IGNhbiBiZSBub3cuKSAoR2lsZXMKK1JhZGZvcmQpCisKK1Bhc3NpbmcgaW4gYSBub25leGlzdGVudCBlbmNvZGluZyB3aWxsIG5vIGxvbmdlciBjcmFzaCB0aGUgcGFyc2VyIG9uCitQeXRob24gMi40IChKb2huIE5hZ2xlKS4KKworRml4ZWQgYW4gdW5kZXJseWluZyBidWcgaW4gU0dNTFBhcnNlciB0aGF0IHRoaW5rcyBBU0NJSSBoYXMgMjU1CitjaGFyYWN0ZXJzIGluc3RlYWQgb2YgMTI3IChKb2huIE5hZ2xlKS4KKworRW50aXRpZXMgYXJlIGNvbnZlcnRlZCBtb3JlIGNvbnNpc3RlbnRseSB0byBVbmljb2RlIGNoYXJhY3RlcnMuCisKK0VudGl0eSByZWZlcmVuY2VzIGluIGF0dHJpYnV0ZSB2YWx1ZXMgYXJlIG5vdyBjb252ZXJ0ZWQgdG8gVW5pY29kZQorY2hhcmFjdGVycyB3aGVuIGFwcHJvcHJpYXRlLiBOdW1lcmljIGVudGl0aWVzIGFyZSBhbHdheXMgY29udmVydGVkLAorYmVjYXVzZSBTR01MUGFyc2VyIGFsd2F5cyBjb252ZXJ0cyB0aGVtIG91dHNpZGUgb2YgYXR0cmlidXRlIHZhbHVlcy4KKworQUxMX0VOVElUSUVTIGhhcHBlbnMgdG8ganVzdCBiZSB0aGUgWEhUTUwgZW50aXRpZXMsIHNvIEkgcmVuYW1lZCBpdCB0bworWEhUTUxfRU5USVRJRVMuCisKK1RoZSByZWd1bGFyIGV4cHJlc3Npb24gZm9yIGJhcmUgYW1wZXJzYW5kcyB3YXMgdG9vIGxvb3NlLiBJbiBzb21lCitjYXNlcyBhbXBlcnNhbmRzIHdlcmUgbm90IGJlaW5nIGVzY2FwZWQuIChTYW0gUnVieT8pCisKK05vbi1icmVha2luZyBzcGFjZXMgYW5kIG90aGVyIHNwZWNpYWwgVW5pY29kZSBzcGFjZSBjaGFyYWN0ZXJzIGFyZSBubworbG9uZ2VyIGZvbGRlZCB0byBBU0NJSSBzcGFjZXMuIChSb2JlcnQgTGVmdHdpY2gpCisKK0luZm9ybWF0aW9uIGluc2lkZSBhIFRFWFRBUkVBIHRhZyBpcyBub3cgcGFyc2VkIGxpdGVyYWxseSwgbm90IGFzIEhUTUwKK3RhZ3MuIFRFWFRBUkVBIG5vdyB3b3JrcyBleGFjdGx5IHRoZSBzYW1lIHdheSBhcyBTQ1JJUFQuIChaZXBoeXIgRmFuZykKKworPSAzLjAuNCA9CisKK0ZpeGVkIGEgYnVnIHRoYXQgY3Jhc2hlZCBVbmljb2RlIGNvbnZlcnNpb24gaW4gc29tZSBjYXNlcy4KKworRml4ZWQgYSBidWcgdGhhdCBwcmV2ZW50ZWQgVW5pY29kZURhbW1pdCBmcm9tIGJlaW5nIHVzZWQgYXMgYQorZ2VuZXJhbC1wdXJwb3NlIGRhdGEgc2NydWJiZXIuCisKK0ZpeGVkIHNvbWUgdW5pdCB0ZXN0IGZhaWx1cmVzIHdoZW4gcnVubmluZyBhZ2FpbnN0IFB5dGhvbiAyLjUuCisKK1doZW4gY29uc2lkZXJpbmcgd2hldGhlciB0byBjb252ZXJ0IHNtYXJ0IHF1b3RlcywgVW5pY29kZURhbW1pdCBub3cKK2xvb2tzIGF0IHRoZSBvcmlnaW5hbCBlbmNvZGluZyBpbiBhIGNhc2UtaW5zZW5zaXRpdmUgd2F5LgorCis9IDMuMC4zICgyMDA2MDYwNikgPQorCitCZWF1dGlmdWwgU291cCBpcyBub3cgdXNhYmxlIGFzIGEgd2F5IHRvIGNsZWFuIHVwIGludmFsaWQgWE1ML0hUTUwgKGJlCitzdXJlIHRvIHBhc3MgaW4gYW4gYXBwcm9wcmlhdGUgdmFsdWUgZm9yIGNvbnZlcnRFbnRpdGllcywgb3IgWE1ML0hUTUwKK2VudGl0aWVzIG1pZ2h0IHN0aWNrIGFyb3VuZCB0aGF0IGFyZW4ndCB2YWxpZCBpbiBIVE1ML1hNTCkuIFRoZSByZXN1bHQKK21heSBub3QgdmFsaWRhdGUsIGJ1dCBpdCBzaG91bGQgYmUgZ29vZCBlbm91Z2ggdG8gbm90IGNob2tlIGEKK3JlYWwtd29ybGQgWE1MIHBhcnNlci4gU3BlY2lmaWNhbGx5LCB0aGUgb3V0cHV0IG9mIGEgcHJvcGVybHkKK2NvbnN0cnVjdGVkIHNvdXAgb2JqZWN0IHNob3VsZCBhbHdheXMgYmUgdmFsaWQgYXMgcGFydCBvZiBhbiBYTUwKK2RvY3VtZW50LCBidXQgcGFydHMgbWF5IGJlIG1pc3NpbmcgaWYgdGhleSB3ZXJlIG1pc3NpbmcgaW4gdGhlCitvcmlnaW5hbC4gQXMgYWx3YXlzLCBpZiB0aGUgaW5wdXQgaXMgdmFsaWQgWE1MLCB0aGUgb3V0cHV0IHdpbGwgYWxzbworYmUgdmFsaWQuCisKKz0gMy4wLjIgKDIwMDYwNjAyKSA9CisKK1ByZXZpb3VzbHksIEJlYXV0aWZ1bCBTb3VwIGNvcnJlY3RseSBoYW5kbGVkIGF0dHJpYnV0ZSB2YWx1ZXMgdGhhdAorY29udGFpbmVkIGVtYmVkZGVkIHF1b3RlcyAoc29tZXRpbWVzIGJ5IGVzY2FwaW5nKSwgYnV0IG5vdCBvdGhlciBraW5kcworb2YgWE1MIGNoYXJhY3Rlci4gTm93LCBpdCBjb3JyZWN0bHkgaGFuZGxlcyBvciBlc2NhcGVzIGFsbCBzcGVjaWFsIFhNTAorY2hhcmFjdGVycyBpbiBhdHRyaWJ1dGUgdmFsdWVzLgorCitJIGFsaWFzZWQgbWV0aG9kcyB0byB0aGUgMi54IG5hbWVzIChmZXRjaCwgZmluZCwgZmluZFRleHQsIGV0Yy4pIGZvcgorYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgcHVycG9zZXMuIFRob3NlIG5hbWVzIGFyZSBkZXByZWNhdGVkIGFuZCBpZiBJCitldmVyIGRvIGEgNC4wIEkgd2lsbCByZW1vdmUgdGhlbS4gSSB3aWxsLCBJIHRlbGwgeW91IQorCitGaXhlZCBhIGJ1ZyB3aGVyZSB0aGUgZmluZEFsbCBtZXRob2Qgd2Fzbid0IHBhc3NpbmcgYWxvbmcgYW55IGtleXdvcmQKK2FyZ3VtZW50cy4KKworV2hlbiBydW4gZnJvbSB0aGUgY29tbWFuZCBsaW5lLCBCZWF1dGlmdWwgU291cCBub3cgYWN0cyBhcyBhbiBIVE1MCitwcmV0dHktcHJpbnRlciwgbm90IGFuIFhNTCBwcmV0dHktcHJpbnRlci4KKworPSAzLjAuMSAoMjAwNjA1MzApID0KKworUmVpbnRyb2R1Y2VkIHRoZSAiZmV0Y2ggYnkgQ1NTIGNsYXNzIiBzaG9ydGN1dC4gSSB0aG91Z2h0IGtleXdvcmQKK2FyZ3VtZW50cyB3b3VsZCByZXBsYWNlIGl0LCBidXQgdGhleSBkb24ndC4gWW91IGNhbid0IGNhbGwgc291cCgnYScsCitjbGFzcz0nZm9vJykgYmVjYXVzZSBjbGFzcyBpcyBhIFB5dGhvbiBrZXl3b3JkLgorCitJZiBCZWF1dGlmdWwgU291cCBlbmNvdW50ZXJzIGEgbWV0YSB0YWcgdGhhdCBkZWNsYXJlcyB0aGUgZW5jb2RpbmcsCitidXQgYSBTb3VwU3RyYWluZXIgdGVsbHMgaXQgbm90IHRvIHBhcnNlIHRoYXQgdGFnLCBCZWF1dGlmdWwgU291cCB3aWxsCitubyBsb25nZXIgdHJ5IHRvIHJld3JpdGUgdGhlIG1ldGEgdGFnIHRvIG1lbnRpb24gdGhlIG5ldworZW5jb2RpbmcuIEJhc2ljYWxseSwgdGhpcyBtYWtlcyBTb3VwU3RyYWluZXJzIHdvcmsgaW4gcmVhbC13b3JsZAorYXBwbGljYXRpb25zIGluc3RlYWQgb2YgY3Jhc2hpbmcgdGhlIHBhcnNlci4KKworPSAzLjAuMCAiV2hvIHdvdWxkIG5vdCBnaXZlIGFsbCBlbHNlIGZvciB0d28gcCIgKDIwMDYwNTI4KSA9CisKK1RoaXMgcmVsZWFzZSBpcyBub3QgYmFja3dhcmQtY29tcGF0aWJsZSB3aXRoIHByZXZpb3VzIHJlbGVhc2VzLiBJZgoreW91J3ZlIGdvdCBjb2RlIHdyaXR0ZW4gd2l0aCBhIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIGdvCithaGVhZCBhbmQga2VlcCB1c2luZyBpdCwgdW5sZXNzIG9uZSBvZiB0aGUgZmVhdHVyZXMgbWVudGlvbmVkIGhlcmUKK3JlYWxseSBtYWtlcyB5b3VyIGxpZmUgZWFzaWVyLiBTaW5jZSB0aGUgbGlicmFyeSBpcyBzZWxmLWNvbnRhaW5lZCwKK3lvdSBjYW4gaW5jbHVkZSBhbiBvbGQgY29weSBvZiB0aGUgbGlicmFyeSBpbiB5b3VyIG9sZCBhcHBsaWNhdGlvbnMsCithbmQgdXNlIHRoZSBuZXcgdmVyc2lvbiBmb3IgZXZlcnl0aGluZyBlbHNlLgorCitUaGUgZG9jdW1lbnRhdGlvbiBoYXMgYmVlbiByZXdyaXR0ZW4gYW5kIGdyZWF0bHkgZXhwYW5kZWQgd2l0aCBtYW55Cittb3JlIGV4YW1wbGVzLgorCitCZWF1dGlmdWwgU291cCBhdXRvZGV0ZWN0cyB0aGUgZW5jb2Rpbmcgb2YgYSBkb2N1bWVudCAob3IgdXNlcyB0aGUgb25lCit5b3Ugc3BlY2lmeSksIGFuZCBjb252ZXJ0cyBpdCBmcm9tIGl0cyBuYXRpdmUgZW5jb2RpbmcgdG8KK1VuaWNvZGUuIEludGVybmFsbHksIGl0IG9ubHkgZGVhbHMgd2l0aCBVbmljb2RlIHN0cmluZ3MuIFdoZW4geW91CitwcmludCBvdXQgdGhlIGRvY3VtZW50LCBpdCBjb252ZXJ0cyB0byBVVEYtOCAob3IgYW5vdGhlciBlbmNvZGluZyB5b3UKK3NwZWNpZnkpLiBbRG9jIHJlZmVyZW5jZV0KKworSXQncyBub3cgZWFzeSB0byBtYWtlIGxhcmdlLXNjYWxlIGNoYW5nZXMgdG8gdGhlIHBhcnNlIHRyZWUgd2l0aG91dAorc2NyZXdpbmcgdXAgdGhlIG5hdmlnYXRpb24gbWVtYmVycy4gVGhlIG1ldGhvZHMgYXJlIGV4dHJhY3QsCityZXBsYWNlV2l0aCwgYW5kIGluc2VydC4gW0RvYyByZWZlcmVuY2UuIFNlZSBhbHNvIEltcHJvdmluZyBNZW1vcnkKK1VzYWdlIHdpdGggZXh0cmFjdF0KKworUGFzc2luZyBUcnVlIGluIGFzIGFuIGF0dHJpYnV0ZSB2YWx1ZSBnaXZlcyB5b3UgdGFncyB0aGF0IGhhdmUgYW55Cit2YWx1ZSBmb3IgdGhhdCBhdHRyaWJ1dGUuIFlvdSBkb24ndCBoYXZlIHRvIGNyZWF0ZSBhIHJlZ3VsYXIKK2V4cHJlc3Npb24uIFBhc3NpbmcgTm9uZSBmb3IgYW4gYXR0cmlidXRlIHZhbHVlIGdpdmVzIHlvdSB0YWdzIHRoYXQKK2Rvbid0IGhhdmUgdGhhdCBhdHRyaWJ1dGUgYXQgYWxsLgorCitUYWcgb2JqZWN0cyBub3cga25vdyB3aGV0aGVyIG9yIG5vdCB0aGV5J3JlIHNlbGYtY2xvc2luZy4gVGhpcyBhdm9pZHMKK3RoZSBwcm9ibGVtIHdoZXJlIEJlYXV0aWZ1bCBTb3VwIHRob3VnaHQgdGhhdCB0YWdzIGxpa2UgPEJSIC8+IHdlcmUKK3NlbGYtY2xvc2luZyBldmVuIGluIFhNTCBkb2N1bWVudHMuIFlvdSBjYW4gY3VzdG9taXplIHRoZSBzZWxmLWNsb3NpbmcKK3RhZ3MgZm9yIGEgcGFyc2VyIG9iamVjdCBieSBwYXNzaW5nIHRoZW0gaW4gYXMgYSBsaXN0IG9mCitzZWxmQ2xvc2luZ1RhZ3M6IHlvdSBkb24ndCBoYXZlIHRvIHN1YmNsYXNzIGFueW1vcmUuCisKK1RoZXJlJ3MgYSBuZXcgYnVpbHQtaW4gcGFyc2VyLCBNaW5pbWFsU291cCwgd2hpY2ggaGFzIG1vc3Qgb2YKK0JlYXV0aWZ1bFNvdXAncyBIVE1MLXNwZWNpZmljIHJ1bGVzLCBidXQgbm8gdGFnIG5lc3RpbmcgcnVsZXMuIFtEb2MKK3JlZmVyZW5jZV0KKworWW91IGNhbiB1c2UgYSBTb3VwU3RyYWluZXIgdG8gdGVsbCBCZWF1dGlmdWwgU291cCB0byBwYXJzZSBvbmx5IHBhcnQKK29mIGEgZG9jdW1lbnQuIFRoaXMgc2F2ZXMgdGltZSBhbmQgbWVtb3J5LCBvZnRlbiBtYWtpbmcgQmVhdXRpZnVsIFNvdXAKK2Fib3V0IGFzIGZhc3QgYXMgYSBjdXN0b20tYnVpbHQgU0dNTFBhcnNlciBzdWJjbGFzcy4gW0RvYyByZWZlcmVuY2UsCitTb3VwU3RyYWluZXIgcmVmZXJlbmNlXQorCitZb3UgY2FuICh1c3VhbGx5KSB1c2Uga2V5d29yZCBhcmd1bWVudHMgaW5zdGVhZCBvZiBwYXNzaW5nIGEKK2RpY3Rpb25hcnkgb2YgYXR0cmlidXRlcyB0byBhIHNlYXJjaCBtZXRob2QuIFRoYXQgaXMsIHlvdSBjYW4gcmVwbGFjZQorc291cChhcmdzPXsiaWQiIDogIjUifSkgd2l0aCBzb3VwKGlkPSI1IikuIFlvdSBjYW4gc3RpbGwgdXNlIGFyZ3MgaWYKKyhmb3IgaW5zdGFuY2UpIHlvdSBuZWVkIHRvIGZpbmQgYW4gYXR0cmlidXRlIHdob3NlIG5hbWUgY2xhc2hlcyB3aXRoCit0aGUgbmFtZSBvZiBhbiBhcmd1bWVudCB0byBmaW5kQWxsLiBbRG9jIHJlZmVyZW5jZTogKiprd2FyZ3MgYXR0cnNdCisKK1RoZSBtZXRob2QgbmFtZXMgaGF2ZSBjaGFuZ2VkIHRvIHRoZSBiZXR0ZXIgbWV0aG9kIG5hbWVzIHVzZWQgaW4KK1J1YnlmdWwgU291cC4gSW5zdGVhZCBvZiBmaW5kIG1ldGhvZHMgYW5kIGZldGNoIG1ldGhvZHMsIHRoZXJlIGFyZQorb25seSBmaW5kIG1ldGhvZHMuIEluc3RlYWQgb2YgYSBzY2hlbWUgd2hlcmUgeW91IGNhbid0IHJlbWVtYmVyIHdoaWNoCittZXRob2QgZmluZHMgb25lIGVsZW1lbnQgYW5kIHdoaWNoIG9uZSBmaW5kcyB0aGVtIGFsbCwgd2UgaGF2ZSBmaW5kCithbmQgZmluZEFsbC4gSW4gZ2VuZXJhbCwgaWYgdGhlIG1ldGhvZCBuYW1lIG1lbnRpb25zIEFsbCBvciBhIHBsdXJhbAorbm91biAoZWcuIGZpbmROZXh0U2libGluZ3MpLCB0aGVuIGl0IGZpbmRzIG1hbnkgZWxlbWVudHMKK21ldGhvZC4gT3RoZXJ3aXNlLCBpdCBvbmx5IGZpbmRzIG9uZSBlbGVtZW50LiBbRG9jIHJlZmVyZW5jZV0KKworU29tZSBvZiB0aGUgYXJndW1lbnQgbmFtZXMgaGF2ZSBiZWVuIHJlbmFtZWQgZm9yIGNsYXJpdHkuIEZvciBpbnN0YW5jZQorYXZvaWRQYXJzZXJQcm9ibGVtcyBpcyBub3cgcGFyc2VyTWFzc2FnZS4KKworQmVhdXRpZnVsIFNvdXAgbm8gbG9uZ2VyIGltcGxlbWVudHMgYSBmZWVkIG1ldGhvZC4gWW91IG5lZWQgdG8gcGFzcyBhCitzdHJpbmcgb3IgYSBmaWxlaGFuZGxlIGludG8gdGhlIHNvdXAgY29uc3RydWN0b3IsIG5vdCB3aXRoIGZlZWQgYWZ0ZXIKK3RoZSBzb3VwIGhhcyBiZWVuIGNyZWF0ZWQuIFRoZXJlIGlzIHN0aWxsIGEgZmVlZCBtZXRob2QsIGJ1dCBpdCdzIHRoZQorZmVlZCBtZXRob2QgaW1wbGVtZW50ZWQgYnkgU0dNTFBhcnNlciBhbmQgY2FsbGluZyBpdCB3aWxsIGJ5cGFzcworQmVhdXRpZnVsIFNvdXAgYW5kIGNhdXNlIHByb2JsZW1zLgorCitUaGUgTmF2aWdhYmxlVGV4dCBjbGFzcyBoYXMgYmVlbiByZW5hbWVkIHRvIE5hdmlnYWJsZVN0cmluZy4gVGhlcmUgaXMKK25vIE5hdmlnYWJsZVVuaWNvZGVTdHJpbmcgYW55bW9yZSwgYmVjYXVzZSBldmVyeSBzdHJpbmcgaW5zaWRlIGEKK0JlYXV0aWZ1bCBTb3VwIHBhcnNlIHRyZWUgaXMgYSBVbmljb2RlIHN0cmluZy4KKworZmluZFRleHQgYW5kIGZldGNoVGV4dCBhcmUgZ29uZS4gSnVzdCBwYXNzIGEgdGV4dCBhcmd1bWVudCBpbnRvIGZpbmQKK29yIGZpbmRBbGwuCisKK051bGwgd2FzIG1vcmUgdHJvdWJsZSB0aGFuIGl0IHdhcyB3b3J0aCwgc28gSSBnb3QgcmlkIG9mIGl0LiBBbnl0aGluZwordGhhdCB1c2VkIHRvIHJldHVybiBOdWxsIG5vdyByZXR1cm5zIE5vbmUuCisKK1NwZWNpYWwgWE1MIGNvbnN0cnVjdHMgbGlrZSBjb21tZW50cyBhbmQgQ0RBVEEgbm93IGhhdmUgdGhlaXIgb3duCitOYXZpZ2FibGVTdHJpbmcgc3ViY2xhc3NlcywgaW5zdGVhZCBvZiBiZWluZyB0cmVhdGVkIGFzIG9kZGx5LWZvcm1lZAorZGF0YS4gSWYgeW91IHBhcnNlIGEgZG9jdW1lbnQgdGhhdCBjb250YWlucyBDREFUQSBhbmQgd3JpdGUgaXQgYmFjaworb3V0LCB0aGUgQ0RBVEEgd2lsbCBzdGlsbCBiZSB0aGVyZS4KKworV2hlbiB5b3UncmUgcGFyc2luZyBhIGRvY3VtZW50LCB5b3UgY2FuIGdldCBCZWF1dGlmdWwgU291cCB0byBjb252ZXJ0CitYTUwgb3IgSFRNTCBlbnRpdGllcyBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIFVuaWNvZGUgY2hhcmFjdGVycy4gW0RvYworcmVmZXJlbmNlXQorCis9IDIuMS4xICgyMDA1MDkxOCkgPQorCitGaXhlZCBhIHNlcmlvdXMgcGVyZm9ybWFuY2UgYnVnIGluIEJlYXV0aWZ1bFN0b25lU291cCB3aGljaCB3YXMKK2NhdXNpbmcgcGFyc2luZyB0byBiZSBpbmNyZWRpYmx5IHNsb3cuCisKK0NvcnJlY3RlZCBzZXZlcmFsIGVudGl0aWVzIHRoYXQgd2VyZSBwcmV2aW91c2x5IGJlaW5nIGluY29ycmVjdGx5Cit0cmFuc2xhdGVkIGZyb20gTWljcm9zb2Z0IHNtYXJ0LXF1b3RlLWxpa2UgY2hhcmFjdGVycy4KKworRml4ZWQgYSBidWcgdGhhdCB3YXMgYnJlYWtpbmcgdGV4dCBmZXRjaC4KKworRml4ZWQgYSBidWcgdGhhdCBjcmFzaGVkIHRoZSBwYXJzZXIgd2hlbiB0ZXh0IGNodW5rcyB0aGF0IGxvb2sgbGlrZQorSFRNTCB0YWcgbmFtZXMgc2hvd2VkIHVwIHdpdGhpbiBhIFNDUklQVCB0YWcuCisKK1RIRUFELCBUQk9EWSwgYW5kIFRGT09UIHRhZ3MgYXJlIG5vdyBuZXN0YWJsZSB3aXRoaW4gVEFCTEUKK3RhZ3MuIE5lc3RlZCB0YWJsZXMgc2hvdWxkIHBhcnNlIG1vcmUgc2Vuc2libHkgbm93LgorCitCQVNFIGlzIG5vdyBjb25zaWRlcmVkIGEgc2VsZi1jbG9zaW5nIHRhZy4KKworPSAyLjEuMCAiR2FtZSwgb3IgYW55IG90aGVyIGRpc2g/IiAoMjAwNTA1MDQpID0KKworQWRkZWQgYSB3aWRlIHZhcmlldHkgb2YgbmV3IHNlYXJjaCBtZXRob2RzIHdoaWNoLCBnaXZlbiBhIHN0YXJ0aW5nCitwb2ludCBpbnNpZGUgdGhlIHRyZWUsIGZvbGxvdyBhIHBhcnRpY3VsYXIgbmF2aWdhdGlvbiBtZW1iZXIgKGxpa2UKK25leHRTaWJsaW5nKSBvdmVyIGFuZCBvdmVyIGFnYWluLCBsb29raW5nIGZvciBUYWcgYW5kIE5hdmlnYWJsZVRleHQKK29iamVjdHMgdGhhdCBtYXRjaCBjZXJ0YWluIGNyaXRlcmlhLiBUaGUgbmV3IG1ldGhvZHMgYXJlIGZpbmROZXh0LAorZmV0Y2hOZXh0LCBmaW5kUHJldmlvdXMsIGZldGNoUHJldmlvdXMsIGZpbmROZXh0U2libGluZywKK2ZldGNoTmV4dFNpYmxpbmdzLCBmaW5kUHJldmlvdXNTaWJsaW5nLCBmZXRjaFByZXZpb3VzU2libGluZ3MsCitmaW5kUGFyZW50LCBhbmQgZmV0Y2hQYXJlbnRzLiBBbGwgb2YgdGhlc2UgdXNlIHRoZSBzYW1lIGJhc2ljIGNvZGUKK3VzZWQgYnkgZmlyc3QgYW5kIGZldGNoLCBzbyB5b3UgY2FuIHBhc3MgeW91ciB3ZWlyZCB3YXlzIG9mIG1hdGNoaW5nCit0aGluZ3MgaW50byB0aGVzZSBtZXRob2RzLgorCitUaGUgZmV0Y2ggbWV0aG9kIGFuZCBpdHMgZGVyaXZhdGl2ZXMgbm93IGFjY2VwdCBhIGxpbWl0IGFyZ3VtZW50LgorCitZb3UgY2FuIG5vdyBwYXNzIGtleXdvcmQgYXJndW1lbnRzIHdoZW4gY2FsbGluZyBhIFRhZyBvYmplY3QgYXMgdGhvdWdoCitpdCB3ZXJlIGEgbWV0aG9kLgorCitGaXhlZCBhIGJ1ZyB0aGF0IGNhdXNlZCBhbGwgaGFuZC1jcmVhdGVkIHRhZ3MgdG8gc2hhcmUgYSBzaW5nbGUgc2V0IG9mCithdHRyaWJ1dGVzLgorCis9IDIuMC4zICgyMDA1MDUwMSkgPQorCitGaXhlZCBQeXRob24gMi4yIHN1cHBvcnQgZm9yIGl0ZXJhdG9ycy4KKworRml4ZWQgYSBidWcgdGhhdCBnYXZlIHRoZSB3cm9uZyByZXByZXNlbnRhdGlvbiB0byB0YWdzIHdpdGhpbiBxdW90ZQordGFncyBsaWtlIDxzY3JpcHQ+LgorCitUb29rIHNvbWUgY29kZSBmcm9tIE1hcmsgUGlsZ3JpbSB0aGF0IHRyZWF0cyBDREFUQSBkZWNsYXJhdGlvbnMgYXMKK2RhdGEgaW5zdGVhZCBvZiBpZ25vcmluZyB0aGVtLgorCitCZWF1dGlmdWwgU291cCdzIHNldHVwLnB5IHdpbGwgbm93IGRvIGFuIGluc3RhbGwgZXZlbiBpZiB0aGUgdW5pdAordGVzdHMgZmFpbC4gSXQgd29uJ3QgYnVpbGQgYSBzb3VyY2UgZGlzdHJpYnV0aW9uIGlmIHRoZSB1bml0IHRlc3RzCitmYWlsLCBzbyBJIGNhbid0IHJlbGVhc2UgYSBuZXcgdmVyc2lvbiB1bmxlc3MgdGhleSBwYXNzLgorCis9IDIuMC4yICgyMDA1MDQxNikgPQorCitBZGRlZCB0aGUgdW5pdCB0ZXN0cyBpbiBhIHNlcGFyYXRlIG1vZHVsZSwgYW5kIHBhY2thZ2VkIGl0IHdpdGgKK2Rpc3R1dGlscy4KKworRml4ZWQgYSBidWcgdGhhdCBzb21ldGltZXMgY2F1c2VkIHJlbmRlckNvbnRlbnRzKCkgdG8gcmV0dXJuIGEgVW5pY29kZQorc3RyaW5nIGV2ZW4gaWYgdGhlcmUgd2FzIG5vIFVuaWNvZGUgaW4gdGhlIG9yaWdpbmFsIHN0cmluZy4KKworQWRkZWQgdGhlIGRvbmUoKSBtZXRob2QsIHdoaWNoIGNsb3NlcyBhbGwgb2YgdGhlIHBhcnNlcidzIG9wZW4KK3RhZ3MuIEl0IGdldHMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB5b3UgcGFzcyBpbiBzb21lIHRleHQgdG8gdGhlCitjb25zdHJ1Y3RvciBvZiBhIHBhcnNlciBjbGFzczsgb3RoZXJ3aXNlIHlvdSBtdXN0IGNhbGwgaXQgeW91cnNlbGYuCisKK1JlaW5zdGF0ZWQgc29tZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIDEueCB2ZXJzaW9uczogcmVmZXJlbmNpbmcKK3RoZSBzdHJpbmcgbWVtYmVyIG9mIGEgTmF2aWdhYmxlVGV4dCBvYmplY3QgcmV0dXJucyB0aGUgTmF2aWdhYmxlVGV4dAorb2JqZWN0IGluc3RlYWQgb2YgdGhyb3dpbmcgYW4gZXJyb3IuCisKKz0gMi4wLjEgKDIwMDUwNDEyKSA9CisKK0ZpeGVkIGEgYnVnIHRoYXQgY2F1c2VkIGJhZCByZXN1bHRzIHdoZW4geW91IHRyaWVkIHRvIHJlZmVyZW5jZSBhIHRhZworbmFtZSBzaG9ydGVyIHRoYW4gMyBjaGFyYWN0ZXJzIGFzIGEgbWVtYmVyIG9mIGEgVGFnLCBlZy4gdGFnLnRhYmxlLnRkLgorCitNYWRlIHN1cmUgYWxsIFRhZ3MgaGF2ZSB0aGUgJ2hpZGRlbicgYXR0cmlidXRlIHNvIHRoYXQgYW4gYXR0ZW1wdCB0bworYWNjZXNzIHRhZy5oaWRkZW4gZG9lc24ndCBzcGF3biBhbiBhdHRlbXB0IHRvIGZpbmQgYSB0YWcgbmFtZWQKKydoaWRkZW4nLgorCitGaXhlZCBhIGJ1ZyBpbiB0aGUgY29tcGFyaXNvbiBvcGVyYXRvci4KKworPSAyLjAuMCAiV2hvIGNhcmVzIGZvciBmaXNoPyIgKDIwMDUwNDEwKQorCitCZWF1dGlmdWwgU291cCB2ZXJzaW9uIDEgd2FzIHZlcnkgdXNlZnVsIGJ1dCBhbHNvIHByZXR0eSBzdHVwaWQuIEkKK29yaWdpbmFsbHkgd3JvdGUgaXQgd2l0aG91dCBub3RpY2luZyBhbnkgb2YgdGhlIHByb2JsZW1zIGluaGVyZW50IGluCit0cnlpbmcgdG8gYnVpbGQgYSBwYXJzZSB0cmVlIG91dCBvZiBhbWJpZ3VvdXMgSFRNTCB0YWdzLiBUaGlzIHZlcnNpb24KK3NvbHZlcyBhbGwgb2YgdGhvc2UgcHJvYmxlbXMgdG8gbXkgc2F0aXNmYWN0aW9uLiBJdCBhbHNvIGFkZHMgbWFueSBuZXcKK2NsZXZlciB0aGluZ3MgdG8gbWFrZSB1cCBmb3IgdGhlIHJlbW92YWwgb2YgdGhlIHN0dXBpZCB0aGluZ3MuCisKKz09IFBhcnNpbmcgPT0KKworVGhlIHBhcnNlciBsb2dpYyBoYXMgYmVlbiBncmVhdGx5IGltcHJvdmVkLCBhbmQgdGhlIEJlYXV0aWZ1bFNvdXAKK2NsYXNzIHNob3VsZCBtdWNoIG1vcmUgcmVsaWFibHkgeWllbGQgYSBwYXJzZSB0cmVlIHRoYXQgbG9va3MgbGlrZQord2hhdCB0aGUgcGFnZSBhdXRob3IgaW50ZW5kZWQuIEZvciBhIHBhcnRpY3VsYXIgY2xhc3Mgb2Ygb2RkIGVkZ2UKK2Nhc2VzIHRoYXQgbm93IGNhdXNlcyBwcm9ibGVtcywgdGhlcmUgaXMgYSBuZXcgY2xhc3MsCitJQ2FudEJlbGlldmVJdHNCZWF1dGlmdWxTb3VwLgorCitCeSBkZWZhdWx0LCBCZWF1dGlmdWwgU291cCBub3cgcGVyZm9ybXMgc29tZSBjbGVhbnVwIG9wZXJhdGlvbnMgb24KK3RleHQgYmVmb3JlIHBhcnNpbmcgaXQuIFRoaXMgaXMgdG8gYXZvaWQgY29tbW9uIHByb2JsZW1zIHdpdGggYmFkCitkZWZpbml0aW9ucyBhbmQgc2VsZi1jbG9zaW5nIHRhZ3MgdGhhdCBjcmFzaCBTR01MUGFyc2VyLiBZb3UgY2FuCitwcm92aWRlIHlvdXIgb3duIHNldCBvZiBjbGVhbnVwIG9wZXJhdGlvbnMsIG9yIHR1cm4gaXQgb2ZmCithbHRvZ2V0aGVyLiBUaGUgY2xlYW51cCBvcGVyYXRpb25zIGluY2x1ZGUgZml4aW5nIHNlbGYtY2xvc2luZyB0YWdzCit0aGF0IGRvbid0IGNsb3NlLCBhbmQgcmVwbGFjaW5nIE1pY3Jvc29mdCBzbWFydCBxdW90ZXMgYW5kIHNpbWlsYXIKK2NoYXJhY3RlcnMgd2l0aCB0aGVpciBIVE1MIGVudGl0eSBlcXVpdmFsZW50cy4KKworWW91IGNhbiBub3cgZ2V0IGEgcHJldHR5LXByaW50IHZlcnNpb24gb2YgcGFyc2VkIEhUTUwgdG8gZ2V0IGEgdmlzdWFsCitwaWN0dXJlIG9mIGhvdyBCZWF1dGlmdWwgU291cCBwYXJzZXMgaXQsIHdpdGggdGhlIFRhZy5wcmV0dGlmeSgpCittZXRob2QuCisKKz09IFN0cmluZ3MgYW5kIFVuaWNvZGUgPT0KKworVGhlcmUgYXJlIHNlcGFyYXRlIE5hdmlnYWJsZVRleHQgc3ViY2xhc3NlcyBmb3IgQVNDSUkgYW5kIFVuaWNvZGUKK3N0cmluZ3MuIFRoZXNlIGNsYXNzZXMgZGlyZWN0bHkgc3ViY2xhc3MgdGhlIGNvcnJlc3BvbmRpbmcgYmFzZSBkYXRhCit0eXBlcy4gVGhpcyBtZWFucyB5b3UgY2FuIHRyZWF0IE5hdmlnYWJsZVRleHQgb2JqZWN0cyBhcyBzdHJpbmdzCitpbnN0ZWFkIG9mIGhhdmluZyB0byBjYWxsIG1ldGhvZHMgb24gdGhlbSB0byBnZXQgdGhlIHN0cmluZ3MuCisKK3N0cigpIG9uIGEgVGFnIGFsd2F5cyByZXR1cm5zIGEgc3RyaW5nLCBhbmQgdW5pY29kZSgpIGFsd2F5cyByZXR1cm5zCitVbmljb2RlLiBQcmV2aW91c2x5IGl0IHdhcyBpbmNvbnNpc3RlbnQuCisKKz09IFRyZWUgdHJhdmVyc2FsID09CisKK0luIGEgZmlyc3QoKSBvciBmZXRjaCgpIGNhbGwsIHRoZSB0YWcgbmFtZSBvciB0aGUgZGVzaXJlZCB2YWx1ZSBvZiBhbgorYXR0cmlidXRlIGNhbiBub3cgYmUgYW55IG9mIHRoZSBmb2xsb3dpbmc6CisKKyAqIEEgc3RyaW5nIChtYXRjaGVzIHRoYXQgc3BlY2lmaWMgdGFnIG9yIHRoYXQgc3BlY2lmaWMgYXR0cmlidXRlIHZhbHVlKQorICogQSBsaXN0IG9mIHN0cmluZ3MgKG1hdGNoZXMgYW55IHRhZyBvciBhdHRyaWJ1dGUgdmFsdWUgaW4gdGhlIGxpc3QpCisgKiBBIGNvbXBpbGVkIHJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3QgKG1hdGNoZXMgYW55IHRhZyBvciBhdHRyaWJ1dGUKKyAgIHZhbHVlIHRoYXQgbWF0Y2hlcyB0aGUgcmVndWxhciBleHByZXNzaW9uKQorICogQSBjYWxsYWJsZSBvYmplY3QgdGhhdCB0YWtlcyB0aGUgVGFnIG9iamVjdCBvciBhdHRyaWJ1dGUgdmFsdWUgYXMgYQorICAgc3RyaW5nLiBJdCByZXR1cm5zIE5vbmUvZmFsc2UvZW1wdHkgc3RyaW5nIGlmIHRoZSBnaXZlbiBzdHJpbmcKKyAgIGRvZXNuJ3QgbWF0Y2gsIGFuZCBhbnkgb3RoZXIgdmFsdWUgaWYgaXQgZG9lcy4KKworVGhpcyBpcyBtdWNoIGVhc2llciB0byB1c2UgdGhhbiBTUUwtc3R5bGUgd2lsZGNhcmRzIChzZWUsIHJlZ3VsYXIKK2V4cHJlc3Npb25zIGFyZSBnb29kIGZvciBzb21ldGhpbmcpLiBCZWNhdXNlIG9mIHRoaXMsIEkgdG9vayBvdXQKK1NRTC1zdHlsZSB3aWxkY2FyZHMuIEknbGwgcHV0IHRoZW0gYmFjayBpZiBzb21lb25lIGNvbXBsYWlucywgYnV0Cit0aGVpciByZW1vdmFsIHNpbXBsaWZpZXMgdGhlIGNvZGUgYSBsb3QuCisKK1lvdSBjYW4gdXNlIGZldGNoKCkgYW5kIGZpcnN0KCkgdG8gc2VhcmNoIGZvciB0ZXh0IGluIHRoZSBwYXJzZSB0cmVlLAorbm90IGp1c3QgdGFncy4gVGhlcmUgYXJlIG5ldyBhbGlhcyBtZXRob2RzIGZldGNoVGV4dCgpIGFuZCBmaXJzdFRleHQoKQorZGVzaWduZWQgZm9yIHRoaXMgcHVycG9zZS4gQXMgd2l0aCBzZWFyY2hpbmcgZm9yIHRhZ3MsIHlvdSBjYW4gcGFzcyBpbgorYSBzdHJpbmcsIGEgcmVndWxhciBleHByZXNzaW9uIG9iamVjdCwgb3IgYSBtZXRob2QgdG8gbWF0Y2ggeW91ciB0ZXh0LgorCitJZiB5b3UgcGFzcyBpbiBzb21ldGhpbmcgYmVzaWRlcyBhIG1hcCB0byB0aGUgYXR0cnMgYXJndW1lbnQgb2YKK2ZldGNoKCkgb3IgZmlyc3QoKSwgQmVhdXRpZnVsIFNvdXAgd2lsbCBhc3N1bWUgeW91IHdhbnQgdG8gbWF0Y2ggdGhhdAordGhpbmcgYWdhaW5zdCB0aGUgImNsYXNzIiBhdHRyaWJ1dGUuIFdoZW4geW91J3JlIHNjcmFwaW5nCit3ZWxsLXN0cnVjdHVyZWQgSFRNTCwgdGhpcyBtYWtlcyB5b3VyIGNvZGUgYSBsb3QgY2xlYW5lci4KKworMS54IGFuZCAyLnggYm90aCBsZXQgeW91IGNhbGwgYSBUYWcgb2JqZWN0IGFzIGEgc2hvcnRoYW5kIGZvcgorZmV0Y2goKS4gRm9yIGluc3RhbmNlLCBmb28oImJhciIpIGlzIGEgc2hvcnRoYW5kIGZvcgorZm9vLmZldGNoKCJiYXIiKS4gSW4gMi54LCB5b3UgY2FuIGFsc28gYWNjZXNzIGEgc3BlY2lhbGx5LW5hbWVkIG1lbWJlcgorb2YgYSBUYWcgb2JqZWN0IGFzIGEgc2hvcnRoYW5kIGZvciBmaXJzdCgpLiBGb3IgaW5zdGFuY2UsIGZvby5iYXJUYWcKK2lzIGEgc2hvcnRoYW5kIGZvciBmb28uZmlyc3QoImJhciIpLiBCeSBjaGFpbmluZyB0aGVzZSBzaG9ydGN1dHMgeW91Cit0cmF2ZXJzZSBhIHRyZWUgaW4gdmVyeSBsaXR0bGUgY29kZTogZm9yIGhlYWRlciBpbgorc291cC5ib2R5VGFnLnBUYWcudGFibGVUYWcoJ3RoJyk6CisKK0lmIGFuIGVsZW1lbnQgcmVsYXRpb25zaGlwIChsaWtlIHBhcmVudCBvciBuZXh0KSBkb2Vzbid0IGFwcGx5IHRvIGEKK3RhZywgaXQnbGwgbm93IHNob3cgdXAgTnVsbCBpbnN0ZWFkIG9mIE5vbmUuIGZpcnN0KCkgd2lsbCBhbHNvIHJldHVybgorTnVsbCBpZiB5b3UgYXNrIGl0IGZvciBhIG5vbmV4aXN0ZW50IHRhZy4gTnVsbCBpcyBhbiBvYmplY3QgdGhhdCdzCitqdXN0IGxpa2UgTm9uZSwgZXhjZXB0IHlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgdG8gaXQgYW5kIGl0J2xsCitnaXZlIHlvdSBOdWxsIGluc3RlYWQgb2YgdGhyb3dpbmcgYW4gZXJyb3IuCisKK1RoaXMgbGV0cyB5b3UgZG8gdHJlZSB0cmF2ZXJzYWxzIGxpa2Ugc291cC5odG1sVGFnLmhlYWRUYWcudGl0bGVUYWcKK3dpdGhvdXQgaGF2aW5nIHRvIHdvcnJ5IGlmIHRoZSBpbnRlcm1lZGlhdGUgc3RhZ2VzIGFyZSBhY3R1YWxseQordGhlcmUuIFByZXZpb3VzbHksIGlmIHRoZXJlIHdhcyBubyAnaGVhZCcgdGFnIGluIHRoZSBkb2N1bWVudCwgaGVhZFRhZworaW4gdGhhdCBpbnN0YW5jZSB3b3VsZCBoYXZlIGJlZW4gTm9uZSwgYW5kIGFjY2Vzc2luZyBpdHMgJ3RpdGxlVGFnJworbWVtYmVyIHdvdWxkIGhhdmUgdGhyb3duIGFuIEF0dHJpYnV0ZUVycm9yLiBOb3csIHlvdSBjYW4gZ2V0IHdoYXQgeW91Cit3YW50IHdoZW4gaXQgZXhpc3RzLCBhbmQgZ2V0IE51bGwgd2hlbiBpdCBkb2Vzbid0LCB3aXRob3V0IGhhdmluZyB0bworZG8gYSBsb3Qgb2YgY29uZGl0aW9uYWxzIGNoZWNraW5nIHRvIHNlZSBpZiBldmVyeSBzdGFnZSBpcyBOb25lLgorCitUaGVyZSBhcmUgdHdvIG5ldyByZWxhdGlvbnMgYmV0d2VlbiBwYWdlIGVsZW1lbnRzOiBwcmV2aW91c1NpYmxpbmcgYW5kCituZXh0U2libGluZy4gVGhleSByZWZlcmVuY2UgdGhlIHByZXZpb3VzIGFuZCBuZXh0IGVsZW1lbnQgYXQgdGhlIHNhbWUKK2xldmVsIG9mIHRoZSBwYXJzZSB0cmVlLiBGb3IgaW5zdGFuY2UsIGlmIHlvdSBoYXZlIEhUTUwgbGlrZSB0aGlzOgorCisgIDxwPjx1bD48bGk+Rm9vPGJyIC8+PGxpPkJhcjwvdWw+CisKK1RoZSBmaXJzdCAnbGknIHRhZyBoYXMgYSBwcmV2aW91c1NpYmxpbmcgb2YgTnVsbCBhbmQgaXRzIG5leHRTaWJsaW5nCitpcyB0aGUgc2Vjb25kICdsaScgdGFnLiBUaGUgc2Vjb25kICdsaScgdGFnIGhhcyBhIG5leHRTaWJsaW5nIG9mIE51bGwKK2FuZCBpdHMgcHJldmlvdXNTaWJsaW5nIGlzIHRoZSBmaXJzdCAnbGknIHRhZy4gVGhlIHByZXZpb3VzU2libGluZyBvZgordGhlICd1bCcgdGFnIGlzIHRoZSBmaXJzdCAncCcgdGFnLiBUaGUgbmV4dFNpYmxpbmcgb2YgJ0ZvbycgaXMgdGhlCisnYnInIHRhZy4KKworSSB0b29rIG91dCB0aGUgYWJpbGl0eSB0byB1c2UgZmV0Y2goKSB0byBmaW5kIHRhZ3MgdGhhdCBoYXZlIGEKK3NwZWNpZmljIGxpc3Qgb2YgY29udGVudHMuIFNlZSwgSSBjYW4ndCBldmVuIGV4cGxhaW4gaXQgd2VsbC4gSXQgd2FzCityZWFsbHkgZGlmZmljdWx0IHRvIHVzZSwgSSBuZXZlciB1c2VkIGl0LCBhbmQgSSBkb24ndCB0aGluayBhbnlvbmUKK2Vsc2UgZXZlciB1c2VkIGl0LiBUbyB0aGUgZXh0ZW50IGFueW9uZSBkaWQsIHRoZXkgY2FuIHByb2JhYmx5IHVzZQorZmV0Y2hUZXh0KCkgaW5zdGVhZC4gSWYgaXQgdHVybnMgb3V0IHNvbWVvbmUgbmVlZHMgaXQgSSdsbCB0aGluayBvZgorYW5vdGhlciBzb2x1dGlvbi4KKworPT0gVHJlZSBtYW5pcHVsYXRpb24gPT0KKworWW91IGNhbiBhZGQgbmV3IGF0dHJpYnV0ZXMgdG8gYSB0YWcsIGFuZCBkZWxldGUgYXR0cmlidXRlcyBmcm9tIGEKK3RhZy4gSW4gMS54IHlvdSBjb3VsZCBvbmx5IGNoYW5nZSBhIHRhZydzIGV4aXN0aW5nIGF0dHJpYnV0ZXMuCisKKz09IFBvcnRpbmcgQ29uc2lkZXJhdGlvbnMgPT0KKworVGhlcmUgYXJlIHRocmVlIGNoYW5nZXMgaW4gMi4wIHRoYXQgYnJlYWsgb2xkIGNvZGU6CisKK0luIHRoZSBwb3N0LTEuMiByZWxlYXNlIHlvdSBjb3VsZCBwYXNzIGluIGEgZnVuY3Rpb24gaW50byBmZXRjaCgpLiBUaGUKK2Z1bmN0aW9uIHRvb2sgYSBzdHJpbmcsIHRoZSB0YWcgbmFtZS4gSW4gMi4wLCB0aGUgZnVuY3Rpb24gdGFrZXMgdGhlCithY3R1YWwgVGFnIG9iamVjdC4KKworSXQncyBubyBsb25nZXIgdG8gcGFzcyBpbiBTUUwtc3R5bGUgd2lsZGNhcmRzIHRvIGZldGNoKCkuIFVzZSBhCityZWd1bGFyIGV4cHJlc3Npb24gaW5zdGVhZC4KKworVGhlIGRpZmZlcmVudCBwYXJzaW5nIGFsZ29yaXRobSBtZWFucyB0aGUgcGFyc2UgdHJlZSBtYXkgbm90IGJlIHNoYXBlZAorbGlrZSB5b3UgZXhwZWN0LiBUaGlzIHdpbGwgb25seSBhY3R1YWxseSBhZmZlY3QgeW91IGlmIHlvdXIgY29kZSB1c2VzCitvbmUgb2YgdGhlIGFmZmVjdGVkIHBhcnRzLiBJIGhhdmVuJ3QgcnVuIGludG8gdGhpcyBwcm9ibGVtIHlldCB3aGlsZQorcG9ydGluZyBteSBjb2RlLgorCis9IEJldHdlZW4gMS4yIGFuZCAyLjAgPQorCitUaGlzIGlzIHRoZSByZWxlYXNlIHRvIGdldCBpZiB5b3Ugd2FudCBQeXRob24gMS41IGNvbXBhdGliaWxpdHkuCisKK1RoZSBkZXNpcmVkIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZSBjYW4gbm93IGJlIGFueSBvZiB0aGUgZm9sbG93aW5nOgorCisgKiBBIHN0cmluZworICogQSBzdHJpbmcgd2l0aCBTUUwtc3R5bGUgd2lsZGNhcmRzCisgKiBBIGNvbXBpbGVkIFJFIG9iamVjdAorICogQSBjYWxsYWJsZSB0aGF0IHJldHVybnMgTm9uZS9mYWxzZS9lbXB0eSBzdHJpbmcgaWYgdGhlIGdpdmVuIHZhbHVlCisgICBkb2Vzbid0IG1hdGNoLCBhbmQgYW55IG90aGVyIHZhbHVlIG90aGVyd2lzZS4KKworVGhpcyBpcyBtdWNoIGVhc2llciB0byB1c2UgdGhhbiBTUUwtc3R5bGUgd2lsZGNhcmRzIChzZWUsIHJlZ3VsYXIKK2V4cHJlc3Npb25zIGFyZSBnb29kIGZvciBzb21ldGhpbmcpLiBCZWNhdXNlIG9mIHRoaXMsIEkgbm8gbG9uZ2VyCityZWNvbW1lbmQgeW91IHVzZSBTUUwtc3R5bGUgd2lsZGNhcmRzLiBUaGV5IG1heSBnbyBhd2F5IGluIGEgZnV0dXJlCityZWxlYXNlIHRvIGNsZWFuIHVwIHRoZSBjb2RlLgorCitNYWRlIEJlYXV0aWZ1bCBTb3VwIGhhbmRsZSBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyBhcyB0ZXh0IGluc3RlYWQgb2YKK2lnbm9yaW5nIHRoZW0uCisKK0FwcGxpZWQgcGF0Y2ggZnJvbSBSaWNoaWUgSGluZGxlIChyaWNoaWUgYXQgZW50cmlhbiBkb3QgY29tKSB0aGF0CittYWtlcyB0YWcuc3RyaW5nIGEgc2hvcnRoYW5kIGZvciB0YWcuY29udGVudHNbMF0uc3RyaW5nIHdoZW4gdGhlIHRhZworaGFzIG9ubHkgb25lIHN0cmluZy1vd25pbmcgY2hpbGQuCisKK0FkZGVkIHN0aWxsIG1vcmUgbmVzdGFibGUgdGFncy4gVGhlIG5lc3RhYmxlIHRhZ3MgdGhpbmcgd29uJ3Qgd29yayBpbgorYSBsb3Qgb2YgY2FzZXMgYW5kIG5lZWRzIHRvIGJlIHJldGhvdWdodC4KKworRml4ZWQgYW4gZWRnZSBjYXNlIHdoZXJlIHNlYXJjaGluZyBmb3IgIiVmb28iIHdvdWxkIG1hdGNoIGFueSBzdHJpbmcKK3Nob3J0ZXIgdGhhbiAiZm9vIi4KKworPSAxLjIgIldobyBmb3Igc3VjaCBkYWludGllcyB3b3VsZCBub3Qgc3Rvb3A/IiAoMjAwNDA3MDgpID0KKworQXBwbGllZCBwYXRjaCBmcm9tIEJlbiBMYXN0IChiZW4gYXQgYmVubGFzdCBkb3QgY29tKSB0aGF0IG1hZGUKK1RhZy5yZW5kZXJDb250ZW50cygpIGNvcnJlY3RseSBoYW5kbGUgVW5pY29kZS4KKworTWFkZSBCZWF1dGlmdWxTdG9uZVNvdXAgZXZlbiBkdW1iZXIgYnkgbWFraW5nIGl0IG5vdCBpbXBsaWNpdGx5IGNsb3NlCithIHRhZyB3aGVuIGFub3RoZXIgdGFnIG9mIHRoZSBzYW1lIHR5cGUgaXMgZW5jb3VudGVyZWQ7IG9ubHkgd2hlbiBhbgorYWN0dWFsIGNsb3NpbmcgdGFnIGlzIGVuY291bnRlcmVkLiBUaGlzIGNoYW5nZSBjb3VydGVzeSBvZiBGdXp6eSAobWlrZQorYXQgcGNibG9rZXMgZG90IGNvbSkuIEJlYXV0aWZ1bFNvdXAgc3RpbGwgd29ya3MgYXMgYmVmb3JlLgorCis9IDEuMSAiU3dpbW1pbmcgaW4gYSBob3QgdHVyZWVuIiA9CisKK0FkZGVkIG1vcmUgJ25lc3RhYmxlJyB0YWdzLiBDaGFuZ2VkIHBvcHBpbmcgc2VtYW50aWNzIHNvIHRoYXQgd2hlbiBhCituZXN0YWJsZSB0YWcgaXMgZW5jb3VudGVyZWQsIHRhZ3MgYXJlIHBvcHBlZCB1cCB0byB0aGUgcHJldmlvdXNseQorZW5jb3VudGVyZWQgbmVzdGFibGUgdGFnIChvZiB3aGF0ZXZlciBraW5kKS4gSSB3aWxsIHJldmVydCB0aGlzIGlmCitlbm91Z2ggcGVvcGxlIGNvbXBsYWluLCBidXQgaXQgc2hvdWxkIG1ha2UgbW9yZSBwZW9wbGUncyBsaXZlcyBlYXNpZXIKK3RoYW4gaGFyZGVyLiBUaGlzIGVuaGFuY2VtZW50IHdhcyBzdWdnZXN0ZWQgYnkgQW50aG9ueSBCYXh0ZXIgKGFudGhvbnkKK2F0IGludGVybGluayBkb3QgY29tIGRvdCBhdSkuCisKKz0gMS4wICJTbyByaWNoIGFuZCBncmVlbiIgKDIwMDQwNDIwKSA9CisKK0luaXRpYWwgcmVsZWFzZS4KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JzNC9fX2luaXRfXy5weSBiL2JpdGJha2UvbGliL2JzNC9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmEzNDI2Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYnM0L19faW5pdF9fLnB5CkBAIC0wLDAgKzEsNDA2IEBACisiIiJCZWF1dGlmdWwgU291cAorRWxpeGlyIGFuZCBUb25pYworIlRoZSBTY3JlZW4tU2NyYXBlcidzIEZyaWVuZCIKK2h0dHA6Ly93d3cuY3J1bW15LmNvbS9zb2Z0d2FyZS9CZWF1dGlmdWxTb3VwLworCitCZWF1dGlmdWwgU291cCB1c2VzIGEgcGx1Z2dhYmxlIFhNTCBvciBIVE1MIHBhcnNlciB0byBwYXJzZSBhCisocG9zc2libHkgaW52YWxpZCkgZG9jdW1lbnQgaW50byBhIHRyZWUgcmVwcmVzZW50YXRpb24uIEJlYXV0aWZ1bCBTb3VwCitwcm92aWRlcyBwcm92aWRlcyBtZXRob2RzIGFuZCBQeXRob25pYyBpZGlvbXMgdGhhdCBtYWtlIGl0IGVhc3kgdG8KK25hdmlnYXRlLCBzZWFyY2gsIGFuZCBtb2RpZnkgdGhlIHBhcnNlIHRyZWUuCisKK0JlYXV0aWZ1bCBTb3VwIHdvcmtzIHdpdGggUHl0aG9uIDIuNiBhbmQgdXAuIEl0IHdvcmtzIGJldHRlciBpZiBseG1sCithbmQvb3IgaHRtbDVsaWIgaXMgaW5zdGFsbGVkLgorCitGb3IgbW9yZSB0aGFuIHlvdSBldmVyIHdhbnRlZCB0byBrbm93IGFib3V0IEJlYXV0aWZ1bCBTb3VwLCBzZWUgdGhlCitkb2N1bWVudGF0aW9uOgoraHR0cDovL3d3dy5jcnVtbXkuY29tL3NvZnR3YXJlL0JlYXV0aWZ1bFNvdXAvYnM0L2RvYy8KKyIiIgorCitfX2F1dGhvcl9fID0gIkxlb25hcmQgUmljaGFyZHNvbiAobGVvbmFyZHJAc2VnZmF1bHQub3JnKSIKK19fdmVyc2lvbl9fID0gIjQuMy4yIgorX19jb3B5cmlnaHRfXyA9ICJDb3B5cmlnaHQgKGMpIDIwMDQtMjAxMyBMZW9uYXJkIFJpY2hhcmRzb24iCitfX2xpY2Vuc2VfXyA9ICJNSVQiCisKK19fYWxsX18gPSBbJ0JlYXV0aWZ1bFNvdXAnXQorCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHdhcm5pbmdzCisKK2Zyb20gLmJ1aWxkZXIgaW1wb3J0IGJ1aWxkZXJfcmVnaXN0cnksIFBhcnNlclJlamVjdGVkTWFya3VwCitmcm9tIC5kYW1taXQgaW1wb3J0IFVuaWNvZGVEYW1taXQKK2Zyb20gLmVsZW1lbnQgaW1wb3J0ICgKKyAgICBDRGF0YSwKKyAgICBDb21tZW50LAorICAgIERFRkFVTFRfT1VUUFVUX0VOQ09ESU5HLAorICAgIERlY2xhcmF0aW9uLAorICAgIERvY3R5cGUsCisgICAgTmF2aWdhYmxlU3RyaW5nLAorICAgIFBhZ2VFbGVtZW50LAorICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiwKKyAgICBSZXN1bHRTZXQsCisgICAgU291cFN0cmFpbmVyLAorICAgIFRhZywKKyAgICApCisKKyMgVGhlIHZlcnkgZmlyc3QgdGhpbmcgd2UgZG8gaXMgZ2l2ZSBhIHVzZWZ1bCBlcnJvciBpZiBzb21lb25lIGlzCisjIHJ1bm5pbmcgdGhpcyBjb2RlIHVuZGVyIFB5dGhvbiAzIHdpdGhvdXQgY29udmVydGluZyBpdC4KK3N5bnRheF9lcnJvciA9IHUnWW91IGFyZSB0cnlpbmcgdG8gcnVuIHRoZSBQeXRob24gMiB2ZXJzaW9uIG9mIEJlYXV0aWZ1bCBTb3VwIHVuZGVyIFB5dGhvbiAzLiBUaGlzIHdpbGwgbm90IHdvcmsuIFlvdSBuZWVkIHRvIGNvbnZlcnQgdGhlIGNvZGUsIGVpdGhlciBieSBpbnN0YWxsaW5nIGl0IChgcHl0aG9uIHNldHVwLnB5IGluc3RhbGxgKSBvciBieSBydW5uaW5nIDJ0bzMgKGAydG8zIC13IGJzNGApLicKKworY2xhc3MgQmVhdXRpZnVsU291cChUYWcpOgorICAgICIiIgorICAgIFRoaXMgY2xhc3MgZGVmaW5lcyB0aGUgYmFzaWMgaW50ZXJmYWNlIGNhbGxlZCBieSB0aGUgdHJlZSBidWlsZGVycy4KKworICAgIFRoZXNlIG1ldGhvZHMgd2lsbCBiZSBjYWxsZWQgYnkgdGhlIHBhcnNlcjoKKyAgICAgIHJlc2V0KCkKKyAgICAgIGZlZWQobWFya3VwKQorCisgICAgVGhlIHRyZWUgYnVpbGRlciBtYXkgY2FsbCB0aGVzZSBtZXRob2RzIGZyb20gaXRzIGZlZWQoKSBpbXBsZW1lbnRhdGlvbjoKKyAgICAgIGhhbmRsZV9zdGFydHRhZyhuYW1lLCBhdHRycykgIyBTZWUgbm90ZSBhYm91dCByZXR1cm4gdmFsdWUKKyAgICAgIGhhbmRsZV9lbmR0YWcobmFtZSkKKyAgICAgIGhhbmRsZV9kYXRhKGRhdGEpICMgQXBwZW5kcyB0byB0aGUgY3VycmVudCBkYXRhIG5vZGUKKyAgICAgIGVuZERhdGEoY29udGFpbmVyQ2xhc3M9TmF2aWdhYmxlU3RyaW5nKSAjIEVuZHMgdGhlIGN1cnJlbnQgZGF0YSBub2RlCisKKyAgICBObyBtYXR0ZXIgaG93IGNvbXBsaWNhdGVkIHRoZSB1bmRlcmx5aW5nIHBhcnNlciBpcywgeW91IHNob3VsZCBiZQorICAgIGFibGUgdG8gYnVpbGQgYSB0cmVlIHVzaW5nICdzdGFydCB0YWcnIGV2ZW50cywgJ2VuZCB0YWcnIGV2ZW50cywKKyAgICAnZGF0YScgZXZlbnRzLCBhbmQgImRvbmUgd2l0aCBkYXRhIiBldmVudHMuCisKKyAgICBJZiB5b3UgZW5jb3VudGVyIGFuIGVtcHR5LWVsZW1lbnQgdGFnIChha2EgYSBzZWxmLWNsb3NpbmcgdGFnLAorICAgIGxpa2UgSFRNTCdzIDxicj4gdGFnKSwgY2FsbCBoYW5kbGVfc3RhcnR0YWcgYW5kIHRoZW4KKyAgICBoYW5kbGVfZW5kdGFnLgorICAgICIiIgorICAgIFJPT1RfVEFHX05BTUUgPSB1J1tkb2N1bWVudF0nCisKKyAgICAjIElmIHRoZSBlbmQtdXNlciBnaXZlcyBubyBpbmRpY2F0aW9uIHdoaWNoIHRyZWUgYnVpbGRlciB0aGV5CisgICAgIyB3YW50LCBsb29rIGZvciBvbmUgd2l0aCB0aGVzZSBmZWF0dXJlcy4KKyAgICBERUZBVUxUX0JVSUxERVJfRkVBVFVSRVMgPSBbJ2h0bWwnLCAnZmFzdCddCisKKyAgICBBU0NJSV9TUEFDRVMgPSAnXHgyMFx4MGFceDA5XHgwY1x4MGQnCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFya3VwPSIiLCBmZWF0dXJlcz1Ob25lLCBidWlsZGVyPU5vbmUsCisgICAgICAgICAgICAgICAgIHBhcnNlX29ubHk9Tm9uZSwgZnJvbV9lbmNvZGluZz1Ob25lLCAqKmt3YXJncyk6CisgICAgICAgICIiIlRoZSBTb3VwIG9iamVjdCBpcyBpbml0aWFsaXplZCBhcyB0aGUgJ3Jvb3QgdGFnJywgYW5kIHRoZQorICAgICAgICBwcm92aWRlZCBtYXJrdXAgKHdoaWNoIGNhbiBiZSBhIHN0cmluZyBvciBhIGZpbGUtbGlrZSBvYmplY3QpCisgICAgICAgIGlzIGZlZCBpbnRvIHRoZSB1bmRlcmx5aW5nIHBhcnNlci4iIiIKKworICAgICAgICBpZiAnY29udmVydEVudGl0aWVzJyBpbiBrd2FyZ3M6CisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgICAgICJCUzQgZG9lcyBub3QgcmVzcGVjdCB0aGUgY29udmVydEVudGl0aWVzIGFyZ3VtZW50IHRvIHRoZSAiCisgICAgICAgICAgICAgICAgIkJlYXV0aWZ1bFNvdXAgY29uc3RydWN0b3IuIEVudGl0aWVzIGFyZSBhbHdheXMgY29udmVydGVkICIKKyAgICAgICAgICAgICAgICAidG8gVW5pY29kZSBjaGFyYWN0ZXJzLiIpCisKKyAgICAgICAgaWYgJ21hcmt1cE1hc3NhZ2UnIGluIGt3YXJnczoKKyAgICAgICAgICAgIGRlbCBrd2FyZ3NbJ21hcmt1cE1hc3NhZ2UnXQorICAgICAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICAgICAiQlM0IGRvZXMgbm90IHJlc3BlY3QgdGhlIG1hcmt1cE1hc3NhZ2UgYXJndW1lbnQgdG8gdGhlICIKKyAgICAgICAgICAgICAgICAiQmVhdXRpZnVsU291cCBjb25zdHJ1Y3Rvci4gVGhlIHRyZWUgYnVpbGRlciBpcyByZXNwb25zaWJsZSAiCisgICAgICAgICAgICAgICAgImZvciBhbnkgbmVjZXNzYXJ5IG1hcmt1cCBtYXNzYWdlLiIpCisKKyAgICAgICAgaWYgJ3NtYXJ0UXVvdGVzVG8nIGluIGt3YXJnczoKKyAgICAgICAgICAgIGRlbCBrd2FyZ3NbJ3NtYXJ0UXVvdGVzVG8nXQorICAgICAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICAgICAiQlM0IGRvZXMgbm90IHJlc3BlY3QgdGhlIHNtYXJ0UXVvdGVzVG8gYXJndW1lbnQgdG8gdGhlICIKKyAgICAgICAgICAgICAgICAiQmVhdXRpZnVsU291cCBjb25zdHJ1Y3Rvci4gU21hcnQgcXVvdGVzIGFyZSBhbHdheXMgY29udmVydGVkICIKKyAgICAgICAgICAgICAgICAidG8gVW5pY29kZSBjaGFyYWN0ZXJzLiIpCisKKyAgICAgICAgaWYgJ3NlbGZDbG9zaW5nVGFncycgaW4ga3dhcmdzOgorICAgICAgICAgICAgZGVsIGt3YXJnc1snc2VsZkNsb3NpbmdUYWdzJ10KKyAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAgICAgIkJTNCBkb2VzIG5vdCByZXNwZWN0IHRoZSBzZWxmQ2xvc2luZ1RhZ3MgYXJndW1lbnQgdG8gdGhlICIKKyAgICAgICAgICAgICAgICAiQmVhdXRpZnVsU291cCBjb25zdHJ1Y3Rvci4gVGhlIHRyZWUgYnVpbGRlciBpcyByZXNwb25zaWJsZSAiCisgICAgICAgICAgICAgICAgImZvciB1bmRlcnN0YW5kaW5nIHNlbGYtY2xvc2luZyB0YWdzLiIpCisKKyAgICAgICAgaWYgJ2lzSFRNTCcgaW4ga3dhcmdzOgorICAgICAgICAgICAgZGVsIGt3YXJnc1snaXNIVE1MJ10KKyAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAgICAgIkJTNCBkb2VzIG5vdCByZXNwZWN0IHRoZSBpc0hUTUwgYXJndW1lbnQgdG8gdGhlICIKKyAgICAgICAgICAgICAgICAiQmVhdXRpZnVsU291cCBjb25zdHJ1Y3Rvci4gWW91IGNhbiBwYXNzIGluIGZlYXR1cmVzPSdodG1sJyAiCisgICAgICAgICAgICAgICAgIm9yIGZlYXR1cmVzPSd4bWwnIHRvIGdldCBhIGJ1aWxkZXIgY2FwYWJsZSBvZiBoYW5kbGluZyAiCisgICAgICAgICAgICAgICAgIm9uZSBvciB0aGUgb3RoZXIuIikKKworICAgICAgICBkZWYgZGVwcmVjYXRlZF9hcmd1bWVudChvbGRfbmFtZSwgbmV3X25hbWUpOgorICAgICAgICAgICAgaWYgb2xkX25hbWUgaW4ga3dhcmdzOgorICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAgICAgICAgICdUaGUgIiVzIiBhcmd1bWVudCB0byB0aGUgQmVhdXRpZnVsU291cCBjb25zdHJ1Y3RvciAnCisgICAgICAgICAgICAgICAgICAgICdoYXMgYmVlbiByZW5hbWVkIHRvICIlcy4iJyAlIChvbGRfbmFtZSwgbmV3X25hbWUpKQorICAgICAgICAgICAgICAgIHZhbHVlID0ga3dhcmdzW29sZF9uYW1lXQorICAgICAgICAgICAgICAgIGRlbCBrd2FyZ3Nbb2xkX25hbWVdCisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlCisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIHBhcnNlX29ubHkgPSBwYXJzZV9vbmx5IG9yIGRlcHJlY2F0ZWRfYXJndW1lbnQoCisgICAgICAgICAgICAicGFyc2VPbmx5VGhlc2UiLCAicGFyc2Vfb25seSIpCisKKyAgICAgICAgZnJvbV9lbmNvZGluZyA9IGZyb21fZW5jb2Rpbmcgb3IgZGVwcmVjYXRlZF9hcmd1bWVudCgKKyAgICAgICAgICAgICJmcm9tRW5jb2RpbmciLCAiZnJvbV9lbmNvZGluZyIpCisKKyAgICAgICAgaWYgbGVuKGt3YXJncykgPiAwOgorICAgICAgICAgICAgYXJnID0ga3dhcmdzLmtleXMoKS5wb3AoKQorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKAorICAgICAgICAgICAgICAgICJfX2luaXRfXygpIGdvdCBhbiB1bmV4cGVjdGVkIGtleXdvcmQgYXJndW1lbnQgJyVzJyIgJSBhcmcpCisKKyAgICAgICAgaWYgYnVpbGRlciBpcyBOb25lOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShmZWF0dXJlcywgYmFzZXN0cmluZyk6CisgICAgICAgICAgICAgICAgZmVhdHVyZXMgPSBbZmVhdHVyZXNdCisgICAgICAgICAgICBpZiBmZWF0dXJlcyBpcyBOb25lIG9yIGxlbihmZWF0dXJlcykgPT0gMDoKKyAgICAgICAgICAgICAgICBmZWF0dXJlcyA9IHNlbGYuREVGQVVMVF9CVUlMREVSX0ZFQVRVUkVTCisgICAgICAgICAgICBidWlsZGVyX2NsYXNzID0gYnVpbGRlcl9yZWdpc3RyeS5sb29rdXAoKmZlYXR1cmVzKQorICAgICAgICAgICAgaWYgYnVpbGRlcl9jbGFzcyBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJhaXNlIEZlYXR1cmVOb3RGb3VuZCgKKyAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGZpbmQgYSB0cmVlIGJ1aWxkZXIgd2l0aCB0aGUgZmVhdHVyZXMgeW91ICIKKyAgICAgICAgICAgICAgICAgICAgInJlcXVlc3RlZDogJXMuIERvIHlvdSBuZWVkIHRvIGluc3RhbGwgYSBwYXJzZXIgbGlicmFyeT8iCisgICAgICAgICAgICAgICAgICAgICUgIiwiLmpvaW4oZmVhdHVyZXMpKQorICAgICAgICAgICAgYnVpbGRlciA9IGJ1aWxkZXJfY2xhc3MoKQorICAgICAgICBzZWxmLmJ1aWxkZXIgPSBidWlsZGVyCisgICAgICAgIHNlbGYuaXNfeG1sID0gYnVpbGRlci5pc194bWwKKyAgICAgICAgc2VsZi5idWlsZGVyLnNvdXAgPSBzZWxmCisKKyAgICAgICAgc2VsZi5wYXJzZV9vbmx5ID0gcGFyc2Vfb25seQorCisgICAgICAgIGlmIGhhc2F0dHIobWFya3VwLCAncmVhZCcpOiAgICAgICAgIyBJdCdzIGEgZmlsZS10eXBlIG9iamVjdC4KKyAgICAgICAgICAgIG1hcmt1cCA9IG1hcmt1cC5yZWFkKCkKKyAgICAgICAgZWxpZiBsZW4obWFya3VwKSA8PSAyNTY6CisgICAgICAgICAgICAjIFByaW50IG91dCB3YXJuaW5ncyBmb3IgYSBjb3VwbGUgYmVnaW5uZXIgcHJvYmxlbXMKKyAgICAgICAgICAgICMgaW52b2x2aW5nIHBhc3Npbmcgbm9uLW1hcmt1cCB0byBCZWF1dGlmdWwgU291cC4KKyAgICAgICAgICAgICMgQmVhdXRpZnVsIFNvdXAgd2lsbCBzdGlsbCBwYXJzZSB0aGUgaW5wdXQgYXMgbWFya3VwLAorICAgICAgICAgICAgIyBqdXN0IGluIGNhc2UgdGhhdCdzIHdoYXQgdGhlIHVzZXIgcmVhbGx5IHdhbnRzLgorICAgICAgICAgICAgaWYgKGlzaW5zdGFuY2UobWFya3VwLCB1bmljb2RlKQorICAgICAgICAgICAgICAgIGFuZCBub3Qgb3MucGF0aC5zdXBwb3J0c191bmljb2RlX2ZpbGVuYW1lcyk6CisgICAgICAgICAgICAgICAgcG9zc2libGVfZmlsZW5hbWUgPSBtYXJrdXAuZW5jb2RlKCJ1dGY4IikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcG9zc2libGVfZmlsZW5hbWUgPSBtYXJrdXAKKyAgICAgICAgICAgIGlzX2ZpbGUgPSBGYWxzZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlzX2ZpbGUgPSBvcy5wYXRoLmV4aXN0cyhwb3NzaWJsZV9maWxlbmFtZSkKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGU6CisgICAgICAgICAgICAgICAgIyBUaGlzIGlzIGFsbW9zdCBjZXJ0YWlubHkgYSBwcm9ibGVtIGludm9sdmluZworICAgICAgICAgICAgICAgICMgY2hhcmFjdGVycyBub3QgdmFsaWQgaW4gZmlsZW5hbWVzIG9uIHRoaXMKKyAgICAgICAgICAgICAgICAjIHN5c3RlbS4gSnVzdCBsZXQgaXQgZ28uCisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgaWYgaXNfZmlsZToKKyAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgICAgICAgICAnIiVzIiBsb29rcyBsaWtlIGEgZmlsZW5hbWUsIG5vdCBtYXJrdXAuIFlvdSBzaG91bGQgcHJvYmFibHkgb3BlbiB0aGlzIGZpbGUgYW5kIHBhc3MgdGhlIGZpbGVoYW5kbGUgaW50byBCZWF1dGlmdWwgU291cC4nICUgbWFya3VwKQorICAgICAgICAgICAgaWYgbWFya3VwWzo1XSA9PSAiaHR0cDoiIG9yIG1hcmt1cFs6Nl0gPT0gImh0dHBzOiI6CisgICAgICAgICAgICAgICAgIyBUT0RPOiBUaGlzIGlzIHVnbHkgYnV0IEkgY291bGRuJ3QgZ2V0IGl0IHRvIHdvcmsgaW4KKyAgICAgICAgICAgICAgICAjIFB5dGhvbiAzIG90aGVyd2lzZS4KKyAgICAgICAgICAgICAgICBpZiAoKGlzaW5zdGFuY2UobWFya3VwLCBieXRlcykgYW5kIG5vdCBiJyAnIGluIG1hcmt1cCkKKyAgICAgICAgICAgICAgICAgICAgb3IgKGlzaW5zdGFuY2UobWFya3VwLCB1bmljb2RlKSBhbmQgbm90IHUnICcgaW4gbWFya3VwKSk6CisgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAgICAgICAgICAgICAnIiVzIiBsb29rcyBsaWtlIGEgVVJMLiBCZWF1dGlmdWwgU291cCBpcyBub3QgYW4gSFRUUCBjbGllbnQuIFlvdSBzaG91bGQgcHJvYmFibHkgdXNlIGFuIEhUVFAgY2xpZW50IHRvIGdldCB0aGUgZG9jdW1lbnQgYmVoaW5kIHRoZSBVUkwsIGFuZCBmZWVkIHRoYXQgZG9jdW1lbnQgdG8gQmVhdXRpZnVsIFNvdXAuJyAlIG1hcmt1cCkKKworICAgICAgICBmb3IgKHNlbGYubWFya3VwLCBzZWxmLm9yaWdpbmFsX2VuY29kaW5nLCBzZWxmLmRlY2xhcmVkX2h0bWxfZW5jb2RpbmcsCisgICAgICAgICBzZWxmLmNvbnRhaW5zX3JlcGxhY2VtZW50X2NoYXJhY3RlcnMpIGluICgKKyAgICAgICAgICAgIHNlbGYuYnVpbGRlci5wcmVwYXJlX21hcmt1cChtYXJrdXAsIGZyb21fZW5jb2RpbmcpKToKKyAgICAgICAgICAgIHNlbGYucmVzZXQoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuX2ZlZWQoKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBleGNlcHQgUGFyc2VyUmVqZWN0ZWRNYXJrdXA6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICMgQ2xlYXIgb3V0IHRoZSBtYXJrdXAgYW5kIHJlbW92ZSB0aGUgYnVpbGRlcidzIGNpcmN1bGFyCisgICAgICAgICMgcmVmZXJlbmNlIHRvIHRoaXMgb2JqZWN0LgorICAgICAgICBzZWxmLm1hcmt1cCA9IE5vbmUKKyAgICAgICAgc2VsZi5idWlsZGVyLnNvdXAgPSBOb25lCisKKyAgICBkZWYgX2ZlZWQoc2VsZik6CisgICAgICAgICMgQ29udmVydCB0aGUgZG9jdW1lbnQgdG8gVW5pY29kZS4KKyAgICAgICAgc2VsZi5idWlsZGVyLnJlc2V0KCkKKworICAgICAgICBzZWxmLmJ1aWxkZXIuZmVlZChzZWxmLm1hcmt1cCkKKyAgICAgICAgIyBDbG9zZSBvdXQgYW55IHVuZmluaXNoZWQgc3RyaW5ncyBhbmQgY2xvc2UgYWxsIHRoZSBvcGVuIHRhZ3MuCisgICAgICAgIHNlbGYuZW5kRGF0YSgpCisgICAgICAgIHdoaWxlIHNlbGYuY3VycmVudFRhZy5uYW1lICE9IHNlbGYuUk9PVF9UQUdfTkFNRToKKyAgICAgICAgICAgIHNlbGYucG9wVGFnKCkKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgVGFnLl9faW5pdF9fKHNlbGYsIHNlbGYsIHNlbGYuYnVpbGRlciwgc2VsZi5ST09UX1RBR19OQU1FKQorICAgICAgICBzZWxmLmhpZGRlbiA9IDEKKyAgICAgICAgc2VsZi5idWlsZGVyLnJlc2V0KCkKKyAgICAgICAgc2VsZi5jdXJyZW50X2RhdGEgPSBbXQorICAgICAgICBzZWxmLmN1cnJlbnRUYWcgPSBOb25lCisgICAgICAgIHNlbGYudGFnU3RhY2sgPSBbXQorICAgICAgICBzZWxmLnByZXNlcnZlX3doaXRlc3BhY2VfdGFnX3N0YWNrID0gW10KKyAgICAgICAgc2VsZi5wdXNoVGFnKHNlbGYpCisKKyAgICBkZWYgbmV3X3RhZyhzZWxmLCBuYW1lLCBuYW1lc3BhY2U9Tm9uZSwgbnNwcmVmaXg9Tm9uZSwgKiphdHRycyk6CisgICAgICAgICIiIkNyZWF0ZSBhIG5ldyB0YWcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc291cC4iIiIKKyAgICAgICAgcmV0dXJuIFRhZyhOb25lLCBzZWxmLmJ1aWxkZXIsIG5hbWUsIG5hbWVzcGFjZSwgbnNwcmVmaXgsIGF0dHJzKQorCisgICAgZGVmIG5ld19zdHJpbmcoc2VsZiwgcywgc3ViY2xhc3M9TmF2aWdhYmxlU3RyaW5nKToKKyAgICAgICAgIiIiQ3JlYXRlIGEgbmV3IE5hdmlnYWJsZVN0cmluZyBhc3NvY2lhdGVkIHdpdGggdGhpcyBzb3VwLiIiIgorICAgICAgICBuYXZpZ2FibGUgPSBzdWJjbGFzcyhzKQorICAgICAgICBuYXZpZ2FibGUuc2V0dXAoKQorICAgICAgICByZXR1cm4gbmF2aWdhYmxlCisKKyAgICBkZWYgaW5zZXJ0X2JlZm9yZShzZWxmLCBzdWNjZXNzb3IpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCJCZWF1dGlmdWxTb3VwIG9iamVjdHMgZG9uJ3Qgc3VwcG9ydCBpbnNlcnRfYmVmb3JlKCkuIikKKworICAgIGRlZiBpbnNlcnRfYWZ0ZXIoc2VsZiwgc3VjY2Vzc29yKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigiQmVhdXRpZnVsU291cCBvYmplY3RzIGRvbid0IHN1cHBvcnQgaW5zZXJ0X2FmdGVyKCkuIikKKworICAgIGRlZiBwb3BUYWcoc2VsZik6CisgICAgICAgIHRhZyA9IHNlbGYudGFnU3RhY2sucG9wKCkKKyAgICAgICAgaWYgc2VsZi5wcmVzZXJ2ZV93aGl0ZXNwYWNlX3RhZ19zdGFjayBhbmQgdGFnID09IHNlbGYucHJlc2VydmVfd2hpdGVzcGFjZV90YWdfc3RhY2tbLTFdOgorICAgICAgICAgICAgc2VsZi5wcmVzZXJ2ZV93aGl0ZXNwYWNlX3RhZ19zdGFjay5wb3AoKQorICAgICAgICAjcHJpbnQgIlBvcCIsIHRhZy5uYW1lCisgICAgICAgIGlmIHNlbGYudGFnU3RhY2s6CisgICAgICAgICAgICBzZWxmLmN1cnJlbnRUYWcgPSBzZWxmLnRhZ1N0YWNrWy0xXQorICAgICAgICByZXR1cm4gc2VsZi5jdXJyZW50VGFnCisKKyAgICBkZWYgcHVzaFRhZyhzZWxmLCB0YWcpOgorICAgICAgICAjcHJpbnQgIlB1c2giLCB0YWcubmFtZQorICAgICAgICBpZiBzZWxmLmN1cnJlbnRUYWc6CisgICAgICAgICAgICBzZWxmLmN1cnJlbnRUYWcuY29udGVudHMuYXBwZW5kKHRhZykKKyAgICAgICAgc2VsZi50YWdTdGFjay5hcHBlbmQodGFnKQorICAgICAgICBzZWxmLmN1cnJlbnRUYWcgPSBzZWxmLnRhZ1N0YWNrWy0xXQorICAgICAgICBpZiB0YWcubmFtZSBpbiBzZWxmLmJ1aWxkZXIucHJlc2VydmVfd2hpdGVzcGFjZV90YWdzOgorICAgICAgICAgICAgc2VsZi5wcmVzZXJ2ZV93aGl0ZXNwYWNlX3RhZ19zdGFjay5hcHBlbmQodGFnKQorCisgICAgZGVmIGVuZERhdGEoc2VsZiwgY29udGFpbmVyQ2xhc3M9TmF2aWdhYmxlU3RyaW5nKToKKyAgICAgICAgaWYgc2VsZi5jdXJyZW50X2RhdGE6CisgICAgICAgICAgICBjdXJyZW50X2RhdGEgPSB1Jycuam9pbihzZWxmLmN1cnJlbnRfZGF0YSkKKyAgICAgICAgICAgICMgSWYgd2hpdGVzcGFjZSBpcyBub3QgcHJlc2VydmVkLCBhbmQgdGhpcyBzdHJpbmcgY29udGFpbnMKKyAgICAgICAgICAgICMgbm90aGluZyBidXQgQVNDSUkgc3BhY2VzLCByZXBsYWNlIGl0IHdpdGggYSBzaW5nbGUgc3BhY2UKKyAgICAgICAgICAgICMgb3IgbmV3bGluZS4KKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLnByZXNlcnZlX3doaXRlc3BhY2VfdGFnX3N0YWNrOgorICAgICAgICAgICAgICAgIHN0cmlwcGFibGUgPSBUcnVlCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gY3VycmVudF9kYXRhOgorICAgICAgICAgICAgICAgICAgICBpZiBpIG5vdCBpbiBzZWxmLkFTQ0lJX1NQQUNFUzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwcGFibGUgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBpZiBzdHJpcHBhYmxlOgorICAgICAgICAgICAgICAgICAgICBpZiAnXG4nIGluIGN1cnJlbnRfZGF0YToKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfZGF0YSA9ICdcbicKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfZGF0YSA9ICcgJworCisgICAgICAgICAgICAjIFJlc2V0IHRoZSBkYXRhIGNvbGxlY3Rvci4KKyAgICAgICAgICAgIHNlbGYuY3VycmVudF9kYXRhID0gW10KKworICAgICAgICAgICAgIyBTaG91bGQgd2UgYWRkIHRoaXMgc3RyaW5nIHRvIHRoZSB0cmVlIGF0IGFsbD8KKyAgICAgICAgICAgIGlmIHNlbGYucGFyc2Vfb25seSBhbmQgbGVuKHNlbGYudGFnU3RhY2spIDw9IDEgYW5kIFwKKyAgICAgICAgICAgICAgICAgICAobm90IHNlbGYucGFyc2Vfb25seS50ZXh0IG9yIFwKKyAgICAgICAgICAgICAgICAgICAgbm90IHNlbGYucGFyc2Vfb25seS5zZWFyY2goY3VycmVudF9kYXRhKSk6CisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgIG8gPSBjb250YWluZXJDbGFzcyhjdXJyZW50X2RhdGEpCisgICAgICAgICAgICBzZWxmLm9iamVjdF93YXNfcGFyc2VkKG8pCisKKyAgICBkZWYgb2JqZWN0X3dhc19wYXJzZWQoc2VsZiwgbywgcGFyZW50PU5vbmUsIG1vc3RfcmVjZW50X2VsZW1lbnQ9Tm9uZSk6CisgICAgICAgICIiIkFkZCBhbiBvYmplY3QgdG8gdGhlIHBhcnNlIHRyZWUuIiIiCisgICAgICAgIHBhcmVudCA9IHBhcmVudCBvciBzZWxmLmN1cnJlbnRUYWcKKyAgICAgICAgbW9zdF9yZWNlbnRfZWxlbWVudCA9IG1vc3RfcmVjZW50X2VsZW1lbnQgb3Igc2VsZi5fbW9zdF9yZWNlbnRfZWxlbWVudAorICAgICAgICBvLnNldHVwKHBhcmVudCwgbW9zdF9yZWNlbnRfZWxlbWVudCkKKworICAgICAgICBpZiBtb3N0X3JlY2VudF9lbGVtZW50IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbW9zdF9yZWNlbnRfZWxlbWVudC5uZXh0X2VsZW1lbnQgPSBvCisgICAgICAgIHNlbGYuX21vc3RfcmVjZW50X2VsZW1lbnQgPSBvCisgICAgICAgIHBhcmVudC5jb250ZW50cy5hcHBlbmQobykKKworICAgIGRlZiBfcG9wVG9UYWcoc2VsZiwgbmFtZSwgbnNwcmVmaXg9Tm9uZSwgaW5jbHVzaXZlUG9wPVRydWUpOgorICAgICAgICAiIiJQb3BzIHRoZSB0YWcgc3RhY2sgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgbW9zdCByZWNlbnQKKyAgICAgICAgaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIHRhZy4gSWYgaW5jbHVzaXZlUG9wIGlzIGZhbHNlLCBwb3BzIHRoZSB0YWcKKyAgICAgICAgc3RhY2sgdXAgdG8gYnV0ICpub3QqIGluY2x1ZGluZyB0aGUgbW9zdCByZWNlbnQgaW5zdHFhbmNlIG9mCisgICAgICAgIHRoZSBnaXZlbiB0YWcuIiIiCisgICAgICAgICNwcmludCAiUG9wcGluZyB0byAlcyIgJSBuYW1lCisgICAgICAgIGlmIG5hbWUgPT0gc2VsZi5ST09UX1RBR19OQU1FOgorICAgICAgICAgICAgIyBUaGUgQmVhdXRpZnVsU291cCBvYmplY3QgaXRzZWxmIGNhbiBuZXZlciBiZSBwb3BwZWQuCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBtb3N0X3JlY2VudGx5X3BvcHBlZCA9IE5vbmUKKworICAgICAgICBzdGFja19zaXplID0gbGVuKHNlbGYudGFnU3RhY2spCisgICAgICAgIGZvciBpIGluIHJhbmdlKHN0YWNrX3NpemUgLSAxLCAwLCAtMSk6CisgICAgICAgICAgICB0ID0gc2VsZi50YWdTdGFja1tpXQorICAgICAgICAgICAgaWYgKG5hbWUgPT0gdC5uYW1lIGFuZCBuc3ByZWZpeCA9PSB0LnByZWZpeCk6CisgICAgICAgICAgICAgICAgaWYgaW5jbHVzaXZlUG9wOgorICAgICAgICAgICAgICAgICAgICBtb3N0X3JlY2VudGx5X3BvcHBlZCA9IHNlbGYucG9wVGFnKCkKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgbW9zdF9yZWNlbnRseV9wb3BwZWQgPSBzZWxmLnBvcFRhZygpCisKKyAgICAgICAgcmV0dXJuIG1vc3RfcmVjZW50bHlfcG9wcGVkCisKKyAgICBkZWYgaGFuZGxlX3N0YXJ0dGFnKHNlbGYsIG5hbWUsIG5hbWVzcGFjZSwgbnNwcmVmaXgsIGF0dHJzKToKKyAgICAgICAgIiIiUHVzaCBhIHN0YXJ0IHRhZyBvbiB0byB0aGUgc3RhY2suCisKKyAgICAgICAgSWYgdGhpcyBtZXRob2QgcmV0dXJucyBOb25lLCB0aGUgdGFnIHdhcyByZWplY3RlZCBieSB0aGUKKyAgICAgICAgU291cFN0cmFpbmVyLiBZb3Ugc2hvdWxkIHByb2NlZWQgYXMgaWYgdGhlIHRhZyBoYWQgbm90IG9jY3VyZWQKKyAgICAgICAgaW4gdGhlIGRvY3VtZW50LiBGb3IgaW5zdGFuY2UsIGlmIHRoaXMgd2FzIGEgc2VsZi1jbG9zaW5nIHRhZywKKyAgICAgICAgZG9uJ3QgY2FsbCBoYW5kbGVfZW5kdGFnLgorICAgICAgICAiIiIKKworICAgICAgICAjIHByaW50ICJTdGFydCB0YWcgJXM6ICVzIiAlIChuYW1lLCBhdHRycykKKyAgICAgICAgc2VsZi5lbmREYXRhKCkKKworICAgICAgICBpZiAoc2VsZi5wYXJzZV9vbmx5IGFuZCBsZW4oc2VsZi50YWdTdGFjaykgPD0gMQorICAgICAgICAgICAgYW5kIChzZWxmLnBhcnNlX29ubHkudGV4dAorICAgICAgICAgICAgICAgICBvciBub3Qgc2VsZi5wYXJzZV9vbmx5LnNlYXJjaF90YWcobmFtZSwgYXR0cnMpKSk6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIHRhZyA9IFRhZyhzZWxmLCBzZWxmLmJ1aWxkZXIsIG5hbWUsIG5hbWVzcGFjZSwgbnNwcmVmaXgsIGF0dHJzLAorICAgICAgICAgICAgICAgICAgc2VsZi5jdXJyZW50VGFnLCBzZWxmLl9tb3N0X3JlY2VudF9lbGVtZW50KQorICAgICAgICBpZiB0YWcgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiB0YWcKKyAgICAgICAgaWYgc2VsZi5fbW9zdF9yZWNlbnRfZWxlbWVudDoKKyAgICAgICAgICAgIHNlbGYuX21vc3RfcmVjZW50X2VsZW1lbnQubmV4dF9lbGVtZW50ID0gdGFnCisgICAgICAgIHNlbGYuX21vc3RfcmVjZW50X2VsZW1lbnQgPSB0YWcKKyAgICAgICAgc2VsZi5wdXNoVGFnKHRhZykKKyAgICAgICAgcmV0dXJuIHRhZworCisgICAgZGVmIGhhbmRsZV9lbmR0YWcoc2VsZiwgbmFtZSwgbnNwcmVmaXg9Tm9uZSk6CisgICAgICAgICNwcmludCAiRW5kIHRhZzogIiArIG5hbWUKKyAgICAgICAgc2VsZi5lbmREYXRhKCkKKyAgICAgICAgc2VsZi5fcG9wVG9UYWcobmFtZSwgbnNwcmVmaXgpCisKKyAgICBkZWYgaGFuZGxlX2RhdGEoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuY3VycmVudF9kYXRhLmFwcGVuZChkYXRhKQorCisgICAgZGVmIGRlY29kZShzZWxmLCBwcmV0dHlfcHJpbnQ9RmFsc2UsCisgICAgICAgICAgICAgICBldmVudHVhbF9lbmNvZGluZz1ERUZBVUxUX09VVFBVVF9FTkNPRElORywKKyAgICAgICAgICAgICAgIGZvcm1hdHRlcj0ibWluaW1hbCIpOgorICAgICAgICAiIiJSZXR1cm5zIGEgc3RyaW5nIG9yIFVuaWNvZGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBkb2N1bWVudC4KKyAgICAgICAgVG8gZ2V0IFVuaWNvZGUsIHBhc3MgTm9uZSBmb3IgZW5jb2RpbmcuIiIiCisKKyAgICAgICAgaWYgc2VsZi5pc194bWw6CisgICAgICAgICAgICAjIFByaW50IHRoZSBYTUwgZGVjbGFyYXRpb24KKyAgICAgICAgICAgIGVuY29kaW5nX3BhcnQgPSAnJworICAgICAgICAgICAgaWYgZXZlbnR1YWxfZW5jb2RpbmcgIT0gTm9uZToKKyAgICAgICAgICAgICAgICBlbmNvZGluZ19wYXJ0ID0gJyBlbmNvZGluZz0iJXMiJyAlIGV2ZW50dWFsX2VuY29kaW5nCisgICAgICAgICAgICBwcmVmaXggPSB1Jzw/eG1sIHZlcnNpb249IjEuMCIlcz8+XG4nICUgZW5jb2RpbmdfcGFydAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJlZml4ID0gdScnCisgICAgICAgIGlmIG5vdCBwcmV0dHlfcHJpbnQ6CisgICAgICAgICAgICBpbmRlbnRfbGV2ZWwgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpbmRlbnRfbGV2ZWwgPSAwCisgICAgICAgIHJldHVybiBwcmVmaXggKyBzdXBlcihCZWF1dGlmdWxTb3VwLCBzZWxmKS5kZWNvZGUoCisgICAgICAgICAgICBpbmRlbnRfbGV2ZWwsIGV2ZW50dWFsX2VuY29kaW5nLCBmb3JtYXR0ZXIpCisKKyMgQWxpYXMgdG8gbWFrZSBpdCBlYXNpZXIgdG8gdHlwZSBpbXBvcnQ6ICdmcm9tIGJzNCBpbXBvcnQgX3NvdXAnCitfcyA9IEJlYXV0aWZ1bFNvdXAKK19zb3VwID0gQmVhdXRpZnVsU291cAorCitjbGFzcyBCZWF1dGlmdWxTdG9uZVNvdXAoQmVhdXRpZnVsU291cCk6CisgICAgIiIiRGVwcmVjYXRlZCBpbnRlcmZhY2UgdG8gYW4gWE1MIHBhcnNlci4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBrd2FyZ3NbJ2ZlYXR1cmVzJ10gPSAneG1sJworICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgJ1RoZSBCZWF1dGlmdWxTdG9uZVNvdXAgY2xhc3MgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCBvZiB1c2luZyAnCisgICAgICAgICAgICAnaXQsIHBhc3MgZmVhdHVyZXM9InhtbCIgaW50byB0aGUgQmVhdXRpZnVsU291cCBjb25zdHJ1Y3Rvci4nKQorICAgICAgICBzdXBlcihCZWF1dGlmdWxTdG9uZVNvdXAsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykKKworCitjbGFzcyBTdG9wUGFyc2luZyhFeGNlcHRpb24pOgorICAgIHBhc3MKKworY2xhc3MgRmVhdHVyZU5vdEZvdW5kKFZhbHVlRXJyb3IpOgorICAgIHBhc3MKKworCisjQnkgZGVmYXVsdCwgYWN0IGFzIGFuIEhUTUwgcHJldHR5LXByaW50ZXIuCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGltcG9ydCBzeXMKKyAgICBzb3VwID0gQmVhdXRpZnVsU291cChzeXMuc3RkaW4pCisgICAgcHJpbnQgc291cC5wcmV0dGlmeSgpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iczQvYnVpbGRlci9fX2luaXRfXy5weSBiL2JpdGJha2UvbGliL2JzNC9idWlsZGVyL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MGY1ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iczQvYnVpbGRlci9fX2luaXRfXy5weQpAQCAtMCwwICsxLDMyMSBAQAorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVmYXVsdGRpY3QKK2ltcG9ydCBpdGVydG9vbHMKK2ltcG9ydCBzeXMKK2Zyb20gYnM0LmVsZW1lbnQgaW1wb3J0ICgKKyAgICBDaGFyc2V0TWV0YUF0dHJpYnV0ZVZhbHVlLAorICAgIENvbnRlbnRNZXRhQXR0cmlidXRlVmFsdWUsCisgICAgd2hpdGVzcGFjZV9yZQorICAgICkKKworX19hbGxfXyA9IFsKKyAgICAnSFRNTFRyZWVCdWlsZGVyJywKKyAgICAnU0FYVHJlZUJ1aWxkZXInLAorICAgICdUcmVlQnVpbGRlcicsCisgICAgJ1RyZWVCdWlsZGVyUmVnaXN0cnknLAorICAgIF0KKworIyBTb21lIHVzZWZ1bCBmZWF0dXJlcyBmb3IgYSBUcmVlQnVpbGRlciB0byBoYXZlLgorRkFTVCA9ICdmYXN0JworUEVSTUlTU0lWRSA9ICdwZXJtaXNzaXZlJworU1RSSUNUID0gJ3N0cmljdCcKK1hNTCA9ICd4bWwnCitIVE1MID0gJ2h0bWwnCitIVE1MXzUgPSAnaHRtbDUnCisKKworY2xhc3MgVHJlZUJ1aWxkZXJSZWdpc3RyeShvYmplY3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmJ1aWxkZXJzX2Zvcl9mZWF0dXJlID0gZGVmYXVsdGRpY3QobGlzdCkKKyAgICAgICAgc2VsZi5idWlsZGVycyA9IFtdCisKKyAgICBkZWYgcmVnaXN0ZXIoc2VsZiwgdHJlZWJ1aWxkZXJfY2xhc3MpOgorICAgICAgICAiIiJSZWdpc3RlciBhIHRyZWVidWlsZGVyIGJhc2VkIG9uIGl0cyBhZHZlcnRpc2VkIGZlYXR1cmVzLiIiIgorICAgICAgICBmb3IgZmVhdHVyZSBpbiB0cmVlYnVpbGRlcl9jbGFzcy5mZWF0dXJlczoKKyAgICAgICAgICAgIHNlbGYuYnVpbGRlcnNfZm9yX2ZlYXR1cmVbZmVhdHVyZV0uaW5zZXJ0KDAsIHRyZWVidWlsZGVyX2NsYXNzKQorICAgICAgICBzZWxmLmJ1aWxkZXJzLmluc2VydCgwLCB0cmVlYnVpbGRlcl9jbGFzcykKKworICAgIGRlZiBsb29rdXAoc2VsZiwgKmZlYXR1cmVzKToKKyAgICAgICAgaWYgbGVuKHNlbGYuYnVpbGRlcnMpID09IDA6CisgICAgICAgICAgICAjIFRoZXJlIGFyZSBubyBidWlsZGVycyBhdCBhbGwuCisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIGlmIGxlbihmZWF0dXJlcykgPT0gMDoKKyAgICAgICAgICAgICMgVGhleSBkaWRuJ3QgYXNrIGZvciBhbnkgZmVhdHVyZXMuIEdpdmUgdGhlbSB0aGUgbW9zdAorICAgICAgICAgICAgIyByZWNlbnRseSByZWdpc3RlcmVkIGJ1aWxkZXIuCisgICAgICAgICAgICByZXR1cm4gc2VsZi5idWlsZGVyc1swXQorCisgICAgICAgICMgR28gZG93biB0aGUgbGlzdCBvZiBmZWF0dXJlcyBpbiBvcmRlciwgYW5kIGVsaW1pbmF0ZSBhbnkgYnVpbGRlcnMKKyAgICAgICAgIyB0aGF0IGRvbid0IG1hdGNoIGV2ZXJ5IGZlYXR1cmUuCisgICAgICAgIGZlYXR1cmVzID0gbGlzdChmZWF0dXJlcykKKyAgICAgICAgZmVhdHVyZXMucmV2ZXJzZSgpCisgICAgICAgIGNhbmRpZGF0ZXMgPSBOb25lCisgICAgICAgIGNhbmRpZGF0ZV9zZXQgPSBOb25lCisgICAgICAgIHdoaWxlIGxlbihmZWF0dXJlcykgPiAwOgorICAgICAgICAgICAgZmVhdHVyZSA9IGZlYXR1cmVzLnBvcCgpCisgICAgICAgICAgICB3ZV9oYXZlX3RoZV9mZWF0dXJlID0gc2VsZi5idWlsZGVyc19mb3JfZmVhdHVyZS5nZXQoZmVhdHVyZSwgW10pCisgICAgICAgICAgICBpZiBsZW4od2VfaGF2ZV90aGVfZmVhdHVyZSkgPiAwOgorICAgICAgICAgICAgICAgIGlmIGNhbmRpZGF0ZXMgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlcyA9IHdlX2hhdmVfdGhlX2ZlYXR1cmUKKyAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlX3NldCA9IHNldChjYW5kaWRhdGVzKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgRWxpbWluYXRlIGFueSBjYW5kaWRhdGVzIHRoYXQgZG9uJ3QgaGF2ZSB0aGlzIGZlYXR1cmUuCisgICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZV9zZXQgPSBjYW5kaWRhdGVfc2V0LmludGVyc2VjdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldCh3ZV9oYXZlX3RoZV9mZWF0dXJlKSkKKworICAgICAgICAjIFRoZSBvbmx5IHZhbGlkIGNhbmRpZGF0ZXMgYXJlIHRoZSBvbmVzIGluIGNhbmRpZGF0ZV9zZXQuCisgICAgICAgICMgR28gdGhyb3VnaCB0aGUgb3JpZ2luYWwgbGlzdCBvZiBjYW5kaWRhdGVzIGFuZCBwaWNrIHRoZSBmaXJzdCBvbmUKKyAgICAgICAgIyB0aGF0J3MgaW4gY2FuZGlkYXRlX3NldC4KKyAgICAgICAgaWYgY2FuZGlkYXRlX3NldCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgZm9yIGNhbmRpZGF0ZSBpbiBjYW5kaWRhdGVzOgorICAgICAgICAgICAgaWYgY2FuZGlkYXRlIGluIGNhbmRpZGF0ZV9zZXQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZQorICAgICAgICByZXR1cm4gTm9uZQorCisjIFRoZSBCZWF1dGlmdWxTb3VwIGNsYXNzIHdpbGwgdGFrZSBmZWF0dXJlIGxpc3RzIGZyb20gZGV2ZWxvcGVycyBhbmQgdXNlIHRoZW0KKyMgdG8gbG9vayB1cCBidWlsZGVycyBpbiB0aGlzIHJlZ2lzdHJ5LgorYnVpbGRlcl9yZWdpc3RyeSA9IFRyZWVCdWlsZGVyUmVnaXN0cnkoKQorCitjbGFzcyBUcmVlQnVpbGRlcihvYmplY3QpOgorICAgICIiIlR1cm4gYSBkb2N1bWVudCBpbnRvIGEgQmVhdXRpZnVsIFNvdXAgb2JqZWN0IHRyZWUuIiIiCisKKyAgICBmZWF0dXJlcyA9IFtdCisKKyAgICBpc194bWwgPSBGYWxzZQorICAgIHByZXNlcnZlX3doaXRlc3BhY2VfdGFncyA9IHNldCgpCisgICAgZW1wdHlfZWxlbWVudF90YWdzID0gTm9uZSAjIEEgdGFnIHdpbGwgYmUgY29uc2lkZXJlZCBhbiBlbXB0eS1lbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRhZyB3aGVuIGFuZCBvbmx5IHdoZW4gaXQgaGFzIG5vIGNvbnRlbnRzLgorCisgICAgIyBBIHZhbHVlIGZvciB0aGVzZSB0YWcvYXR0cmlidXRlIGNvbWJpbmF0aW9ucyBpcyBhIHNwYWNlLSBvcgorICAgICMgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgQ0RBVEEsIHJhdGhlciB0aGFuIGEgc2luZ2xlIENEQVRBLgorICAgIGNkYXRhX2xpc3RfYXR0cmlidXRlcyA9IHt9CisKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5zb3VwID0gTm9uZQorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgY2FuX2JlX2VtcHR5X2VsZW1lbnQoc2VsZiwgdGFnX25hbWUpOgorICAgICAgICAiIiJNaWdodCBhIHRhZyB3aXRoIHRoaXMgbmFtZSBiZSBhbiBlbXB0eS1lbGVtZW50IHRhZz8KKworICAgICAgICBUaGUgZmluYWwgbWFya3VwIG1heSBvciBtYXkgbm90IGFjdHVhbGx5IHByZXNlbnQgdGhpcyB0YWcgYXMKKyAgICAgICAgc2VsZi1jbG9zaW5nLgorCisgICAgICAgIEZvciBpbnN0YW5jZTogYW4gSFRNTEJ1aWxkZXIgZG9lcyBub3QgY29uc2lkZXIgYSA8cD4gdGFnIHRvIGJlCisgICAgICAgIGFuIGVtcHR5LWVsZW1lbnQgdGFnIChpdCdzIG5vdCBpbgorICAgICAgICBIVE1MQnVpbGRlci5lbXB0eV9lbGVtZW50X3RhZ3MpLiBUaGlzIG1lYW5zIGFuIGVtcHR5IDxwPiB0YWcKKyAgICAgICAgd2lsbCBiZSBwcmVzZW50ZWQgYXMgIjxwPjwvcD4iLCBub3QgIjxwIC8+Ii4KKworICAgICAgICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBoYXMgbm8gb3BpbmlvbiBhYm91dCB3aGljaCB0YWdzIGFyZQorICAgICAgICBlbXB0eS1lbGVtZW50IHRhZ3MsIHNvIGEgdGFnIHdpbGwgYmUgcHJlc2VudGVkIGFzIGFuCisgICAgICAgIGVtcHR5LWVsZW1lbnQgdGFnIGlmIGFuZCBvbmx5IGlmIGl0IGhhcyBubyBjb250ZW50cy4KKyAgICAgICAgIjxmb28+PC9mb28+IiB3aWxsIGJlY29tZSAiPGZvbyAvPiIsIGFuZCAiPGZvbz5iYXI8L2Zvbz4iIHdpbGwKKyAgICAgICAgYmUgbGVmdCBhbG9uZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuZW1wdHlfZWxlbWVudF90YWdzIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gdGFnX25hbWUgaW4gc2VsZi5lbXB0eV9lbGVtZW50X3RhZ3MKKworICAgIGRlZiBmZWVkKHNlbGYsIG1hcmt1cCk6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoKQorCisgICAgZGVmIHByZXBhcmVfbWFya3VwKHNlbGYsIG1hcmt1cCwgdXNlcl9zcGVjaWZpZWRfZW5jb2Rpbmc9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRfZGVjbGFyZWRfZW5jb2Rpbmc9Tm9uZSk6CisgICAgICAgIHJldHVybiBtYXJrdXAsIE5vbmUsIE5vbmUsIEZhbHNlCisKKyAgICBkZWYgdGVzdF9mcmFnbWVudF90b19kb2N1bWVudChzZWxmLCBmcmFnbWVudCk6CisgICAgICAgICIiIldyYXAgYW4gSFRNTCBmcmFnbWVudCB0byBtYWtlIGl0IGxvb2sgbGlrZSBhIGRvY3VtZW50LgorCisgICAgICAgIERpZmZlcmVudCBwYXJzZXJzIGRvIHRoaXMgZGlmZmVyZW50bHkuIEZvciBpbnN0YW5jZSwgbHhtbAorICAgICAgICBpbnRyb2R1Y2VzIGFuIGVtcHR5IDxoZWFkPiB0YWcsIGFuZCBodG1sNWxpYgorICAgICAgICBkb2Vzbid0LiBBYnN0cmFjdGluZyB0aGlzIGF3YXkgbGV0cyB1cyB3cml0ZSBzaW1wbGUgdGVzdHMKKyAgICAgICAgd2hpY2ggcnVuIEhUTUwgZnJhZ21lbnRzIHRocm91Z2ggdGhlIHBhcnNlciBhbmQgY29tcGFyZSB0aGUKKyAgICAgICAgcmVzdWx0cyBhZ2FpbnN0IG90aGVyIEhUTUwgZnJhZ21lbnRzLgorCisgICAgICAgIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZCBvdXRzaWRlIG9mIHRlc3RzLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIGZyYWdtZW50CisKKyAgICBkZWYgc2V0X3VwX3N1YnN0aXR1dGlvbnMoc2VsZiwgdGFnKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgX3JlcGxhY2VfY2RhdGFfbGlzdF9hdHRyaWJ1dGVfdmFsdWVzKHNlbGYsIHRhZ19uYW1lLCBhdHRycyk6CisgICAgICAgICIiIlJlcGxhY2VzIGNsYXNzPSJmb28gYmFyIiB3aXRoIGNsYXNzPVsiZm9vIiwgImJhciJdCisKKyAgICAgICAgTW9kaWZpZXMgaXRzIGlucHV0IGluIHBsYWNlLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IGF0dHJzOgorICAgICAgICAgICAgcmV0dXJuIGF0dHJzCisgICAgICAgIGlmIHNlbGYuY2RhdGFfbGlzdF9hdHRyaWJ1dGVzOgorICAgICAgICAgICAgdW5pdmVyc2FsID0gc2VsZi5jZGF0YV9saXN0X2F0dHJpYnV0ZXMuZ2V0KCcqJywgW10pCisgICAgICAgICAgICB0YWdfc3BlY2lmaWMgPSBzZWxmLmNkYXRhX2xpc3RfYXR0cmlidXRlcy5nZXQoCisgICAgICAgICAgICAgICAgdGFnX25hbWUubG93ZXIoKSwgTm9uZSkKKyAgICAgICAgICAgIGZvciBhdHRyIGluIGF0dHJzLmtleXMoKToKKyAgICAgICAgICAgICAgICBpZiBhdHRyIGluIHVuaXZlcnNhbCBvciAodGFnX3NwZWNpZmljIGFuZCBhdHRyIGluIHRhZ19zcGVjaWZpYyk6CisgICAgICAgICAgICAgICAgICAgICMgV2UgaGF2ZSBhICJjbGFzcyItdHlwZSBhdHRyaWJ1dGUgd2hvc2Ugc3RyaW5nCisgICAgICAgICAgICAgICAgICAgICMgdmFsdWUgaXMgYSB3aGl0ZXNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mCisgICAgICAgICAgICAgICAgICAgICMgdmFsdWVzLiBTcGxpdCBpdCBpbnRvIGEgbGlzdC4KKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBhdHRyc1thdHRyXQorICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHdoaXRlc3BhY2VfcmUuc3BsaXQodmFsdWUpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAjIGh0bWw1bGliIHNvbWV0aW1lcyBjYWxscyBzZXRBdHRyaWJ1dGVzIHR3aWNlCisgICAgICAgICAgICAgICAgICAgICAgICAjIGZvciB0aGUgc2FtZSB0YWcgd2hlbiByZWFycmFuZ2luZyB0aGUgcGFyc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICMgdHJlZS4gT24gdGhlIHNlY29uZCBjYWxsIHRoZSBhdHRyaWJ1dGUgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICMgaGVyZSBpcyBhbHJlYWR5IGEgbGlzdC4gIElmIHRoaXMgaGFwcGVucywKKyAgICAgICAgICAgICAgICAgICAgICAgICMgbGVhdmUgdGhlIHZhbHVlIGFsb25lIHJhdGhlciB0aGFuIHRyeWluZyB0bworICAgICAgICAgICAgICAgICAgICAgICAgIyBzcGxpdCBpdCBhZ2Fpbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlCisgICAgICAgICAgICAgICAgICAgIGF0dHJzW2F0dHJdID0gdmFsdWVzCisgICAgICAgIHJldHVybiBhdHRycworCitjbGFzcyBTQVhUcmVlQnVpbGRlcihUcmVlQnVpbGRlcik6CisgICAgIiIiQSBCZWF1dGlmdWwgU291cCB0cmVlYnVpbGRlciB0aGF0IGxpc3RlbnMgZm9yIFNBWCBldmVudHMuIiIiCisKKyAgICBkZWYgZmVlZChzZWxmLCBtYXJrdXApOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHN0YXJ0RWxlbWVudChzZWxmLCBuYW1lLCBhdHRycyk6CisgICAgICAgIGF0dHJzID0gZGljdCgoa2V5WzFdLCB2YWx1ZSkgZm9yIGtleSwgdmFsdWUgaW4gbGlzdChhdHRycy5pdGVtcygpKSkKKyAgICAgICAgI3ByaW50ICJTdGFydCAlcywgJXIiICUgKG5hbWUsIGF0dHJzKQorICAgICAgICBzZWxmLnNvdXAuaGFuZGxlX3N0YXJ0dGFnKG5hbWUsIGF0dHJzKQorCisgICAgZGVmIGVuZEVsZW1lbnQoc2VsZiwgbmFtZSk6CisgICAgICAgICNwcmludCAiRW5kICVzIiAlIG5hbWUKKyAgICAgICAgc2VsZi5zb3VwLmhhbmRsZV9lbmR0YWcobmFtZSkKKworICAgIGRlZiBzdGFydEVsZW1lbnROUyhzZWxmLCBuc1R1cGxlLCBub2RlTmFtZSwgYXR0cnMpOgorICAgICAgICAjIFRocm93IGF3YXkgKG5zLCBub2RlTmFtZSkgZm9yIG5vdy4KKyAgICAgICAgc2VsZi5zdGFydEVsZW1lbnQobm9kZU5hbWUsIGF0dHJzKQorCisgICAgZGVmIGVuZEVsZW1lbnROUyhzZWxmLCBuc1R1cGxlLCBub2RlTmFtZSk6CisgICAgICAgICMgVGhyb3cgYXdheSAobnMsIG5vZGVOYW1lKSBmb3Igbm93LgorICAgICAgICBzZWxmLmVuZEVsZW1lbnQobm9kZU5hbWUpCisgICAgICAgICNoYW5kbGVyLmVuZEVsZW1lbnROUygobnMsIG5vZGUubm9kZU5hbWUpLCBub2RlLm5vZGVOYW1lKQorCisgICAgZGVmIHN0YXJ0UHJlZml4TWFwcGluZyhzZWxmLCBwcmVmaXgsIG5vZGVWYWx1ZSk6CisgICAgICAgICMgSWdub3JlIHRoZSBwcmVmaXggZm9yIG5vdy4KKyAgICAgICAgcGFzcworCisgICAgZGVmIGVuZFByZWZpeE1hcHBpbmcoc2VsZiwgcHJlZml4KToKKyAgICAgICAgIyBJZ25vcmUgdGhlIHByZWZpeCBmb3Igbm93LgorICAgICAgICAjIGhhbmRsZXIuZW5kUHJlZml4TWFwcGluZyhwcmVmaXgpCisgICAgICAgIHBhc3MKKworICAgIGRlZiBjaGFyYWN0ZXJzKHNlbGYsIGNvbnRlbnQpOgorICAgICAgICBzZWxmLnNvdXAuaGFuZGxlX2RhdGEoY29udGVudCkKKworICAgIGRlZiBzdGFydERvY3VtZW50KHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgZW5kRG9jdW1lbnQoc2VsZik6CisgICAgICAgIHBhc3MKKworCitjbGFzcyBIVE1MVHJlZUJ1aWxkZXIoVHJlZUJ1aWxkZXIpOgorICAgICIiIlRoaXMgVHJlZUJ1aWxkZXIga25vd3MgZmFjdHMgYWJvdXQgSFRNTC4KKworICAgIFN1Y2ggYXMgd2hpY2ggdGFncyBhcmUgZW1wdHktZWxlbWVudCB0YWdzLgorICAgICIiIgorCisgICAgcHJlc2VydmVfd2hpdGVzcGFjZV90YWdzID0gc2V0KFsncHJlJywgJ3RleHRhcmVhJ10pCisgICAgZW1wdHlfZWxlbWVudF90YWdzID0gc2V0KFsnYnInICwgJ2hyJywgJ2lucHV0JywgJ2ltZycsICdtZXRhJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcGFjZXInLCAnbGluaycsICdmcmFtZScsICdiYXNlJ10pCisKKyAgICAjIFRoZSBIVE1MIHN0YW5kYXJkIGRlZmluZXMgdGhlc2UgYXR0cmlidXRlcyBhcyBjb250YWluaW5nIGEKKyAgICAjIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHZhbHVlcywgbm90IGEgc2luZ2xlIHZhbHVlLiBUaGF0IGlzLAorICAgICMgY2xhc3M9ImZvbyBiYXIiIG1lYW5zIHRoYXQgdGhlICdjbGFzcycgYXR0cmlidXRlIGhhcyB0d28gdmFsdWVzLAorICAgICMgJ2ZvbycgYW5kICdiYXInLCBub3QgdGhlIHNpbmdsZSB2YWx1ZSAnZm9vIGJhcicuICBXaGVuIHdlCisgICAgIyBlbmNvdW50ZXIgb25lIG9mIHRoZXNlIGF0dHJpYnV0ZXMsIHdlIHdpbGwgcGFyc2UgaXRzIHZhbHVlIGludG8KKyAgICAjIGEgbGlzdCBvZiB2YWx1ZXMgaWYgcG9zc2libGUuIFVwb24gb3V0cHV0LCB0aGUgbGlzdCB3aWxsIGJlCisgICAgIyBjb252ZXJ0ZWQgYmFjayBpbnRvIGEgc3RyaW5nLgorICAgIGNkYXRhX2xpc3RfYXR0cmlidXRlcyA9IHsKKyAgICAgICAgIioiIDogWydjbGFzcycsICdhY2Nlc3NrZXknLCAnZHJvcHpvbmUnXSwKKyAgICAgICAgImEiIDogWydyZWwnLCAncmV2J10sCisgICAgICAgICJsaW5rIiA6ICBbJ3JlbCcsICdyZXYnXSwKKyAgICAgICAgInRkIiA6IFsiaGVhZGVycyJdLAorICAgICAgICAidGgiIDogWyJoZWFkZXJzIl0sCisgICAgICAgICJ0ZCIgOiBbImhlYWRlcnMiXSwKKyAgICAgICAgImZvcm0iIDogWyJhY2NlcHQtY2hhcnNldCJdLAorICAgICAgICAib2JqZWN0IiA6IFsiYXJjaGl2ZSJdLAorCisgICAgICAgICMgVGhlc2UgYXJlIEhUTUw1IHNwZWNpZmljLCBhcyBhcmUgKi5hY2Nlc3NrZXkgYW5kICouZHJvcHpvbmUgYWJvdmUuCisgICAgICAgICJhcmVhIiA6IFsicmVsIl0sCisgICAgICAgICJpY29uIiA6IFsic2l6ZXMiXSwKKyAgICAgICAgImlmcmFtZSIgOiBbInNhbmRib3giXSwKKyAgICAgICAgIm91dHB1dCIgOiBbImZvciJdLAorICAgICAgICB9CisKKyAgICBkZWYgc2V0X3VwX3N1YnN0aXR1dGlvbnMoc2VsZiwgdGFnKToKKyAgICAgICAgIyBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIDxtZXRhPiB0YWdzCisgICAgICAgIGlmIHRhZy5uYW1lICE9ICdtZXRhJzoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIGh0dHBfZXF1aXYgPSB0YWcuZ2V0KCdodHRwLWVxdWl2JykKKyAgICAgICAgY29udGVudCA9IHRhZy5nZXQoJ2NvbnRlbnQnKQorICAgICAgICBjaGFyc2V0ID0gdGFnLmdldCgnY2hhcnNldCcpCisKKyAgICAgICAgIyBXZSBhcmUgaW50ZXJlc3RlZCBpbiA8bWV0YT4gdGFncyB0aGF0IHNheSB3aGF0IGVuY29kaW5nIHRoZQorICAgICAgICAjIGRvY3VtZW50IHdhcyBvcmlnaW5hbGx5IGluLiBUaGlzIG1lYW5zIEhUTUwgNS1zdHlsZSA8bWV0YT4KKyAgICAgICAgIyB0YWdzIHRoYXQgcHJvdmlkZSB0aGUgImNoYXJzZXQiIGF0dHJpYnV0ZS4gSXQgYWxzbyBtZWFucworICAgICAgICAjIEhUTUwgNC1zdHlsZSA8bWV0YT4gdGFncyB0aGF0IHByb3ZpZGUgdGhlICJjb250ZW50IgorICAgICAgICAjIGF0dHJpYnV0ZSBhbmQgaGF2ZSAiaHR0cC1lcXVpdiIgc2V0IHRvICJjb250ZW50LXR5cGUiLgorICAgICAgICAjCisgICAgICAgICMgSW4gYm90aCBjYXNlcyB3ZSB3aWxsIHJlcGxhY2UgdGhlIHZhbHVlIG9mIHRoZSBhcHByb3ByaWF0ZQorICAgICAgICAjIGF0dHJpYnV0ZSB3aXRoIGEgc3RhbmRpbiBvYmplY3QgdGhhdCBjYW4gdGFrZSBvbiBhbnkKKyAgICAgICAgIyBlbmNvZGluZy4KKyAgICAgICAgbWV0YV9lbmNvZGluZyA9IE5vbmUKKyAgICAgICAgaWYgY2hhcnNldCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICMgSFRNTCA1IHN0eWxlOgorICAgICAgICAgICAgIyA8bWV0YSBjaGFyc2V0PSJ1dGY4Ij4KKyAgICAgICAgICAgIG1ldGFfZW5jb2RpbmcgPSBjaGFyc2V0CisgICAgICAgICAgICB0YWdbJ2NoYXJzZXQnXSA9IENoYXJzZXRNZXRhQXR0cmlidXRlVmFsdWUoY2hhcnNldCkKKworICAgICAgICBlbGlmIChjb250ZW50IGlzIG5vdCBOb25lIGFuZCBodHRwX2VxdWl2IGlzIG5vdCBOb25lCisgICAgICAgICAgICAgIGFuZCBodHRwX2VxdWl2Lmxvd2VyKCkgPT0gJ2NvbnRlbnQtdHlwZScpOgorICAgICAgICAgICAgIyBIVE1MIDQgc3R5bGU6CisgICAgICAgICAgICAjIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0ZjgiPgorICAgICAgICAgICAgdGFnWydjb250ZW50J10gPSBDb250ZW50TWV0YUF0dHJpYnV0ZVZhbHVlKGNvbnRlbnQpCisKKyAgICAgICAgcmV0dXJuIChtZXRhX2VuY29kaW5nIGlzIG5vdCBOb25lKQorCitkZWYgcmVnaXN0ZXJfdHJlZWJ1aWxkZXJzX2Zyb20obW9kdWxlKToKKyAgICAiIiJDb3B5IFRyZWVCdWlsZGVycyBmcm9tIHRoZSBnaXZlbiBtb2R1bGUgaW50byB0aGlzIG1vZHVsZS4iIiIKKyAgICAjIEknbSBmYWlybHkgc3VyZSB0aGlzIGlzIG5vdCB0aGUgYmVzdCB3YXkgdG8gZG8gdGhpcy4KKyAgICB0aGlzX21vZHVsZSA9IHN5cy5tb2R1bGVzWydiczQuYnVpbGRlciddCisgICAgZm9yIG5hbWUgaW4gbW9kdWxlLl9fYWxsX186CisgICAgICAgIG9iaiA9IGdldGF0dHIobW9kdWxlLCBuYW1lKQorCisgICAgICAgIGlmIGlzc3ViY2xhc3Mob2JqLCBUcmVlQnVpbGRlcik6CisgICAgICAgICAgICBzZXRhdHRyKHRoaXNfbW9kdWxlLCBuYW1lLCBvYmopCisgICAgICAgICAgICB0aGlzX21vZHVsZS5fX2FsbF9fLmFwcGVuZChuYW1lKQorICAgICAgICAgICAgIyBSZWdpc3RlciB0aGUgYnVpbGRlciB3aGlsZSB3ZSdyZSBhdCBpdC4KKyAgICAgICAgICAgIHRoaXNfbW9kdWxlLmJ1aWxkZXJfcmVnaXN0cnkucmVnaXN0ZXIob2JqKQorCitjbGFzcyBQYXJzZXJSZWplY3RlZE1hcmt1cChFeGNlcHRpb24pOgorICAgIHBhc3MKKworIyBCdWlsZGVycyBhcmUgcmVnaXN0ZXJlZCBpbiByZXZlcnNlIG9yZGVyIG9mIHByaW9yaXR5LCBzbyB0aGF0IGN1c3RvbQorIyBidWlsZGVyIHJlZ2lzdHJhdGlvbnMgd2lsbCB0YWtlIHByZWNlZGVuY2UuIEluIGdlbmVyYWwsIHdlIHdhbnQgbHhtbAorIyB0byB0YWtlIHByZWNlZGVuY2Ugb3ZlciBodG1sNWxpYiwgYmVjYXVzZSBpdCdzIGZhc3Rlci4gQW5kIHdlIG9ubHkKKyMgd2FudCB0byB1c2UgSFRNTFBhcnNlciBhcyBhIGxhc3QgcmVzdWx0LgorZnJvbSAuIGltcG9ydCBfaHRtbHBhcnNlcgorcmVnaXN0ZXJfdHJlZWJ1aWxkZXJzX2Zyb20oX2h0bWxwYXJzZXIpCit0cnk6CisgICAgZnJvbSAuIGltcG9ydCBfaHRtbDVsaWIKKyAgICByZWdpc3Rlcl90cmVlYnVpbGRlcnNfZnJvbShfaHRtbDVsaWIpCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgIyBUaGV5IGRvbid0IGhhdmUgaHRtbDVsaWIgaW5zdGFsbGVkLgorICAgIHBhc3MKK3RyeToKKyAgICBmcm9tIC4gaW1wb3J0IF9seG1sCisgICAgcmVnaXN0ZXJfdHJlZWJ1aWxkZXJzX2Zyb20oX2x4bWwpCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgIyBUaGV5IGRvbid0IGhhdmUgbHhtbCBpbnN0YWxsZWQuCisgICAgcGFzcwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYnM0L2J1aWxkZXIvX2h0bWw1bGliLnB5IGIvYml0YmFrZS9saWIvYnM0L2J1aWxkZXIvX2h0bWw1bGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZTM2YWU3Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYnM0L2J1aWxkZXIvX2h0bWw1bGliLnB5CkBAIC0wLDAgKzEsMjg1IEBACitfX2FsbF9fID0gWworICAgICdIVE1MNVRyZWVCdWlsZGVyJywKKyAgICBdCisKK2ltcG9ydCB3YXJuaW5ncworZnJvbSBiczQuYnVpbGRlciBpbXBvcnQgKAorICAgIFBFUk1JU1NJVkUsCisgICAgSFRNTCwKKyAgICBIVE1MXzUsCisgICAgSFRNTFRyZWVCdWlsZGVyLAorICAgICkKK2Zyb20gYnM0LmVsZW1lbnQgaW1wb3J0IE5hbWVzcGFjZWRBdHRyaWJ1dGUKK2ltcG9ydCBodG1sNWxpYgorZnJvbSBodG1sNWxpYi5jb25zdGFudHMgaW1wb3J0IG5hbWVzcGFjZXMKK2Zyb20gYnM0LmVsZW1lbnQgaW1wb3J0ICgKKyAgICBDb21tZW50LAorICAgIERvY3R5cGUsCisgICAgTmF2aWdhYmxlU3RyaW5nLAorICAgIFRhZywKKyAgICApCisKK2NsYXNzIEhUTUw1VHJlZUJ1aWxkZXIoSFRNTFRyZWVCdWlsZGVyKToKKyAgICAiIiJVc2UgaHRtbDVsaWIgdG8gYnVpbGQgYSB0cmVlLiIiIgorCisgICAgZmVhdHVyZXMgPSBbJ2h0bWw1bGliJywgUEVSTUlTU0lWRSwgSFRNTF81LCBIVE1MXQorCisgICAgZGVmIHByZXBhcmVfbWFya3VwKHNlbGYsIG1hcmt1cCwgdXNlcl9zcGVjaWZpZWRfZW5jb2RpbmcpOgorICAgICAgICAjIFN0b3JlIHRoZSB1c2VyLXNwZWNpZmllZCBlbmNvZGluZyBmb3IgdXNlIGxhdGVyIG9uLgorICAgICAgICBzZWxmLnVzZXJfc3BlY2lmaWVkX2VuY29kaW5nID0gdXNlcl9zcGVjaWZpZWRfZW5jb2RpbmcKKyAgICAgICAgeWllbGQgKG1hcmt1cCwgTm9uZSwgTm9uZSwgRmFsc2UpCisKKyAgICAjIFRoZXNlIG1ldGhvZHMgYXJlIGRlZmluZWQgYnkgQmVhdXRpZnVsIFNvdXAuCisgICAgZGVmIGZlZWQoc2VsZiwgbWFya3VwKToKKyAgICAgICAgaWYgc2VsZi5zb3VwLnBhcnNlX29ubHkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJZb3UgcHJvdmlkZWQgYSB2YWx1ZSBmb3IgcGFyc2Vfb25seSwgYnV0IHRoZSBodG1sNWxpYiB0cmVlIGJ1aWxkZXIgZG9lc24ndCBzdXBwb3J0IHBhcnNlX29ubHkuIFRoZSBlbnRpcmUgZG9jdW1lbnQgd2lsbCBiZSBwYXJzZWQuIikKKyAgICAgICAgcGFyc2VyID0gaHRtbDVsaWIuSFRNTFBhcnNlcih0cmVlPXNlbGYuY3JlYXRlX3RyZWVidWlsZGVyKQorICAgICAgICBkb2MgPSBwYXJzZXIucGFyc2UobWFya3VwLCBlbmNvZGluZz1zZWxmLnVzZXJfc3BlY2lmaWVkX2VuY29kaW5nKQorCisgICAgICAgICMgU2V0IHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgZGV0ZWN0ZWQgYnkgdGhlIHRva2VuaXplci4KKyAgICAgICAgaWYgaXNpbnN0YW5jZShtYXJrdXAsIHVuaWNvZGUpOgorICAgICAgICAgICAgIyBXZSBuZWVkIHRvIHNwZWNpYWwtY2FzZSB0aGlzIGJlY2F1c2UgaHRtbDVsaWIgc2V0cworICAgICAgICAgICAgIyBjaGFyRW5jb2RpbmcgdG8gVVRGLTggaWYgaXQgZ2V0cyBVbmljb2RlIGlucHV0LgorICAgICAgICAgICAgZG9jLm9yaWdpbmFsX2VuY29kaW5nID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZG9jLm9yaWdpbmFsX2VuY29kaW5nID0gcGFyc2VyLnRva2VuaXplci5zdHJlYW0uY2hhckVuY29kaW5nWzBdCisKKyAgICBkZWYgY3JlYXRlX3RyZWVidWlsZGVyKHNlbGYsIG5hbWVzcGFjZUhUTUxFbGVtZW50cyk6CisgICAgICAgIHNlbGYudW5kZXJseWluZ19idWlsZGVyID0gVHJlZUJ1aWxkZXJGb3JIdG1sNWxpYigKKyAgICAgICAgICAgIHNlbGYuc291cCwgbmFtZXNwYWNlSFRNTEVsZW1lbnRzKQorICAgICAgICByZXR1cm4gc2VsZi51bmRlcmx5aW5nX2J1aWxkZXIKKworICAgIGRlZiB0ZXN0X2ZyYWdtZW50X3RvX2RvY3VtZW50KHNlbGYsIGZyYWdtZW50KToKKyAgICAgICAgIiIiU2VlIGBUcmVlQnVpbGRlcmAuIiIiCisgICAgICAgIHJldHVybiB1JzxodG1sPjxoZWFkPjwvaGVhZD48Ym9keT4lczwvYm9keT48L2h0bWw+JyAlIGZyYWdtZW50CisKKworY2xhc3MgVHJlZUJ1aWxkZXJGb3JIdG1sNWxpYihodG1sNWxpYi50cmVlYnVpbGRlcnMuX2Jhc2UuVHJlZUJ1aWxkZXIpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNvdXAsIG5hbWVzcGFjZUhUTUxFbGVtZW50cyk6CisgICAgICAgIHNlbGYuc291cCA9IHNvdXAKKyAgICAgICAgc3VwZXIoVHJlZUJ1aWxkZXJGb3JIdG1sNWxpYiwgc2VsZikuX19pbml0X18obmFtZXNwYWNlSFRNTEVsZW1lbnRzKQorCisgICAgZGVmIGRvY3VtZW50Q2xhc3Moc2VsZik6CisgICAgICAgIHNlbGYuc291cC5yZXNldCgpCisgICAgICAgIHJldHVybiBFbGVtZW50KHNlbGYuc291cCwgc2VsZi5zb3VwLCBOb25lKQorCisgICAgZGVmIGluc2VydERvY3R5cGUoc2VsZiwgdG9rZW4pOgorICAgICAgICBuYW1lID0gdG9rZW5bIm5hbWUiXQorICAgICAgICBwdWJsaWNJZCA9IHRva2VuWyJwdWJsaWNJZCJdCisgICAgICAgIHN5c3RlbUlkID0gdG9rZW5bInN5c3RlbUlkIl0KKworICAgICAgICBkb2N0eXBlID0gRG9jdHlwZS5mb3JfbmFtZV9hbmRfaWRzKG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCkKKyAgICAgICAgc2VsZi5zb3VwLm9iamVjdF93YXNfcGFyc2VkKGRvY3R5cGUpCisKKyAgICBkZWYgZWxlbWVudENsYXNzKHNlbGYsIG5hbWUsIG5hbWVzcGFjZSk6CisgICAgICAgIHRhZyA9IHNlbGYuc291cC5uZXdfdGFnKG5hbWUsIG5hbWVzcGFjZSkKKyAgICAgICAgcmV0dXJuIEVsZW1lbnQodGFnLCBzZWxmLnNvdXAsIG5hbWVzcGFjZSkKKworICAgIGRlZiBjb21tZW50Q2xhc3Moc2VsZiwgZGF0YSk6CisgICAgICAgIHJldHVybiBUZXh0Tm9kZShDb21tZW50KGRhdGEpLCBzZWxmLnNvdXApCisKKyAgICBkZWYgZnJhZ21lbnRDbGFzcyhzZWxmKToKKyAgICAgICAgc2VsZi5zb3VwID0gQmVhdXRpZnVsU291cCgiIikKKyAgICAgICAgc2VsZi5zb3VwLm5hbWUgPSAiW2RvY3VtZW50X2ZyYWdtZW50XSIKKyAgICAgICAgcmV0dXJuIEVsZW1lbnQoc2VsZi5zb3VwLCBzZWxmLnNvdXAsIE5vbmUpCisKKyAgICBkZWYgYXBwZW5kQ2hpbGQoc2VsZiwgbm9kZSk6CisgICAgICAgICMgWFhYIFRoaXMgY29kZSBpcyBub3QgY292ZXJlZCBieSB0aGUgQlM0IHRlc3RzLgorICAgICAgICBzZWxmLnNvdXAuYXBwZW5kKG5vZGUuZWxlbWVudCkKKworICAgIGRlZiBnZXREb2N1bWVudChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc291cAorCisgICAgZGVmIGdldEZyYWdtZW50KHNlbGYpOgorICAgICAgICByZXR1cm4gaHRtbDVsaWIudHJlZWJ1aWxkZXJzLl9iYXNlLlRyZWVCdWlsZGVyLmdldEZyYWdtZW50KHNlbGYpLmVsZW1lbnQKKworY2xhc3MgQXR0ckxpc3Qob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZWxlbWVudCk6CisgICAgICAgIHNlbGYuZWxlbWVudCA9IGVsZW1lbnQKKyAgICAgICAgc2VsZi5hdHRycyA9IGRpY3Qoc2VsZi5lbGVtZW50LmF0dHJzKQorICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5hdHRycy5pdGVtcygpKS5fX2l0ZXJfXygpCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIG5hbWUsIHZhbHVlKToKKyAgICAgICAgInNldCBhdHRyIiwgbmFtZSwgdmFsdWUKKyAgICAgICAgc2VsZi5lbGVtZW50W25hbWVdID0gdmFsdWUKKyAgICBkZWYgaXRlbXMoc2VsZik6CisgICAgICAgIHJldHVybiBsaXN0KHNlbGYuYXR0cnMuaXRlbXMoKSkKKyAgICBkZWYga2V5cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5hdHRycy5rZXlzKCkpCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiBsZW4oc2VsZi5hdHRycykKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLmF0dHJzW25hbWVdCisgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuIG5hbWUgaW4gbGlzdChzZWxmLmF0dHJzLmtleXMoKSkKKworCitjbGFzcyBFbGVtZW50KGh0bWw1bGliLnRyZWVidWlsZGVycy5fYmFzZS5Ob2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZWxlbWVudCwgc291cCwgbmFtZXNwYWNlKToKKyAgICAgICAgaHRtbDVsaWIudHJlZWJ1aWxkZXJzLl9iYXNlLk5vZGUuX19pbml0X18oc2VsZiwgZWxlbWVudC5uYW1lKQorICAgICAgICBzZWxmLmVsZW1lbnQgPSBlbGVtZW50CisgICAgICAgIHNlbGYuc291cCA9IHNvdXAKKyAgICAgICAgc2VsZi5uYW1lc3BhY2UgPSBuYW1lc3BhY2UKKworICAgIGRlZiBhcHBlbmRDaGlsZChzZWxmLCBub2RlKToKKyAgICAgICAgc3RyaW5nX2NoaWxkID0gY2hpbGQgPSBOb25lCisgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICAjIFNvbWUgb3RoZXIgcGllY2Ugb2YgY29kZSBkZWNpZGVkIHRvIHBhc3MgaW4gYSBzdHJpbmcKKyAgICAgICAgICAgICMgaW5zdGVhZCBvZiBjcmVhdGluZyBhIFRleHRFbGVtZW50IG9iamVjdCB0byBjb250YWluIHRoZQorICAgICAgICAgICAgIyBzdHJpbmcuCisgICAgICAgICAgICBzdHJpbmdfY2hpbGQgPSBjaGlsZCA9IG5vZGUKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIFRhZyk6CisgICAgICAgICAgICAjIFNvbWUgb3RoZXIgcGllY2Ugb2YgY29kZSBkZWNpZGVkIHRvIHBhc3MgaW4gYSBUYWcKKyAgICAgICAgICAgICMgaW5zdGVhZCBvZiBjcmVhdGluZyBhbiBFbGVtZW50IG9iamVjdCB0byBjb250YWluIHRoZQorICAgICAgICAgICAgIyBUYWcuCisgICAgICAgICAgICBjaGlsZCA9IG5vZGUKKyAgICAgICAgZWxpZiBub2RlLmVsZW1lbnQuX19jbGFzc19fID09IE5hdmlnYWJsZVN0cmluZzoKKyAgICAgICAgICAgIHN0cmluZ19jaGlsZCA9IGNoaWxkID0gbm9kZS5lbGVtZW50CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjaGlsZCA9IG5vZGUuZWxlbWVudAorCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGNoaWxkLCBiYXNlc3RyaW5nKSBhbmQgY2hpbGQucGFyZW50IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbm9kZS5lbGVtZW50LmV4dHJhY3QoKQorCisgICAgICAgIGlmIChzdHJpbmdfY2hpbGQgYW5kIHNlbGYuZWxlbWVudC5jb250ZW50cworICAgICAgICAgICAgYW5kIHNlbGYuZWxlbWVudC5jb250ZW50c1stMV0uX19jbGFzc19fID09IE5hdmlnYWJsZVN0cmluZyk6CisgICAgICAgICAgICAjIFdlIGFyZSBhcHBlbmRpbmcgYSBzdHJpbmcgb250byBhbm90aGVyIHN0cmluZy4KKyAgICAgICAgICAgICMgVE9ETyBUaGlzIGhhcyBPKG5eMikgcGVyZm9ybWFuY2UsIGZvciBpbnB1dCBsaWtlCisgICAgICAgICAgICAjICJhPC9hPmE8L2E+YTwvYT4uLi4iCisgICAgICAgICAgICBvbGRfZWxlbWVudCA9IHNlbGYuZWxlbWVudC5jb250ZW50c1stMV0KKyAgICAgICAgICAgIG5ld19lbGVtZW50ID0gc2VsZi5zb3VwLm5ld19zdHJpbmcob2xkX2VsZW1lbnQgKyBzdHJpbmdfY2hpbGQpCisgICAgICAgICAgICBvbGRfZWxlbWVudC5yZXBsYWNlX3dpdGgobmV3X2VsZW1lbnQpCisgICAgICAgICAgICBzZWxmLnNvdXAuX21vc3RfcmVjZW50X2VsZW1lbnQgPSBuZXdfZWxlbWVudAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgICAgICAjIENyZWF0ZSBhIGJyYW5kIG5ldyBOYXZpZ2FibGVTdHJpbmcgZnJvbSB0aGlzIHN0cmluZy4KKyAgICAgICAgICAgICAgICBjaGlsZCA9IHNlbGYuc291cC5uZXdfc3RyaW5nKG5vZGUpCisKKyAgICAgICAgICAgICMgVGVsbCBCZWF1dGlmdWwgU291cCB0byBhY3QgYXMgaWYgaXQgcGFyc2VkIHRoaXMgZWxlbWVudAorICAgICAgICAgICAgIyBpbW1lZGlhdGVseSBhZnRlciB0aGUgcGFyZW50J3MgbGFzdCBkZXNjZW5kYW50LiAoT3IKKyAgICAgICAgICAgICMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHBhcmVudCwgaWYgaXQgaGFzIG5vIGNoaWxkcmVuLikKKyAgICAgICAgICAgIGlmIHNlbGYuZWxlbWVudC5jb250ZW50czoKKyAgICAgICAgICAgICAgICBtb3N0X3JlY2VudF9lbGVtZW50ID0gc2VsZi5lbGVtZW50Ll9sYXN0X2Rlc2NlbmRhbnQoRmFsc2UpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG1vc3RfcmVjZW50X2VsZW1lbnQgPSBzZWxmLmVsZW1lbnQKKworICAgICAgICAgICAgc2VsZi5zb3VwLm9iamVjdF93YXNfcGFyc2VkKAorICAgICAgICAgICAgICAgIGNoaWxkLCBwYXJlbnQ9c2VsZi5lbGVtZW50LAorICAgICAgICAgICAgICAgIG1vc3RfcmVjZW50X2VsZW1lbnQ9bW9zdF9yZWNlbnRfZWxlbWVudCkKKworICAgIGRlZiBnZXRBdHRyaWJ1dGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gQXR0ckxpc3Qoc2VsZi5lbGVtZW50KQorCisgICAgZGVmIHNldEF0dHJpYnV0ZXMoc2VsZiwgYXR0cmlidXRlcyk6CisgICAgICAgIGlmIGF0dHJpYnV0ZXMgaXMgbm90IE5vbmUgYW5kIGxlbihhdHRyaWJ1dGVzKSA+IDA6CisKKyAgICAgICAgICAgIGNvbnZlcnRlZF9hdHRyaWJ1dGVzID0gW10KKyAgICAgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBsaXN0KGF0dHJpYnV0ZXMuaXRlbXMoKSk6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShuYW1lLCB0dXBsZSk6CisgICAgICAgICAgICAgICAgICAgIG5ld19uYW1lID0gTmFtZXNwYWNlZEF0dHJpYnV0ZSgqbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgZGVsIGF0dHJpYnV0ZXNbbmFtZV0KKyAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1tuZXdfbmFtZV0gPSB2YWx1ZQorCisgICAgICAgICAgICBzZWxmLnNvdXAuYnVpbGRlci5fcmVwbGFjZV9jZGF0YV9saXN0X2F0dHJpYnV0ZV92YWx1ZXMoCisgICAgICAgICAgICAgICAgc2VsZi5uYW1lLCBhdHRyaWJ1dGVzKQorICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIGF0dHJpYnV0ZXMuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBzZWxmLmVsZW1lbnRbbmFtZV0gPSB2YWx1ZQorCisgICAgICAgICAgICAjIFRoZSBhdHRyaWJ1dGVzIG1heSBjb250YWluIHZhcmlhYmxlcyB0aGF0IG5lZWQgc3Vic3RpdHV0aW9uLgorICAgICAgICAgICAgIyBDYWxsIHNldF91cF9zdWJzdGl0dXRpb25zIG1hbnVhbGx5LgorICAgICAgICAgICAgIworICAgICAgICAgICAgIyBUaGUgVGFnIGNvbnN0cnVjdG9yIGNhbGxlZCB0aGlzIG1ldGhvZCB3aGVuIHRoZSBUYWcgd2FzIGNyZWF0ZWQsCisgICAgICAgICAgICAjIGJ1dCB3ZSBqdXN0IHNldC9jaGFuZ2VkIHRoZSBhdHRyaWJ1dGVzLCBzbyBjYWxsIGl0IGFnYWluLgorICAgICAgICAgICAgc2VsZi5zb3VwLmJ1aWxkZXIuc2V0X3VwX3N1YnN0aXR1dGlvbnMoc2VsZi5lbGVtZW50KQorICAgIGF0dHJpYnV0ZXMgPSBwcm9wZXJ0eShnZXRBdHRyaWJ1dGVzLCBzZXRBdHRyaWJ1dGVzKQorCisgICAgZGVmIGluc2VydFRleHQoc2VsZiwgZGF0YSwgaW5zZXJ0QmVmb3JlPU5vbmUpOgorICAgICAgICBpZiBpbnNlcnRCZWZvcmU6CisgICAgICAgICAgICB0ZXh0ID0gVGV4dE5vZGUoc2VsZi5zb3VwLm5ld19zdHJpbmcoZGF0YSksIHNlbGYuc291cCkKKyAgICAgICAgICAgIHNlbGYuaW5zZXJ0QmVmb3JlKGRhdGEsIGluc2VydEJlZm9yZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXBwZW5kQ2hpbGQoZGF0YSkKKworICAgIGRlZiBpbnNlcnRCZWZvcmUoc2VsZiwgbm9kZSwgcmVmTm9kZSk6CisgICAgICAgIGluZGV4ID0gc2VsZi5lbGVtZW50LmluZGV4KHJlZk5vZGUuZWxlbWVudCkKKyAgICAgICAgaWYgKG5vZGUuZWxlbWVudC5fX2NsYXNzX18gPT0gTmF2aWdhYmxlU3RyaW5nIGFuZCBzZWxmLmVsZW1lbnQuY29udGVudHMKKyAgICAgICAgICAgIGFuZCBzZWxmLmVsZW1lbnQuY29udGVudHNbaW5kZXgtMV0uX19jbGFzc19fID09IE5hdmlnYWJsZVN0cmluZyk6CisgICAgICAgICAgICAjIChTZWUgY29tbWVudHMgaW4gYXBwZW5kQ2hpbGQpCisgICAgICAgICAgICBvbGRfbm9kZSA9IHNlbGYuZWxlbWVudC5jb250ZW50c1tpbmRleC0xXQorICAgICAgICAgICAgbmV3X3N0ciA9IHNlbGYuc291cC5uZXdfc3RyaW5nKG9sZF9ub2RlICsgbm9kZS5lbGVtZW50KQorICAgICAgICAgICAgb2xkX25vZGUucmVwbGFjZV93aXRoKG5ld19zdHIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmVsZW1lbnQuaW5zZXJ0KGluZGV4LCBub2RlLmVsZW1lbnQpCisgICAgICAgICAgICBub2RlLnBhcmVudCA9IHNlbGYKKworICAgIGRlZiByZW1vdmVDaGlsZChzZWxmLCBub2RlKToKKyAgICAgICAgbm9kZS5lbGVtZW50LmV4dHJhY3QoKQorCisgICAgZGVmIHJlcGFyZW50Q2hpbGRyZW4oc2VsZiwgbmV3X3BhcmVudCk6CisgICAgICAgICIiIk1vdmUgYWxsIG9mIHRoaXMgdGFnJ3MgY2hpbGRyZW4gaW50byBhbm90aGVyIHRhZy4iIiIKKyAgICAgICAgZWxlbWVudCA9IHNlbGYuZWxlbWVudAorICAgICAgICBuZXdfcGFyZW50X2VsZW1lbnQgPSBuZXdfcGFyZW50LmVsZW1lbnQKKyAgICAgICAgIyBEZXRlcm1pbmUgd2hhdCB0aGlzIHRhZydzIG5leHRfZWxlbWVudCB3aWxsIGJlIG9uY2UgYWxsIHRoZSBjaGlsZHJlbgorICAgICAgICAjIGFyZSByZW1vdmVkLgorICAgICAgICBmaW5hbF9uZXh0X2VsZW1lbnQgPSBlbGVtZW50Lm5leHRfc2libGluZworCisgICAgICAgIG5ld19wYXJlbnRzX2xhc3RfZGVzY2VuZGFudCA9IG5ld19wYXJlbnRfZWxlbWVudC5fbGFzdF9kZXNjZW5kYW50KEZhbHNlLCBGYWxzZSkKKyAgICAgICAgaWYgbGVuKG5ld19wYXJlbnRfZWxlbWVudC5jb250ZW50cykgPiAwOgorICAgICAgICAgICAgIyBUaGUgbmV3IHBhcmVudCBhbHJlYWR5IGNvbnRhaW5zIGNoaWxkcmVuLiBXZSB3aWxsIGJlCisgICAgICAgICAgICAjIGFwcGVuZGluZyB0aGlzIHRhZydzIGNoaWxkcmVuIHRvIHRoZSBlbmQuCisgICAgICAgICAgICBuZXdfcGFyZW50c19sYXN0X2NoaWxkID0gbmV3X3BhcmVudF9lbGVtZW50LmNvbnRlbnRzWy0xXQorICAgICAgICAgICAgbmV3X3BhcmVudHNfbGFzdF9kZXNjZW5kYW50X25leHRfZWxlbWVudCA9IG5ld19wYXJlbnRzX2xhc3RfZGVzY2VuZGFudC5uZXh0X2VsZW1lbnQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgVGhlIG5ldyBwYXJlbnQgY29udGFpbnMgbm8gY2hpbGRyZW4uCisgICAgICAgICAgICBuZXdfcGFyZW50c19sYXN0X2NoaWxkID0gTm9uZQorICAgICAgICAgICAgbmV3X3BhcmVudHNfbGFzdF9kZXNjZW5kYW50X25leHRfZWxlbWVudCA9IG5ld19wYXJlbnRfZWxlbWVudC5uZXh0X2VsZW1lbnQKKworICAgICAgICB0b19hcHBlbmQgPSBlbGVtZW50LmNvbnRlbnRzCisgICAgICAgIGFwcGVuZF9hZnRlciA9IG5ld19wYXJlbnQuZWxlbWVudC5jb250ZW50cworICAgICAgICBpZiBsZW4odG9fYXBwZW5kKSA+IDA6CisgICAgICAgICAgICAjIFNldCB0aGUgZmlyc3QgY2hpbGQncyBwcmV2aW91c19lbGVtZW50IGFuZCBwcmV2aW91c19zaWJsaW5nCisgICAgICAgICAgICAjIHRvIGVsZW1lbnRzIHdpdGhpbiB0aGUgbmV3IHBhcmVudAorICAgICAgICAgICAgZmlyc3RfY2hpbGQgPSB0b19hcHBlbmRbMF0KKyAgICAgICAgICAgIGZpcnN0X2NoaWxkLnByZXZpb3VzX2VsZW1lbnQgPSBuZXdfcGFyZW50c19sYXN0X2Rlc2NlbmRhbnQKKyAgICAgICAgICAgIGZpcnN0X2NoaWxkLnByZXZpb3VzX3NpYmxpbmcgPSBuZXdfcGFyZW50c19sYXN0X2NoaWxkCisKKyAgICAgICAgICAgICMgRml4IHRoZSBsYXN0IGNoaWxkJ3MgbmV4dF9lbGVtZW50IGFuZCBuZXh0X3NpYmxpbmcKKyAgICAgICAgICAgIGxhc3RfY2hpbGQgPSB0b19hcHBlbmRbLTFdCisgICAgICAgICAgICBsYXN0X2NoaWxkLm5leHRfZWxlbWVudCA9IG5ld19wYXJlbnRzX2xhc3RfZGVzY2VuZGFudF9uZXh0X2VsZW1lbnQKKyAgICAgICAgICAgIGxhc3RfY2hpbGQubmV4dF9zaWJsaW5nID0gTm9uZQorCisgICAgICAgIGZvciBjaGlsZCBpbiB0b19hcHBlbmQ6CisgICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSBuZXdfcGFyZW50X2VsZW1lbnQKKyAgICAgICAgICAgIG5ld19wYXJlbnRfZWxlbWVudC5jb250ZW50cy5hcHBlbmQoY2hpbGQpCisKKyAgICAgICAgIyBOb3cgdGhhdCB0aGlzIGVsZW1lbnQgaGFzIG5vIGNoaWxkcmVuLCBjaGFuZ2UgaXRzIC5uZXh0X2VsZW1lbnQuCisgICAgICAgIGVsZW1lbnQuY29udGVudHMgPSBbXQorICAgICAgICBlbGVtZW50Lm5leHRfZWxlbWVudCA9IGZpbmFsX25leHRfZWxlbWVudAorCisgICAgZGVmIGNsb25lTm9kZShzZWxmKToKKyAgICAgICAgdGFnID0gc2VsZi5zb3VwLm5ld190YWcoc2VsZi5lbGVtZW50Lm5hbWUsIHNlbGYubmFtZXNwYWNlKQorICAgICAgICBub2RlID0gRWxlbWVudCh0YWcsIHNlbGYuc291cCwgc2VsZi5uYW1lc3BhY2UpCisgICAgICAgIGZvciBrZXksdmFsdWUgaW4gc2VsZi5hdHRyaWJ1dGVzOgorICAgICAgICAgICAgbm9kZS5hdHRyaWJ1dGVzW2tleV0gPSB2YWx1ZQorICAgICAgICByZXR1cm4gbm9kZQorCisgICAgZGVmIGhhc0NvbnRlbnQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmVsZW1lbnQuY29udGVudHMKKworICAgIGRlZiBnZXROYW1lVHVwbGUoc2VsZik6CisgICAgICAgIGlmIHNlbGYubmFtZXNwYWNlID09IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gbmFtZXNwYWNlc1siaHRtbCJdLCBzZWxmLm5hbWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWVzcGFjZSwgc2VsZi5uYW1lCisKKyAgICBuYW1lVHVwbGUgPSBwcm9wZXJ0eShnZXROYW1lVHVwbGUpCisKK2NsYXNzIFRleHROb2RlKEVsZW1lbnQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlbGVtZW50LCBzb3VwKToKKyAgICAgICAgaHRtbDVsaWIudHJlZWJ1aWxkZXJzLl9iYXNlLk5vZGUuX19pbml0X18oc2VsZiwgTm9uZSkKKyAgICAgICAgc2VsZi5lbGVtZW50ID0gZWxlbWVudAorICAgICAgICBzZWxmLnNvdXAgPSBzb3VwCisKKyAgICBkZWYgY2xvbmVOb2RlKHNlbGYpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iczQvYnVpbGRlci9faHRtbHBhcnNlci5weSBiL2JpdGJha2UvbGliL2JzNC9idWlsZGVyL19odG1scGFyc2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhOGQ4YjgKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iczQvYnVpbGRlci9faHRtbHBhcnNlci5weQpAQCAtMCwwICsxLDI1OCBAQAorIiIiVXNlIHRoZSBIVE1MUGFyc2VyIGxpYnJhcnkgdG8gcGFyc2UgSFRNTCBmaWxlcyB0aGF0IGFyZW4ndCB0b28gYmFkLiIiIgorCitfX2FsbF9fID0gWworICAgICdIVE1MUGFyc2VyVHJlZUJ1aWxkZXInLAorICAgIF0KKworZnJvbSBIVE1MUGFyc2VyIGltcG9ydCAoCisgICAgSFRNTFBhcnNlciwKKyAgICBIVE1MUGFyc2VFcnJvciwKKyAgICApCitpbXBvcnQgc3lzCitpbXBvcnQgd2FybmluZ3MKKworIyBTdGFydGluZyBpbiBQeXRob24gMy4yLCB0aGUgSFRNTFBhcnNlciBjb25zdHJ1Y3RvciB0YWtlcyBhICdzdHJpY3QnCisjIGFyZ3VtZW50LCB3aGljaCB3ZSdkIGxpa2UgdG8gc2V0IHRvIEZhbHNlLiBVbmZvcnR1bmF0ZWx5LAorIyBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTMyNzMgbWFrZXMgc3RyaWN0PVRydWUgYSBiZXR0ZXIgYmV0CisjIGJlZm9yZSBQeXRob24gMy4yLjMuCisjCisjIEF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlLCB3ZSBtb25rZXlwYXRjaCBIVE1MUGFyc2VyIHNvIHRoYXQKKyMgc3RyaWN0PVRydWUgd29ya3Mgd2VsbCBvbiBQeXRob24gMy4yLjIuCittYWpvciwgbWlub3IsIHJlbGVhc2UgPSBzeXMudmVyc2lvbl9pbmZvWzozXQorQ09OU1RSVUNUT1JfVEFLRVNfU1RSSUNUID0gKAorICAgIG1ham9yID4gMworICAgIG9yIChtYWpvciA9PSAzIGFuZCBtaW5vciA+IDIpCisgICAgb3IgKG1ham9yID09IDMgYW5kIG1pbm9yID09IDIgYW5kIHJlbGVhc2UgPj0gMykpCisKK2Zyb20gYnM0LmVsZW1lbnQgaW1wb3J0ICgKKyAgICBDRGF0YSwKKyAgICBDb21tZW50LAorICAgIERlY2xhcmF0aW9uLAorICAgIERvY3R5cGUsCisgICAgUHJvY2Vzc2luZ0luc3RydWN0aW9uLAorICAgICkKK2Zyb20gYnM0LmRhbW1pdCBpbXBvcnQgRW50aXR5U3Vic3RpdHV0aW9uLCBVbmljb2RlRGFtbWl0CisKK2Zyb20gYnM0LmJ1aWxkZXIgaW1wb3J0ICgKKyAgICBIVE1MLAorICAgIEhUTUxUcmVlQnVpbGRlciwKKyAgICBTVFJJQ1QsCisgICAgKQorCisKK0hUTUxQQVJTRVIgPSAnaHRtbC5wYXJzZXInCisKK2NsYXNzIEJlYXV0aWZ1bFNvdXBIVE1MUGFyc2VyKEhUTUxQYXJzZXIpOgorICAgIGRlZiBoYW5kbGVfc3RhcnR0YWcoc2VsZiwgbmFtZSwgYXR0cnMpOgorICAgICAgICAjIFhYWCBuYW1lc3BhY2UKKyAgICAgICAgYXR0cl9kaWN0ID0ge30KKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gYXR0cnM6CisgICAgICAgICAgICAjIENoYW5nZSBOb25lIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gdGhlIGVtcHR5IHN0cmluZworICAgICAgICAgICAgIyBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgb3RoZXIgdHJlZSBidWlsZGVycy4KKyAgICAgICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgdmFsdWUgPSAnJworICAgICAgICAgICAgYXR0cl9kaWN0W2tleV0gPSB2YWx1ZQorICAgICAgICAgICAgYXR0cnZhbHVlID0gJyIiJworICAgICAgICBzZWxmLnNvdXAuaGFuZGxlX3N0YXJ0dGFnKG5hbWUsIE5vbmUsIE5vbmUsIGF0dHJfZGljdCkKKworICAgIGRlZiBoYW5kbGVfZW5kdGFnKHNlbGYsIG5hbWUpOgorICAgICAgICBzZWxmLnNvdXAuaGFuZGxlX2VuZHRhZyhuYW1lKQorCisgICAgZGVmIGhhbmRsZV9kYXRhKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLnNvdXAuaGFuZGxlX2RhdGEoZGF0YSkKKworICAgIGRlZiBoYW5kbGVfY2hhcnJlZihzZWxmLCBuYW1lKToKKyAgICAgICAgIyBYWFggd29ya2Fyb3VuZCBmb3IgYSBidWcgaW4gSFRNTFBhcnNlci4gUmVtb3ZlIHRoaXMgb25jZQorICAgICAgICAjIGl0J3MgZml4ZWQuCisgICAgICAgIGlmIG5hbWUuc3RhcnRzd2l0aCgneCcpOgorICAgICAgICAgICAgcmVhbF9uYW1lID0gaW50KG5hbWUubHN0cmlwKCd4JyksIDE2KQorICAgICAgICBlbGlmIG5hbWUuc3RhcnRzd2l0aCgnWCcpOgorICAgICAgICAgICAgcmVhbF9uYW1lID0gaW50KG5hbWUubHN0cmlwKCdYJyksIDE2KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVhbF9uYW1lID0gaW50KG5hbWUpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGF0YSA9IHVuaWNocihyZWFsX25hbWUpCisgICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgT3ZlcmZsb3dFcnJvciksIGU6CisgICAgICAgICAgICBkYXRhID0gdSJcTntSRVBMQUNFTUVOVCBDSEFSQUNURVJ9IgorCisgICAgICAgIHNlbGYuaGFuZGxlX2RhdGEoZGF0YSkKKworICAgIGRlZiBoYW5kbGVfZW50aXR5cmVmKHNlbGYsIG5hbWUpOgorICAgICAgICBjaGFyYWN0ZXIgPSBFbnRpdHlTdWJzdGl0dXRpb24uSFRNTF9FTlRJVFlfVE9fQ0hBUkFDVEVSLmdldChuYW1lKQorICAgICAgICBpZiBjaGFyYWN0ZXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBkYXRhID0gY2hhcmFjdGVyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkYXRhID0gIiYlczsiICUgbmFtZQorICAgICAgICBzZWxmLmhhbmRsZV9kYXRhKGRhdGEpCisKKyAgICBkZWYgaGFuZGxlX2NvbW1lbnQoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuc291cC5lbmREYXRhKCkKKyAgICAgICAgc2VsZi5zb3VwLmhhbmRsZV9kYXRhKGRhdGEpCisgICAgICAgIHNlbGYuc291cC5lbmREYXRhKENvbW1lbnQpCisKKyAgICBkZWYgaGFuZGxlX2RlY2woc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuc291cC5lbmREYXRhKCkKKyAgICAgICAgaWYgZGF0YS5zdGFydHN3aXRoKCJET0NUWVBFICIpOgorICAgICAgICAgICAgZGF0YSA9IGRhdGFbbGVuKCJET0NUWVBFICIpOl0KKyAgICAgICAgZWxpZiBkYXRhID09ICdET0NUWVBFJzoKKyAgICAgICAgICAgICMgaS5lLiAiPCFET0NUWVBFPiIKKyAgICAgICAgICAgIGRhdGEgPSAnJworICAgICAgICBzZWxmLnNvdXAuaGFuZGxlX2RhdGEoZGF0YSkKKyAgICAgICAgc2VsZi5zb3VwLmVuZERhdGEoRG9jdHlwZSkKKworICAgIGRlZiB1bmtub3duX2RlY2woc2VsZiwgZGF0YSk6CisgICAgICAgIGlmIGRhdGEudXBwZXIoKS5zdGFydHN3aXRoKCdDREFUQVsnKToKKyAgICAgICAgICAgIGNscyA9IENEYXRhCisgICAgICAgICAgICBkYXRhID0gZGF0YVtsZW4oJ0NEQVRBWycpOl0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNscyA9IERlY2xhcmF0aW9uCisgICAgICAgIHNlbGYuc291cC5lbmREYXRhKCkKKyAgICAgICAgc2VsZi5zb3VwLmhhbmRsZV9kYXRhKGRhdGEpCisgICAgICAgIHNlbGYuc291cC5lbmREYXRhKGNscykKKworICAgIGRlZiBoYW5kbGVfcGkoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuc291cC5lbmREYXRhKCkKKyAgICAgICAgaWYgZGF0YS5lbmRzd2l0aCgiPyIpIGFuZCBkYXRhLmxvd2VyKCkuc3RhcnRzd2l0aCgieG1sIik6CisgICAgICAgICAgICAjICJBbiBYSFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHVzaW5nIHRoZSB0cmFpbGluZyAnPycKKyAgICAgICAgICAgICMgd2lsbCBjYXVzZSB0aGUgJz8nIHRvIGJlIGluY2x1ZGVkIGluIGRhdGEuIiAtIEhUTUxQYXJzZXIKKyAgICAgICAgICAgICMgZG9jcy4KKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgU3RyaXAgdGhlIHF1ZXN0aW9uIG1hcmsgc28gd2UgZG9uJ3QgZW5kIHVwIHdpdGggdHdvCisgICAgICAgICAgICAjIHF1ZXN0aW9uIG1hcmtzLgorICAgICAgICAgICAgZGF0YSA9IGRhdGFbOi0xXQorICAgICAgICBzZWxmLnNvdXAuaGFuZGxlX2RhdGEoZGF0YSkKKyAgICAgICAgc2VsZi5zb3VwLmVuZERhdGEoUHJvY2Vzc2luZ0luc3RydWN0aW9uKQorCisKK2NsYXNzIEhUTUxQYXJzZXJUcmVlQnVpbGRlcihIVE1MVHJlZUJ1aWxkZXIpOgorCisgICAgaXNfeG1sID0gRmFsc2UKKyAgICBmZWF0dXJlcyA9IFtIVE1MLCBTVFJJQ1QsIEhUTUxQQVJTRVJdCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgaWYgQ09OU1RSVUNUT1JfVEFLRVNfU1RSSUNUOgorICAgICAgICAgICAga3dhcmdzWydzdHJpY3QnXSA9IEZhbHNlCisgICAgICAgIHNlbGYucGFyc2VyX2FyZ3MgPSAoYXJncywga3dhcmdzKQorCisgICAgZGVmIHByZXBhcmVfbWFya3VwKHNlbGYsIG1hcmt1cCwgdXNlcl9zcGVjaWZpZWRfZW5jb2Rpbmc9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRfZGVjbGFyZWRfZW5jb2Rpbmc9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICA6cmV0dXJuOiBBIDQtdHVwbGUgKG1hcmt1cCwgb3JpZ2luYWwgZW5jb2RpbmcsIGVuY29kaW5nCisgICAgICAgIGRlY2xhcmVkIHdpdGhpbiBtYXJrdXAsIHdoZXRoZXIgYW55IGNoYXJhY3RlcnMgaGFkIHRvIGJlCisgICAgICAgIHJlcGxhY2VkIHdpdGggUkVQTEFDRU1FTlQgQ0hBUkFDVEVSKS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGlzaW5zdGFuY2UobWFya3VwLCB1bmljb2RlKToKKyAgICAgICAgICAgIHlpZWxkIChtYXJrdXAsIE5vbmUsIE5vbmUsIEZhbHNlKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgdHJ5X2VuY29kaW5ncyA9IFt1c2VyX3NwZWNpZmllZF9lbmNvZGluZywgZG9jdW1lbnRfZGVjbGFyZWRfZW5jb2RpbmddCisgICAgICAgIGRhbW1pdCA9IFVuaWNvZGVEYW1taXQobWFya3VwLCB0cnlfZW5jb2RpbmdzLCBpc19odG1sPVRydWUpCisgICAgICAgIHlpZWxkIChkYW1taXQubWFya3VwLCBkYW1taXQub3JpZ2luYWxfZW5jb2RpbmcsCisgICAgICAgICAgICAgICBkYW1taXQuZGVjbGFyZWRfaHRtbF9lbmNvZGluZywKKyAgICAgICAgICAgICAgIGRhbW1pdC5jb250YWluc19yZXBsYWNlbWVudF9jaGFyYWN0ZXJzKQorCisgICAgZGVmIGZlZWQoc2VsZiwgbWFya3VwKToKKyAgICAgICAgYXJncywga3dhcmdzID0gc2VsZi5wYXJzZXJfYXJncworICAgICAgICBwYXJzZXIgPSBCZWF1dGlmdWxTb3VwSFRNTFBhcnNlcigqYXJncywgKiprd2FyZ3MpCisgICAgICAgIHBhcnNlci5zb3VwID0gc2VsZi5zb3VwCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBhcnNlci5mZWVkKG1hcmt1cCkKKyAgICAgICAgZXhjZXB0IEhUTUxQYXJzZUVycm9yLCBlOgorICAgICAgICAgICAgd2FybmluZ3Mud2FybihSdW50aW1lV2FybmluZygKKyAgICAgICAgICAgICAgICAiUHl0aG9uJ3MgYnVpbHQtaW4gSFRNTFBhcnNlciBjYW5ub3QgcGFyc2UgdGhlIGdpdmVuIGRvY3VtZW50LiBUaGlzIGlzIG5vdCBhIGJ1ZyBpbiBCZWF1dGlmdWwgU291cC4gVGhlIGJlc3Qgc29sdXRpb24gaXMgdG8gaW5zdGFsbCBhbiBleHRlcm5hbCBwYXJzZXIgKGx4bWwgb3IgaHRtbDVsaWIpLCBhbmQgdXNlIEJlYXV0aWZ1bCBTb3VwIHdpdGggdGhhdCBwYXJzZXIuIFNlZSBodHRwOi8vd3d3LmNydW1teS5jb20vc29mdHdhcmUvQmVhdXRpZnVsU291cC9iczQvZG9jLyNpbnN0YWxsaW5nLWEtcGFyc2VyIGZvciBoZWxwLiIpKQorICAgICAgICAgICAgcmFpc2UgZQorCisjIFBhdGNoIDMuMiB2ZXJzaW9ucyBvZiBIVE1MUGFyc2VyIGVhcmxpZXIgdGhhbiAzLjIuMyB0byB1c2Ugc29tZQorIyAzLjIuMyBjb2RlLiBUaGlzIGVuc3VyZXMgdGhleSBkb24ndCB0cmVhdCBtYXJrdXAgbGlrZSA8cD48L3A+IGFzIGEKKyMgc3RyaW5nLgorIworIyBYWFggVGhpcyBjb2RlIGNhbiBiZSByZW1vdmVkIG9uY2UgbW9zdCBQeXRob24gMyB1c2VycyBhcmUgb24gMy4yLjMuCitpZiBtYWpvciA9PSAzIGFuZCBtaW5vciA9PSAyIGFuZCBub3QgQ09OU1RSVUNUT1JfVEFLRVNfU1RSSUNUOgorICAgIGltcG9ydCByZQorICAgIGF0dHJmaW5kX3RvbGVyYW50ID0gcmUuY29tcGlsZSgKKyAgICAgICAgcidccyooKD88PVtcJyJcc10pW15ccy8+XVteXHMvPT5dKikoXHMqPStccyonCisgICAgICAgIHInKFwnW15cJ10qXCd8IlteIl0qInwoPyFbXCciXSlbXj5cc10qKSk/JykKKyAgICBIVE1MUGFyc2VyVHJlZUJ1aWxkZXIuYXR0cmZpbmRfdG9sZXJhbnQgPSBhdHRyZmluZF90b2xlcmFudAorCisgICAgbG9jYXRlc3RhcnR0YWdlbmQgPSByZS5jb21waWxlKHIiIiIKKyAgPFthLXpBLVpdWy0uYS16QS1aMC05Ol9dKiAgICAgICAgICAjIHRhZyBuYW1lCisgICg/OlxzKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3aGl0ZXNwYWNlIGJlZm9yZSBhdHRyaWJ1dGUgbmFtZQorICAgICg/OlthLXpBLVpfXVstLjphLXpBLVowLTlfXSogICAgICMgYXR0cmlidXRlIG5hbWUKKyAgICAgICg/OlxzKj1ccyogICAgICAgICAgICAgICAgICAgICAjIHZhbHVlIGluZGljYXRvcgorICAgICAgICAoPzonW14nXSonICAgICAgICAgICAgICAgICAgICMgTElUQS1lbmNsb3NlZCB2YWx1ZQorICAgICAgICAgIHxcIlteXCJdKlwiICAgICAgICAgICAgICAgICMgTElULWVuY2xvc2VkIHZhbHVlCisgICAgICAgICAgfFteJ1wiPlxzXSsgICAgICAgICAgICAgICAgIyBiYXJlIHZhbHVlCisgICAgICAgICApCisgICAgICAgKT8KKyAgICAgKQorICAgKSoKKyAgXHMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRyYWlsaW5nIHdoaXRlc3BhY2UKKyIiIiwgcmUuVkVSQk9TRSkKKyAgICBCZWF1dGlmdWxTb3VwSFRNTFBhcnNlci5sb2NhdGVzdGFydHRhZ2VuZCA9IGxvY2F0ZXN0YXJ0dGFnZW5kCisKKyAgICBmcm9tIGh0bWwucGFyc2VyIGltcG9ydCB0YWdmaW5kLCBhdHRyZmluZAorCisgICAgZGVmIHBhcnNlX3N0YXJ0dGFnKHNlbGYsIGkpOgorICAgICAgICBzZWxmLl9fc3RhcnR0YWdfdGV4dCA9IE5vbmUKKyAgICAgICAgZW5kcG9zID0gc2VsZi5jaGVja19mb3Jfd2hvbGVfc3RhcnRfdGFnKGkpCisgICAgICAgIGlmIGVuZHBvcyA8IDA6CisgICAgICAgICAgICByZXR1cm4gZW5kcG9zCisgICAgICAgIHJhd2RhdGEgPSBzZWxmLnJhd2RhdGEKKyAgICAgICAgc2VsZi5fX3N0YXJ0dGFnX3RleHQgPSByYXdkYXRhW2k6ZW5kcG9zXQorCisgICAgICAgICMgTm93IHBhcnNlIHRoZSBkYXRhIGJldHdlZW4gaSsxIGFuZCBqIGludG8gYSB0YWcgYW5kIGF0dHJzCisgICAgICAgIGF0dHJzID0gW10KKyAgICAgICAgbWF0Y2ggPSB0YWdmaW5kLm1hdGNoKHJhd2RhdGEsIGkrMSkKKyAgICAgICAgYXNzZXJ0IG1hdGNoLCAndW5leHBlY3RlZCBjYWxsIHRvIHBhcnNlX3N0YXJ0dGFnKCknCisgICAgICAgIGsgPSBtYXRjaC5lbmQoKQorICAgICAgICBzZWxmLmxhc3R0YWcgPSB0YWcgPSByYXdkYXRhW2krMTprXS5sb3dlcigpCisgICAgICAgIHdoaWxlIGsgPCBlbmRwb3M6CisgICAgICAgICAgICBpZiBzZWxmLnN0cmljdDoKKyAgICAgICAgICAgICAgICBtID0gYXR0cmZpbmQubWF0Y2gocmF3ZGF0YSwgaykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbSA9IGF0dHJmaW5kX3RvbGVyYW50Lm1hdGNoKHJhd2RhdGEsIGspCisgICAgICAgICAgICBpZiBub3QgbToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgYXR0cm5hbWUsIHJlc3QsIGF0dHJ2YWx1ZSA9IG0uZ3JvdXAoMSwgMiwgMykKKyAgICAgICAgICAgIGlmIG5vdCByZXN0OgorICAgICAgICAgICAgICAgIGF0dHJ2YWx1ZSA9IE5vbmUKKyAgICAgICAgICAgIGVsaWYgYXR0cnZhbHVlWzoxXSA9PSAnXCcnID09IGF0dHJ2YWx1ZVstMTpdIG9yIFwKKyAgICAgICAgICAgICAgICAgYXR0cnZhbHVlWzoxXSA9PSAnIicgPT0gYXR0cnZhbHVlWy0xOl06CisgICAgICAgICAgICAgICAgYXR0cnZhbHVlID0gYXR0cnZhbHVlWzE6LTFdCisgICAgICAgICAgICBpZiBhdHRydmFsdWU6CisgICAgICAgICAgICAgICAgYXR0cnZhbHVlID0gc2VsZi51bmVzY2FwZShhdHRydmFsdWUpCisgICAgICAgICAgICBhdHRycy5hcHBlbmQoKGF0dHJuYW1lLmxvd2VyKCksIGF0dHJ2YWx1ZSkpCisgICAgICAgICAgICBrID0gbS5lbmQoKQorCisgICAgICAgIGVuZCA9IHJhd2RhdGFbazplbmRwb3NdLnN0cmlwKCkKKyAgICAgICAgaWYgZW5kIG5vdCBpbiAoIj4iLCAiLz4iKToKKyAgICAgICAgICAgIGxpbmVubywgb2Zmc2V0ID0gc2VsZi5nZXRwb3MoKQorICAgICAgICAgICAgaWYgIlxuIiBpbiBzZWxmLl9fc3RhcnR0YWdfdGV4dDoKKyAgICAgICAgICAgICAgICBsaW5lbm8gPSBsaW5lbm8gKyBzZWxmLl9fc3RhcnR0YWdfdGV4dC5jb3VudCgiXG4iKQorICAgICAgICAgICAgICAgIG9mZnNldCA9IGxlbihzZWxmLl9fc3RhcnR0YWdfdGV4dCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgIC0gc2VsZi5fX3N0YXJ0dGFnX3RleHQucmZpbmQoIlxuIikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0ICsgbGVuKHNlbGYuX19zdGFydHRhZ190ZXh0KQorICAgICAgICAgICAgaWYgc2VsZi5zdHJpY3Q6CisgICAgICAgICAgICAgICAgc2VsZi5lcnJvcigianVuayBjaGFyYWN0ZXJzIGluIHN0YXJ0IHRhZzogJXIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChyYXdkYXRhW2s6ZW5kcG9zXVs6MjBdLCkpCisgICAgICAgICAgICBzZWxmLmhhbmRsZV9kYXRhKHJhd2RhdGFbaTplbmRwb3NdKQorICAgICAgICAgICAgcmV0dXJuIGVuZHBvcworICAgICAgICBpZiBlbmQuZW5kc3dpdGgoJy8+Jyk6CisgICAgICAgICAgICAjIFhIVE1MLXN0eWxlIGVtcHR5IHRhZzogPHNwYW4gYXR0cj0idmFsdWUiIC8+CisgICAgICAgICAgICBzZWxmLmhhbmRsZV9zdGFydGVuZHRhZyh0YWcsIGF0dHJzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5oYW5kbGVfc3RhcnR0YWcodGFnLCBhdHRycykKKyAgICAgICAgICAgIGlmIHRhZyBpbiBzZWxmLkNEQVRBX0NPTlRFTlRfRUxFTUVOVFM6CisgICAgICAgICAgICAgICAgc2VsZi5zZXRfY2RhdGFfbW9kZSh0YWcpCisgICAgICAgIHJldHVybiBlbmRwb3MKKworICAgIGRlZiBzZXRfY2RhdGFfbW9kZShzZWxmLCBlbGVtKToKKyAgICAgICAgc2VsZi5jZGF0YV9lbGVtID0gZWxlbS5sb3dlcigpCisgICAgICAgIHNlbGYuaW50ZXJlc3RpbmcgPSByZS5jb21waWxlKHInPC9ccyolc1xzKj4nICUgc2VsZi5jZGF0YV9lbGVtLCByZS5JKQorCisgICAgQmVhdXRpZnVsU291cEhUTUxQYXJzZXIucGFyc2Vfc3RhcnR0YWcgPSBwYXJzZV9zdGFydHRhZworICAgIEJlYXV0aWZ1bFNvdXBIVE1MUGFyc2VyLnNldF9jZGF0YV9tb2RlID0gc2V0X2NkYXRhX21vZGUKKworICAgIENPTlNUUlVDVE9SX1RBS0VTX1NUUklDVCA9IFRydWUKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JzNC9idWlsZGVyL19seG1sLnB5IGIvYml0YmFrZS9saWIvYnM0L2J1aWxkZXIvX2x4bWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE1ZDQ5OAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JzNC9idWlsZGVyL19seG1sLnB5CkBAIC0wLDAgKzEsMjMzIEBACitfX2FsbF9fID0gWworICAgICdMWE1MVHJlZUJ1aWxkZXJGb3JYTUwnLAorICAgICdMWE1MVHJlZUJ1aWxkZXInLAorICAgIF0KKworZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTworZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2ltcG9ydCBjb2xsZWN0aW9ucworZnJvbSBseG1sIGltcG9ydCBldHJlZQorZnJvbSBiczQuZWxlbWVudCBpbXBvcnQgQ29tbWVudCwgRG9jdHlwZSwgTmFtZXNwYWNlZEF0dHJpYnV0ZQorZnJvbSBiczQuYnVpbGRlciBpbXBvcnQgKAorICAgIEZBU1QsCisgICAgSFRNTCwKKyAgICBIVE1MVHJlZUJ1aWxkZXIsCisgICAgUEVSTUlTU0lWRSwKKyAgICBQYXJzZXJSZWplY3RlZE1hcmt1cCwKKyAgICBUcmVlQnVpbGRlciwKKyAgICBYTUwpCitmcm9tIGJzNC5kYW1taXQgaW1wb3J0IEVuY29kaW5nRGV0ZWN0b3IKKworTFhNTCA9ICdseG1sJworCitjbGFzcyBMWE1MVHJlZUJ1aWxkZXJGb3JYTUwoVHJlZUJ1aWxkZXIpOgorICAgIERFRkFVTFRfUEFSU0VSX0NMQVNTID0gZXRyZWUuWE1MUGFyc2VyCisKKyAgICBpc194bWwgPSBUcnVlCisKKyAgICAjIFdlbGwsIGl0J3MgcGVybWlzc2l2ZSBieSBYTUwgcGFyc2VyIHN0YW5kYXJkcy4KKyAgICBmZWF0dXJlcyA9IFtMWE1MLCBYTUwsIEZBU1QsIFBFUk1JU1NJVkVdCisKKyAgICBDSFVOS19TSVpFID0gNTEyCisKKyAgICAjIFRoaXMgbmFtZXNwYWNlIG1hcHBpbmcgaXMgc3BlY2lmaWVkIGluIHRoZSBYTUwgTmFtZXNwYWNlCisgICAgIyBzdGFuZGFyZC4KKyAgICBERUZBVUxUX05TTUFQUyA9IHsnaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlJyA6ICJ4bWwifQorCisgICAgZGVmIGRlZmF1bHRfcGFyc2VyKHNlbGYsIGVuY29kaW5nKToKKyAgICAgICAgIyBUaGlzIGNhbiBlaXRoZXIgcmV0dXJuIGEgcGFyc2VyIG9iamVjdCBvciBhIGNsYXNzLCB3aGljaAorICAgICAgICAjIHdpbGwgYmUgaW5zdGFudGlhdGVkIHdpdGggZGVmYXVsdCBhcmd1bWVudHMuCisgICAgICAgIGlmIHNlbGYuX2RlZmF1bHRfcGFyc2VyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2RlZmF1bHRfcGFyc2VyCisgICAgICAgIHJldHVybiBldHJlZS5YTUxQYXJzZXIoCisgICAgICAgICAgICB0YXJnZXQ9c2VsZiwgc3RyaXBfY2RhdGE9RmFsc2UsIHJlY292ZXI9VHJ1ZSwgZW5jb2Rpbmc9ZW5jb2RpbmcpCisKKyAgICBkZWYgcGFyc2VyX2ZvcihzZWxmLCBlbmNvZGluZyk6CisgICAgICAgICMgVXNlIHRoZSBkZWZhdWx0IHBhcnNlci4KKyAgICAgICAgcGFyc2VyID0gc2VsZi5kZWZhdWx0X3BhcnNlcihlbmNvZGluZykKKworICAgICAgICBpZiBpc2luc3RhbmNlKHBhcnNlciwgY29sbGVjdGlvbnMuQ2FsbGFibGUpOgorICAgICAgICAgICAgIyBJbnN0YW50aWF0ZSB0aGUgcGFyc2VyIHdpdGggZGVmYXVsdCBhcmd1bWVudHMKKyAgICAgICAgICAgIHBhcnNlciA9IHBhcnNlcih0YXJnZXQ9c2VsZiwgc3RyaXBfY2RhdGE9RmFsc2UsIGVuY29kaW5nPWVuY29kaW5nKQorICAgICAgICByZXR1cm4gcGFyc2VyCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyc2VyPU5vbmUsIGVtcHR5X2VsZW1lbnRfdGFncz1Ob25lKToKKyAgICAgICAgIyBUT0RPOiBJc3N1ZSBhIHdhcm5pbmcgaWYgcGFyc2VyIGlzIHByZXNlbnQgYnV0IG5vdCBhCisgICAgICAgICMgY2FsbGFibGUsIHNpbmNlIHRoYXQgbWVhbnMgdGhlcmUncyBubyB3YXkgdG8gY3JlYXRlIG5ldworICAgICAgICAjIHBhcnNlcnMgZm9yIGRpZmZlcmVudCBlbmNvZGluZ3MuCisgICAgICAgIHNlbGYuX2RlZmF1bHRfcGFyc2VyID0gcGFyc2VyCisgICAgICAgIGlmIGVtcHR5X2VsZW1lbnRfdGFncyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZW1wdHlfZWxlbWVudF90YWdzID0gc2V0KGVtcHR5X2VsZW1lbnRfdGFncykKKyAgICAgICAgc2VsZi5zb3VwID0gTm9uZQorICAgICAgICBzZWxmLm5zbWFwcyA9IFtzZWxmLkRFRkFVTFRfTlNNQVBTXQorCisgICAgZGVmIF9nZXROc1RhZyhzZWxmLCB0YWcpOgorICAgICAgICAjIFNwbGl0IHRoZSBuYW1lc3BhY2UgVVJMIG91dCBvZiBhIGZ1bGx5LXF1YWxpZmllZCBseG1sIHRhZworICAgICAgICAjIG5hbWUuIENvcGllZCBmcm9tIGx4bWwncyBzcmMvbHhtbC9zYXgucHkuCisgICAgICAgIGlmIHRhZ1swXSA9PSAneyc6CisgICAgICAgICAgICByZXR1cm4gdHVwbGUodGFnWzE6XS5zcGxpdCgnfScsIDEpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIChOb25lLCB0YWcpCisKKyAgICBkZWYgcHJlcGFyZV9tYXJrdXAoc2VsZiwgbWFya3VwLCB1c2VyX3NwZWNpZmllZF9lbmNvZGluZz1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudF9kZWNsYXJlZF9lbmNvZGluZz1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIDp5aWVsZDogQSBzZXJpZXMgb2YgNC10dXBsZXMuCisgICAgICAgICAobWFya3VwLCBlbmNvZGluZywgZGVjbGFyZWQgZW5jb2RpbmcsCisgICAgICAgICAgaGFzIHVuZGVyZ29uZSBjaGFyYWN0ZXIgcmVwbGFjZW1lbnQpCisKKyAgICAgICAgRWFjaCA0LXR1cGxlIHJlcHJlc2VudHMgYSBzdHJhdGVneSBmb3IgcGFyc2luZyB0aGUgZG9jdW1lbnQuCisgICAgICAgICIiIgorICAgICAgICBpZiBpc2luc3RhbmNlKG1hcmt1cCwgdW5pY29kZSk6CisgICAgICAgICAgICAjIFdlIHdlcmUgZ2l2ZW4gVW5pY29kZS4gTWF5YmUgbHhtbCBjYW4gcGFyc2UgVW5pY29kZSBvbgorICAgICAgICAgICAgIyB0aGlzIHN5c3RlbT8KKyAgICAgICAgICAgIHlpZWxkIG1hcmt1cCwgTm9uZSwgZG9jdW1lbnRfZGVjbGFyZWRfZW5jb2RpbmcsIEZhbHNlCisKKyAgICAgICAgaWYgaXNpbnN0YW5jZShtYXJrdXAsIHVuaWNvZGUpOgorICAgICAgICAgICAgIyBObywgYXBwYXJlbnRseSBub3QuIENvbnZlcnQgdGhlIFVuaWNvZGUgdG8gVVRGLTggYW5kCisgICAgICAgICAgICAjIHRlbGwgbHhtbCB0byBwYXJzZSBpdCBhcyBVVEYtOC4KKyAgICAgICAgICAgIHlpZWxkIChtYXJrdXAuZW5jb2RlKCJ1dGY4IiksICJ1dGY4IiwKKyAgICAgICAgICAgICAgICAgICBkb2N1bWVudF9kZWNsYXJlZF9lbmNvZGluZywgRmFsc2UpCisKKyAgICAgICAgIyBJbnN0ZWFkIG9mIHVzaW5nIFVuaWNvZGVEYW1taXQgdG8gY29udmVydCB0aGUgYnl0ZXN0cmluZyB0bworICAgICAgICAjIFVuaWNvZGUgdXNpbmcgZGlmZmVyZW50IGVuY29kaW5ncywgdXNlIEVuY29kaW5nRGV0ZWN0b3IgdG8KKyAgICAgICAgIyBpdGVyYXRlIG92ZXIgdGhlIGVuY29kaW5ncywgYW5kIHRlbGwgbHhtbCB0byB0cnkgdG8gcGFyc2UKKyAgICAgICAgIyB0aGUgZG9jdW1lbnQgYXMgZWFjaCBvbmUgaW4gdHVybi4KKyAgICAgICAgaXNfaHRtbCA9IG5vdCBzZWxmLmlzX3htbAorICAgICAgICB0cnlfZW5jb2RpbmdzID0gW3VzZXJfc3BlY2lmaWVkX2VuY29kaW5nLCBkb2N1bWVudF9kZWNsYXJlZF9lbmNvZGluZ10KKyAgICAgICAgZGV0ZWN0b3IgPSBFbmNvZGluZ0RldGVjdG9yKG1hcmt1cCwgdHJ5X2VuY29kaW5ncywgaXNfaHRtbCkKKyAgICAgICAgZm9yIGVuY29kaW5nIGluIGRldGVjdG9yLmVuY29kaW5nczoKKyAgICAgICAgICAgIHlpZWxkIChkZXRlY3Rvci5tYXJrdXAsIGVuY29kaW5nLCBkb2N1bWVudF9kZWNsYXJlZF9lbmNvZGluZywgRmFsc2UpCisKKyAgICBkZWYgZmVlZChzZWxmLCBtYXJrdXApOgorICAgICAgICBpZiBpc2luc3RhbmNlKG1hcmt1cCwgYnl0ZXMpOgorICAgICAgICAgICAgbWFya3VwID0gQnl0ZXNJTyhtYXJrdXApCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShtYXJrdXAsIHVuaWNvZGUpOgorICAgICAgICAgICAgbWFya3VwID0gU3RyaW5nSU8obWFya3VwKQorCisgICAgICAgICMgQ2FsbCBmZWVkKCkgYXQgbGVhc3Qgb25jZSwgZXZlbiBpZiB0aGUgbWFya3VwIGlzIGVtcHR5LAorICAgICAgICAjIG9yIHRoZSBwYXJzZXIgd29uJ3QgYmUgaW5pdGlhbGl6ZWQuCisgICAgICAgIGRhdGEgPSBtYXJrdXAucmVhZChzZWxmLkNIVU5LX1NJWkUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYucGFyc2VyID0gc2VsZi5wYXJzZXJfZm9yKHNlbGYuc291cC5vcmlnaW5hbF9lbmNvZGluZykKKyAgICAgICAgICAgIHNlbGYucGFyc2VyLmZlZWQoZGF0YSkKKyAgICAgICAgICAgIHdoaWxlIGxlbihkYXRhKSAhPSAwOgorICAgICAgICAgICAgICAgICMgTm93IGNhbGwgZmVlZCgpIG9uIHRoZSByZXN0IG9mIHRoZSBkYXRhLCBjaHVuayBieSBjaHVuay4KKyAgICAgICAgICAgICAgICBkYXRhID0gbWFya3VwLnJlYWQoc2VsZi5DSFVOS19TSVpFKQorICAgICAgICAgICAgICAgIGlmIGxlbihkYXRhKSAhPSAwOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5mZWVkKGRhdGEpCisgICAgICAgICAgICBzZWxmLnBhcnNlci5jbG9zZSgpCisgICAgICAgIGV4Y2VwdCAoVW5pY29kZURlY29kZUVycm9yLCBMb29rdXBFcnJvciwgZXRyZWUuUGFyc2VyRXJyb3IpLCBlOgorICAgICAgICAgICAgcmFpc2UgUGFyc2VyUmVqZWN0ZWRNYXJrdXAoc3RyKGUpKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLm5zbWFwcyA9IFtzZWxmLkRFRkFVTFRfTlNNQVBTXQorCisgICAgZGVmIHN0YXJ0KHNlbGYsIG5hbWUsIGF0dHJzLCBuc21hcD17fSk6CisgICAgICAgICMgTWFrZSBzdXJlIGF0dHJzIGlzIGEgbXV0YWJsZSBkaWN0LS1seG1sIG1heSBzZW5kIGFuIGltbXV0YWJsZSBkaWN0cHJveHkuCisgICAgICAgIGF0dHJzID0gZGljdChhdHRycykKKyAgICAgICAgbnNwcmVmaXggPSBOb25lCisgICAgICAgICMgSW52ZXJ0IGVhY2ggbmFtZXNwYWNlIG1hcCBhcyBpdCBjb21lcyBpbi4KKyAgICAgICAgaWYgbGVuKHNlbGYubnNtYXBzKSA+IDE6CisgICAgICAgICAgICAjIFRoZXJlIGFyZSBubyBuZXcgbmFtZXNwYWNlcyBmb3IgdGhpcyB0YWcsIGJ1dAorICAgICAgICAgICAgIyBub24tZGVmYXVsdCBuYW1lc3BhY2VzIGFyZSBpbiBwbGF5LCBzbyB3ZSBuZWVkIGEKKyAgICAgICAgICAgICMgc2VwYXJhdGUgdGFnIHN0YWNrIHRvIGtub3cgd2hlbiB0aGV5IGVuZC4KKyAgICAgICAgICAgIHNlbGYubnNtYXBzLmFwcGVuZChOb25lKQorICAgICAgICBlbGlmIGxlbihuc21hcCkgPiAwOgorICAgICAgICAgICAgIyBBIG5ldyBuYW1lc3BhY2UgbWFwcGluZyBoYXMgY29tZSBpbnRvIHBsYXkuCisgICAgICAgICAgICBpbnZlcnRlZF9uc21hcCA9IGRpY3QoKHZhbHVlLCBrZXkpIGZvciBrZXksIHZhbHVlIGluIG5zbWFwLml0ZW1zKCkpCisgICAgICAgICAgICBzZWxmLm5zbWFwcy5hcHBlbmQoaW52ZXJ0ZWRfbnNtYXApCisgICAgICAgICAgICAjIEFsc28gdHJlYXQgdGhlIG5hbWVzcGFjZSBtYXBwaW5nIGFzIGEgc2V0IG9mIGF0dHJpYnV0ZXMgb24gdGhlCisgICAgICAgICAgICAjIHRhZywgc28gd2UgY2FuIHJlY3JlYXRlIGl0IGxhdGVyLgorICAgICAgICAgICAgYXR0cnMgPSBhdHRycy5jb3B5KCkKKyAgICAgICAgICAgIGZvciBwcmVmaXgsIG5hbWVzcGFjZSBpbiBuc21hcC5pdGVtcygpOgorICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9IE5hbWVzcGFjZWRBdHRyaWJ1dGUoCisgICAgICAgICAgICAgICAgICAgICJ4bWxucyIsIHByZWZpeCwgImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIikKKyAgICAgICAgICAgICAgICBhdHRyc1thdHRyaWJ1dGVdID0gbmFtZXNwYWNlCisKKyAgICAgICAgIyBOYW1lc3BhY2VzIGFyZSBpbiBwbGF5LiBGaW5kIGFueSBhdHRyaWJ1dGVzIHRoYXQgY2FtZSBpbgorICAgICAgICAjIGZyb20gbHhtbCB3aXRoIG5hbWVzcGFjZXMgYXR0YWNoZWQgdG8gdGhlaXIgbmFtZXMsIGFuZAorICAgICAgICAjIHR1cm4gdGhlbiBpbnRvIE5hbWVzcGFjZWRBdHRyaWJ1dGUgb2JqZWN0cy4KKyAgICAgICAgbmV3X2F0dHJzID0ge30KKyAgICAgICAgZm9yIGF0dHIsIHZhbHVlIGluIGF0dHJzLml0ZW1zKCk6CisgICAgICAgICAgICBuYW1lc3BhY2UsIGF0dHIgPSBzZWxmLl9nZXROc1RhZyhhdHRyKQorICAgICAgICAgICAgaWYgbmFtZXNwYWNlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgbmV3X2F0dHJzW2F0dHJdID0gdmFsdWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbnNwcmVmaXggPSBzZWxmLl9wcmVmaXhfZm9yX25hbWVzcGFjZShuYW1lc3BhY2UpCisgICAgICAgICAgICAgICAgYXR0ciA9IE5hbWVzcGFjZWRBdHRyaWJ1dGUobnNwcmVmaXgsIGF0dHIsIG5hbWVzcGFjZSkKKyAgICAgICAgICAgICAgICBuZXdfYXR0cnNbYXR0cl0gPSB2YWx1ZQorICAgICAgICBhdHRycyA9IG5ld19hdHRycworCisgICAgICAgIG5hbWVzcGFjZSwgbmFtZSA9IHNlbGYuX2dldE5zVGFnKG5hbWUpCisgICAgICAgIG5zcHJlZml4ID0gc2VsZi5fcHJlZml4X2Zvcl9uYW1lc3BhY2UobmFtZXNwYWNlKQorICAgICAgICBzZWxmLnNvdXAuaGFuZGxlX3N0YXJ0dGFnKG5hbWUsIG5hbWVzcGFjZSwgbnNwcmVmaXgsIGF0dHJzKQorCisgICAgZGVmIF9wcmVmaXhfZm9yX25hbWVzcGFjZShzZWxmLCBuYW1lc3BhY2UpOgorICAgICAgICAiIiJGaW5kIHRoZSBjdXJyZW50bHkgYWN0aXZlIHByZWZpeCBmb3IgdGhlIGdpdmVuIG5hbWVzcGFjZS4iIiIKKyAgICAgICAgaWYgbmFtZXNwYWNlIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBmb3IgaW52ZXJ0ZWRfbnNtYXAgaW4gcmV2ZXJzZWQoc2VsZi5uc21hcHMpOgorICAgICAgICAgICAgaWYgaW52ZXJ0ZWRfbnNtYXAgaXMgbm90IE5vbmUgYW5kIG5hbWVzcGFjZSBpbiBpbnZlcnRlZF9uc21hcDoKKyAgICAgICAgICAgICAgICByZXR1cm4gaW52ZXJ0ZWRfbnNtYXBbbmFtZXNwYWNlXQorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIGVuZChzZWxmLCBuYW1lKToKKyAgICAgICAgc2VsZi5zb3VwLmVuZERhdGEoKQorICAgICAgICBjb21wbGV0ZWRfdGFnID0gc2VsZi5zb3VwLnRhZ1N0YWNrWy0xXQorICAgICAgICBuYW1lc3BhY2UsIG5hbWUgPSBzZWxmLl9nZXROc1RhZyhuYW1lKQorICAgICAgICBuc3ByZWZpeCA9IE5vbmUKKyAgICAgICAgaWYgbmFtZXNwYWNlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZm9yIGludmVydGVkX25zbWFwIGluIHJldmVyc2VkKHNlbGYubnNtYXBzKToKKyAgICAgICAgICAgICAgICBpZiBpbnZlcnRlZF9uc21hcCBpcyBub3QgTm9uZSBhbmQgbmFtZXNwYWNlIGluIGludmVydGVkX25zbWFwOgorICAgICAgICAgICAgICAgICAgICBuc3ByZWZpeCA9IGludmVydGVkX25zbWFwW25hbWVzcGFjZV0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgc2VsZi5zb3VwLmhhbmRsZV9lbmR0YWcobmFtZSwgbnNwcmVmaXgpCisgICAgICAgIGlmIGxlbihzZWxmLm5zbWFwcykgPiAxOgorICAgICAgICAgICAgIyBUaGlzIHRhZywgb3Igb25lIG9mIGl0cyBwYXJlbnRzLCBpbnRyb2R1Y2VkIGEgbmFtZXNwYWNlCisgICAgICAgICAgICAjIG1hcHBpbmcsIHNvIHBvcCBpdCBvZmYgdGhlIHN0YWNrLgorICAgICAgICAgICAgc2VsZi5uc21hcHMucG9wKCkKKworICAgIGRlZiBwaShzZWxmLCB0YXJnZXQsIGRhdGEpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgZGF0YShzZWxmLCBjb250ZW50KToKKyAgICAgICAgc2VsZi5zb3VwLmhhbmRsZV9kYXRhKGNvbnRlbnQpCisKKyAgICBkZWYgZG9jdHlwZShzZWxmLCBuYW1lLCBwdWJpZCwgc3lzdGVtKToKKyAgICAgICAgc2VsZi5zb3VwLmVuZERhdGEoKQorICAgICAgICBkb2N0eXBlID0gRG9jdHlwZS5mb3JfbmFtZV9hbmRfaWRzKG5hbWUsIHB1YmlkLCBzeXN0ZW0pCisgICAgICAgIHNlbGYuc291cC5vYmplY3Rfd2FzX3BhcnNlZChkb2N0eXBlKQorCisgICAgZGVmIGNvbW1lbnQoc2VsZiwgY29udGVudCk6CisgICAgICAgICJIYW5kbGUgY29tbWVudHMgYXMgQ29tbWVudCBvYmplY3RzLiIKKyAgICAgICAgc2VsZi5zb3VwLmVuZERhdGEoKQorICAgICAgICBzZWxmLnNvdXAuaGFuZGxlX2RhdGEoY29udGVudCkKKyAgICAgICAgc2VsZi5zb3VwLmVuZERhdGEoQ29tbWVudCkKKworICAgIGRlZiB0ZXN0X2ZyYWdtZW50X3RvX2RvY3VtZW50KHNlbGYsIGZyYWdtZW50KToKKyAgICAgICAgIiIiU2VlIGBUcmVlQnVpbGRlcmAuIiIiCisgICAgICAgIHJldHVybiB1Jzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+XG4lcycgJSBmcmFnbWVudAorCisKK2NsYXNzIExYTUxUcmVlQnVpbGRlcihIVE1MVHJlZUJ1aWxkZXIsIExYTUxUcmVlQnVpbGRlckZvclhNTCk6CisKKyAgICBmZWF0dXJlcyA9IFtMWE1MLCBIVE1MLCBGQVNULCBQRVJNSVNTSVZFXQorICAgIGlzX3htbCA9IEZhbHNlCisKKyAgICBkZWYgZGVmYXVsdF9wYXJzZXIoc2VsZiwgZW5jb2RpbmcpOgorICAgICAgICByZXR1cm4gZXRyZWUuSFRNTFBhcnNlcgorCisgICAgZGVmIGZlZWQoc2VsZiwgbWFya3VwKToKKyAgICAgICAgZW5jb2RpbmcgPSBzZWxmLnNvdXAub3JpZ2luYWxfZW5jb2RpbmcKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5wYXJzZXIgPSBzZWxmLnBhcnNlcl9mb3IoZW5jb2RpbmcpCisgICAgICAgICAgICBzZWxmLnBhcnNlci5mZWVkKG1hcmt1cCkKKyAgICAgICAgICAgIHNlbGYucGFyc2VyLmNsb3NlKCkKKyAgICAgICAgZXhjZXB0IChVbmljb2RlRGVjb2RlRXJyb3IsIExvb2t1cEVycm9yLCBldHJlZS5QYXJzZXJFcnJvciksIGU6CisgICAgICAgICAgICByYWlzZSBQYXJzZXJSZWplY3RlZE1hcmt1cChzdHIoZSkpCisKKworICAgIGRlZiB0ZXN0X2ZyYWdtZW50X3RvX2RvY3VtZW50KHNlbGYsIGZyYWdtZW50KToKKyAgICAgICAgIiIiU2VlIGBUcmVlQnVpbGRlcmAuIiIiCisgICAgICAgIHJldHVybiB1JzxodG1sPjxib2R5PiVzPC9ib2R5PjwvaHRtbD4nICUgZnJhZ21lbnQKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JzNC9kYW1taXQucHkgYi9iaXRiYWtlL2xpYi9iczQvZGFtbWl0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NjQwYjcKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iczQvZGFtbWl0LnB5CkBAIC0wLDAgKzEsODI5IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIiIiQmVhdXRpZnVsIFNvdXAgYm9udXMgbGlicmFyeTogVW5pY29kZSwgRGFtbWl0CisKK1RoaXMgbGlicmFyeSBjb252ZXJ0cyBhIGJ5dGVzdHJlYW0gdG8gVW5pY29kZSB0aHJvdWdoIGFueSBtZWFucworbmVjZXNzYXJ5LiBJdCBpcyBoZWF2aWx5IGJhc2VkIG9uIGNvZGUgZnJvbSBNYXJrIFBpbGdyaW0ncyBVbml2ZXJzYWwKK0ZlZWQgUGFyc2VyLiBJdCB3b3JrcyBiZXN0IG9uIFhNTCBhbmQgWE1MLCBidXQgaXQgZG9lcyBub3QgcmV3cml0ZSB0aGUKK1hNTCBvciBIVE1MIHRvIHJlZmxlY3QgYSBuZXcgZW5jb2Rpbmc7IHRoYXQncyB0aGUgdHJlZSBidWlsZGVyJ3Mgam9iLgorIiIiCisKK2ltcG9ydCBjb2RlY3MKK2Zyb20gaHRtbGVudGl0eWRlZnMgaW1wb3J0IGNvZGVwb2ludDJuYW1lCitpbXBvcnQgcmUKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgc3RyaW5nCisKKyMgSW1wb3J0IGEgbGlicmFyeSB0byBhdXRvZGV0ZWN0IGNoYXJhY3RlciBlbmNvZGluZ3MuCitjaGFyZGV0X3R5cGUgPSBOb25lCit0cnk6CisgICAgIyBGaXJzdCB0cnkgdGhlIGZhc3QgQyBpbXBsZW1lbnRhdGlvbi4KKyAgICAjICBQeVBJIHBhY2thZ2U6IGNjaGFyZGV0CisgICAgaW1wb3J0IGNjaGFyZGV0CisgICAgZGVmIGNoYXJkZXRfZGFtbWl0KHMpOgorICAgICAgICByZXR1cm4gY2NoYXJkZXQuZGV0ZWN0KHMpWydlbmNvZGluZyddCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgdHJ5OgorICAgICAgICAjIEZhbGwgYmFjayB0byB0aGUgcHVyZSBQeXRob24gaW1wbGVtZW50YXRpb24KKyAgICAgICAgIyAgRGViaWFuIHBhY2thZ2U6IHB5dGhvbi1jaGFyZGV0CisgICAgICAgICMgIFB5UEkgcGFja2FnZTogY2hhcmRldAorICAgICAgICBpbXBvcnQgY2hhcmRldAorICAgICAgICBkZWYgY2hhcmRldF9kYW1taXQocyk6CisgICAgICAgICAgICByZXR1cm4gY2hhcmRldC5kZXRlY3QocylbJ2VuY29kaW5nJ10KKyAgICAgICAgI2ltcG9ydCBjaGFyZGV0LmNvbnN0YW50cworICAgICAgICAjY2hhcmRldC5jb25zdGFudHMuX2RlYnVnID0gMQorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgIyBObyBjaGFyZGV0IGF2YWlsYWJsZS4KKyAgICAgICAgZGVmIGNoYXJkZXRfZGFtbWl0KHMpOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworIyBBdmFpbGFibGUgZnJvbSBodHRwOi8vY2prcHl0aG9uLmkxOG4ub3JnLy4KK3RyeToKKyAgICBpbXBvcnQgaWNvbnZfY29kZWMKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBwYXNzCisKK3htbF9lbmNvZGluZ19yZSA9IHJlLmNvbXBpbGUoCisgICAgJ148XD8uKmVuY29kaW5nPVtcJyJdKC4qPylbXCciXS4qXD8+Jy5lbmNvZGUoKSwgcmUuSSkKK2h0bWxfbWV0YV9yZSA9IHJlLmNvbXBpbGUoCisgICAgJzxccyptZXRhW14+XStjaGFyc2V0XHMqPVxzKlsiXCddPyhbXj5dKj8pWyAvO1wnIj5dJy5lbmNvZGUoKSwgcmUuSSkKKworY2xhc3MgRW50aXR5U3Vic3RpdHV0aW9uKG9iamVjdCk6CisKKyAgICAiIiJTdWJzdGl0dXRlIFhNTCBvciBIVE1MIGVudGl0aWVzIGZvciB0aGUgY29ycmVzcG9uZGluZyBjaGFyYWN0ZXJzLiIiIgorCisgICAgZGVmIF9wb3B1bGF0ZV9jbGFzc192YXJpYWJsZXMoKToKKyAgICAgICAgbG9va3VwID0ge30KKyAgICAgICAgcmV2ZXJzZV9sb29rdXAgPSB7fQorICAgICAgICBjaGFyYWN0ZXJzX2Zvcl9yZSA9IFtdCisgICAgICAgIGZvciBjb2RlcG9pbnQsIG5hbWUgaW4gbGlzdChjb2RlcG9pbnQybmFtZS5pdGVtcygpKToKKyAgICAgICAgICAgIGNoYXJhY3RlciA9IHVuaWNocihjb2RlcG9pbnQpCisgICAgICAgICAgICBpZiBjb2RlcG9pbnQgIT0gMzQ6CisgICAgICAgICAgICAgICAgIyBUaGVyZSdzIG5vIHBvaW50IGluIHR1cm5pbmcgdGhlIHF1b3RhdGlvbiBtYXJrIGludG8KKyAgICAgICAgICAgICAgICAjICZxdW90OywgdW5sZXNzIGl0IGhhcHBlbnMgd2l0aGluIGFuIGF0dHJpYnV0ZSB2YWx1ZSwgd2hpY2gKKyAgICAgICAgICAgICAgICAjIGlzIGhhbmRsZWQgZWxzZXdoZXJlLgorICAgICAgICAgICAgICAgIGNoYXJhY3RlcnNfZm9yX3JlLmFwcGVuZChjaGFyYWN0ZXIpCisgICAgICAgICAgICAgICAgbG9va3VwW2NoYXJhY3Rlcl0gPSBuYW1lCisgICAgICAgICAgICAjIEJ1dCB3ZSBkbyB3YW50IHRvIHR1cm4gJnF1b3Q7IGludG8gdGhlIHF1b3RhdGlvbiBtYXJrLgorICAgICAgICAgICAgcmV2ZXJzZV9sb29rdXBbbmFtZV0gPSBjaGFyYWN0ZXIKKyAgICAgICAgcmVfZGVmaW5pdGlvbiA9ICJbJXNdIiAlICIiLmpvaW4oY2hhcmFjdGVyc19mb3JfcmUpCisgICAgICAgIHJldHVybiBsb29rdXAsIHJldmVyc2VfbG9va3VwLCByZS5jb21waWxlKHJlX2RlZmluaXRpb24pCisgICAgKENIQVJBQ1RFUl9UT19IVE1MX0VOVElUWSwgSFRNTF9FTlRJVFlfVE9fQ0hBUkFDVEVSLAorICAgICBDSEFSQUNURVJfVE9fSFRNTF9FTlRJVFlfUkUpID0gX3BvcHVsYXRlX2NsYXNzX3ZhcmlhYmxlcygpCisKKyAgICBDSEFSQUNURVJfVE9fWE1MX0VOVElUWSA9IHsKKyAgICAgICAgIiciOiAiYXBvcyIsCisgICAgICAgICciJzogInF1b3QiLAorICAgICAgICAiJiI6ICJhbXAiLAorICAgICAgICAiPCI6ICJsdCIsCisgICAgICAgICI+IjogImd0IiwKKyAgICAgICAgfQorCisgICAgQkFSRV9BTVBFUlNBTkRfT1JfQlJBQ0tFVCA9IHJlLmNvbXBpbGUoIihbPD5dfCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJig/ISNcZCs7fCN4WzAtOWEtZkEtRl0rO3xcdys7KSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSIpCisKKyAgICBBTVBFUlNBTkRfT1JfQlJBQ0tFVCA9IHJlLmNvbXBpbGUoIihbPD4mXSkiKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF9zdWJzdGl0dXRlX2h0bWxfZW50aXR5KGNscywgbWF0Y2hvYmopOgorICAgICAgICBlbnRpdHkgPSBjbHMuQ0hBUkFDVEVSX1RPX0hUTUxfRU5USVRZLmdldChtYXRjaG9iai5ncm91cCgwKSkKKyAgICAgICAgcmV0dXJuICImJXM7IiAlIGVudGl0eQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF9zdWJzdGl0dXRlX3htbF9lbnRpdHkoY2xzLCBtYXRjaG9iaik6CisgICAgICAgICIiIlVzZWQgd2l0aCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBzdWJzdGl0dXRlIHRoZQorICAgICAgICBhcHByb3ByaWF0ZSBYTUwgZW50aXR5IGZvciBhbiBYTUwgc3BlY2lhbCBjaGFyYWN0ZXIuIiIiCisgICAgICAgIGVudGl0eSA9IGNscy5DSEFSQUNURVJfVE9fWE1MX0VOVElUWVttYXRjaG9iai5ncm91cCgwKV0KKyAgICAgICAgcmV0dXJuICImJXM7IiAlIGVudGl0eQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHF1b3RlZF9hdHRyaWJ1dGVfdmFsdWUoc2VsZiwgdmFsdWUpOgorICAgICAgICAiIiJNYWtlIGEgdmFsdWUgaW50byBhIHF1b3RlZCBYTUwgYXR0cmlidXRlLCBwb3NzaWJseSBlc2NhcGluZyBpdC4KKworICAgICAgICAgTW9zdCBzdHJpbmdzIHdpbGwgYmUgcXVvdGVkIHVzaW5nIGRvdWJsZSBxdW90ZXMuCisKKyAgICAgICAgICBCb2IncyBCYXIgLT4gIkJvYidzIEJhciIKKworICAgICAgICAgSWYgYSBzdHJpbmcgY29udGFpbnMgZG91YmxlIHF1b3RlcywgaXQgd2lsbCBiZSBxdW90ZWQgdXNpbmcKKyAgICAgICAgIHNpbmdsZSBxdW90ZXMuCisKKyAgICAgICAgICBXZWxjb21lIHRvICJteSBiYXIiIC0+ICdXZWxjb21lIHRvICJteSBiYXIiJworCisgICAgICAgICBJZiBhIHN0cmluZyBjb250YWlucyBib3RoIHNpbmdsZSBhbmQgZG91YmxlIHF1b3RlcywgdGhlCisgICAgICAgICBkb3VibGUgcXVvdGVzIHdpbGwgYmUgZXNjYXBlZCwgYW5kIHRoZSBzdHJpbmcgd2lsbCBiZSBxdW90ZWQKKyAgICAgICAgIHVzaW5nIGRvdWJsZSBxdW90ZXMuCisKKyAgICAgICAgICBXZWxjb21lIHRvICJCb2IncyBCYXIiIC0+ICJXZWxjb21lIHRvICZxdW90O0JvYidzIGJhciZxdW90OworICAgICAgICAiIiIKKyAgICAgICAgcXVvdGVfd2l0aCA9ICciJworICAgICAgICBpZiAnIicgaW4gdmFsdWU6CisgICAgICAgICAgICBpZiAiJyIgaW4gdmFsdWU6CisgICAgICAgICAgICAgICAgIyBUaGUgc3RyaW5nIGNvbnRhaW5zIGJvdGggc2luZ2xlIGFuZCBkb3VibGUKKyAgICAgICAgICAgICAgICAjIHF1b3Rlcy4gIFR1cm4gdGhlIGRvdWJsZSBxdW90ZXMgaW50bworICAgICAgICAgICAgICAgICMgZW50aXRpZXMuIFdlIHF1b3RlIHRoZSBkb3VibGUgcXVvdGVzIHJhdGhlciB0aGFuCisgICAgICAgICAgICAgICAgIyB0aGUgc2luZ2xlIHF1b3RlcyBiZWNhdXNlIHRoZSBlbnRpdHkgbmFtZSBpcworICAgICAgICAgICAgICAgICMgIiZxdW90OyIgd2hldGhlciB0aGlzIGlzIEhUTUwgb3IgWE1MLiAgSWYgd2UKKyAgICAgICAgICAgICAgICAjIHF1b3RlZCB0aGUgc2luZ2xlIHF1b3Rlcywgd2UnZCBoYXZlIHRvIGRlY2lkZQorICAgICAgICAgICAgICAgICMgYmV0d2VlbiAmYXBvczsgYW5kICZzcXVvdDsuCisgICAgICAgICAgICAgICAgcmVwbGFjZV93aXRoID0gIiZxdW90OyIKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoJyInLCByZXBsYWNlX3dpdGgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgVGhlcmUgYXJlIGRvdWJsZSBxdW90ZXMgYnV0IG5vIHNpbmdsZSBxdW90ZXMuCisgICAgICAgICAgICAgICAgIyBXZSBjYW4gdXNlIHNpbmdsZSBxdW90ZXMgdG8gcXVvdGUgdGhlIGF0dHJpYnV0ZS4KKyAgICAgICAgICAgICAgICBxdW90ZV93aXRoID0gIiciCisgICAgICAgIHJldHVybiBxdW90ZV93aXRoICsgdmFsdWUgKyBxdW90ZV93aXRoCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgc3Vic3RpdHV0ZV94bWwoY2xzLCB2YWx1ZSwgbWFrZV9xdW90ZWRfYXR0cmlidXRlPUZhbHNlKToKKyAgICAgICAgIiIiU3Vic3RpdHV0ZSBYTUwgZW50aXRpZXMgZm9yIHNwZWNpYWwgWE1MIGNoYXJhY3RlcnMuCisKKyAgICAgICAgOnBhcmFtIHZhbHVlOiBBIHN0cmluZyB0byBiZSBzdWJzdGl0dXRlZC4gVGhlIGxlc3MtdGhhbiBzaWduCisgICAgICAgICAgd2lsbCBiZWNvbWUgJmx0OywgdGhlIGdyZWF0ZXItdGhhbiBzaWduIHdpbGwgYmVjb21lICZndDssCisgICAgICAgICAgYW5kIGFueSBhbXBlcnNhbmRzIHdpbGwgYmVjb21lICZhbXA7LiBJZiB5b3Ugd2FudCBhbXBlcnNhbmRzCisgICAgICAgICAgdGhhdCBhcHBlYXIgdG8gYmUgcGFydCBvZiBhbiBlbnRpdHkgZGVmaW5pdGlvbiB0byBiZSBsZWZ0CisgICAgICAgICAgYWxvbmUsIHVzZSBzdWJzdGl0dXRlX3htbF9jb250YWluaW5nX2VudGl0aWVzKCkgaW5zdGVhZC4KKworICAgICAgICA6cGFyYW0gbWFrZV9xdW90ZWRfYXR0cmlidXRlOiBJZiBUcnVlLCB0aGVuIHRoZSBzdHJpbmcgd2lsbCBiZQorICAgICAgICAgcXVvdGVkLCBhcyBiZWZpdHMgYW4gYXR0cmlidXRlIHZhbHVlLgorICAgICAgICAiIiIKKyAgICAgICAgIyBFc2NhcGUgYW5nbGUgYnJhY2tldHMgYW5kIGFtcGVyc2FuZHMuCisgICAgICAgIHZhbHVlID0gY2xzLkFNUEVSU0FORF9PUl9CUkFDS0VULnN1YigKKyAgICAgICAgICAgIGNscy5fc3Vic3RpdHV0ZV94bWxfZW50aXR5LCB2YWx1ZSkKKworICAgICAgICBpZiBtYWtlX3F1b3RlZF9hdHRyaWJ1dGU6CisgICAgICAgICAgICB2YWx1ZSA9IGNscy5xdW90ZWRfYXR0cmlidXRlX3ZhbHVlKHZhbHVlKQorICAgICAgICByZXR1cm4gdmFsdWUKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBzdWJzdGl0dXRlX3htbF9jb250YWluaW5nX2VudGl0aWVzKAorICAgICAgICBjbHMsIHZhbHVlLCBtYWtlX3F1b3RlZF9hdHRyaWJ1dGU9RmFsc2UpOgorICAgICAgICAiIiJTdWJzdGl0dXRlIFhNTCBlbnRpdGllcyBmb3Igc3BlY2lhbCBYTUwgY2hhcmFjdGVycy4KKworICAgICAgICA6cGFyYW0gdmFsdWU6IEEgc3RyaW5nIHRvIGJlIHN1YnN0aXR1dGVkLiBUaGUgbGVzcy10aGFuIHNpZ24gd2lsbAorICAgICAgICAgIGJlY29tZSAmbHQ7LCB0aGUgZ3JlYXRlci10aGFuIHNpZ24gd2lsbCBiZWNvbWUgJmd0OywgYW5kIGFueQorICAgICAgICAgIGFtcGVyc2FuZHMgdGhhdCBhcmUgbm90IHBhcnQgb2YgYW4gZW50aXR5IGRlZml0aW9uIHdpbGwKKyAgICAgICAgICBiZWNvbWUgJmFtcDsuCisKKyAgICAgICAgOnBhcmFtIG1ha2VfcXVvdGVkX2F0dHJpYnV0ZTogSWYgVHJ1ZSwgdGhlbiB0aGUgc3RyaW5nIHdpbGwgYmUKKyAgICAgICAgIHF1b3RlZCwgYXMgYmVmaXRzIGFuIGF0dHJpYnV0ZSB2YWx1ZS4KKyAgICAgICAgIiIiCisgICAgICAgICMgRXNjYXBlIGFuZ2xlIGJyYWNrZXRzLCBhbmQgYW1wZXJzYW5kcyB0aGF0IGFyZW4ndCBwYXJ0IG9mCisgICAgICAgICMgZW50aXRpZXMuCisgICAgICAgIHZhbHVlID0gY2xzLkJBUkVfQU1QRVJTQU5EX09SX0JSQUNLRVQuc3ViKAorICAgICAgICAgICAgY2xzLl9zdWJzdGl0dXRlX3htbF9lbnRpdHksIHZhbHVlKQorCisgICAgICAgIGlmIG1ha2VfcXVvdGVkX2F0dHJpYnV0ZToKKyAgICAgICAgICAgIHZhbHVlID0gY2xzLnF1b3RlZF9hdHRyaWJ1dGVfdmFsdWUodmFsdWUpCisgICAgICAgIHJldHVybiB2YWx1ZQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHN1YnN0aXR1dGVfaHRtbChjbHMsIHMpOgorICAgICAgICAiIiJSZXBsYWNlIGNlcnRhaW4gVW5pY29kZSBjaGFyYWN0ZXJzIHdpdGggbmFtZWQgSFRNTCBlbnRpdGllcy4KKworICAgICAgICBUaGlzIGRpZmZlcnMgZnJvbSBkYXRhLmVuY29kZShlbmNvZGluZywgJ3htbGNoYXJyZWZyZXBsYWNlJykKKyAgICAgICAgaW4gdGhhdCB0aGUgZ29hbCBpcyB0byBtYWtlIHRoZSByZXN1bHQgbW9yZSByZWFkYWJsZSAodG8gdGhvc2UKKyAgICAgICAgd2l0aCBBU0NJSSBkaXNwbGF5cykgcmF0aGVyIHRoYW4gdG8gcmVjb3ZlciBmcm9tCisgICAgICAgIGVycm9ycy4gVGhlcmUncyBhYnNvbHV0ZWx5IG5vdGhpbmcgd3Jvbmcgd2l0aCBhIFVURi04IHN0cmluZworICAgICAgICBjb250YWluZyBhIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUsIGJ1dCByZXBsYWNpbmcgdGhhdAorICAgICAgICBjaGFyYWN0ZXIgd2l0aCAiJmVhY3V0ZTsiIHdpbGwgbWFrZSBpdCBtb3JlIHJlYWRhYmxlIHRvIHNvbWUKKyAgICAgICAgcGVvcGxlLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIGNscy5DSEFSQUNURVJfVE9fSFRNTF9FTlRJVFlfUkUuc3ViKAorICAgICAgICAgICAgY2xzLl9zdWJzdGl0dXRlX2h0bWxfZW50aXR5LCBzKQorCisKK2NsYXNzIEVuY29kaW5nRGV0ZWN0b3I6CisgICAgIiIiU3VnZ2VzdHMgYSBudW1iZXIgb2YgcG9zc2libGUgZW5jb2RpbmdzIGZvciBhIGJ5dGVzdHJpbmcuCisKKyAgICBPcmRlciBvZiBwcmVjZWRlbmNlOgorCisgICAgMS4gRW5jb2RpbmdzIHlvdSBzcGVjaWZpY2FsbHkgdGVsbCBFbmNvZGluZ0RldGVjdG9yIHRvIHRyeSBmaXJzdAorICAgICh0aGUgb3ZlcnJpZGVfZW5jb2RpbmdzIGFyZ3VtZW50IHRvIHRoZSBjb25zdHJ1Y3RvcikuCisKKyAgICAyLiBBbiBlbmNvZGluZyBkZWNsYXJlZCB3aXRoaW4gdGhlIGJ5dGVzdHJpbmcgaXRzZWxmLCBlaXRoZXIgaW4gYW4KKyAgICBYTUwgZGVjbGFyYXRpb24gKGlmIHRoZSBieXRlc3RyaW5nIGlzIHRvIGJlIGludGVycHJldGVkIGFzIGFuIFhNTAorICAgIGRvY3VtZW50KSwgb3IgaW4gYSA8bWV0YT4gdGFnIChpZiB0aGUgYnl0ZXN0cmluZyBpcyB0byBiZQorICAgIGludGVycHJldGVkIGFzIGFuIEhUTUwgZG9jdW1lbnQuKQorCisgICAgMy4gQW4gZW5jb2RpbmcgZGV0ZWN0ZWQgdGhyb3VnaCB0ZXh0dWFsIGFuYWx5c2lzIGJ5IGNoYXJkZXQsCisgICAgY2NoYXJkZXQsIG9yIGEgc2ltaWxhciBleHRlcm5hbCBsaWJyYXJ5LgorCisgICAgNC4gVVRGLTguCisKKyAgICA1LiBXaW5kb3dzLTEyNTIuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hcmt1cCwgb3ZlcnJpZGVfZW5jb2RpbmdzPU5vbmUsIGlzX2h0bWw9RmFsc2UpOgorICAgICAgICBzZWxmLm92ZXJyaWRlX2VuY29kaW5ncyA9IG92ZXJyaWRlX2VuY29kaW5ncyBvciBbXQorICAgICAgICBzZWxmLmNoYXJkZXRfZW5jb2RpbmcgPSBOb25lCisgICAgICAgIHNlbGYuaXNfaHRtbCA9IGlzX2h0bWwKKyAgICAgICAgc2VsZi5kZWNsYXJlZF9lbmNvZGluZyA9IE5vbmUKKworICAgICAgICAjIEZpcnN0IG9yZGVyIG9mIGJ1c2luZXNzOiBzdHJpcCBhIGJ5dGUtb3JkZXIgbWFyay4KKyAgICAgICAgc2VsZi5tYXJrdXAsIHNlbGYuc25pZmZlZF9lbmNvZGluZyA9IHNlbGYuc3RyaXBfYnl0ZV9vcmRlcl9tYXJrKG1hcmt1cCkKKworICAgIGRlZiBfdXNhYmxlKHNlbGYsIGVuY29kaW5nLCB0cmllZCk6CisgICAgICAgIGlmIGVuY29kaW5nIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZW5jb2RpbmcgPSBlbmNvZGluZy5sb3dlcigpCisgICAgICAgICAgICBpZiBlbmNvZGluZyBub3QgaW4gdHJpZWQ6CisgICAgICAgICAgICAgICAgdHJpZWQuYWRkKGVuY29kaW5nKQorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGVuY29kaW5ncyhzZWxmKToKKyAgICAgICAgIiIiWWllbGQgYSBudW1iZXIgb2YgZW5jb2RpbmdzIHRoYXQgbWlnaHQgd29yayBmb3IgdGhpcyBtYXJrdXAuIiIiCisgICAgICAgIHRyaWVkID0gc2V0KCkKKyAgICAgICAgZm9yIGUgaW4gc2VsZi5vdmVycmlkZV9lbmNvZGluZ3M6CisgICAgICAgICAgICBpZiBzZWxmLl91c2FibGUoZSwgdHJpZWQpOgorICAgICAgICAgICAgICAgIHlpZWxkIGUKKworICAgICAgICAjIERpZCB0aGUgZG9jdW1lbnQgb3JpZ2luYWxseSBzdGFydCB3aXRoIGEgYnl0ZS1vcmRlciBtYXJrCisgICAgICAgICMgdGhhdCBpbmRpY2F0ZWQgaXRzIGVuY29kaW5nPworICAgICAgICBpZiBzZWxmLl91c2FibGUoc2VsZi5zbmlmZmVkX2VuY29kaW5nLCB0cmllZCk6CisgICAgICAgICAgICB5aWVsZCBzZWxmLnNuaWZmZWRfZW5jb2RpbmcKKworICAgICAgICAjIExvb2sgd2l0aGluIHRoZSBkb2N1bWVudCBmb3IgYW4gWE1MIG9yIEhUTUwgZW5jb2RpbmcKKyAgICAgICAgIyBkZWNsYXJhdGlvbi4KKyAgICAgICAgaWYgc2VsZi5kZWNsYXJlZF9lbmNvZGluZyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5kZWNsYXJlZF9lbmNvZGluZyA9IHNlbGYuZmluZF9kZWNsYXJlZF9lbmNvZGluZygKKyAgICAgICAgICAgICAgICBzZWxmLm1hcmt1cCwgc2VsZi5pc19odG1sKQorICAgICAgICBpZiBzZWxmLl91c2FibGUoc2VsZi5kZWNsYXJlZF9lbmNvZGluZywgdHJpZWQpOgorICAgICAgICAgICAgeWllbGQgc2VsZi5kZWNsYXJlZF9lbmNvZGluZworCisgICAgICAgICMgVXNlIHRoaXJkLXBhcnR5IGNoYXJhY3RlciBzZXQgZGV0ZWN0aW9uIHRvIGd1ZXNzIGF0IHRoZQorICAgICAgICAjIGVuY29kaW5nLgorICAgICAgICBpZiBzZWxmLmNoYXJkZXRfZW5jb2RpbmcgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuY2hhcmRldF9lbmNvZGluZyA9IGNoYXJkZXRfZGFtbWl0KHNlbGYubWFya3VwKQorICAgICAgICBpZiBzZWxmLl91c2FibGUoc2VsZi5jaGFyZGV0X2VuY29kaW5nLCB0cmllZCk6CisgICAgICAgICAgICB5aWVsZCBzZWxmLmNoYXJkZXRfZW5jb2RpbmcKKworICAgICAgICAjIEFzIGEgbGFzdC1kaXRjaCBlZmZvcnQsIHRyeSB1dGYtOCBhbmQgd2luZG93cy0xMjUyLgorICAgICAgICBmb3IgZSBpbiAoJ3V0Zi04JywgJ3dpbmRvd3MtMTI1MicpOgorICAgICAgICAgICAgaWYgc2VsZi5fdXNhYmxlKGUsIHRyaWVkKToKKyAgICAgICAgICAgICAgICB5aWVsZCBlCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgc3RyaXBfYnl0ZV9vcmRlcl9tYXJrKGNscywgZGF0YSk6CisgICAgICAgICIiIklmIGEgYnl0ZS1vcmRlciBtYXJrIGlzIHByZXNlbnQsIHN0cmlwIGl0IGFuZCByZXR1cm4gdGhlIGVuY29kaW5nIGl0IGltcGxpZXMuIiIiCisgICAgICAgIGVuY29kaW5nID0gTm9uZQorICAgICAgICBpZiAobGVuKGRhdGEpID49IDQpIGFuZCAoZGF0YVs6Ml0gPT0gYidceGZlXHhmZicpIFwKKyAgICAgICAgICAgICAgIGFuZCAoZGF0YVsyOjRdICE9ICdceDAwXHgwMCcpOgorICAgICAgICAgICAgZW5jb2RpbmcgPSAndXRmLTE2YmUnCisgICAgICAgICAgICBkYXRhID0gZGF0YVsyOl0KKyAgICAgICAgZWxpZiAobGVuKGRhdGEpID49IDQpIGFuZCAoZGF0YVs6Ml0gPT0gYidceGZmXHhmZScpIFwKKyAgICAgICAgICAgICAgICAgYW5kIChkYXRhWzI6NF0gIT0gJ1x4MDBceDAwJyk6CisgICAgICAgICAgICBlbmNvZGluZyA9ICd1dGYtMTZsZScKKyAgICAgICAgICAgIGRhdGEgPSBkYXRhWzI6XQorICAgICAgICBlbGlmIGRhdGFbOjNdID09IGInXHhlZlx4YmJceGJmJzoKKyAgICAgICAgICAgIGVuY29kaW5nID0gJ3V0Zi04JworICAgICAgICAgICAgZGF0YSA9IGRhdGFbMzpdCisgICAgICAgIGVsaWYgZGF0YVs6NF0gPT0gYidceDAwXHgwMFx4ZmVceGZmJzoKKyAgICAgICAgICAgIGVuY29kaW5nID0gJ3V0Zi0zMmJlJworICAgICAgICAgICAgZGF0YSA9IGRhdGFbNDpdCisgICAgICAgIGVsaWYgZGF0YVs6NF0gPT0gYidceGZmXHhmZVx4MDBceDAwJzoKKyAgICAgICAgICAgIGVuY29kaW5nID0gJ3V0Zi0zMmxlJworICAgICAgICAgICAgZGF0YSA9IGRhdGFbNDpdCisgICAgICAgIHJldHVybiBkYXRhLCBlbmNvZGluZworCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGZpbmRfZGVjbGFyZWRfZW5jb2RpbmcoY2xzLCBtYXJrdXAsIGlzX2h0bWw9RmFsc2UsIHNlYXJjaF9lbnRpcmVfZG9jdW1lbnQ9RmFsc2UpOgorICAgICAgICAiIiJHaXZlbiBhIGRvY3VtZW50LCB0cmllcyB0byBmaW5kIGl0cyBkZWNsYXJlZCBlbmNvZGluZy4KKworICAgICAgICBBbiBYTUwgZW5jb2RpbmcgaXMgZGVjbGFyZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZG9jdW1lbnQuCisKKyAgICAgICAgQW4gSFRNTCBlbmNvZGluZyBpcyBkZWNsYXJlZCBpbiBhIDxtZXRhPiB0YWcsIGhvcGVmdWxseSBuZWFyIHRoZQorICAgICAgICBiZWdpbm5pbmcgb2YgdGhlIGRvY3VtZW50LgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VhcmNoX2VudGlyZV9kb2N1bWVudDoKKyAgICAgICAgICAgIHhtbF9lbmRwb3MgPSBodG1sX2VuZHBvcyA9IGxlbihtYXJrdXApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB4bWxfZW5kcG9zID0gMTAyNAorICAgICAgICAgICAgaHRtbF9lbmRwb3MgPSBtYXgoMjA0OCwgaW50KGxlbihtYXJrdXApICogMC4wNSkpCisgICAgICAgICAgICAKKyAgICAgICAgZGVjbGFyZWRfZW5jb2RpbmcgPSBOb25lCisgICAgICAgIGRlY2xhcmVkX2VuY29kaW5nX21hdGNoID0geG1sX2VuY29kaW5nX3JlLnNlYXJjaChtYXJrdXAsIGVuZHBvcz14bWxfZW5kcG9zKQorICAgICAgICBpZiBub3QgZGVjbGFyZWRfZW5jb2RpbmdfbWF0Y2ggYW5kIGlzX2h0bWw6CisgICAgICAgICAgICBkZWNsYXJlZF9lbmNvZGluZ19tYXRjaCA9IGh0bWxfbWV0YV9yZS5zZWFyY2gobWFya3VwLCBlbmRwb3M9aHRtbF9lbmRwb3MpCisgICAgICAgIGlmIGRlY2xhcmVkX2VuY29kaW5nX21hdGNoIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZGVjbGFyZWRfZW5jb2RpbmcgPSBkZWNsYXJlZF9lbmNvZGluZ19tYXRjaC5ncm91cHMoKVswXS5kZWNvZGUoCisgICAgICAgICAgICAgICAgJ2FzY2lpJykKKyAgICAgICAgaWYgZGVjbGFyZWRfZW5jb2Rpbmc6CisgICAgICAgICAgICByZXR1cm4gZGVjbGFyZWRfZW5jb2RpbmcubG93ZXIoKQorICAgICAgICByZXR1cm4gTm9uZQorCitjbGFzcyBVbmljb2RlRGFtbWl0OgorICAgICIiIkEgY2xhc3MgZm9yIGRldGVjdGluZyB0aGUgZW5jb2Rpbmcgb2YgYSAqTUwgZG9jdW1lbnQgYW5kCisgICAgY29udmVydGluZyBpdCB0byBhIFVuaWNvZGUgc3RyaW5nLiBJZiB0aGUgc291cmNlIGVuY29kaW5nIGlzCisgICAgd2luZG93cy0xMjUyLCBjYW4gcmVwbGFjZSBNUyBzbWFydCBxdW90ZXMgd2l0aCB0aGVpciBIVE1MIG9yIFhNTAorICAgIGVxdWl2YWxlbnRzLiIiIgorCisgICAgIyBUaGlzIGRpY3Rpb25hcnkgbWFwcyBjb21tb25seSBzZWVuIHZhbHVlcyBmb3IgImNoYXJzZXQiIGluIEhUTUwKKyAgICAjIG1ldGEgdGFncyB0byB0aGUgY29ycmVzcG9uZGluZyBQeXRob24gY29kZWMgbmFtZXMuIEl0IG9ubHkgY292ZXJzCisgICAgIyB2YWx1ZXMgdGhhdCBhcmVuJ3QgaW4gUHl0aG9uJ3MgYWxpYXNlcyBhbmQgY2FuJ3QgYmUgZGV0ZXJtaW5lZAorICAgICMgYnkgdGhlIGhldXJpc3RpY3MgaW4gZmluZF9jb2RlYy4KKyAgICBDSEFSU0VUX0FMSUFTRVMgPSB7Im1hY2ludG9zaCI6ICJtYWMtcm9tYW4iLAorICAgICAgICAgICAgICAgICAgICAgICAieC1zamlzIjogInNoaWZ0LWppcyJ9CisKKyAgICBFTkNPRElOR1NfV0lUSF9TTUFSVF9RVU9URVMgPSBbCisgICAgICAgICJ3aW5kb3dzLTEyNTIiLAorICAgICAgICAiaXNvLTg4NTktMSIsCisgICAgICAgICJpc28tODg1OS0yIiwKKyAgICAgICAgXQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hcmt1cCwgb3ZlcnJpZGVfZW5jb2RpbmdzPVtdLAorICAgICAgICAgICAgICAgICBzbWFydF9xdW90ZXNfdG89Tm9uZSwgaXNfaHRtbD1GYWxzZSk6CisgICAgICAgIHNlbGYuc21hcnRfcXVvdGVzX3RvID0gc21hcnRfcXVvdGVzX3RvCisgICAgICAgIHNlbGYudHJpZWRfZW5jb2RpbmdzID0gW10KKyAgICAgICAgc2VsZi5jb250YWluc19yZXBsYWNlbWVudF9jaGFyYWN0ZXJzID0gRmFsc2UKKyAgICAgICAgc2VsZi5pc19odG1sID0gaXNfaHRtbAorCisgICAgICAgIHNlbGYuZGV0ZWN0b3IgPSBFbmNvZGluZ0RldGVjdG9yKG1hcmt1cCwgb3ZlcnJpZGVfZW5jb2RpbmdzLCBpc19odG1sKQorCisgICAgICAgICMgU2hvcnQtY2lyY3VpdCBpZiB0aGUgZGF0YSBpcyBpbiBVbmljb2RlIHRvIGJlZ2luIHdpdGguCisgICAgICAgIGlmIGlzaW5zdGFuY2UobWFya3VwLCB1bmljb2RlKSBvciBtYXJrdXAgPT0gJyc6CisgICAgICAgICAgICBzZWxmLm1hcmt1cCA9IG1hcmt1cAorICAgICAgICAgICAgc2VsZi51bmljb2RlX21hcmt1cCA9IHVuaWNvZGUobWFya3VwKQorICAgICAgICAgICAgc2VsZi5vcmlnaW5hbF9lbmNvZGluZyA9IE5vbmUKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgVGhlIGVuY29kaW5nIGRldGVjdG9yIG1heSBoYXZlIHN0cmlwcGVkIGEgYnl0ZS1vcmRlciBtYXJrLgorICAgICAgICAjIFVzZSB0aGUgc3RyaXBwZWQgbWFya3VwIGZyb20gdGhpcyBwb2ludCBvbi4KKyAgICAgICAgc2VsZi5tYXJrdXAgPSBzZWxmLmRldGVjdG9yLm1hcmt1cAorCisgICAgICAgIHUgPSBOb25lCisgICAgICAgIGZvciBlbmNvZGluZyBpbiBzZWxmLmRldGVjdG9yLmVuY29kaW5nczoKKyAgICAgICAgICAgIG1hcmt1cCA9IHNlbGYuZGV0ZWN0b3IubWFya3VwCisgICAgICAgICAgICB1ID0gc2VsZi5fY29udmVydF9mcm9tKGVuY29kaW5nKQorICAgICAgICAgICAgaWYgdSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgIGlmIG5vdCB1OgorICAgICAgICAgICAgIyBOb25lIG9mIHRoZSBlbmNvZGluZ3Mgd29ya2VkLiBBcyBhbiBhYnNvbHV0ZSBsYXN0IHJlc29ydCwKKyAgICAgICAgICAgICMgdHJ5IHRoZW0gYWdhaW4gd2l0aCBjaGFyYWN0ZXIgcmVwbGFjZW1lbnQuCisKKyAgICAgICAgICAgIGZvciBlbmNvZGluZyBpbiBzZWxmLmRldGVjdG9yLmVuY29kaW5nczoKKyAgICAgICAgICAgICAgICBpZiBlbmNvZGluZyAhPSAiYXNjaWkiOgorICAgICAgICAgICAgICAgICAgICB1ID0gc2VsZi5fY29udmVydF9mcm9tKGVuY29kaW5nLCAicmVwbGFjZSIpCisgICAgICAgICAgICAgICAgaWYgdSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2luZy53YXJuaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTb21lIGNoYXJhY3RlcnMgY291bGQgbm90IGJlIGRlY29kZWQsIGFuZCB3ZXJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVwbGFjZWQgd2l0aCBSRVBMQUNFTUVOVCBDSEFSQUNURVIuIikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250YWluc19yZXBsYWNlbWVudF9jaGFyYWN0ZXJzID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICMgSWYgbm9uZSBvZiB0aGF0IHdvcmtlZCwgd2UgY291bGQgYXQgdGhpcyBwb2ludCBmb3JjZSBpdCB0bworICAgICAgICAjIEFTQ0lJLCBidXQgdGhhdCB3b3VsZCBkZXN0cm95IHNvIG11Y2ggZGF0YSB0aGF0IEkgdGhpbmsKKyAgICAgICAgIyBnaXZpbmcgdXAgaXMgYmV0dGVyLgorICAgICAgICBzZWxmLnVuaWNvZGVfbWFya3VwID0gdQorICAgICAgICBpZiBub3QgdToKKyAgICAgICAgICAgIHNlbGYub3JpZ2luYWxfZW5jb2RpbmcgPSBOb25lCisKKyAgICBkZWYgX3N1Yl9tc19jaGFyKHNlbGYsIG1hdGNoKToKKyAgICAgICAgIiIiQ2hhbmdlcyBhIE1TIHNtYXJ0IHF1b3RlIGNoYXJhY3RlciB0byBhbiBYTUwgb3IgSFRNTAorICAgICAgICBlbnRpdHksIG9yIGFuIEFTQ0lJIGNoYXJhY3Rlci4iIiIKKyAgICAgICAgb3JpZyA9IG1hdGNoLmdyb3VwKDEpCisgICAgICAgIGlmIHNlbGYuc21hcnRfcXVvdGVzX3RvID09ICdhc2NpaSc6CisgICAgICAgICAgICBzdWIgPSBzZWxmLk1TX0NIQVJTX1RPX0FTQ0lJLmdldChvcmlnKS5lbmNvZGUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3ViID0gc2VsZi5NU19DSEFSUy5nZXQob3JpZykKKyAgICAgICAgICAgIGlmIHR5cGUoc3ViKSA9PSB0dXBsZToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnNtYXJ0X3F1b3Rlc190byA9PSAneG1sJzoKKyAgICAgICAgICAgICAgICAgICAgc3ViID0gJyYjeCcuZW5jb2RlKCkgKyBzdWJbMV0uZW5jb2RlKCkgKyAnOycuZW5jb2RlKCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzdWIgPSAnJicuZW5jb2RlKCkgKyBzdWJbMF0uZW5jb2RlKCkgKyAnOycuZW5jb2RlKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc3ViID0gc3ViLmVuY29kZSgpCisgICAgICAgIHJldHVybiBzdWIKKworICAgIGRlZiBfY29udmVydF9mcm9tKHNlbGYsIHByb3Bvc2VkLCBlcnJvcnM9InN0cmljdCIpOgorICAgICAgICBwcm9wb3NlZCA9IHNlbGYuZmluZF9jb2RlYyhwcm9wb3NlZCkKKyAgICAgICAgaWYgbm90IHByb3Bvc2VkIG9yIChwcm9wb3NlZCwgZXJyb3JzKSBpbiBzZWxmLnRyaWVkX2VuY29kaW5nczoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHNlbGYudHJpZWRfZW5jb2RpbmdzLmFwcGVuZCgocHJvcG9zZWQsIGVycm9ycykpCisgICAgICAgIG1hcmt1cCA9IHNlbGYubWFya3VwCisgICAgICAgICMgQ29udmVydCBzbWFydCBxdW90ZXMgdG8gSFRNTCBpZiBjb21pbmcgZnJvbSBhbiBlbmNvZGluZworICAgICAgICAjIHRoYXQgbWlnaHQgaGF2ZSB0aGVtLgorICAgICAgICBpZiAoc2VsZi5zbWFydF9xdW90ZXNfdG8gaXMgbm90IE5vbmUKKyAgICAgICAgICAgIGFuZCBwcm9wb3NlZCBpbiBzZWxmLkVOQ09ESU5HU19XSVRIX1NNQVJUX1FVT1RFUyk6CisgICAgICAgICAgICBzbWFydF9xdW90ZXNfcmUgPSBiIihbXHg4MC1ceDlmXSkiCisgICAgICAgICAgICBzbWFydF9xdW90ZXNfY29tcGlsZWQgPSByZS5jb21waWxlKHNtYXJ0X3F1b3Rlc19yZSkKKyAgICAgICAgICAgIG1hcmt1cCA9IHNtYXJ0X3F1b3Rlc19jb21waWxlZC5zdWIoc2VsZi5fc3ViX21zX2NoYXIsIG1hcmt1cCkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICAjcHJpbnQgIlRyeWluZyB0byBjb252ZXJ0IGRvY3VtZW50IHRvICVzIChlcnJvcnM9JXMpIiAlICgKKyAgICAgICAgICAgICMgICAgcHJvcG9zZWQsIGVycm9ycykKKyAgICAgICAgICAgIHUgPSBzZWxmLl90b191bmljb2RlKG1hcmt1cCwgcHJvcG9zZWQsIGVycm9ycykKKyAgICAgICAgICAgIHNlbGYubWFya3VwID0gdQorICAgICAgICAgICAgc2VsZi5vcmlnaW5hbF9lbmNvZGluZyA9IHByb3Bvc2VkCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgICNwcmludCAiVGhhdCBkaWRuJ3Qgd29yayEiCisgICAgICAgICAgICAjcHJpbnQgZQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgI3ByaW50ICJDb3JyZWN0IGVuY29kaW5nOiAlcyIgJSBwcm9wb3NlZAorICAgICAgICByZXR1cm4gc2VsZi5tYXJrdXAKKworICAgIGRlZiBfdG9fdW5pY29kZShzZWxmLCBkYXRhLCBlbmNvZGluZywgZXJyb3JzPSJzdHJpY3QiKToKKyAgICAgICAgJycnR2l2ZW4gYSBzdHJpbmcgYW5kIGl0cyBlbmNvZGluZywgZGVjb2RlcyB0aGUgc3RyaW5nIGludG8gVW5pY29kZS4KKyAgICAgICAgJWVuY29kaW5nIGlzIGEgc3RyaW5nIHJlY29nbml6ZWQgYnkgZW5jb2RpbmdzLmFsaWFzZXMnJycKKyAgICAgICAgcmV0dXJuIHVuaWNvZGUoZGF0YSwgZW5jb2RpbmcsIGVycm9ycykKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBkZWNsYXJlZF9odG1sX2VuY29kaW5nKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5pc19odG1sOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgcmV0dXJuIHNlbGYuZGV0ZWN0b3IuZGVjbGFyZWRfZW5jb2RpbmcKKworICAgIGRlZiBmaW5kX2NvZGVjKHNlbGYsIGNoYXJzZXQpOgorICAgICAgICB2YWx1ZSA9IChzZWxmLl9jb2RlYyhzZWxmLkNIQVJTRVRfQUxJQVNFUy5nZXQoY2hhcnNldCwgY2hhcnNldCkpCisgICAgICAgICAgICAgICBvciAoY2hhcnNldCBhbmQgc2VsZi5fY29kZWMoY2hhcnNldC5yZXBsYWNlKCItIiwgIiIpKSkKKyAgICAgICAgICAgICAgIG9yIChjaGFyc2V0IGFuZCBzZWxmLl9jb2RlYyhjaGFyc2V0LnJlcGxhY2UoIi0iLCAiXyIpKSkKKyAgICAgICAgICAgICAgIG9yIChjaGFyc2V0IGFuZCBjaGFyc2V0Lmxvd2VyKCkpCisgICAgICAgICAgICAgICBvciBjaGFyc2V0CisgICAgICAgICAgICAgICAgKQorICAgICAgICBpZiB2YWx1ZToKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZS5sb3dlcigpCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgX2NvZGVjKHNlbGYsIGNoYXJzZXQpOgorICAgICAgICBpZiBub3QgY2hhcnNldDoKKyAgICAgICAgICAgIHJldHVybiBjaGFyc2V0CisgICAgICAgIGNvZGVjID0gTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb2RlY3MubG9va3VwKGNoYXJzZXQpCisgICAgICAgICAgICBjb2RlYyA9IGNoYXJzZXQKKyAgICAgICAgZXhjZXB0IChMb29rdXBFcnJvciwgVmFsdWVFcnJvcik6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHJldHVybiBjb2RlYworCisKKyAgICAjIEEgcGFydGlhbCBtYXBwaW5nIG9mIElTTy1MYXRpbi0xIHRvIEhUTUwgZW50aXRpZXMvWE1MIG51bWVyaWMgZW50aXRpZXMuCisgICAgTVNfQ0hBUlMgPSB7YidceDgwJzogKCdldXJvJywgJzIwQUMnKSwKKyAgICAgICAgICAgICAgICBiJ1x4ODEnOiAnICcsCisgICAgICAgICAgICAgICAgYidceDgyJzogKCdzYnF1bycsICcyMDFBJyksCisgICAgICAgICAgICAgICAgYidceDgzJzogKCdmbm9mJywgJzE5MicpLAorICAgICAgICAgICAgICAgIGInXHg4NCc6ICgnYmRxdW8nLCAnMjAxRScpLAorICAgICAgICAgICAgICAgIGInXHg4NSc6ICgnaGVsbGlwJywgJzIwMjYnKSwKKyAgICAgICAgICAgICAgICBiJ1x4ODYnOiAoJ2RhZ2dlcicsICcyMDIwJyksCisgICAgICAgICAgICAgICAgYidceDg3JzogKCdEYWdnZXInLCAnMjAyMScpLAorICAgICAgICAgICAgICAgIGInXHg4OCc6ICgnY2lyYycsICcyQzYnKSwKKyAgICAgICAgICAgICAgICBiJ1x4ODknOiAoJ3Blcm1pbCcsICcyMDMwJyksCisgICAgICAgICAgICAgICAgYidceDhBJzogKCdTY2Fyb24nLCAnMTYwJyksCisgICAgICAgICAgICAgICAgYidceDhCJzogKCdsc2FxdW8nLCAnMjAzOScpLAorICAgICAgICAgICAgICAgIGInXHg4Qyc6ICgnT0VsaWcnLCAnMTUyJyksCisgICAgICAgICAgICAgICAgYidceDhEJzogJz8nLAorICAgICAgICAgICAgICAgIGInXHg4RSc6ICgnI3gxN0QnLCAnMTdEJyksCisgICAgICAgICAgICAgICAgYidceDhGJzogJz8nLAorICAgICAgICAgICAgICAgIGInXHg5MCc6ICc/JywKKyAgICAgICAgICAgICAgICBiJ1x4OTEnOiAoJ2xzcXVvJywgJzIwMTgnKSwKKyAgICAgICAgICAgICAgICBiJ1x4OTInOiAoJ3JzcXVvJywgJzIwMTknKSwKKyAgICAgICAgICAgICAgICBiJ1x4OTMnOiAoJ2xkcXVvJywgJzIwMUMnKSwKKyAgICAgICAgICAgICAgICBiJ1x4OTQnOiAoJ3JkcXVvJywgJzIwMUQnKSwKKyAgICAgICAgICAgICAgICBiJ1x4OTUnOiAoJ2J1bGwnLCAnMjAyMicpLAorICAgICAgICAgICAgICAgIGInXHg5Nic6ICgnbmRhc2gnLCAnMjAxMycpLAorICAgICAgICAgICAgICAgIGInXHg5Nyc6ICgnbWRhc2gnLCAnMjAxNCcpLAorICAgICAgICAgICAgICAgIGInXHg5OCc6ICgndGlsZGUnLCAnMkRDJyksCisgICAgICAgICAgICAgICAgYidceDk5JzogKCd0cmFkZScsICcyMTIyJyksCisgICAgICAgICAgICAgICAgYidceDlhJzogKCdzY2Fyb24nLCAnMTYxJyksCisgICAgICAgICAgICAgICAgYidceDliJzogKCdyc2FxdW8nLCAnMjAzQScpLAorICAgICAgICAgICAgICAgIGInXHg5Yyc6ICgnb2VsaWcnLCAnMTUzJyksCisgICAgICAgICAgICAgICAgYidceDlkJzogJz8nLAorICAgICAgICAgICAgICAgIGInXHg5ZSc6ICgnI3gxN0UnLCAnMTdFJyksCisgICAgICAgICAgICAgICAgYidceDlmJzogKCdZdW1sJywgJycpLH0KKworICAgICMgQSBwYXJvY2hpYWwgcGFydGlhbCBtYXBwaW5nIG9mIElTTy1MYXRpbi0xIHRvIEFTQ0lJLiBDb250YWlucworICAgICMgaG9ycm9ycyBsaWtlIHN0cmlwcGluZyBkaWFjcml0aWNhbCBtYXJrcyB0byB0dXJuIMOhIGludG8gYSwgYnV0IGFsc28KKyAgICAjIGNvbnRhaW5zIG5vbi1ob3Jyb3JzIGxpa2UgdHVybmluZyDigJwgaW50byAiLgorICAgIE1TX0NIQVJTX1RPX0FTQ0lJID0geworICAgICAgICBiJ1x4ODAnIDogJ0VVUicsCisgICAgICAgIGInXHg4MScgOiAnICcsCisgICAgICAgIGInXHg4MicgOiAnLCcsCisgICAgICAgIGInXHg4MycgOiAnZicsCisgICAgICAgIGInXHg4NCcgOiAnLCwnLAorICAgICAgICBiJ1x4ODUnIDogJy4uLicsCisgICAgICAgIGInXHg4NicgOiAnKycsCisgICAgICAgIGInXHg4NycgOiAnKysnLAorICAgICAgICBiJ1x4ODgnIDogJ14nLAorICAgICAgICBiJ1x4ODknIDogJyUnLAorICAgICAgICBiJ1x4OGEnIDogJ1MnLAorICAgICAgICBiJ1x4OGInIDogJzwnLAorICAgICAgICBiJ1x4OGMnIDogJ09FJywKKyAgICAgICAgYidceDhkJyA6ICc/JywKKyAgICAgICAgYidceDhlJyA6ICdaJywKKyAgICAgICAgYidceDhmJyA6ICc/JywKKyAgICAgICAgYidceDkwJyA6ICc/JywKKyAgICAgICAgYidceDkxJyA6ICInIiwKKyAgICAgICAgYidceDkyJyA6ICInIiwKKyAgICAgICAgYidceDkzJyA6ICciJywKKyAgICAgICAgYidceDk0JyA6ICciJywKKyAgICAgICAgYidceDk1JyA6ICcqJywKKyAgICAgICAgYidceDk2JyA6ICctJywKKyAgICAgICAgYidceDk3JyA6ICctLScsCisgICAgICAgIGInXHg5OCcgOiAnficsCisgICAgICAgIGInXHg5OScgOiAnKFRNKScsCisgICAgICAgIGInXHg5YScgOiAncycsCisgICAgICAgIGInXHg5YicgOiAnPicsCisgICAgICAgIGInXHg5YycgOiAnb2UnLAorICAgICAgICBiJ1x4OWQnIDogJz8nLAorICAgICAgICBiJ1x4OWUnIDogJ3onLAorICAgICAgICBiJ1x4OWYnIDogJ1knLAorICAgICAgICBiJ1x4YTAnIDogJyAnLAorICAgICAgICBiJ1x4YTEnIDogJyEnLAorICAgICAgICBiJ1x4YTInIDogJ2MnLAorICAgICAgICBiJ1x4YTMnIDogJ0dCUCcsCisgICAgICAgIGInXHhhNCcgOiAnJCcsICNUaGlzIGFwcHJveGltYXRpb24gaXMgZXNwZWNpYWxseSBwYXJvY2hpYWwtLXRoaXMgaXMgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICNnZW5lcmljIGN1cnJlbmN5IHN5bWJvbC4KKyAgICAgICAgYidceGE1JyA6ICdZRU4nLAorICAgICAgICBiJ1x4YTYnIDogJ3wnLAorICAgICAgICBiJ1x4YTcnIDogJ1MnLAorICAgICAgICBiJ1x4YTgnIDogJy4uJywKKyAgICAgICAgYidceGE5JyA6ICcnLAorICAgICAgICBiJ1x4YWEnIDogJyh0aCknLAorICAgICAgICBiJ1x4YWInIDogJzw8JywKKyAgICAgICAgYidceGFjJyA6ICchJywKKyAgICAgICAgYidceGFkJyA6ICcgJywKKyAgICAgICAgYidceGFlJyA6ICcoUiknLAorICAgICAgICBiJ1x4YWYnIDogJy0nLAorICAgICAgICBiJ1x4YjAnIDogJ28nLAorICAgICAgICBiJ1x4YjEnIDogJystJywKKyAgICAgICAgYidceGIyJyA6ICcyJywKKyAgICAgICAgYidceGIzJyA6ICczJywKKyAgICAgICAgYidceGI0JyA6ICgiJyIsICdhY3V0ZScpLAorICAgICAgICBiJ1x4YjUnIDogJ3UnLAorICAgICAgICBiJ1x4YjYnIDogJ1AnLAorICAgICAgICBiJ1x4YjcnIDogJyonLAorICAgICAgICBiJ1x4YjgnIDogJywnLAorICAgICAgICBiJ1x4YjknIDogJzEnLAorICAgICAgICBiJ1x4YmEnIDogJyh0aCknLAorICAgICAgICBiJ1x4YmInIDogJz4+JywKKyAgICAgICAgYidceGJjJyA6ICcxLzQnLAorICAgICAgICBiJ1x4YmQnIDogJzEvMicsCisgICAgICAgIGInXHhiZScgOiAnMy80JywKKyAgICAgICAgYidceGJmJyA6ICc/JywKKyAgICAgICAgYidceGMwJyA6ICdBJywKKyAgICAgICAgYidceGMxJyA6ICdBJywKKyAgICAgICAgYidceGMyJyA6ICdBJywKKyAgICAgICAgYidceGMzJyA6ICdBJywKKyAgICAgICAgYidceGM0JyA6ICdBJywKKyAgICAgICAgYidceGM1JyA6ICdBJywKKyAgICAgICAgYidceGM2JyA6ICdBRScsCisgICAgICAgIGInXHhjNycgOiAnQycsCisgICAgICAgIGInXHhjOCcgOiAnRScsCisgICAgICAgIGInXHhjOScgOiAnRScsCisgICAgICAgIGInXHhjYScgOiAnRScsCisgICAgICAgIGInXHhjYicgOiAnRScsCisgICAgICAgIGInXHhjYycgOiAnSScsCisgICAgICAgIGInXHhjZCcgOiAnSScsCisgICAgICAgIGInXHhjZScgOiAnSScsCisgICAgICAgIGInXHhjZicgOiAnSScsCisgICAgICAgIGInXHhkMCcgOiAnRCcsCisgICAgICAgIGInXHhkMScgOiAnTicsCisgICAgICAgIGInXHhkMicgOiAnTycsCisgICAgICAgIGInXHhkMycgOiAnTycsCisgICAgICAgIGInXHhkNCcgOiAnTycsCisgICAgICAgIGInXHhkNScgOiAnTycsCisgICAgICAgIGInXHhkNicgOiAnTycsCisgICAgICAgIGInXHhkNycgOiAnKicsCisgICAgICAgIGInXHhkOCcgOiAnTycsCisgICAgICAgIGInXHhkOScgOiAnVScsCisgICAgICAgIGInXHhkYScgOiAnVScsCisgICAgICAgIGInXHhkYicgOiAnVScsCisgICAgICAgIGInXHhkYycgOiAnVScsCisgICAgICAgIGInXHhkZCcgOiAnWScsCisgICAgICAgIGInXHhkZScgOiAnYicsCisgICAgICAgIGInXHhkZicgOiAnQicsCisgICAgICAgIGInXHhlMCcgOiAnYScsCisgICAgICAgIGInXHhlMScgOiAnYScsCisgICAgICAgIGInXHhlMicgOiAnYScsCisgICAgICAgIGInXHhlMycgOiAnYScsCisgICAgICAgIGInXHhlNCcgOiAnYScsCisgICAgICAgIGInXHhlNScgOiAnYScsCisgICAgICAgIGInXHhlNicgOiAnYWUnLAorICAgICAgICBiJ1x4ZTcnIDogJ2MnLAorICAgICAgICBiJ1x4ZTgnIDogJ2UnLAorICAgICAgICBiJ1x4ZTknIDogJ2UnLAorICAgICAgICBiJ1x4ZWEnIDogJ2UnLAorICAgICAgICBiJ1x4ZWInIDogJ2UnLAorICAgICAgICBiJ1x4ZWMnIDogJ2knLAorICAgICAgICBiJ1x4ZWQnIDogJ2knLAorICAgICAgICBiJ1x4ZWUnIDogJ2knLAorICAgICAgICBiJ1x4ZWYnIDogJ2knLAorICAgICAgICBiJ1x4ZjAnIDogJ28nLAorICAgICAgICBiJ1x4ZjEnIDogJ24nLAorICAgICAgICBiJ1x4ZjInIDogJ28nLAorICAgICAgICBiJ1x4ZjMnIDogJ28nLAorICAgICAgICBiJ1x4ZjQnIDogJ28nLAorICAgICAgICBiJ1x4ZjUnIDogJ28nLAorICAgICAgICBiJ1x4ZjYnIDogJ28nLAorICAgICAgICBiJ1x4ZjcnIDogJy8nLAorICAgICAgICBiJ1x4ZjgnIDogJ28nLAorICAgICAgICBiJ1x4ZjknIDogJ3UnLAorICAgICAgICBiJ1x4ZmEnIDogJ3UnLAorICAgICAgICBiJ1x4ZmInIDogJ3UnLAorICAgICAgICBiJ1x4ZmMnIDogJ3UnLAorICAgICAgICBiJ1x4ZmQnIDogJ3knLAorICAgICAgICBiJ1x4ZmUnIDogJ2InLAorICAgICAgICBiJ1x4ZmYnIDogJ3knLAorICAgICAgICB9CisKKyAgICAjIEEgbWFwIHVzZWQgd2hlbiByZW1vdmluZyByb2d1ZSBXaW5kb3dzLTEyNTIvSVNPLTg4NTktMQorICAgICMgY2hhcmFjdGVycyBpbiBvdGhlcndpc2UgVVRGLTggZG9jdW1lbnRzLgorICAgICMKKyAgICAjIE5vdGUgdGhhdCBceDgxLCBceDhkLCBceDhmLCBceDkwLCBhbmQgXHg5ZCBhcmUgdW5kZWZpbmVkIGluCisgICAgIyBXaW5kb3dzLTEyNTIuCisgICAgV0lORE9XU18xMjUyX1RPX1VURjggPSB7CisgICAgICAgIDB4ODAgOiBiJ1x4ZTJceDgyXHhhYycsICMg4oKsCisgICAgICAgIDB4ODIgOiBiJ1x4ZTJceDgwXHg5YScsICMg4oCaCisgICAgICAgIDB4ODMgOiBiJ1x4YzZceDkyJywgICAgICMgxpIKKyAgICAgICAgMHg4NCA6IGInXHhlMlx4ODBceDllJywgIyDigJ4KKyAgICAgICAgMHg4NSA6IGInXHhlMlx4ODBceGE2JywgIyDigKYKKyAgICAgICAgMHg4NiA6IGInXHhlMlx4ODBceGEwJywgIyDigKAKKyAgICAgICAgMHg4NyA6IGInXHhlMlx4ODBceGExJywgIyDigKEKKyAgICAgICAgMHg4OCA6IGInXHhjYlx4ODYnLCAgICAgIyDLhgorICAgICAgICAweDg5IDogYidceGUyXHg4MFx4YjAnLCAjIOKAsAorICAgICAgICAweDhhIDogYidceGM1XHhhMCcsICAgICAjIMWgCisgICAgICAgIDB4OGIgOiBiJ1x4ZTJceDgwXHhiOScsICMg4oC5CisgICAgICAgIDB4OGMgOiBiJ1x4YzVceDkyJywgICAgICMgxZIKKyAgICAgICAgMHg4ZSA6IGInXHhjNVx4YmQnLCAgICAgIyDFvQorICAgICAgICAweDkxIDogYidceGUyXHg4MFx4OTgnLCAjIOKAmAorICAgICAgICAweDkyIDogYidceGUyXHg4MFx4OTknLCAjIOKAmQorICAgICAgICAweDkzIDogYidceGUyXHg4MFx4OWMnLCAjIOKAnAorICAgICAgICAweDk0IDogYidceGUyXHg4MFx4OWQnLCAjIOKAnQorICAgICAgICAweDk1IDogYidceGUyXHg4MFx4YTInLCAjIOKAogorICAgICAgICAweDk2IDogYidceGUyXHg4MFx4OTMnLCAjIOKAkworICAgICAgICAweDk3IDogYidceGUyXHg4MFx4OTQnLCAjIOKAlAorICAgICAgICAweDk4IDogYidceGNiXHg5YycsICAgICAjIMucCisgICAgICAgIDB4OTkgOiBiJ1x4ZTJceDg0XHhhMicsICMg4oSiCisgICAgICAgIDB4OWEgOiBiJ1x4YzVceGExJywgICAgICMgxaEKKyAgICAgICAgMHg5YiA6IGInXHhlMlx4ODBceGJhJywgIyDigLoKKyAgICAgICAgMHg5YyA6IGInXHhjNVx4OTMnLCAgICAgIyDFkworICAgICAgICAweDllIDogYidceGM1XHhiZScsICAgICAjIMW+CisgICAgICAgIDB4OWYgOiBiJ1x4YzVceGI4JywgICAgICMgxbgKKyAgICAgICAgMHhhMCA6IGInXHhjMlx4YTAnLCAgICAgIyDCoAorICAgICAgICAweGExIDogYidceGMyXHhhMScsICAgICAjIMKhCisgICAgICAgIDB4YTIgOiBiJ1x4YzJceGEyJywgICAgICMgwqIKKyAgICAgICAgMHhhMyA6IGInXHhjMlx4YTMnLCAgICAgIyDCoworICAgICAgICAweGE0IDogYidceGMyXHhhNCcsICAgICAjIMKkCisgICAgICAgIDB4YTUgOiBiJ1x4YzJceGE1JywgICAgICMgwqUKKyAgICAgICAgMHhhNiA6IGInXHhjMlx4YTYnLCAgICAgIyDCpgorICAgICAgICAweGE3IDogYidceGMyXHhhNycsICAgICAjIMKnCisgICAgICAgIDB4YTggOiBiJ1x4YzJceGE4JywgICAgICMgwqgKKyAgICAgICAgMHhhOSA6IGInXHhjMlx4YTknLCAgICAgIyDCqQorICAgICAgICAweGFhIDogYidceGMyXHhhYScsICAgICAjIMKqCisgICAgICAgIDB4YWIgOiBiJ1x4YzJceGFiJywgICAgICMgwqsKKyAgICAgICAgMHhhYyA6IGInXHhjMlx4YWMnLCAgICAgIyDCrAorICAgICAgICAweGFkIDogYidceGMyXHhhZCcsICAgICAjIMKtCisgICAgICAgIDB4YWUgOiBiJ1x4YzJceGFlJywgICAgICMgwq4KKyAgICAgICAgMHhhZiA6IGInXHhjMlx4YWYnLCAgICAgIyDCrworICAgICAgICAweGIwIDogYidceGMyXHhiMCcsICAgICAjIMKwCisgICAgICAgIDB4YjEgOiBiJ1x4YzJceGIxJywgICAgICMgwrEKKyAgICAgICAgMHhiMiA6IGInXHhjMlx4YjInLCAgICAgIyDCsgorICAgICAgICAweGIzIDogYidceGMyXHhiMycsICAgICAjIMKzCisgICAgICAgIDB4YjQgOiBiJ1x4YzJceGI0JywgICAgICMgwrQKKyAgICAgICAgMHhiNSA6IGInXHhjMlx4YjUnLCAgICAgIyDCtQorICAgICAgICAweGI2IDogYidceGMyXHhiNicsICAgICAjIMK2CisgICAgICAgIDB4YjcgOiBiJ1x4YzJceGI3JywgICAgICMgwrcKKyAgICAgICAgMHhiOCA6IGInXHhjMlx4YjgnLCAgICAgIyDCuAorICAgICAgICAweGI5IDogYidceGMyXHhiOScsICAgICAjIMK5CisgICAgICAgIDB4YmEgOiBiJ1x4YzJceGJhJywgICAgICMgwroKKyAgICAgICAgMHhiYiA6IGInXHhjMlx4YmInLCAgICAgIyDCuworICAgICAgICAweGJjIDogYidceGMyXHhiYycsICAgICAjIMK8CisgICAgICAgIDB4YmQgOiBiJ1x4YzJceGJkJywgICAgICMgwr0KKyAgICAgICAgMHhiZSA6IGInXHhjMlx4YmUnLCAgICAgIyDCvgorICAgICAgICAweGJmIDogYidceGMyXHhiZicsICAgICAjIMK/CisgICAgICAgIDB4YzAgOiBiJ1x4YzNceDgwJywgICAgICMgw4AKKyAgICAgICAgMHhjMSA6IGInXHhjM1x4ODEnLCAgICAgIyDDgQorICAgICAgICAweGMyIDogYidceGMzXHg4MicsICAgICAjIMOCCisgICAgICAgIDB4YzMgOiBiJ1x4YzNceDgzJywgICAgICMgw4MKKyAgICAgICAgMHhjNCA6IGInXHhjM1x4ODQnLCAgICAgIyDDhAorICAgICAgICAweGM1IDogYidceGMzXHg4NScsICAgICAjIMOFCisgICAgICAgIDB4YzYgOiBiJ1x4YzNceDg2JywgICAgICMgw4YKKyAgICAgICAgMHhjNyA6IGInXHhjM1x4ODcnLCAgICAgIyDDhworICAgICAgICAweGM4IDogYidceGMzXHg4OCcsICAgICAjIMOICisgICAgICAgIDB4YzkgOiBiJ1x4YzNceDg5JywgICAgICMgw4kKKyAgICAgICAgMHhjYSA6IGInXHhjM1x4OGEnLCAgICAgIyDDigorICAgICAgICAweGNiIDogYidceGMzXHg4YicsICAgICAjIMOLCisgICAgICAgIDB4Y2MgOiBiJ1x4YzNceDhjJywgICAgICMgw4wKKyAgICAgICAgMHhjZCA6IGInXHhjM1x4OGQnLCAgICAgIyDDjQorICAgICAgICAweGNlIDogYidceGMzXHg4ZScsICAgICAjIMOOCisgICAgICAgIDB4Y2YgOiBiJ1x4YzNceDhmJywgICAgICMgw48KKyAgICAgICAgMHhkMCA6IGInXHhjM1x4OTAnLCAgICAgIyDDkAorICAgICAgICAweGQxIDogYidceGMzXHg5MScsICAgICAjIMORCisgICAgICAgIDB4ZDIgOiBiJ1x4YzNceDkyJywgICAgICMgw5IKKyAgICAgICAgMHhkMyA6IGInXHhjM1x4OTMnLCAgICAgIyDDkworICAgICAgICAweGQ0IDogYidceGMzXHg5NCcsICAgICAjIMOUCisgICAgICAgIDB4ZDUgOiBiJ1x4YzNceDk1JywgICAgICMgw5UKKyAgICAgICAgMHhkNiA6IGInXHhjM1x4OTYnLCAgICAgIyDDlgorICAgICAgICAweGQ3IDogYidceGMzXHg5NycsICAgICAjIMOXCisgICAgICAgIDB4ZDggOiBiJ1x4YzNceDk4JywgICAgICMgw5gKKyAgICAgICAgMHhkOSA6IGInXHhjM1x4OTknLCAgICAgIyDDmQorICAgICAgICAweGRhIDogYidceGMzXHg5YScsICAgICAjIMOaCisgICAgICAgIDB4ZGIgOiBiJ1x4YzNceDliJywgICAgICMgw5sKKyAgICAgICAgMHhkYyA6IGInXHhjM1x4OWMnLCAgICAgIyDDnAorICAgICAgICAweGRkIDogYidceGMzXHg5ZCcsICAgICAjIMOdCisgICAgICAgIDB4ZGUgOiBiJ1x4YzNceDllJywgICAgICMgw54KKyAgICAgICAgMHhkZiA6IGInXHhjM1x4OWYnLCAgICAgIyDDnworICAgICAgICAweGUwIDogYidceGMzXHhhMCcsICAgICAjIMOgCisgICAgICAgIDB4ZTEgOiBiJ1x4YTEnLCAgICAgIyDDoQorICAgICAgICAweGUyIDogYidceGMzXHhhMicsICAgICAjIMOiCisgICAgICAgIDB4ZTMgOiBiJ1x4YzNceGEzJywgICAgICMgw6MKKyAgICAgICAgMHhlNCA6IGInXHhjM1x4YTQnLCAgICAgIyDDpAorICAgICAgICAweGU1IDogYidceGMzXHhhNScsICAgICAjIMOlCisgICAgICAgIDB4ZTYgOiBiJ1x4YzNceGE2JywgICAgICMgw6YKKyAgICAgICAgMHhlNyA6IGInXHhjM1x4YTcnLCAgICAgIyDDpworICAgICAgICAweGU4IDogYidceGMzXHhhOCcsICAgICAjIMOoCisgICAgICAgIDB4ZTkgOiBiJ1x4YzNceGE5JywgICAgICMgw6kKKyAgICAgICAgMHhlYSA6IGInXHhjM1x4YWEnLCAgICAgIyDDqgorICAgICAgICAweGViIDogYidceGMzXHhhYicsICAgICAjIMOrCisgICAgICAgIDB4ZWMgOiBiJ1x4YzNceGFjJywgICAgICMgw6wKKyAgICAgICAgMHhlZCA6IGInXHhjM1x4YWQnLCAgICAgIyDDrQorICAgICAgICAweGVlIDogYidceGMzXHhhZScsICAgICAjIMOuCisgICAgICAgIDB4ZWYgOiBiJ1x4YzNceGFmJywgICAgICMgw68KKyAgICAgICAgMHhmMCA6IGInXHhjM1x4YjAnLCAgICAgIyDDsAorICAgICAgICAweGYxIDogYidceGMzXHhiMScsICAgICAjIMOxCisgICAgICAgIDB4ZjIgOiBiJ1x4YzNceGIyJywgICAgICMgw7IKKyAgICAgICAgMHhmMyA6IGInXHhjM1x4YjMnLCAgICAgIyDDsworICAgICAgICAweGY0IDogYidceGMzXHhiNCcsICAgICAjIMO0CisgICAgICAgIDB4ZjUgOiBiJ1x4YzNceGI1JywgICAgICMgw7UKKyAgICAgICAgMHhmNiA6IGInXHhjM1x4YjYnLCAgICAgIyDDtgorICAgICAgICAweGY3IDogYidceGMzXHhiNycsICAgICAjIMO3CisgICAgICAgIDB4ZjggOiBiJ1x4YzNceGI4JywgICAgICMgw7gKKyAgICAgICAgMHhmOSA6IGInXHhjM1x4YjknLCAgICAgIyDDuQorICAgICAgICAweGZhIDogYidceGMzXHhiYScsICAgICAjIMO6CisgICAgICAgIDB4ZmIgOiBiJ1x4YzNceGJiJywgICAgICMgw7sKKyAgICAgICAgMHhmYyA6IGInXHhjM1x4YmMnLCAgICAgIyDDvAorICAgICAgICAweGZkIDogYidceGMzXHhiZCcsICAgICAjIMO9CisgICAgICAgIDB4ZmUgOiBiJ1x4YzNceGJlJywgICAgICMgw74KKyAgICAgICAgfQorCisgICAgTVVMVElCWVRFX01BUktFUlNfQU5EX1NJWkVTID0gWworICAgICAgICAoMHhjMiwgMHhkZiwgMiksICMgMi1ieXRlIGNoYXJhY3RlcnMgc3RhcnQgd2l0aCBhIGJ5dGUgQzItREYKKyAgICAgICAgKDB4ZTAsIDB4ZWYsIDMpLCAjIDMtYnl0ZSBjaGFyYWN0ZXJzIHN0YXJ0IHdpdGggRTAtRUYKKyAgICAgICAgKDB4ZjAsIDB4ZjQsIDQpLCAjIDQtYnl0ZSBjaGFyYWN0ZXJzIHN0YXJ0IHdpdGggRjAtRjQKKyAgICAgICAgXQorCisgICAgRklSU1RfTVVMVElCWVRFX01BUktFUiA9IE1VTFRJQllURV9NQVJLRVJTX0FORF9TSVpFU1swXVswXQorICAgIExBU1RfTVVMVElCWVRFX01BUktFUiA9IE1VTFRJQllURV9NQVJLRVJTX0FORF9TSVpFU1stMV1bMV0KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBkZXR3aW5nbGUoY2xzLCBpbl9ieXRlcywgbWFpbl9lbmNvZGluZz0idXRmOCIsCisgICAgICAgICAgICAgICAgICBlbWJlZGRlZF9lbmNvZGluZz0id2luZG93cy0xMjUyIik6CisgICAgICAgICIiIkZpeCBjaGFyYWN0ZXJzIGZyb20gb25lIGVuY29kaW5nIGVtYmVkZGVkIGluIHNvbWUgb3RoZXIgZW5jb2RpbmcuCisKKyAgICAgICAgQ3VycmVudGx5IHRoZSBvbmx5IHNpdHVhdGlvbiBzdXBwb3J0ZWQgaXMgV2luZG93cy0xMjUyIChvciBpdHMKKyAgICAgICAgc3Vic2V0IElTTy04ODU5LTEpLCBlbWJlZGRlZCBpbiBVVEYtOC4KKworICAgICAgICBUaGUgaW5wdXQgbXVzdCBiZSBhIGJ5dGVzdHJpbmcuIElmIHlvdSd2ZSBhbHJlYWR5IGNvbnZlcnRlZAorICAgICAgICB0aGUgZG9jdW1lbnQgdG8gVW5pY29kZSwgeW91J3JlIHRvbyBsYXRlLgorCisgICAgICAgIFRoZSBvdXRwdXQgaXMgYSBieXRlc3RyaW5nIGluIHdoaWNoIGBlbWJlZGRlZF9lbmNvZGluZ2AKKyAgICAgICAgY2hhcmFjdGVycyBoYXZlIGJlZW4gY29udmVydGVkIHRvIHRoZWlyIGBtYWluX2VuY29kaW5nYAorICAgICAgICBlcXVpdmFsZW50cy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGVtYmVkZGVkX2VuY29kaW5nLnJlcGxhY2UoJ18nLCAnLScpLmxvd2VyKCkgbm90IGluICgKKyAgICAgICAgICAgICd3aW5kb3dzLTEyNTInLCAnd2luZG93c18xMjUyJyk6CisgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAorICAgICAgICAgICAgICAgICJXaW5kb3dzLTEyNTIgYW5kIElTTy04ODU5LTEgYXJlIHRoZSBvbmx5IGN1cnJlbnRseSBzdXBwb3J0ZWQgIgorICAgICAgICAgICAgICAgICJlbWJlZGRlZCBlbmNvZGluZ3MuIikKKworICAgICAgICBpZiBtYWluX2VuY29kaW5nLmxvd2VyKCkgbm90IGluICgndXRmOCcsICd1dGYtOCcpOgorICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKKyAgICAgICAgICAgICAgICAiVVRGLTggaXMgdGhlIG9ubHkgY3VycmVudGx5IHN1cHBvcnRlZCBtYWluIGVuY29kaW5nLiIpCisKKyAgICAgICAgYnl0ZV9jaHVua3MgPSBbXQorCisgICAgICAgIGNodW5rX3N0YXJ0ID0gMAorICAgICAgICBwb3MgPSAwCisgICAgICAgIHdoaWxlIHBvcyA8IGxlbihpbl9ieXRlcyk6CisgICAgICAgICAgICBieXRlID0gaW5fYnl0ZXNbcG9zXQorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYnl0ZSwgaW50KToKKyAgICAgICAgICAgICAgICAjIFB5dGhvbiAyLngKKyAgICAgICAgICAgICAgICBieXRlID0gb3JkKGJ5dGUpCisgICAgICAgICAgICBpZiAoYnl0ZSA+PSBjbHMuRklSU1RfTVVMVElCWVRFX01BUktFUgorICAgICAgICAgICAgICAgIGFuZCBieXRlIDw9IGNscy5MQVNUX01VTFRJQllURV9NQVJLRVIpOgorICAgICAgICAgICAgICAgICMgVGhpcyBpcyB0aGUgc3RhcnQgb2YgYSBVVEYtOCBtdWx0aWJ5dGUgY2hhcmFjdGVyLiBTa2lwCisgICAgICAgICAgICAgICAgIyB0byB0aGUgZW5kLgorICAgICAgICAgICAgICAgIGZvciBzdGFydCwgZW5kLCBzaXplIGluIGNscy5NVUxUSUJZVEVfTUFSS0VSU19BTkRfU0laRVM6CisgICAgICAgICAgICAgICAgICAgIGlmIGJ5dGUgPj0gc3RhcnQgYW5kIGJ5dGUgPD0gZW5kOgorICAgICAgICAgICAgICAgICAgICAgICAgcG9zICs9IHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbGlmIGJ5dGUgPj0gMHg4MCBhbmQgYnl0ZSBpbiBjbHMuV0lORE9XU18xMjUyX1RPX1VURjg6CisgICAgICAgICAgICAgICAgIyBXZSBmb3VuZCBhIFdpbmRvd3MtMTI1MiBjaGFyYWN0ZXIhCisgICAgICAgICAgICAgICAgIyBTYXZlIHRoZSBzdHJpbmcgdXAgdG8gdGhpcyBwb2ludCBhcyBhIGNodW5rLgorICAgICAgICAgICAgICAgIGJ5dGVfY2h1bmtzLmFwcGVuZChpbl9ieXRlc1tjaHVua19zdGFydDpwb3NdKQorCisgICAgICAgICAgICAgICAgIyBOb3cgdHJhbnNsYXRlIHRoZSBXaW5kb3dzLTEyNTIgY2hhcmFjdGVyIGludG8gVVRGLTgKKyAgICAgICAgICAgICAgICAjIGFuZCBhZGQgaXQgYXMgYW5vdGhlciwgb25lLWJ5dGUgY2h1bmsuCisgICAgICAgICAgICAgICAgYnl0ZV9jaHVua3MuYXBwZW5kKGNscy5XSU5ET1dTXzEyNTJfVE9fVVRGOFtieXRlXSkKKyAgICAgICAgICAgICAgICBwb3MgKz0gMQorICAgICAgICAgICAgICAgIGNodW5rX3N0YXJ0ID0gcG9zCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgR28gb24gdG8gdGhlIG5leHQgY2hhcmFjdGVyLgorICAgICAgICAgICAgICAgIHBvcyArPSAxCisgICAgICAgIGlmIGNodW5rX3N0YXJ0ID09IDA6CisgICAgICAgICAgICAjIFRoZSBzdHJpbmcgaXMgdW5jaGFuZ2VkLgorICAgICAgICAgICAgcmV0dXJuIGluX2J5dGVzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFN0b3JlIHRoZSBmaW5hbCBjaHVuay4KKyAgICAgICAgICAgIGJ5dGVfY2h1bmtzLmFwcGVuZChpbl9ieXRlc1tjaHVua19zdGFydDpdKQorICAgICAgICByZXR1cm4gYicnLmpvaW4oYnl0ZV9jaHVua3MpCisKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JzNC9kaWFnbm9zZS5weSBiL2JpdGJha2UvbGliL2JzNC9kaWFnbm9zZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDBiMDBhCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYnM0L2RpYWdub3NlLnB5CkBAIC0wLDAgKzEsMjA0IEBACisiIiJEaWFnbm9zdGljIGZ1bmN0aW9ucywgbWFpbmx5IGZvciB1c2Ugd2hlbiBkb2luZyB0ZWNoIHN1cHBvcnQuIiIiCitpbXBvcnQgY1Byb2ZpbGUKK2Zyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitmcm9tIEhUTUxQYXJzZXIgaW1wb3J0IEhUTUxQYXJzZXIKK2ltcG9ydCBiczQKK2Zyb20gYnM0IGltcG9ydCBCZWF1dGlmdWxTb3VwLCBfX3ZlcnNpb25fXworZnJvbSBiczQuYnVpbGRlciBpbXBvcnQgYnVpbGRlcl9yZWdpc3RyeQorCitpbXBvcnQgb3MKK2ltcG9ydCBwc3RhdHMKK2ltcG9ydCByYW5kb20KK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHRpbWUKK2ltcG9ydCB0cmFjZWJhY2sKK2ltcG9ydCBzeXMKK2ltcG9ydCBjUHJvZmlsZQorCitkZWYgZGlhZ25vc2UoZGF0YSk6CisgICAgIiIiRGlhZ25vc3RpYyBzdWl0ZSBmb3IgaXNvbGF0aW5nIGNvbW1vbiBwcm9ibGVtcy4iIiIKKyAgICBwcmludCAiRGlhZ25vc3RpYyBydW5uaW5nIG9uIEJlYXV0aWZ1bCBTb3VwICVzIiAlIF9fdmVyc2lvbl9fCisgICAgcHJpbnQgIlB5dGhvbiB2ZXJzaW9uICVzIiAlIHN5cy52ZXJzaW9uCisKKyAgICBiYXNpY19wYXJzZXJzID0gWyJodG1sLnBhcnNlciIsICJodG1sNWxpYiIsICJseG1sIl0KKyAgICBmb3IgbmFtZSBpbiBiYXNpY19wYXJzZXJzOgorICAgICAgICBmb3IgYnVpbGRlciBpbiBidWlsZGVyX3JlZ2lzdHJ5LmJ1aWxkZXJzOgorICAgICAgICAgICAgaWYgbmFtZSBpbiBidWlsZGVyLmZlYXR1cmVzOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBiYXNpY19wYXJzZXJzLnJlbW92ZShuYW1lKQorICAgICAgICAgICAgcHJpbnQgKAorICAgICAgICAgICAgICAgICJJIG5vdGljZWQgdGhhdCAlcyBpcyBub3QgaW5zdGFsbGVkLiBJbnN0YWxsaW5nIGl0IG1heSBoZWxwLiIgJQorICAgICAgICAgICAgICAgIG5hbWUpCisKKyAgICBpZiAnbHhtbCcgaW4gYmFzaWNfcGFyc2VyczoKKyAgICAgICAgYmFzaWNfcGFyc2Vycy5hcHBlbmQoWyJseG1sIiwgInhtbCJdKQorICAgICAgICBmcm9tIGx4bWwgaW1wb3J0IGV0cmVlCisgICAgICAgIHByaW50ICJGb3VuZCBseG1sIHZlcnNpb24gJXMiICUgIi4iLmpvaW4obWFwKHN0cixldHJlZS5MWE1MX1ZFUlNJT04pKQorCisgICAgaWYgJ2h0bWw1bGliJyBpbiBiYXNpY19wYXJzZXJzOgorICAgICAgICBpbXBvcnQgaHRtbDVsaWIKKyAgICAgICAgcHJpbnQgIkZvdW5kIGh0bWw1bGliIHZlcnNpb24gJXMiICUgaHRtbDVsaWIuX192ZXJzaW9uX18KKworICAgIGlmIGhhc2F0dHIoZGF0YSwgJ3JlYWQnKToKKyAgICAgICAgZGF0YSA9IGRhdGEucmVhZCgpCisgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyhkYXRhKToKKyAgICAgICAgcHJpbnQgJyIlcyIgbG9va3MgbGlrZSBhIGZpbGVuYW1lLiBSZWFkaW5nIGRhdGEgZnJvbSB0aGUgZmlsZS4nICUgZGF0YQorICAgICAgICBkYXRhID0gb3BlbihkYXRhKS5yZWFkKCkKKyAgICBlbGlmIGRhdGEuc3RhcnRzd2l0aCgiaHR0cDoiKSBvciBkYXRhLnN0YXJ0c3dpdGgoImh0dHBzOiIpOgorICAgICAgICBwcmludCAnIiVzIiBsb29rcyBsaWtlIGEgVVJMLiBCZWF1dGlmdWwgU291cCBpcyBub3QgYW4gSFRUUCBjbGllbnQuJyAlIGRhdGEKKyAgICAgICAgcHJpbnQgIllvdSBuZWVkIHRvIHVzZSBzb21lIG90aGVyIGxpYnJhcnkgdG8gZ2V0IHRoZSBkb2N1bWVudCBiZWhpbmQgdGhlIFVSTCwgYW5kIGZlZWQgdGhhdCBkb2N1bWVudCB0byBCZWF1dGlmdWwgU291cC4iCisgICAgICAgIHJldHVybgorICAgIHByaW50CisKKyAgICBmb3IgcGFyc2VyIGluIGJhc2ljX3BhcnNlcnM6CisgICAgICAgIHByaW50ICJUcnlpbmcgdG8gcGFyc2UgeW91ciBtYXJrdXAgd2l0aCAlcyIgJSBwYXJzZXIKKyAgICAgICAgc3VjY2VzcyA9IEZhbHNlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNvdXAgPSBCZWF1dGlmdWxTb3VwKGRhdGEsIHBhcnNlcikKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSBUcnVlCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGU6CisgICAgICAgICAgICBwcmludCAiJXMgY291bGQgbm90IHBhcnNlIHRoZSBtYXJrdXAuIiAlIHBhcnNlcgorICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCisgICAgICAgIGlmIHN1Y2Nlc3M6CisgICAgICAgICAgICBwcmludCAiSGVyZSdzIHdoYXQgJXMgZGlkIHdpdGggdGhlIG1hcmt1cDoiICUgcGFyc2VyCisgICAgICAgICAgICBwcmludCBzb3VwLnByZXR0aWZ5KCkKKworICAgICAgICBwcmludCAiLSIgKiA4MAorCitkZWYgbHhtbF90cmFjZShkYXRhLCBodG1sPVRydWUsICoqa3dhcmdzKToKKyAgICAiIiJQcmludCBvdXQgdGhlIGx4bWwgZXZlbnRzIHRoYXQgb2NjdXIgZHVyaW5nIHBhcnNpbmcuCisKKyAgICBUaGlzIGxldHMgeW91IHNlZSBob3cgbHhtbCBwYXJzZXMgYSBkb2N1bWVudCB3aGVuIG5vIEJlYXV0aWZ1bAorICAgIFNvdXAgY29kZSBpcyBydW5uaW5nLgorICAgICIiIgorICAgIGZyb20gbHhtbCBpbXBvcnQgZXRyZWUKKyAgICBmb3IgZXZlbnQsIGVsZW1lbnQgaW4gZXRyZWUuaXRlcnBhcnNlKFN0cmluZ0lPKGRhdGEpLCBodG1sPWh0bWwsICoqa3dhcmdzKToKKyAgICAgICAgcHJpbnQoIiVzLCAlNHMsICVzIiAlIChldmVudCwgZWxlbWVudC50YWcsIGVsZW1lbnQudGV4dCkpCisKK2NsYXNzIEFubm91bmNpbmdQYXJzZXIoSFRNTFBhcnNlcik6CisgICAgIiIiQW5ub3VuY2VzIEhUTUxQYXJzZXIgcGFyc2UgZXZlbnRzLCB3aXRob3V0IGRvaW5nIGFueXRoaW5nIGVsc2UuIiIiCisKKyAgICBkZWYgX3Aoc2VsZiwgcyk6CisgICAgICAgIHByaW50KHMpCisKKyAgICBkZWYgaGFuZGxlX3N0YXJ0dGFnKHNlbGYsIG5hbWUsIGF0dHJzKToKKyAgICAgICAgc2VsZi5fcCgiJXMgU1RBUlQiICUgbmFtZSkKKworICAgIGRlZiBoYW5kbGVfZW5kdGFnKHNlbGYsIG5hbWUpOgorICAgICAgICBzZWxmLl9wKCIlcyBFTkQiICUgbmFtZSkKKworICAgIGRlZiBoYW5kbGVfZGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5fcCgiJXMgREFUQSIgJSBkYXRhKQorCisgICAgZGVmIGhhbmRsZV9jaGFycmVmKHNlbGYsIG5hbWUpOgorICAgICAgICBzZWxmLl9wKCIlcyBDSEFSUkVGIiAlIG5hbWUpCisKKyAgICBkZWYgaGFuZGxlX2VudGl0eXJlZihzZWxmLCBuYW1lKToKKyAgICAgICAgc2VsZi5fcCgiJXMgRU5USVRZUkVGIiAlIG5hbWUpCisKKyAgICBkZWYgaGFuZGxlX2NvbW1lbnQoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuX3AoIiVzIENPTU1FTlQiICUgZGF0YSkKKworICAgIGRlZiBoYW5kbGVfZGVjbChzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5fcCgiJXMgREVDTCIgJSBkYXRhKQorCisgICAgZGVmIHVua25vd25fZGVjbChzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5fcCgiJXMgVU5LTk9XTi1ERUNMIiAlIGRhdGEpCisKKyAgICBkZWYgaGFuZGxlX3BpKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLl9wKCIlcyBQSSIgJSBkYXRhKQorCitkZWYgaHRtbHBhcnNlcl90cmFjZShkYXRhKToKKyAgICAiIiJQcmludCBvdXQgdGhlIEhUTUxQYXJzZXIgZXZlbnRzIHRoYXQgb2NjdXIgZHVyaW5nIHBhcnNpbmcuCisKKyAgICBUaGlzIGxldHMgeW91IHNlZSBob3cgSFRNTFBhcnNlciBwYXJzZXMgYSBkb2N1bWVudCB3aGVuIG5vCisgICAgQmVhdXRpZnVsIFNvdXAgY29kZSBpcyBydW5uaW5nLgorICAgICIiIgorICAgIHBhcnNlciA9IEFubm91bmNpbmdQYXJzZXIoKQorICAgIHBhcnNlci5mZWVkKGRhdGEpCisKK192b3dlbHMgPSAiYWVpb3UiCitfY29uc29uYW50cyA9ICJiY2RmZ2hqa2xtbnBxcnN0dnd4eXoiCisKK2RlZiByd29yZChsZW5ndGg9NSk6CisgICAgIkdlbmVyYXRlIGEgcmFuZG9tIHdvcmQtbGlrZSBzdHJpbmcuIgorICAgIHMgPSAnJworICAgIGZvciBpIGluIHJhbmdlKGxlbmd0aCk6CisgICAgICAgIGlmIGkgJSAyID09IDA6CisgICAgICAgICAgICB0ID0gX2NvbnNvbmFudHMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHQgPSBfdm93ZWxzCisgICAgICAgIHMgKz0gcmFuZG9tLmNob2ljZSh0KQorICAgIHJldHVybiBzCisKK2RlZiByc2VudGVuY2UobGVuZ3RoPTQpOgorICAgICJHZW5lcmF0ZSBhIHJhbmRvbSBzZW50ZW5jZS1saWtlIHN0cmluZy4iCisgICAgcmV0dXJuICIgIi5qb2luKHJ3b3JkKHJhbmRvbS5yYW5kaW50KDQsOSkpIGZvciBpIGluIHJhbmdlKGxlbmd0aCkpCisgICAgICAgIAorZGVmIHJkb2MobnVtX2VsZW1lbnRzPTEwMDApOgorICAgICIiIlJhbmRvbWx5IGdlbmVyYXRlIGFuIGludmFsaWQgSFRNTCBkb2N1bWVudC4iIiIKKyAgICB0YWdfbmFtZXMgPSBbJ3AnLCAnZGl2JywgJ3NwYW4nLCAnaScsICdiJywgJ3NjcmlwdCcsICd0YWJsZSddCisgICAgZWxlbWVudHMgPSBbXQorICAgIGZvciBpIGluIHJhbmdlKG51bV9lbGVtZW50cyk6CisgICAgICAgIGNob2ljZSA9IHJhbmRvbS5yYW5kaW50KDAsMykKKyAgICAgICAgaWYgY2hvaWNlID09IDA6CisgICAgICAgICAgICAjIE5ldyB0YWcuCisgICAgICAgICAgICB0YWdfbmFtZSA9IHJhbmRvbS5jaG9pY2UodGFnX25hbWVzKQorICAgICAgICAgICAgZWxlbWVudHMuYXBwZW5kKCI8JXM+IiAlIHRhZ19uYW1lKQorICAgICAgICBlbGlmIGNob2ljZSA9PSAxOgorICAgICAgICAgICAgZWxlbWVudHMuYXBwZW5kKHJzZW50ZW5jZShyYW5kb20ucmFuZGludCgxLDQpKSkKKyAgICAgICAgZWxpZiBjaG9pY2UgPT0gMjoKKyAgICAgICAgICAgICMgQ2xvc2UgYSB0YWcuCisgICAgICAgICAgICB0YWdfbmFtZSA9IHJhbmRvbS5jaG9pY2UodGFnX25hbWVzKQorICAgICAgICAgICAgZWxlbWVudHMuYXBwZW5kKCI8LyVzPiIgJSB0YWdfbmFtZSkKKyAgICByZXR1cm4gIjxodG1sPiIgKyAiXG4iLmpvaW4oZWxlbWVudHMpICsgIjwvaHRtbD4iCisKK2RlZiBiZW5jaG1hcmtfcGFyc2VycyhudW1fZWxlbWVudHM9MTAwMDAwKToKKyAgICAiIiJWZXJ5IGJhc2ljIGhlYWQtdG8taGVhZCBwZXJmb3JtYW5jZSBiZW5jaG1hcmsuIiIiCisgICAgcHJpbnQgIkNvbXBhcmF0aXZlIHBhcnNlciBiZW5jaG1hcmsgb24gQmVhdXRpZnVsIFNvdXAgJXMiICUgX192ZXJzaW9uX18KKyAgICBkYXRhID0gcmRvYyhudW1fZWxlbWVudHMpCisgICAgcHJpbnQgIkdlbmVyYXRlZCBhIGxhcmdlIGludmFsaWQgSFRNTCBkb2N1bWVudCAoJWQgYnl0ZXMpLiIgJSBsZW4oZGF0YSkKKyAgICAKKyAgICBmb3IgcGFyc2VyIGluIFsibHhtbCIsIFsibHhtbCIsICJodG1sIl0sICJodG1sNWxpYiIsICJodG1sLnBhcnNlciJdOgorICAgICAgICBzdWNjZXNzID0gRmFsc2UKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYSA9IHRpbWUudGltZSgpCisgICAgICAgICAgICBzb3VwID0gQmVhdXRpZnVsU291cChkYXRhLCBwYXJzZXIpCisgICAgICAgICAgICBiID0gdGltZS50aW1lKCkKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSBUcnVlCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGU6CisgICAgICAgICAgICBwcmludCAiJXMgY291bGQgbm90IHBhcnNlIHRoZSBtYXJrdXAuIiAlIHBhcnNlcgorICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCisgICAgICAgIGlmIHN1Y2Nlc3M6CisgICAgICAgICAgICBwcmludCAiQlM0KyVzIHBhcnNlZCB0aGUgbWFya3VwIGluICUuMmZzLiIgJSAocGFyc2VyLCBiLWEpCisKKyAgICBmcm9tIGx4bWwgaW1wb3J0IGV0cmVlCisgICAgYSA9IHRpbWUudGltZSgpCisgICAgZXRyZWUuSFRNTChkYXRhKQorICAgIGIgPSB0aW1lLnRpbWUoKQorICAgIHByaW50ICJSYXcgbHhtbCBwYXJzZWQgdGhlIG1hcmt1cCBpbiAlLjJmcy4iICUgKGItYSkKKworICAgIGltcG9ydCBodG1sNWxpYgorICAgIHBhcnNlciA9IGh0bWw1bGliLkhUTUxQYXJzZXIoKQorICAgIGEgPSB0aW1lLnRpbWUoKQorICAgIHBhcnNlci5wYXJzZShkYXRhKQorICAgIGIgPSB0aW1lLnRpbWUoKQorICAgIHByaW50ICJSYXcgaHRtbDVsaWIgcGFyc2VkIHRoZSBtYXJrdXAgaW4gJS4yZnMuIiAlIChiLWEpCisKK2RlZiBwcm9maWxlKG51bV9lbGVtZW50cz0xMDAwMDAsIHBhcnNlcj0ibHhtbCIpOgorCisgICAgZmlsZWhhbmRsZSA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgpCisgICAgZmlsZW5hbWUgPSBmaWxlaGFuZGxlLm5hbWUKKworICAgIGRhdGEgPSByZG9jKG51bV9lbGVtZW50cykKKyAgICB2YXJzID0gZGljdChiczQ9YnM0LCBkYXRhPWRhdGEsIHBhcnNlcj1wYXJzZXIpCisgICAgY1Byb2ZpbGUucnVuY3R4KCdiczQuQmVhdXRpZnVsU291cChkYXRhLCBwYXJzZXIpJyAsIHZhcnMsIHZhcnMsIGZpbGVuYW1lKQorCisgICAgc3RhdHMgPSBwc3RhdHMuU3RhdHMoZmlsZW5hbWUpCisgICAgIyBzdGF0cy5zdHJpcF9kaXJzKCkKKyAgICBzdGF0cy5zb3J0X3N0YXRzKCJjdW11bGF0aXZlIikKKyAgICBzdGF0cy5wcmludF9zdGF0cygnX2h0bWw1bGlifGJzNCcsIDUwKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGRpYWdub3NlKHN5cy5zdGRpbi5yZWFkKCkpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iczQvZWxlbWVudC5weSBiL2JpdGJha2UvbGliL2JzNC9lbGVtZW50LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhOWFmZGYKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iczQvZWxlbWVudC5weQpAQCAtMCwwICsxLDE2MTEgQEAKK2ltcG9ydCBjb2xsZWN0aW9ucworaW1wb3J0IHJlCitpbXBvcnQgc3lzCitpbXBvcnQgd2FybmluZ3MKK2Zyb20gYnM0LmRhbW1pdCBpbXBvcnQgRW50aXR5U3Vic3RpdHV0aW9uCisKK0RFRkFVTFRfT1VUUFVUX0VOQ09ESU5HID0gInV0Zi04IgorUFkzSyA9IChzeXMudmVyc2lvbl9pbmZvWzBdID4gMikKKword2hpdGVzcGFjZV9yZSA9IHJlLmNvbXBpbGUoIlxzKyIpCisKK2RlZiBfYWxpYXMoYXR0cik6CisgICAgIiIiQWxpYXMgb25lIGF0dHJpYnV0ZSBuYW1lIHRvIGFub3RoZXIgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkiIiIKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgYWxpYXMoc2VsZik6CisgICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYsIGF0dHIpCisKKyAgICBAYWxpYXMuc2V0dGVyCisgICAgZGVmIGFsaWFzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2V0YXR0cihzZWxmLCBhdHRyKQorICAgIHJldHVybiBhbGlhcworCisKK2NsYXNzIE5hbWVzcGFjZWRBdHRyaWJ1dGUodW5pY29kZSk6CisKKyAgICBkZWYgX19uZXdfXyhjbHMsIHByZWZpeCwgbmFtZSwgbmFtZXNwYWNlPU5vbmUpOgorICAgICAgICBpZiBuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICBvYmogPSB1bmljb2RlLl9fbmV3X18oY2xzLCBwcmVmaXgpCisgICAgICAgIGVsaWYgcHJlZml4IGlzIE5vbmU6CisgICAgICAgICAgICAjIE5vdCByZWFsbHkgbmFtZXNwYWNlZC4KKyAgICAgICAgICAgIG9iaiA9IHVuaWNvZGUuX19uZXdfXyhjbHMsIG5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvYmogPSB1bmljb2RlLl9fbmV3X18oY2xzLCBwcmVmaXggKyAiOiIgKyBuYW1lKQorICAgICAgICBvYmoucHJlZml4ID0gcHJlZml4CisgICAgICAgIG9iai5uYW1lID0gbmFtZQorICAgICAgICBvYmoubmFtZXNwYWNlID0gbmFtZXNwYWNlCisgICAgICAgIHJldHVybiBvYmoKKworY2xhc3MgQXR0cmlidXRlVmFsdWVXaXRoQ2hhcnNldFN1YnN0aXR1dGlvbih1bmljb2RlKToKKyAgICAiIiJBIHN0YW5kLWluIG9iamVjdCBmb3IgYSBjaGFyYWN0ZXIgZW5jb2Rpbmcgc3BlY2lmaWVkIGluIEhUTUwuIiIiCisKK2NsYXNzIENoYXJzZXRNZXRhQXR0cmlidXRlVmFsdWUoQXR0cmlidXRlVmFsdWVXaXRoQ2hhcnNldFN1YnN0aXR1dGlvbik6CisgICAgIiIiQSBnZW5lcmljIHN0YW5kLWluIGZvciB0aGUgdmFsdWUgb2YgYSBtZXRhIHRhZydzICdjaGFyc2V0JyBhdHRyaWJ1dGUuCisKKyAgICBXaGVuIEJlYXV0aWZ1bCBTb3VwIHBhcnNlcyB0aGUgbWFya3VwICc8bWV0YSBjaGFyc2V0PSJ1dGY4Ij4nLCB0aGUKKyAgICB2YWx1ZSBvZiB0aGUgJ2NoYXJzZXQnIGF0dHJpYnV0ZSB3aWxsIGJlIG9uZSBvZiB0aGVzZSBvYmplY3RzLgorICAgICIiIgorCisgICAgZGVmIF9fbmV3X18oY2xzLCBvcmlnaW5hbF92YWx1ZSk6CisgICAgICAgIG9iaiA9IHVuaWNvZGUuX19uZXdfXyhjbHMsIG9yaWdpbmFsX3ZhbHVlKQorICAgICAgICBvYmoub3JpZ2luYWxfdmFsdWUgPSBvcmlnaW5hbF92YWx1ZQorICAgICAgICByZXR1cm4gb2JqCisKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGVuY29kaW5nKToKKyAgICAgICAgcmV0dXJuIGVuY29kaW5nCisKKworY2xhc3MgQ29udGVudE1ldGFBdHRyaWJ1dGVWYWx1ZShBdHRyaWJ1dGVWYWx1ZVdpdGhDaGFyc2V0U3Vic3RpdHV0aW9uKToKKyAgICAiIiJBIGdlbmVyaWMgc3RhbmQtaW4gZm9yIHRoZSB2YWx1ZSBvZiBhIG1ldGEgdGFnJ3MgJ2NvbnRlbnQnIGF0dHJpYnV0ZS4KKworICAgIFdoZW4gQmVhdXRpZnVsIFNvdXAgcGFyc2VzIHRoZSBtYXJrdXA6CisgICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0ZjgiPgorCisgICAgVGhlIHZhbHVlIG9mIHRoZSAnY29udGVudCcgYXR0cmlidXRlIHdpbGwgYmUgb25lIG9mIHRoZXNlIG9iamVjdHMuCisgICAgIiIiCisKKyAgICBDSEFSU0VUX1JFID0gcmUuY29tcGlsZSgiKChefDspXHMqY2hhcnNldD0pKFteO10qKSIsIHJlLk0pCisKKyAgICBkZWYgX19uZXdfXyhjbHMsIG9yaWdpbmFsX3ZhbHVlKToKKyAgICAgICAgbWF0Y2ggPSBjbHMuQ0hBUlNFVF9SRS5zZWFyY2gob3JpZ2luYWxfdmFsdWUpCisgICAgICAgIGlmIG1hdGNoIGlzIE5vbmU6CisgICAgICAgICAgICAjIE5vIHN1YnN0aXR1dGlvbiBuZWNlc3NhcnkuCisgICAgICAgICAgICByZXR1cm4gdW5pY29kZS5fX25ld19fKHVuaWNvZGUsIG9yaWdpbmFsX3ZhbHVlKQorCisgICAgICAgIG9iaiA9IHVuaWNvZGUuX19uZXdfXyhjbHMsIG9yaWdpbmFsX3ZhbHVlKQorICAgICAgICBvYmoub3JpZ2luYWxfdmFsdWUgPSBvcmlnaW5hbF92YWx1ZQorICAgICAgICByZXR1cm4gb2JqCisKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGVuY29kaW5nKToKKyAgICAgICAgZGVmIHJld3JpdGUobWF0Y2gpOgorICAgICAgICAgICAgcmV0dXJuIG1hdGNoLmdyb3VwKDEpICsgZW5jb2RpbmcKKyAgICAgICAgcmV0dXJuIHNlbGYuQ0hBUlNFVF9SRS5zdWIocmV3cml0ZSwgc2VsZi5vcmlnaW5hbF92YWx1ZSkKKworY2xhc3MgSFRNTEF3YXJlRW50aXR5U3Vic3RpdHV0aW9uKEVudGl0eVN1YnN0aXR1dGlvbik6CisKKyAgICAiIiJFbnRpdHkgc3Vic3RpdHV0aW9uIHJ1bGVzIHRoYXQgYXJlIGF3YXJlIG9mIHNvbWUgSFRNTCBxdWlya3MuCisKKyAgICBTcGVjaWZpY2FsbHksIHRoZSBjb250ZW50cyBvZiA8c2NyaXB0PiBhbmQgPHN0eWxlPiB0YWdzIHNob3VsZCBub3QKKyAgICB1bmRlcmdvIGVudGl0eSBzdWJzdGl0dXRpb24uCisKKyAgICBJbmNvbWluZyBOYXZpZ2FibGVTdHJpbmcgb2JqZWN0cyBhcmUgY2hlY2tlZCB0byBzZWUgaWYgdGhleSdyZSB0aGUKKyAgICBkaXJlY3QgY2hpbGRyZW4gb2YgYSA8c2NyaXB0PiBvciA8c3R5bGU+IHRhZy4KKyAgICAiIiIKKworICAgIGNkYXRhX2NvbnRhaW5pbmdfdGFncyA9IHNldChbInNjcmlwdCIsICJzdHlsZSJdKQorCisgICAgcHJlZm9ybWF0dGVkX3RhZ3MgPSBzZXQoWyJwcmUiXSkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfc3Vic3RpdHV0ZV9pZl9hcHByb3ByaWF0ZShjbHMsIG5zLCBmKToKKyAgICAgICAgaWYgKGlzaW5zdGFuY2UobnMsIE5hdmlnYWJsZVN0cmluZykKKyAgICAgICAgICAgIGFuZCBucy5wYXJlbnQgaXMgbm90IE5vbmUKKyAgICAgICAgICAgIGFuZCBucy5wYXJlbnQubmFtZSBpbiBjbHMuY2RhdGFfY29udGFpbmluZ190YWdzKToKKyAgICAgICAgICAgICMgRG8gbm90aGluZy4KKyAgICAgICAgICAgIHJldHVybiBucworICAgICAgICAjIFN1YnN0aXR1dGUuCisgICAgICAgIHJldHVybiBmKG5zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHN1YnN0aXR1dGVfaHRtbChjbHMsIG5zKToKKyAgICAgICAgcmV0dXJuIGNscy5fc3Vic3RpdHV0ZV9pZl9hcHByb3ByaWF0ZSgKKyAgICAgICAgICAgIG5zLCBFbnRpdHlTdWJzdGl0dXRpb24uc3Vic3RpdHV0ZV9odG1sKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHN1YnN0aXR1dGVfeG1sKGNscywgbnMpOgorICAgICAgICByZXR1cm4gY2xzLl9zdWJzdGl0dXRlX2lmX2FwcHJvcHJpYXRlKAorICAgICAgICAgICAgbnMsIEVudGl0eVN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlX3htbCkKKworY2xhc3MgUGFnZUVsZW1lbnQob2JqZWN0KToKKyAgICAiIiJDb250YWlucyB0aGUgbmF2aWdhdGlvbmFsIGluZm9ybWF0aW9uIGZvciBzb21lIHBhcnQgb2YgdGhlIHBhZ2UKKyAgICAoZWl0aGVyIGEgdGFnIG9yIGEgcGllY2Ugb2YgdGV4dCkiIiIKKworICAgICMgVGhlcmUgYXJlIGZpdmUgcG9zc2libGUgdmFsdWVzIGZvciB0aGUgImZvcm1hdHRlciIgYXJndW1lbnQgcGFzc2VkIGluCisgICAgIyB0byBtZXRob2RzIGxpa2UgZW5jb2RlKCkgYW5kIHByZXR0aWZ5KCk6CisgICAgIworICAgICMgImh0bWwiIC0gQWxsIFVuaWNvZGUgY2hhcmFjdGVycyB3aXRoIGNvcnJlc3BvbmRpbmcgSFRNTCBlbnRpdGllcworICAgICMgICBhcmUgY29udmVydGVkIHRvIHRob3NlIGVudGl0aWVzIG9uIG91dHB1dC4KKyAgICAjICJtaW5pbWFsIiAtIEJhcmUgYW1wZXJzYW5kcyBhbmQgYW5nbGUgYnJhY2tldHMgYXJlIGNvbnZlcnRlZCB0bworICAgICMgICBYTUwgZW50aXRpZXM6ICZhbXA7ICZsdDsgJmd0OworICAgICMgTm9uZSAtIFRoZSBudWxsIGZvcm1hdHRlci4gVW5pY29kZSBjaGFyYWN0ZXJzIGFyZSBuZXZlcgorICAgICMgICBjb252ZXJ0ZWQgdG8gZW50aXRpZXMuICBUaGlzIGlzIG5vdCByZWNvbW1lbmRlZCwgYnV0IGl0J3MKKyAgICAjICAgZmFzdGVyIHRoYW4gIm1pbmltYWwiLgorICAgICMgQSBmdW5jdGlvbiAtIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgb24gZXZlcnkgc3RyaW5nIHRoYXQKKyAgICAjICBuZWVkcyB0byB1bmRlcmdvIGVudGl0eSBzdWJzdGl0dXRpb24uCisgICAgIworCisgICAgIyBJbiBhbiBIVE1MIGRvY3VtZW50LCB0aGUgZGVmYXVsdCAiaHRtbCIgYW5kICJtaW5pbWFsIiBmdW5jdGlvbnMKKyAgICAjIHdpbGwgbGVhdmUgdGhlIGNvbnRlbnRzIG9mIDxzY3JpcHQ+IGFuZCA8c3R5bGU+IHRhZ3MgYWxvbmUuIEZvcgorICAgICMgYW4gWE1MIGRvY3VtZW50LCBhbGwgdGFncyB3aWxsIGJlIGdpdmVuIHRoZSBzYW1lIHRyZWF0bWVudC4KKworICAgIEhUTUxfRk9STUFUVEVSUyA9IHsKKyAgICAgICAgImh0bWwiIDogSFRNTEF3YXJlRW50aXR5U3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVfaHRtbCwKKyAgICAgICAgIm1pbmltYWwiIDogSFRNTEF3YXJlRW50aXR5U3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVfeG1sLAorICAgICAgICBOb25lIDogTm9uZQorICAgICAgICB9CisKKyAgICBYTUxfRk9STUFUVEVSUyA9IHsKKyAgICAgICAgImh0bWwiIDogRW50aXR5U3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVfaHRtbCwKKyAgICAgICAgIm1pbmltYWwiIDogRW50aXR5U3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVfeG1sLAorICAgICAgICBOb25lIDogTm9uZQorICAgICAgICB9CisKKyAgICBkZWYgZm9ybWF0X3N0cmluZyhzZWxmLCBzLCBmb3JtYXR0ZXI9J21pbmltYWwnKToKKyAgICAgICAgIiIiRm9ybWF0IHRoZSBnaXZlbiBzdHJpbmcgdXNpbmcgdGhlIGdpdmVuIGZvcm1hdHRlci4iIiIKKyAgICAgICAgaWYgbm90IGNhbGxhYmxlKGZvcm1hdHRlcik6CisgICAgICAgICAgICBmb3JtYXR0ZXIgPSBzZWxmLl9mb3JtYXR0ZXJfZm9yX25hbWUoZm9ybWF0dGVyKQorICAgICAgICBpZiBmb3JtYXR0ZXIgaXMgTm9uZToKKyAgICAgICAgICAgIG91dHB1dCA9IHMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG91dHB1dCA9IGZvcm1hdHRlcihzKQorICAgICAgICByZXR1cm4gb3V0cHV0CisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgX2lzX3htbChzZWxmKToKKyAgICAgICAgIiIiSXMgdGhpcyBlbGVtZW50IHBhcnQgb2YgYW4gWE1MIHRyZWUgb3IgYW4gSFRNTCB0cmVlPworCisgICAgICAgIFRoaXMgaXMgdXNlZCB3aGVuIG1hcHBpbmcgYSBmb3JtYXR0ZXIgbmFtZSAoIm1pbmltYWwiKSB0byBhbgorICAgICAgICBhcHByb3ByaWF0ZSBmdW5jdGlvbiAob25lIHRoYXQgcGVyZm9ybXMgZW50aXR5LXN1YnN0aXR1dGlvbiBvbgorICAgICAgICB0aGUgY29udGVudHMgb2YgPHNjcmlwdD4gYW5kIDxzdHlsZT4gdGFncywgb3Igbm90KS4gSXQncworICAgICAgICBpbmVmZmljaWVudCwgYnV0IGl0IHNob3VsZCBiZSBjYWxsZWQgdmVyeSByYXJlbHkuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLnBhcmVudCBpcyBOb25lOgorICAgICAgICAgICAgIyBUaGlzIGlzIHRoZSB0b3AtbGV2ZWwgb2JqZWN0LiBJdCBzaG91bGQgaGF2ZSAuaXNfeG1sIHNldAorICAgICAgICAgICAgIyBmcm9tIHRyZWUgY3JlYXRpb24uIElmIG5vdCwgdGFrZSBhIGd1ZXNzLS1CUyBpcyB1c3VhbGx5CisgICAgICAgICAgICAjIHVzZWQgb24gSFRNTCBtYXJrdXAuCisgICAgICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCAnaXNfeG1sJywgRmFsc2UpCisgICAgICAgIHJldHVybiBzZWxmLnBhcmVudC5faXNfeG1sCisKKyAgICBkZWYgX2Zvcm1hdHRlcl9mb3JfbmFtZShzZWxmLCBuYW1lKToKKyAgICAgICAgIkxvb2sgdXAgYSBmb3JtYXR0ZXIgZnVuY3Rpb24gYmFzZWQgb24gaXRzIG5hbWUgYW5kIHRoZSB0cmVlLiIKKyAgICAgICAgaWYgc2VsZi5faXNfeG1sOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuWE1MX0ZPUk1BVFRFUlMuZ2V0KAorICAgICAgICAgICAgICAgIG5hbWUsIEVudGl0eVN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlX3htbCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLkhUTUxfRk9STUFUVEVSUy5nZXQoCisgICAgICAgICAgICAgICAgbmFtZSwgSFRNTEF3YXJlRW50aXR5U3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVfeG1sKQorCisgICAgZGVmIHNldHVwKHNlbGYsIHBhcmVudD1Ob25lLCBwcmV2aW91c19lbGVtZW50PU5vbmUpOgorICAgICAgICAiIiJTZXRzIHVwIHRoZSBpbml0aWFsIHJlbGF0aW9ucyBiZXR3ZWVuIHRoaXMgZWxlbWVudCBhbmQKKyAgICAgICAgb3RoZXIgZWxlbWVudHMuIiIiCisgICAgICAgIHNlbGYucGFyZW50ID0gcGFyZW50CisgICAgICAgIHNlbGYucHJldmlvdXNfZWxlbWVudCA9IHByZXZpb3VzX2VsZW1lbnQKKyAgICAgICAgaWYgcHJldmlvdXNfZWxlbWVudCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYucHJldmlvdXNfZWxlbWVudC5uZXh0X2VsZW1lbnQgPSBzZWxmCisgICAgICAgIHNlbGYubmV4dF9lbGVtZW50ID0gTm9uZQorICAgICAgICBzZWxmLnByZXZpb3VzX3NpYmxpbmcgPSBOb25lCisgICAgICAgIHNlbGYubmV4dF9zaWJsaW5nID0gTm9uZQorICAgICAgICBpZiBzZWxmLnBhcmVudCBpcyBub3QgTm9uZSBhbmQgc2VsZi5wYXJlbnQuY29udGVudHM6CisgICAgICAgICAgICBzZWxmLnByZXZpb3VzX3NpYmxpbmcgPSBzZWxmLnBhcmVudC5jb250ZW50c1stMV0KKyAgICAgICAgICAgIHNlbGYucHJldmlvdXNfc2libGluZy5uZXh0X3NpYmxpbmcgPSBzZWxmCisKKyAgICBuZXh0U2libGluZyA9IF9hbGlhcygibmV4dF9zaWJsaW5nIikgICMgQlMzCisgICAgcHJldmlvdXNTaWJsaW5nID0gX2FsaWFzKCJwcmV2aW91c19zaWJsaW5nIikgICMgQlMzCisKKyAgICBkZWYgcmVwbGFjZV93aXRoKHNlbGYsIHJlcGxhY2Vfd2l0aCk6CisgICAgICAgIGlmIHJlcGxhY2Vfd2l0aCBpcyBzZWxmOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIHJlcGxhY2Vfd2l0aCBpcyBzZWxmLnBhcmVudDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNhbm5vdCByZXBsYWNlIGEgVGFnIHdpdGggaXRzIHBhcmVudC4iKQorICAgICAgICBvbGRfcGFyZW50ID0gc2VsZi5wYXJlbnQKKyAgICAgICAgbXlfaW5kZXggPSBzZWxmLnBhcmVudC5pbmRleChzZWxmKQorICAgICAgICBzZWxmLmV4dHJhY3QoKQorICAgICAgICBvbGRfcGFyZW50Lmluc2VydChteV9pbmRleCwgcmVwbGFjZV93aXRoKQorICAgICAgICByZXR1cm4gc2VsZgorICAgIHJlcGxhY2VXaXRoID0gcmVwbGFjZV93aXRoICAjIEJTMworCisgICAgZGVmIHVud3JhcChzZWxmKToKKyAgICAgICAgbXlfcGFyZW50ID0gc2VsZi5wYXJlbnQKKyAgICAgICAgbXlfaW5kZXggPSBzZWxmLnBhcmVudC5pbmRleChzZWxmKQorICAgICAgICBzZWxmLmV4dHJhY3QoKQorICAgICAgICBmb3IgY2hpbGQgaW4gcmV2ZXJzZWQoc2VsZi5jb250ZW50c1s6XSk6CisgICAgICAgICAgICBteV9wYXJlbnQuaW5zZXJ0KG15X2luZGV4LCBjaGlsZCkKKyAgICAgICAgcmV0dXJuIHNlbGYKKyAgICByZXBsYWNlX3dpdGhfY2hpbGRyZW4gPSB1bndyYXAKKyAgICByZXBsYWNlV2l0aENoaWxkcmVuID0gdW53cmFwICAjIEJTMworCisgICAgZGVmIHdyYXAoc2VsZiwgd3JhcF9pbnNpZGUpOgorICAgICAgICBtZSA9IHNlbGYucmVwbGFjZV93aXRoKHdyYXBfaW5zaWRlKQorICAgICAgICB3cmFwX2luc2lkZS5hcHBlbmQobWUpCisgICAgICAgIHJldHVybiB3cmFwX2luc2lkZQorCisgICAgZGVmIGV4dHJhY3Qoc2VsZik6CisgICAgICAgICIiIkRlc3RydWN0aXZlbHkgcmlwcyB0aGlzIGVsZW1lbnQgb3V0IG9mIHRoZSB0cmVlLiIiIgorICAgICAgICBpZiBzZWxmLnBhcmVudCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGRlbCBzZWxmLnBhcmVudC5jb250ZW50c1tzZWxmLnBhcmVudC5pbmRleChzZWxmKV0KKworICAgICAgICAjRmluZCB0aGUgdHdvIGVsZW1lbnRzIHRoYXQgd291bGQgYmUgbmV4dCB0byBlYWNoIG90aGVyIGlmCisgICAgICAgICN0aGlzIGVsZW1lbnQgKGFuZCBhbnkgY2hpbGRyZW4pIGhhZG4ndCBiZWVuIHBhcnNlZC4gQ29ubmVjdAorICAgICAgICAjdGhlIHR3by4KKyAgICAgICAgbGFzdF9jaGlsZCA9IHNlbGYuX2xhc3RfZGVzY2VuZGFudCgpCisgICAgICAgIG5leHRfZWxlbWVudCA9IGxhc3RfY2hpbGQubmV4dF9lbGVtZW50CisKKyAgICAgICAgaWYgc2VsZi5wcmV2aW91c19lbGVtZW50IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5wcmV2aW91c19lbGVtZW50Lm5leHRfZWxlbWVudCA9IG5leHRfZWxlbWVudAorICAgICAgICBpZiBuZXh0X2VsZW1lbnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBuZXh0X2VsZW1lbnQucHJldmlvdXNfZWxlbWVudCA9IHNlbGYucHJldmlvdXNfZWxlbWVudAorICAgICAgICBzZWxmLnByZXZpb3VzX2VsZW1lbnQgPSBOb25lCisgICAgICAgIGxhc3RfY2hpbGQubmV4dF9lbGVtZW50ID0gTm9uZQorCisgICAgICAgIHNlbGYucGFyZW50ID0gTm9uZQorICAgICAgICBpZiBzZWxmLnByZXZpb3VzX3NpYmxpbmcgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnByZXZpb3VzX3NpYmxpbmcubmV4dF9zaWJsaW5nID0gc2VsZi5uZXh0X3NpYmxpbmcKKyAgICAgICAgaWYgc2VsZi5uZXh0X3NpYmxpbmcgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLm5leHRfc2libGluZy5wcmV2aW91c19zaWJsaW5nID0gc2VsZi5wcmV2aW91c19zaWJsaW5nCisgICAgICAgIHNlbGYucHJldmlvdXNfc2libGluZyA9IHNlbGYubmV4dF9zaWJsaW5nID0gTm9uZQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9sYXN0X2Rlc2NlbmRhbnQoc2VsZiwgaXNfaW5pdGlhbGl6ZWQ9VHJ1ZSwgYWNjZXB0X3NlbGY9VHJ1ZSk6CisgICAgICAgICJGaW5kcyB0aGUgbGFzdCBlbGVtZW50IGJlbmVhdGggdGhpcyBvYmplY3QgdG8gYmUgcGFyc2VkLiIKKyAgICAgICAgaWYgaXNfaW5pdGlhbGl6ZWQgYW5kIHNlbGYubmV4dF9zaWJsaW5nOgorICAgICAgICAgICAgbGFzdF9jaGlsZCA9IHNlbGYubmV4dF9zaWJsaW5nLnByZXZpb3VzX2VsZW1lbnQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxhc3RfY2hpbGQgPSBzZWxmCisgICAgICAgICAgICB3aGlsZSBpc2luc3RhbmNlKGxhc3RfY2hpbGQsIFRhZykgYW5kIGxhc3RfY2hpbGQuY29udGVudHM6CisgICAgICAgICAgICAgICAgbGFzdF9jaGlsZCA9IGxhc3RfY2hpbGQuY29udGVudHNbLTFdCisgICAgICAgIGlmIG5vdCBhY2NlcHRfc2VsZiBhbmQgbGFzdF9jaGlsZCA9PSBzZWxmOgorICAgICAgICAgICAgbGFzdF9jaGlsZCA9IE5vbmUKKyAgICAgICAgcmV0dXJuIGxhc3RfY2hpbGQKKyAgICAjIEJTMzogTm90IHBhcnQgb2YgdGhlIEFQSSEKKyAgICBfbGFzdFJlY3Vyc2l2ZUNoaWxkID0gX2xhc3RfZGVzY2VuZGFudAorCisgICAgZGVmIGluc2VydChzZWxmLCBwb3NpdGlvbiwgbmV3X2NoaWxkKToKKyAgICAgICAgaWYgbmV3X2NoaWxkIGlzIHNlbGY6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJDYW5ub3QgaW5zZXJ0IGEgdGFnIGludG8gaXRzZWxmLiIpCisgICAgICAgIGlmIChpc2luc3RhbmNlKG5ld19jaGlsZCwgYmFzZXN0cmluZykKKyAgICAgICAgICAgIGFuZCBub3QgaXNpbnN0YW5jZShuZXdfY2hpbGQsIE5hdmlnYWJsZVN0cmluZykpOgorICAgICAgICAgICAgbmV3X2NoaWxkID0gTmF2aWdhYmxlU3RyaW5nKG5ld19jaGlsZCkKKworICAgICAgICBwb3NpdGlvbiA9IG1pbihwb3NpdGlvbiwgbGVuKHNlbGYuY29udGVudHMpKQorICAgICAgICBpZiBoYXNhdHRyKG5ld19jaGlsZCwgJ3BhcmVudCcpIGFuZCBuZXdfY2hpbGQucGFyZW50IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgIyBXZSdyZSAnaW5zZXJ0aW5nJyBhbiBlbGVtZW50IHRoYXQncyBhbHJlYWR5IG9uZQorICAgICAgICAgICAgIyBvZiB0aGlzIG9iamVjdCdzIGNoaWxkcmVuLgorICAgICAgICAgICAgaWYgbmV3X2NoaWxkLnBhcmVudCBpcyBzZWxmOgorICAgICAgICAgICAgICAgIGN1cnJlbnRfaW5kZXggPSBzZWxmLmluZGV4KG5ld19jaGlsZCkKKyAgICAgICAgICAgICAgICBpZiBjdXJyZW50X2luZGV4IDwgcG9zaXRpb246CisgICAgICAgICAgICAgICAgICAgICMgV2UncmUgbW92aW5nIHRoaXMgZWxlbWVudCBmdXJ0aGVyIGRvd24gdGhlIGxpc3QKKyAgICAgICAgICAgICAgICAgICAgIyBvZiB0aGlzIG9iamVjdCdzIGNoaWxkcmVuLiBUaGF0IG1lYW5zIHRoYXQgd2hlbgorICAgICAgICAgICAgICAgICAgICAjIHdlIGV4dHJhY3QgdGhpcyBlbGVtZW50LCBvdXIgdGFyZ2V0IGluZGV4IHdpbGwKKyAgICAgICAgICAgICAgICAgICAgIyBqdW1wIGRvd24gb25lLgorICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiAtPSAxCisgICAgICAgICAgICBuZXdfY2hpbGQuZXh0cmFjdCgpCisKKyAgICAgICAgbmV3X2NoaWxkLnBhcmVudCA9IHNlbGYKKyAgICAgICAgcHJldmlvdXNfY2hpbGQgPSBOb25lCisgICAgICAgIGlmIHBvc2l0aW9uID09IDA6CisgICAgICAgICAgICBuZXdfY2hpbGQucHJldmlvdXNfc2libGluZyA9IE5vbmUKKyAgICAgICAgICAgIG5ld19jaGlsZC5wcmV2aW91c19lbGVtZW50ID0gc2VsZgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJldmlvdXNfY2hpbGQgPSBzZWxmLmNvbnRlbnRzW3Bvc2l0aW9uIC0gMV0KKyAgICAgICAgICAgIG5ld19jaGlsZC5wcmV2aW91c19zaWJsaW5nID0gcHJldmlvdXNfY2hpbGQKKyAgICAgICAgICAgIG5ld19jaGlsZC5wcmV2aW91c19zaWJsaW5nLm5leHRfc2libGluZyA9IG5ld19jaGlsZAorICAgICAgICAgICAgbmV3X2NoaWxkLnByZXZpb3VzX2VsZW1lbnQgPSBwcmV2aW91c19jaGlsZC5fbGFzdF9kZXNjZW5kYW50KEZhbHNlKQorICAgICAgICBpZiBuZXdfY2hpbGQucHJldmlvdXNfZWxlbWVudCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG5ld19jaGlsZC5wcmV2aW91c19lbGVtZW50Lm5leHRfZWxlbWVudCA9IG5ld19jaGlsZAorCisgICAgICAgIG5ld19jaGlsZHNfbGFzdF9lbGVtZW50ID0gbmV3X2NoaWxkLl9sYXN0X2Rlc2NlbmRhbnQoRmFsc2UpCisKKyAgICAgICAgaWYgcG9zaXRpb24gPj0gbGVuKHNlbGYuY29udGVudHMpOgorICAgICAgICAgICAgbmV3X2NoaWxkLm5leHRfc2libGluZyA9IE5vbmUKKworICAgICAgICAgICAgcGFyZW50ID0gc2VsZgorICAgICAgICAgICAgcGFyZW50c19uZXh0X3NpYmxpbmcgPSBOb25lCisgICAgICAgICAgICB3aGlsZSBwYXJlbnRzX25leHRfc2libGluZyBpcyBOb25lIGFuZCBwYXJlbnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgcGFyZW50c19uZXh0X3NpYmxpbmcgPSBwYXJlbnQubmV4dF9zaWJsaW5nCisgICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudAorICAgICAgICAgICAgICAgIGlmIHBhcmVudHNfbmV4dF9zaWJsaW5nIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAjIFdlIGZvdW5kIHRoZSBlbGVtZW50IHRoYXQgY29tZXMgbmV4dCBpbiB0aGUgZG9jdW1lbnQuCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBwYXJlbnRzX25leHRfc2libGluZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBuZXdfY2hpbGRzX2xhc3RfZWxlbWVudC5uZXh0X2VsZW1lbnQgPSBwYXJlbnRzX25leHRfc2libGluZworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIFRoZSBsYXN0IGVsZW1lbnQgb2YgdGhpcyB0YWcgaXMgdGhlIGxhc3QgZWxlbWVudCBpbgorICAgICAgICAgICAgICAgICMgdGhlIGRvY3VtZW50LgorICAgICAgICAgICAgICAgIG5ld19jaGlsZHNfbGFzdF9lbGVtZW50Lm5leHRfZWxlbWVudCA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5leHRfY2hpbGQgPSBzZWxmLmNvbnRlbnRzW3Bvc2l0aW9uXQorICAgICAgICAgICAgbmV3X2NoaWxkLm5leHRfc2libGluZyA9IG5leHRfY2hpbGQKKyAgICAgICAgICAgIGlmIG5ld19jaGlsZC5uZXh0X3NpYmxpbmcgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgbmV3X2NoaWxkLm5leHRfc2libGluZy5wcmV2aW91c19zaWJsaW5nID0gbmV3X2NoaWxkCisgICAgICAgICAgICBuZXdfY2hpbGRzX2xhc3RfZWxlbWVudC5uZXh0X2VsZW1lbnQgPSBuZXh0X2NoaWxkCisKKyAgICAgICAgaWYgbmV3X2NoaWxkc19sYXN0X2VsZW1lbnQubmV4dF9lbGVtZW50IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbmV3X2NoaWxkc19sYXN0X2VsZW1lbnQubmV4dF9lbGVtZW50LnByZXZpb3VzX2VsZW1lbnQgPSBuZXdfY2hpbGRzX2xhc3RfZWxlbWVudAorICAgICAgICBzZWxmLmNvbnRlbnRzLmluc2VydChwb3NpdGlvbiwgbmV3X2NoaWxkKQorCisgICAgZGVmIGFwcGVuZChzZWxmLCB0YWcpOgorICAgICAgICAiIiJBcHBlbmRzIHRoZSBnaXZlbiB0YWcgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgdGFnLiIiIgorICAgICAgICBzZWxmLmluc2VydChsZW4oc2VsZi5jb250ZW50cyksIHRhZykKKworICAgIGRlZiBpbnNlcnRfYmVmb3JlKHNlbGYsIHByZWRlY2Vzc29yKToKKyAgICAgICAgIiIiTWFrZXMgdGhlIGdpdmVuIGVsZW1lbnQgdGhlIGltbWVkaWF0ZSBwcmVkZWNlc3NvciBvZiB0aGlzIG9uZS4KKworICAgICAgICBUaGUgdHdvIGVsZW1lbnRzIHdpbGwgaGF2ZSB0aGUgc2FtZSBwYXJlbnQsIGFuZCB0aGUgZ2l2ZW4gZWxlbWVudAorICAgICAgICB3aWxsIGJlIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGlzIG9uZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYgaXMgcHJlZGVjZXNzb3I6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJDYW4ndCBpbnNlcnQgYW4gZWxlbWVudCBiZWZvcmUgaXRzZWxmLiIpCisgICAgICAgIHBhcmVudCA9IHNlbGYucGFyZW50CisgICAgICAgIGlmIHBhcmVudCBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAiRWxlbWVudCBoYXMgbm8gcGFyZW50LCBzbyAnYmVmb3JlJyBoYXMgbm8gbWVhbmluZy4iKQorICAgICAgICAjIEV4dHJhY3QgZmlyc3Qgc28gdGhhdCB0aGUgaW5kZXggd29uJ3QgYmUgc2NyZXdlZCB1cCBpZiB0aGV5CisgICAgICAgICMgYXJlIHNpYmxpbmdzLgorICAgICAgICBpZiBpc2luc3RhbmNlKHByZWRlY2Vzc29yLCBQYWdlRWxlbWVudCk6CisgICAgICAgICAgICBwcmVkZWNlc3Nvci5leHRyYWN0KCkKKyAgICAgICAgaW5kZXggPSBwYXJlbnQuaW5kZXgoc2VsZikKKyAgICAgICAgcGFyZW50Lmluc2VydChpbmRleCwgcHJlZGVjZXNzb3IpCisKKyAgICBkZWYgaW5zZXJ0X2FmdGVyKHNlbGYsIHN1Y2Nlc3Nvcik6CisgICAgICAgICIiIk1ha2VzIHRoZSBnaXZlbiBlbGVtZW50IHRoZSBpbW1lZGlhdGUgc3VjY2Vzc29yIG9mIHRoaXMgb25lLgorCisgICAgICAgIFRoZSB0d28gZWxlbWVudHMgd2lsbCBoYXZlIHRoZSBzYW1lIHBhcmVudCwgYW5kIHRoZSBnaXZlbiBlbGVtZW50CisgICAgICAgIHdpbGwgYmUgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhpcyBvbmUuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmIGlzIHN1Y2Nlc3NvcjoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNhbid0IGluc2VydCBhbiBlbGVtZW50IGFmdGVyIGl0c2VsZi4iKQorICAgICAgICBwYXJlbnQgPSBzZWxmLnBhcmVudAorICAgICAgICBpZiBwYXJlbnQgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgICAgICAgIkVsZW1lbnQgaGFzIG5vIHBhcmVudCwgc28gJ2FmdGVyJyBoYXMgbm8gbWVhbmluZy4iKQorICAgICAgICAjIEV4dHJhY3QgZmlyc3Qgc28gdGhhdCB0aGUgaW5kZXggd29uJ3QgYmUgc2NyZXdlZCB1cCBpZiB0aGV5CisgICAgICAgICMgYXJlIHNpYmxpbmdzLgorICAgICAgICBpZiBpc2luc3RhbmNlKHN1Y2Nlc3NvciwgUGFnZUVsZW1lbnQpOgorICAgICAgICAgICAgc3VjY2Vzc29yLmV4dHJhY3QoKQorICAgICAgICBpbmRleCA9IHBhcmVudC5pbmRleChzZWxmKQorICAgICAgICBwYXJlbnQuaW5zZXJ0KGluZGV4KzEsIHN1Y2Nlc3NvcikKKworICAgIGRlZiBmaW5kX25leHQoc2VsZiwgbmFtZT1Ob25lLCBhdHRycz17fSwgdGV4dD1Ob25lLCAqKmt3YXJncyk6CisgICAgICAgICIiIlJldHVybnMgdGhlIGZpcnN0IGl0ZW0gdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBjcml0ZXJpYSBhbmQKKyAgICAgICAgYXBwZWFycyBhZnRlciB0aGlzIFRhZyBpbiB0aGUgZG9jdW1lbnQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9maW5kX29uZShzZWxmLmZpbmRfYWxsX25leHQsIG5hbWUsIGF0dHJzLCB0ZXh0LCAqKmt3YXJncykKKyAgICBmaW5kTmV4dCA9IGZpbmRfbmV4dCAgIyBCUzMKKworICAgIGRlZiBmaW5kX2FsbF9uZXh0KHNlbGYsIG5hbWU9Tm9uZSwgYXR0cnM9e30sIHRleHQ9Tm9uZSwgbGltaXQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgKiprd2FyZ3MpOgorICAgICAgICAiIiJSZXR1cm5zIGFsbCBpdGVtcyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBjcml0ZXJpYSBhbmQgYXBwZWFyCisgICAgICAgIGFmdGVyIHRoaXMgVGFnIGluIHRoZSBkb2N1bWVudC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbmRfYWxsKG5hbWUsIGF0dHJzLCB0ZXh0LCBsaW1pdCwgc2VsZi5uZXh0X2VsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKmt3YXJncykKKyAgICBmaW5kQWxsTmV4dCA9IGZpbmRfYWxsX25leHQgICMgQlMzCisKKyAgICBkZWYgZmluZF9uZXh0X3NpYmxpbmcoc2VsZiwgbmFtZT1Ob25lLCBhdHRycz17fSwgdGV4dD1Ob25lLCAqKmt3YXJncyk6CisgICAgICAgICIiIlJldHVybnMgdGhlIGNsb3Nlc3Qgc2libGluZyB0byB0aGlzIFRhZyB0aGF0IG1hdGNoZXMgdGhlCisgICAgICAgIGdpdmVuIGNyaXRlcmlhIGFuZCBhcHBlYXJzIGFmdGVyIHRoaXMgVGFnIGluIHRoZSBkb2N1bWVudC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbmRfb25lKHNlbGYuZmluZF9uZXh0X3NpYmxpbmdzLCBuYW1lLCBhdHRycywgdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiprd2FyZ3MpCisgICAgZmluZE5leHRTaWJsaW5nID0gZmluZF9uZXh0X3NpYmxpbmcgICMgQlMzCisKKyAgICBkZWYgZmluZF9uZXh0X3NpYmxpbmdzKHNlbGYsIG5hbWU9Tm9uZSwgYXR0cnM9e30sIHRleHQ9Tm9uZSwgbGltaXQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICoqa3dhcmdzKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgc2libGluZ3Mgb2YgdGhpcyBUYWcgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4KKyAgICAgICAgY3JpdGVyaWEgYW5kIGFwcGVhciBhZnRlciB0aGlzIFRhZyBpbiB0aGUgZG9jdW1lbnQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9maW5kX2FsbChuYW1lLCBhdHRycywgdGV4dCwgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5leHRfc2libGluZ3MsICoqa3dhcmdzKQorICAgIGZpbmROZXh0U2libGluZ3MgPSBmaW5kX25leHRfc2libGluZ3MgICAjIEJTMworICAgIGZldGNoTmV4dFNpYmxpbmdzID0gZmluZF9uZXh0X3NpYmxpbmdzICAjIEJTMgorCisgICAgZGVmIGZpbmRfcHJldmlvdXMoc2VsZiwgbmFtZT1Ob25lLCBhdHRycz17fSwgdGV4dD1Ob25lLCAqKmt3YXJncyk6CisgICAgICAgICIiIlJldHVybnMgdGhlIGZpcnN0IGl0ZW0gdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBjcml0ZXJpYSBhbmQKKyAgICAgICAgYXBwZWFycyBiZWZvcmUgdGhpcyBUYWcgaW4gdGhlIGRvY3VtZW50LiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZmluZF9vbmUoCisgICAgICAgICAgICBzZWxmLmZpbmRfYWxsX3ByZXZpb3VzLCBuYW1lLCBhdHRycywgdGV4dCwgKiprd2FyZ3MpCisgICAgZmluZFByZXZpb3VzID0gZmluZF9wcmV2aW91cyAgIyBCUzMKKworICAgIGRlZiBmaW5kX2FsbF9wcmV2aW91cyhzZWxmLCBuYW1lPU5vbmUsIGF0dHJzPXt9LCB0ZXh0PU5vbmUsIGxpbWl0PU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAqKmt3YXJncyk6CisgICAgICAgICIiIlJldHVybnMgYWxsIGl0ZW1zIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIGNyaXRlcmlhIGFuZCBhcHBlYXIKKyAgICAgICAgYmVmb3JlIHRoaXMgVGFnIGluIHRoZSBkb2N1bWVudC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbmRfYWxsKG5hbWUsIGF0dHJzLCB0ZXh0LCBsaW1pdCwgc2VsZi5wcmV2aW91c19lbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICoqa3dhcmdzKQorICAgIGZpbmRBbGxQcmV2aW91cyA9IGZpbmRfYWxsX3ByZXZpb3VzICAjIEJTMworICAgIGZldGNoUHJldmlvdXMgPSBmaW5kX2FsbF9wcmV2aW91cyAgICAjIEJTMgorCisgICAgZGVmIGZpbmRfcHJldmlvdXNfc2libGluZyhzZWxmLCBuYW1lPU5vbmUsIGF0dHJzPXt9LCB0ZXh0PU5vbmUsICoqa3dhcmdzKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgY2xvc2VzdCBzaWJsaW5nIHRvIHRoaXMgVGFnIHRoYXQgbWF0Y2hlcyB0aGUKKyAgICAgICAgZ2l2ZW4gY3JpdGVyaWEgYW5kIGFwcGVhcnMgYmVmb3JlIHRoaXMgVGFnIGluIHRoZSBkb2N1bWVudC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbmRfb25lKHNlbGYuZmluZF9wcmV2aW91c19zaWJsaW5ncywgbmFtZSwgYXR0cnMsIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqa3dhcmdzKQorICAgIGZpbmRQcmV2aW91c1NpYmxpbmcgPSBmaW5kX3ByZXZpb3VzX3NpYmxpbmcgICMgQlMzCisKKyAgICBkZWYgZmluZF9wcmV2aW91c19zaWJsaW5ncyhzZWxmLCBuYW1lPU5vbmUsIGF0dHJzPXt9LCB0ZXh0PU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQ9Tm9uZSwgKiprd2FyZ3MpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBzaWJsaW5ncyBvZiB0aGlzIFRhZyB0aGF0IG1hdGNoIHRoZSBnaXZlbgorICAgICAgICBjcml0ZXJpYSBhbmQgYXBwZWFyIGJlZm9yZSB0aGlzIFRhZyBpbiB0aGUgZG9jdW1lbnQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9maW5kX2FsbChuYW1lLCBhdHRycywgdGV4dCwgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnByZXZpb3VzX3NpYmxpbmdzLCAqKmt3YXJncykKKyAgICBmaW5kUHJldmlvdXNTaWJsaW5ncyA9IGZpbmRfcHJldmlvdXNfc2libGluZ3MgICAjIEJTMworICAgIGZldGNoUHJldmlvdXNTaWJsaW5ncyA9IGZpbmRfcHJldmlvdXNfc2libGluZ3MgICMgQlMyCisKKyAgICBkZWYgZmluZF9wYXJlbnQoc2VsZiwgbmFtZT1Ob25lLCBhdHRycz17fSwgKiprd2FyZ3MpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBjbG9zZXN0IHBhcmVudCBvZiB0aGlzIFRhZyB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuCisgICAgICAgIGNyaXRlcmlhLiIiIgorICAgICAgICAjIE5PVEU6IFdlIGNhbid0IHVzZSBfZmluZF9vbmUgYmVjYXVzZSBmaW5kUGFyZW50cyB0YWtlcyBhIGRpZmZlcmVudAorICAgICAgICAjIHNldCBvZiBhcmd1bWVudHMuCisgICAgICAgIHIgPSBOb25lCisgICAgICAgIGwgPSBzZWxmLmZpbmRfcGFyZW50cyhuYW1lLCBhdHRycywgMSwgKiprd2FyZ3MpCisgICAgICAgIGlmIGw6CisgICAgICAgICAgICByID0gbFswXQorICAgICAgICByZXR1cm4gcgorICAgIGZpbmRQYXJlbnQgPSBmaW5kX3BhcmVudCAgIyBCUzMKKworICAgIGRlZiBmaW5kX3BhcmVudHMoc2VsZiwgbmFtZT1Ob25lLCBhdHRycz17fSwgbGltaXQ9Tm9uZSwgKiprd2FyZ3MpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBwYXJlbnRzIG9mIHRoaXMgVGFnIHRoYXQgbWF0Y2ggdGhlIGdpdmVuCisgICAgICAgIGNyaXRlcmlhLiIiIgorCisgICAgICAgIHJldHVybiBzZWxmLl9maW5kX2FsbChuYW1lLCBhdHRycywgTm9uZSwgbGltaXQsIHNlbGYucGFyZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiprd2FyZ3MpCisgICAgZmluZFBhcmVudHMgPSBmaW5kX3BhcmVudHMgICAjIEJTMworICAgIGZldGNoUGFyZW50cyA9IGZpbmRfcGFyZW50cyAgIyBCUzIKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5uZXh0X2VsZW1lbnQKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBwcmV2aW91cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucHJldmlvdXNfZWxlbWVudAorCisgICAgI1RoZXNlIG1ldGhvZHMgZG8gdGhlIHJlYWwgaGVhdnkgbGlmdGluZy4KKworICAgIGRlZiBfZmluZF9vbmUoc2VsZiwgbWV0aG9kLCBuYW1lLCBhdHRycywgdGV4dCwgKiprd2FyZ3MpOgorICAgICAgICByID0gTm9uZQorICAgICAgICBsID0gbWV0aG9kKG5hbWUsIGF0dHJzLCB0ZXh0LCAxLCAqKmt3YXJncykKKyAgICAgICAgaWYgbDoKKyAgICAgICAgICAgIHIgPSBsWzBdCisgICAgICAgIHJldHVybiByCisKKyAgICBkZWYgX2ZpbmRfYWxsKHNlbGYsIG5hbWUsIGF0dHJzLCB0ZXh0LCBsaW1pdCwgZ2VuZXJhdG9yLCAqKmt3YXJncyk6CisgICAgICAgICJJdGVyYXRlcyBvdmVyIGEgZ2VuZXJhdG9yIGxvb2tpbmcgZm9yIHRoaW5ncyB0aGF0IG1hdGNoLiIKKworICAgICAgICBpZiBpc2luc3RhbmNlKG5hbWUsIFNvdXBTdHJhaW5lcik6CisgICAgICAgICAgICBzdHJhaW5lciA9IG5hbWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN0cmFpbmVyID0gU291cFN0cmFpbmVyKG5hbWUsIGF0dHJzLCB0ZXh0LCAqKmt3YXJncykKKworICAgICAgICBpZiB0ZXh0IGlzIE5vbmUgYW5kIG5vdCBsaW1pdCBhbmQgbm90IGF0dHJzIGFuZCBub3Qga3dhcmdzOgorICAgICAgICAgICAgaWYgbmFtZSBpcyBUcnVlIG9yIG5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAjIE9wdGltaXphdGlvbiB0byBmaW5kIGFsbCB0YWdzLgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IChlbGVtZW50IGZvciBlbGVtZW50IGluIGdlbmVyYXRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGVsZW1lbnQsIFRhZykpCisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFNldChzdHJhaW5lciwgcmVzdWx0KQorICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKG5hbWUsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgICAgICMgT3B0aW1pemF0aW9uIHRvIGZpbmQgYWxsIHRhZ3Mgd2l0aCBhIGdpdmVuIG5hbWUuCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKGVsZW1lbnQgZm9yIGVsZW1lbnQgaW4gZ2VuZXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZWxlbWVudCwgVGFnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlbGVtZW50Lm5hbWUgPT0gbmFtZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0U2V0KHN0cmFpbmVyLCByZXN1bHQpCisgICAgICAgIHJlc3VsdHMgPSBSZXN1bHRTZXQoc3RyYWluZXIpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaSA9IG5leHQoZ2VuZXJhdG9yKQorICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIGk6CisgICAgICAgICAgICAgICAgZm91bmQgPSBzdHJhaW5lci5zZWFyY2goaSkKKyAgICAgICAgICAgICAgICBpZiBmb3VuZDoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoZm91bmQpCisgICAgICAgICAgICAgICAgICAgIGlmIGxpbWl0IGFuZCBsZW4ocmVzdWx0cykgPj0gbGltaXQ6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICByZXR1cm4gcmVzdWx0cworCisgICAgI1RoZXNlIGdlbmVyYXRvcnMgY2FuIGJlIHVzZWQgdG8gbmF2aWdhdGUgc3RhcnRpbmcgZnJvbSBib3RoCisgICAgI05hdmlnYWJsZVN0cmluZ3MgYW5kIFRhZ3MuCisgICAgQHByb3BlcnR5CisgICAgZGVmIG5leHRfZWxlbWVudHMoc2VsZik6CisgICAgICAgIGkgPSBzZWxmLm5leHRfZWxlbWVudAorICAgICAgICB3aGlsZSBpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgeWllbGQgaQorICAgICAgICAgICAgaSA9IGkubmV4dF9lbGVtZW50CisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgbmV4dF9zaWJsaW5ncyhzZWxmKToKKyAgICAgICAgaSA9IHNlbGYubmV4dF9zaWJsaW5nCisgICAgICAgIHdoaWxlIGkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB5aWVsZCBpCisgICAgICAgICAgICBpID0gaS5uZXh0X3NpYmxpbmcKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBwcmV2aW91c19lbGVtZW50cyhzZWxmKToKKyAgICAgICAgaSA9IHNlbGYucHJldmlvdXNfZWxlbWVudAorICAgICAgICB3aGlsZSBpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgeWllbGQgaQorICAgICAgICAgICAgaSA9IGkucHJldmlvdXNfZWxlbWVudAorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHByZXZpb3VzX3NpYmxpbmdzKHNlbGYpOgorICAgICAgICBpID0gc2VsZi5wcmV2aW91c19zaWJsaW5nCisgICAgICAgIHdoaWxlIGkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB5aWVsZCBpCisgICAgICAgICAgICBpID0gaS5wcmV2aW91c19zaWJsaW5nCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgcGFyZW50cyhzZWxmKToKKyAgICAgICAgaSA9IHNlbGYucGFyZW50CisgICAgICAgIHdoaWxlIGkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB5aWVsZCBpCisgICAgICAgICAgICBpID0gaS5wYXJlbnQKKworICAgICMgTWV0aG9kcyBmb3Igc3VwcG9ydGluZyBDU1Mgc2VsZWN0b3JzLgorCisgICAgdGFnX25hbWVfcmUgPSByZS5jb21waWxlKCdeW2EtejAtOV0rJCcpCisKKyAgICAjIC9eKFx3KylcWyhcdyspKFs9flx8XF5cJFwqXT8pPT8iPyhbXlxdIl0qKSI/XF0kLworICAgICMgICBcLS0tLyAgXC0tLS9cLS0tLS0tLS0tLS0tLS8gICAgXC0tLS0tLS0vCisgICAgIyAgICAgfCAgICAgIHwgICAgICAgICB8ICAgICAgICAgICAgICAgfAorICAgICMgICAgIHwgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgVGhlIHZhbHVlCisgICAgIyAgICAgfCAgICAgIHwgICAgfix8LF4sJCwqIG9yID0KKyAgICAjICAgICB8ICAgQXR0cmlidXRlCisgICAgIyAgICBUYWcKKyAgICBhdHRyaWJzZWxlY3RfcmUgPSByZS5jb21waWxlKAorICAgICAgICByJ14oP1A8dGFnPlx3Kyk/XFsoP1A8YXR0cmlidXRlPlx3KykoP1A8b3BlcmF0b3I+Wz1+XHxcXlwkXCpdPyknICsKKyAgICAgICAgcic9PyI/KD9QPHZhbHVlPlteXF0iXSopIj9cXSQnCisgICAgICAgICkKKworICAgIGRlZiBfYXR0cl92YWx1ZV9hc19zdHJpbmcoc2VsZiwgdmFsdWUsIGRlZmF1bHQ9Tm9uZSk6CisgICAgICAgICIiIkZvcmNlIGFuIGF0dHJpYnV0ZSB2YWx1ZSBpbnRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCisgICAgICAgIEEgbXVsdGktdmFsdWVkIGF0dHJpYnV0ZSB3aWxsIGJlIGNvbnZlcnRlZCBpbnRvIGEKKyAgICAgICAgc3BhY2Utc2VwYXJhdGVkIHN0aXJuZy4KKyAgICAgICAgIiIiCisgICAgICAgIHZhbHVlID0gc2VsZi5nZXQodmFsdWUsIGRlZmF1bHQpCisgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIGxpc3QpIG9yIGlzaW5zdGFuY2UodmFsdWUsIHR1cGxlKToKKyAgICAgICAgICAgIHZhbHVlID0iICIuam9pbih2YWx1ZSkKKyAgICAgICAgcmV0dXJuIHZhbHVlCisKKyAgICBkZWYgX3RhZ19uYW1lX21hdGNoZXNfYW5kKHNlbGYsIGZ1bmN0aW9uLCB0YWdfbmFtZSk6CisgICAgICAgIGlmIG5vdCB0YWdfbmFtZToKKyAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGVmIF9tYXRjaCh0YWcpOgorICAgICAgICAgICAgICAgIHJldHVybiB0YWcubmFtZSA9PSB0YWdfbmFtZSBhbmQgZnVuY3Rpb24odGFnKQorICAgICAgICAgICAgcmV0dXJuIF9tYXRjaAorCisgICAgZGVmIF9hdHRyaWJ1dGVfY2hlY2tlcihzZWxmLCBvcGVyYXRvciwgYXR0cmlidXRlLCB2YWx1ZT0nJyk6CisgICAgICAgICIiIkNyZWF0ZSBhIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgYSBDU1Mgc2VsZWN0b3Igb3BlcmF0aW9uLgorCisgICAgICAgIFRha2VzIGFuIG9wZXJhdG9yLCBhdHRyaWJ1dGUgYW5kIG9wdGlvbmFsIHZhbHVlLiBSZXR1cm5zIGEKKyAgICAgICAgZnVuY3Rpb24gdGhhdCB3aWxsIHJldHVybiBUcnVlIGZvciBlbGVtZW50cyB0aGF0IG1hdGNoIHRoYXQKKyAgICAgICAgY29tYmluYXRpb24uCisgICAgICAgICIiIgorICAgICAgICBpZiBvcGVyYXRvciA9PSAnPSc6CisgICAgICAgICAgICAjIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBgYXR0cmlidXRlYCBpcyBlcXVhbCB0byBgdmFsdWVgCisgICAgICAgICAgICByZXR1cm4gbGFtYmRhIGVsOiBlbC5fYXR0cl92YWx1ZV9hc19zdHJpbmcoYXR0cmlidXRlKSA9PSB2YWx1ZQorICAgICAgICBlbGlmIG9wZXJhdG9yID09ICd+JzoKKyAgICAgICAgICAgICMgc3BhY2Utc2VwYXJhdGVkIGxpc3QgcmVwcmVzZW50YXRpb24gb2YgYGF0dHJpYnV0ZWAKKyAgICAgICAgICAgICMgY29udGFpbnMgYHZhbHVlYAorICAgICAgICAgICAgZGVmIF9pbmNsdWRlc192YWx1ZShlbGVtZW50KToKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfdmFsdWUgPSBlbGVtZW50LmdldChhdHRyaWJ1dGUsIFtdKQorICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGF0dHJpYnV0ZV92YWx1ZSwgbGlzdCk6CisgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZV92YWx1ZSA9IGF0dHJpYnV0ZV92YWx1ZS5zcGxpdCgpCisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlIGluIGF0dHJpYnV0ZV92YWx1ZQorICAgICAgICAgICAgcmV0dXJuIF9pbmNsdWRlc192YWx1ZQorICAgICAgICBlbGlmIG9wZXJhdG9yID09ICdeJzoKKyAgICAgICAgICAgICMgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGBhdHRyaWJ1dGVgIHN0YXJ0cyB3aXRoIGB2YWx1ZWAKKyAgICAgICAgICAgIHJldHVybiBsYW1iZGEgZWw6IGVsLl9hdHRyX3ZhbHVlX2FzX3N0cmluZygKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUsICcnKS5zdGFydHN3aXRoKHZhbHVlKQorICAgICAgICBlbGlmIG9wZXJhdG9yID09ICckJzoKKyAgICAgICAgICAgICMgc3RyaW5nIHJlcHJlc2VuYXRpb24gb2YgYGF0dHJpYnV0ZWAgZW5kcyB3aXRoIGB2YWx1ZWAKKyAgICAgICAgICAgIHJldHVybiBsYW1iZGEgZWw6IGVsLl9hdHRyX3ZhbHVlX2FzX3N0cmluZygKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUsICcnKS5lbmRzd2l0aCh2YWx1ZSkKKyAgICAgICAgZWxpZiBvcGVyYXRvciA9PSAnKic6CisgICAgICAgICAgICAjIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBgYXR0cmlidXRlYCBjb250YWlucyBgdmFsdWVgCisgICAgICAgICAgICByZXR1cm4gbGFtYmRhIGVsOiB2YWx1ZSBpbiBlbC5fYXR0cl92YWx1ZV9hc19zdHJpbmcoYXR0cmlidXRlLCAnJykKKyAgICAgICAgZWxpZiBvcGVyYXRvciA9PSAnfCc6CisgICAgICAgICAgICAjIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBgYXR0cmlidXRlYCBpcyBlaXRoZXIgZXhhY3RseQorICAgICAgICAgICAgIyBgdmFsdWVgIG9yIHN0YXJ0cyB3aXRoIGB2YWx1ZWAgYW5kIHRoZW4gYSBkYXNoLgorICAgICAgICAgICAgZGVmIF9pc19vcl9zdGFydHNfd2l0aF9kYXNoKGVsZW1lbnQpOgorICAgICAgICAgICAgICAgIGF0dHJpYnV0ZV92YWx1ZSA9IGVsZW1lbnQuX2F0dHJfdmFsdWVfYXNfc3RyaW5nKGF0dHJpYnV0ZSwgJycpCisgICAgICAgICAgICAgICAgcmV0dXJuIChhdHRyaWJ1dGVfdmFsdWUgPT0gdmFsdWUgb3IgYXR0cmlidXRlX3ZhbHVlLnN0YXJ0c3dpdGgoCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSArICctJykpCisgICAgICAgICAgICByZXR1cm4gX2lzX29yX3N0YXJ0c193aXRoX2Rhc2gKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBsYW1iZGEgZWw6IGVsLmhhc19hdHRyKGF0dHJpYnV0ZSkKKworICAgICMgT2xkIG5vbi1wcm9wZXJ0eSB2ZXJzaW9ucyBvZiB0aGUgZ2VuZXJhdG9ycywgZm9yIGJhY2t3YXJkcworICAgICMgY29tcGF0aWJpbGl0eSB3aXRoIEJTMy4KKyAgICBkZWYgbmV4dEdlbmVyYXRvcihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubmV4dF9lbGVtZW50cworCisgICAgZGVmIG5leHRTaWJsaW5nR2VuZXJhdG9yKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5uZXh0X3NpYmxpbmdzCisKKyAgICBkZWYgcHJldmlvdXNHZW5lcmF0b3Ioc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnByZXZpb3VzX2VsZW1lbnRzCisKKyAgICBkZWYgcHJldmlvdXNTaWJsaW5nR2VuZXJhdG9yKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5wcmV2aW91c19zaWJsaW5ncworCisgICAgZGVmIHBhcmVudEdlbmVyYXRvcihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucGFyZW50cworCisKK2NsYXNzIE5hdmlnYWJsZVN0cmluZyh1bmljb2RlLCBQYWdlRWxlbWVudCk6CisKKyAgICBQUkVGSVggPSAnJworICAgIFNVRkZJWCA9ICcnCisKKyAgICBkZWYgX19uZXdfXyhjbHMsIHZhbHVlKToKKyAgICAgICAgIiIiQ3JlYXRlIGEgbmV3IE5hdmlnYWJsZVN0cmluZy4KKworICAgICAgICBXaGVuIHVucGlja2xpbmcgYSBOYXZpZ2FibGVTdHJpbmcsIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aXRoCisgICAgICAgIHRoZSBzdHJpbmcgaW4gREVGQVVMVF9PVVRQVVRfRU5DT0RJTkcuIFRoYXQgZW5jb2RpbmcgbmVlZHMgdG8gYmUKKyAgICAgICAgcGFzc2VkIGluIHRvIHRoZSBzdXBlcmNsYXNzJ3MgX19uZXdfXyBvciB0aGUgc3VwZXJjbGFzcyB3b24ndCBrbm93CisgICAgICAgIGhvdyB0byBoYW5kbGUgbm9uLUFTQ0lJIGNoYXJhY3RlcnMuCisgICAgICAgICIiIgorICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCB1bmljb2RlKToKKyAgICAgICAgICAgIHJldHVybiB1bmljb2RlLl9fbmV3X18oY2xzLCB2YWx1ZSkKKyAgICAgICAgcmV0dXJuIHVuaWNvZGUuX19uZXdfXyhjbHMsIHZhbHVlLCBERUZBVUxUX09VVFBVVF9FTkNPRElORykKKworICAgIGRlZiBfX2NvcHlfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX2dldG5ld2FyZ3NfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICh1bmljb2RlKHNlbGYpLCkKKworICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKKyAgICAgICAgIiIidGV4dC5zdHJpbmcgZ2l2ZXMgeW91IHRleHQuIFRoaXMgaXMgZm9yIGJhY2t3YXJkcworICAgICAgICBjb21wYXRpYmlsaXR5IGZvciBOYXZpZ2FibGUqU3RyaW5nLCBidXQgZm9yIENEYXRhKiBpdCBsZXRzIHlvdQorICAgICAgICBnZXQgdGhlIHN0cmluZyB3aXRob3V0IHRoZSBDRGF0YSB3cmFwcGVyLiIiIgorICAgICAgICBpZiBhdHRyID09ICdzdHJpbmcnOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKAorICAgICAgICAgICAgICAgICInJXMnIG9iamVjdCBoYXMgbm8gYXR0cmlidXRlICclcyciICUgKAorICAgICAgICAgICAgICAgICAgICBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgYXR0cikpCisKKyAgICBkZWYgb3V0cHV0X3JlYWR5KHNlbGYsIGZvcm1hdHRlcj0ibWluaW1hbCIpOgorICAgICAgICBvdXRwdXQgPSBzZWxmLmZvcm1hdF9zdHJpbmcoc2VsZiwgZm9ybWF0dGVyKQorICAgICAgICByZXR1cm4gc2VsZi5QUkVGSVggKyBvdXRwdXQgKyBzZWxmLlNVRkZJWAorCisgICAgQHByb3BlcnR5CisgICAgZGVmIG5hbWUoc2VsZik6CisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBAbmFtZS5zZXR0ZXIKKyAgICBkZWYgbmFtZShzZWxmLCBuYW1lKToKKyAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoIkEgTmF2aWdhYmxlU3RyaW5nIGNhbm5vdCBiZSBnaXZlbiBhIG5hbWUuIikKKworY2xhc3MgUHJlZm9ybWF0dGVkU3RyaW5nKE5hdmlnYWJsZVN0cmluZyk6CisgICAgIiIiQSBOYXZpZ2FibGVTdHJpbmcgbm90IHN1YmplY3QgdG8gdGhlIG5vcm1hbCBmb3JtYXR0aW5nIHJ1bGVzLgorCisgICAgVGhlIHN0cmluZyB3aWxsIGJlIHBhc3NlZCBpbnRvIHRoZSBmb3JtYXR0ZXIgKHRvIHRyaWdnZXIgc2lkZSBlZmZlY3RzKSwKKyAgICBidXQgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIGlnbm9yZWQuCisgICAgIiIiCisKKyAgICBkZWYgb3V0cHV0X3JlYWR5KHNlbGYsIGZvcm1hdHRlcj0ibWluaW1hbCIpOgorICAgICAgICAiIiJDRGF0YSBzdHJpbmdzIGFyZSBwYXNzZWQgaW50byB0aGUgZm9ybWF0dGVyLgorICAgICAgICBCdXQgdGhlIHJldHVybiB2YWx1ZSBpcyBpZ25vcmVkLiIiIgorICAgICAgICBzZWxmLmZvcm1hdF9zdHJpbmcoc2VsZiwgZm9ybWF0dGVyKQorICAgICAgICByZXR1cm4gc2VsZi5QUkVGSVggKyBzZWxmICsgc2VsZi5TVUZGSVgKKworY2xhc3MgQ0RhdGEoUHJlZm9ybWF0dGVkU3RyaW5nKToKKworICAgIFBSRUZJWCA9IHUnPCFbQ0RBVEFbJworICAgIFNVRkZJWCA9IHUnXV0+JworCitjbGFzcyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oUHJlZm9ybWF0dGVkU3RyaW5nKToKKworICAgIFBSRUZJWCA9IHUnPD8nCisgICAgU1VGRklYID0gdSc/PicKKworY2xhc3MgQ29tbWVudChQcmVmb3JtYXR0ZWRTdHJpbmcpOgorCisgICAgUFJFRklYID0gdSc8IS0tJworICAgIFNVRkZJWCA9IHUnLS0+JworCisKK2NsYXNzIERlY2xhcmF0aW9uKFByZWZvcm1hdHRlZFN0cmluZyk6CisgICAgUFJFRklYID0gdSc8IScKKyAgICBTVUZGSVggPSB1JyE+JworCisKK2NsYXNzIERvY3R5cGUoUHJlZm9ybWF0dGVkU3RyaW5nKToKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBmb3JfbmFtZV9hbmRfaWRzKGNscywgbmFtZSwgcHViX2lkLCBzeXN0ZW1faWQpOgorICAgICAgICB2YWx1ZSA9IG5hbWUgb3IgJycKKyAgICAgICAgaWYgcHViX2lkIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgdmFsdWUgKz0gJyBQVUJMSUMgIiVzIicgJSBwdWJfaWQKKyAgICAgICAgICAgIGlmIHN5c3RlbV9pZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICB2YWx1ZSArPSAnICIlcyInICUgc3lzdGVtX2lkCisgICAgICAgIGVsaWYgc3lzdGVtX2lkIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgdmFsdWUgKz0gJyBTWVNURU0gIiVzIicgJSBzeXN0ZW1faWQKKworICAgICAgICByZXR1cm4gRG9jdHlwZSh2YWx1ZSkKKworICAgIFBSRUZJWCA9IHUnPCFET0NUWVBFICcKKyAgICBTVUZGSVggPSB1Jz5cbicKKworCitjbGFzcyBUYWcoUGFnZUVsZW1lbnQpOgorCisgICAgIiIiUmVwcmVzZW50cyBhIGZvdW5kIEhUTUwgdGFnIHdpdGggaXRzIGF0dHJpYnV0ZXMgYW5kIGNvbnRlbnRzLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlcj1Ob25lLCBidWlsZGVyPU5vbmUsIG5hbWU9Tm9uZSwgbmFtZXNwYWNlPU5vbmUsCisgICAgICAgICAgICAgICAgIHByZWZpeD1Ob25lLCBhdHRycz1Ob25lLCBwYXJlbnQ9Tm9uZSwgcHJldmlvdXM9Tm9uZSk6CisgICAgICAgICJCYXNpYyBjb25zdHJ1Y3Rvci4iCisKKyAgICAgICAgaWYgcGFyc2VyIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnBhcnNlcl9jbGFzcyA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgV2UgZG9uJ3QgYWN0dWFsbHkgc3RvcmUgdGhlIHBhcnNlciBvYmplY3Q6IHRoYXQgbGV0cyBleHRyYWN0ZWQKKyAgICAgICAgICAgICMgY2h1bmtzIGJlIGdhcmJhZ2UtY29sbGVjdGVkLgorICAgICAgICAgICAgc2VsZi5wYXJzZXJfY2xhc3MgPSBwYXJzZXIuX19jbGFzc19fCisgICAgICAgIGlmIG5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIk5vIHZhbHVlIHByb3ZpZGVkIGZvciBuZXcgdGFnJ3MgbmFtZS4iKQorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYubmFtZXNwYWNlID0gbmFtZXNwYWNlCisgICAgICAgIHNlbGYucHJlZml4ID0gcHJlZml4CisgICAgICAgIGlmIGF0dHJzIGlzIE5vbmU6CisgICAgICAgICAgICBhdHRycyA9IHt9CisgICAgICAgIGVsaWYgYXR0cnMgYW5kIGJ1aWxkZXIuY2RhdGFfbGlzdF9hdHRyaWJ1dGVzOgorICAgICAgICAgICAgYXR0cnMgPSBidWlsZGVyLl9yZXBsYWNlX2NkYXRhX2xpc3RfYXR0cmlidXRlX3ZhbHVlcygKKyAgICAgICAgICAgICAgICBzZWxmLm5hbWUsIGF0dHJzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYXR0cnMgPSBkaWN0KGF0dHJzKQorICAgICAgICBzZWxmLmF0dHJzID0gYXR0cnMKKyAgICAgICAgc2VsZi5jb250ZW50cyA9IFtdCisgICAgICAgIHNlbGYuc2V0dXAocGFyZW50LCBwcmV2aW91cykKKyAgICAgICAgc2VsZi5oaWRkZW4gPSBGYWxzZQorCisgICAgICAgICMgU2V0IHVwIGFueSBzdWJzdGl0dXRpb25zLCBzdWNoIGFzIHRoZSBjaGFyc2V0IGluIGEgTUVUQSB0YWcuCisgICAgICAgIGlmIGJ1aWxkZXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBidWlsZGVyLnNldF91cF9zdWJzdGl0dXRpb25zKHNlbGYpCisgICAgICAgICAgICBzZWxmLmNhbl9iZV9lbXB0eV9lbGVtZW50ID0gYnVpbGRlci5jYW5fYmVfZW1wdHlfZWxlbWVudChuYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5jYW5fYmVfZW1wdHlfZWxlbWVudCA9IEZhbHNlCisKKyAgICBwYXJzZXJDbGFzcyA9IF9hbGlhcygicGFyc2VyX2NsYXNzIikgICMgQlMzCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgaXNfZW1wdHlfZWxlbWVudChzZWxmKToKKyAgICAgICAgIiIiSXMgdGhpcyB0YWcgYW4gZW1wdHktZWxlbWVudCB0YWc/IChha2EgYSBzZWxmLWNsb3NpbmcgdGFnKQorCisgICAgICAgIEEgdGFnIHRoYXQgaGFzIGNvbnRlbnRzIGlzIG5ldmVyIGFuIGVtcHR5LWVsZW1lbnQgdGFnLgorCisgICAgICAgIEEgdGFnIHRoYXQgaGFzIG5vIGNvbnRlbnRzIG1heSBvciBtYXkgbm90IGJlIGFuIGVtcHR5LWVsZW1lbnQKKyAgICAgICAgdGFnLiBJdCBkZXBlbmRzIG9uIHRoZSBidWlsZGVyIHVzZWQgdG8gY3JlYXRlIHRoZSB0YWcuIElmIHRoZQorICAgICAgICBidWlsZGVyIGhhcyBhIGRlc2lnbmF0ZWQgbGlzdCBvZiBlbXB0eS1lbGVtZW50IHRhZ3MsIHRoZW4gb25seQorICAgICAgICBhIHRhZyB3aG9zZSBuYW1lIHNob3dzIHVwIGluIHRoYXQgbGlzdCBpcyBjb25zaWRlcmVkIGFuCisgICAgICAgIGVtcHR5LWVsZW1lbnQgdGFnLgorCisgICAgICAgIElmIHRoZSBidWlsZGVyIGhhcyBubyBkZXNpZ25hdGVkIGxpc3Qgb2YgZW1wdHktZWxlbWVudCB0YWdzLAorICAgICAgICB0aGVuIGFueSB0YWcgd2l0aCBubyBjb250ZW50cyBpcyBhbiBlbXB0eS1lbGVtZW50IHRhZy4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBsZW4oc2VsZi5jb250ZW50cykgPT0gMCBhbmQgc2VsZi5jYW5fYmVfZW1wdHlfZWxlbWVudAorICAgIGlzU2VsZkNsb3NpbmcgPSBpc19lbXB0eV9lbGVtZW50ICAjIEJTMworCisgICAgQHByb3BlcnR5CisgICAgZGVmIHN0cmluZyhzZWxmKToKKyAgICAgICAgIiIiQ29udmVuaWVuY2UgcHJvcGVydHkgdG8gZ2V0IHRoZSBzaW5nbGUgc3RyaW5nIHdpdGhpbiB0aGlzIHRhZy4KKworICAgICAgICA6UmV0dXJuOiBJZiB0aGlzIHRhZyBoYXMgYSBzaW5nbGUgc3RyaW5nIGNoaWxkLCByZXR1cm4gdmFsdWUKKyAgICAgICAgIGlzIHRoYXQgc3RyaW5nLiBJZiB0aGlzIHRhZyBoYXMgbm8gY2hpbGRyZW4sIG9yIG1vcmUgdGhhbiBvbmUKKyAgICAgICAgIGNoaWxkLCByZXR1cm4gdmFsdWUgaXMgTm9uZS4gSWYgdGhpcyB0YWcgaGFzIG9uZSBjaGlsZCB0YWcsCisgICAgICAgICByZXR1cm4gdmFsdWUgaXMgdGhlICdzdHJpbmcnIGF0dHJpYnV0ZSBvZiB0aGUgY2hpbGQgdGFnLAorICAgICAgICAgcmVjdXJzaXZlbHkuCisgICAgICAgICIiIgorICAgICAgICBpZiBsZW4oc2VsZi5jb250ZW50cykgIT0gMToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGNoaWxkID0gc2VsZi5jb250ZW50c1swXQorICAgICAgICBpZiBpc2luc3RhbmNlKGNoaWxkLCBOYXZpZ2FibGVTdHJpbmcpOgorICAgICAgICAgICAgcmV0dXJuIGNoaWxkCisgICAgICAgIHJldHVybiBjaGlsZC5zdHJpbmcKKworICAgIEBzdHJpbmcuc2V0dGVyCisgICAgZGVmIHN0cmluZyhzZWxmLCBzdHJpbmcpOgorICAgICAgICBzZWxmLmNsZWFyKCkKKyAgICAgICAgc2VsZi5hcHBlbmQoc3RyaW5nLl9fY2xhc3NfXyhzdHJpbmcpKQorCisgICAgZGVmIF9hbGxfc3RyaW5ncyhzZWxmLCBzdHJpcD1GYWxzZSwgdHlwZXM9KE5hdmlnYWJsZVN0cmluZywgQ0RhdGEpKToKKyAgICAgICAgIiIiWWllbGQgYWxsIHN0cmluZ3Mgb2YgY2VydGFpbiBjbGFzc2VzLCBwb3NzaWJseSBzdHJpcHBpbmcgdGhlbS4KKworICAgICAgICBCeSBkZWZhdWx0LCB5aWVsZHMgb25seSBOYXZpZ2FibGVTdHJpbmcgYW5kIENEYXRhIG9iamVjdHMuIFNvCisgICAgICAgIG5vIGNvbW1lbnRzLCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucywgZXRjLgorICAgICAgICAiIiIKKyAgICAgICAgZm9yIGRlc2NlbmRhbnQgaW4gc2VsZi5kZXNjZW5kYW50czoKKyAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICAodHlwZXMgaXMgTm9uZSBhbmQgbm90IGlzaW5zdGFuY2UoZGVzY2VuZGFudCwgTmF2aWdhYmxlU3RyaW5nKSkKKyAgICAgICAgICAgICAgICBvcgorICAgICAgICAgICAgICAgICh0eXBlcyBpcyBub3QgTm9uZSBhbmQgdHlwZShkZXNjZW5kYW50KSBub3QgaW4gdHlwZXMpKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgc3RyaXA6CisgICAgICAgICAgICAgICAgZGVzY2VuZGFudCA9IGRlc2NlbmRhbnQuc3RyaXAoKQorICAgICAgICAgICAgICAgIGlmIGxlbihkZXNjZW5kYW50KSA9PSAwOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgeWllbGQgZGVzY2VuZGFudAorCisgICAgc3RyaW5ncyA9IHByb3BlcnR5KF9hbGxfc3RyaW5ncykKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBzdHJpcHBlZF9zdHJpbmdzKHNlbGYpOgorICAgICAgICBmb3Igc3RyaW5nIGluIHNlbGYuX2FsbF9zdHJpbmdzKFRydWUpOgorICAgICAgICAgICAgeWllbGQgc3RyaW5nCisKKyAgICBkZWYgZ2V0X3RleHQoc2VsZiwgc2VwYXJhdG9yPXUiIiwgc3RyaXA9RmFsc2UsCisgICAgICAgICAgICAgICAgIHR5cGVzPShOYXZpZ2FibGVTdHJpbmcsIENEYXRhKSk6CisgICAgICAgICIiIgorICAgICAgICBHZXQgYWxsIGNoaWxkIHN0cmluZ3MsIGNvbmNhdGVuYXRlZCB1c2luZyB0aGUgZ2l2ZW4gc2VwYXJhdG9yLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlcGFyYXRvci5qb2luKFtzIGZvciBzIGluIHNlbGYuX2FsbF9zdHJpbmdzKAorICAgICAgICAgICAgICAgICAgICBzdHJpcCwgdHlwZXM9dHlwZXMpXSkKKyAgICBnZXRUZXh0ID0gZ2V0X3RleHQKKyAgICB0ZXh0ID0gcHJvcGVydHkoZ2V0X3RleHQpCisKKyAgICBkZWYgZGVjb21wb3NlKHNlbGYpOgorICAgICAgICAiIiJSZWN1cnNpdmVseSBkZXN0cm95cyB0aGUgY29udGVudHMgb2YgdGhpcyB0cmVlLiIiIgorICAgICAgICBzZWxmLmV4dHJhY3QoKQorICAgICAgICBpID0gc2VsZgorICAgICAgICB3aGlsZSBpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbmV4dCA9IGkubmV4dF9lbGVtZW50CisgICAgICAgICAgICBpLl9fZGljdF9fLmNsZWFyKCkKKyAgICAgICAgICAgIGkuY29udGVudHMgPSBbXQorICAgICAgICAgICAgaSA9IG5leHQKKworICAgIGRlZiBjbGVhcihzZWxmLCBkZWNvbXBvc2U9RmFsc2UpOgorICAgICAgICAiIiIKKyAgICAgICAgRXh0cmFjdCBhbGwgY2hpbGRyZW4uIElmIGRlY29tcG9zZSBpcyBUcnVlLCBkZWNvbXBvc2UgaW5zdGVhZC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGRlY29tcG9zZToKKyAgICAgICAgICAgIGZvciBlbGVtZW50IGluIHNlbGYuY29udGVudHNbOl06CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShlbGVtZW50LCBUYWcpOgorICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmRlY29tcG9zZSgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5leHRyYWN0KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZvciBlbGVtZW50IGluIHNlbGYuY29udGVudHNbOl06CisgICAgICAgICAgICAgICAgZWxlbWVudC5leHRyYWN0KCkKKworICAgIGRlZiBpbmRleChzZWxmLCBlbGVtZW50KToKKyAgICAgICAgIiIiCisgICAgICAgIEZpbmQgdGhlIGluZGV4IG9mIGEgY2hpbGQgYnkgaWRlbnRpdHksIG5vdCB2YWx1ZS4gQXZvaWRzIGlzc3VlcyB3aXRoCisgICAgICAgIHRhZy5jb250ZW50cy5pbmRleChlbGVtZW50KSBnZXR0aW5nIHRoZSBpbmRleCBvZiBlcXVhbCBlbGVtZW50cy4KKyAgICAgICAgIiIiCisgICAgICAgIGZvciBpLCBjaGlsZCBpbiBlbnVtZXJhdGUoc2VsZi5jb250ZW50cyk6CisgICAgICAgICAgICBpZiBjaGlsZCBpcyBlbGVtZW50OgorICAgICAgICAgICAgICAgIHJldHVybiBpCisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlRhZy5pbmRleDogZWxlbWVudCBub3QgaW4gdGFnIikKKworICAgIGRlZiBnZXQoc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJ2tleScgYXR0cmlidXRlIGZvciB0aGUgdGFnLCBvcgorICAgICAgICB0aGUgdmFsdWUgZ2l2ZW4gZm9yICdkZWZhdWx0JyBpZiBpdCBkb2Vzbid0IGhhdmUgdGhhdAorICAgICAgICBhdHRyaWJ1dGUuIiIiCisgICAgICAgIHJldHVybiBzZWxmLmF0dHJzLmdldChrZXksIGRlZmF1bHQpCisKKyAgICBkZWYgaGFzX2F0dHIoc2VsZiwga2V5KToKKyAgICAgICAgcmV0dXJuIGtleSBpbiBzZWxmLmF0dHJzCisKKyAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgIHJldHVybiBzdHIoc2VsZikuX19oYXNoX18oKQorCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgICIiInRhZ1trZXldIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAna2V5JyBhdHRyaWJ1dGUgZm9yIHRoZSB0YWcsCisgICAgICAgIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIGl0J3Mgbm90IHRoZXJlLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5hdHRyc1trZXldCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICJJdGVyYXRpbmcgb3ZlciBhIHRhZyBpdGVyYXRlcyBvdmVyIGl0cyBjb250ZW50cy4iCisgICAgICAgIHJldHVybiBpdGVyKHNlbGYuY29udGVudHMpCisKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgIlRoZSBsZW5ndGggb2YgYSB0YWcgaXMgdGhlIGxlbmd0aCBvZiBpdHMgbGlzdCBvZiBjb250ZW50cy4iCisgICAgICAgIHJldHVybiBsZW4oc2VsZi5jb250ZW50cykKKworICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgeCk6CisgICAgICAgIHJldHVybiB4IGluIHNlbGYuY29udGVudHMKKworICAgIGRlZiBfX25vbnplcm9fXyhzZWxmKToKKyAgICAgICAgIkEgdGFnIGlzIG5vbi1Ob25lIGV2ZW4gaWYgaXQgaGFzIG5vIGNvbnRlbnRzLiIKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKKyAgICAgICAgIiIiU2V0dGluZyB0YWdba2V5XSBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ2tleScgYXR0cmlidXRlIGZvciB0aGUKKyAgICAgICAgdGFnLiIiIgorICAgICAgICBzZWxmLmF0dHJzW2tleV0gPSB2YWx1ZQorCisgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgICJEZWxldGluZyB0YWdba2V5XSBkZWxldGVzIGFsbCAna2V5JyBhdHRyaWJ1dGVzIGZvciB0aGUgdGFnLiIKKyAgICAgICAgc2VsZi5hdHRycy5wb3Aoa2V5LCBOb25lKQorCisgICAgZGVmIF9fY2FsbF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICIiIkNhbGxpbmcgYSB0YWcgbGlrZSBhIGZ1bmN0aW9uIGlzIHRoZSBzYW1lIGFzIGNhbGxpbmcgaXRzCisgICAgICAgIGZpbmRfYWxsKCkgbWV0aG9kLiBFZy4gdGFnKCdhJykgcmV0dXJucyBhIGxpc3Qgb2YgYWxsIHRoZSBBIHRhZ3MKKyAgICAgICAgZm91bmQgd2l0aGluIHRoaXMgdGFnLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5maW5kX2FsbCgqYXJncywgKiprd2FyZ3MpCisKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgdGFnKToKKyAgICAgICAgI3ByaW50ICJHZXRhdHRyICVzLiVzIiAlIChzZWxmLl9fY2xhc3NfXywgdGFnKQorICAgICAgICBpZiBsZW4odGFnKSA+IDMgYW5kIHRhZy5lbmRzd2l0aCgnVGFnJyk6CisgICAgICAgICAgICAjIEJTMzogc291cC5hVGFnIC0+ICJzb3VwLmZpbmQoImEiKQorICAgICAgICAgICAgdGFnX25hbWUgPSB0YWdbOi0zXQorICAgICAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICAgICAnLiVzVGFnIGlzIGRlcHJlY2F0ZWQsIHVzZSAuZmluZCgiJXMiKSBpbnN0ZWFkLicgJSAoCisgICAgICAgICAgICAgICAgICAgIHRhZ19uYW1lLCB0YWdfbmFtZSkpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5maW5kKHRhZ19uYW1lKQorICAgICAgICAjIFdlIHNwZWNpYWwgY2FzZSBjb250ZW50cyB0byBhdm9pZCByZWN1cnNpb24uCisgICAgICAgIGVsaWYgbm90IHRhZy5zdGFydHN3aXRoKCJfXyIpIGFuZCBub3QgdGFnPT0iY29udGVudHMiOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmluZCh0YWcpCisgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKAorICAgICAgICAgICAgIiclcycgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJyVzJyIgJSAoc2VsZi5fX2NsYXNzX18sIHRhZykpCisKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiUmV0dXJucyB0cnVlIGlmZiB0aGlzIHRhZyBoYXMgdGhlIHNhbWUgbmFtZSwgdGhlIHNhbWUgYXR0cmlidXRlcywKKyAgICAgICAgYW5kIHRoZSBzYW1lIGNvbnRlbnRzIChyZWN1cnNpdmVseSkgYXMgdGhlIGdpdmVuIHRhZy4iIiIKKyAgICAgICAgaWYgc2VsZiBpcyBvdGhlcjoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGlmIChub3QgaGFzYXR0cihvdGhlciwgJ25hbWUnKSBvcgorICAgICAgICAgICAgbm90IGhhc2F0dHIob3RoZXIsICdhdHRycycpIG9yCisgICAgICAgICAgICBub3QgaGFzYXR0cihvdGhlciwgJ2NvbnRlbnRzJykgb3IKKyAgICAgICAgICAgIHNlbGYubmFtZSAhPSBvdGhlci5uYW1lIG9yCisgICAgICAgICAgICBzZWxmLmF0dHJzICE9IG90aGVyLmF0dHJzIG9yCisgICAgICAgICAgICBsZW4oc2VsZikgIT0gbGVuKG90aGVyKSk6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgZm9yIGksIG15X2NoaWxkIGluIGVudW1lcmF0ZShzZWxmLmNvbnRlbnRzKToKKyAgICAgICAgICAgIGlmIG15X2NoaWxkICE9IG90aGVyLmNvbnRlbnRzW2ldOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiIlJldHVybnMgdHJ1ZSBpZmYgdGhpcyB0YWcgaXMgbm90IGlkZW50aWNhbCB0byB0aGUgb3RoZXIgdGFnLAorICAgICAgICBhcyBkZWZpbmVkIGluIF9fZXFfXy4iIiIKKyAgICAgICAgcmV0dXJuIG5vdCBzZWxmID09IG90aGVyCisKKyAgICBkZWYgX19yZXByX18oc2VsZiwgZW5jb2Rpbmc9REVGQVVMVF9PVVRQVVRfRU5DT0RJTkcpOgorICAgICAgICAiIiJSZW5kZXJzIHRoaXMgdGFnIGFzIGEgc3RyaW5nLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5lbmNvZGUoZW5jb2RpbmcpCisKKyAgICBkZWYgX191bmljb2RlX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmRlY29kZSgpCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZW5jb2RlKCkKKworICAgIGlmIFBZM0s6CisgICAgICAgIF9fc3RyX18gPSBfX3JlcHJfXyA9IF9fdW5pY29kZV9fCisKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGVuY29kaW5nPURFRkFVTFRfT1VUUFVUX0VOQ09ESU5HLAorICAgICAgICAgICAgICAgaW5kZW50X2xldmVsPU5vbmUsIGZvcm1hdHRlcj0ibWluaW1hbCIsCisgICAgICAgICAgICAgICBlcnJvcnM9InhtbGNoYXJyZWZyZXBsYWNlIik6CisgICAgICAgICMgVHVybiB0aGUgZGF0YSBzdHJ1Y3R1cmUgaW50byBVbmljb2RlLCB0aGVuIGVuY29kZSB0aGUKKyAgICAgICAgIyBVbmljb2RlLgorICAgICAgICB1ID0gc2VsZi5kZWNvZGUoaW5kZW50X2xldmVsLCBlbmNvZGluZywgZm9ybWF0dGVyKQorICAgICAgICByZXR1cm4gdS5lbmNvZGUoZW5jb2RpbmcsIGVycm9ycykKKworICAgIGRlZiBfc2hvdWxkX3ByZXR0eV9wcmludChzZWxmLCBpbmRlbnRfbGV2ZWwpOgorICAgICAgICAiIiJTaG91bGQgdGhpcyB0YWcgYmUgcHJldHR5LXByaW50ZWQ/IiIiCisgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICBpbmRlbnRfbGV2ZWwgaXMgbm90IE5vbmUgYW5kCisgICAgICAgICAgICAoc2VsZi5uYW1lIG5vdCBpbiBIVE1MQXdhcmVFbnRpdHlTdWJzdGl0dXRpb24ucHJlZm9ybWF0dGVkX3RhZ3MKKyAgICAgICAgICAgICBvciBzZWxmLl9pc194bWwpKQorCisgICAgZGVmIGRlY29kZShzZWxmLCBpbmRlbnRfbGV2ZWw9Tm9uZSwKKyAgICAgICAgICAgICAgIGV2ZW50dWFsX2VuY29kaW5nPURFRkFVTFRfT1VUUFVUX0VOQ09ESU5HLAorICAgICAgICAgICAgICAgZm9ybWF0dGVyPSJtaW5pbWFsIik6CisgICAgICAgICIiIlJldHVybnMgYSBVbmljb2RlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdGFnIGFuZCBpdHMgY29udGVudHMuCisKKyAgICAgICAgOnBhcmFtIGV2ZW50dWFsX2VuY29kaW5nOiBUaGUgdGFnIGlzIGRlc3RpbmVkIHRvIGJlCisgICAgICAgICAgIGVuY29kZWQgaW50byB0aGlzIGVuY29kaW5nLiBUaGlzIG1ldGhvZCBpcyBfbm90XworICAgICAgICAgICByZXNwb25zaWJsZSBmb3IgcGVyZm9ybWluZyB0aGF0IGVuY29kaW5nLiBUaGlzIGluZm9ybWF0aW9uCisgICAgICAgICAgIGlzIHBhc3NlZCBpbiBzbyB0aGF0IGl0IGNhbiBiZSBzdWJzdGl0dXRlZCBpbiBpZiB0aGUKKyAgICAgICAgICAgZG9jdW1lbnQgY29udGFpbnMgYSA8TUVUQT4gdGFnIHRoYXQgbWVudGlvbnMgdGhlIGRvY3VtZW50J3MKKyAgICAgICAgICAgZW5jb2RpbmcuCisgICAgICAgICIiIgorCisgICAgICAgICMgRmlyc3Qgb2ZmLCB0dXJuIGEgc3RyaW5nIGZvcm1hdHRlciBpbnRvIGEgZnVuY3Rpb24uIFRoaXMKKyAgICAgICAgIyB3aWxsIHN0b3AgdGhlIGxvb2t1cCBmcm9tIGhhcHBlbmluZyBvdmVyIGFuZCBvdmVyIGFnYWluLgorICAgICAgICBpZiBub3QgY2FsbGFibGUoZm9ybWF0dGVyKToKKyAgICAgICAgICAgIGZvcm1hdHRlciA9IHNlbGYuX2Zvcm1hdHRlcl9mb3JfbmFtZShmb3JtYXR0ZXIpCisKKyAgICAgICAgYXR0cnMgPSBbXQorICAgICAgICBpZiBzZWxmLmF0dHJzOgorICAgICAgICAgICAgZm9yIGtleSwgdmFsIGluIHNvcnRlZChzZWxmLmF0dHJzLml0ZW1zKCkpOgorICAgICAgICAgICAgICAgIGlmIHZhbCBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBkZWNvZGVkID0ga2V5CisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWwsIGxpc3QpIG9yIGlzaW5zdGFuY2UodmFsLCB0dXBsZSk6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAnICcuam9pbih2YWwpCisgICAgICAgICAgICAgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2UodmFsLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHVuaWNvZGUodmFsKQorICAgICAgICAgICAgICAgICAgICBlbGlmICgKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzaW5zdGFuY2UodmFsLCBBdHRyaWJ1dGVWYWx1ZVdpdGhDaGFyc2V0U3Vic3RpdHV0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGV2ZW50dWFsX2VuY29kaW5nIGlzIG5vdCBOb25lKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHZhbC5lbmNvZGUoZXZlbnR1YWxfZW5jb2RpbmcpCisKKyAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHNlbGYuZm9ybWF0X3N0cmluZyh2YWwsIGZvcm1hdHRlcikKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCA9ICgKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGUoa2V5KSArICc9JworICAgICAgICAgICAgICAgICAgICAgICAgKyBFbnRpdHlTdWJzdGl0dXRpb24ucXVvdGVkX2F0dHJpYnV0ZV92YWx1ZSh0ZXh0KSkKKyAgICAgICAgICAgICAgICBhdHRycy5hcHBlbmQoZGVjb2RlZCkKKyAgICAgICAgY2xvc2UgPSAnJworICAgICAgICBjbG9zZVRhZyA9ICcnCisKKyAgICAgICAgcHJlZml4ID0gJycKKyAgICAgICAgaWYgc2VsZi5wcmVmaXg6CisgICAgICAgICAgICBwcmVmaXggPSBzZWxmLnByZWZpeCArICI6IgorCisgICAgICAgIGlmIHNlbGYuaXNfZW1wdHlfZWxlbWVudDoKKyAgICAgICAgICAgIGNsb3NlID0gJy8nCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjbG9zZVRhZyA9ICc8LyVzJXM+JyAlIChwcmVmaXgsIHNlbGYubmFtZSkKKworICAgICAgICBwcmV0dHlfcHJpbnQgPSBzZWxmLl9zaG91bGRfcHJldHR5X3ByaW50KGluZGVudF9sZXZlbCkKKyAgICAgICAgc3BhY2UgPSAnJworICAgICAgICBpbmRlbnRfc3BhY2UgPSAnJworICAgICAgICBpZiBpbmRlbnRfbGV2ZWwgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpbmRlbnRfc3BhY2UgPSAoJyAnICogKGluZGVudF9sZXZlbCAtIDEpKQorICAgICAgICBpZiBwcmV0dHlfcHJpbnQ6CisgICAgICAgICAgICBzcGFjZSA9IGluZGVudF9zcGFjZQorICAgICAgICAgICAgaW5kZW50X2NvbnRlbnRzID0gaW5kZW50X2xldmVsICsgMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaW5kZW50X2NvbnRlbnRzID0gTm9uZQorICAgICAgICBjb250ZW50cyA9IHNlbGYuZGVjb2RlX2NvbnRlbnRzKAorICAgICAgICAgICAgaW5kZW50X2NvbnRlbnRzLCBldmVudHVhbF9lbmNvZGluZywgZm9ybWF0dGVyKQorCisgICAgICAgIGlmIHNlbGYuaGlkZGVuOgorICAgICAgICAgICAgIyBUaGlzIGlzIHRoZSAnZG9jdW1lbnQgcm9vdCcgb2JqZWN0LgorICAgICAgICAgICAgcyA9IGNvbnRlbnRzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzID0gW10KKyAgICAgICAgICAgIGF0dHJpYnV0ZV9zdHJpbmcgPSAnJworICAgICAgICAgICAgaWYgYXR0cnM6CisgICAgICAgICAgICAgICAgYXR0cmlidXRlX3N0cmluZyA9ICcgJyArICcgJy5qb2luKGF0dHJzKQorICAgICAgICAgICAgaWYgaW5kZW50X2xldmVsIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICMgRXZlbiBpZiB0aGlzIHBhcnRpY3VsYXIgdGFnIGlzIG5vdCBwcmV0dHktcHJpbnRlZCwKKyAgICAgICAgICAgICAgICAjIHdlIHNob3VsZCBpbmRlbnQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSB0YWcuCisgICAgICAgICAgICAgICAgcy5hcHBlbmQoaW5kZW50X3NwYWNlKQorICAgICAgICAgICAgcy5hcHBlbmQoJzwlcyVzJXMlcz4nICUgKAorICAgICAgICAgICAgICAgICAgICBwcmVmaXgsIHNlbGYubmFtZSwgYXR0cmlidXRlX3N0cmluZywgY2xvc2UpKQorICAgICAgICAgICAgaWYgcHJldHR5X3ByaW50OgorICAgICAgICAgICAgICAgIHMuYXBwZW5kKCJcbiIpCisgICAgICAgICAgICBzLmFwcGVuZChjb250ZW50cykKKyAgICAgICAgICAgIGlmIHByZXR0eV9wcmludCBhbmQgY29udGVudHMgYW5kIGNvbnRlbnRzWy0xXSAhPSAiXG4iOgorICAgICAgICAgICAgICAgIHMuYXBwZW5kKCJcbiIpCisgICAgICAgICAgICBpZiBwcmV0dHlfcHJpbnQgYW5kIGNsb3NlVGFnOgorICAgICAgICAgICAgICAgIHMuYXBwZW5kKHNwYWNlKQorICAgICAgICAgICAgcy5hcHBlbmQoY2xvc2VUYWcpCisgICAgICAgICAgICBpZiBpbmRlbnRfbGV2ZWwgaXMgbm90IE5vbmUgYW5kIGNsb3NlVGFnIGFuZCBzZWxmLm5leHRfc2libGluZzoKKyAgICAgICAgICAgICAgICAjIEV2ZW4gaWYgdGhpcyBwYXJ0aWN1bGFyIHRhZyBpcyBub3QgcHJldHR5LXByaW50ZWQsCisgICAgICAgICAgICAgICAgIyB3ZSdyZSBub3cgZG9uZSB3aXRoIHRoZSB0YWcsIGFuZCB3ZSBzaG91bGQgYWRkIGEKKyAgICAgICAgICAgICAgICAjIG5ld2xpbmUgaWYgYXBwcm9wcmlhdGUuCisgICAgICAgICAgICAgICAgcy5hcHBlbmQoIlxuIikKKyAgICAgICAgICAgIHMgPSAnJy5qb2luKHMpCisgICAgICAgIHJldHVybiBzCisKKyAgICBkZWYgcHJldHRpZnkoc2VsZiwgZW5jb2Rpbmc9Tm9uZSwgZm9ybWF0dGVyPSJtaW5pbWFsIik6CisgICAgICAgIGlmIGVuY29kaW5nIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5kZWNvZGUoVHJ1ZSwgZm9ybWF0dGVyPWZvcm1hdHRlcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmVuY29kZShlbmNvZGluZywgVHJ1ZSwgZm9ybWF0dGVyPWZvcm1hdHRlcikKKworICAgIGRlZiBkZWNvZGVfY29udGVudHMoc2VsZiwgaW5kZW50X2xldmVsPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50dWFsX2VuY29kaW5nPURFRkFVTFRfT1VUUFVUX0VOQ09ESU5HLAorICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZXI9Im1pbmltYWwiKToKKyAgICAgICAgIiIiUmVuZGVycyB0aGUgY29udGVudHMgb2YgdGhpcyB0YWcgYXMgYSBVbmljb2RlIHN0cmluZy4KKworICAgICAgICA6cGFyYW0gZXZlbnR1YWxfZW5jb2Rpbmc6IFRoZSB0YWcgaXMgZGVzdGluZWQgdG8gYmUKKyAgICAgICAgICAgZW5jb2RlZCBpbnRvIHRoaXMgZW5jb2RpbmcuIFRoaXMgbWV0aG9kIGlzIF9ub3RfCisgICAgICAgICAgIHJlc3BvbnNpYmxlIGZvciBwZXJmb3JtaW5nIHRoYXQgZW5jb2RpbmcuIFRoaXMgaW5mb3JtYXRpb24KKyAgICAgICAgICAgaXMgcGFzc2VkIGluIHNvIHRoYXQgaXQgY2FuIGJlIHN1YnN0aXR1dGVkIGluIGlmIHRoZQorICAgICAgICAgICBkb2N1bWVudCBjb250YWlucyBhIDxNRVRBPiB0YWcgdGhhdCBtZW50aW9ucyB0aGUgZG9jdW1lbnQncworICAgICAgICAgICBlbmNvZGluZy4KKyAgICAgICAgIiIiCisgICAgICAgICMgRmlyc3Qgb2ZmLCB0dXJuIGEgc3RyaW5nIGZvcm1hdHRlciBpbnRvIGEgZnVuY3Rpb24uIFRoaXMKKyAgICAgICAgIyB3aWxsIHN0b3AgdGhlIGxvb2t1cCBmcm9tIGhhcHBlbmluZyBvdmVyIGFuZCBvdmVyIGFnYWluLgorICAgICAgICBpZiBub3QgY2FsbGFibGUoZm9ybWF0dGVyKToKKyAgICAgICAgICAgIGZvcm1hdHRlciA9IHNlbGYuX2Zvcm1hdHRlcl9mb3JfbmFtZShmb3JtYXR0ZXIpCisKKyAgICAgICAgcHJldHR5X3ByaW50ID0gKGluZGVudF9sZXZlbCBpcyBub3QgTm9uZSkKKyAgICAgICAgcyA9IFtdCisgICAgICAgIGZvciBjIGluIHNlbGY6CisgICAgICAgICAgICB0ZXh0ID0gTm9uZQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShjLCBOYXZpZ2FibGVTdHJpbmcpOgorICAgICAgICAgICAgICAgIHRleHQgPSBjLm91dHB1dF9yZWFkeShmb3JtYXR0ZXIpCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UoYywgVGFnKToKKyAgICAgICAgICAgICAgICBzLmFwcGVuZChjLmRlY29kZShpbmRlbnRfbGV2ZWwsIGV2ZW50dWFsX2VuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlcikpCisgICAgICAgICAgICBpZiB0ZXh0IGFuZCBpbmRlbnRfbGV2ZWwgYW5kIG5vdCBzZWxmLm5hbWUgPT0gJ3ByZSc6CisgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc3RyaXAoKQorICAgICAgICAgICAgaWYgdGV4dDoKKyAgICAgICAgICAgICAgICBpZiBwcmV0dHlfcHJpbnQgYW5kIG5vdCBzZWxmLm5hbWUgPT0gJ3ByZSc6CisgICAgICAgICAgICAgICAgICAgIHMuYXBwZW5kKCIgIiAqIChpbmRlbnRfbGV2ZWwgLSAxKSkKKyAgICAgICAgICAgICAgICBzLmFwcGVuZCh0ZXh0KQorICAgICAgICAgICAgICAgIGlmIHByZXR0eV9wcmludCBhbmQgbm90IHNlbGYubmFtZSA9PSAncHJlJzoKKyAgICAgICAgICAgICAgICAgICAgcy5hcHBlbmQoIlxuIikKKyAgICAgICAgcmV0dXJuICcnLmpvaW4ocykKKworICAgIGRlZiBlbmNvZGVfY29udGVudHMoCisgICAgICAgIHNlbGYsIGluZGVudF9sZXZlbD1Ob25lLCBlbmNvZGluZz1ERUZBVUxUX09VVFBVVF9FTkNPRElORywKKyAgICAgICAgZm9ybWF0dGVyPSJtaW5pbWFsIik6CisgICAgICAgICIiIlJlbmRlcnMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgdGFnIGFzIGEgYnl0ZXN0cmluZy4iIiIKKyAgICAgICAgY29udGVudHMgPSBzZWxmLmRlY29kZV9jb250ZW50cyhpbmRlbnRfbGV2ZWwsIGVuY29kaW5nLCBmb3JtYXR0ZXIpCisgICAgICAgIHJldHVybiBjb250ZW50cy5lbmNvZGUoZW5jb2RpbmcpCisKKyAgICAjIE9sZCBtZXRob2QgZm9yIEJTMyBjb21wYXRpYmlsaXR5CisgICAgZGVmIHJlbmRlckNvbnRlbnRzKHNlbGYsIGVuY29kaW5nPURFRkFVTFRfT1VUUFVUX0VOQ09ESU5HLAorICAgICAgICAgICAgICAgICAgICAgICBwcmV0dHlQcmludD1GYWxzZSwgaW5kZW50TGV2ZWw9MCk6CisgICAgICAgIGlmIG5vdCBwcmV0dHlQcmludDoKKyAgICAgICAgICAgIGluZGVudExldmVsID0gTm9uZQorICAgICAgICByZXR1cm4gc2VsZi5lbmNvZGVfY29udGVudHMoCisgICAgICAgICAgICBpbmRlbnRfbGV2ZWw9aW5kZW50TGV2ZWwsIGVuY29kaW5nPWVuY29kaW5nKQorCisgICAgI1NvdXAgbWV0aG9kcworCisgICAgZGVmIGZpbmQoc2VsZiwgbmFtZT1Ob25lLCBhdHRycz17fSwgcmVjdXJzaXZlPVRydWUsIHRleHQ9Tm9uZSwKKyAgICAgICAgICAgICAqKmt3YXJncyk6CisgICAgICAgICIiIlJldHVybiBvbmx5IHRoZSBmaXJzdCBjaGlsZCBvZiB0aGlzIFRhZyBtYXRjaGluZyB0aGUgZ2l2ZW4KKyAgICAgICAgY3JpdGVyaWEuIiIiCisgICAgICAgIHIgPSBOb25lCisgICAgICAgIGwgPSBzZWxmLmZpbmRfYWxsKG5hbWUsIGF0dHJzLCByZWN1cnNpdmUsIHRleHQsIDEsICoqa3dhcmdzKQorICAgICAgICBpZiBsOgorICAgICAgICAgICAgciA9IGxbMF0KKyAgICAgICAgcmV0dXJuIHIKKyAgICBmaW5kQ2hpbGQgPSBmaW5kCisKKyAgICBkZWYgZmluZF9hbGwoc2VsZiwgbmFtZT1Ob25lLCBhdHRycz17fSwgcmVjdXJzaXZlPVRydWUsIHRleHQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgbGltaXQ9Tm9uZSwgKiprd2FyZ3MpOgorICAgICAgICAiIiJFeHRyYWN0cyBhIGxpc3Qgb2YgVGFnIG9iamVjdHMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4KKyAgICAgICAgY3JpdGVyaWEuICBZb3UgY2FuIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIFRhZyBhbmQgYW55CisgICAgICAgIGF0dHJpYnV0ZXMgeW91IHdhbnQgdGhlIFRhZyB0byBoYXZlLgorCisgICAgICAgIFRoZSB2YWx1ZSBvZiBhIGtleS12YWx1ZSBwYWlyIGluIHRoZSAnYXR0cnMnIG1hcCBjYW4gYmUgYQorICAgICAgICBzdHJpbmcsIGEgbGlzdCBvZiBzdHJpbmdzLCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3QsIG9yIGEKKyAgICAgICAgY2FsbGFibGUgdGhhdCB0YWtlcyBhIHN0cmluZyBhbmQgcmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUKKyAgICAgICAgc3RyaW5nIG1hdGNoZXMgZm9yIHNvbWUgY3VzdG9tIGRlZmluaXRpb24gb2YgJ21hdGNoZXMnLiBUaGUKKyAgICAgICAgc2FtZSBpcyB0cnVlIG9mIHRoZSB0YWcgbmFtZS4iIiIKKworICAgICAgICBnZW5lcmF0b3IgPSBzZWxmLmRlc2NlbmRhbnRzCisgICAgICAgIGlmIG5vdCByZWN1cnNpdmU6CisgICAgICAgICAgICBnZW5lcmF0b3IgPSBzZWxmLmNoaWxkcmVuCisgICAgICAgIHJldHVybiBzZWxmLl9maW5kX2FsbChuYW1lLCBhdHRycywgdGV4dCwgbGltaXQsIGdlbmVyYXRvciwgKiprd2FyZ3MpCisgICAgZmluZEFsbCA9IGZpbmRfYWxsICAgICAgICMgQlMzCisgICAgZmluZENoaWxkcmVuID0gZmluZF9hbGwgICMgQlMyCisKKyAgICAjR2VuZXJhdG9yIG1ldGhvZHMKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY2hpbGRyZW4oc2VsZik6CisgICAgICAgICMgcmV0dXJuIGl0ZXIoKSB0byBtYWtlIHRoZSBwdXJwb3NlIG9mIHRoZSBtZXRob2QgY2xlYXIKKyAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi5jb250ZW50cykgICMgWFhYIFRoaXMgc2VlbXMgdG8gYmUgdW50ZXN0ZWQuCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgZGVzY2VuZGFudHMoc2VsZik6CisgICAgICAgIGlmIG5vdCBsZW4oc2VsZi5jb250ZW50cyk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc3RvcE5vZGUgPSBzZWxmLl9sYXN0X2Rlc2NlbmRhbnQoKS5uZXh0X2VsZW1lbnQKKyAgICAgICAgY3VycmVudCA9IHNlbGYuY29udGVudHNbMF0KKyAgICAgICAgd2hpbGUgY3VycmVudCBpcyBub3Qgc3RvcE5vZGU6CisgICAgICAgICAgICB5aWVsZCBjdXJyZW50CisgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0X2VsZW1lbnQKKworICAgICMgQ1NTIHNlbGVjdG9yIGNvZGUKKworICAgIF9zZWxlY3Rvcl9jb21iaW5hdG9ycyA9IFsnPicsICcrJywgJ34nXQorICAgIF9zZWxlY3RfZGVidWcgPSBGYWxzZQorICAgIGRlZiBzZWxlY3Qoc2VsZiwgc2VsZWN0b3IsIF9jYW5kaWRhdGVfZ2VuZXJhdG9yPU5vbmUpOgorICAgICAgICAiIiJQZXJmb3JtIGEgQ1NTIHNlbGVjdGlvbiBvcGVyYXRpb24gb24gdGhlIGN1cnJlbnQgZWxlbWVudC4iIiIKKyAgICAgICAgdG9rZW5zID0gc2VsZWN0b3Iuc3BsaXQoKQorICAgICAgICBjdXJyZW50X2NvbnRleHQgPSBbc2VsZl0KKworICAgICAgICBpZiB0b2tlbnNbLTFdIGluIHNlbGYuX3NlbGVjdG9yX2NvbWJpbmF0b3JzOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAnRmluYWwgY29tYmluYXRvciAiJXMiIGlzIG1pc3NpbmcgYW4gYXJndW1lbnQuJyAlIHRva2Vuc1stMV0pCisgICAgICAgIGlmIHNlbGYuX3NlbGVjdF9kZWJ1ZzoKKyAgICAgICAgICAgIHByaW50ICdSdW5uaW5nIENTUyBzZWxlY3RvciAiJXMiJyAlIHNlbGVjdG9yCisgICAgICAgIGZvciBpbmRleCwgdG9rZW4gaW4gZW51bWVyYXRlKHRva2Vucyk6CisgICAgICAgICAgICBpZiBzZWxmLl9zZWxlY3RfZGVidWc6CisgICAgICAgICAgICAgICAgcHJpbnQgJyBDb25zaWRlcmluZyB0b2tlbiAiJXMiJyAlIHRva2VuCisgICAgICAgICAgICByZWN1cnNpdmVfY2FuZGlkYXRlX2dlbmVyYXRvciA9IE5vbmUKKyAgICAgICAgICAgIHRhZ19uYW1lID0gTm9uZQorICAgICAgICAgICAgaWYgdG9rZW5zW2luZGV4LTFdIGluIHNlbGYuX3NlbGVjdG9yX2NvbWJpbmF0b3JzOgorICAgICAgICAgICAgICAgICMgVGhpcyB0b2tlbiB3YXMgY29uc3VtZWQgYnkgdGhlIHByZXZpb3VzIGNvbWJpbmF0b3IuIFNraXAgaXQuCisgICAgICAgICAgICAgICAgaWYgc2VsZi5fc2VsZWN0X2RlYnVnOgorICAgICAgICAgICAgICAgICAgICBwcmludCAnICBUb2tlbiB3YXMgY29uc3VtZWQgYnkgdGhlIHByZXZpb3VzIGNvbWJpbmF0b3IuJworICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAjIEVhY2ggb3BlcmF0aW9uIGNvcnJlc3BvbmRzIHRvIGEgY2hlY2tlciBmdW5jdGlvbiwgYSBydWxlCisgICAgICAgICAgICAjIGZvciBkZXRlcm1pbmluZyB3aGV0aGVyIGEgY2FuZGlkYXRlIG1hdGNoZXMgdGhlCisgICAgICAgICAgICAjIHNlbGVjdG9yLiBDYW5kaWRhdGVzIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIGFjdGl2ZQorICAgICAgICAgICAgIyBpdGVyYXRvci4KKyAgICAgICAgICAgIGNoZWNrZXIgPSBOb25lCisKKyAgICAgICAgICAgIG0gPSBzZWxmLmF0dHJpYnNlbGVjdF9yZS5tYXRjaCh0b2tlbikKKyAgICAgICAgICAgIGlmIG0gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgIyBBdHRyaWJ1dGUgc2VsZWN0b3IKKyAgICAgICAgICAgICAgICB0YWdfbmFtZSwgYXR0cmlidXRlLCBvcGVyYXRvciwgdmFsdWUgPSBtLmdyb3VwcygpCisgICAgICAgICAgICAgICAgY2hlY2tlciA9IHNlbGYuX2F0dHJpYnV0ZV9jaGVja2VyKG9wZXJhdG9yLCBhdHRyaWJ1dGUsIHZhbHVlKQorCisgICAgICAgICAgICBlbGlmICcjJyBpbiB0b2tlbjoKKyAgICAgICAgICAgICAgICAjIElEIHNlbGVjdG9yCisgICAgICAgICAgICAgICAgdGFnX25hbWUsIHRhZ19pZCA9IHRva2VuLnNwbGl0KCcjJywgMSkKKyAgICAgICAgICAgICAgICBkZWYgaWRfbWF0Y2hlcyh0YWcpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFnLmdldCgnaWQnLCBOb25lKSA9PSB0YWdfaWQKKyAgICAgICAgICAgICAgICBjaGVja2VyID0gaWRfbWF0Y2hlcworCisgICAgICAgICAgICBlbGlmICcuJyBpbiB0b2tlbjoKKyAgICAgICAgICAgICAgICAjIENsYXNzIHNlbGVjdG9yCisgICAgICAgICAgICAgICAgdGFnX25hbWUsIGtsYXNzID0gdG9rZW4uc3BsaXQoJy4nLCAxKQorICAgICAgICAgICAgICAgIGNsYXNzZXMgPSBzZXQoa2xhc3Muc3BsaXQoJy4nKSkKKyAgICAgICAgICAgICAgICBkZWYgY2xhc3Nlc19tYXRjaChjYW5kaWRhdGUpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xhc3Nlcy5pc3N1YnNldChjYW5kaWRhdGUuZ2V0KCdjbGFzcycsIFtdKSkKKyAgICAgICAgICAgICAgICBjaGVja2VyID0gY2xhc3Nlc19tYXRjaAorCisgICAgICAgICAgICBlbGlmICc6JyBpbiB0b2tlbjoKKyAgICAgICAgICAgICAgICAjIFBzZXVkby1jbGFzcworICAgICAgICAgICAgICAgIHRhZ19uYW1lLCBwc2V1ZG8gPSB0b2tlbi5zcGxpdCgnOicsIDEpCisgICAgICAgICAgICAgICAgaWYgdGFnX25hbWUgPT0gJyc6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAiQSBwc2V1ZG8tY2xhc3MgbXVzdCBiZSBwcmVmaXhlZCB3aXRoIGEgdGFnIG5hbWUuIikKKyAgICAgICAgICAgICAgICBwc2V1ZG9fYXR0cmlidXRlcyA9IHJlLm1hdGNoKCcoW2EtekEtWlxkLV0rKVwoKFthLXpBLVpcZF0rKVwpJywgcHNldWRvKQorICAgICAgICAgICAgICAgIGZvdW5kID0gW10KKyAgICAgICAgICAgICAgICBpZiBwc2V1ZG9fYXR0cmlidXRlcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcHNldWRvX3R5cGUsIHBzZXVkb192YWx1ZSA9IHBzZXVkb19hdHRyaWJ1dGVzLmdyb3VwcygpCisgICAgICAgICAgICAgICAgICAgIGlmIHBzZXVkb190eXBlID09ICdudGgtb2YtdHlwZSc6CisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNldWRvX3ZhbHVlID0gaW50KHBzZXVkb192YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnT25seSBudW1lcmljIHZhbHVlcyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZCBmb3IgdGhlIG50aC1vZi10eXBlIHBzZXVkby1jbGFzcy4nKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgcHNldWRvX3ZhbHVlIDwgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbnRoLW9mLXR5cGUgcHNldWRvLWNsYXNzIHZhbHVlIG11c3QgYmUgYXQgbGVhc3QgMS4nKQorICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MgQ291bnRlcihvYmplY3QpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkZXN0aW5hdGlvbik6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY291bnQgPSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmIG50aF9jaGlsZF9vZl90eXBlKHNlbGYsIHRhZyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY291bnQgKz0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmNvdW50ID09IHNlbGYuZGVzdGluYXRpb246CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmNvdW50ID4gc2VsZi5kZXN0aW5hdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgU3RvcCB0aGUgZ2VuZXJhdG9yIHRoYXQncyBzZW5kaW5nIHVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZXNlIHRoaW5ncy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZXIgPSBDb3VudGVyKHBzZXVkb192YWx1ZSkubnRoX2NoaWxkX29mX3R5cGUKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ09ubHkgdGhlIGZvbGxvd2luZyBwc2V1ZG8tY2xhc3NlcyBhcmUgaW1wbGVtZW50ZWQ6IG50aC1vZi10eXBlLicpCisKKyAgICAgICAgICAgIGVsaWYgdG9rZW4gPT0gJyonOgorICAgICAgICAgICAgICAgICMgU3RhciBzZWxlY3RvciAtLSBtYXRjaGVzIGV2ZXJ5dGhpbmcKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbGlmIHRva2VuID09ICc+JzoKKyAgICAgICAgICAgICAgICAjIFJ1biB0aGUgbmV4dCB0b2tlbiBhcyBhIENTUyBzZWxlY3RvciBhZ2FpbnN0IHRoZQorICAgICAgICAgICAgICAgICMgZGlyZWN0IGNoaWxkcmVuIG9mIGVhY2ggdGFnIGluIHRoZSBjdXJyZW50IGNvbnRleHQuCisgICAgICAgICAgICAgICAgcmVjdXJzaXZlX2NhbmRpZGF0ZV9nZW5lcmF0b3IgPSBsYW1iZGEgdGFnOiB0YWcuY2hpbGRyZW4KKyAgICAgICAgICAgIGVsaWYgdG9rZW4gPT0gJ34nOgorICAgICAgICAgICAgICAgICMgUnVuIHRoZSBuZXh0IHRva2VuIGFzIGEgQ1NTIHNlbGVjdG9yIGFnYWluc3QgdGhlCisgICAgICAgICAgICAgICAgIyBzaWJsaW5ncyBvZiBlYWNoIHRhZyBpbiB0aGUgY3VycmVudCBjb250ZXh0LgorICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZV9jYW5kaWRhdGVfZ2VuZXJhdG9yID0gbGFtYmRhIHRhZzogdGFnLm5leHRfc2libGluZ3MKKyAgICAgICAgICAgIGVsaWYgdG9rZW4gPT0gJysnOgorICAgICAgICAgICAgICAgICMgRm9yIGVhY2ggdGFnIGluIHRoZSBjdXJyZW50IGNvbnRleHQsIHJ1biB0aGUgbmV4dAorICAgICAgICAgICAgICAgICMgdG9rZW4gYXMgYSBDU1Mgc2VsZWN0b3IgYWdhaW5zdCB0aGUgdGFnJ3MgbmV4dAorICAgICAgICAgICAgICAgICMgc2libGluZyB0aGF0J3MgYSB0YWcuCisgICAgICAgICAgICAgICAgZGVmIG5leHRfdGFnX3NpYmxpbmcodGFnKToKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgdGFnLmZpbmRfbmV4dF9zaWJsaW5nKFRydWUpCisgICAgICAgICAgICAgICAgcmVjdXJzaXZlX2NhbmRpZGF0ZV9nZW5lcmF0b3IgPSBuZXh0X3RhZ19zaWJsaW5nCisKKyAgICAgICAgICAgIGVsaWYgc2VsZi50YWdfbmFtZV9yZS5tYXRjaCh0b2tlbik6CisgICAgICAgICAgICAgICAgIyBKdXN0IGEgdGFnIG5hbWUuCisgICAgICAgICAgICAgICAgdGFnX25hbWUgPSB0b2tlbgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAnVW5zdXBwb3J0ZWQgb3IgaW52YWxpZCBDU1Mgc2VsZWN0b3I6ICIlcyInICUgdG9rZW4pCisKKyAgICAgICAgICAgIGlmIHJlY3Vyc2l2ZV9jYW5kaWRhdGVfZ2VuZXJhdG9yOgorICAgICAgICAgICAgICAgICMgVGhpcyBoYXBwZW5zIHdoZW4gdGhlIHNlbGVjdG9yIGxvb2tzIGxpa2UgICI+IGZvbyIuCisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgICMgVGhlIGdlbmVyYXRvciBjYWxscyBzZWxlY3QoKSByZWN1cnNpdmVseSBvbiBldmVyeQorICAgICAgICAgICAgICAgICMgbWVtYmVyIG9mIHRoZSBjdXJyZW50IGNvbnRleHQsIHBhc3NpbmcgaW4gYSBkaWZmZXJlbnQKKyAgICAgICAgICAgICAgICAjIGNhbmRpZGF0ZSBnZW5lcmF0b3IgYW5kIGEgZGlmZmVyZW50IHNlbGVjdG9yLgorICAgICAgICAgICAgICAgICMKKyAgICAgICAgICAgICAgICAjIEluIHRoZSBjYXNlIG9mICI+IGZvbyIsIHRoZSBjYW5kaWRhdGUgZ2VuZXJhdG9yIGlzCisgICAgICAgICAgICAgICAgIyBvbmUgdGhhdCB5aWVsZHMgYSB0YWcncyBkaXJlY3QgY2hpbGRyZW4gKCI+IiksIGFuZAorICAgICAgICAgICAgICAgICMgdGhlIHNlbGVjdG9yIGlzICJmb28iLgorICAgICAgICAgICAgICAgIG5leHRfdG9rZW4gPSB0b2tlbnNbaW5kZXgrMV0KKyAgICAgICAgICAgICAgICBkZWYgcmVjdXJzaXZlX3NlbGVjdCh0YWcpOgorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLl9zZWxlY3RfZGVidWc6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAnICAgIENhbGxpbmcgc2VsZWN0KCIlcyIpIHJlY3Vyc2l2ZWx5IG9uICVzICVzJyAlIChuZXh0X3Rva2VuLCB0YWcubmFtZSwgdGFnLmF0dHJzKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgJy0nICogNDAKKyAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gdGFnLnNlbGVjdChuZXh0X3Rva2VuLCByZWN1cnNpdmVfY2FuZGlkYXRlX2dlbmVyYXRvcik6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLl9zZWxlY3RfZGVidWc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgJyhSZWN1cnNpdmUgc2VsZWN0IHBpY2tlZCB1cCBjYW5kaWRhdGUgJXMgJXMpJyAlIChpLm5hbWUsIGkuYXR0cnMpCisgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBpCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuX3NlbGVjdF9kZWJ1ZzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICctJyAqIDQwCisgICAgICAgICAgICAgICAgX3VzZV9jYW5kaWRhdGVfZ2VuZXJhdG9yID0gcmVjdXJzaXZlX3NlbGVjdAorICAgICAgICAgICAgZWxpZiBfY2FuZGlkYXRlX2dlbmVyYXRvciBpcyBOb25lOgorICAgICAgICAgICAgICAgICMgQnkgZGVmYXVsdCwgYSB0YWcncyBjYW5kaWRhdGVzIGFyZSBhbGwgb2YgaXRzCisgICAgICAgICAgICAgICAgIyBjaGlsZHJlbi4gSWYgdGFnX25hbWUgaXMgZGVmaW5lZCwgb25seSB5aWVsZCB0YWdzCisgICAgICAgICAgICAgICAgIyB3aXRoIHRoYXQgbmFtZS4KKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9zZWxlY3RfZGVidWc6CisgICAgICAgICAgICAgICAgICAgIGlmIHRhZ19uYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2sgPSAiW2FueV0iCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjaGVjayA9IHRhZ19uYW1lCisgICAgICAgICAgICAgICAgICAgIHByaW50ICcgICBEZWZhdWx0IGNhbmRpZGF0ZSBnZW5lcmF0b3IsIHRhZyBuYW1lPSIlcyInICUgY2hlY2sKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9zZWxlY3RfZGVidWc6CisgICAgICAgICAgICAgICAgICAgICMgVGhpcyBpcyByZWR1bmRhbnQgd2l0aCBsYXRlciBjb2RlLCBidXQgaXQgc3RvcHMKKyAgICAgICAgICAgICAgICAgICAgIyBhIGJ1bmNoIG9mIGJvZ3VzIHRhZ3MgZnJvbSBjbHV0dGVyaW5nIHVwIHRoZQorICAgICAgICAgICAgICAgICAgICAjIGRlYnVnIGxvZy4KKyAgICAgICAgICAgICAgICAgICAgZGVmIGRlZmF1bHRfY2FuZGlkYXRlX2dlbmVyYXRvcih0YWcpOgorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGNoaWxkIGluIHRhZy5kZXNjZW5kYW50czoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShjaGlsZCwgVGFnKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0YWdfbmFtZSBhbmQgbm90IGNoaWxkLm5hbWUgPT0gdGFnX25hbWU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgY2hpbGQKKyAgICAgICAgICAgICAgICAgICAgX3VzZV9jYW5kaWRhdGVfZ2VuZXJhdG9yID0gZGVmYXVsdF9jYW5kaWRhdGVfZ2VuZXJhdG9yCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgX3VzZV9jYW5kaWRhdGVfZ2VuZXJhdG9yID0gbGFtYmRhIHRhZzogdGFnLmRlc2NlbmRhbnRzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIF91c2VfY2FuZGlkYXRlX2dlbmVyYXRvciA9IF9jYW5kaWRhdGVfZ2VuZXJhdG9yCisKKyAgICAgICAgICAgIG5ld19jb250ZXh0ID0gW10KKyAgICAgICAgICAgIG5ld19jb250ZXh0X2lkcyA9IHNldChbXSkKKyAgICAgICAgICAgIGZvciB0YWcgaW4gY3VycmVudF9jb250ZXh0OgorICAgICAgICAgICAgICAgIGlmIHNlbGYuX3NlbGVjdF9kZWJ1ZzoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIiAgICBSdW5uaW5nIGNhbmRpZGF0ZSBnZW5lcmF0b3Igb24gJXMgJXMiICUgKAorICAgICAgICAgICAgICAgICAgICAgICAgdGFnLm5hbWUsIHJlcHIodGFnLmF0dHJzKSkKKyAgICAgICAgICAgICAgICBmb3IgY2FuZGlkYXRlIGluIF91c2VfY2FuZGlkYXRlX2dlbmVyYXRvcih0YWcpOgorICAgICAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShjYW5kaWRhdGUsIFRhZyk6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBpZiB0YWdfbmFtZSBhbmQgY2FuZGlkYXRlLm5hbWUgIT0gdGFnX25hbWU6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBpZiBjaGVja2VyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNoZWNrZXIoY2FuZGlkYXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgY2hlY2tlciBoYXMgZGVjaWRlZCB3ZSBzaG91bGQgbm8gbG9uZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBydW4gdGhlIGdlbmVyYXRvci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBpZiBjaGVja2VyIGlzIE5vbmUgb3IgcmVzdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5fc2VsZWN0X2RlYnVnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICIgICAgIFNVQ0NFU1MgJXMgJXMiICUgKGNhbmRpZGF0ZS5uYW1lLCByZXByKGNhbmRpZGF0ZS5hdHRycykpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBpZChjYW5kaWRhdGUpIG5vdCBpbiBuZXdfY29udGV4dF9pZHM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBJZiBhIHRhZyBtYXRjaGVzIGEgc2VsZWN0b3IgbW9yZSB0aGFuIG9uY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkb24ndCBpbmNsdWRlIGl0IGluIHRoZSBjb250ZXh0IG1vcmUgdGhhbiBvbmNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19jb250ZXh0LmFwcGVuZChjYW5kaWRhdGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2NvbnRleHRfaWRzLmFkZChpZChjYW5kaWRhdGUpKQorICAgICAgICAgICAgICAgICAgICBlbGlmIHNlbGYuX3NlbGVjdF9kZWJ1ZzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICIgICAgIEZBSUxVUkUgJXMgJXMiICUgKGNhbmRpZGF0ZS5uYW1lLCByZXByKGNhbmRpZGF0ZS5hdHRycykpCisKKyAgICAgICAgICAgIGN1cnJlbnRfY29udGV4dCA9IG5ld19jb250ZXh0CisKKyAgICAgICAgaWYgc2VsZi5fc2VsZWN0X2RlYnVnOgorICAgICAgICAgICAgcHJpbnQgIkZpbmFsIHZlcmRpY3Q6IgorICAgICAgICAgICAgZm9yIGkgaW4gY3VycmVudF9jb250ZXh0OgorICAgICAgICAgICAgICAgIHByaW50ICIgJXMgJXMiICUgKGkubmFtZSwgaS5hdHRycykKKyAgICAgICAgcmV0dXJuIGN1cnJlbnRfY29udGV4dAorCisgICAgIyBPbGQgbmFtZXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisgICAgZGVmIGNoaWxkR2VuZXJhdG9yKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5jaGlsZHJlbgorCisgICAgZGVmIHJlY3Vyc2l2ZUNoaWxkR2VuZXJhdG9yKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5kZXNjZW5kYW50cworCisgICAgZGVmIGhhc19rZXkoc2VsZiwga2V5KToKKyAgICAgICAgIiIiVGhpcyB3YXMga2luZCBvZiBtaXNsZWFkaW5nIGJlY2F1c2UgaGFzX2tleSgpIChhdHRyaWJ1dGVzKQorICAgICAgICB3YXMgZGlmZmVyZW50IGZyb20gX19pbl9fIChjb250ZW50cykuIGhhc19rZXkoKSBpcyBnb25lIGluCisgICAgICAgIFB5dGhvbiAzLCBhbnl3YXkuIiIiCisgICAgICAgIHdhcm5pbmdzLndhcm4oJ2hhc19rZXkgaXMgZGVwcmVjYXRlZC4gVXNlIGhhc19hdHRyKCIlcyIpIGluc3RlYWQuJyAlICgKKyAgICAgICAgICAgICAgICBrZXkpKQorICAgICAgICByZXR1cm4gc2VsZi5oYXNfYXR0cihrZXkpCisKKyMgTmV4dCwgYSBjb3VwbGUgY2xhc3NlcyB0byByZXByZXNlbnQgcXVlcmllcyBhbmQgdGhlaXIgcmVzdWx0cy4KK2NsYXNzIFNvdXBTdHJhaW5lcihvYmplY3QpOgorICAgICIiIkVuY2Fwc3VsYXRlcyBhIG51bWJlciBvZiB3YXlzIG9mIG1hdGNoaW5nIGEgbWFya3VwIGVsZW1lbnQgKHRhZyBvcgorICAgIHRleHQpLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWU9Tm9uZSwgYXR0cnM9e30sIHRleHQ9Tm9uZSwgKiprd2FyZ3MpOgorICAgICAgICBzZWxmLm5hbWUgPSBzZWxmLl9ub3JtYWxpemVfc2VhcmNoX3ZhbHVlKG5hbWUpCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGF0dHJzLCBkaWN0KToKKyAgICAgICAgICAgICMgVHJlYXQgYSBub24tZGljdCB2YWx1ZSBmb3IgYXR0cnMgYXMgYSBzZWFyY2ggZm9yIHRoZSAnY2xhc3MnCisgICAgICAgICAgICAjIGF0dHJpYnV0ZS4KKyAgICAgICAgICAgIGt3YXJnc1snY2xhc3MnXSA9IGF0dHJzCisgICAgICAgICAgICBhdHRycyA9IE5vbmUKKworICAgICAgICBpZiAnY2xhc3NfJyBpbiBrd2FyZ3M6CisgICAgICAgICAgICAjIFRyZWF0IGNsYXNzXz0iZm9vIiBhcyBhIHNlYXJjaCBmb3IgdGhlICdjbGFzcycKKyAgICAgICAgICAgICMgYXR0cmlidXRlLCBvdmVycmlkaW5nIGFueSBub24tZGljdCB2YWx1ZSBmb3IgYXR0cnMuCisgICAgICAgICAgICBrd2FyZ3NbJ2NsYXNzJ10gPSBrd2FyZ3NbJ2NsYXNzXyddCisgICAgICAgICAgICBkZWwga3dhcmdzWydjbGFzc18nXQorCisgICAgICAgIGlmIGt3YXJnczoKKyAgICAgICAgICAgIGlmIGF0dHJzOgorICAgICAgICAgICAgICAgIGF0dHJzID0gYXR0cnMuY29weSgpCisgICAgICAgICAgICAgICAgYXR0cnMudXBkYXRlKGt3YXJncykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYXR0cnMgPSBrd2FyZ3MKKyAgICAgICAgbm9ybWFsaXplZF9hdHRycyA9IHt9CisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGF0dHJzLml0ZW1zKCk6CisgICAgICAgICAgICBub3JtYWxpemVkX2F0dHJzW2tleV0gPSBzZWxmLl9ub3JtYWxpemVfc2VhcmNoX3ZhbHVlKHZhbHVlKQorCisgICAgICAgIHNlbGYuYXR0cnMgPSBub3JtYWxpemVkX2F0dHJzCisgICAgICAgIHNlbGYudGV4dCA9IHNlbGYuX25vcm1hbGl6ZV9zZWFyY2hfdmFsdWUodGV4dCkKKworICAgIGRlZiBfbm9ybWFsaXplX3NlYXJjaF92YWx1ZShzZWxmLCB2YWx1ZSk6CisgICAgICAgICMgTGVhdmUgaXQgYWxvbmUgaWYgaXQncyBhIFVuaWNvZGUgc3RyaW5nLCBhIGNhbGxhYmxlLCBhCisgICAgICAgICMgcmVndWxhciBleHByZXNzaW9uLCBhIGJvb2xlYW4sIG9yIE5vbmUuCisgICAgICAgIGlmIChpc2luc3RhbmNlKHZhbHVlLCB1bmljb2RlKSBvciBjYWxsYWJsZSh2YWx1ZSkgb3IgaGFzYXR0cih2YWx1ZSwgJ21hdGNoJykKKyAgICAgICAgICAgIG9yIGlzaW5zdGFuY2UodmFsdWUsIGJvb2wpIG9yIHZhbHVlIGlzIE5vbmUpOgorICAgICAgICAgICAgcmV0dXJuIHZhbHVlCisKKyAgICAgICAgIyBJZiBpdCdzIGEgYnl0ZXN0cmluZywgY29udmVydCBpdCB0byBVbmljb2RlLCB0cmVhdGluZyBpdCBhcyBVVEYtOC4KKyAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgYnl0ZXMpOgorICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmRlY29kZSgidXRmOCIpCisKKyAgICAgICAgIyBJZiBpdCdzIGxpc3RsaWtlLCBjb252ZXJ0IGl0IGludG8gYSBsaXN0IG9mIHN0cmluZ3MuCisgICAgICAgIGlmIGhhc2F0dHIodmFsdWUsICdfX2l0ZXJfXycpOgorICAgICAgICAgICAgbmV3X3ZhbHVlID0gW10KKyAgICAgICAgICAgIGZvciB2IGluIHZhbHVlOgorICAgICAgICAgICAgICAgIGlmIChoYXNhdHRyKHYsICdfX2l0ZXJfXycpIGFuZCBub3QgaXNpbnN0YW5jZSh2LCBieXRlcykKKyAgICAgICAgICAgICAgICAgICAgYW5kIG5vdCBpc2luc3RhbmNlKHYsIHVuaWNvZGUpKToKKyAgICAgICAgICAgICAgICAgICAgIyBUaGlzIGlzIGFsbW9zdCBjZXJ0YWlubHkgdGhlIHVzZXIncyBtaXN0YWtlLiBJbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgIyBpbnRlcmVzdHMgb2YgYXZvaWRpbmcgaW5maW5pdGUgbG9vcHMsIHdlJ2xsIGxldAorICAgICAgICAgICAgICAgICAgICAjIGl0IHRocm91Z2ggYXMtaXMgcmF0aGVyIHRoYW4gZG9pbmcgYSByZWN1cnNpdmUgY2FsbC4KKyAgICAgICAgICAgICAgICAgICAgbmV3X3ZhbHVlLmFwcGVuZCh2KQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG5ld192YWx1ZS5hcHBlbmQoc2VsZi5fbm9ybWFsaXplX3NlYXJjaF92YWx1ZSh2KSkKKyAgICAgICAgICAgIHJldHVybiBuZXdfdmFsdWUKKworICAgICAgICAjIE90aGVyd2lzZSwgY29udmVydCBpdCBpbnRvIGEgVW5pY29kZSBzdHJpbmcuCisgICAgICAgICMgVGhlIHVuaWNvZGUoc3RyKCkpIHRoaW5nIGlzIHNvIHRoaXMgd2lsbCBkbyB0aGUgc2FtZSB0aGluZyBvbiBQeXRob24gMgorICAgICAgICAjIGFuZCBQeXRob24gMy4KKyAgICAgICAgcmV0dXJuIHVuaWNvZGUoc3RyKHZhbHVlKSkKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnRleHQ6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50ZXh0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gIiVzfCVzIiAlIChzZWxmLm5hbWUsIHNlbGYuYXR0cnMpCisKKyAgICBkZWYgc2VhcmNoX3RhZyhzZWxmLCBtYXJrdXBfbmFtZT1Ob25lLCBtYXJrdXBfYXR0cnM9e30pOgorICAgICAgICBmb3VuZCA9IE5vbmUKKyAgICAgICAgbWFya3VwID0gTm9uZQorICAgICAgICBpZiBpc2luc3RhbmNlKG1hcmt1cF9uYW1lLCBUYWcpOgorICAgICAgICAgICAgbWFya3VwID0gbWFya3VwX25hbWUKKyAgICAgICAgICAgIG1hcmt1cF9hdHRycyA9IG1hcmt1cAorICAgICAgICBjYWxsX2Z1bmN0aW9uX3dpdGhfdGFnX2RhdGEgPSAoCisgICAgICAgICAgICBpc2luc3RhbmNlKHNlbGYubmFtZSwgY29sbGVjdGlvbnMuQ2FsbGFibGUpCisgICAgICAgICAgICBhbmQgbm90IGlzaW5zdGFuY2UobWFya3VwX25hbWUsIFRhZykpCisKKyAgICAgICAgaWYgKChub3Qgc2VsZi5uYW1lKQorICAgICAgICAgICAgb3IgY2FsbF9mdW5jdGlvbl93aXRoX3RhZ19kYXRhCisgICAgICAgICAgICBvciAobWFya3VwIGFuZCBzZWxmLl9tYXRjaGVzKG1hcmt1cCwgc2VsZi5uYW1lKSkKKyAgICAgICAgICAgIG9yIChub3QgbWFya3VwIGFuZCBzZWxmLl9tYXRjaGVzKG1hcmt1cF9uYW1lLCBzZWxmLm5hbWUpKSk6CisgICAgICAgICAgICBpZiBjYWxsX2Z1bmN0aW9uX3dpdGhfdGFnX2RhdGE6CisgICAgICAgICAgICAgICAgbWF0Y2ggPSBzZWxmLm5hbWUobWFya3VwX25hbWUsIG1hcmt1cF9hdHRycykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbWF0Y2ggPSBUcnVlCisgICAgICAgICAgICAgICAgbWFya3VwX2F0dHJfbWFwID0gTm9uZQorICAgICAgICAgICAgICAgIGZvciBhdHRyLCBtYXRjaF9hZ2FpbnN0IGluIGxpc3Qoc2VsZi5hdHRycy5pdGVtcygpKToKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IG1hcmt1cF9hdHRyX21hcDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIobWFya3VwX2F0dHJzLCAnZ2V0Jyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya3VwX2F0dHJfbWFwID0gbWFya3VwX2F0dHJzCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmt1cF9hdHRyX21hcCA9IHt9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGssIHYgaW4gbWFya3VwX2F0dHJzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrdXBfYXR0cl9tYXBba10gPSB2CisgICAgICAgICAgICAgICAgICAgIGF0dHJfdmFsdWUgPSBtYXJrdXBfYXR0cl9tYXAuZ2V0KGF0dHIpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9tYXRjaGVzKGF0dHJfdmFsdWUsIG1hdGNoX2FnYWluc3QpOgorICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgICAgIGlmIG1hcmt1cDoKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtYXJrdXAKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1hcmt1cF9uYW1lCisgICAgICAgIGlmIGZvdW5kIGFuZCBzZWxmLnRleHQgYW5kIG5vdCBzZWxmLl9tYXRjaGVzKGZvdW5kLnN0cmluZywgc2VsZi50ZXh0KToKKyAgICAgICAgICAgIGZvdW5kID0gTm9uZQorICAgICAgICByZXR1cm4gZm91bmQKKyAgICBzZWFyY2hUYWcgPSBzZWFyY2hfdGFnCisKKyAgICBkZWYgc2VhcmNoKHNlbGYsIG1hcmt1cCk6CisgICAgICAgICMgcHJpbnQgJ2xvb2tpbmcgZm9yICVzIGluICVzJyAlIChzZWxmLCBtYXJrdXApCisgICAgICAgIGZvdW5kID0gTm9uZQorICAgICAgICAjIElmIGdpdmVuIGEgbGlzdCBvZiBpdGVtcywgc2NhbiBpdCBmb3IgYSB0ZXh0IGVsZW1lbnQgdGhhdAorICAgICAgICAjIG1hdGNoZXMuCisgICAgICAgIGlmIGhhc2F0dHIobWFya3VwLCAnX19pdGVyX18nKSBhbmQgbm90IGlzaW5zdGFuY2UobWFya3VwLCAoVGFnLCBiYXNlc3RyaW5nKSk6CisgICAgICAgICAgICBmb3IgZWxlbWVudCBpbiBtYXJrdXA6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShlbGVtZW50LCBOYXZpZ2FibGVTdHJpbmcpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgYW5kIHNlbGYuc2VhcmNoKGVsZW1lbnQpOgorICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgIyBJZiBpdCdzIGEgVGFnLCBtYWtlIHN1cmUgaXRzIG5hbWUgb3IgYXR0cmlidXRlcyBtYXRjaC4KKyAgICAgICAgIyBEb24ndCBib3RoZXIgd2l0aCBUYWdzIGlmIHdlJ3JlIHNlYXJjaGluZyBmb3IgdGV4dC4KKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG1hcmt1cCwgVGFnKToKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLnRleHQgb3Igc2VsZi5uYW1lIG9yIHNlbGYuYXR0cnM6CisgICAgICAgICAgICAgICAgZm91bmQgPSBzZWxmLnNlYXJjaF90YWcobWFya3VwKQorICAgICAgICAjIElmIGl0J3MgdGV4dCwgbWFrZSBzdXJlIHRoZSB0ZXh0IG1hdGNoZXMuCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShtYXJrdXAsIE5hdmlnYWJsZVN0cmluZykgb3IgXAorICAgICAgICAgICAgICAgICBpc2luc3RhbmNlKG1hcmt1cCwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5uYW1lIGFuZCBub3Qgc2VsZi5hdHRycyBhbmQgc2VsZi5fbWF0Y2hlcyhtYXJrdXAsIHNlbGYudGV4dCk6CisgICAgICAgICAgICAgICAgZm91bmQgPSBtYXJrdXAKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiSSBkb24ndCBrbm93IGhvdyB0byBtYXRjaCBhZ2FpbnN0IGEgJXMiICUgbWFya3VwLl9fY2xhc3NfXykKKyAgICAgICAgcmV0dXJuIGZvdW5kCisKKyAgICBkZWYgX21hdGNoZXMoc2VsZiwgbWFya3VwLCBtYXRjaF9hZ2FpbnN0KToKKyAgICAgICAgIyBwcmludCB1Ik1hdGNoaW5nICVzIGFnYWluc3QgJXMiICUgKG1hcmt1cCwgbWF0Y2hfYWdhaW5zdCkKKyAgICAgICAgcmVzdWx0ID0gRmFsc2UKKyAgICAgICAgaWYgaXNpbnN0YW5jZShtYXJrdXAsIGxpc3QpIG9yIGlzaW5zdGFuY2UobWFya3VwLCB0dXBsZSk6CisgICAgICAgICAgICAjIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIHdoZW4gc2VhcmNoaW5nIGEgbXVsdGktdmFsdWVkIGF0dHJpYnV0ZQorICAgICAgICAgICAgIyBsaWtlICdjbGFzcycuCisgICAgICAgICAgICBpZiAoaXNpbnN0YW5jZShtYXRjaF9hZ2FpbnN0LCB1bmljb2RlKQorICAgICAgICAgICAgICAgIGFuZCAnICcgaW4gbWF0Y2hfYWdhaW5zdCk6CisgICAgICAgICAgICAgICAgIyBBIGJpdCBvZiBhIHNwZWNpYWwgY2FzZS4gSWYgdGhleSB0cnkgdG8gbWF0Y2ggImZvbworICAgICAgICAgICAgICAgICMgYmFyIiBvbiBhIG11bHRpdmFsdWUgYXR0cmlidXRlJ3MgdmFsdWUsIG9ubHkgYWNjZXB0CisgICAgICAgICAgICAgICAgIyB0aGUgbGl0ZXJhbCB2YWx1ZSAiZm9vIGJhciIKKyAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgIyBYWFggVGhpcyBpcyBnb2luZyB0byBiZSBwcmV0dHkgc2xvdyBiZWNhdXNlIHdlIGtlZXAKKyAgICAgICAgICAgICAgICAjIHNwbGl0dGluZyBtYXRjaF9hZ2FpbnN0LiBCdXQgaXQgc2hvdWxkbid0IGNvbWUgdXAKKyAgICAgICAgICAgICAgICAjIHRvbyBvZnRlbi4KKyAgICAgICAgICAgICAgICByZXR1cm4gKHdoaXRlc3BhY2VfcmUuc3BsaXQobWF0Y2hfYWdhaW5zdCkgPT0gbWFya3VwKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBtYXJrdXA6CisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuX21hdGNoZXMoaXRlbSwgbWF0Y2hfYWdhaW5zdCk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIGlmIG1hdGNoX2FnYWluc3QgaXMgVHJ1ZToKKyAgICAgICAgICAgICMgVHJ1ZSBtYXRjaGVzIGFueSBub24tTm9uZSB2YWx1ZS4KKyAgICAgICAgICAgIHJldHVybiBtYXJrdXAgaXMgbm90IE5vbmUKKworICAgICAgICBpZiBpc2luc3RhbmNlKG1hdGNoX2FnYWluc3QsIGNvbGxlY3Rpb25zLkNhbGxhYmxlKToKKyAgICAgICAgICAgIHJldHVybiBtYXRjaF9hZ2FpbnN0KG1hcmt1cCkKKworICAgICAgICAjIEN1c3RvbSBjYWxsYWJsZXMgdGFrZSB0aGUgdGFnIGFzIGFuIGFyZ3VtZW50LCBidXQgYWxsCisgICAgICAgICMgb3RoZXIgd2F5cyBvZiBtYXRjaGluZyBtYXRjaCB0aGUgdGFnIG5hbWUgYXMgYSBzdHJpbmcuCisgICAgICAgIGlmIGlzaW5zdGFuY2UobWFya3VwLCBUYWcpOgorICAgICAgICAgICAgbWFya3VwID0gbWFya3VwLm5hbWUKKworICAgICAgICAjIEVuc3VyZSB0aGF0IGBtYXJrdXBgIGlzIGVpdGhlciBhIFVuaWNvZGUgc3RyaW5nLCBvciBOb25lLgorICAgICAgICBtYXJrdXAgPSBzZWxmLl9ub3JtYWxpemVfc2VhcmNoX3ZhbHVlKG1hcmt1cCkKKworICAgICAgICBpZiBtYXJrdXAgaXMgTm9uZToKKyAgICAgICAgICAgICMgTm9uZSBtYXRjaGVzIE5vbmUsIEZhbHNlLCBhbiBlbXB0eSBzdHJpbmcsIGFuIGVtcHR5IGxpc3QsIGFuZCBzbyBvbi4KKyAgICAgICAgICAgIHJldHVybiBub3QgbWF0Y2hfYWdhaW5zdAorCisgICAgICAgIGlmIGlzaW5zdGFuY2UobWF0Y2hfYWdhaW5zdCwgdW5pY29kZSk6CisgICAgICAgICAgICAjIEV4YWN0IHN0cmluZyBtYXRjaAorICAgICAgICAgICAgcmV0dXJuIG1hcmt1cCA9PSBtYXRjaF9hZ2FpbnN0CisKKyAgICAgICAgaWYgaGFzYXR0cihtYXRjaF9hZ2FpbnN0LCAnbWF0Y2gnKToKKyAgICAgICAgICAgICMgUmVnZXhwIG1hdGNoCisgICAgICAgICAgICByZXR1cm4gbWF0Y2hfYWdhaW5zdC5zZWFyY2gobWFya3VwKQorCisgICAgICAgIGlmIGhhc2F0dHIobWF0Y2hfYWdhaW5zdCwgJ19faXRlcl9fJyk6CisgICAgICAgICAgICAjIFRoZSBtYXJrdXAgbXVzdCBiZSBhbiBleGFjdCBtYXRjaCBhZ2FpbnN0IHNvbWV0aGluZworICAgICAgICAgICAgIyBpbiB0aGUgaXRlcmFibGUuCisgICAgICAgICAgICByZXR1cm4gbWFya3VwIGluIG1hdGNoX2FnYWluc3QKKworCitjbGFzcyBSZXN1bHRTZXQobGlzdCk6CisgICAgIiIiQSBSZXN1bHRTZXQgaXMganVzdCBhIGxpc3QgdGhhdCBrZWVwcyB0cmFjayBvZiB0aGUgU291cFN0cmFpbmVyCisgICAgdGhhdCBjcmVhdGVkIGl0LiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzb3VyY2UsIHJlc3VsdD0oKSk6CisgICAgICAgIHN1cGVyKFJlc3VsdFNldCwgc2VsZikuX19pbml0X18ocmVzdWx0KQorICAgICAgICBzZWxmLnNvdXJjZSA9IHNvdXJjZQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYnM0L3Rlc3RpbmcucHkgYi9iaXRiYWtlL2xpYi9iczQvdGVzdGluZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDQ0OTVhCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYnM0L3Rlc3RpbmcucHkKQEAgLTAsMCArMSw1OTIgQEAKKyIiIkhlbHBlciBjbGFzc2VzIGZvciB0ZXN0cy4iIiIKKworaW1wb3J0IGNvcHkKK2ltcG9ydCBmdW5jdG9vbHMKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB1bml0dGVzdCBpbXBvcnQgVGVzdENhc2UKK2Zyb20gYnM0IGltcG9ydCBCZWF1dGlmdWxTb3VwCitmcm9tIGJzNC5lbGVtZW50IGltcG9ydCAoCisgICAgQ2hhcnNldE1ldGFBdHRyaWJ1dGVWYWx1ZSwKKyAgICBDb21tZW50LAorICAgIENvbnRlbnRNZXRhQXR0cmlidXRlVmFsdWUsCisgICAgRG9jdHlwZSwKKyAgICBTb3VwU3RyYWluZXIsCispCisKK2Zyb20gYnM0LmJ1aWxkZXIgaW1wb3J0IEhUTUxQYXJzZXJUcmVlQnVpbGRlcgorZGVmYXVsdF9idWlsZGVyID0gSFRNTFBhcnNlclRyZWVCdWlsZGVyCisKKworY2xhc3MgU291cFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGRlZmF1bHRfYnVpbGRlcihzZWxmKToKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRfYnVpbGRlcigpCisKKyAgICBkZWYgc291cChzZWxmLCBtYXJrdXAsICoqa3dhcmdzKToKKyAgICAgICAgIiIiQnVpbGQgYSBCZWF1dGlmdWwgU291cCBvYmplY3QgZnJvbSBtYXJrdXAuIiIiCisgICAgICAgIGJ1aWxkZXIgPSBrd2FyZ3MucG9wKCdidWlsZGVyJywgc2VsZi5kZWZhdWx0X2J1aWxkZXIpCisgICAgICAgIHJldHVybiBCZWF1dGlmdWxTb3VwKG1hcmt1cCwgYnVpbGRlcj1idWlsZGVyLCAqKmt3YXJncykKKworICAgIGRlZiBkb2N1bWVudF9mb3Ioc2VsZiwgbWFya3VwKToKKyAgICAgICAgIiIiVHVybiBhbiBIVE1MIGZyYWdtZW50IGludG8gYSBkb2N1bWVudC4KKworICAgICAgICBUaGUgZGV0YWlscyBkZXBlbmQgb24gdGhlIGJ1aWxkZXIuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5kZWZhdWx0X2J1aWxkZXIudGVzdF9mcmFnbWVudF90b19kb2N1bWVudChtYXJrdXApCisKKyAgICBkZWYgYXNzZXJ0U291cEVxdWFscyhzZWxmLCB0b19wYXJzZSwgY29tcGFyZV9wYXJzZWRfdG89Tm9uZSk6CisgICAgICAgIGJ1aWxkZXIgPSBzZWxmLmRlZmF1bHRfYnVpbGRlcgorICAgICAgICBvYmogPSBCZWF1dGlmdWxTb3VwKHRvX3BhcnNlLCBidWlsZGVyPWJ1aWxkZXIpCisgICAgICAgIGlmIGNvbXBhcmVfcGFyc2VkX3RvIGlzIE5vbmU6CisgICAgICAgICAgICBjb21wYXJlX3BhcnNlZF90byA9IHRvX3BhcnNlCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGVjb2RlKCksIHNlbGYuZG9jdW1lbnRfZm9yKGNvbXBhcmVfcGFyc2VkX3RvKSkKKworCitjbGFzcyBIVE1MVHJlZUJ1aWxkZXJTbW9rZVRlc3Qob2JqZWN0KToKKworICAgICIiIkEgYmFzaWMgdGVzdCBvZiBhIHRyZWVidWlsZGVyJ3MgY29tcGV0ZW5jZS4KKworICAgIEFueSBIVE1MIHRyZWVidWlsZGVyLCBwcmVzZW50IG9yIGZ1dHVyZSwgc2hvdWxkIGJlIGFibGUgdG8gcGFzcworICAgIHRoZXNlIHRlc3RzLiBXaXRoIGludmFsaWQgbWFya3VwLCB0aGVyZSdzIHJvb20gZm9yIGludGVycHJldGF0aW9uLAorICAgIGFuZCBkaWZmZXJlbnQgcGFyc2VycyBjYW4gaGFuZGxlIGl0IGRpZmZlcmVudGx5LiBCdXQgd2l0aCB0aGUKKyAgICBtYXJrdXAgaW4gdGhlc2UgdGVzdHMsIHRoZXJlJ3Mgbm90IG11Y2ggcm9vbSBmb3IgaW50ZXJwcmV0YXRpb24uCisgICAgIiIiCisKKyAgICBkZWYgYXNzZXJ0RG9jdHlwZUhhbmRsZWQoc2VsZiwgZG9jdHlwZV9mcmFnbWVudCk6CisgICAgICAgICIiIkFzc2VydCB0aGF0IGEgZ2l2ZW4gZG9jdHlwZSBzdHJpbmcgaXMgaGFuZGxlZCBjb3JyZWN0bHkuIiIiCisgICAgICAgIGRvY3R5cGVfc3RyLCBzb3VwID0gc2VsZi5fZG9jdW1lbnRfd2l0aF9kb2N0eXBlKGRvY3R5cGVfZnJhZ21lbnQpCisKKyAgICAgICAgIyBNYWtlIHN1cmUgYSBEb2N0eXBlIG9iamVjdCB3YXMgY3JlYXRlZC4KKyAgICAgICAgZG9jdHlwZSA9IHNvdXAuY29udGVudHNbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkb2N0eXBlLl9fY2xhc3NfXywgRG9jdHlwZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkb2N0eXBlLCBkb2N0eXBlX2ZyYWdtZW50KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihzb3VwKVs6bGVuKGRvY3R5cGVfc3RyKV0sIGRvY3R5cGVfc3RyKQorCisgICAgICAgICMgTWFrZSBzdXJlIHRoYXQgdGhlIGRvY3R5cGUgd2FzIGNvcnJlY3RseSBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAgICAgICMgcGFyc2UgdHJlZSBhbmQgdGhhdCB0aGUgcmVzdCBvZiB0aGUgZG9jdW1lbnQgcGFyc2VkLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXAucC5jb250ZW50c1swXSwgJ2ZvbycpCisKKyAgICBkZWYgX2RvY3VtZW50X3dpdGhfZG9jdHlwZShzZWxmLCBkb2N0eXBlX2ZyYWdtZW50KToKKyAgICAgICAgIiIiR2VuZXJhdGUgYW5kIHBhcnNlIGEgZG9jdW1lbnQgd2l0aCB0aGUgZ2l2ZW4gZG9jdHlwZS4iIiIKKyAgICAgICAgZG9jdHlwZSA9ICc8IURPQ1RZUEUgJXM+JyAlIGRvY3R5cGVfZnJhZ21lbnQKKyAgICAgICAgbWFya3VwID0gZG9jdHlwZSArICdcbjxwPmZvbzwvcD4nCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAobWFya3VwKQorICAgICAgICByZXR1cm4gZG9jdHlwZSwgc291cAorCisgICAgZGVmIHRlc3Rfbm9ybWFsX2RvY3R5cGVzKHNlbGYpOgorICAgICAgICAiIiJNYWtlIHN1cmUgbm9ybWFsLCBldmVyeWRheSBIVE1MIGRvY3R5cGVzIGFyZSBoYW5kbGVkIGNvcnJlY3RseS4iIiIKKyAgICAgICAgc2VsZi5hc3NlcnREb2N0eXBlSGFuZGxlZCgiaHRtbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RG9jdHlwZUhhbmRsZWQoCisgICAgICAgICAgICAnaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIicpCisKKyAgICBkZWYgdGVzdF9lbXB0eV9kb2N0eXBlKHNlbGYpOgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCI8IURPQ1RZUEU+IikKKyAgICAgICAgZG9jdHlwZSA9IHNvdXAuY29udGVudHNbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiIiwgZG9jdHlwZS5zdHJpcCgpKQorCisgICAgZGVmIHRlc3RfcHVibGljX2RvY3R5cGVfd2l0aF91cmwoc2VsZik6CisgICAgICAgIGRvY3R5cGUgPSAnaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCInCisgICAgICAgIHNlbGYuYXNzZXJ0RG9jdHlwZUhhbmRsZWQoZG9jdHlwZSkKKworICAgIGRlZiB0ZXN0X3N5c3RlbV9kb2N0eXBlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydERvY3R5cGVIYW5kbGVkKCdmb28gU1lTVEVNICJodHRwOi8vd3d3LmV4YW1wbGUuY29tLyInKQorCisgICAgZGVmIHRlc3RfbmFtZXNwYWNlZF9zeXN0ZW1fZG9jdHlwZShzZWxmKToKKyAgICAgICAgIyBXZSBjYW4gaGFuZGxlIGEgbmFtZXNwYWNlZCBkb2N0eXBlIHdpdGggYSBzeXN0ZW0gSUQuCisgICAgICAgIHNlbGYuYXNzZXJ0RG9jdHlwZUhhbmRsZWQoJ3hzbDpzdHlsZXNoZWV0IFNZU1RFTSAiaHRtbGVudC5kdGQiJykKKworICAgIGRlZiB0ZXN0X25hbWVzcGFjZWRfcHVibGljX2RvY3R5cGUoc2VsZik6CisgICAgICAgICMgVGVzdCBhIG5hbWVzcGFjZWQgZG9jdHlwZSB3aXRoIGEgcHVibGljIGlkLgorICAgICAgICBzZWxmLmFzc2VydERvY3R5cGVIYW5kbGVkKCd4c2w6c3R5bGVzaGVldCBQVUJMSUMgImh0bWxlbnQuZHRkIicpCisKKyAgICBkZWYgdGVzdF9yZWFsX3hodG1sX2RvY3VtZW50KHNlbGYpOgorICAgICAgICAiIiJBIHJlYWwgWEhUTUwgZG9jdW1lbnQgc2hvdWxkIGNvbWUgb3V0IG1vcmUgb3IgbGVzcyB0aGUgc2FtZSBhcyBpdCB3ZW50IGluLiIiIgorICAgICAgICBtYXJrdXAgPSBiIiIiPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+PHRpdGxlPkhlbGxvLjwvdGl0bGU+PC9oZWFkPgorPGJvZHk+R29vZGJ5ZS48L2JvZHk+Cis8L2h0bWw+IiIiCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAobWFya3VwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc291cC5lbmNvZGUoInV0Zi04IikucmVwbGFjZShiIlxuIiwgYiIiKSwKKyAgICAgICAgICAgIG1hcmt1cC5yZXBsYWNlKGIiXG4iLCBiIiIpKQorCisgICAgZGVmIHRlc3RfZGVlcGNvcHkoc2VsZik6CisgICAgICAgICIiIk1ha2Ugc3VyZSB5b3UgY2FuIGNvcHkgdGhlIHRyZWUgYnVpbGRlci4KKworICAgICAgICBUaGlzIGlzIGltcG9ydGFudCBiZWNhdXNlIHRoZSBidWlsZGVyIGlzIHBhcnQgb2YgYQorICAgICAgICBCZWF1dGlmdWxTb3VwIG9iamVjdCwgYW5kIHdlIHdhbnQgdG8gYmUgYWJsZSB0byBjb3B5IHRoYXQuCisgICAgICAgICIiIgorICAgICAgICBjb3B5LmRlZXBjb3B5KHNlbGYuZGVmYXVsdF9idWlsZGVyKQorCisgICAgZGVmIHRlc3RfcF90YWdfaXNfbmV2ZXJfZW1wdHlfZWxlbWVudChzZWxmKToKKyAgICAgICAgIiIiQSA8cD4gdGFnIGlzIG5ldmVyIGRlc2lnbmF0ZWQgYXMgYW4gZW1wdHktZWxlbWVudCB0YWcuCisKKyAgICAgICAgRXZlbiBpZiB0aGUgbWFya3VwIHNob3dzIGl0IGFzIGFuIGVtcHR5LWVsZW1lbnQgdGFnLCBpdAorICAgICAgICBzaG91bGRuJ3QgYmUgcHJlc2VudGVkIHRoYXQgd2F5LgorICAgICAgICAiIiIKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiPHAvPiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc291cC5wLmlzX2VtcHR5X2VsZW1lbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHNvdXAucCksICI8cD48L3A+IikKKworICAgIGRlZiB0ZXN0X3VuY2xvc2VkX3RhZ3NfZ2V0X2Nsb3NlZChzZWxmKToKKyAgICAgICAgIiIiQSB0YWcgdGhhdCdzIG5vdCBjbG9zZWQgYnkgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQgc2hvdWxkIGJlIGNsb3NlZC4KKworICAgICAgICBUaGlzIGFwcGxpZXMgdG8gYWxsIHRhZ3MgZXhjZXB0IGVtcHR5LWVsZW1lbnQgdGFncy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0U291cEVxdWFscygiPHA+IiwgIjxwPjwvcD4iKQorICAgICAgICBzZWxmLmFzc2VydFNvdXBFcXVhbHMoIjxiPiIsICI8Yj48L2I+IikKKworICAgICAgICBzZWxmLmFzc2VydFNvdXBFcXVhbHMoIjxicj4iLCAiPGJyLz4iKQorCisgICAgZGVmIHRlc3RfYnJfaXNfYWx3YXlzX2VtcHR5X2VsZW1lbnRfdGFnKHNlbGYpOgorICAgICAgICAiIiJBIDxicj4gdGFnIGlzIGRlc2lnbmF0ZWQgYXMgYW4gZW1wdHktZWxlbWVudCB0YWcuCisKKyAgICAgICAgU29tZSBwYXJzZXJzIHRyZWF0IDxicj48L2JyPiBhcyBvbmUgPGJyLz4gdGFnLCBzb21lIHBhcnNlcnMgYXMKKyAgICAgICAgdHdvIHRhZ3MsIGJ1dCBpdCBzaG91bGQgYWx3YXlzIGJlIGFuIGVtcHR5LWVsZW1lbnQgdGFnLgorICAgICAgICAiIiIKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiPGJyPjwvYnI+IikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNvdXAuYnIuaXNfZW1wdHlfZWxlbWVudCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoc291cC5iciksICI8YnIvPiIpCisKKyAgICBkZWYgdGVzdF9uZXN0ZWRfZm9ybWF0dGluZ19lbGVtZW50cyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRTb3VwRXF1YWxzKCI8ZW0+PGVtPjwvZW0+PC9lbT4iKQorCisgICAgZGVmIHRlc3RfY29tbWVudChzZWxmKToKKyAgICAgICAgIyBDb21tZW50cyBhcmUgcmVwcmVzZW50ZWQgYXMgQ29tbWVudCBvYmplY3RzLgorICAgICAgICBtYXJrdXAgPSAiPHA+Zm9vPCEtLWZvb2Jhci0tPmJhejwvcD4iCisgICAgICAgIHNlbGYuYXNzZXJ0U291cEVxdWFscyhtYXJrdXApCisKKyAgICAgICAgc291cCA9IHNlbGYuc291cChtYXJrdXApCisgICAgICAgIGNvbW1lbnQgPSBzb3VwLmZpbmQodGV4dD0iZm9vYmFyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21tZW50Ll9fY2xhc3NfXywgQ29tbWVudCkKKworICAgICAgICAjIFRoZSBjb21tZW50IGlzIHByb3Blcmx5IGludGVncmF0ZWQgaW50byB0aGUgdHJlZS4KKyAgICAgICAgZm9vID0gc291cC5maW5kKHRleHQ9ImZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tbWVudCwgZm9vLm5leHRfZWxlbWVudCkKKyAgICAgICAgYmF6ID0gc291cC5maW5kKHRleHQ9ImJheiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tbWVudCwgYmF6LnByZXZpb3VzX2VsZW1lbnQpCisKKyAgICBkZWYgdGVzdF9wcmVzZXJ2ZWRfd2hpdGVzcGFjZV9pbl9wcmVfYW5kX3RleHRhcmVhKHNlbGYpOgorICAgICAgICAiIiJXaGl0ZXNwYWNlIG11c3QgYmUgcHJlc2VydmVkIGluIDxwcmU+IGFuZCA8dGV4dGFyZWE+IHRhZ3MuIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0U291cEVxdWFscygiPHByZT4gICA8L3ByZT4iKQorICAgICAgICBzZWxmLmFzc2VydFNvdXBFcXVhbHMoIjx0ZXh0YXJlYT4gd29vICA8L3RleHRhcmVhPiIpCisKKyAgICBkZWYgdGVzdF9uZXN0ZWRfaW5saW5lX2VsZW1lbnRzKHNlbGYpOgorICAgICAgICAiIiJJbmxpbmUgZWxlbWVudHMgY2FuIGJlIG5lc3RlZCBpbmRlZmluaXRlbHkuIiIiCisgICAgICAgIGJfdGFnID0gIjxiPkluc2lkZSBhIEIgdGFnPC9iPiIKKyAgICAgICAgc2VsZi5hc3NlcnRTb3VwRXF1YWxzKGJfdGFnKQorCisgICAgICAgIG5lc3RlZF9iX3RhZyA9ICI8cD5BIDxpPm5lc3RlZCA8Yj50YWc8L2I+PC9pPjwvcD4iCisgICAgICAgIHNlbGYuYXNzZXJ0U291cEVxdWFscyhuZXN0ZWRfYl90YWcpCisKKyAgICAgICAgZG91YmxlX25lc3RlZF9iX3RhZyA9ICI8cD5BIDxhPmRvdWJseSA8aT5uZXN0ZWQgPGI+dGFnPC9iPjwvaT48L2E+PC9wPiIKKyAgICAgICAgc2VsZi5hc3NlcnRTb3VwRXF1YWxzKG5lc3RlZF9iX3RhZykKKworICAgIGRlZiB0ZXN0X25lc3RlZF9ibG9ja19sZXZlbF9lbGVtZW50cyhzZWxmKToKKyAgICAgICAgIiIiQmxvY2sgZWxlbWVudHMgY2FuIGJlIG5lc3RlZC4iIiIKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgnPGJsb2NrcXVvdGU+PHA+PGI+Rm9vPC9iPjwvcD48L2Jsb2NrcXVvdGU+JykKKyAgICAgICAgYmxvY2txdW90ZSA9IHNvdXAuYmxvY2txdW90ZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJsb2NrcXVvdGUucC5iLnN0cmluZywgJ0ZvbycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmxvY2txdW90ZS5iLnN0cmluZywgJ0ZvbycpCisKKyAgICBkZWYgdGVzdF9jb3JyZWN0bHlfbmVzdGVkX3RhYmxlcyhzZWxmKToKKyAgICAgICAgIiIiT25lIHRhYmxlIGNhbiBnbyBpbnNpZGUgYW5vdGhlciBvbmUuIiIiCisgICAgICAgIG1hcmt1cCA9ICgnPHRhYmxlIGlkPSIxIj4nCisgICAgICAgICAgICAgICAgICAnPHRyPicKKyAgICAgICAgICAgICAgICAgICI8dGQ+SGVyZSdzIGFub3RoZXIgdGFibGU6IgorICAgICAgICAgICAgICAgICAgJzx0YWJsZSBpZD0iMiI+JworICAgICAgICAgICAgICAgICAgJzx0cj48dGQ+Zm9vPC90ZD48L3RyPicKKyAgICAgICAgICAgICAgICAgICc8L3RhYmxlPjwvdGQ+JykKKworICAgICAgICBzZWxmLmFzc2VydFNvdXBFcXVhbHMoCisgICAgICAgICAgICBtYXJrdXAsCisgICAgICAgICAgICAnPHRhYmxlIGlkPSIxIj48dHI+PHRkPkhlcmVcJ3MgYW5vdGhlciB0YWJsZTonCisgICAgICAgICAgICAnPHRhYmxlIGlkPSIyIj48dHI+PHRkPmZvbzwvdGQ+PC90cj48L3RhYmxlPicKKyAgICAgICAgICAgICc8L3RkPjwvdHI+PC90YWJsZT4nKQorCisgICAgICAgIHNlbGYuYXNzZXJ0U291cEVxdWFscygKKyAgICAgICAgICAgICI8dGFibGU+PHRoZWFkPjx0cj48dGQ+Rm9vPC90ZD48L3RyPjwvdGhlYWQ+IgorICAgICAgICAgICAgIjx0Ym9keT48dHI+PHRkPkJhcjwvdGQ+PC90cj48L3Rib2R5PiIKKyAgICAgICAgICAgICI8dGZvb3Q+PHRyPjx0ZD5CYXo8L3RkPjwvdHI+PC90Zm9vdD48L3RhYmxlPiIpCisKKyAgICBkZWYgdGVzdF9kZWVwbHlfbmVzdGVkX211bHRpdmFsdWVkX2F0dHJpYnV0ZShzZWxmKToKKyAgICAgICAgIyBodG1sNWxpYiBjYW4gc2V0IHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBzYW1lIHRhZyBtYW55IHRpbWVzCisgICAgICAgICMgYXMgaXQgcmVhcnJhbmdlcyB0aGUgdHJlZS4gVGhpcyBoYXMgY2F1c2VkIHByb2JsZW1zIHdpdGgKKyAgICAgICAgIyBtdWx0aXZhbHVlZCBhdHRyaWJ1dGVzLgorICAgICAgICBtYXJrdXAgPSAnPHRhYmxlPjxkaXY+PGRpdiBjbGFzcz0iY3NzIj48L2Rpdj48L2Rpdj48L3RhYmxlPicKKyAgICAgICAgc291cCA9IHNlbGYuc291cChtYXJrdXApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyJjc3MiXSwgc291cC5kaXYuZGl2WydjbGFzcyddKQorCisgICAgZGVmIHRlc3RfYW5nbGVfYnJhY2tldHNfaW5fYXR0cmlidXRlX3ZhbHVlc19hcmVfZXNjYXBlZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRTb3VwRXF1YWxzKCc8YSBiPSI8YT4iPjwvYT4nLCAnPGEgYj0iJmx0O2EmZ3Q7Ij48L2E+JykKKworICAgIGRlZiB0ZXN0X2VudGl0aWVzX2luX2F0dHJpYnV0ZXNfY29udmVydGVkX3RvX3VuaWNvZGUoc2VsZik6CisgICAgICAgIGV4cGVjdCA9IHUnPHAgaWQ9InBpXE57TEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERX1hdGEiPjwvcD4nCisgICAgICAgIHNlbGYuYXNzZXJ0U291cEVxdWFscygnPHAgaWQ9InBpJiMyNDE7YXRhIj48L3A+JywgZXhwZWN0KQorICAgICAgICBzZWxmLmFzc2VydFNvdXBFcXVhbHMoJzxwIGlkPSJwaSYjeGYxO2F0YSI+PC9wPicsIGV4cGVjdCkKKyAgICAgICAgc2VsZi5hc3NlcnRTb3VwRXF1YWxzKCc8cCBpZD0icGkmI1hmMTthdGEiPjwvcD4nLCBleHBlY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0U291cEVxdWFscygnPHAgaWQ9InBpJm50aWxkZTthdGEiPjwvcD4nLCBleHBlY3QpCisKKyAgICBkZWYgdGVzdF9lbnRpdGllc19pbl90ZXh0X2NvbnZlcnRlZF90b191bmljb2RlKHNlbGYpOgorICAgICAgICBleHBlY3QgPSB1JzxwPnBpXE57TEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERX1hdGE8L3A+JworICAgICAgICBzZWxmLmFzc2VydFNvdXBFcXVhbHMoIjxwPnBpJiMyNDE7YXRhPC9wPiIsIGV4cGVjdCkKKyAgICAgICAgc2VsZi5hc3NlcnRTb3VwRXF1YWxzKCI8cD5waSYjeGYxO2F0YTwvcD4iLCBleHBlY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0U291cEVxdWFscygiPHA+cGkmI1hmMTthdGE8L3A+IiwgZXhwZWN0KQorICAgICAgICBzZWxmLmFzc2VydFNvdXBFcXVhbHMoIjxwPnBpJm50aWxkZTthdGE8L3A+IiwgZXhwZWN0KQorCisgICAgZGVmIHRlc3RfcXVvdF9lbnRpdHlfY29udmVydGVkX3RvX3F1b3RhdGlvbl9tYXJrKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFNvdXBFcXVhbHMoIjxwPkkgc2FpZCAmcXVvdDtnb29kIGRheSEmcXVvdDs8L3A+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8cD5JIHNhaWQgImdvb2QgZGF5ISI8L3A+JykKKworICAgIGRlZiB0ZXN0X291dF9vZl9yYW5nZV9lbnRpdHkoc2VsZik6CisgICAgICAgIGV4cGVjdCA9IHUiXE57UkVQTEFDRU1FTlQgQ0hBUkFDVEVSfSIKKyAgICAgICAgc2VsZi5hc3NlcnRTb3VwRXF1YWxzKCImIzEwMDAwMDAwMDAwMDAwOyIsIGV4cGVjdCkKKyAgICAgICAgc2VsZi5hc3NlcnRTb3VwRXF1YWxzKCImI3gxMDAwMDAwMDAwMDAwMDsiLCBleHBlY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0U291cEVxdWFscygiJiMxMDAwMDAwMDAwOyIsIGV4cGVjdCkKKworICAgIGRlZiB0ZXN0X211bHRpcGFydF9zdHJpbmdzKHNlbGYpOgorICAgICAgICAiTW9zdGx5IHRvIHByZXZlbnQgYSByZWN1cnJlbmNlIG9mIGEgYnVnIGluIHRoZSBodG1sNWxpYiB0cmVlYnVpbGRlci4iCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIjxodG1sPjxoMj5cbmZvbzwvaDI+PHA+PC9wPjwvaHRtbD4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJwIiwgc291cC5oMi5zdHJpbmcubmV4dF9lbGVtZW50Lm5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoInAiLCBzb3VwLnAubmFtZSkKKworICAgIGRlZiB0ZXN0X2Jhc2ljX25hbWVzcGFjZXMoc2VsZik6CisgICAgICAgICIiIlBhcnNlcnMgZG9uJ3QgbmVlZCB0byAqdW5kZXJzdGFuZCogbmFtZXNwYWNlcywgYnV0IGF0IHRoZQorICAgICAgICB2ZXJ5IGxlYXN0IHRoZXkgc2hvdWxkIG5vdCBjaG9rZSBvbiBuYW1lc3BhY2VzIG9yIGxvc2UKKyAgICAgICAgZGF0YS4iIiIKKworICAgICAgICBtYXJrdXAgPSBiJzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWxuczptYXRobWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwiIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxoZWFkPjwvaGVhZD48Ym9keT48bWF0aG1sOm1zcXJ0PjQ8L21hdGhtbDptc3FydD48YiBzdmc6ZmlsbD0icmVkIj48L2I+PC9ib2R5PjwvaHRtbD4nCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAobWFya3VwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hcmt1cCwgc291cC5lbmNvZGUoKSkKKyAgICAgICAgaHRtbCA9IHNvdXAuaHRtbAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgc291cC5odG1sWyd4bWxucyddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgJ2h0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwnLCBzb3VwLmh0bWxbJ3htbG5zOm1hdGhtbCddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgc291cC5odG1sWyd4bWxuczpzdmcnXSkKKworICAgIGRlZiB0ZXN0X211bHRpdmFsdWVkX2F0dHJpYnV0ZV92YWx1ZV9iZWNvbWVzX2xpc3Qoc2VsZik6CisgICAgICAgIG1hcmt1cCA9IGInPGEgY2xhc3M9ImZvbyBiYXIiPicKKyAgICAgICAgc291cCA9IHNlbGYuc291cChtYXJrdXApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWydmb28nLCAnYmFyJ10sIHNvdXAuYVsnY2xhc3MnXSkKKworICAgICMKKyAgICAjIEdlbmVyYWxseSBzcGVha2luZywgdGVzdHMgYmVsb3cgdGhpcyBwb2ludCBhcmUgbW9yZSB0ZXN0cyBvZgorICAgICMgQmVhdXRpZnVsIFNvdXAgdGhhbiB0ZXN0cyBvZiB0aGUgdHJlZSBidWlsZGVycy4gQnV0IHBhcnNlcnMgYXJlCisgICAgIyB3ZWlyZCwgc28gd2UgcnVuIHRoZXNlIHRlc3RzIHNlcGFyYXRlbHkgZm9yIGV2ZXJ5IHRyZWUgYnVpbGRlcgorICAgICMgdG8gZGV0ZWN0IGFueSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZW0uCisgICAgIworCisgICAgZGVmIHRlc3RfY2FuX3BhcnNlX3VuaWNvZGVfZG9jdW1lbnQoc2VsZik6CisgICAgICAgICMgQSBzZWVtaW5nbHkgaW5ub2N1b3VzIGRvY3VtZW50Li4uIGJ1dCBpdCdzIGluIFVuaWNvZGUhIEFuZAorICAgICAgICAjIGl0IGNvbnRhaW5zIGNoYXJhY3RlcnMgdGhhdCBjYW4ndCBiZSByZXByZXNlbnRlZCBpbiB0aGUKKyAgICAgICAgIyBlbmNvZGluZyBmb3VuZCBpbiB0aGUgIGRlY2xhcmF0aW9uISBUaGUgaG9ycm9yIQorICAgICAgICBtYXJrdXAgPSB1JzxodG1sPjxoZWFkPjxtZXRhIGVuY29kaW5nPSJldWMtanAiPjwvaGVhZD48Ym9keT5TYWNyXE57TEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURX0gYmxldSE8L2JvZHk+JworICAgICAgICBzb3VwID0gc2VsZi5zb3VwKG1hcmt1cCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1NhY3JceGU5IGJsZXUhJywgc291cC5ib2R5LnN0cmluZykKKworICAgIGRlZiB0ZXN0X3NvdXBzdHJhaW5lcihzZWxmKToKKyAgICAgICAgIiIiUGFyc2VycyBzaG91bGQgYmUgYWJsZSB0byB3b3JrIHdpdGggU291cFN0cmFpbmVycy4iIiIKKyAgICAgICAgc3RyYWluZXIgPSBTb3VwU3RyYWluZXIoImIiKQorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCJBIDxiPmJvbGQ8L2I+IDxtZXRhLz4gPGk+c3RhdGVtZW50PC9pPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2Vfb25seT1zdHJhaW5lcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3VwLmRlY29kZSgpLCAiPGI+Ym9sZDwvYj4iKQorCisgICAgZGVmIHRlc3Rfc2luZ2xlX3F1b3RlX2F0dHJpYnV0ZV92YWx1ZXNfYmVjb21lX2RvdWJsZV9xdW90ZXMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0U291cEVxdWFscygiPGZvbyBhdHRyPSdiYXInPjwvZm9vPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGZvbyBhdHRyPSJiYXIiPjwvZm9vPicpCisKKyAgICBkZWYgdGVzdF9hdHRyaWJ1dGVfdmFsdWVzX3dpdGhfbmVzdGVkX3F1b3Rlc19hcmVfbGVmdF9hbG9uZShzZWxmKToKKyAgICAgICAgdGV4dCA9ICIiIjxmb28gYXR0cj0nYmFyICJicmF3bHMiIGhhcHBlbic+YTwvZm9vPiIiIgorICAgICAgICBzZWxmLmFzc2VydFNvdXBFcXVhbHModGV4dCkKKworICAgIGRlZiB0ZXN0X2F0dHJpYnV0ZV92YWx1ZXNfd2l0aF9kb3VibGVfbmVzdGVkX3F1b3Rlc19nZXRfcXVvdGVkKHNlbGYpOgorICAgICAgICB0ZXh0ID0gIiIiPGZvbyBhdHRyPSdiYXIgImJyYXdscyIgaGFwcGVuJz5hPC9mb28+IiIiCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAodGV4dCkKKyAgICAgICAgc291cC5mb29bJ2F0dHInXSA9ICdCcmF3bHMgaGFwcGVuIGF0ICJCb2JcJ3MgQmFyIicKKyAgICAgICAgc2VsZi5hc3NlcnRTb3VwRXF1YWxzKAorICAgICAgICAgICAgc291cC5mb28uZGVjb2RlKCksCisgICAgICAgICAgICAiIiI8Zm9vIGF0dHI9IkJyYXdscyBoYXBwZW4gYXQgJnF1b3Q7Qm9iXCdzIEJhciZxdW90OyI+YTwvZm9vPiIiIikKKworICAgIGRlZiB0ZXN0X2FtcGVyc2FuZF9pbl9hdHRyaWJ1dGVfdmFsdWVfZ2V0c19lc2NhcGVkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFNvdXBFcXVhbHMoJzx0aGlzIGlzPSJyZWFsbHkgbWVzc2VkIHVwICYgc3R1ZmYiPjwvdGhpcz4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzx0aGlzIGlzPSJyZWFsbHkgbWVzc2VkIHVwICZhbXA7IHN0dWZmIj48L3RoaXM+JykKKworICAgICAgICBzZWxmLmFzc2VydFNvdXBFcXVhbHMoCisgICAgICAgICAgICAnPGEgaHJlZj0iaHR0cDovL2V4YW1wbGUub3JnP2E9MSZiPTI7MyI+Zm9vPC9hPicsCisgICAgICAgICAgICAnPGEgaHJlZj0iaHR0cDovL2V4YW1wbGUub3JnP2E9MSZhbXA7Yj0yOzMiPmZvbzwvYT4nKQorCisgICAgZGVmIHRlc3RfZXNjYXBlZF9hbXBlcnNhbmRfaW5fYXR0cmlidXRlX3ZhbHVlX2lzX2xlZnRfYWxvbmUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0U291cEVxdWFscygnPGEgaHJlZj0iaHR0cDovL2V4YW1wbGUub3JnP2E9MSZhbXA7Yj0yOzMiPjwvYT4nKQorCisgICAgZGVmIHRlc3RfZW50aXRpZXNfaW5fc3RyaW5nc19jb252ZXJ0ZWRfZHVyaW5nX3BhcnNpbmcoc2VsZik6CisgICAgICAgICMgQm90aCBYTUwgYW5kIEhUTUwgZW50aXRpZXMgYXJlIGNvbnZlcnRlZCB0byBVbmljb2RlIGNoYXJhY3RlcnMKKyAgICAgICAgIyBkdXJpbmcgcGFyc2luZy4KKyAgICAgICAgdGV4dCA9ICI8cD4mbHQ7Jmx0O3NhY3ImZWFjdXRlOyYjMzI7YmxldSEmZ3Q7Jmd0OzwvcD4iCisgICAgICAgIGV4cGVjdGVkID0gdSI8cD4mbHQ7Jmx0O3NhY3JcTntMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFfSBibGV1ISZndDsmZ3Q7PC9wPiIKKyAgICAgICAgc2VsZi5hc3NlcnRTb3VwRXF1YWxzKHRleHQsIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3Rfc21hcnRfcXVvdGVzX2NvbnZlcnRlZF9vbl90aGVfd2F5X2luKHNlbGYpOgorICAgICAgICAjIE1pY3Jvc29mdCBzbWFydCBxdW90ZXMgYXJlIGNvbnZlcnRlZCB0byBVbmljb2RlIGNoYXJhY3RlcnMgZHVyaW5nCisgICAgICAgICMgcGFyc2luZy4KKyAgICAgICAgcXVvdGUgPSBiIjxwPlx4OTFGb29ceDkyPC9wPiIKKyAgICAgICAgc291cCA9IHNlbGYuc291cChxdW90ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNvdXAucC5zdHJpbmcsCisgICAgICAgICAgICB1IlxOe0xFRlQgU0lOR0xFIFFVT1RBVElPTiBNQVJLfUZvb1xOe1JJR0hUIFNJTkdMRSBRVU9UQVRJT04gTUFSS30iKQorCisgICAgZGVmIHRlc3Rfbm9uX2JyZWFraW5nX3NwYWNlc19jb252ZXJ0ZWRfb25fdGhlX3dheV9pbihzZWxmKToKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiPGE+Jm5ic3A7Jm5ic3A7PC9hPiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291cC5hLnN0cmluZywgdSJcTntOTy1CUkVBSyBTUEFDRX0iICogMikKKworICAgIGRlZiB0ZXN0X2VudGl0aWVzX2NvbnZlcnRlZF9vbl90aGVfd2F5X291dChzZWxmKToKKyAgICAgICAgdGV4dCA9ICI8cD4mbHQ7Jmx0O3NhY3ImZWFjdXRlOyYjMzI7YmxldSEmZ3Q7Jmd0OzwvcD4iCisgICAgICAgIGV4cGVjdGVkID0gdSI8cD4mbHQ7Jmx0O3NhY3JcTntMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFfSBibGV1ISZndDsmZ3Q7PC9wPiIuZW5jb2RlKCJ1dGYtOCIpCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAodGV4dCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3VwLnAuZW5jb2RlKCJ1dGYtOCIpLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X3JlYWxfaXNvX2xhdGluX2RvY3VtZW50KHNlbGYpOgorICAgICAgICAjIFNtb2tlIHRlc3Qgb2YgaW50ZXJyZWxhdGVkIGZ1bmN0aW9uYWxpdHksIHVzaW5nIGFuCisgICAgICAgICMgZWFzeS10by11bmRlcnN0YW5kIGRvY3VtZW50LgorCisgICAgICAgICMgSGVyZSBpdCBpcyBpbiBVbmljb2RlLiBOb3RlIHRoYXQgaXQgY2xhaW1zIHRvIGJlIGluIElTTy1MYXRpbi0xLgorICAgICAgICB1bmljb2RlX2h0bWwgPSB1JzxodG1sPjxoZWFkPjxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tTGF0aW4tMSIgaHR0cC1lcXVpdj0iQ29udGVudC10eXBlIi8+PC9oZWFkPjxib2R5PjxwPlNhY3JcTntMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFfSBibGV1ITwvcD48L2JvZHk+PC9odG1sPicKKworICAgICAgICAjIFRoYXQncyBiZWNhdXNlIHdlJ3JlIGdvaW5nIHRvIGVuY29kZSBpdCBpbnRvIElTTy1MYXRpbi0xLCBhbmQgdXNlCisgICAgICAgICMgdGhhdCB0byB0ZXN0LgorICAgICAgICBpc29fbGF0aW5faHRtbCA9IHVuaWNvZGVfaHRtbC5lbmNvZGUoImlzby04ODU5LTEiKQorCisgICAgICAgICMgUGFyc2UgdGhlIElTTy1MYXRpbi0xIEhUTUwuCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoaXNvX2xhdGluX2h0bWwpCisgICAgICAgICMgRW5jb2RlIGl0IHRvIFVURi04LgorICAgICAgICByZXN1bHQgPSBzb3VwLmVuY29kZSgidXRmLTgiKQorCisgICAgICAgICMgV2hhdCBkbyB3ZSBleHBlY3QgdGhlIHJlc3VsdCB0byBsb29rIGxpa2U/IFdlbGwsIGl0IHdvdWxkCisgICAgICAgICMgbG9vayBsaWtlIHVuaWNvZGVfaHRtbCwgZXhjZXB0IHRoYXQgdGhlIE1FVEEgdGFnIHdvdWxkIHNheQorICAgICAgICAjIFVURi04IGluc3RlYWQgb2YgSVNPLUxhdGluLTEuCisgICAgICAgIGV4cGVjdGVkID0gdW5pY29kZV9odG1sLnJlcGxhY2UoIklTTy1MYXRpbi0xIiwgInV0Zi04IikKKworICAgICAgICAjIEFuZCwgb2YgY291cnNlLCBpdCB3b3VsZCBiZSBpbiBVVEYtOCwgbm90IFVuaWNvZGUuCisgICAgICAgIGV4cGVjdGVkID0gZXhwZWN0ZWQuZW5jb2RlKCJ1dGYtOCIpCisKKyAgICAgICAgIyBUYS1kYSEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfcmVhbF9zaGlmdF9qaXNfZG9jdW1lbnQoc2VsZik6CisgICAgICAgICMgU21va2UgdGVzdCB0byBtYWtlIHN1cmUgdGhlIHBhcnNlciBjYW4gaGFuZGxlIGEgZG9jdW1lbnQgaW4KKyAgICAgICAgIyBTaGlmdC1KSVMgZW5jb2RpbmcsIHdpdGhvdXQgY2hva2luZy4KKyAgICAgICAgc2hpZnRfamlzX2h0bWwgPSAoCisgICAgICAgICAgICBiJzxodG1sPjxoZWFkPjwvaGVhZD48Ym9keT48cHJlPicKKyAgICAgICAgICAgIGInXHg4Mlx4YjFceDgyXHhlYVx4ODJceGNkU2hpZnQtSklTXHg4Mlx4YzVceDgzUlx4ODFbXHg4M2YnCisgICAgICAgICAgICBiJ1x4ODNCXHg4M1x4OTNceDgzT1x4ODJceGIzXHg4Mlx4ZWFceDgyXHhiZFx4OTNceGZhXHg5NntceDhjJworICAgICAgICAgICAgYidceGVhXHg4Mlx4Y2NceDgzdFx4ODNAXHg4M0NceDgzXHg4Ylx4ODJceGM1XHg4Mlx4YjdceDgxQicKKyAgICAgICAgICAgIGInPC9wcmU+PC9ib2R5PjwvaHRtbD4nKQorICAgICAgICB1bmljb2RlX2h0bWwgPSBzaGlmdF9qaXNfaHRtbC5kZWNvZGUoInNoaWZ0LWppcyIpCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAodW5pY29kZV9odG1sKQorCisgICAgICAgICMgTWFrZSBzdXJlIHRoZSBwYXJzZSB0cmVlIGlzIGNvcnJlY3RseSBlbmNvZGVkIHRvIHZhcmlvdXMKKyAgICAgICAgIyBlbmNvZGluZ3MuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291cC5lbmNvZGUoInV0Zi04IiksIHVuaWNvZGVfaHRtbC5lbmNvZGUoInV0Zi04IikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291cC5lbmNvZGUoImV1Y19qcCIpLCB1bmljb2RlX2h0bWwuZW5jb2RlKCJldWNfanAiKSkKKworICAgIGRlZiB0ZXN0X3JlYWxfaGVicmV3X2RvY3VtZW50KHNlbGYpOgorICAgICAgICAjIEEgcmVhbC13b3JsZCB0ZXN0IHRvIG1ha2Ugc3VyZSB3ZSBjYW4gY29udmVydCBJU08tODg1OS05IChhCisgICAgICAgICMgSGVicmV3IGVuY29kaW5nKSB0byBVVEYtOC4KKyAgICAgICAgaGVicmV3X2RvY3VtZW50ID0gYic8aHRtbD48aGVhZD48dGl0bGU+SGVicmV3IChJU08gODg1OS04KSBpbiBWaXN1YWwgRGlyZWN0aW9uYWxpdHk8L3RpdGxlPjwvaGVhZD48Ym9keT48aDE+SGVicmV3IChJU08gODg1OS04KSBpbiBWaXN1YWwgRGlyZWN0aW9uYWxpdHk8L2gxPlx4ZWRceGU1XHhlY1x4Zjk8L2JvZHk+PC9odG1sPicKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgKKyAgICAgICAgICAgIGhlYnJld19kb2N1bWVudCwgZnJvbV9lbmNvZGluZz0iaXNvODg1OS04IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3VwLm9yaWdpbmFsX2VuY29kaW5nLCAnaXNvODg1OS04JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNvdXAuZW5jb2RlKCd1dGYtOCcpLAorICAgICAgICAgICAgaGVicmV3X2RvY3VtZW50LmRlY29kZSgiaXNvODg1OS04IikuZW5jb2RlKCJ1dGYtOCIpKQorCisgICAgZGVmIHRlc3RfbWV0YV90YWdfcmVmbGVjdHNfY3VycmVudF9lbmNvZGluZyhzZWxmKToKKyAgICAgICAgIyBIZXJlJ3MgdGhlIDxtZXRhPiB0YWcgc2F5aW5nIHRoYXQgYSBkb2N1bWVudCBpcworICAgICAgICAjIGVuY29kZWQgaW4gU2hpZnQtSklTLgorICAgICAgICBtZXRhX3RhZyA9ICgnPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXgtc2ppcyIgJworICAgICAgICAgICAgICAgICAgICAnaHR0cC1lcXVpdj0iQ29udGVudC10eXBlIi8+JykKKworICAgICAgICAjIEhlcmUncyBhIGRvY3VtZW50IGluY29ycG9yYXRpbmcgdGhhdCBtZXRhIHRhZy4KKyAgICAgICAgc2hpZnRfamlzX2h0bWwgPSAoCisgICAgICAgICAgICAnPGh0bWw+PGhlYWQ+XG4lc1xuJworICAgICAgICAgICAgJzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtbGFuZ3VhZ2UiIGNvbnRlbnQ9ImphIi8+JworICAgICAgICAgICAgJzwvaGVhZD48Ym9keT5TaGlmdC1KSVMgbWFya3VwIGdvZXMgaGVyZS4nKSAlIG1ldGFfdGFnCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoc2hpZnRfamlzX2h0bWwpCisKKyAgICAgICAgIyBQYXJzZSB0aGUgZG9jdW1lbnQsIGFuZCB0aGUgY2hhcnNldCBpcyBzZWVtaW5nbHkgdW5hZmZlY3RlZC4KKyAgICAgICAgcGFyc2VkX21ldGEgPSBzb3VwLmZpbmQoJ21ldGEnLCB7J2h0dHAtZXF1aXYnOiAnQ29udGVudC10eXBlJ30pCisgICAgICAgIGNvbnRlbnQgPSBwYXJzZWRfbWV0YVsnY29udGVudCddCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3RleHQvaHRtbDsgY2hhcnNldD14LXNqaXMnLCBjb250ZW50KQorCisgICAgICAgICMgQnV0IHRoYXQgdmFsdWUgaXMgYWN0dWFsbHkgYSBDb250ZW50TWV0YUF0dHJpYnV0ZVZhbHVlIG9iamVjdC4KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoY29udGVudCwgQ29udGVudE1ldGFBdHRyaWJ1dGVWYWx1ZSkpCisKKyAgICAgICAgIyBBbmQgaXQgd2lsbCB0YWtlIG9uIGEgdmFsdWUgdGhhdCByZWZsZWN0cyBpdHMgY3VycmVudAorICAgICAgICAjIGVuY29kaW5nLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmOCcsIGNvbnRlbnQuZW5jb2RlKCJ1dGY4IikpCisKKyAgICAgICAgIyBGb3IgdGhlIHJlc3Qgb2YgdGhlIHN0b3J5LCBzZWUgVGVzdFN1YnN0aXR1dGlvbnMgaW4KKyAgICAgICAgIyB0ZXN0X3RyZWUucHkuCisKKyAgICBkZWYgdGVzdF9odG1sNV9zdHlsZV9tZXRhX3RhZ19yZWZsZWN0c19jdXJyZW50X2VuY29kaW5nKHNlbGYpOgorICAgICAgICAjIEhlcmUncyB0aGUgPG1ldGE+IHRhZyBzYXlpbmcgdGhhdCBhIGRvY3VtZW50IGlzCisgICAgICAgICMgZW5jb2RlZCBpbiBTaGlmdC1KSVMuCisgICAgICAgIG1ldGFfdGFnID0gKCc8bWV0YSBpZD0iZW5jb2RpbmciIGNoYXJzZXQ9Ingtc2ppcyIgLz4nKQorCisgICAgICAgICMgSGVyZSdzIGEgZG9jdW1lbnQgaW5jb3Jwb3JhdGluZyB0aGF0IG1ldGEgdGFnLgorICAgICAgICBzaGlmdF9qaXNfaHRtbCA9ICgKKyAgICAgICAgICAgICc8aHRtbD48aGVhZD5cbiVzXG4nCisgICAgICAgICAgICAnPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1sYW5ndWFnZSIgY29udGVudD0iamEiLz4nCisgICAgICAgICAgICAnPC9oZWFkPjxib2R5PlNoaWZ0LUpJUyBtYXJrdXAgZ29lcyBoZXJlLicpICUgbWV0YV90YWcKKyAgICAgICAgc291cCA9IHNlbGYuc291cChzaGlmdF9qaXNfaHRtbCkKKworICAgICAgICAjIFBhcnNlIHRoZSBkb2N1bWVudCwgYW5kIHRoZSBjaGFyc2V0IGlzIHNlZW1pbmdseSB1bmFmZmVjdGVkLgorICAgICAgICBwYXJzZWRfbWV0YSA9IHNvdXAuZmluZCgnbWV0YScsIGlkPSJlbmNvZGluZyIpCisgICAgICAgIGNoYXJzZXQgPSBwYXJzZWRfbWV0YVsnY2hhcnNldCddCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3gtc2ppcycsIGNoYXJzZXQpCisKKyAgICAgICAgIyBCdXQgdGhhdCB2YWx1ZSBpcyBhY3R1YWxseSBhIENoYXJzZXRNZXRhQXR0cmlidXRlVmFsdWUgb2JqZWN0LgorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShjaGFyc2V0LCBDaGFyc2V0TWV0YUF0dHJpYnV0ZVZhbHVlKSkKKworICAgICAgICAjIEFuZCBpdCB3aWxsIHRha2Ugb24gYSB2YWx1ZSB0aGF0IHJlZmxlY3RzIGl0cyBjdXJyZW50CisgICAgICAgICMgZW5jb2RpbmcuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3V0ZjgnLCBjaGFyc2V0LmVuY29kZSgidXRmOCIpKQorCisgICAgZGVmIHRlc3RfdGFnX3dpdGhfbm9fYXR0cmlidXRlc19jYW5faGF2ZV9hdHRyaWJ1dGVzX2FkZGVkKHNlbGYpOgorICAgICAgICBkYXRhID0gc2VsZi5zb3VwKCI8YT50ZXh0PC9hPiIpCisgICAgICAgIGRhdGEuYVsnZm9vJ10gPSAnYmFyJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCc8YSBmb289ImJhciI+dGV4dDwvYT4nLCBkYXRhLmEuZGVjb2RlKCkpCisKK2NsYXNzIFhNTFRyZWVCdWlsZGVyU21va2VUZXN0KG9iamVjdCk6CisKKyAgICBkZWYgdGVzdF9kb2NzdHJpbmdfZ2VuZXJhdGVkKHNlbGYpOgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCI8cm9vdC8+IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNvdXAuZW5jb2RlKCksIGInPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz5cbjxyb290Lz4nKQorCisgICAgZGVmIHRlc3RfcmVhbF94aHRtbF9kb2N1bWVudChzZWxmKToKKyAgICAgICAgIiIiQSByZWFsIFhIVE1MIGRvY3VtZW50IHNob3VsZCBjb21lIG91dCAqZXhhY3RseSogdGhlIHNhbWUgYXMgaXQgd2VudCBpbi4iIiIKKyAgICAgICAgbWFya3VwID0gYiIiIjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKzxoZWFkPjx0aXRsZT5IZWxsby48L3RpdGxlPjwvaGVhZD4KKzxib2R5Pkdvb2RieWUuPC9ib2R5PgorPC9odG1sPiIiIgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKG1hcmt1cCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNvdXAuZW5jb2RlKCJ1dGYtOCIpLCBtYXJrdXApCisKKyAgICBkZWYgdGVzdF9mb3JtYXR0ZXJfcHJvY2Vzc2VzX3NjcmlwdF90YWdfZm9yX3htbF9kb2N1bWVudHMoc2VsZik6CisgICAgICAgIGRvYyA9ICIiIgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgIDwvc2NyaXB0PgorIiIiCisgICAgICAgIHNvdXAgPSBCZWF1dGlmdWxTb3VwKGRvYywgInhtbCIpCisgICAgICAgICMgbHhtbCB3b3VsZCBoYXZlIHN0cmlwcGVkIHRoaXMgd2hpbGUgcGFyc2luZywgYnV0IHdlIGNhbiBhZGQKKyAgICAgICAgIyBpdCBsYXRlci4KKyAgICAgICAgc291cC5zY3JpcHQuc3RyaW5nID0gJ2NvbnNvbGUubG9nKCI8IDwgaGV5ID4gPiAiKTsnCisgICAgICAgIGVuY29kZWQgPSBzb3VwLmVuY29kZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiIiZsdDsgJmx0OyBoZXkgJmd0OyAmZ3Q7IiBpbiBlbmNvZGVkKQorCisgICAgZGVmIHRlc3RfY2FuX3BhcnNlX3VuaWNvZGVfZG9jdW1lbnQoc2VsZik6CisgICAgICAgIG1hcmt1cCA9IHUnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iZXVjLWpwIj48cm9vdD5TYWNyXE57TEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURX0gYmxldSE8L3Jvb3Q+JworICAgICAgICBzb3VwID0gc2VsZi5zb3VwKG1hcmt1cCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1NhY3JceGU5IGJsZXUhJywgc291cC5yb290LnN0cmluZykKKworICAgIGRlZiB0ZXN0X3BvcHBpbmdfbmFtZXNwYWNlZF90YWcoc2VsZik6CisgICAgICAgIG1hcmt1cCA9ICc8cnNzIHhtbG5zOmRjPSJmb28iPjxkYzpjcmVhdG9yPmI8L2RjOmNyZWF0b3I+PGRjOmRhdGU+MjAxMi0wNy0wMlQyMDozMzo0Mlo8L2RjOmRhdGU+PGRjOnJpZ2h0cz5jPC9kYzpyaWdodHM+PGltYWdlPmQ8L2ltYWdlPjwvcnNzPicKKyAgICAgICAgc291cCA9IHNlbGYuc291cChtYXJrdXApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICB1bmljb2RlKHNvdXAucnNzKSwgbWFya3VwKQorCisgICAgZGVmIHRlc3RfZG9jc3RyaW5nX2luY2x1ZGVzX2NvcnJlY3RfZW5jb2Rpbmcoc2VsZik6CisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIjxyb290Lz4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc291cC5lbmNvZGUoImxhdGluMSIpLAorICAgICAgICAgICAgYic8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJsYXRpbjEiPz5cbjxyb290Lz4nKQorCisgICAgZGVmIHRlc3RfbGFyZ2VfeG1sX2RvY3VtZW50KHNlbGYpOgorICAgICAgICAiIiJBIGxhcmdlIFhNTCBkb2N1bWVudCBzaG91bGQgY29tZSBvdXQgdGhlIHNhbWUgYXMgaXQgd2VudCBpbi4iIiIKKyAgICAgICAgbWFya3VwID0gKGInPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz5cbjxyb290PicKKyAgICAgICAgICAgICAgICAgICsgYicwJyAqICgyKioxMikKKyAgICAgICAgICAgICAgICAgICsgYic8L3Jvb3Q+JykKKyAgICAgICAgc291cCA9IHNlbGYuc291cChtYXJrdXApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291cC5lbmNvZGUoInV0Zi04IiksIG1hcmt1cCkKKworCisgICAgZGVmIHRlc3RfdGFnc19hcmVfZW1wdHlfZWxlbWVudF9pZl9hbmRfb25seV9pZl90aGV5X2FyZV9lbXB0eShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRTb3VwRXF1YWxzKCI8cD4iLCAiPHAvPiIpCisgICAgICAgIHNlbGYuYXNzZXJ0U291cEVxdWFscygiPHA+Zm9vPC9wPiIpCisKKyAgICBkZWYgdGVzdF9uYW1lc3BhY2VzX2FyZV9wcmVzZXJ2ZWQoc2VsZik6CisgICAgICAgIG1hcmt1cCA9ICc8cm9vdCB4bWxuczphPSJodHRwOi8vZXhhbXBsZS5jb20vIiB4bWxuczpiPSJodHRwOi8vZXhhbXBsZS5uZXQvIj48YTpmb28+VGhpcyB0YWcgaXMgaW4gdGhlIGEgbmFtZXNwYWNlPC9hOmZvbz48Yjpmb28+VGhpcyB0YWcgaXMgaW4gdGhlIGIgbmFtZXNwYWNlPC9iOmZvbz48L3Jvb3Q+JworICAgICAgICBzb3VwID0gc2VsZi5zb3VwKG1hcmt1cCkKKyAgICAgICAgcm9vdCA9IHNvdXAucm9vdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJodHRwOi8vZXhhbXBsZS5jb20vIiwgcm9vdFsneG1sbnM6YSddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJodHRwOi8vZXhhbXBsZS5uZXQvIiwgcm9vdFsneG1sbnM6YiddKQorCisgICAgZGVmIHRlc3RfY2xvc2luZ19uYW1lc3BhY2VkX3RhZyhzZWxmKToKKyAgICAgICAgbWFya3VwID0gJzxwIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+PGRjOmRhdGU+MjAwMTA1MDQ8L2RjOmRhdGU+PC9wPicKKyAgICAgICAgc291cCA9IHNlbGYuc291cChtYXJrdXApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZShzb3VwLnApLCBtYXJrdXApCisKKyAgICBkZWYgdGVzdF9uYW1lc3BhY2VkX2F0dHJpYnV0ZXMoc2VsZik6CisgICAgICAgIG1hcmt1cCA9ICc8Zm9vIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPjxiYXIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tIi8+PC9mb28+JworICAgICAgICBzb3VwID0gc2VsZi5zb3VwKG1hcmt1cCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKHNvdXAuZm9vKSwgbWFya3VwKQorCisgICAgZGVmIHRlc3RfbmFtZXNwYWNlZF9hdHRyaWJ1dGVzX3htbF9uYW1lc3BhY2Uoc2VsZik6CisgICAgICAgIG1hcmt1cCA9ICc8Zm9vIHhtbDpsYW5nPSJmciI+YmFyPC9mb28+JworICAgICAgICBzb3VwID0gc2VsZi5zb3VwKG1hcmt1cCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKHNvdXAuZm9vKSwgbWFya3VwKQorCitjbGFzcyBIVE1MNVRyZWVCdWlsZGVyU21va2VUZXN0KEhUTUxUcmVlQnVpbGRlclNtb2tlVGVzdCk6CisgICAgIiIiU21va2UgdGVzdCBmb3IgYSB0cmVlIGJ1aWxkZXIgdGhhdCBzdXBwb3J0cyBIVE1MNS4iIiIKKworICAgIGRlZiB0ZXN0X3JlYWxfeGh0bWxfZG9jdW1lbnQoc2VsZik6CisgICAgICAgICMgU2luY2UgWEhUTUwgaXMgbm90IEhUTUw1LCBIVE1MNSBwYXJzZXJzIGFyZSBub3QgdGVzdGVkIHRvIGhhbmRsZQorICAgICAgICAjIFhIVE1MIGRvY3VtZW50cyBpbiBhbnkgcGFydGljdWxhciB3YXkuCisgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X2h0bWxfdGFnc19oYXZlX25hbWVzcGFjZShzZWxmKToKKyAgICAgICAgbWFya3VwID0gIjxhPiIKKyAgICAgICAgc291cCA9IHNlbGYuc291cChtYXJrdXApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCBzb3VwLmEubmFtZXNwYWNlKQorCisgICAgZGVmIHRlc3Rfc3ZnX3RhZ3NfaGF2ZV9uYW1lc3BhY2Uoc2VsZik6CisgICAgICAgIG1hcmt1cCA9ICc8c3ZnPjxjaXJjbGUvPjwvc3ZnPicKKyAgICAgICAgc291cCA9IHNlbGYuc291cChtYXJrdXApCisgICAgICAgIG5hbWVzcGFjZSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYW1lc3BhY2UsIHNvdXAuc3ZnLm5hbWVzcGFjZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYW1lc3BhY2UsIHNvdXAuY2lyY2xlLm5hbWVzcGFjZSkKKworCisgICAgZGVmIHRlc3RfbWF0aG1sX3RhZ3NfaGF2ZV9uYW1lc3BhY2Uoc2VsZik6CisgICAgICAgIG1hcmt1cCA9ICc8bWF0aD48bXNxcnQ+NTwvbXNxcnQ+PC9tYXRoPicKKyAgICAgICAgc291cCA9IHNlbGYuc291cChtYXJrdXApCisgICAgICAgIG5hbWVzcGFjZSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5hbWVzcGFjZSwgc291cC5tYXRoLm5hbWVzcGFjZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYW1lc3BhY2UsIHNvdXAubXNxcnQubmFtZXNwYWNlKQorCisgICAgZGVmIHRlc3RfeG1sX2RlY2xhcmF0aW9uX2JlY29tZXNfY29tbWVudChzZWxmKToKKyAgICAgICAgbWFya3VwID0gJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PGh0bWw+PC9odG1sPicKKyAgICAgICAgc291cCA9IHNlbGYuc291cChtYXJrdXApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHNvdXAuY29udGVudHNbMF0sIENvbW1lbnQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXAuY29udGVudHNbMF0sICc/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJodG1sIiwgc291cC5jb250ZW50c1swXS5uZXh0X2VsZW1lbnQubmFtZSkKKworZGVmIHNraXBJZihjb25kaXRpb24sIHJlYXNvbik6CisgICBkZWYgbm90aGluZyh0ZXN0LCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgIHJldHVybiBOb25lCisKKyAgIGRlZiBkZWNvcmF0b3IodGVzdF9pdGVtKToKKyAgICAgICBpZiBjb25kaXRpb246CisgICAgICAgICAgIHJldHVybiBub3RoaW5nCisgICAgICAgZWxzZToKKyAgICAgICAgICAgcmV0dXJuIHRlc3RfaXRlbQorCisgICByZXR1cm4gZGVjb3JhdG9yCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iczQvdGVzdHMvX19pbml0X18ucHkgYi9iaXRiYWtlL2xpYi9iczQvdGVzdHMvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQyYzhjYwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JzNC90ZXN0cy9fX2luaXRfXy5weQpAQCAtMCwwICsxIEBACisiVGhlIGJlYXV0aWZ1bHNvdXAgdGVzdHMuIgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYnM0L3Rlc3RzL3Rlc3RfYnVpbGRlcl9yZWdpc3RyeS5weSBiL2JpdGJha2UvbGliL2JzNC90ZXN0cy90ZXN0X2J1aWxkZXJfcmVnaXN0cnkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJhZDEwZgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JzNC90ZXN0cy90ZXN0X2J1aWxkZXJfcmVnaXN0cnkucHkKQEAgLTAsMCArMSwxNDEgQEAKKyIiIlRlc3RzIG9mIHRoZSBidWlsZGVyIHJlZ2lzdHJ5LiIiIgorCitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSBiczQgaW1wb3J0IEJlYXV0aWZ1bFNvdXAKK2Zyb20gYnM0LmJ1aWxkZXIgaW1wb3J0ICgKKyAgICBidWlsZGVyX3JlZ2lzdHJ5IGFzIHJlZ2lzdHJ5LAorICAgIEhUTUxQYXJzZXJUcmVlQnVpbGRlciwKKyAgICBUcmVlQnVpbGRlclJlZ2lzdHJ5LAorKQorCit0cnk6CisgICAgZnJvbSBiczQuYnVpbGRlciBpbXBvcnQgSFRNTDVUcmVlQnVpbGRlcgorICAgIEhUTUw1TElCX1BSRVNFTlQgPSBUcnVlCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgSFRNTDVMSUJfUFJFU0VOVCA9IEZhbHNlCisKK3RyeToKKyAgICBmcm9tIGJzNC5idWlsZGVyIGltcG9ydCAoCisgICAgICAgIExYTUxUcmVlQnVpbGRlckZvclhNTCwKKyAgICAgICAgTFhNTFRyZWVCdWlsZGVyLAorICAgICAgICApCisgICAgTFhNTF9QUkVTRU5UID0gVHJ1ZQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIExYTUxfUFJFU0VOVCA9IEZhbHNlCisKKworY2xhc3MgQnVpbHRJblJlZ2lzdHJ5VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdCB0aGUgYnVpbHQtaW4gcmVnaXN0cnkgd2l0aCB0aGUgZGVmYXVsdCBidWlsZGVycyByZWdpc3RlcmVkLiIiIgorCisgICAgZGVmIHRlc3RfY29tYmluYXRpb24oc2VsZik6CisgICAgICAgIGlmIExYTUxfUFJFU0VOVDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVnaXN0cnkubG9va3VwKCdmYXN0JywgJ2h0bWwnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFhNTFRyZWVCdWlsZGVyKQorCisgICAgICAgIGlmIExYTUxfUFJFU0VOVDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVnaXN0cnkubG9va3VwKCdwZXJtaXNzaXZlJywgJ3htbCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMWE1MVHJlZUJ1aWxkZXJGb3JYTUwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVnaXN0cnkubG9va3VwKCdzdHJpY3QnLCAnaHRtbCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBIVE1MUGFyc2VyVHJlZUJ1aWxkZXIpCisgICAgICAgIGlmIEhUTUw1TElCX1BSRVNFTlQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZ2lzdHJ5Lmxvb2t1cCgnaHRtbDVsaWInLCAnaHRtbCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRNTDVUcmVlQnVpbGRlcikKKworICAgIGRlZiB0ZXN0X2xvb2t1cF9ieV9tYXJrdXBfdHlwZShzZWxmKToKKyAgICAgICAgaWYgTFhNTF9QUkVTRU5UOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWdpc3RyeS5sb29rdXAoJ2h0bWwnKSwgTFhNTFRyZWVCdWlsZGVyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWdpc3RyeS5sb29rdXAoJ3htbCcpLCBMWE1MVHJlZUJ1aWxkZXJGb3JYTUwpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZ2lzdHJ5Lmxvb2t1cCgneG1sJyksIE5vbmUpCisgICAgICAgICAgICBpZiBIVE1MNUxJQl9QUkVTRU5UOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVnaXN0cnkubG9va3VwKCdodG1sJyksIEhUTUw1VHJlZUJ1aWxkZXIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVnaXN0cnkubG9va3VwKCdodG1sJyksIEhUTUxQYXJzZXJUcmVlQnVpbGRlcikKKworICAgIGRlZiB0ZXN0X25hbWVkX2xpYnJhcnkoc2VsZik6CisgICAgICAgIGlmIExYTUxfUFJFU0VOVDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVnaXN0cnkubG9va3VwKCdseG1sJywgJ3htbCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMWE1MVHJlZUJ1aWxkZXJGb3JYTUwpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZ2lzdHJ5Lmxvb2t1cCgnbHhtbCcsICdodG1sJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExYTUxUcmVlQnVpbGRlcikKKyAgICAgICAgaWYgSFRNTDVMSUJfUFJFU0VOVDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVnaXN0cnkubG9va3VwKCdodG1sNWxpYicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRNTDVUcmVlQnVpbGRlcikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZ2lzdHJ5Lmxvb2t1cCgnaHRtbC5wYXJzZXInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSFRNTFBhcnNlclRyZWVCdWlsZGVyKQorCisgICAgZGVmIHRlc3RfYmVhdXRpZnVsc291cF9jb25zdHJ1Y3Rvcl9kb2VzX2xvb2t1cChzZWxmKToKKyAgICAgICAgIyBZb3UgY2FuIHBhc3MgaW4gYSBzdHJpbmcuCisgICAgICAgIEJlYXV0aWZ1bFNvdXAoIiIsIGZlYXR1cmVzPSJodG1sIikKKyAgICAgICAgIyBPciBhIGxpc3Qgb2Ygc3RyaW5ncy4KKyAgICAgICAgQmVhdXRpZnVsU291cCgiIiwgZmVhdHVyZXM9WyJodG1sIiwgImZhc3QiXSkKKworICAgICAgICAjIFlvdSdsbCBnZXQgYW4gZXhjZXB0aW9uIGlmIEJTIGNhbid0IGZpbmQgYW4gYXBwcm9wcmlhdGUKKyAgICAgICAgIyBidWlsZGVyLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBCZWF1dGlmdWxTb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgZmVhdHVyZXM9Im5vLXN1Y2gtZmVhdHVyZSIpCisKK2NsYXNzIFJlZ2lzdHJ5VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdCB0aGUgVHJlZUJ1aWxkZXJSZWdpc3RyeSBjbGFzcyBpbiBnZW5lcmFsLiIiIgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnJlZ2lzdHJ5ID0gVHJlZUJ1aWxkZXJSZWdpc3RyeSgpCisKKyAgICBkZWYgYnVpbGRlcl9mb3JfZmVhdHVyZXMoc2VsZiwgKmZlYXR1cmVfbGlzdCk6CisgICAgICAgIGNscyA9IHR5cGUoJ0J1aWxkZXJfJyArICdfJy5qb2luKGZlYXR1cmVfbGlzdCksCisgICAgICAgICAgICAgICAgICAgKG9iamVjdCwpLCB7J2ZlYXR1cmVzJyA6IGZlYXR1cmVfbGlzdH0pCisKKyAgICAgICAgc2VsZi5yZWdpc3RyeS5yZWdpc3RlcihjbHMpCisgICAgICAgIHJldHVybiBjbHMKKworICAgIGRlZiB0ZXN0X3JlZ2lzdGVyX3dpdGhfbm9fZmVhdHVyZXMoc2VsZik6CisgICAgICAgIGJ1aWxkZXIgPSBzZWxmLmJ1aWxkZXJfZm9yX2ZlYXR1cmVzKCkKKworICAgICAgICAjIFNpbmNlIHRoZSBidWlsZGVyIGFkdmVydGlzZXMgbm8gZmVhdHVyZXMsIHlvdSBjYW4ndCBmaW5kIGl0CisgICAgICAgICMgYnkgbG9va2luZyB1cCBmZWF0dXJlcy4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJlZ2lzdHJ5Lmxvb2t1cCgnZm9vJyksIE5vbmUpCisKKyAgICAgICAgIyBCdXQgeW91IGNhbiBmaW5kIGl0IGJ5IGRvaW5nIGEgbG9va3VwIHdpdGggbm8gZmVhdHVyZXMsIGlmCisgICAgICAgICMgdGhpcyBoYXBwZW5zIHRvIGJlIHRoZSBvbmx5IHJlZ2lzdGVyZWQgYnVpbGRlci4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJlZ2lzdHJ5Lmxvb2t1cCgpLCBidWlsZGVyKQorCisgICAgZGVmIHRlc3RfcmVnaXN0ZXJfd2l0aF9mZWF0dXJlc19tYWtlc19sb29rdXBfc3VjY2VlZChzZWxmKToKKyAgICAgICAgYnVpbGRlciA9IHNlbGYuYnVpbGRlcl9mb3JfZmVhdHVyZXMoJ2ZvbycsICdiYXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucmVnaXN0cnkubG9va3VwKCdmb28nKSwgYnVpbGRlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJlZ2lzdHJ5Lmxvb2t1cCgnYmFyJyksIGJ1aWxkZXIpCisKKyAgICBkZWYgdGVzdF9sb29rdXBfZmFpbHNfd2hlbl9ub19idWlsZGVyX2ltcGxlbWVudHNfZmVhdHVyZShzZWxmKToKKyAgICAgICAgYnVpbGRlciA9IHNlbGYuYnVpbGRlcl9mb3JfZmVhdHVyZXMoJ2ZvbycsICdiYXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucmVnaXN0cnkubG9va3VwKCdiYXonKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X2xvb2t1cF9nZXRzX21vc3RfcmVjZW50X3JlZ2lzdHJhdGlvbl93aGVuX25vX2ZlYXR1cmVfc3BlY2lmaWVkKHNlbGYpOgorICAgICAgICBidWlsZGVyMSA9IHNlbGYuYnVpbGRlcl9mb3JfZmVhdHVyZXMoJ2ZvbycpCisgICAgICAgIGJ1aWxkZXIyID0gc2VsZi5idWlsZGVyX2Zvcl9mZWF0dXJlcygnYmFyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJlZ2lzdHJ5Lmxvb2t1cCgpLCBidWlsZGVyMikKKworICAgIGRlZiB0ZXN0X2xvb2t1cF9mYWlsc193aGVuX25vX3RyZWVfYnVpbGRlcnNfcmVnaXN0ZXJlZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJlZ2lzdHJ5Lmxvb2t1cCgpLCBOb25lKQorCisgICAgZGVmIHRlc3RfbG9va3VwX2dldHNfbW9zdF9yZWNlbnRfYnVpbGRlcl9zdXBwb3J0aW5nX2FsbF9mZWF0dXJlcyhzZWxmKToKKyAgICAgICAgaGFzX29uZSA9IHNlbGYuYnVpbGRlcl9mb3JfZmVhdHVyZXMoJ2ZvbycpCisgICAgICAgIGhhc190aGVfb3RoZXIgPSBzZWxmLmJ1aWxkZXJfZm9yX2ZlYXR1cmVzKCdiYXInKQorICAgICAgICBoYXNfYm90aF9lYXJseSA9IHNlbGYuYnVpbGRlcl9mb3JfZmVhdHVyZXMoJ2ZvbycsICdiYXInLCAnYmF6JykKKyAgICAgICAgaGFzX2JvdGhfbGF0ZSA9IHNlbGYuYnVpbGRlcl9mb3JfZmVhdHVyZXMoJ2ZvbycsICdiYXInLCAncXV1eCcpCisgICAgICAgIGxhY2tzX29uZSA9IHNlbGYuYnVpbGRlcl9mb3JfZmVhdHVyZXMoJ2JhcicpCisgICAgICAgIGhhc190aGVfb3RoZXIgPSBzZWxmLmJ1aWxkZXJfZm9yX2ZlYXR1cmVzKCdmb28nKQorCisgICAgICAgICMgVGhlcmUgYXJlIHR3byBidWlsZGVycyBmZWF0dXJpbmcgJ2ZvbycgYW5kICdiYXInLCBidXQKKyAgICAgICAgIyB0aGUgb25lIHRoYXQgYWxzbyBmZWF0dXJlcyAncXV1eCcgd2FzIHJlZ2lzdGVyZWQgbGF0ZXIuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5yZWdpc3RyeS5sb29rdXAoJ2ZvbycsICdiYXInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzX2JvdGhfbGF0ZSkKKworICAgICAgICAjIFRoZXJlIGlzIG9ubHkgb25lIGJ1aWxkZXIgZmVhdHVyaW5nICdmb28nLCAnYmFyJywgYW5kICdiYXonLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucmVnaXN0cnkubG9va3VwKCdmb28nLCAnYmFyJywgJ2JheicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNfYm90aF9lYXJseSkKKworICAgIGRlZiB0ZXN0X2xvb2t1cF9mYWlsc193aGVuX2Nhbm5vdF9yZWNvbmNpbGVfcmVxdWVzdGVkX2ZlYXR1cmVzKHNlbGYpOgorICAgICAgICBidWlsZGVyMSA9IHNlbGYuYnVpbGRlcl9mb3JfZmVhdHVyZXMoJ2ZvbycsICdiYXInKQorICAgICAgICBidWlsZGVyMiA9IHNlbGYuYnVpbGRlcl9mb3JfZmVhdHVyZXMoJ2ZvbycsICdiYXonKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucmVnaXN0cnkubG9va3VwKCdiYXInLCAnYmF6JyksIE5vbmUpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iczQvdGVzdHMvdGVzdF9kb2NzLnB5IGIvYml0YmFrZS9saWIvYnM0L3Rlc3RzL3Rlc3RfZG9jcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjlmNjc3Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYnM0L3Rlc3RzL3Rlc3RfZG9jcy5weQpAQCAtMCwwICsxLDM2IEBACisiVGVzdCBoYXJuZXNzIGZvciBkb2N0ZXN0cy4iCisKKyMgcHlsaW50OiBkaXNhYmxlLW1zZz1FMDYxMSxXMDE0MgorCitfX21ldGFjbGFzc19fID0gdHlwZQorX19hbGxfXyA9IFsKKyAgICAnYWRkaXRpb25hbF90ZXN0cycsCisgICAgXQorCitpbXBvcnQgYXRleGl0CitpbXBvcnQgZG9jdGVzdAoraW1wb3J0IG9zCisjZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCAoCisjICAgIHJlc291cmNlX2ZpbGVuYW1lLCByZXNvdXJjZV9leGlzdHMsIHJlc291cmNlX2xpc3RkaXIsIGNsZWFudXBfcmVzb3VyY2VzKQoraW1wb3J0IHVuaXR0ZXN0CisKK0RPQ1RFU1RfRkxBR1MgPSAoCisgICAgZG9jdGVzdC5FTExJUFNJUyB8CisgICAgZG9jdGVzdC5OT1JNQUxJWkVfV0hJVEVTUEFDRSB8CisgICAgZG9jdGVzdC5SRVBPUlRfTkRJRkYpCisKKworIyBkZWYgYWRkaXRpb25hbF90ZXN0cygpOgorIyAgICAgIlJ1biB0aGUgZG9jIHRlc3RzIChSRUFETUUudHh0IGFuZCBkb2NzLyosIGlmIGFueSBleGlzdCkiCisjICAgICBkb2N0ZXN0X2ZpbGVzID0gWworIyAgICAgICAgIG9zLnBhdGguYWJzcGF0aChyZXNvdXJjZV9maWxlbmFtZSgnYnM0JywgJ1JFQURNRS50eHQnKSldCisjICAgICBpZiByZXNvdXJjZV9leGlzdHMoJ2JzNCcsICdkb2NzJyk6CisjICAgICAgICAgZm9yIG5hbWUgaW4gcmVzb3VyY2VfbGlzdGRpcignYnM0JywgJ2RvY3MnKToKKyMgICAgICAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgnLnR4dCcpOgorIyAgICAgICAgICAgICAgICAgZG9jdGVzdF9maWxlcy5hcHBlbmQoCisjICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5hYnNwYXRoKAorIyAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZV9maWxlbmFtZSgnYnM0JywgJ2RvY3MvJXMnICUgbmFtZSkpKQorIyAgICAga3dhcmdzID0gZGljdChtb2R1bGVfcmVsYXRpdmU9RmFsc2UsIG9wdGlvbmZsYWdzPURPQ1RFU1RfRkxBR1MpCisjICAgICBhdGV4aXQucmVnaXN0ZXIoY2xlYW51cF9yZXNvdXJjZXMpCisjICAgICByZXR1cm4gdW5pdHRlc3QuVGVzdFN1aXRlKCgKKyMgICAgICAgICBkb2N0ZXN0LkRvY0ZpbGVTdWl0ZSgqZG9jdGVzdF9maWxlcywgKiprd2FyZ3MpKSkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JzNC90ZXN0cy90ZXN0X2h0bWw1bGliLnB5IGIvYml0YmFrZS9saWIvYnM0L3Rlc3RzL3Rlc3RfaHRtbDVsaWIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk0YzNlMQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JzNC90ZXN0cy90ZXN0X2h0bWw1bGliLnB5CkBAIC0wLDAgKzEsODUgQEAKKyIiIlRlc3RzIHRvIGVuc3VyZSB0aGF0IHRoZSBodG1sNWxpYiB0cmVlIGJ1aWxkZXIgZ2VuZXJhdGVzIGdvb2QgdHJlZXMuIiIiCisKK2ltcG9ydCB3YXJuaW5ncworCit0cnk6CisgICAgZnJvbSBiczQuYnVpbGRlciBpbXBvcnQgSFRNTDVUcmVlQnVpbGRlcgorICAgIEhUTUw1TElCX1BSRVNFTlQgPSBUcnVlCitleGNlcHQgSW1wb3J0RXJyb3IsIGU6CisgICAgSFRNTDVMSUJfUFJFU0VOVCA9IEZhbHNlCitmcm9tIGJzNC5lbGVtZW50IGltcG9ydCBTb3VwU3RyYWluZXIKK2Zyb20gYnM0LnRlc3RpbmcgaW1wb3J0ICgKKyAgICBIVE1MNVRyZWVCdWlsZGVyU21va2VUZXN0LAorICAgIFNvdXBUZXN0LAorICAgIHNraXBJZiwKKykKKworQHNraXBJZigKKyAgICBub3QgSFRNTDVMSUJfUFJFU0VOVCwKKyAgICAiaHRtbDVsaWIgc2VlbXMgbm90IHRvIGJlIHByZXNlbnQsIG5vdCB0ZXN0aW5nIGl0cyB0cmVlIGJ1aWxkZXIuIikKK2NsYXNzIEhUTUw1TGliQnVpbGRlclNtb2tlVGVzdChTb3VwVGVzdCwgSFRNTDVUcmVlQnVpbGRlclNtb2tlVGVzdCk6CisgICAgIiIiU2VlIGBgSFRNTDVUcmVlQnVpbGRlclNtb2tlVGVzdGBgLiIiIgorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGRlZmF1bHRfYnVpbGRlcihzZWxmKToKKyAgICAgICAgcmV0dXJuIEhUTUw1VHJlZUJ1aWxkZXIoKQorCisgICAgZGVmIHRlc3Rfc291cHN0cmFpbmVyKHNlbGYpOgorICAgICAgICAjIFRoZSBodG1sNWxpYiB0cmVlIGJ1aWxkZXIgZG9lcyBub3Qgc3VwcG9ydCBTb3VwU3RyYWluZXJzLgorICAgICAgICBzdHJhaW5lciA9IFNvdXBTdHJhaW5lcigiYiIpCisgICAgICAgIG1hcmt1cCA9ICI8cD5BIDxiPmJvbGQ8L2I+IHN0YXRlbWVudC48L3A+IgorICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlKSBhcyB3OgorICAgICAgICAgICAgc291cCA9IHNlbGYuc291cChtYXJrdXAsIHBhcnNlX29ubHk9c3RyYWluZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzb3VwLmRlY29kZSgpLCBzZWxmLmRvY3VtZW50X2ZvcihtYXJrdXApKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICJ0aGUgaHRtbDVsaWIgdHJlZSBidWlsZGVyIGRvZXNuJ3Qgc3VwcG9ydCBwYXJzZV9vbmx5IiBpbgorICAgICAgICAgICAgc3RyKHdbMF0ubWVzc2FnZSkpCisKKyAgICBkZWYgdGVzdF9jb3JyZWN0bHlfbmVzdGVkX3RhYmxlcyhzZWxmKToKKyAgICAgICAgIiIiaHRtbDVsaWIgaW5zZXJ0cyA8dGJvZHk+IHRhZ3Mgd2hlcmUgb3RoZXIgcGFyc2VycyBkb24ndC4iIiIKKyAgICAgICAgbWFya3VwID0gKCc8dGFibGUgaWQ9IjEiPicKKyAgICAgICAgICAgICAgICAgICc8dHI+JworICAgICAgICAgICAgICAgICAgIjx0ZD5IZXJlJ3MgYW5vdGhlciB0YWJsZToiCisgICAgICAgICAgICAgICAgICAnPHRhYmxlIGlkPSIyIj4nCisgICAgICAgICAgICAgICAgICAnPHRyPjx0ZD5mb288L3RkPjwvdHI+JworICAgICAgICAgICAgICAgICAgJzwvdGFibGU+PC90ZD4nKQorCisgICAgICAgIHNlbGYuYXNzZXJ0U291cEVxdWFscygKKyAgICAgICAgICAgIG1hcmt1cCwKKyAgICAgICAgICAgICc8dGFibGUgaWQ9IjEiPjx0Ym9keT48dHI+PHRkPkhlcmVcJ3MgYW5vdGhlciB0YWJsZTonCisgICAgICAgICAgICAnPHRhYmxlIGlkPSIyIj48dGJvZHk+PHRyPjx0ZD5mb288L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPicKKyAgICAgICAgICAgICc8L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPicpCisKKyAgICAgICAgc2VsZi5hc3NlcnRTb3VwRXF1YWxzKAorICAgICAgICAgICAgIjx0YWJsZT48dGhlYWQ+PHRyPjx0ZD5Gb288L3RkPjwvdHI+PC90aGVhZD4iCisgICAgICAgICAgICAiPHRib2R5Pjx0cj48dGQ+QmFyPC90ZD48L3RyPjwvdGJvZHk+IgorICAgICAgICAgICAgIjx0Zm9vdD48dHI+PHRkPkJhejwvdGQ+PC90cj48L3Rmb290PjwvdGFibGU+IikKKworICAgIGRlZiB0ZXN0X3htbF9kZWNsYXJhdGlvbl9mb2xsb3dlZF9ieV9kb2N0eXBlKHNlbGYpOgorICAgICAgICBtYXJrdXAgPSAnJyc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCFET0NUWVBFIGh0bWw+Cis8aHRtbD4KKyAgPGhlYWQ+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICA8cD5mb288L3A+CisgIDwvYm9keT4KKzwvaHRtbD4nJycKKyAgICAgICAgc291cCA9IHNlbGYuc291cChtYXJrdXApCisgICAgICAgICMgVmVyaWZ5IHRoYXQgd2UgY2FuIHJlYWNoIHRoZSA8cD4gdGFnOyB0aGlzIG1lYW5zIHRoZSB0cmVlIGlzIGNvbm5lY3RlZC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiIjxwPmZvbzwvcD4iLCBzb3VwLnAuZW5jb2RlKCkpCisKKyAgICBkZWYgdGVzdF9yZXBhcmVudGVkX21hcmt1cChzZWxmKToKKyAgICAgICAgbWFya3VwID0gJzxwPjxlbT5mb288L3A+XG48cD5iYXI8YT48L2E+PC9lbT48L3A+JworICAgICAgICBzb3VwID0gc2VsZi5zb3VwKG1hcmt1cCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1Ijxib2R5PjxwPjxlbT5mb288L2VtPjwvcD48ZW0+XG48L2VtPjxwPjxlbT5iYXI8YT48L2E+PC9lbT48L3A+PC9ib2R5PiIsIHNvdXAuYm9keS5kZWNvZGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBsZW4oc291cC5maW5kX2FsbCgncCcpKSkKKworCisgICAgZGVmIHRlc3RfcmVwYXJlbnRlZF9tYXJrdXBfZW5kc193aXRoX3doaXRlc3BhY2Uoc2VsZik6CisgICAgICAgIG1hcmt1cCA9ICc8cD48ZW0+Zm9vPC9wPlxuPHA+YmFyPGE+PC9hPjwvZW0+PC9wPlxuJworICAgICAgICBzb3VwID0gc2VsZi5zb3VwKG1hcmt1cCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1Ijxib2R5PjxwPjxlbT5mb288L2VtPjwvcD48ZW0+XG48L2VtPjxwPjxlbT5iYXI8YT48L2E+PC9lbT48L3A+XG48L2JvZHk+Iiwgc291cC5ib2R5LmRlY29kZSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDIsIGxlbihzb3VwLmZpbmRfYWxsKCdwJykpKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYnM0L3Rlc3RzL3Rlc3RfaHRtbHBhcnNlci5weSBiL2JpdGJha2UvbGliL2JzNC90ZXN0cy90ZXN0X2h0bWxwYXJzZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNiNWVkMgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JzNC90ZXN0cy90ZXN0X2h0bWxwYXJzZXIucHkKQEAgLTAsMCArMSwxOSBAQAorIiIiVGVzdHMgdG8gZW5zdXJlIHRoYXQgdGhlIGh0bWwucGFyc2VyIHRyZWUgYnVpbGRlciBnZW5lcmF0ZXMgZ29vZAordHJlZXMuIiIiCisKK2Zyb20gYnM0LnRlc3RpbmcgaW1wb3J0IFNvdXBUZXN0LCBIVE1MVHJlZUJ1aWxkZXJTbW9rZVRlc3QKK2Zyb20gYnM0LmJ1aWxkZXIgaW1wb3J0IEhUTUxQYXJzZXJUcmVlQnVpbGRlcgorCitjbGFzcyBIVE1MUGFyc2VyVHJlZUJ1aWxkZXJTbW9rZVRlc3QoU291cFRlc3QsIEhUTUxUcmVlQnVpbGRlclNtb2tlVGVzdCk6CisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgZGVmYXVsdF9idWlsZGVyKHNlbGYpOgorICAgICAgICByZXR1cm4gSFRNTFBhcnNlclRyZWVCdWlsZGVyKCkKKworICAgIGRlZiB0ZXN0X25hbWVzcGFjZWRfc3lzdGVtX2RvY3R5cGUoc2VsZik6CisgICAgICAgICMgaHRtbC5wYXJzZXIgY2FuJ3QgaGFuZGxlIG5hbWVzcGFjZWQgZG9jdHlwZXMsIHNvIHNraXAgdGhpcyBvbmUuCisgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X25hbWVzcGFjZWRfcHVibGljX2RvY3R5cGUoc2VsZik6CisgICAgICAgICMgaHRtbC5wYXJzZXIgY2FuJ3QgaGFuZGxlIG5hbWVzcGFjZWQgZG9jdHlwZXMsIHNvIHNraXAgdGhpcyBvbmUuCisgICAgICAgIHBhc3MKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JzNC90ZXN0cy90ZXN0X2x4bWwucHkgYi9iaXRiYWtlL2xpYi9iczQvdGVzdHMvdGVzdF9seG1sLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMmU5YjcKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iczQvdGVzdHMvdGVzdF9seG1sLnB5CkBAIC0wLDAgKzEsOTEgQEAKKyIiIlRlc3RzIHRvIGVuc3VyZSB0aGF0IHRoZSBseG1sIHRyZWUgYnVpbGRlciBnZW5lcmF0ZXMgZ29vZCB0cmVlcy4iIiIKKworaW1wb3J0IHJlCitpbXBvcnQgd2FybmluZ3MKKwordHJ5OgorICAgIGltcG9ydCBseG1sLmV0cmVlCisgICAgTFhNTF9QUkVTRU5UID0gVHJ1ZQorICAgIExYTUxfVkVSU0lPTiA9IGx4bWwuZXRyZWUuTFhNTF9WRVJTSU9OCitleGNlcHQgSW1wb3J0RXJyb3IsIGU6CisgICAgTFhNTF9QUkVTRU5UID0gRmFsc2UKKyAgICBMWE1MX1ZFUlNJT04gPSAoMCwpCisKK2lmIExYTUxfUFJFU0VOVDoKKyAgICBmcm9tIGJzNC5idWlsZGVyIGltcG9ydCBMWE1MVHJlZUJ1aWxkZXIsIExYTUxUcmVlQnVpbGRlckZvclhNTAorCitmcm9tIGJzNCBpbXBvcnQgKAorICAgIEJlYXV0aWZ1bFNvdXAsCisgICAgQmVhdXRpZnVsU3RvbmVTb3VwLAorICAgICkKK2Zyb20gYnM0LmVsZW1lbnQgaW1wb3J0IENvbW1lbnQsIERvY3R5cGUsIFNvdXBTdHJhaW5lcgorZnJvbSBiczQudGVzdGluZyBpbXBvcnQgc2tpcElmCitmcm9tIGJzNC50ZXN0cyBpbXBvcnQgdGVzdF9odG1scGFyc2VyCitmcm9tIGJzNC50ZXN0aW5nIGltcG9ydCAoCisgICAgSFRNTFRyZWVCdWlsZGVyU21va2VUZXN0LAorICAgIFhNTFRyZWVCdWlsZGVyU21va2VUZXN0LAorICAgIFNvdXBUZXN0LAorICAgIHNraXBJZiwKKykKKworQHNraXBJZigKKyAgICBub3QgTFhNTF9QUkVTRU5ULAorICAgICJseG1sIHNlZW1zIG5vdCB0byBiZSBwcmVzZW50LCBub3QgdGVzdGluZyBpdHMgdHJlZSBidWlsZGVyLiIpCitjbGFzcyBMWE1MVHJlZUJ1aWxkZXJTbW9rZVRlc3QoU291cFRlc3QsIEhUTUxUcmVlQnVpbGRlclNtb2tlVGVzdCk6CisgICAgIiIiU2VlIGBgSFRNTFRyZWVCdWlsZGVyU21va2VUZXN0YGAuIiIiCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgZGVmYXVsdF9idWlsZGVyKHNlbGYpOgorICAgICAgICByZXR1cm4gTFhNTFRyZWVCdWlsZGVyKCkKKworICAgIGRlZiB0ZXN0X291dF9vZl9yYW5nZV9lbnRpdHkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0U291cEVxdWFscygKKyAgICAgICAgICAgICI8cD5mb28mIzEwMDAwMDAwMDAwMDAwO2JhcjwvcD4iLCAiPHA+Zm9vYmFyPC9wPiIpCisgICAgICAgIHNlbGYuYXNzZXJ0U291cEVxdWFscygKKyAgICAgICAgICAgICI8cD5mb28mI3gxMDAwMDAwMDAwMDAwMDtiYXI8L3A+IiwgIjxwPmZvb2JhcjwvcD4iKQorICAgICAgICBzZWxmLmFzc2VydFNvdXBFcXVhbHMoCisgICAgICAgICAgICAiPHA+Zm9vJiMxMDAwMDAwMDAwO2JhcjwvcD4iLCAiPHA+Zm9vYmFyPC9wPiIpCisKKyAgICAjIEluIGx4bWwgPCAyLjMuNSwgYW4gZW1wdHkgZG9jdHlwZSBjYXVzZXMgYSBzZWdmYXVsdC4gU2tpcCB0aGlzCisgICAgIyB0ZXN0IGlmIGFuIG9sZCB2ZXJzaW9uIG9mIGx4bWwgaXMgaW5zdGFsbGVkLgorCisgICAgQHNraXBJZigKKyAgICAgICAgbm90IExYTUxfUFJFU0VOVCBvciBMWE1MX1ZFUlNJT04gPCAoMiwzLDUsMCksCisgICAgICAgICJTa2lwcGluZyBkb2N0eXBlIHRlc3QgZm9yIG9sZCB2ZXJzaW9uIG9mIGx4bWwgdG8gYXZvaWQgc2VnZmF1bHQuIikKKyAgICBkZWYgdGVzdF9lbXB0eV9kb2N0eXBlKHNlbGYpOgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCI8IURPQ1RZUEU+IikKKyAgICAgICAgZG9jdHlwZSA9IHNvdXAuY29udGVudHNbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiIiwgZG9jdHlwZS5zdHJpcCgpKQorCisgICAgZGVmIHRlc3RfYmVhdXRpZnVsc3RvbmVzb3VwX2lzX3htbF9wYXJzZXIoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIHRoYXQgdGhlIGRlcHJlY2F0ZWQgQlNTIGNsYXNzIHVzZXMgYW4geG1sIGJ1aWxkZXIKKyAgICAgICAgIyBpZiBvbmUgaXMgaW5zdGFsbGVkLgorICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlKSBhcyB3OgorICAgICAgICAgICAgc291cCA9IEJlYXV0aWZ1bFN0b25lU291cCgiPGIgLz4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiPGIvPiIsIHVuaWNvZGUoc291cC5iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJCZWF1dGlmdWxTdG9uZVNvdXAgY2xhc3MgaXMgZGVwcmVjYXRlZCIgaW4gc3RyKHdbMF0ubWVzc2FnZSkpCisKKyAgICBkZWYgdGVzdF9yZWFsX3hodG1sX2RvY3VtZW50KHNlbGYpOgorICAgICAgICAiIiJseG1sIHN0cmlwcyB0aGUgWE1MIGRlZmluaXRpb24gZnJvbSBhbiBYSFRNTCBkb2MsIHdoaWNoIGlzIGZpbmUuIiIiCisgICAgICAgIG1hcmt1cCA9IGIiIiI8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD48dGl0bGU+SGVsbG8uPC90aXRsZT48L2hlYWQ+Cis8Ym9keT5Hb29kYnllLjwvYm9keT4KKzwvaHRtbD4iIiIKKyAgICAgICAgc291cCA9IHNlbGYuc291cChtYXJrdXApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzb3VwLmVuY29kZSgidXRmLTgiKS5yZXBsYWNlKGIiXG4iLCBiJycpLAorICAgICAgICAgICAgbWFya3VwLnJlcGxhY2UoYidcbicsIGInJykucmVwbGFjZSgKKyAgICAgICAgICAgICAgICBiJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+JywgYicnKSkKKworCitAc2tpcElmKAorICAgIG5vdCBMWE1MX1BSRVNFTlQsCisgICAgImx4bWwgc2VlbXMgbm90IHRvIGJlIHByZXNlbnQsIG5vdCB0ZXN0aW5nIGl0cyBYTUwgdHJlZSBidWlsZGVyLiIpCitjbGFzcyBMWE1MWE1MVHJlZUJ1aWxkZXJTbW9rZVRlc3QoU291cFRlc3QsIFhNTFRyZWVCdWlsZGVyU21va2VUZXN0KToKKyAgICAiIiJTZWUgYGBIVE1MVHJlZUJ1aWxkZXJTbW9rZVRlc3RgYC4iIiIKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBkZWZhdWx0X2J1aWxkZXIoc2VsZik6CisgICAgICAgIHJldHVybiBMWE1MVHJlZUJ1aWxkZXJGb3JYTUwoKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYnM0L3Rlc3RzL3Rlc3Rfc291cC5weSBiL2JpdGJha2UvbGliL2JzNC90ZXN0cy90ZXN0X3NvdXAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdhYzI0NQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JzNC90ZXN0cy90ZXN0X3NvdXAucHkKQEAgLTAsMCArMSw0MzQgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisiIiJUZXN0cyBvZiBCZWF1dGlmdWwgU291cCBhcyBhIHdob2xlLiIiIgorCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3lzCitpbXBvcnQgdGVtcGZpbGUKKworZnJvbSBiczQgaW1wb3J0ICgKKyAgICBCZWF1dGlmdWxTb3VwLAorICAgIEJlYXV0aWZ1bFN0b25lU291cCwKKykKK2Zyb20gYnM0LmVsZW1lbnQgaW1wb3J0ICgKKyAgICBDaGFyc2V0TWV0YUF0dHJpYnV0ZVZhbHVlLAorICAgIENvbnRlbnRNZXRhQXR0cmlidXRlVmFsdWUsCisgICAgU291cFN0cmFpbmVyLAorICAgIE5hbWVzcGFjZWRBdHRyaWJ1dGUsCisgICAgKQoraW1wb3J0IGJzNC5kYW1taXQKK2Zyb20gYnM0LmRhbW1pdCBpbXBvcnQgKAorICAgIEVudGl0eVN1YnN0aXR1dGlvbiwKKyAgICBVbmljb2RlRGFtbWl0LAorKQorZnJvbSBiczQudGVzdGluZyBpbXBvcnQgKAorICAgIFNvdXBUZXN0LAorICAgIHNraXBJZiwKKykKK2ltcG9ydCB3YXJuaW5ncworCit0cnk6CisgICAgZnJvbSBiczQuYnVpbGRlciBpbXBvcnQgTFhNTFRyZWVCdWlsZGVyLCBMWE1MVHJlZUJ1aWxkZXJGb3JYTUwKKyAgICBMWE1MX1BSRVNFTlQgPSBUcnVlCitleGNlcHQgSW1wb3J0RXJyb3IsIGU6CisgICAgTFhNTF9QUkVTRU5UID0gRmFsc2UKKworUFlUSE9OXzJfUFJFXzJfNyA9IChzeXMudmVyc2lvbl9pbmZvIDwgKDIsNykpCitQWVRIT05fM19QUkVfM18yID0gKHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMyBhbmQgc3lzLnZlcnNpb25faW5mbyA8ICgzLDIpKQorCitjbGFzcyBUZXN0Q29uc3RydWN0b3IoU291cFRlc3QpOgorCisgICAgZGVmIHRlc3Rfc2hvcnRfdW5pY29kZV9pbnB1dChzZWxmKToKKyAgICAgICAgZGF0YSA9IHUiPGgxPsOpw6k8L2gxPiIKKyAgICAgICAgc291cCA9IHNlbGYuc291cChkYXRhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiw6nDqSIsIHNvdXAuaDEuc3RyaW5nKQorCisgICAgZGVmIHRlc3RfZW1iZWRkZWRfbnVsbChzZWxmKToKKyAgICAgICAgZGF0YSA9IHUiPGgxPmZvb1wwYmFyPC9oMT4iCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1ImZvb1wwYmFyIiwgc291cC5oMS5zdHJpbmcpCisKKworY2xhc3MgVGVzdERlcHJlY2F0ZWRDb25zdHJ1Y3RvckFyZ3VtZW50cyhTb3VwVGVzdCk6CisKKyAgICBkZWYgdGVzdF9wYXJzZU9ubHlUaGVzZV9yZW5hbWVkX3RvX3BhcnNlX29ubHkoc2VsZik6CisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MocmVjb3JkPVRydWUpIGFzIHc6CisgICAgICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCI8YT48Yj48L2I+PC9hPiIsIHBhcnNlT25seVRoZXNlPVNvdXBTdHJhaW5lcigiYiIpKQorICAgICAgICBtc2cgPSBzdHIod1swXS5tZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoInBhcnNlT25seVRoZXNlIiBpbiBtc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgicGFyc2Vfb25seSIgaW4gbXNnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiPGI+PC9iPiIsIHNvdXAuZW5jb2RlKCkpCisKKyAgICBkZWYgdGVzdF9mcm9tRW5jb2RpbmdfcmVuYW1lZF90b19mcm9tX2VuY29kaW5nKHNlbGYpOgorICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlKSBhcyB3OgorICAgICAgICAgICAgdXRmOCA9IGIiXHhjM1x4YTkiCisgICAgICAgICAgICBzb3VwID0gc2VsZi5zb3VwKHV0ZjgsIGZyb21FbmNvZGluZz0idXRmOCIpCisgICAgICAgIG1zZyA9IHN0cih3WzBdLm1lc3NhZ2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiZnJvbUVuY29kaW5nIiBpbiBtc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiZnJvbV9lbmNvZGluZyIgaW4gbXNnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJ1dGY4Iiwgc291cC5vcmlnaW5hbF9lbmNvZGluZykKKworICAgIGRlZiB0ZXN0X3VucmVjb2duaXplZF9rZXl3b3JkX2FyZ3VtZW50KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgIFR5cGVFcnJvciwgc2VsZi5zb3VwLCAiPGE+Iiwgbm9fc3VjaF9hcmd1bWVudD1UcnVlKQorCitjbGFzcyBUZXN0V2FybmluZ3MoU291cFRlc3QpOgorCisgICAgZGVmIHRlc3RfZGlza19maWxlX3dhcm5pbmcoc2VsZik6CisgICAgICAgIGZpbGVoYW5kbGUgPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoKQorICAgICAgICBmaWxlbmFtZSA9IGZpbGVoYW5kbGUubmFtZQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlKSBhcyB3OgorICAgICAgICAgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoZmlsZW5hbWUpCisgICAgICAgICAgICBtc2cgPSBzdHIod1swXS5tZXNzYWdlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJsb29rcyBsaWtlIGEgZmlsZW5hbWUiIGluIG1zZykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZpbGVoYW5kbGUuY2xvc2UoKQorCisgICAgICAgICMgVGhlIGZpbGUgbm8gbG9uZ2VyIGV4aXN0cywgc28gQmVhdXRpZnVsIFNvdXAgd2lsbCBubyBsb25nZXIgaXNzdWUgdGhlIHdhcm5pbmcuCisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MocmVjb3JkPVRydWUpIGFzIHc6CisgICAgICAgICAgICBzb3VwID0gc2VsZi5zb3VwKGZpbGVuYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGxlbih3KSkKKworICAgIGRlZiB0ZXN0X3VybF93YXJuaW5nKHNlbGYpOgorICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlKSBhcyB3OgorICAgICAgICAgICAgc291cCA9IHNlbGYuc291cCgiaHR0cDovL3d3dy5jcnVtbXkuY29tLyIpCisgICAgICAgIG1zZyA9IHN0cih3WzBdLm1lc3NhZ2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgibG9va3MgbGlrZSBhIFVSTCIgaW4gbXNnKQorCisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MocmVjb3JkPVRydWUpIGFzIHc6CisgICAgICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCJodHRwOi8vd3d3LmNydW1teS5jb20vIGlzIGdyZWF0IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBsZW4odykpCisKK2NsYXNzIFRlc3RTZWxlY3RpdmVQYXJzaW5nKFNvdXBUZXN0KToKKworICAgIGRlZiB0ZXN0X3BhcnNlX3dpdGhfc291cHN0cmFpbmVyKHNlbGYpOgorICAgICAgICBtYXJrdXAgPSAiTm88Yj5ZZXM8L2I+PGE+Tm88Yj5ZZXMgPGM+WWVzPC9jPjwvYj4iCisgICAgICAgIHN0cmFpbmVyID0gU291cFN0cmFpbmVyKCJiIikKKyAgICAgICAgc291cCA9IHNlbGYuc291cChtYXJrdXAsIHBhcnNlX29ubHk9c3RyYWluZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291cC5lbmNvZGUoKSwgYiI8Yj5ZZXM8L2I+PGI+WWVzIDxjPlllczwvYz48L2I+IikKKworCitjbGFzcyBUZXN0RW50aXR5U3Vic3RpdHV0aW9uKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJTdGFuZGFsb25lIHRlc3RzIG9mIHRoZSBFbnRpdHlTdWJzdGl0dXRpb24gY2xhc3MuIiIiCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnN1YiA9IEVudGl0eVN1YnN0aXR1dGlvbgorCisgICAgZGVmIHRlc3Rfc2ltcGxlX2h0bWxfc3Vic3RpdHV0aW9uKHNlbGYpOgorICAgICAgICAjIFVuaWNvZGUgY2hhcmFjdGVycyBjb3JyZXNwb25kaW5nIHRvIG5hbWVkIEhUTUwgZW50aXRlcworICAgICAgICAjIGFyZSBzdWJzdGl0dXRlZCwgYW5kIG5vIG90aGVycy4KKyAgICAgICAgcyA9IHUiZm9vXHUyMjAwXE57U05PV01BTn1cdTAwZjViYXIiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zdWIuc3Vic3RpdHV0ZV9odG1sKHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1ImZvbyZmb3JhbGw7XE57U05PV01BTn0mb3RpbGRlO2JhciIpCisKKyAgICBkZWYgdGVzdF9zbWFydF9xdW90ZV9zdWJzdGl0dXRpb24oc2VsZik6CisgICAgICAgICMgTVMgc21hcnQgcXVvdGVzIGFyZSBhIGNvbW1vbiBzb3VyY2Ugb2YgZnJ1c3RyYXRpb24sIHNvIHdlCisgICAgICAgICMgZ2l2ZSB0aGVtIGEgc3BlY2lhbCB0ZXN0LgorICAgICAgICBxdW90ZXMgPSBiIlx4OTFceDkyZm9vXHg5M1x4OTQiCisgICAgICAgIGRhbW1pdCA9IFVuaWNvZGVEYW1taXQocXVvdGVzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3ViLnN1YnN0aXR1dGVfaHRtbChkYW1taXQubWFya3VwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiZsc3F1bzsmcnNxdW87Zm9vJmxkcXVvOyZyZHF1bzsiKQorCisgICAgZGVmIHRlc3RfeG1sX2NvbnZlcnN0aW9uX2luY2x1ZGVzX25vX3F1b3Rlc19pZl9tYWtlX3F1b3RlZF9hdHRyaWJ1dGVfaXNfZmFsc2Uoc2VsZik6CisgICAgICAgIHMgPSAnV2VsY29tZSB0byAibXkgYmFyIicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnN1Yi5zdWJzdGl0dXRlX3htbChzLCBGYWxzZSksIHMpCisKKyAgICBkZWYgdGVzdF94bWxfYXR0cmlidXRlX3F1b3Rpbmdfbm9ybWFsbHlfdXNlc19kb3VibGVfcXVvdGVzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3ViLnN1YnN0aXR1dGVfeG1sKCJXZWxjb21lIiwgVHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICciV2VsY29tZSInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3ViLnN1YnN0aXR1dGVfeG1sKCJCb2IncyBCYXIiLCBUcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJyJCb2JcJ3MgQmFyIicpCisKKyAgICBkZWYgdGVzdF94bWxfYXR0cmlidXRlX3F1b3RpbmdfdXNlc19zaW5nbGVfcXVvdGVzX3doZW5fdmFsdWVfY29udGFpbnNfZG91YmxlX3F1b3RlcyhzZWxmKToKKyAgICAgICAgcyA9ICdXZWxjb21lIHRvICJteSBiYXIiJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3ViLnN1YnN0aXR1dGVfeG1sKHMsIFRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiJ1dlbGNvbWUgdG8gXCJteSBiYXJcIiciKQorCisgICAgZGVmIHRlc3RfeG1sX2F0dHJpYnV0ZV9xdW90aW5nX2VzY2FwZXNfc2luZ2xlX3F1b3Rlc193aGVuX3ZhbHVlX2NvbnRhaW5zX2JvdGhfc2luZ2xlX2FuZF9kb3VibGVfcXVvdGVzKHNlbGYpOgorICAgICAgICBzID0gJ1dlbGNvbWUgdG8gIkJvYlwncyBCYXIiJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc2VsZi5zdWIuc3Vic3RpdHV0ZV94bWwocywgVHJ1ZSksCisgICAgICAgICAgICAnIldlbGNvbWUgdG8gJnF1b3Q7Qm9iXCdzIEJhciZxdW90OyInKQorCisgICAgZGVmIHRlc3RfeG1sX3F1b3Rlc19hcmVudF9lc2NhcGVkX3doZW5fdmFsdWVfaXNfbm90X2JlaW5nX3F1b3RlZChzZWxmKToKKyAgICAgICAgcXVvdGVkID0gJ1dlbGNvbWUgdG8gIkJvYlwncyBCYXIiJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3ViLnN1YnN0aXR1dGVfeG1sKHF1b3RlZCksIHF1b3RlZCkKKworICAgIGRlZiB0ZXN0X3htbF9xdW90aW5nX2hhbmRsZXNfYW5nbGVfYnJhY2tldHMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzZWxmLnN1Yi5zdWJzdGl0dXRlX3htbCgiZm9vPGJhcj4iKSwKKyAgICAgICAgICAgICJmb28mbHQ7YmFyJmd0OyIpCisKKyAgICBkZWYgdGVzdF94bWxfcXVvdGluZ19oYW5kbGVzX2FtcGVyc2FuZHMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zdWIuc3Vic3RpdHV0ZV94bWwoIkFUJlQiKSwgIkFUJmFtcDtUIikKKworICAgIGRlZiB0ZXN0X3htbF9xdW90aW5nX2luY2x1ZGluZ19hbXBlcnNhbmRzX3doZW5fdGhleV9hcmVfcGFydF9vZl9hbl9lbnRpdHkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzZWxmLnN1Yi5zdWJzdGl0dXRlX3htbCgiJkFhY3V0ZTtUJlQiKSwKKyAgICAgICAgICAgICImYW1wO0FhY3V0ZTtUJmFtcDtUIikKKworICAgIGRlZiB0ZXN0X3htbF9xdW90aW5nX2lnbm9yaW5nX2FtcGVyc2FuZHNfd2hlbl90aGV5X2FyZV9wYXJ0X29mX2FuX2VudGl0eShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNlbGYuc3ViLnN1YnN0aXR1dGVfeG1sX2NvbnRhaW5pbmdfZW50aXRpZXMoIiZBYWN1dGU7VCZUIiksCisgICAgICAgICAgICAiJkFhY3V0ZTtUJmFtcDtUIikKKworICAgIGRlZiB0ZXN0X3F1b3Rlc19ub3RfaHRtbF9zdWJzdGl0dXRlZChzZWxmKToKKyAgICAgICAgIiIiVGhlcmUncyBubyBuZWVkIHRvIGRvIHRoaXMgZXhjZXB0IGluc2lkZSBhdHRyaWJ1dGUgdmFsdWVzLiIiIgorICAgICAgICB0ZXh0ID0gJ0JvYlwncyAiYmFyIicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnN1Yi5zdWJzdGl0dXRlX2h0bWwodGV4dCksIHRleHQpCisKKworY2xhc3MgVGVzdEVuY29kaW5nQ29udmVyc2lvbihTb3VwVGVzdCk6CisgICAgIyBUZXN0IEJlYXV0aWZ1bCBTb3VwJ3MgYWJpbGl0eSB0byBkZWNvZGUgYW5kIGVuY29kZSBmcm9tIHZhcmlvdXMKKyAgICAjIGVuY29kaW5ncy4KKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwZXIoVGVzdEVuY29kaW5nQ29udmVyc2lvbiwgc2VsZikuc2V0VXAoKQorICAgICAgICBzZWxmLnVuaWNvZGVfZGF0YSA9IHUnPGh0bWw+PGhlYWQ+PG1ldGEgY2hhcnNldD0idXRmLTgiLz48L2hlYWQ+PGJvZHk+PGZvbz5TYWNyXE57TEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURX0gYmxldSE8L2Zvbz48L2JvZHk+PC9odG1sPicKKyAgICAgICAgc2VsZi51dGY4X2RhdGEgPSBzZWxmLnVuaWNvZGVfZGF0YS5lbmNvZGUoInV0Zi04IikKKyAgICAgICAgIyBKdXN0IHNvIHlvdSBrbm93IHdoYXQgaXQgbG9va3MgbGlrZS4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNlbGYudXRmOF9kYXRhLAorICAgICAgICAgICAgYic8aHRtbD48aGVhZD48bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPjwvaGVhZD48Ym9keT48Zm9vPlNhY3JceGMzXHhhOSBibGV1ITwvZm9vPjwvYm9keT48L2h0bWw+JykKKworICAgIGRlZiB0ZXN0X2FzY2lpX2luX3VuaWNvZGVfb3V0KHNlbGYpOgorICAgICAgICAjIEFTQ0lJIGlucHV0IGlzIGNvbnZlcnRlZCB0byBVbmljb2RlLiBUaGUgb3JpZ2luYWxfZW5jb2RpbmcKKyAgICAgICAgIyBhdHRyaWJ1dGUgaXMgc2V0IHRvICd1dGYtOCcsIGEgc3VwZXJzZXQgb2YgQVNDSUkuCisgICAgICAgIGNoYXJkZXQgPSBiczQuZGFtbWl0LmNoYXJkZXRfZGFtbWl0CisgICAgICAgIGxvZ2dpbmcuZGlzYWJsZShsb2dnaW5nLldBUk5JTkcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRlZiBub29wKHN0cik6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgICMgRGlzYWJsZSBjaGFyZGV0LCB3aGljaCB3aWxsIHJlYWxpemUgdGhhdCB0aGUgQVNDSUkgaXMgQVNDSUkuCisgICAgICAgICAgICBiczQuZGFtbWl0LmNoYXJkZXRfZGFtbWl0ID0gbm9vcAorICAgICAgICAgICAgYXNjaWkgPSBiIjxmb28+YTwvZm9vPiIKKyAgICAgICAgICAgIHNvdXBfZnJvbV9hc2NpaSA9IHNlbGYuc291cChhc2NpaSkKKyAgICAgICAgICAgIHVuaWNvZGVfb3V0cHV0ID0gc291cF9mcm9tX2FzY2lpLmRlY29kZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh1bmljb2RlX291dHB1dCwgdW5pY29kZSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGVfb3V0cHV0LCBzZWxmLmRvY3VtZW50X2Zvcihhc2NpaS5kZWNvZGUoKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXBfZnJvbV9hc2NpaS5vcmlnaW5hbF9lbmNvZGluZy5sb3dlcigpLCAidXRmLTgiKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgbG9nZ2luZy5kaXNhYmxlKGxvZ2dpbmcuTk9UU0VUKQorICAgICAgICAgICAgYnM0LmRhbW1pdC5jaGFyZGV0X2RhbW1pdCA9IGNoYXJkZXQKKworICAgIGRlZiB0ZXN0X3VuaWNvZGVfaW5fdW5pY29kZV9vdXQoc2VsZik6CisgICAgICAgICMgVW5pY29kZSBpbnB1dCBpcyBsZWZ0IGFsb25lLiBUaGUgb3JpZ2luYWxfZW5jb2RpbmcgYXR0cmlidXRlCisgICAgICAgICMgaXMgbm90IHNldC4KKyAgICAgICAgc291cF9mcm9tX3VuaWNvZGUgPSBzZWxmLnNvdXAoc2VsZi51bmljb2RlX2RhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291cF9mcm9tX3VuaWNvZGUuZGVjb2RlKCksIHNlbGYudW5pY29kZV9kYXRhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXBfZnJvbV91bmljb2RlLmZvby5zdHJpbmcsIHUnU2Fjclx4ZTkgYmxldSEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXBfZnJvbV91bmljb2RlLm9yaWdpbmFsX2VuY29kaW5nLCBOb25lKQorCisgICAgZGVmIHRlc3RfdXRmOF9pbl91bmljb2RlX291dChzZWxmKToKKyAgICAgICAgIyBVVEYtOCBpbnB1dCBpcyBjb252ZXJ0ZWQgdG8gVW5pY29kZS4gVGhlIG9yaWdpbmFsX2VuY29kaW5nCisgICAgICAgICMgYXR0cmlidXRlIGlzIHNldC4KKyAgICAgICAgc291cF9mcm9tX3V0ZjggPSBzZWxmLnNvdXAoc2VsZi51dGY4X2RhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291cF9mcm9tX3V0ZjguZGVjb2RlKCksIHNlbGYudW5pY29kZV9kYXRhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXBfZnJvbV91dGY4LmZvby5zdHJpbmcsIHUnU2Fjclx4ZTkgYmxldSEnKQorCisgICAgZGVmIHRlc3RfdXRmOF9vdXQoc2VsZik6CisgICAgICAgICMgVGhlIGludGVybmFsIGRhdGEgc3RydWN0dXJlcyBjYW4gYmUgZW5jb2RlZCBhcyBVVEYtOC4KKyAgICAgICAgc291cF9mcm9tX3VuaWNvZGUgPSBzZWxmLnNvdXAoc2VsZi51bmljb2RlX2RhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291cF9mcm9tX3VuaWNvZGUuZW5jb2RlKCd1dGYtOCcpLCBzZWxmLnV0ZjhfZGF0YSkKKworICAgIEBza2lwSWYoCisgICAgICAgIFBZVEhPTl8yX1BSRV8yXzcgb3IgUFlUSE9OXzNfUFJFXzNfMiwKKyAgICAgICAgIkJhZCBIVE1MUGFyc2VyIGRldGVjdGVkOyBza2lwcGluZyB0ZXN0IG9mIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIGluIGF0dHJpYnV0ZSBuYW1lLiIpCisgICAgZGVmIHRlc3RfYXR0cmlidXRlX25hbWVfY29udGFpbmluZ191bmljb2RlX2NoYXJhY3RlcnMoc2VsZik6CisgICAgICAgIG1hcmt1cCA9IHUnPGRpdj48YSBcTntTTk9XTUFOfT0ic25vd21hbiI+PC9hPjwvZGl2PicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNvdXAobWFya3VwKS5kaXYuZW5jb2RlKCJ1dGY4IiksIG1hcmt1cC5lbmNvZGUoInV0ZjgiKSkKKworY2xhc3MgVGVzdFVuaWNvZGVEYW1taXQodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlN0YW5kYWxvbmUgdGVzdHMgb2YgVW5pY29kZURhbW1pdC4iIiIKKworICAgIGRlZiB0ZXN0X3VuaWNvZGVfaW5wdXQoc2VsZik6CisgICAgICAgIG1hcmt1cCA9IHUiSSdtIGFscmVhZHkgVW5pY29kZSEgXE57U05PV01BTn0iCisgICAgICAgIGRhbW1pdCA9IFVuaWNvZGVEYW1taXQobWFya3VwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhbW1pdC51bmljb2RlX21hcmt1cCwgbWFya3VwKQorCisgICAgZGVmIHRlc3Rfc21hcnRfcXVvdGVzX3RvX3VuaWNvZGUoc2VsZik6CisgICAgICAgIG1hcmt1cCA9IGIiPGZvbz5ceDkxXHg5Mlx4OTNceDk0PC9mb28+IgorICAgICAgICBkYW1taXQgPSBVbmljb2RlRGFtbWl0KG1hcmt1cCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGRhbW1pdC51bmljb2RlX21hcmt1cCwgdSI8Zm9vPlx1MjAxOFx1MjAxOVx1MjAxY1x1MjAxZDwvZm9vPiIpCisKKyAgICBkZWYgdGVzdF9zbWFydF9xdW90ZXNfdG9feG1sX2VudGl0aWVzKHNlbGYpOgorICAgICAgICBtYXJrdXAgPSBiIjxmb28+XHg5MVx4OTJceDkzXHg5NDwvZm9vPiIKKyAgICAgICAgZGFtbWl0ID0gVW5pY29kZURhbW1pdChtYXJrdXAsIHNtYXJ0X3F1b3Rlc190bz0ieG1sIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGRhbW1pdC51bmljb2RlX21hcmt1cCwgIjxmb28+JiN4MjAxODsmI3gyMDE5OyYjeDIwMUM7JiN4MjAxRDs8L2Zvbz4iKQorCisgICAgZGVmIHRlc3Rfc21hcnRfcXVvdGVzX3RvX2h0bWxfZW50aXRpZXMoc2VsZik6CisgICAgICAgIG1hcmt1cCA9IGIiPGZvbz5ceDkxXHg5Mlx4OTNceDk0PC9mb28+IgorICAgICAgICBkYW1taXQgPSBVbmljb2RlRGFtbWl0KG1hcmt1cCwgc21hcnRfcXVvdGVzX3RvPSJodG1sIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGRhbW1pdC51bmljb2RlX21hcmt1cCwgIjxmb28+JmxzcXVvOyZyc3F1bzsmbGRxdW87JnJkcXVvOzwvZm9vPiIpCisKKyAgICBkZWYgdGVzdF9zbWFydF9xdW90ZXNfdG9fYXNjaWkoc2VsZik6CisgICAgICAgIG1hcmt1cCA9IGIiPGZvbz5ceDkxXHg5Mlx4OTNceDk0PC9mb28+IgorICAgICAgICBkYW1taXQgPSBVbmljb2RlRGFtbWl0KG1hcmt1cCwgc21hcnRfcXVvdGVzX3RvPSJhc2NpaSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBkYW1taXQudW5pY29kZV9tYXJrdXAsICIiIjxmb28+JyciIjwvZm9vPiIiIikKKworICAgIGRlZiB0ZXN0X2RldGVjdF91dGY4KHNlbGYpOgorICAgICAgICB1dGY4ID0gYiJceGMzXHhhOSIKKyAgICAgICAgZGFtbWl0ID0gVW5pY29kZURhbW1pdCh1dGY4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhbW1pdC51bmljb2RlX21hcmt1cCwgdSdceGU5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYW1taXQub3JpZ2luYWxfZW5jb2RpbmcubG93ZXIoKSwgJ3V0Zi04JykKKworICAgIGRlZiB0ZXN0X2NvbnZlcnRfaGVicmV3KHNlbGYpOgorICAgICAgICBoZWJyZXcgPSBiIlx4ZWRceGU1XHhlY1x4ZjkiCisgICAgICAgIGRhbW1pdCA9IFVuaWNvZGVEYW1taXQoaGVicmV3LCBbImlzby04ODU5LTgiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYW1taXQub3JpZ2luYWxfZW5jb2RpbmcubG93ZXIoKSwgJ2lzby04ODU5LTgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhbW1pdC51bmljb2RlX21hcmt1cCwgdSdcdTA1ZGRcdTA1ZDVcdTA1ZGNcdTA1ZTknKQorCisgICAgZGVmIHRlc3RfZG9udF9zZWVfc21hcnRfcXVvdGVzX3doZXJlX3RoZXJlX2FyZV9ub25lKHNlbGYpOgorICAgICAgICB1dGZfOCA9IGIiXDM0M1wyMDJcMjYxXDM0M1wyMDNcMjc0XDM0M1wyMDJcMjc3XDM0M1wyMDJcMjQ0IFdhdGNoIgorICAgICAgICBkYW1taXQgPSBVbmljb2RlRGFtbWl0KHV0Zl84KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhbW1pdC5vcmlnaW5hbF9lbmNvZGluZy5sb3dlcigpLCAndXRmLTgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhbW1pdC51bmljb2RlX21hcmt1cC5lbmNvZGUoInV0Zi04IiksIHV0Zl84KQorCisgICAgZGVmIHRlc3RfaWdub3JlX2luYXBwcm9wcmlhdGVfY29kZWNzKHNlbGYpOgorICAgICAgICB1dGY4X2RhdGEgPSB1IlLDpGtzbcO2cmfDpXMiLmVuY29kZSgidXRmLTgiKQorICAgICAgICBkYW1taXQgPSBVbmljb2RlRGFtbWl0KHV0ZjhfZGF0YSwgWyJpc28tODg1OS04Il0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGFtbWl0Lm9yaWdpbmFsX2VuY29kaW5nLmxvd2VyKCksICd1dGYtOCcpCisKKyAgICBkZWYgdGVzdF9pZ25vcmVfaW52YWxpZF9jb2RlY3Moc2VsZik6CisgICAgICAgIHV0ZjhfZGF0YSA9IHUiUsOka3Ntw7ZyZ8OlcyIuZW5jb2RlKCJ1dGYtOCIpCisgICAgICAgIGZvciBiYWRfZW5jb2RpbmcgaW4gWycudXRmOCcsICcuLi4nLCAndXRGLS0tMTYuISddOgorICAgICAgICAgICAgZGFtbWl0ID0gVW5pY29kZURhbW1pdCh1dGY4X2RhdGEsIFtiYWRfZW5jb2RpbmddKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYW1taXQub3JpZ2luYWxfZW5jb2RpbmcubG93ZXIoKSwgJ3V0Zi04JykKKworICAgIGRlZiB0ZXN0X2RldGVjdF9odG1sNV9zdHlsZV9tZXRhX3RhZyhzZWxmKToKKworICAgICAgICBmb3IgZGF0YSBpbiAoCisgICAgICAgICAgICBiJzxodG1sPjxtZXRhIGNoYXJzZXQ9ImV1Yy1qcCIgLz48L2h0bWw+JywKKyAgICAgICAgICAgIGIiPGh0bWw+PG1ldGEgY2hhcnNldD0nZXVjLWpwJyAvPjwvaHRtbD4iLAorICAgICAgICAgICAgYiI8aHRtbD48bWV0YSBjaGFyc2V0PWV1Yy1qcCAvPjwvaHRtbD4iLAorICAgICAgICAgICAgYiI8aHRtbD48bWV0YSBjaGFyc2V0PWV1Yy1qcC8+PC9odG1sPiIpOgorICAgICAgICAgICAgZGFtbWl0ID0gVW5pY29kZURhbW1pdChkYXRhLCBpc19odG1sPVRydWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgICAgICJldWMtanAiLCBkYW1taXQub3JpZ2luYWxfZW5jb2RpbmcpCisKKyAgICBkZWYgdGVzdF9sYXN0X2RpdGNoX2VudGl0eV9yZXBsYWNlbWVudChzZWxmKToKKyAgICAgICAgIyBUaGlzIGlzIGEgVVRGLTggZG9jdW1lbnQgdGhhdCBjb250YWlucyBieXRlc3RyaW5ncworICAgICAgICAjIGNvbXBsZXRlbHkgaW5jb21wYXRpYmxlIHdpdGggVVRGLTggKGllLiBlbmNvZGVkIHdpdGggc29tZSBvdGhlcgorICAgICAgICAjIGVuY29kaW5nKS4KKyAgICAgICAgIworICAgICAgICAjIFNpbmNlIHRoZXJlIGlzIG5vIGNvbnNpc3RlbnQgZW5jb2RpbmcgZm9yIHRoZSBkb2N1bWVudCwKKyAgICAgICAgIyBVbmljb2RlLCBEYW1taXQgd2lsbCBldmVudHVhbGx5IGVuY29kZSB0aGUgZG9jdW1lbnQgYXMgVVRGLTgKKyAgICAgICAgIyBhbmQgZW5jb2RlIHRoZSBpbmNvbXBhdGlibGUgY2hhcmFjdGVycyBhcyBSRVBMQUNFTUVOVAorICAgICAgICAjIENIQVJBQ1RFUi4KKyAgICAgICAgIworICAgICAgICAjIElmIGNoYXJkZXQgaXMgaW5zdGFsbGVkLCBpdCB3aWxsIGRldGVjdCB0aGF0IHRoZSBkb2N1bWVudAorICAgICAgICAjIGNhbiBiZSBjb252ZXJ0ZWQgaW50byBJU08tODg1OS0xIHdpdGhvdXQgZXJyb3JzLiBUaGlzIGhhcHBlbnMKKyAgICAgICAgIyB0byBiZSB0aGUgd3JvbmcgZW5jb2RpbmcsIGJ1dCBpdCBpcyBhIGNvbnNpc3RlbnQgZW5jb2RpbmcsIHNvIHRoZQorICAgICAgICAjIGNvZGUgd2UncmUgdGVzdGluZyBoZXJlIHdvbid0IHJ1bi4KKyAgICAgICAgIworICAgICAgICAjIFNvIHdlIHRlbXBvcmFyaWx5IGRpc2FibGUgY2hhcmRldCBpZiBpdCdzIHByZXNlbnQuCisgICAgICAgIGRvYyA9IGIiIiJcMzU3XDI3M1wyNzc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGh0bWw+PGI+XDMzMFwyNTBcMzMwXDI1MlwzMzBcMjYxPC9iPgorPGk+XDMxMFwzMjJcMzIxXDIyMFwzMTJcMzIxXDM1NVwzNDQ8L2k+PC9odG1sPiIiIgorICAgICAgICBjaGFyZGV0ID0gYnM0LmRhbW1pdC5jaGFyZGV0X2RhbW1pdAorICAgICAgICBsb2dnaW5nLmRpc2FibGUobG9nZ2luZy5XQVJOSU5HKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkZWYgbm9vcChzdHIpOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICBiczQuZGFtbWl0LmNoYXJkZXRfZGFtbWl0ID0gbm9vcAorICAgICAgICAgICAgZGFtbWl0ID0gVW5pY29kZURhbW1pdChkb2MpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIGRhbW1pdC5jb250YWluc19yZXBsYWNlbWVudF9jaGFyYWN0ZXJzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUiXHVmZmZkIiBpbiBkYW1taXQudW5pY29kZV9tYXJrdXApCisKKyAgICAgICAgICAgIHNvdXAgPSBCZWF1dGlmdWxTb3VwKGRvYywgImh0bWwucGFyc2VyIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb3VwLmNvbnRhaW5zX3JlcGxhY2VtZW50X2NoYXJhY3RlcnMpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBsb2dnaW5nLmRpc2FibGUobG9nZ2luZy5OT1RTRVQpCisgICAgICAgICAgICBiczQuZGFtbWl0LmNoYXJkZXRfZGFtbWl0ID0gY2hhcmRldAorCisgICAgZGVmIHRlc3RfYnl0ZV9vcmRlcl9tYXJrX3JlbW92ZWQoc2VsZik6CisgICAgICAgICMgQSBkb2N1bWVudCB3cml0dGVuIGluIFVURi0xNkxFIHdpbGwgaGF2ZSBpdHMgYnl0ZSBvcmRlciBtYXJrZXIgc3RyaXBwZWQuCisgICAgICAgIGRhdGEgPSBiJ1x4ZmZceGZlPFx4MDBhXHgwMD5ceDAwXHhlMVx4MDBceGU5XHgwMDxceDAwL1x4MDBhXHgwMD5ceDAwJworICAgICAgICBkYW1taXQgPSBVbmljb2RlRGFtbWl0KGRhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSI8YT7DocOpPC9hPiIsIGRhbW1pdC51bmljb2RlX21hcmt1cCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgidXRmLTE2bGUiLCBkYW1taXQub3JpZ2luYWxfZW5jb2RpbmcpCisKKyAgICBkZWYgdGVzdF9kZXR3aW5nbGUoc2VsZik6CisgICAgICAgICMgSGVyZSdzIGEgVVRGOCBkb2N1bWVudC4KKyAgICAgICAgdXRmOCA9ICh1IlxOe1NOT1dNQU59IiAqIDMpLmVuY29kZSgidXRmOCIpCisKKyAgICAgICAgIyBIZXJlJ3MgYSBXaW5kb3dzLTEyNTIgZG9jdW1lbnQuCisgICAgICAgIHdpbmRvd3NfMTI1MiA9ICgKKyAgICAgICAgICAgIHUiXE57TEVGVCBET1VCTEUgUVVPVEFUSU9OIE1BUkt9SGksIEkgbGlrZSBXaW5kb3dzISIKKyAgICAgICAgICAgIHUiXE57UklHSFQgRE9VQkxFIFFVT1RBVElPTiBNQVJLfSIpLmVuY29kZSgid2luZG93c18xMjUyIikKKworICAgICAgICAjIFRocm91Z2ggc29tZSB1bmhvbHkgYWxjaGVteSwgdGhleSd2ZSBiZWVuIHN0dWNrIHRvZ2V0aGVyLgorICAgICAgICBkb2MgPSB1dGY4ICsgd2luZG93c18xMjUyICsgdXRmOAorCisgICAgICAgICMgVGhlIGRvY3VtZW50IGNhbid0IGJlIHR1cm5lZCBpbnRvIFVURi04OgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsIGRvYy5kZWNvZGUsICJ1dGY4IikKKworICAgICAgICAjIFVuaWNvZGUsIERhbW1pdCB0aGlua3MgdGhlIHdob2xlIGRvY3VtZW50IGlzIFdpbmRvd3MtMTI1MiwKKyAgICAgICAgIyBhbmQgZGVjb2RlcyBpdCBpbnRvICLDosucxpLDosucxpLDosucxpLigJxIaSwgSSBsaWtlIFdpbmRvd3Mh4oCdw6LLnMaSw6LLnMaSw6LLnMaSIgorCisgICAgICAgICMgQnV0IGlmIHdlIHJ1biBpdCB0aHJvdWdoIGZpeF9lbWJlZGRlZF93aW5kb3dzXzEyNTIsIGl0J3MgZml4ZWQ6CisKKyAgICAgICAgZml4ZWQgPSBVbmljb2RlRGFtbWl0LmRldHdpbmdsZShkb2MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICB1IuKYg+KYg+KYg+KAnEhpLCBJIGxpa2UgV2luZG93cyHigJ3imIPimIPimIMiLCBmaXhlZC5kZWNvZGUoInV0ZjgiKSkKKworICAgIGRlZiB0ZXN0X2RldHdpbmdsZV9pZ25vcmVzX211bHRpYnl0ZV9jaGFyYWN0ZXJzKHNlbGYpOgorICAgICAgICAjIEVhY2ggb2YgdGhlc2UgY2hhcmFjdGVycyBoYXMgYSBVVEYtOCByZXByZXNlbnRhdGlvbiBlbmRpbmcKKyAgICAgICAgIyBpbiBceDkzLiBceDkzIGlzIGEgc21hcnQgcXVvdGUgaWYgaW50ZXJwcmV0ZWQgYXMKKyAgICAgICAgIyBXaW5kb3dzLTEyNTIuIEJ1dCBvdXIgY29kZSBrbm93cyB0byBza2lwIG92ZXIgbXVsdGlieXRlCisgICAgICAgICMgVVRGLTggY2hhcmFjdGVycywgc28gdGhleSdsbCBzdXJ2aXZlIHRoZSBwcm9jZXNzIHVuc2NhdGhlZC4KKyAgICAgICAgZm9yIHRyaWNreV91bmljb2RlX2NoYXIgaW4gKAorICAgICAgICAgICAgdSJcTntMQVRJTiBTTUFMTCBMSUdBVFVSRSBPRX0iLCAjIDItYnl0ZSBjaGFyICdceGM1XHg5MycKKyAgICAgICAgICAgIHUiXE57TEFUSU4gU1VCU0NSSVBUIFNNQUxMIExFVFRFUiBYfSIsICMgMy1ieXRlIGNoYXIgJ1x4ZTJceDgyXHg5MycKKyAgICAgICAgICAgIHUiXHhmMFx4OTBceDkwXHg5MyIsICMgVGhpcyBpcyBhIENKSyBjaGFyYWN0ZXIsIG5vdCBzdXJlIHdoaWNoIG9uZS4KKyAgICAgICAgICAgICk6CisgICAgICAgICAgICBpbnB1dCA9IHRyaWNreV91bmljb2RlX2NoYXIuZW5jb2RlKCJ1dGY4IikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbnB1dC5lbmRzd2l0aChiJ1x4OTMnKSkKKyAgICAgICAgICAgIG91dHB1dCA9IFVuaWNvZGVEYW1taXQuZGV0d2luZ2xlKGlucHV0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXRwdXQsIGlucHV0KQorCitjbGFzcyBUZXN0TmFtZWRzcGFjZWRBdHRyaWJ1dGUoU291cFRlc3QpOgorCisgICAgZGVmIHRlc3RfbmFtZV9tYXlfYmVfbm9uZShzZWxmKToKKyAgICAgICAgYSA9IE5hbWVzcGFjZWRBdHRyaWJ1dGUoInhtbG5zIiwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCAieG1sbnMiKQorCisgICAgZGVmIHRlc3RfYXR0cmlidXRlX2lzX2VxdWl2YWxlbnRfdG9fY29sb25fc2VwYXJhdGVkX3N0cmluZyhzZWxmKToKKyAgICAgICAgYSA9IE5hbWVzcGFjZWRBdHRyaWJ1dGUoImEiLCAiYiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImE6YiIsIGEpCisKKyAgICBkZWYgdGVzdF9hdHRyaWJ1dGVzX2FyZV9lcXVpdmFsZW50X2lmX3ByZWZpeF9hbmRfbmFtZV9pZGVudGljYWwoc2VsZik6CisgICAgICAgIGEgPSBOYW1lc3BhY2VkQXR0cmlidXRlKCJhIiwgImIiLCAiYyIpCisgICAgICAgIGIgPSBOYW1lc3BhY2VkQXR0cmlidXRlKCJhIiwgImIiLCAiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYikKKworICAgICAgICAjIFRoZSBhY3R1YWwgbmFtZXNwYWNlIGlzIG5vdCBjb25zaWRlcmVkLgorICAgICAgICBjID0gTmFtZXNwYWNlZEF0dHJpYnV0ZSgiYSIsICJiIiwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBjKQorCisgICAgICAgICMgQnV0IG5hbWUgYW5kIHByZWZpeCBhcmUgaW1wb3J0YW50LgorICAgICAgICBkID0gTmFtZXNwYWNlZEF0dHJpYnV0ZSgiYSIsICJ6IiwgImMiKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGEsIGQpCisKKyAgICAgICAgZSA9IE5hbWVzcGFjZWRBdHRyaWJ1dGUoInoiLCAiYiIsICJjIikKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChhLCBlKQorCisKK2NsYXNzIFRlc3RBdHRyaWJ1dGVWYWx1ZVdpdGhDaGFyc2V0U3Vic3RpdHV0aW9uKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2NvbnRlbnRfbWV0YV9hdHRyaWJ1dGVfdmFsdWUoc2VsZik6CisgICAgICAgIHZhbHVlID0gQ2hhcnNldE1ldGFBdHRyaWJ1dGVWYWx1ZSgiZXVjLWpwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiZXVjLWpwIiwgdmFsdWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImV1Yy1qcCIsIHZhbHVlLm9yaWdpbmFsX3ZhbHVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJ1dGY4IiwgdmFsdWUuZW5jb2RlKCJ1dGY4IikpCisKKworICAgIGRlZiB0ZXN0X2NvbnRlbnRfbWV0YV9hdHRyaWJ1dGVfdmFsdWUoc2VsZik6CisgICAgICAgIHZhbHVlID0gQ29udGVudE1ldGFBdHRyaWJ1dGVWYWx1ZSgidGV4dC9odG1sOyBjaGFyc2V0PWV1Yy1qcCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoInRleHQvaHRtbDsgY2hhcnNldD1ldWMtanAiLCB2YWx1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgidGV4dC9odG1sOyBjaGFyc2V0PWV1Yy1qcCIsIHZhbHVlLm9yaWdpbmFsX3ZhbHVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmOCIsIHZhbHVlLmVuY29kZSgidXRmOCIpKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYnM0L3Rlc3RzL3Rlc3RfdHJlZS5weSBiL2JpdGJha2UvbGliL2JzNC90ZXN0cy90ZXN0X3RyZWUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg1MTVjMAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JzNC90ZXN0cy90ZXN0X3RyZWUucHkKQEAgLTAsMCArMSwxODI5IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIiIiVGVzdHMgZm9yIEJlYXV0aWZ1bCBTb3VwJ3MgdHJlZSB0cmF2ZXJzYWwgbWV0aG9kcy4KKworVGhlIHRyZWUgdHJhdmVyc2FsIG1ldGhvZHMgYXJlIHRoZSBtYWluIGFkdmFudGFnZSBvZiB1c2luZyBCZWF1dGlmdWwKK1NvdXAgb3ZlciBqdXN0IHVzaW5nIGEgcGFyc2VyLgorCitEaWZmZXJlbnQgcGFyc2VycyB3aWxsIGJ1aWxkIGRpZmZlcmVudCBCZWF1dGlmdWwgU291cCB0cmVlcyBnaXZlbiB0aGUKK3NhbWUgbWFya3VwLCBidXQgYWxsIEJlYXV0aWZ1bCBTb3VwIHRyZWVzIGNhbiBiZSB0cmF2ZXJzZWQgd2l0aCB0aGUKK21ldGhvZHMgdGVzdGVkIGhlcmUuCisiIiIKKworaW1wb3J0IGNvcHkKK2ltcG9ydCBwaWNrbGUKK2ltcG9ydCByZQoraW1wb3J0IHdhcm5pbmdzCitmcm9tIGJzNCBpbXBvcnQgQmVhdXRpZnVsU291cAorZnJvbSBiczQuYnVpbGRlciBpbXBvcnQgKAorICAgIGJ1aWxkZXJfcmVnaXN0cnksCisgICAgSFRNTFBhcnNlclRyZWVCdWlsZGVyLAorKQorZnJvbSBiczQuZWxlbWVudCBpbXBvcnQgKAorICAgIENEYXRhLAorICAgIENvbW1lbnQsCisgICAgRG9jdHlwZSwKKyAgICBOYXZpZ2FibGVTdHJpbmcsCisgICAgU291cFN0cmFpbmVyLAorICAgIFRhZywKKykKK2Zyb20gYnM0LnRlc3RpbmcgaW1wb3J0ICgKKyAgICBTb3VwVGVzdCwKKyAgICBza2lwSWYsCispCisKK1hNTF9CVUlMREVSX1BSRVNFTlQgPSAoYnVpbGRlcl9yZWdpc3RyeS5sb29rdXAoInhtbCIpIGlzIG5vdCBOb25lKQorTFhNTF9QUkVTRU5UID0gKGJ1aWxkZXJfcmVnaXN0cnkubG9va3VwKCJseG1sIikgaXMgbm90IE5vbmUpCisKK2NsYXNzIFRyZWVUZXN0KFNvdXBUZXN0KToKKworICAgIGRlZiBhc3NlcnRTZWxlY3RzKHNlbGYsIHRhZ3MsIHNob3VsZF9tYXRjaCk6CisgICAgICAgICIiIk1ha2Ugc3VyZSB0aGF0IHRoZSBnaXZlbiB0YWdzIGhhdmUgdGhlIGNvcnJlY3QgdGV4dC4KKworICAgICAgICBUaGlzIGlzIHVzZWQgaW4gdGVzdHMgdGhhdCBkZWZpbmUgYSBidW5jaCBvZiB0YWdzLCBlYWNoCisgICAgICAgIGNvbnRhaW5pbmcgYSBzaW5nbGUgc3RyaW5nLCBhbmQgdGhlbiBzZWxlY3QgY2VydGFpbiBzdHJpbmdzIGJ5CisgICAgICAgIHNvbWUgbWVjaGFuaXNtLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbdGFnLnN0cmluZyBmb3IgdGFnIGluIHRhZ3NdLCBzaG91bGRfbWF0Y2gpCisKKyAgICBkZWYgYXNzZXJ0U2VsZWN0c0lEcyhzZWxmLCB0YWdzLCBzaG91bGRfbWF0Y2gpOgorICAgICAgICAiIiJNYWtlIHN1cmUgdGhhdCB0aGUgZ2l2ZW4gdGFncyBoYXZlIHRoZSBjb3JyZWN0IElEcy4KKworICAgICAgICBUaGlzIGlzIHVzZWQgaW4gdGVzdHMgdGhhdCBkZWZpbmUgYSBidW5jaCBvZiB0YWdzLCBlYWNoCisgICAgICAgIGNvbnRhaW5pbmcgYSBzaW5nbGUgc3RyaW5nLCBhbmQgdGhlbiBzZWxlY3QgY2VydGFpbiBzdHJpbmdzIGJ5CisgICAgICAgIHNvbWUgbWVjaGFuaXNtLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbdGFnWydpZCddIGZvciB0YWcgaW4gdGFnc10sIHNob3VsZF9tYXRjaCkKKworCitjbGFzcyBUZXN0RmluZChUcmVlVGVzdCk6CisgICAgIiIiQmFzaWMgdGVzdHMgb2YgdGhlIGZpbmQoKSBtZXRob2QuCisKKyAgICBmaW5kKCkganVzdCBjYWxscyBmaW5kX2FsbCgpIHdpdGggbGltaXQ9MSwgc28gaXQncyBub3QgdGVzdGVkIGFsbAorICAgIHRoYXQgdGhvdXJvdWdobHkgaGVyZS4KKyAgICAiIiIKKworICAgIGRlZiB0ZXN0X2ZpbmRfdGFnKHNlbGYpOgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCI8YT4xPC9hPjxiPjI8L2I+PGE+MzwvYT48Yj40PC9iPiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291cC5maW5kKCJiIikuc3RyaW5nLCAiMiIpCisKKyAgICBkZWYgdGVzdF91bmljb2RlX3RleHRfZmluZChzZWxmKToKKyAgICAgICAgc291cCA9IHNlbGYuc291cCh1JzxoMT5Sw6Rrc23DtnJnw6VzPC9oMT4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXAuZmluZCh0ZXh0PXUnUsOka3Ntw7ZyZ8OlcycpLCB1J1LDpGtzbcO2cmfDpXMnKQorCisgICAgZGVmIHRlc3RfZmluZF9ldmVyeXRoaW5nKHNlbGYpOgorICAgICAgICAiIiJUZXN0IGFuIG9wdGltaXphdGlvbiB0aGF0IGZpbmRzIGFsbCB0YWdzLiIiIgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCI8YT5mb288L2E+PGI+YmFyPC9iPiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgbGVuKHNvdXAuZmluZF9hbGwoKSkpCisKKyAgICBkZWYgdGVzdF9maW5kX2V2ZXJ5dGhpbmdfd2l0aF9uYW1lKHNlbGYpOgorICAgICAgICAiIiJUZXN0IGFuIG9wdGltaXphdGlvbiB0aGF0IGZpbmRzIGFsbCB0YWdzIHdpdGggYSBnaXZlbiBuYW1lLiIiIgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCI8YT5mb288L2E+PGI+YmFyPC9iPjxhPmJhejwvYT4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDIsIGxlbihzb3VwLmZpbmRfYWxsKCdhJykpKQorCitjbGFzcyBUZXN0RmluZEFsbChUcmVlVGVzdCk6CisgICAgIiIiQmFzaWMgdGVzdHMgb2YgdGhlIGZpbmRfYWxsKCkgbWV0aG9kLiIiIgorCisgICAgZGVmIHRlc3RfZmluZF9hbGxfdGV4dF9ub2RlcyhzZWxmKToKKyAgICAgICAgIiIiWW91IGNhbiBzZWFyY2ggdGhlIHRyZWUgZm9yIHRleHQgbm9kZXMuIiIiCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIjxodG1sPkZvbzxiPmJhcjwvYj5ceGJiPC9odG1sPiIpCisgICAgICAgICMgRXhhY3QgbWF0Y2guCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291cC5maW5kX2FsbCh0ZXh0PSJiYXIiKSwgW3UiYmFyIl0pCisgICAgICAgICMgTWF0Y2ggYW55IG9mIGEgbnVtYmVyIG9mIHN0cmluZ3MuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzb3VwLmZpbmRfYWxsKHRleHQ9WyJGb28iLCAiYmFyIl0pLCBbdSJGb28iLCB1ImJhciJdKQorICAgICAgICAjIE1hdGNoIGEgcmVndWxhciBleHByZXNzaW9uLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXAuZmluZF9hbGwodGV4dD1yZS5jb21waWxlKCcuKicpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbdSJGb28iLCB1ImJhciIsIHUnXHhiYiddKQorICAgICAgICAjIE1hdGNoIGFueXRoaW5nLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXAuZmluZF9hbGwodGV4dD1UcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbdSJGb28iLCB1ImJhciIsIHUnXHhiYiddKQorCisgICAgZGVmIHRlc3RfZmluZF9hbGxfbGltaXQoc2VsZik6CisgICAgICAgICIiIllvdSBjYW4gbGltaXQgdGhlIG51bWJlciBvZiBpdGVtcyByZXR1cm5lZCBieSBmaW5kX2FsbC4iIiIKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiPGE+MTwvYT48YT4yPC9hPjxhPjM8L2E+PGE+NDwvYT48YT41PC9hPiIpCisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cyhzb3VwLmZpbmRfYWxsKCdhJywgbGltaXQ9MyksIFsiMSIsICIyIiwgIjMiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKHNvdXAuZmluZF9hbGwoJ2EnLCBsaW1pdD0xKSwgWyIxIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cygKKyAgICAgICAgICAgIHNvdXAuZmluZF9hbGwoJ2EnLCBsaW1pdD0xMCksIFsiMSIsICIyIiwgIjMiLCAiNCIsICI1Il0pCisKKyAgICAgICAgIyBBIGxpbWl0IG9mIDAgbWVhbnMgbm8gbGltaXQuCisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cygKKyAgICAgICAgICAgIHNvdXAuZmluZF9hbGwoJ2EnLCBsaW1pdD0wKSwgWyIxIiwgIjIiLCAiMyIsICI0IiwgIjUiXSkKKworICAgIGRlZiB0ZXN0X2NhbGxpbmdfYV90YWdfaXNfY2FsbGluZ19maW5kYWxsKHNlbGYpOgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCI8YT4xPC9hPjxiPjI8YSBpZD0nZm9vJz4zPC9hPjwvYj4iKQorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHMoc291cCgnYScsIGxpbWl0PTEpLCBbIjEiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKHNvdXAuYihpZD0iZm9vIiksIFsiMyJdKQorCisgICAgZGVmIHRlc3RfZmluZF9hbGxfd2l0aF9zZWxmX3JlZmVyZW50aWFsX2RhdGFfc3RydWN0dXJlX2RvZXNfbm90X2NhdXNlX2luZmluaXRlX3JlY3Vyc2lvbihzZWxmKToKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiPGE+PC9hPiIpCisgICAgICAgICMgQ3JlYXRlIGEgc2VsZi1yZWZlcmVudGlhbCBsaXN0LgorICAgICAgICBsID0gW10KKyAgICAgICAgbC5hcHBlbmQobCkKKworICAgICAgICAjIFdpdGhvdXQgc3BlY2lhbCBjb2RlIGluIF9ub3JtYWxpemVfc2VhcmNoX3ZhbHVlLCB0aGlzIHdvdWxkIGNhdXNlIGluZmluaXRlCisgICAgICAgICMgcmVjdXJzaW9uLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtdLCBzb3VwLmZpbmRfYWxsKGwpKQorCisgICAgZGVmIHRlc3RfZmluZF9hbGxfcmVzdWx0c2V0KHNlbGYpOgorICAgICAgICAiIiJBbGwgZmluZF9hbGwgY2FsbHMgcmV0dXJuIGEgUmVzdWx0U2V0IiIiCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIjxhPjwvYT4iKQorICAgICAgICByZXN1bHQgPSBzb3VwLmZpbmRfYWxsKCJhIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIocmVzdWx0LCAic291cmNlIikpCisKKyAgICAgICAgcmVzdWx0ID0gc291cC5maW5kX2FsbChUcnVlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihyZXN1bHQsICJzb3VyY2UiKSkKKworICAgICAgICByZXN1bHQgPSBzb3VwLmZpbmRfYWxsKHRleHQ9ImZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKHJlc3VsdCwgInNvdXJjZSIpKQorCisKK2NsYXNzIFRlc3RGaW5kQWxsQmFzaWNOYW1lc3BhY2VzKFRyZWVUZXN0KToKKworICAgIGRlZiB0ZXN0X2ZpbmRfYnlfbmFtZXNwYWNlZF9uYW1lKHNlbGYpOgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCc8bWF0aG1sOm1zcXJ0PjQ8L21hdGhtbDptc3FydD48YSBzdmc6ZmlsbD0icmVkIj4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCI0Iiwgc291cC5maW5kKCJtYXRobWw6bXNxcnQiKS5zdHJpbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImEiLCBzb3VwLmZpbmQoYXR0cnM9IHsgInN2ZzpmaWxsIiA6ICJyZWQiIH0pLm5hbWUpCisKKworY2xhc3MgVGVzdEZpbmRBbGxCeU5hbWUoVHJlZVRlc3QpOgorICAgICIiIlRlc3Qgd2F5cyBvZiBmaW5kaW5nIHRhZ3MgYnkgdGFnIG5hbWUuIiIiCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cGVyKFRyZWVUZXN0LCBzZWxmKS5zZXRVcCgpCisgICAgICAgIHNlbGYudHJlZSA9ICBzZWxmLnNvdXAoIiIiPGE+Rmlyc3QgdGFnLjwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yj5TZWNvbmQgdGFnLjwvYj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yz5UaGlyZCA8YT5OZXN0ZWQgdGFnLjwvYT4gdGFnLjwvYz4iIiIpCisKKyAgICBkZWYgdGVzdF9maW5kX2FsbF9ieV90YWdfbmFtZShzZWxmKToKKyAgICAgICAgIyBGaW5kIGFsbCB0aGUgPGE+IHRhZ3MuCisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cygKKyAgICAgICAgICAgIHNlbGYudHJlZS5maW5kX2FsbCgnYScpLCBbJ0ZpcnN0IHRhZy4nLCAnTmVzdGVkIHRhZy4nXSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfYWxsX2J5X25hbWVfYW5kX3RleHQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cygKKyAgICAgICAgICAgIHNlbGYudHJlZS5maW5kX2FsbCgnYScsIHRleHQ9J0ZpcnN0IHRhZy4nKSwgWydGaXJzdCB0YWcuJ10pCisKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKAorICAgICAgICAgICAgc2VsZi50cmVlLmZpbmRfYWxsKCdhJywgdGV4dD1UcnVlKSwgWydGaXJzdCB0YWcuJywgJ05lc3RlZCB0YWcuJ10pCisKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKAorICAgICAgICAgICAgc2VsZi50cmVlLmZpbmRfYWxsKCdhJywgdGV4dD1yZS5jb21waWxlKCJ0YWciKSksCisgICAgICAgICAgICBbJ0ZpcnN0IHRhZy4nLCAnTmVzdGVkIHRhZy4nXSkKKworCisgICAgZGVmIHRlc3RfZmluZF9hbGxfb25fbm9uX3Jvb3RfZWxlbWVudChzZWxmKToKKyAgICAgICAgIyBZb3UgY2FuIGNhbGwgZmluZF9hbGwgb24gYW55IG5vZGUsIG5vdCBqdXN0IHRoZSByb290LgorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHMoc2VsZi50cmVlLmMuZmluZF9hbGwoJ2EnKSwgWydOZXN0ZWQgdGFnLiddKQorCisgICAgZGVmIHRlc3RfY2FsbGluZ19lbGVtZW50X2ludm9rZXNfZmluZF9hbGwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cyhzZWxmLnRyZWUoJ2EnKSwgWydGaXJzdCB0YWcuJywgJ05lc3RlZCB0YWcuJ10pCisKKyAgICBkZWYgdGVzdF9maW5kX2FsbF9ieV90YWdfc3RyYWluZXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cygKKyAgICAgICAgICAgIHNlbGYudHJlZS5maW5kX2FsbChTb3VwU3RyYWluZXIoJ2EnKSksCisgICAgICAgICAgICBbJ0ZpcnN0IHRhZy4nLCAnTmVzdGVkIHRhZy4nXSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfYWxsX2J5X3RhZ19uYW1lcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKAorICAgICAgICAgICAgc2VsZi50cmVlLmZpbmRfYWxsKFsnYScsICdiJ10pLAorICAgICAgICAgICAgWydGaXJzdCB0YWcuJywgJ1NlY29uZCB0YWcuJywgJ05lc3RlZCB0YWcuJ10pCisKKyAgICBkZWYgdGVzdF9maW5kX2FsbF9ieV90YWdfZGljdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKAorICAgICAgICAgICAgc2VsZi50cmVlLmZpbmRfYWxsKHsnYScgOiBUcnVlLCAnYicgOiBUcnVlfSksCisgICAgICAgICAgICBbJ0ZpcnN0IHRhZy4nLCAnU2Vjb25kIHRhZy4nLCAnTmVzdGVkIHRhZy4nXSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfYWxsX2J5X3RhZ19yZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKAorICAgICAgICAgICAgc2VsZi50cmVlLmZpbmRfYWxsKHJlLmNvbXBpbGUoJ15bYWJdJCcpKSwKKyAgICAgICAgICAgIFsnRmlyc3QgdGFnLicsICdTZWNvbmQgdGFnLicsICdOZXN0ZWQgdGFnLiddKQorCisgICAgZGVmIHRlc3RfZmluZF9hbGxfd2l0aF90YWdzX21hdGNoaW5nX21ldGhvZChzZWxmKToKKyAgICAgICAgIyBZb3UgY2FuIGRlZmluZSBhbiBvcmFjbGUgbWV0aG9kIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyCisgICAgICAgICMgYSB0YWcgbWF0Y2hlcyB0aGUgc2VhcmNoLgorICAgICAgICBkZWYgaWRfbWF0Y2hlc19uYW1lKHRhZyk6CisgICAgICAgICAgICByZXR1cm4gdGFnLm5hbWUgPT0gdGFnLmdldCgnaWQnKQorCisgICAgICAgIHRyZWUgPSBzZWxmLnNvdXAoIiIiPGEgaWQ9ImEiPk1hdGNoIDEuPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGlkPSIxIj5Eb2VzIG5vdCBtYXRjaC48L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGIgaWQ9ImIiPk1hdGNoIDIuPC9hPiIiIikKKworICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHMoCisgICAgICAgICAgICB0cmVlLmZpbmRfYWxsKGlkX21hdGNoZXNfbmFtZSksIFsiTWF0Y2ggMS4iLCAiTWF0Y2ggMi4iXSkKKworCitjbGFzcyBUZXN0RmluZEFsbEJ5QXR0cmlidXRlKFRyZWVUZXN0KToKKworICAgIGRlZiB0ZXN0X2ZpbmRfYWxsX2J5X2F0dHJpYnV0ZV9uYW1lKHNlbGYpOgorICAgICAgICAjIFlvdSBjYW4gcGFzcyBpbiBrZXl3b3JkIGFyZ3VtZW50cyB0byBmaW5kX2FsbCB0byBzZWFyY2ggYnkKKyAgICAgICAgIyBhdHRyaWJ1dGUuCisgICAgICAgIHRyZWUgPSBzZWxmLnNvdXAoIiIiCisgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaWQ9ImZpcnN0Ij5NYXRjaGluZyBhLjwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICA8YSBpZD0ic2Vjb25kIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uLW1hdGNoaW5nIDxiIGlkPSJmaXJzdCI+TWF0Y2hpbmcgYi48L2I+YS4KKyAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+IiIiKQorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHModHJlZS5maW5kX2FsbChpZD0nZmlyc3QnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiTWF0Y2hpbmcgYS4iLCAiTWF0Y2hpbmcgYi4iXSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfYWxsX2J5X3V0ZjhfYXR0cmlidXRlX3ZhbHVlKHNlbGYpOgorICAgICAgICBwZWFjZSA9IHUi153Xldec16kiLmVuY29kZSgidXRmOCIpCisgICAgICAgIGRhdGEgPSB1JzxhIHRpdGxlPSLXndeV15zXqSI+PC9hPicuZW5jb2RlKCJ1dGY4IikKKyAgICAgICAgc291cCA9IHNlbGYuc291cChkYXRhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtzb3VwLmFdLCBzb3VwLmZpbmRfYWxsKHRpdGxlPXBlYWNlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbc291cC5hXSwgc291cC5maW5kX2FsbCh0aXRsZT1wZWFjZS5kZWNvZGUoInV0ZjgiKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW3NvdXAuYV0sIHNvdXAuZmluZF9hbGwodGl0bGU9W3BlYWNlLCAic29tZXRoaW5nIGVsc2UiXSkpCisKKyAgICBkZWYgdGVzdF9maW5kX2FsbF9ieV9hdHRyaWJ1dGVfZGljdChzZWxmKToKKyAgICAgICAgIyBZb3UgY2FuIHBhc3MgaW4gYSBkaWN0aW9uYXJ5IGFzIHRoZSBhcmd1bWVudCAnYXR0cnMnLiBUaGlzCisgICAgICAgICMgbGV0cyB5b3Ugc2VhcmNoIGZvciBhdHRyaWJ1dGVzIGxpa2UgJ25hbWUnIChhIGZpeGVkIGFyZ3VtZW50CisgICAgICAgICMgdG8gZmluZF9hbGwpIGFuZCAnY2xhc3MnIChhIHJlc2VydmVkIHdvcmQgaW4gUHl0aG9uLikKKyAgICAgICAgdHJlZSA9IHNlbGYuc291cCgiIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJuYW1lMSIgY2xhc3M9ImNsYXNzMSI+TmFtZSBtYXRjaC48L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0ibmFtZTIiIGNsYXNzPSJjbGFzczIiPkNsYXNzIG1hdGNoLjwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJuYW1lMyIgY2xhc3M9ImNsYXNzMyI+Tm9uLW1hdGNoLjwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZTE+QSB0YWcgY2FsbGVkICduYW1lMScuPC9uYW1lMT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAiIiIpCisKKyAgICAgICAgIyBUaGlzIGRvZXNuJ3QgZG8gd2hhdCB5b3Ugd2FudC4KKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKHRyZWUuZmluZF9hbGwobmFtZT0nbmFtZTEnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiQSB0YWcgY2FsbGVkICduYW1lMScuIl0pCisgICAgICAgICMgVGhpcyBkb2VzIHdoYXQgeW91IHdhbnQuCisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cyh0cmVlLmZpbmRfYWxsKGF0dHJzPXsnbmFtZScgOiAnbmFtZTEnfSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbIk5hbWUgbWF0Y2guIl0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKHRyZWUuZmluZF9hbGwoYXR0cnM9eydjbGFzcycgOiAnY2xhc3MyJ30pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJDbGFzcyBtYXRjaC4iXSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfYWxsX2J5X2NsYXNzKHNlbGYpOgorICAgICAgICB0cmVlID0gc2VsZi5zb3VwKCIiIgorICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSIxIj5DbGFzcyAxLjwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iMiI+Q2xhc3MgMi48L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgPGIgY2xhc3M9IjEiPkNsYXNzIDEuPC9iPgorICAgICAgICAgICAgICAgICAgICAgICAgIDxjIGNsYXNzPSIzIDQiPkNsYXNzIDMgYW5kIDQuPC9jPgorICAgICAgICAgICAgICAgICAgICAgICAgICIiIikKKworICAgICAgICAjIFBhc3NpbmcgaW4gdGhlIGNsYXNzXyBrZXl3b3JkIGFyZ3VtZW50IHdpbGwgc2VhcmNoIGFnYWluc3QKKyAgICAgICAgIyB0aGUgJ2NsYXNzJyBhdHRyaWJ1dGUuCisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cyh0cmVlLmZpbmRfYWxsKCdhJywgY2xhc3NfPScxJyksIFsnQ2xhc3MgMS4nXSkKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKHRyZWUuZmluZF9hbGwoJ2MnLCBjbGFzc189JzMnKSwgWydDbGFzcyAzIGFuZCA0LiddKQorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHModHJlZS5maW5kX2FsbCgnYycsIGNsYXNzXz0nNCcpLCBbJ0NsYXNzIDMgYW5kIDQuJ10pCisKKyAgICAgICAgIyBQYXNzaW5nIGluIGEgc3RyaW5nIHRvICdhdHRycycgd2lsbCBhbHNvIHNlYXJjaCB0aGUgQ1NTIGNsYXNzLgorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHModHJlZS5maW5kX2FsbCgnYScsICcxJyksIFsnQ2xhc3MgMS4nXSkKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKHRyZWUuZmluZF9hbGwoYXR0cnM9JzEnKSwgWydDbGFzcyAxLicsICdDbGFzcyAxLiddKQorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHModHJlZS5maW5kX2FsbCgnYycsICczJyksIFsnQ2xhc3MgMyBhbmQgNC4nXSkKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKHRyZWUuZmluZF9hbGwoJ2MnLCAnNCcpLCBbJ0NsYXNzIDMgYW5kIDQuJ10pCisKKyAgICBkZWYgdGVzdF9maW5kX2J5X2NsYXNzX3doZW5fbXVsdGlwbGVfY2xhc3Nlc19wcmVzZW50KHNlbGYpOgorICAgICAgICB0cmVlID0gc2VsZi5zb3VwKCI8Z2FyIGNsYXNzPSdmb28gYmFyJz5Gb3VuZCBpdDwvZ2FyPiIpCisKKyAgICAgICAgZiA9IHRyZWUuZmluZF9hbGwoImdhciIsIGNsYXNzXz1yZS5jb21waWxlKCJvIikpCisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cyhmLCBbIkZvdW5kIGl0Il0pCisKKyAgICAgICAgZiA9IHRyZWUuZmluZF9hbGwoImdhciIsIGNsYXNzXz1yZS5jb21waWxlKCJhIikpCisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cyhmLCBbIkZvdW5kIGl0Il0pCisKKyAgICAgICAgIyBTaW5jZSB0aGUgY2xhc3MgaXMgbm90IHRoZSBzdHJpbmcgImZvbyBiYXIiLCBidXQgdGhlIHR3bworICAgICAgICAjIHN0cmluZ3MgImZvbyIgYW5kICJiYXIiLCB0aGlzIHdpbGwgbm90IGZpbmQgYW55dGhpbmcuCisgICAgICAgIGYgPSB0cmVlLmZpbmRfYWxsKCJnYXIiLCBjbGFzc189cmUuY29tcGlsZSgibyBiIikpCisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cyhmLCBbXSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfYWxsX3dpdGhfbm9uX2RpY3Rpb25hcnlfZm9yX2F0dHJzX2ZpbmRzX2J5X2NsYXNzKHNlbGYpOgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCI8YSBjbGFzcz0nYmFyJz5Gb3VuZCBpdDwvYT4iKQorCisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cyhzb3VwLmZpbmRfYWxsKCJhIiwgcmUuY29tcGlsZSgiYmEiKSksIFsiRm91bmQgaXQiXSkKKworICAgICAgICBkZWYgYmlnX2F0dHJpYnV0ZV92YWx1ZSh2YWx1ZSk6CisgICAgICAgICAgICByZXR1cm4gbGVuKHZhbHVlKSA+IDMKKworICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHMoc291cC5maW5kX2FsbCgiYSIsIGJpZ19hdHRyaWJ1dGVfdmFsdWUpLCBbXSkKKworICAgICAgICBkZWYgc21hbGxfYXR0cmlidXRlX3ZhbHVlKHZhbHVlKToKKyAgICAgICAgICAgIHJldHVybiBsZW4odmFsdWUpIDw9IDMKKworICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHMoCisgICAgICAgICAgICBzb3VwLmZpbmRfYWxsKCJhIiwgc21hbGxfYXR0cmlidXRlX3ZhbHVlKSwgWyJGb3VuZCBpdCJdKQorCisgICAgZGVmIHRlc3RfZmluZF9hbGxfd2l0aF9zdHJpbmdfZm9yX2F0dHJzX2ZpbmRzX211bHRpcGxlX2NsYXNzZXMoc2VsZik6CisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoJzxhIGNsYXNzPSJmb28gYmFyIj48L2E+PGEgY2xhc3M9ImZvbyI+PC9hPicpCisgICAgICAgIGEsIGEyID0gc291cC5maW5kX2FsbCgiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW2EsIGEyXSwgc291cC5maW5kX2FsbCgiYSIsICJmb28iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbYV0sIHNvdXAuZmluZF9hbGwoImEiLCAiYmFyIikpCisKKyAgICAgICAgIyBJZiB5b3Ugc3BlY2lmeSB0aGUgY2xhc3MgYXMgYSBzdHJpbmcgdGhhdCBjb250YWlucyBhCisgICAgICAgICMgc3BhY2UsIG9ubHkgdGhhdCBzcGVjaWZpYyB2YWx1ZSB3aWxsIGJlIGZvdW5kLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFthXSwgc291cC5maW5kX2FsbCgiYSIsIGNsYXNzXz0iZm9vIGJhciIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFthXSwgc291cC5maW5kX2FsbCgiYSIsICJmb28gYmFyIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW10sIHNvdXAuZmluZF9hbGwoImEiLCAiYmFyIGZvbyIpKQorCisgICAgZGVmIHRlc3RfZmluZF9hbGxfYnlfYXR0cmlidXRlX3NvdXBzdHJhaW5lcihzZWxmKToKKyAgICAgICAgdHJlZSA9IHNlbGYuc291cCgiIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8YSBpZD0iZmlyc3QiPk1hdGNoLjwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICA8YSBpZD0ic2Vjb25kIj5Ob24tbWF0Y2guPC9hPiIiIikKKworICAgICAgICBzdHJhaW5lciA9IFNvdXBTdHJhaW5lcihhdHRycz17J2lkJyA6ICdmaXJzdCd9KQorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHModHJlZS5maW5kX2FsbChzdHJhaW5lciksIFsnTWF0Y2guJ10pCisKKyAgICBkZWYgdGVzdF9maW5kX2FsbF93aXRoX21pc3NpbmdfYXRyaWJ1dGUoc2VsZik6CisgICAgICAgICMgWW91IGNhbiBwYXNzIGluIE5vbmUgYXMgdGhlIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZSB0byBmaW5kX2FsbC4KKyAgICAgICAgIyBUaGlzIHdpbGwgbWF0Y2ggdGFncyB0aGF0IGRvIG5vdCBoYXZlIHRoYXQgYXR0cmlidXRlIHNldC4KKyAgICAgICAgdHJlZSA9IHNlbGYuc291cCgiIiI8YSBpZD0iMSI+SUQgcHJlc2VudC48L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGE+Tm8gSUQgcHJlc2VudC48L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaWQ9IiI+SUQgaXMgZW1wdHkuPC9hPiIiIikKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKHRyZWUuZmluZF9hbGwoJ2EnLCBpZD1Ob25lKSwgWyJObyBJRCBwcmVzZW50LiJdKQorCisgICAgZGVmIHRlc3RfZmluZF9hbGxfd2l0aF9kZWZpbmVkX2F0dHJpYnV0ZShzZWxmKToKKyAgICAgICAgIyBZb3UgY2FuIHBhc3MgaW4gTm9uZSBhcyB0aGUgdmFsdWUgb2YgYW4gYXR0cmlidXRlIHRvIGZpbmRfYWxsLgorICAgICAgICAjIFRoaXMgd2lsbCBtYXRjaCB0YWdzIHRoYXQgaGF2ZSB0aGF0IGF0dHJpYnV0ZSBzZXQgdG8gYW55IHZhbHVlLgorICAgICAgICB0cmVlID0gc2VsZi5zb3VwKCIiIjxhIGlkPSIxIj5JRCBwcmVzZW50LjwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YT5ObyBJRCBwcmVzZW50LjwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBpZD0iIj5JRCBpcyBlbXB0eS48L2E+IiIiKQorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHMoCisgICAgICAgICAgICB0cmVlLmZpbmRfYWxsKGlkPVRydWUpLCBbIklEIHByZXNlbnQuIiwgIklEIGlzIGVtcHR5LiJdKQorCisgICAgZGVmIHRlc3RfZmluZF9hbGxfd2l0aF9udW1lcmljX2F0dHJpYnV0ZShzZWxmKToKKyAgICAgICAgIyBJZiB5b3Ugc2VhcmNoIGZvciBhIG51bWJlciwgaXQncyB0cmVhdGVkIGFzIGEgc3RyaW5nLgorICAgICAgICB0cmVlID0gc2VsZi5zb3VwKCIiIjxhIGlkPTE+VW5xdW90ZWQgYXR0cmlidXRlLjwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBpZD0iMSI+UXVvdGVkIGF0dHJpYnV0ZS48L2E+IiIiKQorCisgICAgICAgIGV4cGVjdGVkID0gWyJVbnF1b3RlZCBhdHRyaWJ1dGUuIiwgIlF1b3RlZCBhdHRyaWJ1dGUuIl0KKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKHRyZWUuZmluZF9hbGwoaWQ9MSksIGV4cGVjdGVkKQorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHModHJlZS5maW5kX2FsbChpZD0iMSIpLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X2ZpbmRfYWxsX3dpdGhfbGlzdF9hdHRyaWJ1dGVfdmFsdWVzKHNlbGYpOgorICAgICAgICAjIFlvdSBjYW4gcGFzcyBhIGxpc3Qgb2YgYXR0cmlidXRlIHZhbHVlcyBpbnN0ZWFkIG9mIGp1c3Qgb25lLAorICAgICAgICAjIGFuZCB5b3UnbGwgZ2V0IHRhZ3MgdGhhdCBtYXRjaCBhbnkgb2YgdGhlIHZhbHVlcy4KKyAgICAgICAgdHJlZSA9IHNlbGYuc291cCgiIiI8YSBpZD0iMSI+MTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBpZD0iMiI+MjwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBpZD0iMyI+MzwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YT5ObyBJRC48L2E+IiIiKQorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHModHJlZS5maW5kX2FsbChpZD1bIjEiLCAiMyIsICI0Il0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWyIxIiwgIjMiXSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfYWxsX3dpdGhfcmVndWxhcl9leHByZXNzaW9uX2F0dHJpYnV0ZV92YWx1ZShzZWxmKToKKyAgICAgICAgIyBZb3UgY2FuIHBhc3MgYSByZWd1bGFyIGV4cHJlc3Npb24gYXMgYW4gYXR0cmlidXRlIHZhbHVlLCBhbmQKKyAgICAgICAgIyB5b3UnbGwgZ2V0IHRhZ3Mgd2hvc2UgdmFsdWVzIGZvciB0aGF0IGF0dHJpYnV0ZSBtYXRjaCB0aGUKKyAgICAgICAgIyByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICAgIHRyZWUgPSBzZWxmLnNvdXAoIiIiPGEgaWQ9ImEiPk9uZSBhLjwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBpZD0iYWEiPlR3byBhcy48L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaWQ9ImFiIj5NaXhlZCBhcyBhbmQgYnMuPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGlkPSJiIj5PbmUgYi48L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGE+Tm8gSUQuPC9hPiIiIikKKworICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHModHJlZS5maW5kX2FsbChpZD1yZS5jb21waWxlKCJeYSskIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJPbmUgYS4iLCAiVHdvIGFzLiJdKQorCisgICAgZGVmIHRlc3RfZmluZF9ieV9uYW1lX2FuZF9jb250YWluaW5nX3N0cmluZyhzZWxmKToKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiPGI+Zm9vPC9iPjxiPmJhcjwvYj48YT5mb288L2E+IikKKyAgICAgICAgYSA9IHNvdXAuYQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW2FdLCBzb3VwLmZpbmRfYWxsKCJhIiwgdGV4dD0iZm9vIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW10sIHNvdXAuZmluZF9hbGwoImEiLCB0ZXh0PSJiYXIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbXSwgc291cC5maW5kX2FsbCgiYSIsIHRleHQ9ImJhciIpKQorCisgICAgZGVmIHRlc3RfZmluZF9ieV9uYW1lX2FuZF9jb250YWluaW5nX3N0cmluZ193aGVuX3N0cmluZ19pc19idXJpZWQoc2VsZik6CisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIjxhPmZvbzwvYT48YT48Yj48Yz5mb288L2M+PC9iPjwvYT4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXAuZmluZF9hbGwoImEiKSwgc291cC5maW5kX2FsbCgiYSIsIHRleHQ9ImZvbyIpKQorCisgICAgZGVmIHRlc3RfZmluZF9ieV9hdHRyaWJ1dGVfYW5kX2NvbnRhaW5pbmdfc3RyaW5nKHNlbGYpOgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCc8YiBpZD0iMSI+Zm9vPC9iPjxhIGlkPSIyIj5mb288L2E+JykKKyAgICAgICAgYSA9IHNvdXAuYQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW2FdLCBzb3VwLmZpbmRfYWxsKGlkPTIsIHRleHQ9ImZvbyIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtdLCBzb3VwLmZpbmRfYWxsKGlkPTEsIHRleHQ9ImJhciIpKQorCisKKworCitjbGFzcyBUZXN0SW5kZXgoVHJlZVRlc3QpOgorICAgICIiIlRlc3QgVGFnLmluZGV4IiIiCisgICAgZGVmIHRlc3RfaW5kZXgoc2VsZik6CisgICAgICAgIHRyZWUgPSBzZWxmLnNvdXAoIiIiPGRpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YT5JZGVudGljYWw8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGI+Tm90IGlkZW50aWNhbDwvYj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YT5JZGVudGljYWw8L2E+CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yz48ZD5JZGVudGljYWwgd2l0aCBjaGlsZDwvZD48L2M+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGI+QWxzbyBub3QgaWRlbnRpY2FsPC9iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjPjxkPklkZW50aWNhbCB3aXRoIGNoaWxkPC9kPjwvYz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4iIiIpCisgICAgICAgIGRpdiA9IHRyZWUuZGl2CisgICAgICAgIGZvciBpLCBlbGVtZW50IGluIGVudW1lcmF0ZShkaXYuY29udGVudHMpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpLCBkaXYuaW5kZXgoZWxlbWVudCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRyZWUuaW5kZXgsIDEpCisKKworY2xhc3MgVGVzdFBhcmVudE9wZXJhdGlvbnMoVHJlZVRlc3QpOgorICAgICIiIlRlc3QgbmF2aWdhdGlvbiBhbmQgc2VhcmNoaW5nIHRocm91Z2ggYW4gZWxlbWVudCdzIHBhcmVudHMuIiIiCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cGVyKFRlc3RQYXJlbnRPcGVyYXRpb25zLCBzZWxmKS5zZXRVcCgpCisgICAgICAgIHNlbGYudHJlZSA9IHNlbGYuc291cCgnJyc8dWwgaWQ9ImVtcHR5Ij48L3VsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGlkPSJ0b3AiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBpZD0ibWlkZGxlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGlkPSJib3R0b20iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGI+U3RhcnQgaGVyZTwvYj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPicnJykKKyAgICAgICAgc2VsZi5zdGFydCA9IHNlbGYudHJlZS5iCisKKworICAgIGRlZiB0ZXN0X3BhcmVudChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnN0YXJ0LnBhcmVudFsnaWQnXSwgJ2JvdHRvbScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zdGFydC5wYXJlbnQucGFyZW50WydpZCddLCAnbWlkZGxlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnN0YXJ0LnBhcmVudC5wYXJlbnQucGFyZW50WydpZCddLCAndG9wJykKKworICAgIGRlZiB0ZXN0X3BhcmVudF9vZl90b3BfdGFnX2lzX3NvdXBfb2JqZWN0KHNlbGYpOgorICAgICAgICB0b3BfdGFnID0gc2VsZi50cmVlLmNvbnRlbnRzWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodG9wX3RhZy5wYXJlbnQsIHNlbGYudHJlZSkKKworICAgIGRlZiB0ZXN0X3NvdXBfb2JqZWN0X2hhc19ub19wYXJlbnQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgc2VsZi50cmVlLnBhcmVudCkKKworICAgIGRlZiB0ZXN0X2ZpbmRfcGFyZW50cyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzSURzKAorICAgICAgICAgICAgc2VsZi5zdGFydC5maW5kX3BhcmVudHMoJ3VsJyksIFsnYm90dG9tJywgJ21pZGRsZScsICd0b3AnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzSURzKAorICAgICAgICAgICAgc2VsZi5zdGFydC5maW5kX3BhcmVudHMoJ3VsJywgaWQ9Im1pZGRsZSIpLCBbJ21pZGRsZSddKQorCisgICAgZGVmIHRlc3RfZmluZF9wYXJlbnQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zdGFydC5maW5kX3BhcmVudCgndWwnKVsnaWQnXSwgJ2JvdHRvbScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zdGFydC5maW5kX3BhcmVudCgndWwnLCBpZD0ndG9wJylbJ2lkJ10sICd0b3AnKQorCisgICAgZGVmIHRlc3RfcGFyZW50X29mX3RleHRfZWxlbWVudChzZWxmKToKKyAgICAgICAgdGV4dCA9IHNlbGYudHJlZS5maW5kKHRleHQ9IlN0YXJ0IGhlcmUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRleHQucGFyZW50Lm5hbWUsICdiJykKKworICAgIGRlZiB0ZXN0X3RleHRfZWxlbWVudF9maW5kX3BhcmVudChzZWxmKToKKyAgICAgICAgdGV4dCA9IHNlbGYudHJlZS5maW5kKHRleHQ9IlN0YXJ0IGhlcmUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRleHQuZmluZF9wYXJlbnQoJ3VsJylbJ2lkJ10sICdib3R0b20nKQorCisgICAgZGVmIHRlc3RfcGFyZW50X2dlbmVyYXRvcihzZWxmKToKKyAgICAgICAgcGFyZW50cyA9IFtwYXJlbnRbJ2lkJ10gZm9yIHBhcmVudCBpbiBzZWxmLnN0YXJ0LnBhcmVudHMKKyAgICAgICAgICAgICAgICAgICBpZiBwYXJlbnQgaXMgbm90IE5vbmUgYW5kICdpZCcgaW4gcGFyZW50LmF0dHJzXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcmVudHMsIFsnYm90dG9tJywgJ21pZGRsZScsICd0b3AnXSkKKworCitjbGFzcyBQcm94aW1pdHlUZXN0KFRyZWVUZXN0KToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwZXIoVHJlZVRlc3QsIHNlbGYpLnNldFVwKCkKKyAgICAgICAgc2VsZi50cmVlID0gc2VsZi5zb3VwKAorICAgICAgICAgICAgJzxodG1sIGlkPSJzdGFydCI+PGhlYWQ+PC9oZWFkPjxib2R5PjxiIGlkPSIxIj5PbmU8L2I+PGIgaWQ9IjIiPlR3bzwvYj48YiBpZD0iMyI+VGhyZWU8L2I+PC9ib2R5PjwvaHRtbD4nKQorCisKK2NsYXNzIFRlc3ROZXh0T3BlcmF0aW9ucyhQcm94aW1pdHlUZXN0KToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwZXIoVGVzdE5leHRPcGVyYXRpb25zLCBzZWxmKS5zZXRVcCgpCisgICAgICAgIHNlbGYuc3RhcnQgPSBzZWxmLnRyZWUuYgorCisgICAgZGVmIHRlc3RfbmV4dChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnN0YXJ0Lm5leHRfZWxlbWVudCwgIk9uZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zdGFydC5uZXh0X2VsZW1lbnQubmV4dF9lbGVtZW50WydpZCddLCAiMiIpCisKKyAgICBkZWYgdGVzdF9uZXh0X29mX2xhc3RfaXRlbV9pc19ub25lKHNlbGYpOgorICAgICAgICBsYXN0ID0gc2VsZi50cmVlLmZpbmQodGV4dD0iVGhyZWUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxhc3QubmV4dF9lbGVtZW50LCBOb25lKQorCisgICAgZGVmIHRlc3RfbmV4dF9vZl9yb290X2lzX25vbmUoc2VsZik6CisgICAgICAgICMgVGhlIGRvY3VtZW50IHJvb3QgaXMgb3V0c2lkZSB0aGUgbmV4dC9wcmV2aW91cyBjaGFpbi4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRyZWUubmV4dF9lbGVtZW50LCBOb25lKQorCisgICAgZGVmIHRlc3RfZmluZF9hbGxfbmV4dChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKHNlbGYuc3RhcnQuZmluZF9hbGxfbmV4dCgnYicpLCBbIlR3byIsICJUaHJlZSJdKQorICAgICAgICBzZWxmLnN0YXJ0LmZpbmRfYWxsX25leHQoaWQ9MykKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKHNlbGYuc3RhcnQuZmluZF9hbGxfbmV4dChpZD0zKSwgWyJUaHJlZSJdKQorCisgICAgZGVmIHRlc3RfZmluZF9uZXh0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3RhcnQuZmluZF9uZXh0KCdiJylbJ2lkJ10sICcyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnN0YXJ0LmZpbmRfbmV4dCh0ZXh0PSJUaHJlZSIpLCAiVGhyZWUiKQorCisgICAgZGVmIHRlc3RfZmluZF9uZXh0X2Zvcl90ZXh0X2VsZW1lbnQoc2VsZik6CisgICAgICAgIHRleHQgPSBzZWxmLnRyZWUuZmluZCh0ZXh0PSJPbmUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRleHQuZmluZF9uZXh0KCJiIikuc3RyaW5nLCAiVHdvIikKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKHRleHQuZmluZF9hbGxfbmV4dCgiYiIpLCBbIlR3byIsICJUaHJlZSJdKQorCisgICAgZGVmIHRlc3RfbmV4dF9nZW5lcmF0b3Ioc2VsZik6CisgICAgICAgIHN0YXJ0ID0gc2VsZi50cmVlLmZpbmQodGV4dD0iVHdvIikKKyAgICAgICAgc3VjY2Vzc29ycyA9IFtub2RlIGZvciBub2RlIGluIHN0YXJ0Lm5leHRfZWxlbWVudHNdCisgICAgICAgICMgVGhlcmUgYXJlIHR3byBzdWNjZXNzb3JzOiB0aGUgZmluYWwgPGI+IHRhZyBhbmQgaXRzIHRleHQgY29udGVudHMuCisgICAgICAgIHRhZywgY29udGVudHMgPSBzdWNjZXNzb3JzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFnWydpZCddLCAnMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29udGVudHMsICJUaHJlZSIpCisKK2NsYXNzIFRlc3RQcmV2aW91c09wZXJhdGlvbnMoUHJveGltaXR5VGVzdCk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cGVyKFRlc3RQcmV2aW91c09wZXJhdGlvbnMsIHNlbGYpLnNldFVwKCkKKyAgICAgICAgc2VsZi5lbmQgPSBzZWxmLnRyZWUuZmluZCh0ZXh0PSJUaHJlZSIpCisKKyAgICBkZWYgdGVzdF9wcmV2aW91cyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmVuZC5wcmV2aW91c19lbGVtZW50WydpZCddLCAiMyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5lbmQucHJldmlvdXNfZWxlbWVudC5wcmV2aW91c19lbGVtZW50LCAiVHdvIikKKworICAgIGRlZiB0ZXN0X3ByZXZpb3VzX29mX2ZpcnN0X2l0ZW1faXNfbm9uZShzZWxmKToKKyAgICAgICAgZmlyc3QgPSBzZWxmLnRyZWUuZmluZCgnaHRtbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3QucHJldmlvdXNfZWxlbWVudCwgTm9uZSkKKworICAgIGRlZiB0ZXN0X3ByZXZpb3VzX29mX3Jvb3RfaXNfbm9uZShzZWxmKToKKyAgICAgICAgIyBUaGUgZG9jdW1lbnQgcm9vdCBpcyBvdXRzaWRlIHRoZSBuZXh0L3ByZXZpb3VzIGNoYWluLgorICAgICAgICAjIFhYWCBUaGlzIGlzIGJyb2tlbiEKKyAgICAgICAgI3NlbGYuYXNzZXJ0RXF1YWwoc2VsZi50cmVlLnByZXZpb3VzX2VsZW1lbnQsIE5vbmUpCisgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X2ZpbmRfYWxsX3ByZXZpb3VzKHNlbGYpOgorICAgICAgICAjIFRoZSA8Yj4gdGFnIGNvbnRhaW5pbmcgdGhlICJUaHJlZSIgbm9kZSBpcyB0aGUgcHJlZGVjZXNzb3IKKyAgICAgICAgIyBvZiB0aGUgIlRocmVlIiBub2RlIGl0c2VsZiwgd2hpY2ggaXMgd2h5ICJUaHJlZSIgc2hvd3MgdXAKKyAgICAgICAgIyBoZXJlLgorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHMoCisgICAgICAgICAgICBzZWxmLmVuZC5maW5kX2FsbF9wcmV2aW91cygnYicpLCBbIlRocmVlIiwgIlR3byIsICJPbmUiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKHNlbGYuZW5kLmZpbmRfYWxsX3ByZXZpb3VzKGlkPTEpLCBbIk9uZSJdKQorCisgICAgZGVmIHRlc3RfZmluZF9wcmV2aW91cyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmVuZC5maW5kX3ByZXZpb3VzKCdiJylbJ2lkJ10sICczJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmVuZC5maW5kX3ByZXZpb3VzKHRleHQ9Ik9uZSIpLCAiT25lIikKKworICAgIGRlZiB0ZXN0X2ZpbmRfcHJldmlvdXNfZm9yX3RleHRfZWxlbWVudChzZWxmKToKKyAgICAgICAgdGV4dCA9IHNlbGYudHJlZS5maW5kKHRleHQ9IlRocmVlIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXh0LmZpbmRfcHJldmlvdXMoImIiKS5zdHJpbmcsICJUaHJlZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cygKKyAgICAgICAgICAgIHRleHQuZmluZF9hbGxfcHJldmlvdXMoImIiKSwgWyJUaHJlZSIsICJUd28iLCAiT25lIl0pCisKKyAgICBkZWYgdGVzdF9wcmV2aW91c19nZW5lcmF0b3Ioc2VsZik6CisgICAgICAgIHN0YXJ0ID0gc2VsZi50cmVlLmZpbmQodGV4dD0iT25lIikKKyAgICAgICAgcHJlZGVjZXNzb3JzID0gW25vZGUgZm9yIG5vZGUgaW4gc3RhcnQucHJldmlvdXNfZWxlbWVudHNdCisKKyAgICAgICAgIyBUaGVyZSBhcmUgZm91ciBwcmVkZWNlc3NvcnM6IHRoZSA8Yj4gdGFnIGNvbnRhaW5pbmcgIk9uZSIKKyAgICAgICAgIyB0aGUgPGJvZHk+IHRhZywgdGhlIDxoZWFkPiB0YWcsIGFuZCB0aGUgPGh0bWw+IHRhZy4KKyAgICAgICAgYiwgYm9keSwgaGVhZCwgaHRtbCA9IHByZWRlY2Vzc29ycworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbJ2lkJ10sICcxJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChib2R5Lm5hbWUsICJib2R5IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoZWFkLm5hbWUsICJoZWFkIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChodG1sLm5hbWUsICJodG1sIikKKworCitjbGFzcyBTaWJsaW5nVGVzdChUcmVlVGVzdCk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cGVyKFNpYmxpbmdUZXN0LCBzZWxmKS5zZXRVcCgpCisgICAgICAgIG1hcmt1cCA9ICcnJzxodG1sPgorICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iMSI+CisgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iMS4xIj48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9IjIiPgorICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9IjIuMSI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CisgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSIzIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSIzLjEiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgorICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iNCI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICA8L2h0bWw+JycnCisgICAgICAgICMgQWxsIHRoYXQgd2hpdGVzcGFjZSBsb29rcyBnb29kIGJ1dCBtYWtlcyB0aGUgdGVzdHMgbW9yZQorICAgICAgICAjIGRpZmZpY3VsdC4gR2V0IHJpZCBvZiBpdC4KKyAgICAgICAgbWFya3VwID0gcmUuY29tcGlsZSgiXG5ccyoiKS5zdWIoIiIsIG1hcmt1cCkKKyAgICAgICAgc2VsZi50cmVlID0gc2VsZi5zb3VwKG1hcmt1cCkKKworCitjbGFzcyBUZXN0TmV4dFNpYmxpbmcoU2libGluZ1Rlc3QpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBlcihUZXN0TmV4dFNpYmxpbmcsIHNlbGYpLnNldFVwKCkKKyAgICAgICAgc2VsZi5zdGFydCA9IHNlbGYudHJlZS5maW5kKGlkPSIxIikKKworICAgIGRlZiB0ZXN0X25leHRfc2libGluZ19vZl9yb290X2lzX25vbmUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50cmVlLm5leHRfc2libGluZywgTm9uZSkKKworICAgIGRlZiB0ZXN0X25leHRfc2libGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnN0YXJ0Lm5leHRfc2libGluZ1snaWQnXSwgJzInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3RhcnQubmV4dF9zaWJsaW5nLm5leHRfc2libGluZ1snaWQnXSwgJzMnKQorCisgICAgICAgICMgTm90ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIG5leHRfc2libGluZyBhbmQgbmV4dF9lbGVtZW50LgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3RhcnQubmV4dF9lbGVtZW50WydpZCddLCAnMS4xJykKKworICAgIGRlZiB0ZXN0X25leHRfc2libGluZ19tYXlfbm90X2V4aXN0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHJlZS5odG1sLm5leHRfc2libGluZywgTm9uZSkKKworICAgICAgICBuZXN0ZWRfc3BhbiA9IHNlbGYudHJlZS5maW5kKGlkPSIxLjEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5lc3RlZF9zcGFuLm5leHRfc2libGluZywgTm9uZSkKKworICAgICAgICBsYXN0X3NwYW4gPSBzZWxmLnRyZWUuZmluZChpZD0iNCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGFzdF9zcGFuLm5leHRfc2libGluZywgTm9uZSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfbmV4dF9zaWJsaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3RhcnQuZmluZF9uZXh0X3NpYmxpbmcoJ3NwYW4nKVsnaWQnXSwgJzInKQorCisgICAgZGVmIHRlc3RfbmV4dF9zaWJsaW5ncyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzSURzKHNlbGYuc3RhcnQuZmluZF9uZXh0X3NpYmxpbmdzKCJzcGFuIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJzInLCAnMycsICc0J10pCisKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzSURzKHNlbGYuc3RhcnQuZmluZF9uZXh0X3NpYmxpbmdzKGlkPSczJyksIFsnMyddKQorCisgICAgZGVmIHRlc3RfbmV4dF9zaWJsaW5nX2Zvcl90ZXh0X2VsZW1lbnQoc2VsZik6CisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIkZvbzxiPmJhcjwvYj5iYXoiKQorICAgICAgICBzdGFydCA9IHNvdXAuZmluZCh0ZXh0PSJGb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXJ0Lm5leHRfc2libGluZy5uYW1lLCAnYicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhcnQubmV4dF9zaWJsaW5nLm5leHRfc2libGluZywgJ2JheicpCisKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKHN0YXJ0LmZpbmRfbmV4dF9zaWJsaW5ncygnYicpLCBbJ2JhciddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXJ0LmZpbmRfbmV4dF9zaWJsaW5nKHRleHQ9ImJheiIpLCAiYmF6IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGFydC5maW5kX25leHRfc2libGluZyh0ZXh0PSJub25lc3VjaCIpLCBOb25lKQorCisKK2NsYXNzIFRlc3RQcmV2aW91c1NpYmxpbmcoU2libGluZ1Rlc3QpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBlcihUZXN0UHJldmlvdXNTaWJsaW5nLCBzZWxmKS5zZXRVcCgpCisgICAgICAgIHNlbGYuZW5kID0gc2VsZi50cmVlLmZpbmQoaWQ9IjQiKQorCisgICAgZGVmIHRlc3RfcHJldmlvdXNfc2libGluZ19vZl9yb290X2lzX25vbmUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50cmVlLnByZXZpb3VzX3NpYmxpbmcsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9wcmV2aW91c19zaWJsaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZW5kLnByZXZpb3VzX3NpYmxpbmdbJ2lkJ10sICczJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmVuZC5wcmV2aW91c19zaWJsaW5nLnByZXZpb3VzX3NpYmxpbmdbJ2lkJ10sICcyJykKKworICAgICAgICAjIE5vdGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBwcmV2aW91c19zaWJsaW5nIGFuZCBwcmV2aW91c19lbGVtZW50LgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZW5kLnByZXZpb3VzX2VsZW1lbnRbJ2lkJ10sICczLjEnKQorCisgICAgZGVmIHRlc3RfcHJldmlvdXNfc2libGluZ19tYXlfbm90X2V4aXN0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHJlZS5odG1sLnByZXZpb3VzX3NpYmxpbmcsIE5vbmUpCisKKyAgICAgICAgbmVzdGVkX3NwYW4gPSBzZWxmLnRyZWUuZmluZChpZD0iMS4xIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXN0ZWRfc3Bhbi5wcmV2aW91c19zaWJsaW5nLCBOb25lKQorCisgICAgICAgIGZpcnN0X3NwYW4gPSBzZWxmLnRyZWUuZmluZChpZD0iMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3Rfc3Bhbi5wcmV2aW91c19zaWJsaW5nLCBOb25lKQorCisgICAgZGVmIHRlc3RfZmluZF9wcmV2aW91c19zaWJsaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZW5kLmZpbmRfcHJldmlvdXNfc2libGluZygnc3BhbicpWydpZCddLCAnMycpCisKKyAgICBkZWYgdGVzdF9wcmV2aW91c19zaWJsaW5ncyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzSURzKHNlbGYuZW5kLmZpbmRfcHJldmlvdXNfc2libGluZ3MoInNwYW4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnMycsICcyJywgJzEnXSkKKworICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHNJRHMoc2VsZi5lbmQuZmluZF9wcmV2aW91c19zaWJsaW5ncyhpZD0nMScpLCBbJzEnXSkKKworICAgIGRlZiB0ZXN0X3ByZXZpb3VzX3NpYmxpbmdfZm9yX3RleHRfZWxlbWVudChzZWxmKToKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiRm9vPGI+YmFyPC9iPmJheiIpCisgICAgICAgIHN0YXJ0ID0gc291cC5maW5kKHRleHQ9ImJheiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhcnQucHJldmlvdXNfc2libGluZy5uYW1lLCAnYicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhcnQucHJldmlvdXNfc2libGluZy5wcmV2aW91c19zaWJsaW5nLCAnRm9vJykKKworICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHMoc3RhcnQuZmluZF9wcmV2aW91c19zaWJsaW5ncygnYicpLCBbJ2JhciddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXJ0LmZpbmRfcHJldmlvdXNfc2libGluZyh0ZXh0PSJGb28iKSwgIkZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhcnQuZmluZF9wcmV2aW91c19zaWJsaW5nKHRleHQ9Im5vbmVzdWNoIiksIE5vbmUpCisKKworY2xhc3MgVGVzdFRhZ0NyZWF0aW9uKFNvdXBUZXN0KToKKyAgICAiIiJUZXN0IHRoZSBhYmlsaXR5IHRvIGNyZWF0ZSBuZXcgdGFncy4iIiIKKyAgICBkZWYgdGVzdF9uZXdfdGFnKHNlbGYpOgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCIiKQorICAgICAgICBuZXdfdGFnID0gc291cC5uZXdfdGFnKCJmb28iLCBiYXI9ImJheiIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG5ld190YWcsIFRhZykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImZvbyIsIG5ld190YWcubmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWN0KGJhcj0iYmF6IiksIG5ld190YWcuYXR0cnMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgbmV3X3RhZy5wYXJlbnQpCisKKyAgICBkZWYgdGVzdF90YWdfaW5oZXJpdHNfc2VsZl9jbG9zaW5nX3J1bGVzX2Zyb21fYnVpbGRlcihzZWxmKToKKyAgICAgICAgaWYgWE1MX0JVSUxERVJfUFJFU0VOVDoKKyAgICAgICAgICAgIHhtbF9zb3VwID0gQmVhdXRpZnVsU291cCgiIiwgInhtbCIpCisgICAgICAgICAgICB4bWxfYnIgPSB4bWxfc291cC5uZXdfdGFnKCJiciIpCisgICAgICAgICAgICB4bWxfcCA9IHhtbF9zb3VwLm5ld190YWcoInAiKQorCisgICAgICAgICAgICAjIEJvdGggdGhlIDxicj4gYW5kIDxwPiB0YWcgYXJlIGVtcHR5LWVsZW1lbnQsIGp1c3QgYmVjYXVzZQorICAgICAgICAgICAgIyB0aGV5IGhhdmUgbm8gY29udGVudHMuCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiPGJyLz4iLCB4bWxfYnIuZW5jb2RlKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiPHAvPiIsIHhtbF9wLmVuY29kZSgpKQorCisgICAgICAgIGh0bWxfc291cCA9IEJlYXV0aWZ1bFNvdXAoIiIsICJodG1sIikKKyAgICAgICAgaHRtbF9iciA9IGh0bWxfc291cC5uZXdfdGFnKCJiciIpCisgICAgICAgIGh0bWxfcCA9IGh0bWxfc291cC5uZXdfdGFnKCJwIikKKworICAgICAgICAjIFRoZSBIVE1MIGJ1aWxkZXIgdXNlcnMgSFRNTCdzIHJ1bGVzIGFib3V0IHdoaWNoIHRhZ3MgYXJlCisgICAgICAgICMgZW1wdHktZWxlbWVudCB0YWdzLCBhbmQgdGhlIG5ldyB0YWdzIHJlZmxlY3QgdGhlc2UgcnVsZXMuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiI8YnIvPiIsIGh0bWxfYnIuZW5jb2RlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiI8cD48L3A+IiwgaHRtbF9wLmVuY29kZSgpKQorCisgICAgZGVmIHRlc3RfbmV3X3N0cmluZ19jcmVhdGVzX25hdmlnYWJsZXN0cmluZyhzZWxmKToKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiIikKKyAgICAgICAgcyA9IHNvdXAubmV3X3N0cmluZygiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiZm9vIiwgcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UocywgTmF2aWdhYmxlU3RyaW5nKSkKKworICAgIGRlZiB0ZXN0X25ld19zdHJpbmdfY2FuX2NyZWF0ZV9uYXZpZ2FibGVzdHJpbmdfc3ViY2xhc3Moc2VsZik6CisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIiIpCisgICAgICAgIHMgPSBzb3VwLm5ld19zdHJpbmcoImZvbyIsIENvbW1lbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImZvbyIsIHMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHMsIENvbW1lbnQpKQorCitjbGFzcyBUZXN0VHJlZU1vZGlmaWNhdGlvbihTb3VwVGVzdCk6CisKKyAgICBkZWYgdGVzdF9hdHRyaWJ1dGVfbW9kaWZpY2F0aW9uKHNlbGYpOgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCc8YSBpZD0iMSI+PC9hPicpCisgICAgICAgIHNvdXAuYVsnaWQnXSA9IDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3VwLmRlY29kZSgpLCBzZWxmLmRvY3VtZW50X2ZvcignPGEgaWQ9IjIiPjwvYT4nKSkKKyAgICAgICAgZGVsKHNvdXAuYVsnaWQnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3VwLmRlY29kZSgpLCBzZWxmLmRvY3VtZW50X2ZvcignPGE+PC9hPicpKQorICAgICAgICBzb3VwLmFbJ2lkMiddID0gJ2ZvbycKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3VwLmRlY29kZSgpLCBzZWxmLmRvY3VtZW50X2ZvcignPGEgaWQyPSJmb28iPjwvYT4nKSkKKworICAgIGRlZiB0ZXN0X25ld190YWdfY3JlYXRpb24oc2VsZik6CisgICAgICAgIGJ1aWxkZXIgPSBidWlsZGVyX3JlZ2lzdHJ5Lmxvb2t1cCgnaHRtbCcpKCkKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiPGJvZHk+PC9ib2R5PiIsIGJ1aWxkZXI9YnVpbGRlcikKKyAgICAgICAgYSA9IFRhZyhzb3VwLCBidWlsZGVyLCAnYScpCisgICAgICAgIG9sID0gVGFnKHNvdXAsIGJ1aWxkZXIsICdvbCcpCisgICAgICAgIGFbJ2hyZWYnXSA9ICdodHRwOi8vZm9vLmNvbS8nCisgICAgICAgIHNvdXAuYm9keS5pbnNlcnQoMCwgYSkKKyAgICAgICAgc291cC5ib2R5Lmluc2VydCgxLCBvbCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNvdXAuYm9keS5lbmNvZGUoKSwKKyAgICAgICAgICAgIGInPGJvZHk+PGEgaHJlZj0iaHR0cDovL2Zvby5jb20vIj48L2E+PG9sPjwvb2w+PC9ib2R5PicpCisKKyAgICBkZWYgdGVzdF9hcHBlbmRfdG9fY29udGVudHNfbW92ZXNfdGFnKHNlbGYpOgorICAgICAgICBkb2MgPSAiIiI8cCBpZD0iMSI+RG9uJ3QgbGVhdmUgbWUgPGI+aGVyZTwvYj4uPC9wPgorICAgICAgICAgICAgICAgIDxwIGlkPSIyIj5Eb25cJ3QgbGVhdmUhPC9wPiIiIgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKGRvYykKKyAgICAgICAgc2Vjb25kX3BhcmEgPSBzb3VwLmZpbmQoaWQ9JzInKQorICAgICAgICBib2xkID0gc291cC5iCisKKyAgICAgICAgIyBNb3ZlIHRoZSA8Yj4gdGFnIHRvIHRoZSBlbmQgb2YgdGhlIHNlY29uZCBwYXJhZ3JhcGguCisgICAgICAgIHNvdXAuZmluZChpZD0nMicpLmFwcGVuZChzb3VwLmIpCisKKyAgICAgICAgIyBUaGUgPGI+IHRhZyBpcyBub3cgYSBjaGlsZCBvZiB0aGUgc2Vjb25kIHBhcmFncmFwaC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChib2xkLnBhcmVudCwgc2Vjb25kX3BhcmEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNvdXAuZGVjb2RlKCksIHNlbGYuZG9jdW1lbnRfZm9yKAorICAgICAgICAgICAgICAgICc8cCBpZD0iMSI+RG9uXCd0IGxlYXZlIG1lIC48L3A+XG4nCisgICAgICAgICAgICAgICAgJzxwIGlkPSIyIj5Eb25cJ3QgbGVhdmUhPGI+aGVyZTwvYj48L3A+JykpCisKKyAgICBkZWYgdGVzdF9yZXBsYWNlX3dpdGhfcmV0dXJuc190aGluZ190aGF0X3dhc19yZXBsYWNlZChzZWxmKToKKyAgICAgICAgdGV4dCA9ICI8YT48L2E+PGI+PGM+PC9jPjwvYj4iCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAodGV4dCkKKyAgICAgICAgYSA9IHNvdXAuYQorICAgICAgICBuZXdfYSA9IGEucmVwbGFjZV93aXRoKHNvdXAuYykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBuZXdfYSkKKworICAgIGRlZiB0ZXN0X3Vud3JhcF9yZXR1cm5zX3RoaW5nX3RoYXRfd2FzX3JlcGxhY2VkKHNlbGYpOgorICAgICAgICB0ZXh0ID0gIjxhPjxiPjwvYj48Yz48L2M+PC9hPiIKKyAgICAgICAgc291cCA9IHNlbGYuc291cCh0ZXh0KQorICAgICAgICBhID0gc291cC5hCisgICAgICAgIG5ld19hID0gYS51bndyYXAoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIG5ld19hKQorCisgICAgZGVmIHRlc3RfcmVwbGFjZV90YWdfd2l0aF9pdHNlbGYoc2VsZik6CisgICAgICAgIHRleHQgPSAiPGE+PGI+PC9iPjxjPkZvbzxkPjwvZD48L2M+PC9hPjxhPjxlPjwvZT48L2E+IgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKHRleHQpCisgICAgICAgIGMgPSBzb3VwLmMKKyAgICAgICAgc291cC5jLnJlcGxhY2Vfd2l0aChjKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXAuZGVjb2RlKCksIHNlbGYuZG9jdW1lbnRfZm9yKHRleHQpKQorCisgICAgZGVmIHRlc3RfcmVwbGFjZV90YWdfd2l0aF9pdHNfcGFyZW50X3JhaXNlc19leGNlcHRpb24oc2VsZik6CisgICAgICAgIHRleHQgPSAiPGE+PGI+PC9iPjwvYT4iCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAodGV4dCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc291cC5iLnJlcGxhY2Vfd2l0aCwgc291cC5hKQorCisgICAgZGVmIHRlc3RfaW5zZXJ0X3RhZ19pbnRvX2l0c2VsZl9yYWlzZXNfZXhjZXB0aW9uKHNlbGYpOgorICAgICAgICB0ZXh0ID0gIjxhPjxiPjwvYj48L2E+IgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKHRleHQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNvdXAuYS5pbnNlcnQsIDAsIHNvdXAuYSkKKworICAgIGRlZiB0ZXN0X3JlcGxhY2Vfd2l0aF9tYWludGFpbnNfbmV4dF9lbGVtZW50X3Rocm91Z2hvdXQoc2VsZik6CisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoJzxwPjxhPm9uZTwvYT48Yj50aHJlZTwvYj48L3A+JykKKyAgICAgICAgYSA9IHNvdXAuYQorICAgICAgICBiID0gYS5jb250ZW50c1swXQorICAgICAgICAjIE1ha2UgaXQgc28gdGhlIDxhPiB0YWcgaGFzIHR3byB0ZXh0IGNoaWxkcmVuLgorICAgICAgICBhLmluc2VydCgxLCAidHdvIikKKworICAgICAgICAjIE5vdyByZXBsYWNlIGVhY2ggb25lIHdpdGggdGhlIGVtcHR5IHN0cmluZy4KKyAgICAgICAgbGVmdCwgcmlnaHQgPSBhLmNvbnRlbnRzCisgICAgICAgIGxlZnQucmVwbGFjZVdpdGgoJycpCisgICAgICAgIHJpZ2h0LnJlcGxhY2VXaXRoKCcnKQorCisgICAgICAgICMgVGhlIDxiPiB0YWcgaXMgc3RpbGwgY29ubmVjdGVkIHRvIHRoZSB0cmVlLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJ0aHJlZSIsIHNvdXAuYi5zdHJpbmcpCisKKyAgICBkZWYgdGVzdF9yZXBsYWNlX2ZpbmFsX25vZGUoc2VsZik6CisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIjxiPkFyZ2ghPC9iPiIpCisgICAgICAgIHNvdXAuZmluZCh0ZXh0PSJBcmdoISIpLnJlcGxhY2Vfd2l0aCgiSG9vcmF5ISIpCisgICAgICAgIG5ld190ZXh0ID0gc291cC5maW5kKHRleHQ9Ikhvb3JheSEiKQorICAgICAgICBiID0gc291cC5iCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV3X3RleHQucHJldmlvdXNfZWxlbWVudCwgYikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXdfdGV4dC5wYXJlbnQsIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV3X3RleHQucHJldmlvdXNfZWxlbWVudC5uZXh0X2VsZW1lbnQsIG5ld190ZXh0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld190ZXh0Lm5leHRfZWxlbWVudCwgTm9uZSkKKworICAgIGRlZiB0ZXN0X2NvbnNlY3V0aXZlX3RleHRfbm9kZXMoc2VsZik6CisgICAgICAgICMgQSBidWlsZGVyIHNob3VsZCBuZXZlciBjcmVhdGUgdHdvIGNvbnNlY3V0aXZlIHRleHQgbm9kZXMsCisgICAgICAgICMgYnV0IGlmIHlvdSBpbnNlcnQgb25lIG5leHQgdG8gYW5vdGhlciwgQmVhdXRpZnVsIFNvdXAgd2lsbAorICAgICAgICAjIGhhbmRsZSBpdCBjb3JyZWN0bHkuCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIjxhPjxiPkFyZ2ghPC9iPjxjPjwvYz48L2E+IikKKyAgICAgICAgc291cC5iLmluc2VydCgxLCAiSG9vcmF5ISIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNvdXAuZGVjb2RlKCksIHNlbGYuZG9jdW1lbnRfZm9yKAorICAgICAgICAgICAgICAgICI8YT48Yj5BcmdoIUhvb3JheSE8L2I+PGM+PC9jPjwvYT4iKSkKKworICAgICAgICBuZXdfdGV4dCA9IHNvdXAuZmluZCh0ZXh0PSJIb29yYXkhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXdfdGV4dC5wcmV2aW91c19lbGVtZW50LCAiQXJnaCEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld190ZXh0LnByZXZpb3VzX2VsZW1lbnQubmV4dF9lbGVtZW50LCBuZXdfdGV4dCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld190ZXh0LnByZXZpb3VzX3NpYmxpbmcsICJBcmdoISIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV3X3RleHQucHJldmlvdXNfc2libGluZy5uZXh0X3NpYmxpbmcsIG5ld190ZXh0KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV3X3RleHQubmV4dF9zaWJsaW5nLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld190ZXh0Lm5leHRfZWxlbWVudCwgc291cC5jKQorCisgICAgZGVmIHRlc3RfaW5zZXJ0X3N0cmluZyhzZWxmKToKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiPGE+PC9hPiIpCisgICAgICAgIHNvdXAuYS5pbnNlcnQoMCwgImJhciIpCisgICAgICAgIHNvdXAuYS5pbnNlcnQoMCwgImZvbyIpCisgICAgICAgICMgVGhlIHN0cmluZyB3ZXJlIGFkZGVkIHRvIHRoZSB0YWcuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyJmb28iLCAiYmFyIl0sIHNvdXAuYS5jb250ZW50cykKKyAgICAgICAgIyBBbmQgdGhleSB3ZXJlIGNvbnZlcnRlZCB0byBOYXZpZ2FibGVTdHJpbmdzLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXAuYS5jb250ZW50c1swXS5uZXh0X2VsZW1lbnQsICJiYXIiKQorCisgICAgZGVmIHRlc3RfaW5zZXJ0X3RhZyhzZWxmKToKKyAgICAgICAgYnVpbGRlciA9IHNlbGYuZGVmYXVsdF9idWlsZGVyCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoCisgICAgICAgICAgICAiPGE+PGI+RmluZDwvYj48Yz5sYWR5ITwvYz48ZD48L2Q+PC9hPiIsIGJ1aWxkZXI9YnVpbGRlcikKKyAgICAgICAgbWFnaWNfdGFnID0gVGFnKHNvdXAsIGJ1aWxkZXIsICdtYWdpY3RhZycpCisgICAgICAgIG1hZ2ljX3RhZy5pbnNlcnQoMCwgInRoZSIpCisgICAgICAgIHNvdXAuYS5pbnNlcnQoMSwgbWFnaWNfdGFnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzb3VwLmRlY29kZSgpLCBzZWxmLmRvY3VtZW50X2ZvcigKKyAgICAgICAgICAgICAgICAiPGE+PGI+RmluZDwvYj48bWFnaWN0YWc+dGhlPC9tYWdpY3RhZz48Yz5sYWR5ITwvYz48ZD48L2Q+PC9hPiIpKQorCisgICAgICAgICMgTWFrZSBzdXJlIGFsbCB0aGUgcmVsYXRpb25zaGlwcyBhcmUgaG9va2VkIHVwIGNvcnJlY3RseS4KKyAgICAgICAgYl90YWcgPSBzb3VwLmIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiX3RhZy5uZXh0X3NpYmxpbmcsIG1hZ2ljX3RhZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYWdpY190YWcucHJldmlvdXNfc2libGluZywgYl90YWcpCisKKyAgICAgICAgZmluZCA9IGJfdGFnLmZpbmQodGV4dD0iRmluZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmluZC5uZXh0X2VsZW1lbnQsIG1hZ2ljX3RhZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYWdpY190YWcucHJldmlvdXNfZWxlbWVudCwgZmluZCkKKworICAgICAgICBjX3RhZyA9IHNvdXAuYworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hZ2ljX3RhZy5uZXh0X3NpYmxpbmcsIGNfdGFnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNfdGFnLnByZXZpb3VzX3NpYmxpbmcsIG1hZ2ljX3RhZykKKworICAgICAgICB0aGUgPSBtYWdpY190YWcuZmluZCh0ZXh0PSJ0aGUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRoZS5wYXJlbnQsIG1hZ2ljX3RhZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aGUubmV4dF9lbGVtZW50LCBjX3RhZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjX3RhZy5wcmV2aW91c19lbGVtZW50LCB0aGUpCisKKyAgICBkZWYgdGVzdF9hcHBlbmRfY2hpbGRfdGhhdHNfYWxyZWFkeV9hdF90aGVfZW5kKHNlbGYpOgorICAgICAgICBkYXRhID0gIjxhPjxiPjwvYj48L2E+IgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKGRhdGEpCisgICAgICAgIHNvdXAuYS5hcHBlbmQoc291cC5iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIHNvdXAuZGVjb2RlKCkpCisKKyAgICBkZWYgdGVzdF9tb3ZlX3RhZ190b19iZWdpbm5pbmdfb2ZfcGFyZW50KHNlbGYpOgorICAgICAgICBkYXRhID0gIjxhPjxiPjwvYj48Yz48L2M+PGQ+PC9kPjwvYT4iCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoZGF0YSkKKyAgICAgICAgc291cC5hLmluc2VydCgwLCBzb3VwLmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIjxhPjxkPjwvZD48Yj48L2I+PGM+PC9jPjwvYT4iLCBzb3VwLmRlY29kZSgpKQorCisgICAgZGVmIHRlc3RfaW5zZXJ0X3dvcmtzX29uX2VtcHR5X2VsZW1lbnRfdGFnKHNlbGYpOgorICAgICAgICAjIFRoaXMgaXMgYSBsaXR0bGUgc3RyYW5nZSwgc2luY2UgbW9zdCBIVE1MIHBhcnNlcnMgZG9uJ3QgYWxsb3cKKyAgICAgICAgIyBtYXJrdXAgbGlrZSB0aGlzIHRvIGNvbWUgdGhyb3VnaC4gQnV0IGluIGdlbmVyYWwsIHdlIGRvbid0CisgICAgICAgICMga25vdyB3aGF0IHRoZSBwYXJzZXIgd291bGQgb3Igd291bGRuJ3QgaGF2ZSBhbGxvd2VkLCBzbworICAgICAgICAjIEknbSBsZXR0aW5nIHRoaXMgc3VjY2VlZCBmb3Igbm93LgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCI8YnIvPiIpCisgICAgICAgIHNvdXAuYnIuaW5zZXJ0KDEsICJDb250ZW50cyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHNvdXAuYnIpLCAiPGJyPkNvbnRlbnRzPC9icj4iKQorCisgICAgZGVmIHRlc3RfaW5zZXJ0X2JlZm9yZShzZWxmKToKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiPGE+Zm9vPC9hPjxiPmJhcjwvYj4iKQorICAgICAgICBzb3VwLmIuaW5zZXJ0X2JlZm9yZSgiQkFaIikKKyAgICAgICAgc291cC5hLmluc2VydF9iZWZvcmUoIlFVVVgiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc291cC5kZWNvZGUoKSwgc2VsZi5kb2N1bWVudF9mb3IoIlFVVVg8YT5mb288L2E+QkFaPGI+YmFyPC9iPiIpKQorCisgICAgICAgIHNvdXAuYS5pbnNlcnRfYmVmb3JlKHNvdXAuYikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNvdXAuZGVjb2RlKCksIHNlbGYuZG9jdW1lbnRfZm9yKCJRVVVYPGI+YmFyPC9iPjxhPmZvbzwvYT5CQVoiKSkKKworICAgIGRlZiB0ZXN0X2luc2VydF9hZnRlcihzZWxmKToKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiPGE+Zm9vPC9hPjxiPmJhcjwvYj4iKQorICAgICAgICBzb3VwLmIuaW5zZXJ0X2FmdGVyKCJCQVoiKQorICAgICAgICBzb3VwLmEuaW5zZXJ0X2FmdGVyKCJRVVVYIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNvdXAuZGVjb2RlKCksIHNlbGYuZG9jdW1lbnRfZm9yKCI8YT5mb288L2E+UVVVWDxiPmJhcjwvYj5CQVoiKSkKKyAgICAgICAgc291cC5iLmluc2VydF9hZnRlcihzb3VwLmEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzb3VwLmRlY29kZSgpLCBzZWxmLmRvY3VtZW50X2ZvcigiUVVVWDxiPmJhcjwvYj48YT5mb288L2E+QkFaIikpCisKKyAgICBkZWYgdGVzdF9pbnNlcnRfYWZ0ZXJfcmFpc2VzX2V4Y2VwdGlvbl9pZl9hZnRlcl9oYXNfbm9fbWVhbmluZyhzZWxmKToKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiIikKKyAgICAgICAgdGFnID0gc291cC5uZXdfdGFnKCJhIikKKyAgICAgICAgc3RyaW5nID0gc291cC5uZXdfc3RyaW5nKCIiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzdHJpbmcuaW5zZXJ0X2FmdGVyLCB0YWcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIHNvdXAuaW5zZXJ0X2FmdGVyLCB0YWcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRhZy5pbnNlcnRfYWZ0ZXIsIHRhZykKKworICAgIGRlZiB0ZXN0X2luc2VydF9iZWZvcmVfcmFpc2VzX25vdGltcGxlbWVudGVkZXJyb3JfaWZfYmVmb3JlX2hhc19ub19tZWFuaW5nKHNlbGYpOgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCIiKQorICAgICAgICB0YWcgPSBzb3VwLm5ld190YWcoImEiKQorICAgICAgICBzdHJpbmcgPSBzb3VwLm5ld19zdHJpbmcoIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHN0cmluZy5pbnNlcnRfYmVmb3JlLCB0YWcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIHNvdXAuaW5zZXJ0X2JlZm9yZSwgdGFnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0YWcuaW5zZXJ0X2JlZm9yZSwgdGFnKQorCisgICAgZGVmIHRlc3RfcmVwbGFjZV93aXRoKHNlbGYpOgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKAorICAgICAgICAgICAgICAgICI8cD5UaGVyZSdzIDxiPm5vPC9iPiBidXNpbmVzcyBsaWtlIDxiPnNob3c8L2I+IGJ1c2luZXNzPC9wPiIpCisgICAgICAgIG5vLCBzaG93ID0gc291cC5maW5kX2FsbCgnYicpCisgICAgICAgIHNob3cucmVwbGFjZV93aXRoKG5vKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc291cC5kZWNvZGUoKSwKKyAgICAgICAgICAgIHNlbGYuZG9jdW1lbnRfZm9yKAorICAgICAgICAgICAgICAgICI8cD5UaGVyZSdzICBidXNpbmVzcyBsaWtlIDxiPm5vPC9iPiBidXNpbmVzczwvcD4iKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNob3cucGFyZW50LCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5vLnBhcmVudCwgc291cC5wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5vLm5leHRfZWxlbWVudCwgIm5vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuby5uZXh0X3NpYmxpbmcsICIgYnVzaW5lc3MiKQorCisgICAgZGVmIHRlc3RfcmVwbGFjZV9maXJzdF9jaGlsZChzZWxmKToKKyAgICAgICAgZGF0YSA9ICI8YT48Yj48L2I+PGM+PC9jPjwvYT4iCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoZGF0YSkKKyAgICAgICAgc291cC5iLnJlcGxhY2Vfd2l0aChzb3VwLmMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIjxhPjxjPjwvYz48L2E+Iiwgc291cC5kZWNvZGUoKSkKKworICAgIGRlZiB0ZXN0X3JlcGxhY2VfbGFzdF9jaGlsZChzZWxmKToKKyAgICAgICAgZGF0YSA9ICI8YT48Yj48L2I+PGM+PC9jPjwvYT4iCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoZGF0YSkKKyAgICAgICAgc291cC5jLnJlcGxhY2Vfd2l0aChzb3VwLmIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIjxhPjxiPjwvYj48L2E+Iiwgc291cC5kZWNvZGUoKSkKKworICAgIGRlZiB0ZXN0X25lc3RlZF90YWdfcmVwbGFjZV93aXRoKHNlbGYpOgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKAorICAgICAgICAgICAgIiIiPGE+V2U8Yj5yZXNlcnZlPGM+dGhlPC9jPjxkPnJpZ2h0PC9kPjwvYj48L2E+PGU+dG88Zj5yZWZ1c2U8L2Y+PGc+c2VydmljZTwvZz48L2U+IiIiKQorCisgICAgICAgICMgUmVwbGFjZSB0aGUgZW50aXJlIDxiPiB0YWcgYW5kIGl0cyBjb250ZW50cyAoInJlc2VydmUgdGhlCisgICAgICAgICMgcmlnaHQiKSB3aXRoIHRoZSA8Zj4gdGFnICgicmVmdXNlIikuCisgICAgICAgIHJlbW92ZV90YWcgPSBzb3VwLmIKKyAgICAgICAgbW92ZV90YWcgPSBzb3VwLmYKKyAgICAgICAgcmVtb3ZlX3RhZy5yZXBsYWNlX3dpdGgobW92ZV90YWcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNvdXAuZGVjb2RlKCksIHNlbGYuZG9jdW1lbnRfZm9yKAorICAgICAgICAgICAgICAgICI8YT5XZTxmPnJlZnVzZTwvZj48L2E+PGU+dG88Zz5zZXJ2aWNlPC9nPjwvZT4iKSkKKworICAgICAgICAjIFRoZSA8Yj4gdGFnIGlzIG5vdyBhbiBvcnBoYW4uCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVtb3ZlX3RhZy5wYXJlbnQsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVtb3ZlX3RhZy5maW5kKHRleHQ9InJpZ2h0IikubmV4dF9lbGVtZW50LCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlbW92ZV90YWcucHJldmlvdXNfZWxlbWVudCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZW1vdmVfdGFnLm5leHRfc2libGluZywgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZW1vdmVfdGFnLnByZXZpb3VzX3NpYmxpbmcsIE5vbmUpCisKKyAgICAgICAgIyBUaGUgPGY+IHRhZyBpcyBub3cgY29ubmVjdGVkIHRvIHRoZSA8YT4gdGFnLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vdmVfdGFnLnBhcmVudCwgc291cC5hKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vdmVfdGFnLnByZXZpb3VzX2VsZW1lbnQsICJXZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW92ZV90YWcubmV4dF9lbGVtZW50Lm5leHRfZWxlbWVudCwgc291cC5lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vdmVfdGFnLm5leHRfc2libGluZywgTm9uZSkKKworICAgICAgICAjIFRoZSBnYXAgd2hlcmUgdGhlIDxmPiB0YWcgdXNlZCB0byBiZSBoYXMgYmVlbiBtZW5kZWQsIGFuZAorICAgICAgICAjIHRoZSB3b3JkICJ0byIgaXMgbm93IGNvbm5lY3RlZCB0byB0aGUgPGc+IHRhZy4KKyAgICAgICAgdG9fdGV4dCA9IHNvdXAuZmluZCh0ZXh0PSJ0byIpCisgICAgICAgIGdfdGFnID0gc291cC5nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodG9fdGV4dC5uZXh0X2VsZW1lbnQsIGdfdGFnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRvX3RleHQubmV4dF9zaWJsaW5nLCBnX3RhZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnX3RhZy5wcmV2aW91c19lbGVtZW50LCB0b190ZXh0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdfdGFnLnByZXZpb3VzX3NpYmxpbmcsIHRvX3RleHQpCisKKyAgICBkZWYgdGVzdF91bndyYXAoc2VsZik6CisgICAgICAgIHRyZWUgPSBzZWxmLnNvdXAoIiIiCisgICAgICAgICAgICA8cD5Vbm5lZWRlZCA8ZW0+Zm9ybWF0dGluZzwvZW0+IGlzIHVubmVlZGVkPC9wPgorICAgICAgICAgICAgIiIiKQorICAgICAgICB0cmVlLmVtLnVud3JhcCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHJlZS5lbSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cmVlLnAudGV4dCwgIlVubmVlZGVkIGZvcm1hdHRpbmcgaXMgdW5uZWVkZWQiKQorCisgICAgZGVmIHRlc3Rfd3JhcChzZWxmKToKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiSSB3aXNoIEkgd2FzIGJvbGQuIikKKyAgICAgICAgdmFsdWUgPSBzb3VwLnN0cmluZy53cmFwKHNvdXAubmV3X3RhZygiYiIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlLmRlY29kZSgpLCAiPGI+SSB3aXNoIEkgd2FzIGJvbGQuPC9iPiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzb3VwLmRlY29kZSgpLCBzZWxmLmRvY3VtZW50X2ZvcigiPGI+SSB3aXNoIEkgd2FzIGJvbGQuPC9iPiIpKQorCisgICAgZGVmIHRlc3Rfd3JhcF9leHRyYWN0c190YWdfZnJvbV9lbHNld2hlcmUoc2VsZik6CisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIjxiPjwvYj5JIHdpc2ggSSB3YXMgYm9sZC4iKQorICAgICAgICBzb3VwLmIubmV4dF9zaWJsaW5nLndyYXAoc291cC5iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc291cC5kZWNvZGUoKSwgc2VsZi5kb2N1bWVudF9mb3IoIjxiPkkgd2lzaCBJIHdhcyBib2xkLjwvYj4iKSkKKworICAgIGRlZiB0ZXN0X3dyYXBfcHV0c19uZXdfY29udGVudHNfYXRfdGhlX2VuZChzZWxmKToKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiPGI+SSBsaWtlIGJlaW5nIGJvbGQuPC9iPkkgd2lzaCBJIHdhcyBib2xkLiIpCisgICAgICAgIHNvdXAuYi5uZXh0X3NpYmxpbmcud3JhcChzb3VwLmIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgbGVuKHNvdXAuYi5jb250ZW50cykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzb3VwLmRlY29kZSgpLCBzZWxmLmRvY3VtZW50X2ZvcigKKyAgICAgICAgICAgICAgICAiPGI+SSBsaWtlIGJlaW5nIGJvbGQuSSB3aXNoIEkgd2FzIGJvbGQuPC9iPiIpKQorCisgICAgZGVmIHRlc3RfZXh0cmFjdChzZWxmKToKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgKKyAgICAgICAgICAgICc8aHRtbD48Ym9keT5Tb21lIGNvbnRlbnQuIDxkaXYgaWQ9Im5hdiI+TmF2IGNyYXA8L2Rpdj4gTW9yZSBjb250ZW50LjwvYm9keT48L2h0bWw+JykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzb3VwLmJvZHkuY29udGVudHMpLCAzKQorICAgICAgICBleHRyYWN0ZWQgPSBzb3VwLmZpbmQoaWQ9Im5hdiIpLmV4dHJhY3QoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzb3VwLmRlY29kZSgpLCAiPGh0bWw+PGJvZHk+U29tZSBjb250ZW50LiAgTW9yZSBjb250ZW50LjwvYm9keT48L2h0bWw+IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHRyYWN0ZWQuZGVjb2RlKCksICc8ZGl2IGlkPSJuYXYiPk5hdiBjcmFwPC9kaXY+JykKKworICAgICAgICAjIFRoZSBleHRyYWN0ZWQgdGFnIGlzIG5vdyBhbiBvcnBoYW4uCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNvdXAuYm9keS5jb250ZW50cyksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXh0cmFjdGVkLnBhcmVudCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHRyYWN0ZWQucHJldmlvdXNfZWxlbWVudCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHRyYWN0ZWQubmV4dF9lbGVtZW50Lm5leHRfZWxlbWVudCwgTm9uZSkKKworICAgICAgICAjIFRoZSBnYXAgd2hlcmUgdGhlIGV4dHJhY3RlZCB0YWcgdXNlZCB0byBiZSBoYXMgYmVlbiBtZW5kZWQuCisgICAgICAgIGNvbnRlbnRfMSA9IHNvdXAuZmluZCh0ZXh0PSJTb21lIGNvbnRlbnQuICIpCisgICAgICAgIGNvbnRlbnRfMiA9IHNvdXAuZmluZCh0ZXh0PSIgTW9yZSBjb250ZW50LiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29udGVudF8xLm5leHRfZWxlbWVudCwgY29udGVudF8yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbnRlbnRfMS5uZXh0X3NpYmxpbmcsIGNvbnRlbnRfMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb250ZW50XzIucHJldmlvdXNfZWxlbWVudCwgY29udGVudF8xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbnRlbnRfMi5wcmV2aW91c19zaWJsaW5nLCBjb250ZW50XzEpCisKKyAgICBkZWYgdGVzdF9leHRyYWN0X2Rpc3Rpbmd1aXNoZXNfYmV0d2Vlbl9pZGVudGljYWxfc3RyaW5ncyhzZWxmKToKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiPGE+Zm9vPC9hPjxiPmJhcjwvYj4iKQorICAgICAgICBmb29fMSA9IHNvdXAuYS5zdHJpbmcKKyAgICAgICAgYmFyXzEgPSBzb3VwLmIuc3RyaW5nCisgICAgICAgIGZvb18yID0gc291cC5uZXdfc3RyaW5nKCJmb28iKQorICAgICAgICBiYXJfMiA9IHNvdXAubmV3X3N0cmluZygiYmFyIikKKyAgICAgICAgc291cC5hLmFwcGVuZChmb29fMikKKyAgICAgICAgc291cC5iLmFwcGVuZChiYXJfMikKKworICAgICAgICAjIE5vdyB0aGVyZSBhcmUgdHdvIGlkZW50aWNhbCBzdHJpbmdzIGluIHRoZSA8YT4gdGFnLCBhbmQgdHdvCisgICAgICAgICMgaW4gdGhlIDxiPiB0YWcuIExldCdzIHJlbW92ZSB0aGUgZmlyc3QgImZvbyIgYW5kIHRoZSBzZWNvbmQKKyAgICAgICAgIyAiYmFyIi4KKyAgICAgICAgZm9vXzEuZXh0cmFjdCgpCisgICAgICAgIGJhcl8yLmV4dHJhY3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvb18yLCBzb3VwLmEuc3RyaW5nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhcl8yLCBzb3VwLmIuc3RyaW5nKQorCisgICAgZGVmIHRlc3RfY2xlYXIoc2VsZik6CisgICAgICAgICIiIlRhZy5jbGVhcigpIiIiCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIjxwPjxhPlN0cmluZyA8ZW0+SXRhbGljaXplZDwvZW0+PC9hPiBhbmQgYW5vdGhlcjwvcD4iKQorICAgICAgICAjIGNsZWFyIHVzaW5nIGV4dHJhY3QoKQorICAgICAgICBhID0gc291cC5hCisgICAgICAgIHNvdXAucC5jbGVhcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNvdXAucC5jb250ZW50cyksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKGEsICJjb250ZW50cyIpKQorCisgICAgICAgICMgY2xlYXIgdXNpbmcgZGVjb21wb3NlKCkKKyAgICAgICAgZW0gPSBhLmVtCisgICAgICAgIGEuY2xlYXIoZGVjb21wb3NlPVRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbGVuKGVtLmNvbnRlbnRzKSkKKworICAgIGRlZiB0ZXN0X3N0cmluZ19zZXQoc2VsZik6CisgICAgICAgICIiIlRhZy5zdHJpbmcgPSAnc3RyaW5nJyIiIgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCI8YT48L2E+IDxiPjxjPjwvYz48L2I+IikKKyAgICAgICAgc291cC5hLnN0cmluZyA9ICJmb28iCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291cC5hLmNvbnRlbnRzLCBbImZvbyJdKQorICAgICAgICBzb3VwLmIuc3RyaW5nID0gImJhciIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3VwLmIuY29udGVudHMsIFsiYmFyIl0pCisKKyAgICBkZWYgdGVzdF9zdHJpbmdfc2V0X2RvZXNfbm90X2FmZmVjdF9vcmlnaW5hbF9zdHJpbmcoc2VsZik6CisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIjxhPjxiPmZvbzwvYj48Yz5iYXI8L2M+IikKKyAgICAgICAgc291cC5iLnN0cmluZyA9IHNvdXAuYy5zdHJpbmcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3VwLmEuZW5jb2RlKCksIGIiPGE+PGI+YmFyPC9iPjxjPmJhcjwvYz48L2E+IikKKworICAgIGRlZiB0ZXN0X3NldF9zdHJpbmdfcHJlc2VydmVzX2NsYXNzX29mX3N0cmluZyhzZWxmKToKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiPGE+PC9hPiIpCisgICAgICAgIGNkYXRhID0gQ0RhdGEoImZvbyIpCisgICAgICAgIHNvdXAuYS5zdHJpbmcgPSBjZGF0YQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzb3VwLmEuc3RyaW5nLCBDRGF0YSkpCisKK2NsYXNzIFRlc3RFbGVtZW50T2JqZWN0cyhTb3VwVGVzdCk6CisgICAgIiIiVGVzdCB2YXJpb3VzIGZlYXR1cmVzIG9mIGVsZW1lbnQgb2JqZWN0cy4iIiIKKworICAgIGRlZiB0ZXN0X2xlbihzZWxmKToKKyAgICAgICAgIiIiVGhlIGxlbmd0aCBvZiBhbiBlbGVtZW50IGlzIGl0cyBudW1iZXIgb2YgY2hpbGRyZW4uIiIiCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIjx0b3A+MTxiPjI8L2I+MzwvdG9wPiIpCisKKyAgICAgICAgIyBUaGUgQmVhdXRpZnVsU291cCBvYmplY3QgaXRzZWxmIGNvbnRhaW5zIG9uZSBlbGVtZW50OiB0aGUKKyAgICAgICAgIyA8dG9wPiB0YWcuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNvdXAuY29udGVudHMpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzb3VwKSwgMSkKKworICAgICAgICAjIFRoZSA8dG9wPiB0YWcgY29udGFpbnMgdGhyZWUgZWxlbWVudHM6IHRoZSB0ZXh0IG5vZGUgIjEiLCB0aGUKKyAgICAgICAgIyA8Yj4gdGFnLCBhbmQgdGhlIHRleHQgbm9kZSAiMyIuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNvdXAudG9wKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc291cC50b3AuY29udGVudHMpLCAzKQorCisgICAgZGVmIHRlc3RfbWVtYmVyX2FjY2Vzc19pbnZva2VzX2ZpbmQoc2VsZik6CisgICAgICAgICIiIkFjY2Vzc2luZyBhIFB5dGhvbiBtZW1iZXIgLmZvbyBpbnZva2VzIGZpbmQoJ2ZvbycpIiIiCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoJzxiPjxpPjwvaT48L2I+JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3VwLmIsIHNvdXAuZmluZCgnYicpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXAuYi5pLCBzb3VwLmZpbmQoJ2InKS5maW5kKCdpJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291cC5hLCBOb25lKQorCisgICAgZGVmIHRlc3RfZGVwcmVjYXRlZF9tZW1iZXJfYWNjZXNzKHNlbGYpOgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCc8Yj48aT48L2k+PC9iPicpCisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MocmVjb3JkPVRydWUpIGFzIHc6CisgICAgICAgICAgICB0YWcgPSBzb3VwLmJUYWcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3VwLmIsIHRhZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICcuYlRhZyBpcyBkZXByZWNhdGVkLCB1c2UgLmZpbmQoImIiKSBpbnN0ZWFkLicsCisgICAgICAgICAgICBzdHIod1swXS5tZXNzYWdlKSkKKworICAgIGRlZiB0ZXN0X2hhc19hdHRyKHNlbGYpOgorICAgICAgICAiIiJoYXNfYXR0cigpIGNoZWNrcyBmb3IgdGhlIHByZXNlbmNlIG9mIGFuIGF0dHJpYnV0ZS4KKworICAgICAgICBQbGVhc2Ugbm90ZSBub3RlOiBoYXNfYXR0cigpIGlzIGRpZmZlcmVudCBmcm9tCisgICAgICAgIF9faW5fXy4gaGFzX2F0dHIoKSBjaGVja3MgdGhlIHRhZydzIGF0dHJpYnV0ZXMgYW5kIF9faW5fXworICAgICAgICBjaGVja3MgdGhlIHRhZydzIGNoaWRscmVuLgorICAgICAgICAiIiIKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiPGZvbyBhdHRyPSdiYXInPiIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb3VwLmZvby5oYXNfYXR0cignYXR0cicpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNvdXAuZm9vLmhhc19hdHRyKCdhdHRyMicpKQorCisKKyAgICBkZWYgdGVzdF9hdHRyaWJ1dGVzX2NvbWVfb3V0X2luX2FscGhhYmV0aWNhbF9vcmRlcihzZWxmKToKKyAgICAgICAgbWFya3VwID0gJzxiIGE9IjEiIHo9IjUiIG09IjMiIGY9IjIiIHk9IjQiPjwvYj4nCisgICAgICAgIHNlbGYuYXNzZXJ0U291cEVxdWFscyhtYXJrdXAsICc8YiBhPSIxIiBmPSIyIiBtPSIzIiB5PSI0IiB6PSI1Ij48L2I+JykKKworICAgIGRlZiB0ZXN0X3N0cmluZyhzZWxmKToKKyAgICAgICAgIyBBIHRhZyB0aGF0IGNvbnRhaW5zIG9ubHkgYSB0ZXh0IG5vZGUgbWFrZXMgdGhhdCBub2RlCisgICAgICAgICMgYXZhaWxhYmxlIGFzIC5zdHJpbmcuCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIjxiPmZvbzwvYj4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXAuYi5zdHJpbmcsICdmb28nKQorCisgICAgZGVmIHRlc3RfZW1wdHlfdGFnX2hhc19ub19zdHJpbmcoc2VsZik6CisgICAgICAgICMgQSB0YWcgd2l0aCBubyBjaGlsZHJlbiBoYXMgbm8gLnN0aXJuZy4KKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiPGI+PC9iPiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291cC5iLnN0cmluZywgTm9uZSkKKworICAgIGRlZiB0ZXN0X3RhZ193aXRoX211bHRpcGxlX2NoaWxkcmVuX2hhc19ub19zdHJpbmcoc2VsZik6CisgICAgICAgICMgQSB0YWcgd2l0aCBubyBjaGlsZHJlbiBoYXMgbm8gLnN0cmluZy4KKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiPGE+Zm9vPGI+PC9iPjxiPjwvYj48L2I+IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3VwLmIuc3RyaW5nLCBOb25lKQorCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIjxhPmZvbzxiPjwvYj5iYXI8L2I+IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3VwLmIuc3RyaW5nLCBOb25lKQorCisgICAgICAgICMgRXZlbiBpZiBhbGwgdGhlIGNoaWxkcmVuIGFyZSBzdHJpbmdzLCBkdWUgdG8gdHJpY2tlcnksCisgICAgICAgICMgaXQgd29uJ3Qgd29yay0tYnV0IHRoaXMgd291bGQgYmUgYSBnb29kIG9wdGltaXphdGlvbi4KKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiPGE+Zm9vPC9iPiIpCisgICAgICAgIHNvdXAuYS5pbnNlcnQoMSwgImJhciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291cC5hLnN0cmluZywgTm9uZSkKKworICAgIGRlZiB0ZXN0X3RhZ193aXRoX3JlY3Vyc2l2ZV9zdHJpbmdfaGFzX3N0cmluZyhzZWxmKToKKyAgICAgICAgIyBBIHRhZyB3aXRoIGEgc2luZ2xlIGNoaWxkIHdoaWNoIGhhcyBhIC5zdHJpbmcgaW5oZXJpdHMgdGhhdAorICAgICAgICAjIC5zdHJpbmcuCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIjxhPjxiPmZvbzwvYj48L2E+IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3VwLmEuc3RyaW5nLCAiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3VwLnN0cmluZywgImZvbyIpCisKKyAgICBkZWYgdGVzdF9sYWNrX29mX3N0cmluZyhzZWxmKToKKyAgICAgICAgIiIiT25seSBhIHRhZyBjb250YWluaW5nIGEgc2luZ2xlIHRleHQgbm9kZSBoYXMgYSAuc3RyaW5nLiIiIgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCI8Yj5mPGk+ZTwvaT5vPC9iPiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc291cC5iLnN0cmluZykKKworICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCI8Yj48L2I+IikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzb3VwLmIuc3RyaW5nKQorCisgICAgZGVmIHRlc3RfYWxsX3RleHQoc2VsZik6CisgICAgICAgICIiIlRhZy50ZXh0IGFuZCBUYWcuZ2V0X3RleHQoc2VwPXUiIikgLT4gYWxsIGNoaWxkIHRleHQsIGNvbmNhdGVuYXRlZCIiIgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCI8YT5hPGI+cjwvYj4gICA8cj4gdCA8L3I+PC9hPiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291cC5hLnRleHQsICJhciAgdCAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXAuYS5nZXRfdGV4dChzdHJpcD1UcnVlKSwgImFydCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291cC5hLmdldF90ZXh0KCIsIiksICJhLHIsICwgdCAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXAuYS5nZXRfdGV4dCgiLCIsIHN0cmlwPVRydWUpLCAiYSxyLHQiKQorCisgICAgZGVmIHRlc3RfZ2V0X3RleHRfaWdub3Jlc19jb21tZW50cyhzZWxmKToKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiZm9vPCEtLUlHTk9SRS0tPmJhciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291cC5nZXRfdGV4dCgpLCAiZm9vYmFyIikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc291cC5nZXRfdGV4dCh0eXBlcz0oTmF2aWdhYmxlU3RyaW5nLCBDb21tZW50KSksICJmb29JR05PUkViYXIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc291cC5nZXRfdGV4dCh0eXBlcz1Ob25lKSwgImZvb0lHTk9SRWJhciIpCisKKyAgICBkZWYgdGVzdF9hbGxfc3RyaW5nc19pZ25vcmVzX2NvbW1lbnRzKHNlbGYpOgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCJmb288IS0tSUdOT1JFLS0+YmFyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbJ2ZvbycsICdiYXInXSwgbGlzdChzb3VwLnN0cmluZ3MpKQorCitjbGFzcyBUZXN0Q0RBdGFMaXN0QXR0cmlidXRlcyhTb3VwVGVzdCk6CisKKyAgICAiIiJUZXN0aW5nIGNkYXRhLWxpc3QgYXR0cmlidXRlcyBsaWtlICdjbGFzcycuCisgICAgIiIiCisgICAgZGVmIHRlc3Rfc2luZ2xlX3ZhbHVlX2JlY29tZXNfbGlzdChzZWxmKToKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiPGEgY2xhc3M9J2Zvbyc+IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbImZvbyJdLHNvdXAuYVsnY2xhc3MnXSkKKworICAgIGRlZiB0ZXN0X211bHRpcGxlX3ZhbHVlc19iZWNvbWVzX2xpc3Qoc2VsZik6CisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIjxhIGNsYXNzPSdmb28gYmFyJz4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsiZm9vIiwgImJhciJdLCBzb3VwLmFbJ2NsYXNzJ10pCisKKyAgICBkZWYgdGVzdF9tdWx0aXBsZV92YWx1ZXNfc2VwYXJhdGVkX2J5X3dlaXJkX3doaXRlc3BhY2Uoc2VsZik6CisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIjxhIGNsYXNzPSdmb29cdGJhclxuYmF6Jz4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsiZm9vIiwgImJhciIsICJiYXoiXSxzb3VwLmFbJ2NsYXNzJ10pCisKKyAgICBkZWYgdGVzdF9hdHRyaWJ1dGVzX2pvaW5lZF9pbnRvX3N0cmluZ19vbl9vdXRwdXQoc2VsZik6CisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIjxhIGNsYXNzPSdmb29cdGJhcic+IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJzxhIGNsYXNzPSJmb28gYmFyIj48L2E+Jywgc291cC5hLmVuY29kZSgpKQorCisgICAgZGVmIHRlc3RfYWNjZXB0X2NoYXJzZXQoc2VsZik6CisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoJzxmb3JtIGFjY2VwdC1jaGFyc2V0PSJJU08tODg1OS0xIFVURi04Ij4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsnSVNPLTg4NTktMScsICdVVEYtOCddLCBzb3VwLmZvcm1bJ2FjY2VwdC1jaGFyc2V0J10pCisKKyAgICBkZWYgdGVzdF9jZGF0YV9hdHRyaWJ1dGVfYXBwbHlpbmdfb25seV90b19vbmVfdGFnKHNlbGYpOgorICAgICAgICBkYXRhID0gJzxhIGFjY2VwdC1jaGFyc2V0PSJJU08tODg1OS0xIFVURi04Ij48L2E+JworICAgICAgICBzb3VwID0gc2VsZi5zb3VwKGRhdGEpCisgICAgICAgICMgV2Ugc2F3IGluIGFub3RoZXIgdGVzdCB0aGF0IGFjY2VwdC1jaGFyc2V0IGlzIGEgY2RhdGEtbGlzdAorICAgICAgICAjIGF0dHJpYnV0ZSBmb3IgdGhlIDxmb3JtPiB0YWcuIEJ1dCBpdCdzIG5vdCBhIGNkYXRhLWxpc3QKKyAgICAgICAgIyBhdHRyaWJ1dGUgZm9yIGFueSBvdGhlciB0YWcuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ0lTTy04ODU5LTEgVVRGLTgnLCBzb3VwLmFbJ2FjY2VwdC1jaGFyc2V0J10pCisKKyAgICBkZWYgdGVzdF9zdHJpbmdfaGFzX2ltbXV0YWJsZV9uYW1lX3Byb3BlcnR5KHNlbGYpOgorICAgICAgICBzdHJpbmcgPSBzZWxmLnNvdXAoInMiKS5zdHJpbmcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBzdHJpbmcubmFtZSkKKyAgICAgICAgZGVmIHQoKToKKyAgICAgICAgICAgIHN0cmluZy5uYW1lID0gJ2ZvbycKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIHQpCisKK2NsYXNzIFRlc3RQZXJzaXN0ZW5jZShTb3VwVGVzdCk6CisgICAgIlRlc3RpbmcgZmVhdHVyZXMgbGlrZSBwaWNrbGUgYW5kIGRlZXBjb3B5LiIKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwZXIoVGVzdFBlcnNpc3RlbmNlLCBzZWxmKS5zZXRVcCgpCisgICAgICAgIHNlbGYucGFnZSA9ICIiIjwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiIKKyJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwL3RyYW5zaXRpb25hbC5kdGQiPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KKzx0aXRsZT5CZWF1dGlmdWwgU291cDogV2UgY2FsbGVkIGhpbSBUb3J0b2lzZSBiZWNhdXNlIGhlIHRhdWdodCB1cy48L3RpdGxlPgorPGxpbmsgcmV2PSJtYWRlIiBocmVmPSJtYWlsdG86bGVvbmFyZHJAc2VnZmF1bHQub3JnIj4KKzxtZXRhIG5hbWU9IkRlc2NyaXB0aW9uIiBjb250ZW50PSJCZWF1dGlmdWwgU291cDogYW4gSFRNTCBwYXJzZXIgb3B0aW1pemVkIGZvciBzY3JlZW4tc2NyYXBpbmcuIj4KKzxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iTWFya292IEFwcHJveGltYXRpb24gMS40IChtb2R1bGU6IGxlb25hcmRyKSI+Cis8bWV0YSBuYW1lPSJhdXRob3IiIGNvbnRlbnQ9Ikxlb25hcmQgUmljaGFyZHNvbiI+Cis8L2hlYWQ+Cis8Ym9keT4KKzxhIGhyZWY9ImZvbyI+Zm9vPC9hPgorPGEgaHJlZj0iZm9vIj48Yj5iYXI8L2I+PC9hPgorPC9ib2R5PgorPC9odG1sPiIiIgorICAgICAgICBzZWxmLnRyZWUgPSBzZWxmLnNvdXAoc2VsZi5wYWdlKQorCisgICAgZGVmIHRlc3RfcGlja2xlX2FuZF91bnBpY2tsZV9pZGVudGl0eShzZWxmKToKKyAgICAgICAgIyBQaWNrbGluZyBhIHRyZWUsIHRoZW4gdW5waWNrbGluZyBpdCwgeWllbGRzIGEgdHJlZSBpZGVudGljYWwKKyAgICAgICAgIyB0byB0aGUgb3JpZ2luYWwuCisgICAgICAgIGR1bXBlZCA9IHBpY2tsZS5kdW1wcyhzZWxmLnRyZWUsIDIpCisgICAgICAgIGxvYWRlZCA9IHBpY2tsZS5sb2FkcyhkdW1wZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9hZGVkLl9fY2xhc3NfXywgQmVhdXRpZnVsU291cCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2FkZWQuZGVjb2RlKCksIHNlbGYudHJlZS5kZWNvZGUoKSkKKworICAgIGRlZiB0ZXN0X2RlZXBjb3B5X2lkZW50aXR5KHNlbGYpOgorICAgICAgICAjIE1ha2luZyBhIGRlZXBjb3B5IG9mIGEgdHJlZSB5aWVsZHMgYW4gaWRlbnRpY2FsIHRyZWUuCisgICAgICAgIGNvcGllZCA9IGNvcHkuZGVlcGNvcHkoc2VsZi50cmVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvcGllZC5kZWNvZGUoKSwgc2VsZi50cmVlLmRlY29kZSgpKQorCisgICAgZGVmIHRlc3RfdW5pY29kZV9waWNrbGUoc2VsZik6CisgICAgICAgICMgQSB0cmVlIGNvbnRhaW5pbmcgVW5pY29kZSBjaGFyYWN0ZXJzIGNhbiBiZSBwaWNrbGVkLgorICAgICAgICBodG1sID0gdSI8Yj5cTntTTk9XTUFOfTwvYj4iCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoaHRtbCkKKyAgICAgICAgZHVtcGVkID0gcGlja2xlLmR1bXBzKHNvdXAsIHBpY2tsZS5ISUdIRVNUX1BST1RPQ09MKQorICAgICAgICBsb2FkZWQgPSBwaWNrbGUubG9hZHMoZHVtcGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvYWRlZC5kZWNvZGUoKSwgc291cC5kZWNvZGUoKSkKKworCitjbGFzcyBUZXN0U3Vic3RpdHV0aW9ucyhTb3VwVGVzdCk6CisKKyAgICBkZWYgdGVzdF9kZWZhdWx0X2Zvcm1hdHRlcl9pc19taW5pbWFsKHNlbGYpOgorICAgICAgICBtYXJrdXAgPSB1IjxiPiZsdDsmbHQ7U2FjclxOe0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEV9IGJsZXUhJmd0OyZndDs8L2I+IgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKG1hcmt1cCkKKyAgICAgICAgZGVjb2RlZCA9IHNvdXAuZGVjb2RlKGZvcm1hdHRlcj0ibWluaW1hbCIpCisgICAgICAgICMgVGhlIDwgaXMgY29udmVydGVkIGJhY2sgaW50byAmbHQ7IGJ1dCB0aGUgZS13aXRoLWFjdXRlIGlzIGxlZnQgYWxvbmUuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBkZWNvZGVkLAorICAgICAgICAgICAgc2VsZi5kb2N1bWVudF9mb3IoCisgICAgICAgICAgICAgICAgdSI8Yj4mbHQ7Jmx0O1NhY3JcTntMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFfSBibGV1ISZndDsmZ3Q7PC9iPiIpKQorCisgICAgZGVmIHRlc3RfZm9ybWF0dGVyX2h0bWwoc2VsZik6CisgICAgICAgIG1hcmt1cCA9IHUiPGI+Jmx0OyZsdDtTYWNyXE57TEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURX0gYmxldSEmZ3Q7Jmd0OzwvYj4iCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAobWFya3VwKQorICAgICAgICBkZWNvZGVkID0gc291cC5kZWNvZGUoZm9ybWF0dGVyPSJodG1sIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGRlY29kZWQsCisgICAgICAgICAgICBzZWxmLmRvY3VtZW50X2ZvcigiPGI+Jmx0OyZsdDtTYWNyJmVhY3V0ZTsgYmxldSEmZ3Q7Jmd0OzwvYj4iKSkKKworICAgIGRlZiB0ZXN0X2Zvcm1hdHRlcl9taW5pbWFsKHNlbGYpOgorICAgICAgICBtYXJrdXAgPSB1IjxiPiZsdDsmbHQ7U2FjclxOe0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEV9IGJsZXUhJmd0OyZndDs8L2I+IgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKG1hcmt1cCkKKyAgICAgICAgZGVjb2RlZCA9IHNvdXAuZGVjb2RlKGZvcm1hdHRlcj0ibWluaW1hbCIpCisgICAgICAgICMgVGhlIDwgaXMgY29udmVydGVkIGJhY2sgaW50byAmbHQ7IGJ1dCB0aGUgZS13aXRoLWFjdXRlIGlzIGxlZnQgYWxvbmUuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBkZWNvZGVkLAorICAgICAgICAgICAgc2VsZi5kb2N1bWVudF9mb3IoCisgICAgICAgICAgICAgICAgdSI8Yj4mbHQ7Jmx0O1NhY3JcTntMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFfSBibGV1ISZndDsmZ3Q7PC9iPiIpKQorCisgICAgZGVmIHRlc3RfZm9ybWF0dGVyX251bGwoc2VsZik6CisgICAgICAgIG1hcmt1cCA9IHUiPGI+Jmx0OyZsdDtTYWNyXE57TEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURX0gYmxldSEmZ3Q7Jmd0OzwvYj4iCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAobWFya3VwKQorICAgICAgICBkZWNvZGVkID0gc291cC5kZWNvZGUoZm9ybWF0dGVyPU5vbmUpCisgICAgICAgICMgTmVpdGhlciB0aGUgYW5nbGUgYnJhY2tldHMgbm9yIHRoZSBlLXdpdGgtYWN1dGUgYXJlIGNvbnZlcnRlZC4KKyAgICAgICAgIyBUaGlzIGlzIG5vdCB2YWxpZCBIVE1MLCBidXQgaXQncyB3aGF0IHRoZSB1c2VyIHdhbnRlZC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRvY3VtZW50X2Zvcih1IjxiPjw8U2FjclxOe0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEV9IGJsZXUhPj48L2I+IikpCisKKyAgICBkZWYgdGVzdF9mb3JtYXR0ZXJfY3VzdG9tKHNlbGYpOgorICAgICAgICBtYXJrdXAgPSB1IjxiPiZsdDtmb28mZ3Q7PC9iPjxiPmJhcjwvYj4iCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAobWFya3VwKQorICAgICAgICBkZWNvZGVkID0gc291cC5kZWNvZGUoZm9ybWF0dGVyID0gbGFtYmRhIHg6IHgudXBwZXIoKSkKKyAgICAgICAgIyBJbnN0ZWFkIG9mIG5vcm1hbCBlbnRpdHkgY29udmVyc2lvbiBjb2RlLCB0aGUgY3VzdG9tCisgICAgICAgICMgY2FsbGFibGUgaXMgY2FsbGVkIG9uIGV2ZXJ5IHN0cmluZy4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGRlY29kZWQsCisgICAgICAgICAgICBzZWxmLmRvY3VtZW50X2Zvcih1IjxiPjxGT08+PC9iPjxiPkJBUjwvYj4iKSkKKworICAgIGRlZiB0ZXN0X2Zvcm1hdHRlcl9pc19ydW5fb25fYXR0cmlidXRlX3ZhbHVlcyhzZWxmKToKKyAgICAgICAgbWFya3VwID0gdSc8YSBocmVmPSJodHRwOi8vYS5jb20/YT1iJmM9w6kiPmU8L2E+JworICAgICAgICBzb3VwID0gc2VsZi5zb3VwKG1hcmt1cCkKKyAgICAgICAgYSA9IHNvdXAuYQorCisgICAgICAgIGV4cGVjdF9taW5pbWFsID0gdSc8YSBocmVmPSJodHRwOi8vYS5jb20/YT1iJmFtcDtjPcOpIj5lPC9hPicKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdF9taW5pbWFsLCBhLmRlY29kZSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdF9taW5pbWFsLCBhLmRlY29kZShmb3JtYXR0ZXI9Im1pbmltYWwiKSkKKworICAgICAgICBleHBlY3RfaHRtbCA9IHUnPGEgaHJlZj0iaHR0cDovL2EuY29tP2E9YiZhbXA7Yz0mZWFjdXRlOyI+ZTwvYT4nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0X2h0bWwsIGEuZGVjb2RlKGZvcm1hdHRlcj0iaHRtbCIpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFya3VwLCBhLmRlY29kZShmb3JtYXR0ZXI9Tm9uZSkpCisgICAgICAgIGV4cGVjdF91cHBlciA9IHUnPGEgaHJlZj0iSFRUUDovL0EuQ09NP0E9QiZDPcOJIj5FPC9hPicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RfdXBwZXIsIGEuZGVjb2RlKGZvcm1hdHRlcj1sYW1iZGEgeDogeC51cHBlcigpKSkKKworICAgIGRlZiB0ZXN0X2Zvcm1hdHRlcl9za2lwc19zY3JpcHRfdGFnX2Zvcl9odG1sX2RvY3VtZW50cyhzZWxmKToKKyAgICAgICAgZG9jID0gIiIiCisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgIGNvbnNvbGUubG9nKCI8IDwgaGV5ID4gPiAiKTsKKyAgPC9zY3JpcHQ+CisiIiIKKyAgICAgICAgZW5jb2RlZCA9IEJlYXV0aWZ1bFNvdXAoZG9jKS5lbmNvZGUoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYiI8IDwgaGV5ID4gPiIgaW4gZW5jb2RlZCkKKworICAgIGRlZiB0ZXN0X2Zvcm1hdHRlcl9za2lwc19zdHlsZV90YWdfZm9yX2h0bWxfZG9jdW1lbnRzKHNlbGYpOgorICAgICAgICBkb2MgPSAiIiIKKyAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKyAgIGNvbnNvbGUubG9nKCI8IDwgaGV5ID4gPiAiKTsKKyAgPC9zdHlsZT4KKyIiIgorICAgICAgICBlbmNvZGVkID0gQmVhdXRpZnVsU291cChkb2MpLmVuY29kZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiIjwgPCBoZXkgPiA+IiBpbiBlbmNvZGVkKQorCisgICAgZGVmIHRlc3RfcHJldHRpZnlfbGVhdmVzX3ByZWZvcm1hdHRlZF90ZXh0X2Fsb25lKHNlbGYpOgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCI8ZGl2PiAgZm9vICA8cHJlPiAgXHRiYXJcbiAgXG4gIDwvcHJlPiAgYmF6ICAiKQorICAgICAgICAjIEV2ZXJ5dGhpbmcgb3V0c2lkZSB0aGUgPHByZT4gdGFnIGlzIHJlZm9ybWF0dGVkLCBidXQgZXZlcnl0aGluZworICAgICAgICAjIGluc2lkZSBpcyBsZWZ0IGFsb25lLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgdSc8ZGl2PlxuIGZvb1xuIDxwcmU+ICBcdGJhclxuICBcbiAgPC9wcmU+XG4gYmF6XG48L2Rpdj4nLAorICAgICAgICAgICAgc291cC5kaXYucHJldHRpZnkoKSkKKworICAgIGRlZiB0ZXN0X3ByZXR0aWZ5X2FjY2VwdHNfZm9ybWF0dGVyKHNlbGYpOgorICAgICAgICBzb3VwID0gQmVhdXRpZnVsU291cCgiPGh0bWw+PGJvZHk+Zm9vPC9ib2R5PjwvaHRtbD4iKQorICAgICAgICBwcmV0dHkgPSBzb3VwLnByZXR0aWZ5KGZvcm1hdHRlciA9IGxhbWJkYSB4OiB4LnVwcGVyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiRk9PIiBpbiBwcmV0dHkpCisKKyAgICBkZWYgdGVzdF9wcmV0dGlmeV9vdXRwdXRzX3VuaWNvZGVfYnlfZGVmYXVsdChzZWxmKToKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiPGE+PC9hPiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZSwgdHlwZShzb3VwLnByZXR0aWZ5KCkpKQorCisgICAgZGVmIHRlc3RfcHJldHRpZnlfY2FuX2VuY29kZV9kYXRhKHNlbGYpOgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCI8YT48L2E+IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChieXRlcywgdHlwZShzb3VwLnByZXR0aWZ5KCJ1dGYtOCIpKSkKKworICAgIGRlZiB0ZXN0X2h0bWxfZW50aXR5X3N1YnN0aXR1dGlvbl9vZmZfYnlfZGVmYXVsdChzZWxmKToKKyAgICAgICAgbWFya3VwID0gdSI8Yj5TYWNyXE57TEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURX0gYmxldSE8L2I+IgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKG1hcmt1cCkKKyAgICAgICAgZW5jb2RlZCA9IHNvdXAuYi5lbmNvZGUoInV0Zi04IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVkLCBtYXJrdXAuZW5jb2RlKCd1dGYtOCcpKQorCisgICAgZGVmIHRlc3RfZW5jb2Rpbmdfc3Vic3RpdHV0aW9uKHNlbGYpOgorICAgICAgICAjIEhlcmUncyB0aGUgPG1ldGE+IHRhZyBzYXlpbmcgdGhhdCBhIGRvY3VtZW50IGlzCisgICAgICAgICMgZW5jb2RlZCBpbiBTaGlmdC1KSVMuCisgICAgICAgIG1ldGFfdGFnID0gKCc8bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9eC1zamlzIiAnCisgICAgICAgICAgICAgICAgICAgICdodHRwLWVxdWl2PSJDb250ZW50LXR5cGUiLz4nKQorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKG1ldGFfdGFnKQorCisgICAgICAgICMgUGFyc2UgdGhlIGRvY3VtZW50LCBhbmQgdGhlIGNoYXJzZXQgYXBwcmVhcnMgdW5jaGFuZ2VkLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXAubWV0YVsnY29udGVudCddLCAndGV4dC9odG1sOyBjaGFyc2V0PXgtc2ppcycpCisKKyAgICAgICAgIyBFbmNvZGUgdGhlIGRvY3VtZW50IGludG8gc29tZSBlbmNvZGluZywgYW5kIHRoZSBlbmNvZGluZyBpcworICAgICAgICAjIHN1YnN0aXR1dGVkIGludG8gdGhlIG1ldGEgdGFnLgorICAgICAgICB1dGZfOCA9IHNvdXAuZW5jb2RlKCJ1dGYtOCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiImNoYXJzZXQ9dXRmLTgiIGluIHV0Zl84KQorCisgICAgICAgIGV1Y19qcCA9IHNvdXAuZW5jb2RlKCJldWNfanAiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYiJjaGFyc2V0PWV1Y19qcCIgaW4gZXVjX2pwKQorCisgICAgICAgIHNoaWZ0X2ppcyA9IHNvdXAuZW5jb2RlKCJzaGlmdC1qaXMiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYiJjaGFyc2V0PXNoaWZ0LWppcyIgaW4gc2hpZnRfamlzKQorCisgICAgICAgIHV0Zl8xNl91ID0gc291cC5lbmNvZGUoInV0Zi0xNiIpLmRlY29kZSgidXRmLTE2IikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJjaGFyc2V0PXV0Zi0xNiIgaW4gdXRmXzE2X3UpCisKKyAgICBkZWYgdGVzdF9lbmNvZGluZ19zdWJzdGl0dXRpb25fZG9lc250X2hhcHBlbl9pZl90YWdfaXNfc3RyYWluZWQoc2VsZik6CisgICAgICAgIG1hcmt1cCA9ICgnPGhlYWQ+PG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXgtc2ppcyIgJworICAgICAgICAgICAgICAgICAgICAnaHR0cC1lcXVpdj0iQ29udGVudC10eXBlIi8+PC9oZWFkPjxwcmU+Zm9vPC9wcmU+JykKKworICAgICAgICAjIEJlYXV0aWZ1bCBTb3VwIHVzZWQgdG8gdHJ5IHRvIHJld3JpdGUgdGhlIG1ldGEgdGFnIGV2ZW4gaWYgdGhlCisgICAgICAgICMgbWV0YSB0YWcgZ290IGZpbHRlcmVkIG91dCBieSB0aGUgc3RyYWluZXIuIFRoaXMgdGVzdCBtYWtlcworICAgICAgICAjIHN1cmUgdGhhdCBkb2Vzbid0IGhhcHBlbi4KKyAgICAgICAgc3RyYWluZXIgPSBTb3VwU3RyYWluZXIoJ3ByZScpCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAobWFya3VwLCBwYXJzZV9vbmx5PXN0cmFpbmVyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXAuY29udGVudHNbMF0ubmFtZSwgJ3ByZScpCisKK2NsYXNzIFRlc3RFbmNvZGluZyhTb3VwVGVzdCk6CisgICAgIiIiVGVzdCB0aGUgYWJpbGl0eSB0byBlbmNvZGUgb2JqZWN0cyBpbnRvIHN0cmluZ3MuIiIiCisKKyAgICBkZWYgdGVzdF91bmljb2RlX3N0cmluZ19jYW5fYmVfZW5jb2RlZChzZWxmKToKKyAgICAgICAgaHRtbCA9IHUiPGI+XE57U05PV01BTn08L2I+IgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKGh0bWwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291cC5iLnN0cmluZy5lbmNvZGUoInV0Zi04IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHUiXE57U05PV01BTn0iLmVuY29kZSgidXRmLTgiKSkKKworICAgIGRlZiB0ZXN0X3RhZ19jb250YWluaW5nX3VuaWNvZGVfc3RyaW5nX2Nhbl9iZV9lbmNvZGVkKHNlbGYpOgorICAgICAgICBodG1sID0gdSI8Yj5cTntTTk9XTUFOfTwvYj4iCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoaHRtbCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNvdXAuYi5lbmNvZGUoInV0Zi04IiksIGh0bWwuZW5jb2RlKCJ1dGYtOCIpKQorCisgICAgZGVmIHRlc3RfZW5jb2Rpbmdfc3Vic3RpdHV0ZXNfdW5yZWNvZ25pemVkX2NoYXJhY3RlcnNfYnlfZGVmYXVsdChzZWxmKToKKyAgICAgICAgaHRtbCA9IHUiPGI+XE57U05PV01BTn08L2I+IgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKGh0bWwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291cC5iLmVuY29kZSgiYXNjaWkiKSwgYiI8Yj4mIzk3MzE7PC9iPiIpCisKKyAgICBkZWYgdGVzdF9lbmNvZGluZ19jYW5fYmVfbWFkZV9zdHJpY3Qoc2VsZik6CisgICAgICAgIGh0bWwgPSB1IjxiPlxOe1NOT1dNQU59PC9iPiIKKyAgICAgICAgc291cCA9IHNlbGYuc291cChodG1sKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgIFVuaWNvZGVFbmNvZGVFcnJvciwgc291cC5lbmNvZGUsICJhc2NpaSIsIGVycm9ycz0ic3RyaWN0IikKKworICAgIGRlZiB0ZXN0X2RlY29kZV9jb250ZW50cyhzZWxmKToKKyAgICAgICAgaHRtbCA9IHUiPGI+XE57U05PV01BTn08L2I+IgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKGh0bWwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSJcTntTTk9XTUFOfSIsIHNvdXAuYi5kZWNvZGVfY29udGVudHMoKSkKKworICAgIGRlZiB0ZXN0X2VuY29kZV9jb250ZW50cyhzZWxmKToKKyAgICAgICAgaHRtbCA9IHUiPGI+XE57U05PV01BTn08L2I+IgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKGh0bWwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICB1IlxOe1NOT1dNQU59Ii5lbmNvZGUoInV0ZjgiKSwgc291cC5iLmVuY29kZV9jb250ZW50cygKKyAgICAgICAgICAgICAgICBlbmNvZGluZz0idXRmOCIpKQorCisgICAgZGVmIHRlc3RfZGVwcmVjYXRlZF9yZW5kZXJDb250ZW50cyhzZWxmKToKKyAgICAgICAgaHRtbCA9IHUiPGI+XE57U05PV01BTn08L2I+IgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKGh0bWwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICB1IlxOe1NOT1dNQU59Ii5lbmNvZGUoInV0ZjgiKSwgc291cC5iLnJlbmRlckNvbnRlbnRzKCkpCisKK2NsYXNzIFRlc3ROYXZpZ2FibGVTdHJpbmdTdWJjbGFzc2VzKFNvdXBUZXN0KToKKworICAgIGRlZiB0ZXN0X2NkYXRhKHNlbGYpOgorICAgICAgICAjIE5vbmUgb2YgdGhlIGN1cnJlbnQgYnVpbGRlcnMgdHVybiBDREFUQSBzZWN0aW9ucyBpbnRvIENEYXRhCisgICAgICAgICMgb2JqZWN0cywgYnV0IHlvdSBjYW4gY3JlYXRlIHRoZW0gbWFudWFsbHkuCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIiIpCisgICAgICAgIGNkYXRhID0gQ0RhdGEoImZvbyIpCisgICAgICAgIHNvdXAuaW5zZXJ0KDEsIGNkYXRhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihzb3VwKSwgIjwhW0NEQVRBW2Zvb11dPiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291cC5maW5kKHRleHQ9ImZvbyIpLCAiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3VwLmNvbnRlbnRzWzBdLCAiZm9vIikKKworICAgIGRlZiB0ZXN0X2NkYXRhX2lzX25ldmVyX2Zvcm1hdHRlZChzZWxmKToKKyAgICAgICAgIiIiVGV4dCBpbnNpZGUgYSBDRGF0YSBvYmplY3QgaXMgcGFzc2VkIGludG8gdGhlIGZvcm1hdHRlci4KKworICAgICAgICBCdXQgdGhlIHJldHVybiB2YWx1ZSBpcyBpZ25vcmVkLgorICAgICAgICAiIiIKKworICAgICAgICBzZWxmLmNvdW50ID0gMAorICAgICAgICBkZWYgaW5jcmVtZW50KCphcmdzKToKKyAgICAgICAgICAgIHNlbGYuY291bnQgKz0gMQorICAgICAgICAgICAgcmV0dXJuICJCSVRURVIgRkFJTFVSRSIKKworICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCIiKQorICAgICAgICBjZGF0YSA9IENEYXRhKCI8Pjw+PD4iKQorICAgICAgICBzb3VwLmluc2VydCgxLCBjZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGIiPCFbQ0RBVEFbPD48Pjw+XV0+Iiwgc291cC5lbmNvZGUoZm9ybWF0dGVyPWluY3JlbWVudCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgc2VsZi5jb3VudCkKKworICAgIGRlZiB0ZXN0X2RvY3R5cGVfZW5kc19pbl9uZXdsaW5lKHNlbGYpOgorICAgICAgICAjIFVubGlrZSBvdGhlciBOYXZpZ2FibGVTdHJpbmcgc3ViY2xhc3NlcywgYSBET0NUWVBFIGFsd2F5cyBlbmRzCisgICAgICAgICMgaW4gYSBuZXdsaW5lLgorICAgICAgICBkb2N0eXBlID0gRG9jdHlwZSgiZm9vIikKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiIikKKyAgICAgICAgc291cC5pbnNlcnQoMSwgZG9jdHlwZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3VwLmVuY29kZSgpLCBiIjwhRE9DVFlQRSBmb28+XG4iKQorCisKK2NsYXNzIFRlc3RTb3VwU2VsZWN0b3IoVHJlZVRlc3QpOgorCisgICAgSFRNTCA9ICIiIgorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEvL0VOIgorImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L3N0cmljdC5kdGQiPgorPGh0bWw+Cis8aGVhZD4KKzx0aXRsZT5UaGUgdGl0bGU8L3RpdGxlPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJibGFoLmNzcyIgdHlwZT0idGV4dC9jc3MiIGlkPSJsMSI+Cis8L2hlYWQ+Cis8Ym9keT4KKworPGRpdiBpZD0ibWFpbiIgY2xhc3M9ImZhbmN5Ij4KKzxkaXYgaWQ9ImlubmVyIj4KKzxoMSBpZD0iaGVhZGVyMSI+QW4gSDE8L2gxPgorPHA+U29tZSB0ZXh0PC9wPgorPHAgY2xhc3M9Im9uZXAiIGlkPSJwMSI+U29tZSBtb3JlIHRleHQ8L3A+Cis8aDIgaWQ9ImhlYWRlcjIiPkFuIEgyPC9oMj4KKzxwIGNsYXNzPSJjbGFzczEgY2xhc3MyIGNsYXNzMyIgaWQ9InBtdWx0aSI+QW5vdGhlcjwvcD4KKzxhIGhyZWY9Imh0dHA6Ly9ib2IuZXhhbXBsZS5vcmcvIiByZWw9ImZyaWVuZCBtZXQiIGlkPSJib2IiPkJvYjwvYT4KKzxoMiBpZD0iaGVhZGVyMyI+QW5vdGhlciBIMjwvaDI+Cis8YSBpZD0ibWUiIGhyZWY9Imh0dHA6Ly9zaW1vbndpbGxpc29uLm5ldC8iIHJlbD0ibWUiPm1lPC9hPgorPHNwYW4gY2xhc3M9InMxIj4KKzxhIGhyZWY9IiMiIGlkPSJzMWExIj5zcGFuMWExPC9hPgorPGEgaHJlZj0iIyIgaWQ9InMxYTIiPnNwYW4xYTIgPHNwYW4gaWQ9InMxYTJzMSI+dGVzdDwvc3Bhbj48L2E+Cis8c3BhbiBjbGFzcz0ic3BhbjIiPgorPGEgaHJlZj0iIyIgaWQ9InMyYTEiPnNwYW4yYTE8L2E+Cis8L3NwYW4+Cis8c3BhbiBjbGFzcz0ic3BhbjMiPjwvc3Bhbj4KKzwvc3Bhbj4KKzwvZGl2PgorPHAgbGFuZz0iZW4iIGlkPSJsYW5nLWVuIj5FbmdsaXNoPC9wPgorPHAgbGFuZz0iZW4tZ2IiIGlkPSJsYW5nLWVuLWdiIj5FbmdsaXNoIFVLPC9wPgorPHAgbGFuZz0iZW4tdXMiIGlkPSJsYW5nLWVuLXVzIj5FbmdsaXNoIFVTPC9wPgorPHAgbGFuZz0iZnIiIGlkPSJsYW5nLWZyIj5GcmVuY2g8L3A+Cis8L2Rpdj4KKworPGRpdiBpZD0iZm9vdGVyIj4KKzwvZGl2PgorIiIiCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuc291cCA9IEJlYXV0aWZ1bFNvdXAoc2VsZi5IVE1MKQorCisgICAgZGVmIGFzc2VydFNlbGVjdHMoc2VsZiwgc2VsZWN0b3IsIGV4cGVjdGVkX2lkcyk6CisgICAgICAgIGVsX2lkcyA9IFtlbFsnaWQnXSBmb3IgZWwgaW4gc2VsZi5zb3VwLnNlbGVjdChzZWxlY3RvcildCisgICAgICAgIGVsX2lkcy5zb3J0KCkKKyAgICAgICAgZXhwZWN0ZWRfaWRzLnNvcnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX2lkcywgZWxfaWRzLAorICAgICAgICAgICAgIlNlbGVjdG9yICVzLCBleHBlY3RlZCBbJXNdLCBnb3QgWyVzXSIgJSAoCisgICAgICAgICAgICAgICAgc2VsZWN0b3IsICcsICcuam9pbihleHBlY3RlZF9pZHMpLCAnLCAnLmpvaW4oZWxfaWRzKQorICAgICAgICAgICAgKQorICAgICAgICApCisKKyAgICBhc3NlcnRTZWxlY3QgPSBhc3NlcnRTZWxlY3RzCisKKyAgICBkZWYgYXNzZXJ0U2VsZWN0TXVsdGlwbGUoc2VsZiwgKnRlc3RzKToKKyAgICAgICAgZm9yIHNlbGVjdG9yLCBleHBlY3RlZF9pZHMgaW4gdGVzdHM6CisgICAgICAgICAgICBzZWxmLmFzc2VydFNlbGVjdChzZWxlY3RvciwgZXhwZWN0ZWRfaWRzKQorCisgICAgZGVmIHRlc3Rfb25lX3RhZ19vbmUoc2VsZik6CisgICAgICAgIGVscyA9IHNlbGYuc291cC5zZWxlY3QoJ3RpdGxlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZWxzKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbHNbMF0ubmFtZSwgJ3RpdGxlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbHNbMF0uY29udGVudHMsIFt1J1RoZSB0aXRsZSddKQorCisgICAgZGVmIHRlc3Rfb25lX3RhZ19tYW55KHNlbGYpOgorICAgICAgICBlbHMgPSBzZWxmLnNvdXAuc2VsZWN0KCdkaXYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihlbHMpLCAzKQorICAgICAgICBmb3IgZGl2IGluIGVsczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGl2Lm5hbWUsICdkaXYnKQorCisgICAgZGVmIHRlc3RfdGFnX2luX3RhZ19vbmUoc2VsZik6CisgICAgICAgIGVscyA9IHNlbGYuc291cC5zZWxlY3QoJ2RpdiBkaXYnKQorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHMoJ2RpdiBkaXYnLCBbJ2lubmVyJ10pCisKKyAgICBkZWYgdGVzdF90YWdfaW5fdGFnX21hbnkoc2VsZik6CisgICAgICAgIGZvciBzZWxlY3RvciBpbiAoJ2h0bWwgZGl2JywgJ2h0bWwgYm9keSBkaXYnLCAnYm9keSBkaXYnKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cyhzZWxlY3RvciwgWydtYWluJywgJ2lubmVyJywgJ2Zvb3RlciddKQorCisgICAgZGVmIHRlc3RfdGFnX25vX21hdGNoKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLnNvdXAuc2VsZWN0KCdkZWwnKSksIDApCisKKyAgICBkZWYgdGVzdF9pbnZhbGlkX3RhZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi5zb3VwLnNlbGVjdCwgJ3RhZyV0JykKKworICAgIGRlZiB0ZXN0X2hlYWRlcl90YWdzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdE11bHRpcGxlKAorICAgICAgICAgICAgKCdoMScsIFsnaGVhZGVyMSddKSwKKyAgICAgICAgICAgICgnaDInLCBbJ2hlYWRlcjInLCAnaGVhZGVyMyddKSwKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfY2xhc3Nfb25lKHNlbGYpOgorICAgICAgICBmb3Igc2VsZWN0b3IgaW4gKCcub25lcCcsICdwLm9uZXAnLCAnaHRtbCBwLm9uZXAnKToKKyAgICAgICAgICAgIGVscyA9IHNlbGYuc291cC5zZWxlY3Qoc2VsZWN0b3IpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihlbHMpLCAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbHNbMF0ubmFtZSwgJ3AnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbHNbMF1bJ2NsYXNzJ10sIFsnb25lcCddKQorCisgICAgZGVmIHRlc3RfY2xhc3NfbWlzbWF0Y2hlZF90YWcoc2VsZik6CisgICAgICAgIGVscyA9IHNlbGYuc291cC5zZWxlY3QoJ2Rpdi5vbmVwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZWxzKSwgMCkKKworICAgIGRlZiB0ZXN0X29uZV9pZChzZWxmKToKKyAgICAgICAgZm9yIHNlbGVjdG9yIGluICgnZGl2I2lubmVyJywgJyNpbm5lcicsICdkaXYgZGl2I2lubmVyJyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHMoc2VsZWN0b3IsIFsnaW5uZXInXSkKKworICAgIGRlZiB0ZXN0X2JhZF9pZChzZWxmKToKKyAgICAgICAgZWxzID0gc2VsZi5zb3VwLnNlbGVjdCgnI2RvZXNub3RleGlzdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGVscyksIDApCisKKyAgICBkZWYgdGVzdF9pdGVtc19pbl9pZChzZWxmKToKKyAgICAgICAgZWxzID0gc2VsZi5zb3VwLnNlbGVjdCgnZGl2I2lubmVyIHAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihlbHMpLCAzKQorICAgICAgICBmb3IgZWwgaW4gZWxzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbC5uYW1lLCAncCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZWxzWzFdWydjbGFzcyddLCBbJ29uZXAnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShlbHNbMF0uaGFzX2F0dHIoJ2NsYXNzJykpCisKKyAgICBkZWYgdGVzdF9hX2J1bmNoX29mX2VtcHR5cyhzZWxmKToKKyAgICAgICAgZm9yIHNlbGVjdG9yIGluICgnZGl2I21haW4gZGVsJywgJ2RpdiNtYWluIGRpdi5vb3BzJywgJ2RpdiBkaXYjbWFpbicpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5zb3VwLnNlbGVjdChzZWxlY3RvcikpLCAwKQorCisgICAgZGVmIHRlc3RfbXVsdGlfY2xhc3Nfc3VwcG9ydChzZWxmKToKKyAgICAgICAgZm9yIHNlbGVjdG9yIGluICgnLmNsYXNzMScsICdwLmNsYXNzMScsICcuY2xhc3MyJywgJ3AuY2xhc3MyJywKKyAgICAgICAgICAgICcuY2xhc3MzJywgJ3AuY2xhc3MzJywgJ2h0bWwgcC5jbGFzczInLCAnZGl2I2lubmVyIC5jbGFzczInKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cyhzZWxlY3RvciwgWydwbXVsdGknXSkKKworICAgIGRlZiB0ZXN0X211bHRpX2NsYXNzX3NlbGVjdGlvbihzZWxmKToKKyAgICAgICAgZm9yIHNlbGVjdG9yIGluICgnLmNsYXNzMS5jbGFzczMnLCAnLmNsYXNzMy5jbGFzczInLAorICAgICAgICAgICAgICAgICAgICAgICAgICcuY2xhc3MxLmNsYXNzMi5jbGFzczMnKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cyhzZWxlY3RvciwgWydwbXVsdGknXSkKKworICAgIGRlZiB0ZXN0X2NoaWxkX3NlbGVjdG9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHMoJy5zMSA+IGEnLCBbJ3MxYTEnLCAnczFhMiddKQorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHMoJy5zMSA+IGEgc3BhbicsIFsnczFhMnMxJ10pCisKKyAgICBkZWYgdGVzdF9jaGlsZF9zZWxlY3Rvcl9pZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKCcuczEgPiBhI3MxYTIgc3BhbicsIFsnczFhMnMxJ10pCisKKyAgICBkZWYgdGVzdF9hdHRyaWJ1dGVfZXF1YWxzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdE11bHRpcGxlKAorICAgICAgICAgICAgKCdwW2NsYXNzPSJvbmVwIl0nLCBbJ3AxJ10pLAorICAgICAgICAgICAgKCdwW2lkPSJwMSJdJywgWydwMSddKSwKKyAgICAgICAgICAgICgnW2NsYXNzPSJvbmVwIl0nLCBbJ3AxJ10pLAorICAgICAgICAgICAgKCdbaWQ9InAxIl0nLCBbJ3AxJ10pLAorICAgICAgICAgICAgKCdsaW5rW3JlbD0ic3R5bGVzaGVldCJdJywgWydsMSddKSwKKyAgICAgICAgICAgICgnbGlua1t0eXBlPSJ0ZXh0L2NzcyJdJywgWydsMSddKSwKKyAgICAgICAgICAgICgnbGlua1tocmVmPSJibGFoLmNzcyJdJywgWydsMSddKSwKKyAgICAgICAgICAgICgnbGlua1tocmVmPSJuby1ibGFoLmNzcyJdJywgW10pLAorICAgICAgICAgICAgKCdbcmVsPSJzdHlsZXNoZWV0Il0nLCBbJ2wxJ10pLAorICAgICAgICAgICAgKCdbdHlwZT0idGV4dC9jc3MiXScsIFsnbDEnXSksCisgICAgICAgICAgICAoJ1tocmVmPSJibGFoLmNzcyJdJywgWydsMSddKSwKKyAgICAgICAgICAgICgnW2hyZWY9Im5vLWJsYWguY3NzIl0nLCBbXSksCisgICAgICAgICAgICAoJ3BbaHJlZj0ibm8tYmxhaC5jc3MiXScsIFtdKSwKKyAgICAgICAgICAgICgnW2hyZWY9Im5vLWJsYWguY3NzIl0nLCBbXSksCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X2F0dHJpYnV0ZV90aWxkZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RNdWx0aXBsZSgKKyAgICAgICAgICAgICgncFtjbGFzc349ImNsYXNzMSJdJywgWydwbXVsdGknXSksCisgICAgICAgICAgICAoJ3BbY2xhc3N+PSJjbGFzczIiXScsIFsncG11bHRpJ10pLAorICAgICAgICAgICAgKCdwW2NsYXNzfj0iY2xhc3MzIl0nLCBbJ3BtdWx0aSddKSwKKyAgICAgICAgICAgICgnW2NsYXNzfj0iY2xhc3MxIl0nLCBbJ3BtdWx0aSddKSwKKyAgICAgICAgICAgICgnW2NsYXNzfj0iY2xhc3MyIl0nLCBbJ3BtdWx0aSddKSwKKyAgICAgICAgICAgICgnW2NsYXNzfj0iY2xhc3MzIl0nLCBbJ3BtdWx0aSddKSwKKyAgICAgICAgICAgICgnYVtyZWx+PSJmcmllbmQiXScsIFsnYm9iJ10pLAorICAgICAgICAgICAgKCdhW3JlbH49Im1ldCJdJywgWydib2InXSksCisgICAgICAgICAgICAoJ1tyZWx+PSJmcmllbmQiXScsIFsnYm9iJ10pLAorICAgICAgICAgICAgKCdbcmVsfj0ibWV0Il0nLCBbJ2JvYiddKSwKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfYXR0cmlidXRlX3N0YXJ0c3dpdGgoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0TXVsdGlwbGUoCisgICAgICAgICAgICAoJ1tyZWxePSJzdHlsZSJdJywgWydsMSddKSwKKyAgICAgICAgICAgICgnbGlua1tyZWxePSJzdHlsZSJdJywgWydsMSddKSwKKyAgICAgICAgICAgICgnbm90bGlua1tyZWxePSJub3RzdHlsZSJdJywgW10pLAorICAgICAgICAgICAgKCdbcmVsXj0ibm90c3R5bGUiXScsIFtdKSwKKyAgICAgICAgICAgICgnbGlua1tyZWxePSJub3RzdHlsZSJdJywgW10pLAorICAgICAgICAgICAgKCdsaW5rW2hyZWZePSJibGEiXScsIFsnbDEnXSksCisgICAgICAgICAgICAoJ2FbaHJlZl49Imh0dHA6Ly8iXScsIFsnYm9iJywgJ21lJ10pLAorICAgICAgICAgICAgKCdbaHJlZl49Imh0dHA6Ly8iXScsIFsnYm9iJywgJ21lJ10pLAorICAgICAgICAgICAgKCdbaWRePSJwIl0nLCBbJ3BtdWx0aScsICdwMSddKSwKKyAgICAgICAgICAgICgnW2lkXj0ibSJdJywgWydtZScsICdtYWluJ10pLAorICAgICAgICAgICAgKCdkaXZbaWRePSJtIl0nLCBbJ21haW4nXSksCisgICAgICAgICAgICAoJ2FbaWRePSJtIl0nLCBbJ21lJ10pLAorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9hdHRyaWJ1dGVfZW5kc3dpdGgoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0TXVsdGlwbGUoCisgICAgICAgICAgICAoJ1tocmVmJD0iLmNzcyJdJywgWydsMSddKSwKKyAgICAgICAgICAgICgnbGlua1tocmVmJD0iLmNzcyJdJywgWydsMSddKSwKKyAgICAgICAgICAgICgnbGlua1tpZCQ9IjEiXScsIFsnbDEnXSksCisgICAgICAgICAgICAoJ1tpZCQ9IjEiXScsIFsnbDEnLCAncDEnLCAnaGVhZGVyMScsICdzMWExJywgJ3MyYTEnLCAnczFhMnMxJ10pLAorICAgICAgICAgICAgKCdkaXZbaWQkPSIxIl0nLCBbXSksCisgICAgICAgICAgICAoJ1tpZCQ9Im5vZW5kaW5nIl0nLCBbXSksCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X2F0dHJpYnV0ZV9jb250YWlucyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RNdWx0aXBsZSgKKyAgICAgICAgICAgICMgRnJvbSB0ZXN0X2F0dHJpYnV0ZV9zdGFydHN3aXRoCisgICAgICAgICAgICAoJ1tyZWwqPSJzdHlsZSJdJywgWydsMSddKSwKKyAgICAgICAgICAgICgnbGlua1tyZWwqPSJzdHlsZSJdJywgWydsMSddKSwKKyAgICAgICAgICAgICgnbm90bGlua1tyZWwqPSJub3RzdHlsZSJdJywgW10pLAorICAgICAgICAgICAgKCdbcmVsKj0ibm90c3R5bGUiXScsIFtdKSwKKyAgICAgICAgICAgICgnbGlua1tyZWwqPSJub3RzdHlsZSJdJywgW10pLAorICAgICAgICAgICAgKCdsaW5rW2hyZWYqPSJibGEiXScsIFsnbDEnXSksCisgICAgICAgICAgICAoJ2FbaHJlZio9Imh0dHA6Ly8iXScsIFsnYm9iJywgJ21lJ10pLAorICAgICAgICAgICAgKCdbaHJlZio9Imh0dHA6Ly8iXScsIFsnYm9iJywgJ21lJ10pLAorICAgICAgICAgICAgKCdbaWQqPSJwIl0nLCBbJ3BtdWx0aScsICdwMSddKSwKKyAgICAgICAgICAgICgnZGl2W2lkKj0ibSJdJywgWydtYWluJ10pLAorICAgICAgICAgICAgKCdhW2lkKj0ibSJdJywgWydtZSddKSwKKyAgICAgICAgICAgICMgRnJvbSB0ZXN0X2F0dHJpYnV0ZV9lbmRzd2l0aAorICAgICAgICAgICAgKCdbaHJlZio9Ii5jc3MiXScsIFsnbDEnXSksCisgICAgICAgICAgICAoJ2xpbmtbaHJlZio9Ii5jc3MiXScsIFsnbDEnXSksCisgICAgICAgICAgICAoJ2xpbmtbaWQqPSIxIl0nLCBbJ2wxJ10pLAorICAgICAgICAgICAgKCdbaWQqPSIxIl0nLCBbJ2wxJywgJ3AxJywgJ2hlYWRlcjEnLCAnczFhMScsICdzMWEyJywgJ3MyYTEnLCAnczFhMnMxJ10pLAorICAgICAgICAgICAgKCdkaXZbaWQqPSIxIl0nLCBbXSksCisgICAgICAgICAgICAoJ1tpZCo9Im5vZW5kaW5nIl0nLCBbXSksCisgICAgICAgICAgICAjIE5ldyBmb3IgdGhpcyB0ZXN0CisgICAgICAgICAgICAoJ1tocmVmKj0iLiJdJywgWydib2InLCAnbWUnLCAnbDEnXSksCisgICAgICAgICAgICAoJ2FbaHJlZio9Ii4iXScsIFsnYm9iJywgJ21lJ10pLAorICAgICAgICAgICAgKCdsaW5rW2hyZWYqPSIuIl0nLCBbJ2wxJ10pLAorICAgICAgICAgICAgKCdkaXZbaWQqPSJuIl0nLCBbJ21haW4nLCAnaW5uZXInXSksCisgICAgICAgICAgICAoJ2RpdltpZCo9Im5uIl0nLCBbJ2lubmVyJ10pLAorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9hdHRyaWJ1dGVfZXhhY3Rfb3JfaHlwZW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0TXVsdGlwbGUoCisgICAgICAgICAgICAoJ3BbbGFuZ3w9ImVuIl0nLCBbJ2xhbmctZW4nLCAnbGFuZy1lbi1nYicsICdsYW5nLWVuLXVzJ10pLAorICAgICAgICAgICAgKCdbbGFuZ3w9ImVuIl0nLCBbJ2xhbmctZW4nLCAnbGFuZy1lbi1nYicsICdsYW5nLWVuLXVzJ10pLAorICAgICAgICAgICAgKCdwW2xhbmd8PSJmciJdJywgWydsYW5nLWZyJ10pLAorICAgICAgICAgICAgKCdwW2xhbmd8PSJnYiJdJywgW10pLAorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9hdHRyaWJ1dGVfZXhpc3RzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdE11bHRpcGxlKAorICAgICAgICAgICAgKCdbcmVsXScsIFsnbDEnLCAnYm9iJywgJ21lJ10pLAorICAgICAgICAgICAgKCdsaW5rW3JlbF0nLCBbJ2wxJ10pLAorICAgICAgICAgICAgKCdhW3JlbF0nLCBbJ2JvYicsICdtZSddKSwKKyAgICAgICAgICAgICgnW2xhbmddJywgWydsYW5nLWVuJywgJ2xhbmctZW4tZ2InLCAnbGFuZy1lbi11cycsICdsYW5nLWZyJ10pLAorICAgICAgICAgICAgKCdwW2NsYXNzXScsIFsncDEnLCAncG11bHRpJ10pLAorICAgICAgICAgICAgKCdbYmxhaF0nLCBbXSksCisgICAgICAgICAgICAoJ3BbYmxhaF0nLCBbXSksCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X250aF9vZl90eXBlKHNlbGYpOgorICAgICAgICAjIFRyeSB0byBzZWxlY3QgZmlyc3QgcGFyYWdyYXBoCisgICAgICAgIGVscyA9IHNlbGYuc291cC5zZWxlY3QoJ2RpdiNpbm5lciBwOm50aC1vZi10eXBlKDEpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZWxzKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbHNbMF0uc3RyaW5nLCB1J1NvbWUgdGV4dCcpCisKKyAgICAgICAgIyBUcnkgdG8gc2VsZWN0IHRoaXJkIHBhcmFncmFwaAorICAgICAgICBlbHMgPSBzZWxmLnNvdXAuc2VsZWN0KCdkaXYjaW5uZXIgcDpudGgtb2YtdHlwZSgzKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGVscyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZWxzWzBdLnN0cmluZywgdSdBbm90aGVyJykKKworICAgICAgICAjIFRyeSB0byBzZWxlY3QgKG5vbi1leGlzdGVudCEpIGZvdXJ0aCBwYXJhZ3JhcGgKKyAgICAgICAgZWxzID0gc2VsZi5zb3VwLnNlbGVjdCgnZGl2I2lubmVyIHA6bnRoLW9mLXR5cGUoNCknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihlbHMpLCAwKQorCisgICAgICAgICMgUGFzcyBpbiBhbiBpbnZhbGlkIHZhbHVlLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgIFZhbHVlRXJyb3IsIHNlbGYuc291cC5zZWxlY3QsICdkaXYgcDpudGgtb2YtdHlwZSgwKScpCisKKyAgICBkZWYgdGVzdF9udGhfb2ZfdHlwZV9kaXJlY3RfZGVzY2VuZGFudChzZWxmKToKKyAgICAgICAgZWxzID0gc2VsZi5zb3VwLnNlbGVjdCgnZGl2I2lubmVyID4gcDpudGgtb2YtdHlwZSgxKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGVscyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZWxzWzBdLnN0cmluZywgdSdTb21lIHRleHQnKQorCisgICAgZGVmIHRlc3RfaWRfY2hpbGRfc2VsZWN0b3JfbnRoX29mX3R5cGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cygnI2lubmVyID4gcDpudGgtb2YtdHlwZSgyKScsIFsncDEnXSkKKworICAgIGRlZiB0ZXN0X3NlbGVjdF9vbl9lbGVtZW50KHNlbGYpOgorICAgICAgICAjIE90aGVyIHRlc3RzIG9wZXJhdGUgb24gdGhlIHRyZWU7IHRoaXMgb3BlcmF0ZXMgb24gYW4gZWxlbWVudAorICAgICAgICAjIHdpdGhpbiB0aGUgdHJlZS4KKyAgICAgICAgaW5uZXIgPSBzZWxmLnNvdXAuZmluZCgiZGl2IiwgaWQ9Im1haW4iKQorICAgICAgICBzZWxlY3RlZCA9IGlubmVyLnNlbGVjdCgiZGl2IikKKyAgICAgICAgIyBUaGUgPGRpdiBpZD0iaW5uZXIiPiB0YWcgd2FzIHNlbGVjdGVkLiBUaGUgPGRpdiBpZD0iZm9vdGVyIj4KKyAgICAgICAgIyB0YWcgd2FzIG5vdC4KKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzSURzKHNlbGVjdGVkLCBbJ2lubmVyJ10pCisKKyAgICBkZWYgdGVzdF9vdmVyc3BlY2lmaWVkX2NoaWxkX2lkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHMoIi5mYW5jeSAjaW5uZXIiLCBbJ2lubmVyJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cygiLm5vcm1hbCAjaW5uZXIiLCBbXSkKKworICAgIGRlZiB0ZXN0X2FkamFjZW50X3NpYmxpbmdfc2VsZWN0b3Ioc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cygnI3AxICsgaDInLCBbJ2hlYWRlcjInXSkKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKCcjcDEgKyBoMiArIHAnLCBbJ3BtdWx0aSddKQorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHMoJyNwMSArICNoZWFkZXIyICsgLmNsYXNzMScsIFsncG11bHRpJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW10sIHNlbGYuc291cC5zZWxlY3QoJyNwMSArIHAnKSkKKworICAgIGRlZiB0ZXN0X2dlbmVyYWxfc2libGluZ19zZWxlY3RvcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKCcjcDEgfiBoMicsIFsnaGVhZGVyMicsICdoZWFkZXIzJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cygnI3AxIH4gI2hlYWRlcjInLCBbJ2hlYWRlcjInXSkKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKCcjcDEgfiBoMiArIGEnLCBbJ21lJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cygnI3AxIH4gaDIgKyBbcmVsPSJtZSJdJywgWydtZSddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtdLCBzZWxmLnNvdXAuc2VsZWN0KCcjaW5uZXIgfiBoMicpKQorCisgICAgZGVmIHRlc3RfZGFuZ2xpbmdfY29tYmluYXRvcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi5zb3VwLnNlbGVjdCwgJ2gxID4nKQorCisgICAgZGVmIHRlc3Rfc2libGluZ19jb21iaW5hdG9yX3dvbnRfc2VsZWN0X3NhbWVfdGFnX3R3aWNlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHMoJ3BbbGFuZ10gfiBwJywgWydsYW5nLWVuLWdiJywgJ2xhbmctZW4tdXMnLCAnbGFuZy1mciddKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvY29kZWdlbi5weSBiL2JpdGJha2UvbGliL2NvZGVnZW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU3NzJkNQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2NvZGVnZW4ucHkKQEAgLTAsMCArMSw1NzAgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisiIiIKKyAgICBjb2RlZ2VuCisgICAgfn5+fn5+fgorCisgICAgRXh0ZW5zaW9uIHRvIGFzdCB0aGF0IGFsbG93IGFzdCAtPiBweXRob24gY29kZSBnZW5lcmF0aW9uLgorCisgICAgOmNvcHlyaWdodDogQ29weXJpZ2h0IDIwMDggYnkgQXJtaW4gUm9uYWNoZXIuCisgICAgOmxpY2Vuc2U6IEJTRC4KKyIiIgorZnJvbSBhc3QgaW1wb3J0ICoKKworQk9PTE9QX1NZTUJPTFMgPSB7CisgICAgQW5kOiAgICAgICAgJ2FuZCcsCisgICAgT3I6ICAgICAgICAgJ29yJworfQorCitCSU5PUF9TWU1CT0xTID0geworICAgIEFkZDogICAgICAgICcrJywKKyAgICBTdWI6ICAgICAgICAnLScsCisgICAgTXVsdDogICAgICAgJyonLAorICAgIERpdjogICAgICAgICcvJywKKyAgICBGbG9vckRpdjogICAnLy8nLAorICAgIE1vZDogICAgICAgICclJywKKyAgICBMU2hpZnQ6ICAgICAnPDwnLAorICAgIFJTaGlmdDogICAgICc+PicsCisgICAgQml0T3I6ICAgICAgJ3wnLAorICAgIEJpdEFuZDogICAgICcmJywKKyAgICBCaXRYb3I6ICAgICAnXicKK30KKworQ01QT1BfU1lNQk9MUyA9IHsKKyAgICBFcTogICAgICAgICAnPT0nLAorICAgIEd0OiAgICAgICAgICc+JywKKyAgICBHdEU6ICAgICAgICAnPj0nLAorICAgIEluOiAgICAgICAgICdpbicsCisgICAgSXM6ICAgICAgICAgJ2lzJywKKyAgICBJc05vdDogICAgICAnaXMgbm90JywKKyAgICBMdDogICAgICAgICAnPCcsCisgICAgTHRFOiAgICAgICAgJzw9JywKKyAgICBOb3RFcTogICAgICAnIT0nLAorICAgIE5vdEluOiAgICAgICdub3QgaW4nCit9CisKK1VOQVJZT1BfU1lNQk9MUyA9IHsKKyAgICBJbnZlcnQ6ICAgICAnficsCisgICAgTm90OiAgICAgICAgJ25vdCcsCisgICAgVUFkZDogICAgICAgJysnLAorICAgIFVTdWI6ICAgICAgICctJworfQorCitBTExfU1lNQk9MUyA9IHt9CitBTExfU1lNQk9MUy51cGRhdGUoQk9PTE9QX1NZTUJPTFMpCitBTExfU1lNQk9MUy51cGRhdGUoQklOT1BfU1lNQk9MUykKK0FMTF9TWU1CT0xTLnVwZGF0ZShDTVBPUF9TWU1CT0xTKQorQUxMX1NZTUJPTFMudXBkYXRlKFVOQVJZT1BfU1lNQk9MUykKKworZGVmIHRvX3NvdXJjZShub2RlLCBpbmRlbnRfd2l0aD0nICcgKiA0LCBhZGRfbGluZV9pbmZvcm1hdGlvbj1GYWxzZSk6CisgICAgIiIiVGhpcyBmdW5jdGlvbiBjYW4gY29udmVydCBhIG5vZGUgdHJlZSBiYWNrIGludG8gcHl0aG9uIHNvdXJjZWNvZGUuCisgICAgVGhpcyBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcywgZXNwZWNpYWxseSBpZiB5b3UncmUgZGVhbGluZyB3aXRoCisgICAgY3VzdG9tIGFzdHMgbm90IGdlbmVyYXRlZCBieSBweXRob24gaXRzZWxmLgorCisgICAgSXQgY291bGQgYmUgdGhhdCB0aGUgc291cmNlY29kZSBpcyBldmFsdWFibGUgd2hlbiB0aGUgQVNUIGl0c2VsZiBpcyBub3QKKyAgICBjb21waWxhYmxlIC8gZXZhbHVhYmxlLiAgVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IHRoZSBBU1QgY29udGFpbnMgc29tZQorICAgIG1vcmUgZGF0YSB0aGFuIHJlZ3VsYXIgc291cmNlY29kZSBkb2VzLCB3aGljaCBpcyBkcm9wcGVkIGR1cmluZworICAgIGNvbnZlcnNpb24uCisKKyAgICBFYWNoIGxldmVsIG9mIGluZGVudGF0aW9uIGlzIHJlcGxhY2VkIHdpdGggYGluZGVudF93aXRoYC4gIFBlciBkZWZhdWx0IHRoaXMKKyAgICBwYXJhbWV0ZXIgaXMgZXF1YWwgdG8gZm91ciBzcGFjZXMgYXMgc3VnZ2VzdGVkIGJ5IFBFUCA4LCBidXQgaXQgbWlnaHQgYmUKKyAgICBhZGp1c3RlZCB0byBtYXRjaCB0aGUgYXBwbGljYXRpb24ncyBzdHlsZWd1aWRlLgorCisgICAgSWYgYGFkZF9saW5lX2luZm9ybWF0aW9uYCBpcyBzZXQgdG8gYFRydWVgIGNvbW1lbnRzIGZvciB0aGUgbGluZSBudW1iZXJzCisgICAgb2YgdGhlIG5vZGVzIGFyZSBhZGRlZCB0byB0aGUgb3V0cHV0LiAgVGhpcyBjYW4gYmUgdXNlZCB0byBzcG90IHdyb25nIGxpbmUKKyAgICBudW1iZXIgaW5mb3JtYXRpb24gb2Ygc3RhdGVtZW50IG5vZGVzLgorICAgICIiIgorICAgIGdlbmVyYXRvciA9IFNvdXJjZUdlbmVyYXRvcihpbmRlbnRfd2l0aCwgYWRkX2xpbmVfaW5mb3JtYXRpb24pCisgICAgZ2VuZXJhdG9yLnZpc2l0KG5vZGUpCisgICAgcmV0dXJuICcnLmpvaW4oZ2VuZXJhdG9yLnJlc3VsdCkKKworCitjbGFzcyBTb3VyY2VHZW5lcmF0b3IoTm9kZVZpc2l0b3IpOgorICAgICIiIlRoaXMgdmlzaXRvciBpcyBhYmxlIHRvIHRyYW5zZm9ybSBhIHdlbGwgZm9ybWVkIHN5bnRheCB0cmVlIGludG8gcHl0aG9uCisgICAgc291cmNlY29kZS4gIEZvciBtb3JlIGRldGFpbHMgaGF2ZSBhIGxvb2sgYXQgdGhlIGRvY3N0cmluZyBvZiB0aGUKKyAgICBgbm9kZV90b19zb3VyY2VgIGZ1bmN0aW9uLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGluZGVudF93aXRoLCBhZGRfbGluZV9pbmZvcm1hdGlvbj1GYWxzZSk6CisgICAgICAgIHNlbGYucmVzdWx0ID0gW10KKyAgICAgICAgc2VsZi5pbmRlbnRfd2l0aCA9IGluZGVudF93aXRoCisgICAgICAgIHNlbGYuYWRkX2xpbmVfaW5mb3JtYXRpb24gPSBhZGRfbGluZV9pbmZvcm1hdGlvbgorICAgICAgICBzZWxmLmluZGVudGF0aW9uID0gMAorICAgICAgICBzZWxmLm5ld19saW5lcyA9IDAKKworICAgIGRlZiB3cml0ZShzZWxmLCB4KToKKyAgICAgICAgaWYgc2VsZi5uZXdfbGluZXM6CisgICAgICAgICAgICBpZiBzZWxmLnJlc3VsdDoKKyAgICAgICAgICAgICAgICBzZWxmLnJlc3VsdC5hcHBlbmQoJ1xuJyAqIHNlbGYubmV3X2xpbmVzKQorICAgICAgICAgICAgc2VsZi5yZXN1bHQuYXBwZW5kKHNlbGYuaW5kZW50X3dpdGggKiBzZWxmLmluZGVudGF0aW9uKQorICAgICAgICAgICAgc2VsZi5uZXdfbGluZXMgPSAwCisgICAgICAgIHNlbGYucmVzdWx0LmFwcGVuZCh4KQorCisgICAgZGVmIG5ld2xpbmUoc2VsZiwgbm9kZT1Ob25lLCBleHRyYT0wKToKKyAgICAgICAgc2VsZi5uZXdfbGluZXMgPSBtYXgoc2VsZi5uZXdfbGluZXMsIDEgKyBleHRyYSkKKyAgICAgICAgaWYgbm9kZSBpcyBub3QgTm9uZSBhbmQgc2VsZi5hZGRfbGluZV9pbmZvcm1hdGlvbjoKKyAgICAgICAgICAgIHNlbGYud3JpdGUoJyMgbGluZTogJXMnICUgbm9kZS5saW5lbm8pCisgICAgICAgICAgICBzZWxmLm5ld19saW5lcyA9IDEKKworICAgIGRlZiBib2R5KHNlbGYsIHN0YXRlbWVudHMpOgorICAgICAgICBzZWxmLm5ld19saW5lID0gVHJ1ZQorICAgICAgICBzZWxmLmluZGVudGF0aW9uICs9IDEKKyAgICAgICAgZm9yIHN0bXQgaW4gc3RhdGVtZW50czoKKyAgICAgICAgICAgIHNlbGYudmlzaXQoc3RtdCkKKyAgICAgICAgc2VsZi5pbmRlbnRhdGlvbiAtPSAxCisKKyAgICBkZWYgYm9keV9vcl9lbHNlKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLmJvZHkobm9kZS5ib2R5KQorICAgICAgICBpZiBub2RlLm9yZWxzZToKKyAgICAgICAgICAgIHNlbGYubmV3bGluZSgpCisgICAgICAgICAgICBzZWxmLndyaXRlKCdlbHNlOicpCisgICAgICAgICAgICBzZWxmLmJvZHkobm9kZS5vcmVsc2UpCisKKyAgICBkZWYgc2lnbmF0dXJlKHNlbGYsIG5vZGUpOgorICAgICAgICB3YW50X2NvbW1hID0gW10KKyAgICAgICAgZGVmIHdyaXRlX2NvbW1hKCk6CisgICAgICAgICAgICBpZiB3YW50X2NvbW1hOgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoJywgJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgd2FudF9jb21tYS5hcHBlbmQoVHJ1ZSkKKworICAgICAgICBwYWRkaW5nID0gW05vbmVdICogKGxlbihub2RlLmFyZ3MpIC0gbGVuKG5vZGUuZGVmYXVsdHMpKQorICAgICAgICBmb3IgYXJnLCBkZWZhdWx0IGluIHppcChub2RlLmFyZ3MsIHBhZGRpbmcgKyBub2RlLmRlZmF1bHRzKToKKyAgICAgICAgICAgIHdyaXRlX2NvbW1hKCkKKyAgICAgICAgICAgIHNlbGYudmlzaXQoYXJnKQorICAgICAgICAgICAgaWYgZGVmYXVsdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCc9JykKKyAgICAgICAgICAgICAgICBzZWxmLnZpc2l0KGRlZmF1bHQpCisgICAgICAgIGlmIG5vZGUudmFyYXJnIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgd3JpdGVfY29tbWEoKQorICAgICAgICAgICAgc2VsZi53cml0ZSgnKicgKyBub2RlLnZhcmFyZykKKyAgICAgICAgaWYgbm9kZS5rd2FyZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHdyaXRlX2NvbW1hKCkKKyAgICAgICAgICAgIHNlbGYud3JpdGUoJyoqJyArIG5vZGUua3dhcmcpCisKKyAgICBkZWYgZGVjb3JhdG9ycyhzZWxmLCBub2RlKToKKyAgICAgICAgZm9yIGRlY29yYXRvciBpbiBub2RlLmRlY29yYXRvcl9saXN0OgorICAgICAgICAgICAgc2VsZi5uZXdsaW5lKGRlY29yYXRvcikKKyAgICAgICAgICAgIHNlbGYud3JpdGUoJ0AnKQorICAgICAgICAgICAgc2VsZi52aXNpdChkZWNvcmF0b3IpCisKKyAgICAjIFN0YXRlbWVudHMKKworICAgIGRlZiB2aXNpdF9Bc3NpZ24oc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYubmV3bGluZShub2RlKQorICAgICAgICBmb3IgaWR4LCB0YXJnZXQgaW4gZW51bWVyYXRlKG5vZGUudGFyZ2V0cyk6CisgICAgICAgICAgICBpZiBpZHg6CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgnLCAnKQorICAgICAgICAgICAgc2VsZi52aXNpdCh0YXJnZXQpCisgICAgICAgIHNlbGYud3JpdGUoJyA9ICcpCisgICAgICAgIHNlbGYudmlzaXQobm9kZS52YWx1ZSkKKworICAgIGRlZiB2aXNpdF9BdWdBc3NpZ24oc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYubmV3bGluZShub2RlKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUudGFyZ2V0KQorICAgICAgICBzZWxmLndyaXRlKEJJTk9QX1NZTUJPTFNbdHlwZShub2RlLm9wKV0gKyAnPScpCisgICAgICAgIHNlbGYudmlzaXQobm9kZS52YWx1ZSkKKworICAgIGRlZiB2aXNpdF9JbXBvcnRGcm9tKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLm5ld2xpbmUobm9kZSkKKyAgICAgICAgc2VsZi53cml0ZSgnZnJvbSAlcyVzIGltcG9ydCAnICUgKCcuJyAqIG5vZGUubGV2ZWwsIG5vZGUubW9kdWxlKSkKKyAgICAgICAgZm9yIGlkeCwgaXRlbSBpbiBlbnVtZXJhdGUobm9kZS5uYW1lcyk6CisgICAgICAgICAgICBpZiBpZHg6CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgnLCAnKQorICAgICAgICAgICAgc2VsZi53cml0ZShpdGVtKQorCisgICAgZGVmIHZpc2l0X0ltcG9ydChzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5uZXdsaW5lKG5vZGUpCisgICAgICAgIGZvciBpdGVtIGluIG5vZGUubmFtZXM6CisgICAgICAgICAgICBzZWxmLndyaXRlKCdpbXBvcnQgJykKKyAgICAgICAgICAgIHNlbGYudmlzaXQoaXRlbSkKKworICAgIGRlZiB2aXNpdF9FeHByKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLm5ld2xpbmUobm9kZSkKKyAgICAgICAgc2VsZi5nZW5lcmljX3Zpc2l0KG5vZGUpCisKKyAgICBkZWYgdmlzaXRfRnVuY3Rpb25EZWYoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYubmV3bGluZShleHRyYT0xKQorICAgICAgICBzZWxmLmRlY29yYXRvcnMobm9kZSkKKyAgICAgICAgc2VsZi5uZXdsaW5lKG5vZGUpCisgICAgICAgIHNlbGYud3JpdGUoJ2RlZiAlcygnICUgbm9kZS5uYW1lKQorICAgICAgICBzZWxmLnNpZ25hdHVyZShub2RlLmFyZ3MpCisgICAgICAgIHNlbGYud3JpdGUoJyk6JykKKyAgICAgICAgc2VsZi5ib2R5KG5vZGUuYm9keSkKKworICAgIGRlZiB2aXNpdF9DbGFzc0RlZihzZWxmLCBub2RlKToKKyAgICAgICAgaGF2ZV9hcmdzID0gW10KKyAgICAgICAgZGVmIHBhcmVuX29yX2NvbW1hKCk6CisgICAgICAgICAgICBpZiBoYXZlX2FyZ3M6CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgnLCAnKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBoYXZlX2FyZ3MuYXBwZW5kKFRydWUpCisgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgnKCcpCisKKyAgICAgICAgc2VsZi5uZXdsaW5lKGV4dHJhPTIpCisgICAgICAgIHNlbGYuZGVjb3JhdG9ycyhub2RlKQorICAgICAgICBzZWxmLm5ld2xpbmUobm9kZSkKKyAgICAgICAgc2VsZi53cml0ZSgnY2xhc3MgJXMnICUgbm9kZS5uYW1lKQorICAgICAgICBmb3IgYmFzZSBpbiBub2RlLmJhc2VzOgorICAgICAgICAgICAgcGFyZW5fb3JfY29tbWEoKQorICAgICAgICAgICAgc2VsZi52aXNpdChiYXNlKQorICAgICAgICAjIFhYWDogdGhlIGlmIGhlcmUgaXMgdXNlZCB0byBrZWVwIHRoaXMgbW9kdWxlIGNvbXBhdGlibGUKKyAgICAgICAgIyAgICAgIHdpdGggcHl0aG9uIDIuNi4KKyAgICAgICAgaWYgaGFzYXR0cihub2RlLCAna2V5d29yZHMnKToKKyAgICAgICAgICAgIGZvciBrZXl3b3JkIGluIG5vZGUua2V5d29yZHM6CisgICAgICAgICAgICAgICAgcGFyZW5fb3JfY29tbWEoKQorICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoa2V5d29yZC5hcmcgKyAnPScpCisgICAgICAgICAgICAgICAgc2VsZi52aXNpdChrZXl3b3JkLnZhbHVlKQorICAgICAgICAgICAgaWYgbm9kZS5zdGFyYXJncyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBwYXJlbl9vcl9jb21tYSgpCisgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgnKicpCisgICAgICAgICAgICAgICAgc2VsZi52aXNpdChub2RlLnN0YXJhcmdzKQorICAgICAgICAgICAgaWYgbm9kZS5rd2FyZ3MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgcGFyZW5fb3JfY29tbWEoKQorICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoJyoqJykKKyAgICAgICAgICAgICAgICBzZWxmLnZpc2l0KG5vZGUua3dhcmdzKQorICAgICAgICBzZWxmLndyaXRlKGhhdmVfYXJncyBhbmQgJyk6JyBvciAnOicpCisgICAgICAgIHNlbGYuYm9keShub2RlLmJvZHkpCisKKyAgICBkZWYgdmlzaXRfSWYoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYubmV3bGluZShub2RlKQorICAgICAgICBzZWxmLndyaXRlKCdpZiAnKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUudGVzdCkKKyAgICAgICAgc2VsZi53cml0ZSgnOicpCisgICAgICAgIHNlbGYuYm9keShub2RlLmJvZHkpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBlbHNlXyA9IG5vZGUub3JlbHNlCisgICAgICAgICAgICBpZiBsZW4oZWxzZV8pID09IDEgYW5kIGlzaW5zdGFuY2UoZWxzZV9bMF0sIElmKToKKyAgICAgICAgICAgICAgICBub2RlID0gZWxzZV9bMF0KKyAgICAgICAgICAgICAgICBzZWxmLm5ld2xpbmUoKQorICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoJ2VsaWYgJykKKyAgICAgICAgICAgICAgICBzZWxmLnZpc2l0KG5vZGUudGVzdCkKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCc6JykKKyAgICAgICAgICAgICAgICBzZWxmLmJvZHkobm9kZS5ib2R5KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLm5ld2xpbmUoKQorICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoJ2Vsc2U6JykKKyAgICAgICAgICAgICAgICBzZWxmLmJvZHkoZWxzZV8pCisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgIGRlZiB2aXNpdF9Gb3Ioc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYubmV3bGluZShub2RlKQorICAgICAgICBzZWxmLndyaXRlKCdmb3IgJykKKyAgICAgICAgc2VsZi52aXNpdChub2RlLnRhcmdldCkKKyAgICAgICAgc2VsZi53cml0ZSgnIGluICcpCisgICAgICAgIHNlbGYudmlzaXQobm9kZS5pdGVyKQorICAgICAgICBzZWxmLndyaXRlKCc6JykKKyAgICAgICAgc2VsZi5ib2R5X29yX2Vsc2Uobm9kZSkKKworICAgIGRlZiB2aXNpdF9XaGlsZShzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5uZXdsaW5lKG5vZGUpCisgICAgICAgIHNlbGYud3JpdGUoJ3doaWxlICcpCisgICAgICAgIHNlbGYudmlzaXQobm9kZS50ZXN0KQorICAgICAgICBzZWxmLndyaXRlKCc6JykKKyAgICAgICAgc2VsZi5ib2R5X29yX2Vsc2Uobm9kZSkKKworICAgIGRlZiB2aXNpdF9XaXRoKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLm5ld2xpbmUobm9kZSkKKyAgICAgICAgc2VsZi53cml0ZSgnd2l0aCAnKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUuY29udGV4dF9leHByKQorICAgICAgICBpZiBub2RlLm9wdGlvbmFsX3ZhcnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLndyaXRlKCcgYXMgJykKKyAgICAgICAgICAgIHNlbGYudmlzaXQobm9kZS5vcHRpb25hbF92YXJzKQorICAgICAgICBzZWxmLndyaXRlKCc6JykKKyAgICAgICAgc2VsZi5ib2R5KG5vZGUuYm9keSkKKworICAgIGRlZiB2aXNpdF9QYXNzKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLm5ld2xpbmUobm9kZSkKKyAgICAgICAgc2VsZi53cml0ZSgncGFzcycpCisKKyAgICBkZWYgdmlzaXRfUHJpbnQoc2VsZiwgbm9kZSk6CisgICAgICAgICMgWFhYOiBweXRob24gMi42IG9ubHkKKyAgICAgICAgc2VsZi5uZXdsaW5lKG5vZGUpCisgICAgICAgIHNlbGYud3JpdGUoJ3ByaW50ICcpCisgICAgICAgIHdhbnRfY29tbWEgPSBGYWxzZQorICAgICAgICBpZiBub2RlLmRlc3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLndyaXRlKCcgPj4gJykKKyAgICAgICAgICAgIHNlbGYudmlzaXQobm9kZS5kZXN0KQorICAgICAgICAgICAgd2FudF9jb21tYSA9IFRydWUKKyAgICAgICAgZm9yIHZhbHVlIGluIG5vZGUudmFsdWVzOgorICAgICAgICAgICAgaWYgd2FudF9jb21tYToKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCcsICcpCisgICAgICAgICAgICBzZWxmLnZpc2l0KHZhbHVlKQorICAgICAgICAgICAgd2FudF9jb21tYSA9IFRydWUKKyAgICAgICAgaWYgbm90IG5vZGUubmw6CisgICAgICAgICAgICBzZWxmLndyaXRlKCcsJykKKworICAgIGRlZiB2aXNpdF9EZWxldGUoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYubmV3bGluZShub2RlKQorICAgICAgICBzZWxmLndyaXRlKCdkZWwgJykKKyAgICAgICAgZm9yIGlkeCwgdGFyZ2V0IGluIGVudW1lcmF0ZShub2RlKToKKyAgICAgICAgICAgIGlmIGlkeDoKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCcsICcpCisgICAgICAgICAgICBzZWxmLnZpc2l0KHRhcmdldCkKKworICAgIGRlZiB2aXNpdF9UcnlFeGNlcHQoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYubmV3bGluZShub2RlKQorICAgICAgICBzZWxmLndyaXRlKCd0cnk6JykKKyAgICAgICAgc2VsZi5ib2R5KG5vZGUuYm9keSkKKyAgICAgICAgZm9yIGhhbmRsZXIgaW4gbm9kZS5oYW5kbGVyczoKKyAgICAgICAgICAgIHNlbGYudmlzaXQoaGFuZGxlcikKKworICAgIGRlZiB2aXNpdF9UcnlGaW5hbGx5KHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLm5ld2xpbmUobm9kZSkKKyAgICAgICAgc2VsZi53cml0ZSgndHJ5OicpCisgICAgICAgIHNlbGYuYm9keShub2RlLmJvZHkpCisgICAgICAgIHNlbGYubmV3bGluZShub2RlKQorICAgICAgICBzZWxmLndyaXRlKCdmaW5hbGx5OicpCisgICAgICAgIHNlbGYuYm9keShub2RlLmZpbmFsYm9keSkKKworICAgIGRlZiB2aXNpdF9HbG9iYWwoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYubmV3bGluZShub2RlKQorICAgICAgICBzZWxmLndyaXRlKCdnbG9iYWwgJyArICcsICcuam9pbihub2RlLm5hbWVzKSkKKworICAgIGRlZiB2aXNpdF9Ob25sb2NhbChzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5uZXdsaW5lKG5vZGUpCisgICAgICAgIHNlbGYud3JpdGUoJ25vbmxvY2FsICcgKyAnLCAnLmpvaW4obm9kZS5uYW1lcykpCisKKyAgICBkZWYgdmlzaXRfUmV0dXJuKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLm5ld2xpbmUobm9kZSkKKyAgICAgICAgc2VsZi53cml0ZSgncmV0dXJuICcpCisgICAgICAgIHNlbGYudmlzaXQobm9kZS52YWx1ZSkKKworICAgIGRlZiB2aXNpdF9CcmVhayhzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5uZXdsaW5lKG5vZGUpCisgICAgICAgIHNlbGYud3JpdGUoJ2JyZWFrJykKKworICAgIGRlZiB2aXNpdF9Db250aW51ZShzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5uZXdsaW5lKG5vZGUpCisgICAgICAgIHNlbGYud3JpdGUoJ2NvbnRpbnVlJykKKworICAgIGRlZiB2aXNpdF9SYWlzZShzZWxmLCBub2RlKToKKyAgICAgICAgIyBYWFg6IFB5dGhvbiAyLjYgLyAzLjAgY29tcGF0aWJpbGl0eQorICAgICAgICBzZWxmLm5ld2xpbmUobm9kZSkKKyAgICAgICAgc2VsZi53cml0ZSgncmFpc2UnKQorICAgICAgICBpZiBoYXNhdHRyKG5vZGUsICdleGMnKSBhbmQgbm9kZS5leGMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLndyaXRlKCcgJykKKyAgICAgICAgICAgIHNlbGYudmlzaXQobm9kZS5leGMpCisgICAgICAgICAgICBpZiBub2RlLmNhdXNlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoJyBmcm9tICcpCisgICAgICAgICAgICAgICAgc2VsZi52aXNpdChub2RlLmNhdXNlKQorICAgICAgICBlbGlmIGhhc2F0dHIobm9kZSwgJ3R5cGUnKSBhbmQgbm9kZS50eXBlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi52aXNpdChub2RlLnR5cGUpCisgICAgICAgICAgICBpZiBub2RlLmluc3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgnLCAnKQorICAgICAgICAgICAgICAgIHNlbGYudmlzaXQobm9kZS5pbnN0KQorICAgICAgICAgICAgaWYgbm9kZS50YmFjayBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCcsICcpCisgICAgICAgICAgICAgICAgc2VsZi52aXNpdChub2RlLnRiYWNrKQorCisgICAgIyBFeHByZXNzaW9ucworCisgICAgZGVmIHZpc2l0X0F0dHJpYnV0ZShzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi52aXNpdChub2RlLnZhbHVlKQorICAgICAgICBzZWxmLndyaXRlKCcuJyArIG5vZGUuYXR0cikKKworICAgIGRlZiB2aXNpdF9DYWxsKHNlbGYsIG5vZGUpOgorICAgICAgICB3YW50X2NvbW1hID0gW10KKyAgICAgICAgZGVmIHdyaXRlX2NvbW1hKCk6CisgICAgICAgICAgICBpZiB3YW50X2NvbW1hOgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoJywgJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgd2FudF9jb21tYS5hcHBlbmQoVHJ1ZSkKKworICAgICAgICBzZWxmLnZpc2l0KG5vZGUuZnVuYykKKyAgICAgICAgc2VsZi53cml0ZSgnKCcpCisgICAgICAgIGZvciBhcmcgaW4gbm9kZS5hcmdzOgorICAgICAgICAgICAgd3JpdGVfY29tbWEoKQorICAgICAgICAgICAgc2VsZi52aXNpdChhcmcpCisgICAgICAgIGZvciBrZXl3b3JkIGluIG5vZGUua2V5d29yZHM6CisgICAgICAgICAgICB3cml0ZV9jb21tYSgpCisgICAgICAgICAgICBzZWxmLndyaXRlKGtleXdvcmQuYXJnICsgJz0nKQorICAgICAgICAgICAgc2VsZi52aXNpdChrZXl3b3JkLnZhbHVlKQorICAgICAgICBpZiBub2RlLnN0YXJhcmdzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgd3JpdGVfY29tbWEoKQorICAgICAgICAgICAgc2VsZi53cml0ZSgnKicpCisgICAgICAgICAgICBzZWxmLnZpc2l0KG5vZGUuc3RhcmFyZ3MpCisgICAgICAgIGlmIG5vZGUua3dhcmdzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgd3JpdGVfY29tbWEoKQorICAgICAgICAgICAgc2VsZi53cml0ZSgnKionKQorICAgICAgICAgICAgc2VsZi52aXNpdChub2RlLmt3YXJncykKKyAgICAgICAgc2VsZi53cml0ZSgnKScpCisKKyAgICBkZWYgdmlzaXRfTmFtZShzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi53cml0ZShub2RlLmlkKQorCisgICAgZGVmIHZpc2l0X1N0cihzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi53cml0ZShyZXByKG5vZGUucykpCisKKyAgICBkZWYgdmlzaXRfQnl0ZXMoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYud3JpdGUocmVwcihub2RlLnMpKQorCisgICAgZGVmIHZpc2l0X051bShzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi53cml0ZShyZXByKG5vZGUubikpCisKKyAgICBkZWYgdmlzaXRfVHVwbGUoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYud3JpdGUoJygnKQorICAgICAgICBpZHggPSAtMQorICAgICAgICBmb3IgaWR4LCBpdGVtIGluIGVudW1lcmF0ZShub2RlLmVsdHMpOgorICAgICAgICAgICAgaWYgaWR4OgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoJywgJykKKyAgICAgICAgICAgIHNlbGYudmlzaXQoaXRlbSkKKyAgICAgICAgc2VsZi53cml0ZShpZHggYW5kICcpJyBvciAnLCknKQorCisgICAgZGVmIHNlcXVlbmNlX3Zpc2l0KGxlZnQsIHJpZ2h0KToKKyAgICAgICAgZGVmIHZpc2l0KHNlbGYsIG5vZGUpOgorICAgICAgICAgICAgc2VsZi53cml0ZShsZWZ0KQorICAgICAgICAgICAgZm9yIGlkeCwgaXRlbSBpbiBlbnVtZXJhdGUobm9kZS5lbHRzKToKKyAgICAgICAgICAgICAgICBpZiBpZHg6CisgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoJywgJykKKyAgICAgICAgICAgICAgICBzZWxmLnZpc2l0KGl0ZW0pCisgICAgICAgICAgICBzZWxmLndyaXRlKHJpZ2h0KQorICAgICAgICByZXR1cm4gdmlzaXQKKworICAgIHZpc2l0X0xpc3QgPSBzZXF1ZW5jZV92aXNpdCgnWycsICddJykKKyAgICB2aXNpdF9TZXQgPSBzZXF1ZW5jZV92aXNpdCgneycsICd9JykKKyAgICBkZWwgc2VxdWVuY2VfdmlzaXQKKworICAgIGRlZiB2aXNpdF9EaWN0KHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLndyaXRlKCd7JykKKyAgICAgICAgZm9yIGlkeCwgKGtleSwgdmFsdWUpIGluIGVudW1lcmF0ZSh6aXAobm9kZS5rZXlzLCBub2RlLnZhbHVlcykpOgorICAgICAgICAgICAgaWYgaWR4OgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoJywgJykKKyAgICAgICAgICAgIHNlbGYudmlzaXQoa2V5KQorICAgICAgICAgICAgc2VsZi53cml0ZSgnOiAnKQorICAgICAgICAgICAgc2VsZi52aXNpdCh2YWx1ZSkKKyAgICAgICAgc2VsZi53cml0ZSgnfScpCisKKyAgICBkZWYgdmlzaXRfQmluT3Aoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYudmlzaXQobm9kZS5sZWZ0KQorICAgICAgICBzZWxmLndyaXRlKCcgJXMgJyAlIEJJTk9QX1NZTUJPTFNbdHlwZShub2RlLm9wKV0pCisgICAgICAgIHNlbGYudmlzaXQobm9kZS5yaWdodCkKKworICAgIGRlZiB2aXNpdF9Cb29sT3Aoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYud3JpdGUoJygnKQorICAgICAgICBmb3IgaWR4LCB2YWx1ZSBpbiBlbnVtZXJhdGUobm9kZS52YWx1ZXMpOgorICAgICAgICAgICAgaWYgaWR4OgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoJyAlcyAnICUgQk9PTE9QX1NZTUJPTFNbdHlwZShub2RlLm9wKV0pCisgICAgICAgICAgICBzZWxmLnZpc2l0KHZhbHVlKQorICAgICAgICBzZWxmLndyaXRlKCcpJykKKworICAgIGRlZiB2aXNpdF9Db21wYXJlKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLndyaXRlKCcoJykKKyAgICAgICAgc2VsZi53cml0ZShub2RlLmxlZnQpCisgICAgICAgIGZvciBvcCwgcmlnaHQgaW4gemlwKG5vZGUub3BzLCBub2RlLmNvbXBhcmF0b3JzKToKKyAgICAgICAgICAgIHNlbGYud3JpdGUoJyAlcyAlJScgJSBDTVBPUF9TWU1CT0xTW3R5cGUob3ApXSkKKyAgICAgICAgICAgIHNlbGYudmlzaXQocmlnaHQpCisgICAgICAgIHNlbGYud3JpdGUoJyknKQorCisgICAgZGVmIHZpc2l0X1VuYXJ5T3Aoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYud3JpdGUoJygnKQorICAgICAgICBvcCA9IFVOQVJZT1BfU1lNQk9MU1t0eXBlKG5vZGUub3ApXQorICAgICAgICBzZWxmLndyaXRlKG9wKQorICAgICAgICBpZiBvcCA9PSAnbm90JzoKKyAgICAgICAgICAgIHNlbGYud3JpdGUoJyAnKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUub3BlcmFuZCkKKyAgICAgICAgc2VsZi53cml0ZSgnKScpCisKKyAgICBkZWYgdmlzaXRfU3Vic2NyaXB0KHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLnZpc2l0KG5vZGUudmFsdWUpCisgICAgICAgIHNlbGYud3JpdGUoJ1snKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUuc2xpY2UpCisgICAgICAgIHNlbGYud3JpdGUoJ10nKQorCisgICAgZGVmIHZpc2l0X1NsaWNlKHNlbGYsIG5vZGUpOgorICAgICAgICBpZiBub2RlLmxvd2VyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi52aXNpdChub2RlLmxvd2VyKQorICAgICAgICBzZWxmLndyaXRlKCc6JykKKyAgICAgICAgaWYgbm9kZS51cHBlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYudmlzaXQobm9kZS51cHBlcikKKyAgICAgICAgaWYgbm9kZS5zdGVwIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi53cml0ZSgnOicpCisgICAgICAgICAgICBpZiBub3QgKGlzaW5zdGFuY2Uobm9kZS5zdGVwLCBOYW1lKSBhbmQgbm9kZS5zdGVwLmlkID09ICdOb25lJyk6CisgICAgICAgICAgICAgICAgc2VsZi52aXNpdChub2RlLnN0ZXApCisKKyAgICBkZWYgdmlzaXRfRXh0U2xpY2Uoc2VsZiwgbm9kZSk6CisgICAgICAgIGZvciBpZHgsIGl0ZW0gaW4gbm9kZS5kaW1zOgorICAgICAgICAgICAgaWYgaWR4OgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoJywgJykKKyAgICAgICAgICAgIHNlbGYudmlzaXQoaXRlbSkKKworICAgIGRlZiB2aXNpdF9ZaWVsZChzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi53cml0ZSgneWllbGQgJykKKyAgICAgICAgc2VsZi52aXNpdChub2RlLnZhbHVlKQorCisgICAgZGVmIHZpc2l0X0xhbWJkYShzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi53cml0ZSgnbGFtYmRhICcpCisgICAgICAgIHNlbGYuc2lnbmF0dXJlKG5vZGUuYXJncykKKyAgICAgICAgc2VsZi53cml0ZSgnOiAnKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUuYm9keSkKKworICAgIGRlZiB2aXNpdF9FbGxpcHNpcyhzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi53cml0ZSgnRWxsaXBzaXMnKQorCisgICAgZGVmIGdlbmVyYXRvcl92aXNpdChsZWZ0LCByaWdodCk6CisgICAgICAgIGRlZiB2aXNpdChzZWxmLCBub2RlKToKKyAgICAgICAgICAgIHNlbGYud3JpdGUobGVmdCkKKyAgICAgICAgICAgIHNlbGYudmlzaXQobm9kZS5lbHQpCisgICAgICAgICAgICBmb3IgY29tcHJlaGVuc2lvbiBpbiBub2RlLmdlbmVyYXRvcnM6CisgICAgICAgICAgICAgICAgc2VsZi52aXNpdChjb21wcmVoZW5zaW9uKQorICAgICAgICAgICAgc2VsZi53cml0ZShyaWdodCkKKyAgICAgICAgcmV0dXJuIHZpc2l0CisKKyAgICB2aXNpdF9MaXN0Q29tcCA9IGdlbmVyYXRvcl92aXNpdCgnWycsICddJykKKyAgICB2aXNpdF9HZW5lcmF0b3JFeHAgPSBnZW5lcmF0b3JfdmlzaXQoJygnLCAnKScpCisgICAgdmlzaXRfU2V0Q29tcCA9IGdlbmVyYXRvcl92aXNpdCgneycsICd9JykKKyAgICBkZWwgZ2VuZXJhdG9yX3Zpc2l0CisKKyAgICBkZWYgdmlzaXRfRGljdENvbXAoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYud3JpdGUoJ3snKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUua2V5KQorICAgICAgICBzZWxmLndyaXRlKCc6ICcpCisgICAgICAgIHNlbGYudmlzaXQobm9kZS52YWx1ZSkKKyAgICAgICAgZm9yIGNvbXByZWhlbnNpb24gaW4gbm9kZS5nZW5lcmF0b3JzOgorICAgICAgICAgICAgc2VsZi52aXNpdChjb21wcmVoZW5zaW9uKQorICAgICAgICBzZWxmLndyaXRlKCd9JykKKworICAgIGRlZiB2aXNpdF9JZkV4cChzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi52aXNpdChub2RlLmJvZHkpCisgICAgICAgIHNlbGYud3JpdGUoJyBpZiAnKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUudGVzdCkKKyAgICAgICAgc2VsZi53cml0ZSgnIGVsc2UgJykKKyAgICAgICAgc2VsZi52aXNpdChub2RlLm9yZWxzZSkKKworICAgIGRlZiB2aXNpdF9TdGFycmVkKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLndyaXRlKCcqJykKKyAgICAgICAgc2VsZi52aXNpdChub2RlLnZhbHVlKQorCisgICAgZGVmIHZpc2l0X1JlcHIoc2VsZiwgbm9kZSk6CisgICAgICAgICMgWFhYOiBweXRob24gMi42IG9ubHkKKyAgICAgICAgc2VsZi53cml0ZSgnYCcpCisgICAgICAgIHNlbGYudmlzaXQobm9kZS52YWx1ZSkKKyAgICAgICAgc2VsZi53cml0ZSgnYCcpCisKKyAgICAjIEhlbHBlciBOb2RlcworCisgICAgZGVmIHZpc2l0X2FsaWFzKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLndyaXRlKG5vZGUubmFtZSkKKyAgICAgICAgaWYgbm9kZS5hc25hbWUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLndyaXRlKCcgYXMgJyArIG5vZGUuYXNuYW1lKQorCisgICAgZGVmIHZpc2l0X2NvbXByZWhlbnNpb24oc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYud3JpdGUoJyBmb3IgJykKKyAgICAgICAgc2VsZi52aXNpdChub2RlLnRhcmdldCkKKyAgICAgICAgc2VsZi53cml0ZSgnIGluICcpCisgICAgICAgIHNlbGYudmlzaXQobm9kZS5pdGVyKQorICAgICAgICBpZiBub2RlLmlmczoKKyAgICAgICAgICAgIGZvciBpZl8gaW4gbm9kZS5pZnM6CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgnIGlmICcpCisgICAgICAgICAgICAgICAgc2VsZi52aXNpdChpZl8pCisKKyAgICBkZWYgdmlzaXRfZXhjZXB0aGFuZGxlcihzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5uZXdsaW5lKG5vZGUpCisgICAgICAgIHNlbGYud3JpdGUoJ2V4Y2VwdCcpCisgICAgICAgIGlmIG5vZGUudHlwZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYud3JpdGUoJyAnKQorICAgICAgICAgICAgc2VsZi52aXNpdChub2RlLnR5cGUpCisgICAgICAgICAgICBpZiBub2RlLm5hbWUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgnIGFzICcpCisgICAgICAgICAgICAgICAgc2VsZi52aXNpdChub2RlLm5hbWUpCisgICAgICAgIHNlbGYud3JpdGUoJzonKQorICAgICAgICBzZWxmLmJvZHkobm9kZS5ib2R5KQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvcGx5L19faW5pdF9fLnB5IGIvYml0YmFrZS9saWIvcGx5L19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1M2E5ODUKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9wbHkvX19pbml0X18ucHkKQEAgLTAsMCArMSw0IEBACisjIFBMWSBwYWNrYWdlCisjIEF1dGhvcjogRGF2aWQgQmVhemxleSAoZGF2ZUBkYWJlYXouY29tKQorCitfX2FsbF9fID0gWydsZXgnLCd5YWNjJ10KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3BseS9sZXgucHkgYi9iaXRiYWtlL2xpYi9wbHkvbGV4LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2N2VjMTAKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9wbHkvbGV4LnB5CkBAIC0wLDAgKzEsMTA1OCBAQAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBwbHk6IGxleC5weQorIworIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSwKKyMgRGF2aWQgTS4gQmVhemxleSAoRGFiZWF6IExMQykKKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIyAKKyMgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisjICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gIAorIyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgCisjICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorIyAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAgCisjICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgRGF2aWQgQmVhemxleSBvciBEYWJlYXogTExDIG1heSBiZSB1c2VkIHRvCisjICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyMgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworX192ZXJzaW9uX18gICAgPSAiMy4zIgorX190YWJ2ZXJzaW9uX18gPSAiMy4yIiAgICAgICAjIFZlcnNpb24gb2YgdGFibGUgZmlsZSB1c2VkCisKK2ltcG9ydCByZSwgc3lzLCB0eXBlcywgY29weSwgb3MKKworIyBUaGlzIHR1cGxlIGNvbnRhaW5zIGtub3duIHN0cmluZyB0eXBlcwordHJ5OgorICAgICMgUHl0aG9uIDIuNgorICAgIFN0cmluZ1R5cGVzID0gKHR5cGVzLlN0cmluZ1R5cGUsIHR5cGVzLlVuaWNvZGVUeXBlKQorZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICMgUHl0aG9uIDMuMAorICAgIFN0cmluZ1R5cGVzID0gKHN0ciwgYnl0ZXMpCisKKyMgRXh0cmFjdCB0aGUgY29kZSBhdHRyaWJ1dGUgb2YgYSBmdW5jdGlvbi4gRGlmZmVyZW50IGltcGxlbWVudGF0aW9ucworIyBhcmUgZm9yIFB5dGhvbiAyLzMgY29tcGF0aWJpbGl0eS4KKworaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDM6CisgICAgZGVmIGZ1bmNfY29kZShmKToKKyAgICAgICAgcmV0dXJuIGYuZnVuY19jb2RlCitlbHNlOgorICAgIGRlZiBmdW5jX2NvZGUoZik6CisgICAgICAgIHJldHVybiBmLl9fY29kZV9fCisKKyMgVGhpcyByZWd1bGFyIGV4cHJlc3Npb24gaXMgdXNlZCB0byBtYXRjaCB2YWxpZCB0b2tlbiBuYW1lcworX2lzX2lkZW50aWZpZXIgPSByZS5jb21waWxlKHInXlthLXpBLVowLTlfXSskJykKKworIyBFeGNlcHRpb24gdGhyb3duIHdoZW4gaW52YWxpZCB0b2tlbiBlbmNvdW50ZXJlZCBhbmQgbm8gZGVmYXVsdCBlcnJvcgorIyBoYW5kbGVyIGlzIGRlZmluZWQuCisKK2NsYXNzIExleEVycm9yKEV4Y2VwdGlvbik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsbWVzc2FnZSxzKToKKyAgICAgICAgIHNlbGYuYXJncyA9IChtZXNzYWdlLCkKKyAgICAgICAgIHNlbGYudGV4dCA9IHMKKworIyBUb2tlbiBjbGFzcy4gIFRoaXMgY2xhc3MgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIHRva2VucyBwcm9kdWNlZC4KK2NsYXNzIExleFRva2VuKG9iamVjdCk6CisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAiTGV4VG9rZW4oJXMsJXIsJWQsJWQpIiAlIChzZWxmLnR5cGUsc2VsZi52YWx1ZSxzZWxmLmxpbmVubyxzZWxmLmxleHBvcykKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiBzdHIoc2VsZikKKworIyBUaGlzIG9iamVjdCBpcyBhIHN0YW5kLWluIGZvciBhIGxvZ2dpbmcgb2JqZWN0IGNyZWF0ZWQgYnkgdGhlIAorIyBsb2dnaW5nIG1vZHVsZS4gIAorCitjbGFzcyBQbHlMb2dnZXIob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZixmKToKKyAgICAgICAgc2VsZi5mID0gZgorICAgIGRlZiBjcml0aWNhbChzZWxmLG1zZywqYXJncywqKmt3YXJncyk6CisgICAgICAgIHNlbGYuZi53cml0ZSgobXNnICUgYXJncykgKyAiXG4iKQorCisgICAgZGVmIHdhcm5pbmcoc2VsZixtc2csKmFyZ3MsKiprd2FyZ3MpOgorICAgICAgICBzZWxmLmYud3JpdGUoIldBUk5JTkc6ICIrIChtc2cgJSBhcmdzKSArICJcbiIpCisKKyAgICBkZWYgZXJyb3Ioc2VsZixtc2csKmFyZ3MsKiprd2FyZ3MpOgorICAgICAgICBzZWxmLmYud3JpdGUoIkVSUk9SOiAiICsgKG1zZyAlIGFyZ3MpICsgIlxuIikKKworICAgIGluZm8gPSBjcml0aWNhbAorICAgIGRlYnVnID0gY3JpdGljYWwKKworIyBOdWxsIGxvZ2dlciBpcyB1c2VkIHdoZW4gbm8gb3V0cHV0IGlzIGdlbmVyYXRlZC4gRG9lcyBub3RoaW5nLgorY2xhc3MgTnVsbExvZ2dlcihvYmplY3QpOgorICAgIGRlZiBfX2dldGF0dHJpYnV0ZV9fKHNlbGYsbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmCisgICAgZGVmIF9fY2FsbF9fKHNlbGYsKmFyZ3MsKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICAgICAgICAgICAgICAgICAgICAgICAgPT09IExleGluZyBFbmdpbmUgPT09CisjCisjIFRoZSBmb2xsb3dpbmcgTGV4ZXIgY2xhc3MgaW1wbGVtZW50cyB0aGUgbGV4ZXIgcnVudGltZS4gICBUaGVyZSBhcmUgb25seQorIyBhIGZldyBwdWJsaWMgbWV0aG9kcyBhbmQgYXR0cmlidXRlczoKKyMKKyMgICAgaW5wdXQoKSAgICAgICAgICAtICBTdG9yZSBhIG5ldyBzdHJpbmcgaW4gdGhlIGxleGVyCisjICAgIHRva2VuKCkgICAgICAgICAgLSAgR2V0IHRoZSBuZXh0IHRva2VuCisjICAgIGNsb25lKCkgICAgICAgICAgLSAgQ2xvbmUgdGhlIGxleGVyCisjCisjICAgIGxpbmVubyAgICAgICAgICAgLSAgQ3VycmVudCBsaW5lIG51bWJlcgorIyAgICBsZXhwb3MgICAgICAgICAgIC0gIEN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGlucHV0IHN0cmluZworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBMZXhlcjoKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYubGV4cmUgPSBOb25lICAgICAgICAgICAgICMgTWFzdGVyIHJlZ3VsYXIgZXhwcmVzc2lvbi4gVGhpcyBpcyBhIGxpc3Qgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0dXBsZXMgKHJlLGZpbmRleCkgd2hlcmUgcmUgaXMgYSBjb21waWxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbmQgZmluZGV4IGlzIGEgbGlzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG1hcHBpbmcgcmVnZXggZ3JvdXAgbnVtYmVycyB0byBydWxlcworICAgICAgICBzZWxmLmxleHJldGV4dCA9IE5vbmUgICAgICAgICAjIEN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uIHN0cmluZ3MKKyAgICAgICAgc2VsZi5sZXhzdGF0ZXJlID0ge30gICAgICAgICAgIyBEaWN0aW9uYXJ5IG1hcHBpbmcgbGV4ZXIgc3RhdGVzIHRvIG1hc3RlciByZWdleHMKKyAgICAgICAgc2VsZi5sZXhzdGF0ZXJldGV4dCA9IHt9ICAgICAgIyBEaWN0aW9uYXJ5IG1hcHBpbmcgbGV4ZXIgc3RhdGVzIHRvIHJlZ2V4IHN0cmluZ3MKKyAgICAgICAgc2VsZi5sZXhzdGF0ZXJlbmFtZXMgPSB7fSAgICAgIyBEaWN0aW9uYXJ5IG1hcHBpbmcgbGV4ZXIgc3RhdGVzIHRvIHN5bWJvbCBuYW1lcworICAgICAgICBzZWxmLmxleHN0YXRlID0gIklOSVRJQUwiICAgICAjIEN1cnJlbnQgbGV4ZXIgc3RhdGUKKyAgICAgICAgc2VsZi5sZXhzdGF0ZXN0YWNrID0gW10gICAgICAgIyBTdGFjayBvZiBsZXhlciBzdGF0ZXMKKyAgICAgICAgc2VsZi5sZXhzdGF0ZWluZm8gPSBOb25lICAgICAgIyBTdGF0ZSBpbmZvcm1hdGlvbgorICAgICAgICBzZWxmLmxleHN0YXRlaWdub3JlID0ge30gICAgICAjIERpY3Rpb25hcnkgb2YgaWdub3JlZCBjaGFyYWN0ZXJzIGZvciBlYWNoIHN0YXRlCisgICAgICAgIHNlbGYubGV4c3RhdGVlcnJvcmYgPSB7fSAgICAgICMgRGljdGlvbmFyeSBvZiBlcnJvciBmdW5jdGlvbnMgZm9yIGVhY2ggc3RhdGUKKyAgICAgICAgc2VsZi5sZXhyZWZsYWdzID0gMCAgICAgICAgICAgIyBPcHRpb25hbCByZSBjb21waWxlIGZsYWdzCisgICAgICAgIHNlbGYubGV4ZGF0YSA9IE5vbmUgICAgICAgICAgICMgQWN0dWFsIGlucHV0IGRhdGEgKGFzIGEgc3RyaW5nKQorICAgICAgICBzZWxmLmxleHBvcyA9IDAgICAgICAgICAgICAgICAjIEN1cnJlbnQgcG9zaXRpb24gaW4gaW5wdXQgdGV4dAorICAgICAgICBzZWxmLmxleGxlbiA9IDAgICAgICAgICAgICAgICAjIExlbmd0aCBvZiB0aGUgaW5wdXQgdGV4dAorICAgICAgICBzZWxmLmxleGVycm9yZiA9IE5vbmUgICAgICAgICAjIEVycm9yIHJ1bGUgKGlmIGFueSkKKyAgICAgICAgc2VsZi5sZXh0b2tlbnMgPSBOb25lICAgICAgICAgIyBMaXN0IG9mIHZhbGlkIHRva2VucworICAgICAgICBzZWxmLmxleGlnbm9yZSA9ICIiICAgICAgICAgICAjIElnbm9yZWQgY2hhcmFjdGVycworICAgICAgICBzZWxmLmxleGxpdGVyYWxzID0gIiIgICAgICAgICAjIExpdGVyYWwgY2hhcmFjdGVycyB0aGF0IGNhbiBiZSBwYXNzZWQgdGhyb3VnaAorICAgICAgICBzZWxmLmxleG1vZHVsZSA9IE5vbmUgICAgICAgICAjIE1vZHVsZQorICAgICAgICBzZWxmLmxpbmVubyA9IDEgICAgICAgICAgICAgICAjIEN1cnJlbnQgbGluZSBudW1iZXIKKyAgICAgICAgc2VsZi5sZXhvcHRpbWl6ZSA9IDAgICAgICAgICAgIyBPcHRpbWl6ZWQgbW9kZQorCisgICAgZGVmIGNsb25lKHNlbGYsb2JqZWN0PU5vbmUpOgorICAgICAgICBjID0gY29weS5jb3B5KHNlbGYpCisKKyAgICAgICAgIyBJZiB0aGUgb2JqZWN0IHBhcmFtZXRlciBoYXMgYmVlbiBzdXBwbGllZCwgaXQgbWVhbnMgd2UgYXJlIGF0dGFjaGluZyB0aGUKKyAgICAgICAgIyBsZXhlciB0byBhIG5ldyBvYmplY3QuICBJbiB0aGlzIGNhc2UsIHdlIGhhdmUgdG8gcmViaW5kIGFsbCBtZXRob2RzIGluCisgICAgICAgICMgdGhlIGxleHN0YXRlcmUgYW5kIGxleHN0YXRlZXJyb3JmIHRhYmxlcy4KKworICAgICAgICBpZiBvYmplY3Q6CisgICAgICAgICAgICBuZXd0YWIgPSB7IH0KKyAgICAgICAgICAgIGZvciBrZXksIHJpdGVtIGluIHNlbGYubGV4c3RhdGVyZS5pdGVtcygpOgorICAgICAgICAgICAgICAgIG5ld3JlID0gW10KKyAgICAgICAgICAgICAgICBmb3IgY3JlLCBmaW5kZXggaW4gcml0ZW06CisgICAgICAgICAgICAgICAgICAgICBuZXdmaW5kZXggPSBbXQorICAgICAgICAgICAgICAgICAgICAgZm9yIGYgaW4gZmluZGV4OgorICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBmIG9yIG5vdCBmWzBdOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdmaW5kZXguYXBwZW5kKGYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV3ZmluZGV4LmFwcGVuZCgoZ2V0YXR0cihvYmplY3QsZlswXS5fX25hbWVfXyksZlsxXSkpCisgICAgICAgICAgICAgICAgbmV3cmUuYXBwZW5kKChjcmUsbmV3ZmluZGV4KSkKKyAgICAgICAgICAgICAgICBuZXd0YWJba2V5XSA9IG5ld3JlCisgICAgICAgICAgICBjLmxleHN0YXRlcmUgPSBuZXd0YWIKKyAgICAgICAgICAgIGMubGV4c3RhdGVlcnJvcmYgPSB7IH0KKyAgICAgICAgICAgIGZvciBrZXksIGVmIGluIHNlbGYubGV4c3RhdGVlcnJvcmYuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBjLmxleHN0YXRlZXJyb3JmW2tleV0gPSBnZXRhdHRyKG9iamVjdCxlZi5fX25hbWVfXykKKyAgICAgICAgICAgIGMubGV4bW9kdWxlID0gb2JqZWN0CisgICAgICAgIHJldHVybiBjCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgd3JpdGV0YWIoKSAtIFdyaXRlIGxleGVyIGluZm9ybWF0aW9uIHRvIGEgdGFibGUgZmlsZQorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgZGVmIHdyaXRldGFiKHNlbGYsdGFiZmlsZSxvdXRwdXRkaXI9IiIpOgorICAgICAgICBpZiBpc2luc3RhbmNlKHRhYmZpbGUsdHlwZXMuTW9kdWxlVHlwZSk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgYmFzZXRhYmZpbGVuYW1lID0gdGFiZmlsZS5zcGxpdCgiLiIpWy0xXQorICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihvdXRwdXRkaXIsYmFzZXRhYmZpbGVuYW1lKSsiLnB5IgorICAgICAgICB0ZiA9IG9wZW4oZmlsZW5hbWUsInciKQorICAgICAgICB0Zi53cml0ZSgiIyAlcy5weS4gVGhpcyBmaWxlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBieSBQTFkgKHZlcnNpb24gJXMpLiBEb24ndCBlZGl0IVxuIiAlICh0YWJmaWxlLF9fdmVyc2lvbl9fKSkKKyAgICAgICAgdGYud3JpdGUoIl90YWJ2ZXJzaW9uICAgPSAlc1xuIiAlIHJlcHIoX192ZXJzaW9uX18pKQorICAgICAgICB0Zi53cml0ZSgiX2xleHRva2VucyAgICA9ICVzXG4iICUgcmVwcihzZWxmLmxleHRva2VucykpCisgICAgICAgIHRmLndyaXRlKCJfbGV4cmVmbGFncyAgID0gJXNcbiIgJSByZXByKHNlbGYubGV4cmVmbGFncykpCisgICAgICAgIHRmLndyaXRlKCJfbGV4bGl0ZXJhbHMgID0gJXNcbiIgJSByZXByKHNlbGYubGV4bGl0ZXJhbHMpKQorICAgICAgICB0Zi53cml0ZSgiX2xleHN0YXRlaW5mbyA9ICVzXG4iICUgcmVwcihzZWxmLmxleHN0YXRlaW5mbykpCisKKyAgICAgICAgdGFicmUgPSB7IH0KKyAgICAgICAgIyBDb2xsZWN0IGFsbCBmdW5jdGlvbnMgaW4gdGhlIGluaXRpYWwgc3RhdGUKKyAgICAgICAgaW5pdGlhbCA9IHNlbGYubGV4c3RhdGVyZVsiSU5JVElBTCJdCisgICAgICAgIGluaXRpYWxmdW5jcyA9IFtdCisgICAgICAgIGZvciBwYXJ0IGluIGluaXRpYWw6CisgICAgICAgICAgICBmb3IgZiBpbiBwYXJ0WzFdOgorICAgICAgICAgICAgICAgIGlmIGYgYW5kIGZbMF06CisgICAgICAgICAgICAgICAgICAgIGluaXRpYWxmdW5jcy5hcHBlbmQoZikKKworICAgICAgICBmb3Iga2V5LCBscmUgaW4gc2VsZi5sZXhzdGF0ZXJlLml0ZW1zKCk6CisgICAgICAgICAgICAgdGl0ZW0gPSBbXQorICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihscmUpKToKKyAgICAgICAgICAgICAgICAgIHRpdGVtLmFwcGVuZCgoc2VsZi5sZXhzdGF0ZXJldGV4dFtrZXldW2ldLF9mdW5jc190b19uYW1lcyhscmVbaV1bMV0sc2VsZi5sZXhzdGF0ZXJlbmFtZXNba2V5XVtpXSkpKQorICAgICAgICAgICAgIHRhYnJlW2tleV0gPSB0aXRlbQorCisgICAgICAgIHRmLndyaXRlKCJfbGV4c3RhdGVyZSAgID0gJXNcbiIgJSByZXByKHRhYnJlKSkKKyAgICAgICAgdGYud3JpdGUoIl9sZXhzdGF0ZWlnbm9yZSA9ICVzXG4iICUgcmVwcihzZWxmLmxleHN0YXRlaWdub3JlKSkKKworICAgICAgICB0YWJlcnIgPSB7IH0KKyAgICAgICAgZm9yIGtleSwgZWYgaW4gc2VsZi5sZXhzdGF0ZWVycm9yZi5pdGVtcygpOgorICAgICAgICAgICAgIGlmIGVmOgorICAgICAgICAgICAgICAgICAgdGFiZXJyW2tleV0gPSBlZi5fX25hbWVfXworICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICB0YWJlcnJba2V5XSA9IE5vbmUKKyAgICAgICAgdGYud3JpdGUoIl9sZXhzdGF0ZWVycm9yZiA9ICVzXG4iICUgcmVwcih0YWJlcnIpKQorICAgICAgICB0Zi5jbG9zZSgpCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgcmVhZHRhYigpIC0gUmVhZCBsZXhlciBpbmZvcm1hdGlvbiBmcm9tIGEgdGFiIGZpbGUKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGRlZiByZWFkdGFiKHNlbGYsdGFiZmlsZSxmZGljdCk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UodGFiZmlsZSx0eXBlcy5Nb2R1bGVUeXBlKToKKyAgICAgICAgICAgIGxleHRhYiA9IHRhYmZpbGUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzOgorICAgICAgICAgICAgICAgIGV4ZWMoImltcG9ydCAlcyBhcyBsZXh0YWIiICUgdGFiZmlsZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZW52ID0geyB9CisgICAgICAgICAgICAgICAgZXhlYygiaW1wb3J0ICVzIGFzIGxleHRhYiIgJSB0YWJmaWxlLCBlbnYsZW52KQorICAgICAgICAgICAgICAgIGxleHRhYiA9IGVudlsnbGV4dGFiJ10KKworICAgICAgICBpZiBnZXRhdHRyKGxleHRhYiwiX3RhYnZlcnNpb24iLCIwLjAiKSAhPSBfX3ZlcnNpb25fXzoKKyAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJJbmNvbnNpc3RlbnQgUExZIHZlcnNpb24iKQorCisgICAgICAgIHNlbGYubGV4dG9rZW5zICAgICAgPSBsZXh0YWIuX2xleHRva2VucworICAgICAgICBzZWxmLmxleHJlZmxhZ3MgICAgID0gbGV4dGFiLl9sZXhyZWZsYWdzCisgICAgICAgIHNlbGYubGV4bGl0ZXJhbHMgICAgPSBsZXh0YWIuX2xleGxpdGVyYWxzCisgICAgICAgIHNlbGYubGV4c3RhdGVpbmZvICAgPSBsZXh0YWIuX2xleHN0YXRlaW5mbworICAgICAgICBzZWxmLmxleHN0YXRlaWdub3JlID0gbGV4dGFiLl9sZXhzdGF0ZWlnbm9yZQorICAgICAgICBzZWxmLmxleHN0YXRlcmUgICAgID0geyB9CisgICAgICAgIHNlbGYubGV4c3RhdGVyZXRleHQgPSB7IH0KKyAgICAgICAgZm9yIGtleSxscmUgaW4gbGV4dGFiLl9sZXhzdGF0ZXJlLml0ZW1zKCk6CisgICAgICAgICAgICAgdGl0ZW0gPSBbXQorICAgICAgICAgICAgIHR4dGl0ZW0gPSBbXQorICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihscmUpKToKKyAgICAgICAgICAgICAgICAgIHRpdGVtLmFwcGVuZCgocmUuY29tcGlsZShscmVbaV1bMF0sbGV4dGFiLl9sZXhyZWZsYWdzIHwgcmUuVkVSQk9TRSksX25hbWVzX3RvX2Z1bmNzKGxyZVtpXVsxXSxmZGljdCkpKQorICAgICAgICAgICAgICAgICAgdHh0aXRlbS5hcHBlbmQobHJlW2ldWzBdKQorICAgICAgICAgICAgIHNlbGYubGV4c3RhdGVyZVtrZXldID0gdGl0ZW0KKyAgICAgICAgICAgICBzZWxmLmxleHN0YXRlcmV0ZXh0W2tleV0gPSB0eHRpdGVtCisgICAgICAgIHNlbGYubGV4c3RhdGVlcnJvcmYgPSB7IH0KKyAgICAgICAgZm9yIGtleSxlZiBpbiBsZXh0YWIuX2xleHN0YXRlZXJyb3JmLml0ZW1zKCk6CisgICAgICAgICAgICAgc2VsZi5sZXhzdGF0ZWVycm9yZltrZXldID0gZmRpY3RbZWZdCisgICAgICAgIHNlbGYuYmVnaW4oJ0lOSVRJQUwnKQorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIGlucHV0KCkgLSBQdXNoIGEgbmV3IHN0cmluZyBpbnRvIHRoZSBsZXhlcgorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgZGVmIGlucHV0KHNlbGYscyk6CisgICAgICAgICMgUHVsbCBvZmYgdGhlIGZpcnN0IGNoYXJhY3RlciB0byBzZWUgaWYgcyBsb29rcyBsaWtlIGEgc3RyaW5nCisgICAgICAgIGMgPSBzWzoxXQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShjLFN0cmluZ1R5cGVzKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkV4cGVjdGVkIGEgc3RyaW5nIikKKyAgICAgICAgc2VsZi5sZXhkYXRhID0gcworICAgICAgICBzZWxmLmxleHBvcyA9IDAKKyAgICAgICAgc2VsZi5sZXhsZW4gPSBsZW4ocykKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBiZWdpbigpIC0gQ2hhbmdlcyB0aGUgbGV4aW5nIHN0YXRlCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBkZWYgYmVnaW4oc2VsZixzdGF0ZSk6CisgICAgICAgIGlmIG5vdCBzdGF0ZSBpbiBzZWxmLmxleHN0YXRlcmU6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJVbmRlZmluZWQgc3RhdGUiKQorICAgICAgICBzZWxmLmxleHJlID0gc2VsZi5sZXhzdGF0ZXJlW3N0YXRlXQorICAgICAgICBzZWxmLmxleHJldGV4dCA9IHNlbGYubGV4c3RhdGVyZXRleHRbc3RhdGVdCisgICAgICAgIHNlbGYubGV4aWdub3JlID0gc2VsZi5sZXhzdGF0ZWlnbm9yZS5nZXQoc3RhdGUsIiIpCisgICAgICAgIHNlbGYubGV4ZXJyb3JmID0gc2VsZi5sZXhzdGF0ZWVycm9yZi5nZXQoc3RhdGUsTm9uZSkKKyAgICAgICAgc2VsZi5sZXhzdGF0ZSA9IHN0YXRlCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgcHVzaF9zdGF0ZSgpIC0gQ2hhbmdlcyB0aGUgbGV4aW5nIHN0YXRlIGFuZCBzYXZlcyBvbGQgb24gc3RhY2sKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGRlZiBwdXNoX3N0YXRlKHNlbGYsc3RhdGUpOgorICAgICAgICBzZWxmLmxleHN0YXRlc3RhY2suYXBwZW5kKHNlbGYubGV4c3RhdGUpCisgICAgICAgIHNlbGYuYmVnaW4oc3RhdGUpCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgcG9wX3N0YXRlKCkgLSBSZXN0b3JlcyB0aGUgcHJldmlvdXMgc3RhdGUKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGRlZiBwb3Bfc3RhdGUoc2VsZik6CisgICAgICAgIHNlbGYuYmVnaW4oc2VsZi5sZXhzdGF0ZXN0YWNrLnBvcCgpKQorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIGN1cnJlbnRfc3RhdGUoKSAtIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aW5nIHN0YXRlCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBkZWYgY3VycmVudF9zdGF0ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubGV4c3RhdGUKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBza2lwKCkgLSBTa2lwIGFoZWFkIG4gY2hhcmFjdGVycworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgZGVmIHNraXAoc2VsZixuKToKKyAgICAgICAgc2VsZi5sZXhwb3MgKz0gbgorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIG9wdHRva2VuKCkgLSBSZXR1cm4gdGhlIG5leHQgdG9rZW4gZnJvbSB0aGUgTGV4ZXIKKyAgICAjCisgICAgIyBOb3RlOiBUaGlzIGZ1bmN0aW9uIGhhcyBiZWVuIGNhcmVmdWxseSBpbXBsZW1lbnRlZCB0byBiZSBhcyBmYXN0CisgICAgIyBhcyBwb3NzaWJsZS4gIERvbid0IG1ha2UgY2hhbmdlcyB1bmxlc3MgeW91IHJlYWxseSBrbm93IHdoYXQKKyAgICAjIHlvdSBhcmUgZG9pbmcKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGRlZiB0b2tlbihzZWxmKToKKyAgICAgICAgIyBNYWtlIGxvY2FsIGNvcGllcyBvZiBmcmVxdWVudGx5IHJlZmVyZW5jZWQgYXR0cmlidXRlcworICAgICAgICBsZXhwb3MgICAgPSBzZWxmLmxleHBvcworICAgICAgICBsZXhsZW4gICAgPSBzZWxmLmxleGxlbgorICAgICAgICBsZXhpZ25vcmUgPSBzZWxmLmxleGlnbm9yZQorICAgICAgICBsZXhkYXRhICAgPSBzZWxmLmxleGRhdGEKKworICAgICAgICB3aGlsZSBsZXhwb3MgPCBsZXhsZW46CisgICAgICAgICAgICAjIFRoaXMgY29kZSBwcm92aWRlcyBzb21lIHNob3J0LWNpcmN1aXQgY29kZSBmb3Igd2hpdGVzcGFjZSwgdGFicywgYW5kIG90aGVyIGlnbm9yZWQgY2hhcmFjdGVycworICAgICAgICAgICAgaWYgbGV4ZGF0YVtsZXhwb3NdIGluIGxleGlnbm9yZToKKyAgICAgICAgICAgICAgICBsZXhwb3MgKz0gMQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICMgTG9vayBmb3IgYSByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2gKKyAgICAgICAgICAgIGZvciBsZXhyZSxsZXhpbmRleGZ1bmMgaW4gc2VsZi5sZXhyZToKKyAgICAgICAgICAgICAgICBtID0gbGV4cmUubWF0Y2gobGV4ZGF0YSxsZXhwb3MpCisgICAgICAgICAgICAgICAgaWYgbm90IG06IGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICAjIENyZWF0ZSBhIHRva2VuIGZvciByZXR1cm4KKyAgICAgICAgICAgICAgICB0b2sgPSBMZXhUb2tlbigpCisgICAgICAgICAgICAgICAgdG9rLnZhbHVlID0gbS5ncm91cCgpCisgICAgICAgICAgICAgICAgdG9rLmxpbmVubyA9IHNlbGYubGluZW5vCisgICAgICAgICAgICAgICAgdG9rLmxleHBvcyA9IGxleHBvcworCisgICAgICAgICAgICAgICAgaSA9IG0ubGFzdGluZGV4CisgICAgICAgICAgICAgICAgZnVuYyx0b2sudHlwZSA9IGxleGluZGV4ZnVuY1tpXQorCisgICAgICAgICAgICAgICAgaWYgbm90IGZ1bmM6CisgICAgICAgICAgICAgICAgICAgIyBJZiBubyB0b2tlbiB0eXBlIHdhcyBzZXQsIGl0J3MgYW4gaWdub3JlZCB0b2tlbgorICAgICAgICAgICAgICAgICAgIGlmIHRvay50eXBlOgorICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGV4cG9zID0gbS5lbmQoKQorICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2sKKyAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgIGxleHBvcyA9IG0uZW5kKCkKKyAgICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICAgICAgbGV4cG9zID0gbS5lbmQoKQorCisgICAgICAgICAgICAgICAgIyBJZiB0b2tlbiBpcyBwcm9jZXNzZWQgYnkgYSBmdW5jdGlvbiwgY2FsbCBpdAorCisgICAgICAgICAgICAgICAgdG9rLmxleGVyID0gc2VsZiAgICAgICMgU2V0IGFkZGl0aW9uYWwgYXR0cmlidXRlcyB1c2VmdWwgaW4gdG9rZW4gcnVsZXMKKyAgICAgICAgICAgICAgICBzZWxmLmxleG1hdGNoID0gbQorICAgICAgICAgICAgICAgIHNlbGYubGV4cG9zID0gbGV4cG9zCisKKyAgICAgICAgICAgICAgICBuZXd0b2sgPSBmdW5jKHRvaykKKworICAgICAgICAgICAgICAgICMgRXZlcnkgZnVuY3Rpb24gbXVzdCByZXR1cm4gYSB0b2tlbiwgaWYgbm90aGluZywgd2UganVzdCBtb3ZlIHRvIG5leHQgdG9rZW4KKyAgICAgICAgICAgICAgICBpZiBub3QgbmV3dG9rOgorICAgICAgICAgICAgICAgICAgICBsZXhwb3MgICAgPSBzZWxmLmxleHBvcyAgICAgICAgICMgVGhpcyBpcyBoZXJlIGluIGNhc2UgdXNlciBoYXMgdXBkYXRlZCBsZXhwb3MuCisgICAgICAgICAgICAgICAgICAgIGxleGlnbm9yZSA9IHNlbGYubGV4aWdub3JlICAgICAgIyBUaGlzIGlzIGhlcmUgaW4gY2FzZSB0aGVyZSB3YXMgYSBzdGF0ZSBjaGFuZ2UKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgICAgICMgVmVyaWZ5IHR5cGUgb2YgdGhlIHRva2VuLiAgSWYgbm90IGluIHRoZSB0b2tlbiBtYXAsIHJhaXNlIGFuIGVycm9yCisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYubGV4b3B0aW1pemU6CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBuZXd0b2sudHlwZSBpbiBzZWxmLmxleHRva2VuczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIExleEVycm9yKCIlczolZDogUnVsZSAnJXMnIHJldHVybmVkIGFuIHVua25vd24gdG9rZW4gdHlwZSAnJXMnIiAlICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jX2NvZGUoZnVuYykuY29fZmlsZW5hbWUsIGZ1bmNfY29kZShmdW5jKS5jb19maXJzdGxpbmVubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jLl9fbmFtZV9fLCBuZXd0b2sudHlwZSksbGV4ZGF0YVtsZXhwb3M6XSkKKworICAgICAgICAgICAgICAgIHJldHVybiBuZXd0b2sKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBObyBtYXRjaCwgc2VlIGlmIGluIGxpdGVyYWxzCisgICAgICAgICAgICAgICAgaWYgbGV4ZGF0YVtsZXhwb3NdIGluIHNlbGYubGV4bGl0ZXJhbHM6CisgICAgICAgICAgICAgICAgICAgIHRvayA9IExleFRva2VuKCkKKyAgICAgICAgICAgICAgICAgICAgdG9rLnZhbHVlID0gbGV4ZGF0YVtsZXhwb3NdCisgICAgICAgICAgICAgICAgICAgIHRvay5saW5lbm8gPSBzZWxmLmxpbmVubworICAgICAgICAgICAgICAgICAgICB0b2sudHlwZSA9IHRvay52YWx1ZQorICAgICAgICAgICAgICAgICAgICB0b2subGV4cG9zID0gbGV4cG9zCisgICAgICAgICAgICAgICAgICAgIHNlbGYubGV4cG9zID0gbGV4cG9zICsgMQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rCisKKyAgICAgICAgICAgICAgICAjIE5vIG1hdGNoLiBDYWxsIHRfZXJyb3IoKSBpZiBkZWZpbmVkLgorICAgICAgICAgICAgICAgIGlmIHNlbGYubGV4ZXJyb3JmOgorICAgICAgICAgICAgICAgICAgICB0b2sgPSBMZXhUb2tlbigpCisgICAgICAgICAgICAgICAgICAgIHRvay52YWx1ZSA9IHNlbGYubGV4ZGF0YVtsZXhwb3M6XQorICAgICAgICAgICAgICAgICAgICB0b2subGluZW5vID0gc2VsZi5saW5lbm8KKyAgICAgICAgICAgICAgICAgICAgdG9rLnR5cGUgPSAiZXJyb3IiCisgICAgICAgICAgICAgICAgICAgIHRvay5sZXhlciA9IHNlbGYKKyAgICAgICAgICAgICAgICAgICAgdG9rLmxleHBvcyA9IGxleHBvcworICAgICAgICAgICAgICAgICAgICBzZWxmLmxleHBvcyA9IGxleHBvcworICAgICAgICAgICAgICAgICAgICBuZXd0b2sgPSBzZWxmLmxleGVycm9yZih0b2spCisgICAgICAgICAgICAgICAgICAgIGlmIGxleHBvcyA9PSBzZWxmLmxleHBvczoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgRXJyb3IgbWV0aG9kIGRpZG4ndCBjaGFuZ2UgdGV4dCBwb3NpdGlvbiBhdCBhbGwuIFRoaXMgaXMgYW4gZXJyb3IuCisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBMZXhFcnJvcigiU2Nhbm5pbmcgZXJyb3IuIElsbGVnYWwgY2hhcmFjdGVyICclcyciICUgKGxleGRhdGFbbGV4cG9zXSksIGxleGRhdGFbbGV4cG9zOl0pCisgICAgICAgICAgICAgICAgICAgIGxleHBvcyA9IHNlbGYubGV4cG9zCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBuZXd0b2s6IGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXd0b2sKKworICAgICAgICAgICAgICAgIHNlbGYubGV4cG9zID0gbGV4cG9zCisgICAgICAgICAgICAgICAgcmFpc2UgTGV4RXJyb3IoIklsbGVnYWwgY2hhcmFjdGVyICclcycgYXQgaW5kZXggJWQiICUgKGxleGRhdGFbbGV4cG9zXSxsZXhwb3MpLCBsZXhkYXRhW2xleHBvczpdKQorCisgICAgICAgIHNlbGYubGV4cG9zID0gbGV4cG9zICsgMQorICAgICAgICBpZiBzZWxmLmxleGRhdGEgaXMgTm9uZToKKyAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIk5vIGlucHV0IHN0cmluZyBnaXZlbiB3aXRoIGlucHV0KCkiKQorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgIyBJdGVyYXRvciBpbnRlcmZhY2UKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgdCA9IHNlbGYudG9rZW4oKQorICAgICAgICBpZiB0IGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgIHJldHVybiB0CisKKyAgICBfX25leHRfXyA9IG5leHQKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAgICAgICAgICAgICAgICAgICAgICAgICAgID09PT0gTGV4IEJ1aWxkZXIgPT09CisjCisjIFRoZSBmdW5jdGlvbnMgYW5kIGNsYXNzZXMgYmVsb3cgYXJlIHVzZWQgdG8gY29sbGVjdCBsZXhpbmcgaW5mb3JtYXRpb24KKyMgYW5kIGJ1aWxkIGEgTGV4ZXIgb2JqZWN0IGZyb20gaXQuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgZ2V0X2NhbGxlcl9tb2R1bGVfZGljdCgpCisjCisjIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBhbGwgb2YgdGhlIHN5bWJvbHMgZGVmaW5lZCB3aXRoaW4KKyMgYSBjYWxsZXIgZnVydGhlciBkb3duIHRoZSBjYWxsIHN0YWNrLiAgVGhpcyBpcyB1c2VkIHRvIGdldCB0aGUgZW52aXJvbm1lbnQKKyMgYXNzb2NpYXRlZCB3aXRoIHRoZSB5YWNjKCkgY2FsbCBpZiBub25lIHdhcyBwcm92aWRlZC4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZGVmIGdldF9jYWxsZXJfbW9kdWxlX2RpY3QobGV2ZWxzKToKKyAgICB0cnk6CisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcgorICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CisgICAgICAgIGUsYix0ID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgZiA9IHQudGJfZnJhbWUKKyAgICAgICAgd2hpbGUgbGV2ZWxzID4gMDoKKyAgICAgICAgICAgIGYgPSBmLmZfYmFjayAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGxldmVscyAtPSAxCisgICAgICAgIGxkaWN0ID0gZi5mX2dsb2JhbHMuY29weSgpCisgICAgICAgIGlmIGYuZl9nbG9iYWxzICE9IGYuZl9sb2NhbHM6CisgICAgICAgICAgICBsZGljdC51cGRhdGUoZi5mX2xvY2FscykKKworICAgICAgICByZXR1cm4gbGRpY3QKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBfZnVuY3NfdG9fbmFtZXMoKQorIworIyBHaXZlbiBhIGxpc3Qgb2YgcmVndWxhciBleHByZXNzaW9uIGZ1bmN0aW9ucywgdGhpcyBjb252ZXJ0cyBpdCB0byBhIGxpc3QKKyMgc3VpdGFibGUgZm9yIG91dHB1dCB0byBhIHRhYmxlIGZpbGUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZGVmIF9mdW5jc190b19uYW1lcyhmdW5jbGlzdCxuYW1lbGlzdCk6CisgICAgcmVzdWx0ID0gW10KKyAgICBmb3IgZixuYW1lIGluIHppcChmdW5jbGlzdCxuYW1lbGlzdCk6CisgICAgICAgICBpZiBmIGFuZCBmWzBdOgorICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoKG5hbWUsIGZbMV0pKQorICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGYpCisgICAgcmV0dXJuIHJlc3VsdAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9uYW1lc190b19mdW5jcygpCisjCisjIEdpdmVuIGEgbGlzdCBvZiByZWd1bGFyIGV4cHJlc3Npb24gZnVuY3Rpb24gbmFtZXMsIHRoaXMgY29udmVydHMgaXQgYmFjayB0bworIyBmdW5jdGlvbnMuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2RlZiBfbmFtZXNfdG9fZnVuY3MobmFtZWxpc3QsZmRpY3QpOgorICAgICByZXN1bHQgPSBbXQorICAgICBmb3IgbiBpbiBuYW1lbGlzdDoKKyAgICAgICAgICBpZiBuIGFuZCBuWzBdOgorICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKChmZGljdFtuWzBdXSxuWzFdKSkKKyAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKG4pCisgICAgIHJldHVybiByZXN1bHQKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBfZm9ybV9tYXN0ZXJfcmUoKQorIworIyBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgbGlzdCBvZiBhbGwgb2YgdGhlIHJlZ2V4IGNvbXBvbmVudHMgYW5kIGF0dGVtcHRzIHRvCisjIGZvcm0gdGhlIG1hc3RlciByZWd1bGFyIGV4cHJlc3Npb24uICBHaXZlbiBsaW1pdGF0aW9ucyBpbiB0aGUgUHl0aG9uIHJlCisjIG1vZHVsZSwgaXQgbWF5IGJlIG5lY2Vzc2FyeSB0byBicmVhayB0aGUgbWFzdGVyIHJlZ2V4IGludG8gc2VwYXJhdGUgZXhwcmVzc2lvbnMuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2RlZiBfZm9ybV9tYXN0ZXJfcmUocmVsaXN0LHJlZmxhZ3MsbGRpY3QsdG9rbmFtZXMpOgorICAgIGlmIG5vdCByZWxpc3Q6IHJldHVybiBbXQorICAgIHJlZ2V4ID0gInwiLmpvaW4ocmVsaXN0KQorICAgIHRyeToKKyAgICAgICAgbGV4cmUgPSByZS5jb21waWxlKHJlZ2V4LHJlLlZFUkJPU0UgfCByZWZsYWdzKQorCisgICAgICAgICMgQnVpbGQgdGhlIGluZGV4IHRvIGZ1bmN0aW9uIG1hcCBmb3IgdGhlIG1hdGNoaW5nIGVuZ2luZQorICAgICAgICBsZXhpbmRleGZ1bmMgPSBbIE5vbmUgXSAqIChtYXgobGV4cmUuZ3JvdXBpbmRleC52YWx1ZXMoKSkrMSkKKyAgICAgICAgbGV4aW5kZXhuYW1lcyA9IGxleGluZGV4ZnVuY1s6XQorCisgICAgICAgIGZvciBmLGkgaW4gbGV4cmUuZ3JvdXBpbmRleC5pdGVtcygpOgorICAgICAgICAgICAgaGFuZGxlID0gbGRpY3QuZ2V0KGYsTm9uZSkKKyAgICAgICAgICAgIGlmIHR5cGUoaGFuZGxlKSBpbiAodHlwZXMuRnVuY3Rpb25UeXBlLCB0eXBlcy5NZXRob2RUeXBlKToKKyAgICAgICAgICAgICAgICBsZXhpbmRleGZ1bmNbaV0gPSAoaGFuZGxlLHRva25hbWVzW2ZdKQorICAgICAgICAgICAgICAgIGxleGluZGV4bmFtZXNbaV0gPSBmCisgICAgICAgICAgICBlbGlmIGhhbmRsZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBsZXhpbmRleG5hbWVzW2ldID0gZgorICAgICAgICAgICAgICAgIGlmIGYuZmluZCgiaWdub3JlXyIpID4gMDoKKyAgICAgICAgICAgICAgICAgICAgbGV4aW5kZXhmdW5jW2ldID0gKE5vbmUsTm9uZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBsZXhpbmRleGZ1bmNbaV0gPSAoTm9uZSwgdG9rbmFtZXNbZl0pCisgICAgICAgIAorICAgICAgICByZXR1cm4gWyhsZXhyZSxsZXhpbmRleGZ1bmMpXSxbcmVnZXhdLFtsZXhpbmRleG5hbWVzXQorICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgIG0gPSBpbnQobGVuKHJlbGlzdCkvMikKKyAgICAgICAgaWYgbSA9PSAwOiBtID0gMQorICAgICAgICBsbGlzdCwgbHJlLCBsbmFtZXMgPSBfZm9ybV9tYXN0ZXJfcmUocmVsaXN0WzptXSxyZWZsYWdzLGxkaWN0LHRva25hbWVzKQorICAgICAgICBybGlzdCwgcnJlLCBybmFtZXMgPSBfZm9ybV9tYXN0ZXJfcmUocmVsaXN0W206XSxyZWZsYWdzLGxkaWN0LHRva25hbWVzKQorICAgICAgICByZXR1cm4gbGxpc3Qrcmxpc3QsIGxyZStycmUsIGxuYW1lcytybmFtZXMKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBkZWYgX3N0YXRldG9rZW4ocyxuYW1lcykKKyMKKyMgR2l2ZW4gYSBkZWNsYXJhdGlvbiBuYW1lIHMgb2YgdGhlIGZvcm0gInRfIiBhbmQgYSBkaWN0aW9uYXJ5IHdob3NlIGtleXMgYXJlCisjIHN0YXRlIG5hbWVzLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYSB0dXBsZSAoc3RhdGVzLHRva2VubmFtZSkgd2hlcmUgc3RhdGVzCisjIGlzIGEgdHVwbGUgb2Ygc3RhdGUgbmFtZXMgYW5kIHRva2VubmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgdG9rZW4uICBGb3IgZXhhbXBsZSwKKyMgY2FsbGluZyB0aGlzIHdpdGggcyA9ICJ0X2Zvb19iYXJfU1BBTSIgbWlnaHQgcmV0dXJuICgoJ2ZvbycsJ2JhcicpLCdTUEFNJykKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZGVmIF9zdGF0ZXRva2VuKHMsbmFtZXMpOgorICAgIG5vbnN0YXRlID0gMQorICAgIHBhcnRzID0gcy5zcGxpdCgiXyIpCisgICAgZm9yIGkgaW4gcmFuZ2UoMSxsZW4ocGFydHMpKToKKyAgICAgICAgIGlmIG5vdCBwYXJ0c1tpXSBpbiBuYW1lcyBhbmQgcGFydHNbaV0gIT0gJ0FOWSc6IGJyZWFrCisgICAgaWYgaSA+IDE6CisgICAgICAgc3RhdGVzID0gdHVwbGUocGFydHNbMTppXSkKKyAgICBlbHNlOgorICAgICAgIHN0YXRlcyA9ICgnSU5JVElBTCcsKQorCisgICAgaWYgJ0FOWScgaW4gc3RhdGVzOgorICAgICAgIHN0YXRlcyA9IHR1cGxlKG5hbWVzKQorCisgICAgdG9rZW5uYW1lID0gIl8iLmpvaW4ocGFydHNbaTpdKQorICAgIHJldHVybiAoc3RhdGVzLHRva2VubmFtZSkKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExleGVyUmVmbGVjdCgpCisjCisjIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gYnVpbGQgYSBsZXhlciBhcyBleHRyYWN0ZWQgZnJvbSBhCisjIHVzZXIncyBpbnB1dCBmaWxlLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY2xhc3MgTGV4ZXJSZWZsZWN0KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsbGRpY3QsbG9nPU5vbmUscmVmbGFncz0wKToKKyAgICAgICAgc2VsZi5sZGljdCAgICAgID0gbGRpY3QKKyAgICAgICAgc2VsZi5lcnJvcl9mdW5jID0gTm9uZQorICAgICAgICBzZWxmLnRva2VucyAgICAgPSBbXQorICAgICAgICBzZWxmLnJlZmxhZ3MgICAgPSByZWZsYWdzCisgICAgICAgIHNlbGYuc3RhdGVpbmZvICA9IHsgJ0lOSVRJQUwnIDogJ2luY2x1c2l2ZSd9CisgICAgICAgIHNlbGYuZmlsZXMgICAgICA9IHt9CisgICAgICAgIHNlbGYuZXJyb3IgICAgICA9IDAKKworICAgICAgICBpZiBsb2cgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYubG9nID0gUGx5TG9nZ2VyKHN5cy5zdGRlcnIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmxvZyA9IGxvZworCisgICAgIyBHZXQgYWxsIG9mIHRoZSBiYXNpYyBpbmZvcm1hdGlvbgorICAgIGRlZiBnZXRfYWxsKHNlbGYpOgorICAgICAgICBzZWxmLmdldF90b2tlbnMoKQorICAgICAgICBzZWxmLmdldF9saXRlcmFscygpCisgICAgICAgIHNlbGYuZ2V0X3N0YXRlcygpCisgICAgICAgIHNlbGYuZ2V0X3J1bGVzKCkKKyAgICAgICAgCisgICAgIyBWYWxpZGF0ZSBhbGwgb2YgdGhlIGluZm9ybWF0aW9uCisgICAgZGVmIHZhbGlkYXRlX2FsbChzZWxmKToKKyAgICAgICAgc2VsZi52YWxpZGF0ZV90b2tlbnMoKQorICAgICAgICBzZWxmLnZhbGlkYXRlX2xpdGVyYWxzKCkKKyAgICAgICAgc2VsZi52YWxpZGF0ZV9ydWxlcygpCisgICAgICAgIHJldHVybiBzZWxmLmVycm9yCisKKyAgICAjIEdldCB0aGUgdG9rZW5zIG1hcAorICAgIGRlZiBnZXRfdG9rZW5zKHNlbGYpOgorICAgICAgICB0b2tlbnMgPSBzZWxmLmxkaWN0LmdldCgidG9rZW5zIixOb25lKQorICAgICAgICBpZiBub3QgdG9rZW5zOgorICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIk5vIHRva2VuIGxpc3QgaXMgZGVmaW5lZCIpCisgICAgICAgICAgICBzZWxmLmVycm9yID0gMQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodG9rZW5zLChsaXN0LCB0dXBsZSkpOgorICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoInRva2VucyBtdXN0IGJlIGEgbGlzdCBvciB0dXBsZSIpCisgICAgICAgICAgICBzZWxmLmVycm9yID0gMQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIAorICAgICAgICBpZiBub3QgdG9rZW5zOgorICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoInRva2VucyBpcyBlbXB0eSIpCisgICAgICAgICAgICBzZWxmLmVycm9yID0gMQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgc2VsZi50b2tlbnMgPSB0b2tlbnMKKworICAgICMgVmFsaWRhdGUgdGhlIHRva2VucworICAgIGRlZiB2YWxpZGF0ZV90b2tlbnMoc2VsZik6CisgICAgICAgIHRlcm1pbmFscyA9IHt9CisgICAgICAgIGZvciBuIGluIHNlbGYudG9rZW5zOgorICAgICAgICAgICAgaWYgbm90IF9pc19pZGVudGlmaWVyLm1hdGNoKG4pOgorICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCJCYWQgdG9rZW4gbmFtZSAnJXMnIixuKQorICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IgPSAxCisgICAgICAgICAgICBpZiBuIGluIHRlcm1pbmFsczoKKyAgICAgICAgICAgICAgICBzZWxmLmxvZy53YXJuaW5nKCJUb2tlbiAnJXMnIG11bHRpcGx5IGRlZmluZWQiLCBuKQorICAgICAgICAgICAgdGVybWluYWxzW25dID0gMQorCisgICAgIyBHZXQgdGhlIGxpdGVyYWxzIHNwZWNpZmllcgorICAgIGRlZiBnZXRfbGl0ZXJhbHMoc2VsZik6CisgICAgICAgIHNlbGYubGl0ZXJhbHMgPSBzZWxmLmxkaWN0LmdldCgibGl0ZXJhbHMiLCIiKQorCisgICAgIyBWYWxpZGF0ZSBsaXRlcmFscworICAgIGRlZiB2YWxpZGF0ZV9saXRlcmFscyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIGMgaW4gc2VsZi5saXRlcmFsczoKKyAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShjLFN0cmluZ1R5cGVzKSBvciBsZW4oYykgPiAxOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigiSW52YWxpZCBsaXRlcmFsICVzLiBNdXN0IGJlIGEgc2luZ2xlIGNoYXJhY3RlciIsIHJlcHIoYykpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IgPSAxCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCJJbnZhbGlkIGxpdGVyYWxzIHNwZWNpZmljYXRpb24uIGxpdGVyYWxzIG11c3QgYmUgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIikKKyAgICAgICAgICAgIHNlbGYuZXJyb3IgPSAxCisKKyAgICBkZWYgZ2V0X3N0YXRlcyhzZWxmKToKKyAgICAgICAgc2VsZi5zdGF0ZXMgPSBzZWxmLmxkaWN0LmdldCgic3RhdGVzIixOb25lKQorICAgICAgICAjIEJ1aWxkIHN0YXRlbWFwCisgICAgICAgIGlmIHNlbGYuc3RhdGVzOgorICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHNlbGYuc3RhdGVzLCh0dXBsZSxsaXN0KSk6CisgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigic3RhdGVzIG11c3QgYmUgZGVmaW5lZCBhcyBhIHR1cGxlIG9yIGxpc3QiKQorICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvciA9IDEKKyAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgZm9yIHMgaW4gc2VsZi5zdGF0ZXM6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzLHR1cGxlKSBvciBsZW4ocykgIT0gMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigiSW52YWxpZCBzdGF0ZSBzcGVjaWZpZXIgJXMuIE11c3QgYmUgYSB0dXBsZSAoc3RhdGVuYW1lLCdleGNsdXNpdmV8aW5jbHVzaXZlJykiLHJlcHIocykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvciA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgc3RhdGV0eXBlID0gcworICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UobmFtZSxTdHJpbmdUeXBlcyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIlN0YXRlIG5hbWUgJXMgbXVzdCBiZSBhIHN0cmluZyIsIHJlcHIobmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvciA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IChzdGF0ZXR5cGUgPT0gJ2luY2x1c2l2ZScgb3Igc3RhdGV0eXBlID09ICdleGNsdXNpdmUnKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigiU3RhdGUgdHlwZSBmb3Igc3RhdGUgJXMgbXVzdCBiZSAnaW5jbHVzaXZlJyBvciAnZXhjbHVzaXZlJyIsbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBuYW1lIGluIHNlbGYuc3RhdGVpbmZvOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCJTdGF0ZSAnJXMnIGFscmVhZHkgZGVmaW5lZCIsbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlaW5mb1tuYW1lXSA9IHN0YXRldHlwZQorCisgICAgIyBHZXQgYWxsIG9mIHRoZSBzeW1ib2xzIHdpdGggYSB0XyBwcmVmaXggYW5kIHNvcnQgdGhlbSBpbnRvIHZhcmlvdXMKKyAgICAjIGNhdGVnb3JpZXMgKGZ1bmN0aW9ucywgc3RyaW5ncywgZXJyb3IgZnVuY3Rpb25zLCBhbmQgaWdub3JlIGNoYXJhY3RlcnMpCisKKyAgICBkZWYgZ2V0X3J1bGVzKHNlbGYpOgorICAgICAgICB0c3ltYm9scyA9IFtmIGZvciBmIGluIHNlbGYubGRpY3QgaWYgZls6Ml0gPT0gJ3RfJyBdCisKKyAgICAgICAgIyBOb3cgYnVpbGQgdXAgYSBsaXN0IG9mIGZ1bmN0aW9ucyBhbmQgYSBsaXN0IG9mIHN0cmluZ3MKKworICAgICAgICBzZWxmLnRva25hbWVzID0geyB9ICAgICAgICAjIE1hcHBpbmcgb2Ygc3ltYm9scyB0byB0b2tlbiBuYW1lcworICAgICAgICBzZWxmLmZ1bmNzeW0gPSAgeyB9ICAgICAgICAjIFN5bWJvbHMgZGVmaW5lZCBhcyBmdW5jdGlvbnMKKyAgICAgICAgc2VsZi5zdHJzeW0gPSAgIHsgfSAgICAgICAgIyBTeW1ib2xzIGRlZmluZWQgYXMgc3RyaW5ncworICAgICAgICBzZWxmLmlnbm9yZSAgID0geyB9ICAgICAgICAjIElnbm9yZSBzdHJpbmdzIGJ5IHN0YXRlCisgICAgICAgIHNlbGYuZXJyb3JmICAgPSB7IH0gICAgICAgICMgRXJyb3IgZnVuY3Rpb25zIGJ5IHN0YXRlCisKKyAgICAgICAgZm9yIHMgaW4gc2VsZi5zdGF0ZWluZm86CisgICAgICAgICAgICAgc2VsZi5mdW5jc3ltW3NdID0gW10KKyAgICAgICAgICAgICBzZWxmLnN0cnN5bVtzXSA9IFtdCisKKyAgICAgICAgaWYgbGVuKHRzeW1ib2xzKSA9PSAwOgorICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIk5vIHJ1bGVzIG9mIHRoZSBmb3JtIHRfcnVsZW5hbWUgYXJlIGRlZmluZWQiKQorICAgICAgICAgICAgc2VsZi5lcnJvciA9IDEKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGZvciBmIGluIHRzeW1ib2xzOgorICAgICAgICAgICAgdCA9IHNlbGYubGRpY3RbZl0KKyAgICAgICAgICAgIHN0YXRlcywgdG9rbmFtZSA9IF9zdGF0ZXRva2VuKGYsc2VsZi5zdGF0ZWluZm8pCisgICAgICAgICAgICBzZWxmLnRva25hbWVzW2ZdID0gdG9rbmFtZQorCisgICAgICAgICAgICBpZiBoYXNhdHRyKHQsIl9fY2FsbF9fIik6CisgICAgICAgICAgICAgICAgaWYgdG9rbmFtZSA9PSAnZXJyb3InOgorICAgICAgICAgICAgICAgICAgICBmb3IgcyBpbiBzdGF0ZXM6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yZltzXSA9IHQKKyAgICAgICAgICAgICAgICBlbGlmIHRva25hbWUgPT0gJ2lnbm9yZSc6CisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBmdW5jX2NvZGUodCkuY29fZmlyc3RsaW5lbm8KKyAgICAgICAgICAgICAgICAgICAgZmlsZSA9IGZ1bmNfY29kZSh0KS5jb19maWxlbmFtZQorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigiJXM6JWQ6IFJ1bGUgJyVzJyBtdXN0IGJlIGRlZmluZWQgYXMgYSBzdHJpbmciLGZpbGUsbGluZSx0Ll9fbmFtZV9fKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yID0gMQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGZvciBzIGluIHN0YXRlczogCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZ1bmNzeW1bc10uYXBwZW5kKChmLHQpKQorICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHQsIFN0cmluZ1R5cGVzKToKKyAgICAgICAgICAgICAgICBpZiB0b2tuYW1lID09ICdpZ25vcmUnOgorICAgICAgICAgICAgICAgICAgICBmb3IgcyBpbiBzdGF0ZXM6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmlnbm9yZVtzXSA9IHQKKyAgICAgICAgICAgICAgICAgICAgaWYgIlxcIiBpbiB0OgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2cud2FybmluZygiJXMgY29udGFpbnMgYSBsaXRlcmFsIGJhY2tzbGFzaCAnXFwnIixmKQorCisgICAgICAgICAgICAgICAgZWxpZiB0b2tuYW1lID09ICdlcnJvcic6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCJSdWxlICclcycgbXVzdCBiZSBkZWZpbmVkIGFzIGEgZnVuY3Rpb24iLCBmKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yID0gMQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGZvciBzIGluIHN0YXRlczogCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0cnN5bVtzXS5hcHBlbmQoKGYsdCkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCIlcyBub3QgZGVmaW5lZCBhcyBhIGZ1bmN0aW9uIG9yIHN0cmluZyIsIGYpCisgICAgICAgICAgICAgICAgc2VsZi5lcnJvciA9IDEKKworICAgICAgICAjIFNvcnQgdGhlIGZ1bmN0aW9ucyBieSBsaW5lIG51bWJlcgorICAgICAgICBmb3IgZiBpbiBzZWxmLmZ1bmNzeW0udmFsdWVzKCk6CisgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMzoKKyAgICAgICAgICAgICAgICBmLnNvcnQobGFtYmRhIHgseTogY21wKGZ1bmNfY29kZSh4WzFdKS5jb19maXJzdGxpbmVubyxmdW5jX2NvZGUoeVsxXSkuY29fZmlyc3RsaW5lbm8pKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIFB5dGhvbiAzLjAKKyAgICAgICAgICAgICAgICBmLnNvcnQoa2V5PWxhbWJkYSB4OiBmdW5jX2NvZGUoeFsxXSkuY29fZmlyc3RsaW5lbm8pCisKKyAgICAgICAgIyBTb3J0IHRoZSBzdHJpbmdzIGJ5IHJlZ3VsYXIgZXhwcmVzc2lvbiBsZW5ndGgKKyAgICAgICAgZm9yIHMgaW4gc2VsZi5zdHJzeW0udmFsdWVzKCk6CisgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMzoKKyAgICAgICAgICAgICAgICBzLnNvcnQobGFtYmRhIHgseTogKGxlbih4WzFdKSA8IGxlbih5WzFdKSkgLSAobGVuKHhbMV0pID4gbGVuKHlbMV0pKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBQeXRob24gMy4wCisgICAgICAgICAgICAgICAgcy5zb3J0KGtleT1sYW1iZGEgeDogbGVuKHhbMV0pLHJldmVyc2U9VHJ1ZSkKKworICAgICMgVmFsaWRhdGUgYWxsIG9mIHRoZSB0X3J1bGVzIGNvbGxlY3RlZCAKKyAgICBkZWYgdmFsaWRhdGVfcnVsZXMoc2VsZik6CisgICAgICAgIGZvciBzdGF0ZSBpbiBzZWxmLnN0YXRlaW5mbzoKKyAgICAgICAgICAgICMgVmFsaWRhdGUgYWxsIHJ1bGVzIGRlZmluZWQgYnkgZnVuY3Rpb25zCisKKyAgICAgICAgICAgIAorCisgICAgICAgICAgICBmb3IgZm5hbWUsIGYgaW4gc2VsZi5mdW5jc3ltW3N0YXRlXToKKyAgICAgICAgICAgICAgICBsaW5lID0gZnVuY19jb2RlKGYpLmNvX2ZpcnN0bGluZW5vCisgICAgICAgICAgICAgICAgZmlsZSA9IGZ1bmNfY29kZShmKS5jb19maWxlbmFtZQorICAgICAgICAgICAgICAgIHNlbGYuZmlsZXNbZmlsZV0gPSAxCisKKyAgICAgICAgICAgICAgICB0b2tuYW1lID0gc2VsZi50b2tuYW1lc1tmbmFtZV0KKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGYsIHR5cGVzLk1ldGhvZFR5cGUpOgorICAgICAgICAgICAgICAgICAgICByZXFhcmdzID0gMgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJlcWFyZ3MgPSAxCisgICAgICAgICAgICAgICAgbmFyZ3MgPSBmdW5jX2NvZGUoZikuY29fYXJnY291bnQKKyAgICAgICAgICAgICAgICBpZiBuYXJncyA+IHJlcWFyZ3M6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCIlczolZDogUnVsZSAnJXMnIGhhcyB0b28gbWFueSBhcmd1bWVudHMiLGZpbGUsbGluZSxmLl9fbmFtZV9fKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yID0gMQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgaWYgbmFyZ3MgPCByZXFhcmdzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigiJXM6JWQ6IFJ1bGUgJyVzJyByZXF1aXJlcyBhbiBhcmd1bWVudCIsIGZpbGUsbGluZSxmLl9fbmFtZV9fKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yID0gMQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgaWYgbm90IGYuX19kb2NfXzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIiVzOiVkOiBObyByZWd1bGFyIGV4cHJlc3Npb24gZGVmaW5lZCBmb3IgcnVsZSAnJXMnIixmaWxlLGxpbmUsZi5fX25hbWVfXykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvciA9IDEKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgYyA9IHJlLmNvbXBpbGUoIig/UDwlcz4lcykiICUgKGZuYW1lLGYuX19kb2NfXyksIHJlLlZFUkJPU0UgfCBzZWxmLnJlZmxhZ3MpCisgICAgICAgICAgICAgICAgICAgIGlmIGMubWF0Y2goIiIpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIiVzOiVkOiBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHJ1bGUgJyVzJyBtYXRjaGVzIGVtcHR5IHN0cmluZyIsIGZpbGUsbGluZSxmLl9fbmFtZV9fKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvciA9IDEKKyAgICAgICAgICAgICAgICBleGNlcHQgcmUuZXJyb3I6CisgICAgICAgICAgICAgICAgICAgIF9ldHlwZSwgZSwgX2V0cmFjZSA9IHN5cy5leGNfaW5mbygpCisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCIlczolZDogSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb24gZm9yIHJ1bGUgJyVzJy4gJXMiLCBmaWxlLGxpbmUsZi5fX25hbWVfXyxlKQorICAgICAgICAgICAgICAgICAgICBpZiAnIycgaW4gZi5fX2RvY19fOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIiVzOiVkLiBNYWtlIHN1cmUgJyMnIGluIHJ1bGUgJyVzJyBpcyBlc2NhcGVkIHdpdGggJ1xcIyciLGZpbGUsbGluZSwgZi5fX25hbWVfXykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvciA9IDEKKworICAgICAgICAgICAgIyBWYWxpZGF0ZSBhbGwgcnVsZXMgZGVmaW5lZCBieSBzdHJpbmdzCisgICAgICAgICAgICBmb3IgbmFtZSxyIGluIHNlbGYuc3Ryc3ltW3N0YXRlXToKKyAgICAgICAgICAgICAgICB0b2tuYW1lID0gc2VsZi50b2tuYW1lc1tuYW1lXQorICAgICAgICAgICAgICAgIGlmIHRva25hbWUgPT0gJ2Vycm9yJzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIlJ1bGUgJyVzJyBtdXN0IGJlIGRlZmluZWQgYXMgYSBmdW5jdGlvbiIsIG5hbWUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IgPSAxCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICBpZiBub3QgdG9rbmFtZSBpbiBzZWxmLnRva2VucyBhbmQgdG9rbmFtZS5maW5kKCJpZ25vcmVfIikgPCAwOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigiUnVsZSAnJXMnIGRlZmluZWQgZm9yIGFuIHVuc3BlY2lmaWVkIHRva2VuICVzIixuYW1lLHRva25hbWUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IgPSAxCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGMgPSByZS5jb21waWxlKCIoP1A8JXM+JXMpIiAlIChuYW1lLHIpLHJlLlZFUkJPU0UgfCBzZWxmLnJlZmxhZ3MpCisgICAgICAgICAgICAgICAgICAgIGlmIChjLm1hdGNoKCIiKSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIlJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgcnVsZSAnJXMnIG1hdGNoZXMgZW1wdHkgc3RyaW5nIixuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IgPSAxCisgICAgICAgICAgICAgICAgZXhjZXB0IHJlLmVycm9yOgorICAgICAgICAgICAgICAgICAgICBfZXR5cGUsIGUsIF9ldHJhY2UgPSBzeXMuZXhjX2luZm8oKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigiSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb24gZm9yIHJ1bGUgJyVzJy4gJXMiLG5hbWUsZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgJyMnIGluIHI6CisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIk1ha2Ugc3VyZSAnIycgaW4gcnVsZSAnJXMnIGlzIGVzY2FwZWQgd2l0aCAnXFwjJyIsbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvciA9IDEKKworICAgICAgICAgICAgaWYgbm90IHNlbGYuZnVuY3N5bVtzdGF0ZV0gYW5kIG5vdCBzZWxmLnN0cnN5bVtzdGF0ZV06CisgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIk5vIHJ1bGVzIGRlZmluZWQgZm9yIHN0YXRlICclcyciLHN0YXRlKQorICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IgPSAxCisKKyAgICAgICAgICAgICMgVmFsaWRhdGUgdGhlIGVycm9yIGZ1bmN0aW9uCisgICAgICAgICAgICBlZnVuYyA9IHNlbGYuZXJyb3JmLmdldChzdGF0ZSxOb25lKQorICAgICAgICAgICAgaWYgZWZ1bmM6CisgICAgICAgICAgICAgICAgZiA9IGVmdW5jCisgICAgICAgICAgICAgICAgbGluZSA9IGZ1bmNfY29kZShmKS5jb19maXJzdGxpbmVubworICAgICAgICAgICAgICAgIGZpbGUgPSBmdW5jX2NvZGUoZikuY29fZmlsZW5hbWUKKyAgICAgICAgICAgICAgICBzZWxmLmZpbGVzW2ZpbGVdID0gMQorCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShmLCB0eXBlcy5NZXRob2RUeXBlKToKKyAgICAgICAgICAgICAgICAgICAgcmVxYXJncyA9IDIKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXFhcmdzID0gMQorICAgICAgICAgICAgICAgIG5hcmdzID0gZnVuY19jb2RlKGYpLmNvX2FyZ2NvdW50CisgICAgICAgICAgICAgICAgaWYgbmFyZ3MgPiByZXFhcmdzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigiJXM6JWQ6IFJ1bGUgJyVzJyBoYXMgdG9vIG1hbnkgYXJndW1lbnRzIixmaWxlLGxpbmUsZi5fX25hbWVfXykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvciA9IDEKKworICAgICAgICAgICAgICAgIGlmIG5hcmdzIDwgcmVxYXJnczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIiVzOiVkOiBSdWxlICclcycgcmVxdWlyZXMgYW4gYXJndW1lbnQiLCBmaWxlLGxpbmUsZi5fX25hbWVfXykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvciA9IDEKKworICAgICAgICBmb3IgZiBpbiBzZWxmLmZpbGVzOgorICAgICAgICAgICAgc2VsZi52YWxpZGF0ZV9maWxlKGYpCisKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIHZhbGlkYXRlX2ZpbGUoKQorICAgICMKKyAgICAjIFRoaXMgY2hlY2tzIHRvIHNlZSBpZiB0aGVyZSBhcmUgZHVwbGljYXRlZCB0X3J1bGVuYW1lKCkgZnVuY3Rpb25zIG9yIHN0cmluZ3MKKyAgICAjIGluIHRoZSBwYXJzZXIgaW5wdXQgZmlsZS4gIFRoaXMgaXMgZG9uZSB1c2luZyBhIHNpbXBsZSByZWd1bGFyIGV4cHJlc3Npb24KKyAgICAjIG1hdGNoIG9uIGVhY2ggbGluZSBpbiB0aGUgZ2l2ZW4gZmlsZS4gIAorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiB2YWxpZGF0ZV9maWxlKHNlbGYsZmlsZW5hbWUpOgorICAgICAgICBpbXBvcnQgb3MucGF0aAorICAgICAgICBiYXNlLGV4dCA9IG9zLnBhdGguc3BsaXRleHQoZmlsZW5hbWUpCisgICAgICAgIGlmIGV4dCAhPSAnLnB5JzogcmV0dXJuICAgICAgICAgIyBObyBpZGVhIHdoYXQgdGhlIGZpbGUgaXMuIFJldHVybiBPSworCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lKQorICAgICAgICAgICAgbGluZXMgPSBmLnJlYWRsaW5lcygpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gICAgICAgICAgICAgICAgICAgICAgIyBDb3VsZG4ndCBmaW5kIHRoZSBmaWxlLiAgRG9uJ3Qgd29ycnkgYWJvdXQgaXQKKworICAgICAgICBmcmUgPSByZS5jb21waWxlKHInXHMqZGVmXHMrKHRfW2EtekEtWl8wLTldKilcKCcpCisgICAgICAgIHNyZSA9IHJlLmNvbXBpbGUocidccyoodF9bYS16QS1aXzAtOV0qKVxzKj0nKQorCisgICAgICAgIGNvdW50aGFzaCA9IHsgfQorICAgICAgICBsaW5lbiA9IDEKKyAgICAgICAgZm9yIGwgaW4gbGluZXM6CisgICAgICAgICAgICBtID0gZnJlLm1hdGNoKGwpCisgICAgICAgICAgICBpZiBub3QgbToKKyAgICAgICAgICAgICAgICBtID0gc3JlLm1hdGNoKGwpCisgICAgICAgICAgICBpZiBtOgorICAgICAgICAgICAgICAgIG5hbWUgPSBtLmdyb3VwKDEpCisgICAgICAgICAgICAgICAgcHJldiA9IGNvdW50aGFzaC5nZXQobmFtZSkKKyAgICAgICAgICAgICAgICBpZiBub3QgcHJldjoKKyAgICAgICAgICAgICAgICAgICAgY291bnRoYXNoW25hbWVdID0gbGluZW4KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigiJXM6JWQ6IFJ1bGUgJXMgcmVkZWZpbmVkLiBQcmV2aW91c2x5IGRlZmluZWQgb24gbGluZSAlZCIsZmlsZW5hbWUsbGluZW4sbmFtZSxwcmV2KQorICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yID0gMQorICAgICAgICAgICAgbGluZW4gKz0gMQorICAgICAgICAgICAgCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGxleChtb2R1bGUpCisjCisjIEJ1aWxkIGFsbCBvZiB0aGUgcmVndWxhciBleHByZXNzaW9uIHJ1bGVzIGZyb20gZGVmaW5pdGlvbnMgaW4gdGhlIHN1cHBsaWVkIG1vZHVsZQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZGVmIGxleChtb2R1bGU9Tm9uZSxvYmplY3Q9Tm9uZSxkZWJ1Zz0wLG9wdGltaXplPTAsbGV4dGFiPSJsZXh0YWIiLHJlZmxhZ3M9MCxub3dhcm49MCxvdXRwdXRkaXI9IiIsIGRlYnVnbG9nPU5vbmUsIGVycm9ybG9nPU5vbmUpOgorICAgIGdsb2JhbCBsZXhlcgorICAgIGxkaWN0ID0gTm9uZQorICAgIHN0YXRlaW5mbyAgPSB7ICdJTklUSUFMJyA6ICdpbmNsdXNpdmUnfQorICAgIGxleG9iaiA9IExleGVyKCkKKyAgICBsZXhvYmoubGV4b3B0aW1pemUgPSBvcHRpbWl6ZQorICAgIGdsb2JhbCB0b2tlbixpbnB1dAorCisgICAgaWYgZXJyb3Jsb2cgaXMgTm9uZToKKyAgICAgICAgZXJyb3Jsb2cgPSBQbHlMb2dnZXIoc3lzLnN0ZGVycikKKworICAgIGlmIGRlYnVnOgorICAgICAgICBpZiBkZWJ1Z2xvZyBpcyBOb25lOgorICAgICAgICAgICAgZGVidWdsb2cgPSBQbHlMb2dnZXIoc3lzLnN0ZGVycikKKworICAgICMgR2V0IHRoZSBtb2R1bGUgZGljdGlvbmFyeSB1c2VkIGZvciB0aGUgbGV4ZXIKKyAgICBpZiBvYmplY3Q6IG1vZHVsZSA9IG9iamVjdAorCisgICAgaWYgbW9kdWxlOgorICAgICAgICBfaXRlbXMgPSBbKGssZ2V0YXR0cihtb2R1bGUsaykpIGZvciBrIGluIGRpcihtb2R1bGUpXQorICAgICAgICBsZGljdCA9IGRpY3QoX2l0ZW1zKQorICAgIGVsc2U6CisgICAgICAgIGxkaWN0ID0gZ2V0X2NhbGxlcl9tb2R1bGVfZGljdCgyKQorCisgICAgIyBDb2xsZWN0IHBhcnNlciBpbmZvcm1hdGlvbiBmcm9tIHRoZSBkaWN0aW9uYXJ5CisgICAgbGluZm8gPSBMZXhlclJlZmxlY3QobGRpY3QsbG9nPWVycm9ybG9nLHJlZmxhZ3M9cmVmbGFncykKKyAgICBsaW5mby5nZXRfYWxsKCkKKyAgICBpZiBub3Qgb3B0aW1pemU6CisgICAgICAgIGlmIGxpbmZvLnZhbGlkYXRlX2FsbCgpOgorICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoIkNhbid0IGJ1aWxkIGxleGVyIikKKworICAgIGlmIG9wdGltaXplIGFuZCBsZXh0YWI6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxleG9iai5yZWFkdGFiKGxleHRhYixsZGljdCkKKyAgICAgICAgICAgIHRva2VuID0gbGV4b2JqLnRva2VuCisgICAgICAgICAgICBpbnB1dCA9IGxleG9iai5pbnB1dAorICAgICAgICAgICAgbGV4ZXIgPSBsZXhvYmoKKyAgICAgICAgICAgIHJldHVybiBsZXhvYmoKKworICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICAjIER1bXAgc29tZSBiYXNpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KKyAgICBpZiBkZWJ1ZzoKKyAgICAgICAgZGVidWdsb2cuaW5mbygibGV4OiB0b2tlbnMgICA9ICVyIiwgbGluZm8udG9rZW5zKQorICAgICAgICBkZWJ1Z2xvZy5pbmZvKCJsZXg6IGxpdGVyYWxzID0gJXIiLCBsaW5mby5saXRlcmFscykKKyAgICAgICAgZGVidWdsb2cuaW5mbygibGV4OiBzdGF0ZXMgICA9ICVyIiwgbGluZm8uc3RhdGVpbmZvKQorCisgICAgIyBCdWlsZCBhIGRpY3Rpb25hcnkgb2YgdmFsaWQgdG9rZW4gbmFtZXMKKyAgICBsZXhvYmoubGV4dG9rZW5zID0geyB9CisgICAgZm9yIG4gaW4gbGluZm8udG9rZW5zOgorICAgICAgICBsZXhvYmoubGV4dG9rZW5zW25dID0gMQorCisgICAgIyBHZXQgbGl0ZXJhbHMgc3BlY2lmaWNhdGlvbgorICAgIGlmIGlzaW5zdGFuY2UobGluZm8ubGl0ZXJhbHMsKGxpc3QsdHVwbGUpKToKKyAgICAgICAgbGV4b2JqLmxleGxpdGVyYWxzID0gdHlwZShsaW5mby5saXRlcmFsc1swXSkoKS5qb2luKGxpbmZvLmxpdGVyYWxzKQorICAgIGVsc2U6CisgICAgICAgIGxleG9iai5sZXhsaXRlcmFscyA9IGxpbmZvLmxpdGVyYWxzCisKKyAgICAjIEdldCB0aGUgc3RhdGVpbmZvIGRpY3Rpb25hcnkKKyAgICBzdGF0ZWluZm8gPSBsaW5mby5zdGF0ZWluZm8KKworICAgIHJlZ2V4cyA9IHsgfQorICAgICMgQnVpbGQgdGhlIG1hc3RlciByZWd1bGFyIGV4cHJlc3Npb25zCisgICAgZm9yIHN0YXRlIGluIHN0YXRlaW5mbzoKKyAgICAgICAgcmVnZXhfbGlzdCA9IFtdCisKKyAgICAgICAgIyBBZGQgcnVsZXMgZGVmaW5lZCBieSBmdW5jdGlvbnMgZmlyc3QKKyAgICAgICAgZm9yIGZuYW1lLCBmIGluIGxpbmZvLmZ1bmNzeW1bc3RhdGVdOgorICAgICAgICAgICAgbGluZSA9IGZ1bmNfY29kZShmKS5jb19maXJzdGxpbmVubworICAgICAgICAgICAgZmlsZSA9IGZ1bmNfY29kZShmKS5jb19maWxlbmFtZQorICAgICAgICAgICAgcmVnZXhfbGlzdC5hcHBlbmQoIig/UDwlcz4lcykiICUgKGZuYW1lLGYuX19kb2NfXykpCisgICAgICAgICAgICBpZiBkZWJ1ZzoKKyAgICAgICAgICAgICAgICBkZWJ1Z2xvZy5pbmZvKCJsZXg6IEFkZGluZyBydWxlICVzIC0+ICclcycgKHN0YXRlICclcycpIixmbmFtZSxmLl9fZG9jX18sIHN0YXRlKQorCisgICAgICAgICMgTm93IGFkZCBhbGwgb2YgdGhlIHNpbXBsZSBydWxlcworICAgICAgICBmb3IgbmFtZSxyIGluIGxpbmZvLnN0cnN5bVtzdGF0ZV06CisgICAgICAgICAgICByZWdleF9saXN0LmFwcGVuZCgiKD9QPCVzPiVzKSIgJSAobmFtZSxyKSkKKyAgICAgICAgICAgIGlmIGRlYnVnOgorICAgICAgICAgICAgICAgIGRlYnVnbG9nLmluZm8oImxleDogQWRkaW5nIHJ1bGUgJXMgLT4gJyVzJyAoc3RhdGUgJyVzJykiLG5hbWUsciwgc3RhdGUpCisKKyAgICAgICAgcmVnZXhzW3N0YXRlXSA9IHJlZ2V4X2xpc3QKKworICAgICMgQnVpbGQgdGhlIG1hc3RlciByZWd1bGFyIGV4cHJlc3Npb25zCisKKyAgICBpZiBkZWJ1ZzoKKyAgICAgICAgZGVidWdsb2cuaW5mbygibGV4OiA9PT09IE1BU1RFUiBSRUdFWFMgRk9MTE9XID09PT0iKQorCisgICAgZm9yIHN0YXRlIGluIHJlZ2V4czoKKyAgICAgICAgbGV4cmUsIHJlX3RleHQsIHJlX25hbWVzID0gX2Zvcm1fbWFzdGVyX3JlKHJlZ2V4c1tzdGF0ZV0scmVmbGFncyxsZGljdCxsaW5mby50b2tuYW1lcykKKyAgICAgICAgbGV4b2JqLmxleHN0YXRlcmVbc3RhdGVdID0gbGV4cmUKKyAgICAgICAgbGV4b2JqLmxleHN0YXRlcmV0ZXh0W3N0YXRlXSA9IHJlX3RleHQKKyAgICAgICAgbGV4b2JqLmxleHN0YXRlcmVuYW1lc1tzdGF0ZV0gPSByZV9uYW1lcworICAgICAgICBpZiBkZWJ1ZzoKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihyZV90ZXh0KSk6CisgICAgICAgICAgICAgICAgZGVidWdsb2cuaW5mbygibGV4OiBzdGF0ZSAnJXMnIDogcmVnZXhbJWRdID0gJyVzJyIsc3RhdGUsIGksIHJlX3RleHRbaV0pCisKKyAgICAjIEZvciBpbmNsdXNpdmUgc3RhdGVzLCB3ZSBuZWVkIHRvIGFkZCB0aGUgcmVndWxhciBleHByZXNzaW9ucyBmcm9tIHRoZSBJTklUSUFMIHN0YXRlCisgICAgZm9yIHN0YXRlLHN0eXBlIGluIHN0YXRlaW5mby5pdGVtcygpOgorICAgICAgICBpZiBzdGF0ZSAhPSAiSU5JVElBTCIgYW5kIHN0eXBlID09ICdpbmNsdXNpdmUnOgorICAgICAgICAgICAgIGxleG9iai5sZXhzdGF0ZXJlW3N0YXRlXS5leHRlbmQobGV4b2JqLmxleHN0YXRlcmVbJ0lOSVRJQUwnXSkKKyAgICAgICAgICAgICBsZXhvYmoubGV4c3RhdGVyZXRleHRbc3RhdGVdLmV4dGVuZChsZXhvYmoubGV4c3RhdGVyZXRleHRbJ0lOSVRJQUwnXSkKKyAgICAgICAgICAgICBsZXhvYmoubGV4c3RhdGVyZW5hbWVzW3N0YXRlXS5leHRlbmQobGV4b2JqLmxleHN0YXRlcmVuYW1lc1snSU5JVElBTCddKQorCisgICAgbGV4b2JqLmxleHN0YXRlaW5mbyA9IHN0YXRlaW5mbworICAgIGxleG9iai5sZXhyZSA9IGxleG9iai5sZXhzdGF0ZXJlWyJJTklUSUFMIl0KKyAgICBsZXhvYmoubGV4cmV0ZXh0ID0gbGV4b2JqLmxleHN0YXRlcmV0ZXh0WyJJTklUSUFMIl0KKyAgICBsZXhvYmoubGV4cmVmbGFncyA9IHJlZmxhZ3MKKworICAgICMgU2V0IHVwIGlnbm9yZSB2YXJpYWJsZXMKKyAgICBsZXhvYmoubGV4c3RhdGVpZ25vcmUgPSBsaW5mby5pZ25vcmUKKyAgICBsZXhvYmoubGV4aWdub3JlID0gbGV4b2JqLmxleHN0YXRlaWdub3JlLmdldCgiSU5JVElBTCIsIiIpCisKKyAgICAjIFNldCB1cCBlcnJvciBmdW5jdGlvbnMKKyAgICBsZXhvYmoubGV4c3RhdGVlcnJvcmYgPSBsaW5mby5lcnJvcmYKKyAgICBsZXhvYmoubGV4ZXJyb3JmID0gbGluZm8uZXJyb3JmLmdldCgiSU5JVElBTCIsTm9uZSkKKyAgICBpZiBub3QgbGV4b2JqLmxleGVycm9yZjoKKyAgICAgICAgZXJyb3Jsb2cud2FybmluZygiTm8gdF9lcnJvciBydWxlIGlzIGRlZmluZWQiKQorCisgICAgIyBDaGVjayBzdGF0ZSBpbmZvcm1hdGlvbiBmb3IgaWdub3JlIGFuZCBlcnJvciBydWxlcworICAgIGZvciBzLHN0eXBlIGluIHN0YXRlaW5mby5pdGVtcygpOgorICAgICAgICBpZiBzdHlwZSA9PSAnZXhjbHVzaXZlJzoKKyAgICAgICAgICAgICAgaWYgbm90IHMgaW4gbGluZm8uZXJyb3JmOgorICAgICAgICAgICAgICAgICAgIGVycm9ybG9nLndhcm5pbmcoIk5vIGVycm9yIHJ1bGUgaXMgZGVmaW5lZCBmb3IgZXhjbHVzaXZlIHN0YXRlICclcyciLCBzKQorICAgICAgICAgICAgICBpZiBub3QgcyBpbiBsaW5mby5pZ25vcmUgYW5kIGxleG9iai5sZXhpZ25vcmU6CisgICAgICAgICAgICAgICAgICAgZXJyb3Jsb2cud2FybmluZygiTm8gaWdub3JlIHJ1bGUgaXMgZGVmaW5lZCBmb3IgZXhjbHVzaXZlIHN0YXRlICclcyciLCBzKQorICAgICAgICBlbGlmIHN0eXBlID09ICdpbmNsdXNpdmUnOgorICAgICAgICAgICAgICBpZiBub3QgcyBpbiBsaW5mby5lcnJvcmY6CisgICAgICAgICAgICAgICAgICAgbGluZm8uZXJyb3JmW3NdID0gbGluZm8uZXJyb3JmLmdldCgiSU5JVElBTCIsTm9uZSkKKyAgICAgICAgICAgICAgaWYgbm90IHMgaW4gbGluZm8uaWdub3JlOgorICAgICAgICAgICAgICAgICAgIGxpbmZvLmlnbm9yZVtzXSA9IGxpbmZvLmlnbm9yZS5nZXQoIklOSVRJQUwiLCIiKQorCisgICAgIyBDcmVhdGUgZ2xvYmFsIHZlcnNpb25zIG9mIHRoZSB0b2tlbigpIGFuZCBpbnB1dCgpIGZ1bmN0aW9ucworICAgIHRva2VuID0gbGV4b2JqLnRva2VuCisgICAgaW5wdXQgPSBsZXhvYmouaW5wdXQKKyAgICBsZXhlciA9IGxleG9iagorCisgICAgIyBJZiBpbiBvcHRpbWl6ZSBtb2RlLCB3ZSB3cml0ZSB0aGUgbGV4dGFiCisgICAgaWYgbGV4dGFiIGFuZCBvcHRpbWl6ZToKKyAgICAgICAgbGV4b2JqLndyaXRldGFiKGxleHRhYixvdXRwdXRkaXIpCisKKyAgICByZXR1cm4gbGV4b2JqCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgcnVubWFpbigpCisjCisjIFRoaXMgcnVucyB0aGUgbGV4ZXIgYXMgYSBtYWluIHByb2dyYW0KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZGVmIHJ1bm1haW4obGV4ZXI9Tm9uZSxkYXRhPU5vbmUpOgorICAgIGlmIG5vdCBkYXRhOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmaWxlbmFtZSA9IHN5cy5hcmd2WzFdCisgICAgICAgICAgICBmID0gb3BlbihmaWxlbmFtZSkKKyAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiUmVhZGluZyBmcm9tIHN0YW5kYXJkIGlucHV0ICh0eXBlIEVPRiB0byBlbmQpOlxuIikKKyAgICAgICAgICAgIGRhdGEgPSBzeXMuc3RkaW4ucmVhZCgpCisKKyAgICBpZiBsZXhlcjoKKyAgICAgICAgX2lucHV0ID0gbGV4ZXIuaW5wdXQKKyAgICBlbHNlOgorICAgICAgICBfaW5wdXQgPSBpbnB1dAorICAgIF9pbnB1dChkYXRhKQorICAgIGlmIGxleGVyOgorICAgICAgICBfdG9rZW4gPSBsZXhlci50b2tlbgorICAgIGVsc2U6CisgICAgICAgIF90b2tlbiA9IHRva2VuCisKKyAgICB3aGlsZSAxOgorICAgICAgICB0b2sgPSBfdG9rZW4oKQorICAgICAgICBpZiBub3QgdG9rOiBicmVhaworICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCIoJXMsJXIsJWQsJWQpXG4iICUgKHRvay50eXBlLCB0b2sudmFsdWUsIHRvay5saW5lbm8sdG9rLmxleHBvcykpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQFRPS0VOKHJlZ2V4KQorIworIyBUaGlzIGRlY29yYXRvciBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIHJlZ2V4IGV4cHJlc3Npb24gb24gYSBmdW5jdGlvbgorIyB3aGVuIGl0cyBkb2NzdHJpbmcgbWlnaHQgbmVlZCB0byBiZSBzZXQgaW4gYW4gYWx0ZXJuYXRpdmUgd2F5CisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2RlZiBUT0tFTihyKToKKyAgICBkZWYgc2V0X2RvYyhmKToKKyAgICAgICAgaWYgaGFzYXR0cihyLCJfX2NhbGxfXyIpOgorICAgICAgICAgICAgZi5fX2RvY19fID0gci5fX2RvY19fCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmLl9fZG9jX18gPSByCisgICAgICAgIHJldHVybiBmCisgICAgcmV0dXJuIHNldF9kb2MKKworIyBBbHRlcm5hdGl2ZSBzcGVsbGluZyBvZiB0aGUgVE9LRU4gZGVjb3JhdG9yCitUb2tlbiA9IFRPS0VOCisKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3BseS95YWNjLnB5IGIvYml0YmFrZS9saWIvcGx5L3lhY2MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE2OGZkOQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3BseS95YWNjLnB5CkBAIC0wLDAgKzEsMzI3NiBAQAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBwbHk6IHlhY2MucHkKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDksCisjIERhdmlkIE0uIEJlYXpsZXkgKERhYmVheiBMTEMpCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMgCisjICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorIyAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuICAKKyMgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIAorIyAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyMgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gIAorIyAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIERhdmlkIEJlYXpsZXkgb3IgRGFiZWF6IExMQyBtYXkgYmUgdXNlZCB0bworIyAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisjICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjCisjIFRoaXMgaW1wbGVtZW50cyBhbiBMUiBwYXJzZXIgdGhhdCBpcyBjb25zdHJ1Y3RlZCBmcm9tIGdyYW1tYXIgcnVsZXMgZGVmaW5lZAorIyBhcyBQeXRob24gZnVuY3Rpb25zLiBUaGUgZ3JhbW1lciBpcyBzcGVjaWZpZWQgYnkgc3VwcGx5aW5nIHRoZSBCTkYgaW5zaWRlCisjIFB5dGhvbiBkb2N1bWVudGF0aW9uIHN0cmluZ3MuICBUaGUgaW5zcGlyYXRpb24gZm9yIHRoaXMgdGVjaG5pcXVlIHdhcyBib3Jyb3dlZAorIyBmcm9tIEpvaG4gQXljb2NrJ3MgU3BhcmsgcGFyc2luZyBzeXN0ZW0uICBQTFkgbWlnaHQgYmUgdmlld2VkIGFzIGNyb3NzIGJldHdlZW4KKyMgU3BhcmsgYW5kIHRoZSBHTlUgYmlzb24gdXRpbGl0eS4KKyMKKyMgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gaXMgb25seSBzb21ld2hhdCBvYmplY3Qtb3JpZW50ZWQuIFRoZQorIyBMUiBwYXJzZXIgaXRzZWxmIGlzIGRlZmluZWQgaW4gdGVybXMgb2YgYW4gb2JqZWN0ICh3aGljaCBhbGxvd3MgbXVsdGlwbGUKKyMgcGFyc2VycyB0byBjby1leGlzdCkuICBIb3dldmVyLCBtb3N0IG9mIHRoZSB2YXJpYWJsZXMgdXNlZCBkdXJpbmcgdGFibGUKKyMgY29uc3RydWN0aW9uIGFyZSBkZWZpbmVkIGluIHRlcm1zIG9mIGdsb2JhbCB2YXJpYWJsZXMuICBVc2VycyBzaG91bGRuJ3QKKyMgbm90aWNlIHVubGVzcyB0aGV5IGFyZSB0cnlpbmcgdG8gZGVmaW5lIG11bHRpcGxlIHBhcnNlcnMgYXQgdGhlIHNhbWUKKyMgdGltZSB1c2luZyB0aHJlYWRzIChpbiB3aGljaCBjYXNlIHRoZXkgc2hvdWxkIGhhdmUgdGhlaXIgaGVhZCBleGFtaW5lZCkuCisjCisjIFRoaXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgYm90aCBTTFIgYW5kIExBTFIoMSkgcGFyc2luZy4gIExBTFIoMSkKKyMgc3VwcG9ydCB3YXMgb3JpZ2luYWxseSBpbXBsZW1lbnRlZCBieSBFbGlhcyBJb3VwIChlemlvdXBAYWx1bW5pLnVjaGljYWdvLmVkdSksCisjIHVzaW5nIHRoZSBhbGdvcml0aG0gZm91bmQgaW4gQWhvLCBTZXRoaSwgYW5kIFVsbG1hbiAiQ29tcGlsZXJzOiBQcmluY2lwbGVzLAorIyBUZWNobmlxdWVzLCBhbmQgVG9vbHMiIChUaGUgRHJhZ29uIEJvb2spLiAgTEFMUigxKSBoYXMgc2luY2UgYmVlbiByZXBsYWNlZAorIyBieSB0aGUgbW9yZSBlZmZpY2llbnQgRGVSZW1lciBhbmQgUGVubmVsbG8gYWxnb3JpdGhtLgorIworIyA6Ojo6Ojo6OiBXQVJOSU5HIDo6Ojo6OjoKKyMKKyMgQ29uc3RydWN0aW9uIG9mIExSIHBhcnNpbmcgdGFibGVzIGlzIGZhaXJseSBjb21wbGljYXRlZCBhbmQgZXhwZW5zaXZlLgorIyBUbyBtYWtlIHRoaXMgbW9kdWxlIHJ1biBmYXN0LCBhICpMT1QqIG9mIHdvcmsgaGFzIGJlZW4gcHV0IGludG8KKyMgb3B0aW1pemF0aW9uLS0tb2Z0ZW4gYXQgdGhlIGV4cGVuc2l2ZSBvZiByZWFkYWJpbGl0eSBhbmQgd2hhdCBtaWdodAorIyBjb25zaWRlciB0byBiZSBnb29kIFB5dGhvbiAiY29kaW5nIHN0eWxlLiIgICBNb2RpZnkgdGhlIGNvZGUgYXQgeW91cgorIyBvd24gcmlzayEKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitfX3ZlcnNpb25fXyAgICA9ICIzLjMiCitfX3RhYnZlcnNpb25fXyA9ICIzLjIiICAgICAgICMgVGFibGUgdmVyc2lvbgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgICAgICAgICAgICAgICAgICAgICA9PT0gVXNlciBjb25maWd1cmFibGUgcGFyYW1ldGVycyA9PT0KKyMKKyMgQ2hhbmdlIHRoZXNlIHRvIG1vZGlmeSB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiB5YWNjIChpZiB5b3Ugd2lzaCkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit5YWNjZGVidWcgICA9IDAgICAgICAgICAgICAgICAgIyBEZWJ1Z2dpbmcgbW9kZS4gIElmIHNldCwgeWFjYyBnZW5lcmF0ZXMgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYSAncGFyc2VyLm91dCcgZmlsZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkKKworZGVidWdfZmlsZSAgPSAncGFyc2VyLm91dCcgICAgICMgRGVmYXVsdCBuYW1lIG9mIHRoZSBkZWJ1Z2dpbmcgZmlsZQordGFiX21vZHVsZSAgPSAncGFyc2V0YWInICAgICAgICMgRGVmYXVsdCBuYW1lIG9mIHRoZSB0YWJsZSBtb2R1bGUKK2RlZmF1bHRfbHIgID0gJ0xBTFInICAgICAgICAgICAjIERlZmF1bHQgTFIgdGFibGUgZ2VuZXJhdGlvbiBtZXRob2QKKworZXJyb3JfY291bnQgPSAzICAgICAgICAgICAgICAgICMgTnVtYmVyIG9mIHN5bWJvbHMgdGhhdCBtdXN0IGJlIHNoaWZ0ZWQgdG8gbGVhdmUgcmVjb3ZlcnkgbW9kZQorCit5YWNjZGV2ZWwgICA9IDAgICAgICAgICAgICAgICAgIyBTZXQgdG8gVHJ1ZSBpZiBkZXZlbG9waW5nIHlhY2MuICBUaGlzIHR1cm5zIG9mZiBvcHRpbWl6ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGltcGxlbWVudGF0aW9ucyBvZiBjZXJ0YWluIGZ1bmN0aW9ucy4KKworcmVzdWx0bGltaXQgPSA0MCAgICAgICAgICAgICAgICMgU2l6ZSBsaW1pdCBvZiByZXN1bHRzIHdoZW4gcnVubmluZyBpbiBkZWJ1ZyBtb2RlLgorCitwaWNrbGVfcHJvdG9jb2wgPSAwICAgICAgICAgICAgIyBQcm90b2NvbCB0byB1c2Ugd2hlbiB3cml0aW5nIHBpY2tsZSBmaWxlcworCitpbXBvcnQgcmUsIHR5cGVzLCBzeXMsIG9zLnBhdGgKKworIyBDb21wYXRpYmlsaXR5IGZ1bmN0aW9uIGZvciBweXRob24gMi42LzMuMAoraWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDM6CisgICAgZGVmIGZ1bmNfY29kZShmKToKKyAgICAgICAgcmV0dXJuIGYuZnVuY19jb2RlCitlbHNlOgorICAgIGRlZiBmdW5jX2NvZGUoZik6CisgICAgICAgIHJldHVybiBmLl9fY29kZV9fCisKKyMgQ29tcGF0aWJpbGl0eQordHJ5OgorICAgIE1BWElOVCA9IHN5cy5tYXhpbnQKK2V4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICBNQVhJTlQgPSBzeXMubWF4c2l6ZQorCisjIFB5dGhvbiAyLngvMy4wIGNvbXBhdGliaWxpdHkuCitkZWYgbG9hZF9wbHlfbGV4KCk6CisgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDM6CisgICAgICAgIGltcG9ydCBsZXgKKyAgICBlbHNlOgorICAgICAgICBpbXBvcnQgcGx5LmxleCBhcyBsZXgKKyAgICByZXR1cm4gbGV4CisKKyMgVGhpcyBvYmplY3QgaXMgYSBzdGFuZC1pbiBmb3IgYSBsb2dnaW5nIG9iamVjdCBjcmVhdGVkIGJ5IHRoZSAKKyMgbG9nZ2luZyBtb2R1bGUuICAgUExZIHdpbGwgdXNlIHRoaXMgYnkgZGVmYXVsdCB0byBjcmVhdGUgdGhpbmdzCisjIHN1Y2ggYXMgdGhlIHBhcnNlci5vdXQgZmlsZS4gIElmIGEgdXNlciB3YW50cyBtb3JlIGRldGFpbGVkCisjIGluZm9ybWF0aW9uLCB0aGV5IGNhbiBjcmVhdGUgdGhlaXIgb3duIGxvZ2dpbmcgb2JqZWN0IGFuZCBwYXNzCisjIGl0IGludG8gUExZLgorCitjbGFzcyBQbHlMb2dnZXIob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZixmKToKKyAgICAgICAgc2VsZi5mID0gZgorICAgIGRlZiBkZWJ1ZyhzZWxmLG1zZywqYXJncywqKmt3YXJncyk6CisgICAgICAgIHNlbGYuZi53cml0ZSgobXNnICUgYXJncykgKyAiXG4iKQorICAgIGluZm8gICAgID0gZGVidWcKKworICAgIGRlZiB3YXJuaW5nKHNlbGYsbXNnLCphcmdzLCoqa3dhcmdzKToKKyAgICAgICAgc2VsZi5mLndyaXRlKCJXQVJOSU5HOiAiKyAobXNnICUgYXJncykgKyAiXG4iKQorCisgICAgZGVmIGVycm9yKHNlbGYsbXNnLCphcmdzLCoqa3dhcmdzKToKKyAgICAgICAgc2VsZi5mLndyaXRlKCJFUlJPUjogIiArIChtc2cgJSBhcmdzKSArICJcbiIpCisKKyAgICBjcml0aWNhbCA9IGRlYnVnCisKKyMgTnVsbCBsb2dnZXIgaXMgdXNlZCB3aGVuIG5vIG91dHB1dCBpcyBnZW5lcmF0ZWQuIERvZXMgbm90aGluZy4KK2NsYXNzIE51bGxMb2dnZXIob2JqZWN0KToKKyAgICBkZWYgX19nZXRhdHRyaWJ1dGVfXyhzZWxmLG5hbWUpOgorICAgICAgICByZXR1cm4gc2VsZgorICAgIGRlZiBfX2NhbGxfXyhzZWxmLCphcmdzLCoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgCisjIEV4Y2VwdGlvbiByYWlzZWQgZm9yIHlhY2MtcmVsYXRlZCBlcnJvcnMKK2NsYXNzIFlhY2NFcnJvcihFeGNlcHRpb24pOiAgIHBhc3MKKworIyBGb3JtYXQgdGhlIHJlc3VsdCBtZXNzYWdlIHRoYXQgdGhlIHBhcnNlciBwcm9kdWNlcyB3aGVuIHJ1bm5pbmcgaW4gZGVidWcgbW9kZS4KK2RlZiBmb3JtYXRfcmVzdWx0KHIpOgorICAgIHJlcHJfc3RyID0gcmVwcihyKQorICAgIGlmICdcbicgaW4gcmVwcl9zdHI6IHJlcHJfc3RyID0gcmVwcihyZXByX3N0cikKKyAgICBpZiBsZW4ocmVwcl9zdHIpID4gcmVzdWx0bGltaXQ6CisgICAgICAgIHJlcHJfc3RyID0gcmVwcl9zdHJbOnJlc3VsdGxpbWl0XSsiIC4uLiIKKyAgICByZXN1bHQgPSAiPCVzIEAgMHgleD4gKCVzKSIgJSAodHlwZShyKS5fX25hbWVfXyxpZChyKSxyZXByX3N0cikKKyAgICByZXR1cm4gcmVzdWx0CisKKworIyBGb3JtYXQgc3RhY2sgZW50cmllcyB3aGVuIHRoZSBwYXJzZXIgaXMgcnVubmluZyBpbiBkZWJ1ZyBtb2RlCitkZWYgZm9ybWF0X3N0YWNrX2VudHJ5KHIpOgorICAgIHJlcHJfc3RyID0gcmVwcihyKQorICAgIGlmICdcbicgaW4gcmVwcl9zdHI6IHJlcHJfc3RyID0gcmVwcihyZXByX3N0cikKKyAgICBpZiBsZW4ocmVwcl9zdHIpIDwgMTY6CisgICAgICAgIHJldHVybiByZXByX3N0cgorICAgIGVsc2U6CisgICAgICAgIHJldHVybiAiPCVzIEAgMHgleD4iICUgKHR5cGUocikuX19uYW1lX18saWQocikpCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAgICAgICAgICAgICAgICAgICAgICAgID09PSAgTFIgUGFyc2luZyBFbmdpbmUgPT09CisjCisjIFRoZSBmb2xsb3dpbmcgY2xhc3NlcyBhcmUgdXNlZCBmb3IgdGhlIExSIHBhcnNlciBpdHNlbGYuICBUaGVzZSBhcmUgbm90CisjIHVzZWQgZHVyaW5nIHRhYmxlIGNvbnN0cnVjdGlvbiBhbmQgYXJlIGluZGVwZW5kZW50IG9mIHRoZSBhY3R1YWwgTFIKKyMgdGFibGUgZ2VuZXJhdGlvbiBhbGdvcml0aG0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBob2xkIG5vbi10ZXJtaW5hbCBncmFtbWFyIHN5bWJvbHMgZHVyaW5nIHBhcnNpbmcuCisjIEl0IG5vcm1hbGx5IGhhcyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgc2V0OgorIyAgICAgICAgLnR5cGUgICAgICAgPSBHcmFtbWFyIHN5bWJvbCB0eXBlCisjICAgICAgICAudmFsdWUgICAgICA9IFN5bWJvbCB2YWx1ZQorIyAgICAgICAgLmxpbmVubyAgICAgPSBTdGFydGluZyBsaW5lIG51bWJlcgorIyAgICAgICAgLmVuZGxpbmVubyAgPSBFbmRpbmcgbGluZSBudW1iZXIgKG9wdGlvbmFsLCBzZXQgYXV0b21hdGljYWxseSkKKyMgICAgICAgIC5sZXhwb3MgICAgID0gU3RhcnRpbmcgbGV4IHBvc2l0aW9uCisjICAgICAgICAuZW5kbGV4cG9zICA9IEVuZGluZyBsZXggcG9zaXRpb24gKG9wdGlvbmFsLCBzZXQgYXV0b21hdGljYWxseSkKKworY2xhc3MgWWFjY1N5bWJvbDoKKyAgICBkZWYgX19zdHJfXyhzZWxmKTogICAgcmV0dXJuIHNlbGYudHlwZQorICAgIGRlZiBfX3JlcHJfXyhzZWxmKTogICByZXR1cm4gc3RyKHNlbGYpCisKKyMgVGhpcyBjbGFzcyBpcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBvYmplY3RzIGFjdHVhbGx5IHBhc3NlZCB0byBlYWNoCisjIGdyYW1tYXIgcnVsZS4gICBJbmRleCBsb29rdXAgYW5kIGFzc2lnbm1lbnQgYWN0dWFsbHkgYXNzaWduIHRoZQorIyAudmFsdWUgYXR0cmlidXRlIG9mIHRoZSB1bmRlcmx5aW5nIFlhY2NTeW1ib2wgb2JqZWN0LgorIyBUaGUgbGluZW5vKCkgbWV0aG9kIHJldHVybnMgdGhlIGxpbmUgbnVtYmVyIG9mIGEgZ2l2ZW4KKyMgaXRlbSAob3IgMCBpZiBub3QgZGVmaW5lZCkuICAgVGhlIGxpbmVzcGFuKCkgbWV0aG9kIHJldHVybnMKKyMgYSB0dXBsZSBvZiAoc3RhcnRsaW5lLGVuZGxpbmUpIHJlcHJlc2VudGluZyB0aGUgcmFuZ2Ugb2YgbGluZXMKKyMgZm9yIGEgc3ltYm9sLiAgVGhlIGxleHNwYW4oKSBtZXRob2QgcmV0dXJucyBhIHR1cGxlIChsZXhwb3MsZW5kbGV4cG9zKQorIyByZXByZXNlbnRpbmcgdGhlIHJhbmdlIG9mIHBvc2l0aW9uYWwgaW5mb3JtYXRpb24gZm9yIGEgc3ltYm9sLgorCitjbGFzcyBZYWNjUHJvZHVjdGlvbjoKKyAgICBkZWYgX19pbml0X18oc2VsZixzLHN0YWNrPU5vbmUpOgorICAgICAgICBzZWxmLnNsaWNlID0gcworICAgICAgICBzZWxmLnN0YWNrID0gc3RhY2sKKyAgICAgICAgc2VsZi5sZXhlciA9IE5vbmUKKyAgICAgICAgc2VsZi5wYXJzZXI9IE5vbmUKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZixuKToKKyAgICAgICAgaWYgbiA+PSAwOiByZXR1cm4gc2VsZi5zbGljZVtuXS52YWx1ZQorICAgICAgICBlbHNlOiByZXR1cm4gc2VsZi5zdGFja1tuXS52YWx1ZQorCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsbix2KToKKyAgICAgICAgc2VsZi5zbGljZVtuXS52YWx1ZSA9IHYKKworICAgIGRlZiBfX2dldHNsaWNlX18oc2VsZixpLGopOgorICAgICAgICByZXR1cm4gW3MudmFsdWUgZm9yIHMgaW4gc2VsZi5zbGljZVtpOmpdXQorCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiBsZW4oc2VsZi5zbGljZSkKKworICAgIGRlZiBsaW5lbm8oc2VsZixuKToKKyAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5zbGljZVtuXSwibGluZW5vIiwwKQorCisgICAgZGVmIHNldF9saW5lbm8oc2VsZixuLGxpbmVubyk6CisgICAgICAgIHNlbGYuc2xpY2Vbbl0ubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgbGluZXNwYW4oc2VsZixuKToKKyAgICAgICAgc3RhcnRsaW5lID0gZ2V0YXR0cihzZWxmLnNsaWNlW25dLCJsaW5lbm8iLDApCisgICAgICAgIGVuZGxpbmUgPSBnZXRhdHRyKHNlbGYuc2xpY2Vbbl0sImVuZGxpbmVubyIsc3RhcnRsaW5lKQorICAgICAgICByZXR1cm4gc3RhcnRsaW5lLGVuZGxpbmUKKworICAgIGRlZiBsZXhwb3Moc2VsZixuKToKKyAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5zbGljZVtuXSwibGV4cG9zIiwwKQorCisgICAgZGVmIGxleHNwYW4oc2VsZixuKToKKyAgICAgICAgc3RhcnRwb3MgPSBnZXRhdHRyKHNlbGYuc2xpY2Vbbl0sImxleHBvcyIsMCkKKyAgICAgICAgZW5kcG9zID0gZ2V0YXR0cihzZWxmLnNsaWNlW25dLCJlbmRsZXhwb3MiLHN0YXJ0cG9zKQorICAgICAgICByZXR1cm4gc3RhcnRwb3MsZW5kcG9zCisKKyAgICBkZWYgZXJyb3Ioc2VsZik6CisgICAgICAgcmFpc2UgU3ludGF4RXJyb3IKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IExSUGFyc2VyID09CisjCisjIFRoZSBMUiBQYXJzaW5nIGVuZ2luZS4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgTFJQYXJzZXI6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsbHJ0YWIsZXJyb3JmKToKKyAgICAgICAgc2VsZi5wcm9kdWN0aW9ucyA9IGxydGFiLmxyX3Byb2R1Y3Rpb25zCisgICAgICAgIHNlbGYuYWN0aW9uICAgICAgPSBscnRhYi5scl9hY3Rpb24KKyAgICAgICAgc2VsZi5nb3RvICAgICAgICA9IGxydGFiLmxyX2dvdG8KKyAgICAgICAgc2VsZi5lcnJvcmZ1bmMgICA9IGVycm9yZgorCisgICAgZGVmIGVycm9rKHNlbGYpOgorICAgICAgICBzZWxmLmVycm9yb2sgICAgID0gMQorCisgICAgZGVmIHJlc3RhcnQoc2VsZik6CisgICAgICAgIGRlbCBzZWxmLnN0YXRlc3RhY2tbOl0KKyAgICAgICAgZGVsIHNlbGYuc3ltc3RhY2tbOl0KKyAgICAgICAgc3ltID0gWWFjY1N5bWJvbCgpCisgICAgICAgIHN5bS50eXBlID0gJyRlbmQnCisgICAgICAgIHNlbGYuc3ltc3RhY2suYXBwZW5kKHN5bSkKKyAgICAgICAgc2VsZi5zdGF0ZXN0YWNrLmFwcGVuZCgwKQorCisgICAgZGVmIHBhcnNlKHNlbGYsaW5wdXQ9Tm9uZSxsZXhlcj1Ob25lLGRlYnVnPTAsdHJhY2tpbmc9MCx0b2tlbmZ1bmM9Tm9uZSk6CisgICAgICAgIGlmIGRlYnVnIG9yIHlhY2NkZXZlbDoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZGVidWcsaW50KToKKyAgICAgICAgICAgICAgICBkZWJ1ZyA9IFBseUxvZ2dlcihzeXMuc3RkZXJyKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VkZWJ1ZyhpbnB1dCxsZXhlcixkZWJ1Zyx0cmFja2luZyx0b2tlbmZ1bmMpCisgICAgICAgIGVsaWYgdHJhY2tpbmc6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZW9wdChpbnB1dCxsZXhlcixkZWJ1Zyx0cmFja2luZyx0b2tlbmZ1bmMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZW9wdF9ub3RyYWNrKGlucHV0LGxleGVyLGRlYnVnLHRyYWNraW5nLHRva2VuZnVuYykKKyAgICAgICAgCisKKyAgICAjICEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCisgICAgIyBwYXJzZWRlYnVnKCkuCisgICAgIworICAgICMgVGhpcyBpcyB0aGUgZGVidWdnaW5nIGVuYWJsZWQgdmVyc2lvbiBvZiBwYXJzZSgpLiAgQWxsIGNoYW5nZXMgbWFkZSB0byB0aGUKKyAgICAjIHBhcnNpbmcgZW5naW5lIHNob3VsZCBiZSBtYWRlIGhlcmUuICAgRm9yIHRoZSBub24tZGVidWdnaW5nIHZlcnNpb24sCisgICAgIyBjb3B5IHRoaXMgY29kZSB0byBhIG1ldGhvZCBwYXJzZW9wdCgpIGFuZCBkZWxldGUgYWxsIG9mIHRoZSBzZWN0aW9ucworICAgICMgZW5jbG9zZWQgaW46CisgICAgIworICAgICMgICAgICAjLS0hIERFQlVHCisgICAgIyAgICAgIHN0YXRlbWVudHMKKyAgICAjICAgICAgIy0tISBERUJVRworICAgICMKKyAgICAjICEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCisKKyAgICBkZWYgcGFyc2VkZWJ1ZyhzZWxmLGlucHV0PU5vbmUsbGV4ZXI9Tm9uZSxkZWJ1Zz1Ob25lLHRyYWNraW5nPTAsdG9rZW5mdW5jPU5vbmUpOgorICAgICAgICBsb29rYWhlYWQgPSBOb25lICAgICAgICAgICAgICAgICAjIEN1cnJlbnQgbG9va2FoZWFkIHN5bWJvbAorICAgICAgICBsb29rYWhlYWRzdGFjayA9IFsgXSAgICAgICAgICAgICAjIFN0YWNrIG9mIGxvb2thaGVhZCBzeW1ib2xzCisgICAgICAgIGFjdGlvbnMgPSBzZWxmLmFjdGlvbiAgICAgICAgICAgICMgTG9jYWwgcmVmZXJlbmNlIHRvIGFjdGlvbiB0YWJsZSAodG8gYXZvaWQgbG9va3VwIG9uIHNlbGYuKQorICAgICAgICBnb3RvICAgID0gc2VsZi5nb3RvICAgICAgICAgICAgICAjIExvY2FsIHJlZmVyZW5jZSB0byBnb3RvIHRhYmxlICh0byBhdm9pZCBsb29rdXAgb24gc2VsZi4pCisgICAgICAgIHByb2QgICAgPSBzZWxmLnByb2R1Y3Rpb25zICAgICAgICMgTG9jYWwgcmVmZXJlbmNlIHRvIHByb2R1Y3Rpb24gbGlzdCAodG8gYXZvaWQgbG9va3VwIG9uIHNlbGYuKQorICAgICAgICBwc2xpY2UgID0gWWFjY1Byb2R1Y3Rpb24oTm9uZSkgICAjIFByb2R1Y3Rpb24gb2JqZWN0IHBhc3NlZCB0byBncmFtbWFyIHJ1bGVzCisgICAgICAgIGVycm9yY291bnQgPSAwICAgICAgICAgICAgICAgICAgICMgVXNlZCBkdXJpbmcgZXJyb3IgcmVjb3ZlcnkgCisKKyAgICAgICAgIyAtLSEgREVCVUcKKyAgICAgICAgZGVidWcuaW5mbygiUExZOiBQQVJTRSBERUJVRyBTVEFSVCIpCisgICAgICAgICMgLS0hIERFQlVHCisKKyAgICAgICAgIyBJZiBubyBsZXhlciB3YXMgZ2l2ZW4sIHdlIHdpbGwgdHJ5IHRvIHVzZSB0aGUgbGV4IG1vZHVsZQorICAgICAgICBpZiBub3QgbGV4ZXI6CisgICAgICAgICAgICBsZXggPSBsb2FkX3BseV9sZXgoKQorICAgICAgICAgICAgbGV4ZXIgPSBsZXgubGV4ZXIKKworICAgICAgICAjIFNldCB1cCB0aGUgbGV4ZXIgYW5kIHBhcnNlciBvYmplY3RzIG9uIHBzbGljZQorICAgICAgICBwc2xpY2UubGV4ZXIgPSBsZXhlcgorICAgICAgICBwc2xpY2UucGFyc2VyID0gc2VsZgorCisgICAgICAgICMgSWYgaW5wdXQgd2FzIHN1cHBsaWVkLCBwYXNzIHRvIGxleGVyCisgICAgICAgIGlmIGlucHV0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbGV4ZXIuaW5wdXQoaW5wdXQpCisKKyAgICAgICAgaWYgdG9rZW5mdW5jIGlzIE5vbmU6CisgICAgICAgICAgICMgVG9rZW5pemUgZnVuY3Rpb24KKyAgICAgICAgICAgZ2V0X3Rva2VuID0gbGV4ZXIudG9rZW4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgZ2V0X3Rva2VuID0gdG9rZW5mdW5jCisKKyAgICAgICAgIyBTZXQgdXAgdGhlIHN0YXRlIGFuZCBzeW1ib2wgc3RhY2tzCisKKyAgICAgICAgc3RhdGVzdGFjayA9IFsgXSAgICAgICAgICAgICAgICAjIFN0YWNrIG9mIHBhcnNpbmcgc3RhdGVzCisgICAgICAgIHNlbGYuc3RhdGVzdGFjayA9IHN0YXRlc3RhY2sKKyAgICAgICAgc3ltc3RhY2sgICA9IFsgXSAgICAgICAgICAgICAgICAjIFN0YWNrIG9mIGdyYW1tYXIgc3ltYm9scworICAgICAgICBzZWxmLnN5bXN0YWNrID0gc3ltc3RhY2sKKworICAgICAgICBwc2xpY2Uuc3RhY2sgPSBzeW1zdGFjayAgICAgICAgICMgUHV0IGluIHRoZSBwcm9kdWN0aW9uCisgICAgICAgIGVycnRva2VuICAgPSBOb25lICAgICAgICAgICAgICAgIyBFcnIgdG9rZW4KKworICAgICAgICAjIFRoZSBzdGFydCBzdGF0ZSBpcyBhc3N1bWVkIHRvIGJlICgwLCRlbmQpCisKKyAgICAgICAgc3RhdGVzdGFjay5hcHBlbmQoMCkKKyAgICAgICAgc3ltID0gWWFjY1N5bWJvbCgpCisgICAgICAgIHN5bS50eXBlID0gIiRlbmQiCisgICAgICAgIHN5bXN0YWNrLmFwcGVuZChzeW0pCisgICAgICAgIHN0YXRlID0gMAorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgIyBHZXQgdGhlIG5leHQgc3ltYm9sIG9uIHRoZSBpbnB1dC4gIElmIGEgbG9va2FoZWFkIHN5bWJvbAorICAgICAgICAgICAgIyBpcyBhbHJlYWR5IHNldCwgd2UganVzdCB1c2UgdGhhdC4gT3RoZXJ3aXNlLCB3ZSdsbCBwdWxsCisgICAgICAgICAgICAjIHRoZSBuZXh0IHRva2VuIG9mZiBvZiB0aGUgbG9va2FoZWFkc3RhY2sgb3IgZnJvbSB0aGUgbGV4ZXIKKworICAgICAgICAgICAgIyAtLSEgREVCVUcKKyAgICAgICAgICAgIGRlYnVnLmRlYnVnKCcnKQorICAgICAgICAgICAgZGVidWcuZGVidWcoJ1N0YXRlICA6ICVzJywgc3RhdGUpCisgICAgICAgICAgICAjIC0tISBERUJVRworCisgICAgICAgICAgICBpZiBub3QgbG9va2FoZWFkOgorICAgICAgICAgICAgICAgIGlmIG5vdCBsb29rYWhlYWRzdGFjazoKKyAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkID0gZ2V0X3Rva2VuKCkgICAgICMgR2V0IHRoZSBuZXh0IHRva2VuCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkID0gbG9va2FoZWFkc3RhY2sucG9wKCkKKyAgICAgICAgICAgICAgICBpZiBub3QgbG9va2FoZWFkOgorICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWQgPSBZYWNjU3ltYm9sKCkKKyAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkLnR5cGUgPSAiJGVuZCIKKworICAgICAgICAgICAgIyAtLSEgREVCVUcKKyAgICAgICAgICAgIGRlYnVnLmRlYnVnKCdTdGFjayAgOiAlcycsCisgICAgICAgICAgICAgICAgICAgICAgICAoIiVzIC4gJXMiICUgKCIgIi5qb2luKFt4eC50eXBlIGZvciB4eCBpbiBzeW1zdGFja11bMTpdKSwgc3RyKGxvb2thaGVhZCkpKS5sc3RyaXAoKSkKKyAgICAgICAgICAgICMgLS0hIERFQlVHCisKKyAgICAgICAgICAgICMgQ2hlY2sgdGhlIGFjdGlvbiB0YWJsZQorICAgICAgICAgICAgbHR5cGUgPSBsb29rYWhlYWQudHlwZQorICAgICAgICAgICAgdCA9IGFjdGlvbnNbc3RhdGVdLmdldChsdHlwZSkKKworICAgICAgICAgICAgaWYgdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBpZiB0ID4gMDoKKyAgICAgICAgICAgICAgICAgICAgIyBzaGlmdCBhIHN5bWJvbCBvbiB0aGUgc3RhY2sKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVzdGFjay5hcHBlbmQodCkKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSB0CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAjIC0tISBERUJVRworICAgICAgICAgICAgICAgICAgICBkZWJ1Zy5kZWJ1ZygiQWN0aW9uIDogU2hpZnQgYW5kIGdvdG8gc3RhdGUgJXMiLCB0KQorICAgICAgICAgICAgICAgICAgICAjIC0tISBERUJVRworCisgICAgICAgICAgICAgICAgICAgIHN5bXN0YWNrLmFwcGVuZChsb29rYWhlYWQpCisgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IE5vbmUKKworICAgICAgICAgICAgICAgICAgICAjIERlY3JlYXNlIGVycm9yIGNvdW50IG9uIHN1Y2Nlc3NmdWwgc2hpZnQKKyAgICAgICAgICAgICAgICAgICAgaWYgZXJyb3Jjb3VudDogZXJyb3Jjb3VudCAtPTEKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIGlmIHQgPCAwOgorICAgICAgICAgICAgICAgICAgICAjIHJlZHVjZSBhIHN5bWJvbCBvbiB0aGUgc3RhY2ssIGVtaXQgYSBwcm9kdWN0aW9uCisgICAgICAgICAgICAgICAgICAgIHAgPSBwcm9kWy10XQorICAgICAgICAgICAgICAgICAgICBwbmFtZSA9IHAubmFtZQorICAgICAgICAgICAgICAgICAgICBwbGVuICA9IHAubGVuCisKKyAgICAgICAgICAgICAgICAgICAgIyBHZXQgcHJvZHVjdGlvbiBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICBzeW0gPSBZYWNjU3ltYm9sKCkKKyAgICAgICAgICAgICAgICAgICAgc3ltLnR5cGUgPSBwbmFtZSAgICAgICAjIFByb2R1Y3Rpb24gbmFtZQorICAgICAgICAgICAgICAgICAgICBzeW0udmFsdWUgPSBOb25lCisKKyAgICAgICAgICAgICAgICAgICAgIyAtLSEgREVCVUcKKyAgICAgICAgICAgICAgICAgICAgaWYgcGxlbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnLmluZm8oIkFjdGlvbiA6IFJlZHVjZSBydWxlIFslc10gd2l0aCAlcyBhbmQgZ290byBzdGF0ZSAlZCIsIHAuc3RyLCAiWyIrIiwiLmpvaW4oW2Zvcm1hdF9zdGFja19lbnRyeShfdi52YWx1ZSkgZm9yIF92IGluIHN5bXN0YWNrWy1wbGVuOl1dKSsiXSIsLXQpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Zy5pbmZvKCJBY3Rpb24gOiBSZWR1Y2UgcnVsZSBbJXNdIHdpdGggJXMgYW5kIGdvdG8gc3RhdGUgJWQiLCBwLnN0ciwgW10sLXQpCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgIyAtLSEgREVCVUcKKworICAgICAgICAgICAgICAgICAgICBpZiBwbGVuOgorICAgICAgICAgICAgICAgICAgICAgICAgdGFyZyA9IHN5bXN0YWNrWy1wbGVuLTE6XQorICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ1swXSA9IHN5bQorCisgICAgICAgICAgICAgICAgICAgICAgICAjIC0tISBUUkFDS0lORworICAgICAgICAgICAgICAgICAgICAgICAgaWYgdHJhY2tpbmc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICB0MSA9IHRhcmdbMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bS5saW5lbm8gPSB0MS5saW5lbm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bS5sZXhwb3MgPSB0MS5sZXhwb3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHQxID0gdGFyZ1stMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bS5lbmRsaW5lbm8gPSBnZXRhdHRyKHQxLCJlbmRsaW5lbm8iLHQxLmxpbmVubykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bS5lbmRsZXhwb3MgPSBnZXRhdHRyKHQxLCJlbmRsZXhwb3MiLHQxLmxleHBvcykKKworICAgICAgICAgICAgICAgICAgICAgICAgIyAtLSEgVFJBQ0tJTkcKKworICAgICAgICAgICAgICAgICAgICAgICAgIyAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQorICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgY29kZSBlbmNsb3NlZCBpbiB0aGlzIHNlY3Rpb24gaXMgZHVwbGljYXRlZCAKKyAgICAgICAgICAgICAgICAgICAgICAgICMgYmVsb3cgYXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uICBNYWtlIHN1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICMgY2hhbmdlcyBnZXQgbWFkZSBpbiBib3RoIGxvY2F0aW9ucy4KKworICAgICAgICAgICAgICAgICAgICAgICAgcHNsaWNlLnNsaWNlID0gdGFyZworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBDYWxsIHRoZSBncmFtbWFyIHJ1bGUgd2l0aCBvdXIgc3BlY2lhbCBzbGljZSBvYmplY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWwgc3ltc3RhY2tbLXBsZW46XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBzdGF0ZXN0YWNrWy1wbGVuOl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmNhbGxhYmxlKHBzbGljZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIC0tISBERUJVRworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnLmluZm8oIlJlc3VsdCA6ICVzIiwgZm9ybWF0X3Jlc3VsdChwc2xpY2VbMF0pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgLS0hIERFQlVHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltc3RhY2suYXBwZW5kKHN5bSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IGdvdG9bc3RhdGVzdGFja1stMV1dW3BuYW1lXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlc3RhY2suYXBwZW5kKHN0YXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgSWYgYW4gZXJyb3Igd2FzIHNldC4gRW50ZXIgZXJyb3IgcmVjb3Zlcnkgc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWRzdGFjay5hcHBlbmQobG9va2FoZWFkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bXN0YWNrLnBvcCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVzdGFjay5wb3AoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gc3RhdGVzdGFja1stMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW0udHlwZSA9ICdlcnJvcicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWQgPSBzeW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcmNvdW50ID0gZXJyb3JfY291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yb2sgPSAwCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgIyAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQorICAgIAorICAgICAgICAgICAgICAgICAgICBlbHNlOgorCisgICAgICAgICAgICAgICAgICAgICAgICAjIC0tISBUUkFDS0lORworICAgICAgICAgICAgICAgICAgICAgICAgaWYgdHJhY2tpbmc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW0ubGluZW5vID0gbGV4ZXIubGluZW5vCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW0ubGV4cG9zID0gbGV4ZXIubGV4cG9zCisgICAgICAgICAgICAgICAgICAgICAgICAjIC0tISBUUkFDS0lORworCisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnID0gWyBzeW0gXQorCisgICAgICAgICAgICAgICAgICAgICAgICAjICEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCisgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBjb2RlIGVuY2xvc2VkIGluIHRoaXMgc2VjdGlvbiBpcyBkdXBsaWNhdGVkIAorICAgICAgICAgICAgICAgICAgICAgICAgIyBhYm92ZSBhcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbi4gIE1ha2Ugc3VyZQorICAgICAgICAgICAgICAgICAgICAgICAgIyBjaGFuZ2VzIGdldCBtYWRlIGluIGJvdGggbG9jYXRpb25zLgorCisgICAgICAgICAgICAgICAgICAgICAgICBwc2xpY2Uuc2xpY2UgPSB0YXJnCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIENhbGwgdGhlIGdyYW1tYXIgcnVsZSB3aXRoIG91ciBzcGVjaWFsIHNsaWNlIG9iamVjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuY2FsbGFibGUocHNsaWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgLS0hIERFQlVHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcuaW5mbygiUmVzdWx0IDogJXMiLCBmb3JtYXRfcmVzdWx0KHBzbGljZVswXSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAtLSEgREVCVUcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1zdGFjay5hcHBlbmQoc3ltKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gZ290b1tzdGF0ZXN0YWNrWy0xXV1bcG5hbWVdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVzdGFjay5hcHBlbmQoc3RhdGUpCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgU3ludGF4RXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBJZiBhbiBlcnJvciB3YXMgc2V0LiBFbnRlciBlcnJvciByZWNvdmVyeSBzdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZHN0YWNrLmFwcGVuZChsb29rYWhlYWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltc3RhY2sucG9wKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZXN0YWNrLnBvcCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBzdGF0ZXN0YWNrWy0xXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bS50eXBlID0gJ2Vycm9yJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IHN5bQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yY291bnQgPSBlcnJvcl9jb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JvayA9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICAjICEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCisKKyAgICAgICAgICAgICAgICBpZiB0ID09IDA6CisgICAgICAgICAgICAgICAgICAgIG4gPSBzeW1zdGFja1stMV0KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZ2V0YXR0cihuLCJ2YWx1ZSIsTm9uZSkKKyAgICAgICAgICAgICAgICAgICAgIyAtLSEgREVCVUcKKyAgICAgICAgICAgICAgICAgICAgZGVidWcuaW5mbygiRG9uZSAgIDogUmV0dXJuaW5nICVzIiwgZm9ybWF0X3Jlc3VsdChyZXN1bHQpKQorICAgICAgICAgICAgICAgICAgICBkZWJ1Zy5pbmZvKCJQTFk6IFBBUlNFIERFQlVHIEVORCIpCisgICAgICAgICAgICAgICAgICAgICMgLS0hIERFQlVHCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQKKworICAgICAgICAgICAgaWYgdCA9PSBOb25lOgorCisgICAgICAgICAgICAgICAgIyAtLSEgREVCVUcKKyAgICAgICAgICAgICAgICBkZWJ1Zy5lcnJvcignRXJyb3IgIDogJXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiJXMgLiAlcyIgJSAoIiAiLmpvaW4oW3h4LnR5cGUgZm9yIHh4IGluIHN5bXN0YWNrXVsxOl0pLCBzdHIobG9va2FoZWFkKSkpLmxzdHJpcCgpKQorICAgICAgICAgICAgICAgICMgLS0hIERFQlVHCisKKyAgICAgICAgICAgICAgICAjIFdlIGhhdmUgc29tZSBraW5kIG9mIHBhcnNpbmcgZXJyb3IgaGVyZS4gIFRvIGhhbmRsZQorICAgICAgICAgICAgICAgICMgdGhpcywgd2UgYXJlIGdvaW5nIHRvIHB1c2ggdGhlIGN1cnJlbnQgdG9rZW4gb250bworICAgICAgICAgICAgICAgICMgdGhlIHRva2Vuc3RhY2sgYW5kIHJlcGxhY2UgaXQgd2l0aCBhbiAnZXJyb3InIHRva2VuLgorICAgICAgICAgICAgICAgICMgSWYgdGhlcmUgYXJlIGFueSBzeW5jaHJvbml6YXRpb24gcnVsZXMsIHRoZXkgbWF5CisgICAgICAgICAgICAgICAgIyBjYXRjaCBpdC4KKyAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgIyBJbiBhZGRpdGlvbiB0byBwdXNoaW5nIHRoZSBlcnJvciB0b2tlbiwgd2UgY2FsbCBjYWxsCisgICAgICAgICAgICAgICAgIyB0aGUgdXNlciBkZWZpbmVkIHBfZXJyb3IoKSBmdW5jdGlvbiBpZiB0aGlzIGlzIHRoZQorICAgICAgICAgICAgICAgICMgZmlyc3Qgc3ludGF4IGVycm9yLiAgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBpZgorICAgICAgICAgICAgICAgICMgZXJyb3Jjb3VudCA9PSAwLgorICAgICAgICAgICAgICAgIGlmIGVycm9yY291bnQgPT0gMCBvciBzZWxmLmVycm9yb2s6CisgICAgICAgICAgICAgICAgICAgIGVycm9yY291bnQgPSBlcnJvcl9jb3VudAorICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yb2sgPSAwCisgICAgICAgICAgICAgICAgICAgIGVycnRva2VuID0gbG9va2FoZWFkCisgICAgICAgICAgICAgICAgICAgIGlmIGVycnRva2VuLnR5cGUgPT0gIiRlbmQiOgorICAgICAgICAgICAgICAgICAgICAgICAgZXJydG9rZW4gPSBOb25lICAgICAgICAgICAgICAgIyBFbmQgb2YgZmlsZSEKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5lcnJvcmZ1bmM6CisgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWwgZXJyb2ssdG9rZW4scmVzdGFydAorICAgICAgICAgICAgICAgICAgICAgICAgZXJyb2sgPSBzZWxmLmVycm9rICAgICAgICAjIFNldCBzb21lIHNwZWNpYWwgZnVuY3Rpb25zIGF2YWlsYWJsZSBpbiBlcnJvciByZWNvdmVyeQorICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBnZXRfdG9rZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RhcnQgPSBzZWxmLnJlc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGVycnRva2VuIGFuZCBub3QgaGFzYXR0cihlcnJ0b2tlbiwnbGV4ZXInKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJ0b2tlbi5sZXhlciA9IGxleGVyCisgICAgICAgICAgICAgICAgICAgICAgICB0b2sgPSBzZWxmLmVycm9yZnVuYyhlcnJ0b2tlbikKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBlcnJvaywgdG9rZW4sIHJlc3RhcnQgICAjIERlbGV0ZSBzcGVjaWFsIGZ1bmN0aW9ucworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmVycm9yb2s6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBVc2VyIG11c3QgaGF2ZSBkb25lIHNvbWUga2luZCBvZiBwYW5pYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbW9kZSByZWNvdmVyeSBvbiB0aGVpciBvd24uICBUaGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJldHVybmVkIHRva2VuIGlzIHRoZSBuZXh0IGxvb2thaGVhZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IHRvaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycnRva2VuID0gTm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBlcnJ0b2tlbjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKGVycnRva2VuLCJsaW5lbm8iKTogbGluZW5vID0gbG9va2FoZWFkLmxpbmVubworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6IGxpbmVubyA9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBsaW5lbm86CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoInlhY2M6IFN5bnRheCBlcnJvciBhdCBsaW5lICVkLCB0b2tlbj0lc1xuIiAlIChsaW5lbm8sIGVycnRva2VuLnR5cGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoInlhY2M6IFN5bnRheCBlcnJvciwgdG9rZW49JXMiICUgZXJydG9rZW4udHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgieWFjYzogUGFyc2UgZXJyb3IgaW4gaW5wdXQuIEVPRlxuIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGVycm9yY291bnQgPSBlcnJvcl9jb3VudAorCisgICAgICAgICAgICAgICAgIyBjYXNlIDE6ICB0aGUgc3RhdGVzdGFjayBvbmx5IGhhcyAxIGVudHJ5IG9uIGl0LiAgSWYgd2UncmUgaW4gdGhpcyBzdGF0ZSwgdGhlCisgICAgICAgICAgICAgICAgIyBlbnRpcmUgcGFyc2UgaGFzIGJlZW4gcm9sbGVkIGJhY2sgYW5kIHdlJ3JlIGNvbXBsZXRlbHkgaG9zZWQuICAgVGhlIHRva2VuIGlzCisgICAgICAgICAgICAgICAgIyBkaXNjYXJkZWQgYW5kIHdlIGp1c3Qga2VlcCBnb2luZy4KKworICAgICAgICAgICAgICAgIGlmIGxlbihzdGF0ZXN0YWNrKSA8PSAxIGFuZCBsb29rYWhlYWQudHlwZSAhPSAiJGVuZCI6CisgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgZXJydG9rZW4gPSBOb25lCisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMAorICAgICAgICAgICAgICAgICAgICAjIE51a2UgdGhlIHB1c2hiYWNrIHN0YWNrCisgICAgICAgICAgICAgICAgICAgIGRlbCBsb29rYWhlYWRzdGFja1s6XQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgIyBjYXNlIDI6IHRoZSBzdGF0ZXN0YWNrIGhhcyBhIGNvdXBsZSBvZiBlbnRyaWVzIG9uIGl0LCBidXQgd2UncmUKKyAgICAgICAgICAgICAgICAjIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuIG51a2UgdGhlIHRvcCBlbnRyeSBhbmQgZ2VuZXJhdGUgYW4gZXJyb3IgdG9rZW4KKworICAgICAgICAgICAgICAgICMgU3RhcnQgbnVraW5nIGVudHJpZXMgb24gdGhlIHN0YWNrCisgICAgICAgICAgICAgICAgaWYgbG9va2FoZWFkLnR5cGUgPT0gIiRlbmQiOgorICAgICAgICAgICAgICAgICAgICAjIFdob2EuIFdlJ3JlIHJlYWxseSBob3NlZCBoZXJlLiBCYWlsIG91dAorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAgICAgICAgIGlmIGxvb2thaGVhZC50eXBlICE9ICdlcnJvcic6CisgICAgICAgICAgICAgICAgICAgIHN5bSA9IHN5bXN0YWNrWy0xXQorICAgICAgICAgICAgICAgICAgICBpZiBzeW0udHlwZSA9PSAnZXJyb3InOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBIbW1tLiBFcnJvciBpcyBvbiB0b3Agb2Ygc3RhY2ssIHdlJ2xsIGp1c3QgbnVrZSBpbnB1dAorICAgICAgICAgICAgICAgICAgICAgICAgIyBzeW1ib2wgYW5kIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWQgPSBOb25lCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICB0ID0gWWFjY1N5bWJvbCgpCisgICAgICAgICAgICAgICAgICAgIHQudHlwZSA9ICdlcnJvcicKKyAgICAgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihsb29rYWhlYWQsImxpbmVubyIpOgorICAgICAgICAgICAgICAgICAgICAgICAgdC5saW5lbm8gPSBsb29rYWhlYWQubGluZW5vCisgICAgICAgICAgICAgICAgICAgIHQudmFsdWUgPSBsb29rYWhlYWQKKyAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkc3RhY2suYXBwZW5kKGxvb2thaGVhZCkKKyAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkID0gdAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHN5bXN0YWNrLnBvcCgpCisgICAgICAgICAgICAgICAgICAgIHN0YXRlc3RhY2sucG9wKCkKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBzdGF0ZXN0YWNrWy0xXSAgICAgICAjIFBvdGVudGlhbCBidWcgZml4CisKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAjIENhbGwgYW4gZXJyb3IgZnVuY3Rpb24gaGVyZQorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJ5YWNjOiBpbnRlcm5hbCBwYXJzZXIgZXJyb3IhISFcbiIpCisKKyAgICAjICEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCisgICAgIyBwYXJzZW9wdCgpLgorICAgICMKKyAgICAjIE9wdGltaXplZCB2ZXJzaW9uIG9mIHBhcnNlKCkgbWV0aG9kLiAgRE8gTk9UIEVESVQgVEhJUyBDT0RFIERJUkVDVExZLgorICAgICMgRWRpdCB0aGUgZGVidWcgdmVyc2lvbiBhYm92ZSwgdGhlbiBjb3B5IGFueSBtb2RpZmljYXRpb25zIHRvIHRoZSBtZXRob2QKKyAgICAjIGJlbG93IHdoaWxlIHJlbW92aW5nICMtLSEgREVCVUcgc2VjdGlvbnMuCisgICAgIyAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQorCisKKyAgICBkZWYgcGFyc2VvcHQoc2VsZixpbnB1dD1Ob25lLGxleGVyPU5vbmUsZGVidWc9MCx0cmFja2luZz0wLHRva2VuZnVuYz1Ob25lKToKKyAgICAgICAgbG9va2FoZWFkID0gTm9uZSAgICAgICAgICAgICAgICAgIyBDdXJyZW50IGxvb2thaGVhZCBzeW1ib2wKKyAgICAgICAgbG9va2FoZWFkc3RhY2sgPSBbIF0gICAgICAgICAgICAgIyBTdGFjayBvZiBsb29rYWhlYWQgc3ltYm9scworICAgICAgICBhY3Rpb25zID0gc2VsZi5hY3Rpb24gICAgICAgICAgICAjIExvY2FsIHJlZmVyZW5jZSB0byBhY3Rpb24gdGFibGUgKHRvIGF2b2lkIGxvb2t1cCBvbiBzZWxmLikKKyAgICAgICAgZ290byAgICA9IHNlbGYuZ290byAgICAgICAgICAgICAgIyBMb2NhbCByZWZlcmVuY2UgdG8gZ290byB0YWJsZSAodG8gYXZvaWQgbG9va3VwIG9uIHNlbGYuKQorICAgICAgICBwcm9kICAgID0gc2VsZi5wcm9kdWN0aW9ucyAgICAgICAjIExvY2FsIHJlZmVyZW5jZSB0byBwcm9kdWN0aW9uIGxpc3QgKHRvIGF2b2lkIGxvb2t1cCBvbiBzZWxmLikKKyAgICAgICAgcHNsaWNlICA9IFlhY2NQcm9kdWN0aW9uKE5vbmUpICAgIyBQcm9kdWN0aW9uIG9iamVjdCBwYXNzZWQgdG8gZ3JhbW1hciBydWxlcworICAgICAgICBlcnJvcmNvdW50ID0gMCAgICAgICAgICAgICAgICAgICAjIFVzZWQgZHVyaW5nIGVycm9yIHJlY292ZXJ5IAorCisgICAgICAgICMgSWYgbm8gbGV4ZXIgd2FzIGdpdmVuLCB3ZSB3aWxsIHRyeSB0byB1c2UgdGhlIGxleCBtb2R1bGUKKyAgICAgICAgaWYgbm90IGxleGVyOgorICAgICAgICAgICAgbGV4ID0gbG9hZF9wbHlfbGV4KCkKKyAgICAgICAgICAgIGxleGVyID0gbGV4LmxleGVyCisgICAgICAgIAorICAgICAgICAjIFNldCB1cCB0aGUgbGV4ZXIgYW5kIHBhcnNlciBvYmplY3RzIG9uIHBzbGljZQorICAgICAgICBwc2xpY2UubGV4ZXIgPSBsZXhlcgorICAgICAgICBwc2xpY2UucGFyc2VyID0gc2VsZgorCisgICAgICAgICMgSWYgaW5wdXQgd2FzIHN1cHBsaWVkLCBwYXNzIHRvIGxleGVyCisgICAgICAgIGlmIGlucHV0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbGV4ZXIuaW5wdXQoaW5wdXQpCisKKyAgICAgICAgaWYgdG9rZW5mdW5jIGlzIE5vbmU6CisgICAgICAgICAgICMgVG9rZW5pemUgZnVuY3Rpb24KKyAgICAgICAgICAgZ2V0X3Rva2VuID0gbGV4ZXIudG9rZW4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgZ2V0X3Rva2VuID0gdG9rZW5mdW5jCisKKyAgICAgICAgIyBTZXQgdXAgdGhlIHN0YXRlIGFuZCBzeW1ib2wgc3RhY2tzCisKKyAgICAgICAgc3RhdGVzdGFjayA9IFsgXSAgICAgICAgICAgICAgICAjIFN0YWNrIG9mIHBhcnNpbmcgc3RhdGVzCisgICAgICAgIHNlbGYuc3RhdGVzdGFjayA9IHN0YXRlc3RhY2sKKyAgICAgICAgc3ltc3RhY2sgICA9IFsgXSAgICAgICAgICAgICAgICAjIFN0YWNrIG9mIGdyYW1tYXIgc3ltYm9scworICAgICAgICBzZWxmLnN5bXN0YWNrID0gc3ltc3RhY2sKKworICAgICAgICBwc2xpY2Uuc3RhY2sgPSBzeW1zdGFjayAgICAgICAgICMgUHV0IGluIHRoZSBwcm9kdWN0aW9uCisgICAgICAgIGVycnRva2VuICAgPSBOb25lICAgICAgICAgICAgICAgIyBFcnIgdG9rZW4KKworICAgICAgICAjIFRoZSBzdGFydCBzdGF0ZSBpcyBhc3N1bWVkIHRvIGJlICgwLCRlbmQpCisKKyAgICAgICAgc3RhdGVzdGFjay5hcHBlbmQoMCkKKyAgICAgICAgc3ltID0gWWFjY1N5bWJvbCgpCisgICAgICAgIHN5bS50eXBlID0gJyRlbmQnCisgICAgICAgIHN5bXN0YWNrLmFwcGVuZChzeW0pCisgICAgICAgIHN0YXRlID0gMAorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgIyBHZXQgdGhlIG5leHQgc3ltYm9sIG9uIHRoZSBpbnB1dC4gIElmIGEgbG9va2FoZWFkIHN5bWJvbAorICAgICAgICAgICAgIyBpcyBhbHJlYWR5IHNldCwgd2UganVzdCB1c2UgdGhhdC4gT3RoZXJ3aXNlLCB3ZSdsbCBwdWxsCisgICAgICAgICAgICAjIHRoZSBuZXh0IHRva2VuIG9mZiBvZiB0aGUgbG9va2FoZWFkc3RhY2sgb3IgZnJvbSB0aGUgbGV4ZXIKKworICAgICAgICAgICAgaWYgbm90IGxvb2thaGVhZDoKKyAgICAgICAgICAgICAgICBpZiBub3QgbG9va2FoZWFkc3RhY2s6CisgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IGdldF90b2tlbigpICAgICAjIEdldCB0aGUgbmV4dCB0b2tlbgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IGxvb2thaGVhZHN0YWNrLnBvcCgpCisgICAgICAgICAgICAgICAgaWYgbm90IGxvb2thaGVhZDoKKyAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkID0gWWFjY1N5bWJvbCgpCisgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZC50eXBlID0gJyRlbmQnCisKKyAgICAgICAgICAgICMgQ2hlY2sgdGhlIGFjdGlvbiB0YWJsZQorICAgICAgICAgICAgbHR5cGUgPSBsb29rYWhlYWQudHlwZQorICAgICAgICAgICAgdCA9IGFjdGlvbnNbc3RhdGVdLmdldChsdHlwZSkKKworICAgICAgICAgICAgaWYgdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBpZiB0ID4gMDoKKyAgICAgICAgICAgICAgICAgICAgIyBzaGlmdCBhIHN5bWJvbCBvbiB0aGUgc3RhY2sKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVzdGFjay5hcHBlbmQodCkKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSB0CisKKyAgICAgICAgICAgICAgICAgICAgc3ltc3RhY2suYXBwZW5kKGxvb2thaGVhZCkKKyAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkID0gTm9uZQorCisgICAgICAgICAgICAgICAgICAgICMgRGVjcmVhc2UgZXJyb3IgY291bnQgb24gc3VjY2Vzc2Z1bCBzaGlmdAorICAgICAgICAgICAgICAgICAgICBpZiBlcnJvcmNvdW50OiBlcnJvcmNvdW50IC09MQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgaWYgdCA8IDA6CisgICAgICAgICAgICAgICAgICAgICMgcmVkdWNlIGEgc3ltYm9sIG9uIHRoZSBzdGFjaywgZW1pdCBhIHByb2R1Y3Rpb24KKyAgICAgICAgICAgICAgICAgICAgcCA9IHByb2RbLXRdCisgICAgICAgICAgICAgICAgICAgIHBuYW1lID0gcC5uYW1lCisgICAgICAgICAgICAgICAgICAgIHBsZW4gID0gcC5sZW4KKworICAgICAgICAgICAgICAgICAgICAjIEdldCBwcm9kdWN0aW9uIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgIHN5bSA9IFlhY2NTeW1ib2woKQorICAgICAgICAgICAgICAgICAgICBzeW0udHlwZSA9IHBuYW1lICAgICAgICMgUHJvZHVjdGlvbiBuYW1lCisgICAgICAgICAgICAgICAgICAgIHN5bS52YWx1ZSA9IE5vbmUKKworICAgICAgICAgICAgICAgICAgICBpZiBwbGVuOgorICAgICAgICAgICAgICAgICAgICAgICAgdGFyZyA9IHN5bXN0YWNrWy1wbGVuLTE6XQorICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ1swXSA9IHN5bQorCisgICAgICAgICAgICAgICAgICAgICAgICAjIC0tISBUUkFDS0lORworICAgICAgICAgICAgICAgICAgICAgICAgaWYgdHJhY2tpbmc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICB0MSA9IHRhcmdbMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bS5saW5lbm8gPSB0MS5saW5lbm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bS5sZXhwb3MgPSB0MS5sZXhwb3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHQxID0gdGFyZ1stMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bS5lbmRsaW5lbm8gPSBnZXRhdHRyKHQxLCJlbmRsaW5lbm8iLHQxLmxpbmVubykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bS5lbmRsZXhwb3MgPSBnZXRhdHRyKHQxLCJlbmRsZXhwb3MiLHQxLmxleHBvcykKKworICAgICAgICAgICAgICAgICAgICAgICAgIyAtLSEgVFJBQ0tJTkcKKworICAgICAgICAgICAgICAgICAgICAgICAgIyAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQorICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgY29kZSBlbmNsb3NlZCBpbiB0aGlzIHNlY3Rpb24gaXMgZHVwbGljYXRlZCAKKyAgICAgICAgICAgICAgICAgICAgICAgICMgYmVsb3cgYXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uICBNYWtlIHN1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICMgY2hhbmdlcyBnZXQgbWFkZSBpbiBib3RoIGxvY2F0aW9ucy4KKworICAgICAgICAgICAgICAgICAgICAgICAgcHNsaWNlLnNsaWNlID0gdGFyZworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBDYWxsIHRoZSBncmFtbWFyIHJ1bGUgd2l0aCBvdXIgc3BlY2lhbCBzbGljZSBvYmplY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWwgc3ltc3RhY2tbLXBsZW46XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBzdGF0ZXN0YWNrWy1wbGVuOl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmNhbGxhYmxlKHBzbGljZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1zdGFjay5hcHBlbmQoc3ltKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gZ290b1tzdGF0ZXN0YWNrWy0xXV1bcG5hbWVdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVzdGFjay5hcHBlbmQoc3RhdGUpCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgU3ludGF4RXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBJZiBhbiBlcnJvciB3YXMgc2V0LiBFbnRlciBlcnJvciByZWNvdmVyeSBzdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZHN0YWNrLmFwcGVuZChsb29rYWhlYWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltc3RhY2sucG9wKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZXN0YWNrLnBvcCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBzdGF0ZXN0YWNrWy0xXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bS50eXBlID0gJ2Vycm9yJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IHN5bQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yY291bnQgPSBlcnJvcl9jb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JvayA9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICAjICEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCisgICAgCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisKKyAgICAgICAgICAgICAgICAgICAgICAgICMgLS0hIFRSQUNLSU5HCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0cmFja2luZzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bS5saW5lbm8gPSBsZXhlci5saW5lbm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bS5sZXhwb3MgPSBsZXhlci5sZXhwb3MKKyAgICAgICAgICAgICAgICAgICAgICAgICMgLS0hIFRSQUNLSU5HCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmcgPSBbIHN5bSBdCisKKyAgICAgICAgICAgICAgICAgICAgICAgICMgISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIGNvZGUgZW5jbG9zZWQgaW4gdGhpcyBzZWN0aW9uIGlzIGR1cGxpY2F0ZWQgCisgICAgICAgICAgICAgICAgICAgICAgICAjIGFib3ZlIGFzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLiAgTWFrZSBzdXJlCisgICAgICAgICAgICAgICAgICAgICAgICAjIGNoYW5nZXMgZ2V0IG1hZGUgaW4gYm90aCBsb2NhdGlvbnMuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHBzbGljZS5zbGljZSA9IHRhcmcKKworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQ2FsbCB0aGUgZ3JhbW1hciBydWxlIHdpdGggb3VyIHNwZWNpYWwgc2xpY2Ugb2JqZWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5jYWxsYWJsZShwc2xpY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltc3RhY2suYXBwZW5kKHN5bSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IGdvdG9bc3RhdGVzdGFja1stMV1dW3BuYW1lXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlc3RhY2suYXBwZW5kKHN0YXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgSWYgYW4gZXJyb3Igd2FzIHNldC4gRW50ZXIgZXJyb3IgcmVjb3Zlcnkgc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWRzdGFjay5hcHBlbmQobG9va2FoZWFkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bXN0YWNrLnBvcCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVzdGFjay5wb3AoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gc3RhdGVzdGFja1stMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW0udHlwZSA9ICdlcnJvcicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWQgPSBzeW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcmNvdW50ID0gZXJyb3JfY291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yb2sgPSAwCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgIyAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQorCisgICAgICAgICAgICAgICAgaWYgdCA9PSAwOgorICAgICAgICAgICAgICAgICAgICBuID0gc3ltc3RhY2tbLTFdCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRhdHRyKG4sInZhbHVlIixOb25lKQorCisgICAgICAgICAgICBpZiB0ID09IE5vbmU6CisKKyAgICAgICAgICAgICAgICAjIFdlIGhhdmUgc29tZSBraW5kIG9mIHBhcnNpbmcgZXJyb3IgaGVyZS4gIFRvIGhhbmRsZQorICAgICAgICAgICAgICAgICMgdGhpcywgd2UgYXJlIGdvaW5nIHRvIHB1c2ggdGhlIGN1cnJlbnQgdG9rZW4gb250bworICAgICAgICAgICAgICAgICMgdGhlIHRva2Vuc3RhY2sgYW5kIHJlcGxhY2UgaXQgd2l0aCBhbiAnZXJyb3InIHRva2VuLgorICAgICAgICAgICAgICAgICMgSWYgdGhlcmUgYXJlIGFueSBzeW5jaHJvbml6YXRpb24gcnVsZXMsIHRoZXkgbWF5CisgICAgICAgICAgICAgICAgIyBjYXRjaCBpdC4KKyAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgIyBJbiBhZGRpdGlvbiB0byBwdXNoaW5nIHRoZSBlcnJvciB0b2tlbiwgd2UgY2FsbCBjYWxsCisgICAgICAgICAgICAgICAgIyB0aGUgdXNlciBkZWZpbmVkIHBfZXJyb3IoKSBmdW5jdGlvbiBpZiB0aGlzIGlzIHRoZQorICAgICAgICAgICAgICAgICMgZmlyc3Qgc3ludGF4IGVycm9yLiAgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBpZgorICAgICAgICAgICAgICAgICMgZXJyb3Jjb3VudCA9PSAwLgorICAgICAgICAgICAgICAgIGlmIGVycm9yY291bnQgPT0gMCBvciBzZWxmLmVycm9yb2s6CisgICAgICAgICAgICAgICAgICAgIGVycm9yY291bnQgPSBlcnJvcl9jb3VudAorICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yb2sgPSAwCisgICAgICAgICAgICAgICAgICAgIGVycnRva2VuID0gbG9va2FoZWFkCisgICAgICAgICAgICAgICAgICAgIGlmIGVycnRva2VuLnR5cGUgPT0gJyRlbmQnOgorICAgICAgICAgICAgICAgICAgICAgICAgZXJydG9rZW4gPSBOb25lICAgICAgICAgICAgICAgIyBFbmQgb2YgZmlsZSEKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5lcnJvcmZ1bmM6CisgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWwgZXJyb2ssdG9rZW4scmVzdGFydAorICAgICAgICAgICAgICAgICAgICAgICAgZXJyb2sgPSBzZWxmLmVycm9rICAgICAgICAjIFNldCBzb21lIHNwZWNpYWwgZnVuY3Rpb25zIGF2YWlsYWJsZSBpbiBlcnJvciByZWNvdmVyeQorICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBnZXRfdG9rZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RhcnQgPSBzZWxmLnJlc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGVycnRva2VuIGFuZCBub3QgaGFzYXR0cihlcnJ0b2tlbiwnbGV4ZXInKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJ0b2tlbi5sZXhlciA9IGxleGVyCisgICAgICAgICAgICAgICAgICAgICAgICB0b2sgPSBzZWxmLmVycm9yZnVuYyhlcnJ0b2tlbikKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBlcnJvaywgdG9rZW4sIHJlc3RhcnQgICAjIERlbGV0ZSBzcGVjaWFsIGZ1bmN0aW9ucworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmVycm9yb2s6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBVc2VyIG11c3QgaGF2ZSBkb25lIHNvbWUga2luZCBvZiBwYW5pYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbW9kZSByZWNvdmVyeSBvbiB0aGVpciBvd24uICBUaGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJldHVybmVkIHRva2VuIGlzIHRoZSBuZXh0IGxvb2thaGVhZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IHRvaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycnRva2VuID0gTm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBlcnJ0b2tlbjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKGVycnRva2VuLCJsaW5lbm8iKTogbGluZW5vID0gbG9va2FoZWFkLmxpbmVubworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6IGxpbmVubyA9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBsaW5lbm86CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoInlhY2M6IFN5bnRheCBlcnJvciBhdCBsaW5lICVkLCB0b2tlbj0lc1xuIiAlIChsaW5lbm8sIGVycnRva2VuLnR5cGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoInlhY2M6IFN5bnRheCBlcnJvciwgdG9rZW49JXMiICUgZXJydG9rZW4udHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgieWFjYzogUGFyc2UgZXJyb3IgaW4gaW5wdXQuIEVPRlxuIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGVycm9yY291bnQgPSBlcnJvcl9jb3VudAorCisgICAgICAgICAgICAgICAgIyBjYXNlIDE6ICB0aGUgc3RhdGVzdGFjayBvbmx5IGhhcyAxIGVudHJ5IG9uIGl0LiAgSWYgd2UncmUgaW4gdGhpcyBzdGF0ZSwgdGhlCisgICAgICAgICAgICAgICAgIyBlbnRpcmUgcGFyc2UgaGFzIGJlZW4gcm9sbGVkIGJhY2sgYW5kIHdlJ3JlIGNvbXBsZXRlbHkgaG9zZWQuICAgVGhlIHRva2VuIGlzCisgICAgICAgICAgICAgICAgIyBkaXNjYXJkZWQgYW5kIHdlIGp1c3Qga2VlcCBnb2luZy4KKworICAgICAgICAgICAgICAgIGlmIGxlbihzdGF0ZXN0YWNrKSA8PSAxIGFuZCBsb29rYWhlYWQudHlwZSAhPSAnJGVuZCc6CisgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgZXJydG9rZW4gPSBOb25lCisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMAorICAgICAgICAgICAgICAgICAgICAjIE51a2UgdGhlIHB1c2hiYWNrIHN0YWNrCisgICAgICAgICAgICAgICAgICAgIGRlbCBsb29rYWhlYWRzdGFja1s6XQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgIyBjYXNlIDI6IHRoZSBzdGF0ZXN0YWNrIGhhcyBhIGNvdXBsZSBvZiBlbnRyaWVzIG9uIGl0LCBidXQgd2UncmUKKyAgICAgICAgICAgICAgICAjIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuIG51a2UgdGhlIHRvcCBlbnRyeSBhbmQgZ2VuZXJhdGUgYW4gZXJyb3IgdG9rZW4KKworICAgICAgICAgICAgICAgICMgU3RhcnQgbnVraW5nIGVudHJpZXMgb24gdGhlIHN0YWNrCisgICAgICAgICAgICAgICAgaWYgbG9va2FoZWFkLnR5cGUgPT0gJyRlbmQnOgorICAgICAgICAgICAgICAgICAgICAjIFdob2EuIFdlJ3JlIHJlYWxseSBob3NlZCBoZXJlLiBCYWlsIG91dAorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAgICAgICAgIGlmIGxvb2thaGVhZC50eXBlICE9ICdlcnJvcic6CisgICAgICAgICAgICAgICAgICAgIHN5bSA9IHN5bXN0YWNrWy0xXQorICAgICAgICAgICAgICAgICAgICBpZiBzeW0udHlwZSA9PSAnZXJyb3InOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBIbW1tLiBFcnJvciBpcyBvbiB0b3Agb2Ygc3RhY2ssIHdlJ2xsIGp1c3QgbnVrZSBpbnB1dAorICAgICAgICAgICAgICAgICAgICAgICAgIyBzeW1ib2wgYW5kIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWQgPSBOb25lCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICB0ID0gWWFjY1N5bWJvbCgpCisgICAgICAgICAgICAgICAgICAgIHQudHlwZSA9ICdlcnJvcicKKyAgICAgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihsb29rYWhlYWQsImxpbmVubyIpOgorICAgICAgICAgICAgICAgICAgICAgICAgdC5saW5lbm8gPSBsb29rYWhlYWQubGluZW5vCisgICAgICAgICAgICAgICAgICAgIHQudmFsdWUgPSBsb29rYWhlYWQKKyAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkc3RhY2suYXBwZW5kKGxvb2thaGVhZCkKKyAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkID0gdAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHN5bXN0YWNrLnBvcCgpCisgICAgICAgICAgICAgICAgICAgIHN0YXRlc3RhY2sucG9wKCkKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBzdGF0ZXN0YWNrWy0xXSAgICAgICAjIFBvdGVudGlhbCBidWcgZml4CisKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAjIENhbGwgYW4gZXJyb3IgZnVuY3Rpb24gaGVyZQorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJ5YWNjOiBpbnRlcm5hbCBwYXJzZXIgZXJyb3IhISFcbiIpCisKKyAgICAjICEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCisgICAgIyBwYXJzZW9wdF9ub3RyYWNrKCkuCisgICAgIworICAgICMgT3B0aW1pemVkIHZlcnNpb24gb2YgcGFyc2VvcHQoKSB3aXRoIGxpbmUgbnVtYmVyIHRyYWNraW5nIHJlbW92ZWQuIAorICAgICMgRE8gTk9UIEVESVQgVEhJUyBDT0RFIERJUkVDVExZLiBDb3B5IHRoZSBvcHRpbWl6ZWQgdmVyc2lvbiBhbmQgcmVtb3ZlCisgICAgIyBjb2RlIGluIHRoZSAjLS0hIFRSQUNLSU5HIHNlY3Rpb25zCisgICAgIyAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQorCisgICAgZGVmIHBhcnNlb3B0X25vdHJhY2soc2VsZixpbnB1dD1Ob25lLGxleGVyPU5vbmUsZGVidWc9MCx0cmFja2luZz0wLHRva2VuZnVuYz1Ob25lKToKKyAgICAgICAgbG9va2FoZWFkID0gTm9uZSAgICAgICAgICAgICAgICAgIyBDdXJyZW50IGxvb2thaGVhZCBzeW1ib2wKKyAgICAgICAgbG9va2FoZWFkc3RhY2sgPSBbIF0gICAgICAgICAgICAgIyBTdGFjayBvZiBsb29rYWhlYWQgc3ltYm9scworICAgICAgICBhY3Rpb25zID0gc2VsZi5hY3Rpb24gICAgICAgICAgICAjIExvY2FsIHJlZmVyZW5jZSB0byBhY3Rpb24gdGFibGUgKHRvIGF2b2lkIGxvb2t1cCBvbiBzZWxmLikKKyAgICAgICAgZ290byAgICA9IHNlbGYuZ290byAgICAgICAgICAgICAgIyBMb2NhbCByZWZlcmVuY2UgdG8gZ290byB0YWJsZSAodG8gYXZvaWQgbG9va3VwIG9uIHNlbGYuKQorICAgICAgICBwcm9kICAgID0gc2VsZi5wcm9kdWN0aW9ucyAgICAgICAjIExvY2FsIHJlZmVyZW5jZSB0byBwcm9kdWN0aW9uIGxpc3QgKHRvIGF2b2lkIGxvb2t1cCBvbiBzZWxmLikKKyAgICAgICAgcHNsaWNlICA9IFlhY2NQcm9kdWN0aW9uKE5vbmUpICAgIyBQcm9kdWN0aW9uIG9iamVjdCBwYXNzZWQgdG8gZ3JhbW1hciBydWxlcworICAgICAgICBlcnJvcmNvdW50ID0gMCAgICAgICAgICAgICAgICAgICAjIFVzZWQgZHVyaW5nIGVycm9yIHJlY292ZXJ5IAorCisgICAgICAgICMgSWYgbm8gbGV4ZXIgd2FzIGdpdmVuLCB3ZSB3aWxsIHRyeSB0byB1c2UgdGhlIGxleCBtb2R1bGUKKyAgICAgICAgaWYgbm90IGxleGVyOgorICAgICAgICAgICAgbGV4ID0gbG9hZF9wbHlfbGV4KCkKKyAgICAgICAgICAgIGxleGVyID0gbGV4LmxleGVyCisgICAgICAgIAorICAgICAgICAjIFNldCB1cCB0aGUgbGV4ZXIgYW5kIHBhcnNlciBvYmplY3RzIG9uIHBzbGljZQorICAgICAgICBwc2xpY2UubGV4ZXIgPSBsZXhlcgorICAgICAgICBwc2xpY2UucGFyc2VyID0gc2VsZgorCisgICAgICAgICMgSWYgaW5wdXQgd2FzIHN1cHBsaWVkLCBwYXNzIHRvIGxleGVyCisgICAgICAgIGlmIGlucHV0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbGV4ZXIuaW5wdXQoaW5wdXQpCisKKyAgICAgICAgaWYgdG9rZW5mdW5jIGlzIE5vbmU6CisgICAgICAgICAgICMgVG9rZW5pemUgZnVuY3Rpb24KKyAgICAgICAgICAgZ2V0X3Rva2VuID0gbGV4ZXIudG9rZW4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgZ2V0X3Rva2VuID0gdG9rZW5mdW5jCisKKyAgICAgICAgIyBTZXQgdXAgdGhlIHN0YXRlIGFuZCBzeW1ib2wgc3RhY2tzCisKKyAgICAgICAgc3RhdGVzdGFjayA9IFsgXSAgICAgICAgICAgICAgICAjIFN0YWNrIG9mIHBhcnNpbmcgc3RhdGVzCisgICAgICAgIHNlbGYuc3RhdGVzdGFjayA9IHN0YXRlc3RhY2sKKyAgICAgICAgc3ltc3RhY2sgICA9IFsgXSAgICAgICAgICAgICAgICAjIFN0YWNrIG9mIGdyYW1tYXIgc3ltYm9scworICAgICAgICBzZWxmLnN5bXN0YWNrID0gc3ltc3RhY2sKKworICAgICAgICBwc2xpY2Uuc3RhY2sgPSBzeW1zdGFjayAgICAgICAgICMgUHV0IGluIHRoZSBwcm9kdWN0aW9uCisgICAgICAgIGVycnRva2VuICAgPSBOb25lICAgICAgICAgICAgICAgIyBFcnIgdG9rZW4KKworICAgICAgICAjIFRoZSBzdGFydCBzdGF0ZSBpcyBhc3N1bWVkIHRvIGJlICgwLCRlbmQpCisKKyAgICAgICAgc3RhdGVzdGFjay5hcHBlbmQoMCkKKyAgICAgICAgc3ltID0gWWFjY1N5bWJvbCgpCisgICAgICAgIHN5bS50eXBlID0gJyRlbmQnCisgICAgICAgIHN5bXN0YWNrLmFwcGVuZChzeW0pCisgICAgICAgIHN0YXRlID0gMAorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgIyBHZXQgdGhlIG5leHQgc3ltYm9sIG9uIHRoZSBpbnB1dC4gIElmIGEgbG9va2FoZWFkIHN5bWJvbAorICAgICAgICAgICAgIyBpcyBhbHJlYWR5IHNldCwgd2UganVzdCB1c2UgdGhhdC4gT3RoZXJ3aXNlLCB3ZSdsbCBwdWxsCisgICAgICAgICAgICAjIHRoZSBuZXh0IHRva2VuIG9mZiBvZiB0aGUgbG9va2FoZWFkc3RhY2sgb3IgZnJvbSB0aGUgbGV4ZXIKKworICAgICAgICAgICAgaWYgbm90IGxvb2thaGVhZDoKKyAgICAgICAgICAgICAgICBpZiBub3QgbG9va2FoZWFkc3RhY2s6CisgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IGdldF90b2tlbigpICAgICAjIEdldCB0aGUgbmV4dCB0b2tlbgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IGxvb2thaGVhZHN0YWNrLnBvcCgpCisgICAgICAgICAgICAgICAgaWYgbm90IGxvb2thaGVhZDoKKyAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkID0gWWFjY1N5bWJvbCgpCisgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZC50eXBlID0gJyRlbmQnCisKKyAgICAgICAgICAgICMgQ2hlY2sgdGhlIGFjdGlvbiB0YWJsZQorICAgICAgICAgICAgbHR5cGUgPSBsb29rYWhlYWQudHlwZQorICAgICAgICAgICAgdCA9IGFjdGlvbnNbc3RhdGVdLmdldChsdHlwZSkKKworICAgICAgICAgICAgaWYgdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBpZiB0ID4gMDoKKyAgICAgICAgICAgICAgICAgICAgIyBzaGlmdCBhIHN5bWJvbCBvbiB0aGUgc3RhY2sKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVzdGFjay5hcHBlbmQodCkKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSB0CisKKyAgICAgICAgICAgICAgICAgICAgc3ltc3RhY2suYXBwZW5kKGxvb2thaGVhZCkKKyAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkID0gTm9uZQorCisgICAgICAgICAgICAgICAgICAgICMgRGVjcmVhc2UgZXJyb3IgY291bnQgb24gc3VjY2Vzc2Z1bCBzaGlmdAorICAgICAgICAgICAgICAgICAgICBpZiBlcnJvcmNvdW50OiBlcnJvcmNvdW50IC09MQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgaWYgdCA8IDA6CisgICAgICAgICAgICAgICAgICAgICMgcmVkdWNlIGEgc3ltYm9sIG9uIHRoZSBzdGFjaywgZW1pdCBhIHByb2R1Y3Rpb24KKyAgICAgICAgICAgICAgICAgICAgcCA9IHByb2RbLXRdCisgICAgICAgICAgICAgICAgICAgIHBuYW1lID0gcC5uYW1lCisgICAgICAgICAgICAgICAgICAgIHBsZW4gID0gcC5sZW4KKworICAgICAgICAgICAgICAgICAgICAjIEdldCBwcm9kdWN0aW9uIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgIHN5bSA9IFlhY2NTeW1ib2woKQorICAgICAgICAgICAgICAgICAgICBzeW0udHlwZSA9IHBuYW1lICAgICAgICMgUHJvZHVjdGlvbiBuYW1lCisgICAgICAgICAgICAgICAgICAgIHN5bS52YWx1ZSA9IE5vbmUKKworICAgICAgICAgICAgICAgICAgICBpZiBwbGVuOgorICAgICAgICAgICAgICAgICAgICAgICAgdGFyZyA9IHN5bXN0YWNrWy1wbGVuLTE6XQorICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ1swXSA9IHN5bQorCisgICAgICAgICAgICAgICAgICAgICAgICAjICEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCisgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBjb2RlIGVuY2xvc2VkIGluIHRoaXMgc2VjdGlvbiBpcyBkdXBsaWNhdGVkIAorICAgICAgICAgICAgICAgICAgICAgICAgIyBiZWxvdyBhcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbi4gIE1ha2Ugc3VyZQorICAgICAgICAgICAgICAgICAgICAgICAgIyBjaGFuZ2VzIGdldCBtYWRlIGluIGJvdGggbG9jYXRpb25zLgorCisgICAgICAgICAgICAgICAgICAgICAgICBwc2xpY2Uuc2xpY2UgPSB0YXJnCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIENhbGwgdGhlIGdyYW1tYXIgcnVsZSB3aXRoIG91ciBzcGVjaWFsIHNsaWNlIG9iamVjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBzeW1zdGFja1stcGxlbjpdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsIHN0YXRlc3RhY2tbLXBsZW46XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuY2FsbGFibGUocHNsaWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bXN0YWNrLmFwcGVuZChzeW0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBnb3RvW3N0YXRlc3RhY2tbLTFdXVtwbmFtZV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZXN0YWNrLmFwcGVuZChzdGF0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIElmIGFuIGVycm9yIHdhcyBzZXQuIEVudGVyIGVycm9yIHJlY292ZXJ5IHN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkc3RhY2suYXBwZW5kKGxvb2thaGVhZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1zdGFjay5wb3AoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlc3RhY2sucG9wKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IHN0YXRlc3RhY2tbLTFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltLnR5cGUgPSAnZXJyb3InCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkID0gc3ltCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3Jjb3VudCA9IGVycm9yX2NvdW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvcm9rID0gMAorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgICAgICMgISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKworICAgICAgICAgICAgICAgICAgICAgICAgdGFyZyA9IFsgc3ltIF0KKworICAgICAgICAgICAgICAgICAgICAgICAgIyAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQorICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgY29kZSBlbmNsb3NlZCBpbiB0aGlzIHNlY3Rpb24gaXMgZHVwbGljYXRlZCAKKyAgICAgICAgICAgICAgICAgICAgICAgICMgYWJvdmUgYXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uICBNYWtlIHN1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICMgY2hhbmdlcyBnZXQgbWFkZSBpbiBib3RoIGxvY2F0aW9ucy4KKworICAgICAgICAgICAgICAgICAgICAgICAgcHNsaWNlLnNsaWNlID0gdGFyZworCisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBDYWxsIHRoZSBncmFtbWFyIHJ1bGUgd2l0aCBvdXIgc3BlY2lhbCBzbGljZSBvYmplY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmNhbGxhYmxlKHBzbGljZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1zdGFjay5hcHBlbmQoc3ltKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gZ290b1tzdGF0ZXN0YWNrWy0xXV1bcG5hbWVdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVzdGFjay5hcHBlbmQoc3RhdGUpCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgU3ludGF4RXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBJZiBhbiBlcnJvciB3YXMgc2V0LiBFbnRlciBlcnJvciByZWNvdmVyeSBzdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZHN0YWNrLmFwcGVuZChsb29rYWhlYWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltc3RhY2sucG9wKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZXN0YWNrLnBvcCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBzdGF0ZXN0YWNrWy0xXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bS50eXBlID0gJ2Vycm9yJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IHN5bQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yY291bnQgPSBlcnJvcl9jb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JvayA9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICAjICEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCisKKyAgICAgICAgICAgICAgICBpZiB0ID09IDA6CisgICAgICAgICAgICAgICAgICAgIG4gPSBzeW1zdGFja1stMV0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldGF0dHIobiwidmFsdWUiLE5vbmUpCisKKyAgICAgICAgICAgIGlmIHQgPT0gTm9uZToKKworICAgICAgICAgICAgICAgICMgV2UgaGF2ZSBzb21lIGtpbmQgb2YgcGFyc2luZyBlcnJvciBoZXJlLiAgVG8gaGFuZGxlCisgICAgICAgICAgICAgICAgIyB0aGlzLCB3ZSBhcmUgZ29pbmcgdG8gcHVzaCB0aGUgY3VycmVudCB0b2tlbiBvbnRvCisgICAgICAgICAgICAgICAgIyB0aGUgdG9rZW5zdGFjayBhbmQgcmVwbGFjZSBpdCB3aXRoIGFuICdlcnJvcicgdG9rZW4uCisgICAgICAgICAgICAgICAgIyBJZiB0aGVyZSBhcmUgYW55IHN5bmNocm9uaXphdGlvbiBydWxlcywgdGhleSBtYXkKKyAgICAgICAgICAgICAgICAjIGNhdGNoIGl0LgorICAgICAgICAgICAgICAgICMKKyAgICAgICAgICAgICAgICAjIEluIGFkZGl0aW9uIHRvIHB1c2hpbmcgdGhlIGVycm9yIHRva2VuLCB3ZSBjYWxsIGNhbGwKKyAgICAgICAgICAgICAgICAjIHRoZSB1c2VyIGRlZmluZWQgcF9lcnJvcigpIGZ1bmN0aW9uIGlmIHRoaXMgaXMgdGhlCisgICAgICAgICAgICAgICAgIyBmaXJzdCBzeW50YXggZXJyb3IuICBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGlmCisgICAgICAgICAgICAgICAgIyBlcnJvcmNvdW50ID09IDAuCisgICAgICAgICAgICAgICAgaWYgZXJyb3Jjb3VudCA9PSAwIG9yIHNlbGYuZXJyb3JvazoKKyAgICAgICAgICAgICAgICAgICAgZXJyb3Jjb3VudCA9IGVycm9yX2NvdW50CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JvayA9IDAKKyAgICAgICAgICAgICAgICAgICAgZXJydG9rZW4gPSBsb29rYWhlYWQKKyAgICAgICAgICAgICAgICAgICAgaWYgZXJydG9rZW4udHlwZSA9PSAnJGVuZCc6CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJ0b2tlbiA9IE5vbmUgICAgICAgICAgICAgICAjIEVuZCBvZiBmaWxlIQorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmVycm9yZnVuYzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbCBlcnJvayx0b2tlbixyZXN0YXJ0CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvayA9IHNlbGYuZXJyb2sgICAgICAgICMgU2V0IHNvbWUgc3BlY2lhbCBmdW5jdGlvbnMgYXZhaWxhYmxlIGluIGVycm9yIHJlY292ZXJ5CisgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGdldF90b2tlbgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdGFydCA9IHNlbGYucmVzdGFydAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZXJydG9rZW4gYW5kIG5vdCBoYXNhdHRyKGVycnRva2VuLCdsZXhlcicpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycnRva2VuLmxleGVyID0gbGV4ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvayA9IHNlbGYuZXJyb3JmdW5jKGVycnRva2VuKQorICAgICAgICAgICAgICAgICAgICAgICAgZGVsIGVycm9rLCB0b2tlbiwgcmVzdGFydCAgICMgRGVsZXRlIHNwZWNpYWwgZnVuY3Rpb25zCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZXJyb3JvazoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFVzZXIgbXVzdCBoYXZlIGRvbmUgc29tZSBraW5kIG9mIHBhbmljCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtb2RlIHJlY292ZXJ5IG9uIHRoZWlyIG93bi4gIFRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmV0dXJuZWQgdG9rZW4gaXMgdGhlIG5leHQgbG9va2FoZWFkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkID0gdG9rCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJydG9rZW4gPSBOb25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGVycnRva2VuOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoZXJydG9rZW4sImxpbmVubyIpOiBsaW5lbm8gPSBsb29rYWhlYWQubGluZW5vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZTogbGluZW5vID0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxpbmVubzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgieWFjYzogU3ludGF4IGVycm9yIGF0IGxpbmUgJWQsIHRva2VuPSVzXG4iICUgKGxpbmVubywgZXJydG9rZW4udHlwZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgieWFjYzogU3ludGF4IGVycm9yLCB0b2tlbj0lcyIgJSBlcnJ0b2tlbi50eXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJ5YWNjOiBQYXJzZSBlcnJvciBpbiBpbnB1dC4gRU9GXG4iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZXJyb3Jjb3VudCA9IGVycm9yX2NvdW50CisKKyAgICAgICAgICAgICAgICAjIGNhc2UgMTogIHRoZSBzdGF0ZXN0YWNrIG9ubHkgaGFzIDEgZW50cnkgb24gaXQuICBJZiB3ZSdyZSBpbiB0aGlzIHN0YXRlLCB0aGUKKyAgICAgICAgICAgICAgICAjIGVudGlyZSBwYXJzZSBoYXMgYmVlbiByb2xsZWQgYmFjayBhbmQgd2UncmUgY29tcGxldGVseSBob3NlZC4gICBUaGUgdG9rZW4gaXMKKyAgICAgICAgICAgICAgICAjIGRpc2NhcmRlZCBhbmQgd2UganVzdCBrZWVwIGdvaW5nLgorCisgICAgICAgICAgICAgICAgaWYgbGVuKHN0YXRlc3RhY2spIDw9IDEgYW5kIGxvb2thaGVhZC50eXBlICE9ICckZW5kJzoKKyAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkID0gTm9uZQorICAgICAgICAgICAgICAgICAgICBlcnJ0b2tlbiA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAwCisgICAgICAgICAgICAgICAgICAgICMgTnVrZSB0aGUgcHVzaGJhY2sgc3RhY2sKKyAgICAgICAgICAgICAgICAgICAgZGVsIGxvb2thaGVhZHN0YWNrWzpdCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICAjIGNhc2UgMjogdGhlIHN0YXRlc3RhY2sgaGFzIGEgY291cGxlIG9mIGVudHJpZXMgb24gaXQsIGJ1dCB3ZSdyZQorICAgICAgICAgICAgICAgICMgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4gbnVrZSB0aGUgdG9wIGVudHJ5IGFuZCBnZW5lcmF0ZSBhbiBlcnJvciB0b2tlbgorCisgICAgICAgICAgICAgICAgIyBTdGFydCBudWtpbmcgZW50cmllcyBvbiB0aGUgc3RhY2sKKyAgICAgICAgICAgICAgICBpZiBsb29rYWhlYWQudHlwZSA9PSAnJGVuZCc6CisgICAgICAgICAgICAgICAgICAgICMgV2hvYS4gV2UncmUgcmVhbGx5IGhvc2VkIGhlcmUuIEJhaWwgb3V0CisgICAgICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICAgICAgICAgaWYgbG9va2FoZWFkLnR5cGUgIT0gJ2Vycm9yJzoKKyAgICAgICAgICAgICAgICAgICAgc3ltID0gc3ltc3RhY2tbLTFdCisgICAgICAgICAgICAgICAgICAgIGlmIHN5bS50eXBlID09ICdlcnJvcic6CisgICAgICAgICAgICAgICAgICAgICAgICAjIEhtbW0uIEVycm9yIGlzIG9uIHRvcCBvZiBzdGFjaywgd2UnbGwganVzdCBudWtlIGlucHV0CisgICAgICAgICAgICAgICAgICAgICAgICAjIHN5bWJvbCBhbmQgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIHQgPSBZYWNjU3ltYm9sKCkKKyAgICAgICAgICAgICAgICAgICAgdC50eXBlID0gJ2Vycm9yJworICAgICAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKGxvb2thaGVhZCwibGluZW5vIik6CisgICAgICAgICAgICAgICAgICAgICAgICB0LmxpbmVubyA9IGxvb2thaGVhZC5saW5lbm8KKyAgICAgICAgICAgICAgICAgICAgdC52YWx1ZSA9IGxvb2thaGVhZAorICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWRzdGFjay5hcHBlbmQobG9va2FoZWFkKQorICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWQgPSB0CisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc3ltc3RhY2sucG9wKCkKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVzdGFjay5wb3AoKQorICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IHN0YXRlc3RhY2tbLTFdICAgICAgICMgUG90ZW50aWFsIGJ1ZyBmaXgKKworICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICMgQ2FsbCBhbiBlcnJvciBmdW5jdGlvbiBoZXJlCisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoInlhY2M6IGludGVybmFsIHBhcnNlciBlcnJvciEhIVxuIikKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAgICAgICAgICAgICAgICAgICAgICAgICAgPT09IEdyYW1tYXIgUmVwcmVzZW50YXRpb24gPT09CisjCisjIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zLCBjbGFzc2VzLCBhbmQgdmFyaWFibGVzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBhbmQKKyMgbWFuaXB1bGF0ZSB0aGUgcnVsZXMgdGhhdCBtYWtlIHVwIGEgZ3JhbW1hci4gCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ltcG9ydCByZQorCisjIHJlZ2V4IG1hdGNoaW5nIGlkZW50aWZpZXJzCitfaXNfaWRlbnRpZmllciA9IHJlLmNvbXBpbGUocideW2EtekEtWjAtOV8tXSskJykKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjbGFzcyBQcm9kdWN0aW9uOgorIworIyBUaGlzIGNsYXNzIHN0b3JlcyB0aGUgcmF3IGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIHByb2R1Y3Rpb24gb3IgZ3JhbW1hciBydWxlLgorIyBBIGdyYW1tYXIgcnVsZSByZWZlcnMgdG8gYSBzcGVjaWZpY2F0aW9uIHN1Y2ggYXMgdGhpczoKKyMKKyMgICAgICAgZXhwciA6IGV4cHIgUExVUyB0ZXJtIAorIworIyBIZXJlIGFyZSB0aGUgYmFzaWMgYXR0cmlidXRlcyBkZWZpbmVkIG9uIGFsbCBwcm9kdWN0aW9ucworIworIyAgICAgICBuYW1lICAgICAtIE5hbWUgb2YgdGhlIHByb2R1Y3Rpb24uICBGb3IgZXhhbXBsZSAnZXhwcicKKyMgICAgICAgcHJvZCAgICAgLSBBIGxpc3Qgb2Ygc3ltYm9scyBvbiB0aGUgcmlnaHQgc2lkZSBbJ2V4cHInLCdQTFVTJywndGVybSddCisjICAgICAgIHByZWMgICAgIC0gUHJvZHVjdGlvbiBwcmVjZWRlbmNlIGxldmVsCisjICAgICAgIG51bWJlciAgIC0gUHJvZHVjdGlvbiBudW1iZXIuCisjICAgICAgIGZ1bmMgICAgIC0gRnVuY3Rpb24gdGhhdCBleGVjdXRlcyBvbiByZWR1Y2UKKyMgICAgICAgZmlsZSAgICAgLSBGaWxlIHdoZXJlIHByb2R1Y3Rpb24gZnVuY3Rpb24gaXMgZGVmaW5lZAorIyAgICAgICBsaW5lbm8gICAtIExpbmUgbnVtYmVyIHdoZXJlIHByb2R1Y3Rpb24gZnVuY3Rpb24gaXMgZGVmaW5lZAorIworIyBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIGRlZmluZWQgb3Igb3B0aW9uYWwuCisjCisjICAgICAgIGxlbiAgICAgICAtIExlbmd0aCBvZiB0aGUgcHJvZHVjdGlvbiAobnVtYmVyIG9mIHN5bWJvbHMgb24gcmlnaHQgaGFuZCBzaWRlKQorIyAgICAgICB1c3ltcyAgICAgLSBTZXQgb2YgdW5pcXVlIHN5bWJvbHMgZm91bmQgaW4gdGhlIHByb2R1Y3Rpb24KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgUHJvZHVjdGlvbihvYmplY3QpOgorICAgIHJlZHVjZWQgPSAwCisgICAgZGVmIF9faW5pdF9fKHNlbGYsbnVtYmVyLG5hbWUscHJvZCxwcmVjZWRlbmNlPSgncmlnaHQnLDApLGZ1bmM9Tm9uZSxmaWxlPScnLGxpbmU9MCk6CisgICAgICAgIHNlbGYubmFtZSAgICAgPSBuYW1lCisgICAgICAgIHNlbGYucHJvZCAgICAgPSB0dXBsZShwcm9kKQorICAgICAgICBzZWxmLm51bWJlciAgID0gbnVtYmVyCisgICAgICAgIHNlbGYuZnVuYyAgICAgPSBmdW5jCisgICAgICAgIHNlbGYuY2FsbGFibGUgPSBOb25lCisgICAgICAgIHNlbGYuZmlsZSAgICAgPSBmaWxlCisgICAgICAgIHNlbGYubGluZSAgICAgPSBsaW5lCisgICAgICAgIHNlbGYucHJlYyAgICAgPSBwcmVjZWRlbmNlCisKKyAgICAgICAgIyBJbnRlcm5hbCBzZXR0aW5ncyB1c2VkIGR1cmluZyB0YWJsZSBjb25zdHJ1Y3Rpb24KKyAgICAgICAgCisgICAgICAgIHNlbGYubGVuICA9IGxlbihzZWxmLnByb2QpICAgIyBMZW5ndGggb2YgdGhlIHByb2R1Y3Rpb24KKworICAgICAgICAjIENyZWF0ZSBhIGxpc3Qgb2YgdW5pcXVlIHByb2R1Y3Rpb24gc3ltYm9scyB1c2VkIGluIHRoZSBwcm9kdWN0aW9uCisgICAgICAgIHNlbGYudXN5bXMgPSBbIF0gICAgICAgICAgICAgCisgICAgICAgIGZvciBzIGluIHNlbGYucHJvZDoKKyAgICAgICAgICAgIGlmIHMgbm90IGluIHNlbGYudXN5bXM6CisgICAgICAgICAgICAgICAgc2VsZi51c3ltcy5hcHBlbmQocykKKworICAgICAgICAjIExpc3Qgb2YgYWxsIExSIGl0ZW1zIGZvciB0aGUgcHJvZHVjdGlvbgorICAgICAgICBzZWxmLmxyX2l0ZW1zID0gW10KKyAgICAgICAgc2VsZi5scl9uZXh0ID0gTm9uZQorCisgICAgICAgICMgQ3JlYXRlIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uCisgICAgICAgIGlmIHNlbGYucHJvZDoKKyAgICAgICAgICAgIHNlbGYuc3RyID0gIiVzIC0+ICVzIiAlIChzZWxmLm5hbWUsIiAiLmpvaW4oc2VsZi5wcm9kKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc3RyID0gIiVzIC0+IDxlbXB0eT4iICUgc2VsZi5uYW1lCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc3RyCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiUHJvZHVjdGlvbigiK3N0cihzZWxmKSsiKSIKKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gbGVuKHNlbGYucHJvZCkKKworICAgIGRlZiBfX25vbnplcm9fXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIDEKKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLGluZGV4KToKKyAgICAgICAgcmV0dXJuIHNlbGYucHJvZFtpbmRleF0KKyAgICAgICAgICAgIAorICAgICMgUmV0dXJuIHRoZSBudGggbHJfaXRlbSBmcm9tIHRoZSBwcm9kdWN0aW9uIChvciBOb25lIGlmIGF0IHRoZSBlbmQpCisgICAgZGVmIGxyX2l0ZW0oc2VsZixuKToKKyAgICAgICAgaWYgbiA+IGxlbihzZWxmLnByb2QpOiByZXR1cm4gTm9uZQorICAgICAgICBwID0gTFJJdGVtKHNlbGYsbikKKworICAgICAgICAjIFByZWNvbXB1dGUgdGhlIGxpc3Qgb2YgcHJvZHVjdGlvbnMgaW1tZWRpYXRlbHkgZm9sbG93aW5nLiAgSGFjay4gUmVtb3ZlIGxhdGVyCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHAubHJfYWZ0ZXIgPSBQcm9kbmFtZXNbcC5wcm9kW24rMV1dCisgICAgICAgIGV4Y2VwdCAoSW5kZXhFcnJvcixLZXlFcnJvcik6CisgICAgICAgICAgICBwLmxyX2FmdGVyID0gW10KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcC5scl9iZWZvcmUgPSBwLnByb2Rbbi0xXQorICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgIHAubHJfYmVmb3JlID0gTm9uZQorCisgICAgICAgIHJldHVybiBwCisgICAgCisgICAgIyBCaW5kIHRoZSBwcm9kdWN0aW9uIGZ1bmN0aW9uIG5hbWUgdG8gYSBjYWxsYWJsZQorICAgIGRlZiBiaW5kKHNlbGYscGRpY3QpOgorICAgICAgICBpZiBzZWxmLmZ1bmM6CisgICAgICAgICAgICBzZWxmLmNhbGxhYmxlID0gcGRpY3Rbc2VsZi5mdW5jXQorCisjIFRoaXMgY2xhc3Mgc2VydmVzIGFzIGEgbWluaW1hbCBzdGFuZGluIGZvciBQcm9kdWN0aW9uIG9iamVjdHMgd2hlbgorIyByZWFkaW5nIHRhYmxlIGRhdGEgZnJvbSBmaWxlcy4gICBJdCBvbmx5IGNvbnRhaW5zIGluZm9ybWF0aW9uCisjIGFjdHVhbGx5IHVzZWQgYnkgdGhlIExSIHBhcnNpbmcgZW5naW5lLCBwbHVzIHNvbWUgYWRkaXRpb25hbAorIyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCitjbGFzcyBNaW5pUHJvZHVjdGlvbihvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLHN0cixuYW1lLGxlbixmdW5jLGZpbGUsbGluZSk6CisgICAgICAgIHNlbGYubmFtZSAgICAgPSBuYW1lCisgICAgICAgIHNlbGYubGVuICAgICAgPSBsZW4KKyAgICAgICAgc2VsZi5mdW5jICAgICA9IGZ1bmMKKyAgICAgICAgc2VsZi5jYWxsYWJsZSA9IE5vbmUKKyAgICAgICAgc2VsZi5maWxlICAgICA9IGZpbGUKKyAgICAgICAgc2VsZi5saW5lICAgICA9IGxpbmUKKyAgICAgICAgc2VsZi5zdHIgICAgICA9IHN0cgorICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5zdHIKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiTWluaVByb2R1Y3Rpb24oJXMpIiAlIHNlbGYuc3RyCisKKyAgICAjIEJpbmQgdGhlIHByb2R1Y3Rpb24gZnVuY3Rpb24gbmFtZSB0byBhIGNhbGxhYmxlCisgICAgZGVmIGJpbmQoc2VsZixwZGljdCk6CisgICAgICAgIGlmIHNlbGYuZnVuYzoKKyAgICAgICAgICAgIHNlbGYuY2FsbGFibGUgPSBwZGljdFtzZWxmLmZ1bmNdCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjbGFzcyBMUkl0ZW0KKyMKKyMgVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgc3BlY2lmaWMgc3RhZ2Ugb2YgcGFyc2luZyBhIHByb2R1Y3Rpb24gcnVsZS4gIEZvcgorIyBleGFtcGxlOiAKKyMKKyMgICAgICAgZXhwciA6IGV4cHIgLiBQTFVTIHRlcm0gCisjCisjIEluIHRoZSBhYm92ZSwgdGhlICIuIiByZXByZXNlbnRzIHRoZSBjdXJyZW50IGxvY2F0aW9uIG9mIHRoZSBwYXJzZS4gIEhlcmUKKyMgYmFzaWMgYXR0cmlidXRlczoKKyMKKyMgICAgICAgbmFtZSAgICAgICAtIE5hbWUgb2YgdGhlIHByb2R1Y3Rpb24uICBGb3IgZXhhbXBsZSAnZXhwcicKKyMgICAgICAgcHJvZCAgICAgICAtIEEgbGlzdCBvZiBzeW1ib2xzIG9uIHRoZSByaWdodCBzaWRlIFsnZXhwcicsJy4nLCAnUExVUycsJ3Rlcm0nXQorIyAgICAgICBudW1iZXIgICAgIC0gUHJvZHVjdGlvbiBudW1iZXIuCisjCisjICAgICAgIGxyX25leHQgICAgICBOZXh0IExSIGl0ZW0uIEV4YW1wbGUsIGlmIHdlIGFyZSAnIGV4cHIgLT4gZXhwciAuIFBMVVMgdGVybScKKyMgICAgICAgICAgICAgICAgICAgIHRoZW4gbHJfbmV4dCByZWZlcnMgdG8gJ2V4cHIgLT4gZXhwciBQTFVTIC4gdGVybScKKyMgICAgICAgbHJfaW5kZXggICAtIExSIGl0ZW0gaW5kZXggKGxvY2F0aW9uIG9mIHRoZSAiLiIpIGluIHRoZSBwcm9kIGxpc3QuCisjICAgICAgIGxvb2thaGVhZHMgLSBMQUxSIGxvb2thaGVhZCBzeW1ib2xzIGZvciB0aGlzIGl0ZW0KKyMgICAgICAgbGVuICAgICAgICAtIExlbmd0aCBvZiB0aGUgcHJvZHVjdGlvbiAobnVtYmVyIG9mIHN5bWJvbHMgb24gcmlnaHQgaGFuZCBzaWRlKQorIyAgICAgICBscl9hZnRlciAgICAtIExpc3Qgb2YgYWxsIHByb2R1Y3Rpb25zIHRoYXQgaW1tZWRpYXRlbHkgZm9sbG93CisjICAgICAgIGxyX2JlZm9yZSAgIC0gR3JhbW1hciBzeW1ib2wgaW1tZWRpYXRlbHkgYmVmb3JlCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIExSSXRlbShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLHAsbik6CisgICAgICAgIHNlbGYubmFtZSAgICAgICA9IHAubmFtZQorICAgICAgICBzZWxmLnByb2QgICAgICAgPSBsaXN0KHAucHJvZCkKKyAgICAgICAgc2VsZi5udW1iZXIgICAgID0gcC5udW1iZXIKKyAgICAgICAgc2VsZi5scl9pbmRleCAgID0gbgorICAgICAgICBzZWxmLmxvb2thaGVhZHMgPSB7IH0KKyAgICAgICAgc2VsZi5wcm9kLmluc2VydChuLCIuIikKKyAgICAgICAgc2VsZi5wcm9kICAgICAgID0gdHVwbGUoc2VsZi5wcm9kKQorICAgICAgICBzZWxmLmxlbiAgICAgICAgPSBsZW4oc2VsZi5wcm9kKQorICAgICAgICBzZWxmLnVzeW1zICAgICAgPSBwLnVzeW1zCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5wcm9kOgorICAgICAgICAgICAgcyA9ICIlcyAtPiAlcyIgJSAoc2VsZi5uYW1lLCIgIi5qb2luKHNlbGYucHJvZCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzID0gIiVzIC0+IDxlbXB0eT4iICUgc2VsZi5uYW1lCisgICAgICAgIHJldHVybiBzCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiTFJJdGVtKCIrc3RyKHNlbGYpKyIpIgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHJpZ2h0bW9zdF90ZXJtaW5hbCgpCisjCisjIFJldHVybiB0aGUgcmlnaHRtb3N0IHRlcm1pbmFsIGZyb20gYSBsaXN0IG9mIHN5bWJvbHMuICBVc2VkIGluIGFkZF9wcm9kdWN0aW9uKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2RlZiByaWdodG1vc3RfdGVybWluYWwoc3ltYm9scywgdGVybWluYWxzKToKKyAgICBpID0gbGVuKHN5bWJvbHMpIC0gMQorICAgIHdoaWxlIGkgPj0gMDoKKyAgICAgICAgaWYgc3ltYm9sc1tpXSBpbiB0ZXJtaW5hbHM6CisgICAgICAgICAgICByZXR1cm4gc3ltYm9sc1tpXQorICAgICAgICBpIC09IDEKKyAgICByZXR1cm4gTm9uZQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgPT09IEdSQU1NQVIgQ0xBU1MgPT09CisjCisjIFRoZSBmb2xsb3dpbmcgY2xhc3MgcmVwcmVzZW50cyB0aGUgY29udGVudHMgb2YgdGhlIHNwZWNpZmllZCBncmFtbWFyIGFsb25nCisjIHdpdGggdmFyaW91cyBjb21wdXRlZCBwcm9wZXJ0aWVzIHN1Y2ggYXMgZmlyc3Qgc2V0cywgZm9sbG93IHNldHMsIExSIGl0ZW1zLCBldGMuCisjIFRoaXMgZGF0YSBpcyB1c2VkIGZvciBjcml0aWNhbCBwYXJ0cyBvZiB0aGUgdGFibGUgZ2VuZXJhdGlvbiBwcm9jZXNzIGxhdGVyLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBHcmFtbWFyRXJyb3IoWWFjY0Vycm9yKTogcGFzcworCitjbGFzcyBHcmFtbWFyKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsdGVybWluYWxzKToKKyAgICAgICAgc2VsZi5Qcm9kdWN0aW9ucyAgPSBbTm9uZV0gICMgQSBsaXN0IG9mIGFsbCBvZiB0aGUgcHJvZHVjdGlvbnMuICBUaGUgZmlyc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZW50cnkgaXMgYWx3YXlzIHJlc2VydmVkIGZvciB0aGUgcHVycG9zZSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBidWlsZGluZyBhbiBhdWdtZW50ZWQgZ3JhbW1hcgorCisgICAgICAgIHNlbGYuUHJvZG5hbWVzICAgID0geyB9ICAgICAjIEEgZGljdGlvbmFyeSBtYXBwaW5nIHRoZSBuYW1lcyBvZiBub250ZXJtaW5hbHMgdG8gYSBsaXN0IG9mIGFsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwcm9kdWN0aW9ucyBvZiB0aGF0IG5vbnRlcm1pbmFsLgorCisgICAgICAgIHNlbGYuUHJvZG1hcCAgICAgID0geyB9ICAgICAjIEEgZGljdGlvbmFyeSB0aGF0IGlzIG9ubHkgdXNlZCB0byBkZXRlY3QgZHVwbGljYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHByb2R1Y3Rpb25zLgorCisgICAgICAgIHNlbGYuVGVybWluYWxzICAgID0geyB9ICAgICAjIEEgZGljdGlvbmFyeSBtYXBwaW5nIHRoZSBuYW1lcyBvZiB0ZXJtaW5hbCBzeW1ib2xzIHRvIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbGlzdCBvZiB0aGUgcnVsZXMgd2hlcmUgdGhleSBhcmUgdXNlZC4KKworICAgICAgICBmb3IgdGVybSBpbiB0ZXJtaW5hbHM6CisgICAgICAgICAgICBzZWxmLlRlcm1pbmFsc1t0ZXJtXSA9IFtdCisKKyAgICAgICAgc2VsZi5UZXJtaW5hbHNbJ2Vycm9yJ10gPSBbXQorCisgICAgICAgIHNlbGYuTm9udGVybWluYWxzID0geyB9ICAgICAjIEEgZGljdGlvbmFyeSBtYXBwaW5nIG5hbWVzIG9mIG5vbnRlcm1pbmFscyB0byBhIGxpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb2YgcnVsZSBudW1iZXJzIHdoZXJlIHRoZXkgYXJlIHVzZWQuCisKKyAgICAgICAgc2VsZi5GaXJzdCAgICAgICAgPSB7IH0gICAgICMgQSBkaWN0aW9uYXJ5IG9mIHByZWNvbXB1dGVkIEZJUlNUKHgpIHN5bWJvbHMKKworICAgICAgICBzZWxmLkZvbGxvdyAgICAgICA9IHsgfSAgICAgIyBBIGRpY3Rpb25hcnkgb2YgcHJlY29tcHV0ZWQgRk9MTE9XKHgpIHN5bWJvbHMKKworICAgICAgICBzZWxmLlByZWNlZGVuY2UgICA9IHsgfSAgICAgIyBQcmVjZWRlbmNlIHJ1bGVzIGZvciBlYWNoIHRlcm1pbmFsLiBDb250YWlucyB0dXBsZXMgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZvcm0gKCdyaWdodCcsbGV2ZWwpIG9yICgnbm9uYXNzb2MnLCBsZXZlbCkgb3IgKCdsZWZ0JyxsZXZlbCkKKworICAgICAgICBzZWxmLlVzZWRQcmVjZWRlbmNlID0geyB9ICAgIyBQcmVjZWRlbmNlIHJ1bGVzIHRoYXQgd2VyZSBhY3R1YWxseSB1c2VkIGJ5IHRoZSBncmFtbWVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGlzIGlzIG9ubHkgdXNlZCB0byBwcm92aWRlIGVycm9yIGNoZWNraW5nIGFuZCB0byBnZW5lcmF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhIHdhcm5pbmcgYWJvdXQgdW51c2VkIHByZWNlZGVuY2UgcnVsZXMuCisKKyAgICAgICAgc2VsZi5TdGFydCA9IE5vbmUgICAgICAgICAgICMgU3RhcnRpbmcgc3ltYm9sIGZvciB0aGUgZ3JhbW1hcgorCisKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLlByb2R1Y3Rpb25zKQorCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsaW5kZXgpOgorICAgICAgICByZXR1cm4gc2VsZi5Qcm9kdWN0aW9uc1tpbmRleF0KKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIHNldF9wcmVjZWRlbmNlKCkKKyAgICAjCisgICAgIyBTZXRzIHRoZSBwcmVjZWRlbmNlIGZvciBhIGdpdmVuIHRlcm1pbmFsLiBhc3NvYyBpcyB0aGUgYXNzb2NpYXRpdml0eSBzdWNoIGFzCisgICAgIyAnbGVmdCcsJ3JpZ2h0Jywgb3IgJ25vbmFzc29jJy4gIGxldmVsIGlzIGEgbnVtZXJpYyBsZXZlbC4KKyAgICAjCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIHNldF9wcmVjZWRlbmNlKHNlbGYsdGVybSxhc3NvYyxsZXZlbCk6CisgICAgICAgIGFzc2VydCBzZWxmLlByb2R1Y3Rpb25zID09IFtOb25lXSwiTXVzdCBjYWxsIHNldF9wcmVjZWRlbmNlKCkgYmVmb3JlIGFkZF9wcm9kdWN0aW9uKCkiCisgICAgICAgIGlmIHRlcm0gaW4gc2VsZi5QcmVjZWRlbmNlOgorICAgICAgICAgICAgcmFpc2UgR3JhbW1hckVycm9yKCJQcmVjZWRlbmNlIGFscmVhZHkgc3BlY2lmaWVkIGZvciB0ZXJtaW5hbCAnJXMnIiAlIHRlcm0pCisgICAgICAgIGlmIGFzc29jIG5vdCBpbiBbJ2xlZnQnLCdyaWdodCcsJ25vbmFzc29jJ106CisgICAgICAgICAgICByYWlzZSBHcmFtbWFyRXJyb3IoIkFzc29jaWF0aXZpdHkgbXVzdCBiZSBvbmUgb2YgJ2xlZnQnLCdyaWdodCcsIG9yICdub25hc3NvYyciKQorICAgICAgICBzZWxmLlByZWNlZGVuY2VbdGVybV0gPSAoYXNzb2MsbGV2ZWwpCisgCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgYWRkX3Byb2R1Y3Rpb24oKQorICAgICMKKyAgICAjIEdpdmVuIGFuIGFjdGlvbiBmdW5jdGlvbiwgdGhpcyBmdW5jdGlvbiBhc3NlbWJsZXMgYSBwcm9kdWN0aW9uIHJ1bGUgYW5kCisgICAgIyBjb21wdXRlcyBpdHMgcHJlY2VkZW5jZSBsZXZlbC4KKyAgICAjCisgICAgIyBUaGUgcHJvZHVjdGlvbiBydWxlIGlzIHN1cHBsaWVkIGFzIGEgbGlzdCBvZiBzeW1ib2xzLiAgIEZvciBleGFtcGxlLAorICAgICMgYSBydWxlIHN1Y2ggYXMgJ2V4cHIgOiBleHByIFBMVVMgdGVybScgaGFzIGEgcHJvZHVjdGlvbiBuYW1lIG9mICdleHByJyBhbmQKKyAgICAjIHN5bWJvbHMgWydleHByJywnUExVUycsJ3Rlcm0nXS4KKyAgICAjCisgICAgIyBQcmVjZWRlbmNlIGlzIGRldGVybWluZWQgYnkgdGhlIHByZWNlZGVuY2Ugb2YgdGhlIHJpZ2h0LW1vc3Qgbm9uLXRlcm1pbmFsCisgICAgIyBvciB0aGUgcHJlY2VkZW5jZSBvZiBhIHRlcm1pbmFsIHNwZWNpZmllZCBieSAlcHJlYy4KKyAgICAjCisgICAgIyBBIHZhcmlldHkgb2YgZXJyb3IgY2hlY2tzIGFyZSBwZXJmb3JtZWQgdG8gbWFrZSBzdXJlIHByb2R1Y3Rpb24gc3ltYm9scworICAgICMgYXJlIHZhbGlkIGFuZCB0aGF0ICVwcmVjIGlzIHVzZWQgY29ycmVjdGx5LgorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBhZGRfcHJvZHVjdGlvbihzZWxmLHByb2RuYW1lLHN5bXMsZnVuYz1Ob25lLGZpbGU9JycsbGluZT0wKToKKworICAgICAgICBpZiBwcm9kbmFtZSBpbiBzZWxmLlRlcm1pbmFsczoKKyAgICAgICAgICAgIHJhaXNlIEdyYW1tYXJFcnJvcigiJXM6JWQ6IElsbGVnYWwgcnVsZSBuYW1lICclcycuIEFscmVhZHkgZGVmaW5lZCBhcyBhIHRva2VuIiAlIChmaWxlLGxpbmUscHJvZG5hbWUpKQorICAgICAgICBpZiBwcm9kbmFtZSA9PSAnZXJyb3InOgorICAgICAgICAgICAgcmFpc2UgR3JhbW1hckVycm9yKCIlczolZDogSWxsZWdhbCBydWxlIG5hbWUgJyVzJy4gZXJyb3IgaXMgYSByZXNlcnZlZCB3b3JkIiAlIChmaWxlLGxpbmUscHJvZG5hbWUpKQorICAgICAgICBpZiBub3QgX2lzX2lkZW50aWZpZXIubWF0Y2gocHJvZG5hbWUpOgorICAgICAgICAgICAgcmFpc2UgR3JhbW1hckVycm9yKCIlczolZDogSWxsZWdhbCBydWxlIG5hbWUgJyVzJyIgJSAoZmlsZSxsaW5lLHByb2RuYW1lKSkKKworICAgICAgICAjIExvb2sgZm9yIGxpdGVyYWwgdG9rZW5zIAorICAgICAgICBmb3IgbixzIGluIGVudW1lcmF0ZShzeW1zKToKKyAgICAgICAgICAgIGlmIHNbMF0gaW4gIidcIiI6CisgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgIGMgPSBldmFsKHMpCisgICAgICAgICAgICAgICAgICAgICBpZiAobGVuKGMpID4gMSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEdyYW1tYXJFcnJvcigiJXM6JWQ6IExpdGVyYWwgdG9rZW4gJXMgaW4gcnVsZSAnJXMnIG1heSBvbmx5IGJlIGEgc2luZ2xlIGNoYXJhY3RlciIgJSAoZmlsZSxsaW5lLHMsIHByb2RuYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBjIGluIHNlbGYuVGVybWluYWxzOgorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLlRlcm1pbmFsc1tjXSA9IFtdCisgICAgICAgICAgICAgICAgICAgICBzeW1zW25dID0gYworICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yOgorICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgaWYgbm90IF9pc19pZGVudGlmaWVyLm1hdGNoKHMpIGFuZCBzICE9ICclcHJlYyc6CisgICAgICAgICAgICAgICAgcmFpc2UgR3JhbW1hckVycm9yKCIlczolZDogSWxsZWdhbCBuYW1lICclcycgaW4gcnVsZSAnJXMnIiAlIChmaWxlLGxpbmUscywgcHJvZG5hbWUpKQorICAgICAgICAKKyAgICAgICAgIyBEZXRlcm1pbmUgdGhlIHByZWNlZGVuY2UgbGV2ZWwKKyAgICAgICAgaWYgJyVwcmVjJyBpbiBzeW1zOgorICAgICAgICAgICAgaWYgc3ltc1stMV0gPT0gJyVwcmVjJzoKKyAgICAgICAgICAgICAgICByYWlzZSBHcmFtbWFyRXJyb3IoIiVzOiVkOiBTeW50YXggZXJyb3IuIE5vdGhpbmcgZm9sbG93cyAlJXByZWMiICUgKGZpbGUsbGluZSkpCisgICAgICAgICAgICBpZiBzeW1zWy0yXSAhPSAnJXByZWMnOgorICAgICAgICAgICAgICAgIHJhaXNlIEdyYW1tYXJFcnJvcigiJXM6JWQ6IFN5bnRheCBlcnJvci4gJSVwcmVjIGNhbiBvbmx5IGFwcGVhciBhdCB0aGUgZW5kIG9mIGEgZ3JhbW1hciBydWxlIiAlIChmaWxlLGxpbmUpKQorICAgICAgICAgICAgcHJlY25hbWUgPSBzeW1zWy0xXQorICAgICAgICAgICAgcHJvZHByZWMgPSBzZWxmLlByZWNlZGVuY2UuZ2V0KHByZWNuYW1lLE5vbmUpCisgICAgICAgICAgICBpZiBub3QgcHJvZHByZWM6CisgICAgICAgICAgICAgICAgcmFpc2UgR3JhbW1hckVycm9yKCIlczolZDogTm90aGluZyBrbm93biBhYm91dCB0aGUgcHJlY2VkZW5jZSBvZiAnJXMnIiAlIChmaWxlLGxpbmUscHJlY25hbWUpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLlVzZWRQcmVjZWRlbmNlW3ByZWNuYW1lXSA9IDEKKyAgICAgICAgICAgIGRlbCBzeW1zWy0yOl0gICAgICMgRHJvcCAlcHJlYyBmcm9tIHRoZSBydWxlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIElmIG5vICVwcmVjLCBwcmVjZWRlbmNlIGlzIGRldGVybWluZWQgYnkgdGhlIHJpZ2h0bW9zdCB0ZXJtaW5hbCBzeW1ib2wKKyAgICAgICAgICAgIHByZWNuYW1lID0gcmlnaHRtb3N0X3Rlcm1pbmFsKHN5bXMsc2VsZi5UZXJtaW5hbHMpCisgICAgICAgICAgICBwcm9kcHJlYyA9IHNlbGYuUHJlY2VkZW5jZS5nZXQocHJlY25hbWUsKCdyaWdodCcsMCkpIAorICAgICAgICAgICAgCisgICAgICAgICMgU2VlIGlmIHRoZSBydWxlIGlzIGFscmVhZHkgaW4gdGhlIHJ1bGVtYXAKKyAgICAgICAgbWFwID0gIiVzIC0+ICVzIiAlIChwcm9kbmFtZSxzeW1zKQorICAgICAgICBpZiBtYXAgaW4gc2VsZi5Qcm9kbWFwOgorICAgICAgICAgICAgbSA9IHNlbGYuUHJvZG1hcFttYXBdCisgICAgICAgICAgICByYWlzZSBHcmFtbWFyRXJyb3IoIiVzOiVkOiBEdXBsaWNhdGUgcnVsZSAlcy4gIiAlIChmaWxlLGxpbmUsIG0pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJldmlvdXMgZGVmaW5pdGlvbiBhdCAlczolZCIgJSAobS5maWxlLCBtLmxpbmUpKQorCisgICAgICAgICMgRnJvbSB0aGlzIHBvaW50IG9uLCBldmVyeXRoaW5nIGlzIHZhbGlkLiAgQ3JlYXRlIGEgbmV3IFByb2R1Y3Rpb24gaW5zdGFuY2UKKyAgICAgICAgcG51bWJlciAgPSBsZW4oc2VsZi5Qcm9kdWN0aW9ucykKKyAgICAgICAgaWYgbm90IHByb2RuYW1lIGluIHNlbGYuTm9udGVybWluYWxzOgorICAgICAgICAgICAgc2VsZi5Ob250ZXJtaW5hbHNbcHJvZG5hbWVdID0gWyBdCisKKyAgICAgICAgIyBBZGQgdGhlIHByb2R1Y3Rpb24gbnVtYmVyIHRvIFRlcm1pbmFscyBhbmQgTm9udGVybWluYWxzCisgICAgICAgIGZvciB0IGluIHN5bXM6CisgICAgICAgICAgICBpZiB0IGluIHNlbGYuVGVybWluYWxzOgorICAgICAgICAgICAgICAgIHNlbGYuVGVybWluYWxzW3RdLmFwcGVuZChwbnVtYmVyKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBub3QgdCBpbiBzZWxmLk5vbnRlcm1pbmFsczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5Ob250ZXJtaW5hbHNbdF0gPSBbIF0KKyAgICAgICAgICAgICAgICBzZWxmLk5vbnRlcm1pbmFsc1t0XS5hcHBlbmQocG51bWJlcikKKworICAgICAgICAjIENyZWF0ZSBhIHByb2R1Y3Rpb24gYW5kIGFkZCBpdCB0byB0aGUgbGlzdCBvZiBwcm9kdWN0aW9ucworICAgICAgICBwID0gUHJvZHVjdGlvbihwbnVtYmVyLHByb2RuYW1lLHN5bXMscHJvZHByZWMsZnVuYyxmaWxlLGxpbmUpCisgICAgICAgIHNlbGYuUHJvZHVjdGlvbnMuYXBwZW5kKHApCisgICAgICAgIHNlbGYuUHJvZG1hcFttYXBdID0gcAorCisgICAgICAgICMgQWRkIHRvIHRoZSBnbG9iYWwgcHJvZHVjdGlvbnMgbGlzdAorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLlByb2RuYW1lc1twcm9kbmFtZV0uYXBwZW5kKHApCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHNlbGYuUHJvZG5hbWVzW3Byb2RuYW1lXSA9IFsgcCBdCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBzZXRfc3RhcnQoKQorICAgICMKKyAgICAjIFNldHMgdGhlIHN0YXJ0aW5nIHN5bWJvbCBhbmQgY3JlYXRlcyB0aGUgYXVnbWVudGVkIGdyYW1tYXIuICBQcm9kdWN0aW9uIAorICAgICMgcnVsZSAwIGlzIFMnIC0+IHN0YXJ0IHdoZXJlIHN0YXJ0IGlzIHRoZSBzdGFydCBzeW1ib2wuCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIHNldF9zdGFydChzZWxmLHN0YXJ0PU5vbmUpOgorICAgICAgICBpZiBub3Qgc3RhcnQ6CisgICAgICAgICAgICBzdGFydCA9IHNlbGYuUHJvZHVjdGlvbnNbMV0ubmFtZQorICAgICAgICBpZiBzdGFydCBub3QgaW4gc2VsZi5Ob250ZXJtaW5hbHM6CisgICAgICAgICAgICByYWlzZSBHcmFtbWFyRXJyb3IoInN0YXJ0IHN5bWJvbCAlcyB1bmRlZmluZWQiICUgc3RhcnQpCisgICAgICAgIHNlbGYuUHJvZHVjdGlvbnNbMF0gPSBQcm9kdWN0aW9uKDAsIlMnIixbc3RhcnRdKQorICAgICAgICBzZWxmLk5vbnRlcm1pbmFsc1tzdGFydF0uYXBwZW5kKDApCisgICAgICAgIHNlbGYuU3RhcnQgPSBzdGFydAorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgZmluZF91bnJlYWNoYWJsZSgpCisgICAgIworICAgICMgRmluZCBhbGwgb2YgdGhlIG5vbnRlcm1pbmFsIHN5bWJvbHMgdGhhdCBjYW4ndCBiZSByZWFjaGVkIGZyb20gdGhlIHN0YXJ0aW5nCisgICAgIyBzeW1ib2wuICBSZXR1cm5zIGEgbGlzdCBvZiBub250ZXJtaW5hbHMgdGhhdCBjYW4ndCBiZSByZWFjaGVkLgorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBmaW5kX3VucmVhY2hhYmxlKHNlbGYpOgorICAgICAgICAKKyAgICAgICAgIyBNYXJrIGFsbCBzeW1ib2xzIHRoYXQgYXJlIHJlYWNoYWJsZSBmcm9tIGEgc3ltYm9sIHMKKyAgICAgICAgZGVmIG1hcmtfcmVhY2hhYmxlX2Zyb20ocyk6CisgICAgICAgICAgICBpZiByZWFjaGFibGVbc106CisgICAgICAgICAgICAgICAgIyBXZSd2ZSBhbHJlYWR5IHJlYWNoZWQgc3ltYm9sIHMuCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICByZWFjaGFibGVbc10gPSAxCisgICAgICAgICAgICBmb3IgcCBpbiBzZWxmLlByb2RuYW1lcy5nZXQocyxbXSk6CisgICAgICAgICAgICAgICAgZm9yIHIgaW4gcC5wcm9kOgorICAgICAgICAgICAgICAgICAgICBtYXJrX3JlYWNoYWJsZV9mcm9tKHIpCisKKyAgICAgICAgcmVhY2hhYmxlICAgPSB7IH0KKyAgICAgICAgZm9yIHMgaW4gbGlzdChzZWxmLlRlcm1pbmFscykgKyBsaXN0KHNlbGYuTm9udGVybWluYWxzKToKKyAgICAgICAgICAgIHJlYWNoYWJsZVtzXSA9IDAKKworICAgICAgICBtYXJrX3JlYWNoYWJsZV9mcm9tKCBzZWxmLlByb2R1Y3Rpb25zWzBdLnByb2RbMF0gKQorCisgICAgICAgIHJldHVybiBbcyBmb3IgcyBpbiBsaXN0KHNlbGYuTm9udGVybWluYWxzKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHJlYWNoYWJsZVtzXV0KKyAgICAKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBpbmZpbml0ZV9jeWNsZXMoKQorICAgICMKKyAgICAjIFRoaXMgZnVuY3Rpb24gbG9va3MgYXQgdGhlIHZhcmlvdXMgcGFyc2luZyBydWxlcyBhbmQgdHJpZXMgdG8gZGV0ZWN0CisgICAgIyBpbmZpbml0ZSByZWN1cnNpb24gY3ljbGVzIChncmFtbWFyIHJ1bGVzIHdoZXJlIHRoZXJlIGlzIG5vIHBvc3NpYmxlIHdheQorICAgICMgdG8gZGVyaXZlIGEgc3RyaW5nIG9mIG9ubHkgdGVybWluYWxzKS4KKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgaW5maW5pdGVfY3ljbGVzKHNlbGYpOgorICAgICAgICB0ZXJtaW5hdGVzID0ge30KKworICAgICAgICAjIFRlcm1pbmFsczoKKyAgICAgICAgZm9yIHQgaW4gc2VsZi5UZXJtaW5hbHM6CisgICAgICAgICAgICB0ZXJtaW5hdGVzW3RdID0gMQorCisgICAgICAgIHRlcm1pbmF0ZXNbJyRlbmQnXSA9IDEKKworICAgICAgICAjIE5vbnRlcm1pbmFsczoKKworICAgICAgICAjIEluaXRpYWxpemUgdG8gZmFsc2U6CisgICAgICAgIGZvciBuIGluIHNlbGYuTm9udGVybWluYWxzOgorICAgICAgICAgICAgdGVybWluYXRlc1tuXSA9IDAKKworICAgICAgICAjIFRoZW4gcHJvcGFnYXRlIHRlcm1pbmF0aW9uIHVudGlsIG5vIGNoYW5nZToKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIHNvbWVfY2hhbmdlID0gMAorICAgICAgICAgICAgZm9yIChuLHBsKSBpbiBzZWxmLlByb2RuYW1lcy5pdGVtcygpOgorICAgICAgICAgICAgICAgICMgTm9udGVybWluYWwgbiB0ZXJtaW5hdGVzIGlmZiBhbnkgb2YgaXRzIHByb2R1Y3Rpb25zIHRlcm1pbmF0ZXMuCisgICAgICAgICAgICAgICAgZm9yIHAgaW4gcGw6CisgICAgICAgICAgICAgICAgICAgICMgUHJvZHVjdGlvbiBwIHRlcm1pbmF0ZXMgaWZmIGFsbCBvZiBpdHMgcmhzIHN5bWJvbHMgdGVybWluYXRlLgorICAgICAgICAgICAgICAgICAgICBmb3IgcyBpbiBwLnByb2Q6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgdGVybWluYXRlc1tzXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBzeW1ib2wgcyBkb2VzIG5vdCB0ZXJtaW5hdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzbyBwcm9kdWN0aW9uIHAgZG9lcyBub3QgdGVybWluYXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfdGVybWluYXRlcyA9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBkaWRuJ3QgYnJlYWsgZnJvbSB0aGUgbG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICMgc28gZXZlcnkgc3ltYm9sIHMgdGVybWluYXRlcworICAgICAgICAgICAgICAgICAgICAgICAgIyBzbyBwcm9kdWN0aW9uIHAgdGVybWluYXRlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIHBfdGVybWluYXRlcyA9IDEKKworICAgICAgICAgICAgICAgICAgICBpZiBwX3Rlcm1pbmF0ZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAjIHN5bWJvbCBuIHRlcm1pbmF0ZXMhCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgdGVybWluYXRlc1tuXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGVzW25dID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvbWVfY2hhbmdlID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgIyBEb24ndCBuZWVkIHRvIGNvbnNpZGVyIGFueSBtb3JlIHByb2R1Y3Rpb25zIGZvciB0aGlzIG4uCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICBpZiBub3Qgc29tZV9jaGFuZ2U6CisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICBpbmZpbml0ZSA9IFtdCisgICAgICAgIGZvciAocyx0ZXJtKSBpbiB0ZXJtaW5hdGVzLml0ZW1zKCk6CisgICAgICAgICAgICBpZiBub3QgdGVybToKKyAgICAgICAgICAgICAgICBpZiBub3QgcyBpbiBzZWxmLlByb2RuYW1lcyBhbmQgbm90IHMgaW4gc2VsZi5UZXJtaW5hbHMgYW5kIHMgIT0gJ2Vycm9yJzoKKyAgICAgICAgICAgICAgICAgICAgIyBzIGlzIHVzZWQtYnV0LW5vdC1kZWZpbmVkLCBhbmQgd2UndmUgYWxyZWFkeSB3YXJuZWQgb2YgdGhhdCwKKyAgICAgICAgICAgICAgICAgICAgIyBzbyBpdCB3b3VsZCBiZSBvdmVya2lsbCB0byBzYXkgdGhhdCBpdCdzIGFsc28gbm9uLXRlcm1pbmF0aW5nLgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaW5maW5pdGUuYXBwZW5kKHMpCisKKyAgICAgICAgcmV0dXJuIGluZmluaXRlCisKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIHVuZGVmaW5lZF9zeW1ib2xzKCkKKyAgICAjCisgICAgIyBGaW5kIGFsbCBzeW1ib2xzIHRoYXQgd2VyZSB1c2VkIHRoZSBncmFtbWFyLCBidXQgbm90IGRlZmluZWQgYXMgdG9rZW5zIG9yCisgICAgIyBncmFtbWFyIHJ1bGVzLiAgUmV0dXJucyBhIGxpc3Qgb2YgdHVwbGVzIChzeW0sIHByb2QpIHdoZXJlIHN5bSBpbiB0aGUgc3ltYm9sCisgICAgIyBhbmQgcHJvZCBpcyB0aGUgcHJvZHVjdGlvbiB3aGVyZSB0aGUgc3ltYm9sIHdhcyB1c2VkLiAKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgZGVmIHVuZGVmaW5lZF9zeW1ib2xzKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICBmb3IgcCBpbiBzZWxmLlByb2R1Y3Rpb25zOgorICAgICAgICAgICAgaWYgbm90IHA6IGNvbnRpbnVlCisKKyAgICAgICAgICAgIGZvciBzIGluIHAucHJvZDoKKyAgICAgICAgICAgICAgICBpZiBub3QgcyBpbiBzZWxmLlByb2RuYW1lcyBhbmQgbm90IHMgaW4gc2VsZi5UZXJtaW5hbHMgYW5kIHMgIT0gJ2Vycm9yJzoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgocyxwKSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgdW51c2VkX3Rlcm1pbmFscygpCisgICAgIworICAgICMgRmluZCBhbGwgdGVybWluYWxzIHRoYXQgd2VyZSBkZWZpbmVkLCBidXQgbm90IHVzZWQgYnkgdGhlIGdyYW1tYXIuICBSZXR1cm5zCisgICAgIyBhIGxpc3Qgb2YgYWxsIHN5bWJvbHMuCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGRlZiB1bnVzZWRfdGVybWluYWxzKHNlbGYpOgorICAgICAgICB1bnVzZWRfdG9rID0gW10KKyAgICAgICAgZm9yIHMsdiBpbiBzZWxmLlRlcm1pbmFscy5pdGVtcygpOgorICAgICAgICAgICAgaWYgcyAhPSAnZXJyb3InIGFuZCBub3QgdjoKKyAgICAgICAgICAgICAgICB1bnVzZWRfdG9rLmFwcGVuZChzKQorCisgICAgICAgIHJldHVybiB1bnVzZWRfdG9rCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgdW51c2VkX3J1bGVzKCkKKyAgICAjCisgICAgIyBGaW5kIGFsbCBncmFtbWFyIHJ1bGVzIHRoYXQgd2VyZSBkZWZpbmVkLCAgYnV0IG5vdCB1c2VkIChtYXliZSBub3QgcmVhY2hhYmxlKQorICAgICMgUmV0dXJucyBhIGxpc3Qgb2YgcHJvZHVjdGlvbnMuCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiB1bnVzZWRfcnVsZXMoc2VsZik6CisgICAgICAgIHVudXNlZF9wcm9kID0gW10KKyAgICAgICAgZm9yIHMsdiBpbiBzZWxmLk5vbnRlcm1pbmFscy5pdGVtcygpOgorICAgICAgICAgICAgaWYgbm90IHY6CisgICAgICAgICAgICAgICAgcCA9IHNlbGYuUHJvZG5hbWVzW3NdWzBdCisgICAgICAgICAgICAgICAgdW51c2VkX3Byb2QuYXBwZW5kKHApCisgICAgICAgIHJldHVybiB1bnVzZWRfcHJvZAorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgdW51c2VkX3ByZWNlZGVuY2UoKQorICAgICMKKyAgICAjIFJldHVybnMgYSBsaXN0IG9mIHR1cGxlcyAodGVybSxwcmVjZWRlbmNlKSBjb3JyZXNwb25kaW5nIHRvIHByZWNlZGVuY2UKKyAgICAjIHJ1bGVzIHRoYXQgd2VyZSBuZXZlciB1c2VkIGJ5IHRoZSBncmFtbWFyLiAgdGVybSBpcyB0aGUgbmFtZSBvZiB0aGUgdGVybWluYWwKKyAgICAjIG9uIHdoaWNoIHByZWNlZGVuY2Ugd2FzIGFwcGxpZWQgYW5kIHByZWNlZGVuY2UgaXMgYSBzdHJpbmcgc3VjaCBhcyAnbGVmdCcgb3IKKyAgICAjICdyaWdodCcgY29ycmVzcG9uZGluZyB0byB0aGUgdHlwZSBvZiBwcmVjZWRlbmNlLiAKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgdW51c2VkX3ByZWNlZGVuY2Uoc2VsZik6CisgICAgICAgIHVudXNlZCA9IFtdCisgICAgICAgIGZvciB0ZXJtbmFtZSBpbiBzZWxmLlByZWNlZGVuY2U6CisgICAgICAgICAgICBpZiBub3QgKHRlcm1uYW1lIGluIHNlbGYuVGVybWluYWxzIG9yIHRlcm1uYW1lIGluIHNlbGYuVXNlZFByZWNlZGVuY2UpOgorICAgICAgICAgICAgICAgIHVudXNlZC5hcHBlbmQoKHRlcm1uYW1lLHNlbGYuUHJlY2VkZW5jZVt0ZXJtbmFtZV1bMF0pKQorICAgICAgICAgICAgICAgIAorICAgICAgICByZXR1cm4gdW51c2VkCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIF9maXJzdCgpCisgICAgIworICAgICMgQ29tcHV0ZSB0aGUgdmFsdWUgb2YgRklSU1QxKGJldGEpIHdoZXJlIGJldGEgaXMgYSB0dXBsZSBvZiBzeW1ib2xzLgorICAgICMKKyAgICAjIER1cmluZyBleGVjdXRpb24gb2YgY29tcHV0ZV9maXJzdDEsIHRoZSByZXN1bHQgbWF5IGJlIGluY29tcGxldGUuCisgICAgIyBBZnRlcndhcmQgKGUuZy4sIHdoZW4gY2FsbGVkIGZyb20gY29tcHV0ZV9mb2xsb3coKSksIGl0IHdpbGwgYmUgY29tcGxldGUuCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgZGVmIF9maXJzdChzZWxmLGJldGEpOgorCisgICAgICAgICMgV2UgYXJlIGNvbXB1dGluZyBGaXJzdCh4MSx4Mix4MywuLi4seG4pCisgICAgICAgIHJlc3VsdCA9IFsgXQorICAgICAgICBmb3IgeCBpbiBiZXRhOgorICAgICAgICAgICAgeF9wcm9kdWNlc19lbXB0eSA9IDAKKworICAgICAgICAgICAgIyBBZGQgYWxsIHRoZSBub24tPGVtcHR5PiBzeW1ib2xzIG9mIEZpcnN0W3hdIHRvIHRoZSByZXN1bHQuCisgICAgICAgICAgICBmb3IgZiBpbiBzZWxmLkZpcnN0W3hdOgorICAgICAgICAgICAgICAgIGlmIGYgPT0gJzxlbXB0eT4nOgorICAgICAgICAgICAgICAgICAgICB4X3Byb2R1Y2VzX2VtcHR5ID0gMQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGlmIGYgbm90IGluIHJlc3VsdDogcmVzdWx0LmFwcGVuZChmKQorCisgICAgICAgICAgICBpZiB4X3Byb2R1Y2VzX2VtcHR5OgorICAgICAgICAgICAgICAgICMgV2UgaGF2ZSB0byBjb25zaWRlciB0aGUgbmV4dCB4IGluIGJldGEsCisgICAgICAgICAgICAgICAgIyBpLmUuIHN0YXkgaW4gdGhlIGxvb3AuCisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIFdlIGRvbid0IGhhdmUgdG8gY29uc2lkZXIgYW55IGZ1cnRoZXIgc3ltYm9scyBpbiBiZXRhLgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFRoZXJlIHdhcyBubyAnYnJlYWsnIGZyb20gdGhlIGxvb3AsCisgICAgICAgICAgICAjIHNvIHhfcHJvZHVjZXNfZW1wdHkgd2FzIHRydWUgZm9yIGFsbCB4IGluIGJldGEsCisgICAgICAgICAgICAjIHNvIGJldGEgcHJvZHVjZXMgZW1wdHkgYXMgd2VsbC4KKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJzxlbXB0eT4nKQorCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgY29tcHV0ZV9maXJzdCgpCisgICAgIworICAgICMgQ29tcHV0ZSB0aGUgdmFsdWUgb2YgRklSU1QxKFgpIGZvciBhbGwgc3ltYm9scworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGRlZiBjb21wdXRlX2ZpcnN0KHNlbGYpOgorICAgICAgICBpZiBzZWxmLkZpcnN0OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuRmlyc3QKKworICAgICAgICAjIFRlcm1pbmFsczoKKyAgICAgICAgZm9yIHQgaW4gc2VsZi5UZXJtaW5hbHM6CisgICAgICAgICAgICBzZWxmLkZpcnN0W3RdID0gW3RdCisKKyAgICAgICAgc2VsZi5GaXJzdFsnJGVuZCddID0gWyckZW5kJ10KKworICAgICAgICAjIE5vbnRlcm1pbmFsczoKKworICAgICAgICAjIEluaXRpYWxpemUgdG8gdGhlIGVtcHR5IHNldDoKKyAgICAgICAgZm9yIG4gaW4gc2VsZi5Ob250ZXJtaW5hbHM6CisgICAgICAgICAgICBzZWxmLkZpcnN0W25dID0gW10KKworICAgICAgICAjIFRoZW4gcHJvcGFnYXRlIHN5bWJvbHMgdW50aWwgbm8gY2hhbmdlOgorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgc29tZV9jaGFuZ2UgPSAwCisgICAgICAgICAgICBmb3IgbiBpbiBzZWxmLk5vbnRlcm1pbmFsczoKKyAgICAgICAgICAgICAgICBmb3IgcCBpbiBzZWxmLlByb2RuYW1lc1tuXToKKyAgICAgICAgICAgICAgICAgICAgZm9yIGYgaW4gc2VsZi5fZmlyc3QocC5wcm9kKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGYgbm90IGluIHNlbGYuRmlyc3Rbbl06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5GaXJzdFtuXS5hcHBlbmQoIGYgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvbWVfY2hhbmdlID0gMQorICAgICAgICAgICAgaWYgbm90IHNvbWVfY2hhbmdlOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIAorICAgICAgICByZXR1cm4gc2VsZi5GaXJzdAorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIGNvbXB1dGVfZm9sbG93KCkKKyAgICAjCisgICAgIyBDb21wdXRlcyBhbGwgb2YgdGhlIGZvbGxvdyBzZXRzIGZvciBldmVyeSBub24tdGVybWluYWwgc3ltYm9sLiAgVGhlCisgICAgIyBmb2xsb3cgc2V0IGlzIHRoZSBzZXQgb2YgYWxsIHN5bWJvbHMgdGhhdCBtaWdodCBmb2xsb3cgYSBnaXZlbgorICAgICMgbm9uLXRlcm1pbmFsLiAgU2VlIHRoZSBEcmFnb24gYm9vaywgMm5kIEVkLiBwLiAxODkuCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBkZWYgY29tcHV0ZV9mb2xsb3coc2VsZixzdGFydD1Ob25lKToKKyAgICAgICAgIyBJZiBhbHJlYWR5IGNvbXB1dGVkLCByZXR1cm4gdGhlIHJlc3VsdAorICAgICAgICBpZiBzZWxmLkZvbGxvdzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLkZvbGxvdworCisgICAgICAgICMgSWYgZmlyc3Qgc2V0cyBub3QgY29tcHV0ZWQgeWV0LCBkbyB0aGF0IGZpcnN0LgorICAgICAgICBpZiBub3Qgc2VsZi5GaXJzdDoKKyAgICAgICAgICAgIHNlbGYuY29tcHV0ZV9maXJzdCgpCisKKyAgICAgICAgIyBBZGQgJyRlbmQnIHRvIHRoZSBmb2xsb3cgbGlzdCBvZiB0aGUgc3RhcnQgc3ltYm9sCisgICAgICAgIGZvciBrIGluIHNlbGYuTm9udGVybWluYWxzOgorICAgICAgICAgICAgc2VsZi5Gb2xsb3dba10gPSBbIF0KKworICAgICAgICBpZiBub3Qgc3RhcnQ6CisgICAgICAgICAgICBzdGFydCA9IHNlbGYuUHJvZHVjdGlvbnNbMV0ubmFtZQorCisgICAgICAgIHNlbGYuRm9sbG93W3N0YXJ0XSA9IFsgJyRlbmQnIF0KKworICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgZGlkYWRkID0gMAorICAgICAgICAgICAgZm9yIHAgaW4gc2VsZi5Qcm9kdWN0aW9uc1sxOl06CisgICAgICAgICAgICAgICAgIyBIZXJlIGlzIHRoZSBwcm9kdWN0aW9uIHNldAorICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihwLnByb2QpKToKKyAgICAgICAgICAgICAgICAgICAgQiA9IHAucHJvZFtpXQorICAgICAgICAgICAgICAgICAgICBpZiBCIGluIHNlbGYuTm9udGVybWluYWxzOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBPa2F5LiBXZSBnb3QgYSBub24tdGVybWluYWwgaW4gYSBwcm9kdWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICBmc3QgPSBzZWxmLl9maXJzdChwLnByb2RbaSsxOl0pCisgICAgICAgICAgICAgICAgICAgICAgICBoYXNlbXB0eSA9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBmIGluIGZzdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBmICE9ICc8ZW1wdHk+JyBhbmQgZiBub3QgaW4gc2VsZi5Gb2xsb3dbQl06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuRm9sbG93W0JdLmFwcGVuZChmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWRhZGQgPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZiA9PSAnPGVtcHR5Pic6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2VtcHR5ID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgaGFzZW1wdHkgb3IgaSA9PSAobGVuKHAucHJvZCktMSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBBZGQgZWxlbWVudHMgb2YgZm9sbG93KGEpIHRvIGZvbGxvdyhiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBmIGluIHNlbGYuRm9sbG93W3AubmFtZV06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGYgbm90IGluIHNlbGYuRm9sbG93W0JdOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5Gb2xsb3dbQl0uYXBwZW5kKGYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWRhZGQgPSAxCisgICAgICAgICAgICBpZiBub3QgZGlkYWRkOiBicmVhaworICAgICAgICByZXR1cm4gc2VsZi5Gb2xsb3cKKworCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgYnVpbGRfbHJpdGVtcygpCisgICAgIworICAgICMgVGhpcyBmdW5jdGlvbiB3YWxrcyB0aGUgbGlzdCBvZiBwcm9kdWN0aW9ucyBhbmQgYnVpbGRzIGEgY29tcGxldGUgc2V0IG9mIHRoZQorICAgICMgTFIgaXRlbXMuICBUaGUgTFIgaXRlbXMgYXJlIHN0b3JlZCBpbiB0d28gd2F5czogIEZpcnN0LCB0aGV5IGFyZSB1bmlxdWVseQorICAgICMgbnVtYmVyZWQgYW5kIHBsYWNlZCBpbiB0aGUgbGlzdCBfbHJpdGVtcy4gIFNlY29uZCwgYSBsaW5rZWQgbGlzdCBvZiBMUiBpdGVtcworICAgICMgaXMgYnVpbHQgZm9yIGVhY2ggcHJvZHVjdGlvbi4gIEZvciBleGFtcGxlOgorICAgICMKKyAgICAjICAgRSAtPiBFIFBMVVMgRQorICAgICMKKyAgICAjIENyZWF0ZXMgdGhlIGxpc3QKKyAgICAjCisgICAgIyAgW0UgLT4gLiBFIFBMVVMgRSwgRSAtPiBFIC4gUExVUyBFLCBFIC0+IEUgUExVUyAuIEUsIEUgLT4gRSBQTFVTIEUgLiBdCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIGJ1aWxkX2xyaXRlbXMoc2VsZik6CisgICAgICAgIGZvciBwIGluIHNlbGYuUHJvZHVjdGlvbnM6CisgICAgICAgICAgICBsYXN0bHJpID0gcAorICAgICAgICAgICAgaSA9IDAKKyAgICAgICAgICAgIGxyX2l0ZW1zID0gW10KKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgaWYgaSA+IGxlbihwKToKKyAgICAgICAgICAgICAgICAgICAgbHJpID0gTm9uZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGxyaSA9IExSSXRlbShwLGkpCisgICAgICAgICAgICAgICAgICAgICMgUHJlY29tcHV0ZSB0aGUgbGlzdCBvZiBwcm9kdWN0aW9ucyBpbW1lZGlhdGVseSBmb2xsb3dpbmcKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgbHJpLmxyX2FmdGVyID0gc2VsZi5Qcm9kbmFtZXNbbHJpLnByb2RbaSsxXV0KKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IChJbmRleEVycm9yLEtleUVycm9yKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxyaS5scl9hZnRlciA9IFtdCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxyaS5scl9iZWZvcmUgPSBscmkucHJvZFtpLTFdCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgbHJpLmxyX2JlZm9yZSA9IE5vbmUKKworICAgICAgICAgICAgICAgIGxhc3RscmkubHJfbmV4dCA9IGxyaQorICAgICAgICAgICAgICAgIGlmIG5vdCBscmk6IGJyZWFrCisgICAgICAgICAgICAgICAgbHJfaXRlbXMuYXBwZW5kKGxyaSkKKyAgICAgICAgICAgICAgICBsYXN0bHJpID0gbHJpCisgICAgICAgICAgICAgICAgaSArPSAxCisgICAgICAgICAgICBwLmxyX2l0ZW1zID0gbHJfaXRlbXMKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBDbGFzcyBMUlRhYmxlID09CisjCisjIFRoaXMgYmFzaWMgY2xhc3MgcmVwcmVzZW50cyBhIGJhc2ljIHRhYmxlIG9mIExSIHBhcnNpbmcgaW5mb3JtYXRpb24uICAKKyMgTWV0aG9kcyBmb3IgZ2VuZXJhdGluZyB0aGUgdGFibGVzIGFyZSBub3QgZGVmaW5lZCBoZXJlLiAgVGhleSBhcmUgZGVmaW5lZAorIyBpbiB0aGUgZGVyaXZlZCBjbGFzcyBMUkdlbmVyYXRlZFRhYmxlLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBWZXJzaW9uRXJyb3IoWWFjY0Vycm9yKTogcGFzcworCitjbGFzcyBMUlRhYmxlKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmxyX2FjdGlvbiA9IE5vbmUKKyAgICAgICAgc2VsZi5scl9nb3RvID0gTm9uZQorICAgICAgICBzZWxmLmxyX3Byb2R1Y3Rpb25zID0gTm9uZQorICAgICAgICBzZWxmLmxyX21ldGhvZCA9IE5vbmUKKworICAgIGRlZiByZWFkX3RhYmxlKHNlbGYsbW9kdWxlKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShtb2R1bGUsdHlwZXMuTW9kdWxlVHlwZSk6CisgICAgICAgICAgICBwYXJzZXRhYiA9IG1vZHVsZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDM6CisgICAgICAgICAgICAgICAgZXhlYygiaW1wb3J0ICVzIGFzIHBhcnNldGFiIiAlIG1vZHVsZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZW52ID0geyB9CisgICAgICAgICAgICAgICAgZXhlYygiaW1wb3J0ICVzIGFzIHBhcnNldGFiIiAlIG1vZHVsZSwgZW52LCBlbnYpCisgICAgICAgICAgICAgICAgcGFyc2V0YWIgPSBlbnZbJ3BhcnNldGFiJ10KKworICAgICAgICBpZiBwYXJzZXRhYi5fdGFidmVyc2lvbiAhPSBfX3RhYnZlcnNpb25fXzoKKyAgICAgICAgICAgIHJhaXNlIFZlcnNpb25FcnJvcigieWFjYyB0YWJsZSBmaWxlIHZlcnNpb24gaXMgb3V0IG9mIGRhdGUiKQorCisgICAgICAgIHNlbGYubHJfYWN0aW9uID0gcGFyc2V0YWIuX2xyX2FjdGlvbgorICAgICAgICBzZWxmLmxyX2dvdG8gPSBwYXJzZXRhYi5fbHJfZ290bworCisgICAgICAgIHNlbGYubHJfcHJvZHVjdGlvbnMgPSBbXQorICAgICAgICBmb3IgcCBpbiBwYXJzZXRhYi5fbHJfcHJvZHVjdGlvbnM6CisgICAgICAgICAgICBzZWxmLmxyX3Byb2R1Y3Rpb25zLmFwcGVuZChNaW5pUHJvZHVjdGlvbigqcCkpCisKKyAgICAgICAgc2VsZi5scl9tZXRob2QgPSBwYXJzZXRhYi5fbHJfbWV0aG9kCisgICAgICAgIHJldHVybiBwYXJzZXRhYi5fbHJfc2lnbmF0dXJlCisKKyAgICBkZWYgcmVhZF9waWNrbGUoc2VsZixmaWxlbmFtZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCBjUGlja2xlIGFzIHBpY2tsZQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBpbXBvcnQgcGlja2xlCisKKyAgICAgICAgaW5fZiA9IG9wZW4oZmlsZW5hbWUsInJiIikKKworICAgICAgICB0YWJ2ZXJzaW9uID0gcGlja2xlLmxvYWQoaW5fZikKKyAgICAgICAgaWYgdGFidmVyc2lvbiAhPSBfX3RhYnZlcnNpb25fXzoKKyAgICAgICAgICAgIHJhaXNlIFZlcnNpb25FcnJvcigieWFjYyB0YWJsZSBmaWxlIHZlcnNpb24gaXMgb3V0IG9mIGRhdGUiKQorICAgICAgICBzZWxmLmxyX21ldGhvZCA9IHBpY2tsZS5sb2FkKGluX2YpCisgICAgICAgIHNpZ25hdHVyZSAgICAgID0gcGlja2xlLmxvYWQoaW5fZikKKyAgICAgICAgc2VsZi5scl9hY3Rpb24gPSBwaWNrbGUubG9hZChpbl9mKQorICAgICAgICBzZWxmLmxyX2dvdG8gICA9IHBpY2tsZS5sb2FkKGluX2YpCisgICAgICAgIHByb2R1Y3Rpb25zICAgID0gcGlja2xlLmxvYWQoaW5fZikKKworICAgICAgICBzZWxmLmxyX3Byb2R1Y3Rpb25zID0gW10KKyAgICAgICAgZm9yIHAgaW4gcHJvZHVjdGlvbnM6CisgICAgICAgICAgICBzZWxmLmxyX3Byb2R1Y3Rpb25zLmFwcGVuZChNaW5pUHJvZHVjdGlvbigqcCkpCisKKyAgICAgICAgaW5fZi5jbG9zZSgpCisgICAgICAgIHJldHVybiBzaWduYXR1cmUKKworICAgICMgQmluZCBhbGwgcHJvZHVjdGlvbiBmdW5jdGlvbiBuYW1lcyB0byBjYWxsYWJsZSBvYmplY3RzIGluIHBkaWN0CisgICAgZGVmIGJpbmRfY2FsbGFibGVzKHNlbGYscGRpY3QpOgorICAgICAgICBmb3IgcCBpbiBzZWxmLmxyX3Byb2R1Y3Rpb25zOgorICAgICAgICAgICAgcC5iaW5kKHBkaWN0KQorICAgIAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAgICAgICAgICAgICAgICAgICAgICAgICAgID09PSBMUiBHZW5lcmF0b3IgPT09CisjCisjIFRoZSBmb2xsb3dpbmcgY2xhc3NlcyBhbmQgZnVuY3Rpb25zIGFyZSB1c2VkIHRvIGdlbmVyYXRlIExSIHBhcnNpbmcgdGFibGVzIG9uIAorIyBhIGdyYW1tYXIuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgZGlncmFwaCgpCisjIHRyYXZlcnNlKCkKKyMKKyMgVGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zIGFyZSB1c2VkIHRvIGNvbXB1dGUgc2V0IHZhbHVlZCBmdW5jdGlvbnMKKyMgb2YgdGhlIGZvcm06CisjCisjICAgICBGKHgpID0gRicoeCkgVSBVe0YoeSkgfCB4IFIgeX0KKyMKKyMgVGhpcyBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlIHZhbHVlcyBvZiBSZWFkKCkgc2V0cyBhcyB3ZWxsIGFzIEZPTExPVyBzZXRzCisjIGluIExBTFIoMSkgZ2VuZXJhdGlvbi4KKyMKKyMgSW5wdXRzOiAgWCAgICAtIEFuIGlucHV0IHNldAorIyAgICAgICAgICBSICAgIC0gQSByZWxhdGlvbgorIyAgICAgICAgICBGUCAgIC0gU2V0LXZhbHVlZCBmdW5jdGlvbgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZGVmIGRpZ3JhcGgoWCxSLEZQKToKKyAgICBOID0geyB9CisgICAgZm9yIHggaW4gWDoKKyAgICAgICBOW3hdID0gMAorICAgIHN0YWNrID0gW10KKyAgICBGID0geyB9CisgICAgZm9yIHggaW4gWDoKKyAgICAgICAgaWYgTlt4XSA9PSAwOiB0cmF2ZXJzZSh4LE4sc3RhY2ssRixYLFIsRlApCisgICAgcmV0dXJuIEYKKworZGVmIHRyYXZlcnNlKHgsTixzdGFjayxGLFgsUixGUCk6CisgICAgc3RhY2suYXBwZW5kKHgpCisgICAgZCA9IGxlbihzdGFjaykKKyAgICBOW3hdID0gZAorICAgIEZbeF0gPSBGUCh4KSAgICAgICAgICAgICAjIEYoWCkgPC0gRicoeCkKKworICAgIHJlbCA9IFIoeCkgICAgICAgICAgICAgICAjIEdldCB5J3MgcmVsYXRlZCB0byB4CisgICAgZm9yIHkgaW4gcmVsOgorICAgICAgICBpZiBOW3ldID09IDA6CisgICAgICAgICAgICAgdHJhdmVyc2UoeSxOLHN0YWNrLEYsWCxSLEZQKQorICAgICAgICBOW3hdID0gbWluKE5beF0sTlt5XSkKKyAgICAgICAgZm9yIGEgaW4gRi5nZXQoeSxbXSk6CisgICAgICAgICAgICBpZiBhIG5vdCBpbiBGW3hdOiBGW3hdLmFwcGVuZChhKQorICAgIGlmIE5beF0gPT0gZDoKKyAgICAgICBOW3N0YWNrWy0xXV0gPSBNQVhJTlQKKyAgICAgICBGW3N0YWNrWy0xXV0gPSBGW3hdCisgICAgICAgZWxlbWVudCA9IHN0YWNrLnBvcCgpCisgICAgICAgd2hpbGUgZWxlbWVudCAhPSB4OgorICAgICAgICAgICBOW3N0YWNrWy0xXV0gPSBNQVhJTlQKKyAgICAgICAgICAgRltzdGFja1stMV1dID0gRlt4XQorICAgICAgICAgICBlbGVtZW50ID0gc3RhY2sucG9wKCkKKworY2xhc3MgTEFMUkVycm9yKFlhY2NFcnJvcik6IHBhc3MKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTFJHZW5lcmF0ZWRUYWJsZSA9PQorIworIyBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIExSIHRhYmxlIGdlbmVyYXRpb24gYWxnb3JpdGhtLiAgVGhlcmUgYXJlIG5vCisjIHB1YmxpYyBtZXRob2RzIGV4Y2VwdCBmb3Igd3JpdGUoKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBMUkdlbmVyYXRlZFRhYmxlKExSVGFibGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLGdyYW1tYXIsbWV0aG9kPSdMQUxSJyxsb2c9Tm9uZSk6CisgICAgICAgIGlmIG1ldGhvZCBub3QgaW4gWydTTFInLCdMQUxSJ106CisgICAgICAgICAgICByYWlzZSBMQUxSRXJyb3IoIlVuc3VwcG9ydGVkIG1ldGhvZCAlcyIgJSBtZXRob2QpCisKKyAgICAgICAgc2VsZi5ncmFtbWFyID0gZ3JhbW1hcgorICAgICAgICBzZWxmLmxyX21ldGhvZCA9IG1ldGhvZAorCisgICAgICAgICMgU2V0IHVwIHRoZSBsb2dnZXIKKyAgICAgICAgaWYgbm90IGxvZzoKKyAgICAgICAgICAgIGxvZyA9IE51bGxMb2dnZXIoKQorICAgICAgICBzZWxmLmxvZyA9IGxvZworCisgICAgICAgICMgSW50ZXJuYWwgYXR0cmlidXRlcworICAgICAgICBzZWxmLmxyX2FjdGlvbiAgICAgPSB7fSAgICAgICAgIyBBY3Rpb24gdGFibGUKKyAgICAgICAgc2VsZi5scl9nb3RvICAgICAgID0ge30gICAgICAgICMgR290byB0YWJsZQorICAgICAgICBzZWxmLmxyX3Byb2R1Y3Rpb25zICA9IGdyYW1tYXIuUHJvZHVjdGlvbnMgICAgIyBDb3B5IG9mIGdyYW1tYXIgUHJvZHVjdGlvbiBhcnJheQorICAgICAgICBzZWxmLmxyX2dvdG9fY2FjaGUgPSB7fSAgICAgICAgIyBDYWNoZSBvZiBjb21wdXRlZCBnb3RvcworICAgICAgICBzZWxmLmxyMF9jaWRoYXNoICAgPSB7fSAgICAgICAgIyBDYWNoZSBvZiBjbG9zdXJlcworCisgICAgICAgIHNlbGYuX2FkZF9jb3VudCAgICA9IDAgICAgICAgICAjIEludGVybmFsIGNvdW50ZXIgdXNlZCB0byBkZXRlY3QgY3ljbGVzCisKKyAgICAgICAgIyBEaWFnb25pc3RpYyBpbmZvcm1hdGlvbiBmaWxsZWQgaW4gYnkgdGhlIHRhYmxlIGdlbmVyYXRvcgorICAgICAgICBzZWxmLnNyX2NvbmZsaWN0ICAgPSAwCisgICAgICAgIHNlbGYucnJfY29uZmxpY3QgICA9IDAKKyAgICAgICAgc2VsZi5jb25mbGljdHMgICAgID0gW10gICAgICAgICMgTGlzdCBvZiBjb25mbGljdHMKKworICAgICAgICBzZWxmLnNyX2NvbmZsaWN0cyAgPSBbXQorICAgICAgICBzZWxmLnJyX2NvbmZsaWN0cyAgPSBbXQorCisgICAgICAgICMgQnVpbGQgdGhlIHRhYmxlcworICAgICAgICBzZWxmLmdyYW1tYXIuYnVpbGRfbHJpdGVtcygpCisgICAgICAgIHNlbGYuZ3JhbW1hci5jb21wdXRlX2ZpcnN0KCkKKyAgICAgICAgc2VsZi5ncmFtbWFyLmNvbXB1dGVfZm9sbG93KCkKKyAgICAgICAgc2VsZi5scl9wYXJzZV90YWJsZSgpCisKKyAgICAjIENvbXB1dGUgdGhlIExSKDApIGNsb3N1cmUgb3BlcmF0aW9uIG9uIEksIHdoZXJlIEkgaXMgYSBzZXQgb2YgTFIoMCkgaXRlbXMuCisKKyAgICBkZWYgbHIwX2Nsb3N1cmUoc2VsZixJKToKKyAgICAgICAgc2VsZi5fYWRkX2NvdW50ICs9IDEKKworICAgICAgICAjIEFkZCBldmVyeXRoaW5nIGluIEkgdG8gSgorICAgICAgICBKID0gSVs6XQorICAgICAgICBkaWRhZGQgPSAxCisgICAgICAgIHdoaWxlIGRpZGFkZDoKKyAgICAgICAgICAgIGRpZGFkZCA9IDAKKyAgICAgICAgICAgIGZvciBqIGluIEo6CisgICAgICAgICAgICAgICAgZm9yIHggaW4gai5scl9hZnRlcjoKKyAgICAgICAgICAgICAgICAgICAgaWYgZ2V0YXR0cih4LCJscjBfYWRkZWQiLDApID09IHNlbGYuX2FkZF9jb3VudDogY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgIyBBZGQgQiAtLT4gLkcgdG8gSgorICAgICAgICAgICAgICAgICAgICBKLmFwcGVuZCh4LmxyX25leHQpCisgICAgICAgICAgICAgICAgICAgIHgubHIwX2FkZGVkID0gc2VsZi5fYWRkX2NvdW50CisgICAgICAgICAgICAgICAgICAgIGRpZGFkZCA9IDEKKworICAgICAgICByZXR1cm4gSgorCisgICAgIyBDb21wdXRlIHRoZSBMUigwKSBnb3RvIGZ1bmN0aW9uIGdvdG8oSSxYKSB3aGVyZSBJIGlzIGEgc2V0CisgICAgIyBvZiBMUigwKSBpdGVtcyBhbmQgWCBpcyBhIGdyYW1tYXIgc3ltYm9sLiAgIFRoaXMgZnVuY3Rpb24gaXMgd3JpdHRlbgorICAgICMgaW4gYSB3YXkgdGhhdCBndWFyYW50ZWVzIHVuaXF1ZW5lc3Mgb2YgdGhlIGdlbmVyYXRlZCBnb3RvIHNldHMKKyAgICAjIChpLmUuIHRoZSBzYW1lIGdvdG8gc2V0IHdpbGwgbmV2ZXIgYmUgcmV0dXJuZWQgYXMgdHdvIGRpZmZlcmVudCBQeXRob24KKyAgICAjIG9iamVjdHMpLiAgV2l0aCB1bmlxdWVuZXNzLCB3ZSBjYW4gbGF0ZXIgZG8gZmFzdCBzZXQgY29tcGFyaXNvbnMgdXNpbmcKKyAgICAjIGlkKG9iaikgaW5zdGVhZCBvZiBlbGVtZW50LXdpc2UgY29tcGFyaXNvbi4KKworICAgIGRlZiBscjBfZ290byhzZWxmLEkseCk6CisgICAgICAgICMgRmlyc3Qgd2UgbG9vayBmb3IgYSBwcmV2aW91c2x5IGNhY2hlZCBlbnRyeQorICAgICAgICBnID0gc2VsZi5scl9nb3RvX2NhY2hlLmdldCgoaWQoSSkseCksTm9uZSkKKyAgICAgICAgaWYgZzogcmV0dXJuIGcKKworICAgICAgICAjIE5vdyB3ZSBnZW5lcmF0ZSB0aGUgZ290byBzZXQgaW4gYSB3YXkgdGhhdCBndWFyYW50ZWVzIHVuaXF1ZW5lc3MKKyAgICAgICAgIyBvZiB0aGUgcmVzdWx0CisKKyAgICAgICAgcyA9IHNlbGYubHJfZ290b19jYWNoZS5nZXQoeCxOb25lKQorICAgICAgICBpZiBub3QgczoKKyAgICAgICAgICAgIHMgPSB7IH0KKyAgICAgICAgICAgIHNlbGYubHJfZ290b19jYWNoZVt4XSA9IHMKKworICAgICAgICBncyA9IFsgXQorICAgICAgICBmb3IgcCBpbiBJOgorICAgICAgICAgICAgbiA9IHAubHJfbmV4dAorICAgICAgICAgICAgaWYgbiBhbmQgbi5scl9iZWZvcmUgPT0geDoKKyAgICAgICAgICAgICAgICBzMSA9IHMuZ2V0KGlkKG4pLE5vbmUpCisgICAgICAgICAgICAgICAgaWYgbm90IHMxOgorICAgICAgICAgICAgICAgICAgICBzMSA9IHsgfQorICAgICAgICAgICAgICAgICAgICBzW2lkKG4pXSA9IHMxCisgICAgICAgICAgICAgICAgZ3MuYXBwZW5kKG4pCisgICAgICAgICAgICAgICAgcyA9IHMxCisgICAgICAgIGcgPSBzLmdldCgnJGVuZCcsTm9uZSkKKyAgICAgICAgaWYgbm90IGc6CisgICAgICAgICAgICBpZiBnczoKKyAgICAgICAgICAgICAgICBnID0gc2VsZi5scjBfY2xvc3VyZShncykKKyAgICAgICAgICAgICAgICBzWyckZW5kJ10gPSBnCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNbJyRlbmQnXSA9IGdzCisgICAgICAgIHNlbGYubHJfZ290b19jYWNoZVsoaWQoSSkseCldID0gZworICAgICAgICByZXR1cm4gZworCisgICAgIyBDb21wdXRlIHRoZSBMUigwKSBzZXRzIG9mIGl0ZW0gZnVuY3Rpb24KKyAgICBkZWYgbHIwX2l0ZW1zKHNlbGYpOgorCisgICAgICAgIEMgPSBbIHNlbGYubHIwX2Nsb3N1cmUoW3NlbGYuZ3JhbW1hci5Qcm9kdWN0aW9uc1swXS5scl9uZXh0XSkgXQorICAgICAgICBpID0gMAorICAgICAgICBmb3IgSSBpbiBDOgorICAgICAgICAgICAgc2VsZi5scjBfY2lkaGFzaFtpZChJKV0gPSBpCisgICAgICAgICAgICBpICs9IDEKKworICAgICAgICAjIExvb3Agb3ZlciB0aGUgaXRlbXMgaW4gQyBhbmQgZWFjaCBncmFtbWFyIHN5bWJvbHMKKyAgICAgICAgaSA9IDAKKyAgICAgICAgd2hpbGUgaSA8IGxlbihDKToKKyAgICAgICAgICAgIEkgPSBDW2ldCisgICAgICAgICAgICBpICs9IDEKKworICAgICAgICAgICAgIyBDb2xsZWN0IGFsbCBvZiB0aGUgc3ltYm9scyB0aGF0IGNvdWxkIHBvc3NpYmx5IGJlIGluIHRoZSBnb3RvKEksWCkgc2V0cworICAgICAgICAgICAgYXN5bXMgPSB7IH0KKyAgICAgICAgICAgIGZvciBpaSBpbiBJOgorICAgICAgICAgICAgICAgIGZvciBzIGluIGlpLnVzeW1zOgorICAgICAgICAgICAgICAgICAgICBhc3ltc1tzXSA9IE5vbmUKKworICAgICAgICAgICAgZm9yIHggaW4gYXN5bXM6CisgICAgICAgICAgICAgICAgZyA9IHNlbGYubHIwX2dvdG8oSSx4KQorICAgICAgICAgICAgICAgIGlmIG5vdCBnOiAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiBpZChnKSBpbiBzZWxmLmxyMF9jaWRoYXNoOiBjb250aW51ZQorICAgICAgICAgICAgICAgIHNlbGYubHIwX2NpZGhhc2hbaWQoZyldID0gbGVuKEMpCisgICAgICAgICAgICAgICAgQy5hcHBlbmQoZykKKworICAgICAgICByZXR1cm4gQworCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgICAgICAgICAgICAgICAgICAgICAgID09PT0gTEFMUigxKSBQYXJzaW5nID09PT0KKyAgICAjCisgICAgIyBMQUxSKDEpIHBhcnNpbmcgaXMgYWxtb3N0IGV4YWN0bHkgdGhlIHNhbWUgYXMgU0xSIGV4Y2VwdCB0aGF0IGluc3RlYWQgb2YKKyAgICAjIHJlbHlpbmcgdXBvbiBGb2xsb3coKSBzZXRzIHdoZW4gcGVyZm9ybWluZyByZWR1Y3Rpb25zLCBhIG1vcmUgc2VsZWN0aXZlCisgICAgIyBsb29rYWhlYWQgc2V0IHRoYXQgaW5jb3Jwb3JhdGVzIHRoZSBzdGF0ZSBvZiB0aGUgTFIoMCkgbWFjaGluZSBpcyB1dGlsaXplZC4KKyAgICAjIFRodXMsIHdlIG1haW5seSBqdXN0IGhhdmUgdG8gZm9jdXMgb24gY2FsY3VsYXRpbmcgdGhlIGxvb2thaGVhZCBzZXRzLgorICAgICMKKyAgICAjIFRoZSBtZXRob2QgdXNlZCBoZXJlIGlzIGR1ZSB0byBEZVJlbWVyIGFuZCBQZW5uZWxvICgxOTgyKS4KKyAgICAjCisgICAgIyBEZVJlbWVyLCBGLiBMLiwgYW5kIFQuIEouIFBlbm5lbG86ICJFZmZpY2llbnQgQ29tcHV0YXRpb24gb2YgTEFMUigxKQorICAgICMgICAgIExvb2thaGVhZCBTZXRzIiwgQUNNIFRyYW5zYWN0aW9ucyBvbiBQcm9ncmFtbWluZyBMYW5ndWFnZXMgYW5kIFN5c3RlbXMsCisgICAgIyAgICAgVm9sLiA0LCBOby4gNCwgT2N0LiAxOTgyLCBwcC4gNjE1LTY0OQorICAgICMKKyAgICAjIEZ1cnRoZXIgZGV0YWlscyBjYW4gYWxzbyBiZSBmb3VuZCBpbjoKKyAgICAjCisgICAgIyAgSi4gVHJlbWJsYXkgYW5kIFAuIFNvcmVuc29uLCAiVGhlIFRoZW9yeSBhbmQgUHJhY3RpY2Ugb2YgQ29tcGlsZXIgV3JpdGluZyIsCisgICAgIyAgICAgIE1jR3Jhdy1IaWxsIEJvb2sgQ29tcGFueSwgKDE5ODUpLgorICAgICMKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBjb21wdXRlX251bGxhYmxlX25vbnRlcm1pbmFscygpCisgICAgIworICAgICMgQ3JlYXRlcyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBhbGwgb2YgdGhlIG5vbi10ZXJtaW5hbHMgdGhhdCBtaWdodCBwcm9kdWNlCisgICAgIyBhbiBlbXB0eSBwcm9kdWN0aW9uLgorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBjb21wdXRlX251bGxhYmxlX25vbnRlcm1pbmFscyhzZWxmKToKKyAgICAgICAgbnVsbGFibGUgPSB7fQorICAgICAgICBudW1fbnVsbGFibGUgPSAwCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgIGZvciBwIGluIHNlbGYuZ3JhbW1hci5Qcm9kdWN0aW9uc1sxOl06CisgICAgICAgICAgICAgICBpZiBwLmxlbiA9PSAwOgorICAgICAgICAgICAgICAgICAgICBudWxsYWJsZVtwLm5hbWVdID0gMQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgZm9yIHQgaW4gcC5wcm9kOgorICAgICAgICAgICAgICAgICAgICBpZiBub3QgdCBpbiBudWxsYWJsZTogYnJlYWsKKyAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG51bGxhYmxlW3AubmFtZV0gPSAxCisgICAgICAgICAgIGlmIGxlbihudWxsYWJsZSkgPT0gbnVtX251bGxhYmxlOiBicmVhaworICAgICAgICAgICBudW1fbnVsbGFibGUgPSBsZW4obnVsbGFibGUpCisgICAgICAgIHJldHVybiBudWxsYWJsZQorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgZmluZF9ub250ZXJtaW5hbF90cmFucyhDKQorICAgICMKKyAgICAjIEdpdmVuIGEgc2V0IG9mIExSKDApIGl0ZW1zLCB0aGlzIGZ1bmN0aW9ucyBmaW5kcyBhbGwgb2YgdGhlIG5vbi10ZXJtaW5hbAorICAgICMgdHJhbnNpdGlvbnMuICAgIFRoZXNlIGFyZSB0cmFuc2l0aW9ucyBpbiB3aGljaCBhIGRvdCBhcHBlYXJzIGltbWVkaWF0ZWx5IGJlZm9yZQorICAgICMgYSBub24tdGVybWluYWwuICAgUmV0dXJucyBhIGxpc3Qgb2YgdHVwbGVzIG9mIHRoZSBmb3JtIChzdGF0ZSxOKSB3aGVyZSBzdGF0ZQorICAgICMgaXMgdGhlIHN0YXRlIG51bWJlciBhbmQgTiBpcyB0aGUgbm9udGVybWluYWwgc3ltYm9sLgorICAgICMKKyAgICAjIFRoZSBpbnB1dCBDIGlzIHRoZSBzZXQgb2YgTFIoMCkgaXRlbXMuCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIGZpbmRfbm9udGVybWluYWxfdHJhbnNpdGlvbnMoc2VsZixDKToKKyAgICAgICAgIHRyYW5zID0gW10KKyAgICAgICAgIGZvciBzdGF0ZSBpbiByYW5nZShsZW4oQykpOgorICAgICAgICAgICAgIGZvciBwIGluIENbc3RhdGVdOgorICAgICAgICAgICAgICAgICBpZiBwLmxyX2luZGV4IDwgcC5sZW4gLSAxOgorICAgICAgICAgICAgICAgICAgICAgIHQgPSAoc3RhdGUscC5wcm9kW3AubHJfaW5kZXgrMV0pCisgICAgICAgICAgICAgICAgICAgICAgaWYgdFsxXSBpbiBzZWxmLmdyYW1tYXIuTm9udGVybWluYWxzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHQgbm90IGluIHRyYW5zOiB0cmFucy5hcHBlbmQodCkKKyAgICAgICAgICAgICBzdGF0ZSA9IHN0YXRlICsgMQorICAgICAgICAgcmV0dXJuIHRyYW5zCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBkcl9yZWxhdGlvbigpCisgICAgIworICAgICMgQ29tcHV0ZXMgdGhlIERSKHAsQSkgcmVsYXRpb25zaGlwcyBmb3Igbm9uLXRlcm1pbmFsIHRyYW5zaXRpb25zLiAgVGhlIGlucHV0CisgICAgIyBpcyBhIHR1cGxlIChzdGF0ZSxOKSB3aGVyZSBzdGF0ZSBpcyBhIG51bWJlciBhbmQgTiBpcyBhIG5vbnRlcm1pbmFsIHN5bWJvbC4KKyAgICAjCisgICAgIyBSZXR1cm5zIGEgbGlzdCBvZiB0ZXJtaW5hbHMuCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIGRyX3JlbGF0aW9uKHNlbGYsQyx0cmFucyxudWxsYWJsZSk6CisgICAgICAgIGRyX3NldCA9IHsgfQorICAgICAgICBzdGF0ZSxOID0gdHJhbnMKKyAgICAgICAgdGVybXMgPSBbXQorCisgICAgICAgIGcgPSBzZWxmLmxyMF9nb3RvKENbc3RhdGVdLE4pCisgICAgICAgIGZvciBwIGluIGc6CisgICAgICAgICAgIGlmIHAubHJfaW5kZXggPCBwLmxlbiAtIDE6CisgICAgICAgICAgICAgICBhID0gcC5wcm9kW3AubHJfaW5kZXgrMV0KKyAgICAgICAgICAgICAgIGlmIGEgaW4gc2VsZi5ncmFtbWFyLlRlcm1pbmFsczoKKyAgICAgICAgICAgICAgICAgICBpZiBhIG5vdCBpbiB0ZXJtczogdGVybXMuYXBwZW5kKGEpCisKKyAgICAgICAgIyBUaGlzIGV4dHJhIGJpdCBpcyB0byBoYW5kbGUgdGhlIHN0YXJ0IHN0YXRlCisgICAgICAgIGlmIHN0YXRlID09IDAgYW5kIE4gPT0gc2VsZi5ncmFtbWFyLlByb2R1Y3Rpb25zWzBdLnByb2RbMF06CisgICAgICAgICAgIHRlcm1zLmFwcGVuZCgnJGVuZCcpCisKKyAgICAgICAgcmV0dXJuIHRlcm1zCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyByZWFkc19yZWxhdGlvbigpCisgICAgIworICAgICMgQ29tcHV0ZXMgdGhlIFJFQURTKCkgcmVsYXRpb24gKHAsQSkgUkVBRFMgKHQsQykuCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIHJlYWRzX3JlbGF0aW9uKHNlbGYsQywgdHJhbnMsIGVtcHR5KToKKyAgICAgICAgIyBMb29rIGZvciBlbXB0eSB0cmFuc2l0aW9ucworICAgICAgICByZWwgPSBbXQorICAgICAgICBzdGF0ZSwgTiA9IHRyYW5zCisKKyAgICAgICAgZyA9IHNlbGYubHIwX2dvdG8oQ1tzdGF0ZV0sTikKKyAgICAgICAgaiA9IHNlbGYubHIwX2NpZGhhc2guZ2V0KGlkKGcpLC0xKQorICAgICAgICBmb3IgcCBpbiBnOgorICAgICAgICAgICAgaWYgcC5scl9pbmRleCA8IHAubGVuIC0gMToKKyAgICAgICAgICAgICAgICAgYSA9IHAucHJvZFtwLmxyX2luZGV4ICsgMV0KKyAgICAgICAgICAgICAgICAgaWYgYSBpbiBlbXB0eToKKyAgICAgICAgICAgICAgICAgICAgICByZWwuYXBwZW5kKChqLGEpKQorCisgICAgICAgIHJldHVybiByZWwKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIGNvbXB1dGVfbG9va2JhY2tfaW5jbHVkZXMoKQorICAgICMKKyAgICAjIERldGVybWluZXMgdGhlIGxvb2tiYWNrIGFuZCBpbmNsdWRlcyByZWxhdGlvbnMKKyAgICAjCisgICAgIyBMT09LQkFDSzoKKyAgICAjCisgICAgIyBUaGlzIHJlbGF0aW9uIGlzIGRldGVybWluZWQgYnkgcnVubmluZyB0aGUgTFIoMCkgc3RhdGUgbWFjaGluZSBmb3J3YXJkLgorICAgICMgRm9yIGV4YW1wbGUsIHN0YXJ0aW5nIHdpdGggYSBwcm9kdWN0aW9uICJOIDogLiBBIEIgQyIsIHdlIHJ1biBpdCBmb3J3YXJkCisgICAgIyB0byBvYnRhaW4gIk4gOiBBIEIgQyAuIiAgIFdlIHRoZW4gYnVpbGQgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGlzIGZpbmFsCisgICAgIyBzdGF0ZSBhbmQgdGhlIHN0YXJ0aW5nIHN0YXRlLiAgIFRoZXNlIHJlbGF0aW9uc2hpcHMgYXJlIHN0b3JlZCBpbiBhIGRpY3Rpb25hcnkKKyAgICAjIGxvb2tkaWN0LgorICAgICMKKyAgICAjIElOQ0xVREVTOgorICAgICMKKyAgICAjIENvbXB1dGVzIHRoZSBJTkNMVURFKCkgcmVsYXRpb24gKHAsQSkgSU5DTFVERVMgKHAnLEIpLgorICAgICMKKyAgICAjIFRoaXMgcmVsYXRpb24gaXMgdXNlZCB0byBkZXRlcm1pbmUgbm9uLXRlcm1pbmFsIHRyYW5zaXRpb25zIHRoYXQgb2NjdXIKKyAgICAjIGluc2lkZSBvZiBvdGhlciBub24tdGVybWluYWwgdHJhbnNpdGlvbiBzdGF0ZXMuICAgKHAsQSkgSU5DTFVERVMgKHAnLCBCKQorICAgICMgaWYgdGhlIGZvbGxvd2luZyBob2xkczoKKyAgICAjCisgICAgIyAgICAgICBCIC0+IExBVCwgd2hlcmUgVCAtPiBlcHNpbG9uIGFuZCBwJyAtTC0+IHAKKyAgICAjCisgICAgIyBMIGlzIGVzc2VudGlhbGx5IGEgcHJlZml4ICh3aGljaCBtYXkgYmUgZW1wdHkpLCBUIGlzIGEgc3VmZml4IHRoYXQgbXVzdCBiZQorICAgICMgYWJsZSB0byBkZXJpdmUgYW4gZW1wdHkgc3RyaW5nLiAgU3RhdGUgcCcgbXVzdCBsZWFkIHRvIHN0YXRlIHAgd2l0aCB0aGUgc3RyaW5nIEwuCisgICAgIworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBjb21wdXRlX2xvb2tiYWNrX2luY2x1ZGVzKHNlbGYsQyx0cmFucyxudWxsYWJsZSk6CisKKyAgICAgICAgbG9va2RpY3QgPSB7fSAgICAgICAgICAjIERpY3Rpb25hcnkgb2YgbG9va2JhY2sgcmVsYXRpb25zCisgICAgICAgIGluY2x1ZGVkaWN0ID0ge30gICAgICAgIyBEaWN0aW9uYXJ5IG9mIGluY2x1ZGUgcmVsYXRpb25zCisKKyAgICAgICAgIyBNYWtlIGEgZGljdGlvbmFyeSBvZiBub24tdGVybWluYWwgdHJhbnNpdGlvbnMKKyAgICAgICAgZHRyYW5zID0ge30KKyAgICAgICAgZm9yIHQgaW4gdHJhbnM6CisgICAgICAgICAgICBkdHJhbnNbdF0gPSAxCisKKyAgICAgICAgIyBMb29wIG92ZXIgYWxsIHRyYW5zaXRpb25zIGFuZCBjb21wdXRlIGxvb2tiYWNrcyBhbmQgaW5jbHVkZXMKKyAgICAgICAgZm9yIHN0YXRlLE4gaW4gdHJhbnM6CisgICAgICAgICAgICBsb29rYiA9IFtdCisgICAgICAgICAgICBpbmNsdWRlcyA9IFtdCisgICAgICAgICAgICBmb3IgcCBpbiBDW3N0YXRlXToKKyAgICAgICAgICAgICAgICBpZiBwLm5hbWUgIT0gTjogY29udGludWUKKworICAgICAgICAgICAgICAgICMgT2theSwgd2UgaGF2ZSBhIG5hbWUgbWF0Y2guICBXZSBub3cgZm9sbG93IHRoZSBwcm9kdWN0aW9uIGFsbCB0aGUgd2F5CisgICAgICAgICAgICAgICAgIyB0aHJvdWdoIHRoZSBzdGF0ZSBtYWNoaW5lIHVudGlsIHdlIGdldCB0aGUgLiBvbiB0aGUgcmlnaHQgaGFuZCBzaWRlCisKKyAgICAgICAgICAgICAgICBscl9pbmRleCA9IHAubHJfaW5kZXgKKyAgICAgICAgICAgICAgICBqID0gc3RhdGUKKyAgICAgICAgICAgICAgICB3aGlsZSBscl9pbmRleCA8IHAubGVuIC0gMToKKyAgICAgICAgICAgICAgICAgICAgIGxyX2luZGV4ID0gbHJfaW5kZXggKyAxCisgICAgICAgICAgICAgICAgICAgICB0ID0gcC5wcm9kW2xyX2luZGV4XQorCisgICAgICAgICAgICAgICAgICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGlzIHN5bWJvbCBhbmQgc3RhdGUgYXJlIGEgbm9uLXRlcm1pbmFsIHRyYW5zaXRpb24KKyAgICAgICAgICAgICAgICAgICAgIGlmIChqLHQpIGluIGR0cmFuczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICMgWWVzLiAgT2theSwgdGhlcmUgaXMgc29tZSBjaGFuY2UgdGhhdCB0aGlzIGlzIGFuIGluY2x1ZGVzIHJlbGF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBvbmx5IHdheSB0byBrbm93IGZvciBjZXJ0YWluIGlzIHdoZXRoZXIgdGhlIHJlc3Qgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHByb2R1Y3Rpb24gZGVyaXZlcyBlbXB0eQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsaSA9IGxyX2luZGV4ICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgbGkgPCBwLmxlbjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcC5wcm9kW2xpXSBpbiBzZWxmLmdyYW1tYXIuVGVybWluYWxzOiBicmVhayAgICAgICMgTm8gZm9yZ2V0IGl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBwLnByb2RbbGldIGluIG51bGxhYmxlOiBicmVhaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaSA9IGxpICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBBcHBlYXJzIHRvIGJlIGEgcmVsYXRpb24gYmV0d2VlbiAoaix0KSBhbmQgKHN0YXRlLE4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzLmFwcGVuZCgoaix0KSkKKworICAgICAgICAgICAgICAgICAgICAgZyA9IHNlbGYubHIwX2dvdG8oQ1tqXSx0KSAgICAgICAgICAgICAgICMgR28gdG8gbmV4dCBzZXQKKyAgICAgICAgICAgICAgICAgICAgIGogPSBzZWxmLmxyMF9jaWRoYXNoLmdldChpZChnKSwtMSkgICAgICMgR28gdG8gbmV4dCBzdGF0ZQorCisgICAgICAgICAgICAgICAgIyBXaGVuIHdlIGdldCBoZXJlLCBqIGlzIHRoZSBmaW5hbCBzdGF0ZSwgbm93IHdlIGhhdmUgdG8gbG9jYXRlIHRoZSBwcm9kdWN0aW9uCisgICAgICAgICAgICAgICAgZm9yIHIgaW4gQ1tqXToKKyAgICAgICAgICAgICAgICAgICAgIGlmIHIubmFtZSAhPSBwLm5hbWU6IGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICBpZiByLmxlbiAhPSBwLmxlbjogICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgaSA9IDAKKyAgICAgICAgICAgICAgICAgICAgICMgVGhpcyBsb29rIGlzIGNvbXBhcmluZyBhIHByb2R1Y3Rpb24gIi4gQSBCIEMiIHdpdGggIkEgQiBDIC4iCisgICAgICAgICAgICAgICAgICAgICB3aGlsZSBpIDwgci5scl9pbmRleDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgci5wcm9kW2ldICE9IHAucHJvZFtpKzFdOiBicmVhaworICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gaSArIDEKKyAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2tiLmFwcGVuZCgoaixyKSkKKyAgICAgICAgICAgIGZvciBpIGluIGluY2x1ZGVzOgorICAgICAgICAgICAgICAgICBpZiBub3QgaSBpbiBpbmNsdWRlZGljdDogaW5jbHVkZWRpY3RbaV0gPSBbXQorICAgICAgICAgICAgICAgICBpbmNsdWRlZGljdFtpXS5hcHBlbmQoKHN0YXRlLE4pKQorICAgICAgICAgICAgbG9va2RpY3RbKHN0YXRlLE4pXSA9IGxvb2tiCisKKyAgICAgICAgcmV0dXJuIGxvb2tkaWN0LGluY2x1ZGVkaWN0CisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBjb21wdXRlX3JlYWRfc2V0cygpCisgICAgIworICAgICMgR2l2ZW4gYSBzZXQgb2YgTFIoMCkgaXRlbXMsIHRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIHJlYWQgc2V0cy4KKyAgICAjCisgICAgIyBJbnB1dHM6ICBDICAgICAgICA9ICBTZXQgb2YgTFIoMCkgaXRlbXMKKyAgICAjICAgICAgICAgIG50cmFucyAgID0gU2V0IG9mIG5vbnRlcm1pbmFsIHRyYW5zaXRpb25zCisgICAgIyAgICAgICAgICBudWxsYWJsZSA9IFNldCBvZiBlbXB0eSB0cmFuc2l0aW9ucworICAgICMKKyAgICAjIFJldHVybnMgYSBzZXQgY29udGFpbmluZyB0aGUgcmVhZCBzZXRzCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIGNvbXB1dGVfcmVhZF9zZXRzKHNlbGYsQywgbnRyYW5zLCBudWxsYWJsZSk6CisgICAgICAgIEZQID0gbGFtYmRhIHg6IHNlbGYuZHJfcmVsYXRpb24oQyx4LG51bGxhYmxlKQorICAgICAgICBSID0gIGxhbWJkYSB4OiBzZWxmLnJlYWRzX3JlbGF0aW9uKEMseCxudWxsYWJsZSkKKyAgICAgICAgRiA9IGRpZ3JhcGgobnRyYW5zLFIsRlApCisgICAgICAgIHJldHVybiBGCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBjb21wdXRlX2ZvbGxvd19zZXRzKCkKKyAgICAjCisgICAgIyBHaXZlbiBhIHNldCBvZiBMUigwKSBpdGVtcywgYSBzZXQgb2Ygbm9uLXRlcm1pbmFsIHRyYW5zaXRpb25zLCBhIHJlYWRzZXQsCisgICAgIyBhbmQgYW4gaW5jbHVkZSBzZXQsIHRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIGZvbGxvdyBzZXRzCisgICAgIworICAgICMgRm9sbG93KHAsQSkgPSBSZWFkKHAsQSkgVSBVIHtGb2xsb3cocCcsQikgfCAocCxBKSBJTkNMVURFUyAocCcsQil9CisgICAgIworICAgICMgSW5wdXRzOgorICAgICMgICAgICAgICAgICBudHJhbnMgICAgID0gU2V0IG9mIG5vbnRlcm1pbmFsIHRyYW5zaXRpb25zCisgICAgIyAgICAgICAgICAgIHJlYWRzZXRzICAgPSBSZWFkc2V0IChwcmV2aW91c2x5IGNvbXB1dGVkKQorICAgICMgICAgICAgICAgICBpbmNsc2V0cyAgID0gSW5jbHVkZSBzZXRzIChwcmV2aW91c2x5IGNvbXB1dGVkKQorICAgICMKKyAgICAjIFJldHVybnMgYSBzZXQgY29udGFpbmluZyB0aGUgZm9sbG93IHNldHMKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgY29tcHV0ZV9mb2xsb3dfc2V0cyhzZWxmLG50cmFucyxyZWFkc2V0cyxpbmNsc2V0cyk6CisgICAgICAgICBGUCA9IGxhbWJkYSB4OiByZWFkc2V0c1t4XQorICAgICAgICAgUiAgPSBsYW1iZGEgeDogaW5jbHNldHMuZ2V0KHgsW10pCisgICAgICAgICBGID0gZGlncmFwaChudHJhbnMsUixGUCkKKyAgICAgICAgIHJldHVybiBGCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBhZGRfbG9va2FoZWFkcygpCisgICAgIworICAgICMgQXR0YWNoZXMgdGhlIGxvb2thaGVhZCBzeW1ib2xzIHRvIGdyYW1tYXIgcnVsZXMuCisgICAgIworICAgICMgSW5wdXRzOiAgICBsb29rYmFja3MgICAgICAgICAtICBTZXQgb2YgbG9va2JhY2sgcmVsYXRpb25zCisgICAgIyAgICAgICAgICAgIGZvbGxvd3NldCAgICAgICAgIC0gIENvbXB1dGVkIGZvbGxvdyBzZXQKKyAgICAjCisgICAgIyBUaGlzIGZ1bmN0aW9uIGRpcmVjdGx5IGF0dGFjaGVzIHRoZSBsb29rYWhlYWRzIHRvIHByb2R1Y3Rpb25zIGNvbnRhaW5lZAorICAgICMgaW4gdGhlIGxvb2tiYWNrcyBzZXQKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgYWRkX2xvb2thaGVhZHMoc2VsZixsb29rYmFja3MsZm9sbG93c2V0KToKKyAgICAgICAgZm9yIHRyYW5zLGxiIGluIGxvb2tiYWNrcy5pdGVtcygpOgorICAgICAgICAgICAgIyBMb29wIG92ZXIgcHJvZHVjdGlvbnMgaW4gbG9va2JhY2sKKyAgICAgICAgICAgIGZvciBzdGF0ZSxwIGluIGxiOgorICAgICAgICAgICAgICAgICBpZiBub3Qgc3RhdGUgaW4gcC5sb29rYWhlYWRzOgorICAgICAgICAgICAgICAgICAgICAgIHAubG9va2FoZWFkc1tzdGF0ZV0gPSBbXQorICAgICAgICAgICAgICAgICBmID0gZm9sbG93c2V0LmdldCh0cmFucyxbXSkKKyAgICAgICAgICAgICAgICAgZm9yIGEgaW4gZjoKKyAgICAgICAgICAgICAgICAgICAgICBpZiBhIG5vdCBpbiBwLmxvb2thaGVhZHNbc3RhdGVdOiBwLmxvb2thaGVhZHNbc3RhdGVdLmFwcGVuZChhKQorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgYWRkX2xhbHJfbG9va2FoZWFkcygpCisgICAgIworICAgICMgVGhpcyBmdW5jdGlvbiBkb2VzIGFsbCBvZiB0aGUgd29yayBvZiBhZGRpbmcgbG9va2FoZWFkIGluZm9ybWF0aW9uIGZvciB1c2UKKyAgICAjIHdpdGggTEFMUiBwYXJzaW5nCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIGFkZF9sYWxyX2xvb2thaGVhZHMoc2VsZixDKToKKyAgICAgICAgIyBEZXRlcm1pbmUgYWxsIG9mIHRoZSBudWxsYWJsZSBub250ZXJtaW5hbHMKKyAgICAgICAgbnVsbGFibGUgPSBzZWxmLmNvbXB1dGVfbnVsbGFibGVfbm9udGVybWluYWxzKCkKKworICAgICAgICAjIEZpbmQgYWxsIG5vbi10ZXJtaW5hbCB0cmFuc2l0aW9ucworICAgICAgICB0cmFucyA9IHNlbGYuZmluZF9ub250ZXJtaW5hbF90cmFuc2l0aW9ucyhDKQorCisgICAgICAgICMgQ29tcHV0ZSByZWFkIHNldHMKKyAgICAgICAgcmVhZHNldHMgPSBzZWxmLmNvbXB1dGVfcmVhZF9zZXRzKEMsdHJhbnMsbnVsbGFibGUpCisKKyAgICAgICAgIyBDb21wdXRlIGxvb2tiYWNrL2luY2x1ZGVzIHJlbGF0aW9ucworICAgICAgICBsb29rZCwgaW5jbHVkZWQgPSBzZWxmLmNvbXB1dGVfbG9va2JhY2tfaW5jbHVkZXMoQyx0cmFucyxudWxsYWJsZSkKKworICAgICAgICAjIENvbXB1dGUgTEFMUiBGT0xMT1cgc2V0cworICAgICAgICBmb2xsb3dzZXRzID0gc2VsZi5jb21wdXRlX2ZvbGxvd19zZXRzKHRyYW5zLHJlYWRzZXRzLGluY2x1ZGVkKQorCisgICAgICAgICMgQWRkIGFsbCBvZiB0aGUgbG9va2FoZWFkcworICAgICAgICBzZWxmLmFkZF9sb29rYWhlYWRzKGxvb2tkLGZvbGxvd3NldHMpCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBscl9wYXJzZV90YWJsZSgpCisgICAgIworICAgICMgVGhpcyBmdW5jdGlvbiBjb25zdHJ1Y3RzIHRoZSBwYXJzZSB0YWJsZXMgZm9yIFNMUiBvciBMQUxSCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGRlZiBscl9wYXJzZV90YWJsZShzZWxmKToKKyAgICAgICAgUHJvZHVjdGlvbnMgPSBzZWxmLmdyYW1tYXIuUHJvZHVjdGlvbnMKKyAgICAgICAgUHJlY2VkZW5jZSAgPSBzZWxmLmdyYW1tYXIuUHJlY2VkZW5jZQorICAgICAgICBnb3RvICAgPSBzZWxmLmxyX2dvdG8gICAgICAgICAjIEdvdG8gYXJyYXkKKyAgICAgICAgYWN0aW9uID0gc2VsZi5scl9hY3Rpb24gICAgICAgIyBBY3Rpb24gYXJyYXkKKyAgICAgICAgbG9nICAgID0gc2VsZi5sb2cgICAgICAgICAgICAgIyBMb2dnZXIgZm9yIG91dHB1dAorCisgICAgICAgIGFjdGlvbnAgPSB7IH0gICAgICAgICAgICAgICAgICMgQWN0aW9uIHByb2R1Y3Rpb24gYXJyYXkgKHRlbXBvcmFyeSkKKyAgICAgICAgCisgICAgICAgIGxvZy5pbmZvKCJQYXJzaW5nIG1ldGhvZDogJXMiLCBzZWxmLmxyX21ldGhvZCkKKworICAgICAgICAjIFN0ZXAgMTogQ29uc3RydWN0IEMgPSB7IEkwLCBJMSwgLi4uIElOfSwgY29sbGVjdGlvbiBvZiBMUigwKSBpdGVtcworICAgICAgICAjIFRoaXMgZGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIHN0YXRlcworCisgICAgICAgIEMgPSBzZWxmLmxyMF9pdGVtcygpCisKKyAgICAgICAgaWYgc2VsZi5scl9tZXRob2QgPT0gJ0xBTFInOgorICAgICAgICAgICAgc2VsZi5hZGRfbGFscl9sb29rYWhlYWRzKEMpCisKKyAgICAgICAgIyBCdWlsZCB0aGUgcGFyc2VyIHRhYmxlLCBzdGF0ZSBieSBzdGF0ZQorICAgICAgICBzdCA9IDAKKyAgICAgICAgZm9yIEkgaW4gQzoKKyAgICAgICAgICAgICMgTG9vcCBvdmVyIGVhY2ggcHJvZHVjdGlvbiBpbiBJCisgICAgICAgICAgICBhY3RsaXN0ID0gWyBdICAgICAgICAgICAgICAjIExpc3Qgb2YgYWN0aW9ucworICAgICAgICAgICAgc3RfYWN0aW9uICA9IHsgfQorICAgICAgICAgICAgc3RfYWN0aW9ucCA9IHsgfQorICAgICAgICAgICAgc3RfZ290byAgICA9IHsgfQorICAgICAgICAgICAgbG9nLmluZm8oIiIpCisgICAgICAgICAgICBsb2cuaW5mbygic3RhdGUgJWQiLCBzdCkKKyAgICAgICAgICAgIGxvZy5pbmZvKCIiKQorICAgICAgICAgICAgZm9yIHAgaW4gSToKKyAgICAgICAgICAgICAgICBsb2cuaW5mbygiICAgICglZCkgJXMiLCBwLm51bWJlciwgc3RyKHApKQorICAgICAgICAgICAgbG9nLmluZm8oIiIpCisKKyAgICAgICAgICAgIGZvciBwIGluIEk6CisgICAgICAgICAgICAgICAgICAgIGlmIHAubGVuID09IHAubHJfaW5kZXggKyAxOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgcC5uYW1lID09ICJTJyI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBTdGFydCBzeW1ib2wuIEFjY2VwdCEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdF9hY3Rpb25bIiRlbmQiXSA9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdF9hY3Rpb25wWyIkZW5kIl0gPSBwCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgV2UgYXJlIGF0IHRoZSBlbmQgb2YgYSBwcm9kdWN0aW9uLiAgUmVkdWNlIQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYubHJfbWV0aG9kID09ICdMQUxSJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFoZWFkcyA9IHAubG9va2FoZWFkc1tzdF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWhlYWRzID0gc2VsZi5ncmFtbWFyLkZvbGxvd1twLm5hbWVdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGEgaW4gbGFoZWFkczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0bGlzdC5hcHBlbmQoKGEscCwicmVkdWNlIHVzaW5nIHJ1bGUgJWQgKCVzKSIgJSAocC5udW1iZXIscCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gc3RfYWN0aW9uLmdldChhLE5vbmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFdob2EuIEhhdmUgYSBzaGlmdC9yZWR1Y2Ugb3IgcmVkdWNlL3JlZHVjZSBjb25mbGljdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgciA+IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBOZWVkIHRvIGRlY2lkZSBvbiBzaGlmdCBvciByZWR1Y2UgaGVyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQnkgZGVmYXVsdCB3ZSBmYXZvciBzaGlmdGluZy4gTmVlZCB0byBhZGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNvbWUgcHJlY2VkZW5jZSBydWxlcyBoZXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmVjLHNsZXZlbCA9IFByb2R1Y3Rpb25zW3N0X2FjdGlvbnBbYV0ubnVtYmVyXS5wcmVjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnByZWMscmxldmVsID0gUHJlY2VkZW5jZS5nZXQoYSwoJ3JpZ2h0JywwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2xldmVsIDwgcmxldmVsKSBvciAoKHNsZXZlbCA9PSBybGV2ZWwpIGFuZCAocnByZWMgPT0gJ2xlZnQnKSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgV2UgcmVhbGx5IG5lZWQgdG8gcmVkdWNlIGhlcmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0X2FjdGlvblthXSA9IC1wLm51bWJlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdF9hY3Rpb25wW2FdID0gcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2xldmVsIGFuZCBub3QgcmxldmVsOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIiAgISBzaGlmdC9yZWR1Y2UgY29uZmxpY3QgZm9yICVzIHJlc29sdmVkIGFzIHJlZHVjZSIsYSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3JfY29uZmxpY3RzLmFwcGVuZCgoc3QsYSwncmVkdWNlJykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2R1Y3Rpb25zW3AubnVtYmVyXS5yZWR1Y2VkICs9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIChzbGV2ZWwgPT0gcmxldmVsKSBhbmQgKHJwcmVjID09ICdub25hc3NvYycpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdF9hY3Rpb25bYV0gPSBOb25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBIbW1tLiBHdWVzcyB3ZSdsbCBrZWVwIHRoZSBzaGlmdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgcmxldmVsOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIiAgISBzaGlmdC9yZWR1Y2UgY29uZmxpY3QgZm9yICVzIHJlc29sdmVkIGFzIHNoaWZ0IixhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zcl9jb25mbGljdHMuYXBwZW5kKChzdCxhLCdzaGlmdCcpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiByIDwgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFJlZHVjZS9yZWR1Y2UgY29uZmxpY3QuICAgSW4gdGhpcyBjYXNlLCB3ZSBmYXZvciB0aGUgcnVsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGhhdCB3YXMgZGVmaW5lZCBmaXJzdCBpbiB0aGUgZ3JhbW1hciBmaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkcCA9IFByb2R1Y3Rpb25zWy1yXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwID0gUHJvZHVjdGlvbnNbcC5udW1iZXJdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgb2xkcC5saW5lID4gcHAubGluZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RfYWN0aW9uW2FdID0gLXAubnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0X2FjdGlvbnBbYV0gPSBwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob3NlbnAscmVqZWN0cCA9IHBwLG9sZHAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZHVjdGlvbnNbcC5udW1iZXJdLnJlZHVjZWQgKz0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9kdWN0aW9uc1tvbGRwLm51bWJlcl0ucmVkdWNlZCAtPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VucCxyZWplY3RwID0gb2xkcCxwcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucnJfY29uZmxpY3RzLmFwcGVuZCgoc3QsY2hvc2VucCxyZWplY3RwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiICAhIHJlZHVjZS9yZWR1Y2UgY29uZmxpY3QgZm9yICVzIHJlc29sdmVkIHVzaW5nIHJ1bGUgJWQgKCVzKSIsIGEsc3RfYWN0aW9ucFthXS5udW1iZXIsIHN0X2FjdGlvbnBbYV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIExBTFJFcnJvcigiVW5rbm93biBjb25mbGljdCBpbiBzdGF0ZSAlZCIgJSBzdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0X2FjdGlvblthXSA9IC1wLm51bWJlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RfYWN0aW9ucFthXSA9IHAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2R1Y3Rpb25zW3AubnVtYmVyXS5yZWR1Y2VkICs9IDEKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBwLmxyX2luZGV4CisgICAgICAgICAgICAgICAgICAgICAgICBhID0gcC5wcm9kW2krMV0gICAgICAgIyBHZXQgc3ltYm9sIHJpZ2h0IGFmdGVyIHRoZSAiLiIKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGEgaW4gc2VsZi5ncmFtbWFyLlRlcm1pbmFsczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnID0gc2VsZi5scjBfZ290byhJLGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiA9IHNlbGYubHIwX2NpZGhhc2guZ2V0KGlkKGcpLC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGogPj0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBXZSBhcmUgaW4gYSBzaGlmdCBzdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RsaXN0LmFwcGVuZCgoYSxwLCJzaGlmdCBhbmQgZ28gdG8gc3RhdGUgJWQiICUgaikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBzdF9hY3Rpb24uZ2V0KGEsTm9uZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgV2hvYSBoYXZlIGEgc2hpZnQvcmVkdWNlIG9yIHNoaWZ0L3NoaWZ0IGNvbmZsaWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiByID4gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiByICE9IGo6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIExBTFJFcnJvcigiU2hpZnQvc2hpZnQgY29uZmxpY3QgaW4gc3RhdGUgJWQiICUgc3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIHIgPCAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgRG8gYSBwcmVjZWRlbmNlIGNoZWNrLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAtICBpZiBwcmVjZWRlbmNlIG9mIHJlZHVjZSBydWxlIGlzIGhpZ2hlciwgd2UgcmVkdWNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAtICBpZiBwcmVjZWRlbmNlIG9mIHJlZHVjZSBpcyBzYW1lIGFuZCBsZWZ0IGFzc29jLCB3ZSByZWR1Y2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIC0gIG90aGVyd2lzZSB3ZSBzaGlmdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJwcmVjLHJsZXZlbCA9IFByb2R1Y3Rpb25zW3N0X2FjdGlvbnBbYV0ubnVtYmVyXS5wcmVjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByZWMsc2xldmVsID0gUHJlY2VkZW5jZS5nZXQoYSwoJ3JpZ2h0JywwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2xldmVsID4gcmxldmVsKSBvciAoKHNsZXZlbCA9PSBybGV2ZWwpIGFuZCAocnByZWMgPT0gJ3JpZ2h0JykpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFdlIGRlY2lkZSB0byBzaGlmdCBoZXJlLi4uIGhpZ2hlc3QgcHJlY2VkZW5jZSB0byBzaGlmdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9kdWN0aW9uc1tzdF9hY3Rpb25wW2FdLm51bWJlcl0ucmVkdWNlZCAtPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0X2FjdGlvblthXSA9IGoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RfYWN0aW9ucFthXSA9IHAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHJsZXZlbDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCIgICEgc2hpZnQvcmVkdWNlIGNvbmZsaWN0IGZvciAlcyByZXNvbHZlZCBhcyBzaGlmdCIsYSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3JfY29uZmxpY3RzLmFwcGVuZCgoc3QsYSwnc2hpZnQnKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIChzbGV2ZWwgPT0gcmxldmVsKSBhbmQgKHJwcmVjID09ICdub25hc3NvYycpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdF9hY3Rpb25bYV0gPSBOb25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBIbW1tLiBHdWVzcyB3ZSdsbCBrZWVwIHRoZSByZWR1Y2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNsZXZlbCBhbmQgbm90IHJsZXZlbDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCIgICEgc2hpZnQvcmVkdWNlIGNvbmZsaWN0IGZvciAlcyByZXNvbHZlZCBhcyByZWR1Y2UiLGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNyX2NvbmZsaWN0cy5hcHBlbmQoKHN0LGEsJ3JlZHVjZScpKQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIExBTFJFcnJvcigiVW5rbm93biBjb25mbGljdCBpbiBzdGF0ZSAlZCIgJSBzdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0X2FjdGlvblthXSA9IGoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0X2FjdGlvbnBbYV0gPSBwCisKKyAgICAgICAgICAgICMgUHJpbnQgdGhlIGFjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggdGVybWluYWwKKyAgICAgICAgICAgIF9hY3RwcmludCA9IHsgfQorICAgICAgICAgICAgZm9yIGEscCxtIGluIGFjdGxpc3Q6CisgICAgICAgICAgICAgICAgaWYgYSBpbiBzdF9hY3Rpb246CisgICAgICAgICAgICAgICAgICAgIGlmIHAgaXMgc3RfYWN0aW9ucFthXToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCIgICAgJS0xNXMgJXMiLGEsbSkKKyAgICAgICAgICAgICAgICAgICAgICAgIF9hY3RwcmludFsoYSxtKV0gPSAxCisgICAgICAgICAgICBsb2cuaW5mbygiIikKKyAgICAgICAgICAgICMgUHJpbnQgdGhlIGFjdGlvbnMgdGhhdCB3ZXJlIG5vdCB1c2VkLiAoZGVidWdnaW5nKQorICAgICAgICAgICAgbm90X3VzZWQgPSAwCisgICAgICAgICAgICBmb3IgYSxwLG0gaW4gYWN0bGlzdDoKKyAgICAgICAgICAgICAgICBpZiBhIGluIHN0X2FjdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgaWYgcCBpcyBub3Qgc3RfYWN0aW9ucFthXToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCAoYSxtKSBpbiBfYWN0cHJpbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgICEgJS0xNXMgWyAlcyBdIixhLG0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90X3VzZWQgPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2FjdHByaW50WyhhLG0pXSA9IDEKKyAgICAgICAgICAgIGlmIG5vdF91c2VkOgorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiIikKKworICAgICAgICAgICAgIyBDb25zdHJ1Y3QgdGhlIGdvdG8gdGFibGUgZm9yIHRoaXMgc3RhdGUKKworICAgICAgICAgICAgbmtleXMgPSB7IH0KKyAgICAgICAgICAgIGZvciBpaSBpbiBJOgorICAgICAgICAgICAgICAgIGZvciBzIGluIGlpLnVzeW1zOgorICAgICAgICAgICAgICAgICAgICBpZiBzIGluIHNlbGYuZ3JhbW1hci5Ob250ZXJtaW5hbHM6CisgICAgICAgICAgICAgICAgICAgICAgICBua2V5c1tzXSA9IE5vbmUKKyAgICAgICAgICAgIGZvciBuIGluIG5rZXlzOgorICAgICAgICAgICAgICAgIGcgPSBzZWxmLmxyMF9nb3RvKEksbikKKyAgICAgICAgICAgICAgICBqID0gc2VsZi5scjBfY2lkaGFzaC5nZXQoaWQoZyksLTEpCisgICAgICAgICAgICAgICAgaWYgaiA+PSAwOgorICAgICAgICAgICAgICAgICAgICBzdF9nb3RvW25dID0gagorICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiICAgICUtMzBzIHNoaWZ0IGFuZCBnbyB0byBzdGF0ZSAlZCIsbixqKQorCisgICAgICAgICAgICBhY3Rpb25bc3RdID0gc3RfYWN0aW9uCisgICAgICAgICAgICBhY3Rpb25wW3N0XSA9IHN0X2FjdGlvbnAKKyAgICAgICAgICAgIGdvdG9bc3RdID0gc3RfZ290bworICAgICAgICAgICAgc3QgKz0gMQorCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyB3cml0ZSgpCisgICAgIworICAgICMgVGhpcyBmdW5jdGlvbiB3cml0ZXMgdGhlIExSIHBhcnNpbmcgdGFibGVzIHRvIGEgZmlsZQorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiB3cml0ZV90YWJsZShzZWxmLG1vZHVsZW5hbWUsb3V0cHV0ZGlyPScnLHNpZ25hdHVyZT0iIik6CisgICAgICAgIGJhc2Vtb2R1bGVuYW1lID0gbW9kdWxlbmFtZS5zcGxpdCgiLiIpWy0xXQorICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihvdXRwdXRkaXIsYmFzZW1vZHVsZW5hbWUpICsgIi5weSIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsInciKQorCisgICAgICAgICAgICBmLndyaXRlKCIiIgorIyAlcworIyBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuIERvIG5vdCBlZGl0LgorX3RhYnZlcnNpb24gPSAlcgorCitfbHJfbWV0aG9kID0gJXIKKworX2xyX3NpZ25hdHVyZSA9ICVyCisgICAgIiIiICUgKGZpbGVuYW1lLCBfX3RhYnZlcnNpb25fXywgc2VsZi5scl9tZXRob2QsIHNpZ25hdHVyZSkpCisKKyAgICAgICAgICAgICMgQ2hhbmdlIHNtYWxsZXIgdG8gMCB0byBnbyBiYWNrIHRvIG9yaWdpbmFsIHRhYmxlcworICAgICAgICAgICAgc21hbGxlciA9IDEKKworICAgICAgICAgICAgIyBGYWN0b3Igb3V0IG5hbWVzIHRvIHRyeSBhbmQgbWFrZSBzbWFsbGVyCisgICAgICAgICAgICBpZiBzbWFsbGVyOgorICAgICAgICAgICAgICAgIGl0ZW1zID0geyB9CisKKyAgICAgICAgICAgICAgICBmb3IgcyxuZCBpbiBzZWxmLmxyX2FjdGlvbi5pdGVtcygpOgorICAgICAgICAgICAgICAgICAgIGZvciBuYW1lLHYgaW4gbmQuaXRlbXMoKToKKyAgICAgICAgICAgICAgICAgICAgICBpID0gaXRlbXMuZ2V0KG5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGk6CisgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IChbXSxbXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtc1tuYW1lXSA9IGkKKyAgICAgICAgICAgICAgICAgICAgICBpWzBdLmFwcGVuZChzKQorICAgICAgICAgICAgICAgICAgICAgIGlbMV0uYXBwZW5kKHYpCisKKyAgICAgICAgICAgICAgICBmLndyaXRlKCJcbl9scl9hY3Rpb25faXRlbXMgPSB7IikKKyAgICAgICAgICAgICAgICBmb3Igayx2IGluIGl0ZW1zLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgIGYud3JpdGUoIiVyOihbIiAlIGspCisgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHZbMF06CisgICAgICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCIlciwiICUgaSkKKyAgICAgICAgICAgICAgICAgICAgZi53cml0ZSgiXSxbIikKKyAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gdlsxXToKKyAgICAgICAgICAgICAgICAgICAgICAgIGYud3JpdGUoIiVyLCIgJSBpKQorCisgICAgICAgICAgICAgICAgICAgIGYud3JpdGUoIl0pLCIpCisgICAgICAgICAgICAgICAgZi53cml0ZSgifVxuIikKKworICAgICAgICAgICAgICAgIGYud3JpdGUoIiIiCitfbHJfYWN0aW9uID0geyB9Citmb3IgX2ssIF92IGluIF9scl9hY3Rpb25faXRlbXMuaXRlbXMoKToKKyAgIGZvciBfeCxfeSBpbiB6aXAoX3ZbMF0sX3ZbMV0pOgorICAgICAgaWYgbm90IF94IGluIF9scl9hY3Rpb246ICBfbHJfYWN0aW9uW194XSA9IHsgfQorICAgICAgX2xyX2FjdGlvbltfeF1bX2tdID0gX3kKK2RlbCBfbHJfYWN0aW9uX2l0ZW1zCisiIiIpCisKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZi53cml0ZSgiXG5fbHJfYWN0aW9uID0geyAiKTsKKyAgICAgICAgICAgICAgICBmb3Igayx2IGluIHNlbGYubHJfYWN0aW9uLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgIGYud3JpdGUoIiglciwlcik6JXIsIiAlIChrWzBdLGtbMV0sdikpCisgICAgICAgICAgICAgICAgZi53cml0ZSgifVxuIik7CisKKyAgICAgICAgICAgIGlmIHNtYWxsZXI6CisgICAgICAgICAgICAgICAgIyBGYWN0b3Igb3V0IG5hbWVzIHRvIHRyeSBhbmQgbWFrZSBzbWFsbGVyCisgICAgICAgICAgICAgICAgaXRlbXMgPSB7IH0KKworICAgICAgICAgICAgICAgIGZvciBzLG5kIGluIHNlbGYubHJfZ290by5pdGVtcygpOgorICAgICAgICAgICAgICAgICAgIGZvciBuYW1lLHYgaW4gbmQuaXRlbXMoKToKKyAgICAgICAgICAgICAgICAgICAgICBpID0gaXRlbXMuZ2V0KG5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGk6CisgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IChbXSxbXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtc1tuYW1lXSA9IGkKKyAgICAgICAgICAgICAgICAgICAgICBpWzBdLmFwcGVuZChzKQorICAgICAgICAgICAgICAgICAgICAgIGlbMV0uYXBwZW5kKHYpCisKKyAgICAgICAgICAgICAgICBmLndyaXRlKCJcbl9scl9nb3RvX2l0ZW1zID0geyIpCisgICAgICAgICAgICAgICAgZm9yIGssdiBpbiBpdGVtcy5pdGVtcygpOgorICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCIlcjooWyIgJSBrKQorICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiB2WzBdOgorICAgICAgICAgICAgICAgICAgICAgICAgZi53cml0ZSgiJXIsIiAlIGkpCisgICAgICAgICAgICAgICAgICAgIGYud3JpdGUoIl0sWyIpCisgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHZbMV06CisgICAgICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCIlciwiICUgaSkKKworICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCJdKSwiKQorICAgICAgICAgICAgICAgIGYud3JpdGUoIn1cbiIpCisKKyAgICAgICAgICAgICAgICBmLndyaXRlKCIiIgorX2xyX2dvdG8gPSB7IH0KK2ZvciBfaywgX3YgaW4gX2xyX2dvdG9faXRlbXMuaXRlbXMoKToKKyAgIGZvciBfeCxfeSBpbiB6aXAoX3ZbMF0sX3ZbMV0pOgorICAgICAgIGlmIG5vdCBfeCBpbiBfbHJfZ290bzogX2xyX2dvdG9bX3hdID0geyB9CisgICAgICAgX2xyX2dvdG9bX3hdW19rXSA9IF95CitkZWwgX2xyX2dvdG9faXRlbXMKKyIiIikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZi53cml0ZSgiXG5fbHJfZ290byA9IHsgIik7CisgICAgICAgICAgICAgICAgZm9yIGssdiBpbiBzZWxmLmxyX2dvdG8uaXRlbXMoKToKKyAgICAgICAgICAgICAgICAgICAgZi53cml0ZSgiKCVyLCVyKTolciwiICUgKGtbMF0sa1sxXSx2KSkKKyAgICAgICAgICAgICAgICBmLndyaXRlKCJ9XG4iKTsKKworICAgICAgICAgICAgIyBXcml0ZSBwcm9kdWN0aW9uIHRhYmxlCisgICAgICAgICAgICBmLndyaXRlKCJfbHJfcHJvZHVjdGlvbnMgPSBbXG4iKQorICAgICAgICAgICAgZm9yIHAgaW4gc2VsZi5scl9wcm9kdWN0aW9uczoKKyAgICAgICAgICAgICAgICBpZiBwLmZ1bmM6CisgICAgICAgICAgICAgICAgICAgIGYud3JpdGUoIiAgKCVyLCVyLCVkLCVyLCVyLCVkKSxcbiIgJSAocC5zdHIscC5uYW1lLCBwLmxlbiwgcC5mdW5jLHAuZmlsZSxwLmxpbmUpKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGYud3JpdGUoIiAgKCVyLCVyLCVkLE5vbmUsTm9uZSxOb25lKSxcbiIgJSAoc3RyKHApLHAubmFtZSwgcC5sZW4pKQorICAgICAgICAgICAgZi53cml0ZSgiXVxuIikKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgZSA9IHN5cy5leGNfaW5mbygpWzFdCisgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJVbmFibGUgdG8gY3JlYXRlICclcydcbiIgJSBmaWxlbmFtZSkKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoc3RyKGUpKyJcbiIpCisgICAgICAgICAgICByZXR1cm4KKworCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgcGlja2xlX3RhYmxlKCkKKyAgICAjCisgICAgIyBUaGlzIGZ1bmN0aW9uIHBpY2tsZXMgdGhlIExSIHBhcnNpbmcgdGFibGVzIHRvIGEgc3VwcGxpZWQgZmlsZSBvYmplY3QKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgcGlja2xlX3RhYmxlKHNlbGYsZmlsZW5hbWUsc2lnbmF0dXJlPSIiKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IGNQaWNrbGUgYXMgcGlja2xlCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIGltcG9ydCBwaWNrbGUKKyAgICAgICAgb3V0ZiA9IG9wZW4oZmlsZW5hbWUsIndiIikKKyAgICAgICAgcGlja2xlLmR1bXAoX190YWJ2ZXJzaW9uX18sb3V0ZixwaWNrbGVfcHJvdG9jb2wpCisgICAgICAgIHBpY2tsZS5kdW1wKHNlbGYubHJfbWV0aG9kLG91dGYscGlja2xlX3Byb3RvY29sKQorICAgICAgICBwaWNrbGUuZHVtcChzaWduYXR1cmUsb3V0ZixwaWNrbGVfcHJvdG9jb2wpCisgICAgICAgIHBpY2tsZS5kdW1wKHNlbGYubHJfYWN0aW9uLG91dGYscGlja2xlX3Byb3RvY29sKQorICAgICAgICBwaWNrbGUuZHVtcChzZWxmLmxyX2dvdG8sb3V0ZixwaWNrbGVfcHJvdG9jb2wpCisKKyAgICAgICAgb3V0cCA9IFtdCisgICAgICAgIGZvciBwIGluIHNlbGYubHJfcHJvZHVjdGlvbnM6CisgICAgICAgICAgICBpZiBwLmZ1bmM6CisgICAgICAgICAgICAgICAgb3V0cC5hcHBlbmQoKHAuc3RyLHAubmFtZSwgcC5sZW4sIHAuZnVuYyxwLmZpbGUscC5saW5lKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb3V0cC5hcHBlbmQoKHN0cihwKSxwLm5hbWUscC5sZW4sTm9uZSxOb25lLE5vbmUpKQorICAgICAgICBwaWNrbGUuZHVtcChvdXRwLG91dGYscGlja2xlX3Byb3RvY29sKQorICAgICAgICBvdXRmLmNsb3NlKCkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PT0gSU5UUk9TUEVDVElPTiA9PT0KKyMKKyMgVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYW5kIGNsYXNzZXMgYXJlIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBQTFkKKyMgaW50cm9zcGVjdGlvbiBmZWF0dXJlcyBmb2xsb3dlZCBieSB0aGUgeWFjYygpIGZ1bmN0aW9uIGl0c2VsZi4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBnZXRfY2FsbGVyX21vZHVsZV9kaWN0KCkKKyMKKyMgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgZGljdGlvbmFyeSBjb250YWluaW5nIGFsbCBvZiB0aGUgc3ltYm9scyBkZWZpbmVkIHdpdGhpbgorIyBhIGNhbGxlciBmdXJ0aGVyIGRvd24gdGhlIGNhbGwgc3RhY2suICBUaGlzIGlzIHVzZWQgdG8gZ2V0IHRoZSBlbnZpcm9ubWVudAorIyBhc3NvY2lhdGVkIHdpdGggdGhlIHlhY2MoKSBjYWxsIGlmIG5vbmUgd2FzIHByb3ZpZGVkLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkZWYgZ2V0X2NhbGxlcl9tb2R1bGVfZGljdChsZXZlbHMpOgorICAgIHRyeToKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yCisgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgZSxiLHQgPSBzeXMuZXhjX2luZm8oKQorICAgICAgICBmID0gdC50Yl9mcmFtZQorICAgICAgICB3aGlsZSBsZXZlbHMgPiAwOgorICAgICAgICAgICAgZiA9IGYuZl9iYWNrICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgbGV2ZWxzIC09IDEKKyAgICAgICAgbGRpY3QgPSBmLmZfZ2xvYmFscy5jb3B5KCkKKyAgICAgICAgaWYgZi5mX2dsb2JhbHMgIT0gZi5mX2xvY2FsczoKKyAgICAgICAgICAgIGxkaWN0LnVwZGF0ZShmLmZfbG9jYWxzKQorCisgICAgICAgIHJldHVybiBsZGljdAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHBhcnNlX2dyYW1tYXIoKQorIworIyBUaGlzIHRha2VzIGEgcmF3IGdyYW1tYXIgcnVsZSBzdHJpbmcgYW5kIHBhcnNlcyBpdCBpbnRvIHByb2R1Y3Rpb24gZGF0YQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZGVmIHBhcnNlX2dyYW1tYXIoZG9jLGZpbGUsbGluZSk6CisgICAgZ3JhbW1hciA9IFtdCisgICAgIyBTcGxpdCB0aGUgZG9jIHN0cmluZyBpbnRvIGxpbmVzCisgICAgcHN0cmluZ3MgPSBkb2Muc3BsaXRsaW5lcygpCisgICAgbGFzdHAgPSBOb25lCisgICAgZGxpbmUgPSBsaW5lCisgICAgZm9yIHBzIGluIHBzdHJpbmdzOgorICAgICAgICBkbGluZSArPSAxCisgICAgICAgIHAgPSBwcy5zcGxpdCgpCisgICAgICAgIGlmIG5vdCBwOiBjb250aW51ZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBwWzBdID09ICd8JzoKKyAgICAgICAgICAgICAgICAjIFRoaXMgaXMgYSBjb250aW51YXRpb24gb2YgYSBwcmV2aW91cyBydWxlCisgICAgICAgICAgICAgICAgaWYgbm90IGxhc3RwOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcigiJXM6JWQ6IE1pc3BsYWNlZCAnfCciICUgKGZpbGUsZGxpbmUpKQorICAgICAgICAgICAgICAgIHByb2RuYW1lID0gbGFzdHAKKyAgICAgICAgICAgICAgICBzeW1zID0gcFsxOl0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJvZG5hbWUgPSBwWzBdCisgICAgICAgICAgICAgICAgbGFzdHAgPSBwcm9kbmFtZQorICAgICAgICAgICAgICAgIHN5bXMgICA9IHBbMjpdCisgICAgICAgICAgICAgICAgYXNzaWduID0gcFsxXQorICAgICAgICAgICAgICAgIGlmIGFzc2lnbiAhPSAnOicgYW5kIGFzc2lnbiAhPSAnOjo9JzoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoIiVzOiVkOiBTeW50YXggZXJyb3IuIEV4cGVjdGVkICc6JyIgJSAoZmlsZSxkbGluZSkpCisKKyAgICAgICAgICAgIGdyYW1tYXIuYXBwZW5kKChmaWxlLGRsaW5lLHByb2RuYW1lLHN5bXMpKQorICAgICAgICBleGNlcHQgU3ludGF4RXJyb3I6CisgICAgICAgICAgICByYWlzZQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoIiVzOiVkOiBTeW50YXggZXJyb3IgaW4gcnVsZSAnJXMnIiAlIChmaWxlLGRsaW5lLHBzLnN0cmlwKCkpKQorCisgICAgcmV0dXJuIGdyYW1tYXIKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQYXJzZXJSZWZsZWN0KCkKKyMKKyMgVGhpcyBjbGFzcyByZXByZXNlbnRzIGluZm9ybWF0aW9uIGV4dHJhY3RlZCBmb3IgYnVpbGRpbmcgYSBwYXJzZXIgaW5jbHVkaW5nCisjIHN0YXJ0IHN5bWJvbCwgZXJyb3IgZnVuY3Rpb24sIHRva2VucywgcHJlY2VkZW5jZSBsaXN0LCBhY3Rpb24gZnVuY3Rpb25zLAorIyBldGMuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjbGFzcyBQYXJzZXJSZWZsZWN0KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYscGRpY3QsbG9nPU5vbmUpOgorICAgICAgICBzZWxmLnBkaWN0ICAgICAgPSBwZGljdAorICAgICAgICBzZWxmLnN0YXJ0ICAgICAgPSBOb25lCisgICAgICAgIHNlbGYuZXJyb3JfZnVuYyA9IE5vbmUKKyAgICAgICAgc2VsZi50b2tlbnMgICAgID0gTm9uZQorICAgICAgICBzZWxmLmZpbGVzICAgICAgPSB7fQorICAgICAgICBzZWxmLmdyYW1tYXIgICAgPSBbXQorICAgICAgICBzZWxmLmVycm9yICAgICAgPSAwCisKKyAgICAgICAgaWYgbG9nIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmxvZyA9IFBseUxvZ2dlcihzeXMuc3RkZXJyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5sb2cgPSBsb2cKKworICAgICMgR2V0IGFsbCBvZiB0aGUgYmFzaWMgaW5mb3JtYXRpb24KKyAgICBkZWYgZ2V0X2FsbChzZWxmKToKKyAgICAgICAgc2VsZi5nZXRfc3RhcnQoKQorICAgICAgICBzZWxmLmdldF9lcnJvcl9mdW5jKCkKKyAgICAgICAgc2VsZi5nZXRfdG9rZW5zKCkKKyAgICAgICAgc2VsZi5nZXRfcHJlY2VkZW5jZSgpCisgICAgICAgIHNlbGYuZ2V0X3BmdW5jdGlvbnMoKQorICAgICAgICAKKyAgICAjIFZhbGlkYXRlIGFsbCBvZiB0aGUgaW5mb3JtYXRpb24KKyAgICBkZWYgdmFsaWRhdGVfYWxsKHNlbGYpOgorICAgICAgICBzZWxmLnZhbGlkYXRlX3N0YXJ0KCkKKyAgICAgICAgc2VsZi52YWxpZGF0ZV9lcnJvcl9mdW5jKCkKKyAgICAgICAgc2VsZi52YWxpZGF0ZV90b2tlbnMoKQorICAgICAgICBzZWxmLnZhbGlkYXRlX3ByZWNlZGVuY2UoKQorICAgICAgICBzZWxmLnZhbGlkYXRlX3BmdW5jdGlvbnMoKQorICAgICAgICBzZWxmLnZhbGlkYXRlX2ZpbGVzKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuZXJyb3IKKworICAgICMgQ29tcHV0ZSBhIHNpZ25hdHVyZSBvdmVyIHRoZSBncmFtbWFyCisgICAgZGVmIHNpZ25hdHVyZShzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnJvbSBoYXNobGliIGltcG9ydCBtZDUKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgZnJvbSBtZDUgaW1wb3J0IG1kNQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzaWcgPSBtZDUoKQorICAgICAgICAgICAgaWYgc2VsZi5zdGFydDoKKyAgICAgICAgICAgICAgICBzaWcudXBkYXRlKHNlbGYuc3RhcnQuZW5jb2RlKCdsYXRpbi0xJykpCisgICAgICAgICAgICBpZiBzZWxmLnByZWM6CisgICAgICAgICAgICAgICAgc2lnLnVwZGF0ZSgiIi5qb2luKFsiIi5qb2luKHApIGZvciBwIGluIHNlbGYucHJlY10pLmVuY29kZSgnbGF0aW4tMScpKQorICAgICAgICAgICAgaWYgc2VsZi50b2tlbnM6CisgICAgICAgICAgICAgICAgc2lnLnVwZGF0ZSgiICIuam9pbihzZWxmLnRva2VucykuZW5jb2RlKCdsYXRpbi0xJykpCisgICAgICAgICAgICBmb3IgZiBpbiBzZWxmLnBmdW5jczoKKyAgICAgICAgICAgICAgICBpZiBmWzNdOgorICAgICAgICAgICAgICAgICAgICBzaWcudXBkYXRlKGZbM10uZW5jb2RlKCdsYXRpbi0xJykpCisgICAgICAgIGV4Y2VwdCAoVHlwZUVycm9yLFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgcGFzcworICAgICAgICByZXR1cm4gc2lnLmRpZ2VzdCgpCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyB2YWxpZGF0ZV9maWxlKCkKKyAgICAjCisgICAgIyBUaGlzIG1ldGhvZCBjaGVja3MgdG8gc2VlIGlmIHRoZXJlIGFyZSBkdXBsaWNhdGVkIHBfcnVsZW5hbWUoKSBmdW5jdGlvbnMKKyAgICAjIGluIHRoZSBwYXJzZXIgbW9kdWxlIGZpbGUuICBXaXRob3V0IHRoaXMgZnVuY3Rpb24sIGl0IGlzIHJlYWxseSBlYXN5IGZvcgorICAgICMgdXNlcnMgdG8gbWFrZSBtaXN0YWtlcyBieSBjdXR0aW5nIGFuZCBwYXN0aW5nIGNvZGUgZnJhZ21lbnRzIChhbmQgaXQncyBhIHJlYWwKKyAgICAjIGJ1Z2dlciB0byB0cnkgYW5kIGZpZ3VyZSBvdXQgd2h5IHRoZSByZXN1bHRpbmcgcGFyc2VyIGRvZXNuJ3Qgd29yaykuICBUaGVyZWZvcmUsCisgICAgIyB3ZSBqdXN0IGRvIGEgbGl0dGxlIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIG1hdGNoaW5nIG9mIGRlZiBzdGF0ZW1lbnRzCisgICAgIyB0byB0cnkgYW5kIGRldGVjdCBkdXBsaWNhdGVzLgorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiB2YWxpZGF0ZV9maWxlcyhzZWxmKToKKyAgICAgICAgIyBNYXRjaCBkZWYgcF9mdW5jbmFtZSgKKyAgICAgICAgZnJlID0gcmUuY29tcGlsZShyJ1xzKmRlZlxzKyhwX1thLXpBLVpfMC05XSopXCgnKQorCisgICAgICAgIGZvciBmaWxlbmFtZSBpbiBzZWxmLmZpbGVzLmtleXMoKToKKyAgICAgICAgICAgIGJhc2UsZXh0ID0gb3MucGF0aC5zcGxpdGV4dChmaWxlbmFtZSkKKyAgICAgICAgICAgIGlmIGV4dCAhPSAnLnB5JzogcmV0dXJuIDEgICAgICAgICAgIyBObyBpZGVhLiBBc3N1bWUgaXQncyBva2F5LgorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgbGluZXMgPSBmLnJlYWRsaW5lcygpCisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBjb3VudGhhc2ggPSB7IH0KKyAgICAgICAgICAgIGZvciBsaW5lbixsIGluIGVudW1lcmF0ZShsaW5lcyk6CisgICAgICAgICAgICAgICAgbGluZW4gKz0gMQorICAgICAgICAgICAgICAgIG0gPSBmcmUubWF0Y2gobCkKKyAgICAgICAgICAgICAgICBpZiBtOgorICAgICAgICAgICAgICAgICAgICBuYW1lID0gbS5ncm91cCgxKQorICAgICAgICAgICAgICAgICAgICBwcmV2ID0gY291bnRoYXNoLmdldChuYW1lKQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgcHJldjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50aGFzaFtuYW1lXSA9IGxpbmVuCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy53YXJuaW5nKCIlczolZDogRnVuY3Rpb24gJXMgcmVkZWZpbmVkLiBQcmV2aW91c2x5IGRlZmluZWQgb24gbGluZSAlZCIsIGZpbGVuYW1lLGxpbmVuLG5hbWUscHJldikKKworICAgICMgR2V0IHRoZSBzdGFydCBzeW1ib2wKKyAgICBkZWYgZ2V0X3N0YXJ0KHNlbGYpOgorICAgICAgICBzZWxmLnN0YXJ0ID0gc2VsZi5wZGljdC5nZXQoJ3N0YXJ0JykKKworICAgICMgVmFsaWRhdGUgdGhlIHN0YXJ0IHN5bWJvbAorICAgIGRlZiB2YWxpZGF0ZV9zdGFydChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5zdGFydCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHNlbGYuc3RhcnQsc3RyKToKKyAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigiJ3N0YXJ0JyBtdXN0IGJlIGEgc3RyaW5nIikKKworICAgICMgTG9vayBmb3IgZXJyb3IgaGFuZGxlcgorICAgIGRlZiBnZXRfZXJyb3JfZnVuYyhzZWxmKToKKyAgICAgICAgc2VsZi5lcnJvcl9mdW5jID0gc2VsZi5wZGljdC5nZXQoJ3BfZXJyb3InKQorCisgICAgIyBWYWxpZGF0ZSB0aGUgZXJyb3IgZnVuY3Rpb24KKyAgICBkZWYgdmFsaWRhdGVfZXJyb3JfZnVuYyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5lcnJvcl9mdW5jOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLmVycm9yX2Z1bmMsdHlwZXMuRnVuY3Rpb25UeXBlKToKKyAgICAgICAgICAgICAgICBpc21ldGhvZCA9IDAKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShzZWxmLmVycm9yX2Z1bmMsIHR5cGVzLk1ldGhvZFR5cGUpOgorICAgICAgICAgICAgICAgIGlzbWV0aG9kID0gMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigiJ3BfZXJyb3InIGRlZmluZWQsIGJ1dCBpcyBub3QgYSBmdW5jdGlvbiBvciBtZXRob2QiKQorICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IgPSAxCisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgIGVsaW5lID0gZnVuY19jb2RlKHNlbGYuZXJyb3JfZnVuYykuY29fZmlyc3RsaW5lbm8KKyAgICAgICAgICAgIGVmaWxlID0gZnVuY19jb2RlKHNlbGYuZXJyb3JfZnVuYykuY29fZmlsZW5hbWUKKyAgICAgICAgICAgIHNlbGYuZmlsZXNbZWZpbGVdID0gMQorCisgICAgICAgICAgICBpZiAoZnVuY19jb2RlKHNlbGYuZXJyb3JfZnVuYykuY29fYXJnY291bnQgIT0gMStpc21ldGhvZCk6CisgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIiVzOiVkOiBwX2Vycm9yKCkgcmVxdWlyZXMgMSBhcmd1bWVudCIsZWZpbGUsZWxpbmUpCisgICAgICAgICAgICAgICAgc2VsZi5lcnJvciA9IDEKKworICAgICMgR2V0IHRoZSB0b2tlbnMgbWFwCisgICAgZGVmIGdldF90b2tlbnMoc2VsZik6CisgICAgICAgIHRva2VucyA9IHNlbGYucGRpY3QuZ2V0KCJ0b2tlbnMiLE5vbmUpCisgICAgICAgIGlmIG5vdCB0b2tlbnM6CisgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigiTm8gdG9rZW4gbGlzdCBpcyBkZWZpbmVkIikKKyAgICAgICAgICAgIHNlbGYuZXJyb3IgPSAxCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh0b2tlbnMsKGxpc3QsIHR1cGxlKSk6CisgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigidG9rZW5zIG11c3QgYmUgYSBsaXN0IG9yIHR1cGxlIikKKyAgICAgICAgICAgIHNlbGYuZXJyb3IgPSAxCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgCisgICAgICAgIGlmIG5vdCB0b2tlbnM6CisgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigidG9rZW5zIGlzIGVtcHR5IikKKyAgICAgICAgICAgIHNlbGYuZXJyb3IgPSAxCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLnRva2VucyA9IHRva2VucworCisgICAgIyBWYWxpZGF0ZSB0aGUgdG9rZW5zCisgICAgZGVmIHZhbGlkYXRlX3Rva2VucyhzZWxmKToKKyAgICAgICAgIyBWYWxpZGF0ZSB0aGUgdG9rZW5zLgorICAgICAgICBpZiAnZXJyb3InIGluIHNlbGYudG9rZW5zOgorICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIklsbGVnYWwgdG9rZW4gbmFtZSAnZXJyb3InLiBJcyBhIHJlc2VydmVkIHdvcmQiKQorICAgICAgICAgICAgc2VsZi5lcnJvciA9IDEKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHRlcm1pbmFscyA9IHt9CisgICAgICAgIGZvciBuIGluIHNlbGYudG9rZW5zOgorICAgICAgICAgICAgaWYgbiBpbiB0ZXJtaW5hbHM6CisgICAgICAgICAgICAgICAgc2VsZi5sb2cud2FybmluZygiVG9rZW4gJyVzJyBtdWx0aXBseSBkZWZpbmVkIiwgbikKKyAgICAgICAgICAgIHRlcm1pbmFsc1tuXSA9IDEKKworICAgICMgR2V0IHRoZSBwcmVjZWRlbmNlIG1hcCAoaWYgYW55KQorICAgIGRlZiBnZXRfcHJlY2VkZW5jZShzZWxmKToKKyAgICAgICAgc2VsZi5wcmVjID0gc2VsZi5wZGljdC5nZXQoInByZWNlZGVuY2UiLE5vbmUpCisKKyAgICAjIFZhbGlkYXRlIGFuZCBwYXJzZSB0aGUgcHJlY2VkZW5jZSBtYXAKKyAgICBkZWYgdmFsaWRhdGVfcHJlY2VkZW5jZShzZWxmKToKKyAgICAgICAgcHJlY2xpc3QgPSBbXQorICAgICAgICBpZiBzZWxmLnByZWM6CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzZWxmLnByZWMsKGxpc3QsdHVwbGUpKToKKyAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigicHJlY2VkZW5jZSBtdXN0IGJlIGEgbGlzdCBvciB0dXBsZSIpCisgICAgICAgICAgICAgICAgc2VsZi5lcnJvciA9IDEKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGZvciBsZXZlbCxwIGluIGVudW1lcmF0ZShzZWxmLnByZWMpOgorICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHAsKGxpc3QsdHVwbGUpKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIkJhZCBwcmVjZWRlbmNlIHRhYmxlIikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvciA9IDEKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgICAgICBpZiBsZW4ocCkgPCAyOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigiTWFsZm9ybWVkIHByZWNlZGVuY2UgZW50cnkgJXMuIE11c3QgYmUgKGFzc29jLCB0ZXJtLCAuLi4sIHRlcm0pIixwKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yID0gMQorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBhc3NvYyA9IHBbMF0KKyAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShhc3NvYyxzdHIpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigicHJlY2VkZW5jZSBhc3NvY2lhdGl2aXR5IG11c3QgYmUgYSBzdHJpbmciKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yID0gMQorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBmb3IgdGVybSBpbiBwWzE6XToKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodGVybSxzdHIpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoInByZWNlZGVuY2UgaXRlbXMgbXVzdCBiZSBzdHJpbmdzIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IgPSAxCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgcHJlY2xpc3QuYXBwZW5kKCh0ZXJtLGFzc29jLGxldmVsKzEpKQorICAgICAgICBzZWxmLnByZWNsaXN0ID0gcHJlY2xpc3QKKworICAgICMgR2V0IGFsbCBwX2Z1bmN0aW9ucyBmcm9tIHRoZSBncmFtbWFyCisgICAgZGVmIGdldF9wZnVuY3Rpb25zKHNlbGYpOgorICAgICAgICBwX2Z1bmN0aW9ucyA9IFtdCisgICAgICAgIGZvciBuYW1lLCBpdGVtIGluIHNlbGYucGRpY3QuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIG5hbWVbOjJdICE9ICdwXyc6IGNvbnRpbnVlCisgICAgICAgICAgICBpZiBuYW1lID09ICdwX2Vycm9yJzogY29udGludWUKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaXRlbSwodHlwZXMuRnVuY3Rpb25UeXBlLHR5cGVzLk1ldGhvZFR5cGUpKToKKyAgICAgICAgICAgICAgICBsaW5lID0gZnVuY19jb2RlKGl0ZW0pLmNvX2ZpcnN0bGluZW5vCisgICAgICAgICAgICAgICAgZmlsZSA9IGZ1bmNfY29kZShpdGVtKS5jb19maWxlbmFtZQorICAgICAgICAgICAgICAgIHBfZnVuY3Rpb25zLmFwcGVuZCgobGluZSxmaWxlLG5hbWUsaXRlbS5fX2RvY19fKSkKKworICAgICAgICAjIFNvcnQgYWxsIG9mIHRoZSBhY3Rpb25zIGJ5IGxpbmUgbnVtYmVyCisgICAgICAgIHBfZnVuY3Rpb25zLnNvcnQoKQorICAgICAgICBzZWxmLnBmdW5jcyA9IHBfZnVuY3Rpb25zCisKKworICAgICMgVmFsaWRhdGUgYWxsIG9mIHRoZSBwX2Z1bmN0aW9ucworICAgIGRlZiB2YWxpZGF0ZV9wZnVuY3Rpb25zKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gW10KKyAgICAgICAgIyBDaGVjayBmb3Igbm9uLWVtcHR5IHN5bWJvbHMKKyAgICAgICAgaWYgbGVuKHNlbGYucGZ1bmNzKSA9PSAwOgorICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIm5vIHJ1bGVzIG9mIHRoZSBmb3JtIHBfcnVsZW5hbWUgYXJlIGRlZmluZWQiKQorICAgICAgICAgICAgc2VsZi5lcnJvciA9IDEKKyAgICAgICAgICAgIHJldHVybiAKKyAgICAgICAgCisgICAgICAgIGZvciBsaW5lLCBmaWxlLCBuYW1lLCBkb2MgaW4gc2VsZi5wZnVuY3M6CisgICAgICAgICAgICBmdW5jID0gc2VsZi5wZGljdFtuYW1lXQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShmdW5jLCB0eXBlcy5NZXRob2RUeXBlKToKKyAgICAgICAgICAgICAgICByZXFhcmdzID0gMgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXFhcmdzID0gMQorICAgICAgICAgICAgaWYgZnVuY19jb2RlKGZ1bmMpLmNvX2FyZ2NvdW50ID4gcmVxYXJnczoKKyAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigiJXM6JWQ6IFJ1bGUgJyVzJyBoYXMgdG9vIG1hbnkgYXJndW1lbnRzIixmaWxlLGxpbmUsZnVuYy5fX25hbWVfXykKKyAgICAgICAgICAgICAgICBzZWxmLmVycm9yID0gMQorICAgICAgICAgICAgZWxpZiBmdW5jX2NvZGUoZnVuYykuY29fYXJnY291bnQgPCByZXFhcmdzOgorICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCIlczolZDogUnVsZSAnJXMnIHJlcXVpcmVzIGFuIGFyZ3VtZW50IixmaWxlLGxpbmUsZnVuYy5fX25hbWVfXykKKyAgICAgICAgICAgICAgICBzZWxmLmVycm9yID0gMQorICAgICAgICAgICAgZWxpZiBub3QgZnVuYy5fX2RvY19fOgorICAgICAgICAgICAgICAgIHNlbGYubG9nLndhcm5pbmcoIiVzOiVkOiBObyBkb2N1bWVudGF0aW9uIHN0cmluZyBzcGVjaWZpZWQgaW4gZnVuY3Rpb24gJyVzJyAoaWdub3JlZCkiLGZpbGUsbGluZSxmdW5jLl9fbmFtZV9fKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHBhcnNlZF9nID0gcGFyc2VfZ3JhbW1hcihkb2MsZmlsZSxsaW5lKQorICAgICAgICAgICAgICAgICAgICBmb3IgZyBpbiBwYXJzZWRfZzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyYW1tYXIuYXBwZW5kKChuYW1lLCBnKSkKKyAgICAgICAgICAgICAgICBleGNlcHQgU3ludGF4RXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGUgPSBzeXMuZXhjX2luZm8oKVsxXQorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcihzdHIoZSkpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IgPSAxCisKKyAgICAgICAgICAgICAgICAjIExvb2tzIGxpa2UgYSB2YWxpZCBncmFtbWFyIHJ1bGUKKyAgICAgICAgICAgICAgICAjIE1hcmsgdGhlIGZpbGUgaW4gd2hpY2ggZGVmaW5lZC4KKyAgICAgICAgICAgICAgICBzZWxmLmZpbGVzW2ZpbGVdID0gMQorCisgICAgICAgICMgU2Vjb25kYXJ5IHZhbGlkYXRpb24gc3RlcCB0aGF0IGxvb2tzIGZvciBwXyBkZWZpbml0aW9ucyB0aGF0IGFyZSBub3QgZnVuY3Rpb25zCisgICAgICAgICMgb3IgZnVuY3Rpb25zIHRoYXQgbG9vayBsaWtlIHRoZXkgbWlnaHQgYmUgZ3JhbW1hciBydWxlcy4KKworICAgICAgICBmb3Igbix2IGluIHNlbGYucGRpY3QuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIG5bMDoyXSA9PSAncF8nIGFuZCBpc2luc3RhbmNlKHYsICh0eXBlcy5GdW5jdGlvblR5cGUsIHR5cGVzLk1ldGhvZFR5cGUpKTogY29udGludWUKKyAgICAgICAgICAgIGlmIG5bMDoyXSA9PSAndF8nOiBjb250aW51ZQorICAgICAgICAgICAgaWYgblswOjJdID09ICdwXycgYW5kIG4gIT0gJ3BfZXJyb3InOgorICAgICAgICAgICAgICAgIHNlbGYubG9nLndhcm5pbmcoIiclcycgbm90IGRlZmluZWQgYXMgYSBmdW5jdGlvbiIsIG4pCisgICAgICAgICAgICBpZiAoKGlzaW5zdGFuY2Uodix0eXBlcy5GdW5jdGlvblR5cGUpIGFuZCBmdW5jX2NvZGUodikuY29fYXJnY291bnQgPT0gMSkgb3IKKyAgICAgICAgICAgICAgICAoaXNpbnN0YW5jZSh2LHR5cGVzLk1ldGhvZFR5cGUpIGFuZCBmdW5jX2NvZGUodikuY29fYXJnY291bnQgPT0gMikpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZG9jID0gdi5fX2RvY19fLnNwbGl0KCIgIikKKyAgICAgICAgICAgICAgICAgICAgaWYgZG9jWzFdID09ICc6JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nLndhcm5pbmcoIiVzOiVkOiBQb3NzaWJsZSBncmFtbWFyIHJ1bGUgJyVzJyBkZWZpbmVkIHdpdGhvdXQgcF8gcHJlZml4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY19jb2RlKHYpLmNvX2ZpbGVuYW1lLCBmdW5jX2NvZGUodikuY29fZmlyc3RsaW5lbm8sbikKKyAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc2VsZi5ncmFtbWFyID0gZ3JhbW1hcgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHlhY2MobW9kdWxlKQorIworIyBCdWlsZCBhIHBhcnNlcgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkZWYgeWFjYyhtZXRob2Q9J0xBTFInLCBkZWJ1Zz15YWNjZGVidWcsIG1vZHVsZT1Ob25lLCB0YWJtb2R1bGU9dGFiX21vZHVsZSwgc3RhcnQ9Tm9uZSwgCisgICAgICAgICBjaGVja19yZWN1cnNpb249MSwgb3B0aW1pemU9MCwgd3JpdGVfdGFibGVzPTEsIGRlYnVnZmlsZT1kZWJ1Z19maWxlLG91dHB1dGRpcj0nJywKKyAgICAgICAgIGRlYnVnbG9nPU5vbmUsIGVycm9ybG9nID0gTm9uZSwgcGlja2xlZmlsZT1Ob25lKToKKworICAgIGdsb2JhbCBwYXJzZSAgICAgICAgICAgICAgICAgIyBSZWZlcmVuY2UgdG8gdGhlIHBhcnNpbmcgbWV0aG9kIG9mIHRoZSBsYXN0IGJ1aWx0IHBhcnNlcgorCisgICAgIyBJZiBwaWNrbGluZyBpcyBlbmFibGVkLCB0YWJsZSBmaWxlcyBhcmUgbm90IGNyZWF0ZWQKKworICAgIGlmIHBpY2tsZWZpbGU6CisgICAgICAgIHdyaXRlX3RhYmxlcyA9IDAKKworICAgIGlmIGVycm9ybG9nIGlzIE5vbmU6CisgICAgICAgIGVycm9ybG9nID0gUGx5TG9nZ2VyKHN5cy5zdGRlcnIpCisKKyAgICAjIEdldCB0aGUgbW9kdWxlIGRpY3Rpb25hcnkgdXNlZCBmb3IgdGhlIHBhcnNlcgorICAgIGlmIG1vZHVsZToKKyAgICAgICAgX2l0ZW1zID0gWyhrLGdldGF0dHIobW9kdWxlLGspKSBmb3IgayBpbiBkaXIobW9kdWxlKV0KKyAgICAgICAgcGRpY3QgPSBkaWN0KF9pdGVtcykKKyAgICBlbHNlOgorICAgICAgICBwZGljdCA9IGdldF9jYWxsZXJfbW9kdWxlX2RpY3QoMikKKworICAgICMgQ29sbGVjdCBwYXJzZXIgaW5mb3JtYXRpb24gZnJvbSB0aGUgZGljdGlvbmFyeQorICAgIHBpbmZvID0gUGFyc2VyUmVmbGVjdChwZGljdCxsb2c9ZXJyb3Jsb2cpCisgICAgcGluZm8uZ2V0X2FsbCgpCisKKyAgICBpZiBwaW5mby5lcnJvcjoKKyAgICAgICAgcmFpc2UgWWFjY0Vycm9yKCJVbmFibGUgdG8gYnVpbGQgcGFyc2VyIikKKworICAgICMgQ2hlY2sgc2lnbmF0dXJlIGFnYWluc3QgdGFibGUgZmlsZXMgKGlmIGFueSkKKyAgICBzaWduYXR1cmUgPSBwaW5mby5zaWduYXR1cmUoKQorCisgICAgIyBSZWFkIHRoZSB0YWJsZXMKKyAgICB0cnk6CisgICAgICAgIGxyID0gTFJUYWJsZSgpCisgICAgICAgIGlmIHBpY2tsZWZpbGU6CisgICAgICAgICAgICByZWFkX3NpZ25hdHVyZSA9IGxyLnJlYWRfcGlja2xlKHBpY2tsZWZpbGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZWFkX3NpZ25hdHVyZSA9IGxyLnJlYWRfdGFibGUodGFibW9kdWxlKQorICAgICAgICBpZiBvcHRpbWl6ZSBvciAocmVhZF9zaWduYXR1cmUgPT0gc2lnbmF0dXJlKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBsci5iaW5kX2NhbGxhYmxlcyhwaW5mby5wZGljdCkKKyAgICAgICAgICAgICAgICBwYXJzZXIgPSBMUlBhcnNlcihscixwaW5mby5lcnJvcl9mdW5jKQorICAgICAgICAgICAgICAgIHBhcnNlID0gcGFyc2VyLnBhcnNlCisgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlcgorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICBlID0gc3lzLmV4Y19pbmZvKClbMV0KKyAgICAgICAgICAgICAgICBlcnJvcmxvZy53YXJuaW5nKCJUaGVyZSB3YXMgYSBwcm9ibGVtIGxvYWRpbmcgdGhlIHRhYmxlIGZpbGU6ICVzIiwgcmVwcihlKSkKKyAgICBleGNlcHQgVmVyc2lvbkVycm9yOgorICAgICAgICBlID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgZXJyb3Jsb2cud2FybmluZyhzdHIoZSkpCisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgcGFzcworCisgICAgaWYgZGVidWdsb2cgaXMgTm9uZToKKyAgICAgICAgaWYgZGVidWc6CisgICAgICAgICAgICBkZWJ1Z2xvZyA9IFBseUxvZ2dlcihvcGVuKGRlYnVnZmlsZSwidyIpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGVidWdsb2cgPSBOdWxsTG9nZ2VyKCkKKworICAgIGRlYnVnbG9nLmluZm8oIkNyZWF0ZWQgYnkgUExZIHZlcnNpb24gJXMgKGh0dHA6Ly93d3cuZGFiZWF6LmNvbS9wbHkpIiwgX192ZXJzaW9uX18pCisKKworICAgIGVycm9ycyA9IDAKKworICAgICMgVmFsaWRhdGUgdGhlIHBhcnNlciBpbmZvcm1hdGlvbgorICAgIGlmIHBpbmZvLnZhbGlkYXRlX2FsbCgpOgorICAgICAgICByYWlzZSBZYWNjRXJyb3IoIlVuYWJsZSB0byBidWlsZCBwYXJzZXIiKQorICAgIAorICAgIGlmIG5vdCBwaW5mby5lcnJvcl9mdW5jOgorICAgICAgICBlcnJvcmxvZy53YXJuaW5nKCJubyBwX2Vycm9yKCkgZnVuY3Rpb24gaXMgZGVmaW5lZCIpCisKKyAgICAjIENyZWF0ZSBhIGdyYW1tYXIgb2JqZWN0CisgICAgZ3JhbW1hciA9IEdyYW1tYXIocGluZm8udG9rZW5zKQorCisgICAgIyBTZXQgcHJlY2VkZW5jZSBsZXZlbCBmb3IgdGVybWluYWxzCisgICAgZm9yIHRlcm0sIGFzc29jLCBsZXZlbCBpbiBwaW5mby5wcmVjbGlzdDoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZ3JhbW1hci5zZXRfcHJlY2VkZW5jZSh0ZXJtLGFzc29jLGxldmVsKQorICAgICAgICBleGNlcHQgR3JhbW1hckVycm9yOgorICAgICAgICAgICAgZSA9IHN5cy5leGNfaW5mbygpWzFdCisgICAgICAgICAgICBlcnJvcmxvZy53YXJuaW5nKCIlcyIsc3RyKGUpKQorCisgICAgIyBBZGQgcHJvZHVjdGlvbnMgdG8gdGhlIGdyYW1tYXIKKyAgICBmb3IgZnVuY25hbWUsIGdyYW0gaW4gcGluZm8uZ3JhbW1hcjoKKyAgICAgICAgZmlsZSwgbGluZSwgcHJvZG5hbWUsIHN5bXMgPSBncmFtCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGdyYW1tYXIuYWRkX3Byb2R1Y3Rpb24ocHJvZG5hbWUsc3ltcyxmdW5jbmFtZSxmaWxlLGxpbmUpCisgICAgICAgIGV4Y2VwdCBHcmFtbWFyRXJyb3I6CisgICAgICAgICAgICBlID0gc3lzLmV4Y19pbmZvKClbMV0KKyAgICAgICAgICAgIGVycm9ybG9nLmVycm9yKCIlcyIsc3RyKGUpKQorICAgICAgICAgICAgZXJyb3JzID0gMQorCisgICAgIyBTZXQgdGhlIGdyYW1tYXIgc3RhcnQgc3ltYm9scworICAgIHRyeToKKyAgICAgICAgaWYgc3RhcnQgaXMgTm9uZToKKyAgICAgICAgICAgIGdyYW1tYXIuc2V0X3N0YXJ0KHBpbmZvLnN0YXJ0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZ3JhbW1hci5zZXRfc3RhcnQoc3RhcnQpCisgICAgZXhjZXB0IEdyYW1tYXJFcnJvcjoKKyAgICAgICAgZSA9IHN5cy5leGNfaW5mbygpWzFdCisgICAgICAgIGVycm9ybG9nLmVycm9yKHN0cihlKSkKKyAgICAgICAgZXJyb3JzID0gMQorCisgICAgaWYgZXJyb3JzOgorICAgICAgICByYWlzZSBZYWNjRXJyb3IoIlVuYWJsZSB0byBidWlsZCBwYXJzZXIiKQorCisgICAgIyBWZXJpZnkgdGhlIGdyYW1tYXIgc3RydWN0dXJlCisgICAgdW5kZWZpbmVkX3N5bWJvbHMgPSBncmFtbWFyLnVuZGVmaW5lZF9zeW1ib2xzKCkKKyAgICBmb3Igc3ltLCBwcm9kIGluIHVuZGVmaW5lZF9zeW1ib2xzOgorICAgICAgICBlcnJvcmxvZy5lcnJvcigiJXM6JWQ6IFN5bWJvbCAnJXMnIHVzZWQsIGJ1dCBub3QgZGVmaW5lZCBhcyBhIHRva2VuIG9yIGEgcnVsZSIscHJvZC5maWxlLHByb2QubGluZSxzeW0pCisgICAgICAgIGVycm9ycyA9IDEKKworICAgIHVudXNlZF90ZXJtaW5hbHMgPSBncmFtbWFyLnVudXNlZF90ZXJtaW5hbHMoKQorICAgIGlmIHVudXNlZF90ZXJtaW5hbHM6CisgICAgICAgIGRlYnVnbG9nLmluZm8oIiIpCisgICAgICAgIGRlYnVnbG9nLmluZm8oIlVudXNlZCB0ZXJtaW5hbHM6IikKKyAgICAgICAgZGVidWdsb2cuaW5mbygiIikKKyAgICAgICAgZm9yIHRlcm0gaW4gdW51c2VkX3Rlcm1pbmFsczoKKyAgICAgICAgICAgIGVycm9ybG9nLndhcm5pbmcoIlRva2VuICclcycgZGVmaW5lZCwgYnV0IG5vdCB1c2VkIiwgdGVybSkKKyAgICAgICAgICAgIGRlYnVnbG9nLmluZm8oIiAgICAlcyIsIHRlcm0pCisKKyAgICAjIFByaW50IG91dCBhbGwgcHJvZHVjdGlvbnMgdG8gdGhlIGRlYnVnIGxvZworICAgIGlmIGRlYnVnOgorICAgICAgICBkZWJ1Z2xvZy5pbmZvKCIiKQorICAgICAgICBkZWJ1Z2xvZy5pbmZvKCJHcmFtbWFyIikKKyAgICAgICAgZGVidWdsb2cuaW5mbygiIikKKyAgICAgICAgZm9yIG4scCBpbiBlbnVtZXJhdGUoZ3JhbW1hci5Qcm9kdWN0aW9ucyk6CisgICAgICAgICAgICBkZWJ1Z2xvZy5pbmZvKCJSdWxlICUtNWQgJXMiLCBuLCBwKQorCisgICAgIyBGaW5kIHVudXNlZCBub24tdGVybWluYWxzCisgICAgdW51c2VkX3J1bGVzID0gZ3JhbW1hci51bnVzZWRfcnVsZXMoKQorICAgIGZvciBwcm9kIGluIHVudXNlZF9ydWxlczoKKyAgICAgICAgZXJyb3Jsb2cud2FybmluZygiJXM6JWQ6IFJ1bGUgJyVzJyBkZWZpbmVkLCBidXQgbm90IHVzZWQiLCBwcm9kLmZpbGUsIHByb2QubGluZSwgcHJvZC5uYW1lKQorCisgICAgaWYgbGVuKHVudXNlZF90ZXJtaW5hbHMpID09IDE6CisgICAgICAgIGVycm9ybG9nLndhcm5pbmcoIlRoZXJlIGlzIDEgdW51c2VkIHRva2VuIikKKyAgICBpZiBsZW4odW51c2VkX3Rlcm1pbmFscykgPiAxOgorICAgICAgICBlcnJvcmxvZy53YXJuaW5nKCJUaGVyZSBhcmUgJWQgdW51c2VkIHRva2VucyIsIGxlbih1bnVzZWRfdGVybWluYWxzKSkKKworICAgIGlmIGxlbih1bnVzZWRfcnVsZXMpID09IDE6CisgICAgICAgIGVycm9ybG9nLndhcm5pbmcoIlRoZXJlIGlzIDEgdW51c2VkIHJ1bGUiKQorICAgIGlmIGxlbih1bnVzZWRfcnVsZXMpID4gMToKKyAgICAgICAgZXJyb3Jsb2cud2FybmluZygiVGhlcmUgYXJlICVkIHVudXNlZCBydWxlcyIsIGxlbih1bnVzZWRfcnVsZXMpKQorCisgICAgaWYgZGVidWc6CisgICAgICAgIGRlYnVnbG9nLmluZm8oIiIpCisgICAgICAgIGRlYnVnbG9nLmluZm8oIlRlcm1pbmFscywgd2l0aCBydWxlcyB3aGVyZSB0aGV5IGFwcGVhciIpCisgICAgICAgIGRlYnVnbG9nLmluZm8oIiIpCisgICAgICAgIHRlcm1zID0gbGlzdChncmFtbWFyLlRlcm1pbmFscykKKyAgICAgICAgdGVybXMuc29ydCgpCisgICAgICAgIGZvciB0ZXJtIGluIHRlcm1zOgorICAgICAgICAgICAgZGVidWdsb2cuaW5mbygiJS0yMHMgOiAlcyIsIHRlcm0sICIgIi5qb2luKFtzdHIocykgZm9yIHMgaW4gZ3JhbW1hci5UZXJtaW5hbHNbdGVybV1dKSkKKyAgICAgICAgCisgICAgICAgIGRlYnVnbG9nLmluZm8oIiIpCisgICAgICAgIGRlYnVnbG9nLmluZm8oIk5vbnRlcm1pbmFscywgd2l0aCBydWxlcyB3aGVyZSB0aGV5IGFwcGVhciIpCisgICAgICAgIGRlYnVnbG9nLmluZm8oIiIpCisgICAgICAgIG5vbnRlcm1zID0gbGlzdChncmFtbWFyLk5vbnRlcm1pbmFscykKKyAgICAgICAgbm9udGVybXMuc29ydCgpCisgICAgICAgIGZvciBub250ZXJtIGluIG5vbnRlcm1zOgorICAgICAgICAgICAgZGVidWdsb2cuaW5mbygiJS0yMHMgOiAlcyIsIG5vbnRlcm0sICIgIi5qb2luKFtzdHIocykgZm9yIHMgaW4gZ3JhbW1hci5Ob250ZXJtaW5hbHNbbm9udGVybV1dKSkKKyAgICAgICAgZGVidWdsb2cuaW5mbygiIikKKworICAgIGlmIGNoZWNrX3JlY3Vyc2lvbjoKKyAgICAgICAgdW5yZWFjaGFibGUgPSBncmFtbWFyLmZpbmRfdW5yZWFjaGFibGUoKQorICAgICAgICBmb3IgdSBpbiB1bnJlYWNoYWJsZToKKyAgICAgICAgICAgIGVycm9ybG9nLndhcm5pbmcoIlN5bWJvbCAnJXMnIGlzIHVucmVhY2hhYmxlIix1KQorCisgICAgICAgIGluZmluaXRlID0gZ3JhbW1hci5pbmZpbml0ZV9jeWNsZXMoKQorICAgICAgICBmb3IgaW5mIGluIGluZmluaXRlOgorICAgICAgICAgICAgZXJyb3Jsb2cuZXJyb3IoIkluZmluaXRlIHJlY3Vyc2lvbiBkZXRlY3RlZCBmb3Igc3ltYm9sICclcyciLCBpbmYpCisgICAgICAgICAgICBlcnJvcnMgPSAxCisgICAgICAgIAorICAgIHVudXNlZF9wcmVjID0gZ3JhbW1hci51bnVzZWRfcHJlY2VkZW5jZSgpCisgICAgZm9yIHRlcm0sIGFzc29jIGluIHVudXNlZF9wcmVjOgorICAgICAgICBlcnJvcmxvZy5lcnJvcigiUHJlY2VkZW5jZSBydWxlICclcycgZGVmaW5lZCBmb3IgdW5rbm93biBzeW1ib2wgJyVzJyIsIGFzc29jLCB0ZXJtKQorICAgICAgICBlcnJvcnMgPSAxCisKKyAgICBpZiBlcnJvcnM6CisgICAgICAgIHJhaXNlIFlhY2NFcnJvcigiVW5hYmxlIHRvIGJ1aWxkIHBhcnNlciIpCisgICAgCisgICAgIyBSdW4gdGhlIExSR2VuZXJhdGVkVGFibGUgb24gdGhlIGdyYW1tYXIKKyAgICBpZiBkZWJ1ZzoKKyAgICAgICAgZXJyb3Jsb2cuZGVidWcoIkdlbmVyYXRpbmcgJXMgdGFibGVzIiwgbWV0aG9kKQorICAgICAgICAgICAgCisgICAgbHIgPSBMUkdlbmVyYXRlZFRhYmxlKGdyYW1tYXIsbWV0aG9kLGRlYnVnbG9nKQorCisgICAgaWYgZGVidWc6CisgICAgICAgIG51bV9zciA9IGxlbihsci5zcl9jb25mbGljdHMpCisKKyAgICAgICAgIyBSZXBvcnQgc2hpZnQvcmVkdWNlIGFuZCByZWR1Y2UvcmVkdWNlIGNvbmZsaWN0cworICAgICAgICBpZiBudW1fc3IgPT0gMToKKyAgICAgICAgICAgIGVycm9ybG9nLndhcm5pbmcoIjEgc2hpZnQvcmVkdWNlIGNvbmZsaWN0IikKKyAgICAgICAgZWxpZiBudW1fc3IgPiAxOgorICAgICAgICAgICAgZXJyb3Jsb2cud2FybmluZygiJWQgc2hpZnQvcmVkdWNlIGNvbmZsaWN0cyIsIG51bV9zcikKKworICAgICAgICBudW1fcnIgPSBsZW4obHIucnJfY29uZmxpY3RzKQorICAgICAgICBpZiBudW1fcnIgPT0gMToKKyAgICAgICAgICAgIGVycm9ybG9nLndhcm5pbmcoIjEgcmVkdWNlL3JlZHVjZSBjb25mbGljdCIpCisgICAgICAgIGVsaWYgbnVtX3JyID4gMToKKyAgICAgICAgICAgIGVycm9ybG9nLndhcm5pbmcoIiVkIHJlZHVjZS9yZWR1Y2UgY29uZmxpY3RzIiwgbnVtX3JyKQorCisgICAgIyBXcml0ZSBvdXQgY29uZmxpY3RzIHRvIHRoZSBvdXRwdXQgZmlsZQorICAgIGlmIGRlYnVnIGFuZCAobHIuc3JfY29uZmxpY3RzIG9yIGxyLnJyX2NvbmZsaWN0cyk6CisgICAgICAgIGRlYnVnbG9nLndhcm5pbmcoIiIpCisgICAgICAgIGRlYnVnbG9nLndhcm5pbmcoIkNvbmZsaWN0czoiKQorICAgICAgICBkZWJ1Z2xvZy53YXJuaW5nKCIiKQorCisgICAgICAgIGZvciBzdGF0ZSwgdG9rLCByZXNvbHV0aW9uIGluIGxyLnNyX2NvbmZsaWN0czoKKyAgICAgICAgICAgIGRlYnVnbG9nLndhcm5pbmcoInNoaWZ0L3JlZHVjZSBjb25mbGljdCBmb3IgJXMgaW4gc3RhdGUgJWQgcmVzb2x2ZWQgYXMgJXMiLCAgdG9rLCBzdGF0ZSwgcmVzb2x1dGlvbikKKyAgICAgICAgCisgICAgICAgIGFscmVhZHlfcmVwb3J0ZWQgPSB7fQorICAgICAgICBmb3Igc3RhdGUsIHJ1bGUsIHJlamVjdGVkIGluIGxyLnJyX2NvbmZsaWN0czoKKyAgICAgICAgICAgIGlmIChzdGF0ZSxpZChydWxlKSxpZChyZWplY3RlZCkpIGluIGFscmVhZHlfcmVwb3J0ZWQ6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGRlYnVnbG9nLndhcm5pbmcoInJlZHVjZS9yZWR1Y2UgY29uZmxpY3QgaW4gc3RhdGUgJWQgcmVzb2x2ZWQgdXNpbmcgcnVsZSAoJXMpIiwgc3RhdGUsIHJ1bGUpCisgICAgICAgICAgICBkZWJ1Z2xvZy53YXJuaW5nKCJyZWplY3RlZCBydWxlICglcykgaW4gc3RhdGUgJWQiLCByZWplY3RlZCxzdGF0ZSkKKyAgICAgICAgICAgIGVycm9ybG9nLndhcm5pbmcoInJlZHVjZS9yZWR1Y2UgY29uZmxpY3QgaW4gc3RhdGUgJWQgcmVzb2x2ZWQgdXNpbmcgcnVsZSAoJXMpIiwgc3RhdGUsIHJ1bGUpCisgICAgICAgICAgICBlcnJvcmxvZy53YXJuaW5nKCJyZWplY3RlZCBydWxlICglcykgaW4gc3RhdGUgJWQiLCByZWplY3RlZCwgc3RhdGUpCisgICAgICAgICAgICBhbHJlYWR5X3JlcG9ydGVkW3N0YXRlLGlkKHJ1bGUpLGlkKHJlamVjdGVkKV0gPSAxCisgICAgICAgIAorICAgICAgICB3YXJuZWRfbmV2ZXIgPSBbXQorICAgICAgICBmb3Igc3RhdGUsIHJ1bGUsIHJlamVjdGVkIGluIGxyLnJyX2NvbmZsaWN0czoKKyAgICAgICAgICAgIGlmIG5vdCByZWplY3RlZC5yZWR1Y2VkIGFuZCAocmVqZWN0ZWQgbm90IGluIHdhcm5lZF9uZXZlcik6CisgICAgICAgICAgICAgICAgZGVidWdsb2cud2FybmluZygiUnVsZSAoJXMpIGlzIG5ldmVyIHJlZHVjZWQiLCByZWplY3RlZCkKKyAgICAgICAgICAgICAgICBlcnJvcmxvZy53YXJuaW5nKCJSdWxlICglcykgaXMgbmV2ZXIgcmVkdWNlZCIsIHJlamVjdGVkKQorICAgICAgICAgICAgICAgIHdhcm5lZF9uZXZlci5hcHBlbmQocmVqZWN0ZWQpCisKKyAgICAjIFdyaXRlIHRoZSB0YWJsZSBmaWxlIGlmIHJlcXVlc3RlZAorICAgIGlmIHdyaXRlX3RhYmxlczoKKyAgICAgICAgbHIud3JpdGVfdGFibGUodGFibW9kdWxlLG91dHB1dGRpcixzaWduYXR1cmUpCisKKyAgICAjIFdyaXRlIGEgcGlja2xlZCB2ZXJzaW9uIG9mIHRoZSB0YWJsZXMKKyAgICBpZiBwaWNrbGVmaWxlOgorICAgICAgICBsci5waWNrbGVfdGFibGUocGlja2xlZmlsZSxzaWduYXR1cmUpCisKKyAgICAjIEJ1aWxkIHRoZSBwYXJzZXIKKyAgICBsci5iaW5kX2NhbGxhYmxlcyhwaW5mby5wZGljdCkKKyAgICBwYXJzZXIgPSBMUlBhcnNlcihscixwaW5mby5lcnJvcl9mdW5jKQorCisgICAgcGFyc2UgPSBwYXJzZXIucGFyc2UKKyAgICByZXR1cm4gcGFyc2VyCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9wcm9ncmVzc2Jhci5weSBiL2JpdGJha2UvbGliL3Byb2dyZXNzYmFyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNGNkYzEKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9wcm9ncmVzc2Jhci5weQpAQCAtMCwwICsxLDM4NCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIC0qLSBjb2Rpbmc6IGlzby04ODU5LTEgLSotCisjCisjIHByb2dyZXNzYmFyICAtIFRleHQgcHJvZ3Jlc3NiYXIgbGlicmFyeSBmb3IgcHl0aG9uLgorIyBDb3B5cmlnaHQgKGMpIDIwMDUgTmlsdG9uIFZvbHBhdG8KKyMKKyMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisjIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisKKyIiIlRleHQgcHJvZ3Jlc3NiYXIgbGlicmFyeSBmb3IgcHl0aG9uLgorCitUaGlzIGxpYnJhcnkgcHJvdmlkZXMgYSB0ZXh0IG1vZGUgcHJvZ3Jlc3NiYXIuIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQKK3RvIGRpc3BsYXkgdGhlIHByb2dyZXNzIG9mIGEgbG9uZyBydW5uaW5nIG9wZXJhdGlvbiwgcHJvdmlkaW5nIGEKK3Zpc3VhbCBjbHVlIHRoYXQgcHJvY2Vzc2luZyBpcyB1bmRlcndheS4KKworVGhlIFByb2dyZXNzQmFyIGNsYXNzIG1hbmFnZXMgdGhlIHByb2dyZXNzLCBhbmQgdGhlIGZvcm1hdCBvZiB0aGUgbGluZQoraXMgZ2l2ZW4gYnkgYSBudW1iZXIgb2Ygd2lkZ2V0cy4gQSB3aWRnZXQgaXMgYW4gb2JqZWN0IHRoYXQgbWF5CitkaXNwbGF5IGRpZmVyZW50bHkgZGVwZW5kaW5nIG9uIHRoZSBzdGF0ZSBvZiB0aGUgcHJvZ3Jlc3MuIFRoZXJlIGFyZQordGhyZWUgdHlwZXMgb2Ygd2lkZ2V0OgorLSBhIHN0cmluZywgd2hpY2ggYWx3YXlzIHNob3dzIGl0c2VsZjsKKy0gYSBQcm9ncmVzc0JhcldpZGdldCwgd2hpY2ggbWF5IHJldHVybiBhIGRpZmVyZW50IHZhbHVlIGV2ZXJ5IHRpbWUKK2l0J3MgdXBkYXRlIG1ldGhvZCBpcyBjYWxsZWQ7IGFuZAorLSBhIFByb2dyZXNzQmFyV2lkZ2V0SEZpbGwsIHdoaWNoIGlzIGxpa2UgUHJvZ3Jlc3NCYXJXaWRnZXQsIGV4Y2VwdCBpdAorZXhwYW5kcyB0byBmaWxsIHRoZSByZW1haW5pbmcgd2lkdGggb2YgdGhlIGxpbmUuCisKK1RoZSBwcm9ncmVzc2JhciBtb2R1bGUgaXMgdmVyeSBlYXN5IHRvIHVzZSwgeWV0IHZlcnkgcG93ZXJmdWwuIEFuZAorYXV0b21hdGljYWxseSBzdXBwb3J0cyBmZWF0dXJlcyBsaWtlIGF1dG8tcmVzaXppbmcgd2hlbiBhdmFpbGFibGUuCisiIiIKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbgorCitfX2F1dGhvcl9fID0gIk5pbHRvbiBWb2xwYXRvIgorX19hdXRob3JfZW1haWxfXyA9ICJmaXJzdC1uYW1lIGRvdCBsYXN0LW5hbWUgQCBnbWFpbC5jb20iCitfX2RhdGVfXyA9ICIyMDA2LTA1LTA3IgorX192ZXJzaW9uX18gPSAiMi4zLWRldiIKKworaW1wb3J0IHN5cywgdGltZSwgb3MKK2Zyb20gYXJyYXkgaW1wb3J0IGFycmF5Cit0cnk6CisgICAgZnJvbSBmY250bCBpbXBvcnQgaW9jdGwKKyAgICBpbXBvcnQgdGVybWlvcworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHBhc3MKK2ltcG9ydCBzaWduYWwKK3RyeToKKyAgICBiYXNlc3RyaW5nCitleGNlcHQgTmFtZUVycm9yOgorICAgIGJhc2VzdHJpbmcgPSAoc3RyLCkKKworY2xhc3MgUHJvZ3Jlc3NCYXJXaWRnZXQob2JqZWN0KToKKyAgICAiIiJUaGlzIGlzIGFuIGVsZW1lbnQgb2YgUHJvZ3Jlc3NCYXIgZm9ybWF0dGluZy4KKworICAgIFRoZSBQcm9ncmVzc0JhciBvYmplY3Qgd2lsbCBjYWxsIGl0J3MgdXBkYXRlIHZhbHVlIHdoZW4gYW4gdXBkYXRlCisgICAgaXMgbmVlZGVkLiBJdCdzIHNpemUgbWF5IGNoYW5nZSBiZXR3ZWVuIGNhbGwsIGJ1dCB0aGUgcmVzdWx0cyB3aWxsCisgICAgbm90IGJlIGdvb2QgaWYgdGhlIHNpemUgY2hhbmdlcyBkcmFzdGljYWxseSBhbmQgcmVwZWF0ZWRseS4KKyAgICAiIiIKKyAgICBkZWYgdXBkYXRlKHNlbGYsIHBiYXIpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB3aWRnZXQuCisKKyAgICAgICAgVGhlIHBhcmFtZXRlciBwYmFyIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBjYWxsaW5nIFByb2dyZXNzQmFyLAorICAgICAgICB3aGVyZSBvbmUgY2FuIGFjY2VzcyBhdHRyaWJ1dGVzIG9mIHRoZSBjbGFzcyBmb3Iga25vd2luZyBob3cKKyAgICAgICAgdGhlIHVwZGF0ZSBtdXN0IGJlIG1hZGUuCisKKyAgICAgICAgQXQgbGVhc3QgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIG92ZXJyaWRlbi4iIiIKKyAgICAgICAgcGFzcworCitjbGFzcyBQcm9ncmVzc0JhcldpZGdldEhGaWxsKG9iamVjdCk6CisgICAgIiIiVGhpcyBpcyBhIHZhcmlhYmxlIHdpZHRoIGVsZW1lbnQgb2YgUHJvZ3Jlc3NCYXIgZm9ybWF0dGluZy4KKworICAgIFRoZSBQcm9ncmVzc0JhciBvYmplY3Qgd2lsbCBjYWxsIGl0J3MgdXBkYXRlIHZhbHVlLCBpbmZvcm1pbmcgdGhlCisgICAgd2lkdGggdGhpcyBvYmplY3QgbXVzdCB0aGUgbWFkZS4gVGhpcyBpcyBsaWtlIFRlWCBcXGhmaWxsLCBpdCB3aWxsCisgICAgZXhwYW5kIHRvIGZpbGwgdGhlIGxpbmUuIFlvdSBjYW4gdXNlIG1vcmUgdGhhbiBvbmUgaW4gdGhlIHNhbWUKKyAgICBsaW5lLCBhbmQgdGhleSB3aWxsIGFsbCBoYXZlIHRoZSBzYW1lIHdpZHRoLCBhbmQgdG9nZXRoZXIgd2lsbAorICAgIGZpbGwgdGhlIGxpbmUuCisgICAgIiIiCisgICAgZGVmIHVwZGF0ZShzZWxmLCBwYmFyLCB3aWR0aCk6CisgICAgICAgICIiIlJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHdpZGdldC4KKworICAgICAgICBUaGUgcGFyYW1ldGVyIHBiYXIgaXMgYSByZWZlcmVuY2UgdG8gdGhlIGNhbGxpbmcgUHJvZ3Jlc3NCYXIsCisgICAgICAgIHdoZXJlIG9uZSBjYW4gYWNjZXNzIGF0dHJpYnV0ZXMgb2YgdGhlIGNsYXNzIGZvciBrbm93aW5nIGhvdworICAgICAgICB0aGUgdXBkYXRlIG11c3QgYmUgbWFkZS4gVGhlIHBhcmFtZXRlciB3aWR0aCBpcyB0aGUgdG90YWwKKyAgICAgICAgaG9yaXpvbnRhbCB3aWR0aCB0aGUgd2lkZ2V0IG11c3QgaGF2ZS4KKworICAgICAgICBBdCBsZWFzdCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgb3ZlcnJpZGVuLiIiIgorICAgICAgICBwYXNzCisKKworY2xhc3MgRVRBKFByb2dyZXNzQmFyV2lkZ2V0KToKKyAgICAiV2lkZ2V0IGZvciB0aGUgRXN0aW1hdGVkIFRpbWUgb2YgQXJyaXZhbCIKKyAgICBkZWYgZm9ybWF0X3RpbWUoc2VsZiwgc2Vjb25kcyk6CisgICAgICAgIHJldHVybiB0aW1lLnN0cmZ0aW1lKCclSDolTTolUycsIHRpbWUuZ210aW1lKHNlY29uZHMpKQorICAgIGRlZiB1cGRhdGUoc2VsZiwgcGJhcik6CisgICAgICAgIGlmIHBiYXIuY3VycnZhbCA9PSAwOgorICAgICAgICAgICAgcmV0dXJuICdFVEE6ICAtLTotLTotLScKKyAgICAgICAgZWxpZiBwYmFyLmZpbmlzaGVkOgorICAgICAgICAgICAgcmV0dXJuICdUaW1lOiAlcycgJSBzZWxmLmZvcm1hdF90aW1lKHBiYXIuc2Vjb25kc19lbGFwc2VkKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZWxhcHNlZCA9IHBiYXIuc2Vjb25kc19lbGFwc2VkCisgICAgICAgICAgICBldGEgPSBlbGFwc2VkICogcGJhci5tYXh2YWwgLyBwYmFyLmN1cnJ2YWwgLSBlbGFwc2VkCisgICAgICAgICAgICByZXR1cm4gJ0VUQTogICVzJyAlIHNlbGYuZm9ybWF0X3RpbWUoZXRhKQorCitjbGFzcyBGaWxlVHJhbnNmZXJTcGVlZChQcm9ncmVzc0JhcldpZGdldCk6CisgICAgIldpZGdldCBmb3Igc2hvd2luZyB0aGUgdHJhbnNmZXIgc3BlZWQgKHVzZWZ1bCBmb3IgZmlsZSB0cmFuc2ZlcnMpLiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdW5pdD0nQicpOgorICAgICAgICBzZWxmLnVuaXQgPSB1bml0CisgICAgICAgIHNlbGYuZm10ID0gJyU2LjJmICVzJworICAgICAgICBzZWxmLnByZWZpeGVzID0gWycnLCAnSycsICdNJywgJ0cnLCAnVCcsICdQJ10KKyAgICBkZWYgdXBkYXRlKHNlbGYsIHBiYXIpOgorICAgICAgICBpZiBwYmFyLnNlY29uZHNfZWxhcHNlZCA8IDJlLTY6Iz09IDA6CisgICAgICAgICAgICBicHMgPSAwLjAKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJwcyA9IHBiYXIuY3VycnZhbCAvIHBiYXIuc2Vjb25kc19lbGFwc2VkCisgICAgICAgIHNwZCA9IGJwcworICAgICAgICBmb3IgdSBpbiBzZWxmLnByZWZpeGVzOgorICAgICAgICAgICAgaWYgc3BkIDwgMTAwMDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgc3BkIC89IDEwMDAKKyAgICAgICAgcmV0dXJuIHNlbGYuZm10ICUgKHNwZCwgdSArIHNlbGYudW5pdCArICcvcycpCisKK2NsYXNzIFJvdGF0aW5nTWFya2VyKFByb2dyZXNzQmFyV2lkZ2V0KToKKyAgICAiQSByb3RhdGluZyBtYXJrZXIgZm9yIGZpbGxpbmcgdGhlIGJhciBvZiBwcm9ncmVzcy4iCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hcmtlcnM9J3wvLVxcJyk6CisgICAgICAgIHNlbGYubWFya2VycyA9IG1hcmtlcnMKKyAgICAgICAgc2VsZi5jdXJtYXJrID0gLTEKKyAgICBkZWYgdXBkYXRlKHNlbGYsIHBiYXIpOgorICAgICAgICBpZiBwYmFyLmZpbmlzaGVkOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYubWFya2Vyc1swXQorICAgICAgICBzZWxmLmN1cm1hcmsgPSAoc2VsZi5jdXJtYXJrICsgMSkgJSBsZW4oc2VsZi5tYXJrZXJzKQorICAgICAgICByZXR1cm4gc2VsZi5tYXJrZXJzW3NlbGYuY3VybWFya10KKworY2xhc3MgUGVyY2VudGFnZShQcm9ncmVzc0JhcldpZGdldCk6CisgICAgIkp1c3QgdGhlIHBlcmNlbnRhZ2UgZG9uZS4iCisgICAgZGVmIHVwZGF0ZShzZWxmLCBwYmFyKToKKyAgICAgICAgcmV0dXJuICclM2QlJScgJSBwYmFyLnBlcmNlbnRhZ2UoKQorCitjbGFzcyBTaW1wbGVQcm9ncmVzcyhQcm9ncmVzc0JhcldpZGdldCk6CisgICAgIlJldHVybnMgd2hhdCBpcyBhbHJlYWR5IGRvbmUgYW5kIHRoZSB0b3RhbCwgZS5nLjogJzUgb2YgNDcnIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXA9JyBvZiAnKToKKyAgICAgICAgc2VsZi5zZXAgPSBzZXAKKyAgICBkZWYgdXBkYXRlKHNlbGYsIHBiYXIpOgorICAgICAgICByZXR1cm4gJyVkJXMlZCcgJSAocGJhci5jdXJydmFsLCBzZWxmLnNlcCwgcGJhci5tYXh2YWwpCisKK2NsYXNzIEJhcihQcm9ncmVzc0JhcldpZGdldEhGaWxsKToKKyAgICAiVGhlIGJhciBvZiBwcm9ncmVzcy4gSXQgd2lsbCBzdHJldGNoIHRvIGZpbGwgdGhlIGxpbmUuIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXJrZXI9JyMnLCBsZWZ0PSd8JywgcmlnaHQ9J3wnKToKKyAgICAgICAgc2VsZi5tYXJrZXIgPSBtYXJrZXIKKyAgICAgICAgc2VsZi5sZWZ0ID0gbGVmdAorICAgICAgICBzZWxmLnJpZ2h0ID0gcmlnaHQKKyAgICBkZWYgX2Zvcm1hdF9tYXJrZXIoc2VsZiwgcGJhcik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5tYXJrZXIsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYubWFya2VyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5tYXJrZXIudXBkYXRlKHBiYXIpCisgICAgZGVmIHVwZGF0ZShzZWxmLCBwYmFyLCB3aWR0aCk6CisgICAgICAgIHBlcmNlbnQgPSBwYmFyLnBlcmNlbnRhZ2UoKQorICAgICAgICBjd2lkdGggPSB3aWR0aCAtIGxlbihzZWxmLmxlZnQpIC0gbGVuKHNlbGYucmlnaHQpCisgICAgICAgIG1hcmtlZF93aWR0aCA9IGludChwZXJjZW50ICogY3dpZHRoIC8vIDEwMCkKKyAgICAgICAgbSA9IHNlbGYuX2Zvcm1hdF9tYXJrZXIocGJhcikKKyAgICAgICAgYmFyID0gKHNlbGYubGVmdCArIChtICogbWFya2VkX3dpZHRoKS5sanVzdChjd2lkdGgpICsgc2VsZi5yaWdodCkKKyAgICAgICAgcmV0dXJuIGJhcgorCitjbGFzcyBSZXZlcnNlQmFyKEJhcik6CisgICAgIlRoZSByZXZlcnNlIGJhciBvZiBwcm9ncmVzcywgb3IgYmFyIG9mIHJlZ3Jlc3MuIDopIgorICAgIGRlZiB1cGRhdGUoc2VsZiwgcGJhciwgd2lkdGgpOgorICAgICAgICBwZXJjZW50ID0gcGJhci5wZXJjZW50YWdlKCkKKyAgICAgICAgY3dpZHRoID0gd2lkdGggLSBsZW4oc2VsZi5sZWZ0KSAtIGxlbihzZWxmLnJpZ2h0KQorICAgICAgICBtYXJrZWRfd2lkdGggPSBpbnQocGVyY2VudCAqIGN3aWR0aCAvLyAxMDApCisgICAgICAgIG0gPSBzZWxmLl9mb3JtYXRfbWFya2VyKHBiYXIpCisgICAgICAgIGJhciA9IChzZWxmLmxlZnQgKyAobSptYXJrZWRfd2lkdGgpLnJqdXN0KGN3aWR0aCkgKyBzZWxmLnJpZ2h0KQorICAgICAgICByZXR1cm4gYmFyCisKK2RlZmF1bHRfd2lkZ2V0cyA9IFtQZXJjZW50YWdlKCksICcgJywgQmFyKCldCitjbGFzcyBQcm9ncmVzc0JhcihvYmplY3QpOgorICAgICIiIlRoaXMgaXMgdGhlIFByb2dyZXNzQmFyIGNsYXNzLCBpdCB1cGRhdGVzIGFuZCBwcmludHMgdGhlIGJhci4KKworICAgIEEgY29tbW9uIHdheSBvZiB1c2luZyBpdCBpcyBsaWtlOgorICAgID4+PiBwYmFyID0gUHJvZ3Jlc3NCYXIoKS5zdGFydCgpCisgICAgPj4+IGZvciBpIGluIHhyYW5nZSgxMDApOgorICAgIC4uLiAgICAjIGRvIHNvbWV0aGluZworICAgIC4uLiAgICBwYmFyLnVwZGF0ZShpKzEpCisgICAgLi4uCisgICAgPj4+IHBiYXIuZmluaXNoKCkKKworICAgIFlvdSBjYW4gYWxzbyB1c2UgYSBwcm9ncmVzc2JhciBhcyBhbiBpdGVyYXRvcjoKKyAgICA+Pj4gcHJvZ3Jlc3MgPSBQcm9ncmVzc0JhcigpCisgICAgPj4+IGZvciBpIGluIHByb2dyZXNzKHNvbWVfaXRlcmFibGUpOgorICAgIC4uLiAgICAjIGRvIHNvbWV0aGluZworICAgIC4uLgorCisgICAgQnV0IGFueXRoaW5nIHlvdSB3YW50IHRvIGRvIGlzIHBvc3NpYmxlICh3ZWxsLCBhbG1vc3QgYW55dGhpbmcpLgorICAgIFlvdSBjYW4gc3VwcGx5IGRpZmZlcmVudCB3aWRnZXRzIG9mIGFueSB0eXBlIGluIGFueSBvcmRlci4gQW5kIHlvdQorICAgIGNhbiBldmVuIHdyaXRlIHlvdXIgb3duIHdpZGdldHMhIFRoZXJlIGFyZSBtYW55IHdpZGdldHMgYWxyZWFkeQorICAgIHNoaXBwZWQgYW5kIHlvdSBzaG91bGQgZXhwZXJpbWVudCB3aXRoIHRoZW0uCisKKyAgICBUaGUgdGVybV93aWR0aCBwYXJhbWV0ZXIgbXVzdCBiZSBhbiBpbnRlZ2VyIG9yIE5vbmUuIEluIHRoZSBsYXR0ZXIgY2FzZQorICAgIGl0IHdpbGwgdHJ5IHRvIGd1ZXNzIGl0LCBpZiBpdCBmYWlscyBpdCB3aWxsIGRlZmF1bHQgdG8gODAgY29sdW1ucy4KKworICAgIFdoZW4gaW1wbGVtZW50aW5nIGEgd2lkZ2V0IHVwZGF0ZSBtZXRob2QgeW91IG1heSBhY2Nlc3MgYW55CisgICAgYXR0cmlidXRlIG9yIGZ1bmN0aW9uIG9mIHRoZSBQcm9ncmVzc0JhciBvYmplY3QgY2FsbGluZyB0aGUKKyAgICB3aWRnZXQncyB1cGRhdGUgbWV0aG9kLiBUaGUgbW9zdCBpbXBvcnRhbnQgYXR0cmlidXRlcyB5b3Ugd291bGQKKyAgICBsaWtlIHRvIGFjY2VzcyBhcmU6CisgICAgLSBjdXJydmFsOiBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcm9ncmVzcywgMCA8PSBjdXJydmFsIDw9IG1heHZhbAorICAgIC0gbWF4dmFsOiBtYXhpbXVtIChhbmQgZmluYWwpIHZhbHVlIG9mIHRoZSBwcm9ncmVzcworICAgIC0gZmluaXNoZWQ6IFRydWUgaWYgdGhlIGJhciBoYXMgZmluaXNoZWQgKHJlYWNoZWQgMTAwJSksIEZhbHNlIG8vdworICAgIC0gc3RhcnRfdGltZTogdGhlIHRpbWUgd2hlbiBzdGFydCgpIG1ldGhvZCBvZiBQcm9ncmVzc0JhciB3YXMgY2FsbGVkCisgICAgLSBzZWNvbmRzX2VsYXBzZWQ6IHNlY29uZHMgZWxhcHNlZCBzaW5jZSBzdGFydF90aW1lCisgICAgLSBwZXJjZW50YWdlKCk6IHBlcmNlbnRhZ2Ugb2YgdGhlIHByb2dyZXNzIFswLi4xMDBdLiBUaGlzIGlzIGEgbWV0aG9kLgorCisgICAgVGhlIGF0dHJpYnV0ZXMgYWJvdmUgYXJlIHVubGlrZWx5IHRvIGNoYW5nZSBiZXR3ZWVuIGRpZmZlcmVudCB2ZXJzaW9ucywKKyAgICB0aGUgb3RoZXIgb25lcyBtYXkgY2hhbmdlIG9yIGNlYXNlIHRvIGV4aXN0IHdpdGhvdXQgbm90aWNlLCBzbyB0cnkgdG8gcmVseQorICAgIG9ubHkgb24gdGhlIG9uZXMgZG9jdW1lbnRlZCBhYm92ZSBpZiB5b3UgYXJlIGV4dGVuZGluZyB0aGUgcHJvZ3Jlc3MgYmFyLgorICAgICIiIgorCisgICAgX19zbG90c19fID0gKCdjdXJydmFsJywgJ2ZkJywgJ2ZpbmlzaGVkJywgJ2xhc3RfdXBkYXRlX3RpbWUnLCAnbWF4dmFsJywKKyAgICAgICAgICAgICAgICAgJ25leHRfdXBkYXRlJywgJ251bV9pbnRlcnZhbHMnLCAnc2Vjb25kc19lbGFwc2VkJywKKyAgICAgICAgICAgICAgICAgJ3NpZ25hbF9zZXQnLCAnc3RhcnRfdGltZScsICd0ZXJtX3dpZHRoJywgJ3VwZGF0ZV9pbnRlcnZhbCcsCisgICAgICAgICAgICAgICAgICd3aWRnZXRzJywgJ19pdGVyYWJsZScpCisKKyAgICBfREVGQVVMVF9NQVhWQUwgPSAxMDAKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXh2YWw9Tm9uZSwgd2lkZ2V0cz1kZWZhdWx0X3dpZGdldHMsIHRlcm1fd2lkdGg9Tm9uZSwKKyAgICAgICAgICAgICAgICAgZmQ9c3lzLnN0ZGVycik6CisgICAgICAgIHNlbGYubWF4dmFsID0gbWF4dmFsCisgICAgICAgIHNlbGYud2lkZ2V0cyA9IHdpZGdldHMKKyAgICAgICAgc2VsZi5mZCA9IGZkCisgICAgICAgIHNlbGYuc2lnbmFsX3NldCA9IEZhbHNlCisgICAgICAgIGlmIHRlcm1fd2lkdGggaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnRlcm1fd2lkdGggPSB0ZXJtX3dpZHRoCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5faGFuZGxlX3Jlc2l6ZShOb25lLCBOb25lKQorICAgICAgICAgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR1dJTkNILCBzZWxmLl9oYW5kbGVfcmVzaXplKQorICAgICAgICAgICAgICAgIHNlbGYuc2lnbmFsX3NldCA9IFRydWUKKyAgICAgICAgICAgIGV4Y2VwdCAoU3lzdGVtRXhpdCwgS2V5Ym9hcmRJbnRlcnJ1cHQpOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgc2VsZi50ZXJtX3dpZHRoID0gaW50KG9zLmVudmlyb24uZ2V0KCdDT0xVTU5TJywgODApKSAtIDEKKworICAgICAgICBzZWxmLmN1cnJ2YWwgPSAwCisgICAgICAgIHNlbGYuZmluaXNoZWQgPSBGYWxzZQorICAgICAgICBzZWxmLnN0YXJ0X3RpbWUgPSBOb25lCisgICAgICAgIHNlbGYubGFzdF91cGRhdGVfdGltZSA9IE5vbmUKKyAgICAgICAgc2VsZi5zZWNvbmRzX2VsYXBzZWQgPSAwCisgICAgICAgIHNlbGYuX2l0ZXJhYmxlID0gTm9uZQorCisgICAgZGVmIF9fY2FsbF9fKHNlbGYsIGl0ZXJhYmxlKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5tYXh2YWwgPSBsZW4oaXRlcmFibGUpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAjIElmIHRoZSBpdGVyYWJsZSBoYXMgbm8gbGVuZ3RoLCB0aGVuIHJlbHkgb24gdGhlIHZhbHVlIHByb3ZpZGVkCisgICAgICAgICAgICAjIGJ5IHRoZSB1c2VyLCBvdGhlcndpc2UgZmFpbC4KKyAgICAgICAgICAgIGlmIG5vdCAoaXNpbnN0YW5jZShzZWxmLm1heHZhbCwgKGludCwgbG9uZykpIGFuZCBzZWxmLm1heHZhbCA+IDApOgorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignQ291bGQgbm90IGRldGVybWluZSBtYXh2YWwgZnJvbSBpdGVyYWJsZS4gJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWW91IG11c3QgZXhwbGljaXRseSBwcm92aWRlIGEgbWF4dmFsLicpCisgICAgICAgIHNlbGYuX2l0ZXJhYmxlID0gaXRlcihpdGVyYWJsZSkKKyAgICAgICAgc2VsZi5zdGFydCgpCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbmV4dCA9IHNlbGYuX2l0ZXJhYmxlLm5leHQoKQorICAgICAgICAgICAgc2VsZi51cGRhdGUoc2VsZi5jdXJydmFsICsgMSkKKyAgICAgICAgICAgIHJldHVybiBuZXh0CisgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgc2VsZi5maW5pc2goKQorICAgICAgICAgICAgcmFpc2UKKworICAgIGRlZiBfaGFuZGxlX3Jlc2l6ZShzZWxmLCBzaWdudW0sIGZyYW1lKToKKyAgICAgICAgaCwgdyA9IGFycmF5KCdoJywgaW9jdGwoc2VsZi5mZCwgdGVybWlvcy5USU9DR1dJTlNaLCAnXDAnICogOCkpWzoyXQorICAgICAgICBzZWxmLnRlcm1fd2lkdGggPSB3CisKKyAgICBkZWYgcGVyY2VudGFnZShzZWxmKToKKyAgICAgICAgIlJldHVybnMgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHByb2dyZXNzLiIKKyAgICAgICAgcmV0dXJuIHNlbGYuY3VycnZhbCAqIDEwMC4wIC8gc2VsZi5tYXh2YWwKKworICAgIGRlZiBfZm9ybWF0X3dpZGdldHMoc2VsZik6CisgICAgICAgIHIgPSBbXQorICAgICAgICBoZmlsbF9pbmRzID0gW10KKyAgICAgICAgbnVtX2hmaWxsID0gMAorICAgICAgICBjdXJyd2lkdGggPSAwCisgICAgICAgIGZvciBpLCB3IGluIGVudW1lcmF0ZShzZWxmLndpZGdldHMpOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh3LCBQcm9ncmVzc0JhcldpZGdldEhGaWxsKToKKyAgICAgICAgICAgICAgICByLmFwcGVuZCh3KQorICAgICAgICAgICAgICAgIGhmaWxsX2luZHMuYXBwZW5kKGkpCisgICAgICAgICAgICAgICAgbnVtX2hmaWxsICs9IDEKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh3LCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgICAgICByLmFwcGVuZCh3KQorICAgICAgICAgICAgICAgIGN1cnJ3aWR0aCArPSBsZW4odykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgd2V2YWwgPSB3LnVwZGF0ZShzZWxmKQorICAgICAgICAgICAgICAgIGN1cnJ3aWR0aCArPSBsZW4od2V2YWwpCisgICAgICAgICAgICAgICAgci5hcHBlbmQod2V2YWwpCisgICAgICAgIGZvciBpdyBpbiBoZmlsbF9pbmRzOgorICAgICAgICAgICAgd2lkZ2V0X3dpZHRoID0gaW50KChzZWxmLnRlcm1fd2lkdGggLSBjdXJyd2lkdGgpIC8vIG51bV9oZmlsbCkKKyAgICAgICAgICAgIHJbaXddID0gcltpd10udXBkYXRlKHNlbGYsIHdpZGdldF93aWR0aCkKKyAgICAgICAgcmV0dXJuIHIKKworICAgIGRlZiBfZm9ybWF0X2xpbmUoc2VsZik6CisgICAgICAgIHJldHVybiAnJy5qb2luKHNlbGYuX2Zvcm1hdF93aWRnZXRzKCkpLmxqdXN0KHNlbGYudGVybV93aWR0aCkKKworICAgIGRlZiBfbmV4dF91cGRhdGUoc2VsZik6CisgICAgICAgIHJldHVybiBpbnQoKGludChzZWxmLm51bV9pbnRlcnZhbHMgKgorICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYuY3VycnZhbCAvIHNlbGYubWF4dmFsKSkgKyAxKSAqCisgICAgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVfaW50ZXJ2YWwpCisKKyAgICBkZWYgX25lZWRfdXBkYXRlKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm5zIHRydWUgd2hlbiB0aGUgcHJvZ3Jlc3NiYXIgc2hvdWxkIHByaW50IGFuIHVwZGF0ZWQgbGluZS4KKworICAgICAgICBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHlvdSB3YW50IGZpbmVyIGdyYWluZWQgY29udHJvbCBvdmVyCisgICAgICAgIHVwZGF0ZXMuCisKKyAgICAgICAgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gaXMgb3B0aW1pemVkIHRvIGJlIGFzIGZhc3QgYXMgcG9zc2libGUgYW5kCisgICAgICAgIGFzIGVjb25vbWljYWwgYXMgcG9zc2libGUgaW4gdGhlIG51bWJlciBvZiB1cGRhdGVzLiBIb3dldmVyLCBkZXBlbmRpbmcKKyAgICAgICAgb24geW91ciB1c2FnZSB5b3UgbWF5IHdhbnQgdG8gZG8gbW9yZSB1cGRhdGVzLiBGb3IgaW5zdGFuY2UsIGlmIHlvdXIKKyAgICAgICAgcHJvZ3Jlc3NiYXIgc3RheXMgaW4gdGhlIHNhbWUgcGVyY2VudGFnZSBmb3IgYSBsb25nIHRpbWUsIGFuZCB5b3Ugd2FudAorICAgICAgICB0byB1cGRhdGUgb3RoZXIgd2lkZ2V0cywgbGlrZSBFVEEsIHRoZW4geW91IGNvdWxkIHJldHVybiBUcnVlIGFmdGVyCisgICAgICAgIHNvbWUgdGltZSBoYXMgcGFzc2VkIHdpdGggbm8gdXBkYXRlcy4KKworICAgICAgICBJZGVhbGx5IHlvdSBjb3VsZCBjYWxsIHNlbGYuX2Zvcm1hdF9saW5lKCkgYW5kIHNlZSBpZiBpdCdzIGRpZmZlcmVudAorICAgICAgICBmcm9tIHRoZSBwcmV2aW91cyBfZm9ybWF0X2xpbmUoKSBjYWxsLCBidXQgY2FsbGluZyBfZm9ybWF0X2xpbmUoKSB0YWtlcworICAgICAgICBhcm91bmQgMjAgdGltZXMgbW9yZSB0aW1lIHRoYW4gY2FsbGluZyB0aGlzIGltcGxlbWVudGF0aW9uIG9mCisgICAgICAgIF9uZWVkX3VwZGF0ZSgpLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuY3VycnZhbCA+PSBzZWxmLm5leHRfdXBkYXRlCisKKyAgICBkZWYgdXBkYXRlKHNlbGYsIHZhbHVlKToKKyAgICAgICAgIlVwZGF0ZXMgdGhlIHByb2dyZXNzIGJhciB0byBhIG5ldyB2YWx1ZS4iCisgICAgICAgIGFzc2VydCAwIDw9IHZhbHVlIDw9IHNlbGYubWF4dmFsLCAnMCA8PSAlZCA8PSAlZCcgJSAodmFsdWUsIHNlbGYubWF4dmFsKQorICAgICAgICBzZWxmLmN1cnJ2YWwgPSB2YWx1ZQorICAgICAgICBpZiBub3Qgc2VsZi5fbmVlZF91cGRhdGUoKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLnN0YXJ0X3RpbWUgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignWW91IG11c3QgY2FsbCBzdGFydCgpIGJlZm9yZSBjYWxsaW5nIHVwZGF0ZSgpJykKKyAgICAgICAgbm93ID0gdGltZS50aW1lKCkKKyAgICAgICAgc2VsZi5zZWNvbmRzX2VsYXBzZWQgPSBub3cgLSBzZWxmLnN0YXJ0X3RpbWUKKyAgICAgICAgc2VsZi5uZXh0X3VwZGF0ZSA9IHNlbGYuX25leHRfdXBkYXRlKCkKKyAgICAgICAgc2VsZi5mZC53cml0ZShzZWxmLl9mb3JtYXRfbGluZSgpICsgJ1xyJykKKyAgICAgICAgc2VsZi5sYXN0X3VwZGF0ZV90aW1lID0gbm93CisKKyAgICBkZWYgc3RhcnQoc2VsZik6CisgICAgICAgICIiIlN0YXJ0cyBtZWFzdXJpbmcgdGltZSwgYW5kIHByaW50cyB0aGUgYmFyIGF0IDAlLgorCisgICAgICAgIEl0IHJldHVybnMgc2VsZiBzbyB5b3UgY2FuIHVzZSBpdCBsaWtlIHRoaXM6CisgICAgICAgID4+PiBwYmFyID0gUHJvZ3Jlc3NCYXIoKS5zdGFydCgpCisgICAgICAgID4+PiBmb3IgaSBpbiB4cmFuZ2UoMTAwKToKKyAgICAgICAgLi4uICAgICMgZG8gc29tZXRoaW5nCisgICAgICAgIC4uLiAgICBwYmFyLnVwZGF0ZShpKzEpCisgICAgICAgIC4uLgorICAgICAgICA+Pj4gcGJhci5maW5pc2goKQorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5tYXh2YWwgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYubWF4dmFsID0gc2VsZi5fREVGQVVMVF9NQVhWQUwKKyAgICAgICAgYXNzZXJ0IHNlbGYubWF4dmFsID4gMAorCisgICAgICAgIHNlbGYubnVtX2ludGVydmFscyA9IG1heCgxMDAsIHNlbGYudGVybV93aWR0aCkKKyAgICAgICAgc2VsZi51cGRhdGVfaW50ZXJ2YWwgPSBzZWxmLm1heHZhbCAvIHNlbGYubnVtX2ludGVydmFscworICAgICAgICBzZWxmLm5leHRfdXBkYXRlID0gMAorCisgICAgICAgIHNlbGYuc3RhcnRfdGltZSA9IHNlbGYubGFzdF91cGRhdGVfdGltZSA9IHRpbWUudGltZSgpCisgICAgICAgIHNlbGYudXBkYXRlKDApCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgZmluaXNoKHNlbGYpOgorICAgICAgICAiIiJVc2VkIHRvIHRlbGwgdGhlIHByb2dyZXNzIGlzIGZpbmlzaGVkLiIiIgorICAgICAgICBzZWxmLmZpbmlzaGVkID0gVHJ1ZQorICAgICAgICBzZWxmLnVwZGF0ZShzZWxmLm1heHZhbCkKKyAgICAgICAgc2VsZi5mZC53cml0ZSgnXG4nKQorICAgICAgICBpZiBzZWxmLnNpZ25hbF9zZXQ6CisgICAgICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdXSU5DSCwgc2lnbmFsLlNJR19ERkwpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9wcnNlcnYvX19pbml0X18ucHkgYi9iaXRiYWtlL2xpYi9wcnNlcnYvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNjYjczYQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3Byc2Vydi9fX2luaXRfXy5weQpAQCAtMCwwICsxLDE0IEBACitfX3ZlcnNpb25fXyA9ICIxLjAuMCIKKworaW1wb3J0IG9zLCB0aW1lCitpbXBvcnQgc3lzLGxvZ2dpbmcKKworZGVmIGluaXRfbG9nZ2VyKGxvZ2ZpbGUsIGxvZ2xldmVsKToKKyAgICBudW1lcmljX2xldmVsID0gZ2V0YXR0cihsb2dnaW5nLCBsb2dsZXZlbC51cHBlcigpLCBOb25lKQorICAgIGlmIG5vdCBpc2luc3RhbmNlKG51bWVyaWNfbGV2ZWwsIGludCk6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0ludmFsaWQgbG9nIGxldmVsOiAlcycgJSBsb2dsZXZlbCkKKyAgICBGT1JNQVQgPSAnJShhc2N0aW1lKS0xNXMgJShtZXNzYWdlKXMnCisgICAgbG9nZ2luZy5iYXNpY0NvbmZpZyhsZXZlbD1udW1lcmljX2xldmVsLCBmaWxlbmFtZT1sb2dmaWxlLCBmb3JtYXQ9Rk9STUFUKQorCitjbGFzcyBOb3RGb3VuZEVycm9yKEV4Y2VwdGlvbik6CisgICAgcGFzcwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvcHJzZXJ2L2RiLnB5IGIvYml0YmFrZS9saWIvcHJzZXJ2L2RiLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNzk1ODAKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9wcnNlcnYvZGIucHkKQEAgLTAsMCArMSwyNjggQEAKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgb3MucGF0aAoraW1wb3J0IGVycm5vCitpbXBvcnQgcHJzZXJ2CitpbXBvcnQgdGltZQorCit0cnk6CisgICAgaW1wb3J0IHNxbGl0ZTMKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBmcm9tIHB5c3FsaXRlMiBpbXBvcnQgZGJhcGkyIGFzIHNxbGl0ZTMKKworbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoIkJpdEJha2UuUFJzZXJ2IikKKworc3FsdmVyc2lvbiA9IHNxbGl0ZTMuc3FsaXRlX3ZlcnNpb25faW5mbworaWYgc3FsdmVyc2lvblswXSA8IDMgb3IgKHNxbHZlcnNpb25bMF0gPT0gMyBhbmQgc3FsdmVyc2lvblsxXSA8IDMpOgorICAgIHJhaXNlIEV4Y2VwdGlvbigic3FsaXRlMyB2ZXJzaW9uIDMuMy4wIG9yIGxhdGVyIGlzIHJlcXVpcmVkLiIpCisKKyMKKyMgIk5vIEhpc3RvcnkiIG1vZGUgLSBmb3IgYSBnaXZlbiBxdWVyeSB0dXBsZSAodmVyc2lvbiwgcGtnYXJjaCwgY2hlY2tzdW0pLAorIyB0aGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBiZSB0aGUgbGFyZ2VzdCBhbW9uZyBhbGwgdGhlIHZhbHVlcyBvZiB0aGUgc2FtZQorIyAodmVyc2lvbiwgcGtnYXJjaCkuIFRoaXMgbWVhbnMgdGhlIFBSIHZhbHVlIHJldHVybmVkIGNhbiBOT1QgYmUgZGVjcmVtZW50ZWQuCisjCisjICJIaXN0b3J5IiBtb2RlIC0gUmV0dXJuIGEgbmV3IGhpZ2hlciB2YWx1ZSBmb3IgcHJldmlvdXNseSB1bnNlZW4gcXVlcnkKKyMgdHVwbGUgKHZlcnNpb24sIHBrZ2FyY2gsIGNoZWNrc3VtKSwgb3RoZXJ3aXNlIHJldHVybiBoaXN0b3JpY2FsIHZhbHVlLgorIyBWYWx1ZSBjYW4gZGVjcmVtZW50IGlmIHJldHVybmluZyB0byBhIHByZXZpb3VzIGJ1aWxkLgorIworCitjbGFzcyBQUlRhYmxlKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbm4sIHRhYmxlLCBub2hpc3QpOgorICAgICAgICBzZWxmLmNvbm4gPSBjb25uCisgICAgICAgIHNlbGYubm9oaXN0ID0gbm9oaXN0CisgICAgICAgIHNlbGYuZGlydHkgPSBGYWxzZQorICAgICAgICBpZiBub2hpc3Q6CisgICAgICAgICAgICBzZWxmLnRhYmxlID0gIiVzX25vaGlzdCIgJSB0YWJsZSAKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudGFibGUgPSAiJXNfaGlzdCIgJSB0YWJsZSAKKworICAgICAgICBzZWxmLl9leGVjdXRlKCJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyAlcyBcCisgICAgICAgICAgICAgICAgICAgICh2ZXJzaW9uIFRFWFQgTk9UIE5VTEwsIFwKKyAgICAgICAgICAgICAgICAgICAgcGtnYXJjaCBURVhUIE5PVCBOVUxMLCAgXAorICAgICAgICAgICAgICAgICAgICBjaGVja3N1bSBURVhUIE5PVCBOVUxMLCBcCisgICAgICAgICAgICAgICAgICAgIHZhbHVlIElOVEVHRVIsIFwKKyAgICAgICAgICAgICAgICAgICAgUFJJTUFSWSBLRVkgKHZlcnNpb24sIHBrZ2FyY2gsIGNoZWNrc3VtKSk7IiAlIHNlbGYudGFibGUpCisKKyAgICBkZWYgX2V4ZWN1dGUoc2VsZiwgKnF1ZXJ5KToKKyAgICAgICAgIiIiRXhlY3V0ZSBhIHF1ZXJ5LCB3YWl0aW5nIHRvIGFjcXVpcmUgYSBsb2NrIGlmIG5lY2Vzc2FyeSIiIgorICAgICAgICBzdGFydCA9IHRpbWUudGltZSgpCisgICAgICAgIGVuZCA9IHN0YXJ0ICsgMjAKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5jb25uLmV4ZWN1dGUoKnF1ZXJ5KQorICAgICAgICAgICAgZXhjZXB0IHNxbGl0ZTMuT3BlcmF0aW9uYWxFcnJvciBhcyBleGM6CisgICAgICAgICAgICAgICAgaWYgJ2lzIGxvY2tlZCcgaW4gc3RyKGV4YykgYW5kIGVuZCA+IHRpbWUudGltZSgpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHJhaXNlIGV4YworCisgICAgZGVmIHN5bmMoc2VsZik6CisgICAgICAgIHNlbGYuY29ubi5jb21taXQoKQorICAgICAgICBzZWxmLl9leGVjdXRlKCJCRUdJTiBFWENMVVNJVkUgVFJBTlNBQ1RJT04iKQorCisgICAgZGVmIHN5bmNfaWZfZGlydHkoc2VsZik6CisgICAgICAgIGlmIHNlbGYuZGlydHk6CisgICAgICAgICAgICBzZWxmLnN5bmMoKQorICAgICAgICAgICAgc2VsZi5kaXJ0eSA9IEZhbHNlCisKKyAgICBkZWYgX2dldFZhbHVlSGlzdChzZWxmLCB2ZXJzaW9uLCBwa2dhcmNoLCBjaGVja3N1bSk6CisgICAgICAgIGRhdGE9c2VsZi5fZXhlY3V0ZSgiU0VMRUNUIHZhbHVlIEZST00gJXMgV0hFUkUgdmVyc2lvbj0/IEFORCBwa2dhcmNoPT8gQU5EIGNoZWNrc3VtPT87IiAlIHNlbGYudGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVyc2lvbiwgcGtnYXJjaCwgY2hlY2tzdW0pKQorICAgICAgICByb3c9ZGF0YS5mZXRjaG9uZSgpCisgICAgICAgIGlmIHJvdyAhPSBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHJvd1swXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgI25vIHZhbHVlIGZvdW5kLCB0cnkgdG8gaW5zZXJ0CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5fZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgVkFMVUVTICg/LCA/LCA/LCAoc2VsZWN0IGlmbnVsbChtYXgodmFsdWUpKzEsMCkgZnJvbSAlcyB3aGVyZSB2ZXJzaW9uPT8gQU5EIHBrZ2FyY2g9PykpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHNlbGYudGFibGUsc2VsZi50YWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVyc2lvbixwa2dhcmNoLCBjaGVja3N1bSx2ZXJzaW9uLCBwa2dhcmNoKSkKKyAgICAgICAgICAgIGV4Y2VwdCBzcWxpdGUzLkludGVncml0eUVycm9yIGFzIGV4YzoKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3Ioc3RyKGV4YykpCisKKyAgICAgICAgICAgIHNlbGYuZGlydHkgPSBUcnVlCisKKyAgICAgICAgICAgIGRhdGE9c2VsZi5fZXhlY3V0ZSgiU0VMRUNUIHZhbHVlIEZST00gJXMgV0hFUkUgdmVyc2lvbj0/IEFORCBwa2dhcmNoPT8gQU5EIGNoZWNrc3VtPT87IiAlIHNlbGYudGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlcnNpb24sIHBrZ2FyY2gsIGNoZWNrc3VtKSkKKyAgICAgICAgICAgIHJvdz1kYXRhLmZldGNob25lKCkKKyAgICAgICAgICAgIGlmIHJvdyAhPSBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybiByb3dbMF0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgcHJzZXJ2Lk5vdEZvdW5kRXJyb3IKKworICAgIGRlZiBfZ2V0VmFsdWVOb2hpc3Qoc2VsZiwgdmVyc2lvbiwgcGtnYXJjaCwgY2hlY2tzdW0pOgorICAgICAgICBkYXRhPXNlbGYuX2V4ZWN1dGUoIlNFTEVDVCB2YWx1ZSBGUk9NICVzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSB2ZXJzaW9uPT8gQU5EIHBrZ2FyY2g9PyBBTkQgY2hlY2tzdW09PyBBTkQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID49IChzZWxlY3QgbWF4KHZhbHVlKSBmcm9tICVzIHdoZXJlIHZlcnNpb249PyBBTkQgcGtnYXJjaD0/KTsiIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHNlbGYudGFibGUsIHNlbGYudGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZXJzaW9uLCBwa2dhcmNoLCBjaGVja3N1bSwgdmVyc2lvbiwgcGtnYXJjaCkpCisgICAgICAgIHJvdz1kYXRhLmZldGNob25lKCkKKyAgICAgICAgaWYgcm93ICE9IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gcm93WzBdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjbm8gdmFsdWUgZm91bmQsIHRyeSB0byBpbnNlcnQKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLl9leGVjdXRlKCJJTlNFUlQgT1IgUkVQTEFDRSBJTlRPICVzIFZBTFVFUyAoPywgPywgPywgKHNlbGVjdCBpZm51bGwobWF4KHZhbHVlKSsxLDApIGZyb20gJXMgd2hlcmUgdmVyc2lvbj0/IEFORCBwa2dhcmNoPT8pKTsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoc2VsZi50YWJsZSxzZWxmLnRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVyc2lvbiwgcGtnYXJjaCwgY2hlY2tzdW0sIHZlcnNpb24sIHBrZ2FyY2gpKQorICAgICAgICAgICAgZXhjZXB0IHNxbGl0ZTMuSW50ZWdyaXR5RXJyb3IgYXMgZXhjOgorICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihzdHIoZXhjKSkKKyAgICAgICAgICAgICAgICBzZWxmLmNvbm4ucm9sbGJhY2soKQorCisgICAgICAgICAgICBzZWxmLmRpcnR5ID0gVHJ1ZQorCisgICAgICAgICAgICBkYXRhPXNlbGYuX2V4ZWN1dGUoIlNFTEVDVCB2YWx1ZSBGUk9NICVzIFdIRVJFIHZlcnNpb249PyBBTkQgcGtnYXJjaD0/IEFORCBjaGVja3N1bT0/OyIgJSBzZWxmLnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZXJzaW9uLCBwa2dhcmNoLCBjaGVja3N1bSkpCisgICAgICAgICAgICByb3c9ZGF0YS5mZXRjaG9uZSgpCisgICAgICAgICAgICBpZiByb3cgIT0gTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4gcm93WzBdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIHByc2Vydi5Ob3RGb3VuZEVycm9yCisKKyAgICBkZWYgZ2V0VmFsdWUoc2VsZiwgdmVyc2lvbiwgcGtnYXJjaCwgY2hlY2tzdW0pOgorICAgICAgICBpZiBzZWxmLm5vaGlzdDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXRWYWx1ZU5vaGlzdCh2ZXJzaW9uLCBwa2dhcmNoLCBjaGVja3N1bSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXRWYWx1ZUhpc3QodmVyc2lvbiwgcGtnYXJjaCwgY2hlY2tzdW0pCisKKyAgICBkZWYgX2ltcG9ydEhpc3Qoc2VsZiwgdmVyc2lvbiwgcGtnYXJjaCwgY2hlY2tzdW0sIHZhbHVlKToKKyAgICAgICAgdmFsID0gTm9uZSAKKyAgICAgICAgZGF0YSA9IHNlbGYuX2V4ZWN1dGUoIlNFTEVDVCB2YWx1ZSBGUk9NICVzIFdIRVJFIHZlcnNpb249PyBBTkQgcGtnYXJjaD0/IEFORCBjaGVja3N1bT0/OyIgJSBzZWxmLnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlcnNpb24sIHBrZ2FyY2gsIGNoZWNrc3VtKSkKKyAgICAgICAgcm93ID0gZGF0YS5mZXRjaG9uZSgpCisgICAgICAgIGlmIHJvdyAhPSBOb25lOgorICAgICAgICAgICAgdmFsPXJvd1swXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgI25vIHZhbHVlIGZvdW5kLCB0cnkgdG8gaW5zZXJ0CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5fZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgVkFMVUVTICg/LCA/LCA/LCA/KTsiICAlIChzZWxmLnRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZXJzaW9uLCBwa2dhcmNoLCBjaGVja3N1bSwgdmFsdWUpKQorICAgICAgICAgICAgZXhjZXB0IHNxbGl0ZTMuSW50ZWdyaXR5RXJyb3IgYXMgZXhjOgorICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihzdHIoZXhjKSkKKworICAgICAgICAgICAgc2VsZi5kaXJ0eSA9IFRydWUKKworICAgICAgICAgICAgZGF0YSA9IHNlbGYuX2V4ZWN1dGUoIlNFTEVDVCB2YWx1ZSBGUk9NICVzIFdIRVJFIHZlcnNpb249PyBBTkQgcGtnYXJjaD0/IEFORCBjaGVja3N1bT0/OyIgJSBzZWxmLnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlcnNpb24sIHBrZ2FyY2gsIGNoZWNrc3VtKSkKKyAgICAgICAgICAgIHJvdyA9IGRhdGEuZmV0Y2hvbmUoKQorICAgICAgICAgICAgaWYgcm93ICE9IE5vbmU6CisgICAgICAgICAgICAgICAgdmFsID0gcm93WzBdCisgICAgICAgIHJldHVybiB2YWwKKworICAgIGRlZiBfaW1wb3J0Tm9oaXN0KHNlbGYsIHZlcnNpb24sIHBrZ2FyY2gsIGNoZWNrc3VtLCB2YWx1ZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgICN0cnkgdG8gaW5zZXJ0CisgICAgICAgICAgICBzZWxmLl9leGVjdXRlKCJJTlNFUlQgSU5UTyAlcyBWQUxVRVMgKD8sID8sID8sID8pOyIgICUgKHNlbGYudGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlcnNpb24sIHBrZ2FyY2gsIGNoZWNrc3VtLHZhbHVlKSkKKyAgICAgICAgZXhjZXB0IHNxbGl0ZTMuSW50ZWdyaXR5RXJyb3IgYXMgZXhjOgorICAgICAgICAgICAgI2FscmVhZHkgaGF2ZSB0aGUgcmVjb3JkLCB0cnkgdG8gdXBkYXRlCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5fZXhlY3V0ZSgiVVBEQVRFICVzIFNFVCB2YWx1ZT0/IFdIRVJFIHZlcnNpb249PyBBTkQgcGtnYXJjaD0/IEFORCBjaGVja3N1bT0/IEFORCB2YWx1ZTw/IiAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChzZWxmLnRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmFsdWUsdmVyc2lvbixwa2dhcmNoLGNoZWNrc3VtLHZhbHVlKSkKKyAgICAgICAgICAgIGV4Y2VwdCBzcWxpdGUzLkludGVncml0eUVycm9yIGFzIGV4YzoKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3Ioc3RyKGV4YykpCisKKyAgICAgICAgc2VsZi5kaXJ0eSA9IFRydWUKKworICAgICAgICBkYXRhID0gc2VsZi5fZXhlY3V0ZSgiU0VMRUNUIHZhbHVlIEZST00gJXMgV0hFUkUgdmVyc2lvbj0/IEFORCBwa2dhcmNoPT8gQU5EIGNoZWNrc3VtPT8gQU5EIHZhbHVlPj0/OyIgJSBzZWxmLnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZXJzaW9uLHBrZ2FyY2gsY2hlY2tzdW0sdmFsdWUpKQorICAgICAgICByb3c9ZGF0YS5mZXRjaG9uZSgpCisgICAgICAgIGlmIHJvdyAhPSBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHJvd1swXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBpbXBvcnRvbmUoc2VsZiwgdmVyc2lvbiwgcGtnYXJjaCwgY2hlY2tzdW0sIHZhbHVlKToKKyAgICAgICAgaWYgc2VsZi5ub2hpc3Q6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5faW1wb3J0Tm9oaXN0KHZlcnNpb24sIHBrZ2FyY2gsIGNoZWNrc3VtLCB2YWx1ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9pbXBvcnRIaXN0KHZlcnNpb24sIHBrZ2FyY2gsIGNoZWNrc3VtLCB2YWx1ZSkKKworICAgIGRlZiBleHBvcnQoc2VsZiwgdmVyc2lvbiwgcGtnYXJjaCwgY2hlY2tzdW0sIGNvbGluZm8pOgorICAgICAgICBtZXRhaW5mbyA9IHt9CisgICAgICAgICNjb2x1bW4gaW5mbyAKKyAgICAgICAgaWYgY29saW5mbzoKKyAgICAgICAgICAgIG1ldGFpbmZvWyd0YmxfbmFtZSddID0gc2VsZi50YWJsZQorICAgICAgICAgICAgbWV0YWluZm9bJ2NvcmVfdmVyJ10gPSBwcnNlcnYuX192ZXJzaW9uX18KKyAgICAgICAgICAgIG1ldGFpbmZvWydjb2xfaW5mbyddID0gW10KKyAgICAgICAgICAgIGRhdGEgPSBzZWxmLl9leGVjdXRlKCJQUkFHTUEgdGFibGVfaW5mbyglcyk7IiAlIHNlbGYudGFibGUpCisgICAgICAgICAgICBmb3Igcm93IGluIGRhdGE6CisgICAgICAgICAgICAgICAgY29sID0ge30KKyAgICAgICAgICAgICAgICBjb2xbJ25hbWUnXSA9IHJvd1snbmFtZSddCisgICAgICAgICAgICAgICAgY29sWyd0eXBlJ10gPSByb3dbJ3R5cGUnXQorICAgICAgICAgICAgICAgIGNvbFsnbm90bnVsbCddID0gcm93Wydub3RudWxsJ10KKyAgICAgICAgICAgICAgICBjb2xbJ2RmbHRfdmFsdWUnXSA9IHJvd1snZGZsdF92YWx1ZSddCisgICAgICAgICAgICAgICAgY29sWydwayddID0gcm93WydwayddCisgICAgICAgICAgICAgICAgbWV0YWluZm9bJ2NvbF9pbmZvJ10uYXBwZW5kKGNvbCkKKworICAgICAgICAjZGF0YSBpbmZvCisgICAgICAgIGRhdGFpbmZvID0gW10KKworICAgICAgICBpZiBzZWxmLm5vaGlzdDoKKyAgICAgICAgICAgIHNxbHN0bXQgPSAiU0VMRUNUIFQxLnZlcnNpb24sIFQxLnBrZ2FyY2gsIFQxLmNoZWNrc3VtLCBUMS52YWx1ZSBGUk9NICVzIGFzIFQxLCBcCisgICAgICAgICAgICAgICAgICAgIChTRUxFQ1QgdmVyc2lvbixwa2dhcmNoLG1heCh2YWx1ZSkgYXMgbWF4dmFsdWUgRlJPTSAlcyBHUk9VUCBCWSB2ZXJzaW9uLHBrZ2FyY2gpIGFzIFQyIFwKKyAgICAgICAgICAgICAgICAgICAgV0hFUkUgVDEudmVyc2lvbj1UMi52ZXJzaW9uIEFORCBUMS5wa2dhcmNoPVQyLnBrZ2FyY2ggQU5EIFQxLnZhbHVlPVQyLm1heHZhbHVlICIgJSAoc2VsZi50YWJsZSwgc2VsZi50YWJsZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNxbHN0bXQgPSAiU0VMRUNUICogRlJPTSAlcyBhcyBUMSBXSEVSRSAxPTEgIiAlIHNlbGYudGFibGUKKyAgICAgICAgc3FsYXJnID0gW10KKyAgICAgICAgd2hlcmUgPSAiIgorICAgICAgICBpZiB2ZXJzaW9uOgorICAgICAgICAgICAgd2hlcmUgKz0gIkFORCBUMS52ZXJzaW9uPT8gIgorICAgICAgICAgICAgc3FsYXJnLmFwcGVuZChzdHIodmVyc2lvbikpCisgICAgICAgIGlmIHBrZ2FyY2g6CisgICAgICAgICAgICB3aGVyZSArPSAiQU5EIFQxLnBrZ2FyY2g9PyAiCisgICAgICAgICAgICBzcWxhcmcuYXBwZW5kKHN0cihwa2dhcmNoKSkKKyAgICAgICAgaWYgY2hlY2tzdW06CisgICAgICAgICAgICB3aGVyZSArPSAiQU5EIFQxLmNoZWNrc3VtPT8gIgorICAgICAgICAgICAgc3FsYXJnLmFwcGVuZChzdHIoY2hlY2tzdW0pKQorCisgICAgICAgIHNxbHN0bXQgKz0gd2hlcmUgKyAiOyIKKworICAgICAgICBpZiBsZW4oc3FsYXJnKToKKyAgICAgICAgICAgIGRhdGEgPSBzZWxmLl9leGVjdXRlKHNxbHN0bXQsIHR1cGxlKHNxbGFyZykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkYXRhID0gc2VsZi5fZXhlY3V0ZShzcWxzdG10KQorICAgICAgICBmb3Igcm93IGluIGRhdGE6CisgICAgICAgICAgICBpZiByb3dbJ3ZlcnNpb24nXToKKyAgICAgICAgICAgICAgICBjb2wgPSB7fQorICAgICAgICAgICAgICAgIGNvbFsndmVyc2lvbiddID0gcm93Wyd2ZXJzaW9uJ10KKyAgICAgICAgICAgICAgICBjb2xbJ3BrZ2FyY2gnXSA9IHJvd1sncGtnYXJjaCddCisgICAgICAgICAgICAgICAgY29sWydjaGVja3N1bSddID0gcm93WydjaGVja3N1bSddCisgICAgICAgICAgICAgICAgY29sWyd2YWx1ZSddID0gcm93Wyd2YWx1ZSddCisgICAgICAgICAgICAgICAgZGF0YWluZm8uYXBwZW5kKGNvbCkKKyAgICAgICAgcmV0dXJuIChtZXRhaW5mbywgZGF0YWluZm8pCisKK2NsYXNzIFBSRGF0YShvYmplY3QpOgorICAgICIiIk9iamVjdCByZXByZXNlbnRpbmcgdGhlIFBSIGRhdGFiYXNlIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lLCBub2hpc3Q9VHJ1ZSk6CisgICAgICAgIHNlbGYuZmlsZW5hbWU9b3MucGF0aC5hYnNwYXRoKGZpbGVuYW1lKQorICAgICAgICBzZWxmLm5vaGlzdD1ub2hpc3QKKyAgICAgICAgI2J1aWxkIGRpcmVjdG9yeSBoaWVyYXJjaHkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MubWFrZWRpcnMob3MucGF0aC5kaXJuYW1lKHNlbGYuZmlsZW5hbWUpKQorICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlOgorICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FRVhJU1Q6CisgICAgICAgICAgICAgICAgcmFpc2UgZQorICAgICAgICBzZWxmLmNvbm5lY3Rpb249c3FsaXRlMy5jb25uZWN0KHNlbGYuZmlsZW5hbWUsIGlzb2xhdGlvbl9sZXZlbD0iRVhDTFVTSVZFIiwgY2hlY2tfc2FtZV90aHJlYWQgPSBGYWxzZSkKKyAgICAgICAgc2VsZi5jb25uZWN0aW9uLnJvd19mYWN0b3J5PXNxbGl0ZTMuUm93CisgICAgICAgIHNlbGYuY29ubmVjdGlvbi5leGVjdXRlKCJwcmFnbWEgc3luY2hyb25vdXMgPSBvZmY7IikKKyAgICAgICAgc2VsZi5jb25uZWN0aW9uLmV4ZWN1dGUoIlBSQUdNQSBqb3VybmFsX21vZGUgPSBXQUw7IikKKyAgICAgICAgc2VsZi5fdGFibGVzPXt9CisKKyAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgc2VsZi5jb25uZWN0aW9uLmNsb3NlKCkKKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLHRibG5hbWUpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh0YmxuYW1lLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigidGJsbmFtZSBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBub3QgJyVzJyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUodGJsbmFtZSkpCisgICAgICAgIGlmIHRibG5hbWUgaW4gc2VsZi5fdGFibGVzOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYmxlc1t0YmxuYW1lXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGFibGVvYmogPSBzZWxmLl90YWJsZXNbdGJsbmFtZV0gPSBQUlRhYmxlKHNlbGYuY29ubmVjdGlvbiwgdGJsbmFtZSwgc2VsZi5ub2hpc3QpCisgICAgICAgICAgICByZXR1cm4gdGFibGVvYmoKKworICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCB0YmxuYW1lKToKKyAgICAgICAgaWYgdGJsbmFtZSBpbiBzZWxmLl90YWJsZXM6CisgICAgICAgICAgICBkZWwgc2VsZi5fdGFibGVzW3RibG5hbWVdCisgICAgICAgIGxvZ2dlci5pbmZvKCJkcm9wIHRhYmxlICVzIiAlICh0YmxuYW1lKSkKKyAgICAgICAgc2VsZi5jb25uZWN0aW9uLmV4ZWN1dGUoIkRST1AgVEFCTEUgSUYgRVhJU1RTICVzOyIgJSB0YmxuYW1lKSAKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3Byc2Vydi9zZXJ2LnB5IGIvYml0YmFrZS9saWIvcHJzZXJ2L3NlcnYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMwZmZiOQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3Byc2Vydi9zZXJ2LnB5CkBAIC0wLDAgKzEsNDE4IEBACitpbXBvcnQgb3Msc3lzLGxvZ2dpbmcKK2ltcG9ydCBzaWduYWwsIHRpbWUKK2Zyb20gU2ltcGxlWE1MUlBDU2VydmVyIGltcG9ydCBTaW1wbGVYTUxSUENTZXJ2ZXIsIFNpbXBsZVhNTFJQQ1JlcXVlc3RIYW5kbGVyCitpbXBvcnQgdGhyZWFkaW5nCitpbXBvcnQgUXVldWUKKwordHJ5OgorICAgIGltcG9ydCBzcWxpdGUzCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZnJvbSBweXNxbGl0ZTIgaW1wb3J0IGRiYXBpMiBhcyBzcWxpdGUzCisKK2ltcG9ydCBiYi5zZXJ2ZXIueG1scnBjCitpbXBvcnQgcHJzZXJ2CitpbXBvcnQgcHJzZXJ2LmRiCitpbXBvcnQgZXJybm8KKworbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoIkJpdEJha2UuUFJzZXJ2IikKKworaWYgc3lzLmhleHZlcnNpb24gPCAweDAyMDYwMEYwOgorICAgIHByaW50KCJTb3JyeSwgcHl0aG9uIDIuNiBvciBsYXRlciBpcyByZXF1aXJlZC4iKQorICAgIHN5cy5leGl0KDEpCisKK2NsYXNzIEhhbmRsZXIoU2ltcGxlWE1MUlBDUmVxdWVzdEhhbmRsZXIpOgorICAgIGRlZiBfZGlzcGF0Y2goc2VsZixtZXRob2QscGFyYW1zKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdmFsdWU9c2VsZi5zZXJ2ZXIuZnVuY3NbbWV0aG9kXSgqcGFyYW1zKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBpbXBvcnQgdHJhY2ViYWNrCisgICAgICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIHJldHVybiB2YWx1ZQorCitQSURQUkVGSVggPSAiL3RtcC9QUlNlcnZlcl8lc18lcy5waWQiCitzaW5nbGV0b24gPSBOb25lCisKKworY2xhc3MgUFJTZXJ2ZXIoU2ltcGxlWE1MUlBDU2VydmVyKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGJmaWxlLCBsb2dmaWxlLCBpbnRlcmZhY2UsIGRhZW1vbj1UcnVlKToKKyAgICAgICAgJycnIGNvbnN0cnVjdG9yICcnJworICAgICAgICBpbXBvcnQgc29ja2V0CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIFNpbXBsZVhNTFJQQ1NlcnZlci5fX2luaXRfXyhzZWxmLCBpbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nUmVxdWVzdHM9RmFsc2UsIGFsbG93X25vbmU9VHJ1ZSkKKyAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKKyAgICAgICAgICAgIGlwPXNvY2tldC5nZXRob3N0YnluYW1lKGludGVyZmFjZVswXSkKKyAgICAgICAgICAgIHBvcnQ9aW50ZXJmYWNlWzFdCisgICAgICAgICAgICBtc2c9IlBSIFNlcnZlciB1bmFibGUgdG8gYmluZCB0byAlczolc1xuIiAlIChpcCwgcG9ydCkKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUobXNnKQorICAgICAgICAgICAgcmFpc2UgUFJTZXJ2aWNlQ29uZmlnRXJyb3IKKworICAgICAgICBzZWxmLmRiZmlsZT1kYmZpbGUKKyAgICAgICAgc2VsZi5kYWVtb249ZGFlbW9uCisgICAgICAgIHNlbGYubG9nZmlsZT1sb2dmaWxlCisgICAgICAgIHNlbGYud29ya2luZ190aHJlYWQ9Tm9uZQorICAgICAgICBzZWxmLmhvc3QsIHNlbGYucG9ydCA9IHNlbGYuc29ja2V0LmdldHNvY2tuYW1lKCkKKyAgICAgICAgc2VsZi5waWRmaWxlPVBJRFBSRUZJWCAlIChzZWxmLmhvc3QsIHNlbGYucG9ydCkKKworICAgICAgICBzZWxmLnJlZ2lzdGVyX2Z1bmN0aW9uKHNlbGYuZ2V0UFIsICJnZXRQUiIpCisgICAgICAgIHNlbGYucmVnaXN0ZXJfZnVuY3Rpb24oc2VsZi5xdWl0LCAicXVpdCIpCisgICAgICAgIHNlbGYucmVnaXN0ZXJfZnVuY3Rpb24oc2VsZi5waW5nLCAicGluZyIpCisgICAgICAgIHNlbGYucmVnaXN0ZXJfZnVuY3Rpb24oc2VsZi5leHBvcnQsICJleHBvcnQiKQorICAgICAgICBzZWxmLnJlZ2lzdGVyX2Z1bmN0aW9uKHNlbGYuaW1wb3J0b25lLCAiaW1wb3J0b25lIikKKyAgICAgICAgc2VsZi5yZWdpc3Rlcl9pbnRyb3NwZWN0aW9uX2Z1bmN0aW9ucygpCisKKyAgICAgICAgc2VsZi5kYiA9IHByc2Vydi5kYi5QUkRhdGEoc2VsZi5kYmZpbGUpCisgICAgICAgIHNlbGYudGFibGUgPSBzZWxmLmRiWyJQUk1BSU4iXQorCisgICAgICAgIHNlbGYucmVxdWVzdHF1ZXVlID0gUXVldWUuUXVldWUoKQorICAgICAgICBzZWxmLmhhbmRsZXJ0aHJlYWQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldCA9IHNlbGYucHJvY2Vzc19yZXF1ZXN0X3RocmVhZCkKKyAgICAgICAgc2VsZi5oYW5kbGVydGhyZWFkLmRhZW1vbiA9IEZhbHNlCisKKyAgICBkZWYgcHJvY2Vzc19yZXF1ZXN0X3RocmVhZChzZWxmKToKKyAgICAgICAgIiIiU2FtZSBhcyBpbiBCYXNlU2VydmVyIGJ1dCBhcyBhIHRocmVhZC4KKworICAgICAgICBJbiBhZGRpdGlvbiwgZXhjZXB0aW9uIGhhbmRsaW5nIGlzIGRvbmUgaGVyZS4KKworICAgICAgICAiIiIKKyAgICAgICAgaXRlcl9jb3VudCA9IDEKKyAgICAgICAgIyA2MCBpdGVyYXRpb25zIGJldHdlZW4gc3luY3Mgb3Igc3luYyBpZiBkaXJ0eSBldmVyeSB+MzAgc2Vjb25kcworICAgICAgICBpdGVyYXRpb25zX2JldHdlZW5fc3luYyA9IDYwCisKKyAgICAgICAgd2hpbGUgbm90IHNlbGYucXVpdDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAocmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpID0gc2VsZi5yZXF1ZXN0cXVldWUuZ2V0KFRydWUsIDMwKQorICAgICAgICAgICAgZXhjZXB0IFF1ZXVlLkVtcHR5OgorICAgICAgICAgICAgICAgIHNlbGYudGFibGUuc3luY19pZl9kaXJ0eSgpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmZpbmlzaF9yZXF1ZXN0KHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKQorICAgICAgICAgICAgICAgIHNlbGYuc2h1dGRvd25fcmVxdWVzdChyZXF1ZXN0KQorICAgICAgICAgICAgICAgIGl0ZXJfY291bnQgPSAoaXRlcl9jb3VudCArIDEpICUgaXRlcmF0aW9uc19iZXR3ZWVuX3N5bmMKKyAgICAgICAgICAgICAgICBpZiBpdGVyX2NvdW50ID09IDA6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudGFibGUuc3luY19pZl9kaXJ0eSgpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfZXJyb3IocmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpCisgICAgICAgICAgICAgICAgc2VsZi5zaHV0ZG93bl9yZXF1ZXN0KHJlcXVlc3QpCisgICAgICAgICAgICAgICAgc2VsZi50YWJsZS5zeW5jKCkKKyAgICAgICAgICAgIHNlbGYudGFibGUuc3luY19pZl9kaXJ0eSgpCisKKyAgICBkZWYgc2lnaW50X2hhbmRsZXIoc2VsZiwgc2lnbnVtLCBzdGFjayk6CisgICAgICAgIHNlbGYudGFibGUuc3luYygpCisKKyAgICBkZWYgc2lndGVybV9oYW5kbGVyKHNlbGYsIHNpZ251bSwgc3RhY2spOgorICAgICAgICBzZWxmLnRhYmxlLnN5bmMoKQorICAgICAgICByYWlzZSBTeXN0ZW1FeGl0CisKKyAgICBkZWYgcHJvY2Vzc19yZXF1ZXN0KHNlbGYsIHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKToKKyAgICAgICAgc2VsZi5yZXF1ZXN0cXVldWUucHV0KChyZXF1ZXN0LCBjbGllbnRfYWRkcmVzcykpCisKKyAgICBkZWYgZXhwb3J0KHNlbGYsIHZlcnNpb249Tm9uZSwgcGtnYXJjaD1Ob25lLCBjaGVja3N1bT1Ob25lLCBjb2xpbmZvPVRydWUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50YWJsZS5leHBvcnQodmVyc2lvbiwgcGtnYXJjaCwgY2hlY2tzdW0sIGNvbGluZm8pCisgICAgICAgIGV4Y2VwdCBzcWxpdGUzLkVycm9yIGFzIGV4YzoKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcihzdHIoZXhjKSkKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgaW1wb3J0b25lKHNlbGYsIHZlcnNpb24sIHBrZ2FyY2gsIGNoZWNrc3VtLCB2YWx1ZSk6CisgICAgICAgIHJldHVybiBzZWxmLnRhYmxlLmltcG9ydG9uZSh2ZXJzaW9uLCBwa2dhcmNoLCBjaGVja3N1bSwgdmFsdWUpCisKKyAgICBkZWYgcGluZyhzZWxmKToKKyAgICAgICAgcmV0dXJuIG5vdCBzZWxmLnF1aXQKKworICAgIGRlZiBnZXRpbmZvKHNlbGYpOgorICAgICAgICByZXR1cm4gKHNlbGYuaG9zdCwgc2VsZi5wb3J0KQorCisgICAgZGVmIGdldFBSKHNlbGYsIHZlcnNpb24sIHBrZ2FyY2gsIGNoZWNrc3VtKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudGFibGUuZ2V0VmFsdWUodmVyc2lvbiwgcGtnYXJjaCwgY2hlY2tzdW0pCisgICAgICAgIGV4Y2VwdCBwcnNlcnYuTm90Rm91bmRFcnJvcjoKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiY2FuIG5vdCBmaW5kIHZhbHVlIGZvciAoJXMsICVzKSIsdmVyc2lvbiwgY2hlY2tzdW0pCisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBleGNlcHQgc3FsaXRlMy5FcnJvciBhcyBleGM6CisgICAgICAgICAgICBsb2dnZXIuZXJyb3Ioc3RyKGV4YykpCisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIHF1aXQoc2VsZik6CisgICAgICAgIHNlbGYucXVpdD1UcnVlCisgICAgICAgIHJldHVybgorCisgICAgZGVmIHdvcmtfZm9yZXZlcihzZWxmLCk6CisgICAgICAgIHNlbGYucXVpdCA9IEZhbHNlCisgICAgICAgIHNlbGYudGltZW91dCA9IDAuNQorCisgICAgICAgIGxvZ2dlci5pbmZvKCJTdGFydGVkIFBSU2VydmVyIHdpdGggREJmaWxlOiAlcywgSVA6ICVzLCBQT1JUOiAlcywgUElEOiAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgKHNlbGYuZGJmaWxlLCBzZWxmLmhvc3QsIHNlbGYucG9ydCwgc3RyKG9zLmdldHBpZCgpKSkpCisKKyAgICAgICAgc2VsZi5oYW5kbGVydGhyZWFkLnN0YXJ0KCkKKyAgICAgICAgd2hpbGUgbm90IHNlbGYucXVpdDoKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlX3JlcXVlc3QoKQorICAgICAgICBzZWxmLmhhbmRsZXJ0aHJlYWQuam9pbigpCisgICAgICAgIHNlbGYudGFibGUuc3luYygpCisgICAgICAgIGxvZ2dlci5pbmZvKCJQUlNlcnZlcjogc3RvcHBpbmcuLi4iKQorICAgICAgICBzZWxmLnNlcnZlcl9jbG9zZSgpCisgICAgICAgIHJldHVybgorCisgICAgZGVmIHN0YXJ0KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmRhZW1vbjoKKyAgICAgICAgICAgIHBpZCA9IHNlbGYuZGFlbW9uaXplKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBpZCA9IHNlbGYuZm9yaygpCisKKyAgICAgICAgIyBFbnN1cmUgYm90aCB0aGUgcGFyZW50IHNlZXMgdGhpcyBhbmQgdGhlIGNoaWxkIGZyb20gdGhlIHdvcmtfZm9yZXZlciBsb2cgZW50cnkgYWJvdmUKKyAgICAgICAgbG9nZ2VyLmluZm8oIlN0YXJ0ZWQgUFJTZXJ2ZXIgd2l0aCBEQmZpbGU6ICVzLCBJUDogJXMsIFBPUlQ6ICVzLCBQSUQ6ICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAoc2VsZi5kYmZpbGUsIHNlbGYuaG9zdCwgc2VsZi5wb3J0LCBzdHIocGlkKSkpCisKKyAgICBkZWYgZGVscGlkKHNlbGYpOgorICAgICAgICBvcy5yZW1vdmUoc2VsZi5waWRmaWxlKQorCisgICAgZGVmIGRhZW1vbml6ZShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFNlZSBBZHZhbmNlZCBQcm9ncmFtbWluZyBpbiB0aGUgVU5JWCwgU2VjIDEzLjMKKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBpZCA9IG9zLmZvcmsoKQorICAgICAgICAgICAgaWYgcGlkID4gMDoKKyAgICAgICAgICAgICAgICBvcy53YWl0cGlkKHBpZCwgMCkKKyAgICAgICAgICAgICAgICAjcGFyZW50IHJldHVybiBpbnN0ZWFkIG9mIGV4aXQgdG8gZ2l2ZSBjb250cm9sIAorICAgICAgICAgICAgICAgIHJldHVybiBwaWQKKyAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiJXMgWyVkXSIgJSAoZS5zdHJlcnJvciwgZS5lcnJubykpCisKKyAgICAgICAgb3Muc2V0c2lkKCkKKyAgICAgICAgIiIiCisgICAgICAgIGZvcmsgYWdhaW4gdG8gbWFrZSBzdXJlIHRoZSBkYWVtb24gaXMgbm90IHNlc3Npb24gbGVhZGVyLCAKKyAgICAgICAgd2hpY2ggcHJldmVudHMgaXQgZnJvbSBhY3F1aXJpbmcgY29udHJvbGxpbmcgdGVybWluYWwKKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBpZCA9IG9zLmZvcmsoKQorICAgICAgICAgICAgaWYgcGlkID4gMDogI3BhcmVudAorICAgICAgICAgICAgICAgIG9zLl9leGl0KDApCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIiVzIFslZF0iICUgKGUuc3RyZXJyb3IsIGUuZXJybm8pKQorCisgICAgICAgIHNlbGYuY2xlYW51cF9oYW5kbGVzKCkKKyAgICAgICAgb3MuX2V4aXQoMCkKKworICAgIGRlZiBmb3JrKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBwaWQgPSBvcy5mb3JrKCkKKyAgICAgICAgICAgIGlmIHBpZCA+IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuIHBpZAorICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlOgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCIlcyBbJWRdIiAlIChlLnN0cmVycm9yLCBlLmVycm5vKSkKKworICAgICAgICBiYi51dGlscy5zaWduYWxfb25fcGFyZW50X2V4aXQoIlNJR1RFUk0iKQorICAgICAgICBzZWxmLmNsZWFudXBfaGFuZGxlcygpCisgICAgICAgIG9zLl9leGl0KDApCisKKyAgICBkZWYgY2xlYW51cF9oYW5kbGVzKHNlbGYpOgorICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdJTlQsIHNlbGYuc2lnaW50X2hhbmRsZXIpCisgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR1RFUk0sIHNlbGYuc2lndGVybV9oYW5kbGVyKQorICAgICAgICBvcy51bWFzaygwKQorICAgICAgICBvcy5jaGRpcigiLyIpCisKKyAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCisgICAgICAgIHN5cy5zdGRlcnIuZmx1c2goKQorICAgICAgICBzaSA9IGZpbGUoJy9kZXYvbnVsbCcsICdyJykKKyAgICAgICAgc28gPSBmaWxlKHNlbGYubG9nZmlsZSwgJ2ErJykKKyAgICAgICAgc2UgPSBzbworICAgICAgICBvcy5kdXAyKHNpLmZpbGVubygpLHN5cy5zdGRpbi5maWxlbm8oKSkKKyAgICAgICAgb3MuZHVwMihzby5maWxlbm8oKSxzeXMuc3Rkb3V0LmZpbGVubygpKQorICAgICAgICBvcy5kdXAyKHNlLmZpbGVubygpLHN5cy5zdGRlcnIuZmlsZW5vKCkpCisKKyAgICAgICAgIyBDbGVhciBvdXQgYWxsIGxvZyBoYW5kbGVycyBwcmlvciB0byB0aGUgZm9yaygpIHRvIGF2b2lkIGNhbGxpbmcKKyAgICAgICAgIyBldmVudCBoYW5kbGVycyBub3QgcGFydCBvZiB0aGUgUFJzZXJ2ZXIKKyAgICAgICAgZm9yIGxvZ2dlcl9pdGVyIGluIGxvZ2dpbmcuTG9nZ2VyLm1hbmFnZXIubG9nZ2VyRGljdC5rZXlzKCk6CisgICAgICAgICAgICBsb2dnaW5nLmdldExvZ2dlcihsb2dnZXJfaXRlcikuaGFuZGxlcnMgPSBbXQorCisgICAgICAgICMgRW5zdXJlIGxvZ2dpbmcgbWFrZXMgaXQgdG8gdGhlIGxvZ2ZpbGUKKyAgICAgICAgc3RyZWFtaGFuZGxlciA9IGxvZ2dpbmcuU3RyZWFtSGFuZGxlcigpCisgICAgICAgIHN0cmVhbWhhbmRsZXIuc2V0TGV2ZWwobG9nZ2luZy5ERUJVRykKKyAgICAgICAgZm9ybWF0dGVyID0gYmIubXNnLkJCTG9nRm9ybWF0dGVyKCIlKGxldmVsbmFtZSlzOiAlKG1lc3NhZ2UpcyIpCisgICAgICAgIHN0cmVhbWhhbmRsZXIuc2V0Rm9ybWF0dGVyKGZvcm1hdHRlcikKKyAgICAgICAgbG9nZ2VyLmFkZEhhbmRsZXIoc3RyZWFtaGFuZGxlcikKKworICAgICAgICAjIHdyaXRlIHBpZGZpbGUKKyAgICAgICAgcGlkID0gc3RyKG9zLmdldHBpZCgpKSAKKyAgICAgICAgcGYgPSBmaWxlKHNlbGYucGlkZmlsZSwgJ3cnKQorICAgICAgICBwZi53cml0ZSgiJXNcbiIgJSBwaWQpCisgICAgICAgIHBmLmNsb3NlKCkKKworICAgICAgICBzZWxmLndvcmtfZm9yZXZlcigpCisgICAgICAgIHNlbGYuZGVscGlkKCkKKworY2xhc3MgUFJTZXJ2U2luZ2xldG9uKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRiZmlsZSwgbG9nZmlsZSwgaW50ZXJmYWNlKToKKyAgICAgICAgc2VsZi5kYmZpbGUgPSBkYmZpbGUKKyAgICAgICAgc2VsZi5sb2dmaWxlID0gbG9nZmlsZQorICAgICAgICBzZWxmLmludGVyZmFjZSA9IGludGVyZmFjZQorICAgICAgICBzZWxmLmhvc3QgPSBOb25lCisgICAgICAgIHNlbGYucG9ydCA9IE5vbmUKKworICAgIGRlZiBzdGFydChzZWxmKToKKyAgICAgICAgc2VsZi5wcnNlcnYgPSBQUlNlcnZlcihzZWxmLmRiZmlsZSwgc2VsZi5sb2dmaWxlLCBzZWxmLmludGVyZmFjZSwgZGFlbW9uPUZhbHNlKQorICAgICAgICBzZWxmLnByc2Vydi5zdGFydCgpCisgICAgICAgIHNlbGYuaG9zdCwgc2VsZi5wb3J0ID0gc2VsZi5wcnNlcnYuZ2V0aW5mbygpCisKKyAgICBkZWYgZ2V0aW5mbyhzZWxmKToKKyAgICAgICAgcmV0dXJuIChzZWxmLmhvc3QsIHNlbGYucG9ydCkKKworY2xhc3MgUFJTZXJ2ZXJDb25uZWN0aW9uKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3QsIHBvcnQpOgorICAgICAgICBpZiBpc19sb2NhbF9zcGVjaWFsKGhvc3QsIHBvcnQpOgorICAgICAgICAgICAgaG9zdCwgcG9ydCA9IHNpbmdsZXRvbi5nZXRpbmZvKCkKKyAgICAgICAgc2VsZi5ob3N0ID0gaG9zdAorICAgICAgICBzZWxmLnBvcnQgPSBwb3J0CisgICAgICAgIHNlbGYuY29ubmVjdGlvbiwgc2VsZi50cmFuc3BvcnQgPSBiYi5zZXJ2ZXIueG1scnBjLl9jcmVhdGVfc2VydmVyKHNlbGYuaG9zdCwgc2VsZi5wb3J0KQorCisgICAgZGVmIHRlcm1pbmF0ZShzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbG9nZ2VyLmluZm8oIlRlcm1pbmF0aW5nIFBSU2VydmVyLi4uIikKKyAgICAgICAgICAgIHNlbGYuY29ubmVjdGlvbi5xdWl0KCkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6CisgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCIlc1xuIiAlIHN0cihleGMpKQorCisgICAgZGVmIGdldFBSKHNlbGYsIHZlcnNpb24sIHBrZ2FyY2gsIGNoZWNrc3VtKToKKyAgICAgICAgcmV0dXJuIHNlbGYuY29ubmVjdGlvbi5nZXRQUih2ZXJzaW9uLCBwa2dhcmNoLCBjaGVja3N1bSkKKworICAgIGRlZiBwaW5nKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5jb25uZWN0aW9uLnBpbmcoKQorCisgICAgZGVmIGV4cG9ydChzZWxmLHZlcnNpb249Tm9uZSwgcGtnYXJjaD1Ob25lLCBjaGVja3N1bT1Ob25lLCBjb2xpbmZvPVRydWUpOgorICAgICAgICByZXR1cm4gc2VsZi5jb25uZWN0aW9uLmV4cG9ydCh2ZXJzaW9uLCBwa2dhcmNoLCBjaGVja3N1bSwgY29saW5mbykKKworICAgIGRlZiBpbXBvcnRvbmUoc2VsZiwgdmVyc2lvbiwgcGtnYXJjaCwgY2hlY2tzdW0sIHZhbHVlKToKKyAgICAgICAgcmV0dXJuIHNlbGYuY29ubmVjdGlvbi5pbXBvcnRvbmUodmVyc2lvbiwgcGtnYXJjaCwgY2hlY2tzdW0sIHZhbHVlKQorCisgICAgZGVmIGdldGluZm8oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmhvc3QsIHNlbGYucG9ydAorCitkZWYgc3RhcnRfZGFlbW9uKGRiZmlsZSwgaG9zdCwgcG9ydCwgbG9nZmlsZSk6CisgICAgcGlkZmlsZSA9IFBJRFBSRUZJWCAlIChob3N0LCBwb3J0KQorICAgIHRyeToKKyAgICAgICAgcGYgPSBmaWxlKHBpZGZpbGUsJ3InKQorICAgICAgICBwaWQgPSBpbnQocGYucmVhZGxpbmUoKS5zdHJpcCgpKQorICAgICAgICBwZi5jbG9zZSgpCisgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgIHBpZCA9IE5vbmUKKworICAgIGlmIHBpZDoKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgicGlkZmlsZSAlcyBhbHJlYWR5IGV4aXN0LiBEYWVtb24gYWxyZWFkeSBydW5uaW5nP1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgcGlkZmlsZSkKKyAgICAgICAgcmV0dXJuIDEKKworICAgIHNlcnZlciA9IFBSU2VydmVyKG9zLnBhdGguYWJzcGF0aChkYmZpbGUpLCBvcy5wYXRoLmFic3BhdGgobG9nZmlsZSksIChob3N0LHBvcnQpKQorICAgIHNlcnZlci5zdGFydCgpCisgICAgcmV0dXJuIDAKKworZGVmIHN0b3BfZGFlbW9uKGhvc3QsIHBvcnQpOgorICAgIHBpZGZpbGUgPSBQSURQUkVGSVggJSAoaG9zdCwgcG9ydCkKKyAgICB0cnk6CisgICAgICAgIHBmID0gZmlsZShwaWRmaWxlLCdyJykKKyAgICAgICAgcGlkID0gaW50KHBmLnJlYWRsaW5lKCkuc3RyaXAoKSkKKyAgICAgICAgcGYuY2xvc2UoKQorICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICBwaWQgPSBOb25lCisKKyAgICBpZiBub3QgcGlkOgorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJwaWRmaWxlICVzIGRvZXMgbm90IGV4aXN0LiBEYWVtb24gbm90IHJ1bm5pbmc/XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAlIHBpZGZpbGUpCisKKyAgICB0cnk6CisgICAgICAgIFBSU2VydmVyQ29ubmVjdGlvbihob3N0LCBwb3J0KS50ZXJtaW5hdGUoKQorICAgIGV4Y2VwdDoKKyAgICAgICAgbG9nZ2VyLmNyaXRpY2FsKCJTdG9wIFBSU2VydmljZSAlczolZCBmYWlsZWQiICUgKGhvc3QscG9ydCkpCisKKyAgICB0cnk6CisgICAgICAgIGlmIHBpZDoKKyAgICAgICAgICAgIHdhaXRfdGltZW91dCA9IDAKKyAgICAgICAgICAgIHByaW50KCJXYWl0aW5nIGZvciBwci1zZXJ2ZXIgdG8gZXhpdC4iKQorICAgICAgICAgICAgd2hpbGUgaXNfcnVubmluZyhwaWQpIGFuZCB3YWl0X3RpbWVvdXQgPCA1MDoKKyAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMSkKKyAgICAgICAgICAgICAgICB3YWl0X3RpbWVvdXQgKz0gMQorCisgICAgICAgICAgICBpZiBpc19ydW5uaW5nKHBpZCk6CisgICAgICAgICAgICAgICAgcHJpbnQoIlNlbmRpbmcgU0lHVEVSTSB0byBwci1zZXJ2ZXIuIikKKyAgICAgICAgICAgICAgICBvcy5raWxsKHBpZCxzaWduYWwuU0lHVEVSTSkKKyAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMSkKKworICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocGlkZmlsZSk6CisgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHBpZGZpbGUpCisKKyAgICBleGNlcHQgT1NFcnJvciBhcyBlOgorICAgICAgICBlcnIgPSBzdHIoZSkKKyAgICAgICAgaWYgZXJyLmZpbmQoIk5vIHN1Y2ggcHJvY2VzcyIpIDw9IDA6CisgICAgICAgICAgICByYWlzZSBlCisKKyAgICByZXR1cm4gMAorCitkZWYgaXNfcnVubmluZyhwaWQpOgorICAgIHRyeToKKyAgICAgICAgb3Mua2lsbChwaWQsIDApCisgICAgZXhjZXB0IE9TRXJyb3IgYXMgZXJyOgorICAgICAgICBpZiBlcnIuZXJybm8gPT0gZXJybm8uRVNSQ0g6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICByZXR1cm4gVHJ1ZQorCitkZWYgaXNfbG9jYWxfc3BlY2lhbChob3N0LCBwb3J0KToKKyAgICBpZiBob3N0LnN0cmlwKCkudXBwZXIoKSA9PSAnbG9jYWxob3N0Jy51cHBlcigpIGFuZCAobm90IHBvcnQpOgorICAgICAgICByZXR1cm4gVHJ1ZQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBGYWxzZQorCitjbGFzcyBQUlNlcnZpY2VDb25maWdFcnJvcihFeGNlcHRpb24pOgorICAgIHBhc3MKKworZGVmIGF1dG9fc3RhcnQoZCk6CisgICAgZ2xvYmFsIHNpbmdsZXRvbgorCisgICAgaG9zdF9wYXJhbXMgPSBmaWx0ZXIoTm9uZSwgKGQuZ2V0VmFyKCdQUlNFUlZfSE9TVCcsIFRydWUpIG9yICcnKS5zcGxpdCgnOicpKQorICAgIGlmIG5vdCBob3N0X3BhcmFtczoKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGlmIGxlbihob3N0X3BhcmFtcykgIT0gMjoKKyAgICAgICAgbG9nZ2VyLmNyaXRpY2FsKCdcbicuam9pbihbJ1BSU0VSVl9IT1NUOiBpbmNvcnJlY3QgZm9ybWF0JywKKyAgICAgICAgICAgICAgICAnVXNhZ2U6IFBSU0VSVl9IT1NUID0gIjxob3N0bmFtZT46PHBvcnQ+IiddKSkKKyAgICAgICAgcmFpc2UgUFJTZXJ2aWNlQ29uZmlnRXJyb3IKKworICAgIGlmIGlzX2xvY2FsX3NwZWNpYWwoaG9zdF9wYXJhbXNbMF0sIGludChob3N0X3BhcmFtc1sxXSkpIGFuZCBub3Qgc2luZ2xldG9uOgorICAgICAgICBpbXBvcnQgYmIudXRpbHMKKyAgICAgICAgY2FjaGVkaXIgPSAoZC5nZXRWYXIoIlBFUlNJU1RFTlRfRElSIiwgVHJ1ZSkgb3IgZC5nZXRWYXIoIkNBQ0hFIiwgVHJ1ZSkpCisgICAgICAgIGlmIG5vdCBjYWNoZWRpcjoKKyAgICAgICAgICAgIGxvZ2dlci5jcml0aWNhbCgiUGxlYXNlIHNldCB0aGUgJ1BFUlNJU1RFTlRfRElSJyBvciAnQ0FDSEUnIHZhcmlhYmxlIikKKyAgICAgICAgICAgIHJhaXNlIFBSU2VydmljZUNvbmZpZ0Vycm9yCisgICAgICAgIGJiLnV0aWxzLm1rZGlyaGllcihjYWNoZWRpcikKKyAgICAgICAgZGJmaWxlID0gb3MucGF0aC5qb2luKGNhY2hlZGlyLCAicHJzZXJ2LnNxbGl0ZTMiKQorICAgICAgICBsb2dmaWxlID0gb3MucGF0aC5qb2luKGNhY2hlZGlyLCAicHJzZXJ2LmxvZyIpCisgICAgICAgIHNpbmdsZXRvbiA9IFBSU2VydlNpbmdsZXRvbihvcy5wYXRoLmFic3BhdGgoZGJmaWxlKSwgb3MucGF0aC5hYnNwYXRoKGxvZ2ZpbGUpLCAoImxvY2FsaG9zdCIsMCkpCisgICAgICAgIHNpbmdsZXRvbi5zdGFydCgpCisgICAgaWYgc2luZ2xldG9uOgorICAgICAgICBob3N0LCBwb3J0ID0gc2luZ2xldG9uLmdldGluZm8oKQorICAgIGVsc2U6CisgICAgICAgIGhvc3QgPSBob3N0X3BhcmFtc1swXQorICAgICAgICBwb3J0ID0gaW50KGhvc3RfcGFyYW1zWzFdKQorCisgICAgdHJ5OgorICAgICAgICBjb25uZWN0aW9uID0gUFJTZXJ2ZXJDb25uZWN0aW9uKGhvc3QscG9ydCkKKyAgICAgICAgY29ubmVjdGlvbi5waW5nKCkKKyAgICAgICAgcmVhbGhvc3QsIHJlYWxwb3J0ID0gY29ubmVjdGlvbi5nZXRpbmZvKCkKKyAgICAgICAgcmV0dXJuIHN0cihyZWFsaG9zdCkgKyAiOiIgKyBzdHIocmVhbHBvcnQpCisgICAgICAgIAorICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgIGxvZ2dlci5jcml0aWNhbCgiUFJzZXJ2aWNlICVzOiVkIG5vdCBhdmFpbGFibGUiICUgKGhvc3QsIHBvcnQpKQorICAgICAgICByYWlzZSBQUlNlcnZpY2VDb25maWdFcnJvcgorCitkZWYgYXV0b19zaHV0ZG93bihkPU5vbmUpOgorICAgIGdsb2JhbCBzaW5nbGV0b24KKyAgICBpZiBzaW5nbGV0b246CisgICAgICAgIGhvc3QsIHBvcnQgPSBzaW5nbGV0b24uZ2V0aW5mbygpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIFBSU2VydmVyQ29ubmVjdGlvbihob3N0LCBwb3J0KS50ZXJtaW5hdGUoKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBsb2dnZXIuY3JpdGljYWwoIlN0b3AgUFJTZXJ2aWNlICVzOiVkIGZhaWxlZCIgJSAoaG9zdCxwb3J0KSkKKyAgICAgICAgc2luZ2xldG9uID0gTm9uZQorCitkZWYgcGluZyhob3N0LCBwb3J0KToKKyAgICBjb25uPVBSU2VydmVyQ29ubmVjdGlvbihob3N0LCBwb3J0KQorICAgIHJldHVybiBjb25uLnBpbmcoKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvcHlpbm90aWZ5LnB5IGIvYml0YmFrZS9saWIvcHlpbm90aWZ5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYWUwMDIKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9weWlub3RpZnkucHkKQEAgLTAsMCArMSwyNDE2IEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIyBweWlub3RpZnkucHkgLSBweXRob24gaW50ZXJmYWNlIHRvIGlub3RpZnkKKyMgQ29weXJpZ2h0IChjKSAyMDA1LTIwMTUgU2ViYXN0aWVuIE1hcnRpbmkgPHNlYkBkYnp0ZWFtLm9yZz4KKyMKKyMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorIyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorIyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisjIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyMgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisjIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisjCisjIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisjIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorIworIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorIyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisjIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyMgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyMgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorIyBUSEUgU09GVFdBUkUuCisiIiIKK3B5aW5vdGlmeQorCitAYXV0aG9yOiBTZWJhc3RpZW4gTWFydGluaQorQGxpY2Vuc2U6IE1JVCBMaWNlbnNlCitAY29udGFjdDogc2ViQGRienRlYW0ub3JnCisiIiIKKworY2xhc3MgUHlpbm90aWZ5RXJyb3IoRXhjZXB0aW9uKToKKyAgICAiIiJJbmRpY2F0ZXMgZXhjZXB0aW9ucyByYWlzZWQgYnkgYSBQeWlub3RpZnkgY2xhc3MuIiIiCisgICAgcGFzcworCisKK2NsYXNzIFVuc3VwcG9ydGVkUHl0aG9uVmVyc2lvbkVycm9yKFB5aW5vdGlmeUVycm9yKToKKyAgICAiIiIKKyAgICBSYWlzZWQgb24gdW5zdXBwb3J0ZWQgUHl0aG9uIHZlcnNpb25zLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2ZXJzaW9uKToKKyAgICAgICAgIiIiCisgICAgICAgIEBwYXJhbSB2ZXJzaW9uOiBDdXJyZW50IFB5dGhvbiB2ZXJzaW9uCisgICAgICAgIEB0eXBlIHZlcnNpb246IHN0cmluZworICAgICAgICAiIiIKKyAgICAgICAgZXJyID0gJ1B5dGhvbiAlcyBpcyB1bnN1cHBvcnRlZCwgcmVxdWlyZXMgYXQgbGVhc3QgUHl0aG9uIDIuNCcKKyAgICAgICAgUHlpbm90aWZ5RXJyb3IuX19pbml0X18oc2VsZiwgZXJyICUgdmVyc2lvbikKKworCisjIENoZWNrIFB5dGhvbiB2ZXJzaW9uCitpbXBvcnQgc3lzCitpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDQpOgorICAgIHJhaXNlIFVuc3VwcG9ydGVkUHl0aG9uVmVyc2lvbkVycm9yKHN5cy52ZXJzaW9uKQorCisKKyMgSW1wb3J0IGRpcmVjdGl2ZXMKK2ltcG9ydCB0aHJlYWRpbmcKK2ltcG9ydCBvcworaW1wb3J0IHNlbGVjdAoraW1wb3J0IHN0cnVjdAoraW1wb3J0IGZjbnRsCitpbXBvcnQgZXJybm8KK2ltcG9ydCB0ZXJtaW9zCitpbXBvcnQgYXJyYXkKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgYXRleGl0Citmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZXF1ZQorZnJvbSBkYXRldGltZSBpbXBvcnQgZGF0ZXRpbWUsIHRpbWVkZWx0YQoraW1wb3J0IHRpbWUKK2ltcG9ydCByZQoraW1wb3J0IGFzeW5jb3JlCitpbXBvcnQgc3VicHJvY2VzcworCit0cnk6CisgICAgZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHJlZHVjZQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHBhc3MgICMgV2lsbCBmYWlsIG9uIFB5dGhvbiAyLjQgd2hpY2ggaGFzIHJlZHVjZSgpIGJ1aWx0aW4gYW55d2F5LgorCit0cnk6CisgICAgZnJvbSBnbG9iIGltcG9ydCBpZ2xvYiBhcyBnbG9iCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgIyBQeXRob24gMi40IGRvZXMgbm90IGhhdmUgZ2xvYi5pZ2xvYigpLgorICAgIGZyb20gZ2xvYiBpbXBvcnQgZ2xvYiBhcyBnbG9iCisKK3RyeToKKyAgICBpbXBvcnQgY3R5cGVzCisgICAgaW1wb3J0IGN0eXBlcy51dGlsCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgY3R5cGVzID0gTm9uZQorCit0cnk6CisgICAgaW1wb3J0IGlub3RpZnlfc3lzY2FsbHMKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBpbm90aWZ5X3N5c2NhbGxzID0gTm9uZQorCisKK19fYXV0aG9yX18gPSAic2ViQGRienRlYW0ub3JnIChTZWJhc3RpZW4gTWFydGluaSkiCisKK19fdmVyc2lvbl9fID0gIjAuOS41IgorCitfX21ldGFjbGFzc19fID0gdHlwZSAgIyBVc2UgbmV3LXN0eWxlIGNsYXNzZXMgYnkgZGVmYXVsdAorCisKKyMgQ29tcGF0aWJpdHkgbW9kZTogc2V0IHRvIFRydWUgdG8gaW1wcm92ZSBjb21wYXRpYmlsaXR5IHdpdGgKKyMgUHlpbm90aWZ5IDAuNy4xLiBEbyBub3Qgc2V0IHRoaXMgdmFyaWFibGUgeW91cnNlbGYsIGNhbGwgdGhlCisjIGZ1bmN0aW9uIGNvbXBhdGliaWxpdHlfbW9kZSgpIGluc3RlYWQuCitDT01QQVRJQklMSVRZX01PREUgPSBGYWxzZQorCisKK2NsYXNzIElub3RpZnlCaW5kaW5nTm90Rm91bmRFcnJvcihQeWlub3RpZnlFcnJvcik6CisgICAgIiIiCisgICAgUmFpc2VkIHdoZW4gbm8gaW5vdGlmeSBzdXBwb3J0IGNvdWxkbid0IGJlIGZvdW5kLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgZXJyID0gIkNvdWxkbid0IGZpbmQgYW55IGlub3RpZnkgYmluZGluZyIKKyAgICAgICAgUHlpbm90aWZ5RXJyb3IuX19pbml0X18oc2VsZiwgZXJyKQorCisKK2NsYXNzIElOb3RpZnlXcmFwcGVyOgorICAgICIiIgorICAgIEFic3RyYWN0IGNsYXNzIHdyYXBwaW5nIGFjY2VzcyB0byBpbm90aWZ5J3MgZnVuY3Rpb25zLiBUaGlzIGlzIGFuCisgICAgaW50ZXJuYWwgY2xhc3MuCisgICAgIiIiCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBjcmVhdGUoKToKKyAgICAgICAgIyBGaXJzdCwgdHJ5IHRvIHVzZSBjdHlwZXMuCisgICAgICAgIGlmIGN0eXBlczoKKyAgICAgICAgICAgIGlub3RpZnkgPSBfQ3R5cGVzTGliY0lOb3RpZnlXcmFwcGVyKCkKKyAgICAgICAgICAgIGlmIGlub3RpZnkuaW5pdCgpOgorICAgICAgICAgICAgICAgIHJldHVybiBpbm90aWZ5CisgICAgICAgICMgU2Vjb25kLCBzZWUgaWYgQyBleHRlbnNpb24gaXMgY29tcGlsZWQuCisgICAgICAgIGlmIGlub3RpZnlfc3lzY2FsbHM6CisgICAgICAgICAgICBpbm90aWZ5ID0gX0lOb3RpZnlTeXNjYWxsc1dyYXBwZXIoKQorICAgICAgICAgICAgaWYgaW5vdGlmeS5pbml0KCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGlub3RpZnkKKworICAgIGRlZiBnZXRfZXJybm8oc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gTm9uZSBpcyBubyBlcnJubyBjb2RlIGlzIGF2YWlsYWJsZS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9nZXRfZXJybm8oKQorCisgICAgZGVmIHN0cl9lcnJubyhzZWxmKToKKyAgICAgICAgY29kZSA9IHNlbGYuZ2V0X2Vycm5vKCkKKyAgICAgICAgaWYgY29kZSBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuICdFcnJubzogbm8gZXJybm8gc3VwcG9ydCcKKyAgICAgICAgcmV0dXJuICdFcnJubz0lcyAoJXMpJyAlIChvcy5zdHJlcnJvcihjb2RlKSwgZXJybm8uZXJyb3Jjb2RlW2NvZGVdKQorCisgICAgZGVmIGlub3RpZnlfaW5pdChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2lub3RpZnlfaW5pdCgpCisKKyAgICBkZWYgaW5vdGlmeV9hZGRfd2F0Y2goc2VsZiwgZmQsIHBhdGhuYW1lLCBtYXNrKToKKyAgICAgICAgIyBVbmljb2RlIHN0cmluZ3MgbXVzdCBiZSBlbmNvZGVkIHRvIHN0cmluZyBwcmlvciB0byBjYWxsaW5nIHRoaXMKKyAgICAgICAgIyBtZXRob2QuCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHBhdGhuYW1lLCBzdHIpCisgICAgICAgIHJldHVybiBzZWxmLl9pbm90aWZ5X2FkZF93YXRjaChmZCwgcGF0aG5hbWUsIG1hc2spCisKKyAgICBkZWYgaW5vdGlmeV9ybV93YXRjaChzZWxmLCBmZCwgd2QpOgorICAgICAgICByZXR1cm4gc2VsZi5faW5vdGlmeV9ybV93YXRjaChmZCwgd2QpCisKKworY2xhc3MgX0lOb3RpZnlTeXNjYWxsc1dyYXBwZXIoSU5vdGlmeVdyYXBwZXIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgIyBTdG9yZXMgdGhlIGxhc3QgZXJybm8gdmFsdWUuCisgICAgICAgIHNlbGYuX2xhc3RfZXJybm8gPSBOb25lCisKKyAgICBkZWYgaW5pdChzZWxmKToKKyAgICAgICAgYXNzZXJ0IGlub3RpZnlfc3lzY2FsbHMKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBfZ2V0X2Vycm5vKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fbGFzdF9lcnJubworCisgICAgZGVmIF9pbm90aWZ5X2luaXQoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZkID0gaW5vdGlmeV9zeXNjYWxscy5pbm90aWZ5X2luaXQoKQorICAgICAgICBleGNlcHQgSU9FcnJvciwgZXJyOgorICAgICAgICAgICAgc2VsZi5fbGFzdF9lcnJubyA9IGVyci5lcnJubworICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgIHJldHVybiBmZAorCisgICAgZGVmIF9pbm90aWZ5X2FkZF93YXRjaChzZWxmLCBmZCwgcGF0aG5hbWUsIG1hc2spOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB3ZCA9IGlub3RpZnlfc3lzY2FsbHMuaW5vdGlmeV9hZGRfd2F0Y2goZmQsIHBhdGhuYW1lLCBtYXNrKQorICAgICAgICBleGNlcHQgSU9FcnJvciwgZXJyOgorICAgICAgICAgICAgc2VsZi5fbGFzdF9lcnJubyA9IGVyci5lcnJubworICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgIHJldHVybiB3ZAorCisgICAgZGVmIF9pbm90aWZ5X3JtX3dhdGNoKHNlbGYsIGZkLCB3ZCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldCA9IGlub3RpZnlfc3lzY2FsbHMuaW5vdGlmeV9ybV93YXRjaChmZCwgd2QpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCBlcnI6CisgICAgICAgICAgICBzZWxmLl9sYXN0X2Vycm5vID0gZXJyLmVycm5vCisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgcmV0dXJuIHJldAorCisKK2NsYXNzIF9DdHlwZXNMaWJjSU5vdGlmeVdyYXBwZXIoSU5vdGlmeVdyYXBwZXIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5fbGliYyA9IE5vbmUKKyAgICAgICAgc2VsZi5fZ2V0X2Vycm5vX2Z1bmMgPSBOb25lCisKKyAgICBkZWYgaW5pdChzZWxmKToKKyAgICAgICAgYXNzZXJ0IGN0eXBlcworCisgICAgICAgIHRyeV9saWJjX25hbWUgPSAnYycKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2ZyZWVic2QnKToKKyAgICAgICAgICAgIHRyeV9saWJjX25hbWUgPSAnaW5vdGlmeScKKworICAgICAgICBsaWJjX25hbWUgPSBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxpYmNfbmFtZSA9IGN0eXBlcy51dGlsLmZpbmRfbGlicmFyeSh0cnlfbGliY19uYW1lKQorICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IpOgorICAgICAgICAgICAgcGFzcyAgIyBXaWxsIGF0dGVtcCB0byBsb2FkIGl0IHdpdGggTm9uZSBhbnl3YXkuCisKKyAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA+PSAoMiwgNik6CisgICAgICAgICAgICBzZWxmLl9saWJjID0gY3R5cGVzLkNETEwobGliY19uYW1lLCB1c2VfZXJybm89VHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuX2dldF9lcnJub19mdW5jID0gY3R5cGVzLmdldF9lcnJubworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fbGliYyA9IGN0eXBlcy5DRExMKGxpYmNfbmFtZSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBsb2NhdGlvbiA9IHNlbGYuX2xpYmMuX19lcnJub19sb2NhdGlvbgorICAgICAgICAgICAgICAgIGxvY2F0aW9uLnJlc3R5cGUgPSBjdHlwZXMuUE9JTlRFUihjdHlwZXMuY19pbnQpCisgICAgICAgICAgICAgICAgc2VsZi5fZ2V0X2Vycm5vX2Z1bmMgPSBsYW1iZGE6IGxvY2F0aW9uKCkuY29udGVudHMudmFsdWUKKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgIyBFdmVudHVhbGx5IGNoZWNrIHRoYXQgbGliYyBoYXMgbmVlZGVkIGlub3RpZnkgYmluZGluZ3MuCisgICAgICAgIGlmIChub3QgaGFzYXR0cihzZWxmLl9saWJjLCAnaW5vdGlmeV9pbml0Jykgb3IKKyAgICAgICAgICAgIG5vdCBoYXNhdHRyKHNlbGYuX2xpYmMsICdpbm90aWZ5X2FkZF93YXRjaCcpIG9yCisgICAgICAgICAgICBub3QgaGFzYXR0cihzZWxmLl9saWJjLCAnaW5vdGlmeV9ybV93YXRjaCcpKToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIHNlbGYuX2xpYmMuaW5vdGlmeV9pbml0LmFyZ3R5cGVzID0gW10KKyAgICAgICAgc2VsZi5fbGliYy5pbm90aWZ5X2luaXQucmVzdHlwZSA9IGN0eXBlcy5jX2ludAorICAgICAgICBzZWxmLl9saWJjLmlub3RpZnlfYWRkX3dhdGNoLmFyZ3R5cGVzID0gW2N0eXBlcy5jX2ludCwgY3R5cGVzLmNfY2hhcl9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eXBlcy5jX3VpbnQzMl0KKyAgICAgICAgc2VsZi5fbGliYy5pbm90aWZ5X2FkZF93YXRjaC5yZXN0eXBlID0gY3R5cGVzLmNfaW50CisgICAgICAgIHNlbGYuX2xpYmMuaW5vdGlmeV9ybV93YXRjaC5hcmd0eXBlcyA9IFtjdHlwZXMuY19pbnQsIGN0eXBlcy5jX2ludF0KKyAgICAgICAgc2VsZi5fbGliYy5pbm90aWZ5X3JtX3dhdGNoLnJlc3R5cGUgPSBjdHlwZXMuY19pbnQKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBfZ2V0X2Vycm5vKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9nZXRfZXJybm9fZnVuYyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXRfZXJybm9fZnVuYygpCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgX2lub3RpZnlfaW5pdChzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuX2xpYmMgaXMgbm90IE5vbmUKKyAgICAgICAgcmV0dXJuIHNlbGYuX2xpYmMuaW5vdGlmeV9pbml0KCkKKworICAgIGRlZiBfaW5vdGlmeV9hZGRfd2F0Y2goc2VsZiwgZmQsIHBhdGhuYW1lLCBtYXNrKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuX2xpYmMgaXMgbm90IE5vbmUKKyAgICAgICAgcGF0aG5hbWUgPSBjdHlwZXMuY3JlYXRlX3N0cmluZ19idWZmZXIocGF0aG5hbWUpCisgICAgICAgIHJldHVybiBzZWxmLl9saWJjLmlub3RpZnlfYWRkX3dhdGNoKGZkLCBwYXRobmFtZSwgbWFzaykKKworICAgIGRlZiBfaW5vdGlmeV9ybV93YXRjaChzZWxmLCBmZCwgd2QpOgorICAgICAgICBhc3NlcnQgc2VsZi5fbGliYyBpcyBub3QgTm9uZQorICAgICAgICByZXR1cm4gc2VsZi5fbGliYy5pbm90aWZ5X3JtX3dhdGNoKGZkLCB3ZCkKKworICAgIGRlZiBfc3lzY3RsKHNlbGYsICphcmdzKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuX2xpYmMgaXMgbm90IE5vbmUKKyAgICAgICAgcmV0dXJuIHNlbGYuX2xpYmMuc3lzY3RsKCphcmdzKQorCisKKyMgTG9nZ2luZworZGVmIGxvZ2dlcl9pbml0KCk6CisgICAgIiIiSW5pdGlhbGl6ZSBsb2dnZXIgaW5zdGFuY2UuIiIiCisgICAgbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIoInB5aW5vdGlmeSIpCisgICAgY29uc29sZV9oYW5kbGVyID0gbG9nZ2luZy5TdHJlYW1IYW5kbGVyKCkKKyAgICBjb25zb2xlX2hhbmRsZXIuc2V0Rm9ybWF0dGVyKAorICAgICAgICBsb2dnaW5nLkZvcm1hdHRlcigiWyUoYXNjdGltZSlzICUobmFtZSlzICUobGV2ZWxuYW1lKXNdICUobWVzc2FnZSlzIikpCisgICAgbG9nLmFkZEhhbmRsZXIoY29uc29sZV9oYW5kbGVyKQorICAgIGxvZy5zZXRMZXZlbCgyMCkKKyAgICByZXR1cm4gbG9nCisKK2xvZyA9IGxvZ2dlcl9pbml0KCkKKworCisjIGlub3RpZnkncyB2YXJpYWJsZXMKK2NsYXNzIFN5c0N0bElOb3RpZnk6CisgICAgIiIiCisgICAgQWNjZXNzIChyZWFkLCB3cml0ZSkgaW5vdGlmeSdzIHZhcmlhYmxlcyB0aHJvdWdoIHN5c2N0bC4gVXN1YWxseSBpdAorICAgIHJlcXVpcmVzIGFkbWluaXN0cmF0b3IgcmlnaHRzIHRvIHVwZGF0ZSB0aGVtLgorCisgICAgRXhhbXBsZXM6CisgICAgICAtIFJlYWQgbWF4X3F1ZXVlZF9ldmVudHMgYXR0cmlidXRlOiBteXZhciA9IG1heF9xdWV1ZWRfZXZlbnRzLnZhbHVlCisgICAgICAtIFVwZGF0ZSBtYXhfcXVldWVkX2V2ZW50cyBhdHRyaWJ1dGU6IG1heF9xdWV1ZWRfZXZlbnRzLnZhbHVlID0gNDIKKyAgICAiIiIKKworICAgIGlub3RpZnlfYXR0cnMgPSB7J21heF91c2VyX2luc3RhbmNlcyc6IDEsCisgICAgICAgICAgICAgICAgICAgICAnbWF4X3VzZXJfd2F0Y2hlcyc6IDIsCisgICAgICAgICAgICAgICAgICAgICAnbWF4X3F1ZXVlZF9ldmVudHMnOiAzfQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGF0dHJuYW1lLCBpbm90aWZ5X3dyYXBwZXIpOgorICAgICAgICAjIEZJWE1FOiByaWdodCBub3cgb25seSBzdXBwb3J0aW5nIGN0eXBlcworICAgICAgICBhc3NlcnQgY3R5cGVzCisgICAgICAgIHNlbGYuX2F0dHJuYW1lID0gYXR0cm5hbWUKKyAgICAgICAgc2VsZi5faW5vdGlmeV93cmFwcGVyID0gaW5vdGlmeV93cmFwcGVyCisgICAgICAgIHNpbm8gPSBjdHlwZXMuY19pbnQgKiAzCisgICAgICAgIHNlbGYuX2F0dHIgPSBzaW5vKDUsIDIwLCBTeXNDdGxJTm90aWZ5Lmlub3RpZnlfYXR0cnNbYXR0cm5hbWVdKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBjcmVhdGUoYXR0cm5hbWUpOgorICAgICAgICAiIiIKKyAgICAgICAgRmFjdG9yeSBtZXRob2QgaW5zdGFuY2lhdGluZyBhbmQgcmV0dXJuaW5nIHRoZSByaWdodCB3cmFwcGVyLgorICAgICAgICAiIiIKKyAgICAgICAgIyBGSVhNRTogcmlnaHQgbm93IG9ubHkgc3VwcG9ydGluZyBjdHlwZXMKKyAgICAgICAgaWYgY3R5cGVzIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBpbm90aWZ5X3dyYXBwZXIgPSBfQ3R5cGVzTGliY0lOb3RpZnlXcmFwcGVyKCkKKyAgICAgICAgaWYgbm90IGlub3RpZnlfd3JhcHBlci5pbml0KCk6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICByZXR1cm4gU3lzQ3RsSU5vdGlmeShhdHRybmFtZSwgaW5vdGlmeV93cmFwcGVyKQorCisgICAgZGVmIGdldF92YWwoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBHZXRzIGF0dHJpYnV0ZSdzIHZhbHVlLiBSYWlzZXMgT1NFcnJvciBpZiB0aGUgb3BlcmF0aW9uIGZhaWxlZC4KKworICAgICAgICBAcmV0dXJuOiBzdG9yZWQgdmFsdWUuCisgICAgICAgIEBydHlwZTogaW50CisgICAgICAgICIiIgorICAgICAgICBvbGR2ID0gY3R5cGVzLmNfaW50KDApCisgICAgICAgIHNpemUgPSBjdHlwZXMuY19pbnQoY3R5cGVzLnNpemVvZihvbGR2KSkKKyAgICAgICAgc3lzY3RsID0gc2VsZi5faW5vdGlmeV93cmFwcGVyLl9zeXNjdGwKKyAgICAgICAgcmVzID0gc3lzY3RsKHNlbGYuX2F0dHIsIDMsCisgICAgICAgICAgICAgICAgICAgICBjdHlwZXMuY192b2lkcChjdHlwZXMuYWRkcmVzc29mKG9sZHYpKSwKKyAgICAgICAgICAgICAgICAgICAgIGN0eXBlcy5hZGRyZXNzb2Yoc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICBOb25lLCAwKQorICAgICAgICBpZiByZXMgPT0gLTE6CisgICAgICAgICAgICByYWlzZSBPU0Vycm9yKHNlbGYuX2lub3RpZnlfd3JhcHBlci5nZXRfZXJybm8oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5faW5vdGlmeV93cmFwcGVyLnN0cl9lcnJubygpKQorICAgICAgICByZXR1cm4gb2xkdi52YWx1ZQorCisgICAgZGVmIHNldF92YWwoc2VsZiwgbnZhbCk6CisgICAgICAgICIiIgorICAgICAgICBTZXRzIG5ldyBhdHRyaWJ1dGUncyB2YWx1ZS4gUmFpc2VzIE9TRXJyb3IgaWYgdGhlIG9wZXJhdGlvbiBmYWlsZWQuCisKKyAgICAgICAgQHBhcmFtIG52YWw6IHJlcGxhY2VzIGN1cnJlbnQgdmFsdWUgYnkgbnZhbC4KKyAgICAgICAgQHR5cGUgbnZhbDogaW50CisgICAgICAgICIiIgorICAgICAgICBvbGR2ID0gY3R5cGVzLmNfaW50KDApCisgICAgICAgIHNpemVvID0gY3R5cGVzLmNfaW50KGN0eXBlcy5zaXplb2Yob2xkdikpCisgICAgICAgIG5ld3YgPSBjdHlwZXMuY19pbnQobnZhbCkKKyAgICAgICAgc2l6ZW4gPSBjdHlwZXMuY19pbnQoY3R5cGVzLnNpemVvZihuZXd2KSkKKyAgICAgICAgc3lzY3RsID0gc2VsZi5faW5vdGlmeV93cmFwcGVyLl9zeXNjdGwKKyAgICAgICAgcmVzID0gc3lzY3RsKHNlbGYuX2F0dHIsIDMsCisgICAgICAgICAgICAgICAgICAgICBjdHlwZXMuY192b2lkcChjdHlwZXMuYWRkcmVzc29mKG9sZHYpKSwKKyAgICAgICAgICAgICAgICAgICAgIGN0eXBlcy5hZGRyZXNzb2Yoc2l6ZW8pLAorICAgICAgICAgICAgICAgICAgICAgY3R5cGVzLmNfdm9pZHAoY3R5cGVzLmFkZHJlc3NvZihuZXd2KSksCisgICAgICAgICAgICAgICAgICAgICBzaXplbikKKyAgICAgICAgaWYgcmVzID09IC0xOgorICAgICAgICAgICAgcmFpc2UgT1NFcnJvcihzZWxmLl9pbm90aWZ5X3dyYXBwZXIuZ2V0X2Vycm5vKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2lub3RpZnlfd3JhcHBlci5zdHJfZXJybm8oKSkKKworICAgIHZhbHVlID0gcHJvcGVydHkoZ2V0X3ZhbCwgc2V0X3ZhbCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICc8JXM9JWQ+JyAlIChzZWxmLl9hdHRybmFtZSwgc2VsZi5nZXRfdmFsKCkpCisKKworIyBJbm90aWZ5J3MgdmFyaWFibGVzCisjCisjIEZJWE1FOiBjdXJyZW50bHkgdGhlc2UgdmFyaWFibGVzIGFyZSBvbmx5IGFjY2Vzc2libGUgd2hlbiBjdHlwZXMgaXMgdXNlZCwKKyMgICAgICAgIG90aGVyd2lzZSB0aGVyZSBhcmUgc2V0IHRvIE5vbmUuCisjCisjIHJlYWQ6IG15dmFyID0gbWF4X3F1ZXVlZF9ldmVudHMudmFsdWUKKyMgdXBkYXRlOiBtYXhfcXVldWVkX2V2ZW50cy52YWx1ZSA9IDQyCisjCitmb3IgYXR0cm5hbWUgaW4gKCdtYXhfcXVldWVkX2V2ZW50cycsICdtYXhfdXNlcl9pbnN0YW5jZXMnLCAnbWF4X3VzZXJfd2F0Y2hlcycpOgorICAgIGdsb2JhbHMoKVthdHRybmFtZV0gPSBTeXNDdGxJTm90aWZ5LmNyZWF0ZShhdHRybmFtZSkKKworCitjbGFzcyBFdmVudHNDb2RlczoKKyAgICAiIiIKKyAgICBTZXQgb2YgY29kZXMgY29ycmVzcG9uZGluZyB0byBlYWNoIGtpbmQgb2YgZXZlbnRzLgorICAgIFNvbWUgb2YgdGhlc2UgZmxhZ3MgYXJlIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCBpbm90aWZ5LCB3aGVyZWFzCisgICAgdGhlIG90aGVycyBhcmUgc2VudCB0byB1c2Vyc3BhY2UgYnkgaW5vdGlmeSBub3RpZnlpbmcgc29tZSBldmVudHMuCisKKyAgICBAY3ZhciBJTl9BQ0NFU1M6IEZpbGUgd2FzIGFjY2Vzc2VkLgorICAgIEB0eXBlIElOX0FDQ0VTUzogaW50CisgICAgQGN2YXIgSU5fTU9ESUZZOiBGaWxlIHdhcyBtb2RpZmllZC4KKyAgICBAdHlwZSBJTl9NT0RJRlk6IGludAorICAgIEBjdmFyIElOX0FUVFJJQjogTWV0YWRhdGEgY2hhbmdlZC4KKyAgICBAdHlwZSBJTl9BVFRSSUI6IGludAorICAgIEBjdmFyIElOX0NMT1NFX1dSSVRFOiBXcml0dGFibGUgZmlsZSB3YXMgY2xvc2VkLgorICAgIEB0eXBlIElOX0NMT1NFX1dSSVRFOiBpbnQKKyAgICBAY3ZhciBJTl9DTE9TRV9OT1dSSVRFOiBVbndyaXR0YWJsZSBmaWxlIGNsb3NlZC4KKyAgICBAdHlwZSBJTl9DTE9TRV9OT1dSSVRFOiBpbnQKKyAgICBAY3ZhciBJTl9PUEVOOiBGaWxlIHdhcyBvcGVuZWQuCisgICAgQHR5cGUgSU5fT1BFTjogaW50CisgICAgQGN2YXIgSU5fTU9WRURfRlJPTTogRmlsZSB3YXMgbW92ZWQgZnJvbSBYLgorICAgIEB0eXBlIElOX01PVkVEX0ZST006IGludAorICAgIEBjdmFyIElOX01PVkVEX1RPOiBGaWxlIHdhcyBtb3ZlZCB0byBZLgorICAgIEB0eXBlIElOX01PVkVEX1RPOiBpbnQKKyAgICBAY3ZhciBJTl9DUkVBVEU6IFN1YmZpbGUgd2FzIGNyZWF0ZWQuCisgICAgQHR5cGUgSU5fQ1JFQVRFOiBpbnQKKyAgICBAY3ZhciBJTl9ERUxFVEU6IFN1YmZpbGUgd2FzIGRlbGV0ZWQuCisgICAgQHR5cGUgSU5fREVMRVRFOiBpbnQKKyAgICBAY3ZhciBJTl9ERUxFVEVfU0VMRjogU2VsZiAod2F0Y2hlZCBpdGVtIGl0c2VsZikgd2FzIGRlbGV0ZWQuCisgICAgQHR5cGUgSU5fREVMRVRFX1NFTEY6IGludAorICAgIEBjdmFyIElOX01PVkVfU0VMRjogU2VsZiAod2F0Y2hlZCBpdGVtIGl0c2VsZikgd2FzIG1vdmVkLgorICAgIEB0eXBlIElOX01PVkVfU0VMRjogaW50CisgICAgQGN2YXIgSU5fVU5NT1VOVDogQmFja2luZyBmcyB3YXMgdW5tb3VudGVkLgorICAgIEB0eXBlIElOX1VOTU9VTlQ6IGludAorICAgIEBjdmFyIElOX1FfT1ZFUkZMT1c6IEV2ZW50IHF1ZXVlZCBvdmVyZmxvd2VkLgorICAgIEB0eXBlIElOX1FfT1ZFUkZMT1c6IGludAorICAgIEBjdmFyIElOX0lHTk9SRUQ6IEZpbGUgd2FzIGlnbm9yZWQuCisgICAgQHR5cGUgSU5fSUdOT1JFRDogaW50CisgICAgQGN2YXIgSU5fT05MWURJUjogb25seSB3YXRjaCB0aGUgcGF0aCBpZiBpdCBpcyBhIGRpcmVjdG9yeSAobmV3CisgICAgICAgICAgICAgICAgICAgICAgaW4ga2VybmVsIDIuNi4xNSkuCisgICAgQHR5cGUgSU5fT05MWURJUjogaW50CisgICAgQGN2YXIgSU5fRE9OVF9GT0xMT1c6IGRvbid0IGZvbGxvdyBhIHN5bWxpbmsgKG5ldyBpbiBrZXJuZWwgMi42LjE1KS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5fT05MWURJUiB3ZSBjYW4gbWFrZSBzdXJlIHRoYXQgd2UgZG9uJ3Qgd2F0Y2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRhcmdldCBvZiBzeW1saW5rcy4KKyAgICBAdHlwZSBJTl9ET05UX0ZPTExPVzogaW50CisgICAgQGN2YXIgSU5fRVhDTF9VTkxJTks6IEV2ZW50cyBhcmUgbm90IGdlbmVyYXRlZCBmb3IgY2hpbGRyZW4gYWZ0ZXIgdGhleQorICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlIGJlZW4gdW5saW5rZWQgZnJvbSB0aGUgd2F0Y2hlZCBkaXJlY3RvcnkuCisgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXcgaW4ga2VybmVsIDIuNi4zNikuCisgICAgQHR5cGUgSU5fRVhDTF9VTkxJTks6IGludAorICAgIEBjdmFyIElOX01BU0tfQUREOiBhZGQgdG8gdGhlIG1hc2sgb2YgYW4gYWxyZWFkeSBleGlzdGluZyB3YXRjaCAobmV3CisgICAgICAgICAgICAgICAgICAgICAgIGluIGtlcm5lbCAyLjYuMTQpLgorICAgIEB0eXBlIElOX01BU0tfQUREOiBpbnQKKyAgICBAY3ZhciBJTl9JU0RJUjogRXZlbnQgb2NjdXJyZWQgYWdhaW5zdCBkaXIuCisgICAgQHR5cGUgSU5fSVNESVI6IGludAorICAgIEBjdmFyIElOX09ORVNIT1Q6IE9ubHkgc2VuZCBldmVudCBvbmNlLgorICAgIEB0eXBlIElOX09ORVNIT1Q6IGludAorICAgIEBjdmFyIEFMTF9FVkVOVFM6IEFsaWFzIGZvciBjb25zaWRlcmluZyBhbGwgb2YgdGhlIGV2ZW50cy4KKyAgICBAdHlwZSBBTExfRVZFTlRTOiBpbnQKKyAgICAiIiIKKworICAgICMgVGhlIGlkZWEgaGVyZSBpcyAnY29uZmlndXJhdGlvbi1hcy1jb2RlJyAtIHRoaXMgd2F5LCB3ZSBnZXQgb3VyIG5pY2UgY2xhc3MKKyAgICAjIGNvbnN0YW50cywgYnV0IHdlIGFsc28gZ2V0IG5pY2UgaHVtYW4tZnJpZW5kbHkgdGV4dCBtYXBwaW5ncyB0byBkbyBsb29rdXBzCisgICAgIyBhZ2FpbnN0IGFzIHdlbGwsIGZvciBmcmVlOgorICAgIEZMQUdfQ09MTEVDVElPTlMgPSB7J09QX0ZMQUdTJzogeworICAgICAgICAnSU5fQUNDRVNTJyAgICAgICAgOiAweDAwMDAwMDAxLCAgIyBGaWxlIHdhcyBhY2Nlc3NlZAorICAgICAgICAnSU5fTU9ESUZZJyAgICAgICAgOiAweDAwMDAwMDAyLCAgIyBGaWxlIHdhcyBtb2RpZmllZAorICAgICAgICAnSU5fQVRUUklCJyAgICAgICAgOiAweDAwMDAwMDA0LCAgIyBNZXRhZGF0YSBjaGFuZ2VkCisgICAgICAgICdJTl9DTE9TRV9XUklURScgICA6IDB4MDAwMDAwMDgsICAjIFdyaXRhYmxlIGZpbGUgd2FzIGNsb3NlZAorICAgICAgICAnSU5fQ0xPU0VfTk9XUklURScgOiAweDAwMDAwMDEwLCAgIyBVbndyaXRhYmxlIGZpbGUgY2xvc2VkCisgICAgICAgICdJTl9PUEVOJyAgICAgICAgICA6IDB4MDAwMDAwMjAsICAjIEZpbGUgd2FzIG9wZW5lZAorICAgICAgICAnSU5fTU9WRURfRlJPTScgICAgOiAweDAwMDAwMDQwLCAgIyBGaWxlIHdhcyBtb3ZlZCBmcm9tIFgKKyAgICAgICAgJ0lOX01PVkVEX1RPJyAgICAgIDogMHgwMDAwMDA4MCwgICMgRmlsZSB3YXMgbW92ZWQgdG8gWQorICAgICAgICAnSU5fQ1JFQVRFJyAgICAgICAgOiAweDAwMDAwMTAwLCAgIyBTdWJmaWxlIHdhcyBjcmVhdGVkCisgICAgICAgICdJTl9ERUxFVEUnICAgICAgICA6IDB4MDAwMDAyMDAsICAjIFN1YmZpbGUgd2FzIGRlbGV0ZWQKKyAgICAgICAgJ0lOX0RFTEVURV9TRUxGJyAgIDogMHgwMDAwMDQwMCwgICMgU2VsZiAod2F0Y2hlZCBpdGVtIGl0c2VsZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd2FzIGRlbGV0ZWQKKyAgICAgICAgJ0lOX01PVkVfU0VMRicgICAgIDogMHgwMDAwMDgwMCwgICMgU2VsZiAod2F0Y2hlZCBpdGVtIGl0c2VsZikgd2FzIG1vdmVkCisgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAnRVZFTlRfRkxBR1MnOiB7CisgICAgICAgICdJTl9VTk1PVU5UJyAgICAgICA6IDB4MDAwMDIwMDAsICAjIEJhY2tpbmcgZnMgd2FzIHVubW91bnRlZAorICAgICAgICAnSU5fUV9PVkVSRkxPVycgICAgOiAweDAwMDA0MDAwLCAgIyBFdmVudCBxdWV1ZWQgb3ZlcmZsb3dlZAorICAgICAgICAnSU5fSUdOT1JFRCcgICAgICAgOiAweDAwMDA4MDAwLCAgIyBGaWxlIHdhcyBpZ25vcmVkCisgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAnU1BFQ0lBTF9GTEFHUyc6IHsKKyAgICAgICAgJ0lOX09OTFlESVInICAgICAgIDogMHgwMTAwMDAwMCwgICMgb25seSB3YXRjaCB0aGUgcGF0aCBpZiBpdCBpcyBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRpcmVjdG9yeQorICAgICAgICAnSU5fRE9OVF9GT0xMT1cnICAgOiAweDAyMDAwMDAwLCAgIyBkb24ndCBmb2xsb3cgYSBzeW1saW5rCisgICAgICAgICdJTl9FWENMX1VOTElOSycgICA6IDB4MDQwMDAwMDAsICAjIGV4Y2x1ZGUgZXZlbnRzIG9uIHVubGlua2VkIG9iamVjdHMKKyAgICAgICAgJ0lOX01BU0tfQUREJyAgICAgIDogMHgyMDAwMDAwMCwgICMgYWRkIHRvIHRoZSBtYXNrIG9mIGFuIGFscmVhZHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZXhpc3Rpbmcgd2F0Y2gKKyAgICAgICAgJ0lOX0lTRElSJyAgICAgICAgIDogMHg0MDAwMDAwMCwgICMgZXZlbnQgb2NjdXJyZWQgYWdhaW5zdCBkaXIKKyAgICAgICAgJ0lOX09ORVNIT1QnICAgICAgIDogMHg4MDAwMDAwMCwgICMgb25seSBzZW5kIGV2ZW50IG9uY2UKKyAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgIGRlZiBtYXNrbmFtZShtYXNrKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybnMgdGhlIGV2ZW50IG5hbWUgYXNzb2NpYXRlZCB0byBtYXNrLiBJTl9JU0RJUiBpcyBhcHBlbmRlZCB0bworICAgICAgICB0aGUgcmVzdWx0IHdoZW4gYXBwcm9wcmlhdGUuIE5vdGU6IG9ubHkgb25lIGV2ZW50IGlzIHJldHVybmVkLCBiZWNhdXNlCisgICAgICAgIG9ubHkgb25lIGV2ZW50IGNhbiBiZSByYWlzZWQgYXQgYSBnaXZlbiB0aW1lLgorCisgICAgICAgIEBwYXJhbSBtYXNrOiBtYXNrLgorICAgICAgICBAdHlwZSBtYXNrOiBpbnQKKyAgICAgICAgQHJldHVybjogZXZlbnQgbmFtZS4KKyAgICAgICAgQHJ0eXBlOiBzdHIKKyAgICAgICAgIiIiCisgICAgICAgIG1zID0gbWFzaworICAgICAgICBuYW1lID0gJyVzJworICAgICAgICBpZiBtYXNrICYgSU5fSVNESVI6CisgICAgICAgICAgICBtcyA9IG1hc2sgLSBJTl9JU0RJUgorICAgICAgICAgICAgbmFtZSA9ICclc3xJTl9JU0RJUicKKyAgICAgICAgcmV0dXJuIG5hbWUgJSBFdmVudHNDb2Rlcy5BTExfVkFMVUVTW21zXQorCisgICAgbWFza25hbWUgPSBzdGF0aWNtZXRob2QobWFza25hbWUpCisKKworIyBTbyBsZXQncyBub3cgdHVybiB0aGUgY29uZmlndXJhdGlvbiBpbnRvIGNvZGUKK0V2ZW50c0NvZGVzLkFMTF9GTEFHUyA9IHt9CitFdmVudHNDb2Rlcy5BTExfVkFMVUVTID0ge30KK2ZvciBmbGFnYywgdmFsYyBpbiBFdmVudHNDb2Rlcy5GTEFHX0NPTExFQ1RJT05TLml0ZW1zKCk6CisgICAgIyBNYWtlIHRoZSBjb2xsZWN0aW9ucycgbWVtYmVycyBkaXJlY3RseSBhY2Nlc3NpYmxlIHRocm91Z2ggdGhlCisgICAgIyBjbGFzcyBkaWN0aW9uYXJ5CisgICAgc2V0YXR0cihFdmVudHNDb2RlcywgZmxhZ2MsIHZhbGMpCisKKyAgICAjIENvbGxlY3QgYWxsIHRoZSBmbGFncyB1bmRlciBhIGNvbW1vbiB1bWJyZWxsYQorICAgIEV2ZW50c0NvZGVzLkFMTF9GTEFHUy51cGRhdGUodmFsYykKKworICAgICMgTWFrZSB0aGUgaW5kaXZpZHVhbCBtYXNrcyBhY2Nlc3NpYmxlIGFzICdjb25zdGFudHMnIGF0IGdsb2JhbHMoKSBzY29wZQorICAgICMgYW5kIG1hc2tuYW1lcyBhY2Nlc3NpYmxlIGJ5IHZhbHVlcy4KKyAgICBmb3IgbmFtZSwgdmFsIGluIHZhbGMuaXRlbXMoKToKKyAgICAgICAgZ2xvYmFscygpW25hbWVdID0gdmFsCisgICAgICAgIEV2ZW50c0NvZGVzLkFMTF9WQUxVRVNbdmFsXSA9IG5hbWUKKworCisjIGFsbCAnbm9ybWFsJyBldmVudHMKK0FMTF9FVkVOVFMgPSByZWR1Y2UobGFtYmRhIHgsIHk6IHggfCB5LCBFdmVudHNDb2Rlcy5PUF9GTEFHUy52YWx1ZXMoKSkKK0V2ZW50c0NvZGVzLkFMTF9GTEFHU1snQUxMX0VWRU5UUyddID0gQUxMX0VWRU5UUworRXZlbnRzQ29kZXMuQUxMX1ZBTFVFU1tBTExfRVZFTlRTXSA9ICdBTExfRVZFTlRTJworCisKK2NsYXNzIF9FdmVudDoKKyAgICAiIiIKKyAgICBFdmVudCBzdHJ1Y3R1cmUsIHJlcHJlc2VudCBldmVudHMgcmFpc2VkIGJ5IHRoZSBzeXN0ZW0uIFRoaXMKKyAgICBpcyB0aGUgYmFzZSBjbGFzcyBhbmQgc2hvdWxkIGJlIHN1YmNsYXNzZWQuCisKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGljdF8pOgorICAgICAgICAiIiIKKyAgICAgICAgQXR0YWNoIGF0dHJpYnV0ZXMgKGNvbnRhaW5lZCBpbiBkaWN0XykgdG8gc2VsZi4KKworICAgICAgICBAcGFyYW0gZGljdF86IFNldCBvZiBhdHRyaWJ1dGVzLgorICAgICAgICBAdHlwZSBkaWN0XzogZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgZm9yIHRwbCBpbiBkaWN0Xy5pdGVtcygpOgorICAgICAgICAgICAgc2V0YXR0cihzZWxmLCAqdHBsKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgQHJldHVybjogR2VuZXJpYyBldmVudCBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisgICAgICAgIEBydHlwZTogc3RyCisgICAgICAgICIiIgorICAgICAgICBzID0gJycKKyAgICAgICAgZm9yIGF0dHIsIHZhbHVlIGluIHNvcnRlZChzZWxmLl9fZGljdF9fLml0ZW1zKCksIGtleT1sYW1iZGEgeDogeFswXSk6CisgICAgICAgICAgICBpZiBhdHRyLnN0YXJ0c3dpdGgoJ18nKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgYXR0ciA9PSAnbWFzayc6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBoZXgoZ2V0YXR0cihzZWxmLCBhdHRyKSkKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgYmFzZXN0cmluZykgYW5kIG5vdCB2YWx1ZToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICInJyIKKyAgICAgICAgICAgIHMgKz0gJyAlcyVzJXMnICUgKG91dHB1dF9mb3JtYXQuZmllbGRfbmFtZShhdHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9mb3JtYXQucHVuY3R1YXRpb24oJz0nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9mb3JtYXQuZmllbGRfdmFsdWUodmFsdWUpKQorCisgICAgICAgIHMgPSAnJXMlcyVzICVzJyAlIChvdXRwdXRfZm9ybWF0LnB1bmN0dWF0aW9uKCc8JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZm9ybWF0LmNsYXNzX25hbWUoc2VsZi5fX2NsYXNzX18uX19uYW1lX18pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9mb3JtYXQucHVuY3R1YXRpb24oJz4nKSkKKyAgICAgICAgcmV0dXJuIHMKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gcmVwcihzZWxmKQorCisKK2NsYXNzIF9SYXdFdmVudChfRXZlbnQpOgorICAgICIiIgorICAgIFJhdyBldmVudCwgaXQgY29udGFpbnMgb25seSB0aGUgaW5mb3JtYXRpb25zIHByb3ZpZGVkIGJ5IHRoZSBzeXN0ZW0uCisgICAgSXQgZG9lc24ndCBpbmZlciBhbnl0aGluZy4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgd2QsIG1hc2ssIGNvb2tpZSwgbmFtZSk6CisgICAgICAgICIiIgorICAgICAgICBAcGFyYW0gd2Q6IFdhdGNoIERlc2NyaXB0b3IuCisgICAgICAgIEB0eXBlIHdkOiBpbnQKKyAgICAgICAgQHBhcmFtIG1hc2s6IEJpdG1hc2sgb2YgZXZlbnRzLgorICAgICAgICBAdHlwZSBtYXNrOiBpbnQKKyAgICAgICAgQHBhcmFtIGNvb2tpZTogQ29va2llLgorICAgICAgICBAdHlwZSBjb29raWU6IGludAorICAgICAgICBAcGFyYW0gbmFtZTogQmFzZW5hbWUgb2YgdGhlIGZpbGUgb3IgZGlyZWN0b3J5IGFnYWluc3Qgd2hpY2ggdGhlCisgICAgICAgICAgICAgICAgICAgICBldmVudCB3YXMgcmFpc2VkIGluIGNhc2Ugd2hlcmUgdGhlIHdhdGNoZWQgZGlyZWN0b3J5CisgICAgICAgICAgICAgICAgICAgICBpcyB0aGUgcGFyZW50IGRpcmVjdG9yeS4gTm9uZSBpZiB0aGUgZXZlbnQgd2FzIHJhaXNlZAorICAgICAgICAgICAgICAgICAgICAgb24gdGhlIHdhdGNoZWQgaXRlbSBpdHNlbGYuCisgICAgICAgIEB0eXBlIG5hbWU6IHN0cmluZyBvciBOb25lCisgICAgICAgICIiIgorICAgICAgICAjIFVzZSB0aGlzIHZhcmlhYmxlIHRvIGNhY2hlIHRoZSByZXN1bHQgb2Ygc3RyKHNlbGYpLCB0aGlzIG9iamVjdAorICAgICAgICAjIGlzIGltbXV0YWJsZS4KKyAgICAgICAgc2VsZi5fc3RyID0gTm9uZQorICAgICAgICAjIG5hbWU6IHJlbW92ZSB0cmFpbGluZyAnXDAnCisgICAgICAgIGQgPSB7J3dkJzogd2QsCisgICAgICAgICAgICAgJ21hc2snOiBtYXNrLAorICAgICAgICAgICAgICdjb29raWUnOiBjb29raWUsCisgICAgICAgICAgICAgJ25hbWUnOiBuYW1lLnJzdHJpcCgnXDAnKX0KKyAgICAgICAgX0V2ZW50Ll9faW5pdF9fKHNlbGYsIGQpCisgICAgICAgIGxvZy5kZWJ1ZyhzdHIoc2VsZikpCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fc3RyIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl9zdHIgPSBfRXZlbnQuX19zdHJfXyhzZWxmKQorICAgICAgICByZXR1cm4gc2VsZi5fc3RyCisKKworY2xhc3MgRXZlbnQoX0V2ZW50KToKKyAgICAiIiIKKyAgICBUaGlzIGNsYXNzIGNvbnRhaW5zIGFsbCB0aGUgdXNlZnVsIGluZm9ybWF0aW9ucyBhYm91dCB0aGUgb2JzZXJ2ZWQKKyAgICBldmVudC4gSG93ZXZlciwgdGhlIHByZXNlbmNlIG9mIGVhY2ggZmllbGQgaXMgbm90IGd1YXJhbnRlZWQgYW5kCisgICAgZGVwZW5kcyBvbiB0aGUgdHlwZSBvZiBldmVudC4gSW4gZWZmZWN0LCBzb21lIGZpZWxkcyBhcmUgaXJyZWxldmFudAorICAgIGZvciBzb21lIGtpbmQgb2YgZXZlbnQgKGZvciBleGFtcGxlICdjb29raWUnIGlzIG1lYW5pbmdsZXNzIGZvcgorICAgIElOX0NSRUFURSB3aGVyZWFzIGl0IGlzIG1hbmRhdG9yeSBmb3IgSU5fTU9WRV9UTykuCisKKyAgICBUaGUgcG9zc2libGUgZmllbGRzIGFyZToKKyAgICAgIC0gd2QgKGludCk6IFdhdGNoIERlc2NyaXB0b3IuCisgICAgICAtIG1hc2sgKGludCk6IE1hc2suCisgICAgICAtIG1hc2tuYW1lIChzdHIpOiBSZWFkYWJsZSBldmVudCBuYW1lLgorICAgICAgLSBwYXRoIChzdHIpOiBwYXRoIG9mIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSBiZWluZyB3YXRjaGVkLgorICAgICAgLSBuYW1lIChzdHIpOiBCYXNlbmFtZSBvZiB0aGUgZmlsZSBvciBkaXJlY3RvcnkgYWdhaW5zdCB3aGljaCB0aGUKKyAgICAgICAgICAgICAgZXZlbnQgd2FzIHJhaXNlZCBpbiBjYXNlIHdoZXJlIHRoZSB3YXRjaGVkIGRpcmVjdG9yeQorICAgICAgICAgICAgICBpcyB0aGUgcGFyZW50IGRpcmVjdG9yeS4gTm9uZSBpZiB0aGUgZXZlbnQgd2FzIHJhaXNlZAorICAgICAgICAgICAgICBvbiB0aGUgd2F0Y2hlZCBpdGVtIGl0c2VsZi4gVGhpcyBmaWVsZCBpcyBhbHdheXMgcHJvdmlkZWQKKyAgICAgICAgICAgICAgZXZlbiBpZiB0aGUgc3RyaW5nIGlzICcnLgorICAgICAgLSBwYXRobmFtZSAoc3RyKTogQ29uY2F0ZW5hdGlvbiBvZiAncGF0aCcgYW5kICduYW1lJy4KKyAgICAgIC0gc3JjX3BhdGhuYW1lIChzdHIpOiBPbmx5IHByZXNlbnQgZm9yIElOX01PVkVEX1RPIGV2ZW50cyBhbmQgb25seSBpbgorICAgICAgICAgICAgICB0aGUgY2FzZSB3aGVyZSBJTl9NT1ZFRF9GUk9NIGV2ZW50cyBhcmUgd2F0Y2hlZCB0b28uIEhvbGRzIHRoZQorICAgICAgICAgICAgICBzb3VyY2UgcGF0aG5hbWUgZnJvbSB3aGVyZSBwYXRobmFtZSB3YXMgbW92ZWQgZnJvbS4KKyAgICAgIC0gY29va2llIChpbnQpOiBDb29raWUuCisgICAgICAtIGRpciAoYm9vbCk6IFRydWUgaWYgdGhlIGV2ZW50IHdhcyByYWlzZWQgYWdhaW5zdCBhIGRpcmVjdG9yeS4KKworICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCByYXcpOgorICAgICAgICAiIiIKKyAgICAgICAgQ29uY3JldGVseSwgdGhpcyBpcyB0aGUgcmF3IGV2ZW50IHBsdXMgaW5mZXJyZWQgaW5mb3MuCisgICAgICAgICIiIgorICAgICAgICBfRXZlbnQuX19pbml0X18oc2VsZiwgcmF3KQorICAgICAgICBzZWxmLm1hc2tuYW1lID0gRXZlbnRzQ29kZXMubWFza25hbWUoc2VsZi5tYXNrKQorICAgICAgICBpZiBDT01QQVRJQklMSVRZX01PREU6CisgICAgICAgICAgICBzZWxmLmV2ZW50X25hbWUgPSBzZWxmLm1hc2tuYW1lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYubmFtZToKKyAgICAgICAgICAgICAgICBzZWxmLnBhdGhuYW1lID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguam9pbihzZWxmLnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5uYW1lKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5wYXRobmFtZSA9IG9zLnBhdGguYWJzcGF0aChzZWxmLnBhdGgpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvciwgZXJyOgorICAgICAgICAgICAgIyBVc3VhbGx5IGl0IGlzIG5vdCBhbiBlcnJvciBzb21lIGV2ZW50cyBhcmUgcGVyZmVjdGx5IHZhbGlkcworICAgICAgICAgICAgIyBkZXNwaXRlIHRoZSBsYWNrIG9mIHRoZXNlIGF0dHJpYnV0ZXMuCisgICAgICAgICAgICBsb2cuZGVidWcoZXJyKQorCisKK2NsYXNzIFByb2Nlc3NFdmVudEVycm9yKFB5aW5vdGlmeUVycm9yKToKKyAgICAiIiIKKyAgICBQcm9jZXNzRXZlbnRFcnJvciBFeGNlcHRpb24uIFJhaXNlZCBvbiBQcm9jZXNzRXZlbnQgZXJyb3IuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVycik6CisgICAgICAgICIiIgorICAgICAgICBAcGFyYW0gZXJyOiBFeGNlcHRpb24gZXJyb3IgZGVzY3JpcHRpb24uCisgICAgICAgIEB0eXBlIGVycjogc3RyaW5nCisgICAgICAgICIiIgorICAgICAgICBQeWlub3RpZnlFcnJvci5fX2luaXRfXyhzZWxmLCBlcnIpCisKKworY2xhc3MgX1Byb2Nlc3NFdmVudDoKKyAgICAiIiIKKyAgICBBYnN0cmFjdCBwcm9jZXNzaW5nIGV2ZW50IGNsYXNzLgorICAgICIiIgorICAgIGRlZiBfX2NhbGxfXyhzZWxmLCBldmVudCk6CisgICAgICAgICIiIgorICAgICAgICBUbyBiZWhhdmUgbGlrZSBhIGZ1bmN0b3IgdGhlIG9iamVjdCBtdXN0IGJlIGNhbGxhYmxlLgorICAgICAgICBUaGlzIG1ldGhvZCBpcyBhIGRpc3BhdGNoIG1ldGhvZC4gSXRzIGxvb2t1cCBvcmRlciBpczoKKyAgICAgICAgICAxLiBwcm9jZXNzX01BU0tOQU1FIG1ldGhvZAorICAgICAgICAgIDIuIHByb2Nlc3NfRkFNSUxZX05BTUUgbWV0aG9kCisgICAgICAgICAgMy4gb3RoZXJ3aXNlIGNhbGxzIHByb2Nlc3NfZGVmYXVsdAorCisgICAgICAgIEBwYXJhbSBldmVudDogRXZlbnQgdG8gYmUgcHJvY2Vzc2VkLgorICAgICAgICBAdHlwZSBldmVudDogRXZlbnQgb2JqZWN0CisgICAgICAgIEByZXR1cm46IEJ5IGNvbnZlbnRpb24gd2hlbiB1c2VkIGZyb20gdGhlIFByb2Nlc3NFdmVudCBjbGFzczoKKyAgICAgICAgICAgICAgICAgLSBSZXR1cm5pbmcgRmFsc2Ugb3IgTm9uZSAoZGVmYXVsdCB2YWx1ZSkgbWVhbnMga2VlcCBvbgorICAgICAgICAgICAgICAgICBleGVjdXRpbmcgbmV4dCBjaGFpbmVkIGZ1bmN0b3JzIChzZWUgY2hhaW4ucHkgZXhhbXBsZSkuCisgICAgICAgICAgICAgICAgIC0gUmV0dXJuaW5nIFRydWUgaW5zdGVhZCBtZWFucyBkbyBub3QgZXhlY3V0ZSBuZXh0CisgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyBmdW5jdGlvbnMuCisgICAgICAgIEBydHlwZTogYm9vbAorICAgICAgICBAcmFpc2UgUHJvY2Vzc0V2ZW50RXJyb3I6IEV2ZW50IG9iamVjdCB1bmRpc3BhdGNoYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duIGV2ZW50LgorICAgICAgICAiIiIKKyAgICAgICAgc3RyaXBwZWRfbWFzayA9IGV2ZW50Lm1hc2sgLSAoZXZlbnQubWFzayAmIElOX0lTRElSKQorICAgICAgICBtYXNrbmFtZSA9IEV2ZW50c0NvZGVzLkFMTF9WQUxVRVMuZ2V0KHN0cmlwcGVkX21hc2spCisgICAgICAgIGlmIG1hc2tuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBQcm9jZXNzRXZlbnRFcnJvcigiVW5rbm93biBtYXNrIDB4JTA4eCIgJSBzdHJpcHBlZF9tYXNrKQorCisgICAgICAgICMgMS0gbG9vayBmb3IgcHJvY2Vzc19NQVNLTkFNRQorICAgICAgICBtZXRoID0gZ2V0YXR0cihzZWxmLCAncHJvY2Vzc18nICsgbWFza25hbWUsIE5vbmUpCisgICAgICAgIGlmIG1ldGggaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gbWV0aChldmVudCkKKyAgICAgICAgIyAyLSBsb29rIGZvciBwcm9jZXNzX0ZBTUlMWV9OQU1FCisgICAgICAgIG1ldGggPSBnZXRhdHRyKHNlbGYsICdwcm9jZXNzX0lOXycgKyBtYXNrbmFtZS5zcGxpdCgnXycpWzFdLCBOb25lKQorICAgICAgICBpZiBtZXRoIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIG1ldGgoZXZlbnQpCisgICAgICAgICMgMy0gZGVmYXVsdCBjYWxsIG1ldGhvZCBwcm9jZXNzX2RlZmF1bHQKKyAgICAgICAgcmV0dXJuIHNlbGYucHJvY2Vzc19kZWZhdWx0KGV2ZW50KQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gJzwlcz4nICUgc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKworCitjbGFzcyBfU3lzUHJvY2Vzc0V2ZW50KF9Qcm9jZXNzRXZlbnQpOgorICAgICIiIgorICAgIFRoZXJlIGlzIHRocmVlIGtpbmQgb2YgcHJvY2Vzc2luZyBhY2NvcmRpbmcgdG8gZWFjaCBldmVudDoKKworICAgICAgMS4gc3BlY2lhbCBoYW5kbGluZyAoZGVsZXRpb24gZnJvbSBpbnRlcm5hbCBjb250YWluZXIsIGJ1ZywgLi4uKS4KKyAgICAgIDIuIGRlZmF1bHQgdHJlYXRtZW50OiB3aGljaCBpcyBhcHBsaWVkIHRvIHRoZSBtYWpvcml0eSBvZiBldmVudHMuCisgICAgICAzLiBJTl9JU0RJUiBpcyBuZXZlciBzZW50IGFsb25lLCBoZSBpcyBwaWdneWJhY2tlZCB3aXRoIGEgc3RhbmRhcmQKKyAgICAgICAgIGV2ZW50LCBoZSBpcyBub3QgcHJvY2Vzc2VkIGFzIHRoZSBvdGhlcnMgZXZlbnRzLCBpbnN0ZWFkLCBpdHMKKyAgICAgICAgIHZhbHVlIGlzIGNhcHR1cmVkIGFuZCBhcHByb3ByaWF0ZWx5IGFnZ3JlZ2F0ZWQgdG8gZHN0IGV2ZW50LgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3bSwgbm90aWZpZXIpOgorICAgICAgICAiIiIKKworICAgICAgICBAcGFyYW0gd206IFdhdGNoIE1hbmFnZXIuCisgICAgICAgIEB0eXBlIHdtOiBXYXRjaE1hbmFnZXIgaW5zdGFuY2UKKyAgICAgICAgQHBhcmFtIG5vdGlmaWVyOiBOb3RpZmllci4KKyAgICAgICAgQHR5cGUgbm90aWZpZXI6IE5vdGlmaWVyIGluc3RhbmNlCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl93YXRjaF9tYW5hZ2VyID0gd20gICMgd2F0Y2ggbWFuYWdlcgorICAgICAgICBzZWxmLl9ub3RpZmllciA9IG5vdGlmaWVyICAjIG5vdGlmaWVyCisgICAgICAgIHNlbGYuX212X2Nvb2tpZSA9IHt9ICAjIHtjb29raWUoaW50KTogKHNyY19wYXRoKHN0ciksIGRhdGUpLCAuLi59CisgICAgICAgIHNlbGYuX212ID0ge30gICMge3NyY19wYXRoKHN0cik6IChkc3RfcGF0aChzdHIpLCBkYXRlKSwgLi4ufQorCisgICAgZGVmIGNsZWFudXAoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBDbGVhbnVwIChkZWxldGUpIG9sZCAoPjFtbikgcmVjb3JkcyBjb250YWluZWQgaW4gc2VsZi5fbXZfY29va2llCisgICAgICAgIGFuZCBzZWxmLl9tdi4KKyAgICAgICAgIiIiCisgICAgICAgIGRhdGVfY3VyXyA9IGRhdGV0aW1lLm5vdygpCisgICAgICAgIGZvciBzZXEgaW4gW3NlbGYuX212X2Nvb2tpZSwgc2VsZi5fbXZdOgorICAgICAgICAgICAgZm9yIGsgaW4gc2VxLmtleXMoKToKKyAgICAgICAgICAgICAgICBpZiAoZGF0ZV9jdXJfIC0gc2VxW2tdWzFdKSA+IHRpbWVkZWx0YShtaW51dGVzPTEpOgorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoJ0NsZWFudXA6IGRlbGV0aW5nIGVudHJ5ICVzJywgc2VxW2tdWzBdKQorICAgICAgICAgICAgICAgICAgICBkZWwgc2VxW2tdCisKKyAgICBkZWYgcHJvY2Vzc19JTl9DUkVBVEUoc2VsZiwgcmF3X2V2ZW50KToKKyAgICAgICAgIiIiCisgICAgICAgIElmIHRoZSBldmVudCBhZmZlY3RzIGEgZGlyZWN0b3J5IGFuZCB0aGUgYXV0b19hZGQgZmxhZyBvZiB0aGUKKyAgICAgICAgdGFyZ2V0dGVkIHdhdGNoIGlzIHNldCB0byBUcnVlLCBhIG5ldyB3YXRjaCBpcyBhZGRlZCBvbiB0aGlzCisgICAgICAgIG5ldyBkaXJlY3RvcnksIHdpdGggdGhlIHNhbWUgYXR0cmlidXRlIHZhbHVlcyB0aGFuIHRob3NlIG9mCisgICAgICAgIHRoaXMgd2F0Y2guCisgICAgICAgICIiIgorICAgICAgICBpZiByYXdfZXZlbnQubWFzayAmIElOX0lTRElSOgorICAgICAgICAgICAgd2F0Y2hfID0gc2VsZi5fd2F0Y2hfbWFuYWdlci5nZXRfd2F0Y2gocmF3X2V2ZW50LndkKQorICAgICAgICAgICAgY3JlYXRlZF9kaXIgPSBvcy5wYXRoLmpvaW4od2F0Y2hfLnBhdGgsIHJhd19ldmVudC5uYW1lKQorICAgICAgICAgICAgaWYgd2F0Y2hfLmF1dG9fYWRkIGFuZCBub3Qgd2F0Y2hfLmV4Y2x1ZGVfZmlsdGVyKGNyZWF0ZWRfZGlyKToKKyAgICAgICAgICAgICAgICBhZGR3ID0gc2VsZi5fd2F0Y2hfbWFuYWdlci5hZGRfd2F0Y2gKKyAgICAgICAgICAgICAgICAjIFRoZSBuZXdseSBtb25pdG9yZWQgZGlyZWN0b3J5IGluaGVyaXRzIGF0dHJpYnV0ZXMgZnJvbSBpdHMKKyAgICAgICAgICAgICAgICAjIHBhcmVudCBkaXJlY3RvcnkuCisgICAgICAgICAgICAgICAgYWRkd19yZXQgPSBhZGR3KGNyZWF0ZWRfZGlyLCB3YXRjaF8ubWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY19mdW49d2F0Y2hfLnByb2NfZnVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWM9RmFsc2UsIGF1dG9fYWRkPXdhdGNoXy5hdXRvX2FkZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZV9maWx0ZXI9d2F0Y2hfLmV4Y2x1ZGVfZmlsdGVyKQorCisgICAgICAgICAgICAgICAgIyBUcmljayB0byBoYW5kbGUgbWtkaXIgLXAgL2QxL2QyL3QzIHdoZXJlIGQxIGlzIHdhdGNoZWQgYW5kCisgICAgICAgICAgICAgICAgIyBkMiBhbmQgdDMgKGRpcmVjdG9yeSBvciBmaWxlKSBhcmUgY3JlYXRlZC4KKyAgICAgICAgICAgICAgICAjIFNpbmNlIHRoZSBkaXJlY3RvcnkgZDIgaXMgbmV3LCB0aGVuIGV2ZXJ5dGhpbmcgaW5zaWRlIGl0IG11c3QKKyAgICAgICAgICAgICAgICAjIGFsc28gYmUgbmV3LgorICAgICAgICAgICAgICAgIGNyZWF0ZWRfZGlyX3dkID0gYWRkd19yZXQuZ2V0KGNyZWF0ZWRfZGlyKQorICAgICAgICAgICAgICAgIGlmICgoY3JlYXRlZF9kaXJfd2QgaXMgbm90IE5vbmUpIGFuZCAoY3JlYXRlZF9kaXJfd2QgPiAwKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5pc2RpcihjcmVhdGVkX2RpcikpOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBvcy5saXN0ZGlyKGNyZWF0ZWRfZGlyKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbm5lciA9IG9zLnBhdGguam9pbihjcmVhdGVkX2RpciwgbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLl93YXRjaF9tYW5hZ2VyLmdldF93ZChpbm5lcikgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBHZW5lcmF0ZSAoc2ltdWxhdGUpIGNyZWF0aW9uIGV2ZW50cyBmb3Igc3ViLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZGlyZWN0b3JpZXMgYW5kIGZpbGVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGlubmVyKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzeW1saW5rcyBhcmUgaGFuZGxlZCBhcyBmaWxlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSBJTl9DUkVBVEUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIG9zLnBhdGguaXNkaXIoaW5uZXIpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IElOX0NSRUFURSB8IElOX0lTRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGlzIHBhdGggc2hvdWxkIG5vdCBiZSB0YWtlbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdldmVudCA9IF9SYXdFdmVudChjcmVhdGVkX2Rpcl93ZCwgZmxhZ3MsIDAsIG5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbm90aWZpZXIuYXBwZW5kX2V2ZW50KHJhd2V2ZW50KQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvciwgZXJyOgorICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gInByb2Nlc3NfSU5fQ1JFQVRFLCBpbnZhbGlkIGRpcmVjdG9yeSAlczogJXMiCisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcobXNnICUgKGNyZWF0ZWRfZGlyLCBzdHIoZXJyKSkpCisgICAgICAgIHJldHVybiBzZWxmLnByb2Nlc3NfZGVmYXVsdChyYXdfZXZlbnQpCisKKyAgICBkZWYgcHJvY2Vzc19JTl9NT1ZFRF9GUk9NKHNlbGYsIHJhd19ldmVudCk6CisgICAgICAgICIiIgorICAgICAgICBNYXAgdGhlIGNvb2tpZSB3aXRoIHRoZSBzb3VyY2UgcGF0aCAoKyBkYXRlIGZvciBjbGVhbmluZykuCisgICAgICAgICIiIgorICAgICAgICB3YXRjaF8gPSBzZWxmLl93YXRjaF9tYW5hZ2VyLmdldF93YXRjaChyYXdfZXZlbnQud2QpCisgICAgICAgIHBhdGhfID0gd2F0Y2hfLnBhdGgKKyAgICAgICAgc3JjX3BhdGggPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGguam9pbihwYXRoXywgcmF3X2V2ZW50Lm5hbWUpKQorICAgICAgICBzZWxmLl9tdl9jb29raWVbcmF3X2V2ZW50LmNvb2tpZV0gPSAoc3JjX3BhdGgsIGRhdGV0aW1lLm5vdygpKQorICAgICAgICByZXR1cm4gc2VsZi5wcm9jZXNzX2RlZmF1bHQocmF3X2V2ZW50LCB7J2Nvb2tpZSc6IHJhd19ldmVudC5jb29raWV9KQorCisgICAgZGVmIHByb2Nlc3NfSU5fTU9WRURfVE8oc2VsZiwgcmF3X2V2ZW50KToKKyAgICAgICAgIiIiCisgICAgICAgIE1hcCB0aGUgc291cmNlIHBhdGggd2l0aCB0aGUgZGVzdGluYXRpb24gcGF0aCAoKyBkYXRlIGZvcgorICAgICAgICBjbGVhbmluZykuCisgICAgICAgICIiIgorICAgICAgICB3YXRjaF8gPSBzZWxmLl93YXRjaF9tYW5hZ2VyLmdldF93YXRjaChyYXdfZXZlbnQud2QpCisgICAgICAgIHBhdGhfID0gd2F0Y2hfLnBhdGgKKyAgICAgICAgZHN0X3BhdGggPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGguam9pbihwYXRoXywgcmF3X2V2ZW50Lm5hbWUpKQorICAgICAgICBtdl8gPSBzZWxmLl9tdl9jb29raWUuZ2V0KHJhd19ldmVudC5jb29raWUpCisgICAgICAgIHRvX2FwcGVuZCA9IHsnY29va2llJzogcmF3X2V2ZW50LmNvb2tpZX0KKyAgICAgICAgaWYgbXZfIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5fbXZbbXZfWzBdXSA9IChkc3RfcGF0aCwgZGF0ZXRpbWUubm93KCkpCisgICAgICAgICAgICAjIExldCdzIGFzc3VtZSB0aGF0IElOX01PVkVEX0ZST00gZXZlbnQgaXMgYWx3YXlzIHF1ZXVlZCBiZWZvcmUKKyAgICAgICAgICAgICMgdGhhdCBpdHMgYXNzb2NpYXRlZCAodGhleSBzaGFyZSBhIGNvbW1vbiBjb29raWUpIElOX01PVkVEX1RPCisgICAgICAgICAgICAjIGV2ZW50IGlzIHF1ZXVlZCBpdHNlbGYuIEl0IGlzIHRoZW4gcG9zc2libGUgaW4gdGhhdCBzY2VuYXJpbworICAgICAgICAgICAgIyB0byBwcm92aWRlIGFzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gdGhlIElOX01PVkVEX1RPIGV2ZW50CisgICAgICAgICAgICAjIHRoZSBvcmlnaW5hbCBwYXRobmFtZSBvZiB0aGUgbW92ZWQgZmlsZS9kaXJlY3RvcnkuCisgICAgICAgICAgICB0b19hcHBlbmRbJ3NyY19wYXRobmFtZSddID0gbXZfWzBdCisgICAgICAgIGVsaWYgKHJhd19ldmVudC5tYXNrICYgSU5fSVNESVIgYW5kIHdhdGNoXy5hdXRvX2FkZCBhbmQKKyAgICAgICAgICAgICAgbm90IHdhdGNoXy5leGNsdWRlX2ZpbHRlcihkc3RfcGF0aCkpOgorICAgICAgICAgICAgIyBXZSBnb3QgYSBkaXJldG9yeSB0aGF0J3MgIm1vdmVkIGluIiBmcm9tIGFuIHVua25vd24gc291cmNlIGFuZAorICAgICAgICAgICAgIyBhdXRvX2FkZCBpcyBlbmFibGVkLiBNYW51YWxseSBhZGQgd2F0Y2hlcyB0byB0aGUgaW5uZXIgc3VidHJlZXMuCisgICAgICAgICAgICAjIFRoZSBuZXdseSBtb25pdG9yZWQgZGlyZWN0b3J5IGluaGVyaXRzIGF0dHJpYnV0ZXMgZnJvbSBpdHMKKyAgICAgICAgICAgICMgcGFyZW50IGRpcmVjdG9yeS4KKyAgICAgICAgICAgIHNlbGYuX3dhdGNoX21hbmFnZXIuYWRkX3dhdGNoKGRzdF9wYXRoLCB3YXRjaF8ubWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2NfZnVuPXdhdGNoXy5wcm9jX2Z1biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYz1UcnVlLCBhdXRvX2FkZD1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZV9maWx0ZXI9d2F0Y2hfLmV4Y2x1ZGVfZmlsdGVyKQorICAgICAgICByZXR1cm4gc2VsZi5wcm9jZXNzX2RlZmF1bHQocmF3X2V2ZW50LCB0b19hcHBlbmQpCisKKyAgICBkZWYgcHJvY2Vzc19JTl9NT1ZFX1NFTEYoc2VsZiwgcmF3X2V2ZW50KToKKyAgICAgICAgIiIiCisgICAgICAgIFNUQVRVUzogdGhlIGZvbGxvd2luZyBidWcgaGFzIGJlZW4gZml4ZWQgaW4gcmVjZW50IGtlcm5lbHMgKEZJWE1FOgorICAgICAgICB3aGljaCB2ZXJzaW9uID8pLiBOb3cgaXQgcmFpc2VzIElOX0RFTEVURV9TRUxGIGluc3RlYWQuCisKKyAgICAgICAgT2xkIGtlcm5lbHMgd2VyZSBidWdnZWQsIHRoaXMgZXZlbnQgcmFpc2VkIHdoZW4gdGhlIHdhdGNoZWQgaXRlbQorICAgICAgICB3ZXJlIG1vdmVkLCBzbyB3ZSBoYWQgdG8gdXBkYXRlIGl0cyBwYXRoLCBidXQgdW5kZXIgc29tZSBjaXJjdW1zdGFuY2VzCisgICAgICAgIGl0IHdhcyBpbXBvc3NpYmxlOiBpZiBpdHMgcGFyZW50IGRpcmVjdG9yeSBhbmQgaXRzIGRlc3RpbmF0aW9uCisgICAgICAgIGRpcmVjdG9yeSB3YXNuJ3Qgd2F0Y2hlZC4gVGhlIGtlcm5lbCAoc2VlIGluY2x1ZGUvbGludXgvZnNub3RpZnkuaCkKKyAgICAgICAgZG9lc24ndCBicmluZyB1cyBlbm91Z2ggaW5mb3JtYXRpb25zIGxpa2UgdGhlIGRlc3RpbmF0aW9uIHBhdGggb2YKKyAgICAgICAgbW92ZWQgaXRlbXMuCisgICAgICAgICIiIgorICAgICAgICB3YXRjaF8gPSBzZWxmLl93YXRjaF9tYW5hZ2VyLmdldF93YXRjaChyYXdfZXZlbnQud2QpCisgICAgICAgIHNyY19wYXRoID0gd2F0Y2hfLnBhdGgKKyAgICAgICAgbXZfID0gc2VsZi5fbXYuZ2V0KHNyY19wYXRoKQorICAgICAgICBpZiBtdl86CisgICAgICAgICAgICBkZXN0X3BhdGggPSBtdl9bMF0KKyAgICAgICAgICAgIHdhdGNoXy5wYXRoID0gZGVzdF9wYXRoCisgICAgICAgICAgICAjIGFkZCB0aGUgc2VwYXJhdG9yIHRvIHRoZSBzb3VyY2UgcGF0aCB0byBhdm9pZCBvdmVybGFwcGluZworICAgICAgICAgICAgIyBwYXRoIGlzc3VlIHdoZW4gdGVzdGluZyB3aXRoIHN0YXJ0c3dpdGgoKQorICAgICAgICAgICAgc3JjX3BhdGggKz0gb3MucGF0aC5zZXAKKyAgICAgICAgICAgIHNyY19wYXRoX2xlbiA9IGxlbihzcmNfcGF0aCkKKyAgICAgICAgICAgICMgVGhlIG5leHQgbG9vcCByZW5hbWVzIGFsbCB3YXRjaGVzIHdpdGggc3JjX3BhdGggYXMgYmFzZSBwYXRoLgorICAgICAgICAgICAgIyBJdCBzZWVtcyB0aGF0IElOX01PVkVfU0VMRiBkb2VzIG5vdCBwcm92aWRlIElOX0lTRElSIGluZm9ybWF0aW9uCisgICAgICAgICAgICAjIHRoZXJlZm9yZSB0aGUgbmV4dCBsb29wIGlzIGl0ZXJhdGVkIGV2ZW4gaWYgcmF3X2V2ZW50IGlzIGEgZmlsZS4KKyAgICAgICAgICAgIGZvciB3IGluIHNlbGYuX3dhdGNoX21hbmFnZXIud2F0Y2hlcy52YWx1ZXMoKToKKyAgICAgICAgICAgICAgICBpZiB3LnBhdGguc3RhcnRzd2l0aChzcmNfcGF0aCk6CisgICAgICAgICAgICAgICAgICAgICMgTm90ZSB0aGF0IGRlc3RfcGF0aCBpcyBhIG5vcm1hbGl6ZWQgcGF0aC4KKyAgICAgICAgICAgICAgICAgICAgdy5wYXRoID0gb3MucGF0aC5qb2luKGRlc3RfcGF0aCwgdy5wYXRoW3NyY19wYXRoX2xlbjpdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbG9nLmVycm9yKCJUaGUgcGF0aG5hbWUgJyVzJyBvZiB0aGlzIHdhdGNoICVzIGhhcyBwcm9iYWJseSBjaGFuZ2VkICIKKyAgICAgICAgICAgICAgICAgICAgICAiYW5kIGNvdWxkbid0IGJlIHVwZGF0ZWQsIHNvIGl0IGNhbm5vdCBiZSB0cnVzdGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAiYW55bW9yZS4gVG8gZml4IHRoaXMgZXJyb3IgbW92ZSBkaXJlY3Rvcmllcy9maWxlcyBvbmx5ICIKKyAgICAgICAgICAgICAgICAgICAgICAiYmV0d2VlbiB3YXRjaGVkIHBhcmVudHMgZGlyZWN0b3JpZXMsIGluIHRoaXMgY2FzZSBlLmcuICIKKyAgICAgICAgICAgICAgICAgICAgICAicHV0IGEgd2F0Y2ggb24gJyVzJy4iLAorICAgICAgICAgICAgICAgICAgICAgIHdhdGNoXy5wYXRoLCB3YXRjaF8sCisgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmpvaW4od2F0Y2hfLnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5wYXJkaXIpKSkKKyAgICAgICAgICAgIGlmIG5vdCB3YXRjaF8ucGF0aC5lbmRzd2l0aCgnLXVua25vd24tcGF0aCcpOgorICAgICAgICAgICAgICAgIHdhdGNoXy5wYXRoICs9ICctdW5rbm93bi1wYXRoJworICAgICAgICByZXR1cm4gc2VsZi5wcm9jZXNzX2RlZmF1bHQocmF3X2V2ZW50KQorCisgICAgZGVmIHByb2Nlc3NfSU5fUV9PVkVSRkxPVyhzZWxmLCByYXdfZXZlbnQpOgorICAgICAgICAiIiIKKyAgICAgICAgT25seSBzaWduYWwgYW4gb3ZlcmZsb3csIG1vc3Qgb2YgdGhlIGNvbW1vbiBmbGFncyBhcmUgaXJyZWxldmFudAorICAgICAgICBmb3IgdGhpcyBldmVudCAocGF0aCwgd2QsIG5hbWUpLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIEV2ZW50KHsnbWFzayc6IHJhd19ldmVudC5tYXNrfSkKKworICAgIGRlZiBwcm9jZXNzX0lOX0lHTk9SRUQoc2VsZiwgcmF3X2V2ZW50KToKKyAgICAgICAgIiIiCisgICAgICAgIFRoZSB3YXRjaCBkZXNjcmlwdG9yIHJhaXNlZCBieSB0aGlzIGV2ZW50IGlzIG5vdyBpZ25vcmVkIChmb3JldmVyKSwKKyAgICAgICAgaXQgY2FuIGJlIHNhZmVseSBkZWxldGVkIGZyb20gdGhlIHdhdGNoIG1hbmFnZXIgZGljdGlvbmFyeS4KKyAgICAgICAgQWZ0ZXIgdGhpcyBldmVudCB3ZSBjYW4gYmUgc3VyZSB0aGF0IG5laXRoZXIgdGhlIGV2ZW50IHF1ZXVlIG5vcgorICAgICAgICB0aGUgc3lzdGVtIHdpbGwgcmFpc2UgYW4gZXZlbnQgYXNzb2NpYXRlZCB0byB0aGlzIHdkIGFnYWluLgorICAgICAgICAiIiIKKyAgICAgICAgZXZlbnRfID0gc2VsZi5wcm9jZXNzX2RlZmF1bHQocmF3X2V2ZW50KQorICAgICAgICBzZWxmLl93YXRjaF9tYW5hZ2VyLmRlbF93YXRjaChyYXdfZXZlbnQud2QpCisgICAgICAgIHJldHVybiBldmVudF8KKworICAgIGRlZiBwcm9jZXNzX2RlZmF1bHQoc2VsZiwgcmF3X2V2ZW50LCB0b19hcHBlbmQ9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBDb21tb25zIGhhbmRsaW5nIGZvciB0aGUgZm9sbG93aW5ncyBldmVudHM6CisKKyAgICAgICAgSU5fQUNDRVNTLCBJTl9NT0RJRlksIElOX0FUVFJJQiwgSU5fQ0xPU0VfV1JJVEUsIElOX0NMT1NFX05PV1JJVEUsCisgICAgICAgIElOX09QRU4sIElOX0RFTEVURSwgSU5fREVMRVRFX1NFTEYsIElOX1VOTU9VTlQuCisgICAgICAgICIiIgorICAgICAgICB3YXRjaF8gPSBzZWxmLl93YXRjaF9tYW5hZ2VyLmdldF93YXRjaChyYXdfZXZlbnQud2QpCisgICAgICAgIGlmIHJhd19ldmVudC5tYXNrICYgKElOX0RFTEVURV9TRUxGIHwgSU5fTU9WRV9TRUxGKToKKyAgICAgICAgICAgICMgVW5mb3JudWxhdGVseSB0aGlzIGluZm9ybWF0aW9uIGlzIG5vdCBwcm92aWRlZCBieSB0aGUga2VybmVsCisgICAgICAgICAgICBkaXJfID0gd2F0Y2hfLmRpcgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGlyXyA9IGJvb2wocmF3X2V2ZW50Lm1hc2sgJiBJTl9JU0RJUikKKyAgICAgICAgZGljdF8gPSB7J3dkJzogcmF3X2V2ZW50LndkLAorICAgICAgICAgICAgICAgICAnbWFzayc6IHJhd19ldmVudC5tYXNrLAorICAgICAgICAgICAgICAgICAncGF0aCc6IHdhdGNoXy5wYXRoLAorICAgICAgICAgICAgICAgICAnbmFtZSc6IHJhd19ldmVudC5uYW1lLAorICAgICAgICAgICAgICAgICAnZGlyJzogZGlyX30KKyAgICAgICAgaWYgQ09NUEFUSUJJTElUWV9NT0RFOgorICAgICAgICAgICAgZGljdF9bJ2lzX2RpciddID0gZGlyXworICAgICAgICBpZiB0b19hcHBlbmQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBkaWN0Xy51cGRhdGUodG9fYXBwZW5kKQorICAgICAgICByZXR1cm4gRXZlbnQoZGljdF8pCisKKworY2xhc3MgUHJvY2Vzc0V2ZW50KF9Qcm9jZXNzRXZlbnQpOgorICAgICIiIgorICAgIFByb2Nlc3MgZXZlbnRzIG9iamVjdHMsIGNhbiBiZSBzcGVjaWFsaXplZCB2aWEgc3ViY2xhc3NpbmcsIHRodXMgaXRzCisgICAgYmVoYXZpb3IgY2FuIGJlIG92ZXJyaWRlbjoKKworICAgIE5vdGU6IHlvdSBzaG91bGQgbm90IG92ZXJyaWRlIF9faW5pdF9fIGluIHlvdXIgc3ViY2xhc3MgaW5zdGVhZCBkZWZpbmUKKyAgICBhIG15X2luaXQoKSBtZXRob2QsIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUKKyAgICBjb25zdHJ1Y3RvciBvZiB0aGlzIGNsYXNzIHdpdGggaXRzIG9wdGlvbmFscyBwYXJhbWV0ZXJzLgorCisgICAgICAxLiBQcm92aWRlIHNwZWNpYWxpemVkIGluZGl2aWR1YWwgbWV0aG9kcywgZS5nLiBwcm9jZXNzX0lOX0RFTEVURSBmb3IKKyAgICAgICAgIHByb2Nlc3NpbmcgYSBwcmVjaXNlIHR5cGUgb2YgZXZlbnQgKGUuZy4gSU5fREVMRVRFIGluIHRoaXMgY2FzZSkuCisgICAgICAyLiBPci9hbmQgcHJvdmlkZSBtZXRob2RzIGZvciBwcm9jZXNzaW5nIGV2ZW50cyBieSAnZmFtaWx5JywgZS5nLgorICAgICAgICAgcHJvY2Vzc19JTl9DTE9TRSBtZXRob2Qgd2lsbCBwcm9jZXNzIGJvdGggSU5fQ0xPU0VfV1JJVEUgYW5kCisgICAgICAgICBJTl9DTE9TRV9OT1dSSVRFIGV2ZW50cyAoaWYgcHJvY2Vzc19JTl9DTE9TRV9XUklURSBhbmQKKyAgICAgICAgIHByb2Nlc3NfSU5fQ0xPU0VfTk9XUklURSBhcmVuJ3QgZGVmaW5lZCB0aG91Z2gpLgorICAgICAgMy4gT3IvYW5kIG92ZXJyaWRlIHByb2Nlc3NfZGVmYXVsdCBmb3IgY2F0Y2hpbmcgYW5kIHByb2Nlc3NpbmcgYWxsCisgICAgICAgICB0aGUgcmVtYWluaW5nIHR5cGVzIG9mIGV2ZW50cy4KKyAgICAiIiIKKyAgICBwZXZlbnQgPSBOb25lCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGV2ZW50PU5vbmUsICoqa2FyZ3MpOgorICAgICAgICAiIiIKKyAgICAgICAgRW5hYmxlIGNoYWluaW5nIG9mIFByb2Nlc3NFdmVudCBpbnN0YW5jZXMuCisKKyAgICAgICAgQHBhcmFtIHBldmVudDogT3B0aW9uYWwgY2FsbGFibGUgb2JqZWN0LCB3aWxsIGJlIGNhbGxlZCBvbiBldmVudAorICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nIChiZWZvcmUgc2VsZikuCisgICAgICAgIEB0eXBlIHBldmVudDogY2FsbGFibGUKKyAgICAgICAgQHBhcmFtIGthcmdzOiBUaGlzIGNvbnN0cnVjdG9yIGlzIGltcGxlbWVudGVkIGFzIGEgdGVtcGxhdGUgbWV0aG9kCisgICAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGluZyBpdHMgb3B0aW9uYWxzIGtleXdvcmRlZCBhcmd1bWVudHMgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kIG15X2luaXQoKS4KKyAgICAgICAgQHR5cGUga2FyZ3M6IGRpY3QKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYucGV2ZW50ID0gcGV2ZW50CisgICAgICAgIHNlbGYubXlfaW5pdCgqKmthcmdzKQorCisgICAgZGVmIG15X2luaXQoc2VsZiwgKiprYXJncyk6CisgICAgICAgICIiIgorICAgICAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgZnJvbSBQcm9jZXNzRXZlbnQuX19pbml0X18oKS4gVGhpcyBtZXRob2QgaXMKKyAgICAgICAgZW1wdHkgaGVyZSBhbmQgbXVzdCBiZSByZWRlZmluZWQgdG8gYmUgdXNlZnVsLiBJbiBlZmZlY3QsIGlmIHlvdQorICAgICAgICBuZWVkIHRvIHNwZWNpZmljYWxseSBpbml0aWFsaXplIHlvdXIgc3ViY2xhc3MnIGluc3RhbmNlIHRoZW4geW91CisgICAgICAgIGp1c3QgaGF2ZSB0byBvdmVycmlkZSB0aGlzIG1ldGhvZCBpbiB5b3VyIHN1YmNsYXNzLiBUaGVuIGFsbCB0aGUKKyAgICAgICAga2V5d29yZGVkIGFyZ3VtZW50cyBwYXNzZWQgdG8gUHJvY2Vzc0V2ZW50Ll9faW5pdF9fKCkgd2lsbCBiZQorICAgICAgICB0cmFuc21pdHRlZCBhcyBwYXJhbWV0ZXJzIHRvIHRoaXMgbWV0aG9kLiBCZXdhcmUgeW91IE1VU1QgcGFzcworICAgICAgICBrZXl3b3JkIGFyZ3VtZW50cyB0aG91Z2guCisKKyAgICAgICAgQHBhcmFtIGthcmdzOiBvcHRpb25hbCBkZWxlZ2F0ZWQgYXJndW1lbnRzIGZyb20gX19pbml0X18oKS4KKyAgICAgICAgQHR5cGUga2FyZ3M6IGRpY3QKKyAgICAgICAgIiIiCisgICAgICAgIHBhc3MKKworICAgIGRlZiBfX2NhbGxfXyhzZWxmLCBldmVudCk6CisgICAgICAgIHN0b3BfY2hhaW5pbmcgPSBGYWxzZQorICAgICAgICBpZiBzZWxmLnBldmVudCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICMgQnkgZGVmYXVsdCBtZXRob2RzIHJldHVybiBOb25lIHNvIHdlIHNldCBhcyBndWlkZWxpbmUKKyAgICAgICAgICAgICMgdGhhdCBtZXRob2RzIGFza2luZyBmb3Igc3RvcCBjaGFpbmluZyBtdXN0IGV4cGxpY2l0ZWx5CisgICAgICAgICAgICAjIHJldHVybiBub24gTm9uZSBvciBub24gRmFsc2UgdmFsdWVzLCBvdGhlcndpc2UgdGhlIGRlZmF1bHQKKyAgICAgICAgICAgICMgYmVoYXZpb3Igd2lsbCBiZSB0byBhY2NlcHQgY2hhaW4gY2FsbCB0byB0aGUgY29ycmVzcG9uZGluZworICAgICAgICAgICAgIyBsb2NhbCBtZXRob2QuCisgICAgICAgICAgICBzdG9wX2NoYWluaW5nID0gc2VsZi5wZXZlbnQoZXZlbnQpCisgICAgICAgIGlmIG5vdCBzdG9wX2NoYWluaW5nOgorICAgICAgICAgICAgcmV0dXJuIF9Qcm9jZXNzRXZlbnQuX19jYWxsX18oc2VsZiwgZXZlbnQpCisKKyAgICBkZWYgbmVzdGVkX3BldmVudChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucGV2ZW50CisKKyAgICBkZWYgcHJvY2Vzc19JTl9RX09WRVJGTE9XKHNlbGYsIGV2ZW50KToKKyAgICAgICAgIiIiCisgICAgICAgIEJ5IGRlZmF1bHQgdGhpcyBtZXRob2Qgb25seSByZXBvcnRzIHdhcm5pbmcgbWVzc2FnZXMsIHlvdSBjYW4gb3ZlcnJlZGlkZQorICAgICAgICBpdCBieSBzdWJjbGFzc2luZyBQcm9jZXNzRXZlbnQgYW5kIGltcGxlbWVudCB5b3VyIG93bgorICAgICAgICBwcm9jZXNzX0lOX1FfT1ZFUkZMT1cgbWV0aG9kLiBUaGUgYWN0aW9ucyB5b3UgY2FuIHRha2Ugb24gcmVjZWl2aW5nIHRoaXMKKyAgICAgICAgZXZlbnQgaXMgZWl0aGVyIHRvIHVwZGF0ZSB0aGUgdmFyaWFibGUgbWF4X3F1ZXVlZF9ldmVudHMgaW4gb3JkZXIgdG8KKyAgICAgICAgaGFuZGxlIG1vcmUgc2ltdWx0YW5lb3VzIGV2ZW50cyBvciB0byBtb2RpZnkgeW91ciBjb2RlIGluIG9yZGVyIHRvCisgICAgICAgIGFjY29tcGxpc2ggYSBiZXR0ZXIgZmlsdGVyaW5nIGRpbWluaXNoaW5nIHRoZSBudW1iZXIgb2YgcmFpc2VkIGV2ZW50cy4KKyAgICAgICAgQmVjYXVzZSB0aGlzIG1ldGhvZCBpcyBkZWZpbmVkLCBJTl9RX09WRVJGTE9XIHdpbGwgbmV2ZXIgZ2V0CisgICAgICAgIHRyYW5zbWl0dGVkIGFzIGFyZ3VtZW50cyB0byBwcm9jZXNzX2RlZmF1bHQgY2FsbHMuCisKKyAgICAgICAgQHBhcmFtIGV2ZW50OiBJTl9RX09WRVJGTE9XIGV2ZW50LgorICAgICAgICBAdHlwZSBldmVudDogZGljdAorICAgICAgICAiIiIKKyAgICAgICAgbG9nLndhcm5pbmcoJ0V2ZW50IHF1ZXVlIG92ZXJmbG93ZWQuJykKKworICAgIGRlZiBwcm9jZXNzX2RlZmF1bHQoc2VsZiwgZXZlbnQpOgorICAgICAgICAiIiIKKyAgICAgICAgRGVmYXVsdCBwcm9jZXNzaW5nIGV2ZW50IG1ldGhvZC4gQnkgZGVmYXVsdCBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzCisgICAgICAgIFByb2Nlc3NFdmVudCBhbmQgcmVkZWZpbmUgdGhpcyBtZXRob2QgaW4gb3JkZXIgdG8gbW9kaWZ5IGl0cyBiZWhhdmlvci4KKworICAgICAgICBAcGFyYW0gZXZlbnQ6IEV2ZW50IHRvIGJlIHByb2Nlc3NlZC4gQ2FuIGJlIG9mIGFueSB0eXBlIG9mIGV2ZW50cyBidXQKKyAgICAgICAgICAgICAgICAgICAgICBJTl9RX09WRVJGTE9XIGV2ZW50cyAoc2VlIG1ldGhvZCBwcm9jZXNzX0lOX1FfT1ZFUkZMT1cpLgorICAgICAgICBAdHlwZSBldmVudDogRXZlbnQgaW5zdGFuY2UKKyAgICAgICAgIiIiCisgICAgICAgIHBhc3MKKworCitjbGFzcyBQcmludEFsbEV2ZW50cyhQcm9jZXNzRXZlbnQpOgorICAgICIiIgorICAgIER1bW15IGNsYXNzIHVzZWQgdG8gcHJpbnQgZXZlbnRzIHN0cmluZ3MgcmVwcmVzZW50YXRpb25zLiBGb3IgaW5zdGFuY2UgdGhpcworICAgIGNsYXNzIGlzIHVzZWQgZnJvbSBjb21tYW5kIGxpbmUgdG8gcHJpbnQgYWxsIHJlY2VpdmVkIGV2ZW50cyB0byBzdGRvdXQuCisgICAgIiIiCisgICAgZGVmIG15X2luaXQoc2VsZiwgb3V0PU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgQHBhcmFtIG91dDogV2hlcmUgZXZlbnRzIHdpbGwgYmUgd3JpdHRlbi4KKyAgICAgICAgQHR5cGUgb3V0OiBPYmplY3QgcHJvdmlkaW5nIGEgdmFsaWQgZmlsZSBvYmplY3QgaW50ZXJmYWNlLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgb3V0IGlzIE5vbmU6CisgICAgICAgICAgICBvdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgIHNlbGYuX291dCA9IG91dAorCisgICAgZGVmIHByb2Nlc3NfZGVmYXVsdChzZWxmLCBldmVudCk6CisgICAgICAgICIiIgorICAgICAgICBXcml0ZXMgZXZlbnQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIHRvIGZpbGUgb2JqZWN0IHByb3ZpZGVkIHRvCisgICAgICAgIG15X2luaXQoKS4KKworICAgICAgICBAcGFyYW0gZXZlbnQ6IEV2ZW50IHRvIGJlIHByb2Nlc3NlZC4gQ2FuIGJlIG9mIGFueSB0eXBlIG9mIGV2ZW50cyBidXQKKyAgICAgICAgICAgICAgICAgICAgICBJTl9RX09WRVJGTE9XIGV2ZW50cyAoc2VlIG1ldGhvZCBwcm9jZXNzX0lOX1FfT1ZFUkZMT1cpLgorICAgICAgICBAdHlwZSBldmVudDogRXZlbnQgaW5zdGFuY2UKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX291dC53cml0ZShzdHIoZXZlbnQpKQorICAgICAgICBzZWxmLl9vdXQud3JpdGUoJ1xuJykKKyAgICAgICAgc2VsZi5fb3V0LmZsdXNoKCkKKworCitjbGFzcyBDaGFpbklmVHJ1ZShQcm9jZXNzRXZlbnQpOgorICAgICIiIgorICAgIE1ha2VzIGNvbmRpdGlvbmFsIGNoYWluaW5nIGRlcGVuZGluZyBvbiB0aGUgcmVzdWx0IG9mIHRoZSBuZXN0ZWQKKyAgICBwcm9jZXNzaW5nIGluc3RhbmNlLgorICAgICIiIgorICAgIGRlZiBteV9pbml0KHNlbGYsIGZ1bmMpOgorICAgICAgICAiIiIKKyAgICAgICAgTWV0aG9kIGF1dG9tYXRpY2FsbHkgY2FsbGVkIGZyb20gYmFzZSBjbGFzcyBjb25zdHJ1Y3Rvci4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2Z1bmMgPSBmdW5jCisKKyAgICBkZWYgcHJvY2Vzc19kZWZhdWx0KHNlbGYsIGV2ZW50KToKKyAgICAgICAgcmV0dXJuIG5vdCBzZWxmLl9mdW5jKGV2ZW50KQorCisKK2NsYXNzIFN0YXRzKFByb2Nlc3NFdmVudCk6CisgICAgIiIiCisgICAgQ29tcHV0ZSBhbmQgZGlzcGxheSB0cml2aWFsIHN0YXRpc3RpY3MgYWJvdXQgcHJvY2Vzc2VkIGV2ZW50cy4KKyAgICAiIiIKKyAgICBkZWYgbXlfaW5pdChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIE1ldGhvZCBhdXRvbWF0aWNhbGx5IGNhbGxlZCBmcm9tIGJhc2UgY2xhc3MgY29uc3RydWN0b3IuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9zdGFydF90aW1lID0gdGltZS50aW1lKCkKKyAgICAgICAgc2VsZi5fc3RhdHMgPSB7fQorICAgICAgICBzZWxmLl9zdGF0c19sb2NrID0gdGhyZWFkaW5nLkxvY2soKQorCisgICAgZGVmIHByb2Nlc3NfZGVmYXVsdChzZWxmLCBldmVudCk6CisgICAgICAgICIiIgorICAgICAgICBQcm9jZXNzZXMgfGV2ZW50fC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX3N0YXRzX2xvY2suYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGV2ZW50cyA9IGV2ZW50Lm1hc2tuYW1lLnNwbGl0KCd8JykKKyAgICAgICAgICAgIGZvciBldmVudF9uYW1lIGluIGV2ZW50czoKKyAgICAgICAgICAgICAgICBjb3VudCA9IHNlbGYuX3N0YXRzLmdldChldmVudF9uYW1lLCAwKQorICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRzW2V2ZW50X25hbWVdID0gY291bnQgKyAxCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9zdGF0c19sb2NrLnJlbGVhc2UoKQorCisgICAgZGVmIF9zdGF0c19jb3B5KHNlbGYpOgorICAgICAgICBzZWxmLl9zdGF0c19sb2NrLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fc3RhdHMuY29weSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9zdGF0c19sb2NrLnJlbGVhc2UoKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBzdGF0cyA9IHNlbGYuX3N0YXRzX2NvcHkoKQorCisgICAgICAgIGVsYXBzZWQgPSBpbnQodGltZS50aW1lKCkgLSBzZWxmLl9zdGFydF90aW1lKQorICAgICAgICBlbGFwc2VkX3N0ciA9ICcnCisgICAgICAgIGlmIGVsYXBzZWQgPCA2MDoKKyAgICAgICAgICAgIGVsYXBzZWRfc3RyID0gc3RyKGVsYXBzZWQpICsgJ3NlYycKKyAgICAgICAgZWxpZiA2MCA8PSBlbGFwc2VkIDwgMzYwMDoKKyAgICAgICAgICAgIGVsYXBzZWRfc3RyID0gJyVkbW4lZHNlYycgJSAoZWxhcHNlZCAvIDYwLCBlbGFwc2VkICUgNjApCisgICAgICAgIGVsaWYgMzYwMCA8PSBlbGFwc2VkIDwgODY0MDA6CisgICAgICAgICAgICBlbGFwc2VkX3N0ciA9ICclZGglZG1uJyAlIChlbGFwc2VkIC8gMzYwMCwgKGVsYXBzZWQgJSAzNjAwKSAvIDYwKQorICAgICAgICBlbGlmIGVsYXBzZWQgPj0gODY0MDA6CisgICAgICAgICAgICBlbGFwc2VkX3N0ciA9ICclZGQlZGgnICUgKGVsYXBzZWQgLyA4NjQwMCwgKGVsYXBzZWQgJSA4NjQwMCkgLyAzNjAwKQorICAgICAgICBzdGF0c1snRWxhcHNlZFRpbWUnXSA9IGVsYXBzZWRfc3RyCisKKyAgICAgICAgbCA9IFtdCisgICAgICAgIGZvciBldiwgdmFsdWUgaW4gc29ydGVkKHN0YXRzLml0ZW1zKCksIGtleT1sYW1iZGEgeDogeFswXSk6CisgICAgICAgICAgICBsLmFwcGVuZCgnICVzPSVzJyAlIChvdXRwdXRfZm9ybWF0LmZpZWxkX25hbWUoZXYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2Zvcm1hdC5maWVsZF92YWx1ZSh2YWx1ZSkpKQorICAgICAgICBzID0gJzwlcyVzID4nICUgKG91dHB1dF9mb3JtYXQuY2xhc3NfbmFtZShzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJycuam9pbihsKSkKKyAgICAgICAgcmV0dXJuIHMKKworICAgIGRlZiBkdW1wKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgIiIiCisgICAgICAgIER1bXBzIHN0YXRpc3RpY3MuCisKKyAgICAgICAgQHBhcmFtIGZpbGVuYW1lOiBmaWxlbmFtZSB3aGVyZSBzdGF0cyB3aWxsIGJlIGR1bXBlZCwgZmlsZW5hbWUgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkIGFuZCBtdXN0IG5vdCBleGlzdCBwcmlvciB0byB0aGlzIGNhbGwuCisgICAgICAgIEB0eXBlIGZpbGVuYW1lOiBzdHJpbmcKKyAgICAgICAgIiIiCisgICAgICAgIGZsYWdzID0gb3MuT19XUk9OTFl8b3MuT19DUkVBVHxvcy5PX05PRk9MTE9XfG9zLk9fRVhDTAorICAgICAgICBmZCA9IG9zLm9wZW4oZmlsZW5hbWUsIGZsYWdzLCAwNjAwKQorICAgICAgICBvcy53cml0ZShmZCwgc3RyKHNlbGYpKQorICAgICAgICBvcy5jbG9zZShmZCkKKworICAgIGRlZiBfX3N0cl9fKHNlbGYsIHNjYWxlPTQ1KToKKyAgICAgICAgc3RhdHMgPSBzZWxmLl9zdGF0c19jb3B5KCkKKyAgICAgICAgaWYgbm90IHN0YXRzOgorICAgICAgICAgICAgcmV0dXJuICcnCisKKyAgICAgICAgbSA9IG1heChzdGF0cy52YWx1ZXMoKSkKKyAgICAgICAgdW5pdHkgPSBmbG9hdChzY2FsZSkgLyBtCisgICAgICAgIGZtdCA9ICclJS0yNnMlJS0lZHMlJXMnICUgKGxlbihvdXRwdXRfZm9ybWF0LmZpZWxkX3ZhbHVlKCdAJyAqIHNjYWxlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAxKQorICAgICAgICBkZWYgZnVuYyh4KToKKyAgICAgICAgICAgIHJldHVybiBmbXQgJSAob3V0cHV0X2Zvcm1hdC5maWVsZF9uYW1lKHhbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZm9ybWF0LmZpZWxkX3ZhbHVlKCdAJyAqIGludCh4WzFdICogdW5pdHkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2Zvcm1hdC5zaW1wbGUoJyVkJyAlIHhbMV0sICd5ZWxsb3cnKSkKKyAgICAgICAgcyA9ICdcbicuam9pbihtYXAoZnVuYywgc29ydGVkKHN0YXRzLml0ZW1zKCksIGtleT1sYW1iZGEgeDogeFswXSkpKQorICAgICAgICByZXR1cm4gcworCisKK2NsYXNzIE5vdGlmaWVyRXJyb3IoUHlpbm90aWZ5RXJyb3IpOgorICAgICIiIgorICAgIE5vdGlmaWVyIEV4Y2VwdGlvbi4gUmFpc2VkIG9uIE5vdGlmaWVyIGVycm9yLgorCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVycik6CisgICAgICAgICIiIgorICAgICAgICBAcGFyYW0gZXJyOiBFeGNlcHRpb24gc3RyaW5nJ3MgZGVzY3JpcHRpb24uCisgICAgICAgIEB0eXBlIGVycjogc3RyaW5nCisgICAgICAgICIiIgorICAgICAgICBQeWlub3RpZnlFcnJvci5fX2luaXRfXyhzZWxmLCBlcnIpCisKKworY2xhc3MgTm90aWZpZXI6CisgICAgIiIiCisgICAgUmVhZCBub3RpZmljYXRpb25zLCBwcm9jZXNzIGV2ZW50cy4KKworICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3YXRjaF9tYW5hZ2VyLCBkZWZhdWx0X3Byb2NfZnVuPU5vbmUsIHJlYWRfZnJlcT0wLAorICAgICAgICAgICAgICAgICB0aHJlc2hvbGQ9MCwgdGltZW91dD1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIEluaXRpYWxpemF0aW9uLiByZWFkX2ZyZXEsIHRocmVzaG9sZCBhbmQgdGltZW91dCBwYXJhbWV0ZXJzIGFyZSB1c2VkCisgICAgICAgIHdoZW4gbG9vcGluZy4KKworICAgICAgICBAcGFyYW0gd2F0Y2hfbWFuYWdlcjogV2F0Y2ggTWFuYWdlci4KKyAgICAgICAgQHR5cGUgd2F0Y2hfbWFuYWdlcjogV2F0Y2hNYW5hZ2VyIGluc3RhbmNlCisgICAgICAgIEBwYXJhbSBkZWZhdWx0X3Byb2NfZnVuOiBEZWZhdWx0IHByb2Nlc3NpbmcgbWV0aG9kLiBJZiBOb25lLCBhIG5ldworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2Ugb2YgUHJpbnRBbGxFdmVudHMgd2lsbCBiZSBhc3NpZ25lZC4KKyAgICAgICAgQHR5cGUgZGVmYXVsdF9wcm9jX2Z1bjogaW5zdGFuY2Ugb2YgUHJvY2Vzc0V2ZW50CisgICAgICAgIEBwYXJhbSByZWFkX2ZyZXE6IGlmIHJlYWRfZnJlcSA9PSAwLCBldmVudHMgYXJlIHJlYWQgYXNhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcmVhZF9mcmVxIGlzID4gMCwgdGhpcyB0aHJlYWQgc2xlZXBzCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1heCgwLCByZWFkX2ZyZXEgLSB0aW1lb3V0KSBzZWNvbmRzLiBCdXQgaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCBpcyBOb25lIGl0IG1heSBiZSBkaWZmZXJlbnQgYmVjYXVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xsIGlzIGJsb2NraW5nIHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byByZWFkLgorICAgICAgICBAdHlwZSByZWFkX2ZyZXE6IGludAorICAgICAgICBAcGFyYW0gdGhyZXNob2xkOiBGaWxlIGRlc2NyaXB0b3Igd2lsbCBiZSByZWFkIG9ubHkgaWYgdGhlIGFjY3VtdWxhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgdG8gcmVhZCBiZWNvbWVzID49IHRocmVzaG9sZC4gSWYgIT0gMCwgeW91IGxpa2VseQorICAgICAgICAgICAgICAgICAgICAgICAgICB3YW50IHRvIHVzZSBpdCBpbiBjb21iaW5hdGlvbiB3aXRoIGFuIGFwcHJvcHJpYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGZvciByZWFkX2ZyZXEgYmVjYXVzZSB3aXRob3V0IHRoYXQgeW91IHdvdWxkCisgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXAgbG9vcGluZyB3aXRob3V0IHJlYWxseSByZWFkaW5nIGFueXRoaW5nIGFuZCB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgIHVudGlsIHRoZSBhbW91bnQgb2YgZXZlbnRzIHRvIHJlYWQgaXMgPj0gdGhyZXNob2xkLgorICAgICAgICAgICAgICAgICAgICAgICAgICBBdCBsZWFzdCB3aXRoIHJlYWRfZnJlcSBzZXQgeW91IG1pZ2h0IHNsZWVwLgorICAgICAgICBAdHlwZSB0aHJlc2hvbGQ6IGludAorICAgICAgICBAcGFyYW0gdGltZW91dDoKKyAgICAgICAgICAgIGh0dHBzOi8vZG9jcy5weXRob24ub3JnLzMvbGlicmFyeS9zZWxlY3QuaHRtbCNwb2xsaW5nLW9iamVjdHMKKyAgICAgICAgQHR5cGUgdGltZW91dDogaW50CisgICAgICAgICIiIgorICAgICAgICAjIFdhdGNoIE1hbmFnZXIgaW5zdGFuY2UKKyAgICAgICAgc2VsZi5fd2F0Y2hfbWFuYWdlciA9IHdhdGNoX21hbmFnZXIKKyAgICAgICAgIyBGaWxlIGRlc2NyaXB0b3IKKyAgICAgICAgc2VsZi5fZmQgPSBzZWxmLl93YXRjaF9tYW5hZ2VyLmdldF9mZCgpCisgICAgICAgICMgUG9sbCBvYmplY3QgYW5kIHJlZ2lzdHJhdGlvbgorICAgICAgICBzZWxmLl9wb2xsb2JqID0gc2VsZWN0LnBvbGwoKQorICAgICAgICBzZWxmLl9wb2xsb2JqLnJlZ2lzdGVyKHNlbGYuX2ZkLCBzZWxlY3QuUE9MTElOKQorICAgICAgICAjIFRoaXMgcGlwZSBpcyBjb3JyZWN0ZWx5IGluaXRpYWxpemVkIGFuZCB1c2VkIGJ5IFRocmVhZGVkTm90aWZpZXIKKyAgICAgICAgc2VsZi5fcGlwZSA9ICgtMSwgLTEpCisgICAgICAgICMgRXZlbnQgcXVldWUKKyAgICAgICAgc2VsZi5fZXZlbnRxID0gZGVxdWUoKQorICAgICAgICAjIFN5c3RlbSBwcm9jZXNzaW5nIGZ1bmN0b3IsIGNvbW1vbiB0byBhbGwgZXZlbnRzCisgICAgICAgIHNlbGYuX3N5c19wcm9jX2Z1biA9IF9TeXNQcm9jZXNzRXZlbnQoc2VsZi5fd2F0Y2hfbWFuYWdlciwgc2VsZikKKyAgICAgICAgIyBEZWZhdWx0IHByb2Nlc3NpbmcgbWV0aG9kCisgICAgICAgIHNlbGYuX2RlZmF1bHRfcHJvY19mdW4gPSBkZWZhdWx0X3Byb2NfZnVuCisgICAgICAgIGlmIGRlZmF1bHRfcHJvY19mdW4gaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX2RlZmF1bHRfcHJvY19mdW4gPSBQcmludEFsbEV2ZW50cygpCisgICAgICAgICMgTG9vcCBwYXJhbWV0ZXJzCisgICAgICAgIHNlbGYuX3JlYWRfZnJlcSA9IHJlYWRfZnJlcQorICAgICAgICBzZWxmLl90aHJlc2hvbGQgPSB0aHJlc2hvbGQKKyAgICAgICAgc2VsZi5fdGltZW91dCA9IHRpbWVvdXQKKyAgICAgICAgIyBDb2FsZXNjZSBldmVudHMgb3B0aW9uCisgICAgICAgIHNlbGYuX2NvYWxlc2NlID0gRmFsc2UKKyAgICAgICAgIyBzZXQgb2Ygc3RyKHJhd19ldmVudCksIG9ubHkgdXNlZCB3aGVuIGNvYWxlc2NlIG9wdGlvbiBpcyBUcnVlCisgICAgICAgIHNlbGYuX2V2ZW50c2V0ID0gc2V0KCkKKworICAgIGRlZiBhcHBlbmRfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICAiIiIKKyAgICAgICAgQXBwZW5kIGEgcmF3IGV2ZW50IHRvIHRoZSBldmVudCBxdWV1ZS4KKworICAgICAgICBAcGFyYW0gZXZlbnQ6IEFuIGV2ZW50LgorICAgICAgICBAdHlwZSBldmVudDogX1Jhd0V2ZW50IGluc3RhbmNlLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fZXZlbnRxLmFwcGVuZChldmVudCkKKworICAgIGRlZiBwcm9jX2Z1bihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2RlZmF1bHRfcHJvY19mdW4KKworICAgIGRlZiBjb2FsZXNjZV9ldmVudHMoc2VsZiwgY29hbGVzY2U9VHJ1ZSk6CisgICAgICAgICIiIgorICAgICAgICBDb2FsZXNjaW5nIGV2ZW50cy4gRXZlbnRzIGFyZSB1c3VhbGx5IHByb2Nlc3NlZCBieSBiYXRjaHMsIHRoZWlyIHNpemUKKyAgICAgICAgZGVwZW5kIG9uIHZhcmlvdXMgZmFjdG9ycy4gVGh1cywgYmVmb3JlIHByb2Nlc3NpbmcgdGhlbSwgZXZlbnRzIHJlY2VpdmVkCisgICAgICAgIGZyb20gaW5vdGlmeSBhcmUgYWdncmVnYXRlZCBpbiBhIGZpZm8gcXVldWUuIElmIHRoaXMgY29hbGVzY2luZworICAgICAgICBvcHRpb24gaXMgZW5hYmxlZCBldmVudHMgYXJlIGZpbHRlcmVkIGJhc2VkIG9uIHRoZWlyIHVuaWNpdHksIG9ubHkKKyAgICAgICAgdW5pcXVlIGV2ZW50cyBhcmUgZW5xdWV1ZWQsIGRvdWJsb25zIGFyZSBkaXNjYXJkZWQuIEFuIGV2ZW50IGlzIHVuaXF1ZQorICAgICAgICB3aGVuIHRoZSBjb21iaW5hdGlvbiBvZiBpdHMgZmllbGRzICh3ZCwgbWFzaywgY29va2llLCBuYW1lKSBpcyB1bmlxdWUKKyAgICAgICAgYW1vbmcgZXZlbnRzIG9mIGEgc2FtZSBiYXRjaC4gQWZ0ZXIgYSBiYXRjaCBvZiBldmVudHMgaXMgcHJvY2Vzc2VkIGFueQorICAgICAgICBldmVudHMgaXMgYWNjZXB0ZWQgYWdhaW4uIEJ5IGRlZmF1bHQgdGhpcyBvcHRpb24gaXMgZGlzYWJsZWQsIHlvdSBoYXZlCisgICAgICAgIHRvIGV4cGxpY3RseSBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gdHVybiBpdCBvbi4KKworICAgICAgICBAcGFyYW0gY29hbGVzY2U6IE9wdGlvbmFsIG5ldyBjb2FsZXNjaW5nIHZhbHVlLiBUcnVlIGJ5IGRlZmF1bHQuCisgICAgICAgIEB0eXBlIGNvYWxlc2NlOiBCb29sCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9jb2FsZXNjZSA9IGNvYWxlc2NlCisgICAgICAgIGlmIG5vdCBjb2FsZXNjZToKKyAgICAgICAgICAgIHNlbGYuX2V2ZW50c2V0LmNsZWFyKCkKKworICAgIGRlZiBjaGVja19ldmVudHMoc2VsZiwgdGltZW91dD1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIENoZWNrIGZvciBuZXcgZXZlbnRzIGF2YWlsYWJsZSB0byByZWFkLCBibG9ja3MgdXAgdG8gdGltZW91dAorICAgICAgICBtaWxsaXNlY29uZHMuCisKKyAgICAgICAgQHBhcmFtIHRpbWVvdXQ6IElmIHNwZWNpZmllZCBpdCBvdmVycmlkZXMgdGhlIGNvcnJlc3BvbmRpbmcgaW5zdGFuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSBfdGltZW91dC4KKyAgICAgICAgQHR5cGUgdGltZW91dDogaW50CisKKyAgICAgICAgQHJldHVybjogTmV3IGV2ZW50cyB0byByZWFkLgorICAgICAgICBAcnR5cGU6IGJvb2wKKyAgICAgICAgIiIiCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgIyBibG9ja3MgdXAgdG8gJ3RpbWVvdXQnIG1pbGxpc2Vjb25kcworICAgICAgICAgICAgICAgIGlmIHRpbWVvdXQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgdGltZW91dCA9IHNlbGYuX3RpbWVvdXQKKyAgICAgICAgICAgICAgICByZXQgPSBzZWxmLl9wb2xsb2JqLnBvbGwodGltZW91dCkKKyAgICAgICAgICAgIGV4Y2VwdCBzZWxlY3QuZXJyb3IsIGVycjoKKyAgICAgICAgICAgICAgICBpZiBlcnJbMF0gPT0gZXJybm8uRUlOVFI6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlICMgaW50ZXJydXB0ZWQsIHJldHJ5CisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICBpZiBub3QgcmV0IG9yIChzZWxmLl9waXBlWzBdID09IHJldFswXVswXSk6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgIyBvbmx5IG9uZSBmZCBpcyBwb2xsZWQKKyAgICAgICAgcmV0dXJuIHJldFswXVsxXSAmIHNlbGVjdC5QT0xMSU4KKworICAgIGRlZiByZWFkX2V2ZW50cyhzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFJlYWQgZXZlbnRzIGZyb20gZGV2aWNlLCBidWlsZCBfUmF3RXZlbnRzLCBhbmQgZW5xdWV1ZSB0aGVtLgorICAgICAgICAiIiIKKyAgICAgICAgYnVmXyA9IGFycmF5LmFycmF5KCdpJywgWzBdKQorICAgICAgICAjIGdldCBldmVudCBxdWV1ZSBzaXplCisgICAgICAgIGlmIGZjbnRsLmlvY3RsKHNlbGYuX2ZkLCB0ZXJtaW9zLkZJT05SRUFELCBidWZfLCAxKSA9PSAtMToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBxdWV1ZV9zaXplID0gYnVmX1swXQorICAgICAgICBpZiBxdWV1ZV9zaXplIDwgc2VsZi5fdGhyZXNob2xkOgorICAgICAgICAgICAgbG9nLmRlYnVnKCcoZmQ6ICVkKSAlZCBieXRlcyBhdmFpbGFibGUgdG8gcmVhZCBidXQgdGhyZXNob2xkIGlzICcKKyAgICAgICAgICAgICAgICAgICAgICAnZml4ZWQgdG8gJWQgYnl0ZXMnLCBzZWxmLl9mZCwgcXVldWVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90aHJlc2hvbGQpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICB0cnk6CisgICAgICAgICAgICAjIFJlYWQgY29udGVudCBmcm9tIGZpbGUKKyAgICAgICAgICAgIHIgPSBvcy5yZWFkKHNlbGYuX2ZkLCBxdWV1ZV9zaXplKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBtc2c6CisgICAgICAgICAgICByYWlzZSBOb3RpZmllckVycm9yKG1zZykKKyAgICAgICAgbG9nLmRlYnVnKCdFdmVudCBxdWV1ZSBzaXplOiAlZCcsIHF1ZXVlX3NpemUpCisgICAgICAgIHJzdW0gPSAwICAjIGNvdW50ZXIKKyAgICAgICAgd2hpbGUgcnN1bSA8IHF1ZXVlX3NpemU6CisgICAgICAgICAgICBzX3NpemUgPSAxNgorICAgICAgICAgICAgIyBSZXRyaWV2ZSB3ZCwgbWFzaywgY29va2llIGFuZCBmbmFtZV9sZW4KKyAgICAgICAgICAgIHdkLCBtYXNrLCBjb29raWUsIGZuYW1lX2xlbiA9IHN0cnVjdC51bnBhY2soJ2lJSUknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByW3JzdW06cnN1bStzX3NpemVdKQorICAgICAgICAgICAgIyBSZXRyaWV2ZSBuYW1lCisgICAgICAgICAgICBmbmFtZSwgPSBzdHJ1Y3QudW5wYWNrKCclZHMnICUgZm5hbWVfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByW3JzdW0gKyBzX3NpemU6cnN1bSArIHNfc2l6ZSArIGZuYW1lX2xlbl0pCisgICAgICAgICAgICByYXdldmVudCA9IF9SYXdFdmVudCh3ZCwgbWFzaywgY29va2llLCBmbmFtZSkKKyAgICAgICAgICAgIGlmIHNlbGYuX2NvYWxlc2NlOgorICAgICAgICAgICAgICAgICMgT25seSBlbnF1ZXVlIG5ldyAodW5pcXVlKSBldmVudHMuCisgICAgICAgICAgICAgICAgcmF3ZXZlbnRzdHIgPSBzdHIocmF3ZXZlbnQpCisgICAgICAgICAgICAgICAgaWYgcmF3ZXZlbnRzdHIgbm90IGluIHNlbGYuX2V2ZW50c2V0OgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9ldmVudHNldC5hZGQocmF3ZXZlbnRzdHIpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2V2ZW50cS5hcHBlbmQocmF3ZXZlbnQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuX2V2ZW50cS5hcHBlbmQocmF3ZXZlbnQpCisgICAgICAgICAgICByc3VtICs9IHNfc2l6ZSArIGZuYW1lX2xlbgorCisgICAgZGVmIHByb2Nlc3NfZXZlbnRzKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgUm91dGluZSBmb3IgcHJvY2Vzc2luZyBldmVudHMgZnJvbSBxdWV1ZSBieSBjYWxsaW5nIHRoZWlyCisgICAgICAgIGFzc29jaWF0ZWQgcHJvY2Nlc3NpbmcgbWV0aG9kIChhbiBpbnN0YW5jZSBvZiBQcm9jZXNzRXZlbnQpLgorICAgICAgICBJdCBhbHNvIGRvZXMgaW50ZXJuYWwgcHJvY2Vzc2luZ3MsIHRvIGtlZXAgdGhlIHN5c3RlbSB1cGRhdGVkLgorICAgICAgICAiIiIKKyAgICAgICAgd2hpbGUgc2VsZi5fZXZlbnRxOgorICAgICAgICAgICAgcmF3X2V2ZW50ID0gc2VsZi5fZXZlbnRxLnBvcGxlZnQoKSAgIyBwb3AgbmV4dCBldmVudAorICAgICAgICAgICAgaWYgc2VsZi5fd2F0Y2hfbWFuYWdlci5pZ25vcmVfZXZlbnRzOgorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXZlbnQgaWdub3JlZDogJXMiICUgcmVwcihyYXdfZXZlbnQpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICB3YXRjaF8gPSBzZWxmLl93YXRjaF9tYW5hZ2VyLmdldF93YXRjaChyYXdfZXZlbnQud2QpCisgICAgICAgICAgICBpZiAod2F0Y2hfIGlzIE5vbmUpIGFuZCBub3QgKHJhd19ldmVudC5tYXNrICYgSU5fUV9PVkVSRkxPVyk6CisgICAgICAgICAgICAgICAgaWYgbm90IChyYXdfZXZlbnQubWFzayAmIElOX0lHTk9SRUQpOgorICAgICAgICAgICAgICAgICAgICAjIE5vdCByZWFsbHkgc3VyZSBob3cgd2UgZW5kZWQgdXAgaGVyZSwgbm9yIGhvdyB3ZSBzaG91bGQKKyAgICAgICAgICAgICAgICAgICAgIyBoYW5kbGUgdGhlc2UgdHlwZXMgb2YgZXZlbnRzIGFuZCBpZiBpdCBpcyBhcHByb3ByaWF0ZSB0bworICAgICAgICAgICAgICAgICAgICAjIGNvbXBsZXRseSBza2lwIHRoZW0gKGxpa2Ugd2UgYXJlIGRvaW5nIGhlcmUpLgorICAgICAgICAgICAgICAgICAgICBsb2cud2FybmluZygiVW5hYmxlIHRvIHJldHJpZXZlIFdhdGNoIG9iamVjdCBhc3NvY2lhdGVkIHRvICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcihyYXdfZXZlbnQpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICByZXZlbnQgPSBzZWxmLl9zeXNfcHJvY19mdW4ocmF3X2V2ZW50KSAgIyBzeXN0ZW0gcHJvY2Vzc2luZ3MKKyAgICAgICAgICAgIGlmIHdhdGNoXyBhbmQgd2F0Y2hfLnByb2NfZnVuOgorICAgICAgICAgICAgICAgIHdhdGNoXy5wcm9jX2Z1bihyZXZlbnQpICAjIHVzZXIgcHJvY2Vzc2luZ3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5fZGVmYXVsdF9wcm9jX2Z1bihyZXZlbnQpCisgICAgICAgIHNlbGYuX3N5c19wcm9jX2Z1bi5jbGVhbnVwKCkgICMgcmVtb3ZlIG9sZHMgTU9WRURfKiBldmVudHMgcmVjb3JkcworICAgICAgICBpZiBzZWxmLl9jb2FsZXNjZToKKyAgICAgICAgICAgIHNlbGYuX2V2ZW50c2V0LmNsZWFyKCkKKworICAgIGRlZiBfX2RhZW1vbml6ZShzZWxmLCBwaWRfZmlsZT1Ob25lLCBzdGRpbj1vcy5kZXZudWxsLCBzdGRvdXQ9b3MuZGV2bnVsbCwKKyAgICAgICAgICAgICAgICAgICAgc3RkZXJyPW9zLmRldm51bGwpOgorICAgICAgICAiIiIKKyAgICAgICAgQHBhcmFtIHBpZF9maWxlOiBmaWxlIHdoZXJlIHRoZSBwaWQgd2lsbCBiZSB3cml0dGVuLiBJZiBwaWRfZmlsZT1Ob25lCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBpZCBpcyB3cml0dGVuIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgL3Zhci9ydW4vPHN5cy5hcmd2WzBdfHB5aW5vdGlmeT4ucGlkLCBpZiBwaWRfZmlsZT1GYWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgIG5vIHBpZF9maWxlIGlzIHdyaXR0ZW4uCisgICAgICAgIEBwYXJhbSBzdGRpbjoKKyAgICAgICAgQHBhcmFtIHN0ZG91dDoKKyAgICAgICAgQHBhcmFtIHN0ZGVycjogZmlsZXMgYXNzb2NpYXRlZCB0byBjb21tb24gc3RyZWFtcy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHBpZF9maWxlIGlzIE5vbmU6CisgICAgICAgICAgICBkaXJuYW1lID0gJy92YXIvcnVuLycKKyAgICAgICAgICAgIGJhc2VuYW1lID0gb3MucGF0aC5iYXNlbmFtZShzeXMuYXJndlswXSkgb3IgJ3B5aW5vdGlmeScKKyAgICAgICAgICAgIHBpZF9maWxlID0gb3MucGF0aC5qb2luKGRpcm5hbWUsIGJhc2VuYW1lICsgJy5waWQnKQorCisgICAgICAgIGlmIHBpZF9maWxlICE9IEZhbHNlIGFuZCBvcy5wYXRoLmxleGlzdHMocGlkX2ZpbGUpOgorICAgICAgICAgICAgZXJyID0gJ0Nhbm5vdCBkYWVtb25pemU6IHBpZCBmaWxlICVzIGFscmVhZHkgZXhpc3RzLicgJSBwaWRfZmlsZQorICAgICAgICAgICAgcmFpc2UgTm90aWZpZXJFcnJvcihlcnIpCisKKyAgICAgICAgZGVmIGZvcmtfZGFlbW9uKCk6CisgICAgICAgICAgICAjIEFkYXB0ZWQgZnJvbSBDaGFkIEouIFNjaHJvZWRlcidzIHJlY2lwZQorICAgICAgICAgICAgIyBAc2VlIGh0dHA6Ly9jb2RlLmFjdGl2ZXN0YXRlLmNvbS9yZWNpcGVzLzI3ODczMS8KKyAgICAgICAgICAgIHBpZCA9IG9zLmZvcmsoKQorICAgICAgICAgICAgaWYgKHBpZCA9PSAwKToKKyAgICAgICAgICAgICAgICAjIHBhcmVudCAyCisgICAgICAgICAgICAgICAgb3Muc2V0c2lkKCkKKyAgICAgICAgICAgICAgICBwaWQgPSBvcy5mb3JrKCkKKyAgICAgICAgICAgICAgICBpZiAocGlkID09IDApOgorICAgICAgICAgICAgICAgICAgICAjIGNoaWxkCisgICAgICAgICAgICAgICAgICAgIG9zLmNoZGlyKCcvJykKKyAgICAgICAgICAgICAgICAgICAgb3MudW1hc2soMDIyKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgcGFyZW50IDIKKyAgICAgICAgICAgICAgICAgICAgb3MuX2V4aXQoMCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBwYXJlbnQgMQorICAgICAgICAgICAgICAgIG9zLl9leGl0KDApCisKKyAgICAgICAgICAgIGZkX2lucCA9IG9zLm9wZW4oc3RkaW4sIG9zLk9fUkRPTkxZKQorICAgICAgICAgICAgb3MuZHVwMihmZF9pbnAsIDApCisgICAgICAgICAgICBmZF9vdXQgPSBvcy5vcGVuKHN0ZG91dCwgb3MuT19XUk9OTFl8b3MuT19DUkVBVCwgMDYwMCkKKyAgICAgICAgICAgIG9zLmR1cDIoZmRfb3V0LCAxKQorICAgICAgICAgICAgZmRfZXJyID0gb3Mub3BlbihzdGRlcnIsIG9zLk9fV1JPTkxZfG9zLk9fQ1JFQVQsIDA2MDApCisgICAgICAgICAgICBvcy5kdXAyKGZkX2VyciwgMikKKworICAgICAgICAjIERldGFjaCB0YXNrCisgICAgICAgIGZvcmtfZGFlbW9uKCkKKworICAgICAgICAjIFdyaXRlIHBpZAorICAgICAgICBpZiBwaWRfZmlsZSAhPSBGYWxzZToKKyAgICAgICAgICAgIGZsYWdzID0gb3MuT19XUk9OTFl8b3MuT19DUkVBVHxvcy5PX05PRk9MTE9XfG9zLk9fRVhDTAorICAgICAgICAgICAgZmRfcGlkID0gb3Mub3BlbihwaWRfZmlsZSwgZmxhZ3MsIDA2MDApCisgICAgICAgICAgICBvcy53cml0ZShmZF9waWQsIHN0cihvcy5nZXRwaWQoKSkgKyAnXG4nKQorICAgICAgICAgICAgb3MuY2xvc2UoZmRfcGlkKQorICAgICAgICAgICAgIyBSZWdpc3RlciB1bmxpbmsgZnVuY3Rpb24KKyAgICAgICAgICAgIGF0ZXhpdC5yZWdpc3RlcihsYW1iZGEgOiBvcy51bmxpbmsocGlkX2ZpbGUpKQorCisgICAgZGVmIF9zbGVlcChzZWxmLCByZWZfdGltZSk6CisgICAgICAgICMgT25seSBjb25zaWRlciBzbGVlcGluZyBpZiByZWFkX2ZyZXEgaXMgPiAwCisgICAgICAgIGlmIHNlbGYuX3JlYWRfZnJlcSA+IDA6CisgICAgICAgICAgICBjdXJfdGltZSA9IHRpbWUudGltZSgpCisgICAgICAgICAgICBzbGVlcF9hbW91bnQgPSBzZWxmLl9yZWFkX2ZyZXEgLSAoY3VyX3RpbWUgLSByZWZfdGltZSkKKyAgICAgICAgICAgIGlmIHNsZWVwX2Ftb3VudCA+IDA6CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCdOb3cgc2xlZXBpbmcgJWQgc2Vjb25kcycsIHNsZWVwX2Ftb3VudCkKKyAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKHNsZWVwX2Ftb3VudCkKKworICAgIGRlZiBsb29wKHNlbGYsIGNhbGxiYWNrPU5vbmUsIGRhZW1vbml6ZT1GYWxzZSwgKiphcmdzKToKKyAgICAgICAgIiIiCisgICAgICAgIEV2ZW50cyBhcmUgcmVhZCBvbmx5IG9uZSB0aW1lIGV2ZXJ5IG1pbihyZWFkX2ZyZXEsIHRpbWVvdXQpCisgICAgICAgIHNlY29uZHMgYXQgYmVzdCBhbmQgb25seSBpZiB0aGUgc2l6ZSB0byByZWFkIGlzID49IHRocmVzaG9sZC4KKyAgICAgICAgQWZ0ZXIgdGhpcyBtZXRob2QgcmV0dXJucyBpdCBtdXN0IG5vdCBiZSBjYWxsZWQgYWdhaW4gZm9yIHRoZSBzYW1lCisgICAgICAgIGluc3RhbmNlLgorCisgICAgICAgIEBwYXJhbSBjYWxsYmFjazogRnVuY3RvciBjYWxsZWQgYWZ0ZXIgZWFjaCBldmVudCBwcm9jZXNzaW5nIGl0ZXJhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICBFeHBlY3RzIHRvIHJlY2VpdmUgdGhlIG5vdGlmaWVyIG9iamVjdCAoc2VsZikgYXMgZmlyc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBUcnVlIHRoZSBsb29wIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgaW1tZWRpYXRlbHkgdGVybWluYXRlZCBvdGhlcndpc2UgdGhlIGxvb3AgbWV0aG9kIGtlZXBzCisgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcGluZy4KKyAgICAgICAgQHR5cGUgY2FsbGJhY2s6IGNhbGxhYmxlIG9iamVjdCBvciBmdW5jdGlvbgorICAgICAgICBAcGFyYW0gZGFlbW9uaXplOiBUaGlzIHRocmVhZCBpcyBkYWVtb25pemVkIGlmIHNldCB0byBUcnVlLgorICAgICAgICBAdHlwZSBkYWVtb25pemU6IGJvb2xlYW4KKyAgICAgICAgQHBhcmFtIGFyZ3M6IE9wdGlvbmFsIGFuZCByZWxldmFudCBvbmx5IGlmIGRhZW1vbml6ZSBpcyBUcnVlLiBSZW1haW5pbmcKKyAgICAgICAgICAgICAgICAgICAgIGtleXdvcmRlZCBhcmd1bWVudHMgYXJlIGRpcmVjdGx5IHBhc3NlZCB0byBkYWVtb25pemUgc2VlCisgICAgICAgICAgICAgICAgICAgICBfX2RhZW1vbml6ZSgpIG1ldGhvZC4gSWYgcGlkX2ZpbGU9Tm9uZSBvciBpcyBzZXQgdG8gYQorICAgICAgICAgICAgICAgICAgICAgcGF0aG5hbWUgdGhlIGNhbGxlciBtdXN0IGVuc3VyZSB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdAorICAgICAgICAgICAgICAgICAgICAgYmVmb3JlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvdGhlcndpc2UgYW4gZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICBweWlub3RpZnkuTm90aWZpZXJFcnJvciB3aWxsIGJlIHJhaXNlZC4gSWYgcGlkX2ZpbGU9RmFsc2UKKyAgICAgICAgICAgICAgICAgICAgIGl0IGlzIHN0aWxsIGRhZW1vbml6ZWQgYnV0IHRoZSBwaWQgaXMgbm90IHdyaXR0ZW4gaW4gYW55CisgICAgICAgICAgICAgICAgICAgICBmaWxlLgorICAgICAgICBAdHlwZSBhcmdzOiB2YXJpb3VzCisgICAgICAgICIiIgorICAgICAgICBpZiBkYWVtb25pemU6CisgICAgICAgICAgICBzZWxmLl9fZGFlbW9uaXplKCoqYXJncykKKworICAgICAgICAjIFJlYWQgYW5kIHByb2Nlc3MgZXZlbnRzIGZvcmV2ZXIKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3NfZXZlbnRzKCkKKyAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgaXMgbm90IE5vbmUpIGFuZCAoY2FsbGJhY2soc2VsZikgaXMgVHJ1ZSk6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgcmVmX3RpbWUgPSB0aW1lLnRpbWUoKQorICAgICAgICAgICAgICAgICMgY2hlY2tfZXZlbnRzIGlzIGJsb2NraW5nCisgICAgICAgICAgICAgICAgaWYgc2VsZi5jaGVja19ldmVudHMoKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2xlZXAocmVmX3RpbWUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYucmVhZF9ldmVudHMoKQorICAgICAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgICAgICMgU3RvcCBtb25pdG9yaW5nIGlmIHNpZ2ludCBpcyBjYXVnaHQgKENvbnRyb2wtQykuCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCdQeWlub3RpZnkgc3RvcHMgbW9uaXRvcmluZy4nKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICMgQ2xvc2UgaW50ZXJuYWxzCisgICAgICAgIHNlbGYuc3RvcCgpCisKKyAgICBkZWYgc3RvcChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIENsb3NlIGlub3RpZnkncyBpbnN0YW5jZSAoY2xvc2UgaXRzIGZpbGUgZGVzY3JpcHRvcikuCisgICAgICAgIEl0IGRlc3Ryb3lzIGFsbCBleGlzdGluZyB3YXRjaGVzLCBwZW5kaW5nIGV2ZW50cywuLi4KKyAgICAgICAgVGhpcyBtZXRob2QgaXMgYXV0b21hdGljYWxseSBjYWxsZWQgYXQgdGhlIGVuZCBvZiBsb29wKCkuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9wb2xsb2JqLnVucmVnaXN0ZXIoc2VsZi5fZmQpCisgICAgICAgIG9zLmNsb3NlKHNlbGYuX2ZkKQorICAgICAgICBzZWxmLl9zeXNfcHJvY19mdW4gPSBOb25lCisKKworY2xhc3MgVGhyZWFkZWROb3RpZmllcih0aHJlYWRpbmcuVGhyZWFkLCBOb3RpZmllcik6CisgICAgIiIiCisgICAgVGhpcyBub3RpZmllciBpbmhlcml0cyBmcm9tIHRocmVhZGluZy5UaHJlYWQgZm9yIGluc3RhbmNpYXRpbmcgYSBzZXBhcmF0ZQorICAgIHRocmVhZCwgYW5kIGFsc28gaW5oZXJpdHMgZnJvbSBOb3RpZmllciwgYmVjYXVzZSBpdCBpcyBhIHRocmVhZGVkIG5vdGlmaWVyLgorCisgICAgTm90ZSB0aGF0IGV2ZXJ5IGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQgYnkgdGhpcyBjbGFzcyBpcyBhbHNvIHByb3ZpZGVkCisgICAgdGhyb3VnaCBOb3RpZmllciBjbGFzcy4gTW9yZW92ZXIgTm90aWZpZXIgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZmlyc3QgYmVjYXVzZQorICAgIGl0IGlzIG5vdCB0aHJlYWRlZCBhbmQgY291bGQgYmUgZWFzaWx5IGRhZW1vbml6ZWQuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHdhdGNoX21hbmFnZXIsIGRlZmF1bHRfcHJvY19mdW49Tm9uZSwgcmVhZF9mcmVxPTAsCisgICAgICAgICAgICAgICAgIHRocmVzaG9sZD0wLCB0aW1lb3V0PU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgSW5pdGlhbGl6YXRpb24sIGluaXRpYWxpemUgYmFzZSBjbGFzc2VzLiByZWFkX2ZyZXEsIHRocmVzaG9sZCBhbmQKKyAgICAgICAgdGltZW91dCBwYXJhbWV0ZXJzIGFyZSB1c2VkIHdoZW4gbG9vcGluZy4KKworICAgICAgICBAcGFyYW0gd2F0Y2hfbWFuYWdlcjogV2F0Y2ggTWFuYWdlci4KKyAgICAgICAgQHR5cGUgd2F0Y2hfbWFuYWdlcjogV2F0Y2hNYW5hZ2VyIGluc3RhbmNlCisgICAgICAgIEBwYXJhbSBkZWZhdWx0X3Byb2NfZnVuOiBEZWZhdWx0IHByb2Nlc3NpbmcgbWV0aG9kLiBTZWUgYmFzZSBjbGFzcy4KKyAgICAgICAgQHR5cGUgZGVmYXVsdF9wcm9jX2Z1bjogaW5zdGFuY2Ugb2YgUHJvY2Vzc0V2ZW50CisgICAgICAgIEBwYXJhbSByZWFkX2ZyZXE6IGlmIHJlYWRfZnJlcSA9PSAwLCBldmVudHMgYXJlIHJlYWQgYXNhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcmVhZF9mcmVxIGlzID4gMCwgdGhpcyB0aHJlYWQgc2xlZXBzCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1heCgwLCByZWFkX2ZyZXEgLSB0aW1lb3V0KSBzZWNvbmRzLgorICAgICAgICBAdHlwZSByZWFkX2ZyZXE6IGludAorICAgICAgICBAcGFyYW0gdGhyZXNob2xkOiBGaWxlIGRlc2NyaXB0b3Igd2lsbCBiZSByZWFkIG9ubHkgaWYgdGhlIGFjY3VtdWxhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgdG8gcmVhZCBiZWNvbWVzID49IHRocmVzaG9sZC4gSWYgIT0gMCwgeW91IGxpa2VseQorICAgICAgICAgICAgICAgICAgICAgICAgICB3YW50IHRvIHVzZSBpdCBpbiBjb21iaW5hdGlvbiB3aXRoIGFuIGFwcHJvcHJpYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIHNldCBmb3IgcmVhZF9mcmVxIGJlY2F1c2Ugd2l0aG91dCB0aGF0IHlvdSB3b3VsZAorICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVwIGxvb3Bpbmcgd2l0aG91dCByZWFsbHkgcmVhZGluZyBhbnl0aGluZyBhbmQgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnRpbCB0aGUgYW1vdW50IG9mIGV2ZW50cyB0byByZWFkIGlzID49IHRocmVzaG9sZC4gQXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGVhc3Qgd2l0aCByZWFkX2ZyZXEgeW91IG1pZ2h0IHNsZWVwLgorICAgICAgICBAdHlwZSB0aHJlc2hvbGQ6IGludAorICAgICAgICBAcGFyYW0gdGltZW91dDoKKyAgICAgICAgICAgIGh0dHBzOi8vZG9jcy5weXRob24ub3JnLzMvbGlicmFyeS9zZWxlY3QuaHRtbCNwb2xsaW5nLW9iamVjdHMKKyAgICAgICAgQHR5cGUgdGltZW91dDogaW50CisgICAgICAgICIiIgorICAgICAgICAjIEluaXQgdGhyZWFkaW5nIGJhc2UgY2xhc3MKKyAgICAgICAgdGhyZWFkaW5nLlRocmVhZC5fX2luaXRfXyhzZWxmKQorICAgICAgICAjIFN0b3AgY29uZGl0aW9uCisgICAgICAgIHNlbGYuX3N0b3BfZXZlbnQgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICAjIEluaXQgTm90aWZpZXIgYmFzZSBjbGFzcworICAgICAgICBOb3RpZmllci5fX2luaXRfXyhzZWxmLCB3YXRjaF9tYW5hZ2VyLCBkZWZhdWx0X3Byb2NfZnVuLCByZWFkX2ZyZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZCwgdGltZW91dCkKKyAgICAgICAgIyBDcmVhdGUgYSBuZXcgcGlwZSB1c2VkIGZvciB0aHJlYWQgdGVybWluYXRpb24KKyAgICAgICAgc2VsZi5fcGlwZSA9IG9zLnBpcGUoKQorICAgICAgICBzZWxmLl9wb2xsb2JqLnJlZ2lzdGVyKHNlbGYuX3BpcGVbMF0sIHNlbGVjdC5QT0xMSU4pCisKKyAgICBkZWYgc3RvcChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFN0b3Agbm90aWZpZXIncyBsb29wLiBTdG9wIG5vdGlmaWNhdGlvbi4gSm9pbiB0aGUgdGhyZWFkLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fc3RvcF9ldmVudC5zZXQoKQorICAgICAgICBvcy53cml0ZShzZWxmLl9waXBlWzFdLCAnc3RvcCcpCisgICAgICAgIHRocmVhZGluZy5UaHJlYWQuam9pbihzZWxmKQorICAgICAgICBOb3RpZmllci5zdG9wKHNlbGYpCisgICAgICAgIHNlbGYuX3BvbGxvYmoudW5yZWdpc3RlcihzZWxmLl9waXBlWzBdKQorICAgICAgICBvcy5jbG9zZShzZWxmLl9waXBlWzBdKQorICAgICAgICBvcy5jbG9zZShzZWxmLl9waXBlWzFdKQorCisgICAgZGVmIGxvb3Aoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBUaHJlYWQncyBtYWluIGxvb3AuIERvbid0IG1lYW50IHRvIGJlIGNhbGxlZCBieSB1c2VyIGRpcmVjdGx5LgorICAgICAgICBDYWxsIGluaGVyaXRlZCBzdGFydCgpIG1ldGhvZCBpbnN0ZWFkLgorCisgICAgICAgIEV2ZW50cyBhcmUgcmVhZCBvbmx5IG9uY2UgdGltZSBldmVyeSBtaW4ocmVhZF9mcmVxLCB0aW1lb3V0KQorICAgICAgICBzZWNvbmRzIGF0IGJlc3QgYW5kIG9ubHkgaWYgdGhlIHNpemUgb2YgZXZlbnRzIHRvIHJlYWQgaXMgPj0gdGhyZXNob2xkLgorICAgICAgICAiIiIKKyAgICAgICAgIyBXaGVuIHRoZSBsb29wIG11c3QgYmUgdGVybWluYXRlZCAuc3RvcCgpIGlzIGNhbGxlZCwgJ3N0b3AnCisgICAgICAgICMgaXMgd3JpdHRlbiB0byBwaXBlIGZkIHNvIHBvbGwoKSByZXR1cm5zIGFuZCAuY2hlY2tfZXZlbnRzKCkKKyAgICAgICAgIyByZXR1cm5zIEZhbHNlIHdoaWNoIG1ha2UgZXZhbHVhdGUgdGhlIFdoaWxlJ3Mgc3RvcCBjb25kaXRpb24KKyAgICAgICAgIyAuX3N0b3BfZXZlbnQuaXNTZXQoKSB3aWNoIHB1dCBhbiBlbmQgdG8gdGhlIHRocmVhZCdzIGV4ZWN1dGlvbi4KKyAgICAgICAgd2hpbGUgbm90IHNlbGYuX3N0b3BfZXZlbnQuaXNTZXQoKToKKyAgICAgICAgICAgIHNlbGYucHJvY2Vzc19ldmVudHMoKQorICAgICAgICAgICAgcmVmX3RpbWUgPSB0aW1lLnRpbWUoKQorICAgICAgICAgICAgaWYgc2VsZi5jaGVja19ldmVudHMoKToKKyAgICAgICAgICAgICAgICBzZWxmLl9zbGVlcChyZWZfdGltZSkKKyAgICAgICAgICAgICAgICBzZWxmLnJlYWRfZXZlbnRzKCkKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBTdGFydCB0aHJlYWQncyBsb29wOiByZWFkIGFuZCBwcm9jZXNzIGV2ZW50cyB1bnRpbCB0aGUgbWV0aG9kCisgICAgICAgIHN0b3AoKSBpcyBjYWxsZWQuCisgICAgICAgIE5ldmVyIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHksIGluc3RlYWQgY2FsbCB0aGUgc3RhcnQoKSBtZXRob2QKKyAgICAgICAgaW5oZXJpdGVkIGZyb20gdGhyZWFkaW5nLlRocmVhZCwgd2hpY2ggdGhlbiB3aWxsIGNhbGwgcnVuKCkgaW4KKyAgICAgICAgaXRzIHR1cm4uCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmxvb3AoKQorCisKK2NsYXNzIEFzeW5jTm90aWZpZXIoYXN5bmNvcmUuZmlsZV9kaXNwYXRjaGVyLCBOb3RpZmllcik6CisgICAgIiIiCisgICAgVGhpcyBub3RpZmllciBpbmhlcml0cyBmcm9tIGFzeW5jb3JlLmZpbGVfZGlzcGF0Y2hlciBpbiBvcmRlciB0byBiZSBhYmxlIHRvCisgICAgdXNlIHB5aW5vdGlmeSBhbG9uZyB3aXRoIHRoZSBhc3luY29yZSBmcmFtZXdvcmsuCisKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgd2F0Y2hfbWFuYWdlciwgZGVmYXVsdF9wcm9jX2Z1bj1Ob25lLCByZWFkX2ZyZXE9MCwKKyAgICAgICAgICAgICAgICAgdGhyZXNob2xkPTAsIHRpbWVvdXQ9Tm9uZSwgY2hhbm5lbF9tYXA9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBJbml0aWFsaXplcyB0aGUgYXN5bmMgbm90aWZpZXIuIFRoZSBvbmx5IGFkZGl0aW9uYWwgcGFyYW1ldGVyIGlzCisgICAgICAgICdjaGFubmVsX21hcCcgd2hpY2ggaXMgdGhlIG9wdGlvbmFsIGFzeW5jb3JlIHByaXZhdGUgbWFwLiBTZWUKKyAgICAgICAgTm90aWZpZXIgY2xhc3MgZm9yIHRoZSBtZWFuaW5nIG9mIHRoZSBvdGhlcnMgcGFyYW1ldGVycy4KKworICAgICAgICAiIiIKKyAgICAgICAgTm90aWZpZXIuX19pbml0X18oc2VsZiwgd2F0Y2hfbWFuYWdlciwgZGVmYXVsdF9wcm9jX2Z1biwgcmVhZF9mcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2hvbGQsIHRpbWVvdXQpCisgICAgICAgIGFzeW5jb3JlLmZpbGVfZGlzcGF0Y2hlci5fX2luaXRfXyhzZWxmLCBzZWxmLl9mZCwgY2hhbm5lbF9tYXApCisKKyAgICBkZWYgaGFuZGxlX3JlYWQoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBXaGVuIGFzeW5jb3JlIHRlbGxzIHVzIHdlIGNhbiByZWFkIGZyb20gdGhlIGZkLCB3ZSBwcm9jZWVkIHByb2Nlc3NpbmcKKyAgICAgICAgZXZlbnRzLiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBmb3IgaGFuZGxpbmcgYSBub3RpZmljYXRpb24KKyAgICAgICAgZGlmZmVyZW50bHkuCisKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYucmVhZF9ldmVudHMoKQorICAgICAgICBzZWxmLnByb2Nlc3NfZXZlbnRzKCkKKworCitjbGFzcyBUb3JuYWRvQXN5bmNOb3RpZmllcihOb3RpZmllcik6CisgICAgIiIiCisgICAgVG9ybmFkbyBpb2xvb3AgYWRhcHRlci4KKworICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3YXRjaF9tYW5hZ2VyLCBpb2xvb3AsIGNhbGxiYWNrPU5vbmUsCisgICAgICAgICAgICAgICAgIGRlZmF1bHRfcHJvY19mdW49Tm9uZSwgcmVhZF9mcmVxPTAsIHRocmVzaG9sZD0wLCB0aW1lb3V0PU5vbmUsCisgICAgICAgICAgICAgICAgIGNoYW5uZWxfbWFwPU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgTm90ZSB0aGF0IGlmIGxhdGVyIHlvdSBtdXN0IGNhbGwgaW9sb29wLmNsb3NlKCkgYmUgc3VyZSB0byBsZXQgdGhlCisgICAgICAgIGRlZmF1bHQgcGFyYW1ldGVyIHRvIGFsbF9mZHM9RmFsc2UuCisKKyAgICAgICAgU2VlIGV4YW1wbGUgdG9ybmFkb19ub3RpZmllci5weSBmb3IgYW4gZXhhbXBsZSB1c2luZyB0aGlzIG5vdGlmaWVyLgorCisgICAgICAgIEBwYXJhbSBpb2xvb3A6IFRvcm5hZG8ncyBJTyBsb29wLgorICAgICAgICBAdHlwZSBpb2xvb3A6IHRvcm5hZG8uaW9sb29wLklPTG9vcCBpbnN0YW5jZS4KKyAgICAgICAgQHBhcmFtIGNhbGxiYWNrOiBGdW5jdG9yIGNhbGxlZCBhdCB0aGUgZW5kIG9mIGVhY2ggY2FsbCB0byBoYW5kbGVfcmVhZAorICAgICAgICAgICAgICAgICAgICAgICAgIChJT0xvb3AncyByZWFkIGhhbmRsZXIpLiBFeHBlY3RzIHRvIHJlY2VpdmUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpZXIgb2JqZWN0IChzZWxmKSBhcyBzaW5nbGUgcGFyYW1ldGVyLgorICAgICAgICBAdHlwZSBjYWxsYmFjazogY2FsbGFibGUgb2JqZWN0IG9yIGZ1bmN0aW9uCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmlvX2xvb3AgPSBpb2xvb3AKKyAgICAgICAgc2VsZi5oYW5kbGVfcmVhZF9jYWxsYmFjayA9IGNhbGxiYWNrCisgICAgICAgIE5vdGlmaWVyLl9faW5pdF9fKHNlbGYsIHdhdGNoX21hbmFnZXIsIGRlZmF1bHRfcHJvY19mdW4sIHJlYWRfZnJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkLCB0aW1lb3V0KQorICAgICAgICBpb2xvb3AuYWRkX2hhbmRsZXIoc2VsZi5fZmQsIHNlbGYuaGFuZGxlX3JlYWQsIGlvbG9vcC5SRUFEKQorCisgICAgZGVmIHN0b3Aoc2VsZik6CisgICAgICAgIHNlbGYuaW9fbG9vcC5yZW1vdmVfaGFuZGxlcihzZWxmLl9mZCkKKyAgICAgICAgTm90aWZpZXIuc3RvcChzZWxmKQorCisgICAgZGVmIGhhbmRsZV9yZWFkKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICIiIgorICAgICAgICBTZWUgY29tbWVudCBpbiBBc3luY05vdGlmaWVyLgorCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnJlYWRfZXZlbnRzKCkKKyAgICAgICAgc2VsZi5wcm9jZXNzX2V2ZW50cygpCisgICAgICAgIGlmIHNlbGYuaGFuZGxlX3JlYWRfY2FsbGJhY2sgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmhhbmRsZV9yZWFkX2NhbGxiYWNrKHNlbGYpCisKKworY2xhc3MgQXN5bmNpb05vdGlmaWVyKE5vdGlmaWVyKToKKyAgICAiIiIKKworICAgIGFzeW5jaW8vdHJvbGxpdXMgZXZlbnQgbG9vcCBhZGFwdGVyLgorCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHdhdGNoX21hbmFnZXIsIGxvb3AsIGNhbGxiYWNrPU5vbmUsCisgICAgICAgICAgICAgICAgIGRlZmF1bHRfcHJvY19mdW49Tm9uZSwgcmVhZF9mcmVxPTAsIHRocmVzaG9sZD0wLCB0aW1lb3V0PU5vbmUpOgorICAgICAgICAiIiIKKworICAgICAgICBTZWUgZXhhbXBsZXMvYXN5bmNpb19ub3RpZmllci5weSBmb3IgYW4gZXhhbXBsZSB1c2FnZS4KKworICAgICAgICBAcGFyYW0gbG9vcDogYXN5bmNpbyBvciB0cm9sbGl1cyBldmVudCBsb29wIGluc3RhbmNlLgorICAgICAgICBAdHlwZSBsb29wOiBhc3luY2lvLkJhc2VFdmVudExvb3Agb3IgdHJvbGxpdXMuQmFzZUV2ZW50TG9vcCBpbnN0YW5jZS4KKyAgICAgICAgQHBhcmFtIGNhbGxiYWNrOiBGdW5jdG9yIGNhbGxlZCBhdCB0aGUgZW5kIG9mIGVhY2ggY2FsbCB0byBoYW5kbGVfcmVhZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICBFeHBlY3RzIHRvIHJlY2VpdmUgdGhlIG5vdGlmaWVyIG9iamVjdCAoc2VsZikgYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGUgcGFyYW1ldGVyLgorICAgICAgICBAdHlwZSBjYWxsYmFjazogY2FsbGFibGUgb2JqZWN0IG9yIGZ1bmN0aW9uCisKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYubG9vcCA9IGxvb3AKKyAgICAgICAgc2VsZi5oYW5kbGVfcmVhZF9jYWxsYmFjayA9IGNhbGxiYWNrCisgICAgICAgIE5vdGlmaWVyLl9faW5pdF9fKHNlbGYsIHdhdGNoX21hbmFnZXIsIGRlZmF1bHRfcHJvY19mdW4sIHJlYWRfZnJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkLCB0aW1lb3V0KQorICAgICAgICBsb29wLmFkZF9yZWFkZXIoc2VsZi5fZmQsIHNlbGYuaGFuZGxlX3JlYWQpCisKKyAgICBkZWYgc3RvcChzZWxmKToKKyAgICAgICAgc2VsZi5sb29wLnJlbW92ZV9yZWFkZXIoc2VsZi5fZmQpCisgICAgICAgIE5vdGlmaWVyLnN0b3Aoc2VsZikKKworICAgIGRlZiBoYW5kbGVfcmVhZChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBzZWxmLnJlYWRfZXZlbnRzKCkKKyAgICAgICAgc2VsZi5wcm9jZXNzX2V2ZW50cygpCisgICAgICAgIGlmIHNlbGYuaGFuZGxlX3JlYWRfY2FsbGJhY2sgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmhhbmRsZV9yZWFkX2NhbGxiYWNrKHNlbGYpCisKKworY2xhc3MgV2F0Y2g6CisgICAgIiIiCisgICAgUmVwcmVzZW50IGEgd2F0Y2gsIGkuZS4gYSBmaWxlIG9yIGRpcmVjdG9yeSBiZWluZyB3YXRjaGVkLgorCisgICAgIiIiCisgICAgX19zbG90c19fID0gKCd3ZCcsICdwYXRoJywgJ21hc2snLCAncHJvY19mdW4nLCAnYXV0b19hZGQnLAorICAgICAgICAgICAgICAgICAnZXhjbHVkZV9maWx0ZXInLCAnZGlyJykKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3ZCwgcGF0aCwgbWFzaywgcHJvY19mdW4sIGF1dG9fYWRkLCBleGNsdWRlX2ZpbHRlcik6CisgICAgICAgICIiIgorICAgICAgICBJbml0aWFsaXphdGlvbnMuCisKKyAgICAgICAgQHBhcmFtIHdkOiBXYXRjaCBkZXNjcmlwdG9yLgorICAgICAgICBAdHlwZSB3ZDogaW50CisgICAgICAgIEBwYXJhbSBwYXRoOiBQYXRoIG9mIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSBiZWluZyB3YXRjaGVkLgorICAgICAgICBAdHlwZSBwYXRoOiBzdHIKKyAgICAgICAgQHBhcmFtIG1hc2s6IE1hc2suCisgICAgICAgIEB0eXBlIG1hc2s6IGludAorICAgICAgICBAcGFyYW0gcHJvY19mdW46IFByb2Nlc3NpbmcgY2FsbGFibGUgb2JqZWN0LgorICAgICAgICBAdHlwZSBwcm9jX2Z1bjoKKyAgICAgICAgQHBhcmFtIGF1dG9fYWRkOiBBdXRvbWF0aWNhbGx5IGFkZCB3YXRjaGVzIG9uIG5ldyBkaXJlY3Rvcmllcy4KKyAgICAgICAgQHR5cGUgYXV0b19hZGQ6IGJvb2wKKyAgICAgICAgQHBhcmFtIGV4Y2x1ZGVfZmlsdGVyOiBCb29sZWFuIGZ1bmN0aW9uLCB1c2VkIHRvIGV4Y2x1ZGUgbmV3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3JpZXMgZnJvbSBiZWluZyBhdXRvbWF0aWNhbGx5IHdhdGNoZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIFdhdGNoTWFuYWdlci5fX2luaXRfXworICAgICAgICBAdHlwZSBleGNsdWRlX2ZpbHRlcjogY2FsbGFibGUgb2JqZWN0CisgICAgICAgICIiIgorICAgICAgICBzZWxmLndkID0gd2QKKyAgICAgICAgc2VsZi5wYXRoID0gcGF0aAorICAgICAgICBzZWxmLm1hc2sgPSBtYXNrCisgICAgICAgIHNlbGYucHJvY19mdW4gPSBwcm9jX2Z1bgorICAgICAgICBzZWxmLmF1dG9fYWRkID0gYXV0b19hZGQKKyAgICAgICAgc2VsZi5leGNsdWRlX2ZpbHRlciA9IGV4Y2x1ZGVfZmlsdGVyCisgICAgICAgIHNlbGYuZGlyID0gb3MucGF0aC5pc2RpcihzZWxmLnBhdGgpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBAcmV0dXJuOiBTdHJpbmcgcmVwcmVzZW50YXRpb24uCisgICAgICAgIEBydHlwZTogc3RyCisgICAgICAgICIiIgorICAgICAgICBzID0gJyAnLmpvaW4oWyclcyVzJXMnICUgKG91dHB1dF9mb3JtYXQuZmllbGRfbmFtZShhdHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZm9ybWF0LnB1bmN0dWF0aW9uKCc9JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2Zvcm1hdC5maWVsZF92YWx1ZShnZXRhdHRyKHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIpKSkgXAorICAgICAgICAgICAgICAgICAgICAgIGZvciBhdHRyIGluIHNlbGYuX19zbG90c19fIGlmIG5vdCBhdHRyLnN0YXJ0c3dpdGgoJ18nKV0pCisKKyAgICAgICAgcyA9ICclcyVzICVzICVzJyAlIChvdXRwdXRfZm9ybWF0LnB1bmN0dWF0aW9uKCc8JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2Zvcm1hdC5jbGFzc19uYW1lKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9mb3JtYXQucHVuY3R1YXRpb24oJz4nKSkKKyAgICAgICAgcmV0dXJuIHMKKworCitjbGFzcyBFeGNsdWRlRmlsdGVyOgorICAgICIiIgorICAgIEV4Y2x1ZGVGaWx0ZXIgaXMgYW4gZXhjbHVzaW9uIGZpbHRlci4KKworICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhcmdfbHN0KToKKyAgICAgICAgIiIiCisgICAgICAgIEV4YW1wbGVzOgorICAgICAgICAgIGVmMSA9IEV4Y2x1ZGVGaWx0ZXIoWyIvZXRjL3JjLioiLCAiL2V0Yy9ob3N0bmFtZSJdKQorICAgICAgICAgIGVmMiA9IEV4Y2x1ZGVGaWx0ZXIoIi9teS9wYXRoL2V4Y2x1ZGUubHN0IikKKyAgICAgICAgICBXaGVyZSBleGNsdWRlLmxzdCBjb250YWluczoKKyAgICAgICAgICAvZXRjL3JjLioKKyAgICAgICAgICAvZXRjL2hvc3RuYW1lCisKKyAgICAgICAgTm90ZTogaXQgaXMgbm90IHBvc3NpYmxlIHRvIGV4Y2x1ZGUgYSBmaWxlIGlmIGl0cyBlbmNhcHN1bGF0aW5nCisgICAgICAgICAgICAgIGRpcmVjdG9yeSBpcyBpdHNlbGYgd2F0Y2hlZC4gU2VlIHRoaXMgaXNzdWUgZm9yIG1vcmUgZGV0YWlscworICAgICAgICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vc2ViLW0vcHlpbm90aWZ5L2lzc3Vlcy8zMQorCisgICAgICAgIEBwYXJhbSBhcmdfbHN0OiBpcyBlaXRoZXIgYSBsaXN0IG9mIHBhdHRlcm5zIG9yIGEgZmlsZW5hbWUgZnJvbSB3aGljaAorICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybnMgd2lsbCBiZSBsb2FkZWQuCisgICAgICAgIEB0eXBlIGFyZ19sc3Q6IGxpc3Qgb2Ygc3RyIG9yIHN0cgorICAgICAgICAiIiIKKyAgICAgICAgaWYgaXNpbnN0YW5jZShhcmdfbHN0LCBzdHIpOgorICAgICAgICAgICAgbHN0ID0gc2VsZi5fbG9hZF9wYXR0ZXJuc19mcm9tX2ZpbGUoYXJnX2xzdCkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGFyZ19sc3QsIGxpc3QpOgorICAgICAgICAgICAgbHN0ID0gYXJnX2xzdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yCisKKyAgICAgICAgc2VsZi5fbHJlZ2V4ID0gW10KKyAgICAgICAgZm9yIHJlZ2V4IGluIGxzdDoKKyAgICAgICAgICAgIHNlbGYuX2xyZWdleC5hcHBlbmQocmUuY29tcGlsZShyZWdleCwgcmUuVU5JQ09ERSkpCisKKyAgICBkZWYgX2xvYWRfcGF0dGVybnNfZnJvbV9maWxlKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgbHN0ID0gW10KKyAgICAgICAgZmlsZV9vYmogPSBmaWxlKGZpbGVuYW1lLCAncicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBsaW5lIGluIGZpbGVfb2JqLnJlYWRsaW5lcygpOgorICAgICAgICAgICAgICAgICMgVHJpbSBsZWFkaW5nIGFuIHRyYWlsaW5nIHdoaXRlc3BhY2VzCisgICAgICAgICAgICAgICAgcGF0dGVybiA9IGxpbmUuc3RyaXAoKQorICAgICAgICAgICAgICAgIGlmIG5vdCBwYXR0ZXJuIG9yIHBhdHRlcm4uc3RhcnRzd2l0aCgnIycpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGxzdC5hcHBlbmQocGF0dGVybikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZpbGVfb2JqLmNsb3NlKCkKKyAgICAgICAgcmV0dXJuIGxzdAorCisgICAgZGVmIF9tYXRjaChzZWxmLCByZWdleCwgcGF0aCk6CisgICAgICAgIHJldHVybiByZWdleC5tYXRjaChwYXRoKSBpcyBub3QgTm9uZQorCisgICAgZGVmIF9fY2FsbF9fKHNlbGYsIHBhdGgpOgorICAgICAgICAiIiIKKyAgICAgICAgQHBhcmFtIHBhdGg6IFBhdGggdG8gbWF0Y2ggYWdhaW5zdCBwcm92aWRlZCByZWdleHBzLgorICAgICAgICBAdHlwZSBwYXRoOiBzdHIKKyAgICAgICAgQHJldHVybjogUmV0dXJuIFRydWUgaWYgcGF0aCBoYXMgYmVlbiBtYXRjaGVkIGFuZCBzaG91bGQKKyAgICAgICAgICAgICAgICAgYmUgZXhjbHVkZWQsIEZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgQHJ0eXBlOiBib29sCisgICAgICAgICIiIgorICAgICAgICBmb3IgcmVnZXggaW4gc2VsZi5fbHJlZ2V4OgorICAgICAgICAgICAgaWYgc2VsZi5fbWF0Y2gocmVnZXgsIHBhdGgpOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorCisKK2NsYXNzIFdhdGNoTWFuYWdlckVycm9yKEV4Y2VwdGlvbik6CisgICAgIiIiCisgICAgV2F0Y2hNYW5hZ2VyIEV4Y2VwdGlvbi4gUmFpc2VkIG9uIGVycm9yIGVuY291bnRlcmVkIG9uIHdhdGNoZXMKKyAgICBvcGVyYXRpb25zLgorCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1zZywgd21kKToKKyAgICAgICAgIiIiCisgICAgICAgIEBwYXJhbSBtc2c6IEV4Y2VwdGlvbiBzdHJpbmcncyBkZXNjcmlwdGlvbi4KKyAgICAgICAgQHR5cGUgbXNnOiBzdHJpbmcKKyAgICAgICAgQHBhcmFtIHdtZDogVGhpcyBkaWN0aW9uYXJ5IGNvbnRhaW5zIHRoZSB3ZCBhc3NpZ25lZCB0byBwYXRocyBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgc2FtZSBjYWxsIGZvciB3aGljaCB3YXRjaGVzIHdlcmUgc3VjY2Vzc2Z1bGx5IGFkZGVkLgorICAgICAgICBAdHlwZSB3bWQ6IGRpY3QKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYud21kID0gd21kCisgICAgICAgIEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBtc2cpCisKKworY2xhc3MgV2F0Y2hNYW5hZ2VyOgorICAgICIiIgorICAgIFByb3ZpZGUgb3BlcmF0aW9ucyBmb3Igd2F0Y2hpbmcgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLiBJdHMgaW50ZXJuYWwKKyAgICBkaWN0aW9uYXJ5IGlzIHVzZWQgdG8gcmVmZXJlbmNlIHdhdGNoZWQgaXRlbXMuIFdoZW4gdXNlZCBpbnNpZGUKKyAgICB0aHJlYWRlZCBjb2RlLCBvbmUgbXVzdCBpbnN0YW5jaWF0ZSBhcyBtYW55IFdhdGNoTWFuYWdlciBpbnN0YW5jZXMgYXMKKyAgICB0aGVyZSBhcmUgVGhyZWFkZWROb3RpZmllciBpbnN0YW5jZXMuCisKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXhjbHVkZV9maWx0ZXI9bGFtYmRhIHBhdGg6IEZhbHNlKToKKyAgICAgICAgIiIiCisgICAgICAgIEluaXRpYWxpemF0aW9uOiBpbml0IGlub3RpZnksIGluaXQgd2F0Y2ggbWFuYWdlciBkaWN0aW9uYXJ5LgorICAgICAgICBSYWlzZSBPU0Vycm9yIGlmIGluaXRpYWxpemF0aW9uIGZhaWxzLCByYWlzZSBJbm90aWZ5QmluZGluZ05vdEZvdW5kRXJyb3IKKyAgICAgICAgaWYgbm8gaW5vdGlmeSBiaW5kaW5nIHdhcyBmb3VuZCAodGhyb3VnaCBjdHlwZXMgb3IgZnJvbSBkaXJlY3QgYWNjZXNzIHRvCisgICAgICAgIHN5c2NhbGxzKS4KKworICAgICAgICBAcGFyYW0gZXhjbHVkZV9maWx0ZXI6IGJvb2xlYW4gZnVuY3Rpb24sIHJldHVybnMgVHJ1ZSBpZiBjdXJyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCBtdXN0IGJlIGV4Y2x1ZGVkIGZyb20gYmVpbmcgd2F0Y2hlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZW5pZW50IGZvciBwcm92aWRpbmcgYSBjb21tb24gZXhjbHVzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyIGZvciBldmVyeSBjYWxsIHRvIGFkZF93YXRjaC4KKyAgICAgICAgQHR5cGUgZXhjbHVkZV9maWx0ZXI6IGNhbGxhYmxlIG9iamVjdAorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5faWdub3JlX2V2ZW50cyA9IEZhbHNlCisgICAgICAgIHNlbGYuX2V4Y2x1ZGVfZmlsdGVyID0gZXhjbHVkZV9maWx0ZXIKKyAgICAgICAgc2VsZi5fd21kID0ge30gICMgd2F0Y2ggZGljdCBrZXk6IHdhdGNoIGRlc2NyaXB0b3IsIHZhbHVlOiB3YXRjaAorCisgICAgICAgIHNlbGYuX2lub3RpZnlfd3JhcHBlciA9IElOb3RpZnlXcmFwcGVyLmNyZWF0ZSgpCisgICAgICAgIGlmIHNlbGYuX2lub3RpZnlfd3JhcHBlciBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgSW5vdGlmeUJpbmRpbmdOb3RGb3VuZEVycm9yKCkKKworICAgICAgICBzZWxmLl9mZCA9IHNlbGYuX2lub3RpZnlfd3JhcHBlci5pbm90aWZ5X2luaXQoKSAjIGZpbGUgZGVzY3JpcHRvcgorICAgICAgICBpZiBzZWxmLl9mZCA8IDA6CisgICAgICAgICAgICBlcnIgPSAnQ2Fubm90IGluaXRpYWxpemUgbmV3IGluc3RhbmNlIG9mIGlub3RpZnksICVzJworICAgICAgICAgICAgcmFpc2UgT1NFcnJvcihlcnIgJSBzZWxmLl9pbm90aWZ5X3dyYXBwZXIuc3RyX2Vycm5vKCkpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBDbG9zZSBpbm90aWZ5J3MgZmlsZSBkZXNjcmlwdG9yLCB0aGlzIGFjdGlvbiB3aWxsIGFsc28gYXV0b21hdGljYWxseQorICAgICAgICByZW1vdmUgKGkuZS4gc3RvcCB3YXRjaGluZykgYWxsIGl0cyBhc3NvY2lhdGVkIHdhdGNoIGRlc2NyaXB0b3JzLgorICAgICAgICBBZnRlciBhIGNhbGwgdG8gdGhpcyBtZXRob2QgdGhlIFdhdGNoTWFuYWdlcidzIGluc3RhbmNlIGJlY29tZSB1c2VsZXNzCisgICAgICAgIGFuZCBjYW5ub3QgYmUgcmV1c2VkLCBhIG5ldyBpbnN0YW5jZSBtdXN0IHRoZW4gYmUgaW5zdGFuY2lhdGVkLiBJdAorICAgICAgICBtYWtlcyBzZW5zZSB0byBjYWxsIHRoaXMgbWV0aG9kIGluIGZldyBzaXR1YXRpb25zIGZvciBpbnN0YW5jZSBpZgorICAgICAgICBzZXZlcmFsIGluZGVwZW5kYW50IFdhdGNoTWFuYWdlciBtdXN0IGJlIGluc3RhbmNpYXRlZCBvciBpZiBhbGwgd2F0Y2hlcworICAgICAgICBtdXN0IGJlIHJlbW92ZWQgYW5kIG5vIG90aGVyIHdhdGNoZXMgbmVlZCB0byBiZSBhZGRlZC4KKyAgICAgICAgIiIiCisgICAgICAgIG9zLmNsb3NlKHNlbGYuX2ZkKQorCisgICAgZGVmIGdldF9mZChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhc3NpZ25lZCBpbm90aWZ5J3MgZmlsZSBkZXNjcmlwdG9yLgorCisgICAgICAgIEByZXR1cm46IEZpbGUgZGVzY3JpcHRvci4KKyAgICAgICAgQHJ0eXBlOiBpbnQKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9mZAorCisgICAgZGVmIGdldF93YXRjaChzZWxmLCB3ZCk6CisgICAgICAgICIiIgorICAgICAgICBHZXQgd2F0Y2ggZnJvbSBwcm92aWRlZCB3YXRjaCBkZXNjcmlwdG9yIHdkLgorCisgICAgICAgIEBwYXJhbSB3ZDogV2F0Y2ggZGVzY3JpcHRvci4KKyAgICAgICAgQHR5cGUgd2Q6IGludAorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3dtZC5nZXQod2QpCisKKyAgICBkZWYgZGVsX3dhdGNoKHNlbGYsIHdkKToKKyAgICAgICAgIiIiCisgICAgICAgIFJlbW92ZSB3YXRjaCBlbnRyeSBhc3NvY2lhdGVkIHRvIHdhdGNoIGRlc2NyaXB0b3Igd2QuCisKKyAgICAgICAgQHBhcmFtIHdkOiBXYXRjaCBkZXNjcmlwdG9yLgorICAgICAgICBAdHlwZSB3ZDogaW50CisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBkZWwgc2VsZi5fd21kW3dkXQorICAgICAgICBleGNlcHQgS2V5RXJyb3IsIGVycjoKKyAgICAgICAgICAgIGxvZy5lcnJvcignQ2Fubm90IGRlbGV0ZSB1bmtub3duIHdhdGNoIGRlc2NyaXB0b3IgJXMnICUgc3RyKGVycikpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgd2F0Y2hlcyhzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIEdldCBhIHJlZmVyZW5jZSBvbiB0aGUgaW50ZXJuYWwgd2F0Y2ggbWFuYWdlciBkaWN0aW9uYXJ5LgorCisgICAgICAgIEByZXR1cm46IEludGVybmFsIHdhdGNoIG1hbmFnZXIgZGljdGlvbmFyeS4KKyAgICAgICAgQHJ0eXBlOiBkaWN0CisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5fd21kCisKKyAgICBkZWYgX19mb3JtYXRfcGF0aChzZWxmLCBwYXRoKToKKyAgICAgICAgIiIiCisgICAgICAgIEZvcm1hdCBwYXRoIHRvIGl0cyBpbnRlcm5hbCAoc3RvcmVkIGluIHdhdGNoIG1hbmFnZXIpIHJlcHJlc2VudGF0aW9uLgorICAgICAgICAiIiIKKyAgICAgICAgIyBVbmljb2RlIHN0cmluZ3MgYXJlIGNvbnZlcnRlZCBiYWNrIHRvIHN0cmluZ3MsIGJlY2F1c2UgaXQgc2VlbXMKKyAgICAgICAgIyB0aGF0IGlub3RpZnlfYWRkX3dhdGNoIGZyb20gY3R5cGVzIGRvZXMgbm90IHdvcmsgd2VsbCB3aGVuCisgICAgICAgICMgaXQgcmVjZWl2ZXMgYW4gY3R5cGVzLmNyZWF0ZV91bmljb2RlX2J1ZmZlciBpbnN0YW5jZSBhcyBhcmd1bWVudC4KKyAgICAgICAgIyBUaGVyZWZvcmUgZXZlbiB3ZCBhcmUgaW5kZXhlZCB3aXRoIGJ5dGVzIHN0cmluZyBhbmQgbm90IHdpdGgKKyAgICAgICAgIyB1bmljb2RlIHBhdGhzLgorICAgICAgICBpZiBpc2luc3RhbmNlKHBhdGgsIHVuaWNvZGUpOgorICAgICAgICAgICAgcGF0aCA9IHBhdGguZW5jb2RlKHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSkKKyAgICAgICAgcmV0dXJuIG9zLnBhdGgubm9ybXBhdGgocGF0aCkKKworICAgIGRlZiBfX2FkZF93YXRjaChzZWxmLCBwYXRoLCBtYXNrLCBwcm9jX2Z1biwgYXV0b19hZGQsIGV4Y2x1ZGVfZmlsdGVyKToKKyAgICAgICAgIiIiCisgICAgICAgIEFkZCBhIHdhdGNoIG9uIHBhdGgsIGJ1aWxkIGEgV2F0Y2ggb2JqZWN0IGFuZCBpbnNlcnQgaXQgaW4gdGhlCisgICAgICAgIHdhdGNoIG1hbmFnZXIgZGljdGlvbmFyeS4gUmV0dXJuIHRoZSB3ZCB2YWx1ZS4KKyAgICAgICAgIiIiCisgICAgICAgIHBhdGggPSBzZWxmLl9fZm9ybWF0X3BhdGgocGF0aCkKKyAgICAgICAgaWYgYXV0b19hZGQgYW5kIG5vdCBtYXNrICYgSU5fQ1JFQVRFOgorICAgICAgICAgICAgbWFzayB8PSBJTl9DUkVBVEUKKyAgICAgICAgd2QgPSBzZWxmLl9pbm90aWZ5X3dyYXBwZXIuaW5vdGlmeV9hZGRfd2F0Y2goc2VsZi5fZmQsIHBhdGgsIG1hc2spCisgICAgICAgIGlmIHdkIDwgMDoKKyAgICAgICAgICAgIHJldHVybiB3ZAorICAgICAgICB3YXRjaCA9IFdhdGNoKHdkPXdkLCBwYXRoPXBhdGgsIG1hc2s9bWFzaywgcHJvY19mdW49cHJvY19mdW4sCisgICAgICAgICAgICAgICAgICAgICAgYXV0b19hZGQ9YXV0b19hZGQsIGV4Y2x1ZGVfZmlsdGVyPWV4Y2x1ZGVfZmlsdGVyKQorICAgICAgICBzZWxmLl93bWRbd2RdID0gd2F0Y2gKKyAgICAgICAgbG9nLmRlYnVnKCdOZXcgJXMnLCB3YXRjaCkKKyAgICAgICAgcmV0dXJuIHdkCisKKyAgICBkZWYgX19nbG9iKHNlbGYsIHBhdGgsIGRvX2dsb2IpOgorICAgICAgICBpZiBkb19nbG9iOgorICAgICAgICAgICAgcmV0dXJuIGdsb2IocGF0aCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBbcGF0aF0KKworICAgIGRlZiBhZGRfd2F0Y2goc2VsZiwgcGF0aCwgbWFzaywgcHJvY19mdW49Tm9uZSwgcmVjPUZhbHNlLAorICAgICAgICAgICAgICAgICAgYXV0b19hZGQ9RmFsc2UsIGRvX2dsb2I9RmFsc2UsIHF1aWV0PVRydWUsCisgICAgICAgICAgICAgICAgICBleGNsdWRlX2ZpbHRlcj1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIEFkZCB3YXRjaChzKSBvbiB0aGUgcHJvdmlkZWQgfHBhdGh8KHMpIHdpdGggYXNzb2NpYXRlZCB8bWFza3wgZmxhZworICAgICAgICB2YWx1ZSBhbmQgb3B0aW9uYWxseSB3aXRoIGEgcHJvY2Vzc2luZyB8cHJvY19mdW58IGZ1bmN0aW9uIGFuZAorICAgICAgICByZWN1cnNpdmUgZmxhZyB8cmVjfCBzZXQgdG8gVHJ1ZS4KKyAgICAgICAgSWRlYWxseSB8cGF0aHwgY29tcG9uZW50cyBzaG91bGQgbm90IGJlIHVuaWNvZGUgb2JqZWN0cy4gTm90ZSB0aGF0CisgICAgICAgIGFsdGhvdWdoIHVuaWNvZGUgcGF0aHMgYXJlIGFjY2VwdGVkIHRoZXJlIGFyZSBjb252ZXJ0ZWQgdG8gYnl0ZQorICAgICAgICBzdHJpbmdzIGJlZm9yZSBhIHdhdGNoIGlzIHB1dCBvbiB0aGF0IHBhdGguIFRoZSBlbmNvZGluZyB1c2VkIGZvcgorICAgICAgICBjb252ZXJ0aW5nIHRoZSB1bmljb2RlIG9iamVjdCBpcyBnaXZlbiBieSBzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkuCisgICAgICAgIElmIHxwYXRofCBzaSBhbHJlYWR5IHdhdGNoZWQgaXQgaXMgaWdub3JlZCwgYnV0IGlmIGl0IGlzIGNhbGxlZCB3aXRoCisgICAgICAgIG9wdGlvbiByZWM9VHJ1ZSBhIHdhdGNoIGlzIHB1dCBvbiBlYWNoIG9uZSBvZiBpdHMgbm90LXdhdGNoZWQKKyAgICAgICAgc3ViZGlyZWN0b3J5LgorCisgICAgICAgIEBwYXJhbSBwYXRoOiBQYXRoIHRvIHdhdGNoLCB0aGUgcGF0aCBjYW4gZWl0aGVyIGJlIGEgZmlsZSBvciBhCisgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnkuIEFsc28gYWNjZXB0cyBhIHNlcXVlbmNlIChsaXN0KSBvZiBwYXRocy4KKyAgICAgICAgQHR5cGUgcGF0aDogc3RyaW5nIG9yIGxpc3Qgb2Ygc3RyaW5ncworICAgICAgICBAcGFyYW0gbWFzazogQml0bWFzayBvZiBldmVudHMuCisgICAgICAgIEB0eXBlIG1hc2s6IGludAorICAgICAgICBAcGFyYW0gcHJvY19mdW46IFByb2Nlc3Npbmcgb2JqZWN0LgorICAgICAgICBAdHlwZSBwcm9jX2Z1bjogZnVuY3Rpb24gb3IgUHJvY2Vzc0V2ZW50IGluc3RhbmNlIG9yIGluc3RhbmNlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICBvbmUgb2YgaXRzIHN1YmNsYXNzZXMgb3IgY2FsbGFibGUgb2JqZWN0LgorICAgICAgICBAcGFyYW0gcmVjOiBSZWN1cnNpdmVseSBhZGQgd2F0Y2hlcyBmcm9tIHBhdGggb24gYWxsIGl0cworICAgICAgICAgICAgICAgICAgICBzdWJkaXJlY3Rvcmllcywgc2V0IHRvIEZhbHNlIGJ5IGRlZmF1bHQgKGRvZXNuJ3QKKyAgICAgICAgICAgICAgICAgICAgZm9sbG93cyBzeW1saW5rcyBpbiBhbnkgY2FzZSkuCisgICAgICAgIEB0eXBlIHJlYzogYm9vbAorICAgICAgICBAcGFyYW0gYXV0b19hZGQ6IEF1dG9tYXRpY2FsbHkgYWRkIHdhdGNoZXMgb24gbmV3bHkgY3JlYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yaWVzIGluIHdhdGNoZWQgcGFyZW50IHxwYXRofCBkaXJlY3RvcnkuCisgICAgICAgICAgICAgICAgICAgICAgICAgSWYgfGF1dG9fYWRkfCBpcyBUcnVlLCBJTl9DUkVBVEUgaXMgb3JlZCB3aXRoIHxtYXNrfAorICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdGhlIHdhdGNoIGlzIGFkZGVkLgorICAgICAgICBAdHlwZSBhdXRvX2FkZDogYm9vbAorICAgICAgICBAcGFyYW0gZG9fZ2xvYjogRG8gZ2xvYmJpbmcgb24gcGF0aG5hbWUgKHNlZSBzdGFuZGFyZCBnbG9iYmluZworICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlIGZvciBtb3JlIGluZm9ybWF0aW9ucykuCisgICAgICAgIEB0eXBlIGRvX2dsb2I6IGJvb2wKKyAgICAgICAgQHBhcmFtIHF1aWV0OiBpZiBGYWxzZSByYWlzZXMgYSBXYXRjaE1hbmFnZXJFcnJvciBleGNlcHRpb24gb24KKyAgICAgICAgICAgICAgICAgICAgICBlcnJvci4gU2VlIGV4YW1wbGUgbm90X3F1aWV0LnB5LgorICAgICAgICBAdHlwZSBxdWlldDogYm9vbAorICAgICAgICBAcGFyYW0gZXhjbHVkZV9maWx0ZXI6IHByZWRpY2F0ZSAoYm9vbGVhbiBmdW5jdGlvbiksIHdoaWNoIHJldHVybnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcnVlIGlmIHRoZSBjdXJyZW50IHBhdGggbXVzdCBiZSBleGNsdWRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gYmVpbmcgd2F0Y2hlZC4gVGhpcyBhcmd1bWVudCBoYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjZWRlbmNlIG92ZXIgZXhjbHVkZV9maWx0ZXIgcGFzc2VkIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNsYXNzJyBjb25zdHJ1Y3Rvci4KKyAgICAgICAgQHR5cGUgZXhjbHVkZV9maWx0ZXI6IGNhbGxhYmxlIG9iamVjdAorICAgICAgICBAcmV0dXJuOiBkaWN0IG9mIHBhdGhzIGFzc29jaWF0ZWQgdG8gd2F0Y2ggZGVzY3JpcHRvcnMuIEEgd2QgdmFsdWUKKyAgICAgICAgICAgICAgICAgaXMgcG9zaXRpdmUgaWYgdGhlIHdhdGNoIHdhcyBhZGRlZCBzdWNlc3NmdWxseSwKKyAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIHRoZSB2YWx1ZSBpcyBuZWdhdGl2ZS4gSWYgdGhlIHBhdGggd2FzIGludmFsaWQKKyAgICAgICAgICAgICAgICAgb3Igd2FzIGFscmVhZHkgd2F0Y2hlZCBpdCBpcyBub3QgaW5jbHVkZWQgaW50byB0aGlzIHJldHVybmVkCisgICAgICAgICAgICAgICAgIGRpY3Rpb25hcnkuCisgICAgICAgIEBydHlwZTogZGljdCBvZiB7c3RyOiBpbnR9CisgICAgICAgICIiIgorICAgICAgICByZXRfID0ge30gIyByZXR1cm4ge3BhdGg6IHdkLCAuLi59CisKKyAgICAgICAgaWYgZXhjbHVkZV9maWx0ZXIgaXMgTm9uZToKKyAgICAgICAgICAgIGV4Y2x1ZGVfZmlsdGVyID0gc2VsZi5fZXhjbHVkZV9maWx0ZXIKKworICAgICAgICAjIG5vcm1hbGl6ZSBhcmdzIGFzIGxpc3QgZWxlbWVudHMKKyAgICAgICAgZm9yIG5wYXRoIGluIHNlbGYuX19mb3JtYXRfcGFyYW0ocGF0aCk6CisgICAgICAgICAgICAjIHVuaXggcGF0aG5hbWUgcGF0dGVybiBleHBhbnNpb24KKyAgICAgICAgICAgIGZvciBhcGF0aCBpbiBzZWxmLl9fZ2xvYihucGF0aCwgZG9fZ2xvYik6CisgICAgICAgICAgICAgICAgIyByZWN1cnNpdmVseSBsaXN0IHN1YmRpcnMgYWNjb3JkaW5nIHRvIHJlYyBwYXJhbQorICAgICAgICAgICAgICAgIGZvciBycGF0aCBpbiBzZWxmLl9fd2Fsa19yZWMoYXBhdGgsIHJlYyk6CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBleGNsdWRlX2ZpbHRlcihycGF0aCk6CisgICAgICAgICAgICAgICAgICAgICAgICB3ZCA9IHJldF9bcnBhdGhdID0gc2VsZi5fX2FkZF93YXRjaChycGF0aCwgbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2NfZnVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b19hZGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlX2ZpbHRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHdkIDwgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSAoJ2FkZF93YXRjaDogY2Fubm90IHdhdGNoICVzIFdEPSVkLCAlcycgJSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocnBhdGgsIHdkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2lub3RpZnlfd3JhcHBlci5zdHJfZXJybm8oKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcXVpZXQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihlcnIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgV2F0Y2hNYW5hZ2VyRXJyb3IoZXJyLCByZXRfKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBMZXQncyBzYXkgLTIgbWVhbnMgJ2V4cGxpY2l0ZWx5IGV4Y2x1ZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAjIGZyb20gd2F0Y2hpbmcnLgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0X1tycGF0aF0gPSAtMgorICAgICAgICByZXR1cm4gcmV0XworCisgICAgZGVmIF9fZ2V0X3N1Yl9yZWMoc2VsZiwgbHBhdGgpOgorICAgICAgICAiIiIKKyAgICAgICAgR2V0IGV2ZXJ5IHdkIGZyb20gc2VsZi5fd21kIGlmIGl0cyBwYXRoIGlzIHVuZGVyIHRoZSBwYXRoIG9mCisgICAgICAgIG9uZSAoYXQgbGVhc3QpIG9mIHRob3NlIGluIGxwYXRoLiBEb2Vzbid0IGZvbGxvdyBzeW1saW5rcy4KKworICAgICAgICBAcGFyYW0gbHBhdGg6IGxpc3Qgb2Ygd2F0Y2ggZGVzY3JpcHRvcgorICAgICAgICBAdHlwZSBscGF0aDogbGlzdCBvZiBpbnQKKyAgICAgICAgQHJldHVybjogbGlzdCBvZiB3YXRjaCBkZXNjcmlwdG9yCisgICAgICAgIEBydHlwZTogbGlzdCBvZiBpbnQKKyAgICAgICAgIiIiCisgICAgICAgIGZvciBkIGluIGxwYXRoOgorICAgICAgICAgICAgcm9vdCA9IHNlbGYuZ2V0X3BhdGgoZCkKKyAgICAgICAgICAgIGlmIHJvb3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgIyBhbHdheXMga2VlcCByb290CisgICAgICAgICAgICAgICAgeWllbGQgZAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIGlmIGludmFsaWQKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAjIG5vdGhpbmcgZWxzZSB0byBleHBlY3QKKyAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKHJvb3QpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICMgbm9ybWFsaXphdGlvbgorICAgICAgICAgICAgcm9vdCA9IG9zLnBhdGgubm9ybXBhdGgocm9vdCkKKyAgICAgICAgICAgICMgcmVjdXJzaW9uCisgICAgICAgICAgICBsZW5kID0gbGVuKHJvb3QpCisgICAgICAgICAgICBmb3IgaXdkIGluIHNlbGYuX3dtZC5pdGVtcygpOgorICAgICAgICAgICAgICAgIGN1ciA9IGl3ZFsxXS5wYXRoCisgICAgICAgICAgICAgICAgcHJlZiA9IG9zLnBhdGguY29tbW9ucHJlZml4KFtyb290LCBjdXJdKQorICAgICAgICAgICAgICAgIGlmIHJvb3QgPT0gb3Muc2VwIG9yIChsZW4ocHJlZikgPT0gbGVuZCBhbmQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4oY3VyKSA+IGxlbmQgYW5kIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyW2xlbmRdID09IG9zLnNlcCk6CisgICAgICAgICAgICAgICAgICAgIHlpZWxkIGl3ZFsxXS53ZAorCisgICAgZGVmIHVwZGF0ZV93YXRjaChzZWxmLCB3ZCwgbWFzaz1Ob25lLCBwcm9jX2Z1bj1Ob25lLCByZWM9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICBhdXRvX2FkZD1GYWxzZSwgcXVpZXQ9VHJ1ZSk6CisgICAgICAgICIiIgorICAgICAgICBVcGRhdGUgZXhpc3Rpbmcgd2F0Y2ggZGVzY3JpcHRvcnMgfHdkfC4gVGhlIHxtYXNrfCB2YWx1ZSwgdGhlCisgICAgICAgIHByb2Nlc3Npbmcgb2JqZWN0IHxwcm9jX2Z1bnwsIHRoZSByZWN1cnNpdmUgcGFyYW0gfHJlY3wgYW5kIHRoZQorICAgICAgICB8YXV0b19hZGR8IGFuZCB8cXVpZXR8IGZsYWdzIGNhbiBhbGwgYmUgdXBkYXRlZC4KKworICAgICAgICBAcGFyYW0gd2Q6IFdhdGNoIERlc2NyaXB0b3IgdG8gdXBkYXRlLiBBbHNvIGFjY2VwdHMgYSBsaXN0IG9mCisgICAgICAgICAgICAgICAgICAgd2F0Y2ggZGVzY3JpcHRvcnMuCisgICAgICAgIEB0eXBlIHdkOiBpbnQgb3IgbGlzdCBvZiBpbnQKKyAgICAgICAgQHBhcmFtIG1hc2s6IE9wdGlvbmFsIG5ldyBiaXRtYXNrIG9mIGV2ZW50cy4KKyAgICAgICAgQHR5cGUgbWFzazogaW50CisgICAgICAgIEBwYXJhbSBwcm9jX2Z1bjogT3B0aW9uYWwgbmV3IHByb2Nlc3NpbmcgZnVuY3Rpb24uCisgICAgICAgIEB0eXBlIHByb2NfZnVuOiBmdW5jdGlvbiBvciBQcm9jZXNzRXZlbnQgaW5zdGFuY2Ugb3IgaW5zdGFuY2Ugb2YKKyAgICAgICAgICAgICAgICAgICAgICAgIG9uZSBvZiBpdHMgc3ViY2xhc3NlcyBvciBjYWxsYWJsZSBvYmplY3QuCisgICAgICAgIEBwYXJhbSByZWM6IE9wdGlvbmFsbHkgYWRkcyB3YXRjaGVzIHJlY3Vyc2l2ZWx5IG9uIGFsbAorICAgICAgICAgICAgICAgICAgICBzdWJkaXJlY3RvcmllcyBjb250YWluZWQgaW50byB8d2R8IGRpcmVjdG9yeS4KKyAgICAgICAgQHR5cGUgcmVjOiBib29sCisgICAgICAgIEBwYXJhbSBhdXRvX2FkZDogQXV0b21hdGljYWxseSBhZGRzIHdhdGNoZXMgb24gbmV3bHkgY3JlYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yaWVzIGluIHRoZSB3YXRjaCdzIHBhdGggY29ycmVzcG9uZGluZyB0byB8d2R8LgorICAgICAgICAgICAgICAgICAgICAgICAgIElmIHxhdXRvX2FkZHwgaXMgVHJ1ZSwgSU5fQ1JFQVRFIGlzIG9yZWQgd2l0aCB8bWFza3wKKyAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHRoZSB3YXRjaCBpcyB1cGRhdGVkLgorICAgICAgICBAdHlwZSBhdXRvX2FkZDogYm9vbAorICAgICAgICBAcGFyYW0gcXVpZXQ6IElmIEZhbHNlIHJhaXNlcyBhIFdhdGNoTWFuYWdlckVycm9yIGV4Y2VwdGlvbiBvbgorICAgICAgICAgICAgICAgICAgICAgIGVycm9yLiBTZWUgZXhhbXBsZSBub3RfcXVpZXQucHkKKyAgICAgICAgQHR5cGUgcXVpZXQ6IGJvb2wKKyAgICAgICAgQHJldHVybjogZGljdCBvZiB3YXRjaCBkZXNjcmlwdG9ycyBhc3NvY2lhdGVkIHRvIGJvb2xlYW5zIHZhbHVlcy4KKyAgICAgICAgICAgICAgICAgVHJ1ZSBpZiB0aGUgY29ycmVzcG9uZGluZyB3ZCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkKKyAgICAgICAgICAgICAgICAgdXBkYXRlZCwgRmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICBAcnR5cGU6IGRpY3Qgb2Yge2ludDogYm9vbH0KKyAgICAgICAgIiIiCisgICAgICAgIGx3ZCA9IHNlbGYuX19mb3JtYXRfcGFyYW0od2QpCisgICAgICAgIGlmIHJlYzoKKyAgICAgICAgICAgIGx3ZCA9IHNlbGYuX19nZXRfc3ViX3JlYyhsd2QpCisKKyAgICAgICAgcmV0XyA9IHt9ICAjIHJldHVybiB7d2Q6IGJvb2wsIC4uLn0KKyAgICAgICAgZm9yIGF3ZCBpbiBsd2Q6CisgICAgICAgICAgICBhcGF0aCA9IHNlbGYuZ2V0X3BhdGgoYXdkKQorICAgICAgICAgICAgaWYgbm90IGFwYXRoIG9yIGF3ZCA8IDA6CisgICAgICAgICAgICAgICAgZXJyID0gJ3VwZGF0ZV93YXRjaDogaW52YWxpZCBXRD0lZCcgJSBhd2QKKyAgICAgICAgICAgICAgICBpZiBxdWlldDoKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKGVycikKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICByYWlzZSBXYXRjaE1hbmFnZXJFcnJvcihlcnIsIHJldF8pCisKKyAgICAgICAgICAgIGlmIG1hc2s6CisgICAgICAgICAgICAgICAgd2RfID0gc2VsZi5faW5vdGlmeV93cmFwcGVyLmlub3RpZnlfYWRkX3dhdGNoKHNlbGYuX2ZkLCBhcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzaykKKyAgICAgICAgICAgICAgICBpZiB3ZF8gPCAwOgorICAgICAgICAgICAgICAgICAgICByZXRfW2F3ZF0gPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICBlcnIgPSAoJ3VwZGF0ZV93YXRjaDogY2Fubm90IHVwZGF0ZSAlcyBXRD0lZCwgJXMnICUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhcGF0aCwgd2RfLCBzZWxmLl9pbm90aWZ5X3dyYXBwZXIuc3RyX2Vycm5vKCkpKQorICAgICAgICAgICAgICAgICAgICBpZiBxdWlldDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihlcnIpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICByYWlzZSBXYXRjaE1hbmFnZXJFcnJvcihlcnIsIHJldF8pCisKKyAgICAgICAgICAgICAgICBhc3NlcnQoYXdkID09IHdkXykKKworICAgICAgICAgICAgaWYgcHJvY19mdW4gb3IgYXV0b19hZGQ6CisgICAgICAgICAgICAgICAgd2F0Y2hfID0gc2VsZi5fd21kW2F3ZF0KKworICAgICAgICAgICAgaWYgcHJvY19mdW46CisgICAgICAgICAgICAgICAgd2F0Y2hfLnByb2NfZnVuID0gcHJvY19mdW4KKworICAgICAgICAgICAgaWYgYXV0b19hZGQ6CisgICAgICAgICAgICAgICAgd2F0Y2hfLmF1dG9fYWRkID0gYXV0b19hZGQKKworICAgICAgICAgICAgcmV0X1thd2RdID0gVHJ1ZQorICAgICAgICAgICAgbG9nLmRlYnVnKCdVcGRhdGVkIHdhdGNoIC0gJXMnLCBzZWxmLl93bWRbYXdkXSkKKyAgICAgICAgcmV0dXJuIHJldF8KKworICAgIGRlZiBfX2Zvcm1hdF9wYXJhbShzZWxmLCBwYXJhbSk6CisgICAgICAgICIiIgorICAgICAgICBAcGFyYW0gcGFyYW06IFBhcmFtZXRlci4KKyAgICAgICAgQHR5cGUgcGFyYW06IHN0cmluZyBvciBpbnQKKyAgICAgICAgQHJldHVybjogd3JhcCBwYXJhbS4KKyAgICAgICAgQHJ0eXBlOiBsaXN0IG9mIHR5cGUocGFyYW0pCisgICAgICAgICIiIgorICAgICAgICBpZiBpc2luc3RhbmNlKHBhcmFtLCBsaXN0KToKKyAgICAgICAgICAgIGZvciBwXyBpbiBwYXJhbToKKyAgICAgICAgICAgICAgICB5aWVsZCBwXworICAgICAgICBlbHNlOgorICAgICAgICAgICAgeWllbGQgcGFyYW0KKworICAgIGRlZiBnZXRfd2Qoc2VsZiwgcGF0aCk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm5zIHRoZSB3YXRjaCBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgdG8gcGF0aC4gVGhpcyBtZXRob2QKKyAgICAgICAgcHJlc2VudHMgYSBwcm9oaWJpdGl2ZSBjb3N0LCBhbHdheXMgcHJlZmVyIHRvIGtlZXAgdGhlIFdECisgICAgICAgIHJldHVybmVkIGJ5IGFkZF93YXRjaCgpLiBJZiB0aGUgcGF0aCBpcyB1bmtub3duIGl0IHJldHVybnMgTm9uZS4KKworICAgICAgICBAcGFyYW0gcGF0aDogUGF0aC4KKyAgICAgICAgQHR5cGUgcGF0aDogc3RyCisgICAgICAgIEByZXR1cm46IFdEIG9yIE5vbmUuCisgICAgICAgIEBydHlwZTogaW50IG9yIE5vbmUKKyAgICAgICAgIiIiCisgICAgICAgIHBhdGggPSBzZWxmLl9fZm9ybWF0X3BhdGgocGF0aCkKKyAgICAgICAgZm9yIGl3ZCBpbiBzZWxmLl93bWQuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIGl3ZFsxXS5wYXRoID09IHBhdGg6CisgICAgICAgICAgICAgICAgcmV0dXJuIGl3ZFswXQorCisgICAgZGVmIGdldF9wYXRoKHNlbGYsIHdkKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybnMgdGhlIHBhdGggYXNzb2NpYXRlZCB0byBXRCwgaWYgV0QgaXMgdW5rbm93biBpdCByZXR1cm5zIE5vbmUuCisKKyAgICAgICAgQHBhcmFtIHdkOiBXYXRjaCBkZXNjcmlwdG9yLgorICAgICAgICBAdHlwZSB3ZDogaW50CisgICAgICAgIEByZXR1cm46IFBhdGggb3IgTm9uZS4KKyAgICAgICAgQHJ0eXBlOiBzdHJpbmcgb3IgTm9uZQorICAgICAgICAiIiIKKyAgICAgICAgd2F0Y2hfID0gc2VsZi5fd21kLmdldCh3ZCkKKyAgICAgICAgaWYgd2F0Y2hfIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHdhdGNoXy5wYXRoCisKKyAgICBkZWYgX193YWxrX3JlYyhzZWxmLCB0b3AsIHJlYyk6CisgICAgICAgICIiIgorICAgICAgICBZaWVsZHMgZWFjaCBzdWJkaXJlY3RvcmllcyBvZiB0b3AsIGRvZXNuJ3QgZm9sbG93IHN5bWxpbmtzLgorICAgICAgICBJZiByZWMgaXMgZmFsc2UsIG9ubHkgeWllbGQgdG9wLgorCisgICAgICAgIEBwYXJhbSB0b3A6IHJvb3QgZGlyZWN0b3J5LgorICAgICAgICBAdHlwZSB0b3A6IHN0cmluZworICAgICAgICBAcGFyYW0gcmVjOiByZWN1cnNpdmUgZmxhZy4KKyAgICAgICAgQHR5cGUgcmVjOiBib29sCisgICAgICAgIEByZXR1cm46IHBhdGggb2Ygb25lIHN1YmRpcmVjdG9yeS4KKyAgICAgICAgQHJ0eXBlOiBzdHJpbmcKKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCByZWMgb3Igb3MucGF0aC5pc2xpbmsodG9wKSBvciBub3Qgb3MucGF0aC5pc2Rpcih0b3ApOgorICAgICAgICAgICAgeWllbGQgdG9wCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2Fsayh0b3ApOgorICAgICAgICAgICAgICAgIHlpZWxkIHJvb3QKKworICAgIGRlZiBybV93YXRjaChzZWxmLCB3ZCwgcmVjPUZhbHNlLCBxdWlldD1UcnVlKToKKyAgICAgICAgIiIiCisgICAgICAgIFJlbW92ZXMgd2F0Y2gocykuCisKKyAgICAgICAgQHBhcmFtIHdkOiBXYXRjaCBEZXNjcmlwdG9yIG9mIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSB0byB1bndhdGNoLgorICAgICAgICAgICAgICAgICAgIEFsc28gYWNjZXB0cyBhIGxpc3Qgb2YgV0RzLgorICAgICAgICBAdHlwZSB3ZDogaW50IG9yIGxpc3Qgb2YgaW50LgorICAgICAgICBAcGFyYW0gcmVjOiBSZWN1cnNpdmVseSByZW1vdmVzIHdhdGNoZXMgb24gZXZlcnkgYWxyZWFkeSB3YXRjaGVkCisgICAgICAgICAgICAgICAgICAgIHN1YmRpcmVjdG9yaWVzIGFuZCBzdWJmaWxlcy4KKyAgICAgICAgQHR5cGUgcmVjOiBib29sCisgICAgICAgIEBwYXJhbSBxdWlldDogSWYgRmFsc2UgcmFpc2VzIGEgV2F0Y2hNYW5hZ2VyRXJyb3IgZXhjZXB0aW9uIG9uCisgICAgICAgICAgICAgICAgICAgICAgZXJyb3IuIFNlZSBleGFtcGxlIG5vdF9xdWlldC5weQorICAgICAgICBAdHlwZSBxdWlldDogYm9vbAorICAgICAgICBAcmV0dXJuOiBkaWN0IG9mIHdhdGNoIGRlc2NyaXB0b3JzIGFzc29jaWF0ZWQgdG8gYm9vbGVhbnMgdmFsdWVzLgorICAgICAgICAgICAgICAgICBUcnVlIGlmIHRoZSBjb3JyZXNwb25kaW5nIHdkIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseQorICAgICAgICAgICAgICAgICByZW1vdmVkLCBGYWxzZSBvdGhlcndpc2UuCisgICAgICAgIEBydHlwZTogZGljdCBvZiB7aW50OiBib29sfQorICAgICAgICAiIiIKKyAgICAgICAgbHdkID0gc2VsZi5fX2Zvcm1hdF9wYXJhbSh3ZCkKKyAgICAgICAgaWYgcmVjOgorICAgICAgICAgICAgbHdkID0gc2VsZi5fX2dldF9zdWJfcmVjKGx3ZCkKKworICAgICAgICByZXRfID0ge30gICMgcmV0dXJuIHt3ZDogYm9vbCwgLi4ufQorICAgICAgICBmb3IgYXdkIGluIGx3ZDoKKyAgICAgICAgICAgICMgcmVtb3ZlIHdhdGNoCisgICAgICAgICAgICB3ZF8gPSBzZWxmLl9pbm90aWZ5X3dyYXBwZXIuaW5vdGlmeV9ybV93YXRjaChzZWxmLl9mZCwgYXdkKQorICAgICAgICAgICAgaWYgd2RfIDwgMDoKKyAgICAgICAgICAgICAgICByZXRfW2F3ZF0gPSBGYWxzZQorICAgICAgICAgICAgICAgIGVyciA9ICgncm1fd2F0Y2g6IGNhbm5vdCByZW1vdmUgV0Q9JWQsICVzJyAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChhd2QsIHNlbGYuX2lub3RpZnlfd3JhcHBlci5zdHJfZXJybm8oKSkpCisgICAgICAgICAgICAgICAgaWYgcXVpZXQ6CisgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihlcnIpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgcmFpc2UgV2F0Y2hNYW5hZ2VyRXJyb3IoZXJyLCByZXRfKQorCisgICAgICAgICAgICAjIFJlbW92ZSB3YXRjaCBmcm9tIG91ciBkaWN0aW9uYXJ5CisgICAgICAgICAgICBpZiBhd2QgaW4gc2VsZi5fd21kOgorICAgICAgICAgICAgICAgIGRlbCBzZWxmLl93bWRbYXdkXQorICAgICAgICAgICAgcmV0X1thd2RdID0gVHJ1ZQorICAgICAgICAgICAgbG9nLmRlYnVnKCdXYXRjaCBXRD0lZCAoJXMpIHJlbW92ZWQnLCBhd2QsIHNlbGYuZ2V0X3BhdGgoYXdkKSkKKyAgICAgICAgcmV0dXJuIHJldF8KKworCisgICAgZGVmIHdhdGNoX3RyYW5zaWVudF9maWxlKHNlbGYsIGZpbGVuYW1lLCBtYXNrLCBwcm9jX2NsYXNzKToKKyAgICAgICAgIiIiCisgICAgICAgIFdhdGNoIGEgdHJhbnNpZW50IGZpbGUsIHdoaWNoIHdpbGwgYmUgY3JlYXRlZCBhbmQgZGVsZXRlZCBmcmVxdWVudGx5CisgICAgICAgIG92ZXIgdGltZSAoZS5nLiBwaWQgZmlsZSkuCisKKyAgICAgICAgQGF0dGVudGlvbjogQ3VycmVudGx5IHVuZGVyIHRoZSBjYWxsIHRvIHRoaXMgZnVuY3Rpb24gaXQgaXMgbm90CisgICAgICAgIHBvc3NpYmxlIHRvIGNvcnJlY3RseSB3YXRjaCB0aGUgZXZlbnRzIHRyaWdnZXJlZCBpbnRvIHRoZSBzYW1lCisgICAgICAgIGJhc2UgZGlyZWN0b3J5IHRoYW4gdGhlIGRpcmVjdG9yeSB3aGVyZSBpcyBsb2NhdGVkIHRoaXMgd2F0Y2hlZAorICAgICAgICB0cmFuc2llbnQgZmlsZS4gRm9yIGluc3RhbmNlIGl0IHdvdWxkIGJlIHdyb25nIHRvIG1ha2UgdGhlc2UKKyAgICAgICAgdHdvIHN1Y2Nlc3NpdmUgY2FsbHM6IHdtLndhdGNoX3RyYW5zaWVudF9maWxlKCcvdmFyL3J1bi9mb28ucGlkJywgLi4uKQorICAgICAgICBhbmQgd20uYWRkX3dhdGNoKCcvdmFyL3J1bi8nLCAuLi4pCisKKyAgICAgICAgQHBhcmFtIGZpbGVuYW1lOiBGaWxlbmFtZS4KKyAgICAgICAgQHR5cGUgZmlsZW5hbWU6IHN0cmluZworICAgICAgICBAcGFyYW0gbWFzazogQml0bWFzayBvZiBldmVudHMsIHNob3VsZCBjb250YWluIElOX0NSRUFURSBhbmQgSU5fREVMRVRFLgorICAgICAgICBAdHlwZSBtYXNrOiBpbnQKKyAgICAgICAgQHBhcmFtIHByb2NfY2xhc3M6IFByb2Nlc3NFdmVudCAob3Igb2Ygb25lIG9mIGl0cyBzdWJjbGFzcyksIGJld2FyZSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXB0aW5nIGEgUHJvY2Vzc0V2ZW50J3MgaW5zdGFuY2UgYXMgYXJndW1lbnQgaW50bworICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pbml0X18sIHNlZSB0cmFuc2llbnRfZmlsZS5weSBleGFtcGxlIGZvciBtb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzLgorICAgICAgICBAdHlwZSBwcm9jX2NsYXNzOiBQcm9jZXNzRXZlbnQncyBpbnN0YW5jZSBvciBvZiBvbmUgb2YgaXRzIHN1YmNsYXNzZXMuCisgICAgICAgIEByZXR1cm46IFNhbWUgYXMgYWRkX3dhdGNoKCkuCisgICAgICAgIEBydHlwZTogU2FtZSBhcyBhZGRfd2F0Y2goKS4KKyAgICAgICAgIiIiCisgICAgICAgIGRpcm5hbWUgPSBvcy5wYXRoLmRpcm5hbWUoZmlsZW5hbWUpCisgICAgICAgIGlmIGRpcm5hbWUgPT0gJyc6CisgICAgICAgICAgICByZXR1cm4ge30gICMgTWFpbnRhaW5zIGNvaGVyZW5jZSB3aXRoIGFkZF93YXRjaCgpCisgICAgICAgIGJhc2VuYW1lID0gb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSkKKyAgICAgICAgIyBBc3N1bWluZyB3ZSBhcmUgd2F0Y2hpbmcgYXQgbGVhc3QgZm9yIElOX0NSRUFURSBhbmQgSU5fREVMRVRFCisgICAgICAgIG1hc2sgfD0gSU5fQ1JFQVRFIHwgSU5fREVMRVRFCisKKyAgICAgICAgZGVmIGNtcF9uYW1lKGV2ZW50KToKKyAgICAgICAgICAgIGlmIGdldGF0dHIoZXZlbnQsICduYW1lJykgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgIHJldHVybiBiYXNlbmFtZSA9PSBldmVudC5uYW1lCisgICAgICAgIHJldHVybiBzZWxmLmFkZF93YXRjaChkaXJuYW1lLCBtYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY19mdW49cHJvY19jbGFzcyhDaGFpbklmVHJ1ZShmdW5jPWNtcF9uYW1lKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWM9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvX2FkZD1GYWxzZSwgZG9fZ2xvYj1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVfZmlsdGVyPWxhbWJkYSBwYXRoOiBGYWxzZSkKKworICAgIGRlZiBnZXRfaWdub3JlX2V2ZW50cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2lnbm9yZV9ldmVudHMKKworICAgIGRlZiBzZXRfaWdub3JlX2V2ZW50cyhzZWxmLCBudmFsKToKKyAgICAgICAgc2VsZi5faWdub3JlX2V2ZW50cyA9IG52YWwKKworICAgIGlnbm9yZV9ldmVudHMgPSBwcm9wZXJ0eShnZXRfaWdub3JlX2V2ZW50cywgc2V0X2lnbm9yZV9ldmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYWtlIHdhdGNoIG1hbmFnZXIgaWdub3JpbmcgbmV3IGV2ZW50cy4iKQorCisKKworY2xhc3MgUmF3T3V0cHV0Rm9ybWF0OgorICAgICIiIgorICAgIEZvcm1hdCBzdHJpbmcgcmVwcmVzZW50YXRpb25zLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmb3JtYXQ9Tm9uZSk6CisgICAgICAgIHNlbGYuZm9ybWF0ID0gZm9ybWF0IG9yIHt9CisKKyAgICBkZWYgc2ltcGxlKHNlbGYsIHMsIGF0dHJpYnV0ZSk6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHMsIHN0cik6CisgICAgICAgICAgICBzID0gc3RyKHMpCisgICAgICAgIHJldHVybiAoc2VsZi5mb3JtYXQuZ2V0KGF0dHJpYnV0ZSwgJycpICsgcyArCisgICAgICAgICAgICAgICAgc2VsZi5mb3JtYXQuZ2V0KCdub3JtYWwnLCAnJykpCisKKyAgICBkZWYgcHVuY3R1YXRpb24oc2VsZiwgcyk6CisgICAgICAgICIiIlB1bmN0dWF0aW9uIGNvbG9yLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5zaW1wbGUocywgJ25vcm1hbCcpCisKKyAgICBkZWYgZmllbGRfdmFsdWUoc2VsZiwgcyk6CisgICAgICAgICIiIkZpZWxkIHZhbHVlIGNvbG9yLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5zaW1wbGUocywgJ3B1cnBsZScpCisKKyAgICBkZWYgZmllbGRfbmFtZShzZWxmLCBzKToKKyAgICAgICAgIiIiRmllbGQgbmFtZSBjb2xvci4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuc2ltcGxlKHMsICdibHVlJykKKworICAgIGRlZiBjbGFzc19uYW1lKHNlbGYsIHMpOgorICAgICAgICAiIiJDbGFzcyBuYW1lIGNvbG9yLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5mb3JtYXQuZ2V0KCdyZWQnLCAnJykgKyBzZWxmLnNpbXBsZShzLCAnYm9sZCcpCisKK291dHB1dF9mb3JtYXQgPSBSYXdPdXRwdXRGb3JtYXQoKQorCitjbGFzcyBDb2xvcmVkT3V0cHV0Rm9ybWF0KFJhd091dHB1dEZvcm1hdCk6CisgICAgIiIiCisgICAgRm9ybWF0IGNvbG9yZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9ucy4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIGYgPSB7J25vcm1hbCc6ICdcMDMzWzBtJywKKyAgICAgICAgICAgICAnYmxhY2snOiAnXDAzM1szMG0nLAorICAgICAgICAgICAgICdyZWQnOiAnXDAzM1szMW0nLAorICAgICAgICAgICAgICdncmVlbic6ICdcMDMzWzMybScsCisgICAgICAgICAgICAgJ3llbGxvdyc6ICdcMDMzWzMzbScsCisgICAgICAgICAgICAgJ2JsdWUnOiAnXDAzM1szNG0nLAorICAgICAgICAgICAgICdwdXJwbGUnOiAnXDAzM1szNW0nLAorICAgICAgICAgICAgICdjeWFuJzogJ1wwMzNbMzZtJywKKyAgICAgICAgICAgICAnYm9sZCc6ICdcMDMzWzFtJywKKyAgICAgICAgICAgICAndWxpbmUnOiAnXDAzM1s0bScsCisgICAgICAgICAgICAgJ2JsaW5rJzogJ1wwMzNbNW0nLAorICAgICAgICAgICAgICdpbnZlcnQnOiAnXDAzM1s3bSd9CisgICAgICAgIFJhd091dHB1dEZvcm1hdC5fX2luaXRfXyhzZWxmLCBmKQorCisKK2RlZiBjb21wYXRpYmlsaXR5X21vZGUoKToKKyAgICAiIiIKKyAgICBVc2UgdGhpcyBmdW5jdGlvbiB0byB0dXJuIG9uIHRoZSBjb21wYXRpYmlsaXR5IG1vZGUuIFRoZSBjb21wYXRpYmlsaXR5CisgICAgbW9kZSBpcyB1c2VkIHRvIGltcHJvdmUgY29tcGF0aWJpbGl0eSB3aXRoIFB5aW5vdGlmeSAwLjcuMSAob3Igb2xkZXIpCisgICAgcHJvZ3JhbXMuIFRoZSBjb21wYXRpYmlsaXR5IG1vZGUgcHJvdmlkZXMgYWRkaXRpb25hbCB2YXJpYWJsZXMgJ2lzX2RpcicsCisgICAgJ2V2ZW50X25hbWUnLCAnRXZlbnRzQ29kZXMuSU5fKicgYW5kICdFdmVudHNDb2Rlcy5BTExfRVZFTlRTJyBhcworICAgIFB5aW5vdGlmeSAwLjcuMSBwcm92aWRlZC4gRG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiBmcm9tIG5ldyBwcm9ncmFtcyEhCisgICAgRXNwZWNpYWxseSBpZiB0aGVyZSBhcmUgZGV2ZWxvcHBlZCBmb3IgUHlpbm90aWZ5ID49IDAuOC54LgorICAgICIiIgorICAgIHNldGF0dHIoRXZlbnRzQ29kZXMsICdBTExfRVZFTlRTJywgQUxMX0VWRU5UUykKKyAgICBmb3IgZXZuYW1lIGluIGdsb2JhbHMoKToKKyAgICAgICAgaWYgZXZuYW1lLnN0YXJ0c3dpdGgoJ0lOXycpOgorICAgICAgICAgICAgc2V0YXR0cihFdmVudHNDb2RlcywgZXZuYW1lLCBnbG9iYWxzKClbZXZuYW1lXSkKKyAgICBnbG9iYWwgQ09NUEFUSUJJTElUWV9NT0RFCisgICAgQ09NUEFUSUJJTElUWV9NT0RFID0gVHJ1ZQorCisKK2RlZiBjb21tYW5kX2xpbmUoKToKKyAgICAiIiIKKyAgICBCeSBkZWZhdWx0IHRoZSB3YXRjaGVkIHBhdGggaXMgJy90bXAnIGFuZCBhbGwgdHlwZXMgb2YgZXZlbnRzIGFyZQorICAgIG1vbml0b3JlZC4gRXZlbnRzIG1vbml0b3Jpbmcgc2VydmVzIGZvcmV2ZXIsIHR5cGUgY15jIHRvIHN0b3AgaXQuCisgICAgIiIiCisgICAgZnJvbSBvcHRwYXJzZSBpbXBvcnQgT3B0aW9uUGFyc2VyCisKKyAgICB1c2FnZSA9ICJ1c2FnZTogJXByb2cgW29wdGlvbnNdIFtwYXRoMV0gW3BhdGgyXSBbcGF0aG5dIgorCisgICAgcGFyc2VyID0gT3B0aW9uUGFyc2VyKHVzYWdlPXVzYWdlKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItdiIsICItLXZlcmJvc2UiLCBhY3Rpb249InN0b3JlX3RydWUiLAorICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9InZlcmJvc2UiLCBoZWxwPSJWZXJib3NlIG1vZGUiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItciIsICItLXJlY3Vyc2l2ZSIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgZGVzdD0icmVjdXJzaXZlIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJBZGQgd2F0Y2hlcyByZWN1cnNpdmVseSBvbiBwYXRocyIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi1hIiwgIi0tYXV0b19hZGQiLCBhY3Rpb249InN0b3JlX3RydWUiLAorICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9ImF1dG9fYWRkIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJBdXRvbWF0aWNhbGx5IGFkZCB3YXRjaGVzIG9uIG5ldyBkaXJlY3RvcmllcyIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi1nIiwgIi0tZ2xvYiIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgZGVzdD0iZ2xvYiIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0iVHJlYXQgcGF0aHMgYXMgZ2xvYnMiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItZSIsICItLWV2ZW50cy1saXN0IiwgbWV0YXZhcj0iRVZFTlRbLC4uLl0iLAorICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9ImV2ZW50c19saXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSgiQSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBldmVudHMgdG8gd2F0Y2ggZm9yIC0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdmFsaWQgb3B0aW9ucyAoZGVmYXVsdHMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHRvIGV2ZXJ5dGhpbmcpIikpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi1zIiwgIi0tc3RhdHMiLCBhY3Rpb249InN0b3JlX3RydWUiLAorICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9InN0YXRzIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJEaXNwbGF5IGR1bW15IHN0YXRpc3RpY3MiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItViIsICItLXZlcnNpb24iLCBhY3Rpb249InN0b3JlX3RydWUiLAorICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9InZlcnNpb24iLCAgaGVscD0iUHlpbm90aWZ5IHZlcnNpb24iKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItZiIsICItLXJhdy1mb3JtYXQiLCBhY3Rpb249InN0b3JlX3RydWUiLAorICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9InJhd19mb3JtYXQiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IkRpc2FibGUgZW5oYW5jZWQgb3V0cHV0IGZvcm1hdC4iKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItYyIsICItLWNvbW1hbmQiLCBhY3Rpb249InN0b3JlIiwKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0PSJjb21tYW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJTaGVsbCBjb21tYW5kIHRvIHJ1biB1cG9uIGV2ZW50IikKKworICAgIChvcHRpb25zLCBhcmdzKSA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKworICAgIGlmIG9wdGlvbnMudmVyYm9zZToKKyAgICAgICAgbG9nLnNldExldmVsKDEwKQorCisgICAgaWYgb3B0aW9ucy52ZXJzaW9uOgorICAgICAgICBwcmludChfX3ZlcnNpb25fXykKKworICAgIGlmIG5vdCBvcHRpb25zLnJhd19mb3JtYXQ6CisgICAgICAgIGdsb2JhbCBvdXRwdXRfZm9ybWF0CisgICAgICAgIG91dHB1dF9mb3JtYXQgPSBDb2xvcmVkT3V0cHV0Rm9ybWF0KCkKKworICAgIGlmIGxlbihhcmdzKSA8IDE6CisgICAgICAgIHBhdGggPSAnL3RtcCcgICMgZGVmYXVsdCB3YXRjaGVkIHBhdGgKKyAgICBlbHNlOgorICAgICAgICBwYXRoID0gYXJncworCisgICAgIyB3YXRjaCBtYW5hZ2VyIGluc3RhbmNlCisgICAgd20gPSBXYXRjaE1hbmFnZXIoKQorICAgICMgbm90aWZpZXIgaW5zdGFuY2UgYW5kIGluaXQKKyAgICBpZiBvcHRpb25zLnN0YXRzOgorICAgICAgICBub3RpZmllciA9IE5vdGlmaWVyKHdtLCBkZWZhdWx0X3Byb2NfZnVuPVN0YXRzKCksIHJlYWRfZnJlcT01KQorICAgIGVsc2U6CisgICAgICAgIG5vdGlmaWVyID0gTm90aWZpZXIod20sIGRlZmF1bHRfcHJvY19mdW49UHJpbnRBbGxFdmVudHMoKSkKKworICAgICMgV2hhdCBtYXNrIHRvIGFwcGx5CisgICAgbWFzayA9IDAKKyAgICBpZiBvcHRpb25zLmV2ZW50c19saXN0OgorICAgICAgICBldmVudHNfbGlzdCA9IG9wdGlvbnMuZXZlbnRzX2xpc3Quc3BsaXQoJywnKQorICAgICAgICBmb3IgZXYgaW4gZXZlbnRzX2xpc3Q6CisgICAgICAgICAgICBldmNvZGUgPSBFdmVudHNDb2Rlcy5BTExfRkxBR1MuZ2V0KGV2LCAwKQorICAgICAgICAgICAgaWYgZXZjb2RlOgorICAgICAgICAgICAgICAgIG1hc2sgfD0gZXZjb2RlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHBhcnNlci5lcnJvcigiVGhlIGV2ZW50ICclcycgc3BlY2lmaWVkIHdpdGggb3B0aW9uIC1lIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGlzIG5vdCB2YWxpZCIgJSBldikKKyAgICBlbHNlOgorICAgICAgICBtYXNrID0gQUxMX0VWRU5UUworCisgICAgIyBzdGF0cworICAgIGNiX2Z1biA9IE5vbmUKKyAgICBpZiBvcHRpb25zLnN0YXRzOgorICAgICAgICBkZWYgY2Iocyk6CisgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKHJlcHIocy5wcm9jX2Z1bigpKSkKKyAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoJ1xuJykKKyAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoc3RyKHMucHJvY19mdW4oKSkpCisgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCdcbicpCisgICAgICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKKyAgICAgICAgY2JfZnVuID0gY2IKKworICAgICMgRXh0ZXJuYWwgY29tbWFuZAorICAgIGlmIG9wdGlvbnMuY29tbWFuZDoKKyAgICAgICAgZGVmIGNiKHMpOgorICAgICAgICAgICAgc3VicHJvY2Vzcy5Qb3BlbihvcHRpb25zLmNvbW1hbmQsIHNoZWxsPVRydWUpCisgICAgICAgIGNiX2Z1biA9IGNiCisKKyAgICBsb2cuZGVidWcoJ1N0YXJ0IG1vbml0b3JpbmcgJXMsIChwcmVzcyBjXmMgdG8gaGFsdCBweWlub3RpZnkpJyAlIHBhdGgpCisKKyAgICB3bS5hZGRfd2F0Y2gocGF0aCwgbWFzaywgcmVjPW9wdGlvbnMucmVjdXJzaXZlLCBhdXRvX2FkZD1vcHRpb25zLmF1dG9fYWRkLCBkb19nbG9iPW9wdGlvbnMuZ2xvYikKKyAgICAjIExvb3AgZm9yZXZlciAodW50aWwgc2lnaW50IHNpZ25hbCBnZXQgY2F1Z2h0KQorICAgIG5vdGlmaWVyLmxvb3AoY2FsbGJhY2s9Y2JfZnVuKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgY29tbWFuZF9saW5lKCkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvX19pbml0X18ucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbGxlY3Rvci9fX2luaXRfXy5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29sbGVjdG9yL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbGxlY3Rvci9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb2xsZWN0b3IvYWRtaW4ucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbGxlY3Rvci9hZG1pbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWY4NWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb2xsZWN0b3IvYWRtaW4ucHkKQEAgLTAsMCArMSwzMyBAQAorZnJvbSBkamFuZ28uY29udHJpYiBpbXBvcnQgYWRtaW4KK2Zyb20gZGphbmdvLmNvbnRyaWIuYWRtaW4uZmlsdGVycyBpbXBvcnQgUmVsYXRlZEZpZWxkTGlzdEZpbHRlcgorZnJvbSBvcm0ubW9kZWxzIGltcG9ydCBCaXRiYWtlVmVyc2lvbiwgUmVsZWFzZSwgTGF5ZXJTb3VyY2UsIFRvYXN0ZXJTZXR0aW5nCitmcm9tIGRqYW5nby5mb3Jtcy53aWRnZXRzIGltcG9ydCBUZXh0YXJlYQorZnJvbSBkamFuZ28gaW1wb3J0IGZvcm1zCitpbXBvcnQgZGphbmdvLmRiLm1vZGVscyBhcyBtb2RlbHMKKworZnJvbSBkamFuZ28uY29udHJpYi5hZG1pbiBpbXBvcnQgd2lkZ2V0cywgaGVscGVycworCitjbGFzcyBMYXllclNvdXJjZUFkbWluKGFkbWluLk1vZGVsQWRtaW4pOgorICAgIHBhc3MKKworY2xhc3MgQml0YmFrZVZlcnNpb25BZG1pbihhZG1pbi5Nb2RlbEFkbWluKToKKworICAgICMgd2Ugb3ZlcnJpZGUgdGhlIGZvcm1maWVsZCBmb3IgZGIgVVJMRmllbGQgYmVjYXVzZSBvZiBicm9rZW4gVVJMIHZhbGlkYXRpb24KKworICAgIGRlZiBmb3JtZmllbGRfZm9yX2RiZmllbGQoc2VsZiwgZGJfZmllbGQsICoqa3dhcmdzKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShkYl9maWVsZCwgbW9kZWxzLmZpZWxkcy5VUkxGaWVsZCk6CisgICAgICAgICAgICByZXR1cm4gZm9ybXMuZmllbGRzLkNoYXJGaWVsZCgpCisgICAgICAgIHJldHVybiBzdXBlcihCaXRiYWtlVmVyc2lvbkFkbWluLCBzZWxmKS5mb3JtZmllbGRfZm9yX2RiZmllbGQoZGJfZmllbGQsICoqa3dhcmdzKQorCisKKworY2xhc3MgUmVsZWFzZUFkbWluKGFkbWluLk1vZGVsQWRtaW4pOgorICAgIHBhc3MKKworY2xhc3MgVG9hc3RlclNldHRpbmdBZG1pbihhZG1pbi5Nb2RlbEFkbWluKToKKyAgICBwYXNzCisKK2FkbWluLnNpdGUucmVnaXN0ZXIoTGF5ZXJTb3VyY2UsIExheWVyU291cmNlQWRtaW4pCithZG1pbi5zaXRlLnJlZ2lzdGVyKEJpdGJha2VWZXJzaW9uLCBCaXRiYWtlVmVyc2lvbkFkbWluKQorYWRtaW4uc2l0ZS5yZWdpc3RlcihSZWxlYXNlLCBSZWxlYXNlQWRtaW4pCithZG1pbi5zaXRlLnJlZ2lzdGVyKFRvYXN0ZXJTZXR0aW5nLCBUb2FzdGVyU2V0dGluZ0FkbWluKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb2xsZWN0b3IvdXJscy5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29sbGVjdG9yL3VybHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ0Mzg3YgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29sbGVjdG9yL3VybHMucHkKQEAgLTAsMCArMSwyNiBAQAorIworIyBCaXRCYWtlIFRvYXN0ZXIgSW1wbGVtZW50YXRpb24KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDE0ICAgICAgICBJbnRlbCBDb3Jwb3JhdGlvbgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworCitmcm9tIGRqYW5nby5jb25mLnVybHMgaW1wb3J0IHBhdHRlcm5zLCBpbmNsdWRlLCB1cmwKK2Zyb20gZGphbmdvLnZpZXdzLmdlbmVyaWMgaW1wb3J0IFJlZGlyZWN0VmlldworCit1cmxwYXR0ZXJucyA9IHBhdHRlcm5zKCdibGRjb2xsZWN0b3Iudmlld3MnLAorICAgICAgICAjIGxhbmRpbmcgcG9pbnQgZm9yIHB1c2hpbmcgYSBiaXRiYWtlX2V2ZW50bG9nLmpzb24gZmlsZSB0byB0aGlzIHRvYXN0ZXIgaW5zdGFjZQorICAgICAgICB1cmwocideZXZlbnRmaWxlJCcsICdldmVudGZpbGUnLCBuYW1lPSdldmVudGZpbGUnKSwKKyAgICAgICAgKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb2xsZWN0b3Ivdmlld3MucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbGxlY3Rvci92aWV3cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzJmYTRkCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb2xsZWN0b3Ivdmlld3MucHkKQEAgLTAsMCArMSw2MiBAQAorIworIyBCaXRCYWtlIFRvYXN0ZXIgSW1wbGVtZW50YXRpb24KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDE0ICAgICAgICBJbnRlbCBDb3Jwb3JhdGlvbgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworZnJvbSBkamFuZ28udmlld3MuZGVjb3JhdG9ycy5jYWNoZSBpbXBvcnQgY2FjaGVfY29udHJvbAorZnJvbSBkamFuZ28uY29yZS51cmxyZXNvbHZlcnMgaW1wb3J0IHJldmVyc2UKK2Zyb20gZGphbmdvLmNvcmUucGFnaW5hdG9yIGltcG9ydCBQYWdpbmF0b3IsIEVtcHR5UGFnZSwgUGFnZU5vdEFuSW50ZWdlcgorZnJvbSBkamFuZ28uaHR0cCBpbXBvcnQgSHR0cFJlc3BvbnNlQmFkUmVxdWVzdCwgSHR0cFJlc3BvbnNlCitmcm9tIGRqYW5nby51dGlscyBpbXBvcnQgdGltZXpvbmUKK2Zyb20gZGphbmdvLnV0aWxzLmh0bWwgaW1wb3J0IGVzY2FwZQorZnJvbSBkYXRldGltZSBpbXBvcnQgdGltZWRlbHRhCitmcm9tIGRqYW5nby51dGlscyBpbXBvcnQgZm9ybWF0cworZnJvbSB0b2FzdGVyZ3VpLnRlbXBsYXRldGFncy5wcm9qZWN0dGFncyBpbXBvcnQganNvbiBhcyBqc29uZmlsdGVyCitpbXBvcnQganNvbgoraW1wb3J0IG9zCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgdG9hc3Rlcm1haW4KK2Zyb20gZGphbmdvLnZpZXdzLmRlY29yYXRvcnMuY3NyZiBpbXBvcnQgY3NyZl9leGVtcHQKKworCitAY3NyZl9leGVtcHQKK2RlZiBldmVudGZpbGUocmVxdWVzdCk6CisgICAgIiIiIFJlY2VpdmVzIGEgZmlsZSBieSBQT1NULCBhbmQgcnVucyB0b2FzdGVyLWV2ZW50cmVwbHkgb24gdGhpcyBmaWxlICIiIgorICAgIGlmIHJlcXVlc3QubWV0aG9kICE9ICJQT1NUIjoKKyAgICAgICAgcmV0dXJuIEh0dHBSZXNwb25zZUJhZFJlcXVlc3QoIlRoaXMgQVBJIG9ubHkgYWNjZXB0cyBQT1NUIHJlcXVlc3RzLiBQb3N0IGEgZmlsZSB3aXRoOlxuXG5jdXJsIC1GIGV2ZW50bG9nPUBiaXRiYWtlX2V2ZW50bG9nLmpzb24gJXNcbiIgJSByZXF1ZXN0LmJ1aWxkX2Fic29sdXRlX3VyaShyZXZlcnNlKCdldmVudGZpbGUnKSksIGNvbnRlbnRfdHlwZT0idGV4dC9wbGFpbjt1dGY4IikKKworICAgICMgd3JpdGUgdGVtcG9yYXJ5IGZpbGUKKyAgICAoaGFuZGxlLCBhYnN0ZW1wcGF0aCkgPSB0ZW1wZmlsZS5ta3N0ZW1wKGRpcj0iL3RtcC8iKQorICAgIHdpdGggb3MuZmRvcGVuKGhhbmRsZSwgInciKSBhcyB0bXBmaWxlOgorICAgICAgICBmb3IgY2h1bmsgaW4gcmVxdWVzdC5GSUxFU1snZXZlbnRsb2cnXS5jaHVua3MoKToKKyAgICAgICAgICAgIHRtcGZpbGUud3JpdGUoY2h1bmspCisgICAgdG1wZmlsZS5jbG9zZSgpCisKKyAgICAjIGNvbXB1dGUgdGhlIHBhdGggdG8gImJpdGJha2UvYmluL3RvYXN0ZXItZXZlbnRyZXBsYXkiCisgICAgZnJvbSBvcy5wYXRoIGltcG9ydCBkaXJuYW1lIGFzIEROCisgICAgaW1wb3J0X3NjcmlwdCA9IG9zLnBhdGguam9pbihETihETihETihETihvcy5wYXRoLmFic3BhdGgoX19maWxlX18pKSkpKSwgImJpbi90b2FzdGVyLWV2ZW50cmVwbGF5IikKKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoaW1wb3J0X3NjcmlwdCk6CisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigic2NyaXB0IG1pc3NpbmcgJXMiICUgaW1wb3J0X3NjcmlwdCkKKyAgICBzY3JpcHRlbnYgPSBvcy5lbnZpcm9uLmNvcHkoKQorICAgIHNjcmlwdGVudlsiREFUQUJBU0VfVVJMIl0gPSB0b2FzdGVybWFpbi5zZXR0aW5ncy5nZXREQVRBQkFTRV9VUkwoKQorCisgICAgIyBydW4gdGhlIGRhdGEgbG9hZGluZyBwcm9jZXNzIGFuZCByZXR1cm4gdGhlIHJlc3VsdHMKKyAgICBpbXBvcnRlciA9IHN1YnByb2Nlc3MuUG9wZW4oW2ltcG9ydF9zY3JpcHQsIGFic3RlbXBwYXRoXSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSwgZW52PXNjcmlwdGVudikKKyAgICAob3V0LCBlcnIpID0gaW1wb3J0ZXIuY29tbXVuaWNhdGUoKQorICAgIGlmIGltcG9ydGVyLnJldHVybmNvZGUgPT0gMDoKKyAgICAgICAgb3MucmVtb3ZlKGFic3RlbXBwYXRoKQorICAgIHJldHVybiBIdHRwUmVzcG9uc2UoIj09IFJldHZhbCAlZFxuPT0gU1RET1VUXG4lc1xuXG49PSBTVERFUlJcbiVzIiAlIChpbXBvcnRlci5yZXR1cm5jb2RlLCBvdXQsIGVyciksIGNvbnRlbnRfdHlwZT0idGV4dC9wbGFpbjt1dGY4IikKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC9fX2luaXRfXy5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvYWRtaW4ucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvYWRtaW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNiZTVmNQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC9hZG1pbi5weQpAQCAtMCwwICsxLDggQEAKK2Zyb20gZGphbmdvLmNvbnRyaWIgaW1wb3J0IGFkbWluCitmcm9tIGRqYW5nby5jb250cmliLmFkbWluLmZpbHRlcnMgaW1wb3J0IFJlbGF0ZWRGaWVsZExpc3RGaWx0ZXIKK2Zyb20gLm1vZGVscyBpbXBvcnQgQnVpbGRFbnZpcm9ubWVudAorCitjbGFzcyBCdWlsZEVudmlyb25tZW50QWRtaW4oYWRtaW4uTW9kZWxBZG1pbik6CisgICAgcGFzcworCithZG1pbi5zaXRlLnJlZ2lzdGVyKEJ1aWxkRW52aXJvbm1lbnQsIEJ1aWxkRW52aXJvbm1lbnRBZG1pbikKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC9iYmNvbnRyb2xsZXIucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvYmJjb250cm9sbGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNzBhYzgKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvYmJjb250cm9sbGVyLnB5CkBAIC0wLDAgKzEsMjAyIEBACisjCisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIworIyBCaXRCYWtlIFRvYXN0ZXIgSW1wbGVtZW50YXRpb24KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDE0ICAgICAgICBJbnRlbCBDb3Jwb3JhdGlvbgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCByZQorZnJvbSBkamFuZ28uZGIgaW1wb3J0IHRyYW5zYWN0aW9uCitmcm9tIGRqYW5nby5kYi5tb2RlbHMgaW1wb3J0IFEKK2Zyb20gYmxkY29udHJvbC5tb2RlbHMgaW1wb3J0IEJ1aWxkRW52aXJvbm1lbnQsIEJSTGF5ZXIsIEJSVmFyaWFibGUsIEJSVGFyZ2V0LCBCUkJpdGJha2UKKworIyBsb2FkIEJpdGJha2UgY29tcG9uZW50cworcGF0aCA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmFic3BhdGgoX19maWxlX18pKSkpKQorc3lzLnBhdGguaW5zZXJ0KDAsIHBhdGgpCitpbXBvcnQgYmIuc2VydmVyLnhtbHJwYworCitjbGFzcyBCaXRiYWtlQ29udHJvbGxlcihvYmplY3QpOgorICAgICIiIiBUaGlzIGlzIHRoZSBiYXNpYyBjbGFzcyB0aGF0IGNvbnRyb2xscyBhIGJpdGJha2Ugc2VydmVyLgorICAgICAgICBJdCBpcyBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIGNsYXNzIG9uIGhvdyB0aGUgc2VydmVyIGlzIHN0YXJ0ZWQgYW5kIGFxdWlyZWQKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25uZWN0aW9uKToKKyAgICAgICAgc2VsZi5jb25uZWN0aW9uID0gY29ubmVjdGlvbgorCisgICAgZGVmIF9ydW5Db21tYW5kKHNlbGYsIGNvbW1hbmQpOgorICAgICAgICByZXN1bHQsIGVycm9yID0gc2VsZi5jb25uZWN0aW9uLmNvbm5lY3Rpb24ucnVuQ29tbWFuZChjb21tYW5kKQorICAgICAgICBpZiBlcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbihlcnJvcikKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIGRpc2Nvbm5lY3Qoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmNvbm5lY3Rpb24ucmVtb3ZlQ2xpZW50KCkKKworICAgIGRlZiBzZXRWYXJpYWJsZShzZWxmLCBuYW1lLCB2YWx1ZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9ydW5Db21tYW5kKFsic2V0VmFyaWFibGUiLCBuYW1lLCB2YWx1ZV0pCisKKyAgICBkZWYgYnVpbGQoc2VsZiwgdGFyZ2V0cywgdGFzayA9IE5vbmUpOgorICAgICAgICBpZiB0YXNrIGlzIE5vbmU6CisgICAgICAgICAgICB0YXNrID0gImJ1aWxkIgorICAgICAgICByZXR1cm4gc2VsZi5fcnVuQ29tbWFuZChbImJ1aWxkVGFyZ2V0cyIsIHRhcmdldHMsIHRhc2tdKQorCisKKworZGVmIGdldEJ1aWxkRW52aXJvbm1lbnRDb250cm9sbGVyKCoqa3dhcmdzKToKKyAgICAiIiIgR2V0cyB5b3UgYSBCdWlsZEVudmlyb25tZW50Q29udHJvbGxlciB0aGF0IGVuY2Fwc3VsYXRlcyBhIGJ1aWxkIGVudmlyb25tZW50LAorICAgICAgICBiYXNlZCBvbiB0aGUgcXVlcnkgZGljdGlvbmFyeSBzZW50IGluLgorCisgICAgICAgIFRoaXMgaXMgdXNlZCB0byByZXRyaWV2ZSwgZm9yIGV4YW1wbGUsIHRoZSBjdXJyZW50bHkgcnVubmluZyBCRSBmcm9tIGluc2lkZQorICAgICAgICB0aGUgdG9hc3RlciBVSSwgb3IgZmluZCBhIG5ldyBCRSB0byBzdGFydCBhIG5ldyBidWlsZCBpbiBpdC4KKworICAgICAgICBUaGUgcmV0dXJuIG9iamVjdCBNVVNUIGFsd2F5cyBiZSBhIEJ1aWxkRW52aXJvbm1lbnRDb250cm9sbGVyLgorICAgICIiIgorCisgICAgZnJvbSBsb2NhbGhvc3RiZWNvbnRyb2xsZXIgaW1wb3J0IExvY2FsaG9zdEJFQ29udHJvbGxlcgorICAgIGZyb20gc3NoYmVjb250cm9sbGVyICAgIGltcG9ydCBTU0hCRUNvbnRyb2xsZXIKKworICAgIGJlID0gQnVpbGRFbnZpcm9ubWVudC5vYmplY3RzLmZpbHRlcihRKCoqa3dhcmdzKSlbMF0KKyAgICBpZiBiZS5iZXR5cGUgPT0gQnVpbGRFbnZpcm9ubWVudC5UWVBFX0xPQ0FMOgorICAgICAgICByZXR1cm4gTG9jYWxob3N0QkVDb250cm9sbGVyKGJlKQorICAgIGVsaWYgYmUuYmV0eXBlID09IEJ1aWxkRW52aXJvbm1lbnQuVFlQRV9TU0g6CisgICAgICAgIHJldHVybiBTU0hCRUNvbnRyb2xsZXIoYmUpCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJGSVhNRTogSW1wbGVtZW50IEJFQyBmb3IgdHlwZSAlcyIgJSBzdHIoYmUuYmV0eXBlKSkKKworCitjbGFzcyBCdWlsZEVudmlyb25tZW50Q29udHJvbGxlcihvYmplY3QpOgorICAgICIiIiBCdWlsZEVudmlyb25tZW50Q29udHJvbGxlciAoQkVDKSBpcyB0aGUgYWJzdHJhY3QgY2xhc3MgdGhhdCBkZWZpbmVzIHRoZSBvcGVyYXRpb25zIHRoYXQgTVVTVAorICAgICAgICBvciBTSE9VTEQgYmUgc3VwcG9ydGVkIGJ5IGEgQnVpbGQgRW52aXJvbm1lbnQuIEl0IGlzIHVzZWQgdG8gZXN0YWJsaXNoIHRoZSBmcmFtZXdvcmssIGFuZCBtdXN0CisgICAgICAgIG5vdCBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHkgYnkgdGhlIHVzZXIuCisKKyAgICAgICAgVXNlIHRoZSAiZ2V0QnVpbGRFbnZpcm9ubWVudENvbnRyb2xsZXIoKSIgZnVuY3Rpb24gdG8gZ2V0IGEgd29ya2luZyBCRUMgZm9yIHlvdXIgcmVtb3RlLgorCisgICAgICAgIEhvdyB0aGUgQnVpbGRFbnZpcm9ubWVudHMgYXJlIGRpc2NvdmVyZWQgaXMgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBjbGFzcy4KKworICAgICAgICBZb3UgbXVzdCBkZXJpdmUgdGhpcyBjbGFzcyB0byB0ZWFjaCBUb2FzdGVyIGhvdyB0byBvcGVyYXRlIGluIHlvdXIgb3duIGluZnJhc3RydWN0dXJlLgorICAgICAgICBXZSBwcm92aWRlIHNvbWUgc3BlY2lmaWMgQnVpbGRFbnZpcm9ubWVudENvbnRyb2xsZXIgY2xhc3NlcyB0aGF0IGNhbiBiZSB1c2VkIGVpdGhlciB0bworICAgICAgICBkaXJlY3RseSBzZXQtdXAgVG9hc3RlciBpbmZyYXN0cnVjdHVyZSwgb3IgYXMgYSBtb2RlbCBmb3IgeW91ciBvd24gaW5mcmFzdHJ1Y3R1cmUgc2V0OgorCisgICAgICAgICAgICAqIExvY2FsaG9zdCBjb250cm9sbGVyIHdpbGwgcnVuIHRoZSBUb2FzdGVyIEJFIG9uIHRoZSBzYW1lIGFjY291bnQgYXMgdGhlIHdlYiBzZXJ2ZXIKKyAgICAgICAgKGN1cnJlbnQgdXNlciBpZiB5b3UgYXJlIHVzaW5nIHRoZSB0aGUgRGphbmdvIGRldmVsb3BtZW50IHdlYiBzZXJ2ZXIpCisgICAgICAgIG9uIHRoZSBsb2NhbCBtYWNoaW5lLCB3aXRoIHRoZSAiYnVpbGQvIiBkaXJlY3RvcnkgdW5kZXIgdGhlICJwb2t5LyIgc291cmNlIGNoZWNrb3V0IGRpcmVjdG9yeS4KKyAgICAgICAgQmFzaCBpcyBleHBlY3RlZCB0byBiZSBhdmFpbGFibGUuCisKKyAgICAgICAgICAgICogU1NIIGNvbnRyb2xsZXIgd2lsbCBydW4gdGhlIFRvYXN0ZXIgQkUgb24gYSByZW1vdGUgbWFjaGluZSwgd2hlcmUgdGhlIGN1cnJlbnQgdXNlcgorICAgICAgICBjYW4gY29ubmVjdCB3aXRob3V0IHJhaXNlIEV4Y2VwdGlvbigiRklYTUU6IGltcGxlbWVudCIpd29yZCAoc2V0IHVwIHdpdGggZWl0aGVyIHNzaC1hZ2VudCBvciByYWlzZSBFeGNlcHRpb24oIkZJWE1FOiBpbXBsZW1lbnQiKXBocmFzZS1sZXNzIGtleSBhdXRoZW50aWNhdGlvbikKKworICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBiZSk6CisgICAgICAgICIiIiBUYWtlcyBhIEJ1aWxkRW52aXJvbm1lbnQgb2JqZWN0IGFzIHBhcmFtZXRlciB0aGF0IHBvaW50cyB0byB0aGUgc2V0dGluZ3Mgb2YgdGhlIEJFLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5iZSA9IGJlCisgICAgICAgIHNlbGYuY29ubmVjdGlvbiA9IE5vbmUKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX3VwZGF0ZUJCTGF5ZXJzKGJibGF5ZXJjb25mLCBsYXllcmxpc3QpOgorICAgICAgICBjb25mbGluZXMgPSBvcGVuKGJibGF5ZXJjb25mLCAiciIpLnJlYWRsaW5lcygpCisKKyAgICAgICAgYmJsYXllcmNvbmZmaWxlID0gb3BlbihiYmxheWVyY29uZiwgInciKQorICAgICAgICBza2lwID0gMAorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UobGVuKGNvbmZsaW5lcykpOgorICAgICAgICAgICAgaWYgc2tpcCA+IDA6CisgICAgICAgICAgICAgICAgc2tpcCA9LSAxCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGNvbmZsaW5lc1tpXS5zdGFydHN3aXRoKCIjIGxpbmUgYWRkZWQgYnkgdG9hc3RlciIpOgorICAgICAgICAgICAgICAgIHNraXAgPSAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGJibGF5ZXJjb25mZmlsZS53cml0ZShjb25mbGluZXNbaV0pCisKKyAgICAgICAgYmJsYXllcmNvbmZmaWxlLndyaXRlKCIjIGxpbmUgYWRkZWQgYnkgdG9hc3RlciBidWlsZCBjb250cm9sXG5CQkxBWUVSUyA9IFwiIiArICIgIi5qb2luKGxheWVybGlzdCkgKyAiXCIiKQorICAgICAgICBiYmxheWVyY29uZmZpbGUuY2xvc2UoKQorCisKKyAgICBkZWYgd3JpdGVDb25mRmlsZShzZWxmLCB2YXJpYWJsZV9saXN0ID0gTm9uZSwgcmF3ID0gTm9uZSk6CisgICAgICAgICIiIiBXcml0ZXMgYSBjb25maWd1cmF0aW9uIGZpbGUgaW4gdGhlIGJ1aWxkIGRpcmVjdG9yeS4gT3ZlcnJpZGUgd2l0aCBidWlsZGVudi1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbi4gIiIiCisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiRklYTUU6IE11c3Qgb3ZlcnJpZGUgdG8gYWN0dWFsbHkgd3JpdGUgYSBjb25maWd1cmF0aW9uIGZpbGUiKQorCisKKyAgICBkZWYgc3RhcnRCQlNlcnZlcihzZWxmKToKKyAgICAgICAgIiIiIFN0YXJ0cyBhICBCQiBzZXJ2ZXIgd2l0aCBUb2FzdGVyIHRvYXN0ZXJ1aSBzZXQgdXAgdG8gcmVjb3JkIHRoZSBidWlsZHMsIGFuIG5vIGNvbnRyb2xsaW5nIFVJLgorICAgICAgICAgICAgQWZ0ZXIgdGhpcyBtZXRob2QgZXhlY3V0ZXMsIHNlbGYuYmUgYmJhZGRyZXNzL2JicG9ydCBNVVNUIHBvaW50IHRvIGEgcnVubmluZyBhbmQgZnJlZSBzZXJ2ZXIsCisgICAgICAgICAgICBhbmQgdGhlIGJic3RhdGUgTVVTVCBiZSAgdXBkYXRlZCB0byAic3RhcnRlZCIuCisgICAgICAgICIiIgorICAgICAgICByYWlzZSBFeGNlcHRpb24oIkZJWE1FOiBNdXN0IG92ZXJyaWRlIGluIG9yZGVyIHRvIGFjdHVhbGx5IHN0YXJ0IHRoZSBCQiBzZXJ2ZXIiKQorCisgICAgZGVmIHN0b3BCQlNlcnZlcihzZWxmKToKKyAgICAgICAgIiIiIFN0b3BzIHRoZSBjdXJyZW50bHkgcnVubmluZyBCQiBzZXJ2ZXIuCisgICAgICAgICAgICBUaGUgYmJzdGF0ZSBNVVNUIGJlIHVwZGF0ZWQgdG8gInN0b3BwZWQiLgorICAgICAgICAgICAgc2VsZi5jb25uZWN0aW9uIG11c3QgYmUgbm9uZS4KKyAgICAgICAgIiIiCisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiRklYTUU6IE11c3Qgb3ZlcnJpZGUgc3RvQkJTZXJ2ZXIiKQorCisgICAgZGVmIHNldExheWVycyhzZWxmLCBiYnMsIGxzKToKKyAgICAgICAgIiIiIENoZWNrcy1vdXQgYml0YmFrZSBleGVjdXRvciBhbmQgbGF5ZXJzIGZyb20gZ2l0IHJlcG9zaXRvcmllcy4KKyAgICAgICAgICAgIFNldHMgdGhlIGxheWVyIHZhcmlhYmxlcyBpbiB0aGUgY29uZmlnIGZpbGUsIGFmdGVyIHZhbGlkYXRpbmcgbG9jYWwgbGF5ZXIgcGF0aHMuCisgICAgICAgICAgICBUaGUgYml0YmFrZXMgbXVzdCBiZSBhIDEtbGVuZ3RoIGxpc3Qgb2YgQlJCaXRiYWtlCisgICAgICAgICAgICBUaGUgbGF5ZXIgcGF0aHMgbXVzdCBiZSBpbiBhIGxpc3Qgb2YgQlJMYXllciBvYmplY3QKKworICAgICAgICAgICAgYSB3b3JkIG9mIGF0dGVudGlvbjogYnkgY29udmVudGlvbiwgdGhlIGZpcnN0IGxheWVyIGZvciBhbnkgYnVpbGQgd2lsbCBiZSBwb2t5IQorICAgICAgICAiIiIKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJGSVhNRTogTXVzdCBvdmVycmlkZSBzZXRMYXllcnMiKQorCisKKyAgICBkZWYgZ2V0QkJDb250cm9sbGVyKHNlbGYpOgorICAgICAgICAiIiIgcmV0dXJucyBhIEJpdGJha2VDb250cm9sbGVyIHRvIGFuIGFscmVhZHkgc3RhcnRlZCBzZXJ2ZXI7IHRoaXMgaXMgdGhlIHBvaW50IHdoZXJlIHRoZSBzZXJ2ZXIKKyAgICAgICAgICAgIHN0YXJ0cyBpZiBuZWVkZWQ7IG9yIHJlY29ubmVjdHMgdG8gdGhlIHNlcnZlciBpZiB3ZSBjYW4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBzZWxmLmNvbm5lY3Rpb246CisgICAgICAgICAgICBzZWxmLnN0YXJ0QkJTZXJ2ZXIoKQorICAgICAgICAgICAgc2VsZi5iZS5sb2NrID0gQnVpbGRFbnZpcm9ubWVudC5MT0NLX1JVTk5JTkcKKyAgICAgICAgICAgIHNlbGYuYmUuc2F2ZSgpCisKKyAgICAgICAgc2VydmVyID0gYmIuc2VydmVyLnhtbHJwYy5CaXRCYWtlWE1MUlBDQ2xpZW50KCkKKyAgICAgICAgc2VydmVyLmluaXRTZXJ2ZXIoKQorICAgICAgICBzZXJ2ZXIuc2F2ZUNvbm5lY3Rpb25EZXRhaWxzKCIlczolcyIgJSAoc2VsZi5iZS5iYmFkZHJlc3MsIHNlbGYuYmUuYmJwb3J0KSkKKyAgICAgICAgc2VsZi5jb25uZWN0aW9uID0gc2VydmVyLmVzdGFibGlzaENvbm5lY3Rpb24oW10pCisKKyAgICAgICAgc2VsZi5iZS5iYnRva2VuID0gc2VsZi5jb25uZWN0aW9uLnRyYW5zcG9ydC5jb25uZWN0aW9uX3Rva2VuCisgICAgICAgIHNlbGYuYmUuc2F2ZSgpCisKKyAgICAgICAgcmV0dXJuIEJpdGJha2VDb250cm9sbGVyKHNlbGYuY29ubmVjdGlvbikKKworICAgIGRlZiBnZXRBcnRpZmFjdChzZWxmLCBwYXRoKToKKyAgICAgICAgIiIiIFRoaXMgY2FsbCByZXR1cm5zIGFuIGFydGlmYWN0IGlkZW50aWZpZWQgYnkgdGhlICdwYXRoJy4gSG93ICdwYXRoJyBpcyBpbnRlcnByZXRlZCBhcworICAgICAgICAgICAgdXAgdG8gdGhlIGltcGxlbWVudGluZyBCRUMuIFRoZSByZXR1cm4gTVVTVCBiZSBhIFJFU1QgVVJMIHdoZXJlIGEgR0VUIHdpbGwgYWN0dWFsbHkgcmV0dXJuCisgICAgICAgICAgICB0aGUgY29udGVudCBvZiB0aGUgYXJ0aWZhY3QsIGUuZy4gZm9yIHVzZSBhcyBhICJkb3dubG9hZCBsaW5rIiBpbiBhIHdlYiBVSS4KKyAgICAgICAgIiIiCisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiTXVzdCByZXR1cm4gdGhlIFJFU1QgVVJMIG9mIHRoZSBhcnRpZmFjdCIpCisKKyAgICBkZWYgcmVsZWFzZShzZWxmKToKKyAgICAgICAgIiIiIFRoaXMgc3RvcHMgdGhlIHNlcnZlciBhbmQgcmVsZWFzZXMgYW55IHJlc291cmNlcy4gQWZ0ZXIgdGhpcyBwb2ludCwgYWxsIHJlc291cmNlcworICAgICAgICAgICAgYXJlIHVuLWF2YWlsYWJsZSBmb3IgZnVydGhlciByZWZlcmVuY2UKKyAgICAgICAgIiIiCisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiTXVzdCBvdmVycmlkZSBCRSByZWxlYXNlIikKKworICAgIGRlZiB0cmlnZ2VyQnVpbGQoc2VsZiwgYml0YmFrZSwgbGF5ZXJzLCB2YXJpYWJsZXMsIHRhcmdldHMpOgorICAgICAgICByYWlzZSBFeGNlcHRpb24oIk11c3Qgb3ZlcnJpZGUgQkUgcmVsZWFzZSIpCisKK2NsYXNzIFNoZWxsQ21kRXhjZXB0aW9uKEV4Y2VwdGlvbik6CisgICAgcGFzcworCisKK2NsYXNzIEJ1aWxkU2V0dXBFeGNlcHRpb24oRXhjZXB0aW9uKToKKyAgICBwYXNzCisKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC9sb2NhbGhvc3RiZWNvbnRyb2xsZXIucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvbG9jYWxob3N0YmVjb250cm9sbGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5OTA5YjgKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvbG9jYWxob3N0YmVjb250cm9sbGVyLnB5CkBAIC0wLDAgKzEsMzM2IEBACisjCisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIworIyBCaXRCYWtlIFRvYXN0ZXIgSW1wbGVtZW50YXRpb24KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDE0ICAgICAgICBJbnRlbCBDb3Jwb3JhdGlvbgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCByZQorZnJvbSBkamFuZ28uZGIgaW1wb3J0IHRyYW5zYWN0aW9uCitmcm9tIGRqYW5nby5kYi5tb2RlbHMgaW1wb3J0IFEKK2Zyb20gYmxkY29udHJvbC5tb2RlbHMgaW1wb3J0IEJ1aWxkRW52aXJvbm1lbnQsIEJSTGF5ZXIsIEJSVmFyaWFibGUsIEJSVGFyZ2V0LCBCUkJpdGJha2UKK2ltcG9ydCBzdWJwcm9jZXNzCisKK2Zyb20gdG9hc3Rlcm1haW4gaW1wb3J0IHNldHRpbmdzCisKK2Zyb20gYmJjb250cm9sbGVyIGltcG9ydCBCdWlsZEVudmlyb25tZW50Q29udHJvbGxlciwgU2hlbGxDbWRFeGNlcHRpb24sIEJ1aWxkU2V0dXBFeGNlcHRpb24KKworaW1wb3J0IGxvZ2dpbmcKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJ0b2FzdGVyIikKKworZnJvbSBwcHJpbnQgaW1wb3J0IHBwcmludCwgcGZvcm1hdAorCitjbGFzcyBMb2NhbGhvc3RCRUNvbnRyb2xsZXIoQnVpbGRFbnZpcm9ubWVudENvbnRyb2xsZXIpOgorICAgICIiIiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgQnVpbGRFbnZpcm9ubWVudENvbnRyb2xsZXIgZm9yIHRoZSBsb2NhbGhvc3Q7CisgICAgICAgIHRoaXMgY29udHJvbGxlciBtYW5hZ2VzIHRoZSBkZWZhdWx0IGJ1aWxkIGRpcmVjdG9yeSwKKyAgICAgICAgdGhlIHNlcnZlciBzZXR1cCBhbmQgc3lzdGVtIHN0YXJ0IGFuZCBzdG9wIGZvciB0aGUgbG9jYWxob3N0LXR5cGUgYnVpbGQgZW52aXJvbm1lbnQKKworICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGJlKToKKyAgICAgICAgc3VwZXIoTG9jYWxob3N0QkVDb250cm9sbGVyLCBzZWxmKS5fX2luaXRfXyhiZSkKKyAgICAgICAgc2VsZi5kYnVybCA9IHNldHRpbmdzLmdldERBVEFCQVNFX1VSTCgpCisgICAgICAgIHNlbGYucG9reWRpcm5hbWUgPSBOb25lCisgICAgICAgIHNlbGYuaXNsYXllcnNldCA9IEZhbHNlCisKKyAgICBkZWYgX3NoZWxsY21kKHNlbGYsIGNvbW1hbmQsIGN3ZCA9IE5vbmUpOgorICAgICAgICBpZiBjd2QgaXMgTm9uZToKKyAgICAgICAgICAgIGN3ZCA9IHNlbGYuYmUuc291cmNlZGlyCisKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCJsYmNfc2hlbGxjbW1kOiAoJXMpICVzIiAlIChjd2QsIGNvbW1hbmQpKQorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihjb21tYW5kLCBjd2QgPSBjd2QsIHNoZWxsPVRydWUsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIChvdXQsZXJyKSA9IHAuY29tbXVuaWNhdGUoKQorICAgICAgICBwLndhaXQoKQorICAgICAgICBpZiBwLnJldHVybmNvZGU6CisgICAgICAgICAgICBpZiBsZW4oZXJyKSA9PSAwOgorICAgICAgICAgICAgICAgIGVyciA9ICJjb21tYW5kOiAlcyBcbiVzIiAlIChjb21tYW5kLCBvdXQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGVyciA9ICJjb21tYW5kOiAlcyBcbiVzIiAlIChjb21tYW5kLCBlcnIpCisgICAgICAgICAgICBsb2dnZXIud2FybigibG9jYWxob3N0YmVjb250cm9sbGVyOiBzaGVsbGNtZCBlcnJvciAlcyIgJSBlcnIpCisgICAgICAgICAgICByYWlzZSBTaGVsbENtZEV4Y2VwdGlvbihlcnIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsb2dnZXIuZGVidWcoImxvY2FsaG9zdGJlY29udHJvbGxlcjogc2hlbGxjbWQgc3VjY2VzcyIpCisgICAgICAgICAgICByZXR1cm4gb3V0CisKKyAgICBkZWYgX3NldHVwQkUoc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnBva3lkaXJuYW1lIGFuZCBvcy5wYXRoLmV4aXN0cyhzZWxmLnBva3lkaXJuYW1lKQorICAgICAgICBwYXRoID0gc2VsZi5iZS5idWlsZGRpcgorICAgICAgICBpZiBub3QgcGF0aDoKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiSW52YWxpZCBwYXRoIGNyZWF0aW9uIHNwZWNpZmllZC4iKQorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocGF0aCk6CisgICAgICAgICAgICBvcy5tYWtlZGlycyhwYXRoLCAwNzU1KQorICAgICAgICBzZWxmLl9zaGVsbGNtZCgiYmFzaCAtYyBcInNvdXJjZSAlcy9vZS1pbml0LWJ1aWxkLWVudiAlc1wiIiAlIChzZWxmLnBva3lkaXJuYW1lLCBwYXRoKSkKKyAgICAgICAgIyBkZWxldGUgdGhlIHRlbXBsYXRlY29uZi5jZmc7IGl0IG1heSBjb21lIGZyb20gYW4gdW5zdXBwb3J0ZWQgbGF5ZXIgY29uZmlndXJhdGlvbgorICAgICAgICBvcy5yZW1vdmUob3MucGF0aC5qb2luKHBhdGgsICJjb25mL3RlbXBsYXRlY29uZi5jZmciKSkKKworCisgICAgZGVmIHdyaXRlQ29uZkZpbGUoc2VsZiwgZmlsZV9uYW1lLCB2YXJpYWJsZV9saXN0ID0gTm9uZSwgcmF3ID0gTm9uZSk6CisgICAgICAgIGZpbGVwYXRoID0gb3MucGF0aC5qb2luKHNlbGYuYmUuYnVpbGRkaXIsIGZpbGVfbmFtZSkKKyAgICAgICAgd2l0aCBvcGVuKGZpbGVwYXRoLCAidyIpIGFzIGNvbmZmaWxlOgorICAgICAgICAgICAgaWYgdmFyaWFibGVfbGlzdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBmb3IgaSBpbiB2YXJpYWJsZV9saXN0OgorICAgICAgICAgICAgICAgICAgICBjb25mZmlsZS53cml0ZSgiJXM9XCIlc1wiXG4iICUgKGkubmFtZSwgaS52YWx1ZSkpCisgICAgICAgICAgICBpZiByYXcgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgY29uZmZpbGUud3JpdGUocmF3KQorCisKKyAgICBkZWYgc3RhcnRCQlNlcnZlcihzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYucG9reWRpcm5hbWUgYW5kIG9zLnBhdGguZXhpc3RzKHNlbGYucG9reWRpcm5hbWUpCisgICAgICAgIGFzc2VydCBzZWxmLmlzbGF5ZXJzZXQKKworICAgICAgICAjIGZpbmQgb3VyIG93biB0b2FzdGVydWkgbGlzdGVuZXIvYml0YmFrZQorICAgICAgICBmcm9tIHRvYXN0ZXIuYmxkY29udHJvbC5tYW5hZ2VtZW50LmNvbW1hbmRzLmxvYWRjb25mIGltcG9ydCBfcmVkdWNlX2Nhbm9uX3BhdGgKKworICAgICAgICBvd25fYml0YmFrZSA9IF9yZWR1Y2VfY2Fub25fcGF0aChvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChfX2ZpbGVfXykpLCAiLi4vLi4vLi4vYmluL2JpdGJha2UiKSkKKworICAgICAgICBhc3NlcnQgb3MucGF0aC5leGlzdHMob3duX2JpdGJha2UpIGFuZCBvcy5wYXRoLmlzZmlsZShvd25fYml0YmFrZSkKKworICAgICAgICBsb2dnZXIuZGVidWcoImxvY2FsaG9zdGJlY29udHJvbGxlcjogcnVubmluZyB0aGUgbGlzdGVuZXIgYXQgJXMiICUgb3duX2JpdGJha2UpCisKKyAgICAgICAgdG9hc3Rlcl91aV9sb2dfZmlsZXBhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5iZS5idWlsZGRpciwgInRvYXN0ZXJfdWkubG9nIikKKyAgICAgICAgIyBnZXQgdGhlIGZpbGUgbGVuZ3RoOyB3ZSBuZWVkIHRvIGRldGVjdCB0aGUgX2xhc3RfIHN0YXJ0IG9mIHRoZSB0b2FzdGVyIFVJLCBub3QgdGhlIGZpcnN0CisgICAgICAgIHRvYXN0ZXJfdWlfbG9nX2ZpbGVsZW5ndGggPSAwCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHRvYXN0ZXJfdWlfbG9nX2ZpbGVwYXRoKToKKyAgICAgICAgICAgIHdpdGggb3Blbih0b2FzdGVyX3VpX2xvZ19maWxlcGF0aCwgInciKSBhcyBmOgorICAgICAgICAgICAgICAgIGYuc2VlaygwLCAyKSAgICAjIGp1bXAgdG8gdGhlIGVuZAorICAgICAgICAgICAgICAgIHRvYXN0ZXJfdWlfbG9nX2ZpbGVsZW5ndGggPSBmLnRlbGwoKQorCisgICAgICAgIGNtZCA9ICJiYXNoIC1jIFwic291cmNlICVzL29lLWluaXQtYnVpbGQtZW52ICVzIDI+JjEgPnRvYXN0ZXJfc2VydmVyLmxvZyAmJiBiaXRiYWtlIC0tcmVhZCAlcy9jb25mL3RvYXN0ZXItcHJlLmNvbmYgLS1wb3N0cmVhZCAlcy9jb25mL3RvYXN0ZXIuY29uZiAtLXNlcnZlci1vbmx5IC10IHhtbHJwYyAtQiAwLjAuMC4wOjAgMj4mMSA+PnRvYXN0ZXJfc2VydmVyLmxvZyBcIiIgJSAoc2VsZi5wb2t5ZGlybmFtZSwgc2VsZi5iZS5idWlsZGRpciwgc2VsZi5iZS5idWlsZGRpciwgc2VsZi5iZS5idWlsZGRpcikKKworICAgICAgICBwb3J0ID0gIi0xIgorICAgICAgICBsb2dnZXIuZGVidWcoImxvY2FsaG9zdGJlY29udHJvbGxlcjogc3RhcnRpbmcgYnVpbGRlciBcbiVzXG4iICUgY21kKQorCisgICAgICAgIGNtZG91dHB1dCA9IHNlbGYuX3NoZWxsY21kKGNtZCkKKyAgICAgICAgd2l0aCBvcGVuKHNlbGYuYmUuYnVpbGRkaXIgKyAiL3RvYXN0ZXJfc2VydmVyLmxvZyIsICJyIikgYXMgZjoKKyAgICAgICAgICAgIGZvciBpIGluIGYucmVhZGxpbmVzKCk6CisgICAgICAgICAgICAgICAgaWYgaS5zdGFydHN3aXRoKCJCaXRiYWtlIHNlcnZlciBhZGRyZXNzIik6CisgICAgICAgICAgICAgICAgICAgIHBvcnQgPSBpLnNwbGl0KCIgIilbLTFdCisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygibG9jYWxob3N0YmVjb250cm9sbGVyOiBGb3VuZCBiaXRiYWtlIHNlcnZlciBwb3J0ICVzIiAlIHBvcnQpCisKKyAgICAgICAgY21kID0gImJhc2ggLWMgXCJzb3VyY2UgJXMvb2UtaW5pdC1idWlsZC1lbnYtbWVtcmVzIC0xICVzICYmIERBVEFCQVNFX1VSTD0lcyAlcyAtLW9ic2VydmUtb25seSAtdSB0b2FzdGVydWkgLS1yZW1vdGUtc2VydmVyPTAuMC4wLjA6LTEgLXQgeG1scnBjXCIiICUgKHNlbGYucG9reWRpcm5hbWUsIHNlbGYuYmUuYnVpbGRkaXIsIHNlbGYuZGJ1cmwsIG93bl9iaXRiYWtlKQorICAgICAgICB3aXRoIG9wZW4odG9hc3Rlcl91aV9sb2dfZmlsZXBhdGgsICJhKyIpIGFzIGY6CisgICAgICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihjbWQsIGN3ZCA9IHNlbGYuYmUuYnVpbGRkaXIsIHNoZWxsPVRydWUsIHN0ZG91dD1mLCBzdGRlcnI9ZikKKworICAgICAgICBkZWYgX3RvYXN0ZXJfdWlfc3RhcnRlZChmaWxlcGF0aCwgZmlsZXBvcyA9IDApOgorICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGZpbGVwYXRoKToKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgIHdpdGggb3BlbihmaWxlcGF0aCwgInIiKSBhcyBmOgorICAgICAgICAgICAgICAgIGYuc2VlayhmaWxlcG9zKQorICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIGY6CisgICAgICAgICAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgiTk9URTogVG9hc3RlclVJIHdhaXRpbmcgZm9yIGV2ZW50cyIpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIHJldHJpZXMgPSAwCisgICAgICAgIHN0YXJ0ZWQgPSBGYWxzZQorICAgICAgICB3aGlsZSBub3Qgc3RhcnRlZCBhbmQgcmV0cmllcyA8IDUwOgorICAgICAgICAgICAgc3RhcnRlZCA9IF90b2FzdGVyX3VpX3N0YXJ0ZWQodG9hc3Rlcl91aV9sb2dfZmlsZXBhdGgsIHRvYXN0ZXJfdWlfbG9nX2ZpbGVsZW5ndGgpCisgICAgICAgICAgICBpbXBvcnQgdGltZQorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJsb2NhbGhvc3RiZWNvbnRyb2xsZXI6IFdhaXRpbmcgYml0YmFrZSBzZXJ2ZXIgdG8gc3RhcnQiKQorICAgICAgICAgICAgdGltZS5zbGVlcCgwLjUpCisgICAgICAgICAgICByZXRyaWVzICs9IDEKKworICAgICAgICBpZiBub3Qgc3RhcnRlZDoKKyAgICAgICAgICAgIHRvYXN0ZXJfdWlfbG9nID0gb3Blbihvcy5wYXRoLmpvaW4oc2VsZi5iZS5idWlsZGRpciwgInRvYXN0ZXJfdWkubG9nIiksICJyIikucmVhZCgpCisgICAgICAgICAgICB0b2FzdGVyX3NlcnZlcl9sb2cgPSBvcGVuKG9zLnBhdGguam9pbihzZWxmLmJlLmJ1aWxkZGlyLCAidG9hc3Rlcl9zZXJ2ZXIubG9nIiksICJyIikucmVhZCgpCisgICAgICAgICAgICByYWlzZSBCdWlsZFNldHVwRXhjZXB0aW9uKCJsb2NhbGhvc3RiZWNvbnRyb2xsZXI6IEJpdGJha2Ugc2VydmVyIGRpZCBub3Qgc3RhcnQgaW4gMjUgc2Vjb25kcywgYWJvcnRpbmcgKEVycm9yOiAnJXMnICclcycpIiAlICh0b2FzdGVyX3VpX2xvZywgdG9hc3Rlcl9zZXJ2ZXJfbG9nKSkKKworICAgICAgICBsb2dnZXIuZGVidWcoImxvY2FsaG9zdGJlY29udHJvbGxlcjogU3RhcnRlZCBiaXRiYWtlIHNlcnZlciIpCisKKyAgICAgICAgd2hpbGUgcG9ydCA9PSAiLTEiOgorICAgICAgICAgICAgIyB0aGUgcG9ydCBzcGVjaWZpY2F0aW9uIGlzICJhdXRvZGV0ZWN0IjsgcmVhZCB0aGUgYml0YmFrZS5sb2NrIGZpbGUKKyAgICAgICAgICAgIHdpdGggb3BlbigiJXMvYml0YmFrZS5sb2NrIiAlIHNlbGYuYmUuYnVpbGRkaXIsICJyIikgYXMgZjoKKyAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBmLnJlYWRsaW5lcygpOgorICAgICAgICAgICAgICAgICAgICBpZiAiOiIgaW4gbGluZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQgPSBsaW5lLnNwbGl0KCI6IilbMV0uc3RyaXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJsb2NhbGhvc3RiZWNvbnRyb2xsZXI6IEF1dG9kZXRlY3RlZCBiaXRiYWtlIHBvcnQgJXMiLCBwb3J0KQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICBhc3NlcnQgc2VsZi5iZS5zb3VyY2VkaXIgYW5kIG9zLnBhdGguZXhpc3RzKHNlbGYuYmUuYnVpbGRkaXIpCisgICAgICAgIHNlbGYuYmUuYmJhZGRyZXNzID0gImxvY2FsaG9zdCIKKyAgICAgICAgc2VsZi5iZS5iYnBvcnQgPSBwb3J0CisgICAgICAgIHNlbGYuYmUuYmJzdGF0ZSA9IEJ1aWxkRW52aXJvbm1lbnQuU0VSVkVSX1NUQVJURUQKKyAgICAgICAgc2VsZi5iZS5zYXZlKCkKKworICAgIGRlZiBzdG9wQkJTZXJ2ZXIoc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnBva3lkaXJuYW1lIGFuZCBvcy5wYXRoLmV4aXN0cyhzZWxmLnBva3lkaXJuYW1lKQorICAgICAgICBhc3NlcnQgc2VsZi5pc2xheWVyc2V0CisgICAgICAgIHNlbGYuX3NoZWxsY21kKCJiYXNoIC1jIFwic291cmNlICVzL29lLWluaXQtYnVpbGQtZW52ICVzICYmICVzIHNvdXJjZSB0b2FzdGVyIHN0b3BcIiIgJQorICAgICAgICAgICAgKHNlbGYucG9reWRpcm5hbWUsIHNlbGYuYmUuYnVpbGRkaXIsIChsYW1iZGE6ICIiIGlmIHNlbGYuYmUuYmJ0b2tlbiBpcyBOb25lIGVsc2UgIkJCVE9LRU49JXMiICUgc2VsZi5iZS5iYnRva2VuKSgpKSkKKyAgICAgICAgc2VsZi5iZS5iYnN0YXRlID0gQnVpbGRFbnZpcm9ubWVudC5TRVJWRVJfU1RPUFBFRAorICAgICAgICBzZWxmLmJlLnNhdmUoKQorICAgICAgICBsb2dnZXIuZGVidWcoImxvY2FsaG9zdGJlY29udHJvbGxlcjogU3RvcHBlZCBiaXRiYWtlIHNlcnZlciIpCisKKyAgICBkZWYgZ2V0R2l0Q2xvbmVEaXJlY3Rvcnkoc2VsZiwgdXJsLCBicmFuY2gpOgorICAgICAgICAiIiIgVXRpbGl0eSB0aGF0IHJldHVybnMgdGhlIGxhc3QgY29tcG9uZW50IG9mIGEgZ2l0IHBhdGggYXMgZGlyZWN0b3J5CisgICAgICAgICIiIgorICAgICAgICBpbXBvcnQgcmUKKyAgICAgICAgY29tcG9uZW50cyA9IHJlLnNwbGl0KHInWzpcLlwvXScsIHVybCkKKyAgICAgICAgYmFzZSA9IGNvbXBvbmVudHNbLTJdIGlmIGNvbXBvbmVudHNbLTFdID09ICJnaXQiIGVsc2UgY29tcG9uZW50c1stMV0KKworICAgICAgICBpZiBicmFuY2ggIT0gIkhFQUQiOgorICAgICAgICAgICAgcmV0dXJuICJfJXNfJXMudG9hc3Rlcl9jbG9uZWQiICUgKGJhc2UsIGJyYW5jaCkKKworCisgICAgICAgICMgd29yZCBvZiBhdHRlbnRpb247IHRoaXMgaXMgYSBsb2NhbGhvc3Qtc3BlY2lmaWMgaXNzdWU7IG9ubHkgb24gdGhlIGxvY2FsaG9zdCB3ZSBleHBlY3QgdG8gaGF2ZSAiSEVBRCIgcmVsZWFzZXMKKyAgICAgICAgIyB3aGljaCBfQUxXQVlTXyBtZWFucyB0aGUgY3VycmVudCBwb2t5IGNoZWNrb3V0CisgICAgICAgIGZyb20gb3MucGF0aCBpbXBvcnQgZGlybmFtZSBhcyBETgorICAgICAgICBsb2NhbF9jaGVja291dF9wYXRoID0gRE4oRE4oRE4oRE4oRE4ob3MucGF0aC5hYnNwYXRoKF9fZmlsZV9fKSkpKSkpCisgICAgICAgICNsb2dnZXIuZGVidWcoImxvY2FsaG9zdGJlY29udHJvbGxlcjogdXNpbmcgSEVBRCBjaGVja291dCBpbiAlcyIgJSBsb2NhbF9jaGVja291dF9wYXRoKQorICAgICAgICByZXR1cm4gbG9jYWxfY2hlY2tvdXRfcGF0aAorCisKKyAgICBkZWYgc2V0TGF5ZXJzKHNlbGYsIGJpdGJha2VzLCBsYXllcnMpOgorICAgICAgICAiIiIgYSB3b3JkIG9mIGF0dGVudGlvbjogYnkgY29udmVudGlvbiwgdGhlIGZpcnN0IGxheWVyIGZvciBhbnkgYnVpbGQgd2lsbCBiZSBwb2t5ISAiIiIKKworICAgICAgICBhc3NlcnQgc2VsZi5iZS5zb3VyY2VkaXIgaXMgbm90IE5vbmUKKyAgICAgICAgYXNzZXJ0IGxlbihiaXRiYWtlcykgPT0gMQorICAgICAgICAjIHNldCBsYXllcnMgaW4gdGhlIGxheWVyc291cmNlCisKKyAgICAgICAgIyAxLiBnZXQgYSBsaXN0IG9mIHJlcG9zIHdpdGggYnJhbmNoZXMsIGFuZCBtYXAgZGlycGF0aHMgZm9yIGVhY2ggbGF5ZXIKKyAgICAgICAgZ2l0cmVwb3MgPSB7fQorCisgICAgICAgIGdpdHJlcG9zWyhiaXRiYWtlc1swXS5naXR1cmwsIGJpdGJha2VzWzBdLmNvbW1pdCldID0gW10KKyAgICAgICAgZ2l0cmVwb3NbKGJpdGJha2VzWzBdLmdpdHVybCwgYml0YmFrZXNbMF0uY29tbWl0KV0uYXBwZW5kKCAoImJpdGJha2UiLCBiaXRiYWtlc1swXS5kaXJwYXRoKSApCisKKyAgICAgICAgZm9yIGxheWVyIGluIGxheWVyczoKKyAgICAgICAgICAgICMgd2UgZG9uJ3QgcHJvY2VzcyBsb2NhbCBVUkxzCisgICAgICAgICAgICBpZiBsYXllci5naXR1cmwuc3RhcnRzd2l0aCgiZmlsZTovLyIpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBub3QgKGxheWVyLmdpdHVybCwgbGF5ZXIuY29tbWl0KSBpbiBnaXRyZXBvczoKKyAgICAgICAgICAgICAgICBnaXRyZXBvc1sobGF5ZXIuZ2l0dXJsLCBsYXllci5jb21taXQpXSA9IFtdCisgICAgICAgICAgICBnaXRyZXBvc1sobGF5ZXIuZ2l0dXJsLCBsYXllci5jb21taXQpXS5hcHBlbmQoIChsYXllci5uYW1lLCBsYXllci5kaXJwYXRoKSApCisKKworICAgICAgICBsb2dnZXIuZGVidWcoImxvY2FsaG9zdGJlY29udHJvbGxlciwgb3VyIGdpdCByZXBvcyBhcmUgJXMiICUgcGZvcm1hdChnaXRyZXBvcykpCisKKworICAgICAgICAjIDIuIGZpbmQgY2hlY2tlZC1vdXQgZ2l0IHJlcG9zIGluIHRoZSBzb3VyY2VkaXIgZGlyZWN0b3J5IHRoYXQgbWF5IGhlbHAgZmFzdGVyIGNsb25pbmcKKworICAgICAgICBjYWNoZWRfbGF5ZXJzID0ge30KKyAgICAgICAgZm9yIGxkaXIgaW4gb3MubGlzdGRpcihzZWxmLmJlLnNvdXJjZWRpcik6CisgICAgICAgICAgICBmbGRpciA9IG9zLnBhdGguam9pbihzZWxmLmJlLnNvdXJjZWRpciwgbGRpcikKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZmxkaXIpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gc2VsZi5fc2hlbGxjbWQoImdpdCByZW1vdGUgLXYiLCBmbGRpcikuc3BsaXQoIlxuIik6CisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlID0gbGluZS5zcGxpdCgiXHQiKVsxXS5zcGxpdCgiICIpWzBdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcmVtb3RlIG5vdCBpbiBjYWNoZWRfbGF5ZXJzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRfbGF5ZXJzW3JlbW90ZV0gPSBmbGRpcgorICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGV4Y2VwdCBTaGVsbENtZEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgIyBpZ25vcmUgYW55IGVycm9ycyBpbiBjb2xsZWN0aW5nIGdpdCByZW1vdGVzCisgICAgICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBsYXllcmxpc3QgPSBbXQorCisKKyAgICAgICAgIyAzLiBjaGVja291dCB0aGUgcmVwb3NpdG9yaWVzCisgICAgICAgIGZvciBnaXR1cmwsIGNvbW1pdCBpbiBnaXRyZXBvcy5rZXlzKCk6CisgICAgICAgICAgICBsb2NhbGRpcm5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5iZS5zb3VyY2VkaXIsIHNlbGYuZ2V0R2l0Q2xvbmVEaXJlY3RvcnkoZ2l0dXJsLCBjb21taXQpKQorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJsb2NhbGhvc3RiZWNvbnRyb2xsZXI6IGdpdHVybCAlczolcyBjaGVja2luZyBvdXQgaW4gY3VycmVudCBkaXJlY3RvcnkgJXMiICUgKGdpdHVybCwgY29tbWl0LCBsb2NhbGRpcm5hbWUpKQorCisgICAgICAgICAgICAjIG1ha2Ugc3VyZSBvdXIgZGlyZWN0b3J5IGlzIGEgZ2l0IHJlcG9zaXRvcnkKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGxvY2FsZGlybmFtZSk6CisgICAgICAgICAgICAgICAgbG9jYWxyZW1vdGVzID0gc2VsZi5fc2hlbGxjbWQoImdpdCByZW1vdGUgLXYiLCBsb2NhbGRpcm5hbWUpCisgICAgICAgICAgICAgICAgaWYgbm90IGdpdHVybCBpbiBsb2NhbHJlbW90ZXM6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEJ1aWxkU2V0dXBFeGNlcHRpb24oIkV4aXN0aW5nIGdpdCByZXBvc2l0b3J5IGF0ICVzLCBidXQgd2l0aCBkaWZmZXJlbnQgcmVtb3RlcyAoJyVzJywgZXhwZWN0ZWQgJyVzJykuIFRvYXN0ZXIgd2lsbCBub3QgY29udGludWUgb3V0IG9mIGZlYXIgb2YgZGFtYWdpbmcgc29tZXRoaW5nLiIgJSAobG9jYWxkaXJuYW1lLCAiLCAiLmpvaW4obG9jYWxyZW1vdGVzLnNwbGl0KCJcbiIpKSwgZ2l0dXJsKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgZ2l0dXJsIGluIGNhY2hlZF9sYXllcnM6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygibG9jYWxob3N0YmVjb250cm9sbGVyIGdpdC1jb3B5aW5nICVzIHRvICVzIiAlIChjYWNoZWRfbGF5ZXJzW2dpdHVybF0sIGxvY2FsZGlybmFtZSkpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3NoZWxsY21kKCJnaXQgY2xvbmUgXCIlc1wiIFwiJXNcIiIgJSAoY2FjaGVkX2xheWVyc1tnaXR1cmxdLCBsb2NhbGRpcm5hbWUpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9zaGVsbGNtZCgiZ2l0IHJlbW90ZSByZW1vdmUgb3JpZ2luIiwgbG9jYWxkaXJuYW1lKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9zaGVsbGNtZCgiZ2l0IHJlbW90ZSBhZGQgb3JpZ2luIFwiJXNcIiIgJSBnaXR1cmwsIGxvY2FsZGlybmFtZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoImxvY2FsaG9zdGJlY29udHJvbGxlcjogY2xvbmluZyAlczolcyBpbiAlcyIgJSAoZ2l0dXJsLCBjb21taXQsIGxvY2FsZGlybmFtZSkpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3NoZWxsY21kKCJnaXQgY2xvbmUgXCIlc1wiIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCBcIiVzXCIgXCIlc1wiIiAlIChnaXR1cmwsIGNvbW1pdCwgbG9jYWxkaXJuYW1lKSkKKworICAgICAgICAgICAgIyBicmFuY2ggbWFnaWMgbmFtZSAiSEVBRCIgd2lsbCBpbmhpYml0IGNoZWNrb3V0CisgICAgICAgICAgICBpZiBjb21taXQgIT0gIkhFQUQiOgorICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygibG9jYWxob3N0YmVjb250cm9sbGVyOiBjaGVja2luZyBvdXQgY29tbWl0ICVzIHRvICVzICIgJSAoY29tbWl0LCBsb2NhbGRpcm5hbWUpKQorICAgICAgICAgICAgICAgIHNlbGYuX3NoZWxsY21kKCJnaXQgZmV0Y2ggLS1hbGwgJiYgZ2l0IGNoZWNrb3V0IFwiJXNcIiAmJiBnaXQgcmViYXNlIFwib3JpZ2luLyVzXCIiICUgKGNvbW1pdCwgY29tbWl0KSAsIGxvY2FsZGlybmFtZSkKKworICAgICAgICAgICAgIyB0YWtlIHRoZSBsb2NhbGRpcm5hbWUgYXMgcG9reSBkaXIgaWYgd2UgY2FuIGZpbmQgdGhlIG9lLWluaXQtYnVpbGQtZW52CisgICAgICAgICAgICBpZiBzZWxmLnBva3lkaXJuYW1lIGlzIE5vbmUgYW5kIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihsb2NhbGRpcm5hbWUsICJvZS1pbml0LWJ1aWxkLWVudiIpKToKKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoImxvY2FsaG9zdGJlY29udHJvbGxlcjogc2VsZWN0ZWQgcG9reSBkaXIgbmFtZSAlcyIgJSBsb2NhbGRpcm5hbWUpCisgICAgICAgICAgICAgICAgc2VsZi5wb2t5ZGlybmFtZSA9IGxvY2FsZGlybmFtZQorCisgICAgICAgICAgICAgICAgIyBtYWtlIHN1cmUgd2UgaGF2ZSBhIHdvcmtpbmcgYml0YmFrZQorICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oc2VsZi5wb2t5ZGlybmFtZSwgJ2JpdGJha2UnKSk6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygibG9jYWxob3N0YmVjb250cm9sbGVyOiBjaGVja2luZyBiaXRiYWtlIGludG8gdGhlIHBva3kgZGlybmFtZSAlcyAiICUgc2VsZi5wb2t5ZGlybmFtZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2hlbGxjbWQoImdpdCBjbG9uZSAtYiBcIiVzXCIgXCIlc1wiIFwiJXNcIiAiICUgKGJpdGJha2VzWzBdLmNvbW1pdCwgYml0YmFrZXNbMF0uZ2l0dXJsLCBvcy5wYXRoLmpvaW4oc2VsZi5wb2t5ZGlybmFtZSwgJ2JpdGJha2UnKSkpCisKKyAgICAgICAgICAgICMgdmVyaWZ5IG91ciByZXBvc2l0b3JpZXMKKyAgICAgICAgICAgIGZvciBuYW1lLCBkaXJwYXRoIGluIGdpdHJlcG9zWyhnaXR1cmwsIGNvbW1pdCldOgorICAgICAgICAgICAgICAgIGxvY2FsZGlycGF0aCA9IG9zLnBhdGguam9pbihsb2NhbGRpcm5hbWUsIGRpcnBhdGgpCisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJsb2NhbGhvc3RiZWNvbnRyb2xsZXI6IGxvY2FsZGlycGF0aCBleHBlY3RlZCAnJXMnIiAlIGxvY2FsZGlycGF0aCkKKyAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMobG9jYWxkaXJwYXRoKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgQnVpbGRTZXR1cEV4Y2VwdGlvbigiQ2Fubm90IGZpbmQgbGF5ZXIgZ2l0IHBhdGggJyVzJyBpbiBjaGVja2VkIG91dCByZXBvc2l0b3J5ICclczolcycuIEFib3J0aW5nLiIgJSAobG9jYWxkaXJwYXRoLCBnaXR1cmwsIGNvbW1pdCkpCisKKyAgICAgICAgICAgICAgICBpZiBuYW1lICE9ICJiaXRiYWtlIjoKKyAgICAgICAgICAgICAgICAgICAgbGF5ZXJsaXN0LmFwcGVuZChsb2NhbGRpcnBhdGgucnN0cmlwKCIvIikpCisKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCJsb2NhbGhvc3RiZWNvbnRyb2xsZXI6IGN1cnJlbnQgbGF5ZXIgbGlzdCAlcyAiICUgcGZvcm1hdChsYXllcmxpc3QpKQorCisgICAgICAgICMgNC4gY29uZmlndXJlIHRoZSBidWlsZCBlbnZpcm9ubWVudCwgc28gd2UgaGF2ZSBhIGNvbmYvYmJsYXllcnMuY29uZgorICAgICAgICBhc3NlcnQgc2VsZi5wb2t5ZGlybmFtZSBpcyBub3QgTm9uZQorICAgICAgICBzZWxmLl9zZXR1cEJFKCkKKworICAgICAgICAjIDUuIHVwZGF0ZSB0aGUgYmJsYXllcnMuY29uZgorICAgICAgICBiYmxheWVyY29uZiA9IG9zLnBhdGguam9pbihzZWxmLmJlLmJ1aWxkZGlyLCAiY29uZi9iYmxheWVycy5jb25mIikKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGJibGF5ZXJjb25mKToKKyAgICAgICAgICAgIHJhaXNlIEJ1aWxkU2V0dXBFeGNlcHRpb24oIkJFIGlzIG5vdCBjb25zaXN0ZW50OiBiYmxheWVycy5jb25mIGZpbGUgbWlzc2luZyBhdCAlcyIgJSBiYmxheWVyY29uZikKKworICAgICAgICBCdWlsZEVudmlyb25tZW50Q29udHJvbGxlci5fdXBkYXRlQkJMYXllcnMoYmJsYXllcmNvbmYsIGxheWVybGlzdCkKKworICAgICAgICBzZWxmLmlzbGF5ZXJzZXQgPSBUcnVlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgcmVhZFNlcnZlckxvZ0ZpbGUoc2VsZik6CisgICAgICAgIHJldHVybiBvcGVuKG9zLnBhdGguam9pbihzZWxmLmJlLmJ1aWxkZGlyLCAidG9hc3Rlcl9zZXJ2ZXIubG9nIiksICJyIikucmVhZCgpCisKKyAgICBkZWYgcmVsZWFzZShzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuYmUuc291cmNlZGlyIGFuZCBvcy5wYXRoLmV4aXN0cyhzZWxmLmJlLmJ1aWxkZGlyKQorICAgICAgICBpbXBvcnQgc2h1dGlsCisgICAgICAgIHNodXRpbC5ybXRyZWUob3MucGF0aC5qb2luKHNlbGYuYmUuc291cmNlZGlyLCAiYnVpbGQiKSkKKyAgICAgICAgYXNzZXJ0IG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLmJlLmJ1aWxkZGlyKQorCisKKyAgICBkZWYgdHJpZ2dlckJ1aWxkKHNlbGYsIGJpdGJha2UsIGxheWVycywgdmFyaWFibGVzLCB0YXJnZXRzKToKKyAgICAgICAgIyBzZXQgdXAgdGhlIGJ1aWQgZW52aXJvbm1lbnQgd2l0aCB0aGUgbmVlZGVkIGxheWVycworICAgICAgICBzZWxmLnNldExheWVycyhiaXRiYWtlLCBsYXllcnMpCisgICAgICAgIHNlbGYud3JpdGVDb25mRmlsZSgiY29uZi90b2FzdGVyLXByZS5jb25mIiwgdmFyaWFibGVzKQorICAgICAgICBzZWxmLndyaXRlQ29uZkZpbGUoImNvbmYvdG9hc3Rlci5jb25mIiwgcmF3ID0gIklOSEVSSVQrPVwidG9hc3RlciBidWlsZGhpc3RvcnlcIiIpCisKKyAgICAgICAgIyBnZXQgdGhlIGJiIHNlcnZlciBydW5uaW5nIHdpdGggdGhlIGJ1aWxkIHJlcSBpZCBhbmQgYnVpbGQgZW52IGlkCisgICAgICAgIGJiY3RybCA9IHNlbGYuZ2V0QkJDb250cm9sbGVyKCkKKworICAgICAgICAjIHRyaWdnZXIgdGhlIGJ1aWxkIGNvbW1hbmQKKyAgICAgICAgdGFzayA9IHJlZHVjZShsYW1iZGEgeCwgeTogeCBpZiBsZW4oeSk9PSAwIGVsc2UgeSwgbWFwKGxhbWJkYSB5OiB5LnRhc2ssIHRhcmdldHMpKQorICAgICAgICBpZiBsZW4odGFzaykgPT0gMDoKKyAgICAgICAgICAgIHRhc2sgPSBOb25lCisKKyAgICAgICAgYmJjdHJsLmJ1aWxkKGxpc3QobWFwKGxhbWJkYSB4OngudGFyZ2V0LCB0YXJnZXRzKSksIHRhc2spCisKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCJsb2NhbGhvc3RiZWNvbnRyb2xsZXI6IEJ1aWxkIGxhdW5jaGVkLCBleGl0aW5nLiBGb2xsb3cgYnVpbGQgbG9ncyBhdCAlcy90b2FzdGVyX3VpLmxvZyIgJSBzZWxmLmJlLmJ1aWxkZGlyKQorCisgICAgICAgICMgZGlzY29ubmVjdCBmcm9tIHRoZSBzZXJ2ZXIKKyAgICAgICAgYmJjdHJsLmRpc2Nvbm5lY3QoKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL21hbmFnZW1lbnQvX19pbml0X18ucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvbWFuYWdlbWVudC9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL21hbmFnZW1lbnQvX19pbml0X18ucHkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC9tYW5hZ2VtZW50L2NvbW1hbmRzL19faW5pdF9fLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL21hbmFnZW1lbnQvY29tbWFuZHMvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC9tYW5hZ2VtZW50L2NvbW1hbmRzL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvbWFuYWdlbWVudC9jb21tYW5kcy9jaGVja3NldHRpbmdzLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL21hbmFnZW1lbnQvY29tbWFuZHMvY2hlY2tzZXR0aW5ncy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2NjN2M2Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL21hbmFnZW1lbnQvY29tbWFuZHMvY2hlY2tzZXR0aW5ncy5weQpAQCAtMCwwICsxLDI0NyBAQAorZnJvbSBkamFuZ28uY29yZS5tYW5hZ2VtZW50LmJhc2UgaW1wb3J0IE5vQXJnc0NvbW1hbmQsIENvbW1hbmRFcnJvcgorZnJvbSBkamFuZ28uZGIgaW1wb3J0IHRyYW5zYWN0aW9uCitmcm9tIGJsZGNvbnRyb2wuYmJjb250cm9sbGVyIGltcG9ydCBnZXRCdWlsZEVudmlyb25tZW50Q29udHJvbGxlciwgU2hlbGxDbWRFeGNlcHRpb24KK2Zyb20gYmxkY29udHJvbC5tb2RlbHMgaW1wb3J0IEJ1aWxkUmVxdWVzdCwgQnVpbGRFbnZpcm9ubWVudCwgQlJFcnJvcgorZnJvbSBvcm0ubW9kZWxzIGltcG9ydCBUb2FzdGVyU2V0dGluZywgQnVpbGQKK2ltcG9ydCBvcworaW1wb3J0IHN5cywgdHJhY2ViYWNrCisKK2RlZiBETihwYXRoKToKKyAgICBpZiBwYXRoIGlzIE5vbmU6CisgICAgICAgIHJldHVybiAiIgorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBvcy5wYXRoLmRpcm5hbWUocGF0aCkKKworCitjbGFzcyBDb21tYW5kKE5vQXJnc0NvbW1hbmQpOgorICAgIGFyZ3MgPSAiIgorICAgIGhlbHAgPSAiVmVyaWZpZXMgdGhhdCB0aGUgY29uZmlndXJlZCBzZXR0aW5ncyBhcmUgdmFsaWQgYW5kIHVzYWJsZSwgb3IgcHJvbXB0cyB0aGUgdXNlciB0byBmaXggdGhlIHNldHRpbmdzLiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBzdXBlcihDb21tYW5kLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCisgICAgICAgIHNlbGYuZ3Vlc3NwYXRoID0gRE4oRE4oRE4oRE4oRE4oRE4oRE4oX19maWxlX18pKSkpKSkpCisKKyAgICBkZWYgX2ZpbmRfZmlyc3RfcGF0aF9mb3JfZmlsZShzZWxmLCBzdGFydGRpcmVjdG9yeSwgZmlsZW5hbWUsIGxldmVsID0gMCk6CisgICAgICAgIGlmIGxldmVsIDwgMDoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGRpcnMgPSBbXQorICAgICAgICBmb3IgaSBpbiBvcy5saXN0ZGlyKHN0YXJ0ZGlyZWN0b3J5KToKKyAgICAgICAgICAgIGogPSBvcy5wYXRoLmpvaW4oc3RhcnRkaXJlY3RvcnksIGkpCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShqKToKKyAgICAgICAgICAgICAgICBpZiBpID09IGZpbGVuYW1lOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRkaXJlY3RvcnkKKyAgICAgICAgICAgIGVsaWYgb3MucGF0aC5pc2RpcihqKToKKyAgICAgICAgICAgICAgICBkaXJzLmFwcGVuZChqKQorICAgICAgICBmb3IgaiBpbiBkaXJzOgorICAgICAgICAgICAgcmV0ID0gc2VsZi5fZmluZF9maXJzdF9wYXRoX2Zvcl9maWxlKGosIGZpbGVuYW1lLCBsZXZlbCAtIDEpCisgICAgICAgICAgICBpZiByZXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldAorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIF9yZWN1cnNpdmVfbGlzdF9kaXJlY3RvcmllcyhzZWxmLCBzdGFydGRpcmVjdG9yeSwgbGV2ZWwgPSAwKToKKyAgICAgICAgaWYgbGV2ZWwgPCAwOgorICAgICAgICAgICAgcmV0dXJuIFtdCisgICAgICAgIGRpcnMgPSBbXQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgaSBpbiBvcy5saXN0ZGlyKHN0YXJ0ZGlyZWN0b3J5KToKKyAgICAgICAgICAgICAgICBqID0gb3MucGF0aC5qb2luKHN0YXJ0ZGlyZWN0b3J5LCBpKQorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoaik6CisgICAgICAgICAgICAgICAgICAgIGRpcnMuYXBwZW5kKGopCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBmb3IgaiBpbiBkaXJzOgorICAgICAgICAgICAgICAgIGRpcnMgPSBkaXJzICsgc2VsZi5fcmVjdXJzaXZlX2xpc3RfZGlyZWN0b3JpZXMoaiwgbGV2ZWwgLSAxKQorICAgICAgICByZXR1cm4gZGlycworCisKKyAgICBkZWYgX2dldF9zdWdnZXN0ZWRfc291cmNlZGlyKHNlbGYsIGJlKToKKyAgICAgICAgaWYgYmUuYmV0eXBlICE9IEJ1aWxkRW52aXJvbm1lbnQuVFlQRV9MT0NBTDoKKyAgICAgICAgICAgIHJldHVybiAiIgorICAgICAgICByZXR1cm4gRE4oRE4oRE4oc2VsZi5fZmluZF9maXJzdF9wYXRoX2Zvcl9maWxlKHNlbGYuZ3Vlc3NwYXRoLCAidG9hc3RlcmNvbmYuanNvbiIsIDQpKSkpCisKKyAgICBkZWYgX2dldF9zdWdnZXN0ZWRfYnVpbGRkaXIoc2VsZiwgYmUpOgorICAgICAgICBpZiBiZS5iZXR5cGUgIT0gQnVpbGRFbnZpcm9ubWVudC5UWVBFX0xPQ0FMOgorICAgICAgICAgICAgcmV0dXJuICIiCisgICAgICAgIHJldHVybiBETihzZWxmLl9maW5kX2ZpcnN0X3BhdGhfZm9yX2ZpbGUoRE4oc2VsZi5ndWVzc3BhdGgpLCAiYmJsYXllcnMuY29uZiIsIDQpKQorCisKKyAgICBkZWYgX3ZlcmlmeV9hcnRpZmFjdF9zdG9yYWdlX2RpcihzZWxmKToKKyAgICAgICAgIyB2ZXJpZnkgdGhhdCB3ZSBoYXZlIGEgc2V0dGluZ3MgZm9yIGRvd25sb2FkaW5nIGFydGlmYWN0cworICAgICAgICB3aGlsZSBUb2FzdGVyU2V0dGluZy5vYmplY3RzLmZpbHRlcihuYW1lPSJBUlRJRkFDVFNfU1RPUkFHRV9ESVIiKS5jb3VudCgpID09IDA6CisgICAgICAgICAgICBndWVzc2VkcGF0aCA9IG9zLmdldGN3ZCgpICsgIi90b2FzdGVyX2J1aWxkX2FydGlmYWN0cy8iCisgICAgICAgICAgICBwcmludCgiXG5Ub2FzdGVyIG5lZWRzIHRvIGtub3cgaW4gd2hpY2ggZGlyZWN0b3J5IGl0IGNhbiBkb3dubG9hZCBidWlsZCBsb2cgZmlsZXMgYW5kIG90aGVyIGFydGlmYWN0cy5cblRvYXN0ZXIgc3VnZ2VzdHMgXCIlc1wiLiIgJSBndWVzc2VkcGF0aCkKKyAgICAgICAgICAgIGFydGlmYWN0c19zdG9yYWdlX2RpciA9IHJhd19pbnB1dCgiUHJlc3MgRW50ZXIgdG8gc2VsZWN0IFwiJXNcIiBvciB0eXBlIHRoZSBmdWxsIHBhdGggdG8gYSBkaWZmZXJlbnQgZGlyZWN0b3J5OiAiICUgZ3Vlc3NlZHBhdGgpCisgICAgICAgICAgICBpZiBsZW4oYXJ0aWZhY3RzX3N0b3JhZ2VfZGlyKSA9PSAwOgorICAgICAgICAgICAgICAgIGFydGlmYWN0c19zdG9yYWdlX2RpciA9IGd1ZXNzZWRwYXRoCisgICAgICAgICAgICBpZiBsZW4oYXJ0aWZhY3RzX3N0b3JhZ2VfZGlyKSA+IDAgYW5kIGFydGlmYWN0c19zdG9yYWdlX2Rpci5zdGFydHN3aXRoKCIvIik6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBvcy5tYWtlZGlycyhhcnRpZmFjdHNfc3RvcmFnZV9kaXIpCisgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgb3NlOgorICAgICAgICAgICAgICAgICAgICBpZiAiRmlsZSBleGlzdHMiIGluIHN0cihvc2UpOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2Ugb3NlCisgICAgICAgICAgICAgICAgVG9hc3RlclNldHRpbmcub2JqZWN0cy5jcmVhdGUobmFtZT0iQVJUSUZBQ1RTX1NUT1JBR0VfRElSIiwgdmFsdWU9YXJ0aWZhY3RzX3N0b3JhZ2VfZGlyKQorICAgICAgICByZXR1cm4gMAorCisKKyAgICBkZWYgX3ZlcmlmeV9idWlsZF9lbnZpcm9ubWVudChzZWxmKToKKyAgICAgICAgIyByZWZ1c2UgdG8gc3RhcnQgaWYgd2UgaGF2ZSBubyBidWlsZCBlbnZpcm9ubWVudHMKKyAgICAgICAgd2hpbGUgQnVpbGRFbnZpcm9ubWVudC5vYmplY3RzLmNvdW50KCkgPT0gMDoKKyAgICAgICAgICAgIHByaW50KCIgISEgTm8gYnVpbGQgZW52aXJvbm1lbnRzIGZvdW5kLiBUb2FzdGVyIG5lZWRzIGF0IGxlYXN0IG9uZSBidWlsZCBlbnZpcm9ubWVudCBpbiBvcmRlciB0byBiZSBhYmxlIHRvIHJ1biBidWlsZHMuXG4iICsKKyAgICAgICAgICAgICAgICAiWW91IGNhbiBtYW51YWxseSBkZWZpbmUgYnVpbGQgZW52aXJvbm1lbnRzIGluIHRoZSBkYXRhYmFzZSB0YWJsZSBibGRjb250cm9sX2J1aWxkZW52aXJvbm1lbnQuXG4iICsKKyAgICAgICAgICAgICAgICAiT3IgVG9hc3RlciBjYW4gZGVmaW5lIGEgc2ltcGxlIGxvY2FsaG9zdC1iYXNlZCBidWlsZCBlbnZpcm9ubWVudCBmb3IgeW91LiIpCisKKyAgICAgICAgICAgIGkgPSByYXdfaW5wdXQoIiAtLSAgRG8geW91IHdhbnQgdG8gY3JlYXRlIGEgYmFzaWMgbG9jYWxob3N0IGJ1aWxkIGVudmlyb25tZW50ID8gKFkvbikgIik7CisgICAgICAgICAgICBpZiBub3QgbGVuKGkpIG9yIGkuc3RhcnRzd2l0aCgieSIpIG9yIGkuc3RhcnRzd2l0aCgiWSIpOgorICAgICAgICAgICAgICAgIEJ1aWxkRW52aXJvbm1lbnQub2JqZWN0cy5jcmVhdGUocGsgPSAxLCBiZXR5cGUgPSAwKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIlRvYXN0ZXIgY2Fubm90IHN0YXJ0IHdpdGhvdXQgYnVpbGQgZW52aXJvbm1lbnRzLiBBYm9ydGluZy4iKQorCisKKyAgICAgICAgIyB3ZSBtYWtlIHN1cmUgd2UgaGF2ZSBidWlsZGRpciBhbmQgc291cmNlZGlyIGZvciBhbGwgZGVmaW5lZCBidWlsZCBlbnZpb25tZW50cworICAgICAgICBmb3IgYmUgaW4gQnVpbGRFbnZpcm9ubWVudC5vYmplY3RzLmFsbCgpOgorICAgICAgICAgICAgYmUubmVlZHNfaW1wb3J0ID0gRmFsc2UKKyAgICAgICAgICAgIGRlZiBfdmVyaWZ5X2JlKCk6CisgICAgICAgICAgICAgICAgaXNfY2hhbmdlZCA9IEZhbHNlCisgICAgICAgICAgICAgICAgcHJpbnQoIlxuVmVyaWZ5aW5nIHRoZSBidWlsZCBlbnZpcm9ubWVudC4gSWYgdGhlIGxvY2FsIGJ1aWxkIGVudmlyb25tZW50IGlzIG5vdCBwcm9wZXJseSBjb25maWd1cmVkLCB5b3Ugd2lsbCBiZSBhc2tlZCB0byBjb25maWd1cmUgaXQuIikKKworICAgICAgICAgICAgICAgIGRlZiBfdXBkYXRlX3NvdXJjZWRpcigpOgorICAgICAgICAgICAgICAgICAgICBzdWdnZXN0ZWRkaXIgPSBzZWxmLl9nZXRfc3VnZ2VzdGVkX3NvdXJjZWRpcihiZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgbGVuKHN1Z2dlc3RlZGRpcikgPiAwOgorICAgICAgICAgICAgICAgICAgICAgICAgYmUuc291cmNlZGlyID0gcmF3X2lucHV0KCJUaGlzIGlzIHRoZSBkaXJlY3RvcnkgVG9hc3RlciB1c2VzIHRvIGNoZWNrIG91dCB0aGUgc291cmNlIGNvZGUgb2YgdGhlIGxheWVycyB5b3Ugd2lsbCBidWlsZC4gVG9hc3RlciB3aWxsIGNyZWF0ZSBuZXcgY2xvbmVzIG9mIHRoZSBsYXllcnMsIHNvIGV4aXN0aW5nIGNvbnRlbnQgaW4gdGhlIGNob3NlbiBkaXJlY3Rvcnkgd2lsbCBub3QgYmUgY2hhbmdlZC5cblRvYXN0ZXIgc3VnZ2VzdHMgeW91IHVzZSBcIiVzXCIgYXMgeW91ciBsYXllcnMgY2hlY2tvdXQgZGlyZWN0b3J5LiBJZiB5b3Ugc2VsZWN0IHRoaXMgZGlyZWN0b3J5LCBhIGxheWVyIGxpa2UgXCJtZXRhLWludGVsXCIgd2lsbCBlbmQgdXAgaW4gXCIlcy9tZXRhLWludGVsXCIuXG5QcmVzcyBFbnRlciB0byBzZWxlY3QgXCIlc1wiIG9yIHR5cGUgdGhlIGZ1bGwgcGF0aCB0byBhIGRpZmZlcmVudCBkaXJlY3RvcnkuIElmIHlvdSBwcm92aWRlIHlvdXIgb3duIGRpcmVjdG9yeSwgaXQgbXVzdCBiZSBhIHBhcmVudCBvZiB0aGUgY2xvbmVkIGRpcmVjdG9yeSBmb3IgdGhlIHNvdXJjZXMgeW91IGFyZSB1c2luZyB0byBydW4gVG9hc3RlcjogIiAlIChzdWdnZXN0ZWRkaXIsIHN1Z2dlc3RlZGRpciwgc3VnZ2VzdGVkZGlyKSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlLnNvdXJjZWRpciA9IHJhd19pbnB1dCgiVG9hc3RlciBuZWVkcyB0byBrbm93IGluIHdoaWNoIGRpcmVjdG9yeSBpdCBzaG91bGQgY2hlY2sgb3V0IHRoZSBzb3VyY2UgY29kZSBvZiB0aGUgbGF5ZXJzIHlvdSB3aWxsIGJ1aWxkLiBUaGUgZGlyZWN0b3J5IHNob3VsZCBiZSBhIHBhcmVudCBvZiB0aGUgY2xvbmVkIGRpcmVjdG9yeSBmb3IgdGhlIHNvdXJjZXMgeW91IGFyZSB1c2luZyB0byBydW4gVG9hc3Rlci4gVG9hc3RlciB3aWxsIGNyZWF0ZSBuZXcgY2xvbmVzIG9mIHRoZSBsYXllcnMsIHNvIGV4aXN0aW5nIGNvbnRlbnQgaW4gdGhlIGNob3NlbiBkaXJlY3Rvcnkgd2lsbCBub3QgYmUgY2hhbmdlZC5cblR5cGUgdGhlIGZ1bGwgcGF0aCB0byB0aGUgZGlyZWN0b3J5IChmb3IgZXhhbXBsZTogXCIlc1wiOiAiICUgb3MuZW52aXJvbi5nZXQoJ0hPTUUnLCAnL3RtcC8nKSkKKyAgICAgICAgICAgICAgICAgICAgaWYgbGVuKGJlLnNvdXJjZWRpcikgPT0gMCBhbmQgbGVuKHN1Z2dlc3RlZGRpcikgPiAwOgorICAgICAgICAgICAgICAgICAgICAgICAgYmUuc291cmNlZGlyID0gc3VnZ2VzdGVkZGlyCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgICAgICAgICBpZiBsZW4oYmUuc291cmNlZGlyKSA9PSAwOgorICAgICAgICAgICAgICAgICAgICBwcmludCAiXG4gLS0gVmFsaWRhdGlvbjogVGhlIGxheWVycyBjaGVja291dCBkaXJlY3RvcnkgbXVzdCBiZSBzZXQuIgorICAgICAgICAgICAgICAgICAgICBpc19jaGFuZ2VkID0gX3VwZGF0ZV9zb3VyY2VkaXIoKQorCisgICAgICAgICAgICAgICAgaWYgbm90IGJlLnNvdXJjZWRpci5zdGFydHN3aXRoKCIvIik6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICJcbiAtLSBWYWxpZGF0aW9uOiBUaGUgbGF5ZXJzIGNoZWNrb3V0IGRpcmVjdG9yeSBtdXN0IGJlIHNldCB0byBhbiBhYnNvbHV0ZSBwYXRoLiIKKyAgICAgICAgICAgICAgICAgICAgaXNfY2hhbmdlZCA9IF91cGRhdGVfc291cmNlZGlyKCkKKworICAgICAgICAgICAgICAgIGlmIG5vdCBiZS5zb3VyY2VkaXIgaW4gRE4oX19maWxlX18pOgorICAgICAgICAgICAgICAgICAgICBwcmludCAiXG4gLS0gVmFsaWRhdGlvbjogVGhlIGxheWVycyBjaGVja291dCBkaXJlY3RvcnkgbXVzdCBiZSBhIHBhcmVudCBvZiB0aGUgY3VycmVudCBjaGVja291dC4iCisgICAgICAgICAgICAgICAgICAgIGlzX2NoYW5nZWQgPSBfdXBkYXRlX3NvdXJjZWRpcigpCisKKyAgICAgICAgICAgICAgICBpZiBpc19jaGFuZ2VkOgorICAgICAgICAgICAgICAgICAgICBpZiBiZS5iZXR5cGUgPT0gQnVpbGRFbnZpcm9ubWVudC5UWVBFX0xPQ0FMOgorICAgICAgICAgICAgICAgICAgICAgICAgYmUubmVlZHNfaW1wb3J0ID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgICAgICAgICAgZGVmIF91cGRhdGVfYnVpbGRkaXIoKToKKyAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGVkZGlyID0gc2VsZi5fZ2V0X3N1Z2dlc3RlZF9idWlsZGRpcihiZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgbGVuKHN1Z2dlc3RlZGRpcikgPiAwOgorICAgICAgICAgICAgICAgICAgICAgICAgYmUuYnVpbGRkaXIgPSByYXdfaW5wdXQoIlRvYXN0ZXIgbmVlZHMgdG8ga25vdyB3aGVyZSB5b3VyIGJ1aWxkIGRpcmVjdG9yeSBpcyBsb2NhdGVkLlxuVGhlIGJ1aWxkIGRpcmVjdG9yeSBpcyB3aGVyZSBhbGwgdGhlIGFydGlmYWN0cyBjcmVhdGVkIGJ5IHlvdXIgYnVpbGRzIHdpbGwgYmUgc3RvcmVkLiBUb2FzdGVyIHN1Z2dlc3RzIFwiJXNcIi5cblByZXNzIEVudGVyIHRvIHNlbGVjdCBcIiVzXCIgb3IgdHlwZSB0aGUgZnVsbCBwYXRoIHRvIGEgZGlmZmVyZW50IGRpcmVjdG9yeTogIiAlIChzdWdnZXN0ZWRkaXIsIHN1Z2dlc3RlZGRpcikpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBiZS5idWlsZGRpciA9IHJhd19pbnB1dCgiVG9hc3RlciBuZWVkcyB0byBrbm93IHdoZXJlIGlzIHlvdXIgYnVpbGQgZGlyZWN0b3J5LlxuVGhlIGJ1aWxkIGRpcmVjdG9yeSBpcyB3aGVyZSBhbGwgdGhlIGFydGlmYWN0cyBjcmVhdGVkIGJ5IHlvdXIgYnVpbGRzIHdpbGwgYmUgc3RvcmVkLiBUeXBlIHRoZSBmdWxsIHBhdGggdG8gdGhlIGRpcmVjdG9yeSAoZm9yIGV4YW1wbGU6IFwiICVzL2J1aWxkXCIpIiAlIG9zLmVudmlyb24uZ2V0KCdIT01FJywnL3RtcC8nKSkKKyAgICAgICAgICAgICAgICAgICAgaWYgbGVuKGJlLmJ1aWxkZGlyKSA9PSAwIGFuZCBsZW4oc3VnZ2VzdGVkZGlyKSA+IDA6CisgICAgICAgICAgICAgICAgICAgICAgICBiZS5idWlsZGRpciA9IHN1Z2dlc3RlZGRpcgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgICAgICAgICAgaWYgbGVuKGJlLmJ1aWxkZGlyKSA9PSAwOgorICAgICAgICAgICAgICAgICAgICBwcmludCAiXG4gLS0gVmFsaWRhdGlvbjogVGhlIGJ1aWxkIGRpcmVjdG9yeSBtdXN0IGJlIHNldC4iCisgICAgICAgICAgICAgICAgICAgIGlzX2NoYW5nZWQgPSBfdXBkYXRlX2J1aWxkZGlyKCkKKworICAgICAgICAgICAgICAgIGlmIG5vdCBiZS5idWlsZGRpci5zdGFydHN3aXRoKCIvIik6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICJcbiAtLSBWYWxpZGF0aW9uOiBUaGUgYnVpbGQgZGlyZWN0b3J5IG11c3QgdG8gYmUgc2V0IHRvIGFuIGFic29sdXRlIHBhdGguIgorICAgICAgICAgICAgICAgICAgICBpc19jaGFuZ2VkID0gX3VwZGF0ZV9idWlsZGRpcigpCisKKworICAgICAgICAgICAgICAgIGlmIGlzX2NoYW5nZWQ6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICJcbkJ1aWxkIGNvbmZpZ3VyYXRpb24gc2F2ZWQiCisgICAgICAgICAgICAgICAgICAgIGJlLnNhdmUoKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisKKyAgICAgICAgICAgICAgICBpZiBiZS5uZWVkc19pbXBvcnQ6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICJcblRvYXN0ZXIgY2FuIHVzZSBhIFNJTkdMRSBwcmVkZWZpbmVkIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBzZXQgdXAgZGVmYXVsdCBwcm9qZWN0IHNldHRpbmdzIGFuZCBsYXllciBpbmZvcm1hdGlvbiBzb3VyY2VzLlxuIgorCisgICAgICAgICAgICAgICAgICAgICMgZmluZCBjb25maWd1cmF0aW9uIGZpbGVzCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZ19maWxlcyA9IFtdCisgICAgICAgICAgICAgICAgICAgIGZvciBkaXJuYW1lIGluIHNlbGYuX3JlY3Vyc2l2ZV9saXN0X2RpcmVjdG9yaWVzKGJlLnNvdXJjZWRpciwyKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihkaXJuYW1lLCAiLnRlbXBsYXRlY29uZiIpKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnQgc3VicHJvY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2MgPSBzdWJwcm9jZXNzLlBvcGVuKCdiYXNoIC1jICIuICcrb3MucGF0aC5qb2luKGRpcm5hbWUsICIudGVtcGxhdGVjb25mIikrJzsgZWNobyBcIlwkVEVNUExBVEVDT05GXCIiJywgc2hlbGw9VHJ1ZSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mZmlsZXBhdGgsIHN0ZGVycm9yb3V0cHV0ID0gcHJvYy5jb21tdW5pY2F0ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYy53YWl0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBwcm9jLnJldHVybmNvZGUgIT0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJGYWlsZWQgdG8gc291cmNlIFRFTVBMQVRFQ09ORjogJXMiICUgc3RkZXJyb3JvdXRwdXQpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mZmlsZXBhdGggPSBvcy5wYXRoLmpvaW4oY29uZmZpbGVwYXRoLnN0cmlwKCksICJ0b2FzdGVyY29uZi5qc29uIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVmaWxlcGF0aCA9IG9zLnBhdGguam9pbihkaXJuYW1lLCBjb25mZmlsZXBhdGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgInRvYXN0ZXJfY2xvbmVkIiBpbiBjYW5kaWRhdGVmaWxlcGF0aDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhjYW5kaWRhdGVmaWxlcGF0aCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ19maWxlcy5hcHBlbmQoY2FuZGlkYXRlZmlsZXBhdGgpCisKKyAgICAgICAgICAgICAgICAgICAgaWYgbGVuKGNvbmZpZ19maWxlcykgPiAwOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIlRvYXN0ZXIgd2lsbCBsaXN0IG5vdyB0aGUgY29uZmlndXJhdGlvbiBmaWxlcyB0aGF0IGl0IGZvdW5kLiBTZWxlY3QgdGhlIG51bWJlciB0byB1c2UgdGhlIGRlc2lyZWQgY29uZmlndXJhdGlvbiBmaWxlLiIKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBjZiBpbiBjb25maWdfZmlsZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIiAgWyVkXSAtICVzIiAlIChjb25maWdfZmlsZXMuaW5kZXgoY2YpICsgMSwgY2YpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAiXG4gIFswXSAtIEV4aXQgd2l0aG91dCBpbXBvcnRpbmcgYW55IGZpbGUiCisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSByYXdfaW5wdXQoIlxuRW50ZXIgeW91ciBvcHRpb246ICIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxlbihpKSBhbmQgKGludChpKSAtIDEgPj0gMCBhbmQgaW50KGkpIC0gMSA8IGxlbihjb25maWdfZmlsZXMpKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICJcbkltcG9ydGluZyBmaWxlOiAlcyIgJSBjb25maWdfZmlsZXNbaW50KGkpLTFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGxvYWRjb25mIGltcG9ydCBDb21tYW5kIGFzIExvYWRDb25maWdDb21tYW5kCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWRDb25maWdDb21tYW5kKCkuX2ltcG9ydF9sYXllcl9jb25maWcoY29uZmlnX2ZpbGVzW2ludChpKS0xXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd2UgcnVuIGxzdXBkYXRlcyBhZnRlciBjb25maWcgdXBkYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAiXG5MYXllciBjb25maWd1cmF0aW9uIGltcG9ydGVkLiBVcGRhdGluZyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBsYXllciBzb3VyY2VzLCBwbGVhc2Ugd2FpdC5cbllvdSBjYW4gcmUtdXBkYXRlIGFueSB0aW1lIGxhdGVyIGJ5IHJ1bm5pbmcgYml0YmFrZS9saWIvdG9hc3Rlci9tYW5hZ2UucHkgbHN1cGRhdGVzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBkamFuZ28uY29yZS5tYW5hZ2VtZW50IGltcG9ydCBjYWxsX2NvbW1hbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxfY29tbWFuZCgibHN1cGRhdGVzIikKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3ZSBkb24ndCBsb29rIGZvciBhbnkgb3RoZXIgY29uZmlnIGZpbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNfY2hhbmdlZAorICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICJGYWlsdXJlIHdoaWxlIHRyeWluZyB0byBpbXBvcnQgdGhlIHRvYXN0ZXIgY29uZmlnIGZpbGU6ICVzIiAlIGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKGUpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAiXG5Ub2FzdGVyIGNvdWxkIG5vdCBmaW5kIGEgY29uZmlndXJhdGlvbiBmaWxlLiBZb3UgbmVlZCB0byBjb25maWd1cmUgVG9hc3RlciBtYW51YWxseSB1c2luZyB0aGUgd2ViIGludGVyZmFjZSwgb3IgY3JlYXRlIGEgY29uZmlndXJhdGlvbiBmaWxlIGFuZCB1c2VcbiAgYml0YmFrZS9saWIvdG9hc3Rlci9tYW5hZ2VweS5weSBsb2FkY29uZiBbZmlsZW5hbWVdXG4gY29tbWFuZCB0byBsb2FkIGl0LiBZb3UgY2FuIHVzZSBodHRwczovL3dpa2kueW9jdG9wcm9qZWN0Lm9yZy93aWtpL0ZpbGU6VG9hc3RlcmNvbmYuanNvbi50eHQucGF0Y2ggYXMgYSBzdGFydGluZyBwb2ludC4iCisKKworCisKKyAgICAgICAgICAgICAgICByZXR1cm4gaXNfY2hhbmdlZAorCisgICAgICAgICAgICB3aGlsZSAoX3ZlcmlmeV9iZSgpKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHJldHVybiAwCisKKyAgICBkZWYgX3ZlcmlmeV9kZWZhdWx0X3NldHRpbmdzKHNlbGYpOgorICAgICAgICAjIHZlcmlmeSB0aGF0IGRlZmF1bHQgc2V0dGluZ3MgYXJlIHRoZXJlCisgICAgICAgIGlmIFRvYXN0ZXJTZXR0aW5nLm9iamVjdHMuZmlsdGVyKG5hbWUgPSAnREVGQVVMVF9SRUxFQVNFJykuY291bnQoKSAhPSAxOgorICAgICAgICAgICAgVG9hc3RlclNldHRpbmcub2JqZWN0cy5maWx0ZXIobmFtZSA9ICdERUZBVUxUX1JFTEVBU0UnKS5kZWxldGUoKQorICAgICAgICAgICAgVG9hc3RlclNldHRpbmcub2JqZWN0cy5nZXRfb3JfY3JlYXRlKG5hbWUgPSAnREVGQVVMVF9SRUxFQVNFJywgdmFsdWUgPSAnJykKKyAgICAgICAgcmV0dXJuIDAKKworICAgIGRlZiBfdmVyaWZ5X2J1aWxkc19pbl9wcm9ncmVzcyhzZWxmKToKKyAgICAgICAgIyB3ZSBhcmUganVzdCBzdGFydGluZyB1cC4gd2UgbXVzdCBub3QgaGF2ZSBhbnkgYnVpbGRzIGluIHByb2dyZXNzLCBvciBidWlsZCBlbnZpcm9ubWVudHMgdGFrZW4KKyAgICAgICAgZm9yIGIgaW4gQnVpbGRSZXF1ZXN0Lm9iamVjdHMuZmlsdGVyKHN0YXRlID0gQnVpbGRSZXF1ZXN0LlJFUV9JTlBST0dSRVNTKToKKyAgICAgICAgICAgIEJSRXJyb3Iub2JqZWN0cy5jcmVhdGUocmVxID0gYiwgZXJydHlwZSA9ICJ0b2FzdGVyIiwgZXJybXNnID0gIlRvYXN0ZXIgZm91bmQgdGhpcyBidWlsZCBJTiBQUk9HUkVTUyB3aGlsZSBUb2FzdGVyIHN0YXJ0ZWQgdXAuIFRoaXMgaXMgYW4gaW5jb25zaXN0ZW50IHN0YXRlLCBhbmQgdGhlIGJ1aWxkIHdhcyBtYXJrZWQgYXMgZmFpbGVkIikKKworICAgICAgICBCdWlsZFJlcXVlc3Qub2JqZWN0cy5maWx0ZXIoc3RhdGUgPSBCdWlsZFJlcXVlc3QuUkVRX0lOUFJPR1JFU1MpLnVwZGF0ZShzdGF0ZSA9IEJ1aWxkUmVxdWVzdC5SRVFfRkFJTEVEKQorCisgICAgICAgIEJ1aWxkRW52aXJvbm1lbnQub2JqZWN0cy51cGRhdGUobG9jayA9IEJ1aWxkRW52aXJvbm1lbnQuTE9DS19GUkVFKQorCisgICAgICAgICMgYWxzbyBtYXJrICJJbiBQcm9ncmVzcyBidWlsZHMgYXMgZmFpbHVyZXMiCisgICAgICAgIGZyb20gZGphbmdvLnV0aWxzIGltcG9ydCB0aW1lem9uZQorICAgICAgICBCdWlsZC5vYmplY3RzLmZpbHRlcihvdXRjb21lID0gQnVpbGQuSU5fUFJPR1JFU1MpLnVwZGF0ZShvdXRjb21lID0gQnVpbGQuRkFJTEVELCBjb21wbGV0ZWRfb24gPSB0aW1lem9uZS5ub3coKSkKKworICAgICAgICByZXR1cm4gMAorCisKKworICAgIGRlZiBoYW5kbGVfbm9hcmdzKHNlbGYsICoqb3B0aW9ucyk6CisgICAgICAgIHJldHZhbCA9IDAKKyAgICAgICAgcmV0dmFsICs9IHNlbGYuX3ZlcmlmeV9hcnRpZmFjdF9zdG9yYWdlX2RpcigpCisgICAgICAgIHJldHZhbCArPSBzZWxmLl92ZXJpZnlfYnVpbGRfZW52aXJvbm1lbnQoKQorICAgICAgICByZXR2YWwgKz0gc2VsZi5fdmVyaWZ5X2RlZmF1bHRfc2V0dGluZ3MoKQorICAgICAgICByZXR2YWwgKz0gc2VsZi5fdmVyaWZ5X2J1aWxkc19pbl9wcm9ncmVzcygpCisKKyAgICAgICAgcmV0dXJuIHJldHZhbApkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL21hbmFnZW1lbnQvY29tbWFuZHMvbG9hZGNvbmYucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvbWFuYWdlbWVudC9jb21tYW5kcy9sb2FkY29uZi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDIyYjU5Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL21hbmFnZW1lbnQvY29tbWFuZHMvbG9hZGNvbmYucHkKQEAgLTAsMCArMSwxODMgQEAKK2Zyb20gZGphbmdvLmNvcmUubWFuYWdlbWVudC5iYXNlIGltcG9ydCBCYXNlQ29tbWFuZCwgQ29tbWFuZEVycm9yCitmcm9tIG9ybS5tb2RlbHMgaW1wb3J0IExheWVyU291cmNlLCBUb2FzdGVyU2V0dGluZywgQnJhbmNoLCBMYXllciwgTGF5ZXJfVmVyc2lvbgorZnJvbSBvcm0ubW9kZWxzIGltcG9ydCBCaXRiYWtlVmVyc2lvbiwgUmVsZWFzZSwgUmVsZWFzZURlZmF1bHRMYXllciwgUmVsZWFzZUxheWVyU291cmNlUHJpb3JpdHkKK2Zyb20gZGphbmdvLmRiIGltcG9ydCBJbnRlZ3JpdHlFcnJvcgoraW1wb3J0IG9zCisKK2Zyb20gY2hlY2tzZXR0aW5ncyBpbXBvcnQgRE4KKworaW1wb3J0IGxvZ2dpbmcKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJ0b2FzdGVyIikKKworZGVmIF9yZWR1Y2VfY2Fub25fcGF0aChwYXRoKToKKyAgICBjb21wb25lbnRzID0gW10KKyAgICBmb3IgYyBpbiBwYXRoLnNwbGl0KCIvIik6CisgICAgICAgIGlmIGMgPT0gIi4uIjoKKyAgICAgICAgICAgIGRlbCBjb21wb25lbnRzWy0xXQorICAgICAgICBlbGlmIGMgPT0gIi4iOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29tcG9uZW50cy5hcHBlbmQoYykKKyAgICBpZiBsZW4oY29tcG9uZW50cykgPCAyOgorICAgICAgICBjb21wb25lbnRzLmFwcGVuZCgnJykKKyAgICByZXR1cm4gIi8iLmpvaW4oY29tcG9uZW50cykKKworZGVmIF9nZXRfaWRfZm9yX3NvdXJjZXR5cGUocyk6CisgICAgZm9yIGkgaW4gTGF5ZXJTb3VyY2UuU09VUkNFX1RZUEU6CisgICAgICAgIGlmIHMgPT0gaVsxXToKKyAgICAgICAgICAgIHJldHVybiBpWzBdCisgICAgcmFpc2UgRXhjZXB0aW9uKCJDb3VsZCBub3QgZmluZCBkZWZpbml0aW9uIGZvciBzb3VyY2V0eXBlICclcycuIFZhbGlkIHNvdXJjZSB0eXBlcyBhcmUgJXMiICUgKHN0cihzKSwgJywgJy5qb2luKG1hcChsYW1iZGEgeDogIiclcyciICUgeFsxXSwgTGF5ZXJTb3VyY2UuU09VUkNFX1RZUEUgKSkpKQorCitjbGFzcyBDb21tYW5kKEJhc2VDb21tYW5kKToKKyAgICBoZWxwID0gIkxvYWRzIGEgdG9hc3RlcmNvbmYuanNvbiBmaWxlIGluIHRoZSBkYXRhYmFzZSIKKyAgICBhcmdzID0gImZpbGVwYXRoIgorCisKKworICAgIGRlZiBfaW1wb3J0X2xheWVyX2NvbmZpZyhzZWxmLCBmaWxlcGF0aCk6CisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhmaWxlcGF0aCkgb3Igbm90IG9zLnBhdGguaXNmaWxlKGZpbGVwYXRoKToKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiRmFpbGVkIHRvIGZpbmQgdG9hc3RlciBjb25maWcgZmlsZSAlcyAuIiAlIGZpbGVwYXRoKQorCisgICAgICAgIGltcG9ydCBqc29uCisgICAgICAgIGRhdGEgPSBqc29uLmxvYWRzKG9wZW4oZmlsZXBhdGgsICJyIikucmVhZCgpKQorCisgICAgICAgICMgdmVyaWZ5IGNvbmZpZyBmaWxlIHZhbGlkaXR5IGJlZm9yZSB1cGRhdGluZyBzZXR0aW5ncworICAgICAgICBmb3IgaSBpbiBbJ2JpdGJha2UnLCAncmVsZWFzZXMnLCAnZGVmYXVsdHJlbGVhc2UnLCAnY29uZmlnJywgJ2xheWVyc291cmNlcyddOgorICAgICAgICAgICAgYXNzZXJ0IGkgaW4gZGF0YQorCisgICAgICAgIGRlZiBfcmVhZF9naXRfdXJsX2Zyb21fbG9jYWxfcmVwb3NpdG9yeShhZGRyZXNzKToKKyAgICAgICAgICAgIHVybCA9IE5vbmUKKyAgICAgICAgICAgICMgd2UgZGV0ZWN0IHRoZSByZW1vdGUgbmFtZSBhdCBydW50aW1lCisgICAgICAgICAgICBpbXBvcnQgc3VicHJvY2VzcworICAgICAgICAgICAgKHJlbW90ZSwgcmVtb3RlX25hbWUpID0gYWRkcmVzcy5zcGxpdCgiOiIsIDEpCisgICAgICAgICAgICBjbWQgPSBzdWJwcm9jZXNzLlBvcGVuKCJnaXQgcmVtb3RlIC12Iiwgc2hlbGw9VHJ1ZSwgY3dkID0gb3MucGF0aC5kaXJuYW1lKGZpbGVwYXRoKSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyID0gc3VicHJvY2Vzcy5QSVBFKQorICAgICAgICAgICAgKG91dCxlcnIpID0gY21kLmNvbW11bmljYXRlKCkKKyAgICAgICAgICAgIGlmIGNtZC5yZXR1cm5jb2RlICE9IDA6CisgICAgICAgICAgICAgICAgbG9nZ2luZy53YXJuaW5nKCJFcnJvciB3aGlsZSBpbXBvcnRpbmcgbGF5ZXIgdmNzX3VybDogZ2l0IGVycm9yOiAlcyIgJSBlcnIpCisgICAgICAgICAgICBmb3IgbGluZSBpbiBvdXQuc3BsaXQoIlxuIik6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAobmFtZSwgcGF0aCkgPSBsaW5lLnNwbGl0KCJcdCIsIDEpCisgICAgICAgICAgICAgICAgICAgIGlmIG5hbWUgPT0gcmVtb3RlX25hbWU6CisgICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSBwYXRoLnNwbGl0KCIgIilbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGlmIHVybCA9PSBOb25lOgorICAgICAgICAgICAgICAgIGxvZ2dpbmcud2FybmluZygiRXJyb3Igd2hpbGUgbG9va2luZyBmb3IgcmVtb3RlIFwiJXNcIiBpbiBcIiVzXCIiICUgKHJlbW90ZV9uYW1lLCBvdXQpKQorICAgICAgICAgICAgcmV0dXJuIHVybAorCisKKyAgICAgICAgIyBpbXBvcnQgYml0YmFrZSBkYXRhCisgICAgICAgIGZvciBidmkgaW4gZGF0YVsnYml0YmFrZSddOgorICAgICAgICAgICAgYnZvLCBjcmVhdGVkID0gQml0YmFrZVZlcnNpb24ub2JqZWN0cy5nZXRfb3JfY3JlYXRlKG5hbWU9YnZpWyduYW1lJ10pCisgICAgICAgICAgICBpZiBidmlbJ2dpdHVybCddLnN0YXJ0c3dpdGgoInJlbW90ZToiKToKKyAgICAgICAgICAgICAgICBidm8uZ2l0dXJsID0gX3JlYWRfZ2l0X3VybF9mcm9tX2xvY2FsX3JlcG9zaXRvcnkoYnZpWydnaXR1cmwnXSkKKyAgICAgICAgICAgICAgICBpZiBidm8uZ2l0dXJsIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiVGhlIHRvYXN0ZXIgY29uZmlnIGZpbGUgcmVmZXJlbmNlcyB0aGUgbG9jYWwgZ2l0IHJlcG8sIGJ1dCBUb2FzdGVyIGNhbm5vdCBkZXRlY3QgaXQuXG5Zb3VyIGxvY2FsIGNvbmZpZ3VyYXRpb24gZm9yIGJpdGJha2UgdmVyc2lvbiAlcyBpcyBpbnZhbGlkLiBNYWtlIHN1cmUgdGhhdCB0aGUgdG9hc3RlcmNvbmYuanNvbiBmaWxlIGlzIGNvcnJlY3QuIiAlIGJ2aVsnbmFtZSddKQorCisgICAgICAgICAgICBpZiBidm8uZ2l0dXJsIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgYnZvLmdpdHVybCA9IGJ2aVsnZ2l0dXJsJ10KKyAgICAgICAgICAgIGJ2by5icmFuY2ggPSBidmlbJ2JyYW5jaCddCisgICAgICAgICAgICBidm8uZGlycGF0aCA9IGJ2aVsnZGlycGF0aCddCisgICAgICAgICAgICBidm8uc2F2ZSgpCisKKyAgICAgICAgIyBzZXQgdGhlIGxheWVyIHNvdXJjZXMKKyAgICAgICAgZm9yIGxzaSBpbiBkYXRhWydsYXllcnNvdXJjZXMnXToKKyAgICAgICAgICAgIGFzc2VydCAnc291cmNldHlwZScgaW4gbHNpCisgICAgICAgICAgICBhc3NlcnQgJ2FwaXVybCcgaW4gbHNpCisgICAgICAgICAgICBhc3NlcnQgJ25hbWUnIGluIGxzaQorICAgICAgICAgICAgYXNzZXJ0ICdicmFuY2hlcycgaW4gbHNpCisKKworICAgICAgICAgICAgaWYgX2dldF9pZF9mb3Jfc291cmNldHlwZShsc2lbJ3NvdXJjZXR5cGUnXSkgPT0gTGF5ZXJTb3VyY2UuVFlQRV9MQVlFUklOREVYIG9yIGxzaVsnYXBpdXJsJ10uc3RhcnRzd2l0aCgiLyIpOgorICAgICAgICAgICAgICAgIGFwaXVybCA9IGxzaVsnYXBpdXJsJ10KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYXBpdXJsID0gX3JlZHVjZV9jYW5vbl9wYXRoKG9zLnBhdGguam9pbihETihvcy5wYXRoLmFic3BhdGgoZmlsZXBhdGgpKSwgbHNpWydhcGl1cmwnXSkpCisKKyAgICAgICAgICAgIGFzc2VydCAoKF9nZXRfaWRfZm9yX3NvdXJjZXR5cGUobHNpWydzb3VyY2V0eXBlJ10pID09IExheWVyU291cmNlLlRZUEVfTEFZRVJJTkRFWCkgb3IgYXBpdXJsLnN0YXJ0c3dpdGgoIi8iKSksIChsc2lbJ3NvdXJjZXR5cGUnXSxhcGl1cmwpCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBscywgY3JlYXRlZCA9IExheWVyU291cmNlLm9iamVjdHMuZ2V0X29yX2NyZWF0ZShzb3VyY2V0eXBlID0gX2dldF9pZF9mb3Jfc291cmNldHlwZShsc2lbJ3NvdXJjZXR5cGUnXSksIGFwaXVybCA9IGFwaXVybCkKKyAgICAgICAgICAgICAgICBscy5uYW1lID0gbHNpWyduYW1lJ10KKyAgICAgICAgICAgICAgICBscy5zYXZlKCkKKyAgICAgICAgICAgIGV4Y2VwdCBJbnRlZ3JpdHlFcnJvciBhcyBlOgorICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCJJbnRlZ3JpdHlFcnJvciAlcyBcbldoaWxlIHNldHRpbmcgbmFtZSAlcyBmb3IgbGF5ZXIgc291cmNlICVzICIgJSAoZSwgbHNpWyduYW1lJ10sIGxzKSkKKworCisgICAgICAgICAgICBsYXllcmJyYW5jaGVzID0gW10KKyAgICAgICAgICAgIGZvciBicmFuY2huYW1lIGluIGxzaVsnYnJhbmNoZXMnXToKKyAgICAgICAgICAgICAgICBibywgY3JlYXRlZCA9IEJyYW5jaC5vYmplY3RzLmdldF9vcl9jcmVhdGUobGF5ZXJfc291cmNlID0gbHMsIG5hbWUgPSBicmFuY2huYW1lKQorICAgICAgICAgICAgICAgIGxheWVyYnJhbmNoZXMuYXBwZW5kKGJvKQorCisgICAgICAgICAgICBpZiAnbGF5ZXJzJyBpbiBsc2k6CisgICAgICAgICAgICAgICAgZm9yIGxheWVyaW5mbyBpbiBsc2lbJ2xheWVycyddOgorICAgICAgICAgICAgICAgICAgICBsbywgY3JlYXRlZCA9IExheWVyLm9iamVjdHMuZ2V0X29yX2NyZWF0ZShsYXllcl9zb3VyY2UgPSBscywgbmFtZSA9IGxheWVyaW5mb1snbmFtZSddKQorICAgICAgICAgICAgICAgICAgICBpZiBsYXllcmluZm9bJ2xvY2FsX3BhdGgnXS5zdGFydHN3aXRoKCIvIik6CisgICAgICAgICAgICAgICAgICAgICAgICBsby5sb2NhbF9wYXRoID0gbGF5ZXJpbmZvWydsb2NhbF9wYXRoJ10KKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvLmxvY2FsX3BhdGggPSBfcmVkdWNlX2Nhbm9uX3BhdGgob3MucGF0aC5qb2luKGxzLmFwaXVybCwgbGF5ZXJpbmZvWydsb2NhbF9wYXRoJ10pKQorCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhsby5sb2NhbF9wYXRoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiTG9jYWwgbGF5ZXIgcGF0aCAlcyBtdXN0IGV4aXN0cy4gQXJlIHlvdSB0cnlpbmcgdG8gaW1wb3J0IGEgbGF5ZXIgdGhhdCBkb2VzIG5vdCBleGlzdCA/IENoZWNrIHlvdXIgbG9jYWwgdG9hc3RlcmNvbmYuanNvbiIgJSBsby5sb2NhbF9wYXRoKQorCisgICAgICAgICAgICAgICAgICAgIGlmIGxheWVyaW5mb1sndmNzX3VybCddLnN0YXJ0c3dpdGgoInJlbW90ZToiKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvLnZjc191cmwgPSBfcmVhZF9naXRfdXJsX2Zyb21fbG9jYWxfcmVwb3NpdG9yeShsYXllcmluZm9bJ3Zjc191cmwnXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxvLnZjc191cmwgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIlRoZSB0b2FzdGVyIGNvbmZpZyBmaWxlIHJlZmVyZW5jZXMgdGhlIGxvY2FsIGdpdCByZXBvLCBidXQgVG9hc3RlciBjYW5ub3QgZGV0ZWN0IGl0LlxuWW91ciBsb2NhbCBjb25maWd1cmF0aW9uIGZvciBsYXllciAlcyBpcyBpbnZhbGlkLiBNYWtlIHN1cmUgdGhhdCB0aGUgdG9hc3RlcmNvbmYuanNvbiBmaWxlIGlzIGNvcnJlY3QuIiAlIGxheWVyaW5mb1snbmFtZSddKQorCisgICAgICAgICAgICAgICAgICAgIGlmIGxvLnZjc191cmwgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvLnZjc191cmwgPSBsYXllcmluZm9bJ3Zjc191cmwnXQorCisgICAgICAgICAgICAgICAgICAgIGlmICdsYXllcl9pbmRleF91cmwnIGluIGxheWVyaW5mbzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvLmxheWVyX2luZGV4X3VybCA9IGxheWVyaW5mb1snbGF5ZXJfaW5kZXhfdXJsJ10KKyAgICAgICAgICAgICAgICAgICAgbG8uc2F2ZSgpCisKKyAgICAgICAgICAgICAgICAgICAgZm9yIGJyYW5jaCBpbiBsYXllcmJyYW5jaGVzOgorICAgICAgICAgICAgICAgICAgICAgICAgbHZvLCBjcmVhdGVkID0gTGF5ZXJfVmVyc2lvbi5vYmplY3RzLmdldF9vcl9jcmVhdGUobGF5ZXJfc291cmNlID0gbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwX2JyYW5jaCA9IGJyYW5jaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWl0ID0gYnJhbmNoLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyID0gbG8pCisgICAgICAgICAgICAgICAgICAgICAgICBsdm8uZGlycGF0aCA9IGxheWVyaW5mb1snZGlycGF0aCddCisgICAgICAgICAgICAgICAgICAgICAgICBsdm8uc2F2ZSgpCisgICAgICAgICMgc2V0IHJlbGVhc2VzCisgICAgICAgIGZvciByaSBpbiBkYXRhWydyZWxlYXNlcyddOgorICAgICAgICAgICAgYnZvID0gQml0YmFrZVZlcnNpb24ub2JqZWN0cy5nZXQobmFtZSA9IHJpWydiaXRiYWtlJ10pCisgICAgICAgICAgICBhc3NlcnQgYnZvIGlzIG5vdCBOb25lCisKKyAgICAgICAgICAgIHJvLCBjcmVhdGVkID0gUmVsZWFzZS5vYmplY3RzLmdldF9vcl9jcmVhdGUobmFtZSA9IHJpWyduYW1lJ10sIGJpdGJha2VfdmVyc2lvbiA9IGJ2bywgYnJhbmNoX25hbWUgPSByaVsnYnJhbmNoJ10pCisgICAgICAgICAgICByby5kZXNjcmlwdGlvbiA9IHJpWydkZXNjcmlwdGlvbiddCisgICAgICAgICAgICByby5oZWxwdGV4dCA9IHJpWydoZWxwdGV4dCddCisgICAgICAgICAgICByby5zYXZlKCkKKworICAgICAgICAgICAgIyBzYXZlIGxheWVyIHNvdXJjZSBwcmlvcml0eSBmb3IgcmVsZWFzZQorICAgICAgICAgICAgZm9yIGxzX25hbWUgaW4gcmlbJ2xheWVyc291cmNlcHJpb3JpdHknXS5rZXlzKCk6CisgICAgICAgICAgICAgICAgcmxzcG8sIGNyZWF0ZWQgPSBSZWxlYXNlTGF5ZXJTb3VyY2VQcmlvcml0eS5vYmplY3RzLmdldF9vcl9jcmVhdGUocmVsZWFzZSA9IHJvLCBsYXllcl9zb3VyY2UgPSBMYXllclNvdXJjZS5vYmplY3RzLmdldChuYW1lPWxzX25hbWUpKQorICAgICAgICAgICAgICAgIHJsc3BvLnByaW9yaXR5ID0gcmlbJ2xheWVyc291cmNlcHJpb3JpdHknXVtsc19uYW1lXQorICAgICAgICAgICAgICAgIHJsc3BvLnNhdmUoKQorCisgICAgICAgICAgICBmb3IgZGxpIGluIHJpWydkZWZhdWx0bGF5ZXJzJ106CisgICAgICAgICAgICAgICAgIyBmaW5kIGxheWVycyB3aXRoIHRoZSBzYW1lIG5hbWUKKyAgICAgICAgICAgICAgICBSZWxlYXNlRGVmYXVsdExheWVyLm9iamVjdHMuZ2V0X29yX2NyZWF0ZSggcmVsZWFzZSA9IHJvLCBsYXllcl9uYW1lID0gZGxpKQorCisgICAgICAgICMgc2V0IGRlZmF1bHQgcmVsZWFzZQorICAgICAgICBpZiBUb2FzdGVyU2V0dGluZy5vYmplY3RzLmZpbHRlcihuYW1lID0gIkRFRkFVTFRfUkVMRUFTRSIpLmNvdW50KCkgPiAwOgorICAgICAgICAgICAgVG9hc3RlclNldHRpbmcub2JqZWN0cy5maWx0ZXIobmFtZSA9ICJERUZBVUxUX1JFTEVBU0UiKS51cGRhdGUodmFsdWUgPSBkYXRhWydkZWZhdWx0cmVsZWFzZSddKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgVG9hc3RlclNldHRpbmcub2JqZWN0cy5jcmVhdGUobmFtZSA9ICJERUZBVUxUX1JFTEVBU0UiLCB2YWx1ZSA9IGRhdGFbJ2RlZmF1bHRyZWxlYXNlJ10pCisKKyAgICAgICAgIyBzZXQgZGVmYXVsdCBjb25maWcgdmFyaWFibGVzCisgICAgICAgIGZvciBjb25maWduYW1lIGluIGRhdGFbJ2NvbmZpZyddOgorICAgICAgICAgICAgaWYgVG9hc3RlclNldHRpbmcub2JqZWN0cy5maWx0ZXIobmFtZSA9ICJERUZDT05GXyIgKyBjb25maWduYW1lKS5jb3VudCgpID4gMDoKKyAgICAgICAgICAgICAgICBUb2FzdGVyU2V0dGluZy5vYmplY3RzLmZpbHRlcihuYW1lID0gIkRFRkNPTkZfIiArIGNvbmZpZ25hbWUpLnVwZGF0ZSh2YWx1ZSA9IGRhdGFbJ2NvbmZpZyddW2NvbmZpZ25hbWVdKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBUb2FzdGVyU2V0dGluZy5vYmplY3RzLmNyZWF0ZShuYW1lID0gIkRFRkNPTkZfIiArIGNvbmZpZ25hbWUsIHZhbHVlID0gZGF0YVsnY29uZmlnJ11bY29uZmlnbmFtZV0pCisKKworICAgIGRlZiBoYW5kbGUoc2VsZiwgKmFyZ3MsICoqb3B0aW9ucyk6CisgICAgICAgIGlmIGxlbihhcmdzKSA9PSAwOgorICAgICAgICAgICAgcmFpc2UgQ29tbWFuZEVycm9yKCJOZWVkIGEgcGF0aCB0byB0aGUgdG9hc3RlcmNvbmYuanNvbiBmaWxlIikKKyAgICAgICAgZmlsZXBhdGggPSBhcmdzWzBdCisgICAgICAgIHNlbGYuX2ltcG9ydF9sYXllcl9jb25maWcoZmlsZXBhdGgpCisKKworCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvbWFuYWdlbWVudC9jb21tYW5kcy9ydW5idWlsZHMucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvbWFuYWdlbWVudC9jb21tYW5kcy9ydW5idWlsZHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNlOWI3NAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC9tYW5hZ2VtZW50L2NvbW1hbmRzL3J1bmJ1aWxkcy5weQpAQCAtMCwwICsxLDE1MyBAQAorZnJvbSBkamFuZ28uY29yZS5tYW5hZ2VtZW50LmJhc2UgaW1wb3J0IE5vQXJnc0NvbW1hbmQsIENvbW1hbmRFcnJvcgorZnJvbSBkamFuZ28uZGIgaW1wb3J0IHRyYW5zYWN0aW9uCitmcm9tIG9ybS5tb2RlbHMgaW1wb3J0IEJ1aWxkLCBUb2FzdGVyU2V0dGluZywgTG9nTWVzc2FnZSwgVGFyZ2V0Citmcm9tIGJsZGNvbnRyb2wuYmJjb250cm9sbGVyIGltcG9ydCBnZXRCdWlsZEVudmlyb25tZW50Q29udHJvbGxlciwgU2hlbGxDbWRFeGNlcHRpb24sIEJ1aWxkU2V0dXBFeGNlcHRpb24KK2Zyb20gYmxkY29udHJvbC5tb2RlbHMgaW1wb3J0IEJ1aWxkUmVxdWVzdCwgQnVpbGRFbnZpcm9ubWVudCwgQlJFcnJvciwgQlJWYXJpYWJsZQoraW1wb3J0IG9zCitpbXBvcnQgbG9nZ2luZworCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiVG9hc3RlclNjaGVkdWxlciIpCisKK2NsYXNzIENvbW1hbmQoTm9BcmdzQ29tbWFuZCk6CisgICAgYXJncyAgICA9ICIiCisgICAgaGVscCAgICA9ICJTY2hlZHVsZXMgYW5kIGV4ZWN1dGVzIGJ1aWxkIHJlcXVlc3RzIGFzIHBvc3NpYmxlLiBEb2VzIG5vdCByZXR1cm4gKGludGVycnVwdCB3aXRoIEN0cmwtQykiCisKKworICAgIEB0cmFuc2FjdGlvbi5jb21taXRfb25fc3VjY2VzcworICAgIGRlZiBfc2VsZWN0QnVpbGRFbnZpcm9ubWVudChzZWxmKToKKyAgICAgICAgYmVjID0gZ2V0QnVpbGRFbnZpcm9ubWVudENvbnRyb2xsZXIobG9jayA9IEJ1aWxkRW52aXJvbm1lbnQuTE9DS19GUkVFKQorICAgICAgICBiZWMuYmUubG9jayA9IEJ1aWxkRW52aXJvbm1lbnQuTE9DS19MT0NLCisgICAgICAgIGJlYy5iZS5zYXZlKCkKKyAgICAgICAgcmV0dXJuIGJlYworCisgICAgQHRyYW5zYWN0aW9uLmNvbW1pdF9vbl9zdWNjZXNzCisgICAgZGVmIF9zZWxlY3RCdWlsZFJlcXVlc3Qoc2VsZik6CisgICAgICAgIGJyID0gQnVpbGRSZXF1ZXN0Lm9iamVjdHMuZmlsdGVyKHN0YXRlID0gQnVpbGRSZXF1ZXN0LlJFUV9RVUVVRUQpLm9yZGVyX2J5KCdwaycpWzBdCisgICAgICAgIGJyLnN0YXRlID0gQnVpbGRSZXF1ZXN0LlJFUV9JTlBST0dSRVNTCisgICAgICAgIGJyLnNhdmUoKQorICAgICAgICByZXR1cm4gYnIKKworICAgIGRlZiBzY2hlZHVsZShzZWxmKToKKyAgICAgICAgaW1wb3J0IHRyYWNlYmFjaworICAgICAgICB0cnk6CisgICAgICAgICAgICBiciA9IE5vbmUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAjIHNlbGVjdCB0aGUgYnVpbGQgZW52aXJvbm1lbnQgYW5kIHRoZSByZXF1ZXN0IHRvIGJ1aWxkCisgICAgICAgICAgICAgICAgYnIgPSBzZWxmLl9zZWxlY3RCdWlsZFJlcXVlc3QoKQorICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICAjbG9nZ2VyLmRlYnVnKCJydW5idWlsZHM6IE5vIGJ1aWxkIHJlcXVlc3QiKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGJlYyA9IHNlbGYuX3NlbGVjdEJ1aWxkRW52aXJvbm1lbnQoKQorICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICAjIHdlIGNvdWxkIG5vdCBmaW5kIGEgQkVDOyBwb3N0cG9uZSB0aGUgQlIKKyAgICAgICAgICAgICAgICBici5zdGF0ZSA9IEJ1aWxkUmVxdWVzdC5SRVFfUVVFVUVECisgICAgICAgICAgICAgICAgYnIuc2F2ZSgpCisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJydW5idWlsZHM6IE5vIGJ1aWxkIGVudiIpCisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygicnVuYnVpbGRzOiBzdGFydGluZyBidWlsZCAlcywgZW52aXJvbm1lbnQgJXMiICUgKGJyLCBiZWMuYmUpKQorCisgICAgICAgICAgICAjIHdyaXRlIHRoZSBidWlsZCBpZGVudGlmaWNhdGlvbiB2YXJpYWJsZQorICAgICAgICAgICAgQlJWYXJpYWJsZS5vYmplY3RzLmNyZWF0ZShyZXEgPSBiciwgbmFtZT0iVE9BU1RFUl9CUkJFIiwgdmFsdWU9IiVkOiVkIiAlIChici5waywgYmVjLmJlLnBrKSkKKworICAgICAgICAgICAgIyBsZXQgdGhlIGJ1aWxkIHJlcXVlc3Qga25vdyB3aGVyZSBpdCBpcyBiZWluZyBleGVjdXRlZAorICAgICAgICAgICAgYnIuZW52aXJvbm1lbnQgPSBiZWMuYmUKKyAgICAgICAgICAgIGJyLnNhdmUoKQorCisgICAgICAgICAgICAjIHRoaXMgdHJpZ2dlcnMgYW4gYXN5bmMgYnVpbGQKKyAgICAgICAgICAgIGJlYy50cmlnZ2VyQnVpbGQoYnIuYnJiaXRiYWtlX3NldC5hbGwoKSwgYnIuYnJsYXllcl9zZXQuYWxsKCksIGJyLmJydmFyaWFibGVfc2V0LmFsbCgpLCBici5icnRhcmdldF9zZXQuYWxsKCkpCisKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJydW5idWlsZHM6IEVycm9yIGxhdW5jaGluZyBidWlsZCAlcyIgJSBlKQorICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YyhlKQorICAgICAgICAgICAgaWYgIltFcnJubyAxMTFdIENvbm5lY3Rpb24gcmVmdXNlZCIgaW4gc3RyKGUpOgorICAgICAgICAgICAgICAgICMgQ29ubmVjdGlvbiByZWZ1c2VkLCByZWFkIHRvYXN0ZXJfc2VydmVyLm91dAorICAgICAgICAgICAgICAgIGVycm1zZyA9IGJlYy5yZWFkU2VydmVyTG9nRmlsZSgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGVycm1zZyA9IHN0cihlKQorCisgICAgICAgICAgICBCUkVycm9yLm9iamVjdHMuY3JlYXRlKHJlcSA9IGJyLAorICAgICAgICAgICAgICAgICAgICBlcnJ0eXBlID0gc3RyKHR5cGUoZSkpLAorICAgICAgICAgICAgICAgICAgICBlcnJtc2cgPSBlcnJtc2csCisgICAgICAgICAgICAgICAgICAgIHRyYWNlYmFjayA9IHRyYWNlYmFjay5mb3JtYXRfZXhjKGUpKQorICAgICAgICAgICAgYnIuc3RhdGUgPSBCdWlsZFJlcXVlc3QuUkVRX0ZBSUxFRAorICAgICAgICAgICAgYnIuc2F2ZSgpCisgICAgICAgICAgICBiZWMuYmUubG9jayA9IEJ1aWxkRW52aXJvbm1lbnQuTE9DS19GUkVFCisgICAgICAgICAgICBiZWMuYmUuc2F2ZSgpCisKKyAgICBkZWYgYXJjaGl2ZShzZWxmKToKKyAgICAgICAgJycnIGFyY2hpdmVzIGRhdGEgZnJvbSB0aGUgYnVpbGRzICcnJworICAgICAgICBhcnRpZmFjdF9zdG9yYWdlX2RpciA9IFRvYXN0ZXJTZXR0aW5nLm9iamVjdHMuZ2V0KG5hbWU9IkFSVElGQUNUU19TVE9SQUdFX0RJUiIpLnZhbHVlCisgICAgICAgIGZvciBiciBpbiBCdWlsZFJlcXVlc3Qub2JqZWN0cy5maWx0ZXIoc3RhdGUgPSBCdWlsZFJlcXVlc3QuUkVRX0FSQ0hJVkUpOgorICAgICAgICAgICAgIyBzYXZlIGNvb2tlciBsb2cKKyAgICAgICAgICAgIGlmIGJyLmJ1aWxkID09IE5vbmU6CisgICAgICAgICAgICAgICAgYnIuc3RhdGUgPSBCdWlsZFJlcXVlc3QuUkVRX0ZBSUxFRAorICAgICAgICAgICAgICAgIGJyLnNhdmUoKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBidWlsZF9hcnRpZmFjdF9zdG9yYWdlX2RpciA9IG9zLnBhdGguam9pbihhcnRpZmFjdF9zdG9yYWdlX2RpciwgIiVkIiAlIGJyLmJ1aWxkLnBrKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLm1ha2VkaXJzKGJ1aWxkX2FydGlmYWN0X3N0b3JhZ2VfZGlyKQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgb3NlOgorICAgICAgICAgICAgICAgIGlmICJGaWxlIGV4aXN0cyIgaW4gc3RyKG9zZSk6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBvc2UKKworICAgICAgICAgICAgZmlsZV9uYW1lID0gb3MucGF0aC5qb2luKGJ1aWxkX2FydGlmYWN0X3N0b3JhZ2VfZGlyLCAiY29va2VyX2xvZy50eHQiKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdpdGggb3BlbihmaWxlX25hbWUsICJ3IikgYXMgZjoKKyAgICAgICAgICAgICAgICAgICAgZi53cml0ZShici5lbnZpcm9ubWVudC5nZXRfYXJ0aWZhY3QoYnIuYnVpbGQuY29va2VyX2xvZ19wYXRoKS5yZWFkKCkpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsoZmlsZV9uYW1lKQorCisgICAgICAgICAgICBici5zdGF0ZSA9IEJ1aWxkUmVxdWVzdC5SRVFfQ09NUExFVEVECisgICAgICAgICAgICBici5zYXZlKCkKKworICAgIGRlZiBjbGVhbnVwKHNlbGYpOgorICAgICAgICBmcm9tIGRqYW5nby51dGlscyBpbXBvcnQgdGltZXpvbmUKKyAgICAgICAgZnJvbSBkYXRldGltZSBpbXBvcnQgdGltZWRlbHRhCisgICAgICAgICMgZW52aXJvbm1lbnRzIGxvY2tlZCBmb3IgbW9yZSB0aGFuIDMwIHNlY29uZHMgLSB0aGV5IHNob3VsZCBiZSB1bmxvY2tlZAorICAgICAgICBCdWlsZEVudmlyb25tZW50Lm9iamVjdHMuZmlsdGVyKGJ1aWxkcmVxdWVzdF9fc3RhdGVfX2luPVtCdWlsZFJlcXVlc3QuUkVRX0ZBSUxFRCwgQnVpbGRSZXF1ZXN0LlJFUV9DT01QTEVURURdKS5maWx0ZXIobG9jaz1CdWlsZEVudmlyb25tZW50LkxPQ0tfTE9DSykuZmlsdGVyKHVwZGF0ZWRfX2x0ID0gdGltZXpvbmUubm93KCkgLSB0aW1lZGVsdGEoc2Vjb25kcyA9IDMwKSkudXBkYXRlKGxvY2sgPSBCdWlsZEVudmlyb25tZW50LkxPQ0tfRlJFRSkKKworCisgICAgICAgICMgdXBkYXRlIGFsbCBCdWlsZHMgdGhhdCBmYWlsZWQgdG8gc3RhcnQKKworICAgICAgICBmb3IgYnIgaW4gQnVpbGRSZXF1ZXN0Lm9iamVjdHMuZmlsdGVyKHN0YXRlID0gQnVpbGRSZXF1ZXN0LlJFUV9GQUlMRUQsIGJ1aWxkX19vdXRjb21lID0gQnVpbGQuSU5fUFJPR1JFU1MpOgorICAgICAgICAgICAgIyB0cmFuc3Bvc2UgdGhlIGxhdW5jaCBlcnJvcnMgaW4gVG9hc3RlckV4Y2VwdGlvbnMKKyAgICAgICAgICAgIGJyLmJ1aWxkLm91dGNvbWUgPSBCdWlsZC5GQUlMRUQKKyAgICAgICAgICAgIGZvciBicmVycm9yIGluIGJyLmJyZXJyb3Jfc2V0LmFsbCgpOgorICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiU2F2aW5nIGVycm9yICVzIiAlIGJyZXJyb3IpCisgICAgICAgICAgICAgICAgTG9nTWVzc2FnZS5vYmplY3RzLmNyZWF0ZShidWlsZCA9IGJyLmJ1aWxkLCBsZXZlbCA9IExvZ01lc3NhZ2UuRVhDRVBUSU9OLCBtZXNzYWdlID0gYnJlcnJvci5lcnJtc2cpCisgICAgICAgICAgICBici5idWlsZC5zYXZlKCkKKworICAgICAgICAgICAgIyB3ZSBkb24ndCBoYXZlIGEgdHJ1ZSBidWlsZCBvYmplY3QgaGVyZTsgaGVuY2UsIHRvYXN0ZXJ1aSBkaWRuJ3QgaGF2ZSBhIGNoYW5nZSB0byByZWxlYXNlIHRoZSBCRSBsb2NrCisgICAgICAgICAgICBici5lbnZpcm9ubWVudC5sb2NrID0gQnVpbGRFbnZpcm9ubWVudC5MT0NLX0ZSRUUKKyAgICAgICAgICAgIGJyLmVudmlyb25tZW50LnNhdmUoKQorCisKKworICAgICAgICAjIHVwZGF0ZSBhbGwgQnVpbGRSZXF1ZXN0cyB3aXRob3V0IGEgYnVpbGQgY3JlYXRlZAorICAgICAgICBmb3IgYnIgaW4gQnVpbGRSZXF1ZXN0Lm9iamVjdHMuZmlsdGVyKGJ1aWxkID0gTm9uZSk6CisgICAgICAgICAgICBici5idWlsZCA9IEJ1aWxkLm9iamVjdHMuY3JlYXRlKHByb2plY3QgPSBici5wcm9qZWN0LCBjb21wbGV0ZWRfb24gPSBici51cGRhdGVkLCBzdGFydGVkX29uID0gYnIuY3JlYXRlZCkKKyAgICAgICAgICAgIGJyLmJ1aWxkLm91dGNvbWUgPSBCdWlsZC5GQUlMRUQKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBici5idWlsZC5tYWNoaW5lID0gYnIuYnJ2YXJpYWJsZV9zZXQuZ2V0KG5hbWU9J01BQ0hJTkUnKS52YWx1ZQorICAgICAgICAgICAgZXhjZXB0IEJSVmFyaWFibGUuRG9lc05vdEV4aXN0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGJyLnNhdmUoKQorICAgICAgICAgICAgIyB0cmFuc3Bvc2UgdGFyZ2V0IGluZm9ybWF0aW9uCisgICAgICAgICAgICBmb3IgYnJ0YXJnZXQgaW4gYnIuYnJ0YXJnZXRfc2V0LmFsbCgpOgorICAgICAgICAgICAgICAgIFRhcmdldC5vYmplY3RzLmNyZWF0ZShidWlsZCA9IGJyLmJ1aWxkLCB0YXJnZXQ9IGJydGFyZ2V0LnRhcmdldCkKKyAgICAgICAgICAgICMgdHJhbnNwb3NlIHRoZSBsYXVuY2ggZXJyb3JzIGluIFRvYXN0ZXJFeGNlcHRpb25zCisgICAgICAgICAgICBmb3IgYnJlcnJvciBpbiBici5icmVycm9yX3NldC5hbGwoKToKKyAgICAgICAgICAgICAgICBMb2dNZXNzYWdlLm9iamVjdHMuY3JlYXRlKGJ1aWxkID0gYnIuYnVpbGQsIGxldmVsID0gTG9nTWVzc2FnZS5FWENFUFRJT04sIG1lc3NhZ2UgPSBicmVycm9yLmVycm1zZykKKworICAgICAgICAgICAgYnIuYnVpbGQuc2F2ZSgpCisgICAgICAgIHBhc3MKKworCisgICAgZGVmIGhhbmRsZV9ub2FyZ3Moc2VsZiwgKipvcHRpb25zKToKKyAgICAgICAgc2VsZi5jbGVhbnVwKCkKKyAgICAgICAgc2VsZi5hcmNoaXZlKCkKKyAgICAgICAgc2VsZi5zY2hlZHVsZSgpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvbWlncmF0aW9ucy8wMDAxX2luaXRpYWwucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvbWlncmF0aW9ucy8wMDAxX2luaXRpYWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdlNjM1MAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC9taWdyYXRpb25zLzAwMDFfaW5pdGlhbC5weQpAQCAtMCwwICsxLDE1NCBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KK2Zyb20gc291dGgudXRpbHMgaW1wb3J0IGRhdGV0aW1lX3V0aWxzIGFzIGRhdGV0aW1lCitmcm9tIHNvdXRoLmRiIGltcG9ydCBkYgorZnJvbSBzb3V0aC52MiBpbXBvcnQgU2NoZW1hTWlncmF0aW9uCitmcm9tIGRqYW5nby5kYiBpbXBvcnQgbW9kZWxzCisKKworY2xhc3MgTWlncmF0aW9uKFNjaGVtYU1pZ3JhdGlvbik6CisKKyAgICBkZWYgZm9yd2FyZHMoc2VsZiwgb3JtKToKKyAgICAgICAgIyBBZGRpbmcgbW9kZWwgJ0J1aWxkRW52aXJvbm1lbnQnCisgICAgICAgIGRiLmNyZWF0ZV90YWJsZSh1J2JsZGNvbnRyb2xfYnVpbGRlbnZpcm9ubWVudCcsICgKKyAgICAgICAgICAgICh1J2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJykocHJpbWFyeV9rZXk9VHJ1ZSkpLAorICAgICAgICAgICAgKCdhZGRyZXNzJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0yNTQpKSwKKyAgICAgICAgICAgICgnYmV0eXBlJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJykoKSksCisgICAgICAgICAgICAoJ2JiYWRkcmVzcycsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MjU0LCBibGFuaz1UcnVlKSksCisgICAgICAgICAgICAoJ2JicG9ydCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcpKGRlZmF1bHQ9LTEpKSwKKyAgICAgICAgICAgICgnYmJ0b2tlbicsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MTI2LCBibGFuaz1UcnVlKSksCisgICAgICAgICAgICAoJ2Jic3RhdGUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnKShkZWZhdWx0PTApKSwKKyAgICAgICAgICAgICgnbG9jaycsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcpKGRlZmF1bHQ9MCkpLAorICAgICAgICAgICAgKCdjcmVhdGVkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcpKGF1dG9fbm93X2FkZD1UcnVlLCBibGFuaz1UcnVlKSksCisgICAgICAgICAgICAoJ3VwZGF0ZWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJykoYXV0b19ub3c9VHJ1ZSwgYmxhbms9VHJ1ZSkpLAorICAgICAgICApKQorICAgICAgICBkYi5zZW5kX2NyZWF0ZV9zaWduYWwodSdibGRjb250cm9sJywgWydCdWlsZEVudmlyb25tZW50J10pCisKKyAgICAgICAgIyBBZGRpbmcgbW9kZWwgJ0J1aWxkUmVxdWVzdCcKKyAgICAgICAgZGIuY3JlYXRlX3RhYmxlKHUnYmxkY29udHJvbF9idWlsZHJlcXVlc3QnLCAoCisgICAgICAgICAgICAodSdpZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcpKHByaW1hcnlfa2V5PVRydWUpKSwKKyAgICAgICAgICAgICgncHJvamVjdCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHRvPW9ybVsnb3JtLlByb2plY3QnXSkpLAorICAgICAgICAgICAgKCdidWlsZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHRvPW9ybVsnb3JtLkJ1aWxkJ10sIG51bGw9VHJ1ZSkpLAorICAgICAgICAgICAgKCdzdGF0ZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcpKGRlZmF1bHQ9MCkpLAorICAgICAgICAgICAgKCdjcmVhdGVkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcpKGF1dG9fbm93X2FkZD1UcnVlLCBibGFuaz1UcnVlKSksCisgICAgICAgICAgICAoJ3VwZGF0ZWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJykoYXV0b19ub3c9VHJ1ZSwgYmxhbms9VHJ1ZSkpLAorICAgICAgICApKQorICAgICAgICBkYi5zZW5kX2NyZWF0ZV9zaWduYWwodSdibGRjb250cm9sJywgWydCdWlsZFJlcXVlc3QnXSkKKworICAgICAgICAjIEFkZGluZyBtb2RlbCAnQlJMYXllcicKKyAgICAgICAgZGIuY3JlYXRlX3RhYmxlKHUnYmxkY29udHJvbF9icmxheWVyJywgKAorICAgICAgICAgICAgKHUnaWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnKShwcmltYXJ5X2tleT1UcnVlKSksCisgICAgICAgICAgICAoJ3JlcScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHRvPW9ybVsnYmxkY29udHJvbC5CdWlsZFJlcXVlc3QnXSkpLAorICAgICAgICAgICAgKCduYW1lJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0xMDApKSwKKyAgICAgICAgICAgICgnZ2l0dXJsJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0yNTQpKSwKKyAgICAgICAgICAgICgnY29tbWl0Jywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0yNTQpKSwKKyAgICAgICAgKSkKKyAgICAgICAgZGIuc2VuZF9jcmVhdGVfc2lnbmFsKHUnYmxkY29udHJvbCcsIFsnQlJMYXllciddKQorCisgICAgICAgICMgQWRkaW5nIG1vZGVsICdCUlZhcmlhYmxlJworICAgICAgICBkYi5jcmVhdGVfdGFibGUodSdibGRjb250cm9sX2JydmFyaWFibGUnLCAoCisgICAgICAgICAgICAodSdpZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcpKHByaW1hcnlfa2V5PVRydWUpKSwKKyAgICAgICAgICAgICgncmVxJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykodG89b3JtWydibGRjb250cm9sLkJ1aWxkUmVxdWVzdCddKSksCisgICAgICAgICAgICAoJ25hbWUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTEwMCkpLAorICAgICAgICAgICAgKCd2YWx1ZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcpKGJsYW5rPVRydWUpKSwKKyAgICAgICAgKSkKKyAgICAgICAgZGIuc2VuZF9jcmVhdGVfc2lnbmFsKHUnYmxkY29udHJvbCcsIFsnQlJWYXJpYWJsZSddKQorCisgICAgICAgICMgQWRkaW5nIG1vZGVsICdCUlRhcmdldCcKKyAgICAgICAgZGIuY3JlYXRlX3RhYmxlKHUnYmxkY29udHJvbF9icnRhcmdldCcsICgKKyAgICAgICAgICAgICh1J2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJykocHJpbWFyeV9rZXk9VHJ1ZSkpLAorICAgICAgICAgICAgKCdyZXEnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKSh0bz1vcm1bJ2JsZGNvbnRyb2wuQnVpbGRSZXF1ZXN0J10pKSwKKyAgICAgICAgICAgICgndGFyZ2V0Jywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0xMDApKSwKKyAgICAgICAgICAgICgndGFzaycsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MTAwLCBudWxsPVRydWUpKSwKKyAgICAgICAgKSkKKyAgICAgICAgZGIuc2VuZF9jcmVhdGVfc2lnbmFsKHUnYmxkY29udHJvbCcsIFsnQlJUYXJnZXQnXSkKKworCisgICAgZGVmIGJhY2t3YXJkcyhzZWxmLCBvcm0pOgorICAgICAgICAjIERlbGV0aW5nIG1vZGVsICdCdWlsZEVudmlyb25tZW50JworICAgICAgICBkYi5kZWxldGVfdGFibGUodSdibGRjb250cm9sX2J1aWxkZW52aXJvbm1lbnQnKQorCisgICAgICAgICMgRGVsZXRpbmcgbW9kZWwgJ0J1aWxkUmVxdWVzdCcKKyAgICAgICAgZGIuZGVsZXRlX3RhYmxlKHUnYmxkY29udHJvbF9idWlsZHJlcXVlc3QnKQorCisgICAgICAgICMgRGVsZXRpbmcgbW9kZWwgJ0JSTGF5ZXInCisgICAgICAgIGRiLmRlbGV0ZV90YWJsZSh1J2JsZGNvbnRyb2xfYnJsYXllcicpCisKKyAgICAgICAgIyBEZWxldGluZyBtb2RlbCAnQlJWYXJpYWJsZScKKyAgICAgICAgZGIuZGVsZXRlX3RhYmxlKHUnYmxkY29udHJvbF9icnZhcmlhYmxlJykKKworICAgICAgICAjIERlbGV0aW5nIG1vZGVsICdCUlRhcmdldCcKKyAgICAgICAgZGIuZGVsZXRlX3RhYmxlKHUnYmxkY29udHJvbF9icnRhcmdldCcpCisKKworICAgIG1vZGVscyA9IHsKKyAgICAgICAgdSdibGRjb250cm9sLmJybGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQlJMYXllcid9LAorICAgICAgICAgICAgJ2NvbW1pdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICAnZ2l0dXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVxJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydibGRjb250cm9sLkJ1aWxkUmVxdWVzdCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnYmxkY29udHJvbC5icnRhcmdldCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCUlRhcmdldCd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZXEnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ2JsZGNvbnRyb2wuQnVpbGRSZXF1ZXN0J10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdibGRjb250cm9sLmJydmFyaWFibGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQlJWYXJpYWJsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdyZXEnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ2JsZGNvbnRyb2wuQnVpbGRSZXF1ZXN0J10ifSksCisgICAgICAgICAgICAndmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdibGRjb250cm9sLmJ1aWxkZW52aXJvbm1lbnQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQnVpbGRFbnZpcm9ubWVudCd9LAorICAgICAgICAgICAgJ2FkZHJlc3MnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgJ2JiYWRkcmVzcyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdiYnBvcnQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnLTEnfSksCisgICAgICAgICAgICAnYmJzdGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2JidG9rZW4nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTI2JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnYmV0eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2NyZWF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vd19hZGQnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsb2NrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAndXBkYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93JzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J2JsZGNvbnRyb2wuYnVpbGRyZXF1ZXN0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0J1aWxkUmVxdWVzdCd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnY3JlYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93X2FkZCc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSksCisgICAgICAgICAgICAnc3RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd1cGRhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3cnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmJ1aWxkJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0J1aWxkJ30sCisgICAgICAgICAgICAnYml0YmFrZV92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ2J1aWxkX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2NvbXBsZXRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnY29va2VyX2xvZ19wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Ryb192ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdlcnJvcnNfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWFjaGluZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnb3V0Y29tZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcyJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3N0YXJ0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ3RpbWVzcGVudCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3dhcm5pbmdzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0J30sCisgICAgICAgICAgICAnY3JlYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93X2FkZCc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3VwZGF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vdyc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbXBsZXRlX2FwcHMgPSBbJ2JsZGNvbnRyb2wnXQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL21pZ3JhdGlvbnMvMDAwMl9hdXRvX19hZGRfZmllbGRfYnVpbGRlbnZpcm9ubWVudF9zb3VyY2VkaXJfX2FkZF9maWVsZF9idWlsZGVudmlyb25tZW50LnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL21pZ3JhdGlvbnMvMDAwMl9hdXRvX19hZGRfZmllbGRfYnVpbGRlbnZpcm9ubWVudF9zb3VyY2VkaXJfX2FkZF9maWVsZF9idWlsZGVudmlyb25tZW50LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MjJhNTAKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvbWlncmF0aW9ucy8wMDAyX2F1dG9fX2FkZF9maWVsZF9idWlsZGVudmlyb25tZW50X3NvdXJjZWRpcl9fYWRkX2ZpZWxkX2J1aWxkZW52aXJvbm1lbnQucHkKQEAgLTAsMCArMSwxMDYgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCitmcm9tIHNvdXRoLnV0aWxzIGltcG9ydCBkYXRldGltZV91dGlscyBhcyBkYXRldGltZQorZnJvbSBzb3V0aC5kYiBpbXBvcnQgZGIKK2Zyb20gc291dGgudjIgaW1wb3J0IFNjaGVtYU1pZ3JhdGlvbgorZnJvbSBkamFuZ28uZGIgaW1wb3J0IG1vZGVscworCisKK2NsYXNzIE1pZ3JhdGlvbihTY2hlbWFNaWdyYXRpb24pOgorCisgICAgZGVmIGZvcndhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgQWRkaW5nIGZpZWxkICdCdWlsZEVudmlyb25tZW50LnNvdXJjZWRpcicKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J2JsZGNvbnRyb2xfYnVpbGRlbnZpcm9ubWVudCcsICdzb3VyY2VkaXInLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKGRlZmF1bHQ9JycsIG1heF9sZW5ndGg9NTEyLCBibGFuaz1UcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICBrZWVwX2RlZmF1bHQ9RmFsc2UpCisKKyAgICAgICAgIyBBZGRpbmcgZmllbGQgJ0J1aWxkRW52aXJvbm1lbnQuYnVpbGRkaXInCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdibGRjb250cm9sX2J1aWxkZW52aXJvbm1lbnQnLCAnYnVpbGRkaXInLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKGRlZmF1bHQ9JycsIG1heF9sZW5ndGg9NTEyLCBibGFuaz1UcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICBrZWVwX2RlZmF1bHQ9RmFsc2UpCisKKworICAgIGRlZiBiYWNrd2FyZHMoc2VsZiwgb3JtKToKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnQnVpbGRFbnZpcm9ubWVudC5zb3VyY2VkaXInCisgICAgICAgIGRiLmRlbGV0ZV9jb2x1bW4odSdibGRjb250cm9sX2J1aWxkZW52aXJvbm1lbnQnLCAnc291cmNlZGlyJykKKworICAgICAgICAjIERlbGV0aW5nIGZpZWxkICdCdWlsZEVudmlyb25tZW50LmJ1aWxkZGlyJworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnYmxkY29udHJvbF9idWlsZGVudmlyb25tZW50JywgJ2J1aWxkZGlyJykKKworCisgICAgbW9kZWxzID0geworICAgICAgICB1J2JsZGNvbnRyb2wuYnJsYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCUkxheWVyJ30sCisgICAgICAgICAgICAnY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgICdnaXR1cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdyZXEnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ2JsZGNvbnRyb2wuQnVpbGRSZXF1ZXN0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdibGRjb250cm9sLmJydGFyZ2V0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0JSVGFyZ2V0J30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JlcSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnYmxkY29udHJvbC5CdWlsZFJlcXVlc3QnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J2JsZGNvbnRyb2wuYnJ2YXJpYWJsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCUlZhcmlhYmxlJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlcSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnYmxkY29udHJvbC5CdWlsZFJlcXVlc3QnXSJ9KSwKKyAgICAgICAgICAgICd2YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J2JsZGNvbnRyb2wuYnVpbGRlbnZpcm9ubWVudCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZEVudmlyb25tZW50J30sCisgICAgICAgICAgICAnYWRkcmVzcyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICAnYmJhZGRyZXNzJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2JicG9ydCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICctMSd9KSwKKyAgICAgICAgICAgICdiYnN0YXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnYmJ0b2tlbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMjYnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdiZXR5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnYnVpbGRkaXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTEyJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnY3JlYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93X2FkZCc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xvY2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzb3VyY2VkaXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTEyJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBkYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93JzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J2JsZGNvbnRyb2wuYnVpbGRyZXF1ZXN0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0J1aWxkUmVxdWVzdCd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnY3JlYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93X2FkZCc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSksCisgICAgICAgICAgICAnc3RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd1cGRhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3cnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmJ1aWxkJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0J1aWxkJ30sCisgICAgICAgICAgICAnYml0YmFrZV92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ2J1aWxkX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2NvbXBsZXRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnY29va2VyX2xvZ19wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Ryb192ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdlcnJvcnNfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWFjaGluZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnb3V0Y29tZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcyJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3N0YXJ0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ3RpbWVzcGVudCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3dhcm5pbmdzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0J30sCisgICAgICAgICAgICAnYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ2NyZWF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vd19hZGQnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdzaG9ydF9kZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwZGF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vdyc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXNlcl9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb21wbGV0ZV9hcHBzID0gWydibGRjb250cm9sJ10KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvbWlncmF0aW9ucy8wMDAzX2F1dG9fX2FkZF9maWVsZF9icmxheWVyX2RpcnBhdGgucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvbWlncmF0aW9ucy8wMDAzX2F1dG9fX2FkZF9maWVsZF9icmxheWVyX2RpcnBhdGgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjliYTgzOAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC9taWdyYXRpb25zLzAwMDNfYXV0b19fYWRkX2ZpZWxkX2JybGF5ZXJfZGlycGF0aC5weQpAQCAtMCwwICsxLDk5IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorZnJvbSBzb3V0aC51dGlscyBpbXBvcnQgZGF0ZXRpbWVfdXRpbHMgYXMgZGF0ZXRpbWUKK2Zyb20gc291dGguZGIgaW1wb3J0IGRiCitmcm9tIHNvdXRoLnYyIGltcG9ydCBTY2hlbWFNaWdyYXRpb24KK2Zyb20gZGphbmdvLmRiIGltcG9ydCBtb2RlbHMKKworCitjbGFzcyBNaWdyYXRpb24oU2NoZW1hTWlncmF0aW9uKToKKworICAgIGRlZiBmb3J3YXJkcyhzZWxmLCBvcm0pOgorICAgICAgICAjIEFkZGluZyBmaWVsZCAnQlJMYXllci5kaXJwYXRoJworICAgICAgICBkYi5hZGRfY29sdW1uKHUnYmxkY29udHJvbF9icmxheWVyJywgJ2RpcnBhdGgnLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKGRlZmF1bHQ9JycsIG1heF9sZW5ndGg9MjU0KSwKKyAgICAgICAgICAgICAgICAgICAgICBrZWVwX2RlZmF1bHQ9RmFsc2UpCisKKworICAgIGRlZiBiYWNrd2FyZHMoc2VsZiwgb3JtKToKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnQlJMYXllci5kaXJwYXRoJworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnYmxkY29udHJvbF9icmxheWVyJywgJ2RpcnBhdGgnKQorCisKKyAgICBtb2RlbHMgPSB7CisgICAgICAgIHUnYmxkY29udHJvbC5icmxheWVyJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0JSTGF5ZXInfSwKKyAgICAgICAgICAgICdjb21taXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgJ2RpcnBhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgJ2dpdHVybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlcSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnYmxkY29udHJvbC5CdWlsZFJlcXVlc3QnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J2JsZGNvbnRyb2wuYnJ0YXJnZXQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQlJUYXJnZXQnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVxJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydibGRjb250cm9sLkJ1aWxkUmVxdWVzdCddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnYmxkY29udHJvbC5icnZhcmlhYmxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0JSVmFyaWFibGUnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVxJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydibGRjb250cm9sLkJ1aWxkUmVxdWVzdCddIn0pLAorICAgICAgICAgICAgJ3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnYmxkY29udHJvbC5idWlsZGVudmlyb25tZW50JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0J1aWxkRW52aXJvbm1lbnQnfSwKKyAgICAgICAgICAgICdhZGRyZXNzJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgICdiYmFkZHJlc3MnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnYmJwb3J0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJy0xJ30pLAorICAgICAgICAgICAgJ2Jic3RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdiYnRva2VuJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyNicsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2JldHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdidWlsZGRpcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MTInLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdjcmVhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3dfYWRkJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbG9jayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3NvdXJjZWRpcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MTInLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cGRhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3cnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnYmxkY29udHJvbC5idWlsZHJlcXVlc3QnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQnVpbGRSZXF1ZXN0J30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdjcmVhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3dfYWRkJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSJ9KSwKKyAgICAgICAgICAgICdzdGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3VwZGF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vdyc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0uYnVpbGQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQnVpbGQnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnYnVpbGRfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnY29tcGxldGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdjb29rZXJfbG9nX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Rybyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZGlzdHJvX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Vycm9yc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtYWNoaW5lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzInfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3RhcnRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAndGltZXNwZW50JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnd2FybmluZ3Nfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Byb2plY3QnfSwKKyAgICAgICAgICAgICdicmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnY3JlYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93X2FkZCc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Nob3J0X2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBkYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93JzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1c2VyX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbXBsZXRlX2FwcHMgPSBbJ2JsZGNvbnRyb2wnXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC9taWdyYXRpb25zLzAwMDRfbG9hZGluaXRpYWxkYXRhLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL21pZ3JhdGlvbnMvMDAwNF9sb2FkaW5pdGlhbGRhdGEucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkwODU3OAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC9taWdyYXRpb25zLzAwMDRfbG9hZGluaXRpYWxkYXRhLnB5CkBAIC0wLDAgKzEsMTA0IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorZnJvbSBzb3V0aC51dGlscyBpbXBvcnQgZGF0ZXRpbWVfdXRpbHMgYXMgZGF0ZXRpbWUKK2Zyb20gc291dGguZGIgaW1wb3J0IGRiCitmcm9tIHNvdXRoLnYyIGltcG9ydCBEYXRhTWlncmF0aW9uCitmcm9tIGRqYW5nby5kYiBpbXBvcnQgbW9kZWxzCisKK2NsYXNzIE1pZ3JhdGlvbihEYXRhTWlncmF0aW9uKToKKworICAgIGRlZiBmb3J3YXJkcyhzZWxmLCBvcm0pOgorICAgICAgICAiV3JpdGUgeW91ciBmb3J3YXJkcyBtZXRob2RzIGhlcmUuIgorICAgICAgICAjIE5vdGU6IERvbid0IHVzZSAiZnJvbSBhcHBuYW1lLm1vZGVscyBpbXBvcnQgTW9kZWxOYW1lIi4KKyAgICAgICAgIyBVc2Ugb3JtLk1vZGVsTmFtZSB0byByZWZlciB0byBtb2RlbHMgaW4gdGhpcyBhcHBsaWNhdGlvbiwKKyAgICAgICAgIyBhbmQgb3JtWydhcHBuYW1lLk1vZGVsTmFtZSddIGZvciBtb2RlbHMgaW4gb3RoZXIgYXBwbGljYXRpb25zLgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcm0uQnVpbGRFbnZpcm9ubWVudC5vYmplY3RzLmdldChwayA9IDEpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGZyb20gZGphbmdvLnV0aWxzIGltcG9ydCB0aW1lem9uZQorICAgICAgICAgICAgb3JtLkJ1aWxkRW52aXJvbm1lbnQub2JqZWN0cy5jcmVhdGUocGsgPSAxLAorICAgICAgICAgICAgICAgIGNyZWF0ZWQgPSB0aW1lem9uZS5ub3coKSwKKyAgICAgICAgICAgICAgICB1cGRhdGVkID0gdGltZXpvbmUubm93KCksCisgICAgICAgICAgICAgICAgYmV0eXBlID0gMCkKKworICAgIGRlZiBiYWNrd2FyZHMoc2VsZiwgb3JtKToKKyAgICAgICAgIldyaXRlIHlvdXIgYmFja3dhcmRzIG1ldGhvZHMgaGVyZS4iCisKKyAgICBtb2RlbHMgPSB7CisgICAgICAgIHUnYmxkY29udHJvbC5icmxheWVyJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0JSTGF5ZXInfSwKKyAgICAgICAgICAgICdjb21taXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgJ2RpcnBhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgJ2dpdHVybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlcSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnYmxkY29udHJvbC5CdWlsZFJlcXVlc3QnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J2JsZGNvbnRyb2wuYnJ0YXJnZXQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQlJUYXJnZXQnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVxJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydibGRjb250cm9sLkJ1aWxkUmVxdWVzdCddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnYmxkY29udHJvbC5icnZhcmlhYmxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0JSVmFyaWFibGUnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVxJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydibGRjb250cm9sLkJ1aWxkUmVxdWVzdCddIn0pLAorICAgICAgICAgICAgJ3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnYmxkY29udHJvbC5idWlsZGVudmlyb25tZW50JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0J1aWxkRW52aXJvbm1lbnQnfSwKKyAgICAgICAgICAgICdhZGRyZXNzJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgICdiYmFkZHJlc3MnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnYmJwb3J0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJy0xJ30pLAorICAgICAgICAgICAgJ2Jic3RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdiYnRva2VuJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyNicsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2JldHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdidWlsZGRpcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MTInLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdjcmVhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3dfYWRkJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbG9jayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3NvdXJjZWRpcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MTInLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cGRhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3cnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnYmxkY29udHJvbC5idWlsZHJlcXVlc3QnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQnVpbGRSZXF1ZXN0J30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdjcmVhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3dfYWRkJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSJ9KSwKKyAgICAgICAgICAgICdzdGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3VwZGF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vdyc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0uYnVpbGQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQnVpbGQnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnYnVpbGRfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnY29tcGxldGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdjb29rZXJfbG9nX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Rybyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZGlzdHJvX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Vycm9yc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtYWNoaW5lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzInfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3RhcnRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAndGltZXNwZW50JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnd2FybmluZ3Nfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Byb2plY3QnfSwKKyAgICAgICAgICAgICdicmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnY3JlYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93X2FkZCc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Nob3J0X2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBkYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93JzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1c2VyX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbXBsZXRlX2FwcHMgPSBbJ2JsZGNvbnRyb2wnXQorICAgIHN5bW1ldHJpY2FsID0gVHJ1ZQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL21pZ3JhdGlvbnMvMDAwNV9hdXRvX19hZGRfYnJlcnJvci5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC9taWdyYXRpb25zLzAwMDVfYXV0b19fYWRkX2JyZXJyb3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThhZWI0MQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC9taWdyYXRpb25zLzAwMDVfYXV0b19fYWRkX2JyZXJyb3IucHkKQEAgLTAsMCArMSwxMTIgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCitmcm9tIHNvdXRoLnV0aWxzIGltcG9ydCBkYXRldGltZV91dGlscyBhcyBkYXRldGltZQorZnJvbSBzb3V0aC5kYiBpbXBvcnQgZGIKK2Zyb20gc291dGgudjIgaW1wb3J0IFNjaGVtYU1pZ3JhdGlvbgorZnJvbSBkamFuZ28uZGIgaW1wb3J0IG1vZGVscworCisKK2NsYXNzIE1pZ3JhdGlvbihTY2hlbWFNaWdyYXRpb24pOgorCisgICAgZGVmIGZvcndhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgQWRkaW5nIG1vZGVsICdCUkVycm9yJworICAgICAgICBkYi5jcmVhdGVfdGFibGUodSdibGRjb250cm9sX2JyZXJyb3InLCAoCisgICAgICAgICAgICAodSdpZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcpKHByaW1hcnlfa2V5PVRydWUpKSwKKyAgICAgICAgICAgICgncmVxJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykodG89b3JtWydibGRjb250cm9sLkJ1aWxkUmVxdWVzdCddKSksCisgICAgICAgICAgICAoJ2VycnR5cGUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTEwMCkpLAorICAgICAgICAgICAgKCdlcnJtc2cnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnKSgpKSwKKyAgICAgICAgICAgICgndHJhY2ViYWNrJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJykoKSksCisgICAgICAgICkpCisgICAgICAgIGRiLnNlbmRfY3JlYXRlX3NpZ25hbCh1J2JsZGNvbnRyb2wnLCBbJ0JSRXJyb3InXSkKKworCisgICAgZGVmIGJhY2t3YXJkcyhzZWxmLCBvcm0pOgorICAgICAgICAjIERlbGV0aW5nIG1vZGVsICdCUkVycm9yJworICAgICAgICBkYi5kZWxldGVfdGFibGUodSdibGRjb250cm9sX2JyZXJyb3InKQorCisKKyAgICBtb2RlbHMgPSB7CisgICAgICAgIHUnYmxkY29udHJvbC5icmVycm9yJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0JSRXJyb3InfSwKKyAgICAgICAgICAgICdlcnJtc2cnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnZXJydHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JlcSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnYmxkY29udHJvbC5CdWlsZFJlcXVlc3QnXSJ9KSwKKyAgICAgICAgICAgICd0cmFjZWJhY2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdibGRjb250cm9sLmJybGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQlJMYXllcid9LAorICAgICAgICAgICAgJ2NvbW1pdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICAnZGlycGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICAnZ2l0dXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVxJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydibGRjb250cm9sLkJ1aWxkUmVxdWVzdCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnYmxkY29udHJvbC5icnRhcmdldCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCUlRhcmdldCd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZXEnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ2JsZGNvbnRyb2wuQnVpbGRSZXF1ZXN0J10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdibGRjb250cm9sLmJydmFyaWFibGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQlJWYXJpYWJsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdyZXEnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ2JsZGNvbnRyb2wuQnVpbGRSZXF1ZXN0J10ifSksCisgICAgICAgICAgICAndmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdibGRjb250cm9sLmJ1aWxkZW52aXJvbm1lbnQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQnVpbGRFbnZpcm9ubWVudCd9LAorICAgICAgICAgICAgJ2FkZHJlc3MnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgJ2JiYWRkcmVzcyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdiYnBvcnQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnLTEnfSksCisgICAgICAgICAgICAnYmJzdGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2JidG9rZW4nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTI2JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnYmV0eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2J1aWxkZGlyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUxMicsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2NyZWF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vd19hZGQnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsb2NrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnc291cmNlZGlyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUxMicsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwZGF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vdyc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdibGRjb250cm9sLmJ1aWxkcmVxdWVzdCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZFJlcXVlc3QnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2NyZWF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vd19hZGQnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pLAorICAgICAgICAgICAgJ3N0YXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAndXBkYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93JzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5idWlsZCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZCd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdidWlsZF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdjb21wbGV0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2Nvb2tlcl9sb2dfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnfSksCisgICAgICAgICAgICAnZGlzdHJvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm9fdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZXJyb3JzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21hY2hpbmUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMid9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzdGFydGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICd0aW1lc3BlbnQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd3YXJuaW5nc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3QnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdCd9LAorICAgICAgICAgICAgJ2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdjcmVhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3dfYWRkJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnc2hvcnRfZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cGRhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3cnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VzZXJfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9CisgICAgfQorCisgICAgY29tcGxldGVfYXBwcyA9IFsnYmxkY29udHJvbCddClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL21pZ3JhdGlvbnMvMDAwNl9hdXRvX19hZGRfYnJiaXRiYWtlLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL21pZ3JhdGlvbnMvMDAwNl9hdXRvX19hZGRfYnJiaXRiYWtlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0Mzg4ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvbWlncmF0aW9ucy8wMDA2X2F1dG9fX2FkZF9icmJpdGJha2UucHkKQEAgLTAsMCArMSwxMjggQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCitmcm9tIHNvdXRoLnV0aWxzIGltcG9ydCBkYXRldGltZV91dGlscyBhcyBkYXRldGltZQorZnJvbSBzb3V0aC5kYiBpbXBvcnQgZGIKK2Zyb20gc291dGgudjIgaW1wb3J0IFNjaGVtYU1pZ3JhdGlvbgorZnJvbSBkamFuZ28uZGIgaW1wb3J0IG1vZGVscworCisKK2NsYXNzIE1pZ3JhdGlvbihTY2hlbWFNaWdyYXRpb24pOgorCisgICAgZGVmIGZvcndhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgQWRkaW5nIG1vZGVsICdCUkJpdGJha2UnCisgICAgICAgIGRiLmNyZWF0ZV90YWJsZSh1J2JsZGNvbnRyb2xfYnJiaXRiYWtlJywgKAorICAgICAgICAgICAgKHUnaWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnKShwcmltYXJ5X2tleT1UcnVlKSksCisgICAgICAgICAgICAoJ3JlcScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHRvPW9ybVsnYmxkY29udHJvbC5CdWlsZFJlcXVlc3QnXSwgdW5pcXVlPVRydWUpKSwKKyAgICAgICAgICAgICgnZ2l0dXJsJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0yNTQpKSwKKyAgICAgICAgICAgICgnY29tbWl0Jywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0yNTQpKSwKKyAgICAgICAgICAgICgnZGlycGF0aCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MjU0KSksCisgICAgICAgICkpCisgICAgICAgIGRiLnNlbmRfY3JlYXRlX3NpZ25hbCh1J2JsZGNvbnRyb2wnLCBbJ0JSQml0YmFrZSddKQorCisKKyAgICBkZWYgYmFja3dhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgRGVsZXRpbmcgbW9kZWwgJ0JSQml0YmFrZScKKyAgICAgICAgZGIuZGVsZXRlX3RhYmxlKHUnYmxkY29udHJvbF9icmJpdGJha2UnKQorCisKKyAgICBtb2RlbHMgPSB7CisgICAgICAgIHUnYmxkY29udHJvbC5icmJpdGJha2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQlJCaXRiYWtlJ30sCisgICAgICAgICAgICAnY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgICdkaXJwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgICdnaXR1cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZXEnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ2JsZGNvbnRyb2wuQnVpbGRSZXF1ZXN0J10iLCAndW5pcXVlJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdibGRjb250cm9sLmJyZXJyb3InOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQlJFcnJvcid9LAorICAgICAgICAgICAgJ2Vycm1zZyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdlcnJ0eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVxJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydibGRjb250cm9sLkJ1aWxkUmVxdWVzdCddIn0pLAorICAgICAgICAgICAgJ3RyYWNlYmFjayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J2JsZGNvbnRyb2wuYnJsYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCUkxheWVyJ30sCisgICAgICAgICAgICAnY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgICdkaXJwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgICdnaXR1cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdyZXEnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ2JsZGNvbnRyb2wuQnVpbGRSZXF1ZXN0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdibGRjb250cm9sLmJydGFyZ2V0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0JSVGFyZ2V0J30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JlcSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnYmxkY29udHJvbC5CdWlsZFJlcXVlc3QnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J2JsZGNvbnRyb2wuYnJ2YXJpYWJsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCUlZhcmlhYmxlJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlcSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnYmxkY29udHJvbC5CdWlsZFJlcXVlc3QnXSJ9KSwKKyAgICAgICAgICAgICd2YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J2JsZGNvbnRyb2wuYnVpbGRlbnZpcm9ubWVudCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZEVudmlyb25tZW50J30sCisgICAgICAgICAgICAnYWRkcmVzcyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICAnYmJhZGRyZXNzJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2JicG9ydCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICctMSd9KSwKKyAgICAgICAgICAgICdiYnN0YXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnYmJ0b2tlbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMjYnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdiZXR5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnYnVpbGRkaXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTEyJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnY3JlYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93X2FkZCc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xvY2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzb3VyY2VkaXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTEyJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBkYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93JzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J2JsZGNvbnRyb2wuYnVpbGRyZXF1ZXN0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0J1aWxkUmVxdWVzdCd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnY3JlYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93X2FkZCc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSksCisgICAgICAgICAgICAnc3RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd1cGRhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3cnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmJpdGJha2V2ZXJzaW9uJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0JpdGJha2VWZXJzaW9uJ30sCisgICAgICAgICAgICAnYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzMyJ30pLAorICAgICAgICAgICAgJ2RpcnBhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ2dpdHVybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsndW5pcXVlJzogJ1RydWUnLCAnbWF4X2xlbmd0aCc6ICczMid9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5idWlsZCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZCd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdidWlsZF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdjb21wbGV0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2Nvb2tlcl9sb2dfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnfSksCisgICAgICAgICAgICAnZGlzdHJvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm9fdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZXJyb3JzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21hY2hpbmUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMid9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzdGFydGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICd0aW1lc3BlbnQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd3YXJuaW5nc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3QnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdCd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJpdGJha2VWZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnY3JlYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93X2FkZCc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Nob3J0X2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBkYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93JzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1c2VyX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbXBsZXRlX2FwcHMgPSBbJ2JsZGNvbnRyb2wnXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC9taWdyYXRpb25zLzAwMDdfYXV0b19fYWRkX2ZpZWxkX2J1aWxkcmVxdWVzdF9lbnZpcm9ubWVudF9fY2hnX2ZpZWxkX2J1aWxkcmVxdWVzdF9idWlsZC5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC9taWdyYXRpb25zLzAwMDdfYXV0b19fYWRkX2ZpZWxkX2J1aWxkcmVxdWVzdF9lbnZpcm9ubWVudF9fY2hnX2ZpZWxkX2J1aWxkcmVxdWVzdF9idWlsZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDY3N2EyCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL21pZ3JhdGlvbnMvMDAwN19hdXRvX19hZGRfZmllbGRfYnVpbGRyZXF1ZXN0X2Vudmlyb25tZW50X19jaGdfZmllbGRfYnVpbGRyZXF1ZXN0X2J1aWxkLnB5CkBAIC0wLDAgKzEsMTQ1IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorZnJvbSBzb3V0aC51dGlscyBpbXBvcnQgZGF0ZXRpbWVfdXRpbHMgYXMgZGF0ZXRpbWUKK2Zyb20gc291dGguZGIgaW1wb3J0IGRiCitmcm9tIHNvdXRoLnYyIGltcG9ydCBTY2hlbWFNaWdyYXRpb24KK2Zyb20gZGphbmdvLmRiIGltcG9ydCBtb2RlbHMKKworCitjbGFzcyBNaWdyYXRpb24oU2NoZW1hTWlncmF0aW9uKToKKworICAgIGRlZiBmb3J3YXJkcyhzZWxmLCBvcm0pOgorICAgICAgICAjIEFkZGluZyBmaWVsZCAnQnVpbGRSZXF1ZXN0LmVudmlyb25tZW50JworICAgICAgICBkYi5hZGRfY29sdW1uKHUnYmxkY29udHJvbF9idWlsZHJlcXVlc3QnLCAnZW52aXJvbm1lbnQnLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHRvPW9ybVsnYmxkY29udHJvbC5CdWlsZEVudmlyb25tZW50J10sIG51bGw9VHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisKKyAgICAgICAgIyBDaGFuZ2luZyBmaWVsZCAnQnVpbGRSZXF1ZXN0LmJ1aWxkJworICAgICAgICBkYi5hbHRlcl9jb2x1bW4odSdibGRjb250cm9sX2J1aWxkcmVxdWVzdCcsICdidWlsZF9pZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuT25lVG9PbmVGaWVsZCcpKHRvPW9ybVsnb3JtLkJ1aWxkJ10sIHVuaXF1ZT1UcnVlLCBudWxsPVRydWUpKQorICAgICAgICAjIEFkZGluZyB1bmlxdWUgY29uc3RyYWludCBvbiAnQnVpbGRSZXF1ZXN0JywgZmllbGRzIFsnYnVpbGQnXQorICAgICAgICBkYi5jcmVhdGVfdW5pcXVlKHUnYmxkY29udHJvbF9idWlsZHJlcXVlc3QnLCBbJ2J1aWxkX2lkJ10pCisKKworICAgIGRlZiBiYWNrd2FyZHMoc2VsZiwgb3JtKToKKyAgICAgICAgIyBSZW1vdmluZyB1bmlxdWUgY29uc3RyYWludCBvbiAnQnVpbGRSZXF1ZXN0JywgZmllbGRzIFsnYnVpbGQnXQorICAgICAgICBkYi5kZWxldGVfdW5pcXVlKHUnYmxkY29udHJvbF9idWlsZHJlcXVlc3QnLCBbJ2J1aWxkX2lkJ10pCisKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnQnVpbGRSZXF1ZXN0LmVudmlyb25tZW50JworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnYmxkY29udHJvbF9idWlsZHJlcXVlc3QnLCAnZW52aXJvbm1lbnRfaWQnKQorCisKKyAgICAgICAgIyBDaGFuZ2luZyBmaWVsZCAnQnVpbGRSZXF1ZXN0LmJ1aWxkJworICAgICAgICBkYi5hbHRlcl9jb2x1bW4odSdibGRjb250cm9sX2J1aWxkcmVxdWVzdCcsICdidWlsZF9pZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHRvPW9ybVsnb3JtLkJ1aWxkJ10sIG51bGw9VHJ1ZSkpCisKKyAgICBtb2RlbHMgPSB7CisgICAgICAgIHUnYmxkY29udHJvbC5icmJpdGJha2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQlJCaXRiYWtlJ30sCisgICAgICAgICAgICAnY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgICdkaXJwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgICdnaXR1cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZXEnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ2JsZGNvbnRyb2wuQnVpbGRSZXF1ZXN0J10iLCAndW5pcXVlJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdibGRjb250cm9sLmJyZXJyb3InOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQlJFcnJvcid9LAorICAgICAgICAgICAgJ2Vycm1zZyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdlcnJ0eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVxJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydibGRjb250cm9sLkJ1aWxkUmVxdWVzdCddIn0pLAorICAgICAgICAgICAgJ3RyYWNlYmFjayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J2JsZGNvbnRyb2wuYnJsYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCUkxheWVyJ30sCisgICAgICAgICAgICAnY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgICdkaXJwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgICdnaXR1cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdyZXEnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ2JsZGNvbnRyb2wuQnVpbGRSZXF1ZXN0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdibGRjb250cm9sLmJydGFyZ2V0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0JSVGFyZ2V0J30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JlcSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnYmxkY29udHJvbC5CdWlsZFJlcXVlc3QnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J2JsZGNvbnRyb2wuYnJ2YXJpYWJsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCUlZhcmlhYmxlJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlcSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnYmxkY29udHJvbC5CdWlsZFJlcXVlc3QnXSJ9KSwKKyAgICAgICAgICAgICd2YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J2JsZGNvbnRyb2wuYnVpbGRlbnZpcm9ubWVudCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZEVudmlyb25tZW50J30sCisgICAgICAgICAgICAnYWRkcmVzcyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICAnYmJhZGRyZXNzJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2JicG9ydCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICctMSd9KSwKKyAgICAgICAgICAgICdiYnN0YXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnYmJ0b2tlbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMjYnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdiZXR5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnYnVpbGRkaXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTEyJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnY3JlYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93X2FkZCc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xvY2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzb3VyY2VkaXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTEyJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBkYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93JzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J2JsZGNvbnRyb2wuYnVpbGRyZXF1ZXN0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0J1aWxkUmVxdWVzdCd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLk9uZVRvT25lRmllbGQnLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSIsICd1bmlxdWUnOiAnVHJ1ZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnY3JlYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93X2FkZCc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZW52aXJvbm1lbnQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ2JsZGNvbnRyb2wuQnVpbGRFbnZpcm9ubWVudCddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSJ9KSwKKyAgICAgICAgICAgICdzdGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3VwZGF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vdyc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0uYml0YmFrZXZlcnNpb24nOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQml0YmFrZVZlcnNpb24nfSwKKyAgICAgICAgICAgICdicmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMzInfSksCisgICAgICAgICAgICAnZGlycGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAnZ2l0dXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeyd1bmlxdWUnOiAnVHJ1ZScsICdtYXhfbGVuZ3RoJzogJzMyJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmJ1aWxkJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0J1aWxkJ30sCisgICAgICAgICAgICAnYml0YmFrZV92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ2J1aWxkX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2NvbXBsZXRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnY29va2VyX2xvZ19wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Ryb192ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdlcnJvcnNfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWFjaGluZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnb3V0Y29tZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcyJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3N0YXJ0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ3RpbWVzcGVudCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3dhcm5pbmdzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0J30sCisgICAgICAgICAgICAnYml0YmFrZV92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQml0YmFrZVZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICdjcmVhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3dfYWRkJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVsZWFzZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlJlbGVhc2UnXSJ9KSwKKyAgICAgICAgICAgICdzaG9ydF9kZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwZGF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vdyc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXNlcl9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlbGVhc2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVsZWFzZSd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJpdGJha2VWZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzMyJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsndW5pcXVlJzogJ1RydWUnLCAnbWF4X2xlbmd0aCc6ICczMid9KQorICAgICAgICB9CisgICAgfQorCisgICAgY29tcGxldGVfYXBwcyA9IFsnYmxkY29udHJvbCddClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL21pZ3JhdGlvbnMvMDAwOF9icmFyY2hpdmUucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvbWlncmF0aW9ucy8wMDA4X2JyYXJjaGl2ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTQ2OTYwCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL21pZ3JhdGlvbnMvMDAwOF9icmFyY2hpdmUucHkKQEAgLTAsMCArMSwxMzggQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCitmcm9tIHNvdXRoLnV0aWxzIGltcG9ydCBkYXRldGltZV91dGlscyBhcyBkYXRldGltZQorZnJvbSBzb3V0aC5kYiBpbXBvcnQgZGIKK2Zyb20gc291dGgudjIgaW1wb3J0IERhdGFNaWdyYXRpb24KK2Zyb20gZGphbmdvLmRiIGltcG9ydCBtb2RlbHMKKworY2xhc3MgTWlncmF0aW9uKERhdGFNaWdyYXRpb24pOgorICAgICMgaWRzIHRoYXQgY2Fubm90IGJlIGltcG9ydGVkIGZyb20gQnVpbGRSZXF1ZXN0CisKKyAgICBkZWYgZm9yd2FyZHMoc2VsZiwgb3JtKToKKyAgICAgICAgUkVRX0NPTVBMRVRFRCA9IDMKKyAgICAgICAgUkVRX0FSQ0hJVkUgPSA2CisgICAgICAgICJXcml0ZSB5b3VyIGZvcndhcmRzIG1ldGhvZHMgaGVyZS4iCisgICAgICAgICMgTm90ZTogRG9uJ3QgdXNlICJmcm9tIGFwcG5hbWUubW9kZWxzIGltcG9ydCBNb2RlbE5hbWUiLgorICAgICAgICAjIFVzZSBvcm0uTW9kZWxOYW1lIHRvIHJlZmVyIHRvIG1vZGVscyBpbiB0aGlzIGFwcGxpY2F0aW9uLAorICAgICAgICAjIGFuZCBvcm1bJ2FwcG5hbWUuTW9kZWxOYW1lJ10gZm9yIG1vZGVscyBpbiBvdGhlciBhcHBsaWNhdGlvbnMuCisgICAgICAgIG9ybS5CdWlsZFJlcXVlc3Qub2JqZWN0cy5maWx0ZXIoc3RhdGU9UkVRX0NPTVBMRVRFRCkudXBkYXRlKHN0YXRlPVJFUV9BUkNISVZFKQorCisgICAgZGVmIGJhY2t3YXJkcyhzZWxmLCBvcm0pOgorICAgICAgICBSRVFfQ09NUExFVEVEID0gMworICAgICAgICBSRVFfQVJDSElWRSA9IDYKKyAgICAgICAgIldyaXRlIHlvdXIgYmFja3dhcmRzIG1ldGhvZHMgaGVyZS4iCisgICAgICAgIG9ybS5CdWlsZFJlcXVlc3Qub2JqZWN0cy5maWx0ZXIoc3RhdGU9UkVRX0FSQ0hJVkUpLnVwZGF0ZShzdGF0ZT1SRVFfQ09NUExFVEVEKQorCisgICAgbW9kZWxzID0geworICAgICAgICB1J2JsZGNvbnRyb2wuYnJiaXRiYWtlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0JSQml0YmFrZSd9LAorICAgICAgICAgICAgJ2NvbW1pdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICAnZGlycGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICAnZ2l0dXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVxJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydibGRjb250cm9sLkJ1aWxkUmVxdWVzdCddIiwgJ3VuaXF1ZSc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnYmxkY29udHJvbC5icmVycm9yJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0JSRXJyb3InfSwKKyAgICAgICAgICAgICdlcnJtc2cnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnZXJydHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JlcSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnYmxkY29udHJvbC5CdWlsZFJlcXVlc3QnXSJ9KSwKKyAgICAgICAgICAgICd0cmFjZWJhY2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdibGRjb250cm9sLmJybGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQlJMYXllcid9LAorICAgICAgICAgICAgJ2NvbW1pdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICAnZGlycGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICAnZ2l0dXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVxJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydibGRjb250cm9sLkJ1aWxkUmVxdWVzdCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnYmxkY29udHJvbC5icnRhcmdldCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCUlRhcmdldCd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZXEnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ2JsZGNvbnRyb2wuQnVpbGRSZXF1ZXN0J10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdibGRjb250cm9sLmJydmFyaWFibGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQlJWYXJpYWJsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdyZXEnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ2JsZGNvbnRyb2wuQnVpbGRSZXF1ZXN0J10ifSksCisgICAgICAgICAgICAndmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdibGRjb250cm9sLmJ1aWxkZW52aXJvbm1lbnQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQnVpbGRFbnZpcm9ubWVudCd9LAorICAgICAgICAgICAgJ2FkZHJlc3MnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgJ2JiYWRkcmVzcyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdiYnBvcnQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnLTEnfSksCisgICAgICAgICAgICAnYmJzdGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2JidG9rZW4nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTI2JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnYmV0eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2J1aWxkZGlyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUxMicsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2NyZWF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vd19hZGQnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsb2NrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnc291cmNlZGlyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUxMicsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwZGF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vdyc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdibGRjb250cm9sLmJ1aWxkcmVxdWVzdCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZFJlcXVlc3QnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5PbmVUb09uZUZpZWxkJywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10iLCAndW5pcXVlJzogJ1RydWUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2NyZWF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vd19hZGQnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2Vudmlyb25tZW50JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydibGRjb250cm9sLkJ1aWxkRW52aXJvbm1lbnQnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSksCisgICAgICAgICAgICAnc3RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd1cGRhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3cnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmJpdGJha2V2ZXJzaW9uJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0JpdGJha2VWZXJzaW9uJ30sCisgICAgICAgICAgICAnYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzMyJ30pLAorICAgICAgICAgICAgJ2RpcnBhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ2dpdHVybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsndW5pcXVlJzogJ1RydWUnLCAnbWF4X2xlbmd0aCc6ICczMid9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5idWlsZCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZCd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdidWlsZF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdjb21wbGV0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2Nvb2tlcl9sb2dfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnfSksCisgICAgICAgICAgICAnZGlzdHJvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm9fdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZXJyb3JzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21hY2hpbmUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMid9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzdGFydGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICd0aW1lc3BlbnQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd3YXJuaW5nc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3QnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdCd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJpdGJha2VWZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnY3JlYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93X2FkZCc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlbGVhc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5SZWxlYXNlJ10ifSksCisgICAgICAgICAgICAnc2hvcnRfZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cGRhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3cnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VzZXJfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWxlYXNlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlbGVhc2UnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CaXRiYWtlVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ2JyYW5jaF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogIicnIiwgJ21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ2hlbHB0ZXh0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J3VuaXF1ZSc6ICdUcnVlJywgJ21heF9sZW5ndGgnOiAnMzInfSkKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbXBsZXRlX2FwcHMgPSBbJ2JsZGNvbnRyb2wnXQorICAgIHN5bW1ldHJpY2FsID0gVHJ1ZQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL21pZ3JhdGlvbnMvX19pbml0X18ucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvbWlncmF0aW9ucy9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL21pZ3JhdGlvbnMvX19pbml0X18ucHkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC9tb2RlbHMucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvbW9kZWxzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MWRlNTgKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvbW9kZWxzLnB5CkBAIC0wLDAgKzEsMTY0IEBACitmcm9tIGRqYW5nby5kYiBpbXBvcnQgbW9kZWxzCitmcm9tIGRqYW5nby5jb3JlLnZhbGlkYXRvcnMgaW1wb3J0IE1heFZhbHVlVmFsaWRhdG9yLCBNaW5WYWx1ZVZhbGlkYXRvcgorZnJvbSBvcm0ubW9kZWxzIGltcG9ydCBQcm9qZWN0LCBQcm9qZWN0TGF5ZXIsIFByb2plY3RWYXJpYWJsZSwgUHJvamVjdFRhcmdldCwgQnVpbGQKKworIyBhIEJ1aWxkRW52aXJvbm1lbnQgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlICJidWlsZC8iIGRpcmVjdG9yeSBvbiB0aGUgbG9jYWxob3N0CitjbGFzcyBCdWlsZEVudmlyb25tZW50KG1vZGVscy5Nb2RlbCk6CisgICAgU0VSVkVSX1NUT1BQRUQgPSAwCisgICAgU0VSVkVSX1NUQVJURUQgPSAxCisgICAgU0VSVkVSX1NUQVRFID0gKAorICAgICAgICAoU0VSVkVSX1NUT1BQRUQsICJzdG9wcGVkIiksCisgICAgICAgIChTRVJWRVJfU1RBUlRFRCwgInN0YXJ0ZWQiKSwKKyAgICApCisKKyAgICBUWVBFX0xPQ0FMID0gMAorICAgIFRZUEVfU1NIICAgPSAxCisgICAgVFlQRSA9ICgKKyAgICAgICAgKFRZUEVfTE9DQUwsICJsb2NhbCIpLAorICAgICAgICAoVFlQRV9TU0gsICJzc2giKSwKKyAgICApCisKKyAgICBMT0NLX0ZSRUUgPSAwCisgICAgTE9DS19MT0NLID0gMQorICAgIExPQ0tfUlVOTklORyA9IDIKKyAgICBMT0NLX1NUQVRFID0gKAorICAgICAgICAoTE9DS19GUkVFLCAiZnJlZSIpLAorICAgICAgICAoTE9DS19MT0NLLCAibG9jayIpLAorICAgICAgICAoTE9DS19SVU5OSU5HLCAicnVubmluZyIpLAorICAgICkKKworICAgIGFkZHJlc3MgICAgID0gbW9kZWxzLkNoYXJGaWVsZChtYXhfbGVuZ3RoID0gMjU0KQorICAgIGJldHlwZSAgICAgID0gbW9kZWxzLkludGVnZXJGaWVsZChjaG9pY2VzID0gVFlQRSkKKyAgICBiYmFkZHJlc3MgICA9IG1vZGVscy5DaGFyRmllbGQobWF4X2xlbmd0aCA9IDI1NCwgYmxhbmsgPSBUcnVlKQorICAgIGJicG9ydCAgICAgID0gbW9kZWxzLkludGVnZXJGaWVsZChkZWZhdWx0ID0gLTEpCisgICAgYmJ0b2tlbiAgICAgPSBtb2RlbHMuQ2hhckZpZWxkKG1heF9sZW5ndGggPSAxMjYsIGJsYW5rID0gVHJ1ZSkKKyAgICBiYnN0YXRlICAgICA9IG1vZGVscy5JbnRlZ2VyRmllbGQoY2hvaWNlcyA9IFNFUlZFUl9TVEFURSwgZGVmYXVsdCA9IFNFUlZFUl9TVE9QUEVEKQorICAgIHNvdXJjZWRpciAgID0gbW9kZWxzLkNoYXJGaWVsZChtYXhfbGVuZ3RoID0gNTEyLCBibGFuayA9IFRydWUpCisgICAgYnVpbGRkaXIgICAgPSBtb2RlbHMuQ2hhckZpZWxkKG1heF9sZW5ndGggPSA1MTIsIGJsYW5rID0gVHJ1ZSkKKyAgICBsb2NrICAgICAgICA9IG1vZGVscy5JbnRlZ2VyRmllbGQoY2hvaWNlcyA9IExPQ0tfU1RBVEUsIGRlZmF1bHQgPSBMT0NLX0ZSRUUpCisgICAgY3JlYXRlZCAgICAgPSBtb2RlbHMuRGF0ZVRpbWVGaWVsZChhdXRvX25vd19hZGQgPSBUcnVlKQorICAgIHVwZGF0ZWQgICAgID0gbW9kZWxzLkRhdGVUaW1lRmllbGQoYXV0b19ub3cgPSBUcnVlKQorCisKKyAgICBkZWYgZ2V0X2FydGlmYWN0X3R5cGUoc2VsZiwgcGF0aCk6CisgICAgICAgIGlmIHNlbGYuYmV0eXBlID09IEJ1aWxkRW52aXJvbm1lbnQuVFlQRV9MT0NBTDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbXBvcnQgbWFnaWMKKworICAgICAgICAgICAgICAgICMgZmFpciB3YXJuaW5nOiB0aGlzIGlzIGEgbWVzczsgdGhlcmUgYXJlIG11bHRpcGxlIGNvbXBldGVpbmcgYW5kIGluY29tcGF0aWJsZQorICAgICAgICAgICAgICAgICMgbWFnaWMgbW9kdWxlcyBmbG9hdGluZyBhcm91bmQsIHNvIHdlIHRyeSBzb21lIG9mIHRoZSBtb3N0IGNvbW1vbiBjb21iaW5hdGlvbnMKKworICAgICAgICAgICAgICAgIHRyeTogICAgIyB3ZSB0cnkgdWJ1bnR1J3MgcHl0aG9uLW1hZ2ljIDUuNAorICAgICAgICAgICAgICAgICAgICBtID0gbWFnaWMub3BlbihtYWdpYy5NQUdJQ19NSU1FX1RZUEUpCisgICAgICAgICAgICAgICAgICAgIG0ubG9hZCgpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtLmZpbGUocGF0aCkKKyAgICAgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgICAgIHRyeTogICAgIyB3ZSB0cnkgcHl0aG9uLW1hZ2ljIDAuNC42CisgICAgICAgICAgICAgICAgICAgIG0gPSBtYWdpYy5NYWdpYyhtYWdpYy5NQUdJQ19NSU1FKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbS5mcm9tX2ZpbGUocGF0aCkKKyAgICAgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgICAgIHRyeTogICAgIyB3ZSB0cnkgcGlwIGZpbGVtYWdpYyAxLjYKKyAgICAgICAgICAgICAgICAgICAgbSA9IG1hZ2ljLk1hZ2ljKGZsYWdzPW1hZ2ljLk1BR0lDX01JTUVfVFlQRSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG0uaWRfZmlsZW5hbWUocGF0aCkKKyAgICAgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgICAgIHJldHVybiAiYmluYXJ5L29jdGV0LXN0cmVhbSIKKyAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICByZXR1cm4gImJpbmFyeS9vY3RldC1zdHJlYW0iCisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiRklYTUU6IGFydGlmYWN0IHR5cGUgbm90IGltcGxlbWVudGVkIGZvciBidWlsZCBlbnZpcm9ubWVudCB0eXBlICVzIiAlIHNlbGYuZ2V0X2JldHlwZV9kaXNwbGF5KCkpCisKKworICAgIGRlZiBnZXRfYXJ0aWZhY3Qoc2VsZiwgcGF0aCk6CisgICAgICAgIGlmIHNlbGYuYmV0eXBlID09IEJ1aWxkRW52aXJvbm1lbnQuVFlQRV9MT0NBTDoKKyAgICAgICAgICAgIHJldHVybiBvcGVuKHBhdGgsICJyIikKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJGSVhNRTogYXJ0aWZhY3QgZG93bmxvYWQgbm90IGltcGxlbWVudGVkIGZvciBidWlsZCBlbnZpcm9ubWVudCB0eXBlICVzIiAlIHNlbGYuZ2V0X2JldHlwZV9kaXNwbGF5KCkpCisKKyAgICBkZWYgaGFzX2FydGlmYWN0KHNlbGYsIHBhdGgpOgorICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgaWYgc2VsZi5iZXR5cGUgPT0gQnVpbGRFbnZpcm9ubWVudC5UWVBFX0xPQ0FMOgorICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguZXhpc3RzKHBhdGgpCisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiRklYTUU6IGhhcyBhcnRpZmFjdCBub3QgaW1wbGVtZW50ZWQgZm9yIGJ1aWxkIGVudmlyb25tZW50IHR5cGUgJXMiICUgc2VsZi5nZXRfYmV0eXBlX2Rpc3BsYXkoKSkKKworIyBhIEJ1aWxkUmVxdWVzdCBpcyBhIHJlcXVlc3QgdGhhdCB0aGUgc2NoZWR1bGVyIHdpbGwgYnVpbGQgdXNpbmcgYSBCdWlsZEVudmlyb25tZW50CisjIHRoZSBidWlsZCByZXF1ZXN0IHF1ZXVlIGlzIHRoZSB0YWJsZSBpdHNlbGYsIG9yZGVyZWQgYnkgc3RhdGUKKworY2xhc3MgQnVpbGRSZXF1ZXN0KG1vZGVscy5Nb2RlbCk6CisgICAgUkVRX0NSRUFURUQgPSAwCisgICAgUkVRX1FVRVVFRCA9IDEKKyAgICBSRVFfSU5QUk9HUkVTUyA9IDIKKyAgICBSRVFfQ09NUExFVEVEID0gMworICAgIFJFUV9GQUlMRUQgPSA0CisgICAgUkVRX0RFTEVURUQgPSA1CisgICAgUkVRX0FSQ0hJVkUgPSA2CisKKyAgICBSRVFVRVNUX1NUQVRFID0gKAorICAgICAgICAoUkVRX0NSRUFURUQsICJjcmVhdGVkIiksCisgICAgICAgIChSRVFfUVVFVUVELCAicXVldWVkIiksCisgICAgICAgIChSRVFfSU5QUk9HUkVTUywgImluIHByb2dyZXNzIiksCisgICAgICAgIChSRVFfQ09NUExFVEVELCAiY29tcGxldGVkIiksCisgICAgICAgIChSRVFfRkFJTEVELCAiZmFpbGVkIiksCisgICAgICAgIChSRVFfREVMRVRFRCwgImRlbGV0ZWQiKSwKKyAgICAgICAgKFJFUV9BUkNISVZFLCAiYXJjaGl2ZSIpLAorICAgICkKKworICAgIHNlYXJjaF9hbGxvd2VkX2ZpZWxkcyA9ICgiYnJ0YXJnZXRfX3RhcmdldCIsICJidWlsZF9fcHJvamVjdF9fbmFtZSIpCisKKyAgICBwcm9qZWN0ICAgICA9IG1vZGVscy5Gb3JlaWduS2V5KFByb2plY3QpCisgICAgYnVpbGQgICAgICAgPSBtb2RlbHMuT25lVG9PbmVGaWVsZChCdWlsZCwgbnVsbCA9IFRydWUpICAgICAjIFRPRE86IHRvYXN0ZXJ1aSBzaG91bGQgc2V0IHRoaXMgd2hlbiBCdWlsZCBpcyBjcmVhdGVkCisgICAgZW52aXJvbm1lbnQgPSBtb2RlbHMuRm9yZWlnbktleShCdWlsZEVudmlyb25tZW50LCBudWxsID0gVHJ1ZSkKKyAgICBzdGF0ZSAgICAgICA9IG1vZGVscy5JbnRlZ2VyRmllbGQoY2hvaWNlcyA9IFJFUVVFU1RfU1RBVEUsIGRlZmF1bHQgPSBSRVFfQ1JFQVRFRCkKKyAgICBjcmVhdGVkICAgICA9IG1vZGVscy5EYXRlVGltZUZpZWxkKGF1dG9fbm93X2FkZCA9IFRydWUpCisgICAgdXBkYXRlZCAgICAgPSBtb2RlbHMuRGF0ZVRpbWVGaWVsZChhdXRvX25vdyA9IFRydWUpCisKKyAgICBkZWYgZ2V0X2R1cmF0aW9uKHNlbGYpOgorICAgICAgICByZXR1cm4gKHNlbGYudXBkYXRlZCAtIHNlbGYuY3JlYXRlZCkudG90YWxfc2Vjb25kcygpCisKKyAgICBkZWYgZ2V0X3NvcnRlZF90YXJnZXRfbGlzdChzZWxmKToKKyAgICAgICAgdGd0cyA9IHNlbGYuYnJ0YXJnZXRfc2V0Lm9yZGVyX2J5KCAndGFyZ2V0JyApOworICAgICAgICByZXR1cm4oIHRndHMgKTsKKworICAgIGRlZiBnZXRfbWFjaGluZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYnJ2YXJpYWJsZV9zZXQuZ2V0KG5hbWU9Ik1BQ0hJTkUiKS52YWx1ZQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAiJXMgJXMiICUgKHNlbGYucHJvamVjdCwgc2VsZi5nZXRfc3RhdGVfZGlzcGxheSgpKQorCisjIFRoZXNlIHRhYmxlcyBzcGVjaWZ5IHRoZSBzZXR0aW5ncyBmb3IgcnVubmluZyBhbiBhY3R1YWwgYnVpbGQuCisjIFRoZXkgTVVTVCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgdGFibGVzIGluIG9ybS5tb2RlbHMuUHJvamVjdCoKKworY2xhc3MgQlJMYXllcihtb2RlbHMuTW9kZWwpOgorICAgIHJlcSAgICAgICAgID0gbW9kZWxzLkZvcmVpZ25LZXkoQnVpbGRSZXF1ZXN0KQorICAgIG5hbWUgICAgICAgID0gbW9kZWxzLkNoYXJGaWVsZChtYXhfbGVuZ3RoID0gMTAwKQorICAgIGdpdHVybCAgICAgID0gbW9kZWxzLkNoYXJGaWVsZChtYXhfbGVuZ3RoID0gMjU0KQorICAgIGNvbW1pdCAgICAgID0gbW9kZWxzLkNoYXJGaWVsZChtYXhfbGVuZ3RoID0gMjU0KQorICAgIGRpcnBhdGggICAgID0gbW9kZWxzLkNoYXJGaWVsZChtYXhfbGVuZ3RoID0gMjU0KQorCitjbGFzcyBCUkJpdGJha2UobW9kZWxzLk1vZGVsKToKKyAgICByZXEgICAgICAgICA9IG1vZGVscy5Gb3JlaWduS2V5KEJ1aWxkUmVxdWVzdCwgdW5pcXVlID0gVHJ1ZSkgICAgIyBvbmx5IG9uZSBiaXRiYWtlIGZvciBhIHJlcXVlc3QKKyAgICBnaXR1cmwgICAgICA9IG1vZGVscy5DaGFyRmllbGQobWF4X2xlbmd0aCA9MjU0KQorICAgIGNvbW1pdCAgICAgID0gbW9kZWxzLkNoYXJGaWVsZChtYXhfbGVuZ3RoID0gMjU0KQorICAgIGRpcnBhdGggICAgID0gbW9kZWxzLkNoYXJGaWVsZChtYXhfbGVuZ3RoID0gMjU0KQorCitjbGFzcyBCUlZhcmlhYmxlKG1vZGVscy5Nb2RlbCk6CisgICAgcmVxICAgICAgICAgPSBtb2RlbHMuRm9yZWlnbktleShCdWlsZFJlcXVlc3QpCisgICAgbmFtZSAgICAgICAgPSBtb2RlbHMuQ2hhckZpZWxkKG1heF9sZW5ndGg9MTAwKQorICAgIHZhbHVlICAgICAgID0gbW9kZWxzLlRleHRGaWVsZChibGFuayA9IFRydWUpCisKK2NsYXNzIEJSVGFyZ2V0KG1vZGVscy5Nb2RlbCk6CisgICAgcmVxICAgICAgICAgPSBtb2RlbHMuRm9yZWlnbktleShCdWlsZFJlcXVlc3QpCisgICAgdGFyZ2V0ICAgICAgPSBtb2RlbHMuQ2hhckZpZWxkKG1heF9sZW5ndGg9MTAwKQorICAgIHRhc2sgICAgICAgID0gbW9kZWxzLkNoYXJGaWVsZChtYXhfbGVuZ3RoPTEwMCwgbnVsbD1UcnVlKQorCitjbGFzcyBCUkVycm9yKG1vZGVscy5Nb2RlbCk6CisgICAgcmVxICAgICAgICAgPSBtb2RlbHMuRm9yZWlnbktleShCdWlsZFJlcXVlc3QpCisgICAgZXJydHlwZSAgICAgPSBtb2RlbHMuQ2hhckZpZWxkKG1heF9sZW5ndGg9MTAwKQorICAgIGVycm1zZyAgICAgID0gbW9kZWxzLlRleHRGaWVsZCgpCisgICAgdHJhY2ViYWNrICAgPSBtb2RlbHMuVGV4dEZpZWxkKCkKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIiVzICglcykiICUgKHNlbGYuZXJybXNnLCBzZWxmLnJlcSkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC9zc2hiZWNvbnRyb2xsZXIucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvc3NoYmVjb250cm9sbGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZjQzNGIKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvc3NoYmVjb250cm9sbGVyLnB5CkBAIC0wLDAgKzEsMTc5IEBACisjCisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIworIyBCaXRCYWtlIFRvYXN0ZXIgSW1wbGVtZW50YXRpb24KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDE0ICAgICAgICBJbnRlbCBDb3Jwb3JhdGlvbgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworCitpbXBvcnQgc3lzCitpbXBvcnQgcmUKK2Zyb20gZGphbmdvLmRiIGltcG9ydCB0cmFuc2FjdGlvbgorZnJvbSBkamFuZ28uZGIubW9kZWxzIGltcG9ydCBRCitmcm9tIGJsZGNvbnRyb2wubW9kZWxzIGltcG9ydCBCdWlsZEVudmlyb25tZW50LCBCUkxheWVyLCBCUlZhcmlhYmxlLCBCUlRhcmdldCwgQlJCaXRiYWtlCitpbXBvcnQgc3VicHJvY2VzcworCitmcm9tIHRvYXN0ZXJtYWluIGltcG9ydCBzZXR0aW5ncworCitmcm9tIGJiY29udHJvbGxlciBpbXBvcnQgQnVpbGRFbnZpcm9ubWVudENvbnRyb2xsZXIsIFNoZWxsQ21kRXhjZXB0aW9uLCBCdWlsZFNldHVwRXhjZXB0aW9uCisKK2NsYXNzIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKEV4Y2VwdGlvbik6CisgICAgcGFzcworCitkZWYgRE4ocGF0aCk6CisgICAgcmV0dXJuICIvIi5qb2luKHBhdGguc3BsaXQoIi8iKVswOi0xXSkKKworY2xhc3MgU1NIQkVDb250cm9sbGVyKEJ1aWxkRW52aXJvbm1lbnRDb250cm9sbGVyKToKKyAgICAiIiIgSW1wbGVtZW50YXRpb24gb2YgdGhlIEJ1aWxkRW52aXJvbm1lbnRDb250cm9sbGVyIGZvciB0aGUgbG9jYWxob3N0OworICAgICAgICB0aGlzIGNvbnRyb2xsZXIgbWFuYWdlcyB0aGUgZGVmYXVsdCBidWlsZCBkaXJlY3RvcnksCisgICAgICAgIHRoZSBzZXJ2ZXIgc2V0dXAgYW5kIHN5c3RlbSBzdGFydCBhbmQgc3RvcCBmb3IgdGhlIGxvY2FsaG9zdC10eXBlIGJ1aWxkIGVudmlyb25tZW50CisKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBiZSk6CisgICAgICAgIHN1cGVyKFNTSEJFQ29udHJvbGxlciwgc2VsZikuX19pbml0X18oYmUpCisgICAgICAgIHNlbGYuZGJ1cmwgPSBzZXR0aW5ncy5nZXREQVRBQkFTRV9VUkwoKQorICAgICAgICBzZWxmLnBva3lkaXJuYW1lID0gTm9uZQorICAgICAgICBzZWxmLmlzbGF5ZXJzZXQgPSBGYWxzZQorCisgICAgZGVmIF9zaGVsbGNtZChzZWxmLCBjb21tYW5kLCBjd2QgPSBOb25lKToKKyAgICAgICAgaWYgY3dkIGlzIE5vbmU6CisgICAgICAgICAgICBjd2QgPSBzZWxmLmJlLnNvdXJjZWRpcgorCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKCJzc2ggJXMgJ2NkICVzICYmICVzJyIgJSAoc2VsZi5iZS5hZGRyZXNzLCBjd2QsIGNvbW1hbmQpLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFLCBzaGVsbD1UcnVlKQorICAgICAgICAob3V0LGVycikgPSBwLmNvbW11bmljYXRlKCkKKyAgICAgICAgaWYgcC5yZXR1cm5jb2RlOgorICAgICAgICAgICAgaWYgbGVuKGVycikgPT0gMDoKKyAgICAgICAgICAgICAgICBlcnIgPSAiY29tbWFuZDogJXMgXG4lcyIgJSAoY29tbWFuZCwgb3V0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBlcnIgPSAiY29tbWFuZDogJXMgXG4lcyIgJSAoY29tbWFuZCwgZXJyKQorICAgICAgICAgICAgcmFpc2UgU2hlbGxDbWRFeGNlcHRpb24oZXJyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIG91dC5zdHJpcCgpCisKKyAgICBkZWYgX3BhdGhleGlzdHMoc2VsZiwgcGF0aCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX3NoZWxsY21kKCJ0ZXN0IC1lIFwiJXNcIiIgJSBwYXRoKQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgZXhjZXB0IFNoZWxsQ21kRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBfcGF0aGNyZWF0ZShzZWxmLCBwYXRoKToKKyAgICAgICAgc2VsZi5fc2hlbGxjbWQoIm1rZGlyIC1wIFwiJXNcIiIgJSBwYXRoKQorCisgICAgZGVmIF9zZXR1cEJFKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5wb2t5ZGlybmFtZSBhbmQgc2VsZi5fcGF0aGV4aXN0cyhzZWxmLnBva3lkaXJuYW1lKQorICAgICAgICBzZWxmLl9wYXRoY3JlYXRlKHNlbGYuYmUuYnVpbGRkaXIpCisgICAgICAgIHNlbGYuX3NoZWxsY21kKCJiYXNoIC1jIFwic291cmNlICVzL29lLWluaXQtYnVpbGQtZW52ICVzXCIiICUgKHNlbGYucG9reWRpcm5hbWUsIHNlbGYuYmUuYnVpbGRkaXIpKQorCisgICAgZGVmIHN0YXJ0QkJTZXJ2ZXIoc2VsZiwgYnJiZSk6CisgICAgICAgIGFzc2VydCBzZWxmLnBva3lkaXJuYW1lIGFuZCBzZWxmLl9wYXRoZXhpc3RzKHNlbGYucG9reWRpcm5hbWUpCisgICAgICAgIGFzc2VydCBzZWxmLmlzbGF5ZXJzZXQKKyAgICAgICAgY21kID0gc2VsZi5fc2hlbGxjbWQoImJhc2ggLWMgXCJzb3VyY2UgJXMvb2UtaW5pdC1idWlsZC1lbnYgJXMgJiYgREFUQUJBU0VfVVJMPSVzIHNvdXJjZSB0b2FzdGVyIHN0YXJ0IG5vd2ViIGJyYmU9JXNcIiIgJSAoc2VsZi5wb2t5ZGlybmFtZSwgc2VsZi5iZS5idWlsZGRpciwgc2VsZi5kYnVybCwgYnJiZSkpCisKKyAgICAgICAgcG9ydCA9ICItMSIKKyAgICAgICAgZm9yIGkgaW4gY21kLnNwbGl0KCJcbiIpOgorICAgICAgICAgICAgaWYgaS5zdGFydHN3aXRoKCJCaXRiYWtlIHNlcnZlciBhZGRyZXNzIik6CisgICAgICAgICAgICAgICAgcG9ydCA9IGkuc3BsaXQoIiAiKVstMV0KKyAgICAgICAgICAgICAgICBwcmludCAiRm91bmQgYml0YmFrZSBzZXJ2ZXIgcG9ydCAiLCBwb3J0CisKKworICAgICAgICBhc3NlcnQgc2VsZi5iZS5zb3VyY2VkaXIgYW5kIHNlbGYuX3BhdGhleGlzdHMoc2VsZi5iZS5idWlsZGRpcikKKyAgICAgICAgc2VsZi5iZS5iYmFkZHJlc3MgPSBzZWxmLmJlLmFkZHJlc3Muc3BsaXQoIkAiKVstMV0KKyAgICAgICAgc2VsZi5iZS5iYnBvcnQgPSBwb3J0CisgICAgICAgIHNlbGYuYmUuYmJzdGF0ZSA9IEJ1aWxkRW52aXJvbm1lbnQuU0VSVkVSX1NUQVJURUQKKyAgICAgICAgc2VsZi5iZS5zYXZlKCkKKworICAgIGRlZiBzdG9wQkJTZXJ2ZXIoc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnBva3lkaXJuYW1lIGFuZCBzZWxmLl9wYXRoZXhpc3RzKHNlbGYucG9reWRpcm5hbWUpCisgICAgICAgIGFzc2VydCBzZWxmLmlzbGF5ZXJzZXQKKyAgICAgICAgcHJpbnQgc2VsZi5fc2hlbGxjbWQoImJhc2ggLWMgXCJzb3VyY2UgJXMvb2UtaW5pdC1idWlsZC1lbnYgJXMgJiYgJXMgc291cmNlIHRvYXN0ZXIgc3RvcFwiIiAlCisgICAgICAgICAgICAoc2VsZi5wb2t5ZGlybmFtZSwgc2VsZi5iZS5idWlsZGRpciwgKGxhbWJkYTogIiIgaWYgc2VsZi5iZS5iYnRva2VuIGlzIE5vbmUgZWxzZSAiQkJUT0tFTj0lcyIgJSBzZWxmLmJlLmJidG9rZW4pKCkpKQorICAgICAgICBzZWxmLmJlLmJic3RhdGUgPSBCdWlsZEVudmlyb25tZW50LlNFUlZFUl9TVE9QUEVECisgICAgICAgIHNlbGYuYmUuc2F2ZSgpCisgICAgICAgIHByaW50ICJTdG9wcGVkIHNlcnZlciIKKworCisgICAgZGVmIF9jb3B5RmlsZShzZWxmLCBmaWxlcGF0aDEsIGZpbGVwYXRoMik6CisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKCJzY3AgJyVzJyAnJXMnIiAlIChmaWxlcGF0aDEsIGZpbGVwYXRoMiksIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVyciA9IHN1YnByb2Nlc3MuUElQRSwgc2hlbGw9VHJ1ZSkKKyAgICAgICAgKG91dCwgZXJyKSA9IHAuY29tbXVuaWNhdGUoKQorICAgICAgICBpZiBwLnJldHVybmNvZGU6CisgICAgICAgICAgICByYWlzZSBTaGVsbENtZEV4Y2VwdGlvbihlcnIpCisKKyAgICBkZWYgcHVsbEZpbGUoc2VsZiwgbG9jYWxfZmlsZW5hbWUsIHJlbW90ZV9maWxlbmFtZSk6CisgICAgICAgIF9jb3B5RmlsZShsb2NhbF9maWxlbmFtZSwgIiVzOiVzIiAlIChzZWxmLmJlLmFkZHJlc3MsIHJlbW90ZV9maWxlbmFtZSkpCisKKyAgICBkZWYgcHVzaEZpbGUoc2VsZiwgbG9jYWxfZmlsZW5hbWUsIHJlbW90ZV9maWxlbmFtZSk6CisgICAgICAgIF9jb3B5RmlsZSgiJXM6JXMiICUgKHNlbGYuYmUuYWRkcmVzcywgcmVtb3RlX2ZpbGVuYW1lKSwgbG9jYWxfZmlsZW5hbWUpCisKKyAgICBkZWYgc2V0TGF5ZXJzKHNlbGYsIGJpdGJha2VzLCBsYXllcnMpOgorICAgICAgICAiIiIgYSB3b3JkIG9mIGF0dGVudGlvbjogYnkgY29udmVudGlvbiwgdGhlIGZpcnN0IGxheWVyIGZvciBhbnkgYnVpbGQgd2lsbCBiZSBwb2t5ISAiIiIKKworICAgICAgICBhc3NlcnQgc2VsZi5iZS5zb3VyY2VkaXIgaXMgbm90IE5vbmUKKyAgICAgICAgYXNzZXJ0IGxlbihiaXRiYWtlcykgPT0gMQorICAgICAgICAjIHNldCBsYXllcnMgaW4gdGhlIGxheWVyc291cmNlCisKKworICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkOiBTU0ggc2V0TGF5ZXJzIikKKyAgICAgICAgIyAzLiBjb25maWd1cmUgdGhlIGJ1aWxkIGVudmlyb25tZW50LCBzbyB3ZSBoYXZlIGEgY29uZi9iYmxheWVycy5jb25mCisgICAgICAgIGFzc2VydCBzZWxmLnBva3lkaXJuYW1lIGlzIG5vdCBOb25lCisgICAgICAgIHNlbGYuX3NldHVwQkUoKQorCisgICAgICAgICMgNC4gdXBkYXRlIHRoZSBiYmxheWVycy5jb25mCisgICAgICAgIGJibGF5ZXJjb25mID0gb3MucGF0aC5qb2luKHNlbGYuYmUuYnVpbGRkaXIsICJjb25mL2JibGF5ZXJzLmNvbmYiKQorICAgICAgICBpZiBub3Qgc2VsZi5fcGF0aGV4aXN0cyhiYmxheWVyY29uZik6CisgICAgICAgICAgICByYWlzZSBCdWlsZFNldHVwRXhjZXB0aW9uKCJCRSBpcyBub3QgY29uc2lzdGVudDogYmJsYXllcnMuY29uZiBmaWxlIG1pc3NpbmcgYXQgJXMiICUgYmJsYXllcmNvbmYpCisKKyAgICAgICAgaW1wb3J0IHV1aWQKKyAgICAgICAgbG9jYWxfYmJsYXllcmNvbmYgPSAiL3RtcC8iICsgdXVpZC51dWlkNCgpICsgIi1iYmxheWVyLmNvbmYiCisKKyAgICAgICAgc2VsZi5wdWxsRmlsZShiYmxheWVyY29uZiwgbG9jYWxfYmJsYXllcmNvbmYpCisKKyAgICAgICAgQnVpbGRFbnZpcm9ubWVudENvbnRyb2xsZXIuX3VwZGF0ZUJCTGF5ZXJzKGxvY2FsX2JibGF5ZXJjb25mLCBsYXllcmxpc3QpCisgICAgICAgIHNlbGYucHVzaEZpbGUobG9jYWxfYmJsYXllcmNvbmYsIGJibGF5ZXJjb25mKQorCisgICAgICAgIG9zLnVubGluayhsb2NhbF9iYmxheWVyY29uZikKKworICAgICAgICBzZWxmLmlzbGF5ZXJzZXQgPSBUcnVlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgcmVsZWFzZShzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuYmUuc291cmNlZGlyIGFuZCBzZWxmLl9wYXRoZXhpc3RzKHNlbGYuYmUuYnVpbGRkaXIpCisgICAgICAgIGltcG9ydCBzaHV0aWwKKyAgICAgICAgc2h1dGlsLnJtdHJlZShvcy5wYXRoLmpvaW4oc2VsZi5iZS5zb3VyY2VkaXIsICJidWlsZCIpKQorICAgICAgICBhc3NlcnQgbm90IHNlbGYuX3BhdGhleGlzdHMoc2VsZi5iZS5idWlsZGRpcikKKworICAgIGRlZiB0cmlnZ2VyQnVpbGQoc2VsZiwgYml0YmFrZSwgbGF5ZXJzLCB2YXJpYWJsZXMsIHRhcmdldHMpOgorICAgICAgICAjIHNldCB1cCB0aGUgYnVpZCBlbnZpcm9ubWVudCB3aXRoIHRoZSBuZWVkZWQgbGF5ZXJzCisgICAgICAgIHNlbGYuc2V0TGF5ZXJzKGJpdGJha2UsIGxheWVycykKKyAgICAgICAgc2VsZi53cml0ZUNvbmZGaWxlKCJjb25mL3RvYXN0ZXItcHJlLmNvbmYiLCApCisgICAgICAgIHNlbGYud3JpdGVDb25mRmlsZSgiY29uZi90b2FzdGVyLmNvbmYiLCByYXcgPSAiSU5IRVJJVCs9XCJ0b2FzdGVyIGJ1aWxkaGlzdG9yeVwiIikKKworICAgICAgICAjIGdldCB0aGUgYmIgc2VydmVyIHJ1bm5pbmcgd2l0aCB0aGUgYnVpbGQgcmVxIGlkIGFuZCBidWlsZCBlbnYgaWQKKyAgICAgICAgYmJjdHJsID0gc2VsZi5nZXRCQkNvbnRyb2xsZXIoKQorCisgICAgICAgICMgdHJpZ2dlciB0aGUgYnVpbGQgY29tbWFuZAorICAgICAgICB0YXNrID0gcmVkdWNlKGxhbWJkYSB4LCB5OiB4IGlmIGxlbih5KT09IDAgZWxzZSB5LCBtYXAobGFtYmRhIHk6IHkudGFzaywgdGFyZ2V0cykpCisgICAgICAgIGlmIGxlbih0YXNrKSA9PSAwOgorICAgICAgICAgICAgdGFzayA9IE5vbmUKKworICAgICAgICBiYmN0cmwuYnVpbGQobGlzdChtYXAobGFtYmRhIHg6eC50YXJnZXQsIHRhcmdldHMpKSwgdGFzaykKKworICAgICAgICBsb2dnZXIuZGVidWcoImxvY2FsaG9zdGJlY29udHJvbGxlcjogQnVpbGQgbGF1bmNoZWQsIGV4aXRpbmcuIEZvbGxvdyBidWlsZCBsb2dzIGF0ICVzL3RvYXN0ZXJfdWkubG9nIiAlIHNlbGYuYmUuYnVpbGRkaXIpCisKKyAgICAgICAgIyBkaXNjb25uZWN0IGZyb20gdGhlIHNlcnZlcgorICAgICAgICBiYmN0cmwuZGlzY29ubmVjdCgpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvdGVzdHMucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvdGVzdHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRiYzc3ZgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC90ZXN0cy5weQpAQCAtMCwwICsxLDE5MCBAQAorIiIiCitUaGlzIGZpbGUgZGVtb25zdHJhdGVzIHdyaXRpbmcgdGVzdHMgdXNpbmcgdGhlIHVuaXR0ZXN0IG1vZHVsZS4gVGhlc2Ugd2lsbCBwYXNzCit3aGVuIHlvdSBydW4gIm1hbmFnZS5weSB0ZXN0Ii4KKworUmVwbGFjZSB0aGlzIHdpdGggbW9yZSBhcHByb3ByaWF0ZSB0ZXN0cyBmb3IgeW91ciBhcHBsaWNhdGlvbi4KKyIiIgorCitmcm9tIGRqYW5nby50ZXN0IGltcG9ydCBUZXN0Q2FzZQorCitmcm9tIGJsZGNvbnRyb2wuYmJjb250cm9sbGVyIGltcG9ydCBCaXRiYWtlQ29udHJvbGxlciwgQnVpbGRTZXR1cEV4Y2VwdGlvbgorZnJvbSBibGRjb250cm9sLmxvY2FsaG9zdGJlY29udHJvbGxlciBpbXBvcnQgTG9jYWxob3N0QkVDb250cm9sbGVyCitmcm9tIGJsZGNvbnRyb2wuc3NoYmVjb250cm9sbGVyIGltcG9ydCBTU0hCRUNvbnRyb2xsZXIKK2Zyb20gYmxkY29udHJvbC5tb2RlbHMgaW1wb3J0IEJ1aWxkRW52aXJvbm1lbnQsIEJ1aWxkUmVxdWVzdAorZnJvbSBibGRjb250cm9sLm1hbmFnZW1lbnQuY29tbWFuZHMucnVuYnVpbGRzIGltcG9ydCBDb21tYW5kCisKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgb3MKKworIyBzdGFuZGFyZCBwb2t5IGRhdGEgaGFyZGNvZGVkIGZvciB0ZXN0aW5nCitCSVRCQUtFX0xBWUVSUyA9IFt0eXBlKCdiaXRiYWtlX2luZm8nLCAob2JqZWN0LCksIHsgImdpdHVybCI6ICJnaXQ6Ly9naXQueW9jdG9wcm9qZWN0Lm9yZy9wb2t5LmdpdCIsICJkaXJwYXRoIjogIiIsICJjb21taXQiOiAiSEVBRCJ9KV0KK1BPS1lfTEFZRVJTID0gWworICAgIHR5cGUoJ3Bva3lfaW5mbycsIChvYmplY3QsKSwgeyAibmFtZSI6ICJtZXRhIiwgImdpdHVybCI6ICJnaXQ6Ly9naXQueW9jdG9wcm9qZWN0Lm9yZy9wb2t5LmdpdCIsICJkaXJwYXRoIjogIm1ldGEiLCAiY29tbWl0IjogIkhFQUQifSksCisgICAgdHlwZSgncG9reV9pbmZvJywgKG9iamVjdCwpLCB7ICJuYW1lIjogIm1ldGEteW9jdG8iLCAiZ2l0dXJsIjogImdpdDovL2dpdC55b2N0b3Byb2plY3Qub3JnL3Bva3kuZ2l0IiwgImRpcnBhdGgiOiAibWV0YS15b2N0byIsICJjb21taXQiOiAiSEVBRCJ9KSwKKyAgICB0eXBlKCdwb2t5X2luZm8nLCAob2JqZWN0LCksIHsgIm5hbWUiOiAibWV0YS15b2N0by1ic3AiLCAiZ2l0dXJsIjogImdpdDovL2dpdC55b2N0b3Byb2plY3Qub3JnL3Bva3kuZ2l0IiwgImRpcnBhdGgiOiAibWV0YS15b2N0by1ic3AiLCAiY29tbWl0IjogIkhFQUQifSksCisgICAgXQorCisKKworIyB3ZSBoYXZlIGFuIGFic3RyYWN0IHRlc3QgY2xhc3MgZGVzaWduZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGNvbnRyb2xsZXJzIHVzZSBhIHNpbmdsZSBpbnRlcmZhY2UKKyMgc3BlY2lmaWMgY29udHJvbGxlciB0ZXN0cyBvbmx5IG5lZWQgdG8gb3ZlcnJpZGUgdGhlIF9nZXRCdWlsZEVudmlyb25tZW50KCkgbWV0aG9kCisKK3Rlc3Rfc291cmNlZGlyID0gb3MuZ2V0ZW52KCJUVFNfU09VUkNFX0RJUiIpCit0ZXN0X2J1aWxkZGlyID0gb3MuZ2V0ZW52KCJUVFNfQlVJTERfRElSIikKK3Rlc3RfYWRkcmVzcyA9IG9zLmdldGVudigiVFRTX1RFU1RfQUREUkVTUyIsICJsb2NhbGhvc3QiKQorCitpZiB0ZXN0X3NvdXJjZWRpciA9PSBOb25lIG9yIHRlc3RfYnVpbGRkaXIgPT0gTm9uZSBvciB0ZXN0X2FkZHJlc3MgPT0gTm9uZToKKyAgICByYWlzZSBFeGNlcHRpb24oIlBsZWFzZSBzZXQgVFRUU19TT1VSQ0VfRElSLCBUVFNfQlVJTERfRElSIGFuZCBUVFNfVEVTVF9BRERSRVNTIikKKworIyBUaGUgYmIgc2VydmVyIHdpbGwgZXhwZWN0IGEgdG9hc3Rlci1wcmUuY29uZiBmaWxlIHRvIGV4aXN0LiBJZiBpdCBkb2Vzbid0IGV4aXQgdGhlbiB3ZSBtYWtlCisjIGFuIGVtcHR5IG9uZSBoZXJlLgorb3Blbih0ZXN0X2J1aWxkZGlyICsgJ2NvbmYvdG9hc3Rlci1wcmUuY29uZicsICdhJykuY2xvc2UoKQorCitjbGFzcyBCRUNvbnRyb2xsZXJUZXN0cyhvYmplY3QpOgorCisgICAgZGVmIF9zZXJ2ZXJGb3JjZVN0b3Aoc2VsZiwgYmMpOgorICAgICAgICBlcnIgPSBiYy5fc2hlbGxjbWQoIm5ldHN0YXQgIC10YXBuIDI+L2Rldi9udWxsIHwgZ3JlcCA4MjAwIHwgYXdrICd7cHJpbnQgJDd9JyB8IHNvcnQgLWZ1IHwgY3V0IC1kIFwiL1wiIC1mIDEgfCBncmVwIC12IC0tIC0gfCB0ZWUgL2Rldi9mZC8yIHwgeGFyZ3MgLXIga2lsbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlcnIgPT0gJycsICJiaXRiYWtlIHNlcnZlciBwaWQgJXMgbm90IHN0b3BwZWQiICUgZXJyKQorCisgICAgZGVmIHRlc3Rfc2VydmVyU3RhcnRBbmRTdG9wKHNlbGYpOgorICAgICAgICBmcm9tIGJsZGNvbnRyb2wuc3NoYmVjb250cm9sbGVyIGltcG9ydCBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbgorICAgICAgICBvYmUgPSAgc2VsZi5fZ2V0QnVpbGRFbnZpcm9ubWVudCgpCisgICAgICAgIGJjID0gc2VsZi5fZ2V0QkVDb250cm9sbGVyKG9iZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBzZXR0aW5nIGxheWVycywgc2tpcCBhbnkgbGF5ZXIgaW5mbworICAgICAgICAgICAgYmMuc2V0TGF5ZXJzKEJJVEJBS0VfTEFZRVJTLCBQT0tZX0xBWUVSUykKKyAgICAgICAgZXhjZXB0IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uLCAgZToKKyAgICAgICAgICAgIHByaW50ICJUZXN0IHNraXBwZWQgZHVlIHRvIGNvbW1hbmQgbm90IGltcGxlbWVudGVkIHlldCIKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICMgV2UgYXJlIG9rIHdpdGggdGhlIGV4Y2VwdGlvbiBhcyB3ZSdyZSBoYW5kbGluZyB0aGUgZ2l0IGFscmVhZHkgZXhpc3RzCisgICAgICAgIGV4Y2VwdCBCdWlsZFNldHVwRXhjZXB0aW9uOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGJjLnBva3lkaXJuYW1lID0gdGVzdF9zb3VyY2VkaXIKKyAgICAgICAgYmMuaXNsYXllcnNldCA9IFRydWUKKworICAgICAgICBob3N0bmFtZSA9IHRlc3RfYWRkcmVzcy5zcGxpdCgiQCIpWy0xXQorCisgICAgICAgICMgdGVzdCBzdGFydCBzZXJ2ZXIgYW5kIHN0b3AKKyAgICAgICAgYmMuc3RhcnRCQlNlcnZlcigpCisKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pLmNvbm5lY3RfZXgoKGhvc3RuYW1lLCBpbnQoYmMuYmUuYmJwb3J0KSkpLCAiU2VydmVyIG5vdCBhbnN3ZXJpbmciKQorCisgICAgICAgIGJjLnN0b3BCQlNlcnZlcigpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pLmNvbm5lY3RfZXgoKGhvc3RuYW1lLCBpbnQoYmMuYmUuYmJwb3J0KSkpLCAiU2VydmVyIG5vdCBzdG9wcGVkIikKKworICAgICAgICBzZWxmLl9zZXJ2ZXJGb3JjZVN0b3AoYmMpCisKKyAgICBkZWYgdGVzdF9nZXRCQkNvbnRyb2xsZXIoc2VsZik6CisgICAgICAgIGZyb20gYmxkY29udHJvbC5zc2hiZWNvbnRyb2xsZXIgaW1wb3J0IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uCisgICAgICAgIG9iZSA9IHNlbGYuX2dldEJ1aWxkRW52aXJvbm1lbnQoKQorICAgICAgICBiYyA9IHNlbGYuX2dldEJFQ29udHJvbGxlcihvYmUpCisgICAgICAgIGxheWVyU2V0ID0gRmFsc2UKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBzZXR0aW5nIGxheWVycywgc2tpcCBhbnkgbGF5ZXIgaW5mbworICAgICAgICAgICAgbGF5ZXJTZXQgPSBiYy5zZXRMYXllcnMoQklUQkFLRV9MQVlFUlMsIFBPS1lfTEFZRVJTKQorICAgICAgICBleGNlcHQgTm90SW1wbGVtZW50ZWRFeGNlcHRpb246CisgICAgICAgICAgICBwcmludCAiVGVzdCBza2lwcGVkIGR1ZSB0byBjb21tYW5kIG5vdCBpbXBsZW1lbnRlZCB5ZXQiCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAjIFdlIGFyZSBvayB3aXRoIHRoZSBleGNlcHRpb24gYXMgd2UncmUgaGFuZGxpbmcgdGhlIGdpdCBhbHJlYWR5IGV4aXN0cworICAgICAgICBleGNlcHQgQnVpbGRTZXR1cEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBiYy5wb2t5ZGlybmFtZSA9IHRlc3Rfc291cmNlZGlyCisgICAgICAgIGJjLmlzbGF5ZXJzZXQgPSBUcnVlCisKKyAgICAgICAgYmJjID0gYmMuZ2V0QkJDb250cm9sbGVyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoYmJjLCBCaXRiYWtlQ29udHJvbGxlcikpCisgICAgICAgIGJjLnN0b3BCQlNlcnZlcigpCisKKyAgICAgICAgc2VsZi5fc2VydmVyRm9yY2VTdG9wKGJjKQorCitjbGFzcyBMb2NhbGhvc3RCRUNvbnRyb2xsZXJUZXN0cyhUZXN0Q2FzZSwgQkVDb250cm9sbGVyVGVzdHMpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHN1cGVyKExvY2FsaG9zdEJFQ29udHJvbGxlclRlc3RzLCBzZWxmKS5fX2luaXRfXygqYXJncykKKworCisgICAgZGVmIF9nZXRCdWlsZEVudmlyb25tZW50KHNlbGYpOgorICAgICAgICByZXR1cm4gQnVpbGRFbnZpcm9ubWVudC5vYmplY3RzLmNyZWF0ZSgKKyAgICAgICAgICAgICAgICBsb2NrID0gQnVpbGRFbnZpcm9ubWVudC5MT0NLX0ZSRUUsCisgICAgICAgICAgICAgICAgYmV0eXBlID0gQnVpbGRFbnZpcm9ubWVudC5UWVBFX0xPQ0FMLAorICAgICAgICAgICAgICAgIGFkZHJlc3MgPSB0ZXN0X2FkZHJlc3MsCisgICAgICAgICAgICAgICAgc291cmNlZGlyID0gdGVzdF9zb3VyY2VkaXIsCisgICAgICAgICAgICAgICAgYnVpbGRkaXIgPSB0ZXN0X2J1aWxkZGlyICkKKworICAgIGRlZiBfZ2V0QkVDb250cm9sbGVyKHNlbGYsIG9iZSk6CisgICAgICAgIHJldHVybiBMb2NhbGhvc3RCRUNvbnRyb2xsZXIob2JlKQorCitjbGFzcyBTU0hCRUNvbnRyb2xsZXJUZXN0cyhUZXN0Q2FzZSwgQkVDb250cm9sbGVyVGVzdHMpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHN1cGVyKFNTSEJFQ29udHJvbGxlclRlc3RzLCBzZWxmKS5fX2luaXRfXygqYXJncykKKworICAgIGRlZiBfZ2V0QnVpbGRFbnZpcm9ubWVudChzZWxmKToKKyAgICAgICAgcmV0dXJuIEJ1aWxkRW52aXJvbm1lbnQub2JqZWN0cy5jcmVhdGUoCisgICAgICAgICAgICAgICAgbG9jayA9IEJ1aWxkRW52aXJvbm1lbnQuTE9DS19GUkVFLAorICAgICAgICAgICAgICAgIGJldHlwZSA9IEJ1aWxkRW52aXJvbm1lbnQuVFlQRV9TU0gsCisgICAgICAgICAgICAgICAgYWRkcmVzcyA9IHRlc3RfYWRkcmVzcywKKyAgICAgICAgICAgICAgICBzb3VyY2VkaXIgPSB0ZXN0X3NvdXJjZWRpciwKKyAgICAgICAgICAgICAgICBidWlsZGRpciA9IHRlc3RfYnVpbGRkaXIgKQorCisgICAgZGVmIF9nZXRCRUNvbnRyb2xsZXIoc2VsZiwgb2JlKToKKyAgICAgICAgcmV0dXJuIFNTSEJFQ29udHJvbGxlcihvYmUpCisKKyAgICBkZWYgdGVzdF9wYXRoRXhpc3RzKHNlbGYpOgorICAgICAgICBvYmUgPSBCdWlsZEVudmlyb25tZW50Lm9iamVjdHMuY3JlYXRlKGJldHlwZSA9IEJ1aWxkRW52aXJvbm1lbnQuVFlQRV9TU0gsIGFkZHJlc3M9IHRlc3RfYWRkcmVzcykKKyAgICAgICAgc2JjID0gU1NIQkVDb250cm9sbGVyKG9iZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNiYy5fcGF0aGV4aXN0cygiLyIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNiYy5fcGF0aGV4aXN0cygiLy5kZWFkYmVlZiIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2JjLl9wYXRoZXhpc3RzKHNiYy5fc2hlbGxjbWQoInB3ZCIpKSkKKworCitjbGFzcyBSdW5CdWlsZHNDb21tYW5kVGVzdHMoVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2JlY19zZWxlY3Qoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBUZXN0cyB0aGF0IHdlIGNhbiBmaW5kIGFuZCBsb2NrIGEgYnVpbGQgZW52aXJvbm1lbnQKKyAgICAgICAgIiIiCisKKyAgICAgICAgb2JlID0gQnVpbGRFbnZpcm9ubWVudC5vYmplY3RzLmNyZWF0ZShsb2NrID0gQnVpbGRFbnZpcm9ubWVudC5MT0NLX0ZSRUUsIGJldHlwZSA9IEJ1aWxkRW52aXJvbm1lbnQuVFlQRV9MT0NBTCkKKyAgICAgICAgY29tbWFuZCA9IENvbW1hbmQoKQorICAgICAgICBiZWMgPSBjb21tYW5kLl9zZWxlY3RCdWlsZEVudmlyb25tZW50KCkKKworICAgICAgICAjIG1ha2Ugc3VyZSB3ZSBzZWxlY3QgdGhlIG9iamVjdCB3ZSd2ZSBqdXN0IGJ1aWx0CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiZWMuYmUuaWQgPT0gb2JlLmlkLCAiRW52aXJvbm1lbnQgaXMgbm90IHByb3Blcmx5IHNlbGVjdGVkIikKKyAgICAgICAgIyB3ZSBoYXZlIGEgbG9ja2VkIGVudmlyb25tZW50CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiZWMuYmUubG9jayA9PSBCdWlsZEVudmlyb25tZW50LkxPQ0tfTE9DSywgIkVudmlyb25tZW50IGlzIG5vdCBsb2NrZWQiKQorICAgICAgICAjIG5vIG1vcmUgc2VsZWN0aW9ucyBwb3NzaWJsZSBoZXJlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGNvbW1hbmQuX3NlbGVjdEJ1aWxkRW52aXJvbm1lbnQpCisKKyAgICBkZWYgdGVzdF9icl9zZWxlY3Qoc2VsZik6CisgICAgICAgIGZyb20gb3JtLm1vZGVscyBpbXBvcnQgUHJvamVjdCwgUmVsZWFzZSwgQml0YmFrZVZlcnNpb24sIEJyYW5jaAorICAgICAgICBwID0gUHJvamVjdC5vYmplY3RzLmNyZWF0ZV9wcm9qZWN0KCJ0ZXN0IiwgUmVsZWFzZS5vYmplY3RzLmdldF9vcl9jcmVhdGUobmFtZSA9ICJIRUFEIiwgYml0YmFrZV92ZXJzaW9uID0gQml0YmFrZVZlcnNpb24ub2JqZWN0cy5nZXRfb3JfY3JlYXRlKG5hbWU9IkhFQUQiLCBicmFuY2g9QnJhbmNoLm9iamVjdHMuZ2V0X29yX2NyZWF0ZShuYW1lPSJIRUFEIikpWzBdKVswXSkKKyAgICAgICAgb2JyID0gQnVpbGRSZXF1ZXN0Lm9iamVjdHMuY3JlYXRlKHN0YXRlID0gQnVpbGRSZXF1ZXN0LlJFUV9RVUVVRUQsIHByb2plY3QgPSBwKQorICAgICAgICBjb21tYW5kID0gQ29tbWFuZCgpCisgICAgICAgIGJyID0gY29tbWFuZC5fc2VsZWN0QnVpbGRSZXF1ZXN0KCkKKworICAgICAgICAjIG1ha2Ugc3VyZSB3ZSBzZWxlY3QgdGhlIG9iamVjdCB3ZSd2ZSBqdXN0IGJ1aWx0CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvYnIuaWQgPT0gYnIuaWQsICJSZXF1ZXN0IGlzIG5vdCBwcm9wZXJseSBzZWxlY3RlZCIpCisgICAgICAgICMgd2UgaGF2ZSBhIGxvY2tlZCBlbnZpcm9ubWVudAorICAgICAgICBzZWxmLmFzc2VydFRydWUoYnIuc3RhdGUgPT0gQnVpbGRSZXF1ZXN0LlJFUV9JTlBST0dSRVNTLCAiUmVxdWVzdCBpcyBub3QgdXBkYXRlZCIpCisgICAgICAgICMgbm8gbW9yZSBzZWxlY3Rpb25zIHBvc3NpYmxlIGhlcmUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgY29tbWFuZC5fc2VsZWN0QnVpbGRSZXF1ZXN0KQorCisKK2NsYXNzIFV0aWxpdHlUZXN0cyhUZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfcmVkdWNlX3BhdGgoc2VsZik6CisgICAgICAgIGZyb20gYmxkY29udHJvbC5tYW5hZ2VtZW50LmNvbW1hbmRzLmxvYWRjb25mIGltcG9ydCBfcmVkdWNlX2Nhbm9uX3BhdGgsIF9nZXRfaWRfZm9yX3NvdXJjZXR5cGUKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoIF9yZWR1Y2VfY2Fub25fcGF0aCgiLyIpID09ICIvIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCBfcmVkdWNlX2Nhbm9uX3BhdGgoIi9ob21lLy4uIikgPT0gIi8iKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoIF9yZWR1Y2VfY2Fub25fcGF0aCgiL2hvbWUvLi4vYW5hIikgPT0gIi9hbmEiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoIF9yZWR1Y2VfY2Fub25fcGF0aCgiL2hvbWUvLi4vYW5hLy4uIikgPT0gIi8iKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoIF9yZWR1Y2VfY2Fub25fcGF0aCgiL2hvbWUvYW5hL21paGFpLy4uL21hcmlhIikgPT0gIi9ob21lL2FuYS9tYXJpYSIpCisKKyAgICBkZWYgdGVzdF9nZXRfaWRfZm9yX3NvcnVjZXR5cGUoc2VsZik6CisgICAgICAgIGZyb20gYmxkY29udHJvbC5tYW5hZ2VtZW50LmNvbW1hbmRzLmxvYWRjb25mIGltcG9ydCBfcmVkdWNlX2Nhbm9uX3BhdGgsIF9nZXRfaWRfZm9yX3NvdXJjZXR5cGUKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCBfZ2V0X2lkX2Zvcl9zb3VyY2V0eXBlKCJsYXllcmluZGV4IikgPT0gMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCBfZ2V0X2lkX2Zvcl9zb3VyY2V0eXBlKCJsb2NhbCIpID09IDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSggX2dldF9pZF9mb3Jfc291cmNldHlwZSgiaW1wb3J0ZWQiKSA9PSAyKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEV4Y2VwdGlvbik6CisgICAgICAgICAgICBfZ2V0X2lkX2Zvcl9zb3VyY2V0eXBlKCJ1bmtub3duIikKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC92aWV3cy5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC92aWV3cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGYwMGVmCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL3ZpZXdzLnB5CkBAIC0wLDAgKzEgQEAKKyMgQ3JlYXRlIHlvdXIgdmlld3MgaGVyZS4KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi9SRUFETUUgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZDBmZjAKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvUkVBRE1FCkBAIC0wLDAgKzEsNiBAQAorY29udHJpYiBkaXJlY3RvcnkgZm9yIHRvYXN0ZXIKKworVGhpcyBkaXJlY3RvcnkgaG9sZHMgY29kZSB0aGF0IHdvcmtzIHdpdGggVG9hc3Rlciwgd2l0aG91dCBiZWluZyBhbiBpbnRlZ3JhbCBwYXJ0IG9mIHRoZSBUb2FzdGVyIHByb2plY3QuCitJdCBpcyBpbnRlbmRlZCBmb3IgdGVzdGluZyBjb2RlLCB0ZXN0aW5nIGZpeHR1cmVzLCB0b29scyBmb3IgVG9hc3RlciwgZXRjLgorCitOT1RFOiBUaGlzIGRpcmVjdG9yeSBpcyBOT1QgYSBQeXRob24gbW9kdWxlLgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL2RqYW5nby1hZ2dyZWdhdGUtaWYtbWFzdGVyLy5naXRpZ25vcmUgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvZGphbmdvLWFnZ3JlZ2F0ZS1pZi1tYXN0ZXIvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDU2NTJkCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL2RqYW5nby1hZ2dyZWdhdGUtaWYtbWFzdGVyLy5naXRpZ25vcmUKQEAgLTAsMCArMSwxMCBAQAorKi5weWMKKyouc3dwCisqLnN3bworKi5rcGYKKyouZWdnLWluZm8vCisuaWRlYQorLnRveAordG1wLworZGlzdC8KKy5EU19TdG9yZQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL2RqYW5nby1hZ2dyZWdhdGUtaWYtbWFzdGVyLy50cmF2aXMueW1sIGIvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL2RqYW5nby1hZ2dyZWdhdGUtaWYtbWFzdGVyLy50cmF2aXMueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MjBmMzkKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvZGphbmdvLWFnZ3JlZ2F0ZS1pZi1tYXN0ZXIvLnRyYXZpcy55bWwKQEAgLTAsMCArMSw1MCBAQAorbGFuZ3VhZ2U6IHB5dGhvbgorcHl0aG9uOgorICAtICIyLjciCisgIC0gIjMuNCIKK3NlcnZpY2VzOgorICAtIG15c3FsCisgIC0gcG9zdGdyZXNxbAorZW52OgorICAtIERKQU5HTz0xLjQgREI9c3FsaXRlCisgIC0gREpBTkdPPTEuNCBEQj1teXNxbAorICAtIERKQU5HTz0xLjQgREI9cG9zdGdyZXMKKyAgLSBESkFOR089MS41IERCPXNxbGl0ZQorICAtIERKQU5HTz0xLjUgREI9bXlzcWwKKyAgLSBESkFOR089MS41IERCPXBvc3RncmVzCisgIC0gREpBTkdPPTEuNiBEQj1zcWxpdGUKKyAgLSBESkFOR089MS42IERCPW15c3FsCisgIC0gREpBTkdPPTEuNiBEQj1wb3N0Z3JlcworICAtIERKQU5HTz0xLjcgREI9c3FsaXRlCisgIC0gREpBTkdPPTEuNyBEQj1teXNxbAorICAtIERKQU5HTz0xLjcgREI9cG9zdGdyZXMKKworbWF0cml4OgorICBleGNsdWRlOgorICAgIC0gcHl0aG9uOiAiMy40IgorICAgICAgZW52OiBESkFOR089MS40IERCPXNxbGl0ZQorICAgIC0gcHl0aG9uOiAiMy40IgorICAgICAgZW52OiBESkFOR089MS40IERCPW15c3FsCisgICAgLSBweXRob246ICIzLjQiCisgICAgICBlbnY6IERKQU5HTz0xLjQgREI9cG9zdGdyZXMKKyAgICAtIHB5dGhvbjogIjMuNCIKKyAgICAgIGVudjogREpBTkdPPTEuNSBEQj1zcWxpdGUKKyAgICAtIHB5dGhvbjogIjMuNCIKKyAgICAgIGVudjogREpBTkdPPTEuNSBEQj1teXNxbAorICAgIC0gcHl0aG9uOiAiMy40IgorICAgICAgZW52OiBESkFOR089MS41IERCPXBvc3RncmVzCisgICAgLSBweXRob246ICIzLjQiCisgICAgICBlbnY6IERKQU5HTz0xLjYgREI9bXlzcWwKKyAgICAtIHB5dGhvbjogIjMuNCIKKyAgICAgIGVudjogREpBTkdPPTEuNyBEQj1teXNxbAorCitiZWZvcmVfc2NyaXB0OgorICAtIG15c3FsIC1lICdjcmVhdGUgZGF0YWJhc2UgYWdncmVnYXRpb247JworICAtIHBzcWwgLWMgJ2NyZWF0ZSBkYXRhYmFzZSBhZ2dyZWdhdGlvbjsnIC1VIHBvc3RncmVzCitpbnN0YWxsOgorICAtIHBpcCBpbnN0YWxsIHNpeAorICAtIGlmIFsgIiREQiIgPT0gIm15c3FsIiBdOyB0aGVuIHBpcCBpbnN0YWxsIG15c3FsLXB5dGhvbjsgZmkKKyAgLSBpZiBbICIkREIiID09ICJwb3N0Z3JlcyIgXTsgdGhlbiBwaXAgaW5zdGFsbCBwc3ljb3BnMjsgZmkKKyAgLSBwaXAgaW5zdGFsbCAtcSBEamFuZ289PSRESkFOR08gLS11c2UtbWlycm9ycworc2NyaXB0OgorICAtIC4vcnVudGVzdHMucHkgLS1zZXR0aW5ncz10ZXN0cy50ZXN0XyREQgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL2RqYW5nby1hZ2dyZWdhdGUtaWYtbWFzdGVyL0xJQ0VOU0UgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvZGphbmdvLWFnZ3JlZ2F0ZS1pZi1tYXN0ZXIvTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjdjM2IxCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL2RqYW5nby1hZ2dyZWdhdGUtaWYtbWFzdGVyL0xJQ0VOU0UKQEAgLTAsMCArMSwyMSBAQAorVGhlIE1JVCBMaWNlbnNlCisKK0NvcHlyaWdodCAoYykgMjAxMiBIZW5yaXF1ZSBCYXN0b3MKKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKK2luIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKK3RvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKK2NvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK0FVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKK0xJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCitPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCitUSEUgU09GVFdBUkUuCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvZGphbmdvLWFnZ3JlZ2F0ZS1pZi1tYXN0ZXIvUkVBRE1FLnJzdCBiL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi9kamFuZ28tYWdncmVnYXRlLWlmLW1hc3Rlci9SRUFETUUucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczOWQ0ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvZGphbmdvLWFnZ3JlZ2F0ZS1pZi1tYXN0ZXIvUkVBRE1FLnJzdApAQCAtMCwwICsxLDE1NiBAQAorRGphbmdvIEFnZ3JlZ2F0ZSBJZjogQ29uZGl0aW9uIGFnZ3JlZ2F0ZXMgZm9yIERqYW5nbworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisuLiBpbWFnZTo6IGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9oZW5yaXF1ZWJhc3Rvcy9kamFuZ28tYWdncmVnYXRlLWlmLnBuZz9icmFuY2g9bWFzdGVyCisgICAgOnRhcmdldDogaHR0cHM6Ly90cmF2aXMtY2kub3JnL2hlbnJpcXVlYmFzdG9zL2RqYW5nby1hZ2dyZWdhdGUtaWYKKyAgICA6YWx0OiBUZXN0IFN0YXR1cworCisuLiBpbWFnZTo6IGh0dHBzOi8vbGFuZHNjYXBlLmlvL2dpdGh1Yi9oZW5yaXF1ZWJhc3Rvcy9kamFuZ28tYWdncmVnYXRlLWlmL21hc3Rlci9sYW5kc2NhcGUucG5nCisgICAgOnRhcmdldDogaHR0cHM6Ly9sYW5kc2NhcGUuaW8vZ2l0aHViL2hlbnJpcXVlYmFzdG9zL2RqYW5nby1hZ2dyZWdhdGUtaWYvbWFzdGVyCisgICAgOmFsdDogQ29kZSBIZWx0aAorCisuLiBpbWFnZTo6IGh0dHBzOi8vcHlwaXAuaW4vdi9kamFuZ28tYWdncmVnYXRlLWlmL2JhZGdlLnBuZworICAgIDp0YXJnZXQ6IGh0dHBzOi8vY3JhdGUuaW8vcGFja2FnZXMvZGphbmdvLWFnZ3JlZ2F0ZS1pZi8KKyAgICA6YWx0OiBMYXRlc3QgUHlQSSB2ZXJzaW9uCisKKy4uIGltYWdlOjogaHR0cHM6Ly9weXBpcC5pbi9kL2RqYW5nby1hZ2dyZWdhdGUtaWYvYmFkZ2UucG5nCisgICAgOnRhcmdldDogaHR0cHM6Ly9jcmF0ZS5pby9wYWNrYWdlcy9kamFuZ28tYWdncmVnYXRlLWlmLworICAgIDphbHQ6IE51bWJlciBvZiBQeVBJIGRvd25sb2FkcworCisqQWdncmVnYXRlLWlmKiBhZGRzIGNvbmRpdGlvbmFsIGFnZ3JlZ2F0ZXMgdG8gRGphbmdvLgorCitDb25kaXRpb25hbCBhZ2dyZWdhdGVzIGNhbiBoZWxwIHlvdSByZWR1Y2UgdGhlIGFtbW91bnQgb2YgcXVlcmllcyB0byBvYnRhaW4KK2FnZ3JlZ2F0ZWQgaW5mb3JtYXRpb24sIGxpa2Ugc3RhdGlzdGljcyBmb3IgZXhhbXBsZS4KKworSW1hZ2luZSB5b3UgaGF2ZSBhIG1vZGVsIGBgT2ZmZXJgYCBsaWtlIHRoaXMgb25lOgorCisuLiBjb2RlLWJsb2NrOjogcHl0aG9uCisKKyAgICBjbGFzcyBPZmZlcihtb2RlbHMuTW9kZWwpOgorICAgICAgICBzcG9uc29yID0gbW9kZWxzLkZvcmVpZ25LZXkoVXNlcikKKyAgICAgICAgcHJpY2UgPSBtb2RlbHMuRGVjaW1hbEZpZWxkKG1heF9kaWdpdHM9OSwgZGVjaW1hbF9wbGFjZXM9MikKKyAgICAgICAgc3RhdHVzID0gbW9kZWxzLkNoYXJGaWVsZChtYXhfbGVuZ3RoPTMwKQorICAgICAgICBleHBpcmVfYXQgPSBtb2RlbHMuRGF0ZUZpZWxkKG51bGw9VHJ1ZSwgYmxhbms9VHJ1ZSkKKyAgICAgICAgY3JlYXRlZF9hdCA9IG1vZGVscy5EYXRlVGltZUZpZWxkKGF1dG9fbm93X2FkZD1UcnVlKQorICAgICAgICB1cGRhdGVkX2F0ID0gbW9kZWxzLkRhdGVUaW1lRmllbGQoYXV0b19ub3c9VHJ1ZSkKKworICAgICAgICBPUEVOID0gIk9QRU4iCisgICAgICAgIFJFVk9LRUQgPSAiUkVWT0tFRCIKKyAgICAgICAgUEFJRCA9ICJQQUlEIgorCitMZXQncyBzYXkgeW91IHdhbnQgdG8ga25vdzoKKworIy4gSG93IG1hbnkgb2ZmZXJzIGV4aXN0cyBpbiB0b3RhbDsKKyMuIEhvdyBtYW55IG9mIHRoZW0gYXJlIE9QRU4sIFJFVk9LRUQgb3IgUEFJRDsKKyMuIEhvdyBtdWNoIG1vbmV5IHdhcyBvZmZlcmVkIGluIHRvdGFsOworIy4gSG93IG11Y2ggbW9uZXkgaXMgaW4gT1BFTiwgUkVWT0tFRCBhbmQgUEFJRCBvZmZlcnM7CisKK1RvIGdldCB0aGVzZSBpbmZvcm1hdGlvbnMsIHlvdSBjb3VsZCBxdWVyeToKKworLi4gY29kZS1ibG9jazo6IHB5dGhvbgorCisgICAgZnJvbSBkamFuZ28uZGIubW9kZWxzIGltcG9ydCBDb3VudCwgU3VtCisKKyAgICBPZmZlci5vYmplY3RzLmNvdW50KCkKKyAgICBPZmZlci5vYmplY3RzLmZpbHRlcihzdGF0dXM9T2ZmZXIuT1BFTikuYWdncmVnYXRlKENvdW50KCdwaycpKQorICAgIE9mZmVyLm9iamVjdHMuZmlsdGVyKHN0YXR1cz1PZmZlci5SRVZPS0VEKS5hZ2dyZWdhdGUoQ291bnQoJ3BrJykpCisgICAgT2ZmZXIub2JqZWN0cy5maWx0ZXIoc3RhdHVzPU9mZmVyLlBBSUQpLmFnZ3JlZ2F0ZShDb3VudCgncGsnKSkKKyAgICBPZmZlci5vYmplY3RzLmFnZ3JlZ2F0ZShTdW0oJ3ByaWNlJykpCisgICAgT2ZmZXIub2JqZWN0cy5maWx0ZXIoc3RhdHVzPU9mZmVyLk9QRU4pLmFnZ3JlZ2F0ZShTdW0oJ3ByaWNlJykpCisgICAgT2ZmZXIub2JqZWN0cy5maWx0ZXIoc3RhdHVzPU9mZmVyLlJFVk9LRUQpLmFnZ3JlZ2F0ZShTdW0oJ3ByaWNlJykpCisgICAgT2ZmZXIub2JqZWN0cy5maWx0ZXIoc3RhdHVzPU9mZmVyLlBBSUQpLmFnZ3JlZ2F0ZShTdW0oJ3ByaWNlJykpCisKK0luIHRoaXMgY2FzZSwgKio4IHF1ZXJpZXMqKiB3ZXJlIG5lZWRlZCB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCBpbmZvcm1hdGlvbi4KKworV2l0aCBjb25kaXRpb25hbCBhZ2dyZWdhdGVzIHlvdSBjYW4gZ2V0IGl0IGFsbCB3aXRoIG9ubHkgKioxIHF1ZXJ5Kio6CisKKy4uIGNvZGUtYmxvY2s6OiBweXRob24KKworICAgIGZyb20gZGphbmdvLmRiLm1vZGVscyBpbXBvcnQgUQorICAgIGZyb20gYWdncmVnYXRlX2lmIGltcG9ydCBDb3VudCwgU3VtCisKKyAgICBPZmZlci5vYmplY3RzLmFnZ3JlZ2F0ZSgKKyAgICAgICAgcGtfX2NvdW50PUNvdW50KCdwaycpLAorICAgICAgICBwa19fb3Blbl9fY291bnQ9Q291bnQoJ3BrJywgb25seT1RKHN0YXR1cz1PZmZlci5PUEVOKSksCisgICAgICAgIHBrX19yZXZva2VkX19jb3VudD1Db3VudCgncGsnLCBvbmx5PVEoc3RhdHVzPU9mZmVyLlJFVk9LRUQpKSwKKyAgICAgICAgcGtfX3BhaWRfX2NvdW50PUNvdW50KCdwaycsIG9ubHk9UShzdGF0dXM9T2ZmZXIuUEFJRCkpLAorICAgICAgICBwa19fc3VtPVN1bSgncHJpY2UnKSwKKyAgICAgICAgcGtfX29wZW5fX3N1bT1TdW0oJ3ByaWNlJywgb25seT1RKHN0YXR1cz1PZmZlci5PUEVOKSksCisgICAgICAgIHBrX19yZXZva2VkX19zdW09U3VtKCdwcmljZScpLCBvbmx5PVEoc3RhdHVzPU9mZmVyLlJFVk9LRUQpKSwKKyAgICAgICAgcGtfX3BhaWRfX3N1bT1TdW0oJ3ByaWNlJyksIG9ubHk9UShzdGF0dXM9T2ZmZXIuUEFJRCkpCisgICAgKQorCitJbnN0YWxsYXRpb24KKy0tLS0tLS0tLS0tLQorCisqQWdncmVnYXRlLWlmKiB3b3JrcyB3aXRoIERqYW5nbyAxLjQsIDEuNSwgMS42IGFuZCAxLjcuCisKK1RvIGluc3RhbGwgaXQsIHNpbXBseToKKworLi4gY29kZS1ibG9jazo6IGJhc2gKKworICAgICQgcGlwIGluc3RhbGwgZGphbmdvLWFnZ3JlZ2F0ZS1pZgorCitJbnNwaXJhdGlvbgorLS0tLS0tLS0tLS0KKworVGhlcmUgaXMgYSA1IHllYXJzIG9sZCBgdGlja2V0IDExMzA1YF8gdGhhdCB3aWxsICgqaG9wZWZ1bGx5KikgaW1wbGVtZW50IHRoaXMgZmVhdHVyZSBpbnRvCitEamFuZ28gMS44LgorCitVc2luZyBEamFuZ28gMS42LCBJIHN0aWxsIHdhbnRlZCB0byBhdm9pZCBjcmVhdGluZyBjdXN0b20gcXVlcmllcyBmb3IgdmVyeSBzaW1wbGUKK2NvbmRpdGlvbmFsIGFnZ3JlZ2F0aW9ucy4gU28gSSd2ZSBjaGVycnkgcGlja2VkIHRob3NlIGlkZWFzIGFuZCBvdGhlcnMgZnJvbSB0aGUKK2ludGVybmV0IGFuZCBidWlsdCB0aGlzIGxpYnJhcnkuCisKK1RoaXMgbGlicmFyeSB1c2VzIHRoZSBzYW1lIEFQSSBhbmQgdGVzdHMgcHJvcG9zZWQgb24gYHRpY2tldCAxMTMwNWBfLCBzbyB3aGVuIHRoZQorbmV3IGZlYXR1cmUgaXMgYXZhaWxhYmxlIHlvdSBjYW4gZWFzaWx5IHJlcGxhY2UgYGBkamFuZ28tYWdncmVnYXRlLWlmYGAuCisKK0xpbWl0YXRpb25zCistLS0tLS0tLS0tLQorCitDb25kaXRpb25zIGludm9sdmluZyBqb2lucyB3aXRoIGFsaWFzZXMgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0LiBJZiB5b3Ugd2FudCB0bworaGVscCBhZGRpbmcgdGhpcyBmZWF0dXJlLCB5b3UncmUgd2VsY29tZSB0byBjaGVjayB0aGUgYGZpcnN0IGlzc3VlYF8uCisKK0NvbnRyaWJ1dG9ycworLS0tLS0tLS0tLS0tCisKKyogYEhlbnJpcXVlIEJhc3RvcyA8aHR0cDovL2dpdGh1Yi5jb20vaGVucmlxdWViYXN0b3M+YF8KKyogYEl1cmkgZGUgU2lsdmlvIDxodHRwczovL2dpdGh1Yi5jb20vaXVyaXNpbHZpbz5gXworKiBgSGFtcHVzIFN0amVybmhhdiA8aHR0cHM6Ly9naXRodWIuY29tL2NoYW1wPmBfCisqIGBCcmFkbGV5IE1hcnRzYmVyZ2VyIDxodHRwczovL2dpdGh1Yi5jb20vbWFydHNiZXJnZXI+YF8KKyogYE1hcmt1cyBCZXJ0aGVhdSA8aHR0cHM6Ly9naXRodWIuY29tL21iZXJ0aGVhdT5gXworKiBgZW5kMCA8aHR0cHM6Ly9naXRodWIuY29tL2VuZDA+YF8KKyogYFNjb3R0IFNleHRvbiA8aHR0cHM6Ly9naXRodWIuY29tL3Njb3R0c2V4dG9uPmBfCisqIGBNYXVsZXIgPGh0dHBzOi8vZ2l0aHViLmNvbS9tYXVsZXI+YF8KKyogYHRyYnMgPGh0dHBzOi8vZ2l0aHViLmNvbS90cmJzPmBfCisKK0NoYW5nZWxvZworLS0tLS0tLS0tCisKKzAuNQorICAgIC0gU3VwcG9ydCBmb3IgRGphbmdvIDEuNworCiswLjQKKyAgICAtIFVzZSB0b3ggdG8gcnVuIHRlc3RzLgorICAgIC0gQWRkIHN1cHBvcnQgZm9yIERqYW5nbyAxLjYuCisgICAgLSBBZGQgc3VwcG9ydCBmb3IgUHl0aG9uMy4KKyAgICAtIFRoZSBgYG9ubHlgYCBwYXJhbWV0ZXIgbm93IGZyZWVseSBzdXBwb3J0cyBqb2lucyBpbmRlcGVuZGVudCBvZiB0aGUgbWFpbiBxdWVyeS4KKyAgICAtIEFkZHMgc3VwcG9ydCBmb3IgYWxpYXMgcmVsYWJlbGluZyBwZXJtaXR0aW5nIGV4Y2x1ZGVzIGFuZCB1cGRhdGVzIHdpdGggYWdncmVnYXRlcyBmaWx0ZXJlZCBvbiByZW1vdGUgZm9yZWlnbiBrZXkgcmVsYXRpb25zLgorCiswLjMuMQorICAgIC0gRml4IHF1b3RhdGlvbiBlc2NhcGluZy4KKyAgICAtIEZpeCBib29sZWFuIGNhc3RzIG9uIFBvc3RncmVzLgorCiswLjIKKyAgICAtIEZpeCBwb3N0Z3JlcyBpc3N1ZSB3aXRoIExJS0UgY29uZGl0aW9ucy4KKworMC4xCisgICAgLSBJbml0aWFsIHJlbGVhc2UuCisKKworTGljZW5zZQorPT09PT09PQorCitUaGUgTUlUIExpY2Vuc2UuCisKKy4uIF90aWNrZXQgMTEzMDU6IGh0dHBzOi8vY29kZS5kamFuZ29wcm9qZWN0LmNvbS90aWNrZXQvMTEzMDUKKy4uIF9maXJzdCBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL2hlbnJpcXVlYmFzdG9zL2RqYW5nby1hZ2dyZWdhdGUtaWYvaXNzdWVzLzEKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi9kamFuZ28tYWdncmVnYXRlLWlmLW1hc3Rlci9hZ2dyZWdhdGVfaWYucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvZGphbmdvLWFnZ3JlZ2F0ZS1pZi1tYXN0ZXIvYWdncmVnYXRlX2lmLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZjM0MjcKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvZGphbmdvLWFnZ3JlZ2F0ZS1pZi1tYXN0ZXIvYWdncmVnYXRlX2lmLnB5CkBAIC0wLDAgKzEsMTY0IEBACisjIGNvZGluZzogdXRmLTgKKycnJworSW1wbGVtZW50cyBjb25kaXRpb25hbCBhZ2dyZWdhdGVzLgorCitUaGlzIGNvZGUgd2FzIGJhc2VkIG9uIHRoZSB3b3JrIG9mIG90aGVycyBmb3VuZCBvbiB0aGUgaW50ZXJuZXQ6CisKKzEuIGh0dHA6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLzIwMTAxMTE1MTcwODA0L2h0dHA6Ly93d3cudm90ZXJ1bml2ZXJzZS5jb20vTWVtYmVycy9qbGFudHovYmxvZy9jb25kaXRpb25hbC1hZ2dyZWdhdGVzLWluLWRqYW5nbworMi4gaHR0cHM6Ly9jb2RlLmRqYW5nb3Byb2plY3QuY29tL3RpY2tldC8xMTMwNQorMy4gaHR0cHM6Ly9ncm91cHMuZ29vZ2xlLmNvbS9mb3J1bS8/ZnJvbWdyb3Vwcz0jIXRvcGljL2RqYW5nby11c2Vycy9janpsb1RVd21TMAorNC4gaHR0cHM6Ly9ncm91cHMuZ29vZ2xlLmNvbS9mb3J1bS8/ZnJvbWdyb3Vwcz0jIXRvcGljL2RqYW5nby11c2Vycy92VnByTXBzQW5QbworJycnCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHVuaWNvZGVfbGl0ZXJhbHMKK2Zyb20gZGphbmdvLnV0aWxzIGltcG9ydCBzaXgKK2ltcG9ydCBkamFuZ28KK2Zyb20gZGphbmdvLmRiLm1vZGVscy5hZ2dyZWdhdGVzIGltcG9ydCBBZ2dyZWdhdGUgYXMgRGphbmdvQWdncmVnYXRlCitmcm9tIGRqYW5nby5kYi5tb2RlbHMuc3FsLmFnZ3JlZ2F0ZXMgaW1wb3J0IEFnZ3JlZ2F0ZSBhcyBEamFuZ29TcWxBZ2dyZWdhdGUKKworCitWRVJTSU9OID0gZGphbmdvLlZFUlNJT05bOjJdCisKKworY2xhc3MgU3FsQWdncmVnYXRlKERqYW5nb1NxbEFnZ3JlZ2F0ZSk6CisgICAgY29uZGl0aW9uYWxfdGVtcGxhdGUgPSAnJShmdW5jdGlvbilzKENBU0UgV0hFTiAlKGNvbmRpdGlvbilzIFRIRU4gJShmaWVsZClzIEVMU0UgbnVsbCBFTkQpJworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbCwgc291cmNlPU5vbmUsIGlzX3N1bW1hcnk9RmFsc2UsIGNvbmRpdGlvbj1Ob25lLCAqKmV4dHJhKToKKyAgICAgICAgc3VwZXIoU3FsQWdncmVnYXRlLCBzZWxmKS5fX2luaXRfXyhjb2wsIHNvdXJjZSwgaXNfc3VtbWFyeSwgKipleHRyYSkKKyAgICAgICAgc2VsZi5jb25kaXRpb24gPSBjb25kaXRpb24KKworICAgIGRlZiByZWxhYmVsX2FsaWFzZXMoc2VsZiwgY2hhbmdlX21hcCk6CisgICAgICAgIGlmIFZFUlNJT04gPCAoMSwgNyk6CisgICAgICAgICAgICBzdXBlcihTcWxBZ2dyZWdhdGUsIHNlbGYpLnJlbGFiZWxfYWxpYXNlcyhjaGFuZ2VfbWFwKQorICAgICAgICBpZiBzZWxmLmhhc19jb25kaXRpb246CisgICAgICAgICAgICBjb25kaXRpb25fY2hhbmdlX21hcCA9IGRpY3QoKGssIHYpIGZvciBrLCB2IGluIFwKKyAgICAgICAgICAgICAgICBjaGFuZ2VfbWFwLml0ZW1zKCkgaWYgayBpbiBzZWxmLmNvbmRpdGlvbi5xdWVyeS5hbGlhc19tYXAKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIHNlbGYuY29uZGl0aW9uLnF1ZXJ5LmNoYW5nZV9hbGlhc2VzKGNvbmRpdGlvbl9jaGFuZ2VfbWFwKQorCisgICAgZGVmIHJlbGFiZWxlZF9jbG9uZShzZWxmLCBjaGFuZ2VfbWFwKToKKyAgICAgICAgc2VsZi5yZWxhYmVsX2FsaWFzZXMoY2hhbmdlX21hcCkKKyAgICAgICAgcmV0dXJuIHN1cGVyKFNxbEFnZ3JlZ2F0ZSwgc2VsZikucmVsYWJlbGVkX2Nsb25lKGNoYW5nZV9tYXApCisKKyAgICBkZWYgYXNfc3FsKHNlbGYsIHFuLCBjb25uZWN0aW9uKToKKyAgICAgICAgaWYgc2VsZi5oYXNfY29uZGl0aW9uOgorICAgICAgICAgICAgc2VsZi5zcWxfdGVtcGxhdGUgPSBzZWxmLmNvbmRpdGlvbmFsX3RlbXBsYXRlCisgICAgICAgICAgICBzZWxmLmV4dHJhWydjb25kaXRpb24nXSA9IHNlbGYuX2NvbmRpdGlvbl9hc19zcWwocW4sIGNvbm5lY3Rpb24pCisKKyAgICAgICAgcmV0dXJuIHN1cGVyKFNxbEFnZ3JlZ2F0ZSwgc2VsZikuYXNfc3FsKHFuLCBjb25uZWN0aW9uKQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGhhc19jb25kaXRpb24oc2VsZik6CisgICAgICAgICMgV2FybmluZzogYm9vbChRdWVyeVNldCkgd2lsbCBoaXQgdGhlIGRhdGFiYXNlCisgICAgICAgIHJldHVybiBzZWxmLmNvbmRpdGlvbiBpcyBub3QgTm9uZQorCisgICAgZGVmIF9jb25kaXRpb25fYXNfc3FsKHNlbGYsIHFuLCBjb25uZWN0aW9uKToKKyAgICAgICAgJycnCisgICAgICAgIFJldHVybiBzcWwgZm9yIGNvbmRpdGlvbi4KKyAgICAgICAgJycnCisgICAgICAgIGRlZiBlc2NhcGUodmFsdWUpOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgYm9vbCk6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBzdHIoaW50KHZhbHVlKSkKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHNpeC5zdHJpbmdfdHlwZXMpOgorICAgICAgICAgICAgICAgICMgRXNjYXBlIHBhcmFtcyB1c2VkIHdpdGggTElLRQorICAgICAgICAgICAgICAgIGlmICclJyBpbiB2YWx1ZToKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKCclJywgJyUlJykKKyAgICAgICAgICAgICAgICAjIEVzY2FwZSBzaW5nbGUgcXVvdGVzCisgICAgICAgICAgICAgICAgaWYgIiciIGluIHZhbHVlOgorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoIiciLCAiJyciKQorICAgICAgICAgICAgICAgICMgQWRkIHNpbmdsZSBxdW90ZSB0byB0ZXh0IHZhbHVlcworICAgICAgICAgICAgICAgIHZhbHVlID0gIiciICsgdmFsdWUgKyAiJyIKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZQorCisgICAgICAgIHNxbCwgcGFyYW0gPSBzZWxmLmNvbmRpdGlvbi5xdWVyeS53aGVyZS5hc19zcWwocW4sIGNvbm5lY3Rpb24pCisgICAgICAgIHBhcmFtID0gbWFwKGVzY2FwZSwgcGFyYW0pCisKKyAgICAgICAgcmV0dXJuIHNxbCAlIHR1cGxlKHBhcmFtKQorCisKK2NsYXNzIFNxbFN1bShTcWxBZ2dyZWdhdGUpOgorICAgIHNxbF9mdW5jdGlvbiA9ICdTVU0nCisKKworY2xhc3MgU3FsQ291bnQoU3FsQWdncmVnYXRlKToKKyAgICBpc19vcmRpbmFsID0gVHJ1ZQorICAgIHNxbF9mdW5jdGlvbiA9ICdDT1VOVCcKKyAgICBzcWxfdGVtcGxhdGUgPSAnJShmdW5jdGlvbilzKCUoZGlzdGluY3QpcyUoZmllbGQpcyknCisgICAgY29uZGl0aW9uYWxfdGVtcGxhdGUgPSAnJShmdW5jdGlvbilzKCUoZGlzdGluY3Qpc0NBU0UgV0hFTiAlKGNvbmRpdGlvbilzIFRIRU4gJShmaWVsZClzIEVMU0UgbnVsbCBFTkQpJworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbCwgZGlzdGluY3Q9RmFsc2UsICoqZXh0cmEpOgorICAgICAgICBzdXBlcihTcWxDb3VudCwgc2VsZikuX19pbml0X18oY29sLCBkaXN0aW5jdD1kaXN0aW5jdCBhbmQgJ0RJU1RJTkNUICcgb3IgJycsICoqZXh0cmEpCisKKworY2xhc3MgU3FsQXZnKFNxbEFnZ3JlZ2F0ZSk6CisgICAgaXNfY29tcHV0ZWQgPSBUcnVlCisgICAgc3FsX2Z1bmN0aW9uID0gJ0FWRycKKworCitjbGFzcyBTcWxNYXgoU3FsQWdncmVnYXRlKToKKyAgICBzcWxfZnVuY3Rpb24gPSAnTUFYJworCisKK2NsYXNzIFNxbE1pbihTcWxBZ2dyZWdhdGUpOgorICAgIHNxbF9mdW5jdGlvbiA9ICdNSU4nCisKKworY2xhc3MgQWdncmVnYXRlKERqYW5nb0FnZ3JlZ2F0ZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxvb2t1cCwgb25seT1Ob25lLCAqKmV4dHJhKToKKyAgICAgICAgc3VwZXIoQWdncmVnYXRlLCBzZWxmKS5fX2luaXRfXyhsb29rdXAsICoqZXh0cmEpCisgICAgICAgIHNlbGYub25seSA9IG9ubHkKKyAgICAgICAgc2VsZi5jb25kaXRpb24gPSBOb25lCisKKyAgICBkZWYgX2dldF9maWVsZHNfZnJvbV9RKHNlbGYsIHEpOgorICAgICAgICBmaWVsZHMgPSBbXQorICAgICAgICBmb3IgY2hpbGQgaW4gcS5jaGlsZHJlbjoKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoY2hpbGQsICdjaGlsZHJlbicpOgorICAgICAgICAgICAgICAgIGZpZWxkcy5leHRlbmQoc2VsZi5fZ2V0X2ZpZWxkc19mcm9tX1EoY2hpbGQpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmaWVsZHMuYXBwZW5kKGNoaWxkKQorICAgICAgICByZXR1cm4gZmllbGRzCisKKyAgICBkZWYgYWRkX3RvX3F1ZXJ5KHNlbGYsIHF1ZXJ5LCBhbGlhcywgY29sLCBzb3VyY2UsIGlzX3N1bW1hcnkpOgorICAgICAgICBpZiBzZWxmLm9ubHk6CisgICAgICAgICAgICBzZWxmLmNvbmRpdGlvbiA9IHF1ZXJ5Lm1vZGVsLl9kZWZhdWx0X21hbmFnZXIuZmlsdGVyKHNlbGYub25seSkKKyAgICAgICAgICAgIGZvciBjaGlsZCBpbiBzZWxmLl9nZXRfZmllbGRzX2Zyb21fUShzZWxmLm9ubHkpOgorICAgICAgICAgICAgICAgIGZpZWxkX2xpc3QgPSBjaGlsZFswXS5zcGxpdCgnX18nKQorICAgICAgICAgICAgICAgICMgUG9wIG9mZiB0aGUgbGFzdCBmaWVsZCBpZiBpdCdzIGEgcXVlcnkgdGVybSAoJ2d0ZScsICdjb250YWlucycsICdpc251bGwnLCBldGMuKQorICAgICAgICAgICAgICAgIGlmIGZpZWxkX2xpc3RbLTFdIGluIHF1ZXJ5LnF1ZXJ5X3Rlcm1zOgorICAgICAgICAgICAgICAgICAgICBmaWVsZF9saXN0LnBvcCgpCisgICAgICAgICAgICAgICAgIyBzZXR1cF9qb2lucyBoYXZlIGRpZmZlcmVudCByZXR1cm5zIGluIERqYW5nbyAxLjUgYW5kIDEuNiwgYnV0IHRoZSBvcmRlciBvZiB3aGF0IHdlIG5lZWQgcmVtYWlucy4KKyAgICAgICAgICAgICAgICByZXN1bHQgPSBxdWVyeS5zZXR1cF9qb2lucyhmaWVsZF9saXN0LCBxdWVyeS5tb2RlbC5fbWV0YSwgcXVlcnkuZ2V0X2luaXRpYWxfYWxpYXMoKSwgTm9uZSkKKyAgICAgICAgICAgICAgICBqb2luX2xpc3QgPSByZXN1bHRbM10KKworICAgICAgICAgICAgICAgIGZuYW1lID0gJ3Byb21vdGVfYWxpYXNfY2hhaW4nIGlmIFZFUlNJT04gPCAoMSwgNSkgZWxzZSAncHJvbW90ZV9qb2lucycKKyAgICAgICAgICAgICAgICBhcmdzID0gKGpvaW5fbGlzdCwgVHJ1ZSkgaWYgVkVSU0lPTiA8ICgxLCA3KSBlbHNlIChqb2luX2xpc3QsKQorCisgICAgICAgICAgICAgICAgcHJvbW90ZSA9IGdldGF0dHIocXVlcnksIGZuYW1lKQorICAgICAgICAgICAgICAgIHByb21vdGUoKmFyZ3MpCisKKyAgICAgICAgYWdncmVnYXRlID0gc2VsZi5zcWxfa2xhc3MoY29sLCBzb3VyY2U9c291cmNlLCBpc19zdW1tYXJ5PWlzX3N1bW1hcnksIGNvbmRpdGlvbj1zZWxmLmNvbmRpdGlvbiwgKipzZWxmLmV4dHJhKQorICAgICAgICBxdWVyeS5hZ2dyZWdhdGVzW2FsaWFzXSA9IGFnZ3JlZ2F0ZQorCisKK2NsYXNzIFN1bShBZ2dyZWdhdGUpOgorICAgIG5hbWUgPSAnU3VtJworICAgIHNxbF9rbGFzcyA9IFNxbFN1bQorCisKK2NsYXNzIENvdW50KEFnZ3JlZ2F0ZSk6CisgICAgbmFtZSA9ICdDb3VudCcKKyAgICBzcWxfa2xhc3MgPSBTcWxDb3VudAorCisKK2NsYXNzIEF2ZyhBZ2dyZWdhdGUpOgorICAgIG5hbWUgPSAnQXZnJworICAgIHNxbF9rbGFzcyA9IFNxbEF2ZworCisKK2NsYXNzIE1heChBZ2dyZWdhdGUpOgorICAgIG5hbWUgPSAnTWF4JworICAgIHNxbF9rbGFzcyA9IFNxbE1heAorCisKK2NsYXNzIE1pbihBZ2dyZWdhdGUpOgorICAgIG5hbWUgPSAnTWluJworICAgIHNxbF9rbGFzcyA9IFNxbE1pbgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL2RqYW5nby1hZ2dyZWdhdGUtaWYtbWFzdGVyL3J1bnRlc3RzLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL2RqYW5nby1hZ2dyZWdhdGUtaWYtbWFzdGVyL3J1bnRlc3RzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJlNTU4NjQKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvZGphbmdvLWFnZ3JlZ2F0ZS1pZi1tYXN0ZXIvcnVudGVzdHMucHkKQEAgLTAsMCArMSw0OCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworZnJvbSBvcHRwYXJzZSBpbXBvcnQgT3B0aW9uUGFyc2VyCisKKworZGVmIHBhcnNlX2FyZ3MoKToKKyAgICBwYXJzZXIgPSBPcHRpb25QYXJzZXIoKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctcycsICctLXNldHRpbmdzJywgaGVscD0nRGVmaW5lIHNldHRpbmdzLicpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy10JywgJy0tdW5pdHRlc3QnLCBoZWxwPSdEZWZpbmUgd2hpY2ggdGVzdCB0byBydW4uIERlZmF1bHQgYWxsLicpCisgICAgb3B0aW9ucywgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKworICAgIGlmIG5vdCBvcHRpb25zLnNldHRpbmdzOgorICAgICAgICBwYXJzZXIucHJpbnRfaGVscCgpCisgICAgICAgIHN5cy5leGl0KDEpCisKKyAgICBpZiBub3Qgb3B0aW9ucy51bml0dGVzdDoKKyAgICAgICAgb3B0aW9ucy51bml0dGVzdCA9IFsnYWdncmVnYXRpb24nXQorCisgICAgcmV0dXJuIG9wdGlvbnMKKworCitkZWYgZ2V0X3J1bm5lcihzZXR0aW5nc19tb2R1bGUpOgorICAgICcnJworICAgIEFza3MgRGphbmdvIGZvciB0aGUgVGVzdFJ1bm5lciBkZWZpbmVkIGluIHNldHRpbmdzIG9yIHRoZSBkZWZhdWx0IG9uZS4KKyAgICAnJycKKyAgICBvcy5lbnZpcm9uWydESkFOR09fU0VUVElOR1NfTU9EVUxFJ10gPSBzZXR0aW5nc19tb2R1bGUKKworICAgIGltcG9ydCBkamFuZ28KKyAgICBmcm9tIGRqYW5nby50ZXN0LnV0aWxzIGltcG9ydCBnZXRfcnVubmVyCisgICAgZnJvbSBkamFuZ28uY29uZiBpbXBvcnQgc2V0dGluZ3MKKworICAgIGlmIGhhc2F0dHIoZGphbmdvLCAnc2V0dXAnKToKKyAgICAgICAgZGphbmdvLnNldHVwKCkKKworICAgIHJldHVybiBnZXRfcnVubmVyKHNldHRpbmdzKQorCisKK2RlZiBydW50ZXN0cygpOgorICAgIG9wdGlvbnMgPSBwYXJzZV9hcmdzKCkKKyAgICBUZXN0UnVubmVyID0gZ2V0X3J1bm5lcihvcHRpb25zLnNldHRpbmdzKQorICAgIHJ1bm5lciA9IFRlc3RSdW5uZXIodmVyYm9zaXR5PTEsIGludGVyYWN0aXZlPVRydWUsIGZhaWxmYXN0PUZhbHNlKQorICAgIHN5cy5leGl0KHJ1bm5lci5ydW5fdGVzdHMoW10pKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgcnVudGVzdHMoKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL2RqYW5nby1hZ2dyZWdhdGUtaWYtbWFzdGVyL3NldHVwLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL2RqYW5nby1hZ2dyZWdhdGUtaWYtbWFzdGVyL3NldHVwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZDNkYjEKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvZGphbmdvLWFnZ3JlZ2F0ZS1pZi1tYXN0ZXIvc2V0dXAucHkKQEAgLTAsMCArMSwzMyBAQAorIyBjb2Rpbmc6IHV0Zi04Citmcm9tIHNldHVwdG9vbHMgaW1wb3J0IHNldHVwCitpbXBvcnQgb3MKKworCitzZXR1cChuYW1lPSdkamFuZ28tYWdncmVnYXRlLWlmJywKKyAgICAgIHZlcnNpb249JzAuNScsCisgICAgICBkZXNjcmlwdGlvbj0nQ29uZGl0aW9uYWwgYWdncmVnYXRlcyBmb3IgRGphbmdvLCBqdXN0IGxpa2UgdGhlIGZhbW91cyBTdW1JZiBpbiBFeGNlbC4nLAorICAgICAgbG9uZ19kZXNjcmlwdGlvbj1vcGVuKG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCAiUkVBRE1FLnJzdCIpKS5yZWFkKCksCisgICAgICBhdXRob3I9IkhlbnJpcXVlIEJhc3RvcyIsIGF1dGhvcl9lbWFpbD0iaGVucmlxdWVAYmFzdG9zLm5ldCIsCisgICAgICBsaWNlbnNlPSJNSVQiLAorICAgICAgcHlfbW9kdWxlcz1bJ2FnZ3JlZ2F0ZV9pZiddLAorICAgICAgaW5zdGFsbF9yZXF1aXJlcz1bCisgICAgICAgICAgJ3NpeD49MS42LjEnLAorICAgICAgXSwKKyAgICAgIHppcF9zYWZlPUZhbHNlLAorICAgICAgcGxhdGZvcm1zPSdhbnknLAorICAgICAgaW5jbHVkZV9wYWNrYWdlX2RhdGE9VHJ1ZSwKKyAgICAgIGNsYXNzaWZpZXJzPVsKKyAgICAgICAgICAnRGV2ZWxvcG1lbnQgU3RhdHVzIDo6IDUgLSBQcm9kdWN0aW9uL1N0YWJsZScsCisgICAgICAgICAgJ0ZyYW1ld29yayA6OiBEamFuZ28nLAorICAgICAgICAgICdJbnRlbmRlZCBBdWRpZW5jZSA6OiBEZXZlbG9wZXJzJywKKyAgICAgICAgICAnTGljZW5zZSA6OiBPU0kgQXBwcm92ZWQgOjogTUlUIExpY2Vuc2UnLAorICAgICAgICAgICdOYXR1cmFsIExhbmd1YWdlIDo6IEVuZ2xpc2gnLAorICAgICAgICAgICdPcGVyYXRpbmcgU3lzdGVtIDo6IE9TIEluZGVwZW5kZW50JywKKyAgICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uJywKKyAgICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIuNycsCisgICAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzJywKKyAgICAgICAgICAnVG9waWMgOjogRGF0YWJhc2UnLAorICAgICAgICAgICdUb3BpYyA6OiBTb2Z0d2FyZSBEZXZlbG9wbWVudCA6OiBMaWJyYXJpZXMnLAorICAgICAgXSwKKyAgICAgIHVybD0naHR0cDovL2dpdGh1Yi5jb20vaGVucmlxdWViYXN0b3MvZGphbmdvLWFnZ3JlZ2F0ZS1pZi8nLAorKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL2RqYW5nby1hZ2dyZWdhdGUtaWYtbWFzdGVyL3RveC5pbmkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvZGphbmdvLWFnZ3JlZ2F0ZS1pZi1tYXN0ZXIvdG94LmluaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGJlYjE0Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL2RqYW5nby1hZ2dyZWdhdGUtaWYtbWFzdGVyL3RveC5pbmkKQEAgLTAsMCArMSwxOTggQEAKK1t0b3hdCitlbnZsaXN0ID0KKyAgICBweTI3LWRqYW5nbzEuNC1zcWxpdGUsCisgICAgcHkyNy1kamFuZ28xLjQtcG9zdGdyZXMsCisgICAgcHkyNy1kamFuZ28xLjQtbXlzcWwsCisKKyAgICBweTI3LWRqYW5nbzEuNS1zcWxpdGUsCisgICAgcHkyNy1kamFuZ28xLjUtcG9zdGdyZXMsCisgICAgcHkyNy1kamFuZ28xLjUtbXlzcWwsCisKKyAgICBweTI3LWRqYW5nbzEuNi1zcWxpdGUsCisgICAgcHkyNy1kamFuZ28xLjYtcG9zdGdyZXMsCisgICAgcHkyNy1kamFuZ28xLjYtbXlzcWwsCisKKyAgICBweTI3LWRqYW5nbzEuNy1zcWxpdGUsCisgICAgcHkyNy1kamFuZ28xLjctcG9zdGdyZXMsCisgICAgcHkyNy1kamFuZ28xLjctbXlzcWwsCisKKyAgICBweTM0LWRqYW5nbzEuNi1zcWxpdGUsCisgICAgcHkzNC1kamFuZ28xLjYtcG9zdGdyZXMsCisgICAgI3B5MzQtZGphbmdvMS42LW15c3FsCisKKyAgICBweTM0LWRqYW5nbzEuNy1zcWxpdGUsCisgICAgcHkzNC1kamFuZ28xLjctcG9zdGdyZXMsCisgICAgI3B5MzQtZGphbmdvMS43LW15c3FsCisKK1t0ZXN0ZW52XQord2hpdGVsaXN0X2V4dGVybmFscz0KKyAgICBteXNxbAorICAgIHBzcWwKKworIyBQeXRob24gMi43CisjIERqYW5nbyAxLjQKK1t0ZXN0ZW52OnB5MjctZGphbmdvMS40LXNxbGl0ZV0KK2Jhc2VweXRob24gPSBweXRob24yLjcKK2RlcHMgPQorICAgIGRqYW5nbz09MS40Citjb21tYW5kcyA9IHB5dGhvbiBydW50ZXN0cy5weSAtLXNldHRpbmdzIHRlc3RzLnRlc3Rfc3FsaXRlCisKK1t0ZXN0ZW52OnB5MjctZGphbmdvMS40LXBvc3RncmVzXQorYmFzZXB5dGhvbiA9IHB5dGhvbjIuNworZGVwcyA9CisgICAgZGphbmdvPT0xLjQKKyAgICBwc3ljb3BnMgorY29tbWFuZHMgPQorICAgIHBzcWwgLWMgJ2NyZWF0ZSBkYXRhYmFzZSBhZ2dyZWdhdGlvbjsnIHBvc3RncmVzCisgICAgcHl0aG9uIHJ1bnRlc3RzLnB5IC0tc2V0dGluZ3MgdGVzdHMudGVzdF9wb3N0Z3JlcworICAgIHBzcWwgLWMgJ2Ryb3AgZGF0YWJhc2UgYWdncmVnYXRpb247JyBwb3N0Z3JlcworCitbdGVzdGVudjpweTI3LWRqYW5nbzEuNC1teXNxbF0KK2Jhc2VweXRob24gPSBweXRob24yLjcKK2RlcHMgPQorICAgIGRqYW5nbz09MS40CisgICAgbXlzcWwtcHl0aG9uCitjb21tYW5kcyA9CisgICAgbXlzcWwgLWUgJ2NyZWF0ZSBkYXRhYmFzZSBhZ2dyZWdhdGlvbjsnCisgICAgcHl0aG9uIHJ1bnRlc3RzLnB5IC0tc2V0dGluZ3MgdGVzdHMudGVzdF9teXNxbAorICAgIG15c3FsIC1lICdkcm9wIGRhdGFiYXNlIGFnZ3JlZ2F0aW9uOycKKworIyBEamFuZ28gMS41CitbdGVzdGVudjpweTI3LWRqYW5nbzEuNS1zcWxpdGVdCitiYXNlcHl0aG9uID0gcHl0aG9uMi43CitkZXBzID0KKyAgICBkamFuZ289PTEuNQorY29tbWFuZHMgPSBweXRob24gcnVudGVzdHMucHkgLS1zZXR0aW5ncyB0ZXN0cy50ZXN0X3NxbGl0ZQorCitbdGVzdGVudjpweTI3LWRqYW5nbzEuNS1wb3N0Z3Jlc10KK2Jhc2VweXRob24gPSBweXRob24yLjcKK2RlcHMgPQorICAgIGRqYW5nbz09MS41CisgICAgcHN5Y29wZzIKK2NvbW1hbmRzID0KKyAgICBwc3FsIC1jICdjcmVhdGUgZGF0YWJhc2UgYWdncmVnYXRpb247JyBwb3N0Z3JlcworICAgIHB5dGhvbiBydW50ZXN0cy5weSAtLXNldHRpbmdzIHRlc3RzLnRlc3RfcG9zdGdyZXMKKyAgICBwc3FsIC1jICdkcm9wIGRhdGFiYXNlIGFnZ3JlZ2F0aW9uOycgcG9zdGdyZXMKKworW3Rlc3RlbnY6cHkyNy1kamFuZ28xLjUtbXlzcWxdCitiYXNlcHl0aG9uID0gcHl0aG9uMi43CitkZXBzID0KKyAgICBkamFuZ289PTEuNQorICAgIG15c3FsLXB5dGhvbgorY29tbWFuZHMgPQorICAgIG15c3FsIC1lICdjcmVhdGUgZGF0YWJhc2UgYWdncmVnYXRpb247JworICAgIHB5dGhvbiBydW50ZXN0cy5weSAtLXNldHRpbmdzIHRlc3RzLnRlc3RfbXlzcWwKKyAgICBteXNxbCAtZSAnZHJvcCBkYXRhYmFzZSBhZ2dyZWdhdGlvbjsnCisKKyMgRGphbmdvIDEuNgorW3Rlc3RlbnY6cHkyNy1kamFuZ28xLjYtc3FsaXRlXQorYmFzZXB5dGhvbiA9IHB5dGhvbjIuNworZGVwcyA9CisgICAgZGphbmdvPT0xLjYKK2NvbW1hbmRzID0gcHl0aG9uIHJ1bnRlc3RzLnB5IC0tc2V0dGluZ3MgdGVzdHMudGVzdF9zcWxpdGUKKworW3Rlc3RlbnY6cHkyNy1kamFuZ28xLjYtcG9zdGdyZXNdCitiYXNlcHl0aG9uID0gcHl0aG9uMi43CitkZXBzID0KKyAgICBkamFuZ289PTEuNgorICAgIHBzeWNvcGcyCitjb21tYW5kcyA9CisgICAgcHNxbCAtYyAnY3JlYXRlIGRhdGFiYXNlIGFnZ3JlZ2F0aW9uOycgcG9zdGdyZXMKKyAgICBweXRob24gcnVudGVzdHMucHkgLS1zZXR0aW5ncyB0ZXN0cy50ZXN0X3Bvc3RncmVzCisgICAgcHNxbCAtYyAnZHJvcCBkYXRhYmFzZSBhZ2dyZWdhdGlvbjsnIHBvc3RncmVzCisKK1t0ZXN0ZW52OnB5MjctZGphbmdvMS42LW15c3FsXQorYmFzZXB5dGhvbiA9IHB5dGhvbjIuNworZGVwcyA9CisgICAgZGphbmdvPT0xLjYKKyAgICBteXNxbC1weXRob24KK2NvbW1hbmRzID0KKyAgICBteXNxbCAtZSAnY3JlYXRlIGRhdGFiYXNlIGFnZ3JlZ2F0aW9uOycKKyAgICBweXRob24gcnVudGVzdHMucHkgLS1zZXR0aW5ncyB0ZXN0cy50ZXN0X215c3FsCisgICAgbXlzcWwgLWUgJ2Ryb3AgZGF0YWJhc2UgYWdncmVnYXRpb247JworCisKKyMgUHl0aG9uIDIuNyBhbmQgRGphbmdvIDEuNworW3Rlc3RlbnY6cHkyNy1kamFuZ28xLjctc3FsaXRlXQorYmFzZXB5dGhvbiA9IHB5dGhvbjIuNworZGVwcyA9CisgICAgZGphbmdvPT0xLjcKK2NvbW1hbmRzID0gcHl0aG9uIHJ1bnRlc3RzLnB5IC0tc2V0dGluZ3MgdGVzdHMudGVzdF9zcWxpdGUKKworW3Rlc3RlbnY6cHkyNy1kamFuZ28xLjctcG9zdGdyZXNdCitiYXNlcHl0aG9uID0gcHl0aG9uMi43CitkZXBzID0KKyAgICBkamFuZ289PTEuNworICAgIHBzeWNvcGcyCitjb21tYW5kcyA9CisgICAgcHNxbCAtYyAnY3JlYXRlIGRhdGFiYXNlIGFnZ3JlZ2F0aW9uOycgcG9zdGdyZXMKKyAgICBweXRob24gcnVudGVzdHMucHkgLS1zZXR0aW5ncyB0ZXN0cy50ZXN0X3Bvc3RncmVzCisgICAgcHNxbCAtYyAnZHJvcCBkYXRhYmFzZSBhZ2dyZWdhdGlvbjsnIHBvc3RncmVzCisKK1t0ZXN0ZW52OnB5MjctZGphbmdvMS43LW15c3FsXQorYmFzZXB5dGhvbiA9IHB5dGhvbjIuNworZGVwcyA9CisgICAgZGphbmdvPT0xLjcKKyAgICBteXNxbC1weXRob24KK2NvbW1hbmRzID0KKyAgICBteXNxbCAtZSAnY3JlYXRlIGRhdGFiYXNlIGFnZ3JlZ2F0aW9uOycKKyAgICBweXRob24gcnVudGVzdHMucHkgLS1zZXR0aW5ncyB0ZXN0cy50ZXN0X215c3FsCisgICAgbXlzcWwgLWUgJ2Ryb3AgZGF0YWJhc2UgYWdncmVnYXRpb247JworCisKKyMgUHl0aG9uIDMuNAorIyBEamFuZ28gMS42CitbdGVzdGVudjpweTM0LWRqYW5nbzEuNi1zcWxpdGVdCitiYXNlcHl0aG9uID0gcHl0aG9uMy40CitkZXBzID0KKyAgICBkamFuZ289PTEuNgorY29tbWFuZHMgPSBweXRob24gcnVudGVzdHMucHkgLS1zZXR0aW5ncyB0ZXN0cy50ZXN0X3NxbGl0ZQorCitbdGVzdGVudjpweTM0LWRqYW5nbzEuNi1wb3N0Z3Jlc10KK2Jhc2VweXRob24gPSBweXRob24zLjQKK2RlcHMgPQorICAgIGRqYW5nbz09MS42CisgICAgcHN5Y29wZzIKK2NvbW1hbmRzID0KKyAgICBwc3FsIC1jICdjcmVhdGUgZGF0YWJhc2UgYWdncmVnYXRpb247JyBwb3N0Z3JlcworICAgIHB5dGhvbiBydW50ZXN0cy5weSAtLXNldHRpbmdzIHRlc3RzLnRlc3RfcG9zdGdyZXMKKyAgICBwc3FsIC1jICdkcm9wIGRhdGFiYXNlIGFnZ3JlZ2F0aW9uOycgcG9zdGdyZXMKKworW3Rlc3RlbnY6cHkzNC1kamFuZ28xLjYtbXlzcWxdCitiYXNlcHl0aG9uID0gcHl0aG9uMy40CitkZXBzID0KKyAgICBkamFuZ289PTEuNgorICAgIG15c3FsLXB5dGhvbjMKK2NvbW1hbmRzID0KKyAgICBteXNxbCAtZSAnY3JlYXRlIGRhdGFiYXNlIGFnZ3JlZ2F0aW9uOycKKyAgICBweXRob24gcnVudGVzdHMucHkgLS1zZXR0aW5ncyB0ZXN0cy50ZXN0X215c3FsCisgICAgbXlzcWwgLWUgJ2Ryb3AgZGF0YWJhc2UgYWdncmVnYXRpb247JworCisKKyMgUHl0aG9uIDMuNAorIyBEamFuZ28gMS43CitbdGVzdGVudjpweTM0LWRqYW5nbzEuNy1zcWxpdGVdCitiYXNlcHl0aG9uID0gcHl0aG9uMy40CitkZXBzID0KKyAgICBkamFuZ289PTEuNworY29tbWFuZHMgPSBweXRob24gcnVudGVzdHMucHkgLS1zZXR0aW5ncyB0ZXN0cy50ZXN0X3NxbGl0ZQorCitbdGVzdGVudjpweTM0LWRqYW5nbzEuNy1wb3N0Z3Jlc10KK2Jhc2VweXRob24gPSBweXRob24zLjQKK2RlcHMgPQorICAgIGRqYW5nbz09MS43CisgICAgcHN5Y29wZzIKK2NvbW1hbmRzID0KKyAgICBwc3FsIC1jICdjcmVhdGUgZGF0YWJhc2UgYWdncmVnYXRpb247JyBwb3N0Z3JlcworICAgIHB5dGhvbiBydW50ZXN0cy5weSAtLXNldHRpbmdzIHRlc3RzLnRlc3RfcG9zdGdyZXMKKyAgICBwc3FsIC1jICdkcm9wIGRhdGFiYXNlIGFnZ3JlZ2F0aW9uOycgcG9zdGdyZXMKKworW3Rlc3RlbnY6cHkzNC1kamFuZ28xLjctbXlzcWxdCitiYXNlcHl0aG9uID0gcHl0aG9uMy40CitkZXBzID0KKyAgICBkamFuZ289PTEuNworICAgIG15c3FsLXB5dGhvbjMKK2NvbW1hbmRzID0KKyAgICBteXNxbCAtZSAnY3JlYXRlIGRhdGFiYXNlIGFnZ3JlZ2F0aW9uOycKKyAgICBweXRob24gcnVudGVzdHMucHkgLS1zZXR0aW5ncyB0ZXN0cy50ZXN0X215c3FsCisgICAgbXlzcWwgLWUgJ2Ryb3AgZGF0YWJhc2UgYWdncmVnYXRpb247JwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL3R0cy9SRUFETUUgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvdHRzL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmZhNTY3Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL3R0cy9SRUFETUUKQEAgLTAsMCArMSw0MSBAQAorCitUb2FzdGVyIFRlc3RpbmcgRnJhbWV3b3JrCitZb2N0byBQcm9qZWN0CisKKworUmF0aW9uYWxlCistLS0tLS0tLS0tLS0KK0FzIFRvYXN0ZXIgY29udHJpYnV0aW9ucyBncm93IHdpdGggdGhlIG51bWJlciBvZiBwZW9wbGUgdGhhdCBjb250cmlidXRlIGNvZGUsIHZlcmlmeWluZyBlYWNoIHBhdGNoIHByaW9yIHRvIHN1Ym1pdHRpbmcgdXBzdHJlYW0gYmVjb21lcyBhIGhhcmQtdG8tc2NhbGUgcHJvYmxlbSBmb3IgaHVtYW5zLiBXZSBkZXZpc2VkIHRoaXMgc3lzdGVtIGluIG9yZGVyIHRvIHJ1biBwYXRjaC1sZXZlbCB2YWxpZGF0aW9uLCB0cnlpbmcgdG8gZWxpbWluYXRlIGNvbW1vbiBwcm9ibGVtcyBmcm9tIHN1Ym1pdHRlZCBwYXRjaGVzLCBpbiBhbiBhdXRvbWF0ZWQgZmFzaGlvbi4KKworVGhlIFRvYXN0ZXIgVGVzdGluZyBGcmFtZXdvcmsgaXMgYSBzZXQgb2YgUHl0aG9uIHNjcmlwdHMgdGhhdCBwcm92aWRlcyBhbiBleHRlbnNpYmxlIHdheSB0byB3cml0ZSBzbW9rZSBhbmQgcmVncmVzc2lvbiB0ZXN0cyB0aGF0IHdpbGwgYmUgcnVuIG9uIGVhY2ggcGF0Y2ggc2V0IHNlbnQgZm9yIHJldmlldyBvbiB0aGUgdG9hc3RlciBtYWlsaW5nIGxpc3QuCisKKworVXNhZ2UKKy0tLS0tLS0tLS0tLQorVGhlcmUgYXJlIHRocmVlIG1haW4gZXhlY3V0YWJsZSBzY3JpcHRzIGluIHRoaXMgZGlyZWN0b3J5LgorICAgICogICAgcnVubmVyLnB5ICBpcyBkZXNpZ25lZCB0byBiZSBydW4gZnJvbSB0aGUgY29tbWFuZCBsaW5lLiBJdCByZXF1aXJlcywgYXMgbWFuZGF0b3J5IHBhcmFtZXRlciwgYSBicmFuY2ggbmFtZSBvbiBwb2t5LWNvbnRyaWIsIGJyYW5jaCB3aGljaCBjb250YWlucyB0aGUgcGF0Y2hlcyB0byBiZSB0ZXN0ZWQuIFRoZSBwcm9ncmFtIHdpbGwgYXV0by1kaXNjb3ZlciB0aGUgYXZhaWxhYmxlIHRlc3RzIHJlc2lkaW5nIGluIHRoaXMgZGlyZWN0b3J5IGJ5IGxvb2tpbmcgZm9yIHVuaXR0ZXN0IGNsYXNzZXMsIGFuZCB3aWxsIHJ1biB0aGUgdGVzdHMgb24gdGhlIGJyYW5jaCBkdW1waW5nIHRoZSBvdXRwdXQgdG8gdGhlIHN0YW5kYXJkIG91dHB1dC4gT3B0aW9uYWxseSwgaXQgY2FuIHRha2UgcGFyYW1ldGVycyBpbmhpYml0aW5nIHRoZSBicmFuY2ggY2hlY2tvdXQsIG9yIHNwZWNpZnlpbmcgYSBzaW5nbGUgdGVzdCB0byBiZSBydW4sIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCisgICAgKiAgICBsYXVuY2hlci5weSAgaXMgYSBkZXNpZ25lZCB0byBiZSBydW4gZnJvbSBhIGNyb250YWIgb3Igc2ltaWxhciBzY2hlZHVsaW5nIG1lY2hhbmlzbS4gSXQgbG9va3MgdXAgYSBiYWNrbG9nIGZpbGUgY29udGFpbmluZyBicmFuY2hlcy10by10ZXN0IChuYW1lZCB0YXNrcyBpbiB0aGUgc291cmNlIGNvZGUpLCBzZWxlY3QgdGhlIGZpcnN0IG9uZSBpbiBGSUZPIG1hbm5lciwgYW5kIGxhdW5jaCBydW5uZXIucHkgb24gaXQuIEl0IHdpbGwgYXdhaXQgZm9yIGNvbXBsZXRpb24sIGFuZCBlbWFpbCB0aGUgc3RhbmRhcmQgb3V0cHV0IGFuZCBzdGFuZGFyZCBlcnJvciBkdW1wcyBmcm9tIHRoZSBydW5uZXIucHkgZXhlY3V0aW9uCisgICAgKiAgICByZWN2LnB5ICBpcyBhbiBlbWFpbCByZWNlaXZlciwgZGVzaWduZWQgdG8gYmUgY2FsbGVkIGFzIGEgcGlwZSBmcm9tIGEgLmZvcndhcmQgZmlsZS4gSXQgaXMgdXNlZCB0byBtb25pdG9yIGEgbWFpbGluZyBsaXN0LCBmb3IgZXhhbXBsZSwgYW5kIGFkZCB0YXNrcyB0byB0aGUgYmFja2xvZyBiYXNlZCBvbiByZXZpZXcgcmVxdWVzdHMgY29taW5nIG9uIHRoZSBtYWlsaW5nIGxpc3QuCisKKworSW5zdGFsbGF0aW9uCistLS0tLS0tLS0tLS0KK0FzIHByZXJlcXVpc2l0ZSwgd2UgZXhwZWN0IGEgZnVuY3Rpb25pbmcgZW1haWwgc3lzdGVtIG9uIGEgbWFjaGluZSB3aXRoIFB5dGhvbjIuCisKK1RoZSBicm9hZCBzdGVwcyB0byBpbnN0YWxsYXRpb24KKyogc2V0IHVwIHRoZSAuZm9yd2FyZCBvbiB0aGUgcmVjZWl2aW5nIGVtYWlsIGFjY291bnQgdG8gcGlwZSB0byB0aGUgcmVjdi5weSBmaWxlCisqIGVkaXQgY29uZmlnLnB5IGFuZCBzZXR0aW5ncy5qc29uIHRvIGFsdGVyIGZvciBsb2NhbCBpbnN0YWxsYXRpb24gc2V0dGluZ3MKKyogb24gZW1haWwgcmVjZWl2ZSwgdmVyaWZ5IGJhY2tsb2cudHh0IHRvIHNlZSB0aGF0IHRoZSB0YXNrcyBhcmUgcmVjZWl2ZWQgYW5kIG1hcmtlZCBmb3IgcHJvY2Vzc2luZworKiBleGVjdXRlIGxhdW5jaGVyLnB5IGluIGNvbW1hbmQgbGluZSB0byB2ZXJpZnkgdGhhdCBhIHRlc3Qgb2NjdXJzIHdpdGggbm8gcHJvYmxlbXMsIGFuZCB0aGF0IHRoZSBvdXRnb2luZyBlbWFpbCBpcyBkZWxpdmVyZWQKKyogYWRkIGxhdW5jaGVyLnB5CisKKworCitDb250cmlidXRlCistLS0tLS0tLS0tLS0KK1doYXQgd2UgbmVlZCBhcmUgdGVzdHMuIEFkZCB5b3VyIG93biB0ZXN0cyB0byBlaXRoZXIgdGVzdHMucHkgZmlsZSwgb3IgdG8gYSBuZXcgZmlsZS4KK1VzZSAiY29uZmlnLmxvZ2dlciIgdG8gd3JpdGUgbG9ncyB0aGF0IHdpbGwgbWFrZSBpdCB0byBlbWFpbC4KKworQ29tbW9ubHkgdXNlZCBjb2RlIHNob3VsZCBiZSBnb2luZyB0byBzaGVsbHV0aWxzLCBhbmQgY29uZmlndXJhdGlvbiB0byBjb25maWcucHkuCisKK0NvbnRyaWJ1dGUgY29kZSBieSBlbWFpbGluZyBwYXRjaGVzIHRvIHRoZSBsaXN0OiB0b2FzdGVyQHlvY3RvcHJvamVjdC5vcmcgKG1lbWJlcnNoaXAgcmVxdWlyZWQpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvdHRzL1RPRE8gYi9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvdHRzL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE3MTkyMQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi90dHMvVE9ETwpAQCAtMCwwICsxLDkgQEAKK1dlIG5lZWQgdG8gaW1wbGVtZW50IHRlc3RzOgorCithdXRvbWF0ZWQgbGluayBjaGVja2VyOyBjdXJyZW50bHkKKyQgbGlua2NoZWNrZXIgLXQgMTAwMCAtRiBjc3YgaHR0cDovL2xvY2FsaG9zdDo4MDAwLworCitpbnRlZ3JhdGUgdGhlIHczYy12YWxpZGF0aW9uIHNlcnZpY2U7IGN1cnJlbnRseQorJCBweXRob24gdXJsY2hlY2sucHkKKworCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvdHRzL2NvbmZpZy5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi90dHMvY29uZmlnLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZDQ1ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvdHRzL2NvbmZpZy5weQpAQCAtMCwwICsxLDk4IEBACisjIS91c3IvYmluL3B5dGhvbgorCisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIworIyBDb3B5cmlnaHQgKEMpIDIwMTUgQWxleGFuZHJ1IERhbWlhbiBmb3IgSW50ZWwgQ29ycC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKyMgVGhpcyBpcyB0aGUgY29uZmlndXJhdGlvbi9zaW5nbGUgbW9kdWxlIGZvciB0dHMKKyMgZXZlcnl0aGluZyB0aGF0IHdvdWxkIGJlIGEgZ2xvYmFsIHZhcmlhYmxlIGdvZXMgaGVyZQorCitpbXBvcnQgb3MsIHN5cywgbG9nZ2luZworaW1wb3J0IHNvY2tldAorCitMT0dESVIgPSAibG9nIgorU0VUVElOR1NfRklMRSA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCAic2V0dGluZ3MuanNvbiIpCitURVNUX0RJUl9OQU1FID0gInR0c190ZXN0ZGlyIgorCitERUJVRyA9IFRydWUKKworT1dOX1BJRCA9IG9zLmdldHBpZCgpCisKK1czQ19WQUxJREFUT1IgPSAiaHR0cDovL2ljYXJ1cy5sb2NhbC93M2MtdmFsaWRhdG9yL2NoZWNrP2RvY3R5cGU9SFRNTDUmdXJpPSIKKworVE9BU1RFUl9QT1JUID0gNTY3ODkKKworVEVTVERJUiA9IE5vbmUKKworI3dlIHBhcnNlIHRoZSB3M2MgVVJMIHRvIGtub3cgd2hlcmUgdG8gY29ubmVjdAorCitpbXBvcnQgdXJscGFyc2UKKworZGVmIGdldF9wdWJsaWNfaXAoKToKKyAgICB0ZW1wX3NvY2tldCA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX0RHUkFNKQorICAgIHBhcnNlZF91cmwgPSB1cmxwYXJzZS51cmxwYXJzZSgiaHR0cDovL2ljYXJ1cy5sb2NhbC93M2MtdmFsaWRhdG9yL2NoZWNrP2RvY3R5cGU9SFRNTDUmdXJpPSIpCisgICAgdGVtcF9zb2NrZXQuY29ubmVjdCgocGFyc2VkX3VybC5uZXRsb2MsIDgwIGlmIHBhcnNlZF91cmwucG9ydCBpcyBOb25lIGVsc2UgcGFyc2VkX3VybC5wb3J0KSkKKyAgICBwdWJsaWNfaXAgPSB0ZW1wX3NvY2tldC5nZXRzb2NrbmFtZSgpWzBdCisgICAgdGVtcF9zb2NrZXQuY2xvc2UoKQorICAgIHJldHVybiBwdWJsaWNfaXAKKworVE9BU1RFUl9CQVNFVVJMID0gImh0dHA6Ly8lczolZC8iICUgKGdldF9wdWJsaWNfaXAoKSwgVE9BU1RFUl9QT1JUKQorCisKK09XTl9FTUFJTF9BRERSRVNTID0gIlRvYXN0ZXIgVGVzdGluZyBGcmFtZXdvcmsgPGFsZXhhbmRydS5kYW1pYW5AaW50ZWwuY29tPiIKK1JFUE9SVF9FTUFJTF9BRERSRVNTID0gImFsZXhhbmRydS5kYW1pYW5AaW50ZWwuY29tIgorCisjIG1ha2Ugc3VyZSB3ZSBoYXZlIHRoZSBiYXNpYyBsb2dnaW5nIGluZnJhc3RydWN0dXJlCisKKyNweWxpbnQ6IGRpc2FibGU9aW52YWxpZC1uYW1lCisjIHdlIGRpc2FibGUgdGhlIGludmFsaWQgbmFtZSBiZWNhdXNlIHRoZSBtb2R1bGUtbGV2ZWwgImxvZ2dlciIgaXMgdXNlZCB0aHJvdWdvdXQgYml0YmFrZQorbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoInRvYXN0ZXJ0ZXN0IikKK19fY29uc29sZV9fID0gbG9nZ2luZy5TdHJlYW1IYW5kbGVyKHN5cy5zdGRvdXQpCitfX2NvbnNvbGVfXy5zZXRGb3JtYXR0ZXIobG9nZ2luZy5Gb3JtYXR0ZXIoIiUoYXNjdGltZSlzICUobGV2ZWxuYW1lKXM6ICUobWVzc2FnZSlzIikpCitsb2dnZXIuYWRkSGFuZGxlcihfX2NvbnNvbGVfXykKK2xvZ2dlci5zZXRMZXZlbChsb2dnaW5nLkRFQlVHKQorCisKKyMgc2luZ2xldG9uIGZpbGUgbmFtZXMKK0xPQ0tGSUxFID0gIi90bXAvdHRmLmxvY2siCitCQUNLTE9HRklMRSA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCAiYmFja2xvZy50eHQiKQorCisjIHRhc2sgc3RhdGVzCitkZWYgZW51bSgqc2VxdWVudGlhbCwgKipuYW1lZCk6CisgICAgZW51bXMgPSBkaWN0KHppcChzZXF1ZW50aWFsLCByYW5nZShsZW4oc2VxdWVudGlhbCkpKSwgKipuYW1lZCkKKyAgICByZXZlcnNlID0gZGljdCgodmFsdWUsIGtleSkgZm9yIGtleSwgdmFsdWUgaW4gZW51bXMuaXRlcml0ZW1zKCkpCisgICAgZW51bXNbJ3JldmVyc2VfbWFwcGluZyddID0gcmV2ZXJzZQorICAgIHJldHVybiB0eXBlKCdFbnVtJywgKCksIGVudW1zKQorCisKK2NsYXNzIFRBU0tTKG9iamVjdCk6CisgICAgI3B5bGludDogZGlzYWJsZT10b28tZmV3LXB1YmxpYy1tZXRob2RzCisgICAgUEVORElORyA9ICJQRU5ESU5HIgorICAgIElOUFJPR1JFU1MgPSAiSU5QUk9HUkVTUyIKKyAgICBET05FID0gIkRPTkUiCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIG5leHRfdGFzayh0YXNrKToKKyAgICAgICAgaWYgdGFzayA9PSBUQVNLUy5QRU5ESU5HOgorICAgICAgICAgICAgcmV0dXJuIFRBU0tTLklOUFJPR1JFU1MKKyAgICAgICAgaWYgdGFzayA9PSBUQVNLUy5JTlBST0dSRVNTOgorICAgICAgICAgICAgcmV0dXJuIFRBU0tTLkRPTkUKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJJbnZhbGlkIG5leHQgdGFzayBzdGF0ZSBmb3IgJXMiICUgdGFzaykKKworIyBUVFMgc3BlY2lmaWMKK0NPTlRSSUJfUkVQTyA9ICJnaXRAZ2l0LnlvY3RvcHJvamVjdC5vcmc6cG9reS1jb250cmliIgorCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvdHRzL2xhdW5jaGVyLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL3R0cy9sYXVuY2hlci5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNTc5NGMxCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL3R0cy9sYXVuY2hlci5weQpAQCAtMCwwICsxLDEwMSBAQAorIyEvdXNyL2Jpbi9weXRob24KKworIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDE1IEFsZXhhbmRydSBEYW1pYW4gZm9yIEludGVsIENvcnAuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCisjIFByb2dyYW0gdG8gcnVuIHRoZSBuZXh0IHRhc2sgbGlzdGVkIGZyb20gdGhlIGJhY2tsb2cudHh0OyBkZXNpZ25lZCB0byBiZQorIyBydW4gZnJvbSBjcm9udGFiLgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCitpbXBvcnQgc3lzLCBvcywgY29uZmlnLCBzaGVsbHV0aWxzCitmcm9tIHNoZWxsdXRpbHMgaW1wb3J0IFNoZWxsQ21kRXhjZXB0aW9uCisKKyMgSW1wb3J0IHNtdHBsaWIgZm9yIHRoZSBhY3R1YWwgc2VuZGluZyBmdW5jdGlvbgoraW1wb3J0IHNtdHBsaWIKKworIyBJbXBvcnQgdGhlIGVtYWlsIG1vZHVsZXMgd2UnbGwgbmVlZAorZnJvbSBlbWFpbC5taW1lLnRleHQgaW1wb3J0IE1JTUVUZXh0CisKK2RlZiBfdGFrZV9sb2NrZmlsZSgpOgorICAgIHJldHVybiBzaGVsbHV0aWxzLmxvY2tmaWxlKHNoZWxsdXRpbHMubWtfbG9ja19maWxlbmFtZSgpKQorCisKK2RlZiByZWFkX25leHRfdGFza19ieV9zdGF0ZSh0YXNrX3N0YXRlLCB0YXNrX25hbWU9Tm9uZSk6CisgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCBjb25maWcuQkFDS0xPR0ZJTEUpKToKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICBvcy5yZW5hbWUoY29uZmlnLkJBQ0tMT0dGSUxFLCBjb25maWcuQkFDS0xPR0ZJTEUgKyAiLnRtcCIpCisgICAgdGFzayA9IE5vbmUKKyAgICB3aXRoIG9wZW4oY29uZmlnLkJBQ0tMT0dGSUxFICsgIi50bXAiLCAiciIpIGFzIGZfaW46CisgICAgICAgIHdpdGggb3Blbihjb25maWcuQkFDS0xPR0ZJTEUsICJ3IikgYXMgZl9vdXQ6CisgICAgICAgICAgICBmb3IgbGluZSBpbiBmX2luLnJlYWRsaW5lcygpOgorICAgICAgICAgICAgICAgIGlmIHRhc2sgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgZmllbGRzID0gbGluZS5zdHJpcCgpLnNwbGl0KCJ8IiwgMikKKyAgICAgICAgICAgICAgICAgICAgaWYgZmllbGRzWzFdID09IHRhc2tfc3RhdGU6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0YXNrX25hbWUgaXMgTm9uZSBvciB0YXNrX25hbWUgPT0gZmllbGRzWzBdOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2sgPSBmaWVsZHNbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCgiVXBkYXRpbmcgJXMgJXMgdG8gJXMiICUgKHRhc2ssIHRhc2tfc3RhdGUsIGNvbmZpZy5UQVNLUy5uZXh0X3Rhc2sodGFza19zdGF0ZSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSAiJXN8JXNcbiIgJSAodGFzaywgY29uZmlnLlRBU0tTLm5leHRfdGFzayh0YXNrX3N0YXRlKSkKKyAgICAgICAgICAgICAgICBmX291dC53cml0ZShsaW5lKQorICAgIG9zLnJlbW92ZShjb25maWcuQkFDS0xPR0ZJTEUgKyAiLnRtcCIpCisgICAgcmV0dXJuIHRhc2sKKworZGVmIHNlbmRfcmVwb3J0KHRhc2tfbmFtZSwgcGxhaW50ZXh0LCBlcnJ0ZXh0PU5vbmUpOgorICAgIGlmIGVycnRleHQgaXMgTm9uZToKKyAgICAgICAgbXNnID0gTUlNRVRleHQocGxhaW50ZXh0KQorICAgIGVsc2U6CisgICAgICAgIGlmIHBsYWludGV4dCBpcyBOb25lOgorICAgICAgICAgICAgcGxhaW50ZXh0ID0gIiIKKyAgICAgICAgbXNnID0gTUlNRVRleHQoIi0tU1RET1VUIGR1bXAtLVxuXG4lc1xuXG4tLVNUREVSUiBkdW1wLS1cblxuJXMiICUgKHBsYWludGV4dCwgZXJydGV4dCkpCisKKyAgICBtc2dbJ1N1YmplY3QnXSA9ICJbcmV2aWV3LXJlcXVlc3RdICVzIC0gc21va2UgdGVzdCByZXN1bHRzIiAlIHRhc2tfbmFtZQorICAgIG1zZ1snRnJvbSddID0gY29uZmlnLk9XTl9FTUFJTF9BRERSRVNTCisgICAgbXNnWydUbyddID0gY29uZmlnLlJFUE9SVF9FTUFJTF9BRERSRVNTCisKKyAgICBzbXRwX2Nvbm5lY3Rpb24gPSBzbXRwbGliLlNNVFAoImxvY2FsaG9zdCIpCisgICAgc210cF9jb25uZWN0aW9uLnNlbmRtYWlsKGNvbmZpZy5PV05fRU1BSUxfQUREUkVTUywgW2NvbmZpZy5SRVBPUlRfRU1BSUxfQUREUkVTU10sIG1zZy5hc19zdHJpbmcoKSkKKyAgICBzbXRwX2Nvbm5lY3Rpb24ucXVpdCgpCisKK2RlZiBtYWluKCk6CisgICAgIyB3ZSBkb24ndCBkbyBhbnl0aGluZyBpZiB3ZSBoYXZlIGFub3RoZXIgaW5zdGFuY2Ugb2YgdXMgcnVubmluZworICAgIGxvY2tfZmlsZSA9IF90YWtlX2xvY2tmaWxlKCkKKworICAgIGlmIGxvY2tfZmlsZSBpcyBOb25lOgorICAgICAgICBpZiBjb25maWcuREVCVUc6CisgICAgICAgICAgICBwcmludCgiQ29uY3VycmVudCBzY3JpcHQgaW4gcHJvZ3Jlc3MsIGV4aXRpbmciKQorICAgICAgICBzeXMuZXhpdCgxKQorCisgICAgbmV4dF90YXNrID0gcmVhZF9uZXh0X3Rhc2tfYnlfc3RhdGUoY29uZmlnLlRBU0tTLlBFTkRJTkcpCisgICAgaWYgbmV4dF90YXNrIGlzIG5vdCBOb25lOgorICAgICAgICBwcmludCgiTmV4dCB0YXNrIGlzIiwgbmV4dF90YXNrKQorICAgICAgICBlcnJ0ZXh0ID0gTm9uZQorICAgICAgICBvdXQgPSBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG91dCA9IHNoZWxsdXRpbHMucnVuX3NoZWxsX2NtZCgiJXMgJXMiICUgKG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCAicnVubmVyLnB5IiksIG5leHRfdGFzaykpCisgICAgICAgIGV4Y2VwdCBTaGVsbENtZEV4Y2VwdGlvbiBhcyBleGM6CisgICAgICAgICAgICBwcmludCgiRmFpbGVkIHdoaWxlIHJ1bm5pbmcgdGhlIHRlc3QgcnVubmVyOiAlcyIsIGV4YykKKyAgICAgICAgICAgIGVycnRleHQgPSBleGMuX19zdHJfXygpCisgICAgICAgIHNlbmRfcmVwb3J0KG5leHRfdGFzaywgb3V0LCBlcnJ0ZXh0KQorICAgICAgICByZWFkX25leHRfdGFza19ieV9zdGF0ZShjb25maWcuVEFTS1MuSU5QUk9HUkVTUywgbmV4dF90YXNrKQorICAgIGVsc2U6CisgICAgICAgIHByaW50KCJObyB0YXNrIikKKworICAgIHNoZWxsdXRpbHMudW5sb2NrZmlsZShsb2NrX2ZpbGUpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi90dHMvbG9nLy5jcmVhdGUgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvdHRzL2xvZy8uY3JlYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvdHRzL2xvZy8uY3JlYXRlCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvdHRzL3JlY3YucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvdHRzL3JlY3YucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDdlZmRhYwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi90dHMvcmVjdi5weQpAQCAtMCwwICsxLDU2IEBACisjIS91c3IvYmluL3B5dGhvbgorCisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIworIyBDb3B5cmlnaHQgKEMpIDIwMTUgQWxleGFuZHJ1IERhbWlhbiBmb3IgSW50ZWwgQ29ycC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKyMgUHJvZ3JhbSB0byByZWNlaXZlIHJldmlldyByZXF1ZXN0cyBieSBlbWFpbCBhbmQgbG9nIHRhc2tzIHRvIGJhY2tsb2cudHh0CisjIERlc2lnbmVkIHRvIGJlIHJ1biBieSB0aGUgZW1haWwgc3lzdGVtIGZyb20gYSAuZm9yd2FyZCBmaWxlOgorIworIyBjYXQgLmZvcndhcmQKKyMgfFtmdWxsL3BhdGhdL3JlY3YucHkKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgoraW1wb3J0IHN5cywgY29uZmlnLCBzaGVsbHV0aWxzCisKK2Zyb20gZW1haWwucGFyc2VyIGltcG9ydCBQYXJzZXIKKworZGVmIHJlY3ZfbWFpbChkYXRhc3RyaW5nKToKKyAgICBoZWFkZXJzID0gUGFyc2VyKCkucGFyc2VzdHIoZGF0YXN0cmluZykKKyAgICByZXR1cm4gaGVhZGVyc1snc3ViamVjdCddCisKK2RlZiBtYWluKCk6CisgICAgbG9ja19maWxlID0gc2hlbGx1dGlscy5sb2NrZmlsZShzaGVsbHV0aWxzLm1rX2xvY2tfZmlsZW5hbWUoKSwgcmV0cnk9VHJ1ZSkKKworICAgIGlmIGxvY2tfZmlsZSBpcyBOb25lOgorICAgICAgICBpZiBjb25maWcuREVCVUc6CisgICAgICAgICAgICBwcmludCgiQ29uY3VycmVudCBzY3JpcHQgaW4gcHJvZ3Jlc3MsIGV4aXRpbmciKQorICAgICAgICBzeXMuZXhpdCgxKQorCisgICAgc3ViamVjdCA9IHJlY3ZfbWFpbChzeXMuc3RkaW4ucmVhZCgpKQorCisgICAgc3ViamVjdF9wYXJ0cyA9IHN1YmplY3Quc3BsaXQoKQorICAgIGlmICJbcmV2aWV3LXJlcXVlc3RdIiBpbiBzdWJqZWN0X3BhcnRzOgorICAgICAgICB0YXNrX25hbWUgPSBzdWJqZWN0X3BhcnRzW3N1YmplY3RfcGFydHMuaW5kZXgoIltyZXZpZXctcmVxdWVzdF0iKSArIDFdCisgICAgICAgIHdpdGggb3Blbihjb25maWcuQkFDS0xPR0ZJTEUsICJhIikgYXMgZm91dDoKKyAgICAgICAgICAgIGxpbmUgPSAiJXN8JXNcbiIgJSAodGFza19uYW1lLCBjb25maWcuVEFTS1MuUEVORElORykKKyAgICAgICAgICAgIGZvdXQud3JpdGUobGluZSkKKworICAgIHNoZWxsdXRpbHMudW5sb2NrZmlsZShsb2NrX2ZpbGUpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvdHRzL3J1bm5lci5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi90dHMvcnVubmVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJlZDY2NTEKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvdHRzL3J1bm5lci5weQpAQCAtMCwwICsxLDIyMiBAQAorIyEvdXNyL2Jpbi9weXRob24KKworIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDE1IEFsZXhhbmRydSBEYW1pYW4gZm9yIEludGVsIENvcnAuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCisKKyMgVGhpcyBpcyB0aGUgbWFpbiB0ZXN0IGV4ZWN1dGlvbiBjb250cm9sbGVyLiBJdCBpcyBkZXNpZ25lZCB0byBiZSBydW4KKyMgbWFudWFsbHkgZnJvbSB0aGUgY29tbWFuZCBsaW5lLCBvciB0byBiZSBjYWxsZWQgZnJvbSBhIGRpZmZlcmVudCBwcm9ncmFtCisjIHRoYXQgc2NoZWR1bGVzIHRlc3QgZXhlY3V0aW9uLgorIworIyBFeGVjdXRlICAgcnVubmVyLnB5IC1oICAgZm9yIGhlbHAuCisKKworCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCitpbXBvcnQgc3lzLCBvcworaW1wb3J0IHVuaXR0ZXN0LCBpbXBvcnRsaWIKK2ltcG9ydCBsb2dnaW5nLCBwcHJpbnQsIGpzb24KK2ltcG9ydCByZQorZnJvbSBzaGVsbHV0aWxzIGltcG9ydCBTaGVsbENtZEV4Y2VwdGlvbiwgbWtkaXJoaWVyLCBydW5fc2hlbGxfY21kCisKK2ltcG9ydCBjb25maWcKKworIyB3ZSBhbHNvIGxvZyB0byBhIGZpbGUsIGluIGFkZGl0aW9uIHRvIGNvbnNvbGUsIGJlY2F1c2Ugb3VyIG91dHB1dCBpcyBpbXBvcnRhbnQKK19fbG9nX2ZpbGVfbmFtZV9fID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksICJsb2cvdHRzXyVkLmxvZyIgJSBjb25maWcuT1dOX1BJRCkKK21rZGlyaGllcihvcy5wYXRoLmRpcm5hbWUoX19sb2dfZmlsZV9uYW1lX18pKQorX19sb2dfZmlsZV9fID0gb3BlbihfX2xvZ19maWxlX25hbWVfXywgInciKQorX19maWxlX2hhbmRsZXJfXyA9IGxvZ2dpbmcuU3RyZWFtSGFuZGxlcihfX2xvZ19maWxlX18pCitfX2ZpbGVfaGFuZGxlcl9fLnNldEZvcm1hdHRlcihsb2dnaW5nLkZvcm1hdHRlcigiJShhc2N0aW1lKXMgJShsZXZlbG5hbWUpczogJShtZXNzYWdlKXMiKSkKKworY29uZmlnLmxvZ2dlci5hZGRIYW5kbGVyKF9fZmlsZV9oYW5kbGVyX18pCisKKyMgc2V0IHVwIGxvZyBkaXJlY3RvcnkKK3RyeToKKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoY29uZmlnLkxPR0RJUik6CisgICAgICAgIG9zLm1rZGlyKGNvbmZpZy5MT0dESVIpCisgICAgZWxzZToKKyAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoY29uZmlnLkxPR0RJUik6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIkV4cGVjdGVkIGxvZyBkaXIgJyVzJyBpcyBub3QgYWN0dWFsbHkgYSBkaXJlY3RvcnkuIiAlIGNvbmZpZy5MT0dESVIpCitleGNlcHQgT1NFcnJvciBhcyBleGM6CisgICAgcmFpc2UgZXhjCisKKyMgY3JlYXRlcyB0aGUgdW5kZXItdGVzdC1icmFuY2ggYXMgYSBzZXBhcmF0ZSBkaXJlY3RvcnkKK2RlZiBzZXRfdXBfdGVzdF9icmFuY2goc2V0dGluZ3MsIGJyYW5jaF9uYW1lKToKKyAgICB0ZXN0ZGlyID0gIiVzLyVzLiVkIiAlIChzZXR0aW5nc1snd29ya2RpciddLCBjb25maWcuVEVTVF9ESVJfTkFNRSwgY29uZmlnLk9XTl9QSUQpCisKKyAgICAjIGNyZWF0ZXMgdGhlIGhvc3QgZGlyCisgICAgaWYgb3MucGF0aC5leGlzdHModGVzdGRpcik6CisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiVGVzdCBkaXIgJyVzJ2lzIGFscmVhZHkgdGhlcmUsIGFib3J0aW5nIiAlIHRlc3RkaXIpCisKKyAgICAjIG1heSByYWlzZSBPU0Vycm9yLCBpcyB0byBiZSBoYW5kbGVkIGJ5IHRoZSBjYWxsZXIKKyAgICBvcy5tYWtlZGlycyh0ZXN0ZGlyKQorCisKKyAgICAjIGNvcGllcyBvdmVyIHRoZSAuZ2l0IGZyb20gdGhlIGxvY2FsY2xvbmUKKyAgICBydW5fc2hlbGxfY21kKCJjcCAtYSAnJXMnLy5naXQgJyVzJyIgJSAoc2V0dGluZ3NbJ2xvY2FsY2xvbmUnXSwgdGVzdGRpcikpCisKKyAgICAjIGFkZCB0aGUgcmVtb3RlIGlmIGl0IGRvZXNuJ3QgZXhpc3QKKyAgICBjcnRfcmVtb3RlcyA9IHJ1bl9zaGVsbF9jbWQoImdpdCByZW1vdGUgLXYiLCBjd2Q9dGVzdGRpcikKKyAgICByZW1vdGVzID0gW3dvcmQgZm9yIGxpbmUgaW4gY3J0X3JlbW90ZXMuc3BsaXQoIlxuIikgZm9yIHdvcmQgaW4gbGluZS5zcGxpdCgpXQorICAgIGlmIG5vdCBjb25maWcuQ09OVFJJQl9SRVBPIGluIHJlbW90ZXM6CisgICAgICAgIHJlbW90ZV9uYW1lID0gInR0c19jb250cmliIgorICAgICAgICBydW5fc2hlbGxfY21kKCJnaXQgcmVtb3RlIGFkZCAlcyAlcyIgJSAocmVtb3RlX25hbWUsIGNvbmZpZy5DT05UUklCX1JFUE8pLCBjd2Q9dGVzdGRpcikKKyAgICBlbHNlOgorICAgICAgICByZW1vdGVfbmFtZSA9IHJlbW90ZXNbcmVtb3Rlcy5pbmRleChjb25maWcuQ09OVFJJQl9SRVBPKSAtIDFdCisKKyAgICAjIGRvIHRoZSBmZXRjaAorICAgIHJ1bl9zaGVsbF9jbWQoImdpdCBmZXRjaCAlcyAtcCIgJSByZW1vdGVfbmFtZSwgY3dkPXRlc3RkaXIpCisKKyAgICAjIGRvIHRoZSBjaGVja291dAorICAgIHJ1bl9zaGVsbF9jbWQoImdpdCBjaGVja291dCBvcmlnaW4vbWFzdGVyICYmIGdpdCBicmFuY2ggLUQgJXM7IGdpdCBjaGVja291dCAlcy8lcyAtYiAlcyAmJiBnaXQgcmVzZXQgLS1oYXJkIiAlIChicmFuY2hfbmFtZSwgcmVtb3RlX25hbWUsIGJyYW5jaF9uYW1lLCBicmFuY2hfbmFtZSksIGN3ZD10ZXN0ZGlyKQorCisgICAgcmV0dXJuIHRlc3RkaXIKKworCitkZWYgX19zZWFyY2hfZm9yX3Rlc3RzKCk6CisgICAgIyB3ZSBmaW5kIGFsbCBjbGFzc2VzIHRoYXQgY2FuIHJ1biwgYW5kIHJ1biB0aGVtCisgICAgdGVzdHMgPSBbXQorICAgIGZvciBfLCBfLCBmaWxlc19saXN0IGluIG9zLndhbGsob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChfX2ZpbGVfXykpKToKKyAgICAgICAgZm9yIG1vZHVsZV9maWxlIGluIFtmWzotM10gZm9yIGYgaW4gZmlsZXNfbGlzdCBpZiBmLmVuZHN3aXRoKCIucHkiKSBhbmQgbm90IGYuc3RhcnRzd2l0aCgiX19pbml0X18iKV06CisgICAgICAgICAgICBjb25maWcubG9nZ2VyLmRlYnVnKCJJbnNwZWN0aW5nIG1vZHVsZSAlcyIsIG1vZHVsZV9maWxlKQorICAgICAgICAgICAgY3VycmVudF9tb2R1bGUgPSBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZShtb2R1bGVfZmlsZSkKKyAgICAgICAgICAgIGNydGNsYXNzX25hbWVzID0gdmFycyhjdXJyZW50X21vZHVsZSkKKyAgICAgICAgICAgIGZvciBuYW1lIGluIGNydGNsYXNzX25hbWVzOgorICAgICAgICAgICAgICAgIHRlc3RlZF92YWx1ZSA9IGNydGNsYXNzX25hbWVzW25hbWVdCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh0ZXN0ZWRfdmFsdWUsIHR5cGUodW5pdHRlc3QuVGVzdENhc2UpKSBhbmQgaXNzdWJjbGFzcyh0ZXN0ZWRfdmFsdWUsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgICAgICAgICAgdGVzdHMuYXBwZW5kKChtb2R1bGVfZmlsZSwgbmFtZSkpCisgICAgICAgIGJyZWFrCisgICAgcmV0dXJuIHRlc3RzCisKKworIyBib2lsZXJwbGF0ZSB0byBzZWxmIGRpc2NvdmVyIHRlc3RzIGFuZCBydW4gdGhlbQorZGVmIGV4ZWN1dGVfdGVzdHMoZGlyX3VuZGVyX3Rlc3QsIHRlc3RuYW1lKToKKworICAgIGlmIHRlc3RuYW1lIGlzIG5vdCBOb25lIGFuZCAiLiIgaW4gdGVzdG5hbWU6CisgICAgICAgIHRlc3RzID0gW10KKyAgICAgICAgdGVzdHMuYXBwZW5kKHR1cGxlKHRlc3RuYW1lLnNwbGl0KCIuIiwgMikpKQorICAgIGVsc2U6CisgICAgICAgIHRlc3RzID0gX19zZWFyY2hfZm9yX3Rlc3RzKCkKKworICAgICMgbGV0J3MgbW92ZSB0byB0aGUgZGlyZWN0b3J5IHVuZGVyIHRlc3QKKyAgICBjcnRfZGlyID0gb3MuZ2V0Y3dkKCkKKyAgICBvcy5jaGRpcihkaXJfdW5kZXJfdGVzdCkKKworICAgICMgZXhlY3V0ZSBlYWNoIG1vZHVsZQorICAgICMgcHlsaW50OiBkaXNhYmxlPWJyb2FkLWV4Y2VwdAorICAgICMgd2UgZGlzYWJsZSB0aGUgYnJvYWQtZXhjZXB0IGJlY2F1c2Ugd2Ugd2FudCB0byBhY3R1YWxseSBjYXRjaCBhbGwgcG9zc2libGUgZXhjZXB0aW9ucworICAgIHRyeToKKyAgICAgICAgIyBzb3J0aW5nIHRoZSB0ZXN0cyBieSB0aGUgbnVtZXJpYyBvcmRlciBpbiB0aGUgY2xhc3MgbmFtZQorICAgICAgICB0ZXN0cyA9IHNvcnRlZCh0ZXN0cywga2V5PWxhbWJkYSB4OiBpbnQocmUuc2VhcmNoKHIiWzAtOV0rIiwgeFsxXSkuZ3JvdXAoMCkpKQorICAgICAgICBjb25maWcubG9nZ2VyLmRlYnVnKCJEaXNjb3ZlcmVkIHRlc3QgY2xhc2VzOiAlcyIsIHBwcmludC5wZm9ybWF0KHRlc3RzKSkKKyAgICAgICAgdW5pdHRlc3QuaW5zdGFsbEhhbmRsZXIoKQorICAgICAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICByZXN1bHQgPSB1bml0dGVzdC5UZXN0UmVzdWx0KCkKKyAgICAgICAgcmVzdWx0LmZhaWxmYXN0ID0gVHJ1ZQorICAgICAgICBmb3IgbW9kdWxlX2ZpbGUsIHRlc3RfbmFtZSBpbiB0ZXN0czoKKyAgICAgICAgICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lKCIlcy4lcyIgJSAobW9kdWxlX2ZpbGUsIHRlc3RfbmFtZSkpKQorICAgICAgICBjb25maWcubG9nZ2VyLmluZm8oIlJ1bm5pbmcgJWQgdGVzdChzKSIsIHN1aXRlLmNvdW50VGVzdENhc2VzKCkpCisgICAgICAgIHN1aXRlLnJ1bihyZXN1bHQpCisKKyAgICAgICAgZm9yIGVycm9yIGluIHJlc3VsdC5lcnJvcnM6CisgICAgICAgICAgICBjb25maWcubG9nZ2VyLmVycm9yKCJFeGNlcHRpb24gb24gdGVzdDogJXNcbiVzIiwgZXJyb3JbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiIuam9pbihbIi0tICVzIiAlIHggZm9yIHggaW4gZXJyb3JbMV0uc3BsaXQoIlxuIildKSkKKworICAgICAgICBmb3IgZmFpbHVyZSBpbiByZXN1bHQuZmFpbHVyZXM6CisgICAgICAgICAgICBjb25maWcubG9nZ2VyLmVycm9yKCJGYWlsZWQgdGVzdDogJXM6XG4lc1xuIiwgZmFpbHVyZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIi5qb2luKFsiLS0gICVzIiAlIHggZm9yIHggaW4gZmFpbHVyZVsxXS5zcGxpdCgiXG4iKV0pKQorCisgICAgICAgIGNvbmZpZy5sb2dnZXIuaW5mbygiVGVzdCByZXN1bHRzOiAlZCByYW4sICVkIGVycm9ycywgJWQgZmFpbHVyZXMiLCByZXN1bHQudGVzdHNSdW4sIGxlbihyZXN1bHQuZXJyb3JzKSwgbGVuKHJlc3VsdC5mYWlsdXJlcykpCisKKyAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoKKyAgICAgICAgaW1wb3J0IHRyYWNlYmFjaworICAgICAgICBjb25maWcubG9nZ2VyLmVycm9yKCJFeGNlcHRpb24gd2hpbGUgcnVubmluZyB0ZXN0LiBUcmFjZWR1bXA6IFxuJXMiLCB0cmFjZWJhY2suZm9ybWF0X2V4YyhleGMpKQorICAgIGZpbmFsbHk6CisgICAgICAgIG9zLmNoZGlyKGNydF9kaXIpCisgICAgcmV0dXJuIGxlbihyZXN1bHQuZmFpbHVyZXMpCisKKyMgdmVyaWZ5IHRoYXQgd2UgaGFkIGEgYnJhbmNoLXVuZGVyLXRlc3QgbmFtZSBhcyBwYXJhbWV0ZXIKK2RlZiB2YWxpZGF0ZV9hcmdzKCk6CisgICAgZnJvbSBvcHRwYXJzZSBpbXBvcnQgT3B0aW9uUGFyc2VyCisgICAgcGFyc2VyID0gT3B0aW9uUGFyc2VyKHVzYWdlPSJ1c2FnZTogJXByb2cgW29wdGlvbnNdIGJyYW5jaF91bmRlcl90ZXN0IikKKworICAgIHBhcnNlci5hZGRfb3B0aW9uKCItdCIsICItLXRlc3QtZGlyIiwgZGVzdD0idGVzdGRpciIsIGRlZmF1bHQ9Tm9uZSwgaGVscD0iVXNlIHNwZWNpZmllZCBkaXJlY3RvcnkgdG8gcnVuIHRlc3RzLCBpbmhpYml0cyB0aGUgY2hlY2tvdXQuIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLXMiLCAiLS1zaW5nbGUiLCBkZXN0PSJzaW5nbGV0ZXN0IiwgZGVmYXVsdD1Ob25lLCBoZWxwPSJSdW4gb25seSB0aGUgc3BlY2lmaWVkIHRlc3QiKQorCisgICAgKG9wdGlvbnMsIGFyZ3MpID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorICAgIGlmIGxlbihhcmdzKSA8IDE6CisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiUGxlYXNlIHNwZWNpZnkgdGhlIGJyYW5jaCB0byBydW4gb24uIFVzZSBvcHRpb24gJy1oJyB3aGVuIGluIGRvdWJ0LiIpCisgICAgcmV0dXJuIChvcHRpb25zLCBhcmdzKQorCisKKworCisjIGxvYWQgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworZGVmIHJlYWRfc2V0dGluZ3MoKToKKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoY29uZmlnLlNFVFRJTkdTX0ZJTEUpIG9yIG5vdCBvcy5wYXRoLmlzZmlsZShjb25maWcuU0VUVElOR1NfRklMRSk6CisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiQ29uZmlnIGZpbGUgJyVzJyBjYW5ub3QgYmUgb3BlbmVuZCIgJSBjb25maWcuU0VUVElOR1NfRklMRSkKKyAgICByZXR1cm4ganNvbi5sb2FkcyhvcGVuKGNvbmZpZy5TRVRUSU5HU19GSUxFLCAiciIpLnJlYWQoKSkKKworCisjIGNsZWFudXAgIQorZGVmIGNsZWFuX3VwKHRlc3RkaXIpOgorICAgIHJ1bl9zaGVsbF9jbWQoInJtIC1yZiAtLSAnJXMnIiAlIHRlc3RkaXIpCisKK2RlZiBkdW1wX2luZm8oc2V0dGluZ3MsIG9wdGlvbnMsIGFyZ3MpOgorICAgICIiIiBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBjdXJyZW50IHJ1biBjb25maWd1cmF0aW9uLCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorICAgICIiIgorICAgIGNvbmZpZy5sb2dnZXIuZGVidWcoIlNldHRpbmdzOlxuJXNcbk9wdGlvbnM6XG4lc1xuQXJndW1lbnRzOlxuJXNcbiIsIHNldHRpbmdzLCBvcHRpb25zLCBhcmdzKQorCitkZWYgbWFpbigpOgorICAgIChvcHRpb25zLCBhcmdzKSA9IHZhbGlkYXRlX2FyZ3MoKQorCisgICAgc2V0dGluZ3MgPSByZWFkX3NldHRpbmdzKCkKKyAgICBuZWVkX2NsZWFudXAgPSBGYWxzZQorCisgICAgIyBkdW1wIGRlYnVnIGluZm8KKyAgICBkdW1wX2luZm8oc2V0dGluZ3MsIG9wdGlvbnMsIGFyZ3MpCisKKyAgICB0ZXN0ZGlyID0gTm9uZQorICAgIG5vX2ZhaWx1cmVzID0gMQorICAgIHRyeToKKyAgICAgICAgaWYgb3B0aW9ucy50ZXN0ZGlyIGlzIG5vdCBOb25lIGFuZCBvcy5wYXRoLmV4aXN0cyhvcHRpb25zLnRlc3RkaXIpOgorICAgICAgICAgICAgdGVzdGRpciA9IG9zLnBhdGguYWJzcGF0aChvcHRpb25zLnRlc3RkaXIpCisgICAgICAgICAgICBjb25maWcubG9nZ2VyLmluZm8oIk5vIGNoZWNrb3V0LCB1c2luZyAlcyIsIHRlc3RkaXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuZWVkX2NsZWFudXAgPSBUcnVlCisgICAgICAgICAgICB0ZXN0ZGlyID0gc2V0X3VwX3Rlc3RfYnJhbmNoKHNldHRpbmdzLCBhcmdzWzBdKSAjIHdlIGV4cGVjdCBhIGJyYW5jaCBuYW1lIGFzIGZpcnN0IGFyZ3VtZW50CisKKyAgICAgICAgY29uZmlnLlRFU1RESVIgPSB0ZXN0ZGlyICAgICMgd2UgbGV0IHRlc3RzIGtub3cgd2hlcmUgdG8gcnVuCisKKyAgICAgICAgIyBlbnN1cmUgdGhhdCB0aGUgdGVzdCBkaXIgb25seSBjb250YWlucyBubyAqLnB5YyBsZWZ0b3ZlcnMKKyAgICAgICAgcnVuX3NoZWxsX2NtZCgiZmluZCAnJXMnIC10eXBlIGYgLW5hbWUgKi5weWMgLWV4ZWMgcm0ge30gXFw7IiAlIHRlc3RkaXIpCisKKyAgICAgICAgbm9fZmFpbHVyZXMgPSBleGVjdXRlX3Rlc3RzKHRlc3RkaXIsIG9wdGlvbnMuc2luZ2xldGVzdCkKKworICAgIGV4Y2VwdCBTaGVsbENtZEV4Y2VwdGlvbiBhcyBleGM6CisgICAgICAgIGltcG9ydCB0cmFjZWJhY2sKKyAgICAgICAgY29uZmlnLmxvZ2dlci5lcnJvcigiRXJyb3Igd2hpbGUgc2V0dGluZyB1cCB0ZXN0aW5nLiBUcmFjZWJhY2s6IFxuJXMiLCB0cmFjZWJhY2suZm9ybWF0X2V4YyhleGMpKQorICAgIGZpbmFsbHk6CisgICAgICAgIGlmIG5lZWRfY2xlYW51cCBhbmQgdGVzdGRpciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGNsZWFuX3VwKHRlc3RkaXIpCisKKyAgICBzeXMuZXhpdChub19mYWlsdXJlcykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi90dHMvc2V0dGluZ3MuanNvbiBiL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi90dHMvc2V0dGluZ3MuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjY3MWVhCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL3R0cy9zZXR0aW5ncy5qc29uCkBAIC0wLDAgKzEsNSBAQAoreworCSJyZXBvIjogImdpdEBnaXQueW9jdG9wcm9qZWN0Lm9yZzpwb2t5LWNvbnRyaWIiLAorCSJsb2NhbGNsb25lIjogIi9ob21lL2RkYWxleC9zc2QveW9jdG8vcG9reSIsCisJIndvcmtkaXIiOiAiL2hvbWUvZGRhbGV4L3NzZC95b2N0byIKK30KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi90dHMvc2hlbGx1dGlscy5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi90dHMvc2hlbGx1dGlscy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjAxMmVkCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL3R0cy9zaGVsbHV0aWxzLnB5CkBAIC0wLDAgKzEsMTQxIEBACisjIS91c3IvYmluL3B5dGhvbgorCisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIworIyBDb3B5cmlnaHQgKEMpIDIwMTUgQWxleGFuZHJ1IERhbWlhbiBmb3IgSW50ZWwgQ29ycC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKyMgVXRpbGl0aWVzIHNoYXJlZCBieSB0ZXN0cyBhbmQgb3RoZXIgY29tbW9uIGJpdHMgb2YgY29kZS4KKworaW1wb3J0IHN5cywgb3MsIHN1YnByb2Nlc3MsIGZjbnRsLCBlcnJubworaW1wb3J0IGNvbmZpZworZnJvbSBjb25maWcgaW1wb3J0IGxvZ2dlcgorCisKKyMgTGljZW5zZSB3YXJuaW5nOyB0aGlzIGNvZGUgaXMgY29waWVkIGZyb20gdGhlIEJpdEJha2UgcHJvamVjdCwgZmlsZSBiaXRiYWtlL2xpYi9iYi91dGlscy5weQorIyBUaGUgY29kZSBpcyBvcmlnaW5hbGx5IGxpY2Vuc2VkIEdQTC0yLjAsIGFuZCB3ZSByZWRpc3RyaWJ1dGUgaXQgdW5kZXIgc3RpbGwgR1BMLTIuMAorCisjIEVuZCBvZiBjb3B5IGlzIG1hcmtlZCB3aXRoICNFTkRPRkNPUFkgbWFya2VyCisKK2RlZiBta2RpcmhpZXIoZGlyZWN0b3J5KToKKyAgICAiIiJDcmVhdGUgYSBkaXJlY3RvcnkgbGlrZSAnbWtkaXIgLXAnLCBidXQgZG9lcyBub3QgY29tcGxhaW4gaWYKKyAgICBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMgbGlrZSBvcy5tYWtlZGlycworICAgICIiIgorCisgICAgdHJ5OgorICAgICAgICBvcy5tYWtlZGlycyhkaXJlY3RvcnkpCisgICAgZXhjZXB0IE9TRXJyb3IgYXMgZXhjOgorICAgICAgICBpZiBleGMuZXJybm8gIT0gZXJybm8uRUVYSVNUOgorICAgICAgICAgICAgcmFpc2UgZXhjCisKK2RlZiBsb2NrZmlsZShuYW1lLCBzaGFyZWQ9RmFsc2UsIHJldHJ5PVRydWUpOgorICAgICIiIgorICAgIFVzZSB0aGUgZmlsZSBmbiBhcyBhIGxvY2sgZmlsZSwgcmV0dXJuIHdoZW4gdGhlIGxvY2sgaGFzIGJlZW4gYWNxdWlyZWQuCisgICAgUmV0dXJucyBhIHZhcmlhYmxlIHRvIHBhc3MgdG8gdW5sb2NrZmlsZSgpLgorICAgICIiIgorICAgIGNvbmZpZy5sb2dnZXIuZGVidWcoInRha2UgbG9ja2ZpbGUgJXMiLCBuYW1lKQorICAgIGRpcm5hbWUgPSBvcy5wYXRoLmRpcm5hbWUobmFtZSkKKyAgICBta2RpcmhpZXIoZGlybmFtZSkKKworICAgIGlmIG5vdCBvcy5hY2Nlc3MoZGlybmFtZSwgb3MuV19PSyk6CisgICAgICAgIGxvZ2dlci5lcnJvcigiVW5hYmxlIHRvIGFjcXVpcmUgbG9jayAnJXMnLCBkaXJlY3RvcnkgaXMgbm90IHdyaXRhYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgIG5hbWUpCisgICAgICAgIHN5cy5leGl0KDEpCisKKyAgICBvcGVyYXRpb24gPSBmY250bC5MT0NLX0VYCisgICAgaWYgc2hhcmVkOgorICAgICAgICBvcGVyYXRpb24gPSBmY250bC5MT0NLX1NICisgICAgaWYgbm90IHJldHJ5OgorICAgICAgICBvcGVyYXRpb24gPSBvcGVyYXRpb24gfCBmY250bC5MT0NLX05CCisKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICAjIElmIHdlIGxlYXZlIHRoZSBsb2NrZmlsZXMgbHlpbmcgYXJvdW5kIHRoZXJlIGlzIG5vIHByb2JsZW0KKyAgICAgICAgIyBidXQgd2Ugc2hvdWxkIGNsZWFuIHVwIGFmdGVyIG91cnNlbHZlcy4gVGhpcyBnaXZlcyBwb3RlbnRpYWwKKyAgICAgICAgIyBmb3IgcmFjZXMgdGhvdWdoLiBUbyB3b3JrIGFyb3VuZCB0aGlzLCB3aGVuIHdlIGFjcXVpcmUgdGhlIGxvY2sKKyAgICAgICAgIyB3ZSBjaGVjayB0aGUgZmlsZSB3ZSBsb2NrZWQgd2FzIHN0aWxsIHRoZSBsb2NrIGZpbGUgb24gZGlzay4KKyAgICAgICAgIyBieSBjb21wYXJpbmcgaW5vZGUgbnVtYmVycy4gSWYgdGhleSBkb24ndCBtYXRjaCBvciB0aGUgbG9ja2ZpbGUKKyAgICAgICAgIyBubyBsb25nZXIgZXhpc3RzLCB3ZSBzdGFydCBhZ2Fpbi4KKworICAgICAgICAjIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgdW5mYWlyIHNpbmNlIHRoZSBsYXN0IHBlcnNvbiB0byByZXF1ZXN0IHRoZQorICAgICAgICAjIGxvY2sgaXMgdGhlIG1vc3QgbGlrZWx5IHRvIHdpbiBpdC4KKworICAgICAgICAjIHB5bGludDogZGlzYWJsZT1icm9hZC1leGNlcHQKKyAgICAgICAgIyB3ZSBkaXNhYmxlIHRoZSBicm9hZC1leGNlcHQgYmVjYXVzZSB3ZSB3YW50IHRvIGFjdHVhbGx5IGNhdGNoIGFsbCBwb3NzaWJsZSBleGNlcHRpb25zCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxvY2tfZmlsZSA9IG9wZW4obmFtZSwgJ2ErJykKKyAgICAgICAgICAgIGZpbGVubyA9IGxvY2tfZmlsZS5maWxlbm8oKQorICAgICAgICAgICAgZmNudGwuZmxvY2soZmlsZW5vLCBvcGVyYXRpb24pCisgICAgICAgICAgICBzdGF0aW5mbyA9IG9zLmZzdGF0KGZpbGVubykKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGxvY2tfZmlsZS5uYW1lKToKKyAgICAgICAgICAgICAgICBzdGF0aW5mbzIgPSBvcy5zdGF0KGxvY2tfZmlsZS5uYW1lKQorICAgICAgICAgICAgICAgIGlmIHN0YXRpbmZvLnN0X2lubyA9PSBzdGF0aW5mbzIuc3RfaW5vOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9ja19maWxlCisgICAgICAgICAgICBsb2NrX2ZpbGUuY2xvc2UoKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBsb2NrX2ZpbGUuY2xvc2UoKQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGMyOgorICAgICAgICAgICAgICAgIGNvbmZpZy5sb2dnZXIuZXJyb3IoIkZhaWxlZCB0byBjbG9zZSB0aGUgbG9ja2ZpbGU6ICVzIiwgZXhjMikKKyAgICAgICAgICAgIGNvbmZpZy5sb2dnZXIuZXJyb3IoIkZhaWxlZCB0byBhY3F1aXJlIHRoZSBsb2NrZmlsZTogJXMiLCBleGMpCisgICAgICAgIGlmIG5vdCByZXRyeToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKK2RlZiB1bmxvY2tmaWxlKGxvY2tfZmlsZSk6CisgICAgIiIiCisgICAgVW5sb2NrIGEgZmlsZSBsb2NrZWQgdXNpbmcgbG9ja2ZpbGUoKQorICAgICIiIgorICAgIHRyeToKKyAgICAgICAgIyBJZiB3ZSBoYWQgYSBzaGFyZWQgbG9jaywgd2UgbmVlZCB0byBwcm9tb3RlIHRvIGV4Y2x1c2l2ZSBiZWZvcmUKKyAgICAgICAgIyByZW1vdmluZyB0aGUgbG9ja2ZpbGUuIEF0dGVtcHQgdGhpcywgaWdub3JlIGZhaWx1cmVzLgorICAgICAgICBmY250bC5mbG9jayhsb2NrX2ZpbGUuZmlsZW5vKCksIGZjbnRsLkxPQ0tfRVh8ZmNudGwuTE9DS19OQikKKyAgICAgICAgb3MudW5saW5rKGxvY2tfZmlsZS5uYW1lKQorICAgIGV4Y2VwdCAoSU9FcnJvciwgT1NFcnJvcik6CisgICAgICAgIHBhc3MKKyAgICBmY250bC5mbG9jayhsb2NrX2ZpbGUuZmlsZW5vKCksIGZjbnRsLkxPQ0tfVU4pCisgICAgbG9ja19maWxlLmNsb3NlKCkKKworI0VORE9GQ09QWQorCisKK2RlZiBta19sb2NrX2ZpbGVuYW1lKCk6CisgICAgb3VyX25hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKF9fZmlsZV9fKQorICAgIG91cl9uYW1lID0gIi4lcyIgJSAiLiIuam9pbihyZXZlcnNlZChvdXJfbmFtZS5zcGxpdCgiLiIpKSkKKyAgICByZXR1cm4gY29uZmlnLkxPQ0tGSUxFICsgb3VyX25hbWUKKworCisKK2NsYXNzIFNoZWxsQ21kRXhjZXB0aW9uKEV4Y2VwdGlvbik6CisgICAgcGFzcworCitkZWYgcnVuX3NoZWxsX2NtZChjb21tYW5kLCBjd2Q9Tm9uZSk6CisgICAgaWYgY3dkIGlzIE5vbmU6CisgICAgICAgIGN3ZCA9IG9zLmdldGN3ZCgpCisKKyAgICBjb25maWcubG9nZ2VyLmRlYnVnKCJfc2hlbGxjbWQ6ICglcykgJXMiLCBjd2QsIGNvbW1hbmQpCisgICAgcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oY29tbWFuZCwgY3dkPWN3ZCwgc2hlbGw9VHJ1ZSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgICAob3V0LCBlcnIpID0gcHJvY2Vzcy5jb21tdW5pY2F0ZSgpCisgICAgcHJvY2Vzcy53YWl0KCkKKyAgICBpZiBwcm9jZXNzLnJldHVybmNvZGU6CisgICAgICAgIGlmIGxlbihlcnIpID09IDA6CisgICAgICAgICAgICBlcnIgPSAiY29tbWFuZDogJXMgXG4lcyIgJSAoY29tbWFuZCwgb3V0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZXJyID0gImNvbW1hbmQ6ICVzIFxuJXMiICUgKGNvbW1hbmQsIGVycikKKyAgICAgICAgY29uZmlnLmxvZ2dlci53YXJuKCJfc2hlbGxjbWQ6IGVycm9yIFxuJXNcbiVzIiwgb3V0LCBlcnIpCisgICAgICAgIHJhaXNlIFNoZWxsQ21kRXhjZXB0aW9uKGVycikKKyAgICBlbHNlOgorICAgICAgICAjY29uZmlnLmxvZ2dlci5kZWJ1ZygibG9jYWxob3N0YmVjb250cm9sbGVyOiBzaGVsbGNtZCBzdWNjZXNzXG4lcyIgJSBvdXQpCisgICAgICAgIHJldHVybiBvdXQKKwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL3R0cy90ZXN0cy5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi90dHMvdGVzdHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUxMGViYgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi90dHMvdGVzdHMucHkKQEAgLTAsMCArMSwxMTUgQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisKKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisjCisjIENvcHlyaWdodCAoQykgMjAxNSBBbGV4YW5kcnUgRGFtaWFuIGZvciBJbnRlbCBDb3JwLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworCisjIFRlc3QgZGVmaW5pdGlvbnMuIFRoZSBydW5uZXIgd2lsbCBsb29rIGZvciBhbmQgYXV0by1kaXNjb3ZlciB0aGUgdGVzdHMKKyMgbm8gbWF0dGVyIHdoYXQgdGhleSBmaWxlIGFyZSB0aGV5IGluLCBhcyBsb25nIGFzIHRoZXkgYXJlIGluIHRoZSBzYW1lIGRpcmVjdG9yeQorIyBhcyB0aGlzIGZpbGUuCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBzaGVsbHV0aWxzIGltcG9ydCBydW5fc2hlbGxfY21kLCBTaGVsbENtZEV4Y2VwdGlvbgoraW1wb3J0IGNvbmZpZworCitpbXBvcnQgcGV4cGVjdAoraW1wb3J0IHN5cywgb3MsIHNpZ25hbCwgdGltZQorCitjbGFzcyBUZXN0MDBQeUNvbXBpbGFibGUodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICcnJyBWZXJpZmllcyB0aGF0IGFsbCBQeXRob24gZmlsZXMgYXJlIHN5bnRhY3RpY2FsbHkgY29ycmVjdCAnJycKKyAgICBkZWYgdGVzdF9jb21waWxlX2ZpbGUoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJ1bl9zaGVsbF9jbWQoImZpbmQgLiAtbmFtZSAqcHkgLXR5cGUgZiAtcHJpbnQwIHwgeGFyZ3MgLTAgLW4xIC1QMjAgcHl0aG9uIC1tIHB5X2NvbXBpbGUiLCBjb25maWcuVEVTVERJUikKKyAgICAgICAgZXhjZXB0IFNoZWxsQ21kRXhjZXB0aW9uIGFzIGV4YzoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiRXJyb3IgY29tcGlsaW5nIHB5dGhvbiBmaWxlczogJXMiICUgKGV4YykpCisKKyAgICBkZWYgdGVzdF9weWxpbnRfZmlsZShzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcnVuX3NoZWxsX2NtZChyImZpbmQgLiAtaW5hbWUgXCIqXC5weVwiIC10eXBlIGYgLXByaW50MCB8IFBZVEhPTlBBVEg9JHtQWVRIT05QQVRIfTouIHhhcmdzIC1yIC0wIC1uMSBweWxpbnQgLS1sb2FkLXBsdWdpbnMgcHlsaW50X2RqYW5nbyAtRSAtLXJlcG9ydHM9biAyPiYxIiwgY3dkPWNvbmZpZy5URVNURElSICsgIi9iaXRiYWtlL2xpYi90b2FzdGVyIikKKyAgICAgICAgZXhjZXB0IFNoZWxsQ21kRXhjZXB0aW9uIGFzIGV4YzoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiUHlsaW50IGZhaWxzOiAlc1xuIiAlIGV4YykKKworY2xhc3MgVGVzdDAxUHlTeXN0ZW1TdGFydCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgJycnIEF0dGVtcHRzIHRvIHN0YXJ0IFRvYXN0ZXIsIHZlcmlmeSB0aGF0IGl0IGlzIHN1Y2Nlc2Z1bGwsIGFuZCBzdG9wIGl0ICcnJworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgcnVuX3NoZWxsX2NtZCgiYmFzaCAtYyAncm0gLWYgYnVpbGQvKmxvZyciKQorCisgICAgZGVmIHRlc3Rfc3RhcnRfaW50ZXJhY3RpdmVfbW9kZShzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcnVuX3NoZWxsX2NtZCgiYmFzaCAtYyAnc291cmNlICVzL29lLWluaXQtYnVpbGQtZW52ICYmIHNvdXJjZSB0b2FzdGVyIHN0YXJ0IHdlYnBvcnQ9JWQgJiYgc291cmNlIHRvYXN0ZXIgc3RvcCciICUgKGNvbmZpZy5URVNURElSLCBjb25maWcuVE9BU1RFUl9QT1JUKSwgY29uZmlnLlRFU1RESVIpCisgICAgICAgIGV4Y2VwdCBTaGVsbENtZEV4Y2VwdGlvbiBhcyBleGM6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkZhaWxlZCBzdGFydGluZyBpbnRlcmFjdGl2ZSBtb2RlOiAlcyIgJSAoZXhjKSkKKworICAgIGRlZiB0ZXN0X3N0YXJ0X21hbmFnZWRfbW9kZShzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcnVuX3NoZWxsX2NtZCgiJXMvYml0YmFrZS9iaW4vdG9hc3RlciB3ZWJwb3J0PSVkIG5vYnJvd3NlciAmIHNsZWVwIDEwICYmIGN1cmwgaHR0cDovL2xvY2FsaG9zdDolZC8gJiYga2lsbCAtMiAlJTEiICUgKGNvbmZpZy5URVNURElSLCBjb25maWcuVE9BU1RFUl9QT1JULCBjb25maWcuVE9BU1RFUl9QT1JUKSwgY29uZmlnLlRFU1RESVIpCisgICAgICAgIGV4Y2VwdCBTaGVsbENtZEV4Y2VwdGlvbiBhcyBleGM6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkZhaWxlZCBzdGFydGluZyBtYW5hZ2VkIG1vZGU6ICVzIiAlIChleGMpKQorCitjbGFzcyBUZXN0MDJIVE1MNUNvbXBsaWFuY2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5vcmlnZGlyID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgc2VsZi5jcnRkaXIgPSBvcy5wYXRoLmRpcm5hbWUoY29uZmlnLlRFU1RESVIpCisgICAgICAgIHNlbGYuY2xlYW51cF9kYXRhYmFzZSA9IEZhbHNlCisgICAgICAgIG9zLmNoZGlyKHNlbGYuY3J0ZGlyKQorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKHNlbGYuY3J0ZGlyLCAidG9hc3Rlci5zcWxpdGUiKSk6CisgICAgICAgICAgICBzZWxmLmNsZWFudXBfZGF0YWJhc2UgPSBUcnVlCisgICAgICAgICAgICBydW5fc2hlbGxfY21kKCIlcy9iaXRiYWtlL2xpYi90b2FzdGVyL21hbmFnZS5weSBzeW5jZGIgLS1ub2lucHV0IiAlIGNvbmZpZy5URVNURElSKQorICAgICAgICAgICAgcnVuX3NoZWxsX2NtZCgiJXMvYml0YmFrZS9saWIvdG9hc3Rlci9tYW5hZ2UucHkgbWlncmF0ZSBvcm0iICUgY29uZmlnLlRFU1RESVIpCisgICAgICAgICAgICBydW5fc2hlbGxfY21kKCIlcy9iaXRiYWtlL2xpYi90b2FzdGVyL21hbmFnZS5weSBtaWdyYXRlIGJsZGNvbnRyb2wiICUgY29uZmlnLlRFU1RESVIpCisgICAgICAgICAgICBydW5fc2hlbGxfY21kKCIlcy9iaXRiYWtlL2xpYi90b2FzdGVyL21hbmFnZS5weSBsb2FkY29uZiAlcy9tZXRhLXlvY3RvL2NvbmYvdG9hc3RlcmNvbmYuanNvbiIgJSAoY29uZmlnLlRFU1RESVIsIGNvbmZpZy5URVNURElSKSkKKyAgICAgICAgICAgIHJ1bl9zaGVsbF9jbWQoIiVzL2JpdGJha2UvbGliL3RvYXN0ZXIvbWFuYWdlLnB5IGxzdXBkYXRlcyIgJSBjb25maWcuVEVTVERJUikKKworICAgICAgICAgICAgc2V0dXAgPSBwZXhwZWN0LnNwYXduKCIlcy9iaXRiYWtlL2xpYi90b2FzdGVyL21hbmFnZS5weSBjaGVja3NldHRpbmdzIiAlIGNvbmZpZy5URVNURElSKQorICAgICAgICAgICAgc2V0dXAubG9nZmlsZSA9IHN5cy5zdGRvdXQKKyAgICAgICAgICAgIHNldHVwLmV4cGVjdChyIi4qb3IgdHlwZSB0aGUgZnVsbCBwYXRoIHRvIGEgZGlmZmVyZW50IGRpcmVjdG9yeTogIikKKyAgICAgICAgICAgIHNldHVwLnNlbmRsaW5lKCcnKQorICAgICAgICAgICAgc2V0dXAuc2VuZGxpbmUoJycpCisgICAgICAgICAgICBzZXR1cC5leHBlY3QociIuKm9yIHR5cGUgdGhlIGZ1bGwgcGF0aCB0byBhIGRpZmZlcmVudCBkaXJlY3Rvcnk6ICIpCisgICAgICAgICAgICBzZXR1cC5zZW5kbGluZSgnJykKKyAgICAgICAgICAgIHNldHVwLmV4cGVjdChyIkVudGVyIHlvdXIgb3B0aW9uOiAiKQorICAgICAgICAgICAgc2V0dXAuc2VuZGxpbmUoJzAnKQorCisgICAgICAgIHNlbGYuY2hpbGQgPSBwZXhwZWN0LnNwYXduKCJiYXNoIiwgWyIlcy9iaXRiYWtlL2Jpbi90b2FzdGVyIiAlIGNvbmZpZy5URVNURElSLCAid2VicG9ydD0lZCIgJSBjb25maWcuVE9BU1RFUl9QT1JULCAibm9icm93c2VyIl0sIGN3ZD1zZWxmLmNydGRpcikKKyAgICAgICAgc2VsZi5jaGlsZC5sb2dmaWxlID0gc3lzLnN0ZG91dAorICAgICAgICBzZWxmLmNoaWxkLmV4cGVjdCgiVG9hc3RlciBpcyBub3cgcnVubmluZy4gWW91IGNhbiBzdG9wIGl0IHdpdGggQ3RybC1DIikKKworICAgIGRlZiB0ZXN0X2h0bWw1X2NvbXBsaWFuY2Uoc2VsZik6CisgICAgICAgIGltcG9ydCB1cmxsaXN0LCB1cmxjaGVjaworICAgICAgICByZXN1bHRzID0ge30KKyAgICAgICAgZm9yIHVybCBpbiB1cmxsaXN0LlVSTFM6CisgICAgICAgICAgICByZXN1bHRzW3VybF0gPSB1cmxjaGVjay52YWxpZGF0ZV9odG1sNShjb25maWcuVE9BU1RFUl9CQVNFVVJMICsgdXJsKQorCisgICAgICAgIGZhaWxlZCA9IFtdCisgICAgICAgIGZvciB1cmwgaW4gcmVzdWx0czoKKyAgICAgICAgICAgIGlmIHJlc3VsdHNbdXJsXVsxXSAhPSAwOgorICAgICAgICAgICAgICAgIGZhaWxlZC5hcHBlbmQoKHVybCwgcmVzdWx0c1t1cmxdKSkKKworCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oZmFpbGVkKSA9PSAwLCAiTm90IGFsbCBVUkxzIHZhbGlkYXRlOiBcbiVzICIgJSAiXG4iLmpvaW4oWyIiLmpvaW4oc3RyKHgpKSBmb3IgeCBpbiBmYWlsZWRdKSkKKworICAgICAgICAjKGNvbmZpZy5UT0FTVEVSX0JBU0VVUkwgKyB1cmwsIHN0YXR1cywgZXJyb3JzLCB3YXJuaW5ncykpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHdoaWxlIHNlbGYuY2hpbGQuaXNhbGl2ZSgpOgorICAgICAgICAgICAgc2VsZi5jaGlsZC5raWxsKHNpZ25hbC5TSUdJTlQpCisgICAgICAgICAgICB0aW1lLnNsZWVwKDEpCisgICAgICAgIG9zLmNoZGlyKHNlbGYub3JpZ2RpcikKKyAgICAgICAgdG9hc3Rlcl9zcWxpdGVfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLmNydGRpciwgInRvYXN0ZXIuc3FsaXRlIikKKyAgICAgICAgaWYgc2VsZi5jbGVhbnVwX2RhdGFiYXNlIGFuZCBvcy5wYXRoLmV4aXN0cyh0b2FzdGVyX3NxbGl0ZV9wYXRoKToKKyAgICAgICAgICAgIG9zLnJlbW92ZSh0b2FzdGVyX3NxbGl0ZV9wYXRoKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL3R0cy90b2FzdGVydWl0ZXN0L3J1bl90b2FzdGVydGVzdHMucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvdHRzL3RvYXN0ZXJ1aXRlc3QvcnVuX3RvYXN0ZXJ0ZXN0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44ODA0ODdjCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL3R0cy90b2FzdGVydWl0ZXN0L3J1bl90b2FzdGVydGVzdHMucHkKQEAgLTAsMCArMSw4NyBAQAorIyEvdXNyL2Jpbi9weXRob24KKworIyBDb3B5cmlnaHQKKworIyBERVNDUklQVElPTgorIyBUaGlzIGlzIHNjcmlwdCBmb3IgcnVubmluZyBhbGwgc2VsZWN0ZWQgdG9hc3RlciBjYXNlcyBvbgorIyBzZWxlY3RlZCB3ZWIgYnJvd3NlcnMgbWFuaWZlc3RlZCBpbiB0b2FzdGVyX3Rlc3QuY2ZnLgorCisjIDEuIEhvdyB0byBzdGFydCB0b2FzdGVyIGluIHlvY3RvOgorIyAkIHNvdXJjZSBwb2t5L29lLWluaXQtYnVpbGQtZW52CisjICQgc291cmNlIHRvYXN0ZXIgc3RhcnQKKyMgJCBiaXRiYWtlIGNvcmUtaW1hZ2UtbWluaW1hbAorCisjIDIuIEhvdyB0byBpbnN0YWxsIHNlbGVuaXVtIG9uIFVidW50dToKKyMgJCBzdWRvIGFwdC1nZXQgaW5zdGFsbCBzY3JvdCBweXRob24tcGlwCisjICQgc3VkbyBwaXAgaW5zdGFsbCBzZWxlbml1bQorCisjIDMuIEhvdyB0byBpbnN0YWxsIHNlbGVuaXVtIGFkZG9uIGluIGZpcmVmb3g6CisjIERvd25sb2FkIHRoZSBsYXN0ZXN0IGZpcmVmb3ggYWRkb24gZnJvbSBodHRwOi8vcmVsZWFzZS5zZWxlbml1bWhxLm9yZy9zZWxlbml1bS1pZGUvCisjIFRoZW4gaW5zdGFsbCBpdC4gWW91IGNhbiBhbHNvIGluc3RhbGwgZmlyZWJ1ZyBhbmQgZmlyZXBhdGggYWRkb24KKworIyA0LiBIb3cgdG8gc3RhcnQgd3JpdGluZyBhIG5ldyBjYXNlOgorIyBBbGwgeW91IG5lZWQgdG8gZG8gaXMgdG8gaW1wbGVtZW50IHRoZSBmdW5jdGlvbiB0ZXN0X3h4eCgpIGFuZCAgcGlsZSBpdCBvbi4KKworIyA1LiBIb3cgdG8gdGVzdCB3aXRoIENocm9tZSBicm93c2VyCisjIERvd25sb2FkL2luc3RhbGwgY2hyb21lIG9uIGhvc3QKKyMgRG93bmxvYWQgY2hyb21lZHJpdmVyIGZyb20gaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWVkcml2ZXIvZG93bmxvYWRzL2xpc3QgIGFjY29yZGluZyB0byB5b3VyIGhvc3QgdHlwZQorIyBwdXQgY2hyb21lZHJpdmVyIGluIFBBVEgsIChlLmcuIC91c3IvYmluLywgYmVhciBpbiBtaW5kIHRvIGNobW9kKQorIyBGb3Igd2luZG93cyBob3N0LCB5b3UgbWF5IHB1dCBjaHJvbWVkcml2ZXIuZXhlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyBjaHJvbWUuZXhlCisKKworaW1wb3J0IHVuaXR0ZXN0LCB0aW1lLCByZSwgc3lzLCBnZXRvcHQsIG9zLCBsb2dnaW5nLCBwbGF0Zm9ybQoraW1wb3J0IENvbmZpZ1BhcnNlcgoraW1wb3J0IHN1YnByb2Nlc3MKKworCitjbGFzcyB0b2FzdGVyX3J1bl9hbGwoKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICMgaW4gY2FzZSB0aGlzIHNjcmlwdCBpcyBjYWxsZWQgZnJvbSBvdGhlciBkaXJlY3RvcnkKKyAgICAgICAgb3MuY2hkaXIob3MucGF0aC5hYnNwYXRoKHN5cy5wYXRoWzBdKSkKKyAgICAgICAgc2VsZi5zdGFydHRpbWUgPSB0aW1lLnN0cnB0aW1lKHRpbWUuY3RpbWUoKSkKKyAgICAgICAgc2VsZi5wYXJzZXIgPSBDb25maWdQYXJzZXIuU2FmZUNvbmZpZ1BhcnNlcigpCisgICAgICAgIGZvdW5kID0gc2VsZi5wYXJzZXIucmVhZCgndG9hc3Rlcl90ZXN0LmNmZycpCisgICAgICAgIHNlbGYuaG9zdF9vcyA9IHBsYXRmb3JtLnN5c3RlbSgpLmxvd2VyKCkKKyAgICAgICAgc2VsZi5ydW5fYWxsX2Nhc2VzKCkKKyAgICAgICAgc2VsZi5jb2xsZWN0X2xvZygpCisKKyAgICBkZWYgZ2V0X3Rlc3RfY2FzZXMoc2VsZik6CisgICAgICAgICMgd2UgaGF2ZSBjb25maWcgZ3JvdXBzIGZvciBkaWZmZXJlbnQgb3MgdHlwZSBpbiB0b2FzdGVyX3Rlc3QuY2ZnCisgICAgICAgIGNhc2VzX3RvX3J1biA9IGV2YWwoc2VsZi5wYXJzZXIuZ2V0KCd0b2FzdGVyX3Rlc3RfJyArIHNlbGYuaG9zdF9vcywgJ3Rlc3RfY2FzZXMnKSkKKyAgICAgICAgcmV0dXJuIGNhc2VzX3RvX3J1bgorCisKKyAgICBkZWYgcnVuX2FsbF9jYXNlcyhzZWxmKToKKyAgICAgICAgY2FzZXNfdGVtcCA9IHNlbGYuZ2V0X3Rlc3RfY2FzZXMoKQorICAgICAgICBmb3IgY2FzZSBpbiBjYXNlc190ZW1wOgorICAgICAgICAgICAgc2luZ2xlX2Nhc2VfY21kID0gInB5dGhvbiAtbSB1bml0dGVzdCB0b2FzdGVyX2F1dG9tYXRpb25fdGVzdC50b2FzdGVyX2Nhc2VzLnRlc3RfIiArIHN0cihjYXNlKQorICAgICAgICAgICAgcHJpbnQgc2luZ2xlX2Nhc2VfY21kCisgICAgICAgICAgICBzdWJwcm9jZXNzLmNhbGwoc2luZ2xlX2Nhc2VfY21kLCBzaGVsbD1UcnVlKQorCisgICAgZGVmIGNvbGxlY3RfbG9nKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgdGhlIGxvZyBmaWxlcyBhcmUgdGVtcG9yYXJpbHkgc3RvcmVkIGluIC4vbG9nL3RtcC8uLgorICAgICAgICBBZnRlciBhbGwgY2FzZXMgYXJlIGRvbmUsIHRoZXkgc2hvdWxkIGJlIHRyYW5zZmVyZWQgdG8gLi9sb2cvJFRJTUVTVEFNUC8KKyAgICAgICAgIiIiCisgICAgICAgIGRlZiBjb21wbGUobnVtYmVyKToKKyAgICAgICAgICAgIGlmIG51bWJlciA8IDEwOgorICAgICAgICAgICAgICAgIHJldHVybiBzdHIoMCkgKyBzdHIobnVtYmVyKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyKG51bWJlcikKKyAgICAgICAgbm93ID0gc2VsZi5zdGFydHRpbWUKKyAgICAgICAgbm93X3N0ciA9IGNvbXBsZShub3cudG1feWVhcikgKyBjb21wbGUobm93LnRtX21vbikgKyBjb21wbGUobm93LnRtX21kYXkpICsgXAorICAgICAgICAgICAgICAgICAgY29tcGxlKG5vdy50bV9ob3VyKSArIGNvbXBsZShub3cudG1fbWluKSArIGNvbXBsZShub3cudG1fc2VjKQorICAgICAgICBsb2dfZGlyID0gb3MucGF0aC5hYnNwYXRoKHN5cy5wYXRoWzBdKSArIG9zLnNlcCArICdsb2cnICsgb3Muc2VwICsgbm93X3N0cgorICAgICAgICBsb2dfdG1wX2RpciA9IG9zLnBhdGguYWJzcGF0aChzeXMucGF0aFswXSkgKyBvcy5zZXAgKyAnbG9nJyArIG9zLnNlcCArICd0bXAnCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnJlbmFtZXMobG9nX3RtcF9kaXIsIGxvZ19kaXIpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yIDoKKyAgICAgICAgICAgIGxvZ2dpbmcuZXJyb3IoIiBDYW5ub3QgY3JlYXRlIGxvZyBkaXIodGltZXN0YW1wKSAgdW5kZXIgbG9nLCBwbGVhc2UgY2hlY2sgeW91ciBwcml2aWxlZ2UiKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdG9hc3Rlcl9ydW5fYWxsKCkKKworCisKKwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL3R0cy90b2FzdGVydWl0ZXN0L3RvYXN0ZXJfYXV0b21hdGlvbl90ZXN0LnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL3R0cy90b2FzdGVydWl0ZXN0L3RvYXN0ZXJfYXV0b21hdGlvbl90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJhMjA3OGYKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvdHRzL3RvYXN0ZXJ1aXRlc3QvdG9hc3Rlcl9hdXRvbWF0aW9uX3Rlc3QucHkKQEAgLTAsMCArMSwxODgzIEBACisjIS91c3IvYmluL3B5dGhvbgorIyBDb3B5cmlnaHQKKworIyBERVNDUklQVElPTgorIyBUaGlzIGlzIHRvYXN0ZXIgYXV0b21hdGlvbiBiYXNlIGNsYXNzIGFuZCB0ZXN0IGNhc2VzIGZpbGUKKworIyBIaXN0b3J5OgorIyAyMDE1LjAzLjA5ICBpbml0YWwgdmVyc2lvbgorIyAyMDE1LjAzLjIzICBhZGRpbmcgdG9hc3Rlcl90ZXN0LmNmZywgcnVuX3RvYXN0ZXJ0ZXN0LnB5IHNvIHdlIGNhbiBydW4gY2FzZSBieSBjYXNlIGZyb20gb3V0c2lkZQorCisjIEJyaWVmczoKKyMgVGhpcyBmaWxlIGlzIGNvbXByaXNlZCBvZiAzIHBhcnRzOgorIyBJOiAgIGNvbW1vbiB1dGlscyBsaWtlIHNvcnRpbmcsIGdldHRpbmcgYXR0cmlidXRlLi4gZXRjCisjIElJOiAgYmFzZSBjbGFzcyBwYXJ0LCB3aGljaCBjb21wbGllcyB3aXRoIHVuaXR0ZXN0IGZyYW1lIHdvcmsgYW5kCisjICAgICAgY29udGFpbnMgY2xhc3Mgc2VsZW5pdW0tYmFzZWQgZnVuY3Rpb25zCisjIElJSTogdGVzdCBjYXNlcworIyAgICAgIHRvIGFkZCBuZXcgY2FzZToganVzdCBpbXBsZW1lbnQgbmV3IHRlc3RfeHh4KCkgZnVuY3Rpb24gaW4gY2xhc3MgdG9hc3Rlcl9jYXNlcworCisjIE5PVEVTIGZvciBjYXNlczoKKyMgY2FzZSA5NDY6CisjIHN0ZXAgNiAtIDggbmVlZHMgdG8gYmUgb2JzZXJ2ZWQgdXNpbmcgc2NyZWVuc2hvdHMKKyMgY2FzZSA5NTY6CisjIHN0ZXAgMiAtIDMgbmVlZHMgdG8gYmUgcnVuIG1hbnVhbGx5CisKK2ltcG9ydCB1bml0dGVzdCwgdGltZSwgcmUsIHN5cywgZ2V0b3B0LCBvcywgbG9nZ2luZywgc3RyaW5nLCBlcnJubywgZXhjZXB0aW9ucworaW1wb3J0IHNodXRpbCwgYXJncGFyc2UsIENvbmZpZ1BhcnNlciwgcGxhdGZvcm0KK2Zyb20gc2VsZW5pdW0gaW1wb3J0IHdlYmRyaXZlcgorZnJvbSBzZWxlbml1bS5jb21tb24uZXhjZXB0aW9ucyBpbXBvcnQgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgorZnJvbSBzZWxlbml1bSBpbXBvcnQgc2VsZW5pdW0KK2Zyb20gc2VsZW5pdW0ud2ViZHJpdmVyLmNvbW1vbi5ieSBpbXBvcnQgQnkKK2Zyb20gc2VsZW5pdW0ud2ViZHJpdmVyLmNvbW1vbi5rZXlzIGltcG9ydCBLZXlzCitmcm9tIHNlbGVuaXVtLndlYmRyaXZlci5zdXBwb3J0LnVpIGltcG9ydCBTZWxlY3QKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjIFBBUlQgSTogdXRpbHMgc3R1ZmYgICAgICAgICAgICAgICAgICAgICAjCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2NsYXNzIExpc3RhdHRyKG9iamVjdCk6CisgICAgIiIiCisgICAgU2V0IG9mIGxpc3QgYXR0cmlidXRlLiBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoYXQgdGhlIGxpc3QgY29udGVudCBpcy4KKyAgICBMYXRlciBvbiB3ZSBtYXkgYWRkIG1vcmUgYXR0cmlidXRlcyBoZXJlLgorICAgICIiIgorICAgIE5VTEwgPSAibnVsbCIKKyAgICBOVU1CRVJTID0gIm51bWJlcnMiCisgICAgU1RSSU5HUyA9ICJzdHJpbmdzIgorICAgIFBFUkNFTlQgPSAicGVyY2VudGFnZSIKKyAgICBTSVpFID0gInNpemUiCisgICAgVU5LTk9XTiA9ICJ1bmtub3duIgorCisKK2RlZiBnZXRfbG9nX3Jvb3RfZGlyKCk6CisgICAgbWF4X2RlcHRoID0gNQorICAgIHBhcmVudF9kaXIgPSAnLi4vJworICAgIGZvciBudW1iZXIgaW4gcmFuZ2UoMCwgbWF4X2RlcHRoKToKKyAgICAgICAgaWYgb3MucGF0aC5pc2RpcihzeXMucGF0aFswXSArIG9zLnNlcCArIChvcy5wYXJkaXIgKyBvcy5zZXApKm51bWJlciArICdsb2cnKToKKyAgICAgICAgICAgIGxvZ19yb290X2RpciA9IG9zLnBhdGguYWJzcGF0aChzeXMucGF0aFswXSArIG9zLnNlcCArIChvcy5wYXJkaXIgKyBvcy5zZXApKm51bWJlciArICdsb2cnKQorICAgICAgICAgICAgYnJlYWsKKworICAgIGlmIG51bWJlciA9PSAobWF4X2RlcHRoIC0gMSk6CisgICAgICAgIHByaW50ICdObyBsb2cgZGlyIGZvdW5kLiBQbGVhc2UgY2hlY2snCisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbgorCisgICAgcmV0dXJuIGxvZ19yb290X2RpcgorCisKK2RlZiBta2Rpcl9wKGRpcik6CisgICAgdHJ5OgorICAgICAgICBvcy5tYWtlZGlycyhkaXIpCisgICAgZXhjZXB0IE9TRXJyb3IgYXMgZXhjOgorICAgICAgICBpZiBleGMuZXJybm8gPT0gZXJybm8uRUVYSVNUIGFuZCBvcy5wYXRoLmlzZGlyKGRpcik6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZQorCisKK2RlZiBnZXRfbGlzdF9hdHRyKHRlc3RsaXN0KToKKyAgICAiIiIKKyAgICBUbyBkZXRlcm1pbmUgdGhlIGxpc3QgY29udGVudAorICAgICIiIgorICAgIGlmIG5vdCB0ZXN0bGlzdDoKKyAgICAgICAgcmV0dXJuIExpc3RhdHRyLk5VTEwKKyAgICBsaXN0dGVzdCA9IHRlc3RsaXN0WzpdCisgICAgdHJ5OgorICAgICAgICBsaXN0dGVzdC5yZW1vdmUoJycpCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBwYXR0ZXJuX3BlcmNlbnQgPSByZS5jb21waWxlKHIiXihbMC05XSkrKFwuKT8oWzAtOV0pKiUkIikKKyAgICBwYXR0ZXJuX3NpemUgPSByZS5jb21waWxlKHIiXihbMC05XSkrKFwuKT8oWzAtOV0pKiggKSooSykqKE0pKihHKSpCJCIpCisgICAgcGF0dGVybl9udW1iZXIgPSByZS5jb21waWxlKHIiXihbMC05XSkrKFwuKT8oWzAtOV0pKiQiKQorICAgIGRlZiBnZXRfcGF0dGVybmVkX251bWJlcihwYXR0ZXJuLCB0bGlzdCk6CisgICAgICAgIGNvdW50ID0gMAorICAgICAgICBmb3IgaXRlbSBpbiB0bGlzdDoKKyAgICAgICAgICAgIGlmIHJlLnNlYXJjaChwYXR0ZXJuLCBpdGVtKToKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxCisgICAgICAgIHJldHVybiBjb3VudAorICAgIGlmIGdldF9wYXR0ZXJuZWRfbnVtYmVyKHBhdHRlcm5fcGVyY2VudCwgbGlzdHRlc3QpID09IGxlbihsaXN0dGVzdCk6CisgICAgICAgIHJldHVybiBMaXN0YXR0ci5QRVJDRU5UCisgICAgZWxpZiBnZXRfcGF0dGVybmVkX251bWJlcihwYXR0ZXJuX3NpemUsIGxpc3R0ZXN0KSA9PSBsZW4obGlzdHRlc3QpOgorICAgICAgICByZXR1cm4gTGlzdGF0dHIuU0laRQorICAgIGVsaWYgZ2V0X3BhdHRlcm5lZF9udW1iZXIocGF0dGVybl9udW1iZXIsIGxpc3R0ZXN0KSA9PSBsZW4obGlzdHRlc3QpOgorICAgICAgICByZXR1cm4gTGlzdGF0dHIuTlVNQkVSUworICAgIGVsc2U6CisgICAgICAgIHJldHVybiBMaXN0YXR0ci5TVFJJTkdTCisKKworZGVmIGlzX2xpc3Rfc2VxdWVuY2VkKHRlc3RsaXN0KToKKyAgICAiIiIKKyAgICBGdW5jdGlvbiB0byB0ZWxsIGlmIGxpc3QgaXMgc2VxdWVuY2VkCisgICAgQ3VycmVudGx5IHdlIG1heSBoYXZlIGxpc3QgbWFkZSB1cCBvZjogU3RyaW5ncyA7IG51bWJlcnMgOyBwZXJjZW50YWdlIDsgdGltZTsgc2l6ZQorICAgIEVhY2ggaGFzIHJlc3BlY3RpdmUgd2F5IHRvIGRldGVybWluZSBpZiBpdCdzIHNlcXVlbmNlZC4KKyAgICAiIiIKKyAgICB0ZXN0X2xpc3QgPSB0ZXN0bGlzdFs6XQorICAgIHRyeToKKyAgICAgICAgdGVzdF9saXN0LnJlbW92ZSgnJykKKyAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgcGFzcworCisgICAgaWYgZ2V0X2xpc3RfYXR0cih0ZXN0bGlzdCkgPT0gTGlzdGF0dHIuTlVMTCA6CisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBlbGlmIGdldF9saXN0X2F0dHIodGVzdGxpc3QpID09IExpc3RhdHRyLlNUUklOR1MgOgorICAgICAgICByZXR1cm4gKHNvcnRlZCh0ZXN0X2xpc3QpID09IHRlc3RfbGlzdCkKKworICAgIGVsaWYgZ2V0X2xpc3RfYXR0cih0ZXN0bGlzdCkgPT0gTGlzdGF0dHIuTlVNQkVSUyA6CisgICAgICAgIGxpc3RfbnVtYmVyID0gW10KKyAgICAgICAgZm9yIGl0ZW0gaW4gdGVzdF9saXN0OgorICAgICAgICAgICAgbGlzdF9udW1iZXIuYXBwZW5kKGV2YWwoaXRlbSkpCisgICAgICAgIHJldHVybiAoc29ydGVkKGxpc3RfbnVtYmVyKSA9PSBsaXN0X251bWJlcikKKworICAgIGVsaWYgZ2V0X2xpc3RfYXR0cih0ZXN0bGlzdCkgPT0gTGlzdGF0dHIuUEVSQ0VOVCA6CisgICAgICAgIGxpc3RfbnVtYmVyID0gW10KKyAgICAgICAgZm9yIGl0ZW0gaW4gdGVzdF9saXN0OgorICAgICAgICAgICAgbGlzdF9udW1iZXIuYXBwZW5kKGV2YWwoaXRlbS5zdHJpcCgnJScpKSkKKyAgICAgICAgcmV0dXJuIChzb3J0ZWQobGlzdF9udW1iZXIpID09IGxpc3RfbnVtYmVyKQorCisgICAgZWxpZiBnZXRfbGlzdF9hdHRyKHRlc3RsaXN0KSA9PSBMaXN0YXR0ci5TSVpFIDoKKyAgICAgICAgbGlzdF9udW1iZXIgPSBbXQorICAgICAgICAjIGN1cnJlbnRseSBTSVpFIGlzIHNwbGl0dGVkIGJ5IHNwYWNlCisgICAgICAgIGZvciBpdGVtIGluIHRlc3RfbGlzdDoKKyAgICAgICAgICAgIGlmIGl0ZW0uc3BsaXQoKVsxXS51cHBlcigpID09ICJLQiI6CisgICAgICAgICAgICAgICAgbGlzdF9udW1iZXIuYXBwZW5kKDEwMjQgKiBldmFsKGl0ZW0uc3BsaXQoKVswXSkpCisgICAgICAgICAgICBlbGlmIGl0ZW0uc3BsaXQoKVsxXS51cHBlcigpID09ICJNQiI6CisgICAgICAgICAgICAgICAgbGlzdF9udW1iZXIuYXBwZW5kKDEwMjQgKiAxMDI0ICogZXZhbChpdGVtLnNwbGl0KClbMF0pKQorICAgICAgICAgICAgZWxpZiBpdGVtLnNwbGl0KClbMV0udXBwZXIoKSA9PSAiR0IiOgorICAgICAgICAgICAgICAgIGxpc3RfbnVtYmVyLmFwcGVuZCgxMDI0ICogMTAyNCAqIDEwMjQgKiBldmFsKGl0ZW0uc3BsaXQoKVswXSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxpc3RfbnVtYmVyLmFwcGVuZChldmFsKGl0ZW0uc3BsaXQoKVswXSkpCisgICAgICAgIHJldHVybiAoc29ydGVkKGxpc3RfbnVtYmVyKSA9PSBsaXN0X251bWJlcikKKworICAgIGVsc2U6CisgICAgICAgIHByaW50ICdVbnJlY29nbml6ZWQgbGlzdCB0eXBlLCBwbGVhc2UgY2hlY2snCisgICAgICAgIHJldHVybiBGYWxzZQorCisKK2RlZiBpc19saXN0X2ludmVydGVkKHRlc3RsaXN0KToKKyAgICAiIiIKKyAgICBGdW5jdGlvbiB0byB0ZWxsIGlmIGxpc3QgaXMgaW52ZXJ0ZWQKKyAgICBDdXJyZW50bHkgd2UgbWF5IGhhdmUgbGlzdCBtYWRlIHVwIG9mOiBTdHJpbmdzIDsgbnVtYmVycyA7IHBlcmNlbnRhZ2UgOyB0aW1lOyBzaXplCisgICAgRWFjaCBoYXMgcmVzcGVjdGl2ZSB3YXkgdG8gZGV0ZXJtaW5lIGlmIGl0J3MgaW52ZXJ0ZWQuCisgICAgIiIiCisgICAgdGVzdF9saXN0ID0gdGVzdGxpc3RbOl0KKyAgICB0cnk6CisgICAgICAgIHRlc3RfbGlzdC5yZW1vdmUoJycpCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHBhc3MKKworICAgIGlmIGdldF9saXN0X2F0dHIodGVzdGxpc3QpID09IExpc3RhdHRyLk5VTEwgOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZWxpZiBnZXRfbGlzdF9hdHRyKHRlc3RsaXN0KSA9PSBMaXN0YXR0ci5TVFJJTkdTIDoKKyAgICAgICAgcmV0dXJuIChzb3J0ZWQodGVzdF9saXN0LCByZXZlcnNlID0gVHJ1ZSkgPT0gdGVzdF9saXN0KQorCisgICAgZWxpZiBnZXRfbGlzdF9hdHRyKHRlc3RsaXN0KSA9PSBMaXN0YXR0ci5OVU1CRVJTIDoKKyAgICAgICAgbGlzdF9udW1iZXIgPSBbXQorICAgICAgICBmb3IgaXRlbSBpbiB0ZXN0X2xpc3Q6CisgICAgICAgICAgICBsaXN0X251bWJlci5hcHBlbmQoZXZhbChpdGVtKSkKKyAgICAgICAgcmV0dXJuIChzb3J0ZWQobGlzdF9udW1iZXIsIHJldmVyc2UgPSBUcnVlKSA9PSBsaXN0X251bWJlcikKKworICAgIGVsaWYgZ2V0X2xpc3RfYXR0cih0ZXN0bGlzdCkgPT0gTGlzdGF0dHIuUEVSQ0VOVCA6CisgICAgICAgIGxpc3RfbnVtYmVyID0gW10KKyAgICAgICAgZm9yIGl0ZW0gaW4gdGVzdF9saXN0OgorICAgICAgICAgICAgbGlzdF9udW1iZXIuYXBwZW5kKGV2YWwoaXRlbS5zdHJpcCgnJScpKSkKKyAgICAgICAgcmV0dXJuIChzb3J0ZWQobGlzdF9udW1iZXIsIHJldmVyc2UgPSBUcnVlKSA9PSBsaXN0X251bWJlcikKKworICAgIGVsaWYgZ2V0X2xpc3RfYXR0cih0ZXN0bGlzdCkgPT0gTGlzdGF0dHIuU0laRSA6CisgICAgICAgIGxpc3RfbnVtYmVyID0gW10KKyAgICAgICAgIyBjdXJyZW50bHkgU0laRSBpcyBzcGxpdHRlZCBieSBzcGFjZS4gc3VjaCBhcyAwIEI7IDEgS0I7IDIgTUIKKyAgICAgICAgZm9yIGl0ZW0gaW4gdGVzdF9saXN0OgorICAgICAgICAgICAgaWYgaXRlbS5zcGxpdCgpWzFdLnVwcGVyKCkgPT0gIktCIjoKKyAgICAgICAgICAgICAgICBsaXN0X251bWJlci5hcHBlbmQoMTAyNCAqIGV2YWwoaXRlbS5zcGxpdCgpWzBdKSkKKyAgICAgICAgICAgIGVsaWYgaXRlbS5zcGxpdCgpWzFdLnVwcGVyKCkgPT0gIk1CIjoKKyAgICAgICAgICAgICAgICBsaXN0X251bWJlci5hcHBlbmQoMTAyNCAqIDEwMjQgKiBldmFsKGl0ZW0uc3BsaXQoKVswXSkpCisgICAgICAgICAgICBlbGlmIGl0ZW0uc3BsaXQoKVsxXS51cHBlcigpID09ICJHQiI6CisgICAgICAgICAgICAgICAgbGlzdF9udW1iZXIuYXBwZW5kKDEwMjQgKiAxMDI0ICogMTAyNCAqIGV2YWwoaXRlbS5zcGxpdCgpWzBdKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbGlzdF9udW1iZXIuYXBwZW5kKGV2YWwoaXRlbS5zcGxpdCgpWzBdKSkKKyAgICAgICAgcmV0dXJuIChzb3J0ZWQobGlzdF9udW1iZXIsIHJldmVyc2UgPSBUcnVlKSA9PSBsaXN0X251bWJlcikKKworICAgIGVsc2U6CisgICAgICAgIHByaW50ICdVbnJlY29nbml6ZWQgbGlzdCB0eXBlLCBwbGVhc2UgY2hlY2snCisgICAgICAgIHJldHVybiBGYWxzZQorCitkZWYgcmVwbGFjZV9maWxlX2NvbnRlbnQoZmlsZW5hbWUsIGl0ZW0sIG9wdGlvbik6CisgICAgZiA9IG9wZW4oZmlsZW5hbWUpCisgICAgbGluZXMgPSBmLnJlYWRsaW5lcygpCisgICAgZi5jbG9zZSgpCisgICAgb3V0cHV0ID0gb3BlbihmaWxlbmFtZSwgJ3cnKQorICAgIGZvciBsaW5lIGluIGxpbmVzOgorICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoaXRlbSk6CisgICAgICAgICAgICBvdXRwdXQud3JpdGUoaXRlbSArICIgPSAnIiArIG9wdGlvbiArICInXG4iKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3V0cHV0LndyaXRlKGxpbmUpCisgICAgb3V0cHV0LmNsb3NlKCkKKworZGVmIGV4dHJhY3RfbnVtYmVyX2Zyb21fc3RyaW5nKHMpOgorICAgICIiIgorICAgIGV4dHJhY3QgdGhlIG51bWJlcnMgaW4gYSBzdHJpbmcuIHJldHVybiB0eXBlIGlzICdsaXN0JworICAgICIiIgorICAgIHJldHVybiByZS5maW5kYWxsKHInKFswLTldKyknLCBzKQorCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyBQQVJUIElJOiBiYXNlIGNsYXNzICAgICAgICAgICAgICAgICAgICAgIworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitjbGFzcyB0b2FzdGVyX2Nhc2VzX2Jhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnNjcmVlbnNob3Rfc2VxdWVuY2UgPSAxCisgICAgICAgIHNlbGYudmVyaWZpY2F0aW9uRXJyb3JzID0gW10KKyAgICAgICAgc2VsZi5hY2NlcHRfbmV4dF9hbGVydCA9IFRydWUKKyAgICAgICAgc2VsZi5ob3N0X29zID0gcGxhdGZvcm0uc3lzdGVtKCkubG93ZXIoKQorICAgICAgICBzZWxmLnBhcnNlciA9IENvbmZpZ1BhcnNlci5TYWZlQ29uZmlnUGFyc2VyKCkKKyAgICAgICAgY29uZmlncyA9IHNlbGYucGFyc2VyLnJlYWQoJ3RvYXN0ZXJfdGVzdC5jZmcnKQorICAgICAgICBzZWxmLmJhc2VfdXJsID0gZXZhbChzZWxmLnBhcnNlci5nZXQoJ3RvYXN0ZXJfdGVzdF8nICsgc2VsZi5ob3N0X29zLCAndG9hc3Rlcl91cmwnKSkKKworICAgICAgICAjIGNyZWF0ZSBsb2cgZGlyIC4gQ3VycmVudGx5ICwgd2UgcHV0IGxvZyBmaWxlcyBpbiBsb2cvdG1wLiBBZnRlciBhbGwKKyAgICAgICAgIyB0ZXN0IGNhc2VzIGFyZSBkb25lLCBtb3ZlIHRoZW0gdG8gbG9nLyRkYXRldGltZSBkaXIKKyAgICAgICAgc2VsZi5sb2dfdG1wX2RpciA9IG9zLnBhdGguYWJzcGF0aChzeXMucGF0aFswXSkgKyBvcy5zZXAgKyAnbG9nJyArIG9zLnNlcCArICd0bXAnCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1rZGlyX3Aoc2VsZi5sb2dfdG1wX2RpcikKKyAgICAgICAgZXhjZXB0IE9TRXJyb3IgOgorICAgICAgICAgICAgbG9nZ2luZy5lcnJvcigiJShhc2N0aW1lKXMgQ2Fubm90IGNyZWF0ZSB0bXAgZGlyIHVuZGVyIGxvZywgcGxlYXNlIGNoZWNrIHlvdXIgcHJpdmlsZWdlIikKKyAgICAgICAgc2VsZi5sb2cgPSBzZWxmLmxvZ2dlcl9jcmVhdGUoKQorICAgICAgICAjIGRyaXZlciBzZXR1cAorICAgICAgICBzZWxmLnNldHVwX2Jyb3dzZXIoKQorCisgICAgZGVmIGxvZ2dlcl9jcmVhdGUoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICB3ZSB1c2Ugcm9vdCBsb2dnZXIgZm9yIGV2ZXJ5IHRlc3RjYXNlLgorICAgICAgICBUaGUgcmVhc29uIHdoeSB3ZSBkb24ndCB1c2UgVE9BU1RFUlhYWF9sb2dnZXIgaXMgdG8gYXZvaWQgc2V0dGluZyByZXNwZWN0aXZlIGxldmVsIGZvcgorICAgICAgICByb290IGxvZ2dlciBhbmQgVE9BU1RFUlhYWF9sb2dnZXIKKyAgICAgICAgVG8gQmUgRGlzY3Vzc2VkCisgICAgICAgICIiIgorICAgICAgICBsb2dfbGV2ZWxfZGljdCA9IHsnQ1JJVElDQUwnOmxvZ2dpbmcuQ1JJVElDQUwsICdFUlJPUic6bG9nZ2luZy5FUlJPUiwgJ1dBUk5JTkcnOmxvZ2dpbmcuV0FSTklORywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAnSU5GTyc6bG9nZ2luZy5JTkZPLCAnREVCVUcnOmxvZ2dpbmcuREVCVUcsICdOT1RTRVQnOmxvZ2dpbmcuTk9UU0VUfQorICAgICAgICBsb2cgPSBsb2dnaW5nLmdldExvZ2dlcigpCisjICAgICAgICBsb2cgPSBsb2dnaW5nLmdldExvZ2dlcignVE9BU1RFUl8nICsgc3RyKHNlbGYuY2FzZV9ubykpCisgICAgICAgIHNlbGYubG9nZ2luZ19sZXZlbCA9IGV2YWwoc2VsZi5wYXJzZXIuZ2V0KCd0b2FzdGVyX3Rlc3RfJyArIHNlbGYuaG9zdF9vcywgJ2xvZ2dpbmdfbGV2ZWwnKSkKKyAgICAgICAga2V5ID0gc2VsZi5sb2dnaW5nX2xldmVsLnVwcGVyKCkKKyAgICAgICAgbG9nLnNldExldmVsKGxvZ19sZXZlbF9kaWN0W2tleV0pCisgICAgICAgIGZoID0gbG9nZ2luZy5GaWxlSGFuZGxlcihmaWxlbmFtZT1zZWxmLmxvZ190bXBfZGlyICsgb3Muc2VwICsgJ2Nhc2VfYWxsJyArICcubG9nJywgbW9kZT0nYScpCisgICAgICAgIGNoID0gbG9nZ2luZy5TdHJlYW1IYW5kbGVyKHN5cy5zdGRvdXQpCisgICAgICAgIGZvcm1hdHRlciA9IGxvZ2dpbmcuRm9ybWF0dGVyKCclKHBhdGhuYW1lKXMgLSAlKGxpbmVubylkIC0gJShhc2N0aW1lKXMgXG4gIFwKKyAgICAgICAgICAgICAlKG5hbWUpcyAtICUobGV2ZWxuYW1lKXMgLSAlKG1lc3NhZ2UpcycpCisgICAgICAgIGZoLnNldEZvcm1hdHRlcihmb3JtYXR0ZXIpCisgICAgICAgIGNoLnNldEZvcm1hdHRlcihmb3JtYXR0ZXIpCisgICAgICAgIGxvZy5hZGRIYW5kbGVyKGZoKQorICAgICAgICBsb2cuYWRkSGFuZGxlcihjaCkKKyAgICAgICAgcmV0dXJuIGxvZworCisKKyAgICBkZWYgc2V0dXBfYnJvd3NlcihzZWxmLCAqYnJvd3Nlcl9wYXRoKToKKyAgICAgICAgc2VsZi5icm93c2VyID0gZXZhbChzZWxmLnBhcnNlci5nZXQoJ3RvYXN0ZXJfdGVzdF8nICsgc2VsZi5ob3N0X29zLCAndGVzdF9icm93c2VyJykpCisgICAgICAgIHByaW50IHNlbGYuYnJvd3NlcgorICAgICAgICBpZiBzZWxmLmJyb3dzZXIgPT0gImZpcmVmb3giOgorICAgICAgICAgICAgZHJpdmVyID0gd2ViZHJpdmVyLkZpcmVmb3goKQorICAgICAgICBlbGlmIHNlbGYuYnJvd3NlciA9PSAiY2hyb21lIjoKKyAgICAgICAgICAgIGRyaXZlciA9IHdlYmRyaXZlci5DaHJvbWUoKQorICAgICAgICBlbGlmIHNlbGYuYnJvd3NlciA9PSAiaWUiOgorICAgICAgICAgICAgZHJpdmVyID0gd2ViZHJpdmVyLkllKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRyaXZlciA9IE5vbmUKKyAgICAgICAgICAgIHByaW50ICJ1bnJlY29nbml6ZWQgYnJvd3NlciB0eXBlLCBwbGVhc2UgY2hlY2siCisgICAgICAgIHNlbGYuZHJpdmVyID0gZHJpdmVyCisgICAgICAgIHNlbGYuZHJpdmVyLmltcGxpY2l0bHlfd2FpdCgzMCkKKyAgICAgICAgcmV0dXJuIHNlbGYuZHJpdmVyCisKKworICAgIGRlZiBzYXZlX3NjcmVlbnNob3Qoc2VsZiwgICoqbG9nX2FyZ3MpOgorICAgICAgICAiIiIKKyAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNhdmUgc2NyZWVuIGVpdGhlciBieSBvcyBpbnRlcmZhY2Ugb3Igc2VsZW5pdW0gaW50ZXJmYWNlLgorICAgICAgICBIb3cgdG8gdXNlOgorICAgICAgICBzZWxmLnNhdmVfc2NyZWVuc2hvdChzY3JlZW5zaG90X3R5cGUgPSAnbmF0aXZlJy8nc2VsZW5pdW0nLCBsb2dfc3ViX2RpciA9ICd4eHgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRfbmFtZSA9ICdzdGVweCcpCisgICAgICAgIHdoZXJlIG5hdGl2ZSBtZWFucyBzY3JlZW5zaG90IGZ1bmMgcHJvdmlkZWQgYnkgT1MsCisgICAgICAgIHNlbGVuaXVtIG1lYW5zIHNjcmVlbnNob3QgZnVuYyBwcm92aWRlZCBieSBzZWxlbml1bSB3ZWJkcml2ZXIKKyAgICAgICAgIiIiCisgICAgICAgIHR5cGVzID0gW2xvZ19hcmdzLmdldCgnc2NyZWVuc2hvdF90eXBlJyldCisgICAgICAgICMgd2hlbiBubyBzY3JlZW5zaG90X3R5cGUgaXMgc3BlY2lmaWVkCisgICAgICAgIGlmIHR5cGVzID09IFtOb25lXToKKyAgICAgICAgICAgIHR5cGVzID0gWyduYXRpdmUnLCAnc2VsZW5pdW0nXQorICAgICAgICAjIG5vcm1hbGx5IGFwcGVuZF9uYW1lIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGljaCBzdGVwLi4KKyAgICAgICAgYWRkX25hbWUgPSBsb2dfYXJncy5nZXQoJ2FwcGVuZF9uYW1lJykKKyAgICAgICAgaWYgbm90IGFkZF9uYW1lOgorICAgICAgICAgICAgYWRkX25hbWUgPSAnLScKKyAgICAgICAgIyBub3JtYWxseSB0aGVyZSdzIG5vIG5lZWQgdG8gc3BlY2lmeSBzdWJfZGlyCisgICAgICAgIHN1Yl9kaXIgPSBsb2dfYXJncy5nZXQoJ2xvZ19zdWJfZGlyJykKKyAgICAgICAgaWYgbm90IHN1Yl9kaXI6CisgICAgICAgICAgICAjIHVzZSBjYXNleHh4IGFzIHN1Yl9kaXIgbmFtZQorICAgICAgICAgICAgc3ViX2RpciA9ICdjYXNlJyArIHN0cihzZWxmLmNhc2Vfbm8pCisgICAgICAgIGZvciBpdGVtIGluIHR5cGVzOgorICAgICAgICAgICAgbG9nX2RpciA9IHNlbGYubG9nX3RtcF9kaXIgKyBvcy5zZXAgKyBzdWJfZGlyCisgICAgICAgICAgICBta2Rpcl9wKGxvZ19kaXIpCisgICAgICAgICAgICBsb2dfcGF0aCA9IGxvZ19kaXIgKyBvcy5zZXAgKyAgc2VsZi5icm93c2VyICsgJy0nICtcCisgICAgICAgICAgICAgICAgICAgIGl0ZW0gKyAnLScgKyBhZGRfbmFtZSArICctJyArIHN0cihzZWxmLnNjcmVlbnNob3Rfc2VxdWVuY2UpICsgJy5wbmcnCisgICAgICAgICAgICBpZiBpdGVtID09ICduYXRpdmUnOgorICAgICAgICAgICAgICAgIG9zLnN5c3RlbSgic2Nyb3QgIiArIGxvZ19wYXRoKQorICAgICAgICAgICAgZWxpZiBpdGVtID09ICdzZWxlbml1bSc6CisgICAgICAgICAgICAgICAgc2VsZi5kcml2ZXIuZ2V0X3NjcmVlbnNob3RfYXNfZmlsZShsb2dfcGF0aCkKKyAgICAgICAgICAgIHNlbGYuc2NyZWVuc2hvdF9zZXF1ZW5jZSArPSAxCisKKyAgICBkZWYgYnJvd3Nlcl9kZWxheShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIGN1cnJlbnRseSB0aGlzIGlzIGEgd29ya2Fyb3VuZCBmb3Igc29tZSBjaHJvbWUgdGVzdC4KKyAgICAgICAgU29tZXRpbWVzIHdlIG5lZWQgYSBkZWxheSB0byBhY2NvbXBsaXNoIHNvbWUgb3BlcmF0aW9uLgorICAgICAgICBCdXQgZm9yIGZpcmVmb3gsIG1vc3RseSB3ZSBkb24ndCBuZWVkIHRoaXMuCisgICAgICAgIFRvIGJlIGRpc2N1c3NlZAorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5icm93c2VyID09ICJjaHJvbWUiOgorICAgICAgICAgICAgdGltZS5zbGVlcCgxKQorICAgICAgICByZXR1cm4KKworCisjIHRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IGNvbnRhaW5lZCBpbiBXZWJEcml2ZXIgY2xhc3MuLgorICAgIGRlZiBmaW5kX2VsZW1lbnRfYnlfdGV4dChzZWxmLCBzdHJpbmcpOgorICAgICAgICByZXR1cm4gc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X3hwYXRoKCIvLypbdGV4dCgpPSciICsgc3RyaW5nICsgIiddIikKKworCisgICAgZGVmIGZpbmRfZWxlbWVudHNfYnlfdGV4dChzZWxmLCBzdHJpbmcpOgorICAgICAgICByZXR1cm4gc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50c19ieV94cGF0aCgiLy8qW3RleHQoKT0nIiArIHN0cmluZyArICInXSIpCisKKworICAgIGRlZiBmaW5kX2VsZW1lbnRfYnlfdGV4dF9pbl90YWJsZShzZWxmLCB0YWJsZV9pZCwgdGV4dF9zdHJpbmcpOgorICAgICAgICAiIiIKKyAgICAgICAgVGhpcyBpcyB1c2VkIHRvIHNlYXJjaCBzb21lIGNlcnRhaW4gJ3RleHQnIGluIGNlcnRhaW4gdGFibGUKKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRhYmxlX2VsZW1lbnQgPSBzZWxmLmdldF90YWJsZV9lbGVtZW50KHRhYmxlX2lkKQorICAgICAgICAgICAgZWxlbWVudCA9IHRhYmxlX2VsZW1lbnQuZmluZF9lbGVtZW50X2J5X3hwYXRoKCIvLypbdGV4dCgpPSciICsgdGV4dF9zdHJpbmcgKyAiJ10iKQorICAgICAgICBleGNlcHQgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgIHByaW50ICdubyBlbGVtZW50IGZvdW5kJworICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgcmV0dXJuIGVsZW1lbnQKKworCisgICAgZGVmIGZpbmRfZWxlbWVudF9ieV9saW5rX3RleHRfaW5fdGFibGUoc2VsZiwgdGFibGVfaWQsIGxpbmtfdGV4dCk6CisgICAgICAgICIiIgorICAgICAgICBBc3N1bWUgdGhlcmUncmUgbXVsdGlwbGUgc3VpdGFibGUgImZpbmRfZWxlbWVudF9ieV9saW5rX3RleHQiLgorICAgICAgICBJbiB0aGlzIGNpcmN1bXN0YW5jZSB3ZSBuZWVkIHRvIHNwZWNpZnkgInRhYmxlIi4KKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRhYmxlX2VsZW1lbnQgPSBzZWxmLmdldF90YWJsZV9lbGVtZW50KHRhYmxlX2lkKQorICAgICAgICAgICAgZWxlbWVudCA9IHRhYmxlX2VsZW1lbnQuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dChsaW5rX3RleHQpCisgICAgICAgIGV4Y2VwdCBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uLCBlOgorICAgICAgICAgICAgcHJpbnQgJ25vIGVsZW1lbnQgZm91bmQnCisgICAgICAgICAgICByYWlzZQorICAgICAgICByZXR1cm4gZWxlbWVudAorCisKKyAgICBkZWYgZmluZF9lbGVtZW50c19ieV9saW5rX3RleHRfaW5fdGFibGUoc2VsZiwgdGFibGVfaWQsIGxpbmtfdGV4dCk6CisgICAgICAgICIiIgorICAgICAgICBTZWFyY2ggbGluay10ZXh0IGluIGNlcnRhaW4gdGFibGUuIFRoaXMgaGVscHMgdG8gbmFycm93IGRvd24gc2VhcmNoIGFyZWEuCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0YWJsZV9lbGVtZW50ID0gc2VsZi5nZXRfdGFibGVfZWxlbWVudCh0YWJsZV9pZCkKKyAgICAgICAgICAgIGVsZW1lbnRfbGlzdCA9IHRhYmxlX2VsZW1lbnQuZmluZF9lbGVtZW50c19ieV9saW5rX3RleHQobGlua190ZXh0KQorICAgICAgICBleGNlcHQgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgIHByaW50ICdubyBlbGVtZW50IGZvdW5kJworICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgcmV0dXJuIGVsZW1lbnRfbGlzdAorCisKKyAgICBkZWYgZmluZF9lbGVtZW50X2J5X3BhcnRpYWxfbGlua190ZXh0X2luX3RhYmxlKHNlbGYsIHRhYmxlX2lkLCBsaW5rX3RleHQpOgorICAgICAgICAiIiIKKyAgICAgICAgU2VhcmNoIGVsZW1lbnQgYnkgcGFydGlhbCBsaW5rIHRleHQgaW4gY2VydGFpbiB0YWJsZS4KKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRhYmxlX2VsZW1lbnQgPSBzZWxmLmdldF90YWJsZV9lbGVtZW50KHRhYmxlX2lkKQorICAgICAgICAgICAgZWxlbWVudCA9IHRhYmxlX2VsZW1lbnQuZmluZF9lbGVtZW50X2J5X3BhcnRpYWxfbGlua190ZXh0KGxpbmtfdGV4dCkKKyAgICAgICAgICAgIHJldHVybiBlbGVtZW50CisgICAgICAgIGV4Y2VwdCBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uLCBlOgorICAgICAgICAgICAgcHJpbnQgJ25vIGVsZW1lbnQgZm91bmQnCisgICAgICAgICAgICByYWlzZQorCisKKyAgICBkZWYgZmluZF9lbGVtZW50c19ieV9wYXJ0aWFsX2xpbmtfdGV4dF9pbl90YWJsZShzZWxmLCB0YWJsZV9pZCwgbGlua190ZXh0KToKKyAgICAgICAgIiIiCisgICAgICAgIEFzc3VtZSB0aGVyZSdyZSBtdWx0aXBsZSBzdWl0YWJsZSAiZmluZF9wYXJ0aWFsX2VsZW1lbnRfYnlfbGlua190ZXh0Ii4KKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRhYmxlX2VsZW1lbnQgPSBzZWxmLmdldF90YWJsZV9lbGVtZW50KHRhYmxlX2lkKQorICAgICAgICAgICAgZWxlbWVudF9saXN0ID0gdGFibGVfZWxlbWVudC5maW5kX2VsZW1lbnRzX2J5X3BhcnRpYWxfbGlua190ZXh0KGxpbmtfdGV4dCkKKyAgICAgICAgICAgIHJldHVybiBlbGVtZW50X2xpc3QKKyAgICAgICAgZXhjZXB0IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24sIGU6CisgICAgICAgICAgICBwcmludCAnbm8gZWxlbWVudCBmb3VuZCcKKyAgICAgICAgICAgIHJhaXNlCisKKworICAgIGRlZiBmaW5kX2VsZW1lbnRfYnlfeHBhdGhfaW5fdGFibGUoc2VsZiwgdGFibGVfaWQsIHhwYXRoKToKKyAgICAgICAgIiIiCisgICAgICAgIFRoaXMgaGVscHMgdG8gbmFycm93IGRvd24gc2VhcmNoIGFyZWEuIEVzcGVjaWFsbHkgdXNlZnVsIHdoZW4gZGVhbGluZyB3aXRoIHBvcC11cCBmb3JtLgorICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGFibGVfZWxlbWVudCA9IHNlbGYuZ2V0X3RhYmxlX2VsZW1lbnQodGFibGVfaWQpCisgICAgICAgICAgICBlbGVtZW50ID0gdGFibGVfZWxlbWVudC5maW5kX2VsZW1lbnRfYnlfeHBhdGgoeHBhdGgpCisgICAgICAgIGV4Y2VwdCBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uLCBlOgorICAgICAgICAgICAgcHJpbnQgJ25vIGVsZW1lbnQgZm91bmQnCisgICAgICAgICAgICByYWlzZQorICAgICAgICByZXR1cm4gZWxlbWVudAorCisKKyAgICBkZWYgZmluZF9lbGVtZW50c19ieV94cGF0aF9pbl90YWJsZShzZWxmLCB0YWJsZV9pZCwgeHBhdGgpOgorICAgICAgICAiIiIKKyAgICAgICAgVGhpcyBoZWxwcyB0byBuYXJyb3cgZG93biBzZWFyY2ggYXJlYS4gRXNwZWNpYWxseSB1c2VmdWwgd2hlbiBkZWFsaW5nIHdpdGggcG9wLXVwIGZvcm0uCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0YWJsZV9lbGVtZW50ID0gc2VsZi5nZXRfdGFibGVfZWxlbWVudCh0YWJsZV9pZCkKKyAgICAgICAgICAgIGVsZW1lbnRfbGlzdCA9IHRhYmxlX2VsZW1lbnQuZmluZF9lbGVtZW50c19ieV94cGF0aCh4cGF0aCkKKyAgICAgICAgZXhjZXB0IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24sIGU6CisgICAgICAgICAgICBwcmludCAnbm8gZWxlbWVudHMgZm91bmQnCisgICAgICAgICAgICByYWlzZQorICAgICAgICByZXR1cm4gZWxlbWVudF9saXN0CisKKworICAgIGRlZiBzaG9ydGVzdF94cGF0aChzZWxmLCBwbmFtZSwgcHZhbHVlKToKKyAgICAgICAgcmV0dXJuICIvLypbQCIgKyBwbmFtZSArICI9JyIgKyBwdmFsdWUgKyAiJ10iCisKKworI3VzdWFsbHkgZWxlbWVudHMgaW4gdGhlIHNhbWUgY29sdW1uIGFyZSB3aXRoIHNhbWUgY2xhc3MgbmFtZS4gZm9yIGluc3RhbmNlOiBjbGFzcz0ib3V0Y29tZSIgLlRCRAorICAgIGRlZiBnZXRfdGFibGVfY29sdW1uX3RleHQoc2VsZiwgYXR0cl9uYW1lLCBhdHRyX3ZhbHVlKToKKyAgICAgICAgY194cGF0aCA9IHNlbGYuc2hvcnRlc3RfeHBhdGgoYXR0cl9uYW1lLCBhdHRyX3ZhbHVlKQorICAgICAgICBlbGVtZW50cyA9IHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudHNfYnlfeHBhdGgoY194cGF0aCkKKyAgICAgICAgY19saXN0ID0gW10KKyAgICAgICAgZm9yIGVsZW1lbnQgaW4gZWxlbWVudHM6CisgICAgICAgICAgICBjX2xpc3QuYXBwZW5kKGVsZW1lbnQudGV4dCkKKyAgICAgICAgcmV0dXJuIGNfbGlzdAorCisKKyAgICBkZWYgZ2V0X3RhYmxlX2NvbHVtbl90ZXh0X2J5X2NvbHVtbl9udW1iZXIoc2VsZiwgdGFibGVfaWQsIGNvbHVtbl9udW1iZXIpOgorICAgICAgICBjX3hwYXRoID0gIi8vKltAaWQ9JyIgKyB0YWJsZV9pZCArICInXS8vdGRbIiArIHN0cihjb2x1bW5fbnVtYmVyKSArICJdIgorICAgICAgICBlbGVtZW50cyA9IHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudHNfYnlfeHBhdGgoY194cGF0aCkKKyAgICAgICAgY19saXN0ID0gW10KKyAgICAgICAgZm9yIGVsZW1lbnQgaW4gZWxlbWVudHM6CisgICAgICAgICAgICBjX2xpc3QuYXBwZW5kKGVsZW1lbnQudGV4dCkKKyAgICAgICAgcmV0dXJuIGNfbGlzdAorCisKKyAgICBkZWYgZ2V0X3RhYmxlX2hlYWRfdGV4dChzZWxmLCAqdGFibGVfaWQpOgorI25vdyB0YWJsZV9pZCBpcyBhIHR1cGxlLi4uCisgICAgICAgIGlmIHRhYmxlX2lkOgorICAgICAgICAgICAgdGhlYWRfeHBhdGggPSAiLy8qW0BpZD0nIiArIHRhYmxlX2lkWzBdICsgIiddLy90aGVhZC8vdGhbdGV4dCgpXSIKKyAgICAgICAgICAgIGVsZW1lbnRzID0gc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50c19ieV94cGF0aCh0aGVhZF94cGF0aCkKKyAgICAgICAgICAgIGNfbGlzdCA9IFtdCisgICAgICAgICAgICBmb3IgZWxlbWVudCBpbiBlbGVtZW50czoKKyAgICAgICAgICAgICAgICBpZiBlbGVtZW50LnRleHQ6CisgICAgICAgICAgICAgICAgICAgIGNfbGlzdC5hcHBlbmQoZWxlbWVudC50ZXh0KQorICAgICAgICAgICAgcmV0dXJuIGNfbGlzdAorI2RlZmF1bHQgdGFibGUgb24gcGFnZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV94cGF0aCgiLy8qL3RhYmxlL3RoZWFkIikudGV4dAorCisKKworICAgIGRlZiBnZXRfdGFibGVfZWxlbWVudChzZWxmLCB0YWJsZV9pZCwgKmNvb3JkaW5hdGUpOgorICAgICAgICBpZiBsZW4oY29vcmRpbmF0ZSkgPT0gMDoKKyNyZXR1cm4gd2hvbGUtdGFibGUgZWxlbWVudAorICAgICAgICAgICAgZWxlbWVudF94cGF0aCA9ICIvLypbQGlkPSciICsgdGFibGVfaWQgKyAiJ10iCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZWxlbWVudCA9IHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV94cGF0aChlbGVtZW50X3hwYXRoKQorICAgICAgICAgICAgZXhjZXB0IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24sIGU6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIHJldHVybiBlbGVtZW50CisgICAgICAgIHJvdyA9IGNvb3JkaW5hdGVbMF0KKworICAgICAgICBpZiBsZW4oY29vcmRpbmF0ZSkgPT0gMToKKyNyZXR1cm4gd2hvbGUtcm93IGVsZW1lbnQKKyAgICAgICAgICAgIGVsZW1lbnRfeHBhdGggPSAiLy8qW0BpZD0nIiArIHRhYmxlX2lkICsgIiddL3Rib2R5L3RyWyIgKyBzdHIocm93KSArICJdIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfeHBhdGgoZWxlbWVudF94cGF0aCkKKyAgICAgICAgICAgIGV4Y2VwdCBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uLCBlOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQKKyNub3cgd2UgYXJlIGxvb2tpbmcgZm9yIGFuIGVsZW1lbnQgd2l0aCBzcGVjaWZpZWQgWCBhbmQgWQorICAgICAgICBjb2x1bW4gPSBjb29yZGluYXRlWzFdCisKKyAgICAgICAgZWxlbWVudF94cGF0aCA9ICIvLypbQGlkPSciICsgdGFibGVfaWQgKyAiJ10vdGJvZHkvdHJbIiArIHN0cihyb3cpICsgIl0vdGRbIiArIHN0cihjb2x1bW4pICsgIl0iCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGVsZW1lbnQgPSBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfeHBhdGgoZWxlbWVudF94cGF0aCkKKyAgICAgICAgZXhjZXB0IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24sIGU6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIGVsZW1lbnQKKworCisgICAgZGVmIGdldF90YWJsZV9kYXRhKHNlbGYsIHRhYmxlX2lkLCByb3dfY291bnQsIGNvbHVtbl9jb3VudCk6CisgICAgICAgIHJvdyA9IDEKKyAgICAgICAgTGlzdHMgPSBbXQorICAgICAgICB3aGlsZSByb3cgPD0gcm93X2NvdW50OgorICAgICAgICAgICAgY29sdW1uID0gMQorICAgICAgICAgICAgcm93X2NvbnRlbnQ9W10KKyAgICAgICAgICAgIHdoaWxlIGNvbHVtbiA8PSBjb2x1bW5fY291bnQ6CisgICAgICAgICAgICAgICAgcz0gIi8vKltAaWQ9JyIgKyB0YWJsZV9pZCArICInXS90Ym9keS90clsiICsgc3RyKHJvdykgKyJdL3RkWyIgKyBzdHIoY29sdW1uKSArICJdIgorICAgICAgICAgICAgICAgIHYgPSBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfeHBhdGgocykudGV4dAorICAgICAgICAgICAgICAgIHJvd19jb250ZW50LmFwcGVuZCh2KQorICAgICAgICAgICAgICAgIGNvbHVtbiA9IGNvbHVtbiArIDEKKyAgICAgICAgICAgICAgICBwcmludCgicm93X2NvbnRlbnQ9Iixyb3dfY29udGVudCkKKyAgICAgICAgICAgIExpc3RzLmV4dGVuZChyb3dfY29udGVudCkKKyAgICAgICAgICAgIHByaW50IExpc3RzW3Jvdy0xXVswXQorICAgICAgICAgICAgcm93ID0gcm93ICsgMQorICAgICAgICByZXR1cm4gTGlzdHMKKworICAgICMgVGhlIGlzX3h4eF9wcmVzZW50IGZ1bmN0aW9ucyBvbmx5IHJldHVybnMgVHJ1ZS9GYWxzZQorICAgICMgQWxsIHRoZSBsb2cgd29yayBpcyBkb25lIGluIHRlc3QgcHJvY2VkdXJlLCBzbyB3ZSBjYW4gZWFzaWx5IHRyYWNlIGJhY2sKKyAgICAjIHVzaW5nIGxvZ2dpbmcKKyAgICBkZWYgaXNfdGV4dF9wcmVzZW50IChzZWxmLCBwYXR0ZXJucyk6CisgICAgICAgIGZvciBwYXR0ZXJuIGluIHBhdHRlcm5zOgorICAgICAgICAgICAgaWYgc3RyKHBhdHRlcm4pIG5vdCBpbiBzZWxmLmRyaXZlci5wYWdlX3NvdXJjZToKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworCisgICAgZGVmIGlzX2VsZW1lbnRfcHJlc2VudChzZWxmLCBob3csIHdoYXQpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnQoaG93LCB3aGF0KQorICAgICAgICBleGNlcHQgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisKKyAgICBkZWYgaXNfYWxlcnRfcHJlc2VudChzZWxmKToKKyAgICAgICAgdHJ5OiBzZWxmLmRyaXZlci5zd2l0Y2hfdG9fYWxlcnQoKQorICAgICAgICBleGNlcHQgTm9BbGVydFByZXNlbnRFeGNlcHRpb24sIGU6IHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisKKyAgICBkZWYgY2xvc2VfYWxlcnRfYW5kX2dldF9pdHNfdGV4dChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYWxlcnQgPSBzZWxmLmRyaXZlci5zd2l0Y2hfdG9fYWxlcnQoKQorICAgICAgICAgICAgYWxlcnRfdGV4dCA9IGFsZXJ0LnRleHQKKyAgICAgICAgICAgIGlmIHNlbGYuYWNjZXB0X25leHRfYWxlcnQ6CisgICAgICAgICAgICAgICAgYWxlcnQuYWNjZXB0KCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYWxlcnQuZGlzbWlzcygpCisgICAgICAgICAgICByZXR1cm4gYWxlcnRfdGV4dAorICAgICAgICBmaW5hbGx5OiBzZWxmLmFjY2VwdF9uZXh0X2FsZXJ0ID0gVHJ1ZQorCisKKyAgICBkZWYgZ2V0X2Nhc2VfbnVtYmVyKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgd2hhdCBjYXNlIGFyZSB3ZSBydW5uaW5nIG5vdworICAgICAgICAiIiIKKyAgICAgICAgZnVuY25hbWUgPSBzeXMuX2dldGZyYW1lKDEpLmZfY29kZS5jb19uYW1lCisgICAgICAgIGNhc2Vub19zdHIgPSBmdW5jbmFtZS5zdHJpcCgndGVzdF8nKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjYXNlbm8gPSBpbnQoY2FzZW5vX3N0cikKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBwcmludCAiZ2V0IGNhc2UgbnVtYmVyIGVycm9yISBwbGVhc2UgY2hlY2sgaWYgZnVuYyBuYW1lIGlzIHRlc3RfeHh4IgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBjYXNlbm8KKworCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmxvZy5pbmZvKCcgRU5EOiBDQVNFICVzIGxvZyBcblxuJyAlIHN0cihzZWxmLmNhc2Vfbm8pKQorICAgICAgICBzZWxmLmRyaXZlci5xdWl0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbXSwgc2VsZi52ZXJpZmljYXRpb25FcnJvcnMpCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyBQQVJUIElJSTogdGVzdCBjYXNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyBwbGVhc2UgcmVmZXIgdG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyBodHRwczovL2J1Z3ppbGxhLnlvY3RvcHJvamVjdC5vcmcvdHJfc2hvd19jYXNlLmNnaT9jYXNlX2lkPXh4eCAgIworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIE5vdGU6IHRvIGNvbXBseSB3aXRoIHRoZSB1bml0dGVzdCBmcmFtZXdvcmssIHdlIGNhbGwgdGhlc2UgdGVzdF94eHggZnVuY3Rpb25zCisjIGZyb20gcnVuX3RvYXN0ZXJjYXNlcy5weSB0byBhdm9pZCBjYWxsaW5nIHNldFVwKCkgYW5kIHRlYXJEb3duKCkgbXVsdGlwbGUgdGltZXMKKworCitjbGFzcyB0b2FzdGVyX2Nhc2VzKHRvYXN0ZXJfY2FzZXNfYmFzZSk6CisgICAgICAgICMjIyMjIyMjIyMjIyMjCisgICAgICAgICMgIENBU0UgOTAxICAjCisgICAgICAgICMjIyMjIyMjIyMjIyMjCisgICAgZGVmIHRlc3RfOTAxKHNlbGYpOgorICAgICAgICAjIHRoZSByZWFzb24gd2h5IGdldF9jYXNlX251bWJlciBpcyBub3QgaW4gc2V0VXAgZnVuY3Rpb24gaXMgdGhhdAorICAgICAgICAjIG90aGVyd2lzZSBpdCByZXR1cm5zICJzZXRVcCIgaW5zdGVhZCBvZiAidGVzdF94eHgiCisgICAgICAgIHNlbGYuY2FzZV9ubyA9IHNlbGYuZ2V0X2Nhc2VfbnVtYmVyKCkKKyAgICAgICAgc2VsZi5sb2cuaW5mbygnIENBU0UgJXMgbG9nOiAnICUgc3RyKHNlbGYuY2FzZV9ubykpCisgICAgICAgIHNlbGYuZHJpdmVyLm1heGltaXplX3dpbmRvdygpCisgICAgICAgIHNlbGYuZHJpdmVyLmdldChzZWxmLmJhc2VfdXJsKQorICAgICAgICAjIG9wZW4gYWxsIGNvbHVtbnMKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJlZGl0LWNvbHVtbnMtYnV0dG9uIikuY2xpY2soKQorICAgICAgICAjIGFkZGluZyBleHBsaWNpdGx5IHdhaXQgZm9yIGNocm9tZWRyaXZlci4uLV8tCisgICAgICAgIHNlbGYuYnJvd3Nlcl9kZWxheSgpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgic3RhcnRlZF9vbiIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5icm93c2VyX2RlbGF5KCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJ0aW1lIikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImVkaXQtY29sdW1ucy1idXR0b24iKS5jbGljaygpCisgICAgICAgICMgZGljdDoge2xpbnQgdGV4dCBuYW1lIDogYWN0dWFsIGNsYXNzIG5hbWV9CisgICAgICAgIHRhYmxlX2hlYWRfZGljdCA9IHsnT3V0Y29tZSc6J291dGNvbWUnLCAnUmVjaXBlJzondGFyZ2V0JywgJ01hY2hpbmUnOidtYWNoaW5lJywgJ1N0YXJ0ZWQgb24nOidzdGFydGVkX29uJywgJ0NvbXBsZXRlZCBvbic6J2NvbXBsZXRlZF9vbicsIFwKKyAgICAgICAgICAgICAgICAnRXJyb3JzJzonZXJyb3JzX25vJywgJ1dhcm5pbmdzJzond2FybmluZ3Nfbm8nLCAnVGltZSc6J3RpbWUnfQorICAgICAgICBmb3Iga2V5IGluIHRhYmxlX2hlYWRfZGljdDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0KGtleSkuY2xpY2soKQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigiJXMgY2Fubm90IGJlIGZvdW5kIG9uIHBhZ2UiICUga2V5KQorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICBjb2x1bW5fbGlzdCA9IHNlbGYuZ2V0X3RhYmxlX2NvbHVtbl90ZXh0KCJjbGFzcyIsIHRhYmxlX2hlYWRfZGljdFtrZXldKQorICAgICAgICAgICAgIyBhZnRlciAxc3QgY2xpY2ssIHRoZSBsaXN0IHNob3VsZCBiZSBlaXRoZXIgc2VxdWVuY2VkIG9yIGludmVydGVkLCBidXQgd2UgZG9uJ3QgaGF2ZSBhICJkZWZhdWx0IG9yZGVyIiBoZXJlCisgICAgICAgICAgICAjIHRoZSBwb2ludCBpcywgYWZ0ZXIgYW5vdGhlciBjbGljaywgaXQgc2hvdWxkIGJlIGFub3RoZXIgb3JkZXIKKyAgICAgICAgICAgIGlmIGlzX2xpc3RfaW52ZXJ0ZWQoY29sdW1uX2xpc3QpOgorICAgICAgICAgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHQoa2V5KS5jbGljaygpCisgICAgICAgICAgICAgICAgY29sdW1uX2xpc3QgPSBzZWxmLmdldF90YWJsZV9jb2x1bW5fdGV4dCgiY2xhc3MiLCB0YWJsZV9oZWFkX2RpY3Rba2V5XSkKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNfbGlzdF9zZXF1ZW5jZWQoY29sdW1uX2xpc3QpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNfbGlzdF9zZXF1ZW5jZWQoY29sdW1uX2xpc3QpKQorICAgICAgICAgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHQoa2V5KS5jbGljaygpCisgICAgICAgICAgICAgICAgY29sdW1uX2xpc3QgPSBzZWxmLmdldF90YWJsZV9jb2x1bW5fdGV4dCgiY2xhc3MiLCB0YWJsZV9oZWFkX2RpY3Rba2V5XSkKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNfbGlzdF9pbnZlcnRlZChjb2x1bW5fbGlzdCkpCisgICAgICAgIHNlbGYubG9nLmluZm8oImNhc2UgcGFzc2VkIikKKworCisgICAgICAgICMjIyMjIyMjIyMjIyMjCisgICAgICAgICMgIENBU0UgOTAyICAjCisgICAgICAgICMjIyMjIyMjIyMjIyMjCisgICAgZGVmIHRlc3RfOTAyKHNlbGYpOgorICAgICAgICBzZWxmLmNhc2Vfbm8gPSBzZWxmLmdldF9jYXNlX251bWJlcigpCisgICAgICAgIHNlbGYubG9nLmluZm8oJyBDQVNFICVzIGxvZzogJyAlIHN0cihzZWxmLmNhc2Vfbm8pKQorICAgICAgICBzZWxmLmRyaXZlci5tYXhpbWl6ZV93aW5kb3coKQorICAgICAgICBzZWxmLmRyaXZlci5nZXQoc2VsZi5iYXNlX3VybCkKKyAgICAgICAgIyBDb3VsZCBhZGQgbW9yZSB0ZXN0IHBhdHRlcm5zIGhlcmUgaW4gdGhlIGZ1dHVyZS4gQWxzbywgY291bGQgc2VhcmNoIHNvbWUgaXRlbXMgb3RoZXIgdGhhbiB0YXJnZXQgY29sdW1uIGluIGZ1dHVyZS4uCisgICAgICAgIHBhdHRlcm5zID0gWyJtaW5pbWFsIiwgInNhdG8iXQorICAgICAgICBmb3IgcGF0dGVybiBpbiBwYXR0ZXJuczoKKyAgICAgICAgICAgIG9yaV90YXJnZXRfY29sdW1uX3RleHRzID0gc2VsZi5nZXRfdGFibGVfY29sdW1uX3RleHQoImNsYXNzIiwgInRhcmdldCIpCisgICAgICAgICAgICBwcmludCBvcmlfdGFyZ2V0X2NvbHVtbl90ZXh0cworICAgICAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJzZWFyY2giKS5jbGVhcigpCisgICAgICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInNlYXJjaCIpLnNlbmRfa2V5cyhwYXR0ZXJuKQorICAgICAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJzZWFyY2gtYnV0dG9uIikuY2xpY2soKQorICAgICAgICAgICAgbmV3X3RhcmdldF9jb2x1bW5fdGV4dHMgPSBzZWxmLmdldF90YWJsZV9jb2x1bW5fdGV4dCgiY2xhc3MiLCAidGFyZ2V0IikKKyAgICAgICAgICAgICMgaWYgbm90aGluZyBmb3VuZCwgd2Ugc3RpbGwgY291bnQgaXQgYXMgInBhc3MiCisgICAgICAgICAgICBpZiBuZXdfdGFyZ2V0X2NvbHVtbl90ZXh0czoKKyAgICAgICAgICAgICAgICBmb3IgdGV4dCBpbiBuZXdfdGFyZ2V0X2NvbHVtbl90ZXh0czoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHRleHQuZmluZChwYXR0ZXJuKSkKKyAgICAgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9jc3Nfc2VsZWN0b3IoImkuaWNvbi1yZW1vdmUiKS5jbGljaygpCisgICAgICAgICAgICB0YXJnZXRfY29sdW1uX3RleHRzID0gc2VsZi5nZXRfdGFibGVfY29sdW1uX3RleHQoImNsYXNzIiwgInRhcmdldCIpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3JpX3RhcmdldF9jb2x1bW5fdGV4dHMgPT0gdGFyZ2V0X2NvbHVtbl90ZXh0cykKKworCisgICAgICAgICMjIyMjIyMjIyMjIyMjCisgICAgICAgICMgIENBU0UgOTAzICAjCisgICAgICAgICMjIyMjIyMjIyMjIyMjCisgICAgZGVmIHRlc3RfOTAzKHNlbGYpOgorICAgICAgICBzZWxmLmNhc2Vfbm8gPSBzZWxmLmdldF9jYXNlX251bWJlcigpCisgICAgICAgIHNlbGYubG9nLmluZm8oJyBDQVNFICVzIGxvZzogJyAlIHN0cihzZWxmLmNhc2Vfbm8pKQorICAgICAgICBzZWxmLmRyaXZlci5tYXhpbWl6ZV93aW5kb3coKQorICAgICAgICBzZWxmLmRyaXZlci5nZXQoc2VsZi5iYXNlX3VybCkKKyAgICAgICAgIyB3aGVuIG9wZW5pbmcgYSBuZXcgcGFnZSwgInN0YXJ0ZWRfb24iIGlzIG5vdCBkaXNwbGF5ZWQgYnkgZGVmYXVsdAorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImVkaXQtY29sdW1ucy1idXR0b24iKS5jbGljaygpCisgICAgICAgICMgY3VycmVudGx5IGFsbCB0aGUgZGVsYXkgYXJlIGZvciBjaHJvbWUgZHJpdmVyIC1fLQorICAgICAgICBzZWxmLmJyb3dzZXJfZGVsYXkoKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInN0YXJ0ZWRfb24iKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgiZWRpdC1jb2x1bW5zLWJ1dHRvbiIpLmNsaWNrKCkKKyAgICAgICAgIyBzdGVwIDQKKyAgICAgICAgaXRlbXMgPSBbIk91dGNvbWUiLCAiQ29tcGxldGVkIG9uIiwgIlN0YXJ0ZWQgb24iLCAiRmFpbGVkIHRhc2tzIiwgIkVycm9ycyIsICJXYXJuaW5ncyJdCisgICAgICAgIGZvciBpdGVtIGluIGl0ZW1zOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRlbXBfZWxlbWVudCA9IHNlbGYuZmluZF9lbGVtZW50X2J5X3RleHRfaW5fdGFibGUoJ290YWJsZScsIGl0ZW0pCisgICAgICAgICAgICAgICAgIyB0aGlzIGlzIGhvdyB3ZSBmaW5kICJmaWx0ZXIgaWNvbiIgaW4gdGhlIHNhbWUgbGV2ZWwgYXMgdGVtcF9lbGVtZW50KHdoZXJlICJhIiBtZWFucyBjbGlja2FibGUsICJpIiBtZWFucyBpY29uKQorICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0ZW1wX2VsZW1lbnQuZmluZF9lbGVtZW50X2J5X3hwYXRoKCIuLi8vKi9hL2lbQGNsYXNzPSdpY29uLWZpbHRlciBmaWx0ZXJlZCddIikpCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uLGU6CisgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIiAlcyBjYW5ub3QgYmUgZm91bmQhICVzIiAlIChpdGVtLCBlKSkKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWxJZihUcnVlKQorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICMgc3RlcCA1LTYKKyAgICAgICAgdGVtcF9lbGVtZW50ID0gc2VsZi5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0X2luX3RhYmxlKCdvdGFibGUnLCAnT3V0Y29tZScpCisgICAgICAgIHRlbXBfZWxlbWVudC5maW5kX2VsZW1lbnRfYnlfeHBhdGgoIi4uLy8qL2EvaVtAY2xhc3M9J2ljb24tZmlsdGVyIGZpbHRlcmVkJ10iKS5jbGljaygpCisgICAgICAgIHNlbGYuYnJvd3Nlcl9kZWxheSgpCisgICAgICAgICMgdGhlIDJuZCBvcHRpb24sIHdoYXRldmVyIGl0IGlzCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV94cGF0aCgiKC8vaW5wdXRbQG5hbWU9J2ZpbHRlciddKVsyXSIpLmNsaWNrKCkKKyAgICAgICAgIyBjbGljayAiQXBwbHkiIGJ1dHRvbgorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfeHBhdGgoIi8vKltAaWQ9J2ZpbHRlcl9vdXRjb21lJ10vLypbdGV4dCgpPSdBcHBseSddIikuY2xpY2soKQorICAgICAgICAjIHNhdmUgc2NyZWVuIGhlcmUKKyAgICAgICAgdGltZS5zbGVlcCgxKQorICAgICAgICBzZWxmLnNhdmVfc2NyZWVuc2hvdChzY3JlZW5zaG90X3R5cGU9J3NlbGVuaXVtJywgYXBwZW5kX25hbWU9J3N0ZXA1JykKKyAgICAgICAgdGVtcF9lbGVtZW50ID0gc2VsZi5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0X2luX3RhYmxlKCdvdGFibGUnLCAnQ29tcGxldGVkIG9uJykKKyAgICAgICAgdGVtcF9lbGVtZW50LmZpbmRfZWxlbWVudF9ieV94cGF0aCgiLi4vLyovYS9pW0BjbGFzcz0naWNvbi1maWx0ZXIgZmlsdGVyZWQnXSIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5icm93c2VyX2RlbGF5KCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X3hwYXRoKCIvLypbQGlkPSdmaWx0ZXJfY29tcGxldGVkX29uJ10vLypbdGV4dCgpPSdBcHBseSddIikuY2xpY2soKQorICAgICAgICAjIHNhdmUgc2NyZWVuIGhlcmUgdG8gY29tcGFyZSB0byBwcmV2aW91cyBvbmUKKyAgICAgICAgIyBwbGVhc2Ugbm90ZSB0aGF0IGZvciBjaHJvbWUgZHJpdmVyLCBuZWVkIGEgbGl0dGxlIGJyZWFrIGJlZm9yZSBzYXZpbmcKKyAgICAgICAgIyBzY3JlZW4gaGVyZSAtXy0KKyAgICAgICAgc2VsZi5icm93c2VyX2RlbGF5KCkKKyAgICAgICAgc2VsZi5zYXZlX3NjcmVlbnNob3Qoc2NyZWVuc2hvdF90eXBlPSdzZWxlbml1bScsIGFwcGVuZF9uYW1lPSdzdGVwNicpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgic2VhcmNoIikuY2xlYXIoKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInNlYXJjaCIpLnNlbmRfa2V5cygiY29yZS1pbWFnZSIpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgic2VhcmNoLWJ1dHRvbiIpLmNsaWNrKCkKKworCisgICAgICAgICMjIyMjIyMjIyMjIyMjCisgICAgICAgICMgIENBU0UgOTA0ICAjCisgICAgICAgICMjIyMjIyMjIyMjIyMjCisgICAgZGVmIHRlc3RfOTA0KHNlbGYpOgorICAgICAgICBzZWxmLmNhc2Vfbm8gPSBzZWxmLmdldF9jYXNlX251bWJlcigpCisgICAgICAgIHNlbGYubG9nLmluZm8oJyBDQVNFICVzIGxvZzogJyAlIHN0cihzZWxmLmNhc2Vfbm8pKQorICAgICAgICBzZWxmLmRyaXZlci5tYXhpbWl6ZV93aW5kb3coKQorICAgICAgICBzZWxmLmRyaXZlci5nZXQoc2VsZi5iYXNlX3VybCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X3BhcnRpYWxfbGlua190ZXh0KCJjb3JlLWltYWdlIikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0KCJUYXNrcyIpLmNsaWNrKCkKKyMgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHQoIkFsbCBidWlsZHMiKS5jbGljaygpCisjICAgICAgICBzZWxmLmRyaXZlci5iYWNrKCkKKyAgICAgICAgc2VsZi50YWJsZV9uYW1lID0gJ290YWJsZScKKyAgICAgICAgIyBUaGlzIGlzIGhvdyB3ZSBmaW5kIHRoZSAiZGVmYXVsdCIgcm93cy1udW1iZXIhCisgICAgICAgIHJvd3NfZGlzcGxheWVkID0gaW50KFNlbGVjdChzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfY3NzX3NlbGVjdG9yKCJzZWxlY3QucGFnZXNpemUiKSkuZmlyc3Rfc2VsZWN0ZWRfb3B0aW9uLnRleHQpCisgICAgICAgIHByaW50IHJvd3NfZGlzcGxheWVkCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzZWxmLmdldF90YWJsZV9lbGVtZW50KHNlbGYudGFibGVfbmFtZSwgcm93c19kaXNwbGF5ZWQpKQorICAgICAgICBzZWxmLmZhaWxJZihzZWxmLmdldF90YWJsZV9lbGVtZW50KHNlbGYudGFibGVfbmFtZSwgcm93c19kaXNwbGF5ZWQgKyAxKSkKKyAgICAgICAgIyBTZWFyY2ggdGV4dCBib3ggYmFja2dyb3VuZCB0ZXh0IGlzICJTZWFyY2ggdGFza3MiCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfeHBhdGgoIi8vKltAaWQ9J3NlYXJjaGZvcm0nXS8qW0BwbGFjZWhvbGRlcj0nU2VhcmNoIHRhc2tzJ10iKSkKKworICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInNlYXJjaCIpLmNsZWFyKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJzZWFyY2giKS5zZW5kX2tleXMoImJ1c3lib3giKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInNlYXJjaC1idXR0b24iKS5jbGljaygpCisgICAgICAgIHNlbGYuYnJvd3Nlcl9kZWxheSgpCisgICAgICAgIHNlbGYuc2F2ZV9zY3JlZW5zaG90KHNjcmVlbnNob3RfdHlwZT0nc2VsZW5pdW0nLCBhcHBlbmRfbmFtZT0nc3RlcDUnKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfY3NzX3NlbGVjdG9yKCJpLmljb24tcmVtb3ZlIikuY2xpY2soKQorICAgICAgICAjIFNhdmUgc2NyZWVuIGhlcmUKKyAgICAgICAgc2VsZi5zYXZlX3NjcmVlbnNob3Qoc2NyZWVuc2hvdF90eXBlPSdzZWxlbml1bScsIGFwcGVuZF9uYW1lPSdzdGVwNV8yJykKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJlZGl0LWNvbHVtbnMtYnV0dG9uIikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImNwdV91c2VkIikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImRpc2tfaW8iKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgidGFza19sb2ciKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgicmVjaXBlX3ZlcnNpb24iKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgidGltZV90YWtlbiIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2Nzc19zZWxlY3RvcigiZWRpdC1jb2x1bW5zLWJ1dHRvbiIpLmNsaWNrKCkKKyAgICAgICAgIyBUaGUgb3BlcmF0aW9uIGlzIHRoZSBzYW1lIGFzIGNhc2U5MDEKKyAgICAgICAgIyBkaWN0OiB7bGludCB0ZXh0IG5hbWUgOiBhY3R1YWwgY2xhc3MgbmFtZX0KKyAgICAgICAgdGFibGVfaGVhZF9kaWN0ID0geydPcmRlcic6J29yZGVyJywgJ1JlY2lwZSc6J3JlY2lwZV9uYW1lJywgJ1Rhc2snOid0YXNrX25hbWUnLCAnRXhlY3V0ZWQnOidleGVjdXRlZCcsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdPdXRjb21lJzonb3V0Y29tZScsICdDYWNoZSBhdHRlbXB0JzonY2FjaGVfYXR0ZW1wdCcsICdUaW1lIChzZWNzKSc6J3RpbWVfdGFrZW4nLCAnQ1BVIHVzYWdlJzonY3B1X3VzZWQnLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnRGlzayBJL08gKG1zKSc6J2Rpc2tfaW8nfQorICAgICAgICBmb3Iga2V5IGluIHRhYmxlX2hlYWRfZGljdDoKKyMgVGhpcyBpcyB0cmlja3kgaGVyZTogd2UgYXJlIGRvaW5nIHNvIGJlY2F1c2UgdGhlcmUgbWF5IGJlIG1vcmUgdGhhbiAxCisjIHNhbWUtbmFtZSBsaW5rX3RleHQgaW4gb25lIHBhZ2UuIFNvIHdlIG9ubHkgZmluZCBlbGVtZW50IGluc2lkZSB0aGUgdGFibGUKKyAgICAgICAgICAgIHNlbGYuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dF9pbl90YWJsZShzZWxmLnRhYmxlX25hbWUsIGtleSkuY2xpY2soKQorICAgICAgICAgICAgY29sdW1uX2xpc3QgPSBzZWxmLmdldF90YWJsZV9jb2x1bW5fdGV4dCgiY2xhc3MiLCB0YWJsZV9oZWFkX2RpY3Rba2V5XSkKKyMgYWZ0ZXIgMXN0IGNsaWNrLCB0aGUgbGlzdCBzaG91bGQgYmUgZWl0aGVyIHNlcXVlbmNlZCBvciBpbnZlcnRlZCwgYnV0IHdlIGRvbid0IGhhdmUgYSAiZGVmYXVsdCBvcmRlciIgaGVyZQorIyB0aGUgcG9pbnQgaXMsIGFmdGVyIGFub3RoZXIgY2xpY2ssIGl0IHNob3VsZCBiZSBhbm90aGVyIG9yZGVyCisjIHRoZSBmaXN0IGNhc2UgaXMgc3BlY2lhbDp0aGlzIG1lYW5zIGV2ZXJ5IGl0ZW0gaW4gY29sdW1uX2xpc3QgaXMgdGhlIHNhbWUsIHNvCisjIGFmdGVyIG9uZSBjbGljaywgZWl0aGVyIHNlcXVlbmNlZCBvciBpbnZlcnRlZCB3aWxsIGJlIGZpbmUKKyAgICAgICAgICAgIGlmIChpc19saXN0X2ludmVydGVkKGNvbHVtbl9saXN0KSBhbmQgaXNfbGlzdF9zZXF1ZW5jZWQoY29sdW1uX2xpc3QpKSBcCisgICAgICAgICAgICAgICAgb3IgKG5vdCBjb2x1bW5fbGlzdCkgOgorICAgICAgICAgICAgICAgIHNlbGYuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dF9pbl90YWJsZShzZWxmLnRhYmxlX25hbWUsIGtleSkuY2xpY2soKQorICAgICAgICAgICAgICAgIGNvbHVtbl9saXN0ID0gc2VsZi5nZXRfdGFibGVfY29sdW1uX3RleHQoImNsYXNzIiwgdGFibGVfaGVhZF9kaWN0W2tleV0pCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzX2xpc3Rfc2VxdWVuY2VkKGNvbHVtbl9saXN0KSBvciBpc19saXN0X2ludmVydGVkKGNvbHVtbl9saXN0KSkKKyAgICAgICAgICAgIGVsaWYgaXNfbGlzdF9pbnZlcnRlZChjb2x1bW5fbGlzdCk6CisgICAgICAgICAgICAgICAgc2VsZi5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0X2luX3RhYmxlKHNlbGYudGFibGVfbmFtZSwga2V5KS5jbGljaygpCisgICAgICAgICAgICAgICAgY29sdW1uX2xpc3QgPSBzZWxmLmdldF90YWJsZV9jb2x1bW5fdGV4dCgiY2xhc3MiLCB0YWJsZV9oZWFkX2RpY3Rba2V5XSkKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNfbGlzdF9zZXF1ZW5jZWQoY29sdW1uX2xpc3QpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNfbGlzdF9zZXF1ZW5jZWQoY29sdW1uX2xpc3QpKQorICAgICAgICAgICAgICAgIHNlbGYuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dF9pbl90YWJsZShzZWxmLnRhYmxlX25hbWUsIGtleSkuY2xpY2soKQorICAgICAgICAgICAgICAgIGNvbHVtbl9saXN0ID0gc2VsZi5nZXRfdGFibGVfY29sdW1uX3RleHQoImNsYXNzIiwgdGFibGVfaGVhZF9kaWN0W2tleV0pCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzX2xpc3RfaW52ZXJ0ZWQoY29sdW1uX2xpc3QpKQorIyBzdGVwIDgtMTAKKyAgICAgICAgIyBmaWx0ZXIgZGljdDoge2xpbmsgdGV4dCBuYW1lIDogZmlsdGVyIHRhYmxlIG5hbWUgaW4geHBhdGh9CisgICAgICAgIGZpbHRlcl9kaWN0ID0geydFeGVjdXRlZCc6J2ZpbHRlcl9leGVjdXRlZCcsICdPdXRjb21lJzonZmlsdGVyX291dGNvbWUnLCAnQ2FjaGUgYXR0ZW1wdCc6J2ZpbHRlcl9jYWNoZV9hdHRlbXB0J30KKyAgICAgICAgZm9yIGtleSBpbiBmaWx0ZXJfZGljdDoKKyAgICAgICAgICAgIHRlbXBfZWxlbWVudCA9IHNlbGYuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dF9pbl90YWJsZShzZWxmLnRhYmxlX25hbWUsIGtleSkKKyAgICAgICAgICAgICMgZmluZCB0aGUgZmlsdGVyIGljb24gYmVzaWRlcyBpdC4KKyAgICAgICAgICAgICMgQW5kIGhlcmUgd2UgbXVzdCBoYXZlIGJyZWFrICgxIHNlYykgdG8gZ2V0IHRoZSBwb3B1cCBzdHVmZgorICAgICAgICAgICAgdGVtcF9lbGVtZW50LmZpbmRfZWxlbWVudF9ieV94cGF0aCgiLi4vLypbQGNsYXNzPSdpY29uLWZpbHRlciBmaWx0ZXJlZCddIikuY2xpY2soKQorICAgICAgICAgICAgc2VsZi5icm93c2VyX2RlbGF5KCkKKyAgICAgICAgICAgIGF2YWlsX29wdGlvbnMgPSBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRzX2J5X3hwYXRoKCIvLypbQGlkPSciICsgZmlsdGVyX2RpY3Rba2V5XSArICInXS8vKltAbmFtZT0nZmlsdGVyJ11bbm90KEBkaXNhYmxlZCldIikKKyAgICAgICAgICAgIGZvciBudW1iZXIgaW4gcmFuZ2UoMCwgbGVuKGF2YWlsX29wdGlvbnMpKToKKyAgICAgICAgICAgICAgICBhdmFpbF9vcHRpb25zW251bWJlcl0uY2xpY2soKQorICAgICAgICAgICAgICAgIHNlbGYuYnJvd3Nlcl9kZWxheSgpCisgICAgICAgICAgICAgICAgIyBjbGljayAiQXBwbHkiCisgICAgICAgICAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X3hwYXRoKCIvLypbQGlkPSciICsgZmlsdGVyX2RpY3Rba2V5XSAgKyAiJ10vLypbQHR5cGU9J3N1Ym1pdCddIikuY2xpY2soKQorICAgICAgICAgICAgICAgICMgaW5zZXJ0IHNjcmVlbiBjYXB0dXJlIGhlcmUKKyAgICAgICAgICAgICAgICBzZWxmLmJyb3dzZXJfZGVsYXkoKQorICAgICAgICAgICAgICAgIHNlbGYuc2F2ZV9zY3JlZW5zaG90KHNjcmVlbnNob3RfdHlwZT0nc2VsZW5pdW0nLCBhcHBlbmRfbmFtZT0nc3RlcDgnKQorICAgICAgICAgICAgICAgICMgYWZ0ZXIgdGhlIGxhc3Qgb3B0aW9uIHdhcyBjbGlja2VkLCB3ZSBkb24ndCBuZWVkIG9wZXJhdGlvbiBiZWxvdyBhbnltb3JlCisgICAgICAgICAgICAgICAgaWYgbnVtYmVyIDwgbGVuKGF2YWlsX29wdGlvbnMpLTE6CisgICAgICAgICAgICAgICAgICAgICB0ZW1wX2VsZW1lbnQgPSBzZWxmLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHRfaW5fdGFibGUoc2VsZi50YWJsZV9uYW1lLCBrZXkpCisgICAgICAgICAgICAgICAgICAgICB0ZW1wX2VsZW1lbnQuZmluZF9lbGVtZW50X2J5X3hwYXRoKCIuLi8vKltAY2xhc3M9J2ljb24tZmlsdGVyIGZpbHRlcmVkJ10iKS5jbGljaygpCisgICAgICAgICAgICAgICAgICAgICBhdmFpbF9vcHRpb25zID0gc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50c19ieV94cGF0aCgiLy8qW0BpZD0nIiArIGZpbHRlcl9kaWN0W2tleV0gKyAiJ10vLypbQG5hbWU9J2ZpbHRlciddW25vdChAZGlzYWJsZWQpXSIpCisgICAgICAgICAgICAgICAgICAgICBzZWxmLmJyb3dzZXJfZGVsYXkoKQorIyBzdGVwIDExCisgICAgICAgIGZvciBpdGVtIGluIFsnb3JkZXInLCAndGFza19uYW1lJywgJ2V4ZWN1dGVkJywgJ291dGNvbWUnLCAncmVjaXBlX25hbWUnLCAncmVjaXBlX3ZlcnNpb24nXToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmZpbmRfZWxlbWVudF9ieV94cGF0aF9pbl90YWJsZShzZWxmLnRhYmxlX25hbWUsICIuL3Rib2R5L3RyWzFdLypbQGNsYXNzPSciICsgaXRlbSArICInXS9hIikuY2xpY2soKQorICAgICAgICAgICAgZXhjZXB0IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24sIGU6CisgICAgICAgICAgICAjIGxldCBpdCBnby4uLgorICAgICAgICAgICAgICAgIHByaW50ICdubyBpdGVtIGluIHRoZSBjb2x1bScgKyBpdGVtCisgICAgICAgICAgICAjIGluc2VydCBzY3JlZW4gc2hvdCBoZXJlCisgICAgICAgICAgICBzZWxmLnNhdmVfc2NyZWVuc2hvdChzY3JlZW5zaG90X3R5cGU9J3NlbGVuaXVtJywgYXBwZW5kX25hbWU9J3N0ZXAxMScpCisgICAgICAgICAgICBzZWxmLmRyaXZlci5iYWNrKCkKKyMgc3RlcCAxMi0xNAorICAgICAgICAjIGFib3V0IHRlc3RfZGljdDogcGxlYXNlIHJlZmVyIHRvIHRlc3RjYXNlIDkwNCByZXF1aXJlbWVudCBzdGVwIDEyLTE0CisgICAgICAgIHRlc3RfZGljdCA9IHsKKyAgICAgICAgICAgICdUaW1lJzp7CisgICAgICAgICAgICAgICAgJ2NsYXNzJzondGltZV90YWtlbicsCisgICAgICAgICAgICAgICAgJ2NoZWNrX2hlYWRfbGlzdCc6WydSZWNpcGUnLCAnVGFzaycsICdFeGVjdXRlZCcsICdPdXRjb21lJywgJ1RpbWUgKHNlY3MpJ10sCisgICAgICAgICAgICAgICAgJ2NoZWNrX2NvbHVtbl9saXN0JzpbJ2NwdV91c2VkJywgJ2NhY2hlX2F0dGVtcHQnLCAnZGlza19pbycsICdvcmRlcicsICdyZWNpcGVfdmVyc2lvbiddCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgJ0NQVSB1c2FnZSc6eworICAgICAgICAgICAgICAgICdjbGFzcyc6J2NwdV91c2VkJywKKyAgICAgICAgICAgICAgICAnY2hlY2tfaGVhZF9saXN0JzpbJ1JlY2lwZScsICdUYXNrJywgJ0V4ZWN1dGVkJywgJ091dGNvbWUnLCAnQ1BVIHVzYWdlJ10sCisgICAgICAgICAgICAgICAgJ2NoZWNrX2NvbHVtbl9saXN0JzpbJ2NhY2hlX2F0dGVtcHQnLCAnZGlza19pbycsICdvcmRlcicsICdyZWNpcGVfdmVyc2lvbicsICd0aW1lX3Rha2VuJ10KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAnRGlzayBJL08nOnsKKyAgICAgICAgICAgICAgICAnY2xhc3MnOidkaXNrX2lvJywKKyAgICAgICAgICAgICAgICAnY2hlY2tfaGVhZF9saXN0JzpbJ1JlY2lwZScsICdUYXNrJywgJ0V4ZWN1dGVkJywgJ091dGNvbWUnLCAnRGlzayBJL08gKG1zKSddLAorICAgICAgICAgICAgICAgICdjaGVja19jb2x1bW5fbGlzdCc6WydjcHVfdXNlZCcsICdjYWNoZV9hdHRlbXB0JywgJ29yZGVyJywgJ3JlY2lwZV92ZXJzaW9uJywgJ3RpbWVfdGFrZW4nXQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciBrZXkgaW4gdGVzdF9kaWN0OgorICAgICAgICAgICAgc2VsZi5maW5kX2VsZW1lbnRfYnlfcGFydGlhbF9saW5rX3RleHRfaW5fdGFibGUoJ25hdicsICdjb3JlLWltYWdlJykuY2xpY2soKQorICAgICAgICAgICAgc2VsZi5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0X2luX3RhYmxlKCduYXYnLCBrZXkpLmNsaWNrKCkKKyAgICAgICAgICAgIGhlYWRfbGlzdCA9IHNlbGYuZ2V0X3RhYmxlX2hlYWRfdGV4dCgnb3RhYmxlJykKKyAgICAgICAgICAgIGZvciBpdGVtIGluIHRlc3RfZGljdFtrZXldWydjaGVja19oZWFkX2xpc3QnXToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXRlbSBpbiBoZWFkX2xpc3QpCisgICAgICAgICAgICBjb2x1bW5fbGlzdCA9IHNlbGYuZ2V0X3RhYmxlX2NvbHVtbl90ZXh0KCdjbGFzcycsIHRlc3RfZGljdFtrZXldWydjbGFzcyddKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzX2xpc3RfaW52ZXJ0ZWQoY29sdW1uX2xpc3QpKQorCisgICAgICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImVkaXQtY29sdW1ucy1idXR0b24iKS5jbGljaygpCisgICAgICAgICAgICBmb3IgaXRlbTIgaW4gdGVzdF9kaWN0W2tleV1bJ2NoZWNrX2NvbHVtbl9saXN0J106CisgICAgICAgICAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKGl0ZW0yKS5jbGljaygpCisgICAgICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImVkaXQtY29sdW1ucy1idXR0b24iKS5jbGljaygpCisgICAgICAgICAgICAjIFRCRDogc2F2ZSBzY3JlZW4gaGVyZQorCisKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgIyAgQ0FTRSA5MDYgICMKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMKKyAgICBkZWYgdGVzdF85MDYoc2VsZik6CisgICAgICAgIHNlbGYuY2FzZV9ubyA9IHNlbGYuZ2V0X2Nhc2VfbnVtYmVyKCkKKyAgICAgICAgc2VsZi5sb2cuaW5mbygnIENBU0UgJXMgbG9nOiAnICUgc3RyKHNlbGYuY2FzZV9ubykpCisgICAgICAgIHNlbGYuZHJpdmVyLm1heGltaXplX3dpbmRvdygpCisgICAgICAgIHNlbGYuZHJpdmVyLmdldChzZWxmLmJhc2VfdXJsKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0KCJjb3JlLWltYWdlLW1pbmltYWwiKS5jbGljaygpCisgICAgICAgIHNlbGYuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dF9pbl90YWJsZSgnbmF2JywgJ1BhY2thZ2VzJykuY2xpY2soKQorICAgICAgICAjIGZpbmQgImJhc2giIGluIGZpcnN0IGNvbHVtbiAoUGFja2FnZXMpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV94cGF0aCgiLy8qW0BpZD0nb3RhYmxlJ10vL3RkWzFdLy8qW3RleHQoKT0nYmFzaCddIikuY2xpY2soKQorICAgICAgICAjIHNhdmUgc2NlZW4gaGVyZSB0byBvYnNlcnZlLi4uCisjIHN0ZXAgNgorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfcGFydGlhbF9saW5rX3RleHQoIkdlbmVyYXRlZCBmaWxlcyIpLmNsaWNrKCkKKyAgICAgICAgaGVhZF9saXN0ID0gc2VsZi5nZXRfdGFibGVfaGVhZF90ZXh0KCdvdGFibGUnKQorICAgICAgICBmb3IgaXRlbSBpbiBbJ0ZpbGUnLCAnU2l6ZSddOgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGl0ZW0gaW4gaGVhZF9saXN0KQorICAgICAgICBjX2xpc3QgPSBzZWxmLmdldF90YWJsZV9jb2x1bW5fdGV4dCgnY2xhc3MnLCAncGF0aCcpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc19saXN0X3NlcXVlbmNlZChjX2xpc3QpKQorIyBzdGVwIDcKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X3BhcnRpYWxfbGlua190ZXh0KCJSdW50aW1lIGRlcGVuZGVuY2llcyIpLmNsaWNrKCkKKyAgICAgICAgIyBzYXZlIHNjZWVuIGhlcmUgdG8gb2JzZXJ2ZS4uLgorICAgICAgICAjIG5vdGUgdGhhdCBoZXJlIHRhYmxlIG5hbWUgaXMgbm90ICdvdGFibGUnCisgICAgICAgIGhlYWRfbGlzdCA9IHNlbGYuZ2V0X3RhYmxlX2hlYWRfdGV4dCgnZGVwZW5kZW5jaWVzJykKKyAgICAgICAgZm9yIGl0ZW0gaW4gWydQYWNrYWdlJywgJ1ZlcnNpb24nLCAnU2l6ZSddOgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGl0ZW0gaW4gaGVhZF9saXN0KQorICAgICAgICBjX2xpc3QgPSBzZWxmLmdldF90YWJsZV9jb2x1bW5fdGV4dF9ieV9jb2x1bW5fbnVtYmVyKCdkZXBlbmRlbmNpZXMnLCAxKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNfbGlzdF9zZXF1ZW5jZWQoY19saXN0KSkKKyAgICAgICAgdGV4dHMgPSBbJ1NpemUnLCAnTGljZW5zZScsICdSZWNpcGUnLCAnUmVjaXBlIHZlcnNpb24nLCAnTGF5ZXInLCBcCisgICAgICAgICAgICAgICAgICAgICAnTGF5ZXIgYnJhbmNoJywgJ0xheWVyIGNvbW1pdCcsICdMYXllciBkaXJlY3RvcnknXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc2VsZi5pc190ZXh0X3ByZXNlbnQodGV4dHMpKQorCisKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgIyAgQ0FTRSA5MTAgICMKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMKKyAgICBkZWYgdGVzdF85MTAoc2VsZik6CisgICAgICAgIHNlbGYuY2FzZV9ubyA9IHNlbGYuZ2V0X2Nhc2VfbnVtYmVyKCkKKyAgICAgICAgc2VsZi5sb2cuaW5mbygnIENBU0UgJXMgbG9nOiAnICUgc3RyKHNlbGYuY2FzZV9ubykpCisgICAgICAgIGltYWdlX3R5cGU9ImNvcmUtaW1hZ2UtbWluaW1hbCIKKyAgICAgICAgdGVzdF9wYWNrYWdlMT0iYnVzeWJveCIKKyAgICAgICAgdGVzdF9wYWNrYWdlMj0ibGliIgorICAgICAgICBzZWxmLmRyaXZlci5tYXhpbWl6ZV93aW5kb3coKQorICAgICAgICBzZWxmLmRyaXZlci5nZXQoc2VsZi5iYXNlX3VybCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dChpbWFnZV90eXBlKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHQoIlJlY2lwZXMiKS5jbGljaygpCisgICAgICAgIHNlbGYuc2F2ZV9zY3JlZW5zaG90KHNjcmVlbnNob3RfdHlwZT0nc2VsZW5pdW0nLCBhcHBlbmRfbmFtZT0nc3RlcDMnKQorCisgICAgICAgIHNlbGYudGFibGVfbmFtZSA9ICdvdGFibGUnCisgICAgICAgICMgVGhpcyBpcyBob3cgd2UgZmluZCB0aGUgImRlZmF1bHQiIHJvd3MtbnVtYmVyIQorICAgICAgICByb3dzX2Rpc3BsYXllZCA9IGludChTZWxlY3Qoc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2Nzc19zZWxlY3Rvcigic2VsZWN0LnBhZ2VzaXplIikpLmZpcnN0X3NlbGVjdGVkX29wdGlvbi50ZXh0KQorICAgICAgICBwcmludCByb3dzX2Rpc3BsYXllZAorICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc2VsZi5nZXRfdGFibGVfZWxlbWVudChzZWxmLnRhYmxlX25hbWUsIHJvd3NfZGlzcGxheWVkKSkKKyAgICAgICAgc2VsZi5mYWlsSWYoc2VsZi5nZXRfdGFibGVfZWxlbWVudChzZWxmLnRhYmxlX25hbWUsIHJvd3NfZGlzcGxheWVkICsgMSkpCisKKyAgICAgICAgIyBDaGVjayB0aGUgZGVmYXVsdCB0YWJsZSBpcyBzb3J0ZWQgYnkgUmVjaXBlCisgICAgICAgIHRhc2tzX2NvbHVtbl9jb3VudCA9IGxlbihzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRzX2J5X3hwYXRoKCIvaHRtbC9ib2R5L2RpdlsyXS9kaXYvZGl2WzJdL2RpdlsyXS90YWJsZS90Ym9keS90ci90ZFsxXSIpKQorICAgICAgICBwcmludCB0YXNrc19jb2x1bW5fY291bnQKKyAgICAgICAgZGVmYXVsdF9jb2x1bW5fbGlzdCA9IHNlbGYuZ2V0X3RhYmxlX2NvbHVtbl90ZXh0X2J5X2NvbHVtbl9udW1iZXIoc2VsZi50YWJsZV9uYW1lLCAxKQorICAgICAgICAjcHJpbnQgZGVmYXVsdF9jb2x1bW5fbGlzdAorCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc19saXN0X3NlcXVlbmNlZChkZWZhdWx0X2NvbHVtbl9saXN0KSkKKworICAgICAgICAjIFNlYXJjaCB0ZXh0IGJveCBiYWNrZ3JvdW5kIHRleHQgaXMgIlNlYXJjaCByZWNpcGVzIgorICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X3hwYXRoKCIvLypbQGlkPSdzZWFyY2hmb3JtJ10vKltAcGxhY2Vob2xkZXI9J1NlYXJjaCByZWNpcGVzJ10iKSkKKworICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInNlYXJjaCIpLmNsZWFyKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJzZWFyY2giKS5zZW5kX2tleXModGVzdF9wYWNrYWdlMSkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJzZWFyY2gtYnV0dG9uIikuY2xpY2soKQorICAgICAgICAjIFNhdmUgc2NyZWVuIGhlcmUKKyAgICAgICAgc2VsZi5zYXZlX3NjcmVlbnNob3Qoc2NyZWVuc2hvdF90eXBlPSdzZWxlbml1bScsIGFwcGVuZF9uYW1lPSdzdGVwNCcpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9jc3Nfc2VsZWN0b3IoImkuaWNvbi1yZW1vdmUiKS5jbGljaygpCisgICAgICAgIHNlbGYuc2F2ZV9zY3JlZW5zaG90KHNjcmVlbnNob3RfdHlwZT0nc2VsZW5pdW0nLCBhcHBlbmRfbmFtZT0nc3RlcDRfMicpCisKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJlZGl0LWNvbHVtbnMtYnV0dG9uIikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImRlcGVuZHNfb24iKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgibGF5ZXJfdmVyc2lvbl9fYnJhbmNoIikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImxheWVyX3ZlcnNpb25fX2xheWVyX19jb21taXQiKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgiZGVwZW5kc19ieSIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJlZGl0LWNvbHVtbnMtYnV0dG9uIikuY2xpY2soKQorCisgICAgICAgIHNlbGYuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dF9pbl90YWJsZShzZWxmLnRhYmxlX25hbWUsICdSZWNpcGUnKS5jbGljaygpCisgICAgICAgICMgQ2hlY2sgdGhlIGludmVydGVkIHRhYmxlIGJ5IFJlY2lwZQorICAgICAgICAjIFJlY2lwZSBkb2Vzbid0IGhhdmUgY2xhc3MgbmFtZQorICAgICAgICAjaW52ZXJ0ZWRfdGFza3NfY29sdW1uX2NvdW50ID0gbGVuKHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudHNfYnlfeHBhdGgoIi9odG1sL2JvZHkvZGl2WzJdL2Rpdi9kaXZbMl0vZGl2WzJdL3RhYmxlL3Rib2R5L3RyL3RkWzFdIikpCisgICAgICAgICNwcmludCBpbnZlcnRlZF90YXNrc19jb2x1bW5fY291bnQKKyAgICAgICAgI2ludmVydGVkX2NvbHVtbl9saXN0ID0gc2VsZi5nZXRfdGFibGVfY29sdW1uX3RleHRfYnlfY29sdW1uX251bWJlcihzZWxmLnRhYmxlX25hbWUsIDEpCisgICAgICAgICNwcmludCBpbnZlcnRlZF9jb2x1bW5fbGlzdAorCisgICAgICAgICNzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfcGFydGlhbF9saW5rX3RleHQoInpsaWIiKS5jbGljaygpCisgICAgICAgICNzZWxmLmRyaXZlci5iYWNrKCkKKyAgICAgICAgI3NlbGYuZmFpbFVubGVzcyhpc19saXN0X2ludmVydGVkKGludmVydGVkX2NvbHVtbl9saXN0KSkKKyAgICAgICAgI3NlbGYuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dF9pbl90YWJsZShzZWxmLnRhYmxlX25hbWUsICdSZWNpcGUnKS5jbGljaygpCisKKyAgICAgICAgdGFibGVfaGVhZF9kaWN0ID0geydSZWNpcGUnOidyZWNpcGVfX25hbWUnLCAnUmVjaXBlIGZpbGUnOidyZWNpcGVfZmlsZScsICdTZWN0aW9uJzoncmVjaXBlX3NlY3Rpb24nLCBcCisgICAgICAgICAgICAgICAgJ0xpY2Vuc2UnOidyZWNpcGVfbGljZW5zZScsICdMYXllcic6J2xheWVyX3ZlcnNpb25fX2xheWVyX19uYW1lJywgXAorICAgICAgICAgICAgICAgICdMYXllciBicmFuY2gnOidsYXllcl92ZXJzaW9uX19icmFuY2gnfQorICAgICAgICBmb3Iga2V5IGluIHRhYmxlX2hlYWRfZGljdDoKKyAgICAgICAgICAgIHNlbGYuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dF9pbl90YWJsZShzZWxmLnRhYmxlX25hbWUsIGtleSkuY2xpY2soKQorICAgICAgICAgICAgY29sdW1uX2xpc3QgPSBzZWxmLmdldF90YWJsZV9jb2x1bW5fdGV4dCgiY2xhc3MiLCB0YWJsZV9oZWFkX2RpY3Rba2V5XSkKKyAgICAgICAgICAgIGlmIChpc19saXN0X2ludmVydGVkKGNvbHVtbl9saXN0KSBhbmQgaXNfbGlzdF9zZXF1ZW5jZWQoY29sdW1uX2xpc3QpKSBcCisgICAgICAgICAgICAgICAgICAgIG9yIChub3QgY29sdW1uX2xpc3QpIDoKKyAgICAgICAgICAgICAgICBzZWxmLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHRfaW5fdGFibGUoc2VsZi50YWJsZV9uYW1lLCBrZXkpLmNsaWNrKCkKKyAgICAgICAgICAgICAgICBjb2x1bW5fbGlzdCA9IHNlbGYuZ2V0X3RhYmxlX2NvbHVtbl90ZXh0KCJjbGFzcyIsIHRhYmxlX2hlYWRfZGljdFtrZXldKQorICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc19saXN0X3NlcXVlbmNlZChjb2x1bW5fbGlzdCkgb3IgaXNfbGlzdF9pbnZlcnRlZChjb2x1bW5fbGlzdCkpCisgICAgICAgICAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X3BhcnRpYWxfbGlua190ZXh0KCJhY2wiKS5jbGljaygpCisgICAgICAgICAgICAgICAgc2VsZi5kcml2ZXIuYmFjaygpCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzX2xpc3Rfc2VxdWVuY2VkKGNvbHVtbl9saXN0KSBvciBpc19saXN0X2ludmVydGVkKGNvbHVtbl9saXN0KSkKKyAgICAgICAgICAgICAgICAjIFNlYXJjaCB0ZXh0IGJveCBiYWNrZ3JvdW5kIHRleHQgaXMgIlNlYXJjaCByZWNpcGVzIgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfeHBhdGgoIi8vKltAaWQ9J3NlYXJjaGZvcm0nXS8qW0BwbGFjZWhvbGRlcj0nU2VhcmNoIHJlY2lwZXMnXSIpKQorICAgICAgICAgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgic2VhcmNoIikuY2xlYXIoKQorICAgICAgICAgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgic2VhcmNoIikuc2VuZF9rZXlzKHRlc3RfcGFja2FnZTIpCisgICAgICAgICAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJzZWFyY2gtYnV0dG9uIikuY2xpY2soKQorICAgICAgICAgICAgICAgIGNvbHVtbl9zZWFyY2hfbGlzdCA9IHNlbGYuZ2V0X3RhYmxlX2NvbHVtbl90ZXh0KCJjbGFzcyIsIHRhYmxlX2hlYWRfZGljdFtrZXldKQorICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc19saXN0X3NlcXVlbmNlZChjb2x1bW5fc2VhcmNoX2xpc3QpIG9yIGlzX2xpc3RfaW52ZXJ0ZWQoY29sdW1uX3NlYXJjaF9saXN0KSkKKyAgICAgICAgICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfY3NzX3NlbGVjdG9yKCJpLmljb24tcmVtb3ZlIikuY2xpY2soKQorICAgICAgICAgICAgZWxpZiBpc19saXN0X2ludmVydGVkKGNvbHVtbl9saXN0KToKKyAgICAgICAgICAgICAgICBzZWxmLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHRfaW5fdGFibGUoc2VsZi50YWJsZV9uYW1lLCBrZXkpLmNsaWNrKCkKKyAgICAgICAgICAgICAgICBjb2x1bW5fbGlzdCA9IHNlbGYuZ2V0X3RhYmxlX2NvbHVtbl90ZXh0KCJjbGFzcyIsIHRhYmxlX2hlYWRfZGljdFtrZXldKQorICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc19saXN0X3NlcXVlbmNlZChjb2x1bW5fbGlzdCkpCisgICAgICAgICAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X3BhcnRpYWxfbGlua190ZXh0KCJhY2wiKS5jbGljaygpCisgICAgICAgICAgICAgICAgc2VsZi5kcml2ZXIuYmFjaygpCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzX2xpc3Rfc2VxdWVuY2VkKGNvbHVtbl9saXN0KSkKKyAgICAgICAgICAgICAgICAjIFNlYXJjaCB0ZXh0IGJveCBiYWNrZ3JvdW5kIHRleHQgaXMgIlNlYXJjaCByZWNpcGVzIgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfeHBhdGgoIi8vKltAaWQ9J3NlYXJjaGZvcm0nXS8qW0BwbGFjZWhvbGRlcj0nU2VhcmNoIHJlY2lwZXMnXSIpKQorICAgICAgICAgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgic2VhcmNoIikuY2xlYXIoKQorICAgICAgICAgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgic2VhcmNoIikuc2VuZF9rZXlzKHRlc3RfcGFja2FnZTIpCisgICAgICAgICAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJzZWFyY2gtYnV0dG9uIikuY2xpY2soKQorICAgICAgICAgICAgICAgIGNvbHVtbl9zZWFyY2hfbGlzdCA9IHNlbGYuZ2V0X3RhYmxlX2NvbHVtbl90ZXh0KCJjbGFzcyIsIHRhYmxlX2hlYWRfZGljdFtrZXldKQorICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc19saXN0X3NlcXVlbmNlZChjb2x1bW5fc2VhcmNoX2xpc3QpKQorICAgICAgICAgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9jc3Nfc2VsZWN0b3IoImkuaWNvbi1yZW1vdmUiKS5jbGljaygpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc19saXN0X3NlcXVlbmNlZChjb2x1bW5fbGlzdCkpCisgICAgICAgICAgICAgICAgc2VsZi5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0X2luX3RhYmxlKHNlbGYudGFibGVfbmFtZSwga2V5KS5jbGljaygpCisgICAgICAgICAgICAgICAgY29sdW1uX2xpc3QgPSBzZWxmLmdldF90YWJsZV9jb2x1bW5fdGV4dCgiY2xhc3MiLCB0YWJsZV9oZWFkX2RpY3Rba2V5XSkKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNfbGlzdF9pbnZlcnRlZChjb2x1bW5fbGlzdCkpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfcGFydGlhbF9saW5rX3RleHQoImFjbCIpLmNsaWNrKCkKKyAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9wYXJ0aWFsX2xpbmtfdGV4dCgiemxpYiIpLmNsaWNrKCkKKyAgICAgICAgICAgICAgICBzZWxmLmRyaXZlci5iYWNrKCkKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNfbGlzdF9pbnZlcnRlZChjb2x1bW5fbGlzdCkpCisgICAgICAgICAgICAgICAgIyBTZWFyY2ggdGV4dCBib3ggYmFja2dyb3VuZCB0ZXh0IGlzICJTZWFyY2ggcmVjaXBlcyIKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X3hwYXRoKCIvLypbQGlkPSdzZWFyY2hmb3JtJ10vKltAcGxhY2Vob2xkZXI9J1NlYXJjaCByZWNpcGVzJ10iKSkKKyAgICAgICAgICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInNlYXJjaCIpLmNsZWFyKCkKKyAgICAgICAgICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInNlYXJjaCIpLnNlbmRfa2V5cyh0ZXN0X3BhY2thZ2UyKQorICAgICAgICAgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgic2VhcmNoLWJ1dHRvbiIpLmNsaWNrKCkKKyAgICAgICAgICAgICAgICBjb2x1bW5fc2VhcmNoX2xpc3QgPSBzZWxmLmdldF90YWJsZV9jb2x1bW5fdGV4dCgiY2xhc3MiLCB0YWJsZV9oZWFkX2RpY3Rba2V5XSkKKyAgICAgICAgICAgICAgICAjcHJpbnQgY29sdW1uX3NlYXJjaF9saXN0CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzX2xpc3RfaW52ZXJ0ZWQoY29sdW1uX3NlYXJjaF9saXN0KSkKKyAgICAgICAgICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfY3NzX3NlbGVjdG9yKCJpLmljb24tcmVtb3ZlIikuY2xpY2soKQorCisgICAgICAgICMgQnVnIDU5MTkKKyAgICAgICAgZm9yIGtleSBpbiB0YWJsZV9oZWFkX2RpY3Q6CisgICAgICAgICAgICBwcmludCBrZXkKKyAgICAgICAgICAgIHNlbGYuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dF9pbl90YWJsZShzZWxmLnRhYmxlX25hbWUsIGtleSkuY2xpY2soKQorICAgICAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJlZGl0LWNvbHVtbnMtYnV0dG9uIikuY2xpY2soKQorICAgICAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKHRhYmxlX2hlYWRfZGljdFtrZXldKS5jbGljaygpCisgICAgICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImVkaXQtY29sdW1ucy1idXR0b24iKS5jbGljaygpCisgICAgICAgICAgICBzZWxmLmJyb3dzZXJfZGVsYXkoKQorICAgICAgICAgICAgIyBBZnRlciBoaWRlIHRoZSBjb2x1bW4sIHRoZSBkZWZhdWx0IHRhYmxlIHNob3VsZCBiZSBzb3J0ZWQgYnkgUmVjaXBlCisgICAgICAgICAgICB0YXNrc19jb2x1bW5fY291bnQgPSBsZW4oc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50c19ieV9wYXJ0aWFsX2xpbmtfdGV4dCgiYWNsIikpCisgICAgICAgICAgICAjcHJpbnQgdGFza3NfY29sdW1uX2NvdW50CisgICAgICAgICAgICBkZWZhdWx0X2NvbHVtbl9saXN0ID0gc2VsZi5nZXRfdGFibGVfY29sdW1uX3RleHRfYnlfY29sdW1uX251bWJlcihzZWxmLnRhYmxlX25hbWUsIDEpCisgICAgICAgICAgICAjcHJpbnQgZGVmYXVsdF9jb2x1bW5fbGlzdAorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzX2xpc3Rfc2VxdWVuY2VkKGRlZmF1bHRfY29sdW1uX2xpc3QpKQorCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgiZWRpdC1jb2x1bW5zLWJ1dHRvbiIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJyZWNpcGVfZmlsZSIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJyZWNpcGVfc2VjdGlvbiIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJyZWNpcGVfbGljZW5zZSIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJsYXllcl92ZXJzaW9uX19sYXllcl9fbmFtZSIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJlZGl0LWNvbHVtbnMtYnV0dG9uIikuY2xpY2soKQorCisKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgIyAgQ0FTRSA5MTEgICMKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMKKyAgICBkZWYgdGVzdF85MTEoc2VsZik6CisgICAgICAgIHNlbGYuY2FzZV9ubyA9IHNlbGYuZ2V0X2Nhc2VfbnVtYmVyKCkKKyAgICAgICAgc2VsZi5sb2cuaW5mbygnIENBU0UgJXMgbG9nOiAnICUgc3RyKHNlbGYuY2FzZV9ubykpCisgICAgICAgIHNlbGYuZHJpdmVyLm1heGltaXplX3dpbmRvdygpCisgICAgICAgIHNlbGYuZHJpdmVyLmdldChzZWxmLmJhc2VfdXJsKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0KCJjb3JlLWltYWdlLW1pbmltYWwiKS5jbGljaygpCisgICAgICAgIHNlbGYuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dF9pbl90YWJsZSgnbmF2JywgJ1JlY2lwZXMnKS5jbGljaygpCisjIHN0ZXAgMy01CisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgic2VhcmNoIikuY2xlYXIoKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInNlYXJjaCIpLnNlbmRfa2V5cygibGliIikKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJzZWFyY2gtYnV0dG9uIikuY2xpY2soKQorICAgICAgICAjIHNhdmUgc2NyZWVuIGhlcmUgZm9yIG9ic2VydmF0aW9uCisgICAgICAgIHNlbGYuc2F2ZV9zY3JlZW5zaG90KHNjcmVlbnNob3RfdHlwZT0nc2VsZW5pdW0nLCBhcHBlbmRfbmFtZT0nc3RlcDUnKQorIyBzdGVwIDYKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2Nzc19zZWxlY3RvcigiaS5pY29uLXJlbW92ZSIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJzZWFyY2giKS5jbGVhcigpCisgICAgICAgICMgd2UgZGVsaWJlcmF0ZWx5IHdhbnQgIm5vIHJlc3VsdCIgaGVyZQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInNlYXJjaCIpLnNlbmRfa2V5cygibm8gc3VjaCBpbnB1dCIpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgic2VhcmNoLWJ1dHRvbiIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5maW5kX2VsZW1lbnRfYnlfdGV4dCgiU2hvdyBhbGwgcmVjaXBlcyIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIucXVpdCgpCisKKworICAgICAgICAjIyMjIyMjIyMjIyMjIworICAgICAgICAjICBDQVNFIDkxMiAgIworICAgICAgICAjIyMjIyMjIyMjIyMjIworICAgIGRlZiB0ZXN0XzkxMihzZWxmKToKKyAgICAgICAgc2VsZi5jYXNlX25vID0gc2VsZi5nZXRfY2FzZV9udW1iZXIoKQorICAgICAgICBzZWxmLmxvZy5pbmZvKCcgQ0FTRSAlcyBsb2c6ICcgJSBzdHIoc2VsZi5jYXNlX25vKSkKKyAgICAgICAgc2VsZi5kcml2ZXIgPSBzZWxmLnNldHVwX2Jyb3dzZXIoc2VsZikKKyAgICAgICAgc2VsZi5kcml2ZXIubWF4aW1pemVfd2luZG93KCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZ2V0KHNlbGYuYmFzZV91cmwpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHQoImNvcmUtaW1hZ2UtbWluaW1hbCIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0X2luX3RhYmxlKCduYXYnLCAnUmVjaXBlcycpLmNsaWNrKCkKKyAgICAgICAgIyBzdGVwIDMKKyAgICAgICAgaGVhZF9saXN0ID0gc2VsZi5nZXRfdGFibGVfaGVhZF90ZXh0KCdvdGFibGUnKQorICAgICAgICBmb3IgaXRlbSBpbiBbJ1JlY2lwZScsICdSZWNpcGUgdmVyc2lvbicsICdSZWNpcGUgZmlsZScsICdTZWN0aW9uJywgJ0xpY2Vuc2UnLCAnTGF5ZXInXToKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpdGVtIGluIGhlYWRfbGlzdCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2Nzc19zZWxlY3RvcigiYnV0dG9uLmJ0bi5kcm9wZG93bi10b2dnbGUiKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgiZGVwZW5kc19vbiIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJsYXllcl92ZXJzaW9uX19icmFuY2giKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgibGF5ZXJfdmVyc2lvbl9fbGF5ZXJfX2NvbW1pdCIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJkZXBlbmRzX2J5IikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfY3NzX3NlbGVjdG9yKCJidXR0b24uYnRuLmRyb3Bkb3duLXRvZ2dsZSIpLmNsaWNrKCkKKyAgICAgICAgIyBjaGVjayBpZiBjb2x1bW5zIHNlbGVjdGVkIGFib3ZlIGlzIHNob3duCisgICAgICAgIGNoZWNrX2xpc3QgPSBbJ0RlcGVuZGVuY2llcycsICdMYXllciBicmFuY2gnLCAnTGF5ZXIgY29tbWl0JywgJ0xheWVyIGRpcmVjdG9yeScsICdSZXZlcnNlIGRlcGVuZGVuY2llcyddCisgICAgICAgIGhlYWRfbGlzdCA9IHNlbGYuZ2V0X3RhYmxlX2hlYWRfdGV4dCgnb3RhYmxlJykKKyAgICAgICAgdGltZS5zbGVlcCgyKQorICAgICAgICBwcmludCBoZWFkX2xpc3QKKyAgICAgICAgZm9yIGl0ZW0gaW4gY2hlY2tfbGlzdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpdGVtIGluIGhlYWRfbGlzdCkKKyAgICAgICAgIyB1bi1jaGVjayAnZW0gYWxsCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9jc3Nfc2VsZWN0b3IoImJ1dHRvbi5idG4uZHJvcGRvd24tdG9nZ2xlIikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImRlcGVuZHNfb24iKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgibGF5ZXJfdmVyc2lvbl9fYnJhbmNoIikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImxheWVyX3ZlcnNpb25fX2xheWVyX19jb21taXQiKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgiZGVwZW5kc19ieSIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2Nzc19zZWxlY3RvcigiYnV0dG9uLmJ0bi5kcm9wZG93bi10b2dnbGUiKS5jbGljaygpCisgICAgICAgICMgZG9uJ3QgZXhpc3QgYW55IG1vcmUKKyAgICAgICAgaGVhZF9saXN0ID0gc2VsZi5nZXRfdGFibGVfaGVhZF90ZXh0KCdvdGFibGUnKQorICAgICAgICBmb3IgaXRlbSBpbiBjaGVja19saXN0OgorICAgICAgICAgICAgc2VsZi5mYWlsSWYoaXRlbSBpbiBoZWFkX2xpc3QpCisKKworICAgICAgICAjIyMjIyMjIyMjIyMjIworICAgICAgICAjICBDQVNFIDkxMyAgIworICAgICAgICAjIyMjIyMjIyMjIyMjIworICAgIGRlZiB0ZXN0XzkxMyhzZWxmKToKKyAgICAgICAgc2VsZi5jYXNlX25vID0gc2VsZi5nZXRfY2FzZV9udW1iZXIoKQorICAgICAgICBzZWxmLmxvZy5pbmZvKCcgQ0FTRSAlcyBsb2c6ICcgJSBzdHIoc2VsZi5jYXNlX25vKSkKKyAgICAgICAgc2VsZi5kcml2ZXIubWF4aW1pemVfd2luZG93KCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZ2V0KHNlbGYuYmFzZV91cmwpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHQoImNvcmUtaW1hZ2UtbWluaW1hbCIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0X2luX3RhYmxlKCduYXYnLCAnUmVjaXBlcycpLmNsaWNrKCkKKyAgICAgICAgIyBzdGVwIDMKKyAgICAgICAgaGVhZF9saXN0ID0gc2VsZi5nZXRfdGFibGVfaGVhZF90ZXh0KCdvdGFibGUnKQorICAgICAgICBmb3IgaXRlbSBpbiBbJ1JlY2lwZScsICdSZWNpcGUgdmVyc2lvbicsICdSZWNpcGUgZmlsZScsICdTZWN0aW9uJywgJ0xpY2Vuc2UnLCAnTGF5ZXInXToKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpdGVtIGluIGhlYWRfbGlzdCkKKyAgICAgICAgIyBzdGVwIDQKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJlZGl0LWNvbHVtbnMtYnV0dG9uIikuY2xpY2soKQorICAgICAgICAjIHNhdmUgc2NyZWVuCisgICAgICAgIHNlbGYuYnJvd3Nlcl9kZWxheSgpCisgICAgICAgIHNlbGYuc2F2ZV9zY3JlZW5zaG90KHNjcmVlbnNob3RfdHlwZT0nc2VsZW5pdW0nLCBhcHBlbmRfbmFtZT0nc3RlcDQnKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImVkaXQtY29sdW1ucy1idXR0b24iKS5jbGljaygpCisKKworICAgICAgICAjIyMjIyMjIyMjIyMjIworICAgICAgICAjICBDQVNFIDkxNCAgIworICAgICAgICAjIyMjIyMjIyMjIyMjIworICAgIGRlZiB0ZXN0XzkxNChzZWxmKToKKyAgICAgICAgc2VsZi5jYXNlX25vID0gc2VsZi5nZXRfY2FzZV9udW1iZXIoKQorICAgICAgICBzZWxmLmxvZy5pbmZvKCcgQ0FTRSAlcyBsb2c6ICcgJSBzdHIoc2VsZi5jYXNlX25vKSkKKyAgICAgICAgaW1hZ2VfdHlwZT0iY29yZS1pbWFnZS1taW5pbWFsIgorICAgICAgICB0ZXN0X3BhY2thZ2UxPSJidXN5Ym94IgorICAgICAgICB0ZXN0X3BhY2thZ2UyPSJnZGJtIgorICAgICAgICB0ZXN0X3BhY2thZ2UzPSJnZXR0ZXh0LW5hdGl2ZSIKKyAgICAgICAgZHJpdmVyID0gc2VsZi5kcml2ZXIKKyAgICAgICAgZHJpdmVyLm1heGltaXplX3dpbmRvdygpCisgICAgICAgIGRyaXZlci5nZXQoc2VsZi5iYXNlX3VybCkKKyAgICAgICAgZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHQoaW1hZ2VfdHlwZSkuY2xpY2soKQorICAgICAgICBkcml2ZXIuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dCgiUmVjaXBlcyIpLmNsaWNrKCkKKyAgICAgICAgZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHQodGVzdF9wYWNrYWdlMSkuY2xpY2soKQorCisgICAgICAgIHNlbGYudGFibGVfbmFtZSA9ICdpbmZvcm1hdGlvbicKKworICAgICAgICB0YXNrc19yb3dfY291bnQgPSBsZW4oZHJpdmVyLmZpbmRfZWxlbWVudHNfYnlfeHBhdGgoIi9odG1sL2JvZHkvZGl2WzJdL2Rpdi9kaXZbM10vZGl2L2RpdlsxXS90YWJsZS90Ym9keS90ci90ZFsxXSIpKQorICAgICAgICB0YXNrc19jb2x1bW5fY291bnQgPSBsZW4oZHJpdmVyLmZpbmRfZWxlbWVudHNfYnlfeHBhdGgoIi9odG1sL2JvZHkvZGl2WzJdL2Rpdi9kaXZbM10vZGl2L2RpdlsxXS90YWJsZS90Ym9keS90clsxXS90ZCIpKQorICAgICAgICBwcmludCB0YXNrc19yb3dfY291bnQKKyAgICAgICAgcHJpbnQgdGFza3NfY29sdW1uX2NvdW50CisKKyAgICAgICAgVGFza3NfY29sdW1uID0gc2VsZi5nZXRfdGFibGVfY29sdW1uX3RleHRfYnlfY29sdW1uX251bWJlcihzZWxmLnRhYmxlX25hbWUsIDIpCisgICAgICAgIHByaW50ICgiVGFza3NfY29sdW1uPSIsIFRhc2tzX2NvbHVtbikKKworICAgICAgICBrZXlfdGFza3M9WyJkb19mZXRjaCIsICJkb191bnBhY2siLCAgImRvX3BhdGNoIiwgImRvX2NvbmZpZ3VyZSIsICJkb19jb21waWxlIiwgImRvX2luc3RhbGwiLCAiZG9fcGFja2FnZSIsICJkb19idWlsZCJdCisgICAgICAgIGkgPSAwCisgICAgICAgIHdoaWxlIGkgPCBsZW4oa2V5X3Rhc2tzKToKKyAgICAgICAgICAgIGlmIGtleV90YXNrc1tpXSBub3QgaW4gVGFza3NfY29sdW1uOgorICAgICAgICAgICAgICAgIHByaW50ICgiRXJyb3IhIE1pc3Npbmcga2V5IHRhc2s6ICVzIiAlIGtleV90YXNrc1tpXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgKCIlcyBpcyBpbiB0YXNrcyIgJSBrZXlfdGFza3NbaV0pCisgICAgICAgICAgICBpID0gaSArIDEKKworICAgICAgICBpZiBUYXNrc19jb2x1bW4uaW5kZXgoa2V5X3Rhc2tzWzBdKSAhPSAwOgorICAgICAgICAgICAgcHJpbnQgKCJFcnJvciEgJXMgaXMgbm90IGluIHRoZSByaWdodCBwb3NpdGlvbiIgJSBrZXlfdGFza3NbMF0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCAoIiVzIGlzIGluIHJpZ2h0IHBvc2l0aW9uIiAlIGtleV90YXNrc1swXSkKKworICAgICAgICBpZiBUYXNrc19jb2x1bW5bLTFdICE9IGtleV90YXNrc1stMV06CisgICAgICAgICAgICBwcmludCAoIkVycm9yISAlcyBpcyBub3QgaW4gdGhlIHJpZ2h0IHBvc2l0aW9uIiAlIGtleV90YXNrc1stMV0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCAoIiVzIGlzIGluIHJpZ2h0IHBvc2l0aW9uIiAlIGtleV90YXNrc1stMV0pCisKKyAgICAgICAgZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9wYXJ0aWFsX2xpbmtfdGV4dCgiUGFja2FnZXMgKCIpLmNsaWNrKCkKKyAgICAgICAgcGFja2FnZXNfbmFtZSA9IGRyaXZlci5maW5kX2VsZW1lbnRfYnlfcGFydGlhbF9saW5rX3RleHQoIlBhY2thZ2VzICgiKS50ZXh0CisgICAgICAgIHByaW50IHBhY2thZ2VzX25hbWUKKyAgICAgICAgcGFja2FnZXNfbnVtID0gc3RyaW5nLmF0b2koZmlsdGVyKHN0ci5pc2RpZ2l0LCByZXByKHBhY2thZ2VzX25hbWUpKSkKKyAgICAgICAgcHJpbnQgcGFja2FnZXNfbnVtCisKKyAgICAgICAgcGFja2FnZXNfcm93X2NvdW50ID0gbGVuKGRyaXZlci5maW5kX2VsZW1lbnRzX2J5X3hwYXRoKCIvaHRtbC9ib2R5L2RpdlsyXS9kaXYvZGl2WzNdL2Rpdi9kaXZbMl0vdGFibGUvdGJvZHkvdHIvdGRbMV0iKSkKKyAgICAgICAgcHJpbnQgcGFja2FnZXNfcm93X2NvdW50CisKKyAgICAgICAgaWYgcGFja2FnZXNfbnVtICE9IHBhY2thZ2VzX3Jvd19jb3VudDoKKyAgICAgICAgICAgIHByaW50ICgiRXJyb3IhIFRoZSBwYWNrYWdlcyBudW1iZXIgaXMgbm90IGNvcnJlY3QiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgKCJUaGUgcGFrY2FnZXMgbnVtYmVyIGlzIGNvcnJlY3QiKQorCisgICAgICAgIGRyaXZlci5maW5kX2VsZW1lbnRfYnlfcGFydGlhbF9saW5rX3RleHQoIkJ1aWxkIGRlcGVuZGVuY2llcyAoIikuY2xpY2soKQorICAgICAgICBkZXBlbmRzX25hbWUgPSBkcml2ZXIuZmluZF9lbGVtZW50X2J5X3BhcnRpYWxfbGlua190ZXh0KCJCdWlsZCBkZXBlbmRlbmNpZXMgKCIpLnRleHQKKyAgICAgICAgcHJpbnQgZGVwZW5kc19uYW1lCisgICAgICAgIGRlcGVuZHNfbnVtID0gc3RyaW5nLmF0b2koZmlsdGVyKHN0ci5pc2RpZ2l0LCByZXByKGRlcGVuZHNfbmFtZSkpKQorICAgICAgICBwcmludCBkZXBlbmRzX251bQorCisgICAgICAgIGlmIGRlcGVuZHNfbnVtID09IDA6CisgICAgICAgICAgICBkZXBlbmRzX21lc3NhZ2UgPSByZXByKGRyaXZlci5maW5kX2VsZW1lbnRfYnlfY3NzX3NlbGVjdG9yKCJkaXYuYWxlcnQuYWxlcnQtaW5mbyIpLnRleHQpCisgICAgICAgICAgICBwcmludCBkZXBlbmRzX21lc3NhZ2UKKyAgICAgICAgICAgIGlmIGRlcGVuZHNfbWVzc2FnZS5maW5kKCJoYXMgbm8gYnVpbGQgZGVwZW5kZW5jaWVzLiIpIDwgMDoKKyAgICAgICAgICAgICAgICBwcmludCAoIkVycm9yISBUaGUgbWVzc2FnZSBpc24ndCBleHBlY3RlZC4iKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCAoIlRoZSBtZXNzYWdlIGlzIGV4cGVjdGVkIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRlcGVuZHNfcm93X2NvdW50ID0gbGVuKGRyaXZlci5maW5kX2VsZW1lbnRzX2J5X3hwYXRoKCIvaHRtbC9ib2R5L2RpdlsyXS9kaXYvZGl2WzNdL2Rpdi9kaXZbM10vdGFibGUvdGJvZHkvdHIvdGRbMV0iKSkKKyAgICAgICAgICAgIHByaW50IGRlcGVuZHNfcm93X2NvdW50CisgICAgICAgICAgICBpZiBkZXBlbmRzX251bSAhPSBkZXBlbmRzX3Jvd19jb3VudDoKKyAgICAgICAgICAgICAgICBwcmludCAoIkVycm9yISBUaGUgZGVwZW5kZW50IHBhY2thZ2VzIG51bWJlciBpcyBub3QgY29ycmVjdCIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50ICgiVGhlIGRlcGVuZGVudCBwYWNrYWdlcyBudW1iZXIgaXMgY29ycmVjdCIpCisKKyAgICAgICAgZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9wYXJ0aWFsX2xpbmtfdGV4dCgiUmV2ZXJzZSBidWlsZCBkZXBlbmRlbmNpZXMgKCIpLmNsaWNrKCkKKyAgICAgICAgcmRlcGVuZHNfbmFtZSA9IGRyaXZlci5maW5kX2VsZW1lbnRfYnlfcGFydGlhbF9saW5rX3RleHQoIlJldmVyc2UgYnVpbGQgZGVwZW5kZW5jaWVzICgiKS50ZXh0CisgICAgICAgIHByaW50IHJkZXBlbmRzX25hbWUKKyAgICAgICAgcmRlcGVuZHNfbnVtID0gc3RyaW5nLmF0b2koZmlsdGVyKHN0ci5pc2RpZ2l0LCByZXByKHJkZXBlbmRzX25hbWUpKSkKKyAgICAgICAgcHJpbnQgcmRlcGVuZHNfbnVtCisKKyAgICAgICAgaWYgcmRlcGVuZHNfbnVtID09IDA6CisgICAgICAgICAgICByZGVwZW5kc19tZXNzYWdlID0gcmVwcihkcml2ZXIuZmluZF9lbGVtZW50X2J5X2Nzc19zZWxlY3RvcigiI2Jyb3VnaHQtaW4tYnkgPiBkaXYuYWxlcnQuYWxlcnQtaW5mbyIpLnRleHQpCisgICAgICAgICAgICBwcmludCByZGVwZW5kc19tZXNzYWdlCisgICAgICAgICAgICBpZiByZGVwZW5kc19tZXNzYWdlLmZpbmQoImhhcyBubyByZXZlcnNlIGJ1aWxkIGRlcGVuZGVuY2llcy4iKSA8IDA6CisgICAgICAgICAgICAgICAgcHJpbnQgKCJFcnJvciEgVGhlIG1lc3NhZ2UgaXNuJ3QgZXhwZWN0ZWQuIikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgKCJUaGUgbWVzc2FnZSBpcyBleHBlY3RlZCIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCAoIlRoZSByZXZlcnNlIGRlcGVuZGVudCBwYWNrYWdlcyBudW1iZXIgaXMgY29ycmVjdCIpCisKKyAgICAgICAgZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHQoIlJlY2lwZXMiKS5jbGljaygpCisgICAgICAgIGRyaXZlci5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0KHRlc3RfcGFja2FnZTIpLmNsaWNrKCkKKyAgICAgICAgZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9wYXJ0aWFsX2xpbmtfdGV4dCgiUGFja2FnZXMgKCIpLmNsaWNrKCkKKyAgICAgICAgZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9wYXJ0aWFsX2xpbmtfdGV4dCgiQnVpbGQgZGVwZW5kZW5jaWVzICgiKS5jbGljaygpCisgICAgICAgIGRyaXZlci5maW5kX2VsZW1lbnRfYnlfcGFydGlhbF9saW5rX3RleHQoIlJldmVyc2UgYnVpbGQgZGVwZW5kZW5jaWVzICgiKS5jbGljaygpCisKKworICAgICAgICBkcml2ZXIuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dCgiUmVjaXBlcyIpLmNsaWNrKCkKKyAgICAgICAgZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHQodGVzdF9wYWNrYWdlMykuY2xpY2soKQorCisgICAgICAgIG5hdGl2ZV90YXNrc19yb3dfY291bnQgPSBsZW4oZHJpdmVyLmZpbmRfZWxlbWVudHNfYnlfeHBhdGgoIi9odG1sL2JvZHkvZGl2WzJdL2Rpdi9kaXZbM10vZGl2L2RpdlsxXS90YWJsZS90Ym9keS90ci90ZFsxXSIpKQorICAgICAgICBuYXRpdmVfdGFza3NfY29sdW1uX2NvdW50ID0gbGVuKGRyaXZlci5maW5kX2VsZW1lbnRzX2J5X3hwYXRoKCIvaHRtbC9ib2R5L2RpdlsyXS9kaXYvZGl2WzNdL2Rpdi9kaXZbMV0vdGFibGUvdGJvZHkvdHJbMV0vdGQiKSkKKyAgICAgICAgcHJpbnQgbmF0aXZlX3Rhc2tzX3Jvd19jb3VudAorICAgICAgICBwcmludCBuYXRpdmVfdGFza3NfY29sdW1uX2NvdW50CisKKyAgICAgICAgTmF0aXZlX1Rhc2tzX2NvbHVtbiA9IHNlbGYuZ2V0X3RhYmxlX2NvbHVtbl90ZXh0X2J5X2NvbHVtbl9udW1iZXIoc2VsZi50YWJsZV9uYW1lLCAyKQorICAgICAgICBwcmludCAoIk5hdGl2ZV9UYXNrc19jb2x1bW49IiwgTmF0aXZlX1Rhc2tzX2NvbHVtbikKKworICAgICAgICBuYXRpdmVfa2V5X3Rhc2tzPVsiZG9fZmV0Y2giLCAiZG9fdW5wYWNrIiwgICJkb19wYXRjaCIsICJkb19jb25maWd1cmUiLCAiZG9fY29tcGlsZSIsICJkb19pbnN0YWxsIiwgImRvX2J1aWxkIl0KKyAgICAgICAgaSA9IDAKKyAgICAgICAgd2hpbGUgaSA8IGxlbihuYXRpdmVfa2V5X3Rhc2tzKToKKyAgICAgICAgICAgIGlmIG5hdGl2ZV9rZXlfdGFza3NbaV0gbm90IGluIE5hdGl2ZV9UYXNrc19jb2x1bW46CisgICAgICAgICAgICAgICAgcHJpbnQgKCJFcnJvciEgTWlzc2luZyBrZXkgdGFzazogJXMiICUgbmF0aXZlX2tleV90YXNrc1tpXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgKCIlcyBpcyBpbiB0YXNrcyIgJSBuYXRpdmVfa2V5X3Rhc2tzW2ldKQorICAgICAgICAgICAgaSA9IGkgKyAxCisKKyAgICAgICAgaWYgTmF0aXZlX1Rhc2tzX2NvbHVtbi5pbmRleChuYXRpdmVfa2V5X3Rhc2tzWzBdKSAhPSAwOgorICAgICAgICAgICAgcHJpbnQgKCJFcnJvciEgJXMgaXMgbm90IGluIHRoZSByaWdodCBwb3NpdGlvbiIgJSBuYXRpdmVfa2V5X3Rhc2tzWzBdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgKCIlcyBpcyBpbiByaWdodCBwb3NpdGlvbiIgJSBuYXRpdmVfa2V5X3Rhc2tzWzBdKQorCisgICAgICAgIGlmIE5hdGl2ZV9UYXNrc19jb2x1bW5bLTFdICE9IG5hdGl2ZV9rZXlfdGFza3NbLTFdOgorICAgICAgICAgICAgcHJpbnQgKCJFcnJvciEgJXMgaXMgbm90IGluIHRoZSByaWdodCBwb3NpdGlvbiIgJSBuYXRpdmVfa2V5X3Rhc2tzWy0xXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ICgiJXMgaXMgaW4gcmlnaHQgcG9zaXRpb24iICUgbmF0aXZlX2tleV90YXNrc1stMV0pCisKKyAgICAgICAgZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9wYXJ0aWFsX2xpbmtfdGV4dCgiUGFja2FnZXMgKCIpLmNsaWNrKCkKKyAgICAgICAgbmF0aXZlX3BhY2thZ2VzX25hbWUgPSBkcml2ZXIuZmluZF9lbGVtZW50X2J5X3BhcnRpYWxfbGlua190ZXh0KCJQYWNrYWdlcyAoIikudGV4dAorICAgICAgICBwcmludCBuYXRpdmVfcGFja2FnZXNfbmFtZQorICAgICAgICBuYXRpdmVfcGFja2FnZXNfbnVtID0gc3RyaW5nLmF0b2koZmlsdGVyKHN0ci5pc2RpZ2l0LCByZXByKG5hdGl2ZV9wYWNrYWdlc19uYW1lKSkpCisgICAgICAgIHByaW50IG5hdGl2ZV9wYWNrYWdlc19udW0KKworICAgICAgICBpZiBuYXRpdmVfcGFja2FnZXNfbnVtICE9IDA6CisgICAgICAgICAgICBwcmludCAoIkVycm9yISBOYXRpdmUgdGFzayBzaG91bGRuJ3QgaGF2ZSBhbnkgcGFja2FnZXMuIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5hdGl2ZV9wYWNrYWdlX21lc3NhZ2UgPSByZXByKGRyaXZlci5maW5kX2VsZW1lbnRfYnlfY3NzX3NlbGVjdG9yKCJkaXYuYWxlcnQuYWxlcnQtaW5mbyIpLnRleHQpCisgICAgICAgICAgICBwcmludCBuYXRpdmVfcGFja2FnZV9tZXNzYWdlCisgICAgICAgICAgICBpZiBuYXRpdmVfcGFja2FnZV9tZXNzYWdlLmZpbmQoImRvZXMgbm90IGJ1aWxkIGFueSBwYWNrYWdlcy4iKSA8IDA6CisgICAgICAgICAgICAgICAgcHJpbnQgKCJFcnJvciEgVGhlIG1lc3NhZ2UgZm9yIG5hdGl2ZSB0YXNrIGlzbid0IGV4cGVjdGVkLiIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50ICgiVGhlIG1lc3NhZ2UgZm9yIG5hdGl2ZSB0YXNrIGlzIGV4cGVjdGVkLiIpCisKKyAgICAgICAgZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9wYXJ0aWFsX2xpbmtfdGV4dCgiQnVpbGQgZGVwZW5kZW5jaWVzICgiKS5jbGljaygpCisgICAgICAgIG5hdGl2ZV9kZXBlbmRzX25hbWUgPSBkcml2ZXIuZmluZF9lbGVtZW50X2J5X3BhcnRpYWxfbGlua190ZXh0KCJCdWlsZCBkZXBlbmRlbmNpZXMgKCIpLnRleHQKKyAgICAgICAgcHJpbnQgbmF0aXZlX2RlcGVuZHNfbmFtZQorICAgICAgICBuYXRpdmVfZGVwZW5kc19udW0gPSBzdHJpbmcuYXRvaShmaWx0ZXIoc3RyLmlzZGlnaXQsIHJlcHIobmF0aXZlX2RlcGVuZHNfbmFtZSkpKQorICAgICAgICBwcmludCBuYXRpdmVfZGVwZW5kc19udW0KKworICAgICAgICBuYXRpdmVfZGVwZW5kc19yb3dfY291bnQgPSBsZW4oZHJpdmVyLmZpbmRfZWxlbWVudHNfYnlfeHBhdGgoIi9odG1sL2JvZHkvZGl2WzJdL2Rpdi9kaXZbM10vZGl2L2RpdlszXS90YWJsZS90Ym9keS90ci90ZFsxXSIpKQorICAgICAgICBwcmludCBuYXRpdmVfZGVwZW5kc19yb3dfY291bnQKKworICAgICAgICBpZiBuYXRpdmVfZGVwZW5kc19udW0gIT0gbmF0aXZlX2RlcGVuZHNfcm93X2NvdW50OgorICAgICAgICAgICAgcHJpbnQgKCJFcnJvciEgVGhlIGRlcGVuZGVudCBwYWNrYWdlcyBudW1iZXIgaXMgbm90IGNvcnJlY3QiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgKCJUaGUgZGVwZW5kZW50IHBhY2thZ2VzIG51bWJlciBpcyBjb3JyZWN0IikKKworICAgICAgICBkcml2ZXIuZmluZF9lbGVtZW50X2J5X3BhcnRpYWxfbGlua190ZXh0KCJSZXZlcnNlIGJ1aWxkIGRlcGVuZGVuY2llcyAoIikuY2xpY2soKQorICAgICAgICBuYXRpdmVfcmRlcGVuZHNfbmFtZSA9IGRyaXZlci5maW5kX2VsZW1lbnRfYnlfcGFydGlhbF9saW5rX3RleHQoIlJldmVyc2UgYnVpbGQgZGVwZW5kZW5jaWVzICgiKS50ZXh0CisgICAgICAgIHByaW50IG5hdGl2ZV9yZGVwZW5kc19uYW1lCisgICAgICAgIG5hdGl2ZV9yZGVwZW5kc19udW0gPSBzdHJpbmcuYXRvaShmaWx0ZXIoc3RyLmlzZGlnaXQsIHJlcHIobmF0aXZlX3JkZXBlbmRzX25hbWUpKSkKKyAgICAgICAgcHJpbnQgbmF0aXZlX3JkZXBlbmRzX251bQorCisgICAgICAgIG5hdGl2ZV9yZGVwZW5kc19yb3dfY291bnQgPSBsZW4oZHJpdmVyLmZpbmRfZWxlbWVudHNfYnlfeHBhdGgoIi9odG1sL2JvZHkvZGl2WzJdL2Rpdi9kaXZbM10vZGl2L2Rpdls0XS90YWJsZS90Ym9keS90ci90ZFsxXSIpKQorICAgICAgICBwcmludCBuYXRpdmVfcmRlcGVuZHNfcm93X2NvdW50CisKKyAgICAgICAgaWYgbmF0aXZlX3JkZXBlbmRzX251bSAhPSBuYXRpdmVfcmRlcGVuZHNfcm93X2NvdW50OgorICAgICAgICAgICAgcHJpbnQgKCJFcnJvciEgVGhlIHJldmVyc2UgZGVwZW5kZW50IHBhY2thZ2VzIG51bWJlciBpcyBub3QgY29ycmVjdCIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCAoIlRoZSByZXZlcnNlIGRlcGVuZGVudCBwYWNrYWdlcyBudW1iZXIgaXMgY29ycmVjdCIpCisKKyAgICAgICAgZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHQoIlJlY2lwZXMiKS5jbGljaygpCisKKworICAgICAgICAjIyMjIyMjIyMjIyMjIworICAgICAgICAjICBDQVNFIDkxNSAgIworICAgICAgICAjIyMjIyMjIyMjIyMjIworICAgIGRlZiB0ZXN0XzkxNShzZWxmKToKKyAgICAgICAgc2VsZi5jYXNlX25vID0gc2VsZi5nZXRfY2FzZV9udW1iZXIoKQorICAgICAgICBzZWxmLmxvZy5pbmZvKCcgQ0FTRSAlcyBsb2c6ICcgJSBzdHIoc2VsZi5jYXNlX25vKSkKKyAgICAgICAgc2VsZi5kcml2ZXIubWF4aW1pemVfd2luZG93KCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZ2V0KHNlbGYuYmFzZV91cmwpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHQoImNvcmUtaW1hZ2UtbWluaW1hbCIpLmNsaWNrKCkKKyMgc3RlcCAzCisgICAgICAgIHNlbGYuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dF9pbl90YWJsZSgnbmF2JywgJ0NvbmZpZ3VyYXRpb24nKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHQoIkJpdEJha2UgdmFyaWFibGVzIikuY2xpY2soKQorIyBzdGVwIDQKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJzZWFyY2giKS5jbGVhcigpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgic2VhcmNoIikuc2VuZF9rZXlzKCJsaWIiKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInNlYXJjaC1idXR0b24iKS5jbGljaygpCisgICAgICAgICMgc2F2ZSBzY3JlZW4gdG8gc2VlIHJlc3VsdAorICAgICAgICBzZWxmLmJyb3dzZXJfZGVsYXkoKQorICAgICAgICBzZWxmLnNhdmVfc2NyZWVuc2hvdChzY3JlZW5zaG90X3R5cGU9J3NlbGVuaXVtJywgYXBwZW5kX25hbWU9J3N0ZXA0JykKKyMgc3RlcCA1CisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9jc3Nfc2VsZWN0b3IoImkuaWNvbi1yZW1vdmUiKS5jbGljaygpCisgICAgICAgIGhlYWRfbGlzdCA9IHNlbGYuZ2V0X3RhYmxlX2hlYWRfdGV4dCgnb3RhYmxlJykKKyAgICAgICAgcHJpbnQgaGVhZF9saXN0CisgICAgICAgIHByaW50IGxlbihoZWFkX2xpc3QpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhoZWFkX2xpc3QgPT0gWydWYXJpYWJsZScsICdWYWx1ZScsICdTZXQgaW4gZmlsZScsICdEZXNjcmlwdGlvbiddKQorIyBzdGVwIDgKKyAgICAgICAgIyBzZWFyY2ggb3RoZXIgc3RyaW5nLiBhbmQgY2xpY2sgIlZhcmlhYmxlIiB0byByZS1zb3J0LCBjaGVjayBpZiB0YWJsZQorICAgICAgICAjIGhlYWQgaXMgc3RpbGwgdGhlIHNhbWUKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJzZWFyY2giKS5jbGVhcigpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgic2VhcmNoIikuc2VuZF9rZXlzKCJwb2t5IikKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJzZWFyY2gtYnV0dG9uIikuY2xpY2soKQorICAgICAgICBzZWxmLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHRfaW5fdGFibGUoJ290YWJsZScsICdWYXJpYWJsZScpLmNsaWNrKCkKKyAgICAgICAgaGVhZF9saXN0ID0gc2VsZi5nZXRfdGFibGVfaGVhZF90ZXh0KCdvdGFibGUnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaGVhZF9saXN0ID09IFsnVmFyaWFibGUnLCAnVmFsdWUnLCAnU2V0IGluIGZpbGUnLCAnRGVzY3JpcHRpb24nXSkKKyAgICAgICAgc2VsZi5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0X2luX3RhYmxlKCdvdGFibGUnLCAnVmFyaWFibGUnKS5jbGljaygpCisgICAgICAgIGhlYWRfbGlzdCA9IHNlbGYuZ2V0X3RhYmxlX2hlYWRfdGV4dCgnb3RhYmxlJykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGhlYWRfbGlzdCA9PSBbJ1ZhcmlhYmxlJywgJ1ZhbHVlJywgJ1NldCBpbiBmaWxlJywgJ0Rlc2NyaXB0aW9uJ10pCisKKworICAgICAgICAjIyMjIyMjIyMjIyMjIworICAgICAgICAjICBDQVNFIDkxNiAgIworICAgICAgICAjIyMjIyMjIyMjIyMjIworICAgIGRlZiB0ZXN0XzkxNihzZWxmKToKKyAgICAgICAgc2VsZi5jYXNlX25vID0gc2VsZi5nZXRfY2FzZV9udW1iZXIoKQorICAgICAgICBzZWxmLmxvZy5pbmZvKCcgQ0FTRSAlcyBsb2c6ICcgJSBzdHIoc2VsZi5jYXNlX25vKSkKKyAgICAgICAgc2VsZi5kcml2ZXIubWF4aW1pemVfd2luZG93KCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZ2V0KHNlbGYuYmFzZV91cmwpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHQoImNvcmUtaW1hZ2UtbWluaW1hbCIpLmNsaWNrKCkKKyMgc3RlcCAyLTMKKyAgICAgICAgc2VsZi5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0X2luX3RhYmxlKCduYXYnLCAnQ29uZmlndXJhdGlvbicpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dCgiQml0QmFrZSB2YXJpYWJsZXMiKS5jbGljaygpCisgICAgICAgIHZhcmlhYmxlX2xpc3QgPSBzZWxmLmdldF90YWJsZV9jb2x1bW5fdGV4dCgnY2xhc3MnLCAndmFyaWFibGVfbmFtZScpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc19saXN0X3NlcXVlbmNlZCh2YXJpYWJsZV9saXN0KSkKKyMgc3RlcCA0CisgICAgICAgIHNlbGYuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dF9pbl90YWJsZSgnb3RhYmxlJywgJ1ZhcmlhYmxlJykuY2xpY2soKQorICAgICAgICB2YXJpYWJsZV9saXN0ID0gc2VsZi5nZXRfdGFibGVfY29sdW1uX3RleHQoJ2NsYXNzJywgJ3ZhcmlhYmxlX25hbWUnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNfbGlzdF9pbnZlcnRlZCh2YXJpYWJsZV9saXN0KSkKKyAgICAgICAgc2VsZi5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0X2luX3RhYmxlKCdvdGFibGUnLCAnVmFyaWFibGUnKS5jbGljaygpCisjIHN0ZXAgNQorICAgICAgICAjIHNlYXJjaGluZyB3b24ndCBjaGFuZ2UgdGhlIHNlcXVlbnRpYWxpdHkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJzZWFyY2giKS5jbGVhcigpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgic2VhcmNoIikuc2VuZF9rZXlzKCJsaWIiKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInNlYXJjaC1idXR0b24iKS5jbGljaygpCisgICAgICAgIHZhcmlhYmxlX2xpc3QgPSBzZWxmLmdldF90YWJsZV9jb2x1bW5fdGV4dCgnY2xhc3MnLCAndmFyaWFibGVfbmFtZScpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc19saXN0X3NlcXVlbmNlZCh2YXJpYWJsZV9saXN0KSkKKworCisgICAgICAgICMjIyMjIyMjIyMjIyMjCisgICAgICAgICMgIENBU0UgOTIzICAjCisgICAgICAgICMjIyMjIyMjIyMjIyMjCisgICAgZGVmIHRlc3RfOTIzKHNlbGYpOgorICAgICAgICBzZWxmLmNhc2Vfbm8gPSBzZWxmLmdldF9jYXNlX251bWJlcigpCisgICAgICAgIHNlbGYubG9nLmluZm8oJyBDQVNFICVzIGxvZzogJyAlIHN0cihzZWxmLmNhc2Vfbm8pKQorICAgICAgICBzZWxmLmRyaXZlci5tYXhpbWl6ZV93aW5kb3coKQorICAgICAgICBzZWxmLmRyaXZlci5nZXQoc2VsZi5iYXNlX3VybCkKKyAgICAgICAgIyBTdGVwIDIKKyAgICAgICAgIyBkZWZhdWx0IHNlcXVlbmNlIGluICJDb21wbGV0ZWQgb24iIGNvbHVtbiBpcyBpbnZlcnRlZAorICAgICAgICBjX2xpc3QgPSBzZWxmLmdldF90YWJsZV9jb2x1bW5fdGV4dCgnY2xhc3MnLCAnY29tcGxldGVkX29uJykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzX2xpc3RfaW52ZXJ0ZWQoY19saXN0KSkKKyAgICAgICAgIyBzdGVwIDMKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJlZGl0LWNvbHVtbnMtYnV0dG9uIikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInN0YXJ0ZWRfb24iKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgibG9nIikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInRpbWUiKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgiZWRpdC1jb2x1bW5zLWJ1dHRvbiIpLmNsaWNrKCkKKyAgICAgICAgaGVhZF9saXN0ID0gc2VsZi5nZXRfdGFibGVfaGVhZF90ZXh0KCdvdGFibGUnKQorICAgICAgICBmb3IgaXRlbSBpbiBbJ091dGNvbWUnLCAnVGFyZ2V0JywgJ01hY2hpbmUnLCAnU3RhcnRlZCBvbicsICdDb21wbGV0ZWQgb24nLCAnRmFpbGVkIHRhc2tzJywgJ0Vycm9ycycsICdXYXJuaW5ncycsICdXYXJuaW5ncycsICdUaW1lJ106CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXRlbSBpbiBoZWFkX2xpc3QpCisKKworICAgICAgICAjIyMjIyMjIyMjIyMjIworICAgICAgICAjICBDQVNFIDkyNCAgIworICAgICAgICAjIyMjIyMjIyMjIyMjIworICAgIGRlZiB0ZXN0XzkyNChzZWxmKToKKyAgICAgICAgc2VsZi5jYXNlX25vID0gc2VsZi5nZXRfY2FzZV9udW1iZXIoKQorICAgICAgICBzZWxmLmxvZy5pbmZvKCcgQ0FTRSAlcyBsb2c6ICcgJSBzdHIoc2VsZi5jYXNlX25vKSkKKyAgICAgICAgc2VsZi5kcml2ZXIubWF4aW1pemVfd2luZG93KCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZ2V0KHNlbGYuYmFzZV91cmwpCisgICAgICAgICMgUGxlYXNlIHJlZmVyIHRvIGNhc2UgOTI0IHJlcXVpcmVtZW50CisgICAgICAgICMgZGVmYXVsdCBzZXF1ZW5jZSBpbiAiQ29tcGxldGVkIG9uIiBjb2x1bW4gaXMgaW52ZXJ0ZWQKKyAgICAgICAgY19saXN0ID0gc2VsZi5nZXRfdGFibGVfY29sdW1uX3RleHQoJ2NsYXNzJywgJ2NvbXBsZXRlZF9vbicpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc19saXN0X2ludmVydGVkKGNfbGlzdCkpCisgICAgICAgICMgU3RlcCA0CisgICAgICAgICMgY2xpY2sgRXJyb3JzICwgb3JkZXIgaW4gIkNvbXBsZXRlZCBvbiIgc2hvdWxkIGJlIGRpc3R1cmJlZC4gVGhlbiBoaWRlCisgICAgICAgICMgZXJyb3IgY29sdW1uIHRvIGNoZWNrIGlmIG9yZGVyIGluICJDb21wbGV0ZWQgb24iIGNhbiBiZSByZXN0b3JlZAorICAgICAgICBzZWxmLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHRfaW5fdGFibGUoJ290YWJsZScsICdFcnJvcnMnKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgiZWRpdC1jb2x1bW5zLWJ1dHRvbiIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJlcnJvcnNfbm8iKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgiZWRpdC1jb2x1bW5zLWJ1dHRvbiIpLmNsaWNrKCkKKyAgICAgICAgIyBOb3RlOiB3aXRob3V0IHRpbWUuc2xlZXAgaGVyZSwgdGhlcmUnbGwgYmUgdW5wcmVkaWN0YWJsZSBlcnJvci4uVEJECisgICAgICAgIHRpbWUuc2xlZXAoMSkKKyAgICAgICAgY19saXN0ID0gc2VsZi5nZXRfdGFibGVfY29sdW1uX3RleHQoJ2NsYXNzJywgJ2NvbXBsZXRlZF9vbicpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc19saXN0X2ludmVydGVkKGNfbGlzdCkpCisKKworICAgICAgICAjIyMjIyMjIyMjIyMjIworICAgICAgICAjICBDQVNFIDk0MCAgIworICAgICAgICAjIyMjIyMjIyMjIyMjIworICAgIGRlZiB0ZXN0Xzk0MChzZWxmKToKKyAgICAgICAgc2VsZi5jYXNlX25vID0gc2VsZi5nZXRfY2FzZV9udW1iZXIoKQorICAgICAgICBzZWxmLmxvZy5pbmZvKCcgQ0FTRSAlcyBsb2c6ICcgJSBzdHIoc2VsZi5jYXNlX25vKSkKKyAgICAgICAgc2VsZi5kcml2ZXIubWF4aW1pemVfd2luZG93KCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZ2V0KHNlbGYuYmFzZV91cmwpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHQoImNvcmUtaW1hZ2UtbWluaW1hbCIpLmNsaWNrKCkKKyMgU3RlcCAyLTMKKyAgICAgICAgc2VsZi5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0X2luX3RhYmxlKCduYXYnLCAnUGFja2FnZXMnKS5jbGljaygpCisgICAgICAgIGNoZWNrX2hlYWRfbGlzdCA9IFsnUGFja2FnZScsICdQYWNrYWdlIHZlcnNpb24nLCAnU2l6ZScsICdSZWNpcGUnXQorICAgICAgICBoZWFkX2xpc3QgPSBzZWxmLmdldF90YWJsZV9oZWFkX3RleHQoJ290YWJsZScpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhoZWFkX2xpc3QgPT0gY2hlY2tfaGVhZF9saXN0KQorIyBTdGVwIDQKKyAgICAgICAgIyBwdWxsZG93biBtZW51CisgICAgICAgIG9wdGlvbl9pZHMgPSBbJ3JlY2lwZV9fbGF5ZXJfdmVyc2lvbl9fbGF5ZXJfX25hbWUnLCAncmVjaXBlX19sYXllcl92ZXJzaW9uX19icmFuY2gnLCBcCisgICAgICAgICAgICAgICAgICAgICAgJ3JlY2lwZV9fbGF5ZXJfdmVyc2lvbl9fbGF5ZXJfX2NvbW1pdCcsICdsaWNlbnNlJywgJ3JlY2lwZV9fdmVyc2lvbiddCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgiZWRpdC1jb2x1bW5zLWJ1dHRvbiIpLmNsaWNrKCkKKyAgICAgICAgZm9yIGl0ZW0gaW4gb3B0aW9uX2lkczoKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoaXRlbSkuaXNfc2VsZWN0ZWQoKToKKyAgICAgICAgICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoaXRlbSkuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImVkaXQtY29sdW1ucy1idXR0b24iKS5jbGljaygpCisgICAgICAgICMgc2F2ZSBzY3JlZW4gaGVyZSB0byBvYnNlcnZlIHRoYXQgJ1BhY2thZ2UnIGFuZCAnUGFja2FnZSB2ZXJzaW9uJyBpcworICAgICAgICAjIG5vdCBzZWxlY3RhYmxlCisgICAgICAgIHNlbGYuYnJvd3Nlcl9kZWxheSgpCisgICAgICAgIHNlbGYuc2F2ZV9zY3JlZW5zaG90KHNjcmVlbnNob3RfdHlwZT0nc2VsZW5pdW0nLCBhcHBlbmRfbmFtZT0nc3RlcDQnKQorCisKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgIyAgQ0FTRSA5NDEgICMKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMKKyAgICBkZWYgdGVzdF85NDEoc2VsZik6CisgICAgICAgIHNlbGYuY2FzZV9ubyA9IHNlbGYuZ2V0X2Nhc2VfbnVtYmVyKCkKKyAgICAgICAgc2VsZi5sb2cuaW5mbygnIENBU0UgJXMgbG9nOiAnICUgc3RyKHNlbGYuY2FzZV9ubykpCisgICAgICAgIHNlbGYuZHJpdmVyLm1heGltaXplX3dpbmRvdygpCisgICAgICAgIHNlbGYuZHJpdmVyLmdldChzZWxmLmJhc2VfdXJsKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0KCJjb3JlLWltYWdlLW1pbmltYWwiKS5jbGljaygpCisgICAgICAgICMgU3RlcCAyLTMKKyAgICAgICAgc2VsZi5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0X2luX3RhYmxlKCduYXYnLCAnUGFja2FnZXMnKS5jbGljaygpCisgICAgICAgICMgY29sdW1uIC0tIFBhY2thZ2UKKyAgICAgICAgY29sdW1uX2xpc3QgPSBzZWxmLmdldF90YWJsZV9jb2x1bW5fdGV4dF9ieV9jb2x1bW5fbnVtYmVyKCdvdGFibGUnLCAxKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNfbGlzdF9zZXF1ZW5jZWQoY29sdW1uX2xpc3QpKQorICAgICAgICBzZWxmLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHRfaW5fdGFibGUoJ290YWJsZScsICdTaXplJykuY2xpY2soKQorCisKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgIyAgQ0FTRSA5NDIgICMKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMKKyAgICBkZWYgdGVzdF85NDIoc2VsZik6CisgICAgICAgIHNlbGYuY2FzZV9ubyA9IHNlbGYuZ2V0X2Nhc2VfbnVtYmVyKCkKKyAgICAgICAgc2VsZi5sb2cuaW5mbygnIENBU0UgJXMgbG9nOiAnICUgc3RyKHNlbGYuY2FzZV9ubykpCisgICAgICAgIHNlbGYuZHJpdmVyLm1heGltaXplX3dpbmRvdygpCisgICAgICAgIHNlbGYuZHJpdmVyLmdldChzZWxmLmJhc2VfdXJsKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0KCJjb3JlLWltYWdlLW1pbmltYWwiKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHQoIlBhY2thZ2VzIikuY2xpY2soKQorICAgICAgICAjZ2V0IGluaXRpYWwgdGFibGUgaGVhZGVyCisgICAgICAgIGhlYWRfbGlzdCA9IHNlbGYuZ2V0X3RhYmxlX2hlYWRfdGV4dCgnb3RhYmxlJykKKyAgICAgICAgI3JlbW92ZSB0aGUgUmVjaXBlIGNvbHVtbiBmcm9tIHRhYmxlIGhlYWRlcgorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImVkaXQtY29sdW1ucy1idXR0b24iKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgicmVjaXBlX19uYW1lIikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImVkaXQtY29sdW1ucy1idXR0b24iKS5jbGljaygpCisgICAgICAgICNnZXQgbW9kaWZpZWQgdGFibGUgaGVhZGVyCisgICAgICAgIG5ld19oZWFkID0gc2VsZi5nZXRfdGFibGVfaGVhZF90ZXh0KCdvdGFibGUnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaGVhZF9saXN0ID4gbmV3X2hlYWQpCisKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgIyAgQ0FTRSA5NDMgICMKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMKKyAgICBkZWYgdGVzdF85NDMoc2VsZik6CisgICAgICAgIHNlbGYuY2FzZV9ubyA9IHNlbGYuZ2V0X2Nhc2VfbnVtYmVyKCkKKyAgICAgICAgc2VsZi5sb2cuaW5mbygnIENBU0UgJXMgbG9nOiAnICUgc3RyKHNlbGYuY2FzZV9ubykpCisgICAgICAgIHNlbGYuZHJpdmVyLm1heGltaXplX3dpbmRvdygpCisgICAgICAgIHNlbGYuZHJpdmVyLmdldChzZWxmLmJhc2VfdXJsKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0KCJjb3JlLWltYWdlLW1pbmltYWwiKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHQoIlBhY2thZ2VzIikuY2xpY2soKQorICAgICAgICAjc2VhcmNoIGZvciB0aGUgImJhc2giIHBhY2thZ2UgLT4gdGhpcyBzaG91bGQgZGVmaW5pdGVseSBiZSBwcmVzZW50CisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgic2VhcmNoIikuY2xlYXIoKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInNlYXJjaCIpLnNlbmRfa2V5cygiYmFzaCIpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgic2VhcmNoLWJ1dHRvbiIpLmNsaWNrKCkKKyAgICAgICAgI2NoZWNrIGZvciB0aGUgc2VhcmNoIHJlc3VsdCBtZXNzYWdlICJYWCBwYWNrYWdlcyBmb3VuZCIKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHNlbGYuaXNfdGV4dF9wcmVzZW50KCJwYWNrYWdlcyBmb3VuZCIpKQorCisKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgIyAgQ0FTRSA5NDQgICMKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMKKyAgICBkZWYgdGVzdF85NDQoc2VsZik6CisgICAgICAgIHNlbGYuY2FzZV9ubyA9IHNlbGYuZ2V0X2Nhc2VfbnVtYmVyKCkKKyAgICAgICAgc2VsZi5sb2cuaW5mbygnIENBU0UgJXMgbG9nOiAnICUgc3RyKHNlbGYuY2FzZV9ubykpCisgICAgICAgIHNlbGYuZHJpdmVyLm1heGltaXplX3dpbmRvdygpCisgICAgICAgIHNlbGYuZHJpdmVyLmdldChzZWxmLmJhc2VfdXJsKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0KCJjb3JlLWltYWdlLW1pbmltYWwiKS5jbGljaygpCisgICAgICAgICMgc3RlcCAxOiB0ZXN0IFJlY2lwZXMgcGFnZSBzdHVmZgorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0KCJSZWNpcGVzIikuY2xpY2soKQorICAgICAgICAjIGZvciB0aGVzZSAzIGl0ZW1zLCBkZWZhdWx0IHN0YXR1cyBpcyBub3QtY2hlY2tlZAorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImVkaXQtY29sdW1ucy1idXR0b24iKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgibGF5ZXJfdmVyc2lvbl9fYnJhbmNoIikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImxheWVyX3ZlcnNpb25fX2xheWVyX19jb21taXQiKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgiZWRpdC1jb2x1bW5zLWJ1dHRvbiIpLmNsaWNrKCkKKyAgICAgICAgIyBvdGFibGUgaXMgdGhlIHJlY2lwZXMgdGFibGUgaGVyZQorICAgICAgICBvdGFibGVfaGVhZF90ZXh0ID0gc2VsZi5nZXRfdGFibGVfaGVhZF90ZXh0KCdvdGFibGUnKQorICAgICAgICBmb3IgaXRlbSBpbiBbIkxheWVyIiwgIkxheWVyIGJyYW5jaCIsICJMYXllciBjb21taXQiLCAiTGF5ZXIgZGlyZWN0b3J5Il06CisgICAgICAgICAgICBzZWxmLmZhaWxJZihpdGVtIG5vdCBpbiBvdGFibGVfaGVhZF90ZXh0KQorICAgICAgICAjIGNsaWNrIHRoZSBmaXN0IHJlY2lwZSwgd2hhdGV2ZXIgaXQgaXMKKyAgICAgICAgc2VsZi5nZXRfdGFibGVfZWxlbWVudCgib3RhYmxlIiwgMSwgMSkuY2xpY2soKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc2VsZi5pc190ZXh0X3ByZXNlbnQoWyJMYXllciIsICJMYXllciBicmFuY2giLCAiTGF5ZXIgY29tbWl0IiwgIlJlY2lwZSBmaWxlIl0pKQorCisgICAgICAgICMgc3RlcCAyOiB0ZXN0IFBhY2thZ2VzIHBhZ2Ugc3R1ZmYuIGFsbW9zdCBzYW1lIGFzIGFib3ZlCisgICAgICAgIHNlbGYuZHJpdmVyLmJhY2soKQorICAgICAgICBzZWxmLmJyb3dzZXJfZGVsYXkoKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0KCJQYWNrYWdlcyIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJlZGl0LWNvbHVtbnMtYnV0dG9uIikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInJlY2lwZV9fbGF5ZXJfdmVyc2lvbl9fbGF5ZXJfX25hbWUiKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgicmVjaXBlX19sYXllcl92ZXJzaW9uX19icmFuY2giKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgicmVjaXBlX19sYXllcl92ZXJzaW9uX19sYXllcl9fY29tbWl0IikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImVkaXQtY29sdW1ucy1idXR0b24iKS5jbGljaygpCisgICAgICAgIG90YWJsZV9oZWFkX3RleHQgPSBzZWxmLmdldF90YWJsZV9oZWFkX3RleHQoIm90YWJsZSIpCisgICAgICAgIGZvciBpdGVtIGluIFsiTGF5ZXIiLCAiTGF5ZXIgYnJhbmNoIiwgIkxheWVyIGNvbW1pdCJdOgorICAgICAgICAgICAgc2VsZi5mYWlsSWYoaXRlbSBub3QgaW4gb3RhYmxlX2hlYWRfdGV4dCkKKyAgICAgICAgIyBjbGljayB0aGUgZmlzdCByZWNpcGUsIHdoYXRldmVyIGl0IGlzCisgICAgICAgIHNlbGYuZ2V0X3RhYmxlX2VsZW1lbnQoIm90YWJsZSIsIDEsIDEpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHNlbGYuaXNfdGV4dF9wcmVzZW50KFsiTGF5ZXIiLCAiTGF5ZXIgYnJhbmNoIiwgIkxheWVyIGNvbW1pdCJdKSkKKworICAgICAgICAjIHN0ZXAgMzogdGVzdCBQYWNrYWdlcyBjb3JlLWltYWdlLW1pbmltYWwoaW1hZ2VzKSBzdHVmZi4gYWxtb3N0IHNhbWUgYXMgYWJvdmUuIE5vdGUgd2hlbiBmdXR1cmUgZWxlbWVudC1pZCBjaGFuZ2VzLi4uCisgICAgICAgIHNlbGYuZHJpdmVyLmJhY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0KCJjb3JlLWltYWdlLW1pbmltYWwiKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgiZWRpdC1jb2x1bW5zLWJ1dHRvbiIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJsYXllcl9uYW1lIikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImxheWVyX2JyYW5jaCIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJsYXllcl9jb21taXQiKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgiZWRpdC1jb2x1bW5zLWJ1dHRvbiIpLmNsaWNrKCkKKyAgICAgICAgb3RhYmxlX2hlYWRfdGV4dCA9IHNlbGYuZ2V0X3RhYmxlX2hlYWRfdGV4dCgib3RhYmxlIikKKyAgICAgICAgZm9yIGl0ZW0gaW4gWyJMYXllciIsICJMYXllciBicmFuY2giLCAiTGF5ZXIgY29tbWl0Il06CisgICAgICAgICAgICBzZWxmLmZhaWxJZihpdGVtIG5vdCBpbiBvdGFibGVfaGVhZF90ZXh0KQorICAgICAgICAjIGNsaWNrIHRoZSBmaXN0IHJlY2lwZSwgd2hhdGV2ZXIgaXQgaXMKKyAgICAgICAgc2VsZi5nZXRfdGFibGVfZWxlbWVudCgib3RhYmxlIiwgMSwgMSkuY2xpY2soKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc2VsZi5pc190ZXh0X3ByZXNlbnQoWyJMYXllciIsICJMYXllciBicmFuY2giLCAiTGF5ZXIgY29tbWl0Il0pKQorCisgICAgICAgICMgc3RlcCA0OiBjaGVjayBDb25maWd1cmF0aW9uIHBhZ2UKKyAgICAgICAgc2VsZi5kcml2ZXIuYmFjaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHQoIkNvbmZpZ3VyYXRpb24iKS5jbGljaygpCisgICAgICAgIG90YWJsZV9oZWFkX3RleHQgPSBzZWxmLmdldF90YWJsZV9oZWFkX3RleHQoKQorICAgICAgICBmb3IgaXRlbSBpbiBbIkxheWVyIiwgIkxheWVyIGJyYW5jaCIsICJMYXllciBjb21taXQiXToKKyAgICAgICAgICAgIHNlbGYuZmFpbElmKGl0ZW0gbm90IGluIG90YWJsZV9oZWFkX3RleHQpCisKKworICAgICAgICAjIyMjIyMjIyMjIyMjIworICAgICAgICAjICBDQVNFIDk0NSAgIworICAgICAgICAjIyMjIyMjIyMjIyMjIworICAgIGRlZiB0ZXN0Xzk0NShzZWxmKToKKyAgICAgICAgc2VsZi5jYXNlX25vID0gc2VsZi5nZXRfY2FzZV9udW1iZXIoKQorICAgICAgICBzZWxmLmxvZy5pbmZvKCcgQ0FTRSAlcyBsb2c6ICcgJSBzdHIoc2VsZi5jYXNlX25vKSkKKyAgICAgICAgc2VsZi5kcml2ZXIubWF4aW1pemVfd2luZG93KCkKKyAgICAgICAgZm9yIGl0ZW1zIGluIFsiUGFja2FnZXMiLCAiUmVjaXBlcyIsICJUYXNrcyJdOgorICAgICAgICAgICAgc2VsZi5kcml2ZXIuZ2V0KHNlbGYuYmFzZV91cmwpCisgICAgICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0KCJjb3JlLWltYWdlLW1pbmltYWwiKS5jbGljaygpCisgICAgICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0KGl0ZW1zKS5jbGljaygpCisKKyAgICAgICAgICAgICMgdGhpcyBtYXkgYmUgcGFnZSBzcGVjaWZpYy4gSWYgZnV0dXJlIHBhZ2UgY29udGVudCBjaGFuZ2VzLCB0cnkgdG8gcmVwbGFjZSBpdCB3aXRoIG5ldyB4cGF0aAorICAgICAgICAgICAgeHBhdGhfc2hvd3Jvd3MgPSAiL2h0bWwvYm9keS9kaXZbMl0vZGl2L2RpdlsyXS9kaXZbMl0vZGl2WzJdL2Rpdi9kaXYvZGl2WzJdL3NlbGVjdCIKKyAgICAgICAgICAgIHhwYXRoX3RhYmxlID0gIi9odG1sL2JvZHkvZGl2WzJdL2Rpdi9kaXZbMl0vZGl2WzJdL3RhYmxlL3Rib2R5IgorICAgICAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X3hwYXRoKHhwYXRoX3Nob3dyb3dzKS5jbGljaygpCisgICAgICAgICAgICByb3dzX2Rpc3BsYXllZCA9IGludChzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfeHBhdGgoeHBhdGhfc2hvd3Jvd3MgKyAiL29wdGlvblsyXSIpLnRleHQpCisKKyAgICAgICAgICAgICMgbm90IHN1cmUgaWYgdGhpcyBpcyBhIFNlbGVuaXVtIFNlbGVjdCBidWc6IElmIHBhZ2UgaXMgbm90IHJlZnJlc2hlZCBoZXJlLCAic2VsZWN0KGJ5IHZpc2libGUgdGV4dCkiIG9wZXJhdGlvbiB3aWxsIGdvIGJhY2sgdG8gMTAwLXJvdyBwYWdlCisgICAgICAgICAgICAjIFN1cmUgd2UgY2FuIHVzZSBkcml2ZXIuZ2V0KHVybCkgdG8gcmVmcmVzaCBwYWdlLCBidXQgc2luY2UgcGFnZSB3aWxsIHZhcnksIHdlIHVzZSBjbGljayBsaW5rIHRleHQgaGVyZQorICAgICAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dChpdGVtcykuY2xpY2soKQorICAgICAgICAgICAgU2VsZWN0KHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9jc3Nfc2VsZWN0b3IoInNlbGVjdC5wYWdlc2l6ZSIpKS5zZWxlY3RfYnlfdmlzaWJsZV90ZXh0KHN0cihyb3dzX2Rpc3BsYXllZCkpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc2VsZi5pc19lbGVtZW50X3ByZXNlbnQoQnkuWFBBVEgsIHhwYXRoX3RhYmxlICsgIi90clsiICsgc3RyKHJvd3NfZGlzcGxheWVkKSArIl0iKSkKKyAgICAgICAgICAgIHNlbGYuZmFpbElmKHNlbGYuaXNfZWxlbWVudF9wcmVzZW50KEJ5LlhQQVRILCB4cGF0aF90YWJsZSArICIvdHJbIiArIHN0cihyb3dzX2Rpc3BsYXllZCsxKSArIl0iKSkKKworICAgICAgICAgICAgIyBjbGljayAxc3QgcGFja2FnZSwgdGhlbiBnbyBiYWNrIHRvIGNoZWNrIGlmIGl0J3Mgc3RpbGwgdGhvc2Ugcm93cyBzaG93bi4KKyAgICAgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV94cGF0aCh4cGF0aF90YWJsZSArICIvdHJbMV0vdGRbMV0iKS5jbGljaygpCisgICAgICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0KGl0ZW1zKS5jbGljaygpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc2VsZi5pc19lbGVtZW50X3ByZXNlbnQoQnkuWFBBVEgsIHhwYXRoX3RhYmxlICsgIi90clsiICsgc3RyKHJvd3NfZGlzcGxheWVkKSArIl0iKSkKKyAgICAgICAgICAgIHNlbGYuZmFpbElmKHNlbGYuaXNfZWxlbWVudF9wcmVzZW50KEJ5LlhQQVRILCB4cGF0aF90YWJsZSArICIvdHJbIiArIHN0cihyb3dzX2Rpc3BsYXllZCsxKSArIl0iKSkKKworCisgICAgICAgICMjIyMjIyMjIyMjIyMjCisgICAgICAgICMgIENBU0UgOTQ2ICAjCisgICAgICAgICMjIyMjIyMjIyMjIyMjCisgICAgZGVmIHRlc3RfOTQ2KHNlbGYpOgorICAgICAgICBzZWxmLmNhc2Vfbm8gPSBzZWxmLmdldF9jYXNlX251bWJlcigpCisgICAgICAgIHNlbGYubG9nLmluZm8oJyBDQVNFICVzIGxvZzogJyAlIHN0cihzZWxmLmNhc2Vfbm8pKQorICAgICAgICBzZWxmLmRyaXZlci5tYXhpbWl6ZV93aW5kb3coKQorICAgICAgICBzZWxmLmRyaXZlci5nZXQoc2VsZi5iYXNlX3VybCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dCgiY29yZS1pbWFnZS1taW5pbWFsIikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0KCJDb25maWd1cmF0aW9uIikuY2xpY2soKQorICAgICAgICAjIHN0ZXAgMy00CisgICAgICAgIGNoZWNrX2xpc3QgPSBbIlN1bW1hcnkiLCAiQml0QmFrZSB2YXJpYWJsZXMiXQorICAgICAgICBmb3IgaXRlbSBpbiBjaGVja19saXN0OgorICAgICAgICAgICAgaWYgbm90IHNlbGYuaXNfZWxlbWVudF9wcmVzZW50KGhvdz1CeS5MSU5LX1RFWFQsIHdoYXQ9aXRlbSk6CisgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIiVzIG5vdCBmb3VuZCIgJWl0ZW0pCisgICAgICAgIGlmIG5vdCBzZWxmLmlzX3RleHRfcHJlc2VudChbJ0xheWVycycsICdMYXllcicsICdMYXllciBicmFuY2gnLCAnTGF5ZXIgY29tbWl0J10pOgorICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoInRleHQgbm90IGZvdW5kIikKKyAgICAgICAgIyBzdGVwIDUKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dCgiQml0QmFrZSB2YXJpYWJsZXMiKS5jbGljaygpCisgICAgICAgIGlmIG5vdCBzZWxmLmlzX3RleHRfcHJlc2VudChbJ1ZhcmlhYmxlJywgJ1ZhbHVlJywgJ1NldCBpbiBmaWxlJywgJ0Rlc2NyaXB0aW9uJ10pOgorICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoInRleHQgbm90IGZvdW5kIikKKyAgICAgICAgIyBUaGlzIG1heSBiZSB1bnN0YWJsZSBiZWNhdXNlIGl0J3MgcGFnZS1zcGVjaWZpYworICAgICAgICAjIHN0ZXAgNjogdGhpcyBpcyBob3cgd2UgZmluZCBmaWx0ZXIgYmVzaWRlICJTZXQgaW4gZmlsZSIKKyAgICAgICAgdGVtcF9lbGVtZW50ID0gc2VsZi5maW5kX2VsZW1lbnRfYnlfdGV4dF9pbl90YWJsZSgnb3RhYmxlJywgIlNldCBpbiBmaWxlIikKKyAgICAgICAgdGVtcF9lbGVtZW50LmZpbmRfZWxlbWVudF9ieV94cGF0aCgiLi4vLyovYS9pW0BjbGFzcz0naWNvbi1maWx0ZXIgZmlsdGVyZWQnXSIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5icm93c2VyX2RlbGF5KCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X3hwYXRoKCIoLy9pbnB1dFtAbmFtZT0nZmlsdGVyJ10pWzNdIikuY2xpY2soKQorICAgICAgICBidG5zID0gc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50c19ieV9jc3Nfc2VsZWN0b3IoImJ1dHRvbi5idG4uYnRuLXByaW1hcnkiKQorICAgICAgICBmb3IgYnRuIGluIGJ0bnM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgYnRuLmNsaWNrKCkKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIyBzYXZlIHNjcmVlbiBoZXJlCisgICAgICAgIHNlbGYuYnJvd3Nlcl9kZWxheSgpCisgICAgICAgIHNlbGYuc2F2ZV9zY3JlZW5zaG90KHNjcmVlbnNob3RfdHlwZT0nc2VsZW5pdW0nLCBhcHBlbmRfbmFtZT0nc3RlcDYnKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImVkaXQtY29sdW1ucy1idXR0b24iKS5jbGljaygpCisgICAgICAgICMgc2F2ZSBzY3JlZW4gaGVyZQorICAgICAgICAjIHN0ZXAgNworICAgICAgICAjIHdlIHNob3VsZCBtYW51YWxseSBjaGVjayB0aGUgc3RlcCA2LTggcmVzdWx0IHVzaW5nIHNjcmVlbnNob3QKKyAgICAgICAgc2VsZi5icm93c2VyX2RlbGF5KCkKKyAgICAgICAgc2VsZi5zYXZlX3NjcmVlbnNob3Qoc2NyZWVuc2hvdF90eXBlPSdzZWxlbml1bScsIGFwcGVuZF9uYW1lPSdzdGVwNycpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgiZWRpdC1jb2x1bW5zLWJ1dHRvbiIpLmNsaWNrKCkKKyAgICAgICAgIyBzdGVwIDkKKyAgICAgICAgIyBjbGljayB0aGUgMXN0IGl0ZW0sIG5vIG1hdHRlciB3aGF0IGl0IGlzCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV94cGF0aCgiLy8qW0BpZD0nb3RhYmxlJ10vdGJvZHkvdHJbMV0vdGRbMV0vYSIpLmNsaWNrKCkKKyAgICAgICAgIyBnaXZlIGl0IDEgc2VjIHNvIHRoZSBwb3AtdXAgYmVjb21lcyB0aGUgImFjdGl2ZV9lbGVtZW50IgorICAgICAgICB0aW1lLnNsZWVwKDEpCisgICAgICAgIGVsZW1lbnQgPSBzZWxmLmRyaXZlci5zd2l0Y2hfdG8uYWN0aXZlX2VsZW1lbnQKKyAgICAgICAgY2hlY2tfbGlzdCA9IFsnT3JkZXInLCAnQ29uZmlndXJhdGlvbiBmaWxlJywgJ09wZXJhdGlvbicsICdMaW5lIG51bWJlciddCisgICAgICAgIGZvciBpdGVtIGluIGNoZWNrX2xpc3Q6CisgICAgICAgICAgICBpZiBpdGVtIG5vdCBpbiBlbGVtZW50LnRleHQ6CisgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIiVzIG5vdCBmb3VuZCIgJWl0ZW0pCisgICAgICAgICMgYW55IGJldHRlciB3YXkgdG8gY2xvc2UgdGhpcyBwb3AtdXA/IC4uLiBUQkQKKyAgICAgICAgZWxlbWVudC5maW5kX2VsZW1lbnRfYnlfY2xhc3NfbmFtZSgiY2xvc2UiKS5jbGljaygpCisgICAgICAgICMgc3RlcCAxMCA6IG5lZWQgdG8gbWFudWFsbHkgY2hlY2sgIllvY3RvIE1hbnVhbCIgaW4gc2F2ZWQgc2NyZWVuCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9jc3Nfc2VsZWN0b3IoImkuaWNvbi1zaGFyZS5nZXQtaW5mbyIpLmNsaWNrKCkKKyAgICAgICAgIyBzYXZlIHNjcmVlbiBoZXJlCisgICAgICAgIHRpbWUuc2xlZXAoNSkKKyAgICAgICAgc2VsZi5zYXZlX3NjcmVlbnNob3Qoc2NyZWVuc2hvdF90eXBlPSduYXRpdmUnLCBhcHBlbmRfbmFtZT0nc3RlcDEwJykKKworCisgICAgICAgICMjIyMjIyMjIyMjIyMjCisgICAgICAgICMgIENBU0UgOTQ3ICAjCisgICAgICAgICMjIyMjIyMjIyMjIyMjCisgICAgZGVmIHRlc3RfOTQ3KHNlbGYpOgorICAgICAgICBzZWxmLmNhc2Vfbm8gPSBzZWxmLmdldF9jYXNlX251bWJlcigpCisgICAgICAgIHNlbGYubG9nLmluZm8oJyBDQVNFICVzIGxvZzogJyAlIHN0cihzZWxmLmNhc2Vfbm8pKQorICAgICAgICBzZWxmLmRyaXZlci5tYXhpbWl6ZV93aW5kb3coKQorICAgICAgICBzZWxmLmRyaXZlci5nZXQoc2VsZi5iYXNlX3VybCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dCgiY29yZS1pbWFnZS1taW5pbWFsIikuY2xpY2soKQorICAgICAgICBzZWxmLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHRfaW5fdGFibGUoJ25hdicsICdDb25maWd1cmF0aW9uJykuY2xpY2soKQorICAgICAgICAjIHN0ZXAgMgorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0KCJCaXRCYWtlIHZhcmlhYmxlcyIpLmNsaWNrKCkKKyAgICAgICAgIyBzdGVwIDMKKyAgICAgICAgZGVmIHhwYXRoX29wdGlvbihjb2x1bW5fbmFtZSk6CisgICAgICAgICAgICAjIHJldHVybiB4cGF0aCBvZiBvcHRpb25zIHVuZGVyICJFZGl0IGNvbHVtbnMiIGJ1dHRvbgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2hvcnRlc3RfeHBhdGgoJ2lkJywgJ25hdlRhYicpICsgc2VsZi5zaG9ydGVzdF94cGF0aCgnaWQnLCAnZWRpdGNvbCcpIFwKKyAgICAgICAgICAgICAgICArIHNlbGYuc2hvcnRlc3RfeHBhdGgoJ2lkJywgY29sdW1uX25hbWUpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgnZWRpdC1jb2x1bW5zLWJ1dHRvbicpLmNsaWNrKCkKKyAgICAgICAgIyBieSBkZWZhdWx0LCBvcHRpb24gIkRlc2NyaXB0aW9uIiBhbmQgIlNldCBpbiBmaWxlIiB3ZXJlIGNoZWNrZWQKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X3hwYXRoKHhwYXRoX29wdGlvbignZGVzY3JpcHRpb24nKSkuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfeHBhdGgoeHBhdGhfb3B0aW9uKCdmaWxlJykpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCdlZGl0LWNvbHVtbnMtYnV0dG9uJykuY2xpY2soKQorICAgICAgICBjaGVja19saXN0ID0gWydEZXNjcmlwdGlvbicsICdTZXQgaW4gZmlsZSddCisgICAgICAgIGhlYWRfbGlzdCA9IHNlbGYuZ2V0X3RhYmxlX2hlYWRfdGV4dCgnb3RhYmxlJykKKyAgICAgICAgZm9yIGl0ZW0gaW4gY2hlY2tfbGlzdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbElmKGl0ZW0gaW4gaGVhZF9saXN0KQorICAgICAgICAjIGNoZWNrIHRoZXNlIDIgb3B0aW9ucyBhbmQgdmVyaWZ5IGFnYWluCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgnZWRpdC1jb2x1bW5zLWJ1dHRvbicpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X3hwYXRoKHhwYXRoX29wdGlvbignZGVzY3JpcHRpb24nKSkuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfeHBhdGgoeHBhdGhfb3B0aW9uKCdmaWxlJykpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCdlZGl0LWNvbHVtbnMtYnV0dG9uJykuY2xpY2soKQorICAgICAgICBoZWFkX2xpc3QgPSBzZWxmLmdldF90YWJsZV9oZWFkX3RleHQoJ290YWJsZScpCisgICAgICAgIGZvciBpdGVtIGluIGNoZWNrX2xpc3Q6CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXRlbSBpbiBoZWFkX2xpc3QpCisKKworICAgICAgICAjIyMjIyMjIyMjIyMjIworICAgICAgICAjICBDQVNFIDk0OCAgIworICAgICAgICAjIyMjIyMjIyMjIyMjIworICAgIGRlZiB0ZXN0Xzk0OChzZWxmKToKKyAgICAgICAgc2VsZi5jYXNlX25vID0gc2VsZi5nZXRfY2FzZV9udW1iZXIoKQorICAgICAgICBzZWxmLmxvZy5pbmZvKCcgQ0FTRSAlcyBsb2c6ICcgJSBzdHIoc2VsZi5jYXNlX25vKSkKKyAgICAgICAgc2VsZi5kcml2ZXIubWF4aW1pemVfd2luZG93KCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZ2V0KHNlbGYuYmFzZV91cmwpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHQoImNvcmUtaW1hZ2UtbWluaW1hbCIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0X2luX3RhYmxlKCduYXYnLCAnQ29uZmlndXJhdGlvbicpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dCgiQml0QmFrZSB2YXJpYWJsZXMiKS5jbGljaygpCisgICAgICAgICNnZXQgbnVtYmVyIG9mIHZhcmlhYmxlcyB2aXNpYmxlIGJ5IGRlZmF1bHQKKyAgICAgICAgbnVtYmVyX2JlZm9yZV9zZWFyY2ggPSBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfY2xhc3NfbmFtZSgncGFnZS1oZWFkZXInKS50ZXh0CisgICAgICAgICMgc2VhcmNoIGZvciBhIHdoaWxlLi4uCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgic2VhcmNoIikuY2xlYXIoKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInNlYXJjaCIpLnNlbmRfa2V5cygiQkIiKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInNlYXJjaC1idXR0b24iKS5jbGljaygpCisgICAgICAgICNnZXQgbnVtYmVyIG9mIHZhcmlhYmxlcyB2aXNpYmxlIGFmdGVyIHNlYXJjaAorICAgICAgICBudW1iZXJfYWZ0ZXJfc2VhcmNoID0gc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2NsYXNzX25hbWUoJ3BhZ2UtaGVhZGVyJykudGV4dAorICAgICAgICBzZWxmLmZhaWxVbmxlc3MobnVtYmVyX2JlZm9yZV9zZWFyY2ggPiBudW1iZXJfYWZ0ZXJfc2VhcmNoKQorCisKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgIyAgQ0FTRSA5NDkgICMKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMKKyAgICBkZWYgdGVzdF85NDkoc2VsZik6CisgICAgICAgIHNlbGYuY2FzZV9ubyA9IHNlbGYuZ2V0X2Nhc2VfbnVtYmVyKCkKKyAgICAgICAgc2VsZi5sb2cuaW5mbygnIENBU0UgJXMgbG9nOiAnICUgc3RyKHNlbGYuY2FzZV9ubykpCisgICAgICAgIHNlbGYuZHJpdmVyLm1heGltaXplX3dpbmRvdygpCisgICAgICAgIHNlbGYuZHJpdmVyLmdldChzZWxmLmJhc2VfdXJsKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0KCJjb3JlLWltYWdlLW1pbmltYWwiKS5jbGljaygpCisgICAgICAgIHNlbGYuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dF9pbl90YWJsZSgnbmF2JywgJ2NvcmUtaW1hZ2UtbWluaW1hbCcpLmNsaWNrKCkKKyAgICAgICAgIyBzdGVwIDMKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X3BhcnRpYWxfbGlua190ZXh0KCJQYWNrYWdlcyBpbmNsdWRlZCIpCisgICAgICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfcGFydGlhbF9saW5rX3RleHQoIkRpcmVjdG9yeSBzdHJ1Y3R1cmUiKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uLGU6CisgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcihlKQorICAgICAgICAgICAgc2VsZi5mYWlsSWYoVHJ1ZSkKKyAgICAgICAgIyBzdGVwIDQKKyAgICAgICAgaGVhZF9saXN0ID0gc2VsZi5nZXRfdGFibGVfaGVhZF90ZXh0KCdvdGFibGUnKQorICAgICAgICBmb3IgaXRlbSBpbiBbJ1BhY2thZ2UnLCAnUGFja2FnZSB2ZXJzaW9uJywgJ1NpemUnLCAnRGVwZW5kZW5jaWVzJywgJ1JldmVyc2UgZGVwZW5kZW5jaWVzJywgJ1JlY2lwZSddOgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGl0ZW0gaW4gaGVhZF9saXN0KQorICAgICAgICAjIHN0ZXAgNS02CisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgiZWRpdC1jb2x1bW5zLWJ1dHRvbiIpLmNsaWNrKCkKKyAgICAgICAgc2VsZWN0YWJsZV9jbGFzcyA9ICdjaGVja2JveCcKKyAgICAgICAgIyBtaW5pbXVtLXRhYmxlIDogbWVhbnMgdW5zZWxlY3RhYmxlIGl0ZW1zCisgICAgICAgIHVuc2VsZWN0YWJsZV9jbGFzcyA9ICdjaGVja2JveCBtdXRlZCcKKyAgICAgICAgc2VsZWN0YWJsZV9jaGVja19saXN0ID0gWydEZXBlbmRlbmNpZXMnLCAnTGF5ZXInLCAnTGF5ZXIgYnJhbmNoJywgJ0xheWVyIGNvbW1pdCcsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMaWNlbnNlJywgJ1JlY2lwZScsICdSZWNpcGUgdmVyc2lvbicsICdSZXZlcnNlIGRlcGVuZGVuY2llcycsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTaXplJywgJ1NpemUgb3ZlciB0b3RhbCAoJSknXQorICAgICAgICB1bnNlbGVjdGFibGVfY2hlY2tfbGlzdCA9IFsnUGFja2FnZScsICdQYWNrYWdlIHZlcnNpb24nXQorICAgICAgICBzZWxlY3RhYmxlX2xpc3QgPSBsaXN0KCkKKyAgICAgICAgdW5zZWxlY3RhYmxlX2xpc3QgPSBsaXN0KCkKKyAgICAgICAgc2VsZWN0YWJsZV9lbGVtZW50cyA9IHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudHNfYnlfeHBhdGgoIi8vKltAaWQ9J2VkaXRjb2wnXS8vKltAY2xhc3M9JyIgKyBzZWxlY3RhYmxlX2NsYXNzICsgIiddIikKKyAgICAgICAgdW5zZWxlY3RhYmxlX2VsZW1lbnRzID0gc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50c19ieV94cGF0aCgiLy8qW0BpZD0nZWRpdGNvbCddLy8qW0BjbGFzcz0nIiArIHVuc2VsZWN0YWJsZV9jbGFzcyArICInXSIpCisgICAgICAgIGZvciBlbGVtZW50IGluIHNlbGVjdGFibGVfZWxlbWVudHM6CisgICAgICAgICAgICBzZWxlY3RhYmxlX2xpc3QuYXBwZW5kKGVsZW1lbnQudGV4dCkKKyAgICAgICAgZm9yIGVsZW1lbnQgaW4gdW5zZWxlY3RhYmxlX2VsZW1lbnRzOgorICAgICAgICAgICAgdW5zZWxlY3RhYmxlX2xpc3QuYXBwZW5kKGVsZW1lbnQudGV4dCkKKyAgICAgICAgIyBjaGVjayB0aGVtCisgICAgICAgIGZvciBpdGVtIGluIHNlbGVjdGFibGVfY2hlY2tfbGlzdDoKKyAgICAgICAgICAgIGlmIGl0ZW0gbm90IGluIHNlbGVjdGFibGVfbGlzdDoKKyAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigiICVzIG5vdCBmb3VuZCBpbiBkcm9wZG93biBtZW51IFxuIiAlIGl0ZW0pCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsSWYoVHJ1ZSkKKyAgICAgICAgZm9yIGl0ZW0gaW4gdW5zZWxlY3RhYmxlX2NoZWNrX2xpc3Q6CisgICAgICAgICAgICBpZiBpdGVtIG5vdCBpbiB1bnNlbGVjdGFibGVfbGlzdDoKKyAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigiICVzIG5vdCBmb3VuZCBpbiBkcm9wZG93biBtZW51IFxuIiAlIGl0ZW0pCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsSWYoVHJ1ZSkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJlZGl0LWNvbHVtbnMtYnV0dG9uIikuY2xpY2soKQorICAgICAgICAjIHN0ZXAgNworICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfcGFydGlhbF9saW5rX3RleHQoIkRpcmVjdG9yeSBzdHJ1Y3R1cmUiKS5jbGljaygpCisgICAgICAgIGhlYWRfbGlzdCA9IHNlbGYuZ2V0X3RhYmxlX2hlYWRfdGV4dCgnZGlydGFibGUnKQorICAgICAgICBmb3IgaXRlbSBpbiBbJ0RpcmVjdG9yeSAvIEZpbGUnLCAnU3ltYm9saWMgbGluayB0bycsICdTb3VyY2UgcGFja2FnZScsICdTaXplJywgJ1Blcm1pc3Npb25zJywgJ093bmVyJywgJ0dyb3VwJ106CisgICAgICAgICAgICBpZiBpdGVtIG5vdCBpbiBoZWFkX2xpc3Q6CisgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIiAlcyBub3QgZm91bmQgaW4gRGlyZWN0b3J5IHN0cnVjdHVyZSB0YWJsZSBoZWFkIFxuIiAlIGl0ZW0pCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsSWYoVHJ1ZSkKKworCisgICAgICAgICMjIyMjIyMjIyMjIyMjCisgICAgICAgICMgIENBU0UgOTUwICAjCisgICAgICAgICMjIyMjIyMjIyMjIyMjCisgICAgZGVmIHRlc3RfOTUwKHNlbGYpOgorICAgICAgICBzZWxmLmNhc2Vfbm8gPSBzZWxmLmdldF9jYXNlX251bWJlcigpCisgICAgICAgIHNlbGYubG9nLmluZm8oJyBDQVNFICVzIGxvZzogJyAlIHN0cihzZWxmLmNhc2Vfbm8pKQorICAgICAgICBzZWxmLmRyaXZlci5tYXhpbWl6ZV93aW5kb3coKQorICAgICAgICBzZWxmLmRyaXZlci5nZXQoc2VsZi5iYXNlX3VybCkKKyAgICAgICAgIyBzdGVwMyY0OiBzbyBmYXIgd2UncmUgbm90IHN1cmUgaWYgdGhlcmUncyAic3VjY2Vzc2Z1bCBidWlsZCIgb3IgImZhaWxlZAorICAgICAgICAjIGJ1aWxkIi5JZiBlaXRoZXIgb2YgdGhlbSBkb2Vzbid0IGV4aXN0LCB3ZSBjYW4gc3RpbGwgZ28gb24gb3RoZXIgc3RlcHMKKyAgICAgICAgY2hlY2tfbGlzdCA9IFsnQ29uZmlndXJhdGlvbicsICdUYXNrcycsICdSZWNpcGVzJywgJ1BhY2thZ2VzJywgJ1RpbWUnLCAnQ1BVIHVzYWdlJywgJ0Rpc2sgSS9PJ10KKyAgICAgICAgaGFzX3N1Y2Nlc3NmdWxfYnVpbGQgPSAxCisgICAgICAgIGhhc19mYWlsZWRfYnVpbGQgPSAxCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBhc3NfaWNvbiA9IHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV94cGF0aCgiLy8qW0BjbGFzcz0naWNvbi1vay1zaWduIHN1Y2Nlc3MnXSIpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICBzZWxmLmxvZy5pbmZvKCJubyBzdWNjZXNzZnVsIGJ1aWxkIGV4aXN0cyIpCisgICAgICAgICAgICBoYXNfc3VjY2Vzc2Z1bF9idWlsZCA9IDAKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgaWYgaGFzX3N1Y2Nlc3NmdWxfYnVpbGQ6CisgICAgICAgICAgICBwYXNzX2ljb24uY2xpY2soKQorICAgICAgICAgICAgIyBzYXZlIHNjcmVlbiBoZXJlIHRvIGNoZWNrIGlmIGl0IG1hdGNoZXMgcmVxdWlyZW1lbnQuCisgICAgICAgICAgICBzZWxmLmJyb3dzZXJfZGVsYXkoKQorICAgICAgICAgICAgc2VsZi5zYXZlX3NjcmVlbnNob3Qoc2NyZWVuc2hvdF90eXBlPSdzZWxlbml1bScsIGFwcGVuZF9uYW1lPSdzdGVwM18xJykKKyAgICAgICAgICAgIGZvciBpdGVtIGluIGNoZWNrX2xpc3Q6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHRfaW5fdGFibGUoJ25hdicsIGl0ZW0pCisgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoImxpbmsgICVzIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgcGFnZSIgJSBpdGVtKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWxJZihUcnVlKQorICAgICAgICAgICAgIyBzdGVwIDYKKyAgICAgICAgICAgIGNoZWNrX2xpc3RfMiA9IFsnUGFja2FnZXMgaW5jbHVkZWQnLCAnVG90YWwgcGFja2FnZSBzaXplJywgXAorICAgICAgICAgICAgICAgICAgICAgICdMaWNlbnNlIG1hbmlmZXN0JywgJ0ltYWdlIGZpbGVzJ10KKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzZWxmLmlzX3RleHRfcHJlc2VudChjaGVja19saXN0XzIpKQorICAgICAgICAgICAgc2VsZi5kcml2ZXIuYmFjaygpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZhaWxfaWNvbiA9IHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV94cGF0aCgiLy8qW0BjbGFzcz0naWNvbi1taW51cy1zaWduIGVycm9yJ10iKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgaGFzX2ZhaWxlZF9idWlsZCA9IDAKKyAgICAgICAgICAgIHNlbGYubG9nLmluZm8oIm5vIGZhaWxlZCBidWlsZCBleGlzdHMiKQorICAgICAgICAgICAgcGFzcworICAgICAgICBpZiBoYXNfZmFpbGVkX2J1aWxkOgorICAgICAgICAgICAgZmFpbF9pY29uLmNsaWNrKCkKKyAgICAgICAgICAgICMgc2F2ZSBzY3JlZW4gaGVyZSB0byBjaGVjayBpZiBpdCBtYXRjaGVzIHJlcXVpcmVtZW50LgorICAgICAgICAgICAgc2VsZi5icm93c2VyX2RlbGF5KCkKKyAgICAgICAgICAgIHNlbGYuc2F2ZV9zY3JlZW5zaG90KHNjcmVlbnNob3RfdHlwZT0nc2VsZW5pdW0nLCBhcHBlbmRfbmFtZT0nc3RlcDNfMicpCisgICAgICAgICAgICBmb3IgaXRlbSBpbiBjaGVja19saXN0OgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0X2luX3RhYmxlKCduYXYnLCBpdGVtKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCJsaW5rICAlcyBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIHBhZ2UiICUgaXRlbSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsSWYoVHJ1ZSkKKyAgICAgICAgICAgICMgc3RlcCA3IGludm9sdmVkCisgICAgICAgICAgICBjaGVja19saXN0XzMgPSBbJ01hY2hpbmUnLCAnRGlzdHJvJywgJ0xheWVycycsICdUb3RhbCBudW1iZXIgb2YgdGFza3MnLCAnVGFza3MgZXhlY3V0ZWQnLCBcCisgICAgICAgICAgICAgICAgICAgICAgJ1Rhc2tzIG5vdCBleGVjdXRlZCcsICdSZXVzZScsICdSZWNpcGVzIGJ1aWx0JywgJ1BhY2thZ2VzIGJ1aWx0J10KKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzZWxmLmlzX3RleHRfcHJlc2VudChjaGVja19saXN0XzMpKQorICAgICAgICAgICAgc2VsZi5kcml2ZXIuYmFjaygpCisKKworICAgICAgICAjIyMjIyMjIyMjIyMjIworICAgICAgICAjICBDQVNFIDk1MSAgIworICAgICAgICAjIyMjIyMjIyMjIyMjIworICAgIGRlZiB0ZXN0Xzk1MShzZWxmKToKKyAgICAgICAgc2VsZi5jYXNlX25vID0gc2VsZi5nZXRfY2FzZV9udW1iZXIoKQorICAgICAgICBzZWxmLmxvZy5pbmZvKCcgQ0FTRSAlcyBsb2c6ICcgJSBzdHIoc2VsZi5jYXNlX25vKSkKKyAgICAgICAgc2VsZi5kcml2ZXIubWF4aW1pemVfd2luZG93KCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZ2V0KHNlbGYuYmFzZV91cmwpCisgICAgICAgICMgY3VycmVudGx5IHRlc3QgY2FzZSBpdHNlbGYgaXNuJ3QgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nICIxIHN1Y2Nlc3NmdWwgYW5kCisgICAgICAgICMgMSBmYWlsZWQgYnVpbGQiCisgICAgICAgIGhhc19zdWNjZXNzZnVsX2J1aWxkID0gMQorICAgICAgICBoYXNfZmFpbGVkX2J1aWxkID0gMQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmYWlsX2ljb24gPSBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfeHBhdGgoIi8vKltAY2xhc3M9J2ljb24tbWludXMtc2lnbiBlcnJvciddIikKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIGhhc19mYWlsZWRfYnVpbGQgPSAwCisgICAgICAgICAgICBzZWxmLmxvZy5pbmZvKCJubyBmYWlsZWQgYnVpbGQgZXhpc3RzIikKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIyBpZiB0aGVyZSdzIGZhaWxlZCBidWlsZCwgd2UgY2FuIHByb2NlZWQKKyAgICAgICAgaWYgaGFzX2ZhaWxlZF9idWlsZDoKKyAgICAgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9wYXJ0aWFsX2xpbmtfdGV4dCgiZXJyb3IiKS5jbGljaygpCisgICAgICAgICAgICBzZWxmLmRyaXZlci5iYWNrKCkKKyAgICAgICAgIyBub3Qgc3VyZSBpZiB0aGVyZSAibXVzdCBiZSIgc29tZSB3YXJuaW5ncywgc28gaGVyZSBzYXZlIGEgc2NyZWVuCisgICAgICAgIHNlbGYuYnJvd3Nlcl9kZWxheSgpCisgICAgICAgIHNlbGYuc2F2ZV9zY3JlZW5zaG90KHNjcmVlbnNob3RfdHlwZT0nc2VsZW5pdW0nLCBhcHBlbmRfbmFtZT0nc3RlcDQnKQorCisKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgIyAgQ0FTRSA5NTUgICMKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMKKyAgICBkZWYgdGVzdF85NTUoc2VsZik6CisgICAgICAgIHNlbGYuY2FzZV9ubyA9IHNlbGYuZ2V0X2Nhc2VfbnVtYmVyKCkKKyAgICAgICAgc2VsZi5sb2cuaW5mbygnIENBU0UgJXMgbG9nOiAnICUgc3RyKHNlbGYuY2FzZV9ubykpCisgICAgICAgIHNlbGYuZHJpdmVyLm1heGltaXplX3dpbmRvdygpCisgICAgICAgIHNlbGYuZHJpdmVyLmdldChzZWxmLmJhc2VfdXJsKQorICAgICAgICBzZWxmLmxvZy5pbmZvKCIgWW91IHNob3VsZCBtYW51YWxseSBjcmVhdGUgYWxsIGltYWdlcyBiZWZvcmUgdGVzdCBzdGFydHMhIikKKyAgICAgICAgIyBTbyBmYXIgdGhlIGNhc2UgaXRzZWxmIGlzIG5vdCByZXNwb25zYWJsZSBmb3IgY3JlYXRpbmcgYWxsIHNvcnRzIG9mIGltYWdlcy4KKyAgICAgICAgIyBTbyBhc3N1bWluZyB0aGV5IGFyZSBhbHJlYWR5IHRoZXJlCisgICAgICAgICMgc3RlcCAyCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHQoImNvcmUtaW1hZ2UtbWluaW1hbCIpLmNsaWNrKCkKKyAgICAgICAgIyBzYXZlIHNjcmVlbiBoZXJlIHRvIHNlZSB0aGUgcGFnZSBjb21wb25lbnQKKworCisgICAgICAgICMjIyMjIyMjIyMjIyMjCisgICAgICAgICMgIENBU0UgOTU2ICAjCisgICAgICAgICMjIyMjIyMjIyMjIyMjCisgICAgZGVmIHRlc3RfOTU2KHNlbGYpOgorICAgICAgICBzZWxmLmNhc2Vfbm8gPSBzZWxmLmdldF9jYXNlX251bWJlcigpCisgICAgICAgIHNlbGYubG9nLmluZm8oJyBDQVNFICVzIGxvZzogJyAlIHN0cihzZWxmLmNhc2Vfbm8pKQorICAgICAgICBzZWxmLmRyaXZlci5tYXhpbWl6ZV93aW5kb3coKQorICAgICAgICBzZWxmLmRyaXZlci5nZXQoc2VsZi5iYXNlX3VybCkKKyAgICAgICAgIyBzdGVwIDItMyBuZWVkIHRvIHJ1biBtYW51YWxseQorICAgICAgICBzZWxmLmxvZy5pbmZvKCJzdGVwIDItMzogY2hlY2tpbmcgdGhlIGhlbHAgbWVzc2FnZSB3aGVuIHlvdSBob3ZlciBvbiBoZWxwIGljb24gb2YgdGFyZ2V0LFwKKyAgICAgICAgICAgICAgICAgICAgICAgdGFza3MsIHJlY2lwZXMsIHBhY2thZ2VzIG5lZWQgdG8gcnVuIG1hbnVhbGx5IikKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X3BhcnRpYWxfbGlua190ZXh0KCJUb2FzdGVyIG1hbnVhbCIpLmNsaWNrKCkKKyAgICAgICAgaWYgbm90IHNlbGYuaXNfdGV4dF9wcmVzZW50KCJUb2FzdGVyIE1hbnVhbCIpOgorICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoInBsZWFzZSBjaGVjayBbVG9hc3RlciBtYW51YWxdIGxpbmsgb24gcGFnZSIpCisgICAgICAgICAgICBzZWxmLmZhaWxJZihUcnVlKQorCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvdHRzL3RvYXN0ZXJ1aXRlc3QvdG9hc3Rlcl90ZXN0LmNmZyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi90dHMvdG9hc3RlcnVpdGVzdC90b2FzdGVyX3Rlc3QuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MDVmOWEKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvdHRzL3RvYXN0ZXJ1aXRlc3QvdG9hc3Rlcl90ZXN0LmNmZwpAQCAtMCwwICsxLDIxIEBACisjIENvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdG9hc3Rlcl90ZXN0CisjIFNvcnRlZCBieSBkaWZmZXJlbnQgaG9zdCB0eXBlCisKKyMgdGVzdCBicm93c2VyIGNvdWxkIGJlOiBmaXJlZm94OyBjaHJvbWU7IGllKHN0aWxsIHVuZGVyIGRldmVsb3BtZW50KQorIyBsb2dnaW5nX2xldmVsIGNvdWxkIGJlOiBDUklUSUNBTDsgRVJST1I7IFdBUk5JTkc7IElORk87IERFQlVHOyBOT1RTRVQKKworCitbdG9hc3Rlcl90ZXN0X2xpbnV4XQordG9hc3Rlcl91cmwgPSAnaHR0cDovLzEyNy4wLjAuMTo4MDAwJwordGVzdF9icm93c2VyID0gJ2ZpcmVmb3gnCit0ZXN0X2Nhc2VzID0gWzk0Nl0KK2xvZ2dpbmdfbGV2ZWwgPSAnSU5GTycKKworCitbdG9hc3Rlcl90ZXN0X3dpbmRvd3NdCit0b2FzdGVyX3VybCA9ICdodHRwOi8vMTI3LjAuMC4xOjgwMDAnCit0ZXN0X2Jyb3dzZXIgPSBbJ2llJywgJ2ZpcmVmb3gnLCAnY2hyb21lJ10KK3Rlc3RfY2FzZXMgPSBbOTAxLCA5MDIsIDkwM10KK2xvZ2dpbmdfbGV2ZWwgPSAnREVCVUcnCisKKwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL3R0cy91cmxjaGVjay5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi90dHMvdXJsY2hlY2sucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgyMGY4MgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi90dHMvdXJsY2hlY2sucHkKQEAgLTAsMCArMSw1MyBAQAorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgoraW1wb3J0IHN5cworCitpbXBvcnQgaHR0cGxpYjIKK2ltcG9ydCBjb25maWcKK2ltcG9ydCB1cmxsaXN0CisKKworY29uZmlnLmxvZ2dlci5pbmZvKCJUZXN0aW5nICVzIHdpdGggJXMiLCBjb25maWcuVE9BU1RFUl9CQVNFVVJMLCBjb25maWcuVzNDX1ZBTElEQVRPUikKKworZGVmIHZhbGlkYXRlX2h0bWw1KHVybCk6CisgICAgaHR0cF9jbGllbnQgPSBodHRwbGliMi5IdHRwKE5vbmUpCisgICAgc3RhdHVzID0gIkZhaWxlZCIKKyAgICBlcnJvcnMgPSAtMQorICAgIHdhcm5pbmdzID0gLTEKKworICAgIHVybHJlcXVlc3QgPSBjb25maWcuVzNDX1ZBTElEQVRPUit1cmwKKworICAgICMgcHlsaW50OiBkaXNhYmxlPWJyb2FkLWV4Y2VwdAorICAgICMgd2UgZGlzYWJsZSB0aGUgYnJvYWQtZXhjZXB0IGJlY2F1c2Ugd2Ugd2FudCB0byBhY3R1YWxseSBjYXRjaCBhbGwgcG9zc2libGUgZXhjZXB0aW9ucworICAgIHRyeToKKyAgICAgICAgcmVzcCwgXyA9IGh0dHBfY2xpZW50LnJlcXVlc3QodXJscmVxdWVzdCwgIkhFQUQiKQorICAgICAgICBpZiByZXNwWyd4LXczYy12YWxpZGF0b3Itc3RhdHVzJ10gIT0gIkFib3J0IjoKKyAgICAgICAgICAgIHN0YXR1cyA9IHJlc3BbJ3gtdzNjLXZhbGlkYXRvci1zdGF0dXMnXQorICAgICAgICAgICAgZXJyb3JzID0gaW50KHJlc3BbJ3gtdzNjLXZhbGlkYXRvci1lcnJvcnMnXSkKKyAgICAgICAgICAgIHdhcm5pbmdzID0gaW50KHJlc3BbJ3gtdzNjLXZhbGlkYXRvci13YXJuaW5ncyddKQorCisgICAgICAgICAgICBpZiBzdGF0dXMgPT0gJ0ludmFsaWQnOgorICAgICAgICAgICAgICAgIGNvbmZpZy5sb2dnZXIud2FybigiRmFpbGVkICVzIGlzICVzXHRlcnJvcnMgJXMgd2FybmluZ3MgJXMgKGNoZWNrIGF0ICVzKSIsIHVybCwgc3RhdHVzLCBlcnJvcnMsIHdhcm5pbmdzLCB1cmxyZXF1ZXN0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjb25maWcubG9nZ2VyLmRlYnVnKCJPSyEgJXMiLCB1cmwpCisKKyAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoKKyAgICAgICAgY29uZmlnLmxvZ2dlci53YXJuKCJGYWlsZWQgdmFsaWRhdGlvbiBjYWxsOiAlcyIsIGV4YykKKyAgICByZXR1cm4gKHN0YXR1cywgZXJyb3JzLCB3YXJuaW5ncykKKworCitkZWYgcHJpbnRfdmFsaWRhdGlvbih1cmwpOgorICAgIHN0YXR1cywgZXJyb3JzLCB3YXJuaW5ncyA9IHZhbGlkYXRlX2h0bWw1KHVybCkKKyAgICBjb25maWcubG9nZ2VyLmVycm9yKCJ1cmwgJXMgaXMgJXNcdGVycm9ycyAlcyB3YXJuaW5ncyAlcyAoY2hlY2sgYXQgJXMpIiwgdXJsLCBzdGF0dXMsIGVycm9ycywgd2FybmluZ3MsIGNvbmZpZy5XM0NfVkFMSURBVE9SK3VybCkKKworCitkZWYgbWFpbigpOgorICAgIHByaW50KCJUZXN0aW5nICVzIHdpdGggJXMiICUgKGNvbmZpZy5UT0FTVEVSX0JBU0VVUkwsIGNvbmZpZy5XM0NfVkFMSURBVE9SKSkKKworICAgIGlmIGxlbihzeXMuYXJndikgPiAxOgorICAgICAgICBwcmludF92YWxpZGF0aW9uKHN5cy5hcmd2WzFdKQorICAgIGVsc2U6CisgICAgICAgIGZvciB1cmwgaW4gdXJsbGlzdC5VUkxTOgorICAgICAgICAgICAgcHJpbnRfdmFsaWRhdGlvbihjb25maWcuVE9BU1RFUl9CQVNFVVJMK3VybCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi90dHMvdXJsbGlzdC5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi90dHMvdXJsbGlzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGI5ZmZjCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL3R0cy91cmxsaXN0LnB5CkBAIC0wLDAgKzEsMzkgQEAKK1VSTFMgPSBbCisgICAgJ3RvYXN0ZXJndWkvbGFuZGluZy8nLAorICAgICd0b2FzdGVyZ3VpL2J1aWxkcy8nLAorICAgICd0b2FzdGVyZ3VpL2J1aWxkLzEnLAorICAgICd0b2FzdGVyZ3VpL2J1aWxkLzEvdGFza3MvJywKKyAgICAndG9hc3Rlcmd1aS9idWlsZC8xL3Rhc2tzLzEvJywKKyAgICAndG9hc3Rlcmd1aS9idWlsZC8xL3Rhc2svMScsCisgICAgJ3RvYXN0ZXJndWkvYnVpbGQvMS9yZWNpcGVzLycsCisgICAgJ3RvYXN0ZXJndWkvYnVpbGQvMS9yZWNpcGUvMS9hY3RpdmVfdGFiLzEnLAorICAgICd0b2FzdGVyZ3VpL2J1aWxkLzEvcmVjaXBlLzEnLAorICAgICd0b2FzdGVyZ3VpL2J1aWxkLzEvcmVjaXBlX3BhY2thZ2VzLzEnLAorICAgICd0b2FzdGVyZ3VpL2J1aWxkLzEvcGFja2FnZXMvJywKKyAgICAndG9hc3Rlcmd1aS9idWlsZC8xL3BhY2thZ2UvMScsCisgICAgJ3RvYXN0ZXJndWkvYnVpbGQvMS9wYWNrYWdlX2J1aWx0X2RlcGVuZGVuY2llcy8xJywKKyAgICAndG9hc3Rlcmd1aS9idWlsZC8xL3BhY2thZ2VfaW5jbHVkZWRfZGV0YWlsLzEvMScsCisgICAgJ3RvYXN0ZXJndWkvYnVpbGQvMS9wYWNrYWdlX2luY2x1ZGVkX2RlcGVuZGVuY2llcy8xLzEnLAorICAgICd0b2FzdGVyZ3VpL2J1aWxkLzEvcGFja2FnZV9pbmNsdWRlZF9yZXZlcnNlX2RlcGVuZGVuY2llcy8xLzEnLAorICAgICd0b2FzdGVyZ3VpL2J1aWxkLzEvdGFyZ2V0LzEnLAorICAgICd0b2FzdGVyZ3VpL2J1aWxkLzEvdGFyZ2V0LzEvdGFyZ2V0cGtnJywKKyAgICAndG9hc3Rlcmd1aS9idWlsZC8xL3RhcmdldC8xL2RpcmluZm8nLAorICAgICd0b2FzdGVyZ3VpL2J1aWxkLzEvdGFyZ2V0LzEvZGlyaW5mb19maWxlcGF0aC9fL2Jpbi9iYXNoJywKKyAgICAndG9hc3Rlcmd1aS9idWlsZC8xL2NvbmZpZ3VyYXRpb24nLAorICAgICd0b2FzdGVyZ3VpL2J1aWxkLzEvY29uZmlndmFycycsCisgICAgJ3RvYXN0ZXJndWkvYnVpbGQvMS9idWlsZHRpbWUnLAorICAgICd0b2FzdGVyZ3VpL2J1aWxkLzEvY3B1dXNhZ2UnLAorICAgICd0b2FzdGVyZ3VpL2J1aWxkLzEvZGlza2lvJywKKyAgICAndG9hc3Rlcmd1aS9idWlsZC8xL3RhcmdldC8xL3BhY2thZ2VmaWxlLzEnLAorICAgICd0b2FzdGVyZ3VpL25ld3Byb2plY3QvJywKKyAgICAndG9hc3Rlcmd1aS9wcm9qZWN0cy8nLAorICAgICd0b2FzdGVyZ3VpL3Byb2plY3QvMScsCisgICAgJ3RvYXN0ZXJndWkvcHJvamVjdC8xL2NvbmZpZ3VyYXRpb24nLAorICAgICd0b2FzdGVyZ3VpL3Byb2plY3QvMS9idWlsZHMvJywKKyAgICAndG9hc3Rlcmd1aS9wcm9qZWN0LzEvbGF5ZXJzLycsCisgICAgJ3RvYXN0ZXJndWkvcHJvamVjdC8xL2xheWVyLzEnLAorICAgICd0b2FzdGVyZ3VpL3Byb2plY3QvMS9pbXBvcnRsYXllcicsCisgICAgJ3RvYXN0ZXJndWkvcHJvamVjdC8xL3RhcmdldHMvJywKKyAgICAndG9hc3Rlcmd1aS9wcm9qZWN0LzEvbWFjaGluZXMvJywKKyAgICAndG9hc3Rlcmd1aS8nLAorXQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9tYW5hZ2UucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL21hbmFnZS5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jZWFhMTFiCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9tYW5hZ2UucHkKQEAgLTAsMCArMSwxMCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBvcy5lbnZpcm9uLnNldGRlZmF1bHQoIkRKQU5HT19TRVRUSU5HU19NT0RVTEUiLCAidG9hc3Rlcm1haW4uc2V0dGluZ3MiKQorCisgICAgZnJvbSBkamFuZ28uY29yZS5tYW5hZ2VtZW50IGltcG9ydCBleGVjdXRlX2Zyb21fY29tbWFuZF9saW5lCisKKyAgICBleGVjdXRlX2Zyb21fY29tbWFuZF9saW5lKHN5cy5hcmd2KQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vX19pbml0X18ucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vX19pbml0X18ucHkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21hbmFnZW1lbnQvX19pbml0X18ucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9tYW5hZ2VtZW50L19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9tYW5hZ2VtZW50L19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9tYW5hZ2VtZW50L2NvbW1hbmRzL19faW5pdF9fLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWFuYWdlbWVudC9jb21tYW5kcy9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWFuYWdlbWVudC9jb21tYW5kcy9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWFuYWdlbWVudC9jb21tYW5kcy9sc3VwZGF0ZXMucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9tYW5hZ2VtZW50L2NvbW1hbmRzL2xzdXBkYXRlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWU5NTEzCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWFuYWdlbWVudC9jb21tYW5kcy9sc3VwZGF0ZXMucHkKQEAgLTAsMCArMSwxMiBAQAorZnJvbSBkamFuZ28uY29yZS5tYW5hZ2VtZW50LmJhc2UgaW1wb3J0IE5vQXJnc0NvbW1hbmQsIENvbW1hbmRFcnJvcgorZnJvbSBvcm0ubW9kZWxzIGltcG9ydCBMYXllclNvdXJjZQoraW1wb3J0IG9zCisKK2NsYXNzIENvbW1hbmQoTm9BcmdzQ29tbWFuZCk6CisgICAgYXJncyAgICA9ICIiCisgICAgaGVscCAgICA9ICJVcGRhdGVzIGxvY2FsbHkgY2FjaGVkIGluZm9ybWF0aW9uIGZyb20gYWxsIExheWVyU291cmNlcyIKKworCisgICAgZGVmIGhhbmRsZV9ub2FyZ3Moc2VsZiwgKipvcHRpb25zKToKKyAgICAgICAgZm9yIGxzIGluIExheWVyU291cmNlLm9iamVjdHMuYWxsKCk6CisgICAgICAgICAgICBscy51cGRhdGUoKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDAxX2luaXRpYWwucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMDFfaW5pdGlhbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWRlZWY4Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDAxX2luaXRpYWwucHkKQEAgLTAsMCArMSw0MDAgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCitmcm9tIHNvdXRoLnV0aWxzIGltcG9ydCBkYXRldGltZV91dGlscyBhcyBkYXRldGltZQorZnJvbSBzb3V0aC5kYiBpbXBvcnQgZGIKK2Zyb20gc291dGgudjIgaW1wb3J0IFNjaGVtYU1pZ3JhdGlvbgorZnJvbSBkamFuZ28uZGIgaW1wb3J0IG1vZGVscworCisKK2NsYXNzIE1pZ3JhdGlvbihTY2hlbWFNaWdyYXRpb24pOgorCisgICAgZGVmIGZvcndhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgQWRkaW5nIG1vZGVsICdCdWlsZCcKKyAgICAgICAgZGIuY3JlYXRlX3RhYmxlKHUnb3JtX2J1aWxkJywgKAorICAgICAgICAgICAgKHUnaWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnKShwcmltYXJ5X2tleT1UcnVlKSksCisgICAgICAgICAgICAoJ21hY2hpbmUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTEwMCkpLAorICAgICAgICAgICAgKCdpbWFnZV9mc3R5cGVzJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0xMDApKSwKKyAgICAgICAgICAgICgnZGlzdHJvJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0xMDApKSwKKyAgICAgICAgICAgICgnZGlzdHJvX3ZlcnNpb24nLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTEwMCkpLAorICAgICAgICAgICAgKCdzdGFydGVkX29uJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcpKCkpLAorICAgICAgICAgICAgKCdjb21wbGV0ZWRfb24nLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJykoKSksCisgICAgICAgICAgICAoJ291dGNvbWUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnKShkZWZhdWx0PTIpKSwKKyAgICAgICAgICAgICgnZXJyb3JzX25vJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJykoZGVmYXVsdD0wKSksCisgICAgICAgICAgICAoJ3dhcm5pbmdzX25vJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJykoZGVmYXVsdD0wKSksCisgICAgICAgICAgICAoJ2Nvb2tlcl9sb2dfcGF0aCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9NTAwKSksCisgICAgICAgICAgICAoJ2J1aWxkX25hbWUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTEwMCkpLAorICAgICAgICAgICAgKCdiaXRiYWtlX3ZlcnNpb24nLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTUwKSksCisgICAgICAgICkpCisgICAgICAgIGRiLnNlbmRfY3JlYXRlX3NpZ25hbCh1J29ybScsIFsnQnVpbGQnXSkKKworICAgICAgICAjIEFkZGluZyBtb2RlbCAnVGFyZ2V0JworICAgICAgICBkYi5jcmVhdGVfdGFibGUodSdvcm1fdGFyZ2V0JywgKAorICAgICAgICAgICAgKHUnaWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnKShwcmltYXJ5X2tleT1UcnVlKSksCisgICAgICAgICAgICAoJ2J1aWxkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykodG89b3JtWydvcm0uQnVpbGQnXSkpLAorICAgICAgICAgICAgKCd0YXJnZXQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTEwMCkpLAorICAgICAgICAgICAgKCdpc19pbWFnZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcpKGRlZmF1bHQ9RmFsc2UpKSwKKyAgICAgICAgICAgICgnZmlsZV9uYW1lJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0xMDApKSwKKyAgICAgICAgICAgICgnZmlsZV9zaXplJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJykoKSksCisgICAgICAgICkpCisgICAgICAgIGRiLnNlbmRfY3JlYXRlX3NpZ25hbCh1J29ybScsIFsnVGFyZ2V0J10pCisKKyAgICAgICAgIyBBZGRpbmcgbW9kZWwgJ1Rhc2snCisgICAgICAgIGRiLmNyZWF0ZV90YWJsZSh1J29ybV90YXNrJywgKAorICAgICAgICAgICAgKHUnaWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnKShwcmltYXJ5X2tleT1UcnVlKSksCisgICAgICAgICAgICAoJ2J1aWxkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykocmVsYXRlZF9uYW1lPSd0YXNrX2J1aWxkJywgdG89b3JtWydvcm0uQnVpbGQnXSkpLAorICAgICAgICAgICAgKCdvcmRlcicsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcpKG51bGw9VHJ1ZSkpLAorICAgICAgICAgICAgKCd0YXNrX2V4ZWN1dGVkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJykoZGVmYXVsdD1GYWxzZSkpLAorICAgICAgICAgICAgKCdvdXRjb21lJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJykoZGVmYXVsdD01KSksCisgICAgICAgICAgICAoJ3NzdGF0ZV9jaGVja3N1bScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MTAwLCBibGFuaz1UcnVlKSksCisgICAgICAgICAgICAoJ3BhdGhfdG9fc3N0YXRlX29iaicsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnKShtYXhfbGVuZ3RoPTUwMCwgYmxhbms9VHJ1ZSkpLAorICAgICAgICAgICAgKCdyZWNpcGUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKShyZWxhdGVkX25hbWU9J2J1aWxkX3JlY2lwZScsIHRvPW9ybVsnb3JtLlJlY2lwZSddKSksCisgICAgICAgICAgICAoJ3Rhc2tfbmFtZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MTAwKSksCisgICAgICAgICAgICAoJ3NvdXJjZV91cmwnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJykobWF4X2xlbmd0aD0yNTUsIGJsYW5rPVRydWUpKSwKKyAgICAgICAgICAgICgnd29ya19kaXJlY3RvcnknLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJykobWF4X2xlbmd0aD0yNTUsIGJsYW5rPVRydWUpKSwKKyAgICAgICAgICAgICgnc2NyaXB0X3R5cGUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnKShkZWZhdWx0PTApKSwKKyAgICAgICAgICAgICgnbGluZV9udW1iZXInLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnKShkZWZhdWx0PTApKSwKKyAgICAgICAgICAgICgnZGlza19pbycsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcpKG51bGw9VHJ1ZSkpLAorICAgICAgICAgICAgKCdjcHVfdXNhZ2UnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EZWNpbWFsRmllbGQnKShudWxsPVRydWUsIG1heF9kaWdpdHM9NiwgZGVjaW1hbF9wbGFjZXM9MikpLAorICAgICAgICAgICAgKCdlbGFwc2VkX3RpbWUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShkZWZhdWx0PTAsIG1heF9sZW5ndGg9NTApKSwKKyAgICAgICAgICAgICgnc3N0YXRlX3Jlc3VsdCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcpKGRlZmF1bHQ9MCkpLAorICAgICAgICAgICAgKCdtZXNzYWdlJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0yNDApKSwKKyAgICAgICAgICAgICgnbG9nZmlsZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnKShtYXhfbGVuZ3RoPTI1NSwgYmxhbms9VHJ1ZSkpLAorICAgICAgICApKQorICAgICAgICBkYi5zZW5kX2NyZWF0ZV9zaWduYWwodSdvcm0nLCBbJ1Rhc2snXSkKKworICAgICAgICAjIEFkZGluZyBtb2RlbCAnVGFza19EZXBlbmRlbmN5JworICAgICAgICBkYi5jcmVhdGVfdGFibGUodSdvcm1fdGFza19kZXBlbmRlbmN5JywgKAorICAgICAgICAgICAgKHUnaWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnKShwcmltYXJ5X2tleT1UcnVlKSksCisgICAgICAgICAgICAoJ3Rhc2snLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKShyZWxhdGVkX25hbWU9J3Rhc2tfZGVwZW5kZW5jaWVzX3Rhc2snLCB0bz1vcm1bJ29ybS5UYXNrJ10pKSwKKyAgICAgICAgICAgICgnZGVwZW5kc19vbicsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHJlbGF0ZWRfbmFtZT0ndGFza19kZXBlbmRlbmNpZXNfZGVwZW5kcycsIHRvPW9ybVsnb3JtLlRhc2snXSkpLAorICAgICAgICApKQorICAgICAgICBkYi5zZW5kX2NyZWF0ZV9zaWduYWwodSdvcm0nLCBbJ1Rhc2tfRGVwZW5kZW5jeSddKQorCisgICAgICAgICMgQWRkaW5nIG1vZGVsICdQYWNrYWdlJworICAgICAgICBkYi5jcmVhdGVfdGFibGUodSdvcm1fcGFja2FnZScsICgKKyAgICAgICAgICAgICh1J2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJykocHJpbWFyeV9rZXk9VHJ1ZSkpLAorICAgICAgICAgICAgKCdidWlsZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHRvPW9ybVsnb3JtLkJ1aWxkJ10pKSwKKyAgICAgICAgICAgICgncmVjaXBlJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykodG89b3JtWydvcm0uUmVjaXBlJ10sIG51bGw9VHJ1ZSkpLAorICAgICAgICAgICAgKCduYW1lJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0xMDApKSwKKyAgICAgICAgICAgICgndmVyc2lvbicsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MTAwLCBibGFuaz1UcnVlKSksCisgICAgICAgICAgICAoJ3JldmlzaW9uJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0zMiwgYmxhbms9VHJ1ZSkpLAorICAgICAgICAgICAgKCdzdW1tYXJ5Jywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0yMDAsIGJsYW5rPVRydWUpKSwKKyAgICAgICAgICAgICgnZGVzY3JpcHRpb24nLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTIwMCwgYmxhbms9VHJ1ZSkpLAorICAgICAgICAgICAgKCdzaXplJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJykoZGVmYXVsdD0wKSksCisgICAgICAgICAgICAoJ2luc3RhbGxlZF9zaXplJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJykoZGVmYXVsdD0wKSksCisgICAgICAgICAgICAoJ3NlY3Rpb24nLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTgwLCBibGFuaz1UcnVlKSksCisgICAgICAgICAgICAoJ2xpY2Vuc2UnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTgwLCBibGFuaz1UcnVlKSksCisgICAgICAgICkpCisgICAgICAgIGRiLnNlbmRfY3JlYXRlX3NpZ25hbCh1J29ybScsIFsnUGFja2FnZSddKQorCisgICAgICAgICMgQWRkaW5nIG1vZGVsICdQYWNrYWdlX0RlcGVuZGVuY3knCisgICAgICAgIGRiLmNyZWF0ZV90YWJsZSh1J29ybV9wYWNrYWdlX2RlcGVuZGVuY3knLCAoCisgICAgICAgICAgICAodSdpZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcpKHByaW1hcnlfa2V5PVRydWUpKSwKKyAgICAgICAgICAgICgncGFja2FnZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHJlbGF0ZWRfbmFtZT0ncGFja2FnZV9kZXBlbmRlbmNpZXNfc291cmNlJywgdG89b3JtWydvcm0uUGFja2FnZSddKSksCisgICAgICAgICAgICAoJ2RlcGVuZHNfb24nLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKShyZWxhdGVkX25hbWU9J3BhY2thZ2VfZGVwZW5kZW5jaWVzX3RhcmdldCcsIHRvPW9ybVsnb3JtLlBhY2thZ2UnXSkpLAorICAgICAgICAgICAgKCdkZXBfdHlwZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcpKCkpLAorICAgICAgICAgICAgKCd0YXJnZXQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKSh0bz1vcm1bJ29ybS5UYXJnZXQnXSwgbnVsbD1UcnVlKSksCisgICAgICAgICkpCisgICAgICAgIGRiLnNlbmRfY3JlYXRlX3NpZ25hbCh1J29ybScsIFsnUGFja2FnZV9EZXBlbmRlbmN5J10pCisKKyAgICAgICAgIyBBZGRpbmcgbW9kZWwgJ1RhcmdldF9JbnN0YWxsZWRfUGFja2FnZScKKyAgICAgICAgZGIuY3JlYXRlX3RhYmxlKHUnb3JtX3RhcmdldF9pbnN0YWxsZWRfcGFja2FnZScsICgKKyAgICAgICAgICAgICh1J2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJykocHJpbWFyeV9rZXk9VHJ1ZSkpLAorICAgICAgICAgICAgKCd0YXJnZXQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKSh0bz1vcm1bJ29ybS5UYXJnZXQnXSkpLAorICAgICAgICAgICAgKCdwYWNrYWdlJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykodG89b3JtWydvcm0uUGFja2FnZSddKSksCisgICAgICAgICkpCisgICAgICAgIGRiLnNlbmRfY3JlYXRlX3NpZ25hbCh1J29ybScsIFsnVGFyZ2V0X0luc3RhbGxlZF9QYWNrYWdlJ10pCisKKyAgICAgICAgIyBBZGRpbmcgbW9kZWwgJ1BhY2thZ2VfRmlsZScKKyAgICAgICAgZGIuY3JlYXRlX3RhYmxlKHUnb3JtX3BhY2thZ2VfZmlsZScsICgKKyAgICAgICAgICAgICh1J2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJykocHJpbWFyeV9rZXk9VHJ1ZSkpLAorICAgICAgICAgICAgKCdwYWNrYWdlJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykocmVsYXRlZF9uYW1lPSdidWlsZGZpbGVsaXN0X3BhY2thZ2UnLCB0bz1vcm1bJ29ybS5QYWNrYWdlJ10pKSwKKyAgICAgICAgICAgICgncGF0aCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnKShtYXhfbGVuZ3RoPTI1NSwgYmxhbms9VHJ1ZSkpLAorICAgICAgICAgICAgKCdzaXplJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJykoKSksCisgICAgICAgICkpCisgICAgICAgIGRiLnNlbmRfY3JlYXRlX3NpZ25hbCh1J29ybScsIFsnUGFja2FnZV9GaWxlJ10pCisKKyAgICAgICAgIyBBZGRpbmcgbW9kZWwgJ1JlY2lwZScKKyAgICAgICAgZGIuY3JlYXRlX3RhYmxlKHUnb3JtX3JlY2lwZScsICgKKyAgICAgICAgICAgICh1J2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJykocHJpbWFyeV9rZXk9VHJ1ZSkpLAorICAgICAgICAgICAgKCduYW1lJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0xMDAsIGJsYW5rPVRydWUpKSwKKyAgICAgICAgICAgICgndmVyc2lvbicsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MTAwLCBibGFuaz1UcnVlKSksCisgICAgICAgICAgICAoJ2xheWVyX3ZlcnNpb24nLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKShyZWxhdGVkX25hbWU9J3JlY2lwZV9sYXllcl92ZXJzaW9uJywgdG89b3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddKSksCisgICAgICAgICAgICAoJ3N1bW1hcnknLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTEwMCwgYmxhbms9VHJ1ZSkpLAorICAgICAgICAgICAgKCdkZXNjcmlwdGlvbicsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MTAwLCBibGFuaz1UcnVlKSksCisgICAgICAgICAgICAoJ3NlY3Rpb24nLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTEwMCwgYmxhbms9VHJ1ZSkpLAorICAgICAgICAgICAgKCdsaWNlbnNlJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0yMDAsIGJsYW5rPVRydWUpKSwKKyAgICAgICAgICAgICgnbGljZW5zaW5nX2luZm8nLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnKShibGFuaz1UcnVlKSksCisgICAgICAgICAgICAoJ2hvbWVwYWdlJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnKShtYXhfbGVuZ3RoPTIwMCwgYmxhbms9VHJ1ZSkpLAorICAgICAgICAgICAgKCdidWd0cmFja2VyJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnKShtYXhfbGVuZ3RoPTIwMCwgYmxhbms9VHJ1ZSkpLAorICAgICAgICAgICAgKCdmaWxlX3BhdGgnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJykobWF4X2xlbmd0aD0yNTUpKSwKKyAgICAgICAgKSkKKyAgICAgICAgZGIuc2VuZF9jcmVhdGVfc2lnbmFsKHUnb3JtJywgWydSZWNpcGUnXSkKKworICAgICAgICAjIEFkZGluZyBtb2RlbCAnUmVjaXBlX0RlcGVuZGVuY3knCisgICAgICAgIGRiLmNyZWF0ZV90YWJsZSh1J29ybV9yZWNpcGVfZGVwZW5kZW5jeScsICgKKyAgICAgICAgICAgICh1J2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJykocHJpbWFyeV9rZXk9VHJ1ZSkpLAorICAgICAgICAgICAgKCdyZWNpcGUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKShyZWxhdGVkX25hbWU9J3JfZGVwZW5kZW5jaWVzX3JlY2lwZScsIHRvPW9ybVsnb3JtLlJlY2lwZSddKSksCisgICAgICAgICAgICAoJ2RlcGVuZHNfb24nLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKShyZWxhdGVkX25hbWU9J3JfZGVwZW5kZW5jaWVzX2RlcGVuZHMnLCB0bz1vcm1bJ29ybS5SZWNpcGUnXSkpLAorICAgICAgICAgICAgKCdkZXBfdHlwZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcpKCkpLAorICAgICAgICApKQorICAgICAgICBkYi5zZW5kX2NyZWF0ZV9zaWduYWwodSdvcm0nLCBbJ1JlY2lwZV9EZXBlbmRlbmN5J10pCisKKyAgICAgICAgIyBBZGRpbmcgbW9kZWwgJ0xheWVyJworICAgICAgICBkYi5jcmVhdGVfdGFibGUodSdvcm1fbGF5ZXInLCAoCisgICAgICAgICAgICAodSdpZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcpKHByaW1hcnlfa2V5PVRydWUpKSwKKyAgICAgICAgICAgICgnbmFtZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MTAwKSksCisgICAgICAgICAgICAoJ2xvY2FsX3BhdGgnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJykobWF4X2xlbmd0aD0yNTUpKSwKKyAgICAgICAgICAgICgnbGF5ZXJfaW5kZXhfdXJsJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnKShtYXhfbGVuZ3RoPTIwMCkpLAorICAgICAgICApKQorICAgICAgICBkYi5zZW5kX2NyZWF0ZV9zaWduYWwodSdvcm0nLCBbJ0xheWVyJ10pCisKKyAgICAgICAgIyBBZGRpbmcgbW9kZWwgJ0xheWVyX1ZlcnNpb24nCisgICAgICAgIGRiLmNyZWF0ZV90YWJsZSh1J29ybV9sYXllcl92ZXJzaW9uJywgKAorICAgICAgICAgICAgKHUnaWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnKShwcmltYXJ5X2tleT1UcnVlKSksCisgICAgICAgICAgICAoJ2J1aWxkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykocmVsYXRlZF9uYW1lPSdsYXllcl92ZXJzaW9uX2J1aWxkJywgdG89b3JtWydvcm0uQnVpbGQnXSkpLAorICAgICAgICAgICAgKCdsYXllcicsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHJlbGF0ZWRfbmFtZT0nbGF5ZXJfdmVyc2lvbl9sYXllcicsIHRvPW9ybVsnb3JtLkxheWVyJ10pKSwKKyAgICAgICAgICAgICgnYnJhbmNoJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD01MCkpLAorICAgICAgICAgICAgKCdjb21taXQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTEwMCkpLAorICAgICAgICAgICAgKCdwcmlvcml0eScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcpKCkpLAorICAgICAgICApKQorICAgICAgICBkYi5zZW5kX2NyZWF0ZV9zaWduYWwodSdvcm0nLCBbJ0xheWVyX1ZlcnNpb24nXSkKKworICAgICAgICAjIEFkZGluZyBtb2RlbCAnVmFyaWFibGUnCisgICAgICAgIGRiLmNyZWF0ZV90YWJsZSh1J29ybV92YXJpYWJsZScsICgKKyAgICAgICAgICAgICh1J2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJykocHJpbWFyeV9rZXk9VHJ1ZSkpLAorICAgICAgICAgICAgKCdidWlsZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHJlbGF0ZWRfbmFtZT0ndmFyaWFibGVfYnVpbGQnLCB0bz1vcm1bJ29ybS5CdWlsZCddKSksCisgICAgICAgICAgICAoJ3ZhcmlhYmxlX25hbWUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTEwMCkpLAorICAgICAgICAgICAgKCd2YXJpYWJsZV92YWx1ZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcpKGJsYW5rPVRydWUpKSwKKyAgICAgICAgICAgICgnY2hhbmdlZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcpKGRlZmF1bHQ9RmFsc2UpKSwKKyAgICAgICAgICAgICgnaHVtYW5fcmVhZGFibGVfbmFtZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MjAwKSksCisgICAgICAgICAgICAoJ2Rlc2NyaXB0aW9uJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJykoYmxhbms9VHJ1ZSkpLAorICAgICAgICApKQorICAgICAgICBkYi5zZW5kX2NyZWF0ZV9zaWduYWwodSdvcm0nLCBbJ1ZhcmlhYmxlJ10pCisKKyAgICAgICAgIyBBZGRpbmcgbW9kZWwgJ1ZhcmlhYmxlSGlzdG9yeScKKyAgICAgICAgZGIuY3JlYXRlX3RhYmxlKHUnb3JtX3ZhcmlhYmxlaGlzdG9yeScsICgKKyAgICAgICAgICAgICh1J2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJykocHJpbWFyeV9rZXk9VHJ1ZSkpLAorICAgICAgICAgICAgKCd2YXJpYWJsZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHRvPW9ybVsnb3JtLlZhcmlhYmxlJ10pKSwKKyAgICAgICAgICAgICgnZmlsZV9uYW1lJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcpKG1heF9sZW5ndGg9MjU1KSksCisgICAgICAgICAgICAoJ2xpbmVfbnVtYmVyJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJykobnVsbD1UcnVlKSksCisgICAgICAgICAgICAoJ29wZXJhdGlvbicsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MTYpKSwKKyAgICAgICAgKSkKKyAgICAgICAgZGIuc2VuZF9jcmVhdGVfc2lnbmFsKHUnb3JtJywgWydWYXJpYWJsZUhpc3RvcnknXSkKKworICAgICAgICAjIEFkZGluZyBtb2RlbCAnTG9nTWVzc2FnZScKKyAgICAgICAgZGIuY3JlYXRlX3RhYmxlKHUnb3JtX2xvZ21lc3NhZ2UnLCAoCisgICAgICAgICAgICAodSdpZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcpKHByaW1hcnlfa2V5PVRydWUpKSwKKyAgICAgICAgICAgICgnYnVpbGQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKSh0bz1vcm1bJ29ybS5CdWlsZCddKSksCisgICAgICAgICAgICAoJ2xldmVsJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJykoZGVmYXVsdD0wKSksCisgICAgICAgICAgICAoJ21lc3NhZ2UnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTI0MCkpLAorICAgICAgICAgICAgKCdwYXRobmFtZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnKShtYXhfbGVuZ3RoPTI1NSwgYmxhbms9VHJ1ZSkpLAorICAgICAgICAgICAgKCdsaW5lbm8nLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnKShudWxsPVRydWUpKSwKKyAgICAgICAgKSkKKyAgICAgICAgZGIuc2VuZF9jcmVhdGVfc2lnbmFsKHUnb3JtJywgWydMb2dNZXNzYWdlJ10pCisKKworICAgIGRlZiBiYWNrd2FyZHMoc2VsZiwgb3JtKToKKyAgICAgICAgIyBEZWxldGluZyBtb2RlbCAnQnVpbGQnCisgICAgICAgIGRiLmRlbGV0ZV90YWJsZSh1J29ybV9idWlsZCcpCisKKyAgICAgICAgIyBEZWxldGluZyBtb2RlbCAnVGFyZ2V0JworICAgICAgICBkYi5kZWxldGVfdGFibGUodSdvcm1fdGFyZ2V0JykKKworICAgICAgICAjIERlbGV0aW5nIG1vZGVsICdUYXNrJworICAgICAgICBkYi5kZWxldGVfdGFibGUodSdvcm1fdGFzaycpCisKKyAgICAgICAgIyBEZWxldGluZyBtb2RlbCAnVGFza19EZXBlbmRlbmN5JworICAgICAgICBkYi5kZWxldGVfdGFibGUodSdvcm1fdGFza19kZXBlbmRlbmN5JykKKworICAgICAgICAjIERlbGV0aW5nIG1vZGVsICdQYWNrYWdlJworICAgICAgICBkYi5kZWxldGVfdGFibGUodSdvcm1fcGFja2FnZScpCisKKyAgICAgICAgIyBEZWxldGluZyBtb2RlbCAnUGFja2FnZV9EZXBlbmRlbmN5JworICAgICAgICBkYi5kZWxldGVfdGFibGUodSdvcm1fcGFja2FnZV9kZXBlbmRlbmN5JykKKworICAgICAgICAjIERlbGV0aW5nIG1vZGVsICdUYXJnZXRfSW5zdGFsbGVkX1BhY2thZ2UnCisgICAgICAgIGRiLmRlbGV0ZV90YWJsZSh1J29ybV90YXJnZXRfaW5zdGFsbGVkX3BhY2thZ2UnKQorCisgICAgICAgICMgRGVsZXRpbmcgbW9kZWwgJ1BhY2thZ2VfRmlsZScKKyAgICAgICAgZGIuZGVsZXRlX3RhYmxlKHUnb3JtX3BhY2thZ2VfZmlsZScpCisKKyAgICAgICAgIyBEZWxldGluZyBtb2RlbCAnUmVjaXBlJworICAgICAgICBkYi5kZWxldGVfdGFibGUodSdvcm1fcmVjaXBlJykKKworICAgICAgICAjIERlbGV0aW5nIG1vZGVsICdSZWNpcGVfRGVwZW5kZW5jeScKKyAgICAgICAgZGIuZGVsZXRlX3RhYmxlKHUnb3JtX3JlY2lwZV9kZXBlbmRlbmN5JykKKworICAgICAgICAjIERlbGV0aW5nIG1vZGVsICdMYXllcicKKyAgICAgICAgZGIuZGVsZXRlX3RhYmxlKHUnb3JtX2xheWVyJykKKworICAgICAgICAjIERlbGV0aW5nIG1vZGVsICdMYXllcl9WZXJzaW9uJworICAgICAgICBkYi5kZWxldGVfdGFibGUodSdvcm1fbGF5ZXJfdmVyc2lvbicpCisKKyAgICAgICAgIyBEZWxldGluZyBtb2RlbCAnVmFyaWFibGUnCisgICAgICAgIGRiLmRlbGV0ZV90YWJsZSh1J29ybV92YXJpYWJsZScpCisKKyAgICAgICAgIyBEZWxldGluZyBtb2RlbCAnVmFyaWFibGVIaXN0b3J5JworICAgICAgICBkYi5kZWxldGVfdGFibGUodSdvcm1fdmFyaWFibGVoaXN0b3J5JykKKworICAgICAgICAjIERlbGV0aW5nIG1vZGVsICdMb2dNZXNzYWdlJworICAgICAgICBkYi5kZWxldGVfdGFibGUodSdvcm1fbG9nbWVzc2FnZScpCisKKworICAgIG1vZGVscyA9IHsKKyAgICAgICAgdSdvcm0uYnVpbGQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQnVpbGQnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnYnVpbGRfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnY29tcGxldGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdjb29rZXJfbG9nX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Rybyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZGlzdHJvX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Vycm9yc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpbWFnZV9mc3R5cGVzJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdtYWNoaW5lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzInfSksCisgICAgICAgICAgICAnc3RhcnRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnd2FybmluZ3Nfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdMYXllcid9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9pbmRleF91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICAnbG9jYWxfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVyX3ZlcnNpb24nOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnTGF5ZXJfVmVyc2lvbid9LAorICAgICAgICAgICAgJ2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidsYXllcl92ZXJzaW9uX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjb21taXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidsYXllcl92ZXJzaW9uX2xheWVyJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXInXSJ9KSwKKyAgICAgICAgICAgICdwcmlvcml0eSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sb2dtZXNzYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0xvZ01lc3NhZ2UnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xldmVsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbGluZW5vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWVzc2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNDAnfSksCisgICAgICAgICAgICAncGF0aG5hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW5zdGFsbGVkX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JldmlzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzMyJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncGFja2FnZV9kZXBlbmRlbmNpZXNfdGFyZ2V0JyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3BhY2thZ2VfZGVwZW5kZW5jaWVzX3NvdXJjZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSIsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRmlsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkZmlsZWxpc3RfcGFja2FnZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICdwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlY2lwZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWNpcGUnfSwKKyAgICAgICAgICAgICdidWd0cmFja2VyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZmlsZV9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAnaG9tZXBhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyZWNpcGVfbGF5ZXJfdmVyc2lvbiciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xpY2Vuc2luZ19pbmZvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVjaXBlX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVjaXBlX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX2RlcGVuZHMnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX3JlY2lwZSciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXQnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnZmlsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdmaWxlX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2lzX2ltYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2luc3RhbGxlZF9wYWNrYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9JbnN0YWxsZWRfUGFja2FnZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhc2snOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb3JkZXJpbmcnOiAiKCdvcmRlcicsICdyZWNpcGUnKSIsICdvYmplY3RfbmFtZSc6ICdUYXNrJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY3B1X3VzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EZWNpbWFsRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnLCAnbWF4X2RpZ2l0cyc6ICc2JywgJ2RlY2ltYWxfcGxhY2VzJzogJzInfSksCisgICAgICAgICAgICAnZGlza19pbyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2VsYXBzZWRfdGltZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJywgJ21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xpbmVfbnVtYmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbG9nZmlsZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWVzc2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNDAnfSksCisgICAgICAgICAgICAnb3JkZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzUnfSksCisgICAgICAgICAgICAncGF0aF90b19zc3RhdGVfb2JqJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInYnVpbGRfcmVjaXBlJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSksCisgICAgICAgICAgICAnc2NyaXB0X3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzb3VyY2VfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzc3RhdGVfY2hlY2tzdW0nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3N0YXRlX3Jlc3VsdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3Rhc2tfZXhlY3V0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAndGFza19uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd3b3JrX2RpcmVjdG9yeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFza19kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Rhc2tfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19kZXBlbmRlbmNpZXNfZGVwZW5kcyciLCAndG8nOiB1Im9ybVsnb3JtLlRhc2snXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2RlcGVuZGVuY2llc190YXNrJyIsICd0byc6IHUib3JtWydvcm0uVGFzayddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnZhcmlhYmxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1ZhcmlhYmxlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndmFyaWFibGVfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NoYW5nZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnaHVtYW5fcmVhZGFibGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlX3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnZhcmlhYmxlaGlzdG9yeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdWYXJpYWJsZUhpc3RvcnknfSwKKyAgICAgICAgICAgICdmaWxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGluZV9udW1iZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvcGVyYXRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTYnfSksCisgICAgICAgICAgICAndmFyaWFibGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5WYXJpYWJsZSddIn0pCisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb21wbGV0ZV9hcHBzID0gWydvcm0nXQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDAyX2F1dG9fX2FkZF9maWVsZF9idWlsZF90aW1lc3BlbnQucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMDJfYXV0b19fYWRkX2ZpZWxkX2J1aWxkX3RpbWVzcGVudC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTQyMWNhCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDAyX2F1dG9fX2FkZF9maWVsZF9idWlsZF90aW1lc3BlbnQucHkKQEAgLTAsMCArMSwxODAgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCitmcm9tIHNvdXRoLnV0aWxzIGltcG9ydCBkYXRldGltZV91dGlscyBhcyBkYXRldGltZQorZnJvbSBzb3V0aC5kYiBpbXBvcnQgZGIKK2Zyb20gc291dGgudjIgaW1wb3J0IFNjaGVtYU1pZ3JhdGlvbgorZnJvbSBkamFuZ28uZGIgaW1wb3J0IG1vZGVscworCisKK2NsYXNzIE1pZ3JhdGlvbihTY2hlbWFNaWdyYXRpb24pOgorCisgICAgZGVmIGZvcndhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgQWRkaW5nIGZpZWxkICdCdWlsZC50aW1lc3BlbnQnCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fYnVpbGQnLCAndGltZXNwZW50JywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnKShkZWZhdWx0PTApLAorICAgICAgICAgICAgICAgICAgICAgIGtlZXBfZGVmYXVsdD1GYWxzZSkKKworCisgICAgZGVmIGJhY2t3YXJkcyhzZWxmLCBvcm0pOgorICAgICAgICAjIERlbGV0aW5nIGZpZWxkICdCdWlsZC50aW1lc3BlbnQnCisgICAgICAgIGRiLmRlbGV0ZV9jb2x1bW4odSdvcm1fYnVpbGQnLCAndGltZXNwZW50JykKKworCisgICAgbW9kZWxzID0geworICAgICAgICB1J29ybS5idWlsZCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZCd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdidWlsZF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdjb21wbGV0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2Nvb2tlcl9sb2dfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnfSksCisgICAgICAgICAgICAnZGlzdHJvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm9fdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZXJyb3JzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2ltYWdlX2ZzdHlwZXMnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ21hY2hpbmUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMid9KSwKKyAgICAgICAgICAgICdzdGFydGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICd0aW1lc3BlbnQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnd2FybmluZ3Nfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdMYXllcid9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9pbmRleF91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICAnbG9jYWxfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVyX3ZlcnNpb24nOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnTGF5ZXJfVmVyc2lvbid9LAorICAgICAgICAgICAgJ2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidsYXllcl92ZXJzaW9uX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjb21taXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidsYXllcl92ZXJzaW9uX2xheWVyJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXInXSJ9KSwKKyAgICAgICAgICAgICdwcmlvcml0eSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sb2dtZXNzYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0xvZ01lc3NhZ2UnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xldmVsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbGluZW5vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWVzc2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNDAnfSksCisgICAgICAgICAgICAncGF0aG5hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW5zdGFsbGVkX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JldmlzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzMyJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncGFja2FnZV9kZXBlbmRlbmNpZXNfdGFyZ2V0JyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3BhY2thZ2VfZGVwZW5kZW5jaWVzX3NvdXJjZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSIsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRmlsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkZmlsZWxpc3RfcGFja2FnZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICdwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlY2lwZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWNpcGUnfSwKKyAgICAgICAgICAgICdidWd0cmFja2VyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZmlsZV9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAnaG9tZXBhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyZWNpcGVfbGF5ZXJfdmVyc2lvbiciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xpY2Vuc2luZ19pbmZvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVjaXBlX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVjaXBlX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX2RlcGVuZHMnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX3JlY2lwZSciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXQnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnZmlsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdmaWxlX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2lzX2ltYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2luc3RhbGxlZF9wYWNrYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9JbnN0YWxsZWRfUGFja2FnZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhc2snOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb3JkZXJpbmcnOiAiKCdvcmRlcicsICdyZWNpcGUnKSIsICdvYmplY3RfbmFtZSc6ICdUYXNrJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY3B1X3VzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EZWNpbWFsRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnLCAnbWF4X2RpZ2l0cyc6ICc2JywgJ2RlY2ltYWxfcGxhY2VzJzogJzInfSksCisgICAgICAgICAgICAnZGlza19pbyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2VsYXBzZWRfdGltZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJywgJ21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xpbmVfbnVtYmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbG9nZmlsZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWVzc2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNDAnfSksCisgICAgICAgICAgICAnb3JkZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzUnfSksCisgICAgICAgICAgICAncGF0aF90b19zc3RhdGVfb2JqJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInYnVpbGRfcmVjaXBlJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSksCisgICAgICAgICAgICAnc2NyaXB0X3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzb3VyY2VfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzc3RhdGVfY2hlY2tzdW0nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3N0YXRlX3Jlc3VsdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3Rhc2tfZXhlY3V0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAndGFza19uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd3b3JrX2RpcmVjdG9yeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFza19kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Rhc2tfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19kZXBlbmRlbmNpZXNfZGVwZW5kcyciLCAndG8nOiB1Im9ybVsnb3JtLlRhc2snXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2RlcGVuZGVuY2llc190YXNrJyIsICd0byc6IHUib3JtWydvcm0uVGFzayddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnZhcmlhYmxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1ZhcmlhYmxlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndmFyaWFibGVfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NoYW5nZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnaHVtYW5fcmVhZGFibGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlX3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnZhcmlhYmxlaGlzdG9yeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdWYXJpYWJsZUhpc3RvcnknfSwKKyAgICAgICAgICAgICdmaWxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGluZV9udW1iZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvcGVyYXRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTYnfSksCisgICAgICAgICAgICAndmFyaWFibGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndmhpc3RvcnknIiwgJ3RvJzogdSJvcm1bJ29ybS5WYXJpYWJsZSddIn0pCisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb21wbGV0ZV9hcHBzID0gWydvcm0nXQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDAzX3RpbWVzcGVudC5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAwM190aW1lc3BlbnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYwMGY5ZQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAwM190aW1lc3BlbnQucHkKQEAgLTAsMCArMSwxODIgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCitmcm9tIHNvdXRoLnV0aWxzIGltcG9ydCBkYXRldGltZV91dGlscyBhcyBkYXRldGltZQorZnJvbSBzb3V0aC5kYiBpbXBvcnQgZGIKK2Zyb20gc291dGgudjIgaW1wb3J0IERhdGFNaWdyYXRpb24KK2Zyb20gZGphbmdvLmRiIGltcG9ydCBtb2RlbHMKKworY2xhc3MgTWlncmF0aW9uKERhdGFNaWdyYXRpb24pOgorCisgICAgZGVmIGZvcndhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICJXcml0ZSB5b3VyIGZvcndhcmRzIG1ldGhvZHMgaGVyZS4iCisgICAgICAgICMgTm90ZTogRG9uJ3QgdXNlICJmcm9tIGFwcG5hbWUubW9kZWxzIGltcG9ydCBNb2RlbE5hbWUiLgorICAgICAgICAjIFVzZSBvcm0uTW9kZWxOYW1lIHRvIHJlZmVyIHRvIG1vZGVscyBpbiB0aGlzIGFwcGxpY2F0aW9uLAorICAgICAgICAjIGFuZCBvcm1bJ2FwcG5hbWUuTW9kZWxOYW1lJ10gZm9yIG1vZGVscyBpbiBvdGhlciBhcHBsaWNhdGlvbnMuCisKKyAgICAgICAgZm9yIGJ1aWxkIGluIG9ybS5CdWlsZC5vYmplY3RzLmFsbCgpOgorICAgICAgICAgICAgYnVpbGQudGltZXNwZW50ID0gaW50KChidWlsZC5jb21wbGV0ZWRfb24gLSBidWlsZC5zdGFydGVkX29uKS50b3RhbF9zZWNvbmRzKCkpCisgICAgICAgICAgICBidWlsZC5zYXZlKCkKKworICAgIGRlZiBiYWNrd2FyZHMoc2VsZiwgb3JtKToKKyAgICAgICAgIldyaXRlIHlvdXIgYmFja3dhcmRzIG1ldGhvZHMgaGVyZS4iCisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiQ2Fubm90IHJldmVyc2UgdGhpcyBtaWdyYXRpb24uIikKKworICAgIG1vZGVscyA9IHsKKyAgICAgICAgdSdvcm0uYnVpbGQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQnVpbGQnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnYnVpbGRfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnY29tcGxldGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdjb29rZXJfbG9nX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Rybyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZGlzdHJvX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Vycm9yc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpbWFnZV9mc3R5cGVzJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdtYWNoaW5lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzInfSksCisgICAgICAgICAgICAnc3RhcnRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAndGltZXNwZW50JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnd2FybmluZ3Nfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdMYXllcid9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9pbmRleF91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICAnbG9jYWxfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVyX3ZlcnNpb24nOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnTGF5ZXJfVmVyc2lvbid9LAorICAgICAgICAgICAgJ2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidsYXllcl92ZXJzaW9uX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjb21taXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidsYXllcl92ZXJzaW9uX2xheWVyJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXInXSJ9KSwKKyAgICAgICAgICAgICdwcmlvcml0eSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sb2dtZXNzYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0xvZ01lc3NhZ2UnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xldmVsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbGluZW5vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWVzc2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNDAnfSksCisgICAgICAgICAgICAncGF0aG5hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW5zdGFsbGVkX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JldmlzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzMyJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncGFja2FnZV9kZXBlbmRlbmNpZXNfdGFyZ2V0JyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3BhY2thZ2VfZGVwZW5kZW5jaWVzX3NvdXJjZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSIsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRmlsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkZmlsZWxpc3RfcGFja2FnZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICdwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlY2lwZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWNpcGUnfSwKKyAgICAgICAgICAgICdidWd0cmFja2VyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZmlsZV9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAnaG9tZXBhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyZWNpcGVfbGF5ZXJfdmVyc2lvbiciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xpY2Vuc2luZ19pbmZvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVjaXBlX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVjaXBlX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX2RlcGVuZHMnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX3JlY2lwZSciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXQnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnZmlsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdmaWxlX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2lzX2ltYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2luc3RhbGxlZF9wYWNrYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9JbnN0YWxsZWRfUGFja2FnZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhc2snOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb3JkZXJpbmcnOiAiKCdvcmRlcicsICdyZWNpcGUnKSIsICdvYmplY3RfbmFtZSc6ICdUYXNrJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY3B1X3VzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EZWNpbWFsRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnLCAnbWF4X2RpZ2l0cyc6ICc2JywgJ2RlY2ltYWxfcGxhY2VzJzogJzInfSksCisgICAgICAgICAgICAnZGlza19pbyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2VsYXBzZWRfdGltZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJywgJ21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xpbmVfbnVtYmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbG9nZmlsZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWVzc2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNDAnfSksCisgICAgICAgICAgICAnb3JkZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzUnfSksCisgICAgICAgICAgICAncGF0aF90b19zc3RhdGVfb2JqJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInYnVpbGRfcmVjaXBlJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSksCisgICAgICAgICAgICAnc2NyaXB0X3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzb3VyY2VfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzc3RhdGVfY2hlY2tzdW0nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3N0YXRlX3Jlc3VsdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3Rhc2tfZXhlY3V0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAndGFza19uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd3b3JrX2RpcmVjdG9yeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFza19kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Rhc2tfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19kZXBlbmRlbmNpZXNfZGVwZW5kcyciLCAndG8nOiB1Im9ybVsnb3JtLlRhc2snXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2RlcGVuZGVuY2llc190YXNrJyIsICd0byc6IHUib3JtWydvcm0uVGFzayddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnZhcmlhYmxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1ZhcmlhYmxlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndmFyaWFibGVfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NoYW5nZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnaHVtYW5fcmVhZGFibGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlX3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnZhcmlhYmxlaGlzdG9yeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdWYXJpYWJsZUhpc3RvcnknfSwKKyAgICAgICAgICAgICdmaWxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGluZV9udW1iZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvcGVyYXRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTYnfSksCisgICAgICAgICAgICAndmFyaWFibGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndmhpc3RvcnknIiwgJ3RvJzogdSJvcm1bJ29ybS5WYXJpYWJsZSddIn0pCisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb21wbGV0ZV9hcHBzID0gWydvcm0nXQorICAgIHN5bW1ldHJpY2FsID0gVHJ1ZQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDA0X2F1dG9fX2FkZF9maWVsZF9wYWNrYWdlX2luc3RhbGxlZF9uYW1lLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDA0X2F1dG9fX2FkZF9maWVsZF9wYWNrYWdlX2luc3RhbGxlZF9uYW1lLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNDQ0NWIKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMDRfYXV0b19fYWRkX2ZpZWxkX3BhY2thZ2VfaW5zdGFsbGVkX25hbWUucHkKQEAgLTAsMCArMSwxODEgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCitmcm9tIHNvdXRoLnV0aWxzIGltcG9ydCBkYXRldGltZV91dGlscyBhcyBkYXRldGltZQorZnJvbSBzb3V0aC5kYiBpbXBvcnQgZGIKK2Zyb20gc291dGgudjIgaW1wb3J0IFNjaGVtYU1pZ3JhdGlvbgorZnJvbSBkamFuZ28uZGIgaW1wb3J0IG1vZGVscworCisKK2NsYXNzIE1pZ3JhdGlvbihTY2hlbWFNaWdyYXRpb24pOgorCisgICAgZGVmIGZvcndhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgQWRkaW5nIGZpZWxkICdQYWNrYWdlLmluc3RhbGxlZF9uYW1lJworICAgICAgICBkYi5hZGRfY29sdW1uKHUnb3JtX3BhY2thZ2UnLCAnaW5zdGFsbGVkX25hbWUnLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKGRlZmF1bHQ9JycsIG1heF9sZW5ndGg9MTAwKSwKKyAgICAgICAgICAgICAgICAgICAgICBrZWVwX2RlZmF1bHQ9RmFsc2UpCisKKworICAgIGRlZiBiYWNrd2FyZHMoc2VsZiwgb3JtKToKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnUGFja2FnZS5pbnN0YWxsZWRfbmFtZScKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV9wYWNrYWdlJywgJ2luc3RhbGxlZF9uYW1lJykKKworCisgICAgbW9kZWxzID0geworICAgICAgICB1J29ybS5idWlsZCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZCd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdidWlsZF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdjb21wbGV0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2Nvb2tlcl9sb2dfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnfSksCisgICAgICAgICAgICAnZGlzdHJvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm9fdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZXJyb3JzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2ltYWdlX2ZzdHlwZXMnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ21hY2hpbmUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMid9KSwKKyAgICAgICAgICAgICdzdGFydGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICd0aW1lc3BlbnQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd3YXJuaW5nc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVyJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0xheWVyJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX2luZGV4X3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCd9KSwKKyAgICAgICAgICAgICdsb2NhbF9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXJfdmVyc2lvbic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdMYXllcl9WZXJzaW9uJ30sCisgICAgICAgICAgICAnYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2xheWVyX3ZlcnNpb25fYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NvbW1pdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2xheWVyX3ZlcnNpb25fbGF5ZXInIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllciddIn0pLAorICAgICAgICAgICAgJ3ByaW9yaXR5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxvZ21lc3NhZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnTG9nTWVzc2FnZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGV2ZWwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsaW5lbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtZXNzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI0MCd9KSwKKyAgICAgICAgICAgICdwYXRobmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpbnN0YWxsZWRfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICInJyIsICdtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdpbnN0YWxsZWRfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xpY2Vuc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnODAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAncmV2aXNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMzInLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzZWN0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3N1bW1hcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZV9EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwX3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidwYWNrYWdlX2RlcGVuZGVuY2llc190YXJnZXQnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhY2thZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncGFja2FnZV9kZXBlbmRlbmNpZXNfc291cmNlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIiwgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlX2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZV9GaWxlJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhY2thZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInYnVpbGRmaWxlbGlzdF9wYWNrYWdlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVjaXBlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlY2lwZSd9LAorICAgICAgICAgICAgJ2J1Z3RyYWNrZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdmaWxlX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICdob21lcGFnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JlY2lwZV9sYXllcl92ZXJzaW9uJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ2xpY2Vuc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGljZW5zaW5nX2luZm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzZWN0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3N1bW1hcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWNpcGVfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWNpcGVfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncl9kZXBlbmRlbmNpZXNfZGVwZW5kcyciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncl9kZXBlbmRlbmNpZXNfcmVjaXBlJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldCd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdmaWxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2ZpbGVfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaXNfaW1hZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXRfaW5zdGFsbGVkX3BhY2thZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0luc3RhbGxlZF9QYWNrYWdlJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhY2thZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFzayc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvcmRlcmluZyc6ICIoJ29yZGVyJywgJ3JlY2lwZScpIiwgJ29iamVjdF9uYW1lJzogJ1Rhc2snfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjcHVfdXNhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRlY2ltYWxGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZScsICdtYXhfZGlnaXRzJzogJzYnLCAnZGVjaW1hbF9wbGFjZXMnOiAnMid9KSwKKyAgICAgICAgICAgICdkaXNrX2lvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZWxhcHNlZF90aW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnLCAnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGluZV9udW1iZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsb2dmaWxlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtZXNzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI0MCd9KSwKKyAgICAgICAgICAgICdvcmRlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnNSd9KSwKKyAgICAgICAgICAgICdwYXRoX3RvX3NzdGF0ZV9vYmonOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JlY2lwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIididWlsZF9yZWNpcGUnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KSwKKyAgICAgICAgICAgICdzY3JpcHRfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3NvdXJjZV91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NzdGF0ZV9jaGVja3N1bSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzc3RhdGVfcmVzdWx0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAndGFza19leGVjdXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICd0YXNrX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3dvcmtfZGlyZWN0b3J5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXNrX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFza19EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2RlcGVuZGVuY2llc19kZXBlbmRzJyIsICd0byc6IHUib3JtWydvcm0uVGFzayddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfZGVwZW5kZW5jaWVzX3Rhc2snIiwgJ3RvJzogdSJvcm1bJ29ybS5UYXNrJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udmFyaWFibGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVmFyaWFibGUnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid2YXJpYWJsZV9idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY2hhbmdlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdodW1hbl9yZWFkYWJsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndmFyaWFibGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndmFyaWFibGVfdmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udmFyaWFibGVoaXN0b3J5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1ZhcmlhYmxlSGlzdG9yeSd9LAorICAgICAgICAgICAgJ2ZpbGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsaW5lX251bWJlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ29wZXJhdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxNid9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid2aGlzdG9yeSciLCAndG8nOiB1Im9ybVsnb3JtLlZhcmlhYmxlJ10ifSkKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbXBsZXRlX2FwcHMgPSBbJ29ybSddCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMDVfYXV0b19fYWRkX3RhcmdldF9pbWFnZV9maWxlX19hZGRfdGFyZ2V0X2ZpbGVfX2FkZF9maWVsZF92YXJpYWJsZWhpc3Rvci5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAwNV9hdXRvX19hZGRfdGFyZ2V0X2ltYWdlX2ZpbGVfX2FkZF90YXJnZXRfZmlsZV9fYWRkX2ZpZWxkX3ZhcmlhYmxlaGlzdG9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZTdhYzMKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMDVfYXV0b19fYWRkX3RhcmdldF9pbWFnZV9maWxlX19hZGRfdGFyZ2V0X2ZpbGVfX2FkZF9maWVsZF92YXJpYWJsZWhpc3Rvci5weQpAQCAtMCwwICsxLDI4MSBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KK2Zyb20gc291dGgudXRpbHMgaW1wb3J0IGRhdGV0aW1lX3V0aWxzIGFzIGRhdGV0aW1lCitmcm9tIHNvdXRoLmRiIGltcG9ydCBkYgorZnJvbSBzb3V0aC52MiBpbXBvcnQgU2NoZW1hTWlncmF0aW9uCitmcm9tIGRqYW5nby5kYiBpbXBvcnQgbW9kZWxzCisKKworY2xhc3MgTWlncmF0aW9uKFNjaGVtYU1pZ3JhdGlvbik6CisKKyAgICBkZWYgZm9yd2FyZHMoc2VsZiwgb3JtKToKKyAgICAgICAgIyBBZGRpbmcgbW9kZWwgJ1RhcmdldF9GaWxlJworICAgICAgICBkYi5jcmVhdGVfdGFibGUodSdvcm1fdGFyZ2V0X2ZpbGUnLCAoCisgICAgICAgICAgICAodSdpZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcpKHByaW1hcnlfa2V5PVRydWUpKSwKKyAgICAgICAgICAgICgndGFyZ2V0Jywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykodG89b3JtWydvcm0uVGFyZ2V0J10pKSwKKyAgICAgICAgICAgICgncGF0aCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnKShtYXhfbGVuZ3RoPTEwMCkpLAorICAgICAgICAgICAgKCdzaXplJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJykoKSksCisgICAgICAgICAgICAoJ2lub2RldHlwZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcpKCkpLAorICAgICAgICAgICAgKCdwZXJtaXNzaW9uJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJykoKSksCisgICAgICAgICAgICAoJ293bmVyJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0xMjgpKSwKKyAgICAgICAgICAgICgnZ3JvdXAnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTEyOCkpLAorICAgICAgICAgICAgKCdkaXJlY3RvcnknLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKShyZWxhdGVkX25hbWU9J2RpcmVjdG9yeV9zZXQnLCB0bz1vcm1bJ29ybS5UYXJnZXRfRmlsZSddKSksCisgICAgICAgICAgICAoJ3N5bV90YXJnZXQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKShyZWxhdGVkX25hbWU9J3N5bWxpbmtfc2V0JywgYmxhbms9VHJ1ZSwgdG89b3JtWydvcm0uVGFyZ2V0X0ZpbGUnXSkpLAorICAgICAgICApKQorICAgICAgICBkYi5zZW5kX2NyZWF0ZV9zaWduYWwodSdvcm0nLCBbJ1RhcmdldF9GaWxlJ10pCisKKyAgICAgICAgIyBBZGRpbmcgbW9kZWwgJ1RhcmdldF9JbWFnZV9GaWxlJworICAgICAgICBkYi5jcmVhdGVfdGFibGUodSdvcm1fdGFyZ2V0X2ltYWdlX2ZpbGUnLCAoCisgICAgICAgICAgICAodSdpZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcpKHByaW1hcnlfa2V5PVRydWUpKSwKKyAgICAgICAgICAgICgndGFyZ2V0Jywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykodG89b3JtWydvcm0uVGFyZ2V0J10pKSwKKyAgICAgICAgICAgICgnZmlsZV9uYW1lJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcpKG1heF9sZW5ndGg9MTAwKSksCisgICAgICAgICAgICAoJ2ZpbGVfc2l6ZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcpKCkpLAorICAgICAgICApKQorICAgICAgICBkYi5zZW5kX2NyZWF0ZV9zaWduYWwodSdvcm0nLCBbJ1RhcmdldF9JbWFnZV9GaWxlJ10pCisKKyAgICAgICAgIyBBZGRpbmcgZmllbGQgJ1ZhcmlhYmxlSGlzdG9yeS52YWx1ZScKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J29ybV92YXJpYWJsZWhpc3RvcnknLCAndmFsdWUnLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcpKGRlZmF1bHQ9JycsIGJsYW5rPVRydWUpLAorICAgICAgICAgICAgICAgICAgICAgIGtlZXBfZGVmYXVsdD1GYWxzZSkKKworICAgICAgICAjIERlbGV0aW5nIGZpZWxkICdSZWNpcGUubGljZW5zaW5nX2luZm8nCisgICAgICAgIGRiLmRlbGV0ZV9jb2x1bW4odSdvcm1fcmVjaXBlJywgJ2xpY2Vuc2luZ19pbmZvJykKKworICAgICAgICAjIERlbGV0aW5nIGZpZWxkICdUYXJnZXQuZmlsZV9uYW1lJworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnb3JtX3RhcmdldCcsICdmaWxlX25hbWUnKQorCisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ1RhcmdldC5maWxlX3NpemUnCisgICAgICAgIGRiLmRlbGV0ZV9jb2x1bW4odSdvcm1fdGFyZ2V0JywgJ2ZpbGVfc2l6ZScpCisKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnQnVpbGQuaW1hZ2VfZnN0eXBlcycKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV9idWlsZCcsICdpbWFnZV9mc3R5cGVzJykKKworICAgICAgICAjIEFkZGluZyBmaWVsZCAnTG9nTWVzc2FnZS50YXNrJworICAgICAgICBkYi5hZGRfY29sdW1uKHUnb3JtX2xvZ21lc3NhZ2UnLCAndGFzaycsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykodG89b3JtWydvcm0uVGFzayddLCBudWxsPVRydWUsIGJsYW5rPVRydWUpLAorICAgICAgICAgICAgICAgICAgICAgIGtlZXBfZGVmYXVsdD1GYWxzZSkKKworCisgICAgICAgICMgQ2hhbmdpbmcgZmllbGQgJ1Rhc2suZWxhcHNlZF90aW1lJworICAgICAgICBkYi5hbHRlcl9jb2x1bW4odSdvcm1fdGFzaycsICdlbGFwc2VkX3RpbWUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EZWNpbWFsRmllbGQnKShudWxsPVRydWUsIG1heF9kaWdpdHM9NiwgZGVjaW1hbF9wbGFjZXM9MikpCisgICAgICAgICMgQWRkaW5nIHVuaXF1ZSBjb25zdHJhaW50IG9uICdUYXNrJywgZmllbGRzIFsnYnVpbGQnLCAncmVjaXBlJywgJ3Rhc2tfbmFtZSddCisgICAgICAgIGRiLmNyZWF0ZV91bmlxdWUodSdvcm1fdGFzaycsIFsnYnVpbGRfaWQnLCAncmVjaXBlX2lkJywgJ3Rhc2tfbmFtZSddKQorCisKKyAgICBkZWYgYmFja3dhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgUmVtb3ZpbmcgdW5pcXVlIGNvbnN0cmFpbnQgb24gJ1Rhc2snLCBmaWVsZHMgWydidWlsZCcsICdyZWNpcGUnLCAndGFza19uYW1lJ10KKyAgICAgICAgZGIuZGVsZXRlX3VuaXF1ZSh1J29ybV90YXNrJywgWydidWlsZF9pZCcsICdyZWNpcGVfaWQnLCAndGFza19uYW1lJ10pCisKKyAgICAgICAgIyBEZWxldGluZyBtb2RlbCAnVGFyZ2V0X0ZpbGUnCisgICAgICAgIGRiLmRlbGV0ZV90YWJsZSh1J29ybV90YXJnZXRfZmlsZScpCisKKyAgICAgICAgIyBEZWxldGluZyBtb2RlbCAnVGFyZ2V0X0ltYWdlX0ZpbGUnCisgICAgICAgIGRiLmRlbGV0ZV90YWJsZSh1J29ybV90YXJnZXRfaW1hZ2VfZmlsZScpCisKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnVmFyaWFibGVIaXN0b3J5LnZhbHVlJworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnb3JtX3ZhcmlhYmxlaGlzdG9yeScsICd2YWx1ZScpCisKKyAgICAgICAgIyBBZGRpbmcgZmllbGQgJ1JlY2lwZS5saWNlbnNpbmdfaW5mbycKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J29ybV9yZWNpcGUnLCAnbGljZW5zaW5nX2luZm8nLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcpKGRlZmF1bHQ9JycsIGJsYW5rPVRydWUpLAorICAgICAgICAgICAgICAgICAgICAgIGtlZXBfZGVmYXVsdD1GYWxzZSkKKworICAgICAgICAjIEFkZGluZyBmaWVsZCAnVGFyZ2V0LmZpbGVfbmFtZScKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J29ybV90YXJnZXQnLCAnZmlsZV9uYW1lJywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShkZWZhdWx0PScnLCBtYXhfbGVuZ3RoPTEwMCksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisgICAgICAgICMgQWRkaW5nIGZpZWxkICdUYXJnZXQuZmlsZV9zaXplJworICAgICAgICBkYi5hZGRfY29sdW1uKHUnb3JtX3RhcmdldCcsICdmaWxlX3NpemUnLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcpKGRlZmF1bHQ9MCksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisgICAgICAgICMgQWRkaW5nIGZpZWxkICdCdWlsZC5pbWFnZV9mc3R5cGVzJworICAgICAgICBkYi5hZGRfY29sdW1uKHUnb3JtX2J1aWxkJywgJ2ltYWdlX2ZzdHlwZXMnLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKGRlZmF1bHQ9JycsIG1heF9sZW5ndGg9MTAwKSwKKyAgICAgICAgICAgICAgICAgICAgICBrZWVwX2RlZmF1bHQ9RmFsc2UpCisKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnTG9nTWVzc2FnZS50YXNrJworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnb3JtX2xvZ21lc3NhZ2UnLCAndGFza19pZCcpCisKKworICAgICAgICAjIENoYW5naW5nIGZpZWxkICdUYXNrLmVsYXBzZWRfdGltZScKKyAgICAgICAgZGIuYWx0ZXJfY29sdW1uKHUnb3JtX3Rhc2snLCAnZWxhcHNlZF90aW1lJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD01MCkpCisKKyAgICBtb2RlbHMgPSB7CisgICAgICAgIHUnb3JtLmJ1aWxkJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0J1aWxkJ30sCisgICAgICAgICAgICAnYml0YmFrZV92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ2J1aWxkX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2NvbXBsZXRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnY29va2VyX2xvZ19wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Ryb192ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdlcnJvcnNfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWFjaGluZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnb3V0Y29tZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcyJ30pLAorICAgICAgICAgICAgJ3N0YXJ0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ3RpbWVzcGVudCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3dhcm5pbmdzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnTGF5ZXInfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfaW5kZXhfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgJ2xvY2FsX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcl92ZXJzaW9uJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0xheWVyX1ZlcnNpb24nfSwKKyAgICAgICAgICAgICdicmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInbGF5ZXJfdmVyc2lvbl9idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInbGF5ZXJfdmVyc2lvbl9sYXllciciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyJ10ifSksCisgICAgICAgICAgICAncHJpb3JpdHknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubG9nbWVzc2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdMb2dNZXNzYWdlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsZXZlbCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xpbmVubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21lc3NhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjQwJ30pLAorICAgICAgICAgICAgJ3BhdGhuYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFzayddIiwgJ251bGwnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW5zdGFsbGVkX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAiJyciLCAnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnaW5zdGFsbGVkX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JldmlzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzMyJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncGFja2FnZV9kZXBlbmRlbmNpZXNfdGFyZ2V0JyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3BhY2thZ2VfZGVwZW5kZW5jaWVzX3NvdXJjZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSIsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRmlsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkZmlsZWxpc3RfcGFja2FnZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICdwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlY2lwZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWNpcGUnfSwKKyAgICAgICAgICAgICdidWd0cmFja2VyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZmlsZV9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAnaG9tZXBhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyZWNpcGVfbGF5ZXJfdmVyc2lvbiciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVjaXBlX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVjaXBlX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX2RlcGVuZHMnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX3JlY2lwZSciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXQnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2lzX2ltYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0ZpbGUnfSwKKyAgICAgICAgICAgICdkaXJlY3RvcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInZGlyZWN0b3J5X3NldCciLCAndG8nOiB1Im9ybVsnb3JtLlRhcmdldF9GaWxlJ10ifSksCisgICAgICAgICAgICAnZ3JvdXAnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTI4J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpbm9kZXR5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnb3duZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTI4J30pLAorICAgICAgICAgICAgJ3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdwZXJtaXNzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnc3ltX3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidzeW1saW5rX3NldCciLCAnYmxhbmsnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uVGFyZ2V0X0ZpbGUnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXRfaW1hZ2VfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfSW1hZ2VfRmlsZSd9LAorICAgICAgICAgICAgJ2ZpbGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2ZpbGVfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2luc3RhbGxlZF9wYWNrYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9JbnN0YWxsZWRfUGFja2FnZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkdGFyZ2V0bGlzdF9wYWNrYWdlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhc2snOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb3JkZXJpbmcnOiAiKCdvcmRlcicsICdyZWNpcGUnKSIsICd1bmlxdWVfdG9nZXRoZXInOiAiKCgnYnVpbGQnLCAncmVjaXBlJywgJ3Rhc2tfbmFtZScpLCkiLCAnb2JqZWN0X25hbWUnOiAnVGFzayd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NwdV91c2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGVjaW1hbEZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJywgJ21heF9kaWdpdHMnOiAnNicsICdkZWNpbWFsX3BsYWNlcyc6ICcyJ30pLAorICAgICAgICAgICAgJ2Rpc2tfaW8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdlbGFwc2VkX3RpbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRlY2ltYWxGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZScsICdtYXhfZGlnaXRzJzogJzYnLCAnZGVjaW1hbF9wbGFjZXMnOiAnMid9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGluZV9udW1iZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsb2dmaWxlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtZXNzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI0MCd9KSwKKyAgICAgICAgICAgICdvcmRlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnLTEnfSksCisgICAgICAgICAgICAncGF0aF90b19zc3RhdGVfb2JqJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInYnVpbGRfcmVjaXBlJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSksCisgICAgICAgICAgICAnc2NyaXB0X3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzb3VyY2VfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzc3RhdGVfY2hlY2tzdW0nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3N0YXRlX3Jlc3VsdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3Rhc2tfZXhlY3V0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAndGFza19uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd3b3JrX2RpcmVjdG9yeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFza19kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Rhc2tfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19kZXBlbmRlbmNpZXNfZGVwZW5kcyciLCAndG8nOiB1Im9ybVsnb3JtLlRhc2snXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2RlcGVuZGVuY2llc190YXNrJyIsICd0byc6IHUib3JtWydvcm0uVGFzayddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnZhcmlhYmxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1ZhcmlhYmxlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndmFyaWFibGVfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NoYW5nZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnaHVtYW5fcmVhZGFibGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlX3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnZhcmlhYmxlaGlzdG9yeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdWYXJpYWJsZUhpc3RvcnknfSwKKyAgICAgICAgICAgICdmaWxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGluZV9udW1iZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvcGVyYXRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTYnfSksCisgICAgICAgICAgICAndmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmFyaWFibGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndmhpc3RvcnknIiwgJ3RvJzogdSJvcm1bJ29ybS5WYXJpYWJsZSddIn0pCisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb21wbGV0ZV9hcHBzID0gWydvcm0nXQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDA2X2F1dG9fX2FkZF9maWVsZF90YXJnZXRfaW1hZ2Vfc2l6ZV9fYWRkX2ZpZWxkX3RhcmdldF9saWNlbnNlX21hbmlmZXN0X3AucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMDZfYXV0b19fYWRkX2ZpZWxkX3RhcmdldF9pbWFnZV9zaXplX19hZGRfZmllbGRfdGFyZ2V0X2xpY2Vuc2VfbWFuaWZlc3RfcC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmJlMzBhCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDA2X2F1dG9fX2FkZF9maWVsZF90YXJnZXRfaW1hZ2Vfc2l6ZV9fYWRkX2ZpZWxkX3RhcmdldF9saWNlbnNlX21hbmlmZXN0X3AucHkKQEAgLTAsMCArMSwyMzUgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCitmcm9tIHNvdXRoLnV0aWxzIGltcG9ydCBkYXRldGltZV91dGlscyBhcyBkYXRldGltZQorZnJvbSBzb3V0aC5kYiBpbXBvcnQgZGIKK2Zyb20gc291dGgudjIgaW1wb3J0IFNjaGVtYU1pZ3JhdGlvbgorZnJvbSBkamFuZ28uZGIgaW1wb3J0IG1vZGVscworCisKK2NsYXNzIE1pZ3JhdGlvbihTY2hlbWFNaWdyYXRpb24pOgorCisgICAgZGVmIGZvcndhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgQWRkaW5nIGZpZWxkICdUYXJnZXQuaW1hZ2Vfc2l6ZScKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J29ybV90YXJnZXQnLCAnaW1hZ2Vfc2l6ZScsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJykoZGVmYXVsdD0wKSwKKyAgICAgICAgICAgICAgICAgICAgICBrZWVwX2RlZmF1bHQ9RmFsc2UpCisKKyAgICAgICAgIyBBZGRpbmcgZmllbGQgJ1RhcmdldC5saWNlbnNlX21hbmlmZXN0X3BhdGgnCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fdGFyZ2V0JywgJ2xpY2Vuc2VfbWFuaWZlc3RfcGF0aCcsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD01MDAsIG51bGw9VHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisKKyAgICAgICAgIyBDaGFuZ2luZyBmaWVsZCAnVGFyZ2V0X0ZpbGUucGVybWlzc2lvbicKKyAgICAgICAgZGIuYWx0ZXJfY29sdW1uKHUnb3JtX3RhcmdldF9maWxlJywgJ3Blcm1pc3Npb24nLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTE2KSkKKworICAgICAgICAjIENoYW5naW5nIGZpZWxkICdUYXJnZXRfRmlsZS5zeW1fdGFyZ2V0JworICAgICAgICBkYi5hbHRlcl9jb2x1bW4odSdvcm1fdGFyZ2V0X2ZpbGUnLCAnc3ltX3RhcmdldF9pZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKG51bGw9VHJ1ZSwgdG89b3JtWydvcm0uVGFyZ2V0X0ZpbGUnXSkpCisKKyAgICAgICAgIyBDaGFuZ2luZyBmaWVsZCAnVGFyZ2V0X0ZpbGUuZGlyZWN0b3J5JworICAgICAgICBkYi5hbHRlcl9jb2x1bW4odSdvcm1fdGFyZ2V0X2ZpbGUnLCAnZGlyZWN0b3J5X2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykobnVsbD1UcnVlLCB0bz1vcm1bJ29ybS5UYXJnZXRfRmlsZSddKSkKKworICAgIGRlZiBiYWNrd2FyZHMoc2VsZiwgb3JtKToKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnVGFyZ2V0LmltYWdlX3NpemUnCisgICAgICAgIGRiLmRlbGV0ZV9jb2x1bW4odSdvcm1fdGFyZ2V0JywgJ2ltYWdlX3NpemUnKQorCisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ1RhcmdldC5saWNlbnNlX21hbmlmZXN0X3BhdGgnCisgICAgICAgIGRiLmRlbGV0ZV9jb2x1bW4odSdvcm1fdGFyZ2V0JywgJ2xpY2Vuc2VfbWFuaWZlc3RfcGF0aCcpCisKKworICAgICAgICAjIENoYW5naW5nIGZpZWxkICdUYXJnZXRfRmlsZS5wZXJtaXNzaW9uJworICAgICAgICBkYi5hbHRlcl9jb2x1bW4odSdvcm1fdGFyZ2V0X2ZpbGUnLCAncGVybWlzc2lvbicsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcpKCkpCisKKyAgICAgICAgIyBVc2VyIGNob3NlIHRvIG5vdCBkZWFsIHdpdGggYmFja3dhcmRzIE5VTEwgaXNzdWVzIGZvciAnVGFyZ2V0X0ZpbGUuc3ltX3RhcmdldCcKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJDYW5ub3QgcmV2ZXJzZSB0aGlzIG1pZ3JhdGlvbi4gJ1RhcmdldF9GaWxlLnN5bV90YXJnZXQnIGFuZCBpdHMgdmFsdWVzIGNhbm5vdCBiZSByZXN0b3JlZC4iKQorICAgICAgICAKKyAgICAgICAgIyBUaGUgZm9sbG93aW5nIGNvZGUgaXMgcHJvdmlkZWQgaGVyZSB0byBhaWQgaW4gd3JpdGluZyBhIGNvcnJlY3QgbWlncmF0aW9uCisgICAgICAgICMgQ2hhbmdpbmcgZmllbGQgJ1RhcmdldF9GaWxlLnN5bV90YXJnZXQnCisgICAgICAgIGRiLmFsdGVyX2NvbHVtbih1J29ybV90YXJnZXRfZmlsZScsICdzeW1fdGFyZ2V0X2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykodG89b3JtWydvcm0uVGFyZ2V0X0ZpbGUnXSkpCisKKyAgICAgICAgIyBVc2VyIGNob3NlIHRvIG5vdCBkZWFsIHdpdGggYmFja3dhcmRzIE5VTEwgaXNzdWVzIGZvciAnVGFyZ2V0X0ZpbGUuZGlyZWN0b3J5JworICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIkNhbm5vdCByZXZlcnNlIHRoaXMgbWlncmF0aW9uLiAnVGFyZ2V0X0ZpbGUuZGlyZWN0b3J5JyBhbmQgaXRzIHZhbHVlcyBjYW5ub3QgYmUgcmVzdG9yZWQuIikKKyAgICAgICAgCisgICAgICAgICMgVGhlIGZvbGxvd2luZyBjb2RlIGlzIHByb3ZpZGVkIGhlcmUgdG8gYWlkIGluIHdyaXRpbmcgYSBjb3JyZWN0IG1pZ3JhdGlvbgorICAgICAgICAjIENoYW5naW5nIGZpZWxkICdUYXJnZXRfRmlsZS5kaXJlY3RvcnknCisgICAgICAgIGRiLmFsdGVyX2NvbHVtbih1J29ybV90YXJnZXRfZmlsZScsICdkaXJlY3RvcnlfaWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKSh0bz1vcm1bJ29ybS5UYXJnZXRfRmlsZSddKSkKKworICAgIG1vZGVscyA9IHsKKyAgICAgICAgdSdvcm0uYnVpbGQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQnVpbGQnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnYnVpbGRfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnY29tcGxldGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdjb29rZXJfbG9nX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Rybyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZGlzdHJvX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Vycm9yc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtYWNoaW5lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzInfSksCisgICAgICAgICAgICAnc3RhcnRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAndGltZXNwZW50JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnd2FybmluZ3Nfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdMYXllcid9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9pbmRleF91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICAnbG9jYWxfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVyX3ZlcnNpb24nOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnTGF5ZXJfVmVyc2lvbid9LAorICAgICAgICAgICAgJ2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidsYXllcl92ZXJzaW9uX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjb21taXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidsYXllcl92ZXJzaW9uX2xheWVyJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXInXSJ9KSwKKyAgICAgICAgICAgICdwcmlvcml0eSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sb2dtZXNzYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0xvZ01lc3NhZ2UnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xldmVsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbGluZW5vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWVzc2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNDAnfSksCisgICAgICAgICAgICAncGF0aG5hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXNrJ10iLCAnbnVsbCc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpbnN0YWxsZWRfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICInJyIsICdtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdpbnN0YWxsZWRfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xpY2Vuc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnODAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAncmV2aXNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMzInLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzZWN0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3N1bW1hcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZV9EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwX3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidwYWNrYWdlX2RlcGVuZGVuY2llc190YXJnZXQnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhY2thZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncGFja2FnZV9kZXBlbmRlbmNpZXNfc291cmNlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIiwgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlX2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZV9GaWxlJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhY2thZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInYnVpbGRmaWxlbGlzdF9wYWNrYWdlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVjaXBlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlY2lwZSd9LAorICAgICAgICAgICAgJ2J1Z3RyYWNrZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdmaWxlX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICdob21lcGFnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JlY2lwZV9sYXllcl92ZXJzaW9uJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ2xpY2Vuc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzZWN0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3N1bW1hcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWNpcGVfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWNpcGVfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncl9kZXBlbmRlbmNpZXNfZGVwZW5kcyciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncl9kZXBlbmRlbmNpZXNfcmVjaXBlJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldCd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW1hZ2Vfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2lzX2ltYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ2xpY2Vuc2VfbWFuaWZlc3RfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0ZpbGUnfSwKKyAgICAgICAgICAgICdkaXJlY3RvcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInZGlyZWN0b3J5X3NldCciLCAnbnVsbCc6ICdUcnVlJywgJ3RvJzogdSJvcm1bJ29ybS5UYXJnZXRfRmlsZSddIn0pLAorICAgICAgICAgICAgJ2dyb3VwJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyOCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW5vZGV0eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ293bmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyOCd9KSwKKyAgICAgICAgICAgICdwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncGVybWlzc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxNid9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ3N5bV90YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInc3ltbGlua19zZXQnIiwgJ251bGwnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uVGFyZ2V0X0ZpbGUnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXRfaW1hZ2VfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfSW1hZ2VfRmlsZSd9LAorICAgICAgICAgICAgJ2ZpbGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2ZpbGVfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2luc3RhbGxlZF9wYWNrYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9JbnN0YWxsZWRfUGFja2FnZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkdGFyZ2V0bGlzdF9wYWNrYWdlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhc2snOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb3JkZXJpbmcnOiAiKCdvcmRlcicsICdyZWNpcGUnKSIsICd1bmlxdWVfdG9nZXRoZXInOiAiKCgnYnVpbGQnLCAncmVjaXBlJywgJ3Rhc2tfbmFtZScpLCkiLCAnb2JqZWN0X25hbWUnOiAnVGFzayd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NwdV91c2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGVjaW1hbEZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJywgJ21heF9kaWdpdHMnOiAnNicsICdkZWNpbWFsX3BsYWNlcyc6ICcyJ30pLAorICAgICAgICAgICAgJ2Rpc2tfaW8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdlbGFwc2VkX3RpbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRlY2ltYWxGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZScsICdtYXhfZGlnaXRzJzogJzYnLCAnZGVjaW1hbF9wbGFjZXMnOiAnMid9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGluZV9udW1iZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsb2dmaWxlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtZXNzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI0MCd9KSwKKyAgICAgICAgICAgICdvcmRlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnLTEnfSksCisgICAgICAgICAgICAncGF0aF90b19zc3RhdGVfb2JqJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInYnVpbGRfcmVjaXBlJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSksCisgICAgICAgICAgICAnc2NyaXB0X3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzb3VyY2VfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzc3RhdGVfY2hlY2tzdW0nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3N0YXRlX3Jlc3VsdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3Rhc2tfZXhlY3V0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAndGFza19uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd3b3JrX2RpcmVjdG9yeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFza19kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Rhc2tfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19kZXBlbmRlbmNpZXNfZGVwZW5kcyciLCAndG8nOiB1Im9ybVsnb3JtLlRhc2snXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2RlcGVuZGVuY2llc190YXNrJyIsICd0byc6IHUib3JtWydvcm0uVGFzayddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnZhcmlhYmxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1ZhcmlhYmxlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndmFyaWFibGVfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NoYW5nZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnaHVtYW5fcmVhZGFibGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlX3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnZhcmlhYmxlaGlzdG9yeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdWYXJpYWJsZUhpc3RvcnknfSwKKyAgICAgICAgICAgICdmaWxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGluZV9udW1iZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvcGVyYXRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTYnfSksCisgICAgICAgICAgICAndmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmFyaWFibGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndmhpc3RvcnknIiwgJ3RvJzogdSJvcm1bJ29ybS5WYXJpYWJsZSddIn0pCisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb21wbGV0ZV9hcHBzID0gWydvcm0nXQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDA3X2F1dG9fX2FkZF9oZWxwdGV4dC5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAwN19hdXRvX19hZGRfaGVscHRleHQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU0YzUzNgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAwN19hdXRvX19hZGRfaGVscHRleHQucHkKQEAgLTAsMCArMSwyMTQgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCitmcm9tIHNvdXRoLnV0aWxzIGltcG9ydCBkYXRldGltZV91dGlscyBhcyBkYXRldGltZQorZnJvbSBzb3V0aC5kYiBpbXBvcnQgZGIKK2Zyb20gc291dGgudjIgaW1wb3J0IFNjaGVtYU1pZ3JhdGlvbgorZnJvbSBkamFuZ28uZGIgaW1wb3J0IG1vZGVscworCisKK2NsYXNzIE1pZ3JhdGlvbihTY2hlbWFNaWdyYXRpb24pOgorCisgICAgZGVmIGZvcndhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgQWRkaW5nIG1vZGVsICdIZWxwVGV4dCcKKyAgICAgICAgZGIuY3JlYXRlX3RhYmxlKHUnb3JtX2hlbHB0ZXh0JywgKAorICAgICAgICAgICAgKHUnaWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnKShwcmltYXJ5X2tleT1UcnVlKSksCisgICAgICAgICAgICAoJ2J1aWxkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykocmVsYXRlZF9uYW1lPSdoZWxwdGV4dF9idWlsZCcsIHRvPW9ybVsnb3JtLkJ1aWxkJ10pKSwKKyAgICAgICAgICAgICgnYXJlYScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcpKCkpLAorICAgICAgICAgICAgKCdrZXknLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTEwMCkpLAorICAgICAgICAgICAgKCd0ZXh0Jywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJykoKSksCisgICAgICAgICkpCisgICAgICAgIGRiLnNlbmRfY3JlYXRlX3NpZ25hbCh1J29ybScsIFsnSGVscFRleHQnXSkKKworCisgICAgZGVmIGJhY2t3YXJkcyhzZWxmLCBvcm0pOgorICAgICAgICAjIERlbGV0aW5nIG1vZGVsICdIZWxwVGV4dCcKKyAgICAgICAgZGIuZGVsZXRlX3RhYmxlKHUnb3JtX2hlbHB0ZXh0JykKKworCisgICAgbW9kZWxzID0geworICAgICAgICB1J29ybS5idWlsZCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZCd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdidWlsZF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdjb21wbGV0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2Nvb2tlcl9sb2dfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnfSksCisgICAgICAgICAgICAnZGlzdHJvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm9fdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZXJyb3JzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21hY2hpbmUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMid9KSwKKyAgICAgICAgICAgICdzdGFydGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICd0aW1lc3BlbnQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd3YXJuaW5nc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmhlbHB0ZXh0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0hlbHBUZXh0J30sCisgICAgICAgICAgICAnYXJlYSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidoZWxwdGV4dF9idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2tleSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndGV4dCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdMYXllcid9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9pbmRleF91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICAnbG9jYWxfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVyX3ZlcnNpb24nOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnTGF5ZXJfVmVyc2lvbid9LAorICAgICAgICAgICAgJ2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidsYXllcl92ZXJzaW9uX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjb21taXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidsYXllcl92ZXJzaW9uX2xheWVyJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXInXSJ9KSwKKyAgICAgICAgICAgICdwcmlvcml0eSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sb2dtZXNzYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0xvZ01lc3NhZ2UnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xldmVsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbGluZW5vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWVzc2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNDAnfSksCisgICAgICAgICAgICAncGF0aG5hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXNrJ10iLCAnbnVsbCc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpbnN0YWxsZWRfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICInJyIsICdtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdpbnN0YWxsZWRfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xpY2Vuc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnODAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAncmV2aXNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMzInLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzZWN0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3N1bW1hcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZV9EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwX3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidwYWNrYWdlX2RlcGVuZGVuY2llc190YXJnZXQnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhY2thZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncGFja2FnZV9kZXBlbmRlbmNpZXNfc291cmNlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIiwgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlX2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZV9GaWxlJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhY2thZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInYnVpbGRmaWxlbGlzdF9wYWNrYWdlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVjaXBlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlY2lwZSd9LAorICAgICAgICAgICAgJ2J1Z3RyYWNrZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdmaWxlX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICdob21lcGFnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JlY2lwZV9sYXllcl92ZXJzaW9uJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ2xpY2Vuc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzZWN0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3N1bW1hcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWNpcGVfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWNpcGVfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncl9kZXBlbmRlbmNpZXNfZGVwZW5kcyciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncl9kZXBlbmRlbmNpZXNfcmVjaXBlJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldCd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW1hZ2Vfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2lzX2ltYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ2xpY2Vuc2VfbWFuaWZlc3RfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0ZpbGUnfSwKKyAgICAgICAgICAgICdkaXJlY3RvcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInZGlyZWN0b3J5X3NldCciLCAnbnVsbCc6ICdUcnVlJywgJ3RvJzogdSJvcm1bJ29ybS5UYXJnZXRfRmlsZSddIn0pLAorICAgICAgICAgICAgJ2dyb3VwJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyOCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW5vZGV0eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ293bmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyOCd9KSwKKyAgICAgICAgICAgICdwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncGVybWlzc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxNid9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ3N5bV90YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInc3ltbGlua19zZXQnIiwgJ251bGwnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uVGFyZ2V0X0ZpbGUnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXRfaW1hZ2VfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfSW1hZ2VfRmlsZSd9LAorICAgICAgICAgICAgJ2ZpbGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2ZpbGVfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2luc3RhbGxlZF9wYWNrYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9JbnN0YWxsZWRfUGFja2FnZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkdGFyZ2V0bGlzdF9wYWNrYWdlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhc2snOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb3JkZXJpbmcnOiAiKCdvcmRlcicsICdyZWNpcGUnKSIsICd1bmlxdWVfdG9nZXRoZXInOiAiKCgnYnVpbGQnLCAncmVjaXBlJywgJ3Rhc2tfbmFtZScpLCkiLCAnb2JqZWN0X25hbWUnOiAnVGFzayd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NwdV91c2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGVjaW1hbEZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJywgJ21heF9kaWdpdHMnOiAnNicsICdkZWNpbWFsX3BsYWNlcyc6ICcyJ30pLAorICAgICAgICAgICAgJ2Rpc2tfaW8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdlbGFwc2VkX3RpbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRlY2ltYWxGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZScsICdtYXhfZGlnaXRzJzogJzYnLCAnZGVjaW1hbF9wbGFjZXMnOiAnMid9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGluZV9udW1iZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsb2dmaWxlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtZXNzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI0MCd9KSwKKyAgICAgICAgICAgICdvcmRlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnLTEnfSksCisgICAgICAgICAgICAncGF0aF90b19zc3RhdGVfb2JqJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInYnVpbGRfcmVjaXBlJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSksCisgICAgICAgICAgICAnc2NyaXB0X3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzb3VyY2VfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzc3RhdGVfY2hlY2tzdW0nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3N0YXRlX3Jlc3VsdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3Rhc2tfZXhlY3V0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAndGFza19uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd3b3JrX2RpcmVjdG9yeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFza19kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Rhc2tfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19kZXBlbmRlbmNpZXNfZGVwZW5kcyciLCAndG8nOiB1Im9ybVsnb3JtLlRhc2snXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2RlcGVuZGVuY2llc190YXNrJyIsICd0byc6IHUib3JtWydvcm0uVGFzayddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnZhcmlhYmxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1ZhcmlhYmxlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndmFyaWFibGVfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NoYW5nZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnaHVtYW5fcmVhZGFibGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlX3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnZhcmlhYmxlaGlzdG9yeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdWYXJpYWJsZUhpc3RvcnknfSwKKyAgICAgICAgICAgICdmaWxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGluZV9udW1iZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvcGVyYXRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTYnfSksCisgICAgICAgICAgICAndmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmFyaWFibGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndmhpc3RvcnknIiwgJ3RvJzogdSJvcm1bJ29ybS5WYXJpYWJsZSddIn0pCisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb21wbGV0ZV9hcHBzID0gWydvcm0nXQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDA4X2F1dG9fX2NoZ19maWVsZF92YXJpYWJsZWhpc3Rvcnlfb3BlcmF0aW9uX19jaGdfZmllbGRfcmVjaXBlX2Rlc2NyaXB0aW8ucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMDhfYXV0b19fY2hnX2ZpZWxkX3ZhcmlhYmxlaGlzdG9yeV9vcGVyYXRpb25fX2NoZ19maWVsZF9yZWNpcGVfZGVzY3JpcHRpby5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2U0MDhhCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDA4X2F1dG9fX2NoZ19maWVsZF92YXJpYWJsZWhpc3Rvcnlfb3BlcmF0aW9uX19jaGdfZmllbGRfcmVjaXBlX2Rlc2NyaXB0aW8ucHkKQEAgLTAsMCArMSwyMjUgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCitmcm9tIHNvdXRoLnV0aWxzIGltcG9ydCBkYXRldGltZV91dGlscyBhcyBkYXRldGltZQorZnJvbSBzb3V0aC5kYiBpbXBvcnQgZGIKK2Zyb20gc291dGgudjIgaW1wb3J0IFNjaGVtYU1pZ3JhdGlvbgorZnJvbSBkamFuZ28uZGIgaW1wb3J0IG1vZGVscworCisKK2NsYXNzIE1pZ3JhdGlvbihTY2hlbWFNaWdyYXRpb24pOgorCisgICAgZGVmIGZvcndhcmRzKHNlbGYsIG9ybSk6CisKKyAgICAgICAgIyBDaGFuZ2luZyBmaWVsZCAnVmFyaWFibGVIaXN0b3J5Lm9wZXJhdGlvbicKKyAgICAgICAgZGIuYWx0ZXJfY29sdW1uKHUnb3JtX3ZhcmlhYmxlaGlzdG9yeScsICdvcGVyYXRpb24nLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTY0KSkKKworICAgICAgICAjIENoYW5naW5nIGZpZWxkICdSZWNpcGUuZGVzY3JpcHRpb24nCisgICAgICAgIGRiLmFsdGVyX2NvbHVtbih1J29ybV9yZWNpcGUnLCAnZGVzY3JpcHRpb24nLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnKSgpKQorCisgICAgICAgICMgQ2hhbmdpbmcgZmllbGQgJ1RhcmdldF9JbWFnZV9GaWxlLmZpbGVfbmFtZScKKyAgICAgICAgZGIuYWx0ZXJfY29sdW1uKHUnb3JtX3RhcmdldF9pbWFnZV9maWxlJywgJ2ZpbGVfbmFtZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnKShtYXhfbGVuZ3RoPTI1NCkpCisKKyAgICAgICAgIyBDaGFuZ2luZyBmaWVsZCAnUGFja2FnZS5kZXNjcmlwdGlvbicKKyAgICAgICAgZGIuYWx0ZXJfY29sdW1uKHUnb3JtX3BhY2thZ2UnLCAnZGVzY3JpcHRpb24nLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnKSgpKQorCisgICAgZGVmIGJhY2t3YXJkcyhzZWxmLCBvcm0pOgorCisgICAgICAgICMgQ2hhbmdpbmcgZmllbGQgJ1ZhcmlhYmxlSGlzdG9yeS5vcGVyYXRpb24nCisgICAgICAgIGRiLmFsdGVyX2NvbHVtbih1J29ybV92YXJpYWJsZWhpc3RvcnknLCAnb3BlcmF0aW9uJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0xNikpCisKKyAgICAgICAgIyBDaGFuZ2luZyBmaWVsZCAnUmVjaXBlLmRlc2NyaXB0aW9uJworICAgICAgICBkYi5hbHRlcl9jb2x1bW4odSdvcm1fcmVjaXBlJywgJ2Rlc2NyaXB0aW9uJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0xMDApKQorCisgICAgICAgICMgQ2hhbmdpbmcgZmllbGQgJ1RhcmdldF9JbWFnZV9GaWxlLmZpbGVfbmFtZScKKyAgICAgICAgZGIuYWx0ZXJfY29sdW1uKHUnb3JtX3RhcmdldF9pbWFnZV9maWxlJywgJ2ZpbGVfbmFtZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnKShtYXhfbGVuZ3RoPTEwMCkpCisKKyAgICAgICAgIyBDaGFuZ2luZyBmaWVsZCAnUGFja2FnZS5kZXNjcmlwdGlvbicKKyAgICAgICAgZGIuYWx0ZXJfY29sdW1uKHUnb3JtX3BhY2thZ2UnLCAnZGVzY3JpcHRpb24nLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTIwMCkpCisKKyAgICBtb2RlbHMgPSB7CisgICAgICAgIHUnb3JtLmJ1aWxkJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0J1aWxkJ30sCisgICAgICAgICAgICAnYml0YmFrZV92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ2J1aWxkX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2NvbXBsZXRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnY29va2VyX2xvZ19wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Ryb192ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdlcnJvcnNfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWFjaGluZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnb3V0Y29tZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcyJ30pLAorICAgICAgICAgICAgJ3N0YXJ0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ3RpbWVzcGVudCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3dhcm5pbmdzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0uaGVscHRleHQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnSGVscFRleHQnfSwKKyAgICAgICAgICAgICdhcmVhJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2hlbHB0ZXh0X2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAna2V5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd0ZXh0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVyJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0xheWVyJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX2luZGV4X3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCd9KSwKKyAgICAgICAgICAgICdsb2NhbF9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXJfdmVyc2lvbic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdMYXllcl9WZXJzaW9uJ30sCisgICAgICAgICAgICAnYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2xheWVyX3ZlcnNpb25fYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NvbW1pdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2xheWVyX3ZlcnNpb25fbGF5ZXInIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllciddIn0pLAorICAgICAgICAgICAgJ3ByaW9yaXR5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxvZ21lc3NhZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnTG9nTWVzc2FnZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGV2ZWwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsaW5lbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtZXNzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI0MCd9KSwKKyAgICAgICAgICAgICdwYXRobmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhc2snXSIsICdudWxsJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2UnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2luc3RhbGxlZF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogIicnIiwgJ21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2luc3RhbGxlZF9zaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbGljZW5zZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlY2lwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZXZpc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICczMicsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NlY3Rpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnODAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnc3VtbWFyeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2VfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3BhY2thZ2VfZGVwZW5kZW5jaWVzX3RhcmdldCciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidwYWNrYWdlX2RlcGVuZGVuY2llc19zb3VyY2UnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10iLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2VfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlX0ZpbGUnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIididWlsZGZpbGVsaXN0X3BhY2thZ2UnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICAncGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWNpcGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVjaXBlJ30sCisgICAgICAgICAgICAnYnVndHJhY2tlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2ZpbGVfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ2hvbWVwYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncmVjaXBlX2xheWVyX3ZlcnNpb24nIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnbGljZW5zZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NlY3Rpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3VtbWFyeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlY2lwZV9kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlY2lwZV9EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwX3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyX2RlcGVuZGVuY2llc19kZXBlbmRzJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JlY2lwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyX2RlcGVuZGVuY2llc19yZWNpcGUnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0J30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpbWFnZV9zaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnaXNfaW1hZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAnbGljZW5zZV9tYW5pZmVzdF9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwMCcsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXRfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfRmlsZSd9LAorICAgICAgICAgICAgJ2RpcmVjdG9yeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidkaXJlY3Rvcnlfc2V0JyIsICdudWxsJzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLlRhcmdldF9GaWxlJ10ifSksCisgICAgICAgICAgICAnZ3JvdXAnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTI4J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpbm9kZXR5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnb3duZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTI4J30pLAorICAgICAgICAgICAgJ3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdwZXJtaXNzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzE2J30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnc3ltX3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidzeW1saW5rX3NldCciLCAnbnVsbCc6ICdUcnVlJywgJ3RvJzogdSJvcm1bJ29ybS5UYXJnZXRfRmlsZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9pbWFnZV9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9JbWFnZV9GaWxlJ30sCisgICAgICAgICAgICAnZmlsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICAnZmlsZV9zaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXRfaW5zdGFsbGVkX3BhY2thZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0luc3RhbGxlZF9QYWNrYWdlJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhY2thZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInYnVpbGR0YXJnZXRsaXN0X3BhY2thZ2UnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFzayc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvcmRlcmluZyc6ICIoJ29yZGVyJywgJ3JlY2lwZScpIiwgJ3VuaXF1ZV90b2dldGhlcic6ICIoKCdidWlsZCcsICdyZWNpcGUnLCAndGFza19uYW1lJyksKSIsICdvYmplY3RfbmFtZSc6ICdUYXNrJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY3B1X3VzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EZWNpbWFsRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnLCAnbWF4X2RpZ2l0cyc6ICc2JywgJ2RlY2ltYWxfcGxhY2VzJzogJzInfSksCisgICAgICAgICAgICAnZGlza19pbyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2VsYXBzZWRfdGltZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGVjaW1hbEZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJywgJ21heF9kaWdpdHMnOiAnNicsICdkZWNpbWFsX3BsYWNlcyc6ICcyJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsaW5lX251bWJlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xvZ2ZpbGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21lc3NhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjQwJ30pLAorICAgICAgICAgICAgJ29yZGVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnb3V0Y29tZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICctMSd9KSwKKyAgICAgICAgICAgICdwYXRoX3RvX3NzdGF0ZV9vYmonOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JlY2lwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIididWlsZF9yZWNpcGUnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KSwKKyAgICAgICAgICAgICdzY3JpcHRfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3NvdXJjZV91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NzdGF0ZV9jaGVja3N1bSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzc3RhdGVfcmVzdWx0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAndGFza19leGVjdXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICd0YXNrX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3dvcmtfZGlyZWN0b3J5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXNrX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFza19EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2RlcGVuZGVuY2llc19kZXBlbmRzJyIsICd0byc6IHUib3JtWydvcm0uVGFzayddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfZGVwZW5kZW5jaWVzX3Rhc2snIiwgJ3RvJzogdSJvcm1bJ29ybS5UYXNrJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udmFyaWFibGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVmFyaWFibGUnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid2YXJpYWJsZV9idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY2hhbmdlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdodW1hbl9yZWFkYWJsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndmFyaWFibGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndmFyaWFibGVfdmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udmFyaWFibGVoaXN0b3J5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1ZhcmlhYmxlSGlzdG9yeSd9LAorICAgICAgICAgICAgJ2ZpbGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsaW5lX251bWJlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ29wZXJhdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc2NCd9KSwKKyAgICAgICAgICAgICd2YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid2aGlzdG9yeSciLCAndG8nOiB1Im9ybVsnb3JtLlZhcmlhYmxlJ10ifSkKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbXBsZXRlX2FwcHMgPSBbJ29ybSddCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMDlfYXV0b19fYWRkX3Byb2plY3R2YXJpYWJsZV9fYWRkX3Byb2plY3RsYXllcl9fYWRkX3Byb2plY3R0YXJnZXRfX2FkZF9wci5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAwOV9hdXRvX19hZGRfcHJvamVjdHZhcmlhYmxlX19hZGRfcHJvamVjdGxheWVyX19hZGRfcHJvamVjdHRhcmdldF9fYWRkX3ByLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNThkYzIKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMDlfYXV0b19fYWRkX3Byb2plY3R2YXJpYWJsZV9fYWRkX3Byb2plY3RsYXllcl9fYWRkX3Byb2plY3R0YXJnZXRfX2FkZF9wci5weQpAQCAtMCwwICsxLDI4NiBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KK2Zyb20gc291dGgudXRpbHMgaW1wb3J0IGRhdGV0aW1lX3V0aWxzIGFzIGRhdGV0aW1lCitmcm9tIHNvdXRoLmRiIGltcG9ydCBkYgorZnJvbSBzb3V0aC52MiBpbXBvcnQgU2NoZW1hTWlncmF0aW9uCitmcm9tIGRqYW5nby5kYiBpbXBvcnQgbW9kZWxzCisKKworY2xhc3MgTWlncmF0aW9uKFNjaGVtYU1pZ3JhdGlvbik6CisKKyAgICBkZWYgZm9yd2FyZHMoc2VsZiwgb3JtKToKKyAgICAgICAgIyBBZGRpbmcgbW9kZWwgJ1Byb2plY3RWYXJpYWJsZScKKyAgICAgICAgZGIuY3JlYXRlX3RhYmxlKHUnb3JtX3Byb2plY3R2YXJpYWJsZScsICgKKyAgICAgICAgICAgICh1J2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJykocHJpbWFyeV9rZXk9VHJ1ZSkpLAorICAgICAgICAgICAgKCdwcm9qZWN0Jywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykodG89b3JtWydvcm0uUHJvamVjdCddKSksCisgICAgICAgICAgICAoJ25hbWUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTEwMCkpLAorICAgICAgICAgICAgKCd2YWx1ZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcpKGJsYW5rPVRydWUpKSwKKyAgICAgICAgKSkKKyAgICAgICAgZGIuc2VuZF9jcmVhdGVfc2lnbmFsKHUnb3JtJywgWydQcm9qZWN0VmFyaWFibGUnXSkKKworICAgICAgICAjIEFkZGluZyBtb2RlbCAnUHJvamVjdExheWVyJworICAgICAgICBkYi5jcmVhdGVfdGFibGUodSdvcm1fcHJvamVjdGxheWVyJywgKAorICAgICAgICAgICAgKHUnaWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnKShwcmltYXJ5X2tleT1UcnVlKSksCisgICAgICAgICAgICAoJ3Byb2plY3QnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKSh0bz1vcm1bJ29ybS5Qcm9qZWN0J10pKSwKKyAgICAgICAgICAgICgnbmFtZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MTAwKSksCisgICAgICAgICAgICAoJ2dpdHVybCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MjU0KSksCisgICAgICAgICAgICAoJ2NvbW1pdCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MjU0KSksCisgICAgICAgICkpCisgICAgICAgIGRiLnNlbmRfY3JlYXRlX3NpZ25hbCh1J29ybScsIFsnUHJvamVjdExheWVyJ10pCisKKyAgICAgICAgIyBBZGRpbmcgbW9kZWwgJ1Byb2plY3RUYXJnZXQnCisgICAgICAgIGRiLmNyZWF0ZV90YWJsZSh1J29ybV9wcm9qZWN0dGFyZ2V0JywgKAorICAgICAgICAgICAgKHUnaWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnKShwcmltYXJ5X2tleT1UcnVlKSksCisgICAgICAgICAgICAoJ3Byb2plY3QnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKSh0bz1vcm1bJ29ybS5Qcm9qZWN0J10pKSwKKyAgICAgICAgICAgICgndGFyZ2V0Jywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0xMDApKSwKKyAgICAgICAgKSkKKyAgICAgICAgZGIuc2VuZF9jcmVhdGVfc2lnbmFsKHUnb3JtJywgWydQcm9qZWN0VGFyZ2V0J10pCisKKyAgICAgICAgIyBBZGRpbmcgbW9kZWwgJ1Byb2plY3QnCisgICAgICAgIGRiLmNyZWF0ZV90YWJsZSh1J29ybV9wcm9qZWN0JywgKAorICAgICAgICAgICAgKHUnaWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnKShwcmltYXJ5X2tleT1UcnVlKSksCisgICAgICAgICAgICAoJ25hbWUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTEwMCkpLAorICAgICAgICAgICAgKCdjcmVhdGVkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcpKGF1dG9fbm93X2FkZD1UcnVlLCBibGFuaz1UcnVlKSksCisgICAgICAgICAgICAoJ3VwZGF0ZWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJykoYXV0b19ub3c9VHJ1ZSwgYmxhbms9VHJ1ZSkpLAorICAgICAgICApKQorICAgICAgICBkYi5zZW5kX2NyZWF0ZV9zaWduYWwodSdvcm0nLCBbJ1Byb2plY3QnXSkKKworICAgICAgICAjIEFkZGluZyBmaWVsZCAnQnVpbGQucHJvamVjdCcKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J29ybV9idWlsZCcsICdwcm9qZWN0JywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKSh0bz1vcm1bJ29ybS5Qcm9qZWN0J10sIG51bGw9VHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisKKyAgICBkZWYgYmFja3dhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgRGVsZXRpbmcgbW9kZWwgJ1Byb2plY3RWYXJpYWJsZScKKyAgICAgICAgZGIuZGVsZXRlX3RhYmxlKHUnb3JtX3Byb2plY3R2YXJpYWJsZScpCisKKyAgICAgICAgIyBEZWxldGluZyBtb2RlbCAnUHJvamVjdExheWVyJworICAgICAgICBkYi5kZWxldGVfdGFibGUodSdvcm1fcHJvamVjdGxheWVyJykKKworICAgICAgICAjIERlbGV0aW5nIG1vZGVsICdQcm9qZWN0VGFyZ2V0JworICAgICAgICBkYi5kZWxldGVfdGFibGUodSdvcm1fcHJvamVjdHRhcmdldCcpCisKKyAgICAgICAgIyBEZWxldGluZyBtb2RlbCAnUHJvamVjdCcKKyAgICAgICAgZGIuZGVsZXRlX3RhYmxlKHUnb3JtX3Byb2plY3QnKQorCisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ0J1aWxkLnByb2plY3QnCisgICAgICAgIGRiLmRlbGV0ZV9jb2x1bW4odSdvcm1fYnVpbGQnLCAncHJvamVjdF9pZCcpCisKKworICAgIG1vZGVscyA9IHsKKyAgICAgICAgdSdvcm0uYnVpbGQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQnVpbGQnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnYnVpbGRfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnY29tcGxldGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdjb29rZXJfbG9nX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Rybyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZGlzdHJvX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Vycm9yc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtYWNoaW5lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzInfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3RhcnRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAndGltZXNwZW50JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnd2FybmluZ3Nfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5oZWxwdGV4dCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdIZWxwVGV4dCd9LAorICAgICAgICAgICAgJ2FyZWEnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInaGVscHRleHRfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdrZXknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3RleHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnTGF5ZXInfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfaW5kZXhfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgJ2xvY2FsX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcl92ZXJzaW9uJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0xheWVyX1ZlcnNpb24nfSwKKyAgICAgICAgICAgICdicmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInbGF5ZXJfdmVyc2lvbl9idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInbGF5ZXJfdmVyc2lvbl9sYXllciciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyJ10ifSksCisgICAgICAgICAgICAncHJpb3JpdHknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubG9nbWVzc2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdMb2dNZXNzYWdlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsZXZlbCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xpbmVubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21lc3NhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjQwJ30pLAorICAgICAgICAgICAgJ3BhdGhuYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFzayddIiwgJ251bGwnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW5zdGFsbGVkX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAiJyciLCAnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnaW5zdGFsbGVkX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JldmlzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzMyJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncGFja2FnZV9kZXBlbmRlbmNpZXNfdGFyZ2V0JyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3BhY2thZ2VfZGVwZW5kZW5jaWVzX3NvdXJjZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSIsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRmlsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkZmlsZWxpc3RfcGFja2FnZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICdwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3QnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdCd9LAorICAgICAgICAgICAgJ2NyZWF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vd19hZGQnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd1cGRhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3cnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3RsYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0TGF5ZXInfSwKKyAgICAgICAgICAgICdjb21taXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgJ2dpdHVybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdHRhcmdldCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0VGFyZ2V0J30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0dmFyaWFibGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdFZhcmlhYmxlJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSksCisgICAgICAgICAgICAndmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVjaXBlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlY2lwZSd9LAorICAgICAgICAgICAgJ2J1Z3RyYWNrZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdmaWxlX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICdob21lcGFnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JlY2lwZV9sYXllcl92ZXJzaW9uJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ2xpY2Vuc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzZWN0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3N1bW1hcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWNpcGVfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWNpcGVfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncl9kZXBlbmRlbmNpZXNfZGVwZW5kcyciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncl9kZXBlbmRlbmNpZXNfcmVjaXBlJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldCd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW1hZ2Vfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2lzX2ltYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ2xpY2Vuc2VfbWFuaWZlc3RfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0ZpbGUnfSwKKyAgICAgICAgICAgICdkaXJlY3RvcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInZGlyZWN0b3J5X3NldCciLCAnbnVsbCc6ICdUcnVlJywgJ3RvJzogdSJvcm1bJ29ybS5UYXJnZXRfRmlsZSddIn0pLAorICAgICAgICAgICAgJ2dyb3VwJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyOCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW5vZGV0eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ293bmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyOCd9KSwKKyAgICAgICAgICAgICdwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncGVybWlzc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxNid9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ3N5bV90YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInc3ltbGlua19zZXQnIiwgJ251bGwnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uVGFyZ2V0X0ZpbGUnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXRfaW1hZ2VfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfSW1hZ2VfRmlsZSd9LAorICAgICAgICAgICAgJ2ZpbGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgJ2ZpbGVfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2luc3RhbGxlZF9wYWNrYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9JbnN0YWxsZWRfUGFja2FnZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkdGFyZ2V0bGlzdF9wYWNrYWdlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhc2snOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb3JkZXJpbmcnOiAiKCdvcmRlcicsICdyZWNpcGUnKSIsICd1bmlxdWVfdG9nZXRoZXInOiAiKCgnYnVpbGQnLCAncmVjaXBlJywgJ3Rhc2tfbmFtZScpLCkiLCAnb2JqZWN0X25hbWUnOiAnVGFzayd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NwdV91c2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGVjaW1hbEZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJywgJ21heF9kaWdpdHMnOiAnNicsICdkZWNpbWFsX3BsYWNlcyc6ICcyJ30pLAorICAgICAgICAgICAgJ2Rpc2tfaW8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdlbGFwc2VkX3RpbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRlY2ltYWxGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZScsICdtYXhfZGlnaXRzJzogJzYnLCAnZGVjaW1hbF9wbGFjZXMnOiAnMid9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGluZV9udW1iZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsb2dmaWxlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtZXNzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI0MCd9KSwKKyAgICAgICAgICAgICdvcmRlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnLTEnfSksCisgICAgICAgICAgICAncGF0aF90b19zc3RhdGVfb2JqJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInYnVpbGRfcmVjaXBlJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSksCisgICAgICAgICAgICAnc2NyaXB0X3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzb3VyY2VfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzc3RhdGVfY2hlY2tzdW0nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3N0YXRlX3Jlc3VsdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3Rhc2tfZXhlY3V0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAndGFza19uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd3b3JrX2RpcmVjdG9yeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFza19kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Rhc2tfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19kZXBlbmRlbmNpZXNfZGVwZW5kcyciLCAndG8nOiB1Im9ybVsnb3JtLlRhc2snXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2RlcGVuZGVuY2llc190YXNrJyIsICd0byc6IHUib3JtWydvcm0uVGFzayddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnZhcmlhYmxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1ZhcmlhYmxlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndmFyaWFibGVfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NoYW5nZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnaHVtYW5fcmVhZGFibGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlX3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnZhcmlhYmxlaGlzdG9yeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdWYXJpYWJsZUhpc3RvcnknfSwKKyAgICAgICAgICAgICdmaWxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGluZV9udW1iZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvcGVyYXRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNjQnfSksCisgICAgICAgICAgICAndmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmFyaWFibGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndmhpc3RvcnknIiwgJ3RvJzogdSJvcm1bJ29ybS5WYXJpYWJsZSddIn0pCisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb21wbGV0ZV9hcHBzID0gWydvcm0nXQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDEwX2F1dG9fX2FkZF9maWVsZF9wcm9qZWN0X2JyYW5jaF9fYWRkX2ZpZWxkX3Byb2plY3Rfc2hvcnRfZGVzY3JpcHRpb25fX2EucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMTBfYXV0b19fYWRkX2ZpZWxkX3Byb2plY3RfYnJhbmNoX19hZGRfZmllbGRfcHJvamVjdF9zaG9ydF9kZXNjcmlwdGlvbl9fYS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTFjZTFmCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDEwX2F1dG9fX2FkZF9maWVsZF9wcm9qZWN0X2JyYW5jaF9fYWRkX2ZpZWxkX3Byb2plY3Rfc2hvcnRfZGVzY3JpcHRpb25fX2EucHkKQEAgLTAsMCArMSwyNTcgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCitmcm9tIHNvdXRoLnV0aWxzIGltcG9ydCBkYXRldGltZV91dGlscyBhcyBkYXRldGltZQorZnJvbSBzb3V0aC5kYiBpbXBvcnQgZGIKK2Zyb20gc291dGgudjIgaW1wb3J0IFNjaGVtYU1pZ3JhdGlvbgorZnJvbSBkamFuZ28uZGIgaW1wb3J0IG1vZGVscworCisKK2NsYXNzIE1pZ3JhdGlvbihTY2hlbWFNaWdyYXRpb24pOgorCisgICAgZGVmIGZvcndhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgQWRkaW5nIGZpZWxkICdQcm9qZWN0LmJyYW5jaCcKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J29ybV9wcm9qZWN0JywgJ2JyYW5jaCcsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykoZGVmYXVsdD0nbWFzdGVyJywgbWF4X2xlbmd0aD01MCksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisgICAgICAgICMgQWRkaW5nIGZpZWxkICdQcm9qZWN0LnNob3J0X2Rlc2NyaXB0aW9uJworICAgICAgICBkYi5hZGRfY29sdW1uKHUnb3JtX3Byb2plY3QnLCAnc2hvcnRfZGVzY3JpcHRpb24nLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKGRlZmF1bHQ9JycsIG1heF9sZW5ndGg9NTAsIGJsYW5rPVRydWUpLAorICAgICAgICAgICAgICAgICAgICAgIGtlZXBfZGVmYXVsdD1GYWxzZSkKKworICAgICAgICAjIEFkZGluZyBmaWVsZCAnUHJvamVjdC51c2VyX2lkJworICAgICAgICBkYi5hZGRfY29sdW1uKHUnb3JtX3Byb2plY3QnLCAndXNlcl9pZCcsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJykobnVsbD1UcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICBrZWVwX2RlZmF1bHQ9RmFsc2UpCisKKworICAgIGRlZiBiYWNrd2FyZHMoc2VsZiwgb3JtKToKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnUHJvamVjdC5icmFuY2gnCisgICAgICAgIGRiLmRlbGV0ZV9jb2x1bW4odSdvcm1fcHJvamVjdCcsICdicmFuY2gnKQorCisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ1Byb2plY3Quc2hvcnRfZGVzY3JpcHRpb24nCisgICAgICAgIGRiLmRlbGV0ZV9jb2x1bW4odSdvcm1fcHJvamVjdCcsICdzaG9ydF9kZXNjcmlwdGlvbicpCisKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnUHJvamVjdC51c2VyX2lkJworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnb3JtX3Byb2plY3QnLCAndXNlcl9pZCcpCisKKworICAgIG1vZGVscyA9IHsKKyAgICAgICAgdSdvcm0uYnVpbGQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQnVpbGQnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnYnVpbGRfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnY29tcGxldGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdjb29rZXJfbG9nX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Rybyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZGlzdHJvX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Vycm9yc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtYWNoaW5lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzInfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3RhcnRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAndGltZXNwZW50JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnd2FybmluZ3Nfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5oZWxwdGV4dCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdIZWxwVGV4dCd9LAorICAgICAgICAgICAgJ2FyZWEnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInaGVscHRleHRfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdrZXknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3RleHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnTGF5ZXInfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfaW5kZXhfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgJ2xvY2FsX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcl92ZXJzaW9uJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0xheWVyX1ZlcnNpb24nfSwKKyAgICAgICAgICAgICdicmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInbGF5ZXJfdmVyc2lvbl9idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInbGF5ZXJfdmVyc2lvbl9sYXllciciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyJ10ifSksCisgICAgICAgICAgICAncHJpb3JpdHknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubG9nbWVzc2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdMb2dNZXNzYWdlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsZXZlbCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xpbmVubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21lc3NhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjQwJ30pLAorICAgICAgICAgICAgJ3BhdGhuYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFzayddIiwgJ251bGwnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW5zdGFsbGVkX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAiJyciLCAnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnaW5zdGFsbGVkX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JldmlzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzMyJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncGFja2FnZV9kZXBlbmRlbmNpZXNfdGFyZ2V0JyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3BhY2thZ2VfZGVwZW5kZW5jaWVzX3NvdXJjZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSIsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRmlsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkZmlsZWxpc3RfcGFja2FnZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICdwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3QnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdCd9LAorICAgICAgICAgICAgJ2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdjcmVhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3dfYWRkJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnc2hvcnRfZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cGRhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3cnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VzZXJfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0bGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdExheWVyJ30sCisgICAgICAgICAgICAnY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgICdnaXR1cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3R0YXJnZXQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdFRhcmdldCd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdHZhcmlhYmxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Byb2plY3RWYXJpYWJsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pLAorICAgICAgICAgICAgJ3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlY2lwZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWNpcGUnfSwKKyAgICAgICAgICAgICdidWd0cmFja2VyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZmlsZV9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAnaG9tZXBhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyZWNpcGVfbGF5ZXJfdmVyc2lvbiciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVjaXBlX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVjaXBlX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX2RlcGVuZHMnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX3JlY2lwZSciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXQnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2ltYWdlX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdpc19pbWFnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICdsaWNlbnNlX21hbmlmZXN0X3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9GaWxlJ30sCisgICAgICAgICAgICAnZGlyZWN0b3J5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2RpcmVjdG9yeV9zZXQnIiwgJ251bGwnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uVGFyZ2V0X0ZpbGUnXSJ9KSwKKyAgICAgICAgICAgICdncm91cCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMjgnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2lub2RldHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdvd25lcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMjgnfSksCisgICAgICAgICAgICAncGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Blcm1pc3Npb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTYnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdzeW1fdGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3N5bWxpbmtfc2V0JyIsICdudWxsJzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLlRhcmdldF9GaWxlJ10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2ltYWdlX2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0ltYWdlX0ZpbGUnfSwKKyAgICAgICAgICAgICdmaWxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgICdmaWxlX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9pbnN0YWxsZWRfcGFja2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfSW5zdGFsbGVkX1BhY2thZ2UnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIididWlsZHRhcmdldGxpc3RfcGFja2FnZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXNrJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29yZGVyaW5nJzogIignb3JkZXInLCAncmVjaXBlJykiLCAndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2J1aWxkJywgJ3JlY2lwZScsICd0YXNrX25hbWUnKSwpIiwgJ29iamVjdF9uYW1lJzogJ1Rhc2snfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjcHVfdXNhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRlY2ltYWxGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZScsICdtYXhfZGlnaXRzJzogJzYnLCAnZGVjaW1hbF9wbGFjZXMnOiAnMid9KSwKKyAgICAgICAgICAgICdkaXNrX2lvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZWxhcHNlZF90aW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EZWNpbWFsRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnLCAnbWF4X2RpZ2l0cyc6ICc2JywgJ2RlY2ltYWxfcGxhY2VzJzogJzInfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xpbmVfbnVtYmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbG9nZmlsZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWVzc2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNDAnfSksCisgICAgICAgICAgICAnb3JkZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJy0xJ30pLAorICAgICAgICAgICAgJ3BhdGhfdG9fc3N0YXRlX29iaic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkX3JlY2lwZSciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pLAorICAgICAgICAgICAgJ3NjcmlwdF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnc291cmNlX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3N0YXRlX2NoZWNrc3VtJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NzdGF0ZV9yZXN1bHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd0YXNrX2V4ZWN1dGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ3Rhc2tfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnd29ya19kaXJlY3RvcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhc2tfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXNrX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfZGVwZW5kZW5jaWVzX2RlcGVuZHMnIiwgJ3RvJzogdSJvcm1bJ29ybS5UYXNrJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19kZXBlbmRlbmNpZXNfdGFzayciLCAndG8nOiB1Im9ybVsnb3JtLlRhc2snXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS52YXJpYWJsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdWYXJpYWJsZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3ZhcmlhYmxlX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjaGFuZ2VkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2h1bWFuX3JlYWRhYmxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZV92YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS52YXJpYWJsZWhpc3RvcnknOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVmFyaWFibGVIaXN0b3J5J30sCisgICAgICAgICAgICAnZmlsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xpbmVfbnVtYmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnb3BlcmF0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzY0J30pLAorICAgICAgICAgICAgJ3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3ZoaXN0b3J5JyIsICd0byc6IHUib3JtWydvcm0uVmFyaWFibGUnXSJ9KQorICAgICAgICB9CisgICAgfQorCisgICAgY29tcGxldGVfYXBwcyA9IFsnb3JtJ10KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMTFfYXV0b19fYWRkX2ZpZWxkX3Byb2plY3RsYXllcl9kaXJwYXRoLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDExX2F1dG9fX2FkZF9maWVsZF9wcm9qZWN0bGF5ZXJfZGlycGF0aC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTY1MjIxCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDExX2F1dG9fX2FkZF9maWVsZF9wcm9qZWN0bGF5ZXJfZGlycGF0aC5weQpAQCAtMCwwICsxLDI0MiBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KK2Zyb20gc291dGgudXRpbHMgaW1wb3J0IGRhdGV0aW1lX3V0aWxzIGFzIGRhdGV0aW1lCitmcm9tIHNvdXRoLmRiIGltcG9ydCBkYgorZnJvbSBzb3V0aC52MiBpbXBvcnQgU2NoZW1hTWlncmF0aW9uCitmcm9tIGRqYW5nby5kYiBpbXBvcnQgbW9kZWxzCisKKworY2xhc3MgTWlncmF0aW9uKFNjaGVtYU1pZ3JhdGlvbik6CisKKyAgICBkZWYgZm9yd2FyZHMoc2VsZiwgb3JtKToKKyAgICAgICAgIyBBZGRpbmcgZmllbGQgJ1Byb2plY3RMYXllci5kaXJwYXRoJworICAgICAgICBkYi5hZGRfY29sdW1uKHUnb3JtX3Byb2plY3RsYXllcicsICdkaXJwYXRoJywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShkZWZhdWx0PScnLCBtYXhfbGVuZ3RoPTI1NCksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisKKyAgICBkZWYgYmFja3dhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ1Byb2plY3RMYXllci5kaXJwYXRoJworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnb3JtX3Byb2plY3RsYXllcicsICdkaXJwYXRoJykKKworCisgICAgbW9kZWxzID0geworICAgICAgICB1J29ybS5idWlsZCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZCd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdidWlsZF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdjb21wbGV0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2Nvb2tlcl9sb2dfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnfSksCisgICAgICAgICAgICAnZGlzdHJvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm9fdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZXJyb3JzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21hY2hpbmUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMid9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzdGFydGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICd0aW1lc3BlbnQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd3YXJuaW5nc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmhlbHB0ZXh0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0hlbHBUZXh0J30sCisgICAgICAgICAgICAnYXJlYSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidoZWxwdGV4dF9idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2tleSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndGV4dCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdMYXllcid9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9pbmRleF91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICAnbG9jYWxfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVyX3ZlcnNpb24nOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnTGF5ZXJfVmVyc2lvbid9LAorICAgICAgICAgICAgJ2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidsYXllcl92ZXJzaW9uX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjb21taXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidsYXllcl92ZXJzaW9uX2xheWVyJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXInXSJ9KSwKKyAgICAgICAgICAgICdwcmlvcml0eSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sb2dtZXNzYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0xvZ01lc3NhZ2UnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xldmVsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbGluZW5vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWVzc2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNDAnfSksCisgICAgICAgICAgICAncGF0aG5hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXNrJ10iLCAnbnVsbCc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpbnN0YWxsZWRfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICInJyIsICdtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdpbnN0YWxsZWRfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xpY2Vuc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnODAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAncmV2aXNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMzInLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzZWN0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3N1bW1hcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZV9EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwX3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidwYWNrYWdlX2RlcGVuZGVuY2llc190YXJnZXQnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhY2thZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncGFja2FnZV9kZXBlbmRlbmNpZXNfc291cmNlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIiwgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlX2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZV9GaWxlJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhY2thZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInYnVpbGRmaWxlbGlzdF9wYWNrYWdlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0J30sCisgICAgICAgICAgICAnYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ2NyZWF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vd19hZGQnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdzaG9ydF9kZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwZGF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vdyc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXNlcl9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3RsYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0TGF5ZXInfSwKKyAgICAgICAgICAgICdjb21taXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgJ2RpcnBhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgJ2dpdHVybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdHRhcmdldCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0VGFyZ2V0J30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0dmFyaWFibGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdFZhcmlhYmxlJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSksCisgICAgICAgICAgICAndmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVjaXBlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlY2lwZSd9LAorICAgICAgICAgICAgJ2J1Z3RyYWNrZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdmaWxlX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICdob21lcGFnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JlY2lwZV9sYXllcl92ZXJzaW9uJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ2xpY2Vuc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzZWN0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3N1bW1hcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWNpcGVfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWNpcGVfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncl9kZXBlbmRlbmNpZXNfZGVwZW5kcyciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncl9kZXBlbmRlbmNpZXNfcmVjaXBlJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldCd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW1hZ2Vfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2lzX2ltYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ2xpY2Vuc2VfbWFuaWZlc3RfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0ZpbGUnfSwKKyAgICAgICAgICAgICdkaXJlY3RvcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInZGlyZWN0b3J5X3NldCciLCAnbnVsbCc6ICdUcnVlJywgJ3RvJzogdSJvcm1bJ29ybS5UYXJnZXRfRmlsZSddIn0pLAorICAgICAgICAgICAgJ2dyb3VwJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyOCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW5vZGV0eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ293bmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyOCd9KSwKKyAgICAgICAgICAgICdwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncGVybWlzc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxNid9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ3N5bV90YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInc3ltbGlua19zZXQnIiwgJ251bGwnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uVGFyZ2V0X0ZpbGUnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXRfaW1hZ2VfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfSW1hZ2VfRmlsZSd9LAorICAgICAgICAgICAgJ2ZpbGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgJ2ZpbGVfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2luc3RhbGxlZF9wYWNrYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9JbnN0YWxsZWRfUGFja2FnZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkdGFyZ2V0bGlzdF9wYWNrYWdlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhc2snOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb3JkZXJpbmcnOiAiKCdvcmRlcicsICdyZWNpcGUnKSIsICd1bmlxdWVfdG9nZXRoZXInOiAiKCgnYnVpbGQnLCAncmVjaXBlJywgJ3Rhc2tfbmFtZScpLCkiLCAnb2JqZWN0X25hbWUnOiAnVGFzayd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NwdV91c2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGVjaW1hbEZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJywgJ21heF9kaWdpdHMnOiAnNicsICdkZWNpbWFsX3BsYWNlcyc6ICcyJ30pLAorICAgICAgICAgICAgJ2Rpc2tfaW8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdlbGFwc2VkX3RpbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRlY2ltYWxGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZScsICdtYXhfZGlnaXRzJzogJzYnLCAnZGVjaW1hbF9wbGFjZXMnOiAnMid9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGluZV9udW1iZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsb2dmaWxlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtZXNzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI0MCd9KSwKKyAgICAgICAgICAgICdvcmRlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnLTEnfSksCisgICAgICAgICAgICAncGF0aF90b19zc3RhdGVfb2JqJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInYnVpbGRfcmVjaXBlJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSksCisgICAgICAgICAgICAnc2NyaXB0X3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzb3VyY2VfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzc3RhdGVfY2hlY2tzdW0nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3N0YXRlX3Jlc3VsdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3Rhc2tfZXhlY3V0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAndGFza19uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd3b3JrX2RpcmVjdG9yeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFza19kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Rhc2tfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19kZXBlbmRlbmNpZXNfZGVwZW5kcyciLCAndG8nOiB1Im9ybVsnb3JtLlRhc2snXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2RlcGVuZGVuY2llc190YXNrJyIsICd0byc6IHUib3JtWydvcm0uVGFzayddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnZhcmlhYmxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1ZhcmlhYmxlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndmFyaWFibGVfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NoYW5nZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnaHVtYW5fcmVhZGFibGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlX3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnZhcmlhYmxlaGlzdG9yeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdWYXJpYWJsZUhpc3RvcnknfSwKKyAgICAgICAgICAgICdmaWxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGluZV9udW1iZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvcGVyYXRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNjQnfSksCisgICAgICAgICAgICAndmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmFyaWFibGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndmhpc3RvcnknIiwgJ3RvJzogdSJvcm1bJ29ybS5WYXJpYWJsZSddIn0pCisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb21wbGV0ZV9hcHBzID0gWydvcm0nXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAxMl9hdXRvX19hZGRfZmllbGRfcHJvamVjdGxheWVyX29wdGlvbmFsX19hZGRfZmllbGRfcHJvamVjdHRhcmdldF90YXNrLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDEyX2F1dG9fX2FkZF9maWVsZF9wcm9qZWN0bGF5ZXJfb3B0aW9uYWxfX2FkZF9maWVsZF9wcm9qZWN0dGFyZ2V0X3Rhc2sucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU0ODNmNQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAxMl9hdXRvX19hZGRfZmllbGRfcHJvamVjdGxheWVyX29wdGlvbmFsX19hZGRfZmllbGRfcHJvamVjdHRhcmdldF90YXNrLnB5CkBAIC0wLDAgKzEsMjUyIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorZnJvbSBzb3V0aC51dGlscyBpbXBvcnQgZGF0ZXRpbWVfdXRpbHMgYXMgZGF0ZXRpbWUKK2Zyb20gc291dGguZGIgaW1wb3J0IGRiCitmcm9tIHNvdXRoLnYyIGltcG9ydCBTY2hlbWFNaWdyYXRpb24KK2Zyb20gZGphbmdvLmRiIGltcG9ydCBtb2RlbHMKKworCitjbGFzcyBNaWdyYXRpb24oU2NoZW1hTWlncmF0aW9uKToKKworICAgIGRlZiBmb3J3YXJkcyhzZWxmLCBvcm0pOgorICAgICAgICAjIEFkZGluZyBmaWVsZCAnUHJvamVjdExheWVyLm9wdGlvbmFsJworICAgICAgICBkYi5hZGRfY29sdW1uKHUnb3JtX3Byb2plY3RsYXllcicsICdvcHRpb25hbCcsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJykoZGVmYXVsdD1UcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICBrZWVwX2RlZmF1bHQ9RmFsc2UpCisKKyAgICAgICAgIyBBZGRpbmcgZmllbGQgJ1Byb2plY3RUYXJnZXQudGFzaycKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J29ybV9wcm9qZWN0dGFyZ2V0JywgJ3Rhc2snLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MTAwLCBudWxsPVRydWUpLAorICAgICAgICAgICAgICAgICAgICAgIGtlZXBfZGVmYXVsdD1GYWxzZSkKKworCisgICAgZGVmIGJhY2t3YXJkcyhzZWxmLCBvcm0pOgorICAgICAgICAjIERlbGV0aW5nIGZpZWxkICdQcm9qZWN0TGF5ZXIub3B0aW9uYWwnCisgICAgICAgIGRiLmRlbGV0ZV9jb2x1bW4odSdvcm1fcHJvamVjdGxheWVyJywgJ29wdGlvbmFsJykKKworICAgICAgICAjIERlbGV0aW5nIGZpZWxkICdQcm9qZWN0VGFyZ2V0LnRhc2snCisgICAgICAgIGRiLmRlbGV0ZV9jb2x1bW4odSdvcm1fcHJvamVjdHRhcmdldCcsICd0YXNrJykKKworCisgICAgbW9kZWxzID0geworICAgICAgICB1J29ybS5idWlsZCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZCd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdidWlsZF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdjb21wbGV0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2Nvb2tlcl9sb2dfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnfSksCisgICAgICAgICAgICAnZGlzdHJvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm9fdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZXJyb3JzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21hY2hpbmUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMid9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzdGFydGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICd0aW1lc3BlbnQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd3YXJuaW5nc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmhlbHB0ZXh0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0hlbHBUZXh0J30sCisgICAgICAgICAgICAnYXJlYSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidoZWxwdGV4dF9idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2tleSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndGV4dCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdMYXllcid9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9pbmRleF91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICAnbG9jYWxfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVyX3ZlcnNpb24nOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnTGF5ZXJfVmVyc2lvbid9LAorICAgICAgICAgICAgJ2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidsYXllcl92ZXJzaW9uX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjb21taXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidsYXllcl92ZXJzaW9uX2xheWVyJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXInXSJ9KSwKKyAgICAgICAgICAgICdwcmlvcml0eSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sb2dtZXNzYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0xvZ01lc3NhZ2UnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xldmVsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbGluZW5vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWVzc2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNDAnfSksCisgICAgICAgICAgICAncGF0aG5hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXNrJ10iLCAnbnVsbCc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpbnN0YWxsZWRfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICInJyIsICdtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdpbnN0YWxsZWRfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xpY2Vuc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnODAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAncmV2aXNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMzInLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzZWN0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3N1bW1hcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZV9EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwX3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidwYWNrYWdlX2RlcGVuZGVuY2llc190YXJnZXQnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhY2thZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncGFja2FnZV9kZXBlbmRlbmNpZXNfc291cmNlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIiwgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlX2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZV9GaWxlJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhY2thZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInYnVpbGRmaWxlbGlzdF9wYWNrYWdlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0J30sCisgICAgICAgICAgICAnYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ2NyZWF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vd19hZGQnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdzaG9ydF9kZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwZGF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vdyc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXNlcl9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3RsYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0TGF5ZXInfSwKKyAgICAgICAgICAgICdjb21taXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgJ2RpcnBhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgJ2dpdHVybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ29wdGlvbmFsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ1RydWUnfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0dGFyZ2V0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Byb2plY3RUYXJnZXQnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0dmFyaWFibGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdFZhcmlhYmxlJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSksCisgICAgICAgICAgICAndmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVjaXBlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlY2lwZSd9LAorICAgICAgICAgICAgJ2J1Z3RyYWNrZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdmaWxlX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICdob21lcGFnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JlY2lwZV9sYXllcl92ZXJzaW9uJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ2xpY2Vuc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzZWN0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3N1bW1hcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWNpcGVfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWNpcGVfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncl9kZXBlbmRlbmNpZXNfZGVwZW5kcyciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncl9kZXBlbmRlbmNpZXNfcmVjaXBlJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldCd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW1hZ2Vfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2lzX2ltYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ2xpY2Vuc2VfbWFuaWZlc3RfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0ZpbGUnfSwKKyAgICAgICAgICAgICdkaXJlY3RvcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInZGlyZWN0b3J5X3NldCciLCAnbnVsbCc6ICdUcnVlJywgJ3RvJzogdSJvcm1bJ29ybS5UYXJnZXRfRmlsZSddIn0pLAorICAgICAgICAgICAgJ2dyb3VwJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyOCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW5vZGV0eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ293bmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyOCd9KSwKKyAgICAgICAgICAgICdwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncGVybWlzc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxNid9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ3N5bV90YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInc3ltbGlua19zZXQnIiwgJ251bGwnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uVGFyZ2V0X0ZpbGUnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXRfaW1hZ2VfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfSW1hZ2VfRmlsZSd9LAorICAgICAgICAgICAgJ2ZpbGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgJ2ZpbGVfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2luc3RhbGxlZF9wYWNrYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9JbnN0YWxsZWRfUGFja2FnZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkdGFyZ2V0bGlzdF9wYWNrYWdlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhc2snOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb3JkZXJpbmcnOiAiKCdvcmRlcicsICdyZWNpcGUnKSIsICd1bmlxdWVfdG9nZXRoZXInOiAiKCgnYnVpbGQnLCAncmVjaXBlJywgJ3Rhc2tfbmFtZScpLCkiLCAnb2JqZWN0X25hbWUnOiAnVGFzayd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NwdV91c2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGVjaW1hbEZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJywgJ21heF9kaWdpdHMnOiAnNicsICdkZWNpbWFsX3BsYWNlcyc6ICcyJ30pLAorICAgICAgICAgICAgJ2Rpc2tfaW8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdlbGFwc2VkX3RpbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRlY2ltYWxGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZScsICdtYXhfZGlnaXRzJzogJzYnLCAnZGVjaW1hbF9wbGFjZXMnOiAnMid9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGluZV9udW1iZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsb2dmaWxlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtZXNzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI0MCd9KSwKKyAgICAgICAgICAgICdvcmRlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnLTEnfSksCisgICAgICAgICAgICAncGF0aF90b19zc3RhdGVfb2JqJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInYnVpbGRfcmVjaXBlJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSksCisgICAgICAgICAgICAnc2NyaXB0X3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzb3VyY2VfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzc3RhdGVfY2hlY2tzdW0nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3N0YXRlX3Jlc3VsdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3Rhc2tfZXhlY3V0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAndGFza19uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd3b3JrX2RpcmVjdG9yeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFza19kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Rhc2tfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19kZXBlbmRlbmNpZXNfZGVwZW5kcyciLCAndG8nOiB1Im9ybVsnb3JtLlRhc2snXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2RlcGVuZGVuY2llc190YXNrJyIsICd0byc6IHUib3JtWydvcm0uVGFzayddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnZhcmlhYmxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1ZhcmlhYmxlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndmFyaWFibGVfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NoYW5nZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnaHVtYW5fcmVhZGFibGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlX3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnZhcmlhYmxlaGlzdG9yeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdWYXJpYWJsZUhpc3RvcnknfSwKKyAgICAgICAgICAgICdmaWxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGluZV9udW1iZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvcGVyYXRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNjQnfSksCisgICAgICAgICAgICAndmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmFyaWFibGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndmhpc3RvcnknIiwgJ3RvJzogdSJvcm1bJ29ybS5WYXJpYWJsZSddIn0pCisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb21wbGV0ZV9hcHBzID0gWydvcm0nXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAxM19hdXRvX19hZGRfcmVsZWFzZV9fYWRkX2xheWVydmVyc2lvbmRlcGVuZGVuY3lfX2FkZF91bmlxdWVfbGF5ZXJ2ZXJzaW9uLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDEzX2F1dG9fX2FkZF9yZWxlYXNlX19hZGRfbGF5ZXJ2ZXJzaW9uZGVwZW5kZW5jeV9fYWRkX3VuaXF1ZV9sYXllcnZlcnNpb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M5NTRlNgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAxM19hdXRvX19hZGRfcmVsZWFzZV9fYWRkX2xheWVydmVyc2lvbmRlcGVuZGVuY3lfX2FkZF91bmlxdWVfbGF5ZXJ2ZXJzaW9uLnB5CkBAIC0wLDAgKzEsNzEwIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorZnJvbSBzb3V0aC51dGlscyBpbXBvcnQgZGF0ZXRpbWVfdXRpbHMgYXMgZGF0ZXRpbWUKK2Zyb20gc291dGguZGIgaW1wb3J0IGRiCitmcm9tIHNvdXRoLnYyIGltcG9ydCBTY2hlbWFNaWdyYXRpb24KK2Zyb20gZGphbmdvLmRiIGltcG9ydCBtb2RlbHMKKworCitjbGFzcyBNaWdyYXRpb24oU2NoZW1hTWlncmF0aW9uKToKKworICAgIGRlZiBmb3J3YXJkcyhzZWxmLCBvcm0pOgorICAgICAgICAjIEFkZGluZyBtb2RlbCAnUmVsZWFzZScKKyAgICAgICAgZGIuY3JlYXRlX3RhYmxlKHUnb3JtX3JlbGVhc2UnLCAoCisgICAgICAgICAgICAodSdpZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcpKHByaW1hcnlfa2V5PVRydWUpKSwKKyAgICAgICAgICAgICgnbmFtZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKHVuaXF1ZT1UcnVlLCBtYXhfbGVuZ3RoPTMyKSksCisgICAgICAgICAgICAoJ2Rlc2NyaXB0aW9uJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0yNTUpKSwKKyAgICAgICAgICAgICgnYml0YmFrZV92ZXJzaW9uJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykodG89b3JtWydvcm0uQml0YmFrZVZlcnNpb24nXSkpLAorICAgICAgICAgICAgKCdicmFuY2gnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTMyKSksCisgICAgICAgICkpCisgICAgICAgIGRiLnNlbmRfY3JlYXRlX3NpZ25hbCh1J29ybScsIFsnUmVsZWFzZSddKQorCisgICAgICAgICMgQWRkaW5nIG1vZGVsICdMYXllclZlcnNpb25EZXBlbmRlbmN5JworICAgICAgICBkYi5jcmVhdGVfdGFibGUodSdvcm1fbGF5ZXJ2ZXJzaW9uZGVwZW5kZW5jeScsICgKKyAgICAgICAgICAgICh1J2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJykocHJpbWFyeV9rZXk9VHJ1ZSkpLAorICAgICAgICAgICAgKCdsYXllcl9zb3VyY2UnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKShkZWZhdWx0PU5vbmUsIHRvPW9ybVsnb3JtLkxheWVyU291cmNlJ10sIG51bGw9VHJ1ZSkpLAorICAgICAgICAgICAgKCd1cF9pZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcpKGRlZmF1bHQ9Tm9uZSwgbnVsbD1UcnVlKSksCisgICAgICAgICAgICAoJ2xheWVyX3ZlcnNpb24nLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKShyZWxhdGVkX25hbWU9J2RlcGVuZGVuY2llcycsIHRvPW9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSkpLAorICAgICAgICAgICAgKCdkZXBlbmRzX29uJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykocmVsYXRlZF9uYW1lPSdkZXBlbmRlZXMnLCB0bz1vcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10pKSwKKyAgICAgICAgKSkKKyAgICAgICAgZGIuc2VuZF9jcmVhdGVfc2lnbmFsKHUnb3JtJywgWydMYXllclZlcnNpb25EZXBlbmRlbmN5J10pCisKKyAgICAgICAgIyBBZGRpbmcgdW5pcXVlIGNvbnN0cmFpbnQgb24gJ0xheWVyVmVyc2lvbkRlcGVuZGVuY3knLCBmaWVsZHMgWydsYXllcl9zb3VyY2UnLCAndXBfaWQnXQorICAgICAgICBkYi5jcmVhdGVfdW5pcXVlKHUnb3JtX2xheWVydmVyc2lvbmRlcGVuZGVuY3knLCBbJ2xheWVyX3NvdXJjZV9pZCcsICd1cF9pZCddKQorCisgICAgICAgICMgQWRkaW5nIG1vZGVsICdUb2FzdGVyU2V0dGluZycKKyAgICAgICAgZGIuY3JlYXRlX3RhYmxlKHUnb3JtX3RvYXN0ZXJzZXR0aW5nJywgKAorICAgICAgICAgICAgKHUnaWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnKShwcmltYXJ5X2tleT1UcnVlKSksCisgICAgICAgICAgICAoJ25hbWUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTYzKSksCisgICAgICAgICAgICAoJ2hlbHB0ZXh0Jywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJykoKSksCisgICAgICAgICAgICAoJ3ZhbHVlJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0yNTUpKSwKKyAgICAgICAgKSkKKyAgICAgICAgZGIuc2VuZF9jcmVhdGVfc2lnbmFsKHUnb3JtJywgWydUb2FzdGVyU2V0dGluZyddKQorCisgICAgICAgICMgQWRkaW5nIG1vZGVsICdNYWNoaW5lJworICAgICAgICBkYi5jcmVhdGVfdGFibGUodSdvcm1fbWFjaGluZScsICgKKyAgICAgICAgICAgICh1J2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJykocHJpbWFyeV9rZXk9VHJ1ZSkpLAorICAgICAgICAgICAgKCdsYXllcl9zb3VyY2UnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKShkZWZhdWx0PU5vbmUsIHRvPW9ybVsnb3JtLkxheWVyU291cmNlJ10sIG51bGw9VHJ1ZSkpLAorICAgICAgICAgICAgKCd1cF9pZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcpKGRlZmF1bHQ9Tm9uZSwgbnVsbD1UcnVlKSksCisgICAgICAgICAgICAoJ3VwX2RhdGUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJykoZGVmYXVsdD1Ob25lLCBudWxsPVRydWUpKSwKKyAgICAgICAgICAgICgnbGF5ZXJfdmVyc2lvbicsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHRvPW9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSkpLAorICAgICAgICAgICAgKCduYW1lJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0yNTUpKSwKKyAgICAgICAgICAgICgnZGVzY3JpcHRpb24nLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTI1NSkpLAorICAgICAgICApKQorICAgICAgICBkYi5zZW5kX2NyZWF0ZV9zaWduYWwodSdvcm0nLCBbJ01hY2hpbmUnXSkKKworICAgICAgICAjIEFkZGluZyB1bmlxdWUgY29uc3RyYWludCBvbiAnTWFjaGluZScsIGZpZWxkcyBbJ2xheWVyX3NvdXJjZScsICd1cF9pZCddCisgICAgICAgIGRiLmNyZWF0ZV91bmlxdWUodSdvcm1fbWFjaGluZScsIFsnbGF5ZXJfc291cmNlX2lkJywgJ3VwX2lkJ10pCisKKyAgICAgICAgIyBBZGRpbmcgbW9kZWwgJ1JlbGVhc2VEZWZhdWx0TGF5ZXInCisgICAgICAgIGRiLmNyZWF0ZV90YWJsZSh1J29ybV9yZWxlYXNlZGVmYXVsdGxheWVyJywgKAorICAgICAgICAgICAgKHUnaWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnKShwcmltYXJ5X2tleT1UcnVlKSksCisgICAgICAgICAgICAoJ3JlbGVhc2UnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKSh0bz1vcm1bJ29ybS5SZWxlYXNlJ10pKSwKKyAgICAgICAgICAgICgnbGF5ZXInLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKSh0bz1vcm1bJ29ybS5MYXllciddKSksCisgICAgICAgICkpCisgICAgICAgIGRiLnNlbmRfY3JlYXRlX3NpZ25hbCh1J29ybScsIFsnUmVsZWFzZURlZmF1bHRMYXllciddKQorCisgICAgICAgICMgQWRkaW5nIG1vZGVsICdCaXRiYWtlVmVyc2lvbicKKyAgICAgICAgZGIuY3JlYXRlX3RhYmxlKHUnb3JtX2JpdGJha2V2ZXJzaW9uJywgKAorICAgICAgICAgICAgKHUnaWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnKShwcmltYXJ5X2tleT1UcnVlKSksCisgICAgICAgICAgICAoJ25hbWUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKSh1bmlxdWU9VHJ1ZSwgbWF4X2xlbmd0aD0zMikpLAorICAgICAgICAgICAgKCdnaXR1cmwnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcpKG1heF9sZW5ndGg9MjAwKSksCisgICAgICAgICAgICAoJ2JyYW5jaCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MzIpKSwKKyAgICAgICAgICAgICgnZGlycGF0aCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MjU1KSksCisgICAgICAgICkpCisgICAgICAgIGRiLnNlbmRfY3JlYXRlX3NpZ25hbCh1J29ybScsIFsnQml0YmFrZVZlcnNpb24nXSkKKworICAgICAgICAjIEFkZGluZyBtb2RlbCAnQnJhbmNoJworICAgICAgICBkYi5jcmVhdGVfdGFibGUodSdvcm1fYnJhbmNoJywgKAorICAgICAgICAgICAgKHUnaWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnKShwcmltYXJ5X2tleT1UcnVlKSksCisgICAgICAgICAgICAoJ2xheWVyX3NvdXJjZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKGRlZmF1bHQ9VHJ1ZSwgdG89b3JtWydvcm0uTGF5ZXJTb3VyY2UnXSwgbnVsbD1UcnVlKSksCisgICAgICAgICAgICAoJ3VwX2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJykoZGVmYXVsdD1Ob25lLCBudWxsPVRydWUpKSwKKyAgICAgICAgICAgICgndXBfZGF0ZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnKShkZWZhdWx0PU5vbmUsIG51bGw9VHJ1ZSkpLAorICAgICAgICAgICAgKCduYW1lJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD01MCkpLAorICAgICAgICAgICAgKCdiaXRiYWtlX2JyYW5jaCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9NTAsIGJsYW5rPVRydWUpKSwKKyAgICAgICAgICAgICgnc2hvcnRfZGVzY3JpcHRpb24nLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTUwLCBibGFuaz1UcnVlKSksCisgICAgICAgICkpCisgICAgICAgIGRiLnNlbmRfY3JlYXRlX3NpZ25hbCh1J29ybScsIFsnQnJhbmNoJ10pCisKKyAgICAgICAgIyBBZGRpbmcgdW5pcXVlIGNvbnN0cmFpbnQgb24gJ0JyYW5jaCcsIGZpZWxkcyBbJ2xheWVyX3NvdXJjZScsICduYW1lJ10KKyAgICAgICAgZGIuY3JlYXRlX3VuaXF1ZSh1J29ybV9icmFuY2gnLCBbJ2xheWVyX3NvdXJjZV9pZCcsICduYW1lJ10pCisKKyAgICAgICAgIyBBZGRpbmcgdW5pcXVlIGNvbnN0cmFpbnQgb24gJ0JyYW5jaCcsIGZpZWxkcyBbJ2xheWVyX3NvdXJjZScsICd1cF9pZCddCisgICAgICAgIGRiLmNyZWF0ZV91bmlxdWUodSdvcm1fYnJhbmNoJywgWydsYXllcl9zb3VyY2VfaWQnLCAndXBfaWQnXSkKKworICAgICAgICAjIEFkZGluZyBtb2RlbCAnVG9hc3RlclNldHRpbmdEZWZhdWx0TGF5ZXInCisgICAgICAgIGRiLmNyZWF0ZV90YWJsZSh1J29ybV90b2FzdGVyc2V0dGluZ2RlZmF1bHRsYXllcicsICgKKyAgICAgICAgICAgICh1J2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJykocHJpbWFyeV9rZXk9VHJ1ZSkpLAorICAgICAgICAgICAgKCdsYXllcl92ZXJzaW9uJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykodG89b3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddKSksCisgICAgICAgICkpCisgICAgICAgIGRiLnNlbmRfY3JlYXRlX3NpZ25hbCh1J29ybScsIFsnVG9hc3RlclNldHRpbmdEZWZhdWx0TGF5ZXInXSkKKworICAgICAgICAjIEFkZGluZyBtb2RlbCAnTGF5ZXJTb3VyY2UnCisgICAgICAgIGRiLmNyZWF0ZV90YWJsZSh1J29ybV9sYXllcnNvdXJjZScsICgKKyAgICAgICAgICAgICh1J2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJykocHJpbWFyeV9rZXk9VHJ1ZSkpLAorICAgICAgICAgICAgKCduYW1lJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD02MykpLAorICAgICAgICAgICAgKCdzb3VyY2V0eXBlJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJykoKSksCisgICAgICAgICAgICAoJ2FwaXVybCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKGRlZmF1bHQ9Tm9uZSwgbWF4X2xlbmd0aD0yNTUsIG51bGw9VHJ1ZSkpLAorICAgICAgICApKQorICAgICAgICBkYi5zZW5kX2NyZWF0ZV9zaWduYWwodSdvcm0nLCBbJ0xheWVyU291cmNlJ10pCisKKyAgICAgICAgIyBBZGRpbmcgdW5pcXVlIGNvbnN0cmFpbnQgb24gJ0xheWVyU291cmNlJywgZmllbGRzIFsnc291cmNldHlwZScsICdhcGl1cmwnXQorICAgICAgICBkYi5jcmVhdGVfdW5pcXVlKHUnb3JtX2xheWVyc291cmNlJywgWydzb3VyY2V0eXBlJywgJ2FwaXVybCddKQorCisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ1Byb2plY3RMYXllci5uYW1lJworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnb3JtX3Byb2plY3RsYXllcicsICduYW1lJykKKworICAgICAgICAjIERlbGV0aW5nIGZpZWxkICdQcm9qZWN0TGF5ZXIuZGlycGF0aCcKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV9wcm9qZWN0bGF5ZXInLCAnZGlycGF0aCcpCisKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnUHJvamVjdExheWVyLmNvbW1pdCcKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV9wcm9qZWN0bGF5ZXInLCAnY29tbWl0JykKKworICAgICAgICAjIERlbGV0aW5nIGZpZWxkICdQcm9qZWN0TGF5ZXIuZ2l0dXJsJworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnb3JtX3Byb2plY3RsYXllcicsICdnaXR1cmwnKQorCisgICAgICAgICMgQWRkaW5nIGZpZWxkICdQcm9qZWN0TGF5ZXIubGF5ZXJjb21taXQnCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fcHJvamVjdGxheWVyJywgJ2xheWVyY29tbWl0JywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKSh0bz1vcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10sIG51bGw9VHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisgICAgICAgICMgQWRkaW5nIGZpZWxkICdMYXllcl9WZXJzaW9uLmxheWVyX3NvdXJjZScKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J29ybV9sYXllcl92ZXJzaW9uJywgJ2xheWVyX3NvdXJjZScsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykoZGVmYXVsdD1Ob25lLCB0bz1vcm1bJ29ybS5MYXllclNvdXJjZSddLCBudWxsPVRydWUpLAorICAgICAgICAgICAgICAgICAgICAgIGtlZXBfZGVmYXVsdD1GYWxzZSkKKworICAgICAgICAjIEFkZGluZyBmaWVsZCAnTGF5ZXJfVmVyc2lvbi51cF9pZCcKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J29ybV9sYXllcl92ZXJzaW9uJywgJ3VwX2lkJywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnKShkZWZhdWx0PU5vbmUsIG51bGw9VHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisgICAgICAgICMgQWRkaW5nIGZpZWxkICdMYXllcl9WZXJzaW9uLnVwX2RhdGUnCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fbGF5ZXJfdmVyc2lvbicsICd1cF9kYXRlJywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJykoZGVmYXVsdD1Ob25lLCBudWxsPVRydWUpLAorICAgICAgICAgICAgICAgICAgICAgIGtlZXBfZGVmYXVsdD1GYWxzZSkKKworICAgICAgICAjIEFkZGluZyBmaWVsZCAnTGF5ZXJfVmVyc2lvbi51cF9icmFuY2gnCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fbGF5ZXJfdmVyc2lvbicsICd1cF9icmFuY2gnLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKGRlZmF1bHQ9Tm9uZSwgdG89b3JtWydvcm0uQnJhbmNoJ10sIG51bGw9VHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisgICAgICAgICMgQWRkaW5nIGZpZWxkICdMYXllcl9WZXJzaW9uLmRpcnBhdGgnCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fbGF5ZXJfdmVyc2lvbicsICdkaXJwYXRoJywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShkZWZhdWx0PU5vbmUsIG1heF9sZW5ndGg9MjU1LCBudWxsPVRydWUpLAorICAgICAgICAgICAgICAgICAgICAgIGtlZXBfZGVmYXVsdD1GYWxzZSkKKworCisgICAgICAgICMgQ2hhbmdpbmcgZmllbGQgJ0xheWVyX1ZlcnNpb24uYnVpbGQnCisgICAgICAgIGRiLmFsdGVyX2NvbHVtbih1J29ybV9sYXllcl92ZXJzaW9uJywgJ2J1aWxkX2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykobnVsbD1UcnVlLCB0bz1vcm1bJ29ybS5CdWlsZCddKSkKKworICAgICAgICAjIENoYW5naW5nIGZpZWxkICdMYXllcl9WZXJzaW9uLmJyYW5jaCcKKyAgICAgICAgZGIuYWx0ZXJfY29sdW1uKHUnb3JtX2xheWVyX3ZlcnNpb24nLCAnYnJhbmNoJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD04MCkpCisgICAgICAgICMgQWRkaW5nIHVuaXF1ZSBjb25zdHJhaW50IG9uICdMYXllcl9WZXJzaW9uJywgZmllbGRzIFsnbGF5ZXJfc291cmNlJywgJ3VwX2lkJ10KKyAgICAgICAgZGIuY3JlYXRlX3VuaXF1ZSh1J29ybV9sYXllcl92ZXJzaW9uJywgWydsYXllcl9zb3VyY2VfaWQnLCAndXBfaWQnXSkKKworICAgICAgICAjIEFkZGluZyBmaWVsZCAnUmVjaXBlLmxheWVyX3NvdXJjZScKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J29ybV9yZWNpcGUnLCAnbGF5ZXJfc291cmNlJywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKShkZWZhdWx0PU5vbmUsIHRvPW9ybVsnb3JtLkxheWVyU291cmNlJ10sIG51bGw9VHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisgICAgICAgICMgQWRkaW5nIGZpZWxkICdSZWNpcGUudXBfaWQnCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fcmVjaXBlJywgJ3VwX2lkJywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnKShkZWZhdWx0PU5vbmUsIG51bGw9VHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisgICAgICAgICMgQWRkaW5nIGZpZWxkICdSZWNpcGUudXBfZGF0ZScKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J29ybV9yZWNpcGUnLCAndXBfZGF0ZScsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcpKGRlZmF1bHQ9Tm9uZSwgbnVsbD1UcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICBrZWVwX2RlZmF1bHQ9RmFsc2UpCisKKyAgICAgICAgIyBBZGRpbmcgZmllbGQgJ0xheWVyLmxheWVyX3NvdXJjZScKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J29ybV9sYXllcicsICdsYXllcl9zb3VyY2UnLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKGRlZmF1bHQ9Tm9uZSwgdG89b3JtWydvcm0uTGF5ZXJTb3VyY2UnXSwgbnVsbD1UcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICBrZWVwX2RlZmF1bHQ9RmFsc2UpCisKKyAgICAgICAgIyBBZGRpbmcgZmllbGQgJ0xheWVyLnVwX2lkJworICAgICAgICBkYi5hZGRfY29sdW1uKHUnb3JtX2xheWVyJywgJ3VwX2lkJywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnKShkZWZhdWx0PU5vbmUsIG51bGw9VHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisgICAgICAgICMgQWRkaW5nIGZpZWxkICdMYXllci51cF9kYXRlJworICAgICAgICBkYi5hZGRfY29sdW1uKHUnb3JtX2xheWVyJywgJ3VwX2RhdGUnLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnKShkZWZhdWx0PU5vbmUsIG51bGw9VHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisgICAgICAgICMgQWRkaW5nIGZpZWxkICdMYXllci52Y3NfdXJsJworICAgICAgICBkYi5hZGRfY29sdW1uKHUnb3JtX2xheWVyJywgJ3Zjc191cmwnLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJykoZGVmYXVsdD1Ob25lLCBtYXhfbGVuZ3RoPTIwMCwgbnVsbD1UcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICBrZWVwX2RlZmF1bHQ9RmFsc2UpCisKKyAgICAgICAgIyBBZGRpbmcgZmllbGQgJ0xheWVyLnZjc193ZWJfZmlsZV9iYXNlX3VybCcKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J29ybV9sYXllcicsICd2Y3Nfd2ViX2ZpbGVfYmFzZV91cmwnLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJykoZGVmYXVsdD1Ob25lLCBtYXhfbGVuZ3RoPTIwMCwgbnVsbD1UcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICBrZWVwX2RlZmF1bHQ9RmFsc2UpCisKKyAgICAgICAgIyBBZGRpbmcgZmllbGQgJ0xheWVyLnN1bW1hcnknCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fbGF5ZXInLCAnc3VtbWFyeScsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykoZGVmYXVsdD1Ob25lLCBtYXhfbGVuZ3RoPTIwMCwgbnVsbD1UcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICBrZWVwX2RlZmF1bHQ9RmFsc2UpCisKKyAgICAgICAgIyBBZGRpbmcgZmllbGQgJ0xheWVyLmRlc2NyaXB0aW9uJworICAgICAgICBkYi5hZGRfY29sdW1uKHUnb3JtX2xheWVyJywgJ2Rlc2NyaXB0aW9uJywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnKShkZWZhdWx0PU5vbmUsIG51bGw9VHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisKKyAgICAgICAgIyBDaGFuZ2luZyBmaWVsZCAnTGF5ZXIubG9jYWxfcGF0aCcKKyAgICAgICAgZGIuYWx0ZXJfY29sdW1uKHUnb3JtX2xheWVyJywgJ2xvY2FsX3BhdGgnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJykobWF4X2xlbmd0aD0yNTUsIG51bGw9VHJ1ZSkpCisgICAgICAgICMgQWRkaW5nIHVuaXF1ZSBjb25zdHJhaW50IG9uICdMYXllcicsIGZpZWxkcyBbJ2xheWVyX3NvdXJjZScsICd1cF9pZCddCisgICAgICAgIGRiLmNyZWF0ZV91bmlxdWUodSdvcm1fbGF5ZXInLCBbJ2xheWVyX3NvdXJjZV9pZCcsICd1cF9pZCddKQorCisgICAgICAgICMgQWRkaW5nIHVuaXF1ZSBjb25zdHJhaW50IG9uICdMYXllcicsIGZpZWxkcyBbJ2xheWVyX3NvdXJjZScsICduYW1lJ10KKyAgICAgICAgZGIuY3JlYXRlX3VuaXF1ZSh1J29ybV9sYXllcicsIFsnbGF5ZXJfc291cmNlX2lkJywgJ25hbWUnXSkKKworICAgICAgICAjIERlbGV0aW5nIGZpZWxkICdQcm9qZWN0LmJyYW5jaCcKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV9wcm9qZWN0JywgJ2JyYW5jaCcpCisKKyAgICAgICAgIyBBZGRpbmcgZmllbGQgJ1Byb2plY3QuYml0YmFrZV92ZXJzaW9uJworICAgICAgICBkYi5hZGRfY29sdW1uKHUnb3JtX3Byb2plY3QnLCAnYml0YmFrZV92ZXJzaW9uJywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKShkZWZhdWx0PS0xLCB0bz1vcm1bJ29ybS5CaXRiYWtlVmVyc2lvbiddKSwKKyAgICAgICAgICAgICAgICAgICAgICBrZWVwX2RlZmF1bHQ9RmFsc2UpCisKKyAgICAgICAgIyBBZGRpbmcgZmllbGQgJ1Byb2plY3QucmVsZWFzZScKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J29ybV9wcm9qZWN0JywgJ3JlbGVhc2UnLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKGRlZmF1bHQ9LTEsIHRvPW9ybVsnb3JtLlJlbGVhc2UnXSksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisKKyAgICBkZWYgYmFja3dhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgUmVtb3ZpbmcgdW5pcXVlIGNvbnN0cmFpbnQgb24gJ0xheWVyJywgZmllbGRzIFsnbGF5ZXJfc291cmNlJywgJ25hbWUnXQorICAgICAgICBkYi5kZWxldGVfdW5pcXVlKHUnb3JtX2xheWVyJywgWydsYXllcl9zb3VyY2VfaWQnLCAnbmFtZSddKQorCisgICAgICAgICMgUmVtb3ZpbmcgdW5pcXVlIGNvbnN0cmFpbnQgb24gJ0xheWVyJywgZmllbGRzIFsnbGF5ZXJfc291cmNlJywgJ3VwX2lkJ10KKyAgICAgICAgZGIuZGVsZXRlX3VuaXF1ZSh1J29ybV9sYXllcicsIFsnbGF5ZXJfc291cmNlX2lkJywgJ3VwX2lkJ10pCisKKyAgICAgICAgIyBSZW1vdmluZyB1bmlxdWUgY29uc3RyYWludCBvbiAnTGF5ZXJfVmVyc2lvbicsIGZpZWxkcyBbJ2xheWVyX3NvdXJjZScsICd1cF9pZCddCisgICAgICAgIGRiLmRlbGV0ZV91bmlxdWUodSdvcm1fbGF5ZXJfdmVyc2lvbicsIFsnbGF5ZXJfc291cmNlX2lkJywgJ3VwX2lkJ10pCisKKyAgICAgICAgIyBSZW1vdmluZyB1bmlxdWUgY29uc3RyYWludCBvbiAnTGF5ZXJTb3VyY2UnLCBmaWVsZHMgWydzb3VyY2V0eXBlJywgJ2FwaXVybCddCisgICAgICAgIGRiLmRlbGV0ZV91bmlxdWUodSdvcm1fbGF5ZXJzb3VyY2UnLCBbJ3NvdXJjZXR5cGUnLCAnYXBpdXJsJ10pCisKKyAgICAgICAgIyBSZW1vdmluZyB1bmlxdWUgY29uc3RyYWludCBvbiAnQnJhbmNoJywgZmllbGRzIFsnbGF5ZXJfc291cmNlJywgJ3VwX2lkJ10KKyAgICAgICAgZGIuZGVsZXRlX3VuaXF1ZSh1J29ybV9icmFuY2gnLCBbJ2xheWVyX3NvdXJjZV9pZCcsICd1cF9pZCddKQorCisgICAgICAgICMgUmVtb3ZpbmcgdW5pcXVlIGNvbnN0cmFpbnQgb24gJ0JyYW5jaCcsIGZpZWxkcyBbJ2xheWVyX3NvdXJjZScsICduYW1lJ10KKyAgICAgICAgZGIuZGVsZXRlX3VuaXF1ZSh1J29ybV9icmFuY2gnLCBbJ2xheWVyX3NvdXJjZV9pZCcsICduYW1lJ10pCisKKyAgICAgICAgIyBSZW1vdmluZyB1bmlxdWUgY29uc3RyYWludCBvbiAnTWFjaGluZScsIGZpZWxkcyBbJ2xheWVyX3NvdXJjZScsICd1cF9pZCddCisgICAgICAgIGRiLmRlbGV0ZV91bmlxdWUodSdvcm1fbWFjaGluZScsIFsnbGF5ZXJfc291cmNlX2lkJywgJ3VwX2lkJ10pCisKKyAgICAgICAgIyBSZW1vdmluZyB1bmlxdWUgY29uc3RyYWludCBvbiAnTGF5ZXJWZXJzaW9uRGVwZW5kZW5jeScsIGZpZWxkcyBbJ2xheWVyX3NvdXJjZScsICd1cF9pZCddCisgICAgICAgIGRiLmRlbGV0ZV91bmlxdWUodSdvcm1fbGF5ZXJ2ZXJzaW9uZGVwZW5kZW5jeScsIFsnbGF5ZXJfc291cmNlX2lkJywgJ3VwX2lkJ10pCisKKyAgICAgICAgIyBEZWxldGluZyBtb2RlbCAnUmVsZWFzZScKKyAgICAgICAgZGIuZGVsZXRlX3RhYmxlKHUnb3JtX3JlbGVhc2UnKQorCisgICAgICAgICMgRGVsZXRpbmcgbW9kZWwgJ0xheWVyVmVyc2lvbkRlcGVuZGVuY3knCisgICAgICAgIGRiLmRlbGV0ZV90YWJsZSh1J29ybV9sYXllcnZlcnNpb25kZXBlbmRlbmN5JykKKworICAgICAgICAjIERlbGV0aW5nIG1vZGVsICdUb2FzdGVyU2V0dGluZycKKyAgICAgICAgZGIuZGVsZXRlX3RhYmxlKHUnb3JtX3RvYXN0ZXJzZXR0aW5nJykKKworICAgICAgICAjIERlbGV0aW5nIG1vZGVsICdNYWNoaW5lJworICAgICAgICBkYi5kZWxldGVfdGFibGUodSdvcm1fbWFjaGluZScpCisKKyAgICAgICAgIyBEZWxldGluZyBtb2RlbCAnUmVsZWFzZURlZmF1bHRMYXllcicKKyAgICAgICAgZGIuZGVsZXRlX3RhYmxlKHUnb3JtX3JlbGVhc2VkZWZhdWx0bGF5ZXInKQorCisgICAgICAgICMgRGVsZXRpbmcgbW9kZWwgJ0JpdGJha2VWZXJzaW9uJworICAgICAgICBkYi5kZWxldGVfdGFibGUodSdvcm1fYml0YmFrZXZlcnNpb24nKQorCisgICAgICAgICMgRGVsZXRpbmcgbW9kZWwgJ0JyYW5jaCcKKyAgICAgICAgZGIuZGVsZXRlX3RhYmxlKHUnb3JtX2JyYW5jaCcpCisKKyAgICAgICAgIyBEZWxldGluZyBtb2RlbCAnVG9hc3RlclNldHRpbmdEZWZhdWx0TGF5ZXInCisgICAgICAgIGRiLmRlbGV0ZV90YWJsZSh1J29ybV90b2FzdGVyc2V0dGluZ2RlZmF1bHRsYXllcicpCisKKyAgICAgICAgIyBEZWxldGluZyBtb2RlbCAnTGF5ZXJTb3VyY2UnCisgICAgICAgIGRiLmRlbGV0ZV90YWJsZSh1J29ybV9sYXllcnNvdXJjZScpCisKKworICAgICAgICAjIFVzZXIgY2hvc2UgdG8gbm90IGRlYWwgd2l0aCBiYWNrd2FyZHMgTlVMTCBpc3N1ZXMgZm9yICdQcm9qZWN0TGF5ZXIubmFtZScKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJDYW5ub3QgcmV2ZXJzZSB0aGlzIG1pZ3JhdGlvbi4gJ1Byb2plY3RMYXllci5uYW1lJyBhbmQgaXRzIHZhbHVlcyBjYW5ub3QgYmUgcmVzdG9yZWQuIikKKyAgICAgICAgCisgICAgICAgICMgVGhlIGZvbGxvd2luZyBjb2RlIGlzIHByb3ZpZGVkIGhlcmUgdG8gYWlkIGluIHdyaXRpbmcgYSBjb3JyZWN0IG1pZ3JhdGlvbiAgICAgICAgIyBBZGRpbmcgZmllbGQgJ1Byb2plY3RMYXllci5uYW1lJworICAgICAgICBkYi5hZGRfY29sdW1uKHUnb3JtX3Byb2plY3RsYXllcicsICduYW1lJywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTEwMCksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisKKyAgICAgICAgIyBVc2VyIGNob3NlIHRvIG5vdCBkZWFsIHdpdGggYmFja3dhcmRzIE5VTEwgaXNzdWVzIGZvciAnUHJvamVjdExheWVyLmRpcnBhdGgnCisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiQ2Fubm90IHJldmVyc2UgdGhpcyBtaWdyYXRpb24uICdQcm9qZWN0TGF5ZXIuZGlycGF0aCcgYW5kIGl0cyB2YWx1ZXMgY2Fubm90IGJlIHJlc3RvcmVkLiIpCisgICAgICAgIAorICAgICAgICAjIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBwcm92aWRlZCBoZXJlIHRvIGFpZCBpbiB3cml0aW5nIGEgY29ycmVjdCBtaWdyYXRpb24gICAgICAgICMgQWRkaW5nIGZpZWxkICdQcm9qZWN0TGF5ZXIuZGlycGF0aCcKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J29ybV9wcm9qZWN0bGF5ZXInLCAnZGlycGF0aCcsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0yNTQpLAorICAgICAgICAgICAgICAgICAgICAgIGtlZXBfZGVmYXVsdD1GYWxzZSkKKworCisgICAgICAgICMgVXNlciBjaG9zZSB0byBub3QgZGVhbCB3aXRoIGJhY2t3YXJkcyBOVUxMIGlzc3VlcyBmb3IgJ1Byb2plY3RMYXllci5jb21taXQnCisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiQ2Fubm90IHJldmVyc2UgdGhpcyBtaWdyYXRpb24uICdQcm9qZWN0TGF5ZXIuY29tbWl0JyBhbmQgaXRzIHZhbHVlcyBjYW5ub3QgYmUgcmVzdG9yZWQuIikKKyAgICAgICAgCisgICAgICAgICMgVGhlIGZvbGxvd2luZyBjb2RlIGlzIHByb3ZpZGVkIGhlcmUgdG8gYWlkIGluIHdyaXRpbmcgYSBjb3JyZWN0IG1pZ3JhdGlvbiAgICAgICAgIyBBZGRpbmcgZmllbGQgJ1Byb2plY3RMYXllci5jb21taXQnCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fcHJvamVjdGxheWVyJywgJ2NvbW1pdCcsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0yNTQpLAorICAgICAgICAgICAgICAgICAgICAgIGtlZXBfZGVmYXVsdD1GYWxzZSkKKworCisgICAgICAgICMgVXNlciBjaG9zZSB0byBub3QgZGVhbCB3aXRoIGJhY2t3YXJkcyBOVUxMIGlzc3VlcyBmb3IgJ1Byb2plY3RMYXllci5naXR1cmwnCisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiQ2Fubm90IHJldmVyc2UgdGhpcyBtaWdyYXRpb24uICdQcm9qZWN0TGF5ZXIuZ2l0dXJsJyBhbmQgaXRzIHZhbHVlcyBjYW5ub3QgYmUgcmVzdG9yZWQuIikKKyAgICAgICAgCisgICAgICAgICMgVGhlIGZvbGxvd2luZyBjb2RlIGlzIHByb3ZpZGVkIGhlcmUgdG8gYWlkIGluIHdyaXRpbmcgYSBjb3JyZWN0IG1pZ3JhdGlvbiAgICAgICAgIyBBZGRpbmcgZmllbGQgJ1Byb2plY3RMYXllci5naXR1cmwnCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fcHJvamVjdGxheWVyJywgJ2dpdHVybCcsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0yNTQpLAorICAgICAgICAgICAgICAgICAgICAgIGtlZXBfZGVmYXVsdD1GYWxzZSkKKworICAgICAgICAjIERlbGV0aW5nIGZpZWxkICdQcm9qZWN0TGF5ZXIubGF5ZXJjb21taXQnCisgICAgICAgIGRiLmRlbGV0ZV9jb2x1bW4odSdvcm1fcHJvamVjdGxheWVyJywgJ2xheWVyY29tbWl0X2lkJykKKworICAgICAgICAjIERlbGV0aW5nIGZpZWxkICdMYXllcl9WZXJzaW9uLmxheWVyX3NvdXJjZScKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV9sYXllcl92ZXJzaW9uJywgJ2xheWVyX3NvdXJjZV9pZCcpCisKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnTGF5ZXJfVmVyc2lvbi51cF9pZCcKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV9sYXllcl92ZXJzaW9uJywgJ3VwX2lkJykKKworICAgICAgICAjIERlbGV0aW5nIGZpZWxkICdMYXllcl9WZXJzaW9uLnVwX2RhdGUnCisgICAgICAgIGRiLmRlbGV0ZV9jb2x1bW4odSdvcm1fbGF5ZXJfdmVyc2lvbicsICd1cF9kYXRlJykKKworICAgICAgICAjIERlbGV0aW5nIGZpZWxkICdMYXllcl9WZXJzaW9uLnVwX2JyYW5jaCcKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV9sYXllcl92ZXJzaW9uJywgJ3VwX2JyYW5jaF9pZCcpCisKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnTGF5ZXJfVmVyc2lvbi5kaXJwYXRoJworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnb3JtX2xheWVyX3ZlcnNpb24nLCAnZGlycGF0aCcpCisKKworICAgICAgICAjIFVzZXIgY2hvc2UgdG8gbm90IGRlYWwgd2l0aCBiYWNrd2FyZHMgTlVMTCBpc3N1ZXMgZm9yICdMYXllcl9WZXJzaW9uLmJ1aWxkJworICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIkNhbm5vdCByZXZlcnNlIHRoaXMgbWlncmF0aW9uLiAnTGF5ZXJfVmVyc2lvbi5idWlsZCcgYW5kIGl0cyB2YWx1ZXMgY2Fubm90IGJlIHJlc3RvcmVkLiIpCisgICAgICAgIAorICAgICAgICAjIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBwcm92aWRlZCBoZXJlIHRvIGFpZCBpbiB3cml0aW5nIGEgY29ycmVjdCBtaWdyYXRpb24KKyAgICAgICAgIyBDaGFuZ2luZyBmaWVsZCAnTGF5ZXJfVmVyc2lvbi5idWlsZCcKKyAgICAgICAgZGIuYWx0ZXJfY29sdW1uKHUnb3JtX2xheWVyX3ZlcnNpb24nLCAnYnVpbGRfaWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKSh0bz1vcm1bJ29ybS5CdWlsZCddKSkKKworICAgICAgICAjIENoYW5naW5nIGZpZWxkICdMYXllcl9WZXJzaW9uLmJyYW5jaCcKKyAgICAgICAgZGIuYWx0ZXJfY29sdW1uKHUnb3JtX2xheWVyX3ZlcnNpb24nLCAnYnJhbmNoJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD01MCkpCisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ1JlY2lwZS5sYXllcl9zb3VyY2UnCisgICAgICAgIGRiLmRlbGV0ZV9jb2x1bW4odSdvcm1fcmVjaXBlJywgJ2xheWVyX3NvdXJjZV9pZCcpCisKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnUmVjaXBlLnVwX2lkJworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnb3JtX3JlY2lwZScsICd1cF9pZCcpCisKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnUmVjaXBlLnVwX2RhdGUnCisgICAgICAgIGRiLmRlbGV0ZV9jb2x1bW4odSdvcm1fcmVjaXBlJywgJ3VwX2RhdGUnKQorCisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ0xheWVyLmxheWVyX3NvdXJjZScKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV9sYXllcicsICdsYXllcl9zb3VyY2VfaWQnKQorCisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ0xheWVyLnVwX2lkJworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnb3JtX2xheWVyJywgJ3VwX2lkJykKKworICAgICAgICAjIERlbGV0aW5nIGZpZWxkICdMYXllci51cF9kYXRlJworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnb3JtX2xheWVyJywgJ3VwX2RhdGUnKQorCisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ0xheWVyLnZjc191cmwnCisgICAgICAgIGRiLmRlbGV0ZV9jb2x1bW4odSdvcm1fbGF5ZXInLCAndmNzX3VybCcpCisKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnTGF5ZXIudmNzX3dlYl9maWxlX2Jhc2VfdXJsJworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnb3JtX2xheWVyJywgJ3Zjc193ZWJfZmlsZV9iYXNlX3VybCcpCisKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnTGF5ZXIuc3VtbWFyeScKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV9sYXllcicsICdzdW1tYXJ5JykKKworICAgICAgICAjIERlbGV0aW5nIGZpZWxkICdMYXllci5kZXNjcmlwdGlvbicKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV9sYXllcicsICdkZXNjcmlwdGlvbicpCisKKworICAgICAgICAjIFVzZXIgY2hvc2UgdG8gbm90IGRlYWwgd2l0aCBiYWNrd2FyZHMgTlVMTCBpc3N1ZXMgZm9yICdMYXllci5sb2NhbF9wYXRoJworICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIkNhbm5vdCByZXZlcnNlIHRoaXMgbWlncmF0aW9uLiAnTGF5ZXIubG9jYWxfcGF0aCcgYW5kIGl0cyB2YWx1ZXMgY2Fubm90IGJlIHJlc3RvcmVkLiIpCisgICAgICAgIAorICAgICAgICAjIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBwcm92aWRlZCBoZXJlIHRvIGFpZCBpbiB3cml0aW5nIGEgY29ycmVjdCBtaWdyYXRpb24KKyAgICAgICAgIyBDaGFuZ2luZyBmaWVsZCAnTGF5ZXIubG9jYWxfcGF0aCcKKyAgICAgICAgZGIuYWx0ZXJfY29sdW1uKHUnb3JtX2xheWVyJywgJ2xvY2FsX3BhdGgnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJykobWF4X2xlbmd0aD0yNTUpKQorCisgICAgICAgICMgVXNlciBjaG9zZSB0byBub3QgZGVhbCB3aXRoIGJhY2t3YXJkcyBOVUxMIGlzc3VlcyBmb3IgJ1Byb2plY3QuYnJhbmNoJworICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIkNhbm5vdCByZXZlcnNlIHRoaXMgbWlncmF0aW9uLiAnUHJvamVjdC5icmFuY2gnIGFuZCBpdHMgdmFsdWVzIGNhbm5vdCBiZSByZXN0b3JlZC4iKQorICAgICAgICAKKyAgICAgICAgIyBUaGUgZm9sbG93aW5nIGNvZGUgaXMgcHJvdmlkZWQgaGVyZSB0byBhaWQgaW4gd3JpdGluZyBhIGNvcnJlY3QgbWlncmF0aW9uICAgICAgICAjIEFkZGluZyBmaWVsZCAnUHJvamVjdC5icmFuY2gnCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fcHJvamVjdCcsICdicmFuY2gnLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9NTApLAorICAgICAgICAgICAgICAgICAgICAgIGtlZXBfZGVmYXVsdD1GYWxzZSkKKworICAgICAgICAjIERlbGV0aW5nIGZpZWxkICdQcm9qZWN0LmJpdGJha2VfdmVyc2lvbicKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV9wcm9qZWN0JywgJ2JpdGJha2VfdmVyc2lvbl9pZCcpCisKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnUHJvamVjdC5yZWxlYXNlJworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnb3JtX3Byb2plY3QnLCAncmVsZWFzZV9pZCcpCisKKworICAgIG1vZGVscyA9IHsKKyAgICAgICAgdSdvcm0uYml0YmFrZXZlcnNpb24nOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQml0YmFrZVZlcnNpb24nfSwKKyAgICAgICAgICAgICdicmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMzInfSksCisgICAgICAgICAgICAnZGlycGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAnZ2l0dXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeyd1bmlxdWUnOiAnVHJ1ZScsICdtYXhfbGVuZ3RoJzogJzMyJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmJyYW5jaCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ25hbWUnKSwgKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSkiLCAnb2JqZWN0X25hbWUnOiAnQnJhbmNoJ30sCisgICAgICAgICAgICAnYml0YmFrZV9icmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnc2hvcnRfZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9kYXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5idWlsZCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZCd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdidWlsZF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdjb21wbGV0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2Nvb2tlcl9sb2dfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnfSksCisgICAgICAgICAgICAnZGlzdHJvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm9fdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZXJyb3JzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21hY2hpbmUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMid9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzdGFydGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICd0aW1lc3BlbnQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd3YXJuaW5nc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmhlbHB0ZXh0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0hlbHBUZXh0J30sCisgICAgICAgICAgICAnYXJlYSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidoZWxwdGV4dF9idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2tleSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndGV4dCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJyksICgnbGF5ZXJfc291cmNlJywgJ25hbWUnKSkiLCAnb2JqZWN0X25hbWUnOiAnTGF5ZXInfSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfaW5kZXhfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsb2NhbF9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjU1JywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyMDAnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Zjc191cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjAwJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2Y3Nfd2ViX2ZpbGVfYmFzZV91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjAwJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcl92ZXJzaW9uJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSwpIiwgJ29iamVjdF9uYW1lJzogJ0xheWVyX1ZlcnNpb24nfSwKKyAgICAgICAgICAgICdicmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnODAnfSksCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdyZWxhdGVkX25hbWUnOiAiJ2xheWVyX3ZlcnNpb25fYnVpbGQnIiwgJ251bGwnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjb21taXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2RpcnBhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzI1NScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2xheWVyX3ZlcnNpb25fbGF5ZXInIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllciddIn0pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwcmlvcml0eSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3VwX2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5CcmFuY2gnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfZGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXJzb3VyY2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ3NvdXJjZXR5cGUnLCAnYXBpdXJsJyksKSIsICdvYmplY3RfbmFtZSc6ICdMYXllclNvdXJjZSd9LAorICAgICAgICAgICAgJ2FwaXVybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjU1JywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc2Myd9KSwKKyAgICAgICAgICAgICdzb3VyY2V0eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVydmVyc2lvbmRlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3NvdXJjZScsICd1cF9pZCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnTGF5ZXJWZXJzaW9uRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInZGVwZW5kZWVzJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidkZXBlbmRlbmNpZXMnIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubG9nbWVzc2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdMb2dNZXNzYWdlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsZXZlbCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xpbmVubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21lc3NhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjQwJ30pLAorICAgICAgICAgICAgJ3BhdGhuYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFzayddIiwgJ251bGwnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLm1hY2hpbmUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3NvdXJjZScsICd1cF9pZCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnTWFjaGluZSd9LAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAndXBfZGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpbnN0YWxsZWRfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICInJyIsICdtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdpbnN0YWxsZWRfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xpY2Vuc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnODAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAncmV2aXNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMzInLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzZWN0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3N1bW1hcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZV9EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwX3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidwYWNrYWdlX2RlcGVuZGVuY2llc190YXJnZXQnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhY2thZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncGFja2FnZV9kZXBlbmRlbmNpZXNfc291cmNlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIiwgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlX2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZV9GaWxlJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhY2thZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInYnVpbGRmaWxlbGlzdF9wYWNrYWdlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0J30sCisgICAgICAgICAgICAnYml0YmFrZV92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQml0YmFrZVZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICdjcmVhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3dfYWRkJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVsZWFzZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlJlbGVhc2UnXSJ9KSwKKyAgICAgICAgICAgICdzaG9ydF9kZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwZGF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vdyc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXNlcl9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3RsYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0TGF5ZXInfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJjb21taXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ29wdGlvbmFsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ1RydWUnfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0dGFyZ2V0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Byb2plY3RUYXJnZXQnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0dmFyaWFibGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdFZhcmlhYmxlJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSksCisgICAgICAgICAgICAndmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVjaXBlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlY2lwZSd9LAorICAgICAgICAgICAgJ2J1Z3RyYWNrZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdmaWxlX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICdob21lcGFnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyZWNpcGVfbGF5ZXJfdmVyc2lvbiciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVjaXBlX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVjaXBlX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX2RlcGVuZHMnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX3JlY2lwZSciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlbGVhc2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVsZWFzZSd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJpdGJha2VWZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzMyJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsndW5pcXVlJzogJ1RydWUnLCAnbWF4X2xlbmd0aCc6ICczMid9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWxlYXNlZGVmYXVsdGxheWVyJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlbGVhc2VEZWZhdWx0TGF5ZXInfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5MYXllciddIn0pLAorICAgICAgICAgICAgJ3JlbGVhc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5SZWxlYXNlJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldCd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW1hZ2Vfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2lzX2ltYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ2xpY2Vuc2VfbWFuaWZlc3RfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0ZpbGUnfSwKKyAgICAgICAgICAgICdkaXJlY3RvcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInZGlyZWN0b3J5X3NldCciLCAnbnVsbCc6ICdUcnVlJywgJ3RvJzogdSJvcm1bJ29ybS5UYXJnZXRfRmlsZSddIn0pLAorICAgICAgICAgICAgJ2dyb3VwJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyOCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW5vZGV0eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ293bmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyOCd9KSwKKyAgICAgICAgICAgICdwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncGVybWlzc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxNid9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ3N5bV90YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInc3ltbGlua19zZXQnIiwgJ251bGwnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uVGFyZ2V0X0ZpbGUnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXRfaW1hZ2VfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfSW1hZ2VfRmlsZSd9LAorICAgICAgICAgICAgJ2ZpbGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgJ2ZpbGVfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2luc3RhbGxlZF9wYWNrYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9JbnN0YWxsZWRfUGFja2FnZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkdGFyZ2V0bGlzdF9wYWNrYWdlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhc2snOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb3JkZXJpbmcnOiAiKCdvcmRlcicsICdyZWNpcGUnKSIsICd1bmlxdWVfdG9nZXRoZXInOiAiKCgnYnVpbGQnLCAncmVjaXBlJywgJ3Rhc2tfbmFtZScpLCkiLCAnb2JqZWN0X25hbWUnOiAnVGFzayd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NwdV91c2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGVjaW1hbEZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJywgJ21heF9kaWdpdHMnOiAnNicsICdkZWNpbWFsX3BsYWNlcyc6ICcyJ30pLAorICAgICAgICAgICAgJ2Rpc2tfaW8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdlbGFwc2VkX3RpbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRlY2ltYWxGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZScsICdtYXhfZGlnaXRzJzogJzYnLCAnZGVjaW1hbF9wbGFjZXMnOiAnMid9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGluZV9udW1iZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsb2dmaWxlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtZXNzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI0MCd9KSwKKyAgICAgICAgICAgICdvcmRlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnLTEnfSksCisgICAgICAgICAgICAncGF0aF90b19zc3RhdGVfb2JqJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInYnVpbGRfcmVjaXBlJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSksCisgICAgICAgICAgICAnc2NyaXB0X3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzb3VyY2VfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzc3RhdGVfY2hlY2tzdW0nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3N0YXRlX3Jlc3VsdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3Rhc2tfZXhlY3V0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAndGFza19uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd3b3JrX2RpcmVjdG9yeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFza19kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Rhc2tfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19kZXBlbmRlbmNpZXNfZGVwZW5kcyciLCAndG8nOiB1Im9ybVsnb3JtLlRhc2snXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2RlcGVuZGVuY2llc190YXNrJyIsICd0byc6IHUib3JtWydvcm0uVGFzayddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRvYXN0ZXJzZXR0aW5nJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RvYXN0ZXJTZXR0aW5nJ30sCisgICAgICAgICAgICAnaGVscHRleHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNjMnfSksCisgICAgICAgICAgICAndmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRvYXN0ZXJzZXR0aW5nZGVmYXVsdGxheWVyJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RvYXN0ZXJTZXR0aW5nRGVmYXVsdExheWVyJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udmFyaWFibGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVmFyaWFibGUnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid2YXJpYWJsZV9idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY2hhbmdlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdodW1hbl9yZWFkYWJsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndmFyaWFibGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndmFyaWFibGVfdmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udmFyaWFibGVoaXN0b3J5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1ZhcmlhYmxlSGlzdG9yeSd9LAorICAgICAgICAgICAgJ2ZpbGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsaW5lX251bWJlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ29wZXJhdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc2NCd9KSwKKyAgICAgICAgICAgICd2YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid2aGlzdG9yeSciLCAndG8nOiB1Im9ybVsnb3JtLlZhcmlhYmxlJ10ifSkKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbXBsZXRlX2FwcHMgPSBbJ29ybSddClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDE0X2F1dG9fX2NoZ19maWVsZF9wYWNrYWdlX3N1bW1hcnlfX2NoZ19maWVsZF9sYXllcl9zdW1tYXJ5X19jaGdfZmllbGRfcmUucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMTRfYXV0b19fY2hnX2ZpZWxkX3BhY2thZ2Vfc3VtbWFyeV9fY2hnX2ZpZWxkX2xheWVyX3N1bW1hcnlfX2NoZ19maWVsZF9yZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTQ1ZjE1Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDE0X2F1dG9fX2NoZ19maWVsZF9wYWNrYWdlX3N1bW1hcnlfX2NoZ19maWVsZF9sYXllcl9zdW1tYXJ5X19jaGdfZmllbGRfcmUucHkKQEAgLTAsMCArMSwzMzYgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCitmcm9tIHNvdXRoLnV0aWxzIGltcG9ydCBkYXRldGltZV91dGlscyBhcyBkYXRldGltZQorZnJvbSBzb3V0aC5kYiBpbXBvcnQgZGIKK2Zyb20gc291dGgudjIgaW1wb3J0IFNjaGVtYU1pZ3JhdGlvbgorZnJvbSBkamFuZ28uZGIgaW1wb3J0IG1vZGVscworCisKK2NsYXNzIE1pZ3JhdGlvbihTY2hlbWFNaWdyYXRpb24pOgorCisgICAgZGVmIGZvcndhcmRzKHNlbGYsIG9ybSk6CisKKyAgICAgICAgIyBDaGFuZ2luZyBmaWVsZCAnUGFja2FnZS5zdW1tYXJ5JworICAgICAgICBkYi5hbHRlcl9jb2x1bW4odSdvcm1fcGFja2FnZScsICdzdW1tYXJ5Jywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJykoKSkKKworICAgICAgICAjIENoYW5naW5nIGZpZWxkICdMYXllci5zdW1tYXJ5JworICAgICAgICBkYi5hbHRlcl9jb2x1bW4odSdvcm1fbGF5ZXInLCAnc3VtbWFyeScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcpKG51bGw9VHJ1ZSkpCisKKyAgICAgICAgIyBDaGFuZ2luZyBmaWVsZCAnUmVjaXBlLnN1bW1hcnknCisgICAgICAgIGRiLmFsdGVyX2NvbHVtbih1J29ybV9yZWNpcGUnLCAnc3VtbWFyeScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcpKCkpCisKKyAgICBkZWYgYmFja3dhcmRzKHNlbGYsIG9ybSk6CisKKyAgICAgICAgIyBDaGFuZ2luZyBmaWVsZCAnUGFja2FnZS5zdW1tYXJ5JworICAgICAgICBkYi5hbHRlcl9jb2x1bW4odSdvcm1fcGFja2FnZScsICdzdW1tYXJ5Jywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0yMDApKQorCisgICAgICAgICMgQ2hhbmdpbmcgZmllbGQgJ0xheWVyLnN1bW1hcnknCisgICAgICAgIGRiLmFsdGVyX2NvbHVtbih1J29ybV9sYXllcicsICdzdW1tYXJ5Jywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0yMDAsIG51bGw9VHJ1ZSkpCisKKyAgICAgICAgIyBDaGFuZ2luZyBmaWVsZCAnUmVjaXBlLnN1bW1hcnknCisgICAgICAgIGRiLmFsdGVyX2NvbHVtbih1J29ybV9yZWNpcGUnLCAnc3VtbWFyeScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MTAwKSkKKworICAgIG1vZGVscyA9IHsKKyAgICAgICAgdSdvcm0uYml0YmFrZXZlcnNpb24nOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQml0YmFrZVZlcnNpb24nfSwKKyAgICAgICAgICAgICdicmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMzInfSksCisgICAgICAgICAgICAnZGlycGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAnZ2l0dXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeyd1bmlxdWUnOiAnVHJ1ZScsICdtYXhfbGVuZ3RoJzogJzMyJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmJyYW5jaCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ25hbWUnKSwgKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSkiLCAnb2JqZWN0X25hbWUnOiAnQnJhbmNoJ30sCisgICAgICAgICAgICAnYml0YmFrZV9icmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnc2hvcnRfZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9kYXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5idWlsZCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZCd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdidWlsZF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdjb21wbGV0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2Nvb2tlcl9sb2dfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnfSksCisgICAgICAgICAgICAnZGlzdHJvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm9fdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZXJyb3JzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21hY2hpbmUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMid9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzdGFydGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICd0aW1lc3BlbnQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd3YXJuaW5nc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmhlbHB0ZXh0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0hlbHBUZXh0J30sCisgICAgICAgICAgICAnYXJlYSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidoZWxwdGV4dF9idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2tleSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndGV4dCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJyksICgnbGF5ZXJfc291cmNlJywgJ25hbWUnKSkiLCAnb2JqZWN0X25hbWUnOiAnTGF5ZXInfSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfaW5kZXhfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsb2NhbF9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjU1JywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Zjc191cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjAwJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2Y3Nfd2ViX2ZpbGVfYmFzZV91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjAwJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcl92ZXJzaW9uJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSwpIiwgJ29iamVjdF9uYW1lJzogJ0xheWVyX1ZlcnNpb24nfSwKKyAgICAgICAgICAgICdicmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnODAnfSksCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdyZWxhdGVkX25hbWUnOiAiJ2xheWVyX3ZlcnNpb25fYnVpbGQnIiwgJ251bGwnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjb21taXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2RpcnBhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzI1NScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2xheWVyX3ZlcnNpb25fbGF5ZXInIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllciddIn0pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwcmlvcml0eSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3VwX2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5CcmFuY2gnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfZGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXJzb3VyY2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ3NvdXJjZXR5cGUnLCAnYXBpdXJsJyksKSIsICdvYmplY3RfbmFtZSc6ICdMYXllclNvdXJjZSd9LAorICAgICAgICAgICAgJ2FwaXVybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjU1JywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc2Myd9KSwKKyAgICAgICAgICAgICdzb3VyY2V0eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVydmVyc2lvbmRlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3NvdXJjZScsICd1cF9pZCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnTGF5ZXJWZXJzaW9uRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInZGVwZW5kZWVzJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidkZXBlbmRlbmNpZXMnIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubG9nbWVzc2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdMb2dNZXNzYWdlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsZXZlbCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xpbmVubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21lc3NhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjQwJ30pLAorICAgICAgICAgICAgJ3BhdGhuYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFzayddIiwgJ251bGwnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLm1hY2hpbmUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3NvdXJjZScsICd1cF9pZCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnTWFjaGluZSd9LAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAndXBfZGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpbnN0YWxsZWRfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICInJyIsICdtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdpbnN0YWxsZWRfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xpY2Vuc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnODAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAncmV2aXNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMzInLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzZWN0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3N1bW1hcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZV9EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwX3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidwYWNrYWdlX2RlcGVuZGVuY2llc190YXJnZXQnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhY2thZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncGFja2FnZV9kZXBlbmRlbmNpZXNfc291cmNlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIiwgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlX2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZV9GaWxlJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhY2thZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInYnVpbGRmaWxlbGlzdF9wYWNrYWdlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0J30sCisgICAgICAgICAgICAnYml0YmFrZV92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQml0YmFrZVZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICdjcmVhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3dfYWRkJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVsZWFzZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlJlbGVhc2UnXSJ9KSwKKyAgICAgICAgICAgICdzaG9ydF9kZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwZGF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vdyc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXNlcl9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3RsYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0TGF5ZXInfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJjb21taXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ29wdGlvbmFsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ1RydWUnfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0dGFyZ2V0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Byb2plY3RUYXJnZXQnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0dmFyaWFibGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdFZhcmlhYmxlJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSksCisgICAgICAgICAgICAndmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVjaXBlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlY2lwZSd9LAorICAgICAgICAgICAgJ2J1Z3RyYWNrZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdmaWxlX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICdob21lcGFnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyZWNpcGVfbGF5ZXJfdmVyc2lvbiciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVjaXBlX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVjaXBlX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX2RlcGVuZHMnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX3JlY2lwZSciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlbGVhc2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVsZWFzZSd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJpdGJha2VWZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzMyJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsndW5pcXVlJzogJ1RydWUnLCAnbWF4X2xlbmd0aCc6ICczMid9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWxlYXNlZGVmYXVsdGxheWVyJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlbGVhc2VEZWZhdWx0TGF5ZXInfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5MYXllciddIn0pLAorICAgICAgICAgICAgJ3JlbGVhc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5SZWxlYXNlJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldCd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW1hZ2Vfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2lzX2ltYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ2xpY2Vuc2VfbWFuaWZlc3RfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0ZpbGUnfSwKKyAgICAgICAgICAgICdkaXJlY3RvcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInZGlyZWN0b3J5X3NldCciLCAnbnVsbCc6ICdUcnVlJywgJ3RvJzogdSJvcm1bJ29ybS5UYXJnZXRfRmlsZSddIn0pLAorICAgICAgICAgICAgJ2dyb3VwJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyOCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW5vZGV0eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ293bmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyOCd9KSwKKyAgICAgICAgICAgICdwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncGVybWlzc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxNid9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ3N5bV90YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInc3ltbGlua19zZXQnIiwgJ251bGwnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uVGFyZ2V0X0ZpbGUnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXRfaW1hZ2VfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfSW1hZ2VfRmlsZSd9LAorICAgICAgICAgICAgJ2ZpbGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgJ2ZpbGVfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2luc3RhbGxlZF9wYWNrYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9JbnN0YWxsZWRfUGFja2FnZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkdGFyZ2V0bGlzdF9wYWNrYWdlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhc2snOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb3JkZXJpbmcnOiAiKCdvcmRlcicsICdyZWNpcGUnKSIsICd1bmlxdWVfdG9nZXRoZXInOiAiKCgnYnVpbGQnLCAncmVjaXBlJywgJ3Rhc2tfbmFtZScpLCkiLCAnb2JqZWN0X25hbWUnOiAnVGFzayd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NwdV91c2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGVjaW1hbEZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJywgJ21heF9kaWdpdHMnOiAnNicsICdkZWNpbWFsX3BsYWNlcyc6ICcyJ30pLAorICAgICAgICAgICAgJ2Rpc2tfaW8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdlbGFwc2VkX3RpbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRlY2ltYWxGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZScsICdtYXhfZGlnaXRzJzogJzYnLCAnZGVjaW1hbF9wbGFjZXMnOiAnMid9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGluZV9udW1iZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsb2dmaWxlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtZXNzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI0MCd9KSwKKyAgICAgICAgICAgICdvcmRlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnLTEnfSksCisgICAgICAgICAgICAncGF0aF90b19zc3RhdGVfb2JqJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInYnVpbGRfcmVjaXBlJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSksCisgICAgICAgICAgICAnc2NyaXB0X3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzb3VyY2VfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzc3RhdGVfY2hlY2tzdW0nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3N0YXRlX3Jlc3VsdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3Rhc2tfZXhlY3V0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAndGFza19uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd3b3JrX2RpcmVjdG9yeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFza19kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Rhc2tfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19kZXBlbmRlbmNpZXNfZGVwZW5kcyciLCAndG8nOiB1Im9ybVsnb3JtLlRhc2snXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2RlcGVuZGVuY2llc190YXNrJyIsICd0byc6IHUib3JtWydvcm0uVGFzayddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRvYXN0ZXJzZXR0aW5nJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RvYXN0ZXJTZXR0aW5nJ30sCisgICAgICAgICAgICAnaGVscHRleHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNjMnfSksCisgICAgICAgICAgICAndmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRvYXN0ZXJzZXR0aW5nZGVmYXVsdGxheWVyJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RvYXN0ZXJTZXR0aW5nRGVmYXVsdExheWVyJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udmFyaWFibGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVmFyaWFibGUnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid2YXJpYWJsZV9idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY2hhbmdlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdodW1hbl9yZWFkYWJsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndmFyaWFibGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndmFyaWFibGVfdmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udmFyaWFibGVoaXN0b3J5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1ZhcmlhYmxlSGlzdG9yeSd9LAorICAgICAgICAgICAgJ2ZpbGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsaW5lX251bWJlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ29wZXJhdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc2NCd9KSwKKyAgICAgICAgICAgICd2YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid2aGlzdG9yeSciLCAndG8nOiB1Im9ybVsnb3JtLlZhcmlhYmxlJ10ifSkKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbXBsZXRlX2FwcHMgPSBbJ29ybSddClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDE1X2F1dG9fX2FkZF9maWVsZF9sYXllcl92Y3Nfd2ViX3VybF9fYWRkX2ZpZWxkX2xheWVyX3Zjc193ZWJfdHJlZV9iYXNlX3UucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMTVfYXV0b19fYWRkX2ZpZWxkX2xheWVyX3Zjc193ZWJfdXJsX19hZGRfZmllbGRfbGF5ZXJfdmNzX3dlYl90cmVlX2Jhc2VfdS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTY2NGM5Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDE1X2F1dG9fX2FkZF9maWVsZF9sYXllcl92Y3Nfd2ViX3VybF9fYWRkX2ZpZWxkX2xheWVyX3Zjc193ZWJfdHJlZV9iYXNlX3UucHkKQEAgLTAsMCArMSwzMzYgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCitmcm9tIHNvdXRoLnV0aWxzIGltcG9ydCBkYXRldGltZV91dGlscyBhcyBkYXRldGltZQorZnJvbSBzb3V0aC5kYiBpbXBvcnQgZGIKK2Zyb20gc291dGgudjIgaW1wb3J0IFNjaGVtYU1pZ3JhdGlvbgorZnJvbSBkamFuZ28uZGIgaW1wb3J0IG1vZGVscworCisKK2NsYXNzIE1pZ3JhdGlvbihTY2hlbWFNaWdyYXRpb24pOgorCisgICAgZGVmIGZvcndhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgQWRkaW5nIGZpZWxkICdMYXllci52Y3Nfd2ViX3VybCcKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J29ybV9sYXllcicsICd2Y3Nfd2ViX3VybCcsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnKShkZWZhdWx0PU5vbmUsIG1heF9sZW5ndGg9MjAwLCBudWxsPVRydWUpLAorICAgICAgICAgICAgICAgICAgICAgIGtlZXBfZGVmYXVsdD1GYWxzZSkKKworICAgICAgICAjIEFkZGluZyBmaWVsZCAnTGF5ZXIudmNzX3dlYl90cmVlX2Jhc2VfdXJsJworICAgICAgICBkYi5hZGRfY29sdW1uKHUnb3JtX2xheWVyJywgJ3Zjc193ZWJfdHJlZV9iYXNlX3VybCcsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnKShkZWZhdWx0PU5vbmUsIG1heF9sZW5ndGg9MjAwLCBudWxsPVRydWUpLAorICAgICAgICAgICAgICAgICAgICAgIGtlZXBfZGVmYXVsdD1GYWxzZSkKKworCisgICAgZGVmIGJhY2t3YXJkcyhzZWxmLCBvcm0pOgorICAgICAgICAjIERlbGV0aW5nIGZpZWxkICdMYXllci52Y3Nfd2ViX3VybCcKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV9sYXllcicsICd2Y3Nfd2ViX3VybCcpCisKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnTGF5ZXIudmNzX3dlYl90cmVlX2Jhc2VfdXJsJworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnb3JtX2xheWVyJywgJ3Zjc193ZWJfdHJlZV9iYXNlX3VybCcpCisKKworICAgIG1vZGVscyA9IHsKKyAgICAgICAgdSdvcm0uYml0YmFrZXZlcnNpb24nOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQml0YmFrZVZlcnNpb24nfSwKKyAgICAgICAgICAgICdicmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMzInfSksCisgICAgICAgICAgICAnZGlycGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAnZ2l0dXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeyd1bmlxdWUnOiAnVHJ1ZScsICdtYXhfbGVuZ3RoJzogJzMyJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmJyYW5jaCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ25hbWUnKSwgKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSkiLCAnb2JqZWN0X25hbWUnOiAnQnJhbmNoJ30sCisgICAgICAgICAgICAnYml0YmFrZV9icmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnc2hvcnRfZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9kYXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5idWlsZCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZCd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdidWlsZF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdjb21wbGV0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2Nvb2tlcl9sb2dfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnfSksCisgICAgICAgICAgICAnZGlzdHJvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm9fdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZXJyb3JzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21hY2hpbmUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMid9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzdGFydGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICd0aW1lc3BlbnQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd3YXJuaW5nc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmhlbHB0ZXh0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0hlbHBUZXh0J30sCisgICAgICAgICAgICAnYXJlYSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidoZWxwdGV4dF9idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2tleSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndGV4dCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJyksICgnbGF5ZXJfc291cmNlJywgJ25hbWUnKSkiLCAnb2JqZWN0X25hbWUnOiAnTGF5ZXInfSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfaW5kZXhfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsb2NhbF9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjU1JywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Zjc191cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjAwJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2Y3Nfd2ViX2ZpbGVfYmFzZV91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjAwJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2Y3Nfd2ViX3RyZWVfYmFzZV91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjAwJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2Y3Nfd2ViX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyMDAnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVyX3ZlcnNpb24nOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3NvdXJjZScsICd1cF9pZCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnTGF5ZXJfVmVyc2lvbid9LAorICAgICAgICAgICAgJ2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCd9KSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3JlbGF0ZWRfbmFtZSc6ICInbGF5ZXJfdmVyc2lvbl9idWlsZCciLCAnbnVsbCc6ICdUcnVlJywgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NvbW1pdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZGlycGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjU1JywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInbGF5ZXJfdmVyc2lvbl9sYXllciciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyJ10ifSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ByaW9yaXR5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAndXBfYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkJyYW5jaCddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9kYXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcnNvdXJjZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnc291cmNldHlwZScsICdhcGl1cmwnKSwpIiwgJ29iamVjdF9uYW1lJzogJ0xheWVyU291cmNlJ30sCisgICAgICAgICAgICAnYXBpdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyNTUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzYzJ30pLAorICAgICAgICAgICAgJ3NvdXJjZXR5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXJ2ZXJzaW9uZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJyksKSIsICdvYmplY3RfbmFtZSc6ICdMYXllclZlcnNpb25EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidkZXBlbmRlZXMnIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2RlcGVuZGVuY2llcyciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sb2dtZXNzYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0xvZ01lc3NhZ2UnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xldmVsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbGluZW5vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWVzc2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNDAnfSksCisgICAgICAgICAgICAncGF0aG5hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXNrJ10iLCAnbnVsbCc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubWFjaGluZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJyksKSIsICdvYmplY3RfbmFtZSc6ICdNYWNoaW5lJ30sCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICd1cF9kYXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2UnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2luc3RhbGxlZF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogIicnIiwgJ21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2luc3RhbGxlZF9zaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbGljZW5zZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlY2lwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZXZpc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICczMicsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NlY3Rpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnODAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnc3VtbWFyeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2VfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3BhY2thZ2VfZGVwZW5kZW5jaWVzX3RhcmdldCciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidwYWNrYWdlX2RlcGVuZGVuY2llc19zb3VyY2UnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10iLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2VfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlX0ZpbGUnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIididWlsZGZpbGVsaXN0X3BhY2thZ2UnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICAncGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Byb2plY3QnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CaXRiYWtlVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ2NyZWF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vd19hZGQnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdyZWxlYXNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVsZWFzZSddIn0pLAorICAgICAgICAgICAgJ3Nob3J0X2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBkYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93JzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1c2VyX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdGxheWVyJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Byb2plY3RMYXllcid9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcmNvbW1pdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnb3B0aW9uYWwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3R0YXJnZXQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdFRhcmdldCd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3R2YXJpYWJsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0VmFyaWFibGUnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSJ9KSwKKyAgICAgICAgICAgICd2YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWNpcGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVjaXBlJ30sCisgICAgICAgICAgICAnYnVndHJhY2tlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2ZpbGVfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ2hvbWVwYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JlY2lwZV9sYXllcl92ZXJzaW9uJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ2xpY2Vuc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzZWN0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3N1bW1hcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfZGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWNpcGVfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWNpcGVfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncl9kZXBlbmRlbmNpZXNfZGVwZW5kcyciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncl9kZXBlbmRlbmNpZXNfcmVjaXBlJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVsZWFzZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWxlYXNlJ30sCisgICAgICAgICAgICAnYml0YmFrZV92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQml0YmFrZVZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICdicmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMzInfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeyd1bmlxdWUnOiAnVHJ1ZScsICdtYXhfbGVuZ3RoJzogJzMyJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlbGVhc2VkZWZhdWx0bGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVsZWFzZURlZmF1bHRMYXllcid9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkxheWVyJ10ifSksCisgICAgICAgICAgICAncmVsZWFzZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlJlbGVhc2UnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0J30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpbWFnZV9zaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnaXNfaW1hZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAnbGljZW5zZV9tYW5pZmVzdF9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwMCcsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXRfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfRmlsZSd9LAorICAgICAgICAgICAgJ2RpcmVjdG9yeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidkaXJlY3Rvcnlfc2V0JyIsICdudWxsJzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLlRhcmdldF9GaWxlJ10ifSksCisgICAgICAgICAgICAnZ3JvdXAnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTI4J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpbm9kZXR5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnb3duZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTI4J30pLAorICAgICAgICAgICAgJ3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdwZXJtaXNzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzE2J30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnc3ltX3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidzeW1saW5rX3NldCciLCAnbnVsbCc6ICdUcnVlJywgJ3RvJzogdSJvcm1bJ29ybS5UYXJnZXRfRmlsZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9pbWFnZV9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9JbWFnZV9GaWxlJ30sCisgICAgICAgICAgICAnZmlsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICAnZmlsZV9zaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXRfaW5zdGFsbGVkX3BhY2thZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0luc3RhbGxlZF9QYWNrYWdlJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhY2thZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInYnVpbGR0YXJnZXRsaXN0X3BhY2thZ2UnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFzayc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvcmRlcmluZyc6ICIoJ29yZGVyJywgJ3JlY2lwZScpIiwgJ3VuaXF1ZV90b2dldGhlcic6ICIoKCdidWlsZCcsICdyZWNpcGUnLCAndGFza19uYW1lJyksKSIsICdvYmplY3RfbmFtZSc6ICdUYXNrJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY3B1X3VzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EZWNpbWFsRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnLCAnbWF4X2RpZ2l0cyc6ICc2JywgJ2RlY2ltYWxfcGxhY2VzJzogJzInfSksCisgICAgICAgICAgICAnZGlza19pbyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2VsYXBzZWRfdGltZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGVjaW1hbEZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJywgJ21heF9kaWdpdHMnOiAnNicsICdkZWNpbWFsX3BsYWNlcyc6ICcyJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsaW5lX251bWJlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xvZ2ZpbGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21lc3NhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjQwJ30pLAorICAgICAgICAgICAgJ29yZGVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnb3V0Y29tZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICctMSd9KSwKKyAgICAgICAgICAgICdwYXRoX3RvX3NzdGF0ZV9vYmonOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JlY2lwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIididWlsZF9yZWNpcGUnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KSwKKyAgICAgICAgICAgICdzY3JpcHRfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3NvdXJjZV91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NzdGF0ZV9jaGVja3N1bSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzc3RhdGVfcmVzdWx0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAndGFza19leGVjdXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICd0YXNrX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3dvcmtfZGlyZWN0b3J5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXNrX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFza19EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2RlcGVuZGVuY2llc19kZXBlbmRzJyIsICd0byc6IHUib3JtWydvcm0uVGFzayddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfZGVwZW5kZW5jaWVzX3Rhc2snIiwgJ3RvJzogdSJvcm1bJ29ybS5UYXNrJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udG9hc3RlcnNldHRpbmcnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVG9hc3RlclNldHRpbmcnfSwKKyAgICAgICAgICAgICdoZWxwdGV4dCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc2Myd9KSwKKyAgICAgICAgICAgICd2YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udG9hc3RlcnNldHRpbmdkZWZhdWx0bGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVG9hc3RlclNldHRpbmdEZWZhdWx0TGF5ZXInfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS52YXJpYWJsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdWYXJpYWJsZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3ZhcmlhYmxlX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjaGFuZ2VkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2h1bWFuX3JlYWRhYmxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZV92YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS52YXJpYWJsZWhpc3RvcnknOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVmFyaWFibGVIaXN0b3J5J30sCisgICAgICAgICAgICAnZmlsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xpbmVfbnVtYmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnb3BlcmF0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzY0J30pLAorICAgICAgICAgICAgJ3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3ZoaXN0b3J5JyIsICd0byc6IHUib3JtWydvcm0uVmFyaWFibGUnXSJ9KQorICAgICAgICB9CisgICAgfQorCisgICAgY29tcGxldGVfYXBwcyA9IFsnb3JtJ10KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMTZfYXV0b19fYWRkX2ZpZWxkX3JlbGVhc2VfaGVscHRleHRfX2NoZ19maWVsZF9yZWxlYXNlX2JyYW5jaF9fYWRkX2luZGV4Xy5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAxNl9hdXRvX19hZGRfZmllbGRfcmVsZWFzZV9oZWxwdGV4dF9fY2hnX2ZpZWxkX3JlbGVhc2VfYnJhbmNoX19hZGRfaW5kZXhfLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NWMwYmEKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMTZfYXV0b19fYWRkX2ZpZWxkX3JlbGVhc2VfaGVscHRleHRfX2NoZ19maWVsZF9yZWxlYXNlX2JyYW5jaF9fYWRkX2luZGV4Xy5weQpAQCAtMCwwICsxLDM1OSBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KK2Zyb20gc291dGgudXRpbHMgaW1wb3J0IGRhdGV0aW1lX3V0aWxzIGFzIGRhdGV0aW1lCitmcm9tIHNvdXRoLmRiIGltcG9ydCBkYgorZnJvbSBzb3V0aC52MiBpbXBvcnQgU2NoZW1hTWlncmF0aW9uCitmcm9tIGRqYW5nby5kYiBpbXBvcnQgbW9kZWxzCisKKworY2xhc3MgTWlncmF0aW9uKFNjaGVtYU1pZ3JhdGlvbik6CisKKyAgICBkZWYgZm9yd2FyZHMoc2VsZiwgb3JtKToKKyAgICAgICAgIyBBZGRpbmcgZmllbGQgJ1JlbGVhc2UuaGVscHRleHQnCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fcmVsZWFzZScsICdoZWxwdGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJykobnVsbD1UcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICBrZWVwX2RlZmF1bHQ9RmFsc2UpCisKKworICAgICAgICAjIFJlbmFtaW5nIGNvbHVtbiBmb3IgJ1JlbGVhc2UuYnJhbmNoJyB0byBtYXRjaCBuZXcgZmllbGQgdHlwZS4KKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV9yZWxlYXNlJywgJ2JyYW5jaCcpCisKKyAgICAgICAgIyBDaGFuZ2luZyBmaWVsZCAnUmVsZWFzZS5icmFuY2gnCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fcmVsZWFzZScsICdicmFuY2gnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKSh0bz1vcm1bJ29ybS5CcmFuY2gnXSwgZGVmYXVsdD0tMSkpCisKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnQnJhbmNoLmJpdGJha2VfYnJhbmNoJworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnb3JtX2JyYW5jaCcsICdiaXRiYWtlX2JyYW5jaCcpCisKKyAgICAgICAgIyBBZGRpbmcgdW5pcXVlIGNvbnN0cmFpbnQgb24gJ1JlY2lwZScsIGZpZWxkcyBbJ2xheWVyX3ZlcnNpb24nLCAnZmlsZV9wYXRoJ10KKyAgICAgICAgZGIuY3JlYXRlX3VuaXF1ZSh1J29ybV9yZWNpcGUnLCBbJ2xheWVyX3ZlcnNpb25faWQnLCAnZmlsZV9wYXRoJ10pCisKKyAgICAgICAgIyBBZGRpbmcgdW5pcXVlIGNvbnN0cmFpbnQgb24gJ1Byb2plY3RMYXllcicsIGZpZWxkcyBbJ3Byb2plY3QnLCAnbGF5ZXJjb21taXQnXQorICAgICAgICBkYi5jcmVhdGVfdW5pcXVlKHUnb3JtX3Byb2plY3RsYXllcicsIFsncHJvamVjdF9pZCcsICdsYXllcmNvbW1pdF9pZCddKQorCisKKyAgICBkZWYgYmFja3dhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgUmVtb3ZpbmcgdW5pcXVlIGNvbnN0cmFpbnQgb24gJ1Byb2plY3RMYXllcicsIGZpZWxkcyBbJ3Byb2plY3QnLCAnbGF5ZXJjb21taXQnXQorICAgICAgICBkYi5kZWxldGVfdW5pcXVlKHUnb3JtX3Byb2plY3RsYXllcicsIFsncHJvamVjdF9pZCcsICdsYXllcmNvbW1pdF9pZCddKQorCisgICAgICAgICMgUmVtb3ZpbmcgdW5pcXVlIGNvbnN0cmFpbnQgb24gJ1JlY2lwZScsIGZpZWxkcyBbJ2xheWVyX3ZlcnNpb24nLCAnZmlsZV9wYXRoJ10KKyAgICAgICAgZGIuZGVsZXRlX3VuaXF1ZSh1J29ybV9yZWNpcGUnLCBbJ2xheWVyX3ZlcnNpb25faWQnLCAnZmlsZV9wYXRoJ10pCisKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnUmVsZWFzZS5oZWxwdGV4dCcKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV9yZWxlYXNlJywgJ2hlbHB0ZXh0JykKKworICAgICAgICAjIFJlbmFtaW5nIGNvbHVtbiBmb3IgJ1JlbGVhc2UuYnJhbmNoJyB0byBtYXRjaCBuZXcgZmllbGQgdHlwZS4KKyAgICAgICAgZGIucmVuYW1lX2NvbHVtbih1J29ybV9yZWxlYXNlJywgJ2JyYW5jaF9pZCcsICdicmFuY2gnKQorICAgICAgICAjIENoYW5naW5nIGZpZWxkICdSZWxlYXNlLmJyYW5jaCcKKyAgICAgICAgZGIuYWx0ZXJfY29sdW1uKHUnb3JtX3JlbGVhc2UnLCAnYnJhbmNoJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0zMikpCisgICAgICAgICMgQWRkaW5nIGZpZWxkICdCcmFuY2guYml0YmFrZV9icmFuY2gnCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fYnJhbmNoJywgJ2JpdGJha2VfYnJhbmNoJywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShkZWZhdWx0PScnLCBtYXhfbGVuZ3RoPTUwLCBibGFuaz1UcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICBrZWVwX2RlZmF1bHQ9RmFsc2UpCisKKworICAgIG1vZGVscyA9IHsKKyAgICAgICAgdSdvcm0uYml0YmFrZXZlcnNpb24nOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQml0YmFrZVZlcnNpb24nfSwKKyAgICAgICAgICAgICdicmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMzInfSksCisgICAgICAgICAgICAnZGlycGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAnZ2l0dXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeyd1bmlxdWUnOiAnVHJ1ZScsICdtYXhfbGVuZ3RoJzogJzMyJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmJyYW5jaCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ25hbWUnKSwgKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSkiLCAnb2JqZWN0X25hbWUnOiAnQnJhbmNoJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdUcnVlJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ3Nob3J0X2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfZGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0uYnVpbGQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQnVpbGQnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnYnVpbGRfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnY29tcGxldGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdjb29rZXJfbG9nX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Rybyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZGlzdHJvX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Vycm9yc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtYWNoaW5lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzInfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3RhcnRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAndGltZXNwZW50JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnd2FybmluZ3Nfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5oZWxwdGV4dCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdIZWxwVGV4dCd9LAorICAgICAgICAgICAgJ2FyZWEnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInaGVscHRleHRfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdrZXknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3RleHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3NvdXJjZScsICd1cF9pZCcpLCAoJ2xheWVyX3NvdXJjZScsICduYW1lJykpIiwgJ29iamVjdF9uYW1lJzogJ0xheWVyJ30sCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX2luZGV4X3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbG9jYWxfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzI1NScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnc3VtbWFyeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9kYXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2Y3NfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzIwMCcsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmNzX3dlYl9maWxlX2Jhc2VfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzIwMCcsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmNzX3dlYl90cmVlX2Jhc2VfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzIwMCcsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmNzX3dlYl91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjAwJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcl92ZXJzaW9uJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSwpIiwgJ29iamVjdF9uYW1lJzogJ0xheWVyX1ZlcnNpb24nfSwKKyAgICAgICAgICAgICdicmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnODAnfSksCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdyZWxhdGVkX25hbWUnOiAiJ2xheWVyX3ZlcnNpb25fYnVpbGQnIiwgJ251bGwnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjb21taXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2RpcnBhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzI1NScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2xheWVyX3ZlcnNpb25fbGF5ZXInIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllciddIn0pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwcmlvcml0eSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3VwX2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5CcmFuY2gnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfZGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXJzb3VyY2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ3NvdXJjZXR5cGUnLCAnYXBpdXJsJyksKSIsICdvYmplY3RfbmFtZSc6ICdMYXllclNvdXJjZSd9LAorICAgICAgICAgICAgJ2FwaXVybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjU1JywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc2Myd9KSwKKyAgICAgICAgICAgICdzb3VyY2V0eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVydmVyc2lvbmRlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3NvdXJjZScsICd1cF9pZCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnTGF5ZXJWZXJzaW9uRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInZGVwZW5kZWVzJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidkZXBlbmRlbmNpZXMnIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubG9nbWVzc2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdMb2dNZXNzYWdlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsZXZlbCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xpbmVubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21lc3NhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjQwJ30pLAorICAgICAgICAgICAgJ3BhdGhuYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFzayddIiwgJ251bGwnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLm1hY2hpbmUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3NvdXJjZScsICd1cF9pZCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnTWFjaGluZSd9LAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAndXBfZGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpbnN0YWxsZWRfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICInJyIsICdtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdpbnN0YWxsZWRfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xpY2Vuc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnODAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAncmV2aXNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMzInLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzZWN0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3N1bW1hcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZV9EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwX3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidwYWNrYWdlX2RlcGVuZGVuY2llc190YXJnZXQnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhY2thZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncGFja2FnZV9kZXBlbmRlbmNpZXNfc291cmNlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIiwgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlX2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZV9GaWxlJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhY2thZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInYnVpbGRmaWxlbGlzdF9wYWNrYWdlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0J30sCisgICAgICAgICAgICAnYml0YmFrZV92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQml0YmFrZVZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICdjcmVhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3dfYWRkJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVsZWFzZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlJlbGVhc2UnXSJ9KSwKKyAgICAgICAgICAgICdzaG9ydF9kZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwZGF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vdyc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXNlcl9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3RsYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgncHJvamVjdCcsICdsYXllcmNvbW1pdCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnUHJvamVjdExheWVyJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvcHRpb25hbCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdHRhcmdldCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0VGFyZ2V0J30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdHZhcmlhYmxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Byb2plY3RWYXJpYWJsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pLAorICAgICAgICAgICAgJ3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlY2lwZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfdmVyc2lvbicsICdmaWxlX3BhdGgnKSwpIiwgJ29iamVjdF9uYW1lJzogJ1JlY2lwZSd9LAorICAgICAgICAgICAgJ2J1Z3RyYWNrZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdmaWxlX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICdob21lcGFnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyZWNpcGVfbGF5ZXJfdmVyc2lvbiciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVjaXBlX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVjaXBlX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX2RlcGVuZHMnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX3JlY2lwZSciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlbGVhc2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVsZWFzZSd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJpdGJha2VWZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnJhbmNoJ10ifSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ2hlbHB0ZXh0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J3VuaXF1ZSc6ICdUcnVlJywgJ21heF9sZW5ndGgnOiAnMzInfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVsZWFzZWRlZmF1bHRsYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWxlYXNlRGVmYXVsdExheWVyJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uTGF5ZXInXSJ9KSwKKyAgICAgICAgICAgICdyZWxlYXNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVsZWFzZSddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXQnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2ltYWdlX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdpc19pbWFnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICdsaWNlbnNlX21hbmlmZXN0X3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9GaWxlJ30sCisgICAgICAgICAgICAnZGlyZWN0b3J5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2RpcmVjdG9yeV9zZXQnIiwgJ251bGwnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uVGFyZ2V0X0ZpbGUnXSJ9KSwKKyAgICAgICAgICAgICdncm91cCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMjgnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2lub2RldHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdvd25lcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMjgnfSksCisgICAgICAgICAgICAncGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Blcm1pc3Npb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTYnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdzeW1fdGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3N5bWxpbmtfc2V0JyIsICdudWxsJzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLlRhcmdldF9GaWxlJ10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2ltYWdlX2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0ltYWdlX0ZpbGUnfSwKKyAgICAgICAgICAgICdmaWxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgICdmaWxlX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9pbnN0YWxsZWRfcGFja2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfSW5zdGFsbGVkX1BhY2thZ2UnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIididWlsZHRhcmdldGxpc3RfcGFja2FnZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXNrJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29yZGVyaW5nJzogIignb3JkZXInLCAncmVjaXBlJykiLCAndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2J1aWxkJywgJ3JlY2lwZScsICd0YXNrX25hbWUnKSwpIiwgJ29iamVjdF9uYW1lJzogJ1Rhc2snfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjcHVfdXNhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRlY2ltYWxGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZScsICdtYXhfZGlnaXRzJzogJzYnLCAnZGVjaW1hbF9wbGFjZXMnOiAnMid9KSwKKyAgICAgICAgICAgICdkaXNrX2lvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZWxhcHNlZF90aW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EZWNpbWFsRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnLCAnbWF4X2RpZ2l0cyc6ICc2JywgJ2RlY2ltYWxfcGxhY2VzJzogJzInfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xpbmVfbnVtYmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbG9nZmlsZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWVzc2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNDAnfSksCisgICAgICAgICAgICAnb3JkZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJy0xJ30pLAorICAgICAgICAgICAgJ3BhdGhfdG9fc3N0YXRlX29iaic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkX3JlY2lwZSciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pLAorICAgICAgICAgICAgJ3NjcmlwdF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnc291cmNlX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3N0YXRlX2NoZWNrc3VtJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NzdGF0ZV9yZXN1bHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd0YXNrX2V4ZWN1dGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ3Rhc2tfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnd29ya19kaXJlY3RvcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhc2tfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXNrX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfZGVwZW5kZW5jaWVzX2RlcGVuZHMnIiwgJ3RvJzogdSJvcm1bJ29ybS5UYXNrJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19kZXBlbmRlbmNpZXNfdGFzayciLCAndG8nOiB1Im9ybVsnb3JtLlRhc2snXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50b2FzdGVyc2V0dGluZyc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUb2FzdGVyU2V0dGluZyd9LAorICAgICAgICAgICAgJ2hlbHB0ZXh0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzYzJ30pLAorICAgICAgICAgICAgJ3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50b2FzdGVyc2V0dGluZ2RlZmF1bHRsYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUb2FzdGVyU2V0dGluZ0RlZmF1bHRMYXllcid9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnZhcmlhYmxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1ZhcmlhYmxlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndmFyaWFibGVfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NoYW5nZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnaHVtYW5fcmVhZGFibGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlX3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnZhcmlhYmxlaGlzdG9yeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdWYXJpYWJsZUhpc3RvcnknfSwKKyAgICAgICAgICAgICdmaWxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGluZV9udW1iZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvcGVyYXRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNjQnfSksCisgICAgICAgICAgICAndmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmFyaWFibGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndmhpc3RvcnknIiwgJ3RvJzogdSJvcm1bJ29ybS5WYXJpYWJsZSddIn0pCisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb21wbGV0ZV9hcHBzID0gWydvcm0nXQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDE3X2F1dG9fX2RlbF90b2FzdGVyc2V0dGluZ2RlZmF1bHRsYXllcl9fYWRkX3JlbGVhc2VsYXllcnNvdXJjZXByaW9yaXR5X18ucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMTdfYXV0b19fZGVsX3RvYXN0ZXJzZXR0aW5nZGVmYXVsdGxheWVyX19hZGRfcmVsZWFzZWxheWVyc291cmNlcHJpb3JpdHlfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Njg1YjU1Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDE3X2F1dG9fX2RlbF90b2FzdGVyc2V0dGluZ2RlZmF1bHRsYXllcl9fYWRkX3JlbGVhc2VsYXllcnNvdXJjZXByaW9yaXR5X18ucHkKQEAgLTAsMCArMSwzOTYgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCitmcm9tIHNvdXRoLnV0aWxzIGltcG9ydCBkYXRldGltZV91dGlscyBhcyBkYXRldGltZQorZnJvbSBzb3V0aC5kYiBpbXBvcnQgZGIKK2Zyb20gc291dGgudjIgaW1wb3J0IFNjaGVtYU1pZ3JhdGlvbgorZnJvbSBkamFuZ28uZGIgaW1wb3J0IG1vZGVscworCisKK2NsYXNzIE1pZ3JhdGlvbihTY2hlbWFNaWdyYXRpb24pOgorCisgICAgZGVmIGZvcndhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgRGVsZXRpbmcgbW9kZWwgJ1RvYXN0ZXJTZXR0aW5nRGVmYXVsdExheWVyJworICAgICAgICBkYi5kZWxldGVfdGFibGUodSdvcm1fdG9hc3RlcnNldHRpbmdkZWZhdWx0bGF5ZXInKQorCisgICAgICAgICMgQWRkaW5nIG1vZGVsICdSZWxlYXNlTGF5ZXJTb3VyY2VQcmlvcml0eScKKyAgICAgICAgZGIuY3JlYXRlX3RhYmxlKHUnb3JtX3JlbGVhc2VsYXllcnNvdXJjZXByaW9yaXR5JywgKAorICAgICAgICAgICAgKHUnaWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnKShwcmltYXJ5X2tleT1UcnVlKSksCisgICAgICAgICAgICAoJ3JlbGVhc2UnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKSh0bz1vcm1bJ29ybS5SZWxlYXNlJ10pKSwKKyAgICAgICAgICAgICgnbGF5ZXJfc291cmNlJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykodG89b3JtWydvcm0uTGF5ZXJTb3VyY2UnXSkpLAorICAgICAgICAgICAgKCdwcmlvcml0eScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcpKGRlZmF1bHQ9MCkpLAorICAgICAgICApKQorICAgICAgICBkYi5zZW5kX2NyZWF0ZV9zaWduYWwodSdvcm0nLCBbJ1JlbGVhc2VMYXllclNvdXJjZVByaW9yaXR5J10pCisKKyAgICAgICAgIyBBZGRpbmcgdW5pcXVlIGNvbnN0cmFpbnQgb24gJ1JlbGVhc2VMYXllclNvdXJjZVByaW9yaXR5JywgZmllbGRzIFsncmVsZWFzZScsICdsYXllcl9zb3VyY2UnXQorICAgICAgICBkYi5jcmVhdGVfdW5pcXVlKHUnb3JtX3JlbGVhc2VsYXllcnNvdXJjZXByaW9yaXR5JywgWydyZWxlYXNlX2lkJywgJ2xheWVyX3NvdXJjZV9pZCddKQorCisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ1JlbGVhc2UuYnJhbmNoJworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnb3JtX3JlbGVhc2UnLCAnYnJhbmNoX2lkJykKKworICAgICAgICAjIEFkZGluZyBmaWVsZCAnUmVsZWFzZS5icmFuY2hfbmFtZScKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J29ybV9yZWxlYXNlJywgJ2JyYW5jaF9uYW1lJywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShkZWZhdWx0PScnLCBtYXhfbGVuZ3RoPTUwKSwKKyAgICAgICAgICAgICAgICAgICAgICBrZWVwX2RlZmF1bHQ9RmFsc2UpCisKKyAgICAgICAgIyBBZGRpbmcgdW5pcXVlIGNvbnN0cmFpbnQgb24gJ0xheWVyU291cmNlJywgZmllbGRzIFsnbmFtZSddCisgICAgICAgIGRiLmNyZWF0ZV91bmlxdWUodSdvcm1fbGF5ZXJzb3VyY2UnLCBbJ25hbWUnXSkKKworICAgICAgICAjIERlbGV0aW5nIGZpZWxkICdSZWxlYXNlRGVmYXVsdExheWVyLmxheWVyJworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnb3JtX3JlbGVhc2VkZWZhdWx0bGF5ZXInLCAnbGF5ZXJfaWQnKQorCisgICAgICAgICMgQWRkaW5nIGZpZWxkICdSZWxlYXNlRGVmYXVsdExheWVyLmxheWVyX25hbWUnCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fcmVsZWFzZWRlZmF1bHRsYXllcicsICdsYXllcl9uYW1lJywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShkZWZhdWx0PScnLCBtYXhfbGVuZ3RoPTEwMCksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisKKyAgICBkZWYgYmFja3dhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgUmVtb3ZpbmcgdW5pcXVlIGNvbnN0cmFpbnQgb24gJ0xheWVyU291cmNlJywgZmllbGRzIFsnbmFtZSddCisgICAgICAgIGRiLmRlbGV0ZV91bmlxdWUodSdvcm1fbGF5ZXJzb3VyY2UnLCBbJ25hbWUnXSkKKworICAgICAgICAjIFJlbW92aW5nIHVuaXF1ZSBjb25zdHJhaW50IG9uICdSZWxlYXNlTGF5ZXJTb3VyY2VQcmlvcml0eScsIGZpZWxkcyBbJ3JlbGVhc2UnLCAnbGF5ZXJfc291cmNlJ10KKyAgICAgICAgZGIuZGVsZXRlX3VuaXF1ZSh1J29ybV9yZWxlYXNlbGF5ZXJzb3VyY2Vwcmlvcml0eScsIFsncmVsZWFzZV9pZCcsICdsYXllcl9zb3VyY2VfaWQnXSkKKworICAgICAgICAjIEFkZGluZyBtb2RlbCAnVG9hc3RlclNldHRpbmdEZWZhdWx0TGF5ZXInCisgICAgICAgIGRiLmNyZWF0ZV90YWJsZSh1J29ybV90b2FzdGVyc2V0dGluZ2RlZmF1bHRsYXllcicsICgKKyAgICAgICAgICAgICh1J2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJykocHJpbWFyeV9rZXk9VHJ1ZSkpLAorICAgICAgICAgICAgKCdsYXllcl92ZXJzaW9uJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykodG89b3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddKSksCisgICAgICAgICkpCisgICAgICAgIGRiLnNlbmRfY3JlYXRlX3NpZ25hbCh1J29ybScsIFsnVG9hc3RlclNldHRpbmdEZWZhdWx0TGF5ZXInXSkKKworICAgICAgICAjIERlbGV0aW5nIG1vZGVsICdSZWxlYXNlTGF5ZXJTb3VyY2VQcmlvcml0eScKKyAgICAgICAgZGIuZGVsZXRlX3RhYmxlKHUnb3JtX3JlbGVhc2VsYXllcnNvdXJjZXByaW9yaXR5JykKKworCisgICAgICAgICMgVXNlciBjaG9zZSB0byBub3QgZGVhbCB3aXRoIGJhY2t3YXJkcyBOVUxMIGlzc3VlcyBmb3IgJ1JlbGVhc2UuYnJhbmNoJworICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIkNhbm5vdCByZXZlcnNlIHRoaXMgbWlncmF0aW9uLiAnUmVsZWFzZS5icmFuY2gnIGFuZCBpdHMgdmFsdWVzIGNhbm5vdCBiZSByZXN0b3JlZC4iKQorICAgICAgICAKKyAgICAgICAgIyBUaGUgZm9sbG93aW5nIGNvZGUgaXMgcHJvdmlkZWQgaGVyZSB0byBhaWQgaW4gd3JpdGluZyBhIGNvcnJlY3QgbWlncmF0aW9uICAgICAgICAjIEFkZGluZyBmaWVsZCAnUmVsZWFzZS5icmFuY2gnCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fcmVsZWFzZScsICdicmFuY2gnLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHRvPW9ybVsnb3JtLkJyYW5jaCddKSwKKyAgICAgICAgICAgICAgICAgICAgICBrZWVwX2RlZmF1bHQ9RmFsc2UpCisKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnUmVsZWFzZS5icmFuY2hfbmFtZScKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV9yZWxlYXNlJywgJ2JyYW5jaF9uYW1lJykKKworCisgICAgICAgICMgVXNlciBjaG9zZSB0byBub3QgZGVhbCB3aXRoIGJhY2t3YXJkcyBOVUxMIGlzc3VlcyBmb3IgJ1JlbGVhc2VEZWZhdWx0TGF5ZXIubGF5ZXInCisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiQ2Fubm90IHJldmVyc2UgdGhpcyBtaWdyYXRpb24uICdSZWxlYXNlRGVmYXVsdExheWVyLmxheWVyJyBhbmQgaXRzIHZhbHVlcyBjYW5ub3QgYmUgcmVzdG9yZWQuIikKKyAgICAgICAgCisgICAgICAgICMgVGhlIGZvbGxvd2luZyBjb2RlIGlzIHByb3ZpZGVkIGhlcmUgdG8gYWlkIGluIHdyaXRpbmcgYSBjb3JyZWN0IG1pZ3JhdGlvbiAgICAgICAgIyBBZGRpbmcgZmllbGQgJ1JlbGVhc2VEZWZhdWx0TGF5ZXIubGF5ZXInCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fcmVsZWFzZWRlZmF1bHRsYXllcicsICdsYXllcicsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykodG89b3JtWydvcm0uTGF5ZXInXSksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ1JlbGVhc2VEZWZhdWx0TGF5ZXIubGF5ZXJfbmFtZScKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV9yZWxlYXNlZGVmYXVsdGxheWVyJywgJ2xheWVyX25hbWUnKQorCisKKyAgICBtb2RlbHMgPSB7CisgICAgICAgIHUnb3JtLmJpdGJha2V2ZXJzaW9uJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0JpdGJha2VWZXJzaW9uJ30sCisgICAgICAgICAgICAnYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzMyJ30pLAorICAgICAgICAgICAgJ2RpcnBhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ2dpdHVybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsndW5pcXVlJzogJ1RydWUnLCAnbWF4X2xlbmd0aCc6ICczMid9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5icmFuY2gnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3NvdXJjZScsICduYW1lJyksICgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJykpIiwgJ29iamVjdF9uYW1lJzogJ0JyYW5jaCd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdzaG9ydF9kZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmJ1aWxkJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0J1aWxkJ30sCisgICAgICAgICAgICAnYml0YmFrZV92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ2J1aWxkX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2NvbXBsZXRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnY29va2VyX2xvZ19wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Ryb192ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdlcnJvcnNfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWFjaGluZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnb3V0Y29tZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcyJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3N0YXJ0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ3RpbWVzcGVudCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3dhcm5pbmdzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0uaGVscHRleHQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnSGVscFRleHQnfSwKKyAgICAgICAgICAgICdhcmVhJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2hlbHB0ZXh0X2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAna2V5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd0ZXh0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVyJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSwgKCdsYXllcl9zb3VyY2UnLCAnbmFtZScpKSIsICdvYmplY3RfbmFtZSc6ICdMYXllcid9LAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9pbmRleF91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xvY2FsX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyNTUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3N1bW1hcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfZGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmNzX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyMDAnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Zjc193ZWJfZmlsZV9iYXNlX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyMDAnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Zjc193ZWJfdHJlZV9iYXNlX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyMDAnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Zjc193ZWJfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzIwMCcsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXJfdmVyc2lvbic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJyksKSIsICdvYmplY3RfbmFtZSc6ICdMYXllcl9WZXJzaW9uJ30sCisgICAgICAgICAgICAnYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJ30pLAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAncmVsYXRlZF9uYW1lJzogIidsYXllcl92ZXJzaW9uX2J1aWxkJyIsICdudWxsJzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdkaXJwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyNTUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidsYXllcl92ZXJzaW9uX2xheWVyJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXInXSJ9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAncHJpb3JpdHknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd1cF9icmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uQnJhbmNoJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVyc291cmNlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdzb3VyY2V0eXBlJywgJ2FwaXVybCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnTGF5ZXJTb3VyY2UnfSwKKyAgICAgICAgICAgICdhcGl1cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzI1NScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J3VuaXF1ZSc6ICdUcnVlJywgJ21heF9sZW5ndGgnOiAnNjMnfSksCisgICAgICAgICAgICAnc291cmNldHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcnZlcnNpb25kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSwpIiwgJ29iamVjdF9uYW1lJzogJ0xheWVyVmVyc2lvbkRlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2RlcGVuZGVlcyciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInZGVwZW5kZW5jaWVzJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxvZ21lc3NhZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnTG9nTWVzc2FnZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGV2ZWwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsaW5lbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtZXNzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI0MCd9KSwKKyAgICAgICAgICAgICdwYXRobmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhc2snXSIsICdudWxsJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5tYWNoaW5lJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSwpIiwgJ29iamVjdF9uYW1lJzogJ01hY2hpbmUnfSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW5zdGFsbGVkX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAiJyciLCAnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnaW5zdGFsbGVkX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JldmlzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzMyJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncGFja2FnZV9kZXBlbmRlbmNpZXNfdGFyZ2V0JyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3BhY2thZ2VfZGVwZW5kZW5jaWVzX3NvdXJjZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSIsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRmlsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkZmlsZWxpc3RfcGFja2FnZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICdwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3QnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdCd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJpdGJha2VWZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnY3JlYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93X2FkZCc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlbGVhc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5SZWxlYXNlJ10ifSksCisgICAgICAgICAgICAnc2hvcnRfZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cGRhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3cnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VzZXJfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0bGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ3Byb2plY3QnLCAnbGF5ZXJjb21taXQnKSwpIiwgJ29iamVjdF9uYW1lJzogJ1Byb2plY3RMYXllcid9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcmNvbW1pdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnb3B0aW9uYWwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3R0YXJnZXQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdFRhcmdldCd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3R2YXJpYWJsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0VmFyaWFibGUnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSJ9KSwKKyAgICAgICAgICAgICd2YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWNpcGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3ZlcnNpb24nLCAnZmlsZV9wYXRoJyksKSIsICdvYmplY3RfbmFtZSc6ICdSZWNpcGUnfSwKKyAgICAgICAgICAgICdidWd0cmFja2VyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZmlsZV9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAnaG9tZXBhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncmVjaXBlX2xheWVyX3ZlcnNpb24nIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnbGljZW5zZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NlY3Rpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3VtbWFyeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9kYXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlY2lwZV9kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlY2lwZV9EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwX3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyX2RlcGVuZGVuY2llc19kZXBlbmRzJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JlY2lwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyX2RlcGVuZGVuY2llc19yZWNpcGUnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWxlYXNlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlbGVhc2UnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CaXRiYWtlVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ2JyYW5jaF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogIicnIiwgJ21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ2hlbHB0ZXh0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J3VuaXF1ZSc6ICdUcnVlJywgJ21heF9sZW5ndGgnOiAnMzInfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVsZWFzZWRlZmF1bHRsYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWxlYXNlRGVmYXVsdExheWVyJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAiJyciLCAnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVsZWFzZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlJlbGVhc2UnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWxlYXNlbGF5ZXJzb3VyY2Vwcmlvcml0eSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgncmVsZWFzZScsICdsYXllcl9zb3VyY2UnKSwpIiwgJ29iamVjdF9uYW1lJzogJ1JlbGVhc2VMYXllclNvdXJjZVByaW9yaXR5J30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10ifSksCisgICAgICAgICAgICAncHJpb3JpdHknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdyZWxlYXNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVsZWFzZSddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXQnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2ltYWdlX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdpc19pbWFnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICdsaWNlbnNlX21hbmlmZXN0X3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9GaWxlJ30sCisgICAgICAgICAgICAnZGlyZWN0b3J5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2RpcmVjdG9yeV9zZXQnIiwgJ251bGwnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uVGFyZ2V0X0ZpbGUnXSJ9KSwKKyAgICAgICAgICAgICdncm91cCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMjgnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2lub2RldHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdvd25lcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMjgnfSksCisgICAgICAgICAgICAncGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Blcm1pc3Npb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTYnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdzeW1fdGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3N5bWxpbmtfc2V0JyIsICdudWxsJzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLlRhcmdldF9GaWxlJ10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2ltYWdlX2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0ltYWdlX0ZpbGUnfSwKKyAgICAgICAgICAgICdmaWxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgICdmaWxlX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9pbnN0YWxsZWRfcGFja2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfSW5zdGFsbGVkX1BhY2thZ2UnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIididWlsZHRhcmdldGxpc3RfcGFja2FnZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXNrJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29yZGVyaW5nJzogIignb3JkZXInLCAncmVjaXBlJykiLCAndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2J1aWxkJywgJ3JlY2lwZScsICd0YXNrX25hbWUnKSwpIiwgJ29iamVjdF9uYW1lJzogJ1Rhc2snfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjcHVfdXNhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRlY2ltYWxGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZScsICdtYXhfZGlnaXRzJzogJzYnLCAnZGVjaW1hbF9wbGFjZXMnOiAnMid9KSwKKyAgICAgICAgICAgICdkaXNrX2lvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZWxhcHNlZF90aW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EZWNpbWFsRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnLCAnbWF4X2RpZ2l0cyc6ICc2JywgJ2RlY2ltYWxfcGxhY2VzJzogJzInfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xpbmVfbnVtYmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbG9nZmlsZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWVzc2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNDAnfSksCisgICAgICAgICAgICAnb3JkZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJy0xJ30pLAorICAgICAgICAgICAgJ3BhdGhfdG9fc3N0YXRlX29iaic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkX3JlY2lwZSciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pLAorICAgICAgICAgICAgJ3NjcmlwdF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnc291cmNlX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3N0YXRlX2NoZWNrc3VtJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NzdGF0ZV9yZXN1bHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd0YXNrX2V4ZWN1dGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ3Rhc2tfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnd29ya19kaXJlY3RvcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhc2tfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXNrX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfZGVwZW5kZW5jaWVzX2RlcGVuZHMnIiwgJ3RvJzogdSJvcm1bJ29ybS5UYXNrJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19kZXBlbmRlbmNpZXNfdGFzayciLCAndG8nOiB1Im9ybVsnb3JtLlRhc2snXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50b2FzdGVyc2V0dGluZyc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUb2FzdGVyU2V0dGluZyd9LAorICAgICAgICAgICAgJ2hlbHB0ZXh0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzYzJ30pLAorICAgICAgICAgICAgJ3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS52YXJpYWJsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdWYXJpYWJsZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3ZhcmlhYmxlX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjaGFuZ2VkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2h1bWFuX3JlYWRhYmxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZV92YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS52YXJpYWJsZWhpc3RvcnknOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVmFyaWFibGVIaXN0b3J5J30sCisgICAgICAgICAgICAnZmlsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xpbmVfbnVtYmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnb3BlcmF0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzY0J30pLAorICAgICAgICAgICAgJ3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3ZoaXN0b3J5JyIsICd0byc6IHUib3JtWydvcm0uVmFyaWFibGUnXSJ9KQorICAgICAgICB9CisgICAgfQorCisgICAgY29tcGxldGVfYXBwcyA9IFsnb3JtJ10KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMThfYXV0b19fYWRkX2ZpZWxkX2xheWVyX3ZlcnNpb25fcHJvamVjdC5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAxOF9hdXRvX19hZGRfZmllbGRfbGF5ZXJfdmVyc2lvbl9wcm9qZWN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyODRiYjgKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMThfYXV0b19fYWRkX2ZpZWxkX2xheWVyX3ZlcnNpb25fcHJvamVjdC5weQpAQCAtMCwwICsxLDMzMSBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KK2Zyb20gc291dGgudXRpbHMgaW1wb3J0IGRhdGV0aW1lX3V0aWxzIGFzIGRhdGV0aW1lCitmcm9tIHNvdXRoLmRiIGltcG9ydCBkYgorZnJvbSBzb3V0aC52MiBpbXBvcnQgU2NoZW1hTWlncmF0aW9uCitmcm9tIGRqYW5nby5kYiBpbXBvcnQgbW9kZWxzCisKKworY2xhc3MgTWlncmF0aW9uKFNjaGVtYU1pZ3JhdGlvbik6CisKKyAgICBkZWYgZm9yd2FyZHMoc2VsZiwgb3JtKToKKyAgICAgICAgIyBBZGRpbmcgZmllbGQgJ0xheWVyX1ZlcnNpb24ucHJvamVjdCcKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J29ybV9sYXllcl92ZXJzaW9uJywgJ3Byb2plY3QnLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKGRlZmF1bHQ9Tm9uZSwgdG89b3JtWydvcm0uUHJvamVjdCddLCBudWxsPVRydWUpLAorICAgICAgICAgICAgICAgICAgICAgIGtlZXBfZGVmYXVsdD1GYWxzZSkKKworCisgICAgZGVmIGJhY2t3YXJkcyhzZWxmLCBvcm0pOgorICAgICAgICAjIERlbGV0aW5nIGZpZWxkICdMYXllcl9WZXJzaW9uLnByb2plY3QnCisgICAgICAgIGRiLmRlbGV0ZV9jb2x1bW4odSdvcm1fbGF5ZXJfdmVyc2lvbicsICdwcm9qZWN0X2lkJykKKworCisgICAgbW9kZWxzID0geworICAgICAgICB1J29ybS5iaXRiYWtldmVyc2lvbic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCaXRiYWtlVmVyc2lvbid9LAorICAgICAgICAgICAgJ2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICczMid9KSwKKyAgICAgICAgICAgICdkaXJwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICdnaXR1cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J3VuaXF1ZSc6ICdUcnVlJywgJ21heF9sZW5ndGgnOiAnMzInfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0uYnJhbmNoJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAnbmFtZScpLCAoJ2xheWVyX3NvdXJjZScsICd1cF9pZCcpKSIsICdvYmplY3RfbmFtZSc6ICdCcmFuY2gnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnc2hvcnRfZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9kYXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5idWlsZCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZCd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdidWlsZF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdjb21wbGV0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2Nvb2tlcl9sb2dfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnfSksCisgICAgICAgICAgICAnZGlzdHJvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm9fdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZXJyb3JzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21hY2hpbmUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMid9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzdGFydGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICd0aW1lc3BlbnQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd3YXJuaW5nc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmhlbHB0ZXh0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0hlbHBUZXh0J30sCisgICAgICAgICAgICAnYXJlYSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidoZWxwdGV4dF9idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2tleSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndGV4dCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJyksICgnbGF5ZXJfc291cmNlJywgJ25hbWUnKSkiLCAnb2JqZWN0X25hbWUnOiAnTGF5ZXInfSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfaW5kZXhfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsb2NhbF9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjU1JywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Zjc191cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjAwJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2Y3Nfd2ViX2ZpbGVfYmFzZV91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjAwJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2Y3Nfd2ViX3RyZWVfYmFzZV91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjAwJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2Y3Nfd2ViX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyMDAnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVyX3ZlcnNpb24nOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3NvdXJjZScsICd1cF9pZCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnTGF5ZXJfVmVyc2lvbid9LAorICAgICAgICAgICAgJ2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCd9KSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3JlbGF0ZWRfbmFtZSc6ICInbGF5ZXJfdmVyc2lvbl9idWlsZCciLCAnbnVsbCc6ICdUcnVlJywgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NvbW1pdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZGlycGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjU1JywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInbGF5ZXJfdmVyc2lvbl9sYXllciciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyJ10ifSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ByaW9yaXR5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5CcmFuY2gnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfZGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXJzb3VyY2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ3NvdXJjZXR5cGUnLCAnYXBpdXJsJyksKSIsICdvYmplY3RfbmFtZSc6ICdMYXllclNvdXJjZSd9LAorICAgICAgICAgICAgJ2FwaXVybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjU1JywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsndW5pcXVlJzogJ1RydWUnLCAnbWF4X2xlbmd0aCc6ICc2Myd9KSwKKyAgICAgICAgICAgICdzb3VyY2V0eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVydmVyc2lvbmRlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3NvdXJjZScsICd1cF9pZCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnTGF5ZXJWZXJzaW9uRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInZGVwZW5kZWVzJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidkZXBlbmRlbmNpZXMnIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubG9nbWVzc2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdMb2dNZXNzYWdlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsZXZlbCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xpbmVubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21lc3NhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjQwJ30pLAorICAgICAgICAgICAgJ3BhdGhuYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFzayddIiwgJ251bGwnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLm1hY2hpbmUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3NvdXJjZScsICd1cF9pZCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnTWFjaGluZSd9LAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAndXBfZGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpbnN0YWxsZWRfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICInJyIsICdtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdpbnN0YWxsZWRfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xpY2Vuc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnODAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAncmV2aXNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMzInLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzZWN0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3N1bW1hcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZV9EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwX3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidwYWNrYWdlX2RlcGVuZGVuY2llc190YXJnZXQnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhY2thZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncGFja2FnZV9kZXBlbmRlbmNpZXNfc291cmNlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIiwgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlX2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZV9GaWxlJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhY2thZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInYnVpbGRmaWxlbGlzdF9wYWNrYWdlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0J30sCisgICAgICAgICAgICAnYml0YmFrZV92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQml0YmFrZVZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICdjcmVhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3dfYWRkJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVsZWFzZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlJlbGVhc2UnXSJ9KSwKKyAgICAgICAgICAgICdzaG9ydF9kZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwZGF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vdyc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXNlcl9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3RsYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgncHJvamVjdCcsICdsYXllcmNvbW1pdCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnUHJvamVjdExheWVyJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvcHRpb25hbCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdHRhcmdldCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0VGFyZ2V0J30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdHZhcmlhYmxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Byb2plY3RWYXJpYWJsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pLAorICAgICAgICAgICAgJ3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlY2lwZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfdmVyc2lvbicsICdmaWxlX3BhdGgnKSwpIiwgJ29iamVjdF9uYW1lJzogJ1JlY2lwZSd9LAorICAgICAgICAgICAgJ2J1Z3RyYWNrZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdmaWxlX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICdob21lcGFnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyZWNpcGVfbGF5ZXJfdmVyc2lvbiciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVjaXBlX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVjaXBlX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX2RlcGVuZHMnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX3JlY2lwZSciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlbGVhc2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVsZWFzZSd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJpdGJha2VWZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnYnJhbmNoX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAiJyciLCAnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAnaGVscHRleHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsndW5pcXVlJzogJ1RydWUnLCAnbWF4X2xlbmd0aCc6ICczMid9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWxlYXNlZGVmYXVsdGxheWVyJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlbGVhc2VEZWZhdWx0TGF5ZXInfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICInJyIsICdtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdyZWxlYXNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVsZWFzZSddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlbGVhc2VsYXllcnNvdXJjZXByaW9yaXR5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdyZWxlYXNlJywgJ2xheWVyX3NvdXJjZScpLCkiLCAnb2JqZWN0X25hbWUnOiAnUmVsZWFzZUxheWVyU291cmNlUHJpb3JpdHknfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSJ9KSwKKyAgICAgICAgICAgICdwcmlvcml0eSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3JlbGVhc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5SZWxlYXNlJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldCd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW1hZ2Vfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2lzX2ltYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ2xpY2Vuc2VfbWFuaWZlc3RfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0ZpbGUnfSwKKyAgICAgICAgICAgICdkaXJlY3RvcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInZGlyZWN0b3J5X3NldCciLCAnbnVsbCc6ICdUcnVlJywgJ3RvJzogdSJvcm1bJ29ybS5UYXJnZXRfRmlsZSddIn0pLAorICAgICAgICAgICAgJ2dyb3VwJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyOCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW5vZGV0eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ293bmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyOCd9KSwKKyAgICAgICAgICAgICdwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncGVybWlzc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxNid9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ3N5bV90YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInc3ltbGlua19zZXQnIiwgJ251bGwnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uVGFyZ2V0X0ZpbGUnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXRfaW1hZ2VfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfSW1hZ2VfRmlsZSd9LAorICAgICAgICAgICAgJ2ZpbGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgJ2ZpbGVfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2luc3RhbGxlZF9wYWNrYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9JbnN0YWxsZWRfUGFja2FnZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkdGFyZ2V0bGlzdF9wYWNrYWdlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhc2snOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb3JkZXJpbmcnOiAiKCdvcmRlcicsICdyZWNpcGUnKSIsICd1bmlxdWVfdG9nZXRoZXInOiAiKCgnYnVpbGQnLCAncmVjaXBlJywgJ3Rhc2tfbmFtZScpLCkiLCAnb2JqZWN0X25hbWUnOiAnVGFzayd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NwdV91c2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGVjaW1hbEZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJywgJ21heF9kaWdpdHMnOiAnNicsICdkZWNpbWFsX3BsYWNlcyc6ICcyJ30pLAorICAgICAgICAgICAgJ2Rpc2tfaW8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdlbGFwc2VkX3RpbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRlY2ltYWxGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZScsICdtYXhfZGlnaXRzJzogJzYnLCAnZGVjaW1hbF9wbGFjZXMnOiAnMid9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGluZV9udW1iZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsb2dmaWxlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtZXNzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI0MCd9KSwKKyAgICAgICAgICAgICdvcmRlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnLTEnfSksCisgICAgICAgICAgICAncGF0aF90b19zc3RhdGVfb2JqJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInYnVpbGRfcmVjaXBlJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSksCisgICAgICAgICAgICAnc2NyaXB0X3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzb3VyY2VfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzc3RhdGVfY2hlY2tzdW0nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3N0YXRlX3Jlc3VsdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3Rhc2tfZXhlY3V0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAndGFza19uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd3b3JrX2RpcmVjdG9yeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFza19kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Rhc2tfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19kZXBlbmRlbmNpZXNfZGVwZW5kcyciLCAndG8nOiB1Im9ybVsnb3JtLlRhc2snXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2RlcGVuZGVuY2llc190YXNrJyIsICd0byc6IHUib3JtWydvcm0uVGFzayddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRvYXN0ZXJzZXR0aW5nJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RvYXN0ZXJTZXR0aW5nJ30sCisgICAgICAgICAgICAnaGVscHRleHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNjMnfSksCisgICAgICAgICAgICAndmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnZhcmlhYmxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1ZhcmlhYmxlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndmFyaWFibGVfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NoYW5nZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnaHVtYW5fcmVhZGFibGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlX3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnZhcmlhYmxlaGlzdG9yeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdWYXJpYWJsZUhpc3RvcnknfSwKKyAgICAgICAgICAgICdmaWxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGluZV9udW1iZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvcGVyYXRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNjQnfSksCisgICAgICAgICAgICAndmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmFyaWFibGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndmhpc3RvcnknIiwgJ3RvJzogdSJvcm1bJ29ybS5WYXJpYWJsZSddIn0pCisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb21wbGV0ZV9hcHBzID0gWydvcm0nXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAxOV9hdXRvX19hZGRfYnVpbGRhcnRpZmFjdC5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAxOV9hdXRvX19hZGRfYnVpbGRhcnRpZmFjdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGNlOWVhCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDE5X2F1dG9fX2FkZF9idWlsZGFydGlmYWN0LnB5CkBAIC0wLDAgKzEsMzQyIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorZnJvbSBzb3V0aC51dGlscyBpbXBvcnQgZGF0ZXRpbWVfdXRpbHMgYXMgZGF0ZXRpbWUKK2Zyb20gc291dGguZGIgaW1wb3J0IGRiCitmcm9tIHNvdXRoLnYyIGltcG9ydCBTY2hlbWFNaWdyYXRpb24KK2Zyb20gZGphbmdvLmRiIGltcG9ydCBtb2RlbHMKKworCitjbGFzcyBNaWdyYXRpb24oU2NoZW1hTWlncmF0aW9uKToKKworICAgIGRlZiBmb3J3YXJkcyhzZWxmLCBvcm0pOgorICAgICAgICAjIEFkZGluZyBtb2RlbCAnQnVpbGRBcnRpZmFjdCcKKyAgICAgICAgZGIuY3JlYXRlX3RhYmxlKHUnb3JtX2J1aWxkYXJ0aWZhY3QnLCAoCisgICAgICAgICAgICAodSdpZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcpKHByaW1hcnlfa2V5PVRydWUpKSwKKyAgICAgICAgICAgICgnYnVpbGQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKSh0bz1vcm1bJ29ybS5CdWlsZCddKSksCisgICAgICAgICAgICAoJ2ZpbGVfbmFtZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnKShtYXhfbGVuZ3RoPTEwMCkpLAorICAgICAgICAgICAgKCdmaWxlX3NpemUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnKSgpKSwKKyAgICAgICAgKSkKKyAgICAgICAgZGIuc2VuZF9jcmVhdGVfc2lnbmFsKHUnb3JtJywgWydCdWlsZEFydGlmYWN0J10pCisKKworICAgIGRlZiBiYWNrd2FyZHMoc2VsZiwgb3JtKToKKyAgICAgICAgIyBEZWxldGluZyBtb2RlbCAnQnVpbGRBcnRpZmFjdCcKKyAgICAgICAgZGIuZGVsZXRlX3RhYmxlKHUnb3JtX2J1aWxkYXJ0aWZhY3QnKQorCisKKyAgICBtb2RlbHMgPSB7CisgICAgICAgIHUnb3JtLmJpdGJha2V2ZXJzaW9uJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0JpdGJha2VWZXJzaW9uJ30sCisgICAgICAgICAgICAnYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzMyJ30pLAorICAgICAgICAgICAgJ2RpcnBhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ2dpdHVybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsndW5pcXVlJzogJ1RydWUnLCAnbWF4X2xlbmd0aCc6ICczMid9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5icmFuY2gnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3NvdXJjZScsICduYW1lJyksICgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJykpIiwgJ29iamVjdF9uYW1lJzogJ0JyYW5jaCd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdzaG9ydF9kZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmJ1aWxkJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0J1aWxkJ30sCisgICAgICAgICAgICAnYml0YmFrZV92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ2J1aWxkX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2NvbXBsZXRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnY29va2VyX2xvZ19wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Ryb192ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdlcnJvcnNfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWFjaGluZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnb3V0Y29tZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcyJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3N0YXJ0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ3RpbWVzcGVudCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3dhcm5pbmdzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0uYnVpbGRhcnRpZmFjdCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZEFydGlmYWN0J30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2ZpbGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2ZpbGVfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0uaGVscHRleHQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnSGVscFRleHQnfSwKKyAgICAgICAgICAgICdhcmVhJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2hlbHB0ZXh0X2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAna2V5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd0ZXh0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVyJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSwgKCdsYXllcl9zb3VyY2UnLCAnbmFtZScpKSIsICdvYmplY3RfbmFtZSc6ICdMYXllcid9LAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9pbmRleF91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xvY2FsX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyNTUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3N1bW1hcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfZGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmNzX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyMDAnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Zjc193ZWJfZmlsZV9iYXNlX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyMDAnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Zjc193ZWJfdHJlZV9iYXNlX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyMDAnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Zjc193ZWJfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzIwMCcsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXJfdmVyc2lvbic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJyksKSIsICdvYmplY3RfbmFtZSc6ICdMYXllcl9WZXJzaW9uJ30sCisgICAgICAgICAgICAnYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJ30pLAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAncmVsYXRlZF9uYW1lJzogIidsYXllcl92ZXJzaW9uX2J1aWxkJyIsICdudWxsJzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdkaXJwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyNTUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidsYXllcl92ZXJzaW9uX2xheWVyJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXInXSJ9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAncHJpb3JpdHknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkJyYW5jaCddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9kYXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcnNvdXJjZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnc291cmNldHlwZScsICdhcGl1cmwnKSwpIiwgJ29iamVjdF9uYW1lJzogJ0xheWVyU291cmNlJ30sCisgICAgICAgICAgICAnYXBpdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyNTUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeyd1bmlxdWUnOiAnVHJ1ZScsICdtYXhfbGVuZ3RoJzogJzYzJ30pLAorICAgICAgICAgICAgJ3NvdXJjZXR5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXJ2ZXJzaW9uZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJyksKSIsICdvYmplY3RfbmFtZSc6ICdMYXllclZlcnNpb25EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidkZXBlbmRlZXMnIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2RlcGVuZGVuY2llcyciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sb2dtZXNzYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0xvZ01lc3NhZ2UnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xldmVsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbGluZW5vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWVzc2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNDAnfSksCisgICAgICAgICAgICAncGF0aG5hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXNrJ10iLCAnbnVsbCc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubWFjaGluZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJyksKSIsICdvYmplY3RfbmFtZSc6ICdNYWNoaW5lJ30sCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICd1cF9kYXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2UnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2luc3RhbGxlZF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogIicnIiwgJ21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2luc3RhbGxlZF9zaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbGljZW5zZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlY2lwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZXZpc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICczMicsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NlY3Rpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnODAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnc3VtbWFyeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2VfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3BhY2thZ2VfZGVwZW5kZW5jaWVzX3RhcmdldCciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidwYWNrYWdlX2RlcGVuZGVuY2llc19zb3VyY2UnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10iLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2VfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlX0ZpbGUnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIididWlsZGZpbGVsaXN0X3BhY2thZ2UnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICAncGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Byb2plY3QnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CaXRiYWtlVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ2NyZWF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vd19hZGQnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdyZWxlYXNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVsZWFzZSddIn0pLAorICAgICAgICAgICAgJ3Nob3J0X2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBkYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93JzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1c2VyX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdGxheWVyJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdwcm9qZWN0JywgJ2xheWVyY29tbWl0JyksKSIsICdvYmplY3RfbmFtZSc6ICdQcm9qZWN0TGF5ZXInfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJjb21taXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ29wdGlvbmFsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ1RydWUnfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0dGFyZ2V0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Byb2plY3RUYXJnZXQnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0dmFyaWFibGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdFZhcmlhYmxlJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSksCisgICAgICAgICAgICAndmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVjaXBlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl92ZXJzaW9uJywgJ2ZpbGVfcGF0aCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnUmVjaXBlJ30sCisgICAgICAgICAgICAnYnVndHJhY2tlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2ZpbGVfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ2hvbWVwYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JlY2lwZV9sYXllcl92ZXJzaW9uJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ2xpY2Vuc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzZWN0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3N1bW1hcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfZGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWNpcGVfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWNpcGVfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncl9kZXBlbmRlbmNpZXNfZGVwZW5kcyciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncl9kZXBlbmRlbmNpZXNfcmVjaXBlJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVsZWFzZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWxlYXNlJ30sCisgICAgICAgICAgICAnYml0YmFrZV92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQml0YmFrZVZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICdicmFuY2hfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICInJyIsICdtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICdoZWxwdGV4dCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeyd1bmlxdWUnOiAnVHJ1ZScsICdtYXhfbGVuZ3RoJzogJzMyJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlbGVhc2VkZWZhdWx0bGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVsZWFzZURlZmF1bHRMYXllcid9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogIicnIiwgJ21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlbGVhc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5SZWxlYXNlJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVsZWFzZWxheWVyc291cmNlcHJpb3JpdHknOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ3JlbGVhc2UnLCAnbGF5ZXJfc291cmNlJyksKSIsICdvYmplY3RfbmFtZSc6ICdSZWxlYXNlTGF5ZXJTb3VyY2VQcmlvcml0eSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIn0pLAorICAgICAgICAgICAgJ3ByaW9yaXR5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAncmVsZWFzZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlJlbGVhc2UnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0J30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpbWFnZV9zaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnaXNfaW1hZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAnbGljZW5zZV9tYW5pZmVzdF9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwMCcsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXRfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfRmlsZSd9LAorICAgICAgICAgICAgJ2RpcmVjdG9yeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidkaXJlY3Rvcnlfc2V0JyIsICdudWxsJzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLlRhcmdldF9GaWxlJ10ifSksCisgICAgICAgICAgICAnZ3JvdXAnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTI4J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpbm9kZXR5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnb3duZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTI4J30pLAorICAgICAgICAgICAgJ3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdwZXJtaXNzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzE2J30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnc3ltX3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidzeW1saW5rX3NldCciLCAnbnVsbCc6ICdUcnVlJywgJ3RvJzogdSJvcm1bJ29ybS5UYXJnZXRfRmlsZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9pbWFnZV9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9JbWFnZV9GaWxlJ30sCisgICAgICAgICAgICAnZmlsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICAnZmlsZV9zaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXRfaW5zdGFsbGVkX3BhY2thZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0luc3RhbGxlZF9QYWNrYWdlJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhY2thZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInYnVpbGR0YXJnZXRsaXN0X3BhY2thZ2UnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFzayc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvcmRlcmluZyc6ICIoJ29yZGVyJywgJ3JlY2lwZScpIiwgJ3VuaXF1ZV90b2dldGhlcic6ICIoKCdidWlsZCcsICdyZWNpcGUnLCAndGFza19uYW1lJyksKSIsICdvYmplY3RfbmFtZSc6ICdUYXNrJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY3B1X3VzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EZWNpbWFsRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnLCAnbWF4X2RpZ2l0cyc6ICc2JywgJ2RlY2ltYWxfcGxhY2VzJzogJzInfSksCisgICAgICAgICAgICAnZGlza19pbyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2VsYXBzZWRfdGltZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGVjaW1hbEZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJywgJ21heF9kaWdpdHMnOiAnNicsICdkZWNpbWFsX3BsYWNlcyc6ICcyJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsaW5lX251bWJlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xvZ2ZpbGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21lc3NhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjQwJ30pLAorICAgICAgICAgICAgJ29yZGVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnb3V0Y29tZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICctMSd9KSwKKyAgICAgICAgICAgICdwYXRoX3RvX3NzdGF0ZV9vYmonOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JlY2lwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIididWlsZF9yZWNpcGUnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KSwKKyAgICAgICAgICAgICdzY3JpcHRfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3NvdXJjZV91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NzdGF0ZV9jaGVja3N1bSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzc3RhdGVfcmVzdWx0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAndGFza19leGVjdXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICd0YXNrX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3dvcmtfZGlyZWN0b3J5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXNrX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFza19EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2RlcGVuZGVuY2llc19kZXBlbmRzJyIsICd0byc6IHUib3JtWydvcm0uVGFzayddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfZGVwZW5kZW5jaWVzX3Rhc2snIiwgJ3RvJzogdSJvcm1bJ29ybS5UYXNrJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udG9hc3RlcnNldHRpbmcnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVG9hc3RlclNldHRpbmcnfSwKKyAgICAgICAgICAgICdoZWxwdGV4dCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc2Myd9KSwKKyAgICAgICAgICAgICd2YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udmFyaWFibGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVmFyaWFibGUnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid2YXJpYWJsZV9idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY2hhbmdlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdodW1hbl9yZWFkYWJsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndmFyaWFibGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndmFyaWFibGVfdmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udmFyaWFibGVoaXN0b3J5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1ZhcmlhYmxlSGlzdG9yeSd9LAorICAgICAgICAgICAgJ2ZpbGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsaW5lX251bWJlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ29wZXJhdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc2NCd9KSwKKyAgICAgICAgICAgICd2YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid2aGlzdG9yeSciLCAndG8nOiB1Im9ybVsnb3JtLlZhcmlhYmxlJ10ifSkKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbXBsZXRlX2FwcHMgPSBbJ29ybSddClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDIwX2F1dG9fX2FkZF9maWVsZF9sYXllcl92ZXJzaW9uX2xvY2FsX3BhdGhfX2FkZF9maWVsZF9yZWNpcGVfcGF0aGZsYWdzX18ucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMjBfYXV0b19fYWRkX2ZpZWxkX2xheWVyX3ZlcnNpb25fbG9jYWxfcGF0aF9fYWRkX2ZpZWxkX3JlY2lwZV9wYXRoZmxhZ3NfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWM1Nzk1Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDIwX2F1dG9fX2FkZF9maWVsZF9sYXllcl92ZXJzaW9uX2xvY2FsX3BhdGhfX2FkZF9maWVsZF9yZWNpcGVfcGF0aGZsYWdzX18ucHkKQEAgLTAsMCArMSwzNjEgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCitmcm9tIHNvdXRoLnV0aWxzIGltcG9ydCBkYXRldGltZV91dGlscyBhcyBkYXRldGltZQorZnJvbSBzb3V0aC5kYiBpbXBvcnQgZGIKK2Zyb20gc291dGgudjIgaW1wb3J0IFNjaGVtYU1pZ3JhdGlvbgorZnJvbSBkamFuZ28uZGIgaW1wb3J0IG1vZGVscworCisKK2NsYXNzIE1pZ3JhdGlvbihTY2hlbWFNaWdyYXRpb24pOgorCisgICAgZGVmIGZvcndhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgUmVtb3ZpbmcgdW5pcXVlIGNvbnN0cmFpbnQgb24gJ1JlY2lwZScsIGZpZWxkcyBbJ2xheWVyX3ZlcnNpb24nLCAnZmlsZV9wYXRoJ10KKyAgICAgICAgZGIuZGVsZXRlX3VuaXF1ZSh1J29ybV9yZWNpcGUnLCBbJ2xheWVyX3ZlcnNpb25faWQnLCAnZmlsZV9wYXRoJ10pCisKKyAgICAgICAgIyBBZGRpbmcgZmllbGQgJ0xheWVyX1ZlcnNpb24ubG9jYWxfcGF0aCcKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J29ybV9sYXllcl92ZXJzaW9uJywgJ2xvY2FsX3BhdGgnLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnKShkZWZhdWx0PSIvIiwgbWF4X2xlbmd0aD0xMDI0KSwKKyAgICAgICAgICAgICAgICAgICAgICBrZWVwX2RlZmF1bHQ9RmFsc2UpCisKKyAgICAgICAgIyBBZGRpbmcgZmllbGQgJ1JlY2lwZS5wYXRoZmxhZ3MnCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fcmVjaXBlJywgJ3BhdGhmbGFncycsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykoZGVmYXVsdD0nJywgbWF4X2xlbmd0aD0yMDAsIGJsYW5rPVRydWUpLAorICAgICAgICAgICAgICAgICAgICAgIGtlZXBfZGVmYXVsdD1GYWxzZSkKKworICAgICAgICAjIEFkZGluZyB1bmlxdWUgY29uc3RyYWludCBvbiAnUmVjaXBlJywgZmllbGRzIFsnbGF5ZXJfdmVyc2lvbicsICdmaWxlX3BhdGgnLCAncGF0aGZsYWdzJ10KKyAgICAgICAgZGIuY3JlYXRlX3VuaXF1ZSh1J29ybV9yZWNpcGUnLCBbJ2xheWVyX3ZlcnNpb25faWQnLCAnZmlsZV9wYXRoJywgJ3BhdGhmbGFncyddKQorCisgICAgICAgICMgTWlncmF0ZSBkYXRhIGZyb20gTGF5ZXIubG9jYWxfcGF0aCB0byBMYXllcl9WZXJzaW9uLmxvY2FsX3BhdGgKKyAgICAgICAgaWYgbm90IGRiLmRyeV9ydW46CisgICAgICAgICAgICBmb3IgbHYgaW4gb3JtLkxheWVyX1ZlcnNpb24ub2JqZWN0cy5hbGwoKToKKyAgICAgICAgICAgICAgICBpZiBsdi5sYXllci5sb2NhbF9wYXRoIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBsdi5sb2NhbF9wYXRoID0gbHYubGF5ZXIubG9jYWxfcGF0aAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGx2LmxvY2FsX3BhdGggPSAiLyIKKyAgICAgICAgICAgICAgICBsdi5zYXZlKCkKKworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnb3JtX2xheWVyJywgJ2xvY2FsX3BhdGgnKQorCisKKyAgICBkZWYgYmFja3dhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiQ2Fubm90IHJldmVyc2UgdGhpcyBtaWdyYXRpb24iKQorCisKKyAgICBtb2RlbHMgPSB7CisgICAgICAgIHUnb3JtLmJpdGJha2V2ZXJzaW9uJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0JpdGJha2VWZXJzaW9uJ30sCisgICAgICAgICAgICAnYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzMyJ30pLAorICAgICAgICAgICAgJ2RpcnBhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ2dpdHVybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsndW5pcXVlJzogJ1RydWUnLCAnbWF4X2xlbmd0aCc6ICczMid9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5icmFuY2gnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3NvdXJjZScsICduYW1lJyksICgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJykpIiwgJ29iamVjdF9uYW1lJzogJ0JyYW5jaCd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdzaG9ydF9kZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmJ1aWxkJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0J1aWxkJ30sCisgICAgICAgICAgICAnYml0YmFrZV92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ2J1aWxkX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2NvbXBsZXRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnY29va2VyX2xvZ19wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Ryb192ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdlcnJvcnNfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWFjaGluZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnb3V0Y29tZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcyJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSksCisgICAgICAgICAgICAnc3RhcnRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAndGltZXNwZW50JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnd2FybmluZ3Nfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5idWlsZGFydGlmYWN0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0J1aWxkQXJ0aWZhY3QnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnZmlsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZmlsZV9zaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5oZWxwdGV4dCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdIZWxwVGV4dCd9LAorICAgICAgICAgICAgJ2FyZWEnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInaGVscHRleHRfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdrZXknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3RleHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3NvdXJjZScsICd1cF9pZCcpLCAoJ2xheWVyX3NvdXJjZScsICduYW1lJykpIiwgJ29iamVjdF9uYW1lJzogJ0xheWVyJ30sCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX2luZGV4X3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbG9jYWxfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzI1NScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnc3VtbWFyeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9kYXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2Y3NfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzIwMCcsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmNzX3dlYl9maWxlX2Jhc2VfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzIwMCcsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmNzX3dlYl90cmVlX2Jhc2VfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzIwMCcsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmNzX3dlYl91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjAwJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcl92ZXJzaW9uJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSwpIiwgJ29iamVjdF9uYW1lJzogJ0xheWVyX1ZlcnNpb24nfSwKKyAgICAgICAgICAgICdicmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnODAnfSksCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdyZWxhdGVkX25hbWUnOiAiJ2xheWVyX3ZlcnNpb25fYnVpbGQnIiwgJ251bGwnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjb21taXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2RpcnBhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzI1NScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2xheWVyX3ZlcnNpb25fbGF5ZXInIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllciddIn0pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsb2NhbF9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjU1JywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwcmlvcml0eSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9icmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uQnJhbmNoJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVyc291cmNlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdzb3VyY2V0eXBlJywgJ2FwaXVybCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnTGF5ZXJTb3VyY2UnfSwKKyAgICAgICAgICAgICdhcGl1cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzI1NScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J3VuaXF1ZSc6ICdUcnVlJywgJ21heF9sZW5ndGgnOiAnNjMnfSksCisgICAgICAgICAgICAnc291cmNldHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcnZlcnNpb25kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSwpIiwgJ29iamVjdF9uYW1lJzogJ0xheWVyVmVyc2lvbkRlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2RlcGVuZGVlcyciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInZGVwZW5kZW5jaWVzJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxvZ21lc3NhZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnTG9nTWVzc2FnZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGV2ZWwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsaW5lbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtZXNzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI0MCd9KSwKKyAgICAgICAgICAgICdwYXRobmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhc2snXSIsICdudWxsJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5tYWNoaW5lJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSwpIiwgJ29iamVjdF9uYW1lJzogJ01hY2hpbmUnfSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW5zdGFsbGVkX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAiJyciLCAnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnaW5zdGFsbGVkX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JldmlzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzMyJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncGFja2FnZV9kZXBlbmRlbmNpZXNfdGFyZ2V0JyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3BhY2thZ2VfZGVwZW5kZW5jaWVzX3NvdXJjZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSIsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRmlsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkZmlsZWxpc3RfcGFja2FnZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICdwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3QnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdCd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJpdGJha2VWZXJzaW9uJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2NyZWF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vd19hZGQnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdyZWxlYXNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVsZWFzZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzaG9ydF9kZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwZGF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vdyc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXNlcl9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3RsYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgncHJvamVjdCcsICdsYXllcmNvbW1pdCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnUHJvamVjdExheWVyJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvcHRpb25hbCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdHRhcmdldCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0VGFyZ2V0J30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdHZhcmlhYmxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Byb2plY3RWYXJpYWJsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pLAorICAgICAgICAgICAgJ3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlY2lwZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfdmVyc2lvbicsICdmaWxlX3BhdGgnLCAncGF0aGZsYWdzJyksICgnZmlsZV9wYXRoJywgJ3BhdGhmbGFncycpKSIsICdvYmplY3RfbmFtZSc6ICdSZWNpcGUnfSwKKyAgICAgICAgICAgICdidWd0cmFja2VyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZmlsZV9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAnaG9tZXBhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncmVjaXBlX2xheWVyX3ZlcnNpb24nIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnbGljZW5zZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhdGhmbGFncyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzZWN0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3N1bW1hcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfZGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWNpcGVfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWNpcGVfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncl9kZXBlbmRlbmNpZXNfZGVwZW5kcyciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncl9kZXBlbmRlbmNpZXNfcmVjaXBlJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVsZWFzZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWxlYXNlJ30sCisgICAgICAgICAgICAnYml0YmFrZV92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQml0YmFrZVZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICdicmFuY2hfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICInJyIsICdtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICdoZWxwdGV4dCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeyd1bmlxdWUnOiAnVHJ1ZScsICdtYXhfbGVuZ3RoJzogJzMyJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlbGVhc2VkZWZhdWx0bGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVsZWFzZURlZmF1bHRMYXllcid9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogIicnIiwgJ21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlbGVhc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5SZWxlYXNlJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVsZWFzZWxheWVyc291cmNlcHJpb3JpdHknOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ3JlbGVhc2UnLCAnbGF5ZXJfc291cmNlJyksKSIsICdvYmplY3RfbmFtZSc6ICdSZWxlYXNlTGF5ZXJTb3VyY2VQcmlvcml0eSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIn0pLAorICAgICAgICAgICAgJ3ByaW9yaXR5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAncmVsZWFzZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlJlbGVhc2UnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0J30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpbWFnZV9zaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnaXNfaW1hZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAnbGljZW5zZV9tYW5pZmVzdF9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwMCcsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXRfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfRmlsZSd9LAorICAgICAgICAgICAgJ2RpcmVjdG9yeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidkaXJlY3Rvcnlfc2V0JyIsICdudWxsJzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLlRhcmdldF9GaWxlJ10ifSksCisgICAgICAgICAgICAnZ3JvdXAnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTI4J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpbm9kZXR5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnb3duZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTI4J30pLAorICAgICAgICAgICAgJ3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdwZXJtaXNzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzE2J30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnc3ltX3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidzeW1saW5rX3NldCciLCAnbnVsbCc6ICdUcnVlJywgJ3RvJzogdSJvcm1bJ29ybS5UYXJnZXRfRmlsZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9pbWFnZV9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9JbWFnZV9GaWxlJ30sCisgICAgICAgICAgICAnZmlsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICAnZmlsZV9zaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXRfaW5zdGFsbGVkX3BhY2thZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0luc3RhbGxlZF9QYWNrYWdlJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhY2thZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInYnVpbGR0YXJnZXRsaXN0X3BhY2thZ2UnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFzayc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvcmRlcmluZyc6ICIoJ29yZGVyJywgJ3JlY2lwZScpIiwgJ3VuaXF1ZV90b2dldGhlcic6ICIoKCdidWlsZCcsICdyZWNpcGUnLCAndGFza19uYW1lJyksKSIsICdvYmplY3RfbmFtZSc6ICdUYXNrJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY3B1X3VzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EZWNpbWFsRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnLCAnbWF4X2RpZ2l0cyc6ICc4JywgJ2RlY2ltYWxfcGxhY2VzJzogJzInfSksCisgICAgICAgICAgICAnZGlza19pbyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2VsYXBzZWRfdGltZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGVjaW1hbEZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJywgJ21heF9kaWdpdHMnOiAnOCcsICdkZWNpbWFsX3BsYWNlcyc6ICcyJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsaW5lX251bWJlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xvZ2ZpbGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21lc3NhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjQwJ30pLAorICAgICAgICAgICAgJ29yZGVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnb3V0Y29tZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICctMSd9KSwKKyAgICAgICAgICAgICdwYXRoX3RvX3NzdGF0ZV9vYmonOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JlY2lwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrcyciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pLAorICAgICAgICAgICAgJ3NjcmlwdF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnc291cmNlX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3N0YXRlX2NoZWNrc3VtJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NzdGF0ZV9yZXN1bHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd0YXNrX2V4ZWN1dGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ3Rhc2tfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnd29ya19kaXJlY3RvcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhc2tfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXNrX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfZGVwZW5kZW5jaWVzX2RlcGVuZHMnIiwgJ3RvJzogdSJvcm1bJ29ybS5UYXNrJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19kZXBlbmRlbmNpZXNfdGFzayciLCAndG8nOiB1Im9ybVsnb3JtLlRhc2snXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50b2FzdGVyc2V0dGluZyc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUb2FzdGVyU2V0dGluZyd9LAorICAgICAgICAgICAgJ2hlbHB0ZXh0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzYzJ30pLAorICAgICAgICAgICAgJ3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS52YXJpYWJsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdWYXJpYWJsZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3ZhcmlhYmxlX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjaGFuZ2VkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2h1bWFuX3JlYWRhYmxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZV92YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS52YXJpYWJsZWhpc3RvcnknOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVmFyaWFibGVIaXN0b3J5J30sCisgICAgICAgICAgICAnZmlsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xpbmVfbnVtYmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnb3BlcmF0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzY0J30pLAorICAgICAgICAgICAgJ3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3ZoaXN0b3J5JyIsICd0byc6IHUib3JtWydvcm0uVmFyaWFibGUnXSJ9KQorICAgICAgICB9CisgICAgfQorCisgICAgY29tcGxldGVfYXBwcyA9IFsnb3JtJ10KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAyMV9hdXRvX19jaGdfZmllbGRfYnVpbGRfcHJvamVjdF9fY2hnX2ZpZWxkX3Byb2plY3RfYml0YmFrZV92ZXJzaW9uX19jaGdfLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDIxX2F1dG9fX2NoZ19maWVsZF9idWlsZF9wcm9qZWN0X19jaGdfZmllbGRfcHJvamVjdF9iaXRiYWtlX3ZlcnNpb25fX2NoZ18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYyZGRiNwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAyMV9hdXRvX19jaGdfZmllbGRfYnVpbGRfcHJvamVjdF9fY2hnX2ZpZWxkX3Byb2plY3RfYml0YmFrZV92ZXJzaW9uX19jaGdfLnB5CkBAIC0wLDAgKzEsMzcxIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorZnJvbSBzb3V0aC51dGlscyBpbXBvcnQgZGF0ZXRpbWVfdXRpbHMgYXMgZGF0ZXRpbWUKK2Zyb20gc291dGguZGIgaW1wb3J0IGRiCitmcm9tIHNvdXRoLnYyIGltcG9ydCBTY2hlbWFNaWdyYXRpb24KK2Zyb20gZGphbmdvLmRiIGltcG9ydCBtb2RlbHMKKworCitjbGFzcyBNaWdyYXRpb24oU2NoZW1hTWlncmF0aW9uKToKKworICAgIG5vX2RyeV9ydW4gPSBUcnVlCisKKyAgICBkZWYgZm9yd2FyZHMoc2VsZiwgb3JtKToKKworICAgICAgICAjIENoYW5naW5nIGZpZWxkICdCdWlsZC5wcm9qZWN0JworICAgICAgICBkYi5hbHRlcl9jb2x1bW4odSdvcm1fYnVpbGQnLCAncHJvamVjdF9pZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHRvPW9ybVsnb3JtLlByb2plY3QnXSkpCisKKyAgICAgICAgIyBDaGFuZ2luZyBmaWVsZCAnUHJvamVjdC5iaXRiYWtlX3ZlcnNpb24nCisgICAgICAgIGRiLmFsdGVyX2NvbHVtbih1J29ybV9wcm9qZWN0JywgJ2JpdGJha2VfdmVyc2lvbl9pZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHRvPW9ybVsnb3JtLkJpdGJha2VWZXJzaW9uJ10sIG51bGw9VHJ1ZSkpCisKKyAgICAgICAgIyBDaGFuZ2luZyBmaWVsZCAnUHJvamVjdC5yZWxlYXNlJworICAgICAgICBkYi5hbHRlcl9jb2x1bW4odSdvcm1fcHJvamVjdCcsICdyZWxlYXNlX2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykodG89b3JtWydvcm0uUmVsZWFzZSddLCBudWxsPVRydWUpKQorCisgICAgICAgICMgQ2hhbmdpbmcgZmllbGQgJ1Rhc2suY3B1X3VzYWdlJworICAgICAgICBkYi5hbHRlcl9jb2x1bW4odSdvcm1fdGFzaycsICdjcHVfdXNhZ2UnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EZWNpbWFsRmllbGQnKShudWxsPVRydWUsIG1heF9kaWdpdHM9OCwgZGVjaW1hbF9wbGFjZXM9MikpCisKKyAgICAgICAgIyBDaGFuZ2luZyBmaWVsZCAnVGFzay5lbGFwc2VkX3RpbWUnCisgICAgICAgIGRiLmFsdGVyX2NvbHVtbih1J29ybV90YXNrJywgJ2VsYXBzZWRfdGltZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRlY2ltYWxGaWVsZCcpKG51bGw9VHJ1ZSwgbWF4X2RpZ2l0cz04LCBkZWNpbWFsX3BsYWNlcz0yKSkKKworICAgIGRlZiBiYWNrd2FyZHMoc2VsZiwgb3JtKToKKworICAgICAgICAjIENoYW5naW5nIGZpZWxkICdCdWlsZC5wcm9qZWN0JworICAgICAgICBkYi5hbHRlcl9jb2x1bW4odSdvcm1fYnVpbGQnLCAncHJvamVjdF9pZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHRvPW9ybVsnb3JtLlByb2plY3QnXSwgbnVsbD1UcnVlKSkKKworICAgICAgICAjIFVzZXIgY2hvc2UgdG8gbm90IGRlYWwgd2l0aCBiYWNrd2FyZHMgTlVMTCBpc3N1ZXMgZm9yICdQcm9qZWN0LmJpdGJha2VfdmVyc2lvbicKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJDYW5ub3QgcmV2ZXJzZSB0aGlzIG1pZ3JhdGlvbi4gJ1Byb2plY3QuYml0YmFrZV92ZXJzaW9uJyBhbmQgaXRzIHZhbHVlcyBjYW5ub3QgYmUgcmVzdG9yZWQuIikKKyAgICAgICAgCisgICAgICAgICMgVGhlIGZvbGxvd2luZyBjb2RlIGlzIHByb3ZpZGVkIGhlcmUgdG8gYWlkIGluIHdyaXRpbmcgYSBjb3JyZWN0IG1pZ3JhdGlvbgorICAgICAgICAjIENoYW5naW5nIGZpZWxkICdQcm9qZWN0LmJpdGJha2VfdmVyc2lvbicKKyAgICAgICAgZGIuYWx0ZXJfY29sdW1uKHUnb3JtX3Byb2plY3QnLCAnYml0YmFrZV92ZXJzaW9uX2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykodG89b3JtWydvcm0uQml0YmFrZVZlcnNpb24nXSkpCisKKyAgICAgICAgIyBVc2VyIGNob3NlIHRvIG5vdCBkZWFsIHdpdGggYmFja3dhcmRzIE5VTEwgaXNzdWVzIGZvciAnUHJvamVjdC5yZWxlYXNlJworICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIkNhbm5vdCByZXZlcnNlIHRoaXMgbWlncmF0aW9uLiAnUHJvamVjdC5yZWxlYXNlJyBhbmQgaXRzIHZhbHVlcyBjYW5ub3QgYmUgcmVzdG9yZWQuIikKKyAgICAgICAgCisgICAgICAgICMgVGhlIGZvbGxvd2luZyBjb2RlIGlzIHByb3ZpZGVkIGhlcmUgdG8gYWlkIGluIHdyaXRpbmcgYSBjb3JyZWN0IG1pZ3JhdGlvbgorICAgICAgICAjIENoYW5naW5nIGZpZWxkICdQcm9qZWN0LnJlbGVhc2UnCisgICAgICAgIGRiLmFsdGVyX2NvbHVtbih1J29ybV9wcm9qZWN0JywgJ3JlbGVhc2VfaWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKSh0bz1vcm1bJ29ybS5SZWxlYXNlJ10pKQorCisgICAgICAgICMgQ2hhbmdpbmcgZmllbGQgJ1Rhc2suY3B1X3VzYWdlJworICAgICAgICBkYi5hbHRlcl9jb2x1bW4odSdvcm1fdGFzaycsICdjcHVfdXNhZ2UnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EZWNpbWFsRmllbGQnKShudWxsPVRydWUsIG1heF9kaWdpdHM9NiwgZGVjaW1hbF9wbGFjZXM9MikpCisKKyAgICAgICAgIyBDaGFuZ2luZyBmaWVsZCAnVGFzay5lbGFwc2VkX3RpbWUnCisgICAgICAgIGRiLmFsdGVyX2NvbHVtbih1J29ybV90YXNrJywgJ2VsYXBzZWRfdGltZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRlY2ltYWxGaWVsZCcpKG51bGw9VHJ1ZSwgbWF4X2RpZ2l0cz02LCBkZWNpbWFsX3BsYWNlcz0yKSkKKworICAgIG1vZGVscyA9IHsKKyAgICAgICAgdSdvcm0uYml0YmFrZXZlcnNpb24nOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQml0YmFrZVZlcnNpb24nfSwKKyAgICAgICAgICAgICdicmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMzInfSksCisgICAgICAgICAgICAnZGlycGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAnZ2l0dXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeyd1bmlxdWUnOiAnVHJ1ZScsICdtYXhfbGVuZ3RoJzogJzMyJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmJyYW5jaCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ25hbWUnKSwgKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSkiLCAnb2JqZWN0X25hbWUnOiAnQnJhbmNoJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdUcnVlJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ3Nob3J0X2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfZGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0uYnVpbGQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQnVpbGQnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnYnVpbGRfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnY29tcGxldGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdjb29rZXJfbG9nX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Rybyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZGlzdHJvX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Vycm9yc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtYWNoaW5lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzInfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSJ9KSwKKyAgICAgICAgICAgICdzdGFydGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICd0aW1lc3BlbnQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd3YXJuaW5nc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmJ1aWxkYXJ0aWZhY3QnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQnVpbGRBcnRpZmFjdCd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdmaWxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdmaWxlX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmhlbHB0ZXh0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0hlbHBUZXh0J30sCisgICAgICAgICAgICAnYXJlYSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidoZWxwdGV4dF9idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2tleSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndGV4dCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJyksICgnbGF5ZXJfc291cmNlJywgJ25hbWUnKSkiLCAnb2JqZWN0X25hbWUnOiAnTGF5ZXInfSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfaW5kZXhfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Zjc191cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjAwJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2Y3Nfd2ViX2ZpbGVfYmFzZV91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjAwJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2Y3Nfd2ViX3RyZWVfYmFzZV91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjAwJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2Y3Nfd2ViX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyMDAnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVyX3ZlcnNpb24nOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3NvdXJjZScsICd1cF9pZCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnTGF5ZXJfVmVyc2lvbid9LAorICAgICAgICAgICAgJ2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCd9KSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3JlbGF0ZWRfbmFtZSc6ICInbGF5ZXJfdmVyc2lvbl9idWlsZCciLCAnbnVsbCc6ICdUcnVlJywgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NvbW1pdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZGlycGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjU1JywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInbGF5ZXJfdmVyc2lvbl9sYXllciciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyJ10ifSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xvY2FsX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydkZWZhdWx0JzogIicvJyIsICdtYXhfbGVuZ3RoJzogJzEwMjQnfSksCisgICAgICAgICAgICAncHJpb3JpdHknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkJyYW5jaCddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9kYXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcnNvdXJjZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnc291cmNldHlwZScsICdhcGl1cmwnKSwpIiwgJ29iamVjdF9uYW1lJzogJ0xheWVyU291cmNlJ30sCisgICAgICAgICAgICAnYXBpdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyNTUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeyd1bmlxdWUnOiAnVHJ1ZScsICdtYXhfbGVuZ3RoJzogJzYzJ30pLAorICAgICAgICAgICAgJ3NvdXJjZXR5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXJ2ZXJzaW9uZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJyksKSIsICdvYmplY3RfbmFtZSc6ICdMYXllclZlcnNpb25EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidkZXBlbmRlZXMnIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2RlcGVuZGVuY2llcyciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sb2dtZXNzYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0xvZ01lc3NhZ2UnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xldmVsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbGluZW5vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWVzc2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNDAnfSksCisgICAgICAgICAgICAncGF0aG5hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXNrJ10iLCAnbnVsbCc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubWFjaGluZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJyksKSIsICdvYmplY3RfbmFtZSc6ICdNYWNoaW5lJ30sCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICd1cF9kYXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2UnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2luc3RhbGxlZF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogIicnIiwgJ21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2luc3RhbGxlZF9zaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbGljZW5zZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlY2lwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZXZpc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICczMicsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NlY3Rpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnODAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnc3VtbWFyeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2VfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3BhY2thZ2VfZGVwZW5kZW5jaWVzX3RhcmdldCciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidwYWNrYWdlX2RlcGVuZGVuY2llc19zb3VyY2UnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10iLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2VfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlX0ZpbGUnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIididWlsZGZpbGVsaXN0X3BhY2thZ2UnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICAncGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Byb2plY3QnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CaXRiYWtlVmVyc2lvbiddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdjcmVhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3dfYWRkJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVsZWFzZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlJlbGVhc2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2hvcnRfZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cGRhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3cnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VzZXJfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0bGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ3Byb2plY3QnLCAnbGF5ZXJjb21taXQnKSwpIiwgJ29iamVjdF9uYW1lJzogJ1Byb2plY3RMYXllcid9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcmNvbW1pdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnb3B0aW9uYWwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3R0YXJnZXQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdFRhcmdldCd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3R2YXJpYWJsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0VmFyaWFibGUnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSJ9KSwKKyAgICAgICAgICAgICd2YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWNpcGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3ZlcnNpb24nLCAnZmlsZV9wYXRoJywgJ3BhdGhmbGFncycpLCkiLCAnb2JqZWN0X25hbWUnOiAnUmVjaXBlJ30sCisgICAgICAgICAgICAnYnVndHJhY2tlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2ZpbGVfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ2hvbWVwYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JlY2lwZV9sYXllcl92ZXJzaW9uJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ2xpY2Vuc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYXRoZmxhZ3MnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVjaXBlX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVjaXBlX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX2RlcGVuZHMnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX3JlY2lwZSciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlbGVhc2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVsZWFzZSd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJpdGJha2VWZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnYnJhbmNoX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAiJyciLCAnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAnaGVscHRleHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsndW5pcXVlJzogJ1RydWUnLCAnbWF4X2xlbmd0aCc6ICczMid9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWxlYXNlZGVmYXVsdGxheWVyJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlbGVhc2VEZWZhdWx0TGF5ZXInfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICInJyIsICdtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdyZWxlYXNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVsZWFzZSddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlbGVhc2VsYXllcnNvdXJjZXByaW9yaXR5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdyZWxlYXNlJywgJ2xheWVyX3NvdXJjZScpLCkiLCAnb2JqZWN0X25hbWUnOiAnUmVsZWFzZUxheWVyU291cmNlUHJpb3JpdHknfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSJ9KSwKKyAgICAgICAgICAgICdwcmlvcml0eSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3JlbGVhc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5SZWxlYXNlJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldCd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW1hZ2Vfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2lzX2ltYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ2xpY2Vuc2VfbWFuaWZlc3RfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0ZpbGUnfSwKKyAgICAgICAgICAgICdkaXJlY3RvcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInZGlyZWN0b3J5X3NldCciLCAnbnVsbCc6ICdUcnVlJywgJ3RvJzogdSJvcm1bJ29ybS5UYXJnZXRfRmlsZSddIn0pLAorICAgICAgICAgICAgJ2dyb3VwJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyOCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW5vZGV0eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ293bmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyOCd9KSwKKyAgICAgICAgICAgICdwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncGVybWlzc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxNid9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ3N5bV90YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInc3ltbGlua19zZXQnIiwgJ251bGwnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uVGFyZ2V0X0ZpbGUnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXRfaW1hZ2VfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfSW1hZ2VfRmlsZSd9LAorICAgICAgICAgICAgJ2ZpbGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgJ2ZpbGVfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2luc3RhbGxlZF9wYWNrYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9JbnN0YWxsZWRfUGFja2FnZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkdGFyZ2V0bGlzdF9wYWNrYWdlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhc2snOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb3JkZXJpbmcnOiAiKCdvcmRlcicsICdyZWNpcGUnKSIsICd1bmlxdWVfdG9nZXRoZXInOiAiKCgnYnVpbGQnLCAncmVjaXBlJywgJ3Rhc2tfbmFtZScpLCkiLCAnb2JqZWN0X25hbWUnOiAnVGFzayd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NwdV91c2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGVjaW1hbEZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJywgJ21heF9kaWdpdHMnOiAnOCcsICdkZWNpbWFsX3BsYWNlcyc6ICcyJ30pLAorICAgICAgICAgICAgJ2Rpc2tfaW8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdlbGFwc2VkX3RpbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRlY2ltYWxGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZScsICdtYXhfZGlnaXRzJzogJzgnLCAnZGVjaW1hbF9wbGFjZXMnOiAnMid9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGluZV9udW1iZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsb2dmaWxlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtZXNzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI0MCd9KSwKKyAgICAgICAgICAgICdvcmRlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnLTEnfSksCisgICAgICAgICAgICAncGF0aF90b19zc3RhdGVfb2JqJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza3MnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KSwKKyAgICAgICAgICAgICdzY3JpcHRfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3NvdXJjZV91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NzdGF0ZV9jaGVja3N1bSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzc3RhdGVfcmVzdWx0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAndGFza19leGVjdXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICd0YXNrX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3dvcmtfZGlyZWN0b3J5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXNrX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFza19EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2RlcGVuZGVuY2llc19kZXBlbmRzJyIsICd0byc6IHUib3JtWydvcm0uVGFzayddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfZGVwZW5kZW5jaWVzX3Rhc2snIiwgJ3RvJzogdSJvcm1bJ29ybS5UYXNrJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udG9hc3RlcnNldHRpbmcnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVG9hc3RlclNldHRpbmcnfSwKKyAgICAgICAgICAgICdoZWxwdGV4dCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc2Myd9KSwKKyAgICAgICAgICAgICd2YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udmFyaWFibGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVmFyaWFibGUnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid2YXJpYWJsZV9idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY2hhbmdlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdodW1hbl9yZWFkYWJsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndmFyaWFibGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndmFyaWFibGVfdmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udmFyaWFibGVoaXN0b3J5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1ZhcmlhYmxlSGlzdG9yeSd9LAorICAgICAgICAgICAgJ2ZpbGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsaW5lX251bWJlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ29wZXJhdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc2NCd9KSwKKyAgICAgICAgICAgICd2YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid2aGlzdG9yeSciLCAndG8nOiB1Im9ybVsnb3JtLlZhcmlhYmxlJ10ifSkKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbXBsZXRlX2FwcHMgPSBbJ29ybSddClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDIyX2F1dG9fX2FkZF9maWVsZF90YXJnZXRfdGFza19fYWRkX2ZpZWxkX2xheWVyX3ZlcnNpb25fbG9jYWxfcGF0aF9fZGVsX2YucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMjJfYXV0b19fYWRkX2ZpZWxkX3RhcmdldF90YXNrX19hZGRfZmllbGRfbGF5ZXJfdmVyc2lvbl9sb2NhbF9wYXRoX19kZWxfZi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGVjMzkxCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDIyX2F1dG9fX2FkZF9maWVsZF90YXJnZXRfdGFza19fYWRkX2ZpZWxkX2xheWVyX3ZlcnNpb25fbG9jYWxfcGF0aF9fZGVsX2YucHkKQEAgLTAsMCArMSwzNDMgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCitmcm9tIHNvdXRoLnV0aWxzIGltcG9ydCBkYXRldGltZV91dGlscyBhcyBkYXRldGltZQorZnJvbSBzb3V0aC5kYiBpbXBvcnQgZGIKK2Zyb20gc291dGgudjIgaW1wb3J0IFNjaGVtYU1pZ3JhdGlvbgorZnJvbSBkamFuZ28uZGIgaW1wb3J0IG1vZGVscworCisKK2NsYXNzIE1pZ3JhdGlvbihTY2hlbWFNaWdyYXRpb24pOgorCisgICAgZGVmIGZvcndhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgQWRkaW5nIGZpZWxkICdUYXJnZXQudGFzaycKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J29ybV90YXJnZXQnLCAndGFzaycsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0xMDAsIG51bGw9VHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisKKworCisKKyAgICBkZWYgYmFja3dhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ1RhcmdldC50YXNrJworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnb3JtX3RhcmdldCcsICd0YXNrJykKKworCisgICAgbW9kZWxzID0geworICAgICAgICB1J29ybS5iaXRiYWtldmVyc2lvbic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCaXRiYWtlVmVyc2lvbid9LAorICAgICAgICAgICAgJ2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICczMid9KSwKKyAgICAgICAgICAgICdkaXJwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICdnaXR1cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J3VuaXF1ZSc6ICdUcnVlJywgJ21heF9sZW5ndGgnOiAnMzInfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0uYnJhbmNoJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAnbmFtZScpLCAoJ2xheWVyX3NvdXJjZScsICd1cF9pZCcpKSIsICdvYmplY3RfbmFtZSc6ICdCcmFuY2gnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnc2hvcnRfZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9kYXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5idWlsZCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZCd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdidWlsZF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdjb21wbGV0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2Nvb2tlcl9sb2dfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnfSksCisgICAgICAgICAgICAnZGlzdHJvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm9fdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZXJyb3JzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21hY2hpbmUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMid9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pLAorICAgICAgICAgICAgJ3N0YXJ0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ3RpbWVzcGVudCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3dhcm5pbmdzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0uYnVpbGRhcnRpZmFjdCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZEFydGlmYWN0J30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2ZpbGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2ZpbGVfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0uaGVscHRleHQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnSGVscFRleHQnfSwKKyAgICAgICAgICAgICdhcmVhJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2hlbHB0ZXh0X2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAna2V5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd0ZXh0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVyJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSwgKCdsYXllcl9zb3VyY2UnLCAnbmFtZScpKSIsICdvYmplY3RfbmFtZSc6ICdMYXllcid9LAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9pbmRleF91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3N1bW1hcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfZGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmNzX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyMDAnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Zjc193ZWJfZmlsZV9iYXNlX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyMDAnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Zjc193ZWJfdHJlZV9iYXNlX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyMDAnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Zjc193ZWJfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzIwMCcsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXJfdmVyc2lvbic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJyksKSIsICdvYmplY3RfbmFtZSc6ICdMYXllcl9WZXJzaW9uJ30sCisgICAgICAgICAgICAnYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJ30pLAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAncmVsYXRlZF9uYW1lJzogIidsYXllcl92ZXJzaW9uX2J1aWxkJyIsICdudWxsJzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdkaXJwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyNTUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidsYXllcl92ZXJzaW9uX2xheWVyJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXInXSJ9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbG9jYWxfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAiJy8nIiwgJ21heF9sZW5ndGgnOiAnMTAyNCd9KSwKKyAgICAgICAgICAgICdwcmlvcml0eSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9icmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uQnJhbmNoJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVyc291cmNlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdzb3VyY2V0eXBlJywgJ2FwaXVybCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnTGF5ZXJTb3VyY2UnfSwKKyAgICAgICAgICAgICdhcGl1cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzI1NScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J3VuaXF1ZSc6ICdUcnVlJywgJ21heF9sZW5ndGgnOiAnNjMnfSksCisgICAgICAgICAgICAnc291cmNldHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcnZlcnNpb25kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSwpIiwgJ29iamVjdF9uYW1lJzogJ0xheWVyVmVyc2lvbkRlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2RlcGVuZGVlcyciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInZGVwZW5kZW5jaWVzJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxvZ21lc3NhZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnTG9nTWVzc2FnZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGV2ZWwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsaW5lbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtZXNzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI0MCd9KSwKKyAgICAgICAgICAgICdwYXRobmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhc2snXSIsICdudWxsJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5tYWNoaW5lJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSwpIiwgJ29iamVjdF9uYW1lJzogJ01hY2hpbmUnfSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW5zdGFsbGVkX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAiJyciLCAnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnaW5zdGFsbGVkX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JldmlzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzMyJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncGFja2FnZV9kZXBlbmRlbmNpZXNfdGFyZ2V0JyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3BhY2thZ2VfZGVwZW5kZW5jaWVzX3NvdXJjZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSIsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRmlsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkZmlsZWxpc3RfcGFja2FnZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICdwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3QnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdCd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJpdGJha2VWZXJzaW9uJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2NyZWF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vd19hZGQnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdyZWxlYXNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVsZWFzZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzaG9ydF9kZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwZGF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vdyc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXNlcl9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3RsYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgncHJvamVjdCcsICdsYXllcmNvbW1pdCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnUHJvamVjdExheWVyJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvcHRpb25hbCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdHRhcmdldCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0VGFyZ2V0J30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdHZhcmlhYmxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Byb2plY3RWYXJpYWJsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pLAorICAgICAgICAgICAgJ3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlY2lwZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfdmVyc2lvbicsICdmaWxlX3BhdGgnLCAncGF0aGZsYWdzJyksKSIsICdvYmplY3RfbmFtZSc6ICdSZWNpcGUnfSwKKyAgICAgICAgICAgICdidWd0cmFja2VyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZmlsZV9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAnaG9tZXBhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncmVjaXBlX2xheWVyX3ZlcnNpb24nIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnbGljZW5zZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhdGhmbGFncyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzZWN0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3N1bW1hcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfZGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWNpcGVfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWNpcGVfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncl9kZXBlbmRlbmNpZXNfZGVwZW5kcyciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncl9kZXBlbmRlbmNpZXNfcmVjaXBlJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVsZWFzZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWxlYXNlJ30sCisgICAgICAgICAgICAnYml0YmFrZV92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQml0YmFrZVZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICdicmFuY2hfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICInJyIsICdtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICdoZWxwdGV4dCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeyd1bmlxdWUnOiAnVHJ1ZScsICdtYXhfbGVuZ3RoJzogJzMyJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlbGVhc2VkZWZhdWx0bGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVsZWFzZURlZmF1bHRMYXllcid9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogIicnIiwgJ21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlbGVhc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5SZWxlYXNlJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVsZWFzZWxheWVyc291cmNlcHJpb3JpdHknOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ3JlbGVhc2UnLCAnbGF5ZXJfc291cmNlJyksKSIsICdvYmplY3RfbmFtZSc6ICdSZWxlYXNlTGF5ZXJTb3VyY2VQcmlvcml0eSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIn0pLAorICAgICAgICAgICAgJ3ByaW9yaXR5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAncmVsZWFzZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlJlbGVhc2UnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0J30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpbWFnZV9zaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnaXNfaW1hZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAnbGljZW5zZV9tYW5pZmVzdF9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwMCcsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0ZpbGUnfSwKKyAgICAgICAgICAgICdkaXJlY3RvcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInZGlyZWN0b3J5X3NldCciLCAnbnVsbCc6ICdUcnVlJywgJ3RvJzogdSJvcm1bJ29ybS5UYXJnZXRfRmlsZSddIn0pLAorICAgICAgICAgICAgJ2dyb3VwJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyOCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW5vZGV0eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ293bmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyOCd9KSwKKyAgICAgICAgICAgICdwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncGVybWlzc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxNid9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ3N5bV90YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInc3ltbGlua19zZXQnIiwgJ251bGwnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uVGFyZ2V0X0ZpbGUnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXRfaW1hZ2VfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfSW1hZ2VfRmlsZSd9LAorICAgICAgICAgICAgJ2ZpbGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgJ2ZpbGVfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2luc3RhbGxlZF9wYWNrYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9JbnN0YWxsZWRfUGFja2FnZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkdGFyZ2V0bGlzdF9wYWNrYWdlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhc2snOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb3JkZXJpbmcnOiAiKCdvcmRlcicsICdyZWNpcGUnKSIsICd1bmlxdWVfdG9nZXRoZXInOiAiKCgnYnVpbGQnLCAncmVjaXBlJywgJ3Rhc2tfbmFtZScpLCkiLCAnb2JqZWN0X25hbWUnOiAnVGFzayd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NwdV91c2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGVjaW1hbEZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJywgJ21heF9kaWdpdHMnOiAnOCcsICdkZWNpbWFsX3BsYWNlcyc6ICcyJ30pLAorICAgICAgICAgICAgJ2Rpc2tfaW8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdlbGFwc2VkX3RpbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRlY2ltYWxGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZScsICdtYXhfZGlnaXRzJzogJzgnLCAnZGVjaW1hbF9wbGFjZXMnOiAnMid9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGluZV9udW1iZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsb2dmaWxlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtZXNzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI0MCd9KSwKKyAgICAgICAgICAgICdvcmRlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnLTEnfSksCisgICAgICAgICAgICAncGF0aF90b19zc3RhdGVfb2JqJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza3MnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KSwKKyAgICAgICAgICAgICdzY3JpcHRfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3NvdXJjZV91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NzdGF0ZV9jaGVja3N1bSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzc3RhdGVfcmVzdWx0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAndGFza19leGVjdXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICd0YXNrX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3dvcmtfZGlyZWN0b3J5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXNrX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFza19EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2RlcGVuZGVuY2llc19kZXBlbmRzJyIsICd0byc6IHUib3JtWydvcm0uVGFzayddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfZGVwZW5kZW5jaWVzX3Rhc2snIiwgJ3RvJzogdSJvcm1bJ29ybS5UYXNrJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udG9hc3RlcnNldHRpbmcnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVG9hc3RlclNldHRpbmcnfSwKKyAgICAgICAgICAgICdoZWxwdGV4dCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc2Myd9KSwKKyAgICAgICAgICAgICd2YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udmFyaWFibGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVmFyaWFibGUnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid2YXJpYWJsZV9idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY2hhbmdlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdodW1hbl9yZWFkYWJsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndmFyaWFibGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndmFyaWFibGVfdmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udmFyaWFibGVoaXN0b3J5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1ZhcmlhYmxlSGlzdG9yeSd9LAorICAgICAgICAgICAgJ2ZpbGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsaW5lX251bWJlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ29wZXJhdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc2NCd9KSwKKyAgICAgICAgICAgICd2YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid2aGlzdG9yeSciLCAndG8nOiB1Im9ybVsnb3JtLlZhcmlhYmxlJ10ifSkKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbXBsZXRlX2FwcHMgPSBbJ29ybSddCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMjNfYXV0b19fZGVsX2ZpZWxkX2J1aWxkX3dhcm5pbmdzX25vX19kZWxfZmllbGRfYnVpbGRfZXJyb3JzX25vX19kZWxfZmllbC5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAyM19hdXRvX19kZWxfZmllbGRfYnVpbGRfd2FybmluZ3Nfbm9fX2RlbF9maWVsZF9idWlsZF9lcnJvcnNfbm9fX2RlbF9maWVsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YjIwMGMKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMjNfYXV0b19fZGVsX2ZpZWxkX2J1aWxkX3dhcm5pbmdzX25vX19kZWxfZmllbGRfYnVpbGRfZXJyb3JzX25vX19kZWxfZmllbC5weQpAQCAtMCwwICsxLDM1MyBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KK2Zyb20gc291dGgudXRpbHMgaW1wb3J0IGRhdGV0aW1lX3V0aWxzIGFzIGRhdGV0aW1lCitmcm9tIHNvdXRoLmRiIGltcG9ydCBkYgorZnJvbSBzb3V0aC52MiBpbXBvcnQgU2NoZW1hTWlncmF0aW9uCitmcm9tIGRqYW5nby5kYiBpbXBvcnQgbW9kZWxzCisKKworY2xhc3MgTWlncmF0aW9uKFNjaGVtYU1pZ3JhdGlvbik6CisKKyAgICBkZWYgZm9yd2FyZHMoc2VsZiwgb3JtKToKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnQnVpbGQud2FybmluZ3Nfbm8nCisgICAgICAgIGRiLmRlbGV0ZV9jb2x1bW4odSdvcm1fYnVpbGQnLCAnd2FybmluZ3Nfbm8nKQorCisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ0J1aWxkLmVycm9yc19ubycKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV9idWlsZCcsICdlcnJvcnNfbm8nKQorCisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ0J1aWxkLnRpbWVzcGVudCcKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV9idWlsZCcsICd0aW1lc3BlbnQnKQorCisKKyAgICBkZWYgYmFja3dhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgQWRkaW5nIGZpZWxkICdCdWlsZC53YXJuaW5nc19ubycKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J29ybV9idWlsZCcsICd3YXJuaW5nc19ubycsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJykoZGVmYXVsdD0wKSwKKyAgICAgICAgICAgICAgICAgICAgICBrZWVwX2RlZmF1bHQ9RmFsc2UpCisKKyAgICAgICAgIyBBZGRpbmcgZmllbGQgJ0J1aWxkLmVycm9yc19ubycKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J29ybV9idWlsZCcsICdlcnJvcnNfbm8nLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcpKGRlZmF1bHQ9MCksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisgICAgICAgICMgQWRkaW5nIGZpZWxkICdCdWlsZC50aW1lc3BlbnQnCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fYnVpbGQnLCAndGltZXNwZW50JywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnKShkZWZhdWx0PTApLAorICAgICAgICAgICAgICAgICAgICAgIGtlZXBfZGVmYXVsdD1GYWxzZSkKKworCisgICAgbW9kZWxzID0geworICAgICAgICB1J29ybS5iaXRiYWtldmVyc2lvbic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCaXRiYWtlVmVyc2lvbid9LAorICAgICAgICAgICAgJ2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICczMid9KSwKKyAgICAgICAgICAgICdkaXJwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICdnaXR1cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J3VuaXF1ZSc6ICdUcnVlJywgJ21heF9sZW5ndGgnOiAnMzInfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0uYnJhbmNoJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAnbmFtZScpLCAoJ2xheWVyX3NvdXJjZScsICd1cF9pZCcpKSIsICdvYmplY3RfbmFtZSc6ICdCcmFuY2gnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnc2hvcnRfZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9kYXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5idWlsZCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZCd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdidWlsZF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdjb21wbGV0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2Nvb2tlcl9sb2dfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnfSksCisgICAgICAgICAgICAnZGlzdHJvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm9fdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21hY2hpbmUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMid9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pLAorICAgICAgICAgICAgJ3N0YXJ0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmJ1aWxkYXJ0aWZhY3QnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQnVpbGRBcnRpZmFjdCd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdmaWxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdmaWxlX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmhlbHB0ZXh0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0hlbHBUZXh0J30sCisgICAgICAgICAgICAnYXJlYSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidoZWxwdGV4dF9idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2tleSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndGV4dCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJyksICgnbGF5ZXJfc291cmNlJywgJ25hbWUnKSkiLCAnb2JqZWN0X25hbWUnOiAnTGF5ZXInfSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfaW5kZXhfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Zjc191cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjAwJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2Y3Nfd2ViX2ZpbGVfYmFzZV91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjAwJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2Y3Nfd2ViX3RyZWVfYmFzZV91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjAwJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2Y3Nfd2ViX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyMDAnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVyX3ZlcnNpb24nOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3NvdXJjZScsICd1cF9pZCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnTGF5ZXJfVmVyc2lvbid9LAorICAgICAgICAgICAgJ2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCd9KSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3JlbGF0ZWRfbmFtZSc6ICInbGF5ZXJfdmVyc2lvbl9idWlsZCciLCAnbnVsbCc6ICdUcnVlJywgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NvbW1pdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZGlycGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjU1JywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInbGF5ZXJfdmVyc2lvbl9sYXllciciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyJ10ifSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xvY2FsX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydkZWZhdWx0JzogIicvJyIsICdtYXhfbGVuZ3RoJzogJzEwMjQnfSksCisgICAgICAgICAgICAncHJpb3JpdHknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkJyYW5jaCddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9kYXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcnNvdXJjZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnc291cmNldHlwZScsICdhcGl1cmwnKSwpIiwgJ29iamVjdF9uYW1lJzogJ0xheWVyU291cmNlJ30sCisgICAgICAgICAgICAnYXBpdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyNTUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeyd1bmlxdWUnOiAnVHJ1ZScsICdtYXhfbGVuZ3RoJzogJzYzJ30pLAorICAgICAgICAgICAgJ3NvdXJjZXR5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXJ2ZXJzaW9uZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJyksKSIsICdvYmplY3RfbmFtZSc6ICdMYXllclZlcnNpb25EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidkZXBlbmRlZXMnIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2RlcGVuZGVuY2llcyciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sb2dtZXNzYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0xvZ01lc3NhZ2UnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xldmVsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbGluZW5vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWVzc2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNDAnfSksCisgICAgICAgICAgICAncGF0aG5hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXNrJ10iLCAnbnVsbCc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubWFjaGluZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJyksKSIsICdvYmplY3RfbmFtZSc6ICdNYWNoaW5lJ30sCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICd1cF9kYXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2UnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2luc3RhbGxlZF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogIicnIiwgJ21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2luc3RhbGxlZF9zaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbGljZW5zZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlY2lwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZXZpc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICczMicsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NlY3Rpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnODAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnc3VtbWFyeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2VfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3BhY2thZ2VfZGVwZW5kZW5jaWVzX3RhcmdldCciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidwYWNrYWdlX2RlcGVuZGVuY2llc19zb3VyY2UnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10iLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2VfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlX0ZpbGUnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIididWlsZGZpbGVsaXN0X3BhY2thZ2UnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICAncGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Byb2plY3QnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CaXRiYWtlVmVyc2lvbiddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdjcmVhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3dfYWRkJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVsZWFzZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlJlbGVhc2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2hvcnRfZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cGRhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3cnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VzZXJfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0bGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ3Byb2plY3QnLCAnbGF5ZXJjb21taXQnKSwpIiwgJ29iamVjdF9uYW1lJzogJ1Byb2plY3RMYXllcid9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcmNvbW1pdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnb3B0aW9uYWwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3R0YXJnZXQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdFRhcmdldCd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3R2YXJpYWJsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0VmFyaWFibGUnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSJ9KSwKKyAgICAgICAgICAgICd2YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWNpcGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3ZlcnNpb24nLCAnZmlsZV9wYXRoJywgJ3BhdGhmbGFncycpLCkiLCAnb2JqZWN0X25hbWUnOiAnUmVjaXBlJ30sCisgICAgICAgICAgICAnYnVndHJhY2tlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2ZpbGVfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ2hvbWVwYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JlY2lwZV9sYXllcl92ZXJzaW9uJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ2xpY2Vuc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYXRoZmxhZ3MnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVjaXBlX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVjaXBlX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX2RlcGVuZHMnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX3JlY2lwZSciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlbGVhc2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVsZWFzZSd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJpdGJha2VWZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnYnJhbmNoX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAiJyciLCAnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAnaGVscHRleHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsndW5pcXVlJzogJ1RydWUnLCAnbWF4X2xlbmd0aCc6ICczMid9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWxlYXNlZGVmYXVsdGxheWVyJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlbGVhc2VEZWZhdWx0TGF5ZXInfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICInJyIsICdtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdyZWxlYXNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVsZWFzZSddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlbGVhc2VsYXllcnNvdXJjZXByaW9yaXR5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdyZWxlYXNlJywgJ2xheWVyX3NvdXJjZScpLCkiLCAnb2JqZWN0X25hbWUnOiAnUmVsZWFzZUxheWVyU291cmNlUHJpb3JpdHknfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSJ9KSwKKyAgICAgICAgICAgICdwcmlvcml0eSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3JlbGVhc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5SZWxlYXNlJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldCd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW1hZ2Vfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2lzX2ltYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ2xpY2Vuc2VfbWFuaWZlc3RfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9GaWxlJ30sCisgICAgICAgICAgICAnZGlyZWN0b3J5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2RpcmVjdG9yeV9zZXQnIiwgJ251bGwnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uVGFyZ2V0X0ZpbGUnXSJ9KSwKKyAgICAgICAgICAgICdncm91cCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMjgnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2lub2RldHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdvd25lcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMjgnfSksCisgICAgICAgICAgICAncGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Blcm1pc3Npb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTYnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdzeW1fdGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3N5bWxpbmtfc2V0JyIsICdudWxsJzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLlRhcmdldF9GaWxlJ10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2ltYWdlX2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0ltYWdlX0ZpbGUnfSwKKyAgICAgICAgICAgICdmaWxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgICdmaWxlX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9pbnN0YWxsZWRfcGFja2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfSW5zdGFsbGVkX1BhY2thZ2UnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIididWlsZHRhcmdldGxpc3RfcGFja2FnZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXNrJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29yZGVyaW5nJzogIignb3JkZXInLCAncmVjaXBlJykiLCAndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2J1aWxkJywgJ3JlY2lwZScsICd0YXNrX25hbWUnKSwpIiwgJ29iamVjdF9uYW1lJzogJ1Rhc2snfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjcHVfdXNhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRlY2ltYWxGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZScsICdtYXhfZGlnaXRzJzogJzgnLCAnZGVjaW1hbF9wbGFjZXMnOiAnMid9KSwKKyAgICAgICAgICAgICdkaXNrX2lvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZWxhcHNlZF90aW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EZWNpbWFsRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnLCAnbWF4X2RpZ2l0cyc6ICc4JywgJ2RlY2ltYWxfcGxhY2VzJzogJzInfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xpbmVfbnVtYmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbG9nZmlsZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWVzc2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNDAnfSksCisgICAgICAgICAgICAnb3JkZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJy0xJ30pLAorICAgICAgICAgICAgJ3BhdGhfdG9fc3N0YXRlX29iaic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tzJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSksCisgICAgICAgICAgICAnc2NyaXB0X3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzb3VyY2VfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzc3RhdGVfY2hlY2tzdW0nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3N0YXRlX3Jlc3VsdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3Rhc2tfZXhlY3V0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAndGFza19uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd3b3JrX2RpcmVjdG9yeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFza19kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Rhc2tfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19kZXBlbmRlbmNpZXNfZGVwZW5kcyciLCAndG8nOiB1Im9ybVsnb3JtLlRhc2snXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2RlcGVuZGVuY2llc190YXNrJyIsICd0byc6IHUib3JtWydvcm0uVGFzayddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRvYXN0ZXJzZXR0aW5nJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RvYXN0ZXJTZXR0aW5nJ30sCisgICAgICAgICAgICAnaGVscHRleHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNjMnfSksCisgICAgICAgICAgICAndmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnZhcmlhYmxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1ZhcmlhYmxlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndmFyaWFibGVfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NoYW5nZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnaHVtYW5fcmVhZGFibGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlX3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnZhcmlhYmxlaGlzdG9yeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdWYXJpYWJsZUhpc3RvcnknfSwKKyAgICAgICAgICAgICdmaWxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGluZV9udW1iZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvcGVyYXRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNjQnfSksCisgICAgICAgICAgICAndmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmFyaWFibGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndmhpc3RvcnknIiwgJ3RvJzogdSJvcm1bJ29ybS5WYXJpYWJsZSddIn0pCisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb21wbGV0ZV9hcHBzID0gWydvcm0nXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAyNF9hdXRvX19hZGRfZmllbGRfcmVjaXBlX2lzX2ltYWdlLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDI0X2F1dG9fX2FkZF9maWVsZF9yZWNpcGVfaXNfaW1hZ2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhmNjBhOQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAyNF9hdXRvX19hZGRfZmllbGRfcmVjaXBlX2lzX2ltYWdlLnB5CkBAIC0wLDAgKzEsMzM4IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorZnJvbSBzb3V0aC51dGlscyBpbXBvcnQgZGF0ZXRpbWVfdXRpbHMgYXMgZGF0ZXRpbWUKK2Zyb20gc291dGguZGIgaW1wb3J0IGRiCitmcm9tIHNvdXRoLnYyIGltcG9ydCBTY2hlbWFNaWdyYXRpb24KK2Zyb20gZGphbmdvLmRiIGltcG9ydCBtb2RlbHMKKworCitjbGFzcyBNaWdyYXRpb24oU2NoZW1hTWlncmF0aW9uKToKKworICAgIGRlZiBmb3J3YXJkcyhzZWxmLCBvcm0pOgorICAgICAgICAjIEFkZGluZyBmaWVsZCAnUmVjaXBlLmlzX2ltYWdlJworICAgICAgICBkYi5hZGRfY29sdW1uKHUnb3JtX3JlY2lwZScsICdpc19pbWFnZScsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJykoZGVmYXVsdD1GYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisKKyAgICBkZWYgYmFja3dhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ1JlY2lwZS5pc19pbWFnZScKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV9yZWNpcGUnLCAnaXNfaW1hZ2UnKQorCisKKyAgICBtb2RlbHMgPSB7CisgICAgICAgIHUnb3JtLmJpdGJha2V2ZXJzaW9uJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0JpdGJha2VWZXJzaW9uJ30sCisgICAgICAgICAgICAnYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzMyJ30pLAorICAgICAgICAgICAgJ2RpcnBhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ2dpdHVybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsndW5pcXVlJzogJ1RydWUnLCAnbWF4X2xlbmd0aCc6ICczMid9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5icmFuY2gnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3NvdXJjZScsICduYW1lJyksICgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJykpIiwgJ29iamVjdF9uYW1lJzogJ0JyYW5jaCd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdzaG9ydF9kZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmJ1aWxkJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0J1aWxkJ30sCisgICAgICAgICAgICAnYml0YmFrZV92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ2J1aWxkX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2NvbXBsZXRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnY29va2VyX2xvZ19wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Ryb192ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWFjaGluZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnb3V0Y29tZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcyJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSksCisgICAgICAgICAgICAnc3RhcnRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0uYnVpbGRhcnRpZmFjdCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZEFydGlmYWN0J30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2ZpbGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2ZpbGVfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0uaGVscHRleHQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnSGVscFRleHQnfSwKKyAgICAgICAgICAgICdhcmVhJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2hlbHB0ZXh0X2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAna2V5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd0ZXh0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVyJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSwgKCdsYXllcl9zb3VyY2UnLCAnbmFtZScpKSIsICdvYmplY3RfbmFtZSc6ICdMYXllcid9LAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9pbmRleF91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3N1bW1hcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfZGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmNzX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyMDAnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Zjc193ZWJfZmlsZV9iYXNlX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyMDAnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Zjc193ZWJfdHJlZV9iYXNlX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyMDAnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Zjc193ZWJfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzIwMCcsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXJfdmVyc2lvbic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJyksKSIsICdvYmplY3RfbmFtZSc6ICdMYXllcl9WZXJzaW9uJ30sCisgICAgICAgICAgICAnYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJ30pLAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAncmVsYXRlZF9uYW1lJzogIidsYXllcl92ZXJzaW9uX2J1aWxkJyIsICdudWxsJzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdkaXJwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyNTUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidsYXllcl92ZXJzaW9uX2xheWVyJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXInXSJ9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbG9jYWxfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAiJy8nIiwgJ21heF9sZW5ndGgnOiAnMTAyNCd9KSwKKyAgICAgICAgICAgICdwcmlvcml0eSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9icmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uQnJhbmNoJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVyc291cmNlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdzb3VyY2V0eXBlJywgJ2FwaXVybCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnTGF5ZXJTb3VyY2UnfSwKKyAgICAgICAgICAgICdhcGl1cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzI1NScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J3VuaXF1ZSc6ICdUcnVlJywgJ21heF9sZW5ndGgnOiAnNjMnfSksCisgICAgICAgICAgICAnc291cmNldHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcnZlcnNpb25kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSwpIiwgJ29iamVjdF9uYW1lJzogJ0xheWVyVmVyc2lvbkRlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2RlcGVuZGVlcyciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInZGVwZW5kZW5jaWVzJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxvZ21lc3NhZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnTG9nTWVzc2FnZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGV2ZWwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsaW5lbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtZXNzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI0MCd9KSwKKyAgICAgICAgICAgICdwYXRobmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhc2snXSIsICdudWxsJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5tYWNoaW5lJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSwpIiwgJ29iamVjdF9uYW1lJzogJ01hY2hpbmUnfSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW5zdGFsbGVkX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAiJyciLCAnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnaW5zdGFsbGVkX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JldmlzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzMyJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncGFja2FnZV9kZXBlbmRlbmNpZXNfdGFyZ2V0JyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3BhY2thZ2VfZGVwZW5kZW5jaWVzX3NvdXJjZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSIsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRmlsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkZmlsZWxpc3RfcGFja2FnZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICdwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3QnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdCd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJpdGJha2VWZXJzaW9uJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2NyZWF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vd19hZGQnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdyZWxlYXNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVsZWFzZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzaG9ydF9kZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwZGF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vdyc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXNlcl9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3RsYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgncHJvamVjdCcsICdsYXllcmNvbW1pdCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnUHJvamVjdExheWVyJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvcHRpb25hbCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdHRhcmdldCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0VGFyZ2V0J30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdHZhcmlhYmxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Byb2plY3RWYXJpYWJsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pLAorICAgICAgICAgICAgJ3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlY2lwZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfdmVyc2lvbicsICdmaWxlX3BhdGgnLCAncGF0aGZsYWdzJyksKSIsICdvYmplY3RfbmFtZSc6ICdSZWNpcGUnfSwKKyAgICAgICAgICAgICdidWd0cmFja2VyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZmlsZV9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAnaG9tZXBhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaXNfaW1hZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncmVjaXBlX2xheWVyX3ZlcnNpb24nIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnbGljZW5zZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhdGhmbGFncyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzZWN0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3N1bW1hcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfZGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWNpcGVfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWNpcGVfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncl9kZXBlbmRlbmNpZXNfZGVwZW5kcyciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncl9kZXBlbmRlbmNpZXNfcmVjaXBlJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVsZWFzZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWxlYXNlJ30sCisgICAgICAgICAgICAnYml0YmFrZV92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQml0YmFrZVZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICdicmFuY2hfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICInJyIsICdtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICdoZWxwdGV4dCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeyd1bmlxdWUnOiAnVHJ1ZScsICdtYXhfbGVuZ3RoJzogJzMyJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlbGVhc2VkZWZhdWx0bGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVsZWFzZURlZmF1bHRMYXllcid9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogIicnIiwgJ21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlbGVhc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5SZWxlYXNlJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVsZWFzZWxheWVyc291cmNlcHJpb3JpdHknOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ3JlbGVhc2UnLCAnbGF5ZXJfc291cmNlJyksKSIsICdvYmplY3RfbmFtZSc6ICdSZWxlYXNlTGF5ZXJTb3VyY2VQcmlvcml0eSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIn0pLAorICAgICAgICAgICAgJ3ByaW9yaXR5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAncmVsZWFzZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlJlbGVhc2UnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0J30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpbWFnZV9zaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnaXNfaW1hZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAnbGljZW5zZV9tYW5pZmVzdF9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwMCcsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0ZpbGUnfSwKKyAgICAgICAgICAgICdkaXJlY3RvcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInZGlyZWN0b3J5X3NldCciLCAnbnVsbCc6ICdUcnVlJywgJ3RvJzogdSJvcm1bJ29ybS5UYXJnZXRfRmlsZSddIn0pLAorICAgICAgICAgICAgJ2dyb3VwJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyOCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW5vZGV0eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ293bmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyOCd9KSwKKyAgICAgICAgICAgICdwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncGVybWlzc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxNid9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ3N5bV90YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInc3ltbGlua19zZXQnIiwgJ251bGwnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uVGFyZ2V0X0ZpbGUnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXRfaW1hZ2VfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfSW1hZ2VfRmlsZSd9LAorICAgICAgICAgICAgJ2ZpbGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgJ2ZpbGVfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2luc3RhbGxlZF9wYWNrYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9JbnN0YWxsZWRfUGFja2FnZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkdGFyZ2V0bGlzdF9wYWNrYWdlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhc2snOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb3JkZXJpbmcnOiAiKCdvcmRlcicsICdyZWNpcGUnKSIsICd1bmlxdWVfdG9nZXRoZXInOiAiKCgnYnVpbGQnLCAncmVjaXBlJywgJ3Rhc2tfbmFtZScpLCkiLCAnb2JqZWN0X25hbWUnOiAnVGFzayd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NwdV91c2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGVjaW1hbEZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJywgJ21heF9kaWdpdHMnOiAnOCcsICdkZWNpbWFsX3BsYWNlcyc6ICcyJ30pLAorICAgICAgICAgICAgJ2Rpc2tfaW8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdlbGFwc2VkX3RpbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRlY2ltYWxGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZScsICdtYXhfZGlnaXRzJzogJzgnLCAnZGVjaW1hbF9wbGFjZXMnOiAnMid9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGluZV9udW1iZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsb2dmaWxlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtZXNzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI0MCd9KSwKKyAgICAgICAgICAgICdvcmRlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnLTEnfSksCisgICAgICAgICAgICAncGF0aF90b19zc3RhdGVfb2JqJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza3MnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KSwKKyAgICAgICAgICAgICdzY3JpcHRfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3NvdXJjZV91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NzdGF0ZV9jaGVja3N1bSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzc3RhdGVfcmVzdWx0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAndGFza19leGVjdXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICd0YXNrX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3dvcmtfZGlyZWN0b3J5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXNrX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFza19EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2RlcGVuZGVuY2llc19kZXBlbmRzJyIsICd0byc6IHUib3JtWydvcm0uVGFzayddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfZGVwZW5kZW5jaWVzX3Rhc2snIiwgJ3RvJzogdSJvcm1bJ29ybS5UYXNrJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udG9hc3RlcnNldHRpbmcnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVG9hc3RlclNldHRpbmcnfSwKKyAgICAgICAgICAgICdoZWxwdGV4dCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc2Myd9KSwKKyAgICAgICAgICAgICd2YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udmFyaWFibGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVmFyaWFibGUnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid2YXJpYWJsZV9idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY2hhbmdlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdodW1hbl9yZWFkYWJsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndmFyaWFibGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndmFyaWFibGVfdmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udmFyaWFibGVoaXN0b3J5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1ZhcmlhYmxlSGlzdG9yeSd9LAorICAgICAgICAgICAgJ2ZpbGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsaW5lX251bWJlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ29wZXJhdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc2NCd9KSwKKyAgICAgICAgICAgICd2YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid2aGlzdG9yeSciLCAndG8nOiB1Im9ybVsnb3JtLlZhcmlhYmxlJ10ifSkKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbXBsZXRlX2FwcHMgPSBbJ29ybSddClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDI1X2F1dG9fX2FkZF9maWVsZF9wcm9qZWN0X2lzX2RlZmF1bHQucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMjVfYXV0b19fYWRkX2ZpZWxkX3Byb2plY3RfaXNfZGVmYXVsdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzY5OTBkCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDI1X2F1dG9fX2FkZF9maWVsZF9wcm9qZWN0X2lzX2RlZmF1bHQucHkKQEAgLTAsMCArMSwzNDYgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCitmcm9tIHNvdXRoLnV0aWxzIGltcG9ydCBkYXRldGltZV91dGlscyBhcyBkYXRldGltZQorZnJvbSBzb3V0aC5kYiBpbXBvcnQgZGIKK2Zyb20gc291dGgudjIgaW1wb3J0IFNjaGVtYU1pZ3JhdGlvbgorZnJvbSBkamFuZ28uZGIgaW1wb3J0IG1vZGVscworCisKK2NsYXNzIE1pZ3JhdGlvbihTY2hlbWFNaWdyYXRpb24pOgorCisgICAgZGVmIGZvcndhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgd29yay1hcm91bmQgZm9yIGh0dHA6Ly9zb3V0aC5hZXJhY29kZS5vcmcvdGlja2V0LzU3ODoKKyAgICAgICAgIyBTUUxpdGUgYm9vbGVhbiBmaWVsZHMgYXJlbid0IHNldCB0byB0aGUgY29ycmVjdCBkZWZhdWx0IHZhbHVlCisgICAgICAgICMgKG5lZWRzIHRvIGJlIDAgb3IgMSwgcmF0aGVyIHRoYW4gVHJ1ZSBvciBGYWxzZSkKKyAgICAgICAgZGVmYXVsdCA9IEZhbHNlCisgICAgICAgIGlmIGRiLmJhY2tlbmRfbmFtZSA9PSAnc3FsaXRlMyc6CisgICAgICAgICAgIGRlZmF1bHQgPSAwCisKKyAgICAgICAgIyBBZGRpbmcgZmllbGQgJ1Byb2plY3QuaXNfZGVmYXVsdCcKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J29ybV9wcm9qZWN0JywgJ2lzX2RlZmF1bHQnLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcpKGRlZmF1bHQ9ZGVmYXVsdCksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisKKyAgICBkZWYgYmFja3dhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ1Byb2plY3QuaXNfZGVmYXVsdCcKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV9wcm9qZWN0JywgJ2lzX2RlZmF1bHQnKQorCisKKyAgICBtb2RlbHMgPSB7CisgICAgICAgIHUnb3JtLmJpdGJha2V2ZXJzaW9uJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0JpdGJha2VWZXJzaW9uJ30sCisgICAgICAgICAgICAnYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzMyJ30pLAorICAgICAgICAgICAgJ2RpcnBhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ2dpdHVybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsndW5pcXVlJzogJ1RydWUnLCAnbWF4X2xlbmd0aCc6ICczMid9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5icmFuY2gnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3NvdXJjZScsICduYW1lJyksICgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJykpIiwgJ29iamVjdF9uYW1lJzogJ0JyYW5jaCd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdzaG9ydF9kZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmJ1aWxkJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0J1aWxkJ30sCisgICAgICAgICAgICAnYml0YmFrZV92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ2J1aWxkX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2NvbXBsZXRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnY29va2VyX2xvZ19wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Ryb192ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWFjaGluZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnb3V0Y29tZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcyJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSksCisgICAgICAgICAgICAnc3RhcnRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0uYnVpbGRhcnRpZmFjdCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZEFydGlmYWN0J30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2ZpbGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2ZpbGVfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0uaGVscHRleHQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnSGVscFRleHQnfSwKKyAgICAgICAgICAgICdhcmVhJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2hlbHB0ZXh0X2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAna2V5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd0ZXh0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVyJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSwgKCdsYXllcl9zb3VyY2UnLCAnbmFtZScpKSIsICdvYmplY3RfbmFtZSc6ICdMYXllcid9LAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9pbmRleF91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3N1bW1hcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfZGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmNzX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyMDAnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Zjc193ZWJfZmlsZV9iYXNlX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyMDAnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Zjc193ZWJfdHJlZV9iYXNlX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyMDAnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Zjc193ZWJfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzIwMCcsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXJfdmVyc2lvbic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJyksKSIsICdvYmplY3RfbmFtZSc6ICdMYXllcl9WZXJzaW9uJ30sCisgICAgICAgICAgICAnYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJ30pLAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAncmVsYXRlZF9uYW1lJzogIidsYXllcl92ZXJzaW9uX2J1aWxkJyIsICdudWxsJzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdkaXJwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyNTUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidsYXllcl92ZXJzaW9uX2xheWVyJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXInXSJ9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbG9jYWxfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAiJy8nIiwgJ21heF9sZW5ndGgnOiAnMTAyNCd9KSwKKyAgICAgICAgICAgICdwcmlvcml0eSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9icmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uQnJhbmNoJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVyc291cmNlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdzb3VyY2V0eXBlJywgJ2FwaXVybCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnTGF5ZXJTb3VyY2UnfSwKKyAgICAgICAgICAgICdhcGl1cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzI1NScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J3VuaXF1ZSc6ICdUcnVlJywgJ21heF9sZW5ndGgnOiAnNjMnfSksCisgICAgICAgICAgICAnc291cmNldHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcnZlcnNpb25kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSwpIiwgJ29iamVjdF9uYW1lJzogJ0xheWVyVmVyc2lvbkRlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2RlcGVuZGVlcyciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInZGVwZW5kZW5jaWVzJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxvZ21lc3NhZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnTG9nTWVzc2FnZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGV2ZWwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsaW5lbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtZXNzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI0MCd9KSwKKyAgICAgICAgICAgICdwYXRobmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhc2snXSIsICdudWxsJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5tYWNoaW5lJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSwpIiwgJ29iamVjdF9uYW1lJzogJ01hY2hpbmUnfSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW5zdGFsbGVkX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAiJyciLCAnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnaW5zdGFsbGVkX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JldmlzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzMyJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncGFja2FnZV9kZXBlbmRlbmNpZXNfdGFyZ2V0JyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3BhY2thZ2VfZGVwZW5kZW5jaWVzX3NvdXJjZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSIsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRmlsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkZmlsZWxpc3RfcGFja2FnZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICdwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3QnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdCd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJpdGJha2VWZXJzaW9uJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2NyZWF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vd19hZGQnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpc19kZWZhdWx0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlbGVhc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5SZWxlYXNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Nob3J0X2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBkYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93JzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1c2VyX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdGxheWVyJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdwcm9qZWN0JywgJ2xheWVyY29tbWl0JyksKSIsICdvYmplY3RfbmFtZSc6ICdQcm9qZWN0TGF5ZXInfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJjb21taXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ29wdGlvbmFsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ1RydWUnfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0dGFyZ2V0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Byb2plY3RUYXJnZXQnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0dmFyaWFibGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdFZhcmlhYmxlJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSksCisgICAgICAgICAgICAndmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVjaXBlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl92ZXJzaW9uJywgJ2ZpbGVfcGF0aCcsICdwYXRoZmxhZ3MnKSwpIiwgJ29iamVjdF9uYW1lJzogJ1JlY2lwZSd9LAorICAgICAgICAgICAgJ2J1Z3RyYWNrZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdmaWxlX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICdob21lcGFnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpc19pbWFnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyZWNpcGVfbGF5ZXJfdmVyc2lvbiciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAncGF0aGZsYWdzJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NlY3Rpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3VtbWFyeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9kYXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlY2lwZV9kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlY2lwZV9EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwX3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyX2RlcGVuZGVuY2llc19kZXBlbmRzJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JlY2lwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyX2RlcGVuZGVuY2llc19yZWNpcGUnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWxlYXNlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlbGVhc2UnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CaXRiYWtlVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ2JyYW5jaF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogIicnIiwgJ21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ2hlbHB0ZXh0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J3VuaXF1ZSc6ICdUcnVlJywgJ21heF9sZW5ndGgnOiAnMzInfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVsZWFzZWRlZmF1bHRsYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWxlYXNlRGVmYXVsdExheWVyJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAiJyciLCAnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVsZWFzZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlJlbGVhc2UnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWxlYXNlbGF5ZXJzb3VyY2Vwcmlvcml0eSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgncmVsZWFzZScsICdsYXllcl9zb3VyY2UnKSwpIiwgJ29iamVjdF9uYW1lJzogJ1JlbGVhc2VMYXllclNvdXJjZVByaW9yaXR5J30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10ifSksCisgICAgICAgICAgICAncHJpb3JpdHknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdyZWxlYXNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVsZWFzZSddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXQnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2ltYWdlX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdpc19pbWFnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICdsaWNlbnNlX21hbmlmZXN0X3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXRfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfRmlsZSd9LAorICAgICAgICAgICAgJ2RpcmVjdG9yeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidkaXJlY3Rvcnlfc2V0JyIsICdudWxsJzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLlRhcmdldF9GaWxlJ10ifSksCisgICAgICAgICAgICAnZ3JvdXAnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTI4J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpbm9kZXR5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnb3duZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTI4J30pLAorICAgICAgICAgICAgJ3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdwZXJtaXNzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzE2J30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnc3ltX3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidzeW1saW5rX3NldCciLCAnbnVsbCc6ICdUcnVlJywgJ3RvJzogdSJvcm1bJ29ybS5UYXJnZXRfRmlsZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9pbWFnZV9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9JbWFnZV9GaWxlJ30sCisgICAgICAgICAgICAnZmlsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICAnZmlsZV9zaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXRfaW5zdGFsbGVkX3BhY2thZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0luc3RhbGxlZF9QYWNrYWdlJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhY2thZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInYnVpbGR0YXJnZXRsaXN0X3BhY2thZ2UnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFzayc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvcmRlcmluZyc6ICIoJ29yZGVyJywgJ3JlY2lwZScpIiwgJ3VuaXF1ZV90b2dldGhlcic6ICIoKCdidWlsZCcsICdyZWNpcGUnLCAndGFza19uYW1lJyksKSIsICdvYmplY3RfbmFtZSc6ICdUYXNrJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY3B1X3VzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EZWNpbWFsRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnLCAnbWF4X2RpZ2l0cyc6ICc4JywgJ2RlY2ltYWxfcGxhY2VzJzogJzInfSksCisgICAgICAgICAgICAnZGlza19pbyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2VsYXBzZWRfdGltZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGVjaW1hbEZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJywgJ21heF9kaWdpdHMnOiAnOCcsICdkZWNpbWFsX3BsYWNlcyc6ICcyJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsaW5lX251bWJlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xvZ2ZpbGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21lc3NhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjQwJ30pLAorICAgICAgICAgICAgJ29yZGVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnb3V0Y29tZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICctMSd9KSwKKyAgICAgICAgICAgICdwYXRoX3RvX3NzdGF0ZV9vYmonOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JlY2lwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrcyciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pLAorICAgICAgICAgICAgJ3NjcmlwdF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnc291cmNlX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3N0YXRlX2NoZWNrc3VtJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NzdGF0ZV9yZXN1bHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd0YXNrX2V4ZWN1dGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ3Rhc2tfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnd29ya19kaXJlY3RvcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhc2tfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXNrX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfZGVwZW5kZW5jaWVzX2RlcGVuZHMnIiwgJ3RvJzogdSJvcm1bJ29ybS5UYXNrJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19kZXBlbmRlbmNpZXNfdGFzayciLCAndG8nOiB1Im9ybVsnb3JtLlRhc2snXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50b2FzdGVyc2V0dGluZyc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUb2FzdGVyU2V0dGluZyd9LAorICAgICAgICAgICAgJ2hlbHB0ZXh0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzYzJ30pLAorICAgICAgICAgICAgJ3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS52YXJpYWJsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdWYXJpYWJsZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3ZhcmlhYmxlX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjaGFuZ2VkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2h1bWFuX3JlYWRhYmxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZV92YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS52YXJpYWJsZWhpc3RvcnknOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVmFyaWFibGVIaXN0b3J5J30sCisgICAgICAgICAgICAnZmlsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xpbmVfbnVtYmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnb3BlcmF0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzY0J30pLAorICAgICAgICAgICAgJ3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3ZoaXN0b3J5JyIsICd0byc6IHUib3JtWydvcm0uVmFyaWFibGUnXSJ9KQorICAgICAgICB9CisgICAgfQorCisgICAgY29tcGxldGVfYXBwcyA9IFsnb3JtJ10KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAyNl9zZXRfZGVmYXVsdF9wcm9qZWN0LnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDI2X3NldF9kZWZhdWx0X3Byb2plY3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI0MGFiZAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAyNl9zZXRfZGVmYXVsdF9wcm9qZWN0LnB5CkBAIC0wLDAgKzEsMzc0IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorZnJvbSBzb3V0aC51dGlscyBpbXBvcnQgZGF0ZXRpbWVfdXRpbHMgYXMgZGF0ZXRpbWUKK2Zyb20gc291dGguZGIgaW1wb3J0IGRiCitmcm9tIHNvdXRoLnYyIGltcG9ydCBTY2hlbWFNaWdyYXRpb24KK2Zyb20gZGphbmdvLmRiIGltcG9ydCBtb2RlbHMKKworIyBkYXRhLW9ubHkgbWlncmF0aW9uIHRvIHNldCB0aGUgaXNfZGVmYXVsdCBmaWVsZCBjb3JyZWN0bHkKKyMgYWNyb3NzIGFsbCBwcm9qZWN0cywgc28gaXQgaGFzIHRoZSBjb3JyZWN0IHZhbHVlIG9uIGEgc2luZ2xlCisjIHJlY29yZCBvbmx5OyB0aGlzIHdpbGwgYWRkIG9yIGFtZW5kIGRlZmF1bHQgcHJvamVjdCAobWFya2VkIHdpdGgKKyMgaXNfZGVmYXVsdCA9IFRydWUpCitjbGFzcyBNaWdyYXRpb24oU2NoZW1hTWlncmF0aW9uKToKKworICAgIG5vX2RyeV9ydW4gPSBUcnVlCisKKyAgICAjIHdvcmstYXJvdW5kIGZvciBodHRwOi8vc291dGguYWVyYWNvZGUub3JnL3RpY2tldC81Nzg6CisgICAgIyBTUUxpdGUgYm9vbGVhbiBmaWVsZHMgYXJlbid0IHNldCB0byB0aGUgY29ycmVjdCBkZWZhdWx0IHZhbHVlCisgICAgIyB3aGVuIGFkZGVkIHRvIGV4aXN0aW5nIHJlY29yZHMgKHZhbHVlIG5lZWRzIHRvIGJlIDAgb3IgMSwgcmF0aGVyCisgICAgIyB0aGFuIFRydWUgb3IgRmFsc2UpLCBzbyBtYW51YWxseSB1cGRhdGUgdGhhdCBmaWVsZCBmb3IgYWxsCisgICAgIyBleGlzdGluZyByZWNvcmRzCisgICAgZGVmIF9zcWxpdGVfdXBkYXRlX2FsbF9wcm9qZWN0c19pc19kZWZhdWx0KHNlbGYsIG9ybSk6CisgICAgICAgIGlmIGRiLmJhY2tlbmRfbmFtZSA9PSAnc3FsaXRlMyc6CisgICAgICAgICAgICBmb3IgcHJvamVjdCBpbiBvcm0uUHJvamVjdC5vYmplY3RzLmFsbCgpOgorICAgICAgICAgICAgICAgIHByb2plY3QuaXNfZGVmYXVsdCA9IDAKKyAgICAgICAgICAgICAgICBwcm9qZWN0LnNhdmUoKQorCisgICAgZGVmIGZvcndhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgZml4IGlzX2RlZmF1bHQgZmllbGQKKyAgICAgICAgc2VsZi5fc3FsaXRlX3VwZGF0ZV9hbGxfcHJvamVjdHNfaXNfZGVmYXVsdChvcm0pCisKKyAgICAgICAgIyBub3cgY3JlYXRlIG9yIG1vZGlmeSB0aGUgZGVmYXVsdCBwcm9qZWN0CisgICAgICAgIHByb2plY3QgPSBOb25lCisKKyAgICAgICAgIyBjaGVjayBmb3IgZXhpc3RpbmcgZGVmYXVsdCBwcm9qZWN0IHdpdGggSUQgMCB3aGljaCBoYXMKKyAgICAgICAgIyBhbHJlYWR5IGJlZW4gYWRkZWQgaW4gY29kZQorICAgICAgICBwcm9qZWN0cyA9IG9ybS5Qcm9qZWN0Lm9iamVjdHMuZmlsdGVyKHBrID0gMCkKKworICAgICAgICBpZiBsZW4ocHJvamVjdHMpID09IDE6CisgICAgICAgICAgICBwcm9qZWN0ID0gcHJvamVjdHNbMF0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgY3JlYXRlIGRlZmF1bHQgcHJvamVjdAorICAgICAgICAgICAgb3B0aW9ucyA9IHsKKyAgICAgICAgICAgICAgICAibmFtZSI6ICJDb21tYW5kIGxpbmUgYnVpbGRzIiwKKyAgICAgICAgICAgICAgICAic2hvcnRfZGVzY3JpcHRpb24iOiAiUHJvamVjdCBmb3IgYnVpbGRzIHN0YXJ0ZWQgb3V0c2lkZSBUb2FzdGVyIgorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJvamVjdCA9IG9ybS5Qcm9qZWN0Lm9iamVjdHMuY3JlYXRlKCoqb3B0aW9ucykKKworICAgICAgICBwcm9qZWN0LmlzX2RlZmF1bHQgPSBUcnVlCisgICAgICAgIHByb2plY3Quc2F2ZSgpCisKKyAgICBkZWYgYmFja3dhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgZG9uJ3QgZG8gYW55dGhpbmcgd2hlbiByZXZlcnNpbmcgdGhpcyBtaWdyYXRpb24sIGFzIHdlIGNhbiBzYWZlbHkKKyAgICAgICAgIyBrZWVwIGFueSBnZW5lcmF0ZWQgZGVmYXVsdCBwcm9qZWN0IHdoaWNoIGhhcyBidWlsZHMgYXR0YWNoZWQ7CisgICAgICAgICMgaXQncyBqdXN0IHRoYXQgdGhlIG9sZCBjb2RlIHdvbid0IHVzZSB0aGF0IHByb2plY3QgYXMgdGhlCisgICAgICAgICMgY29udGFpbmVyIGZvciBhbnkgbmV3IGJ1aWxkcywgYXMgaXQgZG9lc24ndCBoYXZlIGFuIElEIG9mIDAKKyAgICAgICAgcGFzcworCisgICAgbW9kZWxzID0geworICAgICAgICB1J29ybS5iaXRiYWtldmVyc2lvbic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCaXRiYWtlVmVyc2lvbid9LAorICAgICAgICAgICAgJ2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICczMid9KSwKKyAgICAgICAgICAgICdkaXJwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICdnaXR1cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J3VuaXF1ZSc6ICdUcnVlJywgJ21heF9sZW5ndGgnOiAnMzInfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0uYnJhbmNoJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAnbmFtZScpLCAoJ2xheWVyX3NvdXJjZScsICd1cF9pZCcpKSIsICdvYmplY3RfbmFtZSc6ICdCcmFuY2gnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnc2hvcnRfZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9kYXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5idWlsZCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZCd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdidWlsZF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdjb21wbGV0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2Nvb2tlcl9sb2dfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnfSksCisgICAgICAgICAgICAnZGlzdHJvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm9fdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21hY2hpbmUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMid9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pLAorICAgICAgICAgICAgJ3N0YXJ0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmJ1aWxkYXJ0aWZhY3QnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQnVpbGRBcnRpZmFjdCd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdmaWxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdmaWxlX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmhlbHB0ZXh0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0hlbHBUZXh0J30sCisgICAgICAgICAgICAnYXJlYSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidoZWxwdGV4dF9idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2tleSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndGV4dCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJyksICgnbGF5ZXJfc291cmNlJywgJ25hbWUnKSkiLCAnb2JqZWN0X25hbWUnOiAnTGF5ZXInfSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfaW5kZXhfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Zjc191cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjAwJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2Y3Nfd2ViX2ZpbGVfYmFzZV91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjAwJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2Y3Nfd2ViX3RyZWVfYmFzZV91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjAwJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2Y3Nfd2ViX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyMDAnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVyX3ZlcnNpb24nOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3NvdXJjZScsICd1cF9pZCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnTGF5ZXJfVmVyc2lvbid9LAorICAgICAgICAgICAgJ2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCd9KSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3JlbGF0ZWRfbmFtZSc6ICInbGF5ZXJfdmVyc2lvbl9idWlsZCciLCAnbnVsbCc6ICdUcnVlJywgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NvbW1pdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZGlycGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjU1JywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInbGF5ZXJfdmVyc2lvbl9sYXllciciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyJ10ifSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xvY2FsX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydkZWZhdWx0JzogIicvJyIsICdtYXhfbGVuZ3RoJzogJzEwMjQnfSksCisgICAgICAgICAgICAncHJpb3JpdHknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkJyYW5jaCddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9kYXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcnNvdXJjZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnc291cmNldHlwZScsICdhcGl1cmwnKSwpIiwgJ29iamVjdF9uYW1lJzogJ0xheWVyU291cmNlJ30sCisgICAgICAgICAgICAnYXBpdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyNTUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeyd1bmlxdWUnOiAnVHJ1ZScsICdtYXhfbGVuZ3RoJzogJzYzJ30pLAorICAgICAgICAgICAgJ3NvdXJjZXR5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXJ2ZXJzaW9uZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJyksKSIsICdvYmplY3RfbmFtZSc6ICdMYXllclZlcnNpb25EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidkZXBlbmRlZXMnIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2RlcGVuZGVuY2llcyciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sb2dtZXNzYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0xvZ01lc3NhZ2UnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xldmVsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbGluZW5vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWVzc2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNDAnfSksCisgICAgICAgICAgICAncGF0aG5hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXNrJ10iLCAnbnVsbCc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubWFjaGluZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJyksKSIsICdvYmplY3RfbmFtZSc6ICdNYWNoaW5lJ30sCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICd1cF9kYXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2UnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2luc3RhbGxlZF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogIicnIiwgJ21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2luc3RhbGxlZF9zaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbGljZW5zZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlY2lwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZXZpc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICczMicsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NlY3Rpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnODAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnc3VtbWFyeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2VfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3BhY2thZ2VfZGVwZW5kZW5jaWVzX3RhcmdldCciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidwYWNrYWdlX2RlcGVuZGVuY2llc19zb3VyY2UnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10iLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2VfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlX0ZpbGUnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIididWlsZGZpbGVsaXN0X3BhY2thZ2UnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICAncGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Byb2plY3QnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CaXRiYWtlVmVyc2lvbiddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdjcmVhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3dfYWRkJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaXNfZGVmYXVsdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdyZWxlYXNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVsZWFzZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzaG9ydF9kZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwZGF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vdyc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXNlcl9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3RsYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgncHJvamVjdCcsICdsYXllcmNvbW1pdCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnUHJvamVjdExheWVyJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvcHRpb25hbCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdHRhcmdldCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0VGFyZ2V0J30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdHZhcmlhYmxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Byb2plY3RWYXJpYWJsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pLAorICAgICAgICAgICAgJ3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlY2lwZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfdmVyc2lvbicsICdmaWxlX3BhdGgnLCAncGF0aGZsYWdzJyksKSIsICdvYmplY3RfbmFtZSc6ICdSZWNpcGUnfSwKKyAgICAgICAgICAgICdidWd0cmFja2VyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZmlsZV9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAnaG9tZXBhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaXNfaW1hZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncmVjaXBlX2xheWVyX3ZlcnNpb24nIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnbGljZW5zZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhdGhmbGFncyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzZWN0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3N1bW1hcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfZGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWNpcGVfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWNpcGVfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncl9kZXBlbmRlbmNpZXNfZGVwZW5kcyciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncl9kZXBlbmRlbmNpZXNfcmVjaXBlJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVsZWFzZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWxlYXNlJ30sCisgICAgICAgICAgICAnYml0YmFrZV92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQml0YmFrZVZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICdicmFuY2hfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICInJyIsICdtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICdoZWxwdGV4dCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeyd1bmlxdWUnOiAnVHJ1ZScsICdtYXhfbGVuZ3RoJzogJzMyJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlbGVhc2VkZWZhdWx0bGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVsZWFzZURlZmF1bHRMYXllcid9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogIicnIiwgJ21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlbGVhc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5SZWxlYXNlJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVsZWFzZWxheWVyc291cmNlcHJpb3JpdHknOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ3JlbGVhc2UnLCAnbGF5ZXJfc291cmNlJyksKSIsICdvYmplY3RfbmFtZSc6ICdSZWxlYXNlTGF5ZXJTb3VyY2VQcmlvcml0eSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIn0pLAorICAgICAgICAgICAgJ3ByaW9yaXR5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAncmVsZWFzZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlJlbGVhc2UnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0J30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpbWFnZV9zaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnaXNfaW1hZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAnbGljZW5zZV9tYW5pZmVzdF9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwMCcsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0ZpbGUnfSwKKyAgICAgICAgICAgICdkaXJlY3RvcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInZGlyZWN0b3J5X3NldCciLCAnbnVsbCc6ICdUcnVlJywgJ3RvJzogdSJvcm1bJ29ybS5UYXJnZXRfRmlsZSddIn0pLAorICAgICAgICAgICAgJ2dyb3VwJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyOCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW5vZGV0eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ293bmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyOCd9KSwKKyAgICAgICAgICAgICdwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncGVybWlzc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxNid9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ3N5bV90YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInc3ltbGlua19zZXQnIiwgJ251bGwnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uVGFyZ2V0X0ZpbGUnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXRfaW1hZ2VfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfSW1hZ2VfRmlsZSd9LAorICAgICAgICAgICAgJ2ZpbGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgJ2ZpbGVfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2luc3RhbGxlZF9wYWNrYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9JbnN0YWxsZWRfUGFja2FnZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkdGFyZ2V0bGlzdF9wYWNrYWdlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhc2snOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb3JkZXJpbmcnOiAiKCdvcmRlcicsICdyZWNpcGUnKSIsICd1bmlxdWVfdG9nZXRoZXInOiAiKCgnYnVpbGQnLCAncmVjaXBlJywgJ3Rhc2tfbmFtZScpLCkiLCAnb2JqZWN0X25hbWUnOiAnVGFzayd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NwdV91c2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGVjaW1hbEZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJywgJ21heF9kaWdpdHMnOiAnOCcsICdkZWNpbWFsX3BsYWNlcyc6ICcyJ30pLAorICAgICAgICAgICAgJ2Rpc2tfaW8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdlbGFwc2VkX3RpbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRlY2ltYWxGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZScsICdtYXhfZGlnaXRzJzogJzgnLCAnZGVjaW1hbF9wbGFjZXMnOiAnMid9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGluZV9udW1iZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsb2dmaWxlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtZXNzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI0MCd9KSwKKyAgICAgICAgICAgICdvcmRlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnLTEnfSksCisgICAgICAgICAgICAncGF0aF90b19zc3RhdGVfb2JqJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza3MnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KSwKKyAgICAgICAgICAgICdzY3JpcHRfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3NvdXJjZV91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NzdGF0ZV9jaGVja3N1bSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzc3RhdGVfcmVzdWx0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAndGFza19leGVjdXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICd0YXNrX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3dvcmtfZGlyZWN0b3J5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXNrX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFza19EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2RlcGVuZGVuY2llc19kZXBlbmRzJyIsICd0byc6IHUib3JtWydvcm0uVGFzayddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfZGVwZW5kZW5jaWVzX3Rhc2snIiwgJ3RvJzogdSJvcm1bJ29ybS5UYXNrJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udG9hc3RlcnNldHRpbmcnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVG9hc3RlclNldHRpbmcnfSwKKyAgICAgICAgICAgICdoZWxwdGV4dCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc2Myd9KSwKKyAgICAgICAgICAgICd2YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udmFyaWFibGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVmFyaWFibGUnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid2YXJpYWJsZV9idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY2hhbmdlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdodW1hbl9yZWFkYWJsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndmFyaWFibGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndmFyaWFibGVfdmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udmFyaWFibGVoaXN0b3J5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1ZhcmlhYmxlSGlzdG9yeSd9LAorICAgICAgICAgICAgJ2ZpbGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsaW5lX251bWJlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ29wZXJhdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc2NCd9KSwKKyAgICAgICAgICAgICd2YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid2aGlzdG9yeSciLCAndG8nOiB1Im9ybVsnb3JtLlZhcmlhYmxlJ10ifSkKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbXBsZXRlX2FwcHMgPSBbJ29ybSddCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zL19faW5pdF9fLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbW9kZWxzLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbW9kZWxzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZDJlODcKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9tb2RlbHMucHkKQEAgLTAsMCArMSwxMjMzIEBACisjCisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIworIyBCaXRCYWtlIFRvYXN0ZXIgSW1wbGVtZW50YXRpb24KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEzICAgICAgICBJbnRlbCBDb3Jwb3JhdGlvbgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworZnJvbSBkamFuZ28uZGIgaW1wb3J0IG1vZGVscywgSW50ZWdyaXR5RXJyb3IKK2Zyb20gZGphbmdvLmRiLm1vZGVscyBpbXBvcnQgRiwgUSwgQXZnLCBNYXgKK2Zyb20gZGphbmdvLnV0aWxzIGltcG9ydCB0aW1lem9uZQorCitmcm9tIGRqYW5nby5jb3JlLnVybHJlc29sdmVycyBpbXBvcnQgcmV2ZXJzZQorCitmcm9tIGRqYW5nby5jb3JlIGltcG9ydCB2YWxpZGF0b3JzCitmcm9tIGRqYW5nby5jb25mIGltcG9ydCBzZXR0aW5ncworaW1wb3J0IGRqYW5nby5kYi5tb2RlbHMuc2lnbmFscworCisKK2ltcG9ydCBsb2dnaW5nCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigidG9hc3RlciIpCisKKworY2xhc3MgR2l0VVJMVmFsaWRhdG9yKHZhbGlkYXRvcnMuVVJMVmFsaWRhdG9yKToKKyAgICBpbXBvcnQgcmUKKyAgICByZWdleCA9IHJlLmNvbXBpbGUoCisgICAgICAgIHInXig/OnNzaHxnaXR8aHR0cHxmdHApcz86Ly8nICAjIGh0dHA6Ly8gb3IgaHR0cHM6Ly8KKyAgICAgICAgcicoPzooPzpbQS1aMC05XSg/OltBLVowLTktXXswLDYxfVtBLVowLTldKT9cLikrKD86W0EtWl17Miw2fVwuP3xbQS1aMC05LV17Mix9XC4/KXwnICAjIGRvbWFpbi4uLgorICAgICAgICByJ2xvY2FsaG9zdHwnICAjIGxvY2FsaG9zdC4uLgorICAgICAgICByJ1xkezEsM31cLlxkezEsM31cLlxkezEsM31cLlxkezEsM318JyAgIyAuLi5vciBpcHY0CisgICAgICAgIHInXFs/W0EtRjAtOV0qOltBLUYwLTk6XStcXT8pJyAgIyAuLi5vciBpcHY2CisgICAgICAgIHInKD86OlxkKyk/JyAgIyBvcHRpb25hbCBwb3J0CisgICAgICAgIHInKD86Lz98Wy8/XVxTKykkJywgcmUuSUdOT1JFQ0FTRSkKKworZGVmIEdpdFVSTEZpZWxkKCoqa3dhcmdzKToKKyAgICByID0gbW9kZWxzLlVSTEZpZWxkKCoqa3dhcmdzKQorICAgIGZvciBpIGluIHhyYW5nZShsZW4oci52YWxpZGF0b3JzKSk6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uoci52YWxpZGF0b3JzW2ldLCB2YWxpZGF0b3JzLlVSTFZhbGlkYXRvcik6CisgICAgICAgICAgICByLnZhbGlkYXRvcnNbaV0gPSBHaXRVUkxWYWxpZGF0b3IoKQorICAgIHJldHVybiByCisKKworY2xhc3MgVG9hc3RlclNldHRpbmcobW9kZWxzLk1vZGVsKToKKyAgICBuYW1lID0gbW9kZWxzLkNoYXJGaWVsZChtYXhfbGVuZ3RoPTYzKQorICAgIGhlbHB0ZXh0ID0gbW9kZWxzLlRleHRGaWVsZCgpCisgICAgdmFsdWUgPSBtb2RlbHMuQ2hhckZpZWxkKG1heF9sZW5ndGg9MjU1KQorCisgICAgZGVmIF9fdW5pY29kZV9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIlNldHRpbmcgJXMgPSAlcyIgJSAoc2VsZi5uYW1lLCBzZWxmLnZhbHVlKQorCitjbGFzcyBQcm9qZWN0TWFuYWdlcihtb2RlbHMuTWFuYWdlcik6CisgICAgZGVmIGNyZWF0ZV9wcm9qZWN0KHNlbGYsIG5hbWUsIHJlbGVhc2UpOgorICAgICAgICBpZiByZWxlYXNlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcHJqID0gc2VsZi5tb2RlbChuYW1lID0gbmFtZSwgYml0YmFrZV92ZXJzaW9uID0gcmVsZWFzZS5iaXRiYWtlX3ZlcnNpb24sIHJlbGVhc2UgPSByZWxlYXNlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJqID0gc2VsZi5tb2RlbChuYW1lID0gbmFtZSwgYml0YmFrZV92ZXJzaW9uID0gTm9uZSwgcmVsZWFzZSA9IE5vbmUpCisKKyAgICAgICAgcHJqLnNhdmUoKQorCisgICAgICAgIGZvciBkZWZhdWx0Y29uZiBpbiBUb2FzdGVyU2V0dGluZy5vYmplY3RzLmZpbHRlcihuYW1lX19zdGFydHN3aXRoPSJERUZDT05GXyIpOgorICAgICAgICAgICAgbmFtZSA9IGRlZmF1bHRjb25mLm5hbWVbODpdCisgICAgICAgICAgICBQcm9qZWN0VmFyaWFibGUub2JqZWN0cy5jcmVhdGUoIHByb2plY3QgPSBwcmosCisgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUsCisgICAgICAgICAgICAgICAgdmFsdWUgPSBkZWZhdWx0Y29uZi52YWx1ZSkKKworICAgICAgICBpZiByZWxlYXNlIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gcHJqCisKKyAgICAgICAgZm9yIHJkbCBpbiByZWxlYXNlLnJlbGVhc2VkZWZhdWx0bGF5ZXJfc2V0LmFsbCgpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGx2ID0gTGF5ZXJfVmVyc2lvbi5vYmplY3RzLmZpbHRlcihsYXllcl9fbmFtZSA9IHJkbC5sYXllcl9uYW1lLCB1cF9icmFuY2hfX25hbWUgPSByZWxlYXNlLmJyYW5jaF9uYW1lKVswXS5nZXRfZXF1aXZhbGVudHNfd3ByaW9yaXR5KHByailbMF0KKyAgICAgICAgICAgICAgICBQcm9qZWN0TGF5ZXIub2JqZWN0cy5jcmVhdGUoIHByb2plY3QgPSBwcmosCisgICAgICAgICAgICAgICAgICAgICAgICBsYXllcmNvbW1pdCA9IGx2LAorICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgPSBGYWxzZSApCisgICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgICAgICAjIHdlIG1heSBoYXZlIG5vIHZhbGlkIGxheWVyIHZlcnNpb24gb2JqZWN0cywgYW5kIHRoYXQncyBvaworICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICByZXR1cm4gcHJqCisKKyAgICBkZWYgY3JlYXRlKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiSW52YWxpZCBjYWxsIHRvIFByb2plY3Qub2JqZWN0cy5jcmVhdGUuIFVzZSBQcm9qZWN0Lm9iamVjdHMuY3JlYXRlX3Byb2plY3QoKSB0byBjcmVhdGUgYSBwcm9qZWN0IikKKworICAgICMgcmV0dXJuIHNpbmdsZSBvYmplY3Qgd2l0aCBpc19kZWZhdWx0ID0gVHJ1ZQorICAgIGRlZiBnZXRfZGVmYXVsdF9wcm9qZWN0KHNlbGYpOgorICAgICAgICBwcm9qZWN0cyA9IHN1cGVyKFByb2plY3RNYW5hZ2VyLCBzZWxmKS5maWx0ZXIoaXNfZGVmYXVsdCA9IFRydWUpCisgICAgICAgIGlmIGxlbihwcm9qZWN0cykgPiAxOgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJJbmNvbnNpc3RlbnQgcHJvamVjdCBkYXRhOiBtdWx0aXBsZSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCBwcm9qZWN0cyAoaS5lLiB3aXRoIGlzX2RlZmF1bHQ9VHJ1ZSkiKQorICAgICAgICBlbGlmIGxlbihwcm9qZWN0cykgPCAxOgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJJbmNvbnNpc3RlbnQgcHJvamVjdCBkYXRhOiBubyBkZWZhdWx0IHByb2plY3QgZm91bmQiKQorICAgICAgICByZXR1cm4gcHJvamVjdHNbMF0KKworY2xhc3MgUHJvamVjdChtb2RlbHMuTW9kZWwpOgorICAgIHNlYXJjaF9hbGxvd2VkX2ZpZWxkcyA9IFsnbmFtZScsICdzaG9ydF9kZXNjcmlwdGlvbicsICdyZWxlYXNlX19uYW1lJywgJ3JlbGVhc2VfX2JyYW5jaF9uYW1lJ10KKyAgICBuYW1lID0gbW9kZWxzLkNoYXJGaWVsZChtYXhfbGVuZ3RoPTEwMCkKKyAgICBzaG9ydF9kZXNjcmlwdGlvbiA9IG1vZGVscy5DaGFyRmllbGQobWF4X2xlbmd0aD01MCwgYmxhbms9VHJ1ZSkKKyAgICBiaXRiYWtlX3ZlcnNpb24gPSBtb2RlbHMuRm9yZWlnbktleSgnQml0YmFrZVZlcnNpb24nLCBudWxsPVRydWUpCisgICAgcmVsZWFzZSAgICAgPSBtb2RlbHMuRm9yZWlnbktleSgiUmVsZWFzZSIsIG51bGw9VHJ1ZSkKKyAgICBjcmVhdGVkICAgICA9IG1vZGVscy5EYXRlVGltZUZpZWxkKGF1dG9fbm93X2FkZCA9IFRydWUpCisgICAgdXBkYXRlZCAgICAgPSBtb2RlbHMuRGF0ZVRpbWVGaWVsZChhdXRvX25vdyA9IFRydWUpCisgICAgIyBUaGlzIGlzIGEgaG9ycmlibGUgaGFjazsgc2luY2UgVG9hc3RlciBoYXMgbm8gIlVzZXIiIG1vZGVsIGF2YWlsYWJsZSB3aGVuCisgICAgIyBydW5uaW5nIGluIGludGVyYWN0aXZlIG1vZGUsIHdlIGNhbid0IHJlZmVyZW5jZSB0aGUgZmllbGQgaGVyZSBkaXJlY3RseQorICAgICMgSW5zdGVhZCwgd2Uga2VlcCBhIHBvc3NpYmxlIG51bGwgcmVmZXJlbmNlIHRvIHRoZSBVc2VyIGlkLCBhcyBub3QgdG8gZm9yY2UKKyAgICAjIGhhcmQgbGlua3MgdG8gcG9zc2libHkgbWlzc2luZyBtb2RlbHMKKyAgICB1c2VyX2lkICAgICA9IG1vZGVscy5JbnRlZ2VyRmllbGQobnVsbCA9IFRydWUpCisgICAgb2JqZWN0cyAgICAgPSBQcm9qZWN0TWFuYWdlcigpCisKKyAgICAjIHNldCB0byBUcnVlIGZvciB0aGUgcHJvamVjdCB3aGljaCBpcyB0aGUgZGVmYXVsdCBjb250YWluZXIKKyAgICAjIGZvciBidWlsZHMgaW5pdGlhdGVkIGJ5IHRoZSBjb21tYW5kIGxpbmUgZXRjLgorICAgIGlzX2RlZmF1bHQgID0gbW9kZWxzLkJvb2xlYW5GaWVsZChkZWZhdWx0ID0gRmFsc2UpCisKKyAgICBkZWYgX191bmljb2RlX18oc2VsZik6CisgICAgICAgIHJldHVybiAiJXMgKFJlbGVhc2UgJXMsIEJCViAlcykiICUgKHNlbGYubmFtZSwgc2VsZi5yZWxlYXNlLCBzZWxmLmJpdGJha2VfdmVyc2lvbikKKworICAgIGRlZiBnZXRfY3VycmVudF9tYWNoaW5lX25hbWUoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnByb2plY3R2YXJpYWJsZV9zZXQuZ2V0KG5hbWU9Ik1BQ0hJTkUiKS52YWx1ZQorICAgICAgICBleGNlcHQgKFByb2plY3RWYXJpYWJsZS5Eb2VzTm90RXhpc3QsSW5kZXhFcnJvcik6CisgICAgICAgICAgICByZXR1cm4oICJOb25lIiApOworCisgICAgZGVmIGdldF9udW1iZXJfb2ZfYnVpbGRzKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gbGVuKEJ1aWxkLm9iamVjdHMuZmlsdGVyKCBwcm9qZWN0ID0gc2VsZi5pZCApKQorICAgICAgICBleGNlcHQgKEJ1aWxkLkRvZXNOb3RFeGlzdCxJbmRleEVycm9yKToKKyAgICAgICAgICAgIHJldHVybiggMCApCisKKyAgICBkZWYgZ2V0X2xhc3RfYnVpbGRfaWQoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBCdWlsZC5vYmplY3RzLmZpbHRlciggcHJvamVjdCA9IHNlbGYuaWQgKS5vcmRlcl9ieSgnLWNvbXBsZXRlZF9vbicpWzBdLmlkCisgICAgICAgIGV4Y2VwdCAoQnVpbGQuRG9lc05vdEV4aXN0LEluZGV4RXJyb3IpOgorICAgICAgICAgICAgcmV0dXJuKCAtMSApCisKKyAgICBkZWYgZ2V0X2xhc3Rfb3V0Y29tZShzZWxmKToKKyAgICAgICAgYnVpbGRfaWQgPSBzZWxmLmdldF9sYXN0X2J1aWxkX2lkCisgICAgICAgIGlmICgtMSA9PSBidWlsZF9pZCk6CisgICAgICAgICAgICByZXR1cm4oICIiICkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIEJ1aWxkLm9iamVjdHMuZmlsdGVyKCBpZCA9IHNlbGYuZ2V0X2xhc3RfYnVpbGRfaWQgKVsgMCBdLm91dGNvbWUKKyAgICAgICAgZXhjZXB0IChCdWlsZC5Eb2VzTm90RXhpc3QsSW5kZXhFcnJvcik6CisgICAgICAgICAgICByZXR1cm4oICJub3RfZm91bmQiICkKKworICAgIGRlZiBnZXRfbGFzdF90YXJnZXQoc2VsZik6CisgICAgICAgIGJ1aWxkX2lkID0gc2VsZi5nZXRfbGFzdF9idWlsZF9pZAorICAgICAgICBpZiAoLTEgPT0gYnVpbGRfaWQpOgorICAgICAgICAgICAgcmV0dXJuKCAiIiApCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBUYXJnZXQub2JqZWN0cy5maWx0ZXIoYnVpbGQgPSBidWlsZF9pZClbMF0udGFyZ2V0CisgICAgICAgIGV4Y2VwdCAoVGFyZ2V0LkRvZXNOb3RFeGlzdCxJbmRleEVycm9yKToKKyAgICAgICAgICAgIHJldHVybiggIm5vdF9mb3VuZCIgKQorCisgICAgZGVmIGdldF9sYXN0X2Vycm9ycyhzZWxmKToKKyAgICAgICAgYnVpbGRfaWQgPSBzZWxmLmdldF9sYXN0X2J1aWxkX2lkCisgICAgICAgIGlmICgtMSA9PSBidWlsZF9pZCk6CisgICAgICAgICAgICByZXR1cm4oIDAgKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gQnVpbGQub2JqZWN0cy5maWx0ZXIoaWQgPSBidWlsZF9pZClbIDAgXS5lcnJvcnMuY291bnQoKQorICAgICAgICBleGNlcHQgKEJ1aWxkLkRvZXNOb3RFeGlzdCxJbmRleEVycm9yKToKKyAgICAgICAgICAgIHJldHVybiggIm5vdF9mb3VuZCIgKQorCisgICAgZGVmIGdldF9sYXN0X3dhcm5pbmdzKHNlbGYpOgorICAgICAgICBidWlsZF9pZCA9IHNlbGYuZ2V0X2xhc3RfYnVpbGRfaWQKKyAgICAgICAgaWYgKC0xID09IGJ1aWxkX2lkKToKKyAgICAgICAgICAgIHJldHVybiggMCApCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBCdWlsZC5vYmplY3RzLmZpbHRlcihpZCA9IGJ1aWxkX2lkKVsgMCBdLndhcm5pbmdzLmNvdW50KCkKKyAgICAgICAgZXhjZXB0IChCdWlsZC5Eb2VzTm90RXhpc3QsSW5kZXhFcnJvcik6CisgICAgICAgICAgICByZXR1cm4oICJub3RfZm91bmQiICkKKworICAgIGRlZiBnZXRfbGFzdF9pbWdmaWxlcyhzZWxmKToKKyAgICAgICAgYnVpbGRfaWQgPSBzZWxmLmdldF9sYXN0X2J1aWxkX2lkCisgICAgICAgIGlmICgtMSA9PSBidWlsZF9pZCk6CisgICAgICAgICAgICByZXR1cm4oICIiICkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIFZhcmlhYmxlLm9iamVjdHMuZmlsdGVyKGJ1aWxkID0gYnVpbGRfaWQsIHZhcmlhYmxlX25hbWUgPSAiSU1BR0VfRlNUWVBFUyIpWyAwIF0udmFyaWFibGVfdmFsdWUKKyAgICAgICAgZXhjZXB0IChWYXJpYWJsZS5Eb2VzTm90RXhpc3QsSW5kZXhFcnJvcik6CisgICAgICAgICAgICByZXR1cm4oICJub3RfZm91bmQiICkKKworICAgICMgcmV0dXJucyBhIHF1ZXJ5c2V0IG9mIGNvbXBhdGlibGUgbGF5ZXJzIGZvciBhIHByb2plY3QKKyAgICBkZWYgY29tcGF0aWJsZV9sYXllcnZlcnNpb25zKHNlbGYsIHJlbGVhc2UgPSBOb25lLCBsYXllcl9uYW1lID0gTm9uZSk6CisgICAgICAgIGlmIHJlbGVhc2UgPT0gTm9uZToKKyAgICAgICAgICAgIHJlbGVhc2UgPSBzZWxmLnJlbGVhc2UKKyAgICAgICAgIyBsYXllcnMgb24gdGhlIHNhbWUgYnJhbmNoIG9yIGxheWVycyBzcGVjaWZpY2FsbHkgc2V0IGZvciB0aGlzIHByb2plY3QKKyAgICAgICAgcXVlcnlzZXQgPSBMYXllcl9WZXJzaW9uLm9iamVjdHMuZmlsdGVyKChRKHVwX2JyYW5jaF9fbmFtZSA9IHJlbGVhc2UuYnJhbmNoX25hbWUpICYgUShwcm9qZWN0ID0gTm9uZSkpIHwgUShwcm9qZWN0ID0gc2VsZikgfCBRKGJ1aWxkX19wcm9qZWN0ID0gc2VsZikpCisKKyAgICAgICAgaWYgbGF5ZXJfbmFtZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICMgd2Ugc2VsZWN0IG9ubHkgYSBsYXllciBuYW1lCisgICAgICAgICAgICBxdWVyeXNldCA9IHF1ZXJ5c2V0LmZpbHRlcihsYXllcl9fbmFtZSA9IGxheWVyX25hbWUpCisKKyAgICAgICAgIyBvcmRlciBieSBsYXllciB2ZXJzaW9uIHByaW9yaXR5CisgICAgICAgIHF1ZXJ5c2V0ID0gcXVlcnlzZXQuZmlsdGVyKFEobGF5ZXJfc291cmNlPU5vbmUpIHwgUShsYXllcl9zb3VyY2VfX3JlbGVhc2VsYXllcnNvdXJjZXByaW9yaXR5X19yZWxlYXNlID0gcmVsZWFzZSkpLnNlbGVjdF9yZWxhdGVkKCdsYXllcl9zb3VyY2UnLCAnbGF5ZXInLCAndXBfYnJhbmNoJywgImxheWVyX3NvdXJjZV9fcmVsZWFzZWxheWVyc291cmNlcHJpb3JpdHlfX3ByaW9yaXR5Iikub3JkZXJfYnkoIi1sYXllcl9zb3VyY2VfX3JlbGVhc2VsYXllcnNvdXJjZXByaW9yaXR5X19wcmlvcml0eSIpCisKKyAgICAgICAgcmV0dXJuIHF1ZXJ5c2V0CisKKyAgICBkZWYgcHJvamVjdGxheWVyX2VxdWl2YWxlbnRfc2V0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5jb21wYXRpYmxlX2xheWVydmVyc2lvbnMoKS5maWx0ZXIobGF5ZXJfX25hbWVfX2luID0gW3gubGF5ZXJjb21taXQubGF5ZXIubmFtZSBmb3IgeCBpbiBzZWxmLnByb2plY3RsYXllcl9zZXQuYWxsKCldKS5zZWxlY3RfcmVsYXRlZCgidXBfYnJhbmNoIikKKworICAgIGRlZiBnZXRfYXZhaWxhYmxlX21hY2hpbmVzKHNlbGYpOgorICAgICAgICAiIiIgUmV0dXJucyBRdWVyeVNldCBvZiBhbGwgTWFjaGluZXMgd2hpY2ggYXJlIHByb3ZpZGVkIGJ5IHRoZQorICAgICAgICBMYXllcnMgY3VycmVudGx5IGFkZGVkIHRvIHRoZSBQcm9qZWN0ICIiIgorICAgICAgICBxdWVyeXNldCA9IE1hY2hpbmUub2JqZWN0cy5maWx0ZXIobGF5ZXJfdmVyc2lvbl9faW49c2VsZi5wcm9qZWN0bGF5ZXJfZXF1aXZhbGVudF9zZXQpCisgICAgICAgIHJldHVybiBxdWVyeXNldAorCisgICAgZGVmIGdldF9hbGxfY29tcGF0aWJsZV9tYWNoaW5lcyhzZWxmKToKKyAgICAgICAgIiIiIFJldHVybnMgUXVlcnlTZXQgb2YgYWxsIHRoZSBjb21wYXRpYmxlIG1hY2hpbmVzIGF2YWlsYWJsZSB0byB0aGUKKyAgICAgICAgcHJvamVjdCBpbmNsdWRpbmcgb25lcyBmcm9tIExheWVycyBub3QgY3VycmVudGx5IGFkZGVkICIiIgorICAgICAgICBjb21wYXRpYmxlX2xheWVycyA9IHNlbGYuY29tcGF0aWJsZV9sYXllcnZlcnNpb25zKCkKKworICAgICAgICBxdWVyeXNldCA9IE1hY2hpbmUub2JqZWN0cy5maWx0ZXIobGF5ZXJfdmVyc2lvbl9faW49Y29tcGF0aWJsZV9sYXllcnMpCisgICAgICAgIHJldHVybiBxdWVyeXNldAorCisgICAgZGVmIGdldF9hdmFpbGFibGVfcmVjaXBlcyhzZWxmKToKKyAgICAgICAgIiIiIFJldHVybnMgUXVlcnlTZXQgb2YgYWxsIFJlY2lwZXMgd2hpY2ggYXJlIHByb3ZpZGVkIGJ5IHRoZSBMYXllcnMKKyAgICAgICAgY3VycmVudGx5IGFkZGVkIHRvIHRoZSBQcm9qZWN0ICIiIgorICAgICAgICBwcm9qZWN0X2xheWVycyA9IHNlbGYucHJvamVjdGxheWVyX2VxdWl2YWxlbnRfc2V0KCkKKyAgICAgICAgcXVlcnlzZXQgPSBSZWNpcGUub2JqZWN0cy5maWx0ZXIobGF5ZXJfdmVyc2lvbl9faW4gPSBwcm9qZWN0X2xheWVycykKKworICAgICAgICAjIENvcGllZCBmcm9tIGdldF9hbGxfY29tcGF0aWJsZV9yZWNpcGVzCisgICAgICAgIHNlYXJjaF9tYXhpZHMgPSBtYXAobGFtYmRhIGk6IGlbMF0sIGxpc3QocXVlcnlzZXQudmFsdWVzKCduYW1lJykuZGlzdGluY3QoKS5hbm5vdGF0ZShtYXhfaWQ9TWF4KCdpZCcpKS52YWx1ZXNfbGlzdCgnbWF4X2lkJykpKQorICAgICAgICBxdWVyeXNldCA9IHF1ZXJ5c2V0LmZpbHRlcihpZF9faW49c2VhcmNoX21heGlkcykuc2VsZWN0X3JlbGF0ZWQoJ2xheWVyX3ZlcnNpb24nLCAnbGF5ZXJfdmVyc2lvbl9fbGF5ZXInLCAnbGF5ZXJfdmVyc2lvbl9fdXBfYnJhbmNoJywgJ2xheWVyX3NvdXJjZScpCisgICAgICAgICMgRW5kIGNvcHkKKworICAgICAgICByZXR1cm4gcXVlcnlzZXQKKworICAgIGRlZiBnZXRfYWxsX2NvbXBhdGlibGVfcmVjaXBlcyhzZWxmKToKKyAgICAgICAgIiIiIFJldHVybnMgUXVlcnlTZXQgb2YgYWxsIHRoZSBjb21wYXRpYmxlIFJlY2lwZXMgYXZhaWxhYmxlIHRvIHRoZQorICAgICAgICBwcm9qZWN0IGluY2x1ZGluZyBvbmVzIGZyb20gTGF5ZXJzIG5vdCBjdXJyZW50bHkgYWRkZWQgIiIiCisgICAgICAgIGNvbXBhdGlibGVfbGF5ZXJ2ZXJzaW9ucyA9IHNlbGYuY29tcGF0aWJsZV9sYXllcnZlcnNpb25zKCkKKyAgICAgICAgcXVlcnlzZXQgPSBSZWNpcGUub2JqZWN0cy5maWx0ZXIobGF5ZXJfdmVyc2lvbl9faW4gPSBjb21wYXRpYmxlX2xheWVydmVyc2lvbnMpCisKKyAgICAgICAgc2VhcmNoX21heGlkcyA9IG1hcChsYW1iZGEgaTogaVswXSwgbGlzdChxdWVyeXNldC52YWx1ZXMoJ25hbWUnKS5kaXN0aW5jdCgpLmFubm90YXRlKG1heF9pZD1NYXgoJ2lkJykpLnZhbHVlc19saXN0KCdtYXhfaWQnKSkpCisKKyAgICAgICAgcXVlcnlzZXQgPSBxdWVyeXNldC5maWx0ZXIoaWRfX2luPXNlYXJjaF9tYXhpZHMpLnNlbGVjdF9yZWxhdGVkKCdsYXllcl92ZXJzaW9uJywgJ2xheWVyX3ZlcnNpb25fX2xheWVyJywgJ2xheWVyX3ZlcnNpb25fX3VwX2JyYW5jaCcsICdsYXllcl9zb3VyY2UnKQorICAgICAgICByZXR1cm4gcXVlcnlzZXQKKworCisgICAgZGVmIHNjaGVkdWxlX2J1aWxkKHNlbGYpOgorICAgICAgICBmcm9tIGJsZGNvbnRyb2wubW9kZWxzIGltcG9ydCBCdWlsZFJlcXVlc3QsIEJSVGFyZ2V0LCBCUkxheWVyLCBCUlZhcmlhYmxlLCBCUkJpdGJha2UKKyAgICAgICAgYnIgPSBCdWlsZFJlcXVlc3Qub2JqZWN0cy5jcmVhdGUocHJvamVjdCA9IHNlbGYpCisgICAgICAgIHRyeToKKworICAgICAgICAgICAgQlJCaXRiYWtlLm9iamVjdHMuY3JlYXRlKHJlcSA9IGJyLAorICAgICAgICAgICAgICAgIGdpdHVybCA9IHNlbGYuYml0YmFrZV92ZXJzaW9uLmdpdHVybCwKKyAgICAgICAgICAgICAgICBjb21taXQgPSBzZWxmLmJpdGJha2VfdmVyc2lvbi5icmFuY2gsCisgICAgICAgICAgICAgICAgZGlycGF0aCA9IHNlbGYuYml0YmFrZV92ZXJzaW9uLmRpcnBhdGgpCisKKyAgICAgICAgICAgIGZvciBsIGluIHNlbGYucHJvamVjdGxheWVyX3NldC5hbGwoKS5vcmRlcl9ieSgicGsiKToKKyAgICAgICAgICAgICAgICBjb21taXQgPSBsLmxheWVyY29tbWl0LmdldF92Y3NfcmVmZXJlbmNlKCkKKyAgICAgICAgICAgICAgICBwcmludCgiaWkgQnVpbGRpbmcgbGF5ZXIgIiwgbC5sYXllcmNvbW1pdC5sYXllci5uYW1lLCAiIGF0IHZjcyBwb2ludCAiLCBjb21taXQpCisgICAgICAgICAgICAgICAgQlJMYXllci5vYmplY3RzLmNyZWF0ZShyZXEgPSBiciwgbmFtZSA9IGwubGF5ZXJjb21taXQubGF5ZXIubmFtZSwgZ2l0dXJsID0gbC5sYXllcmNvbW1pdC5sYXllci52Y3NfdXJsLCBjb21taXQgPSBjb21taXQsIGRpcnBhdGggPSBsLmxheWVyY29tbWl0LmRpcnBhdGgpCisKKyAgICAgICAgICAgIGJyLnN0YXRlID0gQnVpbGRSZXF1ZXN0LlJFUV9RVUVVRUQKKyAgICAgICAgICAgIG5vdyA9IHRpbWV6b25lLm5vdygpCisgICAgICAgICAgICBici5idWlsZCA9IEJ1aWxkLm9iamVjdHMuY3JlYXRlKHByb2plY3QgPSBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWRfb249bm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGVkX29uPW5vdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgZm9yIHQgaW4gc2VsZi5wcm9qZWN0dGFyZ2V0X3NldC5hbGwoKToKKyAgICAgICAgICAgICAgICBCUlRhcmdldC5vYmplY3RzLmNyZWF0ZShyZXEgPSBiciwgdGFyZ2V0ID0gdC50YXJnZXQsIHRhc2sgPSB0LnRhc2spCisgICAgICAgICAgICAgICAgVGFyZ2V0Lm9iamVjdHMuY3JlYXRlKGJ1aWxkID0gYnIuYnVpbGQsIHRhcmdldCA9IHQudGFyZ2V0KQorCisgICAgICAgICAgICBmb3IgdiBpbiBzZWxmLnByb2plY3R2YXJpYWJsZV9zZXQuYWxsKCk6CisgICAgICAgICAgICAgICAgQlJWYXJpYWJsZS5vYmplY3RzLmNyZWF0ZShyZXEgPSBiciwgbmFtZSA9IHYubmFtZSwgdmFsdWUgPSB2LnZhbHVlKQorCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBici5idWlsZC5tYWNoaW5lID0gc2VsZi5wcm9qZWN0dmFyaWFibGVfc2V0LmdldChuYW1lID0gJ01BQ0hJTkUnKS52YWx1ZQorICAgICAgICAgICAgICAgIGJyLmJ1aWxkLnNhdmUoKQorICAgICAgICAgICAgZXhjZXB0IFByb2plY3RWYXJpYWJsZS5Eb2VzTm90RXhpc3Q6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgYnIuc2F2ZSgpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAjIHJldmVydCB0aGUgYnVpbGQgcmVxdWVzdCBjcmVhdGlvbiBzaW5jZSB3ZSdyZSBub3QgZG9uZSBjbGVhbmx5CisgICAgICAgICAgICBici5kZWxldGUoKQorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgcmV0dXJuIGJyCisKK2NsYXNzIEJ1aWxkKG1vZGVscy5Nb2RlbCk6CisgICAgU1VDQ0VFREVEID0gMAorICAgIEZBSUxFRCA9IDEKKyAgICBJTl9QUk9HUkVTUyA9IDIKKworICAgIEJVSUxEX09VVENPTUUgPSAoCisgICAgICAgIChTVUNDRUVERUQsICdTdWNjZWVkZWQnKSwKKyAgICAgICAgKEZBSUxFRCwgJ0ZhaWxlZCcpLAorICAgICAgICAoSU5fUFJPR1JFU1MsICdJbiBQcm9ncmVzcycpLAorICAgICkKKworICAgIHNlYXJjaF9hbGxvd2VkX2ZpZWxkcyA9IFsnbWFjaGluZScsICdjb29rZXJfbG9nX3BhdGgnLCAidGFyZ2V0X190YXJnZXQiLCAidGFyZ2V0X190YXJnZXRfaW1hZ2VfZmlsZV9fZmlsZV9uYW1lIl0KKworICAgIHByb2plY3QgPSBtb2RlbHMuRm9yZWlnbktleShQcm9qZWN0KSAgICAgICAgICAgICMgbXVzdCBoYXZlIGEgcHJvamVjdAorICAgIG1hY2hpbmUgPSBtb2RlbHMuQ2hhckZpZWxkKG1heF9sZW5ndGg9MTAwKQorICAgIGRpc3RybyA9IG1vZGVscy5DaGFyRmllbGQobWF4X2xlbmd0aD0xMDApCisgICAgZGlzdHJvX3ZlcnNpb24gPSBtb2RlbHMuQ2hhckZpZWxkKG1heF9sZW5ndGg9MTAwKQorICAgIHN0YXJ0ZWRfb24gPSBtb2RlbHMuRGF0ZVRpbWVGaWVsZCgpCisgICAgY29tcGxldGVkX29uID0gbW9kZWxzLkRhdGVUaW1lRmllbGQoKQorICAgIG91dGNvbWUgPSBtb2RlbHMuSW50ZWdlckZpZWxkKGNob2ljZXM9QlVJTERfT1VUQ09NRSwgZGVmYXVsdD1JTl9QUk9HUkVTUykKKyAgICBjb29rZXJfbG9nX3BhdGggPSBtb2RlbHMuQ2hhckZpZWxkKG1heF9sZW5ndGg9NTAwKQorICAgIGJ1aWxkX25hbWUgPSBtb2RlbHMuQ2hhckZpZWxkKG1heF9sZW5ndGg9MTAwKQorICAgIGJpdGJha2VfdmVyc2lvbiA9IG1vZGVscy5DaGFyRmllbGQobWF4X2xlbmd0aD01MCkKKworICAgIGRlZiBjb21wbGV0ZXBlcihzZWxmKToKKyAgICAgICAgdGYgPSBUYXNrLm9iamVjdHMuZmlsdGVyKGJ1aWxkID0gc2VsZikKKyAgICAgICAgdGZjID0gdGYuY291bnQoKQorICAgICAgICBpZiB0ZmMgPiAwOgorICAgICAgICAgICAgY29tcGxldGVwZXIgPSB0Zi5leGNsdWRlKG9yZGVyX19pc251bGw9VHJ1ZSkuY291bnQoKSoxMDAvdGYuY291bnQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29tcGxldGVwZXIgPSAwCisgICAgICAgIHJldHVybiBjb21wbGV0ZXBlcgorCisgICAgZGVmIGV0YShzZWxmKToKKyAgICAgICAgZXRhID0gdGltZXpvbmUubm93KCkKKyAgICAgICAgY29tcGxldGVwZXIgPSBzZWxmLmNvbXBsZXRlcGVyKCkKKyAgICAgICAgaWYgc2VsZi5jb21wbGV0ZXBlcigpID4gMDoKKyAgICAgICAgICAgIGV0YSArPSAoKGV0YSAtIHNlbGYuc3RhcnRlZF9vbikqKDEwMC1jb21wbGV0ZXBlcikpL2NvbXBsZXRlcGVyCisgICAgICAgIHJldHVybiBldGEKKworCisgICAgZGVmIGdldF9zb3J0ZWRfdGFyZ2V0X2xpc3Qoc2VsZik6CisgICAgICAgIHRndHMgPSBUYXJnZXQub2JqZWN0cy5maWx0ZXIoYnVpbGRfaWQgPSBzZWxmLmlkKS5vcmRlcl9ieSggJ3RhcmdldCcgKTsKKyAgICAgICAgcmV0dXJuKCB0Z3RzICk7CisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgdG9hc3Rlcl9leGNlcHRpb25zKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5sb2dtZXNzYWdlX3NldC5maWx0ZXIobGV2ZWw9TG9nTWVzc2FnZS5FWENFUFRJT04pCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgZXJyb3JzKHNlbGYpOgorICAgICAgICByZXR1cm4gKHNlbGYubG9nbWVzc2FnZV9zZXQuZmlsdGVyKGxldmVsPUxvZ01lc3NhZ2UuRVJST1IpfHNlbGYubG9nbWVzc2FnZV9zZXQuZmlsdGVyKGxldmVsPUxvZ01lc3NhZ2UuRVhDRVBUSU9OKSkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiB3YXJuaW5ncyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubG9nbWVzc2FnZV9zZXQuZmlsdGVyKGxldmVsPUxvZ01lc3NhZ2UuV0FSTklORykKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiB0aW1lc3BlbnRfc2Vjb25kcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIChzZWxmLmNvbXBsZXRlZF9vbiAtIHNlbGYuc3RhcnRlZF9vbikudG90YWxfc2Vjb25kcygpCisKKyAgICBkZWYgZ2V0X2N1cnJlbnRfc3RhdHVzKHNlbGYpOgorICAgICAgICBmcm9tIGJsZGNvbnRyb2wubW9kZWxzIGltcG9ydCBCdWlsZFJlcXVlc3QKKyAgICAgICAgaWYgc2VsZi5vdXRjb21lID09IEJ1aWxkLklOX1BST0dSRVNTIGFuZCBzZWxmLmJ1aWxkcmVxdWVzdC5zdGF0ZSAhPSBCdWlsZFJlcXVlc3QuUkVRX0lOUFJPR1JFU1M6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5idWlsZHJlcXVlc3QuZ2V0X3N0YXRlX2Rpc3BsYXkoKQorICAgICAgICByZXR1cm4gc2VsZi5nZXRfb3V0Y29tZV9kaXNwbGF5KCkKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIiVkICVzICVzIiAlIChzZWxmLmlkLCBzZWxmLnByb2plY3QsICIsIi5qb2luKFt0LnRhcmdldCBmb3IgdCBpbiBzZWxmLnRhcmdldF9zZXQuYWxsKCldKSkKKworCisjIGFuIEFydGlmYWN0IGlzIGFueXRoaW5nIHRoYXQgcmVzdWx0cyBmcm9tIGEgQnVpbGQsIGFuZCBtYXkgYmUgb2YgaW50ZXJlc3QgdG8gdGhlIHVzZXIsIGFuZCBpcyBub3Qgc3RvcmVkIGVsc2V3aGVyZQorY2xhc3MgQnVpbGRBcnRpZmFjdChtb2RlbHMuTW9kZWwpOgorICAgIGJ1aWxkID0gbW9kZWxzLkZvcmVpZ25LZXkoQnVpbGQpCisgICAgZmlsZV9uYW1lID0gbW9kZWxzLkZpbGVQYXRoRmllbGQoKQorICAgIGZpbGVfc2l6ZSA9IG1vZGVscy5JbnRlZ2VyRmllbGQoKQorCisgICAgZGVmIGdldF9sb2NhbF9maWxlX25hbWUoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRlcGxveWRpciA9IFZhcmlhYmxlLm9iamVjdHMuZ2V0KGJ1aWxkID0gc2VsZi5idWlsZCwgdmFyaWFibGVfbmFtZT0iREVQTE9ZX0RJUiIpLnZhcmlhYmxlX3ZhbHVlCisgICAgICAgICAgICByZXR1cm4gIHNlbGYuZmlsZV9uYW1lW2xlbihkZXBsb3lkaXIpKzE6XQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICByYWlzZQorCisgICAgICAgIHJldHVybiBzZWxmLmZpbGVfbmFtZQorCisKKyAgICBkZWYgaXNfYXZhaWxhYmxlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5idWlsZC5idWlsZHJlcXVlc3QuZW52aXJvbm1lbnQuaGFzX2FydGlmYWN0KHNlbGYuZmlsZV9uYW1lKQorCitjbGFzcyBQcm9qZWN0VGFyZ2V0KG1vZGVscy5Nb2RlbCk6CisgICAgcHJvamVjdCA9IG1vZGVscy5Gb3JlaWduS2V5KFByb2plY3QpCisgICAgdGFyZ2V0ID0gbW9kZWxzLkNoYXJGaWVsZChtYXhfbGVuZ3RoPTEwMCkKKyAgICB0YXNrID0gbW9kZWxzLkNoYXJGaWVsZChtYXhfbGVuZ3RoPTEwMCwgbnVsbD1UcnVlKQorCitjbGFzcyBUYXJnZXQobW9kZWxzLk1vZGVsKToKKyAgICBzZWFyY2hfYWxsb3dlZF9maWVsZHMgPSBbJ3RhcmdldCcsICdmaWxlX25hbWUnXQorICAgIGJ1aWxkID0gbW9kZWxzLkZvcmVpZ25LZXkoQnVpbGQpCisgICAgdGFyZ2V0ID0gbW9kZWxzLkNoYXJGaWVsZChtYXhfbGVuZ3RoPTEwMCkKKyAgICB0YXNrID0gbW9kZWxzLkNoYXJGaWVsZChtYXhfbGVuZ3RoPTEwMCwgbnVsbD1UcnVlKQorICAgIGlzX2ltYWdlID0gbW9kZWxzLkJvb2xlYW5GaWVsZChkZWZhdWx0ID0gRmFsc2UpCisgICAgaW1hZ2Vfc2l6ZSA9IG1vZGVscy5JbnRlZ2VyRmllbGQoZGVmYXVsdD0wKQorICAgIGxpY2Vuc2VfbWFuaWZlc3RfcGF0aCA9IG1vZGVscy5DaGFyRmllbGQobWF4X2xlbmd0aD01MDAsIG51bGw9VHJ1ZSkKKworICAgIGRlZiBwYWNrYWdlX2NvdW50KHNlbGYpOgorICAgICAgICByZXR1cm4gVGFyZ2V0X0luc3RhbGxlZF9QYWNrYWdlLm9iamVjdHMuZmlsdGVyKHRhcmdldF9pZF9fZXhhY3Q9c2VsZi5pZCkuY291bnQoKQorCisgICAgZGVmIF9fdW5pY29kZV9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50YXJnZXQKKworY2xhc3MgVGFyZ2V0X0ltYWdlX0ZpbGUobW9kZWxzLk1vZGVsKToKKyAgICB0YXJnZXQgPSBtb2RlbHMuRm9yZWlnbktleShUYXJnZXQpCisgICAgZmlsZV9uYW1lID0gbW9kZWxzLkZpbGVQYXRoRmllbGQobWF4X2xlbmd0aD0yNTQpCisgICAgZmlsZV9zaXplID0gbW9kZWxzLkludGVnZXJGaWVsZCgpCisKK2NsYXNzIFRhcmdldF9GaWxlKG1vZGVscy5Nb2RlbCk6CisgICAgSVRZUEVfUkVHVUxBUiA9IDEKKyAgICBJVFlQRV9ESVJFQ1RPUlkgPSAyCisgICAgSVRZUEVfU1lNTElOSyA9IDMKKyAgICBJVFlQRV9TT0NLRVQgPSA0CisgICAgSVRZUEVfRklGTyA9IDUKKyAgICBJVFlQRV9DSEFSQUNURVIgPSA2CisgICAgSVRZUEVfQkxPQ0sgPSA3CisgICAgSVRZUEVTID0gKCAoSVRZUEVfUkVHVUxBUiAsJ3JlZ3VsYXInKSwKKyAgICAgICAgKCBJVFlQRV9ESVJFQ1RPUlkgLCdkaXJlY3RvcnknKSwKKyAgICAgICAgKCBJVFlQRV9TWU1MSU5LICwnc3ltbGluaycpLAorICAgICAgICAoIElUWVBFX1NPQ0tFVCAsJ3NvY2tldCcpLAorICAgICAgICAoIElUWVBFX0ZJRk8gLCdmaWZvJyksCisgICAgICAgICggSVRZUEVfQ0hBUkFDVEVSICwnY2hhcmFjdGVyJyksCisgICAgICAgICggSVRZUEVfQkxPQ0sgLCdibG9jaycpLAorICAgICAgICApCisKKyAgICB0YXJnZXQgPSBtb2RlbHMuRm9yZWlnbktleShUYXJnZXQpCisgICAgcGF0aCA9IG1vZGVscy5GaWxlUGF0aEZpZWxkKCkKKyAgICBzaXplID0gbW9kZWxzLkludGVnZXJGaWVsZCgpCisgICAgaW5vZGV0eXBlID0gbW9kZWxzLkludGVnZXJGaWVsZChjaG9pY2VzID0gSVRZUEVTKQorICAgIHBlcm1pc3Npb24gPSBtb2RlbHMuQ2hhckZpZWxkKG1heF9sZW5ndGg9MTYpCisgICAgb3duZXIgPSBtb2RlbHMuQ2hhckZpZWxkKG1heF9sZW5ndGg9MTI4KQorICAgIGdyb3VwID0gbW9kZWxzLkNoYXJGaWVsZChtYXhfbGVuZ3RoPTEyOCkKKyAgICBkaXJlY3RvcnkgPSBtb2RlbHMuRm9yZWlnbktleSgnVGFyZ2V0X0ZpbGUnLCByZWxhdGVkX25hbWU9ImRpcmVjdG9yeV9zZXQiLCBudWxsPVRydWUpCisgICAgc3ltX3RhcmdldCA9IG1vZGVscy5Gb3JlaWduS2V5KCdUYXJnZXRfRmlsZScsIHJlbGF0ZWRfbmFtZT0ic3ltbGlua19zZXQiLCBudWxsPVRydWUpCisKKworY2xhc3MgVGFzayhtb2RlbHMuTW9kZWwpOgorCisgICAgU1NUQVRFX05BID0gMAorICAgIFNTVEFURV9NSVNTID0gMQorICAgIFNTVEFURV9GQUlMRUQgPSAyCisgICAgU1NUQVRFX1JFU1RPUkVEID0gMworCisgICAgU1NUQVRFX1JFU1VMVCA9ICgKKyAgICAgICAgKFNTVEFURV9OQSwgJ05vdCBBcHBsaWNhYmxlJyksICMgRm9yIHJlc3Qgb2YgdGFza3MsIGJ1dCB0aGV5IHN0aWxsIG5lZWQgY2hlY2tpbmcuCisgICAgICAgIChTU1RBVEVfTUlTUywgJ0ZpbGUgbm90IGluIGNhY2hlJyksICMgdGhlIHNzdGF0ZSBvYmplY3Qgd2FzIG5vdCBmb3VuZAorICAgICAgICAoU1NUQVRFX0ZBSUxFRCwgJ0ZhaWxlZCcpLCAjIHRoZXJlIHdhcyBhIHBrZywgYnV0IHRoZSBzY3JpcHQgZmFpbGVkCisgICAgICAgIChTU1RBVEVfUkVTVE9SRUQsICdTdWNjZWVkZWQnKSwgIyBzdWNjZXNzZnVsbHkgcmVzdG9yZWQKKyAgICApCisKKyAgICBDT0RJTkdfTkEgPSAwCisgICAgQ09ESU5HX1BZVEhPTiA9IDIKKyAgICBDT0RJTkdfU0hFTEwgPSAzCisKKyAgICBUQVNLX0NPRElORyA9ICgKKyAgICAgICAgKENPRElOR19OQSwgJ04vQScpLAorICAgICAgICAoQ09ESU5HX1BZVEhPTiwgJ1B5dGhvbicpLAorICAgICAgICAoQ09ESU5HX1NIRUxMLCAnU2hlbGwnKSwKKyAgICApCisKKyAgICBPVVRDT01FX05BID0gLTEKKyAgICBPVVRDT01FX1NVQ0NFU1MgPSAwCisgICAgT1VUQ09NRV9DT1ZFUkVEID0gMQorICAgIE9VVENPTUVfQ0FDSEVEID0gMgorICAgIE9VVENPTUVfUFJFQlVJTFQgPSAzCisgICAgT1VUQ09NRV9GQUlMRUQgPSA0CisgICAgT1VUQ09NRV9FTVBUWSA9IDUKKworICAgIFRBU0tfT1VUQ09NRSA9ICgKKyAgICAgICAgKE9VVENPTUVfTkEsICdOb3QgQXZhaWxhYmxlJyksCisgICAgICAgIChPVVRDT01FX1NVQ0NFU1MsICdTdWNjZWVkZWQnKSwKKyAgICAgICAgKE9VVENPTUVfQ09WRVJFRCwgJ0NvdmVyZWQnKSwKKyAgICAgICAgKE9VVENPTUVfQ0FDSEVELCAnQ2FjaGVkJyksCisgICAgICAgIChPVVRDT01FX1BSRUJVSUxULCAnUHJlYnVpbHQnKSwKKyAgICAgICAgKE9VVENPTUVfRkFJTEVELCAnRmFpbGVkJyksCisgICAgICAgIChPVVRDT01FX0VNUFRZLCAnRW1wdHknKSwKKyAgICApCisKKyAgICBUQVNLX09VVENPTUVfSEVMUCA9ICgKKyAgICAgICAgKE9VVENPTUVfU1VDQ0VTUywgJ1RoaXMgdGFzayBzdWNjZXNzZnVsbHkgY29tcGxldGVkJyksCisgICAgICAgIChPVVRDT01FX0NPVkVSRUQsICdUaGlzIHRhc2sgZGlkIG5vdCBydW4gYmVjYXVzZSBpdHMgb3V0cHV0IGlzIHByb3ZpZGVkIGJ5IGFub3RoZXIgdGFzaycpLAorICAgICAgICAoT1VUQ09NRV9DQUNIRUQsICdUaGlzIHRhc2sgcmVzdG9yZWQgb3V0cHV0IGZyb20gdGhlIHNzdGF0ZS1jYWNoZSBkaXJlY3Rvcnkgb3IgbWlycm9ycycpLAorICAgICAgICAoT1VUQ09NRV9QUkVCVUlMVCwgJ1RoaXMgdGFzayBkaWQgbm90IHJ1biBiZWNhdXNlIGl0cyBvdXRjb21lIHdhcyByZXVzZWQgZnJvbSBhIHByZXZpb3VzIGJ1aWxkJyksCisgICAgICAgIChPVVRDT01FX0ZBSUxFRCwgJ1RoaXMgdGFzayBkaWQgbm90IGNvbXBsZXRlJyksCisgICAgICAgIChPVVRDT01FX0VNUFRZLCAnVGhpcyB0YXNrIGhhcyBubyBleGVjdXRhYmxlIGNvbnRlbnQnKSwKKyAgICAgICAgKE9VVENPTUVfTkEsICcnKSwKKyAgICApCisKKyAgICBzZWFyY2hfYWxsb3dlZF9maWVsZHMgPSBbICJyZWNpcGVfX25hbWUiLCAicmVjaXBlX192ZXJzaW9uIiwgInRhc2tfbmFtZSIsICJsb2dmaWxlIiBdCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgc3VwZXIoVGFzaywgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9oZWxwdGV4dCA9IEhlbHBUZXh0Lm9iamVjdHMuZ2V0KGtleT1zZWxmLnRhc2tfbmFtZSwgYXJlYT1IZWxwVGV4dC5WQVJJQUJMRSwgYnVpbGQ9c2VsZi5idWlsZCkudGV4dAorICAgICAgICBleGNlcHQgSGVscFRleHQuRG9lc05vdEV4aXN0OgorICAgICAgICAgICAgc2VsZi5faGVscHRleHQgPSBOb25lCisKKyAgICBkZWYgZ2V0X3JlbGF0ZWRfc2V0c2NlbmUoc2VsZik6CisgICAgICAgIHJldHVybiBUYXNrLm9iamVjdHMuZmlsdGVyKHRhc2tfZXhlY3V0ZWQ9VHJ1ZSwgYnVpbGQgPSBzZWxmLmJ1aWxkLCByZWNpcGUgPSBzZWxmLnJlY2lwZSwgdGFza19uYW1lPXNlbGYudGFza19uYW1lKyJfc2V0c2NlbmUiKQorCisgICAgZGVmIGdldF9vdXRjb21lX3RleHQoc2VsZik6CisgICAgICAgIHJldHVybiBUYXNrLlRBU0tfT1VUQ09NRVtpbnQoc2VsZi5vdXRjb21lKSArIDFdWzFdCisKKyAgICBkZWYgZ2V0X291dGNvbWVfaGVscChzZWxmKToKKyAgICAgICAgcmV0dXJuIFRhc2suVEFTS19PVVRDT01FX0hFTFBbaW50KHNlbGYub3V0Y29tZSldWzFdCisKKyAgICBkZWYgZ2V0X3NzdGF0ZV90ZXh0KHNlbGYpOgorICAgICAgICBpZiBzZWxmLnNzdGF0ZV9yZXN1bHQ9PVRhc2suU1NUQVRFX05BOgorICAgICAgICAgICAgcmV0dXJuICcnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gVGFzay5TU1RBVEVfUkVTVUxUW2ludChzZWxmLnNzdGF0ZV9yZXN1bHQpXVsxXQorCisgICAgZGVmIGdldF9leGVjdXRlZF9kaXNwbGF5KHNlbGYpOgorICAgICAgICBpZiBzZWxmLnRhc2tfZXhlY3V0ZWQ6CisgICAgICAgICAgICByZXR1cm4gIkV4ZWN1dGVkIgorICAgICAgICByZXR1cm4gIk5vdCBFeGVjdXRlZCIKKworICAgIGRlZiBnZXRfZGVzY3JpcHRpb24oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9oZWxwdGV4dAorCisgICAgYnVpbGQgPSBtb2RlbHMuRm9yZWlnbktleShCdWlsZCwgcmVsYXRlZF9uYW1lPSd0YXNrX2J1aWxkJykKKyAgICBvcmRlciA9IG1vZGVscy5JbnRlZ2VyRmllbGQobnVsbD1UcnVlKQorICAgIHRhc2tfZXhlY3V0ZWQgPSBtb2RlbHMuQm9vbGVhbkZpZWxkKGRlZmF1bHQ9RmFsc2UpICMgVHJ1ZSBtZWFucyBFeGVjdXRlZCwgRmFsc2UgbWVhbnMgTm90L0V4ZWN1dGVkCisgICAgb3V0Y29tZSA9IG1vZGVscy5JbnRlZ2VyRmllbGQoY2hvaWNlcz1UQVNLX09VVENPTUUsIGRlZmF1bHQ9T1VUQ09NRV9OQSkKKyAgICBzc3RhdGVfY2hlY2tzdW0gPSBtb2RlbHMuQ2hhckZpZWxkKG1heF9sZW5ndGg9MTAwLCBibGFuaz1UcnVlKQorICAgIHBhdGhfdG9fc3N0YXRlX29iaiA9IG1vZGVscy5GaWxlUGF0aEZpZWxkKG1heF9sZW5ndGg9NTAwLCBibGFuaz1UcnVlKQorICAgIHJlY2lwZSA9IG1vZGVscy5Gb3JlaWduS2V5KCdSZWNpcGUnLCByZWxhdGVkX25hbWU9J3Rhc2tzJykKKyAgICB0YXNrX25hbWUgPSBtb2RlbHMuQ2hhckZpZWxkKG1heF9sZW5ndGg9MTAwKQorICAgIHNvdXJjZV91cmwgPSBtb2RlbHMuRmlsZVBhdGhGaWVsZChtYXhfbGVuZ3RoPTI1NSwgYmxhbms9VHJ1ZSkKKyAgICB3b3JrX2RpcmVjdG9yeSA9IG1vZGVscy5GaWxlUGF0aEZpZWxkKG1heF9sZW5ndGg9MjU1LCBibGFuaz1UcnVlKQorICAgIHNjcmlwdF90eXBlID0gbW9kZWxzLkludGVnZXJGaWVsZChjaG9pY2VzPVRBU0tfQ09ESU5HLCBkZWZhdWx0PUNPRElOR19OQSkKKyAgICBsaW5lX251bWJlciA9IG1vZGVscy5JbnRlZ2VyRmllbGQoZGVmYXVsdD0wKQorICAgIGRpc2tfaW8gPSBtb2RlbHMuSW50ZWdlckZpZWxkKG51bGw9VHJ1ZSkKKyAgICBjcHVfdXNhZ2UgPSBtb2RlbHMuRGVjaW1hbEZpZWxkKG1heF9kaWdpdHM9OCwgZGVjaW1hbF9wbGFjZXM9MiwgbnVsbD1UcnVlKQorICAgIGVsYXBzZWRfdGltZSA9IG1vZGVscy5EZWNpbWFsRmllbGQobWF4X2RpZ2l0cz04LCBkZWNpbWFsX3BsYWNlcz0yLCBudWxsPVRydWUpCisgICAgc3N0YXRlX3Jlc3VsdCA9IG1vZGVscy5JbnRlZ2VyRmllbGQoY2hvaWNlcz1TU1RBVEVfUkVTVUxULCBkZWZhdWx0PVNTVEFURV9OQSkKKyAgICBtZXNzYWdlID0gbW9kZWxzLkNoYXJGaWVsZChtYXhfbGVuZ3RoPTI0MCkKKyAgICBsb2dmaWxlID0gbW9kZWxzLkZpbGVQYXRoRmllbGQobWF4X2xlbmd0aD0yNTUsIGJsYW5rPVRydWUpCisKKyAgICBvdXRjb21lX3RleHQgPSBwcm9wZXJ0eShnZXRfb3V0Y29tZV90ZXh0KQorICAgIHNzdGF0ZV90ZXh0ICA9IHByb3BlcnR5KGdldF9zc3RhdGVfdGV4dCkKKworICAgIGRlZiBfX3VuaWNvZGVfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICIlZCglZCkgJXM6JXMiICUgKHNlbGYucGssIHNlbGYuYnVpbGQucGssIHNlbGYucmVjaXBlLm5hbWUsIHNlbGYudGFza19uYW1lKQorCisgICAgY2xhc3MgTWV0YToKKyAgICAgICAgb3JkZXJpbmcgPSAoJ29yZGVyJywgJ3JlY2lwZScgLCkKKyAgICAgICAgdW5pcXVlX3RvZ2V0aGVyID0gKCdidWlsZCcsICdyZWNpcGUnLCAndGFza19uYW1lJywgKQorCisKK2NsYXNzIFRhc2tfRGVwZW5kZW5jeShtb2RlbHMuTW9kZWwpOgorICAgIHRhc2sgPSBtb2RlbHMuRm9yZWlnbktleShUYXNrLCByZWxhdGVkX25hbWU9J3Rhc2tfZGVwZW5kZW5jaWVzX3Rhc2snKQorICAgIGRlcGVuZHNfb24gPSBtb2RlbHMuRm9yZWlnbktleShUYXNrLCByZWxhdGVkX25hbWU9J3Rhc2tfZGVwZW5kZW5jaWVzX2RlcGVuZHMnKQorCitjbGFzcyBQYWNrYWdlKG1vZGVscy5Nb2RlbCk6CisgICAgc2VhcmNoX2FsbG93ZWRfZmllbGRzID0gWyduYW1lJywgJ3ZlcnNpb24nLCAncmV2aXNpb24nLCAncmVjaXBlX19uYW1lJywgJ3JlY2lwZV9fdmVyc2lvbicsICdyZWNpcGVfX2xpY2Vuc2UnLCAncmVjaXBlX19sYXllcl92ZXJzaW9uX19sYXllcl9fbmFtZScsICdyZWNpcGVfX2xheWVyX3ZlcnNpb25fX2JyYW5jaCcsICdyZWNpcGVfX2xheWVyX3ZlcnNpb25fX2NvbW1pdCcsICdyZWNpcGVfX2xheWVyX3ZlcnNpb25fX2xvY2FsX3BhdGgnLCAnaW5zdGFsbGVkX25hbWUnXQorICAgIGJ1aWxkID0gbW9kZWxzLkZvcmVpZ25LZXkoJ0J1aWxkJykKKyAgICByZWNpcGUgPSBtb2RlbHMuRm9yZWlnbktleSgnUmVjaXBlJywgbnVsbD1UcnVlKQorICAgIG5hbWUgPSBtb2RlbHMuQ2hhckZpZWxkKG1heF9sZW5ndGg9MTAwKQorICAgIGluc3RhbGxlZF9uYW1lID0gbW9kZWxzLkNoYXJGaWVsZChtYXhfbGVuZ3RoPTEwMCwgZGVmYXVsdD0nJykKKyAgICB2ZXJzaW9uID0gbW9kZWxzLkNoYXJGaWVsZChtYXhfbGVuZ3RoPTEwMCwgYmxhbms9VHJ1ZSkKKyAgICByZXZpc2lvbiA9IG1vZGVscy5DaGFyRmllbGQobWF4X2xlbmd0aD0zMiwgYmxhbms9VHJ1ZSkKKyAgICBzdW1tYXJ5ID0gbW9kZWxzLlRleHRGaWVsZChibGFuaz1UcnVlKQorICAgIGRlc2NyaXB0aW9uID0gbW9kZWxzLlRleHRGaWVsZChibGFuaz1UcnVlKQorICAgIHNpemUgPSBtb2RlbHMuSW50ZWdlckZpZWxkKGRlZmF1bHQ9MCkKKyAgICBpbnN0YWxsZWRfc2l6ZSA9IG1vZGVscy5JbnRlZ2VyRmllbGQoZGVmYXVsdD0wKQorICAgIHNlY3Rpb24gPSBtb2RlbHMuQ2hhckZpZWxkKG1heF9sZW5ndGg9ODAsIGJsYW5rPVRydWUpCisgICAgbGljZW5zZSA9IG1vZGVscy5DaGFyRmllbGQobWF4X2xlbmd0aD04MCwgYmxhbms9VHJ1ZSkKKworY2xhc3MgUGFja2FnZV9EZXBlbmRlbmN5TWFuYWdlcihtb2RlbHMuTWFuYWdlcik6CisgICAgdXNlX2Zvcl9yZWxhdGVkX2ZpZWxkcyA9IFRydWUKKworICAgIGRlZiBnZXRfcXVlcnlfc2V0KHNlbGYpOgorICAgICAgICByZXR1cm4gc3VwZXIoUGFja2FnZV9EZXBlbmRlbmN5TWFuYWdlciwgc2VsZikuZ2V0X3F1ZXJ5X3NldCgpLmV4Y2x1ZGUocGFja2FnZV9pZCA9IEYoJ2RlcGVuZHNfb25fX2lkJykpCisKK2NsYXNzIFBhY2thZ2VfRGVwZW5kZW5jeShtb2RlbHMuTW9kZWwpOgorICAgIFRZUEVfUkRFUEVORFMgPSAwCisgICAgVFlQRV9UUkRFUEVORFMgPSAxCisgICAgVFlQRV9SUkVDT01NRU5EUyA9IDIKKyAgICBUWVBFX1RSRUNPTU1FTkRTID0gMworICAgIFRZUEVfUlNVR0dFU1RTID0gNAorICAgIFRZUEVfUlBST1ZJREVTID0gNQorICAgIFRZUEVfUlJFUExBQ0VTID0gNgorICAgIFRZUEVfUkNPTkZMSUNUUyA9IDcKKyAgICAnIFRPRE86IGJwYWNrYWdlIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHJlbW92ZSB0aGUgREVQRU5EU19UWVBFIGFjY2VzcyAnCisgICAgREVQRU5EU19UWVBFID0gKAorICAgICAgICAoVFlQRV9SREVQRU5EUywgImRlcGVuZHMiKSwKKyAgICAgICAgKFRZUEVfVFJERVBFTkRTLCAiZGVwZW5kcyIpLAorICAgICAgICAoVFlQRV9UUkVDT01NRU5EUywgInJlY29tbWVuZHMiKSwKKyAgICAgICAgKFRZUEVfUlJFQ09NTUVORFMsICJyZWNvbW1lbmRzIiksCisgICAgICAgIChUWVBFX1JTVUdHRVNUUywgInN1Z2dlc3RzIiksCisgICAgICAgIChUWVBFX1JQUk9WSURFUywgInByb3ZpZGVzIiksCisgICAgICAgIChUWVBFX1JSRVBMQUNFUywgInJlcGxhY2VzIiksCisgICAgICAgIChUWVBFX1JDT05GTElDVFMsICJjb25mbGljdHMiKSwKKyAgICApCisgICAgIiIiIEluZGV4ZWQgYnkgZGVwX3R5cGUsIGluIHZpZXcgb3JkZXIsIGtleSBmb3Igc2hvcnQgbmFtZSBhbmQgaGVscAorICAgICAgICBkZXNjcmlwdGlvbiB3aGljaCB3aGVuIHZpZXdlZCB3aWxsIGJlIHByaW50ZidkIHdpdGggdGhlCisgICAgICAgIHBhY2thZ2UgbmFtZS4KKyAgICAiIiIKKyAgICBERVBFTkRTX0RJQ1QgPSB7CisgICAgICAgIFRZUEVfUkRFUEVORFMgOiAgICAgKCJkZXBlbmRzIiwgIiVzIGlzIHJlcXVpcmVkIHRvIHJ1biAlcyIpLAorICAgICAgICBUWVBFX1RSREVQRU5EUyA6ICAgICgiZGVwZW5kcyIsICIlcyBpcyByZXF1aXJlZCB0byBydW4gJXMiKSwKKyAgICAgICAgVFlQRV9UUkVDT01NRU5EUyA6ICAoInJlY29tbWVuZHMiLCAiJXMgZXh0ZW5kcyB0aGUgdXNhYmlsaXR5IG9mICVzIiksCisgICAgICAgIFRZUEVfUlJFQ09NTUVORFMgOiAgKCJyZWNvbW1lbmRzIiwgIiVzIGV4dGVuZHMgdGhlIHVzYWJpbGl0eSBvZiAlcyIpLAorICAgICAgICBUWVBFX1JTVUdHRVNUUyA6ICAgICgic3VnZ2VzdHMiLCAiJXMgaXMgc3VnZ2VzdGVkIGZvciBpbnN0YWxsYXRpb24gd2l0aCAlcyIpLAorICAgICAgICBUWVBFX1JQUk9WSURFUyA6ICAgICgicHJvdmlkZXMiLCAiJXMgaXMgcHJvdmlkZWQgYnkgJXMiKSwKKyAgICAgICAgVFlQRV9SUkVQTEFDRVMgOiAgICAoInJlcGxhY2VzIiwgIiVzIGlzIHJlcGxhY2VkIGJ5ICVzIiksCisgICAgICAgIFRZUEVfUkNPTkZMSUNUUyA6ICAgKCJjb25mbGljdHMiLCAiJXMgY29uZmxpY3RzIHdpdGggJXMsIHdoaWNoIHdpbGwgbm90IGJlIGluc3RhbGxlZCBpZiB0aGlzIHBhY2thZ2UgaXMgbm90IGZpcnN0IHJlbW92ZWQiKSwKKyAgICB9CisKKyAgICBwYWNrYWdlID0gbW9kZWxzLkZvcmVpZ25LZXkoUGFja2FnZSwgcmVsYXRlZF9uYW1lPSdwYWNrYWdlX2RlcGVuZGVuY2llc19zb3VyY2UnKQorICAgIGRlcGVuZHNfb24gPSBtb2RlbHMuRm9yZWlnbktleShQYWNrYWdlLCByZWxhdGVkX25hbWU9J3BhY2thZ2VfZGVwZW5kZW5jaWVzX3RhcmdldCcpICAgIyBzb2Z0IGRlcGVuZGVuY3kKKyAgICBkZXBfdHlwZSA9IG1vZGVscy5JbnRlZ2VyRmllbGQoY2hvaWNlcz1ERVBFTkRTX1RZUEUpCisgICAgdGFyZ2V0ID0gbW9kZWxzLkZvcmVpZ25LZXkoVGFyZ2V0LCBudWxsPVRydWUpCisgICAgb2JqZWN0cyA9IFBhY2thZ2VfRGVwZW5kZW5jeU1hbmFnZXIoKQorCitjbGFzcyBUYXJnZXRfSW5zdGFsbGVkX1BhY2thZ2UobW9kZWxzLk1vZGVsKToKKyAgICB0YXJnZXQgPSBtb2RlbHMuRm9yZWlnbktleShUYXJnZXQpCisgICAgcGFja2FnZSA9IG1vZGVscy5Gb3JlaWduS2V5KFBhY2thZ2UsIHJlbGF0ZWRfbmFtZT0nYnVpbGR0YXJnZXRsaXN0X3BhY2thZ2UnKQorCitjbGFzcyBQYWNrYWdlX0ZpbGUobW9kZWxzLk1vZGVsKToKKyAgICBwYWNrYWdlID0gbW9kZWxzLkZvcmVpZ25LZXkoUGFja2FnZSwgcmVsYXRlZF9uYW1lPSdidWlsZGZpbGVsaXN0X3BhY2thZ2UnKQorICAgIHBhdGggPSBtb2RlbHMuRmlsZVBhdGhGaWVsZChtYXhfbGVuZ3RoPTI1NSwgYmxhbms9VHJ1ZSkKKyAgICBzaXplID0gbW9kZWxzLkludGVnZXJGaWVsZCgpCisKK2NsYXNzIFJlY2lwZShtb2RlbHMuTW9kZWwpOgorICAgIHNlYXJjaF9hbGxvd2VkX2ZpZWxkcyA9IFsnbmFtZScsICd2ZXJzaW9uJywgJ2ZpbGVfcGF0aCcsICdzZWN0aW9uJywgJ3N1bW1hcnknLCAnZGVzY3JpcHRpb24nLCAnbGljZW5zZScsICdsYXllcl92ZXJzaW9uX19sYXllcl9fbmFtZScsICdsYXllcl92ZXJzaW9uX19icmFuY2gnLCAnbGF5ZXJfdmVyc2lvbl9fY29tbWl0JywgJ2xheWVyX3ZlcnNpb25fX2xvY2FsX3BhdGgnLCAnbGF5ZXJfdmVyc2lvbl9fbGF5ZXJfc291cmNlX19uYW1lJ10KKworICAgIGxheWVyX3NvdXJjZSA9IG1vZGVscy5Gb3JlaWduS2V5KCdMYXllclNvdXJjZScsIGRlZmF1bHQgPSBOb25lLCBudWxsID0gVHJ1ZSkgICMgZnJvbSB3aGVyZSBkaWQgd2UgZ2V0IHRoaXMgcmVjaXBlCisgICAgdXBfaWQgPSBtb2RlbHMuSW50ZWdlckZpZWxkKG51bGwgPSBUcnVlLCBkZWZhdWx0ID0gTm9uZSkgICAgICAgICAgICAgICAgICAgICMgaWQgb2YgZW50cnkgaW4gdGhlIHNvdXJjZQorICAgIHVwX2RhdGUgPSBtb2RlbHMuRGF0ZVRpbWVGaWVsZChudWxsID0gVHJ1ZSwgZGVmYXVsdCA9IE5vbmUpCisKKyAgICBuYW1lID0gbW9kZWxzLkNoYXJGaWVsZChtYXhfbGVuZ3RoPTEwMCwgYmxhbms9VHJ1ZSkgICAgICAgICAgICAgICAgICMgcG4KKyAgICB2ZXJzaW9uID0gbW9kZWxzLkNoYXJGaWVsZChtYXhfbGVuZ3RoPTEwMCwgYmxhbms9VHJ1ZSkgICAgICAgICAgICAgICMgcHYKKyAgICBsYXllcl92ZXJzaW9uID0gbW9kZWxzLkZvcmVpZ25LZXkoJ0xheWVyX1ZlcnNpb24nLCByZWxhdGVkX25hbWU9J3JlY2lwZV9sYXllcl92ZXJzaW9uJykKKyAgICBzdW1tYXJ5ID0gbW9kZWxzLlRleHRGaWVsZChibGFuaz1UcnVlKQorICAgIGRlc2NyaXB0aW9uID0gbW9kZWxzLlRleHRGaWVsZChibGFuaz1UcnVlKQorICAgIHNlY3Rpb24gPSBtb2RlbHMuQ2hhckZpZWxkKG1heF9sZW5ndGg9MTAwLCBibGFuaz1UcnVlKQorICAgIGxpY2Vuc2UgPSBtb2RlbHMuQ2hhckZpZWxkKG1heF9sZW5ndGg9MjAwLCBibGFuaz1UcnVlKQorICAgIGhvbWVwYWdlID0gbW9kZWxzLlVSTEZpZWxkKGJsYW5rPVRydWUpCisgICAgYnVndHJhY2tlciA9IG1vZGVscy5VUkxGaWVsZChibGFuaz1UcnVlKQorICAgIGZpbGVfcGF0aCA9IG1vZGVscy5GaWxlUGF0aEZpZWxkKG1heF9sZW5ndGg9MjU1KQorICAgIHBhdGhmbGFncyA9IG1vZGVscy5DaGFyRmllbGQobWF4X2xlbmd0aD0yMDAsIGJsYW5rPVRydWUpCisgICAgaXNfaW1hZ2UgPSBtb2RlbHMuQm9vbGVhbkZpZWxkKGRlZmF1bHQ9RmFsc2UpCisKKyAgICBkZWYgZ2V0X2xheWVyc291cmNlX3ZpZXdfdXJsKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmxheWVyX3NvdXJjZSBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuICIiCisKKyAgICAgICAgdXJsID0gc2VsZi5sYXllcl9zb3VyY2UuZ2V0X29iamVjdF92aWV3KHNlbGYubGF5ZXJfdmVyc2lvbi51cF9icmFuY2gsICJyZWNpcGVzIiwgc2VsZi5uYW1lKQorICAgICAgICByZXR1cm4gdXJsCisKKyAgICBkZWYgX191bmljb2RlX18oc2VsZik6CisgICAgICAgIHJldHVybiAiUmVjaXBlICIgKyBzZWxmLm5hbWUgKyAiOiIgKyBzZWxmLnZlcnNpb24KKworICAgIGRlZiBnZXRfdmNzX3JlY2lwZV9maWxlX2xpbmtfdXJsKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5sYXllcl92ZXJzaW9uLmdldF92Y3NfZmlsZV9saW5rX3VybChzZWxmLmZpbGVfcGF0aCkKKworICAgIGRlZiBnZXRfZGVzY3JpcHRpb25fb3Jfc3VtbWFyeShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5kZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmRlc2NyaXB0aW9uCisgICAgICAgIGVsaWYgc2VsZi5zdW1tYXJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3VtbWFyeQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICIiCisKKyAgICBjbGFzcyBNZXRhOgorICAgICAgICB1bmlxdWVfdG9nZXRoZXIgPSAoKCJsYXllcl92ZXJzaW9uIiwgImZpbGVfcGF0aCIsICJwYXRoZmxhZ3MiKSwgKQorCisKK2NsYXNzIFJlY2lwZV9EZXBlbmRlbmN5TWFuYWdlcihtb2RlbHMuTWFuYWdlcik6CisgICAgdXNlX2Zvcl9yZWxhdGVkX2ZpZWxkcyA9IFRydWUKKworICAgIGRlZiBnZXRfcXVlcnlfc2V0KHNlbGYpOgorICAgICAgICByZXR1cm4gc3VwZXIoUmVjaXBlX0RlcGVuZGVuY3lNYW5hZ2VyLCBzZWxmKS5nZXRfcXVlcnlfc2V0KCkuZXhjbHVkZShyZWNpcGVfaWQgPSBGKCdkZXBlbmRzX29uX19pZCcpKQorCitjbGFzcyBSZWNpcGVfRGVwZW5kZW5jeShtb2RlbHMuTW9kZWwpOgorICAgIFRZUEVfREVQRU5EUyA9IDAKKyAgICBUWVBFX1JERVBFTkRTID0gMQorCisgICAgREVQRU5EU19UWVBFID0gKAorICAgICAgICAoVFlQRV9ERVBFTkRTLCAiZGVwZW5kcyIpLAorICAgICAgICAoVFlQRV9SREVQRU5EUywgInJkZXBlbmRzIiksCisgICAgKQorICAgIHJlY2lwZSA9IG1vZGVscy5Gb3JlaWduS2V5KFJlY2lwZSwgcmVsYXRlZF9uYW1lPSdyX2RlcGVuZGVuY2llc19yZWNpcGUnKQorICAgIGRlcGVuZHNfb24gPSBtb2RlbHMuRm9yZWlnbktleShSZWNpcGUsIHJlbGF0ZWRfbmFtZT0ncl9kZXBlbmRlbmNpZXNfZGVwZW5kcycpCisgICAgZGVwX3R5cGUgPSBtb2RlbHMuSW50ZWdlckZpZWxkKGNob2ljZXM9REVQRU5EU19UWVBFKQorICAgIG9iamVjdHMgPSBSZWNpcGVfRGVwZW5kZW5jeU1hbmFnZXIoKQorCisKK2NsYXNzIE1hY2hpbmUobW9kZWxzLk1vZGVsKToKKyAgICBzZWFyY2hfYWxsb3dlZF9maWVsZHMgPSBbIm5hbWUiLCAiZGVzY3JpcHRpb24iLCAibGF5ZXJfdmVyc2lvbl9fbGF5ZXJfX25hbWUiXQorICAgIGxheWVyX3NvdXJjZSA9IG1vZGVscy5Gb3JlaWduS2V5KCdMYXllclNvdXJjZScsIGRlZmF1bHQgPSBOb25lLCBudWxsID0gVHJ1ZSkgICMgZnJvbSB3aGVyZSBkaWQgd2UgZ2V0IHRoaXMgbWFjaGluZQorICAgIHVwX2lkID0gbW9kZWxzLkludGVnZXJGaWVsZChudWxsID0gVHJ1ZSwgZGVmYXVsdCA9IE5vbmUpICAgICAgICAgICAgICAgICAgICAgICMgaWQgb2YgZW50cnkgaW4gdGhlIHNvdXJjZQorICAgIHVwX2RhdGUgPSBtb2RlbHMuRGF0ZVRpbWVGaWVsZChudWxsID0gVHJ1ZSwgZGVmYXVsdCA9IE5vbmUpCisKKyAgICBsYXllcl92ZXJzaW9uID0gbW9kZWxzLkZvcmVpZ25LZXkoJ0xheWVyX1ZlcnNpb24nKQorICAgIG5hbWUgPSBtb2RlbHMuQ2hhckZpZWxkKG1heF9sZW5ndGg9MjU1KQorICAgIGRlc2NyaXB0aW9uID0gbW9kZWxzLkNoYXJGaWVsZChtYXhfbGVuZ3RoPTI1NSkKKworICAgIGRlZiBnZXRfdmNzX21hY2hpbmVfZmlsZV9saW5rX3VybChzZWxmKToKKyAgICAgICAgcGF0aCA9ICdjb25mL21hY2hpbmUvJytzZWxmLm5hbWUrJy5jb25mJworCisgICAgICAgIHJldHVybiBzZWxmLmxheWVyX3ZlcnNpb24uZ2V0X3Zjc19maWxlX2xpbmtfdXJsKHBhdGgpCisKKyAgICBkZWYgX191bmljb2RlX18oc2VsZik6CisgICAgICAgIHJldHVybiAiTWFjaGluZSAiICsgc2VsZi5uYW1lICsgIigiICsgc2VsZi5kZXNjcmlwdGlvbiArICIpIgorCisgICAgY2xhc3MgTWV0YToKKyAgICAgICAgdW5pcXVlX3RvZ2V0aGVyID0gKCJsYXllcl9zb3VyY2UiLCAidXBfaWQiKQorCisKK2Zyb20gZGphbmdvLmRiLm1vZGVscy5iYXNlIGltcG9ydCBNb2RlbEJhc2UKKworY2xhc3MgSW5oZXJpdGFuY2VNZXRhY2xhc3MoTW9kZWxCYXNlKToKKyAgICBkZWYgX19jYWxsX18oY2xzLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBvYmogPSBzdXBlcihJbmhlcml0YW5jZU1ldGFjbGFzcywgY2xzKS5fX2NhbGxfXygqYXJncywgKiprd2FyZ3MpCisgICAgICAgIHJldHVybiBvYmouZ2V0X29iamVjdCgpCisKKworY2xhc3MgTGF5ZXJTb3VyY2UobW9kZWxzLk1vZGVsKToKKyAgICBfX21ldGFjbGFzc19fID0gSW5oZXJpdGFuY2VNZXRhY2xhc3MKKworICAgIGNsYXNzIE1ldGE6CisgICAgICAgIHVuaXF1ZV90b2dldGhlciA9ICgoJ3NvdXJjZXR5cGUnLCAnYXBpdXJsJyksICkKKworICAgIFRZUEVfTE9DQUwgPSAwCisgICAgVFlQRV9MQVlFUklOREVYID0gMQorICAgIFRZUEVfSU1QT1JURUQgPSAyCisgICAgU09VUkNFX1RZUEUgPSAoCisgICAgICAgIChUWVBFX0xPQ0FMLCAibG9jYWwiKSwKKyAgICAgICAgKFRZUEVfTEFZRVJJTkRFWCwgImxheWVyaW5kZXgiKSwKKyAgICAgICAgKFRZUEVfSU1QT1JURUQsICJpbXBvcnRlZCIpLAorICAgICAgKQorCisgICAgbmFtZSA9IG1vZGVscy5DaGFyRmllbGQobWF4X2xlbmd0aD02MywgdW5pcXVlID0gVHJ1ZSkKKyAgICBzb3VyY2V0eXBlID0gbW9kZWxzLkludGVnZXJGaWVsZChjaG9pY2VzPVNPVVJDRV9UWVBFKQorICAgIGFwaXVybCA9IG1vZGVscy5DaGFyRmllbGQobWF4X2xlbmd0aD0yNTUsIG51bGw9VHJ1ZSwgZGVmYXVsdD1Ob25lKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHN1cGVyKExheWVyU291cmNlLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCisgICAgICAgIGlmIHNlbGYuc291cmNldHlwZSA9PSBMYXllclNvdXJjZS5UWVBFX0xPQ0FMOgorICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18gPSBMb2NhbExheWVyU291cmNlCisgICAgICAgIGVsaWYgc2VsZi5zb3VyY2V0eXBlID09IExheWVyU291cmNlLlRZUEVfTEFZRVJJTkRFWDoKKyAgICAgICAgICAgIHNlbGYuX19jbGFzc19fID0gTGF5ZXJJbmRleExheWVyU291cmNlCisgICAgICAgIGVsaWYgc2VsZi5zb3VyY2V0eXBlID09IExheWVyU291cmNlLlRZUEVfSU1QT1JURUQ6CisgICAgICAgICAgICBzZWxmLl9fY2xhc3NfXyA9IEltcG9ydGVkTGF5ZXJTb3VyY2UKKyAgICAgICAgZWxpZiBzZWxmLnNvdXJjZXR5cGUgPT0gTm9uZToKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiVW5rbm93biBMYXllclNvdXJjZS1kZXJpdmVkIGNsYXNzLiBJZiB5b3UgYWRkZWQgYSBuZXcgbGF5ZXIgc291cmNlIHR5cGUsIGZpbGwgb3V0IGFsbCBjb2RlIHN0dWJzLiIpCisKKworICAgIGRlZiB1cGRhdGUoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICAgICAgVXBkYXRlcyB0aGUgbG9jYWwgZGF0YWJhc2UgaW5mb3JtYXRpb24gZnJvbSB0aGUgdXBzdHJlYW0gbGF5ZXIgc291cmNlCisgICAgICAgICIiIgorICAgICAgICByYWlzZSBFeGNlcHRpb24oIkFic3RyYWN0LCB1cGRhdGUoKSBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGFsbCBMYXllclNvdXJjZS1kZXJpdmVkIGNsYXNzZXMgKG9iamVjdCBpcyAlcykiICUgc3RyKHZhcnMoc2VsZikpKQorCisgICAgZGVmIHNhdmUoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHN1cGVyKExheWVyU291cmNlLCBzZWxmKS5zYXZlKCphcmdzLCAqKmt3YXJncykKKworICAgIGRlZiBnZXRfb2JqZWN0KHNlbGYpOgorICAgICAgICAjIHByZXNldCBhbiB1bi1pbml0aWxpemVkIG9iamVjdAorICAgICAgICBpZiBOb25lID09IHNlbGYubmFtZToKKyAgICAgICAgICAgIHNlbGYubmFtZT0iIgorICAgICAgICBpZiBOb25lID09IHNlbGYuYXBpdXJsOgorICAgICAgICAgICAgc2VsZi5hcGl1cmw9IiIKKyAgICAgICAgaWYgTm9uZSA9PSBzZWxmLnNvdXJjZXR5cGU6CisgICAgICAgICAgICBzZWxmLnNvdXJjZXR5cGU9TGF5ZXJTb3VyY2UuVFlQRV9MT0NBTAorCisgICAgICAgIGlmIHNlbGYuc291cmNldHlwZSA9PSBMYXllclNvdXJjZS5UWVBFX0xPQ0FMOgorICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18gPSBMb2NhbExheWVyU291cmNlCisgICAgICAgIGVsaWYgc2VsZi5zb3VyY2V0eXBlID09IExheWVyU291cmNlLlRZUEVfTEFZRVJJTkRFWDoKKyAgICAgICAgICAgIHNlbGYuX19jbGFzc19fID0gTGF5ZXJJbmRleExheWVyU291cmNlCisgICAgICAgIGVsaWYgc2VsZi5zb3VyY2V0eXBlID09IExheWVyU291cmNlLlRZUEVfSU1QT1JURUQ6CisgICAgICAgICAgICBzZWxmLl9fY2xhc3NfXyA9IEltcG9ydGVkTGF5ZXJTb3VyY2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiVW5rbm93biBMYXllclNvdXJjZSB0eXBlLiBJZiB5b3UgYWRkZWQgYSBuZXcgbGF5ZXIgc291cmNlIHR5cGUsIGZpbGwgb3V0IGFsbCBjb2RlIHN0dWJzLiIpCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX191bmljb2RlX18oc2VsZik6CisgICAgICAgIHJldHVybiAiJXMgKCVzKSIgJSAoc2VsZi5uYW1lLCBzZWxmLnNvdXJjZXR5cGUpCisKKworY2xhc3MgTG9jYWxMYXllclNvdXJjZShMYXllclNvdXJjZSk6CisgICAgY2xhc3MgTWV0YShMYXllclNvdXJjZS5fbWV0YS5fX2NsYXNzX18pOgorICAgICAgICBwcm94eSA9IFRydWUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBzdXBlcihMb2NhbExheWVyU291cmNlLCBzZWxmKS5fX2luaXRfXyhhcmdzLCBrd2FyZ3MpCisgICAgICAgIHNlbGYuc291cmNldHlwZSA9IExheWVyU291cmNlLlRZUEVfTE9DQUwKKworICAgIGRlZiB1cGRhdGUoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICAgICAgRmV0Y2hlcyBsYXllciwgcmVjaXBlIGFuZCBtYWNoaW5lIGluZm9ybWF0aW9uIGZyb20gbG9jYWwgcmVwb3NpdG9yeQorICAgICAgICAiIiIKKyAgICAgICAgcGFzcworCitjbGFzcyBJbXBvcnRlZExheWVyU291cmNlKExheWVyU291cmNlKToKKyAgICBjbGFzcyBNZXRhKExheWVyU291cmNlLl9tZXRhLl9fY2xhc3NfXyk6CisgICAgICAgIHByb3h5ID0gVHJ1ZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHN1cGVyKEltcG9ydGVkTGF5ZXJTb3VyY2UsIHNlbGYpLl9faW5pdF9fKGFyZ3MsIGt3YXJncykKKyAgICAgICAgc2VsZi5zb3VyY2V0eXBlID0gTGF5ZXJTb3VyY2UuVFlQRV9JTVBPUlRFRAorCisgICAgZGVmIHVwZGF0ZShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgICAgICBGZXRjaGVzIGxheWVyLCByZWNpcGUgYW5kIG1hY2hpbmUgaW5mb3JtYXRpb24gZnJvbSBsb2NhbCByZXBvc2l0b3J5CisgICAgICAgICIiIgorICAgICAgICBwYXNzCisKKworY2xhc3MgTGF5ZXJJbmRleExheWVyU291cmNlKExheWVyU291cmNlKToKKyAgICBjbGFzcyBNZXRhKExheWVyU291cmNlLl9tZXRhLl9fY2xhc3NfXyk6CisgICAgICAgIHByb3h5ID0gVHJ1ZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHN1cGVyKExheWVySW5kZXhMYXllclNvdXJjZSwgc2VsZikuX19pbml0X18oYXJncywga3dhcmdzKQorICAgICAgICBzZWxmLnNvdXJjZXR5cGUgPSBMYXllclNvdXJjZS5UWVBFX0xBWUVSSU5ERVgKKworICAgIGRlZiBnZXRfb2JqZWN0X3ZpZXcoc2VsZiwgYnJhbmNoLCBvYmplY3R5cGUsIHVwaWQpOgorICAgICAgICByZXR1cm4gc2VsZi5hcGl1cmwgKyAiLi4vYnJhbmNoLyIgKyBicmFuY2gubmFtZSArICIvIiArIG9iamVjdHlwZSArICIvP3E9IiArIHN0cih1cGlkKQorCisgICAgZGVmIHVwZGF0ZShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgICAgICBGZXRjaGVzIGxheWVyLCByZWNpcGUgYW5kIG1hY2hpbmUgaW5mb3JtYXRpb24gZnJvbSByZW1vdGUgcmVwb3NpdG9yeQorICAgICAgICAiIiIKKyAgICAgICAgYXNzZXJ0IHNlbGYuYXBpdXJsIGlzIG5vdCBOb25lCisgICAgICAgIGZyb20gZGphbmdvLmRiIGltcG9ydCB0cmFuc2FjdGlvbiwgY29ubmVjdGlvbgorCisgICAgICAgIGltcG9ydCB1cmxsaWIyLCB1cmxwYXJzZSwganNvbgorICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgcHJveHlfc2V0dGluZ3MgPSBvcy5lbnZpcm9uLmdldCgiaHR0cF9wcm94eSIsIE5vbmUpCisKKyAgICAgICAgZGVmIF9nZXRfanNvbl9yZXNwb25zZShhcGl1cmwgPSBzZWxmLmFwaXVybCk6CisgICAgICAgICAgICBfcGFyc2VkdXJsID0gdXJscGFyc2UudXJscGFyc2UoYXBpdXJsKQorICAgICAgICAgICAgcGF0aCA9IF9wYXJzZWR1cmwucGF0aAorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmVzID0gdXJsbGliMi51cmxvcGVuKGFwaXVybCkKKyAgICAgICAgICAgIGV4Y2VwdCB1cmxsaWIyLlVSTEVycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJGYWlsZWQgdG8gcmVhZCAlczogJXMiICUgKHBhdGgsIGUucmVhc29uKSkKKworICAgICAgICAgICAgcmV0dXJuIGpzb24ubG9hZHMocmVzLnJlYWQoKSkKKworICAgICAgICAjIHZlcmlmeSB3ZSBjYW4gZ2V0IHRoZSBiYXNpYyBhcGkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYXBpbGlua3MgPSBfZ2V0X2pzb25fcmVzcG9uc2UoKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICBpbXBvcnQgdHJhY2ViYWNrCisgICAgICAgICAgICBpZiBwcm94eV9zZXR0aW5ncyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiRUU6IFVzaW5nIHByb3h5ICVzIiAlIHByb3h5X3NldHRpbmdzKQorICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoIkVFOiBjb3VsZCBub3QgY29ubmVjdCB0byAlcywgc2tpcHBpbmcgdXBkYXRlOiAlc1xuJXMiICUgKHNlbGYuYXBpdXJsLCBlLCB0cmFjZWJhY2suZm9ybWF0X2V4YyhlKSkpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIHVwZGF0ZSBicmFuY2hlczsgb25seSB0aG9zZSB0aGF0IHdlIGFscmVhZHkgaGF2ZSBuYW1lcyBsaXN0ZWQgaW4gdGhlCisgICAgICAgICMgUmVsZWFzZXMgdGFibGUKKyAgICAgICAgd2hpdGVsaXN0X2JyYW5jaF9uYW1lcyA9IG1hcChsYW1iZGEgeDogeC5icmFuY2hfbmFtZSwgUmVsZWFzZS5vYmplY3RzLmFsbCgpKQorICAgICAgICBpZiBsZW4od2hpdGVsaXN0X2JyYW5jaF9uYW1lcykgPT0gMDoKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiRmFpbGVkIHRvIG1ha2UgbGlzdCBvZiBicmFuY2hlcyB0byBmZXRjaCIpCisKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCJGZXRjaGluZyBicmFuY2hlcyIpCisgICAgICAgIGJyYW5jaGVzX2luZm8gPSBfZ2V0X2pzb25fcmVzcG9uc2UoYXBpbGlua3NbJ2JyYW5jaGVzJ10KKyAgICAgICAgICAgICsgIj9maWx0ZXI9bmFtZTolcyIgJSAiT1IiLmpvaW4od2hpdGVsaXN0X2JyYW5jaF9uYW1lcykpCisgICAgICAgIGZvciBiaSBpbiBicmFuY2hlc19pbmZvOgorICAgICAgICAgICAgYiwgY3JlYXRlZCA9IEJyYW5jaC5vYmplY3RzLmdldF9vcl9jcmVhdGUobGF5ZXJfc291cmNlID0gc2VsZiwgbmFtZSA9IGJpWyduYW1lJ10pCisgICAgICAgICAgICBiLnVwX2lkID0gYmlbJ2lkJ10KKyAgICAgICAgICAgIGIudXBfZGF0ZSA9IGJpWyd1cGRhdGVkJ10KKyAgICAgICAgICAgIGIubmFtZSA9IGJpWyduYW1lJ10KKyAgICAgICAgICAgIGIuc2hvcnRfZGVzY3JpcHRpb24gPSBiaVsnc2hvcnRfZGVzY3JpcHRpb24nXQorICAgICAgICAgICAgYi5zYXZlKCkKKworICAgICAgICAjIHVwZGF0ZSBsYXllcnMKKyAgICAgICAgbGF5ZXJzX2luZm8gPSBfZ2V0X2pzb25fcmVzcG9uc2UoYXBpbGlua3NbJ2xheWVySXRlbXMnXSkKKyAgICAgICAgaWYgbm90IGNvbm5lY3Rpb24uZmVhdHVyZXMuYXV0b2NvbW1pdHNfd2hlbl9hdXRvY29tbWl0X2lzX29mZjoKKyAgICAgICAgICAgIHRyYW5zYWN0aW9uLnNldF9hdXRvY29tbWl0KEZhbHNlKQorICAgICAgICBmb3IgbGkgaW4gbGF5ZXJzX2luZm86CisgICAgICAgICAgICBsLCBjcmVhdGVkID0gTGF5ZXIub2JqZWN0cy5nZXRfb3JfY3JlYXRlKGxheWVyX3NvdXJjZSA9IHNlbGYsIG5hbWUgPSBsaVsnbmFtZSddKQorICAgICAgICAgICAgbC51cF9pZCA9IGxpWydpZCddCisgICAgICAgICAgICBsLnVwX2RhdGUgPSBsaVsndXBkYXRlZCddCisgICAgICAgICAgICBsLnZjc191cmwgPSBsaVsndmNzX3VybCddCisgICAgICAgICAgICBsLnZjc193ZWJfdXJsID0gbGlbJ3Zjc193ZWJfdXJsJ10KKyAgICAgICAgICAgIGwudmNzX3dlYl90cmVlX2Jhc2VfdXJsID0gbGlbJ3Zjc193ZWJfdHJlZV9iYXNlX3VybCddCisgICAgICAgICAgICBsLnZjc193ZWJfZmlsZV9iYXNlX3VybCA9IGxpWyd2Y3Nfd2ViX2ZpbGVfYmFzZV91cmwnXQorICAgICAgICAgICAgbC5zdW1tYXJ5ID0gbGlbJ3N1bW1hcnknXQorICAgICAgICAgICAgbC5kZXNjcmlwdGlvbiA9IGxpWydkZXNjcmlwdGlvbiddCisgICAgICAgICAgICBsLnNhdmUoKQorICAgICAgICBpZiBub3QgY29ubmVjdGlvbi5mZWF0dXJlcy5hdXRvY29tbWl0c193aGVuX2F1dG9jb21taXRfaXNfb2ZmOgorICAgICAgICAgICAgdHJhbnNhY3Rpb24uc2V0X2F1dG9jb21taXQoVHJ1ZSkKKworICAgICAgICAjIHVwZGF0ZSBsYXllcmJyYW5jaGVzL2xheWVyX3ZlcnNpb25zCisgICAgICAgIGxvZ2dlci5kZWJ1ZygiRmV0Y2hpbmcgbGF5ZXIgaW5mb3JtYXRpb24iKQorICAgICAgICBsYXllcmJyYW5jaGVzX2luZm8gPSBfZ2V0X2pzb25fcmVzcG9uc2UoYXBpbGlua3NbJ2xheWVyQnJhbmNoZXMnXQorICAgICAgICAgICAgICAgICsgIj9maWx0ZXI9YnJhbmNoOiVzIiAlICJPUiIuam9pbihtYXAobGFtYmRhIHg6IHN0cih4LnVwX2lkKSwgW2kgZm9yIGkgaW4gQnJhbmNoLm9iamVjdHMuZmlsdGVyKGxheWVyX3NvdXJjZSA9IHNlbGYpIGlmIGkudXBfaWQgaXMgbm90IE5vbmVdICkpCisgICAgICAgICAgICApCisKKyAgICAgICAgaWYgbm90IGNvbm5lY3Rpb24uZmVhdHVyZXMuYXV0b2NvbW1pdHNfd2hlbl9hdXRvY29tbWl0X2lzX29mZjoKKyAgICAgICAgICAgIHRyYW5zYWN0aW9uLnNldF9hdXRvY29tbWl0KEZhbHNlKQorICAgICAgICBmb3IgbGJpIGluIGxheWVyYnJhbmNoZXNfaW5mbzoKKyAgICAgICAgICAgIGx2LCBjcmVhdGVkID0gTGF5ZXJfVmVyc2lvbi5vYmplY3RzLmdldF9vcl9jcmVhdGUobGF5ZXJfc291cmNlID0gc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgdXBfaWQgPSBsYmlbJ2lkJ10sCisgICAgICAgICAgICAgICAgICAgIGxheWVyPUxheWVyLm9iamVjdHMuZ2V0KGxheWVyX3NvdXJjZSA9IHNlbGYsIHVwX2lkID0gbGJpWydsYXllciddKQorICAgICAgICAgICAgICAgICkKKworICAgICAgICAgICAgbHYudXBfZGF0ZSA9IGxiaVsndXBkYXRlZCddCisgICAgICAgICAgICBsdi51cF9icmFuY2ggPSBCcmFuY2gub2JqZWN0cy5nZXQobGF5ZXJfc291cmNlID0gc2VsZiwgdXBfaWQgPSBsYmlbJ2JyYW5jaCddKQorICAgICAgICAgICAgbHYuYnJhbmNoID0gbGJpWydhY3R1YWxfYnJhbmNoJ10KKyAgICAgICAgICAgIGx2LmNvbW1pdCA9IGxiaVsnYWN0dWFsX2JyYW5jaCddCisgICAgICAgICAgICBsdi5kaXJwYXRoID0gbGJpWyd2Y3Nfc3ViZGlyJ10KKyAgICAgICAgICAgIGx2LnNhdmUoKQorICAgICAgICBpZiBub3QgY29ubmVjdGlvbi5mZWF0dXJlcy5hdXRvY29tbWl0c193aGVuX2F1dG9jb21taXRfaXNfb2ZmOgorICAgICAgICAgICAgdHJhbnNhY3Rpb24uc2V0X2F1dG9jb21taXQoVHJ1ZSkKKworICAgICAgICAjIHVwZGF0ZSBsYXllciBkZXBlbmRlbmNpZXMKKyAgICAgICAgbGF5ZXJkZXBlbmRlbmNpZXNfaW5mbyA9IF9nZXRfanNvbl9yZXNwb25zZShhcGlsaW5rc1snbGF5ZXJEZXBlbmRlbmNpZXMnXSkKKyAgICAgICAgZGVwZW5kbGlzdCA9IHt9CisgICAgICAgIGlmIG5vdCBjb25uZWN0aW9uLmZlYXR1cmVzLmF1dG9jb21taXRzX3doZW5fYXV0b2NvbW1pdF9pc19vZmY6CisgICAgICAgICAgICB0cmFuc2FjdGlvbi5zZXRfYXV0b2NvbW1pdChGYWxzZSkKKyAgICAgICAgZm9yIGxkaSBpbiBsYXllcmRlcGVuZGVuY2llc19pbmZvOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGx2ID0gTGF5ZXJfVmVyc2lvbi5vYmplY3RzLmdldChsYXllcl9zb3VyY2UgPSBzZWxmLCB1cF9pZCA9IGxkaVsnbGF5ZXJicmFuY2gnXSkKKyAgICAgICAgICAgIGV4Y2VwdCBMYXllcl9WZXJzaW9uLkRvZXNOb3RFeGlzdCBhcyBlOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIGx2IG5vdCBpbiBkZXBlbmRsaXN0OgorICAgICAgICAgICAgICAgIGRlcGVuZGxpc3RbbHZdID0gW10KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBkZXBlbmRsaXN0W2x2XS5hcHBlbmQoTGF5ZXJfVmVyc2lvbi5vYmplY3RzLmdldChsYXllcl9zb3VyY2UgPSBzZWxmLCBsYXllcl9fdXBfaWQgPSBsZGlbJ2RlcGVuZGVuY3knXSwgdXBfYnJhbmNoID0gbHYudXBfYnJhbmNoKSkKKyAgICAgICAgICAgIGV4Y2VwdCBMYXllcl9WZXJzaW9uLkRvZXNOb3RFeGlzdDoKKyAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygiQ2Fubm90IGZpbmQgbGF5ZXIgdmVyc2lvbiAobHM6JXMpLCB1cF9pZDolcyBsdjolcyIgJSAoc2VsZiwgbGRpWydkZXBlbmRlbmN5J10sIGx2KSkKKworICAgICAgICBmb3IgbHYgaW4gZGVwZW5kbGlzdDoKKyAgICAgICAgICAgIExheWVyVmVyc2lvbkRlcGVuZGVuY3kub2JqZWN0cy5maWx0ZXIobGF5ZXJfdmVyc2lvbiA9IGx2KS5kZWxldGUoKQorICAgICAgICAgICAgZm9yIGx2ZCBpbiBkZXBlbmRsaXN0W2x2XToKKyAgICAgICAgICAgICAgICBMYXllclZlcnNpb25EZXBlbmRlbmN5Lm9iamVjdHMuZ2V0X29yX2NyZWF0ZShsYXllcl92ZXJzaW9uID0gbHYsIGRlcGVuZHNfb24gPSBsdmQpCisgICAgICAgIGlmIG5vdCBjb25uZWN0aW9uLmZlYXR1cmVzLmF1dG9jb21taXRzX3doZW5fYXV0b2NvbW1pdF9pc19vZmY6CisgICAgICAgICAgICB0cmFuc2FjdGlvbi5zZXRfYXV0b2NvbW1pdChUcnVlKQorCisKKyAgICAgICAgIyB1cGRhdGUgbWFjaGluZXMKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCJGZXRjaGluZyBtYWNoaW5lIGluZm9ybWF0aW9uIikKKyAgICAgICAgbWFjaGluZXNfaW5mbyA9IF9nZXRfanNvbl9yZXNwb25zZShhcGlsaW5rc1snbWFjaGluZXMnXQorICAgICAgICAgICAgICAgICsgIj9maWx0ZXI9bGF5ZXJicmFuY2g6JXMiICUgIk9SIi5qb2luKG1hcChsYW1iZGEgeDogc3RyKHgudXBfaWQpLCBMYXllcl9WZXJzaW9uLm9iamVjdHMuZmlsdGVyKGxheWVyX3NvdXJjZSA9IHNlbGYpKSkKKyAgICAgICAgICAgICkKKworICAgICAgICBpZiBub3QgY29ubmVjdGlvbi5mZWF0dXJlcy5hdXRvY29tbWl0c193aGVuX2F1dG9jb21taXRfaXNfb2ZmOgorICAgICAgICAgICAgdHJhbnNhY3Rpb24uc2V0X2F1dG9jb21taXQoRmFsc2UpCisgICAgICAgIGZvciBtaSBpbiBtYWNoaW5lc19pbmZvOgorICAgICAgICAgICAgbW8sIGNyZWF0ZWQgPSBNYWNoaW5lLm9iamVjdHMuZ2V0X29yX2NyZWF0ZShsYXllcl9zb3VyY2UgPSBzZWxmLCB1cF9pZCA9IG1pWydpZCddLCBsYXllcl92ZXJzaW9uID0gTGF5ZXJfVmVyc2lvbi5vYmplY3RzLmdldChsYXllcl9zb3VyY2UgPSBzZWxmLCB1cF9pZCA9IG1pWydsYXllcmJyYW5jaCddKSkKKyAgICAgICAgICAgIG1vLnVwX2RhdGUgPSBtaVsndXBkYXRlZCddCisgICAgICAgICAgICBtby5uYW1lID0gbWlbJ25hbWUnXQorICAgICAgICAgICAgbW8uZGVzY3JpcHRpb24gPSBtaVsnZGVzY3JpcHRpb24nXQorICAgICAgICAgICAgbW8uc2F2ZSgpCisKKyAgICAgICAgaWYgbm90IGNvbm5lY3Rpb24uZmVhdHVyZXMuYXV0b2NvbW1pdHNfd2hlbl9hdXRvY29tbWl0X2lzX29mZjoKKyAgICAgICAgICAgIHRyYW5zYWN0aW9uLnNldF9hdXRvY29tbWl0KFRydWUpCisKKyAgICAgICAgIyB1cGRhdGUgcmVjaXBlczsgcGFnaW5hdGUgYnkgbGF5ZXIgdmVyc2lvbiAvIGxheWVyIGJyYW5jaAorICAgICAgICBsb2dnZXIuZGVidWcoIkZldGNoaW5nIHRhcmdldCBpbmZvcm1hdGlvbiIpCisgICAgICAgIHJlY2lwZXNfaW5mbyA9IF9nZXRfanNvbl9yZXNwb25zZShhcGlsaW5rc1sncmVjaXBlcyddCisgICAgICAgICAgICAgICAgKyAiP2ZpbHRlcj1sYXllcmJyYW5jaDolcyIgJSAiT1IiLmpvaW4obWFwKGxhbWJkYSB4OiBzdHIoeC51cF9pZCksIExheWVyX1ZlcnNpb24ub2JqZWN0cy5maWx0ZXIobGF5ZXJfc291cmNlID0gc2VsZikpKQorICAgICAgICAgICAgKQorICAgICAgICBpZiBub3QgY29ubmVjdGlvbi5mZWF0dXJlcy5hdXRvY29tbWl0c193aGVuX2F1dG9jb21taXRfaXNfb2ZmOgorICAgICAgICAgICAgdHJhbnNhY3Rpb24uc2V0X2F1dG9jb21taXQoRmFsc2UpCisgICAgICAgIGZvciByaSBpbiByZWNpcGVzX2luZm86CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcm8sIGNyZWF0ZWQgPSBSZWNpcGUub2JqZWN0cy5nZXRfb3JfY3JlYXRlKGxheWVyX3NvdXJjZSA9IHNlbGYsIHVwX2lkID0gcmlbJ2lkJ10sIGxheWVyX3ZlcnNpb24gPSBMYXllcl9WZXJzaW9uLm9iamVjdHMuZ2V0KGxheWVyX3NvdXJjZSA9IHNlbGYsIHVwX2lkID0gcmlbJ2xheWVyYnJhbmNoJ10pKQorICAgICAgICAgICAgICAgIHJvLnVwX2RhdGUgPSByaVsndXBkYXRlZCddCisgICAgICAgICAgICAgICAgcm8ubmFtZSA9IHJpWydwbiddCisgICAgICAgICAgICAgICAgcm8udmVyc2lvbiA9IHJpWydwdiddCisgICAgICAgICAgICAgICAgcm8uc3VtbWFyeSA9IHJpWydzdW1tYXJ5J10KKyAgICAgICAgICAgICAgICByby5kZXNjcmlwdGlvbiA9IHJpWydkZXNjcmlwdGlvbiddCisgICAgICAgICAgICAgICAgcm8uc2VjdGlvbiA9IHJpWydzZWN0aW9uJ10KKyAgICAgICAgICAgICAgICByby5saWNlbnNlID0gcmlbJ2xpY2Vuc2UnXQorICAgICAgICAgICAgICAgIHJvLmhvbWVwYWdlID0gcmlbJ2hvbWVwYWdlJ10KKyAgICAgICAgICAgICAgICByby5idWd0cmFja2VyID0gcmlbJ2J1Z3RyYWNrZXInXQorICAgICAgICAgICAgICAgIHJvLmZpbGVfcGF0aCA9IHJpWydmaWxlcGF0aCddICsgIi8iICsgcmlbJ2ZpbGVuYW1lJ10KKyAgICAgICAgICAgICAgICBpZiAnaW5oZXJpdHMnIGluIHJpOgorICAgICAgICAgICAgICAgICAgICByby5pc19pbWFnZSA9ICdpbWFnZScgaW4gcmlbJ2luaGVyaXRzJ10uc3BsaXQoKQorICAgICAgICAgICAgICAgIHJvLnNhdmUoKQorICAgICAgICAgICAgZXhjZXB0IEludGVncml0eUVycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJGYWlsZWQgc2F2aW5nIHJlY2lwZSwgaWdub3Jpbmc6ICVzICglczolcykiICUgKGUsIHJvLmxheWVyX3ZlcnNpb24sIHJpWydmaWxlcGF0aCddKyIvIityaVsnZmlsZW5hbWUnXSkpCisgICAgICAgIGlmIG5vdCBjb25uZWN0aW9uLmZlYXR1cmVzLmF1dG9jb21taXRzX3doZW5fYXV0b2NvbW1pdF9pc19vZmY6CisgICAgICAgICAgICB0cmFuc2FjdGlvbi5zZXRfYXV0b2NvbW1pdChUcnVlKQorCitjbGFzcyBCaXRiYWtlVmVyc2lvbihtb2RlbHMuTW9kZWwpOgorCisgICAgbmFtZSA9IG1vZGVscy5DaGFyRmllbGQobWF4X2xlbmd0aD0zMiwgdW5pcXVlID0gVHJ1ZSkKKyAgICBnaXR1cmwgPSBHaXRVUkxGaWVsZCgpCisgICAgYnJhbmNoID0gbW9kZWxzLkNoYXJGaWVsZChtYXhfbGVuZ3RoPTMyKQorICAgIGRpcnBhdGggPSBtb2RlbHMuQ2hhckZpZWxkKG1heF9sZW5ndGg9MjU1KQorCisgICAgZGVmIF9fdW5pY29kZV9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIiVzIChCcmFuY2g6ICVzKSIgJSAoc2VsZi5uYW1lLCBzZWxmLmJyYW5jaCkKKworCitjbGFzcyBSZWxlYXNlKG1vZGVscy5Nb2RlbCk6CisgICAgIiIiIEEgcmVsZWFzZSBpcyBhIHByb2plY3QgdGVtcGxhdGUsIHVzZWQgdG8gcHJlLXBvcHVsYXRlIFByb2plY3Qgc2V0dGluZ3Mgd2l0aCBhIGNvbmZpZ3VyYXRpb24gc2V0ICIiIgorICAgIG5hbWUgPSBtb2RlbHMuQ2hhckZpZWxkKG1heF9sZW5ndGg9MzIsIHVuaXF1ZSA9IFRydWUpCisgICAgZGVzY3JpcHRpb24gPSBtb2RlbHMuQ2hhckZpZWxkKG1heF9sZW5ndGg9MjU1KQorICAgIGJpdGJha2VfdmVyc2lvbiA9IG1vZGVscy5Gb3JlaWduS2V5KEJpdGJha2VWZXJzaW9uKQorICAgIGJyYW5jaF9uYW1lID0gbW9kZWxzLkNoYXJGaWVsZChtYXhfbGVuZ3RoPTUwLCBkZWZhdWx0ID0gIiIpCisgICAgaGVscHRleHQgPSBtb2RlbHMuVGV4dEZpZWxkKG51bGw9VHJ1ZSkKKworICAgIGRlZiBfX3VuaWNvZGVfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICIlcyAoJXMpIiAlIChzZWxmLm5hbWUsIHNlbGYuYnJhbmNoX25hbWUpCisKK2NsYXNzIFJlbGVhc2VMYXllclNvdXJjZVByaW9yaXR5KG1vZGVscy5Nb2RlbCk6CisgICAgIiIiIEVhY2ggcmVsZWFzZSBzZWxlY3RzIGxheWVycyBmcm9tIHRoZSBzZXQgdXAgbGF5ZXIgc291cmNlcywgb3JkZXJlZCBieSBwcmlvcml0eSAiIiIKKyAgICByZWxlYXNlID0gbW9kZWxzLkZvcmVpZ25LZXkoIlJlbGVhc2UiKQorICAgIGxheWVyX3NvdXJjZSA9IG1vZGVscy5Gb3JlaWduS2V5KCJMYXllclNvdXJjZSIpCisgICAgcHJpb3JpdHkgPSBtb2RlbHMuSW50ZWdlckZpZWxkKGRlZmF1bHQgPSAwKQorCisgICAgZGVmIF9fdW5pY29kZV9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIiVzLSVzOiVkIiAlIChzZWxmLnJlbGVhc2UubmFtZSwgc2VsZi5sYXllcl9zb3VyY2UubmFtZSwgc2VsZi5wcmlvcml0eSkKKyAgICBjbGFzcyBNZXRhOgorICAgICAgICB1bmlxdWVfdG9nZXRoZXIgPSAoKCdyZWxlYXNlJywgJ2xheWVyX3NvdXJjZScpLCkKKworCitjbGFzcyBSZWxlYXNlRGVmYXVsdExheWVyKG1vZGVscy5Nb2RlbCk6CisgICAgcmVsZWFzZSA9IG1vZGVscy5Gb3JlaWduS2V5KFJlbGVhc2UpCisgICAgbGF5ZXJfbmFtZSA9IG1vZGVscy5DaGFyRmllbGQobWF4X2xlbmd0aD0xMDAsIGRlZmF1bHQ9IiIpCisKKworIyBCcmFuY2ggY2xhc3MgaXMgc3luY2VkIHdpdGggbGF5ZXJpbmRleC5CcmFuY2gsIGJyYW5jaGVzIGNhbiBvbmx5IGNvbWUgZnJvbSByZW1vdGUgbGF5ZXIgaW5kZXhlcworY2xhc3MgQnJhbmNoKG1vZGVscy5Nb2RlbCk6CisgICAgbGF5ZXJfc291cmNlID0gbW9kZWxzLkZvcmVpZ25LZXkoJ0xheWVyU291cmNlJywgbnVsbCA9IFRydWUsIGRlZmF1bHQgPSBUcnVlKQorICAgIHVwX2lkID0gbW9kZWxzLkludGVnZXJGaWVsZChudWxsID0gVHJ1ZSwgZGVmYXVsdCA9IE5vbmUpICAgICAgICAgICAgICAgICAgICAjIGlkIG9mIGJyYW5jaCBpbiB0aGUgc291cmNlCisgICAgdXBfZGF0ZSA9IG1vZGVscy5EYXRlVGltZUZpZWxkKG51bGwgPSBUcnVlLCBkZWZhdWx0ID0gTm9uZSkKKworICAgIG5hbWUgPSBtb2RlbHMuQ2hhckZpZWxkKG1heF9sZW5ndGg9NTApCisgICAgc2hvcnRfZGVzY3JpcHRpb24gPSBtb2RlbHMuQ2hhckZpZWxkKG1heF9sZW5ndGg9NTAsIGJsYW5rPVRydWUpCisKKyAgICBjbGFzcyBNZXRhOgorICAgICAgICB2ZXJib3NlX25hbWVfcGx1cmFsID0gIkJyYW5jaGVzIgorICAgICAgICB1bmlxdWVfdG9nZXRoZXIgPSAoKCdsYXllcl9zb3VyY2UnLCAnbmFtZScpLCgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJykpCisKKyAgICBkZWYgX191bmljb2RlX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm5hbWUKKworCisjIExheWVyIGNsYXNzIHN5bmNlZCB3aXRoIGxheWVyaW5kZXguTGF5ZXJJdGVtCitjbGFzcyBMYXllcihtb2RlbHMuTW9kZWwpOgorICAgIGxheWVyX3NvdXJjZSA9IG1vZGVscy5Gb3JlaWduS2V5KExheWVyU291cmNlLCBudWxsID0gVHJ1ZSwgZGVmYXVsdCA9IE5vbmUpICAjIGZyb20gd2hlcmUgZGlkIHdlIGdvdCB0aGlzIGxheWVyCisgICAgdXBfaWQgPSBtb2RlbHMuSW50ZWdlckZpZWxkKG51bGwgPSBUcnVlLCBkZWZhdWx0ID0gTm9uZSkgICAgICAgICAgICAgICAgICAgICMgaWQgb2YgbGF5ZXIgaW4gdGhlIHJlbW90ZSBzb3VyY2UKKyAgICB1cF9kYXRlID0gbW9kZWxzLkRhdGVUaW1lRmllbGQobnVsbCA9IFRydWUsIGRlZmF1bHQgPSBOb25lKQorCisgICAgbmFtZSA9IG1vZGVscy5DaGFyRmllbGQobWF4X2xlbmd0aD0xMDApCisgICAgbGF5ZXJfaW5kZXhfdXJsID0gbW9kZWxzLlVSTEZpZWxkKCkKKyAgICB2Y3NfdXJsID0gR2l0VVJMRmllbGQoZGVmYXVsdCA9IE5vbmUsIG51bGwgPSBUcnVlKQorICAgIHZjc193ZWJfdXJsID0gbW9kZWxzLlVSTEZpZWxkKG51bGwgPSBUcnVlLCBkZWZhdWx0ID0gTm9uZSkKKyAgICB2Y3Nfd2ViX3RyZWVfYmFzZV91cmwgPSBtb2RlbHMuVVJMRmllbGQobnVsbCA9IFRydWUsIGRlZmF1bHQgPSBOb25lKQorICAgIHZjc193ZWJfZmlsZV9iYXNlX3VybCA9IG1vZGVscy5VUkxGaWVsZChudWxsID0gVHJ1ZSwgZGVmYXVsdCA9IE5vbmUpCisKKyAgICBzdW1tYXJ5ID0gbW9kZWxzLlRleHRGaWVsZChoZWxwX3RleHQ9J09uZS1saW5lIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXllcicsIG51bGwgPSBUcnVlLCBkZWZhdWx0ID0gTm9uZSkKKyAgICBkZXNjcmlwdGlvbiA9IG1vZGVscy5UZXh0RmllbGQobnVsbCA9IFRydWUsIGRlZmF1bHQgPSBOb25lKQorCisgICAgZGVmIF9fdW5pY29kZV9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIiVzIC8gJXMgIiAlIChzZWxmLm5hbWUsIHNlbGYubGF5ZXJfc291cmNlKQorCisgICAgY2xhc3MgTWV0YToKKyAgICAgICAgdW5pcXVlX3RvZ2V0aGVyID0gKCgibGF5ZXJfc291cmNlIiwgInVwX2lkIiksICgibGF5ZXJfc291cmNlIiwgIm5hbWUiKSkKKworCisjIExheWVyQ29tbWl0IGNsYXNzIGlzIHN5bmNlZCB3aXRoIGxheWVyaW5kZXguTGF5ZXJCcmFuY2gKK2NsYXNzIExheWVyX1ZlcnNpb24obW9kZWxzLk1vZGVsKToKKyAgICBzZWFyY2hfYWxsb3dlZF9maWVsZHMgPSBbImxheWVyX19uYW1lIiwgImxheWVyX19zdW1tYXJ5IiwgImxheWVyX19kZXNjcmlwdGlvbiIsICJsYXllcl9fdmNzX3VybCIsICJkaXJwYXRoIiwgInVwX2JyYW5jaF9fbmFtZSIsICJjb21taXQiLCAiYnJhbmNoIl0KKyAgICBidWlsZCA9IG1vZGVscy5Gb3JlaWduS2V5KEJ1aWxkLCByZWxhdGVkX25hbWU9J2xheWVyX3ZlcnNpb25fYnVpbGQnLCBkZWZhdWx0ID0gTm9uZSwgbnVsbCA9IFRydWUpCisgICAgbGF5ZXIgPSBtb2RlbHMuRm9yZWlnbktleShMYXllciwgcmVsYXRlZF9uYW1lPSdsYXllcl92ZXJzaW9uX2xheWVyJykKKworICAgIGxheWVyX3NvdXJjZSA9IG1vZGVscy5Gb3JlaWduS2V5KExheWVyU291cmNlLCBudWxsID0gVHJ1ZSwgZGVmYXVsdCA9IE5vbmUpICAgICAgICAgICAgICAgICAgICMgZnJvbSB3aGVyZSBkaWQgd2UgZ2V0IHRoaXMgTGF5ZXIgVmVyc2lvbgorICAgIHVwX2lkID0gbW9kZWxzLkludGVnZXJGaWVsZChudWxsID0gVHJ1ZSwgZGVmYXVsdCA9IE5vbmUpICAgICAgICAjIGlkIG9mIGxheWVyYnJhbmNoIGluIHRoZSByZW1vdGUgc291cmNlCisgICAgdXBfZGF0ZSA9IG1vZGVscy5EYXRlVGltZUZpZWxkKG51bGwgPSBUcnVlLCBkZWZhdWx0ID0gTm9uZSkKKyAgICB1cF9icmFuY2ggPSBtb2RlbHMuRm9yZWlnbktleShCcmFuY2gsIG51bGwgPSBUcnVlLCBkZWZhdWx0ID0gTm9uZSkKKworICAgIGJyYW5jaCA9IG1vZGVscy5DaGFyRmllbGQobWF4X2xlbmd0aD04MCkgICAgICAgICAgICAjIExheWVyQnJhbmNoLmFjdHVhbF9icmFuY2gKKyAgICBjb21taXQgPSBtb2RlbHMuQ2hhckZpZWxkKG1heF9sZW5ndGg9MTAwKSAgICAgICAgICAgIyBMYXllckJyYW5jaC52Y3NfbGFzdF9yZXYKKyAgICBkaXJwYXRoID0gbW9kZWxzLkNoYXJGaWVsZChtYXhfbGVuZ3RoPTI1NSwgbnVsbCA9IFRydWUsIGRlZmF1bHQgPSBOb25lKSAgICAgICAgICAjIExheWVyQnJhbmNoLnZjc19zdWJkaXIKKyAgICBwcmlvcml0eSA9IG1vZGVscy5JbnRlZ2VyRmllbGQoZGVmYXVsdCA9IDApICAgICAgICAgIyBpZiAtMSwgdGhpcyBpcyBhIGRlZmF1bHQgbGF5ZXIKKworICAgIGxvY2FsX3BhdGggPSBtb2RlbHMuRmlsZVBhdGhGaWVsZChtYXhfbGVuZ3RoPTEwMjQsIGRlZmF1bHQgPSAiLyIpICAjIHdoZXJlIHRoaXMgbGF5ZXIgd2FzIGNoZWNrZWQtb3V0CisKKyAgICBwcm9qZWN0ID0gbW9kZWxzLkZvcmVpZ25LZXkoJ1Byb2plY3QnLCBudWxsID0gVHJ1ZSwgZGVmYXVsdCA9IE5vbmUpICAgIyBTZXQgaWYgdGhpcyBsYXllciBpcyBwcm9qZWN0LXNwZWNpZmljOyBhbHdheXMgc2V0IGZvciBpbXBvcnRlZCBsYXllcnMsIGFuZCBwcm9qZWN0LXNldCBicmFuY2hlcworCisgICAgIyBjb2RlIGxpZnRlZCwgd2l0aCBhZGFwdGF0aW9ucywgZnJvbSB0aGUgbGF5ZXJpbmRleC13ZWIgYXBwbGljYXRpb24gaHR0cHM6Ly9naXQueW9jdG9wcm9qZWN0Lm9yZy9jZ2l0L2NnaXQuY2dpL2xheWVyaW5kZXgtd2ViLworICAgIGRlZiBfaGFuZGxlX3VybF9wYXRoKHNlbGYsIGJhc2VfdXJsLCBwYXRoKToKKyAgICAgICAgaW1wb3J0IHJlLCBwb3NpeHBhdGgKKyAgICAgICAgaWYgYmFzZV91cmw6CisgICAgICAgICAgICBpZiBzZWxmLmRpcnBhdGg6CisgICAgICAgICAgICAgICAgaWYgcGF0aDoKKyAgICAgICAgICAgICAgICAgICAgZXh0cmFfcGF0aCA9IHNlbGYuZGlycGF0aCArICcvJyArIHBhdGgKKyAgICAgICAgICAgICAgICAgICAgIyBOb3JtYWxpc2Ugb3V0IC4uLyBpbiBwYXRoIGZvciB1c2FnZSBVUkwKKyAgICAgICAgICAgICAgICAgICAgZXh0cmFfcGF0aCA9IHBvc2l4cGF0aC5ub3JtcGF0aChleHRyYV9wYXRoKQorICAgICAgICAgICAgICAgICAgICAjIE1pbm9yIHdvcmthcm91bmQgdG8gaGFuZGxlIGNhc2Ugd2hlcmUgc3ViZGlyZWN0b3J5IGhhcyBiZWVuIGFkZGVkIGJldHdlZW4gYnJhbmNoZXMKKyAgICAgICAgICAgICAgICAgICAgIyAoc2hvdWxkIHByb2JhYmx5IHN1cHBvcnQgdXNhZ2UgVVJMIHBlciBicmFuY2ggdG8gaGFuZGxlIHRoaXMuLi4gc2lnaC4uLikKKyAgICAgICAgICAgICAgICAgICAgaWYgZXh0cmFfcGF0aC5zdGFydHN3aXRoKCcuLi8nKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX3BhdGggPSBleHRyYV9wYXRoWzM6XQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGV4dHJhX3BhdGggPSBzZWxmLmRpcnBhdGgKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZXh0cmFfcGF0aCA9IHBhdGgKKyAgICAgICAgICAgIGJyYW5jaG5hbWUgPSBzZWxmLnVwX2JyYW5jaC5uYW1lCisgICAgICAgICAgICB1cmwgPSBiYXNlX3VybC5yZXBsYWNlKCclYnJhbmNoJScsIGJyYW5jaG5hbWUpCisKKyAgICAgICAgICAgICMgSWYgdGhlcmUncyBhICUgaW4gdGhlIHBhdGggKGUuZy4gYSB3aWxkY2FyZCBiYmFwcGVuZCkgd2UgbmVlZCB0byBlbmNvZGUgaXQKKyAgICAgICAgICAgIGlmIGV4dHJhX3BhdGg6CisgICAgICAgICAgICAgICAgZXh0cmFfcGF0aCA9IGV4dHJhX3BhdGgucmVwbGFjZSgnJScsICclMjUnKQorCisgICAgICAgICAgICBpZiAnJXBhdGglJyBpbiBiYXNlX3VybDoKKyAgICAgICAgICAgICAgICBpZiBleHRyYV9wYXRoOgorICAgICAgICAgICAgICAgICAgICB1cmwgPSByZS5zdWIocidcWyhbXlxdXSolcGF0aCVbXlxdXSopXF0nLCAnXFwxJywgdXJsKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHVybCA9IHJlLnN1YihyJ1xbKFteXF1dKiVwYXRoJVteXF1dKilcXScsICcnLCB1cmwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHVybC5yZXBsYWNlKCclcGF0aCUnLCBleHRyYV9wYXRoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gdXJsICsgZXh0cmFfcGF0aAorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIGdldF92Y3NfbGlua191cmwoc2VsZik6CisgICAgICAgIGlmIHNlbGYubGF5ZXIudmNzX3dlYl91cmwgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHJldHVybiBzZWxmLmxheWVyLnZjc193ZWJfdXJsCisKKyAgICBkZWYgZ2V0X3Zjc19maWxlX2xpbmtfdXJsKHNlbGYsIGZpbGVfcGF0aD0iIik6CisgICAgICAgIGlmIHNlbGYubGF5ZXIudmNzX3dlYl9maWxlX2Jhc2VfdXJsIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICByZXR1cm4gc2VsZi5faGFuZGxlX3VybF9wYXRoKHNlbGYubGF5ZXIudmNzX3dlYl9maWxlX2Jhc2VfdXJsLCBmaWxlX3BhdGgpCisKKyAgICBkZWYgZ2V0X3Zjc19kaXJwYXRoX2xpbmtfdXJsKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmxheWVyLnZjc193ZWJfdHJlZV9iYXNlX3VybCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgcmV0dXJuIHNlbGYuX2hhbmRsZV91cmxfcGF0aChzZWxmLmxheWVyLnZjc193ZWJfdHJlZV9iYXNlX3VybCwgJycpCisKKyAgICBkZWYgZ2V0X2VxdWl2YWxlbnRzX3dwcmlvcml0eShzZWxmLCBwcm9qZWN0KToKKyAgICAgICAgcmV0dXJuIHByb2plY3QuY29tcGF0aWJsZV9sYXllcnZlcnNpb25zKGxheWVyX25hbWUgPSBzZWxmLmxheWVyLm5hbWUpCisKKyAgICBkZWYgZ2V0X3Zjc19yZWZlcmVuY2Uoc2VsZik6CisgICAgICAgIGlmIHNlbGYuY29tbWl0IGlzIG5vdCBOb25lIGFuZCBsZW4oc2VsZi5jb21taXQpID4gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbW1pdAorICAgICAgICBpZiBzZWxmLmJyYW5jaCBpcyBub3QgTm9uZSBhbmQgbGVuKHNlbGYuYnJhbmNoKSA+IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5icmFuY2gKKyAgICAgICAgaWYgc2VsZi51cF9icmFuY2ggaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi51cF9icmFuY2gubmFtZQorICAgICAgICByZXR1cm4gKCJDYW5ub3QgZGV0ZXJtaW5lIHRoZSB2Y3NfcmVmZXJlbmNlIGZvciBsYXllciB2ZXJzaW9uICVzIiAlIHZhcnMoc2VsZikpCisKKyAgICBkZWYgZ2V0X2RldGFpbHNwYWdlX3VybChzZWxmLCBwcm9qZWN0X2lkKToKKyAgICAgICAgcmV0dXJuIHJldmVyc2UoJ2xheWVyZGV0YWlscycsIGFyZ3M9KHByb2plY3RfaWQsIHNlbGYucGspKQorCisgICAgZGVmIF9fdW5pY29kZV9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIiVkICVzIChWQ1MgJXMsIFByb2plY3QgJXMpIiAlIChzZWxmLnBrLCBzdHIoc2VsZi5sYXllciksIHNlbGYuZ2V0X3Zjc19yZWZlcmVuY2UoKSwgc2VsZi5idWlsZC5wcm9qZWN0IGlmIHNlbGYuYnVpbGQgaXMgbm90IE5vbmUgZWxzZSAiTm8gcHJvamVjdCIpCisKKyAgICBjbGFzcyBNZXRhOgorICAgICAgICB1bmlxdWVfdG9nZXRoZXIgPSAoImxheWVyX3NvdXJjZSIsICJ1cF9pZCIpCisKK2NsYXNzIExheWVyVmVyc2lvbkRlcGVuZGVuY3kobW9kZWxzLk1vZGVsKToKKyAgICBsYXllcl9zb3VyY2UgPSBtb2RlbHMuRm9yZWlnbktleShMYXllclNvdXJjZSwgbnVsbCA9IFRydWUsIGRlZmF1bHQgPSBOb25lKSAgIyBmcm9tIHdoZXJlIGRpZCB3ZSBnb3QgdGhpcyBsYXllcgorICAgIHVwX2lkID0gbW9kZWxzLkludGVnZXJGaWVsZChudWxsID0gVHJ1ZSwgZGVmYXVsdCA9IE5vbmUpICAgICAgICAgICAgICAgICAgICAjIGlkIG9mIGxheWVyYnJhbmNoIGluIHRoZSByZW1vdGUgc291cmNlCisKKyAgICBsYXllcl92ZXJzaW9uID0gbW9kZWxzLkZvcmVpZ25LZXkoTGF5ZXJfVmVyc2lvbiwgcmVsYXRlZF9uYW1lPSJkZXBlbmRlbmNpZXMiKQorICAgIGRlcGVuZHNfb24gPSBtb2RlbHMuRm9yZWlnbktleShMYXllcl9WZXJzaW9uLCByZWxhdGVkX25hbWU9ImRlcGVuZGVlcyIpCisKKyAgICBjbGFzcyBNZXRhOgorICAgICAgICB1bmlxdWVfdG9nZXRoZXIgPSAoImxheWVyX3NvdXJjZSIsICJ1cF9pZCIpCisKK2NsYXNzIFByb2plY3RMYXllcihtb2RlbHMuTW9kZWwpOgorICAgIHByb2plY3QgPSBtb2RlbHMuRm9yZWlnbktleShQcm9qZWN0KQorICAgIGxheWVyY29tbWl0ID0gbW9kZWxzLkZvcmVpZ25LZXkoTGF5ZXJfVmVyc2lvbiwgbnVsbD1UcnVlKQorICAgIG9wdGlvbmFsID0gbW9kZWxzLkJvb2xlYW5GaWVsZChkZWZhdWx0ID0gVHJ1ZSkKKworICAgIGRlZiBfX3VuaWNvZGVfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICIlcywgJXMiICUgKHNlbGYucHJvamVjdC5uYW1lLCBzZWxmLmxheWVyY29tbWl0KQorCisgICAgY2xhc3MgTWV0YToKKyAgICAgICAgdW5pcXVlX3RvZ2V0aGVyID0gKCgicHJvamVjdCIsICJsYXllcmNvbW1pdCIpLCkKKworY2xhc3MgUHJvamVjdFZhcmlhYmxlKG1vZGVscy5Nb2RlbCk6CisgICAgcHJvamVjdCA9IG1vZGVscy5Gb3JlaWduS2V5KFByb2plY3QpCisgICAgbmFtZSA9IG1vZGVscy5DaGFyRmllbGQobWF4X2xlbmd0aD0xMDApCisgICAgdmFsdWUgPSBtb2RlbHMuVGV4dEZpZWxkKGJsYW5rID0gVHJ1ZSkKKworY2xhc3MgVmFyaWFibGUobW9kZWxzLk1vZGVsKToKKyAgICBzZWFyY2hfYWxsb3dlZF9maWVsZHMgPSBbJ3ZhcmlhYmxlX25hbWUnLCAndmFyaWFibGVfdmFsdWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmhpc3RvcnlfX2ZpbGVfbmFtZScsICJkZXNjcmlwdGlvbiJdCisgICAgYnVpbGQgPSBtb2RlbHMuRm9yZWlnbktleShCdWlsZCwgcmVsYXRlZF9uYW1lPSd2YXJpYWJsZV9idWlsZCcpCisgICAgdmFyaWFibGVfbmFtZSA9IG1vZGVscy5DaGFyRmllbGQobWF4X2xlbmd0aD0xMDApCisgICAgdmFyaWFibGVfdmFsdWUgPSBtb2RlbHMuVGV4dEZpZWxkKGJsYW5rPVRydWUpCisgICAgY2hhbmdlZCA9IG1vZGVscy5Cb29sZWFuRmllbGQoZGVmYXVsdD1GYWxzZSkKKyAgICBodW1hbl9yZWFkYWJsZV9uYW1lID0gbW9kZWxzLkNoYXJGaWVsZChtYXhfbGVuZ3RoPTIwMCkKKyAgICBkZXNjcmlwdGlvbiA9IG1vZGVscy5UZXh0RmllbGQoYmxhbms9VHJ1ZSkKKworY2xhc3MgVmFyaWFibGVIaXN0b3J5KG1vZGVscy5Nb2RlbCk6CisgICAgdmFyaWFibGUgPSBtb2RlbHMuRm9yZWlnbktleShWYXJpYWJsZSwgcmVsYXRlZF9uYW1lPSd2aGlzdG9yeScpCisgICAgdmFsdWUgICA9IG1vZGVscy5UZXh0RmllbGQoYmxhbms9VHJ1ZSkKKyAgICBmaWxlX25hbWUgPSBtb2RlbHMuRmlsZVBhdGhGaWVsZChtYXhfbGVuZ3RoPTI1NSkKKyAgICBsaW5lX251bWJlciA9IG1vZGVscy5JbnRlZ2VyRmllbGQobnVsbD1UcnVlKQorICAgIG9wZXJhdGlvbiA9IG1vZGVscy5DaGFyRmllbGQobWF4X2xlbmd0aD02NCkKKworY2xhc3MgSGVscFRleHQobW9kZWxzLk1vZGVsKToKKyAgICBWQVJJQUJMRSA9IDAKKyAgICBIRUxQVEVYVF9BUkVBID0gKChWQVJJQUJMRSwgJ3ZhcmlhYmxlJyksICkKKworICAgIGJ1aWxkID0gbW9kZWxzLkZvcmVpZ25LZXkoQnVpbGQsIHJlbGF0ZWRfbmFtZT0naGVscHRleHRfYnVpbGQnKQorICAgIGFyZWEgPSBtb2RlbHMuSW50ZWdlckZpZWxkKGNob2ljZXM9SEVMUFRFWFRfQVJFQSkKKyAgICBrZXkgPSBtb2RlbHMuQ2hhckZpZWxkKG1heF9sZW5ndGg9MTAwKQorICAgIHRleHQgPSBtb2RlbHMuVGV4dEZpZWxkKCkKKworY2xhc3MgTG9nTWVzc2FnZShtb2RlbHMuTW9kZWwpOgorICAgIEVYQ0VQVElPTiA9IC0xICAgICAgIyB1c2VkIHRvIHNpZ25hbCBzZWxmLXRvYXN0ZXItZXhjZXB0aW9ucworICAgIElORk8gPSAwCisgICAgV0FSTklORyA9IDEKKyAgICBFUlJPUiA9IDIKKworICAgIExPR19MRVZFTCA9ICggKElORk8sICJpbmZvIiksCisgICAgICAgICAgICAoV0FSTklORywgIndhcm4iKSwKKyAgICAgICAgICAgIChFUlJPUiwgImVycm9yIiksCisgICAgICAgICAgICAoRVhDRVBUSU9OLCAidG9hc3RlciBleGNlcHRpb24iKSkKKworICAgIGJ1aWxkID0gbW9kZWxzLkZvcmVpZ25LZXkoQnVpbGQpCisgICAgdGFzayAgPSBtb2RlbHMuRm9yZWlnbktleShUYXNrLCBibGFuayA9IFRydWUsIG51bGw9VHJ1ZSkKKyAgICBsZXZlbCA9IG1vZGVscy5JbnRlZ2VyRmllbGQoY2hvaWNlcz1MT0dfTEVWRUwsIGRlZmF1bHQ9SU5GTykKKyAgICBtZXNzYWdlPW1vZGVscy5DaGFyRmllbGQobWF4X2xlbmd0aD0yNDApCisgICAgcGF0aG5hbWUgPSBtb2RlbHMuRmlsZVBhdGhGaWVsZChtYXhfbGVuZ3RoPTI1NSwgYmxhbms9VHJ1ZSkKKyAgICBsaW5lbm8gPSBtb2RlbHMuSW50ZWdlckZpZWxkKG51bGw9VHJ1ZSkKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIiVzICVzICVzIiAlIChzZWxmLmdldF9sZXZlbF9kaXNwbGF5KCksIHNlbGYubWVzc2FnZSwgc2VsZi5idWlsZCkKKworZGVmIGludmFsaWRhdGVfY2FjaGUoKiprd2FyZ3MpOgorICAgIGZyb20gZGphbmdvLmNvcmUuY2FjaGUgaW1wb3J0IGNhY2hlCisgICAgdHJ5OgorICAgICAgY2FjaGUuY2xlYXIoKQorICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgIGxvZ2dlci53YXJuaW5nKCJQcm9ibGVtIHdpdGggY2FjaGUgYmFja2VuZDogRmFpbGVkIHRvIGNsZWFyIGNhY2hlOiAlcyIgJSBlKQorCitkamFuZ28uZGIubW9kZWxzLnNpZ25hbHMucG9zdF9zYXZlLmNvbm5lY3QoaW52YWxpZGF0ZV9jYWNoZSkKK2RqYW5nby5kYi5tb2RlbHMuc2lnbmFscy5wb3N0X2RlbGV0ZS5jb25uZWN0KGludmFsaWRhdGVfY2FjaGUpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS90ZXN0cy5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL3Rlc3RzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4M2FlYTgKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS90ZXN0cy5weQpAQCAtMCwwICsxLDE4NyBAQAorIyEgL3Vzci9iaW4vZW52IHB5dGhvbgorIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyMKKyMgQml0QmFrZSBUb2FzdGVyIEltcGxlbWVudGF0aW9uCisjCisjIENvcHlyaWdodCAoQykgMjAxMy0yMDE1IEludGVsIENvcnBvcmF0aW9uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCisiIiJUZXN0IGNhc2VzIGZvciBUb2FzdGVyIE9STS4iIiIKKworZnJvbSBkamFuZ28udGVzdCBpbXBvcnQgVGVzdENhc2UsIFRyYW5zYWN0aW9uVGVzdENhc2UKK2Zyb20gb3JtLm1vZGVscyBpbXBvcnQgTG9jYWxMYXllclNvdXJjZSwgTGF5ZXJJbmRleExheWVyU291cmNlLCBJbXBvcnRlZExheWVyU291cmNlLCBMYXllclNvdXJjZQorZnJvbSBvcm0ubW9kZWxzIGltcG9ydCBCcmFuY2gKKworZnJvbSBvcm0ubW9kZWxzIGltcG9ydCBQcm9qZWN0LCBCdWlsZCwgTGF5ZXIsIExheWVyX1ZlcnNpb24sIEJyYW5jaCwgUHJvamVjdExheWVyCitmcm9tIG9ybS5tb2RlbHMgaW1wb3J0IFJlbGVhc2UsIFJlbGVhc2VMYXllclNvdXJjZVByaW9yaXR5LCBCaXRiYWtlVmVyc2lvbgorCitmcm9tIGRqYW5nby51dGlscyBpbXBvcnQgdGltZXpvbmUKK2Zyb20gZGphbmdvLmRiIGltcG9ydCBJbnRlZ3JpdHlFcnJvcgorCitpbXBvcnQgb3MKKworIyBzZXQgVFRTX0xBWUVSX0lOREVYIHRvIHRoZSBiYXNlIHVybCB0byB1c2UgYSBkaWZmZXJlbnQgaW5zdGFuY2Ugb2YgdGhlIGxheWVyIGluZGV4CisKK2NsYXNzIExheWVyU291cmNlVmVyaWZ5SW5oZXJpdGFuY2VTYXZlTG9hZChUZXN0Q2FzZSk6CisgICAgIiIiCisgICAgVGVzdHMgdG8gdmVyaWZ5IGluaGVyaXRhbmNlIGZvciB0aGUgTGF5ZXJTb3VyY2UgcHJveHktaW5oZXJpdGFuY2UgY2xhc3Nlcy4KKyAgICAiIiIKKyAgICBkZWYgdGVzdF9vYmplY3RfY3JlYXRpb24oc2VsZik6CisgICAgICAgICIiIlRlc3QgTGF5ZXJTb3VyY2Ugb2JqZWN0IGNyZWF0aW9uLiIiIgorICAgICAgICBmb3IgbmFtZSwgc291cmNldHlwZSBpbiBbKCJhMSIsIExheWVyU291cmNlLlRZUEVfTE9DQUwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJhMiIsIExheWVyU291cmNlLlRZUEVfTEFZRVJJTkRFWCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImEzIiwgTGF5ZXJTb3VyY2UuVFlQRV9JTVBPUlRFRCldOgorICAgICAgICAgICAgTGF5ZXJTb3VyY2Uub2JqZWN0cy5jcmVhdGUobmFtZT1uYW1lLCBzb3VyY2V0eXBlPXNvdXJjZXR5cGUpCisKKyAgICAgICAgb2JqZWN0cyA9IExheWVyU291cmNlLm9iamVjdHMuYWxsKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uob2JqZWN0c1swXSwgTG9jYWxMYXllclNvdXJjZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG9iamVjdHNbMV0sIExheWVySW5kZXhMYXllclNvdXJjZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG9iamVjdHNbMl0sIEltcG9ydGVkTGF5ZXJTb3VyY2UpKQorCisgICAgZGVmIHRlc3RfZHVwbGljYXRlX2Vycm9yKHNlbGYpOgorICAgICAgICAiIiJUZXN0IGNyZWF0aW9uIG9mIGR1cGxpY2F0ZSBMYXllclNvdXJjZSBvYmplY3RzLiIiIgorICAgICAgICBzdHlwZSA9IExheWVyU291cmNlLlRZUEVfTE9DQUwKKyAgICAgICAgTGF5ZXJTb3VyY2Uub2JqZWN0cy5jcmVhdGUobmFtZT0iYTEiLCBzb3VyY2V0eXBlPXN0eXBlKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEludGVncml0eUVycm9yKToKKyAgICAgICAgICAgIExheWVyU291cmNlLm9iamVjdHMuY3JlYXRlKG5hbWU9ImExIiwgc291cmNldHlwZT1zdHlwZSkKKworCitjbGFzcyBMSUxTVXBkYXRlVGVzdENhc2UoVHJhbnNhY3Rpb25UZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBMYXllciBTb3VyY2UgdXBkYXRlLiIiIgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAiIiJDcmVhdGUgcmVsZWFzZS4iIiIKKyAgICAgICAgYmJ2ID0gQml0YmFrZVZlcnNpb24ub2JqZWN0cy5jcmVhdGUoXAorICAgICAgICAgICAgICAgICAgbmFtZT0ibWFzdGVyIiwgZ2l0dXJsPSJnaXQ6Ly9naXQub3BlbmVtYmVkZGVkLm9yZy9iaXRiYWtlIikKKyAgICAgICAgUmVsZWFzZS5vYmplY3RzLmNyZWF0ZShuYW1lPSJkZWZhdWx0LXJlbGVhc2UiLCBiaXRiYWtlX3ZlcnNpb249YmJ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyYW5jaF9uYW1lPSJtYXN0ZXIiKQorCisgICAgZGVmIHRlc3RfdXBkYXRlKHNlbGYpOgorICAgICAgICAiIiJDaGVjayBpZiBMYXllclNvdXJjZS51cGRhdGUgY2FuIGZldGNoIGJyYW5jaGVzLiIiIgorICAgICAgICB1cmwgPSBvcy5nZXRlbnYoIlRUU19MQVlFUl9JTkRFWCIsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJodHRwOi8vbGF5ZXJzLm9wZW5lbWJlZGRlZC5vcmcvIikKKworICAgICAgICBsc29iaiA9IExheWVyU291cmNlLm9iamVjdHMuY3JlYXRlKFwKKyAgICAgICAgICAgICAgICAgICAgbmFtZT0iYjEiLCBzb3VyY2V0eXBlPUxheWVyU291cmNlLlRZUEVfTEFZRVJJTkRFWCwKKyAgICAgICAgICAgICAgICAgICAgYXBpdXJsPXVybCArICJsYXllcmluZGV4L2FwaS8iKQorICAgICAgICBsc29iai51cGRhdGUoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobHNvYmouYnJhbmNoX3NldC5hbGwoKS5jb3VudCgpID4gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJubyBicmFuY2hlcyBmZXRjaGVkIikKKworY2xhc3MgTGF5ZXJWZXJzaW9uRXF1aXZhbGVuY2VUZXN0Q2FzZShUZXN0Q2FzZSk6CisgICAgIiIiVmVyaWZ5IExheWVyX1ZlcnNpb24gcHJpb3JpdHkgc2VsZWN0aW9uLiIiIgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAiIiJDcmVhdGUgcmVxdWlyZWQgb2JqZWN0cy4iIiIKKyAgICAgICAgIyBjcmVhdGUgbGF5ZXIgc291cmNlCisgICAgICAgIHNlbGYubHNyYyA9IExheWVyU291cmNlLm9iamVjdHMuY3JlYXRlKG5hbWU9ImR1bW15LWxheWVyc291cmNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNldHlwZT1MYXllclNvdXJjZS5UWVBFX0xPQ0FMKQorICAgICAgICAjIGNyZWF0ZSByZWxlYXNlCisgICAgICAgIGJidiA9IEJpdGJha2VWZXJzaW9uLm9iamVjdHMuY3JlYXRlKFwKKyAgICAgICAgICAgICAgICAgIG5hbWU9Im1hc3RlciIsIGdpdHVybD0iZ2l0Oi8vZ2l0Lm9wZW5lbWJlZGRlZC5vcmcvYml0YmFrZSIpCisgICAgICAgIHNlbGYucmVsZWFzZSA9IFJlbGVhc2Uub2JqZWN0cy5jcmVhdGUobmFtZT0iZGVmYXVsdC1yZWxlYXNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRiYWtlX3ZlcnNpb249YmJ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyYW5jaF9uYW1lPSJtYXN0ZXIiKQorICAgICAgICAjIGF0dGFjaCBsYXllciBzb3VyY2UgdG8gcmVsZWFzZQorICAgICAgICBSZWxlYXNlTGF5ZXJTb3VyY2VQcmlvcml0eS5vYmplY3RzLmNyZWF0ZShcCisgICAgICAgICAgICByZWxlYXNlPXNlbGYucmVsZWFzZSwgbGF5ZXJfc291cmNlPXNlbGYubHNyYywgcHJpb3JpdHk9MSkKKworICAgICAgICAjIGNyZWF0ZSBhIGxheWVyIHZlcnNpb24gZm9yIHRoZSBsYXllciBvbiB0aGUgc3BlY2lmaWVkIGJyYW5jaAorICAgICAgICBzZWxmLmxheWVyID0gTGF5ZXIub2JqZWN0cy5jcmVhdGUobmFtZT0ibWV0YS10ZXN0bGF5ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJfc291cmNlPXNlbGYubHNyYykKKyAgICAgICAgc2VsZi5icmFuY2ggPSBCcmFuY2gub2JqZWN0cy5jcmVhdGUobmFtZT0ibWFzdGVyIiwgbGF5ZXJfc291cmNlPXNlbGYubHNyYykKKyAgICAgICAgc2VsZi5sdmVyID0gTGF5ZXJfVmVyc2lvbi5vYmplY3RzLmNyZWF0ZShcCisgICAgICAgICAgICBsYXllcj1zZWxmLmxheWVyLCBsYXllcl9zb3VyY2U9c2VsZi5sc3JjLCB1cF9icmFuY2g9c2VsZi5icmFuY2gpCisKKyAgICAgICAgIyBjcmVhdGUgcHJvamVjdCBhbmQgcHJvamVjdCBsYXllcgorICAgICAgICBzZWxmLnByb2plY3QgPSBQcm9qZWN0Lm9iamVjdHMuY3JlYXRlX3Byb2plY3QobmFtZT0idGVzdC1wcm9qZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2U9c2VsZi5yZWxlYXNlKQorICAgICAgICBQcm9qZWN0TGF5ZXIub2JqZWN0cy5jcmVhdGUocHJvamVjdD1zZWxmLnByb2plY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcmNvbW1pdD1zZWxmLmx2ZXIpCisKKyAgICAgICAgIyBjcmVhdGUgc3Bvb2YgbGF5ZXIgdGhhdCBzaG91bGQgbm90IGFwcGVhciBpbiB0aGUgc2VhcmNoIHJlc3VsdHMKKyAgICAgICAgbGF5ZXIgPSBMYXllci5vYmplY3RzLmNyZWF0ZShuYW1lPSJtZXRhLW5vdHZhbGlkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcl9zb3VyY2U9c2VsZi5sc3JjKQorICAgICAgICBzZWxmLmx2ZXIyID0gTGF5ZXJfVmVyc2lvbi5vYmplY3RzLmNyZWF0ZShsYXllcj1sYXllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJfc291cmNlPXNlbGYubHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBfYnJhbmNoPXNlbGYuYnJhbmNoKQorCisgICAgZGVmIHRlc3Rfc2luZ2xlX2xheWVyc291cmNlKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgV2hlbiB3ZSBoYXZlIGEgc2luZ2xlIGxheWVyIHZlcnNpb24sCisgICAgICAgIGdldF9lcXVpdmFsZW50c193cHJpb3JpdHkoKSBzaG91bGQgcmV0dXJuIGEgbGlzdCB3aXRoCisgICAgICAgIGp1c3QgdGhpcyBsYXllcl92ZXJzaW9uLgorICAgICAgICAiIiIKKyAgICAgICAgZXF1aXZxcyA9IHNlbGYubHZlci5nZXRfZXF1aXZhbGVudHNfd3ByaW9yaXR5KHNlbGYucHJvamVjdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGVxdWl2cXMpLCBbc2VsZi5sdmVyXSkKKworICAgIGRlZiB0ZXN0X2R1YWxfbGF5ZXJzb3VyY2Uoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBJZiB3ZSBoYXZlIHR3byBsYXllcnMgd2l0aCB0aGUgc2FtZSBuYW1lLCBmcm9tIGRpZmZlcmVudCBsYXllciBzb3VyY2VzLAorICAgICAgICB3ZSBleHBlY3QgYm90aCBsYXllcnMgaW4sIGluIGluY3JlYXNpbmcgcHJpb3JpdHkgb2YgdGhlIGxheWVyIHNvdXJjZS4KKyAgICAgICAgIiIiCisgICAgICAgIGxzcmMyID0gTGF5ZXJTb3VyY2Uub2JqZWN0cy5jcmVhdGUoXAorICAgICAgICAgICAgICAgICAgICBuYW1lPSJkdW1teS1sYXllcnNvdXJjZTIiLAorICAgICAgICAgICAgICAgICAgICBzb3VyY2V0eXBlPUxheWVyU291cmNlLlRZUEVfTE9DQUwsCisgICAgICAgICAgICAgICAgICAgIGFwaXVybD0idGVzdCIpCisKKyAgICAgICAgIyBhc3NpZ24gYSBsb3dlciBwcmlvcml0eSBmb3IgdGhlIHNlY29uZCBsYXllciBzb3VyY2UKKyAgICAgICAgc2VsZi5yZWxlYXNlLnJlbGVhc2VsYXllcnNvdXJjZXByaW9yaXR5X3NldC5jcmVhdGUobGF5ZXJfc291cmNlPWxzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eT0yKQorCisgICAgICAgICMgY3JlYXRlIGEgbmV3IGxheWVyX3ZlcnNpb24gZm9yIGEgbGF5ZXIgd2l0aCB0aGUgc2FtZSBuYW1lCisgICAgICAgICMgY29taW5nIGZyb20gdGhlIHNlY29uZCBsYXllciBzb3VyY2UKKyAgICAgICAgbGF5ZXIyID0gTGF5ZXIub2JqZWN0cy5jcmVhdGUobmFtZT0ibWV0YS10ZXN0bGF5ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcl9zb3VyY2U9bHNyYzIpCisgICAgICAgIGx2ZXIyID0gTGF5ZXJfVmVyc2lvbi5vYmplY3RzLmNyZWF0ZShsYXllcj1sYXllcjIsIGxheWVyX3NvdXJjZT1sc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwX2JyYW5jaD1zZWxmLmJyYW5jaCkKKworICAgICAgICAjIGV4cGVjdCB0d28gbGF5ZXIgdmVyc2lvbnMsIGluIHRoZSBwcmlvcml0eSBvcmRlcgorICAgICAgICBlcXVpdnFzID0gc2VsZi5sdmVyLmdldF9lcXVpdmFsZW50c193cHJpb3JpdHkoc2VsZi5wcm9qZWN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoZXF1aXZxcyksIFtsdmVyMiwgc2VsZi5sdmVyXSkKKworICAgIGRlZiB0ZXN0X2J1aWxkX2xheWVydmVyc2lvbihzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIEFueSBsYXllciB2ZXJzaW9uIGNvbWluZyBmcm9tIHRoZSBidWlsZCBzaG91bGQgc2hvdyB1cAorICAgICAgICBiZWZvcmUgYW55IGxheWVyIHZlcnNpb24gY29taW5nIGZyb20gdXBzdHJlYW0KKyAgICAgICAgIiIiCisgICAgICAgIGJ1aWxkID0gQnVpbGQub2JqZWN0cy5jcmVhdGUocHJvamVjdD1zZWxmLnByb2plY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZF9vbj10aW1lem9uZS5ub3coKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWRfb249dGltZXpvbmUubm93KCkpCisgICAgICAgIGx2YiA9IExheWVyX1ZlcnNpb24ub2JqZWN0cy5jcmVhdGUobGF5ZXI9c2VsZi5sYXllciwgYnVpbGQ9YnVpbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWl0PSJkZWFkYmVlZiIpCisKKyAgICAgICAgIyBhIGJ1aWxkIGxheWVydmVyc2lvbiBtdXN0IGJlIGluIHRoZSBlcXVpdmFsZW5jZQorICAgICAgICAjIGxpc3QgZm9yIHRoZSBvcmlnaW5hbCBsYXllcnZlcnNpb24KKyAgICAgICAgZXF1aXZxcyA9IHNlbGYubHZlci5nZXRfZXF1aXZhbGVudHNfd3ByaW9yaXR5KHNlbGYucHJvamVjdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihlcXVpdnFzKSA9PSAyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZXF1aXZxc1swXSA9PSBzZWxmLmx2ZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlcXVpdnFzWzFdID09IGx2YikKKworICAgICAgICAjIGdldHRpbmcgdGhlIGJ1aWxkIGxheWVydmVyc2lvbiBlcXVpdmFsZW50IGxpc3QgbXVzdAorICAgICAgICAjIHJldHVybiB0aGUgc2FtZSBsaXN0IGFzIHRoZSBvcmlnaW5hbCBsYXllcgorICAgICAgICBiZXF1aXZxcyA9IGx2Yi5nZXRfZXF1aXZhbGVudHNfd3ByaW9yaXR5KHNlbGYucHJvamVjdCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoZXF1aXZxcyksIGxpc3QoYmVxdWl2cXMpKQorCisgICAgZGVmIHRlc3RfY29tcGF0aWJsZV9sYXllcnZlcnNpb25zKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgV2hlbiB3ZSBoYXZlIGEgMiBsYXllciB2ZXJzaW9ucywgY29tcGF0aWJsZV9sYXllcnZlcnNpb25zKCkKKyAgICAgICAgc2hvdWxkIHJldHVybiBhIHF1ZXJ5c2V0IHdpdGggYm90aC4KKyAgICAgICAgIiIiCisgICAgICAgIGNvbXBhdF9sdiA9IHNlbGYucHJvamVjdC5jb21wYXRpYmxlX2xheWVydmVyc2lvbnMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoY29tcGF0X2x2KSwgW3NlbGYubHZlciwgc2VsZi5sdmVyMl0pCisKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9fX2luaXRfXy5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2Nzcy9ib290c3RyYXAtcmVzcG9uc2l2ZS5taW4uY3NzIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9jc3MvYm9vdHN0cmFwLXJlc3BvbnNpdmUubWluLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNTk3ODYwCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9jc3MvYm9vdHN0cmFwLXJlc3BvbnNpdmUubWluLmNzcwpAQCAtMCwwICsxLDkgQEAKKy8qIQorICogQm9vdHN0cmFwIFJlc3BvbnNpdmUgdjIuMy4wCisgKgorICogQ29weXJpZ2h0IDIwMTIgVHdpdHRlciwgSW5jCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgdjIuMAorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogRGVzaWduZWQgYW5kIGJ1aWx0IHdpdGggYWxsIHRoZSBsb3ZlIGluIHRoZSB3b3JsZCBAdHdpdHRlciBieSBAbWRvIGFuZCBAZmF0LgorICovLmNsZWFyZml4eyp6b29tOjF9LmNsZWFyZml4OmJlZm9yZSwuY2xlYXJmaXg6YWZ0ZXJ7ZGlzcGxheTp0YWJsZTtsaW5lLWhlaWdodDowO2NvbnRlbnQ6IiJ9LmNsZWFyZml4OmFmdGVye2NsZWFyOmJvdGh9LmhpZGUtdGV4dHtmb250OjAvMCBhO2NvbG9yOnRyYW5zcGFyZW50O3RleHQtc2hhZG93Om5vbmU7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXI6MH0uaW5wdXQtYmxvY2stbGV2ZWx7ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlO21pbi1oZWlnaHQ6MzBweDstd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDstbW96LWJveC1zaXppbmc6Ym9yZGVyLWJveDtib3gtc2l6aW5nOmJvcmRlci1ib3h9QC1tcy12aWV3cG9ydHt3aWR0aDpkZXZpY2Utd2lkdGh9LmhpZGRlbntkaXNwbGF5Om5vbmU7dmlzaWJpbGl0eTpoaWRkZW59LnZpc2libGUtcGhvbmV7ZGlzcGxheTpub25lIWltcG9ydGFudH0udmlzaWJsZS10YWJsZXR7ZGlzcGxheTpub25lIWltcG9ydGFudH0uaGlkZGVuLWRlc2t0b3B7ZGlzcGxheTpub25lIWltcG9ydGFudH0udmlzaWJsZS1kZXNrdG9we2Rpc3BsYXk6aW5oZXJpdCFpbXBvcnRhbnR9QG1lZGlhKG1pbi13aWR0aDo3NjhweCkgYW5kIChtYXgtd2lkdGg6OTc5cHgpey5oaWRkZW4tZGVza3RvcHtkaXNwbGF5OmluaGVyaXQhaW1wb3J0YW50fS52aXNpYmxlLWRlc2t0b3B7ZGlzcGxheTpub25lIWltcG9ydGFudH0udmlzaWJsZS10YWJsZXR7ZGlzcGxheTppbmhlcml0IWltcG9ydGFudH0uaGlkZGVuLXRhYmxldHtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fX1AbWVkaWEobWF4LXdpZHRoOjc2N3B4KXsuaGlkZGVuLWRlc2t0b3B7ZGlzcGxheTppbmhlcml0IWltcG9ydGFudH0udmlzaWJsZS1kZXNrdG9we2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9LnZpc2libGUtcGhvbmV7ZGlzcGxheTppbmhlcml0IWltcG9ydGFudH0uaGlkZGVuLXBob25le2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9fS52aXNpYmxlLXByaW50e2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9QG1lZGlhIHByaW50ey52aXNpYmxlLXByaW50e2Rpc3BsYXk6aW5oZXJpdCFpbXBvcnRhbnR9LmhpZGRlbi1wcmludHtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fX1AbWVkaWEobWluLXdpZHRoOjEyMDBweCl7LnJvd3ttYXJnaW4tbGVmdDotMzBweDsqem9vbToxfS5yb3c6YmVmb3JlLC5yb3c6YWZ0ZXJ7ZGlzcGxheTp0YWJsZTtsaW5lLWhlaWdodDowO2NvbnRlbnQ6IiJ9LnJvdzphZnRlcntjbGVhcjpib3RofVtjbGFzcyo9InNwYW4iXXtmbG9hdDpsZWZ0O21pbi1oZWlnaHQ6MXB4O21hcmdpbi1sZWZ0OjMwcHh9LmNvbnRhaW5lciwubmF2YmFyLXN0YXRpYy10b3AgLmNvbnRhaW5lciwubmF2YmFyLWZpeGVkLXRvcCAuY29udGFpbmVyLC5uYXZiYXItZml4ZWQtYm90dG9tIC5jb250YWluZXJ7d2lkdGg6MTE3MHB4fS5zcGFuMTJ7d2lkdGg6MTE3MHB4fS5zcGFuMTF7d2lkdGg6MTA3MHB4fS5zcGFuMTB7d2lkdGg6OTcwcHh9LnNwYW45e3dpZHRoOjg3MHB4fS5zcGFuOHt3aWR0aDo3NzBweH0uc3Bhbjd7d2lkdGg6NjcwcHh9LnNwYW42e3dpZHRoOjU3MHB4fS5zcGFuNXt3aWR0aDo0NzBweH0uc3BhbjR7d2lkdGg6MzcwcHh9LnNwYW4ze3dpZHRoOjI3MHB4fS5zcGFuMnt3aWR0aDoxNzBweH0uc3BhbjF7d2lkdGg6NzBweH0ub2Zmc2V0MTJ7bWFyZ2luLWxlZnQ6MTIzMHB4fS5vZmZzZXQxMXttYXJnaW4tbGVmdDoxMTMwcHh9Lm9mZnNldDEwe21hcmdpbi1sZWZ0OjEwMzBweH0ub2Zmc2V0OXttYXJnaW4tbGVmdDo5MzBweH0ub2Zmc2V0OHttYXJnaW4tbGVmdDo4MzBweH0ub2Zmc2V0N3ttYXJnaW4tbGVmdDo3MzBweH0ub2Zmc2V0NnttYXJnaW4tbGVmdDo2MzBweH0ub2Zmc2V0NXttYXJnaW4tbGVmdDo1MzBweH0ub2Zmc2V0NHttYXJnaW4tbGVmdDo0MzBweH0ub2Zmc2V0M3ttYXJnaW4tbGVmdDozMzBweH0ub2Zmc2V0MnttYXJnaW4tbGVmdDoyMzBweH0ub2Zmc2V0MXttYXJnaW4tbGVmdDoxMzBweH0ucm93LWZsdWlke3dpZHRoOjEwMCU7Knpvb206MX0ucm93LWZsdWlkOmJlZm9yZSwucm93LWZsdWlkOmFmdGVye2Rpc3BsYXk6dGFibGU7bGluZS1oZWlnaHQ6MDtjb250ZW50OiIifS5yb3ctZmx1aWQ6YWZ0ZXJ7Y2xlYXI6Ym90aH0ucm93LWZsdWlkIFtjbGFzcyo9InNwYW4iXXtkaXNwbGF5OmJsb2NrO2Zsb2F0OmxlZnQ7d2lkdGg6MTAwJTttaW4taGVpZ2h0OjMwcHg7bWFyZ2luLWxlZnQ6Mi41NjQxMDI1NjQxMDI1NjQlOyptYXJnaW4tbGVmdDoyLjUxMDkxMTA3NDc0MDg2MTYlOy13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94Oy1tb3otYm94LXNpemluZzpib3JkZXItYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveH0ucm93LWZsdWlkIFtjbGFzcyo9InNwYW4iXTpmaXJzdC1jaGlsZHttYXJnaW4tbGVmdDowfS5yb3ctZmx1aWQgLmNvbnRyb2xzLXJvdyBbY2xhc3MqPSJzcGFuIl0rW2NsYXNzKj0ic3BhbiJde21hcmdpbi1sZWZ0OjIuNTY0MTAyNTY0MTAyNTY0JX0ucm93LWZsdWlkIC5zcGFuMTJ7d2lkdGg6MTAwJTsqd2lkdGg6OTkuOTQ2ODA4NTEwNjM4MjklfS5yb3ctZmx1aWQgLnNwYW4xMXt3aWR0aDo5MS40NTI5OTE0NTI5OTE0NSU7KndpZHRoOjkxLjM5OTc5OTk2MzYyOTc1JX0ucm93LWZsdWlkIC5zcGFuMTB7d2lkdGg6ODIuOTA1OTgyOTA1OTgyOTElOyp3aWR0aDo4Mi44NTI3OTE0MTY2MjEyJX0ucm93LWZsdWlkIC5zcGFuOXt3aWR0aDo3NC4zNTg5NzQzNTg5NzQzNiU7KndpZHRoOjc0LjMwNTc4Mjg2OTYxMjY2JX0ucm93LWZsdWlkIC5zcGFuOHt3aWR0aDo2NS44MTE5NjU4MTE5NjU4MiU7KndpZHRoOjY1Ljc1ODc3NDMyMjYwNDExJX0ucm93LWZsdWlkIC5zcGFuN3t3aWR0aDo1Ny4yNjQ5NTcyNjQ5NTcyNiU7KndpZHRoOjU3LjIxMTc2NTc3NTU5NTU2JX0ucm93LWZsdWlkIC5zcGFuNnt3aWR0aDo0OC43MTc5NDg3MTc5NDg3MTUlOyp3aWR0aDo0OC42NjQ3NTcyMjg1ODcwMTQlfS5yb3ctZmx1aWQgLnNwYW41e3dpZHRoOjQwLjE3MDk0MDE3MDk0MDE3JTsqd2lkdGg6NDAuMTE3NzQ4NjgxNTc4NDclfS5yb3ctZmx1aWQgLnNwYW40e3dpZHRoOjMxLjYyMzkzMTYyMzkzMTYyNSU7KndpZHRoOjMxLjU3MDc0MDEzNDU2OTkyNCV9LnJvdy1mbHVpZCAuc3BhbjN7d2lkdGg6MjMuMDc2OTIzMDc2OTIzMDc3JTsqd2lkdGg6MjMuMDIzNzMxNTg3NTYxMzc1JX0ucm93LWZsdWlkIC5zcGFuMnt3aWR0aDoxNC41Mjk5MTQ1Mjk5MTQ1MyU7KndpZHRoOjE0LjQ3NjcyMzA0MDU1MjgyOCV9LnJvdy1mbHVpZCAuc3BhbjF7d2lkdGg6NS45ODI5MDU5ODI5MDU5ODMlOyp3aWR0aDo1LjkyOTcxNDQ5MzU0NDI4MSV9LnJvdy1mbHVpZCAub2Zmc2V0MTJ7bWFyZ2luLWxlZnQ6MTA1LjEyODIwNTEyODIwNTEyJTsqbWFyZ2luLWxlZnQ6MTA1LjAyMTgyMjE0OTQ4MTcxJX0ucm93LWZsdWlkIC5vZmZzZXQxMjpmaXJzdC1jaGlsZHttYXJnaW4tbGVmdDoxMDIuNTY0MTAyNTY0MTAyNTclOyptYXJnaW4tbGVmdDoxMDIuNDU3NzE5NTg1Mzc5MTUlfS5yb3ctZmx1aWQgLm9mZnNldDExe21hcmdpbi1sZWZ0Ojk2LjU4MTE5NjU4MTE5NjU4JTsqbWFyZ2luLWxlZnQ6OTYuNDc0ODEzNjAyNDczMTYlfS5yb3ctZmx1aWQgLm9mZnNldDExOmZpcnN0LWNoaWxke21hcmdpbi1sZWZ0Ojk0LjAxNzA5NDAxNzA5NDAyJTsqbWFyZ2luLWxlZnQ6OTMuOTEwNzExMDM4MzcwNjElfS5yb3ctZmx1aWQgLm9mZnNldDEwe21hcmdpbi1sZWZ0Ojg4LjAzNDE4ODAzNDE4ODAzJTsqbWFyZ2luLWxlZnQ6ODcuOTI3ODA1MDU1NDY0NjIlfS5yb3ctZmx1aWQgLm9mZnNldDEwOmZpcnN0LWNoaWxke21hcmdpbi1sZWZ0Ojg1LjQ3MDA4NTQ3MDA4NTQ4JTsqbWFyZ2luLWxlZnQ6ODUuMzYzNzAyNDkxMzYyMDYlfS5yb3ctZmx1aWQgLm9mZnNldDl7bWFyZ2luLWxlZnQ6NzkuNDg3MTc5NDg3MTc5NDklOyptYXJnaW4tbGVmdDo3OS4zODA3OTY1MDg0NTYwNyV9LnJvdy1mbHVpZCAub2Zmc2V0OTpmaXJzdC1jaGlsZHttYXJnaW4tbGVmdDo3Ni45MjMwNzY5MjMwNzY5MyU7Km1hcmdpbi1sZWZ0Ojc2LjgxNjY5Mzk0NDM1MzUyJX0ucm93LWZsdWlkIC5vZmZzZXQ4e21hcmdpbi1sZWZ0OjcwLjk0MDE3MDk0MDE3MDk0JTsqbWFyZ2luLWxlZnQ6NzAuODMzNzg3OTYxNDQ3NTMlfS5yb3ctZmx1aWQgLm9mZnNldDg6Zmlyc3QtY2hpbGR7bWFyZ2luLWxlZnQ6NjguMzc2MDY4Mzc2MDY4MzklOyptYXJnaW4tbGVmdDo2OC4yNjk2ODUzOTczNDQ5NyV9LnJvdy1mbHVpZCAub2Zmc2V0N3ttYXJnaW4tbGVmdDo2Mi4zOTMxNjIzOTMxNjIzODUlOyptYXJnaW4tbGVmdDo2Mi4yODY3Nzk0MTQ0Mzg5OSV9LnJvdy1mbHVpZCAub2Zmc2V0NzpmaXJzdC1jaGlsZHttYXJnaW4tbGVmdDo1OS44MjkwNTk4MjkwNTk4MiU7Km1hcmdpbi1sZWZ0OjU5LjcyMjY3Njg1MDMzNjQyJX0ucm93LWZsdWlkIC5vZmZzZXQ2e21hcmdpbi1sZWZ0OjUzLjg0NjE1Mzg0NjE1Mzg0JTsqbWFyZ2luLWxlZnQ6NTMuNzM5NzcwODY3NDMwNDQ0JX0ucm93LWZsdWlkIC5vZmZzZXQ2OmZpcnN0LWNoaWxke21hcmdpbi1sZWZ0OjUxLjI4MjA1MTI4MjA1MTI4JTsqbWFyZ2luLWxlZnQ6NTEuMTc1NjY4MzAzMzI3ODc1JX0ucm93LWZsdWlkIC5vZmZzZXQ1e21hcmdpbi1sZWZ0OjQ1LjI5OTE0NTI5OTE0NTI5NSU7Km1hcmdpbi1sZWZ0OjQ1LjE5Mjc2MjMyMDQyMTklfS5yb3ctZmx1aWQgLm9mZnNldDU6Zmlyc3QtY2hpbGR7bWFyZ2luLWxlZnQ6NDIuNzM1MDQyNzM1MDQyNzMlOyptYXJnaW4tbGVmdDo0Mi42Mjg2NTk3NTYzMTkzMyV9LnJvdy1mbHVpZCAub2Zmc2V0NHttYXJnaW4tbGVmdDozNi43NTIxMzY3NTIxMzY3NSU7Km1hcmdpbi1sZWZ0OjM2LjY0NTc1Mzc3MzQxMzM1NCV9LnJvdy1mbHVpZCAub2Zmc2V0NDpmaXJzdC1jaGlsZHttYXJnaW4tbGVmdDozNC4xODgwMzQxODgwMzQxOSU7Km1hcmdpbi1sZWZ0OjM0LjA4MTY1MTIwOTMxMDc4NSV9LnJvdy1mbHVpZCAub2Zmc2V0M3ttYXJnaW4tbGVmdDoyOC4yMDUxMjgyMDUxMjgyMDQlOyptYXJnaW4tbGVmdDoyOC4wOTg3NDUyMjY0MDQ4JX0ucm93LWZsdWlkIC5vZmZzZXQzOmZpcnN0LWNoaWxke21hcmdpbi1sZWZ0OjI1LjY0MTAyNTY0MTAyNTY0MiU7Km1hcmdpbi1sZWZ0OjI1LjUzNDY0MjY2MjMwMjI0JX0ucm93LWZsdWlkIC5vZmZzZXQye21hcmdpbi1sZWZ0OjE5LjY1ODExOTY1ODExOTY2JTsqbWFyZ2luLWxlZnQ6MTkuNTUxNzM2Njc5Mzk2MjU3JX0ucm93LWZsdWlkIC5vZmZzZXQyOmZpcnN0LWNoaWxke21hcmdpbi1sZWZ0OjE3LjA5NDAxNzA5NDAxNzA5NCU7Km1hcmdpbi1sZWZ0OjE2Ljk4NzYzNDExNTI5MzY5JX0ucm93LWZsdWlkIC5vZmZzZXQxe21hcmdpbi1sZWZ0OjExLjExMTExMTExMTExMTExJTsqbWFyZ2luLWxlZnQ6MTEuMDA0NzI4MTMyMzg3NzA4JX0ucm93LWZsdWlkIC5vZmZzZXQxOmZpcnN0LWNoaWxke21hcmdpbi1sZWZ0OjguNTQ3MDA4NTQ3MDA4NTQ3JTsqbWFyZ2luLWxlZnQ6OC40NDA2MjU1NjgyODUxNDIlfWlucHV0LHRleHRhcmVhLC51bmVkaXRhYmxlLWlucHV0e21hcmdpbi1sZWZ0OjB9LmNvbnRyb2xzLXJvdyBbY2xhc3MqPSJzcGFuIl0rW2NsYXNzKj0ic3BhbiJde21hcmdpbi1sZWZ0OjMwcHh9aW5wdXQuc3BhbjEyLHRleHRhcmVhLnNwYW4xMiwudW5lZGl0YWJsZS1pbnB1dC5zcGFuMTJ7d2lkdGg6MTE1NnB4fWlucHV0LnNwYW4xMSx0ZXh0YXJlYS5zcGFuMTEsLnVuZWRpdGFibGUtaW5wdXQuc3BhbjExe3dpZHRoOjEwNTZweH1pbnB1dC5zcGFuMTAsdGV4dGFyZWEuc3BhbjEwLC51bmVkaXRhYmxlLWlucHV0LnNwYW4xMHt3aWR0aDo5NTZweH1pbnB1dC5zcGFuOSx0ZXh0YXJlYS5zcGFuOSwudW5lZGl0YWJsZS1pbnB1dC5zcGFuOXt3aWR0aDo4NTZweH1pbnB1dC5zcGFuOCx0ZXh0YXJlYS5zcGFuOCwudW5lZGl0YWJsZS1pbnB1dC5zcGFuOHt3aWR0aDo3NTZweH1pbnB1dC5zcGFuNyx0ZXh0YXJlYS5zcGFuNywudW5lZGl0YWJsZS1pbnB1dC5zcGFuN3t3aWR0aDo2NTZweH1pbnB1dC5zcGFuNix0ZXh0YXJlYS5zcGFuNiwudW5lZGl0YWJsZS1pbnB1dC5zcGFuNnt3aWR0aDo1NTZweH1pbnB1dC5zcGFuNSx0ZXh0YXJlYS5zcGFuNSwudW5lZGl0YWJsZS1pbnB1dC5zcGFuNXt3aWR0aDo0NTZweH1pbnB1dC5zcGFuNCx0ZXh0YXJlYS5zcGFuNCwudW5lZGl0YWJsZS1pbnB1dC5zcGFuNHt3aWR0aDozNTZweH1pbnB1dC5zcGFuMyx0ZXh0YXJlYS5zcGFuMywudW5lZGl0YWJsZS1pbnB1dC5zcGFuM3t3aWR0aDoyNTZweH1pbnB1dC5zcGFuMix0ZXh0YXJlYS5zcGFuMiwudW5lZGl0YWJsZS1pbnB1dC5zcGFuMnt3aWR0aDoxNTZweH1pbnB1dC5zcGFuMSx0ZXh0YXJlYS5zcGFuMSwudW5lZGl0YWJsZS1pbnB1dC5zcGFuMXt3aWR0aDo1NnB4fS50aHVtYm5haWxze21hcmdpbi1sZWZ0Oi0zMHB4fS50aHVtYm5haWxzPmxpe21hcmdpbi1sZWZ0OjMwcHh9LnJvdy1mbHVpZCAudGh1bWJuYWlsc3ttYXJnaW4tbGVmdDowfX1AbWVkaWEobWluLXdpZHRoOjc2OHB4KSBhbmQgKG1heC13aWR0aDo5NzlweCl7LnJvd3ttYXJnaW4tbGVmdDotMjBweDsqem9vbToxfS5yb3c6YmVmb3JlLC5yb3c6YWZ0ZXJ7ZGlzcGxheTp0YWJsZTtsaW5lLWhlaWdodDowO2NvbnRlbnQ6IiJ9LnJvdzphZnRlcntjbGVhcjpib3RofVtjbGFzcyo9InNwYW4iXXtmbG9hdDpsZWZ0O21pbi1oZWlnaHQ6MXB4O21hcmdpbi1sZWZ0OjIwcHh9LmNvbnRhaW5lciwubmF2YmFyLXN0YXRpYy10b3AgLmNvbnRhaW5lciwubmF2YmFyLWZpeGVkLXRvcCAuY29udGFpbmVyLC5uYXZiYXItZml4ZWQtYm90dG9tIC5jb250YWluZXJ7d2lkdGg6NzI0cHh9LnNwYW4xMnt3aWR0aDo3MjRweH0uc3BhbjExe3dpZHRoOjY2MnB4fS5zcGFuMTB7d2lkdGg6NjAwcHh9LnNwYW45e3dpZHRoOjUzOHB4fS5zcGFuOHt3aWR0aDo0NzZweH0uc3Bhbjd7d2lkdGg6NDE0cHh9LnNwYW42e3dpZHRoOjM1MnB4fS5zcGFuNXt3aWR0aDoyOTBweH0uc3BhbjR7d2lkdGg6MjI4cHh9LnNwYW4ze3dpZHRoOjE2NnB4fS5zcGFuMnt3aWR0aDoxMDRweH0uc3BhbjF7d2lkdGg6NDJweH0ub2Zmc2V0MTJ7bWFyZ2luLWxlZnQ6NzY0cHh9Lm9mZnNldDExe21hcmdpbi1sZWZ0OjcwMnB4fS5vZmZzZXQxMHttYXJnaW4tbGVmdDo2NDBweH0ub2Zmc2V0OXttYXJnaW4tbGVmdDo1NzhweH0ub2Zmc2V0OHttYXJnaW4tbGVmdDo1MTZweH0ub2Zmc2V0N3ttYXJnaW4tbGVmdDo0NTRweH0ub2Zmc2V0NnttYXJnaW4tbGVmdDozOTJweH0ub2Zmc2V0NXttYXJnaW4tbGVmdDozMzBweH0ub2Zmc2V0NHttYXJnaW4tbGVmdDoyNjhweH0ub2Zmc2V0M3ttYXJnaW4tbGVmdDoyMDZweH0ub2Zmc2V0MnttYXJnaW4tbGVmdDoxNDRweH0ub2Zmc2V0MXttYXJnaW4tbGVmdDo4MnB4fS5yb3ctZmx1aWR7d2lkdGg6MTAwJTsqem9vbToxfS5yb3ctZmx1aWQ6YmVmb3JlLC5yb3ctZmx1aWQ6YWZ0ZXJ7ZGlzcGxheTp0YWJsZTtsaW5lLWhlaWdodDowO2NvbnRlbnQ6IiJ9LnJvdy1mbHVpZDphZnRlcntjbGVhcjpib3RofS5yb3ctZmx1aWQgW2NsYXNzKj0ic3BhbiJde2Rpc3BsYXk6YmxvY2s7ZmxvYXQ6bGVmdDt3aWR0aDoxMDAlO21pbi1oZWlnaHQ6MzBweDttYXJnaW4tbGVmdDoyLjc2MjQzMDkzOTIyNjUxOTQlOyptYXJnaW4tbGVmdDoyLjcwOTIzOTQ0OTg2NDgxNyU7LXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94fS5yb3ctZmx1aWQgW2NsYXNzKj0ic3BhbiJdOmZpcnN0LWNoaWxke21hcmdpbi1sZWZ0OjB9LnJvdy1mbHVpZCAuY29udHJvbHMtcm93IFtjbGFzcyo9InNwYW4iXStbY2xhc3MqPSJzcGFuIl17bWFyZ2luLWxlZnQ6Mi43NjI0MzA5MzkyMjY1MTk0JX0ucm93LWZsdWlkIC5zcGFuMTJ7d2lkdGg6MTAwJTsqd2lkdGg6OTkuOTQ2ODA4NTEwNjM4MjklfS5yb3ctZmx1aWQgLnNwYW4xMXt3aWR0aDo5MS40MzY0NjQwODgzOTc3OCU7KndpZHRoOjkxLjM4MzI3MjU5OTAzNjA4JX0ucm93LWZsdWlkIC5zcGFuMTB7d2lkdGg6ODIuODcyOTI4MTc2Nzk1NTglOyp3aWR0aDo4Mi44MTk3MzY2ODc0MzM4NyV9LnJvdy1mbHVpZCAuc3Bhbjl7d2lkdGg6NzQuMzA5MzkyMjY1MTkzMzclOyp3aWR0aDo3NC4yNTYyMDA3NzU4MzE2NiV9LnJvdy1mbHVpZCAuc3Bhbjh7d2lkdGg6NjUuNzQ1ODU2MzUzNTkxMTclOyp3aWR0aDo2NS42OTI2NjQ4NjQyMjk0NiV9LnJvdy1mbHVpZCAuc3Bhbjd7d2lkdGg6NTcuMTgyMzIwNDQxOTg4OTUlOyp3aWR0aDo1Ny4xMjkxMjg5NTI2MjcyNSV9LnJvdy1mbHVpZCAuc3BhbjZ7d2lkdGg6NDguNjE4Nzg0NTMwMzg2NzQlOyp3aWR0aDo0OC41NjU1OTMwNDEwMjUwNCV9LnJvdy1mbHVpZCAuc3BhbjV7d2lkdGg6NDAuMDU1MjQ4NjE4Nzg0NTMlOyp3aWR0aDo0MC4wMDIwNTcxMjk0MjI4MyV9LnJvdy1mbHVpZCAuc3BhbjR7d2lkdGg6MzEuNDkxNzEyNzA3MTgyMzIzJTsqd2lkdGg6MzEuNDM4NTIxMjE3ODIwNjIlfS5yb3ctZmx1aWQgLnNwYW4ze3dpZHRoOjIyLjkyODE3Njc5NTU4MDExJTsqd2lkdGg6MjIuODc0OTg1MzA2MjE4NDElfS5yb3ctZmx1aWQgLnNwYW4ye3dpZHRoOjE0LjM2NDY0MDg4Mzk3NzklOyp3aWR0aDoxNC4zMTE0NDkzOTQ2MTYxOTklfS5yb3ctZmx1aWQgLnNwYW4xe3dpZHRoOjUuODAxMTA0OTcyMzc1NjkxJTsqd2lkdGg6NS43NDc5MTM0ODMwMTM5ODglfS5yb3ctZmx1aWQgLm9mZnNldDEye21hcmdpbi1sZWZ0OjEwNS41MjQ4NjE4Nzg0NTMwNCU7Km1hcmdpbi1sZWZ0OjEwNS40MTg0Nzg4OTk3Mjk2MiV9LnJvdy1mbHVpZCAub2Zmc2V0MTI6Zmlyc3QtY2hpbGR7bWFyZ2luLWxlZnQ6MTAyLjc2MjQzMDkzOTIyNjUyJTsqbWFyZ2luLWxlZnQ6MTAyLjY1NjA0Nzk2MDUwMzElfS5yb3ctZmx1aWQgLm9mZnNldDExe21hcmdpbi1sZWZ0Ojk2Ljk2MTMyNTk2Njg1MDgyJTsqbWFyZ2luLWxlZnQ6OTYuODU0OTQyOTg4MTI3NCV9LnJvdy1mbHVpZCAub2Zmc2V0MTE6Zmlyc3QtY2hpbGR7bWFyZ2luLWxlZnQ6OTQuMTk4ODk1MDI3NjI0MyU7Km1hcmdpbi1sZWZ0Ojk0LjA5MjUxMjA0ODkwMDg5JX0ucm93LWZsdWlkIC5vZmZzZXQxMHttYXJnaW4tbGVmdDo4OC4zOTc3OTAwNTUyNDg2MiU7Km1hcmdpbi1sZWZ0Ojg4LjI5MTQwNzA3NjUyNTIlfS5yb3ctZmx1aWQgLm9mZnNldDEwOmZpcnN0LWNoaWxke21hcmdpbi1sZWZ0Ojg1LjYzNTM1OTExNjAyMjElOyptYXJnaW4tbGVmdDo4NS41Mjg5NzYxMzcyOTg2OCV9LnJvdy1mbHVpZCAub2Zmc2V0OXttYXJnaW4tbGVmdDo3OS44MzQyNTQxNDM2NDY0JTsqbWFyZ2luLWxlZnQ6NzkuNzI3ODcxMTY0OTIyOTklfS5yb3ctZmx1aWQgLm9mZnNldDk6Zmlyc3QtY2hpbGR7bWFyZ2luLWxlZnQ6NzcuMDcxODIzMjA0NDE5ODklOyptYXJnaW4tbGVmdDo3Ni45NjU0NDAyMjU2OTY0NyV9LnJvdy1mbHVpZCAub2Zmc2V0OHttYXJnaW4tbGVmdDo3MS4yNzA3MTgyMzIwNDQyJTsqbWFyZ2luLWxlZnQ6NzEuMTY0MzM1MjUzMzIwNzklfS5yb3ctZmx1aWQgLm9mZnNldDg6Zmlyc3QtY2hpbGR7bWFyZ2luLWxlZnQ6NjguNTA4Mjg3MjkyODE3NjglOyptYXJnaW4tbGVmdDo2OC40MDE5MDQzMTQwOTQyNyV9LnJvdy1mbHVpZCAub2Zmc2V0N3ttYXJnaW4tbGVmdDo2Mi43MDcxODIzMjA0NDE5OSU7Km1hcmdpbi1sZWZ0OjYyLjYwMDc5OTM0MTcxODU4NCV9LnJvdy1mbHVpZCAub2Zmc2V0NzpmaXJzdC1jaGlsZHttYXJnaW4tbGVmdDo1OS45NDQ3NTEzODEyMTU0NyU7Km1hcmdpbi1sZWZ0OjU5LjgzODM2ODQwMjQ5MjA2NSV9LnJvdy1mbHVpZCAub2Zmc2V0NnttYXJnaW4tbGVmdDo1NC4xNDM2NDY0MDg4Mzk3OCU7Km1hcmdpbi1sZWZ0OjU0LjAzNzI2MzQzMDExNjM3NiV9LnJvdy1mbHVpZCAub2Zmc2V0NjpmaXJzdC1jaGlsZHttYXJnaW4tbGVmdDo1MS4zODEyMTU0Njk2MTMyNiU7Km1hcmdpbi1sZWZ0OjUxLjI3NDgzMjQ5MDg4OTg2JX0ucm93LWZsdWlkIC5vZmZzZXQ1e21hcmdpbi1sZWZ0OjQ1LjU4MDExMDQ5NzIzNzU3JTsqbWFyZ2luLWxlZnQ6NDUuNDczNzI3NTE4NTE0MTclfS5yb3ctZmx1aWQgLm9mZnNldDU6Zmlyc3QtY2hpbGR7bWFyZ2luLWxlZnQ6NDIuODE3Njc5NTU4MDExMDUlOyptYXJnaW4tbGVmdDo0Mi43MTEyOTY1NzkyODc2NSV9LnJvdy1mbHVpZCAub2Zmc2V0NHttYXJnaW4tbGVmdDozNy4wMTY1NzQ1ODU2MzUzNiU7Km1hcmdpbi1sZWZ0OjM2LjkxMDE5MTYwNjkxMTk2JX0ucm93LWZsdWlkIC5vZmZzZXQ0OmZpcnN0LWNoaWxke21hcmdpbi1sZWZ0OjM0LjI1NDE0MzY0NjQwODg0JTsqbWFyZ2luLWxlZnQ6MzQuMTQ3NzYwNjY3Njg1NDQlfS5yb3ctZmx1aWQgLm9mZnNldDN7bWFyZ2luLWxlZnQ6MjguNDUzMDM4Njc0MDMzMTUlOyptYXJnaW4tbGVmdDoyOC4zNDY2NTU2OTUzMDk3NDYlfS5yb3ctZmx1aWQgLm9mZnNldDM6Zmlyc3QtY2hpbGR7bWFyZ2luLWxlZnQ6MjUuNjkwNjA3NzM0ODA2NjMlOyptYXJnaW4tbGVmdDoyNS41ODQyMjQ3NTYwODMyMjclfS5yb3ctZmx1aWQgLm9mZnNldDJ7bWFyZ2luLWxlZnQ6MTkuODg5NTAyNzYyNDMwOTQlOyptYXJnaW4tbGVmdDoxOS43ODMxMTk3ODM3MDc1MzclfS5yb3ctZmx1aWQgLm9mZnNldDI6Zmlyc3QtY2hpbGR7bWFyZ2luLWxlZnQ6MTcuMTI3MDcxODIzMjA0NDIlOyptYXJnaW4tbGVmdDoxNy4wMjA2ODg4NDQ0ODEwMiV9LnJvdy1mbHVpZCAub2Zmc2V0MXttYXJnaW4tbGVmdDoxMS4zMjU5NjY4NTA4Mjg3MyU7Km1hcmdpbi1sZWZ0OjExLjIxOTU4Mzg3MjEwNTMyNSV9LnJvdy1mbHVpZCAub2Zmc2V0MTpmaXJzdC1jaGlsZHttYXJnaW4tbGVmdDo4LjU2MzUzNTkxMTYwMjIxJTsqbWFyZ2luLWxlZnQ6OC40NTcxNTI5MzI4Nzg4MDYlfWlucHV0LHRleHRhcmVhLC51bmVkaXRhYmxlLWlucHV0e21hcmdpbi1sZWZ0OjB9LmNvbnRyb2xzLXJvdyBbY2xhc3MqPSJzcGFuIl0rW2NsYXNzKj0ic3BhbiJde21hcmdpbi1sZWZ0OjIwcHh9aW5wdXQuc3BhbjEyLHRleHRhcmVhLnNwYW4xMiwudW5lZGl0YWJsZS1pbnB1dC5zcGFuMTJ7d2lkdGg6NzEwcHh9aW5wdXQuc3BhbjExLHRleHRhcmVhLnNwYW4xMSwudW5lZGl0YWJsZS1pbnB1dC5zcGFuMTF7d2lkdGg6NjQ4cHh9aW5wdXQuc3BhbjEwLHRleHRhcmVhLnNwYW4xMCwudW5lZGl0YWJsZS1pbnB1dC5zcGFuMTB7d2lkdGg6NTg2cHh9aW5wdXQuc3BhbjksdGV4dGFyZWEuc3BhbjksLnVuZWRpdGFibGUtaW5wdXQuc3Bhbjl7d2lkdGg6NTI0cHh9aW5wdXQuc3BhbjgsdGV4dGFyZWEuc3BhbjgsLnVuZWRpdGFibGUtaW5wdXQuc3Bhbjh7d2lkdGg6NDYycHh9aW5wdXQuc3BhbjcsdGV4dGFyZWEuc3BhbjcsLnVuZWRpdGFibGUtaW5wdXQuc3Bhbjd7d2lkdGg6NDAwcHh9aW5wdXQuc3BhbjYsdGV4dGFyZWEuc3BhbjYsLnVuZWRpdGFibGUtaW5wdXQuc3BhbjZ7d2lkdGg6MzM4cHh9aW5wdXQuc3BhbjUsdGV4dGFyZWEuc3BhbjUsLnVuZWRpdGFibGUtaW5wdXQuc3BhbjV7d2lkdGg6Mjc2cHh9aW5wdXQuc3BhbjQsdGV4dGFyZWEuc3BhbjQsLnVuZWRpdGFibGUtaW5wdXQuc3BhbjR7d2lkdGg6MjE0cHh9aW5wdXQuc3BhbjMsdGV4dGFyZWEuc3BhbjMsLnVuZWRpdGFibGUtaW5wdXQuc3BhbjN7d2lkdGg6MTUycHh9aW5wdXQuc3BhbjIsdGV4dGFyZWEuc3BhbjIsLnVuZWRpdGFibGUtaW5wdXQuc3BhbjJ7d2lkdGg6OTBweH1pbnB1dC5zcGFuMSx0ZXh0YXJlYS5zcGFuMSwudW5lZGl0YWJsZS1pbnB1dC5zcGFuMXt3aWR0aDoyOHB4fX1AbWVkaWEobWF4LXdpZHRoOjc2N3B4KXtib2R5e3BhZGRpbmctcmlnaHQ6MjBweDtwYWRkaW5nLWxlZnQ6MjBweH0ubmF2YmFyLWZpeGVkLXRvcCwubmF2YmFyLWZpeGVkLWJvdHRvbSwubmF2YmFyLXN0YXRpYy10b3B7bWFyZ2luLXJpZ2h0Oi0yMHB4O21hcmdpbi1sZWZ0Oi0yMHB4fS5jb250YWluZXItZmx1aWR7cGFkZGluZzowfS5kbC1ob3Jpem9udGFsIGR0e2Zsb2F0Om5vbmU7d2lkdGg6YXV0bztjbGVhcjpub25lO3RleHQtYWxpZ246bGVmdH0uZGwtaG9yaXpvbnRhbCBkZHttYXJnaW4tbGVmdDowfS5jb250YWluZXJ7d2lkdGg6YXV0b30ucm93LWZsdWlke3dpZHRoOjEwMCV9LnJvdywudGh1bWJuYWlsc3ttYXJnaW4tbGVmdDowfS50aHVtYm5haWxzPmxpe2Zsb2F0Om5vbmU7bWFyZ2luLWxlZnQ6MH1bY2xhc3MqPSJzcGFuIl0sLnVuZWRpdGFibGUtaW5wdXRbY2xhc3MqPSJzcGFuIl0sLnJvdy1mbHVpZCBbY2xhc3MqPSJzcGFuIl17ZGlzcGxheTpibG9jaztmbG9hdDpub25lO3dpZHRoOjEwMCU7bWFyZ2luLWxlZnQ6MDstd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDstbW96LWJveC1zaXppbmc6Ym9yZGVyLWJveDtib3gtc2l6aW5nOmJvcmRlci1ib3h9LnNwYW4xMiwucm93LWZsdWlkIC5zcGFuMTJ7d2lkdGg6MTAwJTstd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDstbW96LWJveC1zaXppbmc6Ym9yZGVyLWJveDtib3gtc2l6aW5nOmJvcmRlci1ib3h9LnJvdy1mbHVpZCBbY2xhc3MqPSJvZmZzZXQiXTpmaXJzdC1jaGlsZHttYXJnaW4tbGVmdDowfS5pbnB1dC1sYXJnZSwuaW5wdXQteGxhcmdlLC5pbnB1dC14eGxhcmdlLGlucHV0W2NsYXNzKj0ic3BhbiJdLHNlbGVjdFtjbGFzcyo9InNwYW4iXSx0ZXh0YXJlYVtjbGFzcyo9InNwYW4iXSwudW5lZGl0YWJsZS1pbnB1dHtkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCU7bWluLWhlaWdodDozMHB4Oy13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94Oy1tb3otYm94LXNpemluZzpib3JkZXItYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveH0uaW5wdXQtcHJlcGVuZCBpbnB1dCwuaW5wdXQtYXBwZW5kIGlucHV0LC5pbnB1dC1wcmVwZW5kIGlucHV0W2NsYXNzKj0ic3BhbiJdLC5pbnB1dC1hcHBlbmQgaW5wdXRbY2xhc3MqPSJzcGFuIl17ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6YXV0b30uY29udHJvbHMtcm93IFtjbGFzcyo9InNwYW4iXStbY2xhc3MqPSJzcGFuIl17bWFyZ2luLWxlZnQ6MH0ubW9kYWx7cG9zaXRpb246Zml4ZWQ7dG9wOjIwcHg7cmlnaHQ6MjBweDtsZWZ0OjIwcHg7d2lkdGg6YXV0bzttYXJnaW46MH0ubW9kYWwuZmFkZXt0b3A6LTEwMHB4fS5tb2RhbC5mYWRlLmlue3RvcDoyMHB4fX1AbWVkaWEobWF4LXdpZHRoOjQ4MHB4KXsubmF2LWNvbGxhcHNley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKX0ucGFnZS1oZWFkZXIgaDEgc21hbGx7ZGlzcGxheTpibG9jaztsaW5lLWhlaWdodDoyMHB4fWlucHV0W3R5cGU9ImNoZWNrYm94Il0saW5wdXRbdHlwZT0icmFkaW8iXXtib3JkZXI6MXB4IHNvbGlkICNjY2N9LmZvcm0taG9yaXpvbnRhbCAuY29udHJvbC1sYWJlbHtmbG9hdDpub25lO3dpZHRoOmF1dG87cGFkZGluZy10b3A6MDt0ZXh0LWFsaWduOmxlZnR9LmZvcm0taG9yaXpvbnRhbCAuY29udHJvbHN7bWFyZ2luLWxlZnQ6MH0uZm9ybS1ob3Jpem9udGFsIC5jb250cm9sLWxpc3R7cGFkZGluZy10b3A6MH0uZm9ybS1ob3Jpem9udGFsIC5mb3JtLWFjdGlvbnN7cGFkZGluZy1yaWdodDoxMHB4O3BhZGRpbmctbGVmdDoxMHB4fS5tZWRpYSAucHVsbC1sZWZ0LC5tZWRpYSAucHVsbC1yaWdodHtkaXNwbGF5OmJsb2NrO2Zsb2F0Om5vbmU7bWFyZ2luLWJvdHRvbToxMHB4fS5tZWRpYS1vYmplY3R7bWFyZ2luLXJpZ2h0OjA7bWFyZ2luLWxlZnQ6MH0ubW9kYWx7dG9wOjEwcHg7cmlnaHQ6MTBweDtsZWZ0OjEwcHh9Lm1vZGFsLWhlYWRlciAuY2xvc2V7cGFkZGluZzoxMHB4O21hcmdpbjotMTBweH0uY2Fyb3VzZWwtY2FwdGlvbntwb3NpdGlvbjpzdGF0aWN9fUBtZWRpYShtYXgtd2lkdGg6OTc5cHgpe2JvZHl7cGFkZGluZy10b3A6MH0ubmF2YmFyLWZpeGVkLXRvcCwubmF2YmFyLWZpeGVkLWJvdHRvbXtwb3NpdGlvbjpzdGF0aWN9Lm5hdmJhci1maXhlZC10b3B7bWFyZ2luLWJvdHRvbToyMHB4fS5uYXZiYXItZml4ZWQtYm90dG9te21hcmdpbi10b3A6MjBweH0ubmF2YmFyLWZpeGVkLXRvcCAubmF2YmFyLWlubmVyLC5uYXZiYXItZml4ZWQtYm90dG9tIC5uYXZiYXItaW5uZXJ7cGFkZGluZzo1cHh9Lm5hdmJhciAuY29udGFpbmVye3dpZHRoOmF1dG87cGFkZGluZzowfS5uYXZiYXIgLmJyYW5ke3BhZGRpbmctcmlnaHQ6MTBweDtwYWRkaW5nLWxlZnQ6MTBweDttYXJnaW46MCAwIDAgLTVweH0ubmF2LWNvbGxhcHNle2NsZWFyOmJvdGh9Lm5hdi1jb2xsYXBzZSAubmF2e2Zsb2F0Om5vbmU7bWFyZ2luOjAgMCAxMHB4fS5uYXYtY29sbGFwc2UgLm5hdj5saXtmbG9hdDpub25lfS5uYXYtY29sbGFwc2UgLm5hdj5saT5he21hcmdpbi1ib3R0b206MnB4fS5uYXYtY29sbGFwc2UgLm5hdj4uZGl2aWRlci12ZXJ0aWNhbHtkaXNwbGF5Om5vbmV9Lm5hdi1jb2xsYXBzZSAubmF2IC5uYXYtaGVhZGVye2NvbG9yOiM3Nzc7dGV4dC1zaGFkb3c6bm9uZX0ubmF2LWNvbGxhcHNlIC5uYXY+bGk+YSwubmF2LWNvbGxhcHNlIC5kcm9wZG93bi1tZW51IGF7cGFkZGluZzo5cHggMTVweDtmb250LXdlaWdodDpib2xkO2NvbG9yOiM3Nzc7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjNweDstbW96LWJvcmRlci1yYWRpdXM6M3B4O2JvcmRlci1yYWRpdXM6M3B4fS5uYXYtY29sbGFwc2UgLmJ0bntwYWRkaW5nOjRweCAxMHB4IDRweDtmb250LXdlaWdodDpub3JtYWw7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXM6NHB4O2JvcmRlci1yYWRpdXM6NHB4fS5uYXYtY29sbGFwc2UgLmRyb3Bkb3duLW1lbnUgbGkrbGkgYXttYXJnaW4tYm90dG9tOjJweH0ubmF2LWNvbGxhcHNlIC5uYXY+bGk+YTpob3ZlciwubmF2LWNvbGxhcHNlIC5uYXY+bGk+YTpmb2N1cywubmF2LWNvbGxhcHNlIC5kcm9wZG93bi1tZW51IGE6aG92ZXIsLm5hdi1jb2xsYXBzZSAuZHJvcGRvd24tbWVudSBhOmZvY3Vze2JhY2tncm91bmQtY29sb3I6I2YyZjJmMn0ubmF2YmFyLWludmVyc2UgLm5hdi1jb2xsYXBzZSAubmF2PmxpPmEsLm5hdmJhci1pbnZlcnNlIC5uYXYtY29sbGFwc2UgLmRyb3Bkb3duLW1lbnUgYXtjb2xvcjojOTk5fS5uYXZiYXItaW52ZXJzZSAubmF2LWNvbGxhcHNlIC5uYXY+bGk+YTpob3ZlciwubmF2YmFyLWludmVyc2UgLm5hdi1jb2xsYXBzZSAubmF2PmxpPmE6Zm9jdXMsLm5hdmJhci1pbnZlcnNlIC5uYXYtY29sbGFwc2UgLmRyb3Bkb3duLW1lbnUgYTpob3ZlciwubmF2YmFyLWludmVyc2UgLm5hdi1jb2xsYXBzZSAuZHJvcGRvd24tbWVudSBhOmZvY3Vze2JhY2tncm91bmQtY29sb3I6IzExMX0ubmF2LWNvbGxhcHNlLmluIC5idG4tZ3JvdXB7cGFkZGluZzowO21hcmdpbi10b3A6NXB4fS5uYXYtY29sbGFwc2UgLmRyb3Bkb3duLW1lbnV7cG9zaXRpb246c3RhdGljO3RvcDphdXRvO2xlZnQ6YXV0bztkaXNwbGF5Om5vbmU7ZmxvYXQ6bm9uZTttYXgtd2lkdGg6bm9uZTtwYWRkaW5nOjA7bWFyZ2luOjAgMTVweDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlcjowOy13ZWJraXQtYm9yZGVyLXJhZGl1czowOy1tb3otYm9yZGVyLXJhZGl1czowO2JvcmRlci1yYWRpdXM6MDstd2Via2l0LWJveC1zaGFkb3c6bm9uZTstbW96LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9Lm5hdi1jb2xsYXBzZSAub3Blbj4uZHJvcGRvd24tbWVudXtkaXNwbGF5OmJsb2NrfS5uYXYtY29sbGFwc2UgLmRyb3Bkb3duLW1lbnU6YmVmb3JlLC5uYXYtY29sbGFwc2UgLmRyb3Bkb3duLW1lbnU6YWZ0ZXJ7ZGlzcGxheTpub25lfS5uYXYtY29sbGFwc2UgLmRyb3Bkb3duLW1lbnUgLmRpdmlkZXJ7ZGlzcGxheTpub25lfS5uYXYtY29sbGFwc2UgLm5hdj5saT4uZHJvcGRvd24tbWVudTpiZWZvcmUsLm5hdi1jb2xsYXBzZSAubmF2PmxpPi5kcm9wZG93bi1tZW51OmFmdGVye2Rpc3BsYXk6bm9uZX0ubmF2LWNvbGxhcHNlIC5uYXZiYXItZm9ybSwubmF2LWNvbGxhcHNlIC5uYXZiYXItc2VhcmNoe2Zsb2F0Om5vbmU7cGFkZGluZzoxMHB4IDE1cHg7bWFyZ2luOjEwcHggMDtib3JkZXItdG9wOjFweCBzb2xpZCAjZjJmMmYyO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNmMmYyZjI7LXdlYmtpdC1ib3gtc2hhZG93Omluc2V0IDAgMXB4IDAgcmdiYSgyNTUsMjU1LDI1NSwwLjEpLDAgMXB4IDAgcmdiYSgyNTUsMjU1LDI1NSwwLjEpOy1tb3otYm94LXNoYWRvdzppbnNldCAwIDFweCAwIHJnYmEoMjU1LDI1NSwyNTUsMC4xKSwwIDFweCAwIHJnYmEoMjU1LDI1NSwyNTUsMC4xKTtib3gtc2hhZG93Omluc2V0IDAgMXB4IDAgcmdiYSgyNTUsMjU1LDI1NSwwLjEpLDAgMXB4IDAgcmdiYSgyNTUsMjU1LDI1NSwwLjEpfS5uYXZiYXItaW52ZXJzZSAubmF2LWNvbGxhcHNlIC5uYXZiYXItZm9ybSwubmF2YmFyLWludmVyc2UgLm5hdi1jb2xsYXBzZSAubmF2YmFyLXNlYXJjaHtib3JkZXItdG9wLWNvbG9yOiMxMTE7Ym9yZGVyLWJvdHRvbS1jb2xvcjojMTExfS5uYXZiYXIgLm5hdi1jb2xsYXBzZSAubmF2LnB1bGwtcmlnaHR7ZmxvYXQ6bm9uZTttYXJnaW4tbGVmdDowfS5uYXYtY29sbGFwc2UsLm5hdi1jb2xsYXBzZS5jb2xsYXBzZXtoZWlnaHQ6MDtvdmVyZmxvdzpoaWRkZW59Lm5hdmJhciAuYnRuLW5hdmJhcntkaXNwbGF5OmJsb2NrfS5uYXZiYXItc3RhdGljIC5uYXZiYXItaW5uZXJ7cGFkZGluZy1yaWdodDoxMHB4O3BhZGRpbmctbGVmdDoxMHB4fX1AbWVkaWEobWluLXdpZHRoOjk4MHB4KXsubmF2LWNvbGxhcHNlLmNvbGxhcHNle2hlaWdodDphdXRvIWltcG9ydGFudDtvdmVyZmxvdzp2aXNpYmxlIWltcG9ydGFudH19CmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2Nzcy9ib290c3RyYXAubWluLmNzcyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvY3NzL2Jvb3RzdHJhcC5taW4uY3NzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJiOTI3ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2Nzcy9ib290c3RyYXAubWluLmNzcwpAQCAtMCwwICsxLDkgQEAKKy8qIQorICogQm9vdHN0cmFwIHYyLjMuMAorICoKKyAqIENvcHlyaWdodCAyMDEyIFR3aXR0ZXIsIEluYworICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIHYyLjAKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIERlc2lnbmVkIGFuZCBidWlsdCB3aXRoIGFsbCB0aGUgbG92ZSBpbiB0aGUgd29ybGQgQHR3aXR0ZXIgYnkgQG1kbyBhbmQgQGZhdC4KKyAqLy5jbGVhcmZpeHsqem9vbToxfS5jbGVhcmZpeDpiZWZvcmUsLmNsZWFyZml4OmFmdGVye2Rpc3BsYXk6dGFibGU7bGluZS1oZWlnaHQ6MDtjb250ZW50OiIifS5jbGVhcmZpeDphZnRlcntjbGVhcjpib3RofS5oaWRlLXRleHR7Zm9udDowLzAgYTtjb2xvcjp0cmFuc3BhcmVudDt0ZXh0LXNoYWRvdzpub25lO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyOjB9LmlucHV0LWJsb2NrLWxldmVse2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJTttaW4taGVpZ2h0OjMwcHg7LXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94fWFydGljbGUsYXNpZGUsZGV0YWlscyxmaWdjYXB0aW9uLGZpZ3VyZSxmb290ZXIsaGVhZGVyLGhncm91cCxuYXYsc2VjdGlvbntkaXNwbGF5OmJsb2NrfWF1ZGlvLGNhbnZhcyx2aWRlb3tkaXNwbGF5OmlubGluZS1ibG9jazsqZGlzcGxheTppbmxpbmU7Knpvb206MX1hdWRpbzpub3QoW2NvbnRyb2xzXSl7ZGlzcGxheTpub25lfWh0bWx7Zm9udC1zaXplOjEwMCU7LXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OjEwMCU7LW1zLXRleHQtc2l6ZS1hZGp1c3Q6MTAwJX1hOmZvY3Vze291dGxpbmU6dGhpbiBkb3R0ZWQgIzMzMztvdXRsaW5lOjVweCBhdXRvIC13ZWJraXQtZm9jdXMtcmluZy1jb2xvcjtvdXRsaW5lLW9mZnNldDotMnB4fWE6aG92ZXIsYTphY3RpdmV7b3V0bGluZTowfXN1YixzdXB7cG9zaXRpb246cmVsYXRpdmU7Zm9udC1zaXplOjc1JTtsaW5lLWhlaWdodDowO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lfXN1cHt0b3A6LTAuNWVtfXN1Yntib3R0b206LTAuMjVlbX1pbWd7d2lkdGg6YXV0b1w5O2hlaWdodDphdXRvO21heC13aWR0aDoxMDAlO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtib3JkZXI6MDstbXMtaW50ZXJwb2xhdGlvbi1tb2RlOmJpY3ViaWN9I21hcF9jYW52YXMgaW1nLC5nb29nbGUtbWFwcyBpbWd7bWF4LXdpZHRoOm5vbmV9YnV0dG9uLGlucHV0LHNlbGVjdCx0ZXh0YXJlYXttYXJnaW46MDtmb250LXNpemU6MTAwJTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9YnV0dG9uLGlucHV0eypvdmVyZmxvdzp2aXNpYmxlO2xpbmUtaGVpZ2h0Om5vcm1hbH1idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsaW5wdXQ6Oi1tb3otZm9jdXMtaW5uZXJ7cGFkZGluZzowO2JvcmRlcjowfWJ1dHRvbixodG1sIGlucHV0W3R5cGU9ImJ1dHRvbiJdLGlucHV0W3R5cGU9InJlc2V0Il0saW5wdXRbdHlwZT0ic3VibWl0Il17Y3Vyc29yOnBvaW50ZXI7LXdlYmtpdC1hcHBlYXJhbmNlOmJ1dHRvbn1sYWJlbCxzZWxlY3QsYnV0dG9uLGlucHV0W3R5cGU9ImJ1dHRvbiJdLGlucHV0W3R5cGU9InJlc2V0Il0saW5wdXRbdHlwZT0ic3VibWl0Il0saW5wdXRbdHlwZT0icmFkaW8iXSxpbnB1dFt0eXBlPSJjaGVja2JveCJde2N1cnNvcjpwb2ludGVyfWlucHV0W3R5cGU9InNlYXJjaCJdey13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveDstd2Via2l0LWFwcGVhcmFuY2U6dGV4dGZpZWxkfWlucHV0W3R5cGU9InNlYXJjaCJdOjotd2Via2l0LXNlYXJjaC1kZWNvcmF0aW9uLGlucHV0W3R5cGU9InNlYXJjaCJdOjotd2Via2l0LXNlYXJjaC1jYW5jZWwtYnV0dG9uey13ZWJraXQtYXBwZWFyYW5jZTpub25lfXRleHRhcmVhe292ZXJmbG93OmF1dG87dmVydGljYWwtYWxpZ246dG9wfUBtZWRpYSBwcmludHsqe2NvbG9yOiMwMDAhaW1wb3J0YW50O3RleHQtc2hhZG93Om5vbmUhaW1wb3J0YW50O2JhY2tncm91bmQ6dHJhbnNwYXJlbnQhaW1wb3J0YW50O2JveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnR9YSxhOnZpc2l0ZWR7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX1hW2hyZWZdOmFmdGVye2NvbnRlbnQ6IiAoIiBhdHRyKGhyZWYpICIpIn1hYmJyW3RpdGxlXTphZnRlcntjb250ZW50OiIgKCIgYXR0cih0aXRsZSkgIikifS5pciBhOmFmdGVyLGFbaHJlZl49ImphdmFzY3JpcHQ6Il06YWZ0ZXIsYVtocmVmXj0iIyJdOmFmdGVye2NvbnRlbnQ6IiJ9cHJlLGJsb2NrcXVvdGV7Ym9yZGVyOjFweCBzb2xpZCAjOTk5O3BhZ2UtYnJlYWstaW5zaWRlOmF2b2lkfXRoZWFke2Rpc3BsYXk6dGFibGUtaGVhZGVyLWdyb3VwfXRyLGltZ3twYWdlLWJyZWFrLWluc2lkZTphdm9pZH1pbWd7bWF4LXdpZHRoOjEwMCUhaW1wb3J0YW50fUBwYWdle21hcmdpbjouNWNtfXAsaDIsaDN7b3JwaGFuczozO3dpZG93czozfWgyLGgze3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWR9fWJvZHl7bWFyZ2luOjA7Zm9udC1mYW1pbHk6IkhlbHZldGljYSBOZXVlIixIZWx2ZXRpY2EsQXJpYWwsc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtsaW5lLWhlaWdodDoyMHB4O2NvbG9yOiMzMzM7YmFja2dyb3VuZC1jb2xvcjojZmZmfWF7Y29sb3I6IzA4Yzt0ZXh0LWRlY29yYXRpb246bm9uZX1hOmhvdmVyLGE6Zm9jdXN7Y29sb3I6IzAwNTU4MDt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lfS5pbWctcm91bmRlZHstd2Via2l0LWJvcmRlci1yYWRpdXM6NnB4Oy1tb3otYm9yZGVyLXJhZGl1czo2cHg7Ym9yZGVyLXJhZGl1czo2cHh9LmltZy1wb2xhcm9pZHtwYWRkaW5nOjRweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ym9yZGVyOjFweCBzb2xpZCAjY2NjO2JvcmRlcjoxcHggc29saWQgcmdiYSgwLDAsMCwwLjIpOy13ZWJraXQtYm94LXNoYWRvdzowIDFweCAzcHggcmdiYSgwLDAsMCwwLjEpOy1tb3otYm94LXNoYWRvdzowIDFweCAzcHggcmdiYSgwLDAsMCwwLjEpO2JveC1zaGFkb3c6MCAxcHggM3B4IHJnYmEoMCwwLDAsMC4xKX0uaW1nLWNpcmNsZXstd2Via2l0LWJvcmRlci1yYWRpdXM6NTAwcHg7LW1vei1ib3JkZXItcmFkaXVzOjUwMHB4O2JvcmRlci1yYWRpdXM6NTAwcHh9LnJvd3ttYXJnaW4tbGVmdDotMjBweDsqem9vbToxfS5yb3c6YmVmb3JlLC5yb3c6YWZ0ZXJ7ZGlzcGxheTp0YWJsZTtsaW5lLWhlaWdodDowO2NvbnRlbnQ6IiJ9LnJvdzphZnRlcntjbGVhcjpib3RofVtjbGFzcyo9InNwYW4iXXtmbG9hdDpsZWZ0O21pbi1oZWlnaHQ6MXB4O21hcmdpbi1sZWZ0OjIwcHh9LmNvbnRhaW5lciwubmF2YmFyLXN0YXRpYy10b3AgLmNvbnRhaW5lciwubmF2YmFyLWZpeGVkLXRvcCAuY29udGFpbmVyLC5uYXZiYXItZml4ZWQtYm90dG9tIC5jb250YWluZXJ7d2lkdGg6OTQwcHh9LnNwYW4xMnt3aWR0aDo5NDBweH0uc3BhbjExe3dpZHRoOjg2MHB4fS5zcGFuMTB7d2lkdGg6NzgwcHh9LnNwYW45e3dpZHRoOjcwMHB4fS5zcGFuOHt3aWR0aDo2MjBweH0uc3Bhbjd7d2lkdGg6NTQwcHh9LnNwYW42e3dpZHRoOjQ2MHB4fS5zcGFuNXt3aWR0aDozODBweH0uc3BhbjR7d2lkdGg6MzAwcHh9LnNwYW4ze3dpZHRoOjIyMHB4fS5zcGFuMnt3aWR0aDoxNDBweH0uc3BhbjF7d2lkdGg6NjBweH0ub2Zmc2V0MTJ7bWFyZ2luLWxlZnQ6OTgwcHh9Lm9mZnNldDExe21hcmdpbi1sZWZ0OjkwMHB4fS5vZmZzZXQxMHttYXJnaW4tbGVmdDo4MjBweH0ub2Zmc2V0OXttYXJnaW4tbGVmdDo3NDBweH0ub2Zmc2V0OHttYXJnaW4tbGVmdDo2NjBweH0ub2Zmc2V0N3ttYXJnaW4tbGVmdDo1ODBweH0ub2Zmc2V0NnttYXJnaW4tbGVmdDo1MDBweH0ub2Zmc2V0NXttYXJnaW4tbGVmdDo0MjBweH0ub2Zmc2V0NHttYXJnaW4tbGVmdDozNDBweH0ub2Zmc2V0M3ttYXJnaW4tbGVmdDoyNjBweH0ub2Zmc2V0MnttYXJnaW4tbGVmdDoxODBweH0ub2Zmc2V0MXttYXJnaW4tbGVmdDoxMDBweH0ucm93LWZsdWlke3dpZHRoOjEwMCU7Knpvb206MX0ucm93LWZsdWlkOmJlZm9yZSwucm93LWZsdWlkOmFmdGVye2Rpc3BsYXk6dGFibGU7bGluZS1oZWlnaHQ6MDtjb250ZW50OiIifS5yb3ctZmx1aWQ6YWZ0ZXJ7Y2xlYXI6Ym90aH0ucm93LWZsdWlkIFtjbGFzcyo9InNwYW4iXXtkaXNwbGF5OmJsb2NrO2Zsb2F0OmxlZnQ7d2lkdGg6MTAwJTttaW4taGVpZ2h0OjMwcHg7bWFyZ2luLWxlZnQ6Mi4xMjc2NTk1NzQ0NjgwODUlOyptYXJnaW4tbGVmdDoyLjA3NDQ2ODA4NTEwNjM4MyU7LXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94fS5yb3ctZmx1aWQgW2NsYXNzKj0ic3BhbiJdOmZpcnN0LWNoaWxke21hcmdpbi1sZWZ0OjB9LnJvdy1mbHVpZCAuY29udHJvbHMtcm93IFtjbGFzcyo9InNwYW4iXStbY2xhc3MqPSJzcGFuIl17bWFyZ2luLWxlZnQ6Mi4xMjc2NTk1NzQ0NjgwODUlfS5yb3ctZmx1aWQgLnNwYW4xMnt3aWR0aDoxMDAlOyp3aWR0aDo5OS45NDY4MDg1MTA2MzgyOSV9LnJvdy1mbHVpZCAuc3BhbjExe3dpZHRoOjkxLjQ4OTM2MTcwMjEyNzY1JTsqd2lkdGg6OTEuNDM2MTcwMjEyNzY1OTQlfS5yb3ctZmx1aWQgLnNwYW4xMHt3aWR0aDo4Mi45Nzg3MjM0MDQyNTUzMiU7KndpZHRoOjgyLjkyNTUzMTkxNDg5MzYxJX0ucm93LWZsdWlkIC5zcGFuOXt3aWR0aDo3NC40NjgwODUxMDYzODI5NyU7KndpZHRoOjc0LjQxNDg5MzYxNzAyMTI2JX0ucm93LWZsdWlkIC5zcGFuOHt3aWR0aDo2NS45NTc0NDY4MDg1MTA2NCU7KndpZHRoOjY1LjkwNDI1NTMxOTE0ODkzJX0ucm93LWZsdWlkIC5zcGFuN3t3aWR0aDo1Ny40NDY4MDg1MTA2MzgyOSU7KndpZHRoOjU3LjM5MzYxNzAyMTI3NjU5JX0ucm93LWZsdWlkIC5zcGFuNnt3aWR0aDo0OC45MzYxNzAyMTI3NjU5NSU7KndpZHRoOjQ4Ljg4Mjk3ODcyMzQwNDI1JX0ucm93LWZsdWlkIC5zcGFuNXt3aWR0aDo0MC40MjU1MzE5MTQ4OTM2MiU7KndpZHRoOjQwLjM3MjM0MDQyNTUzMTkyJX0ucm93LWZsdWlkIC5zcGFuNHt3aWR0aDozMS45MTQ4OTM2MTcwMjEyNzglOyp3aWR0aDozMS44NjE3MDIxMjc2NTk1NzYlfS5yb3ctZmx1aWQgLnNwYW4ze3dpZHRoOjIzLjQwNDI1NTMxOTE0ODkzNCU7KndpZHRoOjIzLjM1MTA2MzgyOTc4NzIzMyV9LnJvdy1mbHVpZCAuc3BhbjJ7d2lkdGg6MTQuODkzNjE3MDIxMjc2NTk1JTsqd2lkdGg6MTQuODQwNDI1NTMxOTE0ODk0JX0ucm93LWZsdWlkIC5zcGFuMXt3aWR0aDo2LjM4Mjk3ODcyMzQwNDI1NSU7KndpZHRoOjYuMzI5Nzg3MjM0MDQyNTUzJX0ucm93LWZsdWlkIC5vZmZzZXQxMnttYXJnaW4tbGVmdDoxMDQuMjU1MzE5MTQ4OTM2MTclOyptYXJnaW4tbGVmdDoxMDQuMTQ4OTM2MTcwMjEyNzUlfS5yb3ctZmx1aWQgLm9mZnNldDEyOmZpcnN0LWNoaWxke21hcmdpbi1sZWZ0OjEwMi4xMjc2NTk1NzQ0NjgwOCU7Km1hcmdpbi1sZWZ0OjEwMi4wMjEyNzY1OTU3NDQ2NyV9LnJvdy1mbHVpZCAub2Zmc2V0MTF7bWFyZ2luLWxlZnQ6OTUuNzQ0NjgwODUxMDYzODIlOyptYXJnaW4tbGVmdDo5NS42MzgyOTc4NzIzNDA0JX0ucm93LWZsdWlkIC5vZmZzZXQxMTpmaXJzdC1jaGlsZHttYXJnaW4tbGVmdDo5My42MTcwMjEyNzY1OTU3NCU7Km1hcmdpbi1sZWZ0OjkzLjUxMDYzODI5Nzg3MjMyJX0ucm93LWZsdWlkIC5vZmZzZXQxMHttYXJnaW4tbGVmdDo4Ny4yMzQwNDI1NTMxOTE0OSU7Km1hcmdpbi1sZWZ0Ojg3LjEyNzY1OTU3NDQ2ODA3JX0ucm93LWZsdWlkIC5vZmZzZXQxMDpmaXJzdC1jaGlsZHttYXJnaW4tbGVmdDo4NS4xMDYzODI5Nzg3MjM0JTsqbWFyZ2luLWxlZnQ6ODQuOTk5OTk5OTk5OTk5OTklfS5yb3ctZmx1aWQgLm9mZnNldDl7bWFyZ2luLWxlZnQ6NzguNzIzNDA0MjU1MzE5MTQlOyptYXJnaW4tbGVmdDo3OC42MTcwMjEyNzY1OTU3MiV9LnJvdy1mbHVpZCAub2Zmc2V0OTpmaXJzdC1jaGlsZHttYXJnaW4tbGVmdDo3Ni41OTU3NDQ2ODA4NTEwNiU7Km1hcmdpbi1sZWZ0Ojc2LjQ4OTM2MTcwMjEyNzY0JX0ucm93LWZsdWlkIC5vZmZzZXQ4e21hcmdpbi1sZWZ0OjcwLjIxMjc2NTk1NzQ0NjglOyptYXJnaW4tbGVmdDo3MC4xMDYzODI5Nzg3MjMzOSV9LnJvdy1mbHVpZCAub2Zmc2V0ODpmaXJzdC1jaGlsZHttYXJnaW4tbGVmdDo2OC4wODUxMDYzODI5Nzg3MiU7Km1hcmdpbi1sZWZ0OjY3Ljk3ODcyMzQwNDI1NTMlfS5yb3ctZmx1aWQgLm9mZnNldDd7bWFyZ2luLWxlZnQ6NjEuNzAyMTI3NjU5NTc0NDYlOyptYXJnaW4tbGVmdDo2MS41OTU3NDQ2ODA4NTEwNiV9LnJvdy1mbHVpZCAub2Zmc2V0NzpmaXJzdC1jaGlsZHttYXJnaW4tbGVmdDo1OS41NzQ0NjgwODUxMDYzNzUlOyptYXJnaW4tbGVmdDo1OS40NjgwODUxMDYzODI5NyV9LnJvdy1mbHVpZCAub2Zmc2V0NnttYXJnaW4tbGVmdDo1My4xOTE0ODkzNjE3MDIxMjUlOyptYXJnaW4tbGVmdDo1My4wODUxMDYzODI5Nzg3MTUlfS5yb3ctZmx1aWQgLm9mZnNldDY6Zmlyc3QtY2hpbGR7bWFyZ2luLWxlZnQ6NTEuMDYzODI5Nzg3MjM0MDM1JTsqbWFyZ2luLWxlZnQ6NTAuOTU3NDQ2ODA4NTEwNjMlfS5yb3ctZmx1aWQgLm9mZnNldDV7bWFyZ2luLWxlZnQ6NDQuNjgwODUxMDYzODI5NzklOyptYXJnaW4tbGVmdDo0NC41NzQ0NjgwODUxMDYzOCV9LnJvdy1mbHVpZCAub2Zmc2V0NTpmaXJzdC1jaGlsZHttYXJnaW4tbGVmdDo0Mi41NTMxOTE0ODkzNjE3JTsqbWFyZ2luLWxlZnQ6NDIuNDQ2ODA4NTEwNjM4MyV9LnJvdy1mbHVpZCAub2Zmc2V0NHttYXJnaW4tbGVmdDozNi4xNzAyMTI3NjU5NTc0NDQlOyptYXJnaW4tbGVmdDozNi4wNjM4Mjk3ODcyMzQwNSV9LnJvdy1mbHVpZCAub2Zmc2V0NDpmaXJzdC1jaGlsZHttYXJnaW4tbGVmdDozNC4wNDI1NTMxOTE0ODkzNiU7Km1hcmdpbi1sZWZ0OjMzLjkzNjE3MDIxMjc2NTk2JX0ucm93LWZsdWlkIC5vZmZzZXQze21hcmdpbi1sZWZ0OjI3LjY1OTU3NDQ2ODA4NTEwNCU7Km1hcmdpbi1sZWZ0OjI3LjU1MzE5MTQ4OTM2MTclfS5yb3ctZmx1aWQgLm9mZnNldDM6Zmlyc3QtY2hpbGR7bWFyZ2luLWxlZnQ6MjUuNTMxOTE0ODkzNjE3MDIlOyptYXJnaW4tbGVmdDoyNS40MjU1MzE5MTQ4OTM2MTglfS5yb3ctZmx1aWQgLm9mZnNldDJ7bWFyZ2luLWxlZnQ6MTkuMTQ4OTM2MTcwMjEyNzY0JTsqbWFyZ2luLWxlZnQ6MTkuMDQyNTUzMTkxNDg5MzYlfS5yb3ctZmx1aWQgLm9mZnNldDI6Zmlyc3QtY2hpbGR7bWFyZ2luLWxlZnQ6MTcuMDIxMjc2NTk1NzQ0NjglOyptYXJnaW4tbGVmdDoxNi45MTQ4OTM2MTcwMjEyNzglfS5yb3ctZmx1aWQgLm9mZnNldDF7bWFyZ2luLWxlZnQ6MTAuNjM4Mjk3ODcyMzQwNDI1JTsqbWFyZ2luLWxlZnQ6MTAuNTMxOTE0ODkzNjE3MDIlfS5yb3ctZmx1aWQgLm9mZnNldDE6Zmlyc3QtY2hpbGR7bWFyZ2luLWxlZnQ6OC41MTA2MzgyOTc4NzIzNCU7Km1hcmdpbi1sZWZ0OjguNDA0MjU1MzE5MTQ4OTM4JX1bY2xhc3MqPSJzcGFuIl0uaGlkZSwucm93LWZsdWlkIFtjbGFzcyo9InNwYW4iXS5oaWRle2Rpc3BsYXk6bm9uZX1bY2xhc3MqPSJzcGFuIl0ucHVsbC1yaWdodCwucm93LWZsdWlkIFtjbGFzcyo9InNwYW4iXS5wdWxsLXJpZ2h0e2Zsb2F0OnJpZ2h0fS5jb250YWluZXJ7bWFyZ2luLXJpZ2h0OmF1dG87bWFyZ2luLWxlZnQ6YXV0bzsqem9vbToxfS5jb250YWluZXI6YmVmb3JlLC5jb250YWluZXI6YWZ0ZXJ7ZGlzcGxheTp0YWJsZTtsaW5lLWhlaWdodDowO2NvbnRlbnQ6IiJ9LmNvbnRhaW5lcjphZnRlcntjbGVhcjpib3RofS5jb250YWluZXItZmx1aWR7cGFkZGluZy1yaWdodDoyMHB4O3BhZGRpbmctbGVmdDoyMHB4Oyp6b29tOjF9LmNvbnRhaW5lci1mbHVpZDpiZWZvcmUsLmNvbnRhaW5lci1mbHVpZDphZnRlcntkaXNwbGF5OnRhYmxlO2xpbmUtaGVpZ2h0OjA7Y29udGVudDoiIn0uY29udGFpbmVyLWZsdWlkOmFmdGVye2NsZWFyOmJvdGh9cHttYXJnaW46MCAwIDEwcHh9LmxlYWR7bWFyZ2luLWJvdHRvbToyMHB4O2ZvbnQtc2l6ZToyMXB4O2ZvbnQtd2VpZ2h0OjIwMDtsaW5lLWhlaWdodDozMHB4fXNtYWxse2ZvbnQtc2l6ZTo4NSV9c3Ryb25ne2ZvbnQtd2VpZ2h0OmJvbGR9ZW17Zm9udC1zdHlsZTppdGFsaWN9Y2l0ZXtmb250LXN0eWxlOm5vcm1hbH0ubXV0ZWR7Y29sb3I6Izk5OX1hLm11dGVkOmhvdmVyLGEubXV0ZWQ6Zm9jdXN7Y29sb3I6IzgwODA4MH0udGV4dC13YXJuaW5ne2NvbG9yOiNjMDk4NTN9YS50ZXh0LXdhcm5pbmc6aG92ZXIsYS50ZXh0LXdhcm5pbmc6Zm9jdXN7Y29sb3I6I2E0N2UzY30udGV4dC1lcnJvcntjb2xvcjojYjk0YTQ4fWEudGV4dC1lcnJvcjpob3ZlcixhLnRleHQtZXJyb3I6Zm9jdXN7Y29sb3I6Izk1M2IzOX0udGV4dC1pbmZve2NvbG9yOiMzYTg3YWR9YS50ZXh0LWluZm86aG92ZXIsYS50ZXh0LWluZm86Zm9jdXN7Y29sb3I6IzJkNjk4N30udGV4dC1zdWNjZXNze2NvbG9yOiM0Njg4NDd9YS50ZXh0LXN1Y2Nlc3M6aG92ZXIsYS50ZXh0LXN1Y2Nlc3M6Zm9jdXN7Y29sb3I6IzM1NjYzNX0udGV4dC1sZWZ0e3RleHQtYWxpZ246bGVmdH0udGV4dC1yaWdodHt0ZXh0LWFsaWduOnJpZ2h0fS50ZXh0LWNlbnRlcnt0ZXh0LWFsaWduOmNlbnRlcn1oMSxoMixoMyxoNCxoNSxoNnttYXJnaW46MTBweCAwO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC13ZWlnaHQ6Ym9sZDtsaW5lLWhlaWdodDoyMHB4O2NvbG9yOmluaGVyaXQ7dGV4dC1yZW5kZXJpbmc6b3B0aW1pemVsZWdpYmlsaXR5fWgxIHNtYWxsLGgyIHNtYWxsLGgzIHNtYWxsLGg0IHNtYWxsLGg1IHNtYWxsLGg2IHNtYWxse2ZvbnQtd2VpZ2h0Om5vcm1hbDtsaW5lLWhlaWdodDoxO2NvbG9yOiM5OTl9aDEsaDIsaDN7bGluZS1oZWlnaHQ6NDBweH1oMXtmb250LXNpemU6MzguNXB4fWgye2ZvbnQtc2l6ZTozMS41cHh9aDN7Zm9udC1zaXplOjI0LjVweH1oNHtmb250LXNpemU6MTcuNXB4fWg1e2ZvbnQtc2l6ZToxNHB4fWg2e2ZvbnQtc2l6ZToxMS45cHh9aDEgc21hbGx7Zm9udC1zaXplOjI0LjVweH1oMiBzbWFsbHtmb250LXNpemU6MTcuNXB4fWgzIHNtYWxse2ZvbnQtc2l6ZToxNHB4fWg0IHNtYWxse2ZvbnQtc2l6ZToxNHB4fS5wYWdlLWhlYWRlcntwYWRkaW5nLWJvdHRvbTo5cHg7bWFyZ2luOjIwcHggMCAzMHB4O2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlZWV9dWwsb2x7cGFkZGluZzowO21hcmdpbjowIDAgMTBweCAyNXB4fXVsIHVsLHVsIG9sLG9sIG9sLG9sIHVse21hcmdpbi1ib3R0b206MH1saXtsaW5lLWhlaWdodDoyMHB4fXVsLnVuc3R5bGVkLG9sLnVuc3R5bGVke21hcmdpbi1sZWZ0OjA7bGlzdC1zdHlsZTpub25lfXVsLmlubGluZSxvbC5pbmxpbmV7bWFyZ2luLWxlZnQ6MDtsaXN0LXN0eWxlOm5vbmV9dWwuaW5saW5lPmxpLG9sLmlubGluZT5saXtkaXNwbGF5OmlubGluZS1ibG9jazsqZGlzcGxheTppbmxpbmU7cGFkZGluZy1yaWdodDo1cHg7cGFkZGluZy1sZWZ0OjVweDsqem9vbToxfWRse21hcmdpbi1ib3R0b206MjBweH1kdCxkZHtsaW5lLWhlaWdodDoyMHB4fWR0e2ZvbnQtd2VpZ2h0OmJvbGR9ZGR7bWFyZ2luLWxlZnQ6MTBweH0uZGwtaG9yaXpvbnRhbHsqem9vbToxfS5kbC1ob3Jpem9udGFsOmJlZm9yZSwuZGwtaG9yaXpvbnRhbDphZnRlcntkaXNwbGF5OnRhYmxlO2xpbmUtaGVpZ2h0OjA7Y29udGVudDoiIn0uZGwtaG9yaXpvbnRhbDphZnRlcntjbGVhcjpib3RofS5kbC1ob3Jpem9udGFsIGR0e2Zsb2F0OmxlZnQ7d2lkdGg6MjAwcHg7b3ZlcmZsb3c6aGlkZGVuO2NsZWFyOmxlZnQ7dGV4dC1hbGlnbjpyaWdodDt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcH0uZGwtaG9yaXpvbnRhbCBkZHttYXJnaW4tbGVmdDoyMjBweH1ocnttYXJnaW46MjBweCAwO2JvcmRlcjowO2JvcmRlci10b3A6MXB4IHNvbGlkICNlZWU7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2ZmZn1hYmJyW3RpdGxlXSxhYmJyW2RhdGEtb3JpZ2luYWwtdGl0bGVde2N1cnNvcjpoZWxwO2JvcmRlci1ib3R0b206MXB4IGRvdHRlZCAjOTk5fWFiYnIuaW5pdGlhbGlzbXtmb250LXNpemU6OTAlO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZX1ibG9ja3F1b3Rle3BhZGRpbmc6MCAwIDAgMTVweDttYXJnaW46MCAwIDIwcHg7Ym9yZGVyLWxlZnQ6NXB4IHNvbGlkICNlZWV9YmxvY2txdW90ZSBwe21hcmdpbi1ib3R0b206MDtmb250LXNpemU6MTcuNXB4O2ZvbnQtd2VpZ2h0OjMwMDtsaW5lLWhlaWdodDoxLjI1fWJsb2NrcXVvdGUgc21hbGx7ZGlzcGxheTpibG9jaztsaW5lLWhlaWdodDoyMHB4O2NvbG9yOiM5OTl9YmxvY2txdW90ZSBzbWFsbDpiZWZvcmV7Y29udGVudDonXDIwMTQgXDAwQTAnfWJsb2NrcXVvdGUucHVsbC1yaWdodHtmbG9hdDpyaWdodDtwYWRkaW5nLXJpZ2h0OjE1cHg7cGFkZGluZy1sZWZ0OjA7Ym9yZGVyLXJpZ2h0OjVweCBzb2xpZCAjZWVlO2JvcmRlci1sZWZ0OjB9YmxvY2txdW90ZS5wdWxsLXJpZ2h0IHAsYmxvY2txdW90ZS5wdWxsLXJpZ2h0IHNtYWxse3RleHQtYWxpZ246cmlnaHR9YmxvY2txdW90ZS5wdWxsLXJpZ2h0IHNtYWxsOmJlZm9yZXtjb250ZW50OicnfWJsb2NrcXVvdGUucHVsbC1yaWdodCBzbWFsbDphZnRlcntjb250ZW50OidcMDBBMCBcMjAxNCd9cTpiZWZvcmUscTphZnRlcixibG9ja3F1b3RlOmJlZm9yZSxibG9ja3F1b3RlOmFmdGVye2NvbnRlbnQ6IiJ9YWRkcmVzc3tkaXNwbGF5OmJsb2NrO21hcmdpbi1ib3R0b206MjBweDtmb250LXN0eWxlOm5vcm1hbDtsaW5lLWhlaWdodDoyMHB4fWNvZGUscHJle3BhZGRpbmc6MCAzcHggMnB4O2ZvbnQtZmFtaWx5Ok1vbmFjbyxNZW5sbyxDb25zb2xhcywiQ291cmllciBOZXciLG1vbm9zcGFjZTtmb250LXNpemU6MTJweDtjb2xvcjojMzMzOy13ZWJraXQtYm9yZGVyLXJhZGl1czozcHg7LW1vei1ib3JkZXItcmFkaXVzOjNweDtib3JkZXItcmFkaXVzOjNweH1jb2Rle3BhZGRpbmc6MnB4IDRweDtjb2xvcjojZDE0O3doaXRlLXNwYWNlOm5vd3JhcDtiYWNrZ3JvdW5kLWNvbG9yOiNmN2Y3Zjk7Ym9yZGVyOjFweCBzb2xpZCAjZTFlMWU4fXByZXtkaXNwbGF5OmJsb2NrO3BhZGRpbmc6OS41cHg7bWFyZ2luOjAgMCAxMHB4O2ZvbnQtc2l6ZToxM3B4O2xpbmUtaGVpZ2h0OjIwcHg7d29yZC1icmVhazpicmVhay1hbGw7d29yZC13cmFwOmJyZWFrLXdvcmQ7d2hpdGUtc3BhY2U6cHJlO3doaXRlLXNwYWNlOnByZS13cmFwO2JhY2tncm91bmQtY29sb3I6I2Y1ZjVmNTtib3JkZXI6MXB4IHNvbGlkICNjY2M7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDAsMCwwLDAuMTUpOy13ZWJraXQtYm9yZGVyLXJhZGl1czo0cHg7LW1vei1ib3JkZXItcmFkaXVzOjRweDtib3JkZXItcmFkaXVzOjRweH1wcmUucHJldHR5cHJpbnR7bWFyZ2luLWJvdHRvbToyMHB4fXByZSBjb2Rle3BhZGRpbmc6MDtjb2xvcjppbmhlcml0O3doaXRlLXNwYWNlOnByZTt3aGl0ZS1zcGFjZTpwcmUtd3JhcDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlcjowfS5wcmUtc2Nyb2xsYWJsZXttYXgtaGVpZ2h0OjM0MHB4O292ZXJmbG93LXk6c2Nyb2xsfWZvcm17bWFyZ2luOjAgMCAyMHB4fWZpZWxkc2V0e3BhZGRpbmc6MDttYXJnaW46MDtib3JkZXI6MH1sZWdlbmR7ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlO3BhZGRpbmc6MDttYXJnaW4tYm90dG9tOjIwcHg7Zm9udC1zaXplOjIxcHg7bGluZS1oZWlnaHQ6NDBweDtjb2xvcjojMzMzO2JvcmRlcjowO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlNWU1ZTV9bGVnZW5kIHNtYWxse2ZvbnQtc2l6ZToxNXB4O2NvbG9yOiM5OTl9bGFiZWwsaW5wdXQsYnV0dG9uLHNlbGVjdCx0ZXh0YXJlYXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDpub3JtYWw7bGluZS1oZWlnaHQ6MjBweH1pbnB1dCxidXR0b24sc2VsZWN0LHRleHRhcmVhe2ZvbnQtZmFtaWx5OiJIZWx2ZXRpY2EgTmV1ZSIsSGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWZ9bGFiZWx7ZGlzcGxheTpibG9jazttYXJnaW4tYm90dG9tOjVweH1zZWxlY3QsdGV4dGFyZWEsaW5wdXRbdHlwZT0idGV4dCJdLGlucHV0W3R5cGU9InBhc3N3b3JkIl0saW5wdXRbdHlwZT0iZGF0ZXRpbWUiXSxpbnB1dFt0eXBlPSJkYXRldGltZS1sb2NhbCJdLGlucHV0W3R5cGU9ImRhdGUiXSxpbnB1dFt0eXBlPSJtb250aCJdLGlucHV0W3R5cGU9InRpbWUiXSxpbnB1dFt0eXBlPSJ3ZWVrIl0saW5wdXRbdHlwZT0ibnVtYmVyIl0saW5wdXRbdHlwZT0iZW1haWwiXSxpbnB1dFt0eXBlPSJ1cmwiXSxpbnB1dFt0eXBlPSJzZWFyY2giXSxpbnB1dFt0eXBlPSJ0ZWwiXSxpbnB1dFt0eXBlPSJjb2xvciJdLC51bmVkaXRhYmxlLWlucHV0e2Rpc3BsYXk6aW5saW5lLWJsb2NrO2hlaWdodDoyMHB4O3BhZGRpbmc6NHB4IDZweDttYXJnaW4tYm90dG9tOjEwcHg7Zm9udC1zaXplOjE0cHg7bGluZS1oZWlnaHQ6MjBweDtjb2xvcjojNTU1O3ZlcnRpY2FsLWFsaWduOm1pZGRsZTstd2Via2l0LWJvcmRlci1yYWRpdXM6NHB4Oy1tb3otYm9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyLXJhZGl1czo0cHh9aW5wdXQsdGV4dGFyZWEsLnVuZWRpdGFibGUtaW5wdXR7d2lkdGg6MjA2cHh9dGV4dGFyZWF7aGVpZ2h0OmF1dG99dGV4dGFyZWEsaW5wdXRbdHlwZT0idGV4dCJdLGlucHV0W3R5cGU9InBhc3N3b3JkIl0saW5wdXRbdHlwZT0iZGF0ZXRpbWUiXSxpbnB1dFt0eXBlPSJkYXRldGltZS1sb2NhbCJdLGlucHV0W3R5cGU9ImRhdGUiXSxpbnB1dFt0eXBlPSJtb250aCJdLGlucHV0W3R5cGU9InRpbWUiXSxpbnB1dFt0eXBlPSJ3ZWVrIl0saW5wdXRbdHlwZT0ibnVtYmVyIl0saW5wdXRbdHlwZT0iZW1haWwiXSxpbnB1dFt0eXBlPSJ1cmwiXSxpbnB1dFt0eXBlPSJzZWFyY2giXSxpbnB1dFt0eXBlPSJ0ZWwiXSxpbnB1dFt0eXBlPSJjb2xvciJdLC51bmVkaXRhYmxlLWlucHV0e2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXI6MXB4IHNvbGlkICNjY2M7LXdlYmtpdC1ib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLDAuMDc1KTstbW96LWJveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsMC4wNzUpO2JveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsMC4wNzUpOy13ZWJraXQtdHJhbnNpdGlvbjpib3JkZXIgbGluZWFyIC4ycyxib3gtc2hhZG93IGxpbmVhciAuMnM7LW1vei10cmFuc2l0aW9uOmJvcmRlciBsaW5lYXIgLjJzLGJveC1zaGFkb3cgbGluZWFyIC4yczstby10cmFuc2l0aW9uOmJvcmRlciBsaW5lYXIgLjJzLGJveC1zaGFkb3cgbGluZWFyIC4yczt0cmFuc2l0aW9uOmJvcmRlciBsaW5lYXIgLjJzLGJveC1zaGFkb3cgbGluZWFyIC4yc310ZXh0YXJlYTpmb2N1cyxpbnB1dFt0eXBlPSJ0ZXh0Il06Zm9jdXMsaW5wdXRbdHlwZT0icGFzc3dvcmQiXTpmb2N1cyxpbnB1dFt0eXBlPSJkYXRldGltZSJdOmZvY3VzLGlucHV0W3R5cGU9ImRhdGV0aW1lLWxvY2FsIl06Zm9jdXMsaW5wdXRbdHlwZT0iZGF0ZSJdOmZvY3VzLGlucHV0W3R5cGU9Im1vbnRoIl06Zm9jdXMsaW5wdXRbdHlwZT0idGltZSJdOmZvY3VzLGlucHV0W3R5cGU9IndlZWsiXTpmb2N1cyxpbnB1dFt0eXBlPSJudW1iZXIiXTpmb2N1cyxpbnB1dFt0eXBlPSJlbWFpbCJdOmZvY3VzLGlucHV0W3R5cGU9InVybCJdOmZvY3VzLGlucHV0W3R5cGU9InNlYXJjaCJdOmZvY3VzLGlucHV0W3R5cGU9InRlbCJdOmZvY3VzLGlucHV0W3R5cGU9ImNvbG9yIl06Zm9jdXMsLnVuZWRpdGFibGUtaW5wdXQ6Zm9jdXN7Ym9yZGVyLWNvbG9yOnJnYmEoODIsMTY4LDIzNiwwLjgpO291dGxpbmU6MDtvdXRsaW5lOnRoaW4gZG90dGVkIFw5Oy13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwwLjA3NSksMCAwIDhweCByZ2JhKDgyLDE2OCwyMzYsMC42KTstbW96LWJveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsMC4wNzUpLDAgMCA4cHggcmdiYSg4MiwxNjgsMjM2LDAuNik7Ym94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwwLjA3NSksMCAwIDhweCByZ2JhKDgyLDE2OCwyMzYsMC42KX1pbnB1dFt0eXBlPSJyYWRpbyJdLGlucHV0W3R5cGU9ImNoZWNrYm94Il17bWFyZ2luOjRweCAwIDA7bWFyZ2luLXRvcDoxcHggXDk7Km1hcmdpbi10b3A6MDtsaW5lLWhlaWdodDpub3JtYWx9aW5wdXRbdHlwZT0iZmlsZSJdLGlucHV0W3R5cGU9ImltYWdlIl0saW5wdXRbdHlwZT0ic3VibWl0Il0saW5wdXRbdHlwZT0icmVzZXQiXSxpbnB1dFt0eXBlPSJidXR0b24iXSxpbnB1dFt0eXBlPSJyYWRpbyJdLGlucHV0W3R5cGU9ImNoZWNrYm94Il17d2lkdGg6YXV0b31zZWxlY3QsaW5wdXRbdHlwZT0iZmlsZSJde2hlaWdodDozMHB4OyptYXJnaW4tdG9wOjRweDtsaW5lLWhlaWdodDozMHB4fXNlbGVjdHt3aWR0aDoyMjBweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ym9yZGVyOjFweCBzb2xpZCAjY2NjfXNlbGVjdFttdWx0aXBsZV0sc2VsZWN0W3NpemVde2hlaWdodDphdXRvfXNlbGVjdDpmb2N1cyxpbnB1dFt0eXBlPSJmaWxlIl06Zm9jdXMsaW5wdXRbdHlwZT0icmFkaW8iXTpmb2N1cyxpbnB1dFt0eXBlPSJjaGVja2JveCJdOmZvY3Vze291dGxpbmU6dGhpbiBkb3R0ZWQgIzMzMztvdXRsaW5lOjVweCBhdXRvIC13ZWJraXQtZm9jdXMtcmluZy1jb2xvcjtvdXRsaW5lLW9mZnNldDotMnB4fS51bmVkaXRhYmxlLWlucHV0LC51bmVkaXRhYmxlLXRleHRhcmVhe2NvbG9yOiM5OTk7Y3Vyc29yOm5vdC1hbGxvd2VkO2JhY2tncm91bmQtY29sb3I6I2ZjZmNmYztib3JkZXItY29sb3I6I2NjYzstd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgMCAxcHggMnB4IHJnYmEoMCwwLDAsMC4wMjUpOy1tb3otYm94LXNoYWRvdzppbnNldCAwIDFweCAycHggcmdiYSgwLDAsMCwwLjAyNSk7Ym94LXNoYWRvdzppbnNldCAwIDFweCAycHggcmdiYSgwLDAsMCwwLjAyNSl9LnVuZWRpdGFibGUtaW5wdXR7b3ZlcmZsb3c6aGlkZGVuO3doaXRlLXNwYWNlOm5vd3JhcH0udW5lZGl0YWJsZS10ZXh0YXJlYXt3aWR0aDphdXRvO2hlaWdodDphdXRvfWlucHV0Oi1tb3otcGxhY2Vob2xkZXIsdGV4dGFyZWE6LW1vei1wbGFjZWhvbGRlcntjb2xvcjojOTk5fWlucHV0Oi1tcy1pbnB1dC1wbGFjZWhvbGRlcix0ZXh0YXJlYTotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6Izk5OX1pbnB1dDo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlcix0ZXh0YXJlYTo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjojOTk5fS5yYWRpbywuY2hlY2tib3h7bWluLWhlaWdodDoyMHB4O3BhZGRpbmctbGVmdDoyMHB4fS5yYWRpbyBpbnB1dFt0eXBlPSJyYWRpbyJdLC5jaGVja2JveCBpbnB1dFt0eXBlPSJjaGVja2JveCJde2Zsb2F0OmxlZnQ7bWFyZ2luLWxlZnQ6LTIwcHh9LmNvbnRyb2xzPi5yYWRpbzpmaXJzdC1jaGlsZCwuY29udHJvbHM+LmNoZWNrYm94OmZpcnN0LWNoaWxke3BhZGRpbmctdG9wOjVweH0ucmFkaW8uaW5saW5lLC5jaGVja2JveC5pbmxpbmV7ZGlzcGxheTppbmxpbmUtYmxvY2s7cGFkZGluZy10b3A6NXB4O21hcmdpbi1ib3R0b206MDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LnJhZGlvLmlubGluZSsucmFkaW8uaW5saW5lLC5jaGVja2JveC5pbmxpbmUrLmNoZWNrYm94LmlubGluZXttYXJnaW4tbGVmdDoxMHB4fS5pbnB1dC1taW5pe3dpZHRoOjYwcHh9LmlucHV0LXNtYWxse3dpZHRoOjkwcHh9LmlucHV0LW1lZGl1bXt3aWR0aDoxNTBweH0uaW5wdXQtbGFyZ2V7d2lkdGg6MjEwcHh9LmlucHV0LXhsYXJnZXt3aWR0aDoyNzBweH0uaW5wdXQteHhsYXJnZXt3aWR0aDo1MzBweH1pbnB1dFtjbGFzcyo9InNwYW4iXSxzZWxlY3RbY2xhc3MqPSJzcGFuIl0sdGV4dGFyZWFbY2xhc3MqPSJzcGFuIl0sLnVuZWRpdGFibGUtaW5wdXRbY2xhc3MqPSJzcGFuIl0sLnJvdy1mbHVpZCBpbnB1dFtjbGFzcyo9InNwYW4iXSwucm93LWZsdWlkIHNlbGVjdFtjbGFzcyo9InNwYW4iXSwucm93LWZsdWlkIHRleHRhcmVhW2NsYXNzKj0ic3BhbiJdLC5yb3ctZmx1aWQgLnVuZWRpdGFibGUtaW5wdXRbY2xhc3MqPSJzcGFuIl17ZmxvYXQ6bm9uZTttYXJnaW4tbGVmdDowfS5pbnB1dC1hcHBlbmQgaW5wdXRbY2xhc3MqPSJzcGFuIl0sLmlucHV0LWFwcGVuZCAudW5lZGl0YWJsZS1pbnB1dFtjbGFzcyo9InNwYW4iXSwuaW5wdXQtcHJlcGVuZCBpbnB1dFtjbGFzcyo9InNwYW4iXSwuaW5wdXQtcHJlcGVuZCAudW5lZGl0YWJsZS1pbnB1dFtjbGFzcyo9InNwYW4iXSwucm93LWZsdWlkIGlucHV0W2NsYXNzKj0ic3BhbiJdLC5yb3ctZmx1aWQgc2VsZWN0W2NsYXNzKj0ic3BhbiJdLC5yb3ctZmx1aWQgdGV4dGFyZWFbY2xhc3MqPSJzcGFuIl0sLnJvdy1mbHVpZCAudW5lZGl0YWJsZS1pbnB1dFtjbGFzcyo9InNwYW4iXSwucm93LWZsdWlkIC5pbnB1dC1wcmVwZW5kIFtjbGFzcyo9InNwYW4iXSwucm93LWZsdWlkIC5pbnB1dC1hcHBlbmQgW2NsYXNzKj0ic3BhbiJde2Rpc3BsYXk6aW5saW5lLWJsb2NrfWlucHV0LHRleHRhcmVhLC51bmVkaXRhYmxlLWlucHV0e21hcmdpbi1sZWZ0OjB9LmNvbnRyb2xzLXJvdyBbY2xhc3MqPSJzcGFuIl0rW2NsYXNzKj0ic3BhbiJde21hcmdpbi1sZWZ0OjIwcHh9aW5wdXQuc3BhbjEyLHRleHRhcmVhLnNwYW4xMiwudW5lZGl0YWJsZS1pbnB1dC5zcGFuMTJ7d2lkdGg6OTI2cHh9aW5wdXQuc3BhbjExLHRleHRhcmVhLnNwYW4xMSwudW5lZGl0YWJsZS1pbnB1dC5zcGFuMTF7d2lkdGg6ODQ2cHh9aW5wdXQuc3BhbjEwLHRleHRhcmVhLnNwYW4xMCwudW5lZGl0YWJsZS1pbnB1dC5zcGFuMTB7d2lkdGg6NzY2cHh9aW5wdXQuc3BhbjksdGV4dGFyZWEuc3BhbjksLnVuZWRpdGFibGUtaW5wdXQuc3Bhbjl7d2lkdGg6Njg2cHh9aW5wdXQuc3BhbjgsdGV4dGFyZWEuc3BhbjgsLnVuZWRpdGFibGUtaW5wdXQuc3Bhbjh7d2lkdGg6NjA2cHh9aW5wdXQuc3BhbjcsdGV4dGFyZWEuc3BhbjcsLnVuZWRpdGFibGUtaW5wdXQuc3Bhbjd7d2lkdGg6NTI2cHh9aW5wdXQuc3BhbjYsdGV4dGFyZWEuc3BhbjYsLnVuZWRpdGFibGUtaW5wdXQuc3BhbjZ7d2lkdGg6NDQ2cHh9aW5wdXQuc3BhbjUsdGV4dGFyZWEuc3BhbjUsLnVuZWRpdGFibGUtaW5wdXQuc3BhbjV7d2lkdGg6MzY2cHh9aW5wdXQuc3BhbjQsdGV4dGFyZWEuc3BhbjQsLnVuZWRpdGFibGUtaW5wdXQuc3BhbjR7d2lkdGg6Mjg2cHh9aW5wdXQuc3BhbjMsdGV4dGFyZWEuc3BhbjMsLnVuZWRpdGFibGUtaW5wdXQuc3BhbjN7d2lkdGg6MjA2cHh9aW5wdXQuc3BhbjIsdGV4dGFyZWEuc3BhbjIsLnVuZWRpdGFibGUtaW5wdXQuc3BhbjJ7d2lkdGg6MTI2cHh9aW5wdXQuc3BhbjEsdGV4dGFyZWEuc3BhbjEsLnVuZWRpdGFibGUtaW5wdXQuc3BhbjF7d2lkdGg6NDZweH0uY29udHJvbHMtcm93eyp6b29tOjF9LmNvbnRyb2xzLXJvdzpiZWZvcmUsLmNvbnRyb2xzLXJvdzphZnRlcntkaXNwbGF5OnRhYmxlO2xpbmUtaGVpZ2h0OjA7Y29udGVudDoiIn0uY29udHJvbHMtcm93OmFmdGVye2NsZWFyOmJvdGh9LmNvbnRyb2xzLXJvdyBbY2xhc3MqPSJzcGFuIl0sLnJvdy1mbHVpZCAuY29udHJvbHMtcm93IFtjbGFzcyo9InNwYW4iXXtmbG9hdDpsZWZ0fS5jb250cm9scy1yb3cgLmNoZWNrYm94W2NsYXNzKj0ic3BhbiJdLC5jb250cm9scy1yb3cgLnJhZGlvW2NsYXNzKj0ic3BhbiJde3BhZGRpbmctdG9wOjVweH1pbnB1dFtkaXNhYmxlZF0sc2VsZWN0W2Rpc2FibGVkXSx0ZXh0YXJlYVtkaXNhYmxlZF0saW5wdXRbcmVhZG9ubHldLHNlbGVjdFtyZWFkb25seV0sdGV4dGFyZWFbcmVhZG9ubHlde2N1cnNvcjpub3QtYWxsb3dlZDtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9aW5wdXRbdHlwZT0icmFkaW8iXVtkaXNhYmxlZF0saW5wdXRbdHlwZT0iY2hlY2tib3giXVtkaXNhYmxlZF0saW5wdXRbdHlwZT0icmFkaW8iXVtyZWFkb25seV0saW5wdXRbdHlwZT0iY2hlY2tib3giXVtyZWFkb25seV17YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0uY29udHJvbC1ncm91cC53YXJuaW5nIC5jb250cm9sLWxhYmVsLC5jb250cm9sLWdyb3VwLndhcm5pbmcgLmhlbHAtYmxvY2ssLmNvbnRyb2wtZ3JvdXAud2FybmluZyAuaGVscC1pbmxpbmV7Y29sb3I6I2MwOTg1M30uY29udHJvbC1ncm91cC53YXJuaW5nIC5jaGVja2JveCwuY29udHJvbC1ncm91cC53YXJuaW5nIC5yYWRpbywuY29udHJvbC1ncm91cC53YXJuaW5nIGlucHV0LC5jb250cm9sLWdyb3VwLndhcm5pbmcgc2VsZWN0LC5jb250cm9sLWdyb3VwLndhcm5pbmcgdGV4dGFyZWF7Y29sb3I6I2MwOTg1M30uY29udHJvbC1ncm91cC53YXJuaW5nIGlucHV0LC5jb250cm9sLWdyb3VwLndhcm5pbmcgc2VsZWN0LC5jb250cm9sLWdyb3VwLndhcm5pbmcgdGV4dGFyZWF7Ym9yZGVyLWNvbG9yOiNjMDk4NTM7LXdlYmtpdC1ib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLDAuMDc1KTstbW96LWJveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsMC4wNzUpO2JveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsMC4wNzUpfS5jb250cm9sLWdyb3VwLndhcm5pbmcgaW5wdXQ6Zm9jdXMsLmNvbnRyb2wtZ3JvdXAud2FybmluZyBzZWxlY3Q6Zm9jdXMsLmNvbnRyb2wtZ3JvdXAud2FybmluZyB0ZXh0YXJlYTpmb2N1c3tib3JkZXItY29sb3I6I2E0N2UzYzstd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsMC4wNzUpLDAgMCA2cHggI2RiYzU5ZTstbW96LWJveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsMC4wNzUpLDAgMCA2cHggI2RiYzU5ZTtib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLDAuMDc1KSwwIDAgNnB4ICNkYmM1OWV9LmNvbnRyb2wtZ3JvdXAud2FybmluZyAuaW5wdXQtcHJlcGVuZCAuYWRkLW9uLC5jb250cm9sLWdyb3VwLndhcm5pbmcgLmlucHV0LWFwcGVuZCAuYWRkLW9ue2NvbG9yOiNjMDk4NTM7YmFja2dyb3VuZC1jb2xvcjojZmNmOGUzO2JvcmRlci1jb2xvcjojYzA5ODUzfS5jb250cm9sLWdyb3VwLmVycm9yIC5jb250cm9sLWxhYmVsLC5jb250cm9sLWdyb3VwLmVycm9yIC5oZWxwLWJsb2NrLC5jb250cm9sLWdyb3VwLmVycm9yIC5oZWxwLWlubGluZXtjb2xvcjojYjk0YTQ4fS5jb250cm9sLWdyb3VwLmVycm9yIC5jaGVja2JveCwuY29udHJvbC1ncm91cC5lcnJvciAucmFkaW8sLmNvbnRyb2wtZ3JvdXAuZXJyb3IgaW5wdXQsLmNvbnRyb2wtZ3JvdXAuZXJyb3Igc2VsZWN0LC5jb250cm9sLWdyb3VwLmVycm9yIHRleHRhcmVhe2NvbG9yOiNiOTRhNDh9LmNvbnRyb2wtZ3JvdXAuZXJyb3IgaW5wdXQsLmNvbnRyb2wtZ3JvdXAuZXJyb3Igc2VsZWN0LC5jb250cm9sLWdyb3VwLmVycm9yIHRleHRhcmVhe2JvcmRlci1jb2xvcjojYjk0YTQ4Oy13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwwLjA3NSk7LW1vei1ib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLDAuMDc1KTtib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLDAuMDc1KX0uY29udHJvbC1ncm91cC5lcnJvciBpbnB1dDpmb2N1cywuY29udHJvbC1ncm91cC5lcnJvciBzZWxlY3Q6Zm9jdXMsLmNvbnRyb2wtZ3JvdXAuZXJyb3IgdGV4dGFyZWE6Zm9jdXN7Ym9yZGVyLWNvbG9yOiM5NTNiMzk7LXdlYmtpdC1ib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLDAuMDc1KSwwIDAgNnB4ICNkNTkzOTI7LW1vei1ib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLDAuMDc1KSwwIDAgNnB4ICNkNTkzOTI7Ym94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwwLjA3NSksMCAwIDZweCAjZDU5MzkyfS5jb250cm9sLWdyb3VwLmVycm9yIC5pbnB1dC1wcmVwZW5kIC5hZGQtb24sLmNvbnRyb2wtZ3JvdXAuZXJyb3IgLmlucHV0LWFwcGVuZCAuYWRkLW9ue2NvbG9yOiNiOTRhNDg7YmFja2dyb3VuZC1jb2xvcjojZjJkZWRlO2JvcmRlci1jb2xvcjojYjk0YTQ4fS5jb250cm9sLWdyb3VwLnN1Y2Nlc3MgLmNvbnRyb2wtbGFiZWwsLmNvbnRyb2wtZ3JvdXAuc3VjY2VzcyAuaGVscC1ibG9jaywuY29udHJvbC1ncm91cC5zdWNjZXNzIC5oZWxwLWlubGluZXtjb2xvcjojNDY4ODQ3fS5jb250cm9sLWdyb3VwLnN1Y2Nlc3MgLmNoZWNrYm94LC5jb250cm9sLWdyb3VwLnN1Y2Nlc3MgLnJhZGlvLC5jb250cm9sLWdyb3VwLnN1Y2Nlc3MgaW5wdXQsLmNvbnRyb2wtZ3JvdXAuc3VjY2VzcyBzZWxlY3QsLmNvbnRyb2wtZ3JvdXAuc3VjY2VzcyB0ZXh0YXJlYXtjb2xvcjojNDY4ODQ3fS5jb250cm9sLWdyb3VwLnN1Y2Nlc3MgaW5wdXQsLmNvbnRyb2wtZ3JvdXAuc3VjY2VzcyBzZWxlY3QsLmNvbnRyb2wtZ3JvdXAuc3VjY2VzcyB0ZXh0YXJlYXtib3JkZXItY29sb3I6IzQ2ODg0Nzstd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsMC4wNzUpOy1tb3otYm94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwwLjA3NSk7Ym94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwwLjA3NSl9LmNvbnRyb2wtZ3JvdXAuc3VjY2VzcyBpbnB1dDpmb2N1cywuY29udHJvbC1ncm91cC5zdWNjZXNzIHNlbGVjdDpmb2N1cywuY29udHJvbC1ncm91cC5zdWNjZXNzIHRleHRhcmVhOmZvY3Vze2JvcmRlci1jb2xvcjojMzU2NjM1Oy13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwwLjA3NSksMCAwIDZweCAjN2FiYTdiOy1tb3otYm94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwwLjA3NSksMCAwIDZweCAjN2FiYTdiO2JveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsMC4wNzUpLDAgMCA2cHggIzdhYmE3Yn0uY29udHJvbC1ncm91cC5zdWNjZXNzIC5pbnB1dC1wcmVwZW5kIC5hZGQtb24sLmNvbnRyb2wtZ3JvdXAuc3VjY2VzcyAuaW5wdXQtYXBwZW5kIC5hZGQtb257Y29sb3I6IzQ2ODg0NztiYWNrZ3JvdW5kLWNvbG9yOiNkZmYwZDg7Ym9yZGVyLWNvbG9yOiM0Njg4NDd9LmNvbnRyb2wtZ3JvdXAuaW5mbyAuY29udHJvbC1sYWJlbCwuY29udHJvbC1ncm91cC5pbmZvIC5oZWxwLWJsb2NrLC5jb250cm9sLWdyb3VwLmluZm8gLmhlbHAtaW5saW5le2NvbG9yOiMzYTg3YWR9LmNvbnRyb2wtZ3JvdXAuaW5mbyAuY2hlY2tib3gsLmNvbnRyb2wtZ3JvdXAuaW5mbyAucmFkaW8sLmNvbnRyb2wtZ3JvdXAuaW5mbyBpbnB1dCwuY29udHJvbC1ncm91cC5pbmZvIHNlbGVjdCwuY29udHJvbC1ncm91cC5pbmZvIHRleHRhcmVhe2NvbG9yOiMzYTg3YWR9LmNvbnRyb2wtZ3JvdXAuaW5mbyBpbnB1dCwuY29udHJvbC1ncm91cC5pbmZvIHNlbGVjdCwuY29udHJvbC1ncm91cC5pbmZvIHRleHRhcmVhe2JvcmRlci1jb2xvcjojM2E4N2FkOy13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwwLjA3NSk7LW1vei1ib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLDAuMDc1KTtib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLDAuMDc1KX0uY29udHJvbC1ncm91cC5pbmZvIGlucHV0OmZvY3VzLC5jb250cm9sLWdyb3VwLmluZm8gc2VsZWN0OmZvY3VzLC5jb250cm9sLWdyb3VwLmluZm8gdGV4dGFyZWE6Zm9jdXN7Ym9yZGVyLWNvbG9yOiMyZDY5ODc7LXdlYmtpdC1ib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLDAuMDc1KSwwIDAgNnB4ICM3YWI1ZDM7LW1vei1ib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLDAuMDc1KSwwIDAgNnB4ICM3YWI1ZDM7Ym94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwwLjA3NSksMCAwIDZweCAjN2FiNWQzfS5jb250cm9sLWdyb3VwLmluZm8gLmlucHV0LXByZXBlbmQgLmFkZC1vbiwuY29udHJvbC1ncm91cC5pbmZvIC5pbnB1dC1hcHBlbmQgLmFkZC1vbntjb2xvcjojM2E4N2FkO2JhY2tncm91bmQtY29sb3I6I2Q5ZWRmNztib3JkZXItY29sb3I6IzNhODdhZH1pbnB1dDpmb2N1czppbnZhbGlkLHRleHRhcmVhOmZvY3VzOmludmFsaWQsc2VsZWN0OmZvY3VzOmludmFsaWR7Y29sb3I6I2I5NGE0ODtib3JkZXItY29sb3I6I2VlNWY1Yn1pbnB1dDpmb2N1czppbnZhbGlkOmZvY3VzLHRleHRhcmVhOmZvY3VzOmludmFsaWQ6Zm9jdXMsc2VsZWN0OmZvY3VzOmludmFsaWQ6Zm9jdXN7Ym9yZGVyLWNvbG9yOiNlOTMyMmQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCA2cHggI2Y4YjliNzstbW96LWJveC1zaGFkb3c6MCAwIDZweCAjZjhiOWI3O2JveC1zaGFkb3c6MCAwIDZweCAjZjhiOWI3fS5mb3JtLWFjdGlvbnN7cGFkZGluZzoxOXB4IDIwcHggMjBweDttYXJnaW4tdG9wOjIwcHg7bWFyZ2luLWJvdHRvbToyMHB4O2JhY2tncm91bmQtY29sb3I6I2Y1ZjVmNTtib3JkZXItdG9wOjFweCBzb2xpZCAjZTVlNWU1Oyp6b29tOjF9LmZvcm0tYWN0aW9uczpiZWZvcmUsLmZvcm0tYWN0aW9uczphZnRlcntkaXNwbGF5OnRhYmxlO2xpbmUtaGVpZ2h0OjA7Y29udGVudDoiIn0uZm9ybS1hY3Rpb25zOmFmdGVye2NsZWFyOmJvdGh9LmhlbHAtYmxvY2ssLmhlbHAtaW5saW5le2NvbG9yOiM1OTU5NTl9LmhlbHAtYmxvY2t7ZGlzcGxheTpibG9jazttYXJnaW4tYm90dG9tOjEwcHh9LmhlbHAtaW5saW5le2Rpc3BsYXk6aW5saW5lLWJsb2NrOypkaXNwbGF5OmlubGluZTtwYWRkaW5nLWxlZnQ6NXB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZTsqem9vbToxfS5pbnB1dC1hcHBlbmQsLmlucHV0LXByZXBlbmR7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLWJvdHRvbToxMHB4O2ZvbnQtc2l6ZTowO3doaXRlLXNwYWNlOm5vd3JhcDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LmlucHV0LWFwcGVuZCBpbnB1dCwuaW5wdXQtcHJlcGVuZCBpbnB1dCwuaW5wdXQtYXBwZW5kIHNlbGVjdCwuaW5wdXQtcHJlcGVuZCBzZWxlY3QsLmlucHV0LWFwcGVuZCAudW5lZGl0YWJsZS1pbnB1dCwuaW5wdXQtcHJlcGVuZCAudW5lZGl0YWJsZS1pbnB1dCwuaW5wdXQtYXBwZW5kIC5kcm9wZG93bi1tZW51LC5pbnB1dC1wcmVwZW5kIC5kcm9wZG93bi1tZW51LC5pbnB1dC1hcHBlbmQgLnBvcG92ZXIsLmlucHV0LXByZXBlbmQgLnBvcG92ZXJ7Zm9udC1zaXplOjE0cHh9LmlucHV0LWFwcGVuZCBpbnB1dCwuaW5wdXQtcHJlcGVuZCBpbnB1dCwuaW5wdXQtYXBwZW5kIHNlbGVjdCwuaW5wdXQtcHJlcGVuZCBzZWxlY3QsLmlucHV0LWFwcGVuZCAudW5lZGl0YWJsZS1pbnB1dCwuaW5wdXQtcHJlcGVuZCAudW5lZGl0YWJsZS1pbnB1dHtwb3NpdGlvbjpyZWxhdGl2ZTttYXJnaW4tYm90dG9tOjA7Km1hcmdpbi1sZWZ0OjA7dmVydGljYWwtYWxpZ246dG9wOy13ZWJraXQtYm9yZGVyLXJhZGl1czowIDRweCA0cHggMDstbW96LWJvcmRlci1yYWRpdXM6MCA0cHggNHB4IDA7Ym9yZGVyLXJhZGl1czowIDRweCA0cHggMH0uaW5wdXQtYXBwZW5kIGlucHV0OmZvY3VzLC5pbnB1dC1wcmVwZW5kIGlucHV0OmZvY3VzLC5pbnB1dC1hcHBlbmQgc2VsZWN0OmZvY3VzLC5pbnB1dC1wcmVwZW5kIHNlbGVjdDpmb2N1cywuaW5wdXQtYXBwZW5kIC51bmVkaXRhYmxlLWlucHV0OmZvY3VzLC5pbnB1dC1wcmVwZW5kIC51bmVkaXRhYmxlLWlucHV0OmZvY3Vze3otaW5kZXg6Mn0uaW5wdXQtYXBwZW5kIC5hZGQtb24sLmlucHV0LXByZXBlbmQgLmFkZC1vbntkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDphdXRvO2hlaWdodDoyMHB4O21pbi13aWR0aDoxNnB4O3BhZGRpbmc6NHB4IDVweDtmb250LXNpemU6MTRweDtmb250LXdlaWdodDpub3JtYWw7bGluZS1oZWlnaHQ6MjBweDt0ZXh0LWFsaWduOmNlbnRlcjt0ZXh0LXNoYWRvdzowIDFweCAwICNmZmY7YmFja2dyb3VuZC1jb2xvcjojZWVlO2JvcmRlcjoxcHggc29saWQgI2NjY30uaW5wdXQtYXBwZW5kIC5hZGQtb24sLmlucHV0LXByZXBlbmQgLmFkZC1vbiwuaW5wdXQtYXBwZW5kIC5idG4sLmlucHV0LXByZXBlbmQgLmJ0biwuaW5wdXQtYXBwZW5kIC5idG4tZ3JvdXA+LmRyb3Bkb3duLXRvZ2dsZSwuaW5wdXQtcHJlcGVuZCAuYnRuLWdyb3VwPi5kcm9wZG93bi10b2dnbGV7dmVydGljYWwtYWxpZ246dG9wOy13ZWJraXQtYm9yZGVyLXJhZGl1czowOy1tb3otYm9yZGVyLXJhZGl1czowO2JvcmRlci1yYWRpdXM6MH0uaW5wdXQtYXBwZW5kIC5hY3RpdmUsLmlucHV0LXByZXBlbmQgLmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiNhOWRiYTk7Ym9yZGVyLWNvbG9yOiM0NmE1NDZ9LmlucHV0LXByZXBlbmQgLmFkZC1vbiwuaW5wdXQtcHJlcGVuZCAuYnRue21hcmdpbi1yaWdodDotMXB4fS5pbnB1dC1wcmVwZW5kIC5hZGQtb246Zmlyc3QtY2hpbGQsLmlucHV0LXByZXBlbmQgLmJ0bjpmaXJzdC1jaGlsZHstd2Via2l0LWJvcmRlci1yYWRpdXM6NHB4IDAgMCA0cHg7LW1vei1ib3JkZXItcmFkaXVzOjRweCAwIDAgNHB4O2JvcmRlci1yYWRpdXM6NHB4IDAgMCA0cHh9LmlucHV0LWFwcGVuZCBpbnB1dCwuaW5wdXQtYXBwZW5kIHNlbGVjdCwuaW5wdXQtYXBwZW5kIC51bmVkaXRhYmxlLWlucHV0ey13ZWJraXQtYm9yZGVyLXJhZGl1czo0cHggMCAwIDRweDstbW96LWJvcmRlci1yYWRpdXM6NHB4IDAgMCA0cHg7Ym9yZGVyLXJhZGl1czo0cHggMCAwIDRweH0uaW5wdXQtYXBwZW5kIGlucHV0Ky5idG4tZ3JvdXAgLmJ0bjpsYXN0LWNoaWxkLC5pbnB1dC1hcHBlbmQgc2VsZWN0Ky5idG4tZ3JvdXAgLmJ0bjpsYXN0LWNoaWxkLC5pbnB1dC1hcHBlbmQgLnVuZWRpdGFibGUtaW5wdXQrLmJ0bi1ncm91cCAuYnRuOmxhc3QtY2hpbGR7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjAgNHB4IDRweCAwOy1tb3otYm9yZGVyLXJhZGl1czowIDRweCA0cHggMDtib3JkZXItcmFkaXVzOjAgNHB4IDRweCAwfS5pbnB1dC1hcHBlbmQgLmFkZC1vbiwuaW5wdXQtYXBwZW5kIC5idG4sLmlucHV0LWFwcGVuZCAuYnRuLWdyb3Vwe21hcmdpbi1sZWZ0Oi0xcHh9LmlucHV0LWFwcGVuZCAuYWRkLW9uOmxhc3QtY2hpbGQsLmlucHV0LWFwcGVuZCAuYnRuOmxhc3QtY2hpbGQsLmlucHV0LWFwcGVuZCAuYnRuLWdyb3VwOmxhc3QtY2hpbGQ+LmRyb3Bkb3duLXRvZ2dsZXstd2Via2l0LWJvcmRlci1yYWRpdXM6MCA0cHggNHB4IDA7LW1vei1ib3JkZXItcmFkaXVzOjAgNHB4IDRweCAwO2JvcmRlci1yYWRpdXM6MCA0cHggNHB4IDB9LmlucHV0LXByZXBlbmQuaW5wdXQtYXBwZW5kIGlucHV0LC5pbnB1dC1wcmVwZW5kLmlucHV0LWFwcGVuZCBzZWxlY3QsLmlucHV0LXByZXBlbmQuaW5wdXQtYXBwZW5kIC51bmVkaXRhYmxlLWlucHV0ey13ZWJraXQtYm9yZGVyLXJhZGl1czowOy1tb3otYm9yZGVyLXJhZGl1czowO2JvcmRlci1yYWRpdXM6MH0uaW5wdXQtcHJlcGVuZC5pbnB1dC1hcHBlbmQgaW5wdXQrLmJ0bi1ncm91cCAuYnRuLC5pbnB1dC1wcmVwZW5kLmlucHV0LWFwcGVuZCBzZWxlY3QrLmJ0bi1ncm91cCAuYnRuLC5pbnB1dC1wcmVwZW5kLmlucHV0LWFwcGVuZCAudW5lZGl0YWJsZS1pbnB1dCsuYnRuLWdyb3VwIC5idG57LXdlYmtpdC1ib3JkZXItcmFkaXVzOjAgNHB4IDRweCAwOy1tb3otYm9yZGVyLXJhZGl1czowIDRweCA0cHggMDtib3JkZXItcmFkaXVzOjAgNHB4IDRweCAwfS5pbnB1dC1wcmVwZW5kLmlucHV0LWFwcGVuZCAuYWRkLW9uOmZpcnN0LWNoaWxkLC5pbnB1dC1wcmVwZW5kLmlucHV0LWFwcGVuZCAuYnRuOmZpcnN0LWNoaWxke21hcmdpbi1yaWdodDotMXB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czo0cHggMCAwIDRweDstbW96LWJvcmRlci1yYWRpdXM6NHB4IDAgMCA0cHg7Ym9yZGVyLXJhZGl1czo0cHggMCAwIDRweH0uaW5wdXQtcHJlcGVuZC5pbnB1dC1hcHBlbmQgLmFkZC1vbjpsYXN0LWNoaWxkLC5pbnB1dC1wcmVwZW5kLmlucHV0LWFwcGVuZCAuYnRuOmxhc3QtY2hpbGR7bWFyZ2luLWxlZnQ6LTFweDstd2Via2l0LWJvcmRlci1yYWRpdXM6MCA0cHggNHB4IDA7LW1vei1ib3JkZXItcmFkaXVzOjAgNHB4IDRweCAwO2JvcmRlci1yYWRpdXM6MCA0cHggNHB4IDB9LmlucHV0LXByZXBlbmQuaW5wdXQtYXBwZW5kIC5idG4tZ3JvdXA6Zmlyc3QtY2hpbGR7bWFyZ2luLWxlZnQ6MH1pbnB1dC5zZWFyY2gtcXVlcnl7cGFkZGluZy1yaWdodDoxNHB4O3BhZGRpbmctcmlnaHQ6NHB4IFw5O3BhZGRpbmctbGVmdDoxNHB4O3BhZGRpbmctbGVmdDo0cHggXDk7bWFyZ2luLWJvdHRvbTowOy13ZWJraXQtYm9yZGVyLXJhZGl1czoxNXB4Oy1tb3otYm9yZGVyLXJhZGl1czoxNXB4O2JvcmRlci1yYWRpdXM6MTVweH0uZm9ybS1zZWFyY2ggLmlucHV0LWFwcGVuZCAuc2VhcmNoLXF1ZXJ5LC5mb3JtLXNlYXJjaCAuaW5wdXQtcHJlcGVuZCAuc2VhcmNoLXF1ZXJ5ey13ZWJraXQtYm9yZGVyLXJhZGl1czowOy1tb3otYm9yZGVyLXJhZGl1czowO2JvcmRlci1yYWRpdXM6MH0uZm9ybS1zZWFyY2ggLmlucHV0LWFwcGVuZCAuc2VhcmNoLXF1ZXJ5ey13ZWJraXQtYm9yZGVyLXJhZGl1czoxNHB4IDAgMCAxNHB4Oy1tb3otYm9yZGVyLXJhZGl1czoxNHB4IDAgMCAxNHB4O2JvcmRlci1yYWRpdXM6MTRweCAwIDAgMTRweH0uZm9ybS1zZWFyY2ggLmlucHV0LWFwcGVuZCAuYnRuey13ZWJraXQtYm9yZGVyLXJhZGl1czowIDE0cHggMTRweCAwOy1tb3otYm9yZGVyLXJhZGl1czowIDE0cHggMTRweCAwO2JvcmRlci1yYWRpdXM6MCAxNHB4IDE0cHggMH0uZm9ybS1zZWFyY2ggLmlucHV0LXByZXBlbmQgLnNlYXJjaC1xdWVyeXstd2Via2l0LWJvcmRlci1yYWRpdXM6MCAxNHB4IDE0cHggMDstbW96LWJvcmRlci1yYWRpdXM6MCAxNHB4IDE0cHggMDtib3JkZXItcmFkaXVzOjAgMTRweCAxNHB4IDB9LmZvcm0tc2VhcmNoIC5pbnB1dC1wcmVwZW5kIC5idG57LXdlYmtpdC1ib3JkZXItcmFkaXVzOjE0cHggMCAwIDE0cHg7LW1vei1ib3JkZXItcmFkaXVzOjE0cHggMCAwIDE0cHg7Ym9yZGVyLXJhZGl1czoxNHB4IDAgMCAxNHB4fS5mb3JtLXNlYXJjaCBpbnB1dCwuZm9ybS1pbmxpbmUgaW5wdXQsLmZvcm0taG9yaXpvbnRhbCBpbnB1dCwuZm9ybS1zZWFyY2ggdGV4dGFyZWEsLmZvcm0taW5saW5lIHRleHRhcmVhLC5mb3JtLWhvcml6b250YWwgdGV4dGFyZWEsLmZvcm0tc2VhcmNoIHNlbGVjdCwuZm9ybS1pbmxpbmUgc2VsZWN0LC5mb3JtLWhvcml6b250YWwgc2VsZWN0LC5mb3JtLXNlYXJjaCAuaGVscC1pbmxpbmUsLmZvcm0taW5saW5lIC5oZWxwLWlubGluZSwuZm9ybS1ob3Jpem9udGFsIC5oZWxwLWlubGluZSwuZm9ybS1zZWFyY2ggLnVuZWRpdGFibGUtaW5wdXQsLmZvcm0taW5saW5lIC51bmVkaXRhYmxlLWlucHV0LC5mb3JtLWhvcml6b250YWwgLnVuZWRpdGFibGUtaW5wdXQsLmZvcm0tc2VhcmNoIC5pbnB1dC1wcmVwZW5kLC5mb3JtLWlubGluZSAuaW5wdXQtcHJlcGVuZCwuZm9ybS1ob3Jpem9udGFsIC5pbnB1dC1wcmVwZW5kLC5mb3JtLXNlYXJjaCAuaW5wdXQtYXBwZW5kLC5mb3JtLWlubGluZSAuaW5wdXQtYXBwZW5kLC5mb3JtLWhvcml6b250YWwgLmlucHV0LWFwcGVuZHtkaXNwbGF5OmlubGluZS1ibG9jazsqZGlzcGxheTppbmxpbmU7bWFyZ2luLWJvdHRvbTowO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTsqem9vbToxfS5mb3JtLXNlYXJjaCAuaGlkZSwuZm9ybS1pbmxpbmUgLmhpZGUsLmZvcm0taG9yaXpvbnRhbCAuaGlkZXtkaXNwbGF5Om5vbmV9LmZvcm0tc2VhcmNoIGxhYmVsLC5mb3JtLWlubGluZSBsYWJlbCwuZm9ybS1zZWFyY2ggLmJ0bi1ncm91cCwuZm9ybS1pbmxpbmUgLmJ0bi1ncm91cHtkaXNwbGF5OmlubGluZS1ibG9ja30uZm9ybS1zZWFyY2ggLmlucHV0LWFwcGVuZCwuZm9ybS1pbmxpbmUgLmlucHV0LWFwcGVuZCwuZm9ybS1zZWFyY2ggLmlucHV0LXByZXBlbmQsLmZvcm0taW5saW5lIC5pbnB1dC1wcmVwZW5ke21hcmdpbi1ib3R0b206MH0uZm9ybS1zZWFyY2ggLnJhZGlvLC5mb3JtLXNlYXJjaCAuY2hlY2tib3gsLmZvcm0taW5saW5lIC5yYWRpbywuZm9ybS1pbmxpbmUgLmNoZWNrYm94e3BhZGRpbmctbGVmdDowO21hcmdpbi1ib3R0b206MDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LmZvcm0tc2VhcmNoIC5yYWRpbyBpbnB1dFt0eXBlPSJyYWRpbyJdLC5mb3JtLXNlYXJjaCAuY2hlY2tib3ggaW5wdXRbdHlwZT0iY2hlY2tib3giXSwuZm9ybS1pbmxpbmUgLnJhZGlvIGlucHV0W3R5cGU9InJhZGlvIl0sLmZvcm0taW5saW5lIC5jaGVja2JveCBpbnB1dFt0eXBlPSJjaGVja2JveCJde2Zsb2F0OmxlZnQ7bWFyZ2luLXJpZ2h0OjNweDttYXJnaW4tbGVmdDowfS5jb250cm9sLWdyb3Vwe21hcmdpbi1ib3R0b206MTBweH1sZWdlbmQrLmNvbnRyb2wtZ3JvdXB7bWFyZ2luLXRvcDoyMHB4Oy13ZWJraXQtbWFyZ2luLXRvcC1jb2xsYXBzZTpzZXBhcmF0ZX0uZm9ybS1ob3Jpem9udGFsIC5jb250cm9sLWdyb3Vwe21hcmdpbi1ib3R0b206MjBweDsqem9vbToxfS5mb3JtLWhvcml6b250YWwgLmNvbnRyb2wtZ3JvdXA6YmVmb3JlLC5mb3JtLWhvcml6b250YWwgLmNvbnRyb2wtZ3JvdXA6YWZ0ZXJ7ZGlzcGxheTp0YWJsZTtsaW5lLWhlaWdodDowO2NvbnRlbnQ6IiJ9LmZvcm0taG9yaXpvbnRhbCAuY29udHJvbC1ncm91cDphZnRlcntjbGVhcjpib3RofS5mb3JtLWhvcml6b250YWwgLmNvbnRyb2wtbGFiZWx7ZmxvYXQ6bGVmdDt3aWR0aDoxNjBweDtwYWRkaW5nLXRvcDo1cHg7dGV4dC1hbGlnbjpyaWdodH0uZm9ybS1ob3Jpem9udGFsIC5jb250cm9sc3sqZGlzcGxheTppbmxpbmUtYmxvY2s7KnBhZGRpbmctbGVmdDoyMHB4O21hcmdpbi1sZWZ0OjE4MHB4OyptYXJnaW4tbGVmdDowfS5mb3JtLWhvcml6b250YWwgLmNvbnRyb2xzOmZpcnN0LWNoaWxkeypwYWRkaW5nLWxlZnQ6MTgwcHh9LmZvcm0taG9yaXpvbnRhbCAuaGVscC1ibG9ja3ttYXJnaW4tYm90dG9tOjB9LmZvcm0taG9yaXpvbnRhbCBpbnB1dCsuaGVscC1ibG9jaywuZm9ybS1ob3Jpem9udGFsIHNlbGVjdCsuaGVscC1ibG9jaywuZm9ybS1ob3Jpem9udGFsIHRleHRhcmVhKy5oZWxwLWJsb2NrLC5mb3JtLWhvcml6b250YWwgLnVuZWRpdGFibGUtaW5wdXQrLmhlbHAtYmxvY2ssLmZvcm0taG9yaXpvbnRhbCAuaW5wdXQtcHJlcGVuZCsuaGVscC1ibG9jaywuZm9ybS1ob3Jpem9udGFsIC5pbnB1dC1hcHBlbmQrLmhlbHAtYmxvY2t7bWFyZ2luLXRvcDoxMHB4fS5mb3JtLWhvcml6b250YWwgLmZvcm0tYWN0aW9uc3twYWRkaW5nLWxlZnQ6MTgwcHh9dGFibGV7bWF4LXdpZHRoOjEwMCU7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Ym9yZGVyLXNwYWNpbmc6MH0udGFibGV7d2lkdGg6MTAwJTttYXJnaW4tYm90dG9tOjIwcHh9LnRhYmxlIHRoLC50YWJsZSB0ZHtwYWRkaW5nOjhweDtsaW5lLWhlaWdodDoyMHB4O3RleHQtYWxpZ246bGVmdDt2ZXJ0aWNhbC1hbGlnbjp0b3A7Ym9yZGVyLXRvcDoxcHggc29saWQgI2RkZH0udGFibGUgdGh7Zm9udC13ZWlnaHQ6Ym9sZH0udGFibGUgdGhlYWQgdGh7dmVydGljYWwtYWxpZ246Ym90dG9tfS50YWJsZSBjYXB0aW9uK3RoZWFkIHRyOmZpcnN0LWNoaWxkIHRoLC50YWJsZSBjYXB0aW9uK3RoZWFkIHRyOmZpcnN0LWNoaWxkIHRkLC50YWJsZSBjb2xncm91cCt0aGVhZCB0cjpmaXJzdC1jaGlsZCB0aCwudGFibGUgY29sZ3JvdXArdGhlYWQgdHI6Zmlyc3QtY2hpbGQgdGQsLnRhYmxlIHRoZWFkOmZpcnN0LWNoaWxkIHRyOmZpcnN0LWNoaWxkIHRoLC50YWJsZSB0aGVhZDpmaXJzdC1jaGlsZCB0cjpmaXJzdC1jaGlsZCB0ZHtib3JkZXItdG9wOjB9LnRhYmxlIHRib2R5K3Rib2R5e2JvcmRlci10b3A6MnB4IHNvbGlkICNkZGR9LnRhYmxlIC50YWJsZXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9LnRhYmxlLWNvbmRlbnNlZCB0aCwudGFibGUtY29uZGVuc2VkIHRke3BhZGRpbmc6NHB4IDVweH0udGFibGUtYm9yZGVyZWR7Ym9yZGVyOjFweCBzb2xpZCAjZGRkO2JvcmRlci1jb2xsYXBzZTpzZXBhcmF0ZTsqYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO2JvcmRlci1sZWZ0OjA7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXM6NHB4O2JvcmRlci1yYWRpdXM6NHB4fS50YWJsZS1ib3JkZXJlZCB0aCwudGFibGUtYm9yZGVyZWQgdGR7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkICNkZGR9LnRhYmxlLWJvcmRlcmVkIGNhcHRpb24rdGhlYWQgdHI6Zmlyc3QtY2hpbGQgdGgsLnRhYmxlLWJvcmRlcmVkIGNhcHRpb24rdGJvZHkgdHI6Zmlyc3QtY2hpbGQgdGgsLnRhYmxlLWJvcmRlcmVkIGNhcHRpb24rdGJvZHkgdHI6Zmlyc3QtY2hpbGQgdGQsLnRhYmxlLWJvcmRlcmVkIGNvbGdyb3VwK3RoZWFkIHRyOmZpcnN0LWNoaWxkIHRoLC50YWJsZS1ib3JkZXJlZCBjb2xncm91cCt0Ym9keSB0cjpmaXJzdC1jaGlsZCB0aCwudGFibGUtYm9yZGVyZWQgY29sZ3JvdXArdGJvZHkgdHI6Zmlyc3QtY2hpbGQgdGQsLnRhYmxlLWJvcmRlcmVkIHRoZWFkOmZpcnN0LWNoaWxkIHRyOmZpcnN0LWNoaWxkIHRoLC50YWJsZS1ib3JkZXJlZCB0Ym9keTpmaXJzdC1jaGlsZCB0cjpmaXJzdC1jaGlsZCB0aCwudGFibGUtYm9yZGVyZWQgdGJvZHk6Zmlyc3QtY2hpbGQgdHI6Zmlyc3QtY2hpbGQgdGR7Ym9yZGVyLXRvcDowfS50YWJsZS1ib3JkZXJlZCB0aGVhZDpmaXJzdC1jaGlsZCB0cjpmaXJzdC1jaGlsZD50aDpmaXJzdC1jaGlsZCwudGFibGUtYm9yZGVyZWQgdGJvZHk6Zmlyc3QtY2hpbGQgdHI6Zmlyc3QtY2hpbGQ+dGQ6Zmlyc3QtY2hpbGQsLnRhYmxlLWJvcmRlcmVkIHRib2R5OmZpcnN0LWNoaWxkIHRyOmZpcnN0LWNoaWxkPnRoOmZpcnN0LWNoaWxkey13ZWJraXQtYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czo0cHg7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czo0cHg7LW1vei1ib3JkZXItcmFkaXVzLXRvcGxlZnQ6NHB4fS50YWJsZS1ib3JkZXJlZCB0aGVhZDpmaXJzdC1jaGlsZCB0cjpmaXJzdC1jaGlsZD50aDpsYXN0LWNoaWxkLC50YWJsZS1ib3JkZXJlZCB0Ym9keTpmaXJzdC1jaGlsZCB0cjpmaXJzdC1jaGlsZD50ZDpsYXN0LWNoaWxkLC50YWJsZS1ib3JkZXJlZCB0Ym9keTpmaXJzdC1jaGlsZCB0cjpmaXJzdC1jaGlsZD50aDpsYXN0LWNoaWxkey13ZWJraXQtYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6NHB4O2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXMtdG9wcmlnaHQ6NHB4fS50YWJsZS1ib3JkZXJlZCB0aGVhZDpsYXN0LWNoaWxkIHRyOmxhc3QtY2hpbGQ+dGg6Zmlyc3QtY2hpbGQsLnRhYmxlLWJvcmRlcmVkIHRib2R5Omxhc3QtY2hpbGQgdHI6bGFzdC1jaGlsZD50ZDpmaXJzdC1jaGlsZCwudGFibGUtYm9yZGVyZWQgdGJvZHk6bGFzdC1jaGlsZCB0cjpsYXN0LWNoaWxkPnRoOmZpcnN0LWNoaWxkLC50YWJsZS1ib3JkZXJlZCB0Zm9vdDpsYXN0LWNoaWxkIHRyOmxhc3QtY2hpbGQ+dGQ6Zmlyc3QtY2hpbGQsLnRhYmxlLWJvcmRlcmVkIHRmb290Omxhc3QtY2hpbGQgdHI6bGFzdC1jaGlsZD50aDpmaXJzdC1jaGlsZHstd2Via2l0LWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6NHB4O2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6NHB4Oy1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21sZWZ0OjRweH0udGFibGUtYm9yZGVyZWQgdGhlYWQ6bGFzdC1jaGlsZCB0cjpsYXN0LWNoaWxkPnRoOmxhc3QtY2hpbGQsLnRhYmxlLWJvcmRlcmVkIHRib2R5Omxhc3QtY2hpbGQgdHI6bGFzdC1jaGlsZD50ZDpsYXN0LWNoaWxkLC50YWJsZS1ib3JkZXJlZCB0Ym9keTpsYXN0LWNoaWxkIHRyOmxhc3QtY2hpbGQ+dGg6bGFzdC1jaGlsZCwudGFibGUtYm9yZGVyZWQgdGZvb3Q6bGFzdC1jaGlsZCB0cjpsYXN0LWNoaWxkPnRkOmxhc3QtY2hpbGQsLnRhYmxlLWJvcmRlcmVkIHRmb290Omxhc3QtY2hpbGQgdHI6bGFzdC1jaGlsZD50aDpsYXN0LWNoaWxkey13ZWJraXQtYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6NHB4O2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXMtYm90dG9tcmlnaHQ6NHB4fS50YWJsZS1ib3JkZXJlZCB0Zm9vdCt0Ym9keTpsYXN0LWNoaWxkIHRyOmxhc3QtY2hpbGQgdGQ6Zmlyc3QtY2hpbGR7LXdlYmtpdC1ib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjA7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czowOy1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21sZWZ0OjB9LnRhYmxlLWJvcmRlcmVkIHRmb290K3Rib2R5Omxhc3QtY2hpbGQgdHI6bGFzdC1jaGlsZCB0ZDpsYXN0LWNoaWxkey13ZWJraXQtYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6MDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czowOy1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodDowfS50YWJsZS1ib3JkZXJlZCBjYXB0aW9uK3RoZWFkIHRyOmZpcnN0LWNoaWxkIHRoOmZpcnN0LWNoaWxkLC50YWJsZS1ib3JkZXJlZCBjYXB0aW9uK3Rib2R5IHRyOmZpcnN0LWNoaWxkIHRkOmZpcnN0LWNoaWxkLC50YWJsZS1ib3JkZXJlZCBjb2xncm91cCt0aGVhZCB0cjpmaXJzdC1jaGlsZCB0aDpmaXJzdC1jaGlsZCwudGFibGUtYm9yZGVyZWQgY29sZ3JvdXArdGJvZHkgdHI6Zmlyc3QtY2hpbGQgdGQ6Zmlyc3QtY2hpbGR7LXdlYmtpdC1ib3JkZXItdG9wLWxlZnQtcmFkaXVzOjRweDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXMtdG9wbGVmdDo0cHh9LnRhYmxlLWJvcmRlcmVkIGNhcHRpb24rdGhlYWQgdHI6Zmlyc3QtY2hpbGQgdGg6bGFzdC1jaGlsZCwudGFibGUtYm9yZGVyZWQgY2FwdGlvbit0Ym9keSB0cjpmaXJzdC1jaGlsZCB0ZDpsYXN0LWNoaWxkLC50YWJsZS1ib3JkZXJlZCBjb2xncm91cCt0aGVhZCB0cjpmaXJzdC1jaGlsZCB0aDpsYXN0LWNoaWxkLC50YWJsZS1ib3JkZXJlZCBjb2xncm91cCt0Ym9keSB0cjpmaXJzdC1jaGlsZCB0ZDpsYXN0LWNoaWxkey13ZWJraXQtYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6NHB4O2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXMtdG9wcmlnaHQ6NHB4fS50YWJsZS1zdHJpcGVkIHRib2R5PnRyOm50aC1jaGlsZChvZGQpPnRkLC50YWJsZS1zdHJpcGVkIHRib2R5PnRyOm50aC1jaGlsZChvZGQpPnRoe2JhY2tncm91bmQtY29sb3I6I2Y5ZjlmOX0udGFibGUtaG92ZXIgdGJvZHkgdHI6aG92ZXI+dGQsLnRhYmxlLWhvdmVyIHRib2R5IHRyOmhvdmVyPnRoe2JhY2tncm91bmQtY29sb3I6I2Y1ZjVmNX10YWJsZSB0ZFtjbGFzcyo9InNwYW4iXSx0YWJsZSB0aFtjbGFzcyo9InNwYW4iXSwucm93LWZsdWlkIHRhYmxlIHRkW2NsYXNzKj0ic3BhbiJdLC5yb3ctZmx1aWQgdGFibGUgdGhbY2xhc3MqPSJzcGFuIl17ZGlzcGxheTp0YWJsZS1jZWxsO2Zsb2F0Om5vbmU7bWFyZ2luLWxlZnQ6MH0udGFibGUgdGQuc3BhbjEsLnRhYmxlIHRoLnNwYW4xe2Zsb2F0Om5vbmU7d2lkdGg6NDRweDttYXJnaW4tbGVmdDowfS50YWJsZSB0ZC5zcGFuMiwudGFibGUgdGguc3BhbjJ7ZmxvYXQ6bm9uZTt3aWR0aDoxMjRweDttYXJnaW4tbGVmdDowfS50YWJsZSB0ZC5zcGFuMywudGFibGUgdGguc3BhbjN7ZmxvYXQ6bm9uZTt3aWR0aDoyMDRweDttYXJnaW4tbGVmdDowfS50YWJsZSB0ZC5zcGFuNCwudGFibGUgdGguc3BhbjR7ZmxvYXQ6bm9uZTt3aWR0aDoyODRweDttYXJnaW4tbGVmdDowfS50YWJsZSB0ZC5zcGFuNSwudGFibGUgdGguc3BhbjV7ZmxvYXQ6bm9uZTt3aWR0aDozNjRweDttYXJnaW4tbGVmdDowfS50YWJsZSB0ZC5zcGFuNiwudGFibGUgdGguc3BhbjZ7ZmxvYXQ6bm9uZTt3aWR0aDo0NDRweDttYXJnaW4tbGVmdDowfS50YWJsZSB0ZC5zcGFuNywudGFibGUgdGguc3Bhbjd7ZmxvYXQ6bm9uZTt3aWR0aDo1MjRweDttYXJnaW4tbGVmdDowfS50YWJsZSB0ZC5zcGFuOCwudGFibGUgdGguc3Bhbjh7ZmxvYXQ6bm9uZTt3aWR0aDo2MDRweDttYXJnaW4tbGVmdDowfS50YWJsZSB0ZC5zcGFuOSwudGFibGUgdGguc3Bhbjl7ZmxvYXQ6bm9uZTt3aWR0aDo2ODRweDttYXJnaW4tbGVmdDowfS50YWJsZSB0ZC5zcGFuMTAsLnRhYmxlIHRoLnNwYW4xMHtmbG9hdDpub25lO3dpZHRoOjc2NHB4O21hcmdpbi1sZWZ0OjB9LnRhYmxlIHRkLnNwYW4xMSwudGFibGUgdGguc3BhbjExe2Zsb2F0Om5vbmU7d2lkdGg6ODQ0cHg7bWFyZ2luLWxlZnQ6MH0udGFibGUgdGQuc3BhbjEyLC50YWJsZSB0aC5zcGFuMTJ7ZmxvYXQ6bm9uZTt3aWR0aDo5MjRweDttYXJnaW4tbGVmdDowfS50YWJsZSB0Ym9keSB0ci5zdWNjZXNzPnRke2JhY2tncm91bmQtY29sb3I6I2RmZjBkOH0udGFibGUgdGJvZHkgdHIuZXJyb3I+dGR7YmFja2dyb3VuZC1jb2xvcjojZjJkZWRlfS50YWJsZSB0Ym9keSB0ci53YXJuaW5nPnRke2JhY2tncm91bmQtY29sb3I6I2ZjZjhlM30udGFibGUgdGJvZHkgdHIuaW5mbz50ZHtiYWNrZ3JvdW5kLWNvbG9yOiNkOWVkZjd9LnRhYmxlLWhvdmVyIHRib2R5IHRyLnN1Y2Nlc3M6aG92ZXI+dGR7YmFja2dyb3VuZC1jb2xvcjojZDBlOWM2fS50YWJsZS1ob3ZlciB0Ym9keSB0ci5lcnJvcjpob3Zlcj50ZHtiYWNrZ3JvdW5kLWNvbG9yOiNlYmNjY2N9LnRhYmxlLWhvdmVyIHRib2R5IHRyLndhcm5pbmc6aG92ZXI+dGR7YmFja2dyb3VuZC1jb2xvcjojZmFmMmNjfS50YWJsZS1ob3ZlciB0Ym9keSB0ci5pbmZvOmhvdmVyPnRke2JhY2tncm91bmQtY29sb3I6I2M0ZTNmM31bY2xhc3NePSJpY29uLSJdLFtjbGFzcyo9IiBpY29uLSJde2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjE0cHg7aGVpZ2h0OjE0cHg7bWFyZ2luLXRvcDoxcHg7Km1hcmdpbi1yaWdodDouM2VtO2xpbmUtaGVpZ2h0OjE0cHg7dmVydGljYWwtYWxpZ246dGV4dC10b3A7YmFja2dyb3VuZC1pbWFnZTp1cmwoIi4uL2ltZy9nbHlwaGljb25zLWhhbGZsaW5ncy5wbmciKTtiYWNrZ3JvdW5kLXBvc2l0aW9uOjE0cHggMTRweDtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXR9Lmljb24td2hpdGUsLm5hdi1waWxscz4uYWN0aXZlPmE+W2NsYXNzXj0iaWNvbi0iXSwubmF2LXBpbGxzPi5hY3RpdmU+YT5bY2xhc3MqPSIgaWNvbi0iXSwubmF2LWxpc3Q+LmFjdGl2ZT5hPltjbGFzc149Imljb24tIl0sLm5hdi1saXN0Pi5hY3RpdmU+YT5bY2xhc3MqPSIgaWNvbi0iXSwubmF2YmFyLWludmVyc2UgLm5hdj4uYWN0aXZlPmE+W2NsYXNzXj0iaWNvbi0iXSwubmF2YmFyLWludmVyc2UgLm5hdj4uYWN0aXZlPmE+W2NsYXNzKj0iIGljb24tIl0sLmRyb3Bkb3duLW1lbnU+bGk+YTpob3Zlcj5bY2xhc3NePSJpY29uLSJdLC5kcm9wZG93bi1tZW51PmxpPmE6Zm9jdXM+W2NsYXNzXj0iaWNvbi0iXSwuZHJvcGRvd24tbWVudT5saT5hOmhvdmVyPltjbGFzcyo9IiBpY29uLSJdLC5kcm9wZG93bi1tZW51PmxpPmE6Zm9jdXM+W2NsYXNzKj0iIGljb24tIl0sLmRyb3Bkb3duLW1lbnU+LmFjdGl2ZT5hPltjbGFzc149Imljb24tIl0sLmRyb3Bkb3duLW1lbnU+LmFjdGl2ZT5hPltjbGFzcyo9IiBpY29uLSJdLC5kcm9wZG93bi1zdWJtZW51OmhvdmVyPmE+W2NsYXNzXj0iaWNvbi0iXSwuZHJvcGRvd24tc3VibWVudTpmb2N1cz5hPltjbGFzc149Imljb24tIl0sLmRyb3Bkb3duLXN1Ym1lbnU6aG92ZXI+YT5bY2xhc3MqPSIgaWNvbi0iXSwuZHJvcGRvd24tc3VibWVudTpmb2N1cz5hPltjbGFzcyo9IiBpY29uLSJde2JhY2tncm91bmQtaW1hZ2U6dXJsKCIuLi9pbWcvZ2x5cGhpY29ucy1oYWxmbGluZ3Mtd2hpdGUucG5nIil9Lmljb24tZ2xhc3N7YmFja2dyb3VuZC1wb3NpdGlvbjowIDB9Lmljb24tbXVzaWN7YmFja2dyb3VuZC1wb3NpdGlvbjotMjRweCAwfS5pY29uLXNlYXJjaHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IDB9Lmljb24tZW52ZWxvcGV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAwfS5pY29uLWhlYXJ0e2JhY2tncm91bmQtcG9zaXRpb246LTk2cHggMH0uaWNvbi1zdGFye2JhY2tncm91bmQtcG9zaXRpb246LTEyMHB4IDB9Lmljb24tc3Rhci1lbXB0eXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNDRweCAwfS5pY29uLXVzZXJ7YmFja2dyb3VuZC1wb3NpdGlvbjotMTY4cHggMH0uaWNvbi1maWxte2JhY2tncm91bmQtcG9zaXRpb246LTE5MnB4IDB9Lmljb24tdGgtbGFyZ2V7YmFja2dyb3VuZC1wb3NpdGlvbjotMjE2cHggMH0uaWNvbi10aHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yNDBweCAwfS5pY29uLXRoLWxpc3R7YmFja2dyb3VuZC1wb3NpdGlvbjotMjY0cHggMH0uaWNvbi1va3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yODhweCAwfS5pY29uLXJlbW92ZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMTJweCAwfS5pY29uLXpvb20taW57YmFja2dyb3VuZC1wb3NpdGlvbjotMzM2cHggMH0uaWNvbi16b29tLW91dHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNjBweCAwfS5pY29uLW9mZntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zODRweCAwfS5pY29uLXNpZ25hbHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00MDhweCAwfS5pY29uLWNvZ3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi00MzJweCAwfS5pY29uLXRyYXNoe2JhY2tncm91bmQtcG9zaXRpb246LTQ1NnB4IDB9Lmljb24taG9tZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTI0cHh9Lmljb24tZmlsZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yNHB4IC0yNHB4fS5pY29uLXRpbWV7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtMjRweH0uaWNvbi1yb2Fke2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTI0cHh9Lmljb24tZG93bmxvYWQtYWx0e2JhY2tncm91bmQtcG9zaXRpb246LTk2cHggLTI0cHh9Lmljb24tZG93bmxvYWR7YmFja2dyb3VuZC1wb3NpdGlvbjotMTIwcHggLTI0cHh9Lmljb24tdXBsb2Fke2JhY2tncm91bmQtcG9zaXRpb246LTE0NHB4IC0yNHB4fS5pY29uLWluYm94e2JhY2tncm91bmQtcG9zaXRpb246LTE2OHB4IC0yNHB4fS5pY29uLXBsYXktY2lyY2xle2JhY2tncm91bmQtcG9zaXRpb246LTE5MnB4IC0yNHB4fS5pY29uLXJlcGVhdHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMTZweCAtMjRweH0uaWNvbi1yZWZyZXNoe2JhY2tncm91bmQtcG9zaXRpb246LTI0MHB4IC0yNHB4fS5pY29uLWxpc3QtYWx0e2JhY2tncm91bmQtcG9zaXRpb246LTI2NHB4IC0yNHB4fS5pY29uLWxvY2t7YmFja2dyb3VuZC1wb3NpdGlvbjotMjg3cHggLTI0cHh9Lmljb24tZmxhZ3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMTJweCAtMjRweH0uaWNvbi1oZWFkcGhvbmVze2JhY2tncm91bmQtcG9zaXRpb246LTMzNnB4IC0yNHB4fS5pY29uLXZvbHVtZS1vZmZ7YmFja2dyb3VuZC1wb3NpdGlvbjotMzYwcHggLTI0cHh9Lmljb24tdm9sdW1lLWRvd257YmFja2dyb3VuZC1wb3NpdGlvbjotMzg0cHggLTI0cHh9Lmljb24tdm9sdW1lLXVwe2JhY2tncm91bmQtcG9zaXRpb246LTQwOHB4IC0yNHB4fS5pY29uLXFyY29kZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00MzJweCAtMjRweH0uaWNvbi1iYXJjb2Rle2JhY2tncm91bmQtcG9zaXRpb246LTQ1NnB4IC0yNHB4fS5pY29uLXRhZ3tiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTQ4cHh9Lmljb24tdGFnc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yNXB4IC00OHB4fS5pY29uLWJvb2t7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtNDhweH0uaWNvbi1ib29rbWFya3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC00OHB4fS5pY29uLXByaW50e2JhY2tncm91bmQtcG9zaXRpb246LTk2cHggLTQ4cHh9Lmljb24tY2FtZXJhe2JhY2tncm91bmQtcG9zaXRpb246LTEyMHB4IC00OHB4fS5pY29uLWZvbnR7YmFja2dyb3VuZC1wb3NpdGlvbjotMTQ0cHggLTQ4cHh9Lmljb24tYm9sZHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNjdweCAtNDhweH0uaWNvbi1pdGFsaWN7YmFja2dyb3VuZC1wb3NpdGlvbjotMTkycHggLTQ4cHh9Lmljb24tdGV4dC1oZWlnaHR7YmFja2dyb3VuZC1wb3NpdGlvbjotMjE2cHggLTQ4cHh9Lmljb24tdGV4dC13aWR0aHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yNDBweCAtNDhweH0uaWNvbi1hbGlnbi1sZWZ0e2JhY2tncm91bmQtcG9zaXRpb246LTI2NHB4IC00OHB4fS5pY29uLWFsaWduLWNlbnRlcntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yODhweCAtNDhweH0uaWNvbi1hbGlnbi1yaWdodHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMTJweCAtNDhweH0uaWNvbi1hbGlnbi1qdXN0aWZ5e2JhY2tncm91bmQtcG9zaXRpb246LTMzNnB4IC00OHB4fS5pY29uLWxpc3R7YmFja2dyb3VuZC1wb3NpdGlvbjotMzYwcHggLTQ4cHh9Lmljb24taW5kZW50LWxlZnR7YmFja2dyb3VuZC1wb3NpdGlvbjotMzg0cHggLTQ4cHh9Lmljb24taW5kZW50LXJpZ2h0e2JhY2tncm91bmQtcG9zaXRpb246LTQwOHB4IC00OHB4fS5pY29uLWZhY2V0aW1lLXZpZGVve2JhY2tncm91bmQtcG9zaXRpb246LTQzMnB4IC00OHB4fS5pY29uLXBpY3R1cmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNDU2cHggLTQ4cHh9Lmljb24tcGVuY2lse2JhY2tncm91bmQtcG9zaXRpb246MCAtNzJweH0uaWNvbi1tYXAtbWFya2Vye2JhY2tncm91bmQtcG9zaXRpb246LTI0cHggLTcycHh9Lmljb24tYWRqdXN0e2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTcycHh9Lmljb24tdGludHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC03MnB4fS5pY29uLWVkaXR7YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAtNzJweH0uaWNvbi1zaGFyZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMjBweCAtNzJweH0uaWNvbi1jaGVja3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNDRweCAtNzJweH0uaWNvbi1tb3Zle2JhY2tncm91bmQtcG9zaXRpb246LTE2OHB4IC03MnB4fS5pY29uLXN0ZXAtYmFja3dhcmR7YmFja2dyb3VuZC1wb3NpdGlvbjotMTkycHggLTcycHh9Lmljb24tZmFzdC1iYWNrd2FyZHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMTZweCAtNzJweH0uaWNvbi1iYWNrd2FyZHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yNDBweCAtNzJweH0uaWNvbi1wbGF5e2JhY2tncm91bmQtcG9zaXRpb246LTI2NHB4IC03MnB4fS5pY29uLXBhdXNle2JhY2tncm91bmQtcG9zaXRpb246LTI4OHB4IC03MnB4fS5pY29uLXN0b3B7YmFja2dyb3VuZC1wb3NpdGlvbjotMzEycHggLTcycHh9Lmljb24tZm9yd2FyZHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMzZweCAtNzJweH0uaWNvbi1mYXN0LWZvcndhcmR7YmFja2dyb3VuZC1wb3NpdGlvbjotMzYwcHggLTcycHh9Lmljb24tc3RlcC1mb3J3YXJke2JhY2tncm91bmQtcG9zaXRpb246LTM4NHB4IC03MnB4fS5pY29uLWVqZWN0e2JhY2tncm91bmQtcG9zaXRpb246LTQwOHB4IC03MnB4fS5pY29uLWNoZXZyb24tbGVmdHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00MzJweCAtNzJweH0uaWNvbi1jaGV2cm9uLXJpZ2h0e2JhY2tncm91bmQtcG9zaXRpb246LTQ1NnB4IC03MnB4fS5pY29uLXBsdXMtc2lnbntiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTk2cHh9Lmljb24tbWludXMtc2lnbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yNHB4IC05NnB4fS5pY29uLXJlbW92ZS1zaWdue2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTk2cHh9Lmljb24tb2stc2lnbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC05NnB4fS5pY29uLXF1ZXN0aW9uLXNpZ257YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAtOTZweH0uaWNvbi1pbmZvLXNpZ257YmFja2dyb3VuZC1wb3NpdGlvbjotMTIwcHggLTk2cHh9Lmljb24tc2NyZWVuc2hvdHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNDRweCAtOTZweH0uaWNvbi1yZW1vdmUtY2lyY2xle2JhY2tncm91bmQtcG9zaXRpb246LTE2OHB4IC05NnB4fS5pY29uLW9rLWNpcmNsZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xOTJweCAtOTZweH0uaWNvbi1iYW4tY2lyY2xle2JhY2tncm91bmQtcG9zaXRpb246LTIxNnB4IC05NnB4fS5pY29uLWFycm93LWxlZnR7YmFja2dyb3VuZC1wb3NpdGlvbjotMjQwcHggLTk2cHh9Lmljb24tYXJyb3ctcmlnaHR7YmFja2dyb3VuZC1wb3NpdGlvbjotMjY0cHggLTk2cHh9Lmljb24tYXJyb3ctdXB7YmFja2dyb3VuZC1wb3NpdGlvbjotMjg5cHggLTk2cHh9Lmljb24tYXJyb3ctZG93bntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMTJweCAtOTZweH0uaWNvbi1zaGFyZS1hbHR7YmFja2dyb3VuZC1wb3NpdGlvbjotMzM2cHggLTk2cHh9Lmljb24tcmVzaXplLWZ1bGx7YmFja2dyb3VuZC1wb3NpdGlvbjotMzYwcHggLTk2cHh9Lmljb24tcmVzaXplLXNtYWxse2JhY2tncm91bmQtcG9zaXRpb246LTM4NHB4IC05NnB4fS5pY29uLXBsdXN7YmFja2dyb3VuZC1wb3NpdGlvbjotNDA4cHggLTk2cHh9Lmljb24tbWludXN7YmFja2dyb3VuZC1wb3NpdGlvbjotNDMzcHggLTk2cHh9Lmljb24tYXN0ZXJpc2t7YmFja2dyb3VuZC1wb3NpdGlvbjotNDU2cHggLTk2cHh9Lmljb24tZXhjbGFtYXRpb24tc2lnbntiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTEyMHB4fS5pY29uLWdpZnR7YmFja2dyb3VuZC1wb3NpdGlvbjotMjRweCAtMTIwcHh9Lmljb24tbGVhZntiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC0xMjBweH0uaWNvbi1maXJle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTEyMHB4fS5pY29uLWV5ZS1vcGVue2JhY2tncm91bmQtcG9zaXRpb246LTk2cHggLTEyMHB4fS5pY29uLWV5ZS1jbG9zZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMjBweCAtMTIwcHh9Lmljb24td2FybmluZy1zaWdue2JhY2tncm91bmQtcG9zaXRpb246LTE0NHB4IC0xMjBweH0uaWNvbi1wbGFuZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNjhweCAtMTIwcHh9Lmljb24tY2FsZW5kYXJ7YmFja2dyb3VuZC1wb3NpdGlvbjotMTkycHggLTEyMHB4fS5pY29uLXJhbmRvbXt3aWR0aDoxNnB4O2JhY2tncm91bmQtcG9zaXRpb246LTIxNnB4IC0xMjBweH0uaWNvbi1jb21tZW50e2JhY2tncm91bmQtcG9zaXRpb246LTI0MHB4IC0xMjBweH0uaWNvbi1tYWduZXR7YmFja2dyb3VuZC1wb3NpdGlvbjotMjY0cHggLTEyMHB4fS5pY29uLWNoZXZyb24tdXB7YmFja2dyb3VuZC1wb3NpdGlvbjotMjg4cHggLTEyMHB4fS5pY29uLWNoZXZyb24tZG93bntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMTNweCAtMTE5cHh9Lmljb24tcmV0d2VldHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMzZweCAtMTIwcHh9Lmljb24tc2hvcHBpbmctY2FydHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNjBweCAtMTIwcHh9Lmljb24tZm9sZGVyLWNsb3Nle3dpZHRoOjE2cHg7YmFja2dyb3VuZC1wb3NpdGlvbjotMzg0cHggLTEyMHB4fS5pY29uLWZvbGRlci1vcGVue3dpZHRoOjE2cHg7YmFja2dyb3VuZC1wb3NpdGlvbjotNDA4cHggLTEyMHB4fS5pY29uLXJlc2l6ZS12ZXJ0aWNhbHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00MzJweCAtMTE5cHh9Lmljb24tcmVzaXplLWhvcml6b250YWx7YmFja2dyb3VuZC1wb3NpdGlvbjotNDU2cHggLTExOHB4fS5pY29uLWhkZHtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTE0NHB4fS5pY29uLWJ1bGxob3Jue2JhY2tncm91bmQtcG9zaXRpb246LTI0cHggLTE0NHB4fS5pY29uLWJlbGx7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtMTQ0cHh9Lmljb24tY2VydGlmaWNhdGV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtMTQ0cHh9Lmljb24tdGh1bWJzLXVwe2JhY2tncm91bmQtcG9zaXRpb246LTk2cHggLTE0NHB4fS5pY29uLXRodW1icy1kb3due2JhY2tncm91bmQtcG9zaXRpb246LTEyMHB4IC0xNDRweH0uaWNvbi1oYW5kLXJpZ2h0e2JhY2tncm91bmQtcG9zaXRpb246LTE0NHB4IC0xNDRweH0uaWNvbi1oYW5kLWxlZnR7YmFja2dyb3VuZC1wb3NpdGlvbjotMTY4cHggLTE0NHB4fS5pY29uLWhhbmQtdXB7YmFja2dyb3VuZC1wb3NpdGlvbjotMTkycHggLTE0NHB4fS5pY29uLWhhbmQtZG93bntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMTZweCAtMTQ0cHh9Lmljb24tY2lyY2xlLWFycm93LXJpZ2h0e2JhY2tncm91bmQtcG9zaXRpb246LTI0MHB4IC0xNDRweH0uaWNvbi1jaXJjbGUtYXJyb3ctbGVmdHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yNjRweCAtMTQ0cHh9Lmljb24tY2lyY2xlLWFycm93LXVwe2JhY2tncm91bmQtcG9zaXRpb246LTI4OHB4IC0xNDRweH0uaWNvbi1jaXJjbGUtYXJyb3ctZG93bntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMTJweCAtMTQ0cHh9Lmljb24tZ2xvYmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzM2cHggLTE0NHB4fS5pY29uLXdyZW5jaHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNjBweCAtMTQ0cHh9Lmljb24tdGFza3N7YmFja2dyb3VuZC1wb3NpdGlvbjotMzg0cHggLTE0NHB4fS5pY29uLWZpbHRlcntiYWNrZ3JvdW5kLXBvc2l0aW9uOi00MDhweCAtMTQ0cHh9Lmljb24tYnJpZWZjYXNle2JhY2tncm91bmQtcG9zaXRpb246LTQzMnB4IC0xNDRweH0uaWNvbi1mdWxsc2NyZWVue2JhY2tncm91bmQtcG9zaXRpb246LTQ1NnB4IC0xNDRweH0uZHJvcHVwLC5kcm9wZG93bntwb3NpdGlvbjpyZWxhdGl2ZX0uZHJvcGRvd24tdG9nZ2xleyptYXJnaW4tYm90dG9tOi0zcHh9LmRyb3Bkb3duLXRvZ2dsZTphY3RpdmUsLm9wZW4gLmRyb3Bkb3duLXRvZ2dsZXtvdXRsaW5lOjB9LmNhcmV0e2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjA7aGVpZ2h0OjA7dmVydGljYWwtYWxpZ246dG9wO2JvcmRlci10b3A6NHB4IHNvbGlkICMwMDA7Ym9yZGVyLXJpZ2h0OjRweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItbGVmdDo0cHggc29saWQgdHJhbnNwYXJlbnQ7Y29udGVudDoiIn0uZHJvcGRvd24gLmNhcmV0e21hcmdpbi10b3A6OHB4O21hcmdpbi1sZWZ0OjJweH0uZHJvcGRvd24tbWVudXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTAwJTtsZWZ0OjA7ei1pbmRleDoxMDAwO2Rpc3BsYXk6bm9uZTtmbG9hdDpsZWZ0O21pbi13aWR0aDoxNjBweDtwYWRkaW5nOjVweCAwO21hcmdpbjoycHggMCAwO2xpc3Qtc3R5bGU6bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ym9yZGVyOjFweCBzb2xpZCAjY2NjO2JvcmRlcjoxcHggc29saWQgcmdiYSgwLDAsMCwwLjIpOypib3JkZXItcmlnaHQtd2lkdGg6MnB4Oypib3JkZXItYm90dG9tLXdpZHRoOjJweDstd2Via2l0LWJvcmRlci1yYWRpdXM6NnB4Oy1tb3otYm9yZGVyLXJhZGl1czo2cHg7Ym9yZGVyLXJhZGl1czo2cHg7LXdlYmtpdC1ib3gtc2hhZG93OjAgNXB4IDEwcHggcmdiYSgwLDAsMCwwLjIpOy1tb3otYm94LXNoYWRvdzowIDVweCAxMHB4IHJnYmEoMCwwLDAsMC4yKTtib3gtc2hhZG93OjAgNXB4IDEwcHggcmdiYSgwLDAsMCwwLjIpOy13ZWJraXQtYmFja2dyb3VuZC1jbGlwOnBhZGRpbmctYm94Oy1tb3otYmFja2dyb3VuZC1jbGlwOnBhZGRpbmc7YmFja2dyb3VuZC1jbGlwOnBhZGRpbmctYm94fS5kcm9wZG93bi1tZW51LnB1bGwtcmlnaHR7cmlnaHQ6MDtsZWZ0OmF1dG99LmRyb3Bkb3duLW1lbnUgLmRpdmlkZXJ7KndpZHRoOjEwMCU7aGVpZ2h0OjFweDttYXJnaW46OXB4IDFweDsqbWFyZ2luOi01cHggMCA1cHg7b3ZlcmZsb3c6aGlkZGVuO2JhY2tncm91bmQtY29sb3I6I2U1ZTVlNTtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZmZmfS5kcm9wZG93bi1tZW51PmxpPmF7ZGlzcGxheTpibG9jaztwYWRkaW5nOjNweCAyMHB4O2NsZWFyOmJvdGg7Zm9udC13ZWlnaHQ6bm9ybWFsO2xpbmUtaGVpZ2h0OjIwcHg7Y29sb3I6IzMzMzt3aGl0ZS1zcGFjZTpub3dyYXB9LmRyb3Bkb3duLW1lbnU+bGk+YTpob3ZlciwuZHJvcGRvd24tbWVudT5saT5hOmZvY3VzLC5kcm9wZG93bi1zdWJtZW51OmhvdmVyPmEsLmRyb3Bkb3duLXN1Ym1lbnU6Zm9jdXM+YXtjb2xvcjojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2JhY2tncm91bmQtY29sb3I6IzAwODFjMjtiYWNrZ3JvdW5kLWltYWdlOi1tb3otbGluZWFyLWdyYWRpZW50KHRvcCwjMDhjLCMwMDc3YjMpO2JhY2tncm91bmQtaW1hZ2U6LXdlYmtpdC1ncmFkaWVudChsaW5lYXIsMCAwLDAgMTAwJSxmcm9tKCMwOGMpLHRvKCMwMDc3YjMpKTtiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRvcCwjMDhjLCMwMDc3YjMpO2JhY2tncm91bmQtaW1hZ2U6LW8tbGluZWFyLWdyYWRpZW50KHRvcCwjMDhjLCMwMDc3YjMpO2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwjMDhjLCMwMDc3YjMpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14O2ZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0nI2ZmMDA4OGNjJyxlbmRDb2xvcnN0cj0nI2ZmMDA3N2IzJyxHcmFkaWVudFR5cGU9MCl9LmRyb3Bkb3duLW1lbnU+LmFjdGl2ZT5hLC5kcm9wZG93bi1tZW51Pi5hY3RpdmU+YTpob3ZlciwuZHJvcGRvd24tbWVudT4uYWN0aXZlPmE6Zm9jdXN7Y29sb3I6I2ZmZjt0ZXh0LWRlY29yYXRpb246bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOiMwMDgxYzI7YmFja2dyb3VuZC1pbWFnZTotbW96LWxpbmVhci1ncmFkaWVudCh0b3AsIzA4YywjMDA3N2IzKTtiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtZ3JhZGllbnQobGluZWFyLDAgMCwwIDEwMCUsZnJvbSgjMDhjKSx0bygjMDA3N2IzKSk7YmFja2dyb3VuZC1pbWFnZTotd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsIzA4YywjMDA3N2IzKTtiYWNrZ3JvdW5kLWltYWdlOi1vLWxpbmVhci1ncmFkaWVudCh0b3AsIzA4YywjMDA3N2IzKTtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIzA4YywjMDA3N2IzKTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDtvdXRsaW5lOjA7ZmlsdGVyOnByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPScjZmYwMDg4Y2MnLGVuZENvbG9yc3RyPScjZmYwMDc3YjMnLEdyYWRpZW50VHlwZT0wKX0uZHJvcGRvd24tbWVudT4uZGlzYWJsZWQ+YSwuZHJvcGRvd24tbWVudT4uZGlzYWJsZWQ+YTpob3ZlciwuZHJvcGRvd24tbWVudT4uZGlzYWJsZWQ+YTpmb2N1c3tjb2xvcjojOTk5fS5kcm9wZG93bi1tZW51Pi5kaXNhYmxlZD5hOmhvdmVyLC5kcm9wZG93bi1tZW51Pi5kaXNhYmxlZD5hOmZvY3Vze3RleHQtZGVjb3JhdGlvbjpub25lO2N1cnNvcjpkZWZhdWx0O2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7YmFja2dyb3VuZC1pbWFnZTpub25lO2ZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoZW5hYmxlZD1mYWxzZSl9Lm9wZW57KnotaW5kZXg6MTAwMH0ub3Blbj4uZHJvcGRvd24tbWVudXtkaXNwbGF5OmJsb2NrfS5wdWxsLXJpZ2h0Pi5kcm9wZG93bi1tZW51e3JpZ2h0OjA7bGVmdDphdXRvfS5kcm9wdXAgLmNhcmV0LC5uYXZiYXItZml4ZWQtYm90dG9tIC5kcm9wZG93biAuY2FyZXR7Ym9yZGVyLXRvcDowO2JvcmRlci1ib3R0b206NHB4IHNvbGlkICMwMDA7Y29udGVudDoiIn0uZHJvcHVwIC5kcm9wZG93bi1tZW51LC5uYXZiYXItZml4ZWQtYm90dG9tIC5kcm9wZG93biAuZHJvcGRvd24tbWVudXt0b3A6YXV0bztib3R0b206MTAwJTttYXJnaW4tYm90dG9tOjFweH0uZHJvcGRvd24tc3VibWVudXtwb3NpdGlvbjpyZWxhdGl2ZX0uZHJvcGRvd24tc3VibWVudT4uZHJvcGRvd24tbWVudXt0b3A6MDtsZWZ0OjEwMCU7bWFyZ2luLXRvcDotNnB4O21hcmdpbi1sZWZ0Oi0xcHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjAgNnB4IDZweCA2cHg7LW1vei1ib3JkZXItcmFkaXVzOjAgNnB4IDZweCA2cHg7Ym9yZGVyLXJhZGl1czowIDZweCA2cHggNnB4fS5kcm9wZG93bi1zdWJtZW51OmhvdmVyPi5kcm9wZG93bi1tZW51e2Rpc3BsYXk6YmxvY2t9LmRyb3B1cCAuZHJvcGRvd24tc3VibWVudT4uZHJvcGRvd24tbWVudXt0b3A6YXV0bztib3R0b206MDttYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTotMnB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czo1cHggNXB4IDVweCAwOy1tb3otYm9yZGVyLXJhZGl1czo1cHggNXB4IDVweCAwO2JvcmRlci1yYWRpdXM6NXB4IDVweCA1cHggMH0uZHJvcGRvd24tc3VibWVudT5hOmFmdGVye2Rpc3BsYXk6YmxvY2s7ZmxvYXQ6cmlnaHQ7d2lkdGg6MDtoZWlnaHQ6MDttYXJnaW4tdG9wOjVweDttYXJnaW4tcmlnaHQ6LTEwcHg7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlci1sZWZ0LWNvbG9yOiNjY2M7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci13aWR0aDo1cHggMCA1cHggNXB4O2NvbnRlbnQ6IiAifS5kcm9wZG93bi1zdWJtZW51OmhvdmVyPmE6YWZ0ZXJ7Ym9yZGVyLWxlZnQtY29sb3I6I2ZmZn0uZHJvcGRvd24tc3VibWVudS5wdWxsLWxlZnR7ZmxvYXQ6bm9uZX0uZHJvcGRvd24tc3VibWVudS5wdWxsLWxlZnQ+LmRyb3Bkb3duLW1lbnV7bGVmdDotMTAwJTttYXJnaW4tbGVmdDoxMHB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czo2cHggMCA2cHggNnB4Oy1tb3otYm9yZGVyLXJhZGl1czo2cHggMCA2cHggNnB4O2JvcmRlci1yYWRpdXM6NnB4IDAgNnB4IDZweH0uZHJvcGRvd24gLmRyb3Bkb3duLW1lbnUgLm5hdi1oZWFkZXJ7cGFkZGluZy1yaWdodDoyMHB4O3BhZGRpbmctbGVmdDoyMHB4fS50eXBlYWhlYWR7ei1pbmRleDoxMDUxO21hcmdpbi10b3A6MnB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czo0cHg7LW1vei1ib3JkZXItcmFkaXVzOjRweDtib3JkZXItcmFkaXVzOjRweH0ud2VsbHttaW4taGVpZ2h0OjIwcHg7cGFkZGluZzoxOXB4O21hcmdpbi1ib3R0b206MjBweDtiYWNrZ3JvdW5kLWNvbG9yOiNmNWY1ZjU7Ym9yZGVyOjFweCBzb2xpZCAjZTNlM2UzOy13ZWJraXQtYm9yZGVyLXJhZGl1czo0cHg7LW1vei1ib3JkZXItcmFkaXVzOjRweDtib3JkZXItcmFkaXVzOjRweDstd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsMC4wNSk7LW1vei1ib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLDAuMDUpO2JveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsMC4wNSl9LndlbGwgYmxvY2txdW90ZXtib3JkZXItY29sb3I6I2RkZDtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwwLjE1KX0ud2VsbC1sYXJnZXtwYWRkaW5nOjI0cHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjZweDstbW96LWJvcmRlci1yYWRpdXM6NnB4O2JvcmRlci1yYWRpdXM6NnB4fS53ZWxsLXNtYWxse3BhZGRpbmc6OXB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czozcHg7LW1vei1ib3JkZXItcmFkaXVzOjNweDtib3JkZXItcmFkaXVzOjNweH0uZmFkZXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2l0aW9uOm9wYWNpdHkgLjE1cyBsaW5lYXI7LW1vei10cmFuc2l0aW9uOm9wYWNpdHkgLjE1cyBsaW5lYXI7LW8tdHJhbnNpdGlvbjpvcGFjaXR5IC4xNXMgbGluZWFyO3RyYW5zaXRpb246b3BhY2l0eSAuMTVzIGxpbmVhcn0uZmFkZS5pbntvcGFjaXR5OjF9LmNvbGxhcHNle3Bvc2l0aW9uOnJlbGF0aXZlO2hlaWdodDowO292ZXJmbG93OmhpZGRlbjstd2Via2l0LXRyYW5zaXRpb246aGVpZ2h0IC4zNXMgZWFzZTstbW96LXRyYW5zaXRpb246aGVpZ2h0IC4zNXMgZWFzZTstby10cmFuc2l0aW9uOmhlaWdodCAuMzVzIGVhc2U7dHJhbnNpdGlvbjpoZWlnaHQgLjM1cyBlYXNlfS5jb2xsYXBzZS5pbntoZWlnaHQ6YXV0b30uY2xvc2V7ZmxvYXQ6cmlnaHQ7Zm9udC1zaXplOjIwcHg7Zm9udC13ZWlnaHQ6Ym9sZDtsaW5lLWhlaWdodDoyMHB4O2NvbG9yOiMwMDA7dGV4dC1zaGFkb3c6MCAxcHggMCAjZmZmO29wYWNpdHk6LjI7ZmlsdGVyOmFscGhhKG9wYWNpdHk9MjApfS5jbG9zZTpob3ZlciwuY2xvc2U6Zm9jdXN7Y29sb3I6IzAwMDt0ZXh0LWRlY29yYXRpb246bm9uZTtjdXJzb3I6cG9pbnRlcjtvcGFjaXR5Oi40O2ZpbHRlcjphbHBoYShvcGFjaXR5PTQwKX1idXR0b24uY2xvc2V7cGFkZGluZzowO2N1cnNvcjpwb2ludGVyO2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Ym9yZGVyOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmV9LmJ0bntkaXNwbGF5OmlubGluZS1ibG9jazsqZGlzcGxheTppbmxpbmU7cGFkZGluZzo0cHggMTJweDttYXJnaW4tYm90dG9tOjA7Km1hcmdpbi1sZWZ0Oi4zZW07Zm9udC1zaXplOjE0cHg7bGluZS1oZWlnaHQ6MjBweDtjb2xvcjojMzMzO3RleHQtYWxpZ246Y2VudGVyO3RleHQtc2hhZG93OjAgMXB4IDFweCByZ2JhKDI1NSwyNTUsMjU1LDAuNzUpO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtjdXJzb3I6cG9pbnRlcjtiYWNrZ3JvdW5kLWNvbG9yOiNmNWY1ZjU7KmJhY2tncm91bmQtY29sb3I6I2U2ZTZlNjtiYWNrZ3JvdW5kLWltYWdlOi1tb3otbGluZWFyLWdyYWRpZW50KHRvcCwjZmZmLCNlNmU2ZTYpO2JhY2tncm91bmQtaW1hZ2U6LXdlYmtpdC1ncmFkaWVudChsaW5lYXIsMCAwLDAgMTAwJSxmcm9tKCNmZmYpLHRvKCNlNmU2ZTYpKTtiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRvcCwjZmZmLCNlNmU2ZTYpO2JhY2tncm91bmQtaW1hZ2U6LW8tbGluZWFyLWdyYWRpZW50KHRvcCwjZmZmLCNlNmU2ZTYpO2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwjZmZmLCNlNmU2ZTYpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14O2JvcmRlcjoxcHggc29saWQgI2NjYzsqYm9yZGVyOjA7Ym9yZGVyLWNvbG9yOiNlNmU2ZTYgI2U2ZTZlNiAjYmZiZmJmO2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLDAuMSkgcmdiYSgwLDAsMCwwLjEpIHJnYmEoMCwwLDAsMC4yNSk7Ym9yZGVyLWJvdHRvbS1jb2xvcjojYjNiM2IzOy13ZWJraXQtYm9yZGVyLXJhZGl1czo0cHg7LW1vei1ib3JkZXItcmFkaXVzOjRweDtib3JkZXItcmFkaXVzOjRweDtmaWx0ZXI6cHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JzdHI9JyNmZmZmZmZmZicsZW5kQ29sb3JzdHI9JyNmZmU2ZTZlNicsR3JhZGllbnRUeXBlPTApO2ZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoZW5hYmxlZD1mYWxzZSk7Knpvb206MTstd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgMCAxcHggMCByZ2JhKDI1NSwyNTUsMjU1LDAuMiksMCAxcHggMnB4IHJnYmEoMCwwLDAsMC4wNSk7LW1vei1ib3gtc2hhZG93Omluc2V0IDAgMXB4IDAgcmdiYSgyNTUsMjU1LDI1NSwwLjIpLDAgMXB4IDJweCByZ2JhKDAsMCwwLDAuMDUpO2JveC1zaGFkb3c6aW5zZXQgMCAxcHggMCByZ2JhKDI1NSwyNTUsMjU1LDAuMiksMCAxcHggMnB4IHJnYmEoMCwwLDAsMC4wNSl9LmJ0bjpob3ZlciwuYnRuOmZvY3VzLC5idG46YWN0aXZlLC5idG4uYWN0aXZlLC5idG4uZGlzYWJsZWQsLmJ0bltkaXNhYmxlZF17Y29sb3I6IzMzMztiYWNrZ3JvdW5kLWNvbG9yOiNlNmU2ZTY7KmJhY2tncm91bmQtY29sb3I6I2Q5ZDlkOX0uYnRuOmFjdGl2ZSwuYnRuLmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiNjY2MgXDl9LmJ0bjpmaXJzdC1jaGlsZHsqbWFyZ2luLWxlZnQ6MH0uYnRuOmhvdmVyLC5idG46Zm9jdXN7Y29sb3I6IzMzMzt0ZXh0LWRlY29yYXRpb246bm9uZTtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTE1cHg7LXdlYmtpdC10cmFuc2l0aW9uOmJhY2tncm91bmQtcG9zaXRpb24gLjFzIGxpbmVhcjstbW96LXRyYW5zaXRpb246YmFja2dyb3VuZC1wb3NpdGlvbiAuMXMgbGluZWFyOy1vLXRyYW5zaXRpb246YmFja2dyb3VuZC1wb3NpdGlvbiAuMXMgbGluZWFyO3RyYW5zaXRpb246YmFja2dyb3VuZC1wb3NpdGlvbiAuMXMgbGluZWFyfS5idG46Zm9jdXN7b3V0bGluZTp0aGluIGRvdHRlZCAjMzMzO291dGxpbmU6NXB4IGF1dG8gLXdlYmtpdC1mb2N1cy1yaW5nLWNvbG9yO291dGxpbmUtb2Zmc2V0Oi0ycHh9LmJ0bi5hY3RpdmUsLmJ0bjphY3RpdmV7YmFja2dyb3VuZC1pbWFnZTpub25lO291dGxpbmU6MDstd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgMCAycHggNHB4IHJnYmEoMCwwLDAsMC4xNSksMCAxcHggMnB4IHJnYmEoMCwwLDAsMC4wNSk7LW1vei1ib3gtc2hhZG93Omluc2V0IDAgMnB4IDRweCByZ2JhKDAsMCwwLDAuMTUpLDAgMXB4IDJweCByZ2JhKDAsMCwwLDAuMDUpO2JveC1zaGFkb3c6aW5zZXQgMCAycHggNHB4IHJnYmEoMCwwLDAsMC4xNSksMCAxcHggMnB4IHJnYmEoMCwwLDAsMC4wNSl9LmJ0bi5kaXNhYmxlZCwuYnRuW2Rpc2FibGVkXXtjdXJzb3I6ZGVmYXVsdDtiYWNrZ3JvdW5kLWltYWdlOm5vbmU7b3BhY2l0eTouNjU7ZmlsdGVyOmFscGhhKG9wYWNpdHk9NjUpOy13ZWJraXQtYm94LXNoYWRvdzpub25lOy1tb3otYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX0uYnRuLWxhcmdle3BhZGRpbmc6MTFweCAxOXB4O2ZvbnQtc2l6ZToxNy41cHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjZweDstbW96LWJvcmRlci1yYWRpdXM6NnB4O2JvcmRlci1yYWRpdXM6NnB4fS5idG4tbGFyZ2UgW2NsYXNzXj0iaWNvbi0iXSwuYnRuLWxhcmdlIFtjbGFzcyo9IiBpY29uLSJde21hcmdpbi10b3A6NHB4fS5idG4tc21hbGx7cGFkZGluZzoycHggMTBweDtmb250LXNpemU6MTEuOXB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czozcHg7LW1vei1ib3JkZXItcmFkaXVzOjNweDtib3JkZXItcmFkaXVzOjNweH0uYnRuLXNtYWxsIFtjbGFzc149Imljb24tIl0sLmJ0bi1zbWFsbCBbY2xhc3MqPSIgaWNvbi0iXXttYXJnaW4tdG9wOjB9LmJ0bi1taW5pIFtjbGFzc149Imljb24tIl0sLmJ0bi1taW5pIFtjbGFzcyo9IiBpY29uLSJde21hcmdpbi10b3A6LTFweH0uYnRuLW1pbml7cGFkZGluZzowIDZweDtmb250LXNpemU6MTAuNXB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czozcHg7LW1vei1ib3JkZXItcmFkaXVzOjNweDtib3JkZXItcmFkaXVzOjNweH0uYnRuLWJsb2Nre2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJTtwYWRkaW5nLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjA7LXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94fS5idG4tYmxvY2srLmJ0bi1ibG9ja3ttYXJnaW4tdG9wOjVweH1pbnB1dFt0eXBlPSJzdWJtaXQiXS5idG4tYmxvY2ssaW5wdXRbdHlwZT0icmVzZXQiXS5idG4tYmxvY2ssaW5wdXRbdHlwZT0iYnV0dG9uIl0uYnRuLWJsb2Nre3dpZHRoOjEwMCV9LmJ0bi1wcmltYXJ5LmFjdGl2ZSwuYnRuLXdhcm5pbmcuYWN0aXZlLC5idG4tZGFuZ2VyLmFjdGl2ZSwuYnRuLXN1Y2Nlc3MuYWN0aXZlLC5idG4taW5mby5hY3RpdmUsLmJ0bi1pbnZlcnNlLmFjdGl2ZXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LDAuNzUpfS5idG4tcHJpbWFyeXtjb2xvcjojZmZmO3RleHQtc2hhZG93OjAgLTFweCAwIHJnYmEoMCwwLDAsMC4yNSk7YmFja2dyb3VuZC1jb2xvcjojMDA2ZGNjOypiYWNrZ3JvdW5kLWNvbG9yOiMwNGM7YmFja2dyb3VuZC1pbWFnZTotbW96LWxpbmVhci1ncmFkaWVudCh0b3AsIzA4YywjMDRjKTtiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtZ3JhZGllbnQobGluZWFyLDAgMCwwIDEwMCUsZnJvbSgjMDhjKSx0bygjMDRjKSk7YmFja2dyb3VuZC1pbWFnZTotd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsIzA4YywjMDRjKTtiYWNrZ3JvdW5kLWltYWdlOi1vLWxpbmVhci1ncmFkaWVudCh0b3AsIzA4YywjMDRjKTtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIzA4YywjMDRjKTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDtib3JkZXItY29sb3I6IzA0YyAjMDRjICMwMDJhODA7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsMC4xKSByZ2JhKDAsMCwwLDAuMSkgcmdiYSgwLDAsMCwwLjI1KTtmaWx0ZXI6cHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JzdHI9JyNmZjAwODhjYycsZW5kQ29sb3JzdHI9JyNmZjAwNDRjYycsR3JhZGllbnRUeXBlPTApO2ZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoZW5hYmxlZD1mYWxzZSl9LmJ0bi1wcmltYXJ5OmhvdmVyLC5idG4tcHJpbWFyeTpmb2N1cywuYnRuLXByaW1hcnk6YWN0aXZlLC5idG4tcHJpbWFyeS5hY3RpdmUsLmJ0bi1wcmltYXJ5LmRpc2FibGVkLC5idG4tcHJpbWFyeVtkaXNhYmxlZF17Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiMwNGM7KmJhY2tncm91bmQtY29sb3I6IzAwM2JiM30uYnRuLXByaW1hcnk6YWN0aXZlLC5idG4tcHJpbWFyeS5hY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojMDM5IFw5fS5idG4td2FybmluZ3tjb2xvcjojZmZmO3RleHQtc2hhZG93OjAgLTFweCAwIHJnYmEoMCwwLDAsMC4yNSk7YmFja2dyb3VuZC1jb2xvcjojZmFhNzMyOypiYWNrZ3JvdW5kLWNvbG9yOiNmODk0MDY7YmFja2dyb3VuZC1pbWFnZTotbW96LWxpbmVhci1ncmFkaWVudCh0b3AsI2ZiYjQ1MCwjZjg5NDA2KTtiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtZ3JhZGllbnQobGluZWFyLDAgMCwwIDEwMCUsZnJvbSgjZmJiNDUwKSx0bygjZjg5NDA2KSk7YmFja2dyb3VuZC1pbWFnZTotd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsI2ZiYjQ1MCwjZjg5NDA2KTtiYWNrZ3JvdW5kLWltYWdlOi1vLWxpbmVhci1ncmFkaWVudCh0b3AsI2ZiYjQ1MCwjZjg5NDA2KTtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sI2ZiYjQ1MCwjZjg5NDA2KTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDtib3JkZXItY29sb3I6I2Y4OTQwNiAjZjg5NDA2ICNhZDY3MDQ7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsMC4xKSByZ2JhKDAsMCwwLDAuMSkgcmdiYSgwLDAsMCwwLjI1KTtmaWx0ZXI6cHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JzdHI9JyNmZmZiYjQ1MCcsZW5kQ29sb3JzdHI9JyNmZmY4OTQwNicsR3JhZGllbnRUeXBlPTApO2ZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoZW5hYmxlZD1mYWxzZSl9LmJ0bi13YXJuaW5nOmhvdmVyLC5idG4td2FybmluZzpmb2N1cywuYnRuLXdhcm5pbmc6YWN0aXZlLC5idG4td2FybmluZy5hY3RpdmUsLmJ0bi13YXJuaW5nLmRpc2FibGVkLC5idG4td2FybmluZ1tkaXNhYmxlZF17Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiNmODk0MDY7KmJhY2tncm91bmQtY29sb3I6I2RmODUwNX0uYnRuLXdhcm5pbmc6YWN0aXZlLC5idG4td2FybmluZy5hY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojYzY3NjA1IFw5fS5idG4tZGFuZ2Vye2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6MCAtMXB4IDAgcmdiYSgwLDAsMCwwLjI1KTtiYWNrZ3JvdW5kLWNvbG9yOiNkYTRmNDk7KmJhY2tncm91bmQtY29sb3I6I2JkMzYyZjtiYWNrZ3JvdW5kLWltYWdlOi1tb3otbGluZWFyLWdyYWRpZW50KHRvcCwjZWU1ZjViLCNiZDM2MmYpO2JhY2tncm91bmQtaW1hZ2U6LXdlYmtpdC1ncmFkaWVudChsaW5lYXIsMCAwLDAgMTAwJSxmcm9tKCNlZTVmNWIpLHRvKCNiZDM2MmYpKTtiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRvcCwjZWU1ZjViLCNiZDM2MmYpO2JhY2tncm91bmQtaW1hZ2U6LW8tbGluZWFyLWdyYWRpZW50KHRvcCwjZWU1ZjViLCNiZDM2MmYpO2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwjZWU1ZjViLCNiZDM2MmYpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14O2JvcmRlci1jb2xvcjojYmQzNjJmICNiZDM2MmYgIzgwMjQyMDtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwwLjEpIHJnYmEoMCwwLDAsMC4xKSByZ2JhKDAsMCwwLDAuMjUpO2ZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0nI2ZmZWU1ZjViJyxlbmRDb2xvcnN0cj0nI2ZmYmQzNjJmJyxHcmFkaWVudFR5cGU9MCk7ZmlsdGVyOnByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChlbmFibGVkPWZhbHNlKX0uYnRuLWRhbmdlcjpob3ZlciwuYnRuLWRhbmdlcjpmb2N1cywuYnRuLWRhbmdlcjphY3RpdmUsLmJ0bi1kYW5nZXIuYWN0aXZlLC5idG4tZGFuZ2VyLmRpc2FibGVkLC5idG4tZGFuZ2VyW2Rpc2FibGVkXXtjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6I2JkMzYyZjsqYmFja2dyb3VuZC1jb2xvcjojYTkzMDJhfS5idG4tZGFuZ2VyOmFjdGl2ZSwuYnRuLWRhbmdlci5hY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojOTQyYTI1IFw5fS5idG4tc3VjY2Vzc3tjb2xvcjojZmZmO3RleHQtc2hhZG93OjAgLTFweCAwIHJnYmEoMCwwLDAsMC4yNSk7YmFja2dyb3VuZC1jb2xvcjojNWJiNzViOypiYWNrZ3JvdW5kLWNvbG9yOiM1MWEzNTE7YmFja2dyb3VuZC1pbWFnZTotbW96LWxpbmVhci1ncmFkaWVudCh0b3AsIzYyYzQ2MiwjNTFhMzUxKTtiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtZ3JhZGllbnQobGluZWFyLDAgMCwwIDEwMCUsZnJvbSgjNjJjNDYyKSx0bygjNTFhMzUxKSk7YmFja2dyb3VuZC1pbWFnZTotd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsIzYyYzQ2MiwjNTFhMzUxKTtiYWNrZ3JvdW5kLWltYWdlOi1vLWxpbmVhci1ncmFkaWVudCh0b3AsIzYyYzQ2MiwjNTFhMzUxKTtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIzYyYzQ2MiwjNTFhMzUxKTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDtib3JkZXItY29sb3I6IzUxYTM1MSAjNTFhMzUxICMzODcwMzg7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsMC4xKSByZ2JhKDAsMCwwLDAuMSkgcmdiYSgwLDAsMCwwLjI1KTtmaWx0ZXI6cHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JzdHI9JyNmZjYyYzQ2MicsZW5kQ29sb3JzdHI9JyNmZjUxYTM1MScsR3JhZGllbnRUeXBlPTApO2ZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoZW5hYmxlZD1mYWxzZSl9LmJ0bi1zdWNjZXNzOmhvdmVyLC5idG4tc3VjY2Vzczpmb2N1cywuYnRuLXN1Y2Nlc3M6YWN0aXZlLC5idG4tc3VjY2Vzcy5hY3RpdmUsLmJ0bi1zdWNjZXNzLmRpc2FibGVkLC5idG4tc3VjY2Vzc1tkaXNhYmxlZF17Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiM1MWEzNTE7KmJhY2tncm91bmQtY29sb3I6IzQ5OTI0OX0uYnRuLXN1Y2Nlc3M6YWN0aXZlLC5idG4tc3VjY2Vzcy5hY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojNDA4MTQwIFw5fS5idG4taW5mb3tjb2xvcjojZmZmO3RleHQtc2hhZG93OjAgLTFweCAwIHJnYmEoMCwwLDAsMC4yNSk7YmFja2dyb3VuZC1jb2xvcjojNDlhZmNkOypiYWNrZ3JvdW5kLWNvbG9yOiMyZjk2YjQ7YmFja2dyb3VuZC1pbWFnZTotbW96LWxpbmVhci1ncmFkaWVudCh0b3AsIzViYzBkZSwjMmY5NmI0KTtiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtZ3JhZGllbnQobGluZWFyLDAgMCwwIDEwMCUsZnJvbSgjNWJjMGRlKSx0bygjMmY5NmI0KSk7YmFja2dyb3VuZC1pbWFnZTotd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsIzViYzBkZSwjMmY5NmI0KTtiYWNrZ3JvdW5kLWltYWdlOi1vLWxpbmVhci1ncmFkaWVudCh0b3AsIzViYzBkZSwjMmY5NmI0KTtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIzViYzBkZSwjMmY5NmI0KTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDtib3JkZXItY29sb3I6IzJmOTZiNCAjMmY5NmI0ICMxZjYzNzc7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsMC4xKSByZ2JhKDAsMCwwLDAuMSkgcmdiYSgwLDAsMCwwLjI1KTtmaWx0ZXI6cHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JzdHI9JyNmZjViYzBkZScsZW5kQ29sb3JzdHI9JyNmZjJmOTZiNCcsR3JhZGllbnRUeXBlPTApO2ZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoZW5hYmxlZD1mYWxzZSl9LmJ0bi1pbmZvOmhvdmVyLC5idG4taW5mbzpmb2N1cywuYnRuLWluZm86YWN0aXZlLC5idG4taW5mby5hY3RpdmUsLmJ0bi1pbmZvLmRpc2FibGVkLC5idG4taW5mb1tkaXNhYmxlZF17Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiMyZjk2YjQ7KmJhY2tncm91bmQtY29sb3I6IzJhODVhMH0uYnRuLWluZm86YWN0aXZlLC5idG4taW5mby5hY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojMjQ3NDhjIFw5fS5idG4taW52ZXJzZXtjb2xvcjojZmZmO3RleHQtc2hhZG93OjAgLTFweCAwIHJnYmEoMCwwLDAsMC4yNSk7YmFja2dyb3VuZC1jb2xvcjojMzYzNjM2OypiYWNrZ3JvdW5kLWNvbG9yOiMyMjI7YmFja2dyb3VuZC1pbWFnZTotbW96LWxpbmVhci1ncmFkaWVudCh0b3AsIzQ0NCwjMjIyKTtiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtZ3JhZGllbnQobGluZWFyLDAgMCwwIDEwMCUsZnJvbSgjNDQ0KSx0bygjMjIyKSk7YmFja2dyb3VuZC1pbWFnZTotd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsIzQ0NCwjMjIyKTtiYWNrZ3JvdW5kLWltYWdlOi1vLWxpbmVhci1ncmFkaWVudCh0b3AsIzQ0NCwjMjIyKTtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIzQ0NCwjMjIyKTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDtib3JkZXItY29sb3I6IzIyMiAjMjIyICMwMDA7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsMC4xKSByZ2JhKDAsMCwwLDAuMSkgcmdiYSgwLDAsMCwwLjI1KTtmaWx0ZXI6cHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JzdHI9JyNmZjQ0NDQ0NCcsZW5kQ29sb3JzdHI9JyNmZjIyMjIyMicsR3JhZGllbnRUeXBlPTApO2ZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoZW5hYmxlZD1mYWxzZSl9LmJ0bi1pbnZlcnNlOmhvdmVyLC5idG4taW52ZXJzZTpmb2N1cywuYnRuLWludmVyc2U6YWN0aXZlLC5idG4taW52ZXJzZS5hY3RpdmUsLmJ0bi1pbnZlcnNlLmRpc2FibGVkLC5idG4taW52ZXJzZVtkaXNhYmxlZF17Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiMyMjI7KmJhY2tncm91bmQtY29sb3I6IzE1MTUxNX0uYnRuLWludmVyc2U6YWN0aXZlLC5idG4taW52ZXJzZS5hY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojMDgwODA4IFw5fWJ1dHRvbi5idG4saW5wdXRbdHlwZT0ic3VibWl0Il0uYnRueypwYWRkaW5nLXRvcDozcHg7KnBhZGRpbmctYm90dG9tOjNweH1idXR0b24uYnRuOjotbW96LWZvY3VzLWlubmVyLGlucHV0W3R5cGU9InN1Ym1pdCJdLmJ0bjo6LW1vei1mb2N1cy1pbm5lcntwYWRkaW5nOjA7Ym9yZGVyOjB9YnV0dG9uLmJ0bi5idG4tbGFyZ2UsaW5wdXRbdHlwZT0ic3VibWl0Il0uYnRuLmJ0bi1sYXJnZXsqcGFkZGluZy10b3A6N3B4OypwYWRkaW5nLWJvdHRvbTo3cHh9YnV0dG9uLmJ0bi5idG4tc21hbGwsaW5wdXRbdHlwZT0ic3VibWl0Il0uYnRuLmJ0bi1zbWFsbHsqcGFkZGluZy10b3A6M3B4OypwYWRkaW5nLWJvdHRvbTozcHh9YnV0dG9uLmJ0bi5idG4tbWluaSxpbnB1dFt0eXBlPSJzdWJtaXQiXS5idG4uYnRuLW1pbml7KnBhZGRpbmctdG9wOjFweDsqcGFkZGluZy1ib3R0b206MXB4fS5idG4tbGluaywuYnRuLWxpbms6YWN0aXZlLC5idG4tbGlua1tkaXNhYmxlZF17YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtiYWNrZ3JvdW5kLWltYWdlOm5vbmU7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7LW1vei1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS5idG4tbGlua3tjb2xvcjojMDhjO2N1cnNvcjpwb2ludGVyO2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudDstd2Via2l0LWJvcmRlci1yYWRpdXM6MDstbW96LWJvcmRlci1yYWRpdXM6MDtib3JkZXItcmFkaXVzOjB9LmJ0bi1saW5rOmhvdmVyLC5idG4tbGluazpmb2N1c3tjb2xvcjojMDA1NTgwO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0uYnRuLWxpbmtbZGlzYWJsZWRdOmhvdmVyLC5idG4tbGlua1tkaXNhYmxlZF06Zm9jdXN7Y29sb3I6IzMzMzt0ZXh0LWRlY29yYXRpb246bm9uZX0uYnRuLWdyb3Vwe3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6aW5saW5lLWJsb2NrOypkaXNwbGF5OmlubGluZTsqbWFyZ2luLWxlZnQ6LjNlbTtmb250LXNpemU6MDt3aGl0ZS1zcGFjZTpub3dyYXA7dmVydGljYWwtYWxpZ246bWlkZGxlOyp6b29tOjF9LmJ0bi1ncm91cDpmaXJzdC1jaGlsZHsqbWFyZ2luLWxlZnQ6MH0uYnRuLWdyb3VwKy5idG4tZ3JvdXB7bWFyZ2luLWxlZnQ6NXB4fS5idG4tdG9vbGJhcnttYXJnaW4tdG9wOjEwcHg7bWFyZ2luLWJvdHRvbToxMHB4O2ZvbnQtc2l6ZTowfS5idG4tdG9vbGJhcj4uYnRuKy5idG4sLmJ0bi10b29sYmFyPi5idG4tZ3JvdXArLmJ0biwuYnRuLXRvb2xiYXI+LmJ0bisuYnRuLWdyb3Vwe21hcmdpbi1sZWZ0OjVweH0uYnRuLWdyb3VwPi5idG57cG9zaXRpb246cmVsYXRpdmU7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjA7LW1vei1ib3JkZXItcmFkaXVzOjA7Ym9yZGVyLXJhZGl1czowfS5idG4tZ3JvdXA+LmJ0bisuYnRue21hcmdpbi1sZWZ0Oi0xcHh9LmJ0bi1ncm91cD4uYnRuLC5idG4tZ3JvdXA+LmRyb3Bkb3duLW1lbnUsLmJ0bi1ncm91cD4ucG9wb3Zlcntmb250LXNpemU6MTRweH0uYnRuLWdyb3VwPi5idG4tbWluaXtmb250LXNpemU6MTAuNXB4fS5idG4tZ3JvdXA+LmJ0bi1zbWFsbHtmb250LXNpemU6MTEuOXB4fS5idG4tZ3JvdXA+LmJ0bi1sYXJnZXtmb250LXNpemU6MTcuNXB4fS5idG4tZ3JvdXA+LmJ0bjpmaXJzdC1jaGlsZHttYXJnaW4tbGVmdDowOy13ZWJraXQtYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czo0cHg7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czo0cHg7LXdlYmtpdC1ib3JkZXItdG9wLWxlZnQtcmFkaXVzOjRweDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdDo0cHg7LW1vei1ib3JkZXItcmFkaXVzLXRvcGxlZnQ6NHB4fS5idG4tZ3JvdXA+LmJ0bjpsYXN0LWNoaWxkLC5idG4tZ3JvdXA+LmRyb3Bkb3duLXRvZ2dsZXstd2Via2l0LWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOjRweDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czo0cHg7LXdlYmtpdC1ib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czo0cHg7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6NHB4Oy1tb3otYm9yZGVyLXJhZGl1cy10b3ByaWdodDo0cHg7LW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbXJpZ2h0OjRweH0uYnRuLWdyb3VwPi5idG4ubGFyZ2U6Zmlyc3QtY2hpbGR7bWFyZ2luLWxlZnQ6MDstd2Via2l0LWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6NnB4O2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6NnB4Oy13ZWJraXQtYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czo2cHg7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czo2cHg7LW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbWxlZnQ6NnB4Oy1tb3otYm9yZGVyLXJhZGl1cy10b3BsZWZ0OjZweH0uYnRuLWdyb3VwPi5idG4ubGFyZ2U6bGFzdC1jaGlsZCwuYnRuLWdyb3VwPi5sYXJnZS5kcm9wZG93bi10b2dnbGV7LXdlYmtpdC1ib3JkZXItdG9wLXJpZ2h0LXJhZGl1czo2cHg7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6NnB4Oy13ZWJraXQtYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6NnB4O2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjZweDstbW96LWJvcmRlci1yYWRpdXMtdG9wcmlnaHQ6NnB4Oy1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodDo2cHh9LmJ0bi1ncm91cD4uYnRuOmhvdmVyLC5idG4tZ3JvdXA+LmJ0bjpmb2N1cywuYnRuLWdyb3VwPi5idG46YWN0aXZlLC5idG4tZ3JvdXA+LmJ0bi5hY3RpdmV7ei1pbmRleDoyfS5idG4tZ3JvdXAgLmRyb3Bkb3duLXRvZ2dsZTphY3RpdmUsLmJ0bi1ncm91cC5vcGVuIC5kcm9wZG93bi10b2dnbGV7b3V0bGluZTowfS5idG4tZ3JvdXA+LmJ0bisuZHJvcGRvd24tdG9nZ2xleypwYWRkaW5nLXRvcDo1cHg7cGFkZGluZy1yaWdodDo4cHg7KnBhZGRpbmctYm90dG9tOjVweDtwYWRkaW5nLWxlZnQ6OHB4Oy13ZWJraXQtYm94LXNoYWRvdzppbnNldCAxcHggMCAwIHJnYmEoMjU1LDI1NSwyNTUsMC4xMjUpLGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsMjU1LDI1NSwwLjIpLDAgMXB4IDJweCByZ2JhKDAsMCwwLDAuMDUpOy1tb3otYm94LXNoYWRvdzppbnNldCAxcHggMCAwIHJnYmEoMjU1LDI1NSwyNTUsMC4xMjUpLGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsMjU1LDI1NSwwLjIpLDAgMXB4IDJweCByZ2JhKDAsMCwwLDAuMDUpO2JveC1zaGFkb3c6aW5zZXQgMXB4IDAgMCByZ2JhKDI1NSwyNTUsMjU1LDAuMTI1KSxpbnNldCAwIDFweCAwIHJnYmEoMjU1LDI1NSwyNTUsMC4yKSwwIDFweCAycHggcmdiYSgwLDAsMCwwLjA1KX0uYnRuLWdyb3VwPi5idG4tbWluaSsuZHJvcGRvd24tdG9nZ2xleypwYWRkaW5nLXRvcDoycHg7cGFkZGluZy1yaWdodDo1cHg7KnBhZGRpbmctYm90dG9tOjJweDtwYWRkaW5nLWxlZnQ6NXB4fS5idG4tZ3JvdXA+LmJ0bi1zbWFsbCsuZHJvcGRvd24tdG9nZ2xleypwYWRkaW5nLXRvcDo1cHg7KnBhZGRpbmctYm90dG9tOjRweH0uYnRuLWdyb3VwPi5idG4tbGFyZ2UrLmRyb3Bkb3duLXRvZ2dsZXsqcGFkZGluZy10b3A6N3B4O3BhZGRpbmctcmlnaHQ6MTJweDsqcGFkZGluZy1ib3R0b206N3B4O3BhZGRpbmctbGVmdDoxMnB4fS5idG4tZ3JvdXAub3BlbiAuZHJvcGRvd24tdG9nZ2xle2JhY2tncm91bmQtaW1hZ2U6bm9uZTstd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgMCAycHggNHB4IHJnYmEoMCwwLDAsMC4xNSksMCAxcHggMnB4IHJnYmEoMCwwLDAsMC4wNSk7LW1vei1ib3gtc2hhZG93Omluc2V0IDAgMnB4IDRweCByZ2JhKDAsMCwwLDAuMTUpLDAgMXB4IDJweCByZ2JhKDAsMCwwLDAuMDUpO2JveC1zaGFkb3c6aW5zZXQgMCAycHggNHB4IHJnYmEoMCwwLDAsMC4xNSksMCAxcHggMnB4IHJnYmEoMCwwLDAsMC4wNSl9LmJ0bi1ncm91cC5vcGVuIC5idG4uZHJvcGRvd24tdG9nZ2xle2JhY2tncm91bmQtY29sb3I6I2U2ZTZlNn0uYnRuLWdyb3VwLm9wZW4gLmJ0bi1wcmltYXJ5LmRyb3Bkb3duLXRvZ2dsZXtiYWNrZ3JvdW5kLWNvbG9yOiMwNGN9LmJ0bi1ncm91cC5vcGVuIC5idG4td2FybmluZy5kcm9wZG93bi10b2dnbGV7YmFja2dyb3VuZC1jb2xvcjojZjg5NDA2fS5idG4tZ3JvdXAub3BlbiAuYnRuLWRhbmdlci5kcm9wZG93bi10b2dnbGV7YmFja2dyb3VuZC1jb2xvcjojYmQzNjJmfS5idG4tZ3JvdXAub3BlbiAuYnRuLXN1Y2Nlc3MuZHJvcGRvd24tdG9nZ2xle2JhY2tncm91bmQtY29sb3I6IzUxYTM1MX0uYnRuLWdyb3VwLm9wZW4gLmJ0bi1pbmZvLmRyb3Bkb3duLXRvZ2dsZXtiYWNrZ3JvdW5kLWNvbG9yOiMyZjk2YjR9LmJ0bi1ncm91cC5vcGVuIC5idG4taW52ZXJzZS5kcm9wZG93bi10b2dnbGV7YmFja2dyb3VuZC1jb2xvcjojMjIyfS5idG4gLmNhcmV0e21hcmdpbi10b3A6OHB4O21hcmdpbi1sZWZ0OjB9LmJ0bi1sYXJnZSAuY2FyZXR7bWFyZ2luLXRvcDo2cHh9LmJ0bi1sYXJnZSAuY2FyZXR7Ym9yZGVyLXRvcC13aWR0aDo1cHg7Ym9yZGVyLXJpZ2h0LXdpZHRoOjVweDtib3JkZXItbGVmdC13aWR0aDo1cHh9LmJ0bi1taW5pIC5jYXJldCwuYnRuLXNtYWxsIC5jYXJldHttYXJnaW4tdG9wOjhweH0uZHJvcHVwIC5idG4tbGFyZ2UgLmNhcmV0e2JvcmRlci1ib3R0b20td2lkdGg6NXB4fS5idG4tcHJpbWFyeSAuY2FyZXQsLmJ0bi13YXJuaW5nIC5jYXJldCwuYnRuLWRhbmdlciAuY2FyZXQsLmJ0bi1pbmZvIC5jYXJldCwuYnRuLXN1Y2Nlc3MgLmNhcmV0LC5idG4taW52ZXJzZSAuY2FyZXR7Ym9yZGVyLXRvcC1jb2xvcjojZmZmO2JvcmRlci1ib3R0b20tY29sb3I6I2ZmZn0uYnRuLWdyb3VwLXZlcnRpY2Fse2Rpc3BsYXk6aW5saW5lLWJsb2NrOypkaXNwbGF5OmlubGluZTsqem9vbToxfS5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bntkaXNwbGF5OmJsb2NrO2Zsb2F0Om5vbmU7bWF4LXdpZHRoOjEwMCU7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjA7LW1vei1ib3JkZXItcmFkaXVzOjA7Ym9yZGVyLXJhZGl1czowfS5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bisuYnRue21hcmdpbi10b3A6LTFweDttYXJnaW4tbGVmdDowfS5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bjpmaXJzdC1jaGlsZHstd2Via2l0LWJvcmRlci1yYWRpdXM6NHB4IDRweCAwIDA7LW1vei1ib3JkZXItcmFkaXVzOjRweCA0cHggMCAwO2JvcmRlci1yYWRpdXM6NHB4IDRweCAwIDB9LmJ0bi1ncm91cC12ZXJ0aWNhbD4uYnRuOmxhc3QtY2hpbGR7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjAgMCA0cHggNHB4Oy1tb3otYm9yZGVyLXJhZGl1czowIDAgNHB4IDRweDtib3JkZXItcmFkaXVzOjAgMCA0cHggNHB4fS5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bi1sYXJnZTpmaXJzdC1jaGlsZHstd2Via2l0LWJvcmRlci1yYWRpdXM6NnB4IDZweCAwIDA7LW1vei1ib3JkZXItcmFkaXVzOjZweCA2cHggMCAwO2JvcmRlci1yYWRpdXM6NnB4IDZweCAwIDB9LmJ0bi1ncm91cC12ZXJ0aWNhbD4uYnRuLWxhcmdlOmxhc3QtY2hpbGR7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjAgMCA2cHggNnB4Oy1tb3otYm9yZGVyLXJhZGl1czowIDAgNnB4IDZweDtib3JkZXItcmFkaXVzOjAgMCA2cHggNnB4fS5hbGVydHtwYWRkaW5nOjhweCAzNXB4IDhweCAxNHB4O21hcmdpbi1ib3R0b206MjBweDt0ZXh0LXNoYWRvdzowIDFweCAwIHJnYmEoMjU1LDI1NSwyNTUsMC41KTtiYWNrZ3JvdW5kLWNvbG9yOiNmY2Y4ZTM7Ym9yZGVyOjFweCBzb2xpZCAjZmJlZWQ1Oy13ZWJraXQtYm9yZGVyLXJhZGl1czo0cHg7LW1vei1ib3JkZXItcmFkaXVzOjRweDtib3JkZXItcmFkaXVzOjRweH0uYWxlcnQsLmFsZXJ0IGg0e2NvbG9yOiNjMDk4NTN9LmFsZXJ0IGg0e21hcmdpbjowfS5hbGVydCAuY2xvc2V7cG9zaXRpb246cmVsYXRpdmU7dG9wOi0ycHg7cmlnaHQ6LTIxcHg7bGluZS1oZWlnaHQ6MjBweH0uYWxlcnQtc3VjY2Vzc3tjb2xvcjojNDY4ODQ3O2JhY2tncm91bmQtY29sb3I6I2RmZjBkODtib3JkZXItY29sb3I6I2Q2ZTljNn0uYWxlcnQtc3VjY2VzcyBoNHtjb2xvcjojNDY4ODQ3fS5hbGVydC1kYW5nZXIsLmFsZXJ0LWVycm9ye2NvbG9yOiNiOTRhNDg7YmFja2dyb3VuZC1jb2xvcjojZjJkZWRlO2JvcmRlci1jb2xvcjojZWVkM2Q3fS5hbGVydC1kYW5nZXIgaDQsLmFsZXJ0LWVycm9yIGg0e2NvbG9yOiNiOTRhNDh9LmFsZXJ0LWluZm97Y29sb3I6IzNhODdhZDtiYWNrZ3JvdW5kLWNvbG9yOiNkOWVkZjc7Ym9yZGVyLWNvbG9yOiNiY2U4ZjF9LmFsZXJ0LWluZm8gaDR7Y29sb3I6IzNhODdhZH0uYWxlcnQtYmxvY2t7cGFkZGluZy10b3A6MTRweDtwYWRkaW5nLWJvdHRvbToxNHB4fS5hbGVydC1ibG9jaz5wLC5hbGVydC1ibG9jaz51bHttYXJnaW4tYm90dG9tOjB9LmFsZXJ0LWJsb2NrIHArcHttYXJnaW4tdG9wOjVweH0ubmF2e21hcmdpbi1ib3R0b206MjBweDttYXJnaW4tbGVmdDowO2xpc3Qtc3R5bGU6bm9uZX0ubmF2PmxpPmF7ZGlzcGxheTpibG9ja30ubmF2PmxpPmE6aG92ZXIsLm5hdj5saT5hOmZvY3Vze3RleHQtZGVjb3JhdGlvbjpub25lO2JhY2tncm91bmQtY29sb3I6I2VlZX0ubmF2PmxpPmE+aW1ne21heC13aWR0aDpub25lfS5uYXY+LnB1bGwtcmlnaHR7ZmxvYXQ6cmlnaHR9Lm5hdi1oZWFkZXJ7ZGlzcGxheTpibG9jaztwYWRkaW5nOjNweCAxNXB4O2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OmJvbGQ7bGluZS1oZWlnaHQ6MjBweDtjb2xvcjojOTk5O3RleHQtc2hhZG93OjAgMXB4IDAgcmdiYSgyNTUsMjU1LDI1NSwwLjUpO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZX0ubmF2IGxpKy5uYXYtaGVhZGVye21hcmdpbi10b3A6OXB4fS5uYXYtbGlzdHtwYWRkaW5nLXJpZ2h0OjE1cHg7cGFkZGluZy1sZWZ0OjE1cHg7bWFyZ2luLWJvdHRvbTowfS5uYXYtbGlzdD5saT5hLC5uYXYtbGlzdCAubmF2LWhlYWRlcnttYXJnaW4tcmlnaHQ6LTE1cHg7bWFyZ2luLWxlZnQ6LTE1cHg7dGV4dC1zaGFkb3c6MCAxcHggMCByZ2JhKDI1NSwyNTUsMjU1LDAuNSl9Lm5hdi1saXN0PmxpPmF7cGFkZGluZzozcHggMTVweH0ubmF2LWxpc3Q+LmFjdGl2ZT5hLC5uYXYtbGlzdD4uYWN0aXZlPmE6aG92ZXIsLm5hdi1saXN0Pi5hY3RpdmU+YTpmb2N1c3tjb2xvcjojZmZmO3RleHQtc2hhZG93OjAgLTFweCAwIHJnYmEoMCwwLDAsMC4yKTtiYWNrZ3JvdW5kLWNvbG9yOiMwOGN9Lm5hdi1saXN0IFtjbGFzc149Imljb24tIl0sLm5hdi1saXN0IFtjbGFzcyo9IiBpY29uLSJde21hcmdpbi1yaWdodDoycHh9Lm5hdi1saXN0IC5kaXZpZGVyeyp3aWR0aDoxMDAlO2hlaWdodDoxcHg7bWFyZ2luOjlweCAxcHg7Km1hcmdpbjotNXB4IDAgNXB4O292ZXJmbG93OmhpZGRlbjtiYWNrZ3JvdW5kLWNvbG9yOiNlNWU1ZTU7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2ZmZn0ubmF2LXRhYnMsLm5hdi1waWxsc3sqem9vbToxfS5uYXYtdGFiczpiZWZvcmUsLm5hdi1waWxsczpiZWZvcmUsLm5hdi10YWJzOmFmdGVyLC5uYXYtcGlsbHM6YWZ0ZXJ7ZGlzcGxheTp0YWJsZTtsaW5lLWhlaWdodDowO2NvbnRlbnQ6IiJ9Lm5hdi10YWJzOmFmdGVyLC5uYXYtcGlsbHM6YWZ0ZXJ7Y2xlYXI6Ym90aH0ubmF2LXRhYnM+bGksLm5hdi1waWxscz5saXtmbG9hdDpsZWZ0fS5uYXYtdGFicz5saT5hLC5uYXYtcGlsbHM+bGk+YXtwYWRkaW5nLXJpZ2h0OjEycHg7cGFkZGluZy1sZWZ0OjEycHg7bWFyZ2luLXJpZ2h0OjJweDtsaW5lLWhlaWdodDoxNHB4fS5uYXYtdGFic3tib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZGRkfS5uYXYtdGFicz5saXttYXJnaW4tYm90dG9tOi0xcHh9Lm5hdi10YWJzPmxpPmF7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweDtsaW5lLWhlaWdodDoyMHB4O2JvcmRlcjoxcHggc29saWQgdHJhbnNwYXJlbnQ7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjRweCA0cHggMCAwOy1tb3otYm9yZGVyLXJhZGl1czo0cHggNHB4IDAgMDtib3JkZXItcmFkaXVzOjRweCA0cHggMCAwfS5uYXYtdGFicz5saT5hOmhvdmVyLC5uYXYtdGFicz5saT5hOmZvY3Vze2JvcmRlci1jb2xvcjojZWVlICNlZWUgI2RkZH0ubmF2LXRhYnM+LmFjdGl2ZT5hLC5uYXYtdGFicz4uYWN0aXZlPmE6aG92ZXIsLm5hdi10YWJzPi5hY3RpdmU+YTpmb2N1c3tjb2xvcjojNTU1O2N1cnNvcjpkZWZhdWx0O2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXI6MXB4IHNvbGlkICNkZGQ7Ym9yZGVyLWJvdHRvbS1jb2xvcjp0cmFuc3BhcmVudH0ubmF2LXBpbGxzPmxpPmF7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweDttYXJnaW4tdG9wOjJweDttYXJnaW4tYm90dG9tOjJweDstd2Via2l0LWJvcmRlci1yYWRpdXM6NXB4Oy1tb3otYm9yZGVyLXJhZGl1czo1cHg7Ym9yZGVyLXJhZGl1czo1cHh9Lm5hdi1waWxscz4uYWN0aXZlPmEsLm5hdi1waWxscz4uYWN0aXZlPmE6aG92ZXIsLm5hdi1waWxscz4uYWN0aXZlPmE6Zm9jdXN7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiMwOGN9Lm5hdi1zdGFja2VkPmxpe2Zsb2F0Om5vbmV9Lm5hdi1zdGFja2VkPmxpPmF7bWFyZ2luLXJpZ2h0OjB9Lm5hdi10YWJzLm5hdi1zdGFja2Vke2JvcmRlci1ib3R0b206MH0ubmF2LXRhYnMubmF2LXN0YWNrZWQ+bGk+YXtib3JkZXI6MXB4IHNvbGlkICNkZGQ7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjA7LW1vei1ib3JkZXItcmFkaXVzOjA7Ym9yZGVyLXJhZGl1czowfS5uYXYtdGFicy5uYXYtc3RhY2tlZD5saTpmaXJzdC1jaGlsZD5hey13ZWJraXQtYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6NHB4O2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjRweDstd2Via2l0LWJvcmRlci10b3AtbGVmdC1yYWRpdXM6NHB4O2JvcmRlci10b3AtbGVmdC1yYWRpdXM6NHB4Oy1tb3otYm9yZGVyLXJhZGl1cy10b3ByaWdodDo0cHg7LW1vei1ib3JkZXItcmFkaXVzLXRvcGxlZnQ6NHB4fS5uYXYtdGFicy5uYXYtc3RhY2tlZD5saTpsYXN0LWNoaWxkPmF7LXdlYmtpdC1ib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czo0cHg7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6NHB4Oy13ZWJraXQtYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czo0cHg7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czo0cHg7LW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbXJpZ2h0OjRweDstbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdDo0cHh9Lm5hdi10YWJzLm5hdi1zdGFja2VkPmxpPmE6aG92ZXIsLm5hdi10YWJzLm5hdi1zdGFja2VkPmxpPmE6Zm9jdXN7ei1pbmRleDoyO2JvcmRlci1jb2xvcjojZGRkfS5uYXYtcGlsbHMubmF2LXN0YWNrZWQ+bGk+YXttYXJnaW4tYm90dG9tOjNweH0ubmF2LXBpbGxzLm5hdi1zdGFja2VkPmxpOmxhc3QtY2hpbGQ+YXttYXJnaW4tYm90dG9tOjFweH0ubmF2LXRhYnMgLmRyb3Bkb3duLW1lbnV7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjAgMCA2cHggNnB4Oy1tb3otYm9yZGVyLXJhZGl1czowIDAgNnB4IDZweDtib3JkZXItcmFkaXVzOjAgMCA2cHggNnB4fS5uYXYtcGlsbHMgLmRyb3Bkb3duLW1lbnV7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjZweDstbW96LWJvcmRlci1yYWRpdXM6NnB4O2JvcmRlci1yYWRpdXM6NnB4fS5uYXYgLmRyb3Bkb3duLXRvZ2dsZSAuY2FyZXR7bWFyZ2luLXRvcDo2cHg7Ym9yZGVyLXRvcC1jb2xvcjojMDhjO2JvcmRlci1ib3R0b20tY29sb3I6IzA4Y30ubmF2IC5kcm9wZG93bi10b2dnbGU6aG92ZXIgLmNhcmV0LC5uYXYgLmRyb3Bkb3duLXRvZ2dsZTpmb2N1cyAuY2FyZXR7Ym9yZGVyLXRvcC1jb2xvcjojMDA1NTgwO2JvcmRlci1ib3R0b20tY29sb3I6IzAwNTU4MH0ubmF2LXRhYnMgLmRyb3Bkb3duLXRvZ2dsZSAuY2FyZXR7bWFyZ2luLXRvcDo4cHh9Lm5hdiAuYWN0aXZlIC5kcm9wZG93bi10b2dnbGUgLmNhcmV0e2JvcmRlci10b3AtY29sb3I6I2ZmZjtib3JkZXItYm90dG9tLWNvbG9yOiNmZmZ9Lm5hdi10YWJzIC5hY3RpdmUgLmRyb3Bkb3duLXRvZ2dsZSAuY2FyZXR7Ym9yZGVyLXRvcC1jb2xvcjojNTU1O2JvcmRlci1ib3R0b20tY29sb3I6IzU1NX0ubmF2Pi5kcm9wZG93bi5hY3RpdmU+YTpob3ZlciwubmF2Pi5kcm9wZG93bi5hY3RpdmU+YTpmb2N1c3tjdXJzb3I6cG9pbnRlcn0ubmF2LXRhYnMgLm9wZW4gLmRyb3Bkb3duLXRvZ2dsZSwubmF2LXBpbGxzIC5vcGVuIC5kcm9wZG93bi10b2dnbGUsLm5hdj5saS5kcm9wZG93bi5vcGVuLmFjdGl2ZT5hOmhvdmVyLC5uYXY+bGkuZHJvcGRvd24ub3Blbi5hY3RpdmU+YTpmb2N1c3tjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6Izk5OTtib3JkZXItY29sb3I6Izk5OX0ubmF2IGxpLmRyb3Bkb3duLm9wZW4gLmNhcmV0LC5uYXYgbGkuZHJvcGRvd24ub3Blbi5hY3RpdmUgLmNhcmV0LC5uYXYgbGkuZHJvcGRvd24ub3BlbiBhOmhvdmVyIC5jYXJldCwubmF2IGxpLmRyb3Bkb3duLm9wZW4gYTpmb2N1cyAuY2FyZXR7Ym9yZGVyLXRvcC1jb2xvcjojZmZmO2JvcmRlci1ib3R0b20tY29sb3I6I2ZmZjtvcGFjaXR5OjE7ZmlsdGVyOmFscGhhKG9wYWNpdHk9MTAwKX0udGFicy1zdGFja2VkIC5vcGVuPmE6aG92ZXIsLnRhYnMtc3RhY2tlZCAub3Blbj5hOmZvY3Vze2JvcmRlci1jb2xvcjojOTk5fS50YWJiYWJsZXsqem9vbToxfS50YWJiYWJsZTpiZWZvcmUsLnRhYmJhYmxlOmFmdGVye2Rpc3BsYXk6dGFibGU7bGluZS1oZWlnaHQ6MDtjb250ZW50OiIifS50YWJiYWJsZTphZnRlcntjbGVhcjpib3RofS50YWItY29udGVudHtvdmVyZmxvdzphdXRvfS50YWJzLWJlbG93Pi5uYXYtdGFicywudGFicy1yaWdodD4ubmF2LXRhYnMsLnRhYnMtbGVmdD4ubmF2LXRhYnN7Ym9yZGVyLWJvdHRvbTowfS50YWItY29udGVudD4udGFiLXBhbmUsLnBpbGwtY29udGVudD4ucGlsbC1wYW5le2Rpc3BsYXk6bm9uZX0udGFiLWNvbnRlbnQ+LmFjdGl2ZSwucGlsbC1jb250ZW50Pi5hY3RpdmV7ZGlzcGxheTpibG9ja30udGFicy1iZWxvdz4ubmF2LXRhYnN7Ym9yZGVyLXRvcDoxcHggc29saWQgI2RkZH0udGFicy1iZWxvdz4ubmF2LXRhYnM+bGl7bWFyZ2luLXRvcDotMXB4O21hcmdpbi1ib3R0b206MH0udGFicy1iZWxvdz4ubmF2LXRhYnM+bGk+YXstd2Via2l0LWJvcmRlci1yYWRpdXM6MCAwIDRweCA0cHg7LW1vei1ib3JkZXItcmFkaXVzOjAgMCA0cHggNHB4O2JvcmRlci1yYWRpdXM6MCAwIDRweCA0cHh9LnRhYnMtYmVsb3c+Lm5hdi10YWJzPmxpPmE6aG92ZXIsLnRhYnMtYmVsb3c+Lm5hdi10YWJzPmxpPmE6Zm9jdXN7Ym9yZGVyLXRvcC1jb2xvcjojZGRkO2JvcmRlci1ib3R0b20tY29sb3I6dHJhbnNwYXJlbnR9LnRhYnMtYmVsb3c+Lm5hdi10YWJzPi5hY3RpdmU+YSwudGFicy1iZWxvdz4ubmF2LXRhYnM+LmFjdGl2ZT5hOmhvdmVyLC50YWJzLWJlbG93Pi5uYXYtdGFicz4uYWN0aXZlPmE6Zm9jdXN7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50ICNkZGQgI2RkZCAjZGRkfS50YWJzLWxlZnQ+Lm5hdi10YWJzPmxpLC50YWJzLXJpZ2h0Pi5uYXYtdGFicz5saXtmbG9hdDpub25lfS50YWJzLWxlZnQ+Lm5hdi10YWJzPmxpPmEsLnRhYnMtcmlnaHQ+Lm5hdi10YWJzPmxpPmF7bWluLXdpZHRoOjc0cHg7bWFyZ2luLXJpZ2h0OjA7bWFyZ2luLWJvdHRvbTozcHh9LnRhYnMtbGVmdD4ubmF2LXRhYnN7ZmxvYXQ6bGVmdDttYXJnaW4tcmlnaHQ6MTlweDtib3JkZXItcmlnaHQ6MXB4IHNvbGlkICNkZGR9LnRhYnMtbGVmdD4ubmF2LXRhYnM+bGk+YXttYXJnaW4tcmlnaHQ6LTFweDstd2Via2l0LWJvcmRlci1yYWRpdXM6NHB4IDAgMCA0cHg7LW1vei1ib3JkZXItcmFkaXVzOjRweCAwIDAgNHB4O2JvcmRlci1yYWRpdXM6NHB4IDAgMCA0cHh9LnRhYnMtbGVmdD4ubmF2LXRhYnM+bGk+YTpob3ZlciwudGFicy1sZWZ0Pi5uYXYtdGFicz5saT5hOmZvY3Vze2JvcmRlci1jb2xvcjojZWVlICNkZGQgI2VlZSAjZWVlfS50YWJzLWxlZnQ+Lm5hdi10YWJzIC5hY3RpdmU+YSwudGFicy1sZWZ0Pi5uYXYtdGFicyAuYWN0aXZlPmE6aG92ZXIsLnRhYnMtbGVmdD4ubmF2LXRhYnMgLmFjdGl2ZT5hOmZvY3Vze2JvcmRlci1jb2xvcjojZGRkIHRyYW5zcGFyZW50ICNkZGQgI2RkZDsqYm9yZGVyLXJpZ2h0LWNvbG9yOiNmZmZ9LnRhYnMtcmlnaHQ+Lm5hdi10YWJze2Zsb2F0OnJpZ2h0O21hcmdpbi1sZWZ0OjE5cHg7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkICNkZGR9LnRhYnMtcmlnaHQ+Lm5hdi10YWJzPmxpPmF7bWFyZ2luLWxlZnQ6LTFweDstd2Via2l0LWJvcmRlci1yYWRpdXM6MCA0cHggNHB4IDA7LW1vei1ib3JkZXItcmFkaXVzOjAgNHB4IDRweCAwO2JvcmRlci1yYWRpdXM6MCA0cHggNHB4IDB9LnRhYnMtcmlnaHQ+Lm5hdi10YWJzPmxpPmE6aG92ZXIsLnRhYnMtcmlnaHQ+Lm5hdi10YWJzPmxpPmE6Zm9jdXN7Ym9yZGVyLWNvbG9yOiNlZWUgI2VlZSAjZWVlICNkZGR9LnRhYnMtcmlnaHQ+Lm5hdi10YWJzIC5hY3RpdmU+YSwudGFicy1yaWdodD4ubmF2LXRhYnMgLmFjdGl2ZT5hOmhvdmVyLC50YWJzLXJpZ2h0Pi5uYXYtdGFicyAuYWN0aXZlPmE6Zm9jdXN7Ym9yZGVyLWNvbG9yOiNkZGQgI2RkZCAjZGRkIHRyYW5zcGFyZW50Oypib3JkZXItbGVmdC1jb2xvcjojZmZmfS5uYXY+LmRpc2FibGVkPmF7Y29sb3I6Izk5OX0ubmF2Pi5kaXNhYmxlZD5hOmhvdmVyLC5uYXY+LmRpc2FibGVkPmE6Zm9jdXN7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubmF2YmFyeypwb3NpdGlvbjpyZWxhdGl2ZTsqei1pbmRleDoyO21hcmdpbi1ib3R0b206MjBweDtvdmVyZmxvdzp2aXNpYmxlfS5uYXZiYXItaW5uZXJ7bWluLWhlaWdodDo0MHB4O3BhZGRpbmctcmlnaHQ6MjBweDtwYWRkaW5nLWxlZnQ6MjBweDtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmE7YmFja2dyb3VuZC1pbWFnZTotbW96LWxpbmVhci1ncmFkaWVudCh0b3AsI2ZmZiwjZjJmMmYyKTtiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtZ3JhZGllbnQobGluZWFyLDAgMCwwIDEwMCUsZnJvbSgjZmZmKSx0bygjZjJmMmYyKSk7YmFja2dyb3VuZC1pbWFnZTotd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsI2ZmZiwjZjJmMmYyKTtiYWNrZ3JvdW5kLWltYWdlOi1vLWxpbmVhci1ncmFkaWVudCh0b3AsI2ZmZiwjZjJmMmYyKTtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sI2ZmZiwjZjJmMmYyKTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDtib3JkZXI6MXB4IHNvbGlkICNkNGQ0ZDQ7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXM6NHB4O2JvcmRlci1yYWRpdXM6NHB4O2ZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0nI2ZmZmZmZmZmJyxlbmRDb2xvcnN0cj0nI2ZmZjJmMmYyJyxHcmFkaWVudFR5cGU9MCk7Knpvb206MTstd2Via2l0LWJveC1zaGFkb3c6MCAxcHggNHB4IHJnYmEoMCwwLDAsMC4wNjUpOy1tb3otYm94LXNoYWRvdzowIDFweCA0cHggcmdiYSgwLDAsMCwwLjA2NSk7Ym94LXNoYWRvdzowIDFweCA0cHggcmdiYSgwLDAsMCwwLjA2NSl9Lm5hdmJhci1pbm5lcjpiZWZvcmUsLm5hdmJhci1pbm5lcjphZnRlcntkaXNwbGF5OnRhYmxlO2xpbmUtaGVpZ2h0OjA7Y29udGVudDoiIn0ubmF2YmFyLWlubmVyOmFmdGVye2NsZWFyOmJvdGh9Lm5hdmJhciAuY29udGFpbmVye3dpZHRoOmF1dG99Lm5hdi1jb2xsYXBzZS5jb2xsYXBzZXtoZWlnaHQ6YXV0bztvdmVyZmxvdzp2aXNpYmxlfS5uYXZiYXIgLmJyYW5ke2Rpc3BsYXk6YmxvY2s7ZmxvYXQ6bGVmdDtwYWRkaW5nOjEwcHggMjBweCAxMHB4O21hcmdpbi1sZWZ0Oi0yMHB4O2ZvbnQtc2l6ZToyMHB4O2ZvbnQtd2VpZ2h0OjIwMDtjb2xvcjojNzc3O3RleHQtc2hhZG93OjAgMXB4IDAgI2ZmZn0ubmF2YmFyIC5icmFuZDpob3ZlciwubmF2YmFyIC5icmFuZDpmb2N1c3t0ZXh0LWRlY29yYXRpb246bm9uZX0ubmF2YmFyLXRleHR7bWFyZ2luLWJvdHRvbTowO2xpbmUtaGVpZ2h0OjQwcHg7Y29sb3I6Izc3N30ubmF2YmFyLWxpbmt7Y29sb3I6Izc3N30ubmF2YmFyLWxpbms6aG92ZXIsLm5hdmJhci1saW5rOmZvY3Vze2NvbG9yOiMzMzN9Lm5hdmJhciAuZGl2aWRlci12ZXJ0aWNhbHtoZWlnaHQ6NDBweDttYXJnaW46MCA5cHg7Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjZmZmO2JvcmRlci1sZWZ0OjFweCBzb2xpZCAjZjJmMmYyfS5uYXZiYXIgLmJ0biwubmF2YmFyIC5idG4tZ3JvdXB7bWFyZ2luLXRvcDo1cHh9Lm5hdmJhciAuYnRuLWdyb3VwIC5idG4sLm5hdmJhciAuaW5wdXQtcHJlcGVuZCAuYnRuLC5uYXZiYXIgLmlucHV0LWFwcGVuZCAuYnRuLC5uYXZiYXIgLmlucHV0LXByZXBlbmQgLmJ0bi1ncm91cCwubmF2YmFyIC5pbnB1dC1hcHBlbmQgLmJ0bi1ncm91cHttYXJnaW4tdG9wOjB9Lm5hdmJhci1mb3Jte21hcmdpbi1ib3R0b206MDsqem9vbToxfS5uYXZiYXItZm9ybTpiZWZvcmUsLm5hdmJhci1mb3JtOmFmdGVye2Rpc3BsYXk6dGFibGU7bGluZS1oZWlnaHQ6MDtjb250ZW50OiIifS5uYXZiYXItZm9ybTphZnRlcntjbGVhcjpib3RofS5uYXZiYXItZm9ybSBpbnB1dCwubmF2YmFyLWZvcm0gc2VsZWN0LC5uYXZiYXItZm9ybSAucmFkaW8sLm5hdmJhci1mb3JtIC5jaGVja2JveHttYXJnaW4tdG9wOjVweH0ubmF2YmFyLWZvcm0gaW5wdXQsLm5hdmJhci1mb3JtIHNlbGVjdCwubmF2YmFyLWZvcm0gLmJ0bntkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tYm90dG9tOjB9Lm5hdmJhci1mb3JtIGlucHV0W3R5cGU9ImltYWdlIl0sLm5hdmJhci1mb3JtIGlucHV0W3R5cGU9ImNoZWNrYm94Il0sLm5hdmJhci1mb3JtIGlucHV0W3R5cGU9InJhZGlvIl17bWFyZ2luLXRvcDozcHh9Lm5hdmJhci1mb3JtIC5pbnB1dC1hcHBlbmQsLm5hdmJhci1mb3JtIC5pbnB1dC1wcmVwZW5ke21hcmdpbi10b3A6NXB4O3doaXRlLXNwYWNlOm5vd3JhcH0ubmF2YmFyLWZvcm0gLmlucHV0LWFwcGVuZCBpbnB1dCwubmF2YmFyLWZvcm0gLmlucHV0LXByZXBlbmQgaW5wdXR7bWFyZ2luLXRvcDowfS5uYXZiYXItc2VhcmNoe3Bvc2l0aW9uOnJlbGF0aXZlO2Zsb2F0OmxlZnQ7bWFyZ2luLXRvcDo1cHg7bWFyZ2luLWJvdHRvbTowfS5uYXZiYXItc2VhcmNoIC5zZWFyY2gtcXVlcnl7cGFkZGluZzo0cHggMTRweDttYXJnaW4tYm90dG9tOjA7Zm9udC1mYW1pbHk6IkhlbHZldGljYSBOZXVlIixIZWx2ZXRpY2EsQXJpYWwsc2Fucy1zZXJpZjtmb250LXNpemU6MTNweDtmb250LXdlaWdodDpub3JtYWw7bGluZS1oZWlnaHQ6MTstd2Via2l0LWJvcmRlci1yYWRpdXM6MTVweDstbW96LWJvcmRlci1yYWRpdXM6MTVweDtib3JkZXItcmFkaXVzOjE1cHh9Lm5hdmJhci1zdGF0aWMtdG9we3Bvc2l0aW9uOnN0YXRpYzttYXJnaW4tYm90dG9tOjB9Lm5hdmJhci1zdGF0aWMtdG9wIC5uYXZiYXItaW5uZXJ7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjA7LW1vei1ib3JkZXItcmFkaXVzOjA7Ym9yZGVyLXJhZGl1czowfS5uYXZiYXItZml4ZWQtdG9wLC5uYXZiYXItZml4ZWQtYm90dG9te3Bvc2l0aW9uOmZpeGVkO3JpZ2h0OjA7bGVmdDowO3otaW5kZXg6MTAzMDttYXJnaW4tYm90dG9tOjB9Lm5hdmJhci1maXhlZC10b3AgLm5hdmJhci1pbm5lciwubmF2YmFyLXN0YXRpYy10b3AgLm5hdmJhci1pbm5lcntib3JkZXItd2lkdGg6MCAwIDFweH0ubmF2YmFyLWZpeGVkLWJvdHRvbSAubmF2YmFyLWlubmVye2JvcmRlci13aWR0aDoxcHggMCAwfS5uYXZiYXItZml4ZWQtdG9wIC5uYXZiYXItaW5uZXIsLm5hdmJhci1maXhlZC1ib3R0b20gLm5hdmJhci1pbm5lcntwYWRkaW5nLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjA7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjA7LW1vei1ib3JkZXItcmFkaXVzOjA7Ym9yZGVyLXJhZGl1czowfS5uYXZiYXItc3RhdGljLXRvcCAuY29udGFpbmVyLC5uYXZiYXItZml4ZWQtdG9wIC5jb250YWluZXIsLm5hdmJhci1maXhlZC1ib3R0b20gLmNvbnRhaW5lcnt3aWR0aDo5NDBweH0ubmF2YmFyLWZpeGVkLXRvcHt0b3A6MH0ubmF2YmFyLWZpeGVkLXRvcCAubmF2YmFyLWlubmVyLC5uYXZiYXItc3RhdGljLXRvcCAubmF2YmFyLWlubmVyey13ZWJraXQtYm94LXNoYWRvdzowIDFweCAxMHB4IHJnYmEoMCwwLDAsMC4xKTstbW96LWJveC1zaGFkb3c6MCAxcHggMTBweCByZ2JhKDAsMCwwLDAuMSk7Ym94LXNoYWRvdzowIDFweCAxMHB4IHJnYmEoMCwwLDAsMC4xKX0ubmF2YmFyLWZpeGVkLWJvdHRvbXtib3R0b206MH0ubmF2YmFyLWZpeGVkLWJvdHRvbSAubmF2YmFyLWlubmVyey13ZWJraXQtYm94LXNoYWRvdzowIC0xcHggMTBweCByZ2JhKDAsMCwwLDAuMSk7LW1vei1ib3gtc2hhZG93OjAgLTFweCAxMHB4IHJnYmEoMCwwLDAsMC4xKTtib3gtc2hhZG93OjAgLTFweCAxMHB4IHJnYmEoMCwwLDAsMC4xKX0ubmF2YmFyIC5uYXZ7cG9zaXRpb246cmVsYXRpdmU7bGVmdDowO2Rpc3BsYXk6YmxvY2s7ZmxvYXQ6bGVmdDttYXJnaW46MCAxMHB4IDAgMH0ubmF2YmFyIC5uYXYucHVsbC1yaWdodHtmbG9hdDpyaWdodDttYXJnaW4tcmlnaHQ6MH0ubmF2YmFyIC5uYXY+bGl7ZmxvYXQ6bGVmdH0ubmF2YmFyIC5uYXY+bGk+YXtmbG9hdDpub25lO3BhZGRpbmc6MTBweCAxNXB4IDEwcHg7Y29sb3I6Izc3Nzt0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXNoYWRvdzowIDFweCAwICNmZmZ9Lm5hdmJhciAubmF2IC5kcm9wZG93bi10b2dnbGUgLmNhcmV0e21hcmdpbi10b3A6OHB4fS5uYXZiYXIgLm5hdj5saT5hOmZvY3VzLC5uYXZiYXIgLm5hdj5saT5hOmhvdmVye2NvbG9yOiMzMzM7dGV4dC1kZWNvcmF0aW9uOm5vbmU7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubmF2YmFyIC5uYXY+LmFjdGl2ZT5hLC5uYXZiYXIgLm5hdj4uYWN0aXZlPmE6aG92ZXIsLm5hdmJhciAubmF2Pi5hY3RpdmU+YTpmb2N1c3tjb2xvcjojNTU1O3RleHQtZGVjb3JhdGlvbjpub25lO2JhY2tncm91bmQtY29sb3I6I2U1ZTVlNTstd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgMCAzcHggOHB4IHJnYmEoMCwwLDAsMC4xMjUpOy1tb3otYm94LXNoYWRvdzppbnNldCAwIDNweCA4cHggcmdiYSgwLDAsMCwwLjEyNSk7Ym94LXNoYWRvdzppbnNldCAwIDNweCA4cHggcmdiYSgwLDAsMCwwLjEyNSl9Lm5hdmJhciAuYnRuLW5hdmJhcntkaXNwbGF5Om5vbmU7ZmxvYXQ6cmlnaHQ7cGFkZGluZzo3cHggMTBweDttYXJnaW4tcmlnaHQ6NXB4O21hcmdpbi1sZWZ0OjVweDtjb2xvcjojZmZmO3RleHQtc2hhZG93OjAgLTFweCAwIHJnYmEoMCwwLDAsMC4yNSk7YmFja2dyb3VuZC1jb2xvcjojZWRlZGVkOypiYWNrZ3JvdW5kLWNvbG9yOiNlNWU1ZTU7YmFja2dyb3VuZC1pbWFnZTotbW96LWxpbmVhci1ncmFkaWVudCh0b3AsI2YyZjJmMiwjZTVlNWU1KTtiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtZ3JhZGllbnQobGluZWFyLDAgMCwwIDEwMCUsZnJvbSgjZjJmMmYyKSx0bygjZTVlNWU1KSk7YmFja2dyb3VuZC1pbWFnZTotd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsI2YyZjJmMiwjZTVlNWU1KTtiYWNrZ3JvdW5kLWltYWdlOi1vLWxpbmVhci1ncmFkaWVudCh0b3AsI2YyZjJmMiwjZTVlNWU1KTtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sI2YyZjJmMiwjZTVlNWU1KTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDtib3JkZXItY29sb3I6I2U1ZTVlNSAjZTVlNWU1ICNiZmJmYmY7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsMC4xKSByZ2JhKDAsMCwwLDAuMSkgcmdiYSgwLDAsMCwwLjI1KTtmaWx0ZXI6cHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JzdHI9JyNmZmYyZjJmMicsZW5kQ29sb3JzdHI9JyNmZmU1ZTVlNScsR3JhZGllbnRUeXBlPTApO2ZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoZW5hYmxlZD1mYWxzZSk7LXdlYmtpdC1ib3gtc2hhZG93Omluc2V0IDAgMXB4IDAgcmdiYSgyNTUsMjU1LDI1NSwwLjEpLDAgMXB4IDAgcmdiYSgyNTUsMjU1LDI1NSwwLjA3NSk7LW1vei1ib3gtc2hhZG93Omluc2V0IDAgMXB4IDAgcmdiYSgyNTUsMjU1LDI1NSwwLjEpLDAgMXB4IDAgcmdiYSgyNTUsMjU1LDI1NSwwLjA3NSk7Ym94LXNoYWRvdzppbnNldCAwIDFweCAwIHJnYmEoMjU1LDI1NSwyNTUsMC4xKSwwIDFweCAwIHJnYmEoMjU1LDI1NSwyNTUsMC4wNzUpfS5uYXZiYXIgLmJ0bi1uYXZiYXI6aG92ZXIsLm5hdmJhciAuYnRuLW5hdmJhcjpmb2N1cywubmF2YmFyIC5idG4tbmF2YmFyOmFjdGl2ZSwubmF2YmFyIC5idG4tbmF2YmFyLmFjdGl2ZSwubmF2YmFyIC5idG4tbmF2YmFyLmRpc2FibGVkLC5uYXZiYXIgLmJ0bi1uYXZiYXJbZGlzYWJsZWRde2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojZTVlNWU1OypiYWNrZ3JvdW5kLWNvbG9yOiNkOWQ5ZDl9Lm5hdmJhciAuYnRuLW5hdmJhcjphY3RpdmUsLm5hdmJhciAuYnRuLW5hdmJhci5hY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojY2NjIFw5fS5uYXZiYXIgLmJ0bi1uYXZiYXIgLmljb24tYmFye2Rpc3BsYXk6YmxvY2s7d2lkdGg6MThweDtoZWlnaHQ6MnB4O2JhY2tncm91bmQtY29sb3I6I2Y1ZjVmNTstd2Via2l0LWJvcmRlci1yYWRpdXM6MXB4Oy1tb3otYm9yZGVyLXJhZGl1czoxcHg7Ym9yZGVyLXJhZGl1czoxcHg7LXdlYmtpdC1ib3gtc2hhZG93OjAgMXB4IDAgcmdiYSgwLDAsMCwwLjI1KTstbW96LWJveC1zaGFkb3c6MCAxcHggMCByZ2JhKDAsMCwwLDAuMjUpO2JveC1zaGFkb3c6MCAxcHggMCByZ2JhKDAsMCwwLDAuMjUpfS5idG4tbmF2YmFyIC5pY29uLWJhcisuaWNvbi1iYXJ7bWFyZ2luLXRvcDozcHh9Lm5hdmJhciAubmF2PmxpPi5kcm9wZG93bi1tZW51OmJlZm9yZXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTdweDtsZWZ0OjlweDtkaXNwbGF5OmlubGluZS1ibG9jaztib3JkZXItcmlnaHQ6N3B4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1ib3R0b206N3B4IHNvbGlkICNjY2M7Ym9yZGVyLWxlZnQ6N3B4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1ib3R0b20tY29sb3I6cmdiYSgwLDAsMCwwLjIpO2NvbnRlbnQ6Jyd9Lm5hdmJhciAubmF2PmxpPi5kcm9wZG93bi1tZW51OmFmdGVye3Bvc2l0aW9uOmFic29sdXRlO3RvcDotNnB4O2xlZnQ6MTBweDtkaXNwbGF5OmlubGluZS1ibG9jaztib3JkZXItcmlnaHQ6NnB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1ib3R0b206NnB4IHNvbGlkICNmZmY7Ym9yZGVyLWxlZnQ6NnB4IHNvbGlkIHRyYW5zcGFyZW50O2NvbnRlbnQ6Jyd9Lm5hdmJhci1maXhlZC1ib3R0b20gLm5hdj5saT4uZHJvcGRvd24tbWVudTpiZWZvcmV7dG9wOmF1dG87Ym90dG9tOi03cHg7Ym9yZGVyLXRvcDo3cHggc29saWQgI2NjYztib3JkZXItYm90dG9tOjA7Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLDAuMil9Lm5hdmJhci1maXhlZC1ib3R0b20gLm5hdj5saT4uZHJvcGRvd24tbWVudTphZnRlcnt0b3A6YXV0bztib3R0b206LTZweDtib3JkZXItdG9wOjZweCBzb2xpZCAjZmZmO2JvcmRlci1ib3R0b206MH0ubmF2YmFyIC5uYXYgbGkuZHJvcGRvd24+YTpob3ZlciAuY2FyZXQsLm5hdmJhciAubmF2IGxpLmRyb3Bkb3duPmE6Zm9jdXMgLmNhcmV0e2JvcmRlci10b3AtY29sb3I6IzMzMztib3JkZXItYm90dG9tLWNvbG9yOiMzMzN9Lm5hdmJhciAubmF2IGxpLmRyb3Bkb3duLm9wZW4+LmRyb3Bkb3duLXRvZ2dsZSwubmF2YmFyIC5uYXYgbGkuZHJvcGRvd24uYWN0aXZlPi5kcm9wZG93bi10b2dnbGUsLm5hdmJhciAubmF2IGxpLmRyb3Bkb3duLm9wZW4uYWN0aXZlPi5kcm9wZG93bi10b2dnbGV7Y29sb3I6IzU1NTtiYWNrZ3JvdW5kLWNvbG9yOiNlNWU1ZTV9Lm5hdmJhciAubmF2IGxpLmRyb3Bkb3duPi5kcm9wZG93bi10b2dnbGUgLmNhcmV0e2JvcmRlci10b3AtY29sb3I6Izc3Nztib3JkZXItYm90dG9tLWNvbG9yOiM3Nzd9Lm5hdmJhciAubmF2IGxpLmRyb3Bkb3duLm9wZW4+LmRyb3Bkb3duLXRvZ2dsZSAuY2FyZXQsLm5hdmJhciAubmF2IGxpLmRyb3Bkb3duLmFjdGl2ZT4uZHJvcGRvd24tdG9nZ2xlIC5jYXJldCwubmF2YmFyIC5uYXYgbGkuZHJvcGRvd24ub3Blbi5hY3RpdmU+LmRyb3Bkb3duLXRvZ2dsZSAuY2FyZXR7Ym9yZGVyLXRvcC1jb2xvcjojNTU1O2JvcmRlci1ib3R0b20tY29sb3I6IzU1NX0ubmF2YmFyIC5wdWxsLXJpZ2h0PmxpPi5kcm9wZG93bi1tZW51LC5uYXZiYXIgLm5hdj5saT4uZHJvcGRvd24tbWVudS5wdWxsLXJpZ2h0e3JpZ2h0OjA7bGVmdDphdXRvfS5uYXZiYXIgLnB1bGwtcmlnaHQ+bGk+LmRyb3Bkb3duLW1lbnU6YmVmb3JlLC5uYXZiYXIgLm5hdj5saT4uZHJvcGRvd24tbWVudS5wdWxsLXJpZ2h0OmJlZm9yZXtyaWdodDoxMnB4O2xlZnQ6YXV0b30ubmF2YmFyIC5wdWxsLXJpZ2h0PmxpPi5kcm9wZG93bi1tZW51OmFmdGVyLC5uYXZiYXIgLm5hdj5saT4uZHJvcGRvd24tbWVudS5wdWxsLXJpZ2h0OmFmdGVye3JpZ2h0OjEzcHg7bGVmdDphdXRvfS5uYXZiYXIgLnB1bGwtcmlnaHQ+bGk+LmRyb3Bkb3duLW1lbnUgLmRyb3Bkb3duLW1lbnUsLm5hdmJhciAubmF2PmxpPi5kcm9wZG93bi1tZW51LnB1bGwtcmlnaHQgLmRyb3Bkb3duLW1lbnV7cmlnaHQ6MTAwJTtsZWZ0OmF1dG87bWFyZ2luLXJpZ2h0Oi0xcHg7bWFyZ2luLWxlZnQ6MDstd2Via2l0LWJvcmRlci1yYWRpdXM6NnB4IDAgNnB4IDZweDstbW96LWJvcmRlci1yYWRpdXM6NnB4IDAgNnB4IDZweDtib3JkZXItcmFkaXVzOjZweCAwIDZweCA2cHh9Lm5hdmJhci1pbnZlcnNlIC5uYXZiYXItaW5uZXJ7YmFja2dyb3VuZC1jb2xvcjojMWIxYjFiO2JhY2tncm91bmQtaW1hZ2U6LW1vei1saW5lYXItZ3JhZGllbnQodG9wLCMyMjIsIzExMSk7YmFja2dyb3VuZC1pbWFnZTotd2Via2l0LWdyYWRpZW50KGxpbmVhciwwIDAsMCAxMDAlLGZyb20oIzIyMiksdG8oIzExMSkpO2JhY2tncm91bmQtaW1hZ2U6LXdlYmtpdC1saW5lYXItZ3JhZGllbnQodG9wLCMyMjIsIzExMSk7YmFja2dyb3VuZC1pbWFnZTotby1saW5lYXItZ3JhZGllbnQodG9wLCMyMjIsIzExMSk7YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCMyMjIsIzExMSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ym9yZGVyLWNvbG9yOiMyNTI1MjU7ZmlsdGVyOnByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPScjZmYyMjIyMjInLGVuZENvbG9yc3RyPScjZmYxMTExMTEnLEdyYWRpZW50VHlwZT0wKX0ubmF2YmFyLWludmVyc2UgLmJyYW5kLC5uYXZiYXItaW52ZXJzZSAubmF2PmxpPmF7Y29sb3I6Izk5OTt0ZXh0LXNoYWRvdzowIC0xcHggMCByZ2JhKDAsMCwwLDAuMjUpfS5uYXZiYXItaW52ZXJzZSAuYnJhbmQ6aG92ZXIsLm5hdmJhci1pbnZlcnNlIC5uYXY+bGk+YTpob3ZlciwubmF2YmFyLWludmVyc2UgLmJyYW5kOmZvY3VzLC5uYXZiYXItaW52ZXJzZSAubmF2PmxpPmE6Zm9jdXN7Y29sb3I6I2ZmZn0ubmF2YmFyLWludmVyc2UgLmJyYW5ke2NvbG9yOiM5OTl9Lm5hdmJhci1pbnZlcnNlIC5uYXZiYXItdGV4dHtjb2xvcjojOTk5fS5uYXZiYXItaW52ZXJzZSAubmF2PmxpPmE6Zm9jdXMsLm5hdmJhci1pbnZlcnNlIC5uYXY+bGk+YTpob3Zlcntjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm5hdmJhci1pbnZlcnNlIC5uYXYgLmFjdGl2ZT5hLC5uYXZiYXItaW52ZXJzZSAubmF2IC5hY3RpdmU+YTpob3ZlciwubmF2YmFyLWludmVyc2UgLm5hdiAuYWN0aXZlPmE6Zm9jdXN7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiMxMTF9Lm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbGlua3tjb2xvcjojOTk5fS5uYXZiYXItaW52ZXJzZSAubmF2YmFyLWxpbms6aG92ZXIsLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbGluazpmb2N1c3tjb2xvcjojZmZmfS5uYXZiYXItaW52ZXJzZSAuZGl2aWRlci12ZXJ0aWNhbHtib3JkZXItcmlnaHQtY29sb3I6IzIyMjtib3JkZXItbGVmdC1jb2xvcjojMTExfS5uYXZiYXItaW52ZXJzZSAubmF2IGxpLmRyb3Bkb3duLm9wZW4+LmRyb3Bkb3duLXRvZ2dsZSwubmF2YmFyLWludmVyc2UgLm5hdiBsaS5kcm9wZG93bi5hY3RpdmU+LmRyb3Bkb3duLXRvZ2dsZSwubmF2YmFyLWludmVyc2UgLm5hdiBsaS5kcm9wZG93bi5vcGVuLmFjdGl2ZT4uZHJvcGRvd24tdG9nZ2xle2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMTExfS5uYXZiYXItaW52ZXJzZSAubmF2IGxpLmRyb3Bkb3duPmE6aG92ZXIgLmNhcmV0LC5uYXZiYXItaW52ZXJzZSAubmF2IGxpLmRyb3Bkb3duPmE6Zm9jdXMgLmNhcmV0e2JvcmRlci10b3AtY29sb3I6I2ZmZjtib3JkZXItYm90dG9tLWNvbG9yOiNmZmZ9Lm5hdmJhci1pbnZlcnNlIC5uYXYgbGkuZHJvcGRvd24+LmRyb3Bkb3duLXRvZ2dsZSAuY2FyZXR7Ym9yZGVyLXRvcC1jb2xvcjojOTk5O2JvcmRlci1ib3R0b20tY29sb3I6Izk5OX0ubmF2YmFyLWludmVyc2UgLm5hdiBsaS5kcm9wZG93bi5vcGVuPi5kcm9wZG93bi10b2dnbGUgLmNhcmV0LC5uYXZiYXItaW52ZXJzZSAubmF2IGxpLmRyb3Bkb3duLmFjdGl2ZT4uZHJvcGRvd24tdG9nZ2xlIC5jYXJldCwubmF2YmFyLWludmVyc2UgLm5hdiBsaS5kcm9wZG93bi5vcGVuLmFjdGl2ZT4uZHJvcGRvd24tdG9nZ2xlIC5jYXJldHtib3JkZXItdG9wLWNvbG9yOiNmZmY7Ym9yZGVyLWJvdHRvbS1jb2xvcjojZmZmfS5uYXZiYXItaW52ZXJzZSAubmF2YmFyLXNlYXJjaCAuc2VhcmNoLXF1ZXJ5e2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojNTE1MTUxO2JvcmRlci1jb2xvcjojMTExOy13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIDFweCAycHggcmdiYSgwLDAsMCwwLjEpLDAgMXB4IDAgcmdiYSgyNTUsMjU1LDI1NSwwLjE1KTstbW96LWJveC1zaGFkb3c6aW5zZXQgMCAxcHggMnB4IHJnYmEoMCwwLDAsMC4xKSwwIDFweCAwIHJnYmEoMjU1LDI1NSwyNTUsMC4xNSk7Ym94LXNoYWRvdzppbnNldCAwIDFweCAycHggcmdiYSgwLDAsMCwwLjEpLDAgMXB4IDAgcmdiYSgyNTUsMjU1LDI1NSwwLjE1KTstd2Via2l0LXRyYW5zaXRpb246bm9uZTstbW96LXRyYW5zaXRpb246bm9uZTstby10cmFuc2l0aW9uOm5vbmU7dHJhbnNpdGlvbjpub25lfS5uYXZiYXItaW52ZXJzZSAubmF2YmFyLXNlYXJjaCAuc2VhcmNoLXF1ZXJ5Oi1tb3otcGxhY2Vob2xkZXJ7Y29sb3I6I2NjY30ubmF2YmFyLWludmVyc2UgLm5hdmJhci1zZWFyY2ggLnNlYXJjaC1xdWVyeTotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6I2NjY30ubmF2YmFyLWludmVyc2UgLm5hdmJhci1zZWFyY2ggLnNlYXJjaC1xdWVyeTo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjojY2NjfS5uYXZiYXItaW52ZXJzZSAubmF2YmFyLXNlYXJjaCAuc2VhcmNoLXF1ZXJ5OmZvY3VzLC5uYXZiYXItaW52ZXJzZSAubmF2YmFyLXNlYXJjaCAuc2VhcmNoLXF1ZXJ5LmZvY3VzZWR7cGFkZGluZzo1cHggMTVweDtjb2xvcjojMzMzO3RleHQtc2hhZG93OjAgMXB4IDAgI2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ym9yZGVyOjA7b3V0bGluZTowOy13ZWJraXQtYm94LXNoYWRvdzowIDAgM3B4IHJnYmEoMCwwLDAsMC4xNSk7LW1vei1ib3gtc2hhZG93OjAgMCAzcHggcmdiYSgwLDAsMCwwLjE1KTtib3gtc2hhZG93OjAgMCAzcHggcmdiYSgwLDAsMCwwLjE1KX0ubmF2YmFyLWludmVyc2UgLmJ0bi1uYXZiYXJ7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzowIC0xcHggMCByZ2JhKDAsMCwwLDAuMjUpO2JhY2tncm91bmQtY29sb3I6IzBlMGUwZTsqYmFja2dyb3VuZC1jb2xvcjojMDQwNDA0O2JhY2tncm91bmQtaW1hZ2U6LW1vei1saW5lYXItZ3JhZGllbnQodG9wLCMxNTE1MTUsIzA0MDQwNCk7YmFja2dyb3VuZC1pbWFnZTotd2Via2l0LWdyYWRpZW50KGxpbmVhciwwIDAsMCAxMDAlLGZyb20oIzE1MTUxNSksdG8oIzA0MDQwNCkpO2JhY2tncm91bmQtaW1hZ2U6LXdlYmtpdC1saW5lYXItZ3JhZGllbnQodG9wLCMxNTE1MTUsIzA0MDQwNCk7YmFja2dyb3VuZC1pbWFnZTotby1saW5lYXItZ3JhZGllbnQodG9wLCMxNTE1MTUsIzA0MDQwNCk7YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCMxNTE1MTUsIzA0MDQwNCk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ym9yZGVyLWNvbG9yOiMwNDA0MDQgIzA0MDQwNCAjMDAwO2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLDAuMSkgcmdiYSgwLDAsMCwwLjEpIHJnYmEoMCwwLDAsMC4yNSk7ZmlsdGVyOnByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPScjZmYxNTE1MTUnLGVuZENvbG9yc3RyPScjZmYwNDA0MDQnLEdyYWRpZW50VHlwZT0wKTtmaWx0ZXI6cHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KGVuYWJsZWQ9ZmFsc2UpfS5uYXZiYXItaW52ZXJzZSAuYnRuLW5hdmJhcjpob3ZlciwubmF2YmFyLWludmVyc2UgLmJ0bi1uYXZiYXI6Zm9jdXMsLm5hdmJhci1pbnZlcnNlIC5idG4tbmF2YmFyOmFjdGl2ZSwubmF2YmFyLWludmVyc2UgLmJ0bi1uYXZiYXIuYWN0aXZlLC5uYXZiYXItaW52ZXJzZSAuYnRuLW5hdmJhci5kaXNhYmxlZCwubmF2YmFyLWludmVyc2UgLmJ0bi1uYXZiYXJbZGlzYWJsZWRde2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMDQwNDA0OypiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm5hdmJhci1pbnZlcnNlIC5idG4tbmF2YmFyOmFjdGl2ZSwubmF2YmFyLWludmVyc2UgLmJ0bi1uYXZiYXIuYWN0aXZle2JhY2tncm91bmQtY29sb3I6IzAwMCBcOX0uYnJlYWRjcnVtYntwYWRkaW5nOjhweCAxNXB4O21hcmdpbjowIDAgMjBweDtsaXN0LXN0eWxlOm5vbmU7YmFja2dyb3VuZC1jb2xvcjojZjVmNWY1Oy13ZWJraXQtYm9yZGVyLXJhZGl1czo0cHg7LW1vei1ib3JkZXItcmFkaXVzOjRweDtib3JkZXItcmFkaXVzOjRweH0uYnJlYWRjcnVtYj5saXtkaXNwbGF5OmlubGluZS1ibG9jazsqZGlzcGxheTppbmxpbmU7dGV4dC1zaGFkb3c6MCAxcHggMCAjZmZmOyp6b29tOjF9LmJyZWFkY3J1bWI+bGk+LmRpdmlkZXJ7cGFkZGluZzowIDVweDtjb2xvcjojY2NjfS5icmVhZGNydW1iPi5hY3RpdmV7Y29sb3I6Izk5OX0ucGFnaW5hdGlvbnttYXJnaW46MjBweCAwfS5wYWdpbmF0aW9uIHVse2Rpc3BsYXk6aW5saW5lLWJsb2NrOypkaXNwbGF5OmlubGluZTttYXJnaW4tYm90dG9tOjA7bWFyZ2luLWxlZnQ6MDstd2Via2l0LWJvcmRlci1yYWRpdXM6NHB4Oy1tb3otYm9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyLXJhZGl1czo0cHg7Knpvb206MTstd2Via2l0LWJveC1zaGFkb3c6MCAxcHggMnB4IHJnYmEoMCwwLDAsMC4wNSk7LW1vei1ib3gtc2hhZG93OjAgMXB4IDJweCByZ2JhKDAsMCwwLDAuMDUpO2JveC1zaGFkb3c6MCAxcHggMnB4IHJnYmEoMCwwLDAsMC4wNSl9LnBhZ2luYXRpb24gdWw+bGl7ZGlzcGxheTppbmxpbmV9LnBhZ2luYXRpb24gdWw+bGk+YSwucGFnaW5hdGlvbiB1bD5saT5zcGFue2Zsb2F0OmxlZnQ7cGFkZGluZzo0cHggMTJweDtsaW5lLWhlaWdodDoyMHB4O3RleHQtZGVjb3JhdGlvbjpub25lO2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXI6MXB4IHNvbGlkICNkZGQ7Ym9yZGVyLWxlZnQtd2lkdGg6MH0ucGFnaW5hdGlvbiB1bD5saT5hOmhvdmVyLC5wYWdpbmF0aW9uIHVsPmxpPmE6Zm9jdXMsLnBhZ2luYXRpb24gdWw+LmFjdGl2ZT5hLC5wYWdpbmF0aW9uIHVsPi5hY3RpdmU+c3BhbntiYWNrZ3JvdW5kLWNvbG9yOiNmNWY1ZjV9LnBhZ2luYXRpb24gdWw+LmFjdGl2ZT5hLC5wYWdpbmF0aW9uIHVsPi5hY3RpdmU+c3Bhbntjb2xvcjojOTk5O2N1cnNvcjpkZWZhdWx0fS5wYWdpbmF0aW9uIHVsPi5kaXNhYmxlZD5zcGFuLC5wYWdpbmF0aW9uIHVsPi5kaXNhYmxlZD5hLC5wYWdpbmF0aW9uIHVsPi5kaXNhYmxlZD5hOmhvdmVyLC5wYWdpbmF0aW9uIHVsPi5kaXNhYmxlZD5hOmZvY3Vze2NvbG9yOiM5OTk7Y3Vyc29yOmRlZmF1bHQ7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ucGFnaW5hdGlvbiB1bD5saTpmaXJzdC1jaGlsZD5hLC5wYWdpbmF0aW9uIHVsPmxpOmZpcnN0LWNoaWxkPnNwYW57Ym9yZGVyLWxlZnQtd2lkdGg6MXB4Oy13ZWJraXQtYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czo0cHg7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czo0cHg7LXdlYmtpdC1ib3JkZXItdG9wLWxlZnQtcmFkaXVzOjRweDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdDo0cHg7LW1vei1ib3JkZXItcmFkaXVzLXRvcGxlZnQ6NHB4fS5wYWdpbmF0aW9uIHVsPmxpOmxhc3QtY2hpbGQ+YSwucGFnaW5hdGlvbiB1bD5saTpsYXN0LWNoaWxkPnNwYW57LXdlYmtpdC1ib3JkZXItdG9wLXJpZ2h0LXJhZGl1czo0cHg7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6NHB4Oy13ZWJraXQtYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6NHB4O2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXMtdG9wcmlnaHQ6NHB4Oy1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodDo0cHh9LnBhZ2luYXRpb24tY2VudGVyZWR7dGV4dC1hbGlnbjpjZW50ZXJ9LnBhZ2luYXRpb24tcmlnaHR7dGV4dC1hbGlnbjpyaWdodH0ucGFnaW5hdGlvbi1sYXJnZSB1bD5saT5hLC5wYWdpbmF0aW9uLWxhcmdlIHVsPmxpPnNwYW57cGFkZGluZzoxMXB4IDE5cHg7Zm9udC1zaXplOjE3LjVweH0ucGFnaW5hdGlvbi1sYXJnZSB1bD5saTpmaXJzdC1jaGlsZD5hLC5wYWdpbmF0aW9uLWxhcmdlIHVsPmxpOmZpcnN0LWNoaWxkPnNwYW57LXdlYmtpdC1ib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjZweDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjZweDstd2Via2l0LWJvcmRlci10b3AtbGVmdC1yYWRpdXM6NnB4O2JvcmRlci10b3AtbGVmdC1yYWRpdXM6NnB4Oy1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21sZWZ0OjZweDstbW96LWJvcmRlci1yYWRpdXMtdG9wbGVmdDo2cHh9LnBhZ2luYXRpb24tbGFyZ2UgdWw+bGk6bGFzdC1jaGlsZD5hLC5wYWdpbmF0aW9uLWxhcmdlIHVsPmxpOmxhc3QtY2hpbGQ+c3Bhbnstd2Via2l0LWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOjZweDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czo2cHg7LXdlYmtpdC1ib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czo2cHg7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6NnB4Oy1tb3otYm9yZGVyLXJhZGl1cy10b3ByaWdodDo2cHg7LW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbXJpZ2h0OjZweH0ucGFnaW5hdGlvbi1taW5pIHVsPmxpOmZpcnN0LWNoaWxkPmEsLnBhZ2luYXRpb24tc21hbGwgdWw+bGk6Zmlyc3QtY2hpbGQ+YSwucGFnaW5hdGlvbi1taW5pIHVsPmxpOmZpcnN0LWNoaWxkPnNwYW4sLnBhZ2luYXRpb24tc21hbGwgdWw+bGk6Zmlyc3QtY2hpbGQ+c3Bhbnstd2Via2l0LWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6M3B4O2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6M3B4Oy13ZWJraXQtYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czozcHg7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czozcHg7LW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbWxlZnQ6M3B4Oy1tb3otYm9yZGVyLXJhZGl1cy10b3BsZWZ0OjNweH0ucGFnaW5hdGlvbi1taW5pIHVsPmxpOmxhc3QtY2hpbGQ+YSwucGFnaW5hdGlvbi1zbWFsbCB1bD5saTpsYXN0LWNoaWxkPmEsLnBhZ2luYXRpb24tbWluaSB1bD5saTpsYXN0LWNoaWxkPnNwYW4sLnBhZ2luYXRpb24tc21hbGwgdWw+bGk6bGFzdC1jaGlsZD5zcGFuey13ZWJraXQtYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6M3B4O2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjNweDstd2Via2l0LWJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjNweDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czozcHg7LW1vei1ib3JkZXItcmFkaXVzLXRvcHJpZ2h0OjNweDstbW96LWJvcmRlci1yYWRpdXMtYm90dG9tcmlnaHQ6M3B4fS5wYWdpbmF0aW9uLXNtYWxsIHVsPmxpPmEsLnBhZ2luYXRpb24tc21hbGwgdWw+bGk+c3BhbntwYWRkaW5nOjJweCAxMHB4O2ZvbnQtc2l6ZToxMS45cHh9LnBhZ2luYXRpb24tbWluaSB1bD5saT5hLC5wYWdpbmF0aW9uLW1pbmkgdWw+bGk+c3BhbntwYWRkaW5nOjAgNnB4O2ZvbnQtc2l6ZToxMC41cHh9LnBhZ2Vye21hcmdpbjoyMHB4IDA7dGV4dC1hbGlnbjpjZW50ZXI7bGlzdC1zdHlsZTpub25lOyp6b29tOjF9LnBhZ2VyOmJlZm9yZSwucGFnZXI6YWZ0ZXJ7ZGlzcGxheTp0YWJsZTtsaW5lLWhlaWdodDowO2NvbnRlbnQ6IiJ9LnBhZ2VyOmFmdGVye2NsZWFyOmJvdGh9LnBhZ2VyIGxpe2Rpc3BsYXk6aW5saW5lfS5wYWdlciBsaT5hLC5wYWdlciBsaT5zcGFue2Rpc3BsYXk6aW5saW5lLWJsb2NrO3BhZGRpbmc6NXB4IDE0cHg7YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlcjoxcHggc29saWQgI2RkZDstd2Via2l0LWJvcmRlci1yYWRpdXM6MTVweDstbW96LWJvcmRlci1yYWRpdXM6MTVweDtib3JkZXItcmFkaXVzOjE1cHh9LnBhZ2VyIGxpPmE6aG92ZXIsLnBhZ2VyIGxpPmE6Zm9jdXN7dGV4dC1kZWNvcmF0aW9uOm5vbmU7YmFja2dyb3VuZC1jb2xvcjojZjVmNWY1fS5wYWdlciAubmV4dD5hLC5wYWdlciAubmV4dD5zcGFue2Zsb2F0OnJpZ2h0fS5wYWdlciAucHJldmlvdXM+YSwucGFnZXIgLnByZXZpb3VzPnNwYW57ZmxvYXQ6bGVmdH0ucGFnZXIgLmRpc2FibGVkPmEsLnBhZ2VyIC5kaXNhYmxlZD5hOmhvdmVyLC5wYWdlciAuZGlzYWJsZWQ+YTpmb2N1cywucGFnZXIgLmRpc2FibGVkPnNwYW57Y29sb3I6Izk5OTtjdXJzb3I6ZGVmYXVsdDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1vZGFsLWJhY2tkcm9we3Bvc2l0aW9uOmZpeGVkO3RvcDowO3JpZ2h0OjA7Ym90dG9tOjA7bGVmdDowO3otaW5kZXg6MTA0MDtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1vZGFsLWJhY2tkcm9wLmZhZGV7b3BhY2l0eTowfS5tb2RhbC1iYWNrZHJvcCwubW9kYWwtYmFja2Ryb3AuZmFkZS5pbntvcGFjaXR5Oi44O2ZpbHRlcjphbHBoYShvcGFjaXR5PTgwKX0ubW9kYWx7cG9zaXRpb246Zml4ZWQ7dG9wOjEwJTtsZWZ0OjUwJTt6LWluZGV4OjEwNTA7d2lkdGg6NTYwcHg7bWFyZ2luLWxlZnQ6LTI4MHB4O2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXI6MXB4IHNvbGlkICM5OTk7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDAsMCwwLDAuMyk7KmJvcmRlcjoxcHggc29saWQgIzk5OTstd2Via2l0LWJvcmRlci1yYWRpdXM6NnB4Oy1tb3otYm9yZGVyLXJhZGl1czo2cHg7Ym9yZGVyLXJhZGl1czo2cHg7b3V0bGluZTowOy13ZWJraXQtYm94LXNoYWRvdzowIDNweCA3cHggcmdiYSgwLDAsMCwwLjMpOy1tb3otYm94LXNoYWRvdzowIDNweCA3cHggcmdiYSgwLDAsMCwwLjMpO2JveC1zaGFkb3c6MCAzcHggN3B4IHJnYmEoMCwwLDAsMC4zKTstd2Via2l0LWJhY2tncm91bmQtY2xpcDpwYWRkaW5nLWJveDstbW96LWJhY2tncm91bmQtY2xpcDpwYWRkaW5nLWJveDtiYWNrZ3JvdW5kLWNsaXA6cGFkZGluZy1ib3h9Lm1vZGFsLmZhZGV7dG9wOi0yNSU7LXdlYmtpdC10cmFuc2l0aW9uOm9wYWNpdHkgLjNzIGxpbmVhcix0b3AgLjNzIGVhc2Utb3V0Oy1tb3otdHJhbnNpdGlvbjpvcGFjaXR5IC4zcyBsaW5lYXIsdG9wIC4zcyBlYXNlLW91dDstby10cmFuc2l0aW9uOm9wYWNpdHkgLjNzIGxpbmVhcix0b3AgLjNzIGVhc2Utb3V0O3RyYW5zaXRpb246b3BhY2l0eSAuM3MgbGluZWFyLHRvcCAuM3MgZWFzZS1vdXR9Lm1vZGFsLmZhZGUuaW57dG9wOjEwJX0ubW9kYWwtaGVhZGVye3BhZGRpbmc6OXB4IDE1cHg7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2VlZX0ubW9kYWwtaGVhZGVyIC5jbG9zZXttYXJnaW4tdG9wOjJweH0ubW9kYWwtaGVhZGVyIGgze21hcmdpbjowO2xpbmUtaGVpZ2h0OjMwcHh9Lm1vZGFsLWJvZHl7cG9zaXRpb246cmVsYXRpdmU7bWF4LWhlaWdodDo0MDBweDtwYWRkaW5nOjE1cHg7b3ZlcmZsb3cteTphdXRvfS5tb2RhbC1mb3Jte21hcmdpbi1ib3R0b206MH0ubW9kYWwtZm9vdGVye3BhZGRpbmc6MTRweCAxNXB4IDE1cHg7bWFyZ2luLWJvdHRvbTowO3RleHQtYWxpZ246cmlnaHQ7YmFja2dyb3VuZC1jb2xvcjojZjVmNWY1O2JvcmRlci10b3A6MXB4IHNvbGlkICNkZGQ7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjAgMCA2cHggNnB4Oy1tb3otYm9yZGVyLXJhZGl1czowIDAgNnB4IDZweDtib3JkZXItcmFkaXVzOjAgMCA2cHggNnB4Oyp6b29tOjE7LXdlYmtpdC1ib3gtc2hhZG93Omluc2V0IDAgMXB4IDAgI2ZmZjstbW96LWJveC1zaGFkb3c6aW5zZXQgMCAxcHggMCAjZmZmO2JveC1zaGFkb3c6aW5zZXQgMCAxcHggMCAjZmZmfS5tb2RhbC1mb290ZXI6YmVmb3JlLC5tb2RhbC1mb290ZXI6YWZ0ZXJ7ZGlzcGxheTp0YWJsZTtsaW5lLWhlaWdodDowO2NvbnRlbnQ6IiJ9Lm1vZGFsLWZvb3RlcjphZnRlcntjbGVhcjpib3RofS5tb2RhbC1mb290ZXIgLmJ0bisuYnRue21hcmdpbi1ib3R0b206MDttYXJnaW4tbGVmdDo1cHh9Lm1vZGFsLWZvb3RlciAuYnRuLWdyb3VwIC5idG4rLmJ0bnttYXJnaW4tbGVmdDotMXB4fS5tb2RhbC1mb290ZXIgLmJ0bi1ibG9jaysuYnRuLWJsb2Nre21hcmdpbi1sZWZ0OjB9LnRvb2x0aXB7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDMwO2Rpc3BsYXk6YmxvY2s7Zm9udC1zaXplOjExcHg7bGluZS1oZWlnaHQ6MS40O29wYWNpdHk6MDtmaWx0ZXI6YWxwaGEob3BhY2l0eT0wKTt2aXNpYmlsaXR5OnZpc2libGV9LnRvb2x0aXAuaW57b3BhY2l0eTouODtmaWx0ZXI6YWxwaGEob3BhY2l0eT04MCl9LnRvb2x0aXAudG9we3BhZGRpbmc6NXB4IDA7bWFyZ2luLXRvcDotM3B4fS50b29sdGlwLnJpZ2h0e3BhZGRpbmc6MCA1cHg7bWFyZ2luLWxlZnQ6M3B4fS50b29sdGlwLmJvdHRvbXtwYWRkaW5nOjVweCAwO21hcmdpbi10b3A6M3B4fS50b29sdGlwLmxlZnR7cGFkZGluZzowIDVweDttYXJnaW4tbGVmdDotM3B4fS50b29sdGlwLWlubmVye21heC13aWR0aDoyMDBweDtwYWRkaW5nOjhweDtjb2xvcjojZmZmO3RleHQtYWxpZ246Y2VudGVyO3RleHQtZGVjb3JhdGlvbjpub25lO2JhY2tncm91bmQtY29sb3I6IzAwMDstd2Via2l0LWJvcmRlci1yYWRpdXM6NHB4Oy1tb3otYm9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyLXJhZGl1czo0cHh9LnRvb2x0aXAtYXJyb3d7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MDtoZWlnaHQ6MDtib3JkZXItY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLXN0eWxlOnNvbGlkfS50b29sdGlwLnRvcCAudG9vbHRpcC1hcnJvd3tib3R0b206MDtsZWZ0OjUwJTttYXJnaW4tbGVmdDotNXB4O2JvcmRlci10b3AtY29sb3I6IzAwMDtib3JkZXItd2lkdGg6NXB4IDVweCAwfS50b29sdGlwLnJpZ2h0IC50b29sdGlwLWFycm93e3RvcDo1MCU7bGVmdDowO21hcmdpbi10b3A6LTVweDtib3JkZXItcmlnaHQtY29sb3I6IzAwMDtib3JkZXItd2lkdGg6NXB4IDVweCA1cHggMH0udG9vbHRpcC5sZWZ0IC50b29sdGlwLWFycm93e3RvcDo1MCU7cmlnaHQ6MDttYXJnaW4tdG9wOi01cHg7Ym9yZGVyLWxlZnQtY29sb3I6IzAwMDtib3JkZXItd2lkdGg6NXB4IDAgNXB4IDVweH0udG9vbHRpcC5ib3R0b20gLnRvb2x0aXAtYXJyb3d7dG9wOjA7bGVmdDo1MCU7bWFyZ2luLWxlZnQ6LTVweDtib3JkZXItYm90dG9tLWNvbG9yOiMwMDA7Ym9yZGVyLXdpZHRoOjAgNXB4IDVweH0ucG9wb3Zlcntwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7ei1pbmRleDoxMDEwO2Rpc3BsYXk6bm9uZTttYXgtd2lkdGg6NDAwcHg7cGFkZGluZzoxcHg7dGV4dC1hbGlnbjpsZWZ0O3doaXRlLXNwYWNlOm5vcm1hbDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ym9yZGVyOjFweCBzb2xpZCAjY2NjO2JvcmRlcjoxcHggc29saWQgcmdiYSgwLDAsMCwwLjIpOy13ZWJraXQtYm9yZGVyLXJhZGl1czo2cHg7LW1vei1ib3JkZXItcmFkaXVzOjZweDtib3JkZXItcmFkaXVzOjZweDstd2Via2l0LWJveC1zaGFkb3c6MCA1cHggMTBweCByZ2JhKDAsMCwwLDAuMik7LW1vei1ib3gtc2hhZG93OjAgNXB4IDEwcHggcmdiYSgwLDAsMCwwLjIpO2JveC1zaGFkb3c6MCA1cHggMTBweCByZ2JhKDAsMCwwLDAuMik7LXdlYmtpdC1iYWNrZ3JvdW5kLWNsaXA6cGFkZGluZy1ib3g7LW1vei1iYWNrZ3JvdW5kLWNsaXA6cGFkZGluZztiYWNrZ3JvdW5kLWNsaXA6cGFkZGluZy1ib3h9LnBvcG92ZXIudG9we21hcmdpbi10b3A6LTEwcHh9LnBvcG92ZXIucmlnaHR7bWFyZ2luLWxlZnQ6MTBweH0ucG9wb3Zlci5ib3R0b217bWFyZ2luLXRvcDoxMHB4fS5wb3BvdmVyLmxlZnR7bWFyZ2luLWxlZnQ6LTEwcHh9LnBvcG92ZXItdGl0bGV7cGFkZGluZzo4cHggMTRweDttYXJnaW46MDtmb250LXNpemU6MTRweDtmb250LXdlaWdodDpub3JtYWw7bGluZS1oZWlnaHQ6MThweDtiYWNrZ3JvdW5kLWNvbG9yOiNmN2Y3Zjc7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2ViZWJlYjstd2Via2l0LWJvcmRlci1yYWRpdXM6NXB4IDVweCAwIDA7LW1vei1ib3JkZXItcmFkaXVzOjVweCA1cHggMCAwO2JvcmRlci1yYWRpdXM6NXB4IDVweCAwIDB9LnBvcG92ZXItdGl0bGU6ZW1wdHl7ZGlzcGxheTpub25lfS5wb3BvdmVyLWNvbnRlbnR7cGFkZGluZzo5cHggMTRweH0ucG9wb3ZlciAuYXJyb3csLnBvcG92ZXIgLmFycm93OmFmdGVye3Bvc2l0aW9uOmFic29sdXRlO2Rpc3BsYXk6YmxvY2s7d2lkdGg6MDtoZWlnaHQ6MDtib3JkZXItY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLXN0eWxlOnNvbGlkfS5wb3BvdmVyIC5hcnJvd3tib3JkZXItd2lkdGg6MTFweH0ucG9wb3ZlciAuYXJyb3c6YWZ0ZXJ7Ym9yZGVyLXdpZHRoOjEwcHg7Y29udGVudDoiIn0ucG9wb3Zlci50b3AgLmFycm93e2JvdHRvbTotMTFweDtsZWZ0OjUwJTttYXJnaW4tbGVmdDotMTFweDtib3JkZXItdG9wLWNvbG9yOiM5OTk7Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLDAuMjUpO2JvcmRlci1ib3R0b20td2lkdGg6MH0ucG9wb3Zlci50b3AgLmFycm93OmFmdGVye2JvdHRvbToxcHg7bWFyZ2luLWxlZnQ6LTEwcHg7Ym9yZGVyLXRvcC1jb2xvcjojZmZmO2JvcmRlci1ib3R0b20td2lkdGg6MH0ucG9wb3Zlci5yaWdodCAuYXJyb3d7dG9wOjUwJTtsZWZ0Oi0xMXB4O21hcmdpbi10b3A6LTExcHg7Ym9yZGVyLXJpZ2h0LWNvbG9yOiM5OTk7Ym9yZGVyLXJpZ2h0LWNvbG9yOnJnYmEoMCwwLDAsMC4yNSk7Ym9yZGVyLWxlZnQtd2lkdGg6MH0ucG9wb3Zlci5yaWdodCAuYXJyb3c6YWZ0ZXJ7Ym90dG9tOi0xMHB4O2xlZnQ6MXB4O2JvcmRlci1yaWdodC1jb2xvcjojZmZmO2JvcmRlci1sZWZ0LXdpZHRoOjB9LnBvcG92ZXIuYm90dG9tIC5hcnJvd3t0b3A6LTExcHg7bGVmdDo1MCU7bWFyZ2luLWxlZnQ6LTExcHg7Ym9yZGVyLWJvdHRvbS1jb2xvcjojOTk5O2JvcmRlci1ib3R0b20tY29sb3I6cmdiYSgwLDAsMCwwLjI1KTtib3JkZXItdG9wLXdpZHRoOjB9LnBvcG92ZXIuYm90dG9tIC5hcnJvdzphZnRlcnt0b3A6MXB4O21hcmdpbi1sZWZ0Oi0xMHB4O2JvcmRlci1ib3R0b20tY29sb3I6I2ZmZjtib3JkZXItdG9wLXdpZHRoOjB9LnBvcG92ZXIubGVmdCAuYXJyb3d7dG9wOjUwJTtyaWdodDotMTFweDttYXJnaW4tdG9wOi0xMXB4O2JvcmRlci1sZWZ0LWNvbG9yOiM5OTk7Ym9yZGVyLWxlZnQtY29sb3I6cmdiYSgwLDAsMCwwLjI1KTtib3JkZXItcmlnaHQtd2lkdGg6MH0ucG9wb3Zlci5sZWZ0IC5hcnJvdzphZnRlcntyaWdodDoxcHg7Ym90dG9tOi0xMHB4O2JvcmRlci1sZWZ0LWNvbG9yOiNmZmY7Ym9yZGVyLXJpZ2h0LXdpZHRoOjB9LnRodW1ibmFpbHN7bWFyZ2luLWxlZnQ6LTIwcHg7bGlzdC1zdHlsZTpub25lOyp6b29tOjF9LnRodW1ibmFpbHM6YmVmb3JlLC50aHVtYm5haWxzOmFmdGVye2Rpc3BsYXk6dGFibGU7bGluZS1oZWlnaHQ6MDtjb250ZW50OiIifS50aHVtYm5haWxzOmFmdGVye2NsZWFyOmJvdGh9LnJvdy1mbHVpZCAudGh1bWJuYWlsc3ttYXJnaW4tbGVmdDowfS50aHVtYm5haWxzPmxpe2Zsb2F0OmxlZnQ7bWFyZ2luLWJvdHRvbToyMHB4O21hcmdpbi1sZWZ0OjIwcHh9LnRodW1ibmFpbHtkaXNwbGF5OmJsb2NrO3BhZGRpbmc6NHB4O2xpbmUtaGVpZ2h0OjIwcHg7Ym9yZGVyOjFweCBzb2xpZCAjZGRkOy13ZWJraXQtYm9yZGVyLXJhZGl1czo0cHg7LW1vei1ib3JkZXItcmFkaXVzOjRweDtib3JkZXItcmFkaXVzOjRweDstd2Via2l0LWJveC1zaGFkb3c6MCAxcHggM3B4IHJnYmEoMCwwLDAsMC4wNTUpOy1tb3otYm94LXNoYWRvdzowIDFweCAzcHggcmdiYSgwLDAsMCwwLjA1NSk7Ym94LXNoYWRvdzowIDFweCAzcHggcmdiYSgwLDAsMCwwLjA1NSk7LXdlYmtpdC10cmFuc2l0aW9uOmFsbCAuMnMgZWFzZS1pbi1vdXQ7LW1vei10cmFuc2l0aW9uOmFsbCAuMnMgZWFzZS1pbi1vdXQ7LW8tdHJhbnNpdGlvbjphbGwgLjJzIGVhc2UtaW4tb3V0O3RyYW5zaXRpb246YWxsIC4ycyBlYXNlLWluLW91dH1hLnRodW1ibmFpbDpob3ZlcixhLnRodW1ibmFpbDpmb2N1c3tib3JkZXItY29sb3I6IzA4Yzstd2Via2l0LWJveC1zaGFkb3c6MCAxcHggNHB4IHJnYmEoMCwxMDUsMjE0LDAuMjUpOy1tb3otYm94LXNoYWRvdzowIDFweCA0cHggcmdiYSgwLDEwNSwyMTQsMC4yNSk7Ym94LXNoYWRvdzowIDFweCA0cHggcmdiYSgwLDEwNSwyMTQsMC4yNSl9LnRodW1ibmFpbD5pbWd7ZGlzcGxheTpibG9jazttYXgtd2lkdGg6MTAwJTttYXJnaW4tcmlnaHQ6YXV0bzttYXJnaW4tbGVmdDphdXRvfS50aHVtYm5haWwgLmNhcHRpb257cGFkZGluZzo5cHg7Y29sb3I6IzU1NX0ubWVkaWEsLm1lZGlhLWJvZHl7b3ZlcmZsb3c6aGlkZGVuOypvdmVyZmxvdzp2aXNpYmxlO3pvb206MX0ubWVkaWEsLm1lZGlhIC5tZWRpYXttYXJnaW4tdG9wOjE1cHh9Lm1lZGlhOmZpcnN0LWNoaWxke21hcmdpbi10b3A6MH0ubWVkaWEtb2JqZWN0e2Rpc3BsYXk6YmxvY2t9Lm1lZGlhLWhlYWRpbmd7bWFyZ2luOjAgMCA1cHh9Lm1lZGlhPi5wdWxsLWxlZnR7bWFyZ2luLXJpZ2h0OjEwcHh9Lm1lZGlhPi5wdWxsLXJpZ2h0e21hcmdpbi1sZWZ0OjEwcHh9Lm1lZGlhLWxpc3R7bWFyZ2luLWxlZnQ6MDtsaXN0LXN0eWxlOm5vbmV9LmxhYmVsLC5iYWRnZXtkaXNwbGF5OmlubGluZS1ibG9jaztwYWRkaW5nOjJweCA0cHg7Zm9udC1zaXplOjExLjg0NHB4O2ZvbnQtd2VpZ2h0OmJvbGQ7bGluZS1oZWlnaHQ6MTRweDtjb2xvcjojZmZmO3RleHQtc2hhZG93OjAgLTFweCAwIHJnYmEoMCwwLDAsMC4yNSk7d2hpdGUtc3BhY2U6bm93cmFwO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO2JhY2tncm91bmQtY29sb3I6Izk5OX0ubGFiZWx7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjNweDstbW96LWJvcmRlci1yYWRpdXM6M3B4O2JvcmRlci1yYWRpdXM6M3B4fS5iYWRnZXtwYWRkaW5nLXJpZ2h0OjlweDtwYWRkaW5nLWxlZnQ6OXB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czo5cHg7LW1vei1ib3JkZXItcmFkaXVzOjlweDtib3JkZXItcmFkaXVzOjlweH0ubGFiZWw6ZW1wdHksLmJhZGdlOmVtcHR5e2Rpc3BsYXk6bm9uZX1hLmxhYmVsOmhvdmVyLGEubGFiZWw6Zm9jdXMsYS5iYWRnZTpob3ZlcixhLmJhZGdlOmZvY3Vze2NvbG9yOiNmZmY7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Y3Vyc29yOnBvaW50ZXJ9LmxhYmVsLWltcG9ydGFudCwuYmFkZ2UtaW1wb3J0YW50e2JhY2tncm91bmQtY29sb3I6I2I5NGE0OH0ubGFiZWwtaW1wb3J0YW50W2hyZWZdLC5iYWRnZS1pbXBvcnRhbnRbaHJlZl17YmFja2dyb3VuZC1jb2xvcjojOTUzYjM5fS5sYWJlbC13YXJuaW5nLC5iYWRnZS13YXJuaW5ne2JhY2tncm91bmQtY29sb3I6I2Y4OTQwNn0ubGFiZWwtd2FybmluZ1tocmVmXSwuYmFkZ2Utd2FybmluZ1tocmVmXXtiYWNrZ3JvdW5kLWNvbG9yOiNjNjc2MDV9LmxhYmVsLXN1Y2Nlc3MsLmJhZGdlLXN1Y2Nlc3N7YmFja2dyb3VuZC1jb2xvcjojNDY4ODQ3fS5sYWJlbC1zdWNjZXNzW2hyZWZdLC5iYWRnZS1zdWNjZXNzW2hyZWZde2JhY2tncm91bmQtY29sb3I6IzM1NjYzNX0ubGFiZWwtaW5mbywuYmFkZ2UtaW5mb3tiYWNrZ3JvdW5kLWNvbG9yOiMzYTg3YWR9LmxhYmVsLWluZm9baHJlZl0sLmJhZGdlLWluZm9baHJlZl17YmFja2dyb3VuZC1jb2xvcjojMmQ2OTg3fS5sYWJlbC1pbnZlcnNlLC5iYWRnZS1pbnZlcnNle2JhY2tncm91bmQtY29sb3I6IzMzM30ubGFiZWwtaW52ZXJzZVtocmVmXSwuYmFkZ2UtaW52ZXJzZVtocmVmXXtiYWNrZ3JvdW5kLWNvbG9yOiMxYTFhMWF9LmJ0biAubGFiZWwsLmJ0biAuYmFkZ2V7cG9zaXRpb246cmVsYXRpdmU7dG9wOi0xcHh9LmJ0bi1taW5pIC5sYWJlbCwuYnRuLW1pbmkgLmJhZGdle3RvcDowfUAtd2Via2l0LWtleWZyYW1lcyBwcm9ncmVzcy1iYXItc3RyaXBlc3tmcm9te2JhY2tncm91bmQtcG9zaXRpb246NDBweCAwfXRve2JhY2tncm91bmQtcG9zaXRpb246MCAwfX1ALW1vei1rZXlmcmFtZXMgcHJvZ3Jlc3MtYmFyLXN0cmlwZXN7ZnJvbXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjQwcHggMH10b3tiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgMH19QC1tcy1rZXlmcmFtZXMgcHJvZ3Jlc3MtYmFyLXN0cmlwZXN7ZnJvbXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjQwcHggMH10b3tiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgMH19QC1vLWtleWZyYW1lcyBwcm9ncmVzcy1iYXItc3RyaXBlc3tmcm9te2JhY2tncm91bmQtcG9zaXRpb246MCAwfXRve2JhY2tncm91bmQtcG9zaXRpb246NDBweCAwfX1Aa2V5ZnJhbWVzIHByb2dyZXNzLWJhci1zdHJpcGVze2Zyb217YmFja2dyb3VuZC1wb3NpdGlvbjo0MHB4IDB9dG97YmFja2dyb3VuZC1wb3NpdGlvbjowIDB9fS5wcm9ncmVzc3toZWlnaHQ6MjBweDttYXJnaW4tYm90dG9tOjIwcHg7b3ZlcmZsb3c6aGlkZGVuO2JhY2tncm91bmQtY29sb3I6I2Y3ZjdmNztiYWNrZ3JvdW5kLWltYWdlOi1tb3otbGluZWFyLWdyYWRpZW50KHRvcCwjZjVmNWY1LCNmOWY5ZjkpO2JhY2tncm91bmQtaW1hZ2U6LXdlYmtpdC1ncmFkaWVudChsaW5lYXIsMCAwLDAgMTAwJSxmcm9tKCNmNWY1ZjUpLHRvKCNmOWY5ZjkpKTtiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRvcCwjZjVmNWY1LCNmOWY5ZjkpO2JhY2tncm91bmQtaW1hZ2U6LW8tbGluZWFyLWdyYWRpZW50KHRvcCwjZjVmNWY1LCNmOWY5ZjkpO2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwjZjVmNWY1LCNmOWY5ZjkpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14Oy13ZWJraXQtYm9yZGVyLXJhZGl1czo0cHg7LW1vei1ib3JkZXItcmFkaXVzOjRweDtib3JkZXItcmFkaXVzOjRweDtmaWx0ZXI6cHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JzdHI9JyNmZmY1ZjVmNScsZW5kQ29sb3JzdHI9JyNmZmY5ZjlmOScsR3JhZGllbnRUeXBlPTApOy13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIDFweCAycHggcmdiYSgwLDAsMCwwLjEpOy1tb3otYm94LXNoYWRvdzppbnNldCAwIDFweCAycHggcmdiYSgwLDAsMCwwLjEpO2JveC1zaGFkb3c6aW5zZXQgMCAxcHggMnB4IHJnYmEoMCwwLDAsMC4xKX0ucHJvZ3Jlc3MgLmJhcntmbG9hdDpsZWZ0O3dpZHRoOjA7aGVpZ2h0OjEwMCU7Zm9udC1zaXplOjEycHg7Y29sb3I6I2ZmZjt0ZXh0LWFsaWduOmNlbnRlcjt0ZXh0LXNoYWRvdzowIC0xcHggMCByZ2JhKDAsMCwwLDAuMjUpO2JhY2tncm91bmQtY29sb3I6IzBlOTBkMjtiYWNrZ3JvdW5kLWltYWdlOi1tb3otbGluZWFyLWdyYWRpZW50KHRvcCwjMTQ5YmRmLCMwNDgwYmUpO2JhY2tncm91bmQtaW1hZ2U6LXdlYmtpdC1ncmFkaWVudChsaW5lYXIsMCAwLDAgMTAwJSxmcm9tKCMxNDliZGYpLHRvKCMwNDgwYmUpKTtiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRvcCwjMTQ5YmRmLCMwNDgwYmUpO2JhY2tncm91bmQtaW1hZ2U6LW8tbGluZWFyLWdyYWRpZW50KHRvcCwjMTQ5YmRmLCMwNDgwYmUpO2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwjMTQ5YmRmLCMwNDgwYmUpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14O2ZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0nI2ZmMTQ5YmRmJyxlbmRDb2xvcnN0cj0nI2ZmMDQ4MGJlJyxHcmFkaWVudFR5cGU9MCk7LXdlYmtpdC1ib3gtc2hhZG93Omluc2V0IDAgLTFweCAwIHJnYmEoMCwwLDAsMC4xNSk7LW1vei1ib3gtc2hhZG93Omluc2V0IDAgLTFweCAwIHJnYmEoMCwwLDAsMC4xNSk7Ym94LXNoYWRvdzppbnNldCAwIC0xcHggMCByZ2JhKDAsMCwwLDAuMTUpOy13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94Oy1tb3otYm94LXNpemluZzpib3JkZXItYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveDstd2Via2l0LXRyYW5zaXRpb246d2lkdGggLjZzIGVhc2U7LW1vei10cmFuc2l0aW9uOndpZHRoIC42cyBlYXNlOy1vLXRyYW5zaXRpb246d2lkdGggLjZzIGVhc2U7dHJhbnNpdGlvbjp3aWR0aCAuNnMgZWFzZX0ucHJvZ3Jlc3MgLmJhcisuYmFyey13ZWJraXQtYm94LXNoYWRvdzppbnNldCAxcHggMCAwIHJnYmEoMCwwLDAsMC4xNSksaW5zZXQgMCAtMXB4IDAgcmdiYSgwLDAsMCwwLjE1KTstbW96LWJveC1zaGFkb3c6aW5zZXQgMXB4IDAgMCByZ2JhKDAsMCwwLDAuMTUpLGluc2V0IDAgLTFweCAwIHJnYmEoMCwwLDAsMC4xNSk7Ym94LXNoYWRvdzppbnNldCAxcHggMCAwIHJnYmEoMCwwLDAsMC4xNSksaW5zZXQgMCAtMXB4IDAgcmdiYSgwLDAsMCwwLjE1KX0ucHJvZ3Jlc3Mtc3RyaXBlZCAuYmFye2JhY2tncm91bmQtY29sb3I6IzE0OWJkZjtiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtZ3JhZGllbnQobGluZWFyLDAgMTAwJSwxMDAlIDAsY29sb3Itc3RvcCgwLjI1LHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkpLGNvbG9yLXN0b3AoMC4yNSx0cmFuc3BhcmVudCksY29sb3Itc3RvcCgwLjUsdHJhbnNwYXJlbnQpLGNvbG9yLXN0b3AoMC41LHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkpLGNvbG9yLXN0b3AoMC43NSxyZ2JhKDI1NSwyNTUsMjU1LDAuMTUpKSxjb2xvci1zdG9wKDAuNzUsdHJhbnNwYXJlbnQpLHRvKHRyYW5zcGFyZW50KSk7YmFja2dyb3VuZC1pbWFnZTotd2Via2l0LWxpbmVhci1ncmFkaWVudCg0NWRlZyxyZ2JhKDI1NSwyNTUsMjU1LDAuMTUpIDI1JSx0cmFuc3BhcmVudCAyNSUsdHJhbnNwYXJlbnQgNTAlLHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkgNTAlLHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkgNzUlLHRyYW5zcGFyZW50IDc1JSx0cmFuc3BhcmVudCk7YmFja2dyb3VuZC1pbWFnZTotbW96LWxpbmVhci1ncmFkaWVudCg0NWRlZyxyZ2JhKDI1NSwyNTUsMjU1LDAuMTUpIDI1JSx0cmFuc3BhcmVudCAyNSUsdHJhbnNwYXJlbnQgNTAlLHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkgNTAlLHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkgNzUlLHRyYW5zcGFyZW50IDc1JSx0cmFuc3BhcmVudCk7YmFja2dyb3VuZC1pbWFnZTotby1saW5lYXItZ3JhZGllbnQoNDVkZWcscmdiYSgyNTUsMjU1LDI1NSwwLjE1KSAyNSUsdHJhbnNwYXJlbnQgMjUlLHRyYW5zcGFyZW50IDUwJSxyZ2JhKDI1NSwyNTUsMjU1LDAuMTUpIDUwJSxyZ2JhKDI1NSwyNTUsMjU1LDAuMTUpIDc1JSx0cmFuc3BhcmVudCA3NSUsdHJhbnNwYXJlbnQpO2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KDQ1ZGVnLHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkgMjUlLHRyYW5zcGFyZW50IDI1JSx0cmFuc3BhcmVudCA1MCUscmdiYSgyNTUsMjU1LDI1NSwwLjE1KSA1MCUscmdiYSgyNTUsMjU1LDI1NSwwLjE1KSA3NSUsdHJhbnNwYXJlbnQgNzUlLHRyYW5zcGFyZW50KTstd2Via2l0LWJhY2tncm91bmQtc2l6ZTo0MHB4IDQwcHg7LW1vei1iYWNrZ3JvdW5kLXNpemU6NDBweCA0MHB4Oy1vLWJhY2tncm91bmQtc2l6ZTo0MHB4IDQwcHg7YmFja2dyb3VuZC1zaXplOjQwcHggNDBweH0ucHJvZ3Jlc3MuYWN0aXZlIC5iYXJ7LXdlYmtpdC1hbmltYXRpb246cHJvZ3Jlc3MtYmFyLXN0cmlwZXMgMnMgbGluZWFyIGluZmluaXRlOy1tb3otYW5pbWF0aW9uOnByb2dyZXNzLWJhci1zdHJpcGVzIDJzIGxpbmVhciBpbmZpbml0ZTstbXMtYW5pbWF0aW9uOnByb2dyZXNzLWJhci1zdHJpcGVzIDJzIGxpbmVhciBpbmZpbml0ZTstby1hbmltYXRpb246cHJvZ3Jlc3MtYmFyLXN0cmlwZXMgMnMgbGluZWFyIGluZmluaXRlO2FuaW1hdGlvbjpwcm9ncmVzcy1iYXItc3RyaXBlcyAycyBsaW5lYXIgaW5maW5pdGV9LnByb2dyZXNzLWRhbmdlciAuYmFyLC5wcm9ncmVzcyAuYmFyLWRhbmdlcntiYWNrZ3JvdW5kLWNvbG9yOiNkZDUxNGM7YmFja2dyb3VuZC1pbWFnZTotbW96LWxpbmVhci1ncmFkaWVudCh0b3AsI2VlNWY1YiwjYzQzYzM1KTtiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtZ3JhZGllbnQobGluZWFyLDAgMCwwIDEwMCUsZnJvbSgjZWU1ZjViKSx0bygjYzQzYzM1KSk7YmFja2dyb3VuZC1pbWFnZTotd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsI2VlNWY1YiwjYzQzYzM1KTtiYWNrZ3JvdW5kLWltYWdlOi1vLWxpbmVhci1ncmFkaWVudCh0b3AsI2VlNWY1YiwjYzQzYzM1KTtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sI2VlNWY1YiwjYzQzYzM1KTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDtmaWx0ZXI6cHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JzdHI9JyNmZmVlNWY1YicsZW5kQ29sb3JzdHI9JyNmZmM0M2MzNScsR3JhZGllbnRUeXBlPTApfS5wcm9ncmVzcy1kYW5nZXIucHJvZ3Jlc3Mtc3RyaXBlZCAuYmFyLC5wcm9ncmVzcy1zdHJpcGVkIC5iYXItZGFuZ2Vye2JhY2tncm91bmQtY29sb3I6I2VlNWY1YjtiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtZ3JhZGllbnQobGluZWFyLDAgMTAwJSwxMDAlIDAsY29sb3Itc3RvcCgwLjI1LHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkpLGNvbG9yLXN0b3AoMC4yNSx0cmFuc3BhcmVudCksY29sb3Itc3RvcCgwLjUsdHJhbnNwYXJlbnQpLGNvbG9yLXN0b3AoMC41LHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkpLGNvbG9yLXN0b3AoMC43NSxyZ2JhKDI1NSwyNTUsMjU1LDAuMTUpKSxjb2xvci1zdG9wKDAuNzUsdHJhbnNwYXJlbnQpLHRvKHRyYW5zcGFyZW50KSk7YmFja2dyb3VuZC1pbWFnZTotd2Via2l0LWxpbmVhci1ncmFkaWVudCg0NWRlZyxyZ2JhKDI1NSwyNTUsMjU1LDAuMTUpIDI1JSx0cmFuc3BhcmVudCAyNSUsdHJhbnNwYXJlbnQgNTAlLHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkgNTAlLHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkgNzUlLHRyYW5zcGFyZW50IDc1JSx0cmFuc3BhcmVudCk7YmFja2dyb3VuZC1pbWFnZTotbW96LWxpbmVhci1ncmFkaWVudCg0NWRlZyxyZ2JhKDI1NSwyNTUsMjU1LDAuMTUpIDI1JSx0cmFuc3BhcmVudCAyNSUsdHJhbnNwYXJlbnQgNTAlLHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkgNTAlLHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkgNzUlLHRyYW5zcGFyZW50IDc1JSx0cmFuc3BhcmVudCk7YmFja2dyb3VuZC1pbWFnZTotby1saW5lYXItZ3JhZGllbnQoNDVkZWcscmdiYSgyNTUsMjU1LDI1NSwwLjE1KSAyNSUsdHJhbnNwYXJlbnQgMjUlLHRyYW5zcGFyZW50IDUwJSxyZ2JhKDI1NSwyNTUsMjU1LDAuMTUpIDUwJSxyZ2JhKDI1NSwyNTUsMjU1LDAuMTUpIDc1JSx0cmFuc3BhcmVudCA3NSUsdHJhbnNwYXJlbnQpO2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KDQ1ZGVnLHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkgMjUlLHRyYW5zcGFyZW50IDI1JSx0cmFuc3BhcmVudCA1MCUscmdiYSgyNTUsMjU1LDI1NSwwLjE1KSA1MCUscmdiYSgyNTUsMjU1LDI1NSwwLjE1KSA3NSUsdHJhbnNwYXJlbnQgNzUlLHRyYW5zcGFyZW50KX0ucHJvZ3Jlc3Mtc3VjY2VzcyAuYmFyLC5wcm9ncmVzcyAuYmFyLXN1Y2Nlc3N7YmFja2dyb3VuZC1jb2xvcjojNWViOTVlO2JhY2tncm91bmQtaW1hZ2U6LW1vei1saW5lYXItZ3JhZGllbnQodG9wLCM2MmM0NjIsIzU3YTk1Nyk7YmFja2dyb3VuZC1pbWFnZTotd2Via2l0LWdyYWRpZW50KGxpbmVhciwwIDAsMCAxMDAlLGZyb20oIzYyYzQ2MiksdG8oIzU3YTk1NykpO2JhY2tncm91bmQtaW1hZ2U6LXdlYmtpdC1saW5lYXItZ3JhZGllbnQodG9wLCM2MmM0NjIsIzU3YTk1Nyk7YmFja2dyb3VuZC1pbWFnZTotby1saW5lYXItZ3JhZGllbnQodG9wLCM2MmM0NjIsIzU3YTk1Nyk7YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCM2MmM0NjIsIzU3YTk1Nyk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7ZmlsdGVyOnByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPScjZmY2MmM0NjInLGVuZENvbG9yc3RyPScjZmY1N2E5NTcnLEdyYWRpZW50VHlwZT0wKX0ucHJvZ3Jlc3Mtc3VjY2Vzcy5wcm9ncmVzcy1zdHJpcGVkIC5iYXIsLnByb2dyZXNzLXN0cmlwZWQgLmJhci1zdWNjZXNze2JhY2tncm91bmQtY29sb3I6IzYyYzQ2MjtiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtZ3JhZGllbnQobGluZWFyLDAgMTAwJSwxMDAlIDAsY29sb3Itc3RvcCgwLjI1LHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkpLGNvbG9yLXN0b3AoMC4yNSx0cmFuc3BhcmVudCksY29sb3Itc3RvcCgwLjUsdHJhbnNwYXJlbnQpLGNvbG9yLXN0b3AoMC41LHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkpLGNvbG9yLXN0b3AoMC43NSxyZ2JhKDI1NSwyNTUsMjU1LDAuMTUpKSxjb2xvci1zdG9wKDAuNzUsdHJhbnNwYXJlbnQpLHRvKHRyYW5zcGFyZW50KSk7YmFja2dyb3VuZC1pbWFnZTotd2Via2l0LWxpbmVhci1ncmFkaWVudCg0NWRlZyxyZ2JhKDI1NSwyNTUsMjU1LDAuMTUpIDI1JSx0cmFuc3BhcmVudCAyNSUsdHJhbnNwYXJlbnQgNTAlLHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkgNTAlLHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkgNzUlLHRyYW5zcGFyZW50IDc1JSx0cmFuc3BhcmVudCk7YmFja2dyb3VuZC1pbWFnZTotbW96LWxpbmVhci1ncmFkaWVudCg0NWRlZyxyZ2JhKDI1NSwyNTUsMjU1LDAuMTUpIDI1JSx0cmFuc3BhcmVudCAyNSUsdHJhbnNwYXJlbnQgNTAlLHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkgNTAlLHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkgNzUlLHRyYW5zcGFyZW50IDc1JSx0cmFuc3BhcmVudCk7YmFja2dyb3VuZC1pbWFnZTotby1saW5lYXItZ3JhZGllbnQoNDVkZWcscmdiYSgyNTUsMjU1LDI1NSwwLjE1KSAyNSUsdHJhbnNwYXJlbnQgMjUlLHRyYW5zcGFyZW50IDUwJSxyZ2JhKDI1NSwyNTUsMjU1LDAuMTUpIDUwJSxyZ2JhKDI1NSwyNTUsMjU1LDAuMTUpIDc1JSx0cmFuc3BhcmVudCA3NSUsdHJhbnNwYXJlbnQpO2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KDQ1ZGVnLHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkgMjUlLHRyYW5zcGFyZW50IDI1JSx0cmFuc3BhcmVudCA1MCUscmdiYSgyNTUsMjU1LDI1NSwwLjE1KSA1MCUscmdiYSgyNTUsMjU1LDI1NSwwLjE1KSA3NSUsdHJhbnNwYXJlbnQgNzUlLHRyYW5zcGFyZW50KX0ucHJvZ3Jlc3MtaW5mbyAuYmFyLC5wcm9ncmVzcyAuYmFyLWluZm97YmFja2dyb3VuZC1jb2xvcjojNGJiMWNmO2JhY2tncm91bmQtaW1hZ2U6LW1vei1saW5lYXItZ3JhZGllbnQodG9wLCM1YmMwZGUsIzMzOWJiOSk7YmFja2dyb3VuZC1pbWFnZTotd2Via2l0LWdyYWRpZW50KGxpbmVhciwwIDAsMCAxMDAlLGZyb20oIzViYzBkZSksdG8oIzMzOWJiOSkpO2JhY2tncm91bmQtaW1hZ2U6LXdlYmtpdC1saW5lYXItZ3JhZGllbnQodG9wLCM1YmMwZGUsIzMzOWJiOSk7YmFja2dyb3VuZC1pbWFnZTotby1saW5lYXItZ3JhZGllbnQodG9wLCM1YmMwZGUsIzMzOWJiOSk7YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCM1YmMwZGUsIzMzOWJiOSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7ZmlsdGVyOnByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPScjZmY1YmMwZGUnLGVuZENvbG9yc3RyPScjZmYzMzliYjknLEdyYWRpZW50VHlwZT0wKX0ucHJvZ3Jlc3MtaW5mby5wcm9ncmVzcy1zdHJpcGVkIC5iYXIsLnByb2dyZXNzLXN0cmlwZWQgLmJhci1pbmZve2JhY2tncm91bmQtY29sb3I6IzViYzBkZTtiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtZ3JhZGllbnQobGluZWFyLDAgMTAwJSwxMDAlIDAsY29sb3Itc3RvcCgwLjI1LHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkpLGNvbG9yLXN0b3AoMC4yNSx0cmFuc3BhcmVudCksY29sb3Itc3RvcCgwLjUsdHJhbnNwYXJlbnQpLGNvbG9yLXN0b3AoMC41LHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkpLGNvbG9yLXN0b3AoMC43NSxyZ2JhKDI1NSwyNTUsMjU1LDAuMTUpKSxjb2xvci1zdG9wKDAuNzUsdHJhbnNwYXJlbnQpLHRvKHRyYW5zcGFyZW50KSk7YmFja2dyb3VuZC1pbWFnZTotd2Via2l0LWxpbmVhci1ncmFkaWVudCg0NWRlZyxyZ2JhKDI1NSwyNTUsMjU1LDAuMTUpIDI1JSx0cmFuc3BhcmVudCAyNSUsdHJhbnNwYXJlbnQgNTAlLHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkgNTAlLHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkgNzUlLHRyYW5zcGFyZW50IDc1JSx0cmFuc3BhcmVudCk7YmFja2dyb3VuZC1pbWFnZTotbW96LWxpbmVhci1ncmFkaWVudCg0NWRlZyxyZ2JhKDI1NSwyNTUsMjU1LDAuMTUpIDI1JSx0cmFuc3BhcmVudCAyNSUsdHJhbnNwYXJlbnQgNTAlLHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkgNTAlLHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkgNzUlLHRyYW5zcGFyZW50IDc1JSx0cmFuc3BhcmVudCk7YmFja2dyb3VuZC1pbWFnZTotby1saW5lYXItZ3JhZGllbnQoNDVkZWcscmdiYSgyNTUsMjU1LDI1NSwwLjE1KSAyNSUsdHJhbnNwYXJlbnQgMjUlLHRyYW5zcGFyZW50IDUwJSxyZ2JhKDI1NSwyNTUsMjU1LDAuMTUpIDUwJSxyZ2JhKDI1NSwyNTUsMjU1LDAuMTUpIDc1JSx0cmFuc3BhcmVudCA3NSUsdHJhbnNwYXJlbnQpO2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KDQ1ZGVnLHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkgMjUlLHRyYW5zcGFyZW50IDI1JSx0cmFuc3BhcmVudCA1MCUscmdiYSgyNTUsMjU1LDI1NSwwLjE1KSA1MCUscmdiYSgyNTUsMjU1LDI1NSwwLjE1KSA3NSUsdHJhbnNwYXJlbnQgNzUlLHRyYW5zcGFyZW50KX0ucHJvZ3Jlc3Mtd2FybmluZyAuYmFyLC5wcm9ncmVzcyAuYmFyLXdhcm5pbmd7YmFja2dyb3VuZC1jb2xvcjojZmFhNzMyO2JhY2tncm91bmQtaW1hZ2U6LW1vei1saW5lYXItZ3JhZGllbnQodG9wLCNmYmI0NTAsI2Y4OTQwNik7YmFja2dyb3VuZC1pbWFnZTotd2Via2l0LWdyYWRpZW50KGxpbmVhciwwIDAsMCAxMDAlLGZyb20oI2ZiYjQ1MCksdG8oI2Y4OTQwNikpO2JhY2tncm91bmQtaW1hZ2U6LXdlYmtpdC1saW5lYXItZ3JhZGllbnQodG9wLCNmYmI0NTAsI2Y4OTQwNik7YmFja2dyb3VuZC1pbWFnZTotby1saW5lYXItZ3JhZGllbnQodG9wLCNmYmI0NTAsI2Y4OTQwNik7YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCNmYmI0NTAsI2Y4OTQwNik7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7ZmlsdGVyOnByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPScjZmZmYmI0NTAnLGVuZENvbG9yc3RyPScjZmZmODk0MDYnLEdyYWRpZW50VHlwZT0wKX0ucHJvZ3Jlc3Mtd2FybmluZy5wcm9ncmVzcy1zdHJpcGVkIC5iYXIsLnByb2dyZXNzLXN0cmlwZWQgLmJhci13YXJuaW5ne2JhY2tncm91bmQtY29sb3I6I2ZiYjQ1MDtiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtZ3JhZGllbnQobGluZWFyLDAgMTAwJSwxMDAlIDAsY29sb3Itc3RvcCgwLjI1LHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkpLGNvbG9yLXN0b3AoMC4yNSx0cmFuc3BhcmVudCksY29sb3Itc3RvcCgwLjUsdHJhbnNwYXJlbnQpLGNvbG9yLXN0b3AoMC41LHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkpLGNvbG9yLXN0b3AoMC43NSxyZ2JhKDI1NSwyNTUsMjU1LDAuMTUpKSxjb2xvci1zdG9wKDAuNzUsdHJhbnNwYXJlbnQpLHRvKHRyYW5zcGFyZW50KSk7YmFja2dyb3VuZC1pbWFnZTotd2Via2l0LWxpbmVhci1ncmFkaWVudCg0NWRlZyxyZ2JhKDI1NSwyNTUsMjU1LDAuMTUpIDI1JSx0cmFuc3BhcmVudCAyNSUsdHJhbnNwYXJlbnQgNTAlLHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkgNTAlLHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkgNzUlLHRyYW5zcGFyZW50IDc1JSx0cmFuc3BhcmVudCk7YmFja2dyb3VuZC1pbWFnZTotbW96LWxpbmVhci1ncmFkaWVudCg0NWRlZyxyZ2JhKDI1NSwyNTUsMjU1LDAuMTUpIDI1JSx0cmFuc3BhcmVudCAyNSUsdHJhbnNwYXJlbnQgNTAlLHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkgNTAlLHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkgNzUlLHRyYW5zcGFyZW50IDc1JSx0cmFuc3BhcmVudCk7YmFja2dyb3VuZC1pbWFnZTotby1saW5lYXItZ3JhZGllbnQoNDVkZWcscmdiYSgyNTUsMjU1LDI1NSwwLjE1KSAyNSUsdHJhbnNwYXJlbnQgMjUlLHRyYW5zcGFyZW50IDUwJSxyZ2JhKDI1NSwyNTUsMjU1LDAuMTUpIDUwJSxyZ2JhKDI1NSwyNTUsMjU1LDAuMTUpIDc1JSx0cmFuc3BhcmVudCA3NSUsdHJhbnNwYXJlbnQpO2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KDQ1ZGVnLHJnYmEoMjU1LDI1NSwyNTUsMC4xNSkgMjUlLHRyYW5zcGFyZW50IDI1JSx0cmFuc3BhcmVudCA1MCUscmdiYSgyNTUsMjU1LDI1NSwwLjE1KSA1MCUscmdiYSgyNTUsMjU1LDI1NSwwLjE1KSA3NSUsdHJhbnNwYXJlbnQgNzUlLHRyYW5zcGFyZW50KX0uYWNjb3JkaW9ue21hcmdpbi1ib3R0b206MjBweH0uYWNjb3JkaW9uLWdyb3Vwe21hcmdpbi1ib3R0b206MnB4O2JvcmRlcjoxcHggc29saWQgI2U1ZTVlNTstd2Via2l0LWJvcmRlci1yYWRpdXM6NHB4Oy1tb3otYm9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyLXJhZGl1czo0cHh9LmFjY29yZGlvbi1oZWFkaW5ne2JvcmRlci1ib3R0b206MH0uYWNjb3JkaW9uLWhlYWRpbmcgLmFjY29yZGlvbi10b2dnbGV7ZGlzcGxheTpibG9jaztwYWRkaW5nOjhweCAxNXB4fS5hY2NvcmRpb24tdG9nZ2xle2N1cnNvcjpwb2ludGVyfS5hY2NvcmRpb24taW5uZXJ7cGFkZGluZzo5cHggMTVweDtib3JkZXItdG9wOjFweCBzb2xpZCAjZTVlNWU1fS5jYXJvdXNlbHtwb3NpdGlvbjpyZWxhdGl2ZTttYXJnaW4tYm90dG9tOjIwcHg7bGluZS1oZWlnaHQ6MX0uY2Fyb3VzZWwtaW5uZXJ7cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6MTAwJTtvdmVyZmxvdzpoaWRkZW59LmNhcm91c2VsLWlubmVyPi5pdGVte3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6bm9uZTstd2Via2l0LXRyYW5zaXRpb246LjZzIGVhc2UtaW4tb3V0IGxlZnQ7LW1vei10cmFuc2l0aW9uOi42cyBlYXNlLWluLW91dCBsZWZ0Oy1vLXRyYW5zaXRpb246LjZzIGVhc2UtaW4tb3V0IGxlZnQ7dHJhbnNpdGlvbjouNnMgZWFzZS1pbi1vdXQgbGVmdH0uY2Fyb3VzZWwtaW5uZXI+Lml0ZW0+aW1nLC5jYXJvdXNlbC1pbm5lcj4uaXRlbT5hPmltZ3tkaXNwbGF5OmJsb2NrO2xpbmUtaGVpZ2h0OjF9LmNhcm91c2VsLWlubmVyPi5hY3RpdmUsLmNhcm91c2VsLWlubmVyPi5uZXh0LC5jYXJvdXNlbC1pbm5lcj4ucHJldntkaXNwbGF5OmJsb2NrfS5jYXJvdXNlbC1pbm5lcj4uYWN0aXZle2xlZnQ6MH0uY2Fyb3VzZWwtaW5uZXI+Lm5leHQsLmNhcm91c2VsLWlubmVyPi5wcmV2e3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO3dpZHRoOjEwMCV9LmNhcm91c2VsLWlubmVyPi5uZXh0e2xlZnQ6MTAwJX0uY2Fyb3VzZWwtaW5uZXI+LnByZXZ7bGVmdDotMTAwJX0uY2Fyb3VzZWwtaW5uZXI+Lm5leHQubGVmdCwuY2Fyb3VzZWwtaW5uZXI+LnByZXYucmlnaHR7bGVmdDowfS5jYXJvdXNlbC1pbm5lcj4uYWN0aXZlLmxlZnR7bGVmdDotMTAwJX0uY2Fyb3VzZWwtaW5uZXI+LmFjdGl2ZS5yaWdodHtsZWZ0OjEwMCV9LmNhcm91c2VsLWNvbnRyb2x7cG9zaXRpb246YWJzb2x1dGU7dG9wOjQwJTtsZWZ0OjE1cHg7d2lkdGg6NDBweDtoZWlnaHQ6NDBweDttYXJnaW4tdG9wOi0yMHB4O2ZvbnQtc2l6ZTo2MHB4O2ZvbnQtd2VpZ2h0OjEwMDtsaW5lLWhlaWdodDozMHB4O2NvbG9yOiNmZmY7dGV4dC1hbGlnbjpjZW50ZXI7YmFja2dyb3VuZDojMjIyO2JvcmRlcjozcHggc29saWQgI2ZmZjstd2Via2l0LWJvcmRlci1yYWRpdXM6MjNweDstbW96LWJvcmRlci1yYWRpdXM6MjNweDtib3JkZXItcmFkaXVzOjIzcHg7b3BhY2l0eTouNTtmaWx0ZXI6YWxwaGEob3BhY2l0eT01MCl9LmNhcm91c2VsLWNvbnRyb2wucmlnaHR7cmlnaHQ6MTVweDtsZWZ0OmF1dG99LmNhcm91c2VsLWNvbnRyb2w6aG92ZXIsLmNhcm91c2VsLWNvbnRyb2w6Zm9jdXN7Y29sb3I6I2ZmZjt0ZXh0LWRlY29yYXRpb246bm9uZTtvcGFjaXR5Oi45O2ZpbHRlcjphbHBoYShvcGFjaXR5PTkwKX0uY2Fyb3VzZWwtaW5kaWNhdG9yc3twb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTVweDtyaWdodDoxNXB4O3otaW5kZXg6NTttYXJnaW46MDtsaXN0LXN0eWxlOm5vbmV9LmNhcm91c2VsLWluZGljYXRvcnMgbGl7ZGlzcGxheTpibG9jaztmbG9hdDpsZWZ0O3dpZHRoOjEwcHg7aGVpZ2h0OjEwcHg7bWFyZ2luLWxlZnQ6NXB4O3RleHQtaW5kZW50Oi05OTlweDtiYWNrZ3JvdW5kLWNvbG9yOiNjY2M7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LDAuMjUpO2JvcmRlci1yYWRpdXM6NXB4fS5jYXJvdXNlbC1pbmRpY2F0b3JzIC5hY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5jYXJvdXNlbC1jYXB0aW9ue3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjA7Ym90dG9tOjA7bGVmdDowO3BhZGRpbmc6MTVweDtiYWNrZ3JvdW5kOiMzMzM7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLDAuNzUpfS5jYXJvdXNlbC1jYXB0aW9uIGg0LC5jYXJvdXNlbC1jYXB0aW9uIHB7bGluZS1oZWlnaHQ6MjBweDtjb2xvcjojZmZmfS5jYXJvdXNlbC1jYXB0aW9uIGg0e21hcmdpbjowIDAgNXB4fS5jYXJvdXNlbC1jYXB0aW9uIHB7bWFyZ2luLWJvdHRvbTowfS5oZXJvLXVuaXR7cGFkZGluZzo2MHB4O21hcmdpbi1ib3R0b206MzBweDtmb250LXNpemU6MThweDtmb250LXdlaWdodDoyMDA7bGluZS1oZWlnaHQ6MzBweDtjb2xvcjppbmhlcml0O2JhY2tncm91bmQtY29sb3I6I2VlZTstd2Via2l0LWJvcmRlci1yYWRpdXM6NnB4Oy1tb3otYm9yZGVyLXJhZGl1czo2cHg7Ym9yZGVyLXJhZGl1czo2cHh9Lmhlcm8tdW5pdCBoMXttYXJnaW4tYm90dG9tOjA7Zm9udC1zaXplOjYwcHg7bGluZS1oZWlnaHQ6MTtsZXR0ZXItc3BhY2luZzotMXB4O2NvbG9yOmluaGVyaXR9Lmhlcm8tdW5pdCBsaXtsaW5lLWhlaWdodDozMHB4fS5wdWxsLXJpZ2h0e2Zsb2F0OnJpZ2h0fS5wdWxsLWxlZnR7ZmxvYXQ6bGVmdH0uaGlkZXtkaXNwbGF5Om5vbmV9LnNob3d7ZGlzcGxheTpibG9ja30uaW52aXNpYmxle3Zpc2liaWxpdHk6aGlkZGVufS5hZmZpeHtwb3NpdGlvbjpmaXhlZH0KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvY3NzL2RlZmF1bHQuY3NzIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9jc3MvZGVmYXVsdC5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NlM2UzMQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvY3NzL2RlZmF1bHQuY3NzCkBAIC0wLDAgKzEsMzMwIEBACisvKiBTdHlsZSB0aGUgWW9jdG8gUHJvamVjdCBsb2dvICovCisubG9nbyBpbWcgeyBoZWlnaHQ6IDMwcHg7IHdpZHRoOiBhdXRvICFpbXBvcnRhbnQ7IH0KKy5sb2dvIHsgcGFkZGluZy10b3A6IDRweCAhaW1wb3J0YW50OyBwYWRkaW5nLWJvdHRvbTowcHggIWltcG9ydGFudDsgfQorCisvKiBzdHlsZSB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworLmJyYW5kID4gYSB7IGNvbG9yOiAjNzc3OyB9CisuYnJhbmQgPiBhOmhvdmVyIHsgY29sb3I6ICM5OTk7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgfQorLmljb24taW5mby1zaWduIHsgY29sb3I6ICM3Nzc7IGZvbnQtc2l6ZTogMTZweDsgbWFyZ2luLWxlZnQ6IDVweDt9CisuaWNvbi1pbmZvLXNpZ246aG92ZXIgeyBjb2xvcjogIzk5OTsgY3Vyc29yOiBwb2ludGVyOyB9CisKKy8qIFN0eWxlIHRoZSBicmVhZGNydW1iICovCisuYnJlYWRjcnVtYiB7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7IH0KKy5icmVhZGNydW1iIGxpOmZpcnN0LWNoaWxkIHsgcGFkZGluZy1yaWdodDogMTBweDsgfQorCisvKiBTdHlsZXMgZm9yIHRoZSBoZWxwIGluZm9ybWF0aW9uICovCisuZ2V0LWhlbHAgeyBjb2xvcjogI0NDQ0NDQzsgfQorLmdldC1oZWxwOmhvdmVyLCAuaWNvbi1wbHVzLXNpZ246aG92ZXIgeyBjb2xvcjogIzk5OTk5OTsgY3Vyc29yOiBwb2ludGVyOyB9CisuZ2V0LWhlbHAtYmx1ZSB7IGNvbG9yOiAjM0E4N0FEOyB9CisuZ2V0LWhlbHAtYmx1ZTpob3ZlciB7IGNvbG9yOiAjMDA1NTgwOyBjdXJzb3I6IHBvaW50ZXI7IH0KKy5nZXQtaGVscC15ZWxsb3cgeyBjb2xvcjogI0MwOTg1MzsgfQorLmdldC1oZWxwLXllbGxvdzpob3ZlciB7IGNvbG9yOiAjQjM4OTQyOyBjdXJzb3I6IHBvaW50ZXI7IH0KKy5nZXQtaGVscC1yZWQgeyBjb2xvcjogI0I5NEE0ODsgZm9udC1zaXplOiAxNnB4OyBwYWRkaW5nLWxlZnQ6IDJweDsgfQorLmdldC1oZWxwLXJlZDpob3ZlciB7IGNvbG9yOiAjOTQzQTM4OyBjdXJzb3I6IHBvaW50ZXI7IH0KKy5idWlsZC1mb3JtPmk6Zmlyc3Qtb2YtdHlwZSB7IG1hcmdpbi1sZWZ0OiA1cHg7IH0KKy5tYW51YWwgeyBtYXJnaW46IDExcHggMTVweCAwIDExcHg7fQorLmhlYWRpbmctaGVscCB7IGZvbnQtc2l6ZTogMTRweDsgfQorCisvKiBTdHlsZXMgZm9yIHRoZSBleHRlcm5hbCBsaW5rICovCisuZ2V0LWluZm8geyBjb2xvcjogIzAwODhDQzsgfQorLmdldC1pbmZvOmhvdmVyIHsgY29sb3I6ICMwMDU1ODA7IGN1cnNvcjogcG9pbnRlcjsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyB9CisKKy8qIFN0eWxlcyBmb3IgY29kZSBhbmQgcHJlIHRhZ3MgKi8KK2NvZGUgeyBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsgYm9yZGVyOiBub25lOyBjb2xvcjogIzMzMzMzMzsgfQorZGQgY29kZSwgLmFsZXJ0IGNvZGUgeyB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7IHdvcmQtYnJlYWs6IGJyZWFrLWFsbDsgd29yZC13cmFwOiBicmVhay13b3JkOyB9CisuYWxlcnQtd2FybmluZyBjb2RlLCAuYWxlcnQtd2FybmluZyBwcmUgeyBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsgYm9yZGVyOiBub25lOyBjb2xvcjogI0MwOTg1MzsgbWFyZ2luLWJvdHRvbTogMHB4OyB9CisuYWxlcnQtZXJyb3IgY29kZSB7IGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OyBib3JkZXI6IG5vbmU7IGNvbG9yOiAjQjk0QTQ4OyBtYXJnaW4tYm90dG9tOjBweDsgfQorLmFsZXJ0LWVycm9yIHByZSB7IGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OyBib3JkZXI6IG5vbmU7IGNvbG9yOiAjQjk0QTQ4OyB3b3JkLWJyZWFrOiBub3JtYWw7IG1hcmdpbi1ib3R0b206IDBweDsgfQorLmFsZXJ0LXdhcm5pbmcgcHJlIHsgd29yZC1icmVhazogbm9ybWFsOyB9CisuYWxlcnQtaW5mbyBhIHsgZm9udC13ZWlnaHQ6IDMwMDsgfQorLmFsZXJ0LWluZm8gY29kZSB7IGNvbG9yOiAjM0E4N0FEOyB9CisudG9vbHRpcCBjb2RlIHsgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7IGNvbG9yOiAjRkZGRkZGOyBmb250LXdlaWdodDogbm9ybWFsOyBib3JkZXI6IG5vbmU7IGZvbnQtc2l6ZTogMWVtOyB9CisKKy8qIFN0eWxlIGZvciBkZWZpbml0aW9uIGxpc3RzICovCitkZCB1bCB7IGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsgbWFyZ2luOiAwcHg7IH0KK2R0LCBkZCAge2xpbmUtaGVpZ2h0OiAyNXB4OyB9CitkZCBsaSB7IGxpbmUtaGVpZ2h0OiAyNXB4OyB9CisuaXRlbS1pbmZvIGRkIHsgbGluZS1oZWlnaHQ6IDIwcHg7IG1hcmdpbi1ib3R0b206IDEwcHg7IH0KKworLyogU3R5bGUgdGhlIGZpbHRlciBtb2RhbCBkaWFsb2dzICovCisubW9kYWwgeyB3aWR0aDogODAwcHg7IG1hcmdpbi1sZWZ0OiAtNDAwcHg7IH0KKy5tb2RhbC1mb290ZXIgLmJ0biB7IGZsb2F0OiBsZWZ0OyB9CisKKy8qIEhvdmVyIHN0eWxlIGZvciB0aGUgY2xlYXIgc2VhcmNoIGljb24gKi8KKy5pY29uLXJlbW92ZS1zaWduOmhvdmVyIHsgY29sb3I6ICM5OTk5OTk7IGN1cnNvcjogcG9pbnRlcjsgfQorCisvKiBTb21lIGV4dHJhIHNwYWNlIGJlZm9yZSBoZWFkaW5ncyB3aGVuIG5lZWRlZCAqLworLmRldGFpbHMgeyBtYXJnaW4tdG9wOiAzMHB4OyB9CisuYWlyIHsgbWFyZ2luLXRvcDogMzBweDsgfQorCisvKiBSZXF1aXJlZCBjbGFzc2VzIGZvciB0aGUgaGlnaGxpZ2h0IGJlaGF2aW91ciBpbiB0YWJsZXMgKi8KKy5oaWdobGlnaHQgeyAtd2Via2l0LWFuaW1hdGlvbjogdGFyZ2V0LWZhZGUgMTBzIDE7IC1tb3otYW5pbWF0aW9uOiB0YXJnZXQtZmFkZSAxMHMgMTsgYW5pbWF0aW9uOiB0YXJnZXQtZmFkZSAxMHMgMTsgfQorQC13ZWJraXQta2V5ZnJhbWVzIHRhcmdldC1mYWRlIHsgMCUgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjRDlFREY3OyB9IDI1JSB7IGJhY2tncm91bmQtY29sb3I6ICNEOUVERjc7IH0gMTAwJSB7IGJhY2tncm91bmQtY29sb3I6IHdoaXRlOyB9IH0KK0AtbW96LWtleWZyYW1lcyB0YXJnZXQtZmFkZSB7IDAlIHsgYmFja2dyb3VuZC1jb2xvcjogI0Q5RURGNzsgfSAyNSUgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjRDlFREY3OyB9IDEwMCUgeyBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsgfSB9CitAa2V5ZnJhbWVzIHRhcmdldC1mYWRlIHsgMCUgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjRDlFREY3OyB9IDI1JSB7IGJhY2tncm91bmQtY29sb3I6ICNEOUVERjc7IH0gMTAwJSB7IGJhY2tncm91bmQtY29sb3I6IHdoaXRlOyB9IH0KKworLyogVGhpcyBtYWtlcyB0b29sdGlwcyB3b3JrIGluc2lkZSBtb2RhbCBkaWFsb2dzICovCisudG9vbHRpcCB7IHotaW5kZXg6IDIwMDAgIWltcG9ydGFudDsgfQorCisvKiBPdmVycmlkZSBkZWZhdWx0IFR3aXR0ZXIgQm9vc3RyYXAgc3R5bGVzIGZvciBhbmNob3IgdGFncyBpbnNpZGUgdGFibGVzICovCit0ZCBhLCB0ZCBhID4gY29kZSB7IGNvbG9yOiAjMzMzMzMzOyB9Cit0ZCBjb2RlIHsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgfQordGQgYTpob3ZlciwgdGQgYSA+IGNvZGU6aG92ZXIgeyBjb2xvcjogIzAwMDAwMDsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0KKworLyogT3ZlcnJpZGUgZGVmYXVsdCBUd2l0dGVyIEJvb3RzdHJhcCBzdHlsZXMgZm9yIHRyLmVycm9yICovCisudGFibGUgdGJvZHkgdHIuZXJyb3IgPiB0ZCB7IGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OyB9IC8qIG92ZXJyaWRlIGRlZmF1bHQgQm9vdHN0cmFwIGJlaGF2aW91ciAqLworLnRhYmxlLWhvdmVyIHRib2R5IHRyLmVycm9yOmhvdmVyID4gdGQgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjRjVGNUY1O30gLyogb3ZlcnJpZGUgZGVmYXVsdCBCb290c3RyYXAgYmVoYXZpb3VyICovCisKKy8qIFJpZ2h0IGp1c3RpZnkgQm9vdHN0cmFwIHRhYmxlIGNvbHVtbnMgZm9yIHNpemUgZmllbGRzICovCisudGFibGUgLnNpemVjb2wgeyB0ZXh0LWFsaWduOiByaWdodDsgfQorCisvKiBTZXQgZXJyb3IsIHdhcm5pbmcsIHN1Y2Nlc3MgYW5kIG11dGVkIHN0eWxlcyAqLworLmVycm9yLCAucmVkLCB0ZC5lcnJvciBhLCB0ci5lcnJvciBhIHsgY29sb3I6ICNiOTRhNDg7IH0KK2EuZXJyb3I6aG92ZXIsIGEuZXJyb3I6Zm9jdXMsIHRyLmVycm9yIGE6aG92ZXIgeyBjb2xvcjogIzk0M0EzODsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0KKy53YXJuaW5nLCAueWVsbG93IHsgY29sb3I6ICNjMDk4NTM7fQorYS53YXJuaW5nIHsgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7IH0KK2Eud2FybmluZzpob3ZlciwgYS53YXJuaW5nOmZvY3VzIHsgY29sb3I6ICNCMzg5NDI7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9Cisuc3VjY2VzcywgLmdyZWVuIHsgY29sb3I6ICM0Njg4NDc7fQorLnN1Y2Nlc3M6aG92ZXIgeyBjb2xvcjogIzM0NzEzMjsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0KK3RkID4gLnN1Y2Nlc3M6aG92ZXIgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQorLm11dGVkIGEgeyBjb2xvcjojOTk5OTk5OyB9CisubXV0ZWQgYTpob3ZlciB7IGNvbG9yOiM5OTk5OTk7IH0KKworLyogU29ydGluZyBmdW5jdGlvbmFsaXR5IHN0eWxlcyBmb3IgdGFibGUgaGVhZGluZ3MgKi8KKy5zb3J0ZWQgeyBjb2xvcjogIzMzMzMzMzsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KKy5zb3J0ZWQ6aG92ZXIgeyBjb2xvcjogIzAwMDAwMDsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0KK3RoID4gYSwgdGggPiBzcGFuIHsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgfQorCisvKiBGb3JjZSBsb25nIHN0cmluZ3MgbGlrZSBjb21taXQgaGFzaGVzIHRvIHdyYXAgKi8KKy5pc2NvbW1pdCB7IHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgd29yZC1icmVhazogYnJlYWstYWxsOyB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7fQorCisvKiBNYWtlIHRoZSBwb3BvdmVycyBzY3JvbGxhYmxlIGlmIHRoZXkgYXJlIHRvbyBsb25nICovCisucG9wb3Zlci1jb250ZW50IHsgbWF4LWhlaWdodDogMzBlbTsgb3ZlcmZsb3cteTogc2Nyb2xsOyB9CisKKy8qIFN0eWxlcyBmb3IgdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgdGFibGUuIFdlJ2xsIHByb2JhYmx5IHdvbid0IHVzZSB0aG9zZSBpbiBwcm9kdWN0aW9uICovCisub25lIHsgcGFkZGluZy1sZWZ0OiAxOHB4ICFpbXBvcnRhbnQ7IH0KKy50d28geyBwYWRkaW5nLWxlZnQ6IDM2cHggIWltcG9ydGFudDsgfQorLnRocmVlIHsgcGFkZGluZy1sZWZ0OiA1NHB4ICFpbXBvcnRhbnQ7IH0KKy5jb250ZW50LWRpcmVjdG9yeSBhIHsgY29sb3I6ICMwMDg4Q0M7IH0KKy5jb250ZW50LWRpcmVjdG9yeSBhOmhvdmVyIHsgY29sb3I6ICMwMDU1ODA7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9Cisuc3ltbGluayB7IGNvbG9yOiAjQ0NDQ0NDOyB9CisKKy8qIFN0eWxlcyBmb3IgdGhlIG5hdmJhciBhY3Rpb25zICovCisuYnRuLWdyb3VwICsgLmJ0bi1ncm91cCB7IG1hcmdpbi1yaWdodDogMTBweDsgfQorLm5hdmJhci1pbm5lciA+IC5idG4tZ3JvdXAgeyBtYXJnaW4tdG9wOiA2cHg7IH0KKworLyogU3R5bGVzIGZvciB0aGUgcGFyZW50IGl0ZW0gaW4gdGhlIGxlZnQgbmF2aWdhdGlvbiAqLworCisubmF2ID4gbGkgPiBhLm5hdi1wYXJlbnQgeyBmb250LXNpemU6IDE4cHg7IGxpbmUtaGVpZ2h0OiAyNXB4OyAgfQorCisvKiBPdGhlciBzdHlsZXMgKi8KKy5kcm9wZG93bi1tZW51IHsgcGFkZGluZzogMTBweDsgfQorc2VsZWN0IHsgd2lkdGg6IGF1dG87IH0KKy5wYWdlLWhlYWRlciB7IGNvbG9yOiAjNUE1QTVBOyB9CisudG9wLWFpciB7IG1hcmdpbi10b3A6IDQwcHg7fQorLnByb2dyZXNzIHsgbWFyZ2luLWJvdHRvbTogMHB4OyB9CisubGVhZCAuYmFkZ2UgeyBmb250LXNpemU6IDE4cHg7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGJvcmRlci1yYWRpdXM6IDE1cHg7IHBhZGRpbmc6IDlweDsgfQorLmxlYWQgb2wsIC5sZWFkIHVsIHsgcGFkZGluZzogMTBweCAwIDAgMjBweDsgfQorLmxlYWQgb2wgPiBsaSwgLmxlYWQgdWwgPiBsaSB7CisgICAgbGluZS1oZWlnaHQ6IDM1cHg7Cit9Cisud2VsbCA+IC5sZWFkLCAuYWxlcnQgLmxlYWQgeyBtYXJnaW4tYm90dG9tOiAwcHg7IH0KKy53ZWxsLXRyYW5zcGFyZW50IHsgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7IH0KKy5uby1yZXN1bHRzIHsgbWFyZ2luOiAxMHB4IDA7IH0KKy50YXNrLW5hbWUgeyBtYXJnaW4tbGVmdDogN3B4OyB9CisuaWNvbi1oYW5kLXJpZ2h0IHtjb2xvcjogI0NDQ0NDQzsgfQorLmhlbHAtaW5saW5lIHsgbWFyZ2luOiA1cHg7IH0KKy5kYXNoYm9hcmQtc2VjdGlvbiB7IGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OyB9CisKKy8qIHN0eWxlcyBmb3IgbGFuZGluZyBwYWdlIC0gYW5hbHlzaXMgbW9kZSAqLworLmhlcm8tdW5pdCB7IG1hcmdpbjogMjBweCAwIDMwcHg7IH0KKy5oZXJvLXVuaXQgPiAuY2xvc2UgeyBmb250LXNpemU6NDBweDsgfQorLmhlcm8tYWN0aW9ucyB7IG1hcmdpbi10b3A6IDMwcHg7IH0KKworLyogc3R5bGVzIGZvciBsYW5kaW5nIHBhZ2UgLSBidWlsZCBtb2RlICovCisuaGVyby11bml0IHAgeyBsaW5lLWhlaWdodDogMjVweDsgfQorLmhlcm8tdW5pdCBwLCAuaGVyby11bml0IC5idG4tbGFyZ2UgeyBtYXJnaW4tdG9wOiAxNXB4OyB9CisuaGVyby11bml0IHVsIHsgbWFyZ2luLXRvcDogMjBweDsgfQorLmhlcm8tdW5pdCBsaSB7IGxpbmUtaGVpZ2h0OiAzMHB4OyB9CisuaGVyby11bml0IGltZyB7IGJhY2tncm91bmQtY29sb3I6ICNlZWU7IG1hcmdpbi10b3A6IDE1cHg7IH0KKworLyogbWFrZSB0YWJsZXMgQ2hyb21lLWhhcHB5IChtZSwgbm90IHNvIG11Y2gpICovCit0YWJsZSB7IHRhYmxlLWxheW91dDogZml4ZWQ7IHdvcmQtd3JhcDogYnJlYWstd29yZDsgfQorCisvKiBzdHlsZXMgZm9yIHRoZSBuZXcgYnVpbGQgYnV0dG9uICovCisubmV3LWJ1aWxkIC5idG4tcHJpbWFyeSB7IHBhZGRpbmc6IDRweCAzMHB4OyB9CisubmV3LWJ1aWxkIC5hbGVydCB7IG1hcmdpbi10b3A6IDEwcHg7IH0KKy5uZXctYnVpbGQgLmFsZXJ0IHAgeyBtYXJnaW4tdG9wOiAxMHB4OyB9CisKKy8qIHN0eWxlcyBmb3Igc2hvd2luZyB0aGUgcHJvamVjdCBuYW1lIGluIGJ1aWxkIG1vZGUgKi8KKy5wcm9qZWN0LW5hbWUgeyBwYWRkaW5nLXRvcDogMDsgfQorLnByb2plY3QtbmFtZSAubGFiZWwgeyBmb250LXdlaWdodDogbm9ybWFsOyBtYXJnaW4tYm90dG9tOiA1cHg7IG1hcmdpbi1sZWZ0OiAtMTVweDsgcGFkZGluZzogNXB4OyB9CisucHJvamVjdC1uYW1lIC5sYWJlbCA+IGEgeyBjb2xvcjogI2ZmZjsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgfQorCisvKiBSZW1vdmUgYm90dG9tIG1hcmdpbiBmb3IgZm9ybXMgaW5zaWRlIG1vZGFsIGRpYWxvZ3MgKi8KKyNkZXBlbmRlbmNpZXMtbW9kYWwtZm9ybSB7IG1hcmdpbi1ib3R0b206IDBweDsgfQorCisvKiBDb25maWd1cmF0aW9uIHN0eWxlcyAqLworLmljb24tdHJhc2ggeyBjb2xvcjogI0I5NEE0ODsgZm9udC1zaXplOiAxNnB4OyBwYWRkaW5nLWxlZnQ6IDVweDsgfQorLmljb24tdHJhc2g6aG92ZXIgeyBjb2xvcjogIzk0M0EzODsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBjdXJzb3I6IHBvaW50ZXI7IH0KKy5pY29uLXBlbmNpbCwgLmljb24tZG93bmxvYWQtYWx0LCAuaWNvbi1yZWZyZXNoLCAuaWNvbi1zdGFyLWVtcHR5LCAuaWNvbi1zdGFyICB7IGZvbnQtc2l6ZTogMTZweDsgY29sb3I6ICMwMDg4Q0M7IHBhZGRpbmctbGVmdDogMnB4OyB9CisuaWNvbi1wZW5jaWw6aG92ZXIsIC5pY29uLWRvd25sb2FkLWFsdDpob3ZlciwgLmljb24tcmVmcmVzaDpob3ZlciwgLmljb24tc3Rhci1lbXB0eTpob3ZlciwgLmljb24tc3Rhcjpob3ZlciwgLmljb24tdGFza3M6aG92ZXIgeyBjb2xvcjogIzAwNTU4MDsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBjdXJzb3I6IHBvaW50ZXI7IH0KKy5pY29uLXNoYXJlIHsgcGFkZGluZy1sZWZ0OiAycHg7IH0KKy5hbGVydC1zdWNjZXNzIC5pY29uLXJlZnJlc2gsIC5hbGVydC1zdWNjZXNzIC5pY29uLXRhc2tzIHsgY29sb3I6ICM0Njg4NDc7IH0KKy5hbGVydC1zdWNjZXNzIC5pY29uLXJlZnJlc2g6aG92ZXIsIC5hbGVydC1zdWNjZXNzIC5pY29uLXRhc2tzOmhvdmVyIHsgY29sb3I6ICMzNDcxMzI7IH0KKy5hbGVydC1lcnJvciAuaWNvbi1yZWZyZXNoLCAuYWxlcnQtZXJyb3IgLmljb24tdGFza3MgeyBjb2xvcjogI2I5NGE0ODsgfQorLmFsZXJ0LWVycm9yIC5pY29uLXJlZnJlc2g6aG92ZXIsIC5hbGVydC1lcnJvciAuaWNvbi10YXNrczpob3ZlciB7IGNvbG9yOiAjOTQzQTM4OyB9CisuY29uZmlndXJhdGlvbi1saXN0IGxpLCAuY29uZmlndXJhdGlvbi1saXN0IGxhYmVsIHsgbGluZS1oZWlnaHQ6IDM1cHg7IGZvbnQtc2l6ZTogMjFweDsgZm9udC13ZWlnaHQ6IDIwMDsgbWFyZ2luLWJvdHRvbTogMHB4O30KKy5jb25maWd1cmF0aW9uLWxpc3QgeyBmb250LXNpemU6IDE2cHg7IG1hcmdpbi1ib3R0b206IDEuNWVtOyB9CisuY29uZmlndXJhdGlvbi1saXN0IGkgeyBmb250LXNpemU6IDE2cHg7IH0KKy8qLmNvbmZpZ3VyYXRpb24tbGF5ZXJzIHsgaGVpZ2h0OiAxMzVweDsgb3ZlcmZsb3c6IHNjcm9sbDsgfSovCisuY291bnRlciB7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0KKy53ZWxsLWFsZXJ0IHsgYmFja2dyb3VuZC1jb2xvcjogI0ZDRjhFMzsgYm9yZGVyOiAxcHggc29saWQgI0ZCRUVENTsgYm9yZGVyLXJhZGl1czogNHB4OyB9Cisud2VsbC1hbGVydCA+IC5sZWFkIHsgY29sb3I6ICNDMDk4NTM7IHBhZGRpbmctYm90dG9tOiAuNzVlbTsgfQorLmNvbmZpZ3VyYXRpb24tYWxlcnQgeyBtYXJnaW4tYm90dG9tOiAwcHg7IHBhZGRpbmc6IDhweCAxNHB4OyB9CisuY29uZmlndXJhdGlvbi1hbGVydCBwIHsgbWFyZ2luLWJvdHRvbTogMHB4OyB9CisucHJvamVjdC1mb3JtIHsgbWFyZ2luLXRvcDogMTBweDsgfQorLmFkZC1sYXllcnMgLmJ0bi1ibG9jayArIC5idG4tYmxvY2ssIC5idWlsZCAuYnRuLWJsb2NrICsgLmJ0bi1ibG9jayB7IG1hcmdpbi10b3A6IDBweDsgfQoraW5wdXQuaHVnZSB7IGZvbnQtc2l6ZTogMTcuNXB4OyBwYWRkaW5nOiAxMXB4IDE5cHg7IH0KKy5idWlsZC1mb3JtIHsgbWFyZ2luLWJvdHRvbTogMHB4OyB9CisuYnVpbGQtZm9ybSAuaW5wdXQtYXBwZW5kIHsgbWFyZ2luLWJvdHRvbTogMHB4OyB9CisuYnVpbGQtZm9ybSAuYnRuLWxhcmdlIHsgcGFkZGluZzogMTFweCAzNXB4OyB9CisuYnVpbGQtZm9ybSBwIHsgZm9udC1zaXplOjE3LjVweCA7bWFyZ2luOjEycHggMCAwIDEwcHg7fQorI2xheWVyLWNvbnRhaW5lciBmb3JtLCAjdGFyZ2V0LWNvbnRhaW5lciBmb3JtIHsgbWFyZ2luLWJvdHRvbTogMHB4OyB9CisuYnRuLXByaW1hcnkgLmljb24tcXVlc3Rpb24tc2lnbiwgLmJ0bi1kYW5nZXIgLmljb24tcXVlc3Rpb24tc2lnbiB7IGNvbG9yOiAjZmZmOyB9CisuYnRuLXByaW1hcnkgLmljb24tcXVlc3Rpb24tc2lnbjpob3ZlciwgLmJ0bi1kYW5nZXIgLmljb24tcXVlc3Rpb24tc2lnbjpob3ZlciB7IGNvbG9yOiAjOTk5OyB9CithIGNvZGUgeyBjb2xvcjogIzAwODhDQzsgfQorYSBjb2RlOmhvdmVyIHsgY29sb3I6ICMwMDU1ODA7IH0KKy5sb2NhbGNvbmYgeyBmb250LXNpemU6IDE3LjVweDsgbWFyZ2luLXRvcDogNDBweDsgfQorLmxvY2FsY29uZiBjb2RlIHsgZm9udC1zaXplOiAxNy41cHg7IH0KKyNhZGQtbGF5ZXItZGVwZW5kZW5jaWVzIHsgIG1hcmdpbi10b3A6IDVweDsgfQorLmxpbmstYWN0aW9uIHsgZm9udC1zaXplOiAxNy41cHg7IG1hcmdpbi10b3A6IDQwcHg7IH0KKy5saW5rLWFjdGlvbiBjb2RlIHsgZm9udC1zaXplOiAxNy41cHg7IH0KKy5hcnRpZmFjdCB7IHdpZHRoOiA5ZW07IH0KKy5jb250cm9sLWdyb3VwIHsgbWFyZ2luLWJvdHRvbTogMHB4OyB9CisjcHJvamVjdC1kZXRhaWxzIGZvcm0geyBtYXJnaW46IDBweDsgfQorZGQgZm9ybSB7IG1hcmdpbjogMTBweCAwIDAgMDsgfQorZGwgdGV4dGFyZWEgeyByZXNpemU6IHZlcnRpY2FsOyB9CisubmF2YmFyLWZpeGVkLXRvcCB7ICB6LWluZGV4OiAxOyB9CisucG9wb3ZlciB7IHotaW5kZXg6IDI7IH0KKy5idG4tZGFuZ2VyIC5pY29uLXRyYXNoIHsgY29sb3I6ICNmZmY7IH0KKy5iYmFwcGVuZHMgeyBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7IG1hcmdpbi1sZWZ0OiAwOyB9CisuYmJhcHBlbmRzIGxpIHsgbGluZS1oZWlnaHQ6IDI1cHg7IH0KKy5jb25maWd1cmF0aW9uLWxpc3QgaW5wdXRbdHlwZT0iY2hlY2tib3giXSB7IG1hcmdpbi10b3A6MTNweDttYXJnaW4tcmlnaHQ6MTBweDsgfQorLmFsZXJ0IGlucHV0W3R5cGU9ImNoZWNrYm94Il0geyBtYXJnaW4tdG9wOiAwcHg7IG1hcmdpbi1yaWdodDogM3B4OyB9CisuYWxlcnQgb2wgeyBwYWRkaW5nOiAxMHB4IDBweCAwcHggMjBweDsgfQorLmFsZXJ0IG9sID4gbGkgeyBsaW5lLWhlaWdodDogMzVweDsgfQorLmRsLXZlcnRpY2FsIGZvcm0geyBtYXJnaW4tdG9wOiAxMHB4OyB9Cisuc2Nyb2xsaW5nIHsgYm9yZGVyOiAxcHggc29saWQgI2RkZGRkZDsgaGVpZ2h0OiAxNTRweDsgb3ZlcmZsb3c6IGF1dG87IHBhZGRpbmc6IDhweDsgd2lkdGg6IDI3LjUlOyBtYXJnaW4tYm90dG9tOiAxMHB4OyB9CisubGVhZCAuaGVscC1ibG9jayB7IGZvbnQtc2l6ZTogMTRweDsgbGluZS1oZWlnaHQ6IDIwcHg7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0KKy5idXR0b24tcGxhY2UgIC5idG4geyBtYXJnaW46IDAgMCAyMHB4IDA7IH0KKy50b29sdGlwLWlubmVyIHsgbWF4LXdpZHRoOiAyNTBweDsgfQorLm5ldy1idWlsZCB7IHBhZGRpbmc6IDIwcHg7IH0KKy5uZXctYnVpbGQgbGkgeyBsaW5lLWhlaWdodDogMzBweDsgfQorLm5ldy1idWlsZCBsaSAuYWxlcnQgeyBsaW5lLWhlaWdodDogMjBweDsgd2lkdGg6IDIwMHB4OyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB9CisubmV3LWJ1aWxkIGg2IHsgbWFyZ2luOiAxMHB4IDAgMCAwOyBjb2xvcjogIzVhNWE1YTsgfQorLm5ldy1idWlsZCBoMyB7IG1hcmdpbjogMDsgY29sb3I6ICM1YTVhNWE7IH0KKy5uZXctYnVpbGQgZm9ybSB7IG1hcmdpbjogNXB4IDAgMDsgfQorLm5ldy1idWlsZCAuaW5wdXQtYXBwZW5kIHsgbWFyZ2luLWJvdHRvbTogMDsgfQorI2J1aWxkLXNlbGVjdGVkIHsgbWFyZ2luLXRvcDogMTVweDsgfQorZGl2LmFkZC1kZXBzIHsgbWFyZ2luLXRvcDogMTVweDsgfQorLmJ0bi5sb2cgeyBtYXJnaW4tbGVmdDogMjBweDsgfQorCisKKy5hbmltYXRlLXJlcGVhdCB7CisgIGxpc3Qtc3R5bGU6bm9uZTsKKyAgYm94LXNpemluZzpib3JkZXItYm94OworfQorCisuYW5pbWF0ZS1yZXBlYXQubmctbW92ZSwKKy5hbmltYXRlLXJlcGVhdC5uZy1lbnRlciwKKy5hbmltYXRlLXJlcGVhdC5uZy1sZWF2ZSB7CisgIC13ZWJraXQtdHJhbnNpdGlvbjphbGwgbGluZWFyIDAuNXM7CisgIHRyYW5zaXRpb246YWxsIGxpbmVhciAwLjVzOworfQorCisuYW5pbWF0ZS1yZXBlYXQubmctbGVhdmUubmctbGVhdmUtYWN0aXZlLAorLmFuaW1hdGUtcmVwZWF0Lm5nLW1vdmUsCisuYW5pbWF0ZS1yZXBlYXQubmctZW50ZXIgeworICBvcGFjaXR5OjA7Cit9CisKKy5hbmltYXRlLXJlcGVhdC5uZy1sZWF2ZSwKKy5hbmltYXRlLXJlcGVhdC5uZy1lbnRlci5uZy1lbnRlci1hY3RpdmUgeworICBvcGFjaXR5OjE7Cit9CisKKy50YWItcGFuZSB0YWJsZSB7IG1hcmdpbi10b3A6IDEwcHg7IH0KKwordGhlYWQgLmRlc2NyaXB0aW9uLCAuZ2V0X2Rlc2NyaXB0aW9uX29yX3N1bW1hcnkgeyB3aWR0aDogMzY0cHg7IH0KK3RoZWFkIC5hZGQtZGVsLWxheWVycyB7IHdpZHRoOiAxMjRweDsgfQorCisjbG9hZGluZy1ub3RpZmljYXRpb24geworICBwb3NpdGlvbjogZml4ZWQ7CisgIHotaW5kZXg6IDEwMTsKKyAgdG9wOiAzJTsKKyAgbGVmdDogNDAlOworICByaWdodDogNDAlOworICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCAxMHB4ICNjMDk4NTM7CisgIC1tb3otYm94LXNoYWRvdzogMCAwIDEwcHggI2MwOTg1MzsKKyAgYm94LXNoYWRvdzogMCAwIDEwcHggI2MwOTg1MzsKK30KKworI2NoYW5nZS1ub3RpZmljYXRpb24geworICBwb3NpdGlvbjogZml4ZWQ7CisgIHotaW5kZXg6IDEwMTsKKyAgdG9wOiAzJTsKKyAgbGVmdDogMjAlOworICByaWdodDogMjAlOworICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCAxMHB4ICMzYTg3YWQ7CisgIC1tb3otYm94LXNoYWRvdzogMCAwIDEwcHggIzNhODdhZDsKKyAgYm94LXNoYWRvdzogMCAwIDEwcHggIzNhODdhZDsKK30KKworLyogQ29waWVkIGluIGZyb20gbmV3ZXIgdmVyc2lvbiBvZiBGb250LUF3ZXNvbWUgNC4zLjAgKi8KKy5mYS1zcGluIHsKKyAgLXdlYmtpdC1hbmltYXRpb246IGZhLXNwaW4gMnMgaW5maW5pdGUgbGluZWFyOworICBhbmltYXRpb246IGZhLXNwaW4gMnMgaW5maW5pdGUgbGluZWFyOworICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cit9CisuZmEtcHVsc2UgeworICAtd2Via2l0LWFuaW1hdGlvbjogZmEtc3BpbiAxcyBpbmZpbml0ZSBzdGVwcyg4KTsKKyAgYW5pbWF0aW9uOiBmYS1zcGluIDFzIGluZmluaXRlIHN0ZXBzKDgpOworICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cit9CisKK0Atd2Via2l0LWtleWZyYW1lcyBmYS1zcGluIHsKKyAgMCUgeworICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7CisgICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7CisgIH0KKyAgMTAwJSB7CisgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNTlkZWcpOworICAgIHRyYW5zZm9ybTogcm90YXRlKDM1OWRlZyk7CisgIH0KK30KKworQGtleWZyYW1lcyBmYS1zcGluIHsKKyAgMCUgeworICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7CisgICAgLW1vei10cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsKKyAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsKKyAgfQorICAxMDAlIHsKKyAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDM1OWRlZyk7CisgICAgLW1vei10cmFuc2Zvcm06IHJvdGF0ZSgzNTlkZWcpOworICAgIHRyYW5zZm9ybTogcm90YXRlKDM1OWRlZyk7CisgIH0KK30KKy8qIEVuZCBjb3BpZWQgaW4gZnJvbSBuZXdlciB2ZXJzaW9uIG9mIEZvbnQtQXdlc29tZSA0LjMuMCAqLworCisudG9wLXBhZGRlZCB7CisgIHBhZGRpbmctdG9wOiA2MHB4OworfQorCitpbnB1dC5pbnB1dC1sZyB7CisgIGZvbnQtc2l6ZTogMThweDsKKyAgaGVpZ2h0OiAyMnB4OworICBsaW5lLWhlaWdodDogMS4zMzMzMzsKKyAgcGFkZGluZzogMTBweCAxNnB4OworfQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9jc3MvZm9udC1hd2Vzb21lLm1pbi5jc3MgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mYTE1ZmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9jc3MvZm9udC1hd2Vzb21lLm1pbi5jc3MKQEAgLTAsMCArMSwzMyBAQAorLyohCisgKiAgRm9udCBBd2Vzb21lIDMuMC4yCisgKiAgdGhlIGljb25pYyBmb250IGRlc2lnbmVkIGZvciB1c2Ugd2l0aCBUd2l0dGVyIEJvb3RzdHJhcAorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBUaGUgZnVsbCBzdWl0ZSBvZiBwaWN0b2dyYXBoaWMgaWNvbnMsIGV4YW1wbGVzLCBhbmQgZG9jdW1lbnRhdGlvbgorICogIGNhbiBiZSBmb3VuZCBhdDogaHR0cDovL2ZvcnRhd2Vzb21lLmdpdGh1Yi5jb20vRm9udC1Bd2Vzb21lLworICoKKyAqICBMaWNlbnNlCisgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIC0gVGhlIEZvbnQgQXdlc29tZSBmb250IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBTSUwgT3BlbiBGb250IExpY2Vuc2UgLSBodHRwOi8vc2NyaXB0cy5zaWwub3JnL09GTAorICogIC0gRm9udCBBd2Vzb21lIENTUywgTEVTUywgYW5kIFNBU1MgZmlsZXMgYXJlIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSAtCisgKiAgICBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UuaHRtbAorICogIC0gVGhlIEZvbnQgQXdlc29tZSBwaWN0b2dyYW1zIGFyZSBsaWNlbnNlZCB1bmRlciB0aGUgQ0MgQlkgMy4wIExpY2Vuc2UgLSBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8zLjAvCisgKiAgLSBBdHRyaWJ1dGlvbiBpcyBubyBsb25nZXIgcmVxdWlyZWQgaW4gRm9udCBBd2Vzb21lIDMuMCwgYnV0IG11Y2ggYXBwcmVjaWF0ZWQ6CisgKiAgICAiRm9udCBBd2Vzb21lIGJ5IERhdmUgR2FuZHkgLSBodHRwOi8vZm9ydGF3ZXNvbWUuZ2l0aHViLmNvbS9Gb250LUF3ZXNvbWUiCisKKyAqICBDb250YWN0CisgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIEVtYWlsOiBkYXZlQGRhdmVnYW5keS5jb20KKyAqICBUd2l0dGVyOiBodHRwOi8vdHdpdHRlci5jb20vZm9ydGF3ZXNvX21lCisgKiAgV29yazogTGVhZCBQcm9kdWN0IERlc2lnbmVyIEAgaHR0cDovL2t5cnV1cy5jb20KKyAqLworCitAZm9udC1mYWNleworICBmb250LWZhbWlseTonRm9udEF3ZXNvbWUnOworICBzcmM6dXJsKCcuLi9mb250cy9mb250YXdlc29tZS13ZWJmb250LmVvdD92PTMuMC4xJyk7CisgIHNyYzp1cmwoJy4uL2ZvbnRzL2ZvbnRhd2Vzb21lLXdlYmZvbnQuZW90PyNpZWZpeCZ2PTMuMC4xJykgZm9ybWF0KCdlbWJlZGRlZC1vcGVudHlwZScpLAorICB1cmwoJy4uL2ZvbnRzL2ZvbnRhd2Vzb21lLXdlYmZvbnQud29mZj92PTMuMC4xJykgZm9ybWF0KCd3b2ZmJyksCisgIHVybCgnLi4vZm9udHMvZm9udGF3ZXNvbWUtd2ViZm9udC50dGY/dj0zLjAuMScpIGZvcm1hdCgndHJ1ZXR5cGUnKTsKKyAgZm9udC13ZWlnaHQ6bm9ybWFsOworICBmb250LXN0eWxlOm5vcm1hbCB9CisKK1tjbGFzc149Imljb24tIl0sW2NsYXNzKj0iIGljb24tIl17Zm9udC1mYW1pbHk6Rm9udEF3ZXNvbWU7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3R5bGU6bm9ybWFsO3RleHQtZGVjb3JhdGlvbjppbmhlcml0Oy13ZWJraXQtZm9udC1zbW9vdGhpbmc6YW50aWFsaWFzZWQ7ZGlzcGxheTppbmxpbmU7d2lkdGg6YXV0bztoZWlnaHQ6YXV0bztsaW5lLWhlaWdodDpub3JtYWw7dmVydGljYWwtYWxpZ246YmFzZWxpbmU7YmFja2dyb3VuZC1pbWFnZTpub25lO2JhY2tncm91bmQtcG9zaXRpb246MCAwO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdDttYXJnaW4tdG9wOjB9Lmljb24td2hpdGUsLm5hdi1waWxscz4uYWN0aXZlPmE+W2NsYXNzXj0iaWNvbi0iXSwubmF2LXBpbGxzPi5hY3RpdmU+YT5bY2xhc3MqPSIgaWNvbi0iXSwubmF2LWxpc3Q+LmFjdGl2ZT5hPltjbGFzc149Imljb24tIl0sLm5hdi1saXN0Pi5hY3RpdmU+YT5bY2xhc3MqPSIgaWNvbi0iXSwubmF2YmFyLWludmVyc2UgLm5hdj4uYWN0aXZlPmE+W2NsYXNzXj0iaWNvbi0iXSwubmF2YmFyLWludmVyc2UgLm5hdj4uYWN0aXZlPmE+W2NsYXNzKj0iIGljb24tIl0sLmRyb3Bkb3duLW1lbnU+bGk+YTpob3Zlcj5bY2xhc3NePSJpY29uLSJdLC5kcm9wZG93bi1tZW51PmxpPmE6aG92ZXI+W2NsYXNzKj0iIGljb24tIl0sLmRyb3Bkb3duLW1lbnU+LmFjdGl2ZT5hPltjbGFzc149Imljb24tIl0sLmRyb3Bkb3duLW1lbnU+LmFjdGl2ZT5hPltjbGFzcyo9IiBpY29uLSJdLC5kcm9wZG93bi1zdWJtZW51OmhvdmVyPmE+W2NsYXNzXj0iaWNvbi0iXSwuZHJvcGRvd24tc3VibWVudTpob3Zlcj5hPltjbGFzcyo9IiBpY29uLSJde2JhY2tncm91bmQtaW1hZ2U6bm9uZX1bY2xhc3NePSJpY29uLSJdOmJlZm9yZSxbY2xhc3MqPSIgaWNvbi0iXTpiZWZvcmV7dGV4dC1kZWNvcmF0aW9uOmluaGVyaXQ7ZGlzcGxheTppbmxpbmUtYmxvY2s7c3BlYWs6bm9uZX1hIFtjbGFzc149Imljb24tIl0sYSBbY2xhc3MqPSIgaWNvbi0iXXtkaXNwbGF5OmlubGluZS1ibG9ja30uaWNvbi1sYXJnZTpiZWZvcmV7dmVydGljYWwtYWxpZ246LTEwJTtmb250LXNpemU6MS4zMzMzMzMzMzMzMzMzMzMzZW19LmJ0biBbY2xhc3NePSJpY29uLSJdLC5uYXYgW2NsYXNzXj0iaWNvbi0iXSwuYnRuIFtjbGFzcyo9IiBpY29uLSJdLC5uYXYgW2NsYXNzKj0iIGljb24tIl17ZGlzcGxheTppbmxpbmV9LmJ0biBbY2xhc3NePSJpY29uLSJdLmljb24tbGFyZ2UsLm5hdiBbY2xhc3NePSJpY29uLSJdLmljb24tbGFyZ2UsLmJ0biBbY2xhc3MqPSIgaWNvbi0iXS5pY29uLWxhcmdlLC5uYXYgW2NsYXNzKj0iIGljb24tIl0uaWNvbi1sYXJnZXtsaW5lLWhlaWdodDouOWVtfS5idG4gW2NsYXNzXj0iaWNvbi0iXS5pY29uLXNwaW4sLm5hdiBbY2xhc3NePSJpY29uLSJdLmljb24tc3BpbiwuYnRuIFtjbGFzcyo9IiBpY29uLSJdLmljb24tc3BpbiwubmF2IFtjbGFzcyo9IiBpY29uLSJdLmljb24tc3BpbntkaXNwbGF5OmlubGluZS1ibG9ja30ubmF2LXRhYnMgW2NsYXNzXj0iaWNvbi0iXSwubmF2LXBpbGxzIFtjbGFzc149Imljb24tIl0sLm5hdi10YWJzIFtjbGFzcyo9IiBpY29uLSJdLC5uYXYtcGlsbHMgW2NsYXNzKj0iIGljb24tIl0sLm5hdi10YWJzIFtjbGFzc149Imljb24tIl0uaWNvbi1sYXJnZSwubmF2LXBpbGxzIFtjbGFzc149Imljb24tIl0uaWNvbi1sYXJnZSwubmF2LXRhYnMgW2NsYXNzKj0iIGljb24tIl0uaWNvbi1sYXJnZSwubmF2LXBpbGxzIFtjbGFzcyo9IiBpY29uLSJdLmljb24tbGFyZ2V7bGluZS1oZWlnaHQ6LjllbX1saSBbY2xhc3NePSJpY29uLSJdLC5uYXYgbGkgW2NsYXNzXj0iaWNvbi0iXSxsaSBbY2xhc3MqPSIgaWNvbi0iXSwubmF2IGxpIFtjbGFzcyo9IiBpY29uLSJde2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjEuMjVlbTt0ZXh0LWFsaWduOmNlbnRlcn1saSBbY2xhc3NePSJpY29uLSJdLmljb24tbGFyZ2UsLm5hdiBsaSBbY2xhc3NePSJpY29uLSJdLmljb24tbGFyZ2UsbGkgW2NsYXNzKj0iIGljb24tIl0uaWNvbi1sYXJnZSwubmF2IGxpIFtjbGFzcyo9IiBpY29uLSJdLmljb24tbGFyZ2V7d2lkdGg6MS41NjI1ZW19dWwuaWNvbnN7bGlzdC1zdHlsZS10eXBlOm5vbmU7dGV4dC1pbmRlbnQ6LTAuNzVlbX11bC5pY29ucyBsaSBbY2xhc3NePSJpY29uLSJdLHVsLmljb25zIGxpIFtjbGFzcyo9IiBpY29uLSJde3dpZHRoOi43NWVtfS5pY29uLW11dGVke2NvbG9yOiNlZWV9Lmljb24tYm9yZGVye2JvcmRlcjpzb2xpZCAxcHggI2VlZTtwYWRkaW5nOi4yZW0gLjI1ZW0gLjE1ZW07LXdlYmtpdC1ib3JkZXItcmFkaXVzOjNweDstbW96LWJvcmRlci1yYWRpdXM6M3B4O2JvcmRlci1yYWRpdXM6M3B4fS5pY29uLTJ4e2ZvbnQtc2l6ZToyZW19Lmljb24tMnguaWNvbi1ib3JkZXJ7Ym9yZGVyLXdpZHRoOjJweDstd2Via2l0LWJvcmRlci1yYWRpdXM6NHB4Oy1tb3otYm9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyLXJhZGl1czo0cHh9Lmljb24tM3h7Zm9udC1zaXplOjNlbX0uaWNvbi0zeC5pY29uLWJvcmRlcntib3JkZXItd2lkdGg6M3B4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czo1cHg7LW1vei1ib3JkZXItcmFkaXVzOjVweDtib3JkZXItcmFkaXVzOjVweH0uaWNvbi00eHtmb250LXNpemU6NGVtfS5pY29uLTR4Lmljb24tYm9yZGVye2JvcmRlci13aWR0aDo0cHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjZweDstbW96LWJvcmRlci1yYWRpdXM6NnB4O2JvcmRlci1yYWRpdXM6NnB4fS5wdWxsLXJpZ2h0e2Zsb2F0OnJpZ2h0fS5wdWxsLWxlZnR7ZmxvYXQ6bGVmdH1bY2xhc3NePSJpY29uLSJdLnB1bGwtbGVmdCxbY2xhc3MqPSIgaWNvbi0iXS5wdWxsLWxlZnR7bWFyZ2luLXJpZ2h0Oi4zZW19W2NsYXNzXj0iaWNvbi0iXS5wdWxsLXJpZ2h0LFtjbGFzcyo9IiBpY29uLSJdLnB1bGwtcmlnaHR7bWFyZ2luLWxlZnQ6LjNlbX0uYnRuIFtjbGFzc149Imljb24tIl0ucHVsbC1sZWZ0Lmljb24tMngsLmJ0biBbY2xhc3MqPSIgaWNvbi0iXS5wdWxsLWxlZnQuaWNvbi0yeCwuYnRuIFtjbGFzc149Imljb24tIl0ucHVsbC1yaWdodC5pY29uLTJ4LC5idG4gW2NsYXNzKj0iIGljb24tIl0ucHVsbC1yaWdodC5pY29uLTJ4e21hcmdpbi10b3A6LjE4ZW19LmJ0biBbY2xhc3NePSJpY29uLSJdLmljb24tc3Bpbi5pY29uLWxhcmdlLC5idG4gW2NsYXNzKj0iIGljb24tIl0uaWNvbi1zcGluLmljb24tbGFyZ2V7bGluZS1oZWlnaHQ6LjhlbX0uYnRuLmJ0bi1zbWFsbCBbY2xhc3NePSJpY29uLSJdLnB1bGwtbGVmdC5pY29uLTJ4LC5idG4uYnRuLXNtYWxsIFtjbGFzcyo9IiBpY29uLSJdLnB1bGwtbGVmdC5pY29uLTJ4LC5idG4uYnRuLXNtYWxsIFtjbGFzc149Imljb24tIl0ucHVsbC1yaWdodC5pY29uLTJ4LC5idG4uYnRuLXNtYWxsIFtjbGFzcyo9IiBpY29uLSJdLnB1bGwtcmlnaHQuaWNvbi0yeHttYXJnaW4tdG9wOi4yNWVtfS5idG4uYnRuLWxhcmdlIFtjbGFzc149Imljb24tIl0sLmJ0bi5idG4tbGFyZ2UgW2NsYXNzKj0iIGljb24tIl17bWFyZ2luLXRvcDowfS5idG4uYnRuLWxhcmdlIFtjbGFzc149Imljb24tIl0ucHVsbC1sZWZ0Lmljb24tMngsLmJ0bi5idG4tbGFyZ2UgW2NsYXNzKj0iIGljb24tIl0ucHVsbC1sZWZ0Lmljb24tMngsLmJ0bi5idG4tbGFyZ2UgW2NsYXNzXj0iaWNvbi0iXS5wdWxsLXJpZ2h0Lmljb24tMngsLmJ0bi5idG4tbGFyZ2UgW2NsYXNzKj0iIGljb24tIl0ucHVsbC1yaWdodC5pY29uLTJ4e21hcmdpbi10b3A6LjA1ZW19LmJ0bi5idG4tbGFyZ2UgW2NsYXNzXj0iaWNvbi0iXS5wdWxsLWxlZnQuaWNvbi0yeCwuYnRuLmJ0bi1sYXJnZSBbY2xhc3MqPSIgaWNvbi0iXS5wdWxsLWxlZnQuaWNvbi0yeHttYXJnaW4tcmlnaHQ6LjJlbX0uYnRuLmJ0bi1sYXJnZSBbY2xhc3NePSJpY29uLSJdLnB1bGwtcmlnaHQuaWNvbi0yeCwuYnRuLmJ0bi1sYXJnZSBbY2xhc3MqPSIgaWNvbi0iXS5wdWxsLXJpZ2h0Lmljb24tMnh7bWFyZ2luLWxlZnQ6LjJlbX0uaWNvbi1zcGlue2Rpc3BsYXk6aW5saW5lLWJsb2NrOy1tb3otYW5pbWF0aW9uOnNwaW4gMnMgaW5maW5pdGUgbGluZWFyOy1vLWFuaW1hdGlvbjpzcGluIDJzIGluZmluaXRlIGxpbmVhcjstd2Via2l0LWFuaW1hdGlvbjpzcGluIDJzIGluZmluaXRlIGxpbmVhcjthbmltYXRpb246c3BpbiAycyBpbmZpbml0ZSBsaW5lYXJ9QC1tb3ota2V5ZnJhbWVzIHNwaW57MCV7LW1vei10cmFuc2Zvcm06cm90YXRlKDBkZWcpfTEwMCV7LW1vei10cmFuc2Zvcm06cm90YXRlKDM1OWRlZyl9fUAtd2Via2l0LWtleWZyYW1lcyBzcGluezAley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgwZGVnKX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgzNTlkZWcpfX1ALW8ta2V5ZnJhbWVzIHNwaW57MCV7LW8tdHJhbnNmb3JtOnJvdGF0ZSgwZGVnKX0xMDAley1vLXRyYW5zZm9ybTpyb3RhdGUoMzU5ZGVnKX19QC1tcy1rZXlmcmFtZXMgc3BpbnswJXstbXMtdHJhbnNmb3JtOnJvdGF0ZSgwZGVnKX0xMDAley1tcy10cmFuc2Zvcm06cm90YXRlKDM1OWRlZyl9fUBrZXlmcmFtZXMgc3BpbnswJXt0cmFuc2Zvcm06cm90YXRlKDBkZWcpfTEwMCV7dHJhbnNmb3JtOnJvdGF0ZSgzNTlkZWcpfX1ALW1vei1kb2N1bWVudCB1cmwtcHJlZml4KCl7Lmljb24tc3BpbntoZWlnaHQ6LjllbX0uYnRuIC5pY29uLXNwaW57aGVpZ2h0OmF1dG99Lmljb24tc3Bpbi5pY29uLWxhcmdle2hlaWdodDoxLjI1ZW19LmJ0biAuaWNvbi1zcGluLmljb24tbGFyZ2V7aGVpZ2h0Oi43NWVtfX0uaWNvbi1nbGFzczpiZWZvcmV7Y29udGVudDoiXGYwMDAifS5pY29uLW11c2ljOmJlZm9yZXtjb250ZW50OiJcZjAwMSJ9Lmljb24tc2VhcmNoOmJlZm9yZXtjb250ZW50OiJcZjAwMiJ9Lmljb24tZW52ZWxvcGU6YmVmb3Jle2NvbnRlbnQ6IlxmMDAzIn0uaWNvbi1oZWFydDpiZWZvcmV7Y29udGVudDoiXGYwMDQifS5pY29uLXN0YXI6YmVmb3Jle2NvbnRlbnQ6IlxmMDA1In0uaWNvbi1zdGFyLWVtcHR5OmJlZm9yZXtjb250ZW50OiJcZjAwNiJ9Lmljb24tdXNlcjpiZWZvcmV7Y29udGVudDoiXGYwMDcifS5pY29uLWZpbG06YmVmb3Jle2NvbnRlbnQ6IlxmMDA4In0uaWNvbi10aC1sYXJnZTpiZWZvcmV7Y29udGVudDoiXGYwMDkifS5pY29uLXRoOmJlZm9yZXtjb250ZW50OiJcZjAwYSJ9Lmljb24tdGgtbGlzdDpiZWZvcmV7Y29udGVudDoiXGYwMGIifS5pY29uLW9rOmJlZm9yZXtjb250ZW50OiJcZjAwYyJ9Lmljb24tcmVtb3ZlOmJlZm9yZXtjb250ZW50OiJcZjAwZCJ9Lmljb24tem9vbS1pbjpiZWZvcmV7Y29udGVudDoiXGYwMGUifS5pY29uLXpvb20tb3V0OmJlZm9yZXtjb250ZW50OiJcZjAxMCJ9Lmljb24tb2ZmOmJlZm9yZXtjb250ZW50OiJcZjAxMSJ9Lmljb24tc2lnbmFsOmJlZm9yZXtjb250ZW50OiJcZjAxMiJ9Lmljb24tY29nOmJlZm9yZXtjb250ZW50OiJcZjAxMyJ9Lmljb24tdHJhc2g6YmVmb3Jle2NvbnRlbnQ6IlxmMDE0In0uaWNvbi1ob21lOmJlZm9yZXtjb250ZW50OiJcZjAxNSJ9Lmljb24tZmlsZTpiZWZvcmV7Y29udGVudDoiXGYwMTYifS5pY29uLXRpbWU6YmVmb3Jle2NvbnRlbnQ6IlxmMDE3In0uaWNvbi1yb2FkOmJlZm9yZXtjb250ZW50OiJcZjAxOCJ9Lmljb24tZG93bmxvYWQtYWx0OmJlZm9yZXtjb250ZW50OiJcZjAxOSJ9Lmljb24tZG93bmxvYWQ6YmVmb3Jle2NvbnRlbnQ6IlxmMDFhIn0uaWNvbi11cGxvYWQ6YmVmb3Jle2NvbnRlbnQ6IlxmMDFiIn0uaWNvbi1pbmJveDpiZWZvcmV7Y29udGVudDoiXGYwMWMifS5pY29uLXBsYXktY2lyY2xlOmJlZm9yZXtjb250ZW50OiJcZjAxZCJ9Lmljb24tcmVwZWF0OmJlZm9yZXtjb250ZW50OiJcZjAxZSJ9Lmljb24tcmVmcmVzaDpiZWZvcmV7Y29udGVudDoiXGYwMjEifS5pY29uLWxpc3QtYWx0OmJlZm9yZXtjb250ZW50OiJcZjAyMiJ9Lmljb24tbG9jazpiZWZvcmV7Y29udGVudDoiXGYwMjMifS5pY29uLWZsYWc6YmVmb3Jle2NvbnRlbnQ6IlxmMDI0In0uaWNvbi1oZWFkcGhvbmVzOmJlZm9yZXtjb250ZW50OiJcZjAyNSJ9Lmljb24tdm9sdW1lLW9mZjpiZWZvcmV7Y29udGVudDoiXGYwMjYifS5pY29uLXZvbHVtZS1kb3duOmJlZm9yZXtjb250ZW50OiJcZjAyNyJ9Lmljb24tdm9sdW1lLXVwOmJlZm9yZXtjb250ZW50OiJcZjAyOCJ9Lmljb24tcXJjb2RlOmJlZm9yZXtjb250ZW50OiJcZjAyOSJ9Lmljb24tYmFyY29kZTpiZWZvcmV7Y29udGVudDoiXGYwMmEifS5pY29uLXRhZzpiZWZvcmV7Y29udGVudDoiXGYwMmIifS5pY29uLXRhZ3M6YmVmb3Jle2NvbnRlbnQ6IlxmMDJjIn0uaWNvbi1ib29rOmJlZm9yZXtjb250ZW50OiJcZjAyZCJ9Lmljb24tYm9va21hcms6YmVmb3Jle2NvbnRlbnQ6IlxmMDJlIn0uaWNvbi1wcmludDpiZWZvcmV7Y29udGVudDoiXGYwMmYifS5pY29uLWNhbWVyYTpiZWZvcmV7Y29udGVudDoiXGYwMzAifS5pY29uLWZvbnQ6YmVmb3Jle2NvbnRlbnQ6IlxmMDMxIn0uaWNvbi1ib2xkOmJlZm9yZXtjb250ZW50OiJcZjAzMiJ9Lmljb24taXRhbGljOmJlZm9yZXtjb250ZW50OiJcZjAzMyJ9Lmljb24tdGV4dC1oZWlnaHQ6YmVmb3Jle2NvbnRlbnQ6IlxmMDM0In0uaWNvbi10ZXh0LXdpZHRoOmJlZm9yZXtjb250ZW50OiJcZjAzNSJ9Lmljb24tYWxpZ24tbGVmdDpiZWZvcmV7Y29udGVudDoiXGYwMzYifS5pY29uLWFsaWduLWNlbnRlcjpiZWZvcmV7Y29udGVudDoiXGYwMzcifS5pY29uLWFsaWduLXJpZ2h0OmJlZm9yZXtjb250ZW50OiJcZjAzOCJ9Lmljb24tYWxpZ24tanVzdGlmeTpiZWZvcmV7Y29udGVudDoiXGYwMzkifS5pY29uLWxpc3Q6YmVmb3Jle2NvbnRlbnQ6IlxmMDNhIn0uaWNvbi1pbmRlbnQtbGVmdDpiZWZvcmV7Y29udGVudDoiXGYwM2IifS5pY29uLWluZGVudC1yaWdodDpiZWZvcmV7Y29udGVudDoiXGYwM2MifS5pY29uLWZhY2V0aW1lLXZpZGVvOmJlZm9yZXtjb250ZW50OiJcZjAzZCJ9Lmljb24tcGljdHVyZTpiZWZvcmV7Y29udGVudDoiXGYwM2UifS5pY29uLXBlbmNpbDpiZWZvcmV7Y29udGVudDoiXGYwNDAifS5pY29uLW1hcC1tYXJrZXI6YmVmb3Jle2NvbnRlbnQ6IlxmMDQxIn0uaWNvbi1hZGp1c3Q6YmVmb3Jle2NvbnRlbnQ6IlxmMDQyIn0uaWNvbi10aW50OmJlZm9yZXtjb250ZW50OiJcZjA0MyJ9Lmljb24tZWRpdDpiZWZvcmV7Y29udGVudDoiXGYwNDQifS5pY29uLXNoYXJlOmJlZm9yZXtjb250ZW50OiJcZjA0NSJ9Lmljb24tY2hlY2s6YmVmb3Jle2NvbnRlbnQ6IlxmMDQ2In0uaWNvbi1tb3ZlOmJlZm9yZXtjb250ZW50OiJcZjA0NyJ9Lmljb24tc3RlcC1iYWNrd2FyZDpiZWZvcmV7Y29udGVudDoiXGYwNDgifS5pY29uLWZhc3QtYmFja3dhcmQ6YmVmb3Jle2NvbnRlbnQ6IlxmMDQ5In0uaWNvbi1iYWNrd2FyZDpiZWZvcmV7Y29udGVudDoiXGYwNGEifS5pY29uLXBsYXk6YmVmb3Jle2NvbnRlbnQ6IlxmMDRiIn0uaWNvbi1wYXVzZTpiZWZvcmV7Y29udGVudDoiXGYwNGMifS5pY29uLXN0b3A6YmVmb3Jle2NvbnRlbnQ6IlxmMDRkIn0uaWNvbi1mb3J3YXJkOmJlZm9yZXtjb250ZW50OiJcZjA0ZSJ9Lmljb24tZmFzdC1mb3J3YXJkOmJlZm9yZXtjb250ZW50OiJcZjA1MCJ9Lmljb24tc3RlcC1mb3J3YXJkOmJlZm9yZXtjb250ZW50OiJcZjA1MSJ9Lmljb24tZWplY3Q6YmVmb3Jle2NvbnRlbnQ6IlxmMDUyIn0uaWNvbi1jaGV2cm9uLWxlZnQ6YmVmb3Jle2NvbnRlbnQ6IlxmMDUzIn0uaWNvbi1jaGV2cm9uLXJpZ2h0OmJlZm9yZXtjb250ZW50OiJcZjA1NCJ9Lmljb24tcGx1cy1zaWduOmJlZm9yZXtjb250ZW50OiJcZjA1NSJ9Lmljb24tbWludXMtc2lnbjpiZWZvcmV7Y29udGVudDoiXGYwNTYifS5pY29uLXJlbW92ZS1zaWduOmJlZm9yZXtjb250ZW50OiJcZjA1NyJ9Lmljb24tb2stc2lnbjpiZWZvcmV7Y29udGVudDoiXGYwNTgifS5pY29uLXF1ZXN0aW9uLXNpZ246YmVmb3Jle2NvbnRlbnQ6IlxmMDU5In0uaWNvbi1pbmZvLXNpZ246YmVmb3Jle2NvbnRlbnQ6IlxmMDVhIn0uaWNvbi1zY3JlZW5zaG90OmJlZm9yZXtjb250ZW50OiJcZjA1YiJ9Lmljb24tcmVtb3ZlLWNpcmNsZTpiZWZvcmV7Y29udGVudDoiXGYwNWMifS5pY29uLW9rLWNpcmNsZTpiZWZvcmV7Y29udGVudDoiXGYwNWQifS5pY29uLWJhbi1jaXJjbGU6YmVmb3Jle2NvbnRlbnQ6IlxmMDVlIn0uaWNvbi1hcnJvdy1sZWZ0OmJlZm9yZXtjb250ZW50OiJcZjA2MCJ9Lmljb24tYXJyb3ctcmlnaHQ6YmVmb3Jle2NvbnRlbnQ6IlxmMDYxIn0uaWNvbi1hcnJvdy11cDpiZWZvcmV7Y29udGVudDoiXGYwNjIifS5pY29uLWFycm93LWRvd246YmVmb3Jle2NvbnRlbnQ6IlxmMDYzIn0uaWNvbi1zaGFyZS1hbHQ6YmVmb3Jle2NvbnRlbnQ6IlxmMDY0In0uaWNvbi1yZXNpemUtZnVsbDpiZWZvcmV7Y29udGVudDoiXGYwNjUifS5pY29uLXJlc2l6ZS1zbWFsbDpiZWZvcmV7Y29udGVudDoiXGYwNjYifS5pY29uLXBsdXM6YmVmb3Jle2NvbnRlbnQ6IlxmMDY3In0uaWNvbi1taW51czpiZWZvcmV7Y29udGVudDoiXGYwNjgifS5pY29uLWFzdGVyaXNrOmJlZm9yZXtjb250ZW50OiJcZjA2OSJ9Lmljb24tZXhjbGFtYXRpb24tc2lnbjpiZWZvcmV7Y29udGVudDoiXGYwNmEifS5pY29uLWdpZnQ6YmVmb3Jle2NvbnRlbnQ6IlxmMDZiIn0uaWNvbi1sZWFmOmJlZm9yZXtjb250ZW50OiJcZjA2YyJ9Lmljb24tZmlyZTpiZWZvcmV7Y29udGVudDoiXGYwNmQifS5pY29uLWV5ZS1vcGVuOmJlZm9yZXtjb250ZW50OiJcZjA2ZSJ9Lmljb24tZXllLWNsb3NlOmJlZm9yZXtjb250ZW50OiJcZjA3MCJ9Lmljb24td2FybmluZy1zaWduOmJlZm9yZXtjb250ZW50OiJcZjA3MSJ9Lmljb24tcGxhbmU6YmVmb3Jle2NvbnRlbnQ6IlxmMDcyIn0uaWNvbi1jYWxlbmRhcjpiZWZvcmV7Y29udGVudDoiXGYwNzMifS5pY29uLXJhbmRvbTpiZWZvcmV7Y29udGVudDoiXGYwNzQifS5pY29uLWNvbW1lbnQ6YmVmb3Jle2NvbnRlbnQ6IlxmMDc1In0uaWNvbi1tYWduZXQ6YmVmb3Jle2NvbnRlbnQ6IlxmMDc2In0uaWNvbi1jaGV2cm9uLXVwOmJlZm9yZXtjb250ZW50OiJcZjA3NyJ9Lmljb24tY2hldnJvbi1kb3duOmJlZm9yZXtjb250ZW50OiJcZjA3OCJ9Lmljb24tcmV0d2VldDpiZWZvcmV7Y29udGVudDoiXGYwNzkifS5pY29uLXNob3BwaW5nLWNhcnQ6YmVmb3Jle2NvbnRlbnQ6IlxmMDdhIn0uaWNvbi1mb2xkZXItY2xvc2U6YmVmb3Jle2NvbnRlbnQ6IlxmMDdiIn0uaWNvbi1mb2xkZXItb3BlbjpiZWZvcmV7Y29udGVudDoiXGYwN2MifS5pY29uLXJlc2l6ZS12ZXJ0aWNhbDpiZWZvcmV7Y29udGVudDoiXGYwN2QifS5pY29uLXJlc2l6ZS1ob3Jpem9udGFsOmJlZm9yZXtjb250ZW50OiJcZjA3ZSJ9Lmljb24tYmFyLWNoYXJ0OmJlZm9yZXtjb250ZW50OiJcZjA4MCJ9Lmljb24tdHdpdHRlci1zaWduOmJlZm9yZXtjb250ZW50OiJcZjA4MSJ9Lmljb24tZmFjZWJvb2stc2lnbjpiZWZvcmV7Y29udGVudDoiXGYwODIifS5pY29uLWNhbWVyYS1yZXRybzpiZWZvcmV7Y29udGVudDoiXGYwODMifS5pY29uLWtleTpiZWZvcmV7Y29udGVudDoiXGYwODQifS5pY29uLWNvZ3M6YmVmb3Jle2NvbnRlbnQ6IlxmMDg1In0uaWNvbi1jb21tZW50czpiZWZvcmV7Y29udGVudDoiXGYwODYifS5pY29uLXRodW1icy11cDpiZWZvcmV7Y29udGVudDoiXGYwODcifS5pY29uLXRodW1icy1kb3duOmJlZm9yZXtjb250ZW50OiJcZjA4OCJ9Lmljb24tc3Rhci1oYWxmOmJlZm9yZXtjb250ZW50OiJcZjA4OSJ9Lmljb24taGVhcnQtZW1wdHk6YmVmb3Jle2NvbnRlbnQ6IlxmMDhhIn0uaWNvbi1zaWdub3V0OmJlZm9yZXtjb250ZW50OiJcZjA4YiJ9Lmljb24tbGlua2VkaW4tc2lnbjpiZWZvcmV7Y29udGVudDoiXGYwOGMifS5pY29uLXB1c2hwaW46YmVmb3Jle2NvbnRlbnQ6IlxmMDhkIn0uaWNvbi1leHRlcm5hbC1saW5rOmJlZm9yZXtjb250ZW50OiJcZjA4ZSJ9Lmljb24tc2lnbmluOmJlZm9yZXtjb250ZW50OiJcZjA5MCJ9Lmljb24tdHJvcGh5OmJlZm9yZXtjb250ZW50OiJcZjA5MSJ9Lmljb24tZ2l0aHViLXNpZ246YmVmb3Jle2NvbnRlbnQ6IlxmMDkyIn0uaWNvbi11cGxvYWQtYWx0OmJlZm9yZXtjb250ZW50OiJcZjA5MyJ9Lmljb24tbGVtb246YmVmb3Jle2NvbnRlbnQ6IlxmMDk0In0uaWNvbi1waG9uZTpiZWZvcmV7Y29udGVudDoiXGYwOTUifS5pY29uLWNoZWNrLWVtcHR5OmJlZm9yZXtjb250ZW50OiJcZjA5NiJ9Lmljb24tYm9va21hcmstZW1wdHk6YmVmb3Jle2NvbnRlbnQ6IlxmMDk3In0uaWNvbi1waG9uZS1zaWduOmJlZm9yZXtjb250ZW50OiJcZjA5OCJ9Lmljb24tdHdpdHRlcjpiZWZvcmV7Y29udGVudDoiXGYwOTkifS5pY29uLWZhY2Vib29rOmJlZm9yZXtjb250ZW50OiJcZjA5YSJ9Lmljb24tZ2l0aHViOmJlZm9yZXtjb250ZW50OiJcZjA5YiJ9Lmljb24tdW5sb2NrOmJlZm9yZXtjb250ZW50OiJcZjA5YyJ9Lmljb24tY3JlZGl0LWNhcmQ6YmVmb3Jle2NvbnRlbnQ6IlxmMDlkIn0uaWNvbi1yc3M6YmVmb3Jle2NvbnRlbnQ6IlxmMDllIn0uaWNvbi1oZGQ6YmVmb3Jle2NvbnRlbnQ6IlxmMGEwIn0uaWNvbi1idWxsaG9ybjpiZWZvcmV7Y29udGVudDoiXGYwYTEifS5pY29uLWJlbGw6YmVmb3Jle2NvbnRlbnQ6IlxmMGEyIn0uaWNvbi1jZXJ0aWZpY2F0ZTpiZWZvcmV7Y29udGVudDoiXGYwYTMifS5pY29uLWhhbmQtcmlnaHQ6YmVmb3Jle2NvbnRlbnQ6IlxmMGE0In0uaWNvbi1oYW5kLWxlZnQ6YmVmb3Jle2NvbnRlbnQ6IlxmMGE1In0uaWNvbi1oYW5kLXVwOmJlZm9yZXtjb250ZW50OiJcZjBhNiJ9Lmljb24taGFuZC1kb3duOmJlZm9yZXtjb250ZW50OiJcZjBhNyJ9Lmljb24tY2lyY2xlLWFycm93LWxlZnQ6YmVmb3Jle2NvbnRlbnQ6IlxmMGE4In0uaWNvbi1jaXJjbGUtYXJyb3ctcmlnaHQ6YmVmb3Jle2NvbnRlbnQ6IlxmMGE5In0uaWNvbi1jaXJjbGUtYXJyb3ctdXA6YmVmb3Jle2NvbnRlbnQ6IlxmMGFhIn0uaWNvbi1jaXJjbGUtYXJyb3ctZG93bjpiZWZvcmV7Y29udGVudDoiXGYwYWIifS5pY29uLWdsb2JlOmJlZm9yZXtjb250ZW50OiJcZjBhYyJ9Lmljb24td3JlbmNoOmJlZm9yZXtjb250ZW50OiJcZjBhZCJ9Lmljb24tdGFza3M6YmVmb3Jle2NvbnRlbnQ6IlxmMGFlIn0uaWNvbi1maWx0ZXI6YmVmb3Jle2NvbnRlbnQ6IlxmMGIwIn0uaWNvbi1icmllZmNhc2U6YmVmb3Jle2NvbnRlbnQ6IlxmMGIxIn0uaWNvbi1mdWxsc2NyZWVuOmJlZm9yZXtjb250ZW50OiJcZjBiMiJ9Lmljb24tZ3JvdXA6YmVmb3Jle2NvbnRlbnQ6IlxmMGMwIn0uaWNvbi1saW5rOmJlZm9yZXtjb250ZW50OiJcZjBjMSJ9Lmljb24tY2xvdWQ6YmVmb3Jle2NvbnRlbnQ6IlxmMGMyIn0uaWNvbi1iZWFrZXI6YmVmb3Jle2NvbnRlbnQ6IlxmMGMzIn0uaWNvbi1jdXQ6YmVmb3Jle2NvbnRlbnQ6IlxmMGM0In0uaWNvbi1jb3B5OmJlZm9yZXtjb250ZW50OiJcZjBjNSJ9Lmljb24tcGFwZXItY2xpcDpiZWZvcmV7Y29udGVudDoiXGYwYzYifS5pY29uLXNhdmU6YmVmb3Jle2NvbnRlbnQ6IlxmMGM3In0uaWNvbi1zaWduLWJsYW5rOmJlZm9yZXtjb250ZW50OiJcZjBjOCJ9Lmljb24tcmVvcmRlcjpiZWZvcmV7Y29udGVudDoiXGYwYzkifS5pY29uLWxpc3QtdWw6YmVmb3Jle2NvbnRlbnQ6IlxmMGNhIn0uaWNvbi1saXN0LW9sOmJlZm9yZXtjb250ZW50OiJcZjBjYiJ9Lmljb24tc3RyaWtldGhyb3VnaDpiZWZvcmV7Y29udGVudDoiXGYwY2MifS5pY29uLXVuZGVybGluZTpiZWZvcmV7Y29udGVudDoiXGYwY2QifS5pY29uLXRhYmxlOmJlZm9yZXtjb250ZW50OiJcZjBjZSJ9Lmljb24tbWFnaWM6YmVmb3Jle2NvbnRlbnQ6IlxmMGQwIn0uaWNvbi10cnVjazpiZWZvcmV7Y29udGVudDoiXGYwZDEifS5pY29uLXBpbnRlcmVzdDpiZWZvcmV7Y29udGVudDoiXGYwZDIifS5pY29uLXBpbnRlcmVzdC1zaWduOmJlZm9yZXtjb250ZW50OiJcZjBkMyJ9Lmljb24tZ29vZ2xlLXBsdXMtc2lnbjpiZWZvcmV7Y29udGVudDoiXGYwZDQifS5pY29uLWdvb2dsZS1wbHVzOmJlZm9yZXtjb250ZW50OiJcZjBkNSJ9Lmljb24tbW9uZXk6YmVmb3Jle2NvbnRlbnQ6IlxmMGQ2In0uaWNvbi1jYXJldC1kb3duOmJlZm9yZXtjb250ZW50OiJcZjBkNyJ9Lmljb24tY2FyZXQtdXA6YmVmb3Jle2NvbnRlbnQ6IlxmMGQ4In0uaWNvbi1jYXJldC1sZWZ0OmJlZm9yZXtjb250ZW50OiJcZjBkOSJ9Lmljb24tY2FyZXQtcmlnaHQ6YmVmb3Jle2NvbnRlbnQ6IlxmMGRhIn0uaWNvbi1jb2x1bW5zOmJlZm9yZXtjb250ZW50OiJcZjBkYiJ9Lmljb24tc29ydDpiZWZvcmV7Y29udGVudDoiXGYwZGMifS5pY29uLXNvcnQtZG93bjpiZWZvcmV7Y29udGVudDoiXGYwZGQifS5pY29uLXNvcnQtdXA6YmVmb3Jle2NvbnRlbnQ6IlxmMGRlIn0uaWNvbi1lbnZlbG9wZS1hbHQ6YmVmb3Jle2NvbnRlbnQ6IlxmMGUwIn0uaWNvbi1saW5rZWRpbjpiZWZvcmV7Y29udGVudDoiXGYwZTEifS5pY29uLXVuZG86YmVmb3Jle2NvbnRlbnQ6IlxmMGUyIn0uaWNvbi1sZWdhbDpiZWZvcmV7Y29udGVudDoiXGYwZTMifS5pY29uLWRhc2hib2FyZDpiZWZvcmV7Y29udGVudDoiXGYwZTQifS5pY29uLWNvbW1lbnQtYWx0OmJlZm9yZXtjb250ZW50OiJcZjBlNSJ9Lmljb24tY29tbWVudHMtYWx0OmJlZm9yZXtjb250ZW50OiJcZjBlNiJ9Lmljb24tYm9sdDpiZWZvcmV7Y29udGVudDoiXGYwZTcifS5pY29uLXNpdGVtYXA6YmVmb3Jle2NvbnRlbnQ6IlxmMGU4In0uaWNvbi11bWJyZWxsYTpiZWZvcmV7Y29udGVudDoiXGYwZTkifS5pY29uLXBhc3RlOmJlZm9yZXtjb250ZW50OiJcZjBlYSJ9Lmljb24tbGlnaHRidWxiOmJlZm9yZXtjb250ZW50OiJcZjBlYiJ9Lmljb24tZXhjaGFuZ2U6YmVmb3Jle2NvbnRlbnQ6IlxmMGVjIn0uaWNvbi1jbG91ZC1kb3dubG9hZDpiZWZvcmV7Y29udGVudDoiXGYwZWQifS5pY29uLWNsb3VkLXVwbG9hZDpiZWZvcmV7Y29udGVudDoiXGYwZWUifS5pY29uLXVzZXItbWQ6YmVmb3Jle2NvbnRlbnQ6IlxmMGYwIn0uaWNvbi1zdGV0aG9zY29wZTpiZWZvcmV7Y29udGVudDoiXGYwZjEifS5pY29uLXN1aXRjYXNlOmJlZm9yZXtjb250ZW50OiJcZjBmMiJ9Lmljb24tYmVsbC1hbHQ6YmVmb3Jle2NvbnRlbnQ6IlxmMGYzIn0uaWNvbi1jb2ZmZWU6YmVmb3Jle2NvbnRlbnQ6IlxmMGY0In0uaWNvbi1mb29kOmJlZm9yZXtjb250ZW50OiJcZjBmNSJ9Lmljb24tZmlsZS1hbHQ6YmVmb3Jle2NvbnRlbnQ6IlxmMGY2In0uaWNvbi1idWlsZGluZzpiZWZvcmV7Y29udGVudDoiXGYwZjcifS5pY29uLWhvc3BpdGFsOmJlZm9yZXtjb250ZW50OiJcZjBmOCJ9Lmljb24tYW1idWxhbmNlOmJlZm9yZXtjb250ZW50OiJcZjBmOSJ9Lmljb24tbWVka2l0OmJlZm9yZXtjb250ZW50OiJcZjBmYSJ9Lmljb24tZmlnaHRlci1qZXQ6YmVmb3Jle2NvbnRlbnQ6IlxmMGZiIn0uaWNvbi1iZWVyOmJlZm9yZXtjb250ZW50OiJcZjBmYyJ9Lmljb24taC1zaWduOmJlZm9yZXtjb250ZW50OiJcZjBmZCJ9Lmljb24tcGx1cy1zaWduLWFsdDpiZWZvcmV7Y29udGVudDoiXGYwZmUifS5pY29uLWRvdWJsZS1hbmdsZS1sZWZ0OmJlZm9yZXtjb250ZW50OiJcZjEwMCJ9Lmljb24tZG91YmxlLWFuZ2xlLXJpZ2h0OmJlZm9yZXtjb250ZW50OiJcZjEwMSJ9Lmljb24tZG91YmxlLWFuZ2xlLXVwOmJlZm9yZXtjb250ZW50OiJcZjEwMiJ9Lmljb24tZG91YmxlLWFuZ2xlLWRvd246YmVmb3Jle2NvbnRlbnQ6IlxmMTAzIn0uaWNvbi1hbmdsZS1sZWZ0OmJlZm9yZXtjb250ZW50OiJcZjEwNCJ9Lmljb24tYW5nbGUtcmlnaHQ6YmVmb3Jle2NvbnRlbnQ6IlxmMTA1In0uaWNvbi1hbmdsZS11cDpiZWZvcmV7Y29udGVudDoiXGYxMDYifS5pY29uLWFuZ2xlLWRvd246YmVmb3Jle2NvbnRlbnQ6IlxmMTA3In0uaWNvbi1kZXNrdG9wOmJlZm9yZXtjb250ZW50OiJcZjEwOCJ9Lmljb24tbGFwdG9wOmJlZm9yZXtjb250ZW50OiJcZjEwOSJ9Lmljb24tdGFibGV0OmJlZm9yZXtjb250ZW50OiJcZjEwYSJ9Lmljb24tbW9iaWxlLXBob25lOmJlZm9yZXtjb250ZW50OiJcZjEwYiJ9Lmljb24tY2lyY2xlLWJsYW5rOmJlZm9yZXtjb250ZW50OiJcZjEwYyJ9Lmljb24tcXVvdGUtbGVmdDpiZWZvcmV7Y29udGVudDoiXGYxMGQifS5pY29uLXF1b3RlLXJpZ2h0OmJlZm9yZXtjb250ZW50OiJcZjEwZSJ9Lmljb24tc3Bpbm5lcjpiZWZvcmV7Y29udGVudDoiXGYxMTAifS5pY29uLWNpcmNsZTpiZWZvcmV7Y29udGVudDoiXGYxMTEifS5pY29uLXJlcGx5OmJlZm9yZXtjb250ZW50OiJcZjExMiJ9Lmljb24tZ2l0aHViLWFsdDpiZWZvcmV7Y29udGVudDoiXGYxMTMifS5pY29uLWZvbGRlci1jbG9zZS1hbHQ6YmVmb3Jle2NvbnRlbnQ6IlxmMTE0In0uaWNvbi1mb2xkZXItb3Blbi1hbHQ6YmVmb3Jle2NvbnRlbnQ6IlxmMTE1In0KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvY3NzL2ltYWdlcy91aS1iZ19kaWFnb25hbHMtdGhpY2tfMThfYjgxOTAwXzQweDQwLnBuZyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvY3NzL2ltYWdlcy91aS1iZ19kaWFnb25hbHMtdGhpY2tfMThfYjgxOTAwXzQweDQwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNWQ3OGEzCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9jc3MvaW1hZ2VzL3VpLWJnX2RpYWdvbmFscy10aGlja18xOF9iODE5MDBfNDB4NDAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvY3NzL2ltYWdlcy91aS1iZ19kaWFnb25hbHMtdGhpY2tfMjBfNjY2NjY2XzQweDQwLnBuZyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvY3NzL2ltYWdlcy91aS1iZ19kaWFnb25hbHMtdGhpY2tfMjBfNjY2NjY2XzQweDQwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xYjBhMDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9jc3MvaW1hZ2VzL3VpLWJnX2RpYWdvbmFscy10aGlja18yMF82NjY2NjZfNDB4NDAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvY3NzL2ltYWdlcy91aS1iZ19mbGF0XzEwXzAwMDAwMF80MHgxMDAucG5nIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9jc3MvaW1hZ2VzL3VpLWJnX2ZsYXRfMTBfMDAwMDAwXzQweDEwMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzU1ZjhlZgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvY3NzL2ltYWdlcy91aS1iZ19mbGF0XzEwXzAwMDAwMF80MHgxMDAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvY3NzL2ltYWdlcy91aS1iZ19nbGFzc18xMDBfZjZmNmY2XzF4NDAwLnBuZyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvY3NzL2ltYWdlcy91aS1iZ19nbGFzc18xMDBfZjZmNmY2XzF4NDAwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYTRmYTBmCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9jc3MvaW1hZ2VzL3VpLWJnX2dsYXNzXzEwMF9mNmY2ZjZfMXg0MDAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvY3NzL2ltYWdlcy91aS1iZ19nbGFzc18xMDBfZmRmNWNlXzF4NDAwLnBuZyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvY3NzL2ltYWdlcy91aS1iZ19nbGFzc18xMDBfZmRmNWNlXzF4NDAwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yZjU5ZTJkCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9jc3MvaW1hZ2VzL3VpLWJnX2dsYXNzXzEwMF9mZGY1Y2VfMXg0MDAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvY3NzL2ltYWdlcy91aS1iZ19nbGFzc182NV9mZmZmZmZfMXg0MDAucG5nIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9jc3MvaW1hZ2VzL3VpLWJnX2dsYXNzXzY1X2ZmZmZmZl8xeDQwMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjE3MmIzMAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvY3NzL2ltYWdlcy91aS1iZ19nbGFzc182NV9mZmZmZmZfMXg0MDAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvY3NzL2ltYWdlcy91aS1iZ19nbG9zcy13YXZlXzM1X2Y2YTgyOF81MDB4MTAwLnBuZyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvY3NzL2ltYWdlcy91aS1iZ19nbG9zcy13YXZlXzM1X2Y2YTgyOF81MDB4MTAwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDM5ZDU0Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9jc3MvaW1hZ2VzL3VpLWJnX2dsb3NzLXdhdmVfMzVfZjZhODI4XzUwMHgxMDAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvY3NzL2ltYWdlcy91aS1iZ19oaWdobGlnaHQtc29mdF8xMDBfZWVlZWVlXzF4MTAwLnBuZyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvY3NzL2ltYWdlcy91aS1iZ19oaWdobGlnaHQtc29mdF8xMDBfZWVlZWVlXzF4MTAwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMDg5YjcwCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9jc3MvaW1hZ2VzL3VpLWJnX2hpZ2hsaWdodC1zb2Z0XzEwMF9lZWVlZWVfMXgxMDAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvY3NzL2ltYWdlcy91aS1iZ19oaWdobGlnaHQtc29mdF83NV9mZmU0NWNfMXgxMDAucG5nIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9jc3MvaW1hZ2VzL3VpLWJnX2hpZ2hsaWdodC1zb2Z0Xzc1X2ZmZTQ1Y18xeDEwMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTYxYjdmOAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvY3NzL2ltYWdlcy91aS1iZ19oaWdobGlnaHQtc29mdF83NV9mZmU0NWNfMXgxMDAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvY3NzL2ltYWdlcy91aS1pY29uc18yMjIyMjJfMjU2eDI0MC5wbmcgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2Nzcy9pbWFnZXMvdWktaWNvbnNfMjIyMjIyXzI1NngyNDAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YzhlMTYKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2Nzcy9pbWFnZXMvdWktaWNvbnNfMjIyMjIyXzI1NngyNDAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvY3NzL2ltYWdlcy91aS1pY29uc18yMjhlZjFfMjU2eDI0MC5wbmcgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2Nzcy9pbWFnZXMvdWktaWNvbnNfMjI4ZWYxXzI1NngyNDAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNjhjNTQKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2Nzcy9pbWFnZXMvdWktaWNvbnNfMjI4ZWYxXzI1NngyNDAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvY3NzL2ltYWdlcy91aS1pY29uc19lZjhjMDhfMjU2eDI0MC5wbmcgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2Nzcy9pbWFnZXMvdWktaWNvbnNfZWY4YzA4XzI1NngyNDAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YmJmZTgKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2Nzcy9pbWFnZXMvdWktaWNvbnNfZWY4YzA4XzI1NngyNDAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvY3NzL2ltYWdlcy91aS1pY29uc19mZmQyN2FfMjU2eDI0MC5wbmcgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2Nzcy9pbWFnZXMvdWktaWNvbnNfZmZkMjdhXzI1NngyNDAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MzViNDkKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2Nzcy9pbWFnZXMvdWktaWNvbnNfZmZkMjdhXzI1NngyNDAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvY3NzL2ltYWdlcy91aS1pY29uc19mZmZmZmZfMjU2eDI0MC5wbmcgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2Nzcy9pbWFnZXMvdWktaWNvbnNfZmZmZmZmXzI1NngyNDAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNjZmNTkKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2Nzcy9pbWFnZXMvdWktaWNvbnNfZmZmZmZmXzI1NngyNDAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvY3NzL2pxdWVyeS11aS5taW4uY3NzIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9jc3MvanF1ZXJ5LXVpLm1pbi5jc3MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzQ4NmVjMAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvY3NzL2pxdWVyeS11aS5taW4uY3NzCkBAIC0wLDAgKzEsNyBAQAorLyohIGpRdWVyeSBVSSAtIHYxLjExLjQgLSAyMDE1LTAzLTE3CisqIGh0dHA6Ly9qcXVlcnl1aS5jb20KKyogSW5jbHVkZXM6IGNvcmUuY3NzLCBkYXRlcGlja2VyLmNzcywgdGhlbWUuY3NzCisqIFRvIHZpZXcgYW5kIG1vZGlmeSB0aGlzIHRoZW1lLCB2aXNpdCBodHRwOi8vanF1ZXJ5dWkuY29tL3RoZW1lcm9sbGVyLz9mZkRlZmF1bHQ9VHJlYnVjaGV0JTIwTVMlMkNUYWhvbWElMkNWZXJkYW5hJTJDQXJpYWwlMkNzYW5zLXNlcmlmJmZ3RGVmYXVsdD1ib2xkJmZzRGVmYXVsdD0xLjFlbSZjb3JuZXJSYWRpdXM9NHB4JmJnQ29sb3JIZWFkZXI9ZjZhODI4JmJnVGV4dHVyZUhlYWRlcj1nbG9zc193YXZlJmJnSW1nT3BhY2l0eUhlYWRlcj0zNSZib3JkZXJDb2xvckhlYWRlcj1lNzhmMDgmZmNIZWFkZXI9ZmZmZmZmJmljb25Db2xvckhlYWRlcj1mZmZmZmYmYmdDb2xvckNvbnRlbnQ9ZWVlZWVlJmJnVGV4dHVyZUNvbnRlbnQ9aGlnaGxpZ2h0X3NvZnQmYmdJbWdPcGFjaXR5Q29udGVudD0xMDAmYm9yZGVyQ29sb3JDb250ZW50PWRkZGRkZCZmY0NvbnRlbnQ9MzMzMzMzJmljb25Db2xvckNvbnRlbnQ9MjIyMjIyJmJnQ29sb3JEZWZhdWx0PWY2ZjZmNiZiZ1RleHR1cmVEZWZhdWx0PWdsYXNzJmJnSW1nT3BhY2l0eURlZmF1bHQ9MTAwJmJvcmRlckNvbG9yRGVmYXVsdD1jY2NjY2MmZmNEZWZhdWx0PTFjOTRjNCZpY29uQ29sb3JEZWZhdWx0PWVmOGMwOCZiZ0NvbG9ySG92ZXI9ZmRmNWNlJmJnVGV4dHVyZUhvdmVyPWdsYXNzJmJnSW1nT3BhY2l0eUhvdmVyPTEwMCZib3JkZXJDb2xvckhvdmVyPWZiY2IwOSZmY0hvdmVyPWM3NzQwNSZpY29uQ29sb3JIb3Zlcj1lZjhjMDgmYmdDb2xvckFjdGl2ZT1mZmZmZmYmYmdUZXh0dXJlQWN0aXZlPWdsYXNzJmJnSW1nT3BhY2l0eUFjdGl2ZT02NSZib3JkZXJDb2xvckFjdGl2ZT1mYmQ4NTAmZmNBY3RpdmU9ZWI4ZjAwJmljb25Db2xvckFjdGl2ZT1lZjhjMDgmYmdDb2xvckhpZ2hsaWdodD1mZmU0NWMmYmdUZXh0dXJlSGlnaGxpZ2h0PWhpZ2hsaWdodF9zb2Z0JmJnSW1nT3BhY2l0eUhpZ2hsaWdodD03NSZib3JkZXJDb2xvckhpZ2hsaWdodD1mZWQyMmYmZmNIaWdobGlnaHQ9MzYzNjM2Jmljb25Db2xvckhpZ2hsaWdodD0yMjhlZjEmYmdDb2xvckVycm9yPWI4MTkwMCZiZ1RleHR1cmVFcnJvcj1kaWFnb25hbHNfdGhpY2smYmdJbWdPcGFjaXR5RXJyb3I9MTgmYm9yZGVyQ29sb3JFcnJvcj1jZDBhMGEmZmNFcnJvcj1mZmZmZmYmaWNvbkNvbG9yRXJyb3I9ZmZkMjdhJmJnQ29sb3JPdmVybGF5PTY2NjY2NiZiZ1RleHR1cmVPdmVybGF5PWRpYWdvbmFsc190aGljayZiZ0ltZ09wYWNpdHlPdmVybGF5PTIwJm9wYWNpdHlPdmVybGF5PTUwJmJnQ29sb3JTaGFkb3c9MDAwMDAwJmJnVGV4dHVyZVNoYWRvdz1mbGF0JmJnSW1nT3BhY2l0eVNoYWRvdz0xMCZvcGFjaXR5U2hhZG93PTIwJnRoaWNrbmVzc1NoYWRvdz01cHgmb2Zmc2V0VG9wU2hhZG93PS01cHgmb2Zmc2V0TGVmdFNoYWRvdz0tNXB4JmNvcm5lclJhZGl1c1NoYWRvdz01cHgKKyogQ29weXJpZ2h0IDIwMTUgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9yczsgTGljZW5zZWQgTUlUICovCisKKy51aS1oZWxwZXItaGlkZGVue2Rpc3BsYXk6bm9uZX0udWktaGVscGVyLWhpZGRlbi1hY2Nlc3NpYmxle2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4fS51aS1oZWxwZXItcmVzZXR7bWFyZ2luOjA7cGFkZGluZzowO2JvcmRlcjowO291dGxpbmU6MDtsaW5lLWhlaWdodDoxLjM7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Zm9udC1zaXplOjEwMCU7bGlzdC1zdHlsZTpub25lfS51aS1oZWxwZXItY2xlYXJmaXg6YmVmb3JlLC51aS1oZWxwZXItY2xlYXJmaXg6YWZ0ZXJ7Y29udGVudDoiIjtkaXNwbGF5OnRhYmxlO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZX0udWktaGVscGVyLWNsZWFyZml4OmFmdGVye2NsZWFyOmJvdGh9LnVpLWhlbHBlci1jbGVhcmZpeHttaW4taGVpZ2h0OjB9LnVpLWhlbHBlci16Zml4e3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7dG9wOjA7bGVmdDowO3Bvc2l0aW9uOmFic29sdXRlO29wYWNpdHk6MDtmaWx0ZXI6QWxwaGEoT3BhY2l0eT0wKX0udWktZnJvbnR7ei1pbmRleDoxMDB9LnVpLXN0YXRlLWRpc2FibGVke2N1cnNvcjpkZWZhdWx0IWltcG9ydGFudH0udWktaWNvbntkaXNwbGF5OmJsb2NrO3RleHQtaW5kZW50Oi05OTk5OXB4O292ZXJmbG93OmhpZGRlbjtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXR9LnVpLXdpZGdldC1vdmVybGF5e3Bvc2l0aW9uOmZpeGVkO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlfS51aS1kYXRlcGlja2Vye3dpZHRoOjE3ZW07cGFkZGluZzouMmVtIC4yZW0gMDtkaXNwbGF5Om5vbmV9LnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItaGVhZGVye3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6LjJlbSAwfS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLXByZXYsLnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItbmV4dHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MnB4O3dpZHRoOjEuOGVtO2hlaWdodDoxLjhlbX0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1wcmV2LWhvdmVyLC51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLW5leHQtaG92ZXJ7dG9wOjFweH0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1wcmV2e2xlZnQ6MnB4fS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLW5leHR7cmlnaHQ6MnB4fS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLXByZXYtaG92ZXJ7bGVmdDoxcHh9LnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItbmV4dC1ob3ZlcntyaWdodDoxcHh9LnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItcHJldiBzcGFuLC51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLW5leHQgc3BhbntkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6NTAlO21hcmdpbi1sZWZ0Oi04cHg7dG9wOjUwJTttYXJnaW4tdG9wOi04cHh9LnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItdGl0bGV7bWFyZ2luOjAgMi4zZW07bGluZS1oZWlnaHQ6MS44ZW07dGV4dC1hbGlnbjpjZW50ZXJ9LnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItdGl0bGUgc2VsZWN0e2ZvbnQtc2l6ZToxZW07bWFyZ2luOjFweCAwfS51aS1kYXRlcGlja2VyIHNlbGVjdC51aS1kYXRlcGlja2VyLW1vbnRoLC51aS1kYXRlcGlja2VyIHNlbGVjdC51aS1kYXRlcGlja2VyLXllYXJ7d2lkdGg6NDUlfS51aS1kYXRlcGlja2VyIHRhYmxle3dpZHRoOjEwMCU7Zm9udC1zaXplOi45ZW07Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO21hcmdpbjowIDAgLjRlbX0udWktZGF0ZXBpY2tlciB0aHtwYWRkaW5nOi43ZW0gLjNlbTt0ZXh0LWFsaWduOmNlbnRlcjtmb250LXdlaWdodDpib2xkO2JvcmRlcjowfS51aS1kYXRlcGlja2VyIHRke2JvcmRlcjowO3BhZGRpbmc6MXB4fS51aS1kYXRlcGlja2VyIHRkIHNwYW4sLnVpLWRhdGVwaWNrZXIgdGQgYXtkaXNwbGF5OmJsb2NrO3BhZGRpbmc6LjJlbTt0ZXh0LWFsaWduOnJpZ2h0O3RleHQtZGVjb3JhdGlvbjpub25lfS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLWJ1dHRvbnBhbmV7YmFja2dyb3VuZC1pbWFnZTpub25lO21hcmdpbjouN2VtIDAgMCAwO3BhZGRpbmc6MCAuMmVtO2JvcmRlci1sZWZ0OjA7Ym9yZGVyLXJpZ2h0OjA7Ym9yZGVyLWJvdHRvbTowfS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLWJ1dHRvbnBhbmUgYnV0dG9ue2Zsb2F0OnJpZ2h0O21hcmdpbjouNWVtIC4yZW0gLjRlbTtjdXJzb3I6cG9pbnRlcjtwYWRkaW5nOi4yZW0gLjZlbSAuM2VtIC42ZW07d2lkdGg6YXV0bztvdmVyZmxvdzp2aXNpYmxlfS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLWJ1dHRvbnBhbmUgYnV0dG9uLnVpLWRhdGVwaWNrZXItY3VycmVudHtmbG9hdDpsZWZ0fS51aS1kYXRlcGlja2VyLnVpLWRhdGVwaWNrZXItbXVsdGl7d2lkdGg6YXV0b30udWktZGF0ZXBpY2tlci1tdWx0aSAudWktZGF0ZXBpY2tlci1ncm91cHtmbG9hdDpsZWZ0fS51aS1kYXRlcGlja2VyLW11bHRpIC51aS1kYXRlcGlja2VyLWdyb3VwIHRhYmxle3dpZHRoOjk1JTttYXJnaW46MCBhdXRvIC40ZW19LnVpLWRhdGVwaWNrZXItbXVsdGktMiAudWktZGF0ZXBpY2tlci1ncm91cHt3aWR0aDo1MCV9LnVpLWRhdGVwaWNrZXItbXVsdGktMyAudWktZGF0ZXBpY2tlci1ncm91cHt3aWR0aDozMy4zJX0udWktZGF0ZXBpY2tlci1tdWx0aS00IC51aS1kYXRlcGlja2VyLWdyb3Vwe3dpZHRoOjI1JX0udWktZGF0ZXBpY2tlci1tdWx0aSAudWktZGF0ZXBpY2tlci1ncm91cC1sYXN0IC51aS1kYXRlcGlja2VyLWhlYWRlciwudWktZGF0ZXBpY2tlci1tdWx0aSAudWktZGF0ZXBpY2tlci1ncm91cC1taWRkbGUgLnVpLWRhdGVwaWNrZXItaGVhZGVye2JvcmRlci1sZWZ0LXdpZHRoOjB9LnVpLWRhdGVwaWNrZXItbXVsdGkgLnVpLWRhdGVwaWNrZXItYnV0dG9ucGFuZXtjbGVhcjpsZWZ0fS51aS1kYXRlcGlja2VyLXJvdy1icmVha3tjbGVhcjpib3RoO3dpZHRoOjEwMCU7Zm9udC1zaXplOjB9LnVpLWRhdGVwaWNrZXItcnRse2RpcmVjdGlvbjpydGx9LnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLXByZXZ7cmlnaHQ6MnB4O2xlZnQ6YXV0b30udWktZGF0ZXBpY2tlci1ydGwgLnVpLWRhdGVwaWNrZXItbmV4dHtsZWZ0OjJweDtyaWdodDphdXRvfS51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1wcmV2OmhvdmVye3JpZ2h0OjFweDtsZWZ0OmF1dG99LnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLW5leHQ6aG92ZXJ7bGVmdDoxcHg7cmlnaHQ6YXV0b30udWktZGF0ZXBpY2tlci1ydGwgLnVpLWRhdGVwaWNrZXItYnV0dG9ucGFuZXtjbGVhcjpyaWdodH0udWktZGF0ZXBpY2tlci1ydGwgLnVpLWRhdGVwaWNrZXItYnV0dG9ucGFuZSBidXR0b257ZmxvYXQ6bGVmdH0udWktZGF0ZXBpY2tlci1ydGwgLnVpLWRhdGVwaWNrZXItYnV0dG9ucGFuZSBidXR0b24udWktZGF0ZXBpY2tlci1jdXJyZW50LC51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1ncm91cHtmbG9hdDpyaWdodH0udWktZGF0ZXBpY2tlci1ydGwgLnVpLWRhdGVwaWNrZXItZ3JvdXAtbGFzdCAudWktZGF0ZXBpY2tlci1oZWFkZXIsLnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLWdyb3VwLW1pZGRsZSAudWktZGF0ZXBpY2tlci1oZWFkZXJ7Ym9yZGVyLXJpZ2h0LXdpZHRoOjA7Ym9yZGVyLWxlZnQtd2lkdGg6MXB4fS51aS13aWRnZXR7Zm9udC1mYW1pbHk6VHJlYnVjaGV0IE1TLFRhaG9tYSxWZXJkYW5hLEFyaWFsLHNhbnMtc2VyaWY7Zm9udC1zaXplOjEuMWVtfS51aS13aWRnZXQgLnVpLXdpZGdldHtmb250LXNpemU6MWVtfS51aS13aWRnZXQgaW5wdXQsLnVpLXdpZGdldCBzZWxlY3QsLnVpLXdpZGdldCB0ZXh0YXJlYSwudWktd2lkZ2V0IGJ1dHRvbntmb250LWZhbWlseTpUcmVidWNoZXQgTVMsVGFob21hLFZlcmRhbmEsQXJpYWwsc2Fucy1zZXJpZjtmb250LXNpemU6MWVtfS51aS13aWRnZXQtY29udGVudHtib3JkZXI6MXB4IHNvbGlkICNkZGQ7YmFja2dyb3VuZDojZWVlIHVybCgiaW1hZ2VzL3VpLWJnX2hpZ2hsaWdodC1zb2Z0XzEwMF9lZWVlZWVfMXgxMDAucG5nIikgNTAlIHRvcCByZXBlYXQteDtjb2xvcjojMzMzfS51aS13aWRnZXQtY29udGVudCBhe2NvbG9yOiMzMzN9LnVpLXdpZGdldC1oZWFkZXJ7Ym9yZGVyOjFweCBzb2xpZCAjZTc4ZjA4O2JhY2tncm91bmQ6I2Y2YTgyOCB1cmwoImltYWdlcy91aS1iZ19nbG9zcy13YXZlXzM1X2Y2YTgyOF81MDB4MTAwLnBuZyIpIDUwJSA1MCUgcmVwZWF0LXg7Y29sb3I6I2ZmZjtmb250LXdlaWdodDpib2xkfS51aS13aWRnZXQtaGVhZGVyIGF7Y29sb3I6I2ZmZn0udWktc3RhdGUtZGVmYXVsdCwudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWRlZmF1bHQsLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWRlZmF1bHR7Ym9yZGVyOjFweCBzb2xpZCAjY2NjO2JhY2tncm91bmQ6I2Y2ZjZmNiB1cmwoImltYWdlcy91aS1iZ19nbGFzc18xMDBfZjZmNmY2XzF4NDAwLnBuZyIpIDUwJSA1MCUgcmVwZWF0LXg7Zm9udC13ZWlnaHQ6Ym9sZDtjb2xvcjojMWM5NGM0fS51aS1zdGF0ZS1kZWZhdWx0IGEsLnVpLXN0YXRlLWRlZmF1bHQgYTpsaW5rLC51aS1zdGF0ZS1kZWZhdWx0IGE6dmlzaXRlZHtjb2xvcjojMWM5NGM0O3RleHQtZGVjb3JhdGlvbjpub25lfS51aS1zdGF0ZS1ob3ZlciwudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWhvdmVyLC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1ob3ZlciwudWktc3RhdGUtZm9jdXMsLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1mb2N1cywudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtZm9jdXN7Ym9yZGVyOjFweCBzb2xpZCAjZmJjYjA5O2JhY2tncm91bmQ6I2ZkZjVjZSB1cmwoImltYWdlcy91aS1iZ19nbGFzc18xMDBfZmRmNWNlXzF4NDAwLnBuZyIpIDUwJSA1MCUgcmVwZWF0LXg7Zm9udC13ZWlnaHQ6Ym9sZDtjb2xvcjojYzc3NDA1fS51aS1zdGF0ZS1ob3ZlciBhLC51aS1zdGF0ZS1ob3ZlciBhOmhvdmVyLC51aS1zdGF0ZS1ob3ZlciBhOmxpbmssLnVpLXN0YXRlLWhvdmVyIGE6dmlzaXRlZCwudWktc3RhdGUtZm9jdXMgYSwudWktc3RhdGUtZm9jdXMgYTpob3ZlciwudWktc3RhdGUtZm9jdXMgYTpsaW5rLC51aS1zdGF0ZS1mb2N1cyBhOnZpc2l0ZWR7Y29sb3I6I2M3NzQwNTt0ZXh0LWRlY29yYXRpb246bm9uZX0udWktc3RhdGUtYWN0aXZlLC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtYWN0aXZlLC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1hY3RpdmV7Ym9yZGVyOjFweCBzb2xpZCAjZmJkODUwO2JhY2tncm91bmQ6I2ZmZiB1cmwoImltYWdlcy91aS1iZ19nbGFzc182NV9mZmZmZmZfMXg0MDAucG5nIikgNTAlIDUwJSByZXBlYXQteDtmb250LXdlaWdodDpib2xkO2NvbG9yOiNlYjhmMDB9LnVpLXN0YXRlLWFjdGl2ZSBhLC51aS1zdGF0ZS1hY3RpdmUgYTpsaW5rLC51aS1zdGF0ZS1hY3RpdmUgYTp2aXNpdGVke2NvbG9yOiNlYjhmMDA7dGV4dC1kZWNvcmF0aW9uOm5vbmV9LnVpLXN0YXRlLWhpZ2hsaWdodCwudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWhpZ2hsaWdodCwudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtaGlnaGxpZ2h0e2JvcmRlcjoxcHggc29saWQgI2ZlZDIyZjtiYWNrZ3JvdW5kOiNmZmU0NWMgdXJsKCJpbWFnZXMvdWktYmdfaGlnaGxpZ2h0LXNvZnRfNzVfZmZlNDVjXzF4MTAwLnBuZyIpIDUwJSB0b3AgcmVwZWF0LXg7Y29sb3I6IzM2MzYzNn0udWktc3RhdGUtaGlnaGxpZ2h0IGEsLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1oaWdobGlnaHQgYSwudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtaGlnaGxpZ2h0IGF7Y29sb3I6IzM2MzYzNn0udWktc3RhdGUtZXJyb3IsLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1lcnJvciwudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtZXJyb3J7Ym9yZGVyOjFweCBzb2xpZCAjY2QwYTBhO2JhY2tncm91bmQ6I2I4MTkwMCB1cmwoImltYWdlcy91aS1iZ19kaWFnb25hbHMtdGhpY2tfMThfYjgxOTAwXzQweDQwLnBuZyIpIDUwJSA1MCUgcmVwZWF0O2NvbG9yOiNmZmZ9LnVpLXN0YXRlLWVycm9yIGEsLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1lcnJvciBhLC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1lcnJvciBhe2NvbG9yOiNmZmZ9LnVpLXN0YXRlLWVycm9yLXRleHQsLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1lcnJvci10ZXh0LC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1lcnJvci10ZXh0e2NvbG9yOiNmZmZ9LnVpLXByaW9yaXR5LXByaW1hcnksLnVpLXdpZGdldC1jb250ZW50IC51aS1wcmlvcml0eS1wcmltYXJ5LC51aS13aWRnZXQtaGVhZGVyIC51aS1wcmlvcml0eS1wcmltYXJ5e2ZvbnQtd2VpZ2h0OmJvbGR9LnVpLXByaW9yaXR5LXNlY29uZGFyeSwudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXByaW9yaXR5LXNlY29uZGFyeSwudWktd2lkZ2V0LWhlYWRlciAudWktcHJpb3JpdHktc2Vjb25kYXJ5e29wYWNpdHk6Ljc7ZmlsdGVyOkFscGhhKE9wYWNpdHk9NzApO2ZvbnQtd2VpZ2h0Om5vcm1hbH0udWktc3RhdGUtZGlzYWJsZWQsLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1kaXNhYmxlZCwudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtZGlzYWJsZWR7b3BhY2l0eTouMzU7ZmlsdGVyOkFscGhhKE9wYWNpdHk9MzUpO2JhY2tncm91bmQtaW1hZ2U6bm9uZX0udWktc3RhdGUtZGlzYWJsZWQgLnVpLWljb257ZmlsdGVyOkFscGhhKE9wYWNpdHk9MzUpfS51aS1pY29ue3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHh9LnVpLWljb24sLnVpLXdpZGdldC1jb250ZW50IC51aS1pY29ue2JhY2tncm91bmQtaW1hZ2U6dXJsKCJpbWFnZXMvdWktaWNvbnNfMjIyMjIyXzI1NngyNDAucG5nIil9LnVpLXdpZGdldC1oZWFkZXIgLnVpLWljb257YmFja2dyb3VuZC1pbWFnZTp1cmwoImltYWdlcy91aS1pY29uc19mZmZmZmZfMjU2eDI0MC5wbmciKX0udWktc3RhdGUtZGVmYXVsdCAudWktaWNvbntiYWNrZ3JvdW5kLWltYWdlOnVybCgiaW1hZ2VzL3VpLWljb25zX2VmOGMwOF8yNTZ4MjQwLnBuZyIpfS51aS1zdGF0ZS1ob3ZlciAudWktaWNvbiwudWktc3RhdGUtZm9jdXMgLnVpLWljb257YmFja2dyb3VuZC1pbWFnZTp1cmwoImltYWdlcy91aS1pY29uc19lZjhjMDhfMjU2eDI0MC5wbmciKX0udWktc3RhdGUtYWN0aXZlIC51aS1pY29ue2JhY2tncm91bmQtaW1hZ2U6dXJsKCJpbWFnZXMvdWktaWNvbnNfZWY4YzA4XzI1NngyNDAucG5nIil9LnVpLXN0YXRlLWhpZ2hsaWdodCAudWktaWNvbntiYWNrZ3JvdW5kLWltYWdlOnVybCgiaW1hZ2VzL3VpLWljb25zXzIyOGVmMV8yNTZ4MjQwLnBuZyIpfS51aS1zdGF0ZS1lcnJvciAudWktaWNvbiwudWktc3RhdGUtZXJyb3ItdGV4dCAudWktaWNvbntiYWNrZ3JvdW5kLWltYWdlOnVybCgiaW1hZ2VzL3VpLWljb25zX2ZmZDI3YV8yNTZ4MjQwLnBuZyIpfS51aS1pY29uLWJsYW5re2JhY2tncm91bmQtcG9zaXRpb246MTZweCAxNnB4fS51aS1pY29uLWNhcmF0LTEtbntiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgMH0udWktaWNvbi1jYXJhdC0xLW5le2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggMH0udWktaWNvbi1jYXJhdC0xLWV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAwfS51aS1pY29uLWNhcmF0LTEtc2V7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAwfS51aS1pY29uLWNhcmF0LTEtc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IDB9LnVpLWljb24tY2FyYXQtMS1zd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IDB9LnVpLWljb24tY2FyYXQtMS13e2JhY2tncm91bmQtcG9zaXRpb246LTk2cHggMH0udWktaWNvbi1jYXJhdC0xLW53e2JhY2tncm91bmQtcG9zaXRpb246LTExMnB4IDB9LnVpLWljb24tY2FyYXQtMi1uLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotMTI4cHggMH0udWktaWNvbi1jYXJhdC0yLWUtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNDRweCAwfS51aS1pY29uLXRyaWFuZ2xlLTEtbntiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTE2cHh9LnVpLWljb24tdHJpYW5nbGUtMS1uZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IC0xNnB4fS51aS1pY29uLXRyaWFuZ2xlLTEtZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IC0xNnB4fS51aS1pY29uLXRyaWFuZ2xlLTEtc2V7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtMTZweH0udWktaWNvbi10cmlhbmdsZS0xLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtMTZweH0udWktaWNvbi10cmlhbmdsZS0xLXN3e2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggLTE2cHh9LnVpLWljb24tdHJpYW5nbGUtMS13e2JhY2tncm91bmQtcG9zaXRpb246LTk2cHggLTE2cHh9LnVpLWljb24tdHJpYW5nbGUtMS1ud3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMTJweCAtMTZweH0udWktaWNvbi10cmlhbmdsZS0yLW4tc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMjhweCAtMTZweH0udWktaWNvbi10cmlhbmdsZS0yLWUtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNDRweCAtMTZweH0udWktaWNvbi1hcnJvdy0xLW57YmFja2dyb3VuZC1wb3NpdGlvbjowIC0zMnB4fS51aS1pY29uLWFycm93LTEtbmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAtMzJweH0udWktaWNvbi1hcnJvdy0xLWV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAtMzJweH0udWktaWNvbi1hcnJvdy0xLXNle2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTMycHh9LnVpLWljb24tYXJyb3ctMS1ze2JhY2tncm91bmQtcG9zaXRpb246LTY0cHggLTMycHh9LnVpLWljb24tYXJyb3ctMS1zd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC0zMnB4fS51aS1pY29uLWFycm93LTEtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi05NnB4IC0zMnB4fS51aS1pY29uLWFycm93LTEtbnd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTEycHggLTMycHh9LnVpLWljb24tYXJyb3ctMi1uLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotMTI4cHggLTMycHh9LnVpLWljb24tYXJyb3ctMi1uZS1zd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNDRweCAtMzJweH0udWktaWNvbi1hcnJvdy0yLWUtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNjBweCAtMzJweH0udWktaWNvbi1hcnJvdy0yLXNlLW53e2JhY2tncm91bmQtcG9zaXRpb246LTE3NnB4IC0zMnB4fS51aS1pY29uLWFycm93c3RvcC0xLW57YmFja2dyb3VuZC1wb3NpdGlvbjotMTkycHggLTMycHh9LnVpLWljb24tYXJyb3dzdG9wLTEtZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMDhweCAtMzJweH0udWktaWNvbi1hcnJvd3N0b3AtMS1ze2JhY2tncm91bmQtcG9zaXRpb246LTIyNHB4IC0zMnB4fS51aS1pY29uLWFycm93c3RvcC0xLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotMjQwcHggLTMycHh9LnVpLWljb24tYXJyb3d0aGljay0xLW57YmFja2dyb3VuZC1wb3NpdGlvbjowIC00OHB4fS51aS1pY29uLWFycm93dGhpY2stMS1uZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IC00OHB4fS51aS1pY29uLWFycm93dGhpY2stMS1le2JhY2tncm91bmQtcG9zaXRpb246LTMycHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGljay0xLXNle2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGljay0xLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrLTEtc3d7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrLTEtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi05NnB4IC00OHB4fS51aS1pY29uLWFycm93dGhpY2stMS1ud3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMTJweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrLTItbi1ze2JhY2tncm91bmQtcG9zaXRpb246LTEyOHB4IC00OHB4fS51aS1pY29uLWFycm93dGhpY2stMi1uZS1zd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNDRweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrLTItZS13e2JhY2tncm91bmQtcG9zaXRpb246LTE2MHB4IC00OHB4fS51aS1pY29uLWFycm93dGhpY2stMi1zZS1ud3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNzZweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrc3RvcC0xLW57YmFja2dyb3VuZC1wb3NpdGlvbjotMTkycHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGlja3N0b3AtMS1le2JhY2tncm91bmQtcG9zaXRpb246LTIwOHB4IC00OHB4fS51aS1pY29uLWFycm93dGhpY2tzdG9wLTEtc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMjRweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrc3RvcC0xLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotMjQwcHggLTQ4cHh9LnVpLWljb24tYXJyb3dyZXR1cm50aGljay0xLXd7YmFja2dyb3VuZC1wb3NpdGlvbjowIC02NHB4fS51aS1pY29uLWFycm93cmV0dXJudGhpY2stMS1ue2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTY0cHh9LnVpLWljb24tYXJyb3dyZXR1cm50aGljay0xLWV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAtNjRweH0udWktaWNvbi1hcnJvd3JldHVybnRoaWNrLTEtc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC02NHB4fS51aS1pY29uLWFycm93cmV0dXJuLTEtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC02NHB4fS51aS1pY29uLWFycm93cmV0dXJuLTEtbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC02NHB4fS51aS1pY29uLWFycm93cmV0dXJuLTEtZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi05NnB4IC02NHB4fS51aS1pY29uLWFycm93cmV0dXJuLTEtc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMTJweCAtNjRweH0udWktaWNvbi1hcnJvd3JlZnJlc2gtMS13e2JhY2tncm91bmQtcG9zaXRpb246LTEyOHB4IC02NHB4fS51aS1pY29uLWFycm93cmVmcmVzaC0xLW57YmFja2dyb3VuZC1wb3NpdGlvbjotMTQ0cHggLTY0cHh9LnVpLWljb24tYXJyb3dyZWZyZXNoLTEtZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNjBweCAtNjRweH0udWktaWNvbi1hcnJvd3JlZnJlc2gtMS1ze2JhY2tncm91bmQtcG9zaXRpb246LTE3NnB4IC02NHB4fS51aS1pY29uLWFycm93LTR7YmFja2dyb3VuZC1wb3NpdGlvbjowIC04MHB4fS51aS1pY29uLWFycm93LTQtZGlhZ3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IC04MHB4fS51aS1pY29uLWV4dGxpbmt7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAtODBweH0udWktaWNvbi1uZXd3aW57YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtODBweH0udWktaWNvbi1yZWZyZXNoe2JhY2tncm91bmQtcG9zaXRpb246LTY0cHggLTgwcHh9LnVpLWljb24tc2h1ZmZsZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC04MHB4fS51aS1pY29uLXRyYW5zZmVyLWUtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi05NnB4IC04MHB4fS51aS1pY29uLXRyYW5zZmVydGhpY2stZS13e2JhY2tncm91bmQtcG9zaXRpb246LTExMnB4IC04MHB4fS51aS1pY29uLWZvbGRlci1jb2xsYXBzZWR7YmFja2dyb3VuZC1wb3NpdGlvbjowIC05NnB4fS51aS1pY29uLWZvbGRlci1vcGVue2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTk2cHh9LnVpLWljb24tZG9jdW1lbnR7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAtOTZweH0udWktaWNvbi1kb2N1bWVudC1ie2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTk2cHh9LnVpLWljb24tbm90ZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC05NnB4fS51aS1pY29uLW1haWwtY2xvc2Vke2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggLTk2cHh9LnVpLWljb24tbWFpbC1vcGVue2JhY2tncm91bmQtcG9zaXRpb246LTk2cHggLTk2cHh9LnVpLWljb24tc3VpdGNhc2V7YmFja2dyb3VuZC1wb3NpdGlvbjotMTEycHggLTk2cHh9LnVpLWljb24tY29tbWVudHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMjhweCAtOTZweH0udWktaWNvbi1wZXJzb257YmFja2dyb3VuZC1wb3NpdGlvbjotMTQ0cHggLTk2cHh9LnVpLWljb24tcHJpbnR7YmFja2dyb3VuZC1wb3NpdGlvbjotMTYwcHggLTk2cHh9LnVpLWljb24tdHJhc2h7YmFja2dyb3VuZC1wb3NpdGlvbjotMTc2cHggLTk2cHh9LnVpLWljb24tbG9ja2Vke2JhY2tncm91bmQtcG9zaXRpb246LTE5MnB4IC05NnB4fS51aS1pY29uLXVubG9ja2Vke2JhY2tncm91bmQtcG9zaXRpb246LTIwOHB4IC05NnB4fS51aS1pY29uLWJvb2ttYXJre2JhY2tncm91bmQtcG9zaXRpb246LTIyNHB4IC05NnB4fS51aS1pY29uLXRhZ3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yNDBweCAtOTZweH0udWktaWNvbi1ob21le2JhY2tncm91bmQtcG9zaXRpb246MCAtMTEycHh9LnVpLWljb24tZmxhZ3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IC0xMTJweH0udWktaWNvbi1jYWxlbmRhcntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IC0xMTJweH0udWktaWNvbi1jYXJ0e2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTExMnB4fS51aS1pY29uLXBlbmNpbHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC0xMTJweH0udWktaWNvbi1jbG9ja3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC0xMTJweH0udWktaWNvbi1kaXNre2JhY2tncm91bmQtcG9zaXRpb246LTk2cHggLTExMnB4fS51aS1pY29uLWNhbGN1bGF0b3J7YmFja2dyb3VuZC1wb3NpdGlvbjotMTEycHggLTExMnB4fS51aS1pY29uLXpvb21pbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMjhweCAtMTEycHh9LnVpLWljb24tem9vbW91dHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNDRweCAtMTEycHh9LnVpLWljb24tc2VhcmNoe2JhY2tncm91bmQtcG9zaXRpb246LTE2MHB4IC0xMTJweH0udWktaWNvbi13cmVuY2h7YmFja2dyb3VuZC1wb3NpdGlvbjotMTc2cHggLTExMnB4fS51aS1pY29uLWdlYXJ7YmFja2dyb3VuZC1wb3NpdGlvbjotMTkycHggLTExMnB4fS51aS1pY29uLWhlYXJ0e2JhY2tncm91bmQtcG9zaXRpb246LTIwOHB4IC0xMTJweH0udWktaWNvbi1zdGFye2JhY2tncm91bmQtcG9zaXRpb246LTIyNHB4IC0xMTJweH0udWktaWNvbi1saW5re2JhY2tncm91bmQtcG9zaXRpb246LTI0MHB4IC0xMTJweH0udWktaWNvbi1jYW5jZWx7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xMjhweH0udWktaWNvbi1wbHVze2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTEyOHB4fS51aS1pY29uLXBsdXN0aGlja3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IC0xMjhweH0udWktaWNvbi1taW51c3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC0xMjhweH0udWktaWNvbi1taW51c3RoaWNre2JhY2tncm91bmQtcG9zaXRpb246LTY0cHggLTEyOHB4fS51aS1pY29uLWNsb3Nle2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggLTEyOHB4fS51aS1pY29uLWNsb3NldGhpY2t7YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAtMTI4cHh9LnVpLWljb24ta2V5e2JhY2tncm91bmQtcG9zaXRpb246LTExMnB4IC0xMjhweH0udWktaWNvbi1saWdodGJ1bGJ7YmFja2dyb3VuZC1wb3NpdGlvbjotMTI4cHggLTEyOHB4fS51aS1pY29uLXNjaXNzb3Jze2JhY2tncm91bmQtcG9zaXRpb246LTE0NHB4IC0xMjhweH0udWktaWNvbi1jbGlwYm9hcmR7YmFja2dyb3VuZC1wb3NpdGlvbjotMTYwcHggLTEyOHB4fS51aS1pY29uLWNvcHl7YmFja2dyb3VuZC1wb3NpdGlvbjotMTc2cHggLTEyOHB4fS51aS1pY29uLWNvbnRhY3R7YmFja2dyb3VuZC1wb3NpdGlvbjotMTkycHggLTEyOHB4fS51aS1pY29uLWltYWdle2JhY2tncm91bmQtcG9zaXRpb246LTIwOHB4IC0xMjhweH0udWktaWNvbi12aWRlb3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMjRweCAtMTI4cHh9LnVpLWljb24tc2NyaXB0e2JhY2tncm91bmQtcG9zaXRpb246LTI0MHB4IC0xMjhweH0udWktaWNvbi1hbGVydHtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTE0NHB4fS51aS1pY29uLWluZm97YmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAtMTQ0cHh9LnVpLWljb24tbm90aWNle2JhY2tncm91bmQtcG9zaXRpb246LTMycHggLTE0NHB4fS51aS1pY29uLWhlbHB7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtMTQ0cHh9LnVpLWljb24tY2hlY2t7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtMTQ0cHh9LnVpLWljb24tYnVsbGV0e2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggLTE0NHB4fS51aS1pY29uLXJhZGlvLW9ue2JhY2tncm91bmQtcG9zaXRpb246LTk2cHggLTE0NHB4fS51aS1pY29uLXJhZGlvLW9mZntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMTJweCAtMTQ0cHh9LnVpLWljb24tcGluLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTI4cHggLTE0NHB4fS51aS1pY29uLXBpbi1ze2JhY2tncm91bmQtcG9zaXRpb246LTE0NHB4IC0xNDRweH0udWktaWNvbi1wbGF5e2JhY2tncm91bmQtcG9zaXRpb246MCAtMTYwcHh9LnVpLWljb24tcGF1c2V7YmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAtMTYwcHh9LnVpLWljb24tc2Vlay1uZXh0e2JhY2tncm91bmQtcG9zaXRpb246LTMycHggLTE2MHB4fS51aS1pY29uLXNlZWstcHJldntiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC0xNjBweH0udWktaWNvbi1zZWVrLWVuZHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC0xNjBweH0udWktaWNvbi1zZWVrLXN0YXJ0e2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggLTE2MHB4fS51aS1pY29uLXNlZWstZmlyc3R7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtMTYwcHh9LnVpLWljb24tc3RvcHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi05NnB4IC0xNjBweH0udWktaWNvbi1lamVjdHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMTJweCAtMTYwcHh9LnVpLWljb24tdm9sdW1lLW9mZntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMjhweCAtMTYwcHh9LnVpLWljb24tdm9sdW1lLW9ue2JhY2tncm91bmQtcG9zaXRpb246LTE0NHB4IC0xNjBweH0udWktaWNvbi1wb3dlcntiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTE3NnB4fS51aS1pY29uLXNpZ25hbC1kaWFne2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTE3NnB4fS51aS1pY29uLXNpZ25hbHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IC0xNzZweH0udWktaWNvbi1iYXR0ZXJ5LTB7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtMTc2cHh9LnVpLWljb24tYmF0dGVyeS0xe2JhY2tncm91bmQtcG9zaXRpb246LTY0cHggLTE3NnB4fS51aS1pY29uLWJhdHRlcnktMntiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC0xNzZweH0udWktaWNvbi1iYXR0ZXJ5LTN7YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAtMTc2cHh9LnVpLWljb24tY2lyY2xlLXBsdXN7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xOTJweH0udWktaWNvbi1jaXJjbGUtbWludXN7YmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAtMTkycHh9LnVpLWljb24tY2lyY2xlLWNsb3Nle2JhY2tncm91bmQtcG9zaXRpb246LTMycHggLTE5MnB4fS51aS1pY29uLWNpcmNsZS10cmlhbmdsZS1le2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTE5MnB4fS51aS1pY29uLWNpcmNsZS10cmlhbmdsZS1ze2JhY2tncm91bmQtcG9zaXRpb246LTY0cHggLTE5MnB4fS51aS1pY29uLWNpcmNsZS10cmlhbmdsZS13e2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggLTE5MnB4fS51aS1pY29uLWNpcmNsZS10cmlhbmdsZS1ue2JhY2tncm91bmQtcG9zaXRpb246LTk2cHggLTE5MnB4fS51aS1pY29uLWNpcmNsZS1hcnJvdy1le2JhY2tncm91bmQtcG9zaXRpb246LTExMnB4IC0xOTJweH0udWktaWNvbi1jaXJjbGUtYXJyb3ctc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMjhweCAtMTkycHh9LnVpLWljb24tY2lyY2xlLWFycm93LXd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTQ0cHggLTE5MnB4fS51aS1pY29uLWNpcmNsZS1hcnJvdy1ue2JhY2tncm91bmQtcG9zaXRpb246LTE2MHB4IC0xOTJweH0udWktaWNvbi1jaXJjbGUtem9vbWlue2JhY2tncm91bmQtcG9zaXRpb246LTE3NnB4IC0xOTJweH0udWktaWNvbi1jaXJjbGUtem9vbW91dHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xOTJweCAtMTkycHh9LnVpLWljb24tY2lyY2xlLWNoZWNre2JhY2tncm91bmQtcG9zaXRpb246LTIwOHB4IC0xOTJweH0udWktaWNvbi1jaXJjbGVzbWFsbC1wbHVze2JhY2tncm91bmQtcG9zaXRpb246MCAtMjA4cHh9LnVpLWljb24tY2lyY2xlc21hbGwtbWludXN7YmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAtMjA4cHh9LnVpLWljb24tY2lyY2xlc21hbGwtY2xvc2V7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAtMjA4cHh9LnVpLWljb24tc3F1YXJlc21hbGwtcGx1c3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC0yMDhweH0udWktaWNvbi1zcXVhcmVzbWFsbC1taW51c3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC0yMDhweH0udWktaWNvbi1zcXVhcmVzbWFsbC1jbG9zZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC0yMDhweH0udWktaWNvbi1ncmlwLWRvdHRlZC12ZXJ0aWNhbHtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTIyNHB4fS51aS1pY29uLWdyaXAtZG90dGVkLWhvcml6b250YWx7YmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAtMjI0cHh9LnVpLWljb24tZ3JpcC1zb2xpZC12ZXJ0aWNhbHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IC0yMjRweH0udWktaWNvbi1ncmlwLXNvbGlkLWhvcml6b250YWx7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtMjI0cHh9LnVpLWljb24tZ3JpcHNtYWxsLWRpYWdvbmFsLXNle2JhY2tncm91bmQtcG9zaXRpb246LTY0cHggLTIyNHB4fS51aS1pY29uLWdyaXAtZGlhZ29uYWwtc2V7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtMjI0cHh9LnVpLWNvcm5lci1hbGwsLnVpLWNvcm5lci10b3AsLnVpLWNvcm5lci1sZWZ0LC51aS1jb3JuZXItdGx7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czo0cHh9LnVpLWNvcm5lci1hbGwsLnVpLWNvcm5lci10b3AsLnVpLWNvcm5lci1yaWdodCwudWktY29ybmVyLXRye2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjRweH0udWktY29ybmVyLWFsbCwudWktY29ybmVyLWJvdHRvbSwudWktY29ybmVyLWxlZnQsLnVpLWNvcm5lci1ibHtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjRweH0udWktY29ybmVyLWFsbCwudWktY29ybmVyLWJvdHRvbSwudWktY29ybmVyLXJpZ2h0LC51aS1jb3JuZXItYnJ7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6NHB4fS51aS13aWRnZXQtb3ZlcmxheXtiYWNrZ3JvdW5kOiM2NjYgdXJsKCJpbWFnZXMvdWktYmdfZGlhZ29uYWxzLXRoaWNrXzIwXzY2NjY2Nl80MHg0MC5wbmciKSA1MCUgNTAlIHJlcGVhdDtvcGFjaXR5Oi41O2ZpbHRlcjpBbHBoYShPcGFjaXR5PTUwKX0udWktd2lkZ2V0LXNoYWRvd3ttYXJnaW46LTVweCAwIDAgLTVweDtwYWRkaW5nOjVweDtiYWNrZ3JvdW5kOiMwMDAgdXJsKCJpbWFnZXMvdWktYmdfZmxhdF8xMF8wMDAwMDBfNDB4MTAwLnBuZyIpIDUwJSA1MCUgcmVwZWF0LXg7b3BhY2l0eTouMjtmaWx0ZXI6QWxwaGEoT3BhY2l0eT0yMCk7Ym9yZGVyLXJhZGl1czo1cHh9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9jc3MvanF1ZXJ5LXVpLnN0cnVjdHVyZS5taW4uY3NzIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9jc3MvanF1ZXJ5LXVpLnN0cnVjdHVyZS5taW4uY3NzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQxNTc4YTQKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2Nzcy9qcXVlcnktdWkuc3RydWN0dXJlLm1pbi5jc3MKQEAgLTAsMCArMSw1IEBACisvKiEgalF1ZXJ5IFVJIC0gdjEuMTEuNCAtIDIwMTUtMDMtMTUKKyogaHR0cDovL2pxdWVyeXVpLmNvbQorKiBDb3B5cmlnaHQgMjAxNSBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzOyBMaWNlbnNlZCBNSVQgKi8KKworLnVpLWhlbHBlci1oaWRkZW57ZGlzcGxheTpub25lfS51aS1oZWxwZXItaGlkZGVuLWFjY2Vzc2libGV7Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHh9LnVpLWhlbHBlci1yZXNldHttYXJnaW46MDtwYWRkaW5nOjA7Ym9yZGVyOjA7b3V0bGluZTowO2xpbmUtaGVpZ2h0OjEuMzt0ZXh0LWRlY29yYXRpb246bm9uZTtmb250LXNpemU6MTAwJTtsaXN0LXN0eWxlOm5vbmV9LnVpLWhlbHBlci1jbGVhcmZpeDpiZWZvcmUsLnVpLWhlbHBlci1jbGVhcmZpeDphZnRlcntjb250ZW50OiIiO2Rpc3BsYXk6dGFibGU7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlfS51aS1oZWxwZXItY2xlYXJmaXg6YWZ0ZXJ7Y2xlYXI6Ym90aH0udWktaGVscGVyLWNsZWFyZml4e21pbi1oZWlnaHQ6MH0udWktaGVscGVyLXpmaXh7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTt0b3A6MDtsZWZ0OjA7cG9zaXRpb246YWJzb2x1dGU7b3BhY2l0eTowO2ZpbHRlcjpBbHBoYShPcGFjaXR5PTApfS51aS1mcm9udHt6LWluZGV4OjEwMH0udWktc3RhdGUtZGlzYWJsZWR7Y3Vyc29yOmRlZmF1bHQhaW1wb3J0YW50fS51aS1pY29ue2Rpc3BsYXk6YmxvY2s7dGV4dC1pbmRlbnQ6LTk5OTk5cHg7b3ZlcmZsb3c6aGlkZGVuO2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdH0udWktd2lkZ2V0LW92ZXJsYXl7cG9zaXRpb246Zml4ZWQ7dG9wOjA7bGVmdDowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCV9LnVpLWRhdGVwaWNrZXJ7d2lkdGg6MTdlbTtwYWRkaW5nOi4yZW0gLjJlbSAwO2Rpc3BsYXk6bm9uZX0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1oZWFkZXJ7cG9zaXRpb246cmVsYXRpdmU7cGFkZGluZzouMmVtIDB9LnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItcHJldiwudWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1uZXh0e3Bvc2l0aW9uOmFic29sdXRlO3RvcDoycHg7d2lkdGg6MS44ZW07aGVpZ2h0OjEuOGVtfS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLXByZXYtaG92ZXIsLnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItbmV4dC1ob3Zlcnt0b3A6MXB4fS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLXByZXZ7bGVmdDoycHh9LnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItbmV4dHtyaWdodDoycHh9LnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItcHJldi1ob3ZlcntsZWZ0OjFweH0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1uZXh0LWhvdmVye3JpZ2h0OjFweH0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1wcmV2IHNwYW4sLnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItbmV4dCBzcGFue2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7bGVmdDo1MCU7bWFyZ2luLWxlZnQ6LThweDt0b3A6NTAlO21hcmdpbi10b3A6LThweH0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci10aXRsZXttYXJnaW46MCAyLjNlbTtsaW5lLWhlaWdodDoxLjhlbTt0ZXh0LWFsaWduOmNlbnRlcn0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci10aXRsZSBzZWxlY3R7Zm9udC1zaXplOjFlbTttYXJnaW46MXB4IDB9LnVpLWRhdGVwaWNrZXIgc2VsZWN0LnVpLWRhdGVwaWNrZXItbW9udGgsLnVpLWRhdGVwaWNrZXIgc2VsZWN0LnVpLWRhdGVwaWNrZXIteWVhcnt3aWR0aDo0NSV9LnVpLWRhdGVwaWNrZXIgdGFibGV7d2lkdGg6MTAwJTtmb250LXNpemU6LjllbTtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7bWFyZ2luOjAgMCAuNGVtfS51aS1kYXRlcGlja2VyIHRoe3BhZGRpbmc6LjdlbSAuM2VtO3RleHQtYWxpZ246Y2VudGVyO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjB9LnVpLWRhdGVwaWNrZXIgdGR7Ym9yZGVyOjA7cGFkZGluZzoxcHh9LnVpLWRhdGVwaWNrZXIgdGQgc3BhbiwudWktZGF0ZXBpY2tlciB0ZCBhe2Rpc3BsYXk6YmxvY2s7cGFkZGluZzouMmVtO3RleHQtYWxpZ246cmlnaHQ7dGV4dC1kZWNvcmF0aW9uOm5vbmV9LnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItYnV0dG9ucGFuZXtiYWNrZ3JvdW5kLWltYWdlOm5vbmU7bWFyZ2luOi43ZW0gMCAwIDA7cGFkZGluZzowIC4yZW07Ym9yZGVyLWxlZnQ6MDtib3JkZXItcmlnaHQ6MDtib3JkZXItYm90dG9tOjB9LnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItYnV0dG9ucGFuZSBidXR0b257ZmxvYXQ6cmlnaHQ7bWFyZ2luOi41ZW0gLjJlbSAuNGVtO2N1cnNvcjpwb2ludGVyO3BhZGRpbmc6LjJlbSAuNmVtIC4zZW0gLjZlbTt3aWR0aDphdXRvO292ZXJmbG93OnZpc2libGV9LnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItYnV0dG9ucGFuZSBidXR0b24udWktZGF0ZXBpY2tlci1jdXJyZW50e2Zsb2F0OmxlZnR9LnVpLWRhdGVwaWNrZXIudWktZGF0ZXBpY2tlci1tdWx0aXt3aWR0aDphdXRvfS51aS1kYXRlcGlja2VyLW11bHRpIC51aS1kYXRlcGlja2VyLWdyb3Vwe2Zsb2F0OmxlZnR9LnVpLWRhdGVwaWNrZXItbXVsdGkgLnVpLWRhdGVwaWNrZXItZ3JvdXAgdGFibGV7d2lkdGg6OTUlO21hcmdpbjowIGF1dG8gLjRlbX0udWktZGF0ZXBpY2tlci1tdWx0aS0yIC51aS1kYXRlcGlja2VyLWdyb3Vwe3dpZHRoOjUwJX0udWktZGF0ZXBpY2tlci1tdWx0aS0zIC51aS1kYXRlcGlja2VyLWdyb3Vwe3dpZHRoOjMzLjMlfS51aS1kYXRlcGlja2VyLW11bHRpLTQgLnVpLWRhdGVwaWNrZXItZ3JvdXB7d2lkdGg6MjUlfS51aS1kYXRlcGlja2VyLW11bHRpIC51aS1kYXRlcGlja2VyLWdyb3VwLWxhc3QgLnVpLWRhdGVwaWNrZXItaGVhZGVyLC51aS1kYXRlcGlja2VyLW11bHRpIC51aS1kYXRlcGlja2VyLWdyb3VwLW1pZGRsZSAudWktZGF0ZXBpY2tlci1oZWFkZXJ7Ym9yZGVyLWxlZnQtd2lkdGg6MH0udWktZGF0ZXBpY2tlci1tdWx0aSAudWktZGF0ZXBpY2tlci1idXR0b25wYW5le2NsZWFyOmxlZnR9LnVpLWRhdGVwaWNrZXItcm93LWJyZWFre2NsZWFyOmJvdGg7d2lkdGg6MTAwJTtmb250LXNpemU6MH0udWktZGF0ZXBpY2tlci1ydGx7ZGlyZWN0aW9uOnJ0bH0udWktZGF0ZXBpY2tlci1ydGwgLnVpLWRhdGVwaWNrZXItcHJldntyaWdodDoycHg7bGVmdDphdXRvfS51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1uZXh0e2xlZnQ6MnB4O3JpZ2h0OmF1dG99LnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLXByZXY6aG92ZXJ7cmlnaHQ6MXB4O2xlZnQ6YXV0b30udWktZGF0ZXBpY2tlci1ydGwgLnVpLWRhdGVwaWNrZXItbmV4dDpob3ZlcntsZWZ0OjFweDtyaWdodDphdXRvfS51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1idXR0b25wYW5le2NsZWFyOnJpZ2h0fS51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1idXR0b25wYW5lIGJ1dHRvbntmbG9hdDpsZWZ0fS51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1idXR0b25wYW5lIGJ1dHRvbi51aS1kYXRlcGlja2VyLWN1cnJlbnQsLnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLWdyb3Vwe2Zsb2F0OnJpZ2h0fS51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1ncm91cC1sYXN0IC51aS1kYXRlcGlja2VyLWhlYWRlciwudWktZGF0ZXBpY2tlci1ydGwgLnVpLWRhdGVwaWNrZXItZ3JvdXAtbWlkZGxlIC51aS1kYXRlcGlja2VyLWhlYWRlcntib3JkZXItcmlnaHQtd2lkdGg6MDtib3JkZXItbGVmdC13aWR0aDoxcHh9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9jc3MvanF1ZXJ5LXVpLnRoZW1lLm1pbi5jc3MgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2Nzcy9qcXVlcnktdWkudGhlbWUubWluLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNDU0MzExCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9jc3MvanF1ZXJ5LXVpLnRoZW1lLm1pbi5jc3MKQEAgLTAsMCArMSw1IEBACisvKiEgalF1ZXJ5IFVJIC0gdjEuMTEuNCAtIDIwMTUtMDMtMTcKKyogaHR0cDovL2pxdWVyeXVpLmNvbQorKiBDb3B5cmlnaHQgMjAxNSBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzOyBMaWNlbnNlZCBNSVQgKi8KKworLnVpLXdpZGdldHtmb250LWZhbWlseTpUcmVidWNoZXQgTVMsVGFob21hLFZlcmRhbmEsQXJpYWwsc2Fucy1zZXJpZjtmb250LXNpemU6MS4xZW19LnVpLXdpZGdldCAudWktd2lkZ2V0e2ZvbnQtc2l6ZToxZW19LnVpLXdpZGdldCBpbnB1dCwudWktd2lkZ2V0IHNlbGVjdCwudWktd2lkZ2V0IHRleHRhcmVhLC51aS13aWRnZXQgYnV0dG9ue2ZvbnQtZmFtaWx5OlRyZWJ1Y2hldCBNUyxUYWhvbWEsVmVyZGFuYSxBcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxZW19LnVpLXdpZGdldC1jb250ZW50e2JvcmRlcjoxcHggc29saWQgI2RkZDtiYWNrZ3JvdW5kOiNlZWUgdXJsKCJpbWFnZXMvdWktYmdfaGlnaGxpZ2h0LXNvZnRfMTAwX2VlZWVlZV8xeDEwMC5wbmciKSA1MCUgdG9wIHJlcGVhdC14O2NvbG9yOiMzMzN9LnVpLXdpZGdldC1jb250ZW50IGF7Y29sb3I6IzMzM30udWktd2lkZ2V0LWhlYWRlcntib3JkZXI6MXB4IHNvbGlkICNlNzhmMDg7YmFja2dyb3VuZDojZjZhODI4IHVybCgiaW1hZ2VzL3VpLWJnX2dsb3NzLXdhdmVfMzVfZjZhODI4XzUwMHgxMDAucG5nIikgNTAlIDUwJSByZXBlYXQteDtjb2xvcjojZmZmO2ZvbnQtd2VpZ2h0OmJvbGR9LnVpLXdpZGdldC1oZWFkZXIgYXtjb2xvcjojZmZmfS51aS1zdGF0ZS1kZWZhdWx0LC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtZGVmYXVsdCwudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtZGVmYXVsdHtib3JkZXI6MXB4IHNvbGlkICNjY2M7YmFja2dyb3VuZDojZjZmNmY2IHVybCgiaW1hZ2VzL3VpLWJnX2dsYXNzXzEwMF9mNmY2ZjZfMXg0MDAucG5nIikgNTAlIDUwJSByZXBlYXQteDtmb250LXdlaWdodDpib2xkO2NvbG9yOiMxYzk0YzR9LnVpLXN0YXRlLWRlZmF1bHQgYSwudWktc3RhdGUtZGVmYXVsdCBhOmxpbmssLnVpLXN0YXRlLWRlZmF1bHQgYTp2aXNpdGVke2NvbG9yOiMxYzk0YzQ7dGV4dC1kZWNvcmF0aW9uOm5vbmV9LnVpLXN0YXRlLWhvdmVyLC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtaG92ZXIsLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWhvdmVyLC51aS1zdGF0ZS1mb2N1cywudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWZvY3VzLC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1mb2N1c3tib3JkZXI6MXB4IHNvbGlkICNmYmNiMDk7YmFja2dyb3VuZDojZmRmNWNlIHVybCgiaW1hZ2VzL3VpLWJnX2dsYXNzXzEwMF9mZGY1Y2VfMXg0MDAucG5nIikgNTAlIDUwJSByZXBlYXQteDtmb250LXdlaWdodDpib2xkO2NvbG9yOiNjNzc0MDV9LnVpLXN0YXRlLWhvdmVyIGEsLnVpLXN0YXRlLWhvdmVyIGE6aG92ZXIsLnVpLXN0YXRlLWhvdmVyIGE6bGluaywudWktc3RhdGUtaG92ZXIgYTp2aXNpdGVkLC51aS1zdGF0ZS1mb2N1cyBhLC51aS1zdGF0ZS1mb2N1cyBhOmhvdmVyLC51aS1zdGF0ZS1mb2N1cyBhOmxpbmssLnVpLXN0YXRlLWZvY3VzIGE6dmlzaXRlZHtjb2xvcjojYzc3NDA1O3RleHQtZGVjb3JhdGlvbjpub25lfS51aS1zdGF0ZS1hY3RpdmUsLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1hY3RpdmUsLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWFjdGl2ZXtib3JkZXI6MXB4IHNvbGlkICNmYmQ4NTA7YmFja2dyb3VuZDojZmZmIHVybCgiaW1hZ2VzL3VpLWJnX2dsYXNzXzY1X2ZmZmZmZl8xeDQwMC5wbmciKSA1MCUgNTAlIHJlcGVhdC14O2ZvbnQtd2VpZ2h0OmJvbGQ7Y29sb3I6I2ViOGYwMH0udWktc3RhdGUtYWN0aXZlIGEsLnVpLXN0YXRlLWFjdGl2ZSBhOmxpbmssLnVpLXN0YXRlLWFjdGl2ZSBhOnZpc2l0ZWR7Y29sb3I6I2ViOGYwMDt0ZXh0LWRlY29yYXRpb246bm9uZX0udWktc3RhdGUtaGlnaGxpZ2h0LC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtaGlnaGxpZ2h0LC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1oaWdobGlnaHR7Ym9yZGVyOjFweCBzb2xpZCAjZmVkMjJmO2JhY2tncm91bmQ6I2ZmZTQ1YyB1cmwoImltYWdlcy91aS1iZ19oaWdobGlnaHQtc29mdF83NV9mZmU0NWNfMXgxMDAucG5nIikgNTAlIHRvcCByZXBlYXQteDtjb2xvcjojMzYzNjM2fS51aS1zdGF0ZS1oaWdobGlnaHQgYSwudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWhpZ2hsaWdodCBhLC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1oaWdobGlnaHQgYXtjb2xvcjojMzYzNjM2fS51aS1zdGF0ZS1lcnJvciwudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWVycm9yLC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1lcnJvcntib3JkZXI6MXB4IHNvbGlkICNjZDBhMGE7YmFja2dyb3VuZDojYjgxOTAwIHVybCgiaW1hZ2VzL3VpLWJnX2RpYWdvbmFscy10aGlja18xOF9iODE5MDBfNDB4NDAucG5nIikgNTAlIDUwJSByZXBlYXQ7Y29sb3I6I2ZmZn0udWktc3RhdGUtZXJyb3IgYSwudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWVycm9yIGEsLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWVycm9yIGF7Y29sb3I6I2ZmZn0udWktc3RhdGUtZXJyb3ItdGV4dCwudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWVycm9yLXRleHQsLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWVycm9yLXRleHR7Y29sb3I6I2ZmZn0udWktcHJpb3JpdHktcHJpbWFyeSwudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXByaW9yaXR5LXByaW1hcnksLnVpLXdpZGdldC1oZWFkZXIgLnVpLXByaW9yaXR5LXByaW1hcnl7Zm9udC13ZWlnaHQ6Ym9sZH0udWktcHJpb3JpdHktc2Vjb25kYXJ5LC51aS13aWRnZXQtY29udGVudCAudWktcHJpb3JpdHktc2Vjb25kYXJ5LC51aS13aWRnZXQtaGVhZGVyIC51aS1wcmlvcml0eS1zZWNvbmRhcnl7b3BhY2l0eTouNztmaWx0ZXI6QWxwaGEoT3BhY2l0eT03MCk7Zm9udC13ZWlnaHQ6bm9ybWFsfS51aS1zdGF0ZS1kaXNhYmxlZCwudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWRpc2FibGVkLC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1kaXNhYmxlZHtvcGFjaXR5Oi4zNTtmaWx0ZXI6QWxwaGEoT3BhY2l0eT0zNSk7YmFja2dyb3VuZC1pbWFnZTpub25lfS51aS1zdGF0ZS1kaXNhYmxlZCAudWktaWNvbntmaWx0ZXI6QWxwaGEoT3BhY2l0eT0zNSl9LnVpLWljb257d2lkdGg6MTZweDtoZWlnaHQ6MTZweH0udWktaWNvbiwudWktd2lkZ2V0LWNvbnRlbnQgLnVpLWljb257YmFja2dyb3VuZC1pbWFnZTp1cmwoImltYWdlcy91aS1pY29uc18yMjIyMjJfMjU2eDI0MC5wbmciKX0udWktd2lkZ2V0LWhlYWRlciAudWktaWNvbntiYWNrZ3JvdW5kLWltYWdlOnVybCgiaW1hZ2VzL3VpLWljb25zX2ZmZmZmZl8yNTZ4MjQwLnBuZyIpfS51aS1zdGF0ZS1kZWZhdWx0IC51aS1pY29ue2JhY2tncm91bmQtaW1hZ2U6dXJsKCJpbWFnZXMvdWktaWNvbnNfZWY4YzA4XzI1NngyNDAucG5nIil9LnVpLXN0YXRlLWhvdmVyIC51aS1pY29uLC51aS1zdGF0ZS1mb2N1cyAudWktaWNvbntiYWNrZ3JvdW5kLWltYWdlOnVybCgiaW1hZ2VzL3VpLWljb25zX2VmOGMwOF8yNTZ4MjQwLnBuZyIpfS51aS1zdGF0ZS1hY3RpdmUgLnVpLWljb257YmFja2dyb3VuZC1pbWFnZTp1cmwoImltYWdlcy91aS1pY29uc19lZjhjMDhfMjU2eDI0MC5wbmciKX0udWktc3RhdGUtaGlnaGxpZ2h0IC51aS1pY29ue2JhY2tncm91bmQtaW1hZ2U6dXJsKCJpbWFnZXMvdWktaWNvbnNfMjI4ZWYxXzI1NngyNDAucG5nIil9LnVpLXN0YXRlLWVycm9yIC51aS1pY29uLC51aS1zdGF0ZS1lcnJvci10ZXh0IC51aS1pY29ue2JhY2tncm91bmQtaW1hZ2U6dXJsKCJpbWFnZXMvdWktaWNvbnNfZmZkMjdhXzI1NngyNDAucG5nIil9LnVpLWljb24tYmxhbmt7YmFja2dyb3VuZC1wb3NpdGlvbjoxNnB4IDE2cHh9LnVpLWljb24tY2FyYXQtMS1ue2JhY2tncm91bmQtcG9zaXRpb246MCAwfS51aS1pY29uLWNhcmF0LTEtbmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAwfS51aS1pY29uLWNhcmF0LTEtZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IDB9LnVpLWljb24tY2FyYXQtMS1zZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IDB9LnVpLWljb24tY2FyYXQtMS1ze2JhY2tncm91bmQtcG9zaXRpb246LTY0cHggMH0udWktaWNvbi1jYXJhdC0xLXN3e2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggMH0udWktaWNvbi1jYXJhdC0xLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAwfS51aS1pY29uLWNhcmF0LTEtbnd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTEycHggMH0udWktaWNvbi1jYXJhdC0yLW4tc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMjhweCAwfS51aS1pY29uLWNhcmF0LTItZS13e2JhY2tncm91bmQtcG9zaXRpb246LTE0NHB4IDB9LnVpLWljb24tdHJpYW5nbGUtMS1ue2JhY2tncm91bmQtcG9zaXRpb246MCAtMTZweH0udWktaWNvbi10cmlhbmdsZS0xLW5le2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTE2cHh9LnVpLWljb24tdHJpYW5nbGUtMS1le2JhY2tncm91bmQtcG9zaXRpb246LTMycHggLTE2cHh9LnVpLWljb24tdHJpYW5nbGUtMS1zZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC0xNnB4fS51aS1pY29uLXRyaWFuZ2xlLTEtc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC0xNnB4fS51aS1pY29uLXRyaWFuZ2xlLTEtc3d7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtMTZweH0udWktaWNvbi10cmlhbmdsZS0xLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAtMTZweH0udWktaWNvbi10cmlhbmdsZS0xLW53e2JhY2tncm91bmQtcG9zaXRpb246LTExMnB4IC0xNnB4fS51aS1pY29uLXRyaWFuZ2xlLTItbi1ze2JhY2tncm91bmQtcG9zaXRpb246LTEyOHB4IC0xNnB4fS51aS1pY29uLXRyaWFuZ2xlLTItZS13e2JhY2tncm91bmQtcG9zaXRpb246LTE0NHB4IC0xNnB4fS51aS1pY29uLWFycm93LTEtbntiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTMycHh9LnVpLWljb24tYXJyb3ctMS1uZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IC0zMnB4fS51aS1pY29uLWFycm93LTEtZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IC0zMnB4fS51aS1pY29uLWFycm93LTEtc2V7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtMzJweH0udWktaWNvbi1hcnJvdy0xLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtMzJweH0udWktaWNvbi1hcnJvdy0xLXN3e2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggLTMycHh9LnVpLWljb24tYXJyb3ctMS13e2JhY2tncm91bmQtcG9zaXRpb246LTk2cHggLTMycHh9LnVpLWljb24tYXJyb3ctMS1ud3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMTJweCAtMzJweH0udWktaWNvbi1hcnJvdy0yLW4tc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMjhweCAtMzJweH0udWktaWNvbi1hcnJvdy0yLW5lLXN3e2JhY2tncm91bmQtcG9zaXRpb246LTE0NHB4IC0zMnB4fS51aS1pY29uLWFycm93LTItZS13e2JhY2tncm91bmQtcG9zaXRpb246LTE2MHB4IC0zMnB4fS51aS1pY29uLWFycm93LTItc2Utbnd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTc2cHggLTMycHh9LnVpLWljb24tYXJyb3dzdG9wLTEtbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xOTJweCAtMzJweH0udWktaWNvbi1hcnJvd3N0b3AtMS1le2JhY2tncm91bmQtcG9zaXRpb246LTIwOHB4IC0zMnB4fS51aS1pY29uLWFycm93c3RvcC0xLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotMjI0cHggLTMycHh9LnVpLWljb24tYXJyb3dzdG9wLTEtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yNDBweCAtMzJweH0udWktaWNvbi1hcnJvd3RoaWNrLTEtbntiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTQ4cHh9LnVpLWljb24tYXJyb3d0aGljay0xLW5le2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGljay0xLWV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrLTEtc2V7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrLTEtc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC00OHB4fS51aS1pY29uLWFycm93dGhpY2stMS1zd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC00OHB4fS51aS1pY29uLWFycm93dGhpY2stMS13e2JhY2tncm91bmQtcG9zaXRpb246LTk2cHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGljay0xLW53e2JhY2tncm91bmQtcG9zaXRpb246LTExMnB4IC00OHB4fS51aS1pY29uLWFycm93dGhpY2stMi1uLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotMTI4cHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGljay0yLW5lLXN3e2JhY2tncm91bmQtcG9zaXRpb246LTE0NHB4IC00OHB4fS51aS1pY29uLWFycm93dGhpY2stMi1lLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTYwcHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGljay0yLXNlLW53e2JhY2tncm91bmQtcG9zaXRpb246LTE3NnB4IC00OHB4fS51aS1pY29uLWFycm93dGhpY2tzdG9wLTEtbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xOTJweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrc3RvcC0xLWV7YmFja2dyb3VuZC1wb3NpdGlvbjotMjA4cHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGlja3N0b3AtMS1ze2JhY2tncm91bmQtcG9zaXRpb246LTIyNHB4IC00OHB4fS51aS1pY29uLWFycm93dGhpY2tzdG9wLTEtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yNDBweCAtNDhweH0udWktaWNvbi1hcnJvd3JldHVybnRoaWNrLTEtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTY0cHh9LnVpLWljb24tYXJyb3dyZXR1cm50aGljay0xLW57YmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAtNjRweH0udWktaWNvbi1hcnJvd3JldHVybnRoaWNrLTEtZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IC02NHB4fS51aS1pY29uLWFycm93cmV0dXJudGhpY2stMS1ze2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTY0cHh9LnVpLWljb24tYXJyb3dyZXR1cm4tMS13e2JhY2tncm91bmQtcG9zaXRpb246LTY0cHggLTY0cHh9LnVpLWljb24tYXJyb3dyZXR1cm4tMS1ue2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggLTY0cHh9LnVpLWljb24tYXJyb3dyZXR1cm4tMS1le2JhY2tncm91bmQtcG9zaXRpb246LTk2cHggLTY0cHh9LnVpLWljb24tYXJyb3dyZXR1cm4tMS1ze2JhY2tncm91bmQtcG9zaXRpb246LTExMnB4IC02NHB4fS51aS1pY29uLWFycm93cmVmcmVzaC0xLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTI4cHggLTY0cHh9LnVpLWljb24tYXJyb3dyZWZyZXNoLTEtbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNDRweCAtNjRweH0udWktaWNvbi1hcnJvd3JlZnJlc2gtMS1le2JhY2tncm91bmQtcG9zaXRpb246LTE2MHB4IC02NHB4fS51aS1pY29uLWFycm93cmVmcmVzaC0xLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotMTc2cHggLTY0cHh9LnVpLWljb24tYXJyb3ctNHtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTgwcHh9LnVpLWljb24tYXJyb3ctNC1kaWFne2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTgwcHh9LnVpLWljb24tZXh0bGlua3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IC04MHB4fS51aS1pY29uLW5ld3dpbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC04MHB4fS51aS1pY29uLXJlZnJlc2h7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtODBweH0udWktaWNvbi1zaHVmZmxle2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggLTgwcHh9LnVpLWljb24tdHJhbnNmZXItZS13e2JhY2tncm91bmQtcG9zaXRpb246LTk2cHggLTgwcHh9LnVpLWljb24tdHJhbnNmZXJ0aGljay1lLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTEycHggLTgwcHh9LnVpLWljb24tZm9sZGVyLWNvbGxhcHNlZHtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTk2cHh9LnVpLWljb24tZm9sZGVyLW9wZW57YmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAtOTZweH0udWktaWNvbi1kb2N1bWVudHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IC05NnB4fS51aS1pY29uLWRvY3VtZW50LWJ7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtOTZweH0udWktaWNvbi1ub3Rle2JhY2tncm91bmQtcG9zaXRpb246LTY0cHggLTk2cHh9LnVpLWljb24tbWFpbC1jbG9zZWR7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtOTZweH0udWktaWNvbi1tYWlsLW9wZW57YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAtOTZweH0udWktaWNvbi1zdWl0Y2FzZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMTJweCAtOTZweH0udWktaWNvbi1jb21tZW50e2JhY2tncm91bmQtcG9zaXRpb246LTEyOHB4IC05NnB4fS51aS1pY29uLXBlcnNvbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNDRweCAtOTZweH0udWktaWNvbi1wcmludHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNjBweCAtOTZweH0udWktaWNvbi10cmFzaHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNzZweCAtOTZweH0udWktaWNvbi1sb2NrZWR7YmFja2dyb3VuZC1wb3NpdGlvbjotMTkycHggLTk2cHh9LnVpLWljb24tdW5sb2NrZWR7YmFja2dyb3VuZC1wb3NpdGlvbjotMjA4cHggLTk2cHh9LnVpLWljb24tYm9va21hcmt7YmFja2dyb3VuZC1wb3NpdGlvbjotMjI0cHggLTk2cHh9LnVpLWljb24tdGFne2JhY2tncm91bmQtcG9zaXRpb246LTI0MHB4IC05NnB4fS51aS1pY29uLWhvbWV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xMTJweH0udWktaWNvbi1mbGFne2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTExMnB4fS51aS1pY29uLWNhbGVuZGFye2JhY2tncm91bmQtcG9zaXRpb246LTMycHggLTExMnB4fS51aS1pY29uLWNhcnR7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtMTEycHh9LnVpLWljb24tcGVuY2lse2JhY2tncm91bmQtcG9zaXRpb246LTY0cHggLTExMnB4fS51aS1pY29uLWNsb2Nre2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggLTExMnB4fS51aS1pY29uLWRpc2t7YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAtMTEycHh9LnVpLWljb24tY2FsY3VsYXRvcntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMTJweCAtMTEycHh9LnVpLWljb24tem9vbWlue2JhY2tncm91bmQtcG9zaXRpb246LTEyOHB4IC0xMTJweH0udWktaWNvbi16b29tb3V0e2JhY2tncm91bmQtcG9zaXRpb246LTE0NHB4IC0xMTJweH0udWktaWNvbi1zZWFyY2h7YmFja2dyb3VuZC1wb3NpdGlvbjotMTYwcHggLTExMnB4fS51aS1pY29uLXdyZW5jaHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNzZweCAtMTEycHh9LnVpLWljb24tZ2VhcntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xOTJweCAtMTEycHh9LnVpLWljb24taGVhcnR7YmFja2dyb3VuZC1wb3NpdGlvbjotMjA4cHggLTExMnB4fS51aS1pY29uLXN0YXJ7YmFja2dyb3VuZC1wb3NpdGlvbjotMjI0cHggLTExMnB4fS51aS1pY29uLWxpbmt7YmFja2dyb3VuZC1wb3NpdGlvbjotMjQwcHggLTExMnB4fS51aS1pY29uLWNhbmNlbHtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTEyOHB4fS51aS1pY29uLXBsdXN7YmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAtMTI4cHh9LnVpLWljb24tcGx1c3RoaWNre2JhY2tncm91bmQtcG9zaXRpb246LTMycHggLTEyOHB4fS51aS1pY29uLW1pbnVze2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTEyOHB4fS51aS1pY29uLW1pbnVzdGhpY2t7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtMTI4cHh9LnVpLWljb24tY2xvc2V7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtMTI4cHh9LnVpLWljb24tY2xvc2V0aGlja3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi05NnB4IC0xMjhweH0udWktaWNvbi1rZXl7YmFja2dyb3VuZC1wb3NpdGlvbjotMTEycHggLTEyOHB4fS51aS1pY29uLWxpZ2h0YnVsYntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMjhweCAtMTI4cHh9LnVpLWljb24tc2Npc3NvcnN7YmFja2dyb3VuZC1wb3NpdGlvbjotMTQ0cHggLTEyOHB4fS51aS1pY29uLWNsaXBib2FyZHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNjBweCAtMTI4cHh9LnVpLWljb24tY29weXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNzZweCAtMTI4cHh9LnVpLWljb24tY29udGFjdHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xOTJweCAtMTI4cHh9LnVpLWljb24taW1hZ2V7YmFja2dyb3VuZC1wb3NpdGlvbjotMjA4cHggLTEyOHB4fS51aS1pY29uLXZpZGVve2JhY2tncm91bmQtcG9zaXRpb246LTIyNHB4IC0xMjhweH0udWktaWNvbi1zY3JpcHR7YmFja2dyb3VuZC1wb3NpdGlvbjotMjQwcHggLTEyOHB4fS51aS1pY29uLWFsZXJ0e2JhY2tncm91bmQtcG9zaXRpb246MCAtMTQ0cHh9LnVpLWljb24taW5mb3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IC0xNDRweH0udWktaWNvbi1ub3RpY2V7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAtMTQ0cHh9LnVpLWljb24taGVscHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC0xNDRweH0udWktaWNvbi1jaGVja3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC0xNDRweH0udWktaWNvbi1idWxsZXR7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtMTQ0cHh9LnVpLWljb24tcmFkaW8tb257YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAtMTQ0cHh9LnVpLWljb24tcmFkaW8tb2Zme2JhY2tncm91bmQtcG9zaXRpb246LTExMnB4IC0xNDRweH0udWktaWNvbi1waW4td3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMjhweCAtMTQ0cHh9LnVpLWljb24tcGluLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotMTQ0cHggLTE0NHB4fS51aS1pY29uLXBsYXl7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xNjBweH0udWktaWNvbi1wYXVzZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IC0xNjBweH0udWktaWNvbi1zZWVrLW5leHR7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAtMTYwcHh9LnVpLWljb24tc2Vlay1wcmV2e2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTE2MHB4fS51aS1pY29uLXNlZWstZW5ke2JhY2tncm91bmQtcG9zaXRpb246LTY0cHggLTE2MHB4fS51aS1pY29uLXNlZWstc3RhcnR7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtMTYwcHh9LnVpLWljb24tc2Vlay1maXJzdHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC0xNjBweH0udWktaWNvbi1zdG9we2JhY2tncm91bmQtcG9zaXRpb246LTk2cHggLTE2MHB4fS51aS1pY29uLWVqZWN0e2JhY2tncm91bmQtcG9zaXRpb246LTExMnB4IC0xNjBweH0udWktaWNvbi12b2x1bWUtb2Zme2JhY2tncm91bmQtcG9zaXRpb246LTEyOHB4IC0xNjBweH0udWktaWNvbi12b2x1bWUtb257YmFja2dyb3VuZC1wb3NpdGlvbjotMTQ0cHggLTE2MHB4fS51aS1pY29uLXBvd2Vye2JhY2tncm91bmQtcG9zaXRpb246MCAtMTc2cHh9LnVpLWljb24tc2lnbmFsLWRpYWd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAtMTc2cHh9LnVpLWljb24tc2lnbmFse2JhY2tncm91bmQtcG9zaXRpb246LTMycHggLTE3NnB4fS51aS1pY29uLWJhdHRlcnktMHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC0xNzZweH0udWktaWNvbi1iYXR0ZXJ5LTF7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtMTc2cHh9LnVpLWljb24tYmF0dGVyeS0ye2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggLTE3NnB4fS51aS1pY29uLWJhdHRlcnktM3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi05NnB4IC0xNzZweH0udWktaWNvbi1jaXJjbGUtcGx1c3tiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTE5MnB4fS51aS1pY29uLWNpcmNsZS1taW51c3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IC0xOTJweH0udWktaWNvbi1jaXJjbGUtY2xvc2V7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAtMTkycHh9LnVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLWV7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtMTkycHh9LnVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtMTkycHh9LnVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtMTkycHh9LnVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLW57YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAtMTkycHh9LnVpLWljb24tY2lyY2xlLWFycm93LWV7YmFja2dyb3VuZC1wb3NpdGlvbjotMTEycHggLTE5MnB4fS51aS1pY29uLWNpcmNsZS1hcnJvdy1ze2JhY2tncm91bmQtcG9zaXRpb246LTEyOHB4IC0xOTJweH0udWktaWNvbi1jaXJjbGUtYXJyb3ctd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNDRweCAtMTkycHh9LnVpLWljb24tY2lyY2xlLWFycm93LW57YmFja2dyb3VuZC1wb3NpdGlvbjotMTYwcHggLTE5MnB4fS51aS1pY29uLWNpcmNsZS16b29taW57YmFja2dyb3VuZC1wb3NpdGlvbjotMTc2cHggLTE5MnB4fS51aS1pY29uLWNpcmNsZS16b29tb3V0e2JhY2tncm91bmQtcG9zaXRpb246LTE5MnB4IC0xOTJweH0udWktaWNvbi1jaXJjbGUtY2hlY2t7YmFja2dyb3VuZC1wb3NpdGlvbjotMjA4cHggLTE5MnB4fS51aS1pY29uLWNpcmNsZXNtYWxsLXBsdXN7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0yMDhweH0udWktaWNvbi1jaXJjbGVzbWFsbC1taW51c3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IC0yMDhweH0udWktaWNvbi1jaXJjbGVzbWFsbC1jbG9zZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IC0yMDhweH0udWktaWNvbi1zcXVhcmVzbWFsbC1wbHVze2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTIwOHB4fS51aS1pY29uLXNxdWFyZXNtYWxsLW1pbnVze2JhY2tncm91bmQtcG9zaXRpb246LTY0cHggLTIwOHB4fS51aS1pY29uLXNxdWFyZXNtYWxsLWNsb3Nle2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggLTIwOHB4fS51aS1pY29uLWdyaXAtZG90dGVkLXZlcnRpY2Fse2JhY2tncm91bmQtcG9zaXRpb246MCAtMjI0cHh9LnVpLWljb24tZ3JpcC1kb3R0ZWQtaG9yaXpvbnRhbHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IC0yMjRweH0udWktaWNvbi1ncmlwLXNvbGlkLXZlcnRpY2Fse2JhY2tncm91bmQtcG9zaXRpb246LTMycHggLTIyNHB4fS51aS1pY29uLWdyaXAtc29saWQtaG9yaXpvbnRhbHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC0yMjRweH0udWktaWNvbi1ncmlwc21hbGwtZGlhZ29uYWwtc2V7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtMjI0cHh9LnVpLWljb24tZ3JpcC1kaWFnb25hbC1zZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC0yMjRweH0udWktY29ybmVyLWFsbCwudWktY29ybmVyLXRvcCwudWktY29ybmVyLWxlZnQsLnVpLWNvcm5lci10bHtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjRweH0udWktY29ybmVyLWFsbCwudWktY29ybmVyLXRvcCwudWktY29ybmVyLXJpZ2h0LC51aS1jb3JuZXItdHJ7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6NHB4fS51aS1jb3JuZXItYWxsLC51aS1jb3JuZXItYm90dG9tLC51aS1jb3JuZXItbGVmdCwudWktY29ybmVyLWJse2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6NHB4fS51aS1jb3JuZXItYWxsLC51aS1jb3JuZXItYm90dG9tLC51aS1jb3JuZXItcmlnaHQsLnVpLWNvcm5lci1icntib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czo0cHh9LnVpLXdpZGdldC1vdmVybGF5e2JhY2tncm91bmQ6IzY2NiB1cmwoImltYWdlcy91aS1iZ19kaWFnb25hbHMtdGhpY2tfMjBfNjY2NjY2XzQweDQwLnBuZyIpIDUwJSA1MCUgcmVwZWF0O29wYWNpdHk6LjU7ZmlsdGVyOkFscGhhKE9wYWNpdHk9NTApfS51aS13aWRnZXQtc2hhZG93e21hcmdpbjotNXB4IDAgMCAtNXB4O3BhZGRpbmc6NXB4O2JhY2tncm91bmQ6IzAwMCB1cmwoImltYWdlcy91aS1iZ19mbGF0XzEwXzAwMDAwMF80MHgxMDAucG5nIikgNTAlIDUwJSByZXBlYXQteDtvcGFjaXR5Oi4yO2ZpbHRlcjpBbHBoYShPcGFjaXR5PTIwKTtib3JkZXItcmFkaXVzOjVweH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2Nzcy9qcXVlcnkudHJlZXRhYmxlLmNzcyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvY3NzL2pxdWVyeS50cmVldGFibGUuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlOTViZmQKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2Nzcy9qcXVlcnkudHJlZXRhYmxlLmNzcwpAQCAtMCwwICsxLDI4IEBACit0YWJsZS50cmVldGFibGUgc3Bhbi5pbmRlbnRlciB7CisgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgbWFyZ2luOiAwOworICBwYWRkaW5nOiAwOworICB0ZXh0LWFsaWduOiByaWdodDsKKworICAvKiBEaXNhYmxlIHRleHQgc2VsZWN0aW9uIG9mIG5vZGVzIChmb3IgYmV0dGVyIEQmRCBVWCkgKi8KKyAgdXNlci1zZWxlY3Q6IG5vbmU7CisgIC1raHRtbC11c2VyLXNlbGVjdDogbm9uZTsKKyAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKKyAgLW8tdXNlci1zZWxlY3Q6IG5vbmU7CisgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CisKKyAgLyogRm9yY2UgY29udGVudC1ib3ggYm94IG1vZGVsIGZvciBpbmRlbnRlciAoQm9vdHN0cmFwIGNvbXBhdGliaWxpdHkpICovCisgIC13ZWJraXQtYm94LXNpemluZzogY29udGVudC1ib3g7CisgIC1tb3otYm94LXNpemluZzogY29udGVudC1ib3g7CisgIGJveC1zaXppbmc6IGNvbnRlbnQtYm94OworCisgIHdpZHRoOiAxOXB4OworfQorCit0YWJsZS50cmVldGFibGUgc3Bhbi5pbmRlbnRlciBhIHsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogbGVmdCBjZW50ZXI7CisgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CisgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICB3aWR0aDogMTlweDsKK30KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvY3NzL2pxdWVyeS50cmVldGFibGUudGhlbWUuZGVmYXVsdC5jc3MgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2Nzcy9qcXVlcnkudHJlZXRhYmxlLnRoZW1lLmRlZmF1bHQuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4Mjg5YmEKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2Nzcy9qcXVlcnkudHJlZXRhYmxlLnRoZW1lLmRlZmF1bHQuY3NzCkBAIC0wLDAgKzEsNjQgQEAKK3RhYmxlLnRyZWV0YWJsZSB7CisgIGJvcmRlcjogMXB4IHNvbGlkICM4ODg7CisgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CisgIGZvbnQtc2l6ZTogLjhlbTsKKyAgbGluZS1oZWlnaHQ6IDE7CisgIG1hcmdpbjogLjZlbSAwIDEuOGVtIDA7CisgIHdpZHRoOiAxMDAlOworfQorCit0YWJsZS50cmVldGFibGUgY2FwdGlvbiB7CisgIGZvbnQtc2l6ZTogLjllbTsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIG1hcmdpbi1ib3R0b206IC4yZW07Cit9CisKK3RhYmxlLnRyZWV0YWJsZSB0Ym9keSB0ciB0ZCB7CisgIGN1cnNvcjogZGVmYXVsdDsKKyAgcGFkZGluZzogLjNlbSAxZW07Cit9CisKK3RhYmxlLnRyZWV0YWJsZSBzcGFuIHsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIGxlZnQ7CisgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CisgIHBhZGRpbmc6IC4yZW0gMCAuMmVtIDEuNWVtOworfQorCit0YWJsZS50cmVldGFibGUgc3Bhbi5maWxlIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBUUFBQUMxK2pmcUFBQUFCR2RCVFVFQUFLL0lOd1dLNlFBQUFCbDBSVmgwVTI5bWRIZGhjbVVBUVdSdlltVWdTVzFoWjJWU1pXRmtlWEhKWlR3QUFBRG9TVVJCVkJnWkJjRXhibE5CR0FiQTJjZWVnVFJCdUlLT2dpaWhTWk5UY0M1TFVIQWloTkpSMGtHS0NEY1lKWTZEMy83N01kT2luVHZ6QWdDdzh5c1RoSXZuL1Zvakl5TWpJeVBQK2JTMXNVUUlWMnM5NXBCRER2bWJQL21ka2Z0ODN0cFlndVpxNUpoL09lYVloK3l6eThoVEh2TmxheE5OY3ptK2xhOU9UbGFyMVVkQS8rQzJBNHRyUkNuRDNqUzhCQjFvYnEyR2s2R1U2UWJRQVM0QlVhWVNRQWY0YmhoS0tURmRBenJBT3dBeEVVQUgrS0VNMDFTWTNnTTZ3QnNFQVFCMGdKK21hWm9DM2dJNmlQWWFBSUJKc2lSbUhVMEFBTE9lRkMzYUsyY1dBQUNVWGU3K0F3TzBsYzllVEhZVEFBQUFBRWxGVGtTdVFtQ0MpOworfQorCit0YWJsZS50cmVldGFibGUgc3Bhbi5mb2xkZXIgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBQUJHZEJUVUVBQUsvSU53V0s2UUFBQUJsMFJWaDBVMjltZEhkaGNtVUFRV1J2WW1VZ1NXMWhaMlZTWldGa2VYSEpaVHdBQUFHclNVUkJWRGpMeFpPN2loUkJGSWEvNnUwWlc3R0hCVVYwVVFRVFp6ZDNRZGhNUXhPZndNUlhFQU5CTU5RWDBNekF6RkF3RXpId0FSYk5GRGR3RWQzMU1qM1g3YTZ1T3I5QnR6TmpZaktCSjZuaWNQN3YzS3FjSkZheGhCVnRaVUFLOE9IbGxkMnN0N1hsM0RKUFZPTlArekVVVjRIcUw1VURZSHI1eHZ1UUFqZ2wvUXM3VHp2T09WQWp4amxDK2VQU3dlNkRmYlZlZ0xWdVQ0cjE0ZVRyNnp2QTh4U0FvQkx6eDZwdmo0bCtEWkllenVWa0c5ZlkySDdZUlFJTVpJQnd5Y216SDEvczNGOEFhcGZJUE5GM2tRazcra3c5UFdCeStJWk9kZzVVZzNta0FBVHkvdDB1c292ekdlQ1VXVGpDejBCK1NqMGVrZmR2a1ozYWJCditVNEdhQ3RKMWlFbTZBTlFKNmZFenJHL2VuZ2NLdy93WFF2RUt4U0VLUXhSR0tFN0l6dCtEU2l3QkpNVVNtNzFyZ3VNWWhRS3JCeWdPSVJTdGY0VGlGRlJCdmJSR0tpUUxXUDI5eVJTSEtCVHRmZEJtSHMwQlVwZ3Z0Z0Y0eVJGUitOVUtpMFhaY1lqQ2VDRzJzbWt6TEFIa2JSQm1QMC9VazI2TzVZblVBY3RCcDFHc0FJK1M1blJKSkphbDVLMWFBTXJxMGQ2VG05dUk2emp5Zjc1ZEFlNnR4L1NzV2VELy9vMi9BYjZJSDMvaDI1cE9BQUFBQUVsRlRrU3VRbUNDKTsKK30KKwordGFibGUudHJlZXRhYmxlIHRyLmNvbGxhcHNlZCBzcGFuLmluZGVudGVyIGEgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBQUNYQklXWE1BQUFzVEFBQUxFd0VBbXB3WUFBQUtUMmxEUTFCUWFHOTBiM05vYjNBZ1NVTkRJSEJ5YjJacGJHVUFBSGphblZOblZGUHBGajMzM3ZSQ1M0aUFsRXR2VWhVSUlGSkNpNEFVa1NZcUlRa1FTb2dob2RrVlVjRVJSVVVFRzhpZ2lBT09qb0NNRlZFc0RJb0syQWZrSWFLT2c2T0lpc3I3NFh1amE5YTg5K2JOL3JYWFB1ZXM4NTJ6endmQUNBeVdTRE5STllBTXFVSWVFZUNEeDhURzRlUXVRSUVLSkhBQUVBaXpaQ0Z6L1NNQkFQaCtQRHdySXNBSHZnQUJlTk1MQ0FEQVRadkFNQnlIL3cvcVFwbGNBWUNFQWNCMGtUaExDSUFVQUVCNmprS21BRUJHQVlDZG1DWlRBS0FFQUdETFkyTGpBRkF0QUdBbmYrYlRBSUNkK0psN0FRQmJsQ0VWQWFDUkFDQVRaWWhFQUdnN0FLelBWb3BGQUZnd0FCUm1TOFE1QU5ndEFEQkpWMlpJQUxDM0FNRE9FQXV5QUFnTUFEQlJpSVVwQUFSN0FHRElJeU40QUlTWkFCUkc4bGM4OFN1dUVPY3FBQUI0bWJJOHVTUTVSWUZiQ0MxeEIxZFhMaDRvemtrWEt4UTJZUUpobWtBdXdubVpHVEtCTkEvZzg4d0FBS0NSRlJIZ2cvUDllTTRPcnM3T05vNjJEbDh0NnI4Ry95SmlZdVArNWMrcmNFQUFBT0YwZnRIK0xDK3pHb0E3Qm9CdC9xSWw3Z1JvWGd1Z2RmZUxacklQUUxVQW9PbmFWL053K0g0OFBFV2hrTG5aMmVYazVOaEt4RUpiWWNwWGZmNW53bC9BVi8xcytYNDgvUGYxNEw3aUpJRXlYWUZIQlBqZ3dzejBUS1VjejVJSmhHTGM1bzlIL0xjTC8vd2QweUxFU1dLNVdDb1U0MUVTY1k1RW1venpNcVVpaVVLU0tjVWwwdjlrNHQ4cyt3TSszelVBc0dvK0FYdVJMYWhkWXdQMlN5Y1FXSFRBNHZjQUFQSzdiOEhVS0FnRGdHaUQ0YzkzLys4Ly9VZWdKUUNBWmttU2NRQUFYa1FrTGxUS3N6L0hDQUFBUktDQktyQkJHL1RCR0N6QUJoekJCZHpCQy94Z05vUkNKTVRDUWhCQ0NtU0FISEpnS2F5Q1FpaUd6YkFkS21BdjFFQWROTUJSYUlhVGNBNHV3bFc0RGoxd0QvcGhDSjdCS0x5QkNRUkJ5QWdUWVNIYWlBRmlpbGdqamdnWG1ZWDRJY0ZJQkJLTEpDREppQlJSSWt1Uk5VZ3hVb3BVSUZWSUhmSTljZ0k1aDF4R3VwRTd5QUF5Z3Z5R3ZFY3hsSUd5VVQzVURMVkR1YWczR29SR29ndlFaSFF4bW84V29KdlFjclFhUFl3Mm9lZlFxMmdQMm84K1E4Y3d3T2dZQnpQRWJEQXV4c05Dc1Rnc0NaTmp5N0VpckF5cnhocXdWcXdEdTRuMVk4K3hkd1FTZ1VYQUNUWUVkMElnWVI1QlNGaE1XRTdZU0tnZ0hDUTBFZG9KTndrRGhGSENKeUtUcUV1MEpyb1IrY1FZWWpJeGgxaElMQ1BXRW84VEx4QjdpRVBFTnlRU2lVTXlKN21RQWtteHBGVFNFdEpHMG01U0kra3NxWnMwU0Jvams4bmFaR3V5QnptVUxDQXJ5SVhrbmVURDVEUGtHK1FoOGxzS25XSkFjYVQ0VStJb1VzcHFTaG5sRU9VMDVRWmxtREpCVmFPYVV0Mm9vVlFSTlk5YVFxMmh0bEt2VVllb0V6UjFtam5OZ3haSlM2V3RvcFhUR21nWGFQZHByK2gwdWhIZGxSNU9sOUJYMHN2cFIraVg2QVAwZHd3TmhoV0R4NGhuS0JtYkdBY1laeGwzR0srWVRLWVowNHNaeDFRd056SHJtT2VaRDVsdlZWZ3F0aXA4RlpIS0NwVktsU2FWR3lvdlZLbXFwcXJlcWd0VjgxWExWSStwWGxOOXJrWlZNMVBqcVFuVWxxdFZxcDFRNjFNYlUyZXBPNmlIcW1lb2IxUS9wSDVaL1lrR1djTk13MDlEcEZHZ3NWL2p2TVlnQzJNWnMzZ3NJV3NOcTRaMWdUWEVKckhOMlh4MktydVkvUjI3aXoycXFhRTVRek5LTTFlelV2T1VaajhINDVoeCtKeDBUZ25uS0tlWDgzNkszaFR2S2VJcEc2WTBUTGt4WlZ4cnFwYVhsbGlyU0t0UnEwZnJ2VGF1N2FlZHByMUZ1MW43Z1E1Qngwb25YQ2RIWjQvT0JaM25VOWxUM2FjS3B4Wk5QVHIxcmk2cWE2VWJvYnRFZDc5dXArNllucjVlZ0o1TWI2ZmVlYjNuK2h4OUwvMVUvVzM2cC9WSERGZ0dzd3drQnRzTXpoZzh4VFZ4Ynp3ZEw4ZmI4VkZEWGNOQVE2VmhsV0dYNFlTUnVkRThvOVZHalVZUGpHbkdYT01rNDIzR2JjYWpKZ1ltSVNaTFRlcE43cHBTVGJtbUthWTdURHRNeDgzTXphTE4xcGsxbXoweDF6TG5tK2ViMTV2ZnQyQmFlRm9zdHFpMnVHVkpzdVJhcGxudXRyeHVoVm81V2FWWVZWcGRzMGF0bmEwbDFydXR1NmNScDdsT2swNnJudFpudzdEeHRzbTJxYmNac09YWUJ0dXV0bTIyZldGblloZG50OFd1dys2VHZaTjl1bjJOL1QwSERZZlpEcXNkV2gxK2M3UnlGRHBXT3Q2YXpwenVQMzNGOUpicEwyZFl6eERQMkRQanRoUExLY1JwblZPYjAwZG5GMmU1YzRQemlJdUpTNExMTHBjK0xwc2J4dDNJdmVSS2RQVnhYZUY2MHZXZG03T2J3dTJvMjYvdU51NXA3b2Zjbjh3MG55bWVXVE56ME1QSVErQlI1ZEUvQzUrVk1HdmZySDVQUTArQlo3WG5JeTlqTDVGWHJkZXd0NlYzcXZkaDd4Yys5ajV5bitNKzR6dzMzakxlV1YvTU44QzN5TGZMVDhOdm5sK0YzME4vSS85ay8zci8wUUNuZ0NVQlp3T0pnVUdCV3dMNytIcDhJYitPUHpyYlpmYXkyZTFCaktDNVFSVkJqNEt0Z3VYQnJTRm95T3lRclNIMzU1ak9rYzVwRG9WUWZ1alcwQWRoNW1HTHczNE1KNFdIaFZlR1A0NXdpRmdhMFRHWE5YZlIzRU56MzBUNlJKWkUzcHRuTVU4NXJ5MUtOU28rcWk1cVBObzN1alM2UDhZdVpsbk0xVmlkV0Vsc1N4dzVMaXF1Tm01c3Z0Lzg3Zk9INHAzaUMrTjdGNWd2eUYxd2VhSE93dlNGcHhhcExoSXNPcFpBVEloT09KVHdRUkFxcUJhTUpmSVRkeVdPQ25uQ0hjSm5JaS9STnRHSTJFTmNLaDVPOGtncVRYcVM3Skc4Tlhra3hUT2xMT1c1aENlcGtMeE1EVXpkbXpxZUZwcDJJRzB5UFRxOU1ZT1NrWkJ4UXFvaFRaTzJaK3BuNW1aMnk2eGxoYkwreFc2THR5OGVsUWZKYTdPUXJBVlpMUXEyUXFib1ZGb28xeW9Ic21kbFYyYS96WW5LT1phcm5pdk43Y3l6eXR1UU41enZuLy90RXNJUzRaSzJwWVpMVnkwZFdPYTlyR281c2p4eGVkc0s0eFVGSzRaV0Jxdzh1SXEyS20zVlQ2dnRWNWV1ZnIwbWVrMXJnVjdCeW9MQnRRRnI2d3RWQ3VXRmZldmMxKzFkVDFndldkKzFZZnFHblJzK0ZZbUtyaFRiRjVjVmY5Z28zSGpsRzRkdnlyK1ozSlMwcWF2RXVXVFBadEptNmViZUxaNWJEcGFxbCthWERtNE4yZHEwRGQ5V3RPMzE5a1hiTDVmTktOdTdnN1pEdWFPL1BMaThaYWZKenMwN1AxU2tWUFJVK2xRMjd0TGR0V0hYK0c3UjdodDd2UFkwN05YYlc3ejMvVDdKdnR0VkFWVk4xV2JWWmZ0Sis3UDNQNjZKcXVuNGx2dHRYYTFPYlhIdHh3UFNBLzBISXc2MjE3blUxUjNTUFZSU2o5WXI2MGNPeHgrKy9wM3ZkeTBOTmcxVmpaekc0aU53UkhuazZmY0ozL2NlRFRyYWRveDdyT0VIMHg5MkhXY2RMMnBDbXZLYVJwdFRtdnRiWWx1NlQ4dyswZGJxM25yOFI5c2ZENXcwUEZsNVN2TlV5V25hNllMVGsyZnl6NHlkbFoxOWZpNzUzR0Rib3JaNzUyUE8zMm9QYisrNkVIVGgwa1gvaStjN3ZEdk9YUEs0ZFBLeTIrVVRWN2hYbXE4NlgyM3FkT284L3BQVFQ4ZTduTHVhcnJsY2E3bnVlcjIxZTJiMzZSdWVOODdkOUwxNThSYi8xdFdlT1QzZHZmTjZiL2ZGOS9YZkZ0MStjaWY5enN1NzJYY243cTI4VDd4ZjlFRHRRZGxEM1lmVlAxdiszTmp2M0g5cXdIZWc4OUhjUi9jR2hZUFAvcEgxanc5REJZK1pqOHVHRFlicm5qZytPVG5pUDNMOTZmeW5RODlrenlhZUYvNmkvc3V1RnhZdmZ2alY2OWZPMFpqUm9aZnlsNU8vYlh5bC9lckE2eG12MjhiQ3hoNit5WGd6TVY3MFZ2dnR3WGZjZHgzdm85OFBUK1I4SUg4by8yajVzZlZUMEtmN2t4bVRrLzhFQTVqei9HTXpMZHNBQUFBZ1kwaFNUUUFBZWlVQUFJQ0RBQUQ1L3dBQWdPa0FBSFV3QUFEcVlBQUFPcGdBQUJkdmtsL0ZSZ0FBQUhsSlJFRlVlTnJjVTFzTmdEQVE2d2dtY0FNMk1JQ0dHbGcxZ0puTnpXUWN2d1FHeTFqNG9VbC83dEgwbXB3ek03U2dReU8rRVpBVVdoMk1ra3pTV2hKd3VSQWxIWXNKd0V3eXZzMWdBQkR1enFvSmNUdzVxeGFJSk4wYmdRUmdJam5sbW4xaGVTTzVQRTZZMllYZSs1Q3I1K2grK2dzMTJBY0FTNkZTKzdZT3NqNEFBQUFBU1VWT1JLNUNZSUk9KTsKK30KKwordGFibGUudHJlZXRhYmxlIHRyLmV4cGFuZGVkIHNwYW4uaW5kZW50ZXIgYSB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFBQ1hCSVdYTUFBQXNUQUFBTEV3RUFtcHdZQUFBS1QybERRMUJRYUc5MGIzTm9iM0FnU1VORElIQnliMlpwYkdVQUFIamFuVk5uVkZQcEZqMzMzdlJDUzRpQWxFdHZVaFVJSUZKQ2k0QVVrU1lxSVFrUVNvZ2hvZGtWVWNFUlJVVUVHOGlnaUFPT2pvQ01GVkVzRElvSzJBZmtJYUtPZzZPSWlzcjc0WHVqYTlhODkrYk4vclhYUHVlczg1Mnp6d2ZBQ0F5V1NETlJOWUFNcVVJZUVlQ0R4OFRHNGVRdVFJRUtKSEFBRUFpelpDRnovU01CQVBoK1BEd3JJc0FIdmdBQmVOTUxDQURBVFp2QU1CeUgvdy9xUXBsY0FZQ0VBY0Iwa1RoTENJQVVBRUI2amtLbUFFQkdBWUNkbUNaVEFLQUVBR0RMWTJMakFGQXRBR0FuZitiVEFJQ2QrSmw3QVFCYmxDRVZBYUNSQUNBVFpZaEVBR2c3QUt6UFZvcEZBRmd3QUJSbVM4UTVBTmd0QURCSlYyWklBTEMzQU1ET0VBdXlBQWdNQURCUmlJVXBBQVI3QUdESUl5TjRBSVNaQUJSRzhsYzg4U3V1RU9jcUFBQjRtYkk4dVNRNVJZRmJDQzF4QjFkWExoNG96a2tYS3hRMllRSmhta0F1d25tWkdUS0JOQS9nODh3QUFLQ1JGUkhnZy9QOWVNNE9yczdPTm82MkRsOHQ2cjhHL3lKaVl1UCs1YytyY0VBQUFPRjBmdEgrTEMrekdvQTdCb0J0L3FJbDdnUm9YZ3VnZGZlTFpySVBRTFVBb09uYVYvTncrSDQ4UEVXaGtMbloyZVhrNU5oS3hFSmJZY3BYZmY1bndsL0FWLzFzK1g0OC9QZjE0TDdpSklFeVhZRkhCUGpnd3N6MFRLVWN6NUlKaEdMYzVvOUgvTGNMLy93ZDB5TEVTV0s1V0NvVTQxRVNjWTVFbW96ek1xVWlpVUtTS2NVbDB2OWs0dDhzK3dNKzN6VUFzR28rQVh1UkxhaGRZd1AyU3ljUVdIVEE0dmNBQVBLN2I4SFVLQWdEZ0dpRDRjOTMvKzgvL1VlZ0pRQ0Faa21TY1FBQVhrUWtMbFRLc3ovSENBQUFSS0NCS3JCQkcvVEJHQ3pBQmh6QkJkekJDL3hnTm9SQ0pNVENRaEJDQ21TQUhISmdLYXlDUWlpR3piQWRLbUF2MUVBZE5NQlJhSWFUY0E0dXdsVzREajF3RC9waENKN0JLTHlCQ1FSQnlBZ1RZU0hhaUFGaWlsZ2pqZ2dYbVlYNEljRklCQktMSkNESmlCUlJJa3VSTlVneFVvcFVJRlZJSGZJOWNnSTVoMXhHdXBFN3lBQXlndnlHdkVjeGxJR3lVVDNVRExWRHVhZzNHb1JHb2d2UVpIUXhtbzhXb0p2UWNyUWFQWXcyb2VmUXEyZ1AybzgrUThjd3dPZ1lCelBFYkRBdXhzTkNzVGdzQ1pOank3RWlyQXlyeGhxd1Zxd0R1NG4xWTgreGR3UVNnVVhBQ1RZRWQwSWdZUjVCU0ZoTVdFN1lTS2dnSENRMEVkb0pOd2tEaEZIQ0p5S1RxRXUwSnJvUitjUVlZakl4aDFoSUxDUFdFbzhUTHhCN2lFUEVOeVFTaVVNeUo3bVFBa214cEZUU0V0SkcwbTVTSStrc3FaczBTQm9qazhuYVpHdXlCem1VTENBcnlJWGtuZVRENURQa0crUWg4bHNLbldKQWNhVDRVK0lvVXNwcVNobmxFT1UwNVFabG1ESkJWYU9hVXQyb29WUVJOWTlhUXEyaHRsS3ZVWWVvRXpSMW1qbk5neFpKUzZXdG9wWFRHbWdYYVBkcHIraDB1aEhkbFI1T2w5Qlgwc3ZwUitpWDZBUDBkd3dOaGhXRHg0aG5LQm1iR0FjWVp4bDNHSytZVEtZWjA0c1p4MVF3TnpIcm1PZVpENWx2VlZncXRpcDhGWkhLQ3BWS2xTYVZHeW92VkttcXBxcmVxZ3RWODFYTFZJK3BYbE45cmtaVk0xUGpxUW5VbHF0VnFwMVE2MU1iVTJlcE82aUhxbWVvYjFRL3BINVovWWtHV2NOTXcwOURwRkdnc1YvanZNWWdDMk1aczNnc0lXc05xNFoxZ1RYRUpySE4yWHgyS3J1WS9SMjdpejJxcWFFNVF6TktNMWV6VXZPVVpqOEg0NWh4K0p4MFRnbm5LS2VYODM2SzNoVHZLZUlwRzZZMFRMa3haVnhycXBhWGxsaXJTS3RScTBmcnZUYXU3YWVkcHIxRnUxbjdnUTVCeDBvblhDZEhaNC9PQlozblU5bFQzYWNLcHhaTlBUcjFyaTZxYTZVYm9idEVkNzl1cCs2WW5yNWVnSjVNYjZmZWViM24raHg5TC8xVS9XMzZwL1ZIREZnR3N3d2tCdHNNemhnOHhUVnhiendkTDhmYjhWRkRYY05BUTZWaGxXR1g0WVNSdWRFOG85VkdqVVlQakduR1hPTWs0MjNHYmNhakpnWW1JU1pMVGVwTjdwcFNUYm1tS2FZN1REdE14ODNNemFMTjFwazFtejB4MXpMbm0rZWIxNXZmdDJCYWVGb3N0cWkydUdWSnN1UmFwbG51dHJ4dWhWbzVXYVZZVlZwZHMwYXRuYTBsMXJ1dHU2Y1JwN2xPazA2cm50Wm53N0R4dHNtMnFiY1pzT1hZQnR1dXRtMjJmV0ZuWWhkbnQ4V3V3KzZUdlpOOXVuMk4vVDBIRFlmWkRxc2RXaDErYzdSeUZEcFdPdDZhenB6dVAzM0Y5SmJwTDJkWXp4RFAyRFBqdGhQTEtjUnBuVk9iMDBkbkYyZTVjNFB6aUl1SlM0TExMcGMrTHBzYnh0M0l2ZVJLZFBWeFhlRjYwdldkbTdPYnd1Mm8yNi91TnU1cDdvZmNuOHcwbnltZVdUTnowTVBJUStCUjVkRS9DNStWTUd2ZnJINVBRMCtCWjdYbkl5OWpMNUZYcmRld3Q2VjNxdmRoN3hjKzlqNXluK00rNHp3MzNqTGVXVi9NTjhDM3lMZkxUOE52bmwrRjMwTi9JLzlrLzNyLzBRQ25nQ1VCWndPSmdVR0JXd0w3K0hwOEliK09QenJiWmZheTJlMUJqS0M1UVJWQmo0S3RndVhCclNGb3lPeVFyU0gzNTVqT2tjNXBEb1ZRZnVqVzBBZGg1bUdMdzM0TUo0V0hoVmVHUDQ1d2lGZ2EwVEdYTlhmUjNFTnozMFQ2UkpaRTNwdG5NVTg1cnkxS05TbytxaTVxUE5vM3VqUzZQOFl1WmxuTTFWaWRXRWxzU3h3NUxpcXVObTVzdnQvODdmT0g0cDNpQytON0Y1Z3Z5RjF3ZWFIT3d2U0ZweGFwTGhJc09wWkFUSWhPT0pUd1FSQXFxQmFNSmZJVGR5V09Dbm5DSGNKbklpL1JOdEdJMkVOY0toNU84a2dxVFhxUzdKRzhOWGtreFRPbExPVzVoQ2Vwa0x4TURVemRtenFlRnBwMklHMHlQVHE5TVlPU2taQnhRcW9oVFpPMlorcG41bVoyeTZ4bGhiTCt4VzZMdHk4ZWxRZkphN09RckFWWkxRcTJRcWJvVkZvbzF5b0hzbWRsVjJhL3pZbktPWmFybml2TjdjeXp5dHVRTjV6dm4vL3RFc0lTNFpLMnBZWkxWeTBkV09hOXJHbzVzanh4ZWRzSzR4VUZLNFpXQnF3OHVJcTJLbTNWVDZ2dFY1ZXVmcjBtZWsxcmdWN0J5b0xCdFFGcjZ3dFZDdVdGZmV2YzErMWRUMWd2V2QrMVlmcUduUnMrRlltS3JoVGJGNWNWZjlnbzNIamxHNGR2eXIrWjNKUzBxYXZFdVdUUFp0Sm02ZWJlTFo1YkRwYXFsK2FYRG00TjJkcTBEZDlXdE8zMTlrWGJMNWZOS051N2c3WkR1YU8vUExpOFphZkp6czA3UDFTa1ZQUlUrbFEyN3RMZHRXSFgrRzdSN2h0N3ZQWTA3TlhiVzd6My9UN0p2dHRWQVZWTjFXYlZaZnRKKzdQM1A2NkpxdW40bHZ0dFhhMU9iWEh0eHdQU0EvMEhJdzYyMTduVTFSM1NQVlJTajlZcjYwY094eCsrL3AzdmR5ME5OZzFWalp6RzRpTndSSG5rNmZjSjMvY2VEVHJhZG94N3JPRUgweDkySFdjZEwycENtdkthUnB0VG12dGJZbHU2VDh3KzBkYnEzbnI4UjlzZkQ1dzBQRmw1U3ZOVXlXbmE2WUxUazJmeXo0eWRsWjE5Zmk3NTNHRGJvclo3NTJQTzMyb1BiKys2RUhUaDBrWC9pK2M3dkR2T1hQSzRkUEt5MitVVFY3aFhtcTg2WDIzcWRPbzgvcFBUVDhlN25MdWFycmxjYTdudWVyMjFlMmIzNlJ1ZU44N2Q5TDE1OFJiLzF0V2VPVDNkdmZONmIvZkY5L1hmRnQxK2NpZjl6c3U3MlhjbjdxMjhUN3hmOUVEdFFkbEQzWWZWUDF2KzNOanYzSDlxd0hlZzg5SGNSL2NHaFlQUC9wSDFqdzlEQlkrWmo4dUdEWWJybmpnK09UbmlQM0w5NmZ5blE4OWt6eWFlRi82aS9zdXVGeFl2ZnZqVjY5Zk8wWmpSb1pmeWw1Ty9iWHlsL2VyQTZ4bXYyOGJDeGg2K3lYZ3pNVjcwVnZ2dHdYZmNkeDN2bzk4UFQrUjhJSDhvLzJqNXNmVlQwS2Y3a3htVGsvOEVBNWp6L0dNekxkc0FBQUFnWTBoU1RRQUFlaVVBQUlDREFBRDUvd0FBZ09rQUFIVXdBQURxWUFBQU9wZ0FBQmR2a2wvRlJnQUFBSEZKUkVGVWVOcGkvUC8vUHdNbGdJbUJRc0E0NEM2Z3ZoZmEyOXYzTXpBd09PRFJjNkN5c3RJUmJ4aTB0N2ZqREpqS3lrcEdZcnd3aTFoeG5MSFEzdDcraklHQlFSSko2SGxsWmFVVUtZRVlSWUJQT0IwZ0JTaEt3S0dBLy8vLzQ4VnRiVzMvOGNsVG5CSUgzZ0NLa3pKZ0FHdkJYMGREbTBzQ0FBQUFBRWxGVGtTdVFtQ0MpOworfQorCisKKwordGFibGUudHJlZXRhYmxlIHRyLmNvbGxhcHNlZC5zZWxlY3RlZCBzcGFuLmluZGVudGVyIGEgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBQUNYQklXWE1BQUFzVEFBQUxFd0VBbXB3WUFBQUtUMmxEUTFCUWFHOTBiM05vYjNBZ1NVTkRJSEJ5YjJacGJHVUFBSGphblZOblZGUHBGajMzM3ZSQ1M0aUFsRXR2VWhVSUlGSkNpNEFVa1NZcUlRa1FTb2dob2RrVlVjRVJSVVVFRzhpZ2lBT09qb0NNRlZFc0RJb0syQWZrSWFLT2c2T0lpc3I3NFh1amE5YTg5K2JOL3JYWFB1ZXM4NTJ6endmQUNBeVdTRE5STllBTXFVSWVFZUNEeDhURzRlUXVRSUVLSkhBQUVBaXpaQ0Z6L1NNQkFQaCtQRHdySXNBSHZnQUJlTk1MQ0FEQVRadkFNQnlIL3cvcVFwbGNBWUNFQWNCMGtUaExDSUFVQUVCNmprS21BRUJHQVlDZG1DWlRBS0FFQUdETFkyTGpBRkF0QUdBbmYrYlRBSUNkK0psN0FRQmJsQ0VWQWFDUkFDQVRaWWhFQUdnN0FLelBWb3BGQUZnd0FCUm1TOFE1QU5ndEFEQkpWMlpJQUxDM0FNRE9FQXV5QUFnTUFEQlJpSVVwQUFSN0FHRElJeU40QUlTWkFCUkc4bGM4OFN1dUVPY3FBQUI0bWJJOHVTUTVSWUZiQ0MxeEIxZFhMaDRvemtrWEt4UTJZUUpobWtBdXdubVpHVEtCTkEvZzg4d0FBS0NSRlJIZ2cvUDllTTRPcnM3T05vNjJEbDh0NnI4Ry95SmlZdVArNWMrcmNFQUFBT0YwZnRIK0xDK3pHb0E3Qm9CdC9xSWw3Z1JvWGd1Z2RmZUxacklQUUxVQW9PbmFWL053K0g0OFBFV2hrTG5aMmVYazVOaEt4RUpiWWNwWGZmNW53bC9BVi8xcytYNDgvUGYxNEw3aUpJRXlYWUZIQlBqZ3dzejBUS1VjejVJSmhHTGM1bzlIL0xjTC8vd2QweUxFU1dLNVdDb1U0MUVTY1k1RW1venpNcVVpaVVLU0tjVWwwdjlrNHQ4cyt3TSszelVBc0dvK0FYdVJMYWhkWXdQMlN5Y1FXSFRBNHZjQUFQSzdiOEhVS0FnRGdHaUQ0YzkzLys4Ly9VZWdKUUNBWmttU2NRQUFYa1FrTGxUS3N6L0hDQUFBUktDQktyQkJHL1RCR0N6QUJoekJCZHpCQy94Z05vUkNKTVRDUWhCQ0NtU0FISEpnS2F5Q1FpaUd6YkFkS21BdjFFQWROTUJSYUlhVGNBNHV3bFc0RGoxd0QvcGhDSjdCS0x5QkNRUkJ5QWdUWVNIYWlBRmlpbGdqamdnWG1ZWDRJY0ZJQkJLTEpDREppQlJSSWt1Uk5VZ3hVb3BVSUZWSUhmSTljZ0k1aDF4R3VwRTd5QUF5Z3Z5R3ZFY3hsSUd5VVQzVURMVkR1YWczR29SR29ndlFaSFF4bW84V29KdlFjclFhUFl3Mm9lZlFxMmdQMm84K1E4Y3d3T2dZQnpQRWJEQXV4c05Dc1Rnc0NaTmp5N0VpckF5cnhocXdWcXdEdTRuMVk4K3hkd1FTZ1VYQUNUWUVkMElnWVI1QlNGaE1XRTdZU0tnZ0hDUTBFZG9KTndrRGhGSENKeUtUcUV1MEpyb1IrY1FZWWpJeGgxaElMQ1BXRW84VEx4QjdpRVBFTnlRU2lVTXlKN21RQWtteHBGVFNFdEpHMG01U0kra3NxWnMwU0Jvams4bmFaR3V5QnptVUxDQXJ5SVhrbmVURDVEUGtHK1FoOGxzS25XSkFjYVQ0VStJb1VzcHFTaG5sRU9VMDVRWmxtREpCVmFPYVV0Mm9vVlFSTlk5YVFxMmh0bEt2VVllb0V6UjFtam5OZ3haSlM2V3RvcFhUR21nWGFQZHByK2gwdWhIZGxSNU9sOUJYMHN2cFIraVg2QVAwZHd3TmhoV0R4NGhuS0JtYkdBY1laeGwzR0srWVRLWVowNHNaeDFRd056SHJtT2VaRDVsdlZWZ3F0aXA4RlpIS0NwVktsU2FWR3lvdlZLbXFwcXJlcWd0VjgxWExWSStwWGxOOXJrWlZNMVBqcVFuVWxxdFZxcDFRNjFNYlUyZXBPNmlIcW1lb2IxUS9wSDVaL1lrR1djTk13MDlEcEZHZ3NWL2p2TVlnQzJNWnMzZ3NJV3NOcTRaMWdUWEVKckhOMlh4MktydVkvUjI3aXoycXFhRTVRek5LTTFlelV2T1VaajhINDVoeCtKeDBUZ25uS0tlWDgzNkszaFR2S2VJcEc2WTBUTGt4WlZ4cnFwYVhsbGlyU0t0UnEwZnJ2VGF1N2FlZHByMUZ1MW43Z1E1Qngwb25YQ2RIWjQvT0JaM25VOWxUM2FjS3B4Wk5QVHIxcmk2cWE2VWJvYnRFZDc5dXArNllucjVlZ0o1TWI2ZmVlYjNuK2h4OUwvMVUvVzM2cC9WSERGZ0dzd3drQnRzTXpoZzh4VFZ4Ynp3ZEw4ZmI4VkZEWGNOQVE2VmhsV0dYNFlTUnVkRThvOVZHalVZUGpHbkdYT01rNDIzR2JjYWpKZ1ltSVNaTFRlcE43cHBTVGJtbUthWTdURHRNeDgzTXphTE4xcGsxbXoweDF6TG5tK2ViMTV2ZnQyQmFlRm9zdHFpMnVHVkpzdVJhcGxudXRyeHVoVm81V2FWWVZWcGRzMGF0bmEwbDFydXR1NmNScDdsT2swNnJudFpudzdEeHRzbTJxYmNac09YWUJ0dXV0bTIyZldGblloZG50OFd1dys2VHZaTjl1bjJOL1QwSERZZlpEcXNkV2gxK2M3UnlGRHBXT3Q2YXpwenVQMzNGOUpicEwyZFl6eERQMkRQanRoUExLY1JwblZPYjAwZG5GMmU1YzRQemlJdUpTNExMTHBjK0xwc2J4dDNJdmVSS2RQVnhYZUY2MHZXZG03T2J3dTJvMjYvdU51NXA3b2Zjbjh3MG55bWVXVE56ME1QSVErQlI1ZEUvQzUrVk1HdmZySDVQUTArQlo3WG5JeTlqTDVGWHJkZXd0NlYzcXZkaDd4Yys5ajV5bitNKzR6dzMzakxlV1YvTU44QzN5TGZMVDhOdm5sK0YzME4vSS85ay8zci8wUUNuZ0NVQlp3T0pnVUdCV3dMNytIcDhJYitPUHpyYlpmYXkyZTFCaktDNVFSVkJqNEt0Z3VYQnJTRm95T3lRclNIMzU1ak9rYzVwRG9WUWZ1alcwQWRoNW1HTHczNE1KNFdIaFZlR1A0NXdpRmdhMFRHWE5YZlIzRU56MzBUNlJKWkUzcHRuTVU4NXJ5MUtOU28rcWk1cVBObzN1alM2UDhZdVpsbk0xVmlkV0Vsc1N4dzVMaXF1Tm01c3Z0Lzg3Zk9INHAzaUMrTjdGNWd2eUYxd2VhSE93dlNGcHhhcExoSXNPcFpBVEloT09KVHdRUkFxcUJhTUpmSVRkeVdPQ25uQ0hjSm5JaS9STnRHSTJFTmNLaDVPOGtncVRYcVM3Skc4Tlhra3hUT2xMT1c1aENlcGtMeE1EVXpkbXpxZUZwcDJJRzB5UFRxOU1ZT1NrWkJ4UXFvaFRaTzJaK3BuNW1aMnk2eGxoYkwreFc2THR5OGVsUWZKYTdPUXJBVlpMUXEyUXFib1ZGb28xeW9Ic21kbFYyYS96WW5LT1phcm5pdk43Y3l6eXR1UU41enZuLy90RXNJUzRaSzJwWVpMVnkwZFdPYTlyR281c2p4eGVkc0s0eFVGSzRaV0Jxdzh1SXEyS20zVlQ2dnRWNWV1ZnIwbWVrMXJnVjdCeW9MQnRRRnI2d3RWQ3VXRmZldmMxKzFkVDFndldkKzFZZnFHblJzK0ZZbUtyaFRiRjVjVmY5Z28zSGpsRzRkdnlyK1ozSlMwcWF2RXVXVFBadEptNmViZUxaNWJEcGFxbCthWERtNE4yZHEwRGQ5V3RPMzE5a1hiTDVmTktOdTdnN1pEdWFPL1BMaThaYWZKenMwN1AxU2tWUFJVK2xRMjd0TGR0V0hYK0c3UjdodDd2UFkwN05YYlc3ejMvVDdKdnR0VkFWVk4xV2JWWmZ0Sis3UDNQNjZKcXVuNGx2dHRYYTFPYlhIdHh3UFNBLzBISXc2MjE3blUxUjNTUFZSU2o5WXI2MGNPeHgrKy9wM3ZkeTBOTmcxVmpaekc0aU53UkhuazZmY0ozL2NlRFRyYWRveDdyT0VIMHg5MkhXY2RMMnBDbXZLYVJwdFRtdnRiWWx1NlQ4dyswZGJxM25yOFI5c2ZENXcwUEZsNVN2TlV5V25hNllMVGsyZnl6NHlkbFoxOWZpNzUzR0Rib3JaNzUyUE8zMm9QYisrNkVIVGgwa1gvaStjN3ZEdk9YUEs0ZFBLeTIrVVRWN2hYbXE4NlgyM3FkT284L3BQVFQ4ZTduTHVhcnJsY2E3bnVlcjIxZTJiMzZSdWVOODdkOUwxNThSYi8xdFdlT1QzZHZmTjZiL2ZGOS9YZkZ0MStjaWY5enN1NzJYY243cTI4VDd4ZjlFRHRRZGxEM1lmVlAxdiszTmp2M0g5cXdIZWc4OUhjUi9jR2hZUFAvcEgxanc5REJZK1pqOHVHRFlicm5qZytPVG5pUDNMOTZmeW5RODlrenlhZUYvNmkvc3V1RnhZdmZ2alY2OWZPMFpqUm9aZnlsNU8vYlh5bC9lckE2eG12MjhiQ3hoNit5WGd6TVY3MFZ2dnR3WGZjZHgzdm85OFBUK1I4SUg4by8yajVzZlZUMEtmN2t4bVRrLzhFQTVqei9HTXpMZHNBQUFBZ1kwaFNUUUFBZWlVQUFJQ0RBQUQ1L3dBQWdPa0FBSFV3QUFEcVlBQUFPcGdBQUJkdmtsL0ZSZ0FBQUZwSlJFRlVlTnBpL1AvL1B3TWxnSEhBRFdENC8vOC9OdHlBUXh3RDQ1S0FBUWRLRGZqLy8vLy8vZmdNSXNZQVpJTXcxREtSRUZ3T0RBd00vNGtOUktxNjRBQURBNE1qRkRPUTZnS3lZNEhvZE1BNDlQTUN4UVlBQmdBVllIc2p5WjF4N1FBQUFBQkpSVTVFcmtKZ2dnPT0pOworfQorCit0YWJsZS50cmVldGFibGUgdHIuZXhwYW5kZWQuc2VsZWN0ZWQgc3Bhbi5pbmRlbnRlciBhIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUFDWEJJV1hNQUFBc1RBQUFMRXdFQW1wd1lBQUFLVDJsRFExQlFhRzkwYjNOb2IzQWdTVU5ESUhCeWIyWnBiR1VBQUhqYW5WTm5WRlBwRmozMzN2UkNTNGlBbEV0dlVoVUlJRkpDaTRBVWtTWXFJUWtRU29naG9ka1ZVY0VSUlVVRUc4aWdpQU9Pam9DTUZWRXNESW9LMkFma0lhS09nNk9JaXNyNzRYdWphOWE4OStiTi9yWFhQdWVzODUyenp3ZkFDQXlXU0ROUk5ZQU1xVUllRWVDRHg4VEc0ZVF1UUlFS0pIQUFFQWl6WkNGei9TTUJBUGgrUER3cklzQUh2Z0FCZU5NTENBREFUWnZBTUJ5SC93L3FRcGxjQVlDRUFjQjBrVGhMQ0lBVUFFQjZqa0ttQUVCR0FZQ2RtQ1pUQUtBRUFHRExZMkxqQUZBdEFHQW5mK2JUQUlDZCtKbDdBUUJibENFVkFhQ1JBQ0FUWlloRUFHZzdBS3pQVm9wRkFGZ3dBQlJtUzhRNUFOZ3RBREJKVjJaSUFMQzNBTURPRUF1eUFBZ01BREJSaUlVcEFBUjdBR0RJSXlONEFJU1pBQlJHOGxjODhTdXVFT2NxQUFCNG1iSTh1U1E1UllGYkNDMXhCMWRYTGg0b3pra1hLeFEyWVFKaG1rQXV3bm1aR1RLQk5BL2c4OHdBQUtDUkZSSGdnL1A5ZU00T3JzN09ObzYyRGw4dDZyOEcveUppWXVQKzVjK3JjRUFBQU9GMGZ0SCtMQyt6R29BN0JvQnQvcUlsN2dSb1hndWdkZmVMWnJJUFFMVUFvT25hVi9OdytINDhQRVdoa0xuWjJlWGs1TmhLeEVKYlljcFhmZjVud2wvQVYvMXMrWDQ4L1BmMTRMN2lKSUV5WFlGSEJQamd3c3owVEtVY3o1SUpoR0xjNW85SC9MY0wvL3dkMHlMRVNXSzVXQ29VNDFFU2NZNUVtb3p6TXFVaWlVS1NLY1VsMHY5azR0OHMrd00rM3pVQXNHbytBWHVSTGFoZFl3UDJTeWNRV0hUQTR2Y0FBUEs3YjhIVUtBZ0RnR2lENGM5My8rOC8vVWVnSlFDQVprbVNjUUFBWGtRa0xsVEtzei9IQ0FBQVJLQ0JLckJCRy9UQkdDekFCaHpCQmR6QkMveGdOb1JDSk1UQ1FoQkNDbVNBSEhKZ0theUNRaWlHemJBZEttQXYxRUFkTk1CUmFJYVRjQTR1d2xXNERqMXdEL3BoQ0o3QktMeUJDUVJCeUFnVFlTSGFpQUZpaWxnampnZ1htWVg0SWNGSUJCS0xKQ0RKaUJSUklrdVJOVWd4VW9wVUlGVklIZkk5Y2dJNWgxeEd1cEU3eUFBeWd2eUd2RWN4bElHeVVUM1VETFZEdWFnM0dvUkdvZ3ZRWkhReG1vOFdvSnZRY3JRYVBZdzJvZWZRcTJnUDJvOCtROGN3d09nWUJ6UEViREF1eHNOQ3NUZ3NDWk5qeTdFaXJBeXJ4aHF3VnF3RHU0bjFZOCt4ZHdRU2dVWEFDVFlFZDBJZ1lSNUJTRmhNV0U3WVNLZ2dIQ1EwRWRvSk53a0RoRkhDSnlLVHFFdTBKcm9SK2NRWVlqSXhoMWhJTENQV0VvOFRMeEI3aUVQRU55UVNpVU15SjdtUUFrbXhwRlRTRXRKRzBtNVNJK2tzcVpzMFNCb2prOG5hWkd1eUJ6bVVMQ0FyeUlYa25lVEQ1RFBrRytRaDhsc0tuV0pBY2FUNFUrSW9Vc3BxU2hubEVPVTA1UVpsbURKQlZhT2FVdDJvb1ZRUk5ZOWFRcTJodGxLdlVZZW9FelIxbWpuTmd4WkpTNld0b3BYVEdtZ1hhUGRwcitoMHVoSGRsUjVPbDlCWDBzdnBSK2lYNkFQMGR3d05oaFdEeDRobktCbWJHQWNZWnhsM0dLK1lUS1laMDRzWngxUXdOekhybU9lWkQ1bHZWVmdxdGlwOEZaSEtDcFZLbFNhVkd5b3ZWS21xcHFyZXFndFY4MVhMVkkrcFhsTjlya1pWTTFQanFRblVscXRWcXAxUTYxTWJVMmVwTzZpSHFtZW9iMVEvcEg1Wi9Za0dXY05NdzA5RHBGR2dzVi9qdk1ZZ0MyTVpzM2dzSVdzTnE0WjFnVFhFSnJITjJYeDJLcnVZL1IyN2l6MnFxYUU1UXpOS00xZXpVdk9VWmo4SDQ1aHgrSngwVGdubktLZVg4MzZLM2hUdktlSXBHNlkwVExreFpWeHJxcGFYbGxpclNLdFJxMGZydlRhdTdhZWRwcjFGdTFuN2dRNUJ4MG9uWENkSFo0L09CWjNuVTlsVDNhY0tweFpOUFRyMXJpNnFhNlVib2J0RWQ3OXVwKzZZbnI1ZWdKNU1iNmZlZWIzbitoeDlMLzFVL1czNnAvVkhERmdHc3d3a0J0c016aGc4eFRWeGJ6d2RMOGZiOFZGRFhjTkFRNlZobFdHWDRZU1J1ZEU4bzlWR2pVWVBqR25HWE9NazQyM0diY2FqSmdZbUlTWkxUZXBON3BwU1RibW1LYVk3VER0TXg4M016YUxOMXBrMW16MHgxekxubStlYjE1dmZ0MkJhZUZvc3RxaTJ1R1ZKc3VSYXBsbnV0cnh1aFZvNVdhVllWVnBkczBhdG5hMGwxcnV0dTZjUnA3bE9rMDZybnRabnc3RHh0c20ycWJjWnNPWFlCdHV1dG0yMmZXRm5ZaGRudDhXdXcrNlR2Wk45dW4yTi9UMEhEWWZaRHFzZFdoMStjN1J5RkRwV090NmF6cHp1UDMzRjlKYnBMMmRZenhEUDJEUGp0aFBMS2NScG5WT2IwMGRuRjJlNWM0UHppSXVKUzRMTExwYytMcHNieHQzSXZlUktkUFZ4WGVGNjB2V2RtN09id3UybzI2L3VOdTVwN29mY244dzBueW1lV1ROejBNUElRK0JSNWRFL0M1K1ZNR3Zmckg1UFEwK0JaN1huSXk5akw1RlhyZGV3dDZWM3F2ZGg3eGMrOWo1eW4rTSs0enczM2pMZVdWL01OOEMzeUxmTFQ4TnZubCtGMzBOL0kvOWsvM3IvMFFDbmdDVUJad09KZ1VHQld3TDcrSHA4SWIrT1B6cmJaZmF5MmUxQmpLQzVRUlZCajRLdGd1WEJyU0ZveU95UXJTSDM1NWpPa2M1cERvVlFmdWpXMEFkaDVtR0x3MzRNSjRXSGhWZUdQNDV3aUZnYTBUR1hOWGZSM0VOejMwVDZSSlpFM3B0bk1VODVyeTFLTlNvK3FpNXFQTm8zdWpTNlA4WXVabG5NMVZpZFdFbHNTeHc1TGlxdU5tNXN2dC84N2ZPSDRwM2lDK043RjVndnlGMXdlYUhPd3ZTRnB4YXBMaElzT3BaQVRJaE9PSlR3UVJBcXFCYU1KZklUZHlXT0NubkNIY0puSWkvUk50R0kyRU5jS2g1TzhrZ3FUWHFTN0pHOE5Ya2t4VE9sTE9XNWhDZXBrTHhNRFV6ZG16cWVGcHAySUcweVBUcTlNWU9Ta1pCeFFxb2hUWk8yWitwbjVtWjJ5NnhsaGJMK3hXNkx0eThlbFFmSmE3T1FyQVZaTFFxMlFxYm9WRm9vMXlvSHNtZGxWMmEvelluS09aYXJuaXZON2N5enl0dVFONXp2bi8vdEVzSVM0WksycFlaTFZ5MGRXT2E5ckdvNXNqeHhlZHNLNHhVRks0WldCcXc4dUlxMkttM1ZUNnZ0VjVldWZyMG1lazFyZ1Y3QnlvTEJ0UUZyNnd0VkN1V0ZmZXZjMSsxZFQxZ3ZXZCsxWWZxR25ScytGWW1LcmhUYkY1Y1ZmOWdvM0hqbEc0ZHZ5citaM0pTMHFhdkV1V1RQWnRKbTZlYmVMWjViRHBhcWwrYVhEbTROMmRxMERkOVd0TzMxOWtYYkw1Zk5LTnU3ZzdaRHVhTy9QTGk4WmFmSnpzMDdQMVNrVlBSVStsUTI3dExkdFdIWCtHN1I3aHQ3dlBZMDdOWGJXN3ozL1Q3SnZ0dFZBVlZOMVdiVlpmdEorN1AzUDY2SnF1bjRsdnR0WGExT2JYSHR4d1BTQS8wSEl3NjIxN25VMVIzU1BWUlNqOVlyNjBjT3h4KysvcDN2ZHkwTk5nMVZqWnpHNGlOd1JIbms2ZmNKMy9jZURUcmFkb3g3ck9FSDB4OTJIV2NkTDJwQ212S2FScHRUbXZ0YllsdTZUOHcrMGRicTNucjhSOXNmRDV3MFBGbDVTdk5VeVduYTZZTFRrMmZ5ejR5ZGxaMTlmaTc1M0dEYm9yWjc1MlBPMzJvUGIrKzZFSFRoMGtYL2krYzd2RHZPWFBLNGRQS3kyK1VUVjdoWG1xODZYMjNxZE9vOC9wUFRUOGU3bkx1YXJybGNhN251ZXIyMWUyYjM2UnVlTjg3ZDlMMTU4UmIvMXRXZU9UM2R2Zk42Yi9mRjkvWGZGdDErY2lmOXpzdTcyWGNuN3EyOFQ3eGY5RUR0UWRsRDNZZlZQMXYrM05qdjNIOXF3SGVnODlIY1IvY0doWVBQL3BIMWp3OURCWStaajh1R0RZYnJuamcrT1RuaVAzTDk2ZnluUTg5a3p5YWVGLzZpL3N1dUZ4WXZmdmpWNjlmTzBaalJvWmZ5bDVPL2JYeWwvZXJBNnhtdjI4YkN4aDYreVhnek1WNzBWdnZ0d1hmY2R4M3ZvOThQVCtSOElIOG8vMmo1c2ZWVDBLZjdreG1Uay84RUE1anovR016TGRzQUFBQWdZMGhTVFFBQWVpVUFBSUNEQUFENS93QUFnT2tBQUhVd0FBRHFZQUFBT3BnQUFCZHZrbC9GUmdBQUFGdEpSRUZVZU5waS9QLy9Qd01sZ0ltQlFzQTQ0QzZnaVFFTkRBd00vL0hnQm1MQ0FGL0FNQkxqQlVlaXhmLy8vNDhMNy8rUEN2WmpVNGZQQUFjMEF4eXdxY01YQ3dlZ0dKMU5ja0w2ang1d3BLWUR4cUdYRWtrQ2dBRUFtcnFCSWVqZGduZ0FBQUFBU1VWT1JLNUNZSUk9KTsKK30KKwordGFibGUudHJlZXRhYmxlIHRyLmFjY2VwdCB7CisgIGJhY2tncm91bmQtY29sb3I6ICNhM2JjZTQ7CisgIGNvbG9yOiAjZmZmCit9CisKK3RhYmxlLnRyZWV0YWJsZSB0ci5jb2xsYXBzZWQuYWNjZXB0IHRkIHNwYW4uaW5kZW50ZXIgYSB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3gtcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUFDWEJJV1hNQUFBc1RBQUFMRXdFQW1wd1lBQUFLVDJsRFExQlFhRzkwYjNOb2IzQWdTVU5ESUhCeWIyWnBiR1VBQUhqYW5WTm5WRlBwRmozMzN2UkNTNGlBbEV0dlVoVUlJRkpDaTRBVWtTWXFJUWtRU29naG9ka1ZVY0VSUlVVRUc4aWdpQU9Pam9DTUZWRXNESW9LMkFma0lhS09nNk9JaXNyNzRYdWphOWE4OStiTi9yWFhQdWVzODUyenp3ZkFDQXlXU0ROUk5ZQU1xVUllRWVDRHg4VEc0ZVF1UUlFS0pIQUFFQWl6WkNGei9TTUJBUGgrUER3cklzQUh2Z0FCZU5NTENBREFUWnZBTUJ5SC93L3FRcGxjQVlDRUFjQjBrVGhMQ0lBVUFFQjZqa0ttQUVCR0FZQ2RtQ1pUQUtBRUFHRExZMkxqQUZBdEFHQW5mK2JUQUlDZCtKbDdBUUJibENFVkFhQ1JBQ0FUWlloRUFHZzdBS3pQVm9wRkFGZ3dBQlJtUzhRNUFOZ3RBREJKVjJaSUFMQzNBTURPRUF1eUFBZ01BREJSaUlVcEFBUjdBR0RJSXlONEFJU1pBQlJHOGxjODhTdXVFT2NxQUFCNG1iSTh1U1E1UllGYkNDMXhCMWRYTGg0b3pra1hLeFEyWVFKaG1rQXV3bm1aR1RLQk5BL2c4OHdBQUtDUkZSSGdnL1A5ZU00T3JzN09ObzYyRGw4dDZyOEcveUppWXVQKzVjK3JjRUFBQU9GMGZ0SCtMQyt6R29BN0JvQnQvcUlsN2dSb1hndWdkZmVMWnJJUFFMVUFvT25hVi9OdytINDhQRVdoa0xuWjJlWGs1TmhLeEVKYlljcFhmZjVud2wvQVYvMXMrWDQ4L1BmMTRMN2lKSUV5WFlGSEJQamd3c3owVEtVY3o1SUpoR0xjNW85SC9MY0wvL3dkMHlMRVNXSzVXQ29VNDFFU2NZNUVtb3p6TXFVaWlVS1NLY1VsMHY5azR0OHMrd00rM3pVQXNHbytBWHVSTGFoZFl3UDJTeWNRV0hUQTR2Y0FBUEs3YjhIVUtBZ0RnR2lENGM5My8rOC8vVWVnSlFDQVprbVNjUUFBWGtRa0xsVEtzei9IQ0FBQVJLQ0JLckJCRy9UQkdDekFCaHpCQmR6QkMveGdOb1JDSk1UQ1FoQkNDbVNBSEhKZ0theUNRaWlHemJBZEttQXYxRUFkTk1CUmFJYVRjQTR1d2xXNERqMXdEL3BoQ0o3QktMeUJDUVJCeUFnVFlTSGFpQUZpaWxnampnZ1htWVg0SWNGSUJCS0xKQ0RKaUJSUklrdVJOVWd4VW9wVUlGVklIZkk5Y2dJNWgxeEd1cEU3eUFBeWd2eUd2RWN4bElHeVVUM1VETFZEdWFnM0dvUkdvZ3ZRWkhReG1vOFdvSnZRY3JRYVBZdzJvZWZRcTJnUDJvOCtROGN3d09nWUJ6UEViREF1eHNOQ3NUZ3NDWk5qeTdFaXJBeXJ4aHF3VnF3RHU0bjFZOCt4ZHdRU2dVWEFDVFlFZDBJZ1lSNUJTRmhNV0U3WVNLZ2dIQ1EwRWRvSk53a0RoRkhDSnlLVHFFdTBKcm9SK2NRWVlqSXhoMWhJTENQV0VvOFRMeEI3aUVQRU55UVNpVU15SjdtUUFrbXhwRlRTRXRKRzBtNVNJK2tzcVpzMFNCb2prOG5hWkd1eUJ6bVVMQ0FyeUlYa25lVEQ1RFBrRytRaDhsc0tuV0pBY2FUNFUrSW9Vc3BxU2hubEVPVTA1UVpsbURKQlZhT2FVdDJvb1ZRUk5ZOWFRcTJodGxLdlVZZW9FelIxbWpuTmd4WkpTNld0b3BYVEdtZ1hhUGRwcitoMHVoSGRsUjVPbDlCWDBzdnBSK2lYNkFQMGR3d05oaFdEeDRobktCbWJHQWNZWnhsM0dLK1lUS1laMDRzWngxUXdOekhybU9lWkQ1bHZWVmdxdGlwOEZaSEtDcFZLbFNhVkd5b3ZWS21xcHFyZXFndFY4MVhMVkkrcFhsTjlya1pWTTFQanFRblVscXRWcXAxUTYxTWJVMmVwTzZpSHFtZW9iMVEvcEg1Wi9Za0dXY05NdzA5RHBGR2dzVi9qdk1ZZ0MyTVpzM2dzSVdzTnE0WjFnVFhFSnJITjJYeDJLcnVZL1IyN2l6MnFxYUU1UXpOS00xZXpVdk9VWmo4SDQ1aHgrSngwVGdubktLZVg4MzZLM2hUdktlSXBHNlkwVExreFpWeHJxcGFYbGxpclNLdFJxMGZydlRhdTdhZWRwcjFGdTFuN2dRNUJ4MG9uWENkSFo0L09CWjNuVTlsVDNhY0tweFpOUFRyMXJpNnFhNlVib2J0RWQ3OXVwKzZZbnI1ZWdKNU1iNmZlZWIzbitoeDlMLzFVL1czNnAvVkhERmdHc3d3a0J0c016aGc4eFRWeGJ6d2RMOGZiOFZGRFhjTkFRNlZobFdHWDRZU1J1ZEU4bzlWR2pVWVBqR25HWE9NazQyM0diY2FqSmdZbUlTWkxUZXBON3BwU1RibW1LYVk3VER0TXg4M016YUxOMXBrMW16MHgxekxubStlYjE1dmZ0MkJhZUZvc3RxaTJ1R1ZKc3VSYXBsbnV0cnh1aFZvNVdhVllWVnBkczBhdG5hMGwxcnV0dTZjUnA3bE9rMDZybnRabnc3RHh0c20ycWJjWnNPWFlCdHV1dG0yMmZXRm5ZaGRudDhXdXcrNlR2Wk45dW4yTi9UMEhEWWZaRHFzZFdoMStjN1J5RkRwV090NmF6cHp1UDMzRjlKYnBMMmRZenhEUDJEUGp0aFBMS2NScG5WT2IwMGRuRjJlNWM0UHppSXVKUzRMTExwYytMcHNieHQzSXZlUktkUFZ4WGVGNjB2V2RtN09id3UybzI2L3VOdTVwN29mY244dzBueW1lV1ROejBNUElRK0JSNWRFL0M1K1ZNR3Zmckg1UFEwK0JaN1huSXk5akw1RlhyZGV3dDZWM3F2ZGg3eGMrOWo1eW4rTSs0enczM2pMZVdWL01OOEMzeUxmTFQ4TnZubCtGMzBOL0kvOWsvM3IvMFFDbmdDVUJad09KZ1VHQld3TDcrSHA4SWIrT1B6cmJaZmF5MmUxQmpLQzVRUlZCajRLdGd1WEJyU0ZveU95UXJTSDM1NWpPa2M1cERvVlFmdWpXMEFkaDVtR0x3MzRNSjRXSGhWZUdQNDV3aUZnYTBUR1hOWGZSM0VOejMwVDZSSlpFM3B0bk1VODVyeTFLTlNvK3FpNXFQTm8zdWpTNlA4WXVabG5NMVZpZFdFbHNTeHc1TGlxdU5tNXN2dC84N2ZPSDRwM2lDK043RjVndnlGMXdlYUhPd3ZTRnB4YXBMaElzT3BaQVRJaE9PSlR3UVJBcXFCYU1KZklUZHlXT0NubkNIY0puSWkvUk50R0kyRU5jS2g1TzhrZ3FUWHFTN0pHOE5Ya2t4VE9sTE9XNWhDZXBrTHhNRFV6ZG16cWVGcHAySUcweVBUcTlNWU9Ta1pCeFFxb2hUWk8yWitwbjVtWjJ5NnhsaGJMK3hXNkx0eThlbFFmSmE3T1FyQVZaTFFxMlFxYm9WRm9vMXlvSHNtZGxWMmEvelluS09aYXJuaXZON2N5enl0dVFONXp2bi8vdEVzSVM0WksycFlaTFZ5MGRXT2E5ckdvNXNqeHhlZHNLNHhVRks0WldCcXc4dUlxMkttM1ZUNnZ0VjVldWZyMG1lazFyZ1Y3QnlvTEJ0UUZyNnd0VkN1V0ZmZXZjMSsxZFQxZ3ZXZCsxWWZxR25ScytGWW1LcmhUYkY1Y1ZmOWdvM0hqbEc0ZHZ5citaM0pTMHFhdkV1V1RQWnRKbTZlYmVMWjViRHBhcWwrYVhEbTROMmRxMERkOVd0TzMxOWtYYkw1Zk5LTnU3ZzdaRHVhTy9QTGk4WmFmSnpzMDdQMVNrVlBSVStsUTI3dExkdFdIWCtHN1I3aHQ3dlBZMDdOWGJXN3ozL1Q3SnZ0dFZBVlZOMVdiVlpmdEorN1AzUDY2SnF1bjRsdnR0WGExT2JYSHR4d1BTQS8wSEl3NjIxN25VMVIzU1BWUlNqOVlyNjBjT3h4KysvcDN2ZHkwTk5nMVZqWnpHNGlOd1JIbms2ZmNKMy9jZURUcmFkb3g3ck9FSDB4OTJIV2NkTDJwQ212S2FScHRUbXZ0YllsdTZUOHcrMGRicTNucjhSOXNmRDV3MFBGbDVTdk5VeVduYTZZTFRrMmZ5ejR5ZGxaMTlmaTc1M0dEYm9yWjc1MlBPMzJvUGIrKzZFSFRoMGtYL2krYzd2RHZPWFBLNGRQS3kyK1VUVjdoWG1xODZYMjNxZE9vOC9wUFRUOGU3bkx1YXJybGNhN251ZXIyMWUyYjM2UnVlTjg3ZDlMMTU4UmIvMXRXZU9UM2R2Zk42Yi9mRjkvWGZGdDErY2lmOXpzdTcyWGNuN3EyOFQ3eGY5RUR0UWRsRDNZZlZQMXYrM05qdjNIOXF3SGVnODlIY1IvY0doWVBQL3BIMWp3OURCWStaajh1R0RZYnJuamcrT1RuaVAzTDk2ZnluUTg5a3p5YWVGLzZpL3N1dUZ4WXZmdmpWNjlmTzBaalJvWmZ5bDVPL2JYeWwvZXJBNnhtdjI4YkN4aDYreVhnek1WNzBWdnZ0d1hmY2R4M3ZvOThQVCtSOElIOG8vMmo1c2ZWVDBLZjdreG1Uay84RUE1anovR016TGRzQUFBQWdZMGhTVFFBQWVpVUFBSUNEQUFENS93QUFnT2tBQUhVd0FBRHFZQUFBT3BnQUFCZHZrbC9GUmdBQUFGcEpSRUZVZU5waS9QLy9Qd01sZ0hIQURXRDQvLzgvTnR5QVF4d0Q0NUtBQVFkS0Rmai8vLy8vL2ZnTUlzWUFaSU13MURLUkVGd09EQXdNLzRrTlJLcTY0QUFEQTRNakZET1E2Z0t5WTRIb2RNQTQ5UE1DeFFZQUJnQVZZSHNqeVoxeDdRQUFBQUJKUlU1RXJrSmdnZz09KTsKK30KKwordGFibGUudHJlZXRhYmxlIHRyLmV4cGFuZGVkLmFjY2VwdCB0ZCBzcGFuLmluZGVudGVyIGEgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS94LXBuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFBQ1hCSVdYTUFBQXNUQUFBTEV3RUFtcHdZQUFBS1QybERRMUJRYUc5MGIzTm9iM0FnU1VORElIQnliMlpwYkdVQUFIamFuVk5uVkZQcEZqMzMzdlJDUzRpQWxFdHZVaFVJSUZKQ2k0QVVrU1lxSVFrUVNvZ2hvZGtWVWNFUlJVVUVHOGlnaUFPT2pvQ01GVkVzRElvSzJBZmtJYUtPZzZPSWlzcjc0WHVqYTlhODkrYk4vclhYUHVlczg1Mnp6d2ZBQ0F5V1NETlJOWUFNcVVJZUVlQ0R4OFRHNGVRdVFJRUtKSEFBRUFpelpDRnovU01CQVBoK1BEd3JJc0FIdmdBQmVOTUxDQURBVFp2QU1CeUgvdy9xUXBsY0FZQ0VBY0Iwa1RoTENJQVVBRUI2amtLbUFFQkdBWUNkbUNaVEFLQUVBR0RMWTJMakFGQXRBR0FuZitiVEFJQ2QrSmw3QVFCYmxDRVZBYUNSQUNBVFpZaEVBR2c3QUt6UFZvcEZBRmd3QUJSbVM4UTVBTmd0QURCSlYyWklBTEMzQU1ET0VBdXlBQWdNQURCUmlJVXBBQVI3QUdESUl5TjRBSVNaQUJSRzhsYzg4U3V1RU9jcUFBQjRtYkk4dVNRNVJZRmJDQzF4QjFkWExoNG96a2tYS3hRMllRSmhta0F1d25tWkdUS0JOQS9nODh3QUFLQ1JGUkhnZy9QOWVNNE9yczdPTm82MkRsOHQ2cjhHL3lKaVl1UCs1YytyY0VBQUFPRjBmdEgrTEMrekdvQTdCb0J0L3FJbDdnUm9YZ3VnZGZlTFpySVBRTFVBb09uYVYvTncrSDQ4UEVXaGtMbloyZVhrNU5oS3hFSmJZY3BYZmY1bndsL0FWLzFzK1g0OC9QZjE0TDdpSklFeVhZRkhCUGpnd3N6MFRLVWN6NUlKaEdMYzVvOUgvTGNMLy93ZDB5TEVTV0s1V0NvVTQxRVNjWTVFbW96ek1xVWlpVUtTS2NVbDB2OWs0dDhzK3dNKzN6VUFzR28rQVh1UkxhaGRZd1AyU3ljUVdIVEE0dmNBQVBLN2I4SFVLQWdEZ0dpRDRjOTMvKzgvL1VlZ0pRQ0Faa21TY1FBQVhrUWtMbFRLc3ovSENBQUFSS0NCS3JCQkcvVEJHQ3pBQmh6QkJkekJDL3hnTm9SQ0pNVENRaEJDQ21TQUhISmdLYXlDUWlpR3piQWRLbUF2MUVBZE5NQlJhSWFUY0E0dXdsVzREajF3RC9waENKN0JLTHlCQ1FSQnlBZ1RZU0hhaUFGaWlsZ2pqZ2dYbVlYNEljRklCQktMSkNESmlCUlJJa3VSTlVneFVvcFVJRlZJSGZJOWNnSTVoMXhHdXBFN3lBQXlndnlHdkVjeGxJR3lVVDNVRExWRHVhZzNHb1JHb2d2UVpIUXhtbzhXb0p2UWNyUWFQWXcyb2VmUXEyZ1AybzgrUThjd3dPZ1lCelBFYkRBdXhzTkNzVGdzQ1pOank3RWlyQXlyeGhxd1Zxd0R1NG4xWTgreGR3UVNnVVhBQ1RZRWQwSWdZUjVCU0ZoTVdFN1lTS2dnSENRMEVkb0pOd2tEaEZIQ0p5S1RxRXUwSnJvUitjUVlZakl4aDFoSUxDUFdFbzhUTHhCN2lFUEVOeVFTaVVNeUo3bVFBa214cEZUU0V0SkcwbTVTSStrc3FaczBTQm9qazhuYVpHdXlCem1VTENBcnlJWGtuZVRENURQa0crUWg4bHNLbldKQWNhVDRVK0lvVXNwcVNobmxFT1UwNVFabG1ESkJWYU9hVXQyb29WUVJOWTlhUXEyaHRsS3ZVWWVvRXpSMW1qbk5neFpKUzZXdG9wWFRHbWdYYVBkcHIraDB1aEhkbFI1T2w5Qlgwc3ZwUitpWDZBUDBkd3dOaGhXRHg0aG5LQm1iR0FjWVp4bDNHSytZVEtZWjA0c1p4MVF3TnpIcm1PZVpENWx2VlZncXRpcDhGWkhLQ3BWS2xTYVZHeW92VkttcXBxcmVxZ3RWODFYTFZJK3BYbE45cmtaVk0xUGpxUW5VbHF0VnFwMVE2MU1iVTJlcE82aUhxbWVvYjFRL3BINVovWWtHV2NOTXcwOURwRkdnc1YvanZNWWdDMk1aczNnc0lXc05xNFoxZ1RYRUpySE4yWHgyS3J1WS9SMjdpejJxcWFFNVF6TktNMWV6VXZPVVpqOEg0NWh4K0p4MFRnbm5LS2VYODM2SzNoVHZLZUlwRzZZMFRMa3haVnhycXBhWGxsaXJTS3RScTBmcnZUYXU3YWVkcHIxRnUxbjdnUTVCeDBvblhDZEhaNC9PQlozblU5bFQzYWNLcHhaTlBUcjFyaTZxYTZVYm9idEVkNzl1cCs2WW5yNWVnSjVNYjZmZWViM24raHg5TC8xVS9XMzZwL1ZIREZnR3N3d2tCdHNNemhnOHhUVnhiendkTDhmYjhWRkRYY05BUTZWaGxXR1g0WVNSdWRFOG85VkdqVVlQakduR1hPTWs0MjNHYmNhakpnWW1JU1pMVGVwTjdwcFNUYm1tS2FZN1REdE14ODNNemFMTjFwazFtejB4MXpMbm0rZWIxNXZmdDJCYWVGb3N0cWkydUdWSnN1UmFwbG51dHJ4dWhWbzVXYVZZVlZwZHMwYXRuYTBsMXJ1dHU2Y1JwN2xPazA2cm50Wm53N0R4dHNtMnFiY1pzT1hZQnR1dXRtMjJmV0ZuWWhkbnQ4V3V3KzZUdlpOOXVuMk4vVDBIRFlmWkRxc2RXaDErYzdSeUZEcFdPdDZhenB6dVAzM0Y5SmJwTDJkWXp4RFAyRFBqdGhQTEtjUnBuVk9iMDBkbkYyZTVjNFB6aUl1SlM0TExMcGMrTHBzYnh0M0l2ZVJLZFBWeFhlRjYwdldkbTdPYnd1Mm8yNi91TnU1cDdvZmNuOHcwbnltZVdUTnowTVBJUStCUjVkRS9DNStWTUd2ZnJINVBRMCtCWjdYbkl5OWpMNUZYcmRld3Q2VjNxdmRoN3hjKzlqNXluK00rNHp3MzNqTGVXVi9NTjhDM3lMZkxUOE52bmwrRjMwTi9JLzlrLzNyLzBRQ25nQ1VCWndPSmdVR0JXd0w3K0hwOEliK09QenJiWmZheTJlMUJqS0M1UVJWQmo0S3RndVhCclNGb3lPeVFyU0gzNTVqT2tjNXBEb1ZRZnVqVzBBZGg1bUdMdzM0TUo0V0hoVmVHUDQ1d2lGZ2EwVEdYTlhmUjNFTnozMFQ2UkpaRTNwdG5NVTg1cnkxS05TbytxaTVxUE5vM3VqUzZQOFl1WmxuTTFWaWRXRWxzU3h3NUxpcXVObTVzdnQvODdmT0g0cDNpQytON0Y1Z3Z5RjF3ZWFIT3d2U0ZweGFwTGhJc09wWkFUSWhPT0pUd1FSQXFxQmFNSmZJVGR5V09Dbm5DSGNKbklpL1JOdEdJMkVOY0toNU84a2dxVFhxUzdKRzhOWGtreFRPbExPVzVoQ2Vwa0x4TURVemRtenFlRnBwMklHMHlQVHE5TVlPU2taQnhRcW9oVFpPMlorcG41bVoyeTZ4bGhiTCt4VzZMdHk4ZWxRZkphN09RckFWWkxRcTJRcWJvVkZvbzF5b0hzbWRsVjJhL3pZbktPWmFybml2TjdjeXp5dHVRTjV6dm4vL3RFc0lTNFpLMnBZWkxWeTBkV09hOXJHbzVzanh4ZWRzSzR4VUZLNFpXQnF3OHVJcTJLbTNWVDZ2dFY1ZXVmcjBtZWsxcmdWN0J5b0xCdFFGcjZ3dFZDdVdGZmV2YzErMWRUMWd2V2QrMVlmcUduUnMrRlltS3JoVGJGNWNWZjlnbzNIamxHNGR2eXIrWjNKUzBxYXZFdVdUUFp0Sm02ZWJlTFo1YkRwYXFsK2FYRG00TjJkcTBEZDlXdE8zMTlrWGJMNWZOS051N2c3WkR1YU8vUExpOFphZkp6czA3UDFTa1ZQUlUrbFEyN3RMZHRXSFgrRzdSN2h0N3ZQWTA3TlhiVzd6My9UN0p2dHRWQVZWTjFXYlZaZnRKKzdQM1A2NkpxdW40bHZ0dFhhMU9iWEh0eHdQU0EvMEhJdzYyMTduVTFSM1NQVlJTajlZcjYwY094eCsrL3AzdmR5ME5OZzFWalp6RzRpTndSSG5rNmZjSjMvY2VEVHJhZG94N3JPRUgweDkySFdjZEwycENtdkthUnB0VG12dGJZbHU2VDh3KzBkYnEzbnI4UjlzZkQ1dzBQRmw1U3ZOVXlXbmE2WUxUazJmeXo0eWRsWjE5Zmk3NTNHRGJvclo3NTJQTzMyb1BiKys2RUhUaDBrWC9pK2M3dkR2T1hQSzRkUEt5MitVVFY3aFhtcTg2WDIzcWRPbzgvcFBUVDhlN25MdWFycmxjYTdudWVyMjFlMmIzNlJ1ZU44N2Q5TDE1OFJiLzF0V2VPVDNkdmZONmIvZkY5L1hmRnQxK2NpZjl6c3U3MlhjbjdxMjhUN3hmOUVEdFFkbEQzWWZWUDF2KzNOanYzSDlxd0hlZzg5SGNSL2NHaFlQUC9wSDFqdzlEQlkrWmo4dUdEWWJybmpnK09UbmlQM0w5NmZ5blE4OWt6eWFlRi82aS9zdXVGeFl2ZnZqVjY5Zk8wWmpSb1pmeWw1Ty9iWHlsL2VyQTZ4bXYyOGJDeGg2K3lYZ3pNVjcwVnZ2dHdYZmNkeDN2bzk4UFQrUjhJSDhvLzJqNXNmVlQwS2Y3a3htVGsvOEVBNWp6L0dNekxkc0FBQUFnWTBoU1RRQUFlaVVBQUlDREFBRDUvd0FBZ09rQUFIVXdBQURxWUFBQU9wZ0FBQmR2a2wvRlJnQUFBRnRKUkVGVWVOcGkvUC8vUHdNbGdJbUJRc0E0NEM2Z2lRRU5EQXdNLy9IZ0JtTENBRi9BTUJMakJVZWl4Zi8vLzQ4TDcvK1BDdlpqVTRmUEFBYzBBeHl3cWNNWEN3ZWdHSjFOY2tMNmp4NXdwS1lEeHFHWEVra0NnQUVBbXJxQkllamRnbmdBQUFBQVNVVk9SSzVDWUlJPSk7Cit9CmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2Nzcy9qcXVlcnkudHJlZXRhYmxlLnRoZW1lLnRvYXN0ZXIuY3NzIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9jc3MvanF1ZXJ5LnRyZWV0YWJsZS50aGVtZS50b2FzdGVyLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODU1MmU1Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9jc3MvanF1ZXJ5LnRyZWV0YWJsZS50aGVtZS50b2FzdGVyLmNzcwpAQCAtMCwwICsxLDM4IEBACit0YWJsZS50cmVldGFibGUgc3Bhbi5maWxlIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBUUFBQUMxK2pmcUFBQUFCR2RCVFVFQUFLL0lOd1dLNlFBQUFCbDBSVmgwVTI5bWRIZGhjbVVBUVdSdlltVWdTVzFoWjJWU1pXRmtlWEhKWlR3QUFBRG9TVVJCVkJnWkJjRXhibE5CR0FiQTJjZWVnVFJCdUlLT2dpaWhTWk5UY0M1TFVIQWloTkpSMGtHS0NEY1lKWTZEMy83N01kT2luVHZ6QWdDdzh5c1RoSXZuL1Zvakl5TWpJeVBQK2JTMXNVUUlWMnM5NXBCRER2bWJQL21ka2Z0ODN0cFlndVpxNUpoL09lYVloK3l6eThoVEh2TmxheE5OY3ptK2xhOU9UbGFyMVVkQS8rQzJBNHRyUkNuRDNqUzhCQjFvYnEyR2s2R1U2UWJRQVM0QlVhWVNRQWY0YmhoS0tURmRBenJBT3dBeEVVQUgrS0VNMDFTWTNnTTZ3QnNFQVFCMGdKK21hWm9DM2dJNmlQWWFBSUJKc2lSbUhVMEFBTE9lRkMzYUsyY1dBQUNVWGU3K0F3TzBsYzllVEhZVEFBQUFBRWxGVGtTdVFtQ0MpOworfQorCit0YWJsZS50cmVldGFibGUgc3Bhbi5mb2xkZXIgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBQUJHZEJUVUVBQUsvSU53V0s2UUFBQUJsMFJWaDBVMjltZEhkaGNtVUFRV1J2WW1VZ1NXMWhaMlZTWldGa2VYSEpaVHdBQUFHclNVUkJWRGpMeFpPN2loUkJGSWEvNnUwWlc3R0hCVVYwVVFRVFp6ZDNRZGhNUXhPZndNUlhFQU5CTU5RWDBNekF6RkF3RXpId0FSYk5GRGR3RWQzMU1qM1g3YTZ1T3I5QnR6TmpZaktCSjZuaWNQN3YzS3FjSkZheGhCVnRaVUFLOE9IbGxkMnN0N1hsM0RKUFZPTlArekVVVjRIcUw1VURZSHI1eHZ1UUFqZ2wvUXM3VHp2T09WQWp4amxDK2VQU3dlNkRmYlZlZ0xWdVQ0cjE0ZVRyNnp2QTh4U0FvQkx6eDZwdmo0bCtEWkllenVWa0c5ZlkySDdZUlFJTVpJQnd5Y216SDEvczNGOEFhcGZJUE5GM2tRazcra3c5UFdCeStJWk9kZzVVZzNta0FBVHkvdDB1c292ekdlQ1VXVGpDejBCK1NqMGVrZmR2a1ozYWJCditVNEdhQ3RKMWlFbTZBTlFKNmZFenJHL2VuZ2NLdy93WFF2RUt4U0VLUXhSR0tFN0l6dCtEU2l3QkpNVVNtNzFyZ3VNWWhRS3JCeWdPSVJTdGY0VGlGRlJCdmJSR0tpUUxXUDI5eVJTSEtCVHRmZEJtSHMwQlVwZ3Z0Z0Y0eVJGUitOVUtpMFhaY1lqQ2VDRzJzbWt6TEFIa2JSQm1QMC9VazI2TzVZblVBY3RCcDFHc0FJK1M1blJKSkphbDVLMWFBTXJxMGQ2VG05dUk2emp5Zjc1ZEFlNnR4L1NzV2VELy9vMi9BYjZJSDMvaDI1cE9BQUFBQUVsRlRrU3VRbUNDKTsKK30KKwordGFibGUudHJlZXRhYmxlIHRyLmNvbGxhcHNlZCBzcGFuLmluZGVudGVyIGEgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBQUNYQklXWE1BQUFzVEFBQUxFd0VBbXB3WUFBQUtUMmxEUTFCUWFHOTBiM05vYjNBZ1NVTkRJSEJ5YjJacGJHVUFBSGphblZOblZGUHBGajMzM3ZSQ1M0aUFsRXR2VWhVSUlGSkNpNEFVa1NZcUlRa1FTb2dob2RrVlVjRVJSVVVFRzhpZ2lBT09qb0NNRlZFc0RJb0syQWZrSWFLT2c2T0lpc3I3NFh1amE5YTg5K2JOL3JYWFB1ZXM4NTJ6endmQUNBeVdTRE5STllBTXFVSWVFZUNEeDhURzRlUXVRSUVLSkhBQUVBaXpaQ0Z6L1NNQkFQaCtQRHdySXNBSHZnQUJlTk1MQ0FEQVRadkFNQnlIL3cvcVFwbGNBWUNFQWNCMGtUaExDSUFVQUVCNmprS21BRUJHQVlDZG1DWlRBS0FFQUdETFkyTGpBRkF0QUdBbmYrYlRBSUNkK0psN0FRQmJsQ0VWQWFDUkFDQVRaWWhFQUdnN0FLelBWb3BGQUZnd0FCUm1TOFE1QU5ndEFEQkpWMlpJQUxDM0FNRE9FQXV5QUFnTUFEQlJpSVVwQUFSN0FHRElJeU40QUlTWkFCUkc4bGM4OFN1dUVPY3FBQUI0bWJJOHVTUTVSWUZiQ0MxeEIxZFhMaDRvemtrWEt4UTJZUUpobWtBdXdubVpHVEtCTkEvZzg4d0FBS0NSRlJIZ2cvUDllTTRPcnM3T05vNjJEbDh0NnI4Ry95SmlZdVArNWMrcmNFQUFBT0YwZnRIK0xDK3pHb0E3Qm9CdC9xSWw3Z1JvWGd1Z2RmZUxacklQUUxVQW9PbmFWL053K0g0OFBFV2hrTG5aMmVYazVOaEt4RUpiWWNwWGZmNW53bC9BVi8xcytYNDgvUGYxNEw3aUpJRXlYWUZIQlBqZ3dzejBUS1VjejVJSmhHTGM1bzlIL0xjTC8vd2QweUxFU1dLNVdDb1U0MUVTY1k1RW1venpNcVVpaVVLU0tjVWwwdjlrNHQ4cyt3TSszelVBc0dvK0FYdVJMYWhkWXdQMlN5Y1FXSFRBNHZjQUFQSzdiOEhVS0FnRGdHaUQ0YzkzLys4Ly9VZWdKUUNBWmttU2NRQUFYa1FrTGxUS3N6L0hDQUFBUktDQktyQkJHL1RCR0N6QUJoekJCZHpCQy94Z05vUkNKTVRDUWhCQ0NtU0FISEpnS2F5Q1FpaUd6YkFkS21BdjFFQWROTUJSYUlhVGNBNHV3bFc0RGoxd0QvcGhDSjdCS0x5QkNRUkJ5QWdUWVNIYWlBRmlpbGdqamdnWG1ZWDRJY0ZJQkJLTEpDREppQlJSSWt1Uk5VZ3hVb3BVSUZWSUhmSTljZ0k1aDF4R3VwRTd5QUF5Z3Z5R3ZFY3hsSUd5VVQzVURMVkR1YWczR29SR29ndlFaSFF4bW84V29KdlFjclFhUFl3Mm9lZlFxMmdQMm84K1E4Y3d3T2dZQnpQRWJEQXV4c05Dc1Rnc0NaTmp5N0VpckF5cnhocXdWcXdEdTRuMVk4K3hkd1FTZ1VYQUNUWUVkMElnWVI1QlNGaE1XRTdZU0tnZ0hDUTBFZG9KTndrRGhGSENKeUtUcUV1MEpyb1IrY1FZWWpJeGgxaElMQ1BXRW84VEx4QjdpRVBFTnlRU2lVTXlKN21RQWtteHBGVFNFdEpHMG01U0kra3NxWnMwU0Jvams4bmFaR3V5QnptVUxDQXJ5SVhrbmVURDVEUGtHK1FoOGxzS25XSkFjYVQ0VStJb1VzcHFTaG5sRU9VMDVRWmxtREpCVmFPYVV0Mm9vVlFSTlk5YVFxMmh0bEt2VVllb0V6UjFtam5OZ3haSlM2V3RvcFhUR21nWGFQZHByK2gwdWhIZGxSNU9sOUJYMHN2cFIraVg2QVAwZHd3TmhoV0R4NGhuS0JtYkdBY1laeGwzR0srWVRLWVowNHNaeDFRd056SHJtT2VaRDVsdlZWZ3F0aXA4RlpIS0NwVktsU2FWR3lvdlZLbXFwcXJlcWd0VjgxWExWSStwWGxOOXJrWlZNMVBqcVFuVWxxdFZxcDFRNjFNYlUyZXBPNmlIcW1lb2IxUS9wSDVaL1lrR1djTk13MDlEcEZHZ3NWL2p2TVlnQzJNWnMzZ3NJV3NOcTRaMWdUWEVKckhOMlh4MktydVkvUjI3aXoycXFhRTVRek5LTTFlelV2T1VaajhINDVoeCtKeDBUZ25uS0tlWDgzNkszaFR2S2VJcEc2WTBUTGt4WlZ4cnFwYVhsbGlyU0t0UnEwZnJ2VGF1N2FlZHByMUZ1MW43Z1E1Qngwb25YQ2RIWjQvT0JaM25VOWxUM2FjS3B4Wk5QVHIxcmk2cWE2VWJvYnRFZDc5dXArNllucjVlZ0o1TWI2ZmVlYjNuK2h4OUwvMVUvVzM2cC9WSERGZ0dzd3drQnRzTXpoZzh4VFZ4Ynp3ZEw4ZmI4VkZEWGNOQVE2VmhsV0dYNFlTUnVkRThvOVZHalVZUGpHbkdYT01rNDIzR2JjYWpKZ1ltSVNaTFRlcE43cHBTVGJtbUthWTdURHRNeDgzTXphTE4xcGsxbXoweDF6TG5tK2ViMTV2ZnQyQmFlRm9zdHFpMnVHVkpzdVJhcGxudXRyeHVoVm81V2FWWVZWcGRzMGF0bmEwbDFydXR1NmNScDdsT2swNnJudFpudzdEeHRzbTJxYmNac09YWUJ0dXV0bTIyZldGblloZG50OFd1dys2VHZaTjl1bjJOL1QwSERZZlpEcXNkV2gxK2M3UnlGRHBXT3Q2YXpwenVQMzNGOUpicEwyZFl6eERQMkRQanRoUExLY1JwblZPYjAwZG5GMmU1YzRQemlJdUpTNExMTHBjK0xwc2J4dDNJdmVSS2RQVnhYZUY2MHZXZG03T2J3dTJvMjYvdU51NXA3b2Zjbjh3MG55bWVXVE56ME1QSVErQlI1ZEUvQzUrVk1HdmZySDVQUTArQlo3WG5JeTlqTDVGWHJkZXd0NlYzcXZkaDd4Yys5ajV5bitNKzR6dzMzakxlV1YvTU44QzN5TGZMVDhOdm5sK0YzME4vSS85ay8zci8wUUNuZ0NVQlp3T0pnVUdCV3dMNytIcDhJYitPUHpyYlpmYXkyZTFCaktDNVFSVkJqNEt0Z3VYQnJTRm95T3lRclNIMzU1ak9rYzVwRG9WUWZ1alcwQWRoNW1HTHczNE1KNFdIaFZlR1A0NXdpRmdhMFRHWE5YZlIzRU56MzBUNlJKWkUzcHRuTVU4NXJ5MUtOU28rcWk1cVBObzN1alM2UDhZdVpsbk0xVmlkV0Vsc1N4dzVMaXF1Tm01c3Z0Lzg3Zk9INHAzaUMrTjdGNWd2eUYxd2VhSE93dlNGcHhhcExoSXNPcFpBVEloT09KVHdRUkFxcUJhTUpmSVRkeVdPQ25uQ0hjSm5JaS9STnRHSTJFTmNLaDVPOGtncVRYcVM3Skc4Tlhra3hUT2xMT1c1aENlcGtMeE1EVXpkbXpxZUZwcDJJRzB5UFRxOU1ZT1NrWkJ4UXFvaFRaTzJaK3BuNW1aMnk2eGxoYkwreFc2THR5OGVsUWZKYTdPUXJBVlpMUXEyUXFib1ZGb28xeW9Ic21kbFYyYS96WW5LT1phcm5pdk43Y3l6eXR1UU41enZuLy90RXNJUzRaSzJwWVpMVnkwZFdPYTlyR281c2p4eGVkc0s0eFVGSzRaV0Jxdzh1SXEyS20zVlQ2dnRWNWV1ZnIwbWVrMXJnVjdCeW9MQnRRRnI2d3RWQ3VXRmZldmMxKzFkVDFndldkKzFZZnFHblJzK0ZZbUtyaFRiRjVjVmY5Z28zSGpsRzRkdnlyK1ozSlMwcWF2RXVXVFBadEptNmViZUxaNWJEcGFxbCthWERtNE4yZHEwRGQ5V3RPMzE5a1hiTDVmTktOdTdnN1pEdWFPL1BMaThaYWZKenMwN1AxU2tWUFJVK2xRMjd0TGR0V0hYK0c3UjdodDd2UFkwN05YYlc3ejMvVDdKdnR0VkFWVk4xV2JWWmZ0Sis3UDNQNjZKcXVuNGx2dHRYYTFPYlhIdHh3UFNBLzBISXc2MjE3blUxUjNTUFZSU2o5WXI2MGNPeHgrKy9wM3ZkeTBOTmcxVmpaekc0aU53UkhuazZmY0ozL2NlRFRyYWRveDdyT0VIMHg5MkhXY2RMMnBDbXZLYVJwdFRtdnRiWWx1NlQ4dyswZGJxM25yOFI5c2ZENXcwUEZsNVN2TlV5V25hNllMVGsyZnl6NHlkbFoxOWZpNzUzR0Rib3JaNzUyUE8zMm9QYisrNkVIVGgwa1gvaStjN3ZEdk9YUEs0ZFBLeTIrVVRWN2hYbXE4NlgyM3FkT284L3BQVFQ4ZTduTHVhcnJsY2E3bnVlcjIxZTJiMzZSdWVOODdkOUwxNThSYi8xdFdlT1QzZHZmTjZiL2ZGOS9YZkZ0MStjaWY5enN1NzJYY243cTI4VDd4ZjlFRHRRZGxEM1lmVlAxdiszTmp2M0g5cXdIZWc4OUhjUi9jR2hZUFAvcEgxanc5REJZK1pqOHVHRFlicm5qZytPVG5pUDNMOTZmeW5RODlrenlhZUYvNmkvc3V1RnhZdmZ2alY2OWZPMFpqUm9aZnlsNU8vYlh5bC9lckE2eG12MjhiQ3hoNit5WGd6TVY3MFZ2dnR3WGZjZHgzdm85OFBUK1I4SUg4by8yajVzZlZUMEtmN2t4bVRrLzhFQTVqei9HTXpMZHNBQUFBZ1kwaFNUUUFBZWlVQUFJQ0RBQUQ1L3dBQWdPa0FBSFV3QUFEcVlBQUFPcGdBQUJkdmtsL0ZSZ0FBQUhsSlJFRlVlTnJjVTFzTmdEQVE2d2dtY0FNMk1JQ0dHbGcxZ0puTnpXUWN2d1FHeTFqNG9VbC83dEgwbXB3ek03U2dReU8rRVpBVVdoMk1ra3pTV2hKd3VSQWxIWXNKd0V3eXZzMWdBQkR1enFvSmNUdzVxeGFJSk4wYmdRUmdJam5sbW4xaGVTTzVQRTZZMllYZSs1Q3I1K2grK2dzMTJBY0FTNkZTKzdZT3NqNEFBQUFBU1VWT1JLNUNZSUk9KTsKK30KKwordGFibGUudHJlZXRhYmxlIHRyLmV4cGFuZGVkIHNwYW4uaW5kZW50ZXIgYSB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFBQ1hCSVdYTUFBQXNUQUFBTEV3RUFtcHdZQUFBS1QybERRMUJRYUc5MGIzTm9iM0FnU1VORElIQnliMlpwYkdVQUFIamFuVk5uVkZQcEZqMzMzdlJDUzRpQWxFdHZVaFVJSUZKQ2k0QVVrU1lxSVFrUVNvZ2hvZGtWVWNFUlJVVUVHOGlnaUFPT2pvQ01GVkVzRElvSzJBZmtJYUtPZzZPSWlzcjc0WHVqYTlhODkrYk4vclhYUHVlczg1Mnp6d2ZBQ0F5V1NETlJOWUFNcVVJZUVlQ0R4OFRHNGVRdVFJRUtKSEFBRUFpelpDRnovU01CQVBoK1BEd3JJc0FIdmdBQmVOTUxDQURBVFp2QU1CeUgvdy9xUXBsY0FZQ0VBY0Iwa1RoTENJQVVBRUI2amtLbUFFQkdBWUNkbUNaVEFLQUVBR0RMWTJMakFGQXRBR0FuZitiVEFJQ2QrSmw3QVFCYmxDRVZBYUNSQUNBVFpZaEVBR2c3QUt6UFZvcEZBRmd3QUJSbVM4UTVBTmd0QURCSlYyWklBTEMzQU1ET0VBdXlBQWdNQURCUmlJVXBBQVI3QUdESUl5TjRBSVNaQUJSRzhsYzg4U3V1RU9jcUFBQjRtYkk4dVNRNVJZRmJDQzF4QjFkWExoNG96a2tYS3hRMllRSmhta0F1d25tWkdUS0JOQS9nODh3QUFLQ1JGUkhnZy9QOWVNNE9yczdPTm82MkRsOHQ2cjhHL3lKaVl1UCs1YytyY0VBQUFPRjBmdEgrTEMrekdvQTdCb0J0L3FJbDdnUm9YZ3VnZGZlTFpySVBRTFVBb09uYVYvTncrSDQ4UEVXaGtMbloyZVhrNU5oS3hFSmJZY3BYZmY1bndsL0FWLzFzK1g0OC9QZjE0TDdpSklFeVhZRkhCUGpnd3N6MFRLVWN6NUlKaEdMYzVvOUgvTGNMLy93ZDB5TEVTV0s1V0NvVTQxRVNjWTVFbW96ek1xVWlpVUtTS2NVbDB2OWs0dDhzK3dNKzN6VUFzR28rQVh1UkxhaGRZd1AyU3ljUVdIVEE0dmNBQVBLN2I4SFVLQWdEZ0dpRDRjOTMvKzgvL1VlZ0pRQ0Faa21TY1FBQVhrUWtMbFRLc3ovSENBQUFSS0NCS3JCQkcvVEJHQ3pBQmh6QkJkekJDL3hnTm9SQ0pNVENRaEJDQ21TQUhISmdLYXlDUWlpR3piQWRLbUF2MUVBZE5NQlJhSWFUY0E0dXdsVzREajF3RC9waENKN0JLTHlCQ1FSQnlBZ1RZU0hhaUFGaWlsZ2pqZ2dYbVlYNEljRklCQktMSkNESmlCUlJJa3VSTlVneFVvcFVJRlZJSGZJOWNnSTVoMXhHdXBFN3lBQXlndnlHdkVjeGxJR3lVVDNVRExWRHVhZzNHb1JHb2d2UVpIUXhtbzhXb0p2UWNyUWFQWXcyb2VmUXEyZ1AybzgrUThjd3dPZ1lCelBFYkRBdXhzTkNzVGdzQ1pOank3RWlyQXlyeGhxd1Zxd0R1NG4xWTgreGR3UVNnVVhBQ1RZRWQwSWdZUjVCU0ZoTVdFN1lTS2dnSENRMEVkb0pOd2tEaEZIQ0p5S1RxRXUwSnJvUitjUVlZakl4aDFoSUxDUFdFbzhUTHhCN2lFUEVOeVFTaVVNeUo3bVFBa214cEZUU0V0SkcwbTVTSStrc3FaczBTQm9qazhuYVpHdXlCem1VTENBcnlJWGtuZVRENURQa0crUWg4bHNLbldKQWNhVDRVK0lvVXNwcVNobmxFT1UwNVFabG1ESkJWYU9hVXQyb29WUVJOWTlhUXEyaHRsS3ZVWWVvRXpSMW1qbk5neFpKUzZXdG9wWFRHbWdYYVBkcHIraDB1aEhkbFI1T2w5Qlgwc3ZwUitpWDZBUDBkd3dOaGhXRHg0aG5LQm1iR0FjWVp4bDNHSytZVEtZWjA0c1p4MVF3TnpIcm1PZVpENWx2VlZncXRpcDhGWkhLQ3BWS2xTYVZHeW92VkttcXBxcmVxZ3RWODFYTFZJK3BYbE45cmtaVk0xUGpxUW5VbHF0VnFwMVE2MU1iVTJlcE82aUhxbWVvYjFRL3BINVovWWtHV2NOTXcwOURwRkdnc1YvanZNWWdDMk1aczNnc0lXc05xNFoxZ1RYRUpySE4yWHgyS3J1WS9SMjdpejJxcWFFNVF6TktNMWV6VXZPVVpqOEg0NWh4K0p4MFRnbm5LS2VYODM2SzNoVHZLZUlwRzZZMFRMa3haVnhycXBhWGxsaXJTS3RScTBmcnZUYXU3YWVkcHIxRnUxbjdnUTVCeDBvblhDZEhaNC9PQlozblU5bFQzYWNLcHhaTlBUcjFyaTZxYTZVYm9idEVkNzl1cCs2WW5yNWVnSjVNYjZmZWViM24raHg5TC8xVS9XMzZwL1ZIREZnR3N3d2tCdHNNemhnOHhUVnhiendkTDhmYjhWRkRYY05BUTZWaGxXR1g0WVNSdWRFOG85VkdqVVlQakduR1hPTWs0MjNHYmNhakpnWW1JU1pMVGVwTjdwcFNUYm1tS2FZN1REdE14ODNNemFMTjFwazFtejB4MXpMbm0rZWIxNXZmdDJCYWVGb3N0cWkydUdWSnN1UmFwbG51dHJ4dWhWbzVXYVZZVlZwZHMwYXRuYTBsMXJ1dHU2Y1JwN2xPazA2cm50Wm53N0R4dHNtMnFiY1pzT1hZQnR1dXRtMjJmV0ZuWWhkbnQ4V3V3KzZUdlpOOXVuMk4vVDBIRFlmWkRxc2RXaDErYzdSeUZEcFdPdDZhenB6dVAzM0Y5SmJwTDJkWXp4RFAyRFBqdGhQTEtjUnBuVk9iMDBkbkYyZTVjNFB6aUl1SlM0TExMcGMrTHBzYnh0M0l2ZVJLZFBWeFhlRjYwdldkbTdPYnd1Mm8yNi91TnU1cDdvZmNuOHcwbnltZVdUTnowTVBJUStCUjVkRS9DNStWTUd2ZnJINVBRMCtCWjdYbkl5OWpMNUZYcmRld3Q2VjNxdmRoN3hjKzlqNXluK00rNHp3MzNqTGVXVi9NTjhDM3lMZkxUOE52bmwrRjMwTi9JLzlrLzNyLzBRQ25nQ1VCWndPSmdVR0JXd0w3K0hwOEliK09QenJiWmZheTJlMUJqS0M1UVJWQmo0S3RndVhCclNGb3lPeVFyU0gzNTVqT2tjNXBEb1ZRZnVqVzBBZGg1bUdMdzM0TUo0V0hoVmVHUDQ1d2lGZ2EwVEdYTlhmUjNFTnozMFQ2UkpaRTNwdG5NVTg1cnkxS05TbytxaTVxUE5vM3VqUzZQOFl1WmxuTTFWaWRXRWxzU3h3NUxpcXVObTVzdnQvODdmT0g0cDNpQytON0Y1Z3Z5RjF3ZWFIT3d2U0ZweGFwTGhJc09wWkFUSWhPT0pUd1FSQXFxQmFNSmZJVGR5V09Dbm5DSGNKbklpL1JOdEdJMkVOY0toNU84a2dxVFhxUzdKRzhOWGtreFRPbExPVzVoQ2Vwa0x4TURVemRtenFlRnBwMklHMHlQVHE5TVlPU2taQnhRcW9oVFpPMlorcG41bVoyeTZ4bGhiTCt4VzZMdHk4ZWxRZkphN09RckFWWkxRcTJRcWJvVkZvbzF5b0hzbWRsVjJhL3pZbktPWmFybml2TjdjeXp5dHVRTjV6dm4vL3RFc0lTNFpLMnBZWkxWeTBkV09hOXJHbzVzanh4ZWRzSzR4VUZLNFpXQnF3OHVJcTJLbTNWVDZ2dFY1ZXVmcjBtZWsxcmdWN0J5b0xCdFFGcjZ3dFZDdVdGZmV2YzErMWRUMWd2V2QrMVlmcUduUnMrRlltS3JoVGJGNWNWZjlnbzNIamxHNGR2eXIrWjNKUzBxYXZFdVdUUFp0Sm02ZWJlTFo1YkRwYXFsK2FYRG00TjJkcTBEZDlXdE8zMTlrWGJMNWZOS051N2c3WkR1YU8vUExpOFphZkp6czA3UDFTa1ZQUlUrbFEyN3RMZHRXSFgrRzdSN2h0N3ZQWTA3TlhiVzd6My9UN0p2dHRWQVZWTjFXYlZaZnRKKzdQM1A2NkpxdW40bHZ0dFhhMU9iWEh0eHdQU0EvMEhJdzYyMTduVTFSM1NQVlJTajlZcjYwY094eCsrL3AzdmR5ME5OZzFWalp6RzRpTndSSG5rNmZjSjMvY2VEVHJhZG94N3JPRUgweDkySFdjZEwycENtdkthUnB0VG12dGJZbHU2VDh3KzBkYnEzbnI4UjlzZkQ1dzBQRmw1U3ZOVXlXbmE2WUxUazJmeXo0eWRsWjE5Zmk3NTNHRGJvclo3NTJQTzMyb1BiKys2RUhUaDBrWC9pK2M3dkR2T1hQSzRkUEt5MitVVFY3aFhtcTg2WDIzcWRPbzgvcFBUVDhlN25MdWFycmxjYTdudWVyMjFlMmIzNlJ1ZU44N2Q5TDE1OFJiLzF0V2VPVDNkdmZONmIvZkY5L1hmRnQxK2NpZjl6c3U3MlhjbjdxMjhUN3hmOUVEdFFkbEQzWWZWUDF2KzNOanYzSDlxd0hlZzg5SGNSL2NHaFlQUC9wSDFqdzlEQlkrWmo4dUdEWWJybmpnK09UbmlQM0w5NmZ5blE4OWt6eWFlRi82aS9zdXVGeFl2ZnZqVjY5Zk8wWmpSb1pmeWw1Ty9iWHlsL2VyQTZ4bXYyOGJDeGg2K3lYZ3pNVjcwVnZ2dHdYZmNkeDN2bzk4UFQrUjhJSDhvLzJqNXNmVlQwS2Y3a3htVGsvOEVBNWp6L0dNekxkc0FBQUFnWTBoU1RRQUFlaVVBQUlDREFBRDUvd0FBZ09rQUFIVXdBQURxWUFBQU9wZ0FBQmR2a2wvRlJnQUFBSEZKUkVGVWVOcGkvUC8vUHdNbGdJbUJRc0E0NEM2Z3ZoZmEyOXYzTXpBd09PRFJjNkN5c3RJUmJ4aTB0N2ZqREpqS3lrcEdZcnd3aTFoeG5MSFEzdDcraklHQlFSSko2SGxsWmFVVUtZRVlSWUJQT0IwZ0JTaEt3S0dBLy8vLzQ4VnRiVzMvOGNsVG5CSUgzZ0NLa3pKZ0FHdkJYMGREbTBzQ0FBQUFBRWxGVGtTdVFtQ0MpOworfQorCisKKwordGFibGUudHJlZXRhYmxlIHRyLmNvbGxhcHNlZC5zZWxlY3RlZCBzcGFuLmluZGVudGVyIGEgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBQUNYQklXWE1BQUFzVEFBQUxFd0VBbXB3WUFBQUtUMmxEUTFCUWFHOTBiM05vYjNBZ1NVTkRJSEJ5YjJacGJHVUFBSGphblZOblZGUHBGajMzM3ZSQ1M0aUFsRXR2VWhVSUlGSkNpNEFVa1NZcUlRa1FTb2dob2RrVlVjRVJSVVVFRzhpZ2lBT09qb0NNRlZFc0RJb0syQWZrSWFLT2c2T0lpc3I3NFh1amE5YTg5K2JOL3JYWFB1ZXM4NTJ6endmQUNBeVdTRE5STllBTXFVSWVFZUNEeDhURzRlUXVRSUVLSkhBQUVBaXpaQ0Z6L1NNQkFQaCtQRHdySXNBSHZnQUJlTk1MQ0FEQVRadkFNQnlIL3cvcVFwbGNBWUNFQWNCMGtUaExDSUFVQUVCNmprS21BRUJHQVlDZG1DWlRBS0FFQUdETFkyTGpBRkF0QUdBbmYrYlRBSUNkK0psN0FRQmJsQ0VWQWFDUkFDQVRaWWhFQUdnN0FLelBWb3BGQUZnd0FCUm1TOFE1QU5ndEFEQkpWMlpJQUxDM0FNRE9FQXV5QUFnTUFEQlJpSVVwQUFSN0FHRElJeU40QUlTWkFCUkc4bGM4OFN1dUVPY3FBQUI0bWJJOHVTUTVSWUZiQ0MxeEIxZFhMaDRvemtrWEt4UTJZUUpobWtBdXdubVpHVEtCTkEvZzg4d0FBS0NSRlJIZ2cvUDllTTRPcnM3T05vNjJEbDh0NnI4Ry95SmlZdVArNWMrcmNFQUFBT0YwZnRIK0xDK3pHb0E3Qm9CdC9xSWw3Z1JvWGd1Z2RmZUxacklQUUxVQW9PbmFWL053K0g0OFBFV2hrTG5aMmVYazVOaEt4RUpiWWNwWGZmNW53bC9BVi8xcytYNDgvUGYxNEw3aUpJRXlYWUZIQlBqZ3dzejBUS1VjejVJSmhHTGM1bzlIL0xjTC8vd2QweUxFU1dLNVdDb1U0MUVTY1k1RW1venpNcVVpaVVLU0tjVWwwdjlrNHQ4cyt3TSszelVBc0dvK0FYdVJMYWhkWXdQMlN5Y1FXSFRBNHZjQUFQSzdiOEhVS0FnRGdHaUQ0YzkzLys4Ly9VZWdKUUNBWmttU2NRQUFYa1FrTGxUS3N6L0hDQUFBUktDQktyQkJHL1RCR0N6QUJoekJCZHpCQy94Z05vUkNKTVRDUWhCQ0NtU0FISEpnS2F5Q1FpaUd6YkFkS21BdjFFQWROTUJSYUlhVGNBNHV3bFc0RGoxd0QvcGhDSjdCS0x5QkNRUkJ5QWdUWVNIYWlBRmlpbGdqamdnWG1ZWDRJY0ZJQkJLTEpDREppQlJSSWt1Uk5VZ3hVb3BVSUZWSUhmSTljZ0k1aDF4R3VwRTd5QUF5Z3Z5R3ZFY3hsSUd5VVQzVURMVkR1YWczR29SR29ndlFaSFF4bW84V29KdlFjclFhUFl3Mm9lZlFxMmdQMm84K1E4Y3d3T2dZQnpQRWJEQXV4c05Dc1Rnc0NaTmp5N0VpckF5cnhocXdWcXdEdTRuMVk4K3hkd1FTZ1VYQUNUWUVkMElnWVI1QlNGaE1XRTdZU0tnZ0hDUTBFZG9KTndrRGhGSENKeUtUcUV1MEpyb1IrY1FZWWpJeGgxaElMQ1BXRW84VEx4QjdpRVBFTnlRU2lVTXlKN21RQWtteHBGVFNFdEpHMG01U0kra3NxWnMwU0Jvams4bmFaR3V5QnptVUxDQXJ5SVhrbmVURDVEUGtHK1FoOGxzS25XSkFjYVQ0VStJb1VzcHFTaG5sRU9VMDVRWmxtREpCVmFPYVV0Mm9vVlFSTlk5YVFxMmh0bEt2VVllb0V6UjFtam5OZ3haSlM2V3RvcFhUR21nWGFQZHByK2gwdWhIZGxSNU9sOUJYMHN2cFIraVg2QVAwZHd3TmhoV0R4NGhuS0JtYkdBY1laeGwzR0srWVRLWVowNHNaeDFRd056SHJtT2VaRDVsdlZWZ3F0aXA4RlpIS0NwVktsU2FWR3lvdlZLbXFwcXJlcWd0VjgxWExWSStwWGxOOXJrWlZNMVBqcVFuVWxxdFZxcDFRNjFNYlUyZXBPNmlIcW1lb2IxUS9wSDVaL1lrR1djTk13MDlEcEZHZ3NWL2p2TVlnQzJNWnMzZ3NJV3NOcTRaMWdUWEVKckhOMlh4MktydVkvUjI3aXoycXFhRTVRek5LTTFlelV2T1VaajhINDVoeCtKeDBUZ25uS0tlWDgzNkszaFR2S2VJcEc2WTBUTGt4WlZ4cnFwYVhsbGlyU0t0UnEwZnJ2VGF1N2FlZHByMUZ1MW43Z1E1Qngwb25YQ2RIWjQvT0JaM25VOWxUM2FjS3B4Wk5QVHIxcmk2cWE2VWJvYnRFZDc5dXArNllucjVlZ0o1TWI2ZmVlYjNuK2h4OUwvMVUvVzM2cC9WSERGZ0dzd3drQnRzTXpoZzh4VFZ4Ynp3ZEw4ZmI4VkZEWGNOQVE2VmhsV0dYNFlTUnVkRThvOVZHalVZUGpHbkdYT01rNDIzR2JjYWpKZ1ltSVNaTFRlcE43cHBTVGJtbUthWTdURHRNeDgzTXphTE4xcGsxbXoweDF6TG5tK2ViMTV2ZnQyQmFlRm9zdHFpMnVHVkpzdVJhcGxudXRyeHVoVm81V2FWWVZWcGRzMGF0bmEwbDFydXR1NmNScDdsT2swNnJudFpudzdEeHRzbTJxYmNac09YWUJ0dXV0bTIyZldGblloZG50OFd1dys2VHZaTjl1bjJOL1QwSERZZlpEcXNkV2gxK2M3UnlGRHBXT3Q2YXpwenVQMzNGOUpicEwyZFl6eERQMkRQanRoUExLY1JwblZPYjAwZG5GMmU1YzRQemlJdUpTNExMTHBjK0xwc2J4dDNJdmVSS2RQVnhYZUY2MHZXZG03T2J3dTJvMjYvdU51NXA3b2Zjbjh3MG55bWVXVE56ME1QSVErQlI1ZEUvQzUrVk1HdmZySDVQUTArQlo3WG5JeTlqTDVGWHJkZXd0NlYzcXZkaDd4Yys5ajV5bitNKzR6dzMzakxlV1YvTU44QzN5TGZMVDhOdm5sK0YzME4vSS85ay8zci8wUUNuZ0NVQlp3T0pnVUdCV3dMNytIcDhJYitPUHpyYlpmYXkyZTFCaktDNVFSVkJqNEt0Z3VYQnJTRm95T3lRclNIMzU1ak9rYzVwRG9WUWZ1alcwQWRoNW1HTHczNE1KNFdIaFZlR1A0NXdpRmdhMFRHWE5YZlIzRU56MzBUNlJKWkUzcHRuTVU4NXJ5MUtOU28rcWk1cVBObzN1alM2UDhZdVpsbk0xVmlkV0Vsc1N4dzVMaXF1Tm01c3Z0Lzg3Zk9INHAzaUMrTjdGNWd2eUYxd2VhSE93dlNGcHhhcExoSXNPcFpBVEloT09KVHdRUkFxcUJhTUpmSVRkeVdPQ25uQ0hjSm5JaS9STnRHSTJFTmNLaDVPOGtncVRYcVM3Skc4Tlhra3hUT2xMT1c1aENlcGtMeE1EVXpkbXpxZUZwcDJJRzB5UFRxOU1ZT1NrWkJ4UXFvaFRaTzJaK3BuNW1aMnk2eGxoYkwreFc2THR5OGVsUWZKYTdPUXJBVlpMUXEyUXFib1ZGb28xeW9Ic21kbFYyYS96WW5LT1phcm5pdk43Y3l6eXR1UU41enZuLy90RXNJUzRaSzJwWVpMVnkwZFdPYTlyR281c2p4eGVkc0s0eFVGSzRaV0Jxdzh1SXEyS20zVlQ2dnRWNWV1ZnIwbWVrMXJnVjdCeW9MQnRRRnI2d3RWQ3VXRmZldmMxKzFkVDFndldkKzFZZnFHblJzK0ZZbUtyaFRiRjVjVmY5Z28zSGpsRzRkdnlyK1ozSlMwcWF2RXVXVFBadEptNmViZUxaNWJEcGFxbCthWERtNE4yZHEwRGQ5V3RPMzE5a1hiTDVmTktOdTdnN1pEdWFPL1BMaThaYWZKenMwN1AxU2tWUFJVK2xRMjd0TGR0V0hYK0c3UjdodDd2UFkwN05YYlc3ejMvVDdKdnR0VkFWVk4xV2JWWmZ0Sis3UDNQNjZKcXVuNGx2dHRYYTFPYlhIdHh3UFNBLzBISXc2MjE3blUxUjNTUFZSU2o5WXI2MGNPeHgrKy9wM3ZkeTBOTmcxVmpaekc0aU53UkhuazZmY0ozL2NlRFRyYWRveDdyT0VIMHg5MkhXY2RMMnBDbXZLYVJwdFRtdnRiWWx1NlQ4dyswZGJxM25yOFI5c2ZENXcwUEZsNVN2TlV5V25hNllMVGsyZnl6NHlkbFoxOWZpNzUzR0Rib3JaNzUyUE8zMm9QYisrNkVIVGgwa1gvaStjN3ZEdk9YUEs0ZFBLeTIrVVRWN2hYbXE4NlgyM3FkT284L3BQVFQ4ZTduTHVhcnJsY2E3bnVlcjIxZTJiMzZSdWVOODdkOUwxNThSYi8xdFdlT1QzZHZmTjZiL2ZGOS9YZkZ0MStjaWY5enN1NzJYY243cTI4VDd4ZjlFRHRRZGxEM1lmVlAxdiszTmp2M0g5cXdIZWc4OUhjUi9jR2hZUFAvcEgxanc5REJZK1pqOHVHRFlicm5qZytPVG5pUDNMOTZmeW5RODlrenlhZUYvNmkvc3V1RnhZdmZ2alY2OWZPMFpqUm9aZnlsNU8vYlh5bC9lckE2eG12MjhiQ3hoNit5WGd6TVY3MFZ2dnR3WGZjZHgzdm85OFBUK1I4SUg4by8yajVzZlZUMEtmN2t4bVRrLzhFQTVqei9HTXpMZHNBQUFBZ1kwaFNUUUFBZWlVQUFJQ0RBQUQ1L3dBQWdPa0FBSFV3QUFEcVlBQUFPcGdBQUJkdmtsL0ZSZ0FBQUZwSlJFRlVlTnBpL1AvL1B3TWxnSEhBRFdENC8vOC9OdHlBUXh3RDQ1S0FBUWRLRGZqLy8vLy8vZmdNSXNZQVpJTXcxREtSRUZ3T0RBd00vNGtOUktxNjRBQURBNE1qRkRPUTZnS3lZNEhvZE1BNDlQTUN4UVlBQmdBVllIc2p5WjF4N1FBQUFBQkpSVTVFcmtKZ2dnPT0pOworfQorCit0YWJsZS50cmVldGFibGUgdHIuZXhwYW5kZWQuc2VsZWN0ZWQgc3Bhbi5pbmRlbnRlciBhIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUFDWEJJV1hNQUFBc1RBQUFMRXdFQW1wd1lBQUFLVDJsRFExQlFhRzkwYjNOb2IzQWdTVU5ESUhCeWIyWnBiR1VBQUhqYW5WTm5WRlBwRmozMzN2UkNTNGlBbEV0dlVoVUlJRkpDaTRBVWtTWXFJUWtRU29naG9ka1ZVY0VSUlVVRUc4aWdpQU9Pam9DTUZWRXNESW9LMkFma0lhS09nNk9JaXNyNzRYdWphOWE4OStiTi9yWFhQdWVzODUyenp3ZkFDQXlXU0ROUk5ZQU1xVUllRWVDRHg4VEc0ZVF1UUlFS0pIQUFFQWl6WkNGei9TTUJBUGgrUER3cklzQUh2Z0FCZU5NTENBREFUWnZBTUJ5SC93L3FRcGxjQVlDRUFjQjBrVGhMQ0lBVUFFQjZqa0ttQUVCR0FZQ2RtQ1pUQUtBRUFHRExZMkxqQUZBdEFHQW5mK2JUQUlDZCtKbDdBUUJibENFVkFhQ1JBQ0FUWlloRUFHZzdBS3pQVm9wRkFGZ3dBQlJtUzhRNUFOZ3RBREJKVjJaSUFMQzNBTURPRUF1eUFBZ01BREJSaUlVcEFBUjdBR0RJSXlONEFJU1pBQlJHOGxjODhTdXVFT2NxQUFCNG1iSTh1U1E1UllGYkNDMXhCMWRYTGg0b3pra1hLeFEyWVFKaG1rQXV3bm1aR1RLQk5BL2c4OHdBQUtDUkZSSGdnL1A5ZU00T3JzN09ObzYyRGw4dDZyOEcveUppWXVQKzVjK3JjRUFBQU9GMGZ0SCtMQyt6R29BN0JvQnQvcUlsN2dSb1hndWdkZmVMWnJJUFFMVUFvT25hVi9OdytINDhQRVdoa0xuWjJlWGs1TmhLeEVKYlljcFhmZjVud2wvQVYvMXMrWDQ4L1BmMTRMN2lKSUV5WFlGSEJQamd3c3owVEtVY3o1SUpoR0xjNW85SC9MY0wvL3dkMHlMRVNXSzVXQ29VNDFFU2NZNUVtb3p6TXFVaWlVS1NLY1VsMHY5azR0OHMrd00rM3pVQXNHbytBWHVSTGFoZFl3UDJTeWNRV0hUQTR2Y0FBUEs3YjhIVUtBZ0RnR2lENGM5My8rOC8vVWVnSlFDQVprbVNjUUFBWGtRa0xsVEtzei9IQ0FBQVJLQ0JLckJCRy9UQkdDekFCaHpCQmR6QkMveGdOb1JDSk1UQ1FoQkNDbVNBSEhKZ0theUNRaWlHemJBZEttQXYxRUFkTk1CUmFJYVRjQTR1d2xXNERqMXdEL3BoQ0o3QktMeUJDUVJCeUFnVFlTSGFpQUZpaWxnampnZ1htWVg0SWNGSUJCS0xKQ0RKaUJSUklrdVJOVWd4VW9wVUlGVklIZkk5Y2dJNWgxeEd1cEU3eUFBeWd2eUd2RWN4bElHeVVUM1VETFZEdWFnM0dvUkdvZ3ZRWkhReG1vOFdvSnZRY3JRYVBZdzJvZWZRcTJnUDJvOCtROGN3d09nWUJ6UEViREF1eHNOQ3NUZ3NDWk5qeTdFaXJBeXJ4aHF3VnF3RHU0bjFZOCt4ZHdRU2dVWEFDVFlFZDBJZ1lSNUJTRmhNV0U3WVNLZ2dIQ1EwRWRvSk53a0RoRkhDSnlLVHFFdTBKcm9SK2NRWVlqSXhoMWhJTENQV0VvOFRMeEI3aUVQRU55UVNpVU15SjdtUUFrbXhwRlRTRXRKRzBtNVNJK2tzcVpzMFNCb2prOG5hWkd1eUJ6bVVMQ0FyeUlYa25lVEQ1RFBrRytRaDhsc0tuV0pBY2FUNFUrSW9Vc3BxU2hubEVPVTA1UVpsbURKQlZhT2FVdDJvb1ZRUk5ZOWFRcTJodGxLdlVZZW9FelIxbWpuTmd4WkpTNld0b3BYVEdtZ1hhUGRwcitoMHVoSGRsUjVPbDlCWDBzdnBSK2lYNkFQMGR3d05oaFdEeDRobktCbWJHQWNZWnhsM0dLK1lUS1laMDRzWngxUXdOekhybU9lWkQ1bHZWVmdxdGlwOEZaSEtDcFZLbFNhVkd5b3ZWS21xcHFyZXFndFY4MVhMVkkrcFhsTjlya1pWTTFQanFRblVscXRWcXAxUTYxTWJVMmVwTzZpSHFtZW9iMVEvcEg1Wi9Za0dXY05NdzA5RHBGR2dzVi9qdk1ZZ0MyTVpzM2dzSVdzTnE0WjFnVFhFSnJITjJYeDJLcnVZL1IyN2l6MnFxYUU1UXpOS00xZXpVdk9VWmo4SDQ1aHgrSngwVGdubktLZVg4MzZLM2hUdktlSXBHNlkwVExreFpWeHJxcGFYbGxpclNLdFJxMGZydlRhdTdhZWRwcjFGdTFuN2dRNUJ4MG9uWENkSFo0L09CWjNuVTlsVDNhY0tweFpOUFRyMXJpNnFhNlVib2J0RWQ3OXVwKzZZbnI1ZWdKNU1iNmZlZWIzbitoeDlMLzFVL1czNnAvVkhERmdHc3d3a0J0c016aGc4eFRWeGJ6d2RMOGZiOFZGRFhjTkFRNlZobFdHWDRZU1J1ZEU4bzlWR2pVWVBqR25HWE9NazQyM0diY2FqSmdZbUlTWkxUZXBON3BwU1RibW1LYVk3VER0TXg4M016YUxOMXBrMW16MHgxekxubStlYjE1dmZ0MkJhZUZvc3RxaTJ1R1ZKc3VSYXBsbnV0cnh1aFZvNVdhVllWVnBkczBhdG5hMGwxcnV0dTZjUnA3bE9rMDZybnRabnc3RHh0c20ycWJjWnNPWFlCdHV1dG0yMmZXRm5ZaGRudDhXdXcrNlR2Wk45dW4yTi9UMEhEWWZaRHFzZFdoMStjN1J5RkRwV090NmF6cHp1UDMzRjlKYnBMMmRZenhEUDJEUGp0aFBMS2NScG5WT2IwMGRuRjJlNWM0UHppSXVKUzRMTExwYytMcHNieHQzSXZlUktkUFZ4WGVGNjB2V2RtN09id3UybzI2L3VOdTVwN29mY244dzBueW1lV1ROejBNUElRK0JSNWRFL0M1K1ZNR3Zmckg1UFEwK0JaN1huSXk5akw1RlhyZGV3dDZWM3F2ZGg3eGMrOWo1eW4rTSs0enczM2pMZVdWL01OOEMzeUxmTFQ4TnZubCtGMzBOL0kvOWsvM3IvMFFDbmdDVUJad09KZ1VHQld3TDcrSHA4SWIrT1B6cmJaZmF5MmUxQmpLQzVRUlZCajRLdGd1WEJyU0ZveU95UXJTSDM1NWpPa2M1cERvVlFmdWpXMEFkaDVtR0x3MzRNSjRXSGhWZUdQNDV3aUZnYTBUR1hOWGZSM0VOejMwVDZSSlpFM3B0bk1VODVyeTFLTlNvK3FpNXFQTm8zdWpTNlA4WXVabG5NMVZpZFdFbHNTeHc1TGlxdU5tNXN2dC84N2ZPSDRwM2lDK043RjVndnlGMXdlYUhPd3ZTRnB4YXBMaElzT3BaQVRJaE9PSlR3UVJBcXFCYU1KZklUZHlXT0NubkNIY0puSWkvUk50R0kyRU5jS2g1TzhrZ3FUWHFTN0pHOE5Ya2t4VE9sTE9XNWhDZXBrTHhNRFV6ZG16cWVGcHAySUcweVBUcTlNWU9Ta1pCeFFxb2hUWk8yWitwbjVtWjJ5NnhsaGJMK3hXNkx0eThlbFFmSmE3T1FyQVZaTFFxMlFxYm9WRm9vMXlvSHNtZGxWMmEvelluS09aYXJuaXZON2N5enl0dVFONXp2bi8vdEVzSVM0WksycFlaTFZ5MGRXT2E5ckdvNXNqeHhlZHNLNHhVRks0WldCcXc4dUlxMkttM1ZUNnZ0VjVldWZyMG1lazFyZ1Y3QnlvTEJ0UUZyNnd0VkN1V0ZmZXZjMSsxZFQxZ3ZXZCsxWWZxR25ScytGWW1LcmhUYkY1Y1ZmOWdvM0hqbEc0ZHZ5citaM0pTMHFhdkV1V1RQWnRKbTZlYmVMWjViRHBhcWwrYVhEbTROMmRxMERkOVd0TzMxOWtYYkw1Zk5LTnU3ZzdaRHVhTy9QTGk4WmFmSnpzMDdQMVNrVlBSVStsUTI3dExkdFdIWCtHN1I3aHQ3dlBZMDdOWGJXN3ozL1Q3SnZ0dFZBVlZOMVdiVlpmdEorN1AzUDY2SnF1bjRsdnR0WGExT2JYSHR4d1BTQS8wSEl3NjIxN25VMVIzU1BWUlNqOVlyNjBjT3h4KysvcDN2ZHkwTk5nMVZqWnpHNGlOd1JIbms2ZmNKMy9jZURUcmFkb3g3ck9FSDB4OTJIV2NkTDJwQ212S2FScHRUbXZ0YllsdTZUOHcrMGRicTNucjhSOXNmRDV3MFBGbDVTdk5VeVduYTZZTFRrMmZ5ejR5ZGxaMTlmaTc1M0dEYm9yWjc1MlBPMzJvUGIrKzZFSFRoMGtYL2krYzd2RHZPWFBLNGRQS3kyK1VUVjdoWG1xODZYMjNxZE9vOC9wUFRUOGU3bkx1YXJybGNhN251ZXIyMWUyYjM2UnVlTjg3ZDlMMTU4UmIvMXRXZU9UM2R2Zk42Yi9mRjkvWGZGdDErY2lmOXpzdTcyWGNuN3EyOFQ3eGY5RUR0UWRsRDNZZlZQMXYrM05qdjNIOXF3SGVnODlIY1IvY0doWVBQL3BIMWp3OURCWStaajh1R0RZYnJuamcrT1RuaVAzTDk2ZnluUTg5a3p5YWVGLzZpL3N1dUZ4WXZmdmpWNjlmTzBaalJvWmZ5bDVPL2JYeWwvZXJBNnhtdjI4YkN4aDYreVhnek1WNzBWdnZ0d1hmY2R4M3ZvOThQVCtSOElIOG8vMmo1c2ZWVDBLZjdreG1Uay84RUE1anovR016TGRzQUFBQWdZMGhTVFFBQWVpVUFBSUNEQUFENS93QUFnT2tBQUhVd0FBRHFZQUFBT3BnQUFCZHZrbC9GUmdBQUFGdEpSRUZVZU5waS9QLy9Qd01sZ0ltQlFzQTQ0QzZnaVFFTkRBd00vL0hnQm1MQ0FGL0FNQkxqQlVlaXhmLy8vNDhMNy8rUEN2WmpVNGZQQUFjMEF4eXdxY01YQ3dlZ0dKMU5ja0w2ang1d3BLWUR4cUdYRWtrQ2dBRUFtcnFCSWVqZGduZ0FBQUFBU1VWT1JLNUNZSUk9KTsKK30KKwordGFibGUudHJlZXRhYmxlIHRyLmFjY2VwdCB7CisgIGJhY2tncm91bmQtY29sb3I6ICNhM2JjZTQ7CisgIGNvbG9yOiAjZmZmCit9CisKK3RhYmxlLnRyZWV0YWJsZSB0ci5jb2xsYXBzZWQuYWNjZXB0IHRkIHNwYW4uaW5kZW50ZXIgYSB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3gtcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUFDWEJJV1hNQUFBc1RBQUFMRXdFQW1wd1lBQUFLVDJsRFExQlFhRzkwYjNOb2IzQWdTVU5ESUhCeWIyWnBiR1VBQUhqYW5WTm5WRlBwRmozMzN2UkNTNGlBbEV0dlVoVUlJRkpDaTRBVWtTWXFJUWtRU29naG9ka1ZVY0VSUlVVRUc4aWdpQU9Pam9DTUZWRXNESW9LMkFma0lhS09nNk9JaXNyNzRYdWphOWE4OStiTi9yWFhQdWVzODUyenp3ZkFDQXlXU0ROUk5ZQU1xVUllRWVDRHg4VEc0ZVF1UUlFS0pIQUFFQWl6WkNGei9TTUJBUGgrUER3cklzQUh2Z0FCZU5NTENBREFUWnZBTUJ5SC93L3FRcGxjQVlDRUFjQjBrVGhMQ0lBVUFFQjZqa0ttQUVCR0FZQ2RtQ1pUQUtBRUFHRExZMkxqQUZBdEFHQW5mK2JUQUlDZCtKbDdBUUJibENFVkFhQ1JBQ0FUWlloRUFHZzdBS3pQVm9wRkFGZ3dBQlJtUzhRNUFOZ3RBREJKVjJaSUFMQzNBTURPRUF1eUFBZ01BREJSaUlVcEFBUjdBR0RJSXlONEFJU1pBQlJHOGxjODhTdXVFT2NxQUFCNG1iSTh1U1E1UllGYkNDMXhCMWRYTGg0b3pra1hLeFEyWVFKaG1rQXV3bm1aR1RLQk5BL2c4OHdBQUtDUkZSSGdnL1A5ZU00T3JzN09ObzYyRGw4dDZyOEcveUppWXVQKzVjK3JjRUFBQU9GMGZ0SCtMQyt6R29BN0JvQnQvcUlsN2dSb1hndWdkZmVMWnJJUFFMVUFvT25hVi9OdytINDhQRVdoa0xuWjJlWGs1TmhLeEVKYlljcFhmZjVud2wvQVYvMXMrWDQ4L1BmMTRMN2lKSUV5WFlGSEJQamd3c3owVEtVY3o1SUpoR0xjNW85SC9MY0wvL3dkMHlMRVNXSzVXQ29VNDFFU2NZNUVtb3p6TXFVaWlVS1NLY1VsMHY5azR0OHMrd00rM3pVQXNHbytBWHVSTGFoZFl3UDJTeWNRV0hUQTR2Y0FBUEs3YjhIVUtBZ0RnR2lENGM5My8rOC8vVWVnSlFDQVprbVNjUUFBWGtRa0xsVEtzei9IQ0FBQVJLQ0JLckJCRy9UQkdDekFCaHpCQmR6QkMveGdOb1JDSk1UQ1FoQkNDbVNBSEhKZ0theUNRaWlHemJBZEttQXYxRUFkTk1CUmFJYVRjQTR1d2xXNERqMXdEL3BoQ0o3QktMeUJDUVJCeUFnVFlTSGFpQUZpaWxnampnZ1htWVg0SWNGSUJCS0xKQ0RKaUJSUklrdVJOVWd4VW9wVUlGVklIZkk5Y2dJNWgxeEd1cEU3eUFBeWd2eUd2RWN4bElHeVVUM1VETFZEdWFnM0dvUkdvZ3ZRWkhReG1vOFdvSnZRY3JRYVBZdzJvZWZRcTJnUDJvOCtROGN3d09nWUJ6UEViREF1eHNOQ3NUZ3NDWk5qeTdFaXJBeXJ4aHF3VnF3RHU0bjFZOCt4ZHdRU2dVWEFDVFlFZDBJZ1lSNUJTRmhNV0U3WVNLZ2dIQ1EwRWRvSk53a0RoRkhDSnlLVHFFdTBKcm9SK2NRWVlqSXhoMWhJTENQV0VvOFRMeEI3aUVQRU55UVNpVU15SjdtUUFrbXhwRlRTRXRKRzBtNVNJK2tzcVpzMFNCb2prOG5hWkd1eUJ6bVVMQ0FyeUlYa25lVEQ1RFBrRytRaDhsc0tuV0pBY2FUNFUrSW9Vc3BxU2hubEVPVTA1UVpsbURKQlZhT2FVdDJvb1ZRUk5ZOWFRcTJodGxLdlVZZW9FelIxbWpuTmd4WkpTNld0b3BYVEdtZ1hhUGRwcitoMHVoSGRsUjVPbDlCWDBzdnBSK2lYNkFQMGR3d05oaFdEeDRobktCbWJHQWNZWnhsM0dLK1lUS1laMDRzWngxUXdOekhybU9lWkQ1bHZWVmdxdGlwOEZaSEtDcFZLbFNhVkd5b3ZWS21xcHFyZXFndFY4MVhMVkkrcFhsTjlya1pWTTFQanFRblVscXRWcXAxUTYxTWJVMmVwTzZpSHFtZW9iMVEvcEg1Wi9Za0dXY05NdzA5RHBGR2dzVi9qdk1ZZ0MyTVpzM2dzSVdzTnE0WjFnVFhFSnJITjJYeDJLcnVZL1IyN2l6MnFxYUU1UXpOS00xZXpVdk9VWmo4SDQ1aHgrSngwVGdubktLZVg4MzZLM2hUdktlSXBHNlkwVExreFpWeHJxcGFYbGxpclNLdFJxMGZydlRhdTdhZWRwcjFGdTFuN2dRNUJ4MG9uWENkSFo0L09CWjNuVTlsVDNhY0tweFpOUFRyMXJpNnFhNlVib2J0RWQ3OXVwKzZZbnI1ZWdKNU1iNmZlZWIzbitoeDlMLzFVL1czNnAvVkhERmdHc3d3a0J0c016aGc4eFRWeGJ6d2RMOGZiOFZGRFhjTkFRNlZobFdHWDRZU1J1ZEU4bzlWR2pVWVBqR25HWE9NazQyM0diY2FqSmdZbUlTWkxUZXBON3BwU1RibW1LYVk3VER0TXg4M016YUxOMXBrMW16MHgxekxubStlYjE1dmZ0MkJhZUZvc3RxaTJ1R1ZKc3VSYXBsbnV0cnh1aFZvNVdhVllWVnBkczBhdG5hMGwxcnV0dTZjUnA3bE9rMDZybnRabnc3RHh0c20ycWJjWnNPWFlCdHV1dG0yMmZXRm5ZaGRudDhXdXcrNlR2Wk45dW4yTi9UMEhEWWZaRHFzZFdoMStjN1J5RkRwV090NmF6cHp1UDMzRjlKYnBMMmRZenhEUDJEUGp0aFBMS2NScG5WT2IwMGRuRjJlNWM0UHppSXVKUzRMTExwYytMcHNieHQzSXZlUktkUFZ4WGVGNjB2V2RtN09id3UybzI2L3VOdTVwN29mY244dzBueW1lV1ROejBNUElRK0JSNWRFL0M1K1ZNR3Zmckg1UFEwK0JaN1huSXk5akw1RlhyZGV3dDZWM3F2ZGg3eGMrOWo1eW4rTSs0enczM2pMZVdWL01OOEMzeUxmTFQ4TnZubCtGMzBOL0kvOWsvM3IvMFFDbmdDVUJad09KZ1VHQld3TDcrSHA4SWIrT1B6cmJaZmF5MmUxQmpLQzVRUlZCajRLdGd1WEJyU0ZveU95UXJTSDM1NWpPa2M1cERvVlFmdWpXMEFkaDVtR0x3MzRNSjRXSGhWZUdQNDV3aUZnYTBUR1hOWGZSM0VOejMwVDZSSlpFM3B0bk1VODVyeTFLTlNvK3FpNXFQTm8zdWpTNlA4WXVabG5NMVZpZFdFbHNTeHc1TGlxdU5tNXN2dC84N2ZPSDRwM2lDK043RjVndnlGMXdlYUhPd3ZTRnB4YXBMaElzT3BaQVRJaE9PSlR3UVJBcXFCYU1KZklUZHlXT0NubkNIY0puSWkvUk50R0kyRU5jS2g1TzhrZ3FUWHFTN0pHOE5Ya2t4VE9sTE9XNWhDZXBrTHhNRFV6ZG16cWVGcHAySUcweVBUcTlNWU9Ta1pCeFFxb2hUWk8yWitwbjVtWjJ5NnhsaGJMK3hXNkx0eThlbFFmSmE3T1FyQVZaTFFxMlFxYm9WRm9vMXlvSHNtZGxWMmEvelluS09aYXJuaXZON2N5enl0dVFONXp2bi8vdEVzSVM0WksycFlaTFZ5MGRXT2E5ckdvNXNqeHhlZHNLNHhVRks0WldCcXc4dUlxMkttM1ZUNnZ0VjVldWZyMG1lazFyZ1Y3QnlvTEJ0UUZyNnd0VkN1V0ZmZXZjMSsxZFQxZ3ZXZCsxWWZxR25ScytGWW1LcmhUYkY1Y1ZmOWdvM0hqbEc0ZHZ5citaM0pTMHFhdkV1V1RQWnRKbTZlYmVMWjViRHBhcWwrYVhEbTROMmRxMERkOVd0TzMxOWtYYkw1Zk5LTnU3ZzdaRHVhTy9QTGk4WmFmSnpzMDdQMVNrVlBSVStsUTI3dExkdFdIWCtHN1I3aHQ3dlBZMDdOWGJXN3ozL1Q3SnZ0dFZBVlZOMVdiVlpmdEorN1AzUDY2SnF1bjRsdnR0WGExT2JYSHR4d1BTQS8wSEl3NjIxN25VMVIzU1BWUlNqOVlyNjBjT3h4KysvcDN2ZHkwTk5nMVZqWnpHNGlOd1JIbms2ZmNKMy9jZURUcmFkb3g3ck9FSDB4OTJIV2NkTDJwQ212S2FScHRUbXZ0YllsdTZUOHcrMGRicTNucjhSOXNmRDV3MFBGbDVTdk5VeVduYTZZTFRrMmZ5ejR5ZGxaMTlmaTc1M0dEYm9yWjc1MlBPMzJvUGIrKzZFSFRoMGtYL2krYzd2RHZPWFBLNGRQS3kyK1VUVjdoWG1xODZYMjNxZE9vOC9wUFRUOGU3bkx1YXJybGNhN251ZXIyMWUyYjM2UnVlTjg3ZDlMMTU4UmIvMXRXZU9UM2R2Zk42Yi9mRjkvWGZGdDErY2lmOXpzdTcyWGNuN3EyOFQ3eGY5RUR0UWRsRDNZZlZQMXYrM05qdjNIOXF3SGVnODlIY1IvY0doWVBQL3BIMWp3OURCWStaajh1R0RZYnJuamcrT1RuaVAzTDk2ZnluUTg5a3p5YWVGLzZpL3N1dUZ4WXZmdmpWNjlmTzBaalJvWmZ5bDVPL2JYeWwvZXJBNnhtdjI4YkN4aDYreVhnek1WNzBWdnZ0d1hmY2R4M3ZvOThQVCtSOElIOG8vMmo1c2ZWVDBLZjdreG1Uay84RUE1anovR016TGRzQUFBQWdZMGhTVFFBQWVpVUFBSUNEQUFENS93QUFnT2tBQUhVd0FBRHFZQUFBT3BnQUFCZHZrbC9GUmdBQUFGcEpSRUZVZU5waS9QLy9Qd01sZ0hIQURXRDQvLzgvTnR5QVF4d0Q0NUtBQVFkS0Rmai8vLy8vL2ZnTUlzWUFaSU13MURLUkVGd09EQXdNLzRrTlJLcTY0QUFEQTRNakZET1E2Z0t5WTRIb2RNQTQ5UE1DeFFZQUJnQVZZSHNqeVoxeDdRQUFBQUJKUlU1RXJrSmdnZz09KTsKK30KKwordGFibGUudHJlZXRhYmxlIHRyLmV4cGFuZGVkLmFjY2VwdCB0ZCBzcGFuLmluZGVudGVyIGEgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS94LXBuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFBQ1hCSVdYTUFBQXNUQUFBTEV3RUFtcHdZQUFBS1QybERRMUJRYUc5MGIzTm9iM0FnU1VORElIQnliMlpwYkdVQUFIamFuVk5uVkZQcEZqMzMzdlJDUzRpQWxFdHZVaFVJSUZKQ2k0QVVrU1lxSVFrUVNvZ2hvZGtWVWNFUlJVVUVHOGlnaUFPT2pvQ01GVkVzRElvSzJBZmtJYUtPZzZPSWlzcjc0WHVqYTlhODkrYk4vclhYUHVlczg1Mnp6d2ZBQ0F5V1NETlJOWUFNcVVJZUVlQ0R4OFRHNGVRdVFJRUtKSEFBRUFpelpDRnovU01CQVBoK1BEd3JJc0FIdmdBQmVOTUxDQURBVFp2QU1CeUgvdy9xUXBsY0FZQ0VBY0Iwa1RoTENJQVVBRUI2amtLbUFFQkdBWUNkbUNaVEFLQUVBR0RMWTJMakFGQXRBR0FuZitiVEFJQ2QrSmw3QVFCYmxDRVZBYUNSQUNBVFpZaEVBR2c3QUt6UFZvcEZBRmd3QUJSbVM4UTVBTmd0QURCSlYyWklBTEMzQU1ET0VBdXlBQWdNQURCUmlJVXBBQVI3QUdESUl5TjRBSVNaQUJSRzhsYzg4U3V1RU9jcUFBQjRtYkk4dVNRNVJZRmJDQzF4QjFkWExoNG96a2tYS3hRMllRSmhta0F1d25tWkdUS0JOQS9nODh3QUFLQ1JGUkhnZy9QOWVNNE9yczdPTm82MkRsOHQ2cjhHL3lKaVl1UCs1YytyY0VBQUFPRjBmdEgrTEMrekdvQTdCb0J0L3FJbDdnUm9YZ3VnZGZlTFpySVBRTFVBb09uYVYvTncrSDQ4UEVXaGtMbloyZVhrNU5oS3hFSmJZY3BYZmY1bndsL0FWLzFzK1g0OC9QZjE0TDdpSklFeVhZRkhCUGpnd3N6MFRLVWN6NUlKaEdMYzVvOUgvTGNMLy93ZDB5TEVTV0s1V0NvVTQxRVNjWTVFbW96ek1xVWlpVUtTS2NVbDB2OWs0dDhzK3dNKzN6VUFzR28rQVh1UkxhaGRZd1AyU3ljUVdIVEE0dmNBQVBLN2I4SFVLQWdEZ0dpRDRjOTMvKzgvL1VlZ0pRQ0Faa21TY1FBQVhrUWtMbFRLc3ovSENBQUFSS0NCS3JCQkcvVEJHQ3pBQmh6QkJkekJDL3hnTm9SQ0pNVENRaEJDQ21TQUhISmdLYXlDUWlpR3piQWRLbUF2MUVBZE5NQlJhSWFUY0E0dXdsVzREajF3RC9waENKN0JLTHlCQ1FSQnlBZ1RZU0hhaUFGaWlsZ2pqZ2dYbVlYNEljRklCQktMSkNESmlCUlJJa3VSTlVneFVvcFVJRlZJSGZJOWNnSTVoMXhHdXBFN3lBQXlndnlHdkVjeGxJR3lVVDNVRExWRHVhZzNHb1JHb2d2UVpIUXhtbzhXb0p2UWNyUWFQWXcyb2VmUXEyZ1AybzgrUThjd3dPZ1lCelBFYkRBdXhzTkNzVGdzQ1pOank3RWlyQXlyeGhxd1Zxd0R1NG4xWTgreGR3UVNnVVhBQ1RZRWQwSWdZUjVCU0ZoTVdFN1lTS2dnSENRMEVkb0pOd2tEaEZIQ0p5S1RxRXUwSnJvUitjUVlZakl4aDFoSUxDUFdFbzhUTHhCN2lFUEVOeVFTaVVNeUo3bVFBa214cEZUU0V0SkcwbTVTSStrc3FaczBTQm9qazhuYVpHdXlCem1VTENBcnlJWGtuZVRENURQa0crUWg4bHNLbldKQWNhVDRVK0lvVXNwcVNobmxFT1UwNVFabG1ESkJWYU9hVXQyb29WUVJOWTlhUXEyaHRsS3ZVWWVvRXpSMW1qbk5neFpKUzZXdG9wWFRHbWdYYVBkcHIraDB1aEhkbFI1T2w5Qlgwc3ZwUitpWDZBUDBkd3dOaGhXRHg0aG5LQm1iR0FjWVp4bDNHSytZVEtZWjA0c1p4MVF3TnpIcm1PZVpENWx2VlZncXRpcDhGWkhLQ3BWS2xTYVZHeW92VkttcXBxcmVxZ3RWODFYTFZJK3BYbE45cmtaVk0xUGpxUW5VbHF0VnFwMVE2MU1iVTJlcE82aUhxbWVvYjFRL3BINVovWWtHV2NOTXcwOURwRkdnc1YvanZNWWdDMk1aczNnc0lXc05xNFoxZ1RYRUpySE4yWHgyS3J1WS9SMjdpejJxcWFFNVF6TktNMWV6VXZPVVpqOEg0NWh4K0p4MFRnbm5LS2VYODM2SzNoVHZLZUlwRzZZMFRMa3haVnhycXBhWGxsaXJTS3RScTBmcnZUYXU3YWVkcHIxRnUxbjdnUTVCeDBvblhDZEhaNC9PQlozblU5bFQzYWNLcHhaTlBUcjFyaTZxYTZVYm9idEVkNzl1cCs2WW5yNWVnSjVNYjZmZWViM24raHg5TC8xVS9XMzZwL1ZIREZnR3N3d2tCdHNNemhnOHhUVnhiendkTDhmYjhWRkRYY05BUTZWaGxXR1g0WVNSdWRFOG85VkdqVVlQakduR1hPTWs0MjNHYmNhakpnWW1JU1pMVGVwTjdwcFNUYm1tS2FZN1REdE14ODNNemFMTjFwazFtejB4MXpMbm0rZWIxNXZmdDJCYWVGb3N0cWkydUdWSnN1UmFwbG51dHJ4dWhWbzVXYVZZVlZwZHMwYXRuYTBsMXJ1dHU2Y1JwN2xPazA2cm50Wm53N0R4dHNtMnFiY1pzT1hZQnR1dXRtMjJmV0ZuWWhkbnQ4V3V3KzZUdlpOOXVuMk4vVDBIRFlmWkRxc2RXaDErYzdSeUZEcFdPdDZhenB6dVAzM0Y5SmJwTDJkWXp4RFAyRFBqdGhQTEtjUnBuVk9iMDBkbkYyZTVjNFB6aUl1SlM0TExMcGMrTHBzYnh0M0l2ZVJLZFBWeFhlRjYwdldkbTdPYnd1Mm8yNi91TnU1cDdvZmNuOHcwbnltZVdUTnowTVBJUStCUjVkRS9DNStWTUd2ZnJINVBRMCtCWjdYbkl5OWpMNUZYcmRld3Q2VjNxdmRoN3hjKzlqNXluK00rNHp3MzNqTGVXVi9NTjhDM3lMZkxUOE52bmwrRjMwTi9JLzlrLzNyLzBRQ25nQ1VCWndPSmdVR0JXd0w3K0hwOEliK09QenJiWmZheTJlMUJqS0M1UVJWQmo0S3RndVhCclNGb3lPeVFyU0gzNTVqT2tjNXBEb1ZRZnVqVzBBZGg1bUdMdzM0TUo0V0hoVmVHUDQ1d2lGZ2EwVEdYTlhmUjNFTnozMFQ2UkpaRTNwdG5NVTg1cnkxS05TbytxaTVxUE5vM3VqUzZQOFl1WmxuTTFWaWRXRWxzU3h3NUxpcXVObTVzdnQvODdmT0g0cDNpQytON0Y1Z3Z5RjF3ZWFIT3d2U0ZweGFwTGhJc09wWkFUSWhPT0pUd1FSQXFxQmFNSmZJVGR5V09Dbm5DSGNKbklpL1JOdEdJMkVOY0toNU84a2dxVFhxUzdKRzhOWGtreFRPbExPVzVoQ2Vwa0x4TURVemRtenFlRnBwMklHMHlQVHE5TVlPU2taQnhRcW9oVFpPMlorcG41bVoyeTZ4bGhiTCt4VzZMdHk4ZWxRZkphN09RckFWWkxRcTJRcWJvVkZvbzF5b0hzbWRsVjJhL3pZbktPWmFybml2TjdjeXp5dHVRTjV6dm4vL3RFc0lTNFpLMnBZWkxWeTBkV09hOXJHbzVzanh4ZWRzSzR4VUZLNFpXQnF3OHVJcTJLbTNWVDZ2dFY1ZXVmcjBtZWsxcmdWN0J5b0xCdFFGcjZ3dFZDdVdGZmV2YzErMWRUMWd2V2QrMVlmcUduUnMrRlltS3JoVGJGNWNWZjlnbzNIamxHNGR2eXIrWjNKUzBxYXZFdVdUUFp0Sm02ZWJlTFo1YkRwYXFsK2FYRG00TjJkcTBEZDlXdE8zMTlrWGJMNWZOS051N2c3WkR1YU8vUExpOFphZkp6czA3UDFTa1ZQUlUrbFEyN3RMZHRXSFgrRzdSN2h0N3ZQWTA3TlhiVzd6My9UN0p2dHRWQVZWTjFXYlZaZnRKKzdQM1A2NkpxdW40bHZ0dFhhMU9iWEh0eHdQU0EvMEhJdzYyMTduVTFSM1NQVlJTajlZcjYwY094eCsrL3AzdmR5ME5OZzFWalp6RzRpTndSSG5rNmZjSjMvY2VEVHJhZG94N3JPRUgweDkySFdjZEwycENtdkthUnB0VG12dGJZbHU2VDh3KzBkYnEzbnI4UjlzZkQ1dzBQRmw1U3ZOVXlXbmE2WUxUazJmeXo0eWRsWjE5Zmk3NTNHRGJvclo3NTJQTzMyb1BiKys2RUhUaDBrWC9pK2M3dkR2T1hQSzRkUEt5MitVVFY3aFhtcTg2WDIzcWRPbzgvcFBUVDhlN25MdWFycmxjYTdudWVyMjFlMmIzNlJ1ZU44N2Q5TDE1OFJiLzF0V2VPVDNkdmZONmIvZkY5L1hmRnQxK2NpZjl6c3U3MlhjbjdxMjhUN3hmOUVEdFFkbEQzWWZWUDF2KzNOanYzSDlxd0hlZzg5SGNSL2NHaFlQUC9wSDFqdzlEQlkrWmo4dUdEWWJybmpnK09UbmlQM0w5NmZ5blE4OWt6eWFlRi82aS9zdXVGeFl2ZnZqVjY5Zk8wWmpSb1pmeWw1Ty9iWHlsL2VyQTZ4bXYyOGJDeGg2K3lYZ3pNVjcwVnZ2dHdYZmNkeDN2bzk4UFQrUjhJSDhvLzJqNXNmVlQwS2Y3a3htVGsvOEVBNWp6L0dNekxkc0FBQUFnWTBoU1RRQUFlaVVBQUlDREFBRDUvd0FBZ09rQUFIVXdBQURxWUFBQU9wZ0FBQmR2a2wvRlJnQUFBRnRKUkVGVWVOcGkvUC8vUHdNbGdJbUJRc0E0NEM2Z2lRRU5EQXdNLy9IZ0JtTENBRi9BTUJMakJVZWl4Zi8vLzQ4TDcvK1BDdlpqVTRmUEFBYzBBeHl3cWNNWEN3ZWdHSjFOY2tMNmp4NXdwS1lEeHFHWEVra0NnQUVBbXJxQkllamRnbmdBQUFBQVNVVk9SSzVDWUlJPSk7Cit9CmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2Nzcy9wcmV0dGlmeS5jc3MgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2Nzcy9wcmV0dGlmeS5jc3MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjMxN2E3YwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvY3NzL3ByZXR0aWZ5LmNzcwpAQCAtMCwwICsxIEBACisucGxue2NvbG9yOiMwMDB9QG1lZGlhIHNjcmVlbnsuc3Rye2NvbG9yOiMwODB9Lmt3ZHtjb2xvcjojMDA4fS5jb217Y29sb3I6IzgwMH0udHlwe2NvbG9yOiM2MDZ9LmxpdHtjb2xvcjojMDY2fS5wdW4sLm9wbiwuY2xve2NvbG9yOiM2NjB9LnRhZ3tjb2xvcjojMDA4fS5hdG57Y29sb3I6IzYwNn0uYXR2e2NvbG9yOiMwODB9LmRlYywudmFye2NvbG9yOiM2MDZ9LmZ1bntjb2xvcjpyZWR9fUBtZWRpYSBwcmludCxwcm9qZWN0aW9uey5zdHJ7Y29sb3I6IzA2MH0ua3dke2NvbG9yOiMwMDY7Zm9udC13ZWlnaHQ6Ym9sZH0uY29te2NvbG9yOiM2MDA7Zm9udC1zdHlsZTppdGFsaWN9LnR5cHtjb2xvcjojNDA0O2ZvbnQtd2VpZ2h0OmJvbGR9LmxpdHtjb2xvcjojMDQ0fS5wdW4sLm9wbiwuY2xve2NvbG9yOiM0NDB9LnRhZ3tjb2xvcjojMDA2O2ZvbnQtd2VpZ2h0OmJvbGR9LmF0bntjb2xvcjojNDA0fS5hdHZ7Y29sb3I6IzA2MH19cHJlLnByZXR0eXByaW50e3BhZGRpbmc6MnB4O2JvcmRlcjoxcHggc29saWQgIzg4OH1vbC5saW5lbnVtc3ttYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowfWxpLkwwLGxpLkwxLGxpLkwyLGxpLkwzLGxpLkw1LGxpLkw2LGxpLkw3LGxpLkw4e2xpc3Qtc3R5bGUtdHlwZTpub25lfWxpLkwxLGxpLkwzLGxpLkw1LGxpLkw3LGxpLkw5e2JhY2tncm91bmQ6I2VlZX0KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvY3NzL3NjcmVlbi5jc3MgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2Nzcy9zY3JlZW4uY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMzNlZjYKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2Nzcy9zY3JlZW4uY3NzCkBAIC0wLDAgKzEsMjggQEAKK2JvZHkgeworICBiYWNrZ3JvdW5kOiAjZGRkOworICBjb2xvcjogIzAwMDsKKyAgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7CisgIGxpbmUtaGVpZ2h0OiAxLjU7CisgIG1hcmdpbjogMDsKKyAgcGFkZGluZzogMDsKK30KKworI21haW4geworICBiYWNrZ3JvdW5kOiAjZmZmOworICBib3JkZXItbGVmdDogMjBweCBzb2xpZCAjZWVlOworICBib3JkZXItcmlnaHQ6IDIwcHggc29saWQgI2VlZTsKKyAgbWFyZ2luOiAwIGF1dG87CisgIG1heC13aWR0aDogODAwcHg7CisgIHBhZGRpbmc6IDIwcHg7Cit9CisKK3ByZS5saXN0aW5nIHsKKyAgYmFja2dyb3VuZDogI2VlZTsKKyAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKKyAgbWFyZ2luOiAuNmVtIDAgLjNlbSAwOworICBwYWRkaW5nOiAuMWVtIC4zZW07Cit9CisKK3ByZS5saXN0aW5nIGIgeworICBjb2xvcjogI2YwMDsKK30KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvZm9udHMvRm9udEF3ZXNvbWUub3RmIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9mb250cy9Gb250QXdlc29tZS5vdGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQwNDliZgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvZm9udHMvRm9udEF3ZXNvbWUub3RmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvZm9udHMvZm9udGF3ZXNvbWUtd2ViZm9udC5lb3QgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2ZvbnRzL2ZvbnRhd2Vzb21lLXdlYmZvbnQuZW90Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkODEwMTkKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2ZvbnRzL2ZvbnRhd2Vzb21lLXdlYmZvbnQuZW90CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvZm9udHMvZm9udGF3ZXNvbWUtd2ViZm9udC5zdmcgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2ZvbnRzL2ZvbnRhd2Vzb21lLXdlYmZvbnQuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMGFmZTUKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2ZvbnRzL2ZvbnRhd2Vzb21lLXdlYmZvbnQuc3ZnCkBAIC0wLDAgKzEsMjg0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIHN0YW5kYWxvbmU9Im5vIj8+Cis8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiID4KKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KKzxtZXRhZGF0YT48L21ldGFkYXRhPgorPGRlZnM+Cis8Zm9udCBpZD0iZm9udGF3ZXNvbWVyZWd1bGFyIiBob3Jpei1hZHYteD0iMTUzNiIgPgorPGZvbnQtZmFjZSB1bml0cy1wZXItZW09IjE3OTIiIGFzY2VudD0iMTUzNiIgZGVzY2VudD0iLTI1NiIgLz4KKzxtaXNzaW5nLWdseXBoIGhvcml6LWFkdi14PSI0NDgiIC8+Cis8Z2x5cGggdW5pY29kZT0iICIgIGhvcml6LWFkdi14PSI0NDgiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MDk7IiBob3Jpei1hZHYteD0iNDQ4IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGEwOyIgaG9yaXotYWR2LXg9IjQ0OCIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hhODsiIGhvcml6LWFkdi14PSIxNzkyIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGE5OyIgaG9yaXotYWR2LXg9IjE3OTIiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4YWU7IiBob3Jpei1hZHYteD0iMTc5MiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hiNDsiIGhvcml6LWFkdi14PSIxNzkyIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGM2OyIgaG9yaXotYWR2LXg9IjE3OTIiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAwMDsiIGhvcml6LWFkdi14PSI3NjgiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAwMTsiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAwMjsiIGhvcml6LWFkdi14PSI3NjgiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAwMzsiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAwNDsiIGhvcml6LWFkdi14PSI1MTIiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAwNTsiIGhvcml6LWFkdi14PSIzODQiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAwNjsiIGhvcml6LWFkdi14PSIyNTYiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAwNzsiIGhvcml6LWFkdi14PSIyNTYiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAwODsiIGhvcml6LWFkdi14PSIxOTIiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAwOTsiIGhvcml6LWFkdi14PSIzMDciIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAwYTsiIGhvcml6LWFkdi14PSI4NSIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDJmOyIgaG9yaXotYWR2LXg9IjMwNyIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDVmOyIgaG9yaXotYWR2LXg9IjM4NCIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMTIyOyIgaG9yaXotYWR2LXg9IjE3OTIiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjIxZTsiIGhvcml6LWFkdi14PSIxNzkyIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIyNjA7IiBob3Jpei1hZHYteD0iMTc5MiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMDAwOyIgaG9yaXotYWR2LXg9IjUwMCIgZD0iTTAgMHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjAwMDsiIGhvcml6LWFkdi14PSIxNzkyIiBkPSJNMTY5OSAxMzUwcTAgLTM1IC00MyAtNzhsLTYzMiAtNjMydi03NjhoMzIwcTI2IDAgNDUgLTE5dDE5IC00NXQtMTkgLTQ1dC00NSAtMTloLTg5NnEtMjYgMCAtNDUgMTl0LTE5IDQ1dDE5IDQ1dDQ1IDE5aDMyMHY3NjhsLTYzMiA2MzJxLTQzIDQzIC00MyA3OHEwIDIzIDE4IDM2LjV0MzggMTcuNXQ0MyA0aDE0MDhxMjMgMCA0MyAtNHQzOCAtMTcuNXQxOCAtMzYuNXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjAwMTsiIGQ9Ik0xNTM2IDEzMTJ2LTExMjBxMCAtNTAgLTM0IC04OXQtODYgLTYwLjV0LTEwMy41IC0zMnQtOTYuNSAtMTAuNXQtOTYuNSAxMC41dC0xMDMuNSAzMnQtODYgNjAuNXQtMzQgODl0MzQgODl0ODYgNjAuNXQxMDMuNSAzMnQ5Ni41IDEwLjVxMTA1IDAgMTkyIC0zOXY1MzdsLTc2OCAtMjM3di03MDlxMCAtNTAgLTM0IC04OXQtODYgLTYwLjV0LTEwMy41IC0zMnQtOTYuNSAtMTAuNXQtOTYuNSAxMC41dC0xMDMuNSAzMnQtODYgNjAuNXQtMzQgODkgdDM0IDg5dDg2IDYwLjV0MTAzLjUgMzJ0OTYuNSAxMC41cTEwNSAwIDE5MiAtMzl2OTY3cTAgMzEgMTkgNTYuNXQ0OSAzNS41bDgzMiAyNTZxMTIgNCAyOCA0cTQwIDAgNjggLTI4dDI4IC02OHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjAwMjsiIGhvcml6LWFkdi14PSIxNjY0IiBkPSJNMTE1MiA3MDRxMCAxODUgLTEzMS41IDMxNi41dC0zMTYuNSAxMzEuNXQtMzE2LjUgLTEzMS41dC0xMzEuNSAtMzE2LjV0MTMxLjUgLTMxNi41dDMxNi41IC0xMzEuNXQzMTYuNSAxMzEuNXQxMzEuNSAzMTYuNXpNMTY2NCAtMTI4cTAgLTUyIC0zOCAtOTB0LTkwIC0zOHEtNTQgMCAtOTAgMzhsLTM0MyAzNDJxLTE3OSAtMTI0IC0zOTkgLTEyNHEtMTQzIDAgLTI3My41IDU1LjV0LTIyNSAxNTB0LTE1MCAyMjV0LTU1LjUgMjczLjUgdDU1LjUgMjczLjV0MTUwIDIyNXQyMjUgMTUwdDI3My41IDU1LjV0MjczLjUgLTU1LjV0MjI1IC0xNTB0MTUwIC0yMjV0NTUuNSAtMjczLjVxMCAtMjIwIC0xMjQgLTM5OWwzNDMgLTM0M3EzNyAtMzcgMzcgLTkweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDAzOyIgaG9yaXotYWR2LXg9IjE3OTIiIGQ9Ik0xNjY0IDMydjc2OHEtMzIgLTM2IC02OSAtNjZxLTI2OCAtMjA2IC00MjYgLTMzOHEtNTEgLTQzIC04MyAtNjd0LTg2LjUgLTQ4LjV0LTEwMi41IC0yNC41aC0xaC0xcS00OCAwIC0xMDIuNSAyNC41dC04Ni41IDQ4LjV0LTgzIDY3cS0xNTggMTMyIC00MjYgMzM4cS0zNyAzMCAtNjkgNjZ2LTc2OHEwIC0xMyA5LjUgLTIyLjV0MjIuNSAtOS41aDE0NzJxMTMgMCAyMi41IDkuNXQ5LjUgMjIuNXpNMTY2NCAxMDgzdjExdjEzLjV0LTAuNSAxMyB0LTMgMTIuNXQtNS41IDl0LTkgNy41dC0xNCAyLjVoLTE0NzJxLTEzIDAgLTIyLjUgLTkuNXQtOS41IC0yMi41cTAgLTE2OCAxNDcgLTI4NHExOTMgLTE1MiA0MDEgLTMxN3E2IC01IDM1IC0yOS41dDQ2IC0zNy41dDQ0LjUgLTMxLjV0NTAuNSAtMjcuNXQ0MyAtOWgxaDFxMjAgMCA0MyA5dDUwLjUgMjcuNXQ0NC41IDMxLjV0NDYgMzcuNXQzNSAyOS41cTIwOCAxNjUgNDAxIDMxN3E1NCA0MyAxMDAuNSAxMTUuNXQ0Ni41IDEzMS41eiBNMTc5MiAxMTIwdi0xMDg4cTAgLTY2IC00NyAtMTEzdC0xMTMgLTQ3aC0xNDcycS02NiAwIC0xMTMgNDd0LTQ3IDExM3YxMDg4cTAgNjYgNDcgMTEzdDExMyA0N2gxNDcycTY2IDAgMTEzIC00N3Q0NyAtMTEzeiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDA0OyIgaG9yaXotYWR2LXg9IjE3OTIiIGQ9Ik04OTYgLTEyOHEtMjYgMCAtNDQgMThsLTYyNCA2MDJxLTEwIDggLTI3LjUgMjZ0LTU1LjUgNjUuNXQtNjggOTcuNXQtNTMuNSAxMjF0LTIzLjUgMTM4cTAgMjIwIDEyNyAzNDR0MzUxIDEyNHE2MiAwIDEyNi41IC0yMS41dDEyMCAtNTh0OTUuNSAtNjguNXQ3NiAtNjhxMzYgMzYgNzYgNjh0OTUuNSA2OC41dDEyMCA1OHQxMjYuNSAyMS41cTIyNCAwIDM1MSAtMTI0dDEyNyAtMzQ0cTAgLTIyMSAtMjI5IC00NTBsLTYyMyAtNjAwIHEtMTggLTE4IC00NCAtMTh6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwMDU7IiBob3Jpei1hZHYteD0iMTY2NCIgZD0iTTE2NjQgODg5cTAgLTIyIC0yNiAtNDhsLTM2MyAtMzU0bDg2IC01MDBxMSAtNyAxIC0yMHEwIC0yMSAtMTAuNSAtMzUuNXQtMzAuNSAtMTQuNXEtMTkgMCAtNDAgMTJsLTQ0OSAyMzZsLTQ0OSAtMjM2cS0yMiAtMTIgLTQwIC0xMnEtMjEgMCAtMzEuNSAxNC41dC0xMC41IDM1LjVxMCA2IDIgMjBsODYgNTAwbC0zNjQgMzU0cS0yNSAyNyAtMjUgNDhxMCAzNyA1NiA0Nmw1MDIgNzNsMjI1IDQ1NXExOSA0MSA0OSA0MXQ0OSAtNDFsMjI1IC00NTUgbDUwMiAtNzNxNTYgLTkgNTYgLTQ2eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDA2OyIgaG9yaXotYWR2LXg9IjE2NjQiIGQ9Ik0xMTM3IDUzMmwzMDYgMjk3bC00MjIgNjJsLTE4OSAzODJsLTE4OSAtMzgybC00MjIgLTYybDMwNiAtMjk3bC03MyAtNDIxbDM3OCAxOTlsMzc3IC0xOTl6TTE2NjQgODg5cTAgLTIyIC0yNiAtNDhsLTM2MyAtMzU0bDg2IC01MDBxMSAtNyAxIC0yMHEwIC01MCAtNDEgLTUwcS0xOSAwIC00MCAxMmwtNDQ5IDIzNmwtNDQ5IC0yMzZxLTIyIC0xMiAtNDAgLTEycS0yMSAwIC0zMS41IDE0LjV0LTEwLjUgMzUuNXEwIDYgMiAyMGw4NiA1MDAgbC0zNjQgMzU0cS0yNSAyNyAtMjUgNDhxMCAzNyA1NiA0Nmw1MDIgNzNsMjI1IDQ1NXExOSA0MSA0OSA0MXQ0OSAtNDFsMjI1IC00NTVsNTAyIC03M3E1NiAtOSA1NiAtNDZ6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwMDc7IiBob3Jpei1hZHYteD0iMTQwOCIgZD0iTTE0MDggMTMxcTAgLTEyMCAtNzMgLTE4OS41dC0xOTQgLTY5LjVoLTg3NHEtMTIxIDAgLTE5NCA2OS41dC03MyAxODkuNXEwIDUzIDMuNSAxMDMuNXQxNCAxMDl0MjYuNSAxMDguNXQ0MyA5Ny41dDYyIDgxdDg1LjUgNTMuNXQxMTEuNSAyMHE5IDAgNDIgLTIxLjV0NzQuNSAtNDh0MTA4IC00OHQxMzMuNSAtMjEuNXQxMzMuNSAyMS41dDEwOCA0OHQ3NC41IDQ4dDQyIDIxLjVxNjEgMCAxMTEuNSAtMjB0ODUuNSAtNTMuNXQ2MiAtODEgdDQzIC05Ny41dDI2LjUgLTEwOC41dDE0IC0xMDl0My41IC0xMDMuNXpNMTA4OCAxMDI0cTAgLTE1OSAtMTEyLjUgLTI3MS41dC0yNzEuNSAtMTEyLjV0LTI3MS41IDExMi41dC0xMTIuNSAyNzEuNXQxMTIuNSAyNzEuNXQyNzEuNSAxMTIuNXQyNzEuNSAtMTEyLjV0MTEyLjUgLTI3MS41eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDA4OyIgaG9yaXotYWR2LXg9IjE5MjAiIGQ9Ik0zODQgLTY0djEyOHEwIDI2IC0xOSA0NXQtNDUgMTloLTEyOHEtMjYgMCAtNDUgLTE5dC0xOSAtNDV2LTEyOHEwIC0yNiAxOSAtNDV0NDUgLTE5aDEyOHEyNiAwIDQ1IDE5dDE5IDQ1ek0zODQgMzIwdjEyOHEwIDI2IC0xOSA0NXQtNDUgMTloLTEyOHEtMjYgMCAtNDUgLTE5dC0xOSAtNDV2LTEyOHEwIC0yNiAxOSAtNDV0NDUgLTE5aDEyOHEyNiAwIDQ1IDE5dDE5IDQ1ek0zODQgNzA0djEyOHEwIDI2IC0xOSA0NXQtNDUgMTloLTEyOCBxLTI2IDAgLTQ1IC0xOXQtMTkgLTQ1di0xMjhxMCAtMjYgMTkgLTQ1dDQ1IC0xOWgxMjhxMjYgMCA0NSAxOXQxOSA0NXpNMTQwOCAtNjR2NTEycTAgMjYgLTE5IDQ1dC00NSAxOWgtNzY4cS0yNiAwIC00NSAtMTl0LTE5IC00NXYtNTEycTAgLTI2IDE5IC00NXQ0NSAtMTloNzY4cTI2IDAgNDUgMTl0MTkgNDV6TTM4NCAxMDg4djEyOHEwIDI2IC0xOSA0NXQtNDUgMTloLTEyOHEtMjYgMCAtNDUgLTE5dC0xOSAtNDV2LTEyOHEwIC0yNiAxOSAtNDUgdDQ1IC0xOWgxMjhxMjYgMCA0NSAxOXQxOSA0NXpNMTc5MiAtNjR2MTI4cTAgMjYgLTE5IDQ1dC00NSAxOWgtMTI4cS0yNiAwIC00NSAtMTl0LTE5IC00NXYtMTI4cTAgLTI2IDE5IC00NXQ0NSAtMTloMTI4cTI2IDAgNDUgMTl0MTkgNDV6TTE0MDggNzA0djUxMnEwIDI2IC0xOSA0NXQtNDUgMTloLTc2OHEtMjYgMCAtNDUgLTE5dC0xOSAtNDV2LTUxMnEwIC0yNiAxOSAtNDV0NDUgLTE5aDc2OHEyNiAwIDQ1IDE5dDE5IDQ1ek0xNzkyIDMyMHYxMjggcTAgMjYgLTE5IDQ1dC00NSAxOWgtMTI4cS0yNiAwIC00NSAtMTl0LTE5IC00NXYtMTI4cTAgLTI2IDE5IC00NXQ0NSAtMTloMTI4cTI2IDAgNDUgMTl0MTkgNDV6TTE3OTIgNzA0djEyOHEwIDI2IC0xOSA0NXQtNDUgMTloLTEyOHEtMjYgMCAtNDUgLTE5dC0xOSAtNDV2LTEyOHEwIC0yNiAxOSAtNDV0NDUgLTE5aDEyOHEyNiAwIDQ1IDE5dDE5IDQ1ek0xNzkyIDEwODh2MTI4cTAgMjYgLTE5IDQ1dC00NSAxOWgtMTI4cS0yNiAwIC00NSAtMTkgdC0xOSAtNDV2LTEyOHEwIC0yNiAxOSAtNDV0NDUgLTE5aDEyOHEyNiAwIDQ1IDE5dDE5IDQ1ek0xOTIwIDEyNDh2LTEzNDRxMCAtNjYgLTQ3IC0xMTN0LTExMyAtNDdoLTE2MDBxLTY2IDAgLTExMyA0N3QtNDcgMTEzdjEzNDRxMCA2NiA0NyAxMTN0MTEzIDQ3aDE2MDBxNjYgMCAxMTMgLTQ3dDQ3IC0xMTN6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwMDk7IiBob3Jpei1hZHYteD0iMTY2NCIgZD0iTTc2OCA1MTJ2LTM4NHEwIC01MiAtMzggLTkwdC05MCAtMzhoLTUxMnEtNTIgMCAtOTAgMzh0LTM4IDkwdjM4NHEwIDUyIDM4IDkwdDkwIDM4aDUxMnE1MiAwIDkwIC0zOHQzOCAtOTB6TTc2OCAxMjgwdi0zODRxMCAtNTIgLTM4IC05MHQtOTAgLTM4aC01MTJxLTUyIDAgLTkwIDM4dC0zOCA5MHYzODRxMCA1MiAzOCA5MHQ5MCAzOGg1MTJxNTIgMCA5MCAtMzh0MzggLTkwek0xNjY0IDUxMnYtMzg0cTAgLTUyIC0zOCAtOTB0LTkwIC0zOCBoLTUxMnEtNTIgMCAtOTAgMzh0LTM4IDkwdjM4NHEwIDUyIDM4IDkwdDkwIDM4aDUxMnE1MiAwIDkwIC0zOHQzOCAtOTB6TTE2NjQgMTI4MHYtMzg0cTAgLTUyIC0zOCAtOTB0LTkwIC0zOGgtNTEycS01MiAwIC05MCAzOHQtMzggOTB2Mzg0cTAgNTIgMzggOTB0OTAgMzhoNTEycTUyIDAgOTAgLTM4dDM4IC05MHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjAwYTsiIGhvcml6LWFkdi14PSIxNzkyIiBkPSJNNTEyIDI4OHYtMTkycTAgLTQwIC0yOCAtNjh0LTY4IC0yOGgtMzIwcS00MCAwIC02OCAyOHQtMjggNjh2MTkycTAgNDAgMjggNjh0NjggMjhoMzIwcTQwIDAgNjggLTI4dDI4IC02OHpNNTEyIDgwMHYtMTkycTAgLTQwIC0yOCAtNjh0LTY4IC0yOGgtMzIwcS00MCAwIC02OCAyOHQtMjggNjh2MTkycTAgNDAgMjggNjh0NjggMjhoMzIwcTQwIDAgNjggLTI4dDI4IC02OHpNMTE1MiAyODh2LTE5MnEwIC00MCAtMjggLTY4dC02OCAtMjhoLTMyMCBxLTQwIDAgLTY4IDI4dC0yOCA2OHYxOTJxMCA0MCAyOCA2OHQ2OCAyOGgzMjBxNDAgMCA2OCAtMjh0MjggLTY4ek01MTIgMTMxMnYtMTkycTAgLTQwIC0yOCAtNjh0LTY4IC0yOGgtMzIwcS00MCAwIC02OCAyOHQtMjggNjh2MTkycTAgNDAgMjggNjh0NjggMjhoMzIwcTQwIDAgNjggLTI4dDI4IC02OHpNMTE1MiA4MDB2LTE5MnEwIC00MCAtMjggLTY4dC02OCAtMjhoLTMyMHEtNDAgMCAtNjggMjh0LTI4IDY4djE5MnEwIDQwIDI4IDY4dDY4IDI4IGgzMjBxNDAgMCA2OCAtMjh0MjggLTY4ek0xNzkyIDI4OHYtMTkycTAgLTQwIC0yOCAtNjh0LTY4IC0yOGgtMzIwcS00MCAwIC02OCAyOHQtMjggNjh2MTkycTAgNDAgMjggNjh0NjggMjhoMzIwcTQwIDAgNjggLTI4dDI4IC02OHpNMTE1MiAxMzEydi0xOTJxMCAtNDAgLTI4IC02OHQtNjggLTI4aC0zMjBxLTQwIDAgLTY4IDI4dC0yOCA2OHYxOTJxMCA0MCAyOCA2OHQ2OCAyOGgzMjBxNDAgMCA2OCAtMjh0MjggLTY4ek0xNzkyIDgwMHYtMTkyIHEwIC00MCAtMjggLTY4dC02OCAtMjhoLTMyMHEtNDAgMCAtNjggMjh0LTI4IDY4djE5MnEwIDQwIDI4IDY4dDY4IDI4aDMyMHE0MCAwIDY4IC0yOHQyOCAtNjh6TTE3OTIgMTMxMnYtMTkycTAgLTQwIC0yOCAtNjh0LTY4IC0yOGgtMzIwcS00MCAwIC02OCAyOHQtMjggNjh2MTkycTAgNDAgMjggNjh0NjggMjhoMzIwcTQwIDAgNjggLTI4dDI4IC02OHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjAwYjsiIGhvcml6LWFkdi14PSIxNzkyIiBkPSJNNTEyIDI4OHYtMTkycTAgLTQwIC0yOCAtNjh0LTY4IC0yOGgtMzIwcS00MCAwIC02OCAyOHQtMjggNjh2MTkycTAgNDAgMjggNjh0NjggMjhoMzIwcTQwIDAgNjggLTI4dDI4IC02OHpNNTEyIDgwMHYtMTkycTAgLTQwIC0yOCAtNjh0LTY4IC0yOGgtMzIwcS00MCAwIC02OCAyOHQtMjggNjh2MTkycTAgNDAgMjggNjh0NjggMjhoMzIwcTQwIDAgNjggLTI4dDI4IC02OHpNMTc5MiAyODh2LTE5MnEwIC00MCAtMjggLTY4dC02OCAtMjhoLTk2MCBxLTQwIDAgLTY4IDI4dC0yOCA2OHYxOTJxMCA0MCAyOCA2OHQ2OCAyOGg5NjBxNDAgMCA2OCAtMjh0MjggLTY4ek01MTIgMTMxMnYtMTkycTAgLTQwIC0yOCAtNjh0LTY4IC0yOGgtMzIwcS00MCAwIC02OCAyOHQtMjggNjh2MTkycTAgNDAgMjggNjh0NjggMjhoMzIwcTQwIDAgNjggLTI4dDI4IC02OHpNMTc5MiA4MDB2LTE5MnEwIC00MCAtMjggLTY4dC02OCAtMjhoLTk2MHEtNDAgMCAtNjggMjh0LTI4IDY4djE5MnEwIDQwIDI4IDY4dDY4IDI4IGg5NjBxNDAgMCA2OCAtMjh0MjggLTY4ek0xNzkyIDEzMTJ2LTE5MnEwIC00MCAtMjggLTY4dC02OCAtMjhoLTk2MHEtNDAgMCAtNjggMjh0LTI4IDY4djE5MnEwIDQwIDI4IDY4dDY4IDI4aDk2MHE0MCAwIDY4IC0yOHQyOCAtNjh6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwMGM7IiBob3Jpei1hZHYteD0iMTc5MiIgZD0iTTE2NzEgOTcwcTAgLTQwIC0yOCAtNjhsLTcyNCAtNzI0bC0xMzYgLTEzNnEtMjggLTI4IC02OCAtMjh0LTY4IDI4bC0xMzYgMTM2bC0zNjIgMzYycS0yOCAyOCAtMjggNjh0MjggNjhsMTM2IDEzNnEyOCAyOCA2OCAyOHQ2OCAtMjhsMjk0IC0yOTVsNjU2IDY1N3EyOCAyOCA2OCAyOHQ2OCAtMjhsMTM2IC0xMzZxMjggLTI4IDI4IC02OHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjAwZDsiIGhvcml6LWFkdi14PSIxNDA4IiBkPSJNMTI5OCAyMTRxMCAtNDAgLTI4IC02OGwtMTM2IC0xMzZxLTI4IC0yOCAtNjggLTI4dC02OCAyOGwtMjk0IDI5NGwtMjk0IC0yOTRxLTI4IC0yOCAtNjggLTI4dC02OCAyOGwtMTM2IDEzNnEtMjggMjggLTI4IDY4dDI4IDY4bDI5NCAyOTRsLTI5NCAyOTRxLTI4IDI4IC0yOCA2OHQyOCA2OGwxMzYgMTM2cTI4IDI4IDY4IDI4dDY4IC0yOGwyOTQgLTI5NGwyOTQgMjk0cTI4IDI4IDY4IDI4dDY4IC0yOGwxMzYgLTEzNnEyOCAtMjggMjggLTY4IHQtMjggLTY4bC0yOTQgLTI5NGwyOTQgLTI5NHEyOCAtMjggMjggLTY4eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDBlOyIgaG9yaXotYWR2LXg9IjE2NjQiIGQ9Ik0xMDI0IDczNnYtNjRxMCAtMTMgLTkuNSAtMjIuNXQtMjIuNSAtOS41aC0yMjR2LTIyNHEwIC0xMyAtOS41IC0yMi41dC0yMi41IC05LjVoLTY0cS0xMyAwIC0yMi41IDkuNXQtOS41IDIyLjV2MjI0aC0yMjRxLTEzIDAgLTIyLjUgOS41dC05LjUgMjIuNXY2NHEwIDEzIDkuNSAyMi41dDIyLjUgOS41aDIyNHYyMjRxMCAxMyA5LjUgMjIuNXQyMi41IDkuNWg2NHExMyAwIDIyLjUgLTkuNXQ5LjUgLTIyLjV2LTIyNGgyMjQgcTEzIDAgMjIuNSAtOS41dDkuNSAtMjIuNXpNMTE1MiA3MDRxMCAxODUgLTEzMS41IDMxNi41dC0zMTYuNSAxMzEuNXQtMzE2LjUgLTEzMS41dC0xMzEuNSAtMzE2LjV0MTMxLjUgLTMxNi41dDMxNi41IC0xMzEuNXQzMTYuNSAxMzEuNXQxMzEuNSAzMTYuNXpNMTY2NCAtMTI4cTAgLTUzIC0zNy41IC05MC41dC05MC41IC0zNy41cS01NCAwIC05MCAzOGwtMzQzIDM0MnEtMTc5IC0xMjQgLTM5OSAtMTI0cS0xNDMgMCAtMjczLjUgNTUuNSB0LTIyNSAxNTB0LTE1MCAyMjV0LTU1LjUgMjczLjV0NTUuNSAyNzMuNXQxNTAgMjI1dDIyNSAxNTB0MjczLjUgNTUuNXQyNzMuNSAtNTUuNXQyMjUgLTE1MHQxNTAgLTIyNXQ1NS41IC0yNzMuNXEwIC0yMjAgLTEyNCAtMzk5bDM0MyAtMzQzcTM3IC0zNyAzNyAtOTB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwMTA7IiBob3Jpei1hZHYteD0iMTY2NCIgZD0iTTEwMjQgNzM2di02NHEwIC0xMyAtOS41IC0yMi41dC0yMi41IC05LjVoLTU3NnEtMTMgMCAtMjIuNSA5LjV0LTkuNSAyMi41djY0cTAgMTMgOS41IDIyLjV0MjIuNSA5LjVoNTc2cTEzIDAgMjIuNSAtOS41dDkuNSAtMjIuNXpNMTE1MiA3MDRxMCAxODUgLTEzMS41IDMxNi41dC0zMTYuNSAxMzEuNXQtMzE2LjUgLTEzMS41dC0xMzEuNSAtMzE2LjV0MTMxLjUgLTMxNi41dDMxNi41IC0xMzEuNXQzMTYuNSAxMzEuNXQxMzEuNSAzMTYuNXogTTE2NjQgLTEyOHEwIC01MyAtMzcuNSAtOTAuNXQtOTAuNSAtMzcuNXEtNTQgMCAtOTAgMzhsLTM0MyAzNDJxLTE3OSAtMTI0IC0zOTkgLTEyNHEtMTQzIDAgLTI3My41IDU1LjV0LTIyNSAxNTB0LTE1MCAyMjV0LTU1LjUgMjczLjV0NTUuNSAyNzMuNXQxNTAgMjI1dDIyNSAxNTB0MjczLjUgNTUuNXQyNzMuNSAtNTUuNXQyMjUgLTE1MHQxNTAgLTIyNXQ1NS41IC0yNzMuNXEwIC0yMjAgLTEyNCAtMzk5bDM0MyAtMzQzcTM3IC0zNyAzNyAtOTB6ICIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDExOyIgZD0iTTE1MzYgNjQwcTAgLTE1NiAtNjEgLTI5OHQtMTY0IC0yNDV0LTI0NSAtMTY0dC0yOTggLTYxdC0yOTggNjF0LTI0NSAxNjR0LTE2NCAyNDV0LTYxIDI5OHEwIDE4MiA4MC41IDM0M3QyMjYuNSAyNzBxNDMgMzIgOTUuNSAyNXQ4My41IC01MHEzMiAtNDIgMjQuNSAtOTQuNXQtNDkuNSAtODQuNXEtOTggLTc0IC0xNTEuNSAtMTgxdC01My41IC0yMjhxMCAtMTA0IDQwLjUgLTE5OC41dDEwOS41IC0xNjMuNXQxNjMuNSAtMTA5LjUgdDE5OC41IC00MC41dDE5OC41IDQwLjV0MTYzLjUgMTA5LjV0MTA5LjUgMTYzLjV0NDAuNSAxOTguNXEwIDEyMSAtNTMuNSAyMjh0LTE1MS41IDE4MXEtNDIgMzIgLTQ5LjUgODQuNXQyNC41IDk0LjVxMzEgNDMgODQgNTB0OTUgLTI1cTE0NiAtMTA5IDIyNi41IC0yNzB0ODAuNSAtMzQzek04OTYgMTQwOHYtNjQwcTAgLTUyIC0zOCAtOTB0LTkwIC0zOHQtOTAgMzh0LTM4IDkwdjY0MHEwIDUyIDM4IDkwdDkwIDM4dDkwIC0zOHQzOCAtOTB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwMTI7IiBob3Jpei1hZHYteD0iMTc5MiIgZD0iTTI1NiA5NnYtMTkycTAgLTE0IC05IC0yM3QtMjMgLTloLTE5MnEtMTQgMCAtMjMgOXQtOSAyM3YxOTJxMCAxNCA5IDIzdDIzIDloMTkycTE0IDAgMjMgLTl0OSAtMjN6TTY0MCAyMjR2LTMyMHEwIC0xNCAtOSAtMjN0LTIzIC05aC0xOTJxLTE0IDAgLTIzIDl0LTkgMjN2MzIwcTAgMTQgOSAyM3QyMyA5aDE5MnExNCAwIDIzIC05dDkgLTIzek0xMDI0IDQ4MHYtNTc2cTAgLTE0IC05IC0yM3QtMjMgLTloLTE5MnEtMTQgMCAtMjMgOXQtOSAyMyB2NTc2cTAgMTQgOSAyM3QyMyA5aDE5MnExNCAwIDIzIC05dDkgLTIzek0xNDA4IDg2NHYtOTYwcTAgLTE0IC05IC0yM3QtMjMgLTloLTE5MnEtMTQgMCAtMjMgOXQtOSAyM3Y5NjBxMCAxNCA5IDIzdDIzIDloMTkycTE0IDAgMjMgLTl0OSAtMjN6TTE3OTIgMTM3NnYtMTQ3MnEwIC0xNCAtOSAtMjN0LTIzIC05aC0xOTJxLTE0IDAgLTIzIDl0LTkgMjN2MTQ3MnEwIDE0IDkgMjN0MjMgOWgxOTJxMTQgMCAyMyAtOXQ5IC0yM3oiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjAxMzsiIGQ9Ik0xMDI0IDY0MHEwIDEwNiAtNzUgMTgxdC0xODEgNzV0LTE4MSAtNzV0LTc1IC0xODF0NzUgLTE4MXQxODEgLTc1dDE4MSA3NXQ3NSAxODF6TTE1MzYgNzQ5di0yMjJxMCAtMTIgLTggLTIzdC0yMCAtMTNsLTE4NSAtMjhxLTE5IC01NCAtMzkgLTkxcTM1IC01MCAxMDcgLTEzOHExMCAtMTIgMTAgLTI1dC05IC0yM3EtMjcgLTM3IC05OSAtMTA4dC05NCAtNzFxLTEyIDAgLTI2IDlsLTEzOCAxMDhxLTQ0IC0yMyAtOTEgLTM4IHEtMTYgLTEzNiAtMjkgLTE4NnEtNyAtMjggLTM2IC0yOGgtMjIycS0xNCAwIC0yNC41IDguNXQtMTEuNSAyMS41bC0yOCAxODRxLTQ5IDE2IC05MCAzN2wtMTQxIC0xMDdxLTEwIC05IC0yNSAtOXEtMTQgMCAtMjUgMTFxLTEyNiAxMTQgLTE2NSAxNjhxLTcgMTAgLTcgMjNxMCAxMiA4IDIzcTE1IDIxIDUxIDY2LjV0NTQgNzAuNXEtMjcgNTAgLTQxIDk5bC0xODMgMjdxLTEzIDIgLTIxIDEyLjV0LTggMjMuNXYyMjJxMCAxMiA4IDIzdDE5IDEzIGwxODYgMjhxMTQgNDYgMzkgOTJxLTQwIDU3IC0xMDcgMTM4cS0xMCAxMiAtMTAgMjRxMCAxMCA5IDIzcTI2IDM2IDk4LjUgMTA3LjV0OTQuNSA3MS41cTEzIDAgMjYgLTEwbDEzOCAtMTA3cTQ0IDIzIDkxIDM4cTE2IDEzNiAyOSAxODZxNyAyOCAzNiAyOGgyMjJxMTQgMCAyNC41IC04LjV0MTEuNSAtMjEuNWwyOCAtMTg0cTQ5IC0xNiA5MCAtMzdsMTQyIDEwN3E5IDkgMjQgOXExMyAwIDI1IC0xMHExMjkgLTExOSAxNjUgLTE3MHE3IC04IDcgLTIyIHEwIC0xMiAtOCAtMjNxLTE1IC0yMSAtNTEgLTY2LjV0LTU0IC03MC41cTI2IC01MCA0MSAtOThsMTgzIC0yOHExMyAtMiAyMSAtMTIuNXQ4IC0yMy41eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDE0OyIgaG9yaXotYWR2LXg9IjE0MDgiIGQ9Ik01MTIgODAwdi01NzZxMCAtMTQgLTkgLTIzdC0yMyAtOWgtNjRxLTE0IDAgLTIzIDl0LTkgMjN2NTc2cTAgMTQgOSAyM3QyMyA5aDY0cTE0IDAgMjMgLTl0OSAtMjN6TTc2OCA4MDB2LTU3NnEwIC0xNCAtOSAtMjN0LTIzIC05aC02NHEtMTQgMCAtMjMgOXQtOSAyM3Y1NzZxMCAxNCA5IDIzdDIzIDloNjRxMTQgMCAyMyAtOXQ5IC0yM3pNMTAyNCA4MDB2LTU3NnEwIC0xNCAtOSAtMjN0LTIzIC05aC02NHEtMTQgMCAtMjMgOXQtOSAyM3Y1NzYgcTAgMTQgOSAyM3QyMyA5aDY0cTE0IDAgMjMgLTl0OSAtMjN6TTExNTIgNzZ2OTQ4aC04OTZ2LTk0OHEwIC0yMiA3IC00MC41dDE0LjUgLTI3dDEwLjUgLTguNWg4MzJxMyAwIDEwLjUgOC41dDE0LjUgMjd0NyA0MC41ek00ODAgMTE1Mmg0NDhsLTQ4IDExN3EtNyA5IC0xNyAxMWgtMzE3cS0xMCAtMiAtMTcgLTExek0xNDA4IDExMjB2LTY0cTAgLTE0IC05IC0yM3QtMjMgLTloLTk2di05NDhxMCAtODMgLTQ3IC0xNDMuNXQtMTEzIC02MC41aC04MzIgcS02NiAwIC0xMTMgNTguNXQtNDcgMTQxLjV2OTUyaC05NnEtMTQgMCAtMjMgOXQtOSAyM3Y2NHEwIDE0IDkgMjN0MjMgOWgzMDlsNzAgMTY3cTE1IDM3IDU0IDYzdDc5IDI2aDMyMHE0MCAwIDc5IC0yNnQ1NCAtNjNsNzAgLTE2N2gzMDlxMTQgMCAyMyAtOXQ5IC0yM3oiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjAxNTsiIGhvcml6LWFkdi14PSIxNjY0IiBkPSJNMTQwOCA1NDR2LTQ4MHEwIC0yNiAtMTkgLTQ1dC00NSAtMTloLTM4NHYzODRoLTI1NnYtMzg0aC0zODRxLTI2IDAgLTQ1IDE5dC0xOSA0NXY0ODBxMCAxIDAuNSAzdDAuNSAzbDU3NSA0NzRsNTc1IC00NzRxMSAtMiAxIC02ek0xNjMxIDYxM2wtNjIgLTc0cS04IC05IC0yMSAtMTFoLTNxLTEzIDAgLTIxIDdsLTY5MiA1NzdsLTY5MiAtNTc3cS0xMiAtOCAtMjQgLTdxLTEzIDIgLTIxIDExbC02MiA3NHEtOCAxMCAtNyAyMy41dDExIDIxLjUgbDcxOSA1OTlxMzIgMjYgNzYgMjZ0NzYgLTI2bDI0NCAtMjA0djE5NXEwIDE0IDkgMjN0MjMgOWgxOTJxMTQgMCAyMyAtOXQ5IC0yM3YtNDA4bDIxOSAtMTgycTEwIC04IDExIC0yMS41dC03IC0yMy41eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDE2OyIgaG9yaXotYWR2LXg9IjEyODAiIGQ9Ik0xMjggMGgxMDI0djc2OGgtNDE2cS00MCAwIC02OCAyOHQtMjggNjh2NDE2aC01MTJ2LTEyODB6TTc2OCA4OTZoMjk5bC0yOTkgMjk5di0yOTl6TTEyODAgNzY4di04MDBxMCAtNDAgLTI4IC02OHQtNjggLTI4aC0xMDg4cS00MCAwIC02OCAyOHQtMjggNjh2MTM0NHEwIDQwIDI4IDY4dDY4IDI4aDU0NHE0MCAwIDg4IC0yMHQ3NiAtNDhsNDA4IC00MDhxMjggLTI4IDQ4IC03NnQyMCAtODh6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwMTc7IiBkPSJNMTA4OCA2MDh2LTY0cTAgLTEzIC05LjUgLTIyLjV0LTIyLjUgLTkuNWgtMzg0cS0xMyAwIC0yMi41IDkuNXQtOS41IDIyLjV2NDQ4cTAgMTMgOS41IDIyLjV0MjIuNSA5LjVoNjRxMTMgMCAyMi41IC05LjV0OS41IC0yMi41di0zNTJoMjg4cTEzIDAgMjIuNSAtOS41dDkuNSAtMjIuNXpNMTI4MCA2NDBxMCAxMDQgLTQwLjUgMTk4LjV0LTEwOS41IDE2My41dC0xNjMuNSAxMDkuNXQtMTk4LjUgNDAuNXQtMTk4LjUgLTQwLjUgdC0xNjMuNSAtMTA5LjV0LTEwOS41IC0xNjMuNXQtNDAuNSAtMTk4LjV0NDAuNSAtMTk4LjV0MTA5LjUgLTE2My41dDE2My41IC0xMDkuNXQxOTguNSAtNDAuNXQxOTguNSA0MC41dDE2My41IDEwOS41dDEwOS41IDE2My41dDQwLjUgMTk4LjV6TTE1MzYgNjQwcTAgLTIwOSAtMTAzIC0zODUuNXQtMjc5LjUgLTI3OS41dC0zODUuNSAtMTAzdC0zODUuNSAxMDN0LTI3OS41IDI3OS41dC0xMDMgMzg1LjV0MTAzIDM4NS41dDI3OS41IDI3OS41IHQzODUuNSAxMDN0Mzg1LjUgLTEwM3QyNzkuNSAtMjc5LjV0MTAzIC0zODUuNXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjAxODsiIGhvcml6LWFkdi14PSIxOTIwIiBkPSJNMTExMSA1NDB2NGwtMjQgMzIwcS0xIDEzIC0xMSAyMi41dC0yMyA5LjVoLTE4NnEtMTMgMCAtMjMgLTkuNXQtMTEgLTIyLjVsLTI0IC0zMjB2LTRxLTEgLTEyIDggLTIwdDIxIC04aDI0NHExMiAwIDIxIDh0OCAyMHpNMTg3MCA3M3EwIC03MyAtNDYgLTczaC03MDRxMTMgMCAyMiA5LjV0OCAyMi41bC0yMCAyNTZxLTEgMTMgLTExIDIyLjV0LTIzIDkuNWgtMjcycS0xMyAwIC0yMyAtOS41dC0xMSAtMjIuNWwtMjAgLTI1NiBxLTEgLTEzIDggLTIyLjV0MjIgLTkuNWgtNzA0cS00NiAwIC00NiA3M3EwIDU0IDI2IDExNmw0MTcgMTA0NHE4IDE5IDI2IDMzdDM4IDE0aDMzOXEtMTMgMCAtMjMgLTkuNXQtMTEgLTIyLjVsLTE1IC0xOTJxLTEgLTE0IDggLTIzdDIyIC05aDE2NnExMyAwIDIyIDl0OCAyM2wtMTUgMTkycS0xIDEzIC0xMSAyMi41dC0yMyA5LjVoMzM5cTIwIDAgMzggLTE0dDI2IC0zM2w0MTcgLTEwNDRxMjYgLTYyIDI2IC0xMTZ6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwMTk7IiBob3Jpei1hZHYteD0iMTY2NCIgZD0iTTEzMzkgNzI5cTE3IC00MSAtMTQgLTcwbC00NDggLTQ0OHEtMTggLTE5IC00NSAtMTl0LTQ1IDE5bC00NDggNDQ4cS0zMSAyOSAtMTQgNzBxMTcgMzkgNTkgMzloMjU2djQ0OHEwIDI2IDE5IDQ1dDQ1IDE5aDI1NnEyNiAwIDQ1IC0xOXQxOSAtNDV2LTQ0OGgyNTZxNDIgMCA1OSAtMzl6TTE2MzIgNTEycTE0IDAgMjMgLTl0OSAtMjN2LTU3NnEwIC0xNCAtOSAtMjN0LTIzIC05aC0xNjAwcS0xNCAwIC0yMyA5dC05IDIzdjU3NnEwIDE0IDkgMjMgdDIzIDloMTkycTE0IDAgMjMgLTl0OSAtMjN2LTM1MmgxMTUydjM1MnEwIDE0IDkgMjN0MjMgOWgxOTJ6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwMWE7IiBkPSJNMTEyMCA2MDhxMCAtMTIgLTEwIC0yNGwtMzE5IC0zMTlxLTkgLTkgLTIzIC05dC0yMyA5bC0zMjAgMzIwcS05IDkgLTkgMjNxMCAxMyA5LjUgMjIuNXQyMi41IDkuNWgxOTJ2MzUycTAgMTMgOS41IDIyLjV0MjIuNSA5LjVoMTkycTEzIDAgMjIuNSAtOS41dDkuNSAtMjIuNXYtMzUyaDE5MnExNCAwIDIzIC05dDkgLTIzek0xMjgwIDY0MHEwIDEwNCAtNDAuNSAxOTguNXQtMTA5LjUgMTYzLjV0LTE2My41IDEwOS41dC0xOTguNSA0MC41IHQtMTk4LjUgLTQwLjV0LTE2My41IC0xMDkuNXQtMTA5LjUgLTE2My41dC00MC41IC0xOTguNXQ0MC41IC0xOTguNXQxMDkuNSAtMTYzLjV0MTYzLjUgLTEwOS41dDE5OC41IC00MC41dDE5OC41IDQwLjV0MTYzLjUgMTA5LjV0MTA5LjUgMTYzLjV0NDAuNSAxOTguNXpNMTUzNiA2NDBxMCAtMjA5IC0xMDMgLTM4NS41dC0yNzkuNSAtMjc5LjV0LTM4NS41IC0xMDN0LTM4NS41IDEwM3QtMjc5LjUgMjc5LjV0LTEwMyAzODUuNXQxMDMgMzg1LjUgdDI3OS41IDI3OS41dDM4NS41IDEwM3QzODUuNSAtMTAzdDI3OS41IC0yNzkuNXQxMDMgLTM4NS41eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDFiOyIgZD0iTTExMjAgNjcycTAgLTEzIC05LjUgLTIyLjV0LTIyLjUgLTkuNWgtMTkydi0zNTJxMCAtMTMgLTkuNSAtMjIuNXQtMjIuNSAtOS41aC0xOTJxLTEzIDAgLTIyLjUgOS41dC05LjUgMjIuNXYzNTJoLTE5MnEtMTQgMCAtMjMgOXQtOSAyM3EwIDEyIDEwIDI0bDMxOSAzMTlxOSA5IDIzIDl0MjMgLTlsMzIwIC0zMjBxOSAtOSA5IC0yM3pNMTI4MCA2NDBxMCAxMDQgLTQwLjUgMTk4LjV0LTEwOS41IDE2My41dC0xNjMuNSAxMDkuNSB0LTE5OC41IDQwLjV0LTE5OC41IC00MC41dC0xNjMuNSAtMTA5LjV0LTEwOS41IC0xNjMuNXQtNDAuNSAtMTk4LjV0NDAuNSAtMTk4LjV0MTA5LjUgLTE2My41dDE2My41IC0xMDkuNXQxOTguNSAtNDAuNXQxOTguNSA0MC41dDE2My41IDEwOS41dDEwOS41IDE2My41dDQwLjUgMTk4LjV6TTE1MzYgNjQwcTAgLTIwOSAtMTAzIC0zODUuNXQtMjc5LjUgLTI3OS41dC0zODUuNSAtMTAzdC0zODUuNSAxMDN0LTI3OS41IDI3OS41dC0xMDMgMzg1LjUgdDEwMyAzODUuNXQyNzkuNSAyNzkuNXQzODUuNSAxMDN0Mzg1LjUgLTEwM3QyNzkuNSAtMjc5LjV0MTAzIC0zODUuNXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjAxYzsiIGQ9Ik0xMDIzIDU3NmgzMTZxLTEgMyAtMi41IDh0LTIuNSA4bC0yMTIgNDk2aC03MDhsLTIxMiAtNDk2cS0xIC0yIC0yLjUgLTh0LTIuNSAtOGgzMTZsOTUgLTE5MmgzMjB6TTE1MzYgNTQ2di00ODJxMCAtMjYgLTE5IC00NXQtNDUgLTE5aC0xNDA4cS0yNiAwIC00NSAxOXQtMTkgNDV2NDgycTAgNjIgMjUgMTIzbDIzOCA1NTJxMTAgMjUgMzYuNSA0MnQ1Mi41IDE3aDgzMnEyNiAwIDUyLjUgLTE3dDM2LjUgLTQybDIzOCAtNTUyIHEyNSAtNjEgMjUgLTEyM3oiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjAxZDsiIGQ9Ik0xMTUyIDY0MHEwIC0zNyAtMzMgLTU2bC01MTIgLTI4OHEtMTQgLTggLTMxIC04dC0zMiA5cS0zMiAxOCAtMzIgNTV2NTc2cTAgMzcgMzIgNTVxMzEgMjAgNjMgMWw1MTIgLTI4OHEzMyAtMTkgMzMgLTU2ek0xMjgwIDY0MHEwIDEwNCAtNDAuNSAxOTguNXQtMTA5LjUgMTYzLjV0LTE2My41IDEwOS41dC0xOTguNSA0MC41dC0xOTguNSAtNDAuNXQtMTYzLjUgLTEwOS41dC0xMDkuNSAtMTYzLjV0LTQwLjUgLTE5OC41dDQwLjUgLTE5OC41IHQxMDkuNSAtMTYzLjV0MTYzLjUgLTEwOS41dDE5OC41IC00MC41dDE5OC41IDQwLjV0MTYzLjUgMTA5LjV0MTA5LjUgMTYzLjV0NDAuNSAxOTguNXpNMTUzNiA2NDBxMCAtMjA5IC0xMDMgLTM4NS41dC0yNzkuNSAtMjc5LjV0LTM4NS41IC0xMDN0LTM4NS41IDEwM3QtMjc5LjUgMjc5LjV0LTEwMyAzODUuNXQxMDMgMzg1LjV0Mjc5LjUgMjc5LjV0Mzg1LjUgMTAzdDM4NS41IC0xMDN0Mjc5LjUgLTI3OS41dDEwMyAtMzg1LjV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwMWU7IiBkPSJNMTUzNiAxMjgwdi00NDhxMCAtMjYgLTE5IC00NXQtNDUgLTE5aC00NDhxLTQyIDAgLTU5IDQwcS0xNyAzOSAxNCA2OWwxMzggMTM4cS0xNDggMTM3IC0zNDkgMTM3cS0xMDQgMCAtMTk4LjUgLTQwLjV0LTE2My41IC0xMDkuNXQtMTA5LjUgLTE2My41dC00MC41IC0xOTguNXQ0MC41IC0xOTguNXQxMDkuNSAtMTYzLjV0MTYzLjUgLTEwOS41dDE5OC41IC00MC41cTE2OSAwIDMwNCA5OS41dDE4NSAyNjEuNXE3IDIzIDMwIDIzaDE5OSBxMTYgMCAyNSAtMTJxMTAgLTEzIDcgLTI3cS0zOSAtMTc1IC0xNDcuNSAtMzEydC0yNjYgLTIxM3QtMzM2LjUgLTc2cS0xNTYgMCAtMjk4IDYxdC0yNDUgMTY0dC0xNjQgMjQ1dC02MSAyOTh0NjEgMjk4dDE2NCAyNDV0MjQ1IDE2NHQyOTggNjFxMTQ3IDAgMjg0LjUgLTU1LjV0MjQ0LjUgLTE1Ni41bDEzMCAxMjlxMjkgMzEgNzAgMTRxMzkgLTE3IDM5IC01OXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjAyMTsiIGQ9Ik0xNTExIDQ4MHEwIC01IC0xIC03cS02NCAtMjY4IC0yNjggLTQzNC41dC00NzggLTE2Ni41cS0xNDYgMCAtMjgyLjUgNTV0LTI0My41IDE1N2wtMTI5IC0xMjlxLTE5IC0xOSAtNDUgLTE5dC00NSAxOXQtMTkgNDV2NDQ4cTAgMjYgMTkgNDV0NDUgMTloNDQ4cTI2IDAgNDUgLTE5dDE5IC00NXQtMTkgLTQ1bC0xMzcgLTEzN3E3MSAtNjYgMTYxIC0xMDJ0MTg3IC0zNnExMzQgMCAyNTAgNjV0MTg2IDE3OXExMSAxNyA1MyAxMTcgcTggMjMgMzAgMjNoMTkycTEzIDAgMjIuNSAtOS41dDkuNSAtMjIuNXpNMTUzNiAxMjgwdi00NDhxMCAtMjYgLTE5IC00NXQtNDUgLTE5aC00NDhxLTI2IDAgLTQ1IDE5dC0xOSA0NXQxOSA0NWwxMzggMTM4cS0xNDggMTM3IC0zNDkgMTM3cS0xMzQgMCAtMjUwIC02NXQtMTg2IC0xNzlxLTExIC0xNyAtNTMgLTExN3EtOCAtMjMgLTMwIC0yM2gtMTk5cS0xMyAwIC0yMi41IDkuNXQtOS41IDIyLjV2N3E2NSAyNjggMjcwIDQzNC41dDQ4MCAxNjYuNSBxMTQ2IDAgMjg0IC01NS41dDI0NSAtMTU2LjVsMTMwIDEyOXExOSAxOSA0NSAxOXQ0NSAtMTl0MTkgLTQ1eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDIyOyIgaG9yaXotYWR2LXg9IjE3OTIiIGQ9Ik0zODQgMzUydi02NHEwIC0xMyAtOS41IC0yMi41dC0yMi41IC05LjVoLTY0cS0xMyAwIC0yMi41IDkuNXQtOS41IDIyLjV2NjRxMCAxMyA5LjUgMjIuNXQyMi41IDkuNWg2NHExMyAwIDIyLjUgLTkuNXQ5LjUgLTIyLjV6TTM4NCA2MDh2LTY0cTAgLTEzIC05LjUgLTIyLjV0LTIyLjUgLTkuNWgtNjRxLTEzIDAgLTIyLjUgOS41dC05LjUgMjIuNXY2NHEwIDEzIDkuNSAyMi41dDIyLjUgOS41aDY0cTEzIDAgMjIuNSAtOS41dDkuNSAtMjIuNXogTTM4NCA4NjR2LTY0cTAgLTEzIC05LjUgLTIyLjV0LTIyLjUgLTkuNWgtNjRxLTEzIDAgLTIyLjUgOS41dC05LjUgMjIuNXY2NHEwIDEzIDkuNSAyMi41dDIyLjUgOS41aDY0cTEzIDAgMjIuNSAtOS41dDkuNSAtMjIuNXpNMTUzNiAzNTJ2LTY0cTAgLTEzIC05LjUgLTIyLjV0LTIyLjUgLTkuNWgtOTYwcS0xMyAwIC0yMi41IDkuNXQtOS41IDIyLjV2NjRxMCAxMyA5LjUgMjIuNXQyMi41IDkuNWg5NjBxMTMgMCAyMi41IC05LjV0OS41IC0yMi41eiBNMTUzNiA2MDh2LTY0cTAgLTEzIC05LjUgLTIyLjV0LTIyLjUgLTkuNWgtOTYwcS0xMyAwIC0yMi41IDkuNXQtOS41IDIyLjV2NjRxMCAxMyA5LjUgMjIuNXQyMi41IDkuNWg5NjBxMTMgMCAyMi41IC05LjV0OS41IC0yMi41ek0xNTM2IDg2NHYtNjRxMCAtMTMgLTkuNSAtMjIuNXQtMjIuNSAtOS41aC05NjBxLTEzIDAgLTIyLjUgOS41dC05LjUgMjIuNXY2NHEwIDEzIDkuNSAyMi41dDIyLjUgOS41aDk2MHExMyAwIDIyLjUgLTkuNSB0OS41IC0yMi41ek0xNjY0IDE2MHY4MzJxMCAxMyAtOS41IDIyLjV0LTIyLjUgOS41aC0xNDcycS0xMyAwIC0yMi41IC05LjV0LTkuNSAtMjIuNXYtODMycTAgLTEzIDkuNSAtMjIuNXQyMi41IC05LjVoMTQ3MnExMyAwIDIyLjUgOS41dDkuNSAyMi41ek0xNzkyIDEyNDh2LTEwODhxMCAtNjYgLTQ3IC0xMTN0LTExMyAtNDdoLTE0NzJxLTY2IDAgLTExMyA0N3QtNDcgMTEzdjEwODhxMCA2NiA0NyAxMTN0MTEzIDQ3aDE0NzJxNjYgMCAxMTMgLTQ3IHQ0NyAtMTEzeiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDIzOyIgaG9yaXotYWR2LXg9IjExNTIiIGQ9Ik03MDQgNTEycTAgNTMgLTM3LjUgOTAuNXQtOTAuNSAzNy41dC05MC41IC0zNy41dC0zNy41IC05MC41cTAgLTM3IDE5IC02N3Q1MSAtNDdsLTY5IC0yMjlxLTUgLTE1IDUgLTI4dDI2IC0xM2gxOTJxMTYgMCAyNiAxM3Q1IDI4bC02OSAyMjlxMzIgMTcgNTEgNDd0MTkgNjd6TTMyMCA3NjhoNTEydjE5MnEwIDEwNiAtNzUgMTgxdC0xODEgNzV0LTE4MSAtNzV0LTc1IC0xODF2LTE5MnpNMTE1MiA2NzJ2LTU3NnEwIC00MCAtMjggLTY4IHQtNjggLTI4aC05NjBxLTQwIDAgLTY4IDI4dC0yOCA2OHY1NzZxMCA0MCAyOCA2OHQ2OCAyOGgzMnYxOTJxMCAxODQgMTMyIDMxNnQzMTYgMTMydDMxNiAtMTMydDEzMiAtMzE2di0xOTJoMzJxNDAgMCA2OCAtMjh0MjggLTY4eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDI0OyIgaG9yaXotYWR2LXg9IjE3OTIiIGQ9Ik0zMjAgMTI4MHEwIC03MiAtNjQgLTExMHYtMTI2NnEwIC0xMyAtOS41IC0yMi41dC0yMi41IC05LjVoLTY0cS0xMyAwIC0yMi41IDkuNXQtOS41IDIyLjV2MTI2NnEtNjQgMzggLTY0IDExMHEwIDUzIDM3LjUgOTAuNXQ5MC41IDM3LjV0OTAuNSAtMzcuNXQzNy41IC05MC41ek0xNzkyIDEyMTZ2LTc2M3EwIC0yNSAtMTIuNSAtMzguNXQtMzkuNSAtMjcuNXEtMjE1IC0xMTYgLTM2OSAtMTE2cS02MSAwIC0xMjMuNSAyMnQtMTA4LjUgNDggdC0xMTUuNSA0OHQtMTQyLjUgMjJxLTE5MiAwIC00NjQgLTE0NnEtMTcgLTkgLTMzIC05cS0yNiAwIC00NSAxOXQtMTkgNDV2NzQycTAgMzIgMzEgNTVxMjEgMTQgNzkgNDNxMjM2IDEyMCA0MjEgMTIwcTEwNyAwIDIwMCAtMjl0MjE5IC04OHEzOCAtMTkgODggLTE5cTU0IDAgMTE3LjUgMjF0MTEwIDQ3dDg4IDQ3dDU0LjUgMjFxMjYgMCA0NSAtMTl0MTkgLTQ1eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDI1OyIgaG9yaXotYWR2LXg9IjE2NjQiIGQ9Ik0xNjY0IDY1MHEwIC0xNjYgLTYwIC0zMTRsLTIwIC00OWwtMTg1IC0zM3EtMjIgLTgzIC05MC41IC0xMzYuNXQtMTU2LjUgLTUzLjV2LTMycTAgLTE0IC05IC0yM3QtMjMgLTloLTY0cS0xNCAwIC0yMyA5dC05IDIzdjU3NnEwIDE0IDkgMjN0MjMgOWg2NHExNCAwIDIzIC05dDkgLTIzdi0zMnE3MSAwIDEzMCAtMzUuNXQ5MyAtOTUuNWw2OCAxMnEyOSA5NSAyOSAxOTNxMCAxNDggLTg4IDI3OXQtMjM2LjUgMjA5dC0zMTUuNSA3OCB0LTMxNS41IC03OHQtMjM2LjUgLTIwOXQtODggLTI3OXEwIC05OCAyOSAtMTkzbDY4IC0xMnEzNCA2MCA5MyA5NS41dDEzMCAzNS41djMycTAgMTQgOSAyM3QyMyA5aDY0cTE0IDAgMjMgLTl0OSAtMjN2LTU3NnEwIC0xNCAtOSAtMjN0LTIzIC05aC02NHEtMTQgMCAtMjMgOXQtOSAyM3YzMnEtODggMCAtMTU2LjUgNTMuNXQtOTAuNSAxMzYuNWwtMTg1IDMzbC0yMCA0OXEtNjAgMTQ4IC02MCAzMTRxMCAxNTEgNjcgMjkxdDE3OSAyNDIuNSB0MjY2IDE2My41dDMyMCA2MXQzMjAgLTYxdDI2NiAtMTYzLjV0MTc5IC0yNDIuNXQ2NyAtMjkxeiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDI2OyIgaG9yaXotYWR2LXg9Ijc2OCIgZD0iTTc2OCAxMTg0di0xMDg4cTAgLTI2IC0xOSAtNDV0LTQ1IC0xOXQtNDUgMTlsLTMzMyAzMzNoLTI2MnEtMjYgMCAtNDUgMTl0LTE5IDQ1djM4NHEwIDI2IDE5IDQ1dDQ1IDE5aDI2MmwzMzMgMzMzcTE5IDE5IDQ1IDE5dDQ1IC0xOXQxOSAtNDV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwMjc7IiBob3Jpei1hZHYteD0iMTE1MiIgZD0iTTc2OCAxMTg0di0xMDg4cTAgLTI2IC0xOSAtNDV0LTQ1IC0xOXQtNDUgMTlsLTMzMyAzMzNoLTI2MnEtMjYgMCAtNDUgMTl0LTE5IDQ1djM4NHEwIDI2IDE5IDQ1dDQ1IDE5aDI2MmwzMzMgMzMzcTE5IDE5IDQ1IDE5dDQ1IC0xOXQxOSAtNDV6TTExNTIgNjQwcTAgLTc2IC00Mi41IC0xNDEuNXQtMTEyLjUgLTkzLjVxLTEwIC01IC0yNSAtNXEtMjYgMCAtNDUgMTguNXQtMTkgNDUuNXEwIDIxIDEyIDM1LjV0MjkgMjV0MzQgMjN0MjkgMzUuNSB0MTIgNTd0LTEyIDU3dC0yOSAzNS41dC0zNCAyM3QtMjkgMjV0LTEyIDM1LjVxMCAyNyAxOSA0NS41dDQ1IDE4LjVxMTUgMCAyNSAtNXE3MCAtMjcgMTEyLjUgLTkzdDQyLjUgLTE0MnoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjAyODsiIGhvcml6LWFkdi14PSIxNjY0IiBkPSJNNzY4IDExODR2LTEwODhxMCAtMjYgLTE5IC00NXQtNDUgLTE5dC00NSAxOWwtMzMzIDMzM2gtMjYycS0yNiAwIC00NSAxOXQtMTkgNDV2Mzg0cTAgMjYgMTkgNDV0NDUgMTloMjYybDMzMyAzMzNxMTkgMTkgNDUgMTl0NDUgLTE5dDE5IC00NXpNMTE1MiA2NDBxMCAtNzYgLTQyLjUgLTE0MS41dC0xMTIuNSAtOTMuNXEtMTAgLTUgLTI1IC01cS0yNiAwIC00NSAxOC41dC0xOSA0NS41cTAgMjEgMTIgMzUuNXQyOSAyNXQzNCAyM3QyOSAzNS41IHQxMiA1N3QtMTIgNTd0LTI5IDM1LjV0LTM0IDIzdC0yOSAyNXQtMTIgMzUuNXEwIDI3IDE5IDQ1LjV0NDUgMTguNXExNSAwIDI1IC01cTcwIC0yNyAxMTIuNSAtOTN0NDIuNSAtMTQyek0xNDA4IDY0MHEwIC0xNTMgLTg1IC0yODIuNXQtMjI1IC0xODguNXEtMTMgLTUgLTI1IC01cS0yNyAwIC00NiAxOXQtMTkgNDVxMCAzOSAzOSA1OXE1NiAyOSA3NiA0NHE3NCA1NCAxMTUuNSAxMzUuNXQ0MS41IDE3My41dC00MS41IDE3My41IHQtMTE1LjUgMTM1LjVxLTIwIDE1IC03NiA0NHEtMzkgMjAgLTM5IDU5cTAgMjYgMTkgNDV0NDUgMTlxMTMgMCAyNiAtNXExNDAgLTU5IDIyNSAtMTg4LjV0ODUgLTI4Mi41ek0xNjY0IDY0MHEwIC0yMzAgLTEyNyAtNDIyLjV0LTMzOCAtMjgzLjVxLTEzIC01IC0yNiAtNXEtMjYgMCAtNDUgMTl0LTE5IDQ1cTAgMzYgMzkgNTlxNyA0IDIyLjUgMTAuNXQyMi41IDEwLjVxNDYgMjUgODIgNTFxMTIzIDkxIDE5MiAyMjd0NjkgMjg5dC02OSAyODkgdC0xOTIgMjI3cS0zNiAyNiAtODIgNTFxLTcgNCAtMjIuNSAxMC41dC0yMi41IDEwLjVxLTM5IDIzIC0zOSA1OXEwIDI2IDE5IDQ1dDQ1IDE5cTEzIDAgMjYgLTVxMjExIC05MSAzMzggLTI4My41dDEyNyAtNDIyLjV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwMjk7IiBob3Jpei1hZHYteD0iMTQwOCIgZD0iTTM4NCAzODR2LTEyOGgtMTI4djEyOGgxMjh6TTM4NCAxMTUydi0xMjhoLTEyOHYxMjhoMTI4ek0xMTUyIDExNTJ2LTEyOGgtMTI4djEyOGgxMjh6TTEyOCAxMjloMzg0djM4M2gtMzg0di0zODN6TTEyOCA4OTZoMzg0djM4NGgtMzg0di0zODR6TTg5NiA4OTZoMzg0djM4NGgtMzg0di0zODR6TTY0MCA2NDB2LTY0MGgtNjQwdjY0MGg2NDB6TTExNTIgMTI4di0xMjhoLTEyOHYxMjhoMTI4ek0xNDA4IDEyOHYtMTI4aC0xMjh2MTI4aDEyOHogTTE0MDggNjQwdi0zODRoLTM4NHYxMjhoLTEyOHYtMzg0aC0xMjh2NjQwaDM4NHYtMTI4aDEyOHYxMjhoMTI4ek02NDAgMTQwOHYtNjQwaC02NDB2NjQwaDY0MHpNMTQwOCAxNDA4di02NDBoLTY0MHY2NDBoNjQweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDJhOyIgaG9yaXotYWR2LXg9IjE3OTIiIGQ9Ik02NzIgMTQwOHYtMTUzNmgtNjR2MTUzNmg2NHpNMTQwOCAxNDA4di0xNTM2aC02NHYxNTM2aDY0ek0xNTY4IDE0MDh2LTE1MzZoLTY0djE1MzZoNjR6TTU3NiAxNDA4di0xNTM2aC02NHYxNTM2aDY0ek0xMjgwIDE0MDh2LTE1MzZoLTI1NnYxNTM2aDI1NnpNODk2IDE0MDh2LTE1MzZoLTEyOHYxNTM2aDEyOHpNNDQ4IDE0MDh2LTE1MzZoLTEyOHYxNTM2aDEyOHpNMTc5MiAxNDA4di0xNTM2aC0xMjh2MTUzNmgxMjh6TTI1NiAxNDA4di0xNTM2IGgtMjU2djE1MzZoMjU2eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDJiOyIgZD0iTTQ0OCAxMDg4cTAgNTMgLTM3LjUgOTAuNXQtOTAuNSAzNy41dC05MC41IC0zNy41dC0zNy41IC05MC41dDM3LjUgLTkwLjV0OTAuNSAtMzcuNXQ5MC41IDM3LjV0MzcuNSA5MC41ek0xNTE1IDUxMnEwIC01MyAtMzcgLTkwbC00OTEgLTQ5MnEtMzkgLTM3IC05MSAtMzdxLTUzIDAgLTkwIDM3bC03MTUgNzE2cS0zOCAzNyAtNjQuNSAxMDF0LTI2LjUgMTE3djQxNnEwIDUyIDM4IDkwdDkwIDM4aDQxNnE1MyAwIDExNyAtMjYuNXQxMDIgLTY0LjUgbDcxNSAtNzE0cTM3IC0zOSAzNyAtOTF6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwMmM7IiBob3Jpei1hZHYteD0iMTkyMCIgZD0iTTQ0OCAxMDg4cTAgNTMgLTM3LjUgOTAuNXQtOTAuNSAzNy41dC05MC41IC0zNy41dC0zNy41IC05MC41dDM3LjUgLTkwLjV0OTAuNSAtMzcuNXQ5MC41IDM3LjV0MzcuNSA5MC41ek0xNTE1IDUxMnEwIC01MyAtMzcgLTkwbC00OTEgLTQ5MnEtMzkgLTM3IC05MSAtMzdxLTUzIDAgLTkwIDM3bC03MTUgNzE2cS0zOCAzNyAtNjQuNSAxMDF0LTI2LjUgMTE3djQxNnEwIDUyIDM4IDkwdDkwIDM4aDQxNnE1MyAwIDExNyAtMjYuNXQxMDIgLTY0LjUgbDcxNSAtNzE0cTM3IC0zOSAzNyAtOTF6TTE4OTkgNTEycTAgLTUzIC0zNyAtOTBsLTQ5MSAtNDkycS0zOSAtMzcgLTkxIC0zN3EtMzYgMCAtNTkgMTR0LTUzIDQ1bDQ3MCA0NzBxMzcgMzcgMzcgOTBxMCA1MiAtMzcgOTFsLTcxNSA3MTRxLTM4IDM4IC0xMDIgNjQuNXQtMTE3IDI2LjVoMjI0cTUzIDAgMTE3IC0yNi41dDEwMiAtNjQuNWw3MTUgLTcxNHEzNyAtMzkgMzcgLTkxeiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDJkOyIgaG9yaXotYWR2LXg9IjE2NjQiIGQ9Ik0xNjM5IDEwNThxNDAgLTU3IDE4IC0xMjlsLTI3NSAtOTA2cS0xOSAtNjQgLTc2LjUgLTEwNy41dC0xMjIuNSAtNDMuNWgtOTIzcS03NyAwIC0xNDguNSA1My41dC05OS41IDEzMS41cS0yNCA2NyAtMiAxMjdxMCA0IDMgMjd0NCAzN3ExIDggLTMgMjEuNXQtMyAxOS41cTIgMTEgOCAyMXQxNi41IDIzLjV0MTYuNSAyMy41cTIzIDM4IDQ1IDkxLjV0MzAgOTEuNXEzIDEwIDAuNSAzMHQtMC41IDI4cTMgMTEgMTcgMjh0MTcgMjMgcTIxIDM2IDQyIDkydDI1IDkwcTEgOSAtMi41IDMydDAuNSAyOHE0IDEzIDIyIDMwLjV0MjIgMjIuNXExOSAyNiA0Mi41IDg0LjV0MjcuNSA5Ni41cTEgOCAtMyAyNS41dC0yIDI2LjVxMiA4IDkgMTh0MTggMjN0MTcgMjFxOCAxMiAxNi41IDMwLjV0MTUgMzV0MTYgMzZ0MTkuNSAzMnQyNi41IDIzLjV0MzYgMTEuNXQ0Ny41IC01LjVsLTEgLTNxMzggOSA1MSA5aDc2MXE3NCAwIDExNCAtNTZ0MTggLTEzMGwtMjc0IC05MDYgcS0zNiAtMTE5IC03MS41IC0xNTMuNXQtMTI4LjUgLTM0LjVoLTg2OXEtMjcgMCAtMzggLTE1cS0xMSAtMTYgLTEgLTQzcTI0IC03MCAxNDQgLTcwaDkyM3EyOSAwIDU2IDE1LjV0MzUgNDEuNWwzMDAgOTg3cTcgMjIgNSA1N3EzOCAtMTUgNTkgLTQzek01NzUgMTA1NnEtNCAtMTMgMiAtMjIuNXQyMCAtOS41aDYwOHExMyAwIDI1LjUgOS41dDE2LjUgMjIuNWwyMSA2NHE0IDEzIC0yIDIyLjV0LTIwIDkuNWgtNjA4cS0xMyAwIC0yNS41IC05LjUgdC0xNi41IC0yMi41ek00OTIgODAwcS00IC0xMyAyIC0yMi41dDIwIC05LjVoNjA4cTEzIDAgMjUuNSA5LjV0MTYuNSAyMi41bDIxIDY0cTQgMTMgLTIgMjIuNXQtMjAgOS41aC02MDhxLTEzIDAgLTI1LjUgLTkuNXQtMTYuNSAtMjIuNXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjAyZTsiIGhvcml6LWFkdi14PSIxMjgwIiBkPSJNMTE2NCAxNDA4cTIzIDAgNDQgLTlxMzMgLTEzIDUyLjUgLTQxdDE5LjUgLTYydi0xMjg5cTAgLTM0IC0xOS41IC02MnQtNTIuNSAtNDFxLTE5IC04IC00NCAtOHEtNDggMCAtODMgMzJsLTQ0MSA0MjRsLTQ0MSAtNDI0cS0zNiAtMzMgLTgzIC0zM3EtMjMgMCAtNDQgOXEtMzMgMTMgLTUyLjUgNDF0LTE5LjUgNjJ2MTI4OXEwIDM0IDE5LjUgNjJ0NTIuNSA0MXEyMSA5IDQ0IDloMTA0OHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjAyZjsiIGhvcml6LWFkdi14PSIxNjY0IiBkPSJNMzg0IDBoODk2djI1NmgtODk2di0yNTZ6TTM4NCA2NDBoODk2djM4NGgtMTYwcS00MCAwIC02OCAyOHQtMjggNjh2MTYwaC02NDB2LTY0MHpNMTUzNiA1NzZxMCAyNiAtMTkgNDV0LTQ1IDE5dC00NSAtMTl0LTE5IC00NXQxOSAtNDV0NDUgLTE5dDQ1IDE5dDE5IDQ1ek0xNjY0IDU3NnYtNDE2cTAgLTEzIC05LjUgLTIyLjV0LTIyLjUgLTkuNWgtMjI0di0xNjBxMCAtNDAgLTI4IC02OHQtNjggLTI4aC05NjBxLTQwIDAgLTY4IDI4dC0yOCA2OCB2MTYwaC0yMjRxLTEzIDAgLTIyLjUgOS41dC05LjUgMjIuNXY0MTZxMCA3OSA1Ni41IDEzNS41dDEzNS41IDU2LjVoNjR2NTQ0cTAgNDAgMjggNjh0NjggMjhoNjcycTQwIDAgODggLTIwdDc2IC00OGwxNTIgLTE1MnEyOCAtMjggNDggLTc2dDIwIC04OHYtMjU2aDY0cTc5IDAgMTM1LjUgLTU2LjV0NTYuNSAtMTM1LjV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwMzA7IiBob3Jpei1hZHYteD0iMTkyMCIgZD0iTTk2MCA4NjRxMTE5IDAgMjAzLjUgLTg0LjV0ODQuNSAtMjAzLjV0LTg0LjUgLTIwMy41dC0yMDMuNSAtODQuNXQtMjAzLjUgODQuNXQtODQuNSAyMDMuNXQ4NC41IDIwMy41dDIwMy41IDg0LjV6TTE2NjQgMTI4MHExMDYgMCAxODEgLTc1dDc1IC0xODF2LTg5NnEwIC0xMDYgLTc1IC0xODF0LTE4MSAtNzVoLTE0MDhxLTEwNiAwIC0xODEgNzV0LTc1IDE4MXY4OTZxMCAxMDYgNzUgMTgxdDE4MSA3NWgyMjRsNTEgMTM2IHExOSA0OSA2OS41IDg0LjV0MTAzLjUgMzUuNWg1MTJxNTMgMCAxMDMuNSAtMzUuNXQ2OS41IC04NC41bDUxIC0xMzZoMjI0ek05NjAgMTI4cTE4NSAwIDMxNi41IDEzMS41dDEzMS41IDMxNi41dC0xMzEuNSAzMTYuNXQtMzE2LjUgMTMxLjV0LTMxNi41IC0xMzEuNXQtMTMxLjUgLTMxNi41dDEzMS41IC0zMTYuNXQzMTYuNSAtMTMxLjV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwMzE7IiBob3Jpei1hZHYteD0iMTY2NCIgZD0iTTcyNSA5NzdsLTE3MCAtNDUwcTczIC0xIDE1My41IC0ydDExOSAtMS41dDUyLjUgLTAuNWwyOSAycS0zMiA5NSAtOTIgMjQxcS01MyAxMzIgLTkyIDIxMXpNMjEgLTEyOGgtMjFsMiA3OXEyMiA3IDgwIDE4cTg5IDE2IDExMCAzMXEyMCAxNiA0OCA2OGwyMzcgNjE2bDI4MCA3MjRoNzVoNTNsMTEgLTIxbDIwNSAtNDgwcTEwMyAtMjQyIDEyNCAtMjk3cTM5IC0xMDIgOTYgLTIzNXEyNiAtNTggNjUgLTE2NHEyNCAtNjcgNjUgLTE0OSBxMjIgLTQ5IDM1IC01N3EyMiAtMTkgNjkgLTIzcTQ3IC02IDEwMyAtMjdxNiAtMzkgNiAtNTdxMCAtMTQgLTEgLTI2cS04MCAwIC0xOTIgOHEtOTMgOCAtMTg5IDhxLTc5IDAgLTEzNSAtMmwtMjAwIC0xMWwtNTggLTJxMCA0NSA0IDc4bDEzMSAyOHE1NiAxMyA2OCAyM3ExMiAxMiAxMiAyN3QtNiAzMmwtNDcgMTE0bC05MiAyMjhsLTQ1MCAycS0yOSAtNjUgLTEwNCAtMjc0cS0yMyAtNjQgLTIzIC04NHEwIC0zMSAxNyAtNDMgcTI2IC0yMSAxMDMgLTMycTMgMCAxMy41IC0ydDMwIC01dDQwLjUgLTZxMSAtMjggMSAtNThxMCAtMTcgLTIgLTI3cS02NiAwIC0zNDkgMjBsLTQ4IC04cS04MSAtMTQgLTE2NyAtMTR6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwMzI7IiBob3Jpei1hZHYteD0iMTQwOCIgZD0iTTU1NSAxNXE3NiAtMzIgMTQwIC0zMnExMzEgMCAyMTYgNDF0MTIyIDExM3EzOCA3MCAzOCAxODFxMCAxMTQgLTQxIDE4MHEtNTggOTQgLTE0MSAxMjZxLTgwIDMyIC0yNDcgMzJxLTc0IDAgLTEwMSAtMTB2LTE0NGwtMSAtMTczbDMgLTI3MHEwIC0xNSAxMiAtNDR6TTU0MSA3NjFxNDMgLTcgMTA5IC03cTE3NSAwIDI2NCA2NXQ4OSAyMjRxMCAxMTIgLTg1IDE4N3EtODQgNzUgLTI1NSA3NXEtNTIgMCAtMTMwIC0xM3EwIC00NCAyIC03NyBxNyAtMTIyIDYgLTI3OWwtMSAtOThxMCAtNDMgMSAtNzd6TTAgLTEyOGwyIDk0cTQ1IDkgNjggMTJxNzcgMTIgMTIzIDMxcTE3IDI3IDIxIDUxcTkgNjYgOSAxOTRsLTIgNDk3cS01IDI1NiAtOSA0MDRxLTEgODcgLTExIDEwOXEtMSA0IC0xMiAxMnEtMTggMTIgLTY5IDE1cS0zMCAyIC0xMTQgMTNsLTQgODNsMjYwIDZsMzgwIDEzbDQ1IDFxNSAwIDE0IDAuNXQxNCAwLjVxMSAwIDIxLjUgLTAuNXQ0MC41IC0wLjVoNzRxODggMCAxOTEgLTI3IHE0MyAtMTMgOTYgLTM5cTU3IC0yOSAxMDIgLTc2cTQ0IC00NyA2NSAtMTA0dDIxIC0xMjJxMCAtNzAgLTMyIC0xMjh0LTk1IC0xMDVxLTI2IC0yMCAtMTUwIC03N3ExNzcgLTQxIDI2NyAtMTQ2cTkyIC0xMDYgOTIgLTIzNnEwIC03NiAtMjkgLTE2MXEtMjEgLTYyIC03MSAtMTE3cS02NiAtNzIgLTE0MCAtMTA4cS03MyAtMzYgLTIwMyAtNjBxLTgyIC0xNSAtMTk4IC0xMWwtMTk3IDRxLTg0IDIgLTI5OCAtMTFxLTMzIC0zIC0yNzIgLTExeiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDMzOyIgaG9yaXotYWR2LXg9IjEwMjQiIGQ9Ik0wIC0xMjZsMTcgODVxNCAxIDc3IDIwcTc2IDE5IDExNiAzOXEyOSAzNyA0MSAxMDFsMjcgMTM5bDU2IDI2OGwxMiA2NHE4IDQ0IDE3IDg0LjV0MTYgNjd0MTIuNSA0Ni41dDkgMzAuNXQzLjUgMTEuNWwyOSAxNTdsMTYgNjNsMjIgMTM1bDggNTB2MzhxLTQxIDIyIC0xNDQgMjhxLTI4IDIgLTM4IDRsMTkgMTAzbDMxNyAtMTRxMzkgLTIgNzMgLTJxNjYgMCAyMTQgOXEzMyAyIDY4IDQuNXQzNiAyLjVxLTIgLTE5IC02IC0zOCBxLTcgLTI5IC0xMyAtNTFxLTU1IC0xOSAtMTA5IC0zMXEtNjQgLTE2IC0xMDEgLTMxcS0xMiAtMzEgLTI0IC04OHEtOSAtNDQgLTEzIC04MnEtNDQgLTE5OSAtNjYgLTMwNmwtNjEgLTMxMWwtMzggLTE1OGwtNDMgLTIzNWwtMTIgLTQ1cS0yIC03IDEgLTI3cTY0IC0xNSAxMTkgLTIxcTM2IC01IDY2IC0xMHEtMSAtMjkgLTcgLTU4cS03IC0zMSAtOSAtNDFxLTE4IDAgLTIzIC0xcS0yNCAtMiAtNDIgLTJxLTkgMCAtMjggM3EtMTkgNCAtMTQ1IDE3IGwtMTk4IDJxLTQxIDEgLTE3NCAtMTFxLTc0IC03IC05OCAtOXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjAzNDsiIGhvcml6LWFkdi14PSIxNzkyIiBkPSJNODEgMTQwN2w1NCAtMjdxMjAgLTUgMjExIC01aDEzMGwxOSAzbDExNSAxbDIxNSAtMWgyOTNsMzQgLTJxMTQgLTEgMjggN3QyMSAxNmw3IDhsNDIgMXExNSAwIDI4IC0xdi0xMDQuNXQxIC0xMzEuNWwxIC0xMDBsLTEgLTU4cTAgLTMyIC00IC01MXEtMzkgLTE1IC02OCAtMThxLTI1IDQzIC01NCAxMjhxLTggMjQgLTE1LjUgNjIuNXQtMTEuNSA2NS41dC02IDI5cS0xMyAxNSAtMjcgMTlxLTcgMiAtNDIuNSAydC0xMDMuNSAtMXQtMTExIC0xIHEtMzQgMCAtNjcgLTVxLTEwIC05NyAtOCAtMTM2bDEgLTE1MnYtMzMybDMgLTM1OWwtMSAtMTQ3cS0xIC00NiAxMSAtODVxNDkgLTI1IDg5IC0zMnEyIDAgMTggLTV0NDQgLTEzdDQzIC0xMnEzMCAtOCA1MCAtMThxNSAtNDUgNSAtNTBxMCAtMTAgLTMgLTI5cS0xNCAtMSAtMzQgLTFxLTExMCAwIC0xODcgMTBxLTcyIDggLTIzOCA4cS04OCAwIC0yMzMgLTE0cS00OCAtNCAtNzAgLTRxLTIgMjIgLTIgMjZsLTEgMjZ2OXEyMSAzMyA3OSA0OSBxMTM5IDM4IDE1OSA1MHE5IDIxIDEyIDU2cTggMTkyIDYgNDMzbC01IDQyOHEtMSA2MiAtMC41IDExOC41dDAuNSAxMDIuNXQtMiA1N3QtNiAxNXEtNiA1IC0xNCA2cS0zOCA2IC0xNDggNnEtNDMgMCAtMTAwIC0xMy41dC03MyAtMjQuNXEtMTMgLTkgLTIyIC0zM3QtMjIgLTc1dC0yNCAtODRxLTYgLTE5IC0xOS41IC0zMnQtMjAuNSAtMTNxLTQ0IDI3IC01NiA0NHYyOTd2ODZ6TTE3NDQgMTI4cTMzIDAgNDIgLTE4LjV0LTExIC00NC41IGwtMTI2IC0xNjJxLTIwIC0yNiAtNDkgLTI2dC00OSAyNmwtMTI2IDE2MnEtMjAgMjYgLTExIDQ0LjV0NDIgMTguNWg4MHYxMDI0aC04MHEtMzMgMCAtNDIgMTguNXQxMSA0NC41bDEyNiAxNjJxMjAgMjYgNDkgMjZ0NDkgLTI2bDEyNiAtMTYycTIwIC0yNiAxMSAtNDQuNXQtNDIgLTE4LjVoLTgwdi0xMDI0aDgweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDM1OyIgZD0iTTgxIDE0MDdsNTQgLTI3cTIwIC01IDIxMSAtNWgxMzBsMTkgM2wxMTUgMWw0NDYgLTFoMzE4bDM0IC0ycTE0IC0xIDI4IDd0MjEgMTZsNyA4bDQyIDFxMTUgMCAyOCAtMXYtMTA0LjV0MSAtMTMxLjVsMSAtMTAwbC0xIC01OHEwIC0zMiAtNCAtNTFxLTM5IC0xNSAtNjggLTE4cS0yNSA0MyAtNTQgMTI4cS04IDI0IC0xNS41IDYyLjV0LTExLjUgNjUuNXQtNiAyOXEtMTMgMTUgLTI3IDE5cS03IDIgLTU4LjUgMnQtMTM4LjUgLTF0LTEyOCAtMSBxLTk0IDAgLTEyNyAtNXEtMTAgLTk3IC04IC0xMzZsMSAtMTUydjUybDMgLTM1OWwtMSAtMTQ3cS0xIC00NiAxMSAtODVxNDkgLTI1IDg5IC0zMnEyIDAgMTggLTV0NDQgLTEzdDQzIC0xMnEzMCAtOCA1MCAtMThxNSAtNDUgNSAtNTBxMCAtMTAgLTMgLTI5cS0xNCAtMSAtMzQgLTFxLTExMCAwIC0xODcgMTBxLTcyIDggLTIzOCA4cS04MiAwIC0yMzMgLTEzcS00NSAtNSAtNzAgLTVxLTIgMjIgLTIgMjZsLTEgMjZ2OXEyMSAzMyA3OSA0OSBxMTM5IDM4IDE1OSA1MHE5IDIxIDEyIDU2cTYgMTM3IDYgNDMzbC01IDQ0cTAgMjY1IC0yIDI3OHEtMiAxMSAtNiAxNXEtNiA1IC0xNCA2cS0zOCA2IC0xNDggNnEtNTAgMCAtMTY4LjUgLTE0dC0xMzIuNSAtMjRxLTEzIC05IC0yMiAtMzN0LTIyIC03NXQtMjQgLTg0cS02IC0xOSAtMTkuNSAtMzJ0LTIwLjUgLTEzcS00NCAyNyAtNTYgNDR2Mjk3djg2ek0xNTA1IDExM3EyNiAtMjAgMjYgLTQ5dC0yNiAtNDlsLTE2MiAtMTI2IHEtMjYgLTIwIC00NC41IC0xMXQtMTguNSA0MnY4MGgtMTAyNHYtODBxMCAtMzMgLTE4LjUgLTQydC00NC41IDExbC0xNjIgMTI2cS0yNiAyMCAtMjYgNDl0MjYgNDlsMTYyIDEyNnEyNiAyMCA0NC41IDExdDE4LjUgLTQydi04MGgxMDI0djgwcTAgMzMgMTguNSA0MnQ0NC41IC0xMXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjAzNjsiIGhvcml6LWFkdi14PSIxNzkyIiBkPSJNMTc5MiAxOTJ2LTEyOHEwIC0yNiAtMTkgLTQ1dC00NSAtMTloLTE2NjRxLTI2IDAgLTQ1IDE5dC0xOSA0NXYxMjhxMCAyNiAxOSA0NXQ0NSAxOWgxNjY0cTI2IDAgNDUgLTE5dDE5IC00NXpNMTQwOCA1NzZ2LTEyOHEwIC0yNiAtMTkgLTQ1dC00NSAtMTloLTEyODBxLTI2IDAgLTQ1IDE5dC0xOSA0NXYxMjhxMCAyNiAxOSA0NXQ0NSAxOWgxMjgwcTI2IDAgNDUgLTE5dDE5IC00NXpNMTY2NCA5NjB2LTEyOHEwIC0yNiAtMTkgLTQ1IHQtNDUgLTE5aC0xNTM2cS0yNiAwIC00NSAxOXQtMTkgNDV2MTI4cTAgMjYgMTkgNDV0NDUgMTloMTUzNnEyNiAwIDQ1IC0xOXQxOSAtNDV6TTEyODAgMTM0NHYtMTI4cTAgLTI2IC0xOSAtNDV0LTQ1IC0xOWgtMTE1MnEtMjYgMCAtNDUgMTl0LTE5IDQ1djEyOHEwIDI2IDE5IDQ1dDQ1IDE5aDExNTJxMjYgMCA0NSAtMTl0MTkgLTQ1eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDM3OyIgaG9yaXotYWR2LXg9IjE3OTIiIGQ9Ik0xNzkyIDE5MnYtMTI4cTAgLTI2IC0xOSAtNDV0LTQ1IC0xOWgtMTY2NHEtMjYgMCAtNDUgMTl0LTE5IDQ1djEyOHEwIDI2IDE5IDQ1dDQ1IDE5aDE2NjRxMjYgMCA0NSAtMTl0MTkgLTQ1ek0xNDA4IDU3NnYtMTI4cTAgLTI2IC0xOSAtNDV0LTQ1IC0xOWgtODk2cS0yNiAwIC00NSAxOXQtMTkgNDV2MTI4cTAgMjYgMTkgNDV0NDUgMTloODk2cTI2IDAgNDUgLTE5dDE5IC00NXpNMTY2NCA5NjB2LTEyOHEwIC0yNiAtMTkgLTQ1dC00NSAtMTkgaC0xNDA4cS0yNiAwIC00NSAxOXQtMTkgNDV2MTI4cTAgMjYgMTkgNDV0NDUgMTloMTQwOHEyNiAwIDQ1IC0xOXQxOSAtNDV6TTEyODAgMTM0NHYtMTI4cTAgLTI2IC0xOSAtNDV0LTQ1IC0xOWgtNjQwcS0yNiAwIC00NSAxOXQtMTkgNDV2MTI4cTAgMjYgMTkgNDV0NDUgMTloNjQwcTI2IDAgNDUgLTE5dDE5IC00NXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjAzODsiIGhvcml6LWFkdi14PSIxNzkyIiBkPSJNMTc5MiAxOTJ2LTEyOHEwIC0yNiAtMTkgLTQ1dC00NSAtMTloLTE2NjRxLTI2IDAgLTQ1IDE5dC0xOSA0NXYxMjhxMCAyNiAxOSA0NXQ0NSAxOWgxNjY0cTI2IDAgNDUgLTE5dDE5IC00NXpNMTc5MiA1NzZ2LTEyOHEwIC0yNiAtMTkgLTQ1dC00NSAtMTloLTEyODBxLTI2IDAgLTQ1IDE5dC0xOSA0NXYxMjhxMCAyNiAxOSA0NXQ0NSAxOWgxMjgwcTI2IDAgNDUgLTE5dDE5IC00NXpNMTc5MiA5NjB2LTEyOHEwIC0yNiAtMTkgLTQ1IHQtNDUgLTE5aC0xNTM2cS0yNiAwIC00NSAxOXQtMTkgNDV2MTI4cTAgMjYgMTkgNDV0NDUgMTloMTUzNnEyNiAwIDQ1IC0xOXQxOSAtNDV6TTE3OTIgMTM0NHYtMTI4cTAgLTI2IC0xOSAtNDV0LTQ1IC0xOWgtMTE1MnEtMjYgMCAtNDUgMTl0LTE5IDQ1djEyOHEwIDI2IDE5IDQ1dDQ1IDE5aDExNTJxMjYgMCA0NSAtMTl0MTkgLTQ1eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDM5OyIgaG9yaXotYWR2LXg9IjE3OTIiIGQ9Ik0xNzkyIDE5MnYtMTI4cTAgLTI2IC0xOSAtNDV0LTQ1IC0xOWgtMTY2NHEtMjYgMCAtNDUgMTl0LTE5IDQ1djEyOHEwIDI2IDE5IDQ1dDQ1IDE5aDE2NjRxMjYgMCA0NSAtMTl0MTkgLTQ1ek0xNzkyIDU3NnYtMTI4cTAgLTI2IC0xOSAtNDV0LTQ1IC0xOWgtMTY2NHEtMjYgMCAtNDUgMTl0LTE5IDQ1djEyOHEwIDI2IDE5IDQ1dDQ1IDE5aDE2NjRxMjYgMCA0NSAtMTl0MTkgLTQ1ek0xNzkyIDk2MHYtMTI4cTAgLTI2IC0xOSAtNDUgdC00NSAtMTloLTE2NjRxLTI2IDAgLTQ1IDE5dC0xOSA0NXYxMjhxMCAyNiAxOSA0NXQ0NSAxOWgxNjY0cTI2IDAgNDUgLTE5dDE5IC00NXpNMTc5MiAxMzQ0di0xMjhxMCAtMjYgLTE5IC00NXQtNDUgLTE5aC0xNjY0cS0yNiAwIC00NSAxOXQtMTkgNDV2MTI4cTAgMjYgMTkgNDV0NDUgMTloMTY2NHEyNiAwIDQ1IC0xOXQxOSAtNDV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwM2E7IiBob3Jpei1hZHYteD0iMTc5MiIgZD0iTTI1NiAyMjR2LTE5MnEwIC0xMyAtOS41IC0yMi41dC0yMi41IC05LjVoLTE5MnEtMTMgMCAtMjIuNSA5LjV0LTkuNSAyMi41djE5MnEwIDEzIDkuNSAyMi41dDIyLjUgOS41aDE5MnExMyAwIDIyLjUgLTkuNXQ5LjUgLTIyLjV6TTI1NiA2MDh2LTE5MnEwIC0xMyAtOS41IC0yMi41dC0yMi41IC05LjVoLTE5MnEtMTMgMCAtMjIuNSA5LjV0LTkuNSAyMi41djE5MnEwIDEzIDkuNSAyMi41dDIyLjUgOS41aDE5MnExMyAwIDIyLjUgLTkuNSB0OS41IC0yMi41ek0yNTYgOTkydi0xOTJxMCAtMTMgLTkuNSAtMjIuNXQtMjIuNSAtOS41aC0xOTJxLTEzIDAgLTIyLjUgOS41dC05LjUgMjIuNXYxOTJxMCAxMyA5LjUgMjIuNXQyMi41IDkuNWgxOTJxMTMgMCAyMi41IC05LjV0OS41IC0yMi41ek0xNzkyIDIyNHYtMTkycTAgLTEzIC05LjUgLTIyLjV0LTIyLjUgLTkuNWgtMTM0NHEtMTMgMCAtMjIuNSA5LjV0LTkuNSAyMi41djE5MnEwIDEzIDkuNSAyMi41dDIyLjUgOS41aDEzNDQgcTEzIDAgMjIuNSAtOS41dDkuNSAtMjIuNXpNMjU2IDEzNzZ2LTE5MnEwIC0xMyAtOS41IC0yMi41dC0yMi41IC05LjVoLTE5MnEtMTMgMCAtMjIuNSA5LjV0LTkuNSAyMi41djE5MnEwIDEzIDkuNSAyMi41dDIyLjUgOS41aDE5MnExMyAwIDIyLjUgLTkuNXQ5LjUgLTIyLjV6TTE3OTIgNjA4di0xOTJxMCAtMTMgLTkuNSAtMjIuNXQtMjIuNSAtOS41aC0xMzQ0cS0xMyAwIC0yMi41IDkuNXQtOS41IDIyLjV2MTkycTAgMTMgOS41IDIyLjUgdDIyLjUgOS41aDEzNDRxMTMgMCAyMi41IC05LjV0OS41IC0yMi41ek0xNzkyIDk5MnYtMTkycTAgLTEzIC05LjUgLTIyLjV0LTIyLjUgLTkuNWgtMTM0NHEtMTMgMCAtMjIuNSA5LjV0LTkuNSAyMi41djE5MnEwIDEzIDkuNSAyMi41dDIyLjUgOS41aDEzNDRxMTMgMCAyMi41IC05LjV0OS41IC0yMi41ek0xNzkyIDEzNzZ2LTE5MnEwIC0xMyAtOS41IC0yMi41dC0yMi41IC05LjVoLTEzNDRxLTEzIDAgLTIyLjUgOS41dC05LjUgMjIuNXYxOTIgcTAgMTMgOS41IDIyLjV0MjIuNSA5LjVoMTM0NHExMyAwIDIyLjUgLTkuNXQ5LjUgLTIyLjV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwM2I7IiBob3Jpei1hZHYteD0iMTc5MiIgZD0iTTM4NCA5OTJ2LTU3NnEwIC0xMyAtOS41IC0yMi41dC0yMi41IC05LjVxLTE0IDAgLTIzIDlsLTI4OCAyODhxLTkgOSAtOSAyM3Q5IDIzbDI4OCAyODhxOSA5IDIzIDlxMTMgMCAyMi41IC05LjV0OS41IC0yMi41ek0xNzkyIDIyNHYtMTkycTAgLTEzIC05LjUgLTIyLjV0LTIyLjUgLTkuNWgtMTcyOHEtMTMgMCAtMjIuNSA5LjV0LTkuNSAyMi41djE5MnEwIDEzIDkuNSAyMi41dDIyLjUgOS41aDE3MjhxMTMgMCAyMi41IC05LjUgdDkuNSAtMjIuNXpNMTc5MiA2MDh2LTE5MnEwIC0xMyAtOS41IC0yMi41dC0yMi41IC05LjVoLTEwODhxLTEzIDAgLTIyLjUgOS41dC05LjUgMjIuNXYxOTJxMCAxMyA5LjUgMjIuNXQyMi41IDkuNWgxMDg4cTEzIDAgMjIuNSAtOS41dDkuNSAtMjIuNXpNMTc5MiA5OTJ2LTE5MnEwIC0xMyAtOS41IC0yMi41dC0yMi41IC05LjVoLTEwODhxLTEzIDAgLTIyLjUgOS41dC05LjUgMjIuNXYxOTJxMCAxMyA5LjUgMjIuNXQyMi41IDkuNWgxMDg4IHExMyAwIDIyLjUgLTkuNXQ5LjUgLTIyLjV6TTE3OTIgMTM3NnYtMTkycTAgLTEzIC05LjUgLTIyLjV0LTIyLjUgLTkuNWgtMTcyOHEtMTMgMCAtMjIuNSA5LjV0LTkuNSAyMi41djE5MnEwIDEzIDkuNSAyMi41dDIyLjUgOS41aDE3MjhxMTMgMCAyMi41IC05LjV0OS41IC0yMi41eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDNjOyIgaG9yaXotYWR2LXg9IjE3OTIiIGQ9Ik0zNTIgNzA0cTAgLTE0IC05IC0yM2wtMjg4IC0yODhxLTkgLTkgLTIzIC05cS0xMyAwIC0yMi41IDkuNXQtOS41IDIyLjV2NTc2cTAgMTMgOS41IDIyLjV0MjIuNSA5LjVxMTQgMCAyMyAtOWwyODggLTI4OHE5IC05IDkgLTIzek0xNzkyIDIyNHYtMTkycTAgLTEzIC05LjUgLTIyLjV0LTIyLjUgLTkuNWgtMTcyOHEtMTMgMCAtMjIuNSA5LjV0LTkuNSAyMi41djE5MnEwIDEzIDkuNSAyMi41dDIyLjUgOS41aDE3MjhxMTMgMCAyMi41IC05LjUgdDkuNSAtMjIuNXpNMTc5MiA2MDh2LTE5MnEwIC0xMyAtOS41IC0yMi41dC0yMi41IC05LjVoLTEwODhxLTEzIDAgLTIyLjUgOS41dC05LjUgMjIuNXYxOTJxMCAxMyA5LjUgMjIuNXQyMi41IDkuNWgxMDg4cTEzIDAgMjIuNSAtOS41dDkuNSAtMjIuNXpNMTc5MiA5OTJ2LTE5MnEwIC0xMyAtOS41IC0yMi41dC0yMi41IC05LjVoLTEwODhxLTEzIDAgLTIyLjUgOS41dC05LjUgMjIuNXYxOTJxMCAxMyA5LjUgMjIuNXQyMi41IDkuNWgxMDg4IHExMyAwIDIyLjUgLTkuNXQ5LjUgLTIyLjV6TTE3OTIgMTM3NnYtMTkycTAgLTEzIC05LjUgLTIyLjV0LTIyLjUgLTkuNWgtMTcyOHEtMTMgMCAtMjIuNSA5LjV0LTkuNSAyMi41djE5MnEwIDEzIDkuNSAyMi41dDIyLjUgOS41aDE3MjhxMTMgMCAyMi41IC05LjV0OS41IC0yMi41eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDNkOyIgaG9yaXotYWR2LXg9IjE5MjAiIGQ9Ik0xOTAwIDEyNzhxMjAgLTggMjAgLTMwdi0xMjE2cTAgLTIyIC0yMCAtMzBxLTggLTIgLTEyIC0ycS0xMiAwIC0yMyA5bC01ODUgNTg2di0zMDdxMCAtMTE5IC04NC41IC0yMDMuNXQtMjAzLjUgLTg0LjVoLTcwNHEtMTE5IDAgLTIwMy41IDg0LjV0LTg0LjUgMjAzLjV2NzA0cTAgMTE5IDg0LjUgMjAzLjV0MjAzLjUgODQuNWg3MDRxMTE5IDAgMjAzLjUgLTg0LjV0ODQuNSAtMjAzLjV2LTMwN2w1ODUgNTg2cTE2IDE1IDM1IDd6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwM2U7IiBob3Jpei1hZHYteD0iMTkyMCIgZD0iTTY0MCA5NjBxMCAtODAgLTU2IC0xMzZ0LTEzNiAtNTZ0LTEzNiA1NnQtNTYgMTM2dDU2IDEzNnQxMzYgNTZ0MTM2IC01NnQ1NiAtMTM2ek0xNjY0IDU3NnYtNDQ4aC0xNDA4djE5MmwzMjAgMzIwbDE2MCAtMTYwbDUxMiA1MTJ6TTE3NjAgMTI4MGgtMTYwMHEtMTMgMCAtMjIuNSAtOS41dC05LjUgLTIyLjV2LTEyMTZxMCAtMTMgOS41IC0yMi41dDIyLjUgLTkuNWgxNjAwcTEzIDAgMjIuNSA5LjV0OS41IDIyLjV2MTIxNiBxMCAxMyAtOS41IDIyLjV0LTIyLjUgOS41ek0xOTIwIDEyNDh2LTEyMTZxMCAtNjYgLTQ3IC0xMTN0LTExMyAtNDdoLTE2MDBxLTY2IDAgLTExMyA0N3QtNDcgMTEzdjEyMTZxMCA2NiA0NyAxMTN0MTEzIDQ3aDE2MDBxNjYgMCAxMTMgLTQ3dDQ3IC0xMTN6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwNDA7IiBkPSJNMzYzIDBsOTEgOTFsLTIzNSAyMzVsLTkxIC05MXYtMTA3aDEyOHYtMTI4aDEwN3pNODg2IDkyOHEwIDIyIC0yMiAyMnEtMTAgMCAtMTcgLTdsLTU0MiAtNTQycS03IC03IC03IC0xN3EwIC0yMiAyMiAtMjJxMTAgMCAxNyA3bDU0MiA1NDJxNyA3IDcgMTd6TTgzMiAxMTIwbDQxNiAtNDE2bC04MzIgLTgzMmgtNDE2djQxNnpNMTUxNSAxMDI0cTAgLTUzIC0zNyAtOTBsLTE2NiAtMTY2bC00MTYgNDE2bDE2NiAxNjVxMzYgMzggOTAgMzggcTUzIDAgOTEgLTM4bDIzNSAtMjM0cTM3IC0zOSAzNyAtOTF6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwNDE7IiBob3Jpei1hZHYteD0iMTAyNCIgZD0iTTc2OCA4OTZxMCAxMDYgLTc1IDE4MXQtMTgxIDc1dC0xODEgLTc1dC03NSAtMTgxdDc1IC0xODF0MTgxIC03NXQxODEgNzV0NzUgMTgxek0xMDI0IDg5NnEwIC0xMDkgLTMzIC0xNzlsLTM2NCAtNzc0cS0xNiAtMzMgLTQ3LjUgLTUydC02Ny41IC0xOXQtNjcuNSAxOXQtNDYuNSA1MmwtMzY1IDc3NHEtMzMgNzAgLTMzIDE3OXEwIDIxMiAxNTAgMzYydDM2MiAxNTB0MzYyIC0xNTB0MTUwIC0zNjJ6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwNDI7IiBkPSJNNzY4IDE0MDhxMjA5IDAgMzg1LjUgLTEwM3QyNzkuNSAtMjc5LjV0MTAzIC0zODUuNXQtMTAzIC0zODUuNXQtMjc5LjUgLTI3OS41dC0zODUuNSAtMTAzdC0zODUuNSAxMDN0LTI3OS41IDI3OS41dC0xMDMgMzg1LjV0MTAzIDM4NS41dDI3OS41IDI3OS41dDM4NS41IDEwM3pNMjU2IDY0MHEwIC0xMDQgNDAuNSAtMTk4LjV0MTA5LjUgLTE2My41dDE2My41IC0xMDkuNXQxOTguNSAtNDAuNXYxMDI0cS0xMDQgMCAtMTk4LjUgLTQwLjUgdC0xNjMuNSAtMTA5LjV0LTEwOS41IC0xNjMuNXQtNDAuNSAtMTk4LjV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwNDM7IiBob3Jpei1hZHYteD0iMTAyNCIgZD0iTTUxMiAzODRxMCAzNiAtMjAgNjlxLTEgMSAtMTUuNSAyMi41dC0yNS41IDM4dC0yNSA0NHQtMjEgNTAuNXEtNCAxNiAtMjEgMTZ0LTIxIC0xNnEtNyAtMjMgLTIxIC01MC41dC0yNSAtNDR0LTI1LjUgLTM4dC0xNS41IC0yMi41cS0yMCAtMzMgLTIwIC02OXEwIC01MyAzNy41IC05MC41dDkwLjUgLTM3LjV0OTAuNSAzNy41dDM3LjUgOTAuNXpNMTAyNCA1MTJxMCAtMjEyIC0xNTAgLTM2MnQtMzYyIC0xNTB0LTM2MiAxNTB0LTE1MCAzNjIgcTAgMTQ1IDgxIDI3NXE2IDkgNjIuNSA5MC41dDEwMSAxNTF0OTkuNSAxNzh0ODMgMjAxLjVxOSAzMCAzNCA0N3Q1MSAxN3Q1MS41IC0xN3QzMy41IC00N3EyOCAtOTMgODMgLTIwMS41dDk5LjUgLTE3OHQxMDEgLTE1MXQ2Mi41IC05MC41cTgxIC0xMjcgODEgLTI3NXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjA0NDsiIGhvcml6LWFkdi14PSIxNzkyIiBkPSJNODg4IDM1MmwxMTYgMTE2bC0xNTIgMTUybC0xMTYgLTExNnYtNTZoOTZ2LTk2aDU2ek0xMzI4IDEwNzJxLTE2IDE2IC0zMyAtMWwtMzUwIC0zNTBxLTE3IC0xNyAtMSAtMzN0MzMgMWwzNTAgMzUwcTE3IDE3IDEgMzN6TTE0MDggNDc4di0xOTBxMCAtMTE5IC04NC41IC0yMDMuNXQtMjAzLjUgLTg0LjVoLTgzMnEtMTE5IDAgLTIwMy41IDg0LjV0LTg0LjUgMjAzLjV2ODMycTAgMTE5IDg0LjUgMjAzLjV0MjAzLjUgODQuNWg4MzIgcTYzIDAgMTE3IC0yNXExNSAtNyAxOCAtMjNxMyAtMTcgLTkgLTI5bC00OSAtNDlxLTE0IC0xNCAtMzIgLThxLTIzIDYgLTQ1IDZoLTgzMnEtNjYgMCAtMTEzIC00N3QtNDcgLTExM3YtODMycTAgLTY2IDQ3IC0xMTN0MTEzIC00N2g4MzJxNjYgMCAxMTMgNDd0NDcgMTEzdjEyNnEwIDEzIDkgMjJsNjQgNjRxMTUgMTUgMzUgN3QyMCAtMjl6TTEzMTIgMTIxNmwyODggLTI4OGwtNjcyIC02NzJoLTI4OHYyODh6TTE3NTYgMTA4NGwtOTIgLTkyIGwtMjg4IDI4OGw5MiA5MnEyOCAyOCA2OCAyOHQ2OCAtMjhsMTUyIC0xNTJxMjggLTI4IDI4IC02OHQtMjggLTY4eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDQ1OyIgaG9yaXotYWR2LXg9IjE2NjQiIGQ9Ik0xNDA4IDU0N3YtMjU5cTAgLTExOSAtODQuNSAtMjAzLjV0LTIwMy41IC04NC41aC04MzJxLTExOSAwIC0yMDMuNSA4NC41dC04NC41IDIwMy41djgzMnEwIDExOSA4NC41IDIwMy41dDIwMy41IDg0LjVoMjU1djBxMTMgMCAyMi41IC05LjV0OS41IC0yMi41cTAgLTI3IC0yNiAtMzJxLTc3IC0yNiAtMTMzIC02MHEtMTAgLTQgLTE2IC00aC0xMTJxLTY2IDAgLTExMyAtNDd0LTQ3IC0xMTN2LTgzMnEwIC02NiA0NyAtMTEzdDExMyAtNDdoODMyIHE2NiAwIDExMyA0N3Q0NyAxMTN2MjE0cTAgMTkgMTggMjlxMjggMTMgNTQgMzdxMTYgMTYgMzUgOHEyMSAtOSAyMSAtMjl6TTE2NDUgMTA0M2wtMzg0IC0zODRxLTE4IC0xOSAtNDUgLTE5cS0xMiAwIC0yNSA1cS0zOSAxNyAtMzkgNTl2MTkyaC0xNjBxLTMyMyAwIC00MzggLTEzMXEtMTE5IC0xMzcgLTc0IC00NzNxMyAtMjMgLTIwIC0zNHEtOCAtMiAtMTIgLTJxLTE2IDAgLTI2IDEzcS0xMCAxNCAtMjEgMzF0LTM5LjUgNjguNXQtNDkuNSA5OS41IHQtMzguNSAxMTR0LTE3LjUgMTIycTAgNDkgMy41IDkxdDE0IDkwdDI4IDg4dDQ3IDgxLjV0NjguNSA3NHQ5NC41IDYxLjV0MTI0LjUgNDguNXQxNTkuNSAzMC41dDE5Ni41IDExaDE2MHYxOTJxMCA0MiAzOSA1OXExMyA1IDI1IDVxMjYgMCA0NSAtMTlsMzg0IC0zODRxMTkgLTE5IDE5IC00NXQtMTkgLTQ1eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDQ2OyIgaG9yaXotYWR2LXg9IjE2NjQiIGQ9Ik0xNDA4IDYwNnYtMzE4cTAgLTExOSAtODQuNSAtMjAzLjV0LTIwMy41IC04NC41aC04MzJxLTExOSAwIC0yMDMuNSA4NC41dC04NC41IDIwMy41djgzMnEwIDExOSA4NC41IDIwMy41dDIwMy41IDg0LjVoODMycTYzIDAgMTE3IC0yNXExNSAtNyAxOCAtMjNxMyAtMTcgLTkgLTI5bC00OSAtNDlxLTEwIC0xMCAtMjMgLTEwcS0zIDAgLTkgMnEtMjMgNiAtNDUgNmgtODMycS02NiAwIC0xMTMgLTQ3dC00NyAtMTEzdi04MzIgcTAgLTY2IDQ3IC0xMTN0MTEzIC00N2g4MzJxNjYgMCAxMTMgNDd0NDcgMTEzdjI1NHEwIDEzIDkgMjJsNjQgNjRxMTAgMTAgMjMgMTBxNiAwIDEyIC0zcTIwIC04IDIwIC0yOXpNMTYzOSAxMDk1bC04MTQgLTgxNHEtMjQgLTI0IC01NyAtMjR0LTU3IDI0bC00MzAgNDMwcS0yNCAyNCAtMjQgNTd0MjQgNTdsMTEwIDExMHEyNCAyNCA1NyAyNHQ1NyAtMjRsMjYzIC0yNjNsNjQ3IDY0N3EyNCAyNCA1NyAyNHQ1NyAtMjRsMTEwIC0xMTAgcTI0IC0yNCAyNCAtNTd0LTI0IC01N3oiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjA0NzsiIGhvcml6LWFkdi14PSIxNzkyIiBkPSJNMTc5MiA2NDBxMCAtMjYgLTE5IC00NWwtMjU2IC0yNTZxLTE5IC0xOSAtNDUgLTE5dC00NSAxOXQtMTkgNDV2MTI4aC0zODR2LTM4NGgxMjhxMjYgMCA0NSAtMTl0MTkgLTQ1dC0xOSAtNDVsLTI1NiAtMjU2cS0xOSAtMTkgLTQ1IC0xOXQtNDUgMTlsLTI1NiAyNTZxLTE5IDE5IC0xOSA0NXQxOSA0NXQ0NSAxOWgxMjh2Mzg0aC0zODR2LTEyOHEwIC0yNiAtMTkgLTQ1dC00NSAtMTl0LTQ1IDE5bC0yNTYgMjU2cS0xOSAxOSAtMTkgNDUgdDE5IDQ1bDI1NiAyNTZxMTkgMTkgNDUgMTl0NDUgLTE5dDE5IC00NXYtMTI4aDM4NHYzODRoLTEyOHEtMjYgMCAtNDUgMTl0LTE5IDQ1dDE5IDQ1bDI1NiAyNTZxMTkgMTkgNDUgMTl0NDUgLTE5bDI1NiAtMjU2cTE5IC0xOSAxOSAtNDV0LTE5IC00NXQtNDUgLTE5aC0xMjh2LTM4NGgzODR2MTI4cTAgMjYgMTkgNDV0NDUgMTl0NDUgLTE5bDI1NiAtMjU2cTE5IC0xOSAxOSAtNDV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwNDg7IiBob3Jpei1hZHYteD0iMTAyNCIgZD0iTTk3OSAxMzk1cTE5IDE5IDMyIDEzdDEzIC0zMnYtMTQ3MnEwIC0yNiAtMTMgLTMydC0zMiAxM2wtNzEwIDcxMHEtOSA5IC0xMyAxOXYtNjc4cTAgLTI2IC0xOSAtNDV0LTQ1IC0xOWgtMTI4cS0yNiAwIC00NSAxOXQtMTkgNDV2MTQwOHEwIDI2IDE5IDQ1dDQ1IDE5aDEyOHEyNiAwIDQ1IC0xOXQxOSAtNDV2LTY3OHE0IDExIDEzIDE5eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDQ5OyIgaG9yaXotYWR2LXg9IjE3OTIiIGQ9Ik0xNzQ3IDEzOTVxMTkgMTkgMzIgMTN0MTMgLTMydi0xNDcycTAgLTI2IC0xMyAtMzJ0LTMyIDEzbC03MTAgNzEwcS05IDkgLTEzIDE5di03MTBxMCAtMjYgLTEzIC0zMnQtMzIgMTNsLTcxMCA3MTBxLTkgOSAtMTMgMTl2LTY3OHEwIC0yNiAtMTkgLTQ1dC00NSAtMTloLTEyOHEtMjYgMCAtNDUgMTl0LTE5IDQ1djE0MDhxMCAyNiAxOSA0NXQ0NSAxOWgxMjhxMjYgMCA0NSAtMTl0MTkgLTQ1di02NzhxNCAxMSAxMyAxOWw3MTAgNzEwIHExOSAxOSAzMiAxM3QxMyAtMzJ2LTcxMHE0IDExIDEzIDE5eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDRhOyIgaG9yaXotYWR2LXg9IjE2NjQiIGQ9Ik0xNjE5IDEzOTVxMTkgMTkgMzIgMTN0MTMgLTMydi0xNDcycTAgLTI2IC0xMyAtMzJ0LTMyIDEzbC03MTAgNzEwcS04IDkgLTEzIDE5di03MTBxMCAtMjYgLTEzIC0zMnQtMzIgMTNsLTcxMCA3MTBxLTE5IDE5IC0xOSA0NXQxOSA0NWw3MTAgNzEwcTE5IDE5IDMyIDEzdDEzIC0zMnYtNzEwcTUgMTEgMTMgMTl6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwNGI7IiBob3Jpei1hZHYteD0iMTQwOCIgZD0iTTEzODQgNjA5bC0xMzI4IC03MzhxLTIzIC0xMyAtMzkuNSAtM3QtMTYuNSAzNnYxNDcycTAgMjYgMTYuNSAzNnQzOS41IC0zbDEzMjggLTczOHEyMyAtMTMgMjMgLTMxdC0yMyAtMzF6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwNGM7IiBkPSJNMTUzNiAxMzQ0di0xNDA4cTAgLTI2IC0xOSAtNDV0LTQ1IC0xOWgtNTEycS0yNiAwIC00NSAxOXQtMTkgNDV2MTQwOHEwIDI2IDE5IDQ1dDQ1IDE5aDUxMnEyNiAwIDQ1IC0xOXQxOSAtNDV6TTY0MCAxMzQ0di0xNDA4cTAgLTI2IC0xOSAtNDV0LTQ1IC0xOWgtNTEycS0yNiAwIC00NSAxOXQtMTkgNDV2MTQwOHEwIDI2IDE5IDQ1dDQ1IDE5aDUxMnEyNiAwIDQ1IC0xOXQxOSAtNDV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwNGQ7IiBkPSJNMTUzNiAxMzQ0di0xNDA4cTAgLTI2IC0xOSAtNDV0LTQ1IC0xOWgtMTQwOHEtMjYgMCAtNDUgMTl0LTE5IDQ1djE0MDhxMCAyNiAxOSA0NXQ0NSAxOWgxNDA4cTI2IDAgNDUgLTE5dDE5IC00NXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjA0ZTsiIGhvcml6LWFkdi14PSIxNjY0IiBkPSJNNDUgLTExNXEtMTkgLTE5IC0zMiAtMTN0LTEzIDMydjE0NzJxMCAyNiAxMyAzMnQzMiAtMTNsNzEwIC03MTBxOCAtOCAxMyAtMTl2NzEwcTAgMjYgMTMgMzJ0MzIgLTEzbDcxMCAtNzEwcTE5IC0xOSAxOSAtNDV0LTE5IC00NWwtNzEwIC03MTBxLTE5IC0xOSAtMzIgLTEzdC0xMyAzMnY3MTBxLTUgLTEwIC0xMyAtMTl6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwNTA7IiBob3Jpei1hZHYteD0iMTc5MiIgZD0iTTQ1IC0xMTVxLTE5IC0xOSAtMzIgLTEzdC0xMyAzMnYxNDcycTAgMjYgMTMgMzJ0MzIgLTEzbDcxMCAtNzEwcTggLTggMTMgLTE5djcxMHEwIDI2IDEzIDMydDMyIC0xM2w3MTAgLTcxMHE4IC04IDEzIC0xOXY2NzhxMCAyNiAxOSA0NXQ0NSAxOWgxMjhxMjYgMCA0NSAtMTl0MTkgLTQ1di0xNDA4cTAgLTI2IC0xOSAtNDV0LTQ1IC0xOWgtMTI4cS0yNiAwIC00NSAxOXQtMTkgNDV2Njc4cS01IC0xMCAtMTMgLTE5bC03MTAgLTcxMCBxLTE5IC0xOSAtMzIgLTEzdC0xMyAzMnY3MTBxLTUgLTEwIC0xMyAtMTl6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwNTE7IiBob3Jpei1hZHYteD0iMTAyNCIgZD0iTTQ1IC0xMTVxLTE5IC0xOSAtMzIgLTEzdC0xMyAzMnYxNDcycTAgMjYgMTMgMzJ0MzIgLTEzbDcxMCAtNzEwcTggLTggMTMgLTE5djY3OHEwIDI2IDE5IDQ1dDQ1IDE5aDEyOHEyNiAwIDQ1IC0xOXQxOSAtNDV2LTE0MDhxMCAtMjYgLTE5IC00NXQtNDUgLTE5aC0xMjhxLTI2IDAgLTQ1IDE5dC0xOSA0NXY2NzhxLTUgLTEwIC0xMyAtMTl6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwNTI7IiBob3Jpei1hZHYteD0iMTUzOCIgZD0iTTE0IDU1N2w3MTAgNzEwcTE5IDE5IDQ1IDE5dDQ1IC0xOWw3MTAgLTcxMHExOSAtMTkgMTMgLTMydC0zMiAtMTNoLTE0NzJxLTI2IDAgLTMyIDEzdDEzIDMyek0xNDczIDBoLTE0MDhxLTI2IDAgLTQ1IDE5dC0xOSA0NXYyNTZxMCAyNiAxOSA0NXQ0NSAxOWgxNDA4cTI2IDAgNDUgLTE5dDE5IC00NXYtMjU2cTAgLTI2IC0xOSAtNDV0LTQ1IC0xOXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjA1MzsiIGhvcml6LWFkdi14PSIxMTUyIiBkPSJNNzQyIC0zN2wtNjUyIDY1MXEtMzcgMzcgLTM3IDkwLjV0MzcgOTAuNWw2NTIgNjUxcTM3IDM3IDkwLjUgMzd0OTAuNSAtMzdsNzUgLTc1cTM3IC0zNyAzNyAtOTAuNXQtMzcgLTkwLjVsLTQ4NiAtNDg2bDQ4NiAtNDg1cTM3IC0zOCAzNyAtOTF0LTM3IC05MGwtNzUgLTc1cS0zNyAtMzcgLTkwLjUgLTM3dC05MC41IDM3eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDU0OyIgaG9yaXotYWR2LXg9IjExNTIiIGQ9Ik0xMDk5IDcwNHEwIC01MiAtMzcgLTkxbC02NTIgLTY1MXEtMzcgLTM3IC05MCAtMzd0LTkwIDM3bC03NiA3NXEtMzcgMzkgLTM3IDkxcTAgNTMgMzcgOTBsNDg2IDQ4NmwtNDg2IDQ4NXEtMzcgMzkgLTM3IDkxcTAgNTMgMzcgOTBsNzYgNzVxMzYgMzggOTAgMzh0OTAgLTM4bDY1MiAtNjUxcTM3IC0zNyAzNyAtOTB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwNTU7IiBkPSJNMTIxNiA1NzZ2MTI4cTAgMjYgLTE5IDQ1dC00NSAxOWgtMjU2djI1NnEwIDI2IC0xOSA0NXQtNDUgMTloLTEyOHEtMjYgMCAtNDUgLTE5dC0xOSAtNDV2LTI1NmgtMjU2cS0yNiAwIC00NSAtMTl0LTE5IC00NXYtMTI4cTAgLTI2IDE5IC00NXQ0NSAtMTloMjU2di0yNTZxMCAtMjYgMTkgLTQ1dDQ1IC0xOWgxMjhxMjYgMCA0NSAxOXQxOSA0NXYyNTZoMjU2cTI2IDAgNDUgMTl0MTkgNDV6TTE1MzYgNjQwcTAgLTIwOSAtMTAzIC0zODUuNSB0LTI3OS41IC0yNzkuNXQtMzg1LjUgLTEwM3QtMzg1LjUgMTAzdC0yNzkuNSAyNzkuNXQtMTAzIDM4NS41dDEwMyAzODUuNXQyNzkuNSAyNzkuNXQzODUuNSAxMDN0Mzg1LjUgLTEwM3QyNzkuNSAtMjc5LjV0MTAzIC0zODUuNXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjA1NjsiIGQ9Ik0xMjE2IDU3NnYxMjhxMCAyNiAtMTkgNDV0LTQ1IDE5aC03NjhxLTI2IDAgLTQ1IC0xOXQtMTkgLTQ1di0xMjhxMCAtMjYgMTkgLTQ1dDQ1IC0xOWg3NjhxMjYgMCA0NSAxOXQxOSA0NXpNMTUzNiA2NDBxMCAtMjA5IC0xMDMgLTM4NS41dC0yNzkuNSAtMjc5LjV0LTM4NS41IC0xMDN0LTM4NS41IDEwM3QtMjc5LjUgMjc5LjV0LTEwMyAzODUuNXQxMDMgMzg1LjV0Mjc5LjUgMjc5LjV0Mzg1LjUgMTAzdDM4NS41IC0xMDN0Mjc5LjUgLTI3OS41IHQxMDMgLTM4NS41eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDU3OyIgZD0iTTExNDkgNDE0cTAgMjYgLTE5IDQ1bC0xODEgMTgxbDE4MSAxODFxMTkgMTkgMTkgNDVxMCAyNyAtMTkgNDZsLTkwIDkwcS0xOSAxOSAtNDYgMTlxLTI2IDAgLTQ1IC0xOWwtMTgxIC0xODFsLTE4MSAxODFxLTE5IDE5IC00NSAxOXEtMjcgMCAtNDYgLTE5bC05MCAtOTBxLTE5IC0xOSAtMTkgLTQ2cTAgLTI2IDE5IC00NWwxODEgLTE4MWwtMTgxIC0xODFxLTE5IC0xOSAtMTkgLTQ1cTAgLTI3IDE5IC00Nmw5MCAtOTBxMTkgLTE5IDQ2IC0xOSBxMjYgMCA0NSAxOWwxODEgMTgxbDE4MSAtMTgxcTE5IC0xOSA0NSAtMTlxMjcgMCA0NiAxOWw5MCA5MHExOSAxOSAxOSA0NnpNMTUzNiA2NDBxMCAtMjA5IC0xMDMgLTM4NS41dC0yNzkuNSAtMjc5LjV0LTM4NS41IC0xMDN0LTM4NS41IDEwM3QtMjc5LjUgMjc5LjV0LTEwMyAzODUuNXQxMDMgMzg1LjV0Mjc5LjUgMjc5LjV0Mzg1LjUgMTAzdDM4NS41IC0xMDN0Mjc5LjUgLTI3OS41dDEwMyAtMzg1LjV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwNTg7IiBkPSJNMTI4NCA4MDJxMCAyOCAtMTggNDZsLTkxIDkwcS0xOSAxOSAtNDUgMTl0LTQ1IC0xOWwtNDA4IC00MDdsLTIyNiAyMjZxLTE5IDE5IC00NSAxOXQtNDUgLTE5bC05MSAtOTBxLTE4IC0xOCAtMTggLTQ2cTAgLTI3IDE4IC00NWwzNjIgLTM2MnExOSAtMTkgNDUgLTE5cTI3IDAgNDYgMTlsNTQzIDU0M3ExOCAxOCAxOCA0NXpNMTUzNiA2NDBxMCAtMjA5IC0xMDMgLTM4NS41dC0yNzkuNSAtMjc5LjV0LTM4NS41IC0xMDN0LTM4NS41IDEwMyB0LTI3OS41IDI3OS41dC0xMDMgMzg1LjV0MTAzIDM4NS41dDI3OS41IDI3OS41dDM4NS41IDEwM3QzODUuNSAtMTAzdDI3OS41IC0yNzkuNXQxMDMgLTM4NS41eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDU5OyIgZD0iTTg5NiAxNjB2MTkycTAgMTMgLTkuNSAyMi41dC0yMi41IDkuNWgtMTkycS0xMyAwIC0yMi41IC05LjV0LTkuNSAtMjIuNXYtMTkycTAgLTEzIDkuNSAtMjIuNXQyMi41IC05LjVoMTkycTEzIDAgMjIuNSA5LjV0OS41IDIyLjV6TTExNTIgODMycTAgOTcgLTU4LjUgMTcydC0xNDQuNSAxMTEuNXQtMTgxIDM2LjV0LTE4MSAtMzYuNXQtMTQ0LjUgLTExMS41dC01OC41IC0xNzJ2LTExdi0xM3QxIC0xMS41dDMgLTExLjV0NS41IC04dDkgLTcgdDEzLjUgLTJoMTkycTE0IDAgMjMgOXQ5IDIzcTAgMTIgMTEgMjdxMTkgMzEgNTAuNSA1MHQ2Ni41IDE5cTM5IDAgODMgLTIxLjV0NDQgLTU3LjVxMCAtMzMgLTI2LjUgLTU4dC02My41IC00NHQtNzQuNSAtNDEuNXQtNjQgLTYzLjV0LTI2LjUgLTk4di0xMXYtMTN0MSAtMTEuNXQzIC0xMS41dDUuNSAtOHQ5IC03dDEzLjUgLTJoMTkycTE3IDAgMjQgMTAuNXQ4IDI0LjV0MTMuNSAzM3QzNy41IDMycTYwIDMzIDcwIDM5cTYyIDQ0IDk4LjUgMTA4IHQzNi41IDEzN3pNMTUzNiA2NDBxMCAtMjA5IC0xMDMgLTM4NS41dC0yNzkuNSAtMjc5LjV0LTM4NS41IC0xMDN0LTM4NS41IDEwM3QtMjc5LjUgMjc5LjV0LTEwMyAzODUuNXQxMDMgMzg1LjV0Mjc5LjUgMjc5LjV0Mzg1LjUgMTAzdDM4NS41IC0xMDN0Mjc5LjUgLTI3OS41dDEwMyAtMzg1LjV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwNWE7IiBkPSJNMTAyNCAxNjB2NjRxMCAxNCAtOSAyM3QtMjMgOWgtOTZ2NDgwcTAgMTQgLTkgMjN0LTIzIDloLTMyMHEtMTQgMCAtMjMgLTl0LTkgLTIzdi02NHEwIC0xNCA5IC0yM3QyMyAtOWg5NnYtMzg0aC05NnEtMTQgMCAtMjMgLTl0LTkgLTIzdi02NHEwIC0xNCA5IC0yM3QyMyAtOWg0NDhxMTQgMCAyMyA5dDkgMjN6TTg5NiA5Mjh2MTkycTAgMTQgLTkgMjN0LTIzIDloLTE5MnEtMTQgMCAtMjMgLTl0LTkgLTIzdi0xOTJxMCAtMTQgOSAtMjMgdDIzIC05aDE5MnExNCAwIDIzIDl0OSAyM3pNMTUzNiA2NDBxMCAtMjA5IC0xMDMgLTM4NS41dC0yNzkuNSAtMjc5LjV0LTM4NS41IC0xMDN0LTM4NS41IDEwM3QtMjc5LjUgMjc5LjV0LTEwMyAzODUuNXQxMDMgMzg1LjV0Mjc5LjUgMjc5LjV0Mzg1LjUgMTAzdDM4NS41IC0xMDN0Mjc5LjUgLTI3OS41dDEwMyAtMzg1LjV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwNWI7IiBkPSJNMTE5NyA1MTJoLTEwOXEtMjYgMCAtNDUgMTl0LTE5IDQ1djEyOHEwIDI2IDE5IDQ1dDQ1IDE5aDEwOXEtMzIgMTA4IC0xMTIuNSAxODguNXQtMTg4LjUgMTEyLjV2LTEwOXEwIC0yNiAtMTkgLTQ1dC00NSAtMTloLTEyOHEtMjYgMCAtNDUgMTl0LTE5IDQ1djEwOXEtMTA4IC0zMiAtMTg4LjUgLTExMi41dC0xMTIuNSAtMTg4LjVoMTA5cTI2IDAgNDUgLTE5dDE5IC00NXYtMTI4cTAgLTI2IC0xOSAtNDV0LTQ1IC0xOWgtMTA5IHEzMiAtMTA4IDExMi41IC0xODguNXQxODguNSAtMTEyLjV2MTA5cTAgMjYgMTkgNDV0NDUgMTloMTI4cTI2IDAgNDUgLTE5dDE5IC00NXYtMTA5cTEwOCAzMiAxODguNSAxMTIuNXQxMTIuNSAxODguNXpNMTUzNiA3MDR2LTEyOHEwIC0yNiAtMTkgLTQ1dC00NSAtMTloLTE0M3EtMzcgLTE2MSAtMTU0LjUgLTI3OC41dC0yNzguNSAtMTU0LjV2LTE0M3EwIC0yNiAtMTkgLTQ1dC00NSAtMTloLTEyOHEtMjYgMCAtNDUgMTl0LTE5IDQ1djE0MyBxLTE2MSAzNyAtMjc4LjUgMTU0LjV0LTE1NC41IDI3OC41aC0xNDNxLTI2IDAgLTQ1IDE5dC0xOSA0NXYxMjhxMCAyNiAxOSA0NXQ0NSAxOWgxNDNxMzcgMTYxIDE1NC41IDI3OC41dDI3OC41IDE1NC41djE0M3EwIDI2IDE5IDQ1dDQ1IDE5aDEyOHEyNiAwIDQ1IC0xOXQxOSAtNDV2LTE0M3ExNjEgLTM3IDI3OC41IC0xNTQuNXQxNTQuNSAtMjc4LjVoMTQzcTI2IDAgNDUgLTE5dDE5IC00NXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjA1YzsiIGQ9Ik0xMTI1IDQ0OHEwIC0yNyAtMTggLTQ1bC0xMDIgLTEwMnEtMTggLTE4IC00NSAtMTh0LTQ1IDE4bC0xNDcgMTQ3bC0xNDcgLTE0N3EtMTggLTE4IC00NSAtMTh0LTQ1IDE4bC0xMDIgMTAycS0xOCAxOCAtMTggNDV0MTggNDVsMTQ3IDE0N2wtMTQ3IDE0N3EtMTggMTggLTE4IDQ1dDE4IDQ1bDEwMiAxMDJxMTggMTggNDUgMTh0NDUgLTE4bDE0NyAtMTQ3bDE0NyAxNDdxMTggMTggNDUgMTh0NDUgLTE4bDEwMiAtMTAycTE4IC0xOCAxOCAtNDUgdC0xOCAtNDVsLTE0NyAtMTQ3bDE0NyAtMTQ3cTE4IC0xOCAxOCAtNDV6TTEyODAgNjQwcTAgMTA0IC00MC41IDE5OC41dC0xMDkuNSAxNjMuNXQtMTYzLjUgMTA5LjV0LTE5OC41IDQwLjV0LTE5OC41IC00MC41dC0xNjMuNSAtMTA5LjV0LTEwOS41IC0xNjMuNXQtNDAuNSAtMTk4LjV0NDAuNSAtMTk4LjV0MTA5LjUgLTE2My41dDE2My41IC0xMDkuNXQxOTguNSAtNDAuNXQxOTguNSA0MC41dDE2My41IDEwOS41dDEwOS41IDE2My41IHQ0MC41IDE5OC41ek0xNTM2IDY0MHEwIC0yMDkgLTEwMyAtMzg1LjV0LTI3OS41IC0yNzkuNXQtMzg1LjUgLTEwM3QtMzg1LjUgMTAzdC0yNzkuNSAyNzkuNXQtMTAzIDM4NS41dDEwMyAzODUuNXQyNzkuNSAyNzkuNXQzODUuNSAxMDN0Mzg1LjUgLTEwM3QyNzkuNSAtMjc5LjV0MTAzIC0zODUuNXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjA1ZDsiIGQ9Ik0xMTg5IDc2OHEwIC0yNyAtMTggLTQ1bC0zMjAgLTMyMGwtMTAyIC0xMDJxLTE4IC0xOCAtNDUgLTE4dC00NSAxOGwtMTAyIDEwMmwtMTkyIDE5MnEtMTggMTggLTE4IDQ1dDE4IDQ1bDEwMiAxMDJxMTggMTggNDUgMTh0NDUgLTE4bDE0NyAtMTQ3bDI3NSAyNzVxMTggMTggNDUgMTh0NDUgLTE4bDEwMiAtMTAycTE4IC0xOCAxOCAtNDV6TTEyODAgNjQwcTAgMTA0IC00MC41IDE5OC41dC0xMDkuNSAxNjMuNXQtMTYzLjUgMTA5LjUgdC0xOTguNSA0MC41dC0xOTguNSAtNDAuNXQtMTYzLjUgLTEwOS41dC0xMDkuNSAtMTYzLjV0LTQwLjUgLTE5OC41dDQwLjUgLTE5OC41dDEwOS41IC0xNjMuNXQxNjMuNSAtMTA5LjV0MTk4LjUgLTQwLjV0MTk4LjUgNDAuNXQxNjMuNSAxMDkuNXQxMDkuNSAxNjMuNXQ0MC41IDE5OC41ek0xNTM2IDY0MHEwIC0yMDkgLTEwMyAtMzg1LjV0LTI3OS41IC0yNzkuNXQtMzg1LjUgLTEwM3QtMzg1LjUgMTAzdC0yNzkuNSAyNzkuNXQtMTAzIDM4NS41IHQxMDMgMzg1LjV0Mjc5LjUgMjc5LjV0Mzg1LjUgMTAzdDM4NS41IC0xMDN0Mjc5LjUgLTI3OS41dDEwMyAtMzg1LjV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwNWU7IiBkPSJNMTI4MCA2NDBxMCAxMzkgLTcxIDI2MGwtNzAxIC03MDFxMTIxIC03MSAyNjAgLTcxcTEwNCAwIDE5OC41IDQwLjV0MTYzLjUgMTA5LjV0MTA5LjUgMTYzLjV0NDAuNSAxOTguNXpNMzI3IDM4MGw3MDEgNzAxcS0xMjEgNzEgLTI2MCA3MXEtMTA0IDAgLTE5OC41IC00MC41dC0xNjMuNSAtMTA5LjV0LTEwOS41IC0xNjMuNXQtNDAuNSAtMTk4LjVxMCAtMTM5IDcxIC0yNjB6TTE1MzYgNjQwcTAgLTIwOSAtMTAzIC0zODUuNSB0LTI3OS41IC0yNzkuNXQtMzg1LjUgLTEwM3QtMzg1LjUgMTAzdC0yNzkuNSAyNzkuNXQtMTAzIDM4NS41dDEwMyAzODUuNXQyNzkuNSAyNzkuNXQzODUuNSAxMDN0Mzg1LjUgLTEwM3QyNzkuNSAtMjc5LjV0MTAzIC0zODUuNXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjA2MDsiIGQ9Ik0xNTM2IDY0MHYtMTI4cTAgLTUzIC0zMi41IC05MC41dC04NC41IC0zNy41aC03MDRsMjkzIC0yOTRxMzggLTM2IDM4IC05MHQtMzggLTkwbC03NSAtNzZxLTM3IC0zNyAtOTAgLTM3cS01MiAwIC05MSAzN2wtNjUxIDY1MnEtMzcgMzcgLTM3IDkwcTAgNTIgMzcgOTFsNjUxIDY1MHEzOCAzOCA5MSAzOHE1MiAwIDkwIC0zOGw3NSAtNzRxMzggLTM4IDM4IC05MXQtMzggLTkxbC0yOTMgLTI5M2g3MDRxNTIgMCA4NC41IC0zNy41IHQzMi41IC05MC41eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDYxOyIgZD0iTTE0NzIgNTc2cTAgLTU0IC0zNyAtOTFsLTY1MSAtNjUxcS0zOSAtMzcgLTkxIC0zN3EtNTEgMCAtOTAgMzdsLTc1IDc1cS0zOCAzOCAtMzggOTF0MzggOTFsMjkzIDI5M2gtNzA0cS01MiAwIC04NC41IDM3LjV0LTMyLjUgOTAuNXYxMjhxMCA1MyAzMi41IDkwLjV0ODQuNSAzNy41aDcwNGwtMjkzIDI5NHEtMzggMzYgLTM4IDkwdDM4IDkwbDc1IDc1cTM4IDM4IDkwIDM4cTUzIDAgOTEgLTM4bDY1MSAtNjUxcTM3IC0zNSAzNyAtOTB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwNjI7IiBob3Jpei1hZHYteD0iMTY2NCIgZD0iTTE2MTEgNTY1cTAgLTUxIC0zNyAtOTBsLTc1IC03NXEtMzggLTM4IC05MSAtMzhxLTU0IDAgLTkwIDM4bC0yOTQgMjkzdi03MDRxMCAtNTIgLTM3LjUgLTg0LjV0LTkwLjUgLTMyLjVoLTEyOHEtNTMgMCAtOTAuNSAzMi41dC0zNy41IDg0LjV2NzA0bC0yOTQgLTI5M3EtMzYgLTM4IC05MCAtMzh0LTkwIDM4bC03NSA3NXEtMzggMzggLTM4IDkwcTAgNTMgMzggOTFsNjUxIDY1MXEzNSAzNyA5MCAzN3E1NCAwIDkxIC0zN2w2NTEgLTY1MSBxMzcgLTM5IDM3IC05MXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjA2MzsiIGhvcml6LWFkdi14PSIxNjY0IiBkPSJNMTYxMSA3MDRxMCAtNTMgLTM3IC05MGwtNjUxIC02NTJxLTM5IC0zNyAtOTEgLTM3cS01MyAwIC05MCAzN2wtNjUxIDY1MnEtMzggMzYgLTM4IDkwcTAgNTMgMzggOTFsNzQgNzVxMzkgMzcgOTEgMzdxNTMgMCA5MCAtMzdsMjk0IC0yOTR2NzA0cTAgNTIgMzggOTB0OTAgMzhoMTI4cTUyIDAgOTAgLTM4dDM4IC05MHYtNzA0bDI5NCAyOTRxMzcgMzcgOTAgMzdxNTIgMCA5MSAtMzdsNzUgLTc1cTM3IC0zOSAzNyAtOTF6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwNjQ7IiBob3Jpei1hZHYteD0iMTc5MiIgZD0iTTE3OTIgODk2cTAgLTI2IC0xOSAtNDVsLTUxMiAtNTEycS0xOSAtMTkgLTQ1IC0xOXQtNDUgMTl0LTE5IDQ1djI1NmgtMjI0cS05OCAwIC0xNzUuNSAtNnQtMTU0IC0yMS41dC0xMzMgLTQyLjV0LTEwNS41IC02OS41dC04MCAtMTAxdC00OC41IC0xMzguNXQtMTcuNSAtMTgxcTAgLTU1IDUgLTEyM3EwIC02IDIuNSAtMjMuNXQyLjUgLTI2LjVxMCAtMTUgLTguNSAtMjV0LTIzLjUgLTEwcS0xNiAwIC0yOCAxN3EtNyA5IC0xMyAyMiB0LTEzLjUgMzB0LTEwLjUgMjRxLTEyNyAyODUgLTEyNyA0NTFxMCAxOTkgNTMgMzMzcTE2MiA0MDMgODc1IDQwM2gyMjR2MjU2cTAgMjYgMTkgNDV0NDUgMTl0NDUgLTE5bDUxMiAtNTEycTE5IC0xOSAxOSAtNDV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwNjU7IiBkPSJNNzU1IDQ4MHEwIC0xMyAtMTAgLTIzbC0zMzIgLTMzMmwxNDQgLTE0NHExOSAtMTkgMTkgLTQ1dC0xOSAtNDV0LTQ1IC0xOWgtNDQ4cS0yNiAwIC00NSAxOXQtMTkgNDV2NDQ4cTAgMjYgMTkgNDV0NDUgMTl0NDUgLTE5bDE0NCAtMTQ0bDMzMiAzMzJxMTAgMTAgMjMgMTB0MjMgLTEwbDExNCAtMTE0cTEwIC0xMCAxMCAtMjN6TTE1MzYgMTM0NHYtNDQ4cTAgLTI2IC0xOSAtNDV0LTQ1IC0xOXQtNDUgMTlsLTE0NCAxNDRsLTMzMiAtMzMyIHEtMTAgLTEwIC0yMyAtMTB0LTIzIDEwbC0xMTQgMTE0cS0xMCAxMCAtMTAgMjN0MTAgMjNsMzMyIDMzMmwtMTQ0IDE0NHEtMTkgMTkgLTE5IDQ1dDE5IDQ1dDQ1IDE5aDQ0OHEyNiAwIDQ1IC0xOXQxOSAtNDV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwNjY7IiBkPSJNNzY4IDU3NnYtNDQ4cTAgLTI2IC0xOSAtNDV0LTQ1IC0xOXQtNDUgMTlsLTE0NCAxNDRsLTMzMiAtMzMycS0xMCAtMTAgLTIzIC0xMHQtMjMgMTBsLTExNCAxMTRxLTEwIDEwIC0xMCAyM3QxMCAyM2wzMzIgMzMybC0xNDQgMTQ0cS0xOSAxOSAtMTkgNDV0MTkgNDV0NDUgMTloNDQ4cTI2IDAgNDUgLTE5dDE5IC00NXpNMTUyMyAxMjQ4cTAgLTEzIC0xMCAtMjNsLTMzMiAtMzMybDE0NCAtMTQ0cTE5IC0xOSAxOSAtNDV0LTE5IC00NSB0LTQ1IC0xOWgtNDQ4cS0yNiAwIC00NSAxOXQtMTkgNDV2NDQ4cTAgMjYgMTkgNDV0NDUgMTl0NDUgLTE5bDE0NCAtMTQ0bDMzMiAzMzJxMTAgMTAgMjMgMTB0MjMgLTEwbDExNCAtMTE0cTEwIC0xMCAxMCAtMjN6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwNjc7IiBob3Jpei1hZHYteD0iMTQwOCIgZD0iTTE0MDggODAwdi0xOTJxMCAtNDAgLTI4IC02OHQtNjggLTI4aC00MTZ2LTQxNnEwIC00MCAtMjggLTY4dC02OCAtMjhoLTE5MnEtNDAgMCAtNjggMjh0LTI4IDY4djQxNmgtNDE2cS00MCAwIC02OCAyOHQtMjggNjh2MTkycTAgNDAgMjggNjh0NjggMjhoNDE2djQxNnEwIDQwIDI4IDY4dDY4IDI4aDE5MnE0MCAwIDY4IC0yOHQyOCAtNjh2LTQxNmg0MTZxNDAgMCA2OCAtMjh0MjggLTY4eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDY4OyIgaG9yaXotYWR2LXg9IjE0MDgiIGQ9Ik0xNDA4IDgwMHYtMTkycTAgLTQwIC0yOCAtNjh0LTY4IC0yOGgtMTIxNnEtNDAgMCAtNjggMjh0LTI4IDY4djE5MnEwIDQwIDI4IDY4dDY4IDI4aDEyMTZxNDAgMCA2OCAtMjh0MjggLTY4eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDY5OyIgaG9yaXotYWR2LXg9IjE2NjQiIGQ9Ik0xNDgyIDQ4NnE0NiAtMjYgNTkuNSAtNzcuNXQtMTIuNSAtOTcuNWwtNjQgLTExMHEtMjYgLTQ2IC03Ny41IC01OS41dC05Ny41IDEyLjVsLTI2NiAxNTN2LTMwN3EwIC01MiAtMzggLTkwdC05MCAtMzhoLTEyOHEtNTIgMCAtOTAgMzh0LTM4IDkwdjMwN2wtMjY2IC0xNTNxLTQ2IC0yNiAtOTcuNSAtMTIuNXQtNzcuNSA1OS41bC02NCAxMTBxLTI2IDQ2IC0xMi41IDk3LjV0NTkuNSA3Ny41bDI2NiAxNTRsLTI2NiAxNTQgcS00NiAyNiAtNTkuNSA3Ny41dDEyLjUgOTcuNWw2NCAxMTBxMjYgNDYgNzcuNSA1OS41dDk3LjUgLTEyLjVsMjY2IC0xNTN2MzA3cTAgNTIgMzggOTB0OTAgMzhoMTI4cTUyIDAgOTAgLTM4dDM4IC05MHYtMzA3bDI2NiAxNTNxNDYgMjYgOTcuNSAxMi41dDc3LjUgLTU5LjVsNjQgLTExMHEyNiAtNDYgMTIuNSAtOTcuNXQtNTkuNSAtNzcuNWwtMjY2IC0xNTR6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwNmE7IiBkPSJNNzY4IDE0MDhxMjA5IDAgMzg1LjUgLTEwM3QyNzkuNSAtMjc5LjV0MTAzIC0zODUuNXQtMTAzIC0zODUuNXQtMjc5LjUgLTI3OS41dC0zODUuNSAtMTAzdC0zODUuNSAxMDN0LTI3OS41IDI3OS41dC0xMDMgMzg1LjV0MTAzIDM4NS41dDI3OS41IDI3OS41dDM4NS41IDEwM3pNODk2IDE2MXYxOTBxMCAxNCAtOSAyMy41dC0yMiA5LjVoLTE5MnEtMTMgMCAtMjMgLTEwdC0xMCAtMjN2LTE5MHEwIC0xMyAxMCAtMjN0MjMgLTEwaDE5MiBxMTMgMCAyMiA5LjV0OSAyMy41ek04OTQgNTA1bDE4IDYyMXEwIDEyIC0xMCAxOHEtMTAgOCAtMjQgOGgtMjIwcS0xNCAwIC0yNCAtOHEtMTAgLTYgLTEwIC0xOGwxNyAtNjIxcTAgLTEwIDEwIC0xNy41dDI0IC03LjVoMTg1cTE0IDAgMjMuNSA3LjV0MTAuNSAxNy41eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDZiOyIgZD0iTTkyOCAxODB2NzE2aC0zMjB2LTcxNnEwIC0yNSAxOC41IC0zOC41dDQ1LjUgLTEzLjVoMTkycTI3IDAgNDUuNSAxMy41dDE4LjUgMzguNXpNNDcyIDEwMjRoMTk1bC0xMjYgMTYxcS0yNCAzMSAtNjkgMzFxLTQwIDAgLTY4IC0yOHQtMjggLTY4dDI4IC02OHQ2OCAtMjh6TTExNjAgMTEyMHEwIDQwIC0yOCA2OHQtNjggMjhxLTQ1IDAgLTY5IC0zMWwtMTI1IC0xNjFoMTk0cTQwIDAgNjggMjh0MjggNjh6TTE1MzYgODY0di0zMjAgcTAgLTE0IC0xMCAtMjJ0LTI3IC0xMC41dC0zMiAtMi41dC0zNC41IDEuNXQtMjQuNSAxLjV2LTQxNnEwIC00MCAtMjggLTY4dC02OCAtMjhoLTEwODhxLTQwIDAgLTY4IDI4dC0yOCA2OHY0MTZxLTUgMCAtMjQuNSAtMS41dC0zNC41IC0xLjV0LTMyIDIuNXQtMjcgMTAuNXQtMTAgMjJ2MzIwcTAgMTMgOS41IDIyLjV0MjIuNSA5LjVoNDQwcS05MyAwIC0xNTguNSA2NS41dC02NS41IDE1OC41dDY1LjUgMTU4LjV0MTU4LjUgNjUuNSBxMTA4IDAgMTY4IC03N2wxMjggLTE2NWwxMjggMTY1cTYwIDc3IDE2OCA3N3E5MyAwIDE1OC41IC02NS41dDY1LjUgLTE1OC41dC02NS41IC0xNTguNXQtMTU4LjUgLTY1LjVoNDQwcTEzIDAgMjIuNSAtOS41dDkuNSAtMjIuNXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjA2YzsiIGhvcml6LWFkdi14PSIxNzkyIiBkPSJNMTI4MCA4MzJxMCAyNiAtMTkgNDV0LTQ1IDE5cS0xNzIgMCAtMzE4IC00OS41dC0yNTkuNSAtMTM0dC0yMzUuNSAtMjE5LjVxLTE5IC0yMSAtMTkgLTQ1cTAgLTI2IDE5IC00NXQ0NSAtMTlxMjQgMCA0NSAxOXEyNyAyNCA3NCA3MXQ2NyA2NnExMzcgMTI0IDI2OC41IDE3NnQzMTMuNSA1MnEyNiAwIDQ1IDE5dDE5IDQ1ek0xNzkyIDEwMzBxMCAtOTUgLTIwIC0xOTNxLTQ2IC0yMjQgLTE4NC41IC0zODN0LTM1Ny41IC0yNjggcS0yMTQgLTEwOCAtNDM4IC0xMDhxLTE0OCAwIC0yODYgNDdxLTE1IDUgLTg4IDQydC05NiAzN3EtMTYgMCAtMzkuNSAtMzJ0LTQ1IC03MHQtNTIuNSAtNzB0LTYwIC0zMnEtMzAgMCAtNTEgMTF0LTMxIDI0dC0yNyA0MnEtMiA0IC02IDExdC01LjUgMTB0LTMgOS41dC0xLjUgMTMuNXEwIDM1IDMxIDczLjV0NjggNjUuNXQ2OCA1NnQzMSA0OHEwIDQgLTE0IDM4dC0xNiA0NHEtOSA1MSAtOSAxMDRxMCAxMTUgNDMuNSAyMjB0MTE5IDE4NC41IHQxNzAuNSAxMzl0MjA0IDk1LjVxNTUgMTggMTQ1IDI1LjV0MTc5LjUgOXQxNzguNSA2dDE2My41IDI0dDExMy41IDU2LjVsMjkuNSAyOS41dDI5LjUgMjh0MjcgMjB0MzYuNSAxNnQ0My41IDQuNXEzOSAwIDcwLjUgLTQ2dDQ3LjUgLTExMnQyNCAtMTI0dDggLTk2eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDZkOyIgaG9yaXotYWR2LXg9IjE0MDgiIGQ9Ik0xNDA4IC0xNjB2LTY0cTAgLTEzIC05LjUgLTIyLjV0LTIyLjUgLTkuNWgtMTM0NHEtMTMgMCAtMjIuNSA5LjV0LTkuNSAyMi41djY0cTAgMTMgOS41IDIyLjV0MjIuNSA5LjVoMTM0NHExMyAwIDIyLjUgLTkuNXQ5LjUgLTIyLjV6TTExNTIgODk2cTAgLTc4IC0yNC41IC0xNDR0LTY0IC0xMTIuNXQtODcuNSAtODh0LTk2IC03Ny41dC04Ny41IC03MnQtNjQgLTgxLjV0LTI0LjUgLTk2LjVxMCAtOTYgNjcgLTIyNGwtNCAxbDEgLTEgcS05MCA0MSAtMTYwIDgzdC0xMzguNSAxMDB0LTExMy41IDEyMi41dC03Mi41IDE1MC41dC0yNy41IDE4NHEwIDc4IDI0LjUgMTQ0dDY0IDExMi41dDg3LjUgODh0OTYgNzcuNXQ4Ny41IDcydDY0IDgxLjV0MjQuNSA5Ni41cTAgOTQgLTY2IDIyNGwzIC0xbC0xIDFxOTAgLTQxIDE2MCAtODN0MTM4LjUgLTEwMHQxMTMuNSAtMTIyLjV0NzIuNSAtMTUwLjV0MjcuNSAtMTg0eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDZlOyIgaG9yaXotYWR2LXg9IjE3OTIiIGQ9Ik0xNjY0IDU3NnEtMTUyIDIzNiAtMzgxIDM1M3E2MSAtMTA0IDYxIC0yMjVxMCAtMTg1IC0xMzEuNSAtMzE2LjV0LTMxNi41IC0xMzEuNXQtMzE2LjUgMTMxLjV0LTEzMS41IDMxNi41cTAgMTIxIDYxIDIyNXEtMjI5IC0xMTcgLTM4MSAtMzUzcTEzMyAtMjA1IDMzMy41IC0zMjYuNXQ0MzQuNSAtMTIxLjV0NDM0LjUgMTIxLjV0MzMzLjUgMzI2LjV6TTk0NCA5NjBxMCAyMCAtMTQgMzR0LTM0IDE0cS0xMjUgMCAtMjE0LjUgLTg5LjUgdC04OS41IC0yMTQuNXEwIC0yMCAxNCAtMzR0MzQgLTE0dDM0IDE0dDE0IDM0cTAgODYgNjEgMTQ3dDE0NyA2MXEyMCAwIDM0IDE0dDE0IDM0ek0xNzkyIDU3NnEwIC0zNCAtMjAgLTY5cS0xNDAgLTIzMCAtMzc2LjUgLTM2OC41dC00OTkuNSAtMTM4LjV0LTQ5OS41IDEzOXQtMzc2LjUgMzY4cS0yMCAzNSAtMjAgNjl0MjAgNjlxMTQwIDIyOSAzNzYuNSAzNjh0NDk5LjUgMTM5dDQ5OS41IC0xMzl0Mzc2LjUgLTM2OHEyMCAtMzUgMjAgLTY5eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDcwOyIgaG9yaXotYWR2LXg9IjE3OTIiIGQ9Ik01NTUgMjAxbDc4IDE0MXEtODcgNjMgLTEzNiAxNTl0LTQ5IDIwM3EwIDEyMSA2MSAyMjVxLTIyOSAtMTE3IC0zODEgLTM1M3ExNjcgLTI1OCA0MjcgLTM3NXpNOTQ0IDk2MHEwIDIwIC0xNCAzNHQtMzQgMTRxLTEyNSAwIC0yMTQuNSAtODkuNXQtODkuNSAtMjE0LjVxMCAtMjAgMTQgLTM0dDM0IC0xNHQzNCAxNHQxNCAzNHEwIDg2IDYxIDE0N3QxNDcgNjFxMjAgMCAzNCAxNHQxNCAzNHpNMTMwNyAxMTUxcTAgLTcgLTEgLTkgcS0xMDUgLTE4OCAtMzE1IC01NjZ0LTMxNiAtNTY3bC00OSAtODlxLTEwIC0xNiAtMjggLTE2cS0xMiAwIC0xMzQgNzBxLTE2IDEwIC0xNiAyOHEwIDEyIDQ0IDg3cS0xNDMgNjUgLTI2My41IDE3M3QtMjA4LjUgMjQ1cS0yMCAzMSAtMjAgNjl0MjAgNjlxMTUzIDIzNSAzODAgMzcxdDQ5NiAxMzZxODkgMCAxODAgLTE3bDU0IDk3cTEwIDE2IDI4IDE2cTUgMCAxOCAtNnQzMSAtMTUuNXQzMyAtMTguNXQzMS41IC0xOC41dDE5LjUgLTExLjUgcTE2IC0xMCAxNiAtMjd6TTEzNDQgNzA0cTAgLTEzOSAtNzkgLTI1My41dC0yMDkgLTE2NC41bDI4MCA1MDJxOCAtNDUgOCAtODR6TTE3OTIgNTc2cTAgLTM1IC0yMCAtNjlxLTM5IC02NCAtMTA5IC0xNDVxLTE1MCAtMTcyIC0zNDcuNSAtMjY3dC00MTkuNSAtOTVsNzQgMTMycTIxMiAxOCAzOTIuNSAxMzd0MzAxLjUgMzA3cS0xMTUgMTc5IC0yODIgMjk0bDYzIDExMnE5NSAtNjQgMTgyLjUgLTE1M3QxNDQuNSAtMTg0cTIwIC0zNCAyMCAtNjl6ICIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDcxOyIgaG9yaXotYWR2LXg9IjE3OTIiIGQ9Ik0xMDI0IDE2MXYxOTBxMCAxNCAtOS41IDIzLjV0LTIyLjUgOS41aC0xOTJxLTEzIDAgLTIyLjUgLTkuNXQtOS41IC0yMy41di0xOTBxMCAtMTQgOS41IC0yMy41dDIyLjUgLTkuNWgxOTJxMTMgMCAyMi41IDkuNXQ5LjUgMjMuNXpNMTAyMiA1MzVsMTggNDU5cTAgMTIgLTEwIDE5cS0xMyAxMSAtMjQgMTFoLTIyMHEtMTEgMCAtMjQgLTExcS0xMCAtNyAtMTAgLTIxbDE3IC00NTdxMCAtMTAgMTAgLTE2LjV0MjQgLTYuNWgxODUgcTE0IDAgMjMuNSA2LjV0MTAuNSAxNi41ek0xMDA4IDE0NjlsNzY4IC0xNDA4cTM1IC02MyAtMiAtMTI2cS0xNyAtMjkgLTQ2LjUgLTQ2dC02My41IC0xN2gtMTUzNnEtMzQgMCAtNjMuNSAxN3QtNDYuNSA0NnEtMzcgNjMgLTIgMTI2bDc2OCAxNDA4cTE3IDMxIDQ3IDQ5dDY1IDE4dDY1IC0xOHQ0NyAtNDl6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwNzI7IiBob3Jpei1hZHYteD0iMTQwOCIgZD0iTTEzOTcgMTMyNHEwIC04NyAtMTQ5IC0yMzZsLTI0MCAtMjQwbDE0MyAtNzQ2bDEgLTZxMCAtMTQgLTkgLTIzbC02NCAtNjRxLTkgLTkgLTIzIC05cS0yMSAwIC0yOSAxOGwtMjc0IDU3NWwtMjQ1IC0yNDVxNjggLTIzOCA2OCAtMjUydC05IC0yM2wtNjQgLTY0cS05IC05IC0yMyAtOXEtMTggMCAtMjggMTZsLTE1NSAyODBsLTI4MCAxNTVxLTE3IDkgLTE3IDI4cTAgMTQgOSAyM2w2NCA2NXE5IDkgMjMgOXQyNTIgLTY4bDI0NSAyNDUgbC01NzUgMjc0cS0xOCA4IC0xOCAyOXEwIDE0IDkgMjNsNjQgNjRxOSA5IDIzIDlxNCAwIDYgLTFsNzQ2IC0xNDNsMjQwIDI0MHExNDkgMTQ5IDIzNiAxNDlxMzIgMCA1Mi41IC0yMC41dDIwLjUgLTUyLjV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwNzM7IiBob3Jpei1hZHYteD0iMTY2NCIgZD0iTTEyOCAtMTI4aDI4OHYyODhoLTI4OHYtMjg4ek00ODAgLTEyOGgzMjB2Mjg4aC0zMjB2LTI4OHpNMTI4IDIyNGgyODh2MzIwaC0yODh2LTMyMHpNNDgwIDIyNGgzMjB2MzIwaC0zMjB2LTMyMHpNMTI4IDYwOGgyODh2Mjg4aC0yODh2LTI4OHpNODY0IC0xMjhoMzIwdjI4OGgtMzIwdi0yODh6TTQ4MCA2MDhoMzIwdjI4OGgtMzIwdi0yODh6TTEyNDggLTEyOGgyODh2Mjg4aC0yODh2LTI4OHpNODY0IDIyNGgzMjB2MzIwaC0zMjB2LTMyMHogTTUxMiAxMDg4djI4OHEwIDEzIC05LjUgMjIuNXQtMjIuNSA5LjVoLTY0cS0xMyAwIC0yMi41IC05LjV0LTkuNSAtMjIuNXYtMjg4cTAgLTEzIDkuNSAtMjIuNXQyMi41IC05LjVoNjRxMTMgMCAyMi41IDkuNXQ5LjUgMjIuNXpNMTI0OCAyMjRoMjg4djMyMGgtMjg4di0zMjB6TTg2NCA2MDhoMzIwdjI4OGgtMzIwdi0yODh6TTEyNDggNjA4aDI4OHYyODhoLTI4OHYtMjg4ek0xMjgwIDEwODh2Mjg4cTAgMTMgLTkuNSAyMi41dC0yMi41IDkuNWgtNjQgcS0xMyAwIC0yMi41IC05LjV0LTkuNSAtMjIuNXYtMjg4cTAgLTEzIDkuNSAtMjIuNXQyMi41IC05LjVoNjRxMTMgMCAyMi41IDkuNXQ5LjUgMjIuNXpNMTY2NCAxMTUydi0xMjgwcTAgLTUyIC0zOCAtOTB0LTkwIC0zOGgtMTQwOHEtNTIgMCAtOTAgMzh0LTM4IDkwdjEyODBxMCA1MiAzOCA5MHQ5MCAzOGgxMjh2OTZxMCA2NiA0NyAxMTN0MTEzIDQ3aDY0cTY2IDAgMTEzIC00N3Q0NyAtMTEzdi05NmgzODR2OTZxMCA2NiA0NyAxMTN0MTEzIDQ3IGg2NHE2NiAwIDExMyAtNDd0NDcgLTExM3YtOTZoMTI4cTUyIDAgOTAgLTM4dDM4IC05MHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjA3NDsiIGhvcml6LWFkdi14PSIxNzkyIiBkPSJNNjY2IDEwNTVxLTYwIC05MiAtMTM3IC0yNzNxLTIyIDQ1IC0zNyA3Mi41dC00MC41IDYzLjV0LTUxIDU2LjV0LTYzIDM1dC04MS41IDE0LjVoLTIyNHEtMTQgMCAtMjMgOXQtOSAyM3YxOTJxMCAxNCA5IDIzdDIzIDloMjI0cTI1MCAwIDQxMCAtMjI1ek0xNzkyIDI1NnEwIC0xNCAtOSAtMjNsLTMyMCAtMzIwcS05IC05IC0yMyAtOXEtMTMgMCAtMjIuNSA5LjV0LTkuNSAyMi41djE5MnEtMzIgMCAtODUgLTAuNXQtODEgLTF0LTczIDEgdC03MSA1dC02NCAxMC41dC02MyAxOC41dC01OCAyOC41dC01OSA0MHQtNTUgNTMuNXQtNTYgNjkuNXE1OSA5MyAxMzYgMjczcTIyIC00NSAzNyAtNzIuNXQ0MC41IC02My41dDUxIC01Ni41dDYzIC0zNXQ4MS41IC0xNC41aDI1NnYxOTJxMCAxNCA5IDIzdDIzIDlxMTIgMCAyNCAtMTBsMzE5IC0zMTlxOSAtOSA5IC0yM3pNMTc5MiAxMTUycTAgLTE0IC05IC0yM2wtMzIwIC0zMjBxLTkgLTkgLTIzIC05cS0xMyAwIC0yMi41IDkuNXQtOS41IDIyLjUgdjE5MmgtMjU2cS00OCAwIC04NyAtMTV0LTY5IC00NXQtNTEgLTYxLjV0LTQ1IC03Ny41cS0zMiAtNjIgLTc4IC0xNzFxLTI5IC02NiAtNDkuNSAtMTExdC01NCAtMTA1dC02NCAtMTAwdC03NCAtODN0LTkwIC02OC41dC0xMDYuNSAtNDJ0LTEyOCAtMTYuNWgtMjI0cS0xNCAwIC0yMyA5dC05IDIzdjE5MnEwIDE0IDkgMjN0MjMgOWgyMjRxNDggMCA4NyAxNXQ2OSA0NXQ1MSA2MS41dDQ1IDc3LjVxMzIgNjIgNzggMTcxcTI5IDY2IDQ5LjUgMTExIHQ1NCAxMDV0NjQgMTAwdDc0IDgzdDkwIDY4LjV0MTA2LjUgNDJ0MTI4IDE2LjVoMjU2djE5MnEwIDE0IDkgMjN0MjMgOXExMiAwIDI0IC0xMGwzMTkgLTMxOXE5IC05IDkgLTIzeiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDc1OyIgaG9yaXotYWR2LXg9IjE3OTIiIGQ9Ik0xNzkyIDY0MHEwIC0xNzQgLTEyMCAtMzIxLjV0LTMyNiAtMjMzdC00NTAgLTg1LjVxLTcwIDAgLTE0NSA4cS0xOTggLTE3NSAtNDYwIC0yNDJxLTQ5IC0xNCAtMTE0IC0yMnEtMTcgLTIgLTMwLjUgOXQtMTcuNSAyOXYxcS0zIDQgLTAuNSAxMnQyIDEwdDQuNSA5LjVsNiA5dDcgOC41dDggOXE3IDggMzEgMzQuNXQzNC41IDM4dDMxIDM5LjV0MzIuNSA1MXQyNyA1OXQyNiA3NnEtMTU3IDg5IC0yNDcuNSAyMjB0LTkwLjUgMjgxIHEwIDEzMCA3MSAyNDguNXQxOTEgMjA0LjV0Mjg2IDEzNi41dDM0OCA1MC41cTI0NCAwIDQ1MCAtODUuNXQzMjYgLTIzM3QxMjAgLTMyMS41eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDc2OyIgZD0iTTE1MzYgNzA0di0xMjhxMCAtMjAxIC05OC41IC0zNjJ0LTI3NCAtMjUxLjV0LTM5NS41IC05MC41dC0zOTUuNSA5MC41dC0yNzQgMjUxLjV0LTk4LjUgMzYydjEyOHEwIDI2IDE5IDQ1dDQ1IDE5aDM4NHEyNiAwIDQ1IC0xOXQxOSAtNDV2LTEyOHEwIC01MiAyMy41IC05MHQ1My41IC01N3Q3MSAtMzB0NjQgLTEzdDQ0IC0ydDQ0IDJ0NjQgMTN0NzEgMzB0NTMuNSA1N3QyMy41IDkwdjEyOHEwIDI2IDE5IDQ1dDQ1IDE5aDM4NCBxMjYgMCA0NSAtMTl0MTkgLTQ1ek01MTIgMTM0NHYtMzg0cTAgLTI2IC0xOSAtNDV0LTQ1IC0xOWgtMzg0cS0yNiAwIC00NSAxOXQtMTkgNDV2Mzg0cTAgMjYgMTkgNDV0NDUgMTloMzg0cTI2IDAgNDUgLTE5dDE5IC00NXpNMTUzNiAxMzQ0di0zODRxMCAtMjYgLTE5IC00NXQtNDUgLTE5aC0zODRxLTI2IDAgLTQ1IDE5dC0xOSA0NXYzODRxMCAyNiAxOSA0NXQ0NSAxOWgzODRxMjYgMCA0NSAtMTl0MTkgLTQ1eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDc3OyIgaG9yaXotYWR2LXg9IjE2NjQiIGQ9Ik0xNjExIDMyMHEwIC01MyAtMzcgLTkwbC03NSAtNzVxLTM4IC0zOCAtOTEgLTM4cS01NCAwIC05MCAzOGwtNDg2IDQ4NWwtNDg2IC00ODVxLTM2IC0zOCAtOTAgLTM4dC05MCAzOGwtNzUgNzVxLTM4IDM2IC0zOCA5MHEwIDUzIDM4IDkxbDY1MSA2NTFxMzcgMzcgOTAgMzdxNTIgMCA5MSAtMzdsNjUwIC02NTFxMzggLTM4IDM4IC05MXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjA3ODsiIGhvcml6LWFkdi14PSIxNjY0IiBkPSJNMTYxMSA4MzJxMCAtNTMgLTM3IC05MGwtNjUxIC02NTFxLTM4IC0zOCAtOTEgLTM4cS01NCAwIC05MCAzOGwtNjUxIDY1MXEtMzggMzYgLTM4IDkwcTAgNTMgMzggOTFsNzQgNzVxMzkgMzcgOTEgMzdxNTMgMCA5MCAtMzdsNDg2IC00ODZsNDg2IDQ4NnEzNyAzNyA5MCAzN3E1MiAwIDkxIC0zN2w3NSAtNzVxMzcgLTM5IDM3IC05MXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjA3OTsiIGhvcml6LWFkdi14PSIxOTIwIiBkPSJNMTI4MCAzMnEwIC0xMyAtOS41IC0yMi41dC0yMi41IC05LjVoLTk2MHEtOCAwIC0xMy41IDJ0LTkgN3QtNS41IDh0LTMgMTEuNXQtMSAxMS41djEzdjExdjE2MHY0MTZoLTE5MnEtMjYgMCAtNDUgMTl0LTE5IDQ1cTAgMjQgMTUgNDFsMzIwIDM4NHExOSAyMiA0OSAyMnQ0OSAtMjJsMzIwIC0zODRxMTUgLTE3IDE1IC00MXEwIC0yNiAtMTkgLTQ1dC00NSAtMTloLTE5MnYtMzg0aDU3NnExNiAwIDI1IC0xMWwxNjAgLTE5MnE3IC0xMSA3IC0yMSB6TTE5MjAgNDQ4cTAgLTI0IC0xNSAtNDFsLTMyMCAtMzg0cS0yMCAtMjMgLTQ5IC0yM3QtNDkgMjNsLTMyMCAzODRxLTE1IDE3IC0xNSA0MXEwIDI2IDE5IDQ1dDQ1IDE5aDE5MnYzODRoLTU3NnEtMTYgMCAtMjUgMTJsLTE2MCAxOTJxLTcgOSAtNyAyMHEwIDEzIDkuNSAyMi41dDIyLjUgOS41aDk2MHE4IDAgMTMuNSAtMnQ5IC03dDUuNSAtOHQzIC0xMS41dDEgLTExLjV2LTEzdi0xMXYtMTYwdi00MTZoMTkycTI2IDAgNDUgLTE5dDE5IC00NXogIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwN2E7IiBob3Jpei1hZHYteD0iMTY2NCIgZD0iTTY0MCAwcTAgLTUzIC0zNy41IC05MC41dC05MC41IC0zNy41dC05MC41IDM3LjV0LTM3LjUgOTAuNXQzNy41IDkwLjV0OTAuNSAzNy41dDkwLjUgLTM3LjV0MzcuNSAtOTAuNXpNMTUzNiAwcTAgLTUzIC0zNy41IC05MC41dC05MC41IC0zNy41dC05MC41IDM3LjV0LTM3LjUgOTAuNXQzNy41IDkwLjV0OTAuNSAzNy41dDkwLjUgLTM3LjV0MzcuNSAtOTAuNXpNMTY2NCAxMDg4di01MTJxMCAtMjQgLTE2IC00Mi41dC00MSAtMjEuNSBsLTEwNDQgLTEyMnExIC03IDQuNSAtMjEuNXQ2IC0yNi41dDIuNSAtMjJxMCAtMTYgLTI0IC02NGg5MjBxMjYgMCA0NSAtMTl0MTkgLTQ1dC0xOSAtNDV0LTQ1IC0xOWgtMTAyNHEtMjYgMCAtNDUgMTl0LTE5IDQ1cTAgMTQgMTEgMzkuNXQyOS41IDU5LjV0MjAuNSAzOGwtMTc3IDgyM2gtMjA0cS0yNiAwIC00NSAxOXQtMTkgNDV0MTkgNDV0NDUgMTloMjU2cTE2IDAgMjguNSAtNi41dDIwIC0xNS41dDEzIC0yNC41dDcuNSAtMjYuNSB0NS41IC0yOS41dDQuNSAtMjUuNWgxMjAxcTI2IDAgNDUgLTE5dDE5IC00NXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjA3YjsiIGhvcml6LWFkdi14PSIxNjY0IiBkPSJNMTY2NCA5Mjh2LTcwNHEwIC05MiAtNjYgLTE1OHQtMTU4IC02NmgtMTIxNnEtOTIgMCAtMTU4IDY2dC02NiAxNTh2OTYwcTAgOTIgNjYgMTU4dDE1OCA2NmgzMjBxOTIgMCAxNTggLTY2dDY2IC0xNTh2LTMyaDY3MnE5MiAwIDE1OCAtNjZ0NjYgLTE1OHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjA3YzsiIGhvcml6LWFkdi14PSIxOTIwIiBkPSJNMTg3OSA1ODRxMCAtMzEgLTMxIC02NmwtMzM2IC0zOTZxLTQzIC01MSAtMTIwLjUgLTg2LjV0LTE0My41IC0zNS41aC0xMDg4cS0zNCAwIC02MC41IDEzdC0yNi41IDQzcTAgMzEgMzEgNjZsMzM2IDM5NnE0MyA1MSAxMjAuNSA4Ni41dDE0My41IDM1LjVoMTA4OHEzNCAwIDYwLjUgLTEzdDI2LjUgLTQzek0xNTM2IDkyOHYtMTYwaC04MzJxLTk0IDAgLTE5NyAtNDcuNXQtMTY0IC0xMTkuNWwtMzM3IC0zOTZsLTUgLTZxMCA0IC0wLjUgMTIuNSB0LTAuNSAxMi41djk2MHEwIDkyIDY2IDE1OHQxNTggNjZoMzIwcTkyIDAgMTU4IC02NnQ2NiAtMTU4di0zMmg1NDRxOTIgMCAxNTggLTY2dDY2IC0xNTh6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwN2Q7IiBob3Jpei1hZHYteD0iNzY4IiBkPSJNNzA0IDEyMTZxMCAtMjYgLTE5IC00NXQtNDUgLTE5aC0xMjh2LTEwMjRoMTI4cTI2IDAgNDUgLTE5dDE5IC00NXQtMTkgLTQ1bC0yNTYgLTI1NnEtMTkgLTE5IC00NSAtMTl0LTQ1IDE5bC0yNTYgMjU2cS0xOSAxOSAtMTkgNDV0MTkgNDV0NDUgMTloMTI4djEwMjRoLTEyOHEtMjYgMCAtNDUgMTl0LTE5IDQ1dDE5IDQ1bDI1NiAyNTZxMTkgMTkgNDUgMTl0NDUgLTE5bDI1NiAtMjU2cTE5IC0xOSAxOSAtNDV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwN2U7IiBob3Jpei1hZHYteD0iMTc5MiIgZD0iTTE3OTIgNjQwcTAgLTI2IC0xOSAtNDVsLTI1NiAtMjU2cS0xOSAtMTkgLTQ1IC0xOXQtNDUgMTl0LTE5IDQ1djEyOGgtMTAyNHYtMTI4cTAgLTI2IC0xOSAtNDV0LTQ1IC0xOXQtNDUgMTlsLTI1NiAyNTZxLTE5IDE5IC0xOSA0NXQxOSA0NWwyNTYgMjU2cTE5IDE5IDQ1IDE5dDQ1IC0xOXQxOSAtNDV2LTEyOGgxMDI0djEyOHEwIDI2IDE5IDQ1dDQ1IDE5dDQ1IC0xOWwyNTYgLTI1NnExOSAtMTkgMTkgLTQ1eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDgwOyIgaG9yaXotYWR2LXg9IjE5MjAiIGQ9Ik01MTIgNTEydi0zODRoLTI1NnYzODRoMjU2ek04OTYgMTAyNHYtODk2aC0yNTZ2ODk2aDI1NnpNMTI4MCA3Njh2LTY0MGgtMjU2djY0MGgyNTZ6TTE2NjQgMTE1MnYtMTAyNGgtMjU2djEwMjRoMjU2ek0xNzkyIDMydjEyMTZxMCAxMyAtOS41IDIyLjV0LTIyLjUgOS41aC0xNjAwcS0xMyAwIC0yMi41IC05LjV0LTkuNSAtMjIuNXYtMTIxNnEwIC0xMyA5LjUgLTIyLjV0MjIuNSAtOS41aDE2MDBxMTMgMCAyMi41IDkuNXQ5LjUgMjIuNXogTTE5MjAgMTI0OHYtMTIxNnEwIC02NiAtNDcgLTExM3QtMTEzIC00N2gtMTYwMHEtNjYgMCAtMTEzIDQ3dC00NyAxMTN2MTIxNnEwIDY2IDQ3IDExM3QxMTMgNDdoMTYwMHE2NiAwIDExMyAtNDd0NDcgLTExM3oiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjA4MTsiIGQ9Ik0xMjgwIDk1OHEwIDEzIC05LjUgMjIuNXQtMjIuNSA5LjVxLTUgMCAtMTUgLTRxMjAgMzQgMjAgNTVxMCAxMyAtOS41IDIyLjV0LTIyLjUgOS41cS03IDAgLTE3IC01cS02MCAtMzQgLTk3IC00M3EtNjUgNjMgLTE1NCA2M3EtOTggMCAtMTY0LjUgLTcyLjV0LTY0LjUgLTE2OS41di0xMnEtMTA3IDE0IC0xODcuNSA2NHQtMTU2LjUgMTM5cS0xMCAxMiAtMjggMTJxLTI2IDAgLTQxIC01MC41dC0xNSAtODYuNXEwIC02MiAyOSAtMTE3IHEtMTMgLTIgLTIxLjUgLTExLjV0LTguNSAtMjIuNXEwIC0xMTIgODEgLTE4NXEtMTIgLTggLTEyIC0yNXEwIC02IDEgLTlxMTUgLTUxIDUwLjUgLTkxLjV0ODQuNSAtNjAuNXEtNzcgLTQzIC0xNjUgLTQzcS04IDAgLTI0IDEuNXQtMjMgMS41cS0xMyAwIC0yMi41IC05LjV0LTkuNSAtMjIuNXEwIC0xNyAxNCAtMjZxNjMgLTQ3IDE1MCAtNzMuNXQxNzAgLTI2LjVxMTMwIDAgMjQ4IDU4cTE2NiA3OSAyNTYgMjMyLjV0ODggMzM5LjV2MTIgcTI3IDIyIDYyLjUgNjN0MzUuNSA2MXpNMTUzNiAxMTIwdi05NjBxMCAtMTE5IC04NC41IC0yMDMuNXQtMjAzLjUgLTg0LjVoLTk2MHEtMTE5IDAgLTIwMy41IDg0LjV0LTg0LjUgMjAzLjV2OTYwcTAgMTE5IDg0LjUgMjAzLjV0MjAzLjUgODQuNWg5NjBxMTE5IDAgMjAzLjUgLTg0LjV0ODQuNSAtMjAzLjV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwODI7IiBkPSJNMTI0OCAxNDA4cTExOSAwIDIwMy41IC04NC41dDg0LjUgLTIwMy41di05NjBxMCAtMTE5IC04NC41IC0yMDMuNXQtMjAzLjUgLTg0LjVoLTM1MHEtMiAwIC0yIDF2NjcxaDE3N3EzMSAwIDMyIDIzbDEyIDE2NHEyIDE1IC04IDI1cS0xMCAxMiAtMjQgMTJoLTE4OXY3MnEwIDQ0IDExLjUgNTd0NTQuNSAxM3E1NyAwIDExNyAtMTNxMTMgLTMgMjYgNXExMSA4IDEzIDIybDIzIDE2NnEyIDEyIC01LjUgMjIuNXQtMTkuNSAxMy41IHEtOTMgMjYgLTE5NyAyNnEtMzExIDAgLTMxMSAtMjk5di04NWgtOTVxLTEzIDAgLTIzIC0xMC41dC0xMCAtMjQuNXYtMTcycTAgLTggNS41IC0xMnQxMCAtNC41dDE3LjUgLTAuNWg5NXYtNjcxbDEwIC0xaC0zMzBxLTExOSAwIC0yMDMuNSA4NC41dC04NC41IDIwMy41djk2MHEwIDExOSA4NC41IDIwMy41dDIwMy41IDg0LjVoOTYweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDgzOyIgaG9yaXotYWR2LXg9IjE3OTIiIGQ9Ik05MjggNzA0cTAgMTQgLTkgMjN0LTIzIDlxLTY2IDAgLTExMyAtNDd0LTQ3IC0xMTNxMCAtMTQgOSAtMjN0MjMgLTl0MjMgOXQ5IDIzcTAgNDAgMjggNjh0NjggMjhxMTQgMCAyMyA5dDkgMjN6TTExNTIgNTc0cTAgLTEwNiAtNzUgLTE4MXQtMTgxIC03NXQtMTgxIDc1dC03NSAxODF0NzUgMTgxdDE4MSA3NXQxODEgLTc1dDc1IC0xODF6TTEyOCAwaDE1MzZ2MTI4aC0xNTM2di0xMjh6TTEyODAgNTc0cTAgMTU5IC0xMTIuNSAyNzEuNSB0LTI3MS41IDExMi41dC0yNzEuNSAtMTEyLjV0LTExMi41IC0yNzEuNXQxMTIuNSAtMjcxLjV0MjcxLjUgLTExMi41dDI3MS41IDExMi41dDExMi41IDI3MS41ek0yNTYgMTIxNmgzODR2MTI4aC0zODR2LTEyOHpNMTI4IDEwMjRoMTUzNnYxMTh2MTM4aC04MjhsLTY0IC0xMjhoLTY0NHYtMTI4ek0xNzkyIDEyODB2LTEyODBxMCAtNTMgLTM3LjUgLTkwLjV0LTkwLjUgLTM3LjVoLTE1MzZxLTUzIDAgLTkwLjUgMzcuNXQtMzcuNSA5MC41djEyODAgcTAgNTMgMzcuNSA5MC41dDkwLjUgMzcuNWgxNTM2cTUzIDAgOTAuNSAtMzcuNXQzNy41IC05MC41eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDg0OyIgaG9yaXotYWR2LXg9IjE3OTIiIGQ9Ik04MzIgMTAyNHEwIDgwIC01NiAxMzZ0LTEzNiA1NnQtMTM2IC01NnQtNTYgLTEzNnEwIC00MiAxOSAtODNxLTQxIDE5IC04MyAxOXEtODAgMCAtMTM2IC01NnQtNTYgLTEzNnQ1NiAtMTM2dDEzNiAtNTZ0MTM2IDU2dDU2IDEzNnEwIDQyIC0xOSA4M3E0MSAtMTkgODMgLTE5cTgwIDAgMTM2IDU2dDU2IDEzNnpNMTY4MyAzMjBxMCAtMTcgLTQ5IC02NnQtNjYgLTQ5cS05IDAgLTI4LjUgMTZ0LTM2LjUgMzN0LTM4LjUgNDB0LTI0LjUgMjYgbC05NiAtOTZsMjIwIC0yMjBxMjggLTI4IDI4IC02OHEwIC00MiAtMzkgLTgxdC04MSAtMzlxLTQwIDAgLTY4IDI4bC02NzEgNjcxcS0xNzYgLTEzMSAtMzY1IC0xMzFxLTE2MyAwIC0yNjUuNSAxMDIuNXQtMTAyLjUgMjY1LjVxMCAxNjAgOTUgMzEzdDI0OCAyNDh0MzEzIDk1cTE2MyAwIDI2NS41IC0xMDIuNXQxMDIuNSAtMjY1LjVxMCAtMTg5IC0xMzEgLTM2NWwzNTUgLTM1NWw5NiA5NnEtMyAzIC0yNiAyNC41dC00MCAzOC41dC0zMyAzNi41IHQtMTYgMjguNXEwIDE3IDQ5IDY2dDY2IDQ5cTEzIDAgMjMgLTEwcTYgLTYgNDYgLTQ0LjV0ODIgLTc5LjV0ODYuNSAtODZ0NzMgLTc4dDI4LjUgLTQxeiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDg1OyIgaG9yaXotYWR2LXg9IjE5MjAiIGQ9Ik04OTYgNjQwcTAgMTA2IC03NSAxODF0LTE4MSA3NXQtMTgxIC03NXQtNzUgLTE4MXQ3NSAtMTgxdDE4MSAtNzV0MTgxIDc1dDc1IDE4MXpNMTY2NCAxMjhxMCA1MiAtMzggOTB0LTkwIDM4dC05MCAtMzh0LTM4IC05MHEwIC01MyAzNy41IC05MC41dDkwLjUgLTM3LjV0OTAuNSAzNy41dDM3LjUgOTAuNXpNMTY2NCAxMTUycTAgNTIgLTM4IDkwdC05MCAzOHQtOTAgLTM4dC0zOCAtOTBxMCAtNTMgMzcuNSAtOTAuNXQ5MC41IC0zNy41IHQ5MC41IDM3LjV0MzcuNSA5MC41ek0xMjgwIDczMXYtMTg1cTAgLTEwIC03IC0xOS41dC0xNiAtMTAuNWwtMTU1IC0yNHEtMTEgLTM1IC0zMiAtNzZxMzQgLTQ4IDkwIC0xMTVxNyAtMTAgNyAtMjBxMCAtMTIgLTcgLTE5cS0yMyAtMzAgLTgyLjUgLTg5LjV0LTc4LjUgLTU5LjVxLTExIDAgLTIxIDdsLTExNSA5MHEtMzcgLTE5IC03NyAtMzFxLTExIC0xMDggLTIzIC0xNTVxLTcgLTI0IC0zMCAtMjRoLTE4NnEtMTEgMCAtMjAgNy41dC0xMCAxNy41IGwtMjMgMTUzcS0zNCAxMCAtNzUgMzFsLTExOCAtODlxLTcgLTcgLTIwIC03cS0xMSAwIC0yMSA4cS0xNDQgMTMzIC0xNDQgMTYwcTAgOSA3IDE5cTEwIDE0IDQxIDUzdDQ3IDYxcS0yMyA0NCAtMzUgODJsLTE1MiAyNHEtMTAgMSAtMTcgOS41dC03IDE5LjV2MTg1cTAgMTAgNyAxOS41dDE2IDEwLjVsMTU1IDI0cTExIDM1IDMyIDc2cS0zNCA0OCAtOTAgMTE1cS03IDExIC03IDIwcTAgMTIgNyAyMHEyMiAzMCA4MiA4OXQ3OSA1OXExMSAwIDIxIC03IGwxMTUgLTkwcTM0IDE4IDc3IDMycTExIDEwOCAyMyAxNTRxNyAyNCAzMCAyNGgxODZxMTEgMCAyMCAtNy41dDEwIC0xNy41bDIzIC0xNTNxMzQgLTEwIDc1IC0zMWwxMTggODlxOCA3IDIwIDdxMTEgMCAyMSAtOHExNDQgLTEzMyAxNDQgLTE2MHEwIC05IC03IC0xOXEtMTIgLTE2IC00MiAtNTR0LTQ1IC02MHEyMyAtNDggMzQgLTgybDE1MiAtMjNxMTAgLTIgMTcgLTEwLjV0NyAtMTkuNXpNMTkyMCAxOTh2LTE0MHEwIC0xNiAtMTQ5IC0zMSBxLTEyIC0yNyAtMzAgLTUycTUxIC0xMTMgNTEgLTEzOHEwIC00IC00IC03cS0xMjIgLTcxIC0xMjQgLTcxcS04IDAgLTQ2IDQ3dC01MiA2OHEtMjAgLTIgLTMwIC0ydC0zMCAycS0xNCAtMjEgLTUyIC02OHQtNDYgLTQ3cS0yIDAgLTEyNCA3MXEtNCAzIC00IDdxMCAyNSA1MSAxMzhxLTE4IDI1IC0zMCA1MnEtMTQ5IDE1IC0xNDkgMzF2MTQwcTAgMTYgMTQ5IDMxcTEzIDI5IDMwIDUycS01MSAxMTMgLTUxIDEzOHEwIDQgNCA3cTQgMiAzNSAyMCB0NTkgMzR0MzAgMTZxOCAwIDQ2IC00Ni41dDUyIC02Ny41cTIwIDIgMzAgMnQzMCAtMnE1MSA3MSA5MiAxMTJsNiAycTQgMCAxMjQgLTcwcTQgLTMgNCAtN3EwIC0yNSAtNTEgLTEzOHExNyAtMjMgMzAgLTUycTE0OSAtMTUgMTQ5IC0zMXpNMTkyMCAxMjIydi0xNDBxMCAtMTYgLTE0OSAtMzFxLTEyIC0yNyAtMzAgLTUycTUxIC0xMTMgNTEgLTEzOHEwIC00IC00IC03cS0xMjIgLTcxIC0xMjQgLTcxcS04IDAgLTQ2IDQ3dC01MiA2OCBxLTIwIC0yIC0zMCAtMnQtMzAgMnEtMTQgLTIxIC01MiAtNjh0LTQ2IC00N3EtMiAwIC0xMjQgNzFxLTQgMyAtNCA3cTAgMjUgNTEgMTM4cS0xOCAyNSAtMzAgNTJxLTE0OSAxNSAtMTQ5IDMxdjE0MHEwIDE2IDE0OSAzMXExMyAyOSAzMCA1MnEtNTEgMTEzIC01MSAxMzhxMCA0IDQgN3E0IDIgMzUgMjB0NTkgMzR0MzAgMTZxOCAwIDQ2IC00Ni41dDUyIC02Ny41cTIwIDIgMzAgMnQzMCAtMnE1MSA3MSA5MiAxMTJsNiAycTQgMCAxMjQgLTcwIHE0IC0zIDQgLTdxMCAtMjUgLTUxIC0xMzhxMTcgLTIzIDMwIC01MnExNDkgLTE1IDE0OSAtMzF6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwODY7IiBob3Jpei1hZHYteD0iMTc5MiIgZD0iTTE0MDggNzY4cTAgLTEzOSAtOTQgLTI1N3QtMjU2LjUgLTE4Ni41dC0zNTMuNSAtNjguNXEtODYgMCAtMTc2IDE2cS0xMjQgLTg4IC0yNzggLTEyOHEtMzYgLTkgLTg2IC0xNmgtM3EtMTEgMCAtMjAuNSA4dC0xMS41IDIxcS0xIDMgLTEgNi41dDAuNSA2LjV0MiA2bDIuNSA1dDMuNSA1LjV0NCA1dDQuNSA1dDQgNC41cTUgNiAyMyAyNXQyNiAyOS41dDIyLjUgMjl0MjUgMzguNXQyMC41IDQ0cS0xMjQgNzIgLTE5NSAxNzd0LTcxIDIyNCBxMCAxMzkgOTQgMjU3dDI1Ni41IDE4Ni41dDM1My41IDY4LjV0MzUzLjUgLTY4LjV0MjU2LjUgLTE4Ni41dDk0IC0yNTd6TTE3OTIgNTEycTAgLTEyMCAtNzEgLTIyNC41dC0xOTUgLTE3Ni41cTEwIC0yNCAyMC41IC00NHQyNSAtMzguNXQyMi41IC0yOXQyNiAtMjkuNXQyMyAtMjVxMSAtMSA0IC00LjV0NC41IC01dDQgLTV0My41IC01LjVsMi41IC01dDIgLTZ0MC41IC02LjV0LTEgLTYuNXEtMyAtMTQgLTEzIC0yMnQtMjIgLTcgcS01MCA3IC04NiAxNnEtMTU0IDQwIC0yNzggMTI4cS05MCAtMTYgLTE3NiAtMTZxLTI3MSAwIC00NzIgMTMycTU4IC00IDg4IC00cTE2MSAwIDMwOSA0NXQyNjQgMTI5cTEyNSA5MiAxOTIgMjEydDY3IDI1NHEwIDc3IC0yMyAxNTJxMTI5IC03MSAyMDQgLTE3OHQ3NSAtMjMweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDg3OyIgZD0iTTI1NiAxOTJxMCAyNiAtMTkgNDV0LTQ1IDE5dC00NSAtMTl0LTE5IC00NXQxOSAtNDV0NDUgLTE5dDQ1IDE5dDE5IDQ1ek0xNDA4IDc2OHEwIDUxIC0zOSA4OS41dC04OSAzOC41aC0zNTJxMCA1OCA0OCAxNTkuNXQ0OCAxNjAuNXEwIDk4IC0zMiAxNDV0LTEyOCA0N3EtMjYgLTI2IC0zOCAtODV0LTMwLjUgLTEyNS41dC01OS41IC0xMDkuNXEtMjIgLTIzIC03NyAtOTFxLTQgLTUgLTIzIC0zMHQtMzEuNSAtNDF0LTM0LjUgLTQyLjUgdC00MCAtNDR0LTM4LjUgLTM1LjV0LTQwIC0yN3QtMzUuNSAtOWgtMzJ2LTY0MGgzMnExMyAwIDMxLjUgLTN0MzMgLTYuNXQzOCAtMTF0MzUgLTExLjV0MzUuNSAtMTIuNXQyOSAtMTAuNXEyMTEgLTczIDM0MiAtNzNoMTIxcTE5MiAwIDE5MiAxNjdxMCAyNiAtNSA1NnEzMCAxNiA0Ny41IDUyLjV0MTcuNSA3My41dC0xOCA2OXE1MyA1MCA1MyAxMTlxMCAyNSAtMTAgNTUuNXQtMjUgNDcuNXEzMiAxIDUzLjUgNDd0MjEuNSA4MXpNMTUzNiA3NjkgcTAgLTg5IC00OSAtMTYzcTkgLTMzIDkgLTY5cTAgLTc3IC0zOCAtMTQ0cTMgLTIxIDMgLTQzcTAgLTEwMSAtNjAgLTE3OHExIC0xMzkgLTg1IC0yMTkuNXQtMjI3IC04MC41aC0zNmgtOTNxLTk2IDAgLTE4OS41IDIyLjV0LTIxNi41IDY1LjVxLTExNiA0MCAtMTM4IDQwaC0yODhxLTUzIDAgLTkwLjUgMzcuNXQtMzcuNSA5MC41djY0MHEwIDUzIDM3LjUgOTAuNXQ5MC41IDM3LjVoMjc0cTM2IDI0IDEzNyAxNTVxNTggNzUgMTA3IDEyOCBxMjQgMjUgMzUuNSA4NS41dDMwLjUgMTI2LjV0NjIgMTA4cTM5IDM3IDkwIDM3cTg0IDAgMTUxIC0zMi41dDEwMiAtMTAxLjV0MzUgLTE4NnEwIC05MyAtNDggLTE5MmgxNzZxMTA0IDAgMTgwIC03NnQ3NiAtMTc5eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDg4OyIgZD0iTTI1NiAxMDg4cTAgMjYgLTE5IDQ1dC00NSAxOXQtNDUgLTE5dC0xOSAtNDV0MTkgLTQ1dDQ1IC0xOXQ0NSAxOXQxOSA0NXpNMTQwOCA1MTJxMCAzNSAtMjEuNSA4MXQtNTMuNSA0N3ExNSAxNyAyNSA0Ny41dDEwIDU1LjVxMCA2OSAtNTMgMTE5cTE4IDMyIDE4IDY5dC0xNy41IDczLjV0LTQ3LjUgNTIuNXE1IDMwIDUgNTZxMCA4NSAtNDkgMTI2dC0xMzYgNDFoLTEyOHEtMTMxIDAgLTM0MiAtNzNxLTUgLTIgLTI5IC0xMC41IHQtMzUuNSAtMTIuNXQtMzUgLTExLjV0LTM4IC0xMXQtMzMgLTYuNXQtMzEuNSAtM2gtMzJ2LTY0MGgzMnExNiAwIDM1LjUgLTl0NDAgLTI3dDM4LjUgLTM1LjV0NDAgLTQ0dDM0LjUgLTQyLjV0MzEuNSAtNDF0MjMgLTMwcTU1IC02OCA3NyAtOTFxNDEgLTQzIDU5LjUgLTEwOS41dDMwLjUgLTEyNS41dDM4IC04NXE5NiAwIDEyOCA0N3QzMiAxNDVxMCA1OSAtNDggMTYwLjV0LTQ4IDE1OS41aDM1MnE1MCAwIDg5IDM4LjV0MzkgODkuNXogTTE1MzYgNTExcTAgLTEwMyAtNzYgLTE3OXQtMTgwIC03NmgtMTc2cTQ4IC05OSA0OCAtMTkycTAgLTExOCAtMzUgLTE4NnEtMzUgLTY5IC0xMDIgLTEwMS41dC0xNTEgLTMyLjVxLTUxIDAgLTkwIDM3cS0zNCAzMyAtNTQgODJ0LTI1LjUgOTAuNXQtMTcuNSA4NC41dC0zMSA2NHEtNDggNTAgLTEwNyAxMjdxLTEwMSAxMzEgLTEzNyAxNTVoLTI3NHEtNTMgMCAtOTAuNSAzNy41dC0zNy41IDkwLjV2NjQwcTAgNTMgMzcuNSA5MC41dDkwLjUgMzcuNSBoMjg4cTIyIDAgMTM4IDQwcTEyOCA0NCAyMjMgNjZ0MjAwIDIyaDExMnExNDAgMCAyMjYuNSAtNzl0ODUuNSAtMjE2di01cTYwIC03NyA2MCAtMTc4cTAgLTIyIC0zIC00M3EzOCAtNjcgMzggLTE0NHEwIC0zNiAtOSAtNjlxNDkgLTc0IDQ5IC0xNjN6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwODk7IiBob3Jpei1hZHYteD0iODk2IiBkPSJNODMyIDE1MDR2LTEzMzlsLTQ0OSAtMjM2cS0yMiAtMTIgLTQwIC0xMnEtMjEgMCAtMzEuNSAxNC41dC0xMC41IDM1LjVxMCA2IDIgMjBsODYgNTAwbC0zNjQgMzU0cS0yNSAyNyAtMjUgNDhxMCAzNyA1NiA0Nmw1MDIgNzNsMjI1IDQ1NXExOSA0MSA0OSA0MXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjA4YTsiIGhvcml6LWFkdi14PSIxNzkyIiBkPSJNMTY2NCA5NDBxMCA4MSAtMjEuNSAxNDN0LTU1IDk4LjV0LTgxLjUgNTkuNXQtOTQgMzF0LTk4IDh0LTExMiAtMjUuNXQtMTEwLjUgLTY0dC04Ni41IC03MnQtNjAgLTYxLjVxLTE4IC0yMiAtNDkgLTIydC00OSAyMnEtMjQgMjggLTYwIDYxLjV0LTg2LjUgNzJ0LTExMC41IDY0dC0xMTIgMjUuNXQtOTggLTh0LTk0IC0zMXQtODEuNSAtNTkuNXQtNTUgLTk4LjV0LTIxLjUgLTE0M3EwIC0xNjggMTg3IC0zNTVsNTgxIC01NjBsNTgwIDU1OSBxMTg4IDE4OCAxODggMzU2ek0xNzkyIDk0MHEwIC0yMjEgLTIyOSAtNDUwbC02MjMgLTYwMHEtMTggLTE4IC00NCAtMTh0LTQ0IDE4bC02MjQgNjAycS0xMCA4IC0yNy41IDI2dC01NS41IDY1LjV0LTY4IDk3LjV0LTUzLjUgMTIxdC0yMy41IDEzOHEwIDIyMCAxMjcgMzQ0dDM1MSAxMjRxNjIgMCAxMjYuNSAtMjEuNXQxMjAgLTU4dDk1LjUgLTY4LjV0NzYgLTY4cTM2IDM2IDc2IDY4dDk1LjUgNjguNXQxMjAgNTh0MTI2LjUgMjEuNSBxMjI0IDAgMzUxIC0xMjR0MTI3IC0zNDR6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwOGI7IiBob3Jpei1hZHYteD0iMTY2NCIgZD0iTTY0MCA5NnEwIC00IDEgLTIwdDAuNSAtMjYuNXQtMyAtMjMuNXQtMTAgLTE5LjV0LTIwLjUgLTYuNWgtMzIwcS0xMTkgMCAtMjAzLjUgODQuNXQtODQuNSAyMDMuNXY3MDRxMCAxMTkgODQuNSAyMDMuNXQyMDMuNSA4NC41aDMyMHExMyAwIDIyLjUgLTkuNXQ5LjUgLTIyLjVxMCAtNCAxIC0yMHQwLjUgLTI2LjV0LTMgLTIzLjV0LTEwIC0xOS41dC0yMC41IC02LjVoLTMyMHEtNjYgMCAtMTEzIC00N3QtNDcgLTExM3YtNzA0IHEwIC02NiA0NyAtMTEzdDExMyAtNDdoMjg4aDExaDEzdDExLjUgLTF0MTEuNSAtM3Q4IC01LjV0NyAtOXQyIC0xMy41ek0xNTY4IDY0MHEwIC0yNiAtMTkgLTQ1bC01NDQgLTU0NHEtMTkgLTE5IC00NSAtMTl0LTQ1IDE5dC0xOSA0NXYyODhoLTQ0OHEtMjYgMCAtNDUgMTl0LTE5IDQ1djM4NHEwIDI2IDE5IDQ1dDQ1IDE5aDQ0OHYyODhxMCAyNiAxOSA0NXQ0NSAxOXQ0NSAtMTlsNTQ0IC01NDRxMTkgLTE5IDE5IC00NXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjA4YzsiIGQ9Ik01MTIgMTYwdjY0MHEwIDEzIC05LjUgMjIuNXQtMjIuNSA5LjVoLTE5MnEtMTMgMCAtMjIuNSAtOS41dC05LjUgLTIyLjV2LTY0MHEwIC0xMyA5LjUgLTIyLjV0MjIuNSAtOS41aDE5MnExMyAwIDIyLjUgOS41dDkuNSAyMi41ek01MDMgMTAyOHEwIDUxIC0zNiA4Ny41dC04OCAzNi41cS01MSAwIC04NyAtMzYuNXQtMzYgLTg3LjV0MzYgLTg3LjV0ODcgLTM2LjVxNTIgMCA4OCAzNi41dDM2IDg3LjV6TTEyODAgMTYwdjQzNSBxMCAxMjcgLTczLjUgMTkyLjV0LTIwMi41IDY1LjVxLTkwIDAgLTE1OCAtNDVxLTEyIC04IC0xNCAtMTJxMCAzNiAtMzUgMzZoLTE3NnEtMTQgMCAtMjkuNSAtNy41dC0xNS41IC0yMC41di02NDRxMCAtMTMgMTUuNSAtMjIuNXQyOS41IC05LjVoMTgycTEyIDAgMjAuNSA5LjV0OC41IDIyLjV2MzQ5cTAgMTQwIDExNCAxNDBxNDkgMCA2My41IC0yMi41dDE0LjUgLTczLjV2LTM5M3EwIC0xMyAxMiAtMjIuNXQyNiAtOS41aDE4NiBxMTMgMCAyMi41IDkuNXQ5LjUgMjIuNXpNMTUzNiAxMTIwdi05NjBxMCAtMTE5IC04NC41IC0yMDMuNXQtMjAzLjUgLTg0LjVoLTk2MHEtMTE5IDAgLTIwMy41IDg0LjV0LTg0LjUgMjAzLjV2OTYwcTAgMTE5IDg0LjUgMjAzLjV0MjAzLjUgODQuNWg5NjBxMTE5IDAgMjAzLjUgLTg0LjV0ODQuNSAtMjAzLjV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwOGQ7IiBob3Jpei1hZHYteD0iMTE1MiIgZD0iTTQ4MCA2NzJ2NDQ4cTAgMTQgLTkgMjN0LTIzIDl0LTIzIC05dC05IC0yM3YtNDQ4cTAgLTE0IDkgLTIzdDIzIC05dDIzIDl0OSAyM3pNMTE1MiAzMjBxMCAtMjYgLTE5IC00NXQtNDUgLTE5aC00MjlsLTUxIC00ODNxLTIgLTEyIC0xMC41IC0yMC41dC0yMC41IC04LjVoLTFxLTI3IDAgLTMyIDI3bC03NiA0ODVoLTQwNHEtMjYgMCAtNDUgMTl0LTE5IDQ1cTAgMTIzIDc4LjUgMjIxLjV0MTc3LjUgOTguNXY1MTJxLTUyIDAgLTkwIDM4IHQtMzggOTB0MzggOTB0OTAgMzhoNjQwcTUyIDAgOTAgLTM4dDM4IC05MHQtMzggLTkwdC05MCAtMzh2LTUxMnE5OSAwIDE3Ny41IC05OC41dDc4LjUgLTIyMS41eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDhlOyIgaG9yaXotYWR2LXg9IjE3OTIiIGQ9Ik0xNDA4IDYwOHYtMzIwcTAgLTExOSAtODQuNSAtMjAzLjV0LTIwMy41IC04NC41aC04MzJxLTExOSAwIC0yMDMuNSA4NC41dC04NC41IDIwMy41djgzMnEwIDExOSA4NC41IDIwMy41dDIwMy41IDg0LjVoNzA0cTE0IDAgMjMgLTl0OSAtMjN2LTY0cTAgLTE0IC05IC0yM3QtMjMgLTloLTcwNHEtNjYgMCAtMTEzIC00N3QtNDcgLTExM3YtODMycTAgLTY2IDQ3IC0xMTN0MTEzIC00N2g4MzJxNjYgMCAxMTMgNDd0NDcgMTEzdjMyMCBxMCAxNCA5IDIzdDIzIDloNjRxMTQgMCAyMyAtOXQ5IC0yM3pNMTc5MiAxNDcydi01MTJxMCAtMjYgLTE5IC00NXQtNDUgLTE5dC00NSAxOWwtMTc2IDE3NmwtNjUyIC02NTJxLTEwIC0xMCAtMjMgLTEwdC0yMyAxMGwtMTE0IDExNHEtMTAgMTAgLTEwIDIzdDEwIDIzbDY1MiA2NTJsLTE3NiAxNzZxLTE5IDE5IC0xOSA0NXQxOSA0NXQ0NSAxOWg1MTJxMjYgMCA0NSAtMTl0MTkgLTQ1eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDkwOyIgZD0iTTExODQgNjQwcTAgLTI2IC0xOSAtNDVsLTU0NCAtNTQ0cS0xOSAtMTkgLTQ1IC0xOXQtNDUgMTl0LTE5IDQ1djI4OGgtNDQ4cS0yNiAwIC00NSAxOXQtMTkgNDV2Mzg0cTAgMjYgMTkgNDV0NDUgMTloNDQ4djI4OHEwIDI2IDE5IDQ1dDQ1IDE5dDQ1IC0xOWw1NDQgLTU0NHExOSAtMTkgMTkgLTQ1ek0xNTM2IDk5MnYtNzA0cTAgLTExOSAtODQuNSAtMjAzLjV0LTIwMy41IC04NC41aC0zMjBxLTEzIDAgLTIyLjUgOS41dC05LjUgMjIuNSBxMCA0IC0xIDIwdC0wLjUgMjYuNXQzIDIzLjV0MTAgMTkuNXQyMC41IDYuNWgzMjBxNjYgMCAxMTMgNDd0NDcgMTEzdjcwNHEwIDY2IC00NyAxMTN0LTExMyA0N2gtMjg4aC0xMWgtMTN0LTExLjUgMXQtMTEuNSAzdC04IDUuNXQtNyA5dC0yIDEzLjVxMCA0IC0xIDIwdC0wLjUgMjYuNXQzIDIzLjV0MTAgMTkuNXQyMC41IDYuNWgzMjBxMTE5IDAgMjAzLjUgLTg0LjV0ODQuNSAtMjAzLjV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwOTE7IiBob3Jpei1hZHYteD0iMTY2NCIgZD0iTTQ1OCA2NTNxLTc0IDE2MiAtNzQgMzcxaC0yNTZ2LTk2cTAgLTc4IDk0LjUgLTE2MnQyMzUuNSAtMTEzek0xNTM2IDkyOHY5NmgtMjU2cTAgLTIwOSAtNzQgLTM3MXExNDEgMjkgMjM1LjUgMTEzdDk0LjUgMTYyek0xNjY0IDEwNTZ2LTEyOHEwIC03MSAtNDEuNSAtMTQzdC0xMTIgLTEzMHQtMTczIC05Ny41dC0yMTUuNSAtNDQuNXEtNDIgLTU0IC05NSAtOTVxLTM4IC0zNCAtNTIuNSAtNzIuNXQtMTQuNSAtODkuNXEwIC01NCAzMC41IC05MSB0OTcuNSAtMzdxNzUgMCAxMzMuNSAtNDUuNXQ1OC41IC0xMTQuNXYtNjRxMCAtMTQgLTkgLTIzdC0yMyAtOWgtODMycS0xNCAwIC0yMyA5dC05IDIzdjY0cTAgNjkgNTguNSAxMTQuNXQxMzMuNSA0NS41cTY3IDAgOTcuNSAzN3QzMC41IDkxcTAgNTEgLTE0LjUgODkuNXQtNTIuNSA3Mi41cS01MyA0MSAtOTUgOTVxLTExMyA1IC0yMTUuNSA0NC41dC0xNzMgOTcuNXQtMTEyIDEzMHQtNDEuNSAxNDN2MTI4cTAgNDAgMjggNjh0NjggMjhoMjg4djk2IHEwIDY2IDQ3IDExM3QxMTMgNDdoNTc2cTY2IDAgMTEzIC00N3Q0NyAtMTEzdi05NmgyODhxNDAgMCA2OCAtMjh0MjggLTY4eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDkyOyIgZD0iTTU4MiAyMjhxMCAtNjYgLTkzIC02NnEtMTA3IDAgLTEwNyA2M3EwIDY0IDk4IDY0cTEwMiAwIDEwMiAtNjF6TTU0NiA2OTRxMCAtODUgLTc0IC04NXEtNzcgMCAtNzcgODRxMCA5MCA3NyA5MHEzNiAwIDU1IC0yNnQxOSAtNjN6TTcxMiA3Njl2MTI1cS03OCAtMjkgLTEzNSAtMjlxLTUwIDI5IC0xMTAgMjlxLTg2IDAgLTE0NSAtNTd0LTU5IC0xNDNxMCAtNTAgMjkuNSAtMTAydDczLjUgLTY3di0zcS0zOCAtMTcgLTM4IC04NSBxMCAtNTIgNDEgLTc3di0zcS0xMTMgLTM3IC0xMTMgLTEzOXEwIC02MCAzNiAtOTh0ODQgLTUxdDEwNyAtMTNxMjI0IDAgMjI0IDE4N3EwIDQ4IC0yNS41IDc4dC02Mi41IDQyLjV0LTc0IDIxLjV0LTYyLjUgMjMuNXQtMjUuNSAzOS41cTAgNDQgNDkgNTJxNzcgMTUgMTIyIDcwdDQ1IDEzNHEwIDI0IC0xMCA1MnEzMCA3IDQ5IDEzek03NzEgMzUwaDEzN3EtMiAyMCAtMiA5MHYzNzJxMCA1OSAyIDc2aC0xMzdxMyAtMjYgMyAtNzl2LTM3NyBxMCAtNTUgLTMgLTgyek0xMjgwIDM2NnYxMjFxLTMwIC0yMSAtNjggLTIxcS01MyAwIC01MyA4MnYyMjVoNTJxOSAwIDI2LjUgLTF0MjYuNSAtMXYxMTdoLTEwNXEwIDgyIDMgMTAyaC0xNDBxNCAtMjQgNCAtNTV2LTQ3aC02MHYtMTE3cTM2IDMgMzcgM3E0IDAgMTEuNSAtMC41dDExLjUgLTAuNXYtMmgtMnYtMjE3cTAgLTM3IDIuNSAtNjR0MTEuNSAtNTYuNXQyNC41IC00OC41dDQzLjUgLTMxdDY2IC0xMnE2NCAwIDEwOCAyNHpNOTI0IDEwNzIgcTAgMzYgLTI0IDYzLjV0LTYwIDI3LjV0LTYwLjUgLTI3dC0yNC41IC02NHEwIC0zNiAyNSAtNjIuNXQ2MCAtMjYuNXQ1OS41IDI3dDI0LjUgNjJ6TTE1MzYgMTEyMHYtOTYwcTAgLTExOSAtODQuNSAtMjAzLjV0LTIwMy41IC04NC41aC05NjBxLTExOSAwIC0yMDMuNSA4NC41dC04NC41IDIwMy41djk2MHEwIDExOSA4NC41IDIwMy41dDIwMy41IDg0LjVoOTYwcTExOSAwIDIwMy41IC04NC41dDg0LjUgLTIwMy41eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDkzOyIgaG9yaXotYWR2LXg9IjE2NjQiIGQ9Ik0xNjY0IDQ4MHYtNTc2cTAgLTEzIC05LjUgLTIyLjV0LTIyLjUgLTkuNWgtMTYwMHEtMTMgMCAtMjIuNSA5LjV0LTkuNSAyMi41djU3NnEwIDEzIDkuNSAyMi41dDIyLjUgOS41aDE5MnExMyAwIDIyLjUgLTkuNXQ5LjUgLTIyLjV2LTM1MmgxMTUydjM1MnEwIDEzIDkuNSAyMi41dDIyLjUgOS41aDE5MnExMyAwIDIyLjUgLTkuNXQ5LjUgLTIyLjV6TTEzNDQgODMycTAgLTI2IC0xOSAtNDV0LTQ1IC0xOWgtMjU2di00NDggcTAgLTI2IC0xOSAtNDV0LTQ1IC0xOWgtMjU2cS0yNiAwIC00NSAxOXQtMTkgNDV2NDQ4aC0yNTZxLTI2IDAgLTQ1IDE5dC0xOSA0NXQxOSA0NWw0NDggNDQ4cTE5IDE5IDQ1IDE5dDQ1IC0xOWw0NDggLTQ0OHExOSAtMTkgMTkgLTQ1eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDk0OyIgZD0iTTE0MDcgNzEwcTAgNDQgLTcgMTEzLjV0LTE4IDk2LjVxLTEyIDMwIC0xNyA0NHQtOSAzNi41dC00IDQ4LjVxMCAyMyA1IDY4LjV0NSA2Ny41cTAgMzcgLTEwIDU1cS00IDEgLTEzIDFxLTE5IDAgLTU4IC00LjV0LTU5IC00LjVxLTYwIDAgLTE3NiAyNHQtMTc1IDI0cS00MyAwIC05NC41IC0xMS41dC04NSAtMjMuNXQtODkuNSAtMzRxLTEzNyAtNTQgLTIwMiAtMTAzcS05NiAtNzMgLTE1OS41IC0xODkuNXQtODggLTIzNnQtMjQuNSAtMjQ4LjUgcTAgLTQwIDEyLjUgLTEyMHQxMi41IC0xMjFxMCAtMjMgLTExIC02Ni41dC0xMSAtNjUuNXQxMiAtMzYuNXQzNCAtMTQuNXEyNCAwIDcyLjUgMTF0NzMuNSAxMXE1NyAwIDE2OS41IC0xNS41dDE2OS41IC0xNS41cTE4MSAwIDI4NCAzNnExMjkgNDUgMjM1LjUgMTUyLjV0MTY2IDI0NS41dDU5LjUgMjc1ek0xNTM1IDcxMnEwIC0xNjUgLTcwIC0zMjcuNXQtMTk2IC0yODh0LTI4MSAtMTgwLjVxLTEyNCAtNDQgLTMyNiAtNDQgcS01NyAwIC0xNzAgMTQuNXQtMTY5IDE0LjVxLTI0IDAgLTcyLjUgLTE0LjV0LTczLjUgLTE0LjVxLTczIDAgLTEyMy41IDU1LjV0LTUwLjUgMTI4LjVxMCAyNCAxMSA2OHQxMSA2N3EwIDQwIC0xMi41IDEyMC41dC0xMi41IDEyMS41cTAgMTExIDE4IDIxNy41dDU0LjUgMjA5LjV0MTAwLjUgMTk0dDE1MCAxNTZxNzggNTkgMjMyIDEyMHExOTQgNzggMzE2IDc4cTYwIDAgMTc1LjUgLTI0dDE3My41IC0yNHExOSAwIDU3IDV0NTggNSBxODEgMCAxMTggLTUwLjV0MzcgLTEzNC41cTAgLTIzIC01IC02OHQtNSAtNjhxMCAtMTAgMSAtMTguNXQzIC0xN3Q0IC0xMy41dDYuNSAtMTZ0Ni41IC0xN3ExNiAtNDAgMjUgLTExOC41dDkgLTEzNi41eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDk1OyIgaG9yaXotYWR2LXg9IjE0MDgiIGQ9Ik0xNDA4IDI5NnEwIC0yNyAtMTAgLTcwLjV0LTIxIC02OC41cS0yMSAtNTAgLTEyMiAtMTA2cS05NCAtNTEgLTE4NiAtNTFxLTI3IDAgLTUyLjUgMy41dC01Ny41IDEyLjV0LTQ3LjUgMTQuNXQtNTUuNSAyMC41dC00OSAxOHEtOTggMzUgLTE3NSA4M3EtMTI4IDc5IC0yNjQuNSAyMTUuNXQtMjE1LjUgMjY0LjVxLTQ4IDc3IC04MyAxNzVxLTMgOSAtMTggNDl0LTIwLjUgNTUuNXQtMTQuNSA0Ny41dC0xMi41IDU3LjV0LTMuNSA1Mi41IHEwIDkyIDUxIDE4NnE1NiAxMDEgMTA2IDEyMnEyNSAxMSA2OC41IDIxdDcwLjUgMTBxMTQgMCAyMSAtM3ExOCAtNiA1MyAtNzZxMTEgLTE5IDMwIC01NHQzNSAtNjMuNXQzMSAtNTMuNXEzIC00IDE3LjUgLTI1dDIxLjUgLTM1LjV0NyAtMjguNXEwIC0yMCAtMjguNSAtNTB0LTYyIC01NXQtNjIgLTUzdC0yOC41IC00NnEwIC05IDUgLTIyLjV0OC41IC0yMC41dDE0IC0yNHQxMS41IC0xOXE3NiAtMTM3IDE3NCAtMjM1dDIzNSAtMTc0IHEyIC0xIDE5IC0xMS41dDI0IC0xNHQyMC41IC04LjV0MjIuNSAtNXExOCAwIDQ2IDI4LjV0NTMgNjJ0NTUgNjJ0NTAgMjguNXExNCAwIDI4LjUgLTd0MzUuNSAtMjEuNXQyNSAtMTcuNXEyNSAtMTUgNTMuNSAtMzF0NjMuNSAtMzV0NTQgLTMwcTcwIC0zNSA3NiAtNTNxMyAtNyAzIC0yMXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjA5NjsiIGhvcml6LWFkdi14PSIxNjY0IiBkPSJNMTEyMCAxMjgwaC04MzJxLTY2IDAgLTExMyAtNDd0LTQ3IC0xMTN2LTgzMnEwIC02NiA0NyAtMTEzdDExMyAtNDdoODMycTY2IDAgMTEzIDQ3dDQ3IDExM3Y4MzJxMCA2NiAtNDcgMTEzdC0xMTMgNDd6TTE0MDggMTEyMHYtODMycTAgLTExOSAtODQuNSAtMjAzLjV0LTIwMy41IC04NC41aC04MzJxLTExOSAwIC0yMDMuNSA4NC41dC04NC41IDIwMy41djgzMnEwIDExOSA4NC41IDIwMy41dDIwMy41IDg0LjVoODMyIHExMTkgMCAyMDMuNSAtODQuNXQ4NC41IC0yMDMuNXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjA5NzsiIGhvcml6LWFkdi14PSIxMjgwIiBkPSJNMTE1MiAxMjgwaC0xMDI0di0xMjQybDQyMyA0MDZsODkgODVsODkgLTg1bDQyMyAtNDA2djEyNDJ6TTExNjQgMTQwOHEyMyAwIDQ0IC05cTMzIC0xMyA1Mi41IC00MXQxOS41IC02MnYtMTI4OXEwIC0zNCAtMTkuNSAtNjJ0LTUyLjUgLTQxcS0xOSAtOCAtNDQgLThxLTQ4IDAgLTgzIDMybC00NDEgNDI0bC00NDEgLTQyNHEtMzYgLTMzIC04MyAtMzNxLTIzIDAgLTQ0IDlxLTMzIDEzIC01Mi41IDQxdC0xOS41IDYydjEyODkgcTAgMzQgMTkuNSA2MnQ1Mi41IDQxcTIxIDkgNDQgOWgxMDQ4eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDk4OyIgZD0iTTEyODAgMzQzcTAgMTEgLTIgMTZxLTMgOCAtMzguNSAyOS41dC04OC41IDQ5LjVsLTUzIDI5cS01IDMgLTE5IDEzdC0yNSAxNXQtMjEgNXEtMTggMCAtNDcgLTMyLjV0LTU3IC02NS41dC00NCAtMzNxLTcgMCAtMTYuNSAzLjV0LTE1LjUgNi41dC0xNyA5LjV0LTE0IDguNXEtOTkgNTUgLTE3MC41IDEyNi41dC0xMjYuNSAxNzAuNXEtMiAzIC04LjUgMTR0LTkuNSAxN3QtNi41IDE1LjV0LTMuNSAxNi41cTAgMTMgMjAuNSAzMy41dDQ1IDM4LjUgdDQ1IDM5LjV0MjAuNSAzNi41cTAgMTAgLTUgMjF0LTE1IDI1dC0xMyAxOXEtMyA2IC0xNSAyOC41dC0yNSA0NS41dC0yNi41IDQ3LjV0LTI1IDQwLjV0LTE2LjUgMTh0LTE2IDJxLTQ4IDAgLTEwMSAtMjJxLTQ2IC0yMSAtODAgLTk0LjV0LTM0IC0xMzAuNXEwIC0xNiAyLjUgLTM0dDUgLTMwLjV0OSAtMzN0MTAgLTI5LjV0MTIuNSAtMzN0MTEgLTMwcTYwIC0xNjQgMjE2LjUgLTMyMC41dDMyMC41IC0yMTYuNXE2IC0yIDMwIC0xMXQzMyAtMTIuNSB0MjkuNSAtMTB0MzMgLTl0MzAuNSAtNXQzNCAtMi41cTU3IDAgMTMwLjUgMzR0OTQuNSA4MHEyMiA1MyAyMiAxMDF6TTE1MzYgMTEyMHYtOTYwcTAgLTExOSAtODQuNSAtMjAzLjV0LTIwMy41IC04NC41aC05NjBxLTExOSAwIC0yMDMuNSA4NC41dC04NC41IDIwMy41djk2MHEwIDExOSA4NC41IDIwMy41dDIwMy41IDg0LjVoOTYwcTExOSAwIDIwMy41IC04NC41dDg0LjUgLTIwMy41eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDk5OyIgaG9yaXotYWR2LXg9IjE5MjAiIGQ9Ik0xODc1IDEyMDJxMCAtMTAgLTUgLTE4cS02NCAtMTA0IC0xNzkgLTE5MHYtMzNxNCAtMjI3IC0xMDAgLTQ1N3EtMTM0IC0yOTcgLTM5Ny41IC00NjQuNXQtNTkxLjUgLTE2Ny41cS0yNjUgMCAtNTAwIDEyMnEtNjQgMzMgLTg3IDUwcS0xNSAxMiAtMTUgMjdxMCAxMyA5LjUgMjIuNXQyMi41IDkuNXExNCAwIDQ0IC0yLjV0NDUgLTIuNXEyMDQgMCAzNzUgMTA2cS0xMDMgMjQgLTE4MSA5NnQtMTExIDE3M3EtMiA4IC0yIDExcTAgMTIgOSAyMS41IHQyMiA5LjVxNSAwIDE0IC0ydDEyIC0ycS04OSA1NSAtMTQyIDE0N3QtNTMgMTk2cTAgMTUgMTEuNSAyNS41dDI3LjUgMTAuNXExMCAwIDM1IC0xMS41dDMwIC0xMy41cS05MiAxMTAgLTkyIDI1NnEwIDUxIDE0LjUgMTA4dDQwLjUgOTVxMTAgMTYgMjUgMTZxMTYgMCAyNyAtMTJxNzYgLTg0IDExMCAtMTE1cTEyMyAtMTExIDI3NiAtMTc3LjV0MzE3IC04MC41cS00IDIxIC00IDQ5cTAgMTY3IDExOC41IDI4NS41dDI4NS41IDExOC41IHExNjMgMCAyODIgLTExNHE5NSAyMCAyMDkgODJxOCA1IDE2IDVxMTMgMCAyMi41IC05LjV0OS41IC0yMi41cTAgLTI0IC0yOCAtNzN0LTUxIC03NnE3IDIgMzAgMTAuNXQ0MyAxNnQyNCA3LjVxMTMgMCAyMi41IC05LjV0OS41IC0yMi41eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDlhOyIgaG9yaXotYWR2LXg9Ijc2OCIgZD0iTTU2MCAxMTI1cS00OSAwIC02MiAtMTUuNXQtMTMgLTY2LjV2LTg4aDIxN3ExNiAwIDI3IC0xMnExMSAtMTMgMTAgLTI5bC0xNCAtMjAwcS0yIC0xNSAtMTIuNSAtMjUuNXQtMjUuNSAtMTAuNWgtMjAydi03NjhxMCAtMTYgLTExIC0yN3QtMjYgLTExaC0yNTBxLTE2IDAgLTI3IDExdC0xMSAyN3Y3NjhoLTEyMnEtMTYgMCAtMjcgMTEuNXQtMTEgMjcuNXYyMDBxMCAxNiAxMSAyN3QyNyAxMWgxMjJ2MTAzcTAgMTc3IDg4IDI2My41IHQyNjcgODYuNXExMjAgMCAyMjUgLTMwcTE0IC00IDIyIC0xNnQ2IC0yNmwtMjcgLTE5NXEtMiAtMTYgLTE2IC0yNnEtMTQgLTkgLTMwIC02cS03NiAxNiAtMTM1IDE2eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMDliOyIgZD0iTTE0MDggNjQwcTAgMTMwIC01MSAyNDguNXQtMTM2LjUgMjA0dC0yMDQgMTM2LjV0LTI0OC41IDUxdC0yNDguNSAtNTF0LTIwNCAtMTM2LjV0LTEzNi41IC0yMDR0LTUxIC0yNDguNXEwIC0yMDkgMTI0LjUgLTM3OC41dDMyMy41IC0yMzEuNXYxNjlxLTU0IC03IC02OSAtN3EtMTEwIDAgLTE1MyAxMDBxLTE1IDM4IC0zNiA2M3EtNSA2IC0yMSAxOXQtMjguNSAyNHQtMTIuNSAxNnEwIDEyIDI4IDEycTI5IDAgNTEuNSAtMTQuNXQzOCAtMzUgdDMxLjUgLTQxLjV0NDAuNSAtMzUuNXQ1Ni41IC0xNC41cTQyIDAgODEgMTRxMTYgNTcgNjMgODlxLTE2NiAxNiAtMjQ2IDgzLjV0LTgwIDIyNC41cTAgMTE4IDczIDE5OHEtMTQgNDIgLTE0IDg0cTAgNTggMjcgMTA5cTU3IDAgMTAxIC0xOS41dDEwMSAtNjAuNXE3NiAxOCAxNjkgMThxODAgMCAxNTMgLTE2cTU3IDQwIDEwMC41IDU5dDk5LjUgMTlxMjcgLTUxIDI3IC0xMDlxMCAtNDMgLTE0IC04M3E3MyAtODIgNzMgLTE5OSBxMCAtMTU3IC04MCAtMjI1LjV0LTI0NSAtODMuNXE2OSAtNDcgNjkgLTEzMXYtMjI2cTE5OSA2MiAzMjMuNSAyMzEuNXQxMjQuNSAzNzguNXpNMTUzNiA2NDBxMCAtMjA5IC0xMDMgLTM4NS41dC0yNzkuNSAtMjc5LjV0LTM4NS41IC0xMDN0LTM4NS41IDEwM3QtMjc5LjUgMjc5LjV0LTEwMyAzODUuNXQxMDMgMzg1LjV0Mjc5LjUgMjc5LjV0Mzg1LjUgMTAzdDM4NS41IC0xMDN0Mjc5LjUgLTI3OS41dDEwMyAtMzg1LjV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwOWM7IiBob3Jpei1hZHYteD0iMTY2NCIgZD0iTTcwNCAxNjBxMCA2IC0xNSA1N3QtMzUgMTE1LjV0LTIwIDY1LjVxMzIgMTYgNTEgNDd0MTkgNjdxMCA1MyAtMzcuNSA5MC41dC05MC41IDM3LjV0LTkwLjUgLTM3LjV0LTM3LjUgLTkwLjVxMCAtMzYgMTkgLTY2LjV0NTEgLTQ3LjVxMCAtMiAtMjAgLTY2dC0zNSAtMTE1dC0xNSAtNTdxMCAtMTMgOS41IC0yMi41dDIyLjUgLTkuNWgxOTJxMTMgMCAyMi41IDkuNXQ5LjUgMjIuNXpNMTY2NCA5NjB2LTI1NnEwIC0yNiAtMTkgLTQ1dC00NSAtMTkgaC02NHEtMjYgMCAtNDUgMTl0LTE5IDQ1djI1NnEwIDEwNiAtNzUgMTgxdC0xODEgNzV0LTE4MSAtNzV0LTc1IC0xODF2LTE5Mmg5NnE0MCAwIDY4IC0yOHQyOCAtNjh2LTU3NnEwIC00MCAtMjggLTY4dC02OCAtMjhoLTk2MHEtNDAgMCAtNjggMjh0LTI4IDY4djU3NnEwIDQwIDI4IDY4dDY4IDI4aDY3MnYxOTJxMCAxODUgMTMxLjUgMzE2LjV0MzE2LjUgMTMxLjV0MzE2LjUgLTEzMS41dDEzMS41IC0zMTYuNXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjA5ZDsiIGhvcml6LWFkdi14PSIxOTIwIiBkPSJNMTc2MCAxNDA4cTY2IDAgMTEzIC00N3Q0NyAtMTEzdi0xMjE2cTAgLTY2IC00NyAtMTEzdC0xMTMgLTQ3aC0xNjAwcS02NiAwIC0xMTMgNDd0LTQ3IDExM3YxMjE2cTAgNjYgNDcgMTEzdDExMyA0N2gxNjAwek0xNjAgMTI4MHEtMTMgMCAtMjIuNSAtOS41dC05LjUgLTIyLjV2LTIyNGgxNjY0djIyNHEwIDEzIC05LjUgMjIuNXQtMjIuNSA5LjVoLTE2MDB6TTE3NjAgMHExMyAwIDIyLjUgOS41dDkuNSAyMi41djYwOGgtMTY2NHYtNjA4IHEwIC0xMyA5LjUgLTIyLjV0MjIuNSAtOS41aDE2MDB6TTI1NiAxMjh2MTI4aDI1NnYtMTI4aC0yNTZ6TTY0MCAxMjh2MTI4aDM4NHYtMTI4aC0zODR6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwOWU7IiBob3Jpei1hZHYteD0iMTQwOCIgZD0iTTM4NCAxOTJxMCAtODAgLTU2IC0xMzZ0LTEzNiAtNTZ0LTEzNiA1NnQtNTYgMTM2dDU2IDEzNnQxMzYgNTZ0MTM2IC01NnQ1NiAtMTM2ek04OTYgNjlxMiAtMjggLTE3IC00OHEtMTggLTIxIC00NyAtMjFoLTEzNXEtMjUgMCAtNDMgMTYuNXQtMjAgNDEuNXEtMjIgMjI5IC0xODQuNSAzOTEuNXQtMzkxLjUgMTg0LjVxLTI1IDIgLTQxLjUgMjB0LTE2LjUgNDN2MTM1cTAgMjkgMjEgNDdxMTcgMTcgNDMgMTdoNXExNjAgLTEzIDMwNiAtODAuNSB0MjU5IC0xODEuNXExMTQgLTExMyAxODEuNSAtMjU5dDgwLjUgLTMwNnpNMTQwOCA2N3EyIC0yNyAtMTggLTQ3cS0xOCAtMjAgLTQ2IC0yMGgtMTQzcS0yNiAwIC00NC41IDE3LjV0LTE5LjUgNDIuNXEtMTIgMjE1IC0xMDEgNDA4LjV0LTIzMS41IDMzNnQtMzM2IDIzMS41dC00MDguNSAxMDJxLTI1IDEgLTQyLjUgMTkuNXQtMTcuNSA0My41djE0M3EwIDI4IDIwIDQ2cTE4IDE4IDQ0IDE4aDNxMjYyIC0xMyA1MDEuNSAtMTIwdDQyNS41IC0yOTQgcTE4NyAtMTg2IDI5NCAtNDI1LjV0MTIwIC01MDEuNXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjBhMDsiIGQ9Ik0xMDQwIDMyMHEwIC0zMyAtMjMuNSAtNTYuNXQtNTYuNSAtMjMuNXQtNTYuNSAyMy41dC0yMy41IDU2LjV0MjMuNSA1Ni41dDU2LjUgMjMuNXQ1Ni41IC0yMy41dDIzLjUgLTU2LjV6TTEyOTYgMzIwcTAgLTMzIC0yMy41IC01Ni41dC01Ni41IC0yMy41dC01Ni41IDIzLjV0LTIzLjUgNTYuNXQyMy41IDU2LjV0NTYuNSAyMy41dDU2LjUgLTIzLjV0MjMuNSAtNTYuNXpNMTQwOCAxNjB2MzIwcTAgMTMgLTkuNSAyMi41dC0yMi41IDkuNSBoLTEyMTZxLTEzIDAgLTIyLjUgLTkuNXQtOS41IC0yMi41di0zMjBxMCAtMTMgOS41IC0yMi41dDIyLjUgLTkuNWgxMjE2cTEzIDAgMjIuNSA5LjV0OS41IDIyLjV6TTE3OCA2NDBoMTE4MGwtMTU3IDQ4MnEtNCAxMyAtMTYgMjEuNXQtMjYgOC41aC03ODJxLTE0IDAgLTI2IC04LjV0LTE2IC0yMS41ek0xNTM2IDQ4MHYtMzIwcTAgLTY2IC00NyAtMTEzdC0xMTMgLTQ3aC0xMjE2cS02NiAwIC0xMTMgNDd0LTQ3IDExM3YzMjBxMCAyNSAxNiA3NSBsMTk3IDYwNnExNyA1MyA2MyA4NnQxMDEgMzNoNzgycTU1IDAgMTAxIC0zM3Q2MyAtODZsMTk3IC02MDZxMTYgLTUwIDE2IC03NXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjBhMTsiIGhvcml6LWFkdi14PSIxNzkyIiBkPSJNMTY2NCA4OTZxNTMgMCA5MC41IC0zNy41dDM3LjUgLTkwLjV0LTM3LjUgLTkwLjV0LTkwLjUgLTM3LjV2LTM4NHEwIC01MiAtMzggLTkwdC05MCAtMzhxLTQxNyAzNDcgLTgxMiAzODBxLTU4IC0xOSAtOTEgLTY2dC0zMSAtMTAwLjV0NDAgLTkyLjVxLTIwIC0zMyAtMjMgLTY1LjV0NiAtNTh0MzMuNSAtNTV0NDggLTUwdDYxLjUgLTUwLjVxLTI5IC01OCAtMTExLjUgLTgzdC0xNjguNSAtMTEuNXQtMTMyIDU1LjVxLTcgMjMgLTI5LjUgODcuNSB0LTMyIDk0LjV0LTIzIDg5dC0xNSAxMDF0My41IDk4LjV0MjIgMTEwLjVoLTEyMnEtNjYgMCAtMTEzIDQ3dC00NyAxMTN2MTkycTAgNjYgNDcgMTEzdDExMyA0N2g0ODBxNDM1IDAgODk2IDM4NHE1MiAwIDkwIC0zOHQzOCAtOTB2LTM4NHpNMTUzNiAyOTJ2OTU0cS0zOTQgLTMwMiAtNzY4IC0zNDN2LTI3MHEzNzcgLTQyIDc2OCAtMzQxeiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMGEyOyIgaG9yaXotYWR2LXg9IjE2NjQiIGQ9Ik04NDggLTE2MHEwIDE2IC0xNiAxNnEtNTkgMCAtMTAxLjUgNDIuNXQtNDIuNSAxMDEuNXEwIDE2IC0xNiAxNnQtMTYgLTE2cTAgLTczIDUxLjUgLTEyNC41dDEyNC41IC01MS41cTE2IDAgMTYgMTZ6TTE4MyAxMjhoMTI5OHEtMTY0IDE4MSAtMjQ2LjUgNDExLjV0LTgyLjUgNDg0LjVxMCAyNTYgLTMyMCAyNTZ0LTMyMCAtMjU2cTAgLTI1NCAtODIuNSAtNDg0LjV0LTI0Ni41IC00MTEuNXpNMTY2NCAxMjhxMCAtNTIgLTM4IC05MHQtOTAgLTM4IGgtNDQ4cTAgLTEwNiAtNzUgLTE4MXQtMTgxIC03NXQtMTgxIDc1dC03NSAxODFoLTQ0OHEtNTIgMCAtOTAgMzh0LTM4IDkwcTE5MCAxNjEgMjg3IDM5Ny41dDk3IDQ5OC41cTAgMTY1IDk2IDI2MnQyNjQgMTE3cS04IDE4IC04IDM3cTAgNDAgMjggNjh0NjggMjh0NjggLTI4dDI4IC02OHEwIC0xOSAtOCAtMzdxMTY4IC0yMCAyNjQgLTExN3Q5NiAtMjYycTAgLTI2MiA5NyAtNDk4LjV0Mjg3IC0zOTcuNXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjBhMzsiIGQ9Ik0xMzc2IDY0MGwxMzggLTEzNXEzMCAtMjggMjAgLTcwcS0xMiAtNDEgLTUyIC01MWwtMTg4IC00OGw1MyAtMTg2cTEyIC00MSAtMTkgLTcwcS0yOSAtMzEgLTcwIC0xOWwtMTg2IDUzbC00OCAtMTg4cS0xMCAtNDAgLTUxIC01MnEtMTIgLTIgLTE5IC0ycS0zMSAwIC01MSAyMmwtMTM1IDEzOGwtMTM1IC0xMzhxLTI4IC0zMCAtNzAgLTIwcS00MSAxMSAtNTEgNTJsLTQ4IDE4OGwtMTg2IC01M3EtNDEgLTEyIC03MCAxOXEtMzEgMjkgLTE5IDcwIGw1MyAxODZsLTE4OCA0OHEtNDAgMTAgLTUyIDUxcS0xMCA0MiAyMCA3MGwxMzggMTM1bC0xMzggMTM1cS0zMCAyOCAtMjAgNzBxMTIgNDEgNTIgNTFsMTg4IDQ4bC01MyAxODZxLTEyIDQxIDE5IDcwcTI5IDMxIDcwIDE5bDE4NiAtNTNsNDggMTg4cTEwIDQxIDUxIDUxcTQxIDEyIDcwIC0xOWwxMzUgLTEzOWwxMzUgMTM5cTI5IDMwIDcwIDE5cTQxIC0xMCA1MSAtNTFsNDggLTE4OGwxODYgNTNxNDEgMTIgNzAgLTE5cTMxIC0yOSAxOSAtNzAgbC01MyAtMTg2bDE4OCAtNDhxNDAgLTEwIDUyIC01MXExMCAtNDIgLTIwIC03MHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjBhNDsiIGhvcml6LWFkdi14PSIxNzkyIiBkPSJNMjU2IDE5MnEwIDI2IC0xOSA0NXQtNDUgMTl0LTQ1IC0xOXQtMTkgLTQ1dDE5IC00NXQ0NSAtMTl0NDUgMTl0MTkgNDV6TTE2NjQgNzY4cTAgNTEgLTM5IDg5LjV0LTg5IDM4LjVoLTU3NnEwIDIwIDE1IDQ4LjV0MzMgNTV0MzMgNjh0MTUgODQuNXEwIDY3IC00NC41IDk3LjV0LTExNS41IDMwLjVxLTI0IDAgLTkwIC0xMzlxLTI0IC00NCAtMzcgLTY1cS00MCAtNjQgLTExMiAtMTQ1cS03MSAtODEgLTEwMSAtMTA2IHEtNjkgLTU3IC0xNDAgLTU3aC0zMnYtNjQwaDMycTcyIDAgMTY3IC0zMnQxOTMuNSAtNjR0MTc5LjUgLTMycTE4OSAwIDE4OSAxNjdxMCAyNiAtNSA1NnEzMCAxNiA0Ny41IDUyLjV0MTcuNSA3My41dC0xOCA2OXE1MyA1MCA1MyAxMTlxMCAyNSAtMTAgNTUuNXQtMjUgNDcuNWgzMzFxNTIgMCA5MCAzOHQzOCA5MHpNMTc5MiA3NjlxMCAtMTA1IC03NS41IC0xODF0LTE4MC41IC03NmgtMTY5cS00IC02MiAtMzcgLTExOXEzIC0yMSAzIC00MyBxMCAtMTAxIC02MCAtMTc4cTEgLTEzOSAtODUgLTIxOS41dC0yMjcgLTgwLjVxLTEzMyAwIC0zMjIgNjlxLTE2NCA1OSAtMjIzIDU5aC0yODhxLTUzIDAgLTkwLjUgMzcuNXQtMzcuNSA5MC41djY0MHEwIDUzIDM3LjUgOTAuNXQ5MC41IDM3LjVoMjg4cTEwIDAgMjEuNSA0LjV0MjMuNSAxNHQyMi41IDE4dDI0IDIyLjV0MjAuNSAyMS41dDE5IDIxLjV0MTQgMTdxNjUgNzQgMTAwIDEyOXExMyAyMSAzMyA2MnQzNyA3MnQ0MC41IDYzdDU1IDQ5LjUgdDY5LjUgMTcuNXExMjUgMCAyMDYuNSAtNjd0ODEuNSAtMTg5cTAgLTY4IC0yMiAtMTI4aDM3NHExMDQgMCAxODAgLTc2dDc2IC0xNzl6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwYTU7IiBob3Jpei1hZHYteD0iMTc5MiIgZD0iTTEzNzYgMTI4aDMydjY0MGgtMzJxLTM1IDAgLTY3IDExLjV0LTY0IDM4LjV0LTQ4IDQ0dC01MCA1NXEtMiAzIC0zLjUgNC41dC00IDQuNXQtNC41IDVxLTcyIDgxIC0xMTIgMTQ1cS0xNCAyMiAtMzggNjhxLTEgMyAtMTAuNSAyMi41dC0xOC41IDM2dC0yMCAzNS41dC0yMS41IDMwLjV0LTE4LjUgMTEuNXEtNzEgMCAtMTE1LjUgLTMwLjV0LTQ0LjUgLTk3LjVxMCAtNDMgMTUgLTg0LjV0MzMgLTY4dDMzIC01NXQxNSAtNDguNWgtNTc2IHEtNTAgMCAtODkgLTM4LjV0LTM5IC04OS41cTAgLTUyIDM4IC05MHQ5MCAtMzhoMzMxcS0xNSAtMTcgLTI1IC00Ny41dC0xMCAtNTUuNXEwIC02OSA1MyAtMTE5cS0xOCAtMzIgLTE4IC02OXQxNy41IC03My41dDQ3LjUgLTUyLjVxLTQgLTI0IC00IC01NnEwIC04NSA0OC41IC0xMjZ0MTM1LjUgLTQxcTg0IDAgMTgzIDMydDE5NCA2NHQxNjcgMzJ6TTE2NjQgMTkycTAgMjYgLTE5IDQ1dC00NSAxOXQtNDUgLTE5dC0xOSAtNDV0MTkgLTQ1IHQ0NSAtMTl0NDUgMTl0MTkgNDV6TTE3OTIgNzY4di02NDBxMCAtNTMgLTM3LjUgLTkwLjV0LTkwLjUgLTM3LjVoLTI4OHEtNTkgMCAtMjIzIC01OXEtMTkwIC02OSAtMzE3IC02OXEtMTQyIDAgLTIzMCA3Ny41dC04NyAyMTcuNWwxIDVxLTYxIDc2IC02MSAxNzhxMCAyMiAzIDQzcS0zMyA1NyAtMzcgMTE5aC0xNjlxLTEwNSAwIC0xODAuNSA3NnQtNzUuNSAxODFxMCAxMDMgNzYgMTc5dDE4MCA3NmgzNzRxLTIyIDYwIC0yMiAxMjggcTAgMTIyIDgxLjUgMTg5dDIwNi41IDY3cTM4IDAgNjkuNSAtMTcuNXQ1NSAtNDkuNXQ0MC41IC02M3QzNyAtNzJ0MzMgLTYycTM1IC01NSAxMDAgLTEyOXEyIC0zIDE0IC0xN3QxOSAtMjEuNXQyMC41IC0yMS41dDI0IC0yMi41dDIyLjUgLTE4dDIzLjUgLTE0dDIxLjUgLTQuNWgyODhxNTMgMCA5MC41IC0zNy41dDM3LjUgLTkwLjV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwYTY7IiBkPSJNMTI4MCAtNjRxMCAyNiAtMTkgNDV0LTQ1IDE5dC00NSAtMTl0LTE5IC00NXQxOSAtNDV0NDUgLTE5dDQ1IDE5dDE5IDQ1ek0xNDA4IDcwMHEwIDE4OSAtMTY3IDE4OXEtMjYgMCAtNTYgLTVxLTE2IDMwIC01Mi41IDQ3LjV0LTczLjUgMTcuNXQtNjkgLTE4cS01MCA1MyAtMTE5IDUzcS0yNSAwIC01NS41IC0xMHQtNDcuNSAtMjV2MzMxcTAgNTIgLTM4IDkwdC05MCAzOHEtNTEgMCAtODkuNSAtMzl0LTM4LjUgLTg5di01NzYgcS0yMCAwIC00OC41IDE1dC01NSAzM3QtNjggMzN0LTg0LjUgMTVxLTY3IDAgLTk3LjUgLTQ0LjV0LTMwLjUgLTExNS41cTAgLTI0IDEzOSAtOTBxNDQgLTI0IDY1IC0zN3E2NCAtNDAgMTQ1IC0xMTJxODEgLTcxIDEwNiAtMTAxcTU3IC02OSA1NyAtMTQwdi0zMmg2NDB2MzJxMCA3MiAzMiAxNjd0NjQgMTkzLjV0MzIgMTc5LjV6TTE1MzYgNzA1cTAgLTEzMyAtNjkgLTMyMnEtNTkgLTE2NCAtNTkgLTIyM3YtMjg4cTAgLTUzIC0zNy41IC05MC41IHQtOTAuNSAtMzcuNWgtNjQwcS01MyAwIC05MC41IDM3LjV0LTM3LjUgOTAuNXYyODhxMCAxMCAtNC41IDIxLjV0LTE0IDIzLjV0LTE4IDIyLjV0LTIyLjUgMjR0LTIxLjUgMjAuNXQtMjEuNSAxOXQtMTcgMTRxLTc0IDY1IC0xMjkgMTAwcS0yMSAxMyAtNjIgMzN0LTcyIDM3dC02MyA0MC41dC00OS41IDU1dC0xNy41IDY5LjVxMCAxMjUgNjcgMjA2LjV0MTg5IDgxLjVxNjggMCAxMjggLTIydjM3NHEwIDEwNCA3NiAxODB0MTc5IDc2IHExMDUgMCAxODEgLTc1LjV0NzYgLTE4MC41di0xNjlxNjIgLTQgMTE5IC0zN3EyMSAzIDQzIDNxMTAxIDAgMTc4IC02MHExMzkgMSAyMTkuNSAtODV0ODAuNSAtMjI3eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMGE3OyIgZD0iTTE0MDggNTc2cTAgODQgLTMyIDE4M3QtNjQgMTk0dC0zMiAxNjd2MzJoLTY0MHYtMzJxMCAtNDYgLTI1IC05MXQtNTIgLTcydC03MiAtNjZxLTkgLTggLTE0IC0xMnEtODEgLTcyIC0xNDUgLTExMnEtMjIgLTE0IC02OCAtMzhxLTMgLTEgLTIyLjUgLTEwLjV0LTM2IC0xOC41dC0zNS41IC0yMHQtMzAuNSAtMjEuNXQtMTEuNSAtMTguNXEwIC03MSAzMC41IC0xMTUuNXQ5Ny41IC00NC41cTQzIDAgODQuNSAxNXQ2OCAzM3Q1NSAzMyB0NDguNSAxNXYtNTc2cTAgLTUwIDM4LjUgLTg5dDg5LjUgLTM5cTUyIDAgOTAgMzh0MzggOTB2MzMxcTQ2IC0zNSAxMDMgLTM1cTY5IDAgMTE5IDUzcTMyIC0xOCA2OSAtMTh0NzMuNSAxNy41dDUyLjUgNDcuNXEyNCAtNCA1NiAtNHE4NSAwIDEyNiA0OC41dDQxIDEzNS41ek0xMjgwIDEzNDRxMCAyNiAtMTkgNDV0LTQ1IDE5dC00NSAtMTl0LTE5IC00NXQxOSAtNDV0NDUgLTE5dDQ1IDE5dDE5IDQ1ek0xNTM2IDU4MHEwIC0xNDIgLTc3LjUgLTIzMCB0LTIxNy41IC04N2wtNSAxcS03NiAtNjEgLTE3OCAtNjFxLTIyIDAgLTQzIDNxLTU0IC0zMCAtMTE5IC0zN3YtMTY5cTAgLTEwNSAtNzYgLTE4MC41dC0xODEgLTc1LjVxLTEwMyAwIC0xNzkgNzZ0LTc2IDE4MHYzNzRxLTU0IC0yMiAtMTI4IC0yMnEtMTIxIDAgLTE4OC41IDgxLjV0LTY3LjUgMjA2LjVxMCAzOCAxNy41IDY5LjV0NDkuNSA1NXQ2MyA0MC41dDcyIDM3dDYyIDMzcTU1IDM1IDEyOSAxMDBxMyAyIDE3IDE0dDIxLjUgMTkgdDIxLjUgMjAuNXQyMi41IDI0dDE4IDIyLjV0MTQgMjMuNXQ0LjUgMjEuNXYyODhxMCA1MyAzNy41IDkwLjV0OTAuNSAzNy41aDY0MHE1MyAwIDkwLjUgLTM3LjV0MzcuNSAtOTAuNXYtMjg4cTAgLTU5IDU5IC0yMjNxNjkgLTE5MCA2OSAtMzE3eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMGE4OyIgZD0iTTEyODAgNTc2djEyOHEwIDI2IC0xOSA0NXQtNDUgMTloLTUwMmwxODkgMTg5cTE5IDE5IDE5IDQ1dC0xOSA0NWwtOTEgOTFxLTE4IDE4IC00NSAxOHQtNDUgLTE4bC0zNjIgLTM2MmwtOTEgLTkxcS0xOCAtMTggLTE4IC00NXQxOCAtNDVsOTEgLTkxbDM2MiAtMzYycTE4IC0xOCA0NSAtMTh0NDUgMThsOTEgOTFxMTggMTggMTggNDV0LTE4IDQ1bC0xODkgMTg5aDUwMnEyNiAwIDQ1IDE5dDE5IDQ1ek0xNTM2IDY0MCBxMCAtMjA5IC0xMDMgLTM4NS41dC0yNzkuNSAtMjc5LjV0LTM4NS41IC0xMDN0LTM4NS41IDEwM3QtMjc5LjUgMjc5LjV0LTEwMyAzODUuNXQxMDMgMzg1LjV0Mjc5LjUgMjc5LjV0Mzg1LjUgMTAzdDM4NS41IC0xMDN0Mjc5LjUgLTI3OS41dDEwMyAtMzg1LjV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwYTk7IiBkPSJNMTI4NSA2NDBxMCAyNyAtMTggNDVsLTkxIDkxbC0zNjIgMzYycS0xOCAxOCAtNDUgMTh0LTQ1IC0xOGwtOTEgLTkxcS0xOCAtMTggLTE4IC00NXQxOCAtNDVsMTg5IC0xODloLTUwMnEtMjYgMCAtNDUgLTE5dC0xOSAtNDV2LTEyOHEwIC0yNiAxOSAtNDV0NDUgLTE5aDUwMmwtMTg5IC0xODlxLTE5IC0xOSAtMTkgLTQ1dDE5IC00NWw5MSAtOTFxMTggLTE4IDQ1IC0xOHQ0NSAxOGwzNjIgMzYybDkxIDkxcTE4IDE4IDE4IDQ1ek0xNTM2IDY0MCBxMCAtMjA5IC0xMDMgLTM4NS41dC0yNzkuNSAtMjc5LjV0LTM4NS41IC0xMDN0LTM4NS41IDEwM3QtMjc5LjUgMjc5LjV0LTEwMyAzODUuNXQxMDMgMzg1LjV0Mjc5LjUgMjc5LjV0Mzg1LjUgMTAzdDM4NS41IC0xMDN0Mjc5LjUgLTI3OS41dDEwMyAtMzg1LjV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwYWE7IiBkPSJNMTI4NCA2NDFxMCAyNyAtMTggNDVsLTM2MiAzNjJsLTkxIDkxcS0xOCAxOCAtNDUgMTh0LTQ1IC0xOGwtOTEgLTkxbC0zNjIgLTM2MnEtMTggLTE4IC0xOCAtNDV0MTggLTQ1bDkxIC05MXExOCAtMTggNDUgLTE4dDQ1IDE4bDE4OSAxODl2LTUwMnEwIC0yNiAxOSAtNDV0NDUgLTE5aDEyOHEyNiAwIDQ1IDE5dDE5IDQ1djUwMmwxODkgLTE4OXExOSAtMTkgNDUgLTE5dDQ1IDE5bDkxIDkxcTE4IDE4IDE4IDQ1ek0xNTM2IDY0MCBxMCAtMjA5IC0xMDMgLTM4NS41dC0yNzkuNSAtMjc5LjV0LTM4NS41IC0xMDN0LTM4NS41IDEwM3QtMjc5LjUgMjc5LjV0LTEwMyAzODUuNXQxMDMgMzg1LjV0Mjc5LjUgMjc5LjV0Mzg1LjUgMTAzdDM4NS41IC0xMDN0Mjc5LjUgLTI3OS41dDEwMyAtMzg1LjV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwYWI7IiBkPSJNMTI4NCA2MzlxMCAyNyAtMTggNDVsLTkxIDkxcS0xOCAxOCAtNDUgMTh0LTQ1IC0xOGwtMTg5IC0xODl2NTAycTAgMjYgLTE5IDQ1dC00NSAxOWgtMTI4cS0yNiAwIC00NSAtMTl0LTE5IC00NXYtNTAybC0xODkgMTg5cS0xOSAxOSAtNDUgMTl0LTQ1IC0xOWwtOTEgLTkxcS0xOCAtMTggLTE4IC00NXQxOCAtNDVsMzYyIC0zNjJsOTEgLTkxcTE4IC0xOCA0NSAtMTh0NDUgMThsOTEgOTFsMzYyIDM2MnExOCAxOCAxOCA0NXpNMTUzNiA2NDAgcTAgLTIwOSAtMTAzIC0zODUuNXQtMjc5LjUgLTI3OS41dC0zODUuNSAtMTAzdC0zODUuNSAxMDN0LTI3OS41IDI3OS41dC0xMDMgMzg1LjV0MTAzIDM4NS41dDI3OS41IDI3OS41dDM4NS41IDEwM3QzODUuNSAtMTAzdDI3OS41IC0yNzkuNXQxMDMgLTM4NS41eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMGFjOyIgZD0iTTExOTMgOTkzcTExIDcgMjUgMjJ2LTFxMCAtMiAtOS41IC0xMHQtMTEuNSAtMTJxLTEgMSAtNCAxek0xMTg3IDk5MnEtMSAxIC0yLjUgM3QtMS41IDNxMyAtMiAxMCAtNXEtNiAtNCAtNiAtMXpNNzI4IDExNzVxLTE2IDIgLTI2IDVxMSAwIDYuNSAtMXQxMC41IC0ydDkgLTJ6TTc3MyAxMjEycTcgNCAxMy41IDIuNXQ3LjUgLTcuNXEtNSAzIC0yMSA1ek03NjUgMTIwNmwtMyAycS0yIDMgLTUuNSA1dC00LjUgMnEyIC0xIDIxIC0zIHEtNiAtNCAtOCAtNnpNNjYzIDEyOTB2MnExIC0yIDMgLTUuNXQzIC01LjV6TTU1OCAxMjUwcTAgLTIgLTEgLTJsLTEgMmgyek05MzMgMjA2di0xdjF6TTc2OCAxNDA4cTIwOSAwIDM4NS41IC0xMDN0Mjc5LjUgLTI3OS41dDEwMyAtMzg1LjV0LTEwMyAtMzg1LjV0LTI3OS41IC0yNzkuNXQtMzg1LjUgLTEwM3QtMzg1LjUgMTAzdC0yNzkuNSAyNzkuNXQtMTAzIDM4NS41dDEwMyAzODUuNXQyNzkuNSAyNzkuNXQzODUuNSAxMDN6TTEyNDAgMTYyIGw1IDVxLTcgMTAgLTI5IDEycTEgMTIgLTE0IDI2LjV0LTI3IDE1LjVxMCA0IC0xMC41IDExdC0xNy41IDhxLTkgMiAtMjcgLTlxLTcgLTMgLTQgLTVxLTMgMyAtMTIgMTF0LTE2IDExcS0yIDEgLTcuNSAxdC04LjUgMnEtMSAxIC02IDQuNXQtNyA0LjV0LTYuNSAzdC03LjUgMS41dC03LjUgLTIuNXQtOC41IC02dC00LjUgLTE1LjV0LTIuNSAtMTQuNXEtOCA2IC0wLjUgMjB0MS41IDIwcS03IDcgLTIxIDAuNXQtMjEgLTE1LjUgcS0xIC0xIC05LjUgLTUuNXQtMTEuNSAtNy41cS00IC02IC05IC0xNy41dC02IC0xMy41cTAgMiAtMi41IDYuNXQtMi41IDYuNXEtMTIgLTIgLTE2IDNxNSAtMTYgOCAtMTdsLTQgMnEtMSAtNiAzIC0xNXQ0IC0xMXExIC01IC0xLjUgLTEzdC0yLjUgLTExcTAgLTIgNSAtMTFxNCAtMTkgLTIgLTMycTAgLTEgLTMuNSAtN3QtNi41IC0xMWwtMiAtNWwtMiAxcS0xIDEgLTIgMHEtMSAtNiAtOSAtMTN0LTEwIC0xMXEtMTUgLTIzIC05IC0zOCBxMyAtOCAxMCAtMTBxMyAtMSAzIDJxMSAtOSAtMTEgLTI3cTEgLTEgNCAtM3EtMTcgMCAtMTAgLTE0cTIwMiAzNiAzNTIgMTgxaC0zek02ODAgMzQ3cTE2IDMgMzAuNSAtMTZ0MjIuNSAtMjNxNDEgLTIwIDU5IC0xMXEwIC05IDE0IC0yOHEzIC00IDYuNSAtMTEuNXQ1LjUgLTEwLjVxNSAtNyAxOSAtMTZ0MTkgLTE2cTYgMyA5IDlxMTMgLTM1IDI0IC0zNHE1IDAgOCA4cTAgLTEgLTAuNSAtM3QtMS41IC0zcTcgMTUgNSAyNmw2IDRxNSA0IDUgNSBxLTYgNiAtOSAtM3EtMzAgLTE0IC00OCAyMnEtMiAzIC00LjUgOHQtNSAxMnQtMS41IDExLjV0NiA0LjVxMTEgMCAxMi41IDEuNXQtMi41IDZ0LTQgNy41cS0xIDQgLTEuNSAxMi41dC0xLjUgMTIuNWwtNSA2cS01IDYgLTExLjUgMTMuNXQtNy41IDkuNXEtNCAtMTAgLTE2LjUgLTguNXQtMTguNSA5LjVxMSAtMiAtMC41IC02LjV0LTEuNSAtNi41cS0xNCAwIC0xNyAxcTEgNiAzIDIxdDQgMjJxMSA1IDUuNSAxMy41dDggMTUuNXQ0LjUgMTQgdC00LjUgMTAuNXQtMTguNSAyLjVxLTIwIC0xIC0yOSAtMjJxLTEgLTMgLTMgLTExLjV0LTUgLTEyLjV0LTkgLTdxLTggLTMgLTI3IC0ydC0yNiA1cS0xNCA4IC0yNCAzMC41dC0xMSA0MS41cTAgMTAgMyAyNy41dDMgMjd0LTYgMjYuNXEzIDIgMTAgMTAuNXQxMSAxMS41cTIgMiA1IDJoNXQ0IDJ0MyA2cS0xIDEgLTQgM3EtMyAzIC00IDNxNCAtMyAxOSAtMXQxOSAycTAgMSAyMiAwcTE3IC0xMyAyNCAycTAgMSAtMi41IDEwLjV0LTAuNSAxNC41IHE1IC0yOSAzMiAtMTBxMyAtNCAxNi41IC02dDE4LjUgLTVxMyAtMiA3IC01LjV0NiAtNXQ2IC0wLjV0OSA3cTExIC0xNyAxMyAtMjVxMTEgLTQzIDIwIC00OHE4IC0yIDEyLjUgLTJ0NSAxMC41dDAgMTUuNXQtMS41IDEzbC0yIDM3cS0xNiAzIC0yMCAxMi41dDEuNSAyMHQxNi41IDE5LjVxMSAxIDE2LjUgOHQyMS41IDEycTI0IDE5IDE3IDM5cTkgLTIgMTEgOWwtNSAzcS00IDMgLTggNS41dC01IDEuNXExMSA3IDIgMThxNSAzIDggMTEuNSB0OSAxMS41cTkgLTE0IDIyIC0zcTggOSAyIDE4cTUgOCAyMiAxMS41dDIwIDkuNXE1IC0xIDcgMHQyIDQuNXY3LjV0MSA4LjV0MyA3LjVxNCA2IDE2IDEwLjV0MTQgNS41bDE5IDEycTQgNCAwIDRxMTggLTIgMzIgMTFxMTMgMTIgLTUgMjNxMiA3IC00IDEwLjV0LTE2IDUuNXEzIDEgMTIgMC41dDEyIDEuNXExNSAxMSAtNyAxN3EtMjAgNSAtNDcgLTEzcS0zIC0yIC0xMyAtMTJ0LTE3IC0xMXExNSAxOCA1IDIycTggLTEgMjIuNSA5dDE1LjUgMTEgcTQgMiAxMC41IDIuNXQ4LjUgMS41cTcxIDI1IDkyIC0xcTggMTEgMTEgMTV0OS41IDl0MTUuNSA4cTIxIDcgMjMgOWwxIDIzcS0xMiAtMSAtMTggOHQtNyAyMmwtNiAtOHEwIDYgLTMuNSA3LjV0LTcuNSAwLjV0LTkuNSAtMnQtNy41IDBxLTkgMiAtMTkuNSAxNS41dC0xNC41IDE2LjVxOSAwIDkgNXEtMiA1IC0xMCA4cTEgNiAtMiA4dC05IDBxLTIgMTIgLTEgMTNxLTYgMSAtMTEgMTF0LTggMTBxLTIgMCAtNC41IC0ydC01IC01LjVsLTUgLTcgdC0zLjUgLTUuNWwtMiAtMnEtMTIgNiAtMjQgLTEwcS05IDEgLTE3IC0ycTE1IDYgMiAxM3EtMTEgNSAtMjEgMnExMiA1IDEwIDE0dC0xMiAxNnExIDAgNCAtMXQ0IC0xcS0xIDUgLTkuNSA5LjV0LTE5LjUgOXQtMTQgNi41cS03IDUgLTM2IDEwLjV0LTM2IDEuNXEtNSAtMyAtNiAtNnQxLjUgLTguNXQzLjUgLTguNXE2IC0yMyA1IC0yN3EtMSAtMyAtOC41IC04dC01LjUgLTEycTEgLTQgMTEuNSAtMTB0MTIuNSAtMTJxNSAtMTMgLTQgLTI1IHEtNCAtNSAtMTUgLTExdC0xNCAtMTBxLTUgLTUgLTMuNSAtMTEuNXQwLjUgLTkuNXExIDEgMSAyLjV0MSAyLjVxMCAtMTMgMTEgLTIycTggLTYgLTE2IC0xOHEtMjAgLTExIC0yMCAtNHExIDggLTcuNSAxNnQtMTAuNSAxMnQtMy41IDE5dC05LjUgMjFxLTYgNCAtMTkgNHQtMTggLTVxMCAxMCAtNDkgMzBxLTE3IDggLTU4IDRxNyAxIDAgMTdxLTggMTYgLTIxIDEycS04IDI1IC00IDM1cTIgNSA5IDE0dDkgMTVxMSAzIDE1LjUgNnQxNi41IDggcTEgNCAtMi41IDYuNXQtOS41IDQuNXE1MyAtNiA2MyAxOHE1IDkgMyAxNHEwIC0xIDIgLTF0MiAtMXExMiAzIDcgMTdxMTkgOCAyNiA4cTUgLTEgMTEgLTZ0MTAgLTVxMTcgLTMgMjEuNSAxMHQtOS41IDIzcTcgLTQgNyA2cS0xIDEzIC03IDE5cS0zIDIgLTYuNSAyLjV0LTYuNSAwdC03IDAuNXEtMSAwIC04IDJxLTEgLTEgLTIgLTFoLThxLTQgLTIgLTQgLTV2LTFxLTEgLTMgNCAtNmw1IC0xbDMgLTJxLTEgMCAtMi41IC0yLjV0LTIuNSAtMi41IHEwIC0zIDMgLTVxLTIgLTEgLTE0IC03LjV0LTE3IC0xMC41cS0xIC0xIC00IC0yLjV0LTQgLTIuNXEtMiAtMSAtNCAydC00IDl0LTQgMTEuNXQtNC41IDEwdC01LjUgNC41cS0xMiAwIC0xOCAtMTdxMyAxMCAtMTMgMTcuNXQtMjUgNy41cTIwIDE1IC05IDMwbC0xIDFxLTMwIC00IC00NSAtN3EtMiAtNiAzIC0xMnEtMSAtNyA2IC05cTAgLTEgMC41IC0xdDAuNSAtMXEwIDEgLTAuNSAxdC0wLjUgMXEzIC0xIDEwLjUgLTEuNXQ5LjUgLTEuNSBxMyAtMSA0LjUgLTJsNy41IC01dDUuNSAtNnQtMi41IC01cS0yIC0xIC05IC00dC0xMi41IC01LjV0LTYuNSAtMy41cS0zIC01IDAgLTE2dC0yIC0xNXEtNSA1IC0xMCAxOC41dC04IDE3LjVxOCAtOSAtMzAgLTZsLTggMXEtNCAwIC0xNSAtMnQtMTYgLTFxLTcgMCAtMjkgNnE3IDE3IDUgMjVxNSAwIDcgMmwtNiAzcS0zIC0xIC0yNSAtOXEyIC0zIDggLTkuNXQ5IC0xMS41cS0yMiA2IC0yNyAtMnEwIC0xIC05IDBxLTI1IDEgLTI0IC03IHExIC00IDkgLTEycTAgLTkgLTEgLTlxLTI3IDIyIC0zMCAyM3EtMTcyIC04MyAtMjc2IC0yNDhxMSAtMiAyLjUgLTExdDMuNSAtOC41dDExIDQuNXE5IC05IDMgLTIxcTIgMiAzNiAtMjFxNTYgLTQwIDIyIC01M3Y1LjV0MSA2LjVxLTkgLTEgLTE5IDVxLTMgLTYgMC41IC0yMHQxMS41IC0xNHEtOCAwIC0xMC41IC0xN3QtMi41IC0zOC41dC0xIC0yNS41bDIgLTFxLTMgLTEzIDYgLTM3LjV0MjQgLTIwLjVxLTQgLTE4IDUgLTIxcS0xIC00IDAgLTggdDQuNSAtOC41dDYgLTdsNy41IC03LjVsNiAtNnEyOCAtMTEgNDEgLTI5cTQgLTYgMTAuNSAtMjQuNXQxNS41IC0yNS41cS0yIC02IDEwIC0yMS41dDExIC0yNS41cS0xIDAgLTIuNSAtMC41dC0yLjUgLTAuNXEzIC04IDE2LjUgLTE2dDE2LjUgLTE0cTIgLTMgMi41IC0xMC41dDMgLTEydDguNSAtMi41cTMgMjQgLTI2IDY4cS0xNiAyNyAtMTggMzFxLTMgNSAtNS41IDE2LjV0LTQuNSAxNS41cTI3IC05IDI2IC0xM3EtNSAtMTAgMjYgLTUyIHEyIC0zIDEwIC0xMHQxMSAtMTJxMyAtNCA5LjUgLTE0LjV0MTAuNSAtMTUuNXEtMSAwIC0zIC0ybC0zIC0zcTQgLTIgOSAtNXQ4IC00LjV0Ny41IC01dDcuNSAtNy41cTE2IC0xOCAyMCAtMzNxMSAtNCAwLjUgLTE1LjV0MS41IC0xNi41cTIgLTYgNiAtMTF0MTEuNSAtMTB0MTEuNSAtN3QxNC41IC02LjV0MTEuNSAtNS41cTIgLTEgMTggLTExdDI1IC0xNHExMCAtNCAxNi41IC00LjV0MTYgMi41dDE1LjUgNHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjBhZDsiIGhvcml6LWFkdi14PSIxNjY0IiBkPSJNMzg0IDY0cTAgMjYgLTE5IDQ1dC00NSAxOXQtNDUgLTE5dC0xOSAtNDV0MTkgLTQ1dDQ1IC0xOXQ0NSAxOXQxOSA0NXpNMTAyOCA0ODRsLTY4MiAtNjgycS0zNyAtMzcgLTkwIC0zN3EtNTIgMCAtOTEgMzdsLTEwNiAxMDhxLTM4IDM2IC0zOCA5MHEwIDUzIDM4IDkxbDY4MSA2ODFxMzkgLTk4IDExNC41IC0xNzMuNXQxNzMuNSAtMTE0LjV6TTE2NjIgOTE5cTAgLTM5IC0yMyAtMTA2cS00NyAtMTM0IC0xNjQuNSAtMjE3LjUgdC0yNTguNSAtODMuNXEtMTg1IDAgLTMxNi41IDEzMS41dC0xMzEuNSAzMTYuNXQxMzEuNSAzMTYuNXQzMTYuNSAxMzEuNXE1OCAwIDEyMS41IC0xNi41dDEwNy41IC00Ni41cTE2IC0xMSAxNiAtMjh0LTE2IC0yOGwtMjkzIC0xNjl2LTIyNGwxOTMgLTEwN3E1IDMgNzkgNDguNXQxMzUuNSA4MXQ3MC41IDM1LjVxMTUgMCAyMy41IC0xMHQ4LjUgLTI1eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMGFlOyIgaG9yaXotYWR2LXg9IjE3OTIiIGQ9Ik0xMDI0IDEyOGg2NDB2MTI4aC02NDB2LTEyOHpNNjQwIDY0MGgxMDI0djEyOGgtMTAyNHYtMTI4ek0xMjgwIDExNTJoMzg0djEyOGgtMzg0di0xMjh6TTE3OTIgMzIwdi0yNTZxMCAtMjYgLTE5IC00NXQtNDUgLTE5aC0xNjY0cS0yNiAwIC00NSAxOXQtMTkgNDV2MjU2cTAgMjYgMTkgNDV0NDUgMTloMTY2NHEyNiAwIDQ1IC0xOXQxOSAtNDV6TTE3OTIgODMydi0yNTZxMCAtMjYgLTE5IC00NXQtNDUgLTE5aC0xNjY0cS0yNiAwIC00NSAxOSB0LTE5IDQ1djI1NnEwIDI2IDE5IDQ1dDQ1IDE5aDE2NjRxMjYgMCA0NSAtMTl0MTkgLTQ1ek0xNzkyIDEzNDR2LTI1NnEwIC0yNiAtMTkgLTQ1dC00NSAtMTloLTE2NjRxLTI2IDAgLTQ1IDE5dC0xOSA0NXYyNTZxMCAyNiAxOSA0NXQ0NSAxOWgxNjY0cTI2IDAgNDUgLTE5dDE5IC00NXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjBiMDsiIGhvcml6LWFkdi14PSIxNDA4IiBkPSJNMTQwMyAxMjQxcTE3IC00MSAtMTQgLTcwbC00OTMgLTQ5M3YtNzQycTAgLTQyIC0zOSAtNTlxLTEzIC01IC0yNSAtNXEtMjcgMCAtNDUgMTlsLTI1NiAyNTZxLTE5IDE5IC0xOSA0NXY0ODZsLTQ5MyA0OTNxLTMxIDI5IC0xNCA3MHExNyAzOSA1OSAzOWgxMjgwcTQyIDAgNTkgLTM5eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMGIxOyIgaG9yaXotYWR2LXg9IjE3OTIiIGQ9Ik02NDAgMTE1Mmg1MTJ2MTI4aC01MTJ2LTEyOHpNMTc5MiA1MTJ2LTQ4MHEwIC02NiAtNDcgLTExM3QtMTEzIC00N2gtMTQ3MnEtNjYgMCAtMTEzIDQ3dC00NyAxMTN2NDgwaDY3MnYtMTYwcTAgLTI2IDE5IC00NXQ0NSAtMTloMzIwcTI2IDAgNDUgMTl0MTkgNDV2MTYwaDY3MnpNMTAyNCA1MTJ2LTEyOGgtMjU2djEyOGgyNTZ6TTE3OTIgOTkydi0zODRoLTE3OTJ2Mzg0cTAgNjYgNDcgMTEzdDExMyA0N2gzNTJ2MTYwcTAgNDAgMjggNjggdDY4IDI4aDU3NnE0MCAwIDY4IC0yOHQyOCAtNjh2LTE2MGgzNTJxNjYgMCAxMTMgLTQ3dDQ3IC0xMTN6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwYjI7IiBkPSJNMTI4MyA5OTVsLTM1NSAtMzU1bDM1NSAtMzU1bDE0NCAxNDRxMjkgMzEgNzAgMTRxMzkgLTE3IDM5IC01OXYtNDQ4cTAgLTI2IC0xOSAtNDV0LTQ1IC0xOWgtNDQ4cS00MiAwIC01OSA0MHEtMTcgMzkgMTQgNjlsMTQ0IDE0NGwtMzU1IDM1NWwtMzU1IC0zNTVsMTQ0IC0xNDRxMzEgLTMwIDE0IC02OXEtMTcgLTQwIC01OSAtNDBoLTQ0OHEtMjYgMCAtNDUgMTl0LTE5IDQ1djQ0OHEwIDQyIDQwIDU5cTM5IDE3IDY5IC0xNGwxNDQgLTE0NCBsMzU1IDM1NWwtMzU1IDM1NWwtMTQ0IC0xNDRxLTE5IC0xOSAtNDUgLTE5cS0xMiAwIC0yNCA1cS00MCAxNyAtNDAgNTl2NDQ4cTAgMjYgMTkgNDV0NDUgMTloNDQ4cTQyIDAgNTkgLTQwcTE3IC0zOSAtMTQgLTY5bC0xNDQgLTE0NGwzNTUgLTM1NWwzNTUgMzU1bC0xNDQgMTQ0cS0zMSAzMCAtMTQgNjlxMTcgNDAgNTkgNDBoNDQ4cTI2IDAgNDUgLTE5dDE5IC00NXYtNDQ4cTAgLTQyIC0zOSAtNTlxLTEzIC01IC0yNSAtNXEtMjYgMCAtNDUgMTl6ICIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMGMwOyIgaG9yaXotYWR2LXg9IjE5MjAiIGQ9Ik01OTMgNjQwcS0xNjIgLTUgLTI2NSAtMTI4aC0xMzRxLTgyIDAgLTEzOCA0MC41dC01NiAxMTguNXEwIDM1MyAxMjQgMzUzcTYgMCA0My41IC0yMXQ5Ny41IC00Mi41dDExOSAtMjEuNXE2NyAwIDEzMyAyM3EtNSAtMzcgLTUgLTY2cTAgLTEzOSA4MSAtMjU2ek0xNjY0IDNxMCAtMTIwIC03MyAtMTg5LjV0LTE5NCAtNjkuNWgtODc0cS0xMjEgMCAtMTk0IDY5LjV0LTczIDE4OS41cTAgNTMgMy41IDEwMy41dDE0IDEwOXQyNi41IDEwOC41IHQ0MyA5Ny41dDYyIDgxdDg1LjUgNTMuNXQxMTEuNSAyMHExMCAwIDQzIC0yMS41dDczIC00OHQxMDcgLTQ4dDEzNSAtMjEuNXQxMzUgMjEuNXQxMDcgNDh0NzMgNDh0NDMgMjEuNXE2MSAwIDExMS41IC0yMHQ4NS41IC01My41dDYyIC04MXQ0MyAtOTcuNXQyNi41IC0xMDguNXQxNCAtMTA5dDMuNSAtMTAzLjV6TTY0MCAxMjgwcTAgLTEwNiAtNzUgLTE4MXQtMTgxIC03NXQtMTgxIDc1dC03NSAxODF0NzUgMTgxdDE4MSA3NXQxODEgLTc1IHQ3NSAtMTgxek0xMzQ0IDg5NnEwIC0xNTkgLTExMi41IC0yNzEuNXQtMjcxLjUgLTExMi41dC0yNzEuNSAxMTIuNXQtMTEyLjUgMjcxLjV0MTEyLjUgMjcxLjV0MjcxLjUgMTEyLjV0MjcxLjUgLTExMi41dDExMi41IC0yNzEuNXpNMTkyMCA2NzFxMCAtNzggLTU2IC0xMTguNXQtMTM4IC00MC41aC0xMzRxLTEwMyAxMjMgLTI2NSAxMjhxODEgMTE3IDgxIDI1NnEwIDI5IC01IDY2cTY2IC0yMyAxMzMgLTIzcTU5IDAgMTE5IDIxLjV0OTcuNSA0Mi41IHQ0My41IDIxcTEyNCAwIDEyNCAtMzUzek0xNzkyIDEyODBxMCAtMTA2IC03NSAtMTgxdC0xODEgLTc1dC0xODEgNzV0LTc1IDE4MXQ3NSAxODF0MTgxIDc1dDE4MSAtNzV0NzUgLTE4MXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjBjMTsiIGhvcml6LWFkdi14PSIxNjY0IiBkPSJNMTQ1NiAzMjBxMCA0MCAtMjggNjhsLTIwOCAyMDhxLTI4IDI4IC02OCAyOHEtNDIgMCAtNzIgLTMycTMgLTMgMTkgLTE4LjV0MjEuNSAtMjEuNXQxNSAtMTl0MTMgLTI1LjV0My41IC0yNy41cTAgLTQwIC0yOCAtNjh0LTY4IC0yOHEtMTUgMCAtMjcuNSAzLjV0LTI1LjUgMTN0LTE5IDE1dC0yMS41IDIxLjV0LTE4LjUgMTlxLTMzIC0zMSAtMzMgLTczcTAgLTQwIDI4IC02OGwyMDYgLTIwN3EyNyAtMjcgNjggLTI3cTQwIDAgNjggMjYgbDE0NyAxNDZxMjggMjggMjggNjd6TTc1MyAxMDI1cTAgNDAgLTI4IDY4bC0yMDYgMjA3cS0yOCAyOCAtNjggMjhxLTM5IDAgLTY4IC0yN2wtMTQ3IC0xNDZxLTI4IC0yOCAtMjggLTY3cTAgLTQwIDI4IC02OGwyMDggLTIwOHEyNyAtMjcgNjggLTI3cTQyIDAgNzIgMzFxLTMgMyAtMTkgMTguNXQtMjEuNSAyMS41dC0xNSAxOXQtMTMgMjUuNXQtMy41IDI3LjVxMCA0MCAyOCA2OHQ2OCAyOHExNSAwIDI3LjUgLTMuNXQyNS41IC0xM3QxOSAtMTUgdDIxLjUgLTIxLjV0MTguNSAtMTlxMzMgMzEgMzMgNzN6TTE2NDggMzIwcTAgLTEyMCAtODUgLTIwM2wtMTQ3IC0xNDZxLTgzIC04MyAtMjAzIC04M3EtMTIxIDAgLTIwNCA4NWwtMjA2IDIwN3EtODMgODMgLTgzIDIwM3EwIDEyMyA4OCAyMDlsLTg4IDg4cS04NiAtODggLTIwOCAtODhxLTEyMCAwIC0yMDQgODRsLTIwOCAyMDhxLTg0IDg0IC04NCAyMDR0ODUgMjAzbDE0NyAxNDZxODMgODMgMjAzIDgzcTEyMSAwIDIwNCAtODVsMjA2IC0yMDcgcTgzIC04MyA4MyAtMjAzcTAgLTEyMyAtODggLTIwOWw4OCAtODhxODYgODggMjA4IDg4cTEyMCAwIDIwNCAtODRsMjA4IC0yMDhxODQgLTg0IDg0IC0yMDR6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwYzI7IiBob3Jpei1hZHYteD0iMTkyMCIgZD0iTTE5MjAgMzg0cTAgLTE1OSAtMTEyLjUgLTI3MS41dC0yNzEuNSAtMTEyLjVoLTEwODhxLTE4NSAwIC0zMTYuNSAxMzEuNXQtMTMxLjUgMzE2LjVxMCAxMzIgNzEgMjQxLjV0MTg3IDE2My41cS0yIDI4IC0yIDQzcTAgMjEyIDE1MCAzNjJ0MzYyIDE1MHExNTggMCAyODYuNSAtODh0MTg3LjUgLTIzMHE3MCA2MiAxNjYgNjJxMTA2IDAgMTgxIC03NXQ3NSAtMTgxcTAgLTc1IC00MSAtMTM4cTEyOSAtMzAgMjEzIC0xMzQuNXQ4NCAtMjM5LjV6ICIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMGMzOyIgaG9yaXotYWR2LXg9IjE2NjQiIGQ9Ik0xNTI3IDg4cTU2IC04OSAyMS41IC0xNTIuNXQtMTQwLjUgLTYzLjVoLTExNTJxLTEwNiAwIC0xNDAuNSA2My41dDIxLjUgMTUyLjVsNTAzIDc5M3YzOTloLTY0cS0yNiAwIC00NSAxOXQtMTkgNDV0MTkgNDV0NDUgMTloNTEycTI2IDAgNDUgLTE5dDE5IC00NXQtMTkgLTQ1dC00NSAtMTloLTY0di0zOTl6TTc0OCA4MTNsLTI3MiAtNDI5aDcxMmwtMjcyIDQyOWwtMjAgMzF2Mzd2Mzk5aC0xMjh2LTM5OXYtMzd6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwYzQ7IiBob3Jpei1hZHYteD0iMTc5MiIgZD0iTTk2MCA2NDBxMjYgMCA0NSAtMTl0MTkgLTQ1dC0xOSAtNDV0LTQ1IC0xOXQtNDUgMTl0LTE5IDQ1dDE5IDQ1dDQ1IDE5ek0xMjYwIDU3Nmw1MDcgLTM5OHEyOCAtMjAgMjUgLTU2cS01IC0zNSAtMzUgLTUxbC0xMjggLTY0cS0xMyAtNyAtMjkgLTdxLTE3IDAgLTMxIDhsLTY5MCAzODdsLTExMCAtNjZxLTggLTQgLTEyIC01cTE0IC00OSAxMCAtOTdxLTcgLTc3IC01NiAtMTQ3LjV0LTEzMiAtMTIzLjVxLTEzMiAtODQgLTI3NyAtODQgcS0xMzYgMCAtMjIyIDc4cS05MCA4NCAtNzkgMjA3cTcgNzYgNTYgMTQ3dDEzMSAxMjRxMTMyIDg0IDI3OCA4NHE4MyAwIDE1MSAtMzFxOSAxMyAyMiAyMmwxMjIgNzNsLTEyMiA3M3EtMTMgOSAtMjIgMjJxLTY4IC0zMSAtMTUxIC0zMXEtMTQ2IDAgLTI3OCA4NHEtODIgNTMgLTEzMSAxMjR0LTU2IDE0N3EtNSA1OSAxNS41IDExM3Q2My41IDkzcTg1IDc5IDIyMiA3OXExNDUgMCAyNzcgLTg0cTgzIC01MiAxMzIgLTEyM3Q1NiAtMTQ4IHE0IC00OCAtMTAgLTk3cTQgLTEgMTIgLTVsMTEwIC02Nmw2OTAgMzg3cTE0IDggMzEgOHExNiAwIDI5IC03bDEyOCAtNjRxMzAgLTE2IDM1IC01MXEzIC0zNiAtMjUgLTU2ek01NzkgODM2cTQ2IDQyIDIxIDEwOHQtMTA2IDExN3EtOTIgNTkgLTE5MiA1OXEtNzQgMCAtMTEzIC0zNnEtNDYgLTQyIC0yMSAtMTA4dDEwNiAtMTE3cTkyIC01OSAxOTIgLTU5cTc0IDAgMTEzIDM2ek00OTQgOTFxODEgNTEgMTA2IDExN3QtMjEgMTA4IHEtMzkgMzYgLTExMyAzNnEtMTAwIDAgLTE5MiAtNTlxLTgxIC01MSAtMTA2IC0xMTd0MjEgLTEwOHEzOSAtMzYgMTEzIC0zNnExMDAgMCAxOTIgNTl6TTY3MiA3MDRsOTYgLTU4djExcTAgMzYgMzMgNTZsMTQgOGwtNzkgNDdsLTI2IC0yNnEtMyAtMyAtMTAgLTExdC0xMiAtMTJxLTIgLTIgLTQgLTMuNXQtMyAtMi41ek04OTYgNDgwbDk2IC0zMmw3MzYgNTc2bC0xMjggNjRsLTc2OCAtNDMxdi0xMTNsLTE2MCAtOTZsOSAtOHEyIC0yIDcgLTYgcTQgLTQgMTEgLTEydDExIC0xMmwyNiAtMjZ6TTE2MDAgNjRsMTI4IDY0bC01MjAgNDA4bC0xNzcgLTEzOHEtMiAtMyAtMTMgLTd6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwYzU7IiBob3Jpei1hZHYteD0iMTc5MiIgZD0iTTE2OTYgMTE1MnE0MCAwIDY4IC0yOHQyOCAtNjh2LTEyMTZxMCAtNDAgLTI4IC02OHQtNjggLTI4aC05NjBxLTQwIDAgLTY4IDI4dC0yOCA2OHYyODhoLTU0NHEtNDAgMCAtNjggMjh0LTI4IDY4djY3MnEwIDQwIDIwIDg4dDQ4IDc2bDQwOCA0MDhxMjggMjggNzYgNDh0ODggMjBoNDE2cTQwIDAgNjggLTI4dDI4IC02OHYtMzI4cTY4IDQwIDEyOCA0MGg0MTZ6TTExNTIgOTM5bC0yOTkgLTI5OWgyOTl2Mjk5ek01MTIgMTMyM2wtMjk5IC0yOTkgaDI5OXYyOTl6TTcwOCA2NzZsMzE2IDMxNnY0MTZoLTM4NHYtNDE2cTAgLTQwIC0yOCAtNjh0LTY4IC0yOGgtNDE2di02NDBoNTEydjI1NnEwIDQwIDIwIDg4dDQ4IDc2ek0xNjY0IC0xMjh2MTE1MmgtMzg0di00MTZxMCAtNDAgLTI4IC02OHQtNjggLTI4aC00MTZ2LTY0MGg4OTZ6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwYzY7IiBob3Jpei1hZHYteD0iMTQwOCIgZD0iTTE0MDQgMTUxcTAgLTExNyAtNzkgLTE5NnQtMTk2IC03OXEtMTM1IDAgLTIzNSAxMDBsLTc3NyA3NzZxLTExMyAxMTUgLTExMyAyNzFxMCAxNTkgMTEwIDI3MHQyNjkgMTExcTE1OCAwIDI3MyAtMTEzbDYwNSAtNjA2cTEwIC0xMCAxMCAtMjJxMCAtMTYgLTMwLjUgLTQ2LjV0LTQ2LjUgLTMwLjVxLTEzIDAgLTIzIDEwbC02MDYgNjA3cS03OSA3NyAtMTgxIDc3cS0xMDYgMCAtMTc5IC03NXQtNzMgLTE4MXEwIC0xMDUgNzYgLTE4MSBsNzc2IC03NzdxNjMgLTYzIDE0NSAtNjNxNjQgMCAxMDYgNDJ0NDIgMTA2cTAgODIgLTYzIDE0NWwtNTgxIDU4MXEtMjYgMjQgLTYwIDI0cS0yOSAwIC00OCAtMTl0LTE5IC00OHEwIC0zMiAyNSAtNTlsNDEwIC00MTBxMTAgLTEwIDEwIC0yMnEwIC0xNiAtMzEgLTQ3dC00NyAtMzFxLTEyIDAgLTIyIDEwbC00MTAgNDEwcS02MyA2MSAtNjMgMTQ5cTAgODIgNTcgMTM5dDEzOSA1N3E4OCAwIDE0OSAtNjNsNTgxIC01ODFxMTAwIC05OCAxMDAgLTIzNSB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwYzc7IiBkPSJNMzg0IDBoNzY4djM4NGgtNzY4di0zODR6TTEyODAgMGgxMjh2ODk2cTAgMTQgLTEwIDM4LjV0LTIwIDM0LjVsLTI4MSAyODFxLTEwIDEwIC0zNCAyMHQtMzkgMTB2LTQxNnEwIC00MCAtMjggLTY4dC02OCAtMjhoLTU3NnEtNDAgMCAtNjggMjh0LTI4IDY4djQxNmgtMTI4di0xMjgwaDEyOHY0MTZxMCA0MCAyOCA2OHQ2OCAyOGg4MzJxNDAgMCA2OCAtMjh0MjggLTY4di00MTZ6TTg5NiA5Mjh2MzIwcTAgMTMgLTkuNSAyMi41dC0yMi41IDkuNSBoLTE5MnEtMTMgMCAtMjIuNSAtOS41dC05LjUgLTIyLjV2LTMyMHEwIC0xMyA5LjUgLTIyLjV0MjIuNSAtOS41aDE5MnExMyAwIDIyLjUgOS41dDkuNSAyMi41ek0xNTM2IDg5NnYtOTI4cTAgLTQwIC0yOCAtNjh0LTY4IC0yOGgtMTM0NHEtNDAgMCAtNjggMjh0LTI4IDY4djEzNDRxMCA0MCAyOCA2OHQ2OCAyOGg5MjhxNDAgMCA4OCAtMjB0NzYgLTQ4bDI4MCAtMjgwcTI4IC0yOCA0OCAtNzZ0MjAgLTg4eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMGM4OyIgZD0iTTE1MzYgMTEyMHYtOTYwcTAgLTExOSAtODQuNSAtMjAzLjV0LTIwMy41IC04NC41aC05NjBxLTExOSAwIC0yMDMuNSA4NC41dC04NC41IDIwMy41djk2MHEwIDExOSA4NC41IDIwMy41dDIwMy41IDg0LjVoOTYwcTExOSAwIDIwMy41IC04NC41dDg0LjUgLTIwMy41eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMGM5OyIgZD0iTTE1MzYgMTkydi0xMjhxMCAtMjYgLTE5IC00NXQtNDUgLTE5aC0xNDA4cS0yNiAwIC00NSAxOXQtMTkgNDV2MTI4cTAgMjYgMTkgNDV0NDUgMTloMTQwOHEyNiAwIDQ1IC0xOXQxOSAtNDV6TTE1MzYgNzA0di0xMjhxMCAtMjYgLTE5IC00NXQtNDUgLTE5aC0xNDA4cS0yNiAwIC00NSAxOXQtMTkgNDV2MTI4cTAgMjYgMTkgNDV0NDUgMTloMTQwOHEyNiAwIDQ1IC0xOXQxOSAtNDV6TTE1MzYgMTIxNnYtMTI4cTAgLTI2IC0xOSAtNDUgdC00NSAtMTloLTE0MDhxLTI2IDAgLTQ1IDE5dC0xOSA0NXYxMjhxMCAyNiAxOSA0NXQ0NSAxOWgxNDA4cTI2IDAgNDUgLTE5dDE5IC00NXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjBjYTsiIGhvcml6LWFkdi14PSIxNzkyIiBkPSJNMzg0IDEyOHEwIC04MCAtNTYgLTEzNnQtMTM2IC01NnQtMTM2IDU2dC01NiAxMzZ0NTYgMTM2dDEzNiA1NnQxMzYgLTU2dDU2IC0xMzZ6TTM4NCA2NDBxMCAtODAgLTU2IC0xMzZ0LTEzNiAtNTZ0LTEzNiA1NnQtNTYgMTM2dDU2IDEzNnQxMzYgNTZ0MTM2IC01NnQ1NiAtMTM2ek0xNzkyIDIyNHYtMTkycTAgLTEzIC05LjUgLTIyLjV0LTIyLjUgLTkuNWgtMTIxNnEtMTMgMCAtMjIuNSA5LjV0LTkuNSAyMi41djE5MnEwIDEzIDkuNSAyMi41IHQyMi41IDkuNWgxMjE2cTEzIDAgMjIuNSAtOS41dDkuNSAtMjIuNXpNMzg0IDExNTJxMCAtODAgLTU2IC0xMzZ0LTEzNiAtNTZ0LTEzNiA1NnQtNTYgMTM2dDU2IDEzNnQxMzYgNTZ0MTM2IC01NnQ1NiAtMTM2ek0xNzkyIDczNnYtMTkycTAgLTEzIC05LjUgLTIyLjV0LTIyLjUgLTkuNWgtMTIxNnEtMTMgMCAtMjIuNSA5LjV0LTkuNSAyMi41djE5MnEwIDEzIDkuNSAyMi41dDIyLjUgOS41aDEyMTZxMTMgMCAyMi41IC05LjV0OS41IC0yMi41eiBNMTc5MiAxMjQ4di0xOTJxMCAtMTMgLTkuNSAtMjIuNXQtMjIuNSAtOS41aC0xMjE2cS0xMyAwIC0yMi41IDkuNXQtOS41IDIyLjV2MTkycTAgMTMgOS41IDIyLjV0MjIuNSA5LjVoMTIxNnExMyAwIDIyLjUgLTkuNXQ5LjUgLTIyLjV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwY2I7IiBob3Jpei1hZHYteD0iMTc5MiIgZD0iTTM4MSAtODRxMCAtODAgLTU0LjUgLTEyNnQtMTM1LjUgLTQ2cS0xMDYgMCAtMTcyIDY2bDU3IDg4cTQ5IC00NSAxMDYgLTQ1cTI5IDAgNTAuNSAxNC41dDIxLjUgNDIuNXEwIDY0IC0xMDUgNTZsLTI2IDU2cTggMTAgMzIuNSA0My41dDQyLjUgNTR0MzcgMzguNXYxcS0xNiAwIC00OC41IC0xdC00OC41IC0xdi01M2gtMTA2djE1MmgzMzN2LTg4bC05NSAtMTE1cTUxIC0xMiA4MSAtNDl0MzAgLTg4ek0zODMgNTQzdi0xNTloLTM2MiBxLTYgMzYgLTYgNTRxMCA1MSAyMy41IDkzdDU2LjUgNjh0NjYgNDcuNXQ1Ni41IDQzLjV0MjMuNSA0NXEwIDI1IC0xNC41IDM4LjV0LTM5LjUgMTMuNXEtNDYgMCAtODEgLTU4bC04NSA1OXEyNCA1MSA3MS41IDc5LjV0MTA1LjUgMjguNXE3MyAwIDEyMyAtNDEuNXQ1MCAtMTEyLjVxMCAtNTAgLTM0IC05MS41dC03NSAtNjQuNXQtNzUuNSAtNTAuNXQtMzUuNSAtNTIuNWgxMjd2NjBoMTA1ek0xNzkyIDIyNHYtMTkycTAgLTEzIC05LjUgLTIyLjUgdC0yMi41IC05LjVoLTEyMTZxLTEzIDAgLTIyLjUgOS41dC05LjUgMjIuNXYxOTJxMCAxNCA5IDIzdDIzIDloMTIxNnExMyAwIDIyLjUgLTkuNXQ5LjUgLTIyLjV6TTM4NCAxMTIzdi05OWgtMzM1djk5aDEwN3EwIDQxIDAuNSAxMjJ0MC41IDEyMXYxMmgtMnEtOCAtMTcgLTUwIC01NGwtNzEgNzZsMTM2IDEyN2gxMDZ2LTQwNGgxMDh6TTE3OTIgNzM2di0xOTJxMCAtMTMgLTkuNSAtMjIuNXQtMjIuNSAtOS41aC0xMjE2cS0xMyAwIC0yMi41IDkuNSB0LTkuNSAyMi41djE5MnEwIDE0IDkgMjN0MjMgOWgxMjE2cTEzIDAgMjIuNSAtOS41dDkuNSAtMjIuNXpNMTc5MiAxMjQ4di0xOTJxMCAtMTMgLTkuNSAtMjIuNXQtMjIuNSAtOS41aC0xMjE2cS0xMyAwIC0yMi41IDkuNXQtOS41IDIyLjV2MTkycTAgMTMgOS41IDIyLjV0MjIuNSA5LjVoMTIxNnExMyAwIDIyLjUgLTkuNXQ5LjUgLTIyLjV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwY2M7IiBob3Jpei1hZHYteD0iMTc5MiIgZD0iTTE3NjAgNjQwcTE0IDAgMjMgLTl0OSAtMjN2LTY0cTAgLTE0IC05IC0yM3QtMjMgLTloLTE3MjhxLTE0IDAgLTIzIDl0LTkgMjN2NjRxMCAxNCA5IDIzdDIzIDloMTcyOHpNNDgzIDcwNHEtMjggMzUgLTUxIDgwcS00OCA5NyAtNDggMTg4cTAgMTgxIDEzNCAzMDlxMTMzIDEyNyAzOTMgMTI3cTUwIDAgMTY3IC0xOXE2NiAtMTIgMTc3IC00OHExMCAtMzggMjEgLTExOHExNCAtMTIzIDE0IC0xODNxMCAtMTggLTUgLTQ1bC0xMiAtM2wtODQgNiBsLTE0IDJxLTUwIDE0OSAtMTAzIDIwNXEtODggOTEgLTIxMCA5MXEtMTE0IDAgLTE4MiAtNTlxLTY3IC01OCAtNjcgLTE0NnEwIC03MyA2NiAtMTQwdDI3OSAtMTI5cTY5IC0yMCAxNzMgLTY2cTU4IC0yOCA5NSAtNTJoLTc0M3pNOTkwIDQ0OGg0MTFxNyAtMzkgNyAtOTJxMCAtMTExIC00MSAtMjEycS0yMyAtNTUgLTcxIC0xMDRxLTM3IC0zNSAtMTA5IC04MXEtODAgLTQ4IC0xNTMgLTY2cS04MCAtMjEgLTIwMyAtMjFxLTExNCAwIC0xOTUgMjMgbC0xNDAgNDBxLTU3IDE2IC03MiAyOHEtOCA4IC04IDIydjEzcTAgMTA4IC0yIDE1NnEtMSAzMCAwIDY4bDIgMzd2NDRsMTAyIDJxMTUgLTM0IDMwIC03MXQyMi41IC01NnQxMi41IC0yN3EzNSAtNTcgODAgLTk0cTQzIC0zNiAxMDUgLTU3cTU5IC0yMiAxMzIgLTIycTY0IDAgMTM5IDI3cTc3IDI2IDEyMiA4NnE0NyA2MSA0NyAxMjlxMCA4NCAtODEgMTU3cS0zNCAyOSAtMTM3IDcxeiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMGNkOyIgZD0iTTQ4IDEzMTNxLTM3IDIgLTQ1IDRsLTMgODhxMTMgMSA0MCAxcTYwIDAgMTEyIC00cTEzMiAtNyAxNjYgLTdxODYgMCAxNjggM3ExMTYgNCAxNDYgNXE1NiAwIDg2IDJsLTEgLTE0bDIgLTY0di05cS02MCAtOSAtMTI0IC05cS02MCAwIC03OSAtMjVxLTEzIC0xNCAtMTMgLTEzMnEwIC0xMyAwLjUgLTMyLjV0MC41IC0yNS41bDEgLTIyOWwxNCAtMjgwcTYgLTEyNCA1MSAtMjAycTM1IC01OSA5NiAtOTJxODggLTQ3IDE3NyAtNDcgcTEwNCAwIDE5MSAyOHE1NiAxOCA5OSA1MXE0OCAzNiA2NSA2NHEzNiA1NiA1MyAxMTRxMjEgNzMgMjEgMjI5cTAgNzkgLTMuNSAxMjh0LTExIDEyMi41dC0xMy41IDE1OS41bC00IDU5cS01IDY3IC0yNCA4OHEtMzQgMzUgLTc3IDM0bC0xMDAgLTJsLTE0IDNsMiA4Nmg4NGwyMDUgLTEwcTc2IC0zIDE5NiAxMGwxOCAtMnE2IC0zOCA2IC01MXEwIC03IC00IC0zMXEtNDUgLTEyIC04NCAtMTNxLTczIC0xMSAtNzkgLTE3cS0xNSAtMTUgLTE1IC00MSBxMCAtNyAxLjUgLTI3dDEuNSAtMzFxOCAtMTkgMjIgLTM5NnE2IC0xOTUgLTE1IC0zMDRxLTE1IC03NiAtNDEgLTEyMnEtMzggLTY1IC0xMTIgLTEyM3EtNzUgLTU3IC0xODIgLTg5cS0xMDkgLTMzIC0yNTUgLTMzcS0xNjcgMCAtMjg0IDQ2cS0xMTkgNDcgLTE3OSAxMjJxLTYxIDc2IC04MyAxOTVxLTE2IDgwIC0xNiAyMzd2MzMzcTAgMTg4IC0xNyAyMTNxLTI1IDM2IC0xNDcgMzl6TTE1MzYgLTk2djY0cTAgMTQgLTkgMjN0LTIzIDloLTE0NzIgcS0xNCAwIC0yMyAtOXQtOSAtMjN2LTY0cTAgLTE0IDkgLTIzdDIzIC05aDE0NzJxMTQgMCAyMyA5dDkgMjN6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwY2U7IiBob3Jpei1hZHYteD0iMTY2NCIgZD0iTTUxMiAxNjB2MTkycTAgMTQgLTkgMjN0LTIzIDloLTMyMHEtMTQgMCAtMjMgLTl0LTkgLTIzdi0xOTJxMCAtMTQgOSAtMjN0MjMgLTloMzIwcTE0IDAgMjMgOXQ5IDIzek01MTIgNTQ0djE5MnEwIDE0IC05IDIzdC0yMyA5aC0zMjBxLTE0IDAgLTIzIC05dC05IC0yM3YtMTkycTAgLTE0IDkgLTIzdDIzIC05aDMyMHExNCAwIDIzIDl0OSAyM3pNMTAyNCAxNjB2MTkycTAgMTQgLTkgMjN0LTIzIDloLTMyMHEtMTQgMCAtMjMgLTl0LTkgLTIzIHYtMTkycTAgLTE0IDkgLTIzdDIzIC05aDMyMHExNCAwIDIzIDl0OSAyM3pNNTEyIDkyOHYxOTJxMCAxNCAtOSAyM3QtMjMgOWgtMzIwcS0xNCAwIC0yMyAtOXQtOSAtMjN2LTE5MnEwIC0xNCA5IC0yM3QyMyAtOWgzMjBxMTQgMCAyMyA5dDkgMjN6TTEwMjQgNTQ0djE5MnEwIDE0IC05IDIzdC0yMyA5aC0zMjBxLTE0IDAgLTIzIC05dC05IC0yM3YtMTkycTAgLTE0IDkgLTIzdDIzIC05aDMyMHExNCAwIDIzIDl0OSAyM3pNMTUzNiAxNjB2MTkyIHEwIDE0IC05IDIzdC0yMyA5aC0zMjBxLTE0IDAgLTIzIC05dC05IC0yM3YtMTkycTAgLTE0IDkgLTIzdDIzIC05aDMyMHExNCAwIDIzIDl0OSAyM3pNMTAyNCA5Mjh2MTkycTAgMTQgLTkgMjN0LTIzIDloLTMyMHEtMTQgMCAtMjMgLTl0LTkgLTIzdi0xOTJxMCAtMTQgOSAtMjN0MjMgLTloMzIwcTE0IDAgMjMgOXQ5IDIzek0xNTM2IDU0NHYxOTJxMCAxNCAtOSAyM3QtMjMgOWgtMzIwcS0xNCAwIC0yMyAtOXQtOSAtMjN2LTE5MiBxMCAtMTQgOSAtMjN0MjMgLTloMzIwcTE0IDAgMjMgOXQ5IDIzek0xNTM2IDkyOHYxOTJxMCAxNCAtOSAyM3QtMjMgOWgtMzIwcS0xNCAwIC0yMyAtOXQtOSAtMjN2LTE5MnEwIC0xNCA5IC0yM3QyMyAtOWgzMjBxMTQgMCAyMyA5dDkgMjN6TTE2NjQgMTI0OHYtMTA4OHEwIC02NiAtNDcgLTExM3QtMTEzIC00N2gtMTM0NHEtNjYgMCAtMTEzIDQ3dC00NyAxMTN2MTA4OHEwIDY2IDQ3IDExM3QxMTMgNDdoMTM0NHE2NiAwIDExMyAtNDd0NDcgLTExMyB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwZDA7IiBob3Jpei1hZHYteD0iMTY2NCIgZD0iTTExOTAgOTU1bDI5MyAyOTNsLTEwNyAxMDdsLTI5MyAtMjkzek0xNjM3IDEyNDhxMCAtMjcgLTE4IC00NWwtMTI4NiAtMTI4NnEtMTggLTE4IC00NSAtMTh0LTQ1IDE4bC0xOTggMTk4cS0xOCAxOCAtMTggNDV0MTggNDVsMTI4NiAxMjg2cTE4IDE4IDQ1IDE4dDQ1IC0xOGwxOTggLTE5OHExOCAtMTggMTggLTQ1ek0yODYgMTQzOGw5OCAtMzBsLTk4IC0zMGwtMzAgLTk4bC0zMCA5OGwtOTggMzBsOTggMzBsMzAgOTh6TTYzNiAxMjc2IGwxOTYgLTYwbC0xOTYgLTYwbC02MCAtMTk2bC02MCAxOTZsLTE5NiA2MGwxOTYgNjBsNjAgMTk2ek0xNTY2IDc5OGw5OCAtMzBsLTk4IC0zMGwtMzAgLTk4bC0zMCA5OGwtOTggMzBsOTggMzBsMzAgOTh6TTkyNiAxNDM4bDk4IC0zMGwtOTggLTMwbC0zMCAtOThsLTMwIDk4bC05OCAzMGw5OCAzMGwzMCA5OHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjBkMTsiIGhvcml6LWFkdi14PSIxNzkyIiBkPSJNNjQwIDEyOHEwIDUyIC0zOCA5MHQtOTAgMzh0LTkwIC0zOHQtMzggLTkwdDM4IC05MHQ5MCAtMzh0OTAgMzh0MzggOTB6TTI1NiA2NDBoMzg0djI1NmgtMTU4cS0xMyAwIC0yMiAtOWwtMTk1IC0xOTVxLTkgLTkgLTkgLTIydi0zMHpNMTUzNiAxMjhxMCA1MiAtMzggOTB0LTkwIDM4dC05MCAtMzh0LTM4IC05MHQzOCAtOTB0OTAgLTM4dDkwIDM4dDM4IDkwek0xNzkyIDEyMTZ2LTEwMjRxMCAtMTUgLTQgLTI2LjV0LTEzLjUgLTE4LjUgdC0xNi41IC0xMS41dC0yMy41IC02dC0yMi41IC0ydC0yNS41IDB0LTIyLjUgMC41cTAgLTEwNiAtNzUgLTE4MXQtMTgxIC03NXQtMTgxIDc1dC03NSAxODFoLTM4NHEwIC0xMDYgLTc1IC0xODF0LTE4MSAtNzV0LTE4MSA3NXQtNzUgMTgxaC02NHEtMyAwIC0yMi41IC0wLjV0LTI1LjUgMHQtMjIuNSAydC0yMy41IDZ0LTE2LjUgMTEuNXQtMTMuNSAxOC41dC00IDI2LjVxMCAyNiAxOSA0NXQ0NSAxOXYzMjBxMCA4IC0wLjUgMzV0MCAzOCB0Mi41IDM0LjV0Ni41IDM3dDE0IDMwLjV0MjIuNSAzMGwxOTggMTk4cTE5IDE5IDUwLjUgMzJ0NTguNSAxM2gxNjB2MTkycTAgMjYgMTkgNDV0NDUgMTloMTAyNHEyNiAwIDQ1IC0xOXQxOSAtNDV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwZDI7IiBkPSJNMTUzNiA2NDBxMCAtMjA5IC0xMDMgLTM4NS41dC0yNzkuNSAtMjc5LjV0LTM4NS41IC0xMDNxLTExMSAwIC0yMTggMzJxNTkgOTMgNzggMTY0cTkgMzQgNTQgMjExcTIwIC0zOSA3MyAtNjcuNXQxMTQgLTI4LjVxMTIxIDAgMjE2IDY4LjV0MTQ3IDE4OC41dDUyIDI3MHEwIDExNCAtNTkuNSAyMTR0LTE3Mi41IDE2M3QtMjU1IDYzcS0xMDUgMCAtMTk2IC0yOXQtMTU0LjUgLTc3dC0xMDkgLTExMC41dC02NyAtMTI5LjV0LTIxLjUgLTEzNCBxMCAtMTA0IDQwIC0xODN0MTE3IC0xMTFxMzAgLTEyIDM4IDIwcTIgNyA4IDMxdDggMzBxNiAyMyAtMTEgNDNxLTUxIDYxIC01MSAxNTFxMCAxNTEgMTA0LjUgMjU5LjV0MjczLjUgMTA4LjVxMTUxIDAgMjM1LjUgLTgydDg0LjUgLTIxM3EwIC0xNzAgLTY4LjUgLTI4OXQtMTc1LjUgLTExOXEtNjEgMCAtOTggNDMuNXQtMjMgMTA0LjVxOCAzNSAyNi41IDkzLjV0MzAgMTAzdDExLjUgNzUuNXEwIDUwIC0yNyA4M3QtNzcgMzMgcS02MiAwIC0xMDUgLTU3dC00MyAtMTQycTAgLTczIDI1IC0xMjJsLTk5IC00MThxLTE3IC03MCAtMTMgLTE3N3EtMjA2IDkxIC0zMzMgMjgxdC0xMjcgNDIzcTAgMjA5IDEwMyAzODUuNXQyNzkuNSAyNzkuNXQzODUuNSAxMDN0Mzg1LjUgLTEwM3QyNzkuNSAtMjc5LjV0MTAzIC0zODUuNXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjBkMzsiIGQ9Ik0xMjQ4IDE0MDhxMTE5IDAgMjAzLjUgLTg0LjV0ODQuNSAtMjAzLjV2LTk2MHEwIC0xMTkgLTg0LjUgLTIwMy41dC0yMDMuNSAtODQuNWgtNzI1cTg1IDEyMiAxMDggMjEwcTkgMzQgNTMgMjA5cTIxIC0zOSA3My41IC02N3QxMTIuNSAtMjhxMTgxIDAgMjk1LjUgMTQ3LjV0MTE0LjUgMzczLjVxMCA4NCAtMzUgMTYyLjV0LTk2LjUgMTM5dC0xNTIuNSA5N3QtMTk3IDM2LjVxLTEwNCAwIC0xOTQuNSAtMjguNXQtMTUzIC03Ni41IHQtMTA3LjUgLTEwOS41dC02Ni41IC0xMjh0LTIxLjUgLTEzMi41cTAgLTEwMiAzOS41IC0xODB0MTE2LjUgLTExMHExMyAtNSAyMy41IDB0MTQuNSAxOXExMCA0NCAxNSA2MXE2IDIzIC0xMSA0MnEtNTAgNjIgLTUwIDE1MHEwIDE1MCAxMDMuNSAyNTYuNXQyNzAuNSAxMDYuNXExNDkgMCAyMzIuNSAtODF0ODMuNSAtMjEwcTAgLTE2OCAtNjcuNSAtMjg2dC0xNzMuNSAtMTE4cS02MCAwIC05NyA0My41dC0yMyAxMDMuNXE4IDM0IDI2LjUgOTIuNSB0MjkuNSAxMDJ0MTEgNzQuNXEwIDQ5IC0yNi41IDgxLjV0LTc1LjUgMzIuNXEtNjEgMCAtMTAzLjUgLTU2LjV0LTQyLjUgLTEzOS41cTAgLTcyIDI0IC0xMjFsLTk4IC00MTRxLTI0IC0xMDAgLTcgLTI1NGgtMTgzcS0xMTkgMCAtMjAzLjUgODQuNXQtODQuNSAyMDMuNXY5NjBxMCAxMTkgODQuNSAyMDMuNXQyMDMuNSA4NC41aDk2MHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjBkNDsiIGQ9Ik02NzggLTU3cTAgLTM4IC0xMCAtNzFoLTM4MHEtOTUgMCAtMTcxLjUgNTYuNXQtMTAzLjUgMTQ3LjVxMjQgNDUgNjkgNzcuNXQxMDAgNDkuNXQxMDcgMjR0MTA3IDdxMzIgMCA0OSAtMnE2IC00IDMwLjUgLTIxdDMzIC0yM3QzMSAtMjN0MzIgLTI1LjV0MjcuNSAtMjUuNXQyNi41IC0yOS41dDIxIC0zMC41dDE3LjUgLTM0LjV0OS41IC0zNnQ0LjUgLTQwLjV6TTM4NSAyOTRxLTIzNCAtNyAtMzg1IC04NXY0MzNxMTAzIC0xMTggMjczIC0xMTggcTMyIDAgNzAgNXEtMjEgLTYxIC0yMSAtODZxMCAtNjcgNjMgLTE0OXpNNTU4IDgwNXEwIC0xMDAgLTQzLjUgLTE2MC41dC0xNDAuNSAtNjAuNXEtNTEgMCAtOTcgMjZ0LTc4IDY3LjV0LTU2IDkzLjV0LTM1LjUgMTA0dC0xMS41IDk5cTAgOTYgNTEuNSAxNjV0MTQ0LjUgNjlxNjYgMCAxMTkgLTQxdDg0IC0xMDR0NDcgLTEzMHQxNiAtMTI4ek0xNTM2IDg5NnYtNzM2cTAgLTExOSAtODQuNSAtMjAzLjV0LTIwMy41IC04NC41aC00NjggcTM5IDczIDM5IDE1N3EwIDY2IC0yMiAxMjIuNXQtNTUuNSA5M3QtNzIgNzF0LTcyIDU5LjV0LTU1LjUgNTQuNXQtMjIgNTkuNXEwIDM2IDIzIDY4dDU2IDYxLjV0NjUuNSA2NC41dDU1LjUgOTN0MjMgMTMxdC0yNi41IDE0NS41dC03NS41IDExOC41cS02IDYgLTE0IDExdC0xMi41IDcuNXQtMTAgOS41dC0xMC41IDE3aDEzNWwxMzUgNjRoLTQzN3EtMTM4IDAgLTI0NC41IC0zOC41dC0xODIuNSAtMTMzLjVxMCAxMjYgODEgMjEzdDIwNyA4N2g5NjAgcTExOSAwIDIwMy41IC04NC41dDg0LjUgLTIwMy41di05NmgtMjU2djI1NmgtMTI4di0yNTZoLTI1NnYtMTI4aDI1NnYtMjU2aDEyOHYyNTZoMjU2eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMGQ1OyIgaG9yaXotYWR2LXg9IjE2NjQiIGQ9Ik04NzYgNzFxMCAyMSAtNC41IDQwLjV0LTkuNSAzNnQtMTcuNSAzNC41dC0yMSAzMC41dC0yNi41IDI5LjV0LTI3LjUgMjUuNXQtMzIgMjUuNXQtMzEgMjN0LTMzIDIzdC0zMC41IDIxcS0xNyAyIC01MCAycS01NCAwIC0xMDYgLTd0LTEwOCAtMjV0LTk4IC00NnQtNjkgLTc1dC0yNyAtMTA3cTAgLTY4IDM1LjUgLTEyMS41dDkzIC04NHQxMjAuNSAtNDUuNXQxMjcgLTE1cTU5IDAgMTEyLjUgMTIuNXQxMDAuNSAzOXQ3NC41IDczLjUgdDI3LjUgMTEwek03NTYgOTMzcTAgNjAgLTE2LjUgMTI3LjV0LTQ3IDEzMC41dC04NCAxMDR0LTExOS41IDQxcS05MyAwIC0xNDQgLTY5dC01MSAtMTY1cTAgLTQ3IDExLjUgLTk5dDM1LjUgLTEwNHQ1NiAtOTMuNXQ3OCAtNjcuNXQ5NyAtMjZxOTcgMCAxNDAuNSA2MC41dDQzLjUgMTYwLjV6TTYyNSAxNDA4aDQzN2wtMTM1IC03OWgtMTM1cTcxIC00NSAxMTAgLTEyNnQzOSAtMTY5cTAgLTc0IC0yMyAtMTMxLjV0LTU2IC05Mi41dC02NiAtNjQuNSB0LTU2IC02MXQtMjMgLTY3LjVxMCAtMjYgMTYuNSAtNTF0NDMgLTQ4dDU4LjUgLTQ4dDY0IC01NS41dDU4LjUgLTY2dDQzIC04NXQxNi41IC0xMDYuNXEwIC0xNjAgLTE0MCAtMjgycS0xNTIgLTEzMSAtNDIwIC0xMzFxLTU5IDAgLTExOS41IDEwdC0xMjIgMzMuNXQtMTA4LjUgNTh0LTc3IDg5dC0zMCAxMjEuNXEwIDYxIDM3IDEzNXEzMiA2NCA5NiAxMTAuNXQxNDUgNzF0MTU1IDM2dDE1MCAxMy41cS02NCA4MyAtNjQgMTQ5cTAgMTIgMiAyMy41IHQ1IDE5LjV0OCAyMS41dDcgMjEuNXEtNDAgLTUgLTcwIC01cS0xNDkgMCAtMjU1LjUgOTh0LTEwNi41IDI0NnEwIDE0MCA5NSAyNTAuNXQyMzQgMTQxLjVxOTQgMjAgMTg3IDIwek0xNjY0IDExNTJ2LTEyOGgtMjU2di0yNTZoLTEyOHYyNTZoLTI1NnYxMjhoMjU2djI1NmgxMjh2LTI1NmgyNTZ6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwZDY7IiBob3Jpei1hZHYteD0iMTkyMCIgZD0iTTc2OCAzODRoMzg0djk2aC0xMjh2NDQ4aC0xMTRsLTE0OCAtMTM3bDc3IC04MHE0MiAzNyA1NSA1N2gydi0yODhoLTEyOHYtOTZ6TTEyODAgNjQwcTAgLTcwIC0yMSAtMTQydC01OS41IC0xMzR0LTEwMS41IC0xMDF0LTEzOCAtMzl0LTEzOCAzOXQtMTAxLjUgMTAxdC01OS41IDEzNHQtMjEgMTQydDIxIDE0MnQ1OS41IDEzNHQxMDEuNSAxMDF0MTM4IDM5dDEzOCAtMzl0MTAxLjUgLTEwMXQ1OS41IC0xMzR0MjEgLTE0MnpNMTc5MiAzODQgdjUxMnEtMTA2IDAgLTE4MSA3NXQtNzUgMTgxaC0xMTUycTAgLTEwNiAtNzUgLTE4MXQtMTgxIC03NXYtNTEycTEwNiAwIDE4MSAtNzV0NzUgLTE4MWgxMTUycTAgMTA2IDc1IDE4MXQxODEgNzV6TTE5MjAgMTIxNnYtMTE1MnEwIC0yNiAtMTkgLTQ1dC00NSAtMTloLTE3OTJxLTI2IDAgLTQ1IDE5dC0xOSA0NXYxMTUycTAgMjYgMTkgNDV0NDUgMTloMTc5MnEyNiAwIDQ1IC0xOXQxOSAtNDV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwZDc7IiBob3Jpei1hZHYteD0iMTAyNCIgZD0iTTEwMjQgODMycTAgLTI2IC0xOSAtNDVsLTQ0OCAtNDQ4cS0xOSAtMTkgLTQ1IC0xOXQtNDUgMTlsLTQ0OCA0NDhxLTE5IDE5IC0xOSA0NXQxOSA0NXQ0NSAxOWg4OTZxMjYgMCA0NSAtMTl0MTkgLTQ1eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMGQ4OyIgaG9yaXotYWR2LXg9IjEwMjQiIGQ9Ik0xMDI0IDMyMHEwIC0yNiAtMTkgLTQ1dC00NSAtMTloLTg5NnEtMjYgMCAtNDUgMTl0LTE5IDQ1dDE5IDQ1bDQ0OCA0NDhxMTkgMTkgNDUgMTl0NDUgLTE5bDQ0OCAtNDQ4cTE5IC0xOSAxOSAtNDV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwZDk7IiBob3Jpei1hZHYteD0iNjQwIiBkPSJNNjQwIDEwODh2LTg5NnEwIC0yNiAtMTkgLTQ1dC00NSAtMTl0LTQ1IDE5bC00NDggNDQ4cS0xOSAxOSAtMTkgNDV0MTkgNDVsNDQ4IDQ0OHExOSAxOSA0NSAxOXQ0NSAtMTl0MTkgLTQ1eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMGRhOyIgaG9yaXotYWR2LXg9IjY0MCIgZD0iTTU3NiA2NDBxMCAtMjYgLTE5IC00NWwtNDQ4IC00NDhxLTE5IC0xOSAtNDUgLTE5dC00NSAxOXQtMTkgNDV2ODk2cTAgMjYgMTkgNDV0NDUgMTl0NDUgLTE5bDQ0OCAtNDQ4cTE5IC0xOSAxOSAtNDV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwZGI7IiBob3Jpei1hZHYteD0iMTY2NCIgZD0iTTE2MCAwaDYwOHYxMTUyaC02NDB2LTExMjBxMCAtMTMgOS41IC0yMi41dDIyLjUgLTkuNXpNMTUzNiAzMnYxMTIwaC02NDB2LTExNTJoNjA4cTEzIDAgMjIuNSA5LjV0OS41IDIyLjV6TTE2NjQgMTI0OHYtMTIxNnEwIC02NiAtNDcgLTExM3QtMTEzIC00N2gtMTM0NHEtNjYgMCAtMTEzIDQ3dC00NyAxMTN2MTIxNnEwIDY2IDQ3IDExM3QxMTMgNDdoMTM0NHE2NiAwIDExMyAtNDd0NDcgLTExM3oiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjBkYzsiIGhvcml6LWFkdi14PSIxMDI0IiBkPSJNMTAyNCA0NDhxMCAtMjYgLTE5IC00NWwtNDQ4IC00NDhxLTE5IC0xOSAtNDUgLTE5dC00NSAxOWwtNDQ4IDQ0OHEtMTkgMTkgLTE5IDQ1dDE5IDQ1dDQ1IDE5aDg5NnEyNiAwIDQ1IC0xOXQxOSAtNDV6TTEwMjQgODMycTAgLTI2IC0xOSAtNDV0LTQ1IC0xOWgtODk2cS0yNiAwIC00NSAxOXQtMTkgNDV0MTkgNDVsNDQ4IDQ0OHExOSAxOSA0NSAxOXQ0NSAtMTlsNDQ4IC00NDhxMTkgLTE5IDE5IC00NXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjBkZDsiIGhvcml6LWFkdi14PSIxMDI0IiBkPSJNMTAyNCA0NDhxMCAtMjYgLTE5IC00NWwtNDQ4IC00NDhxLTE5IC0xOSAtNDUgLTE5dC00NSAxOWwtNDQ4IDQ0OHEtMTkgMTkgLTE5IDQ1dDE5IDQ1dDQ1IDE5aDg5NnEyNiAwIDQ1IC0xOXQxOSAtNDV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwZGU7IiBob3Jpei1hZHYteD0iMTAyNCIgZD0iTTEwMjQgODMycTAgLTI2IC0xOSAtNDV0LTQ1IC0xOWgtODk2cS0yNiAwIC00NSAxOXQtMTkgNDV0MTkgNDVsNDQ4IDQ0OHExOSAxOSA0NSAxOXQ0NSAtMTlsNDQ4IC00NDhxMTkgLTE5IDE5IC00NXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjBlMDsiIGhvcml6LWFkdi14PSIxNzkyIiBkPSJNMTc5MiA4MjZ2LTc5NHEwIC02NiAtNDcgLTExM3QtMTEzIC00N2gtMTQ3MnEtNjYgMCAtMTEzIDQ3dC00NyAxMTN2Nzk0cTQ0IC00OSAxMDEgLTg3cTM2MiAtMjQ2IDQ5NyAtMzQ1cTU3IC00MiA5Mi41IC02NS41dDk0LjUgLTQ4dDExMCAtMjQuNWgxaDFxNTEgMCAxMTAgMjQuNXQ5NC41IDQ4dDkyLjUgNjUuNXExNzAgMTIzIDQ5OCAzNDVxNTcgMzkgMTAwIDg3ek0xNzkyIDExMjBxMCAtNzkgLTQ5IC0xNTF0LTEyMiAtMTIzIHEtMzc2IC0yNjEgLTQ2OCAtMzI1cS0xMCAtNyAtNDIuNSAtMzAuNXQtNTQgLTM4dC01MiAtMzIuNXQtNTcuNSAtMjd0LTUwIC05aC0xaC0xcS0yMyAwIC01MCA5dC01Ny41IDI3dC01MiAzMi41dC01NCAzOHQtNDIuNSAzMC41cS05MSA2NCAtMjYyIDE4Mi41dC0yMDUgMTQyLjVxLTYyIDQyIC0xMTcgMTE1LjV0LTU1IDEzNi41cTAgNzggNDEuNSAxMzB0MTE4LjUgNTJoMTQ3MnE2NSAwIDExMi41IC00N3Q0Ny41IC0xMTN6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwZTE7IiBob3Jpei1hZHYteD0iMTM3OSIgZD0iTTEwMTQgOTYxcTE3MSAwIDI2OCAtODUuNXQ5NyAtMjU0LjV2LTU4NnEwIC0xNCAtMTAuNSAtMjQuNXQtMjQuNSAtMTAuNWgtMjUycS0xNCAwIC0yNC41IDEwLjV0LTEwLjUgMjQuNXY1MjlxMCA3MSAtMjYuNSAxMDR0LTk1LjUgMzNxLTg4IDAgLTEyMy41IC01MS41dC0zNS41IC0xNDMuNXYtNDcxcTAgLTE0IC0xMC41IC0yNC41dC0yNS41IC0xMC41aC0yNDZxLTE0IDAgLTI0LjUgMTAuNXQtMTAuNSAyNC41djg2OHEwIDE0IDEwLjUgMjQuNSB0MjQuNSAxMC41aDIzOXExMyAwIDIxIC01dDEwLjUgLTE4LjV0MyAtMTh0MC41IC0yMi41cTkzIDg3IDI0NiA4N3pNMjkwIDkzOHExNCAwIDI0LjUgLTEwLjV0MTAuNSAtMjQuNXYtODY4cTAgLTE0IC0xMC41IC0yNC41dC0yNC41IC0xMC41aC0yNDZxLTE0IDAgLTI0LjUgMTAuNXQtMTAuNSAyNC41djg2OHEwIDE0IDEwLjUgMjQuNXQyNC41IDEwLjVoMjQ2ek0xNjcgMTM3MXE2OSAwIDExOCAtNDl0NDkgLTExOHQtNDkgLTExOHQtMTE4IC00OSB0LTExOCA0OXQtNDkgMTE4dDQ5IDExOHQxMTggNDl6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwZTI7IiBkPSJNMTUzNiA2NDBxMCAtMTU2IC02MSAtMjk4dC0xNjQgLTI0NXQtMjQ1IC0xNjR0LTI5OCAtNjFxLTE3OSAwIC0zMzYuNSA3NnQtMjY2IDIxM3QtMTQ3LjUgMzEycS0zIDE0IDcgMjdxOSAxMiAyNSAxMmgxOTlxMjMgMCAzMCAtMjNxNTAgLTE2MiAxODUgLTI2MS41dDMwNCAtOTkuNXExMDQgMCAxOTguNSA0MC41dDE2My41IDEwOS41dDEwOS41IDE2My41dDQwLjUgMTk4LjV0LTQwLjUgMTk4LjV0LTEwOS41IDE2My41dC0xNjMuNSAxMDkuNSB0LTE5OC41IDQwLjVxLTk4IDAgLTE4OCAtMzUuNXQtMTYwIC0xMDEuNWwxMzcgLTEzOHEzMSAtMzAgMTQgLTY5cS0xNyAtNDAgLTU5IC00MGgtNDQ4cS0yNiAwIC00NSAxOXQtMTkgNDV2NDQ4cTAgNDIgNDAgNTlxMzkgMTcgNjkgLTE0bDEzMCAtMTI5cTEwNyAxMDEgMjQ0LjUgMTU2LjV0Mjg0LjUgNTUuNXExNTYgMCAyOTggLTYxdDI0NSAtMTY0dDE2NCAtMjQ1dDYxIC0yOTh6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwZTM7IiBob3Jpei1hZHYteD0iMTc5MiIgZD0iTTE3NzEgMHEwIC01MyAtMzcgLTkwbC0xMDcgLTEwOHEtMzkgLTM3IC05MSAtMzdxLTUzIDAgLTkwIDM3bC0zNjMgMzY0cS0zOCAzNiAtMzggOTBxMCA1MyA0MyA5NmwtMjU2IDI1NmwtMTI2IC0xMjZxLTE0IC0xNCAtMzQgLTE0dC0zNCAxNHEyIC0yIDEyLjUgLTEydDEyLjUgLTEzdDEwIC0xMS41dDEwIC0xMy41dDYgLTEzLjV0NS41IC0xNi41dDEuNSAtMThxMCAtMzggLTI4IC02OHEtMyAtMyAtMTYuNSAtMTh0LTE5IC0yMC41IHQtMTguNSAtMTYuNXQtMjIgLTE1LjV0LTIyIC05dC0yNiAtNC41cS00MCAwIC02OCAyOGwtNDA4IDQwOHEtMjggMjggLTI4IDY4cTAgMTMgNC41IDI2dDkgMjJ0MTUuNSAyMnQxNi41IDE4LjV0MjAuNSAxOXQxOCAxNi41cTMwIDI4IDY4IDI4cTEwIDAgMTggLTEuNXQxNi41IC01LjV0MTMuNSAtNnQxMy41IC0xMHQxMS41IC0xMHQxMyAtMTIuNXQxMiAtMTIuNXEtMTQgMTQgLTE0IDM0dDE0IDM0bDM0OCAzNDhxMTQgMTQgMzQgMTR0MzQgLTE0IHEtMiAyIC0xMi41IDEydC0xMi41IDEzdC0xMCAxMS41dC0xMCAxMy41dC02IDEzLjV0LTUuNSAxNi41dC0xLjUgMThxMCAzOCAyOCA2OHEzIDMgMTYuNSAxOHQxOSAyMC41dDE4LjUgMTYuNXQyMiAxNS41dDIyIDl0MjYgNC41cTQwIDAgNjggLTI4bDQwOCAtNDA4cTI4IC0yOCAyOCAtNjhxMCAtMTMgLTQuNSAtMjZ0LTkgLTIydC0xNS41IC0yMnQtMTYuNSAtMTguNXQtMjAuNSAtMTl0LTE4IC0xNi41cS0zMCAtMjggLTY4IC0yOCBxLTEwIDAgLTE4IDEuNXQtMTYuNSA1LjV0LTEzLjUgNnQtMTMuNSAxMHQtMTEuNSAxMHQtMTMgMTIuNXQtMTIgMTIuNXExNCAtMTQgMTQgLTM0dC0xNCAtMzRsLTEyNiAtMTI2bDI1NiAtMjU2cTQzIDQzIDk2IDQzcTUyIDAgOTEgLTM3bDM2MyAtMzYzcTM3IC0zOSAzNyAtOTF6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwZTQ7IiBob3Jpei1hZHYteD0iMTc5MiIgZD0iTTM4NCAzODRxMCA1MyAtMzcuNSA5MC41dC05MC41IDM3LjV0LTkwLjUgLTM3LjV0LTM3LjUgLTkwLjV0MzcuNSAtOTAuNXQ5MC41IC0zNy41dDkwLjUgMzcuNXQzNy41IDkwLjV6TTU3NiA4MzJxMCA1MyAtMzcuNSA5MC41dC05MC41IDM3LjV0LTkwLjUgLTM3LjV0LTM3LjUgLTkwLjV0MzcuNSAtOTAuNXQ5MC41IC0zNy41dDkwLjUgMzcuNXQzNy41IDkwLjV6TTEwMDQgMzUxbDEwMSAzODJxNiAyNiAtNy41IDQ4LjV0LTM4LjUgMjkuNSB0LTQ4IC02LjV0LTMwIC0zOS41bC0xMDEgLTM4MnEtNjAgLTUgLTEwNyAtNDMuNXQtNjMgLTk4LjVxLTIwIC03NyAyMCAtMTQ2dDExNyAtODl0MTQ2IDIwdDg5IDExN3ExNiA2MCAtNiAxMTd0LTcyIDkxek0xNjY0IDM4NHEwIDUzIC0zNy41IDkwLjV0LTkwLjUgMzcuNXQtOTAuNSAtMzcuNXQtMzcuNSAtOTAuNXQzNy41IC05MC41dDkwLjUgLTM3LjV0OTAuNSAzNy41dDM3LjUgOTAuNXpNMTAyNCAxMDI0cTAgNTMgLTM3LjUgOTAuNSB0LTkwLjUgMzcuNXQtOTAuNSAtMzcuNXQtMzcuNSAtOTAuNXQzNy41IC05MC41dDkwLjUgLTM3LjV0OTAuNSAzNy41dDM3LjUgOTAuNXpNMTQ3MiA4MzJxMCA1MyAtMzcuNSA5MC41dC05MC41IDM3LjV0LTkwLjUgLTM3LjV0LTM3LjUgLTkwLjV0MzcuNSAtOTAuNXQ5MC41IC0zNy41dDkwLjUgMzcuNXQzNy41IDkwLjV6TTE3OTIgMzg0cTAgLTI2MSAtMTQxIC00ODNxLTE5IC0yOSAtNTQgLTI5aC0xNDAycS0zNSAwIC01NCAyOSBxLTE0MSAyMjEgLTE0MSA0ODNxMCAxODIgNzEgMzQ4dDE5MSAyODZ0Mjg2IDE5MXQzNDggNzF0MzQ4IC03MXQyODYgLTE5MXQxOTEgLTI4NnQ3MSAtMzQ4eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMGU1OyIgaG9yaXotYWR2LXg9IjE3OTIiIGQ9Ik04OTYgMTE1MnEtMjA0IDAgLTM4MS41IC02OS41dC0yODIgLTE4Ny41dC0xMDQuNSAtMjU1cTAgLTExMiA3MS41IC0yMTMuNXQyMDEuNSAtMTc1LjVsODcgLTUwbC0yNyAtOTZxLTI0IC05MSAtNzAgLTE3MnExNTIgNjMgMjc1IDE3MWw0MyAzOGw1NyAtNnE2OSAtOCAxMzAgLThxMjA0IDAgMzgxLjUgNjkuNXQyODIgMTg3LjV0MTA0LjUgMjU1dC0xMDQuNSAyNTV0LTI4MiAxODcuNXQtMzgxLjUgNjkuNXpNMTc5MiA2NDAgcTAgLTE3NCAtMTIwIC0zMjEuNXQtMzI2IC0yMzN0LTQ1MCAtODUuNXEtNzAgMCAtMTQ1IDhxLTE5OCAtMTc1IC00NjAgLTI0MnEtNDkgLTE0IC0xMTQgLTIyaC01cS0xNSAwIC0yNyAxMC41dC0xNiAyNy41djFxLTMgNCAtMC41IDEydDIgMTB0NC41IDkuNWw2IDl0NyA4LjV0OCA5cTcgOCAzMSAzNC41dDM0LjUgMzh0MzEgMzkuNXQzMi41IDUxdDI3IDU5dDI2IDc2cS0xNTcgODkgLTI0Ny41IDIyMHQtOTAuNSAyODFxMCAxNzQgMTIwIDMyMS41IHQzMjYgMjMzdDQ1MCA4NS41dDQ1MCAtODUuNXQzMjYgLTIzM3QxMjAgLTMyMS41eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMGU2OyIgaG9yaXotYWR2LXg9IjE3OTIiIGQ9Ik03MDQgMTE1MnEtMTUzIDAgLTI4NiAtNTJ0LTIxMS41IC0xNDF0LTc4LjUgLTE5MXEwIC04MiA1MyAtMTU4dDE0OSAtMTMybDk3IC01NmwtMzUgLTg0cTM0IDIwIDYyIDM5bDQ0IDMxbDUzIC0xMHE3OCAtMTQgMTUzIC0xNHExNTMgMCAyODYgNTJ0MjExLjUgMTQxdDc4LjUgMTkxdC03OC41IDE5MXQtMjExLjUgMTQxdC0yODYgNTJ6TTcwNCAxMjgwcTE5MSAwIDM1My41IC02OC41dDI1Ni41IC0xODYuNXQ5NCAtMjU3dC05NCAtMjU3IHQtMjU2LjUgLTE4Ni41dC0zNTMuNSAtNjguNXEtODYgMCAtMTc2IDE2cS0xMjQgLTg4IC0yNzggLTEyOHEtMzYgLTkgLTg2IC0xNmgtM3EtMTEgMCAtMjAuNSA4dC0xMS41IDIxcS0xIDMgLTEgNi41dDAuNSA2LjV0MiA2bDIuNSA1dDMuNSA1LjV0NCA1dDQuNSA1dDQgNC41cTUgNiAyMyAyNXQyNiAyOS41dDIyLjUgMjl0MjUgMzguNXQyMC41IDQ0cS0xMjQgNzIgLTE5NSAxNzd0LTcxIDIyNHEwIDEzOSA5NCAyNTd0MjU2LjUgMTg2LjUgdDM1My41IDY4LjV6TTE1MjYgMTExcTEwIC0yNCAyMC41IC00NHQyNSAtMzguNXQyMi41IC0yOXQyNiAtMjkuNXQyMyAtMjVxMSAtMSA0IC00LjV0NC41IC01dDQgLTV0My41IC01LjVsMi41IC01dDIgLTZ0MC41IC02LjV0LTEgLTYuNXEtMyAtMTQgLTEzIC0yMnQtMjIgLTdxLTUwIDcgLTg2IDE2cS0xNTQgNDAgLTI3OCAxMjhxLTkwIC0xNiAtMTc2IC0xNnEtMjcxIDAgLTQ3MiAxMzJxNTggLTQgODggLTRxMTYxIDAgMzA5IDQ1dDI2NCAxMjkgcTEyNSA5MiAxOTIgMjEydDY3IDI1NHEwIDc3IC0yMyAxNTJxMTI5IC03MSAyMDQgLTE3OHQ3NSAtMjMwcTAgLTEyMCAtNzEgLTIyNC41dC0xOTUgLTE3Ni41eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMGU3OyIgaG9yaXotYWR2LXg9Ijg5NiIgZD0iTTg4NSA5NzBxMTggLTIwIDcgLTQ0bC01NDAgLTExNTdxLTEzIC0yNSAtNDIgLTI1cS00IDAgLTE0IDJxLTE3IDUgLTI1LjUgMTl0LTQuNSAzMGwxOTcgODA4bC00MDYgLTEwMXEtNCAtMSAtMTIgLTFxLTE4IDAgLTMxIDExcS0xOCAxNSAtMTMgMzlsMjAxIDgyNXE0IDE0IDE2IDIzdDI4IDloMzI4cTE5IDAgMzIgLTEyLjV0MTMgLTI5LjVxMCAtOCAtNSAtMThsLTE3MSAtNDYzbDM5NiA5OHE4IDIgMTIgMnExOSAwIDM0IC0xNXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjBlODsiIGhvcml6LWFkdi14PSIxNzkyIiBkPSJNMTc5MiAyODh2LTMyMHEwIC00MCAtMjggLTY4dC02OCAtMjhoLTMyMHEtNDAgMCAtNjggMjh0LTI4IDY4djMyMHEwIDQwIDI4IDY4dDY4IDI4aDk2djE5MmgtNTEydi0xOTJoOTZxNDAgMCA2OCAtMjh0MjggLTY4di0zMjBxMCAtNDAgLTI4IC02OHQtNjggLTI4aC0zMjBxLTQwIDAgLTY4IDI4dC0yOCA2OHYzMjBxMCA0MCAyOCA2OHQ2OCAyOGg5NnYxOTJoLTUxMnYtMTkyaDk2cTQwIDAgNjggLTI4dDI4IC02OHYtMzIwIHEwIC00MCAtMjggLTY4dC02OCAtMjhoLTMyMHEtNDAgMCAtNjggMjh0LTI4IDY4djMyMHEwIDQwIDI4IDY4dDY4IDI4aDk2djE5MnEwIDUyIDM4IDkwdDkwIDM4aDUxMnYxOTJoLTk2cS00MCAwIC02OCAyOHQtMjggNjh2MzIwcTAgNDAgMjggNjh0NjggMjhoMzIwcTQwIDAgNjggLTI4dDI4IC02OHYtMzIwcTAgLTQwIC0yOCAtNjh0LTY4IC0yOGgtOTZ2LTE5Mmg1MTJxNTIgMCA5MCAtMzh0MzggLTkwdi0xOTJoOTZxNDAgMCA2OCAtMjh0MjggLTY4IHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjBlOTsiIGhvcml6LWFkdi14PSIxNjY0IiBkPSJNODk2IDcwOHYtNTgwcTAgLTEwNCAtNzYgLTE4MHQtMTgwIC03NnQtMTgwIDc2dC03NiAxODBxMCAyNiAxOSA0NXQ0NSAxOXQ0NSAtMTl0MTkgLTQ1cTAgLTUwIDM5IC04OXQ4OSAtMzl0ODkgMzl0MzkgODl2NTgwcTMzIDExIDY0IDExdDY0IC0xMXpNMTY2NCA2ODFxMCAtMTMgLTkuNSAtMjIuNXQtMjIuNSAtOS41cS0xMSAwIC0yMyAxMHEtNDkgNDYgLTkzIDY5dC0xMDIgMjNxLTY4IDAgLTEyOCAtMzd0LTEwMyAtOTcgcS03IC0xMCAtMTcuNSAtMjh0LTE0LjUgLTI0cS0xMSAtMTcgLTI4IC0xN3EtMTggMCAtMjkgMTdxLTQgNiAtMTQuNSAyNHQtMTcuNSAyOHEtNDMgNjAgLTEwMi41IDk3dC0xMjcuNSAzN3QtMTI3LjUgLTM3dC0xMDIuNSAtOTdxLTcgLTEwIC0xNy41IC0yOHQtMTQuNSAtMjRxLTExIC0xNyAtMjkgLTE3cS0xNyAwIC0yOCAxN3EtNCA2IC0xNC41IDI0dC0xNy41IDI4cS00MyA2MCAtMTAzIDk3dC0xMjggMzdxLTU4IDAgLTEwMiAtMjN0LTkzIC02OSBxLTEyIC0xMCAtMjMgLTEwcS0xMyAwIC0yMi41IDkuNXQtOS41IDIyLjVxMCA1IDEgN3E0NSAxODMgMTcyLjUgMzE5LjV0Mjk4IDIwNC41dDM2MC41IDY4cTE0MCAwIDI3NC41IC00MHQyNDYuNSAtMTEzLjV0MTk0LjUgLTE4N3QxMTUuNSAtMjUxLjVxMSAtMiAxIC03ek04OTYgMTQwOHYtOThxLTQyIDIgLTY0IDJ0LTY0IC0ydjk4cTAgMjYgMTkgNDV0NDUgMTl0NDUgLTE5dDE5IC00NXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjBlYTsiIGhvcml6LWFkdi14PSIxNzkyIiBkPSJNNzY4IC0xMjhoODk2djY0MGgtNDE2cS00MCAwIC02OCAyOHQtMjggNjh2NDE2aC0zODR2LTExNTJ6TTEwMjQgMTMxMnY2NHEwIDEzIC05LjUgMjIuNXQtMjIuNSA5LjVoLTcwNHEtMTMgMCAtMjIuNSAtOS41dC05LjUgLTIyLjV2LTY0cTAgLTEzIDkuNSAtMjIuNXQyMi41IC05LjVoNzA0cTEzIDAgMjIuNSA5LjV0OS41IDIyLjV6TTEyODAgNjQwaDI5OWwtMjk5IDI5OXYtMjk5ek0xNzkyIDUxMnYtNjcycTAgLTQwIC0yOCAtNjh0LTY4IC0yOCBoLTk2MHEtNDAgMCAtNjggMjh0LTI4IDY4djE2MGgtNTQ0cS00MCAwIC02OCAyOHQtMjggNjh2MTM0NHEwIDQwIDI4IDY4dDY4IDI4aDEwODhxNDAgMCA2OCAtMjh0MjggLTY4di0zMjhxMjEgLTEzIDM2IC0yOGw0MDggLTQwOHEyOCAtMjggNDggLTc2dDIwIC04OHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjBlYjsiIGhvcml6LWFkdi14PSIxMDI0IiBkPSJNNzM2IDk2MHEwIC0xMyAtOS41IC0yMi41dC0yMi41IC05LjV0LTIyLjUgOS41dC05LjUgMjIuNXEwIDQ2IC01NCA3MXQtMTA2IDI1cS0xMyAwIC0yMi41IDkuNXQtOS41IDIyLjV0OS41IDIyLjV0MjIuNSA5LjVxNTAgMCA5OS41IC0xNnQ4NyAtNTR0MzcuNSAtOTB6TTg5NiA5NjBxMCA3MiAtMzQuNSAxMzR0LTkwIDEwMS41dC0xMjMgNjJ0LTEzNi41IDIyLjV0LTEzNi41IC0yMi41dC0xMjMgLTYydC05MCAtMTAxLjV0LTM0LjUgLTEzNCBxMCAtMTAxIDY4IC0xODBxMTAgLTExIDMwLjUgLTMzdDMwLjUgLTMzcTEyOCAtMTUzIDE0MSAtMjk4aDIyOHExMyAxNDUgMTQxIDI5OHExMCAxMSAzMC41IDMzdDMwLjUgMzNxNjggNzkgNjggMTgwek0xMDI0IDk2MHEwIC0xNTUgLTEwMyAtMjY4cS00NSAtNDkgLTc0LjUgLTg3dC01OS41IC05NS41dC0zNCAtMTA3LjVxNDcgLTI4IDQ3IC04MnEwIC0zNyAtMjUgLTY0cTI1IC0yNyAyNSAtNjRxMCAtNTIgLTQ1IC04MXExMyAtMjMgMTMgLTQ3IHEwIC00NiAtMzEuNSAtNzF0LTc3LjUgLTI1cS0yMCAtNDQgLTYwIC03MHQtODcgLTI2dC04NyAyNnQtNjAgNzBxLTQ2IDAgLTc3LjUgMjV0LTMxLjUgNzFxMCAyNCAxMyA0N3EtNDUgMjkgLTQ1IDgxcTAgMzcgMjUgNjRxLTI1IDI3IC0yNSA2NHEwIDU0IDQ3IDgycS00IDUwIC0zNCAxMDcuNXQtNTkuNSA5NS41dC03NC41IDg3cS0xMDMgMTEzIC0xMDMgMjY4cTAgOTkgNDQuNSAxODQuNXQxMTcgMTQydDE2NCA4OXQxODYuNSAzMi41IHQxODYuNSAtMzIuNXQxNjQgLTg5dDExNyAtMTQydDQ0LjUgLTE4NC41eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMGVjOyIgaG9yaXotYWR2LXg9IjE3OTIiIGQ9Ik0xNzkyIDM1MnYtMTkycTAgLTEzIC05LjUgLTIyLjV0LTIyLjUgLTkuNWgtMTM3NnYtMTkycTAgLTEzIC05LjUgLTIyLjV0LTIyLjUgLTkuNXEtMTIgMCAtMjQgMTBsLTMxOSAzMjBxLTkgOSAtOSAyMnEwIDE0IDkgMjNsMzIwIDMyMHE5IDkgMjMgOXExMyAwIDIyLjUgLTkuNXQ5LjUgLTIyLjV2LTE5MmgxMzc2cTEzIDAgMjIuNSAtOS41dDkuNSAtMjIuNXpNMTc5MiA4OTZxMCAtMTQgLTkgLTIzbC0zMjAgLTMyMHEtOSAtOSAtMjMgLTkgcS0xMyAwIC0yMi41IDkuNXQtOS41IDIyLjV2MTkyaC0xMzc2cS0xMyAwIC0yMi41IDkuNXQtOS41IDIyLjV2MTkycTAgMTMgOS41IDIyLjV0MjIuNSA5LjVoMTM3NnYxOTJxMCAxNCA5IDIzdDIzIDlxMTIgMCAyNCAtMTBsMzE5IC0zMTlxOSAtOSA5IC0yM3oiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjBlZDsiIGhvcml6LWFkdi14PSIxOTIwIiBkPSJNMTI4MCA2MDhxMCAxNCAtOSAyM3QtMjMgOWgtMjI0djM1MnEwIDEzIC05LjUgMjIuNXQtMjIuNSA5LjVoLTE5MnEtMTMgMCAtMjIuNSAtOS41dC05LjUgLTIyLjV2LTM1MmgtMjI0cS0xMyAwIC0yMi41IC05LjV0LTkuNSAtMjIuNXEwIC0xNCA5IC0yM2wzNTIgLTM1MnE5IC05IDIzIC05dDIzIDlsMzUxIDM1MXExMCAxMiAxMCAyNHpNMTkyMCAzODRxMCAtMTU5IC0xMTIuNSAtMjcxLjV0LTI3MS41IC0xMTIuNWgtMTA4OCBxLTE4NSAwIC0zMTYuNSAxMzEuNXQtMTMxLjUgMzE2LjVxMCAxMzAgNzAgMjQwdDE4OCAxNjVxLTIgMzAgLTIgNDNxMCAyMTIgMTUwIDM2MnQzNjIgMTUwcTE1NiAwIDI4NS41IC04N3QxODguNSAtMjMxcTcxIDYyIDE2NiA2MnExMDYgMCAxODEgLTc1dDc1IC0xODFxMCAtNzYgLTQxIC0xMzhxMTMwIC0zMSAyMTMuNSAtMTM1LjV0ODMuNSAtMjM4LjV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwZWU7IiBob3Jpei1hZHYteD0iMTkyMCIgZD0iTTEyODAgNjcycTAgMTQgLTkgMjNsLTM1MiAzNTJxLTkgOSAtMjMgOXQtMjMgLTlsLTM1MSAtMzUxcS0xMCAtMTIgLTEwIC0yNHEwIC0xNCA5IC0yM3QyMyAtOWgyMjR2LTM1MnEwIC0xMyA5LjUgLTIyLjV0MjIuNSAtOS41aDE5MnExMyAwIDIyLjUgOS41dDkuNSAyMi41djM1MmgyMjRxMTMgMCAyMi41IDkuNXQ5LjUgMjIuNXpNMTkyMCAzODRxMCAtMTU5IC0xMTIuNSAtMjcxLjV0LTI3MS41IC0xMTIuNWgtMTA4OCBxLTE4NSAwIC0zMTYuNSAxMzEuNXQtMTMxLjUgMzE2LjVxMCAxMzAgNzAgMjQwdDE4OCAxNjVxLTIgMzAgLTIgNDNxMCAyMTIgMTUwIDM2MnQzNjIgMTUwcTE1NiAwIDI4NS41IC04N3QxODguNSAtMjMxcTcxIDYyIDE2NiA2MnExMDYgMCAxODEgLTc1dDc1IC0xODFxMCAtNzYgLTQxIC0xMzhxMTMwIC0zMSAyMTMuNSAtMTM1LjV0ODMuNSAtMjM4LjV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwZjA7IiBob3Jpei1hZHYteD0iMTQwOCIgZD0iTTM4NCAxOTJxMCAtMjYgLTE5IC00NXQtNDUgLTE5dC00NSAxOXQtMTkgNDV0MTkgNDV0NDUgMTl0NDUgLTE5dDE5IC00NXpNMTQwOCAxMzFxMCAtMTIxIC03MyAtMTkwdC0xOTQgLTY5aC04NzRxLTEyMSAwIC0xOTQgNjl0LTczIDE5MHEwIDY4IDUuNSAxMzF0MjQgMTM4dDQ3LjUgMTMyLjV0ODEgMTAzdDEyMCA2MC41cS0yMiAtNTIgLTIyIC0xMjB2LTIwM3EtNTggLTIwIC05MyAtNzB0LTM1IC0xMTFxMCAtODAgNTYgLTEzNnQxMzYgLTU2IHQxMzYgNTZ0NTYgMTM2cTAgNjEgLTM1LjUgMTExdC05Mi41IDcwdjIwM3EwIDYyIDI1IDkzcTEzMiAtMTA0IDI5NSAtMTA0dDI5NSAxMDRxMjUgLTMxIDI1IC05M3YtNjRxLTEwNiAwIC0xODEgLTc1dC03NSAtMTgxdi04OXEtMzIgLTI5IC0zMiAtNzFxMCAtNDAgMjggLTY4dDY4IC0yOHQ2OCAyOHQyOCA2OHEwIDQyIC0zMiA3MXY4OXEwIDUyIDM4IDkwdDkwIDM4dDkwIC0zOHQzOCAtOTB2LTg5cS0zMiAtMjkgLTMyIC03MXEwIC00MCAyOCAtNjggdDY4IC0yOHQ2OCAyOHQyOCA2OHEwIDQyIC0zMiA3MXY4OXEwIDY4IC0zNC41IDEyNy41dC05My41IDkzLjVxMCAxMCAwLjUgNDIuNXQwIDQ4dC0yLjUgNDEuNXQtNyA0N3QtMTMgNDBxNjggLTE1IDEyMCAtNjAuNXQ4MSAtMTAzdDQ3LjUgLTEzMi41dDI0IC0xMzh0NS41IC0xMzF6TTEwODggMTAyNHEwIC0xNTkgLTExMi41IC0yNzEuNXQtMjcxLjUgLTExMi41dC0yNzEuNSAxMTIuNXQtMTEyLjUgMjcxLjV0MTEyLjUgMjcxLjV0MjcxLjUgMTEyLjUgdDI3MS41IC0xMTIuNXQxMTIuNSAtMjcxLjV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwZjE7IiBob3Jpei1hZHYteD0iMTQwOCIgZD0iTTEyODAgODMycTAgMjYgLTE5IDQ1dC00NSAxOXQtNDUgLTE5dC0xOSAtNDV0MTkgLTQ1dDQ1IC0xOXQ0NSAxOXQxOSA0NXpNMTQwOCA4MzJxMCAtNjIgLTM1LjUgLTExMXQtOTIuNSAtNzB2LTM5NXEwIC0xNTkgLTEzMS41IC0yNzEuNXQtMzE2LjUgLTExMi41dC0zMTYuNSAxMTIuNXQtMTMxLjUgMjcxLjV2MTMycS0xNjQgMjAgLTI3NCAxMjh0LTExMCAyNTJ2NTEycTAgMjYgMTkgNDV0NDUgMTlxNiAwIDE2IC0ycTE3IDMwIDQ3IDQ4IHQ2NSAxOHE1MyAwIDkwLjUgLTM3LjV0MzcuNSAtOTAuNXQtMzcuNSAtOTAuNXQtOTAuNSAtMzcuNXEtMzMgMCAtNjQgMTh2LTQwMnEwIC0xMDYgOTQgLTE4MXQyMjYgLTc1dDIyNiA3NXQ5NCAxODF2NDAycS0zMSAtMTggLTY0IC0xOHEtNTMgMCAtOTAuNSAzNy41dC0zNy41IDkwLjV0MzcuNSA5MC41dDkwLjUgMzcuNXEzNSAwIDY1IC0xOHQ0NyAtNDhxMTAgMiAxNiAycTI2IDAgNDUgLTE5dDE5IC00NXYtNTEycTAgLTE0NCAtMTEwIC0yNTIgdC0yNzQgLTEyOHYtMTMycTAgLTEwNiA5NCAtMTgxdDIyNiAtNzV0MjI2IDc1dDk0IDE4MXYzOTVxLTU3IDIxIC05Mi41IDcwdC0zNS41IDExMXEwIDgwIDU2IDEzNnQxMzYgNTZ0MTM2IC01NnQ1NiAtMTM2eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMGYyOyIgaG9yaXotYWR2LXg9IjE3OTIiIGQ9Ik02NDAgMTE1Mmg1MTJ2MTI4aC01MTJ2LTEyOHpNMjg4IDExNTJ2LTEyODBoLTY0cS05MiAwIC0xNTggNjZ0LTY2IDE1OHY4MzJxMCA5MiA2NiAxNTh0MTU4IDY2aDY0ek0xNDA4IDExNTJ2LTEyODBoLTEwMjR2MTI4MGgxMjh2MTYwcTAgNDAgMjggNjh0NjggMjhoNTc2cTQwIDAgNjggLTI4dDI4IC02OHYtMTYwaDEyOHpNMTc5MiA5Mjh2LTgzMnEwIC05MiAtNjYgLTE1OHQtMTU4IC02NmgtNjR2MTI4MGg2NHE5MiAwIDE1OCAtNjYgdDY2IC0xNTh6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwZjM7IiBob3Jpei1hZHYteD0iMTY2NCIgZD0iTTg0OCAtMTYwcTAgMTYgLTE2IDE2cS01OSAwIC0xMDEuNSA0Mi41dC00Mi41IDEwMS41cTAgMTYgLTE2IDE2dC0xNiAtMTZxMCAtNzMgNTEuNSAtMTI0LjV0MTI0LjUgLTUxLjVxMTYgMCAxNiAxNnpNMTY2NCAxMjhxMCAtNTIgLTM4IC05MHQtOTAgLTM4aC00NDhxMCAtMTA2IC03NSAtMTgxdC0xODEgLTc1dC0xODEgNzV0LTc1IDE4MWgtNDQ4cS01MiAwIC05MCAzOHQtMzggOTBxMTkwIDE2MSAyODcgMzk3LjV0OTcgNDk4LjUgcTAgMTY1IDk2IDI2MnQyNjQgMTE3cS04IDE4IC04IDM3cTAgNDAgMjggNjh0NjggMjh0NjggLTI4dDI4IC02OHEwIC0xOSAtOCAtMzdxMTY4IC0yMCAyNjQgLTExN3Q5NiAtMjYycTAgLTI2MiA5NyAtNDk4LjV0Mjg3IC0zOTcuNXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjBmNDsiIGhvcml6LWFkdi14PSIxOTIwIiBkPSJNMTY2NCA4OTZxMCA4MCAtNTYgMTM2dC0xMzYgNTZoLTY0di0zODRoNjRxODAgMCAxMzYgNTZ0NTYgMTM2ek0wIDEyOGgxNzkycTAgLTEwNiAtNzUgLTE4MXQtMTgxIC03NWgtMTI4MHEtMTA2IDAgLTE4MSA3NXQtNzUgMTgxek0xODU2IDg5NnEwIC0xNTkgLTExMi41IC0yNzEuNXQtMjcxLjUgLTExMi41aC02NHYtMzJxMCAtOTIgLTY2IC0xNTh0LTE1OCAtNjZoLTcwNHEtOTIgMCAtMTU4IDY2dC02NiAxNTh2NzM2cTAgMjYgMTkgNDUgdDQ1IDE5aDExNTJxMTU5IDAgMjcxLjUgLTExMi41dDExMi41IC0yNzEuNXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjBmNTsiIGhvcml6LWFkdi14PSIxNDA4IiBkPSJNNjQwIDE0NzJ2LTY0MHEwIC02MSAtMzUuNSAtMTExdC05Mi41IC03MHYtNzc5cTAgLTUyIC0zOCAtOTB0LTkwIC0zOGgtMTI4cS01MiAwIC05MCAzOHQtMzggOTB2Nzc5cS01NyAyMCAtOTIuNSA3MHQtMzUuNSAxMTF2NjQwcTAgMjYgMTkgNDV0NDUgMTl0NDUgLTE5dDE5IC00NXYtNDE2cTAgLTI2IDE5IC00NXQ0NSAtMTl0NDUgMTl0MTkgNDV2NDE2cTAgMjYgMTkgNDV0NDUgMTl0NDUgLTE5dDE5IC00NXYtNDE2cTAgLTI2IDE5IC00NSB0NDUgLTE5dDQ1IDE5dDE5IDQ1djQxNnEwIDI2IDE5IDQ1dDQ1IDE5dDQ1IC0xOXQxOSAtNDV6TTE0MDggMTQ3MnYtMTYwMHEwIC01MiAtMzggLTkwdC05MCAtMzhoLTEyOHEtNTIgMCAtOTAgMzh0LTM4IDkwdjUxMmgtMjI0cS0xMyAwIC0yMi41IDkuNXQtOS41IDIyLjV2ODAwcTAgMTMyIDk0IDIyNnQyMjYgOTRoMjU2cTI2IDAgNDUgLTE5dDE5IC00NXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjBmNjsiIGhvcml6LWFkdi14PSIxMjgwIiBkPSJNMTAyNCAzNTJ2LTY0cTAgLTE0IC05IC0yM3QtMjMgLTloLTcwNHEtMTQgMCAtMjMgOXQtOSAyM3Y2NHEwIDE0IDkgMjN0MjMgOWg3MDRxMTQgMCAyMyAtOXQ5IC0yM3pNMTAyNCA2MDh2LTY0cTAgLTE0IC05IC0yM3QtMjMgLTloLTcwNHEtMTQgMCAtMjMgOXQtOSAyM3Y2NHEwIDE0IDkgMjN0MjMgOWg3MDRxMTQgMCAyMyAtOXQ5IC0yM3pNMTI4IDBoMTAyNHY3NjhoLTQxNnEtNDAgMCAtNjggMjh0LTI4IDY4djQxNmgtNTEydi0xMjgweiBNNzY4IDg5NmgyOTlsLTI5OSAyOTl2LTI5OXpNMTI4MCA3Njh2LTgwMHEwIC00MCAtMjggLTY4dC02OCAtMjhoLTEwODhxLTQwIDAgLTY4IDI4dC0yOCA2OHYxMzQ0cTAgNDAgMjggNjh0NjggMjhoNTQ0cTQwIDAgODggLTIwdDc2IC00OGw0MDggLTQwOHEyOCAtMjggNDggLTc2dDIwIC04OHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjBmNzsiIGhvcml6LWFkdi14PSIxNDA4IiBkPSJNMzg0IDIyNHYtNjRxMCAtMTMgLTkuNSAtMjIuNXQtMjIuNSAtOS41aC02NHEtMTMgMCAtMjIuNSA5LjV0LTkuNSAyMi41djY0cTAgMTMgOS41IDIyLjV0MjIuNSA5LjVoNjRxMTMgMCAyMi41IC05LjV0OS41IC0yMi41ek0zODQgNDgwdi02NHEwIC0xMyAtOS41IC0yMi41dC0yMi41IC05LjVoLTY0cS0xMyAwIC0yMi41IDkuNXQtOS41IDIyLjV2NjRxMCAxMyA5LjUgMjIuNXQyMi41IDkuNWg2NHExMyAwIDIyLjUgLTkuNXQ5LjUgLTIyLjV6IE02NDAgNDgwdi02NHEwIC0xMyAtOS41IC0yMi41dC0yMi41IC05LjVoLTY0cS0xMyAwIC0yMi41IDkuNXQtOS41IDIyLjV2NjRxMCAxMyA5LjUgMjIuNXQyMi41IDkuNWg2NHExMyAwIDIyLjUgLTkuNXQ5LjUgLTIyLjV6TTM4NCA3MzZ2LTY0cTAgLTEzIC05LjUgLTIyLjV0LTIyLjUgLTkuNWgtNjRxLTEzIDAgLTIyLjUgOS41dC05LjUgMjIuNXY2NHEwIDEzIDkuNSAyMi41dDIyLjUgOS41aDY0cTEzIDAgMjIuNSAtOS41dDkuNSAtMjIuNXogTTExNTIgMjI0di02NHEwIC0xMyAtOS41IC0yMi41dC0yMi41IC05LjVoLTY0cS0xMyAwIC0yMi41IDkuNXQtOS41IDIyLjV2NjRxMCAxMyA5LjUgMjIuNXQyMi41IDkuNWg2NHExMyAwIDIyLjUgLTkuNXQ5LjUgLTIyLjV6TTg5NiA0ODB2LTY0cTAgLTEzIC05LjUgLTIyLjV0LTIyLjUgLTkuNWgtNjRxLTEzIDAgLTIyLjUgOS41dC05LjUgMjIuNXY2NHEwIDEzIDkuNSAyMi41dDIyLjUgOS41aDY0cTEzIDAgMjIuNSAtOS41dDkuNSAtMjIuNXogTTY0MCA3MzZ2LTY0cTAgLTEzIC05LjUgLTIyLjV0LTIyLjUgLTkuNWgtNjRxLTEzIDAgLTIyLjUgOS41dC05LjUgMjIuNXY2NHEwIDEzIDkuNSAyMi41dDIyLjUgOS41aDY0cTEzIDAgMjIuNSAtOS41dDkuNSAtMjIuNXpNMzg0IDk5MnYtNjRxMCAtMTMgLTkuNSAtMjIuNXQtMjIuNSAtOS41aC02NHEtMTMgMCAtMjIuNSA5LjV0LTkuNSAyMi41djY0cTAgMTMgOS41IDIyLjV0MjIuNSA5LjVoNjRxMTMgMCAyMi41IC05LjV0OS41IC0yMi41eiBNMTE1MiA0ODB2LTY0cTAgLTEzIC05LjUgLTIyLjV0LTIyLjUgLTkuNWgtNjRxLTEzIDAgLTIyLjUgOS41dC05LjUgMjIuNXY2NHEwIDEzIDkuNSAyMi41dDIyLjUgOS41aDY0cTEzIDAgMjIuNSAtOS41dDkuNSAtMjIuNXpNODk2IDczNnYtNjRxMCAtMTMgLTkuNSAtMjIuNXQtMjIuNSAtOS41aC02NHEtMTMgMCAtMjIuNSA5LjV0LTkuNSAyMi41djY0cTAgMTMgOS41IDIyLjV0MjIuNSA5LjVoNjRxMTMgMCAyMi41IC05LjV0OS41IC0yMi41eiBNNjQwIDk5MnYtNjRxMCAtMTMgLTkuNSAtMjIuNXQtMjIuNSAtOS41aC02NHEtMTMgMCAtMjIuNSA5LjV0LTkuNSAyMi41djY0cTAgMTMgOS41IDIyLjV0MjIuNSA5LjVoNjRxMTMgMCAyMi41IC05LjV0OS41IC0yMi41ek0zODQgMTI0OHYtNjRxMCAtMTMgLTkuNSAtMjIuNXQtMjIuNSAtOS41aC02NHEtMTMgMCAtMjIuNSA5LjV0LTkuNSAyMi41djY0cTAgMTMgOS41IDIyLjV0MjIuNSA5LjVoNjRxMTMgMCAyMi41IC05LjV0OS41IC0yMi41eiBNMTE1MiA3MzZ2LTY0cTAgLTEzIC05LjUgLTIyLjV0LTIyLjUgLTkuNWgtNjRxLTEzIDAgLTIyLjUgOS41dC05LjUgMjIuNXY2NHEwIDEzIDkuNSAyMi41dDIyLjUgOS41aDY0cTEzIDAgMjIuNSAtOS41dDkuNSAtMjIuNXpNODk2IDk5MnYtNjRxMCAtMTMgLTkuNSAtMjIuNXQtMjIuNSAtOS41aC02NHEtMTMgMCAtMjIuNSA5LjV0LTkuNSAyMi41djY0cTAgMTMgOS41IDIyLjV0MjIuNSA5LjVoNjRxMTMgMCAyMi41IC05LjV0OS41IC0yMi41eiBNNjQwIDEyNDh2LTY0cTAgLTEzIC05LjUgLTIyLjV0LTIyLjUgLTkuNWgtNjRxLTEzIDAgLTIyLjUgOS41dC05LjUgMjIuNXY2NHEwIDEzIDkuNSAyMi41dDIyLjUgOS41aDY0cTEzIDAgMjIuNSAtOS41dDkuNSAtMjIuNXpNMTE1MiA5OTJ2LTY0cTAgLTEzIC05LjUgLTIyLjV0LTIyLjUgLTkuNWgtNjRxLTEzIDAgLTIyLjUgOS41dC05LjUgMjIuNXY2NHEwIDEzIDkuNSAyMi41dDIyLjUgOS41aDY0cTEzIDAgMjIuNSAtOS41dDkuNSAtMjIuNXogTTg5NiAxMjQ4di02NHEwIC0xMyAtOS41IC0yMi41dC0yMi41IC05LjVoLTY0cS0xMyAwIC0yMi41IDkuNXQtOS41IDIyLjV2NjRxMCAxMyA5LjUgMjIuNXQyMi41IDkuNWg2NHExMyAwIDIyLjUgLTkuNXQ5LjUgLTIyLjV6TTExNTIgMTI0OHYtNjRxMCAtMTMgLTkuNSAtMjIuNXQtMjIuNSAtOS41aC02NHEtMTMgMCAtMjIuNSA5LjV0LTkuNSAyMi41djY0cTAgMTMgOS41IDIyLjV0MjIuNSA5LjVoNjRxMTMgMCAyMi41IC05LjV0OS41IC0yMi41eiBNODk2IC0xMjhoMzg0djE1MzZoLTExNTJ2LTE1MzZoMzg0djIyNHEwIDEzIDkuNSAyMi41dDIyLjUgOS41aDMyMHExMyAwIDIyLjUgLTkuNXQ5LjUgLTIyLjV2LTIyNHpNMTQwOCAxNDcydi0xNjY0cTAgLTI2IC0xOSAtNDV0LTQ1IC0xOWgtMTI4MHEtMjYgMCAtNDUgMTl0LTE5IDQ1djE2NjRxMCAyNiAxOSA0NXQ0NSAxOWgxMjgwcTI2IDAgNDUgLTE5dDE5IC00NXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjBmODsiIGhvcml6LWFkdi14PSIxNDA4IiBkPSJNMzg0IDIyNHYtNjRxMCAtMTMgLTkuNSAtMjIuNXQtMjIuNSAtOS41aC02NHEtMTMgMCAtMjIuNSA5LjV0LTkuNSAyMi41djY0cTAgMTMgOS41IDIyLjV0MjIuNSA5LjVoNjRxMTMgMCAyMi41IC05LjV0OS41IC0yMi41ek0zODQgNDgwdi02NHEwIC0xMyAtOS41IC0yMi41dC0yMi41IC05LjVoLTY0cS0xMyAwIC0yMi41IDkuNXQtOS41IDIyLjV2NjRxMCAxMyA5LjUgMjIuNXQyMi41IDkuNWg2NHExMyAwIDIyLjUgLTkuNXQ5LjUgLTIyLjV6IE02NDAgNDgwdi02NHEwIC0xMyAtOS41IC0yMi41dC0yMi41IC05LjVoLTY0cS0xMyAwIC0yMi41IDkuNXQtOS41IDIyLjV2NjRxMCAxMyA5LjUgMjIuNXQyMi41IDkuNWg2NHExMyAwIDIyLjUgLTkuNXQ5LjUgLTIyLjV6TTM4NCA3MzZ2LTY0cTAgLTEzIC05LjUgLTIyLjV0LTIyLjUgLTkuNWgtNjRxLTEzIDAgLTIyLjUgOS41dC05LjUgMjIuNXY2NHEwIDEzIDkuNSAyMi41dDIyLjUgOS41aDY0cTEzIDAgMjIuNSAtOS41dDkuNSAtMjIuNXogTTExNTIgMjI0di02NHEwIC0xMyAtOS41IC0yMi41dC0yMi41IC05LjVoLTY0cS0xMyAwIC0yMi41IDkuNXQtOS41IDIyLjV2NjRxMCAxMyA5LjUgMjIuNXQyMi41IDkuNWg2NHExMyAwIDIyLjUgLTkuNXQ5LjUgLTIyLjV6TTg5NiA0ODB2LTY0cTAgLTEzIC05LjUgLTIyLjV0LTIyLjUgLTkuNWgtNjRxLTEzIDAgLTIyLjUgOS41dC05LjUgMjIuNXY2NHEwIDEzIDkuNSAyMi41dDIyLjUgOS41aDY0cTEzIDAgMjIuNSAtOS41dDkuNSAtMjIuNXogTTY0MCA3MzZ2LTY0cTAgLTEzIC05LjUgLTIyLjV0LTIyLjUgLTkuNWgtNjRxLTEzIDAgLTIyLjUgOS41dC05LjUgMjIuNXY2NHEwIDEzIDkuNSAyMi41dDIyLjUgOS41aDY0cTEzIDAgMjIuNSAtOS41dDkuNSAtMjIuNXpNMTE1MiA0ODB2LTY0cTAgLTEzIC05LjUgLTIyLjV0LTIyLjUgLTkuNWgtNjRxLTEzIDAgLTIyLjUgOS41dC05LjUgMjIuNXY2NHEwIDEzIDkuNSAyMi41dDIyLjUgOS41aDY0cTEzIDAgMjIuNSAtOS41dDkuNSAtMjIuNXogTTg5NiA3MzZ2LTY0cTAgLTEzIC05LjUgLTIyLjV0LTIyLjUgLTkuNWgtNjRxLTEzIDAgLTIyLjUgOS41dC05LjUgMjIuNXY2NHEwIDEzIDkuNSAyMi41dDIyLjUgOS41aDY0cTEzIDAgMjIuNSAtOS41dDkuNSAtMjIuNXpNMTE1MiA3MzZ2LTY0cTAgLTEzIC05LjUgLTIyLjV0LTIyLjUgLTkuNWgtNjRxLTEzIDAgLTIyLjUgOS41dC05LjUgMjIuNXY2NHEwIDEzIDkuNSAyMi41dDIyLjUgOS41aDY0cTEzIDAgMjIuNSAtOS41dDkuNSAtMjIuNXogTTg5NiAtMTI4aDM4NHYxMTUyaC0yNTZ2LTMycTAgLTQwIC0yOCAtNjh0LTY4IC0yOGgtNDQ4cS00MCAwIC02OCAyOHQtMjggNjh2MzJoLTI1NnYtMTE1MmgzODR2MjI0cTAgMTMgOS41IDIyLjV0MjIuNSA5LjVoMzIwcTEzIDAgMjIuNSAtOS41dDkuNSAtMjIuNXYtMjI0ek04OTYgMTA1NnYzMjBxMCAxMyAtOS41IDIyLjV0LTIyLjUgOS41aC02NHEtMTMgMCAtMjIuNSAtOS41dC05LjUgLTIyLjV2LTk2aC0xMjh2OTZxMCAxMyAtOS41IDIyLjUgdC0yMi41IDkuNWgtNjRxLTEzIDAgLTIyLjUgLTkuNXQtOS41IC0yMi41di0zMjBxMCAtMTMgOS41IC0yMi41dDIyLjUgLTkuNWg2NHExMyAwIDIyLjUgOS41dDkuNSAyMi41djk2aDEyOHYtOTZxMCAtMTMgOS41IC0yMi41dDIyLjUgLTkuNWg2NHExMyAwIDIyLjUgOS41dDkuNSAyMi41ek0xNDA4IDEwODh2LTEyODBxMCAtMjYgLTE5IC00NXQtNDUgLTE5aC0xMjgwcS0yNiAwIC00NSAxOXQtMTkgNDV2MTI4MHEwIDI2IDE5IDQ1dDQ1IDE5aDMyMCB2Mjg4cTAgNDAgMjggNjh0NjggMjhoNDQ4cTQwIDAgNjggLTI4dDI4IC02OHYtMjg4aDMyMHEyNiAwIDQ1IC0xOXQxOSAtNDV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwZjk7IiBob3Jpei1hZHYteD0iMTkyMCIgZD0iTTY0MCAxMjhxMCA1MyAtMzcuNSA5MC41dC05MC41IDM3LjV0LTkwLjUgLTM3LjV0LTM3LjUgLTkwLjV0MzcuNSAtOTAuNXQ5MC41IC0zNy41dDkwLjUgMzcuNXQzNy41IDkwLjV6TTI1NiA2NDBoMzg0djI1NmgtMTU4cS0xNCAtMiAtMjIgLTlsLTE5NSAtMTk1cS03IC0xMiAtOSAtMjJ2LTMwek0xNTM2IDEyOHEwIDUzIC0zNy41IDkwLjV0LTkwLjUgMzcuNXQtOTAuNSAtMzcuNXQtMzcuNSAtOTAuNXQzNy41IC05MC41dDkwLjUgLTM3LjUgdDkwLjUgMzcuNXQzNy41IDkwLjV6TTE2NjQgODAwdjE5MnEwIDE0IC05IDIzdC0yMyA5aC0yMjR2MjI0cTAgMTQgLTkgMjN0LTIzIDloLTE5MnEtMTQgMCAtMjMgLTl0LTkgLTIzdi0yMjRoLTIyNHEtMTQgMCAtMjMgLTl0LTkgLTIzdi0xOTJxMCAtMTQgOSAtMjN0MjMgLTloMjI0di0yMjRxMCAtMTQgOSAtMjN0MjMgLTloMTkycTE0IDAgMjMgOXQ5IDIzdjIyNGgyMjRxMTQgMCAyMyA5dDkgMjN6TTE5MjAgMTM0NHYtMTE1MiBxMCAtMjYgLTE5IC00NXQtNDUgLTE5aC0xOTJxMCAtMTA2IC03NSAtMTgxdC0xODEgLTc1dC0xODEgNzV0LTc1IDE4MWgtMzg0cTAgLTEwNiAtNzUgLTE4MXQtMTgxIC03NXQtMTgxIDc1dC03NSAxODFoLTEyOHEtMjYgMCAtNDUgMTl0LTE5IDQ1dDE5IDQ1dDQ1IDE5djQxNnEwIDI2IDEzIDU4dDMyIDUxbDE5OCAxOThxMTkgMTkgNTEgMzJ0NTggMTNoMTYwdjMyMHEwIDI2IDE5IDQ1dDQ1IDE5aDExNTJxMjYgMCA0NSAtMTl0MTkgLTQ1eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMGZhOyIgaG9yaXotYWR2LXg9IjE3OTIiIGQ9Ik0xMjgwIDQxNnYxOTJxMCAxNCAtOSAyM3QtMjMgOWgtMjI0djIyNHEwIDE0IC05IDIzdC0yMyA5aC0xOTJxLTE0IDAgLTIzIC05dC05IC0yM3YtMjI0aC0yMjRxLTE0IDAgLTIzIC05dC05IC0yM3YtMTkycTAgLTE0IDkgLTIzdDIzIC05aDIyNHYtMjI0cTAgLTE0IDkgLTIzdDIzIC05aDE5MnExNCAwIDIzIDl0OSAyM3YyMjRoMjI0cTE0IDAgMjMgOXQ5IDIzek02NDAgMTE1Mmg1MTJ2MTI4aC01MTJ2LTEyOHpNMjU2IDExNTJ2LTEyODBoLTMyIHEtOTIgMCAtMTU4IDY2dC02NiAxNTh2ODMycTAgOTIgNjYgMTU4dDE1OCA2NmgzMnpNMTQ0MCAxMTUydi0xMjgwaC0xMDg4djEyODBoMTYwdjE2MHEwIDQwIDI4IDY4dDY4IDI4aDU3NnE0MCAwIDY4IC0yOHQyOCAtNjh2LTE2MGgxNjB6TTE3OTIgOTI4di04MzJxMCAtOTIgLTY2IC0xNTh0LTE1OCAtNjZoLTMydjEyODBoMzJxOTIgMCAxNTggLTY2dDY2IC0xNTh6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwZmI7IiBob3Jpei1hZHYteD0iMTkyMCIgZD0iTTE2MzIgODAwcTI2MSAtNTggMjg3IC05M2wxIC0zcS0xIC0zMiAtMjg4IC05NmwtMzUyIC0zMmwtMjI0IC02NGgtNjRsLTI5MyAtMzUyaDY5cTI2IDAgNDUgLTQuNXQxOSAtMTEuNXQtMTkgLTExLjV0LTQ1IC00LjVoLTk2aC0xNjBoLTY0djMyaDY0djQxNmgtMTYwbC0xOTIgLTIyNGgtOTZsLTMyIDMydjE5MmgzMnYzMmgxMjh2OGwtMTkyIDI0djEyOGwxOTIgMjR2OGgtMTI4djMyaC0zMnYxOTJsMzIgMzJoOTZsMTkyIC0yMjRoMTYwdjQxNiBoLTY0djMyaDY0aDE2MGg5NnEyNiAwIDQ1IC00LjV0MTkgLTExLjV0LTE5IC0xMS41dC00NSAtNC41aC02OWwyOTMgLTM1Mmg2NGwyMjQgLTY0eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMGZjOyIgaG9yaXotYWR2LXg9IjE2NjQiIGQ9Ik02NDAgNjQwdjM4NGgtMjU2di0xNjBxMCAtNDUgMiAtNzZ0Ny41IC01Ni41dDE0LjUgLTQwdDIzIC0yNi41dDMzLjUgLTE1LjV0NDUgLTcuNXQ1OCAtMi41dDcyLjUgMC41ek0xNjY0IDE5MnYtMTkyaC0xMTUydjE5MmwxMjggMTkyaC05N3EtMjExIDAgLTMxMyAxMDIuNXQtMTAyIDMxNC41djI4N2wtNjQgNjRsMzIgMTI4aDQ4MGwzMiAxMjhoOTYwbDMyIC0xOTJsLTY0IC0zMnYtODAweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMGZkOyIgZD0iTTEyODAgMTkydjg5NnEwIDI2IC0xOSA0NXQtNDUgMTloLTEyOHEtMjYgMCAtNDUgLTE5dC0xOSAtNDV2LTMyMGgtNTEydjMyMHEwIDI2IC0xOSA0NXQtNDUgMTloLTEyOHEtMjYgMCAtNDUgLTE5dC0xOSAtNDV2LTg5NnEwIC0yNiAxOSAtNDV0NDUgLTE5aDEyOHEyNiAwIDQ1IDE5dDE5IDQ1djMyMGg1MTJ2LTMyMHEwIC0yNiAxOSAtNDV0NDUgLTE5aDEyOHEyNiAwIDQ1IDE5dDE5IDQ1ek0xNTM2IDExMjB2LTk2MCBxMCAtMTE5IC04NC41IC0yMDMuNXQtMjAzLjUgLTg0LjVoLTk2MHEtMTE5IDAgLTIwMy41IDg0LjV0LTg0LjUgMjAzLjV2OTYwcTAgMTE5IDg0LjUgMjAzLjV0MjAzLjUgODQuNWg5NjBxMTE5IDAgMjAzLjUgLTg0LjV0ODQuNSAtMjAzLjV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYwZmU7IiBkPSJNMTI4MCA1NzZ2MTI4cTAgMjYgLTE5IDQ1dC00NSAxOWgtMzIwdjMyMHEwIDI2IC0xOSA0NXQtNDUgMTloLTEyOHEtMjYgMCAtNDUgLTE5dC0xOSAtNDV2LTMyMGgtMzIwcS0yNiAwIC00NSAtMTl0LTE5IC00NXYtMTI4cTAgLTI2IDE5IC00NXQ0NSAtMTloMzIwdi0zMjBxMCAtMjYgMTkgLTQ1dDQ1IC0xOWgxMjhxMjYgMCA0NSAxOXQxOSA0NXYzMjBoMzIwcTI2IDAgNDUgMTl0MTkgNDV6TTE1MzYgMTEyMHYtOTYwIHEwIC0xMTkgLTg0LjUgLTIwMy41dC0yMDMuNSAtODQuNWgtOTYwcS0xMTkgMCAtMjAzLjUgODQuNXQtODQuNSAyMDMuNXY5NjBxMCAxMTkgODQuNSAyMDMuNXQyMDMuNSA4NC41aDk2MHExMTkgMCAyMDMuNSAtODQuNXQ4NC41IC0yMDMuNXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjEwMDsiIGhvcml6LWFkdi14PSIxMDI0IiBkPSJNNjI3IDE2MHEwIC0xMyAtMTAgLTIzbC01MCAtNTBxLTEwIC0xMCAtMjMgLTEwdC0yMyAxMGwtNDY2IDQ2NnEtMTAgMTAgLTEwIDIzdDEwIDIzbDQ2NiA0NjZxMTAgMTAgMjMgMTB0MjMgLTEwbDUwIC01MHExMCAtMTAgMTAgLTIzdC0xMCAtMjNsLTM5MyAtMzkzbDM5MyAtMzkzcTEwIC0xMCAxMCAtMjN6TTEwMTEgMTYwcTAgLTEzIC0xMCAtMjNsLTUwIC01MHEtMTAgLTEwIC0yMyAtMTB0LTIzIDEwbC00NjYgNDY2cS0xMCAxMCAtMTAgMjMgdDEwIDIzbDQ2NiA0NjZxMTAgMTAgMjMgMTB0MjMgLTEwbDUwIC01MHExMCAtMTAgMTAgLTIzdC0xMCAtMjNsLTM5MyAtMzkzbDM5MyAtMzkzcTEwIC0xMCAxMCAtMjN6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYxMDE7IiBob3Jpei1hZHYteD0iMTAyNCIgZD0iTTU5NSA1NzZxMCAtMTMgLTEwIC0yM2wtNDY2IC00NjZxLTEwIC0xMCAtMjMgLTEwdC0yMyAxMGwtNTAgNTBxLTEwIDEwIC0xMCAyM3QxMCAyM2wzOTMgMzkzbC0zOTMgMzkzcS0xMCAxMCAtMTAgMjN0MTAgMjNsNTAgNTBxMTAgMTAgMjMgMTB0MjMgLTEwbDQ2NiAtNDY2cTEwIC0xMCAxMCAtMjN6TTk3OSA1NzZxMCAtMTMgLTEwIC0yM2wtNDY2IC00NjZxLTEwIC0xMCAtMjMgLTEwdC0yMyAxMGwtNTAgNTBxLTEwIDEwIC0xMCAyM3QxMCAyMyBsMzkzIDM5M2wtMzkzIDM5M3EtMTAgMTAgLTEwIDIzdDEwIDIzbDUwIDUwcTEwIDEwIDIzIDEwdDIzIC0xMGw0NjYgLTQ2NnExMCAtMTAgMTAgLTIzeiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMTAyOyIgaG9yaXotYWR2LXg9IjExNTIiIGQ9Ik0xMDc1IDIyNHEwIC0xMyAtMTAgLTIzbC01MCAtNTBxLTEwIC0xMCAtMjMgLTEwdC0yMyAxMGwtMzkzIDM5M2wtMzkzIC0zOTNxLTEwIC0xMCAtMjMgLTEwdC0yMyAxMGwtNTAgNTBxLTEwIDEwIC0xMCAyM3QxMCAyM2w0NjYgNDY2cTEwIDEwIDIzIDEwdDIzIC0xMGw0NjYgLTQ2NnExMCAtMTAgMTAgLTIzek0xMDc1IDYwOHEwIC0xMyAtMTAgLTIzbC01MCAtNTBxLTEwIC0xMCAtMjMgLTEwdC0yMyAxMGwtMzkzIDM5M2wtMzkzIC0zOTMgcS0xMCAtMTAgLTIzIC0xMHQtMjMgMTBsLTUwIDUwcS0xMCAxMCAtMTAgMjN0MTAgMjNsNDY2IDQ2NnExMCAxMCAyMyAxMHQyMyAtMTBsNDY2IC00NjZxMTAgLTEwIDEwIC0yM3oiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjEwMzsiIGhvcml6LWFkdi14PSIxMTUyIiBkPSJNMTA3NSA2NzJxMCAtMTMgLTEwIC0yM2wtNDY2IC00NjZxLTEwIC0xMCAtMjMgLTEwdC0yMyAxMGwtNDY2IDQ2NnEtMTAgMTAgLTEwIDIzdDEwIDIzbDUwIDUwcTEwIDEwIDIzIDEwdDIzIC0xMGwzOTMgLTM5M2wzOTMgMzkzcTEwIDEwIDIzIDEwdDIzIC0xMGw1MCAtNTBxMTAgLTEwIDEwIC0yM3pNMTA3NSAxMDU2cTAgLTEzIC0xMCAtMjNsLTQ2NiAtNDY2cS0xMCAtMTAgLTIzIC0xMHQtMjMgMTBsLTQ2NiA0NjZxLTEwIDEwIC0xMCAyMyB0MTAgMjNsNTAgNTBxMTAgMTAgMjMgMTB0MjMgLTEwbDM5MyAtMzkzbDM5MyAzOTNxMTAgMTAgMjMgMTB0MjMgLTEwbDUwIC01MHExMCAtMTAgMTAgLTIzeiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMTA0OyIgaG9yaXotYWR2LXg9IjY0MCIgZD0iTTYyNyA5OTJxMCAtMTMgLTEwIC0yM2wtMzkzIC0zOTNsMzkzIC0zOTNxMTAgLTEwIDEwIC0yM3QtMTAgLTIzbC01MCAtNTBxLTEwIC0xMCAtMjMgLTEwdC0yMyAxMGwtNDY2IDQ2NnEtMTAgMTAgLTEwIDIzdDEwIDIzbDQ2NiA0NjZxMTAgMTAgMjMgMTB0MjMgLTEwbDUwIC01MHExMCAtMTAgMTAgLTIzeiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMTA1OyIgaG9yaXotYWR2LXg9IjY0MCIgZD0iTTU5NSA1NzZxMCAtMTMgLTEwIC0yM2wtNDY2IC00NjZxLTEwIC0xMCAtMjMgLTEwdC0yMyAxMGwtNTAgNTBxLTEwIDEwIC0xMCAyM3QxMCAyM2wzOTMgMzkzbC0zOTMgMzkzcS0xMCAxMCAtMTAgMjN0MTAgMjNsNTAgNTBxMTAgMTAgMjMgMTB0MjMgLTEwbDQ2NiAtNDY2cTEwIC0xMCAxMCAtMjN6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYxMDY7IiBob3Jpei1hZHYteD0iMTE1MiIgZD0iTTEwNzUgMzUycTAgLTEzIC0xMCAtMjNsLTUwIC01MHEtMTAgLTEwIC0yMyAtMTB0LTIzIDEwbC0zOTMgMzkzbC0zOTMgLTM5M3EtMTAgLTEwIC0yMyAtMTB0LTIzIDEwbC01MCA1MHEtMTAgMTAgLTEwIDIzdDEwIDIzbDQ2NiA0NjZxMTAgMTAgMjMgMTB0MjMgLTEwbDQ2NiAtNDY2cTEwIC0xMCAxMCAtMjN6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYxMDc7IiBob3Jpei1hZHYteD0iMTE1MiIgZD0iTTEwNzUgODAwcTAgLTEzIC0xMCAtMjNsLTQ2NiAtNDY2cS0xMCAtMTAgLTIzIC0xMHQtMjMgMTBsLTQ2NiA0NjZxLTEwIDEwIC0xMCAyM3QxMCAyM2w1MCA1MHExMCAxMCAyMyAxMHQyMyAtMTBsMzkzIC0zOTNsMzkzIDM5M3ExMCAxMCAyMyAxMHQyMyAtMTBsNTAgLTUwcTEwIC0xMCAxMCAtMjN6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYxMDg7IiBob3Jpei1hZHYteD0iMTkyMCIgZD0iTTE3OTIgNTQ0djgzMnEwIDEzIC05LjUgMjIuNXQtMjIuNSA5LjVoLTE2MDBxLTEzIDAgLTIyLjUgLTkuNXQtOS41IC0yMi41di04MzJxMCAtMTMgOS41IC0yMi41dDIyLjUgLTkuNWgxNjAwcTEzIDAgMjIuNSA5LjV0OS41IDIyLjV6TTE5MjAgMTM3NnYtMTA4OHEwIC02NiAtNDcgLTExM3QtMTEzIC00N2gtNTQ0cTAgLTM3IDE2IC03Ny41dDMyIC03MXQxNiAtNDMuNXEwIC0yNiAtMTkgLTQ1dC00NSAtMTloLTUxMnEtMjYgMCAtNDUgMTkgdC0xOSA0NXEwIDE0IDE2IDQ0dDMyIDcwdDE2IDc4aC01NDRxLTY2IDAgLTExMyA0N3QtNDcgMTEzdjEwODhxMCA2NiA0NyAxMTN0MTEzIDQ3aDE2MDBxNjYgMCAxMTMgLTQ3dDQ3IC0xMTN6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYxMDk7IiBob3Jpei1hZHYteD0iMTkyMCIgZD0iTTQxNiAyNTZxLTY2IDAgLTExMyA0N3QtNDcgMTEzdjcwNHEwIDY2IDQ3IDExM3QxMTMgNDdoMTA4OHE2NiAwIDExMyAtNDd0NDcgLTExM3YtNzA0cTAgLTY2IC00NyAtMTEzdC0xMTMgLTQ3aC0xMDg4ek0zODQgMTEyMHYtNzA0cTAgLTEzIDkuNSAtMjIuNXQyMi41IC05LjVoMTA4OHExMyAwIDIyLjUgOS41dDkuNSAyMi41djcwNHEwIDEzIC05LjUgMjIuNXQtMjIuNSA5LjVoLTEwODhxLTEzIDAgLTIyLjUgLTkuNXQtOS41IC0yMi41eiBNMTc2MCAxOTJoMTYwdi05NnEwIC00MCAtNDcgLTY4dC0xMTMgLTI4aC0xNjAwcS02NiAwIC0xMTMgMjh0LTQ3IDY4djk2aDE2MGgxNjAwek0xMDQwIDk2cTE2IDAgMTYgMTZ0LTE2IDE2aC0xNjBxLTE2IDAgLTE2IC0xNnQxNiAtMTZoMTYweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMTBhOyIgaG9yaXotYWR2LXg9IjExNTIiIGQ9Ik02NDAgMTI4cTAgMjYgLTE5IDQ1dC00NSAxOXQtNDUgLTE5dC0xOSAtNDV0MTkgLTQ1dDQ1IC0xOXQ0NSAxOXQxOSA0NXpNMTAyNCAyODh2OTYwcTAgMTMgLTkuNSAyMi41dC0yMi41IDkuNWgtODMycS0xMyAwIC0yMi41IC05LjV0LTkuNSAtMjIuNXYtOTYwcTAgLTEzIDkuNSAtMjIuNXQyMi41IC05LjVoODMycTEzIDAgMjIuNSA5LjV0OS41IDIyLjV6TTExNTIgMTI0OHYtMTA4OHEwIC02NiAtNDcgLTExM3QtMTEzIC00N2gtODMyIHEtNjYgMCAtMTEzIDQ3dC00NyAxMTN2MTA4OHEwIDY2IDQ3IDExM3QxMTMgNDdoODMycTY2IDAgMTEzIC00N3Q0NyAtMTEzeiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMTBiOyIgaG9yaXotYWR2LXg9Ijc2OCIgZD0iTTQ2NCAxMjhxMCAzMyAtMjMuNSA1Ni41dC01Ni41IDIzLjV0LTU2LjUgLTIzLjV0LTIzLjUgLTU2LjV0MjMuNSAtNTYuNXQ1Ni41IC0yMy41dDU2LjUgMjMuNXQyMy41IDU2LjV6TTY3MiAyODh2NzA0cTAgMTMgLTkuNSAyMi41dC0yMi41IDkuNWgtNTEycS0xMyAwIC0yMi41IC05LjV0LTkuNSAtMjIuNXYtNzA0cTAgLTEzIDkuNSAtMjIuNXQyMi41IC05LjVoNTEycTEzIDAgMjIuNSA5LjV0OS41IDIyLjV6TTQ4MCAxMTM2IHEwIDE2IC0xNiAxNmgtMTYwcS0xNiAwIC0xNiAtMTZ0MTYgLTE2aDE2MHExNiAwIDE2IDE2ek03NjggMTE1MnYtMTAyNHEwIC01MiAtMzggLTkwdC05MCAtMzhoLTUxMnEtNTIgMCAtOTAgMzh0LTM4IDkwdjEwMjRxMCA1MiAzOCA5MHQ5MCAzOGg1MTJxNTIgMCA5MCAtMzh0MzggLTkweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMTBjOyIgZD0iTTEyODAgNjQwcTAgMTA0IC00MC41IDE5OC41dC0xMDkuNSAxNjMuNXQtMTYzLjUgMTA5LjV0LTE5OC41IDQwLjV0LTE5OC41IC00MC41dC0xNjMuNSAtMTA5LjV0LTEwOS41IC0xNjMuNXQtNDAuNSAtMTk4LjV0NDAuNSAtMTk4LjV0MTA5LjUgLTE2My41dDE2My41IC0xMDkuNXQxOTguNSAtNDAuNXQxOTguNSA0MC41dDE2My41IDEwOS41dDEwOS41IDE2My41dDQwLjUgMTk4LjV6TTE1MzYgNjQwcTAgLTIwOSAtMTAzIC0zODUuNSB0LTI3OS41IC0yNzkuNXQtMzg1LjUgLTEwM3QtMzg1LjUgMTAzdC0yNzkuNSAyNzkuNXQtMTAzIDM4NS41dDEwMyAzODUuNXQyNzkuNSAyNzkuNXQzODUuNSAxMDN0Mzg1LjUgLTEwM3QyNzkuNSAtMjc5LjV0MTAzIC0zODUuNXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjEwZDsiIGhvcml6LWFkdi14PSIxNjY0IiBkPSJNNzY4IDU3NnYtMzg0cTAgLTgwIC01NiAtMTM2dC0xMzYgLTU2aC0zODRxLTgwIDAgLTEzNiA1NnQtNTYgMTM2djcwNHEwIDEwNCA0MC41IDE5OC41dDEwOS41IDE2My41dDE2My41IDEwOS41dDE5OC41IDQwLjVoNjRxMjYgMCA0NSAtMTl0MTkgLTQ1di0xMjhxMCAtMjYgLTE5IC00NXQtNDUgLTE5aC02NHEtMTA2IDAgLTE4MSAtNzV0LTc1IC0xODF2LTMycTAgLTQwIDI4IC02OHQ2OCAtMjhoMjI0cTgwIDAgMTM2IC01NnQ1NiAtMTM2eiBNMTY2NCA1NzZ2LTM4NHEwIC04MCAtNTYgLTEzNnQtMTM2IC01NmgtMzg0cS04MCAwIC0xMzYgNTZ0LTU2IDEzNnY3MDRxMCAxMDQgNDAuNSAxOTguNXQxMDkuNSAxNjMuNXQxNjMuNSAxMDkuNXQxOTguNSA0MC41aDY0cTI2IDAgNDUgLTE5dDE5IC00NXYtMTI4cTAgLTI2IC0xOSAtNDV0LTQ1IC0xOWgtNjRxLTEwNiAwIC0xODEgLTc1dC03NSAtMTgxdi0zMnEwIC00MCAyOCAtNjh0NjggLTI4aDIyNHE4MCAwIDEzNiAtNTZ0NTYgLTEzNnoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZjEwZTsiIGhvcml6LWFkdi14PSIxNjY0IiBkPSJNNzY4IDEyMTZ2LTcwNHEwIC0xMDQgLTQwLjUgLTE5OC41dC0xMDkuNSAtMTYzLjV0LTE2My41IC0xMDkuNXQtMTk4LjUgLTQwLjVoLTY0cS0yNiAwIC00NSAxOXQtMTkgNDV2MTI4cTAgMjYgMTkgNDV0NDUgMTloNjRxMTA2IDAgMTgxIDc1dDc1IDE4MXYzMnEwIDQwIC0yOCA2OHQtNjggMjhoLTIyNHEtODAgMCAtMTM2IDU2dC01NiAxMzZ2Mzg0cTAgODAgNTYgMTM2dDEzNiA1NmgzODRxODAgMCAxMzYgLTU2dDU2IC0xMzZ6TTE2NjQgMTIxNiB2LTcwNHEwIC0xMDQgLTQwLjUgLTE5OC41dC0xMDkuNSAtMTYzLjV0LTE2My41IC0xMDkuNXQtMTk4LjUgLTQwLjVoLTY0cS0yNiAwIC00NSAxOXQtMTkgNDV2MTI4cTAgMjYgMTkgNDV0NDUgMTloNjRxMTA2IDAgMTgxIDc1dDc1IDE4MXYzMnEwIDQwIC0yOCA2OHQtNjggMjhoLTIyNHEtODAgMCAtMTM2IDU2dC01NiAxMzZ2Mzg0cTAgODAgNTYgMTM2dDEzNiA1NmgzODRxODAgMCAxMzYgLTU2dDU2IC0xMzZ6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYxMTA7IiBob3Jpei1hZHYteD0iMTU2OCIgZD0iTTQ5NiAxOTJxMCAtNjAgLTQyLjUgLTEwMnQtMTAxLjUgLTQycS02MCAwIC0xMDIgNDJ0LTQyIDEwMnQ0MiAxMDJ0MTAyIDQycTU5IDAgMTAxLjUgLTQydDQyLjUgLTEwMnpNOTI4IDBxMCAtNTMgLTM3LjUgLTkwLjV0LTkwLjUgLTM3LjV0LTkwLjUgMzcuNXQtMzcuNSA5MC41dDM3LjUgOTAuNXQ5MC41IDM3LjV0OTAuNSAtMzcuNXQzNy41IC05MC41ek0zMjAgNjQwcTAgLTY2IC00NyAtMTEzdC0xMTMgLTQ3dC0xMTMgNDd0LTQ3IDExMyB0NDcgMTEzdDExMyA0N3QxMTMgLTQ3dDQ3IC0xMTN6TTEzNjAgMTkycTAgLTQ2IC0zMyAtNzl0LTc5IC0zM3QtNzkgMzN0LTMzIDc5dDMzIDc5dDc5IDMzdDc5IC0zM3QzMyAtNzl6TTUyOCAxMDg4cTAgLTczIC01MS41IC0xMjQuNXQtMTI0LjUgLTUxLjV0LTEyNC41IDUxLjV0LTUxLjUgMTI0LjV0NTEuNSAxMjQuNXQxMjQuNSA1MS41dDEyNC41IC01MS41dDUxLjUgLTEyNC41ek05OTIgMTI4MHEwIC04MCAtNTYgLTEzNnQtMTM2IC01NiB0LTEzNiA1NnQtNTYgMTM2dDU2IDEzNnQxMzYgNTZ0MTM2IC01NnQ1NiAtMTM2ek0xNTM2IDY0MHEwIC00MCAtMjggLTY4dC02OCAtMjh0LTY4IDI4dC0yOCA2OHQyOCA2OHQ2OCAyOHQ2OCAtMjh0MjggLTY4ek0xMzI4IDEwODhxMCAtMzMgLTIzLjUgLTU2LjV0LTU2LjUgLTIzLjV0LTU2LjUgMjMuNXQtMjMuNSA1Ni41dDIzLjUgNTYuNXQ1Ni41IDIzLjV0NTYuNSAtMjMuNXQyMy41IC01Ni41eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMTExOyIgZD0iTTE1MzYgNjQwcTAgLTIwOSAtMTAzIC0zODUuNXQtMjc5LjUgLTI3OS41dC0zODUuNSAtMTAzdC0zODUuNSAxMDN0LTI3OS41IDI3OS41dC0xMDMgMzg1LjV0MTAzIDM4NS41dDI3OS41IDI3OS41dDM4NS41IDEwM3QzODUuNSAtMTAzdDI3OS41IC0yNzkuNXQxMDMgLTM4NS41eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMTEyOyIgaG9yaXotYWR2LXg9IjE3OTIiIGQ9Ik0xNzkyIDQxNnEwIC0xNjYgLTEyNyAtNDUxcS0zIC03IC0xMC41IC0yNHQtMTMuNSAtMzB0LTEzIC0yMnEtMTIgLTE3IC0yOCAtMTdxLTE1IDAgLTIzLjUgMTB0LTguNSAyNXEwIDkgMi41IDI2LjV0Mi41IDIzLjVxNSA2OCA1IDEyM3EwIDEwMSAtMTcuNSAxODF0LTQ4LjUgMTM4LjV0LTgwIDEwMXQtMTA1LjUgNjkuNXQtMTMzIDQyLjV0LTE1NCAyMS41dC0xNzUuNSA2aC0yMjR2LTI1NnEwIC0yNiAtMTkgLTQ1dC00NSAtMTl0LTQ1IDE5IGwtNTEyIDUxMnEtMTkgMTkgLTE5IDQ1dDE5IDQ1bDUxMiA1MTJxMTkgMTkgNDUgMTl0NDUgLTE5dDE5IC00NXYtMjU2aDIyNHE3MTMgMCA4NzUgLTQwM3E1MyAtMTM0IDUzIC0zMzN6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYxMTM7IiBob3Jpei1hZHYteD0iMTY2NCIgZD0iTTY0MCAzMjBxMCAtNDAgLTEyLjUgLTgydC00MyAtNzZ0LTcyLjUgLTM0dC03Mi41IDM0dC00MyA3NnQtMTIuNSA4MnQxMi41IDgydDQzIDc2dDcyLjUgMzR0NzIuNSAtMzR0NDMgLTc2dDEyLjUgLTgyek0xMjgwIDMyMHEwIC00MCAtMTIuNSAtODJ0LTQzIC03NnQtNzIuNSAtMzR0LTcyLjUgMzR0LTQzIDc2dC0xMi41IDgydDEyLjUgODJ0NDMgNzZ0NzIuNSAzNHQ3Mi41IC0zNHQ0MyAtNzZ0MTIuNSAtODJ6TTE0NDAgMzIwIHEwIDEyMCAtNjkgMjA0dC0xODcgODRxLTQxIDAgLTE5NSAtMjFxLTcxIC0xMSAtMTU3IC0xMXQtMTU3IDExcS0xNTIgMjEgLTE5NSAyMXEtMTE4IDAgLTE4NyAtODR0LTY5IC0yMDRxMCAtODggMzIgLTE1My41dDgxIC0xMDN0MTIyIC02MHQxNDAgLTI5LjV0MTQ5IC03aDE2OHE4MiAwIDE0OSA3dDE0MCAyOS41dDEyMiA2MHQ4MSAxMDN0MzIgMTUzLjV6TTE2NjQgNDk2cTAgLTIwNyAtNjEgLTMzMXEtMzggLTc3IC0xMDUuNSAtMTMzdC0xNDEgLTg2IHQtMTcwIC00Ny41dC0xNzEuNSAtMjJ0LTE2NyAtNC41cS03OCAwIC0xNDIgM3QtMTQ3LjUgMTIuNXQtMTUyLjUgMzB0LTEzNyA1MS41dC0xMjEgODF0LTg2IDExNXEtNjIgMTIzIC02MiAzMzFxMCAyMzcgMTM2IDM5NnEtMjcgODIgLTI3IDE3MHEwIDExNiA1MSAyMThxMTA4IDAgMTkwIC0zOS41dDE4OSAtMTIzLjVxMTQ3IDM1IDMwOSAzNXExNDggMCAyODAgLTMycTEwNSA4MiAxODcgMTIxdDE4OSAzOXE1MSAtMTAyIDUxIC0yMTggcTAgLTg3IC0yNyAtMTY4cTEzNiAtMTYwIDEzNiAtMzk4eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hmMTE0OyIgaG9yaXotYWR2LXg9IjE2NjQiIGQ9Ik0xNTM2IDIyNHY3MDRxMCA0MCAtMjggNjh0LTY4IDI4aC03MDRxLTQwIDAgLTY4IDI4dC0yOCA2OHY2NHEwIDQwIC0yOCA2OHQtNjggMjhoLTMyMHEtNDAgMCAtNjggLTI4dC0yOCAtNjh2LTk2MHEwIC00MCAyOCAtNjh0NjggLTI4aDEyMTZxNDAgMCA2OCAyOHQyOCA2OHpNMTY2NCA5Mjh2LTcwNHEwIC05MiAtNjYgLTE1OHQtMTU4IC02NmgtMTIxNnEtOTIgMCAtMTU4IDY2dC02NiAxNTh2OTYwcTAgOTIgNjYgMTU4dDE1OCA2NmgzMjAgcTkyIDAgMTU4IC02NnQ2NiAtMTU4di0zMmg2NzJxOTIgMCAxNTggLTY2dDY2IC0xNTh6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGYxMTU7IiBob3Jpei1hZHYteD0iMTkyMCIgZD0iTTE3ODEgNjA1cTAgMzUgLTUzIDM1aC0xMDg4cS00MCAwIC04NS41IC0yMS41dC03MS41IC01Mi41bC0yOTQgLTM2M3EtMTggLTI0IC0xOCAtNDBxMCAtMzUgNTMgLTM1aDEwODhxNDAgMCA4NiAyMnQ3MSA1M2wyOTQgMzYzcTE4IDIyIDE4IDM5ek02NDAgNzY4aDc2OHYxNjBxMCA0MCAtMjggNjh0LTY4IDI4aC01NzZxLTQwIDAgLTY4IDI4dC0yOCA2OHY2NHEwIDQwIC0yOCA2OHQtNjggMjhoLTMyMHEtNDAgMCAtNjggLTI4dC0yOCAtNjggdi04NTNsMjU2IDMxNXE0NCA1MyAxMTYgODcuNXQxNDAgMzQuNXpNMTkwOSA2MDVxMCAtNjIgLTQ2IC0xMjBsLTI5NSAtMzYzcS00MyAtNTMgLTExNiAtODcuNXQtMTQwIC0zNC41aC0xMDg4cS05MiAwIC0xNTggNjZ0LTY2IDE1OHY5NjBxMCA5MiA2NiAxNTh0MTU4IDY2aDMyMHE5MiAwIDE1OCAtNjZ0NjYgLTE1OHYtMzJoNTQ0cTkyIDAgMTU4IC02NnQ2NiAtMTU4di0xNjBoMTkycTU0IDAgOTkgLTI0LjV0NjcgLTcwLjVxMTUgLTMyIDE1IC02OHogIiAvPgorPC9mb250PgorPC9kZWZzPjwvc3ZnPiAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2ZvbnRzL2ZvbnRhd2Vzb21lLXdlYmZvbnQudHRmIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9mb250cy9mb250YXdlc29tZS13ZWJmb250LnR0ZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDYxNzI0Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9mb250cy9mb250YXdlc29tZS13ZWJmb250LnR0ZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2ZvbnRzL2ZvbnRhd2Vzb21lLXdlYmZvbnQud29mZiBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvZm9udHMvZm9udGF3ZXNvbWUtd2ViZm9udC53b2ZmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjODlhZTAKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2ZvbnRzL2ZvbnRhd2Vzb21lLXdlYmZvbnQud29mZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2ZvbnRzL2dseXBoaWNvbnMtaGFsZmxpbmdzLXJlZ3VsYXIuZW90IGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9mb250cy9nbHlwaGljb25zLWhhbGZsaW5ncy1yZWd1bGFyLmVvdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjNiZDVkCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9mb250cy9nbHlwaGljb25zLWhhbGZsaW5ncy1yZWd1bGFyLmVvdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2ZvbnRzL2dseXBoaWNvbnMtaGFsZmxpbmdzLXJlZ3VsYXIuc3ZnIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9mb250cy9nbHlwaGljb25zLWhhbGZsaW5ncy1yZWd1bGFyLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDY5NDg4Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9mb250cy9nbHlwaGljb25zLWhhbGZsaW5ncy1yZWd1bGFyLnN2ZwpAQCAtMCwwICsxLDIyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PgorPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIiA+Cis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+Cis8bWV0YWRhdGE+PC9tZXRhZGF0YT4KKzxkZWZzPgorPGZvbnQgaWQ9ImdseXBoaWNvbnNfaGFsZmxpbmdzcmVndWxhciIgaG9yaXotYWR2LXg9IjEyMDAiID4KKzxmb250LWZhY2UgdW5pdHMtcGVyLWVtPSIxMjAwIiBhc2NlbnQ9Ijk2MCIgZGVzY2VudD0iLTI0MCIgLz4KKzxtaXNzaW5nLWdseXBoIGhvcml6LWFkdi14PSI1MDAiIC8+Cis8Z2x5cGggLz4KKzxnbHlwaCAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGQ7IiAvPgorPGdseXBoIHVuaWNvZGU9IiAiIC8+Cis8Z2x5cGggdW5pY29kZT0iKiIgZD0iTTEwMCA1MDB2MjAwaDI1OWwtMTgzIDE4M2wxNDEgMTQxbDE4MyAtMTgzdjI1OWgyMDB2LTI1OWwxODMgMTgzbDE0MSAtMTQxbC0xODMgLTE4M2gyNTl2LTIwMGgtMjU5bDE4MyAtMTgzbC0xNDEgLTE0MWwtMTgzIDE4M3YtMjU5aC0yMDB2MjU5bC0xODMgLTE4M2wtMTQxIDE0MWwxODMgMTgzaC0yNTl6IiAvPgorPGdseXBoIHVuaWNvZGU9IisiIGQ9Ik0wIDQwMHYzMDBoNDAwdjQwMGgzMDB2LTQwMGg0MDB2LTMwMGgtNDAwdi00MDBoLTMwMHY0MDBoLTQwMHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4YTA7IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMDA7IiBob3Jpei1hZHYteD0iNjUyIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIwMDE7IiBob3Jpei1hZHYteD0iMTMwNCIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDAyOyIgaG9yaXotYWR2LXg9IjY1MiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDAzOyIgaG9yaXotYWR2LXg9IjEzMDQiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAwNDsiIGhvcml6LWFkdi14PSI0MzQiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAwNTsiIGhvcml6LWFkdi14PSIzMjYiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAwNjsiIGhvcml6LWFkdi14PSIyMTciIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAwNzsiIGhvcml6LWFkdi14PSIyMTciIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAwODsiIGhvcml6LWFkdi14PSIxNjMiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAwOTsiIGhvcml6LWFkdi14PSIyNjAiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjAwYTsiIGhvcml6LWFkdi14PSI3MiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDJmOyIgaG9yaXotYWR2LXg9IjI2MCIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMDVmOyIgaG9yaXotYWR2LXg9IjMyNiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyMGFjOyIgZD0iTTEwMCA1MDBsMTAwIDEwMGgxMTNxMCA0NyA1IDEwMGgtMjE4bDEwMCAxMDBoMTM1cTM3IDE2NyAxMTIgMjU3cTExNyAxNDEgMjk3IDE0MXEyNDIgMCAzNTQgLTE4OXE2MCAtMTAzIDY2IC0yMDloLTE4MXEwIDU1IC0yNS41IDk5dC02My41IDY4dC03NSAzNi41dC02NyAxMi41cS0yNCAwIC01Mi41IC0xMHQtNjIuNSAtMzJ0LTY1LjUgLTY3dC01MC41IC0xMDdoMzc5bC0xMDAgLTEwMGgtMzAwcS02IC00NiAtNiAtMTAwaDQwNmwtMTAwIC0xMDAgaC0zMDBxOSAtNzQgMzMgLTEzMnQ1Mi41IC05MXQ2MiAtNTQuNXQ1OSAtMjl0NDYuNSAtNy41cTI5IDAgNjYgMTN0NzUgMzd0NjMuNSA2Ny41dDI1LjUgOTYuNWgxNzRxLTMxIC0xNzIgLTEyOCAtMjc4cS0xMDcgLTExNyAtMjc0IC0xMTdxLTIwNSAwIC0zMjQgMTU4cS0zNiA0NiAtNjkgMTMxLjV0LTQ1IDIwNS41aC0yMTd6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeDIyMTI7IiBkPSJNMjAwIDQwMGg5MDB2MzAwaC05MDB2LTMwMHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjYwMTsiIGQ9Ik0tMTQgNDk0cTAgLTgwIDU2LjUgLTEzN3QxMzUuNSAtNTdoNzUwcTEyMCAwIDIwNSA4NnQ4NSAyMDhxMCAxMjAgLTg1IDIwNi41dC0yMDUgODYuNXEtNDYgMCAtOTAgLTE0cS00NCA5NyAtMTM0LjUgMTU2LjV0LTIwMC41IDU5LjVxLTE1MiAwIC0yNjAgLTEwNy41dC0xMDggLTI2MC41cTAgLTI1IDIgLTM3cS02NiAtMTQgLTEwOC41IC02Ny41dC00Mi41IC0xMjIuNXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4MjcwOTsiIGQ9Ik0wIDEwMGw0MDAgNDAwbDIwMCAtMjAwbDIwMCAyMDBsNDAwIC00MDBoLTEyMDB6TTAgMzAwdjYwMGwzMDAgLTMwMHpNMCAxMTAwbDYwMCAtNjAzbDYwMCA2MDNoLTEyMDB6TTkwMCA2MDBsMzAwIDMwMHYtNjAweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3gyNzBmOyIgZD0iTS0xMyAtMTNsMzMzIDExMmwtMjIzIDIyM3pNMTg3IDQwM2wyMTQgLTIxNGw2MTQgNjE0bC0yMTQgMjE0ek04ODcgMTEwM2wyMTQgLTIxNGw5OSA5MnExMyAxMyAxMyAzMi41dC0xMyAzMy41bC0xNTMgMTUzcS0xNSAxMyAtMzMgMTN0LTMzIC0xM3oiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTAwMDsiIGhvcml6LWFkdi14PSI1MDAiIGQ9Ik0wIDB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwMDE7IiBkPSJNMCAxMjAwaDEyMDBsLTUwMCAtNTUwdi01NTBoMzAwdi0xMDBoLTgwMHYxMDBoMzAwdjU1MHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTAwMjsiIGQ9Ik0xNCA4NHExOCAtNTUgODYgLTc1LjV0MTQ3IDUuNXE2NSAyMSAxMDkgNjl0NDQgOTB2NjA2bDYwMCAxNTV2LTUyMXEtNjQgMTYgLTEzOCAtN3EtNzkgLTI2IC0xMjIuNSAtODN0LTI1LjUgLTExMXExNyAtNTUgODUuNSAtNzUuNXQxNDcuNSA0LjVxNzAgMjMgMTExLjUgNjMuNXQ0MS41IDk1LjV2ODgxcTAgMTAgLTcgMTUuNXQtMTcgMi41bC03NTIgLTE5M3EtMTAgLTMgLTE3IC0xMi41dC03IC0xOS41di02ODlxLTY0IDE3IC0xMzggLTcgcS03OSAtMjUgLTEyMi41IC04MnQtMjUuNSAtMTEyeiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMDAzOyIgZD0iTTIzIDY5M3EwIDIwMCAxNDIgMzQydDM0MiAxNDJ0MzQyIC0xNDJ0MTQyIC0zNDJxMCAtMTQyIC03OCAtMjYxbDMwMCAtMzAwcTcgLTggNyAtMTh0LTcgLTE4bC0xMDkgLTEwOXEtOCAtNyAtMTggLTd0LTE4IDdsLTMwMCAzMDBxLTExOSAtNzggLTI2MSAtNzhxLTIwMCAwIC0zNDIgMTQydC0xNDIgMzQyek0xNzYgNjkzcTAgLTEzNiA5NyAtMjMzdDIzNCAtOTd0MjMzLjUgOTYuNXQ5Ni41IDIzMy41dC05Ni41IDIzMy41dC0yMzMuNSA5Ni41IHQtMjM0IC05N3QtOTcgLTIzM3oiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTAwNTsiIGQ9Ik0xMDAgNzg0cTAgNjQgMjggMTIzdDczIDEwMC41dDEwNC41IDY0dDExOSAyMC41dDEyMCAtMzguNXQxMDQuNSAtMTA0LjVxNDggNjkgMTA5LjUgMTA1dDEyMS41IDM4dDExOC41IC0yMC41dDEwMi41IC02NHQ3MSAtMTAwLjV0MjcgLTEyM3EwIC01NyAtMzMuNSAtMTE3LjV0LTk0IC0xMjQuNXQtMTI2LjUgLTEyNy41dC0xNTAgLTE1Mi41dC0xNDYgLTE3NHEtNjIgODUgLTE0NS41IDE3NHQtMTQ5LjUgMTUyLjV0LTEyNi41IDEyNy41IHQtOTQgMTI0LjV0LTMzLjUgMTE3LjV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwMDY7IiBkPSJNLTcyIDgwMGg0NzlsMTQ2IDQwMGgybDE0NiAtNDAwaDQ3MmwtMzgyIC0yNzhsMTQ1IC00NDlsLTM4NCAyNzVsLTM4MiAtMjc1bDE0NiA0NDd6TTE2OCA3MWwyIDF6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwMDc7IiBkPSJNLTcyIDgwMGg0NzlsMTQ2IDQwMGgybDE0NiAtNDAwaDQ3MmwtMzgyIC0yNzhsMTQ1IC00NDlsLTM4NCAyNzVsLTM4MiAtMjc1bDE0NiA0NDd6TTE2OCA3MWwyIDF6TTIzNyA3MDBsMTk2IC0xNDJsLTczIC0yMjZsMTkyIDE0MGwxOTUgLTE0MWwtNzQgMjI5bDE5MyAxNDBoLTIzNWwtNzcgMjExbC03OCAtMjExaC0yMzl6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwMDg7IiBkPSJNMCAwdjE0M2w0MDAgMjU3djEwMHEtMzcgMCAtNjguNSA3NC41dC0zMS41IDEyNS41djIwMHEwIDEyNCA4OCAyMTJ0MjEyIDg4dDIxMiAtODh0ODggLTIxMnYtMjAwcTAgLTUxIC0zMS41IC0xMjUuNXQtNjguNSAtNzQuNXYtMTAwbDQwMCAtMjU3di0xNDNoLTEyMDB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwMDk7IiBkPSJNMCAwdjExMDBoMTIwMHYtMTEwMGgtMTIwMHpNMTAwIDEwMGgxMDB2MTAwaC0xMDB2LTEwMHpNMTAwIDMwMGgxMDB2MTAwaC0xMDB2LTEwMHpNMTAwIDUwMGgxMDB2MTAwaC0xMDB2LTEwMHpNMTAwIDcwMGgxMDB2MTAwaC0xMDB2LTEwMHpNMTAwIDkwMGgxMDB2MTAwaC0xMDB2LTEwMHpNMzAwIDEwMGg2MDB2NDAwaC02MDB2LTQwMHpNMzAwIDYwMGg2MDB2NDAwaC02MDB2LTQwMHpNMTAwMCAxMDBoMTAwdjEwMGgtMTAwdi0xMDB6IE0xMDAwIDMwMGgxMDB2MTAwaC0xMDB2LTEwMHpNMTAwMCA1MDBoMTAwdjEwMGgtMTAwdi0xMDB6TTEwMDAgNzAwaDEwMHYxMDBoLTEwMHYtMTAwek0xMDAwIDkwMGgxMDB2MTAwaC0xMDB2LTEwMHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTAxMDsiIGQ9Ik0wIDUwdjQwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjVoNDAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di00MDBxMCAtMjEgLTE0LjUgLTM1LjV0LTM1LjUgLTE0LjVoLTQwMHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV6TTAgNjUwdjQwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjVoNDAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di00MDBxMCAtMjEgLTE0LjUgLTM1LjV0LTM1LjUgLTE0LjVoLTQwMCBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41ek02MDAgNTB2NDAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNWg0MDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTQwMHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtNDAwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXpNNjAwIDY1MHY0MDBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41aDQwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtNDAwIHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtNDAwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTAxMTsiIGQ9Ik0wIDUwdjIwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjVoMjAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di0yMDBxMCAtMjEgLTE0LjUgLTM1LjV0LTM1LjUgLTE0LjVoLTIwMHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV6TTAgNDUwdjIwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjVoMjAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di0yMDBxMCAtMjEgLTE0LjUgLTM1LjV0LTM1LjUgLTE0LjVoLTIwMCBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41ek0wIDg1MHYyMDBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41aDIwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtMjAwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC0yMDBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41ek00MDAgNTB2MjAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNWgyMDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTIwMHEwIC0yMSAtMTQuNSAtMzUuNSB0LTM1LjUgLTE0LjVoLTIwMHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV6TTQwMCA0NTB2MjAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNWgyMDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTIwMHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtMjAwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXpNNDAwIDg1MHYyMDBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41aDIwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNSB2LTIwMHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtMjAwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXpNODAwIDUwdjIwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjVoMjAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di0yMDBxMCAtMjEgLTE0LjUgLTM1LjV0LTM1LjUgLTE0LjVoLTIwMHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV6TTgwMCA0NTB2MjAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNWgyMDAgcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di0yMDBxMCAtMjEgLTE0LjUgLTM1LjV0LTM1LjUgLTE0LjVoLTIwMHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV6TTgwMCA4NTB2MjAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNWgyMDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTIwMHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtMjAwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTAxMjsiIGQ9Ik0wIDUwdjIwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjVoMjAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di0yMDBxMCAtMjEgLTE0LjUgLTM1LjV0LTM1LjUgLTE0LjVoLTIwMHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV6TTAgNDUwcTAgLTIxIDE0LjUgLTM1LjV0MzUuNSAtMTQuNWgyMDBxMjEgMCAzNS41IDE0LjV0MTQuNSAzNS41djIwMHEwIDIxIC0xNC41IDM1LjV0LTM1LjUgMTQuNWgtMjAwcS0yMSAwIC0zNS41IC0xNC41IHQtMTQuNSAtMzUuNXYtMjAwek0wIDg1MHYyMDBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41aDIwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtMjAwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC0yMDBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41ek00MDAgNTB2MjAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNWg3MDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTIwMHEwIC0yMSAtMTQuNSAtMzUuNSB0LTM1LjUgLTE0LjVoLTcwMHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV6TTQwMCA0NTB2MjAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNWg3MDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTIwMHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtNzAwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXpNNDAwIDg1MHYyMDBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41aDcwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNSB2LTIwMHEwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtNzAwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTAxMzsiIGQ9Ik0yOSA0NTRsNDE5IC00MjBsODE4IDgyMGwtMjEyIDIxMmwtNjA3IC02MDdsLTIwNiAyMDd6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwMTQ7IiBkPSJNMTA2IDMxOGwyODIgMjgybC0yODIgMjgybDIxMiAyMTJsMjgyIC0yODJsMjgyIDI4MmwyMTIgLTIxMmwtMjgyIC0yODJsMjgyIC0yODJsLTIxMiAtMjEybC0yODIgMjgybC0yODIgLTI4MnoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTAxNTsiIGQ9Ik0yMyA2OTNxMCAyMDAgMTQyIDM0MnQzNDIgMTQydDM0MiAtMTQydDE0MiAtMzQycTAgLTE0MiAtNzggLTI2MWwzMDAgLTMwMHE3IC04IDcgLTE4dC03IC0xOGwtMTA5IC0xMDlxLTggLTcgLTE4IC03dC0xOCA3bC0zMDAgMzAwcS0xMTkgLTc4IC0yNjEgLTc4cS0yMDAgMCAtMzQyIDE0MnQtMTQyIDM0MnpNMTc2IDY5M3EwIC0xMzYgOTcgLTIzM3QyMzQgLTk3dDIzMy41IDk2LjV0OTYuNSAyMzMuNXQtOTYuNSAyMzMuNXQtMjMzLjUgOTYuNSB0LTIzNCAtOTd0LTk3IC0yMzN6TTMwMCA2MDB2MjAwaDEwMHYxMDBoMjAwdi0xMDBoMTAwdi0yMDBoLTEwMHYtMTAwaC0yMDB2MTAwaC0xMDB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwMTY7IiBkPSJNMjMgNjk0cTAgMjAwIDE0MiAzNDJ0MzQyIDE0MnQzNDIgLTE0MnQxNDIgLTM0MnEwIC0xNDEgLTc4IC0yNjJsMzAwIC0yOTlxNyAtNyA3IC0xOHQtNyAtMThsLTEwOSAtMTA5cS04IC04IC0xOCAtOHQtMTggOGwtMzAwIDI5OXEtMTIwIC03NyAtMjYxIC03N3EtMjAwIDAgLTM0MiAxNDJ0LTE0MiAzNDJ6TTE3NiA2OTRxMCAtMTM2IDk3IC0yMzN0MjM0IC05N3QyMzMuNSA5N3Q5Ni41IDIzM3QtOTYuNSAyMzN0LTIzMy41IDk3dC0yMzQgLTk3IHQtOTcgLTIzM3pNMzAwIDYwMWg0MDB2MjAwaC00MDB2LTIwMHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTAxNzsiIGQ9Ik0yMyA2MDBxMCAxODMgMTA1IDMzMXQyNzIgMjEwdi0xNjZxLTEwMyAtNTUgLTE2NSAtMTU1dC02MiAtMjIwcTAgLTE3NyAxMjUgLTMwMnQzMDIgLTEyNXQzMDIgMTI1dDEyNSAzMDJxMCAxMjAgLTYyIDIyMHQtMTY1IDE1NXYxNjZxMTY3IC02MiAyNzIgLTIxMHQxMDUgLTMzMXEwIC0xMTggLTQ1LjUgLTIyNC41dC0xMjMgLTE4NHQtMTg0IC0xMjN0LTIyNC41IC00NS41dC0yMjQuNSA0NS41dC0xODQgMTIzdC0xMjMgMTg0dC00NS41IDIyNC41IHpNNTAwIDc1MHEwIC0yMSAxNC41IC0zNS41dDM1LjUgLTE0LjVoMTAwcTIxIDAgMzUuNSAxNC41dDE0LjUgMzUuNXY0MDBxMCAyMSAtMTQuNSAzNS41dC0zNS41IDE0LjVoLTEwMHEtMjEgMCAtMzUuNSAtMTQuNXQtMTQuNSAtMzUuNXYtNDAweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMDE4OyIgZD0iTTEwMCAxaDIwMHYzMDBoLTIwMHYtMzAwek00MDAgMXY1MDBoMjAwdi01MDBoLTIwMHpNNzAwIDF2ODAwaDIwMHYtODAwaC0yMDB6TTEwMDAgMXYxMjAwaDIwMHYtMTIwMGgtMjAweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMDE5OyIgZD0iTTI2IDYwMXEwIC0zMyA2IC03NGwxNTEgLTM4bDIgLTZxMTQgLTQ5IDM4IC05M2wzIC01bC04MCAtMTM0cTQ1IC01OSAxMDUgLTEwNWwxMzMgODFsNSAtM3E0NSAtMjYgOTQgLTM5bDUgLTJsMzggLTE1MXE0MCAtNSA3NCAtNXEyNyAwIDc0IDVsMzggMTUxbDYgMnE0NiAxMyA5MyAzOWw1IDNsMTM0IC04MXE1NiA0NCAxMDQgMTA1bC04MCAxMzRsMyA1cTI0IDQ0IDM5IDkzbDEgNmwxNTIgMzhxNSA0MCA1IDc0cTAgMjggLTUgNzNsLTE1MiAzOCBsLTEgNnEtMTYgNTEgLTM5IDkzbC0zIDVsODAgMTM0cS00NCA1OCAtMTA0IDEwNWwtMTM0IC04MWwtNSAzcS00NSAyNSAtOTMgMzlsLTYgMWwtMzggMTUycS00MCA1IC03NCA1cS0yNyAwIC03NCAtNWwtMzggLTE1MmwtNSAtMXEtNTAgLTE0IC05NCAtMzlsLTUgLTNsLTEzMyA4MXEtNTkgLTQ3IC0xMDUgLTEwNWw4MCAtMTM0bC0zIC01cS0yNSAtNDcgLTM4IC05M2wtMiAtNmwtMTUxIC0zOHEtNiAtNDggLTYgLTczek0zODUgNjAxIHEwIDg4IDYzIDE1MXQxNTIgNjN0MTUyIC02M3Q2MyAtMTUxcTAgLTg5IC02MyAtMTUydC0xNTIgLTYzdC0xNTIgNjN0LTYzIDE1MnoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTAyMDsiIGQ9Ik0xMDAgMTAyNXY1MHEwIDEwIDcuNSAxNy41dDE3LjUgNy41aDI3NXYxMDBxMCA0MSAyOS41IDcwLjV0NzAuNSAyOS41aDMwMHE0MSAwIDcwLjUgLTI5LjV0MjkuNSAtNzAuNXYtMTAwaDI3NXExMCAwIDE3LjUgLTcuNXQ3LjUgLTE3LjV2LTUwcTAgLTExIC03IC0xOHQtMTggLTdoLTEwNTBxLTExIDAgLTE4IDd0LTcgMTh6TTIwMCAxMDB2ODAwaDkwMHYtODAwcTAgLTQxIC0yOS41IC03MXQtNzAuNSAtMzBoLTcwMHEtNDEgMCAtNzAuNSAzMCB0LTI5LjUgNzF6TTMwMCAxMDBoMTAwdjcwMGgtMTAwdi03MDB6TTUwMCAxMDBoMTAwdjcwMGgtMTAwdi03MDB6TTUwMCAxMTAwaDMwMHYxMDBoLTMwMHYtMTAwek03MDAgMTAwaDEwMHY3MDBoLTEwMHYtNzAwek05MDAgMTAwaDEwMHY3MDBoLTEwMHYtNzAweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMDIxOyIgZD0iTTEgNjAxbDY1NiA2NDRsNjQ0IC02NDRoLTIwMHYtNjAwaC0zMDB2NDAwaC0zMDB2LTQwMGgtMzAwdjYwMGgtMjAweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMDIyOyIgZD0iTTEwMCAyNXYxMTUwcTAgMTEgNyAxOHQxOCA3aDQ3NXYtNTAwaDQwMHYtNjc1cTAgLTExIC03IC0xOHQtMTggLTdoLTg1MHEtMTEgMCAtMTggN3QtNyAxOHpNNzAwIDgwMHYzMDBsMzAwIC0zMDBoLTMwMHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTAyMzsiIGQ9Ik00IDYwMHEwIDE2MiA4MCAyOTl0MjE3IDIxN3QyOTkgODB0Mjk5IC04MHQyMTcgLTIxN3Q4MCAtMjk5dC04MCAtMjk5dC0yMTcgLTIxN3QtMjk5IC04MHQtMjk5IDgwdC0yMTcgMjE3dC04MCAyOTl6TTE4NiA2MDBxMCAtMTcxIDEyMS41IC0yOTIuNXQyOTIuNSAtMTIxLjV0MjkyLjUgMTIxLjV0MTIxLjUgMjkyLjV0LTEyMS41IDI5Mi41dC0yOTIuNSAxMjEuNXQtMjkyLjUgLTEyMS41dC0xMjEuNSAtMjkyLjV6TTUwMCA1MDB2NDAwaDEwMCB2LTMwMGgyMDB2LTEwMGgtMzAweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMDI0OyIgZD0iTS0xMDAgMGw0MzEgMTIwMGgyMDlsLTIxIC0zMDBoMTYybC0yMCAzMDBoMjA4bDQzMSAtMTIwMGgtNTM4bC00MSA0MDBoLTI0MmwtNDAgLTQwMGgtNTM5ek00ODggNTAwaDIyNGwtMjcgMzAwaC0xNzB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwMjU7IiBkPSJNMCAwdjQwMGg0OTBsLTI5MCAzMDBoMjAwdjUwMGgzMDB2LTUwMGgyMDBsLTI5MCAtMzAwaDQ5MHYtNDAwaC0xMTAwek04MTMgMjAwaDE3NXYxMDBoLTE3NXYtMTAweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMDI2OyIgZD0iTTEgNjAwcTAgMTIyIDQ3LjUgMjMzdDEyNy41IDE5MXQxOTEgMTI3LjV0MjMzIDQ3LjV0MjMzIC00Ny41dDE5MSAtMTI3LjV0MTI3LjUgLTE5MXQ0Ny41IC0yMzN0LTQ3LjUgLTIzM3QtMTI3LjUgLTE5MXQtMTkxIC0xMjcuNXQtMjMzIC00Ny41dC0yMzMgNDcuNXQtMTkxIDEyNy41dC0xMjcuNSAxOTF0LTQ3LjUgMjMzek0xODggNjAwcTAgLTE3MCAxMjEgLTI5MXQyOTEgLTEyMXQyOTEgMTIxdDEyMSAyOTF0LTEyMSAyOTF0LTI5MSAxMjEgdC0yOTEgLTEyMXQtMTIxIC0yOTF6TTM1MCA2MDBoMTUwdjMwMGgyMDB2LTMwMGgxNTBsLTI1MCAtMzAweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMDI3OyIgZD0iTTQgNjAwcTAgMTYyIDgwIDI5OXQyMTcgMjE3dDI5OSA4MHQyOTkgLTgwdDIxNyAtMjE3dDgwIC0yOTl0LTgwIC0yOTl0LTIxNyAtMjE3dC0yOTkgLTgwdC0yOTkgODB0LTIxNyAyMTd0LTgwIDI5OXpNMTg2IDYwMHEwIC0xNzEgMTIxLjUgLTI5Mi41dDI5Mi41IC0xMjEuNXQyOTIuNSAxMjEuNXQxMjEuNSAyOTIuNXQtMTIxLjUgMjkyLjV0LTI5Mi41IDEyMS41dC0yOTIuNSAtMTIxLjV0LTEyMS41IC0yOTIuNXpNMzUwIDYwMGwyNTAgMzAwIGwyNTAgLTMwMGgtMTUwdi0zMDBoLTIwMHYzMDBoLTE1MHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTAyODsiIGQ9Ik0wIDI1djQ3NWwyMDAgNzAwaDgwMHExOTkgLTcwMCAyMDAgLTcwMHYtNDc1cTAgLTExIC03IC0xOHQtMTggLTdoLTExNTBxLTExIDAgLTE4IDd0LTcgMTh6TTIwMCA1MDBoMjAwbDUwIC0yMDBoMzAwbDUwIDIwMGgyMDBsLTk3IDUwMGgtNjA2eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMDI5OyIgZD0iTTQgNjAwcTAgMTYyIDgwIDI5OXQyMTcgMjE3dDI5OSA4MHQyOTkgLTgwdDIxNyAtMjE3dDgwIC0yOTl0LTgwIC0yOTl0LTIxNyAtMjE3dC0yOTkgLTgwdC0yOTkgODB0LTIxNyAyMTd0LTgwIDI5OXpNMTg2IDYwMHEwIC0xNzIgMTIxLjUgLTI5M3QyOTIuNSAtMTIxdDI5Mi41IDEyMXQxMjEuNSAyOTNxMCAxNzEgLTEyMS41IDI5Mi41dC0yOTIuNSAxMjEuNXQtMjkyLjUgLTEyMS41dC0xMjEuNSAtMjkyLjV6TTUwMCAzOTd2NDAxIGwyOTcgLTIwMHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTAzMDsiIGQ9Ik0yMyA2MDBxMCAtMTE4IDQ1LjUgLTIyNC41dDEyMyAtMTg0dDE4NCAtMTIzdDIyNC41IC00NS41dDIyNC41IDQ1LjV0MTg0IDEyM3QxMjMgMTg0dDQ1LjUgMjI0LjVoLTE1MHEwIC0xNzcgLTEyNSAtMzAydC0zMDIgLTEyNXQtMzAyIDEyNXQtMTI1IDMwMnQxMjUgMzAydDMwMiAxMjVxMTM2IDAgMjQ2IC04MWwtMTQ2IC0xNDZoNDAwdjQwMGwtMTQ1IC0xNDVxLTE1NyAxMjIgLTM1NSAxMjJxLTExOCAwIC0yMjQuNSAtNDUuNXQtMTg0IC0xMjMgdC0xMjMgLTE4NHQtNDUuNSAtMjI0LjV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwMzE7IiBkPSJNMjMgNjAwcTAgMTE4IDQ1LjUgMjI0LjV0MTIzIDE4NHQxODQgMTIzdDIyNC41IDQ1LjVxMTk4IDAgMzU1IC0xMjJsMTQ1IDE0NXYtNDAwaC00MDBsMTQ3IDE0N3EtMTEyIDgwIC0yNDcgODBxLTE3NyAwIC0zMDIgLTEyNXQtMTI1IC0zMDJoLTE1MHpNMTAwIDB2NDAwaDQwMGwtMTQ3IC0xNDdxMTEyIC04MCAyNDcgLTgwcTE3NyAwIDMwMiAxMjV0MTI1IDMwMmgxNTBxMCAtMTE4IC00NS41IC0yMjQuNXQtMTIzIC0xODR0LTE4NCAtMTIzIHQtMjI0LjUgLTQ1LjVxLTE5OCAwIC0zNTUgMTIyeiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMDMyOyIgZD0iTTEwMCAwaDExMDB2MTIwMGgtMTEwMHYtMTIwMHpNMjAwIDEwMHY5MDBoOTAwdi05MDBoLTkwMHpNMzAwIDIwMHYxMDBoMTAwdi0xMDBoLTEwMHpNMzAwIDQwMHYxMDBoMTAwdi0xMDBoLTEwMHpNMzAwIDYwMHYxMDBoMTAwdi0xMDBoLTEwMHpNMzAwIDgwMHYxMDBoMTAwdi0xMDBoLTEwMHpNNTAwIDIwMGg1MDB2MTAwaC01MDB2LTEwMHpNNTAwIDQwMHYxMDBoNTAwdi0xMDBoLTUwMHpNNTAwIDYwMHYxMDBoNTAwdi0xMDBoLTUwMHogTTUwMCA4MDB2MTAwaDUwMHYtMTAwaC01MDB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwMzM7IiBkPSJNMCAxMDB2NjAwcTAgNDEgMjkuNSA3MC41dDcwLjUgMjkuNWgxMDB2MjAwcTAgODIgNTkgMTQxdDE0MSA1OWgzMDBxODIgMCAxNDEgLTU5dDU5IC0xNDF2LTIwMGgxMDBxNDEgMCA3MC41IC0yOS41dDI5LjUgLTcwLjV2LTYwMHEwIC00MSAtMjkuNSAtNzAuNXQtNzAuNSAtMjkuNWgtOTAwcS00MSAwIC03MC41IDI5LjV0LTI5LjUgNzAuNXpNNDAwIDgwMGgzMDB2MTUwcTAgMjEgLTE0LjUgMzUuNXQtMzUuNSAxNC41aC0yMDAgcS0yMSAwIC0zNS41IC0xNC41dC0xNC41IC0zNS41di0xNTB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwMzQ7IiBkPSJNMTAwIDB2MTEwMGgxMDB2LTExMDBoLTEwMHpNMzAwIDQwMHE2MCA2MCAxMjcuNSA4NHQxMjcuNSAxNy41dDEyMiAtMjN0MTE5IC0zMHQxMTAgLTExdDEwMyA0MnQ5MSAxMjAuNXY1MDBxLTQwIC04MSAtMTAxLjUgLTExNS41dC0xMjcuNSAtMjkuNXQtMTM4IDI1dC0xMzkuNSA0MHQtMTI1LjUgMjV0LTEwMyAtMjkuNXQtNjUgLTExNS41di01MDB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwMzU7IiBkPSJNMCAyNzVxMCAtMTEgNyAtMTh0MTggLTdoNTBxMTEgMCAxOCA3dDcgMTh2MzAwcTAgMTI3IDcwLjUgMjMxLjV0MTg0LjUgMTYxLjV0MjQ1IDU3dDI0NSAtNTd0MTg0LjUgLTE2MS41dDcwLjUgLTIzMS41di0zMDBxMCAtMTEgNyAtMTh0MTggLTdoNTBxMTEgMCAxOCA3dDcgMTh2MzAwcTAgMTE2IC00OS41IDIyN3QtMTMxIDE5Mi41dC0xOTIuNSAxMzF0LTIyNyA0OS41dC0yMjcgLTQ5LjV0LTE5Mi41IC0xMzF0LTEzMSAtMTkyLjUgdC00OS41IC0yMjd2LTMwMHpNMjAwIDIwdjQ2MHEwIDggNiAxNHQxNCA2aDE2MHE4IDAgMTQgLTZ0NiAtMTR2LTQ2MHEwIC04IC02IC0xNHQtMTQgLTZoLTE2MHEtOCAwIC0xNCA2dC02IDE0ek04MDAgMjB2NDYwcTAgOCA2IDE0dDE0IDZoMTYwcTggMCAxNCAtNnQ2IC0xNHYtNDYwcTAgLTggLTYgLTE0dC0xNCAtNmgtMTYwcS04IDAgLTE0IDZ0LTYgMTR6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwMzY7IiBkPSJNMCA0MDBoMzAwbDMwMCAtMjAwdjgwMGwtMzAwIC0yMDBoLTMwMHYtNDAwek02ODggNDU5bDE0MSAxNDFsLTE0MSAxNDFsNzEgNzFsMTQxIC0xNDFsMTQxIDE0MWw3MSAtNzFsLTE0MSAtMTQxbDE0MSAtMTQxbC03MSAtNzFsLTE0MSAxNDFsLTE0MSAtMTQxeiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMDM3OyIgZD0iTTAgNDAwaDMwMGwzMDAgLTIwMHY4MDBsLTMwMCAtMjAwaC0zMDB2LTQwMHpNNzAwIDg1N2w2OSA1M3ExMTEgLTEzNSAxMTEgLTMxMHEwIC0xNjkgLTEwNiAtMzAybC02NyA1NHE4NiAxMTAgODYgMjQ4cTAgMTQ2IC05MyAyNTd6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwMzg7IiBkPSJNMCA0MDF2NDAwaDMwMGwzMDAgMjAwdi04MDBsLTMwMCAyMDBoLTMwMHpNNzAyIDg1OGw2OSA1M3ExMTEgLTEzNSAxMTEgLTMxMHEwIC0xNzAgLTEwNiAtMzAzbC02NyA1NXE4NiAxMTAgODYgMjQ4cTAgMTQ1IC05MyAyNTd6TTg4OSA5NTFsNyAtOHExMjMgLTE1MSAxMjMgLTM0NHEwIC0xODkgLTExOSAtMzM5bC03IC04bDgxIC02Nmw2IDhxMTQyIDE3OCAxNDIgNDA1cTAgMjMwIC0xNDQgNDA4bC02IDh6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwMzk7IiBkPSJNMCAwaDUwMHY1MDBoLTIwMHYxMDBoLTEwMHYtMTAwaC0yMDB2LTUwMHpNMCA2MDBoMTAwdjEwMGg0MDB2MTAwaDEwMHYxMDBoLTEwMHYzMDBoLTUwMHYtNjAwek0xMDAgMTAwdjMwMGgzMDB2LTMwMGgtMzAwek0xMDAgODAwdjMwMGgzMDB2LTMwMGgtMzAwek0yMDAgMjAwdjEwMGgxMDB2LTEwMGgtMTAwek0yMDAgOTAwaDEwMHYxMDBoLTEwMHYtMTAwek01MDAgNTAwdjEwMGgzMDB2LTMwMGgyMDB2LTEwMGgtMTAwdi0xMDBoLTIwMHYxMDAgaC0xMDB2MTAwaDEwMHYyMDBoLTIwMHpNNjAwIDB2MTAwaDEwMHYtMTAwaC0xMDB6TTYwMCAxMDAwaDEwMHYtMzAwaDIwMHYtMzAwaDMwMHYyMDBoLTIwMHYxMDBoMjAwdjUwMGgtNjAwdi0yMDB6TTgwMCA4MDB2MzAwaDMwMHYtMzAwaC0zMDB6TTkwMCAwdjEwMGgzMDB2LTEwMGgtMzAwek05MDAgOTAwdjEwMGgxMDB2LTEwMGgtMTAwek0xMTAwIDIwMHYxMDBoMTAwdi0xMDBoLTEwMHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTA0MDsiIGQ9Ik0wIDIwMGgxMDB2MTAwMGgtMTAwdi0xMDAwek0xMDAgMHYxMDBoMzAwdi0xMDBoLTMwMHpNMjAwIDIwMHYxMDAwaDEwMHYtMTAwMGgtMTAwek01MDAgMHY5MWgxMDB2LTkxaC0xMDB6TTUwMCAyMDB2MTAwMGgyMDB2LTEwMDBoLTIwMHpNNzAwIDB2OTFoMTAwdi05MWgtMTAwek04MDAgMjAwdjEwMDBoMTAwdi0xMDAwaC0xMDB6TTkwMCAwdjkxaDIwMHYtOTFoLTIwMHpNMTAwMCAyMDB2MTAwMGgyMDB2LTEwMDBoLTIwMHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTA0MTsiIGQ9Ik0xIDcwMHY0NzVxMCAxMCA3LjUgMTcuNXQxNy41IDcuNWg0NzRsNzAwIC03MDBsLTUwMCAtNTAwek0xNDggOTUzcTAgLTQyIDI5IC03MXEzMCAtMzAgNzEuNSAtMzB0NzEuNSAzMHEyOSAyOSAyOSA3MXQtMjkgNzFxLTMwIDMwIC03MS41IDMwdC03MS41IC0zMHEtMjkgLTI5IC0yOSAtNzF6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwNDI7IiBkPSJNMiA3MDB2NDc1cTAgMTEgNyAxOHQxOCA3aDQ3NGw3MDAgLTcwMGwtNTAwIC01MDB6TTE0OCA5NTNxMCAtNDIgMzAgLTcxcTI5IC0zMCA3MSAtMzB0NzEgMzBxMzAgMjkgMzAgNzF0LTMwIDcxcS0yOSAzMCAtNzEgMzB0LTcxIC0zMHEtMzAgLTI5IC0zMCAtNzF6TTcwMSAxMjAwaDEwMGw3MDAgLTcwMGwtNTAwIC01MDBsLTUwIDUwbDQ1MCA0NTB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwNDM7IiBkPSJNMTAwIDB2MTAyNWwxNzUgMTc1aDkyNXYtMTAwMGwtMTAwIC0xMDB2MTAwMGgtNzUwbC0xMDAgLTEwMGg3NTB2LTEwMDBoLTkwMHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTA0NDsiIGQ9Ik0yMDAgMGw0NTAgNDQ0bDQ1MCAtNDQzdjExNTBxMCAyMCAtMTQuNSAzNXQtMzUuNSAxNWgtODAwcS0yMSAwIC0zNS41IC0xNXQtMTQuNSAtMzV2LTExNTF6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwNDU7IiBkPSJNMCAxMDB2NzAwaDIwMGwxMDAgLTIwMGg2MDBsMTAwIDIwMGgyMDB2LTcwMGgtMjAwdjIwMGgtODAwdi0yMDBoLTIwMHpNMjUzIDgyOWw0MCAtMTI0aDU5Mmw2MiAxMjRsLTk0IDM0NnEtMiAxMSAtMTAgMTh0LTE4IDdoLTQ1MHEtMTAgMCAtMTggLTd0LTEwIC0xOHpNMjgxIDI0bDM4IDE1MnEyIDEwIDExLjUgMTd0MTkuNSA3aDUwMHExMCAwIDE5LjUgLTd0MTEuNSAtMTdsMzggLTE1MnEyIC0xMCAtMy41IC0xN3QtMTUuNSAtN2gtNjAwIHEtMTAgMCAtMTUuNSA3dC0zLjUgMTd6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwNDY7IiBkPSJNMCAyMDBxMCAtNDEgMjkuNSAtNzAuNXQ3MC41IC0yOS41aDEwMDBxNDEgMCA3MC41IDI5LjV0MjkuNSA3MC41djYwMHEwIDQxIC0yOS41IDcwLjV0LTcwLjUgMjkuNWgtMTUwcS00IDggLTExLjUgMjEuNXQtMzMgNDh0LTUzIDYxdC02OSA0OHQtODMuNSAyMS41aC0yMDBxLTQxIDAgLTgyIC0yMC41dC03MCAtNTB0LTUyIC01OXQtMzQgLTUwLjVsLTEyIC0yMGgtMTUwcS00MSAwIC03MC41IC0yOS41dC0yOS41IC03MC41di02MDB6IE0zNTYgNTAwcTAgMTAwIDcyIDE3MnQxNzIgNzJ0MTcyIC03MnQ3MiAtMTcydC03MiAtMTcydC0xNzIgLTcydC0xNzIgNzJ0LTcyIDE3MnpNNDk0IDUwMHEwIC00NCAzMSAtNzV0NzUgLTMxdDc1IDMxdDMxIDc1dC0zMSA3NXQtNzUgMzF0LTc1IC0zMXQtMzEgLTc1ek05MDAgNzAwdjEwMGgxMDB2LTEwMGgtMTAweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMDQ3OyIgZD0iTTUzIDBoMzY1djY2cS00MSAwIC03MiAxMXQtNDkgMzh0MSA3MWw5MiAyMzRoMzkxbDgyIC0yMjJxMTYgLTQ1IC01LjUgLTg4LjV0LTc0LjUgLTQzLjV2LTY2aDQxN3Y2NnEtMzQgMSAtNzQgNDNxLTE4IDE5IC0zMyA0MnQtMjEgMzdsLTYgMTNsLTM4NSA5OThoLTkzbC0zOTkgLTEwMDZxLTI0IC00OCAtNTIgLTc1cS0xMiAtMTIgLTMzIC0yNXQtMzYgLTIwbC0xNSAtN3YtNjZ6TTQxNiA1MjFsMTc4IDQ1N2w0NiAtMTQwbDExNiAtMzE3aC0zNDAgeiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMDQ4OyIgZD0iTTEwMCAwdjg5cTQxIDcgNzAuNSAzMi41dDI5LjUgNjUuNXY4MjdxMCAyOCAtMSAzOS41dC01LjUgMjZ0LTE1LjUgMjF0LTI5IDE0dC00OSAxNC41djcwaDQ3MXExMjAgMCAyMTMgLTg4dDkzIC0yMjhxMCAtNTUgLTExLjUgLTEwMS41dC0yOCAtNzR0LTMzLjUgLTQ3LjV0LTI4IC0yOGwtMTIgLTdxOCAtMyAyMS41IC05dDQ4IC0zMS41dDYwLjUgLTU4dDQ3LjUgLTkxLjV0MjEuNSAtMTI5cTAgLTg0IC01OSAtMTU2LjV0LTE0MiAtMTExIHQtMTYyIC0zOC41aC01MDB6TTQwMCAyMDBoMTYxcTg5IDAgMTUzIDQ4LjV0NjQgMTMyLjVxMCA5MCAtNjIuNSAxNTQuNXQtMTU2LjUgNjQuNWgtMTU5di00MDB6TTQwMCA3MDBoMTM5cTc2IDAgMTMwIDYxLjV0NTQgMTM4LjVxMCA4MiAtODQgMTMwLjV0LTIzOSA0OC41di0zNzl6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwNDk7IiBkPSJNMjAwIDB2NTdxNzcgNyAxMzQuNSA0MC41dDY1LjUgODAuNWwxNzMgODQ5cTEwIDU2IC0xMCA3NHQtOTEgMzdxLTYgMSAtMTAuNSAyLjV0LTkuNSAyLjV2NTdoNDI1bDIgLTU3cS0zMyAtOCAtNjIgLTI1LjV0LTQ2IC0zN3QtMjkuNSAtMzh0LTE3LjUgLTMwLjVsLTUgLTEybC0xMjggLTgyNXEtMTAgLTUyIDE0IC04MnQ5NSAtMzZ2LTU3aC01MDB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwNTA7IiBkPSJNLTc1IDIwMGg3NXY4MDBoLTc1bDEyNSAxNjdsMTI1IC0xNjdoLTc1di04MDBoNzVsLTEyNSAtMTY3ek0zMDAgOTAwdjMwMGgxNTBoNzAwaDE1MHYtMzAwaC01MHEwIDI5IC04IDQ4LjV0LTE4LjUgMzB0LTMzLjUgMTV0LTM5LjUgNS41dC01MC41IDFoLTIwMHYtODUwbDEwMCAtNTB2LTEwMGgtNDAwdjEwMGwxMDAgNTB2ODUwaC0yMDBxLTM0IDAgLTUwLjUgLTF0LTQwIC01LjV0LTMzLjUgLTE1dC0xOC41IC0zMHQtOC41IC00OC41aC00OXogIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwNTE7IiBkPSJNMzMgNTFsMTY3IDEyNXYtNzVoODAwdjc1bDE2NyAtMTI1bC0xNjcgLTEyNXY3NWgtODAwdi03NXpNMTAwIDkwMXYzMDBoMTUwaDcwMGgxNTB2LTMwMGgtNTBxMCAyOSAtOCA0OC41dC0xOCAzMHQtMzMuNSAxNXQtNDAgNS41dC01MC41IDFoLTIwMHYtNjUwbDEwMCAtNTB2LTEwMGgtNDAwdjEwMGwxMDAgNTB2NjUwaC0yMDBxLTM0IDAgLTUwLjUgLTF0LTM5LjUgLTUuNXQtMzMuNSAtMTV0LTE4LjUgLTMwdC04IC00OC41aC01MHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTA1MjsiIGQ9Ik0wIDUwcTAgLTIwIDE0LjUgLTM1dDM1LjUgLTE1aDExMDBxMjEgMCAzNS41IDE1dDE0LjUgMzV2MTAwcTAgMjEgLTE0LjUgMzUuNXQtMzUuNSAxNC41aC0xMTAwcS0yMSAwIC0zNS41IC0xNC41dC0xNC41IC0zNS41di0xMDB6TTAgMzUwcTAgLTIwIDE0LjUgLTM1dDM1LjUgLTE1aDgwMHEyMSAwIDM1LjUgMTV0MTQuNSAzNXYxMDBxMCAyMSAtMTQuNSAzNS41dC0zNS41IDE0LjVoLTgwMHEtMjEgMCAtMzUuNSAtMTQuNXQtMTQuNSAtMzUuNSB2LTEwMHpNMCA2NTBxMCAtMjAgMTQuNSAtMzV0MzUuNSAtMTVoMTAwMHEyMSAwIDM1LjUgMTV0MTQuNSAzNXYxMDBxMCAyMSAtMTQuNSAzNS41dC0zNS41IDE0LjVoLTEwMDBxLTIxIDAgLTM1LjUgLTE0LjV0LTE0LjUgLTM1LjV2LTEwMHpNMCA5NTBxMCAtMjAgMTQuNSAtMzV0MzUuNSAtMTVoNjAwcTIxIDAgMzUuNSAxNXQxNC41IDM1djEwMHEwIDIxIC0xNC41IDM1LjV0LTM1LjUgMTQuNWgtNjAwcS0yMSAwIC0zNS41IC0xNC41IHQtMTQuNSAtMzUuNXYtMTAweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMDUzOyIgZD0iTTAgNTBxMCAtMjAgMTQuNSAtMzV0MzUuNSAtMTVoMTEwMHEyMSAwIDM1LjUgMTV0MTQuNSAzNXYxMDBxMCAyMSAtMTQuNSAzNS41dC0zNS41IDE0LjVoLTExMDBxLTIxIDAgLTM1LjUgLTE0LjV0LTE0LjUgLTM1LjV2LTEwMHpNMCA2NTBxMCAtMjAgMTQuNSAtMzV0MzUuNSAtMTVoMTEwMHEyMSAwIDM1LjUgMTV0MTQuNSAzNXYxMDBxMCAyMSAtMTQuNSAzNS41dC0zNS41IDE0LjVoLTExMDBxLTIxIDAgLTM1LjUgLTE0LjV0LTE0LjUgLTM1LjUgdi0xMDB6TTIwMCAzNTBxMCAtMjAgMTQuNSAtMzV0MzUuNSAtMTVoNzAwcTIxIDAgMzUuNSAxNXQxNC41IDM1djEwMHEwIDIxIC0xNC41IDM1LjV0LTM1LjUgMTQuNWgtNzAwcS0yMSAwIC0zNS41IC0xNC41dC0xNC41IC0zNS41di0xMDB6TTIwMCA5NTBxMCAtMjAgMTQuNSAtMzV0MzUuNSAtMTVoNzAwcTIxIDAgMzUuNSAxNXQxNC41IDM1djEwMHEwIDIxIC0xNC41IDM1LjV0LTM1LjUgMTQuNWgtNzAwcS0yMSAwIC0zNS41IC0xNC41IHQtMTQuNSAtMzUuNXYtMTAweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMDU0OyIgZD0iTTAgNTB2MTAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNWgxMTAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di0xMDBxMCAtMjAgLTE0LjUgLTM1dC0zNS41IC0xNWgtMTEwMHEtMjEgMCAtMzUuNSAxNXQtMTQuNSAzNXpNMTAwIDY1MHYxMDBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41aDEwMDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTEwMHEwIC0yMCAtMTQuNSAtMzV0LTM1LjUgLTE1aC0xMDAwcS0yMSAwIC0zNS41IDE1IHQtMTQuNSAzNXpNMzAwIDM1MHYxMDBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41aDgwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtMTAwcTAgLTIwIC0xNC41IC0zNXQtMzUuNSAtMTVoLTgwMHEtMjEgMCAtMzUuNSAxNXQtMTQuNSAzNXpNNTAwIDk1MHYxMDBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41aDYwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtMTAwcTAgLTIwIC0xNC41IC0zNXQtMzUuNSAtMTVoLTYwMCBxLTIxIDAgLTM1LjUgMTV0LTE0LjUgMzV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwNTU7IiBkPSJNMCA1MHYxMDBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41aDExMDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTEwMHEwIC0yMCAtMTQuNSAtMzV0LTM1LjUgLTE1aC0xMTAwcS0yMSAwIC0zNS41IDE1dC0xNC41IDM1ek0wIDM1MHYxMDBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41aDExMDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTEwMHEwIC0yMCAtMTQuNSAtMzV0LTM1LjUgLTE1aC0xMTAwcS0yMSAwIC0zNS41IDE1IHQtMTQuNSAzNXpNMCA2NTB2MTAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNWgxMTAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di0xMDBxMCAtMjAgLTE0LjUgLTM1dC0zNS41IC0xNWgtMTEwMHEtMjEgMCAtMzUuNSAxNXQtMTQuNSAzNXpNMCA5NTB2MTAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNWgxMTAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di0xMDBxMCAtMjAgLTE0LjUgLTM1dC0zNS41IC0xNWgtMTEwMCBxLTIxIDAgLTM1LjUgMTV0LTE0LjUgMzV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwNTY7IiBkPSJNMCA1MHYxMDBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41aDEwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtMTAwcTAgLTIwIC0xNC41IC0zNXQtMzUuNSAtMTVoLTEwMHEtMjEgMCAtMzUuNSAxNXQtMTQuNSAzNXpNMCAzNTB2MTAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNWgxMDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTEwMHEwIC0yMCAtMTQuNSAtMzV0LTM1LjUgLTE1aC0xMDBxLTIxIDAgLTM1LjUgMTUgdC0xNC41IDM1ek0wIDY1MHYxMDBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41aDEwMHEyMSAwIDM1LjUgLTE0LjV0MTQuNSAtMzUuNXYtMTAwcTAgLTIwIC0xNC41IC0zNXQtMzUuNSAtMTVoLTEwMHEtMjEgMCAtMzUuNSAxNXQtMTQuNSAzNXpNMCA5NTB2MTAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNWgxMDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTEwMHEwIC0yMCAtMTQuNSAtMzV0LTM1LjUgLTE1aC0xMDBxLTIxIDAgLTM1LjUgMTUgdC0xNC41IDM1ek0zMDAgNTB2MTAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNWg4MDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTEwMHEwIC0yMCAtMTQuNSAtMzV0LTM1LjUgLTE1aC04MDBxLTIxIDAgLTM1LjUgMTV0LTE0LjUgMzV6TTMwMCAzNTB2MTAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNWg4MDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTEwMHEwIC0yMCAtMTQuNSAtMzV0LTM1LjUgLTE1aC04MDAgcS0yMSAwIC0zNS41IDE1dC0xNC41IDM1ek0zMDAgNjUwdjEwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjVoODAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di0xMDBxMCAtMjAgLTE0LjUgLTM1dC0zNS41IC0xNWgtODAwcS0yMSAwIC0zNS41IDE1dC0xNC41IDM1ek0zMDAgOTUwdjEwMHEwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjVoODAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di0xMDBxMCAtMjAgLTE0LjUgLTM1dC0zNS41IC0xNSBoLTgwMHEtMjEgMCAtMzUuNSAxNXQtMTQuNSAzNXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTA1NzsiIGQ9Ik0tMTAxIDUwMHYxMDBoMjAxdjc1bDE2NiAtMTI1bC0xNjYgLTEyNXY3NWgtMjAxek0zMDAgMGgxMDB2MTEwMGgtMTAwdi0xMTAwek01MDAgNTBxMCAtMjAgMTQuNSAtMzV0MzUuNSAtMTVoNjAwcTIwIDAgMzUgMTV0MTUgMzV2MTAwcTAgMjEgLTE1IDM1LjV0LTM1IDE0LjVoLTYwMHEtMjEgMCAtMzUuNSAtMTQuNXQtMTQuNSAtMzUuNXYtMTAwek01MDAgMzUwcTAgLTIwIDE0LjUgLTM1dDM1LjUgLTE1aDMwMHEyMCAwIDM1IDE1dDE1IDM1IHYxMDBxMCAyMSAtMTUgMzUuNXQtMzUgMTQuNWgtMzAwcS0yMSAwIC0zNS41IC0xNC41dC0xNC41IC0zNS41di0xMDB6TTUwMCA2NTBxMCAtMjAgMTQuNSAtMzV0MzUuNSAtMTVoNTAwcTIwIDAgMzUgMTV0MTUgMzV2MTAwcTAgMjEgLTE1IDM1LjV0LTM1IDE0LjVoLTUwMHEtMjEgMCAtMzUuNSAtMTQuNXQtMTQuNSAtMzUuNXYtMTAwek01MDAgOTUwcTAgLTIwIDE0LjUgLTM1dDM1LjUgLTE1aDEwMHEyMCAwIDM1IDE1dDE1IDM1djEwMCBxMCAyMSAtMTUgMzUuNXQtMzUgMTQuNWgtMTAwcS0yMSAwIC0zNS41IC0xNC41dC0xNC41IC0zNS41di0xMDB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwNTg7IiBkPSJNMSA1MHEwIC0yMCAxNC41IC0zNXQzNS41IC0xNWg2MDBxMjAgMCAzNSAxNXQxNSAzNXYxMDBxMCAyMSAtMTUgMzUuNXQtMzUgMTQuNWgtNjAwcS0yMSAwIC0zNS41IC0xNC41dC0xNC41IC0zNS41di0xMDB6TTEgMzUwcTAgLTIwIDE0LjUgLTM1dDM1LjUgLTE1aDMwMHEyMCAwIDM1IDE1dDE1IDM1djEwMHEwIDIxIC0xNSAzNS41dC0zNSAxNC41aC0zMDBxLTIxIDAgLTM1LjUgLTE0LjV0LTE0LjUgLTM1LjV2LTEwMHpNMSA2NTAgcTAgLTIwIDE0LjUgLTM1dDM1LjUgLTE1aDUwMHEyMCAwIDM1IDE1dDE1IDM1djEwMHEwIDIxIC0xNSAzNS41dC0zNSAxNC41aC01MDBxLTIxIDAgLTM1LjUgLTE0LjV0LTE0LjUgLTM1LjV2LTEwMHpNMSA5NTBxMCAtMjAgMTQuNSAtMzV0MzUuNSAtMTVoMTAwcTIwIDAgMzUgMTV0MTUgMzV2MTAwcTAgMjEgLTE1IDM1LjV0LTM1IDE0LjVoLTEwMHEtMjEgMCAtMzUuNSAtMTQuNXQtMTQuNSAtMzUuNXYtMTAwek04MDEgMHYxMTAwaDEwMHYtMTEwMCBoLTEwMHpNOTM0IDU1MGwxNjcgLTEyNXY3NWgyMDB2MTAwaC0yMDB2NzV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwNTk7IiBkPSJNMCAyNzV2NjUwcTAgMzEgMjIgNTN0NTMgMjJoNzUwcTMxIDAgNTMgLTIydDIyIC01M3YtNjUwcTAgLTMxIC0yMiAtNTN0LTUzIC0yMmgtNzUwcS0zMSAwIC01MyAyMnQtMjIgNTN6TTkwMCA2MDBsMzAwIDMwMHYtNjAweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMDYwOyIgZD0iTTAgNDR2MTAxMnEwIDE4IDEzIDMxdDMxIDEzaDExMTJxMTkgMCAzMS41IC0xM3QxMi41IC0zMXYtMTAxMnEwIC0xOCAtMTIuNSAtMzF0LTMxLjUgLTEzaC0xMTEycS0xOCAwIC0zMSAxM3QtMTMgMzF6TTEwMCAyNjNsMjQ3IDE4MmwyOTggLTEzMWwtNzQgMTU2bDI5MyAzMThsMjM2IC0yODh2NTAwaC0xMDAwdi03Mzd6TTIwOCA3NTBxMCA1NiAzOSA5NXQ5NSAzOXQ5NSAtMzl0MzkgLTk1dC0zOSAtOTV0LTk1IC0zOXQtOTUgMzl0LTM5IDk1eiAiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTA2MjsiIGQ9Ik0xNDggNzQ1cTAgMTI0IDYwLjUgMjMxLjV0MTY1IDE3MnQyMjYuNSA2NC41cTEyMyAwIDIyNyAtNjN0MTY0LjUgLTE2OS41dDYwLjUgLTIyOS41dC03MyAtMjcycS03MyAtMTE0IC0xNjYuNSAtMjM3dC0xNTAuNSAtMTg5bC01NyAtNjZxLTEwIDkgLTI3IDI2dC02Ni41IDcwLjV0LTk2IDEwOXQtMTA0IDEzNS41dC0xMDAuNSAxNTVxLTYzIDEzOSAtNjMgMjYyek0zNDIgNzcycTAgLTEwNyA3NS41IC0xODIuNXQxODEuNSAtNzUuNSBxMTA3IDAgMTgyLjUgNzUuNXQ3NS41IDE4Mi41dC03NS41IDE4MnQtMTgyLjUgNzV0LTE4MiAtNzUuNXQtNzUgLTE4MS41eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMDYzOyIgZD0iTTEgNjAwcTAgMTIyIDQ3LjUgMjMzdDEyNy41IDE5MXQxOTEgMTI3LjV0MjMzIDQ3LjV0MjMzIC00Ny41dDE5MSAtMTI3LjV0MTI3LjUgLTE5MXQ0Ny41IC0yMzN0LTQ3LjUgLTIzM3QtMTI3LjUgLTE5MXQtMTkxIC0xMjcuNXQtMjMzIC00Ny41dC0yMzMgNDcuNXQtMTkxIDEyNy41dC0xMjcuNSAxOTF0LTQ3LjUgMjMzek0xNzMgNjAwcTAgLTE3NyAxMjUuNSAtMzAydDMwMS41IC0xMjV2ODU0cS0xNzYgMCAtMzAxLjUgLTEyNSB0LTEyNS41IC0zMDJ6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwNjQ7IiBkPSJNMTE3IDQwNnEwIDk0IDM0IDE4NnQ4OC41IDE3Mi41dDExMiAxNTl0MTE1IDE3N3Q4Ny41IDE5NC41cTIxIC03MSA1Ny41IC0xNDIuNXQ3NiAtMTMwLjV0ODMgLTExOC41dDgyIC0xMTd0NzAgLTExNnQ1MCAtMTI1LjV0MTguNSAtMTM2cTAgLTg5IC0zOSAtMTY1LjV0LTEwMiAtMTI2LjV0LTE0MCAtNzkuNXQtMTU2IC0zMy41cS0xMTQgNiAtMjExLjUgNTN0LTE2MS41IDEzOC41dC02NCAyMTAuNXpNMjQzIDQxNHExNCAtODIgNTkuNSAtMTM2IHQxMzYuNSAtODBsMTYgOThxLTcgNiAtMTggMTd0LTM0IDQ4dC0zMyA3N3EtMTUgNzMgLTE0IDE0My41dDEwIDEyMi41bDkgNTFxLTkyIC0xMTAgLTExOS41IC0xODV0LTEyLjUgLTE1NnoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTA2NTsiIGQ9Ik0wIDQwMHYzMDBxMCAxNjUgMTE3LjUgMjgyLjV0MjgyLjUgMTE3LjVxMzY2IC02IDM5NyAtMTRsLTE4NiAtMTg2aC0zMTFxLTQxIDAgLTcwLjUgLTI5LjV0LTI5LjUgLTcwLjV2LTUwMHEwIC00MSAyOS41IC03MC41dDcwLjUgLTI5LjVoNTAwcTQxIDAgNzAuNSAyOS41dDI5LjUgNzAuNXYxMjVsMjAwIDIwMHYtMjI1cTAgLTE2NSAtMTE3LjUgLTI4Mi41dC0yODIuNSAtMTE3LjVoLTMwMHEtMTY1IDAgLTI4Mi41IDExNy41IHQtMTE3LjUgMjgyLjV6TTQzNiAzNDFsMTYxIDUwbDQxMiA0MTJsLTExNCAxMTNsLTQwNSAtNDA1ek05OTUgMTAxNWwxMTMgLTExM2wxMTMgMTEzbC0yMSA4NWwtOTIgMjh6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwNjY7IiBkPSJNMCA0MDB2MzAwcTAgMTY1IDExNy41IDI4Mi41dDI4Mi41IDExNy41aDI2MWwyIC04MHEtMTMzIC0zMiAtMjE4IC0xMjBoLTE0NXEtNDEgMCAtNzAuNSAtMjkuNXQtMjkuNSAtNzAuNXYtNTAwcTAgLTQxIDI5LjUgLTcwLjV0NzAuNSAtMjkuNWg1MDBxNDEgMCA3MC41IDI5LjV0MjkuNSA3MC41bDIwMCAxNTN2LTUzcTAgLTE2NSAtMTE3LjUgLTI4Mi41dC0yODIuNSAtMTE3LjVoLTMwMHEtMTY1IDAgLTI4Mi41IDExNy41dC0xMTcuNSAyODIuNSB6TTQyMyA1MjRxMzAgMzggODEuNSA2NHQxMDMgMzUuNXQ5OSAxNHQ3Ny41IDMuNWwyOSAtMXYtMjA5bDM2MCAzMjRsLTM1OSAzMTh2LTIxNnEtNyAwIC0xOSAtMXQtNDggLTh0LTY5LjUgLTE4LjV0LTc2LjUgLTM3dC03Ni41IC01OXQtNjIgLTg4dC0zOS41IC0xMjEuNXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTA2NzsiIGQ9Ik0wIDQwMHYzMDBxMCAxNjUgMTE3LjUgMjgyLjV0MjgyLjUgMTE3LjVoMzAwcTYwIDAgMTI3IC0yM2wtMTc4IC0xNzdoLTM0OXEtNDEgMCAtNzAuNSAtMjkuNXQtMjkuNSAtNzAuNXYtNTAwcTAgLTQxIDI5LjUgLTcwLjV0NzAuNSAtMjkuNWg1MDBxNDEgMCA3MC41IDI5LjV0MjkuNSA3MC41djY5bDIwMCAyMDB2LTE2OXEwIC0xNjUgLTExNy41IC0yODIuNXQtMjgyLjUgLTExNy41aC0zMDBxLTE2NSAwIC0yODIuNSAxMTcuNSB0LTExNy41IDI4Mi41ek0zNDIgNjMybDI4MyAtMjg0bDU2NiA1NjdsLTEzNiAxMzdsLTQzMCAtNDMxbC0xNDcgMTQ3eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMDY4OyIgZD0iTTAgNjAzbDMwMCAyOTZ2LTE5OGgyMDB2MjAwaC0yMDBsMzAwIDMwMGwyOTUgLTMwMGgtMTk1di0yMDBoMjAwdjE5OGwzMDAgLTI5NmwtMzAwIC0zMDB2MTk4aC0yMDB2LTIwMGgxOTVsLTI5NSAtMzAwbC0zMDAgMzAwaDIwMHYyMDBoLTIwMHYtMTk4eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMDY5OyIgZD0iTTIwMCA1MHYxMDAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNWgxMDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTQzN2w1MDAgNDg3di0xMTAwbC01MDAgNDg4di00MzhxMCAtMjEgLTE0LjUgLTM1LjV0LTM1LjUgLTE0LjVoLTEwMHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwNzA7IiBkPSJNMCA1MHYxMDAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNWgxMDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTQzN2w1MDAgNDg3di00ODdsNTAwIDQ4N3YtMTEwMGwtNTAwIDQ4OHYtNDg4bC01MDAgNDg4di00MzhxMCAtMjEgLTE0LjUgLTM1LjV0LTM1LjUgLTE0LjVoLTEwMHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwNzE7IiBkPSJNMTM2IDU1MGw1NjQgNTUwdi00ODdsNTAwIDQ4N3YtMTEwMGwtNTAwIDQ4OHYtNDg4eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMDcyOyIgZD0iTTIwMCAwbDkwMCA1NTBsLTkwMCA1NTB2LTExMDB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwNzM7IiBkPSJNMjAwIDE1MHEwIC0yMSAxNC41IC0zNS41dDM1LjUgLTE0LjVoMjAwcTIxIDAgMzUuNSAxNC41dDE0LjUgMzUuNXY4MDBxMCAyMSAtMTQuNSAzNS41dC0zNS41IDE0LjVoLTIwMHEtMjEgMCAtMzUuNSAtMTQuNXQtMTQuNSAtMzUuNXYtODAwek02MDAgMTUwcTAgLTIxIDE0LjUgLTM1LjV0MzUuNSAtMTQuNWgyMDBxMjEgMCAzNS41IDE0LjV0MTQuNSAzNS41djgwMHEwIDIxIC0xNC41IDM1LjV0LTM1LjUgMTQuNWgtMjAwIHEtMjEgMCAtMzUuNSAtMTQuNXQtMTQuNSAtMzUuNXYtODAweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMDc0OyIgZD0iTTIwMCAxNTBxMCAtMjAgMTQuNSAtMzV0MzUuNSAtMTVoODAwcTIxIDAgMzUuNSAxNXQxNC41IDM1djgwMHEwIDIxIC0xNC41IDM1LjV0LTM1LjUgMTQuNWgtODAwcS0yMSAwIC0zNS41IC0xNC41dC0xNC41IC0zNS41di04MDB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwNzU7IiBkPSJNMCAwdjExMDBsNTAwIC00ODd2NDg3bDU2NCAtNTUwbC01NjQgLTU1MHY0ODh6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwNzY7IiBkPSJNMCAwdjExMDBsNTAwIC00ODd2NDg3bDUwMCAtNDg3djQzN3EwIDIxIDE0LjUgMzUuNXQzNS41IDE0LjVoMTAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di0xMDAwcTAgLTIxIC0xNC41IC0zNS41dC0zNS41IC0xNC41aC0xMDBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41djQzOGwtNTAwIC00ODh2NDg4eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMDc3OyIgZD0iTTMwMCAwdjExMDBsNTAwIC00ODd2NDM3cTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNWgxMDBxMjEgMCAzNS41IC0xNC41dDE0LjUgLTM1LjV2LTEwMDBxMCAtMjEgLTE0LjUgLTM1LjV0LTM1LjUgLTE0LjVoLTEwMHEtMjEgMCAtMzUuNSAxNC41dC0xNC41IDM1LjV2NDM4eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMDc4OyIgZD0iTTEwMCAyNTB2MTAwcTAgMjEgMTQuNSAzNS41dDM1LjUgMTQuNWgxMDAwcTIxIDAgMzUuNSAtMTQuNXQxNC41IC0zNS41di0xMDBxMCAtMjEgLTE0LjUgLTM1LjV0LTM1LjUgLTE0LjVoLTEwMDBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41ek0xMDAgNTAwaDExMDBsLTU1MCA1NjR6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwNzk7IiBkPSJNMTg1IDU5OWw1OTIgLTU5MmwyNDAgMjQwbC0zNTMgMzUzbDM1MyAzNTNsLTI0MCAyNDB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwODA7IiBkPSJNMjcyIDE5NGwzNTMgMzUzbC0zNTMgMzUzbDI0MSAyNDBsNTcyIC01NzFsMjEgLTIybC0xIC0xdi0xbC01OTIgLTU5MXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTA4MTsiIGQ9Ik0zIDYwMHEwIDE2MiA4MCAyOTkuNXQyMTcuNSAyMTcuNXQyOTkuNSA4MHQyOTkuNSAtODB0MjE3LjUgLTIxNy41dDgwIC0yOTkuNXQtODAgLTMwMHQtMjE3LjUgLTIxOHQtMjk5LjUgLTgwdC0yOTkuNSA4MHQtMjE3LjUgMjE4dC04MCAzMDB6TTMwMCA1MDBoMjAwdi0yMDBoMjAwdjIwMGgyMDB2MjAwaC0yMDB2MjAwaC0yMDB2LTIwMGgtMjAwdi0yMDB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwODI7IiBkPSJNMyA2MDBxMCAxNjIgODAgMjk5LjV0MjE3LjUgMjE3LjV0Mjk5LjUgODB0Mjk5LjUgLTgwdDIxNy41IC0yMTcuNXQ4MCAtMjk5LjV0LTgwIC0zMDB0LTIxNy41IC0yMTh0LTI5OS41IC04MHQtMjk5LjUgODB0LTIxNy41IDIxOHQtODAgMzAwek0zMDAgNTAwaDYwMHYyMDBoLTYwMHYtMjAweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMDgzOyIgZD0iTTMgNjAwcTAgMTYyIDgwIDI5OS41dDIxNy41IDIxNy41dDI5OS41IDgwdDI5OS41IC04MHQyMTcuNSAtMjE3LjV0ODAgLTI5OS41dC04MCAtMzAwdC0yMTcuNSAtMjE4dC0yOTkuNSAtODB0LTI5OS41IDgwdC0yMTcuNSAyMTh0LTgwIDMwMHpNMjQ2IDQ1OWwyMTMgLTIxM2wxNDEgMTQybDE0MSAtMTQybDIxMyAyMTNsLTE0MiAxNDFsMTQyIDE0MWwtMjEzIDIxMmwtMTQxIC0xNDFsLTE0MSAxNDJsLTIxMiAtMjEzbDE0MSAtMTQxeiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMDg0OyIgZD0iTTMgNjAwcTAgMTYyIDgwIDI5OS41dDIxNy41IDIxNy41dDI5OS41IDgwdDI5OS41IC04MHQyMTcuNSAtMjE3LjV0ODAgLTI5OS41dC04MCAtMjk5LjV0LTIxNy41IC0yMTcuNXQtMjk5LjUgLTgwdC0yOTkuNSA4MHQtMjE3LjUgMjE3LjV0LTgwIDI5OS41ek0yNzAgNTUxbDI3NiAtMjc3bDQxMSA0MTFsLTE3NSAxNzRsLTIzNiAtMjM2bC0xMDIgMTAyeiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMDg1OyIgZD0iTTMgNjAwcTAgMTYyIDgwIDI5OS41dDIxNy41IDIxNy41dDI5OS41IDgwdDI5OS41IC04MHQyMTcuNSAtMjE3LjV0ODAgLTI5OS41dC04MCAtMzAwdC0yMTcuNSAtMjE4dC0yOTkuNSAtODB0LTI5OS41IDgwdC0yMTcuNSAyMTh0LTgwIDMwMHpNMzYzIDcwMGgxNDRxNCAwIDExLjUgLTF0MTEgLTF0Ni41IDN0MyA5dDEgMTF0My41IDguNXQzLjUgNnQ1LjUgNHQ2LjUgMi41dDkgMS41dDkgMC41aDExLjVoMTIuNXExOSAwIDMwIC0xMHQxMSAtMjYgcTAgLTIyIC00IC0yOHQtMjcgLTIycS01IC0xIC0xMi41IC0zdC0yNyAtMTMuNXQtMzQgLTI3dC0yNi41IC00NnQtMTEgLTY4LjVoMjAwcTUgMyAxNCA4dDMxLjUgMjUuNXQzOS41IDQ1LjV0MzEgNjl0MTQgOTRxMCA1MSAtMTcuNSA4OXQtNDIgNTh0LTU4LjUgMzJ0LTU4LjUgMTV0LTUxLjUgM3EtMTA1IDAgLTE3MiAtNTZ0LTY3IC0xODN6TTUwMCAzMDBoMjAwdjEwMGgtMjAwdi0xMDB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwODY7IiBkPSJNMyA2MDBxMCAxNjIgODAgMjk5LjV0MjE3LjUgMjE3LjV0Mjk5LjUgODB0Mjk5LjUgLTgwdDIxNy41IC0yMTcuNXQ4MCAtMjk5LjV0LTgwIC0zMDB0LTIxNy41IC0yMTh0LTI5OS41IC04MHQtMjk5LjUgODB0LTIxNy41IDIxOHQtODAgMzAwek00MDAgMzAwaDQwMHYxMDBoLTEwMHYzMDBoLTMwMHYtMTAwaDEwMHYtMjAwaC0xMDB2LTEwMHpNNTAwIDgwMGgyMDB2MTAwaC0yMDB2LTEwMHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTA4NzsiIGQ9Ik0wIDUwMHYyMDBoMTk0cTE1IDYwIDM2IDEwNC41dDU1LjUgODZ0ODggNjl0MTI2LjUgNDAuNXYyMDBoMjAwdi0yMDBxNTQgLTIwIDExMyAtNjB0MTEyLjUgLTEwNS41dDcxLjUgLTEzNC41aDIwM3YtMjAwaC0yMDNxLTI1IC0xMDIgLTExNi41IC0xODZ0LTE4MC41IC0xMTd2LTE5N2gtMjAwdjE5N3EtMTQwIDI3IC0yMDggMTAyLjV0LTk4IDIwMC41aC0xOTR6TTI5MCA1MDBxMjQgLTczIDc5LjUgLTEyNy41dDEzMC41IC03OC41djIwNmgyMDAgdi0yMDZxMTQ5IDQ4IDIwMSAyMDZoLTIwMXYyMDBoMjAwcS0yNSA3NCAtNzYgMTI3LjV0LTEyNCA3Ni41di0yMDRoLTIwMHYyMDNxLTc1IC0yNCAtMTMwIC03Ny41dC03OSAtMTI1LjVoMjA5di0yMDBoLTIxMHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTA4ODsiIGQ9Ik00IDYwMHEwIDE2MiA4MCAyOTl0MjE3IDIxN3QyOTkgODB0Mjk5IC04MHQyMTcgLTIxN3Q4MCAtMjk5dC04MCAtMjk5dC0yMTcgLTIxN3QtMjk5IC04MHQtMjk5IDgwdC0yMTcgMjE3dC04MCAyOTl6TTE4NiA2MDBxMCAtMTcxIDEyMS41IC0yOTIuNXQyOTIuNSAtMTIxLjV0MjkyLjUgMTIxLjV0MTIxLjUgMjkyLjV0LTEyMS41IDI5Mi41dC0yOTIuNSAxMjEuNXQtMjkyLjUgLTEyMS41dC0xMjEuNSAtMjkyLjV6TTM1NiA0NjVsMTM1IDEzNSBsLTEzNSAxMzVsMTA5IDEwOWwxMzUgLTEzNWwxMzUgMTM1bDEwOSAtMTA5bC0xMzUgLTEzNWwxMzUgLTEzNWwtMTA5IC0xMDlsLTEzNSAxMzVsLTEzNSAtMTM1eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMDg5OyIgZD0iTTQgNjAwcTAgMTYyIDgwIDI5OXQyMTcgMjE3dDI5OSA4MHQyOTkgLTgwdDIxNyAtMjE3dDgwIC0yOTl0LTgwIC0yOTl0LTIxNyAtMjE3dC0yOTkgLTgwdC0yOTkgODB0LTIxNyAyMTd0LTgwIDI5OXpNMTg2IDYwMHEwIC0xNzEgMTIxLjUgLTI5Mi41dDI5Mi41IC0xMjEuNXQyOTIuNSAxMjEuNXQxMjEuNSAyOTIuNXQtMTIxLjUgMjkyLjV0LTI5Mi41IDEyMS41dC0yOTIuNSAtMTIxLjV0LTEyMS41IC0yOTIuNXpNMzIyIDUzN2wxNDEgMTQxIGw4NyAtODdsMjA0IDIwNWwxNDIgLTE0MmwtMzQ2IC0zNDV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwOTA7IiBkPSJNNCA2MDBxMCAxNjIgODAgMjk5dDIxNyAyMTd0Mjk5IDgwdDI5OSAtODB0MjE3IC0yMTd0ODAgLTI5OXQtODAgLTI5OXQtMjE3IC0yMTd0LTI5OSAtODB0LTI5OSA4MHQtMjE3IDIxN3QtODAgMjk5ek0xODYgNjAwcTAgLTExNSA2MiAtMjE1bDU2OCA1NjdxLTEwMCA2MiAtMjE2IDYycS0xNzEgMCAtMjkyLjUgLTEyMS41dC0xMjEuNSAtMjkyLjV6TTM5MSAyNDVxOTcgLTU5IDIwOSAtNTlxMTcxIDAgMjkyLjUgMTIxLjV0MTIxLjUgMjkyLjUgcTAgMTEyIC01OSAyMDl6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwOTE7IiBkPSJNMCA1NDdsNjAwIDQ1M3YtMzAwaDYwMHYtMzAwaC02MDB2LTMwMXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTA5MjsiIGQ9Ik0wIDQwMHYzMDBoNjAwdjMwMGw2MDAgLTQ1M2wtNjAwIC00NDh2MzAxaC02MDB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwOTM7IiBkPSJNMjA0IDYwMGw0NTAgNjAwbDQ0NCAtNjAwaC0yOTh2LTYwMGgtMzAwdjYwMGgtMjk2eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMDk0OyIgZD0iTTEwNCA2MDBoMjk2djYwMGgzMDB2LTYwMGgyOThsLTQ0OSAtNjAweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMDk1OyIgZD0iTTAgMjAwcTYgMTMyIDQxIDIzOC41dDEwMy41IDE5M3QxODQgMTM4dDI3MS41IDU5LjV2MjcxbDYwMCAtNDUzbC02MDAgLTQ0OHYzMDFxLTk1IC0yIC0xODMgLTIwdC0xNzAgLTUydC0xNDcgLTkyLjV0LTEwMCAtMTM1LjV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwOTY7IiBkPSJNMCAwdjQwMGwxMjkgLTEyOWwyOTQgMjk0bDE0MiAtMTQybC0yOTQgLTI5NGwxMjkgLTEyOWgtNDAwek02MzUgNzc3bDE0MiAtMTQybDI5NCAyOTRsMTI5IC0xMjl2NDAwaC00MDBsMTI5IC0xMjl6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUwOTc7IiBkPSJNMzQgMTc2bDI5NSAyOTVsLTEyOSAxMjloNDAwdi00MDBsLTEyOSAxMzBsLTI5NSAtMjk1ek02MDAgNjAwdjQwMGwxMjkgLTEyOWwyOTUgMjk1bDE0MiAtMTQxbC0yOTUgLTI5NWwxMjkgLTEzMGgtNDAweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMTAxOyIgZD0iTTIzIDYwMHEwIDExOCA0NS41IDIyNC41dDEyMyAxODR0MTg0IDEyM3QyMjQuNSA0NS41dDIyNC41IC00NS41dDE4NCAtMTIzdDEyMyAtMTg0dDQ1LjUgLTIyNC41dC00NS41IC0yMjQuNXQtMTIzIC0xODR0LTE4NCAtMTIzdC0yMjQuNSAtNDUuNXQtMjI0LjUgNDUuNXQtMTg0IDEyM3QtMTIzIDE4NHQtNDUuNSAyMjQuNXpNNDU2IDg1MWw1OCAtMzAycTQgLTIwIDIxLjUgLTM0LjV0MzcuNSAtMTQuNWg1NHEyMCAwIDM3LjUgMTQuNSB0MjEuNSAzNC41bDU4IDMwMnE0IDIwIC04IDM0LjV0LTMzIDE0LjVoLTIwN3EtMjAgMCAtMzIgLTE0LjV0LTggLTM0LjV6TTUwMCAzMDBoMjAwdjEwMGgtMjAwdi0xMDB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxMDI7IiBkPSJNMCA4MDBoMTAwdi0yMDBoNDAwdjMwMGgyMDB2LTMwMGg0MDB2MjAwaDEwMHYxMDBoLTExMXY2dC0xIDE1dC0zIDE4bC0zNCAxNzJxLTExIDM5IC00MS41IDYzdC02OS41IDI0cS0zMiAwIC02MSAtMTdsLTIzOSAtMTQ0cS0yMiAtMTMgLTQwIC0zNXEtMTkgMjQgLTQwIDM2bC0yMzggMTQ0cS0zMyAxOCAtNjIgMThxLTM5IDAgLTY5LjUgLTIzdC00MC41IC02MWwtMzUgLTE3N3EtMiAtOCAtMyAtMTh0LTEgLTE1di02aC0xMTF2LTEwMHogTTEwMCAwaDQwMHY0MDBoLTQwMHYtNDAwek0yMDAgOTAwcS0zIDAgMTQgNDh0MzUgOTZsMTggNDdsMjE0IC0xOTFoLTI4MXpNNzAwIDB2NDAwaDQwMHYtNDAwaC00MDB6TTczMSA5MDBsMjAyIDE5N3E1IC0xMiAxMiAtMzIuNXQyMyAtNjR0MjUgLTcydDcgLTI4LjVoLTI2OXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTEwMzsiIGQ9Ik0wIC0yMnYxNDNsMjE2IDE5M3EtOSA1MyAtMTMgODN0LTUuNSA5NHQ5IDExM3QzOC41IDExNHQ3NCAxMjRxNDcgNjAgOTkuNSAxMDIuNXQxMDMgNjh0MTI3LjUgNDh0MTQ1LjUgMzcuNXQxODQuNSA0My41dDIyMCA1OC41cTAgLTE4OSAtMjIgLTM0M3QtNTkgLTI1OHQtODkgLTE4MS41dC0xMDguNSAtMTIwdC0xMjIgLTY4dC0xMjUuNSAtMzB0LTEyMS41IC0xLjV0LTEwNy41IDEyLjV0LTg3LjUgMTd0LTU2LjUgNy41bC05OSAtNTV6IE0yMzguNSAzMDAuNXExOS41IC02LjUgODYuNSA3Ni41cTU1IDY2IDM2NyAyMzRxNzAgMzggMTE4LjUgNjkuNXQxMDIgNzl0OTkgMTExLjV0ODYuNSAxNDhxMjIgNTAgMjQgNjB0LTYgMTlxLTcgNSAtMTcgNXQtMjYuNSAtMTQuNXQtMzMuNSAtMzkuNXEtMzUgLTUxIC0xMTMuNSAtMTA4LjV0LTEzOS41IC04OS41bC02MSAtMzJxLTM2OSAtMTk3IC00NTggLTQwMXEtNDggLTExMSAtMjguNSAtMTE3LjV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxMDQ7IiBkPSJNMTExIDQwOHEwIC0zMyA1IC02M3E5IC01NiA0NCAtMTE5LjV0MTA1IC0xMDguNXEzMSAtMjEgNjQgLTE2dDYyIDIzLjV0NTcgNDkuNXQ0OCA2MS41dDM1IDYwLjVxMzIgNjYgMzkgMTg0LjV0LTEzIDE1Ny41cTc5IC04MCAxMjIgLTE2NHQyNiAtMTg0cS01IC0zMyAtMjAuNSAtNjkuNXQtMzcuNSAtODAuNXEtMTAgLTE5IC0xNC41IC0yOXQtMTIgLTI2dC05IC0yMy41dC0zIC0xOXQyLjUgLTE1LjV0MTEgLTkuNXQxOS41IC01dDMwLjUgMi41IHQ0MiA4cTU3IDIwIDkxIDM0dDg3LjUgNDQuNXQ4NyA2NHQ2NS41IDg4LjV0NDcgMTIycTM4IDE3MiAtNDQuNSAzNDEuNXQtMjQ2LjUgMjc4LjVxMjIgLTQ0IDQzIC0xMjlxMzkgLTE1OSAtMzIgLTE1NHEtMTUgMiAtMzMgOXEtNzkgMzMgLTEyMC41IDEwMHQtNDQgMTc1LjV0NDguNSAyNTcuNXEtMTMgLTggLTM0IC0yMy41dC03Mi41IC02Ni41dC04OC41IC0xMDUuNXQtNjAgLTEzOHQtOCAtMTY2LjVxMiAtMTIgOCAtNDEuNXQ4IC00M3Q2IC0zOS41IHQzLjUgLTM5LjV0LTEgLTMzLjV0LTYgLTMxLjV0LTEzLjUgLTI0dC0yMSAtMjAuNXQtMzEgLTEycS0zOCAtMTAgLTY3IDEzdC00MC41IDYxLjV0LTE1IDgxLjV0MTAuNSA3NXEtNTIgLTQ2IC04My41IC0xMDF0LTM5IC0xMDd0LTcuNSAtODV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxMDU7IiBkPSJNLTYxIDYwMGwyNiA0MHE2IDEwIDIwIDMwdDQ5IDYzLjV0NzQuNSA4NS41dDk3IDkwdDExNi41IDgzLjV0MTMyLjUgNTl0MTQ1LjUgMjMuNXQxNDUuNSAtMjMuNXQxMzIuNSAtNTl0MTE2LjUgLTgzLjV0OTcgLTkwdDc0LjUgLTg1LjV0NDkgLTYzLjV0MjAgLTMwbDI2IC00MGwtMjYgLTQwcS02IC0xMCAtMjAgLTMwdC00OSAtNjMuNXQtNzQuNSAtODUuNXQtOTcgLTkwdC0xMTYuNSAtODMuNXQtMTMyLjUgLTU5dC0xNDUuNSAtMjMuNSB0LTE0NS41IDIzLjV0LTEzMi41IDU5dC0xMTYuNSA4My41dC05NyA5MHQtNzQuNSA4NS41dC00OSA2My41dC0yMCAzMHpNMTIwIDYwMHE3IC0xMCA0MC41IC01OHQ1NiAtNzguNXQ2OCAtNzcuNXQ4Ny41IC03NXQxMDMgLTQ5LjV0MTI1IC0yMS41dDEyMy41IDIwdDEwMC41IDQ1LjV0ODUuNSA3MS41dDY2LjUgNzUuNXQ1OCA4MS41dDQ3IDY2cS0xIDEgLTI4LjUgMzcuNXQtNDIgNTV0LTQzLjUgNTN0LTU3LjUgNjMuNXQtNTguNSA1NCBxNDkgLTc0IDQ5IC0xNjNxMCAtMTI0IC04OCAtMjEydC0yMTIgLTg4dC0yMTIgODh0LTg4IDIxMnEwIDg1IDQ2IDE1OHEtMTAyIC04NyAtMjI2IC0yNTh6TTM3NyA2NTZxNDkgLTEyNCAxNTQgLTE5MWwxMDUgMTA1cS0zNyAyNCAtNzUgNzJ0LTU3IDg0bC0yMCAzNnoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTEwNjsiIGQ9Ik0tNjEgNjAwbDI2IDQwcTYgMTAgMjAgMzB0NDkgNjMuNXQ3NC41IDg1LjV0OTcgOTB0MTE2LjUgODMuNXQxMzIuNSA1OXQxNDUuNSAyMy41cTYxIDAgMTIxIC0xN2wzNyAxNDJoMTQ4bC0zMTQgLTEyMDBoLTE0OGwzNyAxNDNxLTgyIDIxIC0xNjUgNzEuNXQtMTQwIDEwMnQtMTA5LjUgMTEydC03MiA4OC41dC0yOS41IDQzek0xMjAgNjAwcTIxMCAtMjgyIDM5MyAtMzM2bDM3IDE0MXEtMTA3IDE4IC0xNzguNSAxMDEuNXQtNzEuNSAxOTMuNSBxMCA4NSA0NiAxNThxLTEwMiAtODcgLTIyNiAtMjU4ek0zNzcgNjU2cTQ5IC0xMjQgMTU0IC0xOTFsNDcgNDdsMjMgODdxLTMwIDI4IC01OSA2OXQtNDQgNjhsLTE0IDI2ek03ODAgMTYxbDM4IDE0NXEyMiAxNSA0NC41IDM0dDQ2IDQ0dDQwLjUgNDR0NDEgNTAuNXQzMy41IDQzLjV0MzMgNDR0MjQuNSAzNHEtOTcgMTI3IC0xNDAgMTc1bDM5IDE0NnE2NyAtNTQgMTMxLjUgLTEyNS41dDg3LjUgLTEwMy41dDM2IC01MmwyNiAtNDBsLTI2IC00MCBxLTcgLTEyIC0yNS41IC0zOHQtNjMuNSAtNzkuNXQtOTUuNSAtMTAyLjV0LTEyNCAtMTAwdC0xNDYuNSAtNzl6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxMDc7IiBkPSJNLTk3LjUgMzRxMTMuNSAtMzQgNTAuNSAtMzRoMTI5NHEzNyAwIDUwLjUgMzUuNXQtNy41IDY3LjVsLTY0MiAxMDU2cS0yMCAzMyAtNDggMzZ0LTQ4IC0yOWwtNjQyIC0xMDY2cS0yMSAtMzIgLTcuNSAtNjZ6TTE1NSAyMDBsNDQ1IDcyM2w0NDUgLTcyM2gtMzQ1djEwMGgtMjAwdi0xMDBoLTM0NXpNNTAwIDYwMGwxMDAgLTMwMGwxMDAgMzAwdjEwMGgtMjAwdi0xMDB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxMDg7IiBkPSJNMTAwIDI2MnY0MXEwIDIwIDExIDQ0LjV0MjYgMzguNWwzNjMgMzI1djMzOXEwIDYyIDQ0IDEwNnQxMDYgNDR0MTA2IC00NHQ0NCAtMTA2di0zMzlsMzYzIC0zMjVxMTUgLTE0IDI2IC0zOC41dDExIC00NC41di00MXEwIC0yMCAtMTIgLTI2LjV0LTI5IDUuNWwtMzU5IDI0OXYtMjYzcTEwMCAtOTEgMTAwIC0xMTN2LTY0cTAgLTIxIC0xMyAtMjl0LTMyIDFsLTk0IDc4aC0yMjJsLTk0IC03OHEtMTkgLTkgLTMyIC0xdC0xMyAyOXY2NCBxMCAyMiAxMDAgMTEzdjI2M2wtMzU5IC0yNDlxLTE3IC0xMiAtMjkgLTUuNXQtMTIgMjYuNXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTEwOTsiIGQ9Ik0wIDUwcTAgLTIwIDE0LjUgLTM1dDM1LjUgLTE1aDEwMDBxMjEgMCAzNS41IDE1dDE0LjUgMzV2NzUwaC0xMTAwdi03NTB6TTAgOTAwaDExMDB2MTUwcTAgMjEgLTE0LjUgMzUuNXQtMzUuNSAxNC41aC0xNTB2MTAwaC0xMDB2LTEwMGgtNTAwdjEwMGgtMTAwdi0xMDBoLTE1MHEtMjEgMCAtMzUuNSAtMTQuNXQtMTQuNSAtMzUuNXYtMTUwek0xMDAgMTAwdjEwMGgxMDB2LTEwMGgtMTAwek0xMDAgMzAwdjEwMGgxMDB2LTEwMGgtMTAweiBNMTAwIDUwMHYxMDBoMTAwdi0xMDBoLTEwMHpNMzAwIDEwMHYxMDBoMTAwdi0xMDBoLTEwMHpNMzAwIDMwMHYxMDBoMTAwdi0xMDBoLTEwMHpNMzAwIDUwMHYxMDBoMTAwdi0xMDBoLTEwMHpNNTAwIDEwMHYxMDBoMTAwdi0xMDBoLTEwMHpNNTAwIDMwMHYxMDBoMTAwdi0xMDBoLTEwMHpNNTAwIDUwMHYxMDBoMTAwdi0xMDBoLTEwMHpNNzAwIDEwMHYxMDBoMTAwdi0xMDBoLTEwMHpNNzAwIDMwMHYxMDBoMTAwdi0xMDBoLTEwMHpNNzAwIDUwMCB2MTAwaDEwMHYtMTAwaC0xMDB6TTkwMCAxMDB2MTAwaDEwMHYtMTAwaC0xMDB6TTkwMCAzMDB2MTAwaDEwMHYtMTAwaC0xMDB6TTkwMCA1MDB2MTAwaDEwMHYtMTAwaC0xMDB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxMTA7IiBkPSJNMCAyMDB2MjAwaDI1OWw2MDAgNjAwaDI0MXYxOThsMzAwIC0yOTVsLTMwMCAtMzAwdjE5N2gtMTU5bC02MDAgLTYwMGgtMzQxek0wIDgwMGgyNTlsMTIyIC0xMjJsMTQxIDE0MmwtMTgxIDE4MGgtMzQxdi0yMDB6TTY3OCAzODFsMTQxIDE0MmwxMjIgLTEyM2gxNTl2MTk4bDMwMCAtMjk1bC0zMDAgLTMwMHYxOTdoLTI0MXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTExMTsiIGQ9Ik0wIDQwMHY2MDBxMCA0MSAyOS41IDcwLjV0NzAuNSAyOS41aDEwMDBxNDEgMCA3MC41IC0yOS41dDI5LjUgLTcwLjV2LTYwMHEwIC00MSAtMjkuNSAtNzAuNXQtNzAuNSAtMjkuNWgtNTk2bC0zMDQgLTMwMHYzMDBoLTEwMHEtNDEgMCAtNzAuNSAyOS41dC0yOS41IDcwLjV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxMTI7IiBkPSJNMTAwIDYwMHYyMDBoMzAwdi0yNTBxMCAtMTEzIDYgLTE0NXExNyAtOTIgMTAyIC0xMTdxMzkgLTExIDkyIC0xMXEzNyAwIDY2LjUgNS41dDUwIDE1LjV0MzYgMjR0MjQgMzEuNXQxNCAzNy41dDcgNDJ0Mi41IDQ1dDAgNDd2MjV2MjUwaDMwMHYtMjAwcTAgLTQyIC0zIC04M3QtMTUgLTEwNHQtMzEuNSAtMTE2dC01OCAtMTA5LjV0LTg5IC05Ni41dC0xMjkgLTY1LjV0LTE3NC41IC0yNS41dC0xNzQuNSAyNS41dC0xMjkgNjUuNXQtODkgOTYuNSB0LTU4IDEwOS41dC0zMS41IDExNnQtMTUgMTA0dC0zIDgzek0xMDAgOTAwdjMwMGgzMDB2LTMwMGgtMzAwek04MDAgOTAwdjMwMGgzMDB2LTMwMGgtMzAweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMTEzOyIgZD0iTS0zMCA0MTFsMjI3IC0yMjdsMzUyIDM1M2wzNTMgLTM1M2wyMjYgMjI3bC01NzggNTc5eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMTE0OyIgZD0iTTcwIDc5N2w1ODAgLTU3OWw1NzggNTc5bC0yMjYgMjI3bC0zNTMgLTM1M2wtMzUyIDM1M3oiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTExNTsiIGQ9Ik0tMTk4IDcwMGwyOTkgMjgzbDMwMCAtMjgzaC0yMDN2LTQwMGgzODVsMjE1IC0yMDBoLTgwMHY2MDBoLTE5NnpNNDAyIDEwMDBsMjE1IC0yMDBoMzgxdi00MDBoLTE5OGwyOTkgLTI4M2wyOTkgMjgzaC0yMDB2NjAwaC03OTZ6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxMTY7IiBkPSJNMTggOTM5cS01IDI0IDEwIDQycTE0IDE5IDM5IDE5aDg5NmwzOCAxNjJxNSAxNyAxOC41IDI3LjV0MzAuNSAxMC41aDk0cTIwIDAgMzUgLTE0LjV0MTUgLTM1LjV0LTE1IC0zNS41dC0zNSAtMTQuNWgtNTRsLTIwMSAtOTYxcS0yIC00IC02IC0xMC41dC0xOSAtMTcuNXQtMzMgLTExaC0zMXYtNTBxMCAtMjAgLTE0LjUgLTM1dC0zNS41IC0xNXQtMzUuNSAxNXQtMTQuNSAzNXY1MGgtMzAwdi01MHEwIC0yMCAtMTQuNSAtMzV0LTM1LjUgLTE1IHQtMzUuNSAxNXQtMTQuNSAzNXY1MGgtNTBxLTIxIDAgLTM1LjUgMTV0LTE0LjUgMzVxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41aDUzNWw0OCAyMDBoLTYzM3EtMzIgMCAtNTQuNSAyMXQtMjcuNSA0M3oiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTExNzsiIGQ9Ik0wIDB2ODAwaDEyMDB2LTgwMGgtMTIwMHpNMCA5MDB2MTAwaDIwMHEwIDQxIDI5LjUgNzAuNXQ3MC41IDI5LjVoMzAwcTQxIDAgNzAuNSAtMjkuNXQyOS41IC03MC41aDUwMHYtMTAwaC0xMjAweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMTE4OyIgZD0iTTEgMGwzMDAgNzAwaDEyMDBsLTMwMCAtNzAwaC0xMjAwek0xIDQwMHY2MDBoMjAwcTAgNDEgMjkuNSA3MC41dDcwLjUgMjkuNWgzMDBxNDEgMCA3MC41IC0yOS41dDI5LjUgLTcwLjVoNTAwdi0yMDBoLTEwMDB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxMTk7IiBkPSJNMzAyIDMwMGgxOTh2NjAwaC0xOThsMjk4IDMwMGwyOTggLTMwMGgtMTk4di02MDBoMTk4bC0yOTggLTMwMHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTEyMDsiIGQ9Ik0wIDYwMGwzMDAgMjk4di0xOThoNjAwdjE5OGwzMDAgLTI5OGwtMzAwIC0yOTd2MTk3aC02MDB2LTE5N3oiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTEyMTsiIGQ9Ik0wIDEwMHYxMDBxMCA0MSAyOS41IDcwLjV0NzAuNSAyOS41aDEwMDBxNDEgMCA3MC41IC0yOS41dDI5LjUgLTcwLjV2LTEwMHEwIC00MSAtMjkuNSAtNzAuNXQtNzAuNSAtMjkuNWgtMTAwMHEtNDEgMCAtNzAuNSAyOS41dC0yOS41IDcwLjV6TTMxIDQwMGwxNzIgNzM5cTUgMjIgMjMgNDEuNXQzOCAxOS41aDY3MnExOSAwIDM3LjUgLTIyLjV0MjMuNSAtNDUuNWwxNzIgLTczMmgtMTEzOHpNODAwIDEwMGgxMDB2MTAwaC0xMDB2LTEwMHogTTEwMDAgMTAwaDEwMHYxMDBoLTEwMHYtMTAweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMTIyOyIgZD0iTS0xMDEgNjAwdjUwcTAgMjQgMjUgNDl0NTAgMzhsMjUgMTN2LTI1MGwtMTEgNS41dC0yNCAxNHQtMzAgMjEuNXQtMjQgMjcuNXQtMTEgMzEuNXpNOTkgNTAwdjI1MHY1cTAgMTMgMC41IDE4LjV0Mi41IDEzdDggMTAuNXQxNSAzaDIwMGw2NzUgMjUwdi04NTBsLTY3NSAyMDBoLTM4bDQ3IC0yNzZxMiAtMTIgLTMgLTE3LjV0LTExIC02dC0yMSAtMC41aC04aC04M3EtMjAgMCAtMzQuNSAxNHQtMTguNSAzNXEtNTYgMzM3IC01NiAzNTF6IE0xMTAwIDIwMHY4NTBxMCAyMSAxNC41IDM1LjV0MzUuNSAxNC41cTIwIDAgMzUgLTE0LjV0MTUgLTM1LjV2LTg1MHEwIC0yMCAtMTUgLTM1dC0zNSAtMTVxLTIxIDAgLTM1LjUgMTV0LTE0LjUgMzV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxMjM7IiBkPSJNNzQgMzUwcTAgMjEgMTMuNSAzNS41dDMzLjUgMTQuNWgxN2wxMTggMTczbDYzIDMyN3ExNSA3NyA3NiAxNDB0MTQ0IDgzbC0xOCAzMnEtNiAxOSAzIDMydDI5IDEzaDk0cTIwIDAgMjkgLTEwLjV0MyAtMjkuNWwtMTggLTM3cTgzIC0xOSAxNDQgLTgyLjV0NzYgLTE0MC41bDYzIC0zMjdsMTE4IC0xNzNoMTdxMjAgMCAzMy41IC0xNC41dDEzLjUgLTM1LjVxMCAtMjAgLTEzIC00MHQtMzEgLTI3cS0yMiAtOSAtNjMgLTIzdC0xNjcuNSAtMzcgdC0yNTEuNSAtMjN0LTI0NS41IDIwLjV0LTE3OC41IDQxLjVsLTU4IDIwcS0xOCA3IC0zMSAyNy41dC0xMyA0MC41ek00OTcgMTEwcTEyIC00OSA0MCAtNzkuNXQ2MyAtMzAuNXQ2MyAzMC41dDM5IDc5LjVxLTQ4IC02IC0xMDIgLTZ0LTEwMyA2eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMTI0OyIgZD0iTTIxIDQ0NWwyMzMgLTQ1bC03OCAtMjI0bDIyNCA3OGw0NSAtMjMzbDE1NSAxNzlsMTU1IC0xNzlsNDUgMjMzbDIyNCAtNzhsLTc4IDIyNGwyMzQgNDVsLTE4MCAxNTVsMTgwIDE1NmwtMjM0IDQ0bDc4IDIyNWwtMjI0IC03OGwtNDUgMjMzbC0xNTUgLTE4MGwtMTU1IDE4MGwtNDUgLTIzM2wtMjI0IDc4bDc4IC0yMjVsLTIzMyAtNDRsMTc5IC0xNTZ6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxMjU7IiBkPSJNMCAyMDBoMjAwdjYwMGgtMjAwdi02MDB6TTMwMCAyNzVxMCAtNzUgMTAwIC03NWg2MXExMjMgLTEwMCAxMzkgLTEwMGgyNTBxNDYgMCA4MyA1N2wyMzggMzQ0cTI5IDMxIDI5IDc0djEwMHEwIDQ0IC0zMC41IDg0LjV0LTY5LjUgNDAuNWgtMzI4cTI4IDExOCAyOCAxMjV2MTUwcTAgNDQgLTMwLjUgODQuNXQtNjkuNSA0MC41aC01MHEtMjcgMCAtNTEgLTIwdC0zOCAtNDhsLTk2IC0xOThsLTE0NSAtMTk2cS0yMCAtMjYgLTIwIC02M3YtNDAweiBNNDAwIDMwMHYzNzVsMTUwIDIxMmwxMDAgMjEzaDUwdi0xNzVsLTUwIC0yMjVoNDUwdi0xMjVsLTI1MCAtMzc1aC0yMTRsLTEzNiAxMDBoLTEwMHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTEyNjsiIGQ9Ik0wIDQwMHY2MDBoMjAwdi02MDBoLTIwMHpNMzAwIDUyNXY0MDBxMCA3NSAxMDAgNzVoNjFxMTIzIDEwMCAxMzkgMTAwaDI1MHE0NiAwIDgzIC01N2wyMzggLTM0NHEyOSAtMzEgMjkgLTc0di0xMDBxMCAtNDQgLTMwLjUgLTg0LjV0LTY5LjUgLTQwLjVoLTMyOHEyOCAtMTE4IDI4IC0xMjV2LTE1MHEwIC00NCAtMzAuNSAtODQuNXQtNjkuNSAtNDAuNWgtNTBxLTI3IDAgLTUxIDIwdC0zOCA0OGwtOTYgMTk4bC0xNDUgMTk2IHEtMjAgMjYgLTIwIDYzek00MDAgNTI1bDE1MCAtMjEybDEwMCAtMjEzaDUwdjE3NWwtNTAgMjI1aDQ1MHYxMjVsLTI1MCAzNzVoLTIxNGwtMTM2IC0xMDBoLTEwMHYtMzc1eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMTI3OyIgZD0iTTggMjAwdjYwMGgyMDB2LTYwMGgtMjAwek0zMDggMjc1djUyNXEwIDE3IDE0IDM1LjV0MjggMjguNWwxNCA5bDM2MiAyMzBxMTQgNiAyNSA2cTE3IDAgMjkgLTEybDEwOSAtMTEycTE0IC0xNCAxNCAtMzRxMCAtMTggLTExIC0zMmwtODUgLTEyMWgzMDJxODUgMCAxMzguNSAtMzh0NTMuNSAtMTEwdC01NC41IC0xMTF0LTEzOC41IC0zOWgtMTA3bC0xMzAgLTMzOXEtNyAtMjIgLTIwLjUgLTQxLjV0LTI4LjUgLTE5LjVoLTM0MSBxLTcgMCAtOTAgODF0LTgzIDk0ek00MDggMjg5bDEwMCAtODloMjkzbDEzMSAzMzlxNiAyMSAxOS41IDQxdDI4LjUgMjBoMjAzcTE2IDAgMjUgMTV0OSAzNnEwIDIwIC05IDM0LjV0LTI1IDE0LjVoLTQ1N2gtNi41aC03LjV0LTYuNSAwLjV0LTYgMXQtNSAxLjV0LTUuNSAyLjV0LTQgNHQtNCA1LjVxLTUgMTIgLTUgMjBxMCAxNCAxMCAyN2wxNDcgMTgzbC04NiA4M2wtMzM5IC0yMzZ2LTUwM3oiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTEyODsiIGQ9Ik0tMTAxIDY1MXEwIDcyIDU0IDExMHQxMzkgMzdoMzAybC04NSAxMjFxLTExIDE2IC0xMSAzMnEwIDIxIDE0IDM0bDEwOSAxMTNxMTMgMTIgMjkgMTJxMTEgMCAyNSAtNmwzNjUgLTIzMHE3IC00IDE2LjUgLTEwLjV0MjYgLTI2dDE2LjUgLTM2LjV2LTUyNnEwIC0xMyAtODUuNSAtOTMuNXQtOTMuNSAtODAuNWgtMzQycS0xNSAwIC0yOC41IDIwdC0xOS41IDQxbC0xMzEgMzM5aC0xMDZxLTg0IDAgLTEzOSAzOXQtNTUgMTExek0tMSA2MDFoMjIyIHExNSAwIDI4LjUgLTIwLjV0MTkuNSAtNDAuNWwxMzEgLTMzOWgyOTNsMTA2IDg5djUwMmwtMzQyIDIzN2wtODcgLTgzbDE0NSAtMTg0cTEwIC0xMSAxMCAtMjZxMCAtMTEgLTUgLTIwcS0xIC0zIC0zLjUgLTUuNWwtNCAtNHQtNSAtMi41dC01LjUgLTEuNXQtNi41IC0xdC02LjUgLTAuNWgtNy41aC02LjVoLTQ3NnYtMTAwek05OTkgMjAxdjYwMGgyMDB2LTYwMGgtMjAweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMTI5OyIgZD0iTTk3IDcxOWwyMzAgLTM2M3E0IC02IDEwLjUgLTE1LjV0MjYgLTI1dDM2LjUgLTE1LjVoNTI1cTEzIDAgOTQgODN0ODEgOTB2MzQycTAgMTUgLTIwIDI4LjV0LTQxIDE5LjVsLTMzOSAxMzF2MTA2cTAgODQgLTM5IDEzOXQtMTExIDU1dC0xMTAgLTUzLjV0LTM4IC0xMzguNXYtMzAybC0xMjEgODRxLTE1IDEyIC0zMy41IDExLjV0LTMyLjUgLTEzLjVsLTExMiAtMTEwcS0yMiAtMjIgLTYgLTUzek0xNzIgNzM5bDgzIDg2bDE4MyAtMTQ2IHEyMiAtMTggNDcgLTVxMyAxIDUuNSAzLjVsNCA0dDIuNSA1dDEuNSA1LjV0MSA2LjV0MC41IDZ2Ny41djd2NDU2cTAgMjIgMjUgMzF0NTAgLTAuNXQyNSAtMzAuNXYtMjAycTAgLTE2IDIwIC0yOS41dDQxIC0xOS41bDMzOSAtMTMwdi0yOTRsLTg5IC0xMDBoLTUwM3pNNDAwIDB2MjAwaDYwMHYtMjAwaC02MDB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxMzA7IiBkPSJNMSA1ODVxLTE1IC0zMSA3IC01M2wxMTIgLTExMHExMyAtMTMgMzIgLTEzLjV0MzQgMTAuNWwxMjEgODVsLTEgLTMwMnEwIC04NCAzOC41IC0xMzh0MTEwLjUgLTU0dDExMSA1NXQzOSAxMzl2MTA2bDMzOSAxMzFxMjAgNiA0MC41IDE5LjV0MjAuNSAyOC41djM0MnEwIDcgLTgxIDkwdC05NCA4M2gtNTI1cS0xNyAwIC0zNS41IC0xNHQtMjguNSAtMjhsLTEwIC0xNXpNNzYgNTY1bDIzNyAzMzloNTAzbDg5IC0xMDB2LTI5NGwtMzQwIC0xMzAgcS0yMCAtNiAtNDAgLTIwdC0yMCAtMjl2LTIwMnEwIC0yMiAtMjUgLTMxdC01MCAwdC0yNSAzMXY0NTZ2MTQuNXQtMS41IDExLjV0LTUgMTJ0LTkuNSA3cS0yNCAxMyAtNDYgLTVsLTE4NCAtMTQ2ek0zMDUgMTEwNHYyMDBoNjAwdi0yMDBoLTYwMHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTEzMTsiIGQ9Ik01IDU5N3EwIDEyMiA0Ny41IDIzMi41dDEyNy41IDE5MC41dDE5MC41IDEyNy41dDIzMi41IDQ3LjVxMTYyIDAgMjk5LjUgLTgwdDIxNy41IC0yMTh0ODAgLTMwMHQtODAgLTI5OS41dC0yMTcuNSAtMjE3LjV0LTI5OS41IC04MHQtMzAwIDgwdC0yMTggMjE3LjV0LTgwIDI5OS41ek0zMDAgNTAwaDMwMGwtMiAtMTk0bDQwMiAyOTRsLTQwMiAyOTh2LTE5N2gtMjk4di0yMDF6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxMzI7IiBkPSJNMCA1OTdxMCAxMjIgNDcuNSAyMzIuNXQxMjcuNSAxOTAuNXQxOTAuNSAxMjcuNXQyMzEuNSA0Ny41cTEyMiAwIDIzMi41IC00Ny41dDE5MC41IC0xMjcuNXQxMjcuNSAtMTkwLjV0NDcuNSAtMjMyLjVxMCAtMTYyIC04MCAtMjk5LjV0LTIxOCAtMjE3LjV0LTMwMCAtODB0LTI5OS41IDgwdC0yMTcuNSAyMTcuNXQtODAgMjk5LjV6TTIwMCA2MDBsNDAwIC0yOTR2MTk0aDMwMnYyMDFoLTMwMHYxOTd6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxMzM7IiBkPSJNNSA1OTdxMCAxMjIgNDcuNSAyMzIuNXQxMjcuNSAxOTAuNXQxOTAuNSAxMjcuNXQyMzIuNSA0Ny41cTEyMSAwIDIzMS41IC00Ny41dDE5MC41IC0xMjcuNXQxMjcuNSAtMTkwLjV0NDcuNSAtMjMyLjVxMCAtMTYyIC04MCAtMjk5LjV0LTIxNy41IC0yMTcuNXQtMjk5LjUgLTgwdC0zMDAgODB0LTIxOCAyMTcuNXQtODAgMjk5LjV6TTMwMCA2MDBoMjAwdi0zMDBoMjAwdjMwMGgyMDBsLTMwMCA0MDB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxMzQ7IiBkPSJNNSA1OTdxMCAxMjIgNDcuNSAyMzIuNXQxMjcuNSAxOTAuNXQxOTAuNSAxMjcuNXQyMzIuNSA0Ny41cTEyMSAwIDIzMS41IC00Ny41dDE5MC41IC0xMjcuNXQxMjcuNSAtMTkwLjV0NDcuNSAtMjMyLjVxMCAtMTYyIC04MCAtMjk5LjV0LTIxNy41IC0yMTcuNXQtMjk5LjUgLTgwdC0zMDAgODB0LTIxOCAyMTcuNXQtODAgMjk5LjV6TTMwMCA2MDBsMzAwIC00MDBsMzAwIDQwMGgtMjAwdjMwMGgtMjAwdi0zMDBoLTIwMHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTEzNTsiIGQ9Ik01IDU5N3EwIDEyMiA0Ny41IDIzMi41dDEyNy41IDE5MC41dDE5MC41IDEyNy41dDIzMi41IDQ3LjVxMTIxIDAgMjMxLjUgLTQ3LjV0MTkwLjUgLTEyNy41dDEyNy41IC0xOTAuNXQ0Ny41IC0yMzIuNXEwIC0xNjIgLTgwIC0yOTkuNXQtMjE3LjUgLTIxNy41dC0yOTkuNSAtODB0LTMwMCA4MHQtMjE4IDIxNy41dC04MCAyOTkuNXpNMjU0IDc4MHEtOCAtMzQgNS41IC05M3Q3LjUgLTg3cTAgLTkgMTcgLTQ0dDE2IC02MHExMiAwIDIzIC01LjUgdDIzIC0xNXQyMCAtMTMuNXEyMCAtMTAgMTA4IC00MnEyMiAtOCA1MyAtMzEuNXQ1OS41IC0zOC41dDU3LjUgLTExcTggLTE4IC0xNSAtNTUuNXQtMjAgLTU3LjVxMTIgLTIxIDIyLjUgLTM0LjV0MjggLTI3dDM2LjUgLTE3LjVxMCAtNiAtMyAtMTUuNXQtMy41IC0xNC41dDQuNSAtMTdxMTAxIC0yIDIyMSAxMTFxMzEgMzAgNDcgNDh0MzQgNDl0MjEgNjJxLTE0IDkgLTM3LjUgOS41dC0zNS41IDcuNXEtMTQgNyAtNDkgMTV0LTUyIDE5IHEtOSAwIC0zOS41IC0wLjV0LTQ2LjUgLTEuNXQtMzkgLTYuNXQtMzkgLTE2LjVxLTUwIC0zNSAtNjYgLTEycS00IDIgLTMuNSAyNS41dDAuNSAyNS41cS02IDEzIC0yNi41IDE3dC0yNC41IDdxMiAyMiAtMiA0MXQtMTYuNSAyOHQtMzguNSAtMjBxLTIzIC0yNSAtNDIgNHEtMTkgMjggLTggNThxOCAxNiAyMiAyMnE2IC0xIDI2IC0xLjV0MzMuNSAtNC41dDE5LjUgLTEzcTEyIC0xOSAzMiAtMzcuNXQzNCAtMjcuNWwxNCAtOHEwIDMgOS41IDM5LjUgdDUuNSA1Ny41cS00IDIzIDE0LjUgNDQuNXQyMi41IDMxLjVxNSAxNCAxMCAzNXQ4LjUgMzF0MTUuNSAyMi41dDM0IDIxLjVxLTYgMTggMTAgMzdxOCAwIDIzLjUgLTEuNXQyNC41IC0xLjV0MjAuNSA0LjV0MjAuNSAxNS41cS0xMCAyMyAtMzAuNSA0Mi41dC0zOCAzMHQtNDkgMjYuNXQtNDMuNSAyM3ExMSA0MSAxIDQ0cTMxIC0xMyA1OC41IC0xNC41dDM5LjUgMy41bDExIDRxNiAzNiAtMTcgNTMuNXQtNjQgMjguNXQtNTYgMjMgcS0xOSAtMyAtMzcgMHEtMTUgLTEyIC0zNi41IC0yMXQtMzQuNSAtMTJ0LTQ0IC04dC0zOSAtNnEtMTUgLTMgLTQ2IDB0LTQ1IC0zcS0yMCAtNiAtNTEuNSAtMjUuNXQtMzQuNSAtMzQuNXEtMyAtMTEgNi41IC0yMi41dDguNSAtMTguNXEtMyAtMzQgLTI3LjUgLTkxdC0yOS41IC03OXpNNTE4IDkxNXEzIDEyIDE2IDMwLjV0MTYgMjUuNXExMCAtMTAgMTguNSAtMTB0MTQgNnQxNC41IDE0LjV0MTYgMTIuNXEwIC0xOCA4IC00Mi41dDE2LjUgLTQ0IHQ5LjUgLTIzLjVxLTYgMSAtMzkgNXQtNTMuNSAxMHQtMzYuNSAxNnoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTEzNjsiIGQ9Ik0wIDE2NC41cTAgMjEuNSAxNSAzNy41bDYwMCA1OTlxLTMzIDEwMSA2IDIwMS41dDEzNSAxNTQuNXExNjQgOTIgMzA2IC05bC0yNTkgLTEzOGwxNDUgLTIzMmwyNTEgMTI2cTEzIC0xNzUgLTE1MSAtMjY3cS0xMjMgLTcwIC0yNTMgLTIzbC01OTYgLTU5NnEtMTUgLTE2IC0zNi41IC0xNnQtMzYuNSAxNmwtMTExIDExMHEtMTUgMTUgLTE1IDM2LjV6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxMzc7IiBob3Jpei1hZHYteD0iMTIyMCIgZD0iTTAgMTk2djEwMHEwIDQxIDI5LjUgNzAuNXQ3MC41IDI5LjVoMTAwMHE0MSAwIDcwLjUgLTI5LjV0MjkuNSAtNzAuNXYtMTAwcTAgLTQxIC0yOS41IC03MC41dC03MC41IC0yOS41aC0xMDAwcS00MSAwIC03MC41IDI5LjV0LTI5LjUgNzAuNXpNMCA1OTZ2MTAwcTAgNDEgMjkuNSA3MC41dDcwLjUgMjkuNWgxMDAwcTQxIDAgNzAuNSAtMjkuNXQyOS41IC03MC41di0xMDBxMCAtNDEgLTI5LjUgLTcwLjV0LTcwLjUgLTI5LjVoLTEwMDAgcS00MSAwIC03MC41IDI5LjV0LTI5LjUgNzAuNXpNMCA5OTZ2MTAwcTAgNDEgMjkuNSA3MC41dDcwLjUgMjkuNWgxMDAwcTQxIDAgNzAuNSAtMjkuNXQyOS41IC03MC41di0xMDBxMCAtNDEgLTI5LjUgLTcwLjV0LTcwLjUgLTI5LjVoLTEwMDBxLTQxIDAgLTcwLjUgMjkuNXQtMjkuNSA3MC41ek02MDAgNTk2aDUwMHYxMDBoLTUwMHYtMTAwek04MDAgMTk2aDMwMHYxMDBoLTMwMHYtMTAwek05MDAgOTk2aDIwMHYxMDBoLTIwMHYtMTAweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMTM4OyIgZD0iTTEwMCAxMTAwdjEwMGgxMDAwdi0xMDBoLTEwMDB6TTE1MCAxMDAwaDkwMGwtMzUwIC01MDB2LTMwMGwtMjAwIC0yMDB2NTAweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMTM5OyIgZD0iTTAgMjAwdjIwMGgxMjAwdi0yMDBxMCAtNDEgLTI5LjUgLTcwLjV0LTcwLjUgLTI5LjVoLTEwMDBxLTQxIDAgLTcwLjUgMjkuNXQtMjkuNSA3MC41ek0wIDUwMHY0MDBxMCA0MSAyOS41IDcwLjV0NzAuNSAyOS41aDMwMHYxMDBxMCA0MSAyOS41IDcwLjV0NzAuNSAyOS41aDIwMHE0MSAwIDcwLjUgLTI5LjV0MjkuNSAtNzAuNXYtMTAwaDMwMHE0MSAwIDcwLjUgLTI5LjV0MjkuNSAtNzAuNXYtNDAwaC01MDB2MTAwaC0yMDB2LTEwMGgtNTAweiBNNTAwIDEwMDBoMjAwdjEwMGgtMjAwdi0xMDB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxNDA7IiBkPSJNMCAwdjQwMGwxMjkgLTEyOWwyMDAgMjAwbDE0MiAtMTQybC0yMDAgLTIwMGwxMjkgLTEyOWgtNDAwek0wIDgwMGwxMjkgMTI5bDIwMCAtMjAwbDE0MiAxNDJsLTIwMCAyMDBsMTI5IDEyOWgtNDAwdi00MDB6TTcyOSAzMjlsMTQyIDE0MmwyMDAgLTIwMGwxMjkgMTI5di00MDBoLTQwMGwxMjkgMTI5ek03MjkgODcxbDIwMCAyMDBsLTEyOSAxMjloNDAwdi00MDBsLTEyOSAxMjlsLTIwMCAtMjAweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMTQxOyIgZD0iTTAgNTk2cTAgMTYyIDgwIDI5OXQyMTcgMjE3dDI5OSA4MHQyOTkgLTgwdDIxNyAtMjE3dDgwIC0yOTl0LTgwIC0yOTl0LTIxNyAtMjE3dC0yOTkgLTgwdC0yOTkgODB0LTIxNyAyMTd0LTgwIDI5OXpNMTgyIDU5NnEwIC0xNzIgMTIxLjUgLTI5M3QyOTIuNSAtMTIxdDI5Mi41IDEyMXQxMjEuNSAyOTNxMCAxNzEgLTEyMS41IDI5Mi41dC0yOTIuNSAxMjEuNXQtMjkyLjUgLTEyMS41dC0xMjEuNSAtMjkyLjV6TTI5MSA2NTUgcTAgMjMgMTUuNSAzOC41dDM4LjUgMTUuNXQzOSAtMTZ0MTYgLTM4cTAgLTIzIC0xNiAtMzl0LTM5IC0xNnEtMjIgMCAtMzggMTZ0LTE2IDM5ek00MDAgODUwcTAgMjIgMTYgMzguNXQzOSAxNi41cTIyIDAgMzggLTE2dDE2IC0zOXQtMTYgLTM5dC0zOCAtMTZxLTIzIDAgLTM5IDE2LjV0LTE2IDM4LjV6TTUxMyA2MDlxMCAzMiAyMSA1Ni41dDUyIDI5LjVsMTIyIDEyNmwxIDFxLTkgMTQgLTkgMjhxMCAyMiAxNiAzOC41dDM5IDE2LjUgcTIyIDAgMzggLTE2dDE2IC0zOXQtMTYgLTM5dC0zOCAtMTZxLTE2IDAgLTI5IDEwbC01NSAtMTQ1cTE3IC0yMiAxNyAtNTFxMCAtMzYgLTI1LjUgLTYxLjV0LTYxLjUgLTI1LjVxLTM3IDAgLTYyLjUgMjUuNXQtMjUuNSA2MS41ek04MDAgNjU1cTAgMjIgMTYgMzh0MzkgMTZ0MzguNSAtMTUuNXQxNS41IC0zOC41dC0xNiAtMzl0LTM4IC0xNnEtMjMgMCAtMzkgMTZ0LTE2IDM5eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMTQyOyIgZD0iTS00MCAzNzVxLTEzIC05NSAzNSAtMTczcTM1IC01NyA5NCAtODl0MTI5IC0zMnE2MyAwIDExOSAyOHEzMyAxNiA2NSA0MC41dDUyLjUgNDUuNXQ1OS41IDY0cTQwIDQ0IDU3IDYxbDM5NCAzOTRxMzUgMzUgNDcgODR0LTMgOTZxLTI3IDg3IC0xMTcgMTA0cS0yMCAyIC0yOSAycS00NiAwIC03OS41IC0xN3QtNjcuNSAtNTFsLTM4OCAtMzk2bC03IC03bDY5IC02N2wzNzcgMzczcTIwIDIyIDM5IDM4cTIzIDIzIDUwIDIzcTM4IDAgNTMgLTM2IHExNiAtMzkgLTIwIC03NWwtNTQ3IC01NDdxLTUyIC01MiAtMTI1IC01MnEtNTUgMCAtMTAwIDMzdC01NCA5NnEtNSAzNSAyLjUgNjZ0MzEuNSA2M3Q0MiA1MHQ1NiA1NHEyNCAyMSA0NCA0MWwzNDggMzQ4cTUyIDUyIDgyLjUgNzkuNXQ4NCA1NHQxMDcuNSAyNi41cTI1IDAgNDggLTRxOTUgLTE3IDE1NCAtOTQuNXQ1MSAtMTc1LjVxLTcgLTEwMSAtOTggLTE5MmwtMjUyIC0yNDlsLTI1MyAtMjU2bDcgLTdsNjkgLTYwbDUxNyA1MTEgcTY3IDY3IDk1IDE1N3QxMSAxODNxLTE2IDg3IC02NyAxNTR0LTEzMCAxMDNxLTY5IDMzIC0xNTIgMzNxLTEwNyAwIC0xOTcgLTU1cS00MCAtMjQgLTExMSAtOTVsLTUxMiAtNTEycS02OCAtNjggLTgxIC0xNjN6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxNDM7IiBkPSJNNzkgNzg0cTAgMTMxIDk5IDIyOS41dDIzMCA5OC41cTE0NCAwIDI0MiAtMTI5cTEwMyAxMjkgMjQ1IDEyOXExMzAgMCAyMjcgLTk4LjV0OTcgLTIyOS41cTAgLTQ2IC0xNy41IC05MXQtNjEgLTk5dC03NyAtODkuNXQtMTA0LjUgLTEwNS41cS0xOTcgLTE5MSAtMjkzIC0zMjJsLTE3IC0yM2wtMTYgMjNxLTQzIDU4IC0xMDAgMTIyLjV0LTkyIDk5LjV0LTEwMSAxMDBsLTg0LjUgODQuNXQtNjggNzR0LTYwIDc4dC0zMy41IDcwLjV0LTE1IDc4eiBNMjUwIDc4NHEwIC0yNyAzMC41IC03MHQ2MS41IC03NS41dDk1IC05NC41bDIyIC0yMnE5MyAtOTAgMTkwIC0yMDFxODIgOTIgMTk1IDIwM2wxMiAxMnE2NCA2MiA5Ny41IDk3dDY0LjUgNzl0MzEgNzJxMCA3MSAtNDggMTE5LjV0LTEwNiA0OC41cS03MyAwIC0xMzEgLTgzbC0xMTggLTE3MWwtMTE0IDE3NHEtNTEgODAgLTEyNCA4MHEtNTkgMCAtMTA4LjUgLTQ5LjV0LTQ5LjUgLTExOC41eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMTQ0OyIgZD0iTTU3IDM1M3EwIC05NCA2NiAtMTYwbDE0MSAtMTQxcTY2IC02NiAxNTkgLTY2cTk1IDAgMTU5IDY2bDI4MyAyODNxNjYgNjYgNjYgMTU5dC02NiAxNTlsLTE0MSAxNDFxLTEyIDEyIC0xOSAxN2wtMTA1IC0xMDVsMjEyIC0yMTJsLTM4OSAtMzg5bC0yNDcgMjQ4bDk1IDk1bC0xOCAxOHEtNDYgNDUgLTc1IDEwMWwtNTUgLTU1cS02NiAtNjYgLTY2IC0xNTl6TTI2OSA3MDZxMCAtOTMgNjYgLTE1OWwxNDEgLTE0MWwxOSAtMTdsMTA1IDEwNSBsLTIxMiAyMTJsMzg5IDM4OWwyNDcgLTI0N2wtOTUgLTk2bDE4IC0xOHE0NiAtNDYgNzcgLTk5bDI5IDI5cTM1IDM1IDYyLjUgODh0MjcuNSA5NnEwIDkzIC02NiAxNTlsLTE0MSAxNDFxLTY2IDY2IC0xNTkgNjZxLTk1IDAgLTE1OSAtNjZsLTI4MyAtMjgzcS02NiAtNjQgLTY2IC0xNTl6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxNDU7IiBkPSJNMjAwIDEwMHY5NTNxMCAyMSAzMCA0NnQ4MSA0OHQxMjkgMzh0MTYzIDE1dDE2MiAtMTV0MTI3IC0zOHQ3OSAtNDh0MjkgLTQ2di05NTNxMCAtNDEgLTI5LjUgLTcwLjV0LTcwLjUgLTI5LjVoLTYwMHEtNDEgMCAtNzAuNSAyOS41dC0yOS41IDcwLjV6TTMwMCAzMDBoNjAwdjcwMGgtNjAwdi03MDB6TTQ5NiAxNTBxMCAtNDMgMzAuNSAtNzMuNXQ3My41IC0zMC41dDczLjUgMzAuNXQzMC41IDczLjV0LTMwLjUgNzMuNXQtNzMuNSAzMC41IHQtNzMuNSAtMzAuNXQtMzAuNSAtNzMuNXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTE0NjsiIGQ9Ik0wIDBsMzAzIDM4MGwyMDcgMjA4bC0yMTAgMjEyaDMwMGwyNjcgMjc5bC0zNSAzNnEtMTUgMTQgLTE1IDM1dDE1IDM1cTE0IDE1IDM1IDE1dDM1IC0xNWwyODMgLTI4MnExNSAtMTUgMTUgLTM2dC0xNSAtMzVxLTE0IC0xNSAtMzUgLTE1dC0zNSAxNWwtMzYgMzVsLTI3OSAtMjY3di0zMDBsLTIxMiAyMTBsLTIwOCAtMjA3eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMTQ4OyIgZD0iTTI5NSA0MzNoMTM5cTUgLTc3IDQ4LjUgLTEyNi41dDExNy41IC02NC41djMzNWwtMjcgN3EtNDYgMTQgLTc5IDI2LjV0LTcyIDM2dC02Mi41IDUydC00MCA3Mi41dC0xNi41IDk5cTAgOTIgNDQgMTU5LjV0MTA5IDEwMXQxNDQgNDAuNXY3OGgxMDB2LTc5cTM4IC00IDcyLjUgLTEzLjV0NzUuNSAtMzEuNXQ3MSAtNTMuNXQ1MS41IC04NHQyNC41IC0xMTguNWgtMTU5cS04IDcyIC0zNSAxMDkuNXQtMTAxIDUwLjV2LTMwN2w2NCAtMTQgcTM0IC03IDY0IC0xNi41dDcwIC0zMS41dDY3LjUgLTUydDQ3LjUgLTgwLjV0MjAgLTExMi41cTAgLTEzOSAtODkgLTIyNHQtMjQ0IC05NnYtNzdoLTEwMHY3OHEtMTUyIDE3IC0yMzcgMTA0cS00MCA0MCAtNTIuNSA5My41dC0xNS41IDEzOS41ek00NjYgODg5cTAgLTI5IDggLTUxdDE2LjUgLTM0dDI5LjUgLTIyLjV0MzEgLTEzLjV0MzggLTEwcTcgLTIgMTEgLTN2Mjc0cS02MSAtOCAtOTcuNSAtMzcuNXQtMzYuNSAtMTAyLjV6TTcwMCAyMzcgcTE3MCAxOCAxNzAgMTUxcTAgNjQgLTQ0IDk5LjV0LTEyNiA2MC41di0zMTF6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxNDk7IiBkPSJNMTAwIDYwMHYxMDBoMTY2cS0yNCA0OSAtNDQgMTA0cS0xMCAyNiAtMTQuNSA1NS41dC0zIDcyLjV0MjUgOTB0NjguNSA4N3E5NyA4OCAyNjMgODhxMTI5IDAgMjMwIC04OXQxMDEgLTIwOGgtMTUzcTAgNTIgLTM0IDg5LjV0LTc0IDUxLjV0LTc2IDE0cS0zNyAwIC03OSAtMTQuNXQtNjIgLTM1LjVxLTQxIC00NCAtNDEgLTEwMXEwIC0xMSAyLjUgLTI0LjV0NS41IC0yNHQ5LjUgLTI2LjV0MTAuNSAtMjV0MTQgLTI3LjV0MTQgLTI1LjUgdDE1LjUgLTI3dDEzLjUgLTI0aDI0MnYtMTAwaC0xOTdxOCAtNTAgLTIuNSAtMTE1dC0zMS41IC05NHEtNDEgLTU5IC05OSAtMTEzcTM1IDExIDg0IDE4dDcwIDdxMzIgMSAxMDIgLTE2dDEwNCAtMTdxNzYgMCAxMzYgMzBsNTAgLTE0N3EtNDEgLTI1IC04MC41IC0zNi41dC01OSAtMTN0LTYxLjUgLTEuNXEtMjMgMCAtMTI4IDMzdC0xNTUgMjlxLTM5IC00IC04MiAtMTd0LTY2IC0yNWwtMjQgLTExbC01NSAxNDVsMTYuNSAxMXQxNS41IDEwIHQxMy41IDkuNXQxNC41IDEydDE0LjUgMTR0MTcuNSAxOC41cTQ4IDU1IDU0IDEyNi41dC0zMCAxNDIuNWgtMjIxeiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMTUwOyIgZD0iTTIgMzAwbDI5OCAtMzAwbDI5OCAzMDBoLTE5OHY5MDBoLTIwMHYtOTAwaC0xOTh6TTYwMiA5MDBsMjk4IDMwMGwyOTggLTMwMGgtMTk4di05MDBoLTIwMHY5MDBoLTE5OHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTE1MTsiIGQ9Ik0yIDMwMGgxOTh2OTAwaDIwMHYtOTAwaDE5OGwtMjk4IC0zMDB6TTcwMCAwdjIwMGgxMDB2LTEwMGgyMDB2LTEwMGgtMzAwek03MDAgNDAwdjEwMGgzMDB2LTIwMGgtOTl2LTEwMGgtMTAwdjEwMGg5OXYxMDBoLTIwMHpNNzAwIDcwMHY1MDBoMzAwdi01MDBoLTEwMHYxMDBoLTEwMHYtMTAwaC0xMDB6TTgwMSA5MDBoMTAwdjIwMGgtMTAwdi0yMDB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxNTI7IiBkPSJNMiAzMDBoMTk4djkwMGgyMDB2LTkwMGgxOThsLTI5OCAtMzAwek03MDAgMHY1MDBoMzAwdi01MDBoLTEwMHYxMDBoLTEwMHYtMTAwaC0xMDB6TTcwMCA3MDB2MjAwaDEwMHYtMTAwaDIwMHYtMTAwaC0zMDB6TTcwMCAxMTAwdjEwMGgzMDB2LTIwMGgtOTl2LTEwMGgtMTAwdjEwMGg5OXYxMDBoLTIwMHpNODAxIDIwMGgxMDB2MjAwaC0xMDB2LTIwMHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTE1MzsiIGQ9Ik0yIDMwMGwyOTggLTMwMGwyOTggMzAwaC0xOTh2OTAwaC0yMDB2LTkwMGgtMTk4ek04MDAgMTAwdjQwMGgzMDB2LTUwMGgtMTAwdjEwMGgtMjAwek04MDAgMTEwMHYxMDBoMjAwdi01MDBoLTEwMHY0MDBoLTEwMHpNOTAxIDIwMGgxMDB2MjAwaC0xMDB2LTIwMHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTE1NDsiIGQ9Ik0yIDMwMGwyOTggLTMwMGwyOTggMzAwaC0xOTh2OTAwaC0yMDB2LTkwMGgtMTk4ek04MDAgNDAwdjEwMGgyMDB2LTUwMGgtMTAwdjQwMGgtMTAwek04MDAgODAwdjQwMGgzMDB2LTUwMGgtMTAwdjEwMGgtMjAwek05MDEgOTAwaDEwMHYyMDBoLTEwMHYtMjAweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMTU1OyIgZD0iTTIgMzAwbDI5OCAtMzAwbDI5OCAzMDBoLTE5OHY5MDBoLTIwMHYtOTAwaC0xOTh6TTcwMCAxMDB2MjAwaDUwMHYtMjAwaC01MDB6TTcwMCA0MDB2MjAwaDQwMHYtMjAwaC00MDB6TTcwMCA3MDB2MjAwaDMwMHYtMjAwaC0zMDB6TTcwMCAxMDAwdjIwMGgyMDB2LTIwMGgtMjAweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMTU2OyIgZD0iTTIgMzAwbDI5OCAtMzAwbDI5OCAzMDBoLTE5OHY5MDBoLTIwMHYtOTAwaC0xOTh6TTcwMCAxMDB2MjAwaDIwMHYtMjAwaC0yMDB6TTcwMCA0MDB2MjAwaDMwMHYtMjAwaC0zMDB6TTcwMCA3MDB2MjAwaDQwMHYtMjAwaC00MDB6TTcwMCAxMDAwdjIwMGg1MDB2LTIwMGgtNTAweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMTU3OyIgZD0iTTAgNDAwdjMwMHEwIDE2NSAxMTcuNSAyODIuNXQyODIuNSAxMTcuNWgzMDBxMTYyIDAgMjgxIC0xMTguNXQxMTkgLTI4MS41di0zMDBxMCAtMTY1IC0xMTguNSAtMjgyLjV0LTI4MS41IC0xMTcuNWgtMzAwcS0xNjUgMCAtMjgyLjUgMTE3LjV0LTExNy41IDI4Mi41ek0yMDAgMzAwcTAgLTQxIDI5LjUgLTcwLjV0NzAuNSAtMjkuNWg1MDBxNDEgMCA3MC41IDI5LjV0MjkuNSA3MC41djUwMHEwIDQxIC0yOS41IDcwLjV0LTcwLjUgMjkuNSBoLTUwMHEtNDEgMCAtNzAuNSAtMjkuNXQtMjkuNSAtNzAuNXYtNTAweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMTU4OyIgZD0iTTAgNDAwdjMwMHEwIDE2MyAxMTkgMjgxLjV0MjgxIDExOC41aDMwMHExNjUgMCAyODIuNSAtMTE3LjV0MTE3LjUgLTI4Mi41di0zMDBxMCAtMTY1IC0xMTcuNSAtMjgyLjV0LTI4Mi41IC0xMTcuNWgtMzAwcS0xNjMgMCAtMjgxLjUgMTE3LjV0LTExOC41IDI4Mi41ek0yMDAgMzAwcTAgLTQxIDI5LjUgLTcwLjV0NzAuNSAtMjkuNWg1MDBxNDEgMCA3MC41IDI5LjV0MjkuNSA3MC41djUwMHEwIDQxIC0yOS41IDcwLjV0LTcwLjUgMjkuNSBoLTUwMHEtNDEgMCAtNzAuNSAtMjkuNXQtMjkuNSAtNzAuNXYtNTAwek00MDAgMzAwbDMzMyAyNTBsLTMzMyAyNTB2LTUwMHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTE1OTsiIGQ9Ik0wIDQwMHYzMDBxMCAxNjMgMTE3LjUgMjgxLjV0MjgyLjUgMTE4LjVoMzAwcTE2MyAwIDI4MS41IC0xMTl0MTE4LjUgLTI4MXYtMzAwcTAgLTE2NSAtMTE3LjUgLTI4Mi41dC0yODIuNSAtMTE3LjVoLTMwMHEtMTY1IDAgLTI4Mi41IDExNy41dC0xMTcuNSAyODIuNXpNMjAwIDMwMHEwIC00MSAyOS41IC03MC41dDcwLjUgLTI5LjVoNTAwcTQxIDAgNzAuNSAyOS41dDI5LjUgNzAuNXY1MDBxMCA0MSAtMjkuNSA3MC41dC03MC41IDI5LjUgaC01MDBxLTQxIDAgLTcwLjUgLTI5LjV0LTI5LjUgLTcwLjV2LTUwMHpNMzAwIDcwMGwyNTAgLTMzM2wyNTAgMzMzaC01MDB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxNjA7IiBkPSJNMCA0MDB2MzAwcTAgMTY1IDExNy41IDI4Mi41dDI4Mi41IDExNy41aDMwMHExNjUgMCAyODIuNSAtMTE3LjV0MTE3LjUgLTI4Mi41di0zMDBxMCAtMTYyIC0xMTguNSAtMjgxdC0yODEuNSAtMTE5aC0zMDBxLTE2NSAwIC0yODIuNSAxMTguNXQtMTE3LjUgMjgxLjV6TTIwMCAzMDBxMCAtNDEgMjkuNSAtNzAuNXQ3MC41IC0yOS41aDUwMHE0MSAwIDcwLjUgMjkuNXQyOS41IDcwLjV2NTAwcTAgNDEgLTI5LjUgNzAuNXQtNzAuNSAyOS41IGgtNTAwcS00MSAwIC03MC41IC0yOS41dC0yOS41IC03MC41di01MDB6TTMwMCA0MDBoNTAwbC0yNTAgMzMzeiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMTYxOyIgZD0iTTAgNDAwdjMwMGgzMDB2MjAwbDQwMCAtMzUwbC00MDAgLTM1MHYyMDBoLTMwMHpNNTAwIDB2MjAwaDUwMHE0MSAwIDcwLjUgMjkuNXQyOS41IDcwLjV2NTAwcTAgNDEgLTI5LjUgNzAuNXQtNzAuNSAyOS41aC01MDB2MjAwaDQwMHExNjUgMCAyODIuNSAtMTE3LjV0MTE3LjUgLTI4Mi41di0zMDBxMCAtMTY1IC0xMTcuNSAtMjgyLjV0LTI4Mi41IC0xMTcuNWgtNDAweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMTYyOyIgZD0iTTIxNiA1MTlxMTAgLTE5IDMyIC0xOWgzMDJxLTE1NSAtNDM4IC0xNjAgLTQ1OHEtNSAtMjEgNCAtMzJsOSAtOGw5IC0xcTEzIDAgMjYgMTZsNTM4IDYzMHExNSAxOSA2IDM2cS04IDE4IC0zMiAxNmgtMzAwcTEgNCA3OCAyMTkuNXQ3OSAyMjcuNXEyIDE3IC02IDI3bC04IDhoLTlxLTE2IDAgLTI1IC0xNXEtNCAtNSAtOTguNSAtMTExLjV0LTIyOCAtMjU3dC0yMDkuNSAtMjM4LjVxLTE3IC0xOSAtNyAtNDB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxNjM7IiBkPSJNMCA0MDBxMCAtMTY1IDExNy41IC0yODIuNXQyODIuNSAtMTE3LjVoMzAwcTQ3IDAgMTAwIDE1djE4NWgtNTAwcS00MSAwIC03MC41IDI5LjV0LTI5LjUgNzAuNXY1MDBxMCA0MSAyOS41IDcwLjV0NzAuNSAyOS41aDUwMHYxODVxLTE0IDQgLTExNCA3LjV0LTE5MyA1LjVsLTkzIDJxLTE2NSAwIC0yODIuNSAtMTE3LjV0LTExNy41IC0yODIuNXYtMzAwek02MDAgNDAwdjMwMGgzMDB2MjAwbDQwMCAtMzUwbC00MDAgLTM1MHYyMDBoLTMwMHogIiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxNjQ7IiBkPSJNMCA0MDBxMCAtMTY1IDExNy41IC0yODIuNXQyODIuNSAtMTE3LjVoMzAwcTE2MyAwIDI4MS41IDExNy41dDExOC41IDI4Mi41djk4bC03OCA3M2wtMTIyIC0xMjN2LTE0OHEwIC00MSAtMjkuNSAtNzAuNXQtNzAuNSAtMjkuNWgtNTAwcS00MSAwIC03MC41IDI5LjV0LTI5LjUgNzAuNXY1MDBxMCA0MSAyOS41IDcwLjV0NzAuNSAyOS41aDE1NmwxMTggMTIybC03NCA3OGgtMTAwcS0xNjUgMCAtMjgyLjUgLTExNy41dC0xMTcuNSAtMjgyLjUgdi0zMDB6TTQ5NiA3MDlsMzUzIDM0MmwtMTQ5IDE0OWg1MDB2LTUwMGwtMTQ5IDE0OWwtMzQyIC0zNTN6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxNjU7IiBkPSJNNCA2MDBxMCAxNjIgODAgMjk5dDIxNyAyMTd0Mjk5IDgwdDI5OSAtODB0MjE3IC0yMTd0ODAgLTI5OXQtODAgLTI5OXQtMjE3IC0yMTd0LTI5OSAtODB0LTI5OSA4MHQtMjE3IDIxN3QtODAgMjk5ek0xODYgNjAwcTAgLTE3MSAxMjEuNSAtMjkyLjV0MjkyLjUgLTEyMS41dDI5Mi41IDEyMS41dDEyMS41IDI5Mi41dC0xMjEuNSAyOTIuNXQtMjkyLjUgMTIxLjV0LTI5Mi41IC0xMjEuNXQtMTIxLjUgLTI5Mi41ek00MDYgNjAwIHEwIDgwIDU3IDEzN3QxMzcgNTd0MTM3IC01N3Q1NyAtMTM3dC01NyAtMTM3dC0xMzcgLTU3dC0xMzcgNTd0LTU3IDEzN3oiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTE2NjsiIGQ9Ik0wIDB2Mjc1cTAgMTEgNyAxOHQxOCA3aDEwNDhxMTEgMCAxOSAtNy41dDggLTE3LjV2LTI3NWgtMTEwMHpNMTAwIDgwMGw0NDUgLTUwMGw0NTAgNTAwaC0yOTV2NDAwaC0zMDB2LTQwMGgtMzAwek05MDAgMTUwaDEwMHY1MGgtMTAwdi01MHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTE2NzsiIGQ9Ik0wIDB2Mjc1cTAgMTEgNyAxOHQxOCA3aDEwNDhxMTEgMCAxOSAtNy41dDggLTE3LjV2LTI3NWgtMTEwMHpNMTAwIDcwMGgzMDB2LTMwMGgzMDB2MzAwaDI5NWwtNDQ1IDUwMHpNOTAwIDE1MGgxMDB2NTBoLTEwMHYtNTB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxNjg7IiBkPSJNMCAwdjI3NXEwIDExIDcgMTh0MTggN2gxMDQ4cTExIDAgMTkgLTcuNXQ4IC0xNy41di0yNzVoLTExMDB6TTEwMCA3MDVsMzA1IC0zMDVsNTk2IDU5NmwtMTU0IDE1NWwtNDQyIC00NDJsLTE1MCAxNTF6TTkwMCAxNTBoMTAwdjUwaC0xMDB2LTUweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMTY5OyIgZD0iTTAgMHYyNzVxMCAxMSA3IDE4dDE4IDdoMTA0OHExMSAwIDE5IC03LjV0OCAtMTcuNXYtMjc1aC0xMTAwek0xMDAgOTg4bDk3IC05OGwyMTIgMjEzbC05NyA5N3pNMjAwIDQwMWg3MDB2Njk5bC0yNTAgLTIzOWwtMTQ5IDE0OWwtMjEyIC0yMTJsMTQ5IC0xNDl6TTkwMCAxNTBoMTAwdjUwaC0xMDB2LTUweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMTcwOyIgZD0iTTAgMHYyNzVxMCAxMSA3IDE4dDE4IDdoMTA0OHExMSAwIDE5IC03LjV0OCAtMTcuNXYtMjc1aC0xMTAwek0yMDAgNjEybDIxMiAtMjEybDk4IDk3bC0yMTMgMjEyek0zMDAgMTIwMGwyMzkgLTI1MGwtMTQ5IC0xNDlsMjEyIC0yMTJsMTQ5IDE0OGwyNDggLTIzN3Y3MDBoLTY5OXpNOTAwIDE1MGgxMDB2NTBoLTEwMHYtNTB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxNzE7IiBkPSJNMjMgNDE1bDExNzcgNzg0di0xMDc5bC00NzUgMjcybC0zMTAgLTM5M3Y0MTZoLTM5MnpNNDk0IDIxMGw2NzIgOTM4bC02NzIgLTcxMnYtMjI2eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMTcyOyIgZD0iTTAgMTUwdjEwMDBxMCAyMCAxNC41IDM1dDM1LjUgMTVoMjUwdi0zMDBoNTAwdjMwMGgxMDBsMjAwIC0yMDB2LTg1MHEwIC0yMSAtMTUgLTM1LjV0LTM1IC0xNC41aC0xNTB2NDAwaC03MDB2LTQwMGgtMTUwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXpNNjAwIDEwMDBoMTAwdjIwMGgtMTAwdi0yMDB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxNzM7IiBkPSJNMCAxNTB2MTAwMHEwIDIwIDE0LjUgMzV0MzUuNSAxNWgyNTB2LTMwMGg1MDB2MzAwaDEwMGwyMDAgLTIwMHYtMjE4bC0yNzYgLTI3NWwtMTIwIDEyMGwtMTI2IC0xMjdoLTM3OHYtNDAwaC0xNTBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41ek01ODEgMzA2bDEyMyAxMjNsMTIwIC0xMjBsMzUzIDM1MmwxMjMgLTEyM2wtNDc1IC00NzZ6TTYwMCAxMDAwaDEwMHYyMDBoLTEwMHYtMjAweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMTc0OyIgZD0iTTAgMTUwdjEwMDBxMCAyMCAxNC41IDM1dDM1LjUgMTVoMjUwdi0zMDBoNTAwdjMwMGgxMDBsMjAwIC0yMDB2LTI2OWwtMTAzIC0xMDNsLTE3MCAxNzBsLTI5OCAtMjk4aC0zMjl2LTQwMGgtMTUwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXpNNjAwIDEwMDBoMTAwdjIwMGgtMTAwdi0yMDB6TTcwMCAxMzNsMTcwIDE3MGwtMTcwIDE3MGwxMjcgMTI3bDE3MCAtMTcwbDE3MCAxNzBsMTI3IC0xMjhsLTE3MCAtMTY5bDE3MCAtMTcwIGwtMTI3IC0xMjdsLTE3MCAxNzBsLTE3MCAtMTcweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMTc1OyIgZD0iTTAgMTUwdjEwMDBxMCAyMCAxNC41IDM1dDM1LjUgMTVoMjUwdi0zMDBoNTAwdjMwMGgxMDBsMjAwIC0yMDB2LTMwMGgtNDAwdi0yMDBoLTUwMHYtNDAwaC0xNTBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41ek02MDAgMzAwbDMwMCAtMzAwbDMwMCAzMDBoLTIwMHYzMDBoLTIwMHYtMzAwaC0yMDB6TTYwMCAxMDAwdjIwMGgxMDB2LTIwMGgtMTAweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMTc2OyIgZD0iTTAgMTUwdjEwMDBxMCAyMCAxNC41IDM1dDM1LjUgMTVoMjUwdi0zMDBoNTAwdjMwMGgxMDBsMjAwIC0yMDB2LTQwMmwtMjAwIDIwMGwtMjk4IC0yOThoLTQwMnYtNDAwaC0xNTBxLTIxIDAgLTM1LjUgMTQuNXQtMTQuNSAzNS41ek02MDAgMzAwaDIwMHYtMzAwaDIwMHYzMDBoMjAwbC0zMDAgMzAwek02MDAgMTAwMHYyMDBoMTAwdi0yMDBoLTEwMHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTE3NzsiIGQ9Ik0wIDI1MHEwIC0yMSAxNC41IC0zNS41dDM1LjUgLTE0LjVoMTEwMHEyMSAwIDM1LjUgMTQuNXQxNC41IDM1LjV2NTUwaC0xMjAwdi01NTB6TTAgOTAwaDEyMDB2MTUwcTAgMjEgLTE0LjUgMzUuNXQtMzUuNSAxNC41aC0xMTAwcS0yMSAwIC0zNS41IC0xNC41dC0xNC41IC0zNS41di0xNTB6TTEwMCAzMDB2MjAwaDQwMHYtMjAwaC00MDB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxNzg7IiBkPSJNMCA0MDBsMzAwIDI5OHYtMTk4aDQwMHYtMjAwaC00MDB2LTE5OHpNMTAwIDgwMHYyMDBoMTAwdi0yMDBoLTEwMHpNMzAwIDgwMHYyMDBoMTAwdi0yMDBoLTEwMHpNNTAwIDgwMHYyMDBoNDAwdjE5OGwzMDAgLTI5OGwtMzAwIC0yOTh2MTk4aC00MDB6TTgwMCAzMDB2MjAwaDEwMHYtMjAwaC0xMDB6TTEwMDAgMzAwaDEwMHYyMDBoLTEwMHYtMjAweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMTc5OyIgZD0iTTEwMCA3MDB2NDAwbDUwIDEwMGw1MCAtMTAwdi0zMDBoMTAwdjMwMGw1MCAxMDBsNTAgLTEwMHYtMzAwaDEwMHYzMDBsNTAgMTAwbDUwIC0xMDB2LTQwMGwtMTAwIC0yMDN2LTQ0N3EwIC0yMSAtMTQuNSAtMzUuNXQtMzUuNSAtMTQuNWgtMjAwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXY0NDd6TTgwMCA1OTdxMCAtMjkgMTAuNSAtNTUuNXQyNSAtNDN0MjkgLTI4LjV0MjUuNSAtMThsMTAgLTV2LTM5N3EwIC0yMSAxNC41IC0zNS41IHQzNS41IC0xNC41aDIwMHEyMSAwIDM1LjUgMTQuNXQxNC41IDM1LjV2MTEwNnEwIDMxIC0xOCA0MC41dC00NCAtNy41bC0yNzYgLTExN3EtMjUgLTE2IC00My41IC01MC41dC0xOC41IC02NS41di0zNTl6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxODA7IiBkPSJNMTAwIDBoNDAwdjU2cS03NSAwIC04Ny41IDZ0LTEyLjUgNDR2Mzk0aDUwMHYtMzk0cTAgLTM4IC0xMi41IC00NHQtODcuNSAtNnYtNTZoNDAwdjU2cS00IDAgLTExIDAuNXQtMjQgM3QtMzAgN3QtMjQgMTV0LTExIDI0LjV2ODg4cTAgMjIgMjUgMzQuNXQ1MCAxMy41bDI1IDJ2NTZoLTQwMHYtNTZxNzUgMCA4Ny41IC02dDEyLjUgLTQ0di0zOTRoLTUwMHYzOTRxMCAzOCAxMi41IDQ0dDg3LjUgNnY1NmgtNDAwdi01NnE0IDAgMTEgLTAuNSB0MjQgLTN0MzAgLTd0MjQgLTE1dDExIC0yNC41di04ODhxMCAtMjIgLTI1IC0zNC41dC01MCAtMTMuNWwtMjUgLTJ2LTU2eiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMTgxOyIgZD0iTTAgMzAwcTAgLTQxIDI5LjUgLTcwLjV0NzAuNSAtMjkuNWgzMDBxNDEgMCA3MC41IDI5LjV0MjkuNSA3MC41djUwMHEwIDQxIC0yOS41IDcwLjV0LTcwLjUgMjkuNWgtMzAwcS00MSAwIC03MC41IC0yOS41dC0yOS41IC03MC41di01MDB6TTEwMCAxMDBoNDAwbDIwMCAyMDBoMTA1bDI5NSA5OHYtMjk4aC00MjVsLTEwMCAtMTAwaC0zNzV6TTEwMCAzMDB2MjAwaDMwMHYtMjAwaC0zMDB6TTEwMCA2MDB2MjAwaDMwMHYtMjAwaC0zMDB6IE0xMDAgMTAwMGg0MDBsMjAwIC0yMDB2LTk4bDI5NSA5OGgxMDV2MjAwaC00MjVsLTEwMCAxMDBoLTM3NXpNNzAwIDQwMnYxNjNsNDAwIDEzM3YtMTYzeiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMTgyOyIgZD0iTTE2LjUgOTc0LjVxMC41IC0yMS41IDE2IC05MHQ0Ni41IC0xNDB0MTA0IC0xNzcuNXQxNzUgLTIwOHExMDMgLTEwMyAyMDcuNSAtMTc2dDE4MCAtMTAzLjV0MTM3IC00N3Q5Mi41IC0xNi41bDMxIDFsMTYzIDE2MnExNiAxNyAxMyA0MC41dC0yMiAzNy41bC0xOTIgMTM2cS0xOSAxNCAtNDUgMTJ0LTQyIC0xOWwtMTE5IC0xMThxLTE0MyAxMDMgLTI2NyAyMjdxLTEyNiAxMjYgLTIyNyAyNjhsMTE4IDExOHExNyAxNyAyMCA0MS41IHQtMTEgNDQuNWwtMTM5IDE5NHEtMTQgMTkgLTM2LjUgMjJ0LTQwLjUgLTE0bC0xNjIgLTE2MnEtMSAtMTEgLTAuNSAtMzIuNXoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTE4MzsiIGQ9Ik0wIDUwdjIxMnEwIDIwIDEwLjUgNDUuNXQyNC41IDM5LjVsMzY1IDMwM3Y1MHEwIDQgMSAxMC41dDEyIDIyLjV0MzAgMjguNXQ2MCAyM3Q5NyAxMC41dDk3IC0xMHQ2MCAtMjMuNXQzMCAtMjcuNXQxMiAtMjRsMSAtMTB2LTUwbDM2NSAtMzAzcTE0IC0xNCAyNC41IC0zOS41dDEwLjUgLTQ1LjV2LTIxMnEwIC0yMSAtMTUgLTM1LjV0LTM1IC0xNC41aC0xMTAwcS0yMSAwIC0zNS41IDE0LjV0LTE0LjUgMzUuNXpNMCA3MTIgcTAgLTIxIDE0LjUgLTMzLjV0MzQuNSAtOC41bDIwMiAzM3EyMCA0IDM0LjUgMjF0MTQuNSAzOHYxNDZxMTQxIDI0IDMwMCAyNHQzMDAgLTI0di0xNDZxMCAtMjEgMTQuNSAtMzh0MzQuNSAtMjFsMjAyIC0zM3EyMCAtNCAzNC41IDguNXQxNC41IDMzLjV2MjAwcS02IDggLTE5IDIwLjV0LTYzIDQ1dC0xMTIgNTd0LTE3MSA0NXQtMjM1IDIwLjVxLTkyIDAgLTE3NSAtMTAuNXQtMTQxLjUgLTI3dC0xMDguNSAtMzYuNXQtODEuNSAtNDAgdC01My41IC0zNi41dC0zMSAtMjcuNWwtOSAtMTB2LTIwMHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTE4NDsiIGQ9Ik0xMDAgMHYxMDBoMTEwMHYtMTAwaC0xMTAwek0xNzUgMjAwaDk1MGwtMTI1IDE1MHYyNTBsMTAwIDEwMHY0MDBoLTEwMHYtMjAwaC0xMDB2MjAwaC0yMDB2LTIwMGgtMTAwdjIwMGgtMjAwdi0yMDBoLTEwMHYyMDBoLTEwMHYtNDAwbDEwMCAtMTAwdi0yNTB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxODU7IiBkPSJNMTAwIDBoMzAwdjQwMHEwIDQxIC0yOS41IDcwLjV0LTcwLjUgMjkuNWgtMTAwcS00MSAwIC03MC41IC0yOS41dC0yOS41IC03MC41di00MDB6TTUwMCAwdjEwMDBxMCA0MSAyOS41IDcwLjV0NzAuNSAyOS41aDEwMHE0MSAwIDcwLjUgLTI5LjV0MjkuNSAtNzAuNXYtMTAwMGgtMzAwek05MDAgMHY3MDBxMCA0MSAyOS41IDcwLjV0NzAuNSAyOS41aDEwMHE0MSAwIDcwLjUgLTI5LjV0MjkuNSAtNzAuNXYtNzAwaC0zMDB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxODY7IiBkPSJNLTEwMCAzMDB2NTAwcTAgMTI0IDg4IDIxMnQyMTIgODhoNzAwcTEyNCAwIDIxMiAtODh0ODggLTIxMnYtNTAwcTAgLTEyNCAtODggLTIxMnQtMjEyIC04OGgtNzAwcS0xMjQgMCAtMjEyIDg4dC04OCAyMTJ6TTEwMCAyMDBoOTAwdjcwMGgtOTAwdi03MDB6TTIwMCAzMDBoMzAwdjMwMGgtMjAwdjEwMGgyMDB2MTAwaC0zMDB2LTMwMGgyMDB2LTEwMGgtMjAwdi0xMDB6TTYwMCAzMDBoMjAwdjEwMGgxMDB2MzAwaC0xMDB2MTAwaC0yMDB2LTUwMCB6TTcwMCA0MDB2MzAwaDEwMHYtMzAwaC0xMDB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxODc7IiBkPSJNLTEwMCAzMDB2NTAwcTAgMTI0IDg4IDIxMnQyMTIgODhoNzAwcTEyNCAwIDIxMiAtODh0ODggLTIxMnYtNTAwcTAgLTEyNCAtODggLTIxMnQtMjEyIC04OGgtNzAwcS0xMjQgMCAtMjEyIDg4dC04OCAyMTJ6TTEwMCAyMDBoOTAwdjcwMGgtOTAwdi03MDB6TTIwMCAzMDBoMTAwdjIwMGgxMDB2LTIwMGgxMDB2NTAwaC0xMDB2LTIwMGgtMTAwdjIwMGgtMTAwdi01MDB6TTYwMCAzMDBoMjAwdjEwMGgxMDB2MzAwaC0xMDB2MTAwaC0yMDB2LTUwMCB6TTcwMCA0MDB2MzAwaDEwMHYtMzAwaC0xMDB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxODg7IiBkPSJNLTEwMCAzMDB2NTAwcTAgMTI0IDg4IDIxMnQyMTIgODhoNzAwcTEyNCAwIDIxMiAtODh0ODggLTIxMnYtNTAwcTAgLTEyNCAtODggLTIxMnQtMjEyIC04OGgtNzAwcS0xMjQgMCAtMjEyIDg4dC04OCAyMTJ6TTEwMCAyMDBoOTAwdjcwMGgtOTAwdi03MDB6TTIwMCAzMDBoMzAwdjEwMGgtMjAwdjMwMGgyMDB2MTAwaC0zMDB2LTUwMHpNNjAwIDMwMGgzMDB2MTAwaC0yMDB2MzAwaDIwMHYxMDBoLTMwMHYtNTAweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMTg5OyIgZD0iTS0xMDAgMzAwdjUwMHEwIDEyNCA4OCAyMTJ0MjEyIDg4aDcwMHExMjQgMCAyMTIgLTg4dDg4IC0yMTJ2LTUwMHEwIC0xMjQgLTg4IC0yMTJ0LTIxMiAtODhoLTcwMHEtMTI0IDAgLTIxMiA4OHQtODggMjEyek0xMDAgMjAwaDkwMHY3MDBoLTkwMHYtNzAwek0yMDAgNTUwbDMwMCAtMTUwdjMwMHpNNjAwIDQwMGwzMDAgMTUwbC0zMDAgMTUwdi0zMDB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxOTA7IiBkPSJNLTEwMCAzMDB2NTAwcTAgMTI0IDg4IDIxMnQyMTIgODhoNzAwcTEyNCAwIDIxMiAtODh0ODggLTIxMnYtNTAwcTAgLTEyNCAtODggLTIxMnQtMjEyIC04OGgtNzAwcS0xMjQgMCAtMjEyIDg4dC04OCAyMTJ6TTEwMCAyMDBoOTAwdjcwMGgtOTAwdi03MDB6TTIwMCAzMDB2NTAwaDcwMHYtNTAwaC03MDB6TTMwMCA0MDBoMTMwcTQxIDAgNjggNDJ0MjcgMTA3dC0yOC41IDEwOHQtNjYuNSA0M2gtMTMwdi0zMDB6TTU3NSA1NDkgcTAgLTY1IDI3IC0xMDd0NjggLTQyaDEzMHYzMDBoLTEzMHEtMzggMCAtNjYuNSAtNDN0LTI4LjUgLTEwOHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTE5MTsiIGQ9Ik0tMTAwIDMwMHY1MDBxMCAxMjQgODggMjEydDIxMiA4OGg3MDBxMTI0IDAgMjEyIC04OHQ4OCAtMjEydi01MDBxMCAtMTI0IC04OCAtMjEydC0yMTIgLTg4aC03MDBxLTEyNCAwIC0yMTIgODh0LTg4IDIxMnpNMTAwIDIwMGg5MDB2NzAwaC05MDB2LTcwMHpNMjAwIDMwMGgzMDB2MzAwaC0yMDB2MTAwaDIwMHYxMDBoLTMwMHYtMzAwaDIwMHYtMTAwaC0yMDB2LTEwMHpNNjAxIDMwMGgxMDB2MTAwaC0xMDB2LTEwMHpNNzAwIDcwMGgxMDAgdi00MDBoMTAwdjUwMGgtMjAwdi0xMDB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxOTI7IiBkPSJNLTEwMCAzMDB2NTAwcTAgMTI0IDg4IDIxMnQyMTIgODhoNzAwcTEyNCAwIDIxMiAtODh0ODggLTIxMnYtNTAwcTAgLTEyNCAtODggLTIxMnQtMjEyIC04OGgtNzAwcS0xMjQgMCAtMjEyIDg4dC04OCAyMTJ6TTEwMCAyMDBoOTAwdjcwMGgtOTAwdi03MDB6TTIwMCAzMDBoMzAwdjQwMGgtMjAwdjEwMGgtMTAwdi01MDB6TTMwMSA0MDB2MjAwaDEwMHYtMjAwaC0xMDB6TTYwMSAzMDBoMTAwdjEwMGgtMTAwdi0xMDB6TTcwMCA3MDBoMTAwIHYtNDAwaDEwMHY1MDBoLTIwMHYtMTAweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMTkzOyIgZD0iTS0xMDAgMzAwdjUwMHEwIDEyNCA4OCAyMTJ0MjEyIDg4aDcwMHExMjQgMCAyMTIgLTg4dDg4IC0yMTJ2LTUwMHEwIC0xMjQgLTg4IC0yMTJ0LTIxMiAtODhoLTcwMHEtMTI0IDAgLTIxMiA4OHQtODggMjEyek0xMDAgMjAwaDkwMHY3MDBoLTkwMHYtNzAwek0yMDAgNzAwdjEwMGgzMDB2LTMwMGgtOTl2LTEwMGgtMTAwdjEwMGg5OXYyMDBoLTIwMHpNMjAxIDMwMHYxMDBoMTAwdi0xMDBoLTEwMHpNNjAxIDMwMHYxMDBoMTAwdi0xMDBoLTEwMHogTTcwMCA3MDB2MTAwaDIwMHYtNTAwaC0xMDB2NDAwaC0xMDB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxOTQ7IiBkPSJNNCA2MDBxMCAxNjIgODAgMjk5dDIxNyAyMTd0Mjk5IDgwdDI5OSAtODB0MjE3IC0yMTd0ODAgLTI5OXQtODAgLTI5OXQtMjE3IC0yMTd0LTI5OSAtODB0LTI5OSA4MHQtMjE3IDIxN3QtODAgMjk5ek0xODYgNjAwcTAgLTE3MSAxMjEuNSAtMjkyLjV0MjkyLjUgLTEyMS41dDI5Mi41IDEyMS41dDEyMS41IDI5Mi41dC0xMjEuNSAyOTIuNXQtMjkyLjUgMTIxLjV0LTI5Mi41IC0xMjEuNXQtMTIxLjUgLTI5Mi41ek00MDAgNTAwdjIwMCBsMTAwIDEwMGgzMDB2LTEwMGgtMzAwdi0yMDBoMzAwdi0xMDBoLTMwMHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTE5NTsiIGQ9Ik0wIDYwMHEwIDE2MiA4MCAyOTl0MjE3IDIxN3QyOTkgODB0Mjk5IC04MHQyMTcgLTIxN3Q4MCAtMjk5dC04MCAtMjk5dC0yMTcgLTIxN3QtMjk5IC04MHQtMjk5IDgwdC0yMTcgMjE3dC04MCAyOTl6TTE4MiA2MDBxMCAtMTcxIDEyMS41IC0yOTIuNXQyOTIuNSAtMTIxLjV0MjkyLjUgMTIxLjV0MTIxLjUgMjkyLjV0LTEyMS41IDI5Mi41dC0yOTIuNSAxMjEuNXQtMjkyLjUgLTEyMS41dC0xMjEuNSAtMjkyLjV6TTQwMCA0MDB2NDAwaDMwMCBsMTAwIC0xMDB2LTEwMGgtMTAwdjEwMGgtMjAwdi0xMDBoMjAwdi0xMDBoLTIwMHYtMTAwaC0xMDB6TTcwMCA0MDB2MTAwaDEwMHYtMTAwaC0xMDB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxOTc7IiBkPSJNLTE0IDQ5NHEwIC04MCA1Ni41IC0xMzd0MTM1LjUgLTU3aDIyMnYzMDBoNDAwdi0zMDBoMTI4cTEyMCAwIDIwNSA4NnQ4NSAyMDhxMCAxMjAgLTg1IDIwNi41dC0yMDUgODYuNXEtNDYgMCAtOTAgLTE0cS00NCA5NyAtMTM0LjUgMTU2LjV0LTIwMC41IDU5LjVxLTE1MiAwIC0yNjAgLTEwNy41dC0xMDggLTI2MC41cTAgLTI1IDIgLTM3cS02NiAtMTQgLTEwOC41IC02Ny41dC00Mi41IC0xMjIuNXpNMzAwIDIwMGgyMDB2MzAwaDIwMHYtMzAwIGgyMDBsLTMwMCAtMzAweiIgLz4KKzxnbHlwaCB1bmljb2RlPSImI3hlMTk4OyIgZD0iTS0xNCA0OTRxMCAtODAgNTYuNSAtMTM3dDEzNS41IC01N2g4bDQxNCA0MTRsNDAzIC00MDNxOTQgMjYgMTU0LjUgMTA0dDYwLjUgMTc4cTAgMTIxIC04NSAyMDcuNXQtMjA1IDg2LjVxLTQ2IDAgLTkwIC0xNHEtNDQgOTcgLTEzNC41IDE1Ni41dC0yMDAuNSA1OS41cS0xNTIgMCAtMjYwIC0xMDcuNXQtMTA4IC0yNjAuNXEwIC0yNSAyIC0zN3EtNjYgLTE0IC0xMDguNSAtNjcuNXQtNDIuNSAtMTIyLjV6TTMwMCAyMDBsMzAwIDMwMCBsMzAwIC0zMDBoLTIwMHYtMzAwaC0yMDB2MzAwaC0yMDB6IiAvPgorPGdseXBoIHVuaWNvZGU9IiYjeGUxOTk7IiBkPSJNMTAwIDIwMGg0MDB2LTE1NWwtNzUgLTQ1aDM1MGwtNzUgNDV2MTU1aDQwMGwtMjcwIDMwMGgxNzBsLTI3MCAzMDBoMTcwbC0zMDAgMzMzbC0zMDAgLTMzM2gxNzBsLTI3MCAtMzAwaDE3MHoiIC8+Cis8Z2x5cGggdW5pY29kZT0iJiN4ZTIwMDsiIGQ9Ik0xMjEgNzAwcTAgLTUzIDI4LjUgLTk3dDc1LjUgLTY1cS00IC0xNiAtNCAtMzhxMCAtNzQgNTIuNSAtMTI2LjV0MTI2LjUgLTUyLjVxNTYgMCAxMDAgMzB2LTMwNmwtNzUgLTQ1aDM1MGwtNzUgNDV2MzA2cTQ2IC0zMCAxMDAgLTMwcTc0IDAgMTI2LjUgNTIuNXQ1Mi41IDEyNi41cTAgMjQgLTkgNTVxNTAgMzIgNzkuNSA4M3QyOS41IDExMnEwIDkwIC02MS41IDE1NS41dC0xNTAuNSA3MS41cS0yNiA4OSAtOTkuNSAxNDUuNSB0LTE2Ny41IDU2LjVxLTExNiAwIC0xOTcuNSAtODEuNXQtODEuNSAtMTk3LjVxMCAtNCAxIC0xMnQxIC0xMXEtMTQgMiAtMjMgMnEtNzQgMCAtMTI2LjUgLTUyLjV0LTUyLjUgLTEyNi41eiIgLz4KKzwvZm9udD4KKzwvZGVmcz48L3N2Zz4gClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9mb250cy9nbHlwaGljb25zLWhhbGZsaW5ncy1yZWd1bGFyLnR0ZiBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvZm9udHMvZ2x5cGhpY29ucy1oYWxmbGluZ3MtcmVndWxhci50dGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ5OGVmNAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvZm9udHMvZ2x5cGhpY29ucy1oYWxmbGluZ3MtcmVndWxhci50dGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9mb250cy9nbHlwaGljb25zLWhhbGZsaW5ncy1yZWd1bGFyLndvZmYgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2ZvbnRzL2dseXBoaWNvbnMtaGFsZmxpbmdzLXJlZ3VsYXIud29mZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODNjNTM5Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9mb250cy9nbHlwaGljb25zLWhhbGZsaW5ncy1yZWd1bGFyLndvZmYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9odG1sL2xheWVyX2RlcHNfbW9kYWwuaHRtbCBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvaHRtbC9sYXllcl9kZXBzX21vZGFsLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFkYmE0MwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvaHRtbC9sYXllcl9kZXBzX21vZGFsLmh0bWwKQEAgLTAsMCArMSwxNyBAQAorPGRpdiBpZD0iZGVwZW5kZW5jaWVzLW1vZGFsIiBjbGFzcz0ibW9kYWwgaGlkZSBmYWRlIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1oaWRkZW49ImZhbHNlIj4KKyAgPGZvcm0gaWQ9ImRlcGVuZGVuY2llcy1tb2RhbC1mb3JtIj4KKyAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPgorICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzPSJtb2RhbCIgYXJpYS1oaWRkZW49InRydWUiPng8L2J1dHRvbj4KKyAgICAgIDxoMz48c3BhbiBpZD0idGl0bGUiPjwvc3Bhbj4gZGVwZW5kZW5jaWVzPC9oMz4KKyAgICA8L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KKyAgICAgIDxwIGlkPSJib2R5LXRleHQiPiA8c3Ryb25nIGlkPSJsYXllci1uYW1lIj48L3N0cm9uZz4gZGVwZW5kcyBvbiBzb21lIGxheWVycyB0aGF0IGFyZSBub3QgYWRkZWQgdG8geW91ciBwcm9qZWN0LiBTZWxlY3QgdGhlIG9uZXMgeW91IHdhbnQgdG8gYWRkOjwvcD4KKyAgICAgIDx1bCBjbGFzcz0idW5zdHlsZWQiIGlkPSJkZXBlbmRlbmNpZXMtbGlzdCI+CisgICAgICA8L3VsPgorICAgIDwvZGl2PgorICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CisgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiIHR5cGU9InN1Ym1pdCI+QWRkIGxheWVyczwvYnV0dG9uPgorICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIiB0eXBlPSJyZXNldCIgZGF0YS1kaXNtaXNzPSJtb2RhbCI+Q2FuY2VsPC9idXR0b24+CisgICAgPC9kaXY+CisgIDwvZm9ybT4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9pbWcvZ2x5cGhpY29ucy1oYWxmbGluZ3Mtd2hpdGUucG5nIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9pbWcvZ2x5cGhpY29ucy1oYWxmbGluZ3Mtd2hpdGUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZjY0ODQKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2ltZy9nbHlwaGljb25zLWhhbGZsaW5ncy13aGl0ZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9pbWcvZ2x5cGhpY29ucy1oYWxmbGluZ3MucG5nIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9pbWcvZ2x5cGhpY29ucy1oYWxmbGluZ3MucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5OTY5OTkKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2ltZy9nbHlwaGljb25zLWhhbGZsaW5ncy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9pbWcvbG9nby5wbmcgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2ltZy9sb2dvLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWFkNzMzCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9pbWcvbG9nby5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9pbWcvdG9hc3Rlcl9idy5wbmcgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2ltZy90b2FzdGVyX2J3LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDY1OTA3Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9pbWcvdG9hc3Rlcl9idy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9qcXVlcnktdHJlZXRhYmxlLWxpY2Vuc2UvR1BMLUxJQ0VOU0UudHh0IGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9qcXVlcnktdHJlZXRhYmxlLWxpY2Vuc2UvR1BMLUxJQ0VOU0UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2OTI3ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2pxdWVyeS10cmVldGFibGUtbGljZW5zZS9HUEwtTElDRU5TRS50eHQKQEAgLTAsMCArMSwyNzggQEAKKyAgICAgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAgICAgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworICAgICAgICAgIFByZWFtYmxlCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgorZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKK3NvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwordXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQordGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KK3lvdXIgcHJvZ3JhbXMsIHRvby4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90CitwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CitoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCit0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKK2lmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0CitpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgorVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKK2Rpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCitncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKK3lvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCitzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCityaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAorKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKK2Rpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCisKKyAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KK3RoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCitzb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKK3dhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCit0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAorYXV0aG9ycycgcmVwdXRhdGlvbnMuCisKKyAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKK3BhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKK3Byb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKK3Byb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQorcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4KKworICAgICAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCisKKyAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucworYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKK3VuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKK3JlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgorbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKK3RoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCitlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgorbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgordGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCisKK0FjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Citjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCitydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCitpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KK1doZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgorCisgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncworc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Citjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCitjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCitub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7CithbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCithbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgorCitZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKK3lvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCisKKyAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgorb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAorZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCithYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KKworICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgorICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQorICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCisgICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQorICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKKyAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCisgICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCisgICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCisgICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgorICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCisgICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKKyAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCisgICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCisKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KK3dpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCit1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKK1NlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKKyAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKKyAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCisgICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKKyAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCisgICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQorICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCisgICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKKyAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcworICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91CisgICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAorICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQorCitUaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQorY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKK2Fzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bworY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQorc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCithbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQorZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKK29wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50CitpdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCisKK0lmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKK2FjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKK2FjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcworZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorCisgIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQorZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAorb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCit2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCitIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgordGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKK3BhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KKworICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKK3NpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCitkaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKK3Byb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKK21vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKK2FsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKK3RoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCitvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCit0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgorcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgorWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KK3RoaXMgTGljZW5zZS4KKworICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CitpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAorY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKK2Rpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKK21heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKK2xpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKK2FsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgordGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bworcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KKworSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCithbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCithcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgorY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKK3N1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKK2ludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcworaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCitnZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCit0aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAorc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwordG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90CitpbXBvc2UgdGhhdCBjaG9pY2UuCisKK1RoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bworYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCisKKyAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQorbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCit0aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCitjb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKK3RoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCitvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKK2JlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bworYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KK3NwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55CitsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCitlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgordGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbi4KKworICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCit0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcworbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKK29mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKK29mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisgICAgICAgICAgTk8gV0FSUkFOVFkKKworICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKK0ZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgorT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUworUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKK09SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCitUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCitQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKK1JFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKK1dJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKK1JFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCitJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKK09VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKK1RPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQorWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKK1BST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQorUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvanF1ZXJ5LXRyZWV0YWJsZS1saWNlbnNlL01JVC1MSUNFTlNFLnR4dCBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvanF1ZXJ5LXRyZWV0YWJsZS1saWNlbnNlL01JVC1MSUNFTlNFLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmU4MjRmCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9qcXVlcnktdHJlZXRhYmxlLWxpY2Vuc2UvTUlULUxJQ0VOU0UudHh0CkBAIC0wLDAgKzEsMjAgQEAKK0NvcHlyaWdodCAoYykgMjAxMyBMdWRvIHZhbiBkZW4gQm9vbSwgaHR0cDovL2x1ZG92YW5kZW5ib29tLmNvbQorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKK2EgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZword2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCitwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KK3RoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKK2luY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKK0VYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKK05PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKK0xJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KK09GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2pxdWVyeS10cmVldGFibGUtbGljZW5zZS9SRUFETUUubWQgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2pxdWVyeS10cmVldGFibGUtbGljZW5zZS9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNlN2FmYgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvanF1ZXJ5LXRyZWV0YWJsZS1saWNlbnNlL1JFQURNRS5tZApAQCAtMCwwICsxLDIwIEBACisjIGpRdWVyeSB0cmVldGFibGUKKworalF1ZXJ5IHRyZWV0YWJsZSBpcyBhIHBsdWdpbiBmb3IgalF1ZXJ5LCB0aGUgJ1dyaXRlIExlc3MsIERvIE1vcmUsIEphdmFTY3JpcHQKK0xpYnJhcnknLiBXaXRoIHRoaXMgcGx1Z2luIHlvdSBjYW4gZGlzcGxheSBhIHRyZWUgaW4gYW4gSFRNTCB0YWJsZSwgZS5nLiBhCitkaXJlY3Rvcnkgc3RydWN0dXJlIG9yIGEgbmVzdGVkIGxpc3QuIFdoeSBub3QgdXNlIGEgbGlzdCwgeW91IHNheT8gQmVjYXVzZSBsaXN0cworYXJlIGdyZWF0IGZvciBkaXNwbGF5aW5nIGEgdHJlZSwgYW5kIHRhYmxlcyBhcmUgbm90LiBPaCB3YWl0LCBidXQgdGhpcyBwbHVnaW4KK3VzZXMgdGFibGVzLCBkb2Vzbid0IGl0PyBZZXMuIFdoeSBkbyBJIHVzZSBhIHRhYmxlIHRvIGRpc3BsYXkgYSBsaXN0PyBCZWNhdXNlIEkKK25lZWQgbXVsdGlwbGUgY29sdW1ucyB0byBkaXNwbGF5IGFkZGl0aW9uYWwgZGF0YSBiZXNpZGVzIHRoZSB0cmVlLgorCitEb3dubG9hZCB0aGUgbGF0ZXN0IHJlbGVhc2UgZnJvbSB0aGUgalF1ZXJ5IFBsdWdpbiBSZWdpc3RyeSBvciBncmFiIHRoZSBzb3VyY2UKK2NvZGUgZnJvbSBHaXRodWIuIFBsZWFzZSByZXBvcnQgaXNzdWVzIHRocm91Z2ggR2l0aHViIGlzc3Vlcy4gVGhpcyBwbHVnaW4gaXMKK3JlbGVhc2VkIHVuZGVyIGJvdGggdGhlIE1JVCBhbmQgdGhlIEdQTHYyIGxpY2Vuc2UgYnkgTHVkbyB2YW4gZGVuIEJvb20uCisKKyMjIERvY3VtZW50YXRpb24gYW5kIEV4YW1wbGVzCisKK1NlZSBpbmRleC5odG1sIGZvciB0ZWNobmljYWwgZG9jdW1lbnRhdGlvbiBhbmQgZXhhbXBsZXMuIFRoZSBtb3N0IHJlY2VudCB2ZXJzaW9uCitvZiB0aGlzIGRvY3VtZW50IGlzIGFsc28gYXZhaWxhYmxlIG9ubGluZSBhdAoraHR0cDovL2x1ZG8uY3ViaWNwaHVzZS5ubC9qcXVlcnktdHJlZXRhYmxlLiBBbiBBSkFYIGVuYWJsZWQgZXhhbXBsZSBidWlsdCB3aXRoCitSdWJ5IG9uIFJhaWxzIGNhbiBiZSBmb3VuZCBhdAoraHR0cHM6Ly9naXRodWIuY29tL2x1ZG8vanF1ZXJ5LXRyZWV0YWJsZS1hamF4LWV4YW1wbGUuCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2pxdWVyeS50cmVldGFibGUudGhlbWUudG9hc3Rlci5jc3MgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2pxdWVyeS50cmVldGFibGUudGhlbWUudG9hc3Rlci5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE5NGIyMwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvanF1ZXJ5LnRyZWV0YWJsZS50aGVtZS50b2FzdGVyLmNzcwpAQCAtMCwwICsxLDY2IEBACisvKgordGFibGUudHJlZXRhYmxlIHsKKyAgYm9yZGVyOiAxcHggc29saWQgIzg4ODsgCisgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CisgIGZvbnQtc2l6ZTogLjhlbTsKKyAgbGluZS1oZWlnaHQ6IDE7CisgIG1hcmdpbjogLjZlbSAwIDEuOGVtIDA7CisgIHdpZHRoOiAxMDAlOworfQorCit0YWJsZS50cmVldGFibGUgY2FwdGlvbiB7CisgIGZvbnQtc2l6ZTogLjllbTsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIG1hcmdpbi1ib3R0b206IC4yZW07Cit9CisKK3RhYmxlLnRyZWV0YWJsZSB0Ym9keSB0ciB0ZCB7CisgIGN1cnNvcjogZGVmYXVsdDsKKyAgcGFkZGluZzogLjNlbSAxZW07Cit9CisKK3RhYmxlLnRyZWV0YWJsZSBzcGFuIHsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIGxlZnQ7CisgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CisgIHBhZGRpbmc6IC4yZW0gMCAuMmVtIDEuNWVtOworfQorKi8KKwordGFibGUudHJlZXRhYmxlIHNwYW4uZmlsZSB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVFBQUFDMStqZnFBQUFBQkdkQlRVRUFBSy9JTndXSzZRQUFBQmwwUlZoMFUyOW1kSGRoY21VQVFXUnZZbVVnU1cxaFoyVlNaV0ZrZVhISlpUd0FBQURvU1VSQlZCZ1pCY0V4YmxOQkdBYkEyY2VlZ1RSQnVJS09naWloU1pOVGNDNUxVSEFpaE5KUjBrR0tDRGNZSlk2RDMvNzdNZE9pblR2ekFnQ3c4eXNUaEl2bi9Wb2pJeU1qSXlQUCtiUzFzVVFJVjJzOTVwQkREdm1iUC9tZGtmdDgzdHBZZ3VacTVKaC9PZWFZaCt5enk4aFRIdk5sYXhOTmN6bStsYTlPVGxhcjFVZEEvK0MyQTR0clJDbkQzalM4QkIxb2JxMkdrNkdVNlFiUUFTNEJVYVlTUUFmNGJoaEtLVEZkQXpyQU93QXhFVUFIK0tFTTAxU1kzZ002d0JzRUFRQjBnSittYVpvQzNnSTZpUFlhQUlCSnNpUm1IVTBBQUxPZUZDM2FLMmNXQUFDVVhlNytBd08wbGM5ZVRIWVRBQUFBQUVsRlRrU3VRbUNDKTsKK30KKwordGFibGUudHJlZXRhYmxlIHNwYW4uZm9sZGVyIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUFCR2RCVFVFQUFLL0lOd1dLNlFBQUFCbDBSVmgwVTI5bWRIZGhjbVVBUVdSdlltVWdTVzFoWjJWU1pXRmtlWEhKWlR3QUFBR3JTVVJCVkRqTHhaTzdpaFJCRklhLzZ1MFpXN0dIQlVWMFVRUVRaemQzUWRoTVF4T2Z3TVJYRUFOQk1OUVgwTXpBekZBd0V6SHdBUmJORkRkd0VkMzFNajNYN2E2dU9yOUJ0ek5qWWpLQko2bmljUDd2M0txY0pGYXhoQlZ0WlVBSzhPSGxsZDJzdDdYbDNESlBWT05QK3pFVVY0SHFMNVVEWUhyNXh2dVFBamdsL1FzN1R6dk9PVkFqeGpsQytlUFN3ZTZEZmJWZWdMVnVUNHIxNGVUcjZ6dkE4eFNBb0JMeng2cHZqNGwrRFpJZXp1VmtHOWZZMkg3WVJRSU1aSUJ3eWNtekgxL3MzRjhBYXBmSVBORjNrUWs3K2t3OVBXQnkrSVpPZGc1VWczbWtBQVR5L3QwdXNvdnpHZUNVV1RqQ3owQitTajBla2ZkdmtaM2FiQnYrVTRHYUN0SjFpRW02QU5RSjZmRXpyRy9lbmdjS3cvd1hRdkVLeFNFS1F4UkdLRTdJenQrRFNpd0JKTVVTbTcxcmd1TVloUUtyQnlnT0lSU3RmNFRpRkZSQnZiUkdLaVFMV1AyOXlSU0hLQlR0ZmRCbUhzMEJVcGd2dGdGNHlSRlIrTlVLaTBYWmNZakNlQ0cyc21rekxBSGtiUkJtUDAvVWsyNk81WW5VQWN0QnAxR3NBSStTNW5SSkpKYWw1SzFhQU1ycTBkNlRtOXVJNnpqeWY3NWRBZTZ0eC9Tc1dlRC8vbzIvQWI2SUgzL2gyNXBPQUFBQUFFbEZUa1N1UW1DQyk7Cit9CisKK3RhYmxlLnRyZWV0YWJsZSB0ci5jb2xsYXBzZWQgc3Bhbi5pbmRlbnRlciBhIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUFDWEJJV1hNQUFBc1RBQUFMRXdFQW1wd1lBQUFLVDJsRFExQlFhRzkwYjNOb2IzQWdTVU5ESUhCeWIyWnBiR1VBQUhqYW5WTm5WRlBwRmozMzN2UkNTNGlBbEV0dlVoVUlJRkpDaTRBVWtTWXFJUWtRU29naG9ka1ZVY0VSUlVVRUc4aWdpQU9Pam9DTUZWRXNESW9LMkFma0lhS09nNk9JaXNyNzRYdWphOWE4OStiTi9yWFhQdWVzODUyenp3ZkFDQXlXU0ROUk5ZQU1xVUllRWVDRHg4VEc0ZVF1UUlFS0pIQUFFQWl6WkNGei9TTUJBUGgrUER3cklzQUh2Z0FCZU5NTENBREFUWnZBTUJ5SC93L3FRcGxjQVlDRUFjQjBrVGhMQ0lBVUFFQjZqa0ttQUVCR0FZQ2RtQ1pUQUtBRUFHRExZMkxqQUZBdEFHQW5mK2JUQUlDZCtKbDdBUUJibENFVkFhQ1JBQ0FUWlloRUFHZzdBS3pQVm9wRkFGZ3dBQlJtUzhRNUFOZ3RBREJKVjJaSUFMQzNBTURPRUF1eUFBZ01BREJSaUlVcEFBUjdBR0RJSXlONEFJU1pBQlJHOGxjODhTdXVFT2NxQUFCNG1iSTh1U1E1UllGYkNDMXhCMWRYTGg0b3pra1hLeFEyWVFKaG1rQXV3bm1aR1RLQk5BL2c4OHdBQUtDUkZSSGdnL1A5ZU00T3JzN09ObzYyRGw4dDZyOEcveUppWXVQKzVjK3JjRUFBQU9GMGZ0SCtMQyt6R29BN0JvQnQvcUlsN2dSb1hndWdkZmVMWnJJUFFMVUFvT25hVi9OdytINDhQRVdoa0xuWjJlWGs1TmhLeEVKYlljcFhmZjVud2wvQVYvMXMrWDQ4L1BmMTRMN2lKSUV5WFlGSEJQamd3c3owVEtVY3o1SUpoR0xjNW85SC9MY0wvL3dkMHlMRVNXSzVXQ29VNDFFU2NZNUVtb3p6TXFVaWlVS1NLY1VsMHY5azR0OHMrd00rM3pVQXNHbytBWHVSTGFoZFl3UDJTeWNRV0hUQTR2Y0FBUEs3YjhIVUtBZ0RnR2lENGM5My8rOC8vVWVnSlFDQVprbVNjUUFBWGtRa0xsVEtzei9IQ0FBQVJLQ0JLckJCRy9UQkdDekFCaHpCQmR6QkMveGdOb1JDSk1UQ1FoQkNDbVNBSEhKZ0theUNRaWlHemJBZEttQXYxRUFkTk1CUmFJYVRjQTR1d2xXNERqMXdEL3BoQ0o3QktMeUJDUVJCeUFnVFlTSGFpQUZpaWxnampnZ1htWVg0SWNGSUJCS0xKQ0RKaUJSUklrdVJOVWd4VW9wVUlGVklIZkk5Y2dJNWgxeEd1cEU3eUFBeWd2eUd2RWN4bElHeVVUM1VETFZEdWFnM0dvUkdvZ3ZRWkhReG1vOFdvSnZRY3JRYVBZdzJvZWZRcTJnUDJvOCtROGN3d09nWUJ6UEViREF1eHNOQ3NUZ3NDWk5qeTdFaXJBeXJ4aHF3VnF3RHU0bjFZOCt4ZHdRU2dVWEFDVFlFZDBJZ1lSNUJTRmhNV0U3WVNLZ2dIQ1EwRWRvSk53a0RoRkhDSnlLVHFFdTBKcm9SK2NRWVlqSXhoMWhJTENQV0VvOFRMeEI3aUVQRU55UVNpVU15SjdtUUFrbXhwRlRTRXRKRzBtNVNJK2tzcVpzMFNCb2prOG5hWkd1eUJ6bVVMQ0FyeUlYa25lVEQ1RFBrRytRaDhsc0tuV0pBY2FUNFUrSW9Vc3BxU2hubEVPVTA1UVpsbURKQlZhT2FVdDJvb1ZRUk5ZOWFRcTJodGxLdlVZZW9FelIxbWpuTmd4WkpTNld0b3BYVEdtZ1hhUGRwcitoMHVoSGRsUjVPbDlCWDBzdnBSK2lYNkFQMGR3d05oaFdEeDRobktCbWJHQWNZWnhsM0dLK1lUS1laMDRzWngxUXdOekhybU9lWkQ1bHZWVmdxdGlwOEZaSEtDcFZLbFNhVkd5b3ZWS21xcHFyZXFndFY4MVhMVkkrcFhsTjlya1pWTTFQanFRblVscXRWcXAxUTYxTWJVMmVwTzZpSHFtZW9iMVEvcEg1Wi9Za0dXY05NdzA5RHBGR2dzVi9qdk1ZZ0MyTVpzM2dzSVdzTnE0WjFnVFhFSnJITjJYeDJLcnVZL1IyN2l6MnFxYUU1UXpOS00xZXpVdk9VWmo4SDQ1aHgrSngwVGdubktLZVg4MzZLM2hUdktlSXBHNlkwVExreFpWeHJxcGFYbGxpclNLdFJxMGZydlRhdTdhZWRwcjFGdTFuN2dRNUJ4MG9uWENkSFo0L09CWjNuVTlsVDNhY0tweFpOUFRyMXJpNnFhNlVib2J0RWQ3OXVwKzZZbnI1ZWdKNU1iNmZlZWIzbitoeDlMLzFVL1czNnAvVkhERmdHc3d3a0J0c016aGc4eFRWeGJ6d2RMOGZiOFZGRFhjTkFRNlZobFdHWDRZU1J1ZEU4bzlWR2pVWVBqR25HWE9NazQyM0diY2FqSmdZbUlTWkxUZXBON3BwU1RibW1LYVk3VER0TXg4M016YUxOMXBrMW16MHgxekxubStlYjE1dmZ0MkJhZUZvc3RxaTJ1R1ZKc3VSYXBsbnV0cnh1aFZvNVdhVllWVnBkczBhdG5hMGwxcnV0dTZjUnA3bE9rMDZybnRabnc3RHh0c20ycWJjWnNPWFlCdHV1dG0yMmZXRm5ZaGRudDhXdXcrNlR2Wk45dW4yTi9UMEhEWWZaRHFzZFdoMStjN1J5RkRwV090NmF6cHp1UDMzRjlKYnBMMmRZenhEUDJEUGp0aFBMS2NScG5WT2IwMGRuRjJlNWM0UHppSXVKUzRMTExwYytMcHNieHQzSXZlUktkUFZ4WGVGNjB2V2RtN09id3UybzI2L3VOdTVwN29mY244dzBueW1lV1ROejBNUElRK0JSNWRFL0M1K1ZNR3Zmckg1UFEwK0JaN1huSXk5akw1RlhyZGV3dDZWM3F2ZGg3eGMrOWo1eW4rTSs0enczM2pMZVdWL01OOEMzeUxmTFQ4TnZubCtGMzBOL0kvOWsvM3IvMFFDbmdDVUJad09KZ1VHQld3TDcrSHA4SWIrT1B6cmJaZmF5MmUxQmpLQzVRUlZCajRLdGd1WEJyU0ZveU95UXJTSDM1NWpPa2M1cERvVlFmdWpXMEFkaDVtR0x3MzRNSjRXSGhWZUdQNDV3aUZnYTBUR1hOWGZSM0VOejMwVDZSSlpFM3B0bk1VODVyeTFLTlNvK3FpNXFQTm8zdWpTNlA4WXVabG5NMVZpZFdFbHNTeHc1TGlxdU5tNXN2dC84N2ZPSDRwM2lDK043RjVndnlGMXdlYUhPd3ZTRnB4YXBMaElzT3BaQVRJaE9PSlR3UVJBcXFCYU1KZklUZHlXT0NubkNIY0puSWkvUk50R0kyRU5jS2g1TzhrZ3FUWHFTN0pHOE5Ya2t4VE9sTE9XNWhDZXBrTHhNRFV6ZG16cWVGcHAySUcweVBUcTlNWU9Ta1pCeFFxb2hUWk8yWitwbjVtWjJ5NnhsaGJMK3hXNkx0eThlbFFmSmE3T1FyQVZaTFFxMlFxYm9WRm9vMXlvSHNtZGxWMmEvelluS09aYXJuaXZON2N5enl0dVFONXp2bi8vdEVzSVM0WksycFlaTFZ5MGRXT2E5ckdvNXNqeHhlZHNLNHhVRks0WldCcXc4dUlxMkttM1ZUNnZ0VjVldWZyMG1lazFyZ1Y3QnlvTEJ0UUZyNnd0VkN1V0ZmZXZjMSsxZFQxZ3ZXZCsxWWZxR25ScytGWW1LcmhUYkY1Y1ZmOWdvM0hqbEc0ZHZ5citaM0pTMHFhdkV1V1RQWnRKbTZlYmVMWjViRHBhcWwrYVhEbTROMmRxMERkOVd0TzMxOWtYYkw1Zk5LTnU3ZzdaRHVhTy9QTGk4WmFmSnpzMDdQMVNrVlBSVStsUTI3dExkdFdIWCtHN1I3aHQ3dlBZMDdOWGJXN3ozL1Q3SnZ0dFZBVlZOMVdiVlpmdEorN1AzUDY2SnF1bjRsdnR0WGExT2JYSHR4d1BTQS8wSEl3NjIxN25VMVIzU1BWUlNqOVlyNjBjT3h4KysvcDN2ZHkwTk5nMVZqWnpHNGlOd1JIbms2ZmNKMy9jZURUcmFkb3g3ck9FSDB4OTJIV2NkTDJwQ212S2FScHRUbXZ0YllsdTZUOHcrMGRicTNucjhSOXNmRDV3MFBGbDVTdk5VeVduYTZZTFRrMmZ5ejR5ZGxaMTlmaTc1M0dEYm9yWjc1MlBPMzJvUGIrKzZFSFRoMGtYL2krYzd2RHZPWFBLNGRQS3kyK1VUVjdoWG1xODZYMjNxZE9vOC9wUFRUOGU3bkx1YXJybGNhN251ZXIyMWUyYjM2UnVlTjg3ZDlMMTU4UmIvMXRXZU9UM2R2Zk42Yi9mRjkvWGZGdDErY2lmOXpzdTcyWGNuN3EyOFQ3eGY5RUR0UWRsRDNZZlZQMXYrM05qdjNIOXF3SGVnODlIY1IvY0doWVBQL3BIMWp3OURCWStaajh1R0RZYnJuamcrT1RuaVAzTDk2ZnluUTg5a3p5YWVGLzZpL3N1dUZ4WXZmdmpWNjlmTzBaalJvWmZ5bDVPL2JYeWwvZXJBNnhtdjI4YkN4aDYreVhnek1WNzBWdnZ0d1hmY2R4M3ZvOThQVCtSOElIOG8vMmo1c2ZWVDBLZjdreG1Uay84RUE1anovR016TGRzQUFBQWdZMGhTVFFBQWVpVUFBSUNEQUFENS93QUFnT2tBQUhVd0FBRHFZQUFBT3BnQUFCZHZrbC9GUmdBQUFIbEpSRUZVZU5yY1Uxc05nREFRNndnbWNBTTJNSUNHR2xnMWdKbk56V1FjdndRR3kxajRvVWwvN3RIMG1wd3pNN1NnUXlPK0VaQVVXaDJNa2t6U1doSnd1UkFsSFlzSndFd3l2czFnQUJEdXpxb0pjVHc1cXhhSUpOMGJnUVJnSWpubG1uMWhlU081UEU2WTJZWGUrNUNyNStoKytnczEyQWNBUzZGUys3WU9zajRBQUFBQVNVVk9SSzVDWUlJPSk7Cit9CisKK3RhYmxlLnRyZWV0YWJsZSB0ci5leHBhbmRlZCBzcGFuLmluZGVudGVyIGEgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBQUNYQklXWE1BQUFzVEFBQUxFd0VBbXB3WUFBQUtUMmxEUTFCUWFHOTBiM05vYjNBZ1NVTkRJSEJ5YjJacGJHVUFBSGphblZOblZGUHBGajMzM3ZSQ1M0aUFsRXR2VWhVSUlGSkNpNEFVa1NZcUlRa1FTb2dob2RrVlVjRVJSVVVFRzhpZ2lBT09qb0NNRlZFc0RJb0syQWZrSWFLT2c2T0lpc3I3NFh1amE5YTg5K2JOL3JYWFB1ZXM4NTJ6endmQUNBeVdTRE5STllBTXFVSWVFZUNEeDhURzRlUXVRSUVLSkhBQUVBaXpaQ0Z6L1NNQkFQaCtQRHdySXNBSHZnQUJlTk1MQ0FEQVRadkFNQnlIL3cvcVFwbGNBWUNFQWNCMGtUaExDSUFVQUVCNmprS21BRUJHQVlDZG1DWlRBS0FFQUdETFkyTGpBRkF0QUdBbmYrYlRBSUNkK0psN0FRQmJsQ0VWQWFDUkFDQVRaWWhFQUdnN0FLelBWb3BGQUZnd0FCUm1TOFE1QU5ndEFEQkpWMlpJQUxDM0FNRE9FQXV5QUFnTUFEQlJpSVVwQUFSN0FHRElJeU40QUlTWkFCUkc4bGM4OFN1dUVPY3FBQUI0bWJJOHVTUTVSWUZiQ0MxeEIxZFhMaDRvemtrWEt4UTJZUUpobWtBdXdubVpHVEtCTkEvZzg4d0FBS0NSRlJIZ2cvUDllTTRPcnM3T05vNjJEbDh0NnI4Ry95SmlZdVArNWMrcmNFQUFBT0YwZnRIK0xDK3pHb0E3Qm9CdC9xSWw3Z1JvWGd1Z2RmZUxacklQUUxVQW9PbmFWL053K0g0OFBFV2hrTG5aMmVYazVOaEt4RUpiWWNwWGZmNW53bC9BVi8xcytYNDgvUGYxNEw3aUpJRXlYWUZIQlBqZ3dzejBUS1VjejVJSmhHTGM1bzlIL0xjTC8vd2QweUxFU1dLNVdDb1U0MUVTY1k1RW1venpNcVVpaVVLU0tjVWwwdjlrNHQ4cyt3TSszelVBc0dvK0FYdVJMYWhkWXdQMlN5Y1FXSFRBNHZjQUFQSzdiOEhVS0FnRGdHaUQ0YzkzLys4Ly9VZWdKUUNBWmttU2NRQUFYa1FrTGxUS3N6L0hDQUFBUktDQktyQkJHL1RCR0N6QUJoekJCZHpCQy94Z05vUkNKTVRDUWhCQ0NtU0FISEpnS2F5Q1FpaUd6YkFkS21BdjFFQWROTUJSYUlhVGNBNHV3bFc0RGoxd0QvcGhDSjdCS0x5QkNRUkJ5QWdUWVNIYWlBRmlpbGdqamdnWG1ZWDRJY0ZJQkJLTEpDREppQlJSSWt1Uk5VZ3hVb3BVSUZWSUhmSTljZ0k1aDF4R3VwRTd5QUF5Z3Z5R3ZFY3hsSUd5VVQzVURMVkR1YWczR29SR29ndlFaSFF4bW84V29KdlFjclFhUFl3Mm9lZlFxMmdQMm84K1E4Y3d3T2dZQnpQRWJEQXV4c05Dc1Rnc0NaTmp5N0VpckF5cnhocXdWcXdEdTRuMVk4K3hkd1FTZ1VYQUNUWUVkMElnWVI1QlNGaE1XRTdZU0tnZ0hDUTBFZG9KTndrRGhGSENKeUtUcUV1MEpyb1IrY1FZWWpJeGgxaElMQ1BXRW84VEx4QjdpRVBFTnlRU2lVTXlKN21RQWtteHBGVFNFdEpHMG01U0kra3NxWnMwU0Jvams4bmFaR3V5QnptVUxDQXJ5SVhrbmVURDVEUGtHK1FoOGxzS25XSkFjYVQ0VStJb1VzcHFTaG5sRU9VMDVRWmxtREpCVmFPYVV0Mm9vVlFSTlk5YVFxMmh0bEt2VVllb0V6UjFtam5OZ3haSlM2V3RvcFhUR21nWGFQZHByK2gwdWhIZGxSNU9sOUJYMHN2cFIraVg2QVAwZHd3TmhoV0R4NGhuS0JtYkdBY1laeGwzR0srWVRLWVowNHNaeDFRd056SHJtT2VaRDVsdlZWZ3F0aXA4RlpIS0NwVktsU2FWR3lvdlZLbXFwcXJlcWd0VjgxWExWSStwWGxOOXJrWlZNMVBqcVFuVWxxdFZxcDFRNjFNYlUyZXBPNmlIcW1lb2IxUS9wSDVaL1lrR1djTk13MDlEcEZHZ3NWL2p2TVlnQzJNWnMzZ3NJV3NOcTRaMWdUWEVKckhOMlh4MktydVkvUjI3aXoycXFhRTVRek5LTTFlelV2T1VaajhINDVoeCtKeDBUZ25uS0tlWDgzNkszaFR2S2VJcEc2WTBUTGt4WlZ4cnFwYVhsbGlyU0t0UnEwZnJ2VGF1N2FlZHByMUZ1MW43Z1E1Qngwb25YQ2RIWjQvT0JaM25VOWxUM2FjS3B4Wk5QVHIxcmk2cWE2VWJvYnRFZDc5dXArNllucjVlZ0o1TWI2ZmVlYjNuK2h4OUwvMVUvVzM2cC9WSERGZ0dzd3drQnRzTXpoZzh4VFZ4Ynp3ZEw4ZmI4VkZEWGNOQVE2VmhsV0dYNFlTUnVkRThvOVZHalVZUGpHbkdYT01rNDIzR2JjYWpKZ1ltSVNaTFRlcE43cHBTVGJtbUthWTdURHRNeDgzTXphTE4xcGsxbXoweDF6TG5tK2ViMTV2ZnQyQmFlRm9zdHFpMnVHVkpzdVJhcGxudXRyeHVoVm81V2FWWVZWcGRzMGF0bmEwbDFydXR1NmNScDdsT2swNnJudFpudzdEeHRzbTJxYmNac09YWUJ0dXV0bTIyZldGblloZG50OFd1dys2VHZaTjl1bjJOL1QwSERZZlpEcXNkV2gxK2M3UnlGRHBXT3Q2YXpwenVQMzNGOUpicEwyZFl6eERQMkRQanRoUExLY1JwblZPYjAwZG5GMmU1YzRQemlJdUpTNExMTHBjK0xwc2J4dDNJdmVSS2RQVnhYZUY2MHZXZG03T2J3dTJvMjYvdU51NXA3b2Zjbjh3MG55bWVXVE56ME1QSVErQlI1ZEUvQzUrVk1HdmZySDVQUTArQlo3WG5JeTlqTDVGWHJkZXd0NlYzcXZkaDd4Yys5ajV5bitNKzR6dzMzakxlV1YvTU44QzN5TGZMVDhOdm5sK0YzME4vSS85ay8zci8wUUNuZ0NVQlp3T0pnVUdCV3dMNytIcDhJYitPUHpyYlpmYXkyZTFCaktDNVFSVkJqNEt0Z3VYQnJTRm95T3lRclNIMzU1ak9rYzVwRG9WUWZ1alcwQWRoNW1HTHczNE1KNFdIaFZlR1A0NXdpRmdhMFRHWE5YZlIzRU56MzBUNlJKWkUzcHRuTVU4NXJ5MUtOU28rcWk1cVBObzN1alM2UDhZdVpsbk0xVmlkV0Vsc1N4dzVMaXF1Tm01c3Z0Lzg3Zk9INHAzaUMrTjdGNWd2eUYxd2VhSE93dlNGcHhhcExoSXNPcFpBVEloT09KVHdRUkFxcUJhTUpmSVRkeVdPQ25uQ0hjSm5JaS9STnRHSTJFTmNLaDVPOGtncVRYcVM3Skc4Tlhra3hUT2xMT1c1aENlcGtMeE1EVXpkbXpxZUZwcDJJRzB5UFRxOU1ZT1NrWkJ4UXFvaFRaTzJaK3BuNW1aMnk2eGxoYkwreFc2THR5OGVsUWZKYTdPUXJBVlpMUXEyUXFib1ZGb28xeW9Ic21kbFYyYS96WW5LT1phcm5pdk43Y3l6eXR1UU41enZuLy90RXNJUzRaSzJwWVpMVnkwZFdPYTlyR281c2p4eGVkc0s0eFVGSzRaV0Jxdzh1SXEyS20zVlQ2dnRWNWV1ZnIwbWVrMXJnVjdCeW9MQnRRRnI2d3RWQ3VXRmZldmMxKzFkVDFndldkKzFZZnFHblJzK0ZZbUtyaFRiRjVjVmY5Z28zSGpsRzRkdnlyK1ozSlMwcWF2RXVXVFBadEptNmViZUxaNWJEcGFxbCthWERtNE4yZHEwRGQ5V3RPMzE5a1hiTDVmTktOdTdnN1pEdWFPL1BMaThaYWZKenMwN1AxU2tWUFJVK2xRMjd0TGR0V0hYK0c3UjdodDd2UFkwN05YYlc3ejMvVDdKdnR0VkFWVk4xV2JWWmZ0Sis3UDNQNjZKcXVuNGx2dHRYYTFPYlhIdHh3UFNBLzBISXc2MjE3blUxUjNTUFZSU2o5WXI2MGNPeHgrKy9wM3ZkeTBOTmcxVmpaekc0aU53UkhuazZmY0ozL2NlRFRyYWRveDdyT0VIMHg5MkhXY2RMMnBDbXZLYVJwdFRtdnRiWWx1NlQ4dyswZGJxM25yOFI5c2ZENXcwUEZsNVN2TlV5V25hNllMVGsyZnl6NHlkbFoxOWZpNzUzR0Rib3JaNzUyUE8zMm9QYisrNkVIVGgwa1gvaStjN3ZEdk9YUEs0ZFBLeTIrVVRWN2hYbXE4NlgyM3FkT284L3BQVFQ4ZTduTHVhcnJsY2E3bnVlcjIxZTJiMzZSdWVOODdkOUwxNThSYi8xdFdlT1QzZHZmTjZiL2ZGOS9YZkZ0MStjaWY5enN1NzJYY243cTI4VDd4ZjlFRHRRZGxEM1lmVlAxdiszTmp2M0g5cXdIZWc4OUhjUi9jR2hZUFAvcEgxanc5REJZK1pqOHVHRFlicm5qZytPVG5pUDNMOTZmeW5RODlrenlhZUYvNmkvc3V1RnhZdmZ2alY2OWZPMFpqUm9aZnlsNU8vYlh5bC9lckE2eG12MjhiQ3hoNit5WGd6TVY3MFZ2dnR3WGZjZHgzdm85OFBUK1I4SUg4by8yajVzZlZUMEtmN2t4bVRrLzhFQTVqei9HTXpMZHNBQUFBZ1kwaFNUUUFBZWlVQUFJQ0RBQUQ1L3dBQWdPa0FBSFV3QUFEcVlBQUFPcGdBQUJkdmtsL0ZSZ0FBQUhGSlJFRlVlTnBpL1AvL1B3TWxnSW1CUXNBNDRDNmd2aGZhMjl2M016QXdPT0RSYzZDeXN0SVJieGkwdDdmakRKakt5a3BHWXJ3d2kxaHhuTEhRM3Q3K2pJR0JRUkpKNkhsbFphVVVLWUVZUllCUE9CMGdCU2hLd0tHQS8vLy80OFZ0YlczLzhjbFRuQklIM2dDS2t6SmdBR3ZCWDBkRG0wc0NBQUFBQUVsRlRrU3VRbUNDKTsKK30KKworCisKK3RhYmxlLnRyZWV0YWJsZSB0ci5jb2xsYXBzZWQuc2VsZWN0ZWQgc3Bhbi5pbmRlbnRlciBhIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUFDWEJJV1hNQUFBc1RBQUFMRXdFQW1wd1lBQUFLVDJsRFExQlFhRzkwYjNOb2IzQWdTVU5ESUhCeWIyWnBiR1VBQUhqYW5WTm5WRlBwRmozMzN2UkNTNGlBbEV0dlVoVUlJRkpDaTRBVWtTWXFJUWtRU29naG9ka1ZVY0VSUlVVRUc4aWdpQU9Pam9DTUZWRXNESW9LMkFma0lhS09nNk9JaXNyNzRYdWphOWE4OStiTi9yWFhQdWVzODUyenp3ZkFDQXlXU0ROUk5ZQU1xVUllRWVDRHg4VEc0ZVF1UUlFS0pIQUFFQWl6WkNGei9TTUJBUGgrUER3cklzQUh2Z0FCZU5NTENBREFUWnZBTUJ5SC93L3FRcGxjQVlDRUFjQjBrVGhMQ0lBVUFFQjZqa0ttQUVCR0FZQ2RtQ1pUQUtBRUFHRExZMkxqQUZBdEFHQW5mK2JUQUlDZCtKbDdBUUJibENFVkFhQ1JBQ0FUWlloRUFHZzdBS3pQVm9wRkFGZ3dBQlJtUzhRNUFOZ3RBREJKVjJaSUFMQzNBTURPRUF1eUFBZ01BREJSaUlVcEFBUjdBR0RJSXlONEFJU1pBQlJHOGxjODhTdXVFT2NxQUFCNG1iSTh1U1E1UllGYkNDMXhCMWRYTGg0b3pra1hLeFEyWVFKaG1rQXV3bm1aR1RLQk5BL2c4OHdBQUtDUkZSSGdnL1A5ZU00T3JzN09ObzYyRGw4dDZyOEcveUppWXVQKzVjK3JjRUFBQU9GMGZ0SCtMQyt6R29BN0JvQnQvcUlsN2dSb1hndWdkZmVMWnJJUFFMVUFvT25hVi9OdytINDhQRVdoa0xuWjJlWGs1TmhLeEVKYlljcFhmZjVud2wvQVYvMXMrWDQ4L1BmMTRMN2lKSUV5WFlGSEJQamd3c3owVEtVY3o1SUpoR0xjNW85SC9MY0wvL3dkMHlMRVNXSzVXQ29VNDFFU2NZNUVtb3p6TXFVaWlVS1NLY1VsMHY5azR0OHMrd00rM3pVQXNHbytBWHVSTGFoZFl3UDJTeWNRV0hUQTR2Y0FBUEs3YjhIVUtBZ0RnR2lENGM5My8rOC8vVWVnSlFDQVprbVNjUUFBWGtRa0xsVEtzei9IQ0FBQVJLQ0JLckJCRy9UQkdDekFCaHpCQmR6QkMveGdOb1JDSk1UQ1FoQkNDbVNBSEhKZ0theUNRaWlHemJBZEttQXYxRUFkTk1CUmFJYVRjQTR1d2xXNERqMXdEL3BoQ0o3QktMeUJDUVJCeUFnVFlTSGFpQUZpaWxnampnZ1htWVg0SWNGSUJCS0xKQ0RKaUJSUklrdVJOVWd4VW9wVUlGVklIZkk5Y2dJNWgxeEd1cEU3eUFBeWd2eUd2RWN4bElHeVVUM1VETFZEdWFnM0dvUkdvZ3ZRWkhReG1vOFdvSnZRY3JRYVBZdzJvZWZRcTJnUDJvOCtROGN3d09nWUJ6UEViREF1eHNOQ3NUZ3NDWk5qeTdFaXJBeXJ4aHF3VnF3RHU0bjFZOCt4ZHdRU2dVWEFDVFlFZDBJZ1lSNUJTRmhNV0U3WVNLZ2dIQ1EwRWRvSk53a0RoRkhDSnlLVHFFdTBKcm9SK2NRWVlqSXhoMWhJTENQV0VvOFRMeEI3aUVQRU55UVNpVU15SjdtUUFrbXhwRlRTRXRKRzBtNVNJK2tzcVpzMFNCb2prOG5hWkd1eUJ6bVVMQ0FyeUlYa25lVEQ1RFBrRytRaDhsc0tuV0pBY2FUNFUrSW9Vc3BxU2hubEVPVTA1UVpsbURKQlZhT2FVdDJvb1ZRUk5ZOWFRcTJodGxLdlVZZW9FelIxbWpuTmd4WkpTNld0b3BYVEdtZ1hhUGRwcitoMHVoSGRsUjVPbDlCWDBzdnBSK2lYNkFQMGR3d05oaFdEeDRobktCbWJHQWNZWnhsM0dLK1lUS1laMDRzWngxUXdOekhybU9lWkQ1bHZWVmdxdGlwOEZaSEtDcFZLbFNhVkd5b3ZWS21xcHFyZXFndFY4MVhMVkkrcFhsTjlya1pWTTFQanFRblVscXRWcXAxUTYxTWJVMmVwTzZpSHFtZW9iMVEvcEg1Wi9Za0dXY05NdzA5RHBGR2dzVi9qdk1ZZ0MyTVpzM2dzSVdzTnE0WjFnVFhFSnJITjJYeDJLcnVZL1IyN2l6MnFxYUU1UXpOS00xZXpVdk9VWmo4SDQ1aHgrSngwVGdubktLZVg4MzZLM2hUdktlSXBHNlkwVExreFpWeHJxcGFYbGxpclNLdFJxMGZydlRhdTdhZWRwcjFGdTFuN2dRNUJ4MG9uWENkSFo0L09CWjNuVTlsVDNhY0tweFpOUFRyMXJpNnFhNlVib2J0RWQ3OXVwKzZZbnI1ZWdKNU1iNmZlZWIzbitoeDlMLzFVL1czNnAvVkhERmdHc3d3a0J0c016aGc4eFRWeGJ6d2RMOGZiOFZGRFhjTkFRNlZobFdHWDRZU1J1ZEU4bzlWR2pVWVBqR25HWE9NazQyM0diY2FqSmdZbUlTWkxUZXBON3BwU1RibW1LYVk3VER0TXg4M016YUxOMXBrMW16MHgxekxubStlYjE1dmZ0MkJhZUZvc3RxaTJ1R1ZKc3VSYXBsbnV0cnh1aFZvNVdhVllWVnBkczBhdG5hMGwxcnV0dTZjUnA3bE9rMDZybnRabnc3RHh0c20ycWJjWnNPWFlCdHV1dG0yMmZXRm5ZaGRudDhXdXcrNlR2Wk45dW4yTi9UMEhEWWZaRHFzZFdoMStjN1J5RkRwV090NmF6cHp1UDMzRjlKYnBMMmRZenhEUDJEUGp0aFBMS2NScG5WT2IwMGRuRjJlNWM0UHppSXVKUzRMTExwYytMcHNieHQzSXZlUktkUFZ4WGVGNjB2V2RtN09id3UybzI2L3VOdTVwN29mY244dzBueW1lV1ROejBNUElRK0JSNWRFL0M1K1ZNR3Zmckg1UFEwK0JaN1huSXk5akw1RlhyZGV3dDZWM3F2ZGg3eGMrOWo1eW4rTSs0enczM2pMZVdWL01OOEMzeUxmTFQ4TnZubCtGMzBOL0kvOWsvM3IvMFFDbmdDVUJad09KZ1VHQld3TDcrSHA4SWIrT1B6cmJaZmF5MmUxQmpLQzVRUlZCajRLdGd1WEJyU0ZveU95UXJTSDM1NWpPa2M1cERvVlFmdWpXMEFkaDVtR0x3MzRNSjRXSGhWZUdQNDV3aUZnYTBUR1hOWGZSM0VOejMwVDZSSlpFM3B0bk1VODVyeTFLTlNvK3FpNXFQTm8zdWpTNlA4WXVabG5NMVZpZFdFbHNTeHc1TGlxdU5tNXN2dC84N2ZPSDRwM2lDK043RjVndnlGMXdlYUhPd3ZTRnB4YXBMaElzT3BaQVRJaE9PSlR3UVJBcXFCYU1KZklUZHlXT0NubkNIY0puSWkvUk50R0kyRU5jS2g1TzhrZ3FUWHFTN0pHOE5Ya2t4VE9sTE9XNWhDZXBrTHhNRFV6ZG16cWVGcHAySUcweVBUcTlNWU9Ta1pCeFFxb2hUWk8yWitwbjVtWjJ5NnhsaGJMK3hXNkx0eThlbFFmSmE3T1FyQVZaTFFxMlFxYm9WRm9vMXlvSHNtZGxWMmEvelluS09aYXJuaXZON2N5enl0dVFONXp2bi8vdEVzSVM0WksycFlaTFZ5MGRXT2E5ckdvNXNqeHhlZHNLNHhVRks0WldCcXc4dUlxMkttM1ZUNnZ0VjVldWZyMG1lazFyZ1Y3QnlvTEJ0UUZyNnd0VkN1V0ZmZXZjMSsxZFQxZ3ZXZCsxWWZxR25ScytGWW1LcmhUYkY1Y1ZmOWdvM0hqbEc0ZHZ5citaM0pTMHFhdkV1V1RQWnRKbTZlYmVMWjViRHBhcWwrYVhEbTROMmRxMERkOVd0TzMxOWtYYkw1Zk5LTnU3ZzdaRHVhTy9QTGk4WmFmSnpzMDdQMVNrVlBSVStsUTI3dExkdFdIWCtHN1I3aHQ3dlBZMDdOWGJXN3ozL1Q3SnZ0dFZBVlZOMVdiVlpmdEorN1AzUDY2SnF1bjRsdnR0WGExT2JYSHR4d1BTQS8wSEl3NjIxN25VMVIzU1BWUlNqOVlyNjBjT3h4KysvcDN2ZHkwTk5nMVZqWnpHNGlOd1JIbms2ZmNKMy9jZURUcmFkb3g3ck9FSDB4OTJIV2NkTDJwQ212S2FScHRUbXZ0YllsdTZUOHcrMGRicTNucjhSOXNmRDV3MFBGbDVTdk5VeVduYTZZTFRrMmZ5ejR5ZGxaMTlmaTc1M0dEYm9yWjc1MlBPMzJvUGIrKzZFSFRoMGtYL2krYzd2RHZPWFBLNGRQS3kyK1VUVjdoWG1xODZYMjNxZE9vOC9wUFRUOGU3bkx1YXJybGNhN251ZXIyMWUyYjM2UnVlTjg3ZDlMMTU4UmIvMXRXZU9UM2R2Zk42Yi9mRjkvWGZGdDErY2lmOXpzdTcyWGNuN3EyOFQ3eGY5RUR0UWRsRDNZZlZQMXYrM05qdjNIOXF3SGVnODlIY1IvY0doWVBQL3BIMWp3OURCWStaajh1R0RZYnJuamcrT1RuaVAzTDk2ZnluUTg5a3p5YWVGLzZpL3N1dUZ4WXZmdmpWNjlmTzBaalJvWmZ5bDVPL2JYeWwvZXJBNnhtdjI4YkN4aDYreVhnek1WNzBWdnZ0d1hmY2R4M3ZvOThQVCtSOElIOG8vMmo1c2ZWVDBLZjdreG1Uay84RUE1anovR016TGRzQUFBQWdZMGhTVFFBQWVpVUFBSUNEQUFENS93QUFnT2tBQUhVd0FBRHFZQUFBT3BnQUFCZHZrbC9GUmdBQUFGcEpSRUZVZU5waS9QLy9Qd01sZ0hIQURXRDQvLzgvTnR5QVF4d0Q0NUtBQVFkS0Rmai8vLy8vL2ZnTUlzWUFaSU13MURLUkVGd09EQXdNLzRrTlJLcTY0QUFEQTRNakZET1E2Z0t5WTRIb2RNQTQ5UE1DeFFZQUJnQVZZSHNqeVoxeDdRQUFBQUJKUlU1RXJrSmdnZz09KTsKK30KKwordGFibGUudHJlZXRhYmxlIHRyLmV4cGFuZGVkLnNlbGVjdGVkIHNwYW4uaW5kZW50ZXIgYSB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFBQ1hCSVdYTUFBQXNUQUFBTEV3RUFtcHdZQUFBS1QybERRMUJRYUc5MGIzTm9iM0FnU1VORElIQnliMlpwYkdVQUFIamFuVk5uVkZQcEZqMzMzdlJDUzRpQWxFdHZVaFVJSUZKQ2k0QVVrU1lxSVFrUVNvZ2hvZGtWVWNFUlJVVUVHOGlnaUFPT2pvQ01GVkVzRElvSzJBZmtJYUtPZzZPSWlzcjc0WHVqYTlhODkrYk4vclhYUHVlczg1Mnp6d2ZBQ0F5V1NETlJOWUFNcVVJZUVlQ0R4OFRHNGVRdVFJRUtKSEFBRUFpelpDRnovU01CQVBoK1BEd3JJc0FIdmdBQmVOTUxDQURBVFp2QU1CeUgvdy9xUXBsY0FZQ0VBY0Iwa1RoTENJQVVBRUI2amtLbUFFQkdBWUNkbUNaVEFLQUVBR0RMWTJMakFGQXRBR0FuZitiVEFJQ2QrSmw3QVFCYmxDRVZBYUNSQUNBVFpZaEVBR2c3QUt6UFZvcEZBRmd3QUJSbVM4UTVBTmd0QURCSlYyWklBTEMzQU1ET0VBdXlBQWdNQURCUmlJVXBBQVI3QUdESUl5TjRBSVNaQUJSRzhsYzg4U3V1RU9jcUFBQjRtYkk4dVNRNVJZRmJDQzF4QjFkWExoNG96a2tYS3hRMllRSmhta0F1d25tWkdUS0JOQS9nODh3QUFLQ1JGUkhnZy9QOWVNNE9yczdPTm82MkRsOHQ2cjhHL3lKaVl1UCs1YytyY0VBQUFPRjBmdEgrTEMrekdvQTdCb0J0L3FJbDdnUm9YZ3VnZGZlTFpySVBRTFVBb09uYVYvTncrSDQ4UEVXaGtMbloyZVhrNU5oS3hFSmJZY3BYZmY1bndsL0FWLzFzK1g0OC9QZjE0TDdpSklFeVhZRkhCUGpnd3N6MFRLVWN6NUlKaEdMYzVvOUgvTGNMLy93ZDB5TEVTV0s1V0NvVTQxRVNjWTVFbW96ek1xVWlpVUtTS2NVbDB2OWs0dDhzK3dNKzN6VUFzR28rQVh1UkxhaGRZd1AyU3ljUVdIVEE0dmNBQVBLN2I4SFVLQWdEZ0dpRDRjOTMvKzgvL1VlZ0pRQ0Faa21TY1FBQVhrUWtMbFRLc3ovSENBQUFSS0NCS3JCQkcvVEJHQ3pBQmh6QkJkekJDL3hnTm9SQ0pNVENRaEJDQ21TQUhISmdLYXlDUWlpR3piQWRLbUF2MUVBZE5NQlJhSWFUY0E0dXdsVzREajF3RC9waENKN0JLTHlCQ1FSQnlBZ1RZU0hhaUFGaWlsZ2pqZ2dYbVlYNEljRklCQktMSkNESmlCUlJJa3VSTlVneFVvcFVJRlZJSGZJOWNnSTVoMXhHdXBFN3lBQXlndnlHdkVjeGxJR3lVVDNVRExWRHVhZzNHb1JHb2d2UVpIUXhtbzhXb0p2UWNyUWFQWXcyb2VmUXEyZ1AybzgrUThjd3dPZ1lCelBFYkRBdXhzTkNzVGdzQ1pOank3RWlyQXlyeGhxd1Zxd0R1NG4xWTgreGR3UVNnVVhBQ1RZRWQwSWdZUjVCU0ZoTVdFN1lTS2dnSENRMEVkb0pOd2tEaEZIQ0p5S1RxRXUwSnJvUitjUVlZakl4aDFoSUxDUFdFbzhUTHhCN2lFUEVOeVFTaVVNeUo3bVFBa214cEZUU0V0SkcwbTVTSStrc3FaczBTQm9qazhuYVpHdXlCem1VTENBcnlJWGtuZVRENURQa0crUWg4bHNLbldKQWNhVDRVK0lvVXNwcVNobmxFT1UwNVFabG1ESkJWYU9hVXQyb29WUVJOWTlhUXEyaHRsS3ZVWWVvRXpSMW1qbk5neFpKUzZXdG9wWFRHbWdYYVBkcHIraDB1aEhkbFI1T2w5Qlgwc3ZwUitpWDZBUDBkd3dOaGhXRHg0aG5LQm1iR0FjWVp4bDNHSytZVEtZWjA0c1p4MVF3TnpIcm1PZVpENWx2VlZncXRpcDhGWkhLQ3BWS2xTYVZHeW92VkttcXBxcmVxZ3RWODFYTFZJK3BYbE45cmtaVk0xUGpxUW5VbHF0VnFwMVE2MU1iVTJlcE82aUhxbWVvYjFRL3BINVovWWtHV2NOTXcwOURwRkdnc1YvanZNWWdDMk1aczNnc0lXc05xNFoxZ1RYRUpySE4yWHgyS3J1WS9SMjdpejJxcWFFNVF6TktNMWV6VXZPVVpqOEg0NWh4K0p4MFRnbm5LS2VYODM2SzNoVHZLZUlwRzZZMFRMa3haVnhycXBhWGxsaXJTS3RScTBmcnZUYXU3YWVkcHIxRnUxbjdnUTVCeDBvblhDZEhaNC9PQlozblU5bFQzYWNLcHhaTlBUcjFyaTZxYTZVYm9idEVkNzl1cCs2WW5yNWVnSjVNYjZmZWViM24raHg5TC8xVS9XMzZwL1ZIREZnR3N3d2tCdHNNemhnOHhUVnhiendkTDhmYjhWRkRYY05BUTZWaGxXR1g0WVNSdWRFOG85VkdqVVlQakduR1hPTWs0MjNHYmNhakpnWW1JU1pMVGVwTjdwcFNUYm1tS2FZN1REdE14ODNNemFMTjFwazFtejB4MXpMbm0rZWIxNXZmdDJCYWVGb3N0cWkydUdWSnN1UmFwbG51dHJ4dWhWbzVXYVZZVlZwZHMwYXRuYTBsMXJ1dHU2Y1JwN2xPazA2cm50Wm53N0R4dHNtMnFiY1pzT1hZQnR1dXRtMjJmV0ZuWWhkbnQ4V3V3KzZUdlpOOXVuMk4vVDBIRFlmWkRxc2RXaDErYzdSeUZEcFdPdDZhenB6dVAzM0Y5SmJwTDJkWXp4RFAyRFBqdGhQTEtjUnBuVk9iMDBkbkYyZTVjNFB6aUl1SlM0TExMcGMrTHBzYnh0M0l2ZVJLZFBWeFhlRjYwdldkbTdPYnd1Mm8yNi91TnU1cDdvZmNuOHcwbnltZVdUTnowTVBJUStCUjVkRS9DNStWTUd2ZnJINVBRMCtCWjdYbkl5OWpMNUZYcmRld3Q2VjNxdmRoN3hjKzlqNXluK00rNHp3MzNqTGVXVi9NTjhDM3lMZkxUOE52bmwrRjMwTi9JLzlrLzNyLzBRQ25nQ1VCWndPSmdVR0JXd0w3K0hwOEliK09QenJiWmZheTJlMUJqS0M1UVJWQmo0S3RndVhCclNGb3lPeVFyU0gzNTVqT2tjNXBEb1ZRZnVqVzBBZGg1bUdMdzM0TUo0V0hoVmVHUDQ1d2lGZ2EwVEdYTlhmUjNFTnozMFQ2UkpaRTNwdG5NVTg1cnkxS05TbytxaTVxUE5vM3VqUzZQOFl1WmxuTTFWaWRXRWxzU3h3NUxpcXVObTVzdnQvODdmT0g0cDNpQytON0Y1Z3Z5RjF3ZWFIT3d2U0ZweGFwTGhJc09wWkFUSWhPT0pUd1FSQXFxQmFNSmZJVGR5V09Dbm5DSGNKbklpL1JOdEdJMkVOY0toNU84a2dxVFhxUzdKRzhOWGtreFRPbExPVzVoQ2Vwa0x4TURVemRtenFlRnBwMklHMHlQVHE5TVlPU2taQnhRcW9oVFpPMlorcG41bVoyeTZ4bGhiTCt4VzZMdHk4ZWxRZkphN09RckFWWkxRcTJRcWJvVkZvbzF5b0hzbWRsVjJhL3pZbktPWmFybml2TjdjeXp5dHVRTjV6dm4vL3RFc0lTNFpLMnBZWkxWeTBkV09hOXJHbzVzanh4ZWRzSzR4VUZLNFpXQnF3OHVJcTJLbTNWVDZ2dFY1ZXVmcjBtZWsxcmdWN0J5b0xCdFFGcjZ3dFZDdVdGZmV2YzErMWRUMWd2V2QrMVlmcUduUnMrRlltS3JoVGJGNWNWZjlnbzNIamxHNGR2eXIrWjNKUzBxYXZFdVdUUFp0Sm02ZWJlTFo1YkRwYXFsK2FYRG00TjJkcTBEZDlXdE8zMTlrWGJMNWZOS051N2c3WkR1YU8vUExpOFphZkp6czA3UDFTa1ZQUlUrbFEyN3RMZHRXSFgrRzdSN2h0N3ZQWTA3TlhiVzd6My9UN0p2dHRWQVZWTjFXYlZaZnRKKzdQM1A2NkpxdW40bHZ0dFhhMU9iWEh0eHdQU0EvMEhJdzYyMTduVTFSM1NQVlJTajlZcjYwY094eCsrL3AzdmR5ME5OZzFWalp6RzRpTndSSG5rNmZjSjMvY2VEVHJhZG94N3JPRUgweDkySFdjZEwycENtdkthUnB0VG12dGJZbHU2VDh3KzBkYnEzbnI4UjlzZkQ1dzBQRmw1U3ZOVXlXbmE2WUxUazJmeXo0eWRsWjE5Zmk3NTNHRGJvclo3NTJQTzMyb1BiKys2RUhUaDBrWC9pK2M3dkR2T1hQSzRkUEt5MitVVFY3aFhtcTg2WDIzcWRPbzgvcFBUVDhlN25MdWFycmxjYTdudWVyMjFlMmIzNlJ1ZU44N2Q5TDE1OFJiLzF0V2VPVDNkdmZONmIvZkY5L1hmRnQxK2NpZjl6c3U3MlhjbjdxMjhUN3hmOUVEdFFkbEQzWWZWUDF2KzNOanYzSDlxd0hlZzg5SGNSL2NHaFlQUC9wSDFqdzlEQlkrWmo4dUdEWWJybmpnK09UbmlQM0w5NmZ5blE4OWt6eWFlRi82aS9zdXVGeFl2ZnZqVjY5Zk8wWmpSb1pmeWw1Ty9iWHlsL2VyQTZ4bXYyOGJDeGg2K3lYZ3pNVjcwVnZ2dHdYZmNkeDN2bzk4UFQrUjhJSDhvLzJqNXNmVlQwS2Y3a3htVGsvOEVBNWp6L0dNekxkc0FBQUFnWTBoU1RRQUFlaVVBQUlDREFBRDUvd0FBZ09rQUFIVXdBQURxWUFBQU9wZ0FBQmR2a2wvRlJnQUFBRnRKUkVGVWVOcGkvUC8vUHdNbGdJbUJRc0E0NEM2Z2lRRU5EQXdNLy9IZ0JtTENBRi9BTUJMakJVZWl4Zi8vLzQ4TDcvK1BDdlpqVTRmUEFBYzBBeHl3cWNNWEN3ZWdHSjFOY2tMNmp4NXdwS1lEeHFHWEVra0NnQUVBbXJxQkllamRnbmdBQUFBQVNVVk9SSzVDWUlJPSk7Cit9CisKK3RhYmxlLnRyZWV0YWJsZSB0ci5hY2NlcHQgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjYTNiY2U0OworICBjb2xvcjogI2ZmZgorfQorCit0YWJsZS50cmVldGFibGUgdHIuY29sbGFwc2VkLmFjY2VwdCB0ZCBzcGFuLmluZGVudGVyIGEgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS94LXBuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFBQ1hCSVdYTUFBQXNUQUFBTEV3RUFtcHdZQUFBS1QybERRMUJRYUc5MGIzTm9iM0FnU1VORElIQnliMlpwYkdVQUFIamFuVk5uVkZQcEZqMzMzdlJDUzRpQWxFdHZVaFVJSUZKQ2k0QVVrU1lxSVFrUVNvZ2hvZGtWVWNFUlJVVUVHOGlnaUFPT2pvQ01GVkVzRElvSzJBZmtJYUtPZzZPSWlzcjc0WHVqYTlhODkrYk4vclhYUHVlczg1Mnp6d2ZBQ0F5V1NETlJOWUFNcVVJZUVlQ0R4OFRHNGVRdVFJRUtKSEFBRUFpelpDRnovU01CQVBoK1BEd3JJc0FIdmdBQmVOTUxDQURBVFp2QU1CeUgvdy9xUXBsY0FZQ0VBY0Iwa1RoTENJQVVBRUI2amtLbUFFQkdBWUNkbUNaVEFLQUVBR0RMWTJMakFGQXRBR0FuZitiVEFJQ2QrSmw3QVFCYmxDRVZBYUNSQUNBVFpZaEVBR2c3QUt6UFZvcEZBRmd3QUJSbVM4UTVBTmd0QURCSlYyWklBTEMzQU1ET0VBdXlBQWdNQURCUmlJVXBBQVI3QUdESUl5TjRBSVNaQUJSRzhsYzg4U3V1RU9jcUFBQjRtYkk4dVNRNVJZRmJDQzF4QjFkWExoNG96a2tYS3hRMllRSmhta0F1d25tWkdUS0JOQS9nODh3QUFLQ1JGUkhnZy9QOWVNNE9yczdPTm82MkRsOHQ2cjhHL3lKaVl1UCs1YytyY0VBQUFPRjBmdEgrTEMrekdvQTdCb0J0L3FJbDdnUm9YZ3VnZGZlTFpySVBRTFVBb09uYVYvTncrSDQ4UEVXaGtMbloyZVhrNU5oS3hFSmJZY3BYZmY1bndsL0FWLzFzK1g0OC9QZjE0TDdpSklFeVhZRkhCUGpnd3N6MFRLVWN6NUlKaEdMYzVvOUgvTGNMLy93ZDB5TEVTV0s1V0NvVTQxRVNjWTVFbW96ek1xVWlpVUtTS2NVbDB2OWs0dDhzK3dNKzN6VUFzR28rQVh1UkxhaGRZd1AyU3ljUVdIVEE0dmNBQVBLN2I4SFVLQWdEZ0dpRDRjOTMvKzgvL1VlZ0pRQ0Faa21TY1FBQVhrUWtMbFRLc3ovSENBQUFSS0NCS3JCQkcvVEJHQ3pBQmh6QkJkekJDL3hnTm9SQ0pNVENRaEJDQ21TQUhISmdLYXlDUWlpR3piQWRLbUF2MUVBZE5NQlJhSWFUY0E0dXdsVzREajF3RC9waENKN0JLTHlCQ1FSQnlBZ1RZU0hhaUFGaWlsZ2pqZ2dYbVlYNEljRklCQktMSkNESmlCUlJJa3VSTlVneFVvcFVJRlZJSGZJOWNnSTVoMXhHdXBFN3lBQXlndnlHdkVjeGxJR3lVVDNVRExWRHVhZzNHb1JHb2d2UVpIUXhtbzhXb0p2UWNyUWFQWXcyb2VmUXEyZ1AybzgrUThjd3dPZ1lCelBFYkRBdXhzTkNzVGdzQ1pOank3RWlyQXlyeGhxd1Zxd0R1NG4xWTgreGR3UVNnVVhBQ1RZRWQwSWdZUjVCU0ZoTVdFN1lTS2dnSENRMEVkb0pOd2tEaEZIQ0p5S1RxRXUwSnJvUitjUVlZakl4aDFoSUxDUFdFbzhUTHhCN2lFUEVOeVFTaVVNeUo3bVFBa214cEZUU0V0SkcwbTVTSStrc3FaczBTQm9qazhuYVpHdXlCem1VTENBcnlJWGtuZVRENURQa0crUWg4bHNLbldKQWNhVDRVK0lvVXNwcVNobmxFT1UwNVFabG1ESkJWYU9hVXQyb29WUVJOWTlhUXEyaHRsS3ZVWWVvRXpSMW1qbk5neFpKUzZXdG9wWFRHbWdYYVBkcHIraDB1aEhkbFI1T2w5Qlgwc3ZwUitpWDZBUDBkd3dOaGhXRHg0aG5LQm1iR0FjWVp4bDNHSytZVEtZWjA0c1p4MVF3TnpIcm1PZVpENWx2VlZncXRpcDhGWkhLQ3BWS2xTYVZHeW92VkttcXBxcmVxZ3RWODFYTFZJK3BYbE45cmtaVk0xUGpxUW5VbHF0VnFwMVE2MU1iVTJlcE82aUhxbWVvYjFRL3BINVovWWtHV2NOTXcwOURwRkdnc1YvanZNWWdDMk1aczNnc0lXc05xNFoxZ1RYRUpySE4yWHgyS3J1WS9SMjdpejJxcWFFNVF6TktNMWV6VXZPVVpqOEg0NWh4K0p4MFRnbm5LS2VYODM2SzNoVHZLZUlwRzZZMFRMa3haVnhycXBhWGxsaXJTS3RScTBmcnZUYXU3YWVkcHIxRnUxbjdnUTVCeDBvblhDZEhaNC9PQlozblU5bFQzYWNLcHhaTlBUcjFyaTZxYTZVYm9idEVkNzl1cCs2WW5yNWVnSjVNYjZmZWViM24raHg5TC8xVS9XMzZwL1ZIREZnR3N3d2tCdHNNemhnOHhUVnhiendkTDhmYjhWRkRYY05BUTZWaGxXR1g0WVNSdWRFOG85VkdqVVlQakduR1hPTWs0MjNHYmNhakpnWW1JU1pMVGVwTjdwcFNUYm1tS2FZN1REdE14ODNNemFMTjFwazFtejB4MXpMbm0rZWIxNXZmdDJCYWVGb3N0cWkydUdWSnN1UmFwbG51dHJ4dWhWbzVXYVZZVlZwZHMwYXRuYTBsMXJ1dHU2Y1JwN2xPazA2cm50Wm53N0R4dHNtMnFiY1pzT1hZQnR1dXRtMjJmV0ZuWWhkbnQ4V3V3KzZUdlpOOXVuMk4vVDBIRFlmWkRxc2RXaDErYzdSeUZEcFdPdDZhenB6dVAzM0Y5SmJwTDJkWXp4RFAyRFBqdGhQTEtjUnBuVk9iMDBkbkYyZTVjNFB6aUl1SlM0TExMcGMrTHBzYnh0M0l2ZVJLZFBWeFhlRjYwdldkbTdPYnd1Mm8yNi91TnU1cDdvZmNuOHcwbnltZVdUTnowTVBJUStCUjVkRS9DNStWTUd2ZnJINVBRMCtCWjdYbkl5OWpMNUZYcmRld3Q2VjNxdmRoN3hjKzlqNXluK00rNHp3MzNqTGVXVi9NTjhDM3lMZkxUOE52bmwrRjMwTi9JLzlrLzNyLzBRQ25nQ1VCWndPSmdVR0JXd0w3K0hwOEliK09QenJiWmZheTJlMUJqS0M1UVJWQmo0S3RndVhCclNGb3lPeVFyU0gzNTVqT2tjNXBEb1ZRZnVqVzBBZGg1bUdMdzM0TUo0V0hoVmVHUDQ1d2lGZ2EwVEdYTlhmUjNFTnozMFQ2UkpaRTNwdG5NVTg1cnkxS05TbytxaTVxUE5vM3VqUzZQOFl1WmxuTTFWaWRXRWxzU3h3NUxpcXVObTVzdnQvODdmT0g0cDNpQytON0Y1Z3Z5RjF3ZWFIT3d2U0ZweGFwTGhJc09wWkFUSWhPT0pUd1FSQXFxQmFNSmZJVGR5V09Dbm5DSGNKbklpL1JOdEdJMkVOY0toNU84a2dxVFhxUzdKRzhOWGtreFRPbExPVzVoQ2Vwa0x4TURVemRtenFlRnBwMklHMHlQVHE5TVlPU2taQnhRcW9oVFpPMlorcG41bVoyeTZ4bGhiTCt4VzZMdHk4ZWxRZkphN09RckFWWkxRcTJRcWJvVkZvbzF5b0hzbWRsVjJhL3pZbktPWmFybml2TjdjeXp5dHVRTjV6dm4vL3RFc0lTNFpLMnBZWkxWeTBkV09hOXJHbzVzanh4ZWRzSzR4VUZLNFpXQnF3OHVJcTJLbTNWVDZ2dFY1ZXVmcjBtZWsxcmdWN0J5b0xCdFFGcjZ3dFZDdVdGZmV2YzErMWRUMWd2V2QrMVlmcUduUnMrRlltS3JoVGJGNWNWZjlnbzNIamxHNGR2eXIrWjNKUzBxYXZFdVdUUFp0Sm02ZWJlTFo1YkRwYXFsK2FYRG00TjJkcTBEZDlXdE8zMTlrWGJMNWZOS051N2c3WkR1YU8vUExpOFphZkp6czA3UDFTa1ZQUlUrbFEyN3RMZHRXSFgrRzdSN2h0N3ZQWTA3TlhiVzd6My9UN0p2dHRWQVZWTjFXYlZaZnRKKzdQM1A2NkpxdW40bHZ0dFhhMU9iWEh0eHdQU0EvMEhJdzYyMTduVTFSM1NQVlJTajlZcjYwY094eCsrL3AzdmR5ME5OZzFWalp6RzRpTndSSG5rNmZjSjMvY2VEVHJhZG94N3JPRUgweDkySFdjZEwycENtdkthUnB0VG12dGJZbHU2VDh3KzBkYnEzbnI4UjlzZkQ1dzBQRmw1U3ZOVXlXbmE2WUxUazJmeXo0eWRsWjE5Zmk3NTNHRGJvclo3NTJQTzMyb1BiKys2RUhUaDBrWC9pK2M3dkR2T1hQSzRkUEt5MitVVFY3aFhtcTg2WDIzcWRPbzgvcFBUVDhlN25MdWFycmxjYTdudWVyMjFlMmIzNlJ1ZU44N2Q5TDE1OFJiLzF0V2VPVDNkdmZONmIvZkY5L1hmRnQxK2NpZjl6c3U3MlhjbjdxMjhUN3hmOUVEdFFkbEQzWWZWUDF2KzNOanYzSDlxd0hlZzg5SGNSL2NHaFlQUC9wSDFqdzlEQlkrWmo4dUdEWWJybmpnK09UbmlQM0w5NmZ5blE4OWt6eWFlRi82aS9zdXVGeFl2ZnZqVjY5Zk8wWmpSb1pmeWw1Ty9iWHlsL2VyQTZ4bXYyOGJDeGg2K3lYZ3pNVjcwVnZ2dHdYZmNkeDN2bzk4UFQrUjhJSDhvLzJqNXNmVlQwS2Y3a3htVGsvOEVBNWp6L0dNekxkc0FBQUFnWTBoU1RRQUFlaVVBQUlDREFBRDUvd0FBZ09rQUFIVXdBQURxWUFBQU9wZ0FBQmR2a2wvRlJnQUFBRnBKUkVGVWVOcGkvUC8vUHdNbGdISEFEV0Q0Ly84L050eUFReHdENDVLQUFRZEtEZmovLy8vLy9mZ01Jc1lBWklNdzFES1JFRndPREF3TS80a05SS3E2NEFBREE0TWpGRE9RNmdLeVk0SG9kTUE0OVBNQ3hRWUFCZ0FWWUhzanlaMXg3UUFBQUFCSlJVNUVya0pnZ2c9PSk7Cit9CisKK3RhYmxlLnRyZWV0YWJsZSB0ci5leHBhbmRlZC5hY2NlcHQgdGQgc3Bhbi5pbmRlbnRlciBhIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UveC1wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBQUNYQklXWE1BQUFzVEFBQUxFd0VBbXB3WUFBQUtUMmxEUTFCUWFHOTBiM05vYjNBZ1NVTkRJSEJ5YjJacGJHVUFBSGphblZOblZGUHBGajMzM3ZSQ1M0aUFsRXR2VWhVSUlGSkNpNEFVa1NZcUlRa1FTb2dob2RrVlVjRVJSVVVFRzhpZ2lBT09qb0NNRlZFc0RJb0syQWZrSWFLT2c2T0lpc3I3NFh1amE5YTg5K2JOL3JYWFB1ZXM4NTJ6endmQUNBeVdTRE5STllBTXFVSWVFZUNEeDhURzRlUXVRSUVLSkhBQUVBaXpaQ0Z6L1NNQkFQaCtQRHdySXNBSHZnQUJlTk1MQ0FEQVRadkFNQnlIL3cvcVFwbGNBWUNFQWNCMGtUaExDSUFVQUVCNmprS21BRUJHQVlDZG1DWlRBS0FFQUdETFkyTGpBRkF0QUdBbmYrYlRBSUNkK0psN0FRQmJsQ0VWQWFDUkFDQVRaWWhFQUdnN0FLelBWb3BGQUZnd0FCUm1TOFE1QU5ndEFEQkpWMlpJQUxDM0FNRE9FQXV5QUFnTUFEQlJpSVVwQUFSN0FHRElJeU40QUlTWkFCUkc4bGM4OFN1dUVPY3FBQUI0bWJJOHVTUTVSWUZiQ0MxeEIxZFhMaDRvemtrWEt4UTJZUUpobWtBdXdubVpHVEtCTkEvZzg4d0FBS0NSRlJIZ2cvUDllTTRPcnM3T05vNjJEbDh0NnI4Ry95SmlZdVArNWMrcmNFQUFBT0YwZnRIK0xDK3pHb0E3Qm9CdC9xSWw3Z1JvWGd1Z2RmZUxacklQUUxVQW9PbmFWL053K0g0OFBFV2hrTG5aMmVYazVOaEt4RUpiWWNwWGZmNW53bC9BVi8xcytYNDgvUGYxNEw3aUpJRXlYWUZIQlBqZ3dzejBUS1VjejVJSmhHTGM1bzlIL0xjTC8vd2QweUxFU1dLNVdDb1U0MUVTY1k1RW1venpNcVVpaVVLU0tjVWwwdjlrNHQ4cyt3TSszelVBc0dvK0FYdVJMYWhkWXdQMlN5Y1FXSFRBNHZjQUFQSzdiOEhVS0FnRGdHaUQ0YzkzLys4Ly9VZWdKUUNBWmttU2NRQUFYa1FrTGxUS3N6L0hDQUFBUktDQktyQkJHL1RCR0N6QUJoekJCZHpCQy94Z05vUkNKTVRDUWhCQ0NtU0FISEpnS2F5Q1FpaUd6YkFkS21BdjFFQWROTUJSYUlhVGNBNHV3bFc0RGoxd0QvcGhDSjdCS0x5QkNRUkJ5QWdUWVNIYWlBRmlpbGdqamdnWG1ZWDRJY0ZJQkJLTEpDREppQlJSSWt1Uk5VZ3hVb3BVSUZWSUhmSTljZ0k1aDF4R3VwRTd5QUF5Z3Z5R3ZFY3hsSUd5VVQzVURMVkR1YWczR29SR29ndlFaSFF4bW84V29KdlFjclFhUFl3Mm9lZlFxMmdQMm84K1E4Y3d3T2dZQnpQRWJEQXV4c05Dc1Rnc0NaTmp5N0VpckF5cnhocXdWcXdEdTRuMVk4K3hkd1FTZ1VYQUNUWUVkMElnWVI1QlNGaE1XRTdZU0tnZ0hDUTBFZG9KTndrRGhGSENKeUtUcUV1MEpyb1IrY1FZWWpJeGgxaElMQ1BXRW84VEx4QjdpRVBFTnlRU2lVTXlKN21RQWtteHBGVFNFdEpHMG01U0kra3NxWnMwU0Jvams4bmFaR3V5QnptVUxDQXJ5SVhrbmVURDVEUGtHK1FoOGxzS25XSkFjYVQ0VStJb1VzcHFTaG5sRU9VMDVRWmxtREpCVmFPYVV0Mm9vVlFSTlk5YVFxMmh0bEt2VVllb0V6UjFtam5OZ3haSlM2V3RvcFhUR21nWGFQZHByK2gwdWhIZGxSNU9sOUJYMHN2cFIraVg2QVAwZHd3TmhoV0R4NGhuS0JtYkdBY1laeGwzR0srWVRLWVowNHNaeDFRd056SHJtT2VaRDVsdlZWZ3F0aXA4RlpIS0NwVktsU2FWR3lvdlZLbXFwcXJlcWd0VjgxWExWSStwWGxOOXJrWlZNMVBqcVFuVWxxdFZxcDFRNjFNYlUyZXBPNmlIcW1lb2IxUS9wSDVaL1lrR1djTk13MDlEcEZHZ3NWL2p2TVlnQzJNWnMzZ3NJV3NOcTRaMWdUWEVKckhOMlh4MktydVkvUjI3aXoycXFhRTVRek5LTTFlelV2T1VaajhINDVoeCtKeDBUZ25uS0tlWDgzNkszaFR2S2VJcEc2WTBUTGt4WlZ4cnFwYVhsbGlyU0t0UnEwZnJ2VGF1N2FlZHByMUZ1MW43Z1E1Qngwb25YQ2RIWjQvT0JaM25VOWxUM2FjS3B4Wk5QVHIxcmk2cWE2VWJvYnRFZDc5dXArNllucjVlZ0o1TWI2ZmVlYjNuK2h4OUwvMVUvVzM2cC9WSERGZ0dzd3drQnRzTXpoZzh4VFZ4Ynp3ZEw4ZmI4VkZEWGNOQVE2VmhsV0dYNFlTUnVkRThvOVZHalVZUGpHbkdYT01rNDIzR2JjYWpKZ1ltSVNaTFRlcE43cHBTVGJtbUthWTdURHRNeDgzTXphTE4xcGsxbXoweDF6TG5tK2ViMTV2ZnQyQmFlRm9zdHFpMnVHVkpzdVJhcGxudXRyeHVoVm81V2FWWVZWcGRzMGF0bmEwbDFydXR1NmNScDdsT2swNnJudFpudzdEeHRzbTJxYmNac09YWUJ0dXV0bTIyZldGblloZG50OFd1dys2VHZaTjl1bjJOL1QwSERZZlpEcXNkV2gxK2M3UnlGRHBXT3Q2YXpwenVQMzNGOUpicEwyZFl6eERQMkRQanRoUExLY1JwblZPYjAwZG5GMmU1YzRQemlJdUpTNExMTHBjK0xwc2J4dDNJdmVSS2RQVnhYZUY2MHZXZG03T2J3dTJvMjYvdU51NXA3b2Zjbjh3MG55bWVXVE56ME1QSVErQlI1ZEUvQzUrVk1HdmZySDVQUTArQlo3WG5JeTlqTDVGWHJkZXd0NlYzcXZkaDd4Yys5ajV5bitNKzR6dzMzakxlV1YvTU44QzN5TGZMVDhOdm5sK0YzME4vSS85ay8zci8wUUNuZ0NVQlp3T0pnVUdCV3dMNytIcDhJYitPUHpyYlpmYXkyZTFCaktDNVFSVkJqNEt0Z3VYQnJTRm95T3lRclNIMzU1ak9rYzVwRG9WUWZ1alcwQWRoNW1HTHczNE1KNFdIaFZlR1A0NXdpRmdhMFRHWE5YZlIzRU56MzBUNlJKWkUzcHRuTVU4NXJ5MUtOU28rcWk1cVBObzN1alM2UDhZdVpsbk0xVmlkV0Vsc1N4dzVMaXF1Tm01c3Z0Lzg3Zk9INHAzaUMrTjdGNWd2eUYxd2VhSE93dlNGcHhhcExoSXNPcFpBVEloT09KVHdRUkFxcUJhTUpmSVRkeVdPQ25uQ0hjSm5JaS9STnRHSTJFTmNLaDVPOGtncVRYcVM3Skc4Tlhra3hUT2xMT1c1aENlcGtMeE1EVXpkbXpxZUZwcDJJRzB5UFRxOU1ZT1NrWkJ4UXFvaFRaTzJaK3BuNW1aMnk2eGxoYkwreFc2THR5OGVsUWZKYTdPUXJBVlpMUXEyUXFib1ZGb28xeW9Ic21kbFYyYS96WW5LT1phcm5pdk43Y3l6eXR1UU41enZuLy90RXNJUzRaSzJwWVpMVnkwZFdPYTlyR281c2p4eGVkc0s0eFVGSzRaV0Jxdzh1SXEyS20zVlQ2dnRWNWV1ZnIwbWVrMXJnVjdCeW9MQnRRRnI2d3RWQ3VXRmZldmMxKzFkVDFndldkKzFZZnFHblJzK0ZZbUtyaFRiRjVjVmY5Z28zSGpsRzRkdnlyK1ozSlMwcWF2RXVXVFBadEptNmViZUxaNWJEcGFxbCthWERtNE4yZHEwRGQ5V3RPMzE5a1hiTDVmTktOdTdnN1pEdWFPL1BMaThaYWZKenMwN1AxU2tWUFJVK2xRMjd0TGR0V0hYK0c3UjdodDd2UFkwN05YYlc3ejMvVDdKdnR0VkFWVk4xV2JWWmZ0Sis3UDNQNjZKcXVuNGx2dHRYYTFPYlhIdHh3UFNBLzBISXc2MjE3blUxUjNTUFZSU2o5WXI2MGNPeHgrKy9wM3ZkeTBOTmcxVmpaekc0aU53UkhuazZmY0ozL2NlRFRyYWRveDdyT0VIMHg5MkhXY2RMMnBDbXZLYVJwdFRtdnRiWWx1NlQ4dyswZGJxM25yOFI5c2ZENXcwUEZsNVN2TlV5V25hNllMVGsyZnl6NHlkbFoxOWZpNzUzR0Rib3JaNzUyUE8zMm9QYisrNkVIVGgwa1gvaStjN3ZEdk9YUEs0ZFBLeTIrVVRWN2hYbXE4NlgyM3FkT284L3BQVFQ4ZTduTHVhcnJsY2E3bnVlcjIxZTJiMzZSdWVOODdkOUwxNThSYi8xdFdlT1QzZHZmTjZiL2ZGOS9YZkZ0MStjaWY5enN1NzJYY243cTI4VDd4ZjlFRHRRZGxEM1lmVlAxdiszTmp2M0g5cXdIZWc4OUhjUi9jR2hZUFAvcEgxanc5REJZK1pqOHVHRFlicm5qZytPVG5pUDNMOTZmeW5RODlrenlhZUYvNmkvc3V1RnhZdmZ2alY2OWZPMFpqUm9aZnlsNU8vYlh5bC9lckE2eG12MjhiQ3hoNit5WGd6TVY3MFZ2dnR3WGZjZHgzdm85OFBUK1I4SUg4by8yajVzZlZUMEtmN2t4bVRrLzhFQTVqei9HTXpMZHNBQUFBZ1kwaFNUUUFBZWlVQUFJQ0RBQUQ1L3dBQWdPa0FBSFV3QUFEcVlBQUFPcGdBQUJkdmtsL0ZSZ0FBQUZ0SlJFRlVlTnBpL1AvL1B3TWxnSW1CUXNBNDRDNmdpUUVOREF3TS8vSGdCbUxDQUYvQU1CTGpCVWVpeGYvLy80OEw3LytQQ3ZaalU0ZlBBQWMwQXh5d3FjTVhDd2VnR0oxTmNrTDZqeDV3cEtZRHhxR1hFa2tDZ0FFQW1ycUJJZWpkZ25nQUFBQUFTVVZPUks1Q1lJST0pOworfQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9qcy8uanNoaW50cmMgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2pzLy5qc2hpbnRyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDJmM2VmCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9qcy8uanNoaW50cmMKQEAgLTAsMCArMSwxMSBAQAoreworICAiY3VybHkiIDogZmFsc2UsCisgICJwcmVkZWYiIDogWyAiJCIsImxpYnRvYXN0ZXIiLCAicHJldHR5UHJpbnQiIF0sCisgICJlcW51bGwiOiB0cnVlLAorICAicGx1c3BsdXMiIDogZmFsc2UsCisgICJicm93c2VyIiA6IHRydWUsCisgICJqcXVlcnkiIDogdHJ1ZSwKKyAgImRldmVsIiA6IHRydWUsCisgICJ1bnVzZWQiIDogdHJ1ZSwKKyAgIm1heGVyciIgOiA2MAorfQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9qcy9iYXNlLmpzIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9qcy9iYXNlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZGY0NjMKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2pzL2Jhc2UuanMKQEAgLTAsMCArMSwyMzEgQEAKKyd1c2Ugc3RyaWN0JzsKKworZnVuY3Rpb24gYmFzZVBhZ2VJbml0KGN0eCkgeworCisgIHZhciBuZXdCdWlsZEJ1dHRvbiA9ICQoIiNuZXctYnVpbGQtYnV0dG9uIik7CisgIHZhciBuZXdCdWlsZFRhcmdldElucHV0OworICB2YXIgbmV3QnVpbGRUYXJnZXRCdWlsZEJ0bjsKKyAgdmFyIHByb2plY3ROYW1lRm9ybSA9ICQoIiNwcm9qZWN0LW5hbWUtY2hhbmdlLWZvcm0iKTsKKyAgdmFyIHByb2plY3ROYW1lID0gJCgiI3Byb2plY3QtbmFtZSIpOworICB2YXIgcHJvamVjdE5hbWVGb3JtVG9nZ2xlID0gJCgiI3Byb2plY3QtY2hhbmdlLWZvcm0tdG9nZ2xlIik7CisgIHZhciBwcm9qZWN0TmFtZUNoYW5nZUNhbmNlbCA9ICQoIiNwcm9qZWN0LW5hbWUtY2hhbmdlLWNhbmNlbCIpOworCisgIC8qIGluaXRpYWxseSB0aGUgY3VycmVudCBwcm9qZWN0IGlzIHVzZWQgdW5sZXNzIG92ZXJyaWRkZW4gYnkgdGhlIG5ldyBidWlsZAorICAgKiBidXR0b24gaW4gdG9wIHJpZ2h0IG5hdgorICAgKi8KKyAgdmFyIHNlbGVjdGVkUHJvamVjdCA9IGxpYnRvYXN0ZXIuY3R4OworCisgIHZhciBzZWxlY3RlZFRhcmdldDsKKworICB2YXIgbmV3QnVpbGRQcm9qZWN0SW5wdXQgPSAkKCIjbmV3LWJ1aWxkLWJ1dHRvbiAjcHJvamVjdC1uYW1lLWlucHV0Iik7CisgIHZhciBuZXdCdWlsZFByb2plY3RTYXZlQnRuID0gJCgiI25ldy1idWlsZC1idXR0b24gI3NhdmUtcHJvamVjdC1idXR0b24iKTsKKworICAvKiBQcm9qZWN0IG5hbWUgY2hhbmdlIGZ1bmN0aW9uYWxpdHkgKi8KKyAgcHJvamVjdE5hbWVGb3JtVG9nZ2xlLmNsaWNrKGZ1bmN0aW9uKGUpeworICAgIGUucHJldmVudERlZmF1bHQoKTsKKworICAgICQodGhpcykuYWRkKHByb2plY3ROYW1lKS5oaWRlKCk7CisgICAgcHJvamVjdE5hbWVGb3JtLmZhZGVJbigpOworICB9KTsKKworICBwcm9qZWN0TmFtZUNoYW5nZUNhbmNlbC5jbGljayhmdW5jdGlvbihlKXsKKyAgICBlLnByZXZlbnREZWZhdWx0KCk7CisKKyAgICBwcm9qZWN0TmFtZUZvcm0uaGlkZSgpOworICAgIHByb2plY3ROYW1lLmFkZChwcm9qZWN0TmFtZUZvcm1Ub2dnbGUpLmZhZGVJbigpOworICB9KTsKKworICAkKCIjcHJvamVjdC1uYW1lLWNoYW5nZS1idG4iKS5jbGljayhmdW5jdGlvbihlKXsKKyAgICB2YXIgbmV3UHJvamVjdE5hbWUgPSAkKCIjcHJvamVjdC1uYW1lLWNoYW5nZS1pbnB1dCIpLnZhbCgpOworCisgICAgbGlidG9hc3Rlci5lZGl0Q3VycmVudFByb2plY3QoeyBwcm9qZWN0TmFtZTogbmV3UHJvamVjdE5hbWUgfSxmdW5jdGlvbiAoKXsKKworICAgICAgcHJvamVjdE5hbWUudGV4dChuZXdQcm9qZWN0TmFtZSk7CisgICAgICBsaWJ0b2FzdGVyLmN0eC5wcm9qZWN0TmFtZSA9IG5ld1Byb2plY3ROYW1lOworICAgICAgcHJvamVjdE5hbWVDaGFuZ2VDYW5jZWwuY2xpY2soKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgX2NoZWNrUHJvamVjdEJ1aWxkYWJsZSgpOworCisgICQoIiNwcm9qZWN0LXRvcGJhciAubmF2IGxpIGEiKS5lYWNoKGZ1bmN0aW9uKCl7CisgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSA9PT0gJCh0aGlzKS5hdHRyKCdocmVmJykpCisgICAgICAkKHRoaXMpLnBhcmVudCgpLmFkZENsYXNzKCdhY3RpdmUnKTsKKyAgICBlbHNlCisgICAgICAkKHRoaXMpLnBhcmVudCgpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTsKKyAgfSk7CisKKyAgaWYgKCQoIi50b3RhbC1idWlsZHMiKS5sZW5ndGggIT09IDApeworICAgIGxpYnRvYXN0ZXIuZ2V0UHJvamVjdEluZm8obGlidG9hc3Rlci5jdHgucHJvamVjdFBhZ2VVcmwsIGZ1bmN0aW9uKHByakluZm8peworICAgICAgaWYgKHByakluZm8uYnVpbGRzKQorICAgICAgICAkKCIudG90YWwtYnVpbGRzIikudGV4dChwcmpJbmZvLmJ1aWxkcy5sZW5ndGgpOworICAgIH0pOworICB9CisKKyAgLyogSGlkZSB0aGUgYnV0dG9uIGlmIHdlJ3JlIG9uIHRoZSBwcm9qZWN0LG5ld3Byb2plY3Qgb3IgaW1wb3J0bHlhZXIgcGFnZQorICAgKiBvciBpZiB0aGVyZSBhcmUgbm8gcHJvamVjdHMgeWV0IGRlZmluZWQKKyAgICogb25seSBzaG93IGlmIHRoZXJlIGlzbid0IGFscmVhZHkgYSBidWlsZC10YXJnZXQtaW5wdXQgYWxyZWFkeQorICAgKi8KKyAgaWYgKGN0eC5udW1Qcm9qZWN0cyA+IDAgJiYKKyAgICAgIGN0eC5jdXJyZW50VXJsLnNlYXJjaCgnbmV3cHJvamVjdCcpIDwgMCAmJgorICAgICAgJCgiLmJ1aWxkLXRhcmdldC1pbnB1dCIpLmxlbmd0aCA9PT0gMSkgeworCisgICAgbmV3QnVpbGRUYXJnZXRJbnB1dCA9ICQoIiNuZXctYnVpbGQtYnV0dG9uIC5idWlsZC10YXJnZXQtaW5wdXQiKTsKKyAgICBuZXdCdWlsZFRhcmdldEJ1aWxkQnRuID0gJCgiI25ldy1idWlsZC1idXR0b24iKS5maW5kKCIuYnVpbGQtYnV0dG9uIik7CisKKyAgICBfc2V0dXBOZXdCdWlsZEJ1dHRvbigpOworICAgIG5ld0J1aWxkQnV0dG9uLnNob3coKTsKKyAgfSBlbHNlIGlmICgkKCIuYnVpbGQtdGFyZ2V0LWlucHV0IikubGVuZ3RoID4gMCkgeworICAgIG5ld0J1aWxkVGFyZ2V0SW5wdXQgPSAkKCIjcHJvamVjdC10b3BiYXIgLmJ1aWxkLXRhcmdldC1pbnB1dCIpOworICAgIG5ld0J1aWxkVGFyZ2V0QnVpbGRCdG4gPSAkKCIjcHJvamVjdC10b3BiYXIgLmJ1aWxkLWJ1dHRvbiIpOworICB9IGVsc2UgeworICAgIHJldHVybjsKKyAgfQorCisgIC8qIEhpZGUgdGhlIGNoYW5nZSBwcm9qZWN0IGljb24gd2hlbiB0aGVyZSBpcyBvbmx5IG9uZSBwcm9qZWN0ICovCisgIGlmIChjdHgubnVtUHJvamVjdHMgPT09IDEpIHsKKyAgICAkKCcjcHJvamVjdCAuaWNvbi1wZW5jaWwnKS5oaWRlKCk7CisgIH0KKworICAvKiBJZiB3ZSBoYXZlIGEgcHJvamVjdCBzZXR1cCB0aGUgdHlwZWFoZWFkICovCisgIGlmIChzZWxlY3RlZFByb2plY3QucmVjaXBlc1R5cGVBaGVhZFVybCl7CisgICAgbGlidG9hc3Rlci5tYWtlVHlwZWFoZWFkKG5ld0J1aWxkVGFyZ2V0SW5wdXQsIHNlbGVjdGVkUHJvamVjdC5yZWNpcGVzVHlwZUFoZWFkVXJsLCB7IGZvcm1hdDogImpzb24iIH0sIGZ1bmN0aW9uIChpdGVtKSB7CisgICAgICBzZWxlY3RlZFRhcmdldCA9IGl0ZW07CisgICAgICBuZXdCdWlsZFRhcmdldEJ1aWxkQnRuLnJlbW92ZUF0dHIoImRpc2FibGVkIik7CisgICAgfSk7CisgIH0KKworICBuZXdCdWlsZFRhcmdldElucHV0Lm9uKCdpbnB1dCcsIGZ1bmN0aW9uICgpIHsKKyAgICBpZiAoJCh0aGlzKS52YWwoKS5sZW5ndGggPT09IDApIHsKKyAgICAgIG5ld0J1aWxkVGFyZ2V0QnVpbGRCdG4uYXR0cigiZGlzYWJsZWQiLCAiZGlzYWJsZWQiKTsKKyAgICB9IGVsc2UgeworICAgICAgbmV3QnVpbGRUYXJnZXRCdWlsZEJ0bi5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpOworICAgIH0KKyAgfSk7CisKKyAgbmV3QnVpbGRUYXJnZXRCdWlsZEJ0bi5jbGljayhmdW5jdGlvbiAoZSkgeworICAgIGUucHJldmVudERlZmF1bHQoKTsKKworICAgIGlmICghbmV3QnVpbGRUYXJnZXRJbnB1dC52YWwoKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIFdlIHVzZSB0aGUgdmFsdWUgb2YgdGhlIGlucHV0IGZpZWxkIHNvIGFzIHRvIG1haW50YWluIGFueSBjb21tYW5kIGFsc28KKyAgICAgKiBhZGRlZCBlLmcuIGNvcmUtaW1hZ2UtbWluaW1hbDpjbGVhbgorICAgICAqLworICAgIHNlbGVjdGVkVGFyZ2V0ID0geyBuYW1lOiBuZXdCdWlsZFRhcmdldElucHV0LnZhbCgpIH07CisKKyAgICAvKiBGaXJlIG9mZiB0aGUgYnVpbGQgKi8KKyAgICBsaWJ0b2FzdGVyLnN0YXJ0QUJ1aWxkKHNlbGVjdGVkUHJvamVjdC5wcm9qZWN0QnVpbGRzVXJsLAorICAgICAgc2VsZWN0ZWRQcm9qZWN0LnByb2plY3RJZCwgc2VsZWN0ZWRUYXJnZXQubmFtZSwgZnVuY3Rpb24oKXsKKyAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKHNlbGVjdGVkUHJvamVjdC5wcm9qZWN0QnVpbGRzVXJsKTsKKyAgICB9LCBudWxsKTsKKyAgfSk7CisKKyAgZnVuY3Rpb24gX2NoZWNrUHJvamVjdEJ1aWxkYWJsZSgpIHsKKyAgICBpZiAoc2VsZWN0ZWRQcm9qZWN0LnByb2plY3RJZCA9PT0gdW5kZWZpbmVkKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgbGlidG9hc3Rlci5nZXRQcm9qZWN0SW5mbyhzZWxlY3RlZFByb2plY3QucHJvamVjdFBhZ2VVcmwsCisgICAgICBmdW5jdGlvbiAoZGF0YSkgeworICAgICAgICBpZiAoZGF0YS5tYWNoaW5lID09PSBudWxsIHx8IGRhdGEubWFjaGluZS5uYW1lID09PSB1bmRlZmluZWQgfHwgZGF0YS5sYXllcnMubGVuZ3RoID09PSAwKSB7CisgICAgICAgICAgLyogd2UgY2FuJ3QgYnVpbGQgYW55dGhpbmcgd2l0aCBvdXQgYSBtYWNoaW5lIGFuZCBzb21lIGxheWVycyAqLworICAgICAgICAgICQoIiNuZXctYnVpbGQtYnV0dG9uICN0YXJnZXRzLWZvcm0iKS5oaWRlKCk7CisgICAgICAgICAgJCgiI25ldy1idWlsZC1idXR0b24gLmFsZXJ0Iikuc2hvdygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICQoIiNuZXctYnVpbGQtYnV0dG9uICN0YXJnZXRzLWZvcm0iKS5zaG93KCk7CisgICAgICAgICAgJCgiI25ldy1idWlsZC1idXR0b24gLmFsZXJ0IikuaGlkZSgpOworCisgICAgICAgICAgLyogd2UgY2FuIGJ1aWxkIHRoaXMgcHJvamVjdDsgZW5hYmxlIGlucHV0IGZpZWxkcyAqLworICAgICAgICAgIG5ld0J1aWxkVGFyZ2V0SW5wdXQucmVtb3ZlQXR0cigiZGlzYWJsZWQiKTsKKyAgICAgICB9CisgICAgICB9LCBudWxsKTsKKyAgfQorCisgIC8qIFNldHVwIE5ldyBidWlsZCBidXR0b24gaW4gdGhlIHRvcCBuYXYgYmFyICovCisgIGZ1bmN0aW9uIF9zZXR1cE5ld0J1aWxkQnV0dG9uKCkgeworCisgICAgLyogSWYgd2UgZG9uJ3QgaGF2ZSBhIGN1cnJlbnQgcHJvamVjdCB0aGVuIHByZXNlbnQgdGhlIHNldCBwcm9qZWN0CisgICAgICogZm9ybS4KKyAgICAgKi8KKyAgICBpZiAoc2VsZWN0ZWRQcm9qZWN0LnByb2plY3RJZCA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAkKCcjY2hhbmdlLXByb2plY3QtZm9ybScpLnNob3coKTsKKyAgICAgICQoJyNwcm9qZWN0IC5pY29uLXBlbmNpbCcpLmhpZGUoKTsKKyAgICB9CisKKyAgICBsaWJ0b2FzdGVyLm1ha2VUeXBlYWhlYWQobmV3QnVpbGRQcm9qZWN0SW5wdXQsIHNlbGVjdGVkUHJvamVjdC5wcm9qZWN0c1R5cGVBaGVhZFVybCwgeyBmb3JtYXQgOiAianNvbiIgfSwgZnVuY3Rpb24gKGl0ZW0pIHsKKyAgICAgIC8qIHN1Y2Nlc3NmdWxseSBzZWxlY3RlZCBhIHByb2plY3QgKi8KKyAgICAgIG5ld0J1aWxkUHJvamVjdFNhdmVCdG4ucmVtb3ZlQXR0cigiZGlzYWJsZWQiKTsKKyAgICAgIHNlbGVjdGVkUHJvamVjdCA9IGl0ZW07CisgICAgfSk7CisKKyAgICAvKiBBbnkgdHlwaW5nIGluIHRoZSBpbnB1dCBhcGFydCBmcm9tIGVudGVyIGtleSBpcyBnb2luZyB0byBpbnZhbGlkYXRlCisgICAgICogdGhlIHZhbHVlIHRoYXQgaGFzIGJlZW4gc2V0IGJ5IHNlbGVjdGluZyBhIHN1Z2dlc3Rpb24gZnJvbSB0aGUgdHlwZWFoZWFkCisgICAgICovCisgICAgbmV3QnVpbGRQcm9qZWN0SW5wdXQub24oJ2lucHV0JywgZnVuY3Rpb24gKGV2ZW50KSB7CisgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gMTMpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgbmV3QnVpbGRQcm9qZWN0U2F2ZUJ0bi5hdHRyKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOworICAgIH0pOworCisKKyAgICBuZXdCdWlsZFByb2plY3RTYXZlQnRuLmNsaWNrKGZ1bmN0aW9uICgpIHsKKyAgICAgIHNlbGVjdGVkUHJvamVjdC5wcm9qZWN0SWQgPSBzZWxlY3RlZFByb2plY3QuaWQ7CisgICAgICAvKiBVcGRhdGUgdGhlIHR5cGVhaGVhZCBwcm9qZWN0X2lkIHBhcmFtYXRlciAqLworICAgICAgX2NoZWNrUHJvamVjdEJ1aWxkYWJsZSgpOworCisgICAgICBuZXdCdWlsZFRhcmdldElucHV0LnJlbW92ZUF0dHIoImRpc2FibGVkIik7CisKKyAgICAgIC8qIFdlJ3ZlIGdvdCBhIG5ldyBwcm9qZWN0IHNvIG5vdyB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUKKyAgICAgICAqIHRhcmdldCB1cmxzLiBXZSBjYW4gZ2V0IHRoaXMgZnJvbSB0aGUgbmV3IHByb2plY3QncyBpbmZvCisgICAgICAgKi8KKyAgICAgICQuZ2V0SlNPTihzZWxlY3RlZFByb2plY3QucHJvamVjdFBhZ2VVcmwsIHsgZm9ybWF0OiAianNvbiIgfSwKKyAgICAgICAgZnVuY3Rpb24ocHJvamVjdEluZm8peworICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgdHlwZWFoZWFkIHRvIHVzZSB0aGUgbmV3IHNlbGVjdGVkUHJvamVjdCAqLworICAgICAgICAgIHNlbGVjdGVkUHJvamVjdCA9IHByb2plY3RJbmZvOworCisgICAgICAgICAgbGlidG9hc3Rlci5tYWtlVHlwZWFoZWFkKG5ld0J1aWxkVGFyZ2V0SW5wdXQsIHNlbGVjdGVkUHJvamVjdC5yZWNpcGVzVHlwZUFoZWFkVXJsLCB7IGZvcm1hdDogImpzb24iIH0sIGZ1bmN0aW9uIChpdGVtKSB7CisgICAgICAgICAgICAgIC8qIHN1Y2Nlc3NmdWxseSBzZWxlY3RlZCBhIHRhcmdldCAqLworICAgICAgICAgICAgICBzZWxlY3RlZFRhcmdldCA9IGl0ZW07CisgICAgICAgICAgICAgIG5ld0J1aWxkVGFyZ2V0QnVpbGRCdG4ucmVtb3ZlQXR0cigiZGlzYWJsZWQiKTsKKyAgICAgICAgICB9KTsKKworICAgICAgfSk7CisgICAgICBuZXdCdWlsZFRhcmdldElucHV0LnZhbCgiIik7CisKKyAgICAgIC8qIHNldCB1cCBuZXcgZm9ybSBhc3BlY3QgKi8KKyAgICAgICQoIiNuZXctYnVpbGQtYnV0dG9uICNwcm9qZWN0IGEiKS50ZXh0KHNlbGVjdGVkUHJvamVjdC5uYW1lKS5hdHRyKCdocmVmJywgc2VsZWN0ZWRQcm9qZWN0LnByb2plY3RQYWdlVXJsKTsKKyAgICAgICQoIiNuZXctYnVpbGQtYnV0dG9uIC5hbGVydCBhIikuYXR0cignaHJlZicsIHNlbGVjdGVkUHJvamVjdC5wcm9qZWN0UGFnZVVybCk7CisgICAgICAkKCIjcHJvamVjdCAuaWNvbi1wZW5jaWwiKS5zaG93KCk7CisKKyAgICAgICQoIiNjaGFuZ2UtcHJvamVjdC1mb3JtIikuc2xpZGVVcCh7ICdjb21wbGV0ZScgOiBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgJCgiI25ldy1idWlsZC1idXR0b24gI3Byb2plY3QiKS5zaG93KCk7CisgICAgICB9fSk7CisgICAgfSk7CisKKyAgICAkKCcjbmV3LWJ1aWxkLWJ1dHRvbiAjcHJvamVjdCAuaWNvbi1wZW5jaWwnKS5jbGljayhmdW5jdGlvbiAoKSB7CisgICAgICBuZXdCdWlsZFByb2plY3RTYXZlQnRuLmF0dHIoImRpc2FibGVkIiwgImRpc2FibGVkIik7CisgICAgICBuZXdCdWlsZFByb2plY3RJbnB1dC52YWwoJCgiI25ldy1idWlsZC1idXR0b24gI3Byb2plY3QgYSIpLnRleHQoKSk7CisgICAgICAkKCIjY2FuY2VsLWNoYW5nZS1wcm9qZWN0Iikuc2hvdygpOworICAgICAgJCh0aGlzKS5wYXJlbnQoKS5oaWRlKCk7CisgICAgICAkKCIjY2hhbmdlLXByb2plY3QtZm9ybSIpLnNsaWRlRG93bigpOworICAgIH0pOworCisgICAgJCgiI25ldy1idWlsZC1idXR0b24gI2NhbmNlbC1jaGFuZ2UtcHJvamVjdCIpLmNsaWNrKGZ1bmN0aW9uICgpIHsKKyAgICAgICQoIiNjaGFuZ2UtcHJvamVjdC1mb3JtIikuaGlkZShmdW5jdGlvbiAoKSB7CisgICAgICAgICQoJyNuZXctYnVpbGQtYnV0dG9uICNwcm9qZWN0Jykuc2hvdygpOworICAgICAgfSk7CisKKyAgICAgIG5ld0J1aWxkUHJvamVjdElucHV0LnZhbCgiIik7CisgICAgICBuZXdCdWlsZFByb2plY3RTYXZlQnRuLmF0dHIoImRpc2FibGVkIiwgImRpc2FibGVkIik7CisgICAgfSk7CisKKyAgICAvKiBLZWVwIHRoZSBkcm9wZG93biBvcGVuIGV2ZW4gdW5sZXNzIHdlIGNsaWNrIG91dHNpZGUgdGhlIGRyb3Bkb3duIGFyZWEgKi8KKyAgICAkKCIubmV3LWJ1aWxkIikuY2xpY2sgKGZ1bmN0aW9uIChldmVudCkgeworICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CisgICAgfSk7CisgIH07CisKK30KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvanMvYm9vdHN0cmFwLm1pbi5qcyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvanMvYm9vdHN0cmFwLm1pbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDgyNThkCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9qcy9ib290c3RyYXAubWluLmpzCkBAIC0wLDAgKzEsNiBAQAorLyohCisqIEJvb3RzdHJhcC5qcyBieSBAZmF0ICYgQG1kbworKiBDb3B5cmlnaHQgMjAxMyBUd2l0dGVyLCBJbmMuCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQKKyovCishZnVuY3Rpb24oZSl7InVzZSBzdHJpY3QiO2UoZnVuY3Rpb24oKXtlLnN1cHBvcnQudHJhbnNpdGlvbj1mdW5jdGlvbigpe3ZhciBlPWZ1bmN0aW9uKCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYm9vdHN0cmFwIiksdD17V2Via2l0VHJhbnNpdGlvbjoid2Via2l0VHJhbnNpdGlvbkVuZCIsTW96VHJhbnNpdGlvbjoidHJhbnNpdGlvbmVuZCIsT1RyYW5zaXRpb246Im9UcmFuc2l0aW9uRW5kIG90cmFuc2l0aW9uZW5kIix0cmFuc2l0aW9uOiJ0cmFuc2l0aW9uZW5kIn0sbjtmb3IobiBpbiB0KWlmKGUuc3R5bGVbbl0hPT11bmRlZmluZWQpcmV0dXJuIHRbbl19KCk7cmV0dXJuIGUmJntlbmQ6ZX19KCl9KX0od2luZG93LmpRdWVyeSksIWZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgdD0nW2RhdGEtZGlzbWlzcz0iYWxlcnQiXScsbj1mdW5jdGlvbihuKXtlKG4pLm9uKCJjbGljayIsdCx0aGlzLmNsb3NlKX07bi5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gcygpe2kudHJpZ2dlcigiY2xvc2VkIikucmVtb3ZlKCl9dmFyIG49ZSh0aGlzKSxyPW4uYXR0cigiZGF0YS10YXJnZXQiKSxpO3J8fChyPW4uYXR0cigiaHJlZiIpLHI9ciYmci5yZXBsYWNlKC8uKig/PSNbXlxzXSokKS8sIiIpKSxpPWUociksdCYmdC5wcmV2ZW50RGVmYXVsdCgpLGkubGVuZ3RofHwoaT1uLmhhc0NsYXNzKCJhbGVydCIpP246bi5wYXJlbnQoKSksaS50cmlnZ2VyKHQ9ZS5FdmVudCgiY2xvc2UiKSk7aWYodC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSlyZXR1cm47aS5yZW1vdmVDbGFzcygiaW4iKSxlLnN1cHBvcnQudHJhbnNpdGlvbiYmaS5oYXNDbGFzcygiZmFkZSIpP2kub24oZS5zdXBwb3J0LnRyYW5zaXRpb24uZW5kLHMpOnMoKX07dmFyIHI9ZS5mbi5hbGVydDtlLmZuLmFsZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgcj1lKHRoaXMpLGk9ci5kYXRhKCJhbGVydCIpO2l8fHIuZGF0YSgiYWxlcnQiLGk9bmV3IG4odGhpcykpLHR5cGVvZiB0PT0ic3RyaW5nIiYmaVt0XS5jYWxsKHIpfSl9LGUuZm4uYWxlcnQuQ29uc3RydWN0b3I9bixlLmZuLmFsZXJ0Lm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gZS5mbi5hbGVydD1yLHRoaXN9LGUoZG9jdW1lbnQpLm9uKCJjbGljay5hbGVydC5kYXRhLWFwaSIsdCxuLnByb3RvdHlwZS5jbG9zZSl9KHdpbmRvdy5qUXVlcnkpLCFmdW5jdGlvbihlKXsidXNlIHN0cmljdCI7dmFyIHQ9ZnVuY3Rpb24odCxuKXt0aGlzLiRlbGVtZW50PWUodCksdGhpcy5vcHRpb25zPWUuZXh0ZW5kKHt9LGUuZm4uYnV0dG9uLmRlZmF1bHRzLG4pfTt0LnByb3RvdHlwZS5zZXRTdGF0ZT1mdW5jdGlvbihlKXt2YXIgdD0iZGlzYWJsZWQiLG49dGhpcy4kZWxlbWVudCxyPW4uZGF0YSgpLGk9bi5pcygiaW5wdXQiKT8idmFsIjoiaHRtbCI7ZSs9IlRleHQiLHIucmVzZXRUZXh0fHxuLmRhdGEoInJlc2V0VGV4dCIsbltpXSgpKSxuW2ldKHJbZV18fHRoaXMub3B0aW9uc1tlXSksc2V0VGltZW91dChmdW5jdGlvbigpe2U9PSJsb2FkaW5nVGV4dCI/bi5hZGRDbGFzcyh0KS5hdHRyKHQsdCk6bi5yZW1vdmVDbGFzcyh0KS5yZW1vdmVBdHRyKHQpfSwwKX0sdC5wcm90b3R5cGUudG9nZ2xlPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kZWxlbWVudC5jbG9zZXN0KCdbZGF0YS10b2dnbGU9ImJ1dHRvbnMtcmFkaW8iXScpO2UmJmUuZmluZCgiLmFjdGl2ZSIpLnJlbW92ZUNsYXNzKCJhY3RpdmUiKSx0aGlzLiRlbGVtZW50LnRvZ2dsZUNsYXNzKCJhY3RpdmUiKX07dmFyIG49ZS5mbi5idXR0b247ZS5mbi5idXR0b249ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciByPWUodGhpcyksaT1yLmRhdGEoImJ1dHRvbiIpLHM9dHlwZW9mIG49PSJvYmplY3QiJiZuO2l8fHIuZGF0YSgiYnV0dG9uIixpPW5ldyB0KHRoaXMscykpLG49PSJ0b2dnbGUiP2kudG9nZ2xlKCk6biYmaS5zZXRTdGF0ZShuKX0pfSxlLmZuLmJ1dHRvbi5kZWZhdWx0cz17bG9hZGluZ1RleHQ6ImxvYWRpbmcuLi4ifSxlLmZuLmJ1dHRvbi5Db25zdHJ1Y3Rvcj10LGUuZm4uYnV0dG9uLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gZS5mbi5idXR0b249bix0aGlzfSxlKGRvY3VtZW50KS5vbigiY2xpY2suYnV0dG9uLmRhdGEtYXBpIiwiW2RhdGEtdG9nZ2xlXj1idXR0b25dIixmdW5jdGlvbih0KXt2YXIgbj1lKHQudGFyZ2V0KTtuLmhhc0NsYXNzKCJidG4iKXx8KG49bi5jbG9zZXN0KCIuYnRuIikpLG4uYnV0dG9uKCJ0b2dnbGUiKX0pfSh3aW5kb3cualF1ZXJ5KSwhZnVuY3Rpb24oZSl7InVzZSBzdHJpY3QiO3ZhciB0PWZ1bmN0aW9uKHQsbil7dGhpcy4kZWxlbWVudD1lKHQpLHRoaXMuJGluZGljYXRvcnM9dGhpcy4kZWxlbWVudC5maW5kKCIuY2Fyb3VzZWwtaW5kaWNhdG9ycyIpLHRoaXMub3B0aW9ucz1uLHRoaXMub3B0aW9ucy5wYXVzZT09ImhvdmVyIiYmdGhpcy4kZWxlbWVudC5vbigibW91c2VlbnRlciIsZS5wcm94eSh0aGlzLnBhdXNlLHRoaXMpKS5vbigibW91c2VsZWF2ZSIsZS5wcm94eSh0aGlzLmN5Y2xlLHRoaXMpKX07dC5wcm90b3R5cGU9e2N5Y2xlOmZ1bmN0aW9uKHQpe3JldHVybiB0fHwodGhpcy5wYXVzZWQ9ITEpLHRoaXMuaW50ZXJ2YWwmJmNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbCksdGhpcy5vcHRpb25zLmludGVydmFsJiYhdGhpcy5wYXVzZWQmJih0aGlzLmludGVydmFsPXNldEludGVydmFsKGUucHJveHkodGhpcy5uZXh0LHRoaXMpLHRoaXMub3B0aW9ucy5pbnRlcnZhbCkpLHRoaXN9LGdldEFjdGl2ZUluZGV4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGFjdGl2ZT10aGlzLiRlbGVtZW50LmZpbmQoIi5pdGVtLmFjdGl2ZSIpLHRoaXMuJGl0ZW1zPXRoaXMuJGFjdGl2ZS5wYXJlbnQoKS5jaGlsZHJlbigpLHRoaXMuJGl0ZW1zLmluZGV4KHRoaXMuJGFjdGl2ZSl9LHRvOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuZ2V0QWN0aXZlSW5kZXgoKSxyPXRoaXM7aWYodD50aGlzLiRpdGVtcy5sZW5ndGgtMXx8dDwwKXJldHVybjtyZXR1cm4gdGhpcy5zbGlkaW5nP3RoaXMuJGVsZW1lbnQub25lKCJzbGlkIixmdW5jdGlvbigpe3IudG8odCl9KTpuPT10P3RoaXMucGF1c2UoKS5jeWNsZSgpOnRoaXMuc2xpZGUodD5uPyJuZXh0IjoicHJldiIsZSh0aGlzLiRpdGVtc1t0XSkpfSxwYXVzZTpmdW5jdGlvbih0KXtyZXR1cm4gdHx8KHRoaXMucGF1c2VkPSEwKSx0aGlzLiRlbGVtZW50LmZpbmQoIi5uZXh0LCAucHJldiIpLmxlbmd0aCYmZS5zdXBwb3J0LnRyYW5zaXRpb24uZW5kJiYodGhpcy4kZWxlbWVudC50cmlnZ2VyKGUuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCksdGhpcy5jeWNsZSghMCkpLGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbCksdGhpcy5pbnRlcnZhbD1udWxsLHRoaXN9LG5leHQ6ZnVuY3Rpb24oKXtpZih0aGlzLnNsaWRpbmcpcmV0dXJuO3JldHVybiB0aGlzLnNsaWRlKCJuZXh0Iil9LHByZXY6ZnVuY3Rpb24oKXtpZih0aGlzLnNsaWRpbmcpcmV0dXJuO3JldHVybiB0aGlzLnNsaWRlKCJwcmV2Iil9LHNsaWRlOmZ1bmN0aW9uKHQsbil7dmFyIHI9dGhpcy4kZWxlbWVudC5maW5kKCIuaXRlbS5hY3RpdmUiKSxpPW58fHJbdF0oKSxzPXRoaXMuaW50ZXJ2YWwsbz10PT0ibmV4dCI/ImxlZnQiOiJyaWdodCIsdT10PT0ibmV4dCI/ImZpcnN0IjoibGFzdCIsYT10aGlzLGY7dGhpcy5zbGlkaW5nPSEwLHMmJnRoaXMucGF1c2UoKSxpPWkubGVuZ3RoP2k6dGhpcy4kZWxlbWVudC5maW5kKCIuaXRlbSIpW3VdKCksZj1lLkV2ZW50KCJzbGlkZSIse3JlbGF0ZWRUYXJnZXQ6aVswXSxkaXJlY3Rpb246b30pO2lmKGkuaGFzQ2xhc3MoImFjdGl2ZSIpKXJldHVybjt0aGlzLiRpbmRpY2F0b3JzLmxlbmd0aCYmKHRoaXMuJGluZGljYXRvcnMuZmluZCgiLmFjdGl2ZSIpLnJlbW92ZUNsYXNzKCJhY3RpdmUiKSx0aGlzLiRlbGVtZW50Lm9uZSgic2xpZCIsZnVuY3Rpb24oKXt2YXIgdD1lKGEuJGluZGljYXRvcnMuY2hpbGRyZW4oKVthLmdldEFjdGl2ZUluZGV4KCldKTt0JiZ0LmFkZENsYXNzKCJhY3RpdmUiKX0pKTtpZihlLnN1cHBvcnQudHJhbnNpdGlvbiYmdGhpcy4kZWxlbWVudC5oYXNDbGFzcygic2xpZGUiKSl7dGhpcy4kZWxlbWVudC50cmlnZ2VyKGYpO2lmKGYuaXNEZWZhdWx0UHJldmVudGVkKCkpcmV0dXJuO2kuYWRkQ2xhc3ModCksaVswXS5vZmZzZXRXaWR0aCxyLmFkZENsYXNzKG8pLGkuYWRkQ2xhc3MobyksdGhpcy4kZWxlbWVudC5vbmUoZS5zdXBwb3J0LnRyYW5zaXRpb24uZW5kLGZ1bmN0aW9uKCl7aS5yZW1vdmVDbGFzcyhbdCxvXS5qb2luKCIgIikpLmFkZENsYXNzKCJhY3RpdmUiKSxyLnJlbW92ZUNsYXNzKFsiYWN0aXZlIixvXS5qb2luKCIgIikpLGEuc2xpZGluZz0hMSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YS4kZWxlbWVudC50cmlnZ2VyKCJzbGlkIil9LDApfSl9ZWxzZXt0aGlzLiRlbGVtZW50LnRyaWdnZXIoZik7aWYoZi5pc0RlZmF1bHRQcmV2ZW50ZWQoKSlyZXR1cm47ci5yZW1vdmVDbGFzcygiYWN0aXZlIiksaS5hZGRDbGFzcygiYWN0aXZlIiksdGhpcy5zbGlkaW5nPSExLHRoaXMuJGVsZW1lbnQudHJpZ2dlcigic2xpZCIpfXJldHVybiBzJiZ0aGlzLmN5Y2xlKCksdGhpc319O3ZhciBuPWUuZm4uY2Fyb3VzZWw7ZS5mbi5jYXJvdXNlbD1mdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHI9ZSh0aGlzKSxpPXIuZGF0YSgiY2Fyb3VzZWwiKSxzPWUuZXh0ZW5kKHt9LGUuZm4uY2Fyb3VzZWwuZGVmYXVsdHMsdHlwZW9mIG49PSJvYmplY3QiJiZuKSxvPXR5cGVvZiBuPT0ic3RyaW5nIj9uOnMuc2xpZGU7aXx8ci5kYXRhKCJjYXJvdXNlbCIsaT1uZXcgdCh0aGlzLHMpKSx0eXBlb2Ygbj09Im51bWJlciI/aS50byhuKTpvP2lbb10oKTpzLmludGVydmFsJiZpLnBhdXNlKCkuY3ljbGUoKX0pfSxlLmZuLmNhcm91c2VsLmRlZmF1bHRzPXtpbnRlcnZhbDo1ZTMscGF1c2U6ImhvdmVyIn0sZS5mbi5jYXJvdXNlbC5Db25zdHJ1Y3Rvcj10LGUuZm4uY2Fyb3VzZWwubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBlLmZuLmNhcm91c2VsPW4sdGhpc30sZShkb2N1bWVudCkub24oImNsaWNrLmNhcm91c2VsLmRhdGEtYXBpIiwiW2RhdGEtc2xpZGVdLCBbZGF0YS1zbGlkZS10b10iLGZ1bmN0aW9uKHQpe3ZhciBuPWUodGhpcykscixpPWUobi5hdHRyKCJkYXRhLXRhcmdldCIpfHwocj1uLmF0dHIoImhyZWYiKSkmJnIucmVwbGFjZSgvLiooPz0jW15cc10rJCkvLCIiKSkscz1lLmV4dGVuZCh7fSxpLmRhdGEoKSxuLmRhdGEoKSksbztpLmNhcm91c2VsKHMpLChvPW4uYXR0cigiZGF0YS1zbGlkZS10byIpKSYmaS5kYXRhKCJjYXJvdXNlbCIpLnBhdXNlKCkudG8obykuY3ljbGUoKSx0LnByZXZlbnREZWZhdWx0KCl9KX0od2luZG93LmpRdWVyeSksIWZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgdD1mdW5jdGlvbih0LG4pe3RoaXMuJGVsZW1lbnQ9ZSh0KSx0aGlzLm9wdGlvbnM9ZS5leHRlbmQoe30sZS5mbi5jb2xsYXBzZS5kZWZhdWx0cyxuKSx0aGlzLm9wdGlvbnMucGFyZW50JiYodGhpcy4kcGFyZW50PWUodGhpcy5vcHRpb25zLnBhcmVudCkpLHRoaXMub3B0aW9ucy50b2dnbGUmJnRoaXMudG9nZ2xlKCl9O3QucHJvdG90eXBlPXtjb25zdHJ1Y3Rvcjp0LGRpbWVuc2lvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoIndpZHRoIik7cmV0dXJuIGU/IndpZHRoIjoiaGVpZ2h0In0sc2hvdzpmdW5jdGlvbigpe3ZhciB0LG4scixpO2lmKHRoaXMudHJhbnNpdGlvbmluZ3x8dGhpcy4kZWxlbWVudC5oYXNDbGFzcygiaW4iKSlyZXR1cm47dD10aGlzLmRpbWVuc2lvbigpLG49ZS5jYW1lbENhc2UoWyJzY3JvbGwiLHRdLmpvaW4oIi0iKSkscj10aGlzLiRwYXJlbnQmJnRoaXMuJHBhcmVudC5maW5kKCI+IC5hY2NvcmRpb24tZ3JvdXAgPiAuaW4iKTtpZihyJiZyLmxlbmd0aCl7aT1yLmRhdGEoImNvbGxhcHNlIik7aWYoaSYmaS50cmFuc2l0aW9uaW5nKXJldHVybjtyLmNvbGxhcHNlKCJoaWRlIiksaXx8ci5kYXRhKCJjb2xsYXBzZSIsbnVsbCl9dGhpcy4kZWxlbWVudFt0XSgwKSx0aGlzLnRyYW5zaXRpb24oImFkZENsYXNzIixlLkV2ZW50KCJzaG93IiksInNob3duIiksZS5zdXBwb3J0LnRyYW5zaXRpb24mJnRoaXMuJGVsZW1lbnRbdF0odGhpcy4kZWxlbWVudFswXVtuXSl9LGhpZGU6ZnVuY3Rpb24oKXt2YXIgdDtpZih0aGlzLnRyYW5zaXRpb25pbmd8fCF0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCJpbiIpKXJldHVybjt0PXRoaXMuZGltZW5zaW9uKCksdGhpcy5yZXNldCh0aGlzLiRlbGVtZW50W3RdKCkpLHRoaXMudHJhbnNpdGlvbigicmVtb3ZlQ2xhc3MiLGUuRXZlbnQoImhpZGUiKSwiaGlkZGVuIiksdGhpcy4kZWxlbWVudFt0XSgwKX0scmVzZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5kaW1lbnNpb24oKTtyZXR1cm4gdGhpcy4kZWxlbWVudC5yZW1vdmVDbGFzcygiY29sbGFwc2UiKVt0XShlfHwiYXV0byIpWzBdLm9mZnNldFdpZHRoLHRoaXMuJGVsZW1lbnRbZSE9PW51bGw/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXSgiY29sbGFwc2UiKSx0aGlzfSx0cmFuc2l0aW9uOmZ1bmN0aW9uKHQsbixyKXt2YXIgaT10aGlzLHM9ZnVuY3Rpb24oKXtuLnR5cGU9PSJzaG93IiYmaS5yZXNldCgpLGkudHJhbnNpdGlvbmluZz0wLGkuJGVsZW1lbnQudHJpZ2dlcihyKX07dGhpcy4kZWxlbWVudC50cmlnZ2VyKG4pO2lmKG4uaXNEZWZhdWx0UHJldmVudGVkKCkpcmV0dXJuO3RoaXMudHJhbnNpdGlvbmluZz0xLHRoaXMuJGVsZW1lbnRbdF0oImluIiksZS5zdXBwb3J0LnRyYW5zaXRpb24mJnRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoImNvbGxhcHNlIik/dGhpcy4kZWxlbWVudC5vbmUoZS5zdXBwb3J0LnRyYW5zaXRpb24uZW5kLHMpOnMoKX0sdG9nZ2xlOmZ1bmN0aW9uKCl7dGhpc1t0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCJpbiIpPyJoaWRlIjoic2hvdyJdKCl9fTt2YXIgbj1lLmZuLmNvbGxhcHNlO2UuZm4uY29sbGFwc2U9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciByPWUodGhpcyksaT1yLmRhdGEoImNvbGxhcHNlIikscz1lLmV4dGVuZCh7fSxlLmZuLmNvbGxhcHNlLmRlZmF1bHRzLHIuZGF0YSgpLHR5cGVvZiBuPT0ib2JqZWN0IiYmbik7aXx8ci5kYXRhKCJjb2xsYXBzZSIsaT1uZXcgdCh0aGlzLHMpKSx0eXBlb2Ygbj09InN0cmluZyImJmlbbl0oKX0pfSxlLmZuLmNvbGxhcHNlLmRlZmF1bHRzPXt0b2dnbGU6ITB9LGUuZm4uY29sbGFwc2UuQ29uc3RydWN0b3I9dCxlLmZuLmNvbGxhcHNlLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gZS5mbi5jb2xsYXBzZT1uLHRoaXN9LGUoZG9jdW1lbnQpLm9uKCJjbGljay5jb2xsYXBzZS5kYXRhLWFwaSIsIltkYXRhLXRvZ2dsZT1jb2xsYXBzZV0iLGZ1bmN0aW9uKHQpe3ZhciBuPWUodGhpcykscixpPW4uYXR0cigiZGF0YS10YXJnZXQiKXx8dC5wcmV2ZW50RGVmYXVsdCgpfHwocj1uLmF0dHIoImhyZWYiKSkmJnIucmVwbGFjZSgvLiooPz0jW15cc10rJCkvLCIiKSxzPWUoaSkuZGF0YSgiY29sbGFwc2UiKT8idG9nZ2xlIjpuLmRhdGEoKTtuW2UoaSkuaGFzQ2xhc3MoImluIik/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXSgiY29sbGFwc2VkIiksZShpKS5jb2xsYXBzZShzKX0pfSh3aW5kb3cualF1ZXJ5KSwhZnVuY3Rpb24oZSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoKXtlKCIuZHJvcGRvd24tYmFja2Ryb3AiKS5yZW1vdmUoKSxlKHQpLmVhY2goZnVuY3Rpb24oKXtpKGUodGhpcykpLnJlbW92ZUNsYXNzKCJvcGVuIil9KX1mdW5jdGlvbiBpKHQpe3ZhciBuPXQuYXR0cigiZGF0YS10YXJnZXQiKSxyO258fChuPXQuYXR0cigiaHJlZiIpLG49biYmLyMvLnRlc3QobikmJm4ucmVwbGFjZSgvLiooPz0jW15cc10qJCkvLCIiKSkscj1uJiZlKG4pO2lmKCFyfHwhci5sZW5ndGgpcj10LnBhcmVudCgpO3JldHVybiByfXZhciB0PSJbZGF0YS10b2dnbGU9ZHJvcGRvd25dIixuPWZ1bmN0aW9uKHQpe3ZhciBuPWUodCkub24oImNsaWNrLmRyb3Bkb3duLmRhdGEtYXBpIix0aGlzLnRvZ2dsZSk7ZSgiaHRtbCIpLm9uKCJjbGljay5kcm9wZG93bi5kYXRhLWFwaSIsZnVuY3Rpb24oKXtuLnBhcmVudCgpLnJlbW92ZUNsYXNzKCJvcGVuIil9KX07bi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOm4sdG9nZ2xlOmZ1bmN0aW9uKHQpe3ZhciBuPWUodGhpcykscyxvO2lmKG4uaXMoIi5kaXNhYmxlZCwgOmRpc2FibGVkIikpcmV0dXJuO3JldHVybiBzPWkobiksbz1zLmhhc0NsYXNzKCJvcGVuIikscigpLG98fCgib250b3VjaHN0YXJ0ImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCYmZSgnPGRpdiBjbGFzcz0iZHJvcGRvd24tYmFja2Ryb3AiLz4nKS5pbnNlcnRCZWZvcmUoZSh0aGlzKSkub24oImNsaWNrIixyKSxzLnRvZ2dsZUNsYXNzKCJvcGVuIikpLG4uZm9jdXMoKSwhMX0sa2V5ZG93bjpmdW5jdGlvbihuKXt2YXIgcixzLG8sdSxhLGY7aWYoIS8oMzh8NDB8MjcpLy50ZXN0KG4ua2V5Q29kZSkpcmV0dXJuO3I9ZSh0aGlzKSxuLnByZXZlbnREZWZhdWx0KCksbi5zdG9wUHJvcGFnYXRpb24oKTtpZihyLmlzKCIuZGlzYWJsZWQsIDpkaXNhYmxlZCIpKXJldHVybjt1PWkociksYT11Lmhhc0NsYXNzKCJvcGVuIik7aWYoIWF8fGEmJm4ua2V5Q29kZT09MjcpcmV0dXJuIG4ud2hpY2g9PTI3JiZ1LmZpbmQodCkuZm9jdXMoKSxyLmNsaWNrKCk7cz1lKCJbcm9sZT1tZW51XSBsaTpub3QoLmRpdmlkZXIpOnZpc2libGUgYSIsdSk7aWYoIXMubGVuZ3RoKXJldHVybjtmPXMuaW5kZXgocy5maWx0ZXIoIjpmb2N1cyIpKSxuLmtleUNvZGU9PTM4JiZmPjAmJmYtLSxuLmtleUNvZGU9PTQwJiZmPHMubGVuZ3RoLTEmJmYrKyx+Znx8KGY9MCkscy5lcShmKS5mb2N1cygpfX07dmFyIHM9ZS5mbi5kcm9wZG93bjtlLmZuLmRyb3Bkb3duPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgcj1lKHRoaXMpLGk9ci5kYXRhKCJkcm9wZG93biIpO2l8fHIuZGF0YSgiZHJvcGRvd24iLGk9bmV3IG4odGhpcykpLHR5cGVvZiB0PT0ic3RyaW5nIiYmaVt0XS5jYWxsKHIpfSl9LGUuZm4uZHJvcGRvd24uQ29uc3RydWN0b3I9bixlLmZuLmRyb3Bkb3duLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gZS5mbi5kcm9wZG93bj1zLHRoaXN9LGUoZG9jdW1lbnQpLm9uKCJjbGljay5kcm9wZG93bi5kYXRhLWFwaSIscikub24oImNsaWNrLmRyb3Bkb3duLmRhdGEtYXBpIiwiLmRyb3Bkb3duIGZvcm0iLGZ1bmN0aW9uKGUpe2Uuc3RvcFByb3BhZ2F0aW9uKCl9KS5vbigiY2xpY2suZHJvcGRvd24uZGF0YS1hcGkiLHQsbi5wcm90b3R5cGUudG9nZ2xlKS5vbigia2V5ZG93bi5kcm9wZG93bi5kYXRhLWFwaSIsdCsiLCBbcm9sZT1tZW51XSIsbi5wcm90b3R5cGUua2V5ZG93bil9KHdpbmRvdy5qUXVlcnkpLCFmdW5jdGlvbihlKXsidXNlIHN0cmljdCI7dmFyIHQ9ZnVuY3Rpb24odCxuKXt0aGlzLm9wdGlvbnM9bix0aGlzLiRlbGVtZW50PWUodCkuZGVsZWdhdGUoJ1tkYXRhLWRpc21pc3M9Im1vZGFsIl0nLCJjbGljay5kaXNtaXNzLm1vZGFsIixlLnByb3h5KHRoaXMuaGlkZSx0aGlzKSksdGhpcy5vcHRpb25zLnJlbW90ZSYmdGhpcy4kZWxlbWVudC5maW5kKCIubW9kYWwtYm9keSIpLmxvYWQodGhpcy5vcHRpb25zLnJlbW90ZSl9O3QucHJvdG90eXBlPXtjb25zdHJ1Y3Rvcjp0LHRvZ2dsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzW3RoaXMuaXNTaG93bj8iaGlkZSI6InNob3ciXSgpfSxzaG93OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxuPWUuRXZlbnQoInNob3ciKTt0aGlzLiRlbGVtZW50LnRyaWdnZXIobik7aWYodGhpcy5pc1Nob3dufHxuLmlzRGVmYXVsdFByZXZlbnRlZCgpKXJldHVybjt0aGlzLmlzU2hvd249ITAsdGhpcy5lc2NhcGUoKSx0aGlzLmJhY2tkcm9wKGZ1bmN0aW9uKCl7dmFyIG49ZS5zdXBwb3J0LnRyYW5zaXRpb24mJnQuJGVsZW1lbnQuaGFzQ2xhc3MoImZhZGUiKTt0LiRlbGVtZW50LnBhcmVudCgpLmxlbmd0aHx8dC4kZWxlbWVudC5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KSx0LiRlbGVtZW50LnNob3coKSxuJiZ0LiRlbGVtZW50WzBdLm9mZnNldFdpZHRoLHQuJGVsZW1lbnQuYWRkQ2xhc3MoImluIikuYXR0cigiYXJpYS1oaWRkZW4iLCExKSx0LmVuZm9yY2VGb2N1cygpLG4/dC4kZWxlbWVudC5vbmUoZS5zdXBwb3J0LnRyYW5zaXRpb24uZW5kLGZ1bmN0aW9uKCl7dC4kZWxlbWVudC5mb2N1cygpLnRyaWdnZXIoInNob3duIil9KTp0LiRlbGVtZW50LmZvY3VzKCkudHJpZ2dlcigic2hvd24iKX0pfSxoaWRlOmZ1bmN0aW9uKHQpe3QmJnQucHJldmVudERlZmF1bHQoKTt2YXIgbj10aGlzO3Q9ZS5FdmVudCgiaGlkZSIpLHRoaXMuJGVsZW1lbnQudHJpZ2dlcih0KTtpZighdGhpcy5pc1Nob3dufHx0LmlzRGVmYXVsdFByZXZlbnRlZCgpKXJldHVybjt0aGlzLmlzU2hvd249ITEsdGhpcy5lc2NhcGUoKSxlKGRvY3VtZW50KS5vZmYoImZvY3VzaW4ubW9kYWwiKSx0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJpbiIpLmF0dHIoImFyaWEtaGlkZGVuIiwhMCksZS5zdXBwb3J0LnRyYW5zaXRpb24mJnRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoImZhZGUiKT90aGlzLmhpZGVXaXRoVHJhbnNpdGlvbigpOnRoaXMuaGlkZU1vZGFsKCl9LGVuZm9yY2VGb2N1czpmdW5jdGlvbigpe3ZhciB0PXRoaXM7ZShkb2N1bWVudCkub24oImZvY3VzaW4ubW9kYWwiLGZ1bmN0aW9uKGUpe3QuJGVsZW1lbnRbMF0hPT1lLnRhcmdldCYmIXQuJGVsZW1lbnQuaGFzKGUudGFyZ2V0KS5sZW5ndGgmJnQuJGVsZW1lbnQuZm9jdXMoKX0pfSxlc2NhcGU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuaXNTaG93biYmdGhpcy5vcHRpb25zLmtleWJvYXJkP3RoaXMuJGVsZW1lbnQub24oImtleXVwLmRpc21pc3MubW9kYWwiLGZ1bmN0aW9uKHQpe3Qud2hpY2g9PTI3JiZlLmhpZGUoKX0pOnRoaXMuaXNTaG93bnx8dGhpcy4kZWxlbWVudC5vZmYoImtleXVwLmRpc21pc3MubW9kYWwiKX0saGlkZVdpdGhUcmFuc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxuPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0LiRlbGVtZW50Lm9mZihlLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQpLHQuaGlkZU1vZGFsKCl9LDUwMCk7dGhpcy4kZWxlbWVudC5vbmUoZS5zdXBwb3J0LnRyYW5zaXRpb24uZW5kLGZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KG4pLHQuaGlkZU1vZGFsKCl9KX0saGlkZU1vZGFsOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLiRlbGVtZW50LmhpZGUoKSx0aGlzLmJhY2tkcm9wKGZ1bmN0aW9uKCl7ZS5yZW1vdmVCYWNrZHJvcCgpLGUuJGVsZW1lbnQudHJpZ2dlcigiaGlkZGVuIil9KX0scmVtb3ZlQmFja2Ryb3A6ZnVuY3Rpb24oKXt0aGlzLiRiYWNrZHJvcCYmdGhpcy4kYmFja2Ryb3AucmVtb3ZlKCksdGhpcy4kYmFja2Ryb3A9bnVsbH0sYmFja2Ryb3A6ZnVuY3Rpb24odCl7dmFyIG49dGhpcyxyPXRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoImZhZGUiKT8iZmFkZSI6IiI7aWYodGhpcy5pc1Nob3duJiZ0aGlzLm9wdGlvbnMuYmFja2Ryb3Ape3ZhciBpPWUuc3VwcG9ydC50cmFuc2l0aW9uJiZyO3RoaXMuJGJhY2tkcm9wPWUoJzxkaXYgY2xhc3M9Im1vZGFsLWJhY2tkcm9wICcrcisnIiAvPicpLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpLHRoaXMuJGJhY2tkcm9wLmNsaWNrKHRoaXMub3B0aW9ucy5iYWNrZHJvcD09InN0YXRpYyI/ZS5wcm94eSh0aGlzLiRlbGVtZW50WzBdLmZvY3VzLHRoaXMuJGVsZW1lbnRbMF0pOmUucHJveHkodGhpcy5oaWRlLHRoaXMpKSxpJiZ0aGlzLiRiYWNrZHJvcFswXS5vZmZzZXRXaWR0aCx0aGlzLiRiYWNrZHJvcC5hZGRDbGFzcygiaW4iKTtpZighdClyZXR1cm47aT90aGlzLiRiYWNrZHJvcC5vbmUoZS5zdXBwb3J0LnRyYW5zaXRpb24uZW5kLHQpOnQoKX1lbHNlIXRoaXMuaXNTaG93biYmdGhpcy4kYmFja2Ryb3A/KHRoaXMuJGJhY2tkcm9wLnJlbW92ZUNsYXNzKCJpbiIpLGUuc3VwcG9ydC50cmFuc2l0aW9uJiZ0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCJmYWRlIik/dGhpcy4kYmFja2Ryb3Aub25lKGUuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCx0KTp0KCkpOnQmJnQoKX19O3ZhciBuPWUuZm4ubW9kYWw7ZS5mbi5tb2RhbD1mdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHI9ZSh0aGlzKSxpPXIuZGF0YSgibW9kYWwiKSxzPWUuZXh0ZW5kKHt9LGUuZm4ubW9kYWwuZGVmYXVsdHMsci5kYXRhKCksdHlwZW9mIG49PSJvYmplY3QiJiZuKTtpfHxyLmRhdGEoIm1vZGFsIixpPW5ldyB0KHRoaXMscykpLHR5cGVvZiBuPT0ic3RyaW5nIj9pW25dKCk6cy5zaG93JiZpLnNob3coKX0pfSxlLmZuLm1vZGFsLmRlZmF1bHRzPXtiYWNrZHJvcDohMCxrZXlib2FyZDohMCxzaG93OiEwfSxlLmZuLm1vZGFsLkNvbnN0cnVjdG9yPXQsZS5mbi5tb2RhbC5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIGUuZm4ubW9kYWw9bix0aGlzfSxlKGRvY3VtZW50KS5vbigiY2xpY2subW9kYWwuZGF0YS1hcGkiLCdbZGF0YS10b2dnbGU9Im1vZGFsIl0nLGZ1bmN0aW9uKHQpe3ZhciBuPWUodGhpcykscj1uLmF0dHIoImhyZWYiKSxpPWUobi5hdHRyKCJkYXRhLXRhcmdldCIpfHxyJiZyLnJlcGxhY2UoLy4qKD89I1teXHNdKyQpLywiIikpLHM9aS5kYXRhKCJtb2RhbCIpPyJ0b2dnbGUiOmUuZXh0ZW5kKHtyZW1vdGU6IS8jLy50ZXN0KHIpJiZyfSxpLmRhdGEoKSxuLmRhdGEoKSk7dC5wcmV2ZW50RGVmYXVsdCgpLGkubW9kYWwocykub25lKCJoaWRlIixmdW5jdGlvbigpe24uZm9jdXMoKX0pfSl9KHdpbmRvdy5qUXVlcnkpLCFmdW5jdGlvbihlKXsidXNlIHN0cmljdCI7dmFyIHQ9ZnVuY3Rpb24oZSx0KXt0aGlzLmluaXQoInRvb2x0aXAiLGUsdCl9O3QucHJvdG90eXBlPXtjb25zdHJ1Y3Rvcjp0LGluaXQ6ZnVuY3Rpb24odCxuLHIpe3ZhciBpLHMsbyx1LGE7dGhpcy50eXBlPXQsdGhpcy4kZWxlbWVudD1lKG4pLHRoaXMub3B0aW9ucz10aGlzLmdldE9wdGlvbnMociksdGhpcy5lbmFibGVkPSEwLG89dGhpcy5vcHRpb25zLnRyaWdnZXIuc3BsaXQoIiAiKTtmb3IoYT1vLmxlbmd0aDthLS07KXU9b1thXSx1PT0iY2xpY2siP3RoaXMuJGVsZW1lbnQub24oImNsaWNrLiIrdGhpcy50eXBlLHRoaXMub3B0aW9ucy5zZWxlY3RvcixlLnByb3h5KHRoaXMudG9nZ2xlLHRoaXMpKTp1IT0ibWFudWFsIiYmKGk9dT09ImhvdmVyIj8ibW91c2VlbnRlciI6ImZvY3VzIixzPXU9PSJob3ZlciI/Im1vdXNlbGVhdmUiOiJibHVyIix0aGlzLiRlbGVtZW50Lm9uKGkrIi4iK3RoaXMudHlwZSx0aGlzLm9wdGlvbnMuc2VsZWN0b3IsZS5wcm94eSh0aGlzLmVudGVyLHRoaXMpKSx0aGlzLiRlbGVtZW50Lm9uKHMrIi4iK3RoaXMudHlwZSx0aGlzLm9wdGlvbnMuc2VsZWN0b3IsZS5wcm94eSh0aGlzLmxlYXZlLHRoaXMpKSk7dGhpcy5vcHRpb25zLnNlbGVjdG9yP3RoaXMuX29wdGlvbnM9ZS5leHRlbmQoe30sdGhpcy5vcHRpb25zLHt0cmlnZ2VyOiJtYW51YWwiLHNlbGVjdG9yOiIifSk6dGhpcy5maXhUaXRsZSgpfSxnZXRPcHRpb25zOmZ1bmN0aW9uKHQpe3JldHVybiB0PWUuZXh0ZW5kKHt9LGUuZm5bdGhpcy50eXBlXS5kZWZhdWx0cyx0aGlzLiRlbGVtZW50LmRhdGEoKSx0KSx0LmRlbGF5JiZ0eXBlb2YgdC5kZWxheT09Im51bWJlciImJih0LmRlbGF5PXtzaG93OnQuZGVsYXksaGlkZTp0LmRlbGF5fSksdH0sZW50ZXI6ZnVuY3Rpb24odCl7dmFyIG49ZS5mblt0aGlzLnR5cGVdLmRlZmF1bHRzLHI9e30saTt0aGlzLl9vcHRpb25zJiZlLmVhY2godGhpcy5fb3B0aW9ucyxmdW5jdGlvbihlLHQpe25bZV0hPXQmJihyW2VdPXQpfSx0aGlzKSxpPWUodC5jdXJyZW50VGFyZ2V0KVt0aGlzLnR5cGVdKHIpLmRhdGEodGhpcy50eXBlKTtpZighaS5vcHRpb25zLmRlbGF5fHwhaS5vcHRpb25zLmRlbGF5LnNob3cpcmV0dXJuIGkuc2hvdygpO2NsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpLGkuaG92ZXJTdGF0ZT0iaW4iLHRoaXMudGltZW91dD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aS5ob3ZlclN0YXRlPT0iaW4iJiZpLnNob3coKX0saS5vcHRpb25zLmRlbGF5LnNob3cpfSxsZWF2ZTpmdW5jdGlvbih0KXt2YXIgbj1lKHQuY3VycmVudFRhcmdldClbdGhpcy50eXBlXSh0aGlzLl9vcHRpb25zKS5kYXRhKHRoaXMudHlwZSk7dGhpcy50aW1lb3V0JiZjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTtpZighbi5vcHRpb25zLmRlbGF5fHwhbi5vcHRpb25zLmRlbGF5LmhpZGUpcmV0dXJuIG4uaGlkZSgpO24uaG92ZXJTdGF0ZT0ib3V0Iix0aGlzLnRpbWVvdXQ9c2V0VGltZW91dChmdW5jdGlvbigpe24uaG92ZXJTdGF0ZT09Im91dCImJm4uaGlkZSgpfSxuLm9wdGlvbnMuZGVsYXkuaGlkZSl9LHNob3c6ZnVuY3Rpb24oKXt2YXIgdCxuLHIsaSxzLG8sdT1lLkV2ZW50KCJzaG93Iik7aWYodGhpcy5oYXNDb250ZW50KCkmJnRoaXMuZW5hYmxlZCl7dGhpcy4kZWxlbWVudC50cmlnZ2VyKHUpO2lmKHUuaXNEZWZhdWx0UHJldmVudGVkKCkpcmV0dXJuO3Q9dGhpcy50aXAoKSx0aGlzLnNldENvbnRlbnQoKSx0aGlzLm9wdGlvbnMuYW5pbWF0aW9uJiZ0LmFkZENsYXNzKCJmYWRlIikscz10eXBlb2YgdGhpcy5vcHRpb25zLnBsYWNlbWVudD09ImZ1bmN0aW9uIj90aGlzLm9wdGlvbnMucGxhY2VtZW50LmNhbGwodGhpcyx0WzBdLHRoaXMuJGVsZW1lbnRbMF0pOnRoaXMub3B0aW9ucy5wbGFjZW1lbnQsdC5kZXRhY2goKS5jc3Moe3RvcDowLGxlZnQ6MCxkaXNwbGF5OiJibG9jayJ9KSx0aGlzLm9wdGlvbnMuY29udGFpbmVyP3QuYXBwZW5kVG8odGhpcy5vcHRpb25zLmNvbnRhaW5lcik6dC5pbnNlcnRBZnRlcih0aGlzLiRlbGVtZW50KSxuPXRoaXMuZ2V0UG9zaXRpb24oKSxyPXRbMF0ub2Zmc2V0V2lkdGgsaT10WzBdLm9mZnNldEhlaWdodDtzd2l0Y2gocyl7Y2FzZSJib3R0b20iOm89e3RvcDpuLnRvcCtuLmhlaWdodCxsZWZ0Om4ubGVmdCtuLndpZHRoLzItci8yfTticmVhaztjYXNlInRvcCI6bz17dG9wOm4udG9wLWksbGVmdDpuLmxlZnQrbi53aWR0aC8yLXIvMn07YnJlYWs7Y2FzZSJsZWZ0IjpvPXt0b3A6bi50b3Arbi5oZWlnaHQvMi1pLzIsbGVmdDpuLmxlZnQtcn07YnJlYWs7Y2FzZSJyaWdodCI6bz17dG9wOm4udG9wK24uaGVpZ2h0LzItaS8yLGxlZnQ6bi5sZWZ0K24ud2lkdGh9fXRoaXMuYXBwbHlQbGFjZW1lbnQobyxzKSx0aGlzLiRlbGVtZW50LnRyaWdnZXIoInNob3duIil9fSxhcHBseVBsYWNlbWVudDpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMudGlwKCkscj1uWzBdLm9mZnNldFdpZHRoLGk9blswXS5vZmZzZXRIZWlnaHQscyxvLHUsYTtuLm9mZnNldChlKS5hZGRDbGFzcyh0KS5hZGRDbGFzcygiaW4iKSxzPW5bMF0ub2Zmc2V0V2lkdGgsbz1uWzBdLm9mZnNldEhlaWdodCx0PT0idG9wIiYmbyE9aSYmKGUudG9wPWUudG9wK2ktbyxhPSEwKSx0PT0iYm90dG9tInx8dD09InRvcCI/KHU9MCxlLmxlZnQ8MCYmKHU9ZS5sZWZ0Ki0yLGUubGVmdD0wLG4ub2Zmc2V0KGUpLHM9blswXS5vZmZzZXRXaWR0aCxvPW5bMF0ub2Zmc2V0SGVpZ2h0KSx0aGlzLnJlcGxhY2VBcnJvdyh1LXIrcyxzLCJsZWZ0IikpOnRoaXMucmVwbGFjZUFycm93KG8taSxvLCJ0b3AiKSxhJiZuLm9mZnNldChlKX0scmVwbGFjZUFycm93OmZ1bmN0aW9uKGUsdCxuKXt0aGlzLmFycm93KCkuY3NzKG4sZT81MCooMS1lL3QpKyIlIjoiIil9LHNldENvbnRlbnQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnRpcCgpLHQ9dGhpcy5nZXRUaXRsZSgpO2UuZmluZCgiLnRvb2x0aXAtaW5uZXIiKVt0aGlzLm9wdGlvbnMuaHRtbD8iaHRtbCI6InRleHQiXSh0KSxlLnJlbW92ZUNsYXNzKCJmYWRlIGluIHRvcCBib3R0b20gbGVmdCByaWdodCIpfSxoaWRlOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gaSgpe3ZhciB0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtuLm9mZihlLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQpLmRldGFjaCgpfSw1MDApO24ub25lKGUuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCxmdW5jdGlvbigpe2NsZWFyVGltZW91dCh0KSxuLmRldGFjaCgpfSl9dmFyIHQ9dGhpcyxuPXRoaXMudGlwKCkscj1lLkV2ZW50KCJoaWRlIik7dGhpcy4kZWxlbWVudC50cmlnZ2VyKHIpO2lmKHIuaXNEZWZhdWx0UHJldmVudGVkKCkpcmV0dXJuO3JldHVybiBuLnJlbW92ZUNsYXNzKCJpbiIpLGUuc3VwcG9ydC50cmFuc2l0aW9uJiZ0aGlzLiR0aXAuaGFzQ2xhc3MoImZhZGUiKT9pKCk6bi5kZXRhY2goKSx0aGlzLiRlbGVtZW50LnRyaWdnZXIoImhpZGRlbiIpLHRoaXN9LGZpeFRpdGxlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kZWxlbWVudDsoZS5hdHRyKCJ0aXRsZSIpfHx0eXBlb2YgZS5hdHRyKCJkYXRhLW9yaWdpbmFsLXRpdGxlIikhPSJzdHJpbmciKSYmZS5hdHRyKCJkYXRhLW9yaWdpbmFsLXRpdGxlIixlLmF0dHIoInRpdGxlIil8fCIiKS5hdHRyKCJ0aXRsZSIsIiIpfSxoYXNDb250ZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0VGl0bGUoKX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgdD10aGlzLiRlbGVtZW50WzBdO3JldHVybiBlLmV4dGVuZCh7fSx0eXBlb2YgdC5nZXRCb3VuZGluZ0NsaWVudFJlY3Q9PSJmdW5jdGlvbiI/dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTp7d2lkdGg6dC5vZmZzZXRXaWR0aCxoZWlnaHQ6dC5vZmZzZXRIZWlnaHR9LHRoaXMuJGVsZW1lbnQub2Zmc2V0KCkpfSxnZXRUaXRsZTpmdW5jdGlvbigpe3ZhciBlLHQ9dGhpcy4kZWxlbWVudCxuPXRoaXMub3B0aW9ucztyZXR1cm4gZT10LmF0dHIoImRhdGEtb3JpZ2luYWwtdGl0bGUiKXx8KHR5cGVvZiBuLnRpdGxlPT0iZnVuY3Rpb24iP24udGl0bGUuY2FsbCh0WzBdKTpuLnRpdGxlKSxlfSx0aXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdGlwPXRoaXMuJHRpcHx8ZSh0aGlzLm9wdGlvbnMudGVtcGxhdGUpfSxhcnJvdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRhcnJvdz10aGlzLiRhcnJvd3x8dGhpcy50aXAoKS5maW5kKCIudG9vbHRpcC1hcnJvdyIpfSx2YWxpZGF0ZTpmdW5jdGlvbigpe3RoaXMuJGVsZW1lbnRbMF0ucGFyZW50Tm9kZXx8KHRoaXMuaGlkZSgpLHRoaXMuJGVsZW1lbnQ9bnVsbCx0aGlzLm9wdGlvbnM9bnVsbCl9LGVuYWJsZTpmdW5jdGlvbigpe3RoaXMuZW5hYmxlZD0hMH0sZGlzYWJsZTpmdW5jdGlvbigpe3RoaXMuZW5hYmxlZD0hMX0sdG9nZ2xlRW5hYmxlZDpmdW5jdGlvbigpe3RoaXMuZW5hYmxlZD0hdGhpcy5lbmFibGVkfSx0b2dnbGU6ZnVuY3Rpb24odCl7dmFyIG49dD9lKHQuY3VycmVudFRhcmdldClbdGhpcy50eXBlXSh0aGlzLl9vcHRpb25zKS5kYXRhKHRoaXMudHlwZSk6dGhpcztuLnRpcCgpLmhhc0NsYXNzKCJpbiIpP24uaGlkZSgpOm4uc2hvdygpfSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5oaWRlKCkuJGVsZW1lbnQub2ZmKCIuIit0aGlzLnR5cGUpLnJlbW92ZURhdGEodGhpcy50eXBlKX19O3ZhciBuPWUuZm4udG9vbHRpcDtlLmZuLnRvb2x0aXA9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciByPWUodGhpcyksaT1yLmRhdGEoInRvb2x0aXAiKSxzPXR5cGVvZiBuPT0ib2JqZWN0IiYmbjtpfHxyLmRhdGEoInRvb2x0aXAiLGk9bmV3IHQodGhpcyxzKSksdHlwZW9mIG49PSJzdHJpbmciJiZpW25dKCl9KX0sZS5mbi50b29sdGlwLkNvbnN0cnVjdG9yPXQsZS5mbi50b29sdGlwLmRlZmF1bHRzPXthbmltYXRpb246ITAscGxhY2VtZW50OiJ0b3AiLHNlbGVjdG9yOiExLHRlbXBsYXRlOic8ZGl2IGNsYXNzPSJ0b29sdGlwIj48ZGl2IGNsYXNzPSJ0b29sdGlwLWFycm93Ij48L2Rpdj48ZGl2IGNsYXNzPSJ0b29sdGlwLWlubmVyIj48L2Rpdj48L2Rpdj4nLHRyaWdnZXI6ImhvdmVyIGZvY3VzIix0aXRsZToiIixkZWxheTowLGh0bWw6ITEsY29udGFpbmVyOiExfSxlLmZuLnRvb2x0aXAubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBlLmZuLnRvb2x0aXA9bix0aGlzfX0od2luZG93LmpRdWVyeSksIWZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgdD1mdW5jdGlvbihlLHQpe3RoaXMuaW5pdCgicG9wb3ZlciIsZSx0KX07dC5wcm90b3R5cGU9ZS5leHRlbmQoe30sZS5mbi50b29sdGlwLkNvbnN0cnVjdG9yLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6dCxzZXRDb250ZW50OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy50aXAoKSx0PXRoaXMuZ2V0VGl0bGUoKSxuPXRoaXMuZ2V0Q29udGVudCgpO2UuZmluZCgiLnBvcG92ZXItdGl0bGUiKVt0aGlzLm9wdGlvbnMuaHRtbD8iaHRtbCI6InRleHQiXSh0KSxlLmZpbmQoIi5wb3BvdmVyLWNvbnRlbnQiKVt0aGlzLm9wdGlvbnMuaHRtbD8iaHRtbCI6InRleHQiXShuKSxlLnJlbW92ZUNsYXNzKCJmYWRlIHRvcCBib3R0b20gbGVmdCByaWdodCBpbiIpfSxoYXNDb250ZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0VGl0bGUoKXx8dGhpcy5nZXRDb250ZW50KCl9LGdldENvbnRlbnQ6ZnVuY3Rpb24oKXt2YXIgZSx0PXRoaXMuJGVsZW1lbnQsbj10aGlzLm9wdGlvbnM7cmV0dXJuIGU9KHR5cGVvZiBuLmNvbnRlbnQ9PSJmdW5jdGlvbiI/bi5jb250ZW50LmNhbGwodFswXSk6bi5jb250ZW50KXx8dC5hdHRyKCJkYXRhLWNvbnRlbnQiKSxlfSx0aXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdGlwfHwodGhpcy4kdGlwPWUodGhpcy5vcHRpb25zLnRlbXBsYXRlKSksdGhpcy4kdGlwfSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5oaWRlKCkuJGVsZW1lbnQub2ZmKCIuIit0aGlzLnR5cGUpLnJlbW92ZURhdGEodGhpcy50eXBlKX19KTt2YXIgbj1lLmZuLnBvcG92ZXI7ZS5mbi5wb3BvdmVyPWZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgcj1lKHRoaXMpLGk9ci5kYXRhKCJwb3BvdmVyIikscz10eXBlb2Ygbj09Im9iamVjdCImJm47aXx8ci5kYXRhKCJwb3BvdmVyIixpPW5ldyB0KHRoaXMscykpLHR5cGVvZiBuPT0ic3RyaW5nIiYmaVtuXSgpfSl9LGUuZm4ucG9wb3Zlci5Db25zdHJ1Y3Rvcj10LGUuZm4ucG9wb3Zlci5kZWZhdWx0cz1lLmV4dGVuZCh7fSxlLmZuLnRvb2x0aXAuZGVmYXVsdHMse3BsYWNlbWVudDoicmlnaHQiLHRyaWdnZXI6ImNsaWNrIixjb250ZW50OiIiLHRlbXBsYXRlOic8ZGl2IGNsYXNzPSJwb3BvdmVyIj48ZGl2IGNsYXNzPSJhcnJvdyI+PC9kaXY+PGgzIGNsYXNzPSJwb3BvdmVyLXRpdGxlIj48L2gzPjxkaXYgY2xhc3M9InBvcG92ZXItY29udGVudCI+PC9kaXY+PC9kaXY+J30pLGUuZm4ucG9wb3Zlci5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIGUuZm4ucG9wb3Zlcj1uLHRoaXN9fSh3aW5kb3cualF1ZXJ5KSwhZnVuY3Rpb24oZSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHQodCxuKXt2YXIgcj1lLnByb3h5KHRoaXMucHJvY2Vzcyx0aGlzKSxpPWUodCkuaXMoImJvZHkiKT9lKHdpbmRvdyk6ZSh0KSxzO3RoaXMub3B0aW9ucz1lLmV4dGVuZCh7fSxlLmZuLnNjcm9sbHNweS5kZWZhdWx0cyxuKSx0aGlzLiRzY3JvbGxFbGVtZW50PWkub24oInNjcm9sbC5zY3JvbGwtc3B5LmRhdGEtYXBpIixyKSx0aGlzLnNlbGVjdG9yPSh0aGlzLm9wdGlvbnMudGFyZ2V0fHwocz1lKHQpLmF0dHIoImhyZWYiKSkmJnMucmVwbGFjZSgvLiooPz0jW15cc10rJCkvLCIiKXx8IiIpKyIgLm5hdiBsaSA+IGEiLHRoaXMuJGJvZHk9ZSgiYm9keSIpLHRoaXMucmVmcmVzaCgpLHRoaXMucHJvY2VzcygpfXQucHJvdG90eXBlPXtjb25zdHJ1Y3Rvcjp0LHJlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG47dGhpcy5vZmZzZXRzPWUoW10pLHRoaXMudGFyZ2V0cz1lKFtdKSxuPXRoaXMuJGJvZHkuZmluZCh0aGlzLnNlbGVjdG9yKS5tYXAoZnVuY3Rpb24oKXt2YXIgbj1lKHRoaXMpLHI9bi5kYXRhKCJ0YXJnZXQiKXx8bi5hdHRyKCJocmVmIiksaT0vXiNcdy8udGVzdChyKSYmZShyKTtyZXR1cm4gaSYmaS5sZW5ndGgmJltbaS5wb3NpdGlvbigpLnRvcCsoIWUuaXNXaW5kb3codC4kc2Nyb2xsRWxlbWVudC5nZXQoMCkpJiZ0LiRzY3JvbGxFbGVtZW50LnNjcm9sbFRvcCgpKSxyXV18fG51bGx9KS5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGVbMF0tdFswXX0pLmVhY2goZnVuY3Rpb24oKXt0Lm9mZnNldHMucHVzaCh0aGlzWzBdKSx0LnRhcmdldHMucHVzaCh0aGlzWzFdKX0pfSxwcm9jZXNzOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kc2Nyb2xsRWxlbWVudC5zY3JvbGxUb3AoKSt0aGlzLm9wdGlvbnMub2Zmc2V0LHQ9dGhpcy4kc2Nyb2xsRWxlbWVudFswXS5zY3JvbGxIZWlnaHR8fHRoaXMuJGJvZHlbMF0uc2Nyb2xsSGVpZ2h0LG49dC10aGlzLiRzY3JvbGxFbGVtZW50LmhlaWdodCgpLHI9dGhpcy5vZmZzZXRzLGk9dGhpcy50YXJnZXRzLHM9dGhpcy5hY3RpdmVUYXJnZXQsbztpZihlPj1uKXJldHVybiBzIT0obz1pLmxhc3QoKVswXSkmJnRoaXMuYWN0aXZhdGUobyk7Zm9yKG89ci5sZW5ndGg7by0tOylzIT1pW29dJiZlPj1yW29dJiYoIXJbbysxXXx8ZTw9cltvKzFdKSYmdGhpcy5hY3RpdmF0ZShpW29dKX0sYWN0aXZhdGU6ZnVuY3Rpb24odCl7dmFyIG4scjt0aGlzLmFjdGl2ZVRhcmdldD10LGUodGhpcy5zZWxlY3RvcikucGFyZW50KCIuYWN0aXZlIikucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpLHI9dGhpcy5zZWxlY3RvcisnW2RhdGEtdGFyZ2V0PSInK3QrJyJdLCcrdGhpcy5zZWxlY3RvcisnW2hyZWY9IicrdCsnIl0nLG49ZShyKS5wYXJlbnQoImxpIikuYWRkQ2xhc3MoImFjdGl2ZSIpLG4ucGFyZW50KCIuZHJvcGRvd24tbWVudSIpLmxlbmd0aCYmKG49bi5jbG9zZXN0KCJsaS5kcm9wZG93biIpLmFkZENsYXNzKCJhY3RpdmUiKSksbi50cmlnZ2VyKCJhY3RpdmF0ZSIpfX07dmFyIG49ZS5mbi5zY3JvbGxzcHk7ZS5mbi5zY3JvbGxzcHk9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciByPWUodGhpcyksaT1yLmRhdGEoInNjcm9sbHNweSIpLHM9dHlwZW9mIG49PSJvYmplY3QiJiZuO2l8fHIuZGF0YSgic2Nyb2xsc3B5IixpPW5ldyB0KHRoaXMscykpLHR5cGVvZiBuPT0ic3RyaW5nIiYmaVtuXSgpfSl9LGUuZm4uc2Nyb2xsc3B5LkNvbnN0cnVjdG9yPXQsZS5mbi5zY3JvbGxzcHkuZGVmYXVsdHM9e29mZnNldDoxMH0sZS5mbi5zY3JvbGxzcHkubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBlLmZuLnNjcm9sbHNweT1uLHRoaXN9LGUod2luZG93KS5vbigibG9hZCIsZnVuY3Rpb24oKXtlKCdbZGF0YS1zcHk9InNjcm9sbCJdJykuZWFjaChmdW5jdGlvbigpe3ZhciB0PWUodGhpcyk7dC5zY3JvbGxzcHkodC5kYXRhKCkpfSl9KX0od2luZG93LmpRdWVyeSksIWZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgdD1mdW5jdGlvbih0KXt0aGlzLmVsZW1lbnQ9ZSh0KX07dC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnQsc2hvdzpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZWxlbWVudCxuPXQuY2xvc2VzdCgidWw6bm90KC5kcm9wZG93bi1tZW51KSIpLHI9dC5hdHRyKCJkYXRhLXRhcmdldCIpLGkscyxvO3J8fChyPXQuYXR0cigiaHJlZiIpLHI9ciYmci5yZXBsYWNlKC8uKig/PSNbXlxzXSokKS8sIiIpKTtpZih0LnBhcmVudCgibGkiKS5oYXNDbGFzcygiYWN0aXZlIikpcmV0dXJuO2k9bi5maW5kKCIuYWN0aXZlOmxhc3QgYSIpWzBdLG89ZS5FdmVudCgic2hvdyIse3JlbGF0ZWRUYXJnZXQ6aX0pLHQudHJpZ2dlcihvKTtpZihvLmlzRGVmYXVsdFByZXZlbnRlZCgpKXJldHVybjtzPWUociksdGhpcy5hY3RpdmF0ZSh0LnBhcmVudCgibGkiKSxuKSx0aGlzLmFjdGl2YXRlKHMscy5wYXJlbnQoKSxmdW5jdGlvbigpe3QudHJpZ2dlcih7dHlwZToic2hvd24iLHJlbGF0ZWRUYXJnZXQ6aX0pfSl9LGFjdGl2YXRlOmZ1bmN0aW9uKHQsbixyKXtmdW5jdGlvbiBvKCl7aS5yZW1vdmVDbGFzcygiYWN0aXZlIikuZmluZCgiPiAuZHJvcGRvd24tbWVudSA+IC5hY3RpdmUiKS5yZW1vdmVDbGFzcygiYWN0aXZlIiksdC5hZGRDbGFzcygiYWN0aXZlIikscz8odFswXS5vZmZzZXRXaWR0aCx0LmFkZENsYXNzKCJpbiIpKTp0LnJlbW92ZUNsYXNzKCJmYWRlIiksdC5wYXJlbnQoIi5kcm9wZG93bi1tZW51IikmJnQuY2xvc2VzdCgibGkuZHJvcGRvd24iKS5hZGRDbGFzcygiYWN0aXZlIiksciYmcigpfXZhciBpPW4uZmluZCgiPiAuYWN0aXZlIikscz1yJiZlLnN1cHBvcnQudHJhbnNpdGlvbiYmaS5oYXNDbGFzcygiZmFkZSIpO3M/aS5vbmUoZS5zdXBwb3J0LnRyYW5zaXRpb24uZW5kLG8pOm8oKSxpLnJlbW92ZUNsYXNzKCJpbiIpfX07dmFyIG49ZS5mbi50YWI7ZS5mbi50YWI9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciByPWUodGhpcyksaT1yLmRhdGEoInRhYiIpO2l8fHIuZGF0YSgidGFiIixpPW5ldyB0KHRoaXMpKSx0eXBlb2Ygbj09InN0cmluZyImJmlbbl0oKX0pfSxlLmZuLnRhYi5Db25zdHJ1Y3Rvcj10LGUuZm4udGFiLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gZS5mbi50YWI9bix0aGlzfSxlKGRvY3VtZW50KS5vbigiY2xpY2sudGFiLmRhdGEtYXBpIiwnW2RhdGEtdG9nZ2xlPSJ0YWIiXSwgW2RhdGEtdG9nZ2xlPSJwaWxsIl0nLGZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSxlKHRoaXMpLnRhYigic2hvdyIpfSl9KHdpbmRvdy5qUXVlcnkpLCFmdW5jdGlvbihlKXsidXNlIHN0cmljdCI7dmFyIHQ9ZnVuY3Rpb24odCxuKXt0aGlzLiRlbGVtZW50PWUodCksdGhpcy5vcHRpb25zPWUuZXh0ZW5kKHt9LGUuZm4udHlwZWFoZWFkLmRlZmF1bHRzLG4pLHRoaXMubWF0Y2hlcj10aGlzLm9wdGlvbnMubWF0Y2hlcnx8dGhpcy5tYXRjaGVyLHRoaXMuc29ydGVyPXRoaXMub3B0aW9ucy5zb3J0ZXJ8fHRoaXMuc29ydGVyLHRoaXMuaGlnaGxpZ2h0ZXI9dGhpcy5vcHRpb25zLmhpZ2hsaWdodGVyfHx0aGlzLmhpZ2hsaWdodGVyLHRoaXMudXBkYXRlcj10aGlzLm9wdGlvbnMudXBkYXRlcnx8dGhpcy51cGRhdGVyLHRoaXMuc291cmNlPXRoaXMub3B0aW9ucy5zb3VyY2UsdGhpcy4kbWVudT1lKHRoaXMub3B0aW9ucy5tZW51KSx0aGlzLnNob3duPSExLHRoaXMubGlzdGVuKCl9O3QucHJvdG90eXBlPXtjb25zdHJ1Y3Rvcjp0LHNlbGVjdDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuJG1lbnUuZmluZCgiLmFjdGl2ZSIpLmF0dHIoImRhdGEtdmFsdWUiKTtyZXR1cm4gdGhpcy4kZWxlbWVudC52YWwodGhpcy51cGRhdGVyKGUpKS5jaGFuZ2UoKSx0aGlzLmhpZGUoKX0sdXBkYXRlcjpmdW5jdGlvbihlKXtyZXR1cm4gZX0sc2hvdzpmdW5jdGlvbigpe3ZhciB0PWUuZXh0ZW5kKHt9LHRoaXMuJGVsZW1lbnQucG9zaXRpb24oKSx7aGVpZ2h0OnRoaXMuJGVsZW1lbnRbMF0ub2Zmc2V0SGVpZ2h0fSk7cmV0dXJuIHRoaXMuJG1lbnUuaW5zZXJ0QWZ0ZXIodGhpcy4kZWxlbWVudCkuY3NzKHt0b3A6dC50b3ArdC5oZWlnaHQsbGVmdDp0LmxlZnR9KS5zaG93KCksdGhpcy5zaG93bj0hMCx0aGlzfSxoaWRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJG1lbnUuaGlkZSgpLHRoaXMuc2hvd249ITEsdGhpc30sbG9va3VwOmZ1bmN0aW9uKHQpe3ZhciBuO3JldHVybiB0aGlzLnF1ZXJ5PXRoaXMuJGVsZW1lbnQudmFsKCksIXRoaXMucXVlcnl8fHRoaXMucXVlcnkubGVuZ3RoPHRoaXMub3B0aW9ucy5taW5MZW5ndGg/dGhpcy5zaG93bj90aGlzLmhpZGUoKTp0aGlzOihuPWUuaXNGdW5jdGlvbih0aGlzLnNvdXJjZSk/dGhpcy5zb3VyY2UodGhpcy5xdWVyeSxlLnByb3h5KHRoaXMucHJvY2Vzcyx0aGlzKSk6dGhpcy5zb3VyY2Usbj90aGlzLnByb2Nlc3Mobik6dGhpcyl9LHByb2Nlc3M6ZnVuY3Rpb24odCl7dmFyIG49dGhpcztyZXR1cm4gdD1lLmdyZXAodCxmdW5jdGlvbihlKXtyZXR1cm4gbi5tYXRjaGVyKGUpfSksdD10aGlzLnNvcnRlcih0KSx0Lmxlbmd0aD90aGlzLnJlbmRlcih0LnNsaWNlKDAsdGhpcy5vcHRpb25zLml0ZW1zKSkuc2hvdygpOnRoaXMuc2hvd24/dGhpcy5oaWRlKCk6dGhpc30sbWF0Y2hlcjpmdW5jdGlvbihlKXtyZXR1cm5+ZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YodGhpcy5xdWVyeS50b0xvd2VyQ2FzZSgpKX0sc29ydGVyOmZ1bmN0aW9uKGUpe3ZhciB0PVtdLG49W10scj1bXSxpO3doaWxlKGk9ZS5zaGlmdCgpKWkudG9Mb3dlckNhc2UoKS5pbmRleE9mKHRoaXMucXVlcnkudG9Mb3dlckNhc2UoKSk/fmkuaW5kZXhPZih0aGlzLnF1ZXJ5KT9uLnB1c2goaSk6ci5wdXNoKGkpOnQucHVzaChpKTtyZXR1cm4gdC5jb25jYXQobixyKX0saGlnaGxpZ2h0ZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5xdWVyeS5yZXBsYWNlKC9bXC1cW1xde30oKSorPy4sXFxcXiR8I1xzXS9nLCJcXCQmIik7cmV0dXJuIGUucmVwbGFjZShuZXcgUmVnRXhwKCIoIit0KyIpIiwiaWciKSxmdW5jdGlvbihlLHQpe3JldHVybiI8c3Ryb25nPiIrdCsiPC9zdHJvbmc+In0pfSxyZW5kZXI6ZnVuY3Rpb24odCl7dmFyIG49dGhpcztyZXR1cm4gdD1lKHQpLm1hcChmdW5jdGlvbih0LHIpe3JldHVybiB0PWUobi5vcHRpb25zLml0ZW0pLmF0dHIoImRhdGEtdmFsdWUiLHIpLHQuZmluZCgiYSIpLmh0bWwobi5oaWdobGlnaHRlcihyKSksdFswXX0pLHQuZmlyc3QoKS5hZGRDbGFzcygiYWN0aXZlIiksdGhpcy4kbWVudS5odG1sKHQpLHRoaXN9LG5leHQ6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy4kbWVudS5maW5kKCIuYWN0aXZlIikucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpLHI9bi5uZXh0KCk7ci5sZW5ndGh8fChyPWUodGhpcy4kbWVudS5maW5kKCJsaSIpWzBdKSksci5hZGRDbGFzcygiYWN0aXZlIil9LHByZXY6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy4kbWVudS5maW5kKCIuYWN0aXZlIikucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpLG49dC5wcmV2KCk7bi5sZW5ndGh8fChuPXRoaXMuJG1lbnUuZmluZCgibGkiKS5sYXN0KCkpLG4uYWRkQ2xhc3MoImFjdGl2ZSIpfSxsaXN0ZW46ZnVuY3Rpb24oKXt0aGlzLiRlbGVtZW50Lm9uKCJmb2N1cyIsZS5wcm94eSh0aGlzLmZvY3VzLHRoaXMpKS5vbigiYmx1ciIsZS5wcm94eSh0aGlzLmJsdXIsdGhpcykpLm9uKCJrZXlwcmVzcyIsZS5wcm94eSh0aGlzLmtleXByZXNzLHRoaXMpKS5vbigia2V5dXAiLGUucHJveHkodGhpcy5rZXl1cCx0aGlzKSksdGhpcy5ldmVudFN1cHBvcnRlZCgia2V5ZG93biIpJiZ0aGlzLiRlbGVtZW50Lm9uKCJrZXlkb3duIixlLnByb3h5KHRoaXMua2V5ZG93bix0aGlzKSksdGhpcy4kbWVudS5vbigiY2xpY2siLGUucHJveHkodGhpcy5jbGljayx0aGlzKSkub24oIm1vdXNlZW50ZXIiLCJsaSIsZS5wcm94eSh0aGlzLm1vdXNlZW50ZXIsdGhpcykpLm9uKCJtb3VzZWxlYXZlIiwibGkiLGUucHJveHkodGhpcy5tb3VzZWxlYXZlLHRoaXMpKX0sZXZlbnRTdXBwb3J0ZWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZSBpbiB0aGlzLiRlbGVtZW50O3JldHVybiB0fHwodGhpcy4kZWxlbWVudC5zZXRBdHRyaWJ1dGUoZSwicmV0dXJuOyIpLHQ9dHlwZW9mIHRoaXMuJGVsZW1lbnRbZV09PSJmdW5jdGlvbiIpLHR9LG1vdmU6ZnVuY3Rpb24oZSl7aWYoIXRoaXMuc2hvd24pcmV0dXJuO3N3aXRjaChlLmtleUNvZGUpe2Nhc2UgOTpjYXNlIDEzOmNhc2UgMjc6ZS5wcmV2ZW50RGVmYXVsdCgpO2JyZWFrO2Nhc2UgMzg6ZS5wcmV2ZW50RGVmYXVsdCgpLHRoaXMucHJldigpO2JyZWFrO2Nhc2UgNDA6ZS5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubmV4dCgpfWUuc3RvcFByb3BhZ2F0aW9uKCl9LGtleWRvd246ZnVuY3Rpb24odCl7dGhpcy5zdXBwcmVzc0tleVByZXNzUmVwZWF0PX5lLmluQXJyYXkodC5rZXlDb2RlLFs0MCwzOCw5LDEzLDI3XSksdGhpcy5tb3ZlKHQpfSxrZXlwcmVzczpmdW5jdGlvbihlKXtpZih0aGlzLnN1cHByZXNzS2V5UHJlc3NSZXBlYXQpcmV0dXJuO3RoaXMubW92ZShlKX0sa2V5dXA6ZnVuY3Rpb24oZSl7c3dpdGNoKGUua2V5Q29kZSl7Y2FzZSA0MDpjYXNlIDM4OmNhc2UgMTY6Y2FzZSAxNzpjYXNlIDE4OmJyZWFrO2Nhc2UgOTpjYXNlIDEzOmlmKCF0aGlzLnNob3duKXJldHVybjt0aGlzLnNlbGVjdCgpO2JyZWFrO2Nhc2UgMjc6aWYoIXRoaXMuc2hvd24pcmV0dXJuO3RoaXMuaGlkZSgpO2JyZWFrO2RlZmF1bHQ6dGhpcy5sb29rdXAoKX1lLnN0b3BQcm9wYWdhdGlvbigpLGUucHJldmVudERlZmF1bHQoKX0sZm9jdXM6ZnVuY3Rpb24oZSl7dGhpcy5mb2N1c2VkPSEwfSxibHVyOmZ1bmN0aW9uKGUpe3RoaXMuZm9jdXNlZD0hMSwhdGhpcy5tb3VzZWRvdmVyJiZ0aGlzLnNob3duJiZ0aGlzLmhpZGUoKX0sY2xpY2s6ZnVuY3Rpb24oZSl7ZS5zdG9wUHJvcGFnYXRpb24oKSxlLnByZXZlbnREZWZhdWx0KCksdGhpcy5zZWxlY3QoKSx0aGlzLiRlbGVtZW50LmZvY3VzKCl9LG1vdXNlZW50ZXI6ZnVuY3Rpb24odCl7dGhpcy5tb3VzZWRvdmVyPSEwLHRoaXMuJG1lbnUuZmluZCgiLmFjdGl2ZSIpLnJlbW92ZUNsYXNzKCJhY3RpdmUiKSxlKHQuY3VycmVudFRhcmdldCkuYWRkQ2xhc3MoImFjdGl2ZSIpfSxtb3VzZWxlYXZlOmZ1bmN0aW9uKGUpe3RoaXMubW91c2Vkb3Zlcj0hMSwhdGhpcy5mb2N1c2VkJiZ0aGlzLnNob3duJiZ0aGlzLmhpZGUoKX19O3ZhciBuPWUuZm4udHlwZWFoZWFkO2UuZm4udHlwZWFoZWFkPWZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgcj1lKHRoaXMpLGk9ci5kYXRhKCJ0eXBlYWhlYWQiKSxzPXR5cGVvZiBuPT0ib2JqZWN0IiYmbjtpfHxyLmRhdGEoInR5cGVhaGVhZCIsaT1uZXcgdCh0aGlzLHMpKSx0eXBlb2Ygbj09InN0cmluZyImJmlbbl0oKX0pfSxlLmZuLnR5cGVhaGVhZC5kZWZhdWx0cz17c291cmNlOltdLGl0ZW1zOjgsbWVudTonPHVsIGNsYXNzPSJ0eXBlYWhlYWQgZHJvcGRvd24tbWVudSI+PC91bD4nLGl0ZW06JzxsaT48YSBocmVmPSIjIj48L2E+PC9saT4nLG1pbkxlbmd0aDoxfSxlLmZuLnR5cGVhaGVhZC5Db25zdHJ1Y3Rvcj10LGUuZm4udHlwZWFoZWFkLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gZS5mbi50eXBlYWhlYWQ9bix0aGlzfSxlKGRvY3VtZW50KS5vbigiZm9jdXMudHlwZWFoZWFkLmRhdGEtYXBpIiwnW2RhdGEtcHJvdmlkZT0idHlwZWFoZWFkIl0nLGZ1bmN0aW9uKHQpe3ZhciBuPWUodGhpcyk7aWYobi5kYXRhKCJ0eXBlYWhlYWQiKSlyZXR1cm47bi50eXBlYWhlYWQobi5kYXRhKCkpfSl9KHdpbmRvdy5qUXVlcnkpLCFmdW5jdGlvbihlKXsidXNlIHN0cmljdCI7dmFyIHQ9ZnVuY3Rpb24odCxuKXt0aGlzLm9wdGlvbnM9ZS5leHRlbmQoe30sZS5mbi5hZmZpeC5kZWZhdWx0cyxuKSx0aGlzLiR3aW5kb3c9ZSh3aW5kb3cpLm9uKCJzY3JvbGwuYWZmaXguZGF0YS1hcGkiLGUucHJveHkodGhpcy5jaGVja1Bvc2l0aW9uLHRoaXMpKS5vbigiY2xpY2suYWZmaXguZGF0YS1hcGkiLGUucHJveHkoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGUucHJveHkodGhpcy5jaGVja1Bvc2l0aW9uLHRoaXMpLDEpfSx0aGlzKSksdGhpcy4kZWxlbWVudD1lKHQpLHRoaXMuY2hlY2tQb3NpdGlvbigpfTt0LnByb3RvdHlwZS5jaGVja1Bvc2l0aW9uPWZ1bmN0aW9uKCl7aWYoIXRoaXMuJGVsZW1lbnQuaXMoIjp2aXNpYmxlIikpcmV0dXJuO3ZhciB0PWUoZG9jdW1lbnQpLmhlaWdodCgpLG49dGhpcy4kd2luZG93LnNjcm9sbFRvcCgpLHI9dGhpcy4kZWxlbWVudC5vZmZzZXQoKSxpPXRoaXMub3B0aW9ucy5vZmZzZXQscz1pLmJvdHRvbSxvPWkudG9wLHU9ImFmZml4IGFmZml4LXRvcCBhZmZpeC1ib3R0b20iLGE7dHlwZW9mIGkhPSJvYmplY3QiJiYocz1vPWkpLHR5cGVvZiBvPT0iZnVuY3Rpb24iJiYobz1pLnRvcCgpKSx0eXBlb2Ygcz09ImZ1bmN0aW9uIiYmKHM9aS5ib3R0b20oKSksYT10aGlzLnVucGluIT1udWxsJiZuK3RoaXMudW5waW48PXIudG9wPyExOnMhPW51bGwmJnIudG9wK3RoaXMuJGVsZW1lbnQuaGVpZ2h0KCk+PXQtcz8iYm90dG9tIjpvIT1udWxsJiZuPD1vPyJ0b3AiOiExO2lmKHRoaXMuYWZmaXhlZD09PWEpcmV0dXJuO3RoaXMuYWZmaXhlZD1hLHRoaXMudW5waW49YT09ImJvdHRvbSI/ci50b3AtbjpudWxsLHRoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3ModSkuYWRkQ2xhc3MoImFmZml4IisoYT8iLSIrYToiIikpfTt2YXIgbj1lLmZuLmFmZml4O2UuZm4uYWZmaXg9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciByPWUodGhpcyksaT1yLmRhdGEoImFmZml4Iikscz10eXBlb2Ygbj09Im9iamVjdCImJm47aXx8ci5kYXRhKCJhZmZpeCIsaT1uZXcgdCh0aGlzLHMpKSx0eXBlb2Ygbj09InN0cmluZyImJmlbbl0oKX0pfSxlLmZuLmFmZml4LkNvbnN0cnVjdG9yPXQsZS5mbi5hZmZpeC5kZWZhdWx0cz17b2Zmc2V0OjB9LGUuZm4uYWZmaXgubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBlLmZuLmFmZml4PW4sdGhpc30sZSh3aW5kb3cpLm9uKCJsb2FkIixmdW5jdGlvbigpe2UoJ1tkYXRhLXNweT0iYWZmaXgiXScpLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLG49dC5kYXRhKCk7bi5vZmZzZXQ9bi5vZmZzZXR8fHt9LG4ub2Zmc2V0Qm90dG9tJiYobi5vZmZzZXQuYm90dG9tPW4ub2Zmc2V0Qm90dG9tKSxuLm9mZnNldFRvcCYmKG4ub2Zmc2V0LnRvcD1uLm9mZnNldFRvcCksdC5hZmZpeChuKX0pfSl9KHdpbmRvdy5qUXVlcnkpOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvanMvZmlsdGVyc25pcHBldC5qcyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvanMvZmlsdGVyc25pcHBldC5qcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yYjg0YzU0Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9qcy9maWx0ZXJzbmlwcGV0LmpzCkBAIC0wLDAgKzEsOTQgQEAKKyJ1c2Ugc3RyaWN0IgorCisvLyBUaGUgZGlzYWJsZSByZW1vdmVzIHRoZSAnZGF0ZXBpY2tlcicgYXR0cmlidXRlIGFuZAorLy8gc2V0dGluZ3MsIHNvIHlvdSBoYXZlIHRvIHJlLWluaXRpYWxpemUgaXQgZWFjaCB0aW1lCisvLyB0aGUgZGF0ZSByYW5nZSBpcyBzZWxlY3RlZCBhbmQgZW5hYmxlZAorLy8gRE9NIGlzIHVzZWQgaW5zdGVhZCBvZiBqUXVlcnkgdG8gZmluZCB0aGUgZWxlbWVudHMKKy8vIGluIGFsbCBjb250ZXh0cworZnVuY3Rpb24gZGF0ZV9lbmFibGUgKGtleSwgYWN0aW9uKSB7CisKKyAgICB2YXIgZWxlbUZyb209ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImRhdGVfZnJvbV8iK2tleSk7CisgICAgdmFyIGVsZW1Ubz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZGF0ZV90b18iK2tleSk7CisKKyAgICBpZiAoJ2VuYWJsZScgPT0gYWN0aW9uKSB7CisgICAgICAgIGVsZW1Gcm9tLnJlbW92ZUF0dHJpYnV0ZSgiZGlzYWJsZWQiKTsKKyAgICAgICAgZWxlbVRvLnJlbW92ZUF0dHJpYnV0ZSgiZGlzYWJsZWQiKTsKKworICAgICAgICAkKGVsZW1Gcm9tKS5kYXRlcGlja2VyKCk7CisgICAgICAgICQoZWxlbVRvKS5kYXRlcGlja2VyKCk7CisKKyAgICAgICAgJChlbGVtRnJvbSkuZGF0ZXBpY2tlciggIm9wdGlvbiIsICJkYXRlRm9ybWF0IiwgImRkL21tL3l5IiApOworICAgICAgICAkKGVsZW1UbykuZGF0ZXBpY2tlciggIm9wdGlvbiIsICJkYXRlRm9ybWF0IiwgImRkL21tL3l5IiApOworCisgICAgICAgICQoZWxlbUZyb20pLmRhdGVwaWNrZXIoICJzZXREYXRlIiwgZWxlbUZyb20uZ2V0QXR0cmlidXRlKCAiZGF0YS1zZXREYXRlIikgKTsKKyAgICAgICAgJChlbGVtVG8pLmRhdGVwaWNrZXIoICJzZXREYXRlIiwgZWxlbVRvLmdldEF0dHJpYnV0ZSggImRhdGEtc2V0RGF0ZSIpICk7CisgICAgICAgICQoZWxlbUZyb20pLmRhdGVwaWNrZXIoICJvcHRpb24iLCAibWluRGF0ZSIsIGVsZW1Gcm9tLmdldEF0dHJpYnV0ZSggImRhdGEtbWluRGF0ZSIpKTsKKyAgICAgICAgJChlbGVtVG8pLmRhdGVwaWNrZXIoICJvcHRpb24iLCAibWluRGF0ZSIsICBlbGVtVG8uZ2V0QXR0cmlidXRlKCAiZGF0YS1taW5EYXRlIikpOworICAgICAgICAkKGVsZW1Gcm9tKS5kYXRlcGlja2VyKCAib3B0aW9uIiwgIm1heERhdGUiLCBlbGVtRnJvbS5nZXRBdHRyaWJ1dGUoICJkYXRhLW1heERhdGUiKSk7CisgICAgICAgICQoZWxlbVRvKS5kYXRlcGlja2VyKCAib3B0aW9uIiwgIm1heERhdGUiLCBlbGVtVG8uZ2V0QXR0cmlidXRlKCAiZGF0YS1tYXhEYXRlIikpOworICAgIH0gZWxzZSB7CisgICAgICAgIGVsZW1Gcm9tLnNldEF0dHJpYnV0ZSgiZGlzYWJsZWQiLCJkaXNhYmxlZCIpOworICAgICAgICBlbGVtVG8uc2V0QXR0cmlidXRlKCJkaXNhYmxlZCIsImRpc2FibGVkIik7CisgICAgfQorfQorCisvLyBJbml0aWFsaXplIHRoZSBkYXRlIHBpY2tlciBlbGVtZW50cyB3aXRoIHRoZWlyIGRlZmF1bHQgc3RhdGUgdmFyaWFibGVzLCBhbmQKKy8vIHJlZ2lzdGVyIHRoZSByYWRpbyBidXR0b24gYW5kIGZvcm0gYWN0aW9ucworZnVuY3Rpb24gZGF0ZV9pbml0IChrZXksIGZyb21fZGF0ZSwgdG9fZGF0ZSwgbWluX2RhdGUsIG1heF9kYXRlLCBpbml0aWFsX2VuYWJsZSkgeworCisgICAgdmFyIGVsZW1Gcm9tPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJkYXRlX2Zyb21fIitrZXkpOworICAgIHZhciBlbGVtVG89ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImRhdGVfdG9fIitrZXkpOworCisgICAgLy8gV2VyZSB0aGVyZSBhbnkgZGF0ZXJhbmdlIGZpbHRlcnMgaW5zdGFudGlhdGVkPyAoZS5nLiBubyBidWlsZHMgZm91bmQpCisgICAgaWYgKG51bGwgPT0gZWxlbUZyb20pIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGluaXQgdGhlIGRhdGVwaWNrZXIgY29udGV4dCBkYXRhCisgICAgZWxlbUZyb20uc2V0QXR0cmlidXRlKCAiZGF0YS1zZXREYXRlIiwgZnJvbV9kYXRlICk7CisgICAgZWxlbVRvLnNldEF0dHJpYnV0ZSggImRhdGEtc2V0RGF0ZSIsIHRvX2RhdGUgKTsKKyAgICBlbGVtRnJvbS5zZXRBdHRyaWJ1dGUoICJkYXRhLW1pbkRhdGUiLCBtaW5fZGF0ZSk7CisgICAgZWxlbVRvLnNldEF0dHJpYnV0ZSggImRhdGEtbWluRGF0ZSIsICBtaW5fZGF0ZSk7CisgICAgZWxlbUZyb20uc2V0QXR0cmlidXRlKCAiZGF0YS1tYXhEYXRlIiwgbWF4X2RhdGUpOworICAgIGVsZW1Uby5zZXRBdHRyaWJ1dGUoICJkYXRhLW1heERhdGUiLCBtYXhfZGF0ZSk7CisKKyAgICAvLyBkb2VzIHRoZSBkYXRlIHNldCBzdGFydCBlbmFibGVkPworICAgIGlmIChrZXkgPT0gaW5pdGlhbF9lbmFibGUpIHsKKyAgICAgICAgZGF0ZV9lbmFibGUgKGtleSwgImVuYWJsZSIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRhdGVfZW5hYmxlIChrZXksICJkaXNhYmxlIik7CisgICAgfQorCisgICAgLy8gY2F0Y2ggdGhlIHJhZGlvIGJ1dHRvbiBzZWxlY3RzIGZvciBlbmFibGUvZGlzYWJsZQorICAgICQoJ2lucHV0OnJhZGlvW25hbWU9ImZpbHRlciJdJykuY2hhbmdlKGZ1bmN0aW9uKCl7CisgICAgICAgIGlmICgkKHRoaXMpLnZhbCgpID09ICdkYXRlcmFuZ2UnKSB7CisgICAgICAgICAgICBrZXk9JCh0aGlzKS5hdHRyKCJkYXRhLWtleSIpOworICAgICAgICAgICAgZGF0ZV9lbmFibGUgKGtleSwgJ2VuYWJsZScpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAga2V5PSQodGhpcykuYXR0cigiZGF0YS1rZXkiKTsKKyAgICAgICAgICAgIGRhdGVfZW5hYmxlIChrZXksICdkaXNhYmxlJyk7CisgICAgICAgIH0KKyAgICB9KTsKKworICAgIC8vIGNhdGNoIGFueSBuZXcgJ2Zyb20nIGRhdGUgYXMgbWluRGF0ZSBmb3IgJ3RvJyBkYXRlCisgICAgJCgiI2RhdGVfZnJvbV8iK2tleSkuY2hhbmdlKGZ1bmN0aW9uKCl7CisgICAgICAgIGZyb21fZGF0ZSA9ICQoIiNkYXRlX2Zyb21fIitrZXkpLnZhbCgpOworICAgICAgICAkKCIjZGF0ZV90b18iK2tleSkuZGF0ZXBpY2tlciggIm9wdGlvbiIsICJtaW5EYXRlIiwgZnJvbV9kYXRlICk7CisgICAgfSk7CisKKyAgICAvLyBjYXRjaCB0aGUgc3VibWl0IChqdXN0IG9uY2UpCisgICAgJCgiZm9ybSIpLnVuYmluZCgnc3VibWl0Jyk7CisgICAgJCgiZm9ybSIpLnN1Ym1pdChmdW5jdGlvbihlKSB7CisgICAgICAgIC8vIGZvcm1hdCBhIGNvbXBvc2l0ZSBkYXRlcmFuZ2UgZmlsdGVyIHZhbHVlIHNvIHRoYXQgaXQgY2FuIGJlIHBhcnNlZCBhbmQgcG9zdC1wcm9jZXNzZWQgaW4gdGhlIHZpZXcKKyAgICAgICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgICBpZiAoJCgiI2RhdGVfZnJvbV8iK2tleSkubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgdmFyIGZpbHRlcj1rZXkrIl9fZ3RlISIra2V5KyJfX2x0OiIrJCgiI2RhdGVfZnJvbV8iK2tleSkudmFsKCkrIiEiKyQoIiNkYXRlX3RvXyIra2V5KS52YWwoKSsiX2RhdGVyYW5nZSI7CisgICAgICAgICAgICAgICAgJCgiI2xhc3RfZGF0ZV9mcm9tXyIra2V5KS52YWwoJCgiI2RhdGVfZnJvbV8iK2tleSkudmFsKCkpOworICAgICAgICAgICAgICAgICQoIiNsYXN0X2RhdGVfdG9fIitrZXkpLnZhbCgkKCIjZGF0ZV90b18iK2tleSkudmFsKCkpOworICAgICAgICAgICAgICAgICQoIiNmaWx0ZXJfdmFsdWVfIitrZXkpLnZhbChmaWx0ZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0pOworCit9OwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9qcy9pbXBvcnRsYXllci5qcyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvanMvaW1wb3J0bGF5ZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZhZGJjMAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvanMvaW1wb3J0bGF5ZXIuanMKQEAgLTAsMCArMSwyNzYgQEAKKyJ1c2Ugc3RyaWN0IgorCitmdW5jdGlvbiBpbXBvcnRMYXllclBhZ2VJbml0IChjdHgpIHsKKworICB2YXIgbGF5ZXJEZXBCdG4gPSAkKCIjYWRkLWxheWVyLWRlcGVuZGVuY3ktYnRuIik7CisgIHZhciBpbXBvcnRBbmRBZGRCdG4gPSAkKCIjaW1wb3J0LWFuZC1hZGQtYnRuIik7CisgIHZhciBsYXllck5hbWVJbnB1dCA9ICQoIiNpbXBvcnQtbGF5ZXItbmFtZSIpOworICB2YXIgdmNzVVJMSW5wdXQgPSAkKCIjbGF5ZXItZ2l0LXJlcG8tdXJsIik7CisgIHZhciBnaXRSZWZJbnB1dCA9ICQoIiNsYXllci1naXQtcmVmIik7CisgIHZhciBsYXllckRlcElucHV0ID0gJCgiI2xheWVyLWRlcGVuZGVuY3kiKTsKKyAgdmFyIGxheWVyTmFtZUN0cmwgPSAkKCIjbGF5ZXItbmFtZS1jdHJsIik7CisgIHZhciBkdXBsaWNhdGVkTGF5ZXJOYW1lID0gJCgiI2R1cGxpY2F0ZWQtbGF5ZXItbmFtZS1oaW50Iik7CisKKyAgdmFyIGxheWVyRGVwcyA9IHt9OworICB2YXIgbGF5ZXJEZXBzRGVwcyA9IHt9OworICB2YXIgY3VycmVudExheWVyRGVwU2VsZWN0aW9uOworICB2YXIgdmFsaWRMYXllck5hbWUgPSAvXihcd3wtKSskLzsKKworICBsaWJ0b2FzdGVyLm1ha2VUeXBlYWhlYWQobGF5ZXJEZXBJbnB1dCwgbGlidG9hc3Rlci5jdHgubGF5ZXJzVHlwZUFoZWFkVXJsLCB7IGluY2x1ZGVfYWRkZWQ6ICJ0cnVlIiB9LCBmdW5jdGlvbihpdGVtKXsKKyAgICBjdXJyZW50TGF5ZXJEZXBTZWxlY3Rpb24gPSBpdGVtOworCisgICAgbGF5ZXJEZXBCdG4ucmVtb3ZlQXR0cigiZGlzYWJsZWQiKTsKKyAgfSk7CisKKworICAvKiBXZSBhdXRvbWF0aWNhbGx5IGFkZCAib3BlbmVtYmVkZGVkLWNvcmUiIGxheWVyIGZvciBjb252ZW5pZW5jZSBhcyBhCisgICAqIGRlcGVuZGVuY3kgYXMgcHJldHR5IG11Y2ggYWxsIGxheWVycyBkZXBlbmQgb24gdGhpcyBvbmUKKyAgICovCisgICQuZ2V0SlNPTihsaWJ0b2FzdGVyLmN0eC5sYXllcnNUeXBlQWhlYWRVcmwsCisgICAgeyBpbmNsdWRlX2FkZGVkOiAidHJ1ZSIgLCBzZWFyY2g6ICJvcGVuZW1iZWRkZWQtY29yZSIgfSwKKyAgICBmdW5jdGlvbihsYXllcikgeworICAgIGlmIChsYXllci5yZXN1bHRzLmxlbmd0aCA+IDApIHsKKyAgICAgIGN1cnJlbnRMYXllckRlcFNlbGVjdGlvbiA9IGxheWVyLnJlc3VsdHNbMF07CisgICAgICBsYXllckRlcEJ0bi5jbGljaygpOworICAgIH0KKyAgfSk7CisKKyAgbGF5ZXJEZXBCdG4uY2xpY2soZnVuY3Rpb24oKXsKKyAgICBpZiAoY3VycmVudExheWVyRGVwU2VsZWN0aW9uID09IHVuZGVmaW5lZCkKKyAgICAgIHJldHVybjsKKworICAgIGxheWVyRGVwc1tjdXJyZW50TGF5ZXJEZXBTZWxlY3Rpb24uaWRdID0gY3VycmVudExheWVyRGVwU2VsZWN0aW9uOworCisgICAgLyogTWFrZSBhIGxpc3QgaXRlbSBmb3IgdGhlIG5ldyBsYXllciBkZXBlbmRlbmN5ICovCisgICAgdmFyIG5ld0xheWVyRGVwID0gJCgiPGxpPjxhPjwvYT48c3BhbiBjbGFzcz1cImljb24tdHJhc2hcIiBkYXRhLXRvZ2dsZT1cInRvb2x0aXBcIiB0aXRsZT1cIkRlbGV0ZVwiPjwvc3Bhbj48L2xpPiIpOworCisgICAgbmV3TGF5ZXJEZXAuZGF0YSgnbGF5ZXItaWQnLCBjdXJyZW50TGF5ZXJEZXBTZWxlY3Rpb24uaWQpOworICAgIG5ld0xheWVyRGVwLmNoaWxkcmVuKCJzcGFuIikudG9vbHRpcCgpOworCisgICAgdmFyIGxpbmsgPSBuZXdMYXllckRlcC5jaGlsZHJlbigiYSIpOworICAgIGxpbmsuYXR0cigiaHJlZiIsIGN1cnJlbnRMYXllckRlcFNlbGVjdGlvbi5sYXllcmRldGFpbHVybCk7CisgICAgbGluay50ZXh0KGN1cnJlbnRMYXllckRlcFNlbGVjdGlvbi5uYW1lKTsKKyAgICBsaW5rLnRvb2x0aXAoe3RpdGxlOiBjdXJyZW50TGF5ZXJEZXBTZWxlY3Rpb24udG9vbHRpcCwgcGxhY2VtZW50OiAicmlnaHQifSk7CisKKyAgICB2YXIgdHJhc2hJdGVtID0gbmV3TGF5ZXJEZXAuY2hpbGRyZW4oInNwYW4iKTsKKyAgICB0cmFzaEl0ZW0uY2xpY2soZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHRvUmVtb3ZlID0gJCh0aGlzKS5wYXJlbnQoKS5kYXRhKCdsYXllci1pZCcpOworICAgICAgZGVsZXRlIGxheWVyRGVwc1t0b1JlbW92ZV07CisgICAgICAkKHRoaXMpLnBhcmVudCgpLmZhZGVPdXQoZnVuY3Rpb24gKCl7CisgICAgICAgICQodGhpcykucmVtb3ZlKCk7CisgICAgICB9KTsKKyAgICB9KTsKKworICAgICQoIiNsYXllci1kZXBzLWxpc3QiKS5hcHBlbmQobmV3TGF5ZXJEZXApOworCisgICAgbGlidG9hc3Rlci5nZXRMYXllckRlcHNGb3JQcm9qZWN0KGN1cnJlbnRMYXllckRlcFNlbGVjdGlvbi5sYXllcmRldGFpbHVybCwgZnVuY3Rpb24gKGRhdGEpeworICAgICAgICAvKiBUaGVzZSBhcmUgdGhlIGRlcGVuZGVuY2llcyBvZiB0aGUgbGF5ZXIgYWRkZWQgYXMgYSBkZXBlbmRlbmN5ICovCisgICAgICAgIGlmIChkYXRhLmxpc3QubGVuZ3RoID4gMCkgeworICAgICAgICAgIGN1cnJlbnRMYXllckRlcFNlbGVjdGlvbi51cmwgPSBjdXJyZW50TGF5ZXJEZXBTZWxlY3Rpb24ubGF5ZXJkZXRhaWx1cmw7CisgICAgICAgICAgbGF5ZXJEZXBzW2N1cnJlbnRMYXllckRlcFNlbGVjdGlvbi5pZF0uZGVwcyA9IGRhdGEubGlzdDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENsZWFyIHRoZSBjdXJyZW50IHNlbGVjdGlvbiAqLworICAgICAgICBsYXllckRlcElucHV0LnZhbCgiIik7CisgICAgICAgIGN1cnJlbnRMYXllckRlcFNlbGVjdGlvbiA9IHVuZGVmaW5lZDsKKyAgICAgICAgbGF5ZXJEZXBCdG4uYXR0cigiZGlzYWJsZWQiLCJkaXNhYmxlZCIpOworICAgICAgfSwgbnVsbCk7CisgIH0pOworCisgIGltcG9ydEFuZEFkZEJ0bi5jbGljayhmdW5jdGlvbigpeworICAgIC8qIFRoaXMgaXMgYSBsaXN0IG9mIHRoZSBuYW1lcyBmcm9tIGxheWVyRGVwcyBmb3IgdGhlIGxheWVyIGRlcHMKKyAgICAgKiBtb2RhbCBkaWFsb2cgYm9keQorICAgICAqLworICAgIHZhciBkZXBOYW1lcyA9IFtdOworCisgICAgLyogYXJycmF5IG9mIGFsbCBsYXllciBkZXAgaWRzIGluY2x1ZGVzIHBhcmVudCBhbmQgY2hpbGQgZGVwcyAqLworICAgIHZhciBhbGxEZXBzID0gW107CisKKyAgICAvKiB0ZW1wb3Jhcnkgb2JqZWN0IHRvIHVzZSB0byBkbyBhIHJlZHVjZSBvbiB0aGUgZGVwZW5kZW5jaWVzIGZvciBlYWNoCisgICAgICogbGF5ZXIgZGVwZW5kZW5jeSBhZGRlZAorICAgICAqLworICAgIHZhciBkZXBEZXBzID0ge307CisKKyAgICAvKiB0aGUgbGF5ZXJzIHRoYXQgaGF2ZSBkZXBlbmRlbmNpZXMgaGF2ZSBhbiBleHRyYSBwcm9wZXJ0eSAiZGVwcyIKKyAgICAgKiBsb29rIGluIHRoaXMgZm9yIGVhY2ggbGF5ZXIgYW5kIHJlZHVjZSB0aGlzIHRvIGEgdW5xdWllIG9iamVjdAorICAgICAqIG9mIGRlcHMuCisgICAgICovCisgICAgZm9yICh2YXIga2V5IGluIGxheWVyRGVwcyl7CisgICAgICBpZiAobGF5ZXJEZXBzW2tleV0uaGFzT3duUHJvcGVydHkoJ2RlcHMnKSl7CisgICAgICAgIGZvciAodmFyIGRlcCBpbiBsYXllckRlcHNba2V5XS5kZXBzKXsKKyAgICAgICAgICB2YXIgbGF5ZXIgPSBsYXllckRlcHNba2V5XS5kZXBzW2RlcF07CisgICAgICAgICAgZGVwRGVwc1tsYXllci5pZF0gPSBsYXllcjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZGVwTmFtZXMucHVzaChsYXllckRlcHNba2V5XS5uYW1lKTsKKyAgICAgIGFsbERlcHMucHVzaChsYXllckRlcHNba2V5XS5pZCk7CisgICAgfQorCisgICAgLyogd2UgYWN0dWFsbHkgd2FudCBpdCBhcyBhbiBhcnJheSBzbyBjb252ZXJ0IGl0IG5vdyAqLworICAgIHZhciBkZXBEZXBzQXJyYXkgPSBbXTsKKyAgICBmb3IgKHZhciBrZXkgaW4gZGVwRGVwcykKKyAgICAgIGRlcERlcHNBcnJheS5wdXNoIChkZXBEZXBzW2tleV0pOworCisgICAgaWYgKGRlcERlcHNBcnJheS5sZW5ndGggPiAwKSB7CisgICAgICB2YXIgbGF5ZXIgPSB7IG5hbWU6IGxheWVyTmFtZUlucHV0LnZhbCgpLCB1cmw6ICIjIiwgaWQ6IC0xIH07CisgICAgICB2YXIgdGl0bGUgPSAiTGF5ZXIiOworICAgICAgdmFyIGJvZHkgPSAiPHN0cm9uZz4iK2xheWVyLm5hbWUrIjwvc3Ryb25nPidzIGRlcGVuZGVuY2llcyAoIisKKyAgICAgICAgZGVwTmFtZXMuam9pbigiLCAiKSsiPC9zcGFuPikgcmVxdWlyZSBzb21lIGxheWVycyB0aGF0IGFyZSBub3QgYWRkZWQgdG8geW91ciBwcm9qZWN0LiBTZWxlY3QgdGhlIG9uZXMgeW91IHdhbnQgdG8gYWRkOjwvcD4iOworCisgICAgICBzaG93TGF5ZXJEZXBzTW9kYWwobGF5ZXIsIGRlcERlcHNBcnJheSwgdGl0bGUsIGJvZHksIGZhbHNlLCBmdW5jdGlvbihsYXllck9ic0xpc3QpeworICAgICAgICAvKiBBZGQgdGhlIGFjY2VwdGVkIGxheWVyIGRlcGVuZGVuY2llcycgaWRzIHRvIHRoZSBhbGxEZXBzIGFycmF5ICovCisgICAgICAgIGZvciAodmFyIGtleSBpbiBsYXllck9ic0xpc3QpeworICAgICAgICAgIGFsbERlcHMucHVzaChsYXllck9ic0xpc3Rba2V5XS5pZCk7CisgICAgICAgIH0KKyAgICAgICAgaW1wb3J0X2FuZF9hZGQgKCk7CisgICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgaW1wb3J0X2FuZF9hZGQgKCk7CisgICAgfQorCisgICAgZnVuY3Rpb24gaW1wb3J0X2FuZF9hZGQgKCkgeworICAgICAgLyogY29udmVydCB0byBhIGNzdiBvZiBhbGwgdGhlIGRlcHMgdG8gYmUgYWRkZWQgKi8KKyAgICAgIHZhciBsYXllckRlcHNDc3YgPSBhbGxEZXBzLmpvaW4oIiwiKTsKKworICAgICAgdmFyIGxheWVyRGF0YSA9IHsKKyAgICAgICAgbmFtZTogbGF5ZXJOYW1lSW5wdXQudmFsKCksCisgICAgICAgIHZjc191cmw6IHZjc1VSTElucHV0LnZhbCgpLAorICAgICAgICBnaXRfcmVmOiBnaXRSZWZJbnB1dC52YWwoKSwKKyAgICAgICAgZGlyX3BhdGg6ICQoIiNsYXllci1zdWJkaXIiKS52YWwoKSwKKyAgICAgICAgcHJvamVjdF9pZDogbGlidG9hc3Rlci5jdHgucHJvamVjdElkLAorICAgICAgICBsYXllcl9kZXBzOiBsYXllckRlcHNDc3YsCisgICAgICB9OworCisgICAgICAkLmFqYXgoeworICAgICAgICAgIHR5cGU6ICJQT1NUIiwKKyAgICAgICAgICB1cmw6IGN0eC54aHJJbXBvcnRMYXllclVybCwKKyAgICAgICAgICBkYXRhOiBsYXllckRhdGEsCisgICAgICAgICAgaGVhZGVyczogeyAnWC1DU1JGVG9rZW4nIDogJC5jb29raWUoJ2NzcmZ0b2tlbicpfSwKKyAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSkgeworICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3IgIT0gIm9rIikgeworICAgICAgICAgICAgICBjb25zb2xlLmxvZyhkYXRhLmVycm9yKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIC8qIFN1Y2Nlc3MgbGF5ZXIgaW1wb3J0IG5vdyBnbyB0byB0aGUgcHJvamVjdCBwYWdlICovCisgICAgICAgICAgICAgICQuY29va2llKCdsYXllci1pbXBvcnRlZC1hbGVydCcsIEpTT04uc3RyaW5naWZ5KGRhdGEpLCB7IHBhdGg6ICcvJ30pOworICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZShsaWJ0b2FzdGVyLmN0eC5wcm9qZWN0UGFnZVVybCsnP25vdGlmeT1sYXllci1pbXBvcnRlZCcpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0sCisgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uIChkYXRhKSB7CisgICAgICAgICAgICBjb25zb2xlLmxvZygiQ2FsbCBmYWlsZWQiKTsKKyAgICAgICAgICAgIGNvbnNvbGUubG9nKGRhdGEpOworICAgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0KKyAgfSk7CisKKyAgZnVuY3Rpb24gZW5hYmxlX2ltcG9ydF9idG4oZW5hYmxlZCkgeworICAgIHZhciBpbXBvcnRBbmRBZGRIaW50ID0gJCgiI2ltcG9ydC1hbmQtYWRkLWhpbnQiKTsKKworICAgIGlmIChlbmFibGVkKSB7CisgICAgICBpbXBvcnRBbmRBZGRCdG4ucmVtb3ZlQXR0cigiZGlzYWJsZWQiKTsKKyAgICAgIGltcG9ydEFuZEFkZEhpbnQuaGlkZSgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGltcG9ydEFuZEFkZEJ0bi5hdHRyKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOworICAgIGltcG9ydEFuZEFkZEhpbnQuc2hvdygpOworICB9CisKKyAgZnVuY3Rpb24gY2hlY2tfZm9ybSgpIHsKKyAgICB2YXIgdmFsaWQgPSBmYWxzZTsKKyAgICB2YXIgaW5wdXRzID0gJCgiaW5wdXQ6cmVxdWlyZWQiKTsKKworICAgIGZvciAodmFyIGk9MDsgaTxpbnB1dHMubGVuZ3RoOyBpKyspeworICAgICAgaWYgKCEodmFsaWQgPSBpbnB1dHNbaV0udmFsdWUpKXsKKyAgICAgICAgZW5hYmxlX2ltcG9ydF9idG4oZmFsc2UpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodmFsaWQpCisgICAgICBlbmFibGVfaW1wb3J0X2J0bih0cnVlKTsKKyAgfQorCisgIGZ1bmN0aW9uIGxheWVyRXhpc3RzRXJyb3IobGF5ZXIpeworICAgIHZhciBkdXBMYXllckluZm8gPSAkKCIjZHVwbGljYXRlLWxheWVyLWluZm8iKTsKKyAgICBkdXBMYXllckluZm8uZmluZCgiLmR1cC1sYXllci1uYW1lIikudGV4dChsYXllci5uYW1lKTsKKyAgICBkdXBMYXllckluZm8uZmluZCgiLmR1cC1sYXllci1saW5rIikuYXR0cigiaHJlZiIsIGxheWVyLmxheWVyZGV0YWlsdXJsKTsKKyAgICBkdXBMYXllckluZm8uZmluZCgiI2R1cC1sYXllci12Y3MtdXJsIikudGV4dChsYXllci5sYXllcl9fdmNzX3VybCk7CisgICAgZHVwTGF5ZXJJbmZvLmZpbmQoIiNkdXAtbGF5ZXItcmV2aXNpb24iKS50ZXh0KGxheWVyLnJldmlzaW9uLmNvbW1pdCk7CisKKyAgICAkKCIuZmllbGRzLWFwYXJ0LWZyb20tbGF5ZXItbmFtZSIpLmZhZGVPdXQoZnVuY3Rpb24oKXsKKworICAgICAgZHVwTGF5ZXJJbmZvLmZhZGVJbigpOworICAgIH0pOworICB9CisKKyAgbGF5ZXJOYW1lSW5wdXQub24oJ2JsdXInLCBmdW5jdGlvbigpIHsKKyAgICAgIGlmICghJCh0aGlzKS52YWwoKSl7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIHZhciBuYW1lID0gJCh0aGlzKS52YWwoKTsKKworICAgICAgLyogQ2hlY2sgaWYgdGhlIGxheWVyIG5hbWUgZXhpc3RzICovCisgICAgICAkLmdldEpTT04obGlidG9hc3Rlci5jdHgubGF5ZXJzVHlwZUFoZWFkVXJsLAorICAgICAgICB7IGluY2x1ZGVfYWRkZWQ6ICJ0cnVlIiAsIHNlYXJjaDogbmFtZSwgZm9ybWF0OiAianNvbiIgfSwKKyAgICAgICAgZnVuY3Rpb24obGF5ZXIpIHsKKyAgICAgICAgICBpZiAobGF5ZXIucm93cy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBmb3IgKHZhciBpIGluIGxheWVyLnJvd3MpeworICAgICAgICAgICAgICBpZiAobGF5ZXIucm93c1tpXS5uYW1lID09IG5hbWUpIHsKKyAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhsYXllci5yb3dzW2ldKQorICAgICAgICAgICAgICAgIGxheWVyRXhpc3RzRXJyb3IobGF5ZXIucm93c1tpXSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICB9KTsKKyAgfSk7CisKKyAgdmNzVVJMSW5wdXQub24oJ2lucHV0JywgZnVuY3Rpb24oKSB7CisgICAgY2hlY2tfZm9ybSgpOworICB9KTsKKworICBnaXRSZWZJbnB1dC5vbignaW5wdXQnLCBmdW5jdGlvbigpIHsKKyAgICBjaGVja19mb3JtKCk7CisgIH0pOworCisgIGxheWVyTmFtZUlucHV0Lm9uKCdpbnB1dCcsIGZ1bmN0aW9uKCkgeworICAgIGlmICgkKHRoaXMpLnZhbCgpICYmICF2YWxpZExheWVyTmFtZS50ZXN0KCQodGhpcykudmFsKCkpKXsKKyAgICAgIGxheWVyTmFtZUN0cmwuYWRkQ2xhc3MoImVycm9yIikKKyAgICAgICQoIiNpbnZhbGlkLWxheWVyLW5hbWUtaGludCIpLnNob3coKTsKKyAgICAgIGVuYWJsZV9pbXBvcnRfYnRuKGZhbHNlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoJCgiI2R1cGxpY2F0ZS1sYXllci1pbmZvIikuY3NzKCJkaXNwbGF5IikgIT0gIk5vbmUiKXsKKyAgICAgICQoIiNkdXBsaWNhdGUtbGF5ZXItaW5mbyIpLmZhZGVPdXQoZnVuY3Rpb24oKXsKKyAgICAgICAgJCgiLmZpZWxkcy1hcGFydC1mcm9tLWxheWVyLW5hbWUiKS5zaG93KCk7CisgICAgICB9KTsKKworICAgIH0KKworICAgIC8qIERvbid0IHJlbW92ZSB0aGUgZXJyb3IgY2xhc3MgaWYgd2UncmUgZGlzcGxheWluZyB0aGUgZXJyb3IgZm9yIGFub3RoZXIKKyAgICAgKiByZWFzb24uCisgICAgICovCisgICAgaWYgKCFkdXBsaWNhdGVkTGF5ZXJOYW1lLmlzKCI6dmlzaWJsZSIpKQorICAgICAgbGF5ZXJOYW1lQ3RybC5yZW1vdmVDbGFzcygiZXJyb3IiKQorCisgICAgJCgiI2ludmFsaWQtbGF5ZXItbmFtZS1oaW50IikuaGlkZSgpOworICAgIGNoZWNrX2Zvcm0oKTsKKyAgfSk7CisKKyAgLyogSGF2ZSBhIGd1ZXNzIGF0IHRoZSBsYXllciBuYW1lICovCisgIHZjc1VSTElucHV0LmZvY3Vzb3V0KGZ1bmN0aW9uICgpeworICAgIC8qIElmIHdlIGEgbGF5ZXIgbmFtZSBzcGVjaWZpZWQgZG9uJ3Qgb3ZlcndyaXRlIGl0IG9yIGlmIHRoZXJlIGlzbid0IGEKKyAgICAgKiB1cmwgdHlwZWQgaW4geWV0IHJldHVybgorICAgICAqLworICAgIGlmIChsYXllck5hbWVJbnB1dC52YWwoKSB8fCAhJCh0aGlzKS52YWwoKSkKKyAgICAgIHJldHVybjsKKworICAgIGlmICgkKHRoaXMpLnZhbCgpLnNlYXJjaCgiLyIpKXsKKyAgICAgIHZhciB1cmxQdHMgPSAkKHRoaXMpLnZhbCgpLnNwbGl0KCIvIik7CisgICAgICB2YXIgc3VnZ2VzdGlvbiA9IHVybFB0c1t1cmxQdHMubGVuZ3RoLTFdLnJlcGxhY2UoIi5naXQiLCIiKTsKKyAgICAgIGxheWVyTmFtZUlucHV0LnZhbChzdWdnZXN0aW9uKTsKKyAgICB9CisgIH0pOworCit9CmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2pzL2pxdWVyeS0yLjAuMy5taW4uanMgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2pzL2pxdWVyeS0yLjAuMy5taW4uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJlMjA5ZAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvanMvanF1ZXJ5LTIuMC4zLm1pbi5qcwpAQCAtMCwwICsxLDYgQEAKKy8qISBqUXVlcnkgdjIuMC4zIHwgKGMpIDIwMDUsIDIwMTMgalF1ZXJ5IEZvdW5kYXRpb24sIEluYy4gfCBqcXVlcnkub3JnL2xpY2Vuc2UKKy8vQCBzb3VyY2VNYXBwaW5nVVJMPWpxdWVyeS0yLjAuMy5taW4ubWFwCisqLworKGZ1bmN0aW9uKGUsdW5kZWZpbmVkKXt2YXIgdCxuLHI9dHlwZW9mIHVuZGVmaW5lZCxpPWUubG9jYXRpb24sbz1lLmRvY3VtZW50LHM9by5kb2N1bWVudEVsZW1lbnQsYT1lLmpRdWVyeSx1PWUuJCxsPXt9LGM9W10scD0iMi4wLjMiLGY9Yy5jb25jYXQsaD1jLnB1c2gsZD1jLnNsaWNlLGc9Yy5pbmRleE9mLG09bC50b1N0cmluZyx5PWwuaGFzT3duUHJvcGVydHksdj1wLnRyaW0seD1mdW5jdGlvbihlLG4pe3JldHVybiBuZXcgeC5mbi5pbml0KGUsbix0KX0sYj0vWystXT8oPzpcZCpcLnwpXGQrKD86W2VFXVsrLV0/XGQrfCkvLnNvdXJjZSx3PS9cUysvZyxUPS9eKD86XHMqKDxbXHdcV10rPilbXj5dKnwjKFtcdy1dKikpJC8sQz0vXjwoXHcrKVxzKlwvPz4oPzo8XC9cMT58KSQvLGs9L14tbXMtLyxOPS8tKFtcZGEtel0pL2dpLEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC50b1VwcGVyQ2FzZSgpfSxTPWZ1bmN0aW9uKCl7by5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixTLCExKSxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLFMsITEpLHgucmVhZHkoKX07eC5mbj14LnByb3RvdHlwZT17anF1ZXJ5OnAsY29uc3RydWN0b3I6eCxpbml0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpO2lmKCFlKXJldHVybiB0aGlzO2lmKCJzdHJpbmciPT10eXBlb2YgZSl7aWYocj0iPCI9PT1lLmNoYXJBdCgwKSYmIj4iPT09ZS5jaGFyQXQoZS5sZW5ndGgtMSkmJmUubGVuZ3RoPj0zP1tudWxsLGUsbnVsbF06VC5leGVjKGUpLCFyfHwhclsxXSYmdClyZXR1cm4hdHx8dC5qcXVlcnk/KHR8fG4pLmZpbmQoZSk6dGhpcy5jb25zdHJ1Y3Rvcih0KS5maW5kKGUpO2lmKHJbMV0pe2lmKHQ9dCBpbnN0YW5jZW9mIHg/dFswXTp0LHgubWVyZ2UodGhpcyx4LnBhcnNlSFRNTChyWzFdLHQmJnQubm9kZVR5cGU/dC5vd25lckRvY3VtZW50fHx0Om8sITApKSxDLnRlc3QoclsxXSkmJnguaXNQbGFpbk9iamVjdCh0KSlmb3IociBpbiB0KXguaXNGdW5jdGlvbih0aGlzW3JdKT90aGlzW3JdKHRbcl0pOnRoaXMuYXR0cihyLHRbcl0pO3JldHVybiB0aGlzfXJldHVybiBpPW8uZ2V0RWxlbWVudEJ5SWQoclsyXSksaSYmaS5wYXJlbnROb2RlJiYodGhpcy5sZW5ndGg9MSx0aGlzWzBdPWkpLHRoaXMuY29udGV4dD1vLHRoaXMuc2VsZWN0b3I9ZSx0aGlzfXJldHVybiBlLm5vZGVUeXBlPyh0aGlzLmNvbnRleHQ9dGhpc1swXT1lLHRoaXMubGVuZ3RoPTEsdGhpcyk6eC5pc0Z1bmN0aW9uKGUpP24ucmVhZHkoZSk6KGUuc2VsZWN0b3IhPT11bmRlZmluZWQmJih0aGlzLnNlbGVjdG9yPWUuc2VsZWN0b3IsdGhpcy5jb250ZXh0PWUuY29udGV4dCkseC5tYWtlQXJyYXkoZSx0aGlzKSl9LHNlbGVjdG9yOiIiLGxlbmd0aDowLHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gZC5jYWxsKHRoaXMpfSxnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/dGhpcy50b0FycmF5KCk6MD5lP3RoaXNbdGhpcy5sZW5ndGgrZV06dGhpc1tlXX0scHVzaFN0YWNrOmZ1bmN0aW9uKGUpe3ZhciB0PXgubWVyZ2UodGhpcy5jb25zdHJ1Y3RvcigpLGUpO3JldHVybiB0LnByZXZPYmplY3Q9dGhpcyx0LmNvbnRleHQ9dGhpcy5jb250ZXh0LHR9LGVhY2g6ZnVuY3Rpb24oZSx0KXtyZXR1cm4geC5lYWNoKHRoaXMsZSx0KX0scmVhZHk6ZnVuY3Rpb24oZSl7cmV0dXJuIHgucmVhZHkucHJvbWlzZSgpLmRvbmUoZSksdGhpc30sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZC5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxlcTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmxlbmd0aCxuPStlKygwPmU/dDowKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobj49MCYmdD5uP1t0aGlzW25dXTpbXSl9LG1hcDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soeC5tYXAodGhpcyxmdW5jdGlvbih0LG4pe3JldHVybiBlLmNhbGwodCxuLHQpfSkpfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKG51bGwpfSxwdXNoOmgsc29ydDpbXS5zb3J0LHNwbGljZTpbXS5zcGxpY2V9LHguZm4uaW5pdC5wcm90b3R5cGU9eC5mbix4LmV4dGVuZD14LmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciBlLHQsbixyLGksbyxzPWFyZ3VtZW50c1swXXx8e30sYT0xLHU9YXJndW1lbnRzLmxlbmd0aCxsPSExO2ZvcigiYm9vbGVhbiI9PXR5cGVvZiBzJiYobD1zLHM9YXJndW1lbnRzWzFdfHx7fSxhPTIpLCJvYmplY3QiPT10eXBlb2Ygc3x8eC5pc0Z1bmN0aW9uKHMpfHwocz17fSksdT09PWEmJihzPXRoaXMsLS1hKTt1PmE7YSsrKWlmKG51bGwhPShlPWFyZ3VtZW50c1thXSkpZm9yKHQgaW4gZSluPXNbdF0scj1lW3RdLHMhPT1yJiYobCYmciYmKHguaXNQbGFpbk9iamVjdChyKXx8KGk9eC5pc0FycmF5KHIpKSk/KGk/KGk9ITEsbz1uJiZ4LmlzQXJyYXkobik/bjpbXSk6bz1uJiZ4LmlzUGxhaW5PYmplY3Qobik/bjp7fSxzW3RdPXguZXh0ZW5kKGwsbyxyKSk6ciE9PXVuZGVmaW5lZCYmKHNbdF09cikpO3JldHVybiBzfSx4LmV4dGVuZCh7ZXhwYW5kbzoialF1ZXJ5IisocCtNYXRoLnJhbmRvbSgpKS5yZXBsYWNlKC9cRC9nLCIiKSxub0NvbmZsaWN0OmZ1bmN0aW9uKHQpe3JldHVybiBlLiQ9PT14JiYoZS4kPXUpLHQmJmUualF1ZXJ5PT09eCYmKGUualF1ZXJ5PWEpLHh9LGlzUmVhZHk6ITEscmVhZHlXYWl0OjEsaG9sZFJlYWR5OmZ1bmN0aW9uKGUpe2U/eC5yZWFkeVdhaXQrKzp4LnJlYWR5KCEwKX0scmVhZHk6ZnVuY3Rpb24oZSl7KGU9PT0hMD8tLXgucmVhZHlXYWl0OnguaXNSZWFkeSl8fCh4LmlzUmVhZHk9ITAsZSE9PSEwJiYtLXgucmVhZHlXYWl0PjB8fChuLnJlc29sdmVXaXRoKG8sW3hdKSx4LmZuLnRyaWdnZXImJngobykudHJpZ2dlcigicmVhZHkiKS5vZmYoInJlYWR5IikpKX0saXNGdW5jdGlvbjpmdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24iPT09eC50eXBlKGUpfSxpc0FycmF5OkFycmF5LmlzQXJyYXksaXNXaW5kb3c6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWUmJmU9PT1lLndpbmRvd30saXNOdW1lcmljOmZ1bmN0aW9uKGUpe3JldHVybiFpc05hTihwYXJzZUZsb2F0KGUpKSYmaXNGaW5pdGUoZSl9LHR5cGU6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/ZSsiIjoib2JqZWN0Ij09dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlP2xbbS5jYWxsKGUpXXx8Im9iamVjdCI6dHlwZW9mIGV9LGlzUGxhaW5PYmplY3Q6ZnVuY3Rpb24oZSl7aWYoIm9iamVjdCIhPT14LnR5cGUoZSl8fGUubm9kZVR5cGV8fHguaXNXaW5kb3coZSkpcmV0dXJuITE7dHJ5e2lmKGUuY29uc3RydWN0b3ImJiF5LmNhbGwoZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsImlzUHJvdG90eXBlT2YiKSlyZXR1cm4hMX1jYXRjaCh0KXtyZXR1cm4hMX1yZXR1cm4hMH0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihlKXt2YXIgdDtmb3IodCBpbiBlKXJldHVybiExO3JldHVybiEwfSxlcnJvcjpmdW5jdGlvbihlKXt0aHJvdyBFcnJvcihlKX0scGFyc2VIVE1MOmZ1bmN0aW9uKGUsdCxuKXtpZighZXx8InN0cmluZyIhPXR5cGVvZiBlKXJldHVybiBudWxsOyJib29sZWFuIj09dHlwZW9mIHQmJihuPXQsdD0hMSksdD10fHxvO3ZhciByPUMuZXhlYyhlKSxpPSFuJiZbXTtyZXR1cm4gcj9bdC5jcmVhdGVFbGVtZW50KHJbMV0pXToocj14LmJ1aWxkRnJhZ21lbnQoW2VdLHQsaSksaSYmeChpKS5yZW1vdmUoKSx4Lm1lcmdlKFtdLHIuY2hpbGROb2RlcykpfSxwYXJzZUpTT046SlNPTi5wYXJzZSxwYXJzZVhNTDpmdW5jdGlvbihlKXt2YXIgdCxuO2lmKCFlfHwic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuIG51bGw7dHJ5e249bmV3IERPTVBhcnNlcix0PW4ucGFyc2VGcm9tU3RyaW5nKGUsInRleHQveG1sIil9Y2F0Y2gocil7dD11bmRlZmluZWR9cmV0dXJuKCF0fHx0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aCkmJnguZXJyb3IoIkludmFsaWQgWE1MOiAiK2UpLHR9LG5vb3A6ZnVuY3Rpb24oKXt9LGdsb2JhbEV2YWw6ZnVuY3Rpb24oZSl7dmFyIHQsbj1ldmFsO2U9eC50cmltKGUpLGUmJigxPT09ZS5pbmRleE9mKCJ1c2Ugc3RyaWN0Iik/KHQ9by5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSx0LnRleHQ9ZSxvLmhlYWQuYXBwZW5kQ2hpbGQodCkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSk6bihlKSl9LGNhbWVsQ2FzZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKGssIm1zLSIpLnJlcGxhY2UoTixFKX0sbm9kZU5hbWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09dC50b0xvd2VyQ2FzZSgpfSxlYWNoOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPTAsbz1lLmxlbmd0aCxzPWooZSk7aWYobil7aWYocyl7Zm9yKDtvPmk7aSsrKWlmKHI9dC5hcHBseShlW2ldLG4pLHI9PT0hMSlicmVha31lbHNlIGZvcihpIGluIGUpaWYocj10LmFwcGx5KGVbaV0sbikscj09PSExKWJyZWFrfWVsc2UgaWYocyl7Zm9yKDtvPmk7aSsrKWlmKHI9dC5jYWxsKGVbaV0saSxlW2ldKSxyPT09ITEpYnJlYWt9ZWxzZSBmb3IoaSBpbiBlKWlmKHI9dC5jYWxsKGVbaV0saSxlW2ldKSxyPT09ITEpYnJlYWs7cmV0dXJuIGV9LHRyaW06ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/IiI6di5jYWxsKGUpfSxtYWtlQXJyYXk6ZnVuY3Rpb24oZSx0KXt2YXIgbj10fHxbXTtyZXR1cm4gbnVsbCE9ZSYmKGooT2JqZWN0KGUpKT94Lm1lcmdlKG4sInN0cmluZyI9PXR5cGVvZiBlP1tlXTplKTpoLmNhbGwobixlKSksbn0saW5BcnJheTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIG51bGw9PXQ/LTE6Zy5jYWxsKHQsZSxuKX0sbWVyZ2U6ZnVuY3Rpb24oZSx0KXt2YXIgbj10Lmxlbmd0aCxyPWUubGVuZ3RoLGk9MDtpZigibnVtYmVyIj09dHlwZW9mIG4pZm9yKDtuPmk7aSsrKWVbcisrXT10W2ldO2Vsc2Ugd2hpbGUodFtpXSE9PXVuZGVmaW5lZCllW3IrK109dFtpKytdO3JldHVybiBlLmxlbmd0aD1yLGV9LGdyZXA6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGk9W10sbz0wLHM9ZS5sZW5ndGg7Zm9yKG49ISFuO3M+bztvKyspcj0hIXQoZVtvXSxvKSxuIT09ciYmaS5wdXNoKGVbb10pO3JldHVybiBpfSxtYXA6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGk9MCxvPWUubGVuZ3RoLHM9aihlKSxhPVtdO2lmKHMpZm9yKDtvPmk7aSsrKXI9dChlW2ldLGksbiksbnVsbCE9ciYmKGFbYS5sZW5ndGhdPXIpO2Vsc2UgZm9yKGkgaW4gZSlyPXQoZVtpXSxpLG4pLG51bGwhPXImJihhW2EubGVuZ3RoXT1yKTtyZXR1cm4gZi5hcHBseShbXSxhKX0sZ3VpZDoxLHByb3h5OmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpO3JldHVybiJzdHJpbmciPT10eXBlb2YgdCYmKG49ZVt0XSx0PWUsZT1uKSx4LmlzRnVuY3Rpb24oZSk/KHI9ZC5jYWxsKGFyZ3VtZW50cywyKSxpPWZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodHx8dGhpcyxyLmNvbmNhdChkLmNhbGwoYXJndW1lbnRzKSkpfSxpLmd1aWQ9ZS5ndWlkPWUuZ3VpZHx8eC5ndWlkKyssaSk6dW5kZWZpbmVkfSxhY2Nlc3M6ZnVuY3Rpb24oZSx0LG4scixpLG8scyl7dmFyIGE9MCx1PWUubGVuZ3RoLGw9bnVsbD09bjtpZigib2JqZWN0Ij09PXgudHlwZShuKSl7aT0hMDtmb3IoYSBpbiBuKXguYWNjZXNzKGUsdCxhLG5bYV0sITAsbyxzKX1lbHNlIGlmKHIhPT11bmRlZmluZWQmJihpPSEwLHguaXNGdW5jdGlvbihyKXx8KHM9ITApLGwmJihzPyh0LmNhbGwoZSxyKSx0PW51bGwpOihsPXQsdD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGwuY2FsbCh4KGUpLG4pfSkpLHQpKWZvcig7dT5hO2ErKyl0KGVbYV0sbixzP3I6ci5jYWxsKGVbYV0sYSx0KGVbYV0sbikpKTtyZXR1cm4gaT9lOmw/dC5jYWxsKGUpOnU/dChlWzBdLG4pOm99LG5vdzpEYXRlLm5vdyxzd2FwOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8scz17fTtmb3IobyBpbiB0KXNbb109ZS5zdHlsZVtvXSxlLnN0eWxlW29dPXRbb107aT1uLmFwcGx5KGUscnx8W10pO2ZvcihvIGluIHQpZS5zdHlsZVtvXT1zW29dO3JldHVybiBpfX0pLHgucmVhZHkucHJvbWlzZT1mdW5jdGlvbih0KXtyZXR1cm4gbnx8KG49eC5EZWZlcnJlZCgpLCJjb21wbGV0ZSI9PT1vLnJlYWR5U3RhdGU/c2V0VGltZW91dCh4LnJlYWR5KTooby5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixTLCExKSxlLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLFMsITEpKSksbi5wcm9taXNlKHQpfSx4LmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IiLnNwbGl0KCIgIiksZnVuY3Rpb24oZSx0KXtsWyJbb2JqZWN0ICIrdCsiXSJdPXQudG9Mb3dlckNhc2UoKX0pO2Z1bmN0aW9uIGooZSl7dmFyIHQ9ZS5sZW5ndGgsbj14LnR5cGUoZSk7cmV0dXJuIHguaXNXaW5kb3coZSk/ITE6MT09PWUubm9kZVR5cGUmJnQ/ITA6ImFycmF5Ij09PW58fCJmdW5jdGlvbiIhPT1uJiYoMD09PXR8fCJudW1iZXIiPT10eXBlb2YgdCYmdD4wJiZ0LTEgaW4gZSl9dD14KG8pLGZ1bmN0aW9uKGUsdW5kZWZpbmVkKXt2YXIgdCxuLHIsaSxvLHMsYSx1LGwsYyxwLGYsaCxkLGcsbSx5LHY9InNpenpsZSIrLW5ldyBEYXRlLGI9ZS5kb2N1bWVudCx3PTAsVD0wLEM9c3QoKSxrPXN0KCksTj1zdCgpLEU9ITEsUz1mdW5jdGlvbihlLHQpe3JldHVybiBlPT09dD8oRT0hMCwwKTowfSxqPXR5cGVvZiB1bmRlZmluZWQsRD0xPDwzMSxBPXt9Lmhhc093blByb3BlcnR5LEw9W10scT1MLnBvcCxIPUwucHVzaCxPPUwucHVzaCxGPUwuc2xpY2UsUD1MLmluZGV4T2Z8fGZ1bmN0aW9uKGUpe3ZhciB0PTAsbj10aGlzLmxlbmd0aDtmb3IoO24+dDt0KyspaWYodGhpc1t0XT09PWUpcmV0dXJuIHQ7cmV0dXJuLTF9LFI9ImNoZWNrZWR8c2VsZWN0ZWR8YXN5bmN8YXV0b2ZvY3VzfGF1dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxpc21hcHxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkIixNPSJbXFx4MjBcXHRcXHJcXG5cXGZdIixXPSIoPzpcXFxcLnxbXFx3LV18W15cXHgwMC1cXHhhMF0pKyIsJD1XLnJlcGxhY2UoInciLCJ3IyIpLEI9IlxcWyIrTSsiKigiK1crIikiK00rIiooPzooWypeJHwhfl0/PSkiK00rIiooPzooWydcIl0pKCg/OlxcXFwufFteXFxcXF0pKj8pXFwzfCgiKyQrIil8KXwpIitNKyIqXFxdIixJPSI6KCIrVysiKSg/OlxcKCgoWydcIl0pKCg/OlxcXFwufFteXFxcXF0pKj8pXFwzfCgoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIrQi5yZXBsYWNlKDMsOCkrIikqKXwuKilcXCl8KSIsej1SZWdFeHAoIl4iK00rIit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikqKSIrTSsiKyQiLCJnIiksXz1SZWdFeHAoIl4iK00rIiosIitNKyIqIiksWD1SZWdFeHAoIl4iK00rIiooWz4rfl18IitNKyIpIitNKyIqIiksVT1SZWdFeHAoTSsiKlsrfl0iKSxZPVJlZ0V4cCgiPSIrTSsiKihbXlxcXSdcIl0qKSIrTSsiKlxcXSIsImciKSxWPVJlZ0V4cChJKSxHPVJlZ0V4cCgiXiIrJCsiJCIpLEo9e0lEOlJlZ0V4cCgiXiMoIitXKyIpIiksQ0xBU1M6UmVnRXhwKCJeXFwuKCIrVysiKSIpLFRBRzpSZWdFeHAoIl4oIitXLnJlcGxhY2UoInciLCJ3KiIpKyIpIiksQVRUUjpSZWdFeHAoIl4iK0IpLFBTRVVETzpSZWdFeHAoIl4iK0kpLENISUxEOlJlZ0V4cCgiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIitNKyIqKGV2ZW58b2RkfCgoWystXXwpKFxcZCopbnwpIitNKyIqKD86KFsrLV18KSIrTSsiKihcXGQrKXwpKSIrTSsiKlxcKXwpIiwiaSIpLGJvb2w6UmVnRXhwKCJeKD86IitSKyIpJCIsImkiKSxuZWVkc0NvbnRleHQ6UmVnRXhwKCJeIitNKyIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXCgiK00rIiooKD86LVxcZCk/XFxkKikiK00rIipcXCl8KSg/PVteLV18JCkiLCJpIil9LFE9L15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLEs9L14oPzojKFtcdy1dKyl8KFx3Kyl8XC4oW1x3LV0rKSkkLyxaPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksZXQ9L15oXGQkL2ksdHQ9Lyd8XFwvZyxudD1SZWdFeHAoIlxcXFwoW1xcZGEtZl17MSw2fSIrTSsiP3woIitNKyIpfC4pIiwiaWciKSxydD1mdW5jdGlvbihlLHQsbil7dmFyIHI9IjB4Iit0LTY1NTM2O3JldHVybiByIT09cnx8bj90OjA+cj9TdHJpbmcuZnJvbUNoYXJDb2RlKHIrNjU1MzYpOlN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8cj4+MTAsNTYzMjB8MTAyMyZyKX07dHJ5e08uYXBwbHkoTD1GLmNhbGwoYi5jaGlsZE5vZGVzKSxiLmNoaWxkTm9kZXMpLExbYi5jaGlsZE5vZGVzLmxlbmd0aF0ubm9kZVR5cGV9Y2F0Y2goaXQpe089e2FwcGx5OkwubGVuZ3RoP2Z1bmN0aW9uKGUsdCl7SC5hcHBseShlLEYuY2FsbCh0KSl9OmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5sZW5ndGgscj0wO3doaWxlKGVbbisrXT10W3IrK10pO2UubGVuZ3RoPW4tMX19fWZ1bmN0aW9uIG90KGUsdCxyLGkpe3ZhciBvLHMsYSx1LGwsZixnLG0seCx3O2lmKCh0P3Qub3duZXJEb2N1bWVudHx8dDpiKSE9PXAmJmModCksdD10fHxwLHI9cnx8W10sIWV8fCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gcjtpZigxIT09KHU9dC5ub2RlVHlwZSkmJjkhPT11KXJldHVybltdO2lmKGgmJiFpKXtpZihvPUsuZXhlYyhlKSlpZihhPW9bMV0pe2lmKDk9PT11KXtpZihzPXQuZ2V0RWxlbWVudEJ5SWQoYSksIXN8fCFzLnBhcmVudE5vZGUpcmV0dXJuIHI7aWYocy5pZD09PWEpcmV0dXJuIHIucHVzaChzKSxyfWVsc2UgaWYodC5vd25lckRvY3VtZW50JiYocz10Lm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSkpJiZ5KHQscykmJnMuaWQ9PT1hKXJldHVybiByLnB1c2gocykscn1lbHNle2lmKG9bMl0pcmV0dXJuIE8uYXBwbHkocix0LmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpKSxyO2lmKChhPW9bM10pJiZuLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSlyZXR1cm4gTy5hcHBseShyLHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShhKSkscn1pZihuLnFzYSYmKCFkfHwhZC50ZXN0KGUpKSl7aWYobT1nPXYseD10LHc9OT09PXUmJmUsMT09PXUmJiJvYmplY3QiIT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXtmPWd0KGUpLChnPXQuZ2V0QXR0cmlidXRlKCJpZCIpKT9tPWcucmVwbGFjZSh0dCwiXFwkJiIpOnQuc2V0QXR0cmlidXRlKCJpZCIsbSksbT0iW2lkPSciK20rIiddICIsbD1mLmxlbmd0aDt3aGlsZShsLS0pZltsXT1tK210KGZbbF0pO3g9VS50ZXN0KGUpJiZ0LnBhcmVudE5vZGV8fHQsdz1mLmpvaW4oIiwiKX1pZih3KXRyeXtyZXR1cm4gTy5hcHBseShyLHgucXVlcnlTZWxlY3RvckFsbCh3KSkscn1jYXRjaChUKXt9ZmluYWxseXtnfHx0LnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX19fXJldHVybiBrdChlLnJlcGxhY2UoeiwiJDEiKSx0LHIsaSl9ZnVuY3Rpb24gc3QoKXt2YXIgZT1bXTtmdW5jdGlvbiB0KG4scil7cmV0dXJuIGUucHVzaChuKz0iICIpPmkuY2FjaGVMZW5ndGgmJmRlbGV0ZSB0W2Uuc2hpZnQoKV0sdFtuXT1yfXJldHVybiB0fWZ1bmN0aW9uIGF0KGUpe3JldHVybiBlW3ZdPSEwLGV9ZnVuY3Rpb24gdXQoZSl7dmFyIHQ9cC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0cnl7cmV0dXJuISFlKHQpfWNhdGNoKG4pe3JldHVybiExfWZpbmFsbHl7dC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCksdD1udWxsfX1mdW5jdGlvbiBsdChlLHQpe3ZhciBuPWUuc3BsaXQoInwiKSxyPWUubGVuZ3RoO3doaWxlKHItLSlpLmF0dHJIYW5kbGVbbltyXV09dH1mdW5jdGlvbiBjdChlLHQpe3ZhciBuPXQmJmUscj1uJiYxPT09ZS5ub2RlVHlwZSYmMT09PXQubm9kZVR5cGUmJih+dC5zb3VyY2VJbmRleHx8RCktKH5lLnNvdXJjZUluZGV4fHxEKTtpZihyKXJldHVybiByO2lmKG4pd2hpbGUobj1uLm5leHRTaWJsaW5nKWlmKG49PT10KXJldHVybi0xO3JldHVybiBlPzE6LTF9ZnVuY3Rpb24gcHQoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09biYmdC50eXBlPT09ZX19ZnVuY3Rpb24gZnQoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oImlucHV0Ij09PW58fCJidXR0b24iPT09bikmJnQudHlwZT09PWV9fWZ1bmN0aW9uIGh0KGUpe3JldHVybiBhdChmdW5jdGlvbih0KXtyZXR1cm4gdD0rdCxhdChmdW5jdGlvbihuLHIpe3ZhciBpLG89ZShbXSxuLmxlbmd0aCx0KSxzPW8ubGVuZ3RoO3doaWxlKHMtLSluW2k9b1tzXV0mJihuW2ldPSEocltpXT1uW2ldKSl9KX0pfXM9b3QuaXNYTUw9ZnVuY3Rpb24oZSl7dmFyIHQ9ZSYmKGUub3duZXJEb2N1bWVudHx8ZSkuZG9jdW1lbnRFbGVtZW50O3JldHVybiB0PyJIVE1MIiE9PXQubm9kZU5hbWU6ITF9LG49b3Quc3VwcG9ydD17fSxjPW90LnNldERvY3VtZW50PWZ1bmN0aW9uKGUpe3ZhciB0PWU/ZS5vd25lckRvY3VtZW50fHxlOmIscj10LmRlZmF1bHRWaWV3O3JldHVybiB0IT09cCYmOT09PXQubm9kZVR5cGUmJnQuZG9jdW1lbnRFbGVtZW50PyhwPXQsZj10LmRvY3VtZW50RWxlbWVudCxoPSFzKHQpLHImJnIuYXR0YWNoRXZlbnQmJnIhPT1yLnRvcCYmci5hdHRhY2hFdmVudCgib25iZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7YygpfSksbi5hdHRyaWJ1dGVzPXV0KGZ1bmN0aW9uKGUpe3JldHVybiBlLmNsYXNzTmFtZT0iaSIsIWUuZ2V0QXR0cmlidXRlKCJjbGFzc05hbWUiKX0pLG4uZ2V0RWxlbWVudHNCeVRhZ05hbWU9dXQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuYXBwZW5kQ2hpbGQodC5jcmVhdGVDb21tZW50KCIiKSksIWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGh9KSxuLmdldEVsZW1lbnRzQnlDbGFzc05hbWU9dXQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5uZXJIVE1MPSI8ZGl2IGNsYXNzPSdhJz48L2Rpdj48ZGl2IGNsYXNzPSdhIGknPjwvZGl2PiIsZS5maXJzdENoaWxkLmNsYXNzTmFtZT0iaSIsMj09PWUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiaSIpLmxlbmd0aH0pLG4uZ2V0QnlJZD11dChmdW5jdGlvbihlKXtyZXR1cm4gZi5hcHBlbmRDaGlsZChlKS5pZD12LCF0LmdldEVsZW1lbnRzQnlOYW1lfHwhdC5nZXRFbGVtZW50c0J5TmFtZSh2KS5sZW5ndGh9KSxuLmdldEJ5SWQ/KGkuZmluZC5JRD1mdW5jdGlvbihlLHQpe2lmKHR5cGVvZiB0LmdldEVsZW1lbnRCeUlkIT09aiYmaCl7dmFyIG49dC5nZXRFbGVtZW50QnlJZChlKTtyZXR1cm4gbiYmbi5wYXJlbnROb2RlP1tuXTpbXX19LGkuZmlsdGVyLklEPWZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZShudCxydCk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSgiaWQiKT09PXR9fSk6KGRlbGV0ZSBpLmZpbmQuSUQsaS5maWx0ZXIuSUQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKG50LHJ0KTtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49dHlwZW9mIGUuZ2V0QXR0cmlidXRlTm9kZSE9PWomJmUuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gbiYmbi52YWx1ZT09PXR9fSksaS5maW5kLlRBRz1uLmdldEVsZW1lbnRzQnlUYWdOYW1lP2Z1bmN0aW9uKGUsdCl7cmV0dXJuIHR5cGVvZiB0LmdldEVsZW1lbnRzQnlUYWdOYW1lIT09aj90LmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpOnVuZGVmaW5lZH06ZnVuY3Rpb24oZSx0KXt2YXIgbixyPVtdLGk9MCxvPXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk7aWYoIioiPT09ZSl7d2hpbGUobj1vW2krK10pMT09PW4ubm9kZVR5cGUmJnIucHVzaChuKTtyZXR1cm4gcn1yZXR1cm4gb30saS5maW5kLkNMQVNTPW4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHlwZW9mIHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSE9PWomJmg/dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGUpOnVuZGVmaW5lZH0sZz1bXSxkPVtdLChuLnFzYT1RLnRlc3QodC5xdWVyeVNlbGVjdG9yQWxsKSkmJih1dChmdW5jdGlvbihlKXtlLmlubmVySFRNTD0iPHNlbGVjdD48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiIsZS5xdWVyeVNlbGVjdG9yQWxsKCJbc2VsZWN0ZWRdIikubGVuZ3RofHxkLnB1c2goIlxcWyIrTSsiKig/OnZhbHVlfCIrUisiKSIpLGUucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fGQucHVzaCgiOmNoZWNrZWQiKX0pLHV0KGZ1bmN0aW9uKGUpe3ZhciBuPXQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtuLnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLGUuYXBwZW5kQ2hpbGQobikuc2V0QXR0cmlidXRlKCJ0IiwiIiksZS5xdWVyeVNlbGVjdG9yQWxsKCJbdF49JyddIikubGVuZ3RoJiZkLnB1c2goIlsqXiRdPSIrTSsiKig/OicnfFwiXCIpIiksZS5xdWVyeVNlbGVjdG9yQWxsKCI6ZW5hYmxlZCIpLmxlbmd0aHx8ZC5wdXNoKCI6ZW5hYmxlZCIsIjpkaXNhYmxlZCIpLGUucXVlcnlTZWxlY3RvckFsbCgiKiw6eCIpLGQucHVzaCgiLC4qOiIpfSkpLChuLm1hdGNoZXNTZWxlY3Rvcj1RLnRlc3QobT1mLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8Zi5tb3pNYXRjaGVzU2VsZWN0b3J8fGYub01hdGNoZXNTZWxlY3Rvcnx8Zi5tc01hdGNoZXNTZWxlY3RvcikpJiZ1dChmdW5jdGlvbihlKXtuLmRpc2Nvbm5lY3RlZE1hdGNoPW0uY2FsbChlLCJkaXYiKSxtLmNhbGwoZSwiW3MhPScnXTp4IiksZy5wdXNoKCIhPSIsSSl9KSxkPWQubGVuZ3RoJiZSZWdFeHAoZC5qb2luKCJ8IikpLGc9Zy5sZW5ndGgmJlJlZ0V4cChnLmpvaW4oInwiKSkseT1RLnRlc3QoZi5jb250YWlucyl8fGYuY29tcGFyZURvY3VtZW50UG9zaXRpb24/ZnVuY3Rpb24oZSx0KXt2YXIgbj05PT09ZS5ub2RlVHlwZT9lLmRvY3VtZW50RWxlbWVudDplLHI9dCYmdC5wYXJlbnROb2RlO3JldHVybiBlPT09cnx8ISghcnx8MSE9PXIubm9kZVR5cGV8fCEobi5jb250YWlucz9uLmNvbnRhaW5zKHIpOmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24ocikpKX06ZnVuY3Rpb24oZSx0KXtpZih0KXdoaWxlKHQ9dC5wYXJlbnROb2RlKWlmKHQ9PT1lKXJldHVybiEwO3JldHVybiExfSxTPWYuY29tcGFyZURvY3VtZW50UG9zaXRpb24/ZnVuY3Rpb24oZSxyKXtpZihlPT09cilyZXR1cm4gRT0hMCwwO3ZhciBpPXIuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24ocik7cmV0dXJuIGk/MSZpfHwhbi5zb3J0RGV0YWNoZWQmJnIuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZSk9PT1pP2U9PT10fHx5KGIsZSk/LTE6cj09PXR8fHkoYixyKT8xOmw/UC5jYWxsKGwsZSktUC5jYWxsKGwscik6MDo0Jmk/LTE6MTplLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uPy0xOjF9OmZ1bmN0aW9uKGUsbil7dmFyIHIsaT0wLG89ZS5wYXJlbnROb2RlLHM9bi5wYXJlbnROb2RlLGE9W2VdLHU9W25dO2lmKGU9PT1uKXJldHVybiBFPSEwLDA7aWYoIW98fCFzKXJldHVybiBlPT09dD8tMTpuPT09dD8xOm8/LTE6cz8xOmw/UC5jYWxsKGwsZSktUC5jYWxsKGwsbik6MDtpZihvPT09cylyZXR1cm4gY3QoZSxuKTtyPWU7d2hpbGUocj1yLnBhcmVudE5vZGUpYS51bnNoaWZ0KHIpO3I9bjt3aGlsZShyPXIucGFyZW50Tm9kZSl1LnVuc2hpZnQocik7d2hpbGUoYVtpXT09PXVbaV0paSsrO3JldHVybiBpP2N0KGFbaV0sdVtpXSk6YVtpXT09PWI/LTE6dVtpXT09PWI/MTowfSx0KTpwfSxvdC5tYXRjaGVzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG90KGUsbnVsbCxudWxsLHQpfSxvdC5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oZSx0KXtpZigoZS5vd25lckRvY3VtZW50fHxlKSE9PXAmJmMoZSksdD10LnJlcGxhY2UoWSwiPSckMSddIiksISghbi5tYXRjaGVzU2VsZWN0b3J8fCFofHxnJiZnLnRlc3QodCl8fGQmJmQudGVzdCh0KSkpdHJ5e3ZhciByPW0uY2FsbChlLHQpO2lmKHJ8fG4uZGlzY29ubmVjdGVkTWF0Y2h8fGUuZG9jdW1lbnQmJjExIT09ZS5kb2N1bWVudC5ub2RlVHlwZSlyZXR1cm4gcn1jYXRjaChpKXt9cmV0dXJuIG90KHQscCxudWxsLFtlXSkubGVuZ3RoPjB9LG90LmNvbnRhaW5zPWZ1bmN0aW9uKGUsdCl7cmV0dXJuKGUub3duZXJEb2N1bWVudHx8ZSkhPT1wJiZjKGUpLHkoZSx0KX0sb3QuYXR0cj1mdW5jdGlvbihlLHQpeyhlLm93bmVyRG9jdW1lbnR8fGUpIT09cCYmYyhlKTt2YXIgcj1pLmF0dHJIYW5kbGVbdC50b0xvd2VyQ2FzZSgpXSxvPXImJkEuY2FsbChpLmF0dHJIYW5kbGUsdC50b0xvd2VyQ2FzZSgpKT9yKGUsdCwhaCk6dW5kZWZpbmVkO3JldHVybiBvPT09dW5kZWZpbmVkP24uYXR0cmlidXRlc3x8IWg/ZS5nZXRBdHRyaWJ1dGUodCk6KG89ZS5nZXRBdHRyaWJ1dGVOb2RlKHQpKSYmby5zcGVjaWZpZWQ/by52YWx1ZTpudWxsOm99LG90LmVycm9yPWZ1bmN0aW9uKGUpe3Rocm93IEVycm9yKCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2UpfSxvdC51bmlxdWVTb3J0PWZ1bmN0aW9uKGUpe3ZhciB0LHI9W10saT0wLG89MDtpZihFPSFuLmRldGVjdER1cGxpY2F0ZXMsbD0hbi5zb3J0U3RhYmxlJiZlLnNsaWNlKDApLGUuc29ydChTKSxFKXt3aGlsZSh0PWVbbysrXSl0PT09ZVtvXSYmKGk9ci5wdXNoKG8pKTt3aGlsZShpLS0pZS5zcGxpY2UocltpXSwxKX1yZXR1cm4gZX0sbz1vdC5nZXRUZXh0PWZ1bmN0aW9uKGUpe3ZhciB0LG49IiIscj0wLGk9ZS5ub2RlVHlwZTtpZihpKXtpZigxPT09aXx8OT09PWl8fDExPT09aSl7aWYoInN0cmluZyI9PXR5cGVvZiBlLnRleHRDb250ZW50KXJldHVybiBlLnRleHRDb250ZW50O2ZvcihlPWUuZmlyc3RDaGlsZDtlO2U9ZS5uZXh0U2libGluZyluKz1vKGUpfWVsc2UgaWYoMz09PWl8fDQ9PT1pKXJldHVybiBlLm5vZGVWYWx1ZX1lbHNlIGZvcig7dD1lW3JdO3IrKyluKz1vKHQpO3JldHVybiBufSxpPW90LnNlbGVjdG9ycz17Y2FjaGVMZW5ndGg6NTAsY3JlYXRlUHNldWRvOmF0LG1hdGNoOkosYXR0ckhhbmRsZTp7fSxmaW5kOnt9LHJlbGF0aXZlOnsiPiI6e2RpcjoicGFyZW50Tm9kZSIsZmlyc3Q6ITB9LCIgIjp7ZGlyOiJwYXJlbnROb2RlIn0sIisiOntkaXI6InByZXZpb3VzU2libGluZyIsZmlyc3Q6ITB9LCJ+Ijp7ZGlyOiJwcmV2aW91c1NpYmxpbmcifX0scHJlRmlsdGVyOntBVFRSOmZ1bmN0aW9uKGUpe3JldHVybiBlWzFdPWVbMV0ucmVwbGFjZShudCxydCksZVszXT0oZVs0XXx8ZVs1XXx8IiIpLnJlcGxhY2UobnQscnQpLCJ+PSI9PT1lWzJdJiYoZVszXT0iICIrZVszXSsiICIpLGUuc2xpY2UoMCw0KX0sQ0hJTEQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV09ZVsxXS50b0xvd2VyQ2FzZSgpLCJudGgiPT09ZVsxXS5zbGljZSgwLDMpPyhlWzNdfHxvdC5lcnJvcihlWzBdKSxlWzRdPSsoZVs0XT9lWzVdKyhlWzZdfHwxKToyKigiZXZlbiI9PT1lWzNdfHwib2RkIj09PWVbM10pKSxlWzVdPSsoZVs3XStlWzhdfHwib2RkIj09PWVbM10pKTplWzNdJiZvdC5lcnJvcihlWzBdKSxlfSxQU0VVRE86ZnVuY3Rpb24oZSl7dmFyIHQsbj0hZVs1XSYmZVsyXTtyZXR1cm4gSi5DSElMRC50ZXN0KGVbMF0pP251bGw6KGVbM10mJmVbNF0hPT11bmRlZmluZWQ/ZVsyXT1lWzRdOm4mJlYudGVzdChuKSYmKHQ9Z3QobiwhMCkpJiYodD1uLmluZGV4T2YoIikiLG4ubGVuZ3RoLXQpLW4ubGVuZ3RoKSYmKGVbMF09ZVswXS5zbGljZSgwLHQpLGVbMl09bi5zbGljZSgwLHQpKSxlLnNsaWNlKDAsMykpfX0sZmlsdGVyOntUQUc6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKG50LHJ0KS50b0xvd2VyQ2FzZSgpO3JldHVybiIqIj09PWU/ZnVuY3Rpb24oKXtyZXR1cm4hMH06ZnVuY3Rpb24oZSl7cmV0dXJuIGUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXR9fSxDTEFTUzpmdW5jdGlvbihlKXt2YXIgdD1DW2UrIiAiXTtyZXR1cm4gdHx8KHQ9UmVnRXhwKCIoXnwiK00rIikiK2UrIigiK00rInwkKSIpKSYmQyhlLGZ1bmN0aW9uKGUpe3JldHVybiB0LnRlc3QoInN0cmluZyI9PXR5cGVvZiBlLmNsYXNzTmFtZSYmZS5jbGFzc05hbWV8fHR5cGVvZiBlLmdldEF0dHJpYnV0ZSE9PWomJmUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9KX0sQVRUUjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGZ1bmN0aW9uKHIpe3ZhciBpPW90LmF0dHIocixlKTtyZXR1cm4gbnVsbD09aT8iIT0iPT09dDp0PyhpKz0iIiwiPSI9PT10P2k9PT1uOiIhPSI9PT10P2khPT1uOiJePSI9PT10P24mJjA9PT1pLmluZGV4T2Yobik6Iio9Ij09PXQ/biYmaS5pbmRleE9mKG4pPi0xOiIkPSI9PT10P24mJmkuc2xpY2UoLW4ubGVuZ3RoKT09PW46In49Ij09PXQ/KCIgIitpKyIgIikuaW5kZXhPZihuKT4tMToifD0iPT09dD9pPT09bnx8aS5zbGljZSgwLG4ubGVuZ3RoKzEpPT09bisiLSI6ITEpOiEwfX0sQ0hJTEQ6ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbz0ibnRoIiE9PWUuc2xpY2UoMCwzKSxzPSJsYXN0IiE9PWUuc2xpY2UoLTQpLGE9Im9mLXR5cGUiPT09dDtyZXR1cm4gMT09PXImJjA9PT1pP2Z1bmN0aW9uKGUpe3JldHVybiEhZS5wYXJlbnROb2RlfTpmdW5jdGlvbih0LG4sdSl7dmFyIGwsYyxwLGYsaCxkLGc9byE9PXM/Im5leHRTaWJsaW5nIjoicHJldmlvdXNTaWJsaW5nIixtPXQucGFyZW50Tm9kZSx5PWEmJnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSx4PSF1JiYhYTtpZihtKXtpZihvKXt3aGlsZShnKXtwPXQ7d2hpbGUocD1wW2ddKWlmKGE/cC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09eToxPT09cC5ub2RlVHlwZSlyZXR1cm4hMTtkPWc9Im9ubHkiPT09ZSYmIWQmJiJuZXh0U2libGluZyJ9cmV0dXJuITB9aWYoZD1bcz9tLmZpcnN0Q2hpbGQ6bS5sYXN0Q2hpbGRdLHMmJngpe2M9bVt2XXx8KG1bdl09e30pLGw9Y1tlXXx8W10saD1sWzBdPT09dyYmbFsxXSxmPWxbMF09PT13JiZsWzJdLHA9aCYmbS5jaGlsZE5vZGVzW2hdO3doaWxlKHA9KytoJiZwJiZwW2ddfHwoZj1oPTApfHxkLnBvcCgpKWlmKDE9PT1wLm5vZGVUeXBlJiYrK2YmJnA9PT10KXtjW2VdPVt3LGgsZl07YnJlYWt9fWVsc2UgaWYoeCYmKGw9KHRbdl18fCh0W3ZdPXt9KSlbZV0pJiZsWzBdPT09dylmPWxbMV07ZWxzZSB3aGlsZShwPSsraCYmcCYmcFtnXXx8KGY9aD0wKXx8ZC5wb3AoKSlpZigoYT9wLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT15OjE9PT1wLm5vZGVUeXBlKSYmKytmJiYoeCYmKChwW3ZdfHwocFt2XT17fSkpW2VdPVt3LGZdKSxwPT09dCkpYnJlYWs7cmV0dXJuIGYtPWksZj09PXJ8fDA9PT1mJXImJmYvcj49MH19fSxQU0VVRE86ZnVuY3Rpb24oZSx0KXt2YXIgbixyPWkucHNldWRvc1tlXXx8aS5zZXRGaWx0ZXJzW2UudG9Mb3dlckNhc2UoKV18fG90LmVycm9yKCJ1bnN1cHBvcnRlZCBwc2V1ZG86ICIrZSk7cmV0dXJuIHJbdl0/cih0KTpyLmxlbmd0aD4xPyhuPVtlLGUsIiIsdF0saS5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KGUudG9Mb3dlckNhc2UoKSk/YXQoZnVuY3Rpb24oZSxuKXt2YXIgaSxvPXIoZSx0KSxzPW8ubGVuZ3RoO3doaWxlKHMtLSlpPVAuY2FsbChlLG9bc10pLGVbaV09IShuW2ldPW9bc10pfSk6ZnVuY3Rpb24oZSl7cmV0dXJuIHIoZSwwLG4pfSk6cn19LHBzZXVkb3M6e25vdDphdChmdW5jdGlvbihlKXt2YXIgdD1bXSxuPVtdLHI9YShlLnJlcGxhY2UoeiwiJDEiKSk7cmV0dXJuIHJbdl0/YXQoZnVuY3Rpb24oZSx0LG4saSl7dmFyIG8scz1yKGUsbnVsbCxpLFtdKSxhPWUubGVuZ3RoO3doaWxlKGEtLSkobz1zW2FdKSYmKGVbYV09ISh0W2FdPW8pKX0pOmZ1bmN0aW9uKGUsaSxvKXtyZXR1cm4gdFswXT1lLHIodCxudWxsLG8sbiksIW4ucG9wKCl9fSksaGFzOmF0KGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gb3QoZSx0KS5sZW5ndGg+MH19KSxjb250YWluczphdChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuKHQudGV4dENvbnRlbnR8fHQuaW5uZXJUZXh0fHxvKHQpKS5pbmRleE9mKGUpPi0xfX0pLGxhbmc6YXQoZnVuY3Rpb24oZSl7cmV0dXJuIEcudGVzdChlfHwiIil8fG90LmVycm9yKCJ1bnN1cHBvcnRlZCBsYW5nOiAiK2UpLGU9ZS5yZXBsYWNlKG50LHJ0KS50b0xvd2VyQ2FzZSgpLGZ1bmN0aW9uKHQpe3ZhciBuO2RvIGlmKG49aD90Lmxhbmc6dC5nZXRBdHRyaWJ1dGUoInhtbDpsYW5nIil8fHQuZ2V0QXR0cmlidXRlKCJsYW5nIikpcmV0dXJuIG49bi50b0xvd2VyQ2FzZSgpLG49PT1lfHwwPT09bi5pbmRleE9mKGUrIi0iKTt3aGlsZSgodD10LnBhcmVudE5vZGUpJiYxPT09dC5ub2RlVHlwZSk7cmV0dXJuITF9fSksdGFyZ2V0OmZ1bmN0aW9uKHQpe3ZhciBuPWUubG9jYXRpb24mJmUubG9jYXRpb24uaGFzaDtyZXR1cm4gbiYmbi5zbGljZSgxKT09PXQuaWR9LHJvb3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1mfSxmb2N1czpmdW5jdGlvbihlKXtyZXR1cm4gZT09PXAuYWN0aXZlRWxlbWVudCYmKCFwLmhhc0ZvY3VzfHxwLmhhc0ZvY3VzKCkpJiYhIShlLnR5cGV8fGUuaHJlZnx8fmUudGFiSW5kZXgpfSxlbmFibGVkOmZ1bmN0aW9uKGUpe3JldHVybiBlLmRpc2FibGVkPT09ITF9LGRpc2FibGVkOmZ1bmN0aW9uKGUpe3JldHVybiBlLmRpc2FibGVkPT09ITB9LGNoZWNrZWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT10JiYhIWUuY2hlY2tlZHx8Im9wdGlvbiI9PT10JiYhIWUuc2VsZWN0ZWR9LHNlbGVjdGVkOmZ1bmN0aW9uKGUpe3JldHVybiBlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LGUuc2VsZWN0ZWQ9PT0hMH0sZW1wdHk6ZnVuY3Rpb24oZSl7Zm9yKGU9ZS5maXJzdENoaWxkO2U7ZT1lLm5leHRTaWJsaW5nKWlmKGUubm9kZU5hbWU+IkAifHwzPT09ZS5ub2RlVHlwZXx8ND09PWUubm9kZVR5cGUpcmV0dXJuITE7cmV0dXJuITB9LHBhcmVudDpmdW5jdGlvbihlKXtyZXR1cm4haS5wc2V1ZG9zLmVtcHR5KGUpfSxoZWFkZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGV0LnRlc3QoZS5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKGUpe3JldHVybiBaLnRlc3QoZS5ub2RlTmFtZSl9LGJ1dHRvbjpmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PXQmJiJidXR0b24iPT09ZS50eXBlfHwiYnV0dG9uIj09PXR9LHRleHQ6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmInRleHQiPT09ZS50eXBlJiYobnVsbD09KHQ9ZS5nZXRBdHRyaWJ1dGUoInR5cGUiKSl8fHQudG9Mb3dlckNhc2UoKT09PWUudHlwZSl9LGZpcnN0Omh0KGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDpodChmdW5jdGlvbihlLHQpe3JldHVyblt0LTFdfSksZXE6aHQoZnVuY3Rpb24oZSx0LG4pe3JldHVyblswPm4/bit0Om5dfSksZXZlbjpodChmdW5jdGlvbihlLHQpe3ZhciBuPTA7Zm9yKDt0Pm47bis9MillLnB1c2gobik7cmV0dXJuIGV9KSxvZGQ6aHQoZnVuY3Rpb24oZSx0KXt2YXIgbj0xO2Zvcig7dD5uO24rPTIpZS5wdXNoKG4pO3JldHVybiBlfSksbHQ6aHQoZnVuY3Rpb24oZSx0LG4pe3ZhciByPTA+bj9uK3Q6bjtmb3IoOy0tcj49MDspZS5wdXNoKHIpO3JldHVybiBlfSksZ3Q6aHQoZnVuY3Rpb24oZSx0LG4pe3ZhciByPTA+bj9uK3Q6bjtmb3IoO3Q+KytyOyllLnB1c2gocik7cmV0dXJuIGV9KX19LGkucHNldWRvcy5udGg9aS5wc2V1ZG9zLmVxO2Zvcih0IGlue3JhZGlvOiEwLGNoZWNrYm94OiEwLGZpbGU6ITAscGFzc3dvcmQ6ITAsaW1hZ2U6ITB9KWkucHNldWRvc1t0XT1wdCh0KTtmb3IodCBpbntzdWJtaXQ6ITAscmVzZXQ6ITB9KWkucHNldWRvc1t0XT1mdCh0KTtmdW5jdGlvbiBkdCgpe31kdC5wcm90b3R5cGU9aS5maWx0ZXJzPWkucHNldWRvcyxpLnNldEZpbHRlcnM9bmV3IGR0O2Z1bmN0aW9uIGd0KGUsdCl7dmFyIG4scixvLHMsYSx1LGwsYz1rW2UrIiAiXTtpZihjKXJldHVybiB0PzA6Yy5zbGljZSgwKTthPWUsdT1bXSxsPWkucHJlRmlsdGVyO3doaWxlKGEpeyghbnx8KHI9Xy5leGVjKGEpKSkmJihyJiYoYT1hLnNsaWNlKHJbMF0ubGVuZ3RoKXx8YSksdS5wdXNoKG89W10pKSxuPSExLChyPVguZXhlYyhhKSkmJihuPXIuc2hpZnQoKSxvLnB1c2goe3ZhbHVlOm4sdHlwZTpyWzBdLnJlcGxhY2UoeiwiICIpfSksYT1hLnNsaWNlKG4ubGVuZ3RoKSk7Zm9yKHMgaW4gaS5maWx0ZXIpIShyPUpbc10uZXhlYyhhKSl8fGxbc10mJiEocj1sW3NdKHIpKXx8KG49ci5zaGlmdCgpLG8ucHVzaCh7dmFsdWU6bix0eXBlOnMsbWF0Y2hlczpyfSksYT1hLnNsaWNlKG4ubGVuZ3RoKSk7aWYoIW4pYnJlYWt9cmV0dXJuIHQ/YS5sZW5ndGg6YT9vdC5lcnJvcihlKTprKGUsdSkuc2xpY2UoMCl9ZnVuY3Rpb24gbXQoZSl7dmFyIHQ9MCxuPWUubGVuZ3RoLHI9IiI7Zm9yKDtuPnQ7dCsrKXIrPWVbdF0udmFsdWU7cmV0dXJuIHJ9ZnVuY3Rpb24geXQoZSx0LG4pe3ZhciBpPXQuZGlyLG89biYmInBhcmVudE5vZGUiPT09aSxzPVQrKztyZXR1cm4gdC5maXJzdD9mdW5jdGlvbih0LG4scil7d2hpbGUodD10W2ldKWlmKDE9PT10Lm5vZGVUeXBlfHxvKXJldHVybiBlKHQsbixyKX06ZnVuY3Rpb24odCxuLGEpe3ZhciB1LGwsYyxwPXcrIiAiK3M7aWYoYSl7d2hpbGUodD10W2ldKWlmKCgxPT09dC5ub2RlVHlwZXx8bykmJmUodCxuLGEpKXJldHVybiEwfWVsc2Ugd2hpbGUodD10W2ldKWlmKDE9PT10Lm5vZGVUeXBlfHxvKWlmKGM9dFt2XXx8KHRbdl09e30pLChsPWNbaV0pJiZsWzBdPT09cCl7aWYoKHU9bFsxXSk9PT0hMHx8dT09PXIpcmV0dXJuIHU9PT0hMH1lbHNlIGlmKGw9Y1tpXT1bcF0sbFsxXT1lKHQsbixhKXx8cixsWzFdPT09ITApcmV0dXJuITB9fWZ1bmN0aW9uIHZ0KGUpe3JldHVybiBlLmxlbmd0aD4xP2Z1bmN0aW9uKHQsbixyKXt2YXIgaT1lLmxlbmd0aDt3aGlsZShpLS0paWYoIWVbaV0odCxuLHIpKXJldHVybiExO3JldHVybiEwfTplWzBdfWZ1bmN0aW9uIHh0KGUsdCxuLHIsaSl7dmFyIG8scz1bXSxhPTAsdT1lLmxlbmd0aCxsPW51bGwhPXQ7Zm9yKDt1PmE7YSsrKShvPWVbYV0pJiYoIW58fG4obyxyLGkpKSYmKHMucHVzaChvKSxsJiZ0LnB1c2goYSkpO3JldHVybiBzfWZ1bmN0aW9uIGJ0KGUsdCxuLHIsaSxvKXtyZXR1cm4gciYmIXJbdl0mJihyPWJ0KHIpKSxpJiYhaVt2XSYmKGk9YnQoaSxvKSksYXQoZnVuY3Rpb24obyxzLGEsdSl7dmFyIGwsYyxwLGY9W10saD1bXSxkPXMubGVuZ3RoLGc9b3x8Q3QodHx8IioiLGEubm9kZVR5cGU/W2FdOmEsW10pLG09IWV8fCFvJiZ0P2c6eHQoZyxmLGUsYSx1KSx5PW4/aXx8KG8/ZTpkfHxyKT9bXTpzOm07aWYobiYmbihtLHksYSx1KSxyKXtsPXh0KHksaCkscihsLFtdLGEsdSksYz1sLmxlbmd0aDt3aGlsZShjLS0pKHA9bFtjXSkmJih5W2hbY11dPSEobVtoW2NdXT1wKSl9aWYobyl7aWYoaXx8ZSl7aWYoaSl7bD1bXSxjPXkubGVuZ3RoO3doaWxlKGMtLSkocD15W2NdKSYmbC5wdXNoKG1bY109cCk7aShudWxsLHk9W10sbCx1KX1jPXkubGVuZ3RoO3doaWxlKGMtLSkocD15W2NdKSYmKGw9aT9QLmNhbGwobyxwKTpmW2NdKT4tMSYmKG9bbF09IShzW2xdPXApKX19ZWxzZSB5PXh0KHk9PT1zP3kuc3BsaWNlKGQseS5sZW5ndGgpOnkpLGk/aShudWxsLHMseSx1KTpPLmFwcGx5KHMseSl9KX1mdW5jdGlvbiB3dChlKXt2YXIgdCxuLHIsbz1lLmxlbmd0aCxzPWkucmVsYXRpdmVbZVswXS50eXBlXSxhPXN8fGkucmVsYXRpdmVbIiAiXSxsPXM/MTowLGM9eXQoZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10fSxhLCEwKSxwPXl0KGZ1bmN0aW9uKGUpe3JldHVybiBQLmNhbGwodCxlKT4tMX0sYSwhMCksZj1bZnVuY3Rpb24oZSxuLHIpe3JldHVybiFzJiYocnx8biE9PXUpfHwoKHQ9bikubm9kZVR5cGU/YyhlLG4scik6cChlLG4scikpfV07Zm9yKDtvPmw7bCsrKWlmKG49aS5yZWxhdGl2ZVtlW2xdLnR5cGVdKWY9W3l0KHZ0KGYpLG4pXTtlbHNle2lmKG49aS5maWx0ZXJbZVtsXS50eXBlXS5hcHBseShudWxsLGVbbF0ubWF0Y2hlcyksblt2XSl7Zm9yKHI9KytsO28+cjtyKyspaWYoaS5yZWxhdGl2ZVtlW3JdLnR5cGVdKWJyZWFrO3JldHVybiBidChsPjEmJnZ0KGYpLGw+MSYmbXQoZS5zbGljZSgwLGwtMSkuY29uY2F0KHt2YWx1ZToiICI9PT1lW2wtMl0udHlwZT8iKiI6IiJ9KSkucmVwbGFjZSh6LCIkMSIpLG4scj5sJiZ3dChlLnNsaWNlKGwscikpLG8+ciYmd3QoZT1lLnNsaWNlKHIpKSxvPnImJm10KGUpKX1mLnB1c2gobil9cmV0dXJuIHZ0KGYpfWZ1bmN0aW9uIFR0KGUsdCl7dmFyIG49MCxvPXQubGVuZ3RoPjAscz1lLmxlbmd0aD4wLGE9ZnVuY3Rpb24oYSxsLGMsZixoKXt2YXIgZCxnLG0seT1bXSx2PTAseD0iMCIsYj1hJiZbXSxUPW51bGwhPWgsQz11LGs9YXx8cyYmaS5maW5kLlRBRygiKiIsaCYmbC5wYXJlbnROb2RlfHxsKSxOPXcrPW51bGw9PUM/MTpNYXRoLnJhbmRvbSgpfHwuMTtmb3IoVCYmKHU9bCE9PXAmJmwscj1uKTtudWxsIT0oZD1rW3hdKTt4Kyspe2lmKHMmJmQpe2c9MDt3aGlsZShtPWVbZysrXSlpZihtKGQsbCxjKSl7Zi5wdXNoKGQpO2JyZWFrfVQmJih3PU4scj0rK24pfW8mJigoZD0hbSYmZCkmJnYtLSxhJiZiLnB1c2goZCkpfWlmKHYrPXgsbyYmeCE9PXYpe2c9MDt3aGlsZShtPXRbZysrXSltKGIseSxsLGMpO2lmKGEpe2lmKHY+MCl3aGlsZSh4LS0pYlt4XXx8eVt4XXx8KHlbeF09cS5jYWxsKGYpKTt5PXh0KHkpfU8uYXBwbHkoZix5KSxUJiYhYSYmeS5sZW5ndGg+MCYmdit0Lmxlbmd0aD4xJiZvdC51bmlxdWVTb3J0KGYpfXJldHVybiBUJiYodz1OLHU9QyksYn07cmV0dXJuIG8/YXQoYSk6YX1hPW90LmNvbXBpbGU9ZnVuY3Rpb24oZSx0KXt2YXIgbixyPVtdLGk9W10sbz1OW2UrIiAiXTtpZighbyl7dHx8KHQ9Z3QoZSkpLG49dC5sZW5ndGg7d2hpbGUobi0tKW89d3QodFtuXSksb1t2XT9yLnB1c2gobyk6aS5wdXNoKG8pO289TihlLFR0KGkscikpfXJldHVybiBvfTtmdW5jdGlvbiBDdChlLHQsbil7dmFyIHI9MCxpPXQubGVuZ3RoO2Zvcig7aT5yO3IrKylvdChlLHRbcl0sbik7cmV0dXJuIG59ZnVuY3Rpb24ga3QoZSx0LHIsbyl7dmFyIHMsdSxsLGMscCxmPWd0KGUpO2lmKCFvJiYxPT09Zi5sZW5ndGgpe2lmKHU9ZlswXT1mWzBdLnNsaWNlKDApLHUubGVuZ3RoPjImJiJJRCI9PT0obD11WzBdKS50eXBlJiZuLmdldEJ5SWQmJjk9PT10Lm5vZGVUeXBlJiZoJiZpLnJlbGF0aXZlW3VbMV0udHlwZV0pe2lmKHQ9KGkuZmluZC5JRChsLm1hdGNoZXNbMF0ucmVwbGFjZShudCxydCksdCl8fFtdKVswXSwhdClyZXR1cm4gcjtlPWUuc2xpY2UodS5zaGlmdCgpLnZhbHVlLmxlbmd0aCl9cz1KLm5lZWRzQ29udGV4dC50ZXN0KGUpPzA6dS5sZW5ndGg7d2hpbGUocy0tKXtpZihsPXVbc10saS5yZWxhdGl2ZVtjPWwudHlwZV0pYnJlYWs7aWYoKHA9aS5maW5kW2NdKSYmKG89cChsLm1hdGNoZXNbMF0ucmVwbGFjZShudCxydCksVS50ZXN0KHVbMF0udHlwZSkmJnQucGFyZW50Tm9kZXx8dCkpKXtpZih1LnNwbGljZShzLDEpLGU9by5sZW5ndGgmJm10KHUpLCFlKXJldHVybiBPLmFwcGx5KHIsbykscjticmVha319fXJldHVybiBhKGUsZikobyx0LCFoLHIsVS50ZXN0KGUpKSxyfW4uc29ydFN0YWJsZT12LnNwbGl0KCIiKS5zb3J0KFMpLmpvaW4oIiIpPT09dixuLmRldGVjdER1cGxpY2F0ZXM9RSxjKCksbi5zb3J0RGV0YWNoZWQ9dXQoZnVuY3Rpb24oZSl7cmV0dXJuIDEmZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihwLmNyZWF0ZUVsZW1lbnQoImRpdiIpKX0pLHV0KGZ1bmN0aW9uKGUpe3JldHVybiBlLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsIiMiPT09ZS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSl8fGx0KCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoIixmdW5jdGlvbihlLHQsbil7cmV0dXJuIG4/dW5kZWZpbmVkOmUuZ2V0QXR0cmlidXRlKHQsInR5cGUiPT09dC50b0xvd2VyQ2FzZSgpPzE6Mil9KSxuLmF0dHJpYnV0ZXMmJnV0KGZ1bmN0aW9uKGUpe3JldHVybiBlLmlubmVySFRNTD0iPGlucHV0Lz4iLGUuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksIiI9PT1lLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpfSl8fGx0KCJ2YWx1ZSIsZnVuY3Rpb24oZSx0LG4pe3JldHVybiBufHwiaW5wdXQiIT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpP3VuZGVmaW5lZDplLmRlZmF1bHRWYWx1ZX0pLHV0KGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKX0pfHxsdChSLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtyZXR1cm4gbj91bmRlZmluZWQ6KHI9ZS5nZXRBdHRyaWJ1dGVOb2RlKHQpKSYmci5zcGVjaWZpZWQ/ci52YWx1ZTplW3RdPT09ITA/dC50b0xvd2VyQ2FzZSgpOm51bGx9KSx4LmZpbmQ9b3QseC5leHByPW90LnNlbGVjdG9ycyx4LmV4cHJbIjoiXT14LmV4cHIucHNldWRvcyx4LnVuaXF1ZT1vdC51bmlxdWVTb3J0LHgudGV4dD1vdC5nZXRUZXh0LHguaXNYTUxEb2M9b3QuaXNYTUwseC5jb250YWlucz1vdC5jb250YWluc30oZSk7dmFyIEQ9e307ZnVuY3Rpb24gQShlKXt2YXIgdD1EW2VdPXt9O3JldHVybiB4LmVhY2goZS5tYXRjaCh3KXx8W10sZnVuY3Rpb24oZSxuKXt0W25dPSEwfSksdH14LkNhbGxiYWNrcz1mdW5jdGlvbihlKXtlPSJzdHJpbmciPT10eXBlb2YgZT9EW2VdfHxBKGUpOnguZXh0ZW5kKHt9LGUpO3ZhciB0LG4scixpLG8scyxhPVtdLHU9IWUub25jZSYmW10sbD1mdW5jdGlvbihwKXtmb3IodD1lLm1lbW9yeSYmcCxuPSEwLHM9aXx8MCxpPTAsbz1hLmxlbmd0aCxyPSEwO2EmJm8+cztzKyspaWYoYVtzXS5hcHBseShwWzBdLHBbMV0pPT09ITEmJmUuc3RvcE9uRmFsc2Upe3Q9ITE7YnJlYWt9cj0hMSxhJiYodT91Lmxlbmd0aCYmbCh1LnNoaWZ0KCkpOnQ/YT1bXTpjLmRpc2FibGUoKSl9LGM9e2FkZDpmdW5jdGlvbigpe2lmKGEpe3ZhciBuPWEubGVuZ3RoOyhmdW5jdGlvbiBzKHQpe3guZWFjaCh0LGZ1bmN0aW9uKHQsbil7dmFyIHI9eC50eXBlKG4pOyJmdW5jdGlvbiI9PT1yP2UudW5pcXVlJiZjLmhhcyhuKXx8YS5wdXNoKG4pOm4mJm4ubGVuZ3RoJiYic3RyaW5nIiE9PXImJnMobil9KX0pKGFyZ3VtZW50cykscj9vPWEubGVuZ3RoOnQmJihpPW4sbCh0KSl9cmV0dXJuIHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiBhJiZ4LmVhY2goYXJndW1lbnRzLGZ1bmN0aW9uKGUsdCl7dmFyIG47d2hpbGUoKG49eC5pbkFycmF5KHQsYSxuKSk+LTEpYS5zcGxpY2UobiwxKSxyJiYobz49biYmby0tLHM+PW4mJnMtLSl9KSx0aGlzfSxoYXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/eC5pbkFycmF5KGUsYSk+LTE6ISghYXx8IWEubGVuZ3RoKX0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gYT1bXSxvPTAsdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiBhPXU9dD11bmRlZmluZWQsdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hYX0sbG9jazpmdW5jdGlvbigpe3JldHVybiB1PXVuZGVmaW5lZCx0fHxjLmRpc2FibGUoKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hdX0sZmlyZVdpdGg6ZnVuY3Rpb24oZSx0KXtyZXR1cm4hYXx8biYmIXV8fCh0PXR8fFtdLHQ9W2UsdC5zbGljZT90LnNsaWNlKCk6dF0scj91LnB1c2godCk6bCh0KSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBjLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhbn19O3JldHVybiBjfSx4LmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9W1sicmVzb2x2ZSIsImRvbmUiLHguQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIseC5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksInJlamVjdGVkIl0sWyJub3RpZnkiLCJwcm9ncmVzcyIseC5DYWxsYmFja3MoIm1lbW9yeSIpXV0sbj0icGVuZGluZyIscj17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gbn0sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIGkuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSx0aGVuOmZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzO3JldHVybiB4LkRlZmVycmVkKGZ1bmN0aW9uKG4pe3guZWFjaCh0LGZ1bmN0aW9uKHQsbyl7dmFyIHM9b1swXSxhPXguaXNGdW5jdGlvbihlW3RdKSYmZVt0XTtpW29bMV1dKGZ1bmN0aW9uKCl7dmFyIGU9YSYmYS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7ZSYmeC5pc0Z1bmN0aW9uKGUucHJvbWlzZSk/ZS5wcm9taXNlKCkuZG9uZShuLnJlc29sdmUpLmZhaWwobi5yZWplY3QpLnByb2dyZXNzKG4ubm90aWZ5KTpuW3MrIldpdGgiXSh0aGlzPT09cj9uLnByb21pc2UoKTp0aGlzLGE/W2VdOmFyZ3VtZW50cyl9KX0pLGU9bnVsbH0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZT94LmV4dGVuZChlLHIpOnJ9fSxpPXt9O3JldHVybiByLnBpcGU9ci50aGVuLHguZWFjaCh0LGZ1bmN0aW9uKGUsbyl7dmFyIHM9b1syXSxhPW9bM107cltvWzFdXT1zLmFkZCxhJiZzLmFkZChmdW5jdGlvbigpe249YX0sdFsxXmVdWzJdLmRpc2FibGUsdFsyXVsyXS5sb2NrKSxpW29bMF1dPWZ1bmN0aW9uKCl7cmV0dXJuIGlbb1swXSsiV2l0aCJdKHRoaXM9PT1pP3I6dGhpcyxhcmd1bWVudHMpLHRoaXN9LGlbb1swXSsiV2l0aCJdPXMuZmlyZVdpdGh9KSxyLnByb21pc2UoaSksZSYmZS5jYWxsKGksaSksaX0sd2hlbjpmdW5jdGlvbihlKXt2YXIgdD0wLG49ZC5jYWxsKGFyZ3VtZW50cykscj1uLmxlbmd0aCxpPTEhPT1yfHxlJiZ4LmlzRnVuY3Rpb24oZS5wcm9taXNlKT9yOjAsbz0xPT09aT9lOnguRGVmZXJyZWQoKSxzPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24ocil7dFtlXT10aGlzLG5bZV09YXJndW1lbnRzLmxlbmd0aD4xP2QuY2FsbChhcmd1bWVudHMpOnIsbj09PWE/by5ub3RpZnlXaXRoKHQsbik6LS1pfHxvLnJlc29sdmVXaXRoKHQsbil9fSxhLHUsbDtpZihyPjEpZm9yKGE9QXJyYXkociksdT1BcnJheShyKSxsPUFycmF5KHIpO3I+dDt0Kyspblt0XSYmeC5pc0Z1bmN0aW9uKG5bdF0ucHJvbWlzZSk/blt0XS5wcm9taXNlKCkuZG9uZShzKHQsbCxuKSkuZmFpbChvLnJlamVjdCkucHJvZ3Jlc3Mocyh0LHUsYSkpOi0taTtyZXR1cm4gaXx8by5yZXNvbHZlV2l0aChsLG4pLG8ucHJvbWlzZSgpfX0pLHguc3VwcG9ydD1mdW5jdGlvbih0KXt2YXIgbj1vLmNyZWF0ZUVsZW1lbnQoImlucHV0Iikscj1vLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxpPW8uY3JlYXRlRWxlbWVudCgiZGl2Iikscz1vLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLGE9cy5hcHBlbmRDaGlsZChvLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKTtyZXR1cm4gbi50eXBlPyhuLnR5cGU9ImNoZWNrYm94Iix0LmNoZWNrT249IiIhPT1uLnZhbHVlLHQub3B0U2VsZWN0ZWQ9YS5zZWxlY3RlZCx0LnJlbGlhYmxlTWFyZ2luUmlnaHQ9ITAsdC5ib3hTaXppbmdSZWxpYWJsZT0hMCx0LnBpeGVsUG9zaXRpb249ITEsbi5jaGVja2VkPSEwLHQubm9DbG9uZUNoZWNrZWQ9bi5jbG9uZU5vZGUoITApLmNoZWNrZWQscy5kaXNhYmxlZD0hMCx0Lm9wdERpc2FibGVkPSFhLmRpc2FibGVkLG49by5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLG4udmFsdWU9InQiLG4udHlwZT0icmFkaW8iLHQucmFkaW9WYWx1ZT0idCI9PT1uLnZhbHVlLG4uc2V0QXR0cmlidXRlKCJjaGVja2VkIiwidCIpLG4uc2V0QXR0cmlidXRlKCJuYW1lIiwidCIpLHIuYXBwZW5kQ2hpbGQobiksdC5jaGVja0Nsb25lPXIuY2xvbmVOb2RlKCEwKS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5jaGVja2VkLHQuZm9jdXNpbkJ1YmJsZXM9Im9uZm9jdXNpbiJpbiBlLGkuc3R5bGUuYmFja2dyb3VuZENsaXA9ImNvbnRlbnQtYm94IixpLmNsb25lTm9kZSghMCkuc3R5bGUuYmFja2dyb3VuZENsaXA9IiIsdC5jbGVhckNsb25lU3R5bGU9ImNvbnRlbnQtYm94Ij09PWkuc3R5bGUuYmFja2dyb3VuZENsaXAseChmdW5jdGlvbigpe3ZhciBuLHIscz0icGFkZGluZzowO21hcmdpbjowO2JvcmRlcjowO2Rpc3BsYXk6YmxvY2s7LXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy1tb3otYm94LXNpemluZzpjb250ZW50LWJveDtib3gtc2l6aW5nOmNvbnRlbnQtYm94IixhPW8uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXTthJiYobj1vLmNyZWF0ZUVsZW1lbnQoImRpdiIpLG4uc3R5bGUuY3NzVGV4dD0iYm9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0Oi05OTk5cHg7bWFyZ2luLXRvcDoxcHgiLGEuYXBwZW5kQ2hpbGQobikuYXBwZW5kQ2hpbGQoaSksaS5pbm5lckhUTUw9IiIsaS5zdHlsZS5jc3NUZXh0PSItd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDstbW96LWJveC1zaXppbmc6Ym9yZGVyLWJveDtib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZzoxcHg7Ym9yZGVyOjFweDtkaXNwbGF5OmJsb2NrO3dpZHRoOjRweDttYXJnaW4tdG9wOjElO3Bvc2l0aW9uOmFic29sdXRlO3RvcDoxJSIseC5zd2FwKGEsbnVsbCE9YS5zdHlsZS56b29tP3t6b29tOjF9Ont9LGZ1bmN0aW9uKCl7dC5ib3hTaXppbmc9ND09PWkub2Zmc2V0V2lkdGh9KSxlLmdldENvbXB1dGVkU3R5bGUmJih0LnBpeGVsUG9zaXRpb249IjElIiE9PShlLmdldENvbXB1dGVkU3R5bGUoaSxudWxsKXx8e30pLnRvcCx0LmJveFNpemluZ1JlbGlhYmxlPSI0cHgiPT09KGUuZ2V0Q29tcHV0ZWRTdHlsZShpLG51bGwpfHx7d2lkdGg6IjRweCJ9KS53aWR0aCxyPWkuYXBwZW5kQ2hpbGQoby5jcmVhdGVFbGVtZW50KCJkaXYiKSksci5zdHlsZS5jc3NUZXh0PWkuc3R5bGUuY3NzVGV4dD1zLHIuc3R5bGUubWFyZ2luUmlnaHQ9ci5zdHlsZS53aWR0aD0iMCIsaS5zdHlsZS53aWR0aD0iMXB4Iix0LnJlbGlhYmxlTWFyZ2luUmlnaHQ9IXBhcnNlRmxvYXQoKGUuZ2V0Q29tcHV0ZWRTdHlsZShyLG51bGwpfHx7fSkubWFyZ2luUmlnaHQpKSxhLnJlbW92ZUNoaWxkKG4pKX0pLHQpOnR9KHt9KTt2YXIgTCxxLEg9Lyg/Olx7W1xzXFNdKlx9fFxbW1xzXFNdKlxdKSQvLE89LyhbQS1aXSkvZztmdW5jdGlvbiBGKCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMuY2FjaGU9e30sMCx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue319fSksdGhpcy5leHBhbmRvPXguZXhwYW5kbytNYXRoLnJhbmRvbSgpfUYudWlkPTEsRi5hY2NlcHRzPWZ1bmN0aW9uKGUpe3JldHVybiBlLm5vZGVUeXBlPzE9PT1lLm5vZGVUeXBlfHw5PT09ZS5ub2RlVHlwZTohMH0sRi5wcm90b3R5cGU9e2tleTpmdW5jdGlvbihlKXtpZighRi5hY2NlcHRzKGUpKXJldHVybiAwO3ZhciB0PXt9LG49ZVt0aGlzLmV4cGFuZG9dO2lmKCFuKXtuPUYudWlkKys7dHJ5e3RbdGhpcy5leHBhbmRvXT17dmFsdWU6bn0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSx0KX1jYXRjaChyKXt0W3RoaXMuZXhwYW5kb109bix4LmV4dGVuZChlLHQpfX1yZXR1cm4gdGhpcy5jYWNoZVtuXXx8KHRoaXMuY2FjaGVbbl09e30pLG59LHNldDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaT10aGlzLmtleShlKSxvPXRoaXMuY2FjaGVbaV07aWYoInN0cmluZyI9PXR5cGVvZiB0KW9bdF09bjtlbHNlIGlmKHguaXNFbXB0eU9iamVjdChvKSl4LmV4dGVuZCh0aGlzLmNhY2hlW2ldLHQpO2Vsc2UgZm9yKHIgaW4gdClvW3JdPXRbcl07cmV0dXJuIG99LGdldDpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuY2FjaGVbdGhpcy5rZXkoZSldO3JldHVybiB0PT09dW5kZWZpbmVkP246blt0XX0sYWNjZXNzOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtyZXR1cm4gdD09PXVuZGVmaW5lZHx8dCYmInN0cmluZyI9PXR5cGVvZiB0JiZuPT09dW5kZWZpbmVkPyhyPXRoaXMuZ2V0KGUsdCksciE9PXVuZGVmaW5lZD9yOnRoaXMuZ2V0KGUseC5jYW1lbENhc2UodCkpKToodGhpcy5zZXQoZSx0LG4pLG4hPT11bmRlZmluZWQ/bjp0KX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG89dGhpcy5rZXkoZSkscz10aGlzLmNhY2hlW29dO2lmKHQ9PT11bmRlZmluZWQpdGhpcy5jYWNoZVtvXT17fTtlbHNle3guaXNBcnJheSh0KT9yPXQuY29uY2F0KHQubWFwKHguY2FtZWxDYXNlKSk6KGk9eC5jYW1lbENhc2UodCksdCBpbiBzP3I9W3QsaV06KHI9aSxyPXIgaW4gcz9bcl06ci5tYXRjaCh3KXx8W10pKSxuPXIubGVuZ3RoO3doaWxlKG4tLSlkZWxldGUgc1tyW25dXX19LGhhc0RhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIXguaXNFbXB0eU9iamVjdCh0aGlzLmNhY2hlW2VbdGhpcy5leHBhbmRvXV18fHt9KX0sZGlzY2FyZDpmdW5jdGlvbihlKXtlW3RoaXMuZXhwYW5kb10mJmRlbGV0ZSB0aGlzLmNhY2hlW2VbdGhpcy5leHBhbmRvXV19fSxMPW5ldyBGLHE9bmV3IEYseC5leHRlbmQoe2FjY2VwdERhdGE6Ri5hY2NlcHRzLGhhc0RhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIEwuaGFzRGF0YShlKXx8cS5oYXNEYXRhKGUpfSxkYXRhOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gTC5hY2Nlc3MoZSx0LG4pfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGUsdCl7TC5yZW1vdmUoZSx0KX0sX2RhdGE6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBxLmFjY2VzcyhlLHQsbil9LF9yZW1vdmVEYXRhOmZ1bmN0aW9uKGUsdCl7cS5yZW1vdmUoZSx0KX19KSx4LmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaT10aGlzWzBdLG89MCxzPW51bGw7aWYoZT09PXVuZGVmaW5lZCl7aWYodGhpcy5sZW5ndGgmJihzPUwuZ2V0KGkpLDE9PT1pLm5vZGVUeXBlJiYhcS5nZXQoaSwiaGFzRGF0YUF0dHJzIikpKXtmb3Iobj1pLmF0dHJpYnV0ZXM7bi5sZW5ndGg+bztvKyspcj1uW29dLm5hbWUsMD09PXIuaW5kZXhPZigiZGF0YS0iKSYmKHI9eC5jYW1lbENhc2Uoci5zbGljZSg1KSksUChpLHIsc1tyXSkpO3Euc2V0KGksImhhc0RhdGFBdHRycyIsITApfXJldHVybiBzfXJldHVybiJvYmplY3QiPT10eXBlb2YgZT90aGlzLmVhY2goZnVuY3Rpb24oKXtMLnNldCh0aGlzLGUpfSk6eC5hY2Nlc3ModGhpcyxmdW5jdGlvbih0KXt2YXIgbixyPXguY2FtZWxDYXNlKGUpO2lmKGkmJnQ9PT11bmRlZmluZWQpe2lmKG49TC5nZXQoaSxlKSxuIT09dW5kZWZpbmVkKXJldHVybiBuO2lmKG49TC5nZXQoaSxyKSxuIT09dW5kZWZpbmVkKXJldHVybiBuO2lmKG49UChpLHIsdW5kZWZpbmVkKSxuIT09dW5kZWZpbmVkKXJldHVybiBufWVsc2UgdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIG49TC5nZXQodGhpcyxyKTtMLnNldCh0aGlzLHIsdCksLTEhPT1lLmluZGV4T2YoIi0iKSYmbiE9PXVuZGVmaW5lZCYmTC5zZXQodGhpcyxlLHQpfSl9LG51bGwsdCxhcmd1bWVudHMubGVuZ3RoPjEsbnVsbCwhMCl9LHJlbW92ZURhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe0wucmVtb3ZlKHRoaXMsZSl9KX19KTtmdW5jdGlvbiBQKGUsdCxuKXt2YXIgcjtpZihuPT09dW5kZWZpbmVkJiYxPT09ZS5ub2RlVHlwZSlpZihyPSJkYXRhLSIrdC5yZXBsYWNlKE8sIi0kMSIpLnRvTG93ZXJDYXNlKCksbj1lLmdldEF0dHJpYnV0ZShyKSwic3RyaW5nIj09dHlwZW9mIG4pe3RyeXtuPSJ0cnVlIj09PW4/ITA6ImZhbHNlIj09PW4/ITE6Im51bGwiPT09bj9udWxsOituKyIiPT09bj8rbjpILnRlc3Qobik/SlNPTi5wYXJzZShuKTpufWNhdGNoKGkpe31MLnNldChlLHQsbil9ZWxzZSBuPXVuZGVmaW5lZDtyZXR1cm4gbn14LmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByO3JldHVybiBlPyh0PSh0fHwiZngiKSsicXVldWUiLHI9cS5nZXQoZSx0KSxuJiYoIXJ8fHguaXNBcnJheShuKT9yPXEuYWNjZXNzKGUsdCx4Lm1ha2VBcnJheShuKSk6ci5wdXNoKG4pKSxyfHxbXSk6dW5kZWZpbmVkfSxkZXF1ZXVlOmZ1bmN0aW9uKGUsdCl7dD10fHwiZngiO3ZhciBuPXgucXVldWUoZSx0KSxyPW4ubGVuZ3RoLGk9bi5zaGlmdCgpLG89eC5fcXVldWVIb29rcyhlLHQpLHM9ZnVuY3Rpb24oKXt4LmRlcXVldWUoZSx0KQorfTsiaW5wcm9ncmVzcyI9PT1pJiYoaT1uLnNoaWZ0KCksci0tKSxpJiYoImZ4Ij09PXQmJm4udW5zaGlmdCgiaW5wcm9ncmVzcyIpLGRlbGV0ZSBvLnN0b3AsaS5jYWxsKGUscyxvKSksIXImJm8mJm8uZW1wdHkuZmlyZSgpfSxfcXVldWVIb29rczpmdW5jdGlvbihlLHQpe3ZhciBuPXQrInF1ZXVlSG9va3MiO3JldHVybiBxLmdldChlLG4pfHxxLmFjY2VzcyhlLG4se2VtcHR5OnguQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZChmdW5jdGlvbigpe3EucmVtb3ZlKGUsW3QrInF1ZXVlIixuXSl9KX0pfX0pLHguZm4uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihlLHQpe3ZhciBuPTI7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBlJiYodD1lLGU9ImZ4IixuLS0pLG4+YXJndW1lbnRzLmxlbmd0aD94LnF1ZXVlKHRoaXNbMF0sZSk6dD09PXVuZGVmaW5lZD90aGlzOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBuPXgucXVldWUodGhpcyxlLHQpO3guX3F1ZXVlSG9va3ModGhpcyxlKSwiZngiPT09ZSYmImlucHJvZ3Jlc3MiIT09blswXSYmeC5kZXF1ZXVlKHRoaXMsZSl9KX0sZGVxdWV1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7eC5kZXF1ZXVlKHRoaXMsZSl9KX0sZGVsYXk6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT14LmZ4P3guZnguc3BlZWRzW2VdfHxlOmUsdD10fHwiZngiLHRoaXMucXVldWUodCxmdW5jdGlvbih0LG4pe3ZhciByPXNldFRpbWVvdXQodCxlKTtuLnN0b3A9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQocil9fSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucXVldWUoZXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTEsaT14LkRlZmVycmVkKCksbz10aGlzLHM9dGhpcy5sZW5ndGgsYT1mdW5jdGlvbigpey0tcnx8aS5yZXNvbHZlV2l0aChvLFtvXSl9OyJzdHJpbmciIT10eXBlb2YgZSYmKHQ9ZSxlPXVuZGVmaW5lZCksZT1lfHwiZngiO3doaWxlKHMtLSluPXEuZ2V0KG9bc10sZSsicXVldWVIb29rcyIpLG4mJm4uZW1wdHkmJihyKyssbi5lbXB0eS5hZGQoYSkpO3JldHVybiBhKCksaS5wcm9taXNlKHQpfX0pO3ZhciBSLE0sVz0vW1x0XHJcblxmXS9nLCQ9L1xyL2csQj0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pO3guZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHguYWNjZXNzKHRoaXMseC5hdHRyLGUsdCxhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt4LnJlbW92ZUF0dHIodGhpcyxlKX0pfSxwcm9wOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHguYWNjZXNzKHRoaXMseC5wcm9wLGUsdCxhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVQcm9wOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtkZWxldGUgdGhpc1t4LnByb3BGaXhbZV18fGVdfSl9LGFkZENsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpLG8scz0wLGE9dGhpcy5sZW5ndGgsdT0ic3RyaW5nIj09dHlwZW9mIGUmJmU7aWYoeC5pc0Z1bmN0aW9uKGUpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24odCl7eCh0aGlzKS5hZGRDbGFzcyhlLmNhbGwodGhpcyx0LHRoaXMuY2xhc3NOYW1lKSl9KTtpZih1KWZvcih0PShlfHwiIikubWF0Y2godyl8fFtdO2E+cztzKyspaWYobj10aGlzW3NdLHI9MT09PW4ubm9kZVR5cGUmJihuLmNsYXNzTmFtZT8oIiAiK24uY2xhc3NOYW1lKyIgIikucmVwbGFjZShXLCIgIik6IiAiKSl7bz0wO3doaWxlKGk9dFtvKytdKTA+ci5pbmRleE9mKCIgIitpKyIgIikmJihyKz1pKyIgIik7bi5jbGFzc05hbWU9eC50cmltKHIpfXJldHVybiB0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLHM9MCxhPXRoaXMubGVuZ3RoLHU9MD09PWFyZ3VtZW50cy5sZW5ndGh8fCJzdHJpbmciPT10eXBlb2YgZSYmZTtpZih4LmlzRnVuY3Rpb24oZSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbih0KXt4KHRoaXMpLnJlbW92ZUNsYXNzKGUuY2FsbCh0aGlzLHQsdGhpcy5jbGFzc05hbWUpKX0pO2lmKHUpZm9yKHQ9KGV8fCIiKS5tYXRjaCh3KXx8W107YT5zO3MrKylpZihuPXRoaXNbc10scj0xPT09bi5ub2RlVHlwZSYmKG4uY2xhc3NOYW1lPygiICIrbi5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKFcsIiAiKToiIikpe289MDt3aGlsZShpPXRbbysrXSl3aGlsZShyLmluZGV4T2YoIiAiK2krIiAiKT49MClyPXIucmVwbGFjZSgiICIraSsiICIsIiAiKTtuLmNsYXNzTmFtZT1lP3gudHJpbShyKToiIn1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oZSx0KXt2YXIgbj10eXBlb2YgZTtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiB0JiYic3RyaW5nIj09PW4/dD90aGlzLmFkZENsYXNzKGUpOnRoaXMucmVtb3ZlQ2xhc3MoZSk6eC5pc0Z1bmN0aW9uKGUpP3RoaXMuZWFjaChmdW5jdGlvbihuKXt4KHRoaXMpLnRvZ2dsZUNsYXNzKGUuY2FsbCh0aGlzLG4sdGhpcy5jbGFzc05hbWUsdCksdCl9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXtpZigic3RyaW5nIj09PW4pe3ZhciB0LGk9MCxvPXgodGhpcykscz1lLm1hdGNoKHcpfHxbXTt3aGlsZSh0PXNbaSsrXSlvLmhhc0NsYXNzKHQpP28ucmVtb3ZlQ2xhc3ModCk6by5hZGRDbGFzcyh0KX1lbHNlKG49PT1yfHwiYm9vbGVhbiI9PT1uKSYmKHRoaXMuY2xhc3NOYW1lJiZxLnNldCh0aGlzLCJfX2NsYXNzTmFtZV9fIix0aGlzLmNsYXNzTmFtZSksdGhpcy5jbGFzc05hbWU9dGhpcy5jbGFzc05hbWV8fGU9PT0hMT8iIjpxLmdldCh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIiKX0pfSxoYXNDbGFzczpmdW5jdGlvbihlKXt2YXIgdD0iICIrZSsiICIsbj0wLHI9dGhpcy5sZW5ndGg7Zm9yKDtyPm47bisrKWlmKDE9PT10aGlzW25dLm5vZGVUeXBlJiYoIiAiK3RoaXNbbl0uY2xhc3NOYW1lKyIgIikucmVwbGFjZShXLCIgIikuaW5kZXhPZih0KT49MClyZXR1cm4hMDtyZXR1cm4hMX0sdmFsOmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpPXRoaXNbMF07e2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHI9eC5pc0Z1bmN0aW9uKGUpLHRoaXMuZWFjaChmdW5jdGlvbihuKXt2YXIgaTsxPT09dGhpcy5ub2RlVHlwZSYmKGk9cj9lLmNhbGwodGhpcyxuLHgodGhpcykudmFsKCkpOmUsbnVsbD09aT9pPSIiOiJudW1iZXIiPT10eXBlb2YgaT9pKz0iIjp4LmlzQXJyYXkoaSkmJihpPXgubWFwKGksZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/IiI6ZSsiIn0pKSx0PXgudmFsSG9va3NbdGhpcy50eXBlXXx8eC52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLHQmJiJzZXQiaW4gdCYmdC5zZXQodGhpcyxpLCJ2YWx1ZSIpIT09dW5kZWZpbmVkfHwodGhpcy52YWx1ZT1pKSl9KTtpZihpKXJldHVybiB0PXgudmFsSG9va3NbaS50eXBlXXx8eC52YWxIb29rc1tpLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLHQmJiJnZXQiaW4gdCYmKG49dC5nZXQoaSwidmFsdWUiKSkhPT11bmRlZmluZWQ/bjoobj1pLnZhbHVlLCJzdHJpbmciPT10eXBlb2Ygbj9uLnJlcGxhY2UoJCwiIik6bnVsbD09bj8iIjpuKX19fSkseC5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbihlKXt2YXIgdD1lLmF0dHJpYnV0ZXMudmFsdWU7cmV0dXJuIXR8fHQuc3BlY2lmaWVkP2UudmFsdWU6ZS50ZXh0fX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQsbixyPWUub3B0aW9ucyxpPWUuc2VsZWN0ZWRJbmRleCxvPSJzZWxlY3Qtb25lIj09PWUudHlwZXx8MD5pLHM9bz9udWxsOltdLGE9bz9pKzE6ci5sZW5ndGgsdT0wPmk/YTpvP2k6MDtmb3IoO2E+dTt1KyspaWYobj1yW3VdLCEoIW4uc2VsZWN0ZWQmJnUhPT1pfHwoeC5zdXBwb3J0Lm9wdERpc2FibGVkP24uZGlzYWJsZWQ6bnVsbCE9PW4uZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpKXx8bi5wYXJlbnROb2RlLmRpc2FibGVkJiZ4Lm5vZGVOYW1lKG4ucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe2lmKHQ9eChuKS52YWwoKSxvKXJldHVybiB0O3MucHVzaCh0KX1yZXR1cm4gc30sc2V0OmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpPWUub3B0aW9ucyxvPXgubWFrZUFycmF5KHQpLHM9aS5sZW5ndGg7d2hpbGUocy0tKXI9aVtzXSwoci5zZWxlY3RlZD14LmluQXJyYXkoeChyKS52YWwoKSxvKT49MCkmJihuPSEwKTtyZXR1cm4gbnx8KGUuc2VsZWN0ZWRJbmRleD0tMSksb319fSxhdHRyOmZ1bmN0aW9uKGUsdCxuKXt2YXIgaSxvLHM9ZS5ub2RlVHlwZTtpZihlJiYzIT09cyYmOCE9PXMmJjIhPT1zKXJldHVybiB0eXBlb2YgZS5nZXRBdHRyaWJ1dGU9PT1yP3gucHJvcChlLHQsbik6KDE9PT1zJiZ4LmlzWE1MRG9jKGUpfHwodD10LnRvTG93ZXJDYXNlKCksaT14LmF0dHJIb29rc1t0XXx8KHguZXhwci5tYXRjaC5ib29sLnRlc3QodCk/TTpSKSksbj09PXVuZGVmaW5lZD9pJiYiZ2V0ImluIGkmJm51bGwhPT0obz1pLmdldChlLHQpKT9vOihvPXguZmluZC5hdHRyKGUsdCksbnVsbD09bz91bmRlZmluZWQ6byk6bnVsbCE9PW4/aSYmInNldCJpbiBpJiYobz1pLnNldChlLG4sdCkpIT09dW5kZWZpbmVkP286KGUuc2V0QXR0cmlidXRlKHQsbisiIiksbik6KHgucmVtb3ZlQXR0cihlLHQpLHVuZGVmaW5lZCkpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpPTAsbz10JiZ0Lm1hdGNoKHcpO2lmKG8mJjE9PT1lLm5vZGVUeXBlKXdoaWxlKG49b1tpKytdKXI9eC5wcm9wRml4W25dfHxuLHguZXhwci5tYXRjaC5ib29sLnRlc3QobikmJihlW3JdPSExKSxlLnJlbW92ZUF0dHJpYnV0ZShuKX0sYXR0ckhvb2tzOnt0eXBlOntzZXQ6ZnVuY3Rpb24oZSx0KXtpZigheC5zdXBwb3J0LnJhZGlvVmFsdWUmJiJyYWRpbyI9PT10JiZ4Lm5vZGVOYW1lKGUsImlucHV0Iikpe3ZhciBuPWUudmFsdWU7cmV0dXJuIGUuc2V0QXR0cmlidXRlKCJ0eXBlIix0KSxuJiYoZS52YWx1ZT1uKSx0fX19fSxwcm9wRml4OnsiZm9yIjoiaHRtbEZvciIsImNsYXNzIjoiY2xhc3NOYW1lIn0scHJvcDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLHM9ZS5ub2RlVHlwZTtpZihlJiYzIT09cyYmOCE9PXMmJjIhPT1zKXJldHVybiBvPTEhPT1zfHwheC5pc1hNTERvYyhlKSxvJiYodD14LnByb3BGaXhbdF18fHQsaT14LnByb3BIb29rc1t0XSksbiE9PXVuZGVmaW5lZD9pJiYic2V0ImluIGkmJihyPWkuc2V0KGUsbix0KSkhPT11bmRlZmluZWQ/cjplW3RdPW46aSYmImdldCJpbiBpJiZudWxsIT09KHI9aS5nZXQoZSx0KSk/cjplW3RdfSxwcm9wSG9va3M6e3RhYkluZGV4OntnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuaGFzQXR0cmlidXRlKCJ0YWJpbmRleCIpfHxCLnRlc3QoZS5ub2RlTmFtZSl8fGUuaHJlZj9lLnRhYkluZGV4Oi0xfX19fSksTT17c2V0OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdD09PSExP3gucmVtb3ZlQXR0cihlLG4pOmUuc2V0QXR0cmlidXRlKG4sbiksbn19LHguZWFjaCh4LmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goL1x3Ky9nKSxmdW5jdGlvbihlLHQpe3ZhciBuPXguZXhwci5hdHRySGFuZGxlW3RdfHx4LmZpbmQuYXR0cjt4LmV4cHIuYXR0ckhhbmRsZVt0XT1mdW5jdGlvbihlLHQscil7dmFyIGk9eC5leHByLmF0dHJIYW5kbGVbdF0sbz1yP3VuZGVmaW5lZDooeC5leHByLmF0dHJIYW5kbGVbdF09dW5kZWZpbmVkKSE9bihlLHQscik/dC50b0xvd2VyQ2FzZSgpOm51bGw7cmV0dXJuIHguZXhwci5hdHRySGFuZGxlW3RdPWksb319KSx4LnN1cHBvcnQub3B0U2VsZWN0ZWR8fCh4LnByb3BIb29rcy5zZWxlY3RlZD17Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTtyZXR1cm4gdCYmdC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxudWxsfX0pLHguZWFjaChbInRhYkluZGV4IiwicmVhZE9ubHkiLCJtYXhMZW5ndGgiLCJjZWxsU3BhY2luZyIsImNlbGxQYWRkaW5nIiwicm93U3BhbiIsImNvbFNwYW4iLCJ1c2VNYXAiLCJmcmFtZUJvcmRlciIsImNvbnRlbnRFZGl0YWJsZSJdLGZ1bmN0aW9uKCl7eC5wcm9wRml4W3RoaXMudG9Mb3dlckNhc2UoKV09dGhpc30pLHguZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe3gudmFsSG9va3NbdGhpc109e3NldDpmdW5jdGlvbihlLHQpe3JldHVybiB4LmlzQXJyYXkodCk/ZS5jaGVja2VkPXguaW5BcnJheSh4KGUpLnZhbCgpLHQpPj0wOnVuZGVmaW5lZH19LHguc3VwcG9ydC5jaGVja09ufHwoeC52YWxIb29rc1t0aGlzXS5nZXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PT1lLmdldEF0dHJpYnV0ZSgidmFsdWUiKT8ib24iOmUudmFsdWV9KX0pO3ZhciBJPS9ea2V5Lyx6PS9eKD86bW91c2V8Y29udGV4dG1lbnUpfGNsaWNrLyxfPS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxYPS9eKFteLl0qKSg/OlwuKC4rKXwpJC87ZnVuY3Rpb24gVSgpe3JldHVybiEwfWZ1bmN0aW9uIFkoKXtyZXR1cm4hMX1mdW5jdGlvbiBWKCl7dHJ5e3JldHVybiBvLmFjdGl2ZUVsZW1lbnR9Y2F0Y2goZSl7fX14LmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKGUsdCxuLGksbyl7dmFyIHMsYSx1LGwsYyxwLGYsaCxkLGcsbSx5PXEuZ2V0KGUpO2lmKHkpe24uaGFuZGxlciYmKHM9bixuPXMuaGFuZGxlcixvPXMuc2VsZWN0b3IpLG4uZ3VpZHx8KG4uZ3VpZD14Lmd1aWQrKyksKGw9eS5ldmVudHMpfHwobD15LmV2ZW50cz17fSksKGE9eS5oYW5kbGUpfHwoYT15LmhhbmRsZT1mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIHg9PT1yfHxlJiZ4LmV2ZW50LnRyaWdnZXJlZD09PWUudHlwZT91bmRlZmluZWQ6eC5ldmVudC5kaXNwYXRjaC5hcHBseShhLmVsZW0sYXJndW1lbnRzKX0sYS5lbGVtPWUpLHQ9KHR8fCIiKS5tYXRjaCh3KXx8WyIiXSxjPXQubGVuZ3RoO3doaWxlKGMtLSl1PVguZXhlYyh0W2NdKXx8W10sZD1tPXVbMV0sZz0odVsyXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLGQmJihmPXguZXZlbnQuc3BlY2lhbFtkXXx8e30sZD0obz9mLmRlbGVnYXRlVHlwZTpmLmJpbmRUeXBlKXx8ZCxmPXguZXZlbnQuc3BlY2lhbFtkXXx8e30scD14LmV4dGVuZCh7dHlwZTpkLG9yaWdUeXBlOm0sZGF0YTppLGhhbmRsZXI6bixndWlkOm4uZ3VpZCxzZWxlY3RvcjpvLG5lZWRzQ29udGV4dDpvJiZ4LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QobyksbmFtZXNwYWNlOmcuam9pbigiLiIpfSxzKSwoaD1sW2RdKXx8KGg9bFtkXT1bXSxoLmRlbGVnYXRlQ291bnQ9MCxmLnNldHVwJiZmLnNldHVwLmNhbGwoZSxpLGcsYSkhPT0hMXx8ZS5hZGRFdmVudExpc3RlbmVyJiZlLmFkZEV2ZW50TGlzdGVuZXIoZCxhLCExKSksZi5hZGQmJihmLmFkZC5jYWxsKGUscCkscC5oYW5kbGVyLmd1aWR8fChwLmhhbmRsZXIuZ3VpZD1uLmd1aWQpKSxvP2guc3BsaWNlKGguZGVsZWdhdGVDb3VudCsrLDAscCk6aC5wdXNoKHApLHguZXZlbnQuZ2xvYmFsW2RdPSEwKTtlPW51bGx9fSxyZW1vdmU6ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbyxzLGEsdSxsLGMscCxmLGgsZCxnLG09cS5oYXNEYXRhKGUpJiZxLmdldChlKTtpZihtJiYodT1tLmV2ZW50cykpe3Q9KHR8fCIiKS5tYXRjaCh3KXx8WyIiXSxsPXQubGVuZ3RoO3doaWxlKGwtLSlpZihhPVguZXhlYyh0W2xdKXx8W10saD1nPWFbMV0sZD0oYVsyXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLGgpe3A9eC5ldmVudC5zcGVjaWFsW2hdfHx7fSxoPShyP3AuZGVsZWdhdGVUeXBlOnAuYmluZFR5cGUpfHxoLGY9dVtoXXx8W10sYT1hWzJdJiZSZWdFeHAoIihefFxcLikiK2Quam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIikscz1vPWYubGVuZ3RoO3doaWxlKG8tLSljPWZbb10sIWkmJmchPT1jLm9yaWdUeXBlfHxuJiZuLmd1aWQhPT1jLmd1aWR8fGEmJiFhLnRlc3QoYy5uYW1lc3BhY2UpfHxyJiZyIT09Yy5zZWxlY3RvciYmKCIqKiIhPT1yfHwhYy5zZWxlY3Rvcil8fChmLnNwbGljZShvLDEpLGMuc2VsZWN0b3ImJmYuZGVsZWdhdGVDb3VudC0tLHAucmVtb3ZlJiZwLnJlbW92ZS5jYWxsKGUsYykpO3MmJiFmLmxlbmd0aCYmKHAudGVhcmRvd24mJnAudGVhcmRvd24uY2FsbChlLGQsbS5oYW5kbGUpIT09ITF8fHgucmVtb3ZlRXZlbnQoZSxoLG0uaGFuZGxlKSxkZWxldGUgdVtoXSl9ZWxzZSBmb3IoaCBpbiB1KXguZXZlbnQucmVtb3ZlKGUsaCt0W2xdLG4sciwhMCk7eC5pc0VtcHR5T2JqZWN0KHUpJiYoZGVsZXRlIG0uaGFuZGxlLHEucmVtb3ZlKGUsImV2ZW50cyIpKX19LHRyaWdnZXI6ZnVuY3Rpb24odCxuLHIsaSl7dmFyIHMsYSx1LGwsYyxwLGYsaD1bcnx8b10sZD15LmNhbGwodCwidHlwZSIpP3QudHlwZTp0LGc9eS5jYWxsKHQsIm5hbWVzcGFjZSIpP3QubmFtZXNwYWNlLnNwbGl0KCIuIik6W107aWYoYT11PXI9cnx8bywzIT09ci5ub2RlVHlwZSYmOCE9PXIubm9kZVR5cGUmJiFfLnRlc3QoZCt4LmV2ZW50LnRyaWdnZXJlZCkmJihkLmluZGV4T2YoIi4iKT49MCYmKGc9ZC5zcGxpdCgiLiIpLGQ9Zy5zaGlmdCgpLGcuc29ydCgpKSxjPTA+ZC5pbmRleE9mKCI6IikmJiJvbiIrZCx0PXRbeC5leHBhbmRvXT90Om5ldyB4LkV2ZW50KGQsIm9iamVjdCI9PXR5cGVvZiB0JiZ0KSx0LmlzVHJpZ2dlcj1pPzI6Myx0Lm5hbWVzcGFjZT1nLmpvaW4oIi4iKSx0Lm5hbWVzcGFjZV9yZT10Lm5hbWVzcGFjZT9SZWdFeHAoIihefFxcLikiK2cuam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCx0LnJlc3VsdD11bmRlZmluZWQsdC50YXJnZXR8fCh0LnRhcmdldD1yKSxuPW51bGw9PW4/W3RdOngubWFrZUFycmF5KG4sW3RdKSxmPXguZXZlbnQuc3BlY2lhbFtkXXx8e30saXx8IWYudHJpZ2dlcnx8Zi50cmlnZ2VyLmFwcGx5KHIsbikhPT0hMSkpe2lmKCFpJiYhZi5ub0J1YmJsZSYmIXguaXNXaW5kb3cocikpe2ZvcihsPWYuZGVsZWdhdGVUeXBlfHxkLF8udGVzdChsK2QpfHwoYT1hLnBhcmVudE5vZGUpO2E7YT1hLnBhcmVudE5vZGUpaC5wdXNoKGEpLHU9YTt1PT09KHIub3duZXJEb2N1bWVudHx8bykmJmgucHVzaCh1LmRlZmF1bHRWaWV3fHx1LnBhcmVudFdpbmRvd3x8ZSl9cz0wO3doaWxlKChhPWhbcysrXSkmJiF0LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpdC50eXBlPXM+MT9sOmYuYmluZFR5cGV8fGQscD0ocS5nZXQoYSwiZXZlbnRzIil8fHt9KVt0LnR5cGVdJiZxLmdldChhLCJoYW5kbGUiKSxwJiZwLmFwcGx5KGEsbikscD1jJiZhW2NdLHAmJnguYWNjZXB0RGF0YShhKSYmcC5hcHBseSYmcC5hcHBseShhLG4pPT09ITEmJnQucHJldmVudERlZmF1bHQoKTtyZXR1cm4gdC50eXBlPWQsaXx8dC5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8Zi5fZGVmYXVsdCYmZi5fZGVmYXVsdC5hcHBseShoLnBvcCgpLG4pIT09ITF8fCF4LmFjY2VwdERhdGEocil8fGMmJnguaXNGdW5jdGlvbihyW2RdKSYmIXguaXNXaW5kb3cocikmJih1PXJbY10sdSYmKHJbY109bnVsbCkseC5ldmVudC50cmlnZ2VyZWQ9ZCxyW2RdKCkseC5ldmVudC50cmlnZ2VyZWQ9dW5kZWZpbmVkLHUmJihyW2NdPXUpKSx0LnJlc3VsdH19LGRpc3BhdGNoOmZ1bmN0aW9uKGUpe2U9eC5ldmVudC5maXgoZSk7dmFyIHQsbixyLGksbyxzPVtdLGE9ZC5jYWxsKGFyZ3VtZW50cyksdT0ocS5nZXQodGhpcywiZXZlbnRzIil8fHt9KVtlLnR5cGVdfHxbXSxsPXguZXZlbnQuc3BlY2lhbFtlLnR5cGVdfHx7fTtpZihhWzBdPWUsZS5kZWxlZ2F0ZVRhcmdldD10aGlzLCFsLnByZURpc3BhdGNofHxsLnByZURpc3BhdGNoLmNhbGwodGhpcyxlKSE9PSExKXtzPXguZXZlbnQuaGFuZGxlcnMuY2FsbCh0aGlzLGUsdSksdD0wO3doaWxlKChpPXNbdCsrXSkmJiFlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpe2UuY3VycmVudFRhcmdldD1pLmVsZW0sbj0wO3doaWxlKChvPWkuaGFuZGxlcnNbbisrXSkmJiFlLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkpKCFlLm5hbWVzcGFjZV9yZXx8ZS5uYW1lc3BhY2VfcmUudGVzdChvLm5hbWVzcGFjZSkpJiYoZS5oYW5kbGVPYmo9byxlLmRhdGE9by5kYXRhLHI9KCh4LmV2ZW50LnNwZWNpYWxbby5vcmlnVHlwZV18fHt9KS5oYW5kbGV8fG8uaGFuZGxlcikuYXBwbHkoaS5lbGVtLGEpLHIhPT11bmRlZmluZWQmJihlLnJlc3VsdD1yKT09PSExJiYoZS5wcmV2ZW50RGVmYXVsdCgpLGUuc3RvcFByb3BhZ2F0aW9uKCkpKX1yZXR1cm4gbC5wb3N0RGlzcGF0Y2gmJmwucG9zdERpc3BhdGNoLmNhbGwodGhpcyxlKSxlLnJlc3VsdH19LGhhbmRsZXJzOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG8scz1bXSxhPXQuZGVsZWdhdGVDb3VudCx1PWUudGFyZ2V0O2lmKGEmJnUubm9kZVR5cGUmJighZS5idXR0b258fCJjbGljayIhPT1lLnR5cGUpKWZvcig7dSE9PXRoaXM7dT11LnBhcmVudE5vZGV8fHRoaXMpaWYodS5kaXNhYmxlZCE9PSEwfHwiY2xpY2siIT09ZS50eXBlKXtmb3Iocj1bXSxuPTA7YT5uO24rKylvPXRbbl0saT1vLnNlbGVjdG9yKyIgIixyW2ldPT09dW5kZWZpbmVkJiYocltpXT1vLm5lZWRzQ29udGV4dD94KGksdGhpcykuaW5kZXgodSk+PTA6eC5maW5kKGksdGhpcyxudWxsLFt1XSkubGVuZ3RoKSxyW2ldJiZyLnB1c2gobyk7ci5sZW5ndGgmJnMucHVzaCh7ZWxlbTp1LGhhbmRsZXJzOnJ9KX1yZXR1cm4gdC5sZW5ndGg+YSYmcy5wdXNoKHtlbGVtOnRoaXMsaGFuZGxlcnM6dC5zbGljZShhKX0pLHN9LHByb3BzOiJhbHRLZXkgYnViYmxlcyBjYW5jZWxhYmxlIGN0cmxLZXkgY3VycmVudFRhcmdldCBldmVudFBoYXNlIG1ldGFLZXkgcmVsYXRlZFRhcmdldCBzaGlmdEtleSB0YXJnZXQgdGltZVN0YW1wIHZpZXcgd2hpY2giLnNwbGl0KCIgIiksZml4SG9va3M6e30sa2V5SG9va3M6e3Byb3BzOiJjaGFyIGNoYXJDb2RlIGtleSBrZXlDb2RlIi5zcGxpdCgiICIpLGZpbHRlcjpmdW5jdGlvbihlLHQpe3JldHVybiBudWxsPT1lLndoaWNoJiYoZS53aGljaD1udWxsIT10LmNoYXJDb2RlP3QuY2hhckNvZGU6dC5rZXlDb2RlKSxlfX0sbW91c2VIb29rczp7cHJvcHM6ImJ1dHRvbiBidXR0b25zIGNsaWVudFggY2xpZW50WSBvZmZzZXRYIG9mZnNldFkgcGFnZVggcGFnZVkgc2NyZWVuWCBzY3JlZW5ZIHRvRWxlbWVudCIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGkscz10LmJ1dHRvbjtyZXR1cm4gbnVsbD09ZS5wYWdlWCYmbnVsbCE9dC5jbGllbnRYJiYobj1lLnRhcmdldC5vd25lckRvY3VtZW50fHxvLHI9bi5kb2N1bWVudEVsZW1lbnQsaT1uLmJvZHksZS5wYWdlWD10LmNsaWVudFgrKHImJnIuc2Nyb2xsTGVmdHx8aSYmaS5zY3JvbGxMZWZ0fHwwKS0ociYmci5jbGllbnRMZWZ0fHxpJiZpLmNsaWVudExlZnR8fDApLGUucGFnZVk9dC5jbGllbnRZKyhyJiZyLnNjcm9sbFRvcHx8aSYmaS5zY3JvbGxUb3B8fDApLShyJiZyLmNsaWVudFRvcHx8aSYmaS5jbGllbnRUb3B8fDApKSxlLndoaWNofHxzPT09dW5kZWZpbmVkfHwoZS53aGljaD0xJnM/MToyJnM/Mzo0JnM/MjowKSxlfX0sZml4OmZ1bmN0aW9uKGUpe2lmKGVbeC5leHBhbmRvXSlyZXR1cm4gZTt2YXIgdCxuLHIsaT1lLnR5cGUscz1lLGE9dGhpcy5maXhIb29rc1tpXTthfHwodGhpcy5maXhIb29rc1tpXT1hPXoudGVzdChpKT90aGlzLm1vdXNlSG9va3M6SS50ZXN0KGkpP3RoaXMua2V5SG9va3M6e30pLHI9YS5wcm9wcz90aGlzLnByb3BzLmNvbmNhdChhLnByb3BzKTp0aGlzLnByb3BzLGU9bmV3IHguRXZlbnQocyksdD1yLmxlbmd0aDt3aGlsZSh0LS0pbj1yW3RdLGVbbl09c1tuXTtyZXR1cm4gZS50YXJnZXR8fChlLnRhcmdldD1vKSwzPT09ZS50YXJnZXQubm9kZVR5cGUmJihlLnRhcmdldD1lLnRhcmdldC5wYXJlbnROb2RlKSxhLmZpbHRlcj9hLmZpbHRlcihlLHMpOmV9LHNwZWNpYWw6e2xvYWQ6e25vQnViYmxlOiEwfSxmb2N1czp7dHJpZ2dlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzIT09VigpJiZ0aGlzLmZvY3VzPyh0aGlzLmZvY3VzKCksITEpOnVuZGVmaW5lZH0sZGVsZWdhdGVUeXBlOiJmb2N1c2luIn0sYmx1cjp7dHJpZ2dlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzPT09VigpJiZ0aGlzLmJsdXI/KHRoaXMuYmx1cigpLCExKTp1bmRlZmluZWR9LGRlbGVnYXRlVHlwZToiZm9jdXNvdXQifSxjbGljazp7dHJpZ2dlcjpmdW5jdGlvbigpe3JldHVybiJjaGVja2JveCI9PT10aGlzLnR5cGUmJnRoaXMuY2xpY2smJngubm9kZU5hbWUodGhpcywiaW5wdXQiKT8odGhpcy5jbGljaygpLCExKTp1bmRlZmluZWR9LF9kZWZhdWx0OmZ1bmN0aW9uKGUpe3JldHVybiB4Lm5vZGVOYW1lKGUudGFyZ2V0LCJhIil9fSxiZWZvcmV1bmxvYWQ6e3Bvc3REaXNwYXRjaDpmdW5jdGlvbihlKXtlLnJlc3VsdCE9PXVuZGVmaW5lZCYmKGUub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT1lLnJlc3VsdCl9fX0sc2ltdWxhdGU6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9eC5leHRlbmQobmV3IHguRXZlbnQsbix7dHlwZTplLGlzU2ltdWxhdGVkOiEwLG9yaWdpbmFsRXZlbnQ6e319KTtyP3guZXZlbnQudHJpZ2dlcihpLG51bGwsdCk6eC5ldmVudC5kaXNwYXRjaC5jYWxsKHQsaSksaS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmbi5wcmV2ZW50RGVmYXVsdCgpfX0seC5yZW1vdmVFdmVudD1mdW5jdGlvbihlLHQsbil7ZS5yZW1vdmVFdmVudExpc3RlbmVyJiZlLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxuLCExKX0seC5FdmVudD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgeC5FdmVudD8oZSYmZS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9ZSx0aGlzLnR5cGU9ZS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWUuZGVmYXVsdFByZXZlbnRlZHx8ZS5nZXRQcmV2ZW50RGVmYXVsdCYmZS5nZXRQcmV2ZW50RGVmYXVsdCgpP1U6WSk6dGhpcy50eXBlPWUsdCYmeC5leHRlbmQodGhpcyx0KSx0aGlzLnRpbWVTdGFtcD1lJiZlLnRpbWVTdGFtcHx8eC5ub3coKSx0aGlzW3guZXhwYW5kb109ITAsdW5kZWZpbmVkKTpuZXcgeC5FdmVudChlLHQpfSx4LkV2ZW50LnByb3RvdHlwZT17aXNEZWZhdWx0UHJldmVudGVkOlksaXNQcm9wYWdhdGlvblN0b3BwZWQ6WSxpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDpZLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPVUsZSYmZS5wcmV2ZW50RGVmYXVsdCYmZS5wcmV2ZW50RGVmYXVsdCgpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1VLGUmJmUuc3RvcFByb3BhZ2F0aW9uJiZlLnN0b3BQcm9wYWdhdGlvbigpfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPVUsdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LHguZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9LGZ1bmN0aW9uKGUsdCl7eC5ldmVudC5zcGVjaWFsW2VdPXtkZWxlZ2F0ZVR5cGU6dCxiaW5kVHlwZTp0LGhhbmRsZTpmdW5jdGlvbihlKXt2YXIgbixyPXRoaXMsaT1lLnJlbGF0ZWRUYXJnZXQsbz1lLmhhbmRsZU9iajtyZXR1cm4oIWl8fGkhPT1yJiYheC5jb250YWlucyhyLGkpKSYmKGUudHlwZT1vLm9yaWdUeXBlLG49by5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxlLnR5cGU9dCksbn19fSkseC5zdXBwb3J0LmZvY3VzaW5CdWJibGVzfHx4LmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKGUsdCl7dmFyIG49MCxyPWZ1bmN0aW9uKGUpe3guZXZlbnQuc2ltdWxhdGUodCxlLnRhcmdldCx4LmV2ZW50LmZpeChlKSwhMCl9O3guZXZlbnQuc3BlY2lhbFt0XT17c2V0dXA6ZnVuY3Rpb24oKXswPT09bisrJiZvLmFkZEV2ZW50TGlzdGVuZXIoZSxyLCEwKX0sdGVhcmRvd246ZnVuY3Rpb24oKXswPT09LS1uJiZvLnJlbW92ZUV2ZW50TGlzdGVuZXIoZSxyLCEwKX19fSkseC5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG8scztpZigib2JqZWN0Ij09dHlwZW9mIGUpeyJzdHJpbmciIT10eXBlb2YgdCYmKG49bnx8dCx0PXVuZGVmaW5lZCk7Zm9yKHMgaW4gZSl0aGlzLm9uKHMsdCxuLGVbc10saSk7cmV0dXJuIHRoaXN9aWYobnVsbD09biYmbnVsbD09cj8ocj10LG49dD11bmRlZmluZWQpOm51bGw9PXImJigic3RyaW5nIj09dHlwZW9mIHQ/KHI9bixuPXVuZGVmaW5lZCk6KHI9bixuPXQsdD11bmRlZmluZWQpKSxyPT09ITEpcj1ZO2Vsc2UgaWYoIXIpcmV0dXJuIHRoaXM7cmV0dXJuIDE9PT1pJiYobz1yLHI9ZnVuY3Rpb24oZSl7cmV0dXJuIHgoKS5vZmYoZSksby5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHIuZ3VpZD1vLmd1aWR8fChvLmd1aWQ9eC5ndWlkKyspKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt4LmV2ZW50LmFkZCh0aGlzLGUscixuLHQpfSl9LG9uZTpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5vbihlLHQsbixyLDEpfSxvZmY6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGk7aWYoZSYmZS5wcmV2ZW50RGVmYXVsdCYmZS5oYW5kbGVPYmopcmV0dXJuIHI9ZS5oYW5kbGVPYmoseChlLmRlbGVnYXRlVGFyZ2V0KS5vZmYoci5uYW1lc3BhY2U/ci5vcmlnVHlwZSsiLiIrci5uYW1lc3BhY2U6ci5vcmlnVHlwZSxyLnNlbGVjdG9yLHIuaGFuZGxlciksdGhpcztpZigib2JqZWN0Ij09dHlwZW9mIGUpe2ZvcihpIGluIGUpdGhpcy5vZmYoaSx0LGVbaV0pO3JldHVybiB0aGlzfXJldHVybih0PT09ITF8fCJmdW5jdGlvbiI9PXR5cGVvZiB0KSYmKG49dCx0PXVuZGVmaW5lZCksbj09PSExJiYobj1ZKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt4LmV2ZW50LnJlbW92ZSh0aGlzLGUsbix0KX0pfSx0cmlnZ2VyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3guZXZlbnQudHJpZ2dlcihlLHQsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzWzBdO3JldHVybiBuP3guZXZlbnQudHJpZ2dlcihlLHQsbiwhMCk6dW5kZWZpbmVkfX0pO3ZhciBHPS9eLlteOiNcW1wuLF0qJC8sSj0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxRPXguZXhwci5tYXRjaC5uZWVkc0NvbnRleHQsSz17Y2hpbGRyZW46ITAsY29udGVudHM6ITAsbmV4dDohMCxwcmV2OiEwfTt4LmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihlKXt2YXIgdCxuPVtdLHI9dGhpcyxpPXIubGVuZ3RoO2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gdGhpcy5wdXNoU3RhY2soeChlKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodD0wO2k+dDt0KyspaWYoeC5jb250YWlucyhyW3RdLHRoaXMpKXJldHVybiEwfSkpO2Zvcih0PTA7aT50O3QrKyl4LmZpbmQoZSxyW3RdLG4pO3JldHVybiBuPXRoaXMucHVzaFN0YWNrKGk+MT94LnVuaXF1ZShuKTpuKSxuLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3I/dGhpcy5zZWxlY3RvcisiICIrZTplLG59LGhhczpmdW5jdGlvbihlKXt2YXIgdD14KGUsdGhpcyksbj10Lmxlbmd0aDtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgZT0wO2Zvcig7bj5lO2UrKylpZih4LmNvbnRhaW5zKHRoaXMsdFtlXSkpcmV0dXJuITB9KX0sbm90OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhldCh0aGlzLGV8fFtdLCEwKSl9LGZpbHRlcjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZXQodGhpcyxlfHxbXSwhMSkpfSxpczpmdW5jdGlvbihlKXtyZXR1cm4hIWV0KHRoaXMsInN0cmluZyI9PXR5cGVvZiBlJiZRLnRlc3QoZSk/eChlKTplfHxbXSwhMSkubGVuZ3RofSxjbG9zZXN0OmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0wLGk9dGhpcy5sZW5ndGgsbz1bXSxzPVEudGVzdChlKXx8InN0cmluZyIhPXR5cGVvZiBlP3goZSx0fHx0aGlzLmNvbnRleHQpOjA7Zm9yKDtpPnI7cisrKWZvcihuPXRoaXNbcl07biYmbiE9PXQ7bj1uLnBhcmVudE5vZGUpaWYoMTE+bi5ub2RlVHlwZSYmKHM/cy5pbmRleChuKT4tMToxPT09bi5ub2RlVHlwZSYmeC5maW5kLm1hdGNoZXNTZWxlY3RvcihuLGUpKSl7bj1vLnB1c2gobik7YnJlYWt9cmV0dXJuIHRoaXMucHVzaFN0YWNrKG8ubGVuZ3RoPjE/eC51bmlxdWUobyk6byl9LGluZGV4OmZ1bmN0aW9uKGUpe3JldHVybiBlPyJzdHJpbmciPT10eXBlb2YgZT9nLmNhbGwoeChlKSx0aGlzWzBdKTpnLmNhbGwodGhpcyxlLmpxdWVyeT9lWzBdOmUpOnRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZT90aGlzLmZpcnN0KCkucHJldkFsbCgpLmxlbmd0aDotMX0sYWRkOmZ1bmN0aW9uKGUsdCl7dmFyIG49InN0cmluZyI9PXR5cGVvZiBlP3goZSx0KTp4Lm1ha2VBcnJheShlJiZlLm5vZGVUeXBlP1tlXTplKSxyPXgubWVyZ2UodGhpcy5nZXQoKSxuKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soeC51bmlxdWUocikpfSxhZGRCYWNrOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmFkZChudWxsPT1lP3RoaXMucHJldk9iamVjdDp0aGlzLnByZXZPYmplY3QuZmlsdGVyKGUpKX19KTtmdW5jdGlvbiBaKGUsdCl7d2hpbGUoKGU9ZVt0XSkmJjEhPT1lLm5vZGVUeXBlKTtyZXR1cm4gZX14LmVhY2goe3BhcmVudDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7cmV0dXJuIHQmJjExIT09dC5ub2RlVHlwZT90Om51bGx9LHBhcmVudHM6ZnVuY3Rpb24oZSl7cmV0dXJuIHguZGlyKGUsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4geC5kaXIoZSwicGFyZW50Tm9kZSIsbil9LG5leHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIFooZSwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbihlKXtyZXR1cm4gWihlLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihlKXtyZXR1cm4geC5kaXIoZSwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbihlKXtyZXR1cm4geC5kaXIoZSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHguZGlyKGUsIm5leHRTaWJsaW5nIixuKX0scHJldlVudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4geC5kaXIoZSwicHJldmlvdXNTaWJsaW5nIixuKX0sc2libGluZ3M6ZnVuY3Rpb24oZSl7cmV0dXJuIHguc2libGluZygoZS5wYXJlbnROb2RlfHx7fSkuZmlyc3RDaGlsZCxlKX0sY2hpbGRyZW46ZnVuY3Rpb24oZSl7cmV0dXJuIHguc2libGluZyhlLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihlKXtyZXR1cm4gZS5jb250ZW50RG9jdW1lbnR8fHgubWVyZ2UoW10sZS5jaGlsZE5vZGVzKX19LGZ1bmN0aW9uKGUsdCl7eC5mbltlXT1mdW5jdGlvbihuLHIpe3ZhciBpPXgubWFwKHRoaXMsdCxuKTtyZXR1cm4iVW50aWwiIT09ZS5zbGljZSgtNSkmJihyPW4pLHImJiJzdHJpbmciPT10eXBlb2YgciYmKGk9eC5maWx0ZXIocixpKSksdGhpcy5sZW5ndGg+MSYmKEtbZV18fHgudW5pcXVlKGkpLEoudGVzdChlKSYmaS5yZXZlcnNlKCkpLHRoaXMucHVzaFN0YWNrKGkpfX0pLHguZXh0ZW5kKHtmaWx0ZXI6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRbMF07cmV0dXJuIG4mJihlPSI6bm90KCIrZSsiKSIpLDE9PT10Lmxlbmd0aCYmMT09PXIubm9kZVR5cGU/eC5maW5kLm1hdGNoZXNTZWxlY3RvcihyLGUpP1tyXTpbXTp4LmZpbmQubWF0Y2hlcyhlLHguZ3JlcCh0LGZ1bmN0aW9uKGUpe3JldHVybiAxPT09ZS5ub2RlVHlwZX0pKX0sZGlyOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1bXSxpPW4hPT11bmRlZmluZWQ7d2hpbGUoKGU9ZVt0XSkmJjkhPT1lLm5vZGVUeXBlKWlmKDE9PT1lLm5vZGVUeXBlKXtpZihpJiZ4KGUpLmlzKG4pKWJyZWFrO3IucHVzaChlKX1yZXR1cm4gcn0sc2libGluZzpmdW5jdGlvbihlLHQpe3ZhciBuPVtdO2Zvcig7ZTtlPWUubmV4dFNpYmxpbmcpMT09PWUubm9kZVR5cGUmJmUhPT10JiZuLnB1c2goZSk7cmV0dXJuIG59fSk7ZnVuY3Rpb24gZXQoZSx0LG4pe2lmKHguaXNGdW5jdGlvbih0KSlyZXR1cm4geC5ncmVwKGUsZnVuY3Rpb24oZSxyKXtyZXR1cm4hIXQuY2FsbChlLHIsZSkhPT1ufSk7aWYodC5ub2RlVHlwZSlyZXR1cm4geC5ncmVwKGUsZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10IT09bn0pO2lmKCJzdHJpbmciPT10eXBlb2YgdCl7aWYoRy50ZXN0KHQpKXJldHVybiB4LmZpbHRlcih0LGUsbik7dD14LmZpbHRlcih0LGUpfXJldHVybiB4LmdyZXAoZSxmdW5jdGlvbihlKXtyZXR1cm4gZy5jYWxsKHQsZSk+PTAhPT1ufSl9dmFyIHR0PS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzpdKylbXj5dKilcLz4vZ2ksbnQ9LzwoW1x3Ol0rKS8scnQ9Lzx8JiM/XHcrOy8saXQ9LzwoPzpzY3JpcHR8c3R5bGV8bGluaykvaSxvdD0vXig/OmNoZWNrYm94fHJhZGlvKSQvaSxzdD0vY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSxhdD0vXiR8XC8oPzpqYXZhfGVjbWEpc2NyaXB0L2ksdXQ9L150cnVlXC8oLiopLyxsdD0vXlxzKjwhKD86XFtDREFUQVxbfC0tKXwoPzpcXVxdfC0tKT5ccyokL2csY3Q9e29wdGlvbjpbMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdLHRoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sX2RlZmF1bHQ6WzAsIiIsIiJdfTtjdC5vcHRncm91cD1jdC5vcHRpb24sY3QudGJvZHk9Y3QudGZvb3Q9Y3QuY29sZ3JvdXA9Y3QuY2FwdGlvbj1jdC50aGVhZCxjdC50aD1jdC50ZCx4LmZuLmV4dGVuZCh7dGV4dDpmdW5jdGlvbihlKXtyZXR1cm4geC5hY2Nlc3ModGhpcyxmdW5jdGlvbihlKXtyZXR1cm4gZT09PXVuZGVmaW5lZD94LnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmFwcGVuZCgodGhpc1swXSYmdGhpc1swXS5vd25lckRvY3VtZW50fHxvKS5jcmVhdGVUZXh0Tm9kZShlKSl9LG51bGwsZSxhcmd1bWVudHMubGVuZ3RoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGUpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgdD1wdCh0aGlzLGUpO3QuYXBwZW5kQ2hpbGQoZSl9fSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oZSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciB0PXB0KHRoaXMsZSk7dC5pbnNlcnRCZWZvcmUoZSx0LmZpcnN0Q2hpbGQpfX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oZSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsdGhpcyl9KX0sYWZ0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oZSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsdGhpcy5uZXh0U2libGluZyl9KX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1lP3guZmlsdGVyKGUsdGhpcyk6dGhpcyxpPTA7Zm9yKDtudWxsIT0obj1yW2ldKTtpKyspdHx8MSE9PW4ubm9kZVR5cGV8fHguY2xlYW5EYXRhKG10KG4pKSxuLnBhcmVudE5vZGUmJih0JiZ4LmNvbnRhaW5zKG4ub3duZXJEb2N1bWVudCxuKSYmZHQobXQobiwic2NyaXB0IikpLG4ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKSk7cmV0dXJuIHRoaXN9LGVtcHR5OmZ1bmN0aW9uKCl7dmFyIGUsdD0wO2Zvcig7bnVsbCE9KGU9dGhpc1t0XSk7dCsrKTE9PT1lLm5vZGVUeXBlJiYoeC5jbGVhbkRhdGEobXQoZSwhMSkpLGUudGV4dENvbnRlbnQ9IiIpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihlLHQpe3JldHVybiBlPW51bGw9PWU/ITE6ZSx0PW51bGw9PXQ/ZTp0LHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIHguY2xvbmUodGhpcyxlLHQpfSl9LGh0bWw6ZnVuY3Rpb24oZSl7cmV0dXJuIHguYWNjZXNzKHRoaXMsZnVuY3Rpb24oZSl7dmFyIHQ9dGhpc1swXXx8e30sbj0wLHI9dGhpcy5sZW5ndGg7aWYoZT09PXVuZGVmaW5lZCYmMT09PXQubm9kZVR5cGUpcmV0dXJuIHQuaW5uZXJIVE1MO2lmKCJzdHJpbmciPT10eXBlb2YgZSYmIWl0LnRlc3QoZSkmJiFjdFsobnQuZXhlYyhlKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2U9ZS5yZXBsYWNlKHR0LCI8JDE+PC8kMj4iKTt0cnl7Zm9yKDtyPm47bisrKXQ9dGhpc1tuXXx8e30sMT09PXQubm9kZVR5cGUmJih4LmNsZWFuRGF0YShtdCh0LCExKSksdC5pbm5lckhUTUw9ZSk7dD0wfWNhdGNoKGkpe319dCYmdGhpcy5lbXB0eSgpLmFwcGVuZChlKX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGgpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbigpe3ZhciBlPXgubWFwKHRoaXMsZnVuY3Rpb24oZSl7cmV0dXJuW2UubmV4dFNpYmxpbmcsZS5wYXJlbnROb2RlXX0pLHQ9MDtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24obil7dmFyIHI9ZVt0KytdLGk9ZVt0KytdO2kmJihyJiZyLnBhcmVudE5vZGUhPT1pJiYocj10aGlzLm5leHRTaWJsaW5nKSx4KHRoaXMpLnJlbW92ZSgpLGkuaW5zZXJ0QmVmb3JlKG4scikpfSwhMCksdD90aGlzOnRoaXMucmVtb3ZlKCl9LGRldGFjaDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yZW1vdmUoZSwhMCl9LGRvbU1hbmlwOmZ1bmN0aW9uKGUsdCxuKXtlPWYuYXBwbHkoW10sZSk7dmFyIHIsaSxvLHMsYSx1LGw9MCxjPXRoaXMubGVuZ3RoLHA9dGhpcyxoPWMtMSxkPWVbMF0sZz14LmlzRnVuY3Rpb24oZCk7aWYoZ3x8ISgxPj1jfHwic3RyaW5nIiE9dHlwZW9mIGR8fHguc3VwcG9ydC5jaGVja0Nsb25lKSYmc3QudGVzdChkKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHIpe3ZhciBpPXAuZXEocik7ZyYmKGVbMF09ZC5jYWxsKHRoaXMscixpLmh0bWwoKSkpLGkuZG9tTWFuaXAoZSx0LG4pfSk7aWYoYyYmKHI9eC5idWlsZEZyYWdtZW50KGUsdGhpc1swXS5vd25lckRvY3VtZW50LCExLCFuJiZ0aGlzKSxpPXIuZmlyc3RDaGlsZCwxPT09ci5jaGlsZE5vZGVzLmxlbmd0aCYmKHI9aSksaSkpe2ZvcihvPXgubWFwKG10KHIsInNjcmlwdCIpLGZ0KSxzPW8ubGVuZ3RoO2M+bDtsKyspYT1yLGwhPT1oJiYoYT14LmNsb25lKGEsITAsITApLHMmJngubWVyZ2UobyxtdChhLCJzY3JpcHQiKSkpLHQuY2FsbCh0aGlzW2xdLGEsbCk7aWYocylmb3IodT1vW28ubGVuZ3RoLTFdLm93bmVyRG9jdW1lbnQseC5tYXAobyxodCksbD0wO3M+bDtsKyspYT1vW2xdLGF0LnRlc3QoYS50eXBlfHwiIikmJiFxLmFjY2VzcyhhLCJnbG9iYWxFdmFsIikmJnguY29udGFpbnModSxhKSYmKGEuc3JjP3guX2V2YWxVcmwoYS5zcmMpOnguZ2xvYmFsRXZhbChhLnRleHRDb250ZW50LnJlcGxhY2UobHQsIiIpKSl9cmV0dXJuIHRoaXN9fSkseC5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24oZSx0KXt4LmZuW2VdPWZ1bmN0aW9uKGUpe3ZhciBuLHI9W10saT14KGUpLG89aS5sZW5ndGgtMSxzPTA7Zm9yKDtvPj1zO3MrKyluPXM9PT1vP3RoaXM6dGhpcy5jbG9uZSghMCkseChpW3NdKVt0XShuKSxoLmFwcGx5KHIsbi5nZXQoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHIpfX0pLHguZXh0ZW5kKHtjbG9uZTpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLHMsYT1lLmNsb25lTm9kZSghMCksdT14LmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKTtpZighKHguc3VwcG9ydC5ub0Nsb25lQ2hlY2tlZHx8MSE9PWUubm9kZVR5cGUmJjExIT09ZS5ub2RlVHlwZXx8eC5pc1hNTERvYyhlKSkpZm9yKHM9bXQoYSksbz1tdChlKSxyPTAsaT1vLmxlbmd0aDtpPnI7cisrKXl0KG9bcl0sc1tyXSk7aWYodClpZihuKWZvcihvPW98fG10KGUpLHM9c3x8bXQoYSkscj0wLGk9by5sZW5ndGg7aT5yO3IrKylndChvW3JdLHNbcl0pO2Vsc2UgZ3QoZSxhKTtyZXR1cm4gcz1tdChhLCJzY3JpcHQiKSxzLmxlbmd0aD4wJiZkdChzLCF1JiZtdChlLCJzY3JpcHQiKSksYX0sYnVpbGRGcmFnbWVudDpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLHMsYSx1LGwsYz0wLHA9ZS5sZW5ndGgsZj10LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxoPVtdO2Zvcig7cD5jO2MrKylpZihpPWVbY10saXx8MD09PWkpaWYoIm9iamVjdCI9PT14LnR5cGUoaSkpeC5tZXJnZShoLGkubm9kZVR5cGU/W2ldOmkpO2Vsc2UgaWYocnQudGVzdChpKSl7bz1vfHxmLmFwcGVuZENoaWxkKHQuY3JlYXRlRWxlbWVudCgiZGl2IikpLHM9KG50LmV4ZWMoaSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksYT1jdFtzXXx8Y3QuX2RlZmF1bHQsby5pbm5lckhUTUw9YVsxXStpLnJlcGxhY2UodHQsIjwkMT48LyQyPiIpK2FbMl0sbD1hWzBdO3doaWxlKGwtLSlvPW8ubGFzdENoaWxkO3gubWVyZ2UoaCxvLmNoaWxkTm9kZXMpLG89Zi5maXJzdENoaWxkLG8udGV4dENvbnRlbnQ9IiJ9ZWxzZSBoLnB1c2godC5jcmVhdGVUZXh0Tm9kZShpKSk7Zi50ZXh0Q29udGVudD0iIixjPTA7d2hpbGUoaT1oW2MrK10paWYoKCFyfHwtMT09PXguaW5BcnJheShpLHIpKSYmKHU9eC5jb250YWlucyhpLm93bmVyRG9jdW1lbnQsaSksbz1tdChmLmFwcGVuZENoaWxkKGkpLCJzY3JpcHQiKSx1JiZkdChvKSxuKSl7bD0wO3doaWxlKGk9b1tsKytdKWF0LnRlc3QoaS50eXBlfHwiIikmJm4ucHVzaChpKX1yZXR1cm4gZn0sY2xlYW5EYXRhOmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpLG8scyxhPXguZXZlbnQuc3BlY2lhbCx1PTA7Zm9yKDsobj1lW3VdKSE9PXVuZGVmaW5lZDt1Kyspe2lmKEYuYWNjZXB0cyhuKSYmKG89bltxLmV4cGFuZG9dLG8mJih0PXEuY2FjaGVbb10pKSl7aWYocj1PYmplY3Qua2V5cyh0LmV2ZW50c3x8e30pLHIubGVuZ3RoKWZvcihzPTA7KGk9cltzXSkhPT11bmRlZmluZWQ7cysrKWFbaV0/eC5ldmVudC5yZW1vdmUobixpKTp4LnJlbW92ZUV2ZW50KG4saSx0LmhhbmRsZSk7cS5jYWNoZVtvXSYmZGVsZXRlIHEuY2FjaGVbb119ZGVsZXRlIEwuY2FjaGVbbltMLmV4cGFuZG9dXX19LF9ldmFsVXJsOmZ1bmN0aW9uKGUpe3JldHVybiB4LmFqYXgoe3VybDplLHR5cGU6IkdFVCIsZGF0YVR5cGU6InNjcmlwdCIsYXN5bmM6ITEsZ2xvYmFsOiExLCJ0aHJvd3MiOiEwfSl9fSk7ZnVuY3Rpb24gcHQoZSx0KXtyZXR1cm4geC5ub2RlTmFtZShlLCJ0YWJsZSIpJiZ4Lm5vZGVOYW1lKDE9PT10Lm5vZGVUeXBlP3Q6dC5maXJzdENoaWxkLCJ0ciIpP2UuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IilbMF18fGUuYXBwZW5kQ2hpbGQoZS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRib2R5IikpOmV9ZnVuY3Rpb24gZnQoZSl7cmV0dXJuIGUudHlwZT0obnVsbCE9PWUuZ2V0QXR0cmlidXRlKCJ0eXBlIikpKyIvIitlLnR5cGUsZX1mdW5jdGlvbiBodChlKXt2YXIgdD11dC5leGVjKGUudHlwZSk7cmV0dXJuIHQ/ZS50eXBlPXRbMV06ZS5yZW1vdmVBdHRyaWJ1dGUoInR5cGUiKSxlfWZ1bmN0aW9uIGR0KGUsdCl7dmFyIG49ZS5sZW5ndGgscj0wO2Zvcig7bj5yO3IrKylxLnNldChlW3JdLCJnbG9iYWxFdmFsIiwhdHx8cS5nZXQodFtyXSwiZ2xvYmFsRXZhbCIpKX1mdW5jdGlvbiBndChlLHQpe3ZhciBuLHIsaSxvLHMsYSx1LGw7aWYoMT09PXQubm9kZVR5cGUpe2lmKHEuaGFzRGF0YShlKSYmKG89cS5hY2Nlc3MoZSkscz1xLnNldCh0LG8pLGw9by5ldmVudHMpKXtkZWxldGUgcy5oYW5kbGUscy5ldmVudHM9e307Zm9yKGkgaW4gbClmb3Iobj0wLHI9bFtpXS5sZW5ndGg7cj5uO24rKyl4LmV2ZW50LmFkZCh0LGksbFtpXVtuXSl9TC5oYXNEYXRhKGUpJiYoYT1MLmFjY2VzcyhlKSx1PXguZXh0ZW5kKHt9LGEpLEwuc2V0KHQsdSkpfX1mdW5jdGlvbiBtdChlLHQpe3ZhciBuPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWU/ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0fHwiKiIpOmUucXVlcnlTZWxlY3RvckFsbD9lLnF1ZXJ5U2VsZWN0b3JBbGwodHx8IioiKTpbXTtyZXR1cm4gdD09PXVuZGVmaW5lZHx8dCYmeC5ub2RlTmFtZShlLHQpP3gubWVyZ2UoW2VdLG4pOm59ZnVuY3Rpb24geXQoZSx0KXt2YXIgbj10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7ImlucHV0Ij09PW4mJm90LnRlc3QoZS50eXBlKT90LmNoZWNrZWQ9ZS5jaGVja2VkOigiaW5wdXQiPT09bnx8InRleHRhcmVhIj09PW4pJiYodC5kZWZhdWx0VmFsdWU9ZS5kZWZhdWx0VmFsdWUpfXguZm4uZXh0ZW5kKHt3cmFwQWxsOmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiB4LmlzRnVuY3Rpb24oZSk/dGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3godGhpcykud3JhcEFsbChlLmNhbGwodGhpcyx0KSl9KToodGhpc1swXSYmKHQ9eChlLHRoaXNbMF0ub3duZXJEb2N1bWVudCkuZXEoMCkuY2xvbmUoITApLHRoaXNbMF0ucGFyZW50Tm9kZSYmdC5pbnNlcnRCZWZvcmUodGhpc1swXSksdC5tYXAoZnVuY3Rpb24oKXt2YXIgZT10aGlzO3doaWxlKGUuZmlyc3RFbGVtZW50Q2hpbGQpZT1lLmZpcnN0RWxlbWVudENoaWxkO3JldHVybiBlfSkuYXBwZW5kKHRoaXMpKSx0aGlzKX0sd3JhcElubmVyOmZ1bmN0aW9uKGUpe3JldHVybiB4LmlzRnVuY3Rpb24oZSk/dGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3godGhpcykud3JhcElubmVyKGUuY2FsbCh0aGlzLHQpKX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0PXgodGhpcyksbj10LmNvbnRlbnRzKCk7bi5sZW5ndGg/bi53cmFwQWxsKGUpOnQuYXBwZW5kKGUpfSl9LHdyYXA6ZnVuY3Rpb24oZSl7dmFyIHQ9eC5pc0Z1bmN0aW9uKGUpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24obil7eCh0aGlzKS53cmFwQWxsKHQ/ZS5jYWxsKHRoaXMsbik6ZSl9KX0sdW53cmFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaChmdW5jdGlvbigpe3gubm9kZU5hbWUodGhpcywiYm9keSIpfHx4KHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KS5lbmQoKX19KTt2YXIgdnQseHQsYnQ9L14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLHd0PS9ebWFyZ2luLyxUdD1SZWdFeHAoIl4oIitiKyIpKC4qKSQiLCJpIiksQ3Q9UmVnRXhwKCJeKCIrYisiKSg/IXB4KVthLXolXSskIiwiaSIpLGt0PVJlZ0V4cCgiXihbKy1dKT0oIitiKyIpIiwiaSIpLE50PXtCT0RZOiJibG9jayJ9LEV0PXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxTdD17bGV0dGVyU3BhY2luZzowLGZvbnRXZWlnaHQ6NDAwfSxqdD1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLER0PVsiV2Via2l0IiwiTyIsIk1veiIsIm1zIl07ZnVuY3Rpb24gQXQoZSx0KXtpZih0IGluIGUpcmV0dXJuIHQ7dmFyIG49dC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpLHI9dCxpPUR0Lmxlbmd0aDt3aGlsZShpLS0paWYodD1EdFtpXStuLHQgaW4gZSlyZXR1cm4gdDtyZXR1cm4gcn1mdW5jdGlvbiBMdChlLHQpe3JldHVybiBlPXR8fGUsIm5vbmUiPT09eC5jc3MoZSwiZGlzcGxheSIpfHwheC5jb250YWlucyhlLm93bmVyRG9jdW1lbnQsZSl9ZnVuY3Rpb24gcXQodCl7cmV0dXJuIGUuZ2V0Q29tcHV0ZWRTdHlsZSh0LG51bGwpfWZ1bmN0aW9uIEh0KGUsdCl7dmFyIG4scixpLG89W10scz0wLGE9ZS5sZW5ndGg7Zm9yKDthPnM7cysrKXI9ZVtzXSxyLnN0eWxlJiYob1tzXT1xLmdldChyLCJvbGRkaXNwbGF5Iiksbj1yLnN0eWxlLmRpc3BsYXksdD8ob1tzXXx8Im5vbmUiIT09bnx8KHIuc3R5bGUuZGlzcGxheT0iIiksIiI9PT1yLnN0eWxlLmRpc3BsYXkmJkx0KHIpJiYob1tzXT1xLmFjY2VzcyhyLCJvbGRkaXNwbGF5IixSdChyLm5vZGVOYW1lKSkpKTpvW3NdfHwoaT1MdChyKSwobiYmIm5vbmUiIT09bnx8IWkpJiZxLnNldChyLCJvbGRkaXNwbGF5IixpP246eC5jc3MociwiZGlzcGxheSIpKSkpO2ZvcihzPTA7YT5zO3MrKylyPWVbc10sci5zdHlsZSYmKHQmJiJub25lIiE9PXIuc3R5bGUuZGlzcGxheSYmIiIhPT1yLnN0eWxlLmRpc3BsYXl8fChyLnN0eWxlLmRpc3BsYXk9dD9vW3NdfHwiIjoibm9uZSIpKTtyZXR1cm4gZX14LmZuLmV4dGVuZCh7Y3NzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHguYWNjZXNzKHRoaXMsZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz17fSxzPTA7aWYoeC5pc0FycmF5KHQpKXtmb3Iocj1xdChlKSxpPXQubGVuZ3RoO2k+cztzKyspb1t0W3NdXT14LmNzcyhlLHRbc10sITEscik7cmV0dXJuIG99cmV0dXJuIG4hPT11bmRlZmluZWQ/eC5zdHlsZShlLHQsbik6eC5jc3MoZSx0KX0sZSx0LGFyZ3VtZW50cy5sZW5ndGg+MSl9LHNob3c6ZnVuY3Rpb24oKXtyZXR1cm4gSHQodGhpcywhMCl9LGhpZGU6ZnVuY3Rpb24oKXtyZXR1cm4gSHQodGhpcyl9LHRvZ2dsZTpmdW5jdGlvbihlKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBlP2U/dGhpcy5zaG93KCk6dGhpcy5oaWRlKCk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7THQodGhpcyk/eCh0aGlzKS5zaG93KCk6eCh0aGlzKS5oaWRlKCl9KX19KSx4LmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihlLHQpe2lmKHQpe3ZhciBuPXZ0KGUsIm9wYWNpdHkiKTtyZXR1cm4iIj09PW4/IjEiOm59fX19LGNzc051bWJlcjp7Y29sdW1uQ291bnQ6ITAsZmlsbE9wYWNpdHk6ITAsZm9udFdlaWdodDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITB9LGNzc1Byb3BzOnsiZmxvYXQiOiJjc3NGbG9hdCJ9LHN0eWxlOmZ1bmN0aW9uKGUsdCxuLHIpe2lmKGUmJjMhPT1lLm5vZGVUeXBlJiY4IT09ZS5ub2RlVHlwZSYmZS5zdHlsZSl7dmFyIGksbyxzLGE9eC5jYW1lbENhc2UodCksdT1lLnN0eWxlO3JldHVybiB0PXguY3NzUHJvcHNbYV18fCh4LmNzc1Byb3BzW2FdPUF0KHUsYSkpLHM9eC5jc3NIb29rc1t0XXx8eC5jc3NIb29rc1thXSxuPT09dW5kZWZpbmVkP3MmJiJnZXQiaW4gcyYmKGk9cy5nZXQoZSwhMSxyKSkhPT11bmRlZmluZWQ/aTp1W3RdOihvPXR5cGVvZiBuLCJzdHJpbmciPT09byYmKGk9a3QuZXhlYyhuKSkmJihuPShpWzFdKzEpKmlbMl0rcGFyc2VGbG9hdCh4LmNzcyhlLHQpKSxvPSJudW1iZXIiKSxudWxsPT1ufHwibnVtYmVyIj09PW8mJmlzTmFOKG4pfHwoIm51bWJlciIhPT1vfHx4LmNzc051bWJlclthXXx8KG4rPSJweCIpLHguc3VwcG9ydC5jbGVhckNsb25lU3R5bGV8fCIiIT09bnx8MCE9PXQuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwodVt0XT0iaW5oZXJpdCIpLHMmJiJzZXQiaW4gcyYmKG49cy5zZXQoZSxuLHIpKT09PXVuZGVmaW5lZHx8KHVbdF09bikpLHVuZGVmaW5lZCl9fSxjc3M6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxzLGE9eC5jYW1lbENhc2UodCk7cmV0dXJuIHQ9eC5jc3NQcm9wc1thXXx8KHguY3NzUHJvcHNbYV09QXQoZS5zdHlsZSxhKSkscz14LmNzc0hvb2tzW3RdfHx4LmNzc0hvb2tzW2FdLHMmJiJnZXQiaW4gcyYmKGk9cy5nZXQoZSwhMCxuKSksaT09PXVuZGVmaW5lZCYmKGk9dnQoZSx0LHIpKSwibm9ybWFsIj09PWkmJnQgaW4gU3QmJihpPVN0W3RdKSwiIj09PW58fG4/KG89cGFyc2VGbG9hdChpKSxuPT09ITB8fHguaXNOdW1lcmljKG8pP298fDA6aSk6aX19KSx2dD1mdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLHM9bnx8cXQoZSksYT1zP3MuZ2V0UHJvcGVydHlWYWx1ZSh0KXx8c1t0XTp1bmRlZmluZWQsdT1lLnN0eWxlO3JldHVybiBzJiYoIiIhPT1hfHx4LmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKXx8KGE9eC5zdHlsZShlLHQpKSxDdC50ZXN0KGEpJiZ3dC50ZXN0KHQpJiYocj11LndpZHRoLGk9dS5taW5XaWR0aCxvPXUubWF4V2lkdGgsdS5taW5XaWR0aD11Lm1heFdpZHRoPXUud2lkdGg9YSxhPXMud2lkdGgsdS53aWR0aD1yLHUubWluV2lkdGg9aSx1Lm1heFdpZHRoPW8pKSxhfTtmdW5jdGlvbiBPdChlLHQsbil7dmFyIHI9VHQuZXhlYyh0KTtyZXR1cm4gcj9NYXRoLm1heCgwLHJbMV0tKG58fDApKSsoclsyXXx8InB4Iik6dH1mdW5jdGlvbiBGdChlLHQsbixyLGkpe3ZhciBvPW49PT0ocj8iYm9yZGVyIjoiY29udGVudCIpPzQ6IndpZHRoIj09PXQ/MTowLHM9MDtmb3IoOzQ+bztvKz0yKSJtYXJnaW4iPT09biYmKHMrPXguY3NzKGUsbitqdFtvXSwhMCxpKSkscj8oImNvbnRlbnQiPT09biYmKHMtPXguY3NzKGUsInBhZGRpbmciK2p0W29dLCEwLGkpKSwibWFyZ2luIiE9PW4mJihzLT14LmNzcyhlLCJib3JkZXIiK2p0W29dKyJXaWR0aCIsITAsaSkpKToocys9eC5jc3MoZSwicGFkZGluZyIranRbb10sITAsaSksInBhZGRpbmciIT09biYmKHMrPXguY3NzKGUsImJvcmRlciIranRbb10rIldpZHRoIiwhMCxpKSkpO3JldHVybiBzfWZ1bmN0aW9uIFB0KGUsdCxuKXt2YXIgcj0hMCxpPSJ3aWR0aCI9PT10P2Uub2Zmc2V0V2lkdGg6ZS5vZmZzZXRIZWlnaHQsbz1xdChlKSxzPXguc3VwcG9ydC5ib3hTaXppbmcmJiJib3JkZXItYm94Ij09PXguY3NzKGUsImJveFNpemluZyIsITEsbyk7aWYoMD49aXx8bnVsbD09aSl7aWYoaT12dChlLHQsbyksKDA+aXx8bnVsbD09aSkmJihpPWUuc3R5bGVbdF0pLEN0LnRlc3QoaSkpcmV0dXJuIGk7cj1zJiYoeC5zdXBwb3J0LmJveFNpemluZ1JlbGlhYmxlfHxpPT09ZS5zdHlsZVt0XSksaT1wYXJzZUZsb2F0KGkpfHwwfXJldHVybiBpK0Z0KGUsdCxufHwocz8iYm9yZGVyIjoiY29udGVudCIpLHIsbykrInB4In1mdW5jdGlvbiBSdChlKXt2YXIgdD1vLG49TnRbZV07cmV0dXJuIG58fChuPU10KGUsdCksIm5vbmUiIT09biYmbnx8KHh0PSh4dHx8eCgiPGlmcmFtZSBmcmFtZWJvcmRlcj0nMCcgd2lkdGg9JzAnIGhlaWdodD0nMCcvPiIpLmNzcygiY3NzVGV4dCIsImRpc3BsYXk6YmxvY2sgIWltcG9ydGFudCIpKS5hcHBlbmRUbyh0LmRvY3VtZW50RWxlbWVudCksdD0oeHRbMF0uY29udGVudFdpbmRvd3x8eHRbMF0uY29udGVudERvY3VtZW50KS5kb2N1bWVudCx0LndyaXRlKCI8IWRvY3R5cGUgaHRtbD48aHRtbD48Ym9keT4iKSx0LmNsb3NlKCksbj1NdChlLHQpLHh0LmRldGFjaCgpKSxOdFtlXT1uKSxufWZ1bmN0aW9uIE10KGUsdCl7dmFyIG49eCh0LmNyZWF0ZUVsZW1lbnQoZSkpLmFwcGVuZFRvKHQuYm9keSkscj14LmNzcyhuWzBdLCJkaXNwbGF5Iik7cmV0dXJuIG4ucmVtb3ZlKCkscn14LmVhY2goWyJoZWlnaHQiLCJ3aWR0aCJdLGZ1bmN0aW9uKGUsdCl7eC5jc3NIb29rc1t0XT17Z2V0OmZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gbj8wPT09ZS5vZmZzZXRXaWR0aCYmYnQudGVzdCh4LmNzcyhlLCJkaXNwbGF5IikpP3guc3dhcChlLEV0LGZ1bmN0aW9uKCl7cmV0dXJuIFB0KGUsdCxyKX0pOlB0KGUsdCxyKTp1bmRlZmluZWR9LHNldDpmdW5jdGlvbihlLG4scil7dmFyIGk9ciYmcXQoZSk7cmV0dXJuIE90KGUsbixyP0Z0KGUsdCxyLHguc3VwcG9ydC5ib3hTaXppbmcmJiJib3JkZXItYm94Ij09PXguY3NzKGUsImJveFNpemluZyIsITEsaSksaSk6MCl9fX0pLHgoZnVuY3Rpb24oKXt4LnN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodHx8KHguY3NzSG9va3MubWFyZ2luUmlnaHQ9e2dldDpmdW5jdGlvbihlLHQpe3JldHVybiB0P3guc3dhcChlLHtkaXNwbGF5OiJpbmxpbmUtYmxvY2sifSx2dCxbZSwibWFyZ2luUmlnaHQiXSk6dW5kZWZpbmVkfX0pLCF4LnN1cHBvcnQucGl4ZWxQb3NpdGlvbiYmeC5mbi5wb3NpdGlvbiYmeC5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKGUsdCl7eC5jc3NIb29rc1t0XT17Z2V0OmZ1bmN0aW9uKGUsbil7cmV0dXJuIG4/KG49dnQoZSx0KSxDdC50ZXN0KG4pP3goZSkucG9zaXRpb24oKVt0XSsicHgiOm4pOnVuZGVmaW5lZH19fSl9KSx4LmV4cHImJnguZXhwci5maWx0ZXJzJiYoeC5leHByLmZpbHRlcnMuaGlkZGVuPWZ1bmN0aW9uKGUpe3JldHVybiAwPj1lLm9mZnNldFdpZHRoJiYwPj1lLm9mZnNldEhlaWdodH0seC5leHByLmZpbHRlcnMudmlzaWJsZT1mdW5jdGlvbihlKXtyZXR1cm4heC5leHByLmZpbHRlcnMuaGlkZGVuKGUpfSkseC5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24oZSx0KXt4LmNzc0hvb2tzW2UrdF09e2V4cGFuZDpmdW5jdGlvbihuKXt2YXIgcj0wLGk9e30sbz0ic3RyaW5nIj09dHlwZW9mIG4/bi5zcGxpdCgiICIpOltuXTtmb3IoOzQ+cjtyKyspaVtlK2p0W3JdK3RdPW9bcl18fG9bci0yXXx8b1swXTtyZXR1cm4gaX19LHd0LnRlc3QoZSl8fCh4LmNzc0hvb2tzW2UrdF0uc2V0PU90KX0pO3ZhciBXdD0vJTIwL2csJHQ9L1xbXF0kLyxCdD0vXHI/XG4vZyxJdD0vXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksenQ9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO3guZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4geC5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBlPXgucHJvcCh0aGlzLCJlbGVtZW50cyIpO3JldHVybiBlP3gubWFrZUFycmF5KGUpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgZT10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIXgodGhpcykuaXMoIjpkaXNhYmxlZCIpJiZ6dC50ZXN0KHRoaXMubm9kZU5hbWUpJiYhSXQudGVzdChlKSYmKHRoaXMuY2hlY2tlZHx8IW90LnRlc3QoZSkpfSkubWFwKGZ1bmN0aW9uKGUsdCl7dmFyIG49eCh0aGlzKS52YWwoKTtyZXR1cm4gbnVsbD09bj9udWxsOnguaXNBcnJheShuKT94Lm1hcChuLGZ1bmN0aW9uKGUpe3JldHVybntuYW1lOnQubmFtZSx2YWx1ZTplLnJlcGxhY2UoQnQsIlxyXG4iKX19KTp7bmFtZTp0Lm5hbWUsdmFsdWU6bi5yZXBsYWNlKEJ0LCJcclxuIil9fSkuZ2V0KCl9fSkseC5wYXJhbT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9W10saT1mdW5jdGlvbihlLHQpe3Q9eC5pc0Z1bmN0aW9uKHQpP3QoKTpudWxsPT10PyIiOnQscltyLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGUpKyI9IitlbmNvZGVVUklDb21wb25lbnQodCl9O2lmKHQ9PT11bmRlZmluZWQmJih0PXguYWpheFNldHRpbmdzJiZ4LmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCkseC5pc0FycmF5KGUpfHxlLmpxdWVyeSYmIXguaXNQbGFpbk9iamVjdChlKSl4LmVhY2goZSxmdW5jdGlvbigpe2kodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IobiBpbiBlKV90KG4sZVtuXSx0LGkpO3JldHVybiByLmpvaW4oIiYiKS5yZXBsYWNlKFd0LCIrIil9O2Z1bmN0aW9uIF90KGUsdCxuLHIpe3ZhciBpO2lmKHguaXNBcnJheSh0KSl4LmVhY2godCxmdW5jdGlvbih0LGkpe258fCR0LnRlc3QoZSk/cihlLGkpOl90KGUrIlsiKygib2JqZWN0Ij09dHlwZW9mIGk/dDoiIikrIl0iLGksbixyKX0pO2Vsc2UgaWYobnx8Im9iamVjdCIhPT14LnR5cGUodCkpcihlLHQpO2Vsc2UgZm9yKGkgaW4gdClfdChlKyJbIitpKyJdIix0W2ldLG4scil9eC5lYWNoKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgbG9hZCByZXNpemUgc2Nyb2xsIHVubG9hZCBjbGljayBkYmxjbGljayBtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGVycm9yIGNvbnRleHRtZW51Ii5zcGxpdCgiICIpLGZ1bmN0aW9uKGUsdCl7eC5mblt0XT1mdW5jdGlvbihlLG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjA/dGhpcy5vbih0LG51bGwsZSxuKTp0aGlzLnRyaWdnZXIodCl9fSkseC5mbi5leHRlbmQoe2hvdmVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMubW91c2VlbnRlcihlKS5tb3VzZWxlYXZlKHR8fGUpfSxiaW5kOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5vbihlLG51bGwsdCxuKX0sdW5iaW5kOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMub2ZmKGUsbnVsbCx0KQorfSxkZWxlZ2F0ZTpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5vbih0LGUsbixyKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMub2ZmKGUsIioqIik6dGhpcy5vZmYodCxlfHwiKioiLG4pfX0pO3ZhciBYdCxVdCxZdD14Lm5vdygpLFZ0PS9cPy8sR3Q9LyMuKiQvLEp0PS8oWz8mXSlfPVteJl0qLyxRdD0vXiguKj8pOlsgXHRdKihbXlxyXG5dKikkL2dtLEt0PS9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLFp0PS9eKD86R0VUfEhFQUQpJC8sZW49L15cL1wvLyx0bj0vXihbXHcuKy1dKzopKD86XC9cLyhbXlwvPyM6XSopKD86OihcZCspfCl8KS8sbm49eC5mbi5sb2FkLHJuPXt9LG9uPXt9LHNuPSIqLyIuY29uY2F0KCIqIik7dHJ5e1V0PWkuaHJlZn1jYXRjaChhbil7VXQ9by5jcmVhdGVFbGVtZW50KCJhIiksVXQuaHJlZj0iIixVdD1VdC5ocmVmfVh0PXRuLmV4ZWMoVXQudG9Mb3dlckNhc2UoKSl8fFtdO2Z1bmN0aW9uIHVuKGUpe3JldHVybiBmdW5jdGlvbih0LG4peyJzdHJpbmciIT10eXBlb2YgdCYmKG49dCx0PSIqIik7dmFyIHIsaT0wLG89dC50b0xvd2VyQ2FzZSgpLm1hdGNoKHcpfHxbXTtpZih4LmlzRnVuY3Rpb24obikpd2hpbGUocj1vW2krK10pIisiPT09clswXT8ocj1yLnNsaWNlKDEpfHwiKiIsKGVbcl09ZVtyXXx8W10pLnVuc2hpZnQobikpOihlW3JdPWVbcl18fFtdKS5wdXNoKG4pfX1mdW5jdGlvbiBsbihlLHQsbixyKXt2YXIgaT17fSxvPWU9PT1vbjtmdW5jdGlvbiBzKGEpe3ZhciB1O3JldHVybiBpW2FdPSEwLHguZWFjaChlW2FdfHxbXSxmdW5jdGlvbihlLGEpe3ZhciBsPWEodCxuLHIpO3JldHVybiJzdHJpbmciIT10eXBlb2YgbHx8b3x8aVtsXT9vPyEodT1sKTp1bmRlZmluZWQ6KHQuZGF0YVR5cGVzLnVuc2hpZnQobCkscyhsKSwhMSl9KSx1fXJldHVybiBzKHQuZGF0YVR5cGVzWzBdKXx8IWlbIioiXSYmcygiKiIpfWZ1bmN0aW9uIGNuKGUsdCl7dmFyIG4scixpPXguYWpheFNldHRpbmdzLmZsYXRPcHRpb25zfHx7fTtmb3IobiBpbiB0KXRbbl0hPT11bmRlZmluZWQmJigoaVtuXT9lOnJ8fChyPXt9KSlbbl09dFtuXSk7cmV0dXJuIHImJnguZXh0ZW5kKCEwLGUsciksZX14LmZuLmxvYWQ9ZnVuY3Rpb24oZSx0LG4pe2lmKCJzdHJpbmciIT10eXBlb2YgZSYmbm4pcmV0dXJuIG5uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgcixpLG8scz10aGlzLGE9ZS5pbmRleE9mKCIgIik7cmV0dXJuIGE+PTAmJihyPWUuc2xpY2UoYSksZT1lLnNsaWNlKDAsYSkpLHguaXNGdW5jdGlvbih0KT8obj10LHQ9dW5kZWZpbmVkKTp0JiYib2JqZWN0Ij09dHlwZW9mIHQmJihpPSJQT1NUIikscy5sZW5ndGg+MCYmeC5hamF4KHt1cmw6ZSx0eXBlOmksZGF0YVR5cGU6Imh0bWwiLGRhdGE6dH0pLmRvbmUoZnVuY3Rpb24oZSl7bz1hcmd1bWVudHMscy5odG1sKHI/eCgiPGRpdj4iKS5hcHBlbmQoeC5wYXJzZUhUTUwoZSkpLmZpbmQocik6ZSl9KS5jb21wbGV0ZShuJiZmdW5jdGlvbihlLHQpe3MuZWFjaChuLG98fFtlLnJlc3BvbnNlVGV4dCx0LGVdKX0pLHRoaXN9LHguZWFjaChbImFqYXhTdGFydCIsImFqYXhTdG9wIiwiYWpheENvbXBsZXRlIiwiYWpheEVycm9yIiwiYWpheFN1Y2Nlc3MiLCJhamF4U2VuZCJdLGZ1bmN0aW9uKGUsdCl7eC5mblt0XT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vbih0LGUpfX0pLHguZXh0ZW5kKHthY3RpdmU6MCxsYXN0TW9kaWZpZWQ6e30sZXRhZzp7fSxhamF4U2V0dGluZ3M6e3VybDpVdCx0eXBlOiJHRVQiLGlzTG9jYWw6S3QudGVzdChYdFsxXSksZ2xvYmFsOiEwLHByb2Nlc3NEYXRhOiEwLGFzeW5jOiEwLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiLGFjY2VwdHM6eyIqIjpzbix0ZXh0OiJ0ZXh0L3BsYWluIixodG1sOiJ0ZXh0L2h0bWwiLHhtbDoiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0In0sY29udGVudHM6e3htbDoveG1sLyxodG1sOi9odG1sLyxqc29uOi9qc29uL30scmVzcG9uc2VGaWVsZHM6e3htbDoicmVzcG9uc2VYTUwiLHRleHQ6InJlc3BvbnNlVGV4dCIsanNvbjoicmVzcG9uc2VKU09OIn0sY29udmVydGVyczp7IiogdGV4dCI6U3RyaW5nLCJ0ZXh0IGh0bWwiOiEwLCJ0ZXh0IGpzb24iOngucGFyc2VKU09OLCJ0ZXh0IHhtbCI6eC5wYXJzZVhNTH0sZmxhdE9wdGlvbnM6e3VybDohMCxjb250ZXh0OiEwfX0sYWpheFNldHVwOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/Y24oY24oZSx4LmFqYXhTZXR0aW5ncyksdCk6Y24oeC5hamF4U2V0dGluZ3MsZSl9LGFqYXhQcmVmaWx0ZXI6dW4ocm4pLGFqYXhUcmFuc3BvcnQ6dW4ob24pLGFqYXg6ZnVuY3Rpb24oZSx0KXsib2JqZWN0Ij09dHlwZW9mIGUmJih0PWUsZT11bmRlZmluZWQpLHQ9dHx8e307dmFyIG4scixpLG8scyxhLHUsbCxjPXguYWpheFNldHVwKHt9LHQpLHA9Yy5jb250ZXh0fHxjLGY9Yy5jb250ZXh0JiYocC5ub2RlVHlwZXx8cC5qcXVlcnkpP3gocCk6eC5ldmVudCxoPXguRGVmZXJyZWQoKSxkPXguQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLGc9Yy5zdGF0dXNDb2RlfHx7fSxtPXt9LHk9e30sdj0wLGI9ImNhbmNlbGVkIixUPXtyZWFkeVN0YXRlOjAsZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoMj09PXYpe2lmKCFvKXtvPXt9O3doaWxlKHQ9UXQuZXhlYyhpKSlvW3RbMV0udG9Mb3dlckNhc2UoKV09dFsyXX10PW9bZS50b0xvd2VyQ2FzZSgpXX1yZXR1cm4gbnVsbD09dD9udWxsOnR9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiAyPT09dj9pOm51bGx9LHNldFJlcXVlc3RIZWFkZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIHZ8fChlPXlbbl09eVtuXXx8ZSxtW2VdPXQpLHRoaXN9LG92ZXJyaWRlTWltZVR5cGU6ZnVuY3Rpb24oZSl7cmV0dXJuIHZ8fChjLm1pbWVUeXBlPWUpLHRoaXN9LHN0YXR1c0NvZGU6ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoZSlpZigyPnYpZm9yKHQgaW4gZSlnW3RdPVtnW3RdLGVbdF1dO2Vsc2UgVC5hbHdheXMoZVtULnN0YXR1c10pO3JldHVybiB0aGlzfSxhYm9ydDpmdW5jdGlvbihlKXt2YXIgdD1lfHxiO3JldHVybiBuJiZuLmFib3J0KHQpLGsoMCx0KSx0aGlzfX07aWYoaC5wcm9taXNlKFQpLmNvbXBsZXRlPWQuYWRkLFQuc3VjY2Vzcz1ULmRvbmUsVC5lcnJvcj1ULmZhaWwsYy51cmw9KChlfHxjLnVybHx8VXQpKyIiKS5yZXBsYWNlKEd0LCIiKS5yZXBsYWNlKGVuLFh0WzFdKyIvLyIpLGMudHlwZT10Lm1ldGhvZHx8dC50eXBlfHxjLm1ldGhvZHx8Yy50eXBlLGMuZGF0YVR5cGVzPXgudHJpbShjLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkubWF0Y2godyl8fFsiIl0sbnVsbD09Yy5jcm9zc0RvbWFpbiYmKGE9dG4uZXhlYyhjLnVybC50b0xvd2VyQ2FzZSgpKSxjLmNyb3NzRG9tYWluPSEoIWF8fGFbMV09PT1YdFsxXSYmYVsyXT09PVh0WzJdJiYoYVszXXx8KCJodHRwOiI9PT1hWzFdPyI4MCI6IjQ0MyIpKT09PShYdFszXXx8KCJodHRwOiI9PT1YdFsxXT8iODAiOiI0NDMiKSkpKSxjLmRhdGEmJmMucHJvY2Vzc0RhdGEmJiJzdHJpbmciIT10eXBlb2YgYy5kYXRhJiYoYy5kYXRhPXgucGFyYW0oYy5kYXRhLGMudHJhZGl0aW9uYWwpKSxsbihybixjLHQsVCksMj09PXYpcmV0dXJuIFQ7dT1jLmdsb2JhbCx1JiYwPT09eC5hY3RpdmUrKyYmeC5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKSxjLnR5cGU9Yy50eXBlLnRvVXBwZXJDYXNlKCksYy5oYXNDb250ZW50PSFadC50ZXN0KGMudHlwZSkscj1jLnVybCxjLmhhc0NvbnRlbnR8fChjLmRhdGEmJihyPWMudXJsKz0oVnQudGVzdChyKT8iJiI6Ij8iKStjLmRhdGEsZGVsZXRlIGMuZGF0YSksYy5jYWNoZT09PSExJiYoYy51cmw9SnQudGVzdChyKT9yLnJlcGxhY2UoSnQsIiQxXz0iK1l0KyspOnIrKFZ0LnRlc3Qocik/IiYiOiI/IikrIl89IitZdCsrKSksYy5pZk1vZGlmaWVkJiYoeC5sYXN0TW9kaWZpZWRbcl0mJlQuc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLHgubGFzdE1vZGlmaWVkW3JdKSx4LmV0YWdbcl0mJlQuc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIseC5ldGFnW3JdKSksKGMuZGF0YSYmYy5oYXNDb250ZW50JiZjLmNvbnRlbnRUeXBlIT09ITF8fHQuY29udGVudFR5cGUpJiZULnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsYy5jb250ZW50VHlwZSksVC5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLGMuZGF0YVR5cGVzWzBdJiZjLmFjY2VwdHNbYy5kYXRhVHlwZXNbMF1dP2MuYWNjZXB0c1tjLmRhdGFUeXBlc1swXV0rKCIqIiE9PWMuZGF0YVR5cGVzWzBdPyIsICIrc24rIjsgcT0wLjAxIjoiIik6Yy5hY2NlcHRzWyIqIl0pO2ZvcihsIGluIGMuaGVhZGVycylULnNldFJlcXVlc3RIZWFkZXIobCxjLmhlYWRlcnNbbF0pO2lmKGMuYmVmb3JlU2VuZCYmKGMuYmVmb3JlU2VuZC5jYWxsKHAsVCxjKT09PSExfHwyPT09dikpcmV0dXJuIFQuYWJvcnQoKTtiPSJhYm9ydCI7Zm9yKGwgaW57c3VjY2VzczoxLGVycm9yOjEsY29tcGxldGU6MX0pVFtsXShjW2xdKTtpZihuPWxuKG9uLGMsdCxUKSl7VC5yZWFkeVN0YXRlPTEsdSYmZi50cmlnZ2VyKCJhamF4U2VuZCIsW1QsY10pLGMuYXN5bmMmJmMudGltZW91dD4wJiYocz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7VC5hYm9ydCgidGltZW91dCIpfSxjLnRpbWVvdXQpKTt0cnl7dj0xLG4uc2VuZChtLGspfWNhdGNoKEMpe2lmKCEoMj52KSl0aHJvdyBDO2soLTEsQyl9fWVsc2UgaygtMSwiTm8gVHJhbnNwb3J0Iik7ZnVuY3Rpb24gayhlLHQsbyxhKXt2YXIgbCxtLHksYix3LEM9dDsyIT09diYmKHY9MixzJiZjbGVhclRpbWVvdXQocyksbj11bmRlZmluZWQsaT1hfHwiIixULnJlYWR5U3RhdGU9ZT4wPzQ6MCxsPWU+PTIwMCYmMzAwPmV8fDMwND09PWUsbyYmKGI9cG4oYyxULG8pKSxiPWZuKGMsYixULGwpLGw/KGMuaWZNb2RpZmllZCYmKHc9VC5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpLHcmJih4Lmxhc3RNb2RpZmllZFtyXT13KSx3PVQuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKSx3JiYoeC5ldGFnW3JdPXcpKSwyMDQ9PT1lfHwiSEVBRCI9PT1jLnR5cGU/Qz0ibm9jb250ZW50IjozMDQ9PT1lP0M9Im5vdG1vZGlmaWVkIjooQz1iLnN0YXRlLG09Yi5kYXRhLHk9Yi5lcnJvcixsPSF5KSk6KHk9QywoZXx8IUMpJiYoQz0iZXJyb3IiLDA+ZSYmKGU9MCkpKSxULnN0YXR1cz1lLFQuc3RhdHVzVGV4dD0odHx8QykrIiIsbD9oLnJlc29sdmVXaXRoKHAsW20sQyxUXSk6aC5yZWplY3RXaXRoKHAsW1QsQyx5XSksVC5zdGF0dXNDb2RlKGcpLGc9dW5kZWZpbmVkLHUmJmYudHJpZ2dlcihsPyJhamF4U3VjY2VzcyI6ImFqYXhFcnJvciIsW1QsYyxsP206eV0pLGQuZmlyZVdpdGgocCxbVCxDXSksdSYmKGYudHJpZ2dlcigiYWpheENvbXBsZXRlIixbVCxjXSksLS14LmFjdGl2ZXx8eC5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpKSl9cmV0dXJuIFR9LGdldEpTT046ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB4LmdldChlLHQsbiwianNvbiIpfSxnZXRTY3JpcHQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4geC5nZXQoZSx1bmRlZmluZWQsdCwic2NyaXB0Iil9fSkseC5lYWNoKFsiZ2V0IiwicG9zdCJdLGZ1bmN0aW9uKGUsdCl7eFt0XT1mdW5jdGlvbihlLG4scixpKXtyZXR1cm4geC5pc0Z1bmN0aW9uKG4pJiYoaT1pfHxyLHI9bixuPXVuZGVmaW5lZCkseC5hamF4KHt1cmw6ZSx0eXBlOnQsZGF0YVR5cGU6aSxkYXRhOm4sc3VjY2VzczpyfSl9fSk7ZnVuY3Rpb24gcG4oZSx0LG4pe3ZhciByLGksbyxzLGE9ZS5jb250ZW50cyx1PWUuZGF0YVR5cGVzO3doaWxlKCIqIj09PXVbMF0pdS5zaGlmdCgpLHI9PT11bmRlZmluZWQmJihyPWUubWltZVR5cGV8fHQuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihyKWZvcihpIGluIGEpaWYoYVtpXSYmYVtpXS50ZXN0KHIpKXt1LnVuc2hpZnQoaSk7YnJlYWt9aWYodVswXWluIG4pbz11WzBdO2Vsc2V7Zm9yKGkgaW4gbil7aWYoIXVbMF18fGUuY29udmVydGVyc1tpKyIgIit1WzBdXSl7bz1pO2JyZWFrfXN8fChzPWkpfW89b3x8c31yZXR1cm4gbz8obyE9PXVbMF0mJnUudW5zaGlmdChvKSxuW29dKTp1bmRlZmluZWR9ZnVuY3Rpb24gZm4oZSx0LG4scil7dmFyIGksbyxzLGEsdSxsPXt9LGM9ZS5kYXRhVHlwZXMuc2xpY2UoKTtpZihjWzFdKWZvcihzIGluIGUuY29udmVydGVycylsW3MudG9Mb3dlckNhc2UoKV09ZS5jb252ZXJ0ZXJzW3NdO289Yy5zaGlmdCgpO3doaWxlKG8paWYoZS5yZXNwb25zZUZpZWxkc1tvXSYmKG5bZS5yZXNwb25zZUZpZWxkc1tvXV09dCksIXUmJnImJmUuZGF0YUZpbHRlciYmKHQ9ZS5kYXRhRmlsdGVyKHQsZS5kYXRhVHlwZSkpLHU9byxvPWMuc2hpZnQoKSlpZigiKiI9PT1vKW89dTtlbHNlIGlmKCIqIiE9PXUmJnUhPT1vKXtpZihzPWxbdSsiICIrb118fGxbIiogIitvXSwhcylmb3IoaSBpbiBsKWlmKGE9aS5zcGxpdCgiICIpLGFbMV09PT1vJiYocz1sW3UrIiAiK2FbMF1dfHxsWyIqICIrYVswXV0pKXtzPT09ITA/cz1sW2ldOmxbaV0hPT0hMCYmKG89YVswXSxjLnVuc2hpZnQoYVsxXSkpO2JyZWFrfWlmKHMhPT0hMClpZihzJiZlWyJ0aHJvd3MiXSl0PXModCk7ZWxzZSB0cnl7dD1zKHQpfWNhdGNoKHApe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOnM/cDoiTm8gY29udmVyc2lvbiBmcm9tICIrdSsiIHRvICIrb319fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTp0fX14LmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6Lyg/OmphdmF8ZWNtYSlzY3JpcHQvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGUpe3JldHVybiB4Lmdsb2JhbEV2YWwoZSksZX19fSkseC5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGUpe2UuY2FjaGU9PT11bmRlZmluZWQmJihlLmNhY2hlPSExKSxlLmNyb3NzRG9tYWluJiYoZS50eXBlPSJHRVQiKX0pLHguYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbihlKXtpZihlLmNyb3NzRG9tYWluKXt2YXIgdCxuO3JldHVybntzZW5kOmZ1bmN0aW9uKHIsaSl7dD14KCI8c2NyaXB0PiIpLnByb3Aoe2FzeW5jOiEwLGNoYXJzZXQ6ZS5zY3JpcHRDaGFyc2V0LHNyYzplLnVybH0pLm9uKCJsb2FkIGVycm9yIixuPWZ1bmN0aW9uKGUpe3QucmVtb3ZlKCksbj1udWxsLGUmJmkoImVycm9yIj09PWUudHlwZT80MDQ6MjAwLGUudHlwZSl9KSxvLmhlYWQuYXBwZW5kQ2hpbGQodFswXSl9LGFib3J0OmZ1bmN0aW9uKCl7biYmbigpfX19fSk7dmFyIGhuPVtdLGRuPS8oPSlcPyg/PSZ8JCl8XD9cPy87eC5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3ZhciBlPWhuLnBvcCgpfHx4LmV4cGFuZG8rIl8iK1l0Kys7cmV0dXJuIHRoaXNbZV09ITAsZX19KSx4LmFqYXhQcmVmaWx0ZXIoImpzb24ganNvbnAiLGZ1bmN0aW9uKHQsbixyKXt2YXIgaSxvLHMsYT10Lmpzb25wIT09ITEmJihkbi50ZXN0KHQudXJsKT8idXJsIjoic3RyaW5nIj09dHlwZW9mIHQuZGF0YSYmISh0LmNvbnRlbnRUeXBlfHwiIikuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikmJmRuLnRlc3QodC5kYXRhKSYmImRhdGEiKTtyZXR1cm4gYXx8Impzb25wIj09PXQuZGF0YVR5cGVzWzBdPyhpPXQuanNvbnBDYWxsYmFjaz14LmlzRnVuY3Rpb24odC5qc29ucENhbGxiYWNrKT90Lmpzb25wQ2FsbGJhY2soKTp0Lmpzb25wQ2FsbGJhY2ssYT90W2FdPXRbYV0ucmVwbGFjZShkbiwiJDEiK2kpOnQuanNvbnAhPT0hMSYmKHQudXJsKz0oVnQudGVzdCh0LnVybCk/IiYiOiI/IikrdC5qc29ucCsiPSIraSksdC5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdPWZ1bmN0aW9uKCl7cmV0dXJuIHN8fHguZXJyb3IoaSsiIHdhcyBub3QgY2FsbGVkIiksc1swXX0sdC5kYXRhVHlwZXNbMF09Impzb24iLG89ZVtpXSxlW2ldPWZ1bmN0aW9uKCl7cz1hcmd1bWVudHN9LHIuYWx3YXlzKGZ1bmN0aW9uKCl7ZVtpXT1vLHRbaV0mJih0Lmpzb25wQ2FsbGJhY2s9bi5qc29ucENhbGxiYWNrLGhuLnB1c2goaSkpLHMmJnguaXNGdW5jdGlvbihvKSYmbyhzWzBdKSxzPW89dW5kZWZpbmVkfSksInNjcmlwdCIpOnVuZGVmaW5lZH0pLHguYWpheFNldHRpbmdzLnhocj1mdW5jdGlvbigpe3RyeXtyZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0fWNhdGNoKGUpe319O3ZhciBnbj14LmFqYXhTZXR0aW5ncy54aHIoKSxtbj17MDoyMDAsMTIyMzoyMDR9LHluPTAsdm49e307ZS5BY3RpdmVYT2JqZWN0JiZ4KGUpLm9uKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7Zm9yKHZhciBlIGluIHZuKXZuW2VdKCk7dm49dW5kZWZpbmVkfSkseC5zdXBwb3J0LmNvcnM9ISFnbiYmIndpdGhDcmVkZW50aWFscyJpbiBnbix4LnN1cHBvcnQuYWpheD1nbj0hIWduLHguYWpheFRyYW5zcG9ydChmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4geC5zdXBwb3J0LmNvcnN8fGduJiYhZS5jcm9zc0RvbWFpbj97c2VuZDpmdW5jdGlvbihuLHIpe3ZhciBpLG8scz1lLnhocigpO2lmKHMub3BlbihlLnR5cGUsZS51cmwsZS5hc3luYyxlLnVzZXJuYW1lLGUucGFzc3dvcmQpLGUueGhyRmllbGRzKWZvcihpIGluIGUueGhyRmllbGRzKXNbaV09ZS54aHJGaWVsZHNbaV07ZS5taW1lVHlwZSYmcy5vdmVycmlkZU1pbWVUeXBlJiZzLm92ZXJyaWRlTWltZVR5cGUoZS5taW1lVHlwZSksZS5jcm9zc0RvbWFpbnx8blsiWC1SZXF1ZXN0ZWQtV2l0aCJdfHwoblsiWC1SZXF1ZXN0ZWQtV2l0aCJdPSJYTUxIdHRwUmVxdWVzdCIpO2ZvcihpIGluIG4pcy5zZXRSZXF1ZXN0SGVhZGVyKGksbltpXSk7dD1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXt0JiYoZGVsZXRlIHZuW29dLHQ9cy5vbmxvYWQ9cy5vbmVycm9yPW51bGwsImFib3J0Ij09PWU/cy5hYm9ydCgpOiJlcnJvciI9PT1lP3Iocy5zdGF0dXN8fDQwNCxzLnN0YXR1c1RleHQpOnIobW5bcy5zdGF0dXNdfHxzLnN0YXR1cyxzLnN0YXR1c1RleHQsInN0cmluZyI9PXR5cGVvZiBzLnJlc3BvbnNlVGV4dD97dGV4dDpzLnJlc3BvbnNlVGV4dH06dW5kZWZpbmVkLHMuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpKX19LHMub25sb2FkPXQoKSxzLm9uZXJyb3I9dCgiZXJyb3IiKSx0PXZuW289eW4rK109dCgiYWJvcnQiKSxzLnNlbmQoZS5oYXNDb250ZW50JiZlLmRhdGF8fG51bGwpfSxhYm9ydDpmdW5jdGlvbigpe3QmJnQoKX19OnVuZGVmaW5lZH0pO3ZhciB4bixibix3bj0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sVG49UmVnRXhwKCJeKD86KFsrLV0pPXwpKCIrYisiKShbYS16JV0qKSQiLCJpIiksQ249L3F1ZXVlSG9va3MkLyxrbj1bQW5dLE5uPXsiKiI6W2Z1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5jcmVhdGVUd2VlbihlLHQpLHI9bi5jdXIoKSxpPVRuLmV4ZWModCksbz1pJiZpWzNdfHwoeC5jc3NOdW1iZXJbZV0/IiI6InB4Iikscz0oeC5jc3NOdW1iZXJbZV18fCJweCIhPT1vJiYrcikmJlRuLmV4ZWMoeC5jc3Mobi5lbGVtLGUpKSxhPTEsdT0yMDtpZihzJiZzWzNdIT09byl7bz1vfHxzWzNdLGk9aXx8W10scz0rcnx8MTtkbyBhPWF8fCIuNSIscy89YSx4LnN0eWxlKG4uZWxlbSxlLHMrbyk7d2hpbGUoYSE9PShhPW4uY3VyKCkvcikmJjEhPT1hJiYtLXUpfXJldHVybiBpJiYocz1uLnN0YXJ0PStzfHwrcnx8MCxuLnVuaXQ9byxuLmVuZD1pWzFdP3MrKGlbMV0rMSkqaVsyXToraVsyXSksbn1dfTtmdW5jdGlvbiBFbigpe3JldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7eG49dW5kZWZpbmVkfSkseG49eC5ub3coKX1mdW5jdGlvbiBTbihlLHQsbil7dmFyIHIsaT0oTm5bdF18fFtdKS5jb25jYXQoTm5bIioiXSksbz0wLHM9aS5sZW5ndGg7Zm9yKDtzPm87bysrKWlmKHI9aVtvXS5jYWxsKG4sdCxlKSlyZXR1cm4gcn1mdW5jdGlvbiBqbihlLHQsbil7dmFyIHIsaSxvPTAscz1rbi5sZW5ndGgsYT14LkRlZmVycmVkKCkuYWx3YXlzKGZ1bmN0aW9uKCl7ZGVsZXRlIHUuZWxlbX0pLHU9ZnVuY3Rpb24oKXtpZihpKXJldHVybiExO3ZhciB0PXhufHxFbigpLG49TWF0aC5tYXgoMCxsLnN0YXJ0VGltZStsLmR1cmF0aW9uLXQpLHI9bi9sLmR1cmF0aW9ufHwwLG89MS1yLHM9MCx1PWwudHdlZW5zLmxlbmd0aDtmb3IoO3U+cztzKyspbC50d2VlbnNbc10ucnVuKG8pO3JldHVybiBhLm5vdGlmeVdpdGgoZSxbbCxvLG5dKSwxPm8mJnU/bjooYS5yZXNvbHZlV2l0aChlLFtsXSksITEpfSxsPWEucHJvbWlzZSh7ZWxlbTplLHByb3BzOnguZXh0ZW5kKHt9LHQpLG9wdHM6eC5leHRlbmQoITAse3NwZWNpYWxFYXNpbmc6e319LG4pLG9yaWdpbmFsUHJvcGVydGllczp0LG9yaWdpbmFsT3B0aW9uczpuLHN0YXJ0VGltZTp4bnx8RW4oKSxkdXJhdGlvbjpuLmR1cmF0aW9uLHR3ZWVuczpbXSxjcmVhdGVUd2VlbjpmdW5jdGlvbih0LG4pe3ZhciByPXguVHdlZW4oZSxsLm9wdHMsdCxuLGwub3B0cy5zcGVjaWFsRWFzaW5nW3RdfHxsLm9wdHMuZWFzaW5nKTtyZXR1cm4gbC50d2VlbnMucHVzaChyKSxyfSxzdG9wOmZ1bmN0aW9uKHQpe3ZhciBuPTAscj10P2wudHdlZW5zLmxlbmd0aDowO2lmKGkpcmV0dXJuIHRoaXM7Zm9yKGk9ITA7cj5uO24rKylsLnR3ZWVuc1tuXS5ydW4oMSk7cmV0dXJuIHQ/YS5yZXNvbHZlV2l0aChlLFtsLHRdKTphLnJlamVjdFdpdGgoZSxbbCx0XSksdGhpc319KSxjPWwucHJvcHM7Zm9yKERuKGMsbC5vcHRzLnNwZWNpYWxFYXNpbmcpO3M+bztvKyspaWYocj1rbltvXS5jYWxsKGwsZSxjLGwub3B0cykpcmV0dXJuIHI7cmV0dXJuIHgubWFwKGMsU24sbCkseC5pc0Z1bmN0aW9uKGwub3B0cy5zdGFydCkmJmwub3B0cy5zdGFydC5jYWxsKGUsbCkseC5meC50aW1lcih4LmV4dGVuZCh1LHtlbGVtOmUsYW5pbTpsLHF1ZXVlOmwub3B0cy5xdWV1ZX0pKSxsLnByb2dyZXNzKGwub3B0cy5wcm9ncmVzcykuZG9uZShsLm9wdHMuZG9uZSxsLm9wdHMuY29tcGxldGUpLmZhaWwobC5vcHRzLmZhaWwpLmFsd2F5cyhsLm9wdHMuYWx3YXlzKX1mdW5jdGlvbiBEbihlLHQpe3ZhciBuLHIsaSxvLHM7Zm9yKG4gaW4gZSlpZihyPXguY2FtZWxDYXNlKG4pLGk9dFtyXSxvPWVbbl0seC5pc0FycmF5KG8pJiYoaT1vWzFdLG89ZVtuXT1vWzBdKSxuIT09ciYmKGVbcl09byxkZWxldGUgZVtuXSkscz14LmNzc0hvb2tzW3JdLHMmJiJleHBhbmQiaW4gcyl7bz1zLmV4cGFuZChvKSxkZWxldGUgZVtyXTtmb3IobiBpbiBvKW4gaW4gZXx8KGVbbl09b1tuXSx0W25dPWkpfWVsc2UgdFtyXT1pfXguQW5pbWF0aW9uPXguZXh0ZW5kKGpuLHt0d2VlbmVyOmZ1bmN0aW9uKGUsdCl7eC5pc0Z1bmN0aW9uKGUpPyh0PWUsZT1bIioiXSk6ZT1lLnNwbGl0KCIgIik7dmFyIG4scj0wLGk9ZS5sZW5ndGg7Zm9yKDtpPnI7cisrKW49ZVtyXSxObltuXT1ObltuXXx8W10sTm5bbl0udW5zaGlmdCh0KX0scHJlZmlsdGVyOmZ1bmN0aW9uKGUsdCl7dD9rbi51bnNoaWZ0KGUpOmtuLnB1c2goZSl9fSk7ZnVuY3Rpb24gQW4oZSx0LG4pe3ZhciByLGksbyxzLGEsdSxsPXRoaXMsYz17fSxwPWUuc3R5bGUsZj1lLm5vZGVUeXBlJiZMdChlKSxoPXEuZ2V0KGUsImZ4c2hvdyIpO24ucXVldWV8fChhPXguX3F1ZXVlSG9va3MoZSwiZngiKSxudWxsPT1hLnVucXVldWVkJiYoYS51bnF1ZXVlZD0wLHU9YS5lbXB0eS5maXJlLGEuZW1wdHkuZmlyZT1mdW5jdGlvbigpe2EudW5xdWV1ZWR8fHUoKX0pLGEudW5xdWV1ZWQrKyxsLmFsd2F5cyhmdW5jdGlvbigpe2wuYWx3YXlzKGZ1bmN0aW9uKCl7YS51bnF1ZXVlZC0tLHgucXVldWUoZSwiZngiKS5sZW5ndGh8fGEuZW1wdHkuZmlyZSgpfSl9KSksMT09PWUubm9kZVR5cGUmJigiaGVpZ2h0ImluIHR8fCJ3aWR0aCJpbiB0KSYmKG4ub3ZlcmZsb3c9W3Aub3ZlcmZsb3cscC5vdmVyZmxvd1gscC5vdmVyZmxvd1ldLCJpbmxpbmUiPT09eC5jc3MoZSwiZGlzcGxheSIpJiYibm9uZSI9PT14LmNzcyhlLCJmbG9hdCIpJiYocC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSksbi5vdmVyZmxvdyYmKHAub3ZlcmZsb3c9ImhpZGRlbiIsbC5hbHdheXMoZnVuY3Rpb24oKXtwLm92ZXJmbG93PW4ub3ZlcmZsb3dbMF0scC5vdmVyZmxvd1g9bi5vdmVyZmxvd1sxXSxwLm92ZXJmbG93WT1uLm92ZXJmbG93WzJdfSkpO2ZvcihyIGluIHQpaWYoaT10W3JdLHduLmV4ZWMoaSkpe2lmKGRlbGV0ZSB0W3JdLG89b3x8InRvZ2dsZSI9PT1pLGk9PT0oZj8iaGlkZSI6InNob3ciKSl7aWYoInNob3ciIT09aXx8IWh8fGhbcl09PT11bmRlZmluZWQpY29udGludWU7Zj0hMH1jW3JdPWgmJmhbcl18fHguc3R5bGUoZSxyKX1pZigheC5pc0VtcHR5T2JqZWN0KGMpKXtoPyJoaWRkZW4iaW4gaCYmKGY9aC5oaWRkZW4pOmg9cS5hY2Nlc3MoZSwiZnhzaG93Iix7fSksbyYmKGguaGlkZGVuPSFmKSxmP3goZSkuc2hvdygpOmwuZG9uZShmdW5jdGlvbigpe3goZSkuaGlkZSgpfSksbC5kb25lKGZ1bmN0aW9uKCl7dmFyIHQ7cS5yZW1vdmUoZSwiZnhzaG93Iik7Zm9yKHQgaW4gYyl4LnN0eWxlKGUsdCxjW3RdKX0pO2ZvcihyIGluIGMpcz1TbihmP2hbcl06MCxyLGwpLHIgaW4gaHx8KGhbcl09cy5zdGFydCxmJiYocy5lbmQ9cy5zdGFydCxzLnN0YXJ0PSJ3aWR0aCI9PT1yfHwiaGVpZ2h0Ij09PXI/MTowKSl9fWZ1bmN0aW9uIExuKGUsdCxuLHIsaSl7cmV0dXJuIG5ldyBMbi5wcm90b3R5cGUuaW5pdChlLHQsbixyLGkpfXguVHdlZW49TG4sTG4ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpMbixpbml0OmZ1bmN0aW9uKGUsdCxuLHIsaSxvKXt0aGlzLmVsZW09ZSx0aGlzLnByb3A9bix0aGlzLmVhc2luZz1pfHwic3dpbmciLHRoaXMub3B0aW9ucz10LHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1yLHRoaXMudW5pdD1vfHwoeC5jc3NOdW1iZXJbbl0/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciBlPUxuLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBlJiZlLmdldD9lLmdldCh0aGlzKTpMbi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oZSl7dmFyIHQsbj1Mbi5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5wb3M9dD10aGlzLm9wdGlvbnMuZHVyYXRpb24/eC5lYXNpbmdbdGhpcy5lYXNpbmddKGUsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmUsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6ZSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqdCt0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxuJiZuLnNldD9uLnNldCh0aGlzKTpMbi5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSxMbi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGU9TG4ucHJvdG90eXBlLExuLnByb3BIb29rcz17X2RlZmF1bHQ6e2dldDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gbnVsbD09ZS5lbGVtW2UucHJvcF18fGUuZWxlbS5zdHlsZSYmbnVsbCE9ZS5lbGVtLnN0eWxlW2UucHJvcF0/KHQ9eC5jc3MoZS5lbGVtLGUucHJvcCwiIiksdCYmImF1dG8iIT09dD90OjApOmUuZWxlbVtlLnByb3BdfSxzZXQ6ZnVuY3Rpb24oZSl7eC5meC5zdGVwW2UucHJvcF0/eC5meC5zdGVwW2UucHJvcF0oZSk6ZS5lbGVtLnN0eWxlJiYobnVsbCE9ZS5lbGVtLnN0eWxlW3guY3NzUHJvcHNbZS5wcm9wXV18fHguY3NzSG9va3NbZS5wcm9wXSk/eC5zdHlsZShlLmVsZW0sZS5wcm9wLGUubm93K2UudW5pdCk6ZS5lbGVtW2UucHJvcF09ZS5ub3d9fX0sTG4ucHJvcEhvb2tzLnNjcm9sbFRvcD1Mbi5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKGUpe2UuZWxlbS5ub2RlVHlwZSYmZS5lbGVtLnBhcmVudE5vZGUmJihlLmVsZW1bZS5wcm9wXT1lLm5vdyl9fSx4LmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLGZ1bmN0aW9uKGUsdCl7dmFyIG49eC5mblt0XTt4LmZuW3RdPWZ1bmN0aW9uKGUscixpKXtyZXR1cm4gbnVsbD09ZXx8ImJvb2xlYW4iPT10eXBlb2YgZT9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUocW4odCwhMCksZSxyLGkpfX0pLHguZm4uZXh0ZW5kKHtmYWRlVG86ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMuZmlsdGVyKEx0KS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OnR9LGUsbixyKX0sYW5pbWF0ZTpmdW5jdGlvbihlLHQsbixyKXt2YXIgaT14LmlzRW1wdHlPYmplY3QoZSksbz14LnNwZWVkKHQsbixyKSxzPWZ1bmN0aW9uKCl7dmFyIHQ9am4odGhpcyx4LmV4dGVuZCh7fSxlKSxvKTsoaXx8cS5nZXQodGhpcywiZmluaXNoIikpJiZ0LnN0b3AoITApfTtyZXR1cm4gcy5maW5pc2g9cyxpfHxvLnF1ZXVlPT09ITE/dGhpcy5lYWNoKHMpOnRoaXMucXVldWUoby5xdWV1ZSxzKX0sc3RvcDpmdW5jdGlvbihlLHQsbil7dmFyIHI9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zdG9wO2RlbGV0ZSBlLnN0b3AsdChuKX07cmV0dXJuInN0cmluZyIhPXR5cGVvZiBlJiYobj10LHQ9ZSxlPXVuZGVmaW5lZCksdCYmZSE9PSExJiZ0aGlzLnF1ZXVlKGV8fCJmeCIsW10pLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0PSEwLGk9bnVsbCE9ZSYmZSsicXVldWVIb29rcyIsbz14LnRpbWVycyxzPXEuZ2V0KHRoaXMpO2lmKGkpc1tpXSYmc1tpXS5zdG9wJiZyKHNbaV0pO2Vsc2UgZm9yKGkgaW4gcylzW2ldJiZzW2ldLnN0b3AmJkNuLnRlc3QoaSkmJnIoc1tpXSk7Zm9yKGk9by5sZW5ndGg7aS0tOylvW2ldLmVsZW0hPT10aGlzfHxudWxsIT1lJiZvW2ldLnF1ZXVlIT09ZXx8KG9baV0uYW5pbS5zdG9wKG4pLHQ9ITEsby5zcGxpY2UoaSwxKSk7KHR8fCFuKSYmeC5kZXF1ZXVlKHRoaXMsZSl9KX0sZmluaXNoOmZ1bmN0aW9uKGUpe3JldHVybiBlIT09ITEmJihlPWV8fCJmeCIpLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0LG49cS5nZXQodGhpcykscj1uW2UrInF1ZXVlIl0saT1uW2UrInF1ZXVlSG9va3MiXSxvPXgudGltZXJzLHM9cj9yLmxlbmd0aDowO2ZvcihuLmZpbmlzaD0hMCx4LnF1ZXVlKHRoaXMsZSxbXSksaSYmaS5zdG9wJiZpLnN0b3AuY2FsbCh0aGlzLCEwKSx0PW8ubGVuZ3RoO3QtLTspb1t0XS5lbGVtPT09dGhpcyYmb1t0XS5xdWV1ZT09PWUmJihvW3RdLmFuaW0uc3RvcCghMCksby5zcGxpY2UodCwxKSk7Zm9yKHQ9MDtzPnQ7dCsrKXJbdF0mJnJbdF0uZmluaXNoJiZyW3RdLmZpbmlzaC5jYWxsKHRoaXMpO2RlbGV0ZSBuLmZpbmlzaH0pfX0pO2Z1bmN0aW9uIHFuKGUsdCl7dmFyIG4scj17aGVpZ2h0OmV9LGk9MDtmb3IodD10PzE6MDs0Pmk7aSs9Mi10KW49anRbaV0sclsibWFyZ2luIituXT1yWyJwYWRkaW5nIituXT1lO3JldHVybiB0JiYoci5vcGFjaXR5PXIud2lkdGg9ZSkscn14LmVhY2goe3NsaWRlRG93bjpxbigic2hvdyIpLHNsaWRlVXA6cW4oImhpZGUiKSxzbGlkZVRvZ2dsZTpxbigidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihlLHQpe3guZm5bZV09ZnVuY3Rpb24oZSxuLHIpe3JldHVybiB0aGlzLmFuaW1hdGUodCxlLG4scil9fSkseC5zcGVlZD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZSYmIm9iamVjdCI9PXR5cGVvZiBlP3guZXh0ZW5kKHt9LGUpOntjb21wbGV0ZTpufHwhbiYmdHx8eC5pc0Z1bmN0aW9uKGUpJiZlLGR1cmF0aW9uOmUsZWFzaW5nOm4mJnR8fHQmJiF4LmlzRnVuY3Rpb24odCkmJnR9O3JldHVybiByLmR1cmF0aW9uPXguZngub2ZmPzA6Im51bWJlciI9PXR5cGVvZiByLmR1cmF0aW9uP3IuZHVyYXRpb246ci5kdXJhdGlvbiBpbiB4LmZ4LnNwZWVkcz94LmZ4LnNwZWVkc1tyLmR1cmF0aW9uXTp4LmZ4LnNwZWVkcy5fZGVmYXVsdCwobnVsbD09ci5xdWV1ZXx8ci5xdWV1ZT09PSEwKSYmKHIucXVldWU9ImZ4Iiksci5vbGQ9ci5jb21wbGV0ZSxyLmNvbXBsZXRlPWZ1bmN0aW9uKCl7eC5pc0Z1bmN0aW9uKHIub2xkKSYmci5vbGQuY2FsbCh0aGlzKSxyLnF1ZXVlJiZ4LmRlcXVldWUodGhpcyxyLnF1ZXVlKX0scn0seC5lYXNpbmc9e2xpbmVhcjpmdW5jdGlvbihlKXtyZXR1cm4gZX0sc3dpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuLjUtTWF0aC5jb3MoZSpNYXRoLlBJKS8yfX0seC50aW1lcnM9W10seC5meD1Mbi5wcm90b3R5cGUuaW5pdCx4LmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgZSx0PXgudGltZXJzLG49MDtmb3IoeG49eC5ub3coKTt0Lmxlbmd0aD5uO24rKyllPXRbbl0sZSgpfHx0W25dIT09ZXx8dC5zcGxpY2Uobi0tLDEpO3QubGVuZ3RofHx4LmZ4LnN0b3AoKSx4bj11bmRlZmluZWR9LHguZngudGltZXI9ZnVuY3Rpb24oZSl7ZSgpJiZ4LnRpbWVycy5wdXNoKGUpJiZ4LmZ4LnN0YXJ0KCl9LHguZnguaW50ZXJ2YWw9MTMseC5meC5zdGFydD1mdW5jdGlvbigpe2JufHwoYm49c2V0SW50ZXJ2YWwoeC5meC50aWNrLHguZnguaW50ZXJ2YWwpKX0seC5meC5zdG9wPWZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbChibiksYm49bnVsbH0seC5meC5zcGVlZHM9e3Nsb3c6NjAwLGZhc3Q6MjAwLF9kZWZhdWx0OjQwMH0seC5meC5zdGVwPXt9LHguZXhwciYmeC5leHByLmZpbHRlcnMmJih4LmV4cHIuZmlsdGVycy5hbmltYXRlZD1mdW5jdGlvbihlKXtyZXR1cm4geC5ncmVwKHgudGltZXJzLGZ1bmN0aW9uKHQpe3JldHVybiBlPT09dC5lbGVtfSkubGVuZ3RofSkseC5mbi5vZmZzZXQ9ZnVuY3Rpb24oZSl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZT09PXVuZGVmaW5lZD90aGlzOnRoaXMuZWFjaChmdW5jdGlvbih0KXt4Lm9mZnNldC5zZXRPZmZzZXQodGhpcyxlLHQpfSk7dmFyIHQsbixpPXRoaXNbMF0sbz17dG9wOjAsbGVmdDowfSxzPWkmJmkub3duZXJEb2N1bWVudDtpZihzKXJldHVybiB0PXMuZG9jdW1lbnRFbGVtZW50LHguY29udGFpbnModCxpKT8odHlwZW9mIGkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0IT09ciYmKG89aS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSksbj1IbihzKSx7dG9wOm8udG9wK24ucGFnZVlPZmZzZXQtdC5jbGllbnRUb3AsbGVmdDpvLmxlZnQrbi5wYWdlWE9mZnNldC10LmNsaWVudExlZnR9KTpvfSx4Lm9mZnNldD17c2V0T2Zmc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8scyxhLHUsbCxjPXguY3NzKGUsInBvc2l0aW9uIikscD14KGUpLGY9e307InN0YXRpYyI9PT1jJiYoZS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSxhPXAub2Zmc2V0KCksbz14LmNzcyhlLCJ0b3AiKSx1PXguY3NzKGUsImxlZnQiKSxsPSgiYWJzb2x1dGUiPT09Y3x8ImZpeGVkIj09PWMpJiYobyt1KS5pbmRleE9mKCJhdXRvIik+LTEsbD8ocj1wLnBvc2l0aW9uKCkscz1yLnRvcCxpPXIubGVmdCk6KHM9cGFyc2VGbG9hdChvKXx8MCxpPXBhcnNlRmxvYXQodSl8fDApLHguaXNGdW5jdGlvbih0KSYmKHQ9dC5jYWxsKGUsbixhKSksbnVsbCE9dC50b3AmJihmLnRvcD10LnRvcC1hLnRvcCtzKSxudWxsIT10LmxlZnQmJihmLmxlZnQ9dC5sZWZ0LWEubGVmdCtpKSwidXNpbmciaW4gdD90LnVzaW5nLmNhbGwoZSxmKTpwLmNzcyhmKX19LHguZm4uZXh0ZW5kKHtwb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXNbMF0pe3ZhciBlLHQsbj10aGlzWzBdLHI9e3RvcDowLGxlZnQ6MH07cmV0dXJuImZpeGVkIj09PXguY3NzKG4sInBvc2l0aW9uIik/dD1uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOihlPXRoaXMub2Zmc2V0UGFyZW50KCksdD10aGlzLm9mZnNldCgpLHgubm9kZU5hbWUoZVswXSwiaHRtbCIpfHwocj1lLm9mZnNldCgpKSxyLnRvcCs9eC5jc3MoZVswXSwiYm9yZGVyVG9wV2lkdGgiLCEwKSxyLmxlZnQrPXguY3NzKGVbMF0sImJvcmRlckxlZnRXaWR0aCIsITApKSx7dG9wOnQudG9wLXIudG9wLXguY3NzKG4sIm1hcmdpblRvcCIsITApLGxlZnQ6dC5sZWZ0LXIubGVmdC14LmNzcyhuLCJtYXJnaW5MZWZ0IiwhMCl9fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vZmZzZXRQYXJlbnR8fHM7d2hpbGUoZSYmIXgubm9kZU5hbWUoZSwiaHRtbCIpJiYic3RhdGljIj09PXguY3NzKGUsInBvc2l0aW9uIikpZT1lLm9mZnNldFBhcmVudDtyZXR1cm4gZXx8c30pfX0pLHguZWFjaCh7c2Nyb2xsTGVmdDoicGFnZVhPZmZzZXQiLHNjcm9sbFRvcDoicGFnZVlPZmZzZXQifSxmdW5jdGlvbih0LG4pe3ZhciByPSJwYWdlWU9mZnNldCI9PT1uO3guZm5bdF09ZnVuY3Rpb24oaSl7cmV0dXJuIHguYWNjZXNzKHRoaXMsZnVuY3Rpb24odCxpLG8pe3ZhciBzPUhuKHQpO3JldHVybiBvPT09dW5kZWZpbmVkP3M/c1tuXTp0W2ldOihzP3Muc2Nyb2xsVG8ocj9lLnBhZ2VYT2Zmc2V0Om8scj9vOmUucGFnZVlPZmZzZXQpOnRbaV09byx1bmRlZmluZWQpfSx0LGksYXJndW1lbnRzLmxlbmd0aCxudWxsKX19KTtmdW5jdGlvbiBIbihlKXtyZXR1cm4geC5pc1dpbmRvdyhlKT9lOjk9PT1lLm5vZGVUeXBlJiZlLmRlZmF1bHRWaWV3fXguZWFjaCh7SGVpZ2h0OiJoZWlnaHQiLFdpZHRoOiJ3aWR0aCJ9LGZ1bmN0aW9uKGUsdCl7eC5lYWNoKHtwYWRkaW5nOiJpbm5lciIrZSxjb250ZW50OnQsIiI6Im91dGVyIitlfSxmdW5jdGlvbihuLHIpe3guZm5bcl09ZnVuY3Rpb24ocixpKXt2YXIgbz1hcmd1bWVudHMubGVuZ3RoJiYobnx8ImJvb2xlYW4iIT10eXBlb2Ygcikscz1ufHwocj09PSEwfHxpPT09ITA/Im1hcmdpbiI6ImJvcmRlciIpO3JldHVybiB4LmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKHQsbixyKXt2YXIgaTtyZXR1cm4geC5pc1dpbmRvdyh0KT90LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsiY2xpZW50IitlXTo5PT09dC5ub2RlVHlwZT8oaT10LmRvY3VtZW50RWxlbWVudCxNYXRoLm1heCh0LmJvZHlbInNjcm9sbCIrZV0saVsic2Nyb2xsIitlXSx0LmJvZHlbIm9mZnNldCIrZV0saVsib2Zmc2V0IitlXSxpWyJjbGllbnQiK2VdKSk6cj09PXVuZGVmaW5lZD94LmNzcyh0LG4scyk6eC5zdHlsZSh0LG4scixzKX0sdCxvP3I6dW5kZWZpbmVkLG8sbnVsbCl9fSl9KSx4LmZuLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGh9LHguZm4uYW5kU2VsZj14LmZuLmFkZEJhY2ssIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZSYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz14OiJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiB4fSksIm9iamVjdCI9PXR5cGVvZiBlJiYib2JqZWN0Ij09dHlwZW9mIGUuZG9jdW1lbnQmJihlLmpRdWVyeT1lLiQ9eCl9KSh3aW5kb3cpOwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9qcy9qcXVlcnktMi4wLjMubWluLm1hcCBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvanMvanF1ZXJ5LTIuMC4zLm1pbi5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVkZWNkMQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvanMvanF1ZXJ5LTIuMC4zLm1pbi5tYXAKQEAgLTAsMCArMSBAQAoreyJ2ZXJzaW9uIjozLCJmaWxlIjoianF1ZXJ5LTIuMC4zLm1pbi5qcyIsInNvdXJjZXMiOlsianF1ZXJ5LTIuMC4zLmpzIl0sIm5hbWVzIjpbIndpbmRvdyIsInVuZGVmaW5lZCIsInJvb3RqUXVlcnkiLCJyZWFkeUxpc3QiLCJjb3JlX3N0cnVuZGVmaW5lZCIsImxvY2F0aW9uIiwiZG9jdW1lbnQiLCJkb2NFbGVtIiwiZG9jdW1lbnRFbGVtZW50IiwiX2pRdWVyeSIsImpRdWVyeSIsIl8kIiwiJCIsImNsYXNzMnR5cGUiLCJjb3JlX2RlbGV0ZWRJZHMiLCJjb3JlX3ZlcnNpb24iLCJjb3JlX2NvbmNhdCIsImNvbmNhdCIsImNvcmVfcHVzaCIsInB1c2giLCJjb3JlX3NsaWNlIiwic2xpY2UiLCJjb3JlX2luZGV4T2YiLCJpbmRleE9mIiwiY29yZV90b1N0cmluZyIsInRvU3RyaW5nIiwiY29yZV9oYXNPd24iLCJoYXNPd25Qcm9wZXJ0eSIsImNvcmVfdHJpbSIsInRyaW0iLCJzZWxlY3RvciIsImNvbnRleHQiLCJmbiIsImluaXQiLCJjb3JlX3BudW0iLCJzb3VyY2UiLCJjb3JlX3Jub3R3aGl0ZSIsInJxdWlja0V4cHIiLCJyc2luZ2xlVGFnIiwicm1zUHJlZml4IiwicmRhc2hBbHBoYSIsImZjYW1lbENhc2UiLCJhbGwiLCJsZXR0ZXIiLCJ0b1VwcGVyQ2FzZSIsImNvbXBsZXRlZCIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJyZWFkeSIsInByb3RvdHlwZSIsImpxdWVyeSIsImNvbnN0cnVjdG9yIiwibWF0Y2giLCJlbGVtIiwidGhpcyIsImNoYXJBdCIsImxlbmd0aCIsImV4ZWMiLCJmaW5kIiwibWVyZ2UiLCJwYXJzZUhUTUwiLCJub2RlVHlwZSIsIm93bmVyRG9jdW1lbnQiLCJ0ZXN0IiwiaXNQbGFpbk9iamVjdCIsImlzRnVuY3Rpb24iLCJhdHRyIiwiZ2V0RWxlbWVudEJ5SWQiLCJwYXJlbnROb2RlIiwibWFrZUFycmF5IiwidG9BcnJheSIsImNhbGwiLCJnZXQiLCJudW0iLCJwdXNoU3RhY2siLCJlbGVtcyIsInJldCIsInByZXZPYmplY3QiLCJlYWNoIiwiY2FsbGJhY2siLCJhcmdzIiwicHJvbWlzZSIsImRvbmUiLCJhcHBseSIsImFyZ3VtZW50cyIsImZpcnN0IiwiZXEiLCJsYXN0IiwiaSIsImxlbiIsImoiLCJtYXAiLCJlbmQiLCJzb3J0Iiwic3BsaWNlIiwiZXh0ZW5kIiwib3B0aW9ucyIsIm5hbWUiLCJzcmMiLCJjb3B5IiwiY29weUlzQXJyYXkiLCJjbG9uZSIsInRhcmdldCIsImRlZXAiLCJpc0FycmF5IiwiZXhwYW5kbyIsIk1hdGgiLCJyYW5kb20iLCJyZXBsYWNlIiwibm9Db25mbGljdCIsImlzUmVhZHkiLCJyZWFkeVdhaXQiLCJob2xkUmVhZHkiLCJob2xkIiwid2FpdCIsInJlc29sdmVXaXRoIiwidHJpZ2dlciIsIm9mZiIsIm9iaiIsInR5cGUiLCJBcnJheSIsImlzV2luZG93IiwiaXNOdW1lcmljIiwiaXNOYU4iLCJwYXJzZUZsb2F0IiwiaXNGaW5pdGUiLCJTdHJpbmciLCJlIiwiaXNFbXB0eU9iamVjdCIsImVycm9yIiwibXNnIiwiRXJyb3IiLCJkYXRhIiwia2VlcFNjcmlwdHMiLCJwYXJzZWQiLCJzY3JpcHRzIiwiY3JlYXRlRWxlbWVudCIsImJ1aWxkRnJhZ21lbnQiLCJyZW1vdmUiLCJjaGlsZE5vZGVzIiwicGFyc2VKU09OIiwiSlNPTiIsInBhcnNlIiwicGFyc2VYTUwiLCJ4bWwiLCJ0bXAiLCJET01QYXJzZXIiLCJwYXJzZUZyb21TdHJpbmciLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsIm5vb3AiLCJnbG9iYWxFdmFsIiwiY29kZSIsInNjcmlwdCIsImluZGlyZWN0IiwiZXZhbCIsInRleHQiLCJoZWFkIiwiYXBwZW5kQ2hpbGQiLCJyZW1vdmVDaGlsZCIsImNhbWVsQ2FzZSIsInN0cmluZyIsIm5vZGVOYW1lIiwidG9Mb3dlckNhc2UiLCJ2YWx1ZSIsImlzQXJyYXlsaWtlIiwiYXJyIiwicmVzdWx0cyIsIk9iamVjdCIsImluQXJyYXkiLCJzZWNvbmQiLCJsIiwiZ3JlcCIsImludiIsInJldFZhbCIsImFyZyIsImd1aWQiLCJwcm94eSIsImFjY2VzcyIsImtleSIsImNoYWluYWJsZSIsImVtcHR5R2V0IiwicmF3IiwiYnVsayIsIm5vdyIsIkRhdGUiLCJzd2FwIiwib2xkIiwic3R5bGUiLCJEZWZlcnJlZCIsInJlYWR5U3RhdGUiLCJzZXRUaW1lb3V0IiwiYWRkRXZlbnRMaXN0ZW5lciIsInNwbGl0Iiwic3VwcG9ydCIsImNhY2hlZHJ1bnMiLCJFeHByIiwiZ2V0VGV4dCIsImlzWE1MIiwiY29tcGlsZSIsIm91dGVybW9zdENvbnRleHQiLCJzb3J0SW5wdXQiLCJzZXREb2N1bWVudCIsImRvY3VtZW50SXNIVE1MIiwicmJ1Z2d5UVNBIiwicmJ1Z2d5TWF0Y2hlcyIsIm1hdGNoZXMiLCJjb250YWlucyIsInByZWZlcnJlZERvYyIsImRpcnJ1bnMiLCJjbGFzc0NhY2hlIiwiY3JlYXRlQ2FjaGUiLCJ0b2tlbkNhY2hlIiwiY29tcGlsZXJDYWNoZSIsImhhc0R1cGxpY2F0ZSIsInNvcnRPcmRlciIsImEiLCJiIiwic3RydW5kZWZpbmVkIiwiTUFYX05FR0FUSVZFIiwiaGFzT3duIiwicG9wIiwicHVzaF9uYXRpdmUiLCJib29sZWFucyIsIndoaXRlc3BhY2UiLCJjaGFyYWN0ZXJFbmNvZGluZyIsImlkZW50aWZpZXIiLCJhdHRyaWJ1dGVzIiwicHNldWRvcyIsInJ0cmltIiwiUmVnRXhwIiwicmNvbW1hIiwicmNvbWJpbmF0b3JzIiwicnNpYmxpbmciLCJyYXR0cmlidXRlUXVvdGVzIiwicnBzZXVkbyIsInJpZGVudGlmaWVyIiwibWF0Y2hFeHByIiwiSUQiLCJDTEFTUyIsIlRBRyIsIkFUVFIiLCJQU0VVRE8iLCJDSElMRCIsImJvb2wiLCJuZWVkc0NvbnRleHQiLCJybmF0aXZlIiwicmlucHV0cyIsInJoZWFkZXIiLCJyZXNjYXBlIiwicnVuZXNjYXBlIiwiZnVuZXNjYXBlIiwiXyIsImVzY2FwZWQiLCJlc2NhcGVkV2hpdGVzcGFjZSIsImhpZ2giLCJmcm9tQ2hhckNvZGUiLCJlbHMiLCJTaXp6bGUiLCJzZWVkIiwibSIsImdyb3VwcyIsIm5pZCIsIm5ld0NvbnRleHQiLCJuZXdTZWxlY3RvciIsImlkIiwiZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSIsInFzYSIsInRva2VuaXplIiwiZ2V0QXR0cmlidXRlIiwic2V0QXR0cmlidXRlIiwidG9TZWxlY3RvciIsImpvaW4iLCJxdWVyeVNlbGVjdG9yQWxsIiwicXNhRXJyb3IiLCJyZW1vdmVBdHRyaWJ1dGUiLCJzZWxlY3QiLCJrZXlzIiwiY2FjaGUiLCJjYWNoZUxlbmd0aCIsInNoaWZ0IiwibWFya0Z1bmN0aW9uIiwiYXNzZXJ0IiwiZGl2IiwiYWRkSGFuZGxlIiwiYXR0cnMiLCJoYW5kbGVyIiwiYXR0ckhhbmRsZSIsInNpYmxpbmdDaGVjayIsImN1ciIsImRpZmYiLCJzb3VyY2VJbmRleCIsIm5leHRTaWJsaW5nIiwiY3JlYXRlSW5wdXRQc2V1ZG8iLCJjcmVhdGVCdXR0b25Qc2V1ZG8iLCJjcmVhdGVQb3NpdGlvbmFsUHNldWRvIiwiYXJndW1lbnQiLCJtYXRjaEluZGV4ZXMiLCJub2RlIiwiZG9jIiwicGFyZW50IiwiZGVmYXVsdFZpZXciLCJhdHRhY2hFdmVudCIsInRvcCIsImNsYXNzTmFtZSIsImNyZWF0ZUNvbW1lbnQiLCJpbm5lckhUTUwiLCJmaXJzdENoaWxkIiwiZ2V0QnlJZCIsImdldEVsZW1lbnRzQnlOYW1lIiwiZmlsdGVyIiwiYXR0cklkIiwiZ2V0QXR0cmlidXRlTm9kZSIsInRhZyIsImlucHV0IiwibWF0Y2hlc1NlbGVjdG9yIiwid2Via2l0TWF0Y2hlc1NlbGVjdG9yIiwibW96TWF0Y2hlc1NlbGVjdG9yIiwib01hdGNoZXNTZWxlY3RvciIsIm1zTWF0Y2hlc1NlbGVjdG9yIiwiZGlzY29ubmVjdGVkTWF0Y2giLCJjb21wYXJlRG9jdW1lbnRQb3NpdGlvbiIsImFkb3duIiwiYnVwIiwiY29tcGFyZSIsInNvcnREZXRhY2hlZCIsImF1cCIsImFwIiwiYnAiLCJ1bnNoaWZ0IiwiZXhwciIsImVsZW1lbnRzIiwidmFsIiwic3BlY2lmaWVkIiwidW5pcXVlU29ydCIsImR1cGxpY2F0ZXMiLCJkZXRlY3REdXBsaWNhdGVzIiwic29ydFN0YWJsZSIsInRleHRDb250ZW50Iiwibm9kZVZhbHVlIiwic2VsZWN0b3JzIiwiY3JlYXRlUHNldWRvIiwicmVsYXRpdmUiLCI+IiwiZGlyIiwiICIsIisiLCJ+IiwicHJlRmlsdGVyIiwiZXhjZXNzIiwidW5xdW90ZWQiLCJub2RlTmFtZVNlbGVjdG9yIiwicGF0dGVybiIsIm9wZXJhdG9yIiwiY2hlY2siLCJyZXN1bHQiLCJ3aGF0Iiwic2ltcGxlIiwiZm9yd2FyZCIsIm9mVHlwZSIsIm91dGVyQ2FjaGUiLCJub2RlSW5kZXgiLCJzdGFydCIsInVzZUNhY2hlIiwibGFzdENoaWxkIiwicHNldWRvIiwic2V0RmlsdGVycyIsImlkeCIsIm1hdGNoZWQiLCJub3QiLCJtYXRjaGVyIiwidW5tYXRjaGVkIiwiaGFzIiwiaW5uZXJUZXh0IiwibGFuZyIsImVsZW1MYW5nIiwiaGFzaCIsInJvb3QiLCJmb2N1cyIsImFjdGl2ZUVsZW1lbnQiLCJoYXNGb2N1cyIsImhyZWYiLCJ0YWJJbmRleCIsImVuYWJsZWQiLCJkaXNhYmxlZCIsImNoZWNrZWQiLCJzZWxlY3RlZCIsInNlbGVjdGVkSW5kZXgiLCJlbXB0eSIsImhlYWRlciIsImJ1dHRvbiIsImV2ZW4iLCJvZGQiLCJsdCIsImd0IiwicmFkaW8iLCJjaGVja2JveCIsImZpbGUiLCJwYXNzd29yZCIsImltYWdlIiwic3VibWl0IiwicmVzZXQiLCJmaWx0ZXJzIiwicGFyc2VPbmx5IiwidG9rZW5zIiwic29GYXIiLCJwcmVGaWx0ZXJzIiwiY2FjaGVkIiwiYWRkQ29tYmluYXRvciIsImNvbWJpbmF0b3IiLCJiYXNlIiwiY2hlY2tOb25FbGVtZW50cyIsImRvbmVOYW1lIiwiZGlya2V5IiwiZWxlbWVudE1hdGNoZXIiLCJtYXRjaGVycyIsImNvbmRlbnNlIiwibmV3VW5tYXRjaGVkIiwibWFwcGVkIiwic2V0TWF0Y2hlciIsInBvc3RGaWx0ZXIiLCJwb3N0RmluZGVyIiwicG9zdFNlbGVjdG9yIiwidGVtcCIsInByZU1hcCIsInBvc3RNYXAiLCJwcmVleGlzdGluZyIsIm11bHRpcGxlQ29udGV4dHMiLCJtYXRjaGVySW4iLCJtYXRjaGVyT3V0IiwibWF0Y2hlckZyb21Ub2tlbnMiLCJjaGVja0NvbnRleHQiLCJsZWFkaW5nUmVsYXRpdmUiLCJpbXBsaWNpdFJlbGF0aXZlIiwibWF0Y2hDb250ZXh0IiwibWF0Y2hBbnlDb250ZXh0IiwibWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzIiwiZWxlbWVudE1hdGNoZXJzIiwic2V0TWF0Y2hlcnMiLCJtYXRjaGVyQ2FjaGVkUnVucyIsImJ5U2V0IiwiYnlFbGVtZW50Iiwic3VwZXJNYXRjaGVyIiwiZXhwYW5kQ29udGV4dCIsInNldE1hdGNoZWQiLCJtYXRjaGVkQ291bnQiLCJvdXRlcm1vc3QiLCJjb250ZXh0QmFja3VwIiwiZGlycnVuc1VuaXF1ZSIsImdyb3VwIiwiY29udGV4dHMiLCJ0b2tlbiIsImRpdjEiLCJkZWZhdWx0VmFsdWUiLCJ1bmlxdWUiLCJpc1hNTERvYyIsIm9wdGlvbnNDYWNoZSIsImNyZWF0ZU9wdGlvbnMiLCJvYmplY3QiLCJmbGFnIiwiQ2FsbGJhY2tzIiwibWVtb3J5IiwiZmlyZWQiLCJmaXJpbmciLCJmaXJpbmdTdGFydCIsImZpcmluZ0xlbmd0aCIsImZpcmluZ0luZGV4IiwibGlzdCIsInN0YWNrIiwib25jZSIsImZpcmUiLCJzdG9wT25GYWxzZSIsInNlbGYiLCJkaXNhYmxlIiwiYWRkIiwiaW5kZXgiLCJsb2NrIiwibG9ja2VkIiwiZmlyZVdpdGgiLCJmdW5jIiwidHVwbGVzIiwic3RhdGUiLCJhbHdheXMiLCJkZWZlcnJlZCIsImZhaWwiLCJ0aGVuIiwiZm5zIiwibmV3RGVmZXIiLCJ0dXBsZSIsImFjdGlvbiIsInJldHVybmVkIiwicmVzb2x2ZSIsInJlamVjdCIsInByb2dyZXNzIiwibm90aWZ5IiwicGlwZSIsInN0YXRlU3RyaW5nIiwid2hlbiIsInN1Ym9yZGluYXRlIiwicmVzb2x2ZVZhbHVlcyIsInJlbWFpbmluZyIsInVwZGF0ZUZ1bmMiLCJ2YWx1ZXMiLCJwcm9ncmVzc1ZhbHVlcyIsIm5vdGlmeVdpdGgiLCJwcm9ncmVzc0NvbnRleHRzIiwicmVzb2x2ZUNvbnRleHRzIiwiZnJhZ21lbnQiLCJjcmVhdGVEb2N1bWVudEZyYWdtZW50Iiwib3B0IiwiY2hlY2tPbiIsIm9wdFNlbGVjdGVkIiwicmVsaWFibGVNYXJnaW5SaWdodCIsImJveFNpemluZ1JlbGlhYmxlIiwicGl4ZWxQb3NpdGlvbiIsIm5vQ2xvbmVDaGVja2VkIiwiY2xvbmVOb2RlIiwib3B0RGlzYWJsZWQiLCJyYWRpb1ZhbHVlIiwiY2hlY2tDbG9uZSIsImZvY3VzaW5CdWJibGVzIiwiYmFja2dyb3VuZENsaXAiLCJjbGVhckNsb25lU3R5bGUiLCJjb250YWluZXIiLCJtYXJnaW5EaXYiLCJkaXZSZXNldCIsImJvZHkiLCJjc3NUZXh0Iiwiem9vbSIsImJveFNpemluZyIsIm9mZnNldFdpZHRoIiwiZ2V0Q29tcHV0ZWRTdHlsZSIsIndpZHRoIiwibWFyZ2luUmlnaHQiLCJkYXRhX3VzZXIiLCJkYXRhX3ByaXYiLCJyYnJhY2UiLCJybXVsdGlEYXNoIiwiRGF0YSIsImRlZmluZVByb3BlcnR5IiwidWlkIiwiYWNjZXB0cyIsIm93bmVyIiwiZGVzY3JpcHRvciIsInVubG9jayIsImRlZmluZVByb3BlcnRpZXMiLCJzZXQiLCJwcm9wIiwic3RvcmVkIiwiY2FtZWwiLCJoYXNEYXRhIiwiZGlzY2FyZCIsImFjY2VwdERhdGEiLCJyZW1vdmVEYXRhIiwiX2RhdGEiLCJfcmVtb3ZlRGF0YSIsImRhdGFBdHRyIiwiY2FtZWxLZXkiLCJxdWV1ZSIsImRlcXVldWUiLCJzdGFydExlbmd0aCIsImhvb2tzIiwiX3F1ZXVlSG9va3MiLCJuZXh0Iiwic3RvcCIsInNldHRlciIsImRlbGF5IiwidGltZSIsImZ4Iiwic3BlZWRzIiwidGltZW91dCIsImNsZWFyVGltZW91dCIsImNsZWFyUXVldWUiLCJjb3VudCIsImRlZmVyIiwibm9kZUhvb2siLCJib29sSG9vayIsInJjbGFzcyIsInJyZXR1cm4iLCJyZm9jdXNhYmxlIiwicmVtb3ZlQXR0ciIsInJlbW92ZVByb3AiLCJwcm9wRml4IiwiYWRkQ2xhc3MiLCJjbGFzc2VzIiwiY2xhenoiLCJwcm9jZWVkIiwicmVtb3ZlQ2xhc3MiLCJ0b2dnbGVDbGFzcyIsInN0YXRlVmFsIiwiY2xhc3NOYW1lcyIsImhhc0NsYXNzIiwidmFsSG9va3MiLCJvcHRpb24iLCJvbmUiLCJtYXgiLCJvcHRpb25TZXQiLCJuVHlwZSIsImF0dHJIb29rcyIsInByb3BOYW1lIiwiYXR0ck5hbWVzIiwiZm9yIiwiY2xhc3MiLCJub3R4bWwiLCJwcm9wSG9va3MiLCJoYXNBdHRyaWJ1dGUiLCJnZXR0ZXIiLCJya2V5RXZlbnQiLCJybW91c2VFdmVudCIsInJmb2N1c01vcnBoIiwicnR5cGVuYW1lc3BhY2UiLCJyZXR1cm5UcnVlIiwicmV0dXJuRmFsc2UiLCJzYWZlQWN0aXZlRWxlbWVudCIsImVyciIsImV2ZW50IiwiZ2xvYmFsIiwidHlwZXMiLCJoYW5kbGVPYmpJbiIsImV2ZW50SGFuZGxlIiwiZXZlbnRzIiwidCIsImhhbmRsZU9iaiIsInNwZWNpYWwiLCJoYW5kbGVycyIsIm5hbWVzcGFjZXMiLCJvcmlnVHlwZSIsImVsZW1EYXRhIiwiaGFuZGxlIiwidHJpZ2dlcmVkIiwiZGlzcGF0Y2giLCJkZWxlZ2F0ZVR5cGUiLCJiaW5kVHlwZSIsIm5hbWVzcGFjZSIsImRlbGVnYXRlQ291bnQiLCJzZXR1cCIsIm1hcHBlZFR5cGVzIiwib3JpZ0NvdW50IiwidGVhcmRvd24iLCJyZW1vdmVFdmVudCIsIm9ubHlIYW5kbGVycyIsImJ1YmJsZVR5cGUiLCJvbnR5cGUiLCJldmVudFBhdGgiLCJFdmVudCIsImlzVHJpZ2dlciIsIm5hbWVzcGFjZV9yZSIsIm5vQnViYmxlIiwicGFyZW50V2luZG93IiwiaXNQcm9wYWdhdGlvblN0b3BwZWQiLCJwcmV2ZW50RGVmYXVsdCIsImlzRGVmYXVsdFByZXZlbnRlZCIsIl9kZWZhdWx0IiwiZml4IiwiaGFuZGxlclF1ZXVlIiwiZGVsZWdhdGVUYXJnZXQiLCJwcmVEaXNwYXRjaCIsImN1cnJlbnRUYXJnZXQiLCJpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCIsInN0b3BQcm9wYWdhdGlvbiIsInBvc3REaXNwYXRjaCIsInNlbCIsInByb3BzIiwiZml4SG9va3MiLCJrZXlIb29rcyIsIm9yaWdpbmFsIiwid2hpY2giLCJjaGFyQ29kZSIsImtleUNvZGUiLCJtb3VzZUhvb2tzIiwiZXZlbnREb2MiLCJwYWdlWCIsImNsaWVudFgiLCJzY3JvbGxMZWZ0IiwiY2xpZW50TGVmdCIsInBhZ2VZIiwiY2xpZW50WSIsInNjcm9sbFRvcCIsImNsaWVudFRvcCIsIm9yaWdpbmFsRXZlbnQiLCJmaXhIb29rIiwibG9hZCIsImJsdXIiLCJjbGljayIsImJlZm9yZXVubG9hZCIsInJldHVyblZhbHVlIiwic2ltdWxhdGUiLCJidWJibGUiLCJpc1NpbXVsYXRlZCIsImRlZmF1bHRQcmV2ZW50ZWQiLCJnZXRQcmV2ZW50RGVmYXVsdCIsInRpbWVTdGFtcCIsInN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiIsIm1vdXNlZW50ZXIiLCJtb3VzZWxlYXZlIiwib3JpZyIsInJlbGF0ZWQiLCJyZWxhdGVkVGFyZ2V0IiwiYXR0YWNoZXMiLCJvbiIsIm9yaWdGbiIsInRyaWdnZXJIYW5kbGVyIiwiaXNTaW1wbGUiLCJycGFyZW50c3ByZXYiLCJybmVlZHNDb250ZXh0IiwiZ3VhcmFudGVlZFVuaXF1ZSIsImNoaWxkcmVuIiwiY29udGVudHMiLCJwcmV2IiwidGFyZ2V0cyIsIndpbm5vdyIsImlzIiwiY2xvc2VzdCIsInBvcyIsInByZXZBbGwiLCJhZGRCYWNrIiwic2libGluZyIsInBhcmVudHMiLCJwYXJlbnRzVW50aWwiLCJ1bnRpbCIsIm5leHRBbGwiLCJuZXh0VW50aWwiLCJwcmV2VW50aWwiLCJzaWJsaW5ncyIsImNvbnRlbnREb2N1bWVudCIsInJldmVyc2UiLCJ0cnVuY2F0ZSIsIm4iLCJxdWFsaWZpZXIiLCJyeGh0bWxUYWciLCJydGFnTmFtZSIsInJodG1sIiwicm5vSW5uZXJodG1sIiwibWFuaXB1bGF0aW9uX3JjaGVja2FibGVUeXBlIiwicmNoZWNrZWQiLCJyc2NyaXB0VHlwZSIsInJzY3JpcHRUeXBlTWFza2VkIiwicmNsZWFuU2NyaXB0Iiwid3JhcE1hcCIsInRoZWFkIiwiY29sIiwidHIiLCJ0ZCIsIm9wdGdyb3VwIiwidGJvZHkiLCJ0Zm9vdCIsImNvbGdyb3VwIiwiY2FwdGlvbiIsInRoIiwiYXBwZW5kIiwiY3JlYXRlVGV4dE5vZGUiLCJkb21NYW5pcCIsIm1hbmlwdWxhdGlvblRhcmdldCIsInByZXBlbmQiLCJpbnNlcnRCZWZvcmUiLCJiZWZvcmUiLCJhZnRlciIsImtlZXBEYXRhIiwiY2xlYW5EYXRhIiwiZ2V0QWxsIiwic2V0R2xvYmFsRXZhbCIsImRhdGFBbmRFdmVudHMiLCJkZWVwRGF0YUFuZEV2ZW50cyIsImh0bWwiLCJyZXBsYWNlV2l0aCIsImRldGFjaCIsImFsbG93SW50ZXJzZWN0aW9uIiwiaGFzU2NyaXB0cyIsImlOb0Nsb25lIiwiZGlzYWJsZVNjcmlwdCIsInJlc3RvcmVTY3JpcHQiLCJfZXZhbFVybCIsImFwcGVuZFRvIiwicHJlcGVuZFRvIiwiaW5zZXJ0QWZ0ZXIiLCJyZXBsYWNlQWxsIiwiaW5zZXJ0Iiwic3JjRWxlbWVudHMiLCJkZXN0RWxlbWVudHMiLCJpblBhZ2UiLCJmaXhJbnB1dCIsImNsb25lQ29weUV2ZW50Iiwic2VsZWN0aW9uIiwid3JhcCIsIm5vZGVzIiwidXJsIiwiYWpheCIsImRhdGFUeXBlIiwiYXN5bmMiLCJ0aHJvd3MiLCJjb250ZW50IiwicmVmRWxlbWVudHMiLCJkZXN0IiwicGRhdGFPbGQiLCJwZGF0YUN1ciIsInVkYXRhT2xkIiwidWRhdGFDdXIiLCJ3cmFwQWxsIiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJ3cmFwSW5uZXIiLCJ1bndyYXAiLCJjdXJDU1MiLCJpZnJhbWUiLCJyZGlzcGxheXN3YXAiLCJybWFyZ2luIiwicm51bXNwbGl0Iiwicm51bW5vbnB4IiwicnJlbE51bSIsImVsZW1kaXNwbGF5IiwiQk9EWSIsImNzc1Nob3ciLCJwb3NpdGlvbiIsInZpc2liaWxpdHkiLCJkaXNwbGF5IiwiY3NzTm9ybWFsVHJhbnNmb3JtIiwibGV0dGVyU3BhY2luZyIsImZvbnRXZWlnaHQiLCJjc3NFeHBhbmQiLCJjc3NQcmVmaXhlcyIsInZlbmRvclByb3BOYW1lIiwiY2FwTmFtZSIsIm9yaWdOYW1lIiwiaXNIaWRkZW4iLCJlbCIsImNzcyIsImdldFN0eWxlcyIsInNob3dIaWRlIiwic2hvdyIsImhpZGRlbiIsImNzc19kZWZhdWx0RGlzcGxheSIsInN0eWxlcyIsImhpZGUiLCJ0b2dnbGUiLCJjc3NIb29rcyIsIm9wYWNpdHkiLCJjb21wdXRlZCIsImNzc051bWJlciIsImNvbHVtbkNvdW50IiwiZmlsbE9wYWNpdHkiLCJsaW5lSGVpZ2h0Iiwib3JkZXIiLCJvcnBoYW5zIiwid2lkb3dzIiwiekluZGV4IiwiY3NzUHJvcHMiLCJmbG9hdCIsImV4dHJhIiwiX2NvbXB1dGVkIiwibWluV2lkdGgiLCJtYXhXaWR0aCIsImdldFByb3BlcnR5VmFsdWUiLCJzZXRQb3NpdGl2ZU51bWJlciIsInN1YnRyYWN0IiwiYXVnbWVudFdpZHRoT3JIZWlnaHQiLCJpc0JvcmRlckJveCIsImdldFdpZHRoT3JIZWlnaHQiLCJ2YWx1ZUlzQm9yZGVyQm94Iiwib2Zmc2V0SGVpZ2h0IiwiYWN0dWFsRGlzcGxheSIsImNvbnRlbnRXaW5kb3ciLCJ3cml0ZSIsImNsb3NlIiwidmlzaWJsZSIsIm1hcmdpbiIsInBhZGRpbmciLCJib3JkZXIiLCJwcmVmaXgiLCJzdWZmaXgiLCJleHBhbmQiLCJleHBhbmRlZCIsInBhcnRzIiwicjIwIiwicmJyYWNrZXQiLCJyQ1JMRiIsInJzdWJtaXR0ZXJUeXBlcyIsInJzdWJtaXR0YWJsZSIsInNlcmlhbGl6ZSIsInBhcmFtIiwic2VyaWFsaXplQXJyYXkiLCJ0cmFkaXRpb25hbCIsInMiLCJlbmNvZGVVUklDb21wb25lbnQiLCJhamF4U2V0dGluZ3MiLCJidWlsZFBhcmFtcyIsInYiLCJob3ZlciIsImZuT3ZlciIsImZuT3V0IiwiYmluZCIsInVuYmluZCIsImRlbGVnYXRlIiwidW5kZWxlZ2F0ZSIsImFqYXhMb2NQYXJ0cyIsImFqYXhMb2NhdGlvbiIsImFqYXhfbm9uY2UiLCJhamF4X3JxdWVyeSIsInJoYXNoIiwicnRzIiwicmhlYWRlcnMiLCJybG9jYWxQcm90b2NvbCIsInJub0NvbnRlbnQiLCJycHJvdG9jb2wiLCJydXJsIiwiX2xvYWQiLCJwcmVmaWx0ZXJzIiwidHJhbnNwb3J0cyIsImFsbFR5cGVzIiwiYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzIiwic3RydWN0dXJlIiwiZGF0YVR5cGVFeHByZXNzaW9uIiwiZGF0YVR5cGVzIiwiaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMiLCJvcmlnaW5hbE9wdGlvbnMiLCJqcVhIUiIsImluc3BlY3RlZCIsInNlZWtpbmdUcmFuc3BvcnQiLCJpbnNwZWN0IiwicHJlZmlsdGVyT3JGYWN0b3J5IiwiZGF0YVR5cGVPclRyYW5zcG9ydCIsImFqYXhFeHRlbmQiLCJmbGF0T3B0aW9ucyIsInBhcmFtcyIsInJlc3BvbnNlIiwicmVzcG9uc2VUZXh0IiwiY29tcGxldGUiLCJzdGF0dXMiLCJhY3RpdmUiLCJsYXN0TW9kaWZpZWQiLCJldGFnIiwiaXNMb2NhbCIsInByb2Nlc3NEYXRhIiwiY29udGVudFR5cGUiLCIqIiwianNvbiIsInJlc3BvbnNlRmllbGRzIiwiY29udmVydGVycyIsIiogdGV4dCIsInRleHQgaHRtbCIsInRleHQganNvbiIsInRleHQgeG1sIiwiYWpheFNldHVwIiwic2V0dGluZ3MiLCJhamF4UHJlZmlsdGVyIiwiYWpheFRyYW5zcG9ydCIsInRyYW5zcG9ydCIsImNhY2hlVVJMIiwicmVzcG9uc2VIZWFkZXJzU3RyaW5nIiwicmVzcG9uc2VIZWFkZXJzIiwidGltZW91dFRpbWVyIiwiZmlyZUdsb2JhbHMiLCJjYWxsYmFja0NvbnRleHQiLCJnbG9iYWxFdmVudENvbnRleHQiLCJjb21wbGV0ZURlZmVycmVkIiwic3RhdHVzQ29kZSIsInJlcXVlc3RIZWFkZXJzIiwicmVxdWVzdEhlYWRlcnNOYW1lcyIsInN0ckFib3J0IiwiZ2V0UmVzcG9uc2VIZWFkZXIiLCJnZXRBbGxSZXNwb25zZUhlYWRlcnMiLCJzZXRSZXF1ZXN0SGVhZGVyIiwibG5hbWUiLCJvdmVycmlkZU1pbWVUeXBlIiwibWltZVR5cGUiLCJhYm9ydCIsInN0YXR1c1RleHQiLCJmaW5hbFRleHQiLCJzdWNjZXNzIiwibWV0aG9kIiwiY3Jvc3NEb21haW4iLCJoYXNDb250ZW50IiwiaWZNb2RpZmllZCIsImhlYWRlcnMiLCJiZWZvcmVTZW5kIiwic2VuZCIsIm5hdGl2ZVN0YXR1c1RleHQiLCJyZXNwb25zZXMiLCJpc1N1Y2Nlc3MiLCJtb2RpZmllZCIsImFqYXhIYW5kbGVSZXNwb25zZXMiLCJhamF4Q29udmVydCIsInJlamVjdFdpdGgiLCJnZXRKU09OIiwiZ2V0U2NyaXB0IiwiY3QiLCJmaW5hbERhdGFUeXBlIiwiZmlyc3REYXRhVHlwZSIsImNvbnYyIiwiY3VycmVudCIsImNvbnYiLCJkYXRhRmlsdGVyIiwidGV4dCBzY3JpcHQiLCJjaGFyc2V0Iiwic2NyaXB0Q2hhcnNldCIsImV2dCIsIm9sZENhbGxiYWNrcyIsInJqc29ucCIsImpzb25wIiwianNvbnBDYWxsYmFjayIsIm9yaWdpbmFsU2V0dGluZ3MiLCJjYWxsYmFja05hbWUiLCJvdmVyd3JpdHRlbiIsInJlc3BvbnNlQ29udGFpbmVyIiwianNvblByb3AiLCJ4aHIiLCJYTUxIdHRwUmVxdWVzdCIsInhoclN1cHBvcnRlZCIsInhoclN1Y2Nlc3NTdGF0dXMiLDEyMjMsInhocklkIiwieGhyQ2FsbGJhY2tzIiwiQWN0aXZlWE9iamVjdCIsImNvcnMiLCJvcGVuIiwidXNlcm5hbWUiLCJ4aHJGaWVsZHMiLCJvbmxvYWQiLCJvbmVycm9yIiwiZnhOb3ciLCJ0aW1lcklkIiwicmZ4dHlwZXMiLCJyZnhudW0iLCJycnVuIiwiYW5pbWF0aW9uUHJlZmlsdGVycyIsImRlZmF1bHRQcmVmaWx0ZXIiLCJ0d2VlbmVycyIsInR3ZWVuIiwiY3JlYXRlVHdlZW4iLCJ1bml0Iiwic2NhbGUiLCJtYXhJdGVyYXRpb25zIiwiY3JlYXRlRnhOb3ciLCJhbmltYXRpb24iLCJjb2xsZWN0aW9uIiwiQW5pbWF0aW9uIiwicHJvcGVydGllcyIsInN0b3BwZWQiLCJ0aWNrIiwiY3VycmVudFRpbWUiLCJzdGFydFRpbWUiLCJkdXJhdGlvbiIsInBlcmNlbnQiLCJ0d2VlbnMiLCJydW4iLCJvcHRzIiwic3BlY2lhbEVhc2luZyIsIm9yaWdpbmFsUHJvcGVydGllcyIsIlR3ZWVuIiwiZWFzaW5nIiwiZ290b0VuZCIsInByb3BGaWx0ZXIiLCJ0aW1lciIsImFuaW0iLCJ0d2VlbmVyIiwicHJlZmlsdGVyIiwib2xkZmlyZSIsImRhdGFTaG93IiwidW5xdWV1ZWQiLCJvdmVyZmxvdyIsIm92ZXJmbG93WCIsIm92ZXJmbG93WSIsImVhc2VkIiwic3RlcCIsImNzc0ZuIiwic3BlZWQiLCJhbmltYXRlIiwiZ2VuRngiLCJmYWRlVG8iLCJ0byIsIm9wdGFsbCIsImRvQW5pbWF0aW9uIiwiZmluaXNoIiwic3RvcFF1ZXVlIiwidGltZXJzIiwiaW5jbHVkZVdpZHRoIiwiaGVpZ2h0Iiwic2xpZGVEb3duIiwic2xpZGVVcCIsInNsaWRlVG9nZ2xlIiwiZmFkZUluIiwiZmFkZU91dCIsImZhZGVUb2dnbGUiLCJsaW5lYXIiLCJwIiwic3dpbmciLCJjb3MiLCJQSSIsImludGVydmFsIiwic2V0SW50ZXJ2YWwiLCJjbGVhckludGVydmFsIiwic2xvdyIsImZhc3QiLCJhbmltYXRlZCIsIm9mZnNldCIsInNldE9mZnNldCIsIndpbiIsImJveCIsImxlZnQiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJnZXRXaW5kb3ciLCJwYWdlWU9mZnNldCIsInBhZ2VYT2Zmc2V0IiwiY3VyUG9zaXRpb24iLCJjdXJMZWZ0IiwiY3VyQ1NTVG9wIiwiY3VyVG9wIiwiY3VyT2Zmc2V0IiwiY3VyQ1NTTGVmdCIsImNhbGN1bGF0ZVBvc2l0aW9uIiwiY3VyRWxlbSIsInVzaW5nIiwib2Zmc2V0UGFyZW50IiwicGFyZW50T2Zmc2V0Iiwic2Nyb2xsVG8iLCJIZWlnaHQiLCJXaWR0aCIsImRlZmF1bHRFeHRyYSIsImZ1bmNOYW1lIiwic2l6ZSIsImFuZFNlbGYiLCJtb2R1bGUiLCJleHBvcnRzIiwiZGVmaW5lIiwiYW1kIl0sIm1hcHBpbmdzIjoiOzs7Q0FhQSxTQUFXQSxFQUFRQyxXQU9uQixHQUVDQyxHQUdBQyxFQUlBQyxRQUEyQkgsV0FHM0JJLEVBQVdMLEVBQU9LLFNBQ2xCQyxFQUFXTixFQUFPTSxTQUNsQkMsRUFBVUQsRUFBU0UsZ0JBR25CQyxFQUFVVCxFQUFPVSxPQUdqQkMsRUFBS1gsRUFBT1ksRUFHWkMsS0FHQUMsS0FFQUMsRUFBZSxRQUdmQyxFQUFjRixFQUFnQkcsT0FDOUJDLEVBQVlKLEVBQWdCSyxLQUM1QkMsRUFBYU4sRUFBZ0JPLE1BQzdCQyxFQUFlUixFQUFnQlMsUUFDL0JDLEVBQWdCWCxFQUFXWSxTQUMzQkMsRUFBY2IsRUFBV2MsZUFDekJDLEVBQVliLEVBQWFjLEtBR3pCbkIsRUFBUyxTQUFVb0IsRUFBVUMsR0FFNUIsTUFBTyxJQUFJckIsR0FBT3NCLEdBQUdDLEtBQU1ILEVBQVVDLEVBQVM3QixJQUkvQ2dDLEVBQVksc0NBQXNDQyxPQUdsREMsRUFBaUIsT0FLakJDLEVBQWEsc0NBR2JDLEVBQWEsNkJBR2JDLEVBQVksUUFDWkMsRUFBYSxlQUdiQyxFQUFhLFNBQVVDLEVBQUtDLEdBQzNCLE1BQU9BLEdBQU9DLGVBSWZDLEVBQVksV0FDWHZDLEVBQVN3QyxvQkFBcUIsbUJBQW9CRCxHQUFXLEdBQzdEN0MsRUFBTzhDLG9CQUFxQixPQUFRRCxHQUFXLEdBQy9DbkMsRUFBT3FDLFFBR1RyQyxHQUFPc0IsR0FBS3RCLEVBQU9zQyxXQUVsQkMsT0FBUWxDLEVBRVJtQyxZQUFheEMsRUFDYnVCLEtBQU0sU0FBVUgsRUFBVUMsRUFBUzdCLEdBQ2xDLEdBQUlpRCxHQUFPQyxDQUdYLEtBQU10QixFQUNMLE1BQU91QixLQUlSLElBQXlCLGdCQUFidkIsR0FBd0IsQ0FVbkMsR0FQQ3FCLEVBRjJCLE1BQXZCckIsRUFBU3dCLE9BQU8sSUFBeUQsTUFBM0N4QixFQUFTd0IsT0FBUXhCLEVBQVN5QixPQUFTLElBQWV6QixFQUFTeUIsUUFBVSxHQUU3RixLQUFNekIsRUFBVSxNQUdsQk8sRUFBV21CLEtBQU0xQixJQUlyQnFCLElBQVVBLEVBQU0sSUFBT3BCLEVBK0NyQixPQUFNQSxHQUFXQSxFQUFRa0IsUUFDdEJsQixHQUFXN0IsR0FBYXVELEtBQU0zQixHQUtoQ3VCLEtBQUtILFlBQWFuQixHQUFVMEIsS0FBTTNCLEVBbER6QyxJQUFLcUIsRUFBTSxHQUFLLENBV2YsR0FWQXBCLEVBQVVBLFlBQW1CckIsR0FBU3FCLEVBQVEsR0FBS0EsRUFHbkRyQixFQUFPZ0QsTUFBT0wsS0FBTTNDLEVBQU9pRCxVQUMxQlIsRUFBTSxHQUNOcEIsR0FBV0EsRUFBUTZCLFNBQVc3QixFQUFROEIsZUFBaUI5QixFQUFVekIsR0FDakUsSUFJSWdDLEVBQVd3QixLQUFNWCxFQUFNLEtBQVF6QyxFQUFPcUQsY0FBZWhDLEdBQ3pELElBQU1vQixJQUFTcEIsR0FFVHJCLEVBQU9zRCxXQUFZWCxLQUFNRixJQUM3QkUsS0FBTUYsR0FBU3BCLEVBQVNvQixJQUl4QkUsS0FBS1ksS0FBTWQsRUFBT3BCLEVBQVNvQixHQUs5QixPQUFPRSxNQWdCUCxNQVpBRCxHQUFPOUMsRUFBUzRELGVBQWdCZixFQUFNLElBSWpDQyxHQUFRQSxFQUFLZSxhQUVqQmQsS0FBS0UsT0FBUyxFQUNkRixLQUFLLEdBQUtELEdBR1hDLEtBQUt0QixRQUFVekIsRUFDZitDLEtBQUt2QixTQUFXQSxFQUNUdUIsS0FjSCxNQUFLdkIsR0FBUzhCLFVBQ3BCUCxLQUFLdEIsUUFBVXNCLEtBQUssR0FBS3ZCLEVBQ3pCdUIsS0FBS0UsT0FBUyxFQUNQRixNQUlJM0MsRUFBT3NELFdBQVlsQyxHQUN2QjVCLEVBQVc2QyxNQUFPakIsSUFHckJBLEVBQVNBLFdBQWE3QixZQUMxQm9ELEtBQUt2QixTQUFXQSxFQUFTQSxTQUN6QnVCLEtBQUt0QixRQUFVRCxFQUFTQyxTQUdsQnJCLEVBQU8wRCxVQUFXdEMsRUFBVXVCLFFBSXBDdkIsU0FBVSxHQUdWeUIsT0FBUSxFQUVSYyxRQUFTLFdBQ1IsTUFBT2pELEdBQVdrRCxLQUFNakIsT0FLekJrQixJQUFLLFNBQVVDLEdBQ2QsTUFBYyxPQUFQQSxFQUdObkIsS0FBS2dCLFVBR0csRUFBTkcsRUFBVW5CLEtBQU1BLEtBQUtFLE9BQVNpQixHQUFRbkIsS0FBTW1CLElBS2hEQyxVQUFXLFNBQVVDLEdBR3BCLEdBQUlDLEdBQU1qRSxFQUFPZ0QsTUFBT0wsS0FBS0gsY0FBZXdCLEVBTzVDLE9BSkFDLEdBQUlDLFdBQWF2QixLQUNqQnNCLEVBQUk1QyxRQUFVc0IsS0FBS3RCLFFBR1o0QyxHQU1SRSxLQUFNLFNBQVVDLEVBQVVDLEdBQ3pCLE1BQU9yRSxHQUFPbUUsS0FBTXhCLEtBQU15QixFQUFVQyxJQUdyQ2hDLE1BQU8sU0FBVWYsR0FJaEIsTUFGQXRCLEdBQU9xQyxNQUFNaUMsVUFBVUMsS0FBTWpELEdBRXRCcUIsTUFHUmhDLE1BQU8sV0FDTixNQUFPZ0MsTUFBS29CLFVBQVdyRCxFQUFXOEQsTUFBTzdCLEtBQU04QixhQUdoREMsTUFBTyxXQUNOLE1BQU8vQixNQUFLZ0MsR0FBSSxJQUdqQkMsS0FBTSxXQUNMLE1BQU9qQyxNQUFLZ0MsR0FBSSxLQUdqQkEsR0FBSSxTQUFVRSxHQUNiLEdBQUlDLEdBQU1uQyxLQUFLRSxPQUNka0MsR0FBS0YsR0FBVSxFQUFKQSxFQUFRQyxFQUFNLEVBQzFCLE9BQU9uQyxNQUFLb0IsVUFBV2dCLEdBQUssR0FBU0QsRUFBSkMsR0FBWXBDLEtBQUtvQyxTQUduREMsSUFBSyxTQUFVWixHQUNkLE1BQU96QixNQUFLb0IsVUFBVy9ELEVBQU9nRixJQUFJckMsS0FBTSxTQUFVRCxFQUFNbUMsR0FDdkQsTUFBT1QsR0FBU1IsS0FBTWxCLEVBQU1tQyxFQUFHbkMsT0FJakN1QyxJQUFLLFdBQ0osTUFBT3RDLE1BQUt1QixZQUFjdkIsS0FBS0gsWUFBWSxPQUs1Qy9CLEtBQU1ELEVBQ04wRSxRQUFTQSxLQUNUQyxVQUFXQSxRQUlabkYsRUFBT3NCLEdBQUdDLEtBQUtlLFVBQVl0QyxFQUFPc0IsR0FFbEN0QixFQUFPb0YsT0FBU3BGLEVBQU9zQixHQUFHOEQsT0FBUyxXQUNsQyxHQUFJQyxHQUFTQyxFQUFNQyxFQUFLQyxFQUFNQyxFQUFhQyxFQUMxQ0MsRUFBU2xCLFVBQVUsT0FDbkJJLEVBQUksRUFDSmhDLEVBQVM0QixVQUFVNUIsT0FDbkIrQyxHQUFPLENBcUJSLEtBbEJ1QixpQkFBWEQsS0FDWEMsRUFBT0QsRUFDUEEsRUFBU2xCLFVBQVUsT0FFbkJJLEVBQUksR0FJa0IsZ0JBQVhjLElBQXdCM0YsRUFBT3NELFdBQVdxQyxLQUNyREEsTUFJSTlDLElBQVdnQyxJQUNmYyxFQUFTaEQsT0FDUGtDLEdBR1NoQyxFQUFKZ0MsRUFBWUEsSUFFbkIsR0FBbUMsT0FBN0JRLEVBQVVaLFVBQVdJLElBRTFCLElBQU1TLElBQVFELEdBQ2JFLEVBQU1JLEVBQVFMLEdBQ2RFLEVBQU9ILEVBQVNDLEdBR1hLLElBQVdILElBS1hJLEdBQVFKLElBQVV4RixFQUFPcUQsY0FBY21DLEtBQVVDLEVBQWN6RixFQUFPNkYsUUFBUUwsTUFDN0VDLEdBQ0pBLEdBQWMsRUFDZEMsRUFBUUgsR0FBT3ZGLEVBQU82RixRQUFRTixHQUFPQSxNQUdyQ0csRUFBUUgsR0FBT3ZGLEVBQU9xRCxjQUFja0MsR0FBT0EsS0FJNUNJLEVBQVFMLEdBQVN0RixFQUFPb0YsT0FBUVEsRUFBTUYsRUFBT0YsSUFHbENBLElBQVNqRyxZQUNwQm9HLEVBQVFMLEdBQVNFLEdBT3JCLE9BQU9HLElBR1IzRixFQUFPb0YsUUFFTlUsUUFBUyxVQUFhekYsRUFBZTBGLEtBQUtDLFVBQVdDLFFBQVMsTUFBTyxJQUVyRUMsV0FBWSxTQUFVTixHQVNyQixNQVJLdEcsR0FBT1ksSUFBTUYsSUFDakJWLEVBQU9ZLEVBQUlELEdBR1AyRixHQUFRdEcsRUFBT1UsU0FBV0EsSUFDOUJWLEVBQU9VLE9BQVNELEdBR1ZDLEdBSVJtRyxTQUFTLEVBSVRDLFVBQVcsRUFHWEMsVUFBVyxTQUFVQyxHQUNmQSxFQUNKdEcsRUFBT29HLFlBRVBwRyxFQUFPcUMsT0FBTyxJQUtoQkEsTUFBTyxTQUFVa0UsSUFHWEEsS0FBUyxJQUFTdkcsRUFBT29HLFVBQVlwRyxFQUFPbUcsV0FLakRuRyxFQUFPbUcsU0FBVSxFQUdaSSxLQUFTLEtBQVV2RyxFQUFPb0csVUFBWSxJQUszQzNHLEVBQVUrRyxZQUFhNUcsR0FBWUksSUFHOUJBLEVBQU9zQixHQUFHbUYsU0FDZHpHLEVBQVFKLEdBQVc2RyxRQUFRLFNBQVNDLElBQUksWUFPMUNwRCxXQUFZLFNBQVVxRCxHQUNyQixNQUE0QixhQUFyQjNHLEVBQU80RyxLQUFLRCxJQUdwQmQsUUFBU2dCLE1BQU1oQixRQUVmaUIsU0FBVSxTQUFVSCxHQUNuQixNQUFjLE9BQVBBLEdBQWVBLElBQVFBLEVBQUlySCxRQUduQ3lILFVBQVcsU0FBVUosR0FDcEIsT0FBUUssTUFBT0MsV0FBV04sS0FBVU8sU0FBVVAsSUFHL0NDLEtBQU0sU0FBVUQsR0FDZixNQUFZLE9BQVBBLEVBQ1dBLEVBQVJRLEdBR2MsZ0JBQVJSLElBQW1DLGtCQUFSQSxHQUN4Q3hHLEVBQVlXLEVBQWM4QyxLQUFLK0MsS0FBVSxlQUNsQ0EsSUFHVHRELGNBQWUsU0FBVXNELEdBS3hCLEdBQTRCLFdBQXZCM0csRUFBTzRHLEtBQU1ELElBQXNCQSxFQUFJekQsVUFBWWxELEVBQU84RyxTQUFVSCxHQUN4RSxPQUFPLENBT1IsS0FDQyxHQUFLQSxFQUFJbkUsY0FDTnhCLEVBQVk0QyxLQUFNK0MsRUFBSW5FLFlBQVlGLFVBQVcsaUJBQy9DLE9BQU8sRUFFUCxNQUFROEUsR0FDVCxPQUFPLEVBS1IsT0FBTyxHQUdSQyxjQUFlLFNBQVVWLEdBQ3hCLEdBQUlyQixFQUNKLEtBQU1BLElBQVFxQixHQUNiLE9BQU8sQ0FFUixRQUFPLEdBR1JXLE1BQU8sU0FBVUMsR0FDaEIsS0FBVUMsT0FBT0QsSUFNbEJ0RSxVQUFXLFNBQVV3RSxFQUFNcEcsRUFBU3FHLEdBQ25DLElBQU1ELEdBQXdCLGdCQUFUQSxHQUNwQixNQUFPLEtBRWdCLGtCQUFacEcsS0FDWHFHLEVBQWNyRyxFQUNkQSxHQUFVLEdBRVhBLEVBQVVBLEdBQVd6QixDQUVyQixJQUFJK0gsR0FBUy9GLEVBQVdrQixLQUFNMkUsR0FDN0JHLEdBQVdGLEtBR1osT0FBS0MsSUFDS3RHLEVBQVF3RyxjQUFlRixFQUFPLE1BR3hDQSxFQUFTM0gsRUFBTzhILGVBQWlCTCxHQUFRcEcsRUFBU3VHLEdBRTdDQSxHQUNKNUgsRUFBUTRILEdBQVVHLFNBR1ovSCxFQUFPZ0QsU0FBVzJFLEVBQU9LLGNBR2pDQyxVQUFXQyxLQUFLQyxNQUdoQkMsU0FBVSxTQUFVWCxHQUNuQixHQUFJWSxHQUFLQyxDQUNULEtBQU1iLEdBQXdCLGdCQUFUQSxHQUNwQixNQUFPLEtBSVIsS0FDQ2EsRUFBTSxHQUFJQyxXQUNWRixFQUFNQyxFQUFJRSxnQkFBaUJmLEVBQU8sWUFDakMsTUFBUUwsR0FDVGlCLEVBQU05SSxVQU1QLFFBSE04SSxHQUFPQSxFQUFJSSxxQkFBc0IsZUFBZ0I1RixTQUN0RDdDLEVBQU9zSCxNQUFPLGdCQUFrQkcsR0FFMUJZLEdBR1JLLEtBQU0sYUFHTkMsV0FBWSxTQUFVQyxHQUNyQixHQUFJQyxHQUNGQyxFQUFXQyxJQUViSCxHQUFPNUksRUFBT21CLEtBQU15SCxHQUVmQSxJQUlnQyxJQUEvQkEsRUFBSy9ILFFBQVEsZUFDakJnSSxFQUFTakosRUFBU2lJLGNBQWMsVUFDaENnQixFQUFPRyxLQUFPSixFQUNkaEosRUFBU3FKLEtBQUtDLFlBQWFMLEdBQVNwRixXQUFXMEYsWUFBYU4sSUFJNURDLEVBQVVGLEtBT2JRLFVBQVcsU0FBVUMsR0FDcEIsTUFBT0EsR0FBT3BELFFBQVNwRSxFQUFXLE9BQVFvRSxRQUFTbkUsRUFBWUMsSUFHaEV1SCxTQUFVLFNBQVU1RyxFQUFNNEMsR0FDekIsTUFBTzVDLEdBQUs0RyxVQUFZNUcsRUFBSzRHLFNBQVNDLGdCQUFrQmpFLEVBQUtpRSxlQUk5RHBGLEtBQU0sU0FBVXdDLEVBQUt2QyxFQUFVQyxHQUM5QixHQUFJbUYsR0FDSDNFLEVBQUksRUFDSmhDLEVBQVM4RCxFQUFJOUQsT0FDYmdELEVBQVU0RCxFQUFhOUMsRUFFeEIsSUFBS3RDLEdBQ0osR0FBS3dCLEdBQ0osS0FBWWhELEVBQUpnQyxFQUFZQSxJQUduQixHQUZBMkUsRUFBUXBGLEVBQVNJLE1BQU9tQyxFQUFLOUIsR0FBS1IsR0FFN0JtRixLQUFVLEVBQ2QsVUFJRixLQUFNM0UsSUFBSzhCLEdBR1YsR0FGQTZDLEVBQVFwRixFQUFTSSxNQUFPbUMsRUFBSzlCLEdBQUtSLEdBRTdCbUYsS0FBVSxFQUNkLFVBT0gsSUFBSzNELEdBQ0osS0FBWWhELEVBQUpnQyxFQUFZQSxJQUduQixHQUZBMkUsRUFBUXBGLEVBQVNSLEtBQU0rQyxFQUFLOUIsR0FBS0EsRUFBRzhCLEVBQUs5QixJQUVwQzJFLEtBQVUsRUFDZCxVQUlGLEtBQU0zRSxJQUFLOEIsR0FHVixHQUZBNkMsRUFBUXBGLEVBQVNSLEtBQU0rQyxFQUFLOUIsR0FBS0EsRUFBRzhCLEVBQUs5QixJQUVwQzJFLEtBQVUsRUFDZCxLQU1KLE9BQU83QyxJQUdSeEYsS0FBTSxTQUFVNkgsR0FDZixNQUFlLE9BQVJBLEVBQWUsR0FBSzlILEVBQVUwQyxLQUFNb0YsSUFJNUN0RixVQUFXLFNBQVVnRyxFQUFLQyxHQUN6QixHQUFJMUYsR0FBTTBGLEtBYVYsT0FYWSxPQUFQRCxJQUNDRCxFQUFhRyxPQUFPRixJQUN4QjFKLEVBQU9nRCxNQUFPaUIsRUFDRSxnQkFBUnlGLElBQ0xBLEdBQVFBLEdBR1hsSixFQUFVb0QsS0FBTUssRUFBS3lGLElBSWhCekYsR0FHUjRGLFFBQVMsU0FBVW5ILEVBQU1nSCxFQUFLN0UsR0FDN0IsTUFBYyxPQUFQNkUsRUFBYyxHQUFLOUksRUFBYWdELEtBQU04RixFQUFLaEgsRUFBTW1DLElBR3pEN0IsTUFBTyxTQUFVMEIsRUFBT29GLEdBQ3ZCLEdBQUlDLEdBQUlELEVBQU9qSCxPQUNkZ0MsRUFBSUgsRUFBTTdCLE9BQ1ZrQyxFQUFJLENBRUwsSUFBa0IsZ0JBQU5nRixHQUNYLEtBQVlBLEVBQUpoRixFQUFPQSxJQUNkTCxFQUFPRyxLQUFRaUYsRUFBUS9FLE9BR3hCLE9BQVErRSxFQUFPL0UsS0FBT3hGLFVBQ3JCbUYsRUFBT0csS0FBUWlGLEVBQVEvRSxJQU16QixPQUZBTCxHQUFNN0IsT0FBU2dDLEVBRVJILEdBR1JzRixLQUFNLFNBQVVoRyxFQUFPSSxFQUFVNkYsR0FDaEMsR0FBSUMsR0FDSGpHLEtBQ0FZLEVBQUksRUFDSmhDLEVBQVNtQixFQUFNbkIsTUFLaEIsS0FKQW9ILElBQVFBLEVBSUlwSCxFQUFKZ0MsRUFBWUEsSUFDbkJxRixJQUFXOUYsRUFBVUosRUFBT2EsR0FBS0EsR0FDNUJvRixJQUFRQyxHQUNaakcsRUFBSXhELEtBQU11RCxFQUFPYSxHQUluQixPQUFPWixJQUlSZSxJQUFLLFNBQVVoQixFQUFPSSxFQUFVK0YsR0FDL0IsR0FBSVgsR0FDSDNFLEVBQUksRUFDSmhDLEVBQVNtQixFQUFNbkIsT0FDZmdELEVBQVU0RCxFQUFhekYsR0FDdkJDLElBR0QsSUFBSzRCLEVBQ0osS0FBWWhELEVBQUpnQyxFQUFZQSxJQUNuQjJFLEVBQVFwRixFQUFVSixFQUFPYSxHQUFLQSxFQUFHc0YsR0FFbkIsTUFBVFgsSUFDSnZGLEVBQUtBLEVBQUlwQixRQUFXMkcsT0FNdEIsS0FBTTNFLElBQUtiLEdBQ1Z3RixFQUFRcEYsRUFBVUosRUFBT2EsR0FBS0EsRUFBR3NGLEdBRW5CLE1BQVRYLElBQ0p2RixFQUFLQSxFQUFJcEIsUUFBVzJHLEVBTXZCLE9BQU9sSixHQUFZa0UsU0FBV1AsSUFJL0JtRyxLQUFNLEVBSU5DLE1BQU8sU0FBVS9JLEVBQUlELEdBQ3BCLEdBQUlpSCxHQUFLakUsRUFBTWdHLENBVWYsT0FSd0IsZ0JBQVpoSixLQUNYaUgsRUFBTWhILEVBQUlELEdBQ1ZBLEVBQVVDLEVBQ1ZBLEVBQUtnSCxHQUtBdEksRUFBT3NELFdBQVloQyxJQUt6QitDLEVBQU8zRCxFQUFXa0QsS0FBTWEsVUFBVyxHQUNuQzRGLEVBQVEsV0FDUCxNQUFPL0ksR0FBR2tELE1BQU9uRCxHQUFXc0IsS0FBTTBCLEVBQUs5RCxPQUFRRyxFQUFXa0QsS0FBTWEsY0FJakU0RixFQUFNRCxLQUFPOUksRUFBRzhJLEtBQU85SSxFQUFHOEksTUFBUXBLLEVBQU9vSyxPQUVsQ0MsR0FaQzlLLFdBaUJUK0ssT0FBUSxTQUFVdEcsRUFBTzFDLEVBQUlpSixFQUFLZixFQUFPZ0IsRUFBV0MsRUFBVUMsR0FDN0QsR0FBSTdGLEdBQUksRUFDUGhDLEVBQVNtQixFQUFNbkIsT0FDZjhILEVBQWMsTUFBUEosQ0FHUixJQUE0QixXQUF2QnZLLEVBQU80RyxLQUFNMkQsR0FBcUIsQ0FDdENDLEdBQVksQ0FDWixLQUFNM0YsSUFBSzBGLEdBQ1Z2SyxFQUFPc0ssT0FBUXRHLEVBQU8xQyxFQUFJdUQsRUFBRzBGLEVBQUkxRixJQUFJLEVBQU00RixFQUFVQyxPQUloRCxJQUFLbEIsSUFBVWpLLFlBQ3JCaUwsR0FBWSxFQUVOeEssRUFBT3NELFdBQVlrRyxLQUN4QmtCLEdBQU0sR0FHRkMsSUFFQ0QsR0FDSnBKLEVBQUdzQyxLQUFNSSxFQUFPd0YsR0FDaEJsSSxFQUFLLE9BSUxxSixFQUFPckosRUFDUEEsRUFBSyxTQUFVb0IsRUFBTTZILEVBQUtmLEdBQ3pCLE1BQU9tQixHQUFLL0csS0FBTTVELEVBQVEwQyxHQUFROEcsTUFLaENsSSxHQUNKLEtBQVl1QixFQUFKZ0MsRUFBWUEsSUFDbkJ2RCxFQUFJMEMsRUFBTWEsR0FBSTBGLEVBQUtHLEVBQU1sQixFQUFRQSxFQUFNNUYsS0FBTUksRUFBTWEsR0FBSUEsRUFBR3ZELEVBQUkwQyxFQUFNYSxHQUFJMEYsSUFLM0UsT0FBT0MsR0FDTnhHLEVBR0EyRyxFQUNDckosRUFBR3NDLEtBQU1JLEdBQ1RuQixFQUFTdkIsRUFBSTBDLEVBQU0sR0FBSXVHLEdBQVFFLEdBR2xDRyxJQUFLQyxLQUFLRCxJQUtWRSxLQUFNLFNBQVVwSSxFQUFNMkMsRUFBU2pCLEVBQVVDLEdBQ3hDLEdBQUlKLEdBQUtxQixFQUNSeUYsSUFHRCxLQUFNekYsSUFBUUQsR0FDYjBGLEVBQUt6RixHQUFTNUMsRUFBS3NJLE1BQU8xRixHQUMxQjVDLEVBQUtzSSxNQUFPMUYsR0FBU0QsRUFBU0MsRUFHL0JyQixHQUFNRyxFQUFTSSxNQUFPOUIsRUFBTTJCLE1BRzVCLEtBQU1pQixJQUFRRCxHQUNiM0MsRUFBS3NJLE1BQU8xRixHQUFTeUYsRUFBS3pGLEVBRzNCLE9BQU9yQixNQUlUakUsRUFBT3FDLE1BQU1pQyxRQUFVLFNBQVVxQyxHQXFCaEMsTUFwQk1sSCxLQUVMQSxFQUFZTyxFQUFPaUwsV0FLVSxhQUF4QnJMLEVBQVNzTCxXQUViQyxXQUFZbkwsRUFBT3FDLFFBS25CekMsRUFBU3dMLGlCQUFrQixtQkFBb0JqSixHQUFXLEdBRzFEN0MsRUFBTzhMLGlCQUFrQixPQUFRakosR0FBVyxLQUd2QzFDLEVBQVU2RSxRQUFTcUMsSUFJM0IzRyxFQUFPbUUsS0FBSyxnRUFBZ0VrSCxNQUFNLEtBQU0sU0FBU3hHLEVBQUdTLEdBQ25HbkYsRUFBWSxXQUFhbUYsRUFBTyxLQUFRQSxFQUFLaUUsZUFHOUMsU0FBU0UsR0FBYTlDLEdBQ3JCLEdBQUk5RCxHQUFTOEQsRUFBSTlELE9BQ2hCK0QsRUFBTzVHLEVBQU80RyxLQUFNRCxFQUVyQixPQUFLM0csR0FBTzhHLFNBQVVILElBQ2QsRUFHYyxJQUFqQkEsRUFBSXpELFVBQWtCTCxHQUNuQixFQUdRLFVBQVQrRCxHQUE2QixhQUFUQSxJQUNiLElBQVgvRCxHQUNnQixnQkFBWEEsSUFBdUJBLEVBQVMsR0FBT0EsRUFBUyxJQUFPOEQsSUFJaEVuSCxFQUFhUSxFQUFPSixHQVdwQixTQUFXTixFQUFRQyxXQUVuQixHQUFJc0YsR0FDSHlHLEVBQ0FDLEVBQ0FDLEVBQ0FDLEVBQ0FDLEVBQ0FDLEVBQ0FDLEVBQ0FDLEVBR0FDLEVBQ0FsTSxFQUNBQyxFQUNBa00sRUFDQUMsRUFDQUMsRUFDQUMsRUFDQUMsRUFHQXJHLEVBQVUsVUFBWSxHQUFLK0UsTUFDM0J1QixFQUFlOU0sRUFBT00sU0FDdEJ5TSxFQUFVLEVBQ1Y5SCxFQUFPLEVBQ1ArSCxFQUFhQyxLQUNiQyxFQUFhRCxLQUNiRSxFQUFnQkYsS0FDaEJHLEdBQWUsRUFDZkMsRUFBWSxTQUFVQyxFQUFHQyxHQUN4QixNQUFLRCxLQUFNQyxHQUNWSCxHQUFlLEVBQ1IsR0FFRCxHQUlSSSxRQUFzQnZOLFdBQ3RCd04sRUFBZSxHQUFLLEdBR3BCQyxLQUFjL0wsZUFDZHlJLEtBQ0F1RCxFQUFNdkQsRUFBSXVELElBQ1ZDLEVBQWN4RCxFQUFJakosS0FDbEJBLEVBQU9pSixFQUFJakosS0FDWEUsRUFBUStJLEVBQUkvSSxNQUVaRSxFQUFVNkksRUFBSTdJLFNBQVcsU0FBVTZCLEdBQ2xDLEdBQUltQyxHQUFJLEVBQ1BDLEVBQU1uQyxLQUFLRSxNQUNaLE1BQVlpQyxFQUFKRCxFQUFTQSxJQUNoQixHQUFLbEMsS0FBS2tDLEtBQU9uQyxFQUNoQixNQUFPbUMsRUFHVCxPQUFPLElBR1JzSSxFQUFXLDZIQUtYQyxFQUFhLHNCQUViQyxFQUFvQixtQ0FLcEJDLEVBQWFELEVBQWtCcEgsUUFBUyxJQUFLLE1BRzdDc0gsRUFBYSxNQUFRSCxFQUFhLEtBQU9DLEVBQW9CLElBQU1ELEVBQ2xFLG1CQUFxQkEsRUFBYSx3Q0FBMENFLEVBQWEsUUFBVUYsRUFBYSxPQVFqSEksRUFBVSxLQUFPSCxFQUFvQixtRUFBcUVFLEVBQVd0SCxRQUFTLEVBQUcsR0FBTSxlQUd2SXdILEVBQVlDLE9BQVEsSUFBTU4sRUFBYSw4QkFBZ0NBLEVBQWEsS0FBTSxLQUUxRk8sRUFBYUQsT0FBUSxJQUFNTixFQUFhLEtBQU9BLEVBQWEsS0FDNURRLEVBQW1CRixPQUFRLElBQU1OLEVBQWEsV0FBYUEsRUFBYSxJQUFNQSxFQUFhLEtBRTNGUyxFQUFlSCxPQUFRTixFQUFhLFNBQ3BDVSxFQUF1QkosT0FBUSxJQUFNTixFQUFhLGdCQUFrQkEsRUFBYSxPQUFRLEtBRXpGVyxFQUFjTCxPQUFRRixHQUN0QlEsRUFBa0JOLE9BQVEsSUFBTUosRUFBYSxLQUU3Q1csR0FDQ0MsR0FBVVIsT0FBUSxNQUFRTCxFQUFvQixLQUM5Q2MsTUFBYVQsT0FBUSxRQUFVTCxFQUFvQixLQUNuRGUsSUFBV1YsT0FBUSxLQUFPTCxFQUFrQnBILFFBQVMsSUFBSyxNQUFTLEtBQ25Fb0ksS0FBWVgsT0FBUSxJQUFNSCxHQUMxQmUsT0FBY1osT0FBUSxJQUFNRixHQUM1QmUsTUFBYWIsT0FBUSx5REFBMkROLEVBQy9FLCtCQUFpQ0EsRUFBYSxjQUFnQkEsRUFDOUQsYUFBZUEsRUFBYSxTQUFVLEtBQ3ZDb0IsS0FBWWQsT0FBUSxPQUFTUCxFQUFXLEtBQU0sS0FHOUNzQixhQUFvQmYsT0FBUSxJQUFNTixFQUFhLG1EQUM5Q0EsRUFBYSxtQkFBcUJBLEVBQWEsbUJBQW9CLE1BR3JFc0IsRUFBVSx5QkFHVi9NLEVBQWEsbUNBRWJnTixFQUFVLHNDQUNWQyxHQUFVLFNBRVZDLEdBQVUsUUFHVkMsR0FBZ0JwQixPQUFRLHFCQUF1Qk4sRUFBYSxNQUFRQSxFQUFhLE9BQVEsTUFDekYyQixHQUFZLFNBQVVDLEVBQUdDLEVBQVNDLEdBQ2pDLEdBQUlDLEdBQU8sS0FBT0YsRUFBVSxLQUk1QixPQUFPRSxLQUFTQSxHQUFRRCxFQUN2QkQsRUFFTyxFQUFQRSxFQUNDaEksT0FBT2lJLGFBQWNELEVBQU8sT0FFNUJoSSxPQUFPaUksYUFBMkIsTUFBYkQsR0FBUSxHQUE0QixNQUFSLEtBQVBBLEdBSTlDLEtBQ0MxTyxFQUFLK0QsTUFDSGtGLEVBQU0vSSxFQUFNaUQsS0FBTXdJLEVBQWFwRSxZQUNoQ29FLEVBQWFwRSxZQUlkMEIsRUFBSzBDLEVBQWFwRSxXQUFXbkYsUUFBU0ssU0FDckMsTUFBUWtFLElBQ1QzRyxHQUFTK0QsTUFBT2tGLEVBQUk3RyxPQUduQixTQUFVOEMsRUFBUTBKLEdBQ2pCbkMsRUFBWTFJLE1BQU9tQixFQUFRaEYsRUFBTWlELEtBQUt5TCxLQUt2QyxTQUFVMUosRUFBUTBKLEdBQ2pCLEdBQUl0SyxHQUFJWSxFQUFPOUMsT0FDZGdDLEVBQUksQ0FFTCxPQUFTYyxFQUFPWixLQUFPc0ssRUFBSXhLLE1BQzNCYyxFQUFPOUMsT0FBU2tDLEVBQUksSUFLdkIsUUFBU3VLLElBQVFsTyxFQUFVQyxFQUFTc0ksRUFBUzRGLEdBQzVDLEdBQUk5TSxHQUFPQyxFQUFNOE0sRUFBR3RNLEVBRW5CMkIsRUFBRzRLLEVBQVExRSxFQUFLMkUsRUFBS0MsRUFBWUMsQ0FTbEMsS0FQT3ZPLEVBQVVBLEVBQVE4QixlQUFpQjlCLEVBQVUrSyxLQUFtQnhNLEdBQ3RFa00sRUFBYXpLLEdBR2RBLEVBQVVBLEdBQVd6QixFQUNyQitKLEVBQVVBLE9BRUp2SSxHQUFnQyxnQkFBYkEsR0FDeEIsTUFBT3VJLEVBR1IsSUFBdUMsS0FBakN6RyxFQUFXN0IsRUFBUTZCLFdBQWdDLElBQWJBLEVBQzNDLFFBR0QsSUFBSzZJLElBQW1Cd0QsRUFBTyxDQUc5QixHQUFNOU0sRUFBUWQsRUFBV21CLEtBQU0xQixHQUU5QixHQUFNb08sRUFBSS9NLEVBQU0sSUFDZixHQUFrQixJQUFiUyxFQUFpQixDQUlyQixHQUhBUixFQUFPckIsRUFBUW1DLGVBQWdCZ00sSUFHMUI5TSxJQUFRQSxFQUFLZSxXQVFqQixNQUFPa0csRUFMUCxJQUFLakgsRUFBS21OLEtBQU9MLEVBRWhCLE1BREE3RixHQUFRbEosS0FBTWlDLEdBQ1BpSCxNQU9ULElBQUt0SSxFQUFROEIsZ0JBQWtCVCxFQUFPckIsRUFBUThCLGNBQWNLLGVBQWdCZ00sS0FDM0VyRCxFQUFVOUssRUFBU3FCLElBQVVBLEVBQUttTixLQUFPTCxFQUV6QyxNQURBN0YsR0FBUWxKLEtBQU1pQyxHQUNQaUgsTUFLSCxDQUFBLEdBQUtsSCxFQUFNLEdBRWpCLE1BREFoQyxHQUFLK0QsTUFBT21GLEVBQVN0SSxFQUFRb0gscUJBQXNCckgsSUFDNUN1SSxDQUdELEtBQU02RixFQUFJL00sRUFBTSxLQUFPNkksRUFBUXdFLHdCQUEwQnpPLEVBQVF5Tyx1QkFFdkUsTUFEQXJQLEdBQUsrRCxNQUFPbUYsRUFBU3RJLEVBQVF5Tyx1QkFBd0JOLElBQzlDN0YsRUFLVCxHQUFLMkIsRUFBUXlFLE9BQVMvRCxJQUFjQSxFQUFVNUksS0FBTWhDLElBQWMsQ0FTakUsR0FSQXNPLEVBQU0zRSxFQUFNakYsRUFDWjZKLEVBQWF0TyxFQUNidU8sRUFBMkIsSUFBYjFNLEdBQWtCOUIsRUFNZCxJQUFiOEIsR0FBcUQsV0FBbkM3QixFQUFRaUksU0FBU0MsY0FBNkIsQ0FDcEVrRyxFQUFTTyxHQUFVNU8sSUFFYjJKLEVBQU0xSixFQUFRNE8sYUFBYSxPQUNoQ1AsRUFBTTNFLEVBQUk5RSxRQUFTNEksR0FBUyxRQUU1QnhOLEVBQVE2TyxhQUFjLEtBQU1SLEdBRTdCQSxFQUFNLFFBQVVBLEVBQU0sTUFFdEI3SyxFQUFJNEssRUFBTzVNLE1BQ1gsT0FBUWdDLElBQ1A0SyxFQUFPNUssR0FBSzZLLEVBQU1TLEdBQVlWLEVBQU81SyxHQUV0QzhLLEdBQWE5QixFQUFTekssS0FBTWhDLElBQWNDLEVBQVFvQyxZQUFjcEMsRUFDaEV1TyxFQUFjSCxFQUFPVyxLQUFLLEtBRzNCLEdBQUtSLEVBQ0osSUFJQyxNQUhBblAsR0FBSytELE1BQU9tRixFQUNYZ0csRUFBV1UsaUJBQWtCVCxJQUV2QmpHLEVBQ04sTUFBTTJHLElBQ04sUUFDS3ZGLEdBQ0wxSixFQUFRa1AsZ0JBQWdCLFFBUTdCLE1BQU9DLElBQVFwUCxFQUFTNkUsUUFBU3dILEVBQU8sTUFBUXBNLEVBQVNzSSxFQUFTNEYsR0FTbkUsUUFBU2hELE1BQ1IsR0FBSWtFLEtBRUosU0FBU0MsR0FBT25HLEVBQUtmLEdBTXBCLE1BSktpSCxHQUFLaFEsS0FBTThKLEdBQU8sS0FBUWlCLEVBQUttRixtQkFFNUJELEdBQU9ELEVBQUtHLFNBRVpGLEVBQU9uRyxHQUFRZixFQUV4QixNQUFPa0gsR0FPUixRQUFTRyxJQUFjdlAsR0FFdEIsTUFEQUEsR0FBSXdFLElBQVksRUFDVHhFLEVBT1IsUUFBU3dQLElBQVF4UCxHQUNoQixHQUFJeVAsR0FBTW5SLEVBQVNpSSxjQUFjLE1BRWpDLEtBQ0MsUUFBU3ZHLEVBQUl5UCxHQUNaLE1BQU8zSixHQUNSLE9BQU8sRUFDTixRQUVJMkosRUFBSXROLFlBQ1JzTixFQUFJdE4sV0FBVzBGLFlBQWE0SCxHQUc3QkEsRUFBTSxNQVNSLFFBQVNDLElBQVdDLEVBQU9DLEdBQzFCLEdBQUl4SCxHQUFNdUgsRUFBTTVGLE1BQU0sS0FDckJ4RyxFQUFJb00sRUFBTXBPLE1BRVgsT0FBUWdDLElBQ1AyRyxFQUFLMkYsV0FBWXpILEVBQUk3RSxJQUFPcU0sRUFVOUIsUUFBU0UsSUFBY3hFLEVBQUdDLEdBQ3pCLEdBQUl3RSxHQUFNeEUsR0FBS0QsRUFDZDBFLEVBQU9ELEdBQXNCLElBQWZ6RSxFQUFFMUosVUFBaUMsSUFBZjJKLEVBQUUzSixZQUNoQzJKLEVBQUUwRSxhQUFleEUsS0FDakJILEVBQUUyRSxhQUFleEUsRUFHdEIsSUFBS3VFLEVBQ0osTUFBT0EsRUFJUixJQUFLRCxFQUNKLE1BQVNBLEVBQU1BLEVBQUlHLFlBQ2xCLEdBQUtILElBQVF4RSxFQUNaLE1BQU8sRUFLVixPQUFPRCxHQUFJLEVBQUksR0FPaEIsUUFBUzZFLElBQW1CN0ssR0FDM0IsTUFBTyxVQUFVbEUsR0FDaEIsR0FBSTRDLEdBQU81QyxFQUFLNEcsU0FBU0MsYUFDekIsT0FBZ0IsVUFBVGpFLEdBQW9CNUMsRUFBS2tFLE9BQVNBLEdBUTNDLFFBQVM4SyxJQUFvQjlLLEdBQzVCLE1BQU8sVUFBVWxFLEdBQ2hCLEdBQUk0QyxHQUFPNUMsRUFBSzRHLFNBQVNDLGFBQ3pCLFFBQWlCLFVBQVRqRSxHQUE2QixXQUFUQSxJQUFzQjVDLEVBQUtrRSxPQUFTQSxHQVFsRSxRQUFTK0ssSUFBd0JyUSxHQUNoQyxNQUFPdVAsSUFBYSxTQUFVZSxHQUU3QixNQURBQSxJQUFZQSxFQUNMZixHQUFhLFNBQVV0QixFQUFNckQsR0FDbkMsR0FBSW5ILEdBQ0g4TSxFQUFldlEsS0FBUWlPLEVBQUsxTSxPQUFRK08sR0FDcEMvTSxFQUFJZ04sRUFBYWhQLE1BR2xCLE9BQVFnQyxJQUNGMEssRUFBT3hLLEVBQUk4TSxFQUFhaE4sTUFDNUIwSyxFQUFLeEssS0FBT21ILEVBQVFuSCxHQUFLd0ssRUFBS3hLLFNBV25DMkcsRUFBUTRELEdBQU81RCxNQUFRLFNBQVVoSixHQUdoQyxHQUFJNUMsR0FBa0I0QyxJQUFTQSxFQUFLUyxlQUFpQlQsR0FBTTVDLGVBQzNELE9BQU9BLEdBQStDLFNBQTdCQSxFQUFnQndKLFVBQXNCLEdBSWhFZ0MsRUFBVWdFLEdBQU9oRSxXQU9qQlEsRUFBY3dELEdBQU94RCxZQUFjLFNBQVVnRyxHQUM1QyxHQUFJQyxHQUFNRCxFQUFPQSxFQUFLM08sZUFBaUIyTyxFQUFPMUYsRUFDN0M0RixFQUFTRCxFQUFJRSxXQUdkLE9BQUtGLEtBQVFuUyxHQUE2QixJQUFqQm1TLEVBQUk3TyxVQUFtQjZPLEVBQUlqUyxpQkFLcERGLEVBQVdtUyxFQUNYbFMsRUFBVWtTLEVBQUlqUyxnQkFHZGlNLEdBQWtCTCxFQUFPcUcsR0FNcEJDLEdBQVVBLEVBQU9FLGFBQWVGLElBQVdBLEVBQU9HLEtBQ3RESCxFQUFPRSxZQUFhLGlCQUFrQixXQUNyQ3BHLE1BU0ZSLEVBQVFpQyxXQUFhdUQsR0FBTyxTQUFVQyxHQUVyQyxNQURBQSxHQUFJcUIsVUFBWSxLQUNSckIsRUFBSWQsYUFBYSxlQU8xQjNFLEVBQVE3QyxxQkFBdUJxSSxHQUFPLFNBQVVDLEdBRS9DLE1BREFBLEdBQUk3SCxZQUFhNkksRUFBSU0sY0FBYyxNQUMzQnRCLEVBQUl0SSxxQkFBcUIsS0FBSzVGLFNBSXZDeUksRUFBUXdFLHVCQUF5QmdCLEdBQU8sU0FBVUMsR0FRakQsTUFQQUEsR0FBSXVCLFVBQVksK0NBSWhCdkIsRUFBSXdCLFdBQVdILFVBQVksSUFHdUIsSUFBM0NyQixFQUFJakIsdUJBQXVCLEtBQUtqTixTQU94Q3lJLEVBQVFrSCxRQUFVMUIsR0FBTyxTQUFVQyxHQUVsQyxNQURBbFIsR0FBUXFKLFlBQWE2SCxHQUFNbEIsR0FBSy9KLEdBQ3hCaU0sRUFBSVUsb0JBQXNCVixFQUFJVSxrQkFBbUIzTSxHQUFVakQsU0FJL0R5SSxFQUFRa0gsU0FDWmhILEVBQUt6SSxLQUFTLEdBQUksU0FBVThNLEVBQUl4TyxHQUMvQixTQUFZQSxHQUFRbUMsaUJBQW1Cc0osR0FBZ0JmLEVBQWlCLENBQ3ZFLEdBQUl5RCxHQUFJbk8sRUFBUW1DLGVBQWdCcU0sRUFHaEMsT0FBT0wsSUFBS0EsRUFBRS9MLFlBQWMrTCxRQUc5QmhFLEVBQUtrSCxPQUFXLEdBQUksU0FBVTdDLEdBQzdCLEdBQUk4QyxHQUFTOUMsRUFBRzVKLFFBQVM2SSxHQUFXQyxHQUNwQyxPQUFPLFVBQVVyTSxHQUNoQixNQUFPQSxHQUFLdU4sYUFBYSxRQUFVMEMsWUFNOUJuSCxHQUFLekksS0FBUyxHQUVyQnlJLEVBQUtrSCxPQUFXLEdBQUssU0FBVTdDLEdBQzlCLEdBQUk4QyxHQUFTOUMsRUFBRzVKLFFBQVM2SSxHQUFXQyxHQUNwQyxPQUFPLFVBQVVyTSxHQUNoQixHQUFJb1AsU0FBY3BQLEdBQUtrUSxtQkFBcUI5RixHQUFnQnBLLEVBQUtrUSxpQkFBaUIsS0FDbEYsT0FBT2QsSUFBUUEsRUFBS3RJLFFBQVVtSixLQU1qQ25ILEVBQUt6SSxLQUFVLElBQUl1SSxFQUFRN0MscUJBQzFCLFNBQVVvSyxFQUFLeFIsR0FDZCxhQUFZQSxHQUFRb0gsdUJBQXlCcUUsRUFDckN6TCxFQUFRb0gscUJBQXNCb0ssR0FEdEMsV0FJRCxTQUFVQSxFQUFLeFIsR0FDZCxHQUFJcUIsR0FDSDRGLEtBQ0F6RCxFQUFJLEVBQ0o4RSxFQUFVdEksRUFBUW9ILHFCQUFzQm9LLEVBR3pDLElBQWEsTUFBUkEsRUFBYyxDQUNsQixNQUFTblEsRUFBT2lILEVBQVE5RSxLQUNBLElBQWxCbkMsRUFBS1EsVUFDVG9GLEVBQUk3SCxLQUFNaUMsRUFJWixPQUFPNEYsR0FFUixNQUFPcUIsSUFJVDZCLEVBQUt6SSxLQUFZLE1BQUl1SSxFQUFRd0Usd0JBQTBCLFNBQVVzQyxFQUFXL1EsR0FDM0UsYUFBWUEsR0FBUXlPLHlCQUEyQmhELEdBQWdCZixFQUN2RDFLLEVBQVF5Tyx1QkFBd0JzQyxHQUR4QyxXQVdEbkcsS0FPQUQsTUFFTVYsRUFBUXlFLElBQU1yQixFQUFRdEwsS0FBTTJPLEVBQUkxQixxQkFHckNTLEdBQU8sU0FBVUMsR0FNaEJBLEVBQUl1QixVQUFZLGlEQUlWdkIsRUFBSVYsaUJBQWlCLGNBQWN4TixRQUN4Q21KLEVBQVV2TCxLQUFNLE1BQVEyTSxFQUFhLGFBQWVELEVBQVcsS0FNMUQ0RCxFQUFJVixpQkFBaUIsWUFBWXhOLFFBQ3RDbUosRUFBVXZMLEtBQUssY0FJakJxUSxHQUFPLFNBQVVDLEdBT2hCLEdBQUkrQixHQUFRZixFQUFJbEssY0FBYyxRQUM5QmlMLEdBQU01QyxhQUFjLE9BQVEsVUFDNUJhLEVBQUk3SCxZQUFhNEosR0FBUTVDLGFBQWMsSUFBSyxJQUV2Q2EsRUFBSVYsaUJBQWlCLFdBQVd4TixRQUNwQ21KLEVBQVV2TCxLQUFNLFNBQVcyTSxFQUFhLGdCQUtuQzJELEVBQUlWLGlCQUFpQixZQUFZeE4sUUFDdENtSixFQUFVdkwsS0FBTSxXQUFZLGFBSTdCc1EsRUFBSVYsaUJBQWlCLFFBQ3JCckUsRUFBVXZMLEtBQUssWUFJWDZLLEVBQVF5SCxnQkFBa0JyRSxFQUFRdEwsS0FBTzhJLEVBQVVyTSxFQUFRbVQsdUJBQ2hFblQsRUFBUW9ULG9CQUNScFQsRUFBUXFULGtCQUNSclQsRUFBUXNULHFCQUVSckMsR0FBTyxTQUFVQyxHQUdoQnpGLEVBQVE4SCxrQkFBb0JsSCxFQUFRdEksS0FBTW1OLEVBQUssT0FJL0M3RSxFQUFRdEksS0FBTW1OLEVBQUssYUFDbkI5RSxFQUFjeEwsS0FBTSxLQUFNK00sS0FJNUJ4QixFQUFZQSxFQUFVbkosUUFBYzZLLE9BQVExQixFQUFVb0UsS0FBSyxNQUMzRG5FLEVBQWdCQSxFQUFjcEosUUFBYzZLLE9BQVF6QixFQUFjbUUsS0FBSyxNQVF2RWpFLEVBQVd1QyxFQUFRdEwsS0FBTXZELEVBQVFzTSxXQUFjdE0sRUFBUXdULHdCQUN0RCxTQUFVekcsRUFBR0MsR0FDWixHQUFJeUcsR0FBdUIsSUFBZjFHLEVBQUUxSixTQUFpQjBKLEVBQUU5TSxnQkFBa0I4TSxFQUNsRDJHLEVBQU0xRyxHQUFLQSxFQUFFcEosVUFDZCxPQUFPbUosS0FBTTJHLE1BQVdBLEdBQXdCLElBQWpCQSxFQUFJclEsWUFDbENvUSxFQUFNbkgsU0FDTG1ILEVBQU1uSCxTQUFVb0gsR0FDaEIzRyxFQUFFeUcseUJBQThELEdBQW5DekcsRUFBRXlHLHdCQUF5QkUsTUFHM0QsU0FBVTNHLEVBQUdDLEdBQ1osR0FBS0EsRUFDSixNQUFTQSxFQUFJQSxFQUFFcEosV0FDZCxHQUFLb0osSUFBTUQsRUFDVixPQUFPLENBSVYsUUFBTyxHQU9URCxFQUFZOU0sRUFBUXdULHdCQUNwQixTQUFVekcsRUFBR0MsR0FHWixHQUFLRCxJQUFNQyxFQUVWLE1BREFILElBQWUsRUFDUixDQUdSLElBQUk4RyxHQUFVM0csRUFBRXdHLHlCQUEyQnpHLEVBQUV5Ryx5QkFBMkJ6RyxFQUFFeUcsd0JBQXlCeEcsRUFFbkcsT0FBSzJHLEdBRVcsRUFBVkEsSUFDRmxJLEVBQVFtSSxjQUFnQjVHLEVBQUV3Ryx3QkFBeUJ6RyxLQUFRNEcsRUFHeEQ1RyxJQUFNbUYsR0FBTzVGLEVBQVNDLEVBQWNRLEdBQ2pDLEdBRUhDLElBQU1rRixHQUFPNUYsRUFBU0MsRUFBY1MsR0FDakMsRUFJRGhCLEVBQ0poTCxFQUFRK0MsS0FBTWlJLEVBQVdlLEdBQU0vTCxFQUFRK0MsS0FBTWlJLEVBQVdnQixHQUMxRCxFQUdlLEVBQVYyRyxFQUFjLEdBQUssRUFJcEI1RyxFQUFFeUcsd0JBQTBCLEdBQUssR0FFekMsU0FBVXpHLEVBQUdDLEdBQ1osR0FBSXdFLEdBQ0h4TSxFQUFJLEVBQ0o2TyxFQUFNOUcsRUFBRW5KLFdBQ1I4UCxFQUFNMUcsRUFBRXBKLFdBQ1JrUSxHQUFPL0csR0FDUGdILEdBQU8vRyxFQUdSLElBQUtELElBQU1DLEVBRVYsTUFEQUgsSUFBZSxFQUNSLENBR0QsS0FBTWdILElBQVFILEVBQ3BCLE1BQU8zRyxLQUFNbUYsRUFBTSxHQUNsQmxGLElBQU1rRixFQUFNLEVBQ1oyQixFQUFNLEdBQ05ILEVBQU0sRUFDTjFILEVBQ0VoTCxFQUFRK0MsS0FBTWlJLEVBQVdlLEdBQU0vTCxFQUFRK0MsS0FBTWlJLEVBQVdnQixHQUMxRCxDQUdLLElBQUs2RyxJQUFRSCxFQUNuQixNQUFPbkMsSUFBY3hFLEVBQUdDLEVBSXpCd0UsR0FBTXpFLENBQ04sT0FBU3lFLEVBQU1BLEVBQUk1TixXQUNsQmtRLEVBQUdFLFFBQVN4QyxFQUViQSxHQUFNeEUsQ0FDTixPQUFTd0UsRUFBTUEsRUFBSTVOLFdBQ2xCbVEsRUFBR0MsUUFBU3hDLEVBSWIsT0FBUXNDLEVBQUc5TyxLQUFPK08sRUFBRy9PLEdBQ3BCQSxHQUdELE9BQU9BLEdBRU51TSxHQUFjdUMsRUFBRzlPLEdBQUkrTyxFQUFHL08sSUFHeEI4TyxFQUFHOU8sS0FBT3VILEVBQWUsR0FDekJ3SCxFQUFHL08sS0FBT3VILEVBQWUsRUFDekIsR0FHSzJGLEdBMVVDblMsR0E2VVQwUCxHQUFPcEQsUUFBVSxTQUFVNEgsRUFBTUMsR0FDaEMsTUFBT3pFLElBQVF3RSxFQUFNLEtBQU0sS0FBTUMsSUFHbEN6RSxHQUFPeUQsZ0JBQWtCLFNBQVVyUSxFQUFNb1IsR0FTeEMsSUFQT3BSLEVBQUtTLGVBQWlCVCxLQUFXOUMsR0FDdkNrTSxFQUFhcEosR0FJZG9SLEVBQU9BLEVBQUs3TixRQUFTNkgsRUFBa0IsYUFFbEN4QyxFQUFReUgsa0JBQW1CaEgsR0FDNUJFLEdBQWtCQSxFQUFjN0ksS0FBTTBRLElBQ3RDOUgsR0FBa0JBLEVBQVU1SSxLQUFNMFEsSUFFckMsSUFDQyxHQUFJN1AsR0FBTWlJLEVBQVF0SSxLQUFNbEIsRUFBTW9SLEVBRzlCLElBQUs3UCxHQUFPcUgsRUFBUThILG1CQUdsQjFRLEVBQUs5QyxVQUF1QyxLQUEzQjhDLEVBQUs5QyxTQUFTc0QsU0FDaEMsTUFBT2UsR0FFUCxNQUFNbUQsSUFHVCxNQUFPa0ksSUFBUXdFLEVBQU1sVSxFQUFVLE1BQU84QyxJQUFRRyxPQUFTLEdBR3hEeU0sR0FBT25ELFNBQVcsU0FBVTlLLEVBQVNxQixHQUtwQyxPQUhPckIsRUFBUThCLGVBQWlCOUIsS0FBY3pCLEdBQzdDa00sRUFBYXpLLEdBRVA4SyxFQUFVOUssRUFBU3FCLElBRzNCNE0sR0FBTy9MLEtBQU8sU0FBVWIsRUFBTTRDLElBRXRCNUMsRUFBS1MsZUFBaUJULEtBQVc5QyxHQUN2Q2tNLEVBQWFwSixFQUdkLElBQUlwQixHQUFLa0ssRUFBSzJGLFdBQVk3TCxFQUFLaUUsZUFFOUJ5SyxFQUFNMVMsR0FBTTBMLEVBQU9wSixLQUFNNEgsRUFBSzJGLFdBQVk3TCxFQUFLaUUsZUFDOUNqSSxFQUFJb0IsRUFBTTRDLEdBQU95RyxHQUNqQnhNLFNBRUYsT0FBT3lVLEtBQVF6VSxVQUNkK0wsRUFBUWlDLGFBQWV4QixFQUN0QnJKLEVBQUt1TixhQUFjM0ssSUFDbEIwTyxFQUFNdFIsRUFBS2tRLGlCQUFpQnROLEtBQVUwTyxFQUFJQyxVQUMxQ0QsRUFBSXhLLE1BQ0osS0FDRndLLEdBR0YxRSxHQUFPaEksTUFBUSxTQUFVQyxHQUN4QixLQUFVQyxPQUFPLDBDQUE0Q0QsSUFPOUQrSCxHQUFPNEUsV0FBYSxTQUFVdkssR0FDN0IsR0FBSWpILEdBQ0h5UixLQUNBcFAsRUFBSSxFQUNKRixFQUFJLENBT0wsSUFKQTZILEdBQWdCcEIsRUFBUThJLGlCQUN4QnZJLEdBQWFQLEVBQVErSSxZQUFjMUssRUFBUWhKLE1BQU8sR0FDbERnSixFQUFRekUsS0FBTXlILEdBRVRELEVBQWUsQ0FDbkIsTUFBU2hLLEVBQU9pSCxFQUFROUUsS0FDbEJuQyxJQUFTaUgsRUFBUzlFLEtBQ3RCRSxFQUFJb1AsRUFBVzFULEtBQU1vRSxHQUd2QixPQUFRRSxJQUNQNEUsRUFBUXhFLE9BQVFnUCxFQUFZcFAsR0FBSyxHQUluQyxNQUFPNEUsSUFPUjhCLEVBQVU2RCxHQUFPN0QsUUFBVSxTQUFVL0ksR0FDcEMsR0FBSW9QLEdBQ0g3TixFQUFNLEdBQ05ZLEVBQUksRUFDSjNCLEVBQVdSLEVBQUtRLFFBRWpCLElBQU1BLEdBTUMsR0FBa0IsSUFBYkEsR0FBK0IsSUFBYkEsR0FBK0IsS0FBYkEsRUFBa0IsQ0FHakUsR0FBaUMsZ0JBQXJCUixHQUFLNFIsWUFDaEIsTUFBTzVSLEdBQUs0UixXQUdaLEtBQU01UixFQUFPQSxFQUFLNlAsV0FBWTdQLEVBQU1BLEVBQU9BLEVBQUs4TyxZQUMvQ3ZOLEdBQU93SCxFQUFTL0ksT0FHWixJQUFrQixJQUFiUSxHQUErQixJQUFiQSxFQUM3QixNQUFPUixHQUFLNlIsY0FoQlosTUFBU3pDLEVBQU9wUCxFQUFLbUMsR0FBS0EsSUFFekJaLEdBQU93SCxFQUFTcUcsRUFrQmxCLE9BQU83TixJQUdSdUgsRUFBTzhELEdBQU9rRixXQUdiN0QsWUFBYSxHQUViOEQsYUFBYzVELEdBRWRwTyxNQUFPd0wsRUFFUGtELGNBRUFwTyxRQUVBMlIsVUFDQ0MsS0FBT0MsSUFBSyxhQUFjbFEsT0FBTyxHQUNqQ21RLEtBQU9ELElBQUssY0FDWkUsS0FBT0YsSUFBSyxrQkFBbUJsUSxPQUFPLEdBQ3RDcVEsS0FBT0gsSUFBSyxvQkFHYkksV0FDQzNHLEtBQVEsU0FBVTVMLEdBVWpCLE1BVEFBLEdBQU0sR0FBS0EsRUFBTSxHQUFHd0QsUUFBUzZJLEdBQVdDLElBR3hDdE0sRUFBTSxJQUFPQSxFQUFNLElBQU1BLEVBQU0sSUFBTSxJQUFLd0QsUUFBUzZJLEdBQVdDLElBRTVDLE9BQWJ0TSxFQUFNLEtBQ1ZBLEVBQU0sR0FBSyxJQUFNQSxFQUFNLEdBQUssS0FHdEJBLEVBQU05QixNQUFPLEVBQUcsSUFHeEI0TixNQUFTLFNBQVU5TCxHQTZCbEIsTUFsQkFBLEdBQU0sR0FBS0EsRUFBTSxHQUFHOEcsY0FFWSxRQUEzQjlHLEVBQU0sR0FBRzlCLE1BQU8sRUFBRyxJQUVqQjhCLEVBQU0sSUFDWDZNLEdBQU9oSSxNQUFPN0UsRUFBTSxJQUtyQkEsRUFBTSxLQUFRQSxFQUFNLEdBQUtBLEVBQU0sSUFBTUEsRUFBTSxJQUFNLEdBQUssR0FBbUIsU0FBYkEsRUFBTSxJQUE4QixRQUFiQSxFQUFNLEtBQ3pGQSxFQUFNLEtBQVVBLEVBQU0sR0FBS0EsRUFBTSxJQUFxQixRQUFiQSxFQUFNLEtBR3BDQSxFQUFNLElBQ2pCNk0sR0FBT2hJLE1BQU83RSxFQUFNLElBR2RBLEdBR1I2TCxPQUFVLFNBQVU3TCxHQUNuQixHQUFJd1MsR0FDSEMsR0FBWXpTLEVBQU0sSUFBTUEsRUFBTSxFQUUvQixPQUFLd0wsR0FBaUIsTUFBRTdLLEtBQU1YLEVBQU0sSUFDNUIsTUFJSEEsRUFBTSxJQUFNQSxFQUFNLEtBQU9sRCxVQUM3QmtELEVBQU0sR0FBS0EsRUFBTSxHQUdOeVMsR0FBWW5ILEVBQVEzSyxLQUFNOFIsS0FFcENELEVBQVNqRixHQUFVa0YsR0FBVSxNQUU3QkQsRUFBU0MsRUFBU3JVLFFBQVMsSUFBS3FVLEVBQVNyUyxPQUFTb1MsR0FBV0MsRUFBU3JTLFVBR3ZFSixFQUFNLEdBQUtBLEVBQU0sR0FBRzlCLE1BQU8sRUFBR3NVLEdBQzlCeFMsRUFBTSxHQUFLeVMsRUFBU3ZVLE1BQU8sRUFBR3NVLElBSXhCeFMsRUFBTTlCLE1BQU8sRUFBRyxNQUl6QitSLFFBRUN0RSxJQUFPLFNBQVUrRyxHQUNoQixHQUFJN0wsR0FBVzZMLEVBQWlCbFAsUUFBUzZJLEdBQVdDLElBQVl4RixhQUNoRSxPQUE0QixNQUFyQjRMLEVBQ04sV0FBYSxPQUFPLEdBQ3BCLFNBQVV6UyxHQUNULE1BQU9BLEdBQUs0RyxVQUFZNUcsRUFBSzRHLFNBQVNDLGdCQUFrQkQsSUFJM0Q2RSxNQUFTLFNBQVVpRSxHQUNsQixHQUFJZ0QsR0FBVTlJLEVBQVk4RixFQUFZLElBRXRDLE9BQU9nRCxLQUNMQSxFQUFjMUgsT0FBUSxNQUFRTixFQUFhLElBQU1nRixFQUFZLElBQU1oRixFQUFhLFNBQ2pGZCxFQUFZOEYsRUFBVyxTQUFVMVAsR0FDaEMsTUFBTzBTLEdBQVFoUyxLQUFnQyxnQkFBbkJWLEdBQUswUCxXQUEwQjFQLEVBQUswUCxpQkFBb0IxUCxHQUFLdU4sZUFBaUJuRCxHQUFnQnBLLEVBQUt1TixhQUFhLFVBQVksT0FJM0o1QixLQUFRLFNBQVUvSSxFQUFNK1AsRUFBVUMsR0FDakMsTUFBTyxVQUFVNVMsR0FDaEIsR0FBSTZTLEdBQVNqRyxHQUFPL0wsS0FBTWIsRUFBTTRDLEVBRWhDLE9BQWUsT0FBVmlRLEVBQ2dCLE9BQWJGLEVBRUZBLEdBSU5FLEdBQVUsR0FFVSxNQUFiRixFQUFtQkUsSUFBV0QsRUFDdkIsT0FBYkQsRUFBb0JFLElBQVdELEVBQ2xCLE9BQWJELEVBQW9CQyxHQUFxQyxJQUE1QkMsRUFBTzFVLFFBQVN5VSxHQUNoQyxPQUFiRCxFQUFvQkMsR0FBU0MsRUFBTzFVLFFBQVN5VSxHQUFVLEdBQzFDLE9BQWJELEVBQW9CQyxHQUFTQyxFQUFPNVUsT0FBUTJVLEVBQU16UyxVQUFheVMsRUFDbEQsT0FBYkQsR0FBc0IsSUFBTUUsRUFBUyxLQUFNMVUsUUFBU3lVLEdBQVUsR0FDakQsT0FBYkQsRUFBb0JFLElBQVdELEdBQVNDLEVBQU81VSxNQUFPLEVBQUcyVSxFQUFNelMsT0FBUyxLQUFReVMsRUFBUSxLQUN4RixJQVpPLElBZ0JWL0csTUFBUyxTQUFVM0gsRUFBTTRPLEVBQU01RCxFQUFVbE4sRUFBT0UsR0FDL0MsR0FBSTZRLEdBQWdDLFFBQXZCN08sRUFBS2pHLE1BQU8sRUFBRyxHQUMzQitVLEVBQStCLFNBQXJCOU8sRUFBS2pHLE1BQU8sSUFDdEJnVixFQUFrQixZQUFUSCxDQUVWLE9BQWlCLEtBQVY5USxHQUF3QixJQUFURSxFQUdyQixTQUFVbEMsR0FDVCxRQUFTQSxFQUFLZSxZQUdmLFNBQVVmLEVBQU1yQixFQUFTZ0gsR0FDeEIsR0FBSXFJLEdBQU9rRixFQUFZOUQsRUFBTVIsRUFBTXVFLEVBQVdDLEVBQzdDbEIsRUFBTWEsSUFBV0MsRUFBVSxjQUFnQixrQkFDM0MxRCxFQUFTdFAsRUFBS2UsV0FDZDZCLEVBQU9xUSxHQUFValQsRUFBSzRHLFNBQVNDLGNBQy9Cd00sR0FBWTFOLElBQVFzTixDQUVyQixJQUFLM0QsRUFBUyxDQUdiLEdBQUt5RCxFQUFTLENBQ2IsTUFBUWIsRUFBTSxDQUNiOUMsRUFBT3BQLENBQ1AsT0FBU29QLEVBQU9BLEVBQU04QyxHQUNyQixHQUFLZSxFQUFTN0QsRUFBS3hJLFNBQVNDLGdCQUFrQmpFLEVBQXlCLElBQWxCd00sRUFBSzVPLFNBQ3pELE9BQU8sQ0FJVDRTLEdBQVFsQixFQUFlLFNBQVRoTyxJQUFvQmtQLEdBQVMsY0FFNUMsT0FBTyxFQU1SLEdBSEFBLEdBQVVKLEVBQVUxRCxFQUFPTyxXQUFhUCxFQUFPZ0UsV0FHMUNOLEdBQVdLLEVBQVcsQ0FFMUJILEVBQWE1RCxFQUFRbE0sS0FBY2tNLEVBQVFsTSxPQUMzQzRLLEVBQVFrRixFQUFZaFAsT0FDcEJpUCxFQUFZbkYsRUFBTSxLQUFPckUsR0FBV3FFLEVBQU0sR0FDMUNZLEVBQU9aLEVBQU0sS0FBT3JFLEdBQVdxRSxFQUFNLEdBQ3JDb0IsRUFBTytELEdBQWE3RCxFQUFPaEssV0FBWTZOLEVBRXZDLE9BQVMvRCxJQUFTK0QsR0FBYS9ELEdBQVFBLEVBQU04QyxLQUczQ3RELEVBQU91RSxFQUFZLElBQU1DLEVBQU03SSxNQUdoQyxHQUF1QixJQUFsQjZFLEVBQUs1TyxZQUFvQm9PLEdBQVFRLElBQVNwUCxFQUFPLENBQ3JEa1QsRUFBWWhQLElBQVd5RixFQUFTd0osRUFBV3ZFLEVBQzNDLFlBS0ksSUFBS3lFLElBQWFyRixHQUFTaE8sRUFBTW9ELEtBQWNwRCxFQUFNb0QsUUFBa0JjLEtBQVc4SixFQUFNLEtBQU9yRSxFQUNyR2lGLEVBQU9aLEVBQU0sT0FLYixPQUFTb0IsSUFBUytELEdBQWEvRCxHQUFRQSxFQUFNOEMsS0FDM0N0RCxFQUFPdUUsRUFBWSxJQUFNQyxFQUFNN0ksTUFFaEMsSUFBTzBJLEVBQVM3RCxFQUFLeEksU0FBU0MsZ0JBQWtCakUsRUFBeUIsSUFBbEJ3TSxFQUFLNU8sYUFBc0JvTyxJQUU1RXlFLEtBQ0hqRSxFQUFNaE0sS0FBY2dNLEVBQU1oTSxRQUFrQmMsSUFBV3lGLEVBQVNpRixJQUc3RFEsSUFBU3BQLEdBQ2IsS0FRSixPQURBNE8sSUFBUTFNLEVBQ0QwTSxJQUFTNU0sR0FBNEIsSUFBakI0TSxFQUFPNU0sR0FBZTRNLEVBQU81TSxHQUFTLEtBS3JFNEosT0FBVSxTQUFVMkgsRUFBUXJFLEdBSzNCLEdBQUl2TixHQUNIL0MsRUFBS2tLLEVBQUtnQyxRQUFTeUksSUFBWXpLLEVBQUswSyxXQUFZRCxFQUFPMU0sZ0JBQ3REK0YsR0FBT2hJLE1BQU8sdUJBQXlCMk8sRUFLekMsT0FBSzNVLEdBQUl3RSxHQUNEeEUsRUFBSXNRLEdBSVB0USxFQUFHdUIsT0FBUyxHQUNoQndCLEdBQVM0UixFQUFRQSxFQUFRLEdBQUlyRSxHQUN0QnBHLEVBQUswSyxXQUFXalYsZUFBZ0JnVixFQUFPMU0sZUFDN0NzSCxHQUFhLFNBQVV0QixFQUFNckQsR0FDNUIsR0FBSWlLLEdBQ0hDLEVBQVU5VSxFQUFJaU8sRUFBTXFDLEdBQ3BCL00sRUFBSXVSLEVBQVF2VCxNQUNiLE9BQVFnQyxJQUNQc1IsRUFBTXRWLEVBQVErQyxLQUFNMkwsRUFBTTZHLEVBQVF2UixJQUNsQzBLLEVBQU00RyxLQUFXakssRUFBU2lLLEdBQVFDLEVBQVF2UixNQUc1QyxTQUFVbkMsR0FDVCxNQUFPcEIsR0FBSW9CLEVBQU0sRUFBRzJCLEtBSWhCL0MsSUFJVGtNLFNBRUM2SSxJQUFPeEYsR0FBYSxTQUFVelAsR0FJN0IsR0FBSTBSLE1BQ0huSixLQUNBMk0sRUFBVTNLLEVBQVN2SyxFQUFTNkUsUUFBU3dILEVBQU8sTUFFN0MsT0FBTzZJLEdBQVN4USxHQUNmK0ssR0FBYSxTQUFVdEIsRUFBTXJELEVBQVM3SyxFQUFTZ0gsR0FDOUMsR0FBSTNGLEdBQ0g2VCxFQUFZRCxFQUFTL0csRUFBTSxLQUFNbEgsTUFDakN4RCxFQUFJMEssRUFBSzFNLE1BR1YsT0FBUWdDLEtBQ0RuQyxFQUFPNlQsRUFBVTFSLE1BQ3RCMEssRUFBSzFLLEtBQU9xSCxFQUFRckgsR0FBS25DLE1BSTVCLFNBQVVBLEVBQU1yQixFQUFTZ0gsR0FHeEIsTUFGQXlLLEdBQU0sR0FBS3BRLEVBQ1g0VCxFQUFTeEQsRUFBTyxLQUFNekssRUFBS3NCLElBQ25CQSxFQUFRc0QsU0FJbkJ1SixJQUFPM0YsR0FBYSxTQUFVelAsR0FDN0IsTUFBTyxVQUFVc0IsR0FDaEIsTUFBTzRNLElBQVFsTyxFQUFVc0IsR0FBT0csT0FBUyxLQUkzQ3NKLFNBQVkwRSxHQUFhLFNBQVU3SCxHQUNsQyxNQUFPLFVBQVV0RyxHQUNoQixPQUFTQSxFQUFLNFIsYUFBZTVSLEVBQUsrVCxXQUFhaEwsRUFBUy9JLElBQVM3QixRQUFTbUksR0FBUyxNQVdyRjBOLEtBQVE3RixHQUFjLFNBQVU2RixHQU0vQixNQUpNMUksR0FBWTVLLEtBQUtzVCxHQUFRLEtBQzlCcEgsR0FBT2hJLE1BQU8scUJBQXVCb1AsR0FFdENBLEVBQU9BLEVBQUt6USxRQUFTNkksR0FBV0MsSUFBWXhGLGNBQ3JDLFNBQVU3RyxHQUNoQixHQUFJaVUsRUFDSixHQUNDLElBQU1BLEVBQVc1SyxFQUNoQnJKLEVBQUtnVSxLQUNMaFUsRUFBS3VOLGFBQWEsYUFBZXZOLEVBQUt1TixhQUFhLFFBR25ELE1BREEwRyxHQUFXQSxFQUFTcE4sY0FDYm9OLElBQWFELEdBQTJDLElBQW5DQyxFQUFTOVYsUUFBUzZWLEVBQU8sWUFFNUNoVSxFQUFPQSxFQUFLZSxhQUFpQyxJQUFsQmYsRUFBS1EsU0FDM0MsUUFBTyxLQUtUeUMsT0FBVSxTQUFVakQsR0FDbkIsR0FBSWtVLEdBQU90WCxFQUFPSyxVQUFZTCxFQUFPSyxTQUFTaVgsSUFDOUMsT0FBT0EsSUFBUUEsRUFBS2pXLE1BQU8sS0FBUStCLEVBQUttTixJQUd6Q2dILEtBQVEsU0FBVW5VLEdBQ2pCLE1BQU9BLEtBQVM3QyxHQUdqQmlYLE1BQVMsU0FBVXBVLEdBQ2xCLE1BQU9BLEtBQVM5QyxFQUFTbVgsaUJBQW1CblgsRUFBU29YLFVBQVlwWCxFQUFTb1gsZ0JBQWtCdFUsRUFBS2tFLE1BQVFsRSxFQUFLdVUsT0FBU3ZVLEVBQUt3VSxXQUk3SEMsUUFBVyxTQUFVelUsR0FDcEIsTUFBT0EsR0FBSzBVLFlBQWEsR0FHMUJBLFNBQVksU0FBVTFVLEdBQ3JCLE1BQU9BLEdBQUswVSxZQUFhLEdBRzFCQyxRQUFXLFNBQVUzVSxHQUdwQixHQUFJNEcsR0FBVzVHLEVBQUs0RyxTQUFTQyxhQUM3QixPQUFxQixVQUFiRCxLQUEwQjVHLEVBQUsyVSxTQUEwQixXQUFiL04sS0FBMkI1RyxFQUFLNFUsVUFHckZBLFNBQVksU0FBVTVVLEdBT3JCLE1BSktBLEdBQUtlLFlBQ1RmLEVBQUtlLFdBQVc4VCxjQUdWN1UsRUFBSzRVLFlBQWEsR0FJMUJFLE1BQVMsU0FBVTlVLEdBTWxCLElBQU1BLEVBQU9BLEVBQUs2UCxXQUFZN1AsRUFBTUEsRUFBT0EsRUFBSzhPLFlBQy9DLEdBQUs5TyxFQUFLNEcsU0FBVyxLQUF5QixJQUFsQjVHLEVBQUtRLFVBQW9DLElBQWxCUixFQUFLUSxTQUN2RCxPQUFPLENBR1QsUUFBTyxHQUdSOE8sT0FBVSxTQUFVdFAsR0FDbkIsT0FBUThJLEVBQUtnQyxRQUFlLE1BQUc5SyxJQUloQytVLE9BQVUsU0FBVS9VLEdBQ25CLE1BQU9rTSxJQUFReEwsS0FBTVYsRUFBSzRHLFdBRzNCd0osTUFBUyxTQUFVcFEsR0FDbEIsTUFBT2lNLEdBQVF2TCxLQUFNVixFQUFLNEcsV0FHM0JvTyxPQUFVLFNBQVVoVixHQUNuQixHQUFJNEMsR0FBTzVDLEVBQUs0RyxTQUFTQyxhQUN6QixPQUFnQixVQUFUakUsR0FBa0MsV0FBZDVDLEVBQUtrRSxNQUE4QixXQUFUdEIsR0FHdEQwRCxLQUFRLFNBQVV0RyxHQUNqQixHQUFJYSxFQUdKLE9BQXVDLFVBQWhDYixFQUFLNEcsU0FBU0MsZUFDTixTQUFkN0csRUFBS2tFLE9BQ21DLE9BQXJDckQsRUFBT2IsRUFBS3VOLGFBQWEsVUFBb0IxTSxFQUFLZ0csZ0JBQWtCN0csRUFBS2tFLE9BSTlFbEMsTUFBU2lOLEdBQXVCLFdBQy9CLE9BQVMsS0FHVi9NLEtBQVErTSxHQUF1QixTQUFVRSxFQUFjaFAsR0FDdEQsT0FBU0EsRUFBUyxLQUduQjhCLEdBQU1nTixHQUF1QixTQUFVRSxFQUFjaFAsRUFBUStPLEdBQzVELE9BQW9CLEVBQVhBLEVBQWVBLEVBQVcvTyxFQUFTK08sS0FHN0MrRixLQUFRaEcsR0FBdUIsU0FBVUUsRUFBY2hQLEdBQ3RELEdBQUlnQyxHQUFJLENBQ1IsTUFBWWhDLEVBQUpnQyxFQUFZQSxHQUFLLEVBQ3hCZ04sRUFBYXBSLEtBQU1vRSxFQUVwQixPQUFPZ04sS0FHUitGLElBQU9qRyxHQUF1QixTQUFVRSxFQUFjaFAsR0FDckQsR0FBSWdDLEdBQUksQ0FDUixNQUFZaEMsRUFBSmdDLEVBQVlBLEdBQUssRUFDeEJnTixFQUFhcFIsS0FBTW9FLEVBRXBCLE9BQU9nTixLQUdSZ0csR0FBTWxHLEdBQXVCLFNBQVVFLEVBQWNoUCxFQUFRK08sR0FDNUQsR0FBSS9NLEdBQWUsRUFBWCtNLEVBQWVBLEVBQVcvTyxFQUFTK08sQ0FDM0MsUUFBVS9NLEdBQUssR0FDZGdOLEVBQWFwUixLQUFNb0UsRUFFcEIsT0FBT2dOLEtBR1JpRyxHQUFNbkcsR0FBdUIsU0FBVUUsRUFBY2hQLEVBQVErTyxHQUM1RCxHQUFJL00sR0FBZSxFQUFYK00sRUFBZUEsRUFBVy9PLEVBQVMrTyxDQUMzQyxNQUFjL08sSUFBSmdDLEdBQ1RnTixFQUFhcFIsS0FBTW9FLEVBRXBCLE9BQU9nTixPQUtWckcsRUFBS2dDLFFBQWEsSUFBSWhDLEVBQUtnQyxRQUFZLEVBR3ZDLEtBQU0zSSxLQUFPa1QsT0FBTyxFQUFNQyxVQUFVLEVBQU1DLE1BQU0sRUFBTUMsVUFBVSxFQUFNQyxPQUFPLEdBQzVFM00sRUFBS2dDLFFBQVMzSSxHQUFNNE0sR0FBbUI1TSxFQUV4QyxLQUFNQSxLQUFPdVQsUUFBUSxFQUFNQyxPQUFPLEdBQ2pDN00sRUFBS2dDLFFBQVMzSSxHQUFNNk0sR0FBb0I3TSxFQUl6QyxTQUFTcVIsT0FDVEEsR0FBVzVULFVBQVlrSixFQUFLOE0sUUFBVTlNLEVBQUtnQyxRQUMzQ2hDLEVBQUswSyxXQUFhLEdBQUlBLEdBRXRCLFNBQVNsRyxJQUFVNU8sRUFBVW1YLEdBQzVCLEdBQUluQyxHQUFTM1QsRUFBTytWLEVBQVE1UixFQUMzQjZSLEVBQU9oSixFQUFRaUosRUFDZkMsRUFBU25NLEVBQVlwTCxFQUFXLElBRWpDLElBQUt1WCxFQUNKLE1BQU9KLEdBQVksRUFBSUksRUFBT2hZLE1BQU8sRUFHdEM4WCxHQUFRclgsRUFDUnFPLEtBQ0FpSixFQUFhbE4sRUFBS3dKLFNBRWxCLE9BQVF5RCxFQUFRLEdBR1RyQyxJQUFZM1QsRUFBUWtMLEVBQU83SyxLQUFNMlYsT0FDakNoVyxJQUVKZ1csRUFBUUEsRUFBTTlYLE1BQU84QixFQUFNLEdBQUdJLFNBQVk0VixHQUUzQ2hKLEVBQU9oUCxLQUFNK1gsT0FHZHBDLEdBQVUsR0FHSjNULEVBQVFtTCxFQUFhOUssS0FBTTJWLE1BQ2hDckMsRUFBVTNULEVBQU1tTyxRQUNoQjRILEVBQU8vWCxNQUNOK0ksTUFBTzRNLEVBRVB4UCxLQUFNbkUsRUFBTSxHQUFHd0QsUUFBU3dILEVBQU8sT0FFaENnTCxFQUFRQSxFQUFNOVgsTUFBT3lWLEVBQVF2VCxRQUk5QixLQUFNK0QsSUFBUTRFLEdBQUtrSCxTQUNaalEsRUFBUXdMLEVBQVdySCxHQUFPOUQsS0FBTTJWLEtBQWNDLEVBQVk5UixNQUM5RG5FLEVBQVFpVyxFQUFZOVIsR0FBUW5FLE1BQzdCMlQsRUFBVTNULEVBQU1tTyxRQUNoQjRILEVBQU8vWCxNQUNOK0ksTUFBTzRNLEVBQ1B4UCxLQUFNQSxFQUNOc0YsUUFBU3pKLElBRVZnVyxFQUFRQSxFQUFNOVgsTUFBT3lWLEVBQVF2VCxRQUkvQixLQUFNdVQsRUFDTCxNQU9GLE1BQU9tQyxHQUNORSxFQUFNNVYsT0FDTjRWLEVBQ0NuSixHQUFPaEksTUFBT2xHLEdBRWRvTCxFQUFZcEwsRUFBVXFPLEdBQVM5TyxNQUFPLEdBR3pDLFFBQVN3UCxJQUFZcUksR0FDcEIsR0FBSTNULEdBQUksRUFDUEMsRUFBTTBULEVBQU8zVixPQUNiekIsRUFBVyxFQUNaLE1BQVkwRCxFQUFKRCxFQUFTQSxJQUNoQnpELEdBQVlvWCxFQUFPM1QsR0FBRzJFLEtBRXZCLE9BQU9wSSxHQUdSLFFBQVN3WCxJQUFldEMsRUFBU3VDLEVBQVlDLEdBQzVDLEdBQUlsRSxHQUFNaUUsRUFBV2pFLElBQ3BCbUUsRUFBbUJELEdBQWdCLGVBQVJsRSxFQUMzQm9FLEVBQVd6VSxHQUVaLE9BQU9zVSxHQUFXblUsTUFFakIsU0FBVWhDLEVBQU1yQixFQUFTZ0gsR0FDeEIsTUFBUzNGLEVBQU9BLEVBQU1rUyxHQUNyQixHQUF1QixJQUFsQmxTLEVBQUtRLFVBQWtCNlYsRUFDM0IsTUFBT3pDLEdBQVM1VCxFQUFNckIsRUFBU2dILElBTWxDLFNBQVUzRixFQUFNckIsRUFBU2dILEdBQ3hCLEdBQUlaLEdBQU1pSixFQUFPa0YsRUFDaEJxRCxFQUFTNU0sRUFBVSxJQUFNMk0sQ0FHMUIsSUFBSzNRLEdBQ0osTUFBUzNGLEVBQU9BLEVBQU1rUyxHQUNyQixJQUF1QixJQUFsQmxTLEVBQUtRLFVBQWtCNlYsSUFDdEJ6QyxFQUFTNVQsRUFBTXJCLEVBQVNnSCxHQUM1QixPQUFPLE1BS1YsT0FBUzNGLEVBQU9BLEVBQU1rUyxHQUNyQixHQUF1QixJQUFsQmxTLEVBQUtRLFVBQWtCNlYsRUFFM0IsR0FEQW5ELEVBQWFsVCxFQUFNb0QsS0FBY3BELEVBQU1vRCxRQUNqQzRLLEVBQVFrRixFQUFZaEIsS0FBVWxFLEVBQU0sS0FBT3VJLEdBQ2hELElBQU14UixFQUFPaUosRUFBTSxPQUFRLEdBQVFqSixJQUFTOEQsRUFDM0MsTUFBTzlELE1BQVMsTUFLakIsSUFGQWlKLEVBQVFrRixFQUFZaEIsSUFBVXFFLEdBQzlCdkksRUFBTSxHQUFLNEYsRUFBUzVULEVBQU1yQixFQUFTZ0gsSUFBU2tELEVBQ3ZDbUYsRUFBTSxNQUFPLEVBQ2pCLE9BQU8sR0FTZixRQUFTd0ksSUFBZ0JDLEdBQ3hCLE1BQU9BLEdBQVN0VyxPQUFTLEVBQ3hCLFNBQVVILEVBQU1yQixFQUFTZ0gsR0FDeEIsR0FBSXhELEdBQUlzVSxFQUFTdFcsTUFDakIsT0FBUWdDLElBQ1AsSUFBTXNVLEVBQVN0VSxHQUFJbkMsRUFBTXJCLEVBQVNnSCxHQUNqQyxPQUFPLENBR1QsUUFBTyxHQUVSOFEsRUFBUyxHQUdYLFFBQVNDLElBQVU3QyxFQUFXdlIsRUFBSzBOLEVBQVFyUixFQUFTZ0gsR0FDbkQsR0FBSTNGLEdBQ0gyVyxLQUNBeFUsRUFBSSxFQUNKQyxFQUFNeVIsRUFBVTFULE9BQ2hCeVcsRUFBZ0IsTUFBUHRVLENBRVYsTUFBWUYsRUFBSkQsRUFBU0EsS0FDVm5DLEVBQU82VCxFQUFVMVIsT0FDaEI2TixHQUFVQSxFQUFRaFEsRUFBTXJCLEVBQVNnSCxNQUN0Q2dSLEVBQWE1WSxLQUFNaUMsR0FDZDRXLEdBQ0p0VSxFQUFJdkUsS0FBTW9FLEdBTWQsT0FBT3dVLEdBR1IsUUFBU0UsSUFBWXZFLEVBQVc1VCxFQUFVa1YsRUFBU2tELEVBQVlDLEVBQVlDLEdBTzFFLE1BTktGLEtBQWVBLEVBQVkxVCxLQUMvQjBULEVBQWFELEdBQVlDLElBRXJCQyxJQUFlQSxFQUFZM1QsS0FDL0IyVCxFQUFhRixHQUFZRSxFQUFZQyxJQUUvQjdJLEdBQWEsU0FBVXRCLEVBQU01RixFQUFTdEksRUFBU2dILEdBQ3JELEdBQUlzUixHQUFNOVUsRUFBR25DLEVBQ1prWCxLQUNBQyxLQUNBQyxFQUFjblEsRUFBUTlHLE9BR3RCbUIsRUFBUXVMLEdBQVF3SyxHQUFrQjNZLEdBQVksSUFBS0MsRUFBUTZCLFVBQWE3QixHQUFZQSxNQUdwRjJZLEdBQVloRixJQUFlekYsR0FBU25PLEVBRW5DNEMsRUFEQW9WLEdBQVVwVixFQUFPNFYsRUFBUTVFLEVBQVczVCxFQUFTZ0gsR0FHOUM0UixFQUFhM0QsRUFFWm1ELElBQWdCbEssRUFBT3lGLEVBQVk4RSxHQUFlTixNQU1qRDdQLEVBQ0RxUSxDQVFGLElBTEsxRCxHQUNKQSxFQUFTMEQsRUFBV0MsRUFBWTVZLEVBQVNnSCxHQUlyQ21SLEVBQWEsQ0FDakJHLEVBQU9QLEdBQVVhLEVBQVlKLEdBQzdCTCxFQUFZRyxLQUFVdFksRUFBU2dILEdBRy9CeEQsRUFBSThVLEVBQUs5VyxNQUNULE9BQVFnQyxLQUNEbkMsRUFBT2lYLEVBQUs5VSxNQUNqQm9WLEVBQVlKLEVBQVFoVixNQUFTbVYsRUFBV0gsRUFBUWhWLElBQU9uQyxJQUsxRCxHQUFLNk0sR0FDSixHQUFLa0ssR0FBY3pFLEVBQVksQ0FDOUIsR0FBS3lFLEVBQWEsQ0FFakJFLEtBQ0E5VSxFQUFJb1YsRUFBV3BYLE1BQ2YsT0FBUWdDLEtBQ0RuQyxFQUFPdVgsRUFBV3BWLEtBRXZCOFUsRUFBS2xaLEtBQU91WixFQUFVblYsR0FBS25DLEVBRzdCK1csR0FBWSxLQUFPUSxLQUFrQk4sRUFBTXRSLEdBSTVDeEQsRUFBSW9WLEVBQVdwWCxNQUNmLE9BQVFnQyxLQUNEbkMsRUFBT3VYLEVBQVdwVixNQUN0QjhVLEVBQU9GLEVBQWE1WSxFQUFRK0MsS0FBTTJMLEVBQU03TSxHQUFTa1gsRUFBTy9VLElBQU0sS0FFL0QwSyxFQUFLb0ssS0FBVWhRLEVBQVFnUSxHQUFRalgsU0FPbEN1WCxHQUFhYixHQUNaYSxJQUFldFEsRUFDZHNRLEVBQVc5VSxPQUFRMlUsRUFBYUcsRUFBV3BYLFFBQzNDb1gsR0FFR1IsRUFDSkEsRUFBWSxLQUFNOVAsRUFBU3NRLEVBQVk1UixHQUV2QzVILEVBQUsrRCxNQUFPbUYsRUFBU3NRLEtBTXpCLFFBQVNDLElBQW1CMUIsR0FDM0IsR0FBSTJCLEdBQWM3RCxFQUFTdlIsRUFDMUJELEVBQU0wVCxFQUFPM1YsT0FDYnVYLEVBQWtCNU8sRUFBS2tKLFNBQVU4RCxFQUFPLEdBQUc1UixNQUMzQ3lULEVBQW1CRCxHQUFtQjVPLEVBQUtrSixTQUFTLEtBQ3BEN1AsRUFBSXVWLEVBQWtCLEVBQUksRUFHMUJFLEVBQWUxQixHQUFlLFNBQVVsVyxHQUN2QyxNQUFPQSxLQUFTeVgsR0FDZEUsR0FBa0IsR0FDckJFLEVBQWtCM0IsR0FBZSxTQUFVbFcsR0FDMUMsTUFBTzdCLEdBQVErQyxLQUFNdVcsRUFBY3pYLEdBQVMsSUFDMUMyWCxHQUFrQixHQUNyQmxCLEdBQWEsU0FBVXpXLEVBQU1yQixFQUFTZ0gsR0FDckMsT0FBVStSLElBQXFCL1IsR0FBT2hILElBQVl1SyxNQUNoRHVPLEVBQWU5WSxHQUFTNkIsU0FDeEJvWCxFQUFjNVgsRUFBTXJCLEVBQVNnSCxHQUM3QmtTLEVBQWlCN1gsRUFBTXJCLEVBQVNnSCxLQUdwQyxNQUFZdkQsRUFBSkQsRUFBU0EsSUFDaEIsR0FBTXlSLEVBQVU5SyxFQUFLa0osU0FBVThELEVBQU8zVCxHQUFHK0IsTUFDeEN1UyxHQUFhUCxHQUFjTSxHQUFnQkMsR0FBWTdDLFFBQ2pELENBSU4sR0FIQUEsRUFBVTlLLEVBQUtrSCxPQUFROEYsRUFBTzNULEdBQUcrQixNQUFPcEMsTUFBTyxLQUFNZ1UsRUFBTzNULEdBQUdxSCxTQUcxRG9LLEVBQVN4USxHQUFZLENBR3pCLElBREFmLElBQU1GLEVBQ01DLEVBQUpDLEVBQVNBLElBQ2hCLEdBQUt5RyxFQUFLa0osU0FBVThELEVBQU96VCxHQUFHNkIsTUFDN0IsS0FHRixPQUFPMlMsSUFDTjFVLEVBQUksR0FBS3FVLEdBQWdCQyxHQUN6QnRVLEVBQUksR0FBS3NMLEdBRVJxSSxFQUFPN1gsTUFBTyxFQUFHa0UsRUFBSSxHQUFJdEUsUUFBU2lKLE1BQWdDLE1BQXpCZ1AsRUFBUTNULEVBQUksR0FBSStCLEtBQWUsSUFBTSxNQUM3RVgsUUFBU3dILEVBQU8sTUFDbEI2SSxFQUNJdlIsRUFBSkYsR0FBU3FWLEdBQW1CMUIsRUFBTzdYLE1BQU9rRSxFQUFHRSxJQUN6Q0QsRUFBSkMsR0FBV21WLEdBQW9CMUIsRUFBU0EsRUFBTzdYLE1BQU9vRSxJQUNsREQsRUFBSkMsR0FBV29MLEdBQVlxSSxJQUd6QlcsRUFBUzFZLEtBQU02VixHQUlqQixNQUFPNEMsSUFBZ0JDLEdBR3hCLFFBQVNxQixJQUEwQkMsRUFBaUJDLEdBRW5ELEdBQUlDLEdBQW9CLEVBQ3ZCQyxFQUFRRixFQUFZN1gsT0FBUyxFQUM3QmdZLEVBQVlKLEVBQWdCNVgsT0FBUyxFQUNyQ2lZLEVBQWUsU0FBVXZMLEVBQU1sTyxFQUFTZ0gsRUFBS3NCLEVBQVNvUixHQUNyRCxHQUFJclksR0FBTXFDLEVBQUd1UixFQUNaMEUsS0FDQUMsRUFBZSxFQUNmcFcsRUFBSSxJQUNKMFIsRUFBWWhILE1BQ1oyTCxFQUE2QixNQUFqQkgsRUFDWkksRUFBZ0J2UCxFQUVoQjVILEVBQVF1TCxHQUFRc0wsR0FBYXJQLEVBQUt6SSxLQUFVLElBQUcsSUFBS2dZLEdBQWlCMVosRUFBUW9DLFlBQWNwQyxHQUUzRitaLEVBQWlCL08sR0FBNEIsTUFBakI4TyxFQUF3QixFQUFJcFYsS0FBS0MsVUFBWSxFQVMxRSxLQVBLa1YsSUFDSnRQLEVBQW1CdkssSUFBWXpCLEdBQVl5QixFQUMzQ2tLLEVBQWFvUCxHQUtlLE9BQXBCalksRUFBT3NCLEVBQU1hLElBQWFBLElBQU0sQ0FDeEMsR0FBS2dXLEdBQWFuWSxFQUFPLENBQ3hCcUMsRUFBSSxDQUNKLE9BQVN1UixFQUFVbUUsRUFBZ0IxVixLQUNsQyxHQUFLdVIsRUFBUzVULEVBQU1yQixFQUFTZ0gsR0FBUSxDQUNwQ3NCLEVBQVFsSixLQUFNaUMsRUFDZCxPQUdHd1ksSUFDSjdPLEVBQVUrTyxFQUNWN1AsSUFBZW9QLEdBS1pDLEtBRUVsWSxHQUFRNFQsR0FBVzVULElBQ3hCdVksSUFJSTFMLEdBQ0pnSCxFQUFVOVYsS0FBTWlDLElBT25CLEdBREF1WSxHQUFnQnBXLEVBQ1grVixHQUFTL1YsSUFBTW9XLEVBQWUsQ0FDbENsVyxFQUFJLENBQ0osT0FBU3VSLEVBQVVvRSxFQUFZM1YsS0FDOUJ1UixFQUFTQyxFQUFXeUUsRUFBWTNaLEVBQVNnSCxFQUcxQyxJQUFLa0gsRUFBTyxDQUVYLEdBQUswTCxFQUFlLEVBQ25CLE1BQVFwVyxJQUNBMFIsRUFBVTFSLElBQU1tVyxFQUFXblcsS0FDakNtVyxFQUFXblcsR0FBS29JLEVBQUlySixLQUFNK0YsR0FNN0JxUixHQUFhNUIsR0FBVTRCLEdBSXhCdmEsRUFBSytELE1BQU9tRixFQUFTcVIsR0FHaEJFLElBQWMzTCxHQUFReUwsRUFBV25ZLE9BQVMsR0FDNUNvWSxFQUFlUCxFQUFZN1gsT0FBVyxHQUV4Q3lNLEdBQU80RSxXQUFZdkssR0FVckIsTUFMS3VSLEtBQ0o3TyxFQUFVK08sRUFDVnhQLEVBQW1CdVAsR0FHYjVFLEVBR1QsT0FBT3FFLEdBQ04vSixHQUFjaUssR0FDZEEsRUFHRm5QLEVBQVUyRCxHQUFPM0QsUUFBVSxTQUFVdkssRUFBVWlhLEdBQzlDLEdBQUl4VyxHQUNINlYsS0FDQUQsS0FDQTlCLEVBQVNsTSxFQUFlckwsRUFBVyxJQUVwQyxLQUFNdVgsRUFBUyxDQUVSMEMsSUFDTEEsRUFBUXJMLEdBQVU1TyxJQUVuQnlELEVBQUl3VyxFQUFNeFksTUFDVixPQUFRZ0MsSUFDUDhULEVBQVN1QixHQUFtQm1CLEVBQU14VyxJQUM3QjhULEVBQVE3UyxHQUNaNFUsRUFBWWphLEtBQU1rWSxHQUVsQjhCLEVBQWdCaGEsS0FBTWtZLEVBS3hCQSxHQUFTbE0sRUFBZXJMLEVBQVVvWixHQUEwQkMsRUFBaUJDLElBRTlFLE1BQU8vQixHQUdSLFNBQVNvQixJQUFrQjNZLEVBQVVrYSxFQUFVM1IsR0FDOUMsR0FBSTlFLEdBQUksRUFDUEMsRUFBTXdXLEVBQVN6WSxNQUNoQixNQUFZaUMsRUFBSkQsRUFBU0EsSUFDaEJ5SyxHQUFRbE8sRUFBVWthLEVBQVN6VyxHQUFJOEUsRUFFaEMsT0FBT0EsR0FHUixRQUFTNkcsSUFBUXBQLEVBQVVDLEVBQVNzSSxFQUFTNEYsR0FDNUMsR0FBSTFLLEdBQUcyVCxFQUFRK0MsRUFBTzNVLEVBQU03RCxFQUMzQk4sRUFBUXVOLEdBQVU1TyxFQUVuQixLQUFNbU8sR0FFaUIsSUFBakI5TSxFQUFNSSxPQUFlLENBSXpCLEdBREEyVixFQUFTL1YsRUFBTSxHQUFLQSxFQUFNLEdBQUc5QixNQUFPLEdBQy9CNlgsRUFBTzNWLE9BQVMsR0FBa0MsUUFBNUIwWSxFQUFRL0MsRUFBTyxJQUFJNVIsTUFDNUMwRSxFQUFRa0gsU0FBZ0MsSUFBckJuUixFQUFRNkIsVUFBa0I2SSxHQUM3Q1AsRUFBS2tKLFNBQVU4RCxFQUFPLEdBQUc1UixNQUFTLENBR25DLEdBREF2RixHQUFZbUssRUFBS3pJLEtBQVMsR0FBR3dZLEVBQU1yUCxRQUFRLEdBQUdqRyxRQUFRNkksR0FBV0MsSUFBWTFOLFFBQWtCLElBQ3pGQSxFQUNMLE1BQU9zSSxFQUVSdkksR0FBV0EsRUFBU1QsTUFBTzZYLEVBQU81SCxRQUFRcEgsTUFBTTNHLFFBSWpEZ0MsRUFBSW9KLEVBQXdCLGFBQUU3SyxLQUFNaEMsR0FBYSxFQUFJb1gsRUFBTzNWLE1BQzVELE9BQVFnQyxJQUFNLENBSWIsR0FIQTBXLEVBQVEvQyxFQUFPM1QsR0FHVjJHLEVBQUtrSixTQUFXOU4sRUFBTzJVLEVBQU0zVSxNQUNqQyxLQUVELEtBQU03RCxFQUFPeUksRUFBS3pJLEtBQU02RCxNQUVqQjJJLEVBQU94TSxFQUNad1ksRUFBTXJQLFFBQVEsR0FBR2pHLFFBQVM2SSxHQUFXQyxJQUNyQ2xCLEVBQVN6SyxLQUFNb1YsRUFBTyxHQUFHNVIsT0FBVXZGLEVBQVFvQyxZQUFjcEMsSUFDckQsQ0FLSixHQUZBbVgsRUFBT3JULE9BQVFOLEVBQUcsR0FDbEJ6RCxFQUFXbU8sRUFBSzFNLFFBQVVzTixHQUFZcUksSUFDaENwWCxFQUVMLE1BREFYLEdBQUsrRCxNQUFPbUYsRUFBUzRGLEdBQ2Q1RixDQUdSLFNBZ0JMLE1BUEFnQyxHQUFTdkssRUFBVXFCLEdBQ2xCOE0sRUFDQWxPLEdBQ0MwSyxFQUNEcEMsRUFDQWtFLEVBQVN6SyxLQUFNaEMsSUFFVHVJLEVBTVIyQixFQUFRK0ksV0FBYXZPLEVBQVF1RixNQUFNLElBQUluRyxLQUFNeUgsR0FBWXlELEtBQUssTUFBUXRLLEVBSXRFd0YsRUFBUThJLGlCQUFtQjFILEVBRzNCWixJQUlBUixFQUFRbUksYUFBZTNDLEdBQU8sU0FBVTBLLEdBRXZDLE1BQXVFLEdBQWhFQSxFQUFLbkksd0JBQXlCelQsRUFBU2lJLGNBQWMsVUFNdkRpSixHQUFPLFNBQVVDLEdBRXRCLE1BREFBLEdBQUl1QixVQUFZLG1CQUMrQixNQUF4Q3ZCLEVBQUl3QixXQUFXdEMsYUFBYSxXQUVuQ2UsR0FBVyx5QkFBMEIsU0FBVXRPLEVBQU00QyxFQUFNb0csR0FDMUQsTUFBTUEsR0FBTixVQUNRaEosRUFBS3VOLGFBQWMzSyxFQUE2QixTQUF2QkEsRUFBS2lFLGNBQTJCLEVBQUksS0FPakUrQixFQUFRaUMsWUFBZXVELEdBQU8sU0FBVUMsR0FHN0MsTUFGQUEsR0FBSXVCLFVBQVksV0FDaEJ2QixFQUFJd0IsV0FBV3JDLGFBQWMsUUFBUyxJQUNZLEtBQTNDYSxFQUFJd0IsV0FBV3RDLGFBQWMsWUFFcENlLEdBQVcsUUFBUyxTQUFVdE8sRUFBTTRDLEVBQU1vRyxHQUN6QyxNQUFNQSxJQUF5QyxVQUFoQ2hKLEVBQUs0RyxTQUFTQyxjQUE3QixVQUNRN0csRUFBSytZLGVBT1QzSyxHQUFPLFNBQVVDLEdBQ3RCLE1BQXVDLE9BQWhDQSxFQUFJZCxhQUFhLGVBRXhCZSxHQUFXN0QsRUFBVSxTQUFVekssRUFBTTRDLEVBQU1vRyxHQUMxQyxHQUFJc0ksRUFDSixPQUFNdEksR0FBTixXQUNTc0ksRUFBTXRSLEVBQUtrUSxpQkFBa0J0TixLQUFXME8sRUFBSUMsVUFDbkRELEVBQUl4SyxNQUNKOUcsRUFBTTRDLE1BQVcsRUFBT0EsRUFBS2lFLGNBQWdCLE9BS2pEdkosRUFBTytDLEtBQU91TSxHQUNkdFAsRUFBTzhULEtBQU94RSxHQUFPa0YsVUFDckJ4VSxFQUFPOFQsS0FBSyxLQUFPOVQsRUFBTzhULEtBQUt0RyxRQUMvQnhOLEVBQU8wYixPQUFTcE0sR0FBTzRFLFdBQ3ZCbFUsRUFBT2dKLEtBQU9zRyxHQUFPN0QsUUFDckJ6TCxFQUFPMmIsU0FBV3JNLEdBQU81RCxNQUN6QjFMLEVBQU9tTSxTQUFXbUQsR0FBT25ELFVBR3JCN00sRUFFSixJQUFJc2MsS0FHSixTQUFTQyxHQUFleFcsR0FDdkIsR0FBSXlXLEdBQVNGLEVBQWN2VyxLQUkzQixPQUhBckYsR0FBT21FLEtBQU1rQixFQUFRNUMsTUFBT2YsT0FBd0IsU0FBVXNOLEVBQUcrTSxHQUNoRUQsRUFBUUMsSUFBUyxJQUVYRCxFQXlCUjliLEVBQU9nYyxVQUFZLFNBQVUzVyxHQUk1QkEsRUFBNkIsZ0JBQVpBLEdBQ2R1VyxFQUFjdlcsSUFBYXdXLEVBQWV4VyxHQUM1Q3JGLEVBQU9vRixVQUFZQyxFQUVwQixJQUNDNFcsR0FFQUMsRUFFQUMsRUFFQUMsRUFFQUMsRUFFQUMsRUFFQUMsS0FFQUMsR0FBU25YLEVBQVFvWCxTQUVqQkMsRUFBTyxTQUFValYsR0FPaEIsSUFOQXdVLEVBQVM1VyxFQUFRNFcsUUFBVXhVLEVBQzNCeVUsR0FBUSxFQUNSSSxFQUFjRixHQUFlLEVBQzdCQSxFQUFjLEVBQ2RDLEVBQWVFLEVBQUsxWixPQUNwQnNaLEdBQVMsRUFDREksR0FBc0JGLEVBQWRDLEVBQTRCQSxJQUMzQyxHQUFLQyxFQUFNRCxHQUFjOVgsTUFBT2lELEVBQU0sR0FBS0EsRUFBTSxPQUFVLEdBQVNwQyxFQUFRc1gsWUFBYyxDQUN6RlYsR0FBUyxDQUNULE9BR0ZFLEdBQVMsRUFDSkksSUFDQ0MsRUFDQ0EsRUFBTTNaLFFBQ1Y2WixFQUFNRixFQUFNNUwsU0FFRnFMLEVBQ1hNLEtBRUFLLEVBQUtDLFlBS1JELEdBRUNFLElBQUssV0FDSixHQUFLUCxFQUFPLENBRVgsR0FBSXpHLEdBQVF5RyxFQUFLMVosUUFDakIsUUFBVWlhLEdBQUt6WSxHQUNkckUsRUFBT21FLEtBQU1FLEVBQU0sU0FBVTJLLEVBQUc3RSxHQUMvQixHQUFJdkQsR0FBTzVHLEVBQU80RyxLQUFNdUQsRUFDVixjQUFUdkQsRUFDRXZCLEVBQVFxVyxRQUFXa0IsRUFBS3BHLElBQUtyTSxJQUNsQ29TLEVBQUs5YixLQUFNMEosR0FFREEsR0FBT0EsRUFBSXRILFFBQW1CLFdBQVQrRCxHQUVoQ2tXLEVBQUszUyxPQUdKMUYsV0FHQzBYLEVBQ0pFLEVBQWVFLEVBQUsxWixPQUdUb1osSUFDWEcsRUFBY3RHLEVBQ2Q0RyxFQUFNVCxJQUdSLE1BQU90WixPQUdSb0YsT0FBUSxXQWtCUCxNQWpCS3dVLElBQ0p2YyxFQUFPbUUsS0FBTU0sVUFBVyxTQUFVdUssRUFBRzdFLEdBQ3BDLEdBQUk0UyxFQUNKLFFBQVNBLEVBQVEvYyxFQUFPNkosUUFBU00sRUFBS29TLEVBQU1RLElBQVksR0FDdkRSLEVBQUtwWCxPQUFRNFgsRUFBTyxHQUVmWixJQUNVRSxHQUFUVSxHQUNKVixJQUVhQyxHQUFUUyxHQUNKVCxPQU1FM1osTUFJUjZULElBQUssU0FBVWxWLEdBQ2QsTUFBT0EsR0FBS3RCLEVBQU82SixRQUFTdkksRUFBSWliLEdBQVMsTUFBU0EsSUFBUUEsRUFBSzFaLFNBR2hFMlUsTUFBTyxXQUdOLE1BRkErRSxNQUNBRixFQUFlLEVBQ1IxWixNQUdSa2EsUUFBUyxXQUVSLE1BREFOLEdBQU9DLEVBQVFQLEVBQVMxYyxVQUNqQm9ELE1BR1J5VSxTQUFVLFdBQ1QsT0FBUW1GLEdBR1RTLEtBQU0sV0FLTCxNQUpBUixHQUFRamQsVUFDRjBjLEdBQ0xXLEVBQUtDLFVBRUNsYSxNQUdSc2EsT0FBUSxXQUNQLE9BQVFULEdBR1RVLFNBQVUsU0FBVTdiLEVBQVNnRCxHQVU1QixPQVRLa1ksR0FBV0wsSUFBU00sSUFDeEJuWSxFQUFPQSxNQUNQQSxHQUFTaEQsRUFBU2dELEVBQUsxRCxNQUFRMEQsRUFBSzFELFFBQVUwRCxHQUN6QzhYLEVBQ0pLLEVBQU0vYixLQUFNNEQsR0FFWnFZLEVBQU1yWSxJQUdEMUIsTUFHUitaLEtBQU0sV0FFTCxNQURBRSxHQUFLTSxTQUFVdmEsS0FBTThCLFdBQ2Q5QixNQUdSdVosTUFBTyxXQUNOLFFBQVNBLEdBSVosT0FBT1UsSUFFUjVjLEVBQU9vRixRQUVONkYsU0FBVSxTQUFVa1MsR0FDbkIsR0FBSUMsS0FFQSxVQUFXLE9BQVFwZCxFQUFPZ2MsVUFBVSxlQUFnQixhQUNwRCxTQUFVLE9BQVFoYyxFQUFPZ2MsVUFBVSxlQUFnQixhQUNuRCxTQUFVLFdBQVloYyxFQUFPZ2MsVUFBVSxZQUUxQ3FCLEVBQVEsVUFDUi9ZLEdBQ0MrWSxNQUFPLFdBQ04sTUFBT0EsSUFFUkMsT0FBUSxXQUVQLE1BREFDLEdBQVNoWixLQUFNRSxXQUFZK1ksS0FBTS9ZLFdBQzFCOUIsTUFFUjhhLEtBQU0sV0FDTCxHQUFJQyxHQUFNalosU0FDVixPQUFPekUsR0FBT2lMLFNBQVMsU0FBVTBTLEdBQ2hDM2QsRUFBT21FLEtBQU1pWixFQUFRLFNBQVV2WSxFQUFHK1ksR0FDakMsR0FBSUMsR0FBU0QsRUFBTyxHQUNuQnRjLEVBQUt0QixFQUFPc0QsV0FBWW9hLEVBQUs3WSxLQUFTNlksRUFBSzdZLEVBRTVDMFksR0FBVUssRUFBTSxJQUFLLFdBQ3BCLEdBQUlFLEdBQVd4YyxHQUFNQSxFQUFHa0QsTUFBTzdCLEtBQU04QixVQUNoQ3FaLElBQVk5ZCxFQUFPc0QsV0FBWXdhLEVBQVN4WixTQUM1Q3daLEVBQVN4WixVQUNQQyxLQUFNb1osRUFBU0ksU0FDZlAsS0FBTUcsRUFBU0ssUUFDZkMsU0FBVU4sRUFBU08sUUFFckJQLEVBQVVFLEVBQVMsUUFBVWxiLE9BQVMyQixFQUFVcVosRUFBU3JaLFVBQVkzQixLQUFNckIsR0FBT3djLEdBQWFyWixlQUlsR2laLEVBQU0sT0FDSnBaLFdBSUpBLFFBQVMsU0FBVXFDLEdBQ2xCLE1BQWMsT0FBUEEsRUFBYzNHLEVBQU9vRixPQUFRdUIsRUFBS3JDLEdBQVlBLElBR3ZEaVosSUF3Q0QsT0FyQ0FqWixHQUFRNlosS0FBTzdaLEVBQVFtWixLQUd2QnpkLEVBQU9tRSxLQUFNaVosRUFBUSxTQUFVdlksRUFBRytZLEdBQ2pDLEdBQUlyQixHQUFPcUIsRUFBTyxHQUNqQlEsRUFBY1IsRUFBTyxFQUd0QnRaLEdBQVNzWixFQUFNLElBQU9yQixFQUFLTyxJQUd0QnNCLEdBQ0o3QixFQUFLTyxJQUFJLFdBRVJPLEVBQVFlLEdBR05oQixFQUFZLEVBQUp2WSxHQUFTLEdBQUlnWSxRQUFTTyxFQUFRLEdBQUssR0FBSUosTUFJbkRPLEVBQVVLLEVBQU0sSUFBTyxXQUV0QixNQURBTCxHQUFVSyxFQUFNLEdBQUssUUFBVWpiLE9BQVM0YSxFQUFXalosRUFBVTNCLEtBQU04QixXQUM1RDlCLE1BRVI0YSxFQUFVSyxFQUFNLEdBQUssUUFBV3JCLEVBQUtXLFdBSXRDNVksRUFBUUEsUUFBU2laLEdBR1pKLEdBQ0pBLEVBQUt2WixLQUFNMlosRUFBVUEsR0FJZkEsR0FJUmMsS0FBTSxTQUFVQyxHQUNmLEdBQUl6WixHQUFJLEVBQ1AwWixFQUFnQjdkLEVBQVdrRCxLQUFNYSxXQUNqQzVCLEVBQVMwYixFQUFjMWIsT0FHdkIyYixFQUF1QixJQUFYM2IsR0FBa0J5YixHQUFldGUsRUFBT3NELFdBQVlnYixFQUFZaGEsU0FBY3pCLEVBQVMsRUFHbkcwYSxFQUF5QixJQUFkaUIsRUFBa0JGLEVBQWN0ZSxFQUFPaUwsV0FHbER3VCxFQUFhLFNBQVU1WixFQUFHeVcsRUFBVW9ELEdBQ25DLE1BQU8sVUFBVWxWLEdBQ2hCOFIsRUFBVXpXLEdBQU1sQyxLQUNoQitiLEVBQVE3WixHQUFNSixVQUFVNUIsT0FBUyxFQUFJbkMsRUFBV2tELEtBQU1hLFdBQWMrRSxFQUNoRWtWLElBQVdDLEVBQ2RwQixFQUFTcUIsV0FBWXRELEVBQVVvRCxLQUNmRixHQUNoQmpCLEVBQVMvVyxZQUFhOFUsRUFBVW9ELEtBS25DQyxFQUFnQkUsRUFBa0JDLENBR25DLElBQUtqYyxFQUFTLEVBSWIsSUFIQThiLEVBQXFCOVgsTUFBT2hFLEdBQzVCZ2MsRUFBdUJoWSxNQUFPaEUsR0FDOUJpYyxFQUFzQmpZLE1BQU9oRSxHQUNqQkEsRUFBSmdDLEVBQVlBLElBQ2QwWixFQUFlMVosSUFBTzdFLEVBQU9zRCxXQUFZaWIsRUFBZTFaLEdBQUlQLFNBQ2hFaWEsRUFBZTFaLEdBQUlQLFVBQ2pCQyxLQUFNa2EsRUFBWTVaLEVBQUdpYSxFQUFpQlAsSUFDdENmLEtBQU1ELEVBQVNTLFFBQ2ZDLFNBQVVRLEVBQVk1WixFQUFHZ2EsRUFBa0JGLE1BRTNDSCxDQVVMLE9BSk1BLElBQ0xqQixFQUFTL1csWUFBYXNZLEVBQWlCUCxHQUdqQ2hCLEVBQVNqWixhQUdsQnRFLEVBQU9zTCxRQUFVLFNBQVdBLEdBQzNCLEdBQUl3SCxHQUFRbFQsRUFBU2lJLGNBQWMsU0FDbENrWCxFQUFXbmYsRUFBU29mLHlCQUNwQmpPLEVBQU1uUixFQUFTaUksY0FBYyxPQUM3QjJJLEVBQVM1USxFQUFTaUksY0FBYyxVQUNoQ29YLEVBQU16TyxFQUFPdEgsWUFBYXRKLEVBQVNpSSxjQUFjLFVBR2xELE9BQU1pTCxHQUFNbE0sTUFJWmtNLEVBQU1sTSxLQUFPLFdBSWIwRSxFQUFRNFQsUUFBMEIsS0FBaEJwTSxFQUFNdEosTUFJeEI4QixFQUFRNlQsWUFBY0YsRUFBSTNILFNBRzFCaE0sRUFBUThULHFCQUFzQixFQUM5QjlULEVBQVErVCxtQkFBb0IsRUFDNUIvVCxFQUFRZ1UsZUFBZ0IsRUFJeEJ4TSxFQUFNdUUsU0FBVSxFQUNoQi9MLEVBQVFpVSxlQUFpQnpNLEVBQU0wTSxXQUFXLEdBQU9uSSxRQUlqRDdHLEVBQU80RyxVQUFXLEVBQ2xCOUwsRUFBUW1VLGFBQWVSLEVBQUk3SCxTQUkzQnRFLEVBQVFsVCxFQUFTaUksY0FBYyxTQUMvQmlMLEVBQU10SixNQUFRLElBQ2RzSixFQUFNbE0sS0FBTyxRQUNiMEUsRUFBUW9VLFdBQTZCLE1BQWhCNU0sRUFBTXRKLE1BRzNCc0osRUFBTTVDLGFBQWMsVUFBVyxLQUMvQjRDLEVBQU01QyxhQUFjLE9BQVEsS0FFNUI2TyxFQUFTN1YsWUFBYTRKLEdBSXRCeEgsRUFBUXFVLFdBQWFaLEVBQVNTLFdBQVcsR0FBT0EsV0FBVyxHQUFPeEosVUFBVXFCLFFBSTVFL0wsRUFBUXNVLGVBQWlCLGFBQWV0Z0IsR0FFeEN5UixFQUFJL0YsTUFBTTZVLGVBQWlCLGNBQzNCOU8sRUFBSXlPLFdBQVcsR0FBT3hVLE1BQU02VSxlQUFpQixHQUM3Q3ZVLEVBQVF3VSxnQkFBK0MsZ0JBQTdCL08sRUFBSS9GLE1BQU02VSxlQUdwQzdmLEVBQU8sV0FDTixHQUFJK2YsR0FBV0MsRUFFZEMsRUFBVyw4SEFDWEMsRUFBT3RnQixFQUFTNkkscUJBQXFCLFFBQVMsRUFFekN5WCxLQUtOSCxFQUFZbmdCLEVBQVNpSSxjQUFjLE9BQ25Da1ksRUFBVS9VLE1BQU1tVixRQUFVLGdGQUcxQkQsRUFBS2hYLFlBQWE2VyxHQUFZN1csWUFBYTZILEdBQzNDQSxFQUFJdUIsVUFBWSxHQUVoQnZCLEVBQUkvRixNQUFNbVYsUUFBVSx1S0FJcEJuZ0IsRUFBTzhLLEtBQU1vVixFQUF5QixNQUFuQkEsRUFBS2xWLE1BQU1vVixNQUFpQkEsS0FBTSxNQUFVLFdBQzlEOVUsRUFBUStVLFVBQWdDLElBQXBCdFAsRUFBSXVQLGNBSXBCaGhCLEVBQU9paEIsbUJBQ1hqVixFQUFRZ1UsY0FBdUUsUUFBckRoZ0IsRUFBT2loQixpQkFBa0J4UCxFQUFLLFdBQWVvQixJQUN2RTdHLEVBQVErVCxrQkFBMkYsU0FBckUvZixFQUFPaWhCLGlCQUFrQnhQLEVBQUssUUFBWXlQLE1BQU8sUUFBVUEsTUFNekZSLEVBQVlqUCxFQUFJN0gsWUFBYXRKLEVBQVNpSSxjQUFjLFFBQ3BEbVksRUFBVWhWLE1BQU1tVixRQUFVcFAsRUFBSS9GLE1BQU1tVixRQUFVRixFQUM5Q0QsRUFBVWhWLE1BQU15VixZQUFjVCxFQUFVaFYsTUFBTXdWLE1BQVEsSUFDdER6UCxFQUFJL0YsTUFBTXdWLE1BQVEsTUFFbEJsVixFQUFROFQscUJBQ05uWSxZQUFjM0gsRUFBT2loQixpQkFBa0JQLEVBQVcsV0FBZVMsY0FHcEVQLEVBQUsvVyxZQUFhNFcsTUFHWnpVLEdBckdDQSxNQW1IVCxJQUFJb1YsR0FBV0MsRUFDZEMsRUFBUywrQkFDVEMsRUFBYSxVQUVkLFNBQVNDLEtBSVJsWCxPQUFPbVgsZUFBZ0JwZSxLQUFLK04sU0FBWSxHQUN2QzdNLElBQUssV0FDSixZQUlGbEIsS0FBS21ELFFBQVU5RixFQUFPOEYsUUFBVUMsS0FBS0MsU0FHdEM4YSxFQUFLRSxJQUFNLEVBRVhGLEVBQUtHLFFBQVUsU0FBVUMsR0FPeEIsTUFBT0EsR0FBTWhlLFNBQ08sSUFBbkJnZSxFQUFNaGUsVUFBcUMsSUFBbkJnZSxFQUFNaGUsVUFBaUIsR0FHakQ0ZCxFQUFLeGUsV0FDSmlJLElBQUssU0FBVTJXLEdBSWQsSUFBTUosRUFBS0csUUFBU0MsR0FDbkIsTUFBTyxFQUdSLElBQUlDLE1BRUhDLEVBQVNGLEVBQU92ZSxLQUFLbUQsUUFHdEIsS0FBTXNiLEVBQVMsQ0FDZEEsRUFBU04sRUFBS0UsS0FHZCxLQUNDRyxFQUFZeGUsS0FBS21ELFVBQWMwRCxNQUFPNFgsR0FDdEN4WCxPQUFPeVgsaUJBQWtCSCxFQUFPQyxHQUkvQixNQUFRL1osR0FDVCtaLEVBQVl4ZSxLQUFLbUQsU0FBWXNiLEVBQzdCcGhCLEVBQU9vRixPQUFROGIsRUFBT0MsSUFTeEIsTUFKTXhlLE1BQUsrTixNQUFPMFEsS0FDakJ6ZSxLQUFLK04sTUFBTzBRLE9BR05BLEdBRVJFLElBQUssU0FBVUosRUFBT3paLEVBQU0rQixHQUMzQixHQUFJK1gsR0FJSEgsRUFBU3plLEtBQUs0SCxJQUFLMlcsR0FDbkJ4USxFQUFRL04sS0FBSytOLE1BQU8wUSxFQUdyQixJQUFxQixnQkFBVDNaLEdBQ1hpSixFQUFPakosR0FBUytCLE1BS2hCLElBQUt4SixFQUFPcUgsY0FBZXFKLEdBQzFCMVEsRUFBT29GLE9BQVF6QyxLQUFLK04sTUFBTzBRLEdBQVUzWixPQUdyQyxLQUFNOFosSUFBUTlaLEdBQ2JpSixFQUFPNlEsR0FBUzlaLEVBQU04WixFQUl6QixPQUFPN1EsSUFFUjdNLElBQUssU0FBVXFkLEVBQU8zVyxHQUtyQixHQUFJbUcsR0FBUS9OLEtBQUsrTixNQUFPL04sS0FBSzRILElBQUsyVyxHQUVsQyxPQUFPM1csS0FBUWhMLFVBQ2RtUixFQUFRQSxFQUFPbkcsSUFFakJELE9BQVEsU0FBVTRXLEVBQU8zVyxFQUFLZixHQUM3QixHQUFJZ1ksRUFZSixPQUFLalgsS0FBUWhMLFdBQ1RnTCxHQUFzQixnQkFBUkEsSUFBcUJmLElBQVVqSyxXQUVoRGlpQixFQUFTN2UsS0FBS2tCLElBQUtxZCxFQUFPM1csR0FFbkJpWCxJQUFXamlCLFVBQ2pCaWlCLEVBQVM3ZSxLQUFLa0IsSUFBS3FkLEVBQU9saEIsRUFBT29KLFVBQVVtQixNQVM3QzVILEtBQUsyZSxJQUFLSixFQUFPM1csRUFBS2YsR0FJZkEsSUFBVWpLLFVBQVlpSyxFQUFRZSxJQUV0Q3hDLE9BQVEsU0FBVW1aLEVBQU8zVyxHQUN4QixHQUFJMUYsR0FBR1MsRUFBTW1jLEVBQ1pMLEVBQVN6ZSxLQUFLNEgsSUFBSzJXLEdBQ25CeFEsRUFBUS9OLEtBQUsrTixNQUFPMFEsRUFFckIsSUFBSzdXLElBQVFoTCxVQUNab0QsS0FBSytOLE1BQU8wUSxVQUVOLENBRURwaEIsRUFBTzZGLFFBQVMwRSxHQU9wQmpGLEVBQU9pRixFQUFJaEssT0FBUWdLLEVBQUl2RixJQUFLaEYsRUFBT29KLGFBRW5DcVksRUFBUXpoQixFQUFPb0osVUFBV21CLEdBRXJCQSxJQUFPbUcsR0FDWHBMLEdBQVNpRixFQUFLa1gsSUFJZG5jLEVBQU9tYyxFQUNQbmMsRUFBT0EsSUFBUW9MLElBQ1pwTCxHQUFXQSxFQUFLN0MsTUFBT2YsU0FJNUJtRCxFQUFJUyxFQUFLekMsTUFDVCxPQUFRZ0MsVUFDQTZMLEdBQU9wTCxFQUFNVCxNQUl2QjZjLFFBQVMsU0FBVVIsR0FDbEIsT0FBUWxoQixFQUFPcUgsY0FDZDFFLEtBQUsrTixNQUFPd1EsRUFBT3ZlLEtBQUttRCxnQkFHMUI2YixRQUFTLFNBQVVULEdBQ2JBLEVBQU92ZSxLQUFLbUQsZ0JBQ1RuRCxNQUFLK04sTUFBT3dRLEVBQU92ZSxLQUFLbUQsWUFNbEM0YSxFQUFZLEdBQUlJLEdBQ2hCSCxFQUFZLEdBQUlHLEdBR2hCOWdCLEVBQU9vRixRQUNOd2MsV0FBWWQsRUFBS0csUUFFakJTLFFBQVMsU0FBVWhmLEdBQ2xCLE1BQU9nZSxHQUFVZ0IsUUFBU2hmLElBQVVpZSxFQUFVZSxRQUFTaGYsSUFHeEQrRSxLQUFNLFNBQVUvRSxFQUFNNEMsRUFBTW1DLEdBQzNCLE1BQU9pWixHQUFVcFcsT0FBUTVILEVBQU00QyxFQUFNbUMsSUFHdENvYSxXQUFZLFNBQVVuZixFQUFNNEMsR0FDM0JvYixFQUFVM1ksT0FBUXJGLEVBQU00QyxJQUt6QndjLE1BQU8sU0FBVXBmLEVBQU00QyxFQUFNbUMsR0FDNUIsTUFBT2taLEdBQVVyVyxPQUFRNUgsRUFBTTRDLEVBQU1tQyxJQUd0Q3NhLFlBQWEsU0FBVXJmLEVBQU00QyxHQUM1QnFiLEVBQVU1WSxPQUFRckYsRUFBTTRDLE1BSTFCdEYsRUFBT3NCLEdBQUc4RCxRQUNUcUMsS0FBTSxTQUFVOEMsRUFBS2YsR0FDcEIsR0FBSXlILEdBQU8zTCxFQUNWNUMsRUFBT0MsS0FBTSxHQUNia0MsRUFBSSxFQUNKNEMsRUFBTyxJQUdSLElBQUs4QyxJQUFRaEwsVUFBWSxDQUN4QixHQUFLb0QsS0FBS0UsU0FDVDRFLEVBQU9pWixFQUFVN2MsSUFBS25CLEdBRUMsSUFBbEJBLEVBQUtRLFdBQW1CeWQsRUFBVTljLElBQUtuQixFQUFNLGlCQUFtQixDQUVwRSxJQURBdU8sRUFBUXZPLEVBQUs2SyxXQUNEMEQsRUFBTXBPLE9BQVZnQyxFQUFrQkEsSUFDekJTLEVBQU8yTCxFQUFPcE0sR0FBSVMsS0FFZSxJQUE1QkEsRUFBS3pFLFFBQVMsV0FDbEJ5RSxFQUFPdEYsRUFBT29KLFVBQVc5RCxFQUFLM0UsTUFBTSxJQUNwQ3FoQixFQUFVdGYsRUFBTTRDLEVBQU1tQyxFQUFNbkMsSUFHOUJxYixHQUFVVyxJQUFLNWUsRUFBTSxnQkFBZ0IsR0FJdkMsTUFBTytFLEdBSVIsTUFBb0IsZ0JBQVI4QyxHQUNKNUgsS0FBS3dCLEtBQUssV0FDaEJ1YyxFQUFVWSxJQUFLM2UsS0FBTTRILEtBSWhCdkssRUFBT3NLLE9BQVEzSCxLQUFNLFNBQVU2RyxHQUNyQyxHQUFJL0IsR0FDSHdhLEVBQVdqaUIsRUFBT29KLFVBQVdtQixFQU85QixJQUFLN0gsR0FBUThHLElBQVVqSyxVQUF2QixDQUlDLEdBREFrSSxFQUFPaVosRUFBVTdjLElBQUtuQixFQUFNNkgsR0FDdkI5QyxJQUFTbEksVUFDYixNQUFPa0ksRUFNUixJQURBQSxFQUFPaVosRUFBVTdjLElBQUtuQixFQUFNdWYsR0FDdkJ4YSxJQUFTbEksVUFDYixNQUFPa0ksRUFNUixJQURBQSxFQUFPdWEsRUFBVXRmLEVBQU11ZixFQUFVMWlCLFdBQzVCa0ksSUFBU2xJLFVBQ2IsTUFBT2tJLE9BUVQ5RSxNQUFLd0IsS0FBSyxXQUdULEdBQUlzRCxHQUFPaVosRUFBVTdjLElBQUtsQixLQUFNc2YsRUFLaEN2QixHQUFVWSxJQUFLM2UsS0FBTXNmLEVBQVV6WSxHQUtMLEtBQXJCZSxFQUFJMUosUUFBUSxNQUFlNEcsSUFBU2xJLFdBQ3hDbWhCLEVBQVVZLElBQUszZSxLQUFNNEgsRUFBS2YsTUFHMUIsS0FBTUEsRUFBTy9FLFVBQVU1QixPQUFTLEVBQUcsTUFBTSxJQUc3Q2dmLFdBQVksU0FBVXRYLEdBQ3JCLE1BQU81SCxNQUFLd0IsS0FBSyxXQUNoQnVjLEVBQVUzWSxPQUFRcEYsS0FBTTRILE9BSzNCLFNBQVN5WCxHQUFVdGYsRUFBTTZILEVBQUs5QyxHQUM3QixHQUFJbkMsRUFJSixJQUFLbUMsSUFBU2xJLFdBQStCLElBQWxCbUQsRUFBS1EsU0FJL0IsR0FIQW9DLEVBQU8sUUFBVWlGLEVBQUl0RSxRQUFTNGEsRUFBWSxPQUFRdFgsY0FDbEQ5QixFQUFPL0UsRUFBS3VOLGFBQWMzSyxHQUVMLGdCQUFUbUMsR0FBb0IsQ0FDL0IsSUFDQ0EsRUFBZ0IsU0FBVEEsR0FBa0IsRUFDZixVQUFUQSxHQUFtQixFQUNWLFNBQVRBLEVBQWtCLE1BRWpCQSxFQUFPLEtBQU9BLEdBQVFBLEVBQ3ZCbVosRUFBT3hkLEtBQU1xRSxHQUFTUyxLQUFLQyxNQUFPVixHQUNsQ0EsRUFDQSxNQUFPTCxJQUdUc1osRUFBVVksSUFBSzVlLEVBQU02SCxFQUFLOUMsT0FFMUJBLEdBQU9sSSxTQUdULE9BQU9rSSxHQUVSekgsRUFBT29GLFFBQ044YyxNQUFPLFNBQVV4ZixFQUFNa0UsRUFBTWEsR0FDNUIsR0FBSXlhLEVBRUosT0FBS3hmLElBQ0prRSxHQUFTQSxHQUFRLE1BQVMsUUFDMUJzYixFQUFRdkIsRUFBVTljLElBQUtuQixFQUFNa0UsR0FHeEJhLEtBQ0V5YSxHQUFTbGlCLEVBQU82RixRQUFTNEIsR0FDOUJ5YSxFQUFRdkIsRUFBVXJXLE9BQVE1SCxFQUFNa0UsRUFBTTVHLEVBQU8wRCxVQUFVK0QsSUFFdkR5YSxFQUFNemhCLEtBQU1nSCxJQUdQeWEsT0FaUixXQWdCREMsUUFBUyxTQUFVemYsRUFBTWtFLEdBQ3hCQSxFQUFPQSxHQUFRLElBRWYsSUFBSXNiLEdBQVFsaUIsRUFBT2tpQixNQUFPeGYsRUFBTWtFLEdBQy9Cd2IsRUFBY0YsRUFBTXJmLE9BQ3BCdkIsRUFBSzRnQixFQUFNdFIsUUFDWHlSLEVBQVFyaUIsRUFBT3NpQixZQUFhNWYsRUFBTWtFLEdBQ2xDMmIsRUFBTyxXQUNOdmlCLEVBQU9taUIsUUFBU3pmLEVBQU1rRTtDQUlaLGdCQUFQdEYsSUFDSkEsRUFBSzRnQixFQUFNdFIsUUFDWHdSLEtBR0k5Z0IsSUFJVSxPQUFUc0YsR0FDSnNiLEVBQU1yTyxRQUFTLG9CQUlUd08sR0FBTUcsS0FDYmxoQixFQUFHc0MsS0FBTWxCLEVBQU02ZixFQUFNRixLQUdoQkQsR0FBZUMsR0FDcEJBLEVBQU03SyxNQUFNa0YsUUFLZDRGLFlBQWEsU0FBVTVmLEVBQU1rRSxHQUM1QixHQUFJMkQsR0FBTTNELEVBQU8sWUFDakIsT0FBTytaLEdBQVU5YyxJQUFLbkIsRUFBTTZILElBQVNvVyxFQUFVclcsT0FBUTVILEVBQU02SCxHQUM1RGlOLE1BQU94WCxFQUFPZ2MsVUFBVSxlQUFlYyxJQUFJLFdBQzFDNkQsRUFBVTVZLE9BQVFyRixHQUFRa0UsRUFBTyxRQUFTMkQsV0FNOUN2SyxFQUFPc0IsR0FBRzhELFFBQ1Q4YyxNQUFPLFNBQVV0YixFQUFNYSxHQUN0QixHQUFJZ2IsR0FBUyxDQVFiLE9BTnFCLGdCQUFUN2IsS0FDWGEsRUFBT2IsRUFDUEEsRUFBTyxLQUNQNmIsS0FHdUJBLEVBQW5CaGUsVUFBVTVCLE9BQ1A3QyxFQUFPa2lCLE1BQU92ZixLQUFLLEdBQUlpRSxHQUd4QmEsSUFBU2xJLFVBQ2ZvRCxLQUNBQSxLQUFLd0IsS0FBSyxXQUNULEdBQUkrZCxHQUFRbGlCLEVBQU9raUIsTUFBT3ZmLEtBQU1pRSxFQUFNYSxFQUd0Q3pILEdBQU9zaUIsWUFBYTNmLEtBQU1pRSxHQUVaLE9BQVRBLEdBQThCLGVBQWJzYixFQUFNLElBQzNCbGlCLEVBQU9taUIsUUFBU3hmLEtBQU1pRSxNQUkxQnViLFFBQVMsU0FBVXZiLEdBQ2xCLE1BQU9qRSxNQUFLd0IsS0FBSyxXQUNoQm5FLEVBQU9taUIsUUFBU3hmLEtBQU1pRSxNQUt4QjhiLE1BQU8sU0FBVUMsRUFBTS9iLEdBSXRCLE1BSEErYixHQUFPM2lCLEVBQU80aUIsR0FBSzVpQixFQUFPNGlCLEdBQUdDLE9BQVFGLElBQVVBLEVBQU9BLEVBQ3REL2IsRUFBT0EsR0FBUSxLQUVSakUsS0FBS3VmLE1BQU90YixFQUFNLFNBQVUyYixFQUFNRixHQUN4QyxHQUFJUyxHQUFVM1gsV0FBWW9YLEVBQU1JLEVBQ2hDTixHQUFNRyxLQUFPLFdBQ1pPLGFBQWNELE9BSWpCRSxXQUFZLFNBQVVwYyxHQUNyQixNQUFPakUsTUFBS3VmLE1BQU90YixHQUFRLFVBSTVCdEMsUUFBUyxTQUFVc0MsRUFBTUQsR0FDeEIsR0FBSTJCLEdBQ0gyYSxFQUFRLEVBQ1JDLEVBQVFsakIsRUFBT2lMLFdBQ2Y4SSxFQUFXcFIsS0FDWGtDLEVBQUlsQyxLQUFLRSxPQUNUa2IsRUFBVSxhQUNDa0YsR0FDVEMsRUFBTTFjLFlBQWF1TixHQUFZQSxJQUliLGlCQUFUbk4sS0FDWEQsRUFBTUMsRUFDTkEsRUFBT3JILFdBRVJxSCxFQUFPQSxHQUFRLElBRWYsT0FBTy9CLElBQ055RCxFQUFNcVksRUFBVTljLElBQUtrUSxFQUFVbFAsR0FBSytCLEVBQU8sY0FDdEMwQixHQUFPQSxFQUFJa1AsUUFDZnlMLElBQ0EzYSxFQUFJa1AsTUFBTXNGLElBQUtpQixHQUlqQixPQURBQSxLQUNPbUYsRUFBTTVlLFFBQVNxQyxLQUd4QixJQUFJd2MsR0FBVUMsRUFDYkMsRUFBUyxjQUNUQyxFQUFVLE1BQ1ZDLEVBQWEscUNBRWR2akIsR0FBT3NCLEdBQUc4RCxRQUNUN0IsS0FBTSxTQUFVK0IsRUFBTWtFLEdBQ3JCLE1BQU94SixHQUFPc0ssT0FBUTNILEtBQU0zQyxFQUFPdUQsS0FBTStCLEVBQU1rRSxFQUFPL0UsVUFBVTVCLE9BQVMsSUFHMUUyZ0IsV0FBWSxTQUFVbGUsR0FDckIsTUFBTzNDLE1BQUt3QixLQUFLLFdBQ2hCbkUsRUFBT3dqQixXQUFZN2dCLEtBQU0yQyxNQUkzQmljLEtBQU0sU0FBVWpjLEVBQU1rRSxHQUNyQixNQUFPeEosR0FBT3NLLE9BQVEzSCxLQUFNM0MsRUFBT3VoQixLQUFNamMsRUFBTWtFLEVBQU8vRSxVQUFVNUIsT0FBUyxJQUcxRTRnQixXQUFZLFNBQVVuZSxHQUNyQixNQUFPM0MsTUFBS3dCLEtBQUssaUJBQ1R4QixNQUFNM0MsRUFBTzBqQixRQUFTcGUsSUFBVUEsTUFJekNxZSxTQUFVLFNBQVVuYSxHQUNuQixHQUFJb2EsR0FBU2xoQixFQUFNMk8sRUFBS3dTLEVBQU85ZSxFQUM5QkYsRUFBSSxFQUNKQyxFQUFNbkMsS0FBS0UsT0FDWGloQixFQUEyQixnQkFBVnRhLElBQXNCQSxDQUV4QyxJQUFLeEosRUFBT3NELFdBQVlrRyxHQUN2QixNQUFPN0csTUFBS3dCLEtBQUssU0FBVVksR0FDMUIvRSxFQUFRMkMsTUFBT2doQixTQUFVbmEsRUFBTTVGLEtBQU1qQixLQUFNb0MsRUFBR3BDLEtBQUt5UCxhQUlyRCxJQUFLMFIsRUFJSixJQUZBRixHQUFZcGEsR0FBUyxJQUFLL0csTUFBT2YsT0FFckJvRCxFQUFKRCxFQUFTQSxJQU9oQixHQU5BbkMsRUFBT0MsS0FBTWtDLEdBQ2J3TSxFQUF3QixJQUFsQjNPLEVBQUtRLFdBQW9CUixFQUFLMFAsV0FDakMsSUFBTTFQLEVBQUswUCxVQUFZLEtBQU1uTSxRQUFTb2QsRUFBUSxLQUNoRCxLQUdVLENBQ1Z0ZSxFQUFJLENBQ0osT0FBUzhlLEVBQVFELEVBQVE3ZSxLQUNnQixFQUFuQ3NNLEVBQUl4USxRQUFTLElBQU1nakIsRUFBUSxPQUMvQnhTLEdBQU93UyxFQUFRLElBR2pCbmhCLEdBQUswUCxVQUFZcFMsRUFBT21CLEtBQU1rUSxHQU1qQyxNQUFPMU8sT0FHUm9oQixZQUFhLFNBQVV2YSxHQUN0QixHQUFJb2EsR0FBU2xoQixFQUFNMk8sRUFBS3dTLEVBQU85ZSxFQUM5QkYsRUFBSSxFQUNKQyxFQUFNbkMsS0FBS0UsT0FDWGloQixFQUErQixJQUFyQnJmLFVBQVU1QixRQUFpQyxnQkFBVjJHLElBQXNCQSxDQUVsRSxJQUFLeEosRUFBT3NELFdBQVlrRyxHQUN2QixNQUFPN0csTUFBS3dCLEtBQUssU0FBVVksR0FDMUIvRSxFQUFRMkMsTUFBT29oQixZQUFhdmEsRUFBTTVGLEtBQU1qQixLQUFNb0MsRUFBR3BDLEtBQUt5UCxhQUd4RCxJQUFLMFIsRUFHSixJQUZBRixHQUFZcGEsR0FBUyxJQUFLL0csTUFBT2YsT0FFckJvRCxFQUFKRCxFQUFTQSxJQVFoQixHQVBBbkMsRUFBT0MsS0FBTWtDLEdBRWJ3TSxFQUF3QixJQUFsQjNPLEVBQUtRLFdBQW9CUixFQUFLMFAsV0FDakMsSUFBTTFQLEVBQUswUCxVQUFZLEtBQU1uTSxRQUFTb2QsRUFBUSxLQUNoRCxJQUdVLENBQ1Z0ZSxFQUFJLENBQ0osT0FBUzhlLEVBQVFELEVBQVE3ZSxLQUV4QixNQUFRc00sRUFBSXhRLFFBQVMsSUFBTWdqQixFQUFRLE1BQVMsRUFDM0N4UyxFQUFNQSxFQUFJcEwsUUFBUyxJQUFNNGQsRUFBUSxJQUFLLElBR3hDbmhCLEdBQUswUCxVQUFZNUksRUFBUXhKLEVBQU9tQixLQUFNa1EsR0FBUSxHQUtqRCxNQUFPMU8sT0FHUnFoQixZQUFhLFNBQVV4YSxFQUFPeWEsR0FDN0IsR0FBSXJkLFNBQWM0QyxFQUVsQixPQUF5QixpQkFBYnlhLElBQW1DLFdBQVRyZCxFQUM5QnFkLEVBQVd0aEIsS0FBS2doQixTQUFVbmEsR0FBVTdHLEtBQUtvaEIsWUFBYXZhLEdBR3pEeEosRUFBT3NELFdBQVlrRyxHQUNoQjdHLEtBQUt3QixLQUFLLFNBQVVVLEdBQzFCN0UsRUFBUTJDLE1BQU9xaEIsWUFBYXhhLEVBQU01RixLQUFLakIsS0FBTWtDLEVBQUdsQyxLQUFLeVAsVUFBVzZSLEdBQVdBLEtBSXRFdGhCLEtBQUt3QixLQUFLLFdBQ2hCLEdBQWMsV0FBVHlDLEVBQW9CLENBRXhCLEdBQUl3TCxHQUNIdk4sRUFBSSxFQUNKK1gsRUFBTzVjLEVBQVEyQyxNQUNmdWhCLEVBQWExYSxFQUFNL0csTUFBT2YsTUFFM0IsT0FBUzBRLEVBQVk4UixFQUFZcmYsS0FFM0IrWCxFQUFLdUgsU0FBVS9SLEdBQ25Cd0ssRUFBS21ILFlBQWEzUixHQUVsQndLLEVBQUsrRyxTQUFVdlIsUUFLTnhMLElBQVNsSCxHQUE4QixZQUFUa0gsS0FDcENqRSxLQUFLeVAsV0FFVHVPLEVBQVVXLElBQUszZSxLQUFNLGdCQUFpQkEsS0FBS3lQLFdBTzVDelAsS0FBS3lQLFVBQVl6UCxLQUFLeVAsV0FBYTVJLEtBQVUsRUFBUSxHQUFLbVgsRUFBVTljLElBQUtsQixLQUFNLGtCQUFxQixPQUt2R3doQixTQUFVLFNBQVUvaUIsR0FDbkIsR0FBSWdSLEdBQVksSUFBTWhSLEVBQVcsSUFDaEN5RCxFQUFJLEVBQ0prRixFQUFJcEgsS0FBS0UsTUFDVixNQUFZa0gsRUFBSmxGLEVBQU9BLElBQ2QsR0FBMEIsSUFBckJsQyxLQUFLa0MsR0FBRzNCLFdBQW1CLElBQU1QLEtBQUtrQyxHQUFHdU4sVUFBWSxLQUFLbk0sUUFBUW9kLEVBQVEsS0FBS3hpQixRQUFTdVIsSUFBZSxFQUMzRyxPQUFPLENBSVQsUUFBTyxHQUdSNEIsSUFBSyxTQUFVeEssR0FDZCxHQUFJNlksR0FBT3BlLEVBQUtYLEVBQ2ZaLEVBQU9DLEtBQUssRUFFYixFQUFBLEdBQU04QixVQUFVNUIsT0FzQmhCLE1BRkFTLEdBQWF0RCxFQUFPc0QsV0FBWWtHLEdBRXpCN0csS0FBS3dCLEtBQUssU0FBVVUsR0FDMUIsR0FBSW1QLEVBRW1CLEtBQWxCclIsS0FBS08sV0FLVDhRLEVBREkxUSxFQUNFa0csRUFBTTVGLEtBQU1qQixLQUFNa0MsRUFBRzdFLEVBQVEyQyxNQUFPcVIsT0FFcEN4SyxFQUlLLE1BQVB3SyxFQUNKQSxFQUFNLEdBQ29CLGdCQUFSQSxHQUNsQkEsR0FBTyxHQUNJaFUsRUFBTzZGLFFBQVNtTyxLQUMzQkEsRUFBTWhVLEVBQU9nRixJQUFJZ1AsRUFBSyxTQUFXeEssR0FDaEMsTUFBZ0IsT0FBVEEsRUFBZ0IsR0FBS0EsRUFBUSxNQUl0QzZZLEVBQVFyaUIsRUFBT29rQixTQUFVemhCLEtBQUtpRSxPQUFVNUcsRUFBT29rQixTQUFVemhCLEtBQUsyRyxTQUFTQyxlQUdqRThZLEdBQVcsT0FBU0EsSUFBVUEsRUFBTWYsSUFBSzNlLEtBQU1xUixFQUFLLFdBQWN6VSxZQUN2RW9ELEtBQUs2RyxNQUFRd0ssS0FqRGQsSUFBS3RSLEVBR0osTUFGQTJmLEdBQVFyaUIsRUFBT29rQixTQUFVMWhCLEVBQUtrRSxPQUFVNUcsRUFBT29rQixTQUFVMWhCLEVBQUs0RyxTQUFTQyxlQUVsRThZLEdBQVMsT0FBU0EsS0FBVXBlLEVBQU1vZSxFQUFNeGUsSUFBS25CLEVBQU0sWUFBZW5ELFVBQy9EMEUsR0FHUkEsRUFBTXZCLEVBQUs4RyxNQUVXLGdCQUFSdkYsR0FFYkEsRUFBSWdDLFFBQVFxZCxFQUFTLElBRWQsTUFBUHJmLEVBQWMsR0FBS0EsT0EwQ3hCakUsRUFBT29GLFFBQ05nZixVQUNDQyxRQUNDeGdCLElBQUssU0FBVW5CLEdBR2QsR0FBSXNSLEdBQU10UixFQUFLNkssV0FBVy9ELEtBQzFCLFFBQVF3SyxHQUFPQSxFQUFJQyxVQUFZdlIsRUFBSzhHLE1BQVE5RyxFQUFLc0csT0FHbkR3SCxRQUNDM00sSUFBSyxTQUFVbkIsR0FDZCxHQUFJOEcsR0FBTzZhLEVBQ1ZoZixFQUFVM0MsRUFBSzJDLFFBQ2YwWCxFQUFRcmEsRUFBSzZVLGNBQ2IrTSxFQUFvQixlQUFkNWhCLEVBQUtrRSxNQUFpQyxFQUFSbVcsRUFDcEMyQixFQUFTNEYsRUFBTSxRQUNmQyxFQUFNRCxFQUFNdkgsRUFBUSxFQUFJMVgsRUFBUXhDLE9BQ2hDZ0MsRUFBWSxFQUFSa1ksRUFDSHdILEVBQ0FELEVBQU12SCxFQUFRLENBR2hCLE1BQVl3SCxFQUFKMWYsRUFBU0EsSUFJaEIsR0FIQXdmLEVBQVNoZixFQUFTUixNQUdYd2YsRUFBTy9NLFVBQVl6UyxJQUFNa1ksSUFFNUIvYyxFQUFPc0wsUUFBUW1VLFlBQWU0RSxFQUFPak4sU0FBK0MsT0FBcENpTixFQUFPcFUsYUFBYSxjQUNuRW9VLEVBQU81Z0IsV0FBVzJULFVBQWFwWCxFQUFPc0osU0FBVSthLEVBQU81Z0IsV0FBWSxhQUFpQixDQU14RixHQUhBK0YsRUFBUXhKLEVBQVFxa0IsR0FBU3JRLE1BR3BCc1EsRUFDSixNQUFPOWEsRUFJUmtWLEdBQU9qZSxLQUFNK0ksR0FJZixNQUFPa1YsSUFHUjRDLElBQUssU0FBVTVlLEVBQU04RyxHQUNwQixHQUFJZ2IsR0FBV0gsRUFDZGhmLEVBQVUzQyxFQUFLMkMsUUFDZnFaLEVBQVMxZSxFQUFPMEQsVUFBVzhGLEdBQzNCM0UsRUFBSVEsRUFBUXhDLE1BRWIsT0FBUWdDLElBQ1B3ZixFQUFTaGYsRUFBU1IsSUFDWndmLEVBQU8vTSxTQUFXdFgsRUFBTzZKLFFBQVM3SixFQUFPcWtCLEdBQVFyUSxNQUFPMEssSUFBWSxLQUN6RThGLEdBQVksRUFRZCxPQUhNQSxLQUNMOWhCLEVBQUs2VSxjQUFnQixJQUVmbUgsS0FLVm5iLEtBQU0sU0FBVWIsRUFBTTRDLEVBQU1rRSxHQUMzQixHQUFJNlksR0FBT3BlLEVBQ1Z3Z0IsRUFBUS9oQixFQUFLUSxRQUdkLElBQU1SLEdBQWtCLElBQVYraEIsR0FBeUIsSUFBVkEsR0FBeUIsSUFBVkEsRUFLNUMsYUFBWS9oQixHQUFLdU4sZUFBaUJ2USxFQUMxQk0sRUFBT3VoQixLQUFNN2UsRUFBTTRDLEVBQU1rRSxJQUtsQixJQUFWaWIsR0FBZ0J6a0IsRUFBTzJiLFNBQVVqWixLQUNyQzRDLEVBQU9BLEVBQUtpRSxjQUNaOFksRUFBUXJpQixFQUFPMGtCLFVBQVdwZixLQUN2QnRGLEVBQU84VCxLQUFLclIsTUFBTStMLEtBQUtwTCxLQUFNa0MsR0FBUzhkLEVBQVdELElBR2hEM1osSUFBVWpLLFVBYUg4aUIsR0FBUyxPQUFTQSxJQUE2QyxRQUFuQ3BlLEVBQU1vZSxFQUFNeGUsSUFBS25CLEVBQU00QyxJQUN2RHJCLEdBR1BBLEVBQU1qRSxFQUFPK0MsS0FBS1EsS0FBTWIsRUFBTTRDLEdBR2hCLE1BQVByQixFQUNOMUUsVUFDQTBFLEdBcEJjLE9BQVZ1RixFQUdPNlksR0FBUyxPQUFTQSxLQUFVcGUsRUFBTW9lLEVBQU1mLElBQUs1ZSxFQUFNOEcsRUFBT2xFLE1BQVkvRixVQUMxRTBFLEdBR1B2QixFQUFLd04sYUFBYzVLLEVBQU1rRSxFQUFRLElBQzFCQSxJQVBQeEosRUFBT3dqQixXQUFZOWdCLEVBQU00QyxHQUF6QnRGLGFBdUJId2pCLFdBQVksU0FBVTlnQixFQUFNOEcsR0FDM0IsR0FBSWxFLEdBQU1xZixFQUNUOWYsRUFBSSxFQUNKK2YsRUFBWXBiLEdBQVNBLEVBQU0vRyxNQUFPZixFQUVuQyxJQUFLa2pCLEdBQStCLElBQWxCbGlCLEVBQUtRLFNBQ3RCLE1BQVNvQyxFQUFPc2YsRUFBVS9mLEtBQ3pCOGYsRUFBVzNrQixFQUFPMGpCLFFBQVNwZSxJQUFVQSxFQUdoQ3RGLEVBQU84VCxLQUFLclIsTUFBTStMLEtBQUtwTCxLQUFNa0MsS0FFakM1QyxFQUFNaWlCLElBQWEsR0FHcEJqaUIsRUFBSzZOLGdCQUFpQmpMLElBS3pCb2YsV0FDQzlkLE1BQ0MwYSxJQUFLLFNBQVU1ZSxFQUFNOEcsR0FDcEIsSUFBTXhKLEVBQU9zTCxRQUFRb1UsWUFBd0IsVUFBVmxXLEdBQXFCeEosRUFBT3NKLFNBQVM1RyxFQUFNLFNBQVcsQ0FHeEYsR0FBSXNSLEdBQU10UixFQUFLOEcsS0FLZixPQUpBOUcsR0FBS3dOLGFBQWMsT0FBUTFHLEdBQ3RCd0ssSUFDSnRSLEVBQUs4RyxNQUFRd0ssR0FFUHhLLE1BTVhrYSxTQUNDbUIsTUFBTyxVQUNQQyxRQUFTLGFBR1Z2RCxLQUFNLFNBQVU3ZSxFQUFNNEMsRUFBTWtFLEdBQzNCLEdBQUl2RixHQUFLb2UsRUFBTzBDLEVBQ2ZOLEVBQVEvaEIsRUFBS1EsUUFHZCxJQUFNUixHQUFrQixJQUFWK2hCLEdBQXlCLElBQVZBLEdBQXlCLElBQVZBLEVBWTVDLE1BUkFNLEdBQW1CLElBQVZOLElBQWdCemtCLEVBQU8yYixTQUFValosR0FFckNxaUIsSUFFSnpmLEVBQU90RixFQUFPMGpCLFFBQVNwZSxJQUFVQSxFQUNqQytjLEVBQVFyaUIsRUFBT2dsQixVQUFXMWYsSUFHdEJrRSxJQUFVakssVUFDUDhpQixHQUFTLE9BQVNBLEtBQVVwZSxFQUFNb2UsRUFBTWYsSUFBSzVlLEVBQU04RyxFQUFPbEUsTUFBWS9GLFVBQzVFMEUsRUFDRXZCLEVBQU00QyxHQUFTa0UsRUFHWDZZLEdBQVMsT0FBU0EsSUFBNkMsUUFBbkNwZSxFQUFNb2UsRUFBTXhlLElBQUtuQixFQUFNNEMsSUFDekRyQixFQUNBdkIsRUFBTTRDLElBSVQwZixXQUNDOU4sVUFDQ3JULElBQUssU0FBVW5CLEdBQ2QsTUFBT0EsR0FBS3VpQixhQUFjLGFBQWdCMUIsRUFBV25nQixLQUFNVixFQUFLNEcsV0FBYzVHLEVBQUt1VSxLQUNsRnZVLEVBQUt3VSxTQUNMLFFBT0xrTSxHQUNDOUIsSUFBSyxTQUFVNWUsRUFBTThHLEVBQU9sRSxHQU8zQixNQU5La0UsTUFBVSxFQUVkeEosRUFBT3dqQixXQUFZOWdCLEVBQU00QyxHQUV6QjVDLEVBQUt3TixhQUFjNUssRUFBTUEsR0FFbkJBLElBR1R0RixFQUFPbUUsS0FBTW5FLEVBQU84VCxLQUFLclIsTUFBTStMLEtBQUsvTSxPQUFPZ0IsTUFBTyxRQUFVLFNBQVVvQyxFQUFHUyxHQUN4RSxHQUFJNGYsR0FBU2xsQixFQUFPOFQsS0FBSzNDLFdBQVk3TCxJQUFVdEYsRUFBTytDLEtBQUtRLElBRTNEdkQsR0FBTzhULEtBQUszQyxXQUFZN0wsR0FBUyxTQUFVNUMsRUFBTTRDLEVBQU1vRyxHQUN0RCxHQUFJcEssR0FBS3RCLEVBQU84VCxLQUFLM0MsV0FBWTdMLEdBQ2hDckIsRUFBTXlILEVBQ0xuTSxXQUdDUyxFQUFPOFQsS0FBSzNDLFdBQVk3TCxHQUFTL0YsWUFDakMybEIsRUFBUXhpQixFQUFNNEMsRUFBTW9HLEdBRXBCcEcsRUFBS2lFLGNBQ0wsSUFLSCxPQUZBdkosR0FBTzhULEtBQUszQyxXQUFZN0wsR0FBU2hFLEVBRTFCMkMsS0FNSGpFLEVBQU9zTCxRQUFRNlQsY0FDcEJuZixFQUFPZ2xCLFVBQVUxTixVQUNoQnpULElBQUssU0FBVW5CLEdBQ2QsR0FBSXNQLEdBQVN0UCxFQUFLZSxVQUlsQixPQUhLdU8sSUFBVUEsRUFBT3ZPLFlBQ3JCdU8sRUFBT3ZPLFdBQVc4VCxjQUVaLFFBS1Z2WCxFQUFPbUUsTUFDTixXQUNBLFdBQ0EsWUFDQSxjQUNBLGNBQ0EsVUFDQSxVQUNBLFNBQ0EsY0FDQSxtQkFDRSxXQUNGbkUsRUFBTzBqQixRQUFTL2dCLEtBQUs0RyxlQUFrQjVHLE9BSXhDM0MsRUFBT21FLE1BQU8sUUFBUyxZQUFjLFdBQ3BDbkUsRUFBT29rQixTQUFVemhCLE9BQ2hCMmUsSUFBSyxTQUFVNWUsRUFBTThHLEdBQ3BCLE1BQUt4SixHQUFPNkYsUUFBUzJELEdBQ1g5RyxFQUFLMlUsUUFBVXJYLEVBQU82SixRQUFTN0osRUFBTzBDLEdBQU1zUixNQUFPeEssSUFBVyxFQUR4RSxZQUtJeEosRUFBT3NMLFFBQVE0VCxVQUNwQmxmLEVBQU9va0IsU0FBVXpoQixNQUFPa0IsSUFBTSxTQUFVbkIsR0FHdkMsTUFBc0MsUUFBL0JBLEVBQUt1TixhQUFhLFNBQW9CLEtBQU92TixFQUFLOEcsU0FJNUQsSUFBSTJiLEdBQVksT0FDZkMsRUFBYywrQkFDZEMsRUFBYyxrQ0FDZEMsRUFBaUIsc0JBRWxCLFNBQVNDLEtBQ1IsT0FBTyxFQUdSLFFBQVNDLEtBQ1IsT0FBTyxFQUdSLFFBQVNDLEtBQ1IsSUFDQyxNQUFPN2xCLEdBQVNtWCxjQUNmLE1BQVEyTyxLQU9YMWxCLEVBQU8ybEIsT0FFTkMsVUFFQTlJLElBQUssU0FBVXBhLEVBQU1takIsRUFBTzNVLEVBQVN6SixFQUFNckcsR0FFMUMsR0FBSTBrQixHQUFhQyxFQUFhemQsRUFDN0IwZCxFQUFRQyxFQUFHQyxFQUNYQyxFQUFTQyxFQUFVeGYsRUFBTXlmLEVBQVlDLEVBQ3JDQyxFQUFXNUYsRUFBVTljLElBQUtuQixFQUczQixJQUFNNmpCLEVBQU4sQ0FLS3JWLEVBQVFBLFVBQ1o0VSxFQUFjNVUsRUFDZEEsRUFBVTRVLEVBQVk1VSxRQUN0QjlQLEVBQVcwa0IsRUFBWTFrQixVQUlsQjhQLEVBQVE5RyxPQUNiOEcsRUFBUTlHLEtBQU9wSyxFQUFPb0ssU0FJaEI0YixFQUFTTyxFQUFTUCxVQUN4QkEsRUFBU08sRUFBU1AsWUFFWkQsRUFBY1EsRUFBU0MsVUFDN0JULEVBQWNRLEVBQVNDLE9BQVMsU0FBVXBmLEdBR3pDLGFBQWNwSCxLQUFXTixHQUF1QjBILEdBQUtwSCxFQUFPMmxCLE1BQU1jLFlBQWNyZixFQUFFUixLQUVqRnJILFVBREFTLEVBQU8ybEIsTUFBTWUsU0FBU2xpQixNQUFPdWhCLEVBQVlyakIsS0FBTStCLFlBSWpEc2hCLEVBQVlyakIsS0FBT0EsR0FJcEJtakIsR0FBVUEsR0FBUyxJQUFLcGpCLE1BQU9mLEtBQXFCLElBQ3BEdWtCLEVBQUlKLEVBQU1oakIsTUFDVixPQUFRb2pCLElBQ1AzZCxFQUFNZ2QsRUFBZXhpQixLQUFNK2lCLEVBQU1JLFFBQ2pDcmYsRUFBTzBmLEVBQVdoZSxFQUFJLEdBQ3RCK2QsR0FBZS9kLEVBQUksSUFBTSxJQUFLK0MsTUFBTyxLQUFNbkcsT0FHckMwQixJQUtOdWYsRUFBVW5tQixFQUFPMmxCLE1BQU1RLFFBQVN2ZixPQUdoQ0EsR0FBU3hGLEVBQVcra0IsRUFBUVEsYUFBZVIsRUFBUVMsV0FBY2hnQixFQUdqRXVmLEVBQVVubUIsRUFBTzJsQixNQUFNUSxRQUFTdmYsT0FHaENzZixFQUFZbG1CLEVBQU9vRixRQUNsQndCLEtBQU1BLEVBQ04wZixTQUFVQSxFQUNWN2UsS0FBTUEsRUFDTnlKLFFBQVNBLEVBQ1Q5RyxLQUFNOEcsRUFBUTlHLEtBQ2RoSixTQUFVQSxFQUNWcU4sYUFBY3JOLEdBQVlwQixFQUFPOFQsS0FBS3JSLE1BQU1nTSxhQUFhckwsS0FBTWhDLEdBQy9EeWxCLFVBQVdSLEVBQVdqVyxLQUFLLE1BQ3pCMFYsSUFHSU0sRUFBV0osRUFBUXBmLE1BQ3pCd2YsRUFBV0osRUFBUXBmLE1BQ25Cd2YsRUFBU1UsY0FBZ0IsRUFHbkJYLEVBQVFZLE9BQVNaLEVBQVFZLE1BQU1uakIsS0FBTWxCLEVBQU0rRSxFQUFNNGUsRUFBWU4sTUFBa0IsR0FDL0VyakIsRUFBSzBJLGtCQUNUMUksRUFBSzBJLGlCQUFrQnhFLEVBQU1tZixHQUFhLElBS3hDSSxFQUFRckosTUFDWnFKLEVBQVFySixJQUFJbFosS0FBTWxCLEVBQU13akIsR0FFbEJBLEVBQVVoVixRQUFROUcsT0FDdkI4YixFQUFVaFYsUUFBUTlHLEtBQU84RyxFQUFROUcsT0FLOUJoSixFQUNKZ2xCLEVBQVNqaEIsT0FBUWloQixFQUFTVSxnQkFBaUIsRUFBR1osR0FFOUNFLEVBQVMzbEIsS0FBTXlsQixHQUloQmxtQixFQUFPMmxCLE1BQU1DLE9BQVFoZixJQUFTLEVBSS9CbEUsR0FBTyxPQUlScUYsT0FBUSxTQUFVckYsRUFBTW1qQixFQUFPM1UsRUFBUzlQLEVBQVU0bEIsR0FFakQsR0FBSWppQixHQUFHa2lCLEVBQVczZSxFQUNqQjBkLEVBQVFDLEVBQUdDLEVBQ1hDLEVBQVNDLEVBQVV4ZixFQUFNeWYsRUFBWUMsRUFDckNDLEVBQVc1RixFQUFVZSxRQUFTaGYsSUFBVWllLEVBQVU5YyxJQUFLbkIsRUFFeEQsSUFBTTZqQixJQUFjUCxFQUFTTyxFQUFTUCxRQUF0QyxDQUtBSCxHQUFVQSxHQUFTLElBQUtwakIsTUFBT2YsS0FBcUIsSUFDcER1a0IsRUFBSUosRUFBTWhqQixNQUNWLE9BQVFvakIsSUFNUCxHQUxBM2QsRUFBTWdkLEVBQWV4aUIsS0FBTStpQixFQUFNSSxRQUNqQ3JmLEVBQU8wZixFQUFXaGUsRUFBSSxHQUN0QitkLEdBQWUvZCxFQUFJLElBQU0sSUFBSytDLE1BQU8sS0FBTW5HLE9BR3JDMEIsRUFBTixDQU9BdWYsRUFBVW5tQixFQUFPMmxCLE1BQU1RLFFBQVN2ZixPQUNoQ0EsR0FBU3hGLEVBQVcra0IsRUFBUVEsYUFBZVIsRUFBUVMsV0FBY2hnQixFQUNqRXdmLEVBQVdKLEVBQVFwZixPQUNuQjBCLEVBQU1BLEVBQUksSUFBVW9GLE9BQVEsVUFBWTJZLEVBQVdqVyxLQUFLLGlCQUFtQixXQUczRTZXLEVBQVlsaUIsRUFBSXFoQixFQUFTdmpCLE1BQ3pCLE9BQVFrQyxJQUNQbWhCLEVBQVlFLEVBQVVyaEIsSUFFZmlpQixHQUFlVixJQUFhSixFQUFVSSxVQUN6Q3BWLEdBQVdBLEVBQVE5RyxPQUFTOGIsRUFBVTliLE1BQ3RDOUIsSUFBT0EsRUFBSWxGLEtBQU04aUIsRUFBVVcsWUFDM0J6bEIsR0FBWUEsSUFBYThrQixFQUFVOWtCLFdBQXlCLE9BQWJBLElBQXFCOGtCLEVBQVU5a0IsWUFDakZnbEIsRUFBU2poQixPQUFRSixFQUFHLEdBRWZtaEIsRUFBVTlrQixVQUNkZ2xCLEVBQVNVLGdCQUVMWCxFQUFRcGUsUUFDWm9lLEVBQVFwZSxPQUFPbkUsS0FBTWxCLEVBQU13akIsR0FPekJlLEtBQWNiLEVBQVN2akIsU0FDckJzakIsRUFBUWUsVUFBWWYsRUFBUWUsU0FBU3RqQixLQUFNbEIsRUFBTTJqQixFQUFZRSxFQUFTQyxXQUFhLEdBQ3hGeG1CLEVBQU9tbkIsWUFBYXprQixFQUFNa0UsRUFBTTJmLEVBQVNDLGNBR25DUixHQUFRcGYsUUF0Q2YsS0FBTUEsSUFBUW9mLEdBQ2JobUIsRUFBTzJsQixNQUFNNWQsT0FBUXJGLEVBQU1rRSxFQUFPaWYsRUFBT0ksR0FBSy9VLEVBQVM5UCxHQUFVLEVBMEMvRHBCLEdBQU9xSCxjQUFlMmUsV0FDbkJPLEdBQVNDLE9BQ2hCN0YsRUFBVTVZLE9BQVFyRixFQUFNLGFBSTFCK0QsUUFBUyxTQUFVa2YsRUFBT2xlLEVBQU0vRSxFQUFNMGtCLEdBRXJDLEdBQUl2aUIsR0FBR3dNLEVBQUsvSSxFQUFLK2UsRUFBWUMsRUFBUWQsRUFBUUwsRUFDNUNvQixHQUFjN2tCLEdBQVE5QyxHQUN0QmdILEVBQU81RixFQUFZNEMsS0FBTStoQixFQUFPLFFBQVdBLEVBQU0vZSxLQUFPK2UsRUFDeERVLEVBQWFybEIsRUFBWTRDLEtBQU0raEIsRUFBTyxhQUFnQkEsRUFBTWtCLFVBQVV4YixNQUFNLE9BSzdFLElBSEFnRyxFQUFNL0ksRUFBTTVGLEVBQU9BLEdBQVE5QyxFQUdKLElBQWxCOEMsRUFBS1EsVUFBb0MsSUFBbEJSLEVBQUtRLFdBSzVCbWlCLEVBQVlqaUIsS0FBTXdELEVBQU81RyxFQUFPMmxCLE1BQU1jLGFBSXRDN2YsRUFBSy9GLFFBQVEsTUFBUSxJQUV6QndsQixFQUFhemYsRUFBS3lFLE1BQU0sS0FDeEJ6RSxFQUFPeWYsRUFBV3pWLFFBQ2xCeVYsRUFBV25oQixRQUVab2lCLEVBQTZCLEVBQXBCMWdCLEVBQUsvRixRQUFRLE1BQVksS0FBTytGLEVBR3pDK2UsRUFBUUEsRUFBTzNsQixFQUFPOEYsU0FDckI2ZixFQUNBLEdBQUkzbEIsR0FBT3duQixNQUFPNWdCLEVBQXVCLGdCQUFWK2UsSUFBc0JBLEdBR3REQSxFQUFNOEIsVUFBWUwsRUFBZSxFQUFJLEVBQ3JDekIsRUFBTWtCLFVBQVlSLEVBQVdqVyxLQUFLLEtBQ2xDdVYsRUFBTStCLGFBQWUvQixFQUFNa0IsVUFDdEJuWixPQUFRLFVBQVkyWSxFQUFXalcsS0FBSyxpQkFBbUIsV0FDM0QsS0FHRHVWLEVBQU1wUSxPQUFTaFcsVUFDVG9tQixFQUFNaGdCLFNBQ1hnZ0IsRUFBTWhnQixPQUFTakQsR0FJaEIrRSxFQUFlLE1BQVJBLEdBQ0prZSxHQUNGM2xCLEVBQU8wRCxVQUFXK0QsR0FBUWtlLElBRzNCUSxFQUFVbm1CLEVBQU8ybEIsTUFBTVEsUUFBU3ZmLE9BQzFCd2dCLElBQWdCakIsRUFBUTFmLFNBQVcwZixFQUFRMWYsUUFBUWpDLE1BQU85QixFQUFNK0UsTUFBVyxHQUFqRixDQU1BLElBQU0yZixJQUFpQmpCLEVBQVF3QixXQUFhM25CLEVBQU84RyxTQUFVcEUsR0FBUyxDQU1yRSxJQUpBMmtCLEVBQWFsQixFQUFRUSxjQUFnQi9mLEVBQy9CeWUsRUFBWWppQixLQUFNaWtCLEVBQWF6Z0IsS0FDcEN5SyxFQUFNQSxFQUFJNU4sWUFFSDROLEVBQUtBLEVBQU1BLEVBQUk1TixXQUN0QjhqQixFQUFVOW1CLEtBQU00USxHQUNoQi9JLEVBQU0rSSxDQUlGL0ksTUFBUzVGLEVBQUtTLGVBQWlCdkQsSUFDbkMybkIsRUFBVTltQixLQUFNNkgsRUFBSTJKLGFBQWUzSixFQUFJc2YsY0FBZ0J0b0IsR0FLekR1RixFQUFJLENBQ0osUUFBU3dNLEVBQU1rVyxFQUFVMWlCLFFBQVU4Z0IsRUFBTWtDLHVCQUV4Q2xDLEVBQU0vZSxLQUFPL0IsRUFBSSxFQUNoQndpQixFQUNBbEIsRUFBUVMsVUFBWWhnQixFQUdyQjRmLEdBQVc3RixFQUFVOWMsSUFBS3dOLEVBQUssZUFBb0JzVSxFQUFNL2UsT0FBVStaLEVBQVU5YyxJQUFLd04sRUFBSyxVQUNsRm1WLEdBQ0pBLEVBQU9oaUIsTUFBTzZNLEVBQUs1SixHQUlwQitlLEVBQVNjLEdBQVVqVyxFQUFLaVcsR0FDbkJkLEdBQVV4bUIsRUFBTzRoQixXQUFZdlEsSUFBU21WLEVBQU9oaUIsT0FBU2dpQixFQUFPaGlCLE1BQU82TSxFQUFLNUosTUFBVyxHQUN4RmtlLEVBQU1tQyxnQkFrQ1IsT0EvQkFuQyxHQUFNL2UsS0FBT0EsRUFHUHdnQixHQUFpQnpCLEVBQU1vQyxzQkFFckI1QixFQUFRNkIsVUFBWTdCLEVBQVE2QixTQUFTeGpCLE1BQU8raUIsRUFBVXRhLE1BQU94RixNQUFXLElBQzlFekgsRUFBTzRoQixXQUFZbGYsSUFJZDRrQixHQUFVdG5CLEVBQU9zRCxXQUFZWixFQUFNa0UsTUFBYTVHLEVBQU84RyxTQUFVcEUsS0FHckU0RixFQUFNNUYsRUFBTTRrQixHQUVQaGYsSUFDSjVGLEVBQU00a0IsR0FBVyxNQUlsQnRuQixFQUFPMmxCLE1BQU1jLFVBQVk3ZixFQUN6QmxFLEVBQU1rRSxLQUNONUcsRUFBTzJsQixNQUFNYyxVQUFZbG5CLFVBRXBCK0ksSUFDSjVGLEVBQU00a0IsR0FBV2hmLElBTWRxZCxFQUFNcFEsU0FHZG1SLFNBQVUsU0FBVWYsR0FHbkJBLEVBQVEzbEIsRUFBTzJsQixNQUFNc0MsSUFBS3RDLEVBRTFCLElBQUk5Z0IsR0FBR0UsRUFBR2QsRUFBS21TLEVBQVM4UCxFQUN2QmdDLEtBQ0E3akIsRUFBTzNELEVBQVdrRCxLQUFNYSxXQUN4QjJoQixHQUFhekYsRUFBVTljLElBQUtsQixLQUFNLGVBQW9CZ2pCLEVBQU0vZSxVQUM1RHVmLEVBQVVubUIsRUFBTzJsQixNQUFNUSxRQUFTUixFQUFNL2UsU0FPdkMsSUFKQXZDLEVBQUssR0FBS3NoQixFQUNWQSxFQUFNd0MsZUFBaUJ4bEIsTUFHbEJ3akIsRUFBUWlDLGFBQWVqQyxFQUFRaUMsWUFBWXhrQixLQUFNakIsS0FBTWdqQixNQUFZLEVBQXhFLENBS0F1QyxFQUFlbG9CLEVBQU8ybEIsTUFBTVMsU0FBU3hpQixLQUFNakIsS0FBTWdqQixFQUFPUyxHQUd4RHZoQixFQUFJLENBQ0osUUFBU3VSLEVBQVU4UixFQUFjcmpCLFFBQVc4Z0IsRUFBTWtDLHVCQUF5QixDQUMxRWxDLEVBQU0wQyxjQUFnQmpTLEVBQVExVCxLQUU5QnFDLEVBQUksQ0FDSixRQUFTbWhCLEVBQVk5UCxFQUFRZ1EsU0FBVXJoQixRQUFXNGdCLEVBQU0yQyxrQ0FJakQzQyxFQUFNK0IsY0FBZ0IvQixFQUFNK0IsYUFBYXRrQixLQUFNOGlCLEVBQVVXLGNBRTlEbEIsRUFBTU8sVUFBWUEsRUFDbEJQLEVBQU1sZSxLQUFPeWUsRUFBVXplLEtBRXZCeEQsSUFBU2pFLEVBQU8ybEIsTUFBTVEsUUFBU0QsRUFBVUksZUFBa0JFLFFBQVVOLEVBQVVoVixTQUM1RTFNLE1BQU80UixFQUFRMVQsS0FBTTJCLEdBRW5CSixJQUFRMUUsWUFDTm9tQixFQUFNcFEsT0FBU3RSLE1BQVMsSUFDN0IwaEIsRUFBTW1DLGlCQUNObkMsRUFBTTRDLG9CQVlYLE1BSktwQyxHQUFRcUMsY0FDWnJDLEVBQVFxQyxhQUFhNWtCLEtBQU1qQixLQUFNZ2pCLEdBRzNCQSxFQUFNcFEsU0FHZDZRLFNBQVUsU0FBVVQsRUFBT1MsR0FDMUIsR0FBSXZoQixHQUFHcUgsRUFBU3VjLEVBQUt2QyxFQUNwQmdDLEtBQ0FwQixFQUFnQlYsRUFBU1UsY0FDekJ6VixFQUFNc1UsRUFBTWhnQixNQUtiLElBQUttaEIsR0FBaUJ6VixFQUFJbk8sWUFBY3lpQixFQUFNak8sUUFBeUIsVUFBZmlPLEVBQU0vZSxNQUU3RCxLQUFReUssSUFBUTFPLEtBQU0wTyxFQUFNQSxFQUFJNU4sWUFBY2QsS0FHN0MsR0FBSzBPLEVBQUkrRixZQUFhLEdBQXVCLFVBQWZ1TyxFQUFNL2UsS0FBbUIsQ0FFdEQsSUFEQXNGLEtBQ01ySCxFQUFJLEVBQU9paUIsRUFBSmppQixFQUFtQkEsSUFDL0JxaEIsRUFBWUUsRUFBVXZoQixHQUd0QjRqQixFQUFNdkMsRUFBVTlrQixTQUFXLElBRXRCOEssRUFBU3VjLEtBQVVscEIsWUFDdkIyTSxFQUFTdWMsR0FBUXZDLEVBQVV6WCxhQUMxQnpPLEVBQVF5b0IsRUFBSzlsQixNQUFPb2EsTUFBTzFMLElBQVMsRUFDcENyUixFQUFPK0MsS0FBTTBsQixFQUFLOWxCLEtBQU0sTUFBUTBPLElBQVF4TyxRQUVyQ3FKLEVBQVN1YyxJQUNidmMsRUFBUXpMLEtBQU15bEIsRUFHWGhhLEdBQVFySixRQUNacWxCLEVBQWF6bkIsTUFBT2lDLEtBQU0yTyxFQUFLK1UsU0FBVWxhLElBVzdDLE1BSnFCa2EsR0FBU3ZqQixPQUF6QmlrQixHQUNKb0IsRUFBYXpuQixNQUFPaUMsS0FBTUMsS0FBTXlqQixTQUFVQSxFQUFTemxCLE1BQU9tbUIsS0FHcERvQixHQUlSUSxNQUFPLHdIQUF3SHJkLE1BQU0sS0FFcklzZCxZQUVBQyxVQUNDRixNQUFPLDRCQUE0QnJkLE1BQU0sS0FDekNxSCxPQUFRLFNBQVVpVCxFQUFPa0QsR0FPeEIsTUFKb0IsT0FBZmxELEVBQU1tRCxRQUNWbkQsRUFBTW1ELE1BQTZCLE1BQXJCRCxFQUFTRSxTQUFtQkYsRUFBU0UsU0FBV0YsRUFBU0csU0FHakVyRCxJQUlUc0QsWUFDQ1AsTUFBTyx1RkFBdUZyZCxNQUFNLEtBQ3BHcUgsT0FBUSxTQUFVaVQsRUFBT2tELEdBQ3hCLEdBQUlLLEdBQVVuWCxFQUFLbU8sRUFDbEJ4SSxFQUFTbVIsRUFBU25SLE1Ba0JuQixPQWZvQixPQUFmaU8sRUFBTXdELE9BQXFDLE1BQXBCTixFQUFTTyxVQUNwQ0YsRUFBV3ZELEVBQU1oZ0IsT0FBT3hDLGVBQWlCdkQsRUFDekNtUyxFQUFNbVgsRUFBU3BwQixnQkFDZm9nQixFQUFPZ0osRUFBU2hKLEtBRWhCeUYsRUFBTXdELE1BQVFOLEVBQVNPLFNBQVlyWCxHQUFPQSxFQUFJc1gsWUFBY25KLEdBQVFBLEVBQUttSixZQUFjLElBQVF0WCxHQUFPQSxFQUFJdVgsWUFBY3BKLEdBQVFBLEVBQUtvSixZQUFjLEdBQ25KM0QsRUFBTTRELE1BQVFWLEVBQVNXLFNBQVl6WCxHQUFPQSxFQUFJMFgsV0FBY3ZKLEdBQVFBLEVBQUt1SixXQUFjLElBQVExWCxHQUFPQSxFQUFJMlgsV0FBY3hKLEdBQVFBLEVBQUt3SixXQUFjLElBSzlJL0QsRUFBTW1ELE9BQVNwUixJQUFXblksWUFDL0JvbUIsRUFBTW1ELE1BQW1CLEVBQVRwUixFQUFhLEVBQWUsRUFBVEEsRUFBYSxFQUFlLEVBQVRBLEVBQWEsRUFBSSxHQUdqRWlPLElBSVRzQyxJQUFLLFNBQVV0QyxHQUNkLEdBQUtBLEVBQU8zbEIsRUFBTzhGLFNBQ2xCLE1BQU82ZixFQUlSLElBQUk5Z0IsR0FBRzBjLEVBQU0vYixFQUNab0IsRUFBTytlLEVBQU0vZSxLQUNiK2lCLEVBQWdCaEUsRUFDaEJpRSxFQUFVam5CLEtBQUtnbUIsU0FBVS9oQixFQUVwQmdqQixLQUNMam5CLEtBQUtnbUIsU0FBVS9oQixHQUFTZ2pCLEVBQ3ZCeEUsRUFBWWhpQixLQUFNd0QsR0FBU2pFLEtBQUtzbUIsV0FDaEM5RCxFQUFVL2hCLEtBQU13RCxHQUFTakUsS0FBS2ltQixhQUdoQ3BqQixFQUFPb2tCLEVBQVFsQixNQUFRL2xCLEtBQUsrbEIsTUFBTW5vQixPQUFRcXBCLEVBQVFsQixPQUFVL2xCLEtBQUsrbEIsTUFFakUvQyxFQUFRLEdBQUkzbEIsR0FBT3duQixNQUFPbUMsR0FFMUI5a0IsRUFBSVcsRUFBSzNDLE1BQ1QsT0FBUWdDLElBQ1AwYyxFQUFPL2IsRUFBTVgsR0FDYjhnQixFQUFPcEUsR0FBU29JLEVBQWVwSSxFQWVoQyxPQVZNb0UsR0FBTWhnQixTQUNYZ2dCLEVBQU1oZ0IsT0FBUy9GLEdBS2UsSUFBMUIrbEIsRUFBTWhnQixPQUFPekMsV0FDakJ5aUIsRUFBTWhnQixPQUFTZ2dCLEVBQU1oZ0IsT0FBT2xDLFlBR3RCbW1CLEVBQVFsWCxPQUFRa1gsRUFBUWxYLE9BQVFpVCxFQUFPZ0UsR0FBa0JoRSxHQUdqRVEsU0FDQzBELE1BRUNsQyxVQUFVLEdBRVg3USxPQUVDclEsUUFBUyxXQUNSLE1BQUs5RCxRQUFTOGlCLEtBQXVCOWlCLEtBQUttVSxPQUN6Q25VLEtBQUttVSxTQUNFLEdBRlIsV0FLRDZQLGFBQWMsV0FFZm1ELE1BQ0NyakIsUUFBUyxXQUNSLE1BQUs5RCxRQUFTOGlCLEtBQXVCOWlCLEtBQUttbkIsTUFDekNubkIsS0FBS21uQixRQUNFLEdBRlIsV0FLRG5ELGFBQWMsWUFFZm9ELE9BRUN0akIsUUFBUyxXQUNSLE1BQW1CLGFBQWQ5RCxLQUFLaUUsTUFBdUJqRSxLQUFLb25CLE9BQVMvcEIsRUFBT3NKLFNBQVUzRyxLQUFNLFVBQ3JFQSxLQUFLb25CLFNBQ0UsR0FGUixXQU9EL0IsU0FBVSxTQUFVckMsR0FDbkIsTUFBTzNsQixHQUFPc0osU0FBVXFjLEVBQU1oZ0IsT0FBUSxPQUl4Q3FrQixjQUNDeEIsYUFBYyxTQUFVN0MsR0FJbEJBLEVBQU1wUSxTQUFXaFcsWUFDckJvbUIsRUFBTWdFLGNBQWNNLFlBQWN0RSxFQUFNcFEsV0FNNUMyVSxTQUFVLFNBQVV0akIsRUFBTWxFLEVBQU1pakIsRUFBT3dFLEdBSXRDLEdBQUkvaUIsR0FBSXBILEVBQU9vRixPQUNkLEdBQUlwRixHQUFPd25CLE1BQ1g3QixHQUVDL2UsS0FBTUEsRUFDTndqQixhQUFhLEVBQ2JULGtCQUdHUSxHQUNKbnFCLEVBQU8ybEIsTUFBTWxmLFFBQVNXLEVBQUcsS0FBTTFFLEdBRS9CMUMsRUFBTzJsQixNQUFNZSxTQUFTOWlCLEtBQU1sQixFQUFNMEUsR0FFOUJBLEVBQUUyZ0Isc0JBQ05wQyxFQUFNbUMsbUJBS1Q5bkIsRUFBT21uQixZQUFjLFNBQVV6a0IsRUFBTWtFLEVBQU00ZixHQUNyQzlqQixFQUFLTixxQkFDVE0sRUFBS04sb0JBQXFCd0UsRUFBTTRmLEdBQVEsSUFJMUN4bUIsRUFBT3duQixNQUFRLFNBQVVqaUIsRUFBS21qQixHQUU3QixNQUFPL2xCLGdCQUFnQjNDLEdBQU93bkIsT0FLekJqaUIsR0FBT0EsRUFBSXFCLE1BQ2ZqRSxLQUFLZ25CLGNBQWdCcGtCLEVBQ3JCNUMsS0FBS2lFLEtBQU9yQixFQUFJcUIsS0FJaEJqRSxLQUFLb2xCLG1CQUF1QnhpQixFQUFJOGtCLGtCQUMvQjlrQixFQUFJK2tCLG1CQUFxQi9rQixFQUFJK2tCLG9CQUF3Qi9FLEVBQWFDLEdBSW5FN2lCLEtBQUtpRSxLQUFPckIsRUFJUm1qQixHQUNKMW9CLEVBQU9vRixPQUFRekMsS0FBTStsQixHQUl0Qi9sQixLQUFLNG5CLFVBQVlobEIsR0FBT0EsRUFBSWdsQixXQUFhdnFCLEVBQU80SyxNQUdoRGpJLEtBQU0zQyxFQUFPOEYsVUFBWSxFQXZCekIsV0FKUSxHQUFJOUYsR0FBT3duQixNQUFPamlCLEVBQUttakIsSUFnQ2hDMW9CLEVBQU93bkIsTUFBTWxsQixXQUNaeWxCLG1CQUFvQnZDLEVBQ3BCcUMscUJBQXNCckMsRUFDdEI4Qyw4QkFBK0I5QyxFQUUvQnNDLGVBQWdCLFdBQ2YsR0FBSTFnQixHQUFJekUsS0FBS2duQixhQUViaG5CLE1BQUtvbEIsbUJBQXFCeEMsRUFFckJuZSxHQUFLQSxFQUFFMGdCLGdCQUNYMWdCLEVBQUUwZ0Isa0JBR0pTLGdCQUFpQixXQUNoQixHQUFJbmhCLEdBQUl6RSxLQUFLZ25CLGFBRWJobkIsTUFBS2tsQixxQkFBdUJ0QyxFQUV2Qm5lLEdBQUtBLEVBQUVtaEIsaUJBQ1huaEIsRUFBRW1oQixtQkFHSmlDLHlCQUEwQixXQUN6QjduQixLQUFLMmxCLDhCQUFnQy9DLEVBQ3JDNWlCLEtBQUs0bEIsb0JBTVB2b0IsRUFBT21FLE1BQ05zbUIsV0FBWSxZQUNaQyxXQUFZLFlBQ1YsU0FBVUMsRUFBTTFDLEdBQ2xCam9CLEVBQU8ybEIsTUFBTVEsUUFBU3dFLElBQ3JCaEUsYUFBY3NCLEVBQ2RyQixTQUFVcUIsRUFFVnpCLE9BQVEsU0FBVWIsR0FDakIsR0FBSTFoQixHQUNIMEIsRUFBU2hELEtBQ1Rpb0IsRUFBVWpGLEVBQU1rRixjQUNoQjNFLEVBQVlQLEVBQU1PLFNBU25CLFNBTE0wRSxHQUFZQSxJQUFZamxCLElBQVczRixFQUFPbU0sU0FBVXhHLEVBQVFpbEIsTUFDakVqRixFQUFNL2UsS0FBT3NmLEVBQVVJLFNBQ3ZCcmlCLEVBQU1paUIsRUFBVWhWLFFBQVExTSxNQUFPN0IsS0FBTThCLFdBQ3JDa2hCLEVBQU0vZSxLQUFPcWhCLEdBRVBoa0IsTUFPSmpFLEVBQU9zTCxRQUFRc1UsZ0JBQ3BCNWYsRUFBT21FLE1BQU8yUyxNQUFPLFVBQVdnVCxLQUFNLFlBQWMsU0FBVWEsRUFBTTFDLEdBR25FLEdBQUk2QyxHQUFXLEVBQ2Q1WixFQUFVLFNBQVV5VSxHQUNuQjNsQixFQUFPMmxCLE1BQU11RSxTQUFVakMsRUFBS3RDLEVBQU1oZ0IsT0FBUTNGLEVBQU8ybEIsTUFBTXNDLElBQUt0QyxJQUFTLEdBR3ZFM2xCLEdBQU8ybEIsTUFBTVEsUUFBUzhCLElBQ3JCbEIsTUFBTyxXQUNjLElBQWYrRCxLQUNKbHJCLEVBQVN3TCxpQkFBa0J1ZixFQUFNelosR0FBUyxJQUc1Q2dXLFNBQVUsV0FDVyxNQUFiNEQsR0FDTmxyQixFQUFTd0Msb0JBQXFCdW9CLEVBQU16WixHQUFTLE9BT2xEbFIsRUFBT3NCLEdBQUc4RCxRQUVUMmxCLEdBQUksU0FBVWxGLEVBQU96a0IsRUFBVXFHLEVBQU1uRyxFQUFpQmdqQixHQUNyRCxHQUFJMEcsR0FBUXBrQixDQUdaLElBQXNCLGdCQUFWaWYsR0FBcUIsQ0FFUCxnQkFBYnprQixLQUVYcUcsRUFBT0EsR0FBUXJHLEVBQ2ZBLEVBQVc3QixVQUVaLEtBQU1xSCxJQUFRaWYsR0FDYmxqQixLQUFLb29CLEdBQUlua0IsRUFBTXhGLEVBQVVxRyxFQUFNb2UsRUFBT2pmLEdBQVEwZCxFQUUvQyxPQUFPM2hCLE1BbUJSLEdBaEJhLE1BQVI4RSxHQUFzQixNQUFObkcsR0FFcEJBLEVBQUtGLEVBQ0xxRyxFQUFPckcsRUFBVzdCLFdBQ0QsTUFBTitCLElBQ2MsZ0JBQWJGLElBRVhFLEVBQUttRyxFQUNMQSxFQUFPbEksWUFHUCtCLEVBQUttRyxFQUNMQSxFQUFPckcsRUFDUEEsRUFBVzdCLFlBR1IrQixLQUFPLEVBQ1hBLEVBQUtra0IsTUFDQyxLQUFNbGtCLEVBQ1osTUFBT3FCLEtBYVIsT0FWYSxLQUFSMmhCLElBQ0owRyxFQUFTMXBCLEVBQ1RBLEVBQUssU0FBVXFrQixHQUdkLE1BREEzbEIsS0FBUzBHLElBQUtpZixHQUNQcUYsRUFBT3htQixNQUFPN0IsS0FBTThCLFlBRzVCbkQsRUFBRzhJLEtBQU80Z0IsRUFBTzVnQixPQUFVNGdCLEVBQU81Z0IsS0FBT3BLLEVBQU9vSyxTQUUxQ3pILEtBQUt3QixLQUFNLFdBQ2pCbkUsRUFBTzJsQixNQUFNN0ksSUFBS25hLEtBQU1rakIsRUFBT3ZrQixFQUFJbUcsRUFBTXJHLE1BRzNDa2pCLElBQUssU0FBVXVCLEVBQU96a0IsRUFBVXFHLEVBQU1uRyxHQUNyQyxNQUFPcUIsTUFBS29vQixHQUFJbEYsRUFBT3prQixFQUFVcUcsRUFBTW5HLEVBQUksSUFFNUNvRixJQUFLLFNBQVVtZixFQUFPemtCLEVBQVVFLEdBQy9CLEdBQUk0a0IsR0FBV3RmLENBQ2YsSUFBS2lmLEdBQVNBLEVBQU1pQyxnQkFBa0JqQyxFQUFNSyxVQVEzQyxNQU5BQSxHQUFZTCxFQUFNSyxVQUNsQmxtQixFQUFRNmxCLEVBQU1zQyxnQkFBaUJ6aEIsSUFDOUJ3ZixFQUFVVyxVQUFZWCxFQUFVSSxTQUFXLElBQU1KLEVBQVVXLFVBQVlYLEVBQVVJLFNBQ2pGSixFQUFVOWtCLFNBQ1Y4a0IsRUFBVWhWLFNBRUp2TyxJQUVSLElBQXNCLGdCQUFWa2pCLEdBQXFCLENBRWhDLElBQU1qZixJQUFRaWYsR0FDYmxqQixLQUFLK0QsSUFBS0UsRUFBTXhGLEVBQVV5a0IsRUFBT2pmLEdBRWxDLE9BQU9qRSxNQVVSLE9BUkt2QixLQUFhLEdBQTZCLGtCQUFiQSxNQUVqQ0UsRUFBS0YsRUFDTEEsRUFBVzdCLFdBRVArQixLQUFPLElBQ1hBLEVBQUtra0IsR0FFQzdpQixLQUFLd0IsS0FBSyxXQUNoQm5FLEVBQU8ybEIsTUFBTTVkLE9BQVFwRixLQUFNa2pCLEVBQU92a0IsRUFBSUYsTUFJeENxRixRQUFTLFNBQVVHLEVBQU1hLEdBQ3hCLE1BQU85RSxNQUFLd0IsS0FBSyxXQUNoQm5FLEVBQU8ybEIsTUFBTWxmLFFBQVNHLEVBQU1hLEVBQU05RSxTQUdwQ3NvQixlQUFnQixTQUFVcmtCLEVBQU1hLEdBQy9CLEdBQUkvRSxHQUFPQyxLQUFLLEVBQ2hCLE9BQUtELEdBQ0cxQyxFQUFPMmxCLE1BQU1sZixRQUFTRyxFQUFNYSxFQUFNL0UsR0FBTSxHQURoRCxZQUtGLElBQUl3b0IsR0FBVyxpQkFDZEMsRUFBZSxpQ0FDZkMsRUFBZ0JwckIsRUFBTzhULEtBQUtyUixNQUFNZ00sYUFFbEM0YyxHQUNDQyxVQUFVLEVBQ1ZDLFVBQVUsRUFDVmhKLE1BQU0sRUFDTmlKLE1BQU0sRUFHUnhyQixHQUFPc0IsR0FBRzhELFFBQ1RyQyxLQUFNLFNBQVUzQixHQUNmLEdBQUl5RCxHQUNIWixLQUNBMlksRUFBT2phLEtBQ1BtQyxFQUFNOFgsRUFBSy9aLE1BRVosSUFBeUIsZ0JBQWJ6QixHQUNYLE1BQU91QixNQUFLb0IsVUFBVy9ELEVBQVFvQixHQUFXc1IsT0FBTyxXQUNoRCxJQUFNN04sRUFBSSxFQUFPQyxFQUFKRCxFQUFTQSxJQUNyQixHQUFLN0UsRUFBT21NLFNBQVV5USxFQUFNL1gsR0FBS2xDLE1BQ2hDLE9BQU8sSUFNWCxLQUFNa0MsRUFBSSxFQUFPQyxFQUFKRCxFQUFTQSxJQUNyQjdFLEVBQU8rQyxLQUFNM0IsRUFBVXdiLEVBQU0vWCxHQUFLWixFQU1uQyxPQUZBQSxHQUFNdEIsS0FBS29CLFVBQVdlLEVBQU0sRUFBSTlFLEVBQU8wYixPQUFRelgsR0FBUUEsR0FDdkRBLEVBQUk3QyxTQUFXdUIsS0FBS3ZCLFNBQVd1QixLQUFLdkIsU0FBVyxJQUFNQSxFQUFXQSxFQUN6RDZDLEdBR1J1UyxJQUFLLFNBQVU3USxHQUNkLEdBQUk4bEIsR0FBVXpyQixFQUFRMkYsRUFBUWhELE1BQzdCb0gsRUFBSTBoQixFQUFRNW9CLE1BRWIsT0FBT0YsTUFBSytQLE9BQU8sV0FDbEIsR0FBSTdOLEdBQUksQ0FDUixNQUFZa0YsRUFBSmxGLEVBQU9BLElBQ2QsR0FBSzdFLEVBQU9tTSxTQUFVeEosS0FBTThvQixFQUFRNW1CLElBQ25DLE9BQU8sS0FNWHdSLElBQUssU0FBVWpWLEdBQ2QsTUFBT3VCLE1BQUtvQixVQUFXMm5CLEdBQU8vb0IsS0FBTXZCLE9BQWdCLEtBR3JEc1IsT0FBUSxTQUFVdFIsR0FDakIsTUFBT3VCLE1BQUtvQixVQUFXMm5CLEdBQU8vb0IsS0FBTXZCLE9BQWdCLEtBR3JEdXFCLEdBQUksU0FBVXZxQixHQUNiLFFBQVNzcUIsR0FDUi9vQixLQUlvQixnQkFBYnZCLElBQXlCZ3FCLEVBQWNob0IsS0FBTWhDLEdBQ25EcEIsRUFBUW9CLEdBQ1JBLE9BQ0QsR0FDQ3lCLFFBR0grb0IsUUFBUyxTQUFVcFgsRUFBV25ULEdBQzdCLEdBQUlnUSxHQUNIeE0sRUFBSSxFQUNKa0YsRUFBSXBILEtBQUtFLE9BQ1R1VCxLQUNBeVYsRUFBUVQsRUFBY2hvQixLQUFNb1IsSUFBb0MsZ0JBQWRBLEdBQ2pEeFUsRUFBUXdVLEVBQVduVCxHQUFXc0IsS0FBS3RCLFNBQ25DLENBRUYsTUFBWTBJLEVBQUpsRixFQUFPQSxJQUNkLElBQU13TSxFQUFNMU8sS0FBS2tDLEdBQUl3TSxHQUFPQSxJQUFRaFEsRUFBU2dRLEVBQU1BLEVBQUk1TixXQUV0RCxHQUFvQixHQUFmNE4sRUFBSW5PLFdBQWtCMm9CLEVBQzFCQSxFQUFJOU8sTUFBTTFMLEdBQU8sR0FHQSxJQUFqQkEsRUFBSW5PLFVBQ0hsRCxFQUFPK0MsS0FBS2dRLGdCQUFnQjFCLEVBQUttRCxJQUFjLENBRWhEbkQsRUFBTStFLEVBQVEzVixLQUFNNFEsRUFDcEIsT0FLSCxNQUFPMU8sTUFBS29CLFVBQVdxUyxFQUFRdlQsT0FBUyxFQUFJN0MsRUFBTzBiLE9BQVF0RixHQUFZQSxJQUt4RTJHLE1BQU8sU0FBVXJhLEdBR2hCLE1BQU1BLEdBS2UsZ0JBQVRBLEdBQ0o5QixFQUFhZ0QsS0FBTTVELEVBQVEwQyxHQUFRQyxLQUFNLElBSTFDL0IsRUFBYWdELEtBQU1qQixLQUd6QkQsRUFBS0gsT0FBU0csRUFBTSxHQUFNQSxHQVpqQkMsS0FBTSxJQUFPQSxLQUFNLEdBQUljLFdBQWVkLEtBQUsrQixRQUFRb25CLFVBQVVqcEIsT0FBUyxJQWdCakZpYSxJQUFLLFNBQVUxYixFQUFVQyxHQUN4QixHQUFJaWdCLEdBQTBCLGdCQUFibGdCLEdBQ2ZwQixFQUFRb0IsRUFBVUMsR0FDbEJyQixFQUFPMEQsVUFBV3RDLEdBQVlBLEVBQVM4QixVQUFhOUIsR0FBYUEsR0FDbEVZLEVBQU1oQyxFQUFPZ0QsTUFBT0wsS0FBS2tCLE1BQU95ZCxFQUVqQyxPQUFPM2UsTUFBS29CLFVBQVcvRCxFQUFPMGIsT0FBTzFaLEtBR3RDK3BCLFFBQVMsU0FBVTNxQixHQUNsQixNQUFPdUIsTUFBS21hLElBQWlCLE1BQVoxYixFQUNoQnVCLEtBQUt1QixXQUFhdkIsS0FBS3VCLFdBQVd3TyxPQUFPdFIsTUFLNUMsU0FBUzRxQixHQUFTM2EsRUFBS3VELEdBQ3RCLE9BQVN2RCxFQUFNQSxFQUFJdUQsS0FBMEIsSUFBakJ2RCxFQUFJbk8sVUFFaEMsTUFBT21PLEdBR1JyUixFQUFPbUUsTUFDTjZOLE9BQVEsU0FBVXRQLEdBQ2pCLEdBQUlzUCxHQUFTdFAsRUFBS2UsVUFDbEIsT0FBT3VPLElBQThCLEtBQXBCQSxFQUFPOU8sU0FBa0I4TyxFQUFTLE1BRXBEaWEsUUFBUyxTQUFVdnBCLEdBQ2xCLE1BQU8xQyxHQUFPNFUsSUFBS2xTLEVBQU0sZUFFMUJ3cEIsYUFBYyxTQUFVeHBCLEVBQU1tQyxFQUFHc25CLEdBQ2hDLE1BQU9uc0IsR0FBTzRVLElBQUtsUyxFQUFNLGFBQWN5cEIsSUFFeEM1SixLQUFNLFNBQVU3ZixHQUNmLE1BQU9zcEIsR0FBU3RwQixFQUFNLGdCQUV2QjhvQixLQUFNLFNBQVU5b0IsR0FDZixNQUFPc3BCLEdBQVN0cEIsRUFBTSxvQkFFdkIwcEIsUUFBUyxTQUFVMXBCLEdBQ2xCLE1BQU8xQyxHQUFPNFUsSUFBS2xTLEVBQU0sZ0JBRTFCb3BCLFFBQVMsU0FBVXBwQixHQUNsQixNQUFPMUMsR0FBTzRVLElBQUtsUyxFQUFNLG9CQUUxQjJwQixVQUFXLFNBQVUzcEIsRUFBTW1DLEVBQUdzbkIsR0FDN0IsTUFBT25zQixHQUFPNFUsSUFBS2xTLEVBQU0sY0FBZXlwQixJQUV6Q0csVUFBVyxTQUFVNXBCLEVBQU1tQyxFQUFHc25CLEdBQzdCLE1BQU9uc0IsR0FBTzRVLElBQUtsUyxFQUFNLGtCQUFtQnlwQixJQUU3Q0ksU0FBVSxTQUFVN3BCLEdBQ25CLE1BQU8xQyxHQUFPZ3NCLFNBQVd0cEIsRUFBS2UsZ0JBQW1COE8sV0FBWTdQLElBRTlENG9CLFNBQVUsU0FBVTVvQixHQUNuQixNQUFPMUMsR0FBT2dzQixRQUFTdHBCLEVBQUs2UCxhQUU3QmdaLFNBQVUsU0FBVTdvQixHQUNuQixNQUFPQSxHQUFLOHBCLGlCQUFtQnhzQixFQUFPZ0QsU0FBV04sRUFBS3NGLGNBRXJELFNBQVUxQyxFQUFNaEUsR0FDbEJ0QixFQUFPc0IsR0FBSWdFLEdBQVMsU0FBVTZtQixFQUFPL3FCLEdBQ3BDLEdBQUlnVixHQUFVcFcsRUFBT2dGLElBQUtyQyxLQUFNckIsRUFBSTZxQixFQXNCcEMsT0FwQjBCLFVBQXJCN21CLEVBQUszRSxNQUFPLE1BQ2hCUyxFQUFXK3FCLEdBR1AvcUIsR0FBZ0MsZ0JBQWJBLEtBQ3ZCZ1YsRUFBVXBXLEVBQU8wUyxPQUFRdFIsRUFBVWdWLElBRy9CelQsS0FBS0UsT0FBUyxJQUVad29CLEVBQWtCL2xCLElBQ3ZCdEYsRUFBTzBiLE9BQVF0RixHQUlYK1UsRUFBYS9uQixLQUFNa0MsSUFDdkI4USxFQUFRcVcsV0FJSDlwQixLQUFLb0IsVUFBV3FTLE1BSXpCcFcsRUFBT29GLFFBQ05zTixPQUFRLFNBQVVvQixFQUFNOVAsRUFBT3FTLEdBQzlCLEdBQUkzVCxHQUFPc0IsRUFBTyxFQU1sQixPQUpLcVMsS0FDSnZDLEVBQU8sUUFBVUEsRUFBTyxLQUdELElBQWpCOVAsRUFBTW5CLFFBQWtDLElBQWxCSCxFQUFLUSxTQUNqQ2xELEVBQU8rQyxLQUFLZ1EsZ0JBQWlCclEsRUFBTW9SLElBQVdwUixNQUM5QzFDLEVBQU8rQyxLQUFLbUosUUFBUzRILEVBQU05VCxFQUFPZ0ssS0FBTWhHLEVBQU8sU0FBVXRCLEdBQ3hELE1BQXlCLEtBQWxCQSxFQUFLUSxhQUlmMFIsSUFBSyxTQUFVbFMsRUFBTWtTLEVBQUt1WCxHQUN6QixHQUFJL1YsTUFDSHNXLEVBQVdQLElBQVU1c0IsU0FFdEIsUUFBU21ELEVBQU9BLEVBQU1rUyxLQUE0QixJQUFsQmxTLEVBQUtRLFNBQ3BDLEdBQXVCLElBQWxCUixFQUFLUSxTQUFpQixDQUMxQixHQUFLd3BCLEdBQVkxc0IsRUFBUTBDLEdBQU9pcEIsR0FBSVEsR0FDbkMsS0FFRC9WLEdBQVEzVixLQUFNaUMsR0FHaEIsTUFBTzBULElBR1I0VixRQUFTLFNBQVVXLEVBQUdqcUIsR0FDckIsR0FBSTBULEtBRUosTUFBUXVXLEVBQUdBLEVBQUlBLEVBQUVuYixZQUNJLElBQWZtYixFQUFFenBCLFVBQWtCeXBCLElBQU1qcUIsR0FDOUIwVCxFQUFRM1YsS0FBTWtzQixFQUloQixPQUFPdlcsS0FLVCxTQUFTc1YsSUFBUTNYLEVBQVU2WSxFQUFXdlcsR0FDckMsR0FBS3JXLEVBQU9zRCxXQUFZc3BCLEdBQ3ZCLE1BQU81c0IsR0FBT2dLLEtBQU0rSixFQUFVLFNBQVVyUixFQUFNbUMsR0FFN0MsUUFBUytuQixFQUFVaHBCLEtBQU1sQixFQUFNbUMsRUFBR25DLEtBQVcyVCxHQUsvQyxJQUFLdVcsRUFBVTFwQixTQUNkLE1BQU9sRCxHQUFPZ0ssS0FBTStKLEVBQVUsU0FBVXJSLEdBQ3ZDLE1BQVNBLEtBQVNrcUIsSUFBZ0J2VyxHQUtwQyxJQUEwQixnQkFBZHVXLEdBQXlCLENBQ3BDLEdBQUsxQixFQUFTOW5CLEtBQU13cEIsR0FDbkIsTUFBTzVzQixHQUFPMFMsT0FBUWthLEVBQVc3WSxFQUFVc0MsRUFHNUN1VyxHQUFZNXNCLEVBQU8wUyxPQUFRa2EsRUFBVzdZLEdBR3ZDLE1BQU8vVCxHQUFPZ0ssS0FBTStKLEVBQVUsU0FBVXJSLEdBQ3ZDLE1BQVM5QixHQUFhZ0QsS0FBTWdwQixFQUFXbHFCLElBQVUsSUFBUTJULElBRzNELEdBQUl3VyxJQUFZLDBFQUNmQyxHQUFXLFlBQ1hDLEdBQVEsWUFDUkMsR0FBZSwwQkFDZkMsR0FBOEIsd0JBRTlCQyxHQUFXLG9DQUNYQyxHQUFjLDRCQUNkQyxHQUFvQixjQUNwQkMsR0FBZSwyQ0FHZkMsSUFHQ2pKLFFBQVUsRUFBRywrQkFBZ0MsYUFFN0NrSixPQUFTLEVBQUcsVUFBVyxZQUN2QkMsS0FBTyxFQUFHLG9CQUFxQix1QkFDL0JDLElBQU0sRUFBRyxpQkFBa0Isb0JBQzNCQyxJQUFNLEVBQUcscUJBQXNCLHlCQUUvQjFGLFVBQVksRUFBRyxHQUFJLElBSXJCc0YsSUFBUUssU0FBV0wsR0FBUWpKLE9BRTNCaUosR0FBUU0sTUFBUU4sR0FBUU8sTUFBUVAsR0FBUVEsU0FBV1IsR0FBUVMsUUFBVVQsR0FBUUMsTUFDN0VELEdBQVFVLEdBQUtWLEdBQVFJLEdBRXJCMXRCLEVBQU9zQixHQUFHOEQsUUFDVDRELEtBQU0sU0FBVVEsR0FDZixNQUFPeEosR0FBT3NLLE9BQVEzSCxLQUFNLFNBQVU2RyxHQUNyQyxNQUFPQSxLQUFVakssVUFDaEJTLEVBQU9nSixLQUFNckcsTUFDYkEsS0FBSzZVLFFBQVF5VyxRQUFVdHJCLEtBQU0sSUFBT0EsS0FBTSxHQUFJUSxlQUFpQnZELEdBQVdzdUIsZUFBZ0Ixa0IsS0FDekYsS0FBTUEsRUFBTy9FLFVBQVU1QixTQUczQm9yQixPQUFRLFdBQ1AsTUFBT3RyQixNQUFLd3JCLFNBQVUxcEIsVUFBVyxTQUFVL0IsR0FDMUMsR0FBdUIsSUFBbEJDLEtBQUtPLFVBQW9DLEtBQWxCUCxLQUFLTyxVQUFxQyxJQUFsQlAsS0FBS08sU0FBaUIsQ0FDekUsR0FBSXlDLEdBQVN5b0IsR0FBb0J6ckIsS0FBTUQsRUFDdkNpRCxHQUFPdUQsWUFBYXhHLE9BS3ZCMnJCLFFBQVMsV0FDUixNQUFPMXJCLE1BQUt3ckIsU0FBVTFwQixVQUFXLFNBQVUvQixHQUMxQyxHQUF1QixJQUFsQkMsS0FBS08sVUFBb0MsS0FBbEJQLEtBQUtPLFVBQXFDLElBQWxCUCxLQUFLTyxTQUFpQixDQUN6RSxHQUFJeUMsR0FBU3lvQixHQUFvQnpyQixLQUFNRCxFQUN2Q2lELEdBQU8yb0IsYUFBYzVyQixFQUFNaUQsRUFBTzRNLGdCQUtyQ2djLE9BQVEsV0FDUCxNQUFPNXJCLE1BQUt3ckIsU0FBVTFwQixVQUFXLFNBQVUvQixHQUNyQ0MsS0FBS2MsWUFDVGQsS0FBS2MsV0FBVzZxQixhQUFjNXJCLEVBQU1DLFNBS3ZDNnJCLE1BQU8sV0FDTixNQUFPN3JCLE1BQUt3ckIsU0FBVTFwQixVQUFXLFNBQVUvQixHQUNyQ0MsS0FBS2MsWUFDVGQsS0FBS2MsV0FBVzZxQixhQUFjNXJCLEVBQU1DLEtBQUs2TyxnQkFNNUN6SixPQUFRLFNBQVUzRyxFQUFVcXRCLEdBQzNCLEdBQUkvckIsR0FDSHNCLEVBQVE1QyxFQUFXcEIsRUFBTzBTLE9BQVF0UixFQUFVdUIsTUFBU0EsS0FDckRrQyxFQUFJLENBRUwsTUFBNkIsT0FBcEJuQyxFQUFPc0IsRUFBTWEsSUFBYUEsSUFDNUI0cEIsR0FBOEIsSUFBbEIvckIsRUFBS1EsVUFDdEJsRCxFQUFPMHVCLFVBQVdDLEdBQVFqc0IsSUFHdEJBLEVBQUtlLGFBQ0pnckIsR0FBWXp1QixFQUFPbU0sU0FBVXpKLEVBQUtTLGNBQWVULElBQ3JEa3NCLEdBQWVELEdBQVFqc0IsRUFBTSxXQUU5QkEsRUFBS2UsV0FBVzBGLFlBQWF6RyxHQUkvQixPQUFPQyxPQUdSNlUsTUFBTyxXQUNOLEdBQUk5VSxHQUNIbUMsRUFBSSxDQUVMLE1BQTRCLE9BQW5CbkMsRUFBT0MsS0FBS2tDLElBQWFBLElBQ1YsSUFBbEJuQyxFQUFLUSxXQUdUbEQsRUFBTzB1QixVQUFXQyxHQUFRanNCLEdBQU0sSUFHaENBLEVBQUs0UixZQUFjLEdBSXJCLE9BQU8zUixPQUdSK0MsTUFBTyxTQUFVbXBCLEVBQWVDLEdBSS9CLE1BSEFELEdBQWlDLE1BQWpCQSxHQUF3QixFQUFRQSxFQUNoREMsRUFBeUMsTUFBckJBLEVBQTRCRCxFQUFnQkMsRUFFekRuc0IsS0FBS3FDLElBQUssV0FDaEIsTUFBT2hGLEdBQU8wRixNQUFPL0MsS0FBTWtzQixFQUFlQyxNQUk1Q0MsS0FBTSxTQUFVdmxCLEdBQ2YsTUFBT3hKLEdBQU9zSyxPQUFRM0gsS0FBTSxTQUFVNkcsR0FDckMsR0FBSTlHLEdBQU9DLEtBQU0sT0FDaEJrQyxFQUFJLEVBQ0prRixFQUFJcEgsS0FBS0UsTUFFVixJQUFLMkcsSUFBVWpLLFdBQStCLElBQWxCbUQsRUFBS1EsU0FDaEMsTUFBT1IsR0FBSzRQLFNBSWIsSUFBc0IsZ0JBQVY5SSxLQUF1QndqQixHQUFhNXBCLEtBQU1vRyxLQUNwRDhqQixJQUFXUixHQUFTaHFCLEtBQU0wRyxLQUFhLEdBQUksS0FBUSxHQUFJRCxlQUFrQixDQUUxRUMsRUFBUUEsRUFBTXZELFFBQVM0bUIsR0FBVyxZQUVsQyxLQUNDLEtBQVk5aUIsRUFBSmxGLEVBQU9BLElBQ2RuQyxFQUFPQyxLQUFNa0MsT0FHVSxJQUFsQm5DLEVBQUtRLFdBQ1RsRCxFQUFPMHVCLFVBQVdDLEdBQVFqc0IsR0FBTSxJQUNoQ0EsRUFBSzRQLFVBQVk5SSxFQUluQjlHLEdBQU8sRUFHTixNQUFPMEUsS0FHTDFFLEdBQ0pDLEtBQUs2VSxRQUFReVcsT0FBUXprQixJQUVwQixLQUFNQSxFQUFPL0UsVUFBVTVCLFNBRzNCbXNCLFlBQWEsV0FDWixHQUVDM3FCLEdBQU9yRSxFQUFPZ0YsSUFBS3JDLEtBQU0sU0FBVUQsR0FDbEMsT0FBU0EsRUFBSzhPLFlBQWE5TyxFQUFLZSxjQUVqQ29CLEVBQUksQ0FtQkwsT0FoQkFsQyxNQUFLd3JCLFNBQVUxcEIsVUFBVyxTQUFVL0IsR0FDbkMsR0FBSTZmLEdBQU9sZSxFQUFNUSxLQUNoQm1OLEVBQVMzTixFQUFNUSxJQUVYbU4sS0FFQ3VRLEdBQVFBLEVBQUs5ZSxhQUFldU8sSUFDaEN1USxFQUFPNWYsS0FBSzZPLGFBRWJ4UixFQUFRMkMsTUFBT29GLFNBQ2ZpSyxFQUFPc2MsYUFBYzVyQixFQUFNNmYsTUFHMUIsR0FHSTFkLEVBQUlsQyxLQUFPQSxLQUFLb0YsVUFHeEJrbkIsT0FBUSxTQUFVN3RCLEdBQ2pCLE1BQU91QixNQUFLb0YsT0FBUTNHLEdBQVUsSUFHL0Irc0IsU0FBVSxTQUFVOXBCLEVBQU1ELEVBQVU4cUIsR0FHbkM3cUIsRUFBTy9ELEVBQVlrRSxTQUFXSCxFQUU5QixJQUFJMGEsR0FBVXJhLEVBQU9rRCxFQUFTdW5CLEVBQVlyZCxFQUFNQyxFQUMvQ2xOLEVBQUksRUFDSmtGLEVBQUlwSCxLQUFLRSxPQUNUeWUsRUFBTTNlLEtBQ055c0IsRUFBV3JsQixFQUFJLEVBQ2ZQLEVBQVFuRixFQUFNLEdBQ2RmLEVBQWF0RCxFQUFPc0QsV0FBWWtHLEVBR2pDLElBQUtsRyxLQUFzQixHQUFMeUcsR0FBMkIsZ0JBQVZQLElBQXNCeEosRUFBT3NMLFFBQVFxVSxhQUFldU4sR0FBUzlwQixLQUFNb0csR0FDekcsTUFBTzdHLE1BQUt3QixLQUFLLFNBQVU0WSxHQUMxQixHQUFJSCxHQUFPMEUsRUFBSTNjLEdBQUlvWSxFQUNkelosS0FDSmUsRUFBTSxHQUFNbUYsRUFBTTVGLEtBQU1qQixLQUFNb2EsRUFBT0gsRUFBS21TLFNBRTNDblMsRUFBS3VSLFNBQVU5cEIsRUFBTUQsRUFBVThxQixJQUlqQyxJQUFLbmxCLElBQ0pnVixFQUFXL2UsRUFBTzhILGNBQWV6RCxFQUFNMUIsS0FBTSxHQUFJUSxlQUFlLEdBQVErckIsR0FBcUJ2c0IsTUFDN0YrQixFQUFRcWEsRUFBU3hNLFdBRW1CLElBQS9Cd00sRUFBUy9XLFdBQVduRixTQUN4QmtjLEVBQVdyYSxHQUdQQSxHQUFRLENBTVosSUFMQWtELEVBQVU1SCxFQUFPZ0YsSUFBSzJwQixHQUFRNVAsRUFBVSxVQUFZc1EsSUFDcERGLEVBQWF2bkIsRUFBUS9FLE9BSVRrSCxFQUFKbEYsRUFBT0EsSUFDZGlOLEVBQU9pTixFQUVGbGEsSUFBTXVxQixJQUNWdGQsRUFBTzlSLEVBQU8wRixNQUFPb00sR0FBTSxHQUFNLEdBRzVCcWQsR0FHSm52QixFQUFPZ0QsTUFBTzRFLEVBQVMrbUIsR0FBUTdjLEVBQU0sWUFJdkMxTixFQUFTUixLQUFNakIsS0FBTWtDLEdBQUtpTixFQUFNak4sRUFHakMsSUFBS3NxQixFQU9KLElBTkFwZCxFQUFNbkssRUFBU0EsRUFBUS9FLE9BQVMsR0FBSU0sY0FHcENuRCxFQUFPZ0YsSUFBSzRDLEVBQVMwbkIsSUFHZnpxQixFQUFJLEVBQU9zcUIsRUFBSnRxQixFQUFnQkEsSUFDNUJpTixFQUFPbEssRUFBUy9DLEdBQ1hzb0IsR0FBWS9wQixLQUFNME8sRUFBS2xMLE1BQVEsTUFDbEMrWixFQUFVclcsT0FBUXdILEVBQU0sZUFBa0I5UixFQUFPbU0sU0FBVTRGLEVBQUtELEtBRTVEQSxFQUFLdk0sSUFFVHZGLEVBQU91dkIsU0FBVXpkLEVBQUt2TSxLQUV0QnZGLEVBQU8ySSxXQUFZbUosRUFBS3dDLFlBQVlyTyxRQUFTb25CLEdBQWMsTUFRakUsTUFBTzFxQixTQUlUM0MsRUFBT21FLE1BQ05xckIsU0FBVSxTQUNWQyxVQUFXLFVBQ1huQixhQUFjLFNBQ2RvQixZQUFhLFFBQ2JDLFdBQVksZUFDVixTQUFVcnFCLEVBQU11akIsR0FDbEI3b0IsRUFBT3NCLEdBQUlnRSxHQUFTLFNBQVVsRSxHQUM3QixHQUFJNEMsR0FDSEMsS0FDQTJyQixFQUFTNXZCLEVBQVFvQixHQUNqQndELEVBQU9nckIsRUFBTy9zQixPQUFTLEVBQ3ZCZ0MsRUFBSSxDQUVMLE1BQWFELEdBQUxDLEVBQVdBLElBQ2xCYixFQUFRYSxJQUFNRCxFQUFPakMsS0FBT0EsS0FBSytDLE9BQU8sR0FDeEMxRixFQUFRNHZCLEVBQVEvcUIsSUFBT2drQixHQUFZN2tCLEdBSW5DeEQsRUFBVWdFLE1BQU9QLEVBQUtELEVBQU1ILE1BRzdCLE9BQU9sQixNQUFLb0IsVUFBV0UsTUFJekJqRSxFQUFPb0YsUUFDTk0sTUFBTyxTQUFVaEQsRUFBTW1zQixFQUFlQyxHQUNyQyxHQUFJanFCLEdBQUdrRixFQUFHOGxCLEVBQWFDLEVBQ3RCcHFCLEVBQVFoRCxFQUFLOGMsV0FBVyxHQUN4QnVRLEVBQVMvdkIsRUFBT21NLFNBQVV6SixFQUFLUyxjQUFlVCxFQUkvQyxNQUFNMUMsRUFBT3NMLFFBQVFpVSxnQkFBc0MsSUFBbEI3YyxFQUFLUSxVQUFvQyxLQUFsQlIsRUFBS1EsVUFBc0JsRCxFQUFPMmIsU0FBVWpaLElBTTNHLElBSEFvdEIsRUFBZW5CLEdBQVFqcEIsR0FDdkJtcUIsRUFBY2xCLEdBQVFqc0IsR0FFaEJtQyxFQUFJLEVBQUdrRixFQUFJOGxCLEVBQVlodEIsT0FBWWtILEVBQUpsRixFQUFPQSxJQUMzQ21yQixHQUFVSCxFQUFhaHJCLEdBQUtpckIsRUFBY2pyQixHQUs1QyxJQUFLZ3FCLEVBQ0osR0FBS0MsRUFJSixJQUhBZSxFQUFjQSxHQUFlbEIsR0FBUWpzQixHQUNyQ290QixFQUFlQSxHQUFnQm5CLEdBQVFqcEIsR0FFakNiLEVBQUksRUFBR2tGLEVBQUk4bEIsRUFBWWh0QixPQUFZa0gsRUFBSmxGLEVBQU9BLElBQzNDb3JCLEdBQWdCSixFQUFhaHJCLEdBQUtpckIsRUFBY2pyQixRQUdqRG9yQixJQUFnQnZ0QixFQUFNZ0QsRUFXeEIsT0FOQW9xQixHQUFlbkIsR0FBUWpwQixFQUFPLFVBQ3pCb3FCLEVBQWFqdEIsT0FBUyxHQUMxQityQixHQUFla0IsR0FBZUMsR0FBVXBCLEdBQVFqc0IsRUFBTSxXQUloRGdELEdBR1JvQyxjQUFlLFNBQVU5RCxFQUFPM0MsRUFBU3VHLEVBQVNzb0IsR0FDakQsR0FBSXh0QixHQUFNNEYsRUFBS3VLLEVBQUtzZCxFQUFNaGtCLEVBQVVwSCxFQUNuQ0YsRUFBSSxFQUNKa0YsRUFBSS9GLEVBQU1uQixPQUNWa2MsRUFBVzFkLEVBQVEyZCx5QkFDbkJvUixJQUVELE1BQVlybUIsRUFBSmxGLEVBQU9BLElBR2QsR0FGQW5DLEVBQU9zQixFQUFPYSxHQUVUbkMsR0FBaUIsSUFBVEEsRUFHWixHQUE2QixXQUF4QjFDLEVBQU80RyxLQUFNbEUsR0FHakIxQyxFQUFPZ0QsTUFBT290QixFQUFPMXRCLEVBQUtRLFVBQWFSLEdBQVNBLE9BRzFDLElBQU1xcUIsR0FBTTNwQixLQUFNVixHQUlsQixDQUNONEYsRUFBTUEsR0FBT3lXLEVBQVM3VixZQUFhN0gsRUFBUXdHLGNBQWMsUUFHekRnTCxHQUFRaWEsR0FBU2hxQixLQUFNSixLQUFXLEdBQUksS0FBTyxHQUFJNkcsY0FDakQ0bUIsRUFBTzdDLEdBQVN6YSxJQUFTeWEsR0FBUXRGLFNBQ2pDMWYsRUFBSWdLLFVBQVk2ZCxFQUFNLEdBQU16dEIsRUFBS3VELFFBQVM0bUIsR0FBVyxhQUFnQnNELEVBQU0sR0FHM0VwckIsRUFBSW9yQixFQUFNLEVBQ1YsT0FBUXByQixJQUNQdUQsRUFBTUEsRUFBSTBOLFNBS1hoVyxHQUFPZ0QsTUFBT290QixFQUFPOW5CLEVBQUlOLFlBR3pCTSxFQUFNeVcsRUFBU3hNLFdBSWZqSyxFQUFJZ00sWUFBYyxPQTFCbEI4YixHQUFNM3ZCLEtBQU1ZLEVBQVE2c0IsZUFBZ0J4ckIsR0FnQ3ZDcWMsR0FBU3pLLFlBQWMsR0FFdkJ6UCxFQUFJLENBQ0osT0FBU25DLEVBQU8wdEIsRUFBT3ZyQixLQUl0QixLQUFLcXJCLEdBQW1ELEtBQXRDbHdCLEVBQU82SixRQUFTbkgsRUFBTXd0QixNQUl4Qy9qQixFQUFXbk0sRUFBT21NLFNBQVV6SixFQUFLUyxjQUFlVCxHQUdoRDRGLEVBQU1xbUIsR0FBUTVQLEVBQVM3VixZQUFheEcsR0FBUSxVQUd2Q3lKLEdBQ0p5aUIsR0FBZXRtQixHQUlYVixHQUFVLENBQ2Q3QyxFQUFJLENBQ0osT0FBU3JDLEVBQU80RixFQUFLdkQsS0FDZm9vQixHQUFZL3BCLEtBQU1WLEVBQUtrRSxNQUFRLEtBQ25DZ0IsRUFBUW5ILEtBQU1pQyxHQU1sQixNQUFPcWMsSUFHUjJQLFVBQVcsU0FBVTFxQixHQUNwQixHQUFJeUQsR0FBTS9FLEVBQU1zakIsRUFBUXBmLEVBQU0yRCxFQUFLeEYsRUFDbENvaEIsRUFBVW5tQixFQUFPMmxCLE1BQU1RLFFBQ3ZCdGhCLEVBQUksQ0FFTCxPQUFTbkMsRUFBT3NCLEVBQU9hLE1BQVN0RixVQUFXc0YsSUFBTSxDQUNoRCxHQUFLaWMsRUFBS0csUUFBU3ZlLEtBQ2xCNkgsRUFBTTdILEVBQU1pZSxFQUFVN2EsU0FFakJ5RSxJQUFROUMsRUFBT2taLEVBQVVqUSxNQUFPbkcsS0FBUyxDQUU3QyxHQURBeWIsRUFBU3BjLE9BQU82RyxLQUFNaEosRUFBS3VlLFlBQ3RCQSxFQUFPbmpCLE9BQ1gsSUFBTWtDLEVBQUksR0FBSTZCLEVBQU9vZixFQUFPamhCLE1BQVF4RixVQUFXd0YsSUFDekNvaEIsRUFBU3ZmLEdBQ2I1RyxFQUFPMmxCLE1BQU01ZCxPQUFRckYsRUFBTWtFLEdBSTNCNUcsRUFBT21uQixZQUFhemtCLEVBQU1rRSxFQUFNYSxFQUFLK2UsT0FJbkM3RixHQUFValEsTUFBT25HLFVBRWRvVyxHQUFValEsTUFBT25HLFNBS3BCbVcsR0FBVWhRLE1BQU9oTyxFQUFNZ2UsRUFBVTVhLFlBSTFDeXBCLFNBQVUsU0FBVWMsR0FDbkIsTUFBT3J3QixHQUFPc3dCLE1BQ2JELElBQUtBLEVBQ0x6cEIsS0FBTSxNQUNOMnBCLFNBQVUsU0FDVkMsT0FBTyxFQUNQNUssUUFBUSxFQUNSNkssVUFBVSxNQU9iLFNBQVNyQyxJQUFvQjFyQixFQUFNZ3VCLEdBQ2xDLE1BQU8xd0IsR0FBT3NKLFNBQVU1RyxFQUFNLFVBQzdCMUMsRUFBT3NKLFNBQStCLElBQXJCb25CLEVBQVF4dEIsU0FBaUJ3dEIsRUFBVUEsRUFBUW5lLFdBQVksTUFFeEU3UCxFQUFLK0YscUJBQXFCLFNBQVMsSUFDbEMvRixFQUFLd0csWUFBYXhHLEVBQUtTLGNBQWMwRSxjQUFjLFVBQ3BEbkYsRUFJRixRQUFTMnNCLElBQWUzc0IsR0FFdkIsTUFEQUEsR0FBS2tFLE1BQXNDLE9BQTlCbEUsRUFBS3VOLGFBQWEsU0FBb0IsSUFBTXZOLEVBQUtrRSxLQUN2RGxFLEVBRVIsUUFBUzRzQixJQUFlNXNCLEdBQ3ZCLEdBQUlELEdBQVEycUIsR0FBa0J0cUIsS0FBTUosRUFBS2tFLEtBUXpDLE9BTktuRSxHQUNKQyxFQUFLa0UsS0FBT25FLEVBQU8sR0FFbkJDLEVBQUs2TixnQkFBZ0IsUUFHZjdOLEVBSVIsUUFBU2tzQixJQUFlNXFCLEVBQU8yc0IsR0FDOUIsR0FBSTVtQixHQUFJL0YsRUFBTW5CLE9BQ2JnQyxFQUFJLENBRUwsTUFBWWtGLEVBQUpsRixFQUFPQSxJQUNkOGIsRUFBVVcsSUFDVHRkLEVBQU9hLEdBQUssY0FBZThyQixHQUFlaFEsRUFBVTljLElBQUs4c0IsRUFBYTlyQixHQUFLLGVBSzlFLFFBQVNvckIsSUFBZ0IxcUIsRUFBS3FyQixHQUM3QixHQUFJL3JCLEdBQUdrRixFQUFHbkQsRUFBTWlxQixFQUFVQyxFQUFVQyxFQUFVQyxFQUFVaEwsQ0FFeEQsSUFBdUIsSUFBbEI0SyxFQUFLMXRCLFNBQVYsQ0FLQSxHQUFLeWQsRUFBVWUsUUFBU25jLEtBQ3ZCc3JCLEVBQVdsUSxFQUFVclcsT0FBUS9FLEdBQzdCdXJCLEVBQVduUSxFQUFVVyxJQUFLc1AsRUFBTUMsR0FDaEM3SyxFQUFTNkssRUFBUzdLLFFBRUosT0FDTjhLLEdBQVN0SyxPQUNoQnNLLEVBQVM5SyxTQUVULEtBQU1wZixJQUFRb2YsR0FDYixJQUFNbmhCLEVBQUksRUFBR2tGLEVBQUlpYyxFQUFRcGYsR0FBTy9ELE9BQVlrSCxFQUFKbEYsRUFBT0EsSUFDOUM3RSxFQUFPMmxCLE1BQU03SSxJQUFLOFQsRUFBTWhxQixFQUFNb2YsRUFBUXBmLEdBQVEvQixJQU83QzZiLEVBQVVnQixRQUFTbmMsS0FDdkJ3ckIsRUFBV3JRLEVBQVVwVyxPQUFRL0UsR0FDN0J5ckIsRUFBV2h4QixFQUFPb0YsVUFBWTJyQixHQUU5QnJRLEVBQVVZLElBQUtzUCxFQUFNSSxLQUt2QixRQUFTckMsSUFBUXR0QixFQUFTd1IsR0FDekIsR0FBSTVPLEdBQU01QyxFQUFRb0gscUJBQXVCcEgsRUFBUW9ILHFCQUFzQm9LLEdBQU8sS0FDNUV4UixFQUFRZ1AsaUJBQW1CaFAsRUFBUWdQLGlCQUFrQndDLEdBQU8sT0FHOUQsT0FBT0EsS0FBUXRULFdBQWFzVCxHQUFPN1MsRUFBT3NKLFNBQVVqSSxFQUFTd1IsR0FDNUQ3UyxFQUFPZ0QsT0FBUzNCLEdBQVc0QyxHQUMzQkEsRUFJRixRQUFTK3JCLElBQVV6cUIsRUFBS3FyQixHQUN2QixHQUFJdG5CLEdBQVdzbkIsRUFBS3RuQixTQUFTQyxhQUdYLFdBQWJELEdBQXdCMmpCLEdBQTRCN3BCLEtBQU1tQyxFQUFJcUIsTUFDbEVncUIsRUFBS3ZaLFFBQVU5UixFQUFJOFIsU0FHSyxVQUFiL04sR0FBcUMsYUFBYkEsS0FDbkNzbkIsRUFBS25WLGFBQWVsVyxFQUFJa1csY0FHMUJ6YixFQUFPc0IsR0FBRzhELFFBQ1Q2ckIsUUFBUyxTQUFVbEMsR0FDbEIsR0FBSW9CLEVBRUosT0FBS253QixHQUFPc0QsV0FBWXlyQixHQUNoQnBzQixLQUFLd0IsS0FBSyxTQUFVVSxHQUMxQjdFLEVBQVEyQyxNQUFPc3VCLFFBQVNsQyxFQUFLbnJCLEtBQUtqQixLQUFNa0MsT0FJckNsQyxLQUFNLEtBR1Z3dEIsRUFBT253QixFQUFRK3VCLEVBQU1wc0IsS0FBTSxHQUFJUSxlQUFnQndCLEdBQUksR0FBSWUsT0FBTyxHQUV6RC9DLEtBQU0sR0FBSWMsWUFDZDBzQixFQUFLN0IsYUFBYzNyQixLQUFNLElBRzFCd3RCLEVBQUtuckIsSUFBSSxXQUNSLEdBQUl0QyxHQUFPQyxJQUVYLE9BQVFELEVBQUt3dUIsa0JBQ1p4dUIsRUFBT0EsRUFBS3d1QixpQkFHYixPQUFPeHVCLEtBQ0x1ckIsT0FBUXRyQixPQUdMQSxPQUdSd3VCLFVBQVcsU0FBVXBDLEdBQ3BCLE1BQUsvdUIsR0FBT3NELFdBQVl5ckIsR0FDaEJwc0IsS0FBS3dCLEtBQUssU0FBVVUsR0FDMUI3RSxFQUFRMkMsTUFBT3d1QixVQUFXcEMsRUFBS25yQixLQUFLakIsS0FBTWtDLE1BSXJDbEMsS0FBS3dCLEtBQUssV0FDaEIsR0FBSXlZLEdBQU81YyxFQUFRMkMsTUFDbEI0b0IsRUFBVzNPLEVBQUsyTyxVQUVaQSxHQUFTMW9CLE9BQ2Iwb0IsRUFBUzBGLFFBQVNsQyxHQUdsQm5TLEVBQUtxUixPQUFRYyxNQUtoQm9CLEtBQU0sU0FBVXBCLEdBQ2YsR0FBSXpyQixHQUFhdEQsRUFBT3NELFdBQVl5ckIsRUFFcEMsT0FBT3BzQixNQUFLd0IsS0FBSyxTQUFVVSxHQUMxQjdFLEVBQVEyQyxNQUFPc3VCLFFBQVMzdEIsRUFBYXlyQixFQUFLbnJCLEtBQUtqQixLQUFNa0MsR0FBS2txQixNQUk1RHFDLE9BQVEsV0FDUCxNQUFPenVCLE1BQUtxUCxTQUFTN04sS0FBSyxXQUNuQm5FLEVBQU9zSixTQUFVM0csS0FBTSxTQUM1QjNDLEVBQVEyQyxNQUFPcXNCLFlBQWFyc0IsS0FBS3FGLGNBRWhDL0MsUUFHTCxJQUFJb3NCLElBQVFDLEdBR1hDLEdBQWUsNEJBQ2ZDLEdBQVUsVUFDVkMsR0FBZ0IvakIsT0FBUSxLQUFPbE0sRUFBWSxTQUFVLEtBQ3JEa3dCLEdBQWdCaGtCLE9BQVEsS0FBT2xNLEVBQVksa0JBQW1CLEtBQzlEbXdCLEdBQWNqa0IsT0FBUSxZQUFjbE0sRUFBWSxJQUFLLEtBQ3JEb3dCLElBQWdCQyxLQUFNLFNBRXRCQyxJQUFZQyxTQUFVLFdBQVlDLFdBQVksU0FBVUMsUUFBUyxTQUNqRUMsSUFDQ0MsY0FBZSxFQUNmQyxXQUFZLEtBR2JDLElBQWMsTUFBTyxRQUFTLFNBQVUsUUFDeENDLElBQWdCLFNBQVUsSUFBSyxNQUFPLEtBR3ZDLFNBQVNDLElBQWdCdm5CLEVBQU8xRixHQUcvQixHQUFLQSxJQUFRMEYsR0FDWixNQUFPMUYsRUFJUixJQUFJa3RCLEdBQVVsdEIsRUFBSzFDLE9BQU8sR0FBR1YsY0FBZ0JvRCxFQUFLM0UsTUFBTSxHQUN2RDh4QixFQUFXbnRCLEVBQ1hULEVBQUl5dEIsR0FBWXp2QixNQUVqQixPQUFRZ0MsSUFFUCxHQURBUyxFQUFPZ3RCLEdBQWF6dEIsR0FBTTJ0QixFQUNyQmx0QixJQUFRMEYsR0FDWixNQUFPMUYsRUFJVCxPQUFPbXRCLEdBR1IsUUFBU0MsSUFBVWh3QixFQUFNaXdCLEdBSXhCLE1BREFqd0IsR0FBT2l3QixHQUFNandCLEVBQzRCLFNBQWxDMUMsRUFBTzR5QixJQUFLbHdCLEVBQU0sYUFBMkIxQyxFQUFPbU0sU0FBVXpKLEVBQUtTLGNBQWVULEdBSzFGLFFBQVNtd0IsSUFBV253QixHQUNuQixNQUFPcEQsR0FBT2loQixpQkFBa0I3ZCxFQUFNLE1BR3ZDLFFBQVNvd0IsSUFBVS9lLEVBQVVnZixHQUM1QixHQUFJZCxHQUFTdnZCLEVBQU1zd0IsRUFDbEJ0VSxLQUNBM0IsRUFBUSxFQUNSbGEsRUFBU2tSLEVBQVNsUixNQUVuQixNQUFnQkEsRUFBUmthLEVBQWdCQSxJQUN2QnJhLEVBQU9xUixFQUFVZ0osR0FDWHJhLEVBQUtzSSxRQUlYMFQsRUFBUTNCLEdBQVU0RCxFQUFVOWMsSUFBS25CLEVBQU0sY0FDdkN1dkIsRUFBVXZ2QixFQUFLc0ksTUFBTWluQixRQUNoQmMsR0FHRXJVLEVBQVEzQixJQUF1QixTQUFaa1YsSUFDeEJ2dkIsRUFBS3NJLE1BQU1pbkIsUUFBVSxJQU1NLEtBQXZCdnZCLEVBQUtzSSxNQUFNaW5CLFNBQWtCUyxHQUFVaHdCLEtBQzNDZ2MsRUFBUTNCLEdBQVU0RCxFQUFVclcsT0FBUTVILEVBQU0sYUFBY3V3QixHQUFtQnZ3QixFQUFLNEcsYUFJM0VvVixFQUFRM0IsS0FDYmlXLEVBQVNOLEdBQVVod0IsSUFFZHV2QixHQUF1QixTQUFaQSxJQUF1QmUsSUFDdENyUyxFQUFVVyxJQUFLNWUsRUFBTSxhQUFjc3dCLEVBQVNmLEVBQVVqeUIsRUFBTzR5QixJQUFJbHdCLEVBQU0sYUFRM0UsS0FBTXFhLEVBQVEsRUFBV2xhLEVBQVJrYSxFQUFnQkEsSUFDaENyYSxFQUFPcVIsRUFBVWdKLEdBQ1hyYSxFQUFLc0ksUUFHTCtuQixHQUErQixTQUF2QnJ3QixFQUFLc0ksTUFBTWluQixTQUE2QyxLQUF2QnZ2QixFQUFLc0ksTUFBTWluQixVQUN6RHZ2QixFQUFLc0ksTUFBTWluQixRQUFVYyxFQUFPclUsRUFBUTNCLElBQVcsR0FBSyxRQUl0RCxPQUFPaEosR0FHUi9ULEVBQU9zQixHQUFHOEQsUUFDVHd0QixJQUFLLFNBQVV0dEIsRUFBTWtFLEdBQ3BCLE1BQU94SixHQUFPc0ssT0FBUTNILEtBQU0sU0FBVUQsRUFBTTRDLEVBQU1rRSxHQUNqRCxHQUFJMHBCLEdBQVFwdUIsRUFDWEUsS0FDQUgsRUFBSSxDQUVMLElBQUs3RSxFQUFPNkYsUUFBU1AsR0FBUyxDQUk3QixJQUhBNHRCLEVBQVNMLEdBQVdud0IsR0FDcEJvQyxFQUFNUSxFQUFLekMsT0FFQ2lDLEVBQUpELEVBQVNBLElBQ2hCRyxFQUFLTSxFQUFNVCxJQUFRN0UsRUFBTzR5QixJQUFLbHdCLEVBQU00QyxFQUFNVCxJQUFLLEVBQU9xdUIsRUFHeEQsT0FBT2x1QixHQUdSLE1BQU93RSxLQUFVakssVUFDaEJTLEVBQU9nTCxNQUFPdEksRUFBTTRDLEVBQU1rRSxHQUMxQnhKLEVBQU80eUIsSUFBS2x3QixFQUFNNEMsSUFDakJBLEVBQU1rRSxFQUFPL0UsVUFBVTVCLE9BQVMsSUFFcENrd0IsS0FBTSxXQUNMLE1BQU9ELElBQVVud0IsTUFBTSxJQUV4Qnd3QixLQUFNLFdBQ0wsTUFBT0wsSUFBVW53QixPQUVsQnl3QixPQUFRLFNBQVUvVixHQUNqQixNQUFzQixpQkFBVkEsR0FDSkEsRUFBUTFhLEtBQUtvd0IsT0FBU3B3QixLQUFLd3dCLE9BRzVCeHdCLEtBQUt3QixLQUFLLFdBQ1h1dUIsR0FBVS92QixNQUNkM0MsRUFBUTJDLE1BQU9vd0IsT0FFZi95QixFQUFRMkMsTUFBT3d3QixZQU1uQm56QixFQUFPb0YsUUFHTml1QixVQUNDQyxTQUNDenZCLElBQUssU0FBVW5CLEVBQU02d0IsR0FDcEIsR0FBS0EsRUFBVyxDQUVmLEdBQUl0dkIsR0FBTW90QixHQUFRM3VCLEVBQU0sVUFDeEIsT0FBZSxLQUFSdUIsRUFBYSxJQUFNQSxNQU85QnV2QixXQUNDQyxhQUFlLEVBQ2ZDLGFBQWUsRUFDZnRCLFlBQWMsRUFDZHVCLFlBQWMsRUFDZEwsU0FBVyxFQUNYTSxPQUFTLEVBQ1RDLFNBQVcsRUFDWEMsUUFBVSxFQUNWQyxRQUFVLEVBQ1YzVCxNQUFRLEdBS1Q0VCxVQUVDQyxRQUFTLFlBSVZqcEIsTUFBTyxTQUFVdEksRUFBTTRDLEVBQU1rRSxFQUFPMHFCLEdBRW5DLEdBQU14eEIsR0FBMEIsSUFBbEJBLEVBQUtRLFVBQW9DLElBQWxCUixFQUFLUSxVQUFtQlIsRUFBS3NJLE1BQWxFLENBS0EsR0FBSS9HLEdBQUsyQyxFQUFNeWIsRUFDZG9RLEVBQVd6eUIsRUFBT29KLFVBQVc5RCxHQUM3QjBGLEVBQVF0SSxFQUFLc0ksS0FTZCxPQVBBMUYsR0FBT3RGLEVBQU9nMEIsU0FBVXZCLEtBQWdCenlCLEVBQU9nMEIsU0FBVXZCLEdBQWFGLEdBQWdCdm5CLEVBQU95bkIsSUFJN0ZwUSxFQUFRcmlCLEVBQU9xekIsU0FBVS90QixJQUFVdEYsRUFBT3F6QixTQUFVWixHQUcvQ2pwQixJQUFVakssVUFpQ1Q4aUIsR0FBUyxPQUFTQSxLQUFVcGUsRUFBTW9lLEVBQU14ZSxJQUFLbkIsR0FBTSxFQUFPd3hCLE1BQWEzMEIsVUFDcEUwRSxFQUlEK0csRUFBTzFGLElBckNkc0IsUUFBYzRDLEdBR0EsV0FBVDVDLElBQXNCM0MsRUFBTTB0QixHQUFRN3VCLEtBQU0wRyxNQUM5Q0EsR0FBVXZGLEVBQUksR0FBSyxHQUFNQSxFQUFJLEdBQUtnRCxXQUFZakgsRUFBTzR5QixJQUFLbHdCLEVBQU00QyxJQUVoRXNCLEVBQU8sVUFJTSxNQUFUNEMsR0FBMEIsV0FBVDVDLEdBQXFCSSxNQUFPd0MsS0FLcEMsV0FBVDVDLEdBQXNCNUcsRUFBT3d6QixVQUFXZixLQUM1Q2pwQixHQUFTLE1BS0p4SixFQUFPc0wsUUFBUXdVLGlCQUE2QixLQUFWdFcsR0FBK0MsSUFBL0JsRSxFQUFLekUsUUFBUSxnQkFDcEVtSyxFQUFPMUYsR0FBUyxXQUlYK2MsR0FBVyxPQUFTQSxLQUFXN1ksRUFBUTZZLEVBQU1mLElBQUs1ZSxFQUFNOEcsRUFBTzBxQixNQUFhMzBCLFlBQ2pGeUwsRUFBTzFGLEdBQVNrRSxJQWpCakIsYUErQkZvcEIsSUFBSyxTQUFVbHdCLEVBQU00QyxFQUFNNHVCLEVBQU9oQixHQUNqQyxHQUFJbGYsR0FBS2xRLEVBQUt1ZSxFQUNib1EsRUFBV3p5QixFQUFPb0osVUFBVzlELEVBeUI5QixPQXRCQUEsR0FBT3RGLEVBQU9nMEIsU0FBVXZCLEtBQWdCenlCLEVBQU9nMEIsU0FBVXZCLEdBQWFGLEdBQWdCN3ZCLEVBQUtzSSxNQUFPeW5CLElBSWxHcFEsRUFBUXJpQixFQUFPcXpCLFNBQVUvdEIsSUFBVXRGLEVBQU9xekIsU0FBVVosR0FHL0NwUSxHQUFTLE9BQVNBLEtBQ3RCck8sRUFBTXFPLEVBQU14ZSxJQUFLbkIsR0FBTSxFQUFNd3hCLElBSXpCbGdCLElBQVF6VSxZQUNaeVUsRUFBTXFkLEdBQVEzdUIsRUFBTTRDLEVBQU00dEIsSUFJZCxXQUFSbGYsR0FBb0IxTyxJQUFRNHNCLE1BQ2hDbGUsRUFBTWtlLEdBQW9CNXNCLElBSVosS0FBVjR1QixHQUFnQkEsR0FDcEJwd0IsRUFBTW1ELFdBQVkrTSxHQUNYa2dCLEtBQVUsR0FBUWwwQixFQUFPK0csVUFBV2pELEdBQVFBLEdBQU8sRUFBSWtRLEdBRXhEQSxLQUlUcWQsR0FBUyxTQUFVM3VCLEVBQU00QyxFQUFNNnVCLEdBQzlCLEdBQUkzVCxHQUFPNFQsRUFBVUMsRUFDcEJkLEVBQVdZLEdBQWF0QixHQUFXbndCLEdBSW5DdUIsRUFBTXN2QixFQUFXQSxFQUFTZSxpQkFBa0JodkIsSUFBVWl1QixFQUFVanVCLEdBQVMvRixVQUN6RXlMLEVBQVF0SSxFQUFLc0ksS0E4QmQsT0E1Qkt1b0IsS0FFUyxLQUFSdHZCLEdBQWVqRSxFQUFPbU0sU0FBVXpKLEVBQUtTLGNBQWVULEtBQ3hEdUIsRUFBTWpFLEVBQU9nTCxNQUFPdEksRUFBTTRDLElBT3RCb3NCLEdBQVV0dUIsS0FBTWEsSUFBU3V0QixHQUFRcHVCLEtBQU1rQyxLQUczQ2tiLEVBQVF4VixFQUFNd1YsTUFDZDRULEVBQVdwcEIsRUFBTW9wQixTQUNqQkMsRUFBV3JwQixFQUFNcXBCLFNBR2pCcnBCLEVBQU1vcEIsU0FBV3BwQixFQUFNcXBCLFNBQVdycEIsRUFBTXdWLE1BQVF2YyxFQUNoREEsRUFBTXN2QixFQUFTL1MsTUFHZnhWLEVBQU13VixNQUFRQSxFQUNkeFYsRUFBTW9wQixTQUFXQSxFQUNqQnBwQixFQUFNcXBCLFNBQVdBLElBSVpwd0IsRUFJUixTQUFTc3dCLElBQW1CN3hCLEVBQU04RyxFQUFPZ3JCLEdBQ3hDLEdBQUl0b0IsR0FBVXVsQixHQUFVM3VCLEtBQU0wRyxFQUM5QixPQUFPMEMsR0FFTm5HLEtBQUt3ZSxJQUFLLEVBQUdyWSxFQUFTLElBQVFzb0IsR0FBWSxLQUFVdG9CLEVBQVMsSUFBTyxNQUNwRTFDLEVBR0YsUUFBU2lyQixJQUFzQi94QixFQUFNNEMsRUFBTTR1QixFQUFPUSxFQUFheEIsR0FDOUQsR0FBSXJ1QixHQUFJcXZCLEtBQVlRLEVBQWMsU0FBVyxXQUU1QyxFQUVTLFVBQVRwdkIsRUFBbUIsRUFBSSxFQUV2QjBPLEVBQU0sQ0FFUCxNQUFZLEVBQUpuUCxFQUFPQSxHQUFLLEVBRUosV0FBVnF2QixJQUNKbGdCLEdBQU9oVSxFQUFPNHlCLElBQUtsd0IsRUFBTXd4QixFQUFRN0IsR0FBV3h0QixJQUFLLEVBQU1xdUIsSUFHbkR3QixHQUVXLFlBQVZSLElBQ0psZ0IsR0FBT2hVLEVBQU80eUIsSUFBS2x3QixFQUFNLFVBQVkydkIsR0FBV3h0QixJQUFLLEVBQU1xdUIsSUFJN0MsV0FBVmdCLElBQ0psZ0IsR0FBT2hVLEVBQU80eUIsSUFBS2x3QixFQUFNLFNBQVcydkIsR0FBV3h0QixHQUFNLFNBQVMsRUFBTXF1QixNQUlyRWxmLEdBQU9oVSxFQUFPNHlCLElBQUtsd0IsRUFBTSxVQUFZMnZCLEdBQVd4dEIsSUFBSyxFQUFNcXVCLEdBRzVDLFlBQVZnQixJQUNKbGdCLEdBQU9oVSxFQUFPNHlCLElBQUtsd0IsRUFBTSxTQUFXMnZCLEdBQVd4dEIsR0FBTSxTQUFTLEVBQU1xdUIsSUFLdkUsT0FBT2xmLEdBR1IsUUFBUzJnQixJQUFrQmp5QixFQUFNNEMsRUFBTTR1QixHQUd0QyxHQUFJVSxJQUFtQixFQUN0QjVnQixFQUFlLFVBQVQxTyxFQUFtQjVDLEVBQUs0ZCxZQUFjNWQsRUFBS215QixhQUNqRDNCLEVBQVNMLEdBQVdud0IsR0FDcEJneUIsRUFBYzEwQixFQUFPc0wsUUFBUStVLFdBQWdFLGVBQW5EcmdCLEVBQU80eUIsSUFBS2x3QixFQUFNLGFBQWEsRUFBT3d3QixFQUtqRixJQUFZLEdBQVBsZixHQUFtQixNQUFQQSxFQUFjLENBUTlCLEdBTkFBLEVBQU1xZCxHQUFRM3VCLEVBQU00QyxFQUFNNHRCLElBQ2YsRUFBTmxmLEdBQWtCLE1BQVBBLEtBQ2ZBLEVBQU10UixFQUFLc0ksTUFBTzFGLElBSWRvc0IsR0FBVXR1QixLQUFLNFEsR0FDbkIsTUFBT0EsRUFLUjRnQixHQUFtQkYsSUFBaUIxMEIsRUFBT3NMLFFBQVErVCxtQkFBcUJyTCxJQUFRdFIsRUFBS3NJLE1BQU8xRixJQUc1RjBPLEVBQU0vTSxXQUFZK00sSUFBUyxFQUk1QixNQUFTQSxHQUNSeWdCLEdBQ0MveEIsRUFDQTRDLEVBQ0E0dUIsSUFBV1EsRUFBYyxTQUFXLFdBQ3BDRSxFQUNBMUIsR0FFRSxLQUlMLFFBQVNELElBQW9CM3BCLEdBQzVCLEdBQUl5SSxHQUFNblMsRUFDVHF5QixFQUFVTCxHQUFhdG9CLEVBMEJ4QixPQXhCTTJvQixLQUNMQSxFQUFVNkMsR0FBZXhyQixFQUFVeUksR0FHbEIsU0FBWmtnQixHQUF1QkEsSUFFM0JYLElBQVdBLElBQ1Z0eEIsRUFBTyxrREFDTjR5QixJQUFLLFVBQVcsNkJBQ2hCcEQsU0FBVXpkLEVBQUlqUyxpQkFHaEJpUyxHQUFRdWYsR0FBTyxHQUFHeUQsZUFBaUJ6RCxHQUFPLEdBQUc5RSxpQkFBa0I1c0IsU0FDL0RtUyxFQUFJaWpCLE1BQU0sK0JBQ1ZqakIsRUFBSWtqQixRQUVKaEQsRUFBVTZDLEdBQWV4ckIsRUFBVXlJLEdBQ25DdWYsR0FBT3JDLFVBSVIyQyxHQUFhdG9CLEdBQWEyb0IsR0FHcEJBLEVBSVIsUUFBUzZDLElBQWV4dkIsRUFBTXlNLEdBQzdCLEdBQUlyUCxHQUFPMUMsRUFBUStSLEVBQUlsSyxjQUFldkMsSUFBU2txQixTQUFVemQsRUFBSW1PLE1BQzVEK1IsRUFBVWp5QixFQUFPNHlCLElBQUtsd0IsRUFBSyxHQUFJLFVBRWhDLE9BREFBLEdBQUtxRixTQUNFa3FCLEVBR1JqeUIsRUFBT21FLE1BQU8sU0FBVSxTQUFXLFNBQVVVLEVBQUdTLEdBQy9DdEYsRUFBT3F6QixTQUFVL3RCLElBQ2hCekIsSUFBSyxTQUFVbkIsRUFBTTZ3QixFQUFVVyxHQUM5QixNQUFLWCxHQUd3QixJQUFyQjd3QixFQUFLNGQsYUFBcUJpUixHQUFhbnVCLEtBQU1wRCxFQUFPNHlCLElBQUtsd0IsRUFBTSxZQUNyRTFDLEVBQU84SyxLQUFNcEksRUFBTW92QixHQUFTLFdBQzNCLE1BQU82QyxJQUFrQmp5QixFQUFNNEMsRUFBTTR1QixLQUV0Q1MsR0FBa0JqeUIsRUFBTTRDLEVBQU00dUIsR0FQaEMsV0FXRDVTLElBQUssU0FBVTVlLEVBQU04RyxFQUFPMHFCLEdBQzNCLEdBQUloQixHQUFTZ0IsR0FBU3JCLEdBQVdud0IsRUFDakMsT0FBTzZ4QixJQUFtQjd4QixFQUFNOEcsRUFBTzBxQixFQUN0Q08sR0FDQy94QixFQUNBNEMsRUFDQTR1QixFQUNBbDBCLEVBQU9zTCxRQUFRK1UsV0FBZ0UsZUFBbkRyZ0IsRUFBTzR5QixJQUFLbHdCLEVBQU0sYUFBYSxFQUFPd3dCLEdBQ2xFQSxHQUNHLE9BUVJsekIsRUFBTyxXQUVBQSxFQUFPc0wsUUFBUThULHNCQUNwQnBmLEVBQU9xekIsU0FBUzVTLGFBQ2Y1YyxJQUFLLFNBQVVuQixFQUFNNndCLEdBQ3BCLE1BQUtBLEdBSUd2ekIsRUFBTzhLLEtBQU1wSSxHQUFRdXZCLFFBQVcsZ0JBQ3RDWixJQUFVM3VCLEVBQU0sZ0JBTGxCLGNBY0cxQyxFQUFPc0wsUUFBUWdVLGVBQWlCdGYsRUFBT3NCLEdBQUd5d0IsVUFDL0MveEIsRUFBT21FLE1BQVEsTUFBTyxRQUFVLFNBQVVVLEVBQUcwYyxHQUM1Q3ZoQixFQUFPcXpCLFNBQVU5UixJQUNoQjFkLElBQUssU0FBVW5CLEVBQU02d0IsR0FDcEIsTUFBS0EsSUFDSkEsRUFBV2xDLEdBQVEzdUIsRUFBTTZlLEdBRWxCbVEsR0FBVXR1QixLQUFNbXdCLEdBQ3RCdnpCLEVBQVEwQyxHQUFPcXZCLFdBQVl4USxHQUFTLEtBQ3BDZ1MsR0FMRixnQkFjQXZ6QixFQUFPOFQsTUFBUTlULEVBQU84VCxLQUFLd0UsVUFDL0J0WSxFQUFPOFQsS0FBS3dFLFFBQVEwYSxPQUFTLFNBQVV0d0IsR0FHdEMsTUFBMkIsSUFBcEJBLEVBQUs0ZCxhQUF5QyxHQUFyQjVkLEVBQUtteUIsY0FHdEM3MEIsRUFBTzhULEtBQUt3RSxRQUFRNGMsUUFBVSxTQUFVeHlCLEdBQ3ZDLE9BQVExQyxFQUFPOFQsS0FBS3dFLFFBQVEwYSxPQUFRdHdCLEtBS3RDMUMsRUFBT21FLE1BQ05neEIsT0FBUSxHQUNSQyxRQUFTLEdBQ1RDLE9BQVEsU0FDTixTQUFVQyxFQUFRQyxHQUNwQnYxQixFQUFPcXpCLFNBQVVpQyxFQUFTQyxJQUN6QkMsT0FBUSxTQUFVaHNCLEdBQ2pCLEdBQUkzRSxHQUFJLEVBQ1A0d0IsS0FHQUMsRUFBeUIsZ0JBQVZsc0IsR0FBcUJBLEVBQU02QixNQUFNLE1BQVM3QixFQUUxRCxNQUFZLEVBQUozRSxFQUFPQSxJQUNkNHdCLEVBQVVILEVBQVNqRCxHQUFXeHRCLEdBQU0wd0IsR0FDbkNHLEVBQU83d0IsSUFBTzZ3QixFQUFPN3dCLEVBQUksSUFBTzZ3QixFQUFPLEVBR3pDLE9BQU9ELEtBSUhqRSxHQUFRcHVCLEtBQU1reUIsS0FDbkJ0MUIsRUFBT3F6QixTQUFVaUMsRUFBU0MsR0FBU2pVLElBQU1pVCxLQUczQyxJQUFJb0IsSUFBTSxPQUNUQyxHQUFXLFFBQ1hDLEdBQVEsU0FDUkMsR0FBa0Isd0NBQ2xCQyxHQUFlLG9DQUVoQi8xQixHQUFPc0IsR0FBRzhELFFBQ1Q0d0IsVUFBVyxXQUNWLE1BQU9oMkIsR0FBT2kyQixNQUFPdHpCLEtBQUt1ekIsbUJBRTNCQSxlQUFnQixXQUNmLE1BQU92ekIsTUFBS3FDLElBQUksV0FFZixHQUFJK08sR0FBVy9ULEVBQU91aEIsS0FBTTVlLEtBQU0sV0FDbEMsT0FBT29SLEdBQVcvVCxFQUFPMEQsVUFBV3FRLEdBQWFwUixPQUVqRCtQLE9BQU8sV0FDUCxHQUFJOUwsR0FBT2pFLEtBQUtpRSxJQUVoQixPQUFPakUsTUFBSzJDLE9BQVN0RixFQUFRMkMsTUFBT2dwQixHQUFJLGNBQ3ZDb0ssR0FBYTN5QixLQUFNVCxLQUFLMkcsWUFBZXdzQixHQUFnQjF5QixLQUFNd0QsS0FDM0RqRSxLQUFLMFUsVUFBWTRWLEdBQTRCN3BCLEtBQU13RCxNQUV0RDVCLElBQUksU0FBVUgsRUFBR25DLEdBQ2pCLEdBQUlzUixHQUFNaFUsRUFBUTJDLE1BQU9xUixLQUV6QixPQUFjLE9BQVBBLEVBQ04sS0FDQWhVLEVBQU82RixRQUFTbU8sR0FDZmhVLEVBQU9nRixJQUFLZ1AsRUFBSyxTQUFVQSxHQUMxQixPQUFTMU8sS0FBTTVDLEVBQUs0QyxLQUFNa0UsTUFBT3dLLEVBQUkvTixRQUFTNHZCLEdBQU8sWUFFcER2d0IsS0FBTTVDLEVBQUs0QyxLQUFNa0UsTUFBT3dLLEVBQUkvTixRQUFTNHZCLEdBQU8sV0FDOUNoeUIsU0FNTDdELEVBQU9pMkIsTUFBUSxTQUFVcnBCLEVBQUd1cEIsR0FDM0IsR0FBSWIsR0FDSGMsS0FDQXRaLEVBQU0sU0FBVXZTLEVBQUtmLEdBRXBCQSxFQUFReEosRUFBT3NELFdBQVlrRyxHQUFVQSxJQUFxQixNQUFUQSxFQUFnQixHQUFLQSxFQUN0RTRzQixFQUFHQSxFQUFFdnpCLFFBQVd3ekIsbUJBQW9COXJCLEdBQVEsSUFBTThyQixtQkFBb0I3c0IsR0FTeEUsSUFMSzJzQixJQUFnQjUyQixZQUNwQjQyQixFQUFjbjJCLEVBQU9zMkIsY0FBZ0J0MkIsRUFBT3MyQixhQUFhSCxhQUlyRG4yQixFQUFPNkYsUUFBUytHLElBQVNBLEVBQUVySyxTQUFXdkMsRUFBT3FELGNBQWV1SixHQUVoRTVNLEVBQU9tRSxLQUFNeUksRUFBRyxXQUNma1EsRUFBS25hLEtBQUsyQyxLQUFNM0MsS0FBSzZHLGFBTXRCLEtBQU04ckIsSUFBVTFvQixHQUNmMnBCLEdBQWFqQixFQUFRMW9CLEVBQUcwb0IsR0FBVWEsRUFBYXJaLEVBS2pELE9BQU9zWixHQUFFaG1CLEtBQU0sS0FBTW5LLFFBQVMwdkIsR0FBSyxLQUdwQyxTQUFTWSxJQUFhakIsRUFBUTN1QixFQUFLd3ZCLEVBQWFyWixHQUMvQyxHQUFJeFgsRUFFSixJQUFLdEYsRUFBTzZGLFFBQVNjLEdBRXBCM0csRUFBT21FLEtBQU13QyxFQUFLLFNBQVU5QixFQUFHMnhCLEdBQ3pCTCxHQUFlUCxHQUFTeHlCLEtBQU1reUIsR0FFbEN4WSxFQUFLd1ksRUFBUWtCLEdBSWJELEdBQWFqQixFQUFTLEtBQXFCLGdCQUFOa0IsR0FBaUIzeEIsRUFBSSxJQUFPLElBQUsyeEIsRUFBR0wsRUFBYXJaLFNBSWxGLElBQU1xWixHQUFzQyxXQUF2Qm4yQixFQUFPNEcsS0FBTUQsR0FReENtVyxFQUFLd1ksRUFBUTN1QixPQU5iLEtBQU1yQixJQUFRcUIsR0FDYjR2QixHQUFhakIsRUFBUyxJQUFNaHdCLEVBQU8sSUFBS3FCLEVBQUtyQixHQUFRNndCLEVBQWFyWixHQVFyRTljLEVBQU9tRSxLQUFNLDBNQUVxRGtILE1BQU0sS0FBTSxTQUFVeEcsRUFBR1MsR0FHMUZ0RixFQUFPc0IsR0FBSWdFLEdBQVMsU0FBVW1DLEVBQU1uRyxHQUNuQyxNQUFPbUQsV0FBVTVCLE9BQVMsRUFDekJGLEtBQUtvb0IsR0FBSXpsQixFQUFNLEtBQU1tQyxFQUFNbkcsR0FDM0JxQixLQUFLOEQsUUFBU25CLE1BSWpCdEYsRUFBT3NCLEdBQUc4RCxRQUNUcXhCLE1BQU8sU0FBVUMsRUFBUUMsR0FDeEIsTUFBT2gwQixNQUFLOG5CLFdBQVlpTSxHQUFTaE0sV0FBWWlNLEdBQVNELElBR3ZERSxLQUFNLFNBQVUvUSxFQUFPcGUsRUFBTW5HLEdBQzVCLE1BQU9xQixNQUFLb29CLEdBQUlsRixFQUFPLEtBQU1wZSxFQUFNbkcsSUFFcEN1MUIsT0FBUSxTQUFVaFIsRUFBT3ZrQixHQUN4QixNQUFPcUIsTUFBSytELElBQUttZixFQUFPLEtBQU12a0I7RUFHL0J3MUIsU0FBVSxTQUFVMTFCLEVBQVV5a0IsRUFBT3BlLEVBQU1uRyxHQUMxQyxNQUFPcUIsTUFBS29vQixHQUFJbEYsRUFBT3prQixFQUFVcUcsRUFBTW5HLElBRXhDeTFCLFdBQVksU0FBVTMxQixFQUFVeWtCLEVBQU92a0IsR0FFdEMsTUFBNEIsS0FBckJtRCxVQUFVNUIsT0FBZUYsS0FBSytELElBQUt0RixFQUFVLE1BQVN1QixLQUFLK0QsSUFBS21mLEVBQU96a0IsR0FBWSxLQUFNRSxLQUdsRyxJQUVDMDFCLElBQ0FDLEdBRUFDLEdBQWFsM0IsRUFBTzRLLE1BRXBCdXNCLEdBQWMsS0FDZEMsR0FBUSxPQUNSQyxHQUFNLGdCQUNOQyxHQUFXLDZCQUVYQyxHQUFpQiw0REFDakJDLEdBQWEsaUJBQ2JDLEdBQVksUUFDWkMsR0FBTyw4Q0FHUEMsR0FBUTMzQixFQUFPc0IsR0FBR3VvQixLQVdsQitOLE1BT0FDLE1BR0FDLEdBQVcsS0FBS3YzQixPQUFPLElBSXhCLEtBQ0MwMkIsR0FBZXQzQixFQUFTc1gsS0FDdkIsTUFBTzdQLElBR1I2dkIsR0FBZXIzQixFQUFTaUksY0FBZSxLQUN2Q292QixHQUFhaGdCLEtBQU8sR0FDcEJnZ0IsR0FBZUEsR0FBYWhnQixLQUk3QitmLEdBQWVVLEdBQUs1MEIsS0FBTW0wQixHQUFhMXRCLGtCQUd2QyxTQUFTd3VCLElBQTZCQyxHQUdyQyxNQUFPLFVBQVVDLEVBQW9COWEsR0FFRCxnQkFBdkI4YSxLQUNYOWEsRUFBTzhhLEVBQ1BBLEVBQXFCLElBR3RCLElBQUkxSCxHQUNIMXJCLEVBQUksRUFDSnF6QixFQUFZRCxFQUFtQjF1QixjQUFjOUcsTUFBT2YsTUFFckQsSUFBSzFCLEVBQU9zRCxXQUFZNlosR0FFdkIsTUFBU29ULEVBQVcySCxFQUFVcnpCLEtBRVIsTUFBaEIwckIsRUFBUyxJQUNiQSxFQUFXQSxFQUFTNXZCLE1BQU8sSUFBTyxLQUNqQ3EzQixFQUFXekgsR0FBYXlILEVBQVd6SCxRQUFrQjFjLFFBQVNzSixLQUk5RDZhLEVBQVd6SCxHQUFheUgsRUFBV3pILFFBQWtCOXZCLEtBQU0wYyxJQVFqRSxRQUFTZ2IsSUFBK0JILEVBQVczeUIsRUFBUyt5QixFQUFpQkMsR0FFNUUsR0FBSUMsTUFDSEMsRUFBcUJQLElBQWNILEVBRXBDLFNBQVNXLEdBQVNqSSxHQUNqQixHQUFJalosRUFZSixPQVhBZ2hCLEdBQVcvSCxJQUFhLEVBQ3hCdndCLEVBQU9tRSxLQUFNNnpCLEVBQVd6SCxPQUFrQixTQUFVdmhCLEVBQUd5cEIsR0FDdEQsR0FBSUMsR0FBc0JELEVBQW9CcHpCLEVBQVMreUIsRUFBaUJDLEVBQ3hFLE9BQW1DLGdCQUF4QkssSUFBcUNILEdBQXFCRCxFQUFXSSxHQUlwRUgsSUFDRGpoQixFQUFXb2hCLEdBRGYsV0FITnJ6QixFQUFRNnlCLFVBQVVya0IsUUFBUzZrQixHQUMzQkYsRUFBU0UsSUFDRixLQUtGcGhCLEVBR1IsTUFBT2toQixHQUFTbnpCLEVBQVE2eUIsVUFBVyxNQUFVSSxFQUFXLE1BQVNFLEVBQVMsS0FNM0UsUUFBU0csSUFBWWh6QixFQUFRSixHQUM1QixHQUFJZ0YsR0FBSzNFLEVBQ1JnekIsRUFBYzU0QixFQUFPczJCLGFBQWFzQyxlQUVuQyxLQUFNcnVCLElBQU9oRixHQUNQQSxFQUFLZ0YsS0FBVWhMLGFBQ2pCcTVCLEVBQWFydUIsR0FBUTVFLEVBQVdDLElBQVNBLE9BQWdCMkUsR0FBUWhGLEVBQUtnRixHQU8xRSxPQUpLM0UsSUFDSjVGLEVBQU9vRixRQUFRLEVBQU1PLEVBQVFDLEdBR3ZCRCxFQUdSM0YsRUFBT3NCLEdBQUd1b0IsS0FBTyxTQUFVd0csRUFBS3dJLEVBQVF6MEIsR0FDdkMsR0FBb0IsZ0JBQVJpc0IsSUFBb0JzSCxHQUMvQixNQUFPQSxJQUFNbnpCLE1BQU83QixLQUFNOEIsVUFHM0IsSUFBSXJELEdBQVV3RixFQUFNa3lCLEVBQ25CbGMsRUFBT2phLEtBQ1ArRCxFQUFNMnBCLEVBQUl4dkIsUUFBUSxJQStDbkIsT0E3Q0s2RixJQUFPLElBQ1h0RixFQUFXaXZCLEVBQUkxdkIsTUFBTytGLEdBQ3RCMnBCLEVBQU1BLEVBQUkxdkIsTUFBTyxFQUFHK0YsSUFJaEIxRyxFQUFPc0QsV0FBWXUxQixJQUd2QnowQixFQUFXeTBCLEVBQ1hBLEVBQVN0NUIsV0FHRXM1QixHQUE0QixnQkFBWEEsS0FDNUJqeUIsRUFBTyxRQUlIZ1csRUFBSy9aLE9BQVMsR0FDbEI3QyxFQUFPc3dCLE1BQ05ELElBQUtBLEVBR0x6cEIsS0FBTUEsRUFDTjJwQixTQUFVLE9BQ1Y5b0IsS0FBTW94QixJQUNKdDBCLEtBQUssU0FBVXcwQixHQUdqQkQsRUFBV3IwQixVQUVYbVksRUFBS21TLEtBQU0zdEIsRUFJVnBCLEVBQU8sU0FBU2l1QixPQUFRanVCLEVBQU9pRCxVQUFXODFCLElBQWlCaDJCLEtBQU0zQixHQUdqRTIzQixLQUVDQyxTQUFVNTBCLEdBQVksU0FBVWkwQixFQUFPWSxHQUN6Q3JjLEVBQUt6WSxLQUFNQyxFQUFVMDBCLElBQWNULEVBQU1VLGFBQWNFLEVBQVFaLE1BSTFEMTFCLE1BSVIzQyxFQUFPbUUsTUFBUSxZQUFhLFdBQVksZUFBZ0IsWUFBYSxjQUFlLFlBQWMsU0FBVVUsRUFBRytCLEdBQzlHNUcsRUFBT3NCLEdBQUlzRixHQUFTLFNBQVV0RixHQUM3QixNQUFPcUIsTUFBS29vQixHQUFJbmtCLEVBQU10RixNQUl4QnRCLEVBQU9vRixRQUdOOHpCLE9BQVEsRUFHUkMsZ0JBQ0FDLFFBRUE5QyxjQUNDakcsSUFBSzRHLEdBQ0xyd0IsS0FBTSxNQUNOeXlCLFFBQVM5QixHQUFlbjBCLEtBQU00ekIsR0FBYyxJQUM1Q3BSLFFBQVEsRUFDUjBULGFBQWEsRUFDYjlJLE9BQU8sRUFDUCtJLFlBQWEsbURBYWJ0WSxTQUNDdVksSUFBSzFCLEdBQ0w5dUIsS0FBTSxhQUNOK2xCLEtBQU0sWUFDTjFtQixJQUFLLDRCQUNMb3hCLEtBQU0scUNBR1BsTyxVQUNDbGpCLElBQUssTUFDTDBtQixLQUFNLE9BQ04wSyxLQUFNLFFBR1BDLGdCQUNDcnhCLElBQUssY0FDTFcsS0FBTSxlQUNOeXdCLEtBQU0sZ0JBS1BFLFlBR0NDLFNBQVV6eUIsT0FHVjB5QixhQUFhLEVBR2JDLFlBQWE5NUIsRUFBT2lJLFVBR3BCOHhCLFdBQVkvNUIsRUFBT29JLFVBT3BCd3dCLGFBQ0N2SSxLQUFLLEVBQ0xodkIsU0FBUyxJQU9YMjRCLFVBQVcsU0FBVXIwQixFQUFRczBCLEdBQzVCLE1BQU9BLEdBR050QixHQUFZQSxHQUFZaHpCLEVBQVEzRixFQUFPczJCLGNBQWdCMkQsR0FHdkR0QixHQUFZMzRCLEVBQU9zMkIsYUFBYzN3QixJQUduQ3UwQixjQUFlbkMsR0FBNkJILElBQzVDdUMsY0FBZXBDLEdBQTZCRixJQUc1Q3ZILEtBQU0sU0FBVUQsRUFBS2hyQixHQUdBLGdCQUFSZ3JCLEtBQ1hockIsRUFBVWdyQixFQUNWQSxFQUFNOXdCLFdBSVA4RixFQUFVQSxLQUVWLElBQUkrMEIsR0FFSEMsRUFFQUMsRUFDQUMsRUFFQUMsRUFFQTlFLEVBRUErRSxFQUVBNTFCLEVBRUF1eEIsRUFBSXAyQixFQUFPZzZCLGFBQWUzMEIsR0FFMUJxMUIsRUFBa0J0RSxFQUFFLzBCLFNBQVcrMEIsRUFFL0J1RSxFQUFxQnZFLEVBQUUvMEIsVUFBYXE1QixFQUFnQngzQixVQUFZdzNCLEVBQWdCbjRCLFFBQy9FdkMsRUFBUTA2QixHQUNSMTZCLEVBQU8ybEIsTUFFUnBJLEVBQVd2ZCxFQUFPaUwsV0FDbEIydkIsRUFBbUI1NkIsRUFBT2djLFVBQVUsZUFFcEM2ZSxFQUFhekUsRUFBRXlFLGVBRWZDLEtBQ0FDLEtBRUExZCxFQUFRLEVBRVIyZCxFQUFXLFdBRVgzQyxHQUNDbnRCLFdBQVksRUFHWit2QixrQkFBbUIsU0FBVTF3QixHQUM1QixHQUFJOUgsRUFDSixJQUFlLElBQVY0YSxFQUFjLENBQ2xCLElBQU1rZCxFQUFrQixDQUN2QkEsSUFDQSxPQUFTOTNCLEVBQVE2MEIsR0FBU3gwQixLQUFNdzNCLEdBQy9CQyxFQUFpQjkzQixFQUFNLEdBQUc4RyxlQUFrQjlHLEVBQU8sR0FHckRBLEVBQVE4M0IsRUFBaUJod0IsRUFBSWhCLGVBRTlCLE1BQWdCLE9BQVQ5RyxFQUFnQixLQUFPQSxHQUkvQnk0QixzQkFBdUIsV0FDdEIsTUFBaUIsS0FBVjdkLEVBQWNpZCxFQUF3QixNQUk5Q2EsaUJBQWtCLFNBQVU3MUIsRUFBTWtFLEdBQ2pDLEdBQUk0eEIsR0FBUTkxQixFQUFLaUUsYUFLakIsT0FKTThULEtBQ0wvWCxFQUFPeTFCLEVBQXFCSyxHQUFVTCxFQUFxQkssSUFBVzkxQixFQUN0RXcxQixFQUFnQngxQixHQUFTa0UsR0FFbkI3RyxNQUlSMDRCLGlCQUFrQixTQUFVejBCLEdBSTNCLE1BSE15VyxLQUNMK1ksRUFBRWtGLFNBQVcxMEIsR0FFUGpFLE1BSVJrNEIsV0FBWSxTQUFVNzFCLEdBQ3JCLEdBQUk0RCxFQUNKLElBQUs1RCxFQUNKLEdBQWEsRUFBUnFZLEVBQ0osSUFBTXpVLElBQVE1RCxHQUViNjFCLEVBQVlqeUIsSUFBV2l5QixFQUFZanlCLEdBQVE1RCxFQUFLNEQsUUFJakR5dkIsR0FBTS9hLE9BQVF0WSxFQUFLcXpCLEVBQU1ZLFFBRzNCLE9BQU90MkIsT0FJUjQ0QixNQUFPLFNBQVVDLEdBQ2hCLEdBQUlDLEdBQVlELEdBQWNSLENBSzlCLE9BSktaLElBQ0pBLEVBQVVtQixNQUFPRSxHQUVsQmwzQixFQUFNLEVBQUdrM0IsR0FDRjk0QixNQXlDVixJQXBDQTRhLEVBQVNqWixRQUFTK3pCLEdBQVFXLFNBQVc0QixFQUFpQjlkLElBQ3REdWIsRUFBTXFELFFBQVVyRCxFQUFNOXpCLEtBQ3RCOHpCLEVBQU0vd0IsTUFBUSt3QixFQUFNN2EsS0FNcEI0WSxFQUFFL0YsTUFBVUEsR0FBTytGLEVBQUUvRixLQUFPNEcsSUFBaUIsSUFBS2h4QixRQUFTbXhCLEdBQU8sSUFDaEVueEIsUUFBU3d4QixHQUFXVCxHQUFjLEdBQU0sTUFHMUNaLEVBQUV4dkIsS0FBT3ZCLEVBQVFzMkIsUUFBVXQyQixFQUFRdUIsTUFBUXd2QixFQUFFdUYsUUFBVXZGLEVBQUV4dkIsS0FHekR3dkIsRUFBRThCLFVBQVlsNEIsRUFBT21CLEtBQU1pMUIsRUFBRTdGLFVBQVksS0FBTWhuQixjQUFjOUcsTUFBT2YsS0FBcUIsSUFHbkUsTUFBakIwMEIsRUFBRXdGLGNBQ05sRyxFQUFRZ0MsR0FBSzUwQixLQUFNc3pCLEVBQUUvRixJQUFJOW1CLGVBQ3pCNnNCLEVBQUV3RixlQUFrQmxHLEdBQ2pCQSxFQUFPLEtBQVFzQixHQUFjLElBQU90QixFQUFPLEtBQVFzQixHQUFjLEtBQ2hFdEIsRUFBTyxLQUF3QixVQUFmQSxFQUFPLEdBQWtCLEtBQU8sV0FDL0NzQixHQUFjLEtBQStCLFVBQXRCQSxHQUFjLEdBQWtCLEtBQU8sVUFLL0RaLEVBQUUzdUIsTUFBUTJ1QixFQUFFa0QsYUFBaUMsZ0JBQVhsRCxHQUFFM3VCLE9BQ3hDMnVCLEVBQUUzdUIsS0FBT3pILEVBQU9pMkIsTUFBT0csRUFBRTN1QixLQUFNMnVCLEVBQUVELGNBSWxDZ0MsR0FBK0JQLEdBQVl4QixFQUFHL3dCLEVBQVNnekIsR0FHeEMsSUFBVmhiLEVBQ0osTUFBT2diLEVBSVJvQyxHQUFjckUsRUFBRXhRLE9BR1g2VSxHQUFtQyxJQUFwQno2QixFQUFPazVCLFVBQzFCbDVCLEVBQU8ybEIsTUFBTWxmLFFBQVEsYUFJdEIydkIsRUFBRXh2QixLQUFPd3ZCLEVBQUV4dkIsS0FBSzFFLGNBR2hCazBCLEVBQUV5RixZQUFjckUsR0FBV3AwQixLQUFNZ3pCLEVBQUV4dkIsTUFJbkN5ekIsRUFBV2pFLEVBQUUvRixJQUdQK0YsRUFBRXlGLGFBR0Z6RixFQUFFM3VCLE9BQ040eUIsRUFBYWpFLEVBQUUvRixNQUFTOEcsR0FBWS96QixLQUFNaTNCLEdBQWEsSUFBTSxLQUFRakUsRUFBRTN1QixXQUVoRTJ1QixHQUFFM3VCLE1BSUwydUIsRUFBRTFsQixTQUFVLElBQ2hCMGxCLEVBQUUvRixJQUFNZ0gsR0FBSWowQixLQUFNaTNCLEdBR2pCQSxFQUFTcDBCLFFBQVNveEIsR0FBSyxPQUFTSCxNQUdoQ21ELEdBQWFsRCxHQUFZL3pCLEtBQU1pM0IsR0FBYSxJQUFNLEtBQVEsS0FBT25ELE9BSy9EZCxFQUFFMEYsYUFDRDk3QixFQUFPbTVCLGFBQWNrQixJQUN6QmhDLEVBQU04QyxpQkFBa0Isb0JBQXFCbjdCLEVBQU9tNUIsYUFBY2tCLElBRTlEcjZCLEVBQU9vNUIsS0FBTWlCLElBQ2pCaEMsRUFBTThDLGlCQUFrQixnQkFBaUJuN0IsRUFBT281QixLQUFNaUIsTUFLbkRqRSxFQUFFM3VCLE1BQVEydUIsRUFBRXlGLFlBQWN6RixFQUFFbUQsZUFBZ0IsR0FBU2wwQixFQUFRazBCLGNBQ2pFbEIsRUFBTThDLGlCQUFrQixlQUFnQi9FLEVBQUVtRCxhQUkzQ2xCLEVBQU04QyxpQkFDTCxTQUNBL0UsRUFBRThCLFVBQVcsSUFBTzlCLEVBQUVuVixRQUFTbVYsRUFBRThCLFVBQVUsSUFDMUM5QixFQUFFblYsUUFBU21WLEVBQUU4QixVQUFVLEtBQThCLE1BQXJCOUIsRUFBRThCLFVBQVcsR0FBYyxLQUFPSixHQUFXLFdBQWEsSUFDMUYxQixFQUFFblYsUUFBUyxLQUliLEtBQU1wYyxJQUFLdXhCLEdBQUUyRixRQUNaMUQsRUFBTThDLGlCQUFrQnQyQixFQUFHdXhCLEVBQUUyRixRQUFTbDNCLEdBSXZDLElBQUt1eEIsRUFBRTRGLGFBQWdCNUYsRUFBRTRGLFdBQVdwNEIsS0FBTTgyQixFQUFpQnJDLEVBQU9qQyxNQUFRLEdBQW1CLElBQVYvWSxHQUVsRixNQUFPZ2IsR0FBTWtELE9BSWRQLEdBQVcsT0FHWCxLQUFNbjJCLEtBQU82MkIsUUFBUyxFQUFHcDBCLE1BQU8sRUFBRzB4QixTQUFVLEdBQzVDWCxFQUFPeHpCLEdBQUt1eEIsRUFBR3Z4QixHQU9oQixJQUhBdTFCLEVBQVlqQyxHQUErQk4sR0FBWXpCLEVBQUcvd0IsRUFBU2d6QixHQUs1RCxDQUNOQSxFQUFNbnRCLFdBQWEsRUFHZHV2QixHQUNKRSxFQUFtQmwwQixRQUFTLFlBQWM0eEIsRUFBT2pDLElBRzdDQSxFQUFFNUYsT0FBUzRGLEVBQUV0VCxRQUFVLElBQzNCMFgsRUFBZXJ2QixXQUFXLFdBQ3pCa3RCLEVBQU1rRCxNQUFNLFlBQ1ZuRixFQUFFdFQsU0FHTixLQUNDekYsRUFBUSxFQUNSK2MsRUFBVTZCLEtBQU1uQixFQUFnQnYyQixHQUMvQixNQUFRNkMsR0FFVCxLQUFhLEVBQVJpVyxHQUlKLEtBQU1qVyxFQUhON0MsR0FBTSxHQUFJNkMsUUFyQlo3QyxHQUFNLEdBQUksZUE4QlgsU0FBU0EsR0FBTTAwQixFQUFRaUQsRUFBa0JDLEVBQVdKLEdBQ25ELEdBQUlLLEdBQVdWLEVBQVNwMEIsRUFBT3d4QixFQUFVdUQsRUFDeENiLEVBQWFVLENBR0MsS0FBVjdlLElBS0xBLEVBQVEsRUFHSG1kLEdBQ0p6WCxhQUFjeVgsR0FLZkosRUFBWTc2QixVQUdaKzZCLEVBQXdCeUIsR0FBVyxHQUduQzFELEVBQU1udEIsV0FBYSt0QixFQUFTLEVBQUksRUFBSSxFQUdwQ21ELEVBQVluRCxHQUFVLEtBQWdCLElBQVRBLEdBQTJCLE1BQVhBLEVBR3hDa0QsSUFDSnJELEVBQVd3RCxHQUFxQmxHLEVBQUdpQyxFQUFPOEQsSUFJM0NyRCxFQUFXeUQsR0FBYW5HLEVBQUcwQyxFQUFVVCxFQUFPK0QsR0FHdkNBLEdBR0NoRyxFQUFFMEYsYUFDTk8sRUFBV2hFLEVBQU00QyxrQkFBa0IsaUJBQzlCb0IsSUFDSnI4QixFQUFPbTVCLGFBQWNrQixHQUFhZ0MsR0FFbkNBLEVBQVdoRSxFQUFNNEMsa0JBQWtCLFFBQzlCb0IsSUFDSnI4QixFQUFPbzVCLEtBQU1pQixHQUFhZ0MsSUFLWixNQUFYcEQsR0FBNkIsU0FBWDdDLEVBQUV4dkIsS0FDeEI0MEIsRUFBYSxZQUdTLE1BQVh2QyxFQUNYdUMsRUFBYSxlQUliQSxFQUFhMUMsRUFBU3piLE1BQ3RCcWUsRUFBVTVDLEVBQVNyeEIsS0FDbkJILEVBQVF3eEIsRUFBU3h4QixNQUNqQjgwQixHQUFhOTBCLEtBS2RBLEVBQVFrMEIsR0FDSHZDLElBQVd1QyxLQUNmQSxFQUFhLFFBQ0MsRUFBVHZDLElBQ0pBLEVBQVMsS0FNWlosRUFBTVksT0FBU0EsRUFDZlosRUFBTW1ELFlBQWVVLEdBQW9CVixHQUFlLEdBR25EWSxFQUNKN2UsRUFBUy9XLFlBQWFrMEIsR0FBbUJnQixFQUFTRixFQUFZbkQsSUFFOUQ5YSxFQUFTaWYsV0FBWTlCLEdBQW1CckMsRUFBT21ELEVBQVlsMEIsSUFJNUQrd0IsRUFBTXdDLFdBQVlBLEdBQ2xCQSxFQUFhdDdCLFVBRVJrN0IsR0FDSkUsRUFBbUJsMEIsUUFBUzIxQixFQUFZLGNBQWdCLGFBQ3JEL0QsRUFBT2pDLEVBQUdnRyxFQUFZVixFQUFVcDBCLElBSXBDc3pCLEVBQWlCMWQsU0FBVXdkLEdBQW1CckMsRUFBT21ELElBRWhEZixJQUNKRSxFQUFtQmwwQixRQUFTLGdCQUFrQjR4QixFQUFPakMsTUFFM0NwMkIsRUFBT2s1QixRQUNoQmw1QixFQUFPMmxCLE1BQU1sZixRQUFRLGNBS3hCLE1BQU80eEIsSUFHUm9FLFFBQVMsU0FBVXBNLEVBQUs1b0IsRUFBTXJELEdBQzdCLE1BQU9wRSxHQUFPNkQsSUFBS3dzQixFQUFLNW9CLEVBQU1yRCxFQUFVLFNBR3pDczRCLFVBQVcsU0FBVXJNLEVBQUtqc0IsR0FDekIsTUFBT3BFLEdBQU82RCxJQUFLd3NCLEVBQUs5d0IsVUFBVzZFLEVBQVUsYUFJL0NwRSxFQUFPbUUsTUFBUSxNQUFPLFFBQVUsU0FBVVUsRUFBRzgyQixHQUM1QzM3QixFQUFRMjdCLEdBQVcsU0FBVXRMLEVBQUs1b0IsRUFBTXJELEVBQVV3QyxHQVFqRCxNQU5LNUcsR0FBT3NELFdBQVltRSxLQUN2QmIsRUFBT0EsR0FBUXhDLEVBQ2ZBLEVBQVdxRCxFQUNYQSxFQUFPbEksV0FHRFMsRUFBT3N3QixNQUNiRCxJQUFLQSxFQUNMenBCLEtBQU0rMEIsRUFDTnBMLFNBQVUzcEIsRUFDVmEsS0FBTUEsRUFDTmkwQixRQUFTdDNCLE1BU1osU0FBU2s0QixJQUFxQmxHLEVBQUdpQyxFQUFPOEQsR0FFdkMsR0FBSVEsR0FBSS8xQixFQUFNZzJCLEVBQWVDLEVBQzVCdFIsRUFBVzZLLEVBQUU3SyxTQUNiMk0sRUFBWTlCLEVBQUU4QixTQUdmLE9BQTBCLE1BQW5CQSxFQUFXLEdBQ2pCQSxFQUFVdG5CLFFBQ0wrckIsSUFBT3A5QixZQUNYbzlCLEVBQUt2RyxFQUFFa0YsVUFBWWpELEVBQU00QyxrQkFBa0IsZ0JBSzdDLElBQUswQixFQUNKLElBQU0vMUIsSUFBUTJrQixHQUNiLEdBQUtBLEVBQVUza0IsSUFBVTJrQixFQUFVM2tCLEdBQU94RCxLQUFNdTVCLEdBQU8sQ0FDdER6RSxFQUFVcmtCLFFBQVNqTixFQUNuQixPQU1ILEdBQUtzeEIsRUFBVyxJQUFPaUUsR0FDdEJTLEVBQWdCMUUsRUFBVyxPQUNyQixDQUVOLElBQU10eEIsSUFBUXUxQixHQUFZLENBQ3pCLElBQU1qRSxFQUFXLElBQU85QixFQUFFdUQsV0FBWS95QixFQUFPLElBQU1zeEIsRUFBVSxJQUFPLENBQ25FMEUsRUFBZ0JoMkIsQ0FDaEIsT0FFS2kyQixJQUNMQSxFQUFnQmoyQixHQUlsQmcyQixFQUFnQkEsR0FBaUJDLEVBTWxDLE1BQUtELElBQ0NBLElBQWtCMUUsRUFBVyxJQUNqQ0EsRUFBVXJrQixRQUFTK29CLEdBRWJULEVBQVdTLElBSm5CLFVBV0QsUUFBU0wsSUFBYW5HLEVBQUcwQyxFQUFVVCxFQUFPK0QsR0FDekMsR0FBSVUsR0FBT0MsRUFBU0MsRUFBTTEwQixFQUFLa2pCLEVBQzlCbU8sS0FFQXpCLEVBQVk5QixFQUFFOEIsVUFBVXYzQixPQUd6QixJQUFLdTNCLEVBQVcsR0FDZixJQUFNOEUsSUFBUTVHLEdBQUV1RCxXQUNmQSxFQUFZcUQsRUFBS3p6QixlQUFrQjZzQixFQUFFdUQsV0FBWXFELEVBSW5ERCxHQUFVN0UsRUFBVXRuQixPQUdwQixPQUFRbXNCLEVBY1AsR0FaSzNHLEVBQUVzRCxlQUFnQnFELEtBQ3RCMUUsRUFBT2pDLEVBQUVzRCxlQUFnQnFELElBQWNqRSxJQUlsQ3ROLEdBQVE0USxHQUFhaEcsRUFBRTZHLGFBQzVCbkUsRUFBVzFDLEVBQUU2RyxXQUFZbkUsRUFBVTFDLEVBQUU3RixXQUd0Qy9FLEVBQU91UixFQUNQQSxFQUFVN0UsRUFBVXRuQixRQUtuQixHQUFpQixNQUFabXNCLEVBRUpBLEVBQVV2UixNQUdKLElBQWMsTUFBVEEsR0FBZ0JBLElBQVN1UixFQUFVLENBTTlDLEdBSEFDLEVBQU9yRCxFQUFZbk8sRUFBTyxJQUFNdVIsSUFBYXBELEVBQVksS0FBT29ELElBRzFEQyxFQUNMLElBQU1GLElBQVNuRCxHQUlkLEdBREFyeEIsRUFBTXcwQixFQUFNenhCLE1BQU8sS0FDZC9DLEVBQUssS0FBUXkwQixJQUdqQkMsRUFBT3JELEVBQVluTyxFQUFPLElBQU1sakIsRUFBSyxLQUNwQ3F4QixFQUFZLEtBQU9yeEIsRUFBSyxLQUNiLENBRU4wMEIsS0FBUyxFQUNiQSxFQUFPckQsRUFBWW1ELEdBR1JuRCxFQUFZbUQsTUFBWSxJQUNuQ0MsRUFBVXowQixFQUFLLEdBQ2Y0dkIsRUFBVXJrQixRQUFTdkwsRUFBSyxJQUV6QixPQU9KLEdBQUswMEIsS0FBUyxFQUdiLEdBQUtBLEdBQVE1RyxFQUFHLFVBQ2YwQyxFQUFXa0UsRUFBTWxFLE9BRWpCLEtBQ0NBLEVBQVdrRSxFQUFNbEUsR0FDaEIsTUFBUTF4QixHQUNULE9BQVNpVyxNQUFPLGNBQWUvVixNQUFPMDFCLEVBQU81MUIsRUFBSSxzQkFBd0Jva0IsRUFBTyxPQUFTdVIsSUFRL0YsT0FBUzFmLE1BQU8sVUFBVzVWLEtBQU1xeEIsR0FHbEM5NEIsRUFBT2c2QixXQUNOL1ksU0FDQ3BZLE9BQVEsNkZBRVQwaUIsVUFDQzFpQixPQUFRLHVCQUVUOHdCLFlBQ0N1RCxjQUFlLFNBQVVsMEIsR0FFeEIsTUFEQWhKLEdBQU8ySSxXQUFZSyxHQUNaQSxNQU1WaEosRUFBT2s2QixjQUFlLFNBQVUsU0FBVTlELEdBQ3BDQSxFQUFFMWxCLFFBQVVuUixZQUNoQjYyQixFQUFFMWxCLE9BQVEsR0FFTjBsQixFQUFFd0YsY0FDTnhGLEVBQUV4dkIsS0FBTyxTQUtYNUcsRUFBT202QixjQUFlLFNBQVUsU0FBVS9ELEdBRXpDLEdBQUtBLEVBQUV3RixZQUFjLENBQ3BCLEdBQUkveUIsR0FBUXpFLENBQ1osUUFDQzYzQixLQUFNLFNBQVVqdEIsRUFBR2dxQixHQUNsQm53QixFQUFTN0ksRUFBTyxZQUFZdWhCLE1BQzNCaVAsT0FBTyxFQUNQMk0sUUFBUy9HLEVBQUVnSCxjQUNYNzNCLElBQUs2d0IsRUFBRS9GLE1BQ0x0RixHQUNGLGFBQ0EzbUIsRUFBVyxTQUFVaTVCLEdBQ3BCeDBCLEVBQU9kLFNBQ1AzRCxFQUFXLEtBQ05pNUIsR0FDSnJFLEVBQXVCLFVBQWJxRSxFQUFJejJCLEtBQW1CLElBQU0sSUFBS3kyQixFQUFJejJCLFFBSW5EaEgsRUFBU3FKLEtBQUtDLFlBQWFMLEVBQVEsS0FFcEMweUIsTUFBTyxXQUNEbjNCLEdBQ0pBLFFBTUwsSUFBSWs1QixPQUNIQyxHQUFTLG1CQUdWdjlCLEdBQU9nNkIsV0FDTndELE1BQU8sV0FDUEMsY0FBZSxXQUNkLEdBQUlyNUIsR0FBV2s1QixHQUFhcndCLE9BQVdqTixFQUFPOEYsUUFBVSxJQUFRb3hCLElBRWhFLE9BREF2MEIsTUFBTXlCLElBQWEsRUFDWkEsS0FLVHBFLEVBQU9rNkIsY0FBZSxhQUFjLFNBQVU5RCxFQUFHc0gsRUFBa0JyRixHQUVsRSxHQUFJc0YsR0FBY0MsRUFBYUMsRUFDOUJDLEVBQVcxSCxFQUFFb0gsU0FBVSxJQUFXRCxHQUFPbjZCLEtBQU1nekIsRUFBRS9GLEtBQ2hELE1BQ2tCLGdCQUFYK0YsR0FBRTN1QixRQUF3QjJ1QixFQUFFbUQsYUFBZSxJQUFLMTRCLFFBQVEsc0NBQXdDMDhCLEdBQU9uNkIsS0FBTWd6QixFQUFFM3VCLE9BQVUsT0FJbEksT0FBS3EyQixJQUFpQyxVQUFyQjFILEVBQUU4QixVQUFXLElBRzdCeUYsRUFBZXZILEVBQUVxSCxjQUFnQno5QixFQUFPc0QsV0FBWTh5QixFQUFFcUgsZUFDckRySCxFQUFFcUgsZ0JBQ0ZySCxFQUFFcUgsY0FHRUssRUFDSjFILEVBQUcwSCxHQUFhMUgsRUFBRzBILEdBQVc3M0IsUUFBU3MzQixHQUFRLEtBQU9JLEdBQzNDdkgsRUFBRW9ILFNBQVUsSUFDdkJwSCxFQUFFL0YsTUFBUzhHLEdBQVkvekIsS0FBTWd6QixFQUFFL0YsS0FBUSxJQUFNLEtBQVErRixFQUFFb0gsTUFBUSxJQUFNRyxHQUl0RXZILEVBQUV1RCxXQUFXLGVBQWlCLFdBSTdCLE1BSE1rRSxJQUNMNzlCLEVBQU9zSCxNQUFPcTJCLEVBQWUsbUJBRXZCRSxFQUFtQixJQUkzQnpILEVBQUU4QixVQUFXLEdBQU0sT0FHbkIwRixFQUFjdCtCLEVBQVFxK0IsR0FDdEJyK0IsRUFBUXErQixHQUFpQixXQUN4QkUsRUFBb0JwNUIsV0FJckI0ekIsRUFBTS9hLE9BQU8sV0FFWmhlLEVBQVFxK0IsR0FBaUJDLEVBR3BCeEgsRUFBR3VILEtBRVB2SCxFQUFFcUgsY0FBZ0JDLEVBQWlCRCxjQUduQ0gsR0FBYTc4QixLQUFNazlCLElBSWZFLEdBQXFCNzlCLEVBQU9zRCxXQUFZczZCLElBQzVDQSxFQUFhQyxFQUFtQixJQUdqQ0EsRUFBb0JELEVBQWNyK0IsWUFJNUIsVUF0RFIsWUF5RERTLEVBQU9zMkIsYUFBYXlILElBQU0sV0FDekIsSUFDQyxNQUFPLElBQUlDLGdCQUNWLE1BQU81MkIsS0FHVixJQUFJNjJCLElBQWVqK0IsRUFBT3MyQixhQUFheUgsTUFDdENHLElBRUMsRUFBRyxJQUdIQyxLQUFNLEtBS1BDLEdBQVEsRUFDUkMsS0FFSS8rQixHQUFPZy9CLGVBQ1h0K0IsRUFBUVYsR0FBU3lyQixHQUFJLFNBQVUsV0FDOUIsSUFBSyxHQUFJeGdCLEtBQU84ekIsSUFDZkEsR0FBYzl6QixJQUVmOHpCLElBQWU5K0IsWUFJakJTLEVBQU9zTCxRQUFRaXpCLE9BQVNOLElBQWtCLG1CQUFxQkEsSUFDL0RqK0IsRUFBT3NMLFFBQVFnbEIsS0FBTzJOLEtBQWlCQSxHQUV2Q2orQixFQUFPbTZCLGNBQWMsU0FBVTkwQixHQUM5QixHQUFJakIsRUFFSixPQUFLcEUsR0FBT3NMLFFBQVFpekIsTUFBUU4sS0FBaUI1NEIsRUFBUXUyQixhQUVuREssS0FBTSxTQUFVRixFQUFTL0MsR0FDeEIsR0FBSW4wQixHQUFHZ0wsRUFDTmt1QixFQUFNMTRCLEVBQVEwNEIsS0FHZixJQUZBQSxFQUFJUyxLQUFNbjVCLEVBQVF1QixLQUFNdkIsRUFBUWdyQixJQUFLaHJCLEVBQVFtckIsTUFBT25yQixFQUFRbzVCLFNBQVVwNUIsRUFBUTZTLFVBRXpFN1MsRUFBUXE1QixVQUNaLElBQU03NUIsSUFBS1EsR0FBUXE1QixVQUNsQlgsRUFBS2w1QixHQUFNUSxFQUFRcTVCLFVBQVc3NUIsRUFJM0JRLEdBQVFpMkIsVUFBWXlDLEVBQUkxQyxrQkFDNUIwQyxFQUFJMUMsaUJBQWtCaDJCLEVBQVFpMkIsVUFPekJqMkIsRUFBUXUyQixhQUFnQkcsRUFBUSxzQkFDckNBLEVBQVEsb0JBQXNCLGlCQUcvQixLQUFNbDNCLElBQUtrM0IsR0FDVmdDLEVBQUk1QyxpQkFBa0J0MkIsRUFBR2szQixFQUFTbDNCLEdBR25DVCxHQUFXLFNBQVV3QyxHQUNwQixNQUFPLFlBQ0R4QyxVQUNHaTZCLElBQWN4dUIsR0FDckJ6TCxFQUFXMjVCLEVBQUlZLE9BQVNaLEVBQUlhLFFBQVUsS0FDeEIsVUFBVGg0QixFQUNKbTNCLEVBQUl4QyxRQUNnQixVQUFUMzBCLEVBQ1hveUIsRUFFQytFLEVBQUk5RSxRQUFVLElBQ2Q4RSxFQUFJdkMsWUFHTHhDLEVBQ0NrRixHQUFrQkgsRUFBSTlFLFNBQVk4RSxFQUFJOUUsT0FDdEM4RSxFQUFJdkMsV0FJd0IsZ0JBQXJCdUMsR0FBSWhGLGNBQ1YvdkIsS0FBTSswQixFQUFJaEYsY0FDUHg1QixVQUNKdytCLEVBQUk3Qyw0QkFPVDZDLEVBQUlZLE9BQVN2NkIsSUFDYjI1QixFQUFJYSxRQUFVeDZCLEVBQVMsU0FFdkJBLEVBQVdpNkIsR0FBZXh1QixFQUFLdXVCLE1BQWFoNkIsRUFBUyxTQUlyRDI1QixFQUFJOUIsS0FBTTUyQixFQUFRdzJCLFlBQWN4MkIsRUFBUW9DLE1BQVEsT0FFakQ4ekIsTUFBTyxXQUNEbjNCLEdBQ0pBLE1BdEVKLFdBNEVELElBQUl5NkIsSUFBT0MsR0FDVkMsR0FBVyx5QkFDWEMsR0FBYXR4QixPQUFRLGlCQUFtQmxNLEVBQVksY0FBZSxLQUNuRXk5QixHQUFPLGNBQ1BDLElBQXdCQyxJQUN4QkMsSUFDQzVGLEtBQU0sU0FBVWpZLEVBQU0vWCxHQUNyQixHQUFJNjFCLEdBQVExOEIsS0FBSzI4QixZQUFhL2QsRUFBTS9YLEdBQ25DN0QsRUFBUzA1QixFQUFNaHVCLE1BQ2Zxa0IsRUFBUXNKLEdBQU9sOEIsS0FBTTBHLEdBQ3JCKzFCLEVBQU83SixHQUFTQSxFQUFPLEtBQVMxMUIsRUFBT3d6QixVQUFXalMsR0FBUyxHQUFLLE1BR2hFekwsR0FBVTlWLEVBQU93ekIsVUFBV2pTLElBQW1CLE9BQVRnZSxJQUFrQjU1QixJQUN2RHE1QixHQUFPbDhCLEtBQU05QyxFQUFPNHlCLElBQUt5TSxFQUFNMzhCLEtBQU02ZSxJQUN0Q2llLEVBQVEsRUFDUkMsRUFBZ0IsRUFFakIsSUFBSzNwQixHQUFTQSxFQUFPLEtBQVF5cEIsRUFBTyxDQUVuQ0EsRUFBT0EsR0FBUXpwQixFQUFPLEdBR3RCNGYsRUFBUUEsTUFHUjVmLEdBQVNuUSxHQUFVLENBRW5CLEdBR0M2NUIsR0FBUUEsR0FBUyxLQUdqQjFwQixHQUFnQjBwQixFQUNoQngvQixFQUFPZ0wsTUFBT3EwQixFQUFNMzhCLEtBQU02ZSxFQUFNekwsRUFBUXlwQixTQUkvQkMsS0FBV0EsRUFBUUgsRUFBTWh1QixNQUFRMUwsSUFBcUIsSUFBVjY1QixLQUFpQkMsR0FheEUsTUFUSy9KLEtBQ0o1ZixFQUFRdXBCLEVBQU12cEIsT0FBU0EsSUFBVW5RLEdBQVUsRUFDM0MwNUIsRUFBTUUsS0FBT0EsRUFFYkYsRUFBTXA2QixJQUFNeXdCLEVBQU8sR0FDbEI1ZixHQUFVNGYsRUFBTyxHQUFNLEdBQU1BLEVBQU8sSUFDbkNBLEVBQU8sSUFHSDJKLElBS1YsU0FBU0ssTUFJUixNQUhBdjBCLFlBQVcsV0FDVjB6QixHQUFRdC9CLFlBRUFzL0IsR0FBUTcrQixFQUFPNEssTUFHekIsUUFBUzAwQixJQUFhOTFCLEVBQU8rWCxFQUFNb2UsR0FDbEMsR0FBSU4sR0FDSE8sR0FBZVIsR0FBVTdkLFFBQWVoaEIsT0FBUTYrQixHQUFVLE1BQzFEcmlCLEVBQVEsRUFDUmxhLEVBQVMrOEIsRUFBVy84QixNQUNyQixNQUFnQkEsRUFBUmthLEVBQWdCQSxJQUN2QixHQUFNc2lCLEVBQVFPLEVBQVk3aUIsR0FBUW5aLEtBQU0rN0IsRUFBV3BlLEVBQU0vWCxHQUd4RCxNQUFPNjFCLEdBS1YsUUFBU1EsSUFBV245QixFQUFNbzlCLEVBQVl6NkIsR0FDckMsR0FBSWtRLEdBQ0h3cUIsRUFDQWhqQixFQUFRLEVBQ1JsYSxFQUFTcThCLEdBQW9CcjhCLE9BQzdCMGEsRUFBV3ZkLEVBQU9pTCxXQUFXcVMsT0FBUSxpQkFFN0IwaUIsR0FBS3Q5QixPQUViczlCLEVBQU8sV0FDTixHQUFLRCxFQUNKLE9BQU8sQ0FFUixJQUFJRSxHQUFjcEIsSUFBU2EsS0FDMUJsaEIsRUFBWXpZLEtBQUt3ZSxJQUFLLEVBQUdvYixFQUFVTyxVQUFZUCxFQUFVUSxTQUFXRixHQUVwRXRtQixFQUFPNkUsRUFBWW1oQixFQUFVUSxVQUFZLEVBQ3pDQyxFQUFVLEVBQUl6bUIsRUFDZG9ELEVBQVEsRUFDUmxhLEVBQVM4OEIsRUFBVVUsT0FBT3g5QixNQUUzQixNQUFnQkEsRUFBUmthLEVBQWlCQSxJQUN4QjRpQixFQUFVVSxPQUFRdGpCLEdBQVF1akIsSUFBS0YsRUFLaEMsT0FGQTdpQixHQUFTcUIsV0FBWWxjLEdBQVFpOUIsRUFBV1MsRUFBUzVoQixJQUVsQyxFQUFWNGhCLEdBQWV2OUIsRUFDWjJiLEdBRVBqQixFQUFTL1csWUFBYTlELEdBQVFpOUIsS0FDdkIsSUFHVEEsRUFBWXBpQixFQUFTalosU0FDcEI1QixLQUFNQSxFQUNOZ21CLE1BQU8xb0IsRUFBT29GLFVBQVkwNkIsR0FDMUJTLEtBQU12Z0MsRUFBT29GLFFBQVEsR0FBUW83QixrQkFBcUJuN0IsR0FDbERvN0IsbUJBQW9CWCxFQUNwQjFILGdCQUFpQi95QixFQUNqQjY2QixVQUFXckIsSUFBU2EsS0FDcEJTLFNBQVU5NkIsRUFBUTg2QixTQUNsQkUsVUFDQWYsWUFBYSxTQUFVL2QsRUFBTXRjLEdBQzVCLEdBQUlvNkIsR0FBUXIvQixFQUFPMGdDLE1BQU9oK0IsRUFBTWk5QixFQUFVWSxLQUFNaGYsRUFBTXRjLEVBQ3BEMDZCLEVBQVVZLEtBQUtDLGNBQWVqZixJQUFVb2UsRUFBVVksS0FBS0ksT0FFekQsT0FEQWhCLEdBQVVVLE9BQU81L0IsS0FBTTQrQixHQUNoQkEsR0FFUjdjLEtBQU0sU0FBVW9lLEdBQ2YsR0FBSTdqQixHQUFRLEVBR1hsYSxFQUFTKzlCLEVBQVVqQixFQUFVVSxPQUFPeDlCLE9BQVMsQ0FDOUMsSUFBS2s5QixFQUNKLE1BQU9wOUIsS0FHUixLQURBbzlCLEdBQVUsRUFDTWw5QixFQUFSa2EsRUFBaUJBLElBQ3hCNGlCLEVBQVVVLE9BQVF0akIsR0FBUXVqQixJQUFLLEVBVWhDLE9BTEtNLEdBQ0pyakIsRUFBUy9XLFlBQWE5RCxHQUFRaTlCLEVBQVdpQixJQUV6Q3JqQixFQUFTaWYsV0FBWTk1QixHQUFRaTlCLEVBQVdpQixJQUVsQ2orQixRQUdUK2xCLEVBQVFpWCxFQUFValgsS0FJbkIsS0FGQW1ZLEdBQVluWSxFQUFPaVgsRUFBVVksS0FBS0MsZUFFbEIzOUIsRUFBUmthLEVBQWlCQSxJQUV4QixHQURBeEgsRUFBUzJwQixHQUFxQm5pQixHQUFRblosS0FBTSs3QixFQUFXajlCLEVBQU1nbUIsRUFBT2lYLEVBQVVZLE1BRTdFLE1BQU9ockIsRUFtQlQsT0FmQXZWLEdBQU9nRixJQUFLMGpCLEVBQU80VyxHQUFhSyxHQUUzQjMvQixFQUFPc0QsV0FBWXE4QixFQUFVWSxLQUFLenFCLFFBQ3RDNnBCLEVBQVVZLEtBQUt6cUIsTUFBTWxTLEtBQU1sQixFQUFNaTlCLEdBR2xDMy9CLEVBQU80aUIsR0FBR2tlLE1BQ1Q5Z0MsRUFBT29GLE9BQVE0NkIsR0FDZHQ5QixLQUFNQSxFQUNOcStCLEtBQU1wQixFQUNOemQsTUFBT3lkLEVBQVVZLEtBQUtyZSxTQUtqQnlkLEVBQVUxaEIsU0FBVTBoQixFQUFVWSxLQUFLdGlCLFVBQ3hDMVosS0FBTW83QixFQUFVWSxLQUFLaDhCLEtBQU1vN0IsRUFBVVksS0FBS3ZILFVBQzFDeGIsS0FBTW1pQixFQUFVWSxLQUFLL2lCLE1BQ3JCRixPQUFRcWlCLEVBQVVZLEtBQUtqakIsUUFHMUIsUUFBU3VqQixJQUFZblksRUFBTzhYLEdBQzNCLEdBQUl6akIsR0FBT3pYLEVBQU1xN0IsRUFBUW4zQixFQUFPNlksQ0FHaEMsS0FBTXRGLElBQVMyTCxHQWVkLEdBZEFwakIsRUFBT3RGLEVBQU9vSixVQUFXMlQsR0FDekI0akIsRUFBU0gsRUFBZWw3QixHQUN4QmtFLEVBQVFrZixFQUFPM0wsR0FDVi9jLEVBQU82RixRQUFTMkQsS0FDcEJtM0IsRUFBU24zQixFQUFPLEdBQ2hCQSxFQUFRa2YsRUFBTzNMLEdBQVV2VCxFQUFPLElBRzVCdVQsSUFBVXpYLElBQ2RvakIsRUFBT3BqQixHQUFTa0UsUUFDVGtmLEdBQU8zTCxJQUdmc0YsRUFBUXJpQixFQUFPcXpCLFNBQVUvdEIsR0FDcEIrYyxHQUFTLFVBQVlBLEdBQVEsQ0FDakM3WSxFQUFRNlksRUFBTW1ULE9BQVFoc0IsU0FDZmtmLEdBQU9wakIsRUFJZCxLQUFNeVgsSUFBU3ZULEdBQ051VCxJQUFTMkwsS0FDaEJBLEVBQU8zTCxHQUFVdlQsRUFBT3VULEdBQ3hCeWpCLEVBQWV6akIsR0FBVTRqQixPQUkzQkgsR0FBZWw3QixHQUFTcTdCLEVBSzNCM2dDLEVBQU82L0IsVUFBWTcvQixFQUFPb0YsT0FBUXk2QixJQUVqQ21CLFFBQVMsU0FBVXRZLEVBQU90a0IsR0FDcEJwRSxFQUFPc0QsV0FBWW9sQixJQUN2QnRrQixFQUFXc2tCLEVBQ1hBLEdBQVUsTUFFVkEsRUFBUUEsRUFBTXJkLE1BQU0sSUFHckIsSUFBSWtXLEdBQ0h4RSxFQUFRLEVBQ1JsYSxFQUFTNmxCLEVBQU03bEIsTUFFaEIsTUFBZ0JBLEVBQVJrYSxFQUFpQkEsSUFDeEJ3RSxFQUFPbUgsRUFBTzNMLEdBQ2RxaUIsR0FBVTdkLEdBQVM2ZCxHQUFVN2QsT0FDN0I2ZCxHQUFVN2QsR0FBTzFOLFFBQVN6UCxJQUk1QjY4QixVQUFXLFNBQVU3OEIsRUFBVWlxQixHQUN6QkEsRUFDSjZRLEdBQW9CcnJCLFFBQVN6UCxHQUU3Qjg2QixHQUFvQnorQixLQUFNMkQsS0FLN0IsU0FBUys2QixJQUFrQno4QixFQUFNZ21CLEVBQU82WCxHQUV2QyxHQUFJaGYsR0FBTS9YLEVBQU80cEIsRUFBUWlNLEVBQU9oZCxFQUFPNmUsRUFDdENILEVBQU9wK0IsS0FDUGdvQixLQUNBM2YsRUFBUXRJLEVBQUtzSSxNQUNiZ29CLEVBQVN0d0IsRUFBS1EsVUFBWXd2QixHQUFVaHdCLEdBQ3BDeStCLEVBQVd4Z0IsRUFBVTljLElBQUtuQixFQUFNLFNBRzNCNjlCLEdBQUtyZSxRQUNWRyxFQUFRcmlCLEVBQU9zaUIsWUFBYTVmLEVBQU0sTUFDWCxNQUFsQjJmLEVBQU0rZSxXQUNWL2UsRUFBTStlLFNBQVcsRUFDakJGLEVBQVU3ZSxFQUFNN0ssTUFBTWtGLEtBQ3RCMkYsRUFBTTdLLE1BQU1rRixLQUFPLFdBQ1oyRixFQUFNK2UsVUFDWEYsTUFJSDdlLEVBQU0rZSxXQUVOTCxFQUFLempCLE9BQU8sV0FHWHlqQixFQUFLempCLE9BQU8sV0FDWCtFLEVBQU0rZSxXQUNBcGhDLEVBQU9raUIsTUFBT3hmLEVBQU0sTUFBT0csUUFDaEN3ZixFQUFNN0ssTUFBTWtGLFlBT08sSUFBbEJoYSxFQUFLUSxXQUFvQixVQUFZd2xCLElBQVMsU0FBV0EsTUFLN0Q2WCxFQUFLYyxVQUFhcjJCLEVBQU1xMkIsU0FBVXIyQixFQUFNczJCLFVBQVd0MkIsRUFBTXUyQixXQUlsQixXQUFsQ3ZoQyxFQUFPNHlCLElBQUtsd0IsRUFBTSxZQUNXLFNBQWhDMUMsRUFBTzR5QixJQUFLbHdCLEVBQU0sV0FFbkJzSSxFQUFNaW5CLFFBQVUsaUJBSWJzTyxFQUFLYyxXQUNUcjJCLEVBQU1xMkIsU0FBVyxTQUNqQk4sRUFBS3pqQixPQUFPLFdBQ1h0UyxFQUFNcTJCLFNBQVdkLEVBQUtjLFNBQVUsR0FDaENyMkIsRUFBTXMyQixVQUFZZixFQUFLYyxTQUFVLEdBQ2pDcjJCLEVBQU11MkIsVUFBWWhCLEVBQUtjLFNBQVUsS0FNbkMsS0FBTTlmLElBQVFtSCxHQUViLEdBREFsZixFQUFRa2YsRUFBT25ILEdBQ1Z3ZCxHQUFTajhCLEtBQU0wRyxHQUFVLENBRzdCLFNBRk9rZixHQUFPbkgsR0FDZDZSLEVBQVNBLEdBQW9CLFdBQVY1cEIsRUFDZEEsS0FBWXdwQixFQUFTLE9BQVMsUUFBVyxDQUc3QyxHQUFlLFNBQVZ4cEIsSUFBb0IyM0IsR0FBWUEsRUFBVTVmLEtBQVdoaUIsVUFHekQsUUFGQXl6QixJQUFTLEVBS1hySSxFQUFNcEosR0FBUzRmLEdBQVlBLEVBQVU1ZixJQUFVdmhCLEVBQU9nTCxNQUFPdEksRUFBTTZlLEdBSXJFLElBQU12aEIsRUFBT3FILGNBQWVzakIsR0FBUyxDQUMvQndXLEVBQ0MsVUFBWUEsS0FDaEJuTyxFQUFTbU8sRUFBU25PLFFBR25CbU8sRUFBV3hnQixFQUFVclcsT0FBUTVILEVBQU0sYUFJL0Iwd0IsSUFDSitOLEVBQVNuTyxRQUFVQSxHQUVmQSxFQUNKaHpCLEVBQVEwQyxHQUFPcXdCLE9BRWZnTyxFQUFLeDhCLEtBQUssV0FDVHZFLEVBQVEwQyxHQUFPeXdCLFNBR2pCNE4sRUFBS3g4QixLQUFLLFdBQ1QsR0FBSWdkLEVBRUpaLEdBQVU1WSxPQUFRckYsRUFBTSxTQUN4QixLQUFNNmUsSUFBUW9KLEdBQ2IzcUIsRUFBT2dMLE1BQU90SSxFQUFNNmUsRUFBTW9KLEVBQU1wSixLQUdsQyxLQUFNQSxJQUFRb0osR0FDYjBVLEVBQVFDLEdBQWF0TSxFQUFTbU8sRUFBVTVmLEdBQVMsRUFBR0EsRUFBTXdmLEdBRWxEeGYsSUFBUTRmLEtBQ2ZBLEVBQVU1ZixHQUFTOGQsRUFBTXZwQixNQUNwQmtkLElBQ0pxTSxFQUFNcDZCLElBQU1vNkIsRUFBTXZwQixNQUNsQnVwQixFQUFNdnBCLE1BQWlCLFVBQVR5TCxHQUE2QixXQUFUQSxFQUFvQixFQUFJLEtBTy9ELFFBQVNtZixJQUFPaCtCLEVBQU0yQyxFQUFTa2MsRUFBTXRjLEVBQUswN0IsR0FDekMsTUFBTyxJQUFJRCxJQUFNcCtCLFVBQVVmLEtBQU1tQixFQUFNMkMsRUFBU2tjLEVBQU10YyxFQUFLMDdCLEdBRTVEM2dDLEVBQU8wZ0MsTUFBUUEsR0FFZkEsR0FBTXArQixXQUNMRSxZQUFhaytCLEdBQ2JuL0IsS0FBTSxTQUFVbUIsRUFBTTJDLEVBQVNrYyxFQUFNdGMsRUFBSzA3QixFQUFRcEIsR0FDakQ1OEIsS0FBS0QsS0FBT0EsRUFDWkMsS0FBSzRlLEtBQU9BLEVBQ1o1ZSxLQUFLZytCLE9BQVNBLEdBQVUsUUFDeEJoK0IsS0FBSzBDLFFBQVVBLEVBQ2YxQyxLQUFLbVQsTUFBUW5ULEtBQUtpSSxJQUFNakksS0FBSzBPLE1BQzdCMU8sS0FBS3NDLElBQU1BLEVBQ1h0QyxLQUFLNDhCLEtBQU9BLElBQVV2L0IsRUFBT3d6QixVQUFXalMsR0FBUyxHQUFLLE9BRXZEbFEsSUFBSyxXQUNKLEdBQUlnUixHQUFRcWUsR0FBTTFiLFVBQVdyaUIsS0FBSzRlLEtBRWxDLE9BQU9jLElBQVNBLEVBQU14ZSxJQUNyQndlLEVBQU14ZSxJQUFLbEIsTUFDWCs5QixHQUFNMWIsVUFBVWdELFNBQVNua0IsSUFBS2xCLE9BRWhDMjlCLElBQUssU0FBVUYsR0FDZCxHQUFJb0IsR0FDSG5mLEVBQVFxZSxHQUFNMWIsVUFBV3JpQixLQUFLNGUsS0FvQi9CLE9BakJDNWUsTUFBS2twQixJQUFNMlYsRUFEUDcrQixLQUFLMEMsUUFBUTg2QixTQUNFbmdDLEVBQU8yZ0MsT0FBUWgrQixLQUFLZytCLFFBQ3RDUCxFQUFTejlCLEtBQUswQyxRQUFRODZCLFNBQVdDLEVBQVMsRUFBRyxFQUFHejlCLEtBQUswQyxRQUFRODZCLFVBRzNDQyxFQUVwQno5QixLQUFLaUksS0FBUWpJLEtBQUtzQyxJQUFNdEMsS0FBS21ULE9BQVUwckIsRUFBUTcrQixLQUFLbVQsTUFFL0NuVCxLQUFLMEMsUUFBUW84QixNQUNqQjkrQixLQUFLMEMsUUFBUW84QixLQUFLNzlCLEtBQU1qQixLQUFLRCxLQUFNQyxLQUFLaUksSUFBS2pJLE1BR3pDMGYsR0FBU0EsRUFBTWYsSUFDbkJlLEVBQU1mLElBQUszZSxNQUVYKzlCLEdBQU0xYixVQUFVZ0QsU0FBUzFHLElBQUszZSxNQUV4QkEsT0FJVCs5QixHQUFNcCtCLFVBQVVmLEtBQUtlLFVBQVlvK0IsR0FBTXArQixVQUV2Q28rQixHQUFNMWIsV0FDTGdELFVBQ0Nua0IsSUFBSyxTQUFVdzdCLEdBQ2QsR0FBSTlwQixFQUVKLE9BQWlDLE9BQTVCOHBCLEVBQU0zOEIsS0FBTTI4QixFQUFNOWQsT0FDcEI4ZCxFQUFNMzhCLEtBQUtzSSxPQUEyQyxNQUFsQ3EwQixFQUFNMzhCLEtBQUtzSSxNQUFPcTBCLEVBQU05ZCxPQVEvQ2hNLEVBQVN2VixFQUFPNHlCLElBQUt5TSxFQUFNMzhCLEtBQU0yOEIsRUFBTTlkLEtBQU0sSUFFckNoTSxHQUFxQixTQUFYQSxFQUF3QkEsRUFBSixHQVQ5QjhwQixFQUFNMzhCLEtBQU0yOEIsRUFBTTlkLE9BVzNCRCxJQUFLLFNBQVUrZCxHQUdUci9CLEVBQU80aUIsR0FBRzZlLEtBQU1wQyxFQUFNOWQsTUFDMUJ2aEIsRUFBTzRpQixHQUFHNmUsS0FBTXBDLEVBQU05ZCxNQUFROGQsR0FDbkJBLEVBQU0zOEIsS0FBS3NJLFFBQWdFLE1BQXJEcTBCLEVBQU0zOEIsS0FBS3NJLE1BQU9oTCxFQUFPZzBCLFNBQVVxTCxFQUFNOWQsUUFBb0J2aEIsRUFBT3F6QixTQUFVZ00sRUFBTTlkLE9BQ3JIdmhCLEVBQU9nTCxNQUFPcTBCLEVBQU0zOEIsS0FBTTI4QixFQUFNOWQsS0FBTThkLEVBQU16MEIsSUFBTXkwQixFQUFNRSxNQUV4REYsRUFBTTM4QixLQUFNMjhCLEVBQU05ZCxNQUFTOGQsRUFBTXowQixPQVNyQzgxQixHQUFNMWIsVUFBVXlFLFVBQVlpWCxHQUFNMWIsVUFBVXFFLFlBQzNDL0gsSUFBSyxTQUFVK2QsR0FDVEEsRUFBTTM4QixLQUFLUSxVQUFZbThCLEVBQU0zOEIsS0FBS2UsYUFDdEM0N0IsRUFBTTM4QixLQUFNMjhCLEVBQU05ZCxNQUFTOGQsRUFBTXowQixPQUtwQzVLLEVBQU9tRSxNQUFPLFNBQVUsT0FBUSxRQUFVLFNBQVVVLEVBQUdTLEdBQ3RELEdBQUlvOEIsR0FBUTFoQyxFQUFPc0IsR0FBSWdFLEVBQ3ZCdEYsR0FBT3NCLEdBQUlnRSxHQUFTLFNBQVVxOEIsRUFBT2hCLEVBQVF2OEIsR0FDNUMsTUFBZ0IsT0FBVHU5QixHQUFrQyxpQkFBVkEsR0FDOUJELEVBQU1sOUIsTUFBTzdCLEtBQU04QixXQUNuQjlCLEtBQUtpL0IsUUFBU0MsR0FBT3Y4QixHQUFNLEdBQVFxOEIsRUFBT2hCLEVBQVF2OEIsTUFJckRwRSxFQUFPc0IsR0FBRzhELFFBQ1QwOEIsT0FBUSxTQUFVSCxFQUFPSSxFQUFJcEIsRUFBUXY4QixHQUdwQyxNQUFPekIsTUFBSytQLE9BQVFnZ0IsSUFBV0UsSUFBSyxVQUFXLEdBQUlHLE9BR2pEOXRCLE1BQU0yOEIsU0FBVXRPLFFBQVN5TyxHQUFNSixFQUFPaEIsRUFBUXY4QixJQUVqRHc5QixRQUFTLFNBQVVyZ0IsRUFBTW9nQixFQUFPaEIsRUFBUXY4QixHQUN2QyxHQUFJb1QsR0FBUXhYLEVBQU9xSCxjQUFla2EsR0FDakN5Z0IsRUFBU2hpQyxFQUFPMmhDLE1BQU9BLEVBQU9oQixFQUFRdjhCLEdBQ3RDNjlCLEVBQWMsV0FFYixHQUFJbEIsR0FBT2xCLEdBQVdsOUIsS0FBTTNDLEVBQU9vRixVQUFZbWMsR0FBUXlnQixJQUdsRHhxQixHQUFTbUosRUFBVTljLElBQUtsQixLQUFNLFlBQ2xDbytCLEVBQUt2ZSxNQUFNLEdBS2QsT0FGQ3lmLEdBQVlDLE9BQVNELEVBRWZ6cUIsR0FBU3dxQixFQUFPOWYsU0FBVSxFQUNoQ3ZmLEtBQUt3QixLQUFNODlCLEdBQ1h0L0IsS0FBS3VmLE1BQU84ZixFQUFPOWYsTUFBTytmLElBRTVCemYsS0FBTSxTQUFVNWIsRUFBTW9jLEVBQVk0ZCxHQUNqQyxHQUFJdUIsR0FBWSxTQUFVOWYsR0FDekIsR0FBSUcsR0FBT0gsRUFBTUcsV0FDVkgsR0FBTUcsS0FDYkEsRUFBTW9lLEdBWVAsT0FUcUIsZ0JBQVRoNkIsS0FDWGc2QixFQUFVNWQsRUFDVkEsRUFBYXBjLEVBQ2JBLEVBQU9ySCxXQUVIeWpCLEdBQWNwYyxLQUFTLEdBQzNCakUsS0FBS3VmLE1BQU90YixHQUFRLFNBR2RqRSxLQUFLd0IsS0FBSyxXQUNoQixHQUFJZ2UsSUFBVSxFQUNicEYsRUFBZ0IsTUFBUm5XLEdBQWdCQSxFQUFPLGFBQy9CdzdCLEVBQVNwaUMsRUFBT29pQyxPQUNoQjM2QixFQUFPa1osRUFBVTljLElBQUtsQixLQUV2QixJQUFLb2EsRUFDQ3RWLEVBQU1zVixJQUFXdFYsRUFBTXNWLEdBQVF5RixNQUNuQzJmLEVBQVcxNkIsRUFBTXNWLFFBR2xCLEtBQU1BLElBQVN0VixHQUNUQSxFQUFNc1YsSUFBV3RWLEVBQU1zVixHQUFReUYsTUFBUXljLEdBQUs3N0IsS0FBTTJaLElBQ3REb2xCLEVBQVcxNkIsRUFBTXNWLEdBS3BCLEtBQU1BLEVBQVFxbEIsRUFBT3YvQixPQUFRa2EsS0FDdkJxbEIsRUFBUXJsQixHQUFRcmEsT0FBU0MsTUFBaUIsTUFBUmlFLEdBQWdCdzdCLEVBQVFybEIsR0FBUW1GLFFBQVV0YixJQUNoRnc3QixFQUFRcmxCLEdBQVFna0IsS0FBS3ZlLEtBQU1vZSxHQUMzQnplLEdBQVUsRUFDVmlnQixFQUFPajlCLE9BQVE0WCxFQUFPLEtBT25Cb0YsSUFBWXllLElBQ2hCNWdDLEVBQU9taUIsUUFBU3hmLEtBQU1pRSxNQUl6QnM3QixPQUFRLFNBQVV0N0IsR0FJakIsTUFIS0EsTUFBUyxJQUNiQSxFQUFPQSxHQUFRLE1BRVRqRSxLQUFLd0IsS0FBSyxXQUNoQixHQUFJNFksR0FDSHRWLEVBQU9rWixFQUFVOWMsSUFBS2xCLE1BQ3RCdWYsRUFBUXphLEVBQU1iLEVBQU8sU0FDckJ5YixFQUFRNWEsRUFBTWIsRUFBTyxjQUNyQnc3QixFQUFTcGlDLEVBQU9vaUMsT0FDaEJ2L0IsRUFBU3FmLEVBQVFBLEVBQU1yZixPQUFTLENBYWpDLEtBVkE0RSxFQUFLeTZCLFFBQVMsRUFHZGxpQyxFQUFPa2lCLE1BQU92ZixLQUFNaUUsTUFFZnliLEdBQVNBLEVBQU1HLE1BQ25CSCxFQUFNRyxLQUFLNWUsS0FBTWpCLE1BQU0sR0FJbEJvYSxFQUFRcWxCLEVBQU92L0IsT0FBUWthLEtBQ3ZCcWxCLEVBQVFybEIsR0FBUXJhLE9BQVNDLE1BQVF5L0IsRUFBUXJsQixHQUFRbUYsUUFBVXRiLElBQy9EdzdCLEVBQVFybEIsR0FBUWdrQixLQUFLdmUsTUFBTSxHQUMzQjRmLEVBQU9qOUIsT0FBUTRYLEVBQU8sR0FLeEIsS0FBTUEsRUFBUSxFQUFXbGEsRUFBUmthLEVBQWdCQSxJQUMzQm1GLEVBQU9uRixJQUFXbUYsRUFBT25GLEdBQVFtbEIsUUFDckNoZ0IsRUFBT25GLEdBQVFtbEIsT0FBT3QrQixLQUFNakIsWUFLdkI4RSxHQUFLeTZCLFdBTWYsU0FBU0wsSUFBT2o3QixFQUFNeTdCLEdBQ3JCLEdBQUl2WixHQUNIN1gsR0FBVXF4QixPQUFRMTdCLEdBQ2xCL0IsRUFBSSxDQUtMLEtBREF3OUIsRUFBZUEsRUFBYyxFQUFJLEVBQ3RCLEVBQUp4OUIsRUFBUUEsR0FBSyxFQUFJdzlCLEVBQ3ZCdlosRUFBUXVKLEdBQVd4dEIsR0FDbkJvTSxFQUFPLFNBQVc2WCxHQUFVN1gsRUFBTyxVQUFZNlgsR0FBVWxpQixDQU8xRCxPQUpLeTdCLEtBQ0pweEIsRUFBTXFpQixRQUFVcmlCLEVBQU11UCxNQUFRNVosR0FHeEJxSyxFQUlSalIsRUFBT21FLE1BQ05vK0IsVUFBV1YsR0FBTSxRQUNqQlcsUUFBU1gsR0FBTSxRQUNmWSxZQUFhWixHQUFNLFVBQ25CYSxRQUFVcFAsUUFBUyxRQUNuQnFQLFNBQVdyUCxRQUFTLFFBQ3BCc1AsWUFBY3RQLFFBQVMsV0FDckIsU0FBVWh1QixFQUFNb2pCLEdBQ2xCMW9CLEVBQU9zQixHQUFJZ0UsR0FBUyxTQUFVcThCLEVBQU9oQixFQUFRdjhCLEdBQzVDLE1BQU96QixNQUFLaS9CLFFBQVNsWixFQUFPaVosRUFBT2hCLEVBQVF2OEIsTUFJN0NwRSxFQUFPMmhDLE1BQVEsU0FBVUEsRUFBT2hCLEVBQVFyL0IsR0FDdkMsR0FBSTJkLEdBQU0waUIsR0FBMEIsZ0JBQVZBLEdBQXFCM2hDLEVBQU9vRixVQUFZdThCLElBQ2pFM0ksU0FBVTEzQixJQUFPQSxHQUFNcS9CLEdBQ3RCM2dDLEVBQU9zRCxXQUFZcStCLElBQVdBLEVBQy9CeEIsU0FBVXdCLEVBQ1ZoQixPQUFRci9CLEdBQU1xL0IsR0FBVUEsSUFBVzNnQyxFQUFPc0QsV0FBWXE5QixJQUFZQSxFQXdCbkUsT0FyQkExaEIsR0FBSWtoQixTQUFXbmdDLEVBQU80aUIsR0FBR2xjLElBQU0sRUFBNEIsZ0JBQWpCdVksR0FBSWtoQixTQUF3QmxoQixFQUFJa2hCLFNBQ3pFbGhCLEVBQUlraEIsV0FBWW5nQyxHQUFPNGlCLEdBQUdDLE9BQVM3aUIsRUFBTzRpQixHQUFHQyxPQUFRNUQsRUFBSWtoQixVQUFhbmdDLEVBQU80aUIsR0FBR0MsT0FBT21GLFVBR3RFLE1BQWIvSSxFQUFJaUQsT0FBaUJqRCxFQUFJaUQsU0FBVSxLQUN2Q2pELEVBQUlpRCxNQUFRLE1BSWJqRCxFQUFJbFUsSUFBTWtVLEVBQUkrWixTQUVkL1osRUFBSStaLFNBQVcsV0FDVGg1QixFQUFPc0QsV0FBWTJiLEVBQUlsVSxNQUMzQmtVLEVBQUlsVSxJQUFJbkgsS0FBTWpCLE1BR1ZzYyxFQUFJaUQsT0FDUmxpQixFQUFPbWlCLFFBQVN4ZixLQUFNc2MsRUFBSWlELFFBSXJCakQsR0FHUmpmLEVBQU8yZ0MsUUFDTmtDLE9BQVEsU0FBVUMsR0FDakIsTUFBT0EsSUFFUkMsTUFBTyxTQUFVRCxHQUNoQixNQUFPLEdBQU0vOEIsS0FBS2k5QixJQUFLRixFQUFFLzhCLEtBQUtrOUIsSUFBTyxJQUl2Q2pqQyxFQUFPb2lDLFVBQ1BwaUMsRUFBTzRpQixHQUFLOGQsR0FBTXArQixVQUFVZixLQUM1QnZCLEVBQU80aUIsR0FBR29kLEtBQU8sV0FDaEIsR0FBSWMsR0FDSHNCLEVBQVNwaUMsRUFBT29pQyxPQUNoQnY5QixFQUFJLENBSUwsS0FGQWc2QixHQUFRNytCLEVBQU80SyxNQUVIdzNCLEVBQU92L0IsT0FBWGdDLEVBQW1CQSxJQUMxQmk4QixFQUFRc0IsRUFBUXY5QixHQUVWaThCLEtBQVdzQixFQUFRdjlCLEtBQVFpOEIsR0FDaENzQixFQUFPajlCLE9BQVFOLElBQUssRUFJaEJ1OUIsR0FBT3YvQixRQUNaN0MsRUFBTzRpQixHQUFHSixPQUVYcWMsR0FBUXQvQixXQUdUUyxFQUFPNGlCLEdBQUdrZSxNQUFRLFNBQVVBLEdBQ3RCQSxLQUFXOWdDLEVBQU9vaUMsT0FBTzNoQyxLQUFNcWdDLElBQ25DOWdDLEVBQU80aUIsR0FBRzlNLFNBSVo5VixFQUFPNGlCLEdBQUdzZ0IsU0FBVyxHQUVyQmxqQyxFQUFPNGlCLEdBQUc5TSxNQUFRLFdBQ1hncEIsS0FDTEEsR0FBVXFFLFlBQWFuakMsRUFBTzRpQixHQUFHb2QsS0FBTWhnQyxFQUFPNGlCLEdBQUdzZ0IsWUFJbkRsakMsRUFBTzRpQixHQUFHSixLQUFPLFdBQ2hCNGdCLGNBQWV0RSxJQUNmQSxHQUFVLE1BR1g5K0IsRUFBTzRpQixHQUFHQyxRQUNUd2dCLEtBQU0sSUFDTkMsS0FBTSxJQUVOdGIsU0FBVSxLQUlYaG9CLEVBQU80aUIsR0FBRzZlLFFBRUx6aEMsRUFBTzhULE1BQVE5VCxFQUFPOFQsS0FBS3dFLFVBQy9CdFksRUFBTzhULEtBQUt3RSxRQUFRaXJCLFNBQVcsU0FBVTdnQyxHQUN4QyxNQUFPMUMsR0FBT2dLLEtBQUtoSyxFQUFPb2lDLE9BQVEsU0FBVTlnQyxHQUMzQyxNQUFPb0IsS0FBU3BCLEVBQUdvQixPQUNqQkcsU0FHTDdDLEVBQU9zQixHQUFHa2lDLE9BQVMsU0FBVW4rQixHQUM1QixHQUFLWixVQUFVNUIsT0FDZCxNQUFPd0MsS0FBWTlGLFVBQ2xCb0QsS0FDQUEsS0FBS3dCLEtBQUssU0FBVVUsR0FDbkI3RSxFQUFPd2pDLE9BQU9DLFVBQVc5Z0MsS0FBTTBDLEVBQVNSLElBSTNDLElBQUloRixHQUFTNmpDLEVBQ1poaEMsRUFBT0MsS0FBTSxHQUNiZ2hDLEdBQVF4eEIsSUFBSyxFQUFHeXhCLEtBQU0sR0FDdEI3eEIsRUFBTXJQLEdBQVFBLEVBQUtTLGFBRXBCLElBQU00TyxFQU9OLE1BSEFsUyxHQUFVa1MsRUFBSWpTLGdCQUdSRSxFQUFPbU0sU0FBVXRNLEVBQVM2QyxVQU1wQkEsR0FBS21oQyx3QkFBMEJua0MsSUFDMUNpa0MsRUFBTWpoQyxFQUFLbWhDLHlCQUVaSCxFQUFNSSxHQUFXL3hCLElBRWhCSSxJQUFLd3hCLEVBQUl4eEIsSUFBTXV4QixFQUFJSyxZQUFjbGtDLEVBQVE2cEIsVUFDekNrYSxLQUFNRCxFQUFJQyxLQUFPRixFQUFJTSxZQUFjbmtDLEVBQVF5cEIsYUFYcENxYSxHQWVUM2pDLEVBQU93akMsUUFFTkMsVUFBVyxTQUFVL2dDLEVBQU0yQyxFQUFTUixHQUNuQyxHQUFJby9CLEdBQWFDLEVBQVNDLEVBQVdDLEVBQVFDLEVBQVdDLEVBQVlDLEVBQ25FeFMsRUFBVy94QixFQUFPNHlCLElBQUtsd0IsRUFBTSxZQUM3QjhoQyxFQUFVeGtDLEVBQVEwQyxHQUNsQmdtQixJQUdpQixZQUFicUosSUFDSnJ2QixFQUFLc0ksTUFBTSttQixTQUFXLFlBR3ZCc1MsRUFBWUcsRUFBUWhCLFNBQ3BCVyxFQUFZbmtDLEVBQU80eUIsSUFBS2x3QixFQUFNLE9BQzlCNGhDLEVBQWF0a0MsRUFBTzR5QixJQUFLbHdCLEVBQU0sUUFDL0I2aEMsR0FBbUMsYUFBYnhTLEdBQXdDLFVBQWJBLEtBQTRCb1MsRUFBWUcsR0FBYXpqQyxRQUFRLFFBQVUsR0FHbkgwakMsR0FDSk4sRUFBY08sRUFBUXpTLFdBQ3RCcVMsRUFBU0gsRUFBWTl4QixJQUNyQit4QixFQUFVRCxFQUFZTCxPQUd0QlEsRUFBU245QixXQUFZazlCLElBQWUsRUFDcENELEVBQVVqOUIsV0FBWXE5QixJQUFnQixHQUdsQ3RrQyxFQUFPc0QsV0FBWStCLEtBQ3ZCQSxFQUFVQSxFQUFRekIsS0FBTWxCLEVBQU1tQyxFQUFHdy9CLElBR2QsTUFBZmgvQixFQUFROE0sTUFDWnVXLEVBQU12VyxJQUFROU0sRUFBUThNLElBQU1reUIsRUFBVWx5QixJQUFRaXlCLEdBRTFCLE1BQWhCLytCLEVBQVF1K0IsT0FDWmxiLEVBQU1rYixLQUFTditCLEVBQVF1K0IsS0FBT1MsRUFBVVQsS0FBU00sR0FHN0MsU0FBVzcrQixHQUNmQSxFQUFRby9CLE1BQU03Z0MsS0FBTWxCLEVBQU1nbUIsR0FHMUI4YixFQUFRNVIsSUFBS2xLLEtBTWhCMW9CLEVBQU9zQixHQUFHOEQsUUFFVDJzQixTQUFVLFdBQ1QsR0FBTXB2QixLQUFNLEdBQVosQ0FJQSxHQUFJK2hDLEdBQWNsQixFQUNqQjlnQyxFQUFPQyxLQUFNLEdBQ2JnaUMsR0FBaUJ4eUIsSUFBSyxFQUFHeXhCLEtBQU0sRUF1QmhDLE9BcEJ3QyxVQUFuQzVqQyxFQUFPNHlCLElBQUtsd0IsRUFBTSxZQUV0QjhnQyxFQUFTOWdDLEVBQUttaEMseUJBSWRhLEVBQWUvaEMsS0FBSytoQyxlQUdwQmxCLEVBQVM3Z0MsS0FBSzZnQyxTQUNSeGpDLEVBQU9zSixTQUFVbzdCLEVBQWMsR0FBSyxVQUN6Q0MsRUFBZUQsRUFBYWxCLFVBSTdCbUIsRUFBYXh5QixLQUFPblMsRUFBTzR5QixJQUFLOFIsRUFBYyxHQUFLLGtCQUFrQixHQUNyRUMsRUFBYWYsTUFBUTVqQyxFQUFPNHlCLElBQUs4UixFQUFjLEdBQUssbUJBQW1CLEtBS3ZFdnlCLElBQUtxeEIsRUFBT3J4QixJQUFNd3lCLEVBQWF4eUIsSUFBTW5TLEVBQU80eUIsSUFBS2x3QixFQUFNLGFBQWEsR0FDcEVraEMsS0FBTUosRUFBT0ksS0FBT2UsRUFBYWYsS0FBTzVqQyxFQUFPNHlCLElBQUtsd0IsRUFBTSxjQUFjLE1BSTFFZ2lDLGFBQWMsV0FDYixNQUFPL2hDLE1BQUtxQyxJQUFJLFdBQ2YsR0FBSTAvQixHQUFlL2hDLEtBQUsraEMsY0FBZ0I3a0MsQ0FFeEMsT0FBUTZrQyxJQUFtQjFrQyxFQUFPc0osU0FBVW83QixFQUFjLFNBQXNELFdBQTFDMWtDLEVBQU80eUIsSUFBSzhSLEVBQWMsWUFDL0ZBLEVBQWVBLEVBQWFBLFlBRzdCLE9BQU9BLElBQWdCN2tDLE9BTzFCRyxFQUFPbUUsTUFBT2tsQixXQUFZLGNBQWVJLFVBQVcsZUFBZ0IsU0FBVWtTLEVBQVFwYSxHQUNyRixHQUFJcFAsR0FBTSxnQkFBa0JvUCxDQUU1QnZoQixHQUFPc0IsR0FBSXE2QixHQUFXLFNBQVUzbkIsR0FDL0IsTUFBT2hVLEdBQU9zSyxPQUFRM0gsS0FBTSxTQUFVRCxFQUFNaTVCLEVBQVEzbkIsR0FDbkQsR0FBSTB2QixHQUFNSSxHQUFXcGhDLEVBRXJCLE9BQUtzUixLQUFRelUsVUFDTG1rQyxFQUFNQSxFQUFLbmlCLEdBQVM3ZSxFQUFNaTVCLElBRzdCK0gsRUFDSkEsRUFBSWtCLFNBQ0Z6eUIsRUFBWTdTLEVBQU8wa0MsWUFBYmh3QixFQUNQN0IsRUFBTTZCLEVBQU0xVSxFQUFPeWtDLGFBSXBCcmhDLEVBQU1pNUIsR0FBVzNuQixFQVBsQixZQVNFMm5CLEVBQVEzbkIsRUFBS3ZQLFVBQVU1QixPQUFRLFFBSXBDLFNBQVNpaEMsSUFBV3BoQyxHQUNuQixNQUFPMUMsR0FBTzhHLFNBQVVwRSxHQUFTQSxFQUF5QixJQUFsQkEsRUFBS1EsVUFBa0JSLEVBQUt1UCxZQUdyRWpTLEVBQU9tRSxNQUFRMGdDLE9BQVEsU0FBVUMsTUFBTyxTQUFXLFNBQVV4L0IsRUFBTXNCLEdBQ2xFNUcsRUFBT21FLE1BQVFpeEIsUUFBUyxRQUFVOXZCLEVBQU1vckIsUUFBUzlwQixFQUFNLEdBQUksUUFBVXRCLEdBQVEsU0FBVXkvQixFQUFjQyxHQUVwR2hsQyxFQUFPc0IsR0FBSTBqQyxHQUFhLFNBQVU3UCxFQUFRM3JCLEdBQ3pDLEdBQUlnQixHQUFZL0YsVUFBVTVCLFNBQVlraUMsR0FBa0MsaUJBQVg1UCxJQUM1RGpCLEVBQVE2USxJQUFrQjVQLEtBQVcsR0FBUTNyQixLQUFVLEVBQU8sU0FBVyxTQUUxRSxPQUFPeEosR0FBT3NLLE9BQVEzSCxLQUFNLFNBQVVELEVBQU1rRSxFQUFNNEMsR0FDakQsR0FBSXVJLEVBRUosT0FBSy9SLEdBQU84RyxTQUFVcEUsR0FJZEEsRUFBSzlDLFNBQVNFLGdCQUFpQixTQUFXd0YsR0FJM0IsSUFBbEI1QyxFQUFLUSxVQUNUNk8sRUFBTXJQLEVBQUs1QyxnQkFJSmlHLEtBQUt3ZSxJQUNYN2hCLEVBQUt3ZCxLQUFNLFNBQVc1YSxHQUFReU0sRUFBSyxTQUFXek0sR0FDOUM1QyxFQUFLd2QsS0FBTSxTQUFXNWEsR0FBUXlNLEVBQUssU0FBV3pNLEdBQzlDeU0sRUFBSyxTQUFXek0sS0FJWGtFLElBQVVqSyxVQUVoQlMsRUFBTzR5QixJQUFLbHdCLEVBQU1rRSxFQUFNc3RCLEdBR3hCbDBCLEVBQU9nTCxNQUFPdEksRUFBTWtFLEVBQU00QyxFQUFPMHFCLElBQ2hDdHRCLEVBQU00RCxFQUFZMnFCLEVBQVM1MUIsVUFBV2lMLEVBQVcsV0FRdkR4SyxFQUFPc0IsR0FBRzJqQyxLQUFPLFdBQ2hCLE1BQU90aUMsTUFBS0UsUUFHYjdDLEVBQU9zQixHQUFHNGpDLFFBQVVsbEMsRUFBT3NCLEdBQUd5cUIsUUFHUCxnQkFBWG9aLFNBQXVCQSxRQUFvQyxnQkFBbkJBLFFBQU9DLFFBSzFERCxPQUFPQyxRQUFVcGxDLEVBU00sa0JBQVhxbEMsU0FBeUJBLE9BQU9DLEtBQzNDRCxPQUFRLFlBQWMsV0FBYyxNQUFPcmxDLEtBTXRCLGdCQUFYVixJQUFrRCxnQkFBcEJBLEdBQU9NLFdBQ2hETixFQUFPVSxPQUFTVixFQUFPWSxFQUFJRixLQUd4QlYifQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9qcy9qcXVlcnktdWkubWluLmpzIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9qcy9qcXVlcnktdWkubWluLmpzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRlNjM5NmIKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2pzL2pxdWVyeS11aS5taW4uanMKQEAgLTAsMCArMSw3IEBACisvKiEgalF1ZXJ5IFVJIC0gdjEuMTEuNCAtIDIwMTUtMDMtMTUKKyogaHR0cDovL2pxdWVyeXVpLmNvbQorKiBJbmNsdWRlczogY29yZS5qcywgZGF0ZXBpY2tlci5qcworKiBDb3B5cmlnaHQgMjAxNSBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzOyBMaWNlbnNlZCBNSVQgKi8KKworKGZ1bmN0aW9uKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFsianF1ZXJ5Il0sZSk6ZShqUXVlcnkpfSkoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0LHMpe3ZhciBhLG4scixvPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iYXJlYSI9PT1vPyhhPXQucGFyZW50Tm9kZSxuPWEubmFtZSx0LmhyZWYmJm4mJiJtYXAiPT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPyhyPWUoImltZ1t1c2VtYXA9JyMiK24rIiddIilbMF0sISFyJiZpKHIpKTohMSk6KC9eKGlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b258b2JqZWN0KSQvLnRlc3Qobyk/IXQuZGlzYWJsZWQ6ImEiPT09bz90LmhyZWZ8fHM6cykmJmkodCl9ZnVuY3Rpb24gaSh0KXtyZXR1cm4gZS5leHByLmZpbHRlcnMudmlzaWJsZSh0KSYmIWUodCkucGFyZW50cygpLmFkZEJhY2soKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4iaGlkZGVuIj09PWUuY3NzKHRoaXMsInZpc2liaWxpdHkiKX0pLmxlbmd0aH1mdW5jdGlvbiBzKGUpe2Zvcih2YXIgdCxpO2UubGVuZ3RoJiZlWzBdIT09ZG9jdW1lbnQ7KXtpZih0PWUuY3NzKCJwb3NpdGlvbiIpLCgiYWJzb2x1dGUiPT09dHx8InJlbGF0aXZlIj09PXR8fCJmaXhlZCI9PT10KSYmKGk9cGFyc2VJbnQoZS5jc3MoInpJbmRleCIpLDEwKSwhaXNOYU4oaSkmJjAhPT1pKSlyZXR1cm4gaTtlPWUucGFyZW50KCl9cmV0dXJuIDB9ZnVuY3Rpb24gYSgpe3RoaXMuX2N1ckluc3Q9bnVsbCx0aGlzLl9rZXlFdmVudD0hMSx0aGlzLl9kaXNhYmxlZElucHV0cz1bXSx0aGlzLl9kYXRlcGlja2VyU2hvd2luZz0hMSx0aGlzLl9pbkRpYWxvZz0hMSx0aGlzLl9tYWluRGl2SWQ9InVpLWRhdGVwaWNrZXItZGl2Iix0aGlzLl9pbmxpbmVDbGFzcz0idWktZGF0ZXBpY2tlci1pbmxpbmUiLHRoaXMuX2FwcGVuZENsYXNzPSJ1aS1kYXRlcGlja2VyLWFwcGVuZCIsdGhpcy5fdHJpZ2dlckNsYXNzPSJ1aS1kYXRlcGlja2VyLXRyaWdnZXIiLHRoaXMuX2RpYWxvZ0NsYXNzPSJ1aS1kYXRlcGlja2VyLWRpYWxvZyIsdGhpcy5fZGlzYWJsZUNsYXNzPSJ1aS1kYXRlcGlja2VyLWRpc2FibGVkIix0aGlzLl91bnNlbGVjdGFibGVDbGFzcz0idWktZGF0ZXBpY2tlci11bnNlbGVjdGFibGUiLHRoaXMuX2N1cnJlbnRDbGFzcz0idWktZGF0ZXBpY2tlci1jdXJyZW50LWRheSIsdGhpcy5fZGF5T3ZlckNsYXNzPSJ1aS1kYXRlcGlja2VyLWRheXMtY2VsbC1vdmVyIix0aGlzLnJlZ2lvbmFsPVtdLHRoaXMucmVnaW9uYWxbIiJdPXtjbG9zZVRleHQ6IkRvbmUiLHByZXZUZXh0OiJQcmV2IixuZXh0VGV4dDoiTmV4dCIsY3VycmVudFRleHQ6IlRvZGF5Iixtb250aE5hbWVzOlsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXSxtb250aE5hbWVzU2hvcnQ6WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXSxkYXlOYW1lczpbIlN1bmRheSIsIk1vbmRheSIsIlR1ZXNkYXkiLCJXZWRuZXNkYXkiLCJUaHVyc2RheSIsIkZyaWRheSIsIlNhdHVyZGF5Il0sZGF5TmFtZXNTaG9ydDpbIlN1biIsIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCJdLGRheU5hbWVzTWluOlsiU3UiLCJNbyIsIlR1IiwiV2UiLCJUaCIsIkZyIiwiU2EiXSx3ZWVrSGVhZGVyOiJXayIsZGF0ZUZvcm1hdDoibW0vZGQveXkiLGZpcnN0RGF5OjAsaXNSVEw6ITEsc2hvd01vbnRoQWZ0ZXJZZWFyOiExLHllYXJTdWZmaXg6IiJ9LHRoaXMuX2RlZmF1bHRzPXtzaG93T246ImZvY3VzIixzaG93QW5pbToiZmFkZUluIixzaG93T3B0aW9uczp7fSxkZWZhdWx0RGF0ZTpudWxsLGFwcGVuZFRleHQ6IiIsYnV0dG9uVGV4dDoiLi4uIixidXR0b25JbWFnZToiIixidXR0b25JbWFnZU9ubHk6ITEsaGlkZUlmTm9QcmV2TmV4dDohMSxuYXZpZ2F0aW9uQXNEYXRlRm9ybWF0OiExLGdvdG9DdXJyZW50OiExLGNoYW5nZU1vbnRoOiExLGNoYW5nZVllYXI6ITEseWVhclJhbmdlOiJjLTEwOmMrMTAiLHNob3dPdGhlck1vbnRoczohMSxzZWxlY3RPdGhlck1vbnRoczohMSxzaG93V2VlazohMSxjYWxjdWxhdGVXZWVrOnRoaXMuaXNvODYwMVdlZWssc2hvcnRZZWFyQ3V0b2ZmOiIrMTAiLG1pbkRhdGU6bnVsbCxtYXhEYXRlOm51bGwsZHVyYXRpb246ImZhc3QiLGJlZm9yZVNob3dEYXk6bnVsbCxiZWZvcmVTaG93Om51bGwsb25TZWxlY3Q6bnVsbCxvbkNoYW5nZU1vbnRoWWVhcjpudWxsLG9uQ2xvc2U6bnVsbCxudW1iZXJPZk1vbnRoczoxLHNob3dDdXJyZW50QXRQb3M6MCxzdGVwTW9udGhzOjEsc3RlcEJpZ01vbnRoczoxMixhbHRGaWVsZDoiIixhbHRGb3JtYXQ6IiIsY29uc3RyYWluSW5wdXQ6ITAsc2hvd0J1dHRvblBhbmVsOiExLGF1dG9TaXplOiExLGRpc2FibGVkOiExfSxlLmV4dGVuZCh0aGlzLl9kZWZhdWx0cyx0aGlzLnJlZ2lvbmFsWyIiXSksdGhpcy5yZWdpb25hbC5lbj1lLmV4dGVuZCghMCx7fSx0aGlzLnJlZ2lvbmFsWyIiXSksdGhpcy5yZWdpb25hbFsiZW4tVVMiXT1lLmV4dGVuZCghMCx7fSx0aGlzLnJlZ2lvbmFsLmVuKSx0aGlzLmRwRGl2PW4oZSgiPGRpdiBpZD0nIit0aGlzLl9tYWluRGl2SWQrIicgY2xhc3M9J3VpLWRhdGVwaWNrZXIgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWhlbHBlci1jbGVhcmZpeCB1aS1jb3JuZXItYWxsJz48L2Rpdj4iKSl9ZnVuY3Rpb24gbih0KXt2YXIgaT0iYnV0dG9uLCAudWktZGF0ZXBpY2tlci1wcmV2LCAudWktZGF0ZXBpY2tlci1uZXh0LCAudWktZGF0ZXBpY2tlci1jYWxlbmRhciB0ZCBhIjtyZXR1cm4gdC5kZWxlZ2F0ZShpLCJtb3VzZW91dCIsZnVuY3Rpb24oKXtlKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpLC0xIT09dGhpcy5jbGFzc05hbWUuaW5kZXhPZigidWktZGF0ZXBpY2tlci1wcmV2IikmJmUodGhpcykucmVtb3ZlQ2xhc3MoInVpLWRhdGVwaWNrZXItcHJldi1ob3ZlciIpLC0xIT09dGhpcy5jbGFzc05hbWUuaW5kZXhPZigidWktZGF0ZXBpY2tlci1uZXh0IikmJmUodGhpcykucmVtb3ZlQ2xhc3MoInVpLWRhdGVwaWNrZXItbmV4dC1ob3ZlciIpfSkuZGVsZWdhdGUoaSwibW91c2VvdmVyIixyKX1mdW5jdGlvbiByKCl7ZS5kYXRlcGlja2VyLl9pc0Rpc2FibGVkRGF0ZXBpY2tlcihoLmlubGluZT9oLmRwRGl2LnBhcmVudCgpWzBdOmguaW5wdXRbMF0pfHwoZSh0aGlzKS5wYXJlbnRzKCIudWktZGF0ZXBpY2tlci1jYWxlbmRhciIpLmZpbmQoImEiKS5yZW1vdmVDbGFzcygidWktc3RhdGUtaG92ZXIiKSxlKHRoaXMpLmFkZENsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpLC0xIT09dGhpcy5jbGFzc05hbWUuaW5kZXhPZigidWktZGF0ZXBpY2tlci1wcmV2IikmJmUodGhpcykuYWRkQ2xhc3MoInVpLWRhdGVwaWNrZXItcHJldi1ob3ZlciIpLC0xIT09dGhpcy5jbGFzc05hbWUuaW5kZXhPZigidWktZGF0ZXBpY2tlci1uZXh0IikmJmUodGhpcykuYWRkQ2xhc3MoInVpLWRhdGVwaWNrZXItbmV4dC1ob3ZlciIpKX1mdW5jdGlvbiBvKHQsaSl7ZS5leHRlbmQodCxpKTtmb3IodmFyIHMgaW4gaSludWxsPT1pW3NdJiYodFtzXT1pW3NdKTtyZXR1cm4gdH1lLnVpPWUudWl8fHt9LGUuZXh0ZW5kKGUudWkse3ZlcnNpb246IjEuMTEuNCIsa2V5Q29kZTp7QkFDS1NQQUNFOjgsQ09NTUE6MTg4LERFTEVURTo0NixET1dOOjQwLEVORDozNSxFTlRFUjoxMyxFU0NBUEU6MjcsSE9NRTozNixMRUZUOjM3LFBBR0VfRE9XTjozNCxQQUdFX1VQOjMzLFBFUklPRDoxOTAsUklHSFQ6MzksU1BBQ0U6MzIsVEFCOjksVVA6Mzh9fSksZS5mbi5leHRlbmQoe3Njcm9sbFBhcmVudDpmdW5jdGlvbih0KXt2YXIgaT10aGlzLmNzcygicG9zaXRpb24iKSxzPSJhYnNvbHV0ZSI9PT1pLGE9dD8vKGF1dG98c2Nyb2xsfGhpZGRlbikvOi8oYXV0b3xzY3JvbGwpLyxuPXRoaXMucGFyZW50cygpLmZpbHRlcihmdW5jdGlvbigpe3ZhciB0PWUodGhpcyk7cmV0dXJuIHMmJiJzdGF0aWMiPT09dC5jc3MoInBvc2l0aW9uIik/ITE6YS50ZXN0KHQuY3NzKCJvdmVyZmxvdyIpK3QuY3NzKCJvdmVyZmxvdy15IikrdC5jc3MoIm92ZXJmbG93LXgiKSl9KS5lcSgwKTtyZXR1cm4iZml4ZWQiIT09aSYmbi5sZW5ndGg/bjplKHRoaXNbMF0ub3duZXJEb2N1bWVudHx8ZG9jdW1lbnQpfSx1bmlxdWVJZDpmdW5jdGlvbigpe3ZhciBlPTA7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3RoaXMuaWR8fCh0aGlzLmlkPSJ1aS1pZC0iKyArK2UpfSl9fSgpLHJlbW92ZVVuaXF1ZUlkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpey9edWktaWQtXGQrJC8udGVzdCh0aGlzLmlkKSYmZSh0aGlzKS5yZW1vdmVBdHRyKCJpZCIpfSl9fSksZS5leHRlbmQoZS5leHByWyI6Il0se2RhdGE6ZS5leHByLmNyZWF0ZVBzZXVkbz9lLmV4cHIuY3JlYXRlUHNldWRvKGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihpKXtyZXR1cm4hIWUuZGF0YShpLHQpfX0pOmZ1bmN0aW9uKHQsaSxzKXtyZXR1cm4hIWUuZGF0YSh0LHNbM10pfSxmb2N1c2FibGU6ZnVuY3Rpb24oaSl7cmV0dXJuIHQoaSwhaXNOYU4oZS5hdHRyKGksInRhYmluZGV4IikpKX0sdGFiYmFibGU6ZnVuY3Rpb24oaSl7dmFyIHM9ZS5hdHRyKGksInRhYmluZGV4IiksYT1pc05hTihzKTtyZXR1cm4oYXx8cz49MCkmJnQoaSwhYSl9fSksZSgiPGE+Iikub3V0ZXJXaWR0aCgxKS5qcXVlcnl8fGUuZWFjaChbIldpZHRoIiwiSGVpZ2h0Il0sZnVuY3Rpb24odCxpKXtmdW5jdGlvbiBzKHQsaSxzLG4pe3JldHVybiBlLmVhY2goYSxmdW5jdGlvbigpe2ktPXBhcnNlRmxvYXQoZS5jc3ModCwicGFkZGluZyIrdGhpcykpfHwwLHMmJihpLT1wYXJzZUZsb2F0KGUuY3NzKHQsImJvcmRlciIrdGhpcysiV2lkdGgiKSl8fDApLG4mJihpLT1wYXJzZUZsb2F0KGUuY3NzKHQsIm1hcmdpbiIrdGhpcykpfHwwKX0pLGl9dmFyIGE9IldpZHRoIj09PWk/WyJMZWZ0IiwiUmlnaHQiXTpbIlRvcCIsIkJvdHRvbSJdLG49aS50b0xvd2VyQ2FzZSgpLHI9e2lubmVyV2lkdGg6ZS5mbi5pbm5lcldpZHRoLGlubmVySGVpZ2h0OmUuZm4uaW5uZXJIZWlnaHQsb3V0ZXJXaWR0aDplLmZuLm91dGVyV2lkdGgsb3V0ZXJIZWlnaHQ6ZS5mbi5vdXRlckhlaWdodH07ZS5mblsiaW5uZXIiK2ldPWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10P3JbImlubmVyIitpXS5jYWxsKHRoaXMpOnRoaXMuZWFjaChmdW5jdGlvbigpe2UodGhpcykuY3NzKG4scyh0aGlzLHQpKyJweCIpfSl9LGUuZm5bIm91dGVyIitpXT1mdW5jdGlvbih0LGEpe3JldHVybiJudW1iZXIiIT10eXBlb2YgdD9yWyJvdXRlciIraV0uY2FsbCh0aGlzLHQpOnRoaXMuZWFjaChmdW5jdGlvbigpe2UodGhpcykuY3NzKG4scyh0aGlzLHQsITAsYSkrInB4Iil9KX19KSxlLmZuLmFkZEJhY2t8fChlLmZuLmFkZEJhY2s9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuYWRkKG51bGw9PWU/dGhpcy5wcmV2T2JqZWN0OnRoaXMucHJldk9iamVjdC5maWx0ZXIoZSkpfSksZSgiPGE+IikuZGF0YSgiYS1iIiwiYSIpLnJlbW92ZURhdGEoImEtYiIpLmRhdGEoImEtYiIpJiYoZS5mbi5yZW1vdmVEYXRhPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihpKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90LmNhbGwodGhpcyxlLmNhbWVsQ2FzZShpKSk6dC5jYWxsKHRoaXMpfX0oZS5mbi5yZW1vdmVEYXRhKSksZS51aS5pZT0hIS9tc2llIFtcdy5dKy8uZXhlYyhuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkpLGUuZm4uZXh0ZW5kKHtmb2N1czpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oaSxzKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGk/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZSh0KS5mb2N1cygpLHMmJnMuY2FsbCh0KX0saSl9KTp0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KGUuZm4uZm9jdXMpLGRpc2FibGVTZWxlY3Rpb246ZnVuY3Rpb24oKXt2YXIgZT0ib25zZWxlY3RzdGFydCJpbiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKT8ic2VsZWN0c3RhcnQiOiJtb3VzZWRvd24iO3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLmJpbmQoZSsiLnVpLWRpc2FibGVTZWxlY3Rpb24iLGZ1bmN0aW9uKGUpe2UucHJldmVudERlZmF1bHQoKX0pfX0oKSxlbmFibGVTZWxlY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bmJpbmQoIi51aS1kaXNhYmxlU2VsZWN0aW9uIil9LHpJbmRleDpmdW5jdGlvbih0KXtpZih2b2lkIDAhPT10KXJldHVybiB0aGlzLmNzcygiekluZGV4Iix0KTtpZih0aGlzLmxlbmd0aClmb3IodmFyIGkscyxhPWUodGhpc1swXSk7YS5sZW5ndGgmJmFbMF0hPT1kb2N1bWVudDspe2lmKGk9YS5jc3MoInBvc2l0aW9uIiksKCJhYnNvbHV0ZSI9PT1pfHwicmVsYXRpdmUiPT09aXx8ImZpeGVkIj09PWkpJiYocz1wYXJzZUludChhLmNzcygiekluZGV4IiksMTApLCFpc05hTihzKSYmMCE9PXMpKXJldHVybiBzO2E9YS5wYXJlbnQoKX1yZXR1cm4gMH19KSxlLnVpLnBsdWdpbj17YWRkOmZ1bmN0aW9uKHQsaSxzKXt2YXIgYSxuPWUudWlbdF0ucHJvdG90eXBlO2ZvcihhIGluIHMpbi5wbHVnaW5zW2FdPW4ucGx1Z2luc1thXXx8W10sbi5wbHVnaW5zW2FdLnB1c2goW2ksc1thXV0pfSxjYWxsOmZ1bmN0aW9uKGUsdCxpLHMpe3ZhciBhLG49ZS5wbHVnaW5zW3RdO2lmKG4mJihzfHxlLmVsZW1lbnRbMF0ucGFyZW50Tm9kZSYmMTEhPT1lLmVsZW1lbnRbMF0ucGFyZW50Tm9kZS5ub2RlVHlwZSkpZm9yKGE9MDtuLmxlbmd0aD5hO2ErKyllLm9wdGlvbnNbblthXVswXV0mJm5bYV1bMV0uYXBwbHkoZS5lbGVtZW50LGkpfX0sZS5leHRlbmQoZS51aSx7ZGF0ZXBpY2tlcjp7dmVyc2lvbjoiMS4xMS40In19KTt2YXIgaDtlLmV4dGVuZChhLnByb3RvdHlwZSx7bWFya2VyQ2xhc3NOYW1lOiJoYXNEYXRlcGlja2VyIixtYXhSb3dzOjQsX3dpZGdldERhdGVwaWNrZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kcERpdn0sc2V0RGVmYXVsdHM6ZnVuY3Rpb24oZSl7cmV0dXJuIG8odGhpcy5fZGVmYXVsdHMsZXx8e30pLHRoaXN9LF9hdHRhY2hEYXRlcGlja2VyOmZ1bmN0aW9uKHQsaSl7dmFyIHMsYSxuO3M9dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLGE9ImRpdiI9PT1zfHwic3BhbiI9PT1zLHQuaWR8fCh0aGlzLnV1aWQrPTEsdC5pZD0iZHAiK3RoaXMudXVpZCksbj10aGlzLl9uZXdJbnN0KGUodCksYSksbi5zZXR0aW5ncz1lLmV4dGVuZCh7fSxpfHx7fSksImlucHV0Ij09PXM/dGhpcy5fY29ubmVjdERhdGVwaWNrZXIodCxuKTphJiZ0aGlzLl9pbmxpbmVEYXRlcGlja2VyKHQsbil9LF9uZXdJbnN0OmZ1bmN0aW9uKHQsaSl7dmFyIHM9dFswXS5pZC5yZXBsYWNlKC8oW15BLVphLXowLTlfXC1dKS9nLCJcXFxcJDEiKTtyZXR1cm57aWQ6cyxpbnB1dDp0LHNlbGVjdGVkRGF5OjAsc2VsZWN0ZWRNb250aDowLHNlbGVjdGVkWWVhcjowLGRyYXdNb250aDowLGRyYXdZZWFyOjAsaW5saW5lOmksZHBEaXY6aT9uKGUoIjxkaXYgY2xhc3M9JyIrdGhpcy5faW5saW5lQ2xhc3MrIiB1aS1kYXRlcGlja2VyIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1oZWxwZXItY2xlYXJmaXggdWktY29ybmVyLWFsbCc+PC9kaXY+IikpOnRoaXMuZHBEaXZ9fSxfY29ubmVjdERhdGVwaWNrZXI6ZnVuY3Rpb24odCxpKXt2YXIgcz1lKHQpO2kuYXBwZW5kPWUoW10pLGkudHJpZ2dlcj1lKFtdKSxzLmhhc0NsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKXx8KHRoaXMuX2F0dGFjaG1lbnRzKHMsaSkscy5hZGRDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkua2V5ZG93bih0aGlzLl9kb0tleURvd24pLmtleXByZXNzKHRoaXMuX2RvS2V5UHJlc3MpLmtleXVwKHRoaXMuX2RvS2V5VXApLHRoaXMuX2F1dG9TaXplKGkpLGUuZGF0YSh0LCJkYXRlcGlja2VyIixpKSxpLnNldHRpbmdzLmRpc2FibGVkJiZ0aGlzLl9kaXNhYmxlRGF0ZXBpY2tlcih0KSl9LF9hdHRhY2htZW50czpmdW5jdGlvbih0LGkpe3ZhciBzLGEsbixyPXRoaXMuX2dldChpLCJhcHBlbmRUZXh0Iiksbz10aGlzLl9nZXQoaSwiaXNSVEwiKTtpLmFwcGVuZCYmaS5hcHBlbmQucmVtb3ZlKCksciYmKGkuYXBwZW5kPWUoIjxzcGFuIGNsYXNzPSciK3RoaXMuX2FwcGVuZENsYXNzKyInPiIrcisiPC9zcGFuPiIpLHRbbz8iYmVmb3JlIjoiYWZ0ZXIiXShpLmFwcGVuZCkpLHQudW5iaW5kKCJmb2N1cyIsdGhpcy5fc2hvd0RhdGVwaWNrZXIpLGkudHJpZ2dlciYmaS50cmlnZ2VyLnJlbW92ZSgpLHM9dGhpcy5fZ2V0KGksInNob3dPbiIpLCgiZm9jdXMiPT09c3x8ImJvdGgiPT09cykmJnQuZm9jdXModGhpcy5fc2hvd0RhdGVwaWNrZXIpLCgiYnV0dG9uIj09PXN8fCJib3RoIj09PXMpJiYoYT10aGlzLl9nZXQoaSwiYnV0dG9uVGV4dCIpLG49dGhpcy5fZ2V0KGksImJ1dHRvbkltYWdlIiksaS50cmlnZ2VyPWUodGhpcy5fZ2V0KGksImJ1dHRvbkltYWdlT25seSIpP2UoIjxpbWcvPiIpLmFkZENsYXNzKHRoaXMuX3RyaWdnZXJDbGFzcykuYXR0cih7c3JjOm4sYWx0OmEsdGl0bGU6YX0pOmUoIjxidXR0b24gdHlwZT0nYnV0dG9uJz48L2J1dHRvbj4iKS5hZGRDbGFzcyh0aGlzLl90cmlnZ2VyQ2xhc3MpLmh0bWwobj9lKCI8aW1nLz4iKS5hdHRyKHtzcmM6bixhbHQ6YSx0aXRsZTphfSk6YSkpLHRbbz8iYmVmb3JlIjoiYWZ0ZXIiXShpLnRyaWdnZXIpLGkudHJpZ2dlci5jbGljayhmdW5jdGlvbigpe3JldHVybiBlLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nJiZlLmRhdGVwaWNrZXIuX2xhc3RJbnB1dD09PXRbMF0/ZS5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpOmUuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcmJmUuZGF0ZXBpY2tlci5fbGFzdElucHV0IT09dFswXT8oZS5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpLGUuZGF0ZXBpY2tlci5fc2hvd0RhdGVwaWNrZXIodFswXSkpOmUuZGF0ZXBpY2tlci5fc2hvd0RhdGVwaWNrZXIodFswXSksITF9KSl9LF9hdXRvU2l6ZTpmdW5jdGlvbihlKXtpZih0aGlzLl9nZXQoZSwiYXV0b1NpemUiKSYmIWUuaW5saW5lKXt2YXIgdCxpLHMsYSxuPW5ldyBEYXRlKDIwMDksMTEsMjApLHI9dGhpcy5fZ2V0KGUsImRhdGVGb3JtYXQiKTtyLm1hdGNoKC9bRE1dLykmJih0PWZ1bmN0aW9uKGUpe2ZvcihpPTAscz0wLGE9MDtlLmxlbmd0aD5hO2ErKyllW2FdLmxlbmd0aD5pJiYoaT1lW2FdLmxlbmd0aCxzPWEpO3JldHVybiBzfSxuLnNldE1vbnRoKHQodGhpcy5fZ2V0KGUsci5tYXRjaCgvTU0vKT8ibW9udGhOYW1lcyI6Im1vbnRoTmFtZXNTaG9ydCIpKSksbi5zZXREYXRlKHQodGhpcy5fZ2V0KGUsci5tYXRjaCgvREQvKT8iZGF5TmFtZXMiOiJkYXlOYW1lc1Nob3J0IikpKzIwLW4uZ2V0RGF5KCkpKSxlLmlucHV0LmF0dHIoInNpemUiLHRoaXMuX2Zvcm1hdERhdGUoZSxuKS5sZW5ndGgpfX0sX2lubGluZURhdGVwaWNrZXI6ZnVuY3Rpb24odCxpKXt2YXIgcz1lKHQpO3MuaGFzQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpfHwocy5hZGRDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkuYXBwZW5kKGkuZHBEaXYpLGUuZGF0YSh0LCJkYXRlcGlja2VyIixpKSx0aGlzLl9zZXREYXRlKGksdGhpcy5fZ2V0RGVmYXVsdERhdGUoaSksITApLHRoaXMuX3VwZGF0ZURhdGVwaWNrZXIoaSksdGhpcy5fdXBkYXRlQWx0ZXJuYXRlKGkpLGkuc2V0dGluZ3MuZGlzYWJsZWQmJnRoaXMuX2Rpc2FibGVEYXRlcGlja2VyKHQpLGkuZHBEaXYuY3NzKCJkaXNwbGF5IiwiYmxvY2siKSl9LF9kaWFsb2dEYXRlcGlja2VyOmZ1bmN0aW9uKHQsaSxzLGEsbil7dmFyIHIsaCxsLHUsZCxjPXRoaXMuX2RpYWxvZ0luc3Q7cmV0dXJuIGN8fCh0aGlzLnV1aWQrPTEscj0iZHAiK3RoaXMudXVpZCx0aGlzLl9kaWFsb2dJbnB1dD1lKCI8aW5wdXQgdHlwZT0ndGV4dCcgaWQ9JyIrcisiJyBzdHlsZT0ncG9zaXRpb246IGFic29sdXRlOyB0b3A6IC0xMDBweDsgd2lkdGg6IDBweDsnLz4iKSx0aGlzLl9kaWFsb2dJbnB1dC5rZXlkb3duKHRoaXMuX2RvS2V5RG93biksZSgiYm9keSIpLmFwcGVuZCh0aGlzLl9kaWFsb2dJbnB1dCksYz10aGlzLl9kaWFsb2dJbnN0PXRoaXMuX25ld0luc3QodGhpcy5fZGlhbG9nSW5wdXQsITEpLGMuc2V0dGluZ3M9e30sZS5kYXRhKHRoaXMuX2RpYWxvZ0lucHV0WzBdLCJkYXRlcGlja2VyIixjKSksbyhjLnNldHRpbmdzLGF8fHt9KSxpPWkmJmkuY29uc3RydWN0b3I9PT1EYXRlP3RoaXMuX2Zvcm1hdERhdGUoYyxpKTppLHRoaXMuX2RpYWxvZ0lucHV0LnZhbChpKSx0aGlzLl9wb3M9bj9uLmxlbmd0aD9uOltuLnBhZ2VYLG4ucGFnZVldOm51bGwsdGhpcy5fcG9zfHwoaD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsbD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LHU9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnR8fGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCxkPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3B8fGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wLHRoaXMuX3Bvcz1baC8yLTEwMCt1LGwvMi0xNTArZF0pLHRoaXMuX2RpYWxvZ0lucHV0LmNzcygibGVmdCIsdGhpcy5fcG9zWzBdKzIwKyJweCIpLmNzcygidG9wIix0aGlzLl9wb3NbMV0rInB4IiksYy5zZXR0aW5ncy5vblNlbGVjdD1zLHRoaXMuX2luRGlhbG9nPSEwLHRoaXMuZHBEaXYuYWRkQ2xhc3ModGhpcy5fZGlhbG9nQ2xhc3MpLHRoaXMuX3Nob3dEYXRlcGlja2VyKHRoaXMuX2RpYWxvZ0lucHV0WzBdKSxlLmJsb2NrVUkmJmUuYmxvY2tVSSh0aGlzLmRwRGl2KSxlLmRhdGEodGhpcy5fZGlhbG9nSW5wdXRbMF0sImRhdGVwaWNrZXIiLGMpLHRoaXN9LF9kZXN0cm95RGF0ZXBpY2tlcjpmdW5jdGlvbih0KXt2YXIgaSxzPWUodCksYT1lLmRhdGEodCwiZGF0ZXBpY2tlciIpO3MuaGFzQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpJiYoaT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksZS5yZW1vdmVEYXRhKHQsImRhdGVwaWNrZXIiKSwiaW5wdXQiPT09aT8oYS5hcHBlbmQucmVtb3ZlKCksYS50cmlnZ2VyLnJlbW92ZSgpLHMucmVtb3ZlQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpLnVuYmluZCgiZm9jdXMiLHRoaXMuX3Nob3dEYXRlcGlja2VyKS51bmJpbmQoImtleWRvd24iLHRoaXMuX2RvS2V5RG93bikudW5iaW5kKCJrZXlwcmVzcyIsdGhpcy5fZG9LZXlQcmVzcykudW5iaW5kKCJrZXl1cCIsdGhpcy5fZG9LZXlVcCkpOigiZGl2Ij09PWl8fCJzcGFuIj09PWkpJiZzLnJlbW92ZUNsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKS5lbXB0eSgpLGg9PT1hJiYoaD1udWxsKSl9LF9lbmFibGVEYXRlcGlja2VyOmZ1bmN0aW9uKHQpe3ZhciBpLHMsYT1lKHQpLG49ZS5kYXRhKHQsImRhdGVwaWNrZXIiKTthLmhhc0NsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKSYmKGk9dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCJpbnB1dCI9PT1pPyh0LmRpc2FibGVkPSExLG4udHJpZ2dlci5maWx0ZXIoImJ1dHRvbiIpLmVhY2goZnVuY3Rpb24oKXt0aGlzLmRpc2FibGVkPSExfSkuZW5kKCkuZmlsdGVyKCJpbWciKS5jc3Moe29wYWNpdHk6IjEuMCIsY3Vyc29yOiIifSkpOigiZGl2Ij09PWl8fCJzcGFuIj09PWkpJiYocz1hLmNoaWxkcmVuKCIuIit0aGlzLl9pbmxpbmVDbGFzcykscy5jaGlsZHJlbigpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpLHMuZmluZCgic2VsZWN0LnVpLWRhdGVwaWNrZXItbW9udGgsIHNlbGVjdC51aS1kYXRlcGlja2VyLXllYXIiKS5wcm9wKCJkaXNhYmxlZCIsITEpKSx0aGlzLl9kaXNhYmxlZElucHV0cz1lLm1hcCh0aGlzLl9kaXNhYmxlZElucHV0cyxmdW5jdGlvbihlKXtyZXR1cm4gZT09PXQ/bnVsbDplfSkpfSxfZGlzYWJsZURhdGVwaWNrZXI6ZnVuY3Rpb24odCl7dmFyIGkscyxhPWUodCksbj1lLmRhdGEodCwiZGF0ZXBpY2tlciIpO2EuaGFzQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpJiYoaT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksImlucHV0Ij09PWk/KHQuZGlzYWJsZWQ9ITAsbi50cmlnZ2VyLmZpbHRlcigiYnV0dG9uIikuZWFjaChmdW5jdGlvbigpe3RoaXMuZGlzYWJsZWQ9ITB9KS5lbmQoKS5maWx0ZXIoImltZyIpLmNzcyh7b3BhY2l0eToiMC41IixjdXJzb3I6ImRlZmF1bHQifSkpOigiZGl2Ij09PWl8fCJzcGFuIj09PWkpJiYocz1hLmNoaWxkcmVuKCIuIit0aGlzLl9pbmxpbmVDbGFzcykscy5jaGlsZHJlbigpLmFkZENsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpLHMuZmluZCgic2VsZWN0LnVpLWRhdGVwaWNrZXItbW9udGgsIHNlbGVjdC51aS1kYXRlcGlja2VyLXllYXIiKS5wcm9wKCJkaXNhYmxlZCIsITApKSx0aGlzLl9kaXNhYmxlZElucHV0cz1lLm1hcCh0aGlzLl9kaXNhYmxlZElucHV0cyxmdW5jdGlvbihlKXtyZXR1cm4gZT09PXQ/bnVsbDplfSksdGhpcy5fZGlzYWJsZWRJbnB1dHNbdGhpcy5fZGlzYWJsZWRJbnB1dHMubGVuZ3RoXT10KX0sX2lzRGlzYWJsZWREYXRlcGlja2VyOmZ1bmN0aW9uKGUpe2lmKCFlKXJldHVybiExO2Zvcih2YXIgdD0wO3RoaXMuX2Rpc2FibGVkSW5wdXRzLmxlbmd0aD50O3QrKylpZih0aGlzLl9kaXNhYmxlZElucHV0c1t0XT09PWUpcmV0dXJuITA7cmV0dXJuITF9LF9nZXRJbnN0OmZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4gZS5kYXRhKHQsImRhdGVwaWNrZXIiKX1jYXRjaChpKXt0aHJvdyJNaXNzaW5nIGluc3RhbmNlIGRhdGEgZm9yIHRoaXMgZGF0ZXBpY2tlciJ9fSxfb3B0aW9uRGF0ZXBpY2tlcjpmdW5jdGlvbih0LGkscyl7dmFyIGEsbixyLGgsbD10aGlzLl9nZXRJbnN0KHQpO3JldHVybiAyPT09YXJndW1lbnRzLmxlbmd0aCYmInN0cmluZyI9PXR5cGVvZiBpPyJkZWZhdWx0cyI9PT1pP2UuZXh0ZW5kKHt9LGUuZGF0ZXBpY2tlci5fZGVmYXVsdHMpOmw/ImFsbCI9PT1pP2UuZXh0ZW5kKHt9LGwuc2V0dGluZ3MpOnRoaXMuX2dldChsLGkpOm51bGw6KGE9aXx8e30sInN0cmluZyI9PXR5cGVvZiBpJiYoYT17fSxhW2ldPXMpLGwmJih0aGlzLl9jdXJJbnN0PT09bCYmdGhpcy5faGlkZURhdGVwaWNrZXIoKSxuPXRoaXMuX2dldERhdGVEYXRlcGlja2VyKHQsITApLHI9dGhpcy5fZ2V0TWluTWF4RGF0ZShsLCJtaW4iKSxoPXRoaXMuX2dldE1pbk1heERhdGUobCwibWF4IiksbyhsLnNldHRpbmdzLGEpLG51bGwhPT1yJiZ2b2lkIDAhPT1hLmRhdGVGb3JtYXQmJnZvaWQgMD09PWEubWluRGF0ZSYmKGwuc2V0dGluZ3MubWluRGF0ZT10aGlzLl9mb3JtYXREYXRlKGwscikpLG51bGwhPT1oJiZ2b2lkIDAhPT1hLmRhdGVGb3JtYXQmJnZvaWQgMD09PWEubWF4RGF0ZSYmKGwuc2V0dGluZ3MubWF4RGF0ZT10aGlzLl9mb3JtYXREYXRlKGwsaCkpLCJkaXNhYmxlZCJpbiBhJiYoYS5kaXNhYmxlZD90aGlzLl9kaXNhYmxlRGF0ZXBpY2tlcih0KTp0aGlzLl9lbmFibGVEYXRlcGlja2VyKHQpKSx0aGlzLl9hdHRhY2htZW50cyhlKHQpLGwpLHRoaXMuX2F1dG9TaXplKGwpLHRoaXMuX3NldERhdGUobCxuKSx0aGlzLl91cGRhdGVBbHRlcm5hdGUobCksdGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihsKSksdm9pZCAwKX0sX2NoYW5nZURhdGVwaWNrZXI6ZnVuY3Rpb24oZSx0LGkpe3RoaXMuX29wdGlvbkRhdGVwaWNrZXIoZSx0LGkpfSxfcmVmcmVzaERhdGVwaWNrZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fZ2V0SW5zdChlKTt0JiZ0aGlzLl91cGRhdGVEYXRlcGlja2VyKHQpfSxfc2V0RGF0ZURhdGVwaWNrZXI6ZnVuY3Rpb24oZSx0KXt2YXIgaT10aGlzLl9nZXRJbnN0KGUpO2kmJih0aGlzLl9zZXREYXRlKGksdCksdGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihpKSx0aGlzLl91cGRhdGVBbHRlcm5hdGUoaSkpfSxfZ2V0RGF0ZURhdGVwaWNrZXI6ZnVuY3Rpb24oZSx0KXt2YXIgaT10aGlzLl9nZXRJbnN0KGUpO3JldHVybiBpJiYhaS5pbmxpbmUmJnRoaXMuX3NldERhdGVGcm9tRmllbGQoaSx0KSxpP3RoaXMuX2dldERhdGUoaSk6bnVsbH0sX2RvS2V5RG93bjpmdW5jdGlvbih0KXt2YXIgaSxzLGEsbj1lLmRhdGVwaWNrZXIuX2dldEluc3QodC50YXJnZXQpLHI9ITAsbz1uLmRwRGl2LmlzKCIudWktZGF0ZXBpY2tlci1ydGwiKTtpZihuLl9rZXlFdmVudD0hMCxlLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nKXN3aXRjaCh0LmtleUNvZGUpe2Nhc2UgOTplLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCkscj0hMTticmVhaztjYXNlIDEzOnJldHVybiBhPWUoInRkLiIrZS5kYXRlcGlja2VyLl9kYXlPdmVyQ2xhc3MrIjpub3QoLiIrZS5kYXRlcGlja2VyLl9jdXJyZW50Q2xhc3MrIikiLG4uZHBEaXYpLGFbMF0mJmUuZGF0ZXBpY2tlci5fc2VsZWN0RGF5KHQudGFyZ2V0LG4uc2VsZWN0ZWRNb250aCxuLnNlbGVjdGVkWWVhcixhWzBdKSxpPWUuZGF0ZXBpY2tlci5fZ2V0KG4sIm9uU2VsZWN0IiksaT8ocz1lLmRhdGVwaWNrZXIuX2Zvcm1hdERhdGUobiksaS5hcHBseShuLmlucHV0P24uaW5wdXRbMF06bnVsbCxbcyxuXSkpOmUuZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoKSwhMTtjYXNlIDI3OmUuZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoKTticmVhaztjYXNlIDMzOmUuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZSh0LnRhcmdldCx0LmN0cmxLZXk/LWUuZGF0ZXBpY2tlci5fZ2V0KG4sInN0ZXBCaWdNb250aHMiKTotZS5kYXRlcGlja2VyLl9nZXQobiwic3RlcE1vbnRocyIpLCJNIik7YnJlYWs7Y2FzZSAzNDplLmRhdGVwaWNrZXIuX2FkanVzdERhdGUodC50YXJnZXQsdC5jdHJsS2V5PytlLmRhdGVwaWNrZXIuX2dldChuLCJzdGVwQmlnTW9udGhzIik6K2UuZGF0ZXBpY2tlci5fZ2V0KG4sInN0ZXBNb250aHMiKSwiTSIpO2JyZWFrO2Nhc2UgMzU6KHQuY3RybEtleXx8dC5tZXRhS2V5KSYmZS5kYXRlcGlja2VyLl9jbGVhckRhdGUodC50YXJnZXQpLHI9dC5jdHJsS2V5fHx0Lm1ldGFLZXk7YnJlYWs7Y2FzZSAzNjoodC5jdHJsS2V5fHx0Lm1ldGFLZXkpJiZlLmRhdGVwaWNrZXIuX2dvdG9Ub2RheSh0LnRhcmdldCkscj10LmN0cmxLZXl8fHQubWV0YUtleTticmVhaztjYXNlIDM3Oih0LmN0cmxLZXl8fHQubWV0YUtleSkmJmUuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZSh0LnRhcmdldCxvPzE6LTEsIkQiKSxyPXQuY3RybEtleXx8dC5tZXRhS2V5LHQub3JpZ2luYWxFdmVudC5hbHRLZXkmJmUuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZSh0LnRhcmdldCx0LmN0cmxLZXk/LWUuZGF0ZXBpY2tlci5fZ2V0KG4sInN0ZXBCaWdNb250aHMiKTotZS5kYXRlcGlja2VyLl9nZXQobiwic3RlcE1vbnRocyIpLCJNIik7YnJlYWs7Y2FzZSAzODoodC5jdHJsS2V5fHx0Lm1ldGFLZXkpJiZlLmRhdGVwaWNrZXIuX2FkanVzdERhdGUodC50YXJnZXQsLTcsIkQiKSxyPXQuY3RybEtleXx8dC5tZXRhS2V5O2JyZWFrO2Nhc2UgMzk6KHQuY3RybEtleXx8dC5tZXRhS2V5KSYmZS5kYXRlcGlja2VyLl9hZGp1c3REYXRlKHQudGFyZ2V0LG8/LTE6MSwiRCIpLHI9dC5jdHJsS2V5fHx0Lm1ldGFLZXksdC5vcmlnaW5hbEV2ZW50LmFsdEtleSYmZS5kYXRlcGlja2VyLl9hZGp1c3REYXRlKHQudGFyZ2V0LHQuY3RybEtleT8rZS5kYXRlcGlja2VyLl9nZXQobiwic3RlcEJpZ01vbnRocyIpOitlLmRhdGVwaWNrZXIuX2dldChuLCJzdGVwTW9udGhzIiksIk0iKTticmVhaztjYXNlIDQwOih0LmN0cmxLZXl8fHQubWV0YUtleSkmJmUuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZSh0LnRhcmdldCw3LCJEIikscj10LmN0cmxLZXl8fHQubWV0YUtleTticmVhaztkZWZhdWx0OnI9ITF9ZWxzZSAzNj09PXQua2V5Q29kZSYmdC5jdHJsS2V5P2UuZGF0ZXBpY2tlci5fc2hvd0RhdGVwaWNrZXIodGhpcyk6cj0hMTtyJiYodC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCkpfSxfZG9LZXlQcmVzczpmdW5jdGlvbih0KXt2YXIgaSxzLGE9ZS5kYXRlcGlja2VyLl9nZXRJbnN0KHQudGFyZ2V0KTtyZXR1cm4gZS5kYXRlcGlja2VyLl9nZXQoYSwiY29uc3RyYWluSW5wdXQiKT8oaT1lLmRhdGVwaWNrZXIuX3Bvc3NpYmxlQ2hhcnMoZS5kYXRlcGlja2VyLl9nZXQoYSwiZGF0ZUZvcm1hdCIpKSxzPVN0cmluZy5mcm9tQ2hhckNvZGUobnVsbD09dC5jaGFyQ29kZT90LmtleUNvZGU6dC5jaGFyQ29kZSksdC5jdHJsS2V5fHx0Lm1ldGFLZXl8fCIgIj5zfHwhaXx8aS5pbmRleE9mKHMpPi0xKTp2b2lkIDB9LF9kb0tleVVwOmZ1bmN0aW9uKHQpe3ZhciBpLHM9ZS5kYXRlcGlja2VyLl9nZXRJbnN0KHQudGFyZ2V0KTtpZihzLmlucHV0LnZhbCgpIT09cy5sYXN0VmFsKXRyeXtpPWUuZGF0ZXBpY2tlci5wYXJzZURhdGUoZS5kYXRlcGlja2VyLl9nZXQocywiZGF0ZUZvcm1hdCIpLHMuaW5wdXQ/cy5pbnB1dC52YWwoKTpudWxsLGUuZGF0ZXBpY2tlci5fZ2V0Rm9ybWF0Q29uZmlnKHMpKSxpJiYoZS5kYXRlcGlja2VyLl9zZXREYXRlRnJvbUZpZWxkKHMpLGUuZGF0ZXBpY2tlci5fdXBkYXRlQWx0ZXJuYXRlKHMpLGUuZGF0ZXBpY2tlci5fdXBkYXRlRGF0ZXBpY2tlcihzKSl9Y2F0Y2goYSl7fXJldHVybiEwfSxfc2hvd0RhdGVwaWNrZXI6ZnVuY3Rpb24odCl7aWYodD10LnRhcmdldHx8dCwiaW5wdXQiIT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYodD1lKCJpbnB1dCIsdC5wYXJlbnROb2RlKVswXSksIWUuZGF0ZXBpY2tlci5faXNEaXNhYmxlZERhdGVwaWNrZXIodCkmJmUuZGF0ZXBpY2tlci5fbGFzdElucHV0IT09dCl7dmFyIGksYSxuLHIsaCxsLHU7aT1lLmRhdGVwaWNrZXIuX2dldEluc3QodCksZS5kYXRlcGlja2VyLl9jdXJJbnN0JiZlLmRhdGVwaWNrZXIuX2N1ckluc3QhPT1pJiYoZS5kYXRlcGlja2VyLl9jdXJJbnN0LmRwRGl2LnN0b3AoITAsITApLGkmJmUuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcmJmUuZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoZS5kYXRlcGlja2VyLl9jdXJJbnN0LmlucHV0WzBdKSksYT1lLmRhdGVwaWNrZXIuX2dldChpLCJiZWZvcmVTaG93Iiksbj1hP2EuYXBwbHkodCxbdCxpXSk6e30sbiE9PSExJiYobyhpLnNldHRpbmdzLG4pLGkubGFzdFZhbD1udWxsLGUuZGF0ZXBpY2tlci5fbGFzdElucHV0PXQsZS5kYXRlcGlja2VyLl9zZXREYXRlRnJvbUZpZWxkKGkpLGUuZGF0ZXBpY2tlci5faW5EaWFsb2cmJih0LnZhbHVlPSIiKSxlLmRhdGVwaWNrZXIuX3Bvc3x8KGUuZGF0ZXBpY2tlci5fcG9zPWUuZGF0ZXBpY2tlci5fZmluZFBvcyh0KSxlLmRhdGVwaWNrZXIuX3Bvc1sxXSs9dC5vZmZzZXRIZWlnaHQpLHI9ITEsZSh0KS5wYXJlbnRzKCkuZWFjaChmdW5jdGlvbigpe3JldHVybiByfD0iZml4ZWQiPT09ZSh0aGlzKS5jc3MoInBvc2l0aW9uIiksIXJ9KSxoPXtsZWZ0OmUuZGF0ZXBpY2tlci5fcG9zWzBdLHRvcDplLmRhdGVwaWNrZXIuX3Bvc1sxXX0sZS5kYXRlcGlja2VyLl9wb3M9bnVsbCxpLmRwRGl2LmVtcHR5KCksaS5kcERpdi5jc3Moe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsZGlzcGxheToiYmxvY2siLHRvcDoiLTEwMDBweCJ9KSxlLmRhdGVwaWNrZXIuX3VwZGF0ZURhdGVwaWNrZXIoaSksaD1lLmRhdGVwaWNrZXIuX2NoZWNrT2Zmc2V0KGksaCxyKSxpLmRwRGl2LmNzcyh7cG9zaXRpb246ZS5kYXRlcGlja2VyLl9pbkRpYWxvZyYmZS5ibG9ja1VJPyJzdGF0aWMiOnI/ImZpeGVkIjoiYWJzb2x1dGUiLGRpc3BsYXk6Im5vbmUiLGxlZnQ6aC5sZWZ0KyJweCIsdG9wOmgudG9wKyJweCJ9KSxpLmlubGluZXx8KGw9ZS5kYXRlcGlja2VyLl9nZXQoaSwic2hvd0FuaW0iKSx1PWUuZGF0ZXBpY2tlci5fZ2V0KGksImR1cmF0aW9uIiksaS5kcERpdi5jc3MoInotaW5kZXgiLHMoZSh0KSkrMSksZS5kYXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZz0hMCxlLmVmZmVjdHMmJmUuZWZmZWN0cy5lZmZlY3RbbF0/aS5kcERpdi5zaG93KGwsZS5kYXRlcGlja2VyLl9nZXQoaSwic2hvd09wdGlvbnMiKSx1KTppLmRwRGl2W2x8fCJzaG93Il0obD91Om51bGwpLGUuZGF0ZXBpY2tlci5fc2hvdWxkRm9jdXNJbnB1dChpKSYmaS5pbnB1dC5mb2N1cygpLGUuZGF0ZXBpY2tlci5fY3VySW5zdD1pKSl9fSxfdXBkYXRlRGF0ZXBpY2tlcjpmdW5jdGlvbih0KXt0aGlzLm1heFJvd3M9NCxoPXQsdC5kcERpdi5lbXB0eSgpLmFwcGVuZCh0aGlzLl9nZW5lcmF0ZUhUTUwodCkpLHRoaXMuX2F0dGFjaEhhbmRsZXJzKHQpO3ZhciBpLHM9dGhpcy5fZ2V0TnVtYmVyT2ZNb250aHModCksYT1zWzFdLG49MTcsbz10LmRwRGl2LmZpbmQoIi4iK3RoaXMuX2RheU92ZXJDbGFzcysiIGEiKTtvLmxlbmd0aD4wJiZyLmFwcGx5KG8uZ2V0KDApKSx0LmRwRGl2LnJlbW92ZUNsYXNzKCJ1aS1kYXRlcGlja2VyLW11bHRpLTIgdWktZGF0ZXBpY2tlci1tdWx0aS0zIHVpLWRhdGVwaWNrZXItbXVsdGktNCIpLndpZHRoKCIiKSxhPjEmJnQuZHBEaXYuYWRkQ2xhc3MoInVpLWRhdGVwaWNrZXItbXVsdGktIithKS5jc3MoIndpZHRoIixuKmErImVtIiksdC5kcERpdlsoMSE9PXNbMF18fDEhPT1zWzFdPyJhZGQiOiJyZW1vdmUiKSsiQ2xhc3MiXSgidWktZGF0ZXBpY2tlci1tdWx0aSIpLHQuZHBEaXZbKHRoaXMuX2dldCh0LCJpc1JUTCIpPyJhZGQiOiJyZW1vdmUiKSsiQ2xhc3MiXSgidWktZGF0ZXBpY2tlci1ydGwiKSx0PT09ZS5kYXRlcGlja2VyLl9jdXJJbnN0JiZlLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nJiZlLmRhdGVwaWNrZXIuX3Nob3VsZEZvY3VzSW5wdXQodCkmJnQuaW5wdXQuZm9jdXMoKSx0LnllYXJzaHRtbCYmKGk9dC55ZWFyc2h0bWwsc2V0VGltZW91dChmdW5jdGlvbigpe2k9PT10LnllYXJzaHRtbCYmdC55ZWFyc2h0bWwmJnQuZHBEaXYuZmluZCgic2VsZWN0LnVpLWRhdGVwaWNrZXIteWVhcjpmaXJzdCIpLnJlcGxhY2VXaXRoKHQueWVhcnNodG1sKSxpPXQueWVhcnNodG1sPW51bGx9LDApKX0sX3Nob3VsZEZvY3VzSW5wdXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5wdXQmJmUuaW5wdXQuaXMoIjp2aXNpYmxlIikmJiFlLmlucHV0LmlzKCI6ZGlzYWJsZWQiKSYmIWUuaW5wdXQuaXMoIjpmb2N1cyIpfSxfY2hlY2tPZmZzZXQ6ZnVuY3Rpb24odCxpLHMpe3ZhciBhPXQuZHBEaXYub3V0ZXJXaWR0aCgpLG49dC5kcERpdi5vdXRlckhlaWdodCgpLHI9dC5pbnB1dD90LmlucHV0Lm91dGVyV2lkdGgoKTowLG89dC5pbnB1dD90LmlucHV0Lm91dGVySGVpZ2h0KCk6MCxoPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCsocz8wOmUoZG9jdW1lbnQpLnNjcm9sbExlZnQoKSksbD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KyhzPzA6ZShkb2N1bWVudCkuc2Nyb2xsVG9wKCkpO3JldHVybiBpLmxlZnQtPXRoaXMuX2dldCh0LCJpc1JUTCIpP2EtcjowLGkubGVmdC09cyYmaS5sZWZ0PT09dC5pbnB1dC5vZmZzZXQoKS5sZWZ0P2UoZG9jdW1lbnQpLnNjcm9sbExlZnQoKTowLGkudG9wLT1zJiZpLnRvcD09PXQuaW5wdXQub2Zmc2V0KCkudG9wK28/ZShkb2N1bWVudCkuc2Nyb2xsVG9wKCk6MCxpLmxlZnQtPU1hdGgubWluKGkubGVmdCxpLmxlZnQrYT5oJiZoPmE/TWF0aC5hYnMoaS5sZWZ0K2EtaCk6MCksaS50b3AtPU1hdGgubWluKGkudG9wLGkudG9wK24+bCYmbD5uP01hdGguYWJzKG4rbyk6MCksaX0sX2ZpbmRQb3M6ZnVuY3Rpb24odCl7Zm9yKHZhciBpLHM9dGhpcy5fZ2V0SW5zdCh0KSxhPXRoaXMuX2dldChzLCJpc1JUTCIpO3QmJigiaGlkZGVuIj09PXQudHlwZXx8MSE9PXQubm9kZVR5cGV8fGUuZXhwci5maWx0ZXJzLmhpZGRlbih0KSk7KXQ9dFthPyJwcmV2aW91c1NpYmxpbmciOiJuZXh0U2libGluZyJdO3JldHVybiBpPWUodCkub2Zmc2V0KCksW2kubGVmdCxpLnRvcF19LF9oaWRlRGF0ZXBpY2tlcjpmdW5jdGlvbih0KXt2YXIgaSxzLGEsbixyPXRoaXMuX2N1ckluc3Q7IXJ8fHQmJnIhPT1lLmRhdGEodCwiZGF0ZXBpY2tlciIpfHx0aGlzLl9kYXRlcGlja2VyU2hvd2luZyYmKGk9dGhpcy5fZ2V0KHIsInNob3dBbmltIikscz10aGlzLl9nZXQociwiZHVyYXRpb24iKSxhPWZ1bmN0aW9uKCl7ZS5kYXRlcGlja2VyLl90aWR5RGlhbG9nKHIpfSxlLmVmZmVjdHMmJihlLmVmZmVjdHMuZWZmZWN0W2ldfHxlLmVmZmVjdHNbaV0pP3IuZHBEaXYuaGlkZShpLGUuZGF0ZXBpY2tlci5fZ2V0KHIsInNob3dPcHRpb25zIikscyxhKTpyLmRwRGl2WyJzbGlkZURvd24iPT09aT8ic2xpZGVVcCI6ImZhZGVJbiI9PT1pPyJmYWRlT3V0IjoiaGlkZSJdKGk/czpudWxsLGEpLGl8fGEoKSx0aGlzLl9kYXRlcGlja2VyU2hvd2luZz0hMSxuPXRoaXMuX2dldChyLCJvbkNsb3NlIiksbiYmbi5hcHBseShyLmlucHV0P3IuaW5wdXRbMF06bnVsbCxbci5pbnB1dD9yLmlucHV0LnZhbCgpOiIiLHJdKSx0aGlzLl9sYXN0SW5wdXQ9bnVsbCx0aGlzLl9pbkRpYWxvZyYmKHRoaXMuX2RpYWxvZ0lucHV0LmNzcyh7cG9zaXRpb246ImFic29sdXRlIixsZWZ0OiIwIix0b3A6Ii0xMDBweCJ9KSxlLmJsb2NrVUkmJihlLnVuYmxvY2tVSSgpLGUoImJvZHkiKS5hcHBlbmQodGhpcy5kcERpdikpKSx0aGlzLl9pbkRpYWxvZz0hMSl9LF90aWR5RGlhbG9nOmZ1bmN0aW9uKGUpe2UuZHBEaXYucmVtb3ZlQ2xhc3ModGhpcy5fZGlhbG9nQ2xhc3MpLnVuYmluZCgiLnVpLWRhdGVwaWNrZXItY2FsZW5kYXIiKX0sX2NoZWNrRXh0ZXJuYWxDbGljazpmdW5jdGlvbih0KXtpZihlLmRhdGVwaWNrZXIuX2N1ckluc3Qpe3ZhciBpPWUodC50YXJnZXQpLHM9ZS5kYXRlcGlja2VyLl9nZXRJbnN0KGlbMF0pOyhpWzBdLmlkIT09ZS5kYXRlcGlja2VyLl9tYWluRGl2SWQmJjA9PT1pLnBhcmVudHMoIiMiK2UuZGF0ZXBpY2tlci5fbWFpbkRpdklkKS5sZW5ndGgmJiFpLmhhc0NsYXNzKGUuZGF0ZXBpY2tlci5tYXJrZXJDbGFzc05hbWUpJiYhaS5jbG9zZXN0KCIuIitlLmRhdGVwaWNrZXIuX3RyaWdnZXJDbGFzcykubGVuZ3RoJiZlLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nJiYoIWUuZGF0ZXBpY2tlci5faW5EaWFsb2d8fCFlLmJsb2NrVUkpfHxpLmhhc0NsYXNzKGUuZGF0ZXBpY2tlci5tYXJrZXJDbGFzc05hbWUpJiZlLmRhdGVwaWNrZXIuX2N1ckluc3QhPT1zKSYmZS5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpfX0sX2FkanVzdERhdGU6ZnVuY3Rpb24odCxpLHMpe3ZhciBhPWUodCksbj10aGlzLl9nZXRJbnN0KGFbMF0pO3RoaXMuX2lzRGlzYWJsZWREYXRlcGlja2VyKGFbMF0pfHwodGhpcy5fYWRqdXN0SW5zdERhdGUobixpKygiTSI9PT1zP3RoaXMuX2dldChuLCJzaG93Q3VycmVudEF0UG9zIik6MCkscyksdGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihuKSl9LF9nb3RvVG9kYXk6ZnVuY3Rpb24odCl7dmFyIGkscz1lKHQpLGE9dGhpcy5fZ2V0SW5zdChzWzBdKTt0aGlzLl9nZXQoYSwiZ290b0N1cnJlbnQiKSYmYS5jdXJyZW50RGF5PyhhLnNlbGVjdGVkRGF5PWEuY3VycmVudERheSxhLmRyYXdNb250aD1hLnNlbGVjdGVkTW9udGg9YS5jdXJyZW50TW9udGgsYS5kcmF3WWVhcj1hLnNlbGVjdGVkWWVhcj1hLmN1cnJlbnRZZWFyKTooaT1uZXcgRGF0ZSxhLnNlbGVjdGVkRGF5PWkuZ2V0RGF0ZSgpLGEuZHJhd01vbnRoPWEuc2VsZWN0ZWRNb250aD1pLmdldE1vbnRoKCksYS5kcmF3WWVhcj1hLnNlbGVjdGVkWWVhcj1pLmdldEZ1bGxZZWFyKCkpLHRoaXMuX25vdGlmeUNoYW5nZShhKSx0aGlzLl9hZGp1c3REYXRlKHMpfSxfc2VsZWN0TW9udGhZZWFyOmZ1bmN0aW9uKHQsaSxzKXt2YXIgYT1lKHQpLG49dGhpcy5fZ2V0SW5zdChhWzBdKTtuWyJzZWxlY3RlZCIrKCJNIj09PXM/Ik1vbnRoIjoiWWVhciIpXT1uWyJkcmF3IisoIk0iPT09cz8iTW9udGgiOiJZZWFyIildPXBhcnNlSW50KGkub3B0aW9uc1tpLnNlbGVjdGVkSW5kZXhdLnZhbHVlLDEwKSx0aGlzLl9ub3RpZnlDaGFuZ2UobiksdGhpcy5fYWRqdXN0RGF0ZShhKX0sX3NlbGVjdERheTpmdW5jdGlvbih0LGkscyxhKXt2YXIgbixyPWUodCk7ZShhKS5oYXNDbGFzcyh0aGlzLl91bnNlbGVjdGFibGVDbGFzcyl8fHRoaXMuX2lzRGlzYWJsZWREYXRlcGlja2VyKHJbMF0pfHwobj10aGlzLl9nZXRJbnN0KHJbMF0pLG4uc2VsZWN0ZWREYXk9bi5jdXJyZW50RGF5PWUoImEiLGEpLmh0bWwoKSxuLnNlbGVjdGVkTW9udGg9bi5jdXJyZW50TW9udGg9aSxuLnNlbGVjdGVkWWVhcj1uLmN1cnJlbnRZZWFyPXMsdGhpcy5fc2VsZWN0RGF0ZSh0LHRoaXMuX2Zvcm1hdERhdGUobixuLmN1cnJlbnREYXksbi5jdXJyZW50TW9udGgsbi5jdXJyZW50WWVhcikpKX0sX2NsZWFyRGF0ZTpmdW5jdGlvbih0KXt2YXIgaT1lKHQpO3RoaXMuX3NlbGVjdERhdGUoaSwiIil9LF9zZWxlY3REYXRlOmZ1bmN0aW9uKHQsaSl7dmFyIHMsYT1lKHQpLG49dGhpcy5fZ2V0SW5zdChhWzBdKTtpPW51bGwhPWk/aTp0aGlzLl9mb3JtYXREYXRlKG4pLG4uaW5wdXQmJm4uaW5wdXQudmFsKGkpLHRoaXMuX3VwZGF0ZUFsdGVybmF0ZShuKSxzPXRoaXMuX2dldChuLCJvblNlbGVjdCIpLHM/cy5hcHBseShuLmlucHV0P24uaW5wdXRbMF06bnVsbCxbaSxuXSk6bi5pbnB1dCYmbi5pbnB1dC50cmlnZ2VyKCJjaGFuZ2UiKSxuLmlubGluZT90aGlzLl91cGRhdGVEYXRlcGlja2VyKG4pOih0aGlzLl9oaWRlRGF0ZXBpY2tlcigpLHRoaXMuX2xhc3RJbnB1dD1uLmlucHV0WzBdLCJvYmplY3QiIT10eXBlb2Ygbi5pbnB1dFswXSYmbi5pbnB1dC5mb2N1cygpLHRoaXMuX2xhc3RJbnB1dD1udWxsKX0sX3VwZGF0ZUFsdGVybmF0ZTpmdW5jdGlvbih0KXt2YXIgaSxzLGEsbj10aGlzLl9nZXQodCwiYWx0RmllbGQiKTtuJiYoaT10aGlzLl9nZXQodCwiYWx0Rm9ybWF0Iil8fHRoaXMuX2dldCh0LCJkYXRlRm9ybWF0Iikscz10aGlzLl9nZXREYXRlKHQpLGE9dGhpcy5mb3JtYXREYXRlKGkscyx0aGlzLl9nZXRGb3JtYXRDb25maWcodCkpLGUobikuZWFjaChmdW5jdGlvbigpe2UodGhpcykudmFsKGEpfSkpfSxub1dlZWtlbmRzOmZ1bmN0aW9uKGUpe3ZhciB0PWUuZ2V0RGF5KCk7cmV0dXJuW3Q+MCYmNj50LCIiXX0saXNvODYwMVdlZWs6ZnVuY3Rpb24oZSl7dmFyIHQsaT1uZXcgRGF0ZShlLmdldFRpbWUoKSk7cmV0dXJuIGkuc2V0RGF0ZShpLmdldERhdGUoKSs0LShpLmdldERheSgpfHw3KSksdD1pLmdldFRpbWUoKSxpLnNldE1vbnRoKDApLGkuc2V0RGF0ZSgxKSxNYXRoLmZsb29yKE1hdGgucm91bmQoKHQtaSkvODY0ZTUpLzcpKzF9LHBhcnNlRGF0ZTpmdW5jdGlvbih0LGkscyl7aWYobnVsbD09dHx8bnVsbD09aSl0aHJvdyJJbnZhbGlkIGFyZ3VtZW50cyI7aWYoaT0ib2JqZWN0Ij09dHlwZW9mIGk/IiIraTppKyIiLCIiPT09aSlyZXR1cm4gbnVsbDt2YXIgYSxuLHIsbyxoPTAsbD0ocz9zLnNob3J0WWVhckN1dG9mZjpudWxsKXx8dGhpcy5fZGVmYXVsdHMuc2hvcnRZZWFyQ3V0b2ZmLHU9InN0cmluZyIhPXR5cGVvZiBsP2w6KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpJTEwMCtwYXJzZUludChsLDEwKSxkPShzP3MuZGF5TmFtZXNTaG9ydDpudWxsKXx8dGhpcy5fZGVmYXVsdHMuZGF5TmFtZXNTaG9ydCxjPShzP3MuZGF5TmFtZXM6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLmRheU5hbWVzLHA9KHM/cy5tb250aE5hbWVzU2hvcnQ6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLm1vbnRoTmFtZXNTaG9ydCxmPShzP3MubW9udGhOYW1lczpudWxsKXx8dGhpcy5fZGVmYXVsdHMubW9udGhOYW1lcyxtPS0xLGc9LTEsdj0tMSx5PS0xLGI9ITEsXz1mdW5jdGlvbihlKXt2YXIgaT10Lmxlbmd0aD5hKzEmJnQuY2hhckF0KGErMSk9PT1lO3JldHVybiBpJiZhKyssaX0seD1mdW5jdGlvbihlKXt2YXIgdD1fKGUpLHM9IkAiPT09ZT8xNDoiISI9PT1lPzIwOiJ5Ij09PWUmJnQ/NDoibyI9PT1lPzM6MixhPSJ5Ij09PWU/czoxLG49UmVnRXhwKCJeXFxkeyIrYSsiLCIrcysifSIpLHI9aS5zdWJzdHJpbmcoaCkubWF0Y2gobik7aWYoIXIpdGhyb3ciTWlzc2luZyBudW1iZXIgYXQgcG9zaXRpb24gIitoO3JldHVybiBoKz1yWzBdLmxlbmd0aCxwYXJzZUludChyWzBdLDEwKX0saz1mdW5jdGlvbih0LHMsYSl7dmFyIG49LTEscj1lLm1hcChfKHQpP2E6cyxmdW5jdGlvbihlLHQpe3JldHVybltbdCxlXV19KS5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuLShlWzFdLmxlbmd0aC10WzFdLmxlbmd0aCl9KTtpZihlLmVhY2gocixmdW5jdGlvbihlLHQpe3ZhciBzPXRbMV07cmV0dXJuIGkuc3Vic3RyKGgscy5sZW5ndGgpLnRvTG93ZXJDYXNlKCk9PT1zLnRvTG93ZXJDYXNlKCk/KG49dFswXSxoKz1zLmxlbmd0aCwhMSk6dm9pZCAwfSksLTEhPT1uKXJldHVybiBuKzE7dGhyb3ciVW5rbm93biBuYW1lIGF0IHBvc2l0aW9uICIraH0sdz1mdW5jdGlvbigpe2lmKGkuY2hhckF0KGgpIT09dC5jaGFyQXQoYSkpdGhyb3ciVW5leHBlY3RlZCBsaXRlcmFsIGF0IHBvc2l0aW9uICIraDtoKyt9O2ZvcihhPTA7dC5sZW5ndGg+YTthKyspaWYoYikiJyIhPT10LmNoYXJBdChhKXx8XygiJyIpP3coKTpiPSExO2Vsc2Ugc3dpdGNoKHQuY2hhckF0KGEpKXtjYXNlImQiOnY9eCgiZCIpO2JyZWFrO2Nhc2UiRCI6aygiRCIsZCxjKTticmVhaztjYXNlIm8iOnk9eCgibyIpO2JyZWFrO2Nhc2UibSI6Zz14KCJtIik7YnJlYWs7Y2FzZSJNIjpnPWsoIk0iLHAsZik7YnJlYWs7Y2FzZSJ5IjptPXgoInkiKTticmVhaztjYXNlIkAiOm89bmV3IERhdGUoeCgiQCIpKSxtPW8uZ2V0RnVsbFllYXIoKSxnPW8uZ2V0TW9udGgoKSsxLHY9by5nZXREYXRlKCk7YnJlYWs7Y2FzZSIhIjpvPW5ldyBEYXRlKCh4KCIhIiktdGhpcy5fdGlja3NUbzE5NzApLzFlNCksbT1vLmdldEZ1bGxZZWFyKCksZz1vLmdldE1vbnRoKCkrMSx2PW8uZ2V0RGF0ZSgpO2JyZWFrO2Nhc2UiJyI6XygiJyIpP3coKTpiPSEwO2JyZWFrO2RlZmF1bHQ6dygpfWlmKGkubGVuZ3RoPmgmJihyPWkuc3Vic3RyKGgpLCEvXlxzKy8udGVzdChyKSkpdGhyb3ciRXh0cmEvdW5wYXJzZWQgY2hhcmFjdGVycyBmb3VuZCBpbiBkYXRlOiAiK3I7aWYoLTE9PT1tP209KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpOjEwMD5tJiYobSs9KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpLShuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKSUxMDArKHU+PW0/MDotMTAwKSkseT4tMSlmb3IoZz0xLHY9eTs7KXtpZihuPXRoaXMuX2dldERheXNJbk1vbnRoKG0sZy0xKSxuPj12KWJyZWFrO2crKyx2LT1ufWlmKG89dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUobSxnLTEsdikpLG8uZ2V0RnVsbFllYXIoKSE9PW18fG8uZ2V0TW9udGgoKSsxIT09Z3x8by5nZXREYXRlKCkhPT12KXRocm93IkludmFsaWQgZGF0ZSI7cmV0dXJuIG99LEFUT006Inl5LW1tLWRkIixDT09LSUU6IkQsIGRkIE0geXkiLElTT184NjAxOiJ5eS1tbS1kZCIsUkZDXzgyMjoiRCwgZCBNIHkiLFJGQ184NTA6IkRELCBkZC1NLXkiLFJGQ18xMDM2OiJELCBkIE0geSIsUkZDXzExMjM6IkQsIGQgTSB5eSIsUkZDXzI4MjI6IkQsIGQgTSB5eSIsUlNTOiJELCBkIE0geSIsVElDS1M6IiEiLFRJTUVTVEFNUDoiQCIsVzNDOiJ5eS1tbS1kZCIsX3RpY2tzVG8xOTcwOjFlNyo2MCo2MCoyNCooNzE4Njg1K01hdGguZmxvb3IoNDkyLjUpLU1hdGguZmxvb3IoMTkuNykrTWF0aC5mbG9vcig0LjkyNSkpLGZvcm1hdERhdGU6ZnVuY3Rpb24oZSx0LGkpe2lmKCF0KXJldHVybiIiO3ZhciBzLGE9KGk/aS5kYXlOYW1lc1Nob3J0Om51bGwpfHx0aGlzLl9kZWZhdWx0cy5kYXlOYW1lc1Nob3J0LG49KGk/aS5kYXlOYW1lczpudWxsKXx8dGhpcy5fZGVmYXVsdHMuZGF5TmFtZXMscj0oaT9pLm1vbnRoTmFtZXNTaG9ydDpudWxsKXx8dGhpcy5fZGVmYXVsdHMubW9udGhOYW1lc1Nob3J0LG89KGk/aS5tb250aE5hbWVzOm51bGwpfHx0aGlzLl9kZWZhdWx0cy5tb250aE5hbWVzLGg9ZnVuY3Rpb24odCl7dmFyIGk9ZS5sZW5ndGg+cysxJiZlLmNoYXJBdChzKzEpPT09dDtyZXR1cm4gaSYmcysrLGl9LGw9ZnVuY3Rpb24oZSx0LGkpe3ZhciBzPSIiK3Q7aWYoaChlKSlmb3IoO2k+cy5sZW5ndGg7KXM9IjAiK3M7cmV0dXJuIHN9LHU9ZnVuY3Rpb24oZSx0LGkscyl7cmV0dXJuIGgoZSk/c1t0XTppW3RdfSxkPSIiLGM9ITE7aWYodClmb3Iocz0wO2UubGVuZ3RoPnM7cysrKWlmKGMpIiciIT09ZS5jaGFyQXQocyl8fGgoIiciKT9kKz1lLmNoYXJBdChzKTpjPSExO2Vsc2Ugc3dpdGNoKGUuY2hhckF0KHMpKXtjYXNlImQiOmQrPWwoImQiLHQuZ2V0RGF0ZSgpLDIpO2JyZWFrO2Nhc2UiRCI6ZCs9dSgiRCIsdC5nZXREYXkoKSxhLG4pO2JyZWFrO2Nhc2UibyI6ZCs9bCgibyIsTWF0aC5yb3VuZCgobmV3IERhdGUodC5nZXRGdWxsWWVhcigpLHQuZ2V0TW9udGgoKSx0LmdldERhdGUoKSkuZ2V0VGltZSgpLW5ldyBEYXRlKHQuZ2V0RnVsbFllYXIoKSwwLDApLmdldFRpbWUoKSkvODY0ZTUpLDMpO2JyZWFrO2Nhc2UibSI6ZCs9bCgibSIsdC5nZXRNb250aCgpKzEsMik7YnJlYWs7Y2FzZSJNIjpkKz11KCJNIix0LmdldE1vbnRoKCkscixvKTticmVhaztjYXNlInkiOmQrPWgoInkiKT90LmdldEZ1bGxZZWFyKCk6KDEwPnQuZ2V0WWVhcigpJTEwMD8iMCI6IiIpK3QuZ2V0WWVhcigpJTEwMDticmVhaztjYXNlIkAiOmQrPXQuZ2V0VGltZSgpO2JyZWFrO2Nhc2UiISI6ZCs9MWU0KnQuZ2V0VGltZSgpK3RoaXMuX3RpY2tzVG8xOTcwO2JyZWFrO2Nhc2UiJyI6aCgiJyIpP2QrPSInIjpjPSEwO2JyZWFrO2RlZmF1bHQ6ZCs9ZS5jaGFyQXQocyl9cmV0dXJuIGR9LF9wb3NzaWJsZUNoYXJzOmZ1bmN0aW9uKGUpe3ZhciB0LGk9IiIscz0hMSxhPWZ1bmN0aW9uKGkpe3ZhciBzPWUubGVuZ3RoPnQrMSYmZS5jaGFyQXQodCsxKT09PWk7cmV0dXJuIHMmJnQrKyxzfTtmb3IodD0wO2UubGVuZ3RoPnQ7dCsrKWlmKHMpIiciIT09ZS5jaGFyQXQodCl8fGEoIiciKT9pKz1lLmNoYXJBdCh0KTpzPSExO2Vsc2Ugc3dpdGNoKGUuY2hhckF0KHQpKXtjYXNlImQiOmNhc2UibSI6Y2FzZSJ5IjpjYXNlIkAiOmkrPSIwMTIzNDU2Nzg5IjticmVhaztjYXNlIkQiOmNhc2UiTSI6cmV0dXJuIG51bGw7Y2FzZSInIjphKCInIik/aSs9IiciOnM9ITA7YnJlYWs7ZGVmYXVsdDppKz1lLmNoYXJBdCh0KX1yZXR1cm4gaX0sX2dldDpmdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDAhPT1lLnNldHRpbmdzW3RdP2Uuc2V0dGluZ3NbdF06dGhpcy5fZGVmYXVsdHNbdF19LF9zZXREYXRlRnJvbUZpZWxkOmZ1bmN0aW9uKGUsdCl7aWYoZS5pbnB1dC52YWwoKSE9PWUubGFzdFZhbCl7dmFyIGk9dGhpcy5fZ2V0KGUsImRhdGVGb3JtYXQiKSxzPWUubGFzdFZhbD1lLmlucHV0P2UuaW5wdXQudmFsKCk6bnVsbCxhPXRoaXMuX2dldERlZmF1bHREYXRlKGUpLG49YSxyPXRoaXMuX2dldEZvcm1hdENvbmZpZyhlKTt0cnl7bj10aGlzLnBhcnNlRGF0ZShpLHMscil8fGF9Y2F0Y2gobyl7cz10PyIiOnN9ZS5zZWxlY3RlZERheT1uLmdldERhdGUoKSxlLmRyYXdNb250aD1lLnNlbGVjdGVkTW9udGg9bi5nZXRNb250aCgpLGUuZHJhd1llYXI9ZS5zZWxlY3RlZFllYXI9bi5nZXRGdWxsWWVhcigpLGUuY3VycmVudERheT1zP24uZ2V0RGF0ZSgpOjAsZS5jdXJyZW50TW9udGg9cz9uLmdldE1vbnRoKCk6MCxlLmN1cnJlbnRZZWFyPXM/bi5nZXRGdWxsWWVhcigpOjAsdGhpcy5fYWRqdXN0SW5zdERhdGUoZSl9fSxfZ2V0RGVmYXVsdERhdGU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3Jlc3RyaWN0TWluTWF4KGUsdGhpcy5fZGV0ZXJtaW5lRGF0ZShlLHRoaXMuX2dldChlLCJkZWZhdWx0RGF0ZSIpLG5ldyBEYXRlKSl9LF9kZXRlcm1pbmVEYXRlOmZ1bmN0aW9uKHQsaSxzKXt2YXIgYT1mdW5jdGlvbihlKXt2YXIgdD1uZXcgRGF0ZTtyZXR1cm4gdC5zZXREYXRlKHQuZ2V0RGF0ZSgpK2UpLHR9LG49ZnVuY3Rpb24oaSl7dHJ5e3JldHVybiBlLmRhdGVwaWNrZXIucGFyc2VEYXRlKGUuZGF0ZXBpY2tlci5fZ2V0KHQsImRhdGVGb3JtYXQiKSxpLGUuZGF0ZXBpY2tlci5fZ2V0Rm9ybWF0Q29uZmlnKHQpKX1jYXRjaChzKXt9Zm9yKHZhciBhPShpLnRvTG93ZXJDYXNlKCkubWF0Y2goL15jLyk/ZS5kYXRlcGlja2VyLl9nZXREYXRlKHQpOm51bGwpfHxuZXcgRGF0ZSxuPWEuZ2V0RnVsbFllYXIoKSxyPWEuZ2V0TW9udGgoKSxvPWEuZ2V0RGF0ZSgpLGg9LyhbK1wtXT9bMC05XSspXHMqKGR8RHx3fFd8bXxNfHl8WSk/L2csbD1oLmV4ZWMoaSk7bDspe3N3aXRjaChsWzJdfHwiZCIpe2Nhc2UiZCI6Y2FzZSJEIjpvKz1wYXJzZUludChsWzFdLDEwKTticmVhaztjYXNlInciOmNhc2UiVyI6bys9NypwYXJzZUludChsWzFdLDEwKTticmVhaztjYXNlIm0iOmNhc2UiTSI6cis9cGFyc2VJbnQobFsxXSwxMCksbz1NYXRoLm1pbihvLGUuZGF0ZXBpY2tlci5fZ2V0RGF5c0luTW9udGgobixyKSk7YnJlYWs7Y2FzZSJ5IjpjYXNlIlkiOm4rPXBhcnNlSW50KGxbMV0sMTApLG89TWF0aC5taW4obyxlLmRhdGVwaWNrZXIuX2dldERheXNJbk1vbnRoKG4scikpfWw9aC5leGVjKGkpfXJldHVybiBuZXcgRGF0ZShuLHIsbyl9LHI9bnVsbD09aXx8IiI9PT1pP3M6InN0cmluZyI9PXR5cGVvZiBpP24oaSk6Im51bWJlciI9PXR5cGVvZiBpP2lzTmFOKGkpP3M6YShpKTpuZXcgRGF0ZShpLmdldFRpbWUoKSk7cmV0dXJuIHI9ciYmIkludmFsaWQgRGF0ZSI9PSIiK3I/czpyLHImJihyLnNldEhvdXJzKDApLHIuc2V0TWludXRlcygwKSxyLnNldFNlY29uZHMoMCksci5zZXRNaWxsaXNlY29uZHMoMCkpLHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KHIpfSxfZGF5bGlnaHRTYXZpbmdBZGp1c3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/KGUuc2V0SG91cnMoZS5nZXRIb3VycygpPjEyP2UuZ2V0SG91cnMoKSsyOjApLGUpOm51bGx9LF9zZXREYXRlOmZ1bmN0aW9uKGUsdCxpKXt2YXIgcz0hdCxhPWUuc2VsZWN0ZWRNb250aCxuPWUuc2VsZWN0ZWRZZWFyLHI9dGhpcy5fcmVzdHJpY3RNaW5NYXgoZSx0aGlzLl9kZXRlcm1pbmVEYXRlKGUsdCxuZXcgRGF0ZSkpO2Uuc2VsZWN0ZWREYXk9ZS5jdXJyZW50RGF5PXIuZ2V0RGF0ZSgpLGUuZHJhd01vbnRoPWUuc2VsZWN0ZWRNb250aD1lLmN1cnJlbnRNb250aD1yLmdldE1vbnRoKCksZS5kcmF3WWVhcj1lLnNlbGVjdGVkWWVhcj1lLmN1cnJlbnRZZWFyPXIuZ2V0RnVsbFllYXIoKSxhPT09ZS5zZWxlY3RlZE1vbnRoJiZuPT09ZS5zZWxlY3RlZFllYXJ8fGl8fHRoaXMuX25vdGlmeUNoYW5nZShlKSx0aGlzLl9hZGp1c3RJbnN0RGF0ZShlKSxlLmlucHV0JiZlLmlucHV0LnZhbChzPyIiOnRoaXMuX2Zvcm1hdERhdGUoZSkpfSxfZ2V0RGF0ZTpmdW5jdGlvbihlKXt2YXIgdD0hZS5jdXJyZW50WWVhcnx8ZS5pbnB1dCYmIiI9PT1lLmlucHV0LnZhbCgpP251bGw6dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoZS5jdXJyZW50WWVhcixlLmN1cnJlbnRNb250aCxlLmN1cnJlbnREYXkpKTtyZXR1cm4gdH0sX2F0dGFjaEhhbmRsZXJzOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuX2dldCh0LCJzdGVwTW9udGhzIikscz0iIyIrdC5pZC5yZXBsYWNlKC9cXFxcL2csIlxcIik7dC5kcERpdi5maW5kKCJbZGF0YS1oYW5kbGVyXSIpLm1hcChmdW5jdGlvbigpe3ZhciB0PXtwcmV2OmZ1bmN0aW9uKCl7ZS5kYXRlcGlja2VyLl9hZGp1c3REYXRlKHMsLWksIk0iKX0sbmV4dDpmdW5jdGlvbigpe2UuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShzLCtpLCJNIil9LGhpZGU6ZnVuY3Rpb24oKXtlLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCl9LHRvZGF5OmZ1bmN0aW9uKCl7ZS5kYXRlcGlja2VyLl9nb3RvVG9kYXkocyl9LHNlbGVjdERheTpmdW5jdGlvbigpe3JldHVybiBlLmRhdGVwaWNrZXIuX3NlbGVjdERheShzLCt0aGlzLmdldEF0dHJpYnV0ZSgiZGF0YS1tb250aCIpLCt0aGlzLmdldEF0dHJpYnV0ZSgiZGF0YS15ZWFyIiksdGhpcyksITF9LHNlbGVjdE1vbnRoOmZ1bmN0aW9uKCl7cmV0dXJuIGUuZGF0ZXBpY2tlci5fc2VsZWN0TW9udGhZZWFyKHMsdGhpcywiTSIpLCExfSxzZWxlY3RZZWFyOmZ1bmN0aW9uKCl7cmV0dXJuIGUuZGF0ZXBpY2tlci5fc2VsZWN0TW9udGhZZWFyKHMsdGhpcywiWSIpLCExfX07ZSh0aGlzKS5iaW5kKHRoaXMuZ2V0QXR0cmlidXRlKCJkYXRhLWV2ZW50IiksdFt0aGlzLmdldEF0dHJpYnV0ZSgiZGF0YS1oYW5kbGVyIildKX0pfSxfZ2VuZXJhdGVIVE1MOmZ1bmN0aW9uKGUpe3ZhciB0LGkscyxhLG4scixvLGgsbCx1LGQsYyxwLGYsbSxnLHYseSxiLF8seCxrLHcsVCxTLEQsTixNLEMsQSxQLEksSCxGLGoseixFLE8sTCxXPW5ldyBEYXRlLFI9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoVy5nZXRGdWxsWWVhcigpLFcuZ2V0TW9udGgoKSxXLmdldERhdGUoKSkpLFk9dGhpcy5fZ2V0KGUsImlzUlRMIiksSj10aGlzLl9nZXQoZSwic2hvd0J1dHRvblBhbmVsIiksQj10aGlzLl9nZXQoZSwiaGlkZUlmTm9QcmV2TmV4dCIpLEs9dGhpcy5fZ2V0KGUsIm5hdmlnYXRpb25Bc0RhdGVGb3JtYXQiKSxWPXRoaXMuX2dldE51bWJlck9mTW9udGhzKGUpLHE9dGhpcy5fZ2V0KGUsInNob3dDdXJyZW50QXRQb3MiKSxRPXRoaXMuX2dldChlLCJzdGVwTW9udGhzIiksVT0xIT09VlswXXx8MSE9PVZbMV0sRz10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChlLmN1cnJlbnREYXk/bmV3IERhdGUoZS5jdXJyZW50WWVhcixlLmN1cnJlbnRNb250aCxlLmN1cnJlbnREYXkpOm5ldyBEYXRlKDk5OTksOSw5KSksWD10aGlzLl9nZXRNaW5NYXhEYXRlKGUsIm1pbiIpLCQ9dGhpcy5fZ2V0TWluTWF4RGF0ZShlLCJtYXgiKSxaPWUuZHJhd01vbnRoLXEsZXQ9ZS5kcmF3WWVhcjtpZigwPlomJihaKz0xMixldC0tKSwkKWZvcih0PXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKCQuZ2V0RnVsbFllYXIoKSwkLmdldE1vbnRoKCktVlswXSpWWzFdKzEsJC5nZXREYXRlKCkpKSx0PVgmJlg+dD9YOnQ7dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoZXQsWiwxKSk+dDspWi0tLDA+WiYmKFo9MTEsZXQtLSk7Zm9yKGUuZHJhd01vbnRoPVosZS5kcmF3WWVhcj1ldCxpPXRoaXMuX2dldChlLCJwcmV2VGV4dCIpLGk9Sz90aGlzLmZvcm1hdERhdGUoaSx0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShldCxaLVEsMSkpLHRoaXMuX2dldEZvcm1hdENvbmZpZyhlKSk6aSxzPXRoaXMuX2NhbkFkanVzdE1vbnRoKGUsLTEsZXQsWik/IjxhIGNsYXNzPSd1aS1kYXRlcGlja2VyLXByZXYgdWktY29ybmVyLWFsbCcgZGF0YS1oYW5kbGVyPSdwcmV2JyBkYXRhLWV2ZW50PSdjbGljaycgdGl0bGU9JyIraSsiJz48c3BhbiBjbGFzcz0ndWktaWNvbiB1aS1pY29uLWNpcmNsZS10cmlhbmdsZS0iKyhZPyJlIjoidyIpKyInPiIraSsiPC9zcGFuPjwvYT4iOkI/IiI6IjxhIGNsYXNzPSd1aS1kYXRlcGlja2VyLXByZXYgdWktY29ybmVyLWFsbCB1aS1zdGF0ZS1kaXNhYmxlZCcgdGl0bGU9JyIraSsiJz48c3BhbiBjbGFzcz0ndWktaWNvbiB1aS1pY29uLWNpcmNsZS10cmlhbmdsZS0iKyhZPyJlIjoidyIpKyInPiIraSsiPC9zcGFuPjwvYT4iLGE9dGhpcy5fZ2V0KGUsIm5leHRUZXh0IiksYT1LP3RoaXMuZm9ybWF0RGF0ZShhLHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGV0LForUSwxKSksdGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGUpKTphLG49dGhpcy5fY2FuQWRqdXN0TW9udGgoZSwxLGV0LFopPyI8YSBjbGFzcz0ndWktZGF0ZXBpY2tlci1uZXh0IHVpLWNvcm5lci1hbGwnIGRhdGEtaGFuZGxlcj0nbmV4dCcgZGF0YS1ldmVudD0nY2xpY2snIHRpdGxlPSciK2ErIic+PHNwYW4gY2xhc3M9J3VpLWljb24gdWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtIisoWT8idyI6ImUiKSsiJz4iK2ErIjwvc3Bhbj48L2E+IjpCPyIiOiI8YSBjbGFzcz0ndWktZGF0ZXBpY2tlci1uZXh0IHVpLWNvcm5lci1hbGwgdWktc3RhdGUtZGlzYWJsZWQnIHRpdGxlPSciK2ErIic+PHNwYW4gY2xhc3M9J3VpLWljb24gdWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtIisoWT8idyI6ImUiKSsiJz4iK2ErIjwvc3Bhbj48L2E+IixyPXRoaXMuX2dldChlLCJjdXJyZW50VGV4dCIpLG89dGhpcy5fZ2V0KGUsImdvdG9DdXJyZW50IikmJmUuY3VycmVudERheT9HOlIscj1LP3RoaXMuZm9ybWF0RGF0ZShyLG8sdGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGUpKTpyLGg9ZS5pbmxpbmU/IiI6IjxidXR0b24gdHlwZT0nYnV0dG9uJyBjbGFzcz0ndWktZGF0ZXBpY2tlci1jbG9zZSB1aS1zdGF0ZS1kZWZhdWx0IHVpLXByaW9yaXR5LXByaW1hcnkgdWktY29ybmVyLWFsbCcgZGF0YS1oYW5kbGVyPSdoaWRlJyBkYXRhLWV2ZW50PSdjbGljayc+Iit0aGlzLl9nZXQoZSwiY2xvc2VUZXh0IikrIjwvYnV0dG9uPiIsbD1KPyI8ZGl2IGNsYXNzPSd1aS1kYXRlcGlja2VyLWJ1dHRvbnBhbmUgdWktd2lkZ2V0LWNvbnRlbnQnPiIrKFk/aDoiIikrKHRoaXMuX2lzSW5SYW5nZShlLG8pPyI8YnV0dG9uIHR5cGU9J2J1dHRvbicgY2xhc3M9J3VpLWRhdGVwaWNrZXItY3VycmVudCB1aS1zdGF0ZS1kZWZhdWx0IHVpLXByaW9yaXR5LXNlY29uZGFyeSB1aS1jb3JuZXItYWxsJyBkYXRhLWhhbmRsZXI9J3RvZGF5JyBkYXRhLWV2ZW50PSdjbGljayc+IityKyI8L2J1dHRvbj4iOiIiKSsoWT8iIjpoKSsiPC9kaXY+IjoiIix1PXBhcnNlSW50KHRoaXMuX2dldChlLCJmaXJzdERheSIpLDEwKSx1PWlzTmFOKHUpPzA6dSxkPXRoaXMuX2dldChlLCJzaG93V2VlayIpLGM9dGhpcy5fZ2V0KGUsImRheU5hbWVzIikscD10aGlzLl9nZXQoZSwiZGF5TmFtZXNNaW4iKSxmPXRoaXMuX2dldChlLCJtb250aE5hbWVzIiksbT10aGlzLl9nZXQoZSwibW9udGhOYW1lc1Nob3J0IiksZz10aGlzLl9nZXQoZSwiYmVmb3JlU2hvd0RheSIpLHY9dGhpcy5fZ2V0KGUsInNob3dPdGhlck1vbnRocyIpLHk9dGhpcy5fZ2V0KGUsInNlbGVjdE90aGVyTW9udGhzIiksYj10aGlzLl9nZXREZWZhdWx0RGF0ZShlKSxfPSIiLGs9MDtWWzBdPms7aysrKXtmb3Iodz0iIix0aGlzLm1heFJvd3M9NCxUPTA7VlsxXT5UO1QrKyl7aWYoUz10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShldCxaLGUuc2VsZWN0ZWREYXkpKSxEPSIgdWktY29ybmVyLWFsbCIsTj0iIixVKXtpZihOKz0iPGRpdiBjbGFzcz0ndWktZGF0ZXBpY2tlci1ncm91cCIsVlsxXT4xKXN3aXRjaChUKXtjYXNlIDA6Tis9IiB1aS1kYXRlcGlja2VyLWdyb3VwLWZpcnN0IixEPSIgdWktY29ybmVyLSIrKFk/InJpZ2h0IjoibGVmdCIpOworYnJlYWs7Y2FzZSBWWzFdLTE6Tis9IiB1aS1kYXRlcGlja2VyLWdyb3VwLWxhc3QiLEQ9IiB1aS1jb3JuZXItIisoWT8ibGVmdCI6InJpZ2h0Iik7YnJlYWs7ZGVmYXVsdDpOKz0iIHVpLWRhdGVwaWNrZXItZ3JvdXAtbWlkZGxlIixEPSIifU4rPSInPiJ9Zm9yKE4rPSI8ZGl2IGNsYXNzPSd1aS1kYXRlcGlja2VyLWhlYWRlciB1aS13aWRnZXQtaGVhZGVyIHVpLWhlbHBlci1jbGVhcmZpeCIrRCsiJz4iKygvYWxsfGxlZnQvLnRlc3QoRCkmJjA9PT1rP1k/bjpzOiIiKSsoL2FsbHxyaWdodC8udGVzdChEKSYmMD09PWs/WT9zOm46IiIpK3RoaXMuX2dlbmVyYXRlTW9udGhZZWFySGVhZGVyKGUsWixldCxYLCQsaz4wfHxUPjAsZixtKSsiPC9kaXY+PHRhYmxlIGNsYXNzPSd1aS1kYXRlcGlja2VyLWNhbGVuZGFyJz48dGhlYWQ+IisiPHRyPiIsTT1kPyI8dGggY2xhc3M9J3VpLWRhdGVwaWNrZXItd2Vlay1jb2wnPiIrdGhpcy5fZ2V0KGUsIndlZWtIZWFkZXIiKSsiPC90aD4iOiIiLHg9MDs3Png7eCsrKUM9KHgrdSklNyxNKz0iPHRoIHNjb3BlPSdjb2wnIisoKHgrdSs2KSU3Pj01PyIgY2xhc3M9J3VpLWRhdGVwaWNrZXItd2Vlay1lbmQnIjoiIikrIj4iKyI8c3BhbiB0aXRsZT0nIitjW0NdKyInPiIrcFtDXSsiPC9zcGFuPjwvdGg+Ijtmb3IoTis9TSsiPC90cj48L3RoZWFkPjx0Ym9keT4iLEE9dGhpcy5fZ2V0RGF5c0luTW9udGgoZXQsWiksZXQ9PT1lLnNlbGVjdGVkWWVhciYmWj09PWUuc2VsZWN0ZWRNb250aCYmKGUuc2VsZWN0ZWREYXk9TWF0aC5taW4oZS5zZWxlY3RlZERheSxBKSksUD0odGhpcy5fZ2V0Rmlyc3REYXlPZk1vbnRoKGV0LFopLXUrNyklNyxJPU1hdGguY2VpbCgoUCtBKS83KSxIPVU/dGhpcy5tYXhSb3dzPkk/dGhpcy5tYXhSb3dzOkk6SSx0aGlzLm1heFJvd3M9SCxGPXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGV0LFosMS1QKSksaj0wO0g+ajtqKyspe2ZvcihOKz0iPHRyPiIsej1kPyI8dGQgY2xhc3M9J3VpLWRhdGVwaWNrZXItd2Vlay1jb2wnPiIrdGhpcy5fZ2V0KGUsImNhbGN1bGF0ZVdlZWsiKShGKSsiPC90ZD4iOiIiLHg9MDs3Png7eCsrKUU9Zz9nLmFwcGx5KGUuaW5wdXQ/ZS5pbnB1dFswXTpudWxsLFtGXSk6WyEwLCIiXSxPPUYuZ2V0TW9udGgoKSE9PVosTD1PJiYheXx8IUVbMF18fFgmJlg+Rnx8JCYmRj4kLHorPSI8dGQgY2xhc3M9JyIrKCh4K3UrNiklNz49NT8iIHVpLWRhdGVwaWNrZXItd2Vlay1lbmQiOiIiKSsoTz8iIHVpLWRhdGVwaWNrZXItb3RoZXItbW9udGgiOiIiKSsoRi5nZXRUaW1lKCk9PT1TLmdldFRpbWUoKSYmWj09PWUuc2VsZWN0ZWRNb250aCYmZS5fa2V5RXZlbnR8fGIuZ2V0VGltZSgpPT09Ri5nZXRUaW1lKCkmJmIuZ2V0VGltZSgpPT09Uy5nZXRUaW1lKCk/IiAiK3RoaXMuX2RheU92ZXJDbGFzczoiIikrKEw/IiAiK3RoaXMuX3Vuc2VsZWN0YWJsZUNsYXNzKyIgdWktc3RhdGUtZGlzYWJsZWQiOiIiKSsoTyYmIXY/IiI6IiAiK0VbMV0rKEYuZ2V0VGltZSgpPT09Ry5nZXRUaW1lKCk/IiAiK3RoaXMuX2N1cnJlbnRDbGFzczoiIikrKEYuZ2V0VGltZSgpPT09Ui5nZXRUaW1lKCk/IiB1aS1kYXRlcGlja2VyLXRvZGF5IjoiIikpKyInIisoTyYmIXZ8fCFFWzJdPyIiOiIgdGl0bGU9JyIrRVsyXS5yZXBsYWNlKC8nL2csIiYjMzk7IikrIiciKSsoTD8iIjoiIGRhdGEtaGFuZGxlcj0nc2VsZWN0RGF5JyBkYXRhLWV2ZW50PSdjbGljaycgZGF0YS1tb250aD0nIitGLmdldE1vbnRoKCkrIicgZGF0YS15ZWFyPSciK0YuZ2V0RnVsbFllYXIoKSsiJyIpKyI+IisoTyYmIXY/IiYjeGEwOyI6TD8iPHNwYW4gY2xhc3M9J3VpLXN0YXRlLWRlZmF1bHQnPiIrRi5nZXREYXRlKCkrIjwvc3Bhbj4iOiI8YSBjbGFzcz0ndWktc3RhdGUtZGVmYXVsdCIrKEYuZ2V0VGltZSgpPT09Ui5nZXRUaW1lKCk/IiB1aS1zdGF0ZS1oaWdobGlnaHQiOiIiKSsoRi5nZXRUaW1lKCk9PT1HLmdldFRpbWUoKT8iIHVpLXN0YXRlLWFjdGl2ZSI6IiIpKyhPPyIgdWktcHJpb3JpdHktc2Vjb25kYXJ5IjoiIikrIicgaHJlZj0nIyc+IitGLmdldERhdGUoKSsiPC9hPiIpKyI8L3RkPiIsRi5zZXREYXRlKEYuZ2V0RGF0ZSgpKzEpLEY9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QoRik7Tis9eisiPC90cj4ifVorKyxaPjExJiYoWj0wLGV0KyspLE4rPSI8L3Rib2R5PjwvdGFibGU+IisoVT8iPC9kaXY+IisoVlswXT4wJiZUPT09VlsxXS0xPyI8ZGl2IGNsYXNzPSd1aS1kYXRlcGlja2VyLXJvdy1icmVhayc+PC9kaXY+IjoiIik6IiIpLHcrPU59Xys9d31yZXR1cm4gXys9bCxlLl9rZXlFdmVudD0hMSxffSxfZ2VuZXJhdGVNb250aFllYXJIZWFkZXI6ZnVuY3Rpb24oZSx0LGkscyxhLG4scixvKXt2YXIgaCxsLHUsZCxjLHAsZixtLGc9dGhpcy5fZ2V0KGUsImNoYW5nZU1vbnRoIiksdj10aGlzLl9nZXQoZSwiY2hhbmdlWWVhciIpLHk9dGhpcy5fZ2V0KGUsInNob3dNb250aEFmdGVyWWVhciIpLGI9IjxkaXYgY2xhc3M9J3VpLWRhdGVwaWNrZXItdGl0bGUnPiIsXz0iIjtpZihufHwhZylfKz0iPHNwYW4gY2xhc3M9J3VpLWRhdGVwaWNrZXItbW9udGgnPiIrclt0XSsiPC9zcGFuPiI7ZWxzZXtmb3IoaD1zJiZzLmdldEZ1bGxZZWFyKCk9PT1pLGw9YSYmYS5nZXRGdWxsWWVhcigpPT09aSxfKz0iPHNlbGVjdCBjbGFzcz0ndWktZGF0ZXBpY2tlci1tb250aCcgZGF0YS1oYW5kbGVyPSdzZWxlY3RNb250aCcgZGF0YS1ldmVudD0nY2hhbmdlJz4iLHU9MDsxMj51O3UrKykoIWh8fHU+PXMuZ2V0TW9udGgoKSkmJighbHx8YS5nZXRNb250aCgpPj11KSYmKF8rPSI8b3B0aW9uIHZhbHVlPSciK3UrIiciKyh1PT09dD8iIHNlbGVjdGVkPSdzZWxlY3RlZCciOiIiKSsiPiIrb1t1XSsiPC9vcHRpb24+Iik7Xys9Ijwvc2VsZWN0PiJ9aWYoeXx8KGIrPV8rKCFuJiZnJiZ2PyIiOiImI3hhMDsiKSksIWUueWVhcnNodG1sKWlmKGUueWVhcnNodG1sPSIiLG58fCF2KWIrPSI8c3BhbiBjbGFzcz0ndWktZGF0ZXBpY2tlci15ZWFyJz4iK2krIjwvc3Bhbj4iO2Vsc2V7Zm9yKGQ9dGhpcy5fZ2V0KGUsInllYXJSYW5nZSIpLnNwbGl0KCI6IiksYz0obmV3IERhdGUpLmdldEZ1bGxZZWFyKCkscD1mdW5jdGlvbihlKXt2YXIgdD1lLm1hdGNoKC9jWytcLV0uKi8pP2krcGFyc2VJbnQoZS5zdWJzdHJpbmcoMSksMTApOmUubWF0Y2goL1srXC1dLiovKT9jK3BhcnNlSW50KGUsMTApOnBhcnNlSW50KGUsMTApO3JldHVybiBpc05hTih0KT9jOnR9LGY9cChkWzBdKSxtPU1hdGgubWF4KGYscChkWzFdfHwiIikpLGY9cz9NYXRoLm1heChmLHMuZ2V0RnVsbFllYXIoKSk6ZixtPWE/TWF0aC5taW4obSxhLmdldEZ1bGxZZWFyKCkpOm0sZS55ZWFyc2h0bWwrPSI8c2VsZWN0IGNsYXNzPSd1aS1kYXRlcGlja2VyLXllYXInIGRhdGEtaGFuZGxlcj0nc2VsZWN0WWVhcicgZGF0YS1ldmVudD0nY2hhbmdlJz4iO20+PWY7ZisrKWUueWVhcnNodG1sKz0iPG9wdGlvbiB2YWx1ZT0nIitmKyInIisoZj09PWk/IiBzZWxlY3RlZD0nc2VsZWN0ZWQnIjoiIikrIj4iK2YrIjwvb3B0aW9uPiI7ZS55ZWFyc2h0bWwrPSI8L3NlbGVjdD4iLGIrPWUueWVhcnNodG1sLGUueWVhcnNodG1sPW51bGx9cmV0dXJuIGIrPXRoaXMuX2dldChlLCJ5ZWFyU3VmZml4IikseSYmKGIrPSghbiYmZyYmdj8iIjoiJiN4YTA7IikrXyksYis9IjwvZGl2PiJ9LF9hZGp1c3RJbnN0RGF0ZTpmdW5jdGlvbihlLHQsaSl7dmFyIHM9ZS5kcmF3WWVhcisoIlkiPT09aT90OjApLGE9ZS5kcmF3TW9udGgrKCJNIj09PWk/dDowKSxuPU1hdGgubWluKGUuc2VsZWN0ZWREYXksdGhpcy5fZ2V0RGF5c0luTW9udGgocyxhKSkrKCJEIj09PWk/dDowKSxyPXRoaXMuX3Jlc3RyaWN0TWluTWF4KGUsdGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUocyxhLG4pKSk7ZS5zZWxlY3RlZERheT1yLmdldERhdGUoKSxlLmRyYXdNb250aD1lLnNlbGVjdGVkTW9udGg9ci5nZXRNb250aCgpLGUuZHJhd1llYXI9ZS5zZWxlY3RlZFllYXI9ci5nZXRGdWxsWWVhcigpLCgiTSI9PT1pfHwiWSI9PT1pKSYmdGhpcy5fbm90aWZ5Q2hhbmdlKGUpfSxfcmVzdHJpY3RNaW5NYXg6ZnVuY3Rpb24oZSx0KXt2YXIgaT10aGlzLl9nZXRNaW5NYXhEYXRlKGUsIm1pbiIpLHM9dGhpcy5fZ2V0TWluTWF4RGF0ZShlLCJtYXgiKSxhPWkmJmk+dD9pOnQ7cmV0dXJuIHMmJmE+cz9zOmF9LF9ub3RpZnlDaGFuZ2U6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fZ2V0KGUsIm9uQ2hhbmdlTW9udGhZZWFyIik7dCYmdC5hcHBseShlLmlucHV0P2UuaW5wdXRbMF06bnVsbCxbZS5zZWxlY3RlZFllYXIsZS5zZWxlY3RlZE1vbnRoKzEsZV0pfSxfZ2V0TnVtYmVyT2ZNb250aHM6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fZ2V0KGUsIm51bWJlck9mTW9udGhzIik7cmV0dXJuIG51bGw9PXQ/WzEsMV06Im51bWJlciI9PXR5cGVvZiB0P1sxLHRdOnR9LF9nZXRNaW5NYXhEYXRlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuX2RldGVybWluZURhdGUoZSx0aGlzLl9nZXQoZSx0KyJEYXRlIiksbnVsbCl9LF9nZXREYXlzSW5Nb250aDpmdW5jdGlvbihlLHQpe3JldHVybiAzMi10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShlLHQsMzIpKS5nZXREYXRlKCl9LF9nZXRGaXJzdERheU9mTW9udGg6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3IERhdGUoZSx0LDEpLmdldERheSgpfSxfY2FuQWRqdXN0TW9udGg6ZnVuY3Rpb24oZSx0LGkscyl7dmFyIGE9dGhpcy5fZ2V0TnVtYmVyT2ZNb250aHMoZSksbj10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShpLHMrKDA+dD90OmFbMF0qYVsxXSksMSkpO3JldHVybiAwPnQmJm4uc2V0RGF0ZSh0aGlzLl9nZXREYXlzSW5Nb250aChuLmdldEZ1bGxZZWFyKCksbi5nZXRNb250aCgpKSksdGhpcy5faXNJblJhbmdlKGUsbil9LF9pc0luUmFuZ2U6ZnVuY3Rpb24oZSx0KXt2YXIgaSxzLGE9dGhpcy5fZ2V0TWluTWF4RGF0ZShlLCJtaW4iKSxuPXRoaXMuX2dldE1pbk1heERhdGUoZSwibWF4Iikscj1udWxsLG89bnVsbCxoPXRoaXMuX2dldChlLCJ5ZWFyUmFuZ2UiKTtyZXR1cm4gaCYmKGk9aC5zcGxpdCgiOiIpLHM9KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpLHI9cGFyc2VJbnQoaVswXSwxMCksbz1wYXJzZUludChpWzFdLDEwKSxpWzBdLm1hdGNoKC9bK1wtXS4qLykmJihyKz1zKSxpWzFdLm1hdGNoKC9bK1wtXS4qLykmJihvKz1zKSksKCFhfHx0LmdldFRpbWUoKT49YS5nZXRUaW1lKCkpJiYoIW58fHQuZ2V0VGltZSgpPD1uLmdldFRpbWUoKSkmJighcnx8dC5nZXRGdWxsWWVhcigpPj1yKSYmKCFvfHxvPj10LmdldEZ1bGxZZWFyKCkpfSxfZ2V0Rm9ybWF0Q29uZmlnOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2dldChlLCJzaG9ydFllYXJDdXRvZmYiKTtyZXR1cm4gdD0ic3RyaW5nIiE9dHlwZW9mIHQ/dDoobmV3IERhdGUpLmdldEZ1bGxZZWFyKCklMTAwK3BhcnNlSW50KHQsMTApLHtzaG9ydFllYXJDdXRvZmY6dCxkYXlOYW1lc1Nob3J0OnRoaXMuX2dldChlLCJkYXlOYW1lc1Nob3J0IiksZGF5TmFtZXM6dGhpcy5fZ2V0KGUsImRheU5hbWVzIiksbW9udGhOYW1lc1Nob3J0OnRoaXMuX2dldChlLCJtb250aE5hbWVzU2hvcnQiKSxtb250aE5hbWVzOnRoaXMuX2dldChlLCJtb250aE5hbWVzIil9fSxfZm9ybWF0RGF0ZTpmdW5jdGlvbihlLHQsaSxzKXt0fHwoZS5jdXJyZW50RGF5PWUuc2VsZWN0ZWREYXksZS5jdXJyZW50TW9udGg9ZS5zZWxlY3RlZE1vbnRoLGUuY3VycmVudFllYXI9ZS5zZWxlY3RlZFllYXIpO3ZhciBhPXQ/Im9iamVjdCI9PXR5cGVvZiB0P3Q6dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUocyxpLHQpKTp0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShlLmN1cnJlbnRZZWFyLGUuY3VycmVudE1vbnRoLGUuY3VycmVudERheSkpO3JldHVybiB0aGlzLmZvcm1hdERhdGUodGhpcy5fZ2V0KGUsImRhdGVGb3JtYXQiKSxhLHRoaXMuX2dldEZvcm1hdENvbmZpZyhlKSl9fSksZS5mbi5kYXRlcGlja2VyPWZ1bmN0aW9uKHQpe2lmKCF0aGlzLmxlbmd0aClyZXR1cm4gdGhpcztlLmRhdGVwaWNrZXIuaW5pdGlhbGl6ZWR8fChlKGRvY3VtZW50KS5tb3VzZWRvd24oZS5kYXRlcGlja2VyLl9jaGVja0V4dGVybmFsQ2xpY2spLGUuZGF0ZXBpY2tlci5pbml0aWFsaXplZD0hMCksMD09PWUoIiMiK2UuZGF0ZXBpY2tlci5fbWFpbkRpdklkKS5sZW5ndGgmJmUoImJvZHkiKS5hcHBlbmQoZS5kYXRlcGlja2VyLmRwRGl2KTt2YXIgaT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7cmV0dXJuInN0cmluZyIhPXR5cGVvZiB0fHwiaXNEaXNhYmxlZCIhPT10JiYiZ2V0RGF0ZSIhPT10JiYid2lkZ2V0IiE9PXQ/Im9wdGlvbiI9PT10JiYyPT09YXJndW1lbnRzLmxlbmd0aCYmInN0cmluZyI9PXR5cGVvZiBhcmd1bWVudHNbMV0/ZS5kYXRlcGlja2VyWyJfIit0KyJEYXRlcGlja2VyIl0uYXBwbHkoZS5kYXRlcGlja2VyLFt0aGlzWzBdXS5jb25jYXQoaSkpOnRoaXMuZWFjaChmdW5jdGlvbigpeyJzdHJpbmciPT10eXBlb2YgdD9lLmRhdGVwaWNrZXJbIl8iK3QrIkRhdGVwaWNrZXIiXS5hcHBseShlLmRhdGVwaWNrZXIsW3RoaXNdLmNvbmNhdChpKSk6ZS5kYXRlcGlja2VyLl9hdHRhY2hEYXRlcGlja2VyKHRoaXMsdCl9KTplLmRhdGVwaWNrZXJbIl8iK3QrIkRhdGVwaWNrZXIiXS5hcHBseShlLmRhdGVwaWNrZXIsW3RoaXNbMF1dLmNvbmNhdChpKSl9LGUuZGF0ZXBpY2tlcj1uZXcgYSxlLmRhdGVwaWNrZXIuaW5pdGlhbGl6ZWQ9ITEsZS5kYXRlcGlja2VyLnV1aWQ9KG5ldyBEYXRlKS5nZXRUaW1lKCksZS5kYXRlcGlja2VyLnZlcnNpb249IjEuMTEuNCIsZS5kYXRlcGlja2VyfSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9qcy9qcXVlcnkuY29va2llLmpzIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9qcy9qcXVlcnkuY29va2llLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNzE5MDAKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2pzL2pxdWVyeS5jb29raWUuanMKQEAgLTAsMCArMSwxMTcgQEAKKy8qIQorICogalF1ZXJ5IENvb2tpZSBQbHVnaW4gdjEuNC4wCisgKiBodHRwczovL2dpdGh1Yi5jb20vY2FyaGFydGwvanF1ZXJ5LWNvb2tpZQorICoKKyAqIENvcHlyaWdodCAyMDEzIEtsYXVzIEhhcnRsCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UKKyAqLworKGZ1bmN0aW9uIChmYWN0b3J5KSB7CisJaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgeworCQkvLyBBTUQuIFJlZ2lzdGVyIGFzIGFub255bW91cyBtb2R1bGUuCisJCWRlZmluZShbJ2pxdWVyeSddLCBmYWN0b3J5KTsKKwl9IGVsc2UgeworCQkvLyBCcm93c2VyIGdsb2JhbHMuCisJCWZhY3RvcnkoalF1ZXJ5KTsKKwl9Cit9KGZ1bmN0aW9uICgkKSB7CisKKwl2YXIgcGx1c2VzID0gL1wrL2c7CisKKwlmdW5jdGlvbiBlbmNvZGUocykgeworCQlyZXR1cm4gY29uZmlnLnJhdyA/IHMgOiBlbmNvZGVVUklDb21wb25lbnQocyk7CisJfQorCisJZnVuY3Rpb24gZGVjb2RlKHMpIHsKKwkJcmV0dXJuIGNvbmZpZy5yYXcgPyBzIDogZGVjb2RlVVJJQ29tcG9uZW50KHMpOworCX0KKworCWZ1bmN0aW9uIHN0cmluZ2lmeUNvb2tpZVZhbHVlKHZhbHVlKSB7CisJCXJldHVybiBlbmNvZGUoY29uZmlnLmpzb24gPyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkgOiBTdHJpbmcodmFsdWUpKTsKKwl9CisKKwlmdW5jdGlvbiBwYXJzZUNvb2tpZVZhbHVlKHMpIHsKKwkJaWYgKHMuaW5kZXhPZignIicpID09PSAwKSB7CisJCQkvLyBUaGlzIGlzIGEgcXVvdGVkIGNvb2tpZSBhcyBhY2NvcmRpbmcgdG8gUkZDMjA2OCwgdW5lc2NhcGUuLi4KKwkJCXMgPSBzLnNsaWNlKDEsIC0xKS5yZXBsYWNlKC9cXCIvZywgJyInKS5yZXBsYWNlKC9cXFxcL2csICdcXCcpOworCQl9CisKKwkJdHJ5IHsKKwkJCS8vIFJlcGxhY2Ugc2VydmVyLXNpZGUgd3JpdHRlbiBwbHVzZXMgd2l0aCBzcGFjZXMuCisJCQkvLyBJZiB3ZSBjYW4ndCBkZWNvZGUgdGhlIGNvb2tpZSwgaWdub3JlIGl0LCBpdCdzIHVudXNhYmxlLgorCQkJcyA9IGRlY29kZVVSSUNvbXBvbmVudChzLnJlcGxhY2UocGx1c2VzLCAnICcpKTsKKwkJfSBjYXRjaChlKSB7CisJCQlyZXR1cm47CisJCX0KKworCQl0cnkgeworCQkJLy8gSWYgd2UgY2FuJ3QgcGFyc2UgdGhlIGNvb2tpZSwgaWdub3JlIGl0LCBpdCdzIHVudXNhYmxlLgorCQkJcmV0dXJuIGNvbmZpZy5qc29uID8gSlNPTi5wYXJzZShzKSA6IHM7CisJCX0gY2F0Y2goZSkge30KKwl9CisKKwlmdW5jdGlvbiByZWFkKHMsIGNvbnZlcnRlcikgeworCQl2YXIgdmFsdWUgPSBjb25maWcucmF3ID8gcyA6IHBhcnNlQ29va2llVmFsdWUocyk7CisJCXJldHVybiAkLmlzRnVuY3Rpb24oY29udmVydGVyKSA/IGNvbnZlcnRlcih2YWx1ZSkgOiB2YWx1ZTsKKwl9CisKKwl2YXIgY29uZmlnID0gJC5jb29raWUgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSwgb3B0aW9ucykgeworCisJCS8vIFdyaXRlCisJCWlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmICEkLmlzRnVuY3Rpb24odmFsdWUpKSB7CisJCQlvcHRpb25zID0gJC5leHRlbmQoe30sIGNvbmZpZy5kZWZhdWx0cywgb3B0aW9ucyk7CisKKwkJCWlmICh0eXBlb2Ygb3B0aW9ucy5leHBpcmVzID09PSAnbnVtYmVyJykgeworCQkJCXZhciBkYXlzID0gb3B0aW9ucy5leHBpcmVzLCB0ID0gb3B0aW9ucy5leHBpcmVzID0gbmV3IERhdGUoKTsKKwkJCQl0LnNldERhdGUodC5nZXREYXRlKCkgKyBkYXlzKTsKKwkJCX0KKworCQkJcmV0dXJuIChkb2N1bWVudC5jb29raWUgPSBbCisJCQkJZW5jb2RlKGtleSksICc9Jywgc3RyaW5naWZ5Q29va2llVmFsdWUodmFsdWUpLAorCQkJCW9wdGlvbnMuZXhwaXJlcyA/ICc7IGV4cGlyZXM9JyArIG9wdGlvbnMuZXhwaXJlcy50b1VUQ1N0cmluZygpIDogJycsIC8vIHVzZSBleHBpcmVzIGF0dHJpYnV0ZSwgbWF4LWFnZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IElFCisJCQkJb3B0aW9ucy5wYXRoICAgID8gJzsgcGF0aD0nICsgb3B0aW9ucy5wYXRoIDogJycsCisJCQkJb3B0aW9ucy5kb21haW4gID8gJzsgZG9tYWluPScgKyBvcHRpb25zLmRvbWFpbiA6ICcnLAorCQkJCW9wdGlvbnMuc2VjdXJlICA/ICc7IHNlY3VyZScgOiAnJworCQkJXS5qb2luKCcnKSk7CisJCX0KKworCQkvLyBSZWFkCisKKwkJdmFyIHJlc3VsdCA9IGtleSA/IHVuZGVmaW5lZCA6IHt9OworCisJCS8vIFRvIHByZXZlbnQgdGhlIGZvciBsb29wIGluIHRoZSBmaXJzdCBwbGFjZSBhc3NpZ24gYW4gZW1wdHkgYXJyYXkKKwkJLy8gaW4gY2FzZSB0aGVyZSBhcmUgbm8gY29va2llcyBhdCBhbGwuIEFsc28gcHJldmVudHMgb2RkIHJlc3VsdCB3aGVuCisJCS8vIGNhbGxpbmcgJC5jb29raWUoKS4KKwkJdmFyIGNvb2tpZXMgPSBkb2N1bWVudC5jb29raWUgPyBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsgJykgOiBbXTsKKworCQlmb3IgKHZhciBpID0gMCwgbCA9IGNvb2tpZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisJCQl2YXIgcGFydHMgPSBjb29raWVzW2ldLnNwbGl0KCc9Jyk7CisJCQl2YXIgbmFtZSA9IGRlY29kZShwYXJ0cy5zaGlmdCgpKTsKKwkJCXZhciBjb29raWUgPSBwYXJ0cy5qb2luKCc9Jyk7CisKKwkJCWlmIChrZXkgJiYga2V5ID09PSBuYW1lKSB7CisJCQkJLy8gSWYgc2Vjb25kIGFyZ3VtZW50ICh2YWx1ZSkgaXMgYSBmdW5jdGlvbiBpdCdzIGEgY29udmVydGVyLi4uCisJCQkJcmVzdWx0ID0gcmVhZChjb29raWUsIHZhbHVlKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLy8gUHJldmVudCBzdG9yaW5nIGEgY29va2llIHRoYXQgd2UgY291bGRuJ3QgZGVjb2RlLgorCQkJaWYgKCFrZXkgJiYgKGNvb2tpZSA9IHJlYWQoY29va2llKSkgIT09IHVuZGVmaW5lZCkgeworCQkJCXJlc3VsdFtuYW1lXSA9IGNvb2tpZTsKKwkJCX0KKwkJfQorCisJCXJldHVybiByZXN1bHQ7CisJfTsKKworCWNvbmZpZy5kZWZhdWx0cyA9IHt9OworCisJJC5yZW1vdmVDb29raWUgPSBmdW5jdGlvbiAoa2V5LCBvcHRpb25zKSB7CisJCWlmICgkLmNvb2tpZShrZXkpICE9PSB1bmRlZmluZWQpIHsKKwkJCS8vIE11c3Qgbm90IGFsdGVyIG9wdGlvbnMsIHRodXMgZXh0ZW5kaW5nIGEgZnJlc2ggb2JqZWN0Li4uCisJCQkkLmNvb2tpZShrZXksICcnLCAkLmV4dGVuZCh7fSwgb3B0aW9ucywgeyBleHBpcmVzOiAtMSB9KSk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfTsKKworfSkpOwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9qcy9qcXVlcnkudHJlZXRhYmxlLmpzIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9qcy9qcXVlcnkudHJlZXRhYmxlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZTc0MjcKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2pzL2pxdWVyeS50cmVldGFibGUuanMKQEAgLTAsMCArMSw2MjAgQEAKKy8qCisgKiBqUXVlcnkgdHJlZXRhYmxlIFBsdWdpbiAzLjEuMAorICogaHR0cDovL2x1ZG8uY3ViaWNwaHVzZS5ubC9qcXVlcnktdHJlZXRhYmxlCisgKgorICogQ29weXJpZ2h0IDIwMTMsIEx1ZG8gdmFuIGRlbiBCb29tCisgKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KKyAqLworKGZ1bmN0aW9uKCkgeworICB2YXIgJCwgTm9kZSwgVHJlZSwgbWV0aG9kczsKKworICAkID0galF1ZXJ5OworCisgIE5vZGUgPSAoZnVuY3Rpb24oKSB7CisgICAgZnVuY3Rpb24gTm9kZShyb3csIHRyZWUsIHNldHRpbmdzKSB7CisgICAgICB2YXIgcGFyZW50SWQ7CisKKyAgICAgIHRoaXMucm93ID0gcm93OworICAgICAgdGhpcy50cmVlID0gdHJlZTsKKyAgICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5nczsKKworICAgICAgLy8gVE9ETyBFbnN1cmUgaWQvcGFyZW50SWQgaXMgYWx3YXlzIGEgc3RyaW5nIChub3QgaW50KQorICAgICAgdGhpcy5pZCA9IHRoaXMucm93LmRhdGEodGhpcy5zZXR0aW5ncy5ub2RlSWRBdHRyKTsKKworICAgICAgLy8gVE9ETyBNb3ZlIHRoaXMgdG8gYSBzZXRQYXJlbnRJZCBmdW5jdGlvbj8KKyAgICAgIHBhcmVudElkID0gdGhpcy5yb3cuZGF0YSh0aGlzLnNldHRpbmdzLnBhcmVudElkQXR0cik7CisgICAgICBpZiAocGFyZW50SWQgIT0gbnVsbCAmJiBwYXJlbnRJZCAhPT0gIiIpIHsKKyAgICAgICAgdGhpcy5wYXJlbnRJZCA9IHBhcmVudElkOworICAgICAgfQorCisgICAgICB0aGlzLnRyZWVDZWxsID0gJCh0aGlzLnJvdy5jaGlsZHJlbih0aGlzLnNldHRpbmdzLmNvbHVtbkVsVHlwZSlbdGhpcy5zZXR0aW5ncy5jb2x1bW5dKTsKKyAgICAgIHRoaXMuZXhwYW5kZXIgPSAkKHRoaXMuc2V0dGluZ3MuZXhwYW5kZXJUZW1wbGF0ZSk7CisgICAgICB0aGlzLmluZGVudGVyID0gJCh0aGlzLnNldHRpbmdzLmluZGVudGVyVGVtcGxhdGUpOworICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdOworICAgICAgdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlOworICAgICAgdGhpcy50cmVlQ2VsbC5wcmVwZW5kKHRoaXMuaW5kZW50ZXIpOworICAgIH0KKworICAgIE5vZGUucHJvdG90eXBlLmFkZENoaWxkID0gZnVuY3Rpb24oY2hpbGQpIHsKKyAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpOworICAgIH07CisKKyAgICBOb2RlLnByb3RvdHlwZS5hbmNlc3RvcnMgPSBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBhbmNlc3RvcnMsIG5vZGU7CisgICAgICBub2RlID0gdGhpczsKKyAgICAgIGFuY2VzdG9ycyA9IFtdOworICAgICAgd2hpbGUgKG5vZGUgPSBub2RlLnBhcmVudE5vZGUoKSkgeworICAgICAgICBhbmNlc3RvcnMucHVzaChub2RlKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBhbmNlc3RvcnM7CisgICAgfTsKKworICAgIE5vZGUucHJvdG90eXBlLmNvbGxhcHNlID0gZnVuY3Rpb24oKSB7CisgICAgICBpZiAodGhpcy5jb2xsYXBzZWQoKSkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgIH0KKworICAgICAgdGhpcy5yb3cucmVtb3ZlQ2xhc3MoImV4cGFuZGVkIikuYWRkQ2xhc3MoImNvbGxhcHNlZCIpOworCisgICAgICB0aGlzLl9oaWRlQ2hpbGRyZW4oKTsKKyAgICAgIHRoaXMuZXhwYW5kZXIuYXR0cigidGl0bGUiLCB0aGlzLnNldHRpbmdzLnN0cmluZ0V4cGFuZCk7CisKKyAgICAgIGlmICh0aGlzLmluaXRpYWxpemVkICYmIHRoaXMuc2V0dGluZ3Mub25Ob2RlQ29sbGFwc2UgIT0gbnVsbCkgeworICAgICAgICB0aGlzLnNldHRpbmdzLm9uTm9kZUNvbGxhcHNlLmFwcGx5KHRoaXMpOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpczsKKyAgICB9OworCisgICAgTm9kZS5wcm90b3R5cGUuY29sbGFwc2VkID0gZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gdGhpcy5yb3cuaGFzQ2xhc3MoImNvbGxhcHNlZCIpOworICAgIH07CisKKyAgICAvLyBUT0RPIGRlc3Ryb3k6IHJlbW92ZSBldmVudCBoYW5kbGVycywgZXhwYW5kZXIsIGluZGVudGVyLCBldGMuCisKKyAgICBOb2RlLnByb3RvdHlwZS5leHBhbmQgPSBmdW5jdGlvbigpIHsKKyAgICAgIGlmICh0aGlzLmV4cGFuZGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICB9CisKKyAgICAgIHRoaXMucm93LnJlbW92ZUNsYXNzKCJjb2xsYXBzZWQiKS5hZGRDbGFzcygiZXhwYW5kZWQiKTsKKworICAgICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQgJiYgdGhpcy5zZXR0aW5ncy5vbk5vZGVFeHBhbmQgIT0gbnVsbCkgeworICAgICAgICB0aGlzLnNldHRpbmdzLm9uTm9kZUV4cGFuZC5hcHBseSh0aGlzKTsKKyAgICAgIH0KKworICAgICAgaWYgKCQodGhpcy5yb3cpLmlzKCI6dmlzaWJsZSIpKSB7CisgICAgICAgIHRoaXMuX3Nob3dDaGlsZHJlbigpOworICAgICAgfQorCisgICAgICB0aGlzLmV4cGFuZGVyLmF0dHIoInRpdGxlIiwgdGhpcy5zZXR0aW5ncy5zdHJpbmdDb2xsYXBzZSk7CisKKyAgICAgIHJldHVybiB0aGlzOworICAgIH07CisKKyAgICBOb2RlLnByb3RvdHlwZS5leHBhbmRlZCA9IGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuIHRoaXMucm93Lmhhc0NsYXNzKCJleHBhbmRlZCIpOworICAgIH07CisKKyAgICBOb2RlLnByb3RvdHlwZS5oaWRlID0gZnVuY3Rpb24oKSB7CisgICAgICB0aGlzLl9oaWRlQ2hpbGRyZW4oKTsKKyAgICAgIHRoaXMucm93LmhpZGUoKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH07CisKKyAgICBOb2RlLnByb3RvdHlwZS5pc0JyYW5jaE5vZGUgPSBmdW5jdGlvbigpIHsKKyAgICAgIGlmKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCB8fCB0aGlzLnJvdy5kYXRhKHRoaXMuc2V0dGluZ3MuYnJhbmNoQXR0cikgPT09IHRydWUpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfTsKKworICAgIE5vZGUucHJvdG90eXBlLnVwZGF0ZUJyYW5jaExlYWZDbGFzcyA9IGZ1bmN0aW9uKCl7CisgICAgICB0aGlzLnJvdy5yZW1vdmVDbGFzcygnYnJhbmNoJyk7CisgICAgICB0aGlzLnJvdy5yZW1vdmVDbGFzcygnbGVhZicpOworICAgICAgdGhpcy5yb3cuYWRkQ2xhc3ModGhpcy5pc0JyYW5jaE5vZGUoKSA/ICdicmFuY2gnIDogJ2xlYWYnKTsKKyAgICB9OworCisgICAgTm9kZS5wcm90b3R5cGUubGV2ZWwgPSBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiB0aGlzLmFuY2VzdG9ycygpLmxlbmd0aDsKKyAgICB9OworCisgICAgTm9kZS5wcm90b3R5cGUucGFyZW50Tm9kZSA9IGZ1bmN0aW9uKCkgeworICAgICAgaWYgKHRoaXMucGFyZW50SWQgIT0gbnVsbCkgeworICAgICAgICByZXR1cm4gdGhpcy50cmVlW3RoaXMucGFyZW50SWRdOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgfTsKKworICAgIE5vZGUucHJvdG90eXBlLnJlbW92ZUNoaWxkID0gZnVuY3Rpb24oY2hpbGQpIHsKKyAgICAgIHZhciBpID0gJC5pbkFycmF5KGNoaWxkLCB0aGlzLmNoaWxkcmVuKTsKKyAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLnNwbGljZShpLCAxKQorICAgIH07CisKKyAgICBOb2RlLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBoYW5kbGVyLAorICAgICAgICAgIHNldHRpbmdzID0gdGhpcy5zZXR0aW5ncywKKyAgICAgICAgICB0YXJnZXQ7CisKKyAgICAgIGlmIChzZXR0aW5ncy5leHBhbmRhYmxlID09PSB0cnVlICYmIHRoaXMuaXNCcmFuY2hOb2RlKCkpIHsKKyAgICAgICAgaGFuZGxlciA9IGZ1bmN0aW9uKGUpIHsKKyAgICAgICAgICAkKHRoaXMpLnBhcmVudHMoInRhYmxlIikudHJlZXRhYmxlKCJub2RlIiwgJCh0aGlzKS5wYXJlbnRzKCJ0ciIpLmRhdGEoc2V0dGluZ3Mubm9kZUlkQXR0cikpLnRvZ2dsZSgpOworICAgICAgICAgIHJldHVybiBlLnByZXZlbnREZWZhdWx0KCk7CisgICAgICAgIH07CisKKyAgICAgICAgdGhpcy5pbmRlbnRlci5odG1sKHRoaXMuZXhwYW5kZXIpOworICAgICAgICB0YXJnZXQgPSBzZXR0aW5ncy5jbGlja2FibGVOb2RlTmFtZXMgPT09IHRydWUgPyB0aGlzLnRyZWVDZWxsIDogdGhpcy5leHBhbmRlcjsKKworICAgICAgICB0YXJnZXQub2ZmKCJjbGljay50cmVldGFibGUiKS5vbigiY2xpY2sudHJlZXRhYmxlIiwgaGFuZGxlcik7CisgICAgICAgIHRhcmdldC5vZmYoImtleWRvd24udHJlZXRhYmxlIikub24oImtleWRvd24udHJlZXRhYmxlIiwgZnVuY3Rpb24oZSkgeworICAgICAgICAgIGlmIChlLmtleUNvZGUgPT0gMTMpIHsKKyAgICAgICAgICAgIGhhbmRsZXIuYXBwbHkodGhpcywgW2VdKTsKKyAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICB0aGlzLmluZGVudGVyWzBdLnN0eWxlLnBhZGRpbmdMZWZ0ID0gIiIgKyAodGhpcy5sZXZlbCgpICogc2V0dGluZ3MuaW5kZW50KSArICJweCI7CisKKyAgICAgIHJldHVybiB0aGlzOworICAgIH07CisKKyAgICBOb2RlLnByb3RvdHlwZS5yZXZlYWwgPSBmdW5jdGlvbigpIHsKKyAgICAgIGlmICh0aGlzLnBhcmVudElkICE9IG51bGwpIHsKKyAgICAgICAgdGhpcy5wYXJlbnROb2RlKCkucmV2ZWFsKCk7CisgICAgICB9CisgICAgICByZXR1cm4gdGhpcy5leHBhbmQoKTsKKyAgICB9OworCisgICAgTm9kZS5wcm90b3R5cGUuc2V0UGFyZW50ID0gZnVuY3Rpb24obm9kZSkgeworICAgICAgaWYgKHRoaXMucGFyZW50SWQgIT0gbnVsbCkgeworICAgICAgICB0aGlzLnRyZWVbdGhpcy5wYXJlbnRJZF0ucmVtb3ZlQ2hpbGQodGhpcyk7CisgICAgICB9CisgICAgICB0aGlzLnBhcmVudElkID0gbm9kZS5pZDsKKyAgICAgIHRoaXMucm93LmRhdGEodGhpcy5zZXR0aW5ncy5wYXJlbnRJZEF0dHIsIG5vZGUuaWQpOworICAgICAgcmV0dXJuIG5vZGUuYWRkQ2hpbGQodGhpcyk7CisgICAgfTsKKworICAgIE5vZGUucHJvdG90eXBlLnNob3cgPSBmdW5jdGlvbigpIHsKKyAgICAgIGlmICghdGhpcy5pbml0aWFsaXplZCkgeworICAgICAgICB0aGlzLl9pbml0aWFsaXplKCk7CisgICAgICB9CisgICAgICB0aGlzLnJvdy5zaG93KCk7CisgICAgICBpZiAodGhpcy5leHBhbmRlZCgpKSB7CisgICAgICAgIHRoaXMuX3Nob3dDaGlsZHJlbigpOworICAgICAgfQorICAgICAgcmV0dXJuIHRoaXM7CisgICAgfTsKKworICAgIE5vZGUucHJvdG90eXBlLnRvZ2dsZSA9IGZ1bmN0aW9uKCkgeworICAgICAgaWYgKHRoaXMuZXhwYW5kZWQoKSkgeworICAgICAgICB0aGlzLmNvbGxhcHNlKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aGlzLmV4cGFuZCgpOworICAgICAgfQorICAgICAgcmV0dXJuIHRoaXM7CisgICAgfTsKKworICAgIE5vZGUucHJvdG90eXBlLl9oaWRlQ2hpbGRyZW4gPSBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBjaGlsZCwgX2ksIF9sZW4sIF9yZWYsIF9yZXN1bHRzOworICAgICAgX3JlZiA9IHRoaXMuY2hpbGRyZW47CisgICAgICBfcmVzdWx0cyA9IFtdOworICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7CisgICAgICAgIGNoaWxkID0gX3JlZltfaV07CisgICAgICAgIF9yZXN1bHRzLnB1c2goY2hpbGQuaGlkZSgpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBfcmVzdWx0czsKKyAgICB9OworCisgICAgTm9kZS5wcm90b3R5cGUuX2luaXRpYWxpemUgPSBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3M7CisKKyAgICAgIHRoaXMucmVuZGVyKCk7CisKKyAgICAgIGlmIChzZXR0aW5ncy5leHBhbmRhYmxlID09PSB0cnVlICYmIHNldHRpbmdzLmluaXRpYWxTdGF0ZSA9PT0gImNvbGxhcHNlZCIpIHsKKyAgICAgICAgdGhpcy5jb2xsYXBzZSgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5leHBhbmQoKTsKKyAgICAgIH0KKworICAgICAgaWYgKHNldHRpbmdzLm9uTm9kZUluaXRpYWxpemVkICE9IG51bGwpIHsKKyAgICAgICAgc2V0dGluZ3Mub25Ob2RlSW5pdGlhbGl6ZWQuYXBwbHkodGhpcyk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICB9OworCisgICAgTm9kZS5wcm90b3R5cGUuX3Nob3dDaGlsZHJlbiA9IGZ1bmN0aW9uKCkgeworICAgICAgdmFyIGNoaWxkLCBfaSwgX2xlbiwgX3JlZiwgX3Jlc3VsdHM7CisgICAgICBfcmVmID0gdGhpcy5jaGlsZHJlbjsKKyAgICAgIF9yZXN1bHRzID0gW107CisgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsKKyAgICAgICAgY2hpbGQgPSBfcmVmW19pXTsKKyAgICAgICAgX3Jlc3VsdHMucHVzaChjaGlsZC5zaG93KCkpOworICAgICAgfQorICAgICAgcmV0dXJuIF9yZXN1bHRzOworICAgIH07CisKKyAgICByZXR1cm4gTm9kZTsKKyAgfSkoKTsKKworICBUcmVlID0gKGZ1bmN0aW9uKCkgeworICAgIGZ1bmN0aW9uIFRyZWUodGFibGUsIHNldHRpbmdzKSB7CisgICAgICB0aGlzLnRhYmxlID0gdGFibGU7CisgICAgICB0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7CisgICAgICB0aGlzLnRyZWUgPSB7fTsKKworICAgICAgLy8gQ2FjaGUgdGhlIG5vZGVzIGFuZCByb290cyBpbiBzaW1wbGUgYXJyYXlzIGZvciBxdWljayBhY2Nlc3MvaXRlcmF0aW9uCisgICAgICB0aGlzLm5vZGVzID0gW107CisgICAgICB0aGlzLnJvb3RzID0gW107CisgICAgfQorCisgICAgVHJlZS5wcm90b3R5cGUuY29sbGFwc2VBbGwgPSBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBub2RlLCBfaSwgX2xlbiwgX3JlZiwgX3Jlc3VsdHM7CisgICAgICBfcmVmID0gdGhpcy5ub2RlczsKKyAgICAgIF9yZXN1bHRzID0gW107CisgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsKKyAgICAgICAgbm9kZSA9IF9yZWZbX2ldOworICAgICAgICBfcmVzdWx0cy5wdXNoKG5vZGUuY29sbGFwc2UoKSk7CisgICAgICB9CisgICAgICByZXR1cm4gX3Jlc3VsdHM7CisgICAgfTsKKworICAgIFRyZWUucHJvdG90eXBlLmV4cGFuZEFsbCA9IGZ1bmN0aW9uKCkgeworICAgICAgdmFyIG5vZGUsIF9pLCBfbGVuLCBfcmVmLCBfcmVzdWx0czsKKyAgICAgIF9yZWYgPSB0aGlzLm5vZGVzOworICAgICAgX3Jlc3VsdHMgPSBbXTsKKyAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZi5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgeworICAgICAgICBub2RlID0gX3JlZltfaV07CisgICAgICAgIF9yZXN1bHRzLnB1c2gobm9kZS5leHBhbmQoKSk7CisgICAgICB9CisgICAgICByZXR1cm4gX3Jlc3VsdHM7CisgICAgfTsKKworICAgIFRyZWUucHJvdG90eXBlLmZpbmRMYXN0Tm9kZSA9IGZ1bmN0aW9uIChub2RlKSB7CisgICAgICBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7CisgICAgICAgIHJldHVybiB0aGlzLmZpbmRMYXN0Tm9kZShub2RlLmNoaWxkcmVuW25vZGUuY2hpbGRyZW4ubGVuZ3RoIC0gMV0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICB9CisgICAgfTsKKworICAgIFRyZWUucHJvdG90eXBlLmxvYWRSb3dzID0gZnVuY3Rpb24ocm93cykgeworICAgICAgdmFyIG5vZGUsIHJvdywgaTsKKworICAgICAgaWYgKHJvd3MgIT0gbnVsbCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgIHJvdyA9ICQocm93c1tpXSk7CisKKyAgICAgICAgICBpZiAocm93LmRhdGEodGhpcy5zZXR0aW5ncy5ub2RlSWRBdHRyKSAhPSBudWxsKSB7CisgICAgICAgICAgICBub2RlID0gbmV3IE5vZGUocm93LCB0aGlzLnRyZWUsIHRoaXMuc2V0dGluZ3MpOworICAgICAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKG5vZGUpOworICAgICAgICAgICAgdGhpcy50cmVlW25vZGUuaWRdID0gbm9kZTsKKworICAgICAgICAgICAgaWYgKG5vZGUucGFyZW50SWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICB0aGlzLnRyZWVbbm9kZS5wYXJlbnRJZF0uYWRkQ2hpbGQobm9kZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICB0aGlzLnJvb3RzLnB1c2gobm9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLm5vZGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIG5vZGUgPSB0aGlzLm5vZGVzW2ldLnVwZGF0ZUJyYW5jaExlYWZDbGFzcygpOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpczsKKyAgICB9OworCisgICAgVHJlZS5wcm90b3R5cGUubW92ZSA9IGZ1bmN0aW9uKG5vZGUsIGRlc3RpbmF0aW9uKSB7CisgICAgICAvLyBDb25kaXRpb25zOgorICAgICAgLy8gMTogK25vZGUrIHNob3VsZCBub3QgYmUgaW5zZXJ0ZWQgYXMgYSBjaGlsZCBvZiArbm9kZSsgaXRzZWxmLgorICAgICAgLy8gMjogK2Rlc3RpbmF0aW9uKyBzaG91bGQgbm90IGJlIHRoZSBzYW1lIGFzICtub2RlKydzIGN1cnJlbnQgcGFyZW50ICh0aGlzCisgICAgICAvLyAgICBwcmV2ZW50cyArbm9kZSsgZnJvbSBiZWluZyBtb3ZlZCB0byB0aGUgc2FtZSBsb2NhdGlvbiB3aGVyZSBpdCBhbHJlYWR5CisgICAgICAvLyAgICBpcykuCisgICAgICAvLyAzOiArbm9kZSsgc2hvdWxkIG5vdCBiZSBpbnNlcnRlZCBpbiBhIGxvY2F0aW9uIGluIGEgYnJhbmNoIGlmIHRoaXMgd291bGQKKyAgICAgIC8vICAgIHJlc3VsdCBpbiArbm9kZSsgYmVpbmcgYW4gYW5jZXN0b3Igb2YgaXRzZWxmLgorICAgICAgdmFyIG5vZGVQYXJlbnQgPSBub2RlLnBhcmVudE5vZGUoKTsKKyAgICAgIGlmIChub2RlICE9PSBkZXN0aW5hdGlvbiAmJiBkZXN0aW5hdGlvbi5pZCAhPT0gbm9kZS5wYXJlbnRJZCAmJiAkLmluQXJyYXkobm9kZSwgZGVzdGluYXRpb24uYW5jZXN0b3JzKCkpID09PSAtMSkgeworICAgICAgICBub2RlLnNldFBhcmVudChkZXN0aW5hdGlvbik7CisgICAgICAgIHRoaXMuX21vdmVSb3dzKG5vZGUsIGRlc3RpbmF0aW9uKTsKKworICAgICAgICAvLyBSZS1yZW5kZXIgcGFyZW50Tm9kZSBpZiB0aGlzIGlzIGl0cyBmaXJzdCBjaGlsZCBub2RlLCBhbmQgdGhlcmVmb3JlCisgICAgICAgIC8vIGRvZXNuJ3QgaGF2ZSB0aGUgZXhwYW5kZXIgeWV0LgorICAgICAgICBpZiAobm9kZS5wYXJlbnROb2RlKCkuY2hpbGRyZW4ubGVuZ3RoID09PSAxKSB7CisgICAgICAgICAgbm9kZS5wYXJlbnROb2RlKCkucmVuZGVyKCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYobm9kZVBhcmVudCl7CisgICAgICAgIG5vZGVQYXJlbnQudXBkYXRlQnJhbmNoTGVhZkNsYXNzKCk7CisgICAgICB9CisgICAgICBpZihub2RlLnBhcmVudE5vZGUoKSl7CisgICAgICAgIG5vZGUucGFyZW50Tm9kZSgpLnVwZGF0ZUJyYW5jaExlYWZDbGFzcygpOworICAgICAgfQorICAgICAgbm9kZS51cGRhdGVCcmFuY2hMZWFmQ2xhc3MoKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH07CisKKyAgICBUcmVlLnByb3RvdHlwZS5yZW1vdmVOb2RlID0gZnVuY3Rpb24obm9kZSkgeworICAgICAgLy8gUmVjdXJzaXZlbHkgcmVtb3ZlIGFsbCBkZXNjZW5kYW50cyBvZiArbm9kZSsKKyAgICAgIHRoaXMudW5sb2FkQnJhbmNoKG5vZGUpOworCisgICAgICAvLyBSZW1vdmUgbm9kZSBmcm9tIERPTSAoPHRyPikKKyAgICAgIG5vZGUucm93LnJlbW92ZSgpOworCisgICAgICAvLyBDbGVhbiB1cCBUcmVlIG9iamVjdCAoc28gTm9kZSBvYmplY3RzIGFyZSBHQy1lZCkKKyAgICAgIGRlbGV0ZSB0aGlzLnRyZWVbbm9kZS5pZF07CisgICAgICB0aGlzLm5vZGVzLnNwbGljZSgkLmluQXJyYXkobm9kZSwgdGhpcy5ub2RlcyksIDEpOworICAgIH0KKworICAgIFRyZWUucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uKCkgeworICAgICAgdmFyIHJvb3QsIF9pLCBfbGVuLCBfcmVmOworICAgICAgX3JlZiA9IHRoaXMucm9vdHM7CisgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsKKyAgICAgICAgcm9vdCA9IF9yZWZbX2ldOworCisgICAgICAgIC8vIE5hbWluZyBpcyBjb25mdXNpbmcgKHNob3cvcmVuZGVyKS4gSSBkbyBub3QgY2FsbCByZW5kZXIgb24gbm9kZSBmcm9tCisgICAgICAgIC8vIGhlcmUuCisgICAgICAgIHJvb3Quc2hvdygpOworICAgICAgfQorICAgICAgcmV0dXJuIHRoaXM7CisgICAgfTsKKworICAgIFRyZWUucHJvdG90eXBlLnNvcnRCcmFuY2ggPSBmdW5jdGlvbihub2RlLCBzb3J0RnVuKSB7CisgICAgICAvLyBGaXJzdCBzb3J0IGludGVybmFsIGFycmF5IG9mIGNoaWxkcmVuCisgICAgICBub2RlLmNoaWxkcmVuLnNvcnQoc29ydEZ1bik7CisKKyAgICAgIC8vIE5leHQgcmVuZGVyIHJvd3MgaW4gY29ycmVjdCBvcmRlciBvbiBwYWdlCisgICAgICB0aGlzLl9zb3J0Q2hpbGRSb3dzKG5vZGUpOworCisgICAgICByZXR1cm4gdGhpczsKKyAgICB9OworCisgICAgVHJlZS5wcm90b3R5cGUudW5sb2FkQnJhbmNoID0gZnVuY3Rpb24obm9kZSkgeworICAgICAgdmFyIGNoaWxkcmVuLCBpOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykgeworICAgICAgICB0aGlzLnJlbW92ZU5vZGUobm9kZS5jaGlsZHJlbltpXSk7CisgICAgICB9CisKKyAgICAgIC8vIFJlc2V0IG5vZGUncyBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuCisgICAgICBub2RlLmNoaWxkcmVuID0gW107CisKKyAgICAgIG5vZGUudXBkYXRlQnJhbmNoTGVhZkNsYXNzKCk7CisKKyAgICAgIHJldHVybiB0aGlzOworICAgIH07CisKKyAgICBUcmVlLnByb3RvdHlwZS5fbW92ZVJvd3MgPSBmdW5jdGlvbihub2RlLCBkZXN0aW5hdGlvbikgeworICAgICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbiwgaTsKKworICAgICAgbm9kZS5yb3cuaW5zZXJ0QWZ0ZXIoZGVzdGluYXRpb24ucm93KTsKKyAgICAgIG5vZGUucmVuZGVyKCk7CisKKyAgICAgIC8vIExvb3AgYmFja3dhcmRzIHRocm91Z2ggY2hpbGRyZW4gdG8gaGF2ZSB0aGVtIGVuZCB1cCBvbiBVSSBpbiBjb3JyZWN0CisgICAgICAvLyBvcmRlciAoc2VlICMxMTIpCisgICAgICBmb3IgKGkgPSBjaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICB0aGlzLl9tb3ZlUm93cyhjaGlsZHJlbltpXSwgbm9kZSk7CisgICAgICB9CisgICAgfTsKKworICAgIC8vIFNwZWNpYWwgX21vdmVSb3dzIGNhc2UsIG1vdmUgY2hpbGRyZW4gdG8gaXRzZWxmIHRvIGZvcmNlIHNvcnRpbmcKKyAgICBUcmVlLnByb3RvdHlwZS5fc29ydENoaWxkUm93cyA9IGZ1bmN0aW9uKHBhcmVudE5vZGUpIHsKKyAgICAgIHJldHVybiB0aGlzLl9tb3ZlUm93cyhwYXJlbnROb2RlLCBwYXJlbnROb2RlKTsKKyAgICB9OworCisgICAgcmV0dXJuIFRyZWU7CisgIH0pKCk7CisKKyAgLy8galF1ZXJ5IFBsdWdpbgorICBtZXRob2RzID0geworICAgIGluaXQ6IGZ1bmN0aW9uKG9wdGlvbnMsIGZvcmNlKSB7CisgICAgICB2YXIgc2V0dGluZ3M7CisKKyAgICAgIHNldHRpbmdzID0gJC5leHRlbmQoeworICAgICAgICBicmFuY2hBdHRyOiAidHRCcmFuY2giLAorICAgICAgICBjbGlja2FibGVOb2RlTmFtZXM6IGZhbHNlLAorICAgICAgICBjb2x1bW46IDAsCisgICAgICAgIGNvbHVtbkVsVHlwZTogInRkIiwgLy8gaS5lLiAndGQnLCAndGgnIG9yICd0ZCx0aCcKKyAgICAgICAgZXhwYW5kYWJsZTogZmFsc2UsCisgICAgICAgIGV4cGFuZGVyVGVtcGxhdGU6ICI8YSBocmVmPScjJz4mbmJzcDs8L2E+IiwKKyAgICAgICAgaW5kZW50OiAxOSwKKyAgICAgICAgaW5kZW50ZXJUZW1wbGF0ZTogIjxzcGFuIGNsYXNzPSdpbmRlbnRlcic+PC9zcGFuPiIsCisgICAgICAgIGluaXRpYWxTdGF0ZTogImNvbGxhcHNlZCIsCisgICAgICAgIG5vZGVJZEF0dHI6ICJ0dElkIiwgLy8gbWFwcyB0byBkYXRhLXR0LWlkCisgICAgICAgIHBhcmVudElkQXR0cjogInR0UGFyZW50SWQiLCAvLyBtYXBzIHRvIGRhdGEtdHQtcGFyZW50LWlkCisgICAgICAgIHN0cmluZ0V4cGFuZDogIkV4cGFuZCIsCisgICAgICAgIHN0cmluZ0NvbGxhcHNlOiAiQ29sbGFwc2UiLAorCisgICAgICAgIC8vIEV2ZW50cworICAgICAgICBvbkluaXRpYWxpemVkOiBudWxsLAorICAgICAgICBvbk5vZGVDb2xsYXBzZTogbnVsbCwKKyAgICAgICAgb25Ob2RlRXhwYW5kOiBudWxsLAorICAgICAgICBvbk5vZGVJbml0aWFsaXplZDogbnVsbAorICAgICAgfSwgb3B0aW9ucyk7CisKKyAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBlbCA9ICQodGhpcyksIHRyZWU7CisKKyAgICAgICAgaWYgKGZvcmNlIHx8IGVsLmRhdGEoInRyZWV0YWJsZSIpID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICB0cmVlID0gbmV3IFRyZWUodGhpcywgc2V0dGluZ3MpOworICAgICAgICAgIHRyZWUubG9hZFJvd3ModGhpcy5yb3dzKS5yZW5kZXIoKTsKKworICAgICAgICAgIGVsLmFkZENsYXNzKCJ0cmVldGFibGUiKS5kYXRhKCJ0cmVldGFibGUiLCB0cmVlKTsKKworICAgICAgICAgIGlmIChzZXR0aW5ncy5vbkluaXRpYWxpemVkICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNldHRpbmdzLm9uSW5pdGlhbGl6ZWQuYXBwbHkodHJlZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGVsOworICAgICAgfSk7CisgICAgfSwKKworICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuICQodGhpcykucmVtb3ZlRGF0YSgidHJlZXRhYmxlIikucmVtb3ZlQ2xhc3MoInRyZWV0YWJsZSIpOworICAgICAgfSk7CisgICAgfSwKKworICAgIGNvbGxhcHNlQWxsOiBmdW5jdGlvbigpIHsKKyAgICAgIHRoaXMuZGF0YSgidHJlZXRhYmxlIikuY29sbGFwc2VBbGwoKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0sCisKKyAgICBjb2xsYXBzZU5vZGU6IGZ1bmN0aW9uKGlkKSB7CisgICAgICB2YXIgbm9kZSA9IHRoaXMuZGF0YSgidHJlZXRhYmxlIikudHJlZVtpZF07CisKKyAgICAgIGlmIChub2RlKSB7CisgICAgICAgIG5vZGUuY29sbGFwc2UoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiVW5rbm93biBub2RlICciICsgaWQgKyAiJyIpOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpczsKKyAgICB9LAorCisgICAgZXhwYW5kQWxsOiBmdW5jdGlvbigpIHsKKyAgICAgIHRoaXMuZGF0YSgidHJlZXRhYmxlIikuZXhwYW5kQWxsKCk7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9LAorCisgICAgZXhwYW5kTm9kZTogZnVuY3Rpb24oaWQpIHsKKyAgICAgIHZhciBub2RlID0gdGhpcy5kYXRhKCJ0cmVldGFibGUiKS50cmVlW2lkXTsKKworICAgICAgaWYgKG5vZGUpIHsKKyAgICAgICAgaWYgKCFub2RlLmluaXRpYWxpemVkKSB7CisgICAgICAgICAgbm9kZS5faW5pdGlhbGl6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgbm9kZS5leHBhbmQoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiVW5rbm93biBub2RlICciICsgaWQgKyAiJyIpOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpczsKKyAgICB9LAorCisgICAgbG9hZEJyYW5jaDogZnVuY3Rpb24obm9kZSwgcm93cykgeworICAgICAgdmFyIHNldHRpbmdzID0gdGhpcy5kYXRhKCJ0cmVldGFibGUiKS5zZXR0aW5ncywKKyAgICAgICAgICB0cmVlID0gdGhpcy5kYXRhKCJ0cmVldGFibGUiKS50cmVlOworCisgICAgICAvLyBUT0RPIFN3aXRjaCB0byAkLnBhcnNlSFRNTAorICAgICAgcm93cyA9ICQocm93cyk7CisKKyAgICAgIGlmIChub2RlID09IG51bGwpIHsgLy8gSW5zZXJ0aW5nIG5ldyByb290IG5vZGVzCisgICAgICAgIHRoaXMuYXBwZW5kKHJvd3MpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFyIGxhc3ROb2RlID0gdGhpcy5kYXRhKCJ0cmVldGFibGUiKS5maW5kTGFzdE5vZGUobm9kZSk7CisgICAgICAgIHJvd3MuaW5zZXJ0QWZ0ZXIobGFzdE5vZGUucm93KTsKKyAgICAgIH0KKworICAgICAgdGhpcy5kYXRhKCJ0cmVldGFibGUiKS5sb2FkUm93cyhyb3dzKTsKKworICAgICAgLy8gTWFrZSBzdXJlIG5vZGVzIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZAorICAgICAgcm93cy5maWx0ZXIoInRyIikuZWFjaChmdW5jdGlvbigpIHsKKyAgICAgICAgdHJlZVskKHRoaXMpLmRhdGEoc2V0dGluZ3Mubm9kZUlkQXR0cildLnNob3coKTsKKyAgICAgIH0pOworCisgICAgICBpZiAobm9kZSAhPSBudWxsKSB7CisgICAgICAgIC8vIFJlLXJlbmRlciBwYXJlbnQgdG8gZW5zdXJlIGV4cGFuZGVyIGljb24gaXMgc2hvd24gKCM3OSkKKyAgICAgICAgbm9kZS5yZW5kZXIoKS5leHBhbmQoKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfSwKKworICAgIG1vdmU6IGZ1bmN0aW9uKG5vZGVJZCwgZGVzdGluYXRpb25JZCkgeworICAgICAgdmFyIGRlc3RpbmF0aW9uLCBub2RlOworCisgICAgICBub2RlID0gdGhpcy5kYXRhKCJ0cmVldGFibGUiKS50cmVlW25vZGVJZF07CisgICAgICBkZXN0aW5hdGlvbiA9IHRoaXMuZGF0YSgidHJlZXRhYmxlIikudHJlZVtkZXN0aW5hdGlvbklkXTsKKyAgICAgIHRoaXMuZGF0YSgidHJlZXRhYmxlIikubW92ZShub2RlLCBkZXN0aW5hdGlvbik7CisKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0sCisKKyAgICBub2RlOiBmdW5jdGlvbihpZCkgeworICAgICAgcmV0dXJuIHRoaXMuZGF0YSgidHJlZXRhYmxlIikudHJlZVtpZF07CisgICAgfSwKKworICAgIHJlbW92ZU5vZGU6IGZ1bmN0aW9uKGlkKSB7CisgICAgICB2YXIgbm9kZSA9IHRoaXMuZGF0YSgidHJlZXRhYmxlIikudHJlZVtpZF07CisKKyAgICAgIGlmIChub2RlKSB7CisgICAgICAgIHRoaXMuZGF0YSgidHJlZXRhYmxlIikucmVtb3ZlTm9kZShub2RlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiVW5rbm93biBub2RlICciICsgaWQgKyAiJyIpOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpczsKKyAgICB9LAorCisgICAgcmV2ZWFsOiBmdW5jdGlvbihpZCkgeworICAgICAgdmFyIG5vZGUgPSB0aGlzLmRhdGEoInRyZWV0YWJsZSIpLnRyZWVbaWRdOworCisgICAgICBpZiAobm9kZSkgeworICAgICAgICBub2RlLnJldmVhbCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIG5vZGUgJyIgKyBpZCArICInIik7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0sCisKKyAgICBzb3J0QnJhbmNoOiBmdW5jdGlvbihub2RlLCBjb2x1bW5PckZ1bmN0aW9uKSB7CisgICAgICB2YXIgc2V0dGluZ3MgPSB0aGlzLmRhdGEoInRyZWV0YWJsZSIpLnNldHRpbmdzLAorICAgICAgICAgIHByZXBWYWx1ZSwKKyAgICAgICAgICBzb3J0RnVuOworCisgICAgICBjb2x1bW5PckZ1bmN0aW9uID0gY29sdW1uT3JGdW5jdGlvbiB8fCBzZXR0aW5ncy5jb2x1bW47CisgICAgICBzb3J0RnVuID0gY29sdW1uT3JGdW5jdGlvbjsKKworICAgICAgaWYgKCQuaXNOdW1lcmljKGNvbHVtbk9yRnVuY3Rpb24pKSB7CisgICAgICAgIHNvcnRGdW4gPSBmdW5jdGlvbihhLCBiKSB7CisgICAgICAgICAgdmFyIGV4dHJhY3RWYWx1ZSwgdmFsQSwgdmFsQjsKKworICAgICAgICAgIGV4dHJhY3RWYWx1ZSA9IGZ1bmN0aW9uKG5vZGUpIHsKKyAgICAgICAgICAgIHZhciB2YWwgPSBub2RlLnJvdy5maW5kKCJ0ZDplcSgiICsgY29sdW1uT3JGdW5jdGlvbiArICIpIikudGV4dCgpOworICAgICAgICAgICAgLy8gSWdub3JlIHRyYWlsaW5nL2xlYWRpbmcgd2hpdGVzcGFjZSBhbmQgdXNlIHVwcGVyY2FzZSB2YWx1ZXMgZm9yCisgICAgICAgICAgICAvLyBjYXNlIGluc2Vuc2l0aXZlIG9yZGVyaW5nCisgICAgICAgICAgICByZXR1cm4gJC50cmltKHZhbCkudG9VcHBlckNhc2UoKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB2YWxBID0gZXh0cmFjdFZhbHVlKGEpOworICAgICAgICAgIHZhbEIgPSBleHRyYWN0VmFsdWUoYik7CisKKyAgICAgICAgICBpZiAodmFsQSA8IHZhbEIpIHJldHVybiAtMTsKKyAgICAgICAgICBpZiAodmFsQSA+IHZhbEIpIHJldHVybiAxOworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9OworICAgICAgfQorCisgICAgICB0aGlzLmRhdGEoInRyZWV0YWJsZSIpLnNvcnRCcmFuY2gobm9kZSwgc29ydEZ1bik7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9LAorCisgICAgdW5sb2FkQnJhbmNoOiBmdW5jdGlvbihub2RlKSB7CisgICAgICB0aGlzLmRhdGEoInRyZWV0YWJsZSIpLnVubG9hZEJyYW5jaChub2RlKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgfTsKKworICAkLmZuLnRyZWV0YWJsZSA9IGZ1bmN0aW9uKG1ldGhvZCkgeworICAgIGlmIChtZXRob2RzW21ldGhvZF0pIHsKKyAgICAgIHJldHVybiBtZXRob2RzW21ldGhvZF0uYXBwbHkodGhpcywgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7CisgICAgfSBlbHNlIGlmICh0eXBlb2YgbWV0aG9kID09PSAnb2JqZWN0JyB8fCAhbWV0aG9kKSB7CisgICAgICByZXR1cm4gbWV0aG9kcy5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAkLmVycm9yKCJNZXRob2QgIiArIG1ldGhvZCArICIgZG9lcyBub3QgZXhpc3Qgb24galF1ZXJ5LnRyZWV0YWJsZSIpOworICAgIH0KKyAgfTsKKworICAvLyBFeHBvc2UgY2xhc3NlcyB0byB3b3JsZAorICB0aGlzLlRyZWVUYWJsZSB8fCAodGhpcy5UcmVlVGFibGUgPSB7fSk7CisgIHRoaXMuVHJlZVRhYmxlLk5vZGUgPSBOb2RlOworICB0aGlzLlRyZWVUYWJsZS5UcmVlID0gVHJlZTsKK30pLmNhbGwodGhpcyk7CmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2pzL2xheWVyQnRuLmpzIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9qcy9sYXllckJ0bi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDUwOWY5Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9qcy9sYXllckJ0bi5qcwpAQCAtMCwwICsxLDc3IEBACisidXNlIHN0cmljdCI7CisKK2Z1bmN0aW9uIGxheWVyQnRuc0luaXQoY3R4KSB7CisKKyAgLyogUmVtb3ZlIGFueSBjdXJyZW50IGJpbmRpbmdzIHRvIGF2b2lkIGR1cGxpY2F0ZWQgYmluZHMgKi8KKyAgJCgiLmxheWVyYnRuIikudW5iaW5kKCdjbGljaycpOworCisgICQoIi5sYXllcmJ0biIpLmNsaWNrKGZ1bmN0aW9uICgpeworICAgIHZhciBsYXllck9iaiA9ICQodGhpcykuZGF0YSgibGF5ZXIiKTsKKyAgICB2YXIgYWRkID0gKCQodGhpcykuZGF0YSgnZGlyZWN0aXZlJykgPT09ICJhZGQiKTsKKyAgICB2YXIgdGhpc0J0biA9ICQodGhpcyk7CisKKyAgICBsaWJ0b2FzdGVyLmFkZFJtTGF5ZXIobGF5ZXJPYmosIGFkZCwgZnVuY3Rpb24gKGxheWVyRGVwc0xpc3QpeworICAgICAgbGlidG9hc3Rlci5zaG93Q2hhbmdlTm90aWZpY2F0aW9uKGxpYnRvYXN0ZXIubWFrZUxheWVyQWRkUm1BbGVydE1zZyhsYXllck9iaiwgbGF5ZXJEZXBzTGlzdCwgYWRkKSk7CisKKyAgICAgIC8qIEluLWNlbGwgbm90aWZpY2F0aW9uICovCisgICAgICB2YXIgbm90aWZpY2F0aW9uID0gJCgnPGRpdiBpZD0idGVtcC1pbmxpbmUtbm90aWZ5IiBzdHlsZT0iZGlzcGxheTogbm9uZTsgZm9udC1zaXplOiAxMXB4OyBsaW5lLWhlaWdodDogMS4zOyIgY2xhc3M9InRvb2x0aXAtaW5uZXIiPjwvZGl2PicpOworICAgICAgdGhpc0J0bi5wYXJlbnQoKS5hcHBlbmQobm90aWZpY2F0aW9uKTsKKworICAgICAgaWYgKGFkZCl7CisgICAgICAgIGlmIChsYXllckRlcHNMaXN0Lmxlbmd0aCA+IDApCisgICAgICAgICAgbm90aWZpY2F0aW9uLnRleHQoU3RyaW5nKGxheWVyRGVwc0xpc3QubGVuZ3RoICsgMSkgKyAiIGxheWVycyBhZGRlZCIpOworICAgICAgICBlbHNlCisgICAgICAgICAgbm90aWZpY2F0aW9uLnRleHQoIjEgbGF5ZXIgYWRkZWQiKTsKKworICAgICAgICB2YXIgbGF5ZXJCdG5zRmFkZU91dCA9ICQoKTsKKyAgICAgICAgdmFyIGxheWVyRXhpc3RzQnRuRmFkZUluID0gJCgpOworCisgICAgICAgIGxheWVyQnRuc0ZhZGVPdXQgPSBsYXllckJ0bnNGYWRlT3V0LmFkZCgiLmxheWVyLWFkZC0iICsgbGF5ZXJPYmouaWQpOworICAgICAgICBsYXllckV4aXN0c0J0bkZhZGVJbiA9IGxheWVyRXhpc3RzQnRuRmFkZUluLmFkZCgiLmxheWVyLWV4aXN0cy0iICsgbGF5ZXJPYmouaWQpOworCisgICAgICAgIGZvciAodmFyIGkgaW4gbGF5ZXJEZXBzTGlzdCl7CisgICAgICAgICAgbGF5ZXJCdG5zRmFkZU91dCA9IGxheWVyQnRuc0ZhZGVPdXQuYWRkKCIubGF5ZXItYWRkLSIgKyBsYXllckRlcHNMaXN0W2ldLmlkKTsKKyAgICAgICAgICBsYXllckV4aXN0c0J0bkZhZGVJbiA9IGxheWVyRXhpc3RzQnRuRmFkZUluLmFkZCgiLmxheWVyLWV4aXN0cy0iICsgbGF5ZXJEZXBzTGlzdFtpXS5pZCk7CisgICAgICAgIH0KKworICAgICAgICBsYXllckJ0bnNGYWRlT3V0LmZhZGVPdXQoKS5wcm9taXNlKCkuZG9uZShmdW5jdGlvbigpeworICAgICAgICAgIG5vdGlmaWNhdGlvbi5mYWRlSW4oKS5kZWxheSg1MDApLmZhZGVPdXQoZnVuY3Rpb24oKXsKKyAgICAgICAgICAgIC8qIEZhZGUgaW4gdGhlIGJ1dHRvbnMgKi8KKyAgICAgICAgICAgIGxheWVyRXhpc3RzQnRuRmFkZUluLmZhZGVJbigpOworICAgICAgICAgICAgbm90aWZpY2F0aW9uLnJlbW92ZSgpOworICAgICAgICAgIH0pOworICAgICAgICB9KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG5vdGlmaWNhdGlvbi50ZXh0KCIxIGxheWVyIGRlbGV0ZWQiKTsKKyAgICAgICAgLyogRGVsZXRpbmcgYSBsYXllciB3ZSBvbmx5IGhhbmxkZSB0aGUgb25lIGJ1dHRvbiAqLworICAgICAgICB0aGlzQnRuLmZhZGVPdXQoZnVuY3Rpb24oKXsKKyAgICAgICAgICBub3RpZmljYXRpb24uZmFkZUluKCkuZGVsYXkoNTAwKS5mYWRlT3V0KGZ1bmN0aW9uKCl7CisgICAgICAgICAgICAkKCIubGF5ZXItYWRkLSIgKyBsYXllck9iai5pZCkuZmFkZUluKCk7CisgICAgICAgICAgICBub3RpZmljYXRpb24ucmVtb3ZlKCk7CisgICAgICAgICAgfSk7CisgICAgICAgIH0pOworICAgICAgfQorCisgICAgfSk7CisgIH0pOworCisgICQoIi5idWlsZC1yZWNpcGUtYnRuIikudW5iaW5kKCdjbGljaycpOworICAkKCIuYnVpbGQtcmVjaXBlLWJ0biIpLmNsaWNrKGZ1bmN0aW9uKGUpeworICAgIGUucHJldmVudERlZmF1bHQoKTsKKyAgICB2YXIgcmVjaXBlID0gJCh0aGlzKS5kYXRhKCdyZWNpcGUtbmFtZScpOworCisgICAgbGlidG9hc3Rlci5zdGFydEFCdWlsZChsaWJ0b2FzdGVyLmN0eC5wcm9qZWN0QnVpbGRzVXJsLAorICAgICAgbGlidG9hc3Rlci5jdHgucHJvamVjdElkLCByZWNpcGUsCisgICAgICBmdW5jdGlvbigpeworICAgICAgICAvKiBTdWNjZXNzICovCisgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKGxpYnRvYXN0ZXIuY3R4LnByb2plY3RCdWlsZHNVcmwpOworICAgICAgfSk7CisgIH0pOworCisgIC8qIFNldHVwIHRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSBidXR0b25zICovCisKKyAgZm9yICh2YXIgaSBpbiBjdHgucHJvamVjdExheWVycyl7CisgICAgICAkKCIubGF5ZXItZXhpc3RzLSIgKyBjdHgucHJvamVjdExheWVyc1tpXSkuc2hvdygpOworICAgICAgJCgiLmxheWVyLWFkZC0iICsgY3R4LnByb2plY3RMYXllcnNbaV0pLmhpZGUoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9qcy9sYXllckRlcHNNb2RhbC5qcyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvanMvbGF5ZXJEZXBzTW9kYWwuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI1ZjlkYwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvanMvbGF5ZXJEZXBzTW9kYWwuanMKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIGxheWVyOiBPYmplY3QgcmVwcmVzZW50aW5nIHRoZSBwYXJlbnQgbGF5ZXIgeyBpZDogLi4gbmFtZTogLi4uIHVybCB9CisgKiBkZXBlbmRlbmNpZXM6IGFycmF5IG9mIGRlcGVuZGVuY3kgbGF5ZXIgb2JqZWN0cyB7IGlkOiAuLiBuYW1lOiAuLn0KKyAqIHRpdGxlOiBvcHRpb25hbCBvdmVycmlkZSBmb3IgdGl0bGUKKyAqIGJvZHk6IG9wdGlvbmFsIG92ZXJyaWRlIGZvciBib2R5CisgKiBhZGRUb1Byb2plY3Q6IFdoZXRoZXIgdG8gYWRkIGxheWVycyB0byBwcm9qZWN0IG9uIGFjY2VwdAorICogc3VjY2Vzc0FkZDogZnVuY3Rpb24gdG8gcnVuIG9uIHN1Y2Nlc3MKKyAqLworZnVuY3Rpb24gc2hvd0xheWVyRGVwc01vZGFsKGxheWVyLCBkZXBlbmRlbmNpZXMsIHRpdGxlLCBib2R5LCBhZGRUb1Byb2plY3QsIHN1Y2Nlc3NBZGQpIHsKKworICBpZiAoJCgiI2RlcGVuZGVuY2llcy1tb2RhbCIpLmxlbmd0aCA9PT0gMCkgeworICAgICQuZ2V0KGxpYnRvYXN0ZXIuY3R4Lmh0bWxVcmwgKyAiL2xheWVyX2RlcHNfbW9kYWwuaHRtbCIsIGZ1bmN0aW9uKGh0bWwpeworICAgICAgJCgiYm9keSIpLmFwcGVuZChodG1sKTsKKyAgICAgIHNldHVwTW9kYWwoKTsKKyAgICB9KTsKKyAgfSBlbHNlIHsKKyAgICBzZXR1cE1vZGFsKCk7CisgIH0KKworICBmdW5jdGlvbiBzZXR1cE1vZGFsKCl7CisKKyAgICBpZiAodGl0bGUpIHsKKyAgICAgICQoJyNkZXBlbmRlbmNpZXMtbW9kYWwgI3RpdGxlJykudGV4dCh0aXRsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICQoJyNkZXBlbmRlbmNpZXMtbW9kYWwgI3RpdGxlJykudGV4dChsYXllci5uYW1lKTsKKyAgICB9CisKKyAgICBpZiAoYm9keSkgeworICAgICAgJCgiI2RlcGVuZGVuY2llcy1tb2RhbCAjYm9keS10ZXh0IikuaHRtbChib2R5KTsKKyAgICB9IGVsc2UgeworICAgICAgJCgiI2RlcGVuZGVuY2llcy1tb2RhbCAjbGF5ZXItbmFtZSIpLnRleHQobGF5ZXIubmFtZSk7CisgICAgfQorCisgICAgdmFyIGRlcGxpc3RIdG1sID0gIiI7CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZXBlbmRlbmNpZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgIGRlcGxpc3RIdG1sICs9ICI8bGk+PGxhYmVsIGNsYXNzPVwiY2hlY2tib3hcIj48aW5wdXQgbmFtZT1cImRlcGVuZGVuY2llc1wiIHZhbHVlPVwiIjsKKyAgICAgIGRlcGxpc3RIdG1sICs9IGRlcGVuZGVuY2llc1tpXS5pZDsKKyAgICAgIGRlcGxpc3RIdG1sICs9IlwiIHR5cGU9XCJjaGVja2JveFwiIGNoZWNrZWQ9XCJjaGVja2VkXCIvPiI7CisgICAgICBkZXBsaXN0SHRtbCArPSBkZXBlbmRlbmNpZXNbaV0ubmFtZTsKKyAgICAgIGRlcGxpc3RIdG1sICs9ICI8L2xhYmVsPjwvbGk+IjsKKyAgICB9CisgICAgJCgnI2RlcGVuZGVuY2llcy1saXN0JykuaHRtbChkZXBsaXN0SHRtbCk7CisKKyAgICAkKCIjZGVwZW5kZW5jaWVzLW1vZGFsIikuZGF0YSgiZGVwcyIsIGRlcGVuZGVuY2llcyk7CisKKyAgICAkKCcjZGVwZW5kZW5jaWVzLW1vZGFsJykubW9kYWwoJ3Nob3cnKTsKKworICAgIC8qIERpc2NhcmQgdGhlIG9sZCBzdWJtaXNzaW9uIGZ1bmN0aW9uICovCisgICAgJCgiI2RlcGVuZGVuY2llcy1tb2RhbC1mb3JtIikudW5iaW5kKCdzdWJtaXQnKTsKKworICAgICQoIiNkZXBlbmRlbmNpZXMtbW9kYWwtZm9ybSIpLnN1Ym1pdChmdW5jdGlvbiAoZSkgeworICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOworICAgICAgdmFyIHNlbGVjdGVkTGF5ZXJJZHMgPSBbXTsKKyAgICAgIHZhciBzZWxlY3RlZExheWVycyA9IFtdOworCisgICAgICAkKCJpbnB1dFtuYW1lPSdkZXBlbmRlbmNpZXMnXTpjaGVja2VkIikuZWFjaChmdW5jdGlvbiAoKSB7CisgICAgICAgIHNlbGVjdGVkTGF5ZXJJZHMucHVzaChwYXJzZUludCgkKHRoaXMpLnZhbCgpKSk7CisgICAgICB9KTsKKworICAgICAgLyogLTEgaXMgYSBzcGVjaWFsIGR1bW15IElkIHdoaWNoIHdlIHVzZSB3aGVuIHRoZSBsYXllciBpc24ndCB5ZXQgaW4gdGhlCisgICAgICAgKiBzeXN0ZW0sIG5vcm1hbGx5IHdlIHdvdWxkIGFkZCB0aGUgY3VycmVudCBsYXllciB0byB0aGUgc2VsZWN0aW9uLgorICAgICAgICovCisgICAgICBpZiAobGF5ZXIuaWQgIT0gLTEpCisgICAgICAgIHNlbGVjdGVkTGF5ZXJJZHMucHVzaChsYXllci5pZCk7CisKKyAgICAgIC8qIEZpbmQgdGhlIHNlbGVjdGVkIGxheWVyIG9iamVjdHMgZnJvbSBvdXIgb3JpZ2luYWwgbGlzdCAqLworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxlY3RlZExheWVySWRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZGVwZW5kZW5jaWVzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgaWYgKGRlcGVuZGVuY2llc1tqXS5pZCA9PSBzZWxlY3RlZExheWVySWRzW2ldKSB7CisgICAgICAgICAgICBzZWxlY3RlZExheWVycy5wdXNoKGRlcGVuZGVuY2llc1tqXSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChhZGRUb1Byb2plY3QpIHsKKyAgICAgICAgbGlidG9hc3Rlci5lZGl0Q3VycmVudFByb2plY3QoeyAnbGF5ZXJBZGQnOiBzZWxlY3RlZExheWVySWRzLmpvaW4oIiwiKSB9LCBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgaWYgKHN1Y2Nlc3NBZGQpIHsKKyAgICAgICAgICAgIHN1Y2Nlc3NBZGQoc2VsZWN0ZWRMYXllcnMpOworICAgICAgICAgIH0KKyAgICAgICAgfSwgZnVuY3Rpb24gKCkgeworICAgICAgICAgIGNvbnNvbGUud2FybigiQWRkaW5nIGxheWVycyB0byBwcm9qZWN0IGZhaWxlZCIpOworICAgICAgICB9KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN1Y2Nlc3NBZGQoc2VsZWN0ZWRMYXllcnMpOworICAgICAgfQorCisgICAgICAkKCcjZGVwZW5kZW5jaWVzLW1vZGFsJykubW9kYWwoJ2hpZGUnKTsKKyAgICB9KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9qcy9sYXllcmRldGFpbHMuanMgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2pzL2xheWVyZGV0YWlscy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDBlODAzCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9qcy9sYXllcmRldGFpbHMuanMKQEAgLTAsMCArMSwzOTIgQEAKKyJ1c2Ugc3RyaWN0IjsKKworZnVuY3Rpb24gbGF5ZXJEZXRhaWxzUGFnZUluaXQgKGN0eCkgeworCisgIHZhciBsYXllckRlcElucHV0ID0gJCgiI2xheWVyLWRlcC1pbnB1dCIpOworICB2YXIgbGF5ZXJEZXBCdG4gPSAkKCIjYWRkLWxheWVyLWRlcGVuZGVuY3ktYnRuIik7CisgIHZhciBsYXllckRlcHNMaXN0ID0gJCgiI2xheWVyLWRlcHMtbGlzdCIpOworICB2YXIgY3VycmVudExheWVyRGVwU2VsZWN0aW9uOworICB2YXIgYWRkUm1MYXllckJ0biA9ICQoIiNhZGQtcmVtb3ZlLWxheWVyLWJ0biIpOworCisgIC8qIHNldHVwIHRoZSBkZXBlbmRlbmNpZXMgdHlwZWFoZWFkICovCisgIGxpYnRvYXN0ZXIubWFrZVR5cGVhaGVhZChsYXllckRlcElucHV0LCBsaWJ0b2FzdGVyLmN0eC5sYXllcnNUeXBlQWhlYWRVcmwsIHsgaW5jbHVkZV9hZGRlZDogInRydWUiIH0sIGZ1bmN0aW9uKGl0ZW0peworICAgIGN1cnJlbnRMYXllckRlcFNlbGVjdGlvbiA9IGl0ZW07CisKKyAgICBsYXllckRlcEJ0bi5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpOworICB9KTsKKworICAkKCIuYnJlYWRjcnVtYiBsaTpmaXJzdCBhIikuY2xpY2soZnVuY3Rpb24oZSl7CisgICAgZS5wcmV2ZW50RGVmYXVsdCgpOworICAgIC8qIEJ5IGRlZmF1bHQgdGhpcyBsaW5rIGdvZXMgdG8gdGhlIHByb2plY3QgY29uZmlndXJhdGlvbiBwYWdlLiBIb3dldmVyCisgICAgICogaWYgd2UgaGF2ZSBzb21lIGJ1aWxkcyB3ZSBnbyB0aGVyZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGhyZWYKKyAgICAgKi8KKyAgICBsaWJ0b2FzdGVyLmdldFByb2plY3RJbmZvKGxpYnRvYXN0ZXIuY3R4LnByb2plY3RQYWdlVXJsLCBmdW5jdGlvbihwcmpJbmZvKXsKKyAgICAgIGlmIChwcmpJbmZvLmJ1aWxkcyAmJiBwcmpJbmZvLmJ1aWxkcy5sZW5ndGggPiAwKSB7CisgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKGxpYnRvYXN0ZXIuY3R4LnByb2plY3RCdWlsZHNVcmwpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UobGlidG9hc3Rlci5jdHgucHJvamVjdFBhZ2VVcmwpOworICAgICAgfQorICAgIH0pOworICB9KTsKKworICBmdW5jdGlvbiBhZGRSZW1vdmVEZXAoZGVwTGF5ZXJJZCwgYWRkLCBkb25lQ2IpIHsKKyAgICB2YXIgZGF0YSA9IHsgbGF5ZXJfdmVyc2lvbl9pZCA6IGN0eC5sYXllclZlcnNpb24uaWQgfTsKKyAgICBpZiAoYWRkKQorICAgICAgZGF0YS5hZGRfZGVwID0gZGVwTGF5ZXJJZDsKKyAgICBlbHNlCisgICAgICBkYXRhLnJtX2RlcCA9IGRlcExheWVySWQ7CisKKyAgICAkLmFqYXgoeworICAgICAgICB0eXBlOiAiUE9TVCIsCisgICAgICAgIHVybDogY3R4LnhoclVwZGF0ZUxheWVyVXJsLAorICAgICAgICBkYXRhOiBkYXRhLAorICAgICAgICBoZWFkZXJzOiB7ICdYLUNTUkZUb2tlbicgOiAkLmNvb2tpZSgnY3NyZnRva2VuJyl9LAorICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSkgeworICAgICAgICAgIGlmIChkYXRhLmVycm9yICE9ICJvayIpIHsKKyAgICAgICAgICAgIGNvbnNvbGUud2FybihkYXRhLmVycm9yKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZG9uZUNiKCk7CisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBlcnJvcjogZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgICAgICBjb25zb2xlLndhcm4oIkNhbGwgZmFpbGVkIik7CisgICAgICAgICAgY29uc29sZS53YXJuKGRhdGEpOworICAgICAgICB9CisgICAgfSk7CisgIH0KKworICBmdW5jdGlvbiBsYXllckRlcFJlbW92ZUNsaWNrKCkgeworICAgIHZhciB0b1JlbW92ZSA9ICQodGhpcykucGFyZW50KCkuZGF0YSgnbGF5ZXItaWQnKTsKKyAgICB2YXIgbGF5ZXJEZXBJdGVtID0gJCh0aGlzKTsKKworICAgIGFkZFJlbW92ZURlcCh0b1JlbW92ZSwgZmFsc2UsIGZ1bmN0aW9uKCl7CisgICAgICBsYXllckRlcEl0ZW0ucGFyZW50KCkuZmFkZU91dChmdW5jdGlvbiAoKXsKKyAgICAgICAgbGF5ZXJEZXBJdGVtLnJlbW92ZSgpOworICAgICAgfSk7CisgICAgfSk7CisgIH0KKworICAvKiBBZGQgZGVwZW5kZW5jeSBsYXllciBidXR0b24gY2xpY2sgaGFuZGxlciAqLworICBsYXllckRlcEJ0bi5jbGljayhmdW5jdGlvbigpeworICAgIGlmIChjdXJyZW50TGF5ZXJEZXBTZWxlY3Rpb24gPT09IHVuZGVmaW5lZCkKKyAgICAgIHJldHVybjsKKworICAgIGFkZFJlbW92ZURlcChjdXJyZW50TGF5ZXJEZXBTZWxlY3Rpb24uaWQsIHRydWUsIGZ1bmN0aW9uKCl7CisgICAgICAvKiBNYWtlIGEgbGlzdCBpdGVtIGZvciB0aGUgbmV3IGxheWVyIGRlcGVuZGVuY3kgKi8KKyAgICAgIHZhciBuZXdMYXllckRlcCA9ICQoIjxsaT48YT48L2E+PHNwYW4gY2xhc3M9XCJpY29uLXRyYXNoXCIgZGF0YS10b2dnbGU9XCJ0b29sdGlwXCIgdGl0bGU9XCJEZWxldGVcIj48L3NwYW4+PC9saT4iKTsKKworICAgICAgbmV3TGF5ZXJEZXAuZGF0YSgnbGF5ZXItaWQnLCBjdXJyZW50TGF5ZXJEZXBTZWxlY3Rpb24uaWQpOworICAgICAgbmV3TGF5ZXJEZXAuY2hpbGRyZW4oInNwYW4iKS50b29sdGlwKCk7CisKKyAgICAgIHZhciBsaW5rID0gbmV3TGF5ZXJEZXAuY2hpbGRyZW4oImEiKTsKKyAgICAgIGxpbmsuYXR0cigiaHJlZiIsIGN1cnJlbnRMYXllckRlcFNlbGVjdGlvbi5sYXllcmRldGFpbHVybCk7CisgICAgICBsaW5rLnRleHQoY3VycmVudExheWVyRGVwU2VsZWN0aW9uLm5hbWUpOworICAgICAgbGluay50b29sdGlwKHt0aXRsZTogY3VycmVudExheWVyRGVwU2VsZWN0aW9uLnRvb2x0aXAsIHBsYWNlbWVudDogInJpZ2h0In0pOworCisgICAgICAvKiBDb25uZWN0IHVwIHRoZSB0YXNoIGljb24gKi8KKyAgICAgIHZhciB0cmFzaEl0ZW0gPSBuZXdMYXllckRlcC5jaGlsZHJlbigic3BhbiIpOworICAgICAgdHJhc2hJdGVtLmNsaWNrKGxheWVyRGVwUmVtb3ZlQ2xpY2spOworCisgICAgICBsYXllckRlcHNMaXN0LmFwcGVuZChuZXdMYXllckRlcCk7CisgICAgICAvKiBDbGVhciB0aGUgY3VycmVudCBzZWxlY3Rpb24gKi8KKyAgICAgIGxheWVyRGVwSW5wdXQudmFsKCIiKTsKKyAgICAgIGN1cnJlbnRMYXllckRlcFNlbGVjdGlvbiA9IHVuZGVmaW5lZDsKKyAgICAgIGxheWVyRGVwQnRuLmF0dHIoImRpc2FibGVkIiwiZGlzYWJsZWQiKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgJCgiLmljb24tcGVuY2lsIikuY2xpY2soZnVuY3Rpb24gKCl7CisgICAgdmFyIG1QYXJlbnQgPSAkKHRoaXMpLnBhcmVudCgiZGQiKTsKKyAgICBtUGFyZW50LnByZXYoKS5jc3MoIm1hcmdpbi10b3AiLCAiMTBweCIpOworICAgIG1QYXJlbnQuY2hpbGRyZW4oImZvcm0iKS5zbGlkZURvd24oKTsKKyAgICB2YXIgY3VycmVudFZhbCA9IG1QYXJlbnQuY2hpbGRyZW4oIi5jdXJyZW50LXZhbHVlIik7CisgICAgY3VycmVudFZhbC5oaWRlKCk7CisgICAgLyogU2V0IHRoZSBjdXJyZW50IHZhbHVlIHRvIHRoZSBpbnB1dCBmaWVsZCAqLworICAgIG1QYXJlbnQuZmluZCgidGV4dGFyZWEsaW5wdXQiKS52YWwoY3VycmVudFZhbC50ZXh0KCkpOworICAgIC8qIEhpZGVzIHRoZSAiTm90IHNldCIgdGV4dCAqLworICAgIG1QYXJlbnQuY2hpbGRyZW4oIi5tdXRlZCIpLmhpZGUoKTsKKyAgICAvKiBXZSdyZSBlZGl0aW5nIHNvIGhpZGUgdGhlIGRlbGV0ZSBpY29uICovCisgICAgbVBhcmVudC5jaGlsZHJlbigiLmRlbGV0ZS1jdXJyZW50LXZhbHVlIikuaGlkZSgpOworICAgIG1QYXJlbnQuZmluZCgiLmNhbmNlbCIpLnNob3coKTsKKyAgICAkKHRoaXMpLmhpZGUoKTsKKyAgfSk7CisKKyAgJCgiLmRlbGV0ZS1jdXJyZW50LXZhbHVlIikuY2xpY2soZnVuY3Rpb24oKXsKKyAgICB2YXIgbVBhcmVudCA9ICQodGhpcykucGFyZW50KCJkZCIpOworICAgIG1QYXJlbnQuZmluZCgiaW5wdXQiKS52YWwoIiIpOworICAgIG1QYXJlbnQuZmluZCgidGV4dGFyZWEiKS52YWwoIiIpOworICAgIG1QYXJlbnQuZmluZCgiLmNoYW5nZS1idG4iKS5jbGljaygpOworICB9KTsKKworICAkKCIuY2FuY2VsIikuY2xpY2soZnVuY3Rpb24oKXsKKyAgICB2YXIgbVBhcmVudCA9ICQodGhpcykucGFyZW50cygiZGQiKTsKKyAgICAkKHRoaXMpLmhpZGUoKTsKKyAgICBtUGFyZW50LmNoaWxkcmVuKCJmb3JtIikuc2xpZGVVcChmdW5jdGlvbigpeworICAgICAgbVBhcmVudC5jaGlsZHJlbigiLmN1cnJlbnQtdmFsdWUiKS5zaG93KCk7CisgICAgICAvKiBTaG93IHRoZSAiTm90IHNldCIgdGV4dCBpZiB3ZSBlbmRlZCB1cCB3aXRoIG5vIHZhbHVlICovCisgICAgICBpZiAoIW1QYXJlbnQuY2hpbGRyZW4oIi5jdXJyZW50LXZhbHVlIikuaHRtbCgpKXsKKyAgICAgICAgbVBhcmVudC5jaGlsZHJlbigiLm11dGVkIikuZmFkZUluKCk7CisgICAgICAgIG1QYXJlbnQuY2hpbGRyZW4oIi5kZWxldGUtY3VycmVudC12YWx1ZSIpLmhpZGUoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1QYXJlbnQuY2hpbGRyZW4oIi5kZWxldGUtY3VycmVudC12YWx1ZSIpLnNob3coKTsKKyAgICAgIH0KKworICAgICAgbVBhcmVudC5jaGlsZHJlbigiLmljb24tcGVuY2lsIikuc2hvdygpOworICAgICAgbVBhcmVudC5wcmV2KCkuY3NzKCJtYXJnaW4tdG9wIiwgIjBweCIpOworICAgIH0pOworICB9KTsKKworICBmdW5jdGlvbiBkZWZhdWx0QWRkQnRuVGV4dCgpeworICAgICAgdmFyIHRleHQgPSAiIEFkZCB0aGUgIitjdHgubGF5ZXJWZXJzaW9uLm5hbWUrIiBsYXllciB0byB5b3VyIHByb2plY3QiOworICAgICAgYWRkUm1MYXllckJ0bi50ZXh0KHRleHQpOworICAgICAgYWRkUm1MYXllckJ0bi5wcmVwZW5kKCI8c3BhbiBjbGFzcz1cImljb24tcGx1c1wiPjwvc3Bhbj4iKTsKKyAgICAgIGFkZFJtTGF5ZXJCdG4ucmVtb3ZlQ2xhc3MoImJ0bi1kYW5nZXIiKTsKKyAgfQorCisgICQoIiNkZXRhaWxzLXRhYiIpLm9uKCdzaG93JywgZnVuY3Rpb24oKXsKKyAgICBpZiAoIWN0eC5sYXllclZlcnNpb24uaW5DdXJyZW50UHJqKQorICAgICAgZGVmYXVsdEFkZEJ0blRleHQoKTsKKworICAgIHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gImRldGFpbHMiOworICB9KTsKKworICBmdW5jdGlvbiB0YXJnZXRzVGFiU2hvdygpeworICAgIGlmICghY3R4LmxheWVyVmVyc2lvbi5pbkN1cnJlbnRQcmopeworICAgICAgaWYgKGN0eC5udW1UYXJnZXRzID4gMCkgeworICAgICAgICB2YXIgdGV4dCA9ICIgQWRkIHRoZSAiK2N0eC5sYXllclZlcnNpb24ubmFtZSsiIGxheWVyIHRvIHlvdXIgcHJvamVjdCAiKworICAgICAgICAgICJ0byBlbmFibGUgdGhlc2UgcmVjaXBlcyI7CisgICAgICAgIGFkZFJtTGF5ZXJCdG4udGV4dCh0ZXh0KTsKKyAgICAgICAgYWRkUm1MYXllckJ0bi5wcmVwZW5kKCI8c3BhbiBjbGFzcz1cImljb24tcGx1c1wiPjwvc3Bhbj4iKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRlZmF1bHRBZGRCdG5UZXh0KCk7CisgICAgICB9CisgICAgfQorCisgICAgd2luZG93LmxvY2F0aW9uLmhhc2ggPSAicmVjaXBlcyI7CisgIH0KKworICAkKCIjcmVjaXBlc3RhYmxlIikub24oJ3RhYmxlLWRvbmUnLCBmdW5jdGlvbihlLCB0b3RhbCwgdGFibGVQYXJhbXMpeworICAgIGN0eC5udW1UYXJnZXRzID0gdG90YWw7CisKKyAgICBpZiAodG90YWwgPT09IDAgJiYgIXRhYmxlUGFyYW1zLnNlYXJjaCkgeworICAgICAgJCgiI25vLXJlY2lwZXMteWV0Iikuc2hvdygpOworICAgIH0gZWxzZSB7CisgICAgICAkKCIjbm8tcmVjaXBlcy15ZXQiKS5oaWRlKCk7CisgICAgfQorCisgICAgJCgiI3RhcmdldHMtdGFiIikucmVtb3ZlQ2xhc3MoIm11dGVkIik7CisgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5oYXNoID09PSAiI3JlY2lwZXMiKXsKKyAgICAgIC8qIHJlIHJ1biB0aGUgbWFjaGluZXNUYWJTaG93IHRvIHVwZGF0ZSB0aGUgdGV4dCAqLworICAgICAgdGFyZ2V0c1RhYlNob3coKTsKKyAgICB9CisgIH0pOworCisgICQoIiNtYWNoaW5lc3RhYmxlIikub24oJ3RhYmxlLWRvbmUnLCBmdW5jdGlvbihlLCB0b3RhbCwgdGFibGVQYXJhbXMpeworICAgIGN0eC5udW1NYWNoaW5lcyA9IHRvdGFsOworCisgICAgaWYgKHRvdGFsID09PSAwICYmICF0YWJsZVBhcmFtcy5zZWFyY2gpCisgICAgICAkKCIjbm8tbWFjaGluZXMteWV0Iikuc2hvdygpOworICAgIGVsc2UKKyAgICAgICQoIiNuby1tYWNoaW5lcy15ZXQiKS5oaWRlKCk7CisKKyAgICAkKCIjbWFjaGluZXMtdGFiIikucmVtb3ZlQ2xhc3MoIm11dGVkIik7CisgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5oYXNoID09PSAiI21hY2hpbmVzIil7CisgICAgICAvKiByZSBydW4gdGhlIG1hY2hpbmVzVGFiU2hvdyB0byB1cGRhdGUgdGhlIHRleHQgKi8KKyAgICAgIG1hY2hpbmVzVGFiU2hvdygpOworICAgIH0KKworICAgICQoIi5zZWxlY3QtbWFjaGluZS1idG4iKS5jbGljayhmdW5jdGlvbihlKXsKKyAgICAgIGlmICgkKHRoaXMpLmF0dHIoImRpc2FibGVkIikgPT09ICJkaXNhYmxlZCIpCisgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKKyAgICB9KTsKKworICB9KTsKKworICAkKCIjdGFyZ2V0cy10YWIiKS5vbignc2hvdycsIHRhcmdldHNUYWJTaG93KTsKKworICBmdW5jdGlvbiBtYWNoaW5lc1RhYlNob3coKXsKKyAgICBpZiAoIWN0eC5sYXllclZlcnNpb24uaW5DdXJyZW50UHJqKSB7CisgICAgICBpZiAoY3R4Lm51bU1hY2hpbmVzID4gMCl7CisgICAgICAgIHZhciB0ZXh0ID0gIiBBZGQgdGhlICIrY3R4LmxheWVyVmVyc2lvbi5uYW1lKyIgbGF5ZXIgdG8geW91ciBwcm9qZWN0ICIgKworICAgICAgICAgICJ0byBlbmFibGUgdGhlc2UgbWFjaGluZXMiOworICAgICAgICBhZGRSbUxheWVyQnRuLnRleHQodGV4dCk7CisgICAgICAgIGFkZFJtTGF5ZXJCdG4ucHJlcGVuZCgiPHNwYW4gY2xhc3M9XCJpY29uLXBsdXNcIj48L3NwYW4+Iik7CisgICAgICB9IGVsc2UgeworICAgICAgICBkZWZhdWx0QWRkQnRuVGV4dCgpOworICAgICAgfQorICAgIH0KKworICAgIHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gIm1hY2hpbmVzIjsKKyAgfQorCisgICQoIiNtYWNoaW5lcy10YWIiKS5vbignc2hvdycsIG1hY2hpbmVzVGFiU2hvdyk7CisKKyAgJCgiLnBhZ2VzaXplIikuY2hhbmdlKGZ1bmN0aW9uKCl7CisgICAgdmFyIHNlYXJjaCA9IGxpYnRvYXN0ZXIucGFyc2VVcmxQYXJhbXMoKTsKKyAgICBzZWFyY2gubGltaXQgPSB0aGlzLnZhbHVlOworCisgICAgd2luZG93LmxvY2F0aW9uLnNlYXJjaCA9IGxpYnRvYXN0ZXIuZHVtcHNVcmxQYXJhbXMoc2VhcmNoKTsKKyAgfSk7CisKKyAgLyogRW5hYmxlcyB0aGUgQnVpbGQgdGFyZ2V0IGFuZCBTZWxlY3QgTWFjaGluZSBidXR0b25zIGFuZCBzd2l0Y2hlcyB0aGUKKyAgICogYWRkL3JlbW92ZSBidXR0b24KKyAgICovCisgIGZ1bmN0aW9uIHNldExheWVySW5DdXJyZW50UHJqKGFkZGVkKSB7CisgICAgY3R4LmxheWVyVmVyc2lvbi5pbkN1cnJlbnRQcmogPSBhZGRlZDsKKworICAgIGlmIChhZGRlZCl7CisgICAgICAvKiBlbmFibGUgYW5kIHN3aXRjaCBhbGwgdGhlIGJ1dHRvbiBzdGF0ZXMgKi8KKyAgICAgICQoIi5idWlsZC10YXJnZXQtYnRuIikucmVtb3ZlQXR0cigiZGlzYWJsZWQiKTsKKyAgICAgICQoIi5zZWxlY3QtbWFjaGluZS1idG4iKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpOworICAgICAgYWRkUm1MYXllckJ0bi5hZGRDbGFzcygiYnRuLWRhbmdlciIpOworICAgICAgYWRkUm1MYXllckJ0bi5kYXRhKCdkaXJlY3RpdmUnLCAicmVtb3ZlIik7CisgICAgICBhZGRSbUxheWVyQnRuLnRleHQoIiBEZWxldGUgdGhlICIrY3R4LmxheWVyVmVyc2lvbi5uYW1lKyIgbGF5ZXIgZnJvbSB5b3VyIHByb2plY3QiKTsKKyAgICAgIGFkZFJtTGF5ZXJCdG4ucHJlcGVuZCgiPHNwYW4gY2xhc3M9XCJpY29uLXRyYXNoXCI+PC9zcGFuPiIpOworCisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGRpc2FibGUgYW5kIHN3aXRjaCBhbGwgdGhlIGJ1dHRvbiBzdGF0ZXMgKi8KKyAgICAgICQoIi5idWlsZC10YXJnZXQtYnRuIikuYXR0cigiZGlzYWJsZWQiLCJkaXNhYmxlZCIpOworICAgICAgJCgiLnNlbGVjdC1tYWNoaW5lLWJ0biIpLmF0dHIoImRpc2FibGVkIiwgImRpc2FibGVkIik7CisgICAgICBhZGRSbUxheWVyQnRuLnJlbW92ZUNsYXNzKCJidG4tZGFuZ2VyIik7CisgICAgICBhZGRSbUxheWVyQnRuLmRhdGEoJ2RpcmVjdGl2ZScsICJhZGQiKTsKKworICAgICAgLyogInNwZWNpYWwiIGhhbmRsZXIgc28gdGhhdCB3ZSBnZXQgdGhlIGNvcnJlY3QgYnV0dG9uIHRleHQgd2hpY2ggZGVwZW5kcworICAgICAgICogb24gd2hpY2ggdGFiIGlzIGN1cnJlbnRseSB2aXNpYmxlLiBVbmZvcnR1bmF0ZWx5IHdlIGNhbid0IGp1c3QgY2FsbAorICAgICAgICogdGFiKCdzaG93JykgYXMgaWYgaXQncyBhbHJlYWR5IHZpc2libGUgaXQgZG9lc24ndCBydW4gdGhlIGV2ZW50LgorICAgICAgICovCisgICAgICBzd2l0Y2ggKCQoIi5uYXYtcGlsbHMgLmFjdGl2ZSBhIikucHJvcCgnaWQnKSl7CisgICAgICAgIGNhc2UgJ21hY2hpbmVzLXRhYic6CisgICAgICAgICAgbWFjaGluZXNUYWJTaG93KCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3RhcmdldHMtdGFiJzoKKyAgICAgICAgICB0YXJnZXRzVGFiU2hvdygpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGRlZmF1bHRBZGRCdG5UZXh0KCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgJCgiI2Rpc21pc3MtYWxlcnQiKS5jbGljayhmdW5jdGlvbigpeworICAgICQodGhpcykucGFyZW50KCkuZmFkZU91dCgpOworICB9KTsKKworICAvKiBBZGQgb3IgcmVtb3ZlIHRoaXMgbGF5ZXIgZnJvbSB0aGUgcHJvamVjdCAqLworICBhZGRSbUxheWVyQnRuLmNsaWNrKGZ1bmN0aW9uKCkgeworCisgICAgdmFyIGFkZCA9ICgkKHRoaXMpLmRhdGEoJ2RpcmVjdGl2ZScpID09PSAiYWRkIik7CisKKyAgICBsaWJ0b2FzdGVyLmFkZFJtTGF5ZXIoY3R4LmxheWVyVmVyc2lvbiwgYWRkLCBmdW5jdGlvbiAobGF5ZXJzTGlzdCl7CisgICAgICB2YXIgYWxlcnRNc2cgPSAkKCIjYWxlcnQtbXNnIik7CisgICAgICBhbGVydE1zZy5odG1sKGxpYnRvYXN0ZXIubWFrZUxheWVyQWRkUm1BbGVydE1zZyhjdHgubGF5ZXJWZXJzaW9uLCBsYXllcnNMaXN0LCBhZGQpKTsKKworICAgICAgc2V0TGF5ZXJJbkN1cnJlbnRQcmooYWRkKTsKKworICAgICAgJCgiI2FsZXJ0LWFyZWEiKS5zaG93KCk7CisgICAgfSk7CisgIH0pOworCisgIC8qIEhhbmRsZXIgZm9yIGFsbCBvZiB0aGUgQ2hhbmdlIGJ1dHRvbnMgKi8KKyAgJCgiLmNoYW5nZS1idG4iKS5jbGljayhmdW5jdGlvbigpeworICAgIHZhciBtUGFyZW50ID0gJCh0aGlzKS5wYXJlbnQoKTsKKyAgICB2YXIgcHJvcCA9ICQodGhpcykuZGF0YSgnbGF5ZXItcHJvcCcpOworCisgICAgLyogV2UgaGF2ZSBpbnB1dHMsIHNlbGVjdCBhbmQgdGV4dGFyZWFzIHRvIHBvdGVudGlhbGx5IGdyYWIgdGhlIHZhbHVlCisgICAgICogZnJvbS4KKyAgICAgKi8KKyAgICB2YXIgZW50cnlFbGVtZW50ID0gbVBhcmVudC5maW5kKCJpbnB1dCIpOworICAgIGlmIChlbnRyeUVsZW1lbnQubGVuZ3RoID09PSAwKQorICAgICAgZW50cnlFbGVtZW50ID0gbVBhcmVudC5maW5kKCJ0ZXh0YXJlYSIpOworICAgIGlmIChlbnRyeUVsZW1lbnQubGVuZ3RoID09PSAwKSB7CisgICAgICBjb25zb2xlLndhcm4oIkNvdWxkIG5vdCBmaW5kIGVsZW1lbnQgdG8gZ2V0IGRhdGEgZnJvbSBmb3IgdGhpcyBjaGFuZ2UiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgZGF0YSA9IHsgbGF5ZXJfdmVyc2lvbl9pZDogY3R4LmxheWVyVmVyc2lvbi5pZCB9OworICAgIGRhdGFbcHJvcF0gPSBlbnRyeUVsZW1lbnQudmFsKCk7CisKKyAgICAkLmFqYXgoeworICAgICAgICB0eXBlOiAiUE9TVCIsCisgICAgICAgIHVybDogY3R4LnhoclVwZGF0ZUxheWVyVXJsLAorICAgICAgICBkYXRhOiBkYXRhLAorICAgICAgICBoZWFkZXJzOiB7ICdYLUNTUkZUb2tlbicgOiAkLmNvb2tpZSgnY3NyZnRva2VuJyl9LAorICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSkgeworICAgICAgICAgIGlmIChkYXRhLmVycm9yICE9ICJvayIpIHsKKyAgICAgICAgICAgIGNvbnNvbGUud2FybihkYXRhLmVycm9yKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogc3VjY2VzcyBsYXllciBwcm9wZXJ0eSBjaGFuZ2VkICovCisgICAgICAgICAgICB2YXIgaW5wdXRBcmVhID0gbVBhcmVudC5wYXJlbnRzKCJkZCIpOworICAgICAgICAgICAgdmFyIHRleHQ7CisKKyAgICAgICAgICAgIHRleHQgPSBlbnRyeUVsZW1lbnQudmFsKCk7CisKKyAgICAgICAgICAgIC8qIEhpZGUgdGhlICJOb3Qgc2V0IiB0ZXh0IGlmIGl0J3MgdmlzaWJsZSAqLworICAgICAgICAgICAgaW5wdXRBcmVhLmZpbmQoIi5tdXRlZCIpLmhpZGUoKTsKKyAgICAgICAgICAgIGlucHV0QXJlYS5maW5kKCIuY3VycmVudC12YWx1ZSIpLnRleHQodGV4dCk7CisgICAgICAgICAgICAvKiBTYW1lIGJlaGF2aW91ciBhcyBjYW5jZWwgaW4gdGhhdCB3ZSBoaWRlIHRoZSBmb3JtL3Nob3cgY3VycmVudAorICAgICAgICAgICAgICogdmFsdWUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlucHV0QXJlYS5maW5kKCIuY2FuY2VsIikuY2xpY2soKTsKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoZGF0YSkgeworICAgICAgICAgIGNvbnNvbGUud2FybigiQ2FsbCBmYWlsZWQiKTsKKyAgICAgICAgICBjb25zb2xlLndhcm4oZGF0YSk7CisgICAgICAgIH0KKyAgICB9KTsKKyAgfSk7CisKKyAgLyogRGlzYWJsZSB0aGUgY2hhbmdlIGJ1dHRvbiB3aGVuIHdlIGhhdmUgbm8gZGF0YSBpbiB0aGUgaW5wdXQgKi8KKyAgJCgiZGwgaW5wdXQsIGRsIHRleHRhcmVhIikub24oImlucHV0IixmdW5jdGlvbigpIHsKKyAgICBpZiAoJCh0aGlzKS52YWwoKS5sZW5ndGggPT09IDApCisgICAgICAkKHRoaXMpLnBhcmVudCgpLmNoaWxkcmVuKCIuY2hhbmdlLWJ0biIpLmF0dHIoImRpc2FibGVkIiwgImRpc2FibGVkIik7CisgICAgZWxzZQorICAgICAgJCh0aGlzKS5wYXJlbnQoKS5jaGlsZHJlbigiLmNoYW5nZS1idG4iKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpOworICB9KTsKKworICAvKiBUaGlzIGNoZWNrcyB0byBzZWUgaWYgdGhlIGR0J3MgZGQgaGFzIGRhdGEgaW4gaXQgb3IgaWYgdGhlIGNoYW5nZSBkYXRhCisgICAqIGZvcm0gaXMgdmlzaWJsZSwgb3RoZXJ3aXNlIGhpZGUgaXQKKyAgICovCisgICQoImRsIikuY2hpbGRyZW4oKS5lYWNoKGZ1bmN0aW9uICgpeworICAgIGlmICgkKHRoaXMpLmlzKCJkdCIpKSB7CisgICAgICB2YXIgZGQgPSAkKHRoaXMpLm5leHQoImRkIik7CisgICAgICBpZiAoIWRkLmNoaWxkcmVuKCJmb3JtOnZpc2libGUiKXx8ICFkZC5maW5kKCIuY3VycmVudC12YWx1ZSIpLmh0bWwoKSl7CisgICAgICAgIGlmIChjdHgubGF5ZXJWZXJzaW9uLnNvdXJjZUlkID09IDMpeworICAgICAgICAvKiBUaGVyZSdzIG5vIGN1cnJlbnQgdmFsdWUgYW5kIHRoZSBsYXllciBpcyBlZGl0YWJsZQorICAgICAgICAgKiBzbyBzaG93IHRoZSAiTm90IHNldCIgYW5kIGhpZGUgdGhlIGRlbGV0ZSBpY29uCisgICAgICAgICAqLworICAgICAgICBkZC5maW5kKCIubXV0ZWQiKS5zaG93KCk7CisgICAgICAgIGRkLmZpbmQoIi5kZWxldGUtY3VycmVudC12YWx1ZSIpLmhpZGUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBXZSdyZSBub3Qgdmlld2luZyBhbiBlZGl0YWJsZSBsYXllciBzbyBoaWRlIHRoZSBlbXB0eSBkZC9kbCBwYWlyICovCisgICAgICAgICAgJCh0aGlzKS5oaWRlKCk7CisgICAgICAgICAgZGQuaGlkZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9KTsKKworICAvKiBIaWRlIHRoZSByaWdodCBjb2x1bW4gaWYgaXQgY29udGFpbnMgbm8gaW5mb3JtYXRpb24gKi8KKyAgaWYgKCQoImRsLml0ZW0taW5mbyIpLmNoaWxkcmVuKCc6dmlzaWJsZScpLmxlbmd0aCA9PT0gMCkgeworICAgICQoImRsLml0ZW0taW5mbyIpLnBhcmVudCgpLmhpZGUoKTsKKyAgfQorCisgIC8qIENsZWFyIHRoZSBjdXJyZW50IHNlYXJjaCBzZWxlY3Rpb24gYW5kIHJlbG9hZCB0aGUgcmVzdWx0cyAqLworICAkKCIudGFyZ2V0LXNlYXJjaC1jbGVhciIpLmNsaWNrKGZ1bmN0aW9uKCl7CisgICAgJCgiI3RhcmdldC1zZWFyY2giKS52YWwoIiIpOworICAgICQodGhpcykucGFyZW50cygiZm9ybSIpLnN1Ym1pdCgpOworICB9KTsKKworICAkKCIubWFjaGluZS1zZWFyY2gtY2xlYXIiKS5jbGljayhmdW5jdGlvbigpeworICAgICQoIiNtYWNoaW5lLXNlYXJjaCIpLnZhbCgiIik7CisgICAgJCh0aGlzKS5wYXJlbnRzKCJmb3JtIikuc3VibWl0KCk7CisgIH0pOworCisKKyAgbGF5ZXJEZXBzTGlzdC5maW5kKCIuaWNvbi10cmFzaCIpLmNsaWNrKGxheWVyRGVwUmVtb3ZlQ2xpY2spOworICBsYXllckRlcHNMaXN0LmZpbmQoImEiKS50b29sdGlwKCk7CisgICQoIi5pY29uLXRyYXNoIikudG9vbHRpcCgpOworICAkKCIuY29tbWl0IikudG9vbHRpcCgpOworCit9CmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2pzL2xpYnRvYXN0ZXIuanMgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2pzL2xpYnRvYXN0ZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA0ZjdhYgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvanMvbGlidG9hc3Rlci5qcwpAQCAtMCwwICsxLDU3NCBAQAorInVzZSBzdHJpY3QiOworLyogQWxsIHNoYXJlZCBmdW5jdGlvbmFsaXR5IHRvIGdvIGluIGxpYnRvYXN0ZXIgb2JqZWN0LgorICogVGhpcyBvYmplY3QgcmVhbGx5IGp1c3QgaGVscHMgcmVhZGFiaWxpdHkgc2luY2Ugd2UgY2FuIHRoZW4gaGF2ZQorICogYSB0cmFjZWFibGUgbmFtZXNwYWNlLgorICovCit2YXIgbGlidG9hc3RlciA9IChmdW5jdGlvbiAoKXsKKworICAvKiBtYWtlVHlwZWFoZWFkIHBhcmFtZXRlcnMKKyAgICogZWxlbWVudFNlbGVjdG9yOiBKUXVlcnkgZWxlbWVudFNlbGVjdG9yIHN0cmluZworICAgKiB4aHJVcmw6IHRoZSB1cmwgdG8gZ2V0IHRoZSBKU09OIGZyb20gZXhwZWN0cyBKU09OIGluIHRoZSBmb3JtOgorICAgKiAgeyAibGlzdCI6IFsgeyAibmFtZSI6ICJ0ZXN0IiwgImRldGFpbCIgOiAiYSB0ZXN0IHRoaW5nIiAgfSwgLi4uLiBdIH0KKyAgICogeGhyUGFyYW1zOiB0aGUgZGF0YS9wYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIGdldEpTT04gdXJsIGUuZy4KKyAgICogIHsgJ3R5cGUnIDogJ3Byb2plY3RzJyB9IHRoZSB0ZXh0IHR5cGVkIHdpbGwgYmUgcGFzc2VkIGFzICdzZWFyY2gnLgorICAgKiAgc2VsZWN0ZWRDQjogZnVuY3Rpb24gdG8gY2FsbCBvbmNlIGFuIGl0ZW0gaGFzIGJlZW4gc2VsZWN0ZWQgb25lCisgICAqICBhcmcgb2YgdGhlIGl0ZW0uCisgICAqLworICBmdW5jdGlvbiBfbWFrZVR5cGVhaGVhZCAoalFFbGVtZW50LCB4aHJVcmwsIHhoclBhcmFtcywgc2VsZWN0ZWRDQikgeworICAgIGlmICgheGhyVXJsIHx8IHhoclVybC5sZW5ndGggPT09IDApCisgICAgICB0aHJvdygiTm8gdXJsIHRvIHR5cGVhaGVhZCBzdXBwbGllZCIpOworCisgICAgdmFyIHhoclJlcTsKKworICAgIGpRRWxlbWVudC50eXBlYWhlYWQoeworICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uKHF1ZXJ5LCBwcm9jZXNzKXsKKyAgICAgICAgICB4aHJQYXJhbXMuc2VhcmNoID0gcXVlcnk7CisKKyAgICAgICAgICAvKiBJZiB3ZSBoYXZlIGEgcmVxdWVzdCBpbiBwcm9ncmVzcyBkb24ndCBmaXJlIG9mZiBhbm90aGVyIG9uZSovCisgICAgICAgICAgaWYgKHhoclJlcSkKKyAgICAgICAgICAgIHhoclJlcS5hYm9ydCgpOworCisgICAgICAgICAgeGhyUmVxID0gJC5nZXRKU09OKHhoclVybCwgdGhpcy5vcHRpb25zLnhoclBhcmFtcywgZnVuY3Rpb24oZGF0YSl7CisgICAgICAgICAgICBpZiAoZGF0YS5lcnJvciAhPT0gIm9rIikgeworICAgICAgICAgICAgICBjb25zb2xlLmxvZygiRXJyb3IgZ2V0dGluZyBkYXRhIGZyb20gc2VydmVyICIrZGF0YS5lcnJvcik7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgeGhyUmVxID0gbnVsbDsKKworICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3MoZGF0YS5yZXN1bHRzKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfSwKKyAgICAgICAgdXBkYXRlcjogZnVuY3Rpb24oaXRlbSkgeworICAgICAgICAgIHZhciBpdGVtT2JqID0gdGhpcy4kbWVudS5maW5kKCcuYWN0aXZlJykuZGF0YSgnaXRlbU9iamVjdCcpOworICAgICAgICAgIHNlbGVjdGVkQ0IoaXRlbU9iaik7CisgICAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgICAgIH0sCisgICAgICAgIG1hdGNoZXI6IGZ1bmN0aW9uKGl0ZW0pIHsKKyAgICAgICAgICBpZiAoIWl0ZW0uaGFzT3duUHJvcGVydHkoJ25hbWUnKSkgeworICAgICAgICAgICAgY29uc29sZS5sb2coIk5hbWUgcHJvcGVydHkgbWlzc2luZyBpbiBkYXRhIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAodGhpcy4kZWxlbWVudC52YWwoKS5sZW5ndGggPT09IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9LAorICAgICAgICBoaWdobGlnaHRlcjogZnVuY3Rpb24gKGl0ZW0pIHsKKyAgICAgICAgICAvKiBVc2UganF1ZXJ5IHRvIGVzY2FwZSB0aGUgaXRlbSBuYW1lIGFuZCBkZXRhaWwgKi8KKyAgICAgICAgICB2YXIgY3VycmVudCA9ICQoIjxzcGFuPjwvc3Bhbj4iKS50ZXh0KGl0ZW0ubmFtZSArICcgJytpdGVtLmRldGFpbCk7CisgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuaHRtbCgpOworCisgICAgICAgICAgdmFyIHF1ZXJ5ID0gdGhpcy5xdWVyeS5yZXBsYWNlKC9bXC1cW1xde30oKSorPy4sXFxcXiR8I1xzXS9nLCAnXFwkJicpCisgICAgICAgICAgcmV0dXJuIGN1cnJlbnQucmVwbGFjZShuZXcgUmVnRXhwKCcoJyArIHF1ZXJ5ICsgJyknLCAnaWcnKSwgZnVuY3Rpb24gKCQxLCBtYXRjaCkgeworICAgICAgICAgICAgcmV0dXJuICc8c3Ryb25nPicgKyBtYXRjaCArICc8L3N0cm9uZz4nCisgICAgICAgICAgfSkKKyAgICAgICAgfSwKKyAgICAgICAgc29ydGVyOiBmdW5jdGlvbiAoaXRlbXMpIHsgcmV0dXJuIGl0ZW1zOyB9LAorICAgICAgICB4aHJVcmw6IHhoclVybCwKKyAgICAgICAgeGhyUGFyYW1zOiB4aHJQYXJhbXMsCisgICAgICAgIHhoclJlcTogeGhyUmVxLAorICAgIH0pOworCisKKyAgICAvKiBDb3B5IG9mIGJvb3RzdHJhcCdzIHJlbmRlciBmdW5jIGJ1dCBzZXRzIHNlbGVjdGVkT2JqZWN0IHZhbHVlICovCisgICAgZnVuY3Rpb24gY3VzdG9tUmVuZGVyRnVuYyAoaXRlbXMpIHsKKyAgICAgIHZhciB0aGF0ID0gdGhpczsKKworICAgICAgaXRlbXMgPSAkKGl0ZW1zKS5tYXAoZnVuY3Rpb24gKGksIGl0ZW0pIHsKKyAgICAgICAgaSA9ICQodGhhdC5vcHRpb25zLml0ZW0pLmF0dHIoJ2RhdGEtdmFsdWUnLCBpdGVtLm5hbWUpLmRhdGEoJ2l0ZW1PYmplY3QnLCBpdGVtKTsKKyAgICAgICAgaS5maW5kKCdhJykuaHRtbCh0aGF0LmhpZ2hsaWdodGVyKGl0ZW0pKTsKKyAgICAgICAgcmV0dXJuIGlbMF07CisgICAgICB9KTsKKworICAgICAgaXRlbXMuZmlyc3QoKS5hZGRDbGFzcygnYWN0aXZlJyk7CisgICAgICB0aGlzLiRtZW51Lmh0bWwoaXRlbXMpOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgalFFbGVtZW50LmRhdGEoJ3R5cGVhaGVhZCcpLnJlbmRlciA9IGN1c3RvbVJlbmRlckZ1bmM7CisgIH0KKworICAvKgorICAgKiB1cmwgLSB0aGUgdXJsIG9mIHRoZSB4aHIgYnVpbGQgKi8KKyAgZnVuY3Rpb24gX3N0YXJ0QUJ1aWxkICh1cmwsIHByb2plY3RfaWQsIHRhcmdldHMsIG9uc3VjY2Vzcywgb25mYWlsKSB7CisKKyAgICB2YXIgZGF0YSA9IHsKKyAgICAgIHByb2plY3RfaWQgOiBwcm9qZWN0X2lkLAorICAgICAgdGFyZ2V0cyA6IHRhcmdldHMsCisgICAgfQorCisgICAgJC5hamF4KCB7CisgICAgICAgIHR5cGU6ICJQT1NUIiwKKyAgICAgICAgdXJsOiB1cmwsCisgICAgICAgIGRhdGE6IGRhdGEsCisgICAgICAgIGhlYWRlcnM6IHsgJ1gtQ1NSRlRva2VuJyA6ICQuY29va2llKCdjc3JmdG9rZW4nKX0sCisgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChfZGF0YSkgeworICAgICAgICAgIC8qIE5vIHByb3BlciByZXBvbnNlIFlPQ1RPICM3OTk1CisgICAgICAgICAgaWYgKF9kYXRhLmVycm9yICE9PSAib2siKSB7CisgICAgICAgICAgICBjb25zb2xlLndhcm4oX2RhdGEuZXJyb3IpOworICAgICAgICAgIH0gZWxzZSB7ICovCisgICAgICAgICAgICBpZiAob25zdWNjZXNzICE9PSB1bmRlZmluZWQpIG9uc3VjY2VzcyhfZGF0YSk7CisgICAgICAgIC8vICB9CisgICAgICAgIH0sCisgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoX2RhdGEpIHsKKyAgICAgICAgICBjb25zb2xlLndhcm4oIkNhbGwgZmFpbGVkIik7CisgICAgICAgICAgY29uc29sZS53YXJuKF9kYXRhKTsKKyAgICAgICAgICBpZiAob25mYWlsKSBvbmZhaWwoZGF0YSk7CisgICAgfSB9KTsKKyAgfQorCisgIC8qIGNhbmNlbEFCdWlsZDoKKyAgICogdXJsOiBwcm9qZWN0YnVpbGRzCisgICAqIGJ1aWxkc19pZHM6IHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGJ1aWxkIHJlcXVlc3QgaWRzCisgICAqIG9uc3VjY2VzczogY2FsbGJhY2sgZm9yIHN1Y2Nlc3NmdWwgZXhlY3V0aW9uCisgICAqIG9uZmFpbDogY2FsbGJhY2sgZm9yIGZhaWxlZCBleGVjdXRpb24KKyAgICovCisgIGZ1bmN0aW9uIF9jYW5jZWxBQnVpbGQodXJsLCBidWlsZF9pZHMsIG9uc3VjY2Vzcywgb25mYWlsKXsKKyAgICAkLmFqYXgoIHsKKyAgICAgICAgdHlwZTogIlBPU1QiLAorICAgICAgICB1cmw6IHVybCwKKyAgICAgICAgZGF0YTogeyAnYnVpbGRDYW5jZWwnOiBidWlsZF9pZHMgfSwKKyAgICAgICAgaGVhZGVyczogeyAnWC1DU1JGVG9rZW4nIDogJC5jb29raWUoJ2NzcmZ0b2tlbicpfSwKKyAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKF9kYXRhKSB7CisgICAgICAgICAgaWYgKF9kYXRhLmVycm9yICE9PSAib2siKSB7CisgICAgICAgICAgICBjb25zb2xlLndhcm4oX2RhdGEuZXJyb3IpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAob25zdWNjZXNzICE9PSB1bmRlZmluZWQpIG9uc3VjY2VzcyhfZGF0YSk7CisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBlcnJvcjogZnVuY3Rpb24gKF9kYXRhKSB7CisgICAgICAgICAgY29uc29sZS53YXJuKCJDYWxsIGZhaWxlZCIpOworICAgICAgICAgIGNvbnNvbGUud2FybihfZGF0YSk7CisgICAgICAgICAgaWYgKG9uZmFpbCkgb25mYWlsKF9kYXRhKTsKKyAgICAgICAgfQorICAgIH0pOworICB9CisKKyAgLyogR2V0IGEgcHJvamVjdCdzIGNvbmZpZ3VyYXRpb24gaW5mbyAqLworICBmdW5jdGlvbiBfZ2V0UHJvamVjdEluZm8odXJsLCBvbnN1Y2Nlc3MsIG9uZmFpbCl7CisgICAgJC5hamF4KHsKKyAgICAgICAgdHlwZTogIkdFVCIsCisgICAgICAgIGRhdGEgOiB7IGZvcm1hdDogImpzb24iIH0sCisgICAgICAgIHVybDogdXJsLAorICAgICAgICBoZWFkZXJzOiB7ICdYLUNTUkZUb2tlbicgOiAkLmNvb2tpZSgnY3NyZnRva2VuJyl9LAorICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoX2RhdGEpIHsKKyAgICAgICAgICBpZiAoX2RhdGEuZXJyb3IgIT09ICJvayIpIHsKKyAgICAgICAgICAgIGNvbnNvbGUud2FybihfZGF0YS5lcnJvcik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChvbnN1Y2Nlc3MgIT09IHVuZGVmaW5lZCkgb25zdWNjZXNzKF9kYXRhKTsKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoX2RhdGEpIHsKKyAgICAgICAgICBjb25zb2xlLndhcm4oX2RhdGEpOworICAgICAgICAgIGlmIChvbmZhaWwpIG9uZmFpbChfZGF0YSk7CisgICAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIC8qIFByb3BlcnRpZXMgZm9yIGRhdGEgY2FuIGJlOgorICAgKiBsYXllckRlbCAoY3N2KQorICAgKiBsYXllckFkZCAoY3N2KQorICAgKiBwcm9qZWN0TmFtZQorICAgKiBwcm9qZWN0VmVyc2lvbgorICAgKiBtYWNoaW5lTmFtZQorICAgKi8KKyAgZnVuY3Rpb24gX2VkaXRDdXJyZW50UHJvamVjdChkYXRhLCBvblN1Y2Nlc3MsIG9uRmFpbCl7CisgICAgJC5hamF4KHsKKyAgICAgICAgdHlwZTogIlBPU1QiLAorICAgICAgICB1cmw6IGxpYnRvYXN0ZXIuY3R4LnByb2plY3RQYWdlVXJsICsgIj9mb3JtYXQ9anNvbiIsCisgICAgICAgIGRhdGE6IGRhdGEsCisgICAgICAgIGhlYWRlcnM6IHsgJ1gtQ1NSRlRva2VuJyA6ICQuY29va2llKCdjc3JmdG9rZW4nKX0sCisgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChkYXRhKSB7CisgICAgICAgICAgaWYgKGRhdGEuZXJyb3IgIT0gIm9rIikgeworICAgICAgICAgICAgY29uc29sZS5sb2coZGF0YS5lcnJvcik7CisgICAgICAgICAgICBpZiAob25GYWlsICE9PSB1bmRlZmluZWQpCisgICAgICAgICAgICAgIG9uRmFpbChkYXRhKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG9uU3VjY2VzcyAhPT0gdW5kZWZpbmVkKQorICAgICAgICAgICAgICBvblN1Y2Nlc3MoZGF0YSk7CisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBlcnJvcjogZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgICAgICBjb25zb2xlLmxvZygiQ2FsbCBmYWlsZWQiKTsKKyAgICAgICAgICBjb25zb2xlLmxvZyhkYXRhKTsKKyAgICAgICAgfQorICAgIH0pOworICB9CisKKyAgZnVuY3Rpb24gX2dldExheWVyRGVwc0ZvclByb2plY3QodXJsLCBvblN1Y2Nlc3MsIG9uRmFpbCl7CisgICAgLyogQ2hlY2sgZm9yIGRlcGVuZGVuY2llcyBub3QgaW4gdGhlIGN1cnJlbnQgcHJvamVjdCAqLworICAgICQuZ2V0SlNPTih1cmwsCisgICAgICB7IGZvcm1hdDogJ2pzb24nIH0sCisgICAgICBmdW5jdGlvbihkYXRhKSB7CisgICAgICAgIGlmIChkYXRhLmVycm9yICE9ICJvayIpIHsKKyAgICAgICAgICBjb25zb2xlLmxvZyhkYXRhLmVycm9yKTsKKyAgICAgICAgICBpZiAob25GYWlsICE9PSB1bmRlZmluZWQpCisgICAgICAgICAgICBvbkZhaWwoZGF0YSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdmFyIGRlcHMgPSB7fTsKKyAgICAgICAgICAvKiBGaWx0ZXIgb3V0IGxheWVyIGRlcCBpZHMgd2hpY2ggYXJlIGluIHRoZQorICAgICAgICAgICAqIHByb2plY3QgYWxyZWFkeS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBkZXBzLmxpc3QgPSBkYXRhLmxheWVyZGVwcy5saXN0LmZpbHRlcihmdW5jdGlvbihsYXllck9iail7CisgICAgICAgICAgICByZXR1cm4gKGRhdGEucHJvamVjdGxheWVycy5sYXN0SW5kZXhPZihsYXllck9iai5pZCkgPCAwKTsKKyAgICAgICAgICB9KTsKKworICAgICAgICAgIG9uU3VjY2VzcyhkZXBzKTsKKyAgICAgICAgfQorICAgICAgfSwgZnVuY3Rpb24oKSB7CisgICAgICAgIGNvbnNvbGUubG9nKCJFOiBGYWlsZWQgdG8gbWFrZSByZXF1ZXN0Iik7CisgICAgfSk7CisgIH0KKworICAvKiBwYXJzZXMgdGhlIHF1ZXJ5IHN0cmluZyBvZiB0aGUgY3VycmVudCB3aW5kb3cubG9jYXRpb24gdG8gYW4gb2JqZWN0ICovCisgIGZ1bmN0aW9uIF9wYXJzZVVybFBhcmFtcygpIHsKKyAgICB2YXIgc3RyaW5nID0gd2luZG93LmxvY2F0aW9uLnNlYXJjaDsKKyAgICBzdHJpbmcgPSBzdHJpbmcuc3Vic3RyKDEpOworICAgIHZhciBzdHJpbmdBcnJheSA9IHN0cmluZy5zcGxpdCAoIiYiKTsKKyAgICB2YXIgb2JqID0ge307CisKKyAgICBmb3IgKHZhciBpIGluIHN0cmluZ0FycmF5KSB7CisgICAgICB2YXIga2V5VmFsID0gc3RyaW5nQXJyYXlbaV0uc3BsaXQgKCI9Iik7CisgICAgICBvYmpba2V5VmFsWzBdXSA9IGtleVZhbFsxXTsKKyAgICB9CisKKyAgICByZXR1cm4gb2JqOworICB9CisKKyAgLyogdGFrZXMgYSBmbGF0IG9iamVjdCBhbmQgb3V0cHV0cyBpdCBhcyBhIHF1ZXJ5IHN0cmluZworICAgKiBlLmcuIHRoZSBvdXRwdXQgb2YgZHVtcHNVcmxQYXJhbXMKKyAgICovCisgIGZ1bmN0aW9uIF9kdW1wc1VybFBhcmFtcyhvYmopIHsKKyAgICB2YXIgc3RyID0gIj8iOworCisgICAgZm9yICh2YXIga2V5IGluIG9iail7CisgICAgICBpZiAoIW9ialtrZXldKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgc3RyICs9IGtleSsgIj0iK29ialtrZXldLnRvU3RyaW5nKCk7CisgICAgICBzdHIgKz0gIiYiOworICAgIH0KKworICAgIC8qIE1haW50YWluIHRoZSBjdXJyZW50IGhhc2ggKi8KKyAgICBzdHIgKz0gd2luZG93LmxvY2F0aW9uLmhhc2g7CisKKyAgICByZXR1cm4gc3RyOworICB9CisKKyAgZnVuY3Rpb24gX2FkZFJtTGF5ZXIobGF5ZXJPYmosIGFkZCwgZG9uZUNiKXsKKyAgICBpZiAoYWRkID09PSB0cnVlKSB7CisgICAgICAvKiBJZiBhZGRpbmcgZ2V0IHRoZSBkZXBzIGZvciB0aGlzIGxheWVyICovCisgICAgICBsaWJ0b2FzdGVyLmdldExheWVyRGVwc0ZvclByb2plY3QobGF5ZXJPYmoubGF5ZXJkZXRhaWx1cmwsCisgICAgICAgIGZ1bmN0aW9uIChsYXllcnMpIHsKKworICAgICAgICAvKiBnb3QgcmVzdWx0IGZvciBkZXBlbmRlbmNpZXMgKi8KKyAgICAgICAgaWYgKGxheWVycy5saXN0Lmxlbmd0aCA9PT0gMCl7CisgICAgICAgICAgdmFyIGVkaXREYXRhID0geyBsYXllckFkZCA6IGxheWVyT2JqLmlkIH07CisgICAgICAgICAgbGlidG9hc3Rlci5lZGl0Q3VycmVudFByb2plY3QoZWRpdERhdGEsIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgZG9uZUNiKFtdKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNob3dMYXllckRlcHNNb2RhbChsYXllck9iaiwgbGF5ZXJzLmxpc3QsIG51bGwsIG51bGwsICB0cnVlLCBkb25lQ2IpOworICAgICAgICAgIH0gIGNhdGNoIChlKSB7CisgICAgICAgICAgICAkLmdldFNjcmlwdChsaWJ0b2FzdGVyLmN0eC5qc1VybCArICJsYXllckRlcHNNb2RhbC5qcyIsIGZ1bmN0aW9uKCl7CisgICAgICAgICAgICAgIHNob3dMYXllckRlcHNNb2RhbChsYXllck9iaiwgbGF5ZXJzLmxpc3QsIG51bGwsIG51bGwsICB0cnVlLCBkb25lQ2IpOworICAgICAgICAgICAgfSwgZnVuY3Rpb24oKXsKKyAgICAgICAgICAgICAgY29uc29sZS53YXJuKCJGYWlsZWQgdG8gbG9hZCBsYXllckRlcHNNb2RhbCIpOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9LCBudWxsKTsKKyAgICB9IGVsc2UgaWYgKGFkZCA9PT0gZmFsc2UpIHsKKyAgICAgIHZhciBlZGl0RGF0YSA9IHsgbGF5ZXJEZWwgOiBsYXllck9iai5pZCB9OworCisgICAgICBsaWJ0b2FzdGVyLmVkaXRDdXJyZW50UHJvamVjdChlZGl0RGF0YSwgZnVuY3Rpb24gKCkgeworICAgICAgICBkb25lQ2IoW10pOworICAgICAgfSwgZnVuY3Rpb24gKCkgeworICAgICAgICBjb25zb2xlLndhcm4gKCJSZW1vdmluZyBsYXllciBmcm9tIHByb2plY3QgZmFpbGVkIik7CisgICAgICAgIGRvbmVDYihudWxsKTsKKyAgICAgIH0pOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIF9tYWtlTGF5ZXJBZGRSbUFsZXJ0TXNnKGxheWVyLCBsYXllckRlcHNMaXN0LCBhZGQpIHsKKyAgICB2YXIgYWxlcnRNc2c7CisKKyAgICBpZiAobGF5ZXJEZXBzTGlzdC5sZW5ndGggPiAwICYmIGFkZCA9PT0gdHJ1ZSkgeworICAgICAgYWxlcnRNc2cgPSAkKCI8c3Bhbj5Zb3UgaGF2ZSBhZGRlZCA8c3Ryb25nPiIrKGxheWVyRGVwc0xpc3QubGVuZ3RoKzEpKyI8L3N0cm9uZz4gbGF5ZXJzIHRvIHlvdXIgcHJvamVjdDogPGEgaWQ9XCJsYXllci1hZmZlY3RlZC1uYW1lXCI+PC9hPiBhbmQgaXRzIGRlcGVuZGVuY2llcyA8L3NwYW4+Iik7CisKKyAgICAgIC8qIEJ1aWxkIHRoZSBsYXllciBkZXBzIGxpc3QgKi8KKyAgICAgIGxheWVyRGVwc0xpc3QubWFwKGZ1bmN0aW9uKGxheWVyLCBpKXsKKyAgICAgICAgdmFyIGxpbmsgPSAkKCI8YT48L2E+Iik7CisKKyAgICAgICAgbGluay5hdHRyKCJocmVmIiwgbGF5ZXIubGF5ZXJkZXRhaWx1cmwpOworICAgICAgICBsaW5rLnRleHQobGF5ZXIubmFtZSk7CisgICAgICAgIGxpbmsudG9vbHRpcCh7dGl0bGU6IGxheWVyLnRvb2x0aXB9KTsKKworICAgICAgICBpZiAoaSAhPT0gMCkKKyAgICAgICAgICBhbGVydE1zZy5hcHBlbmQoIiwgIik7CisKKyAgICAgICAgYWxlcnRNc2cuYXBwZW5kKGxpbmspOworICAgICAgfSk7CisgICAgfSBlbHNlIGlmIChsYXllckRlcHNMaXN0Lmxlbmd0aCA9PT0gMCAmJiBhZGQgPT09IHRydWUpIHsKKyAgICAgIGFsZXJ0TXNnID0gJCgiPHNwYW4+WW91IGhhdmUgYWRkZWQgPHN0cm9uZz4xPC9zdHJvbmc+IGxheWVyIHRvIHlvdXIgcHJvamVjdDogPGEgaWQ9XCJsYXllci1hZmZlY3RlZC1uYW1lXCI+PC9hPjwvc3Bhbj48L3NwYW4+Iik7CisgICAgfSBlbHNlIGlmIChhZGQgPT09IGZhbHNlKSB7CisgICAgICBhbGVydE1zZyA9ICQoIjxzcGFuPllvdSBoYXZlIGRlbGV0ZWQgPHN0cm9uZz4xPC9zdHJvbmc+IGxheWVyIGZyb20geW91ciBwcm9qZWN0OiA8YSBpZD1cImxheWVyLWFmZmVjdGVkLW5hbWVcIj48L2E+PC9zcGFuPiIpOworICAgIH0KKworICAgIGFsZXJ0TXNnLmNoaWxkcmVuKCIjbGF5ZXItYWZmZWN0ZWQtbmFtZSIpLnRleHQobGF5ZXIubmFtZSk7CisgICAgYWxlcnRNc2cuY2hpbGRyZW4oIiNsYXllci1hZmZlY3RlZC1uYW1lIikuYXR0cigiaHJlZiIsIGxheWVyLmxheWVyZGV0YWlsdXJsKTsKKworICAgIHJldHVybiBhbGVydE1zZy5odG1sKCk7CisgIH0KKworICBmdW5jdGlvbiBfc2hvd0NoYW5nZU5vdGlmaWNhdGlvbihtZXNzYWdlKXsKKyAgICB2YXIgYWxlcnRNc2cgPSAkKCIjY2hhbmdlLW5vdGlmaWNhdGlvbi1tc2ciKTsKKworICAgIGFsZXJ0TXNnLmh0bWwobWVzc2FnZSk7CisgICAgJCgiI2NoYW5nZS1ub3RpZmljYXRpb24sICNjaGFuZ2Utbm90aWZpY2F0aW9uICoiKS5mYWRlSW4oKTsKKyAgfQorCisKKyAgcmV0dXJuIHsKKyAgICByZWxvYWRfcGFyYW1zIDogcmVsb2FkX3BhcmFtcywKKyAgICBzdGFydEFCdWlsZCA6IF9zdGFydEFCdWlsZCwKKyAgICBjYW5jZWxBQnVpbGQgOiBfY2FuY2VsQUJ1aWxkLAorICAgIG1ha2VUeXBlYWhlYWQgOiBfbWFrZVR5cGVhaGVhZCwKKyAgICBnZXRQcm9qZWN0SW5mbzogX2dldFByb2plY3RJbmZvLAorICAgIGdldExheWVyRGVwc0ZvclByb2plY3QgOiBfZ2V0TGF5ZXJEZXBzRm9yUHJvamVjdCwKKyAgICBlZGl0Q3VycmVudFByb2plY3QgOiBfZWRpdEN1cnJlbnRQcm9qZWN0LAorICAgIGRlYnVnOiBmYWxzZSwKKyAgICBwYXJzZVVybFBhcmFtcyA6IF9wYXJzZVVybFBhcmFtcywKKyAgICBkdW1wc1VybFBhcmFtcyA6IF9kdW1wc1VybFBhcmFtcywKKyAgICBhZGRSbUxheWVyIDogX2FkZFJtTGF5ZXIsCisgICAgbWFrZUxheWVyQWRkUm1BbGVydE1zZyA6IF9tYWtlTGF5ZXJBZGRSbUFsZXJ0TXNnLAorICAgIHNob3dDaGFuZ2VOb3RpZmljYXRpb24gOiBfc2hvd0NoYW5nZU5vdGlmaWNhdGlvbiwKKyAgfTsKK30pKCk7CisKKy8qIGtlZXAgdGhpcyBpbiB0aGUgZ2xvYmFsIHNjb3BlIGZvciBjb21wYXRhYmlsaXR5ICovCitmdW5jdGlvbiByZWxvYWRfcGFyYW1zKHBhcmFtcykgeworICAgIHZhciB1cmkgPSB3aW5kb3cubG9jYXRpb24uaHJlZjsKKyAgICB2YXIgc3BsaXRsaXN0ID0gdXJpLnNwbGl0KCI/Iik7CisgICAgdmFyIHVybCA9IHNwbGl0bGlzdFswXTsKKyAgICB2YXIgcGFyYW1ldGVycyA9IHNwbGl0bGlzdFsxXTsKKyAgICAvLyBkZXNlcmlhbGl6ZSB0aGUgY2FsbCBwYXJhbWV0ZXJzCisgICAgdmFyIGNwYXJhbXMgPSBbXTsKKyAgICBpZihwYXJhbWV0ZXJzKQorICAgICAgY3BhcmFtcyA9IHBhcmFtZXRlcnMuc3BsaXQoIiYiKTsKKworICAgIHZhciBucGFyYW1zID0ge307CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjcGFyYW1zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIHZhciB0ZW1wID0gY3BhcmFtc1tpXS5zcGxpdCgiPSIpOworICAgICAgICBucGFyYW1zW3RlbXBbMF1dID0gdGVtcFsxXTsKKyAgICB9CisgICAgLy8gdXBkYXRlIHBhcmFtZXRlciB2YWx1ZXMKKyAgICBmb3IgKGkgaW4gcGFyYW1zKSB7CisgICAgICAgIG5wYXJhbXNbZW5jb2RlVVJJQ29tcG9uZW50KGkpXSA9IGVuY29kZVVSSUNvbXBvbmVudChwYXJhbXNbaV0pOworICAgIH0KKyAgICAvLyBzZXJpYWxpemUgdGhlIHN0cnVjdHVyZQorICAgIHZhciBjYWxscGFyYW1zID0gW107CisgICAgZm9yIChpIGluIG5wYXJhbXMpIHsKKyAgICAgICAgY2FsbHBhcmFtcy5wdXNoKGkrIj0iK25wYXJhbXNbaV0pOworICAgIH0KKyAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVybCsiPyIrY2FsbHBhcmFtcy5qb2luKCcmJyk7Cit9CisKKworLyogVGhpbmdzIHRoYXQgaGFwcGVuIGZvciBhbGwgcGFnZXMgKi8KKyQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgeworCisgIHZhciBhamF4TG9hZGluZ1RpbWVyOworCisgIC8qIElmIHdlIGRvbid0IGhhdmUgYSBjb25zb2xlIG9iamVjdCB3aGljaCBtaWdodCBiZSB0aGUgY2FzZSBpbiBzb21lCisgICAgICogYnJvd3NlcnMsIG5vLW9wIGl0IHRvIGF2b2lkIHVuZGVmaW5lZCBlcnJvcnMuCisgICAgICovCisgICAgaWYgKCF3aW5kb3cuY29uc29sZSkgeworICAgICAgd2luZG93LmNvbnNvbGUgPSB7fTsKKyAgICAgIHdpbmRvdy5jb25zb2xlLndhcm4gPSBmdW5jdGlvbigpIHt9OworICAgICAgd2luZG93LmNvbnNvbGUuZXJyb3IgPSBmdW5jdGlvbigpIHt9OworICAgIH0KKworICAgIC8qCisgICAgICogUHJldHR5UHJpbnQgcGx1Z2luLgorICAgICAqCisgICAgICovCisgICAgLy8gSW5pdAorICAgIHByZXR0eVByaW50KCk7CisKKyAgICAvLyBQcmV2ZW50IGludmFsaWQgbGlua3MgZnJvbSBqdW1waW5nIHBhZ2Ugc2Nyb2xsCisgICAgJCgnYVtocmVmPSNdJykuY2xpY2soZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9KTsKKworCisgICAgLyogU1RBUlQgVE9ETyBEZWxldGUgdGhpcyBzZWN0aW9uIG5vdyByZWR1bmRhbnQgKi8KKyAgICAvKiBCZWxlbidzIGFkZGl0aW9ucyAqLworCisgICAgLy8gdHVybiBFZGl0IGNvbHVtbnMgZHJvcGRvd24gaW50byBhIG11bHRpc2VsZWN0IG1lbnUKKyAgICAkKCcuZHJvcGRvd24tbWVudSBpbnB1dCwgLmRyb3Bkb3duLW1lbnUgbGFiZWwnKS5jbGljayhmdW5jdGlvbihlKSB7CisgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CisgICAgfSk7CisKKyAgICAvLyBlbmFibGUgcG9wb3ZlcnMgaW4gYW55IHRhYmxlIGNlbGxzIHRoYXQgY29udGFpbiBhbiBhbmNob3Igd2l0aCB0aGUKKyAgICAvLyAuYnRuIGNsYXNzIGFwcGxpZWQsIGFuZCBtYWtlIHN1cmUgcG9wb3ZlcnMgd29yayBvbiBjbGljaywgYXJlIG11dHVhbGx5CisgICAgLy8gZXhjbHVzaXZlIGFuZCB0aGV5IGNsb3NlIHdoZW4geW91ciBjbGljayBvdXRzaWRlIHRoZWlyIGFyZWEKKworICAgICQoJ2h0bWwnKS5jbGljayhmdW5jdGlvbigpeworICAgICAgICAkKCd0ZCA+IGEuYnRuJykucG9wb3ZlcignaGlkZScpOworICAgIH0pOworCisgICAgJCgndGQgPiBhLmJ0bicpLnBvcG92ZXIoeworICAgICAgICBodG1sOnRydWUsCisgICAgICAgIHBsYWNlbWVudDonbGVmdCcsCisgICAgICAgIGNvbnRhaW5lcjonYm9keScsCisgICAgICAgIHRyaWdnZXI6J21hbnVhbCcKKyAgICB9KS5jbGljayhmdW5jdGlvbihlKXsKKyAgICAgICAgJCgndGQgPiBhLmJ0bicpLm5vdCh0aGlzKS5wb3BvdmVyKCdoaWRlJyk7CisgICAgICAgIC8vIGlkZWFsbHkgd2Ugd291bGQgdXNlICd0b2dnbGUnIGhlcmUKKyAgICAgICAgLy8gYnV0IGl0IHNlZW1zIGJ1Z2d5IGluIG91ciBCb290c3RyYXAgdmVyc2lvbgorICAgICAgICAkKHRoaXMpLnBvcG92ZXIoJ3Nob3cnKTsKKyAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKKyAgICB9KTsKKworICAgIC8vIGVuYWJsZSB0b29sdGlwcyBmb3IgYXBwbGllZCBmaWx0ZXJzCisgICAgJCgndGggYS5idG4tcHJpbWFyeScpLnRvb2x0aXAoe2NvbnRhaW5lcjonYm9keScsIGh0bWw6dHJ1ZSwgcGxhY2VtZW50Oidib3R0b20nLCBkZWxheTp7aGlkZToxNTAwfX0pOworCisgICAgLy8gaGlkZSBhcHBsaWVkIGZpbHRlciB0b29sdGlwIHdoZW4geW91IGNsaWNrIG9uIHRoZSBmaWx0ZXIgYnV0dG9uCisgICAgJCgndGggYS5idG4tcHJpbWFyeScpLmNsaWNrKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgJCgnLnRvb2x0aXAnKS5oaWRlKCk7CisgICAgfSk7CisKKyAgICAvLyBlbmFibGUgaGVscCBpbmZvcm1hdGlvbiB0b29sdGlwCisgICAgJCgiLmdldC1oZWxwIikudG9vbHRpcCh7Y29udGFpbmVyOidib2R5JywgaHRtbDp0cnVlLCBkZWxheTp7c2hvdzozMDB9fSk7CisKKyAgICAvLyBzaG93IGhlbHAgYnViYmxlIG9ubHkgb24gaG92ZXIgaW5zaWRlIHRhYmxlcworICAgICQoIi5ob3Zlci1oZWxwIikuY3NzKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIik7CisgICAgJCgidGgsIHRkIikuaG92ZXIoZnVuY3Rpb24gKCkgeworICAgICAgICAkKHRoaXMpLmZpbmQoIi5ob3Zlci1oZWxwIikuY3NzKCJ2aXNpYmlsaXR5IiwidmlzaWJsZSIpOworICAgIH0pOworICAgICQoInRoLCB0ZCIpLm1vdXNlbGVhdmUoZnVuY3Rpb24gKCkgeworICAgICAgICAkKHRoaXMpLmZpbmQoIi5ob3Zlci1oZWxwIikuY3NzKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIik7CisgICAgfSk7CisKKyAgICAvKiBFTkQgVE9ETyBEZWxldGUgdGhpcyBzZWN0aW9uIG5vdyByZWR1bmRhbnQgKi8KKworICAgIC8vIHNob3cgdGFzayB0eXBlIGFuZCBvdXRjb21lIGluIHRhc2sgZGV0YWlscyBwYWdlcworICAgICQoIi50YXNrLWluZm8iKS50b29sdGlwKHsgY29udGFpbmVyOiAnYm9keScsIGh0bWw6IHRydWUsIGRlbGF5OiB7c2hvdzogMjAwfSwgcGxhY2VtZW50OiAncmlnaHQnIH0pOworCisgICAgLy8gaW5pdGlhbGlzZSB0aGUgdG9vbHRpcHMgZm9yIHRoZSBpY29uLXBlbmNpbCBpY29ucworICAgICQoIi5pY29uLXBlbmNpbCIpLnRvb2x0aXAoeyBjb250YWluZXI6ICdib2R5JywgaHRtbDogdHJ1ZSwgZGVsYXk6IHtzaG93OiA0MDB9LCB0aXRsZTogIkNoYW5nZSIgfSk7CisKKyAgICAvLyBpbml0aWFsaXNlIHRoZSB0b29sdGlwcyBmb3IgdGhlIGRvd25sb2FkIGljb25zCisgICAgJCgiLmljb24tZG93bmxvYWQtYWx0IikudG9vbHRpcCh7IGNvbnRhaW5lcjogJ2JvZHknLCBodG1sOiB0cnVlLCBkZWxheTogeyBzaG93OiAyMDAgfSB9KTsKKworICAgIC8vIGluaXRpYWxpc2UgcG9wb3ZlciBmb3IgZGVidWcgaW5mb3JtYXRpb24KKyAgICAkKCIuaWNvbi1pbmZvLXNpZ24iKS5wb3BvdmVyKCB7IHBsYWNlbWVudDogJ2JvdHRvbScsIGh0bWw6IHRydWUsIGNvbnRhaW5lcjogJ2JvZHknIH0pOworCisgICAgLy8gbGlua2luZyBkaXJlY3RseSB0byB0YWJzCisgICAgJChmdW5jdGlvbigpeworICAgICAgICAgIHZhciBoYXNoID0gd2luZG93LmxvY2F0aW9uLmhhc2g7CisgICAgICAgICAgJCgndWwubmF2IGFbaHJlZj0iJyArIGhhc2ggKyAnIl0nKS50YWIoJ3Nob3cnKTsKKworICAgICAgICAgICQoJy5uYXYtdGFicyBhJykuY2xpY2soZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgJCh0aGlzKS50YWIoJ3Nob3cnKTsKKyAgICAgICAgICAgICQoJ2JvZHknKS5zY3JvbGxUb3AoKTsKKyAgICAgICAgICB9KTsKKyAgICB9KTsKKworICAgIC8vIHRvZ2dsZSBmb3IgbG9uZyBjb250ZW50ICh2YXJpYWJsZXMsIHB5dGhvbiBzdGFjayB0cmFjZSwgZXRjKQorICAgICQoJy5mdWxsLCAuZnVsbC1oaWRlJykuaGlkZSgpOworICAgICQoJy5mdWxsLXNob3cnKS5jbGljayhmdW5jdGlvbigpeworICAgICAgICAkKCcuZnVsbCcpLnNsaWRlRG93bihmdW5jdGlvbigpeworICAgICAgICAgICAgJCgnLmZ1bGwtaGlkZScpLnNob3coKTsKKyAgICAgICAgfSk7CisgICAgICAgICQodGhpcykuaGlkZSgpOworICAgIH0pOworICAgICQoJy5mdWxsLWhpZGUnKS5jbGljayhmdW5jdGlvbigpeworICAgICAgICAkKHRoaXMpLmhpZGUoKTsKKyAgICAgICAgJCgnLmZ1bGwnKS5zbGlkZVVwKGZ1bmN0aW9uKCl7CisgICAgICAgICAgICAkKCcuZnVsbC1zaG93Jykuc2hvdygpOworICAgICAgICB9KTsKKyAgICB9KTsKKworICAgIC8vdG9nZ2xlIHRoZSBlcnJvcnMgYW5kIHdhcm5pbmdzIHNlY3Rpb25zCisgICAgJCgnLnNob3ctZXJyb3JzJykuY2xpY2soZnVuY3Rpb24oKSB7CisgICAgICAgICQoJyNjb2xsYXBzZS1lcnJvcnMnKS5hZGRDbGFzcygnaW4nKTsKKyAgICB9KTsKKyAgICAkKCcudG9nZ2xlLWVycm9ycycpLmNsaWNrKGZ1bmN0aW9uKCkgeworICAgICAgICAkKCcjY29sbGFwc2UtZXJyb3JzJykudG9nZ2xlQ2xhc3MoJ2luJyk7CisgICAgfSk7CisgICAgJCgnLnNob3ctd2FybmluZ3MnKS5jbGljayhmdW5jdGlvbigpIHsKKyAgICAgICAgJCgnI2NvbGxhcHNlLXdhcm5pbmdzJykuYWRkQ2xhc3MoJ2luJyk7CisgICAgfSk7CisgICAgJCgnLnRvZ2dsZS13YXJuaW5ncycpLmNsaWNrKGZ1bmN0aW9uKCkgeworICAgICAgICAkKCcjY29sbGFwc2Utd2FybmluZ3MnKS50b2dnbGVDbGFzcygnaW4nKTsKKyAgICB9KTsKKyAgICAkKCcuc2hvdy1leGNlcHRpb25zJykuY2xpY2soZnVuY3Rpb24oKSB7CisgICAgICAgICQoJyNjb2xsYXBzZS1leGNlcHRpb25zJykuYWRkQ2xhc3MoJ2luJyk7CisgICAgfSk7CisgICAgJCgnLnRvZ2dsZS1leGNlcHRpb25zJykuY2xpY2soZnVuY3Rpb24oKSB7CisgICAgICAgICQoJyNjb2xsYXBzZS1leGNlcHRpb25zJykudG9nZ2xlQ2xhc3MoJ2luJyk7CisgICAgfSk7CisKKworICAgICQoIiNoaWRlLWFsZXJ0IikuY2xpY2soZnVuY3Rpb24oKXsKKyAgICAgICQodGhpcykucGFyZW50KCkuZmFkZU91dCgpOworICAgIH0pOworCisgICAgLy9zaG93IHdhcm5pbmdzIHNlY3Rpb24gd2hlbiByZXF1ZXN0ZWQgZnJvbSB0aGUgcHJldmlvdXMgcGFnZQorICAgIGlmIChsb2NhdGlvbi5ocmVmLnNlYXJjaCgnI3dhcm5pbmdzJykgPiAtMSkgeworICAgICAgICAkKCcjY29sbGFwc2Utd2FybmluZ3MnKS5hZGRDbGFzcygnaW4nKTsKKyAgICB9CisKKyAgICAvKiBTaG93IHRoZSBsb2FkaW5nIG5vdGlmaWNhdGlvbiBpZiBub3RoaW5nIGhhcyBoYXBwZW5kIGFmdGVyIDEuNQorICAgICAqIHNlY29uZHMKKyAgICAgKi8KKyAgICAkKGRvY3VtZW50KS5iaW5kKCJhamF4U3RhcnQiLCBmdW5jdGlvbigpeworICAgICAgaWYgKGFqYXhMb2FkaW5nVGltZXIpCisgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoYWpheExvYWRpbmdUaW1lcik7CisKKyAgICAgIGFqYXhMb2FkaW5nVGltZXIgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsKKyAgICAgICAgJCgiI2xvYWRpbmctbm90aWZpY2F0aW9uIikuZmFkZUluKCk7CisgICAgICB9LCAxMjAwKTsKKyAgICB9KTsKKworICAgICQoZG9jdW1lbnQpLmJpbmQoImFqYXhTdG9wIiwgZnVuY3Rpb24oKXsKKyAgICAgIGlmIChhamF4TG9hZGluZ1RpbWVyKQorICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGFqYXhMb2FkaW5nVGltZXIpOworCisgICAgICAkKCIjbG9hZGluZy1ub3RpZmljYXRpb24iKS5mYWRlT3V0KCk7CisgICAgfSk7CisKKyAgICAkKGRvY3VtZW50KS5hamF4RXJyb3IoZnVuY3Rpb24oZXZlbnQsIGpxeGhyLCBzZXR0aW5ncywgZXJyTXNnKXsKKyAgICAgIGlmIChlcnJNc2cgPT09ICdhYm9ydCcpCisgICAgICAgIHJldHVybjsKKworICAgICAgY29uc29sZS53YXJuKCJQcm9ibGVtIHdpdGggeGhyIGNhbGwiKTsKKyAgICAgIGNvbnNvbGUud2FybihlcnJNc2cpOworICAgICAgY29uc29sZS53YXJuKGpxeGhyLnJlc3BvbnNlVGV4dCk7CisgICAgfSk7CisKKyAgICBmdW5jdGlvbiBjaGVja19mb3JfZHVwbGljYXRlX2lkcyAoKSB7CisgICAgICAvKiB3YXJuIGFib3V0IGR1cGxpY2F0ZSBlbGVtZW50IGlkcyAqLworICAgICAgdmFyIGlkcyA9IHt9OworICAgICAgJCgiW2lkXSIpLmVhY2goZnVuY3Rpb24oKSB7CisgICAgICAgIGlmICh0aGlzLmlkICYmIGlkc1t0aGlzLmlkXSkgeworICAgICAgICAgIGNvbnNvbGUud2FybignRHVwbGljYXRlIGVsZW1lbnQgaWQgIycrdGhpcy5pZCk7CisgICAgICAgIH0KKyAgICAgICAgaWRzW3RoaXMuaWRdID0gdHJ1ZTsKKyAgICAgIH0pOworICAgIH0KKworICAgIGlmIChsaWJ0b2FzdGVyLmRlYnVnKSB7CisgICAgICBjaGVja19mb3JfZHVwbGljYXRlX2lkcygpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBEZWJ1ZyBpcyBmYWxzZSBzbyBzdXByZXNzIHdhcm5pbmdzIGJ5IG92ZXJyaWRpbmcgdGhlIGZ1bmN0aW9ucyAqLworICAgICAgd2luZG93LmNvbnNvbGUud2FybiA9IGZ1bmN0aW9uICgpIHt9OworICAgICAgd2luZG93LmNvbnNvbGUuZXJyb3IgPSBmdW5jdGlvbiAoKSB7fTsKKyAgIH0KK30pOwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9qcy9wcmV0dGlmeS5qcyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvanMvcHJldHRpZnkuanMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWVmNWFkNwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvanMvcHJldHRpZnkuanMKQEAgLTAsMCArMSwyOCBAQAordmFyIHE9bnVsbDt3aW5kb3cuUFJfU0hPVUxEX1VTRV9DT05USU5VQVRJT049ITA7CisoZnVuY3Rpb24oKXtmdW5jdGlvbiBMKGEpe2Z1bmN0aW9uIG0oYSl7dmFyIGY9YS5jaGFyQ29kZUF0KDApO2lmKGYhPT05MilyZXR1cm4gZjt2YXIgYj1hLmNoYXJBdCgxKTtyZXR1cm4oZj1yW2JdKT9mOiIwIjw9YiYmYjw9IjciP3BhcnNlSW50KGEuc3Vic3RyaW5nKDEpLDgpOmI9PT0idSJ8fGI9PT0ieCI/cGFyc2VJbnQoYS5zdWJzdHJpbmcoMiksMTYpOmEuY2hhckNvZGVBdCgxKX1mdW5jdGlvbiBlKGEpe2lmKGE8MzIpcmV0dXJuKGE8MTY/IlxceDAiOiJcXHgiKSthLnRvU3RyaW5nKDE2KTthPVN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoYT09PSJcXCJ8fGE9PT0iLSJ8fGE9PT0iWyJ8fGE9PT0iXSIpYT0iXFwiK2E7cmV0dXJuIGF9ZnVuY3Rpb24gaChhKXtmb3IodmFyIGY9YS5zdWJzdHJpbmcoMSxhLmxlbmd0aC0xKS5tYXRjaCgvXFx1W1xkQS1GYS1mXXs0fXxcXHhbXGRBLUZhLWZdezJ9fFxcWzAtM11bMC03XXswLDJ9fFxcWzAtN117MSwyfXxcXFtcU1xzXXxbXlxcXS9nKSxhPQorW10sYj1bXSxvPWZbMF09PT0iXiIsYz1vPzE6MCxpPWYubGVuZ3RoO2M8aTsrK2Mpe3ZhciBqPWZbY107aWYoL1xcW2Jkc3ddL2kudGVzdChqKSlhLnB1c2goaik7ZWxzZXt2YXIgaj1tKGopLGQ7YysyPGkmJiItIj09PWZbYysxXT8oZD1tKGZbYysyXSksYys9Mik6ZD1qO2IucHVzaChbaixkXSk7ZDw2NXx8aj4xMjJ8fChkPDY1fHxqPjkwfHxiLnB1c2goW01hdGgubWF4KDY1LGopfDMyLE1hdGgubWluKGQsOTApfDMyXSksZDw5N3x8aj4xMjJ8fGIucHVzaChbTWF0aC5tYXgoOTcsaikmLTMzLE1hdGgubWluKGQsMTIyKSYtMzNdKSl9fWIuc29ydChmdW5jdGlvbihhLGYpe3JldHVybiBhWzBdLWZbMF18fGZbMV0tYVsxXX0pO2Y9W107aj1bTmFOLE5hTl07Zm9yKGM9MDtjPGIubGVuZ3RoOysrYylpPWJbY10saVswXTw9alsxXSsxP2pbMV09TWF0aC5tYXgoalsxXSxpWzFdKTpmLnB1c2goaj1pKTtiPVsiWyJdO28mJmIucHVzaCgiXiIpO2IucHVzaC5hcHBseShiLGEpO2ZvcihjPTA7YzwKK2YubGVuZ3RoOysrYylpPWZbY10sYi5wdXNoKGUoaVswXSkpLGlbMV0+aVswXSYmKGlbMV0rMT5pWzBdJiZiLnB1c2goIi0iKSxiLnB1c2goZShpWzFdKSkpO2IucHVzaCgiXSIpO3JldHVybiBiLmpvaW4oIiIpfWZ1bmN0aW9uIHkoYSl7Zm9yKHZhciBmPWEuc291cmNlLm1hdGNoKC9cWyg/OlteXFxcXV18XFxbXFNcc10pKl18XFx1W1xkQS1GYS1mXXs0fXxcXHhbXGRBLUZhLWZdezJ9fFxcXGQrfFxcW15cZHV4XXxcKFw/WyE6PV18WygpXl18W14oKVtcXF5dKy9nKSxiPWYubGVuZ3RoLGQ9W10sYz0wLGk9MDtjPGI7KytjKXt2YXIgaj1mW2NdO2o9PT0iKCI/KytpOiJcXCI9PT1qLmNoYXJBdCgwKSYmKGo9K2ouc3Vic3RyaW5nKDEpKSYmajw9aSYmKGRbal09LTEpfWZvcihjPTE7YzxkLmxlbmd0aDsrK2MpLTE9PT1kW2NdJiYoZFtjXT0rK3QpO2ZvcihpPWM9MDtjPGI7KytjKWo9ZltjXSxqPT09IigiPygrK2ksZFtpXT09PXZvaWQgMCYmKGZbY109Iig/OiIpKToiXFwiPT09ai5jaGFyQXQoMCkmJgorKGo9K2ouc3Vic3RyaW5nKDEpKSYmajw9aSYmKGZbY109IlxcIitkW2ldKTtmb3IoaT1jPTA7YzxiOysrYykiXiI9PT1mW2NdJiYiXiIhPT1mW2MrMV0mJihmW2NdPSIiKTtpZihhLmlnbm9yZUNhc2UmJnMpZm9yKGM9MDtjPGI7KytjKWo9ZltjXSxhPWouY2hhckF0KDApLGoubGVuZ3RoPj0yJiZhPT09IlsiP2ZbY109aChqKTphIT09IlxcIiYmKGZbY109ai5yZXBsYWNlKC9bQS1aYS16XS9nLGZ1bmN0aW9uKGEpe2E9YS5jaGFyQ29kZUF0KDApO3JldHVybiJbIitTdHJpbmcuZnJvbUNoYXJDb2RlKGEmLTMzLGF8MzIpKyJdIn0pKTtyZXR1cm4gZi5qb2luKCIiKX1mb3IodmFyIHQ9MCxzPSExLGw9ITEscD0wLGQ9YS5sZW5ndGg7cDxkOysrcCl7dmFyIGc9YVtwXTtpZihnLmlnbm9yZUNhc2UpbD0hMDtlbHNlIGlmKC9bYS16XS9pLnRlc3QoZy5zb3VyY2UucmVwbGFjZSgvXFx1W1xkYS1mXXs0fXxcXHhbXGRhLWZdezJ9fFxcW15VWHV4XS9naSwiIikpKXtzPSEwO2w9ITE7YnJlYWt9fWZvcih2YXIgcj0KK3tiOjgsdDo5LG46MTAsdjoxMSxmOjEyLHI6MTN9LG49W10scD0wLGQ9YS5sZW5ndGg7cDxkOysrcCl7Zz1hW3BdO2lmKGcuZ2xvYmFsfHxnLm11bHRpbGluZSl0aHJvdyBFcnJvcigiIitnKTtuLnB1c2goIig/OiIreShnKSsiKSIpfXJldHVybiBSZWdFeHAobi5qb2luKCJ8IiksbD8iZ2kiOiJnIil9ZnVuY3Rpb24gTShhKXtmdW5jdGlvbiBtKGEpe3N3aXRjaChhLm5vZGVUeXBlKXtjYXNlIDE6aWYoZS50ZXN0KGEuY2xhc3NOYW1lKSlicmVhaztmb3IodmFyIGc9YS5maXJzdENoaWxkO2c7Zz1nLm5leHRTaWJsaW5nKW0oZyk7Zz1hLm5vZGVOYW1lO2lmKCJCUiI9PT1nfHwiTEkiPT09ZyloW3NdPSJcbiIsdFtzPDwxXT15KyssdFtzKys8PDF8MV09YTticmVhaztjYXNlIDM6Y2FzZSA0Omc9YS5ub2RlVmFsdWUsZy5sZW5ndGgmJihnPXA/Zy5yZXBsYWNlKC9cclxuPy9nLCJcbiIpOmcucmVwbGFjZSgvW1x0XG5cciBdKy9nLCIgIiksaFtzXT1nLHRbczw8MV09eSx5Kz1nLmxlbmd0aCwKK3RbcysrPDwxfDFdPWEpfX12YXIgZT0vKD86Xnxccylub2NvZGUoPzpcc3wkKS8saD1bXSx5PTAsdD1bXSxzPTAsbDthLmN1cnJlbnRTdHlsZT9sPWEuY3VycmVudFN0eWxlLndoaXRlU3BhY2U6d2luZG93LmdldENvbXB1dGVkU3R5bGUmJihsPWRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoYSxxKS5nZXRQcm9wZXJ0eVZhbHVlKCJ3aGl0ZS1zcGFjZSIpKTt2YXIgcD1sJiYicHJlIj09PWwuc3Vic3RyaW5nKDAsMyk7bShhKTtyZXR1cm57YTpoLmpvaW4oIiIpLnJlcGxhY2UoL1xuJC8sIiIpLGM6dH19ZnVuY3Rpb24gQihhLG0sZSxoKXttJiYoYT17YTptLGQ6YX0sZShhKSxoLnB1c2guYXBwbHkoaCxhLmUpKX1mdW5jdGlvbiB4KGEsbSl7ZnVuY3Rpb24gZShhKXtmb3IodmFyIGw9YS5kLHA9W2wsInBsbiJdLGQ9MCxnPWEuYS5tYXRjaCh5KXx8W10scj17fSxuPTAsej1nLmxlbmd0aDtuPHo7KytuKXt2YXIgZj1nW25dLGI9cltmXSxvPXZvaWQgMCxjO2lmKHR5cGVvZiBiPT09Cisic3RyaW5nIiljPSExO2Vsc2V7dmFyIGk9aFtmLmNoYXJBdCgwKV07aWYoaSlvPWYubWF0Y2goaVsxXSksYj1pWzBdO2Vsc2V7Zm9yKGM9MDtjPHQ7KytjKWlmKGk9bVtjXSxvPWYubWF0Y2goaVsxXSkpe2I9aVswXTticmVha31vfHwoYj0icGxuIil9aWYoKGM9Yi5sZW5ndGg+PTUmJiJsYW5nLSI9PT1iLnN1YnN0cmluZygwLDUpKSYmIShvJiZ0eXBlb2Ygb1sxXT09PSJzdHJpbmciKSljPSExLGI9InNyYyI7Y3x8KHJbZl09Yil9aT1kO2QrPWYubGVuZ3RoO2lmKGMpe2M9b1sxXTt2YXIgaj1mLmluZGV4T2YoYyksaz1qK2MubGVuZ3RoO29bMl0mJihrPWYubGVuZ3RoLW9bMl0ubGVuZ3RoLGo9ay1jLmxlbmd0aCk7Yj1iLnN1YnN0cmluZyg1KTtCKGwraSxmLnN1YnN0cmluZygwLGopLGUscCk7QihsK2kraixjLEMoYixjKSxwKTtCKGwraStrLGYuc3Vic3RyaW5nKGspLGUscCl9ZWxzZSBwLnB1c2gobCtpLGIpfWEuZT1wfXZhciBoPXt9LHk7KGZ1bmN0aW9uKCl7Zm9yKHZhciBlPWEuY29uY2F0KG0pLAorbD1bXSxwPXt9LGQ9MCxnPWUubGVuZ3RoO2Q8ZzsrK2Qpe3ZhciByPWVbZF0sbj1yWzNdO2lmKG4pZm9yKHZhciBrPW4ubGVuZ3RoOy0taz49MDspaFtuLmNoYXJBdChrKV09cjtyPXJbMV07bj0iIityO3AuaGFzT3duUHJvcGVydHkobil8fChsLnB1c2gocikscFtuXT1xKX1sLnB1c2goL1tcU1xzXS8pO3k9TChsKX0pKCk7dmFyIHQ9bS5sZW5ndGg7cmV0dXJuIGV9ZnVuY3Rpb24gdShhKXt2YXIgbT1bXSxlPVtdO2EudHJpcGxlUXVvdGVkU3RyaW5ncz9tLnB1c2goWyJzdHIiLC9eKD86JycnKD86W14nXFxdfFxcW1xTXHNdfCcnPyg/PVteJ10pKSooPzonJyd8JCl8IiIiKD86W14iXFxdfFxcW1xTXHNdfCIiPyg/PVteIl0pKSooPzoiIiJ8JCl8Jyg/OlteJ1xcXXxcXFtcU1xzXSkqKD86J3wkKXwiKD86W14iXFxdfFxcW1xTXHNdKSooPzoifCQpKS8scSwiJ1wiIl0pOmEubXVsdGlMaW5lU3RyaW5ncz9tLnB1c2goWyJzdHIiLC9eKD86Jyg/OlteJ1xcXXxcXFtcU1xzXSkqKD86J3wkKXwiKD86W14iXFxdfFxcW1xTXHNdKSooPzoifCQpfGAoPzpbXlxcYF18XFxbXFNcc10pKig/OmB8JCkpLywKK3EsIidcImAiXSk6bS5wdXNoKFsic3RyIiwvXig/OicoPzpbXlxuXHInXFxdfFxcLikqKD86J3wkKXwiKD86W15cblxyIlxcXXxcXC4pKig/OiJ8JCkpLyxxLCJcIiciXSk7YS52ZXJiYXRpbVN0cmluZ3MmJmUucHVzaChbInN0ciIsL15AIig/OlteIl18IiIpKig/OiJ8JCkvLHFdKTt2YXIgaD1hLmhhc2hDb21tZW50cztoJiYoYS5jU3R5bGVDb21tZW50cz8oaD4xP20ucHVzaChbImNvbSIsL14jKD86IyMoPzpbXiNdfCMoPyEjIykpKig/OiMjI3wkKXwuKikvLHEsIiMiXSk6bS5wdXNoKFsiY29tIiwvXiMoPzooPzpkZWZpbmV8ZWxpZnxlbHNlfGVuZGlmfGVycm9yfGlmZGVmfGluY2x1ZGV8aWZuZGVmfGxpbmV8cHJhZ21hfHVuZGVmfHdhcm5pbmcpXGJ8W15cblxyXSopLyxxLCIjIl0pLGUucHVzaChbInN0ciIsL148KD86KD86KD86XC5cLlwvKSp8XC8/KSg/Oltcdy1dKyg/OlwvW1x3LV0rKSspP1tcdy1dK1wuaHxbYS16XVx3Kik+LyxxXSkpOm0ucHVzaChbImNvbSIsL14jW15cblxyXSovLAorcSwiIyJdKSk7YS5jU3R5bGVDb21tZW50cyYmKGUucHVzaChbImNvbSIsL15cL1wvW15cblxyXSovLHFdKSxlLnB1c2goWyJjb20iLC9eXC9cKltcU1xzXSo/KD86XCpcL3wkKS8scV0pKTthLnJlZ2V4TGl0ZXJhbHMmJmUucHVzaChbImxhbmctcmVnZXgiLC9eKD86Xl5cLj98WyErLV18IT18IT09fCN8JXwlPXwmfCYmfCYmPXwmPXxcKHxcKnxcKj18XCs9fCx8LT18LT58XC98XC89fDp8Ojp8O3w8fDw8fDw8PXw8PXw9fD09fD09PXw+fD49fD4+fD4+PXw+Pj58Pj4+PXxbP0BbXl18XF49fFxeXF58XF5cXj18e3xcfHxcfD18XHxcfHxcfFx8PXx+fGJyZWFrfGNhc2V8Y29udGludWV8ZGVsZXRlfGRvfGVsc2V8ZmluYWxseXxpbnN0YW5jZW9mfHJldHVybnx0aHJvd3x0cnl8dHlwZW9mKVxzKihcLyg/PVteKi9dKSg/OlteL1tcXF18XFxbXFNcc118XFsoPzpbXlxcXF1dfFxcW1xTXHNdKSooPzpdfCQpKStcLykvXSk7KGg9YS50eXBlcykmJmUucHVzaChbInR5cCIsaF0pO2E9KCIiK2Eua2V5d29yZHMpLnJlcGxhY2UoL14gfCAkL2csCisiIik7YS5sZW5ndGgmJmUucHVzaChbImt3ZCIsUmVnRXhwKCJeKD86IithLnJlcGxhY2UoL1tccyxdKy9nLCJ8IikrIilcXGIiKSxxXSk7bS5wdXNoKFsicGxuIiwvXlxzKy8scSwiIFxyXG5cdFx4YTAiXSk7ZS5wdXNoKFsibGl0IiwvXkBbJF9hLXpdW1x3JEBdKi9pLHFdLFsidHlwIiwvXig/OltAX10/W0EtWl0rW2Etel1bXHckQF0qfFx3K190XGIpLyxxXSxbInBsbiIsL15bJF9hLXpdW1x3JEBdKi9pLHFdLFsibGl0IiwvXig/OjB4W1xkYS1mXSt8KD86XGQoPzpfXGQrKSpcZCooPzpcLlxkKik/fFwuXGRcKykoPzplWystXT9cZCspPylbYS16XSovaSxxLCIwMTIzNDU2Nzg5Il0sWyJwbG4iLC9eXFxbXFNcc10/LyxxXSxbInB1biIsL14uW15cc1x3Ii0kJy4vQFxcYF0qLyxxXSk7cmV0dXJuIHgobSxlKX1mdW5jdGlvbiBEKGEsbSl7ZnVuY3Rpb24gZShhKXtzd2l0Y2goYS5ub2RlVHlwZSl7Y2FzZSAxOmlmKGsudGVzdChhLmNsYXNzTmFtZSkpYnJlYWs7aWYoIkJSIj09PWEubm9kZU5hbWUpaChhKSwKK2EucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpO2Vsc2UgZm9yKGE9YS5maXJzdENoaWxkO2E7YT1hLm5leHRTaWJsaW5nKWUoYSk7YnJlYWs7Y2FzZSAzOmNhc2UgNDppZihwKXt2YXIgYj1hLm5vZGVWYWx1ZSxkPWIubWF0Y2godCk7aWYoZCl7dmFyIGM9Yi5zdWJzdHJpbmcoMCxkLmluZGV4KTthLm5vZGVWYWx1ZT1jOyhiPWIuc3Vic3RyaW5nKGQuaW5kZXgrZFswXS5sZW5ndGgpKSYmYS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzLmNyZWF0ZVRleHROb2RlKGIpLGEubmV4dFNpYmxpbmcpO2goYSk7Y3x8YS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpfX19fWZ1bmN0aW9uIGgoYSl7ZnVuY3Rpb24gYihhLGQpe3ZhciBlPWQ/YS5jbG9uZU5vZGUoITEpOmEsZj1hLnBhcmVudE5vZGU7aWYoZil7dmFyIGY9YihmLDEpLGc9YS5uZXh0U2libGluZztmLmFwcGVuZENoaWxkKGUpO2Zvcih2YXIgaD1nO2g7aD1nKWc9aC5uZXh0U2libGluZyxmLmFwcGVuZENoaWxkKGgpfXJldHVybiBlfQorZm9yKDshYS5uZXh0U2libGluZzspaWYoYT1hLnBhcmVudE5vZGUsIWEpcmV0dXJuO2Zvcih2YXIgYT1iKGEubmV4dFNpYmxpbmcsMCksZTsoZT1hLnBhcmVudE5vZGUpJiZlLm5vZGVUeXBlPT09MTspYT1lO2QucHVzaChhKX12YXIgaz0vKD86Xnxccylub2NvZGUoPzpcc3wkKS8sdD0vXHJcbj98XG4vLHM9YS5vd25lckRvY3VtZW50LGw7YS5jdXJyZW50U3R5bGU/bD1hLmN1cnJlbnRTdHlsZS53aGl0ZVNwYWNlOndpbmRvdy5nZXRDb21wdXRlZFN0eWxlJiYobD1zLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoYSxxKS5nZXRQcm9wZXJ0eVZhbHVlKCJ3aGl0ZS1zcGFjZSIpKTt2YXIgcD1sJiYicHJlIj09PWwuc3Vic3RyaW5nKDAsMyk7Zm9yKGw9cy5jcmVhdGVFbGVtZW50KCJMSSIpO2EuZmlyc3RDaGlsZDspbC5hcHBlbmRDaGlsZChhLmZpcnN0Q2hpbGQpO2Zvcih2YXIgZD1bbF0sZz0wO2c8ZC5sZW5ndGg7KytnKWUoZFtnXSk7bT09PShtfDApJiZkWzBdLnNldEF0dHJpYnV0ZSgidmFsdWUiLAorbSk7dmFyIHI9cy5jcmVhdGVFbGVtZW50KCJPTCIpO3IuY2xhc3NOYW1lPSJsaW5lbnVtcyI7Zm9yKHZhciBuPU1hdGgubWF4KDAsbS0xfDApfHwwLGc9MCx6PWQubGVuZ3RoO2c8ejsrK2cpbD1kW2ddLGwuY2xhc3NOYW1lPSJMIisoZytuKSUxMCxsLmZpcnN0Q2hpbGR8fGwuYXBwZW5kQ2hpbGQocy5jcmVhdGVUZXh0Tm9kZSgiXHhhMCIpKSxyLmFwcGVuZENoaWxkKGwpO2EuYXBwZW5kQ2hpbGQocil9ZnVuY3Rpb24gayhhLG0pe2Zvcih2YXIgZT1tLmxlbmd0aDstLWU+PTA7KXt2YXIgaD1tW2VdO0EuaGFzT3duUHJvcGVydHkoaCk/d2luZG93LmNvbnNvbGUmJmNvbnNvbGUud2FybigiY2Fubm90IG92ZXJyaWRlIGxhbmd1YWdlIGhhbmRsZXIgJXMiLGgpOkFbaF09YX19ZnVuY3Rpb24gQyhhLG0pe2lmKCFhfHwhQS5oYXNPd25Qcm9wZXJ0eShhKSlhPS9eXHMqPC8udGVzdChtKT8iZGVmYXVsdC1tYXJrdXAiOiJkZWZhdWx0LWNvZGUiO3JldHVybiBBW2FdfWZ1bmN0aW9uIEUoYSl7dmFyIG09CithLmc7dHJ5e3ZhciBlPU0oYS5oKSxoPWUuYTthLmE9aDthLmM9ZS5jO2EuZD0wO0MobSxoKShhKTt2YXIgaz0vXGJNU0lFXGIvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksbT0vXG4vZyx0PWEuYSxzPXQubGVuZ3RoLGU9MCxsPWEuYyxwPWwubGVuZ3RoLGg9MCxkPWEuZSxnPWQubGVuZ3RoLGE9MDtkW2ddPXM7dmFyIHIsbjtmb3Iobj1yPTA7bjxnOylkW25dIT09ZFtuKzJdPyhkW3IrK109ZFtuKytdLGRbcisrXT1kW24rK10pOm4rPTI7Zz1yO2ZvcihuPXI9MDtuPGc7KXtmb3IodmFyIHo9ZFtuXSxmPWRbbisxXSxiPW4rMjtiKzI8PWcmJmRbYisxXT09PWY7KWIrPTI7ZFtyKytdPXo7ZFtyKytdPWY7bj1ifWZvcihkLmxlbmd0aD1yO2g8cDspe3ZhciBvPWxbaCsyXXx8cyxjPWRbYSsyXXx8cyxiPU1hdGgubWluKG8sYyksaT1sW2grMV0sajtpZihpLm5vZGVUeXBlIT09MSYmKGo9dC5zdWJzdHJpbmcoZSxiKSkpe2smJihqPWoucmVwbGFjZShtLCJcciIpKTtpLm5vZGVWYWx1ZT0KK2o7dmFyIHU9aS5vd25lckRvY3VtZW50LHY9dS5jcmVhdGVFbGVtZW50KCJTUEFOIik7di5jbGFzc05hbWU9ZFthKzFdO3ZhciB4PWkucGFyZW50Tm9kZTt4LnJlcGxhY2VDaGlsZCh2LGkpO3YuYXBwZW5kQ2hpbGQoaSk7ZTxvJiYobFtoKzFdPWk9dS5jcmVhdGVUZXh0Tm9kZSh0LnN1YnN0cmluZyhiLG8pKSx4Lmluc2VydEJlZm9yZShpLHYubmV4dFNpYmxpbmcpKX1lPWI7ZT49byYmKGgrPTIpO2U+PWMmJihhKz0yKX19Y2F0Y2godyl7ImNvbnNvbGUiaW4gd2luZG93JiZjb25zb2xlLmxvZyh3JiZ3LnN0YWNrP3cuc3RhY2s6dyl9fXZhciB2PVsiYnJlYWssY29udGludWUsZG8sZWxzZSxmb3IsaWYscmV0dXJuLHdoaWxlIl0sdz1bW3YsImF1dG8sY2FzZSxjaGFyLGNvbnN0LGRlZmF1bHQsZG91YmxlLGVudW0sZXh0ZXJuLGZsb2F0LGdvdG8saW50LGxvbmcscmVnaXN0ZXIsc2hvcnQsc2lnbmVkLHNpemVvZixzdGF0aWMsc3RydWN0LHN3aXRjaCx0eXBlZGVmLHVuaW9uLHVuc2lnbmVkLHZvaWQsdm9sYXRpbGUiXSwKKyJjYXRjaCxjbGFzcyxkZWxldGUsZmFsc2UsaW1wb3J0LG5ldyxvcGVyYXRvcixwcml2YXRlLHByb3RlY3RlZCxwdWJsaWMsdGhpcyx0aHJvdyx0cnVlLHRyeSx0eXBlb2YiXSxGPVt3LCJhbGlnbm9mLGFsaWduX3VuaW9uLGFzbSxheGlvbSxib29sLGNvbmNlcHQsY29uY2VwdF9tYXAsY29uc3RfY2FzdCxjb25zdGV4cHIsZGVjbHR5cGUsZHluYW1pY19jYXN0LGV4cGxpY2l0LGV4cG9ydCxmcmllbmQsaW5saW5lLGxhdGVfY2hlY2ssbXV0YWJsZSxuYW1lc3BhY2UsbnVsbHB0cixyZWludGVycHJldF9jYXN0LHN0YXRpY19hc3NlcnQsc3RhdGljX2Nhc3QsdGVtcGxhdGUsdHlwZWlkLHR5cGVuYW1lLHVzaW5nLHZpcnR1YWwsd2hlcmUiXSxHPVt3LCJhYnN0cmFjdCxib29sZWFuLGJ5dGUsZXh0ZW5kcyxmaW5hbCxmaW5hbGx5LGltcGxlbWVudHMsaW1wb3J0LGluc3RhbmNlb2YsbnVsbCxuYXRpdmUscGFja2FnZSxzdHJpY3RmcCxzdXBlcixzeW5jaHJvbml6ZWQsdGhyb3dzLHRyYW5zaWVudCJdLAorSD1bRywiYXMsYmFzZSxieSxjaGVja2VkLGRlY2ltYWwsZGVsZWdhdGUsZGVzY2VuZGluZyxkeW5hbWljLGV2ZW50LGZpeGVkLGZvcmVhY2gsZnJvbSxncm91cCxpbXBsaWNpdCxpbixpbnRlcmZhY2UsaW50ZXJuYWwsaW50byxpcyxsb2NrLG9iamVjdCxvdXQsb3ZlcnJpZGUsb3JkZXJieSxwYXJhbXMscGFydGlhbCxyZWFkb25seSxyZWYsc2J5dGUsc2VhbGVkLHN0YWNrYWxsb2Msc3RyaW5nLHNlbGVjdCx1aW50LHVsb25nLHVuY2hlY2tlZCx1bnNhZmUsdXNob3J0LHZhciJdLHc9W3csImRlYnVnZ2VyLGV2YWwsZXhwb3J0LGZ1bmN0aW9uLGdldCxudWxsLHNldCx1bmRlZmluZWQsdmFyLHdpdGgsSW5maW5pdHksTmFOIl0sST1bdiwiYW5kLGFzLGFzc2VydCxjbGFzcyxkZWYsZGVsLGVsaWYsZXhjZXB0LGV4ZWMsZmluYWxseSxmcm9tLGdsb2JhbCxpbXBvcnQsaW4saXMsbGFtYmRhLG5vbmxvY2FsLG5vdCxvcixwYXNzLHByaW50LHJhaXNlLHRyeSx3aXRoLHlpZWxkLEZhbHNlLFRydWUsTm9uZSJdLAorSj1bdiwiYWxpYXMsYW5kLGJlZ2luLGNhc2UsY2xhc3MsZGVmLGRlZmluZWQsZWxzaWYsZW5kLGVuc3VyZSxmYWxzZSxpbixtb2R1bGUsbmV4dCxuaWwsbm90LG9yLHJlZG8scmVzY3VlLHJldHJ5LHNlbGYsc3VwZXIsdGhlbix0cnVlLHVuZGVmLHVubGVzcyx1bnRpbCx3aGVuLHlpZWxkLEJFR0lOLEVORCJdLHY9W3YsImNhc2UsZG9uZSxlbGlmLGVzYWMsZXZhbCxmaSxmdW5jdGlvbixpbixsb2NhbCxzZXQsdGhlbix1bnRpbCJdLEs9L14oRElSfEZJTEV8dmVjdG9yfChkZXxwcmlvcml0eV8pP3F1ZXVlfGxpc3R8c3RhY2t8KGNvbnN0Xyk/aXRlcmF0b3J8KG11bHRpKT8oc2V0fG1hcCl8Yml0c2V0fHU/KGludHxmbG9hdClcZCopLyxOPS9cUy8sTz11KHtrZXl3b3JkczpbRixILHcsImNhbGxlcixkZWxldGUsZGllLGRvLGR1bXAsZWxzaWYsZXZhbCxleGl0LGZvcmVhY2gsZm9yLGdvdG8saWYsaW1wb3J0LGxhc3QsbG9jYWwsbXksbmV4dCxubyxvdXIscHJpbnQscGFja2FnZSxyZWRvLHJlcXVpcmUsc3ViLHVuZGVmLHVubGVzcyx1bnRpbCx1c2Usd2FudGFycmF5LHdoaWxlLEJFR0lOLEVORCIrCitJLEosdl0saGFzaENvbW1lbnRzOiEwLGNTdHlsZUNvbW1lbnRzOiEwLG11bHRpTGluZVN0cmluZ3M6ITAscmVnZXhMaXRlcmFsczohMH0pLEE9e307ayhPLFsiZGVmYXVsdC1jb2RlIl0pO2soeChbXSxbWyJwbG4iLC9eW148P10rL10sWyJkZWMiLC9ePCFcd1tePl0qKD86PnwkKS9dLFsiY29tIiwvXjxcIS0tW1xTXHNdKj8oPzotLVw+fCQpL10sWyJsYW5nLSIsL148XD8oW1xTXHNdKz8pKD86XD8+fCQpL10sWyJsYW5nLSIsL148JShbXFNcc10rPykoPzolPnwkKS9dLFsicHVuIiwvXig/OjxbJT9dfFslP10+KS9dLFsibGFuZy0iLC9ePHhtcFxiW14+XSo+KFtcU1xzXSs/KTxcL3htcFxiW14+XSo+L2ldLFsibGFuZy1qcyIsL148c2NyaXB0XGJbXj5dKj4oW1xTXHNdKj8pKDxcL3NjcmlwdFxiW14+XSo+KS9pXSxbImxhbmctY3NzIiwvXjxzdHlsZVxiW14+XSo+KFtcU1xzXSo/KSg8XC9zdHlsZVxiW14+XSo+KS9pXSxbImxhbmctaW4udGFnIiwvXig8XC8/W2Etel1bXjw+XSo+KS9pXV0pLAorWyJkZWZhdWx0LW1hcmt1cCIsImh0bSIsImh0bWwiLCJteG1sIiwieGh0bWwiLCJ4bWwiLCJ4c2wiXSk7ayh4KFtbInBsbiIsL15ccysvLHEsIiBcdFxyXG4iXSxbImF0diIsL14oPzoiW14iXSoiP3wnW14nXSonPykvLHEsIlwiJyJdXSxbWyJ0YWciLC9eXjxcLz9bYS16XSg/Oltcdy0uOl0qXHcpP3xcLz8+JC9pXSxbImF0biIsL14oPyFzdHlsZVtccz1dfG9uKVthLXpdKD86W1x3Oi1dKlx3KT8vaV0sWyJsYW5nLXVxLnZhbCIsL149XHMqKFteXHMiJz5dKig/OlteXHMiJy8+XXxcLyg/PVxzKSkpL10sWyJwdW4iLC9eWy88LT5dKy9dLFsibGFuZy1qcyIsL15vblx3K1xzKj1ccyoiKFteIl0rKSIvaV0sWyJsYW5nLWpzIiwvXm9uXHcrXHMqPVxzKicoW14nXSspJy9pXSxbImxhbmctanMiLC9eb25cdytccyo9XHMqKFteXHMiJz5dKykvaV0sWyJsYW5nLWNzcyIsL15zdHlsZVxzKj1ccyoiKFteIl0rKSIvaV0sWyJsYW5nLWNzcyIsL15zdHlsZVxzKj1ccyonKFteJ10rKScvaV0sWyJsYW5nLWNzcyIsCisvXnN0eWxlXHMqPVxzKihbXlxzIic+XSspL2ldXSksWyJpbi50YWciXSk7ayh4KFtdLFtbImF0diIsL15bXFNcc10rL11dKSxbInVxLnZhbCJdKTtrKHUoe2tleXdvcmRzOkYsaGFzaENvbW1lbnRzOiEwLGNTdHlsZUNvbW1lbnRzOiEwLHR5cGVzOkt9KSxbImMiLCJjYyIsImNwcCIsImN4eCIsImN5YyIsIm0iXSk7ayh1KHtrZXl3b3JkczoibnVsbCx0cnVlLGZhbHNlIn0pLFsianNvbiJdKTtrKHUoe2tleXdvcmRzOkgsaGFzaENvbW1lbnRzOiEwLGNTdHlsZUNvbW1lbnRzOiEwLHZlcmJhdGltU3RyaW5nczohMCx0eXBlczpLfSksWyJjcyJdKTtrKHUoe2tleXdvcmRzOkcsY1N0eWxlQ29tbWVudHM6ITB9KSxbImphdmEiXSk7ayh1KHtrZXl3b3Jkczp2LGhhc2hDb21tZW50czohMCxtdWx0aUxpbmVTdHJpbmdzOiEwfSksWyJic2giLCJjc2giLCJzaCJdKTtrKHUoe2tleXdvcmRzOkksaGFzaENvbW1lbnRzOiEwLG11bHRpTGluZVN0cmluZ3M6ITAsdHJpcGxlUXVvdGVkU3RyaW5nczohMH0pLAorWyJjdiIsInB5Il0pO2sodSh7a2V5d29yZHM6ImNhbGxlcixkZWxldGUsZGllLGRvLGR1bXAsZWxzaWYsZXZhbCxleGl0LGZvcmVhY2gsZm9yLGdvdG8saWYsaW1wb3J0LGxhc3QsbG9jYWwsbXksbmV4dCxubyxvdXIscHJpbnQscGFja2FnZSxyZWRvLHJlcXVpcmUsc3ViLHVuZGVmLHVubGVzcyx1bnRpbCx1c2Usd2FudGFycmF5LHdoaWxlLEJFR0lOLEVORCIsaGFzaENvbW1lbnRzOiEwLG11bHRpTGluZVN0cmluZ3M6ITAscmVnZXhMaXRlcmFsczohMH0pLFsicGVybCIsInBsIiwicG0iXSk7ayh1KHtrZXl3b3JkczpKLGhhc2hDb21tZW50czohMCxtdWx0aUxpbmVTdHJpbmdzOiEwLHJlZ2V4TGl0ZXJhbHM6ITB9KSxbInJiIl0pO2sodSh7a2V5d29yZHM6dyxjU3R5bGVDb21tZW50czohMCxyZWdleExpdGVyYWxzOiEwfSksWyJqcyJdKTtrKHUoe2tleXdvcmRzOiJhbGwsYW5kLGJ5LGNhdGNoLGNsYXNzLGVsc2UsZXh0ZW5kcyxmYWxzZSxmaW5hbGx5LGZvcixpZixpbixpcyxpc250LGxvb3AsbmV3LG5vLG5vdCxudWxsLG9mLG9mZixvbixvcixyZXR1cm4sc3VwZXIsdGhlbix0cnVlLHRyeSx1bmxlc3MsdW50aWwsd2hlbix3aGlsZSx5ZXMiLAoraGFzaENvbW1lbnRzOjMsY1N0eWxlQ29tbWVudHM6ITAsbXVsdGlsaW5lU3RyaW5nczohMCx0cmlwbGVRdW90ZWRTdHJpbmdzOiEwLHJlZ2V4TGl0ZXJhbHM6ITB9KSxbImNvZmZlZSJdKTtrKHgoW10sW1sic3RyIiwvXltcU1xzXSsvXV0pLFsicmVnZXgiXSk7d2luZG93LnByZXR0eVByaW50T25lPWZ1bmN0aW9uKGEsbSxlKXt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJQUkUiKTtoLmlubmVySFRNTD1hO2UmJkQoaCxlKTtFKHtnOm0saTplLGg6aH0pO3JldHVybiBoLmlubmVySFRNTH07d2luZG93LnByZXR0eVByaW50PWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIG0oKXtmb3IodmFyIGU9d2luZG93LlBSX1NIT1VMRF9VU0VfQ09OVElOVUFUSU9OP2wubm93KCkrMjUwOkluZmluaXR5O3A8aC5sZW5ndGgmJmwubm93KCk8ZTtwKyspe3ZhciBuPWhbcF0saz1uLmNsYXNzTmFtZTtpZihrLmluZGV4T2YoInByZXR0eXByaW50Iik+PTApe3ZhciBrPWsubWF0Y2goZyksZixiO2lmKGI9Cishayl7Yj1uO2Zvcih2YXIgbz12b2lkIDAsYz1iLmZpcnN0Q2hpbGQ7YztjPWMubmV4dFNpYmxpbmcpdmFyIGk9Yy5ub2RlVHlwZSxvPWk9PT0xP28/YjpjOmk9PT0zP04udGVzdChjLm5vZGVWYWx1ZSk/YjpvOm87Yj0oZj1vPT09Yj92b2lkIDA6bykmJiJDT0RFIj09PWYudGFnTmFtZX1iJiYoaz1mLmNsYXNzTmFtZS5tYXRjaChnKSk7ayYmKGs9a1sxXSk7Yj0hMTtmb3Iobz1uLnBhcmVudE5vZGU7bztvPW8ucGFyZW50Tm9kZSlpZigoby50YWdOYW1lPT09InByZSJ8fG8udGFnTmFtZT09PSJjb2RlInx8by50YWdOYW1lPT09InhtcCIpJiZvLmNsYXNzTmFtZSYmby5jbGFzc05hbWUuaW5kZXhPZigicHJldHR5cHJpbnQiKT49MCl7Yj0hMDticmVha31ifHwoKGI9KGI9bi5jbGFzc05hbWUubWF0Y2goL1xibGluZW51bXNcYig/OjooXGQrKSk/LykpP2JbMV0mJmJbMV0ubGVuZ3RoPytiWzFdOiEwOiExKSYmRChuLGIpLGQ9e2c6ayxoOm4saTpifSxFKGQpKX19cDxoLmxlbmd0aD9zZXRUaW1lb3V0KG0sCisyNTApOmEmJmEoKX1mb3IodmFyIGU9W2RvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwcmUiKSxkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiY29kZSIpLGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ4bXAiKV0saD1bXSxrPTA7azxlLmxlbmd0aDsrK2spZm9yKHZhciB0PTAscz1lW2tdLmxlbmd0aDt0PHM7Kyt0KWgucHVzaChlW2tdW3RdKTt2YXIgZT1xLGw9RGF0ZTtsLm5vd3x8KGw9e25vdzpmdW5jdGlvbigpe3JldHVybituZXcgRGF0ZX19KTt2YXIgcD0wLGQsZz0vXGJsYW5nKD86dWFnZSk/LShbXHcuXSspKD8hXFMpLzttKCl9O3dpbmRvdy5QUj17Y3JlYXRlU2ltcGxlTGV4ZXI6eCxyZWdpc3RlckxhbmdIYW5kbGVyOmssc291cmNlRGVjb3JhdG9yOnUsUFJfQVRUUklCX05BTUU6ImF0biIsUFJfQVRUUklCX1ZBTFVFOiJhdHYiLFBSX0NPTU1FTlQ6ImNvbSIsUFJfREVDTEFSQVRJT046ImRlYyIsUFJfS0VZV09SRDoia3dkIixQUl9MSVRFUkFMOiJsaXQiLAorUFJfTk9DT0RFOiJub2NvZGUiLFBSX1BMQUlOOiJwbG4iLFBSX1BVTkNUVUFUSU9OOiJwdW4iLFBSX1NPVVJDRToic3JjIixQUl9TVFJJTkc6InN0ciIsUFJfVEFHOiJ0YWciLFBSX1RZUEU6InR5cCJ9fSkoKTsKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvanMvcHJvamVjdHBhZ2UuanMgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2pzL3Byb2plY3RwYWdlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNjcwNDcKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2pzL3Byb2plY3RwYWdlLmpzCkBAIC0wLDAgKzEsNDI4IEBACisidXNlIHN0cmljdCI7CisKK2Z1bmN0aW9uIHByb2plY3RQYWdlSW5pdChjdHgpIHsKKworICB2YXIgbGF5ZXJBZGRJbnB1dCA9ICQoIiNsYXllci1hZGQtaW5wdXQiKTsKKyAgdmFyIGxheWVyc0luUHJqTGlzdCA9ICQoIiNsYXllcnMtaW4tcHJvamVjdC1saXN0Iik7CisgIHZhciBsYXllckFkZEJ0biA9ICQoIiNhZGQtbGF5ZXItYnRuIik7CisKKyAgdmFyIG1hY2hpbmVDaGFuZ2VJbnB1dCA9ICQoIiNtYWNoaW5lLWNoYW5nZS1pbnB1dCIpOworICB2YXIgbWFjaGluZUNoYW5nZUJ0biA9ICQoIiNtYWNoaW5lLWNoYW5nZS1idG4iKTsKKyAgdmFyIG1hY2hpbmVGb3JtID0gJCgiI3NlbGVjdC1tYWNoaW5lLWZvcm0iKTsKKyAgdmFyIG1hY2hpbmVDaGFuZ2VGb3JtVG9nZ2xlID0gJCgiI2NoYW5nZS1tYWNoaW5lLXRvZ2dsZSIpOworICB2YXIgbWFjaGluZU5hbWVUaXRsZSA9ICQoIiNwcm9qZWN0LW1hY2hpbmUtbmFtZSIpOworICB2YXIgbWFjaGluZUNoYW5nZUNhbmNlbCA9ICQoIiNjYW5jZWwtbWFjaGluZS1jaGFuZ2UiKTsKKworICB2YXIgZnJlcUJ1aWxkQnRuID0gICQoIiNmcmVxLWJ1aWxkLWJ0biIpOworICB2YXIgZnJlcUJ1aWxkTGlzdCA9ICQoIiNmcmVxLWJ1aWxkLWxpc3QiKTsKKworICB2YXIgcmVsZWFzZUNoYW5nZUZvcm1Ub2dnbGUgPSAkKCIjcmVsZWFzZS1jaGFuZ2UtdG9nZ2xlIik7CisgIHZhciByZWxlYXNlVGl0bGUgPSAkKCIjcHJvamVjdC1yZWxlYXNlLXRpdGxlIik7CisgIHZhciByZWxlYXNlRm9ybSA9ICQoIiNjaGFuZ2UtcmVsZWFzZS1mb3JtIik7CisgIHZhciByZWxlYXNlTW9kYWwgPSAkKCIjY2hhbmdlLXJlbGVhc2UtbW9kYWwiKTsKKyAgdmFyIGNhbmNlbFJlbGVhc2VDaGFuZ2UgPSAkKCIjY2FuY2VsLXJlbGVhc2UtY2hhbmdlIik7CisKKyAgdmFyIGN1cnJlbnRMYXllckFkZFNlbGVjdGlvbjsKKyAgdmFyIGN1cnJlbnRNYWNoaW5lQWRkU2VsZWN0aW9uID0ge307CisKKyAgdmFyIHVybFBhcmFtcyA9IGxpYnRvYXN0ZXIucGFyc2VVcmxQYXJhbXMoKTsKKworICBsaWJ0b2FzdGVyLmdldFByb2plY3RJbmZvKGxpYnRvYXN0ZXIuY3R4LnByb2plY3RQYWdlVXJsLCBmdW5jdGlvbihwcmpJbmZvKXsKKyAgICB1cGRhdGVQcm9qZWN0TGF5ZXJzKHByakluZm8ubGF5ZXJzKTsKKyAgICB1cGRhdGVGcmVxQnVpbGRSZWNpcGVzKHByakluZm8uZnJlcXRhcmdldHMpOworICAgIHVwZGF0ZVByb2plY3RSZWxlYXNlKHByakluZm8ucmVsZWFzZSk7CisgICAgdXBkYXRlUHJvamVjdFJlbGVhc2VzKHByakluZm8ucmVsZWFzZXMsIHByakluZm8ucmVsZWFzZSk7CisKKyAgICAvKiBJZiB3ZSdyZSByZWNlaXZpbmcgYSBtYWNoaW5lIHNldCBmcm9tIHRoZSB1cmwgYW5kIGl0J3MgZGlmZmVyZW50IGZyb20KKyAgICAgKiBvdXIgY3VycmVudCBtYWNoaW5lIHRoZW4gYWN0aXZhdGUgc2V0IG1hY2hpbmUgc2VxdWVuY2UuCisgICAgICovCisgICAgaWYgKHVybFBhcmFtcy5oYXNPd25Qcm9wZXJ0eSgnc2V0TWFjaGluZScpICYmCisgICAgICAgIHVybFBhcmFtcy5zZXRNYWNoaW5lICE9PSBwcmpJbmZvLm1hY2hpbmUubmFtZSl7CisgICAgICAgIGN1cnJlbnRNYWNoaW5lQWRkU2VsZWN0aW9uLm5hbWUgPSB1cmxQYXJhbXMuc2V0TWFjaGluZTsKKyAgICAgICAgbWFjaGluZUNoYW5nZUJ0bi5jbGljaygpOworICAgIH0gZWxzZSB7CisgICAgICB1cGRhdGVNYWNoaW5lTmFtZShwcmpJbmZvLm1hY2hpbmUubmFtZSk7CisgICAgfQorCisgICAvKiBOb3cgd2UncmUgcmVhbGx5IHJlYWR5IHNob3cgdGhlIHBhZ2UgKi8KKyAgICAkKCIjcHJvamVjdC1wYWdlIikuc2hvdygpOworICB9KTsKKworICAoZnVuY3Rpb24gbm90aWZpY2F0aW9uUmVxdWVzdCgpeworCisgICAgaWYgKHVybFBhcmFtcy5oYXNPd25Qcm9wZXJ0eSgnbm90aWZ5JykpeworICAgICAgc3dpdGNoICh1cmxQYXJhbXMubm90aWZ5KXsKKyAgICAgICAgY2FzZSAnbmV3LXByb2plY3QnOgorICAgICAgICAgICQoIiNwcm9qZWN0LWNyZWF0ZWQtbm90aWZpY2F0aW9uIikuc2hvdygpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdsYXllci1pbXBvcnRlZCc6CisgICAgICAgICAgbGF5ZXJJbXBvcnRlZE5vdGlmaWNhdGlvbigpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfSkoKTsKKworICAvKiBMYXllciBpbXBvcnRlZCBub3RpZmljYXRpb24gKi8KKyAgZnVuY3Rpb24gbGF5ZXJJbXBvcnRlZE5vdGlmaWNhdGlvbigpeworICAgIHZhciBpbXBvcnRlZCA9ICQuY29va2llKCJsYXllci1pbXBvcnRlZC1hbGVydCIpOworICAgIHZhciBtZXNzYWdlID0gIkxheWVyIGltcG9ydGVkIjsKKworICAgIGlmICghaW1wb3J0ZWQpCisgICAgICByZXR1cm47CisgICAgZWxzZQorICAgICAgaW1wb3J0ZWQgPSBKU09OLnBhcnNlKGltcG9ydGVkKTsKKworICAgIGlmIChpbXBvcnRlZC5kZXBzX2FkZGVkLmxlbmd0aCA9PT0gMCkgeworICAgICAgbWVzc2FnZSA9ICJZb3UgaGF2ZSBpbXBvcnRlZCA8c3Ryb25nPjxhIGhyZWY9XCIiK2ltcG9ydGVkLmltcG9ydGVkX2xheWVyLmxheWVyZGV0YWlsdXJsKyJcIj4iK2ltcG9ydGVkLmltcG9ydGVkX2xheWVyLm5hbWUrIjwvYT48L3N0cm9uZz4gYW5kIGFkZGVkIGl0IHRvIHlvdXIgcHJvamVjdC4iOworICAgIH0gZWxzZSB7CisKKyAgICAgIHZhciBsaW5rcyA9ICI8YSBocmVmPVwiIitpbXBvcnRlZC5pbXBvcnRlZF9sYXllci5sYXllcmRldGFpbHVybCsiXCI+IitpbXBvcnRlZC5pbXBvcnRlZF9sYXllci5uYW1lKyI8L2E+LCAiOworCisgICAgICBpbXBvcnRlZC5kZXBzX2FkZGVkLm1hcCAoZnVuY3Rpb24oaXRlbSwgaW5kZXgpeworICAgICAgICBsaW5rcyArPSc8YSBocmVmPSInK2l0ZW0ubGF5ZXJkZXRhaWx1cmwrJyI+JytpdGVtLm5hbWUrJzwvYT4nOworICAgICAgICAvKklmIHdlJ3JlIGF0IHRoZSBsYXN0IGVsZW1lbnQgd2UgZG9uJ3Qgd2FudCB0aGUgdHJhaWxpbmcgY29tbWEgKi8KKyAgICAgICAgaWYgKGltcG9ydGVkLmRlcHNfYWRkZWRbaW5kZXgrMV0gIT09IHVuZGVmaW5lZCkKKyAgICAgICAgICBsaW5rcyArPSAnLCAnOworICAgICAgfSk7CisKKyAgICAgIC8qIExlbmd0aCArIDEgaGVyZSB0byBkbyBkZXBzICsgdGhlIGltcG9ydGVkIGxheWVyICovCisgICAgICBtZXNzYWdlID0gJ1lvdSBoYXZlIGltcG9ydGVkIDxzdHJvbmc+PGEgaHJlZj0iJytpbXBvcnRlZC5pbXBvcnRlZF9sYXllci5sYXllcmRldGFpbHVybCsnIj4nK2ltcG9ydGVkLmltcG9ydGVkX2xheWVyLm5hbWUrJzwvYT48L3N0cm9uZz4gYW5kIGFkZGVkIDxzdHJvbmc+JysoaW1wb3J0ZWQuZGVwc19hZGRlZC5sZW5ndGgrMSkrJzwvc3Ryb25nPiBsYXllcnMgdG8geW91ciBwcm9qZWN0OiA8c3Ryb25nPicrbGlua3MrJzwvc3Ryb25nPic7CisgICAgfQorCisgICAgbGlidG9hc3Rlci5zaG93Q2hhbmdlTm90aWZpY2F0aW9uKG1lc3NhZ2UpOworCisgICAgJC5yZW1vdmVDb29raWUoImxheWVyLWltcG9ydGVkLWFsZXJ0IiwgeyBwYXRoOiAiLyJ9KTsKKyAgfQorCisgIC8qIEFkZC9SbSBsYXllciBmdW5jdGlvbmFsaXR5ICovCisKKyAgbGlidG9hc3Rlci5tYWtlVHlwZWFoZWFkKGxheWVyQWRkSW5wdXQsIGxpYnRvYXN0ZXIuY3R4LmxheWVyc1R5cGVBaGVhZFVybCwgeyBpbmNsdWRlX2FkZGVkOiAiZmFsc2UiIH0sIGZ1bmN0aW9uKGl0ZW0peworICAgIGN1cnJlbnRMYXllckFkZFNlbGVjdGlvbiA9IGl0ZW07CisgICAgbGF5ZXJBZGRCdG4ucmVtb3ZlQXR0cigiZGlzYWJsZWQiKTsKKyAgfSk7CisKKyAgbGF5ZXJBZGRCdG4uY2xpY2soZnVuY3Rpb24oZSl7CisgICAgZS5wcmV2ZW50RGVmYXVsdCgpOworICAgIHZhciBsYXllck9iaiA9IGN1cnJlbnRMYXllckFkZFNlbGVjdGlvbjsKKworICAgIGFkZFJtTGF5ZXIobGF5ZXJPYmosIHRydWUpOworICAgIC8qIFJlc2V0IHRoZSB0ZXh0IGlucHV0ICovCisgICAgbGF5ZXJBZGRJbnB1dC52YWwoIiIpOworICB9KTsKKworICBmdW5jdGlvbiBhZGRSbUxheWVyKGxheWVyT2JqLCBhZGQpeworCisgICAgbGlidG9hc3Rlci5hZGRSbUxheWVyKGxheWVyT2JqLCBhZGQsIGZ1bmN0aW9uKGxheWVyRGVwc0xpc3QpeworICAgICAgaWYgKGFkZCl7CisgICAgICAgIHVwZGF0ZVByb2plY3RMYXllcnMoW2xheWVyT2JqXSk7CisgICAgICAgIHVwZGF0ZVByb2plY3RMYXllcnMobGF5ZXJEZXBzTGlzdCk7CisgICAgICB9CisKKyAgICAgIC8qIFNob3cgdGhlIGFsZXJ0IG1lc3NhZ2UgKi8KKyAgICAgIHZhciBtZXNzYWdlID0gbGlidG9hc3Rlci5tYWtlTGF5ZXJBZGRSbUFsZXJ0TXNnKGxheWVyT2JqLCBsYXllckRlcHNMaXN0LCBhZGQpOworICAgICAgbGlidG9hc3Rlci5zaG93Q2hhbmdlTm90aWZpY2F0aW9uKG1lc3NhZ2UpOworICAgIH0pOworICB9CisKKyAgZnVuY3Rpb24gdXBkYXRlUHJvamVjdExheWVycyhsYXllcnMpeworCisgICAgLyogTm8gbGF5ZXJzIHRvIGFkZCAqLworICAgIGlmIChsYXllcnMubGVuZ3RoID09PSAwKXsKKyAgICAgIHVwZGF0ZUxheWVyc0NvdW50KCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yICh2YXIgaSBpbiBsYXllcnMpeworICAgICAgdmFyIGxheWVyT2JqID0gbGF5ZXJzW2ldOworCisgICAgICB2YXIgcHJvamVjdExheWVyID0gJCgiPGxpPjxhPjwvYT48c3BhbiBjbGFzcz1cImljb24tdHJhc2hcIiBkYXRhLXRvZ2dsZT1cInRvb2x0aXBcIiB0aXRsZT1cIkRlbGV0ZVwiPjwvc3Bhbj48L2xpPiIpOworCisgICAgICBwcm9qZWN0TGF5ZXIuZGF0YSgnbGF5ZXInLCBsYXllck9iaik7CisgICAgICBwcm9qZWN0TGF5ZXIuY2hpbGRyZW4oInNwYW4iKS50b29sdGlwKCk7CisKKyAgICAgIHZhciBsaW5rID0gcHJvamVjdExheWVyLmNoaWxkcmVuKCJhIik7CisKKyAgICAgIGxpbmsuYXR0cigiaHJlZiIsIGxheWVyT2JqLmxheWVyZGV0YWlsdXJsKTsKKyAgICAgIGxpbmsudGV4dChsYXllck9iai5uYW1lKTsKKyAgICAgIC8qIFlPQ1RPICM4MDI0CisgICAgICAgIGxpbmsudG9vbHRpcCh7dGl0bGU6IGxheWVyT2JqLmdpdHVybCArICIgfCAiKyBsYXllck9iai5icmFuY2gubmFtZSwgcGxhY2VtZW50OiAicmlnaHQifSk7CisgICAgICAgIGJyYW5jaCBuYW1lIG5vdCBhY2Nlc3NpYmxlIHNvbWV0aW1lcyBpdCBpcyByZXZpc2lvbiBpbnN0ZWFkCisgICAgICAqLworCisgICAgICB2YXIgdHJhc2hJdGVtID0gcHJvamVjdExheWVyLmNoaWxkcmVuKCJzcGFuIik7CisgICAgICB0cmFzaEl0ZW0uY2xpY2soZnVuY3Rpb24gKGUpIHsKKyAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOworICAgICAgICB2YXIgbGF5ZXJPYmpUb1JtID0gJCh0aGlzKS5wYXJlbnQoKS5kYXRhKCdsYXllcicpOworCisgICAgICAgIGFkZFJtTGF5ZXIobGF5ZXJPYmpUb1JtLCBmYWxzZSk7CisKKyAgICAgICAgJCh0aGlzKS5wYXJlbnQoKS5mYWRlT3V0KGZ1bmN0aW9uICgpeworICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CisgICAgICAgICAgdXBkYXRlTGF5ZXJzQ291bnQoKTsKKyAgICAgICAgfSk7CisgICAgICB9KTsKKworICAgICAgbGF5ZXJzSW5QcmpMaXN0LmFwcGVuZChwcm9qZWN0TGF5ZXIpOworCisgICAgICB1cGRhdGVMYXllcnNDb3VudCgpOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHVwZGF0ZUxheWVyc0NvdW50KCl7CisgICAgdmFyIGNvdW50ID0gJCgiI2xheWVycy1pbi1wcm9qZWN0LWxpc3QiKS5jaGlsZHJlbigpLmxlbmd0aDsKKworICAgIGlmIChjb3VudCA9PT0gMCkKKyAgICAgICQoIiNuby1sYXllcnMtaW4tcHJvamVjdCIpLmZhZGVJbigpOworICAgIGVsc2UKKyAgICAgICQoIiNuby1sYXllcnMtaW4tcHJvamVjdCIpLmhpZGUoKTsKKworICAgICQoIiNwcm9qZWN0LWxheWVycy1jb3VudCIpLnRleHQoY291bnQpOworCisgICAgcmV0dXJuIGNvdW50OworICB9CisKKyAgLyogRnJlcXVlbnQgYnVpbGRzIGZ1bmN0aW9uYWxpdHkgKi8KKyAgZnVuY3Rpb24gdXBkYXRlRnJlcUJ1aWxkUmVjaXBlcyhyZWNpcGVzKSB7CisgICAgdmFyIG5vTW9zdEJ1aWx0ID0gJCgiI25vLW1vc3QtYnVpbHQiKTsKKworICAgIGlmIChyZWNpcGVzLmxlbmd0aCA9PT0gMCl7CisgICAgICBub01vc3RCdWlsdC5zaG93KCk7CisgICAgICBmcmVxQnVpbGRCdG4uaGlkZSgpOworICAgIH0gZWxzZSB7CisgICAgICBub01vc3RCdWlsdC5oaWRlKCk7CisgICAgICBmcmVxQnVpbGRCdG4uc2hvdygpOworICAgIH0KKworICAgIGZvciAodmFyIGkgaW4gcmVjaXBlcyl7CisgICAgICB2YXIgZnJlcVRhcmdldENoZWNrID0gJCgnPGxpPjxsYWJlbCBjbGFzcz0iY2hlY2tib3giPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgLz48c3BhbiBjbGFzcz0iZnJlcS10YXJnZXQtbmFtZSI+PC9zcGFuPjwvbGFiZWw+PC9saT4nKTsKKyAgICAgIGZyZXFUYXJnZXRDaGVjay5maW5kKCIuZnJlcS10YXJnZXQtbmFtZSIpLnRleHQocmVjaXBlc1tpXSk7CisgICAgICBmcmVxVGFyZ2V0Q2hlY2suZmluZCgiaW5wdXQiKS52YWwocmVjaXBlc1tpXSk7CisgICAgICBmcmVxVGFyZ2V0Q2hlY2suY2xpY2soZnVuY3Rpb24oKXsKKyAgICAgICAgaWYgKGZyZXFCdWlsZExpc3QuZmluZCgiOmNoZWNrZWQiKS5sZW5ndGggPiAwKQorICAgICAgICAgIGZyZXFCdWlsZEJ0bi5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpOworICAgICAgICBlbHNlCisgICAgICAgICAgZnJlcUJ1aWxkQnRuLmF0dHIoImRpc2FibGVkIiwgImRpc2FibGVkIik7CisgICAgICB9KTsKKworICAgICAgZnJlcUJ1aWxkTGlzdC5hcHBlbmQoZnJlcVRhcmdldENoZWNrKTsKKyAgICB9CisgIH0KKworICBmcmVxQnVpbGRCdG4uY2xpY2soZnVuY3Rpb24oZSl7CisgICAgZS5wcmV2ZW50RGVmYXVsdCgpOworCisgICAgdmFyIHRvQnVpbGQgPSAiIjsKKyAgICBmcmVxQnVpbGRMaXN0LmZpbmQoIjpjaGVja2VkIikuZWFjaChmdW5jdGlvbigpeworICAgICAgdG9CdWlsZCArPSAkKHRoaXMpLnZhbCgpOworICAgIH0pOworCisgICAgbGlidG9hc3Rlci5zdGFydEFCdWlsZChsaWJ0b2FzdGVyLmN0eC5wcm9qZWN0QnVpbGRzVXJsLCBsaWJ0b2FzdGVyLmN0eC5wcm9qZWN0SWQsIHRvQnVpbGQsIGZ1bmN0aW9uKCl7CisgICAgICAvKiBCdWlsZCBzdGFydGVkICovCisgICAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZShsaWJ0b2FzdGVyLmN0eC5wcm9qZWN0QnVpbGRzVXJsKTsKKyAgICB9LAorICAgIGZ1bmN0aW9uKCl7CisgICAgICAvKiBCdWlsZCBzdGFydCBmYWlsZWQgKi8KKyAgICAgIC8qIFtZT0NUTyAjNzk5NV0gKi8KKyAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKGxpYnRvYXN0ZXIuY3R4LnByb2plY3RCdWlsZHNVcmwpOworICAgIH0pOworICB9KTsKKworCisgIC8qIENoYW5nZSBtYWNoaW5lIGZ1bmN0aW9uYWxpdHkgKi8KKworICBtYWNoaW5lQ2hhbmdlRm9ybVRvZ2dsZS5jbGljayhmdW5jdGlvbigpeworICAgIG1hY2hpbmVGb3JtLnNsaWRlRG93bigpOworICAgIG1hY2hpbmVOYW1lVGl0bGUuaGlkZSgpOworICAgICQodGhpcykuaGlkZSgpOworICB9KTsKKworICBtYWNoaW5lQ2hhbmdlQ2FuY2VsLmNsaWNrKGZ1bmN0aW9uKCl7CisgICAgbWFjaGluZUZvcm0uc2xpZGVVcChmdW5jdGlvbigpeworICAgICAgbWFjaGluZU5hbWVUaXRsZS5zaG93KCk7CisgICAgICBtYWNoaW5lQ2hhbmdlRm9ybVRvZ2dsZS5zaG93KCk7CisgICAgfSk7CisgIH0pOworCisgIGZ1bmN0aW9uIHVwZGF0ZU1hY2hpbmVOYW1lKG1hY2hpbmVOYW1lKXsKKyAgICBtYWNoaW5lQ2hhbmdlSW5wdXQudmFsKG1hY2hpbmVOYW1lKTsKKyAgICBtYWNoaW5lTmFtZVRpdGxlLnRleHQobWFjaGluZU5hbWUpOworICB9CisKKyAgbGlidG9hc3Rlci5tYWtlVHlwZWFoZWFkKG1hY2hpbmVDaGFuZ2VJbnB1dCwgbGlidG9hc3Rlci5jdHgubWFjaGluZXNUeXBlQWhlYWRVcmwsIHsgfSwgZnVuY3Rpb24oaXRlbSl7CisgICAgY3VycmVudE1hY2hpbmVBZGRTZWxlY3Rpb24gPSBpdGVtOworICAgIG1hY2hpbmVDaGFuZ2VCdG4ucmVtb3ZlQXR0cigiZGlzYWJsZWQiKTsKKyAgfSk7CisKKyAgbWFjaGluZUNoYW5nZUJ0bi5jbGljayhmdW5jdGlvbihlKXsKKyAgICBlLnByZXZlbnREZWZhdWx0KCk7CisgICAgaWYgKGN1cnJlbnRNYWNoaW5lQWRkU2VsZWN0aW9uLm5hbWUgPT09IHVuZGVmaW5lZCkKKyAgICAgIHJldHVybjsKKworICAgIGxpYnRvYXN0ZXIuZWRpdEN1cnJlbnRQcm9qZWN0KHsgbWFjaGluZU5hbWUgOiBjdXJyZW50TWFjaGluZUFkZFNlbGVjdGlvbi5uYW1lIH0sCisgICAgICBmdW5jdGlvbigpeworICAgICAgICAvKiBTdWNjZXNzIG1hY2hpbmUgY2hhbmdlZCAqLworICAgICAgICB1cGRhdGVNYWNoaW5lTmFtZShjdXJyZW50TWFjaGluZUFkZFNlbGVjdGlvbi5uYW1lKTsKKyAgICAgICAgbWFjaGluZUNoYW5nZUNhbmNlbC5jbGljaygpOworCisgICAgICAgIC8qIFNob3cgdGhlIGFsZXJ0IG1lc3NhZ2UgKi8KKyAgICAgICAgdmFyIG1lc3NhZ2UgPSAkKCc8c3BhbiBjbGFzcz0ibGVhZCI+WW91IGhhdmUgY2hhbmdlZCB0aGUgbWFjaGluZSB0bzogPHN0cm9uZz48c3BhbiBpZD0ibm90aWZ5LW1hY2hpbmUtbmFtZSI+PC9zcGFuPjwvc3Ryb25nPjwvc3Bhbj4nKTsKKyAgICAgICAgbWVzc2FnZS5maW5kKCIjbm90aWZ5LW1hY2hpbmUtbmFtZSIpLnRleHQoY3VycmVudE1hY2hpbmVBZGRTZWxlY3Rpb24ubmFtZSk7CisgICAgICAgIGxpYnRvYXN0ZXIuc2hvd0NoYW5nZU5vdGlmaWNhdGlvbihtZXNzYWdlKTsKKyAgICB9LAorICAgICAgZnVuY3Rpb24oKXsKKyAgICAgICAgLyogRmFpbGVkIG1hY2hpbmUgY2hhbmdlZCAqLworICAgICAgICBjb25zb2xlLmxvZygiZmFpbGVkIHRvIGNoYW5nZSBtYWNoaW5lIik7CisgICAgfSk7CisgIH0pOworCisKKyAgLyogQ2hhbmdlIHJlbGVhc2UgZnVuY3Rpb25hbGl0eSAqLworICBmdW5jdGlvbiB1cGRhdGVQcm9qZWN0UmVsZWFzZShyZWxlYXNlKXsKKyAgICByZWxlYXNlVGl0bGUudGV4dChyZWxlYXNlLmRlc2NyaXB0aW9uKTsKKyAgfQorCisgIGZ1bmN0aW9uIHVwZGF0ZVByb2plY3RSZWxlYXNlcyhyZWxlYXNlcywgY3VycmVudCl7CisgICAgZm9yICh2YXIgaSBpbiByZWxlYXNlcyl7CisgICAgICB2YXIgcmVsZWFzZU9wdGlvbiA9ICQoIjxvcHRpb24+PC9vcHRpb24+Iik7CisKKyAgICAgIHJlbGVhc2VPcHRpb24udmFsKHJlbGVhc2VzW2ldLmlkKTsKKyAgICAgIHJlbGVhc2VPcHRpb24udGV4dChyZWxlYXNlc1tpXS5kZXNjcmlwdGlvbik7CisgICAgICByZWxlYXNlT3B0aW9uLmRhdGEoJ3JlbGVhc2UnLCByZWxlYXNlc1tpXSk7CisKKyAgICAgIGlmIChyZWxlYXNlc1tpXS5pZCA9PSBjdXJyZW50LmlkKQorICAgICAgICByZWxlYXNlT3B0aW9uLmF0dHIoInNlbGVjdGVkIiwgInNlbGVjdGVkIik7CisKKyAgICAgIHJlbGVhc2VGb3JtLmNoaWxkcmVuKCJzZWxlY3QiKS5hcHBlbmQocmVsZWFzZU9wdGlvbik7CisgICAgfQorICB9CisKKyAgcmVsZWFzZUNoYW5nZUZvcm1Ub2dnbGUuY2xpY2soZnVuY3Rpb24oKXsKKyAgICByZWxlYXNlRm9ybS5zbGlkZURvd24oKTsKKyAgICByZWxlYXNlVGl0bGUuaGlkZSgpOworICAgICQodGhpcykuaGlkZSgpOworICB9KTsKKworICBjYW5jZWxSZWxlYXNlQ2hhbmdlLmNsaWNrKGZ1bmN0aW9uKGUpeworICAgIGUucHJldmVudERlZmF1bHQoKTsKKyAgICByZWxlYXNlRm9ybS5zbGlkZVVwKGZ1bmN0aW9uKCl7CisgICAgICByZWxlYXNlVGl0bGUuc2hvdygpOworICAgICAgcmVsZWFzZUNoYW5nZUZvcm1Ub2dnbGUuc2hvdygpOworICAgIH0pOworICB9KTsKKworICBmdW5jdGlvbiBjaGFuZ2VQcm9qZWN0UmVsZWFzZShyZWxlYXNlLCBsYXllcnNUb1JtKXsKKyAgICBsaWJ0b2FzdGVyLmVkaXRDdXJyZW50UHJvamVjdCh7IHByb2plY3RWZXJzaW9uIDogcmVsZWFzZS5pZCB9LAorICAgICAgZnVuY3Rpb24oKXsKKyAgICAgICAgLyogU3VjY2VzcyAqLworICAgICAgICAvKiBVcGRhdGUgbGF5ZXJzIGxpc3Qgd2l0aCBuZXcgbGF5ZXJzICovCisgICAgICAgIGxheWVyc0luUHJqTGlzdC5hZGRDbGFzcygnbXV0ZWQnKTsKKyAgICAgICAgbGlidG9hc3Rlci5nZXRQcm9qZWN0SW5mbyhsaWJ0b2FzdGVyLmN0eC5wcm9qZWN0UGFnZVVybCwKKyAgICAgICAgICAgIGZ1bmN0aW9uKHByakluZm8peworICAgICAgICAgICAgICBsYXllcnNJblByakxpc3QuY2hpbGRyZW4oKS5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgdXBkYXRlUHJvamVjdExheWVycyhwcmpJbmZvLmxheWVycyk7CisgICAgICAgICAgICAgIGxheWVyc0luUHJqTGlzdC5yZW1vdmVDbGFzcygnbXV0ZWQnKTsKKyAgICAgICAgICAgICAgcmVsZWFzZUNoYW5nZWROb3RpZmljYXRpb24ocmVsZWFzZSwgcHJqSW5mby5sYXllcnMsIGxheWVyc1RvUm0pOworICAgICAgICB9KTsKKyAgICAgICAgdXBkYXRlUHJvamVjdFJlbGVhc2UocmVsZWFzZSk7CisgICAgICAgIGNhbmNlbFJlbGVhc2VDaGFuZ2UuY2xpY2soKTsKKyAgICB9KTsKKyAgfQorCisgIC8qIENyZWF0ZSBhIG5vdGlmaWNhdGlvbiB0byBzaG93IHRoZSBjaGFuZ2VzIHRvIHRoZSBsYXllciBjb25maWd1cmF0aW9uCisgICAqIGNhdXNlZCBieSBjaGFuZ2luZyBhIHJlbGVhc2UuCisgICAqLworCisgIGZ1bmN0aW9uIHJlbGVhc2VDaGFuZ2VkTm90aWZpY2F0aW9uKHJlbGVhc2UsIGxheWVycywgbGF5ZXJzVG9SbSl7CisKKyAgICB2YXIgbWVzc2FnZTsKKworICAgIGlmIChsYXllcnMubGVuZ3RoID09PSAwICYmIGxheWVyc1RvUm0ubGVuZ3RoID09PSAwKXsKKyAgICAgIG1lc3NhZ2UgPSAkKCc8c3Bhbj48c3BhbiBjbGFzcz0ibGVhZCI+WW91IGhhdmUgY2hhbmdlZCB0aGUgcHJvamVjdCByZWxlYXNlIHRvOiA8c3Ryb25nPjxzcGFuIGlkPSJub3RpZnktcmVsZWFzZS1uYW1lIj48L3NwYW4+PC9zdHJvbmc+LicpOworICAgICAgbWVzc2FnZS5maW5kKCIjbm90aWZ5LXJlbGVhc2UtbmFtZSIpLnRleHQocmVsZWFzZS5kZXNjcmlwdGlvbik7CisgICAgICBsaWJ0b2FzdGVyLnNob3dDaGFuZ2VOb3RpZmljYXRpb24obWVzc2FnZSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogQ3JlYXRlIHRoZSB3aGl0ZXNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGxheWVycyByZW1vdmVkICovCisgICAgdmFyIGxheWVyc0RlbExpc3QgPSAiIjsKKworICAgIGxheWVyc1RvUm0ubWFwKGZ1bmN0aW9uKGxheWVyLCBpKXsKKyAgICAgIGxheWVyc0RlbExpc3QgKz0gbGF5ZXIubmFtZTsKKyAgICAgIGlmIChsYXllcnNUb1JtW2krMV0gIT09IHVuZGVmaW5lZCkKKyAgICAgICAgbGF5ZXJzRGVsTGlzdCArPSAnLCAnOworICAgIH0pOworCisgICAgbWVzc2FnZSA9ICQoJzxzcGFuPjxzcGFuIGNsYXNzPSJsZWFkIj5Zb3UgaGF2ZSBjaGFuZ2VkIHRoZSBwcm9qZWN0IHJlbGVhc2UgdG86IDxzdHJvbmc+PHNwYW4gaWQ9Im5vdGlmeS1yZWxlYXNlLW5hbWUiPjwvc3Bhbj48L3N0cm9uZz4uIFRoaXMgaGFzIGNhdXNlZCB0aGUgZm9sbG93aW5nIGNoYW5nZXMgaW4geW91ciBwcm9qZWN0IGxheWVyczo8L3NwYW4+PHVsIGlkPSJub3RpZnktbGF5ZXJzLWNoYW5nZWQtbGlzdCI+PC91bD48L3NwYW4+Jyk7CisKKyAgICB2YXIgY2hhbmdlZExpc3QgPSBtZXNzYWdlLmZpbmQoIiNub3RpZnktbGF5ZXJzLWNoYW5nZWQtbGlzdCIpOworCisgICAgbWVzc2FnZS5maW5kKCIjbm90aWZ5LXJlbGVhc2UtbmFtZSIpLnRleHQocmVsZWFzZS5kZXNjcmlwdGlvbik7CisKKyAgICAvKiBNYW51YWxseSBjb25zdHJ1Y3QgdGhlIGxpc3QgaXRlbSBmb3IgY2hhbmdlZCBsYXllcnMgKi8KKyAgICB2YXIgbGkgPSAnPGxpPjxzdHJvbmc+JytsYXllcnMubGVuZ3RoKyc8L3N0cm9uZz4gbGF5ZXJzIGNoYW5nZWQgdG8gdGhlIDxzdHJvbmc+JytyZWxlYXNlLm5hbWUrJzwvc3Ryb25nPiByZWxlYXNlOiAnOworICAgIGZvciAodmFyIGkgaW4gbGF5ZXJzKXsKKyAgICAgIGxpICs9ICc8YSBocmVmPScrbGF5ZXJzW2ldLmxheWVyZGV0YWlsdXJsKyc+JytsYXllcnNbaV0ubmFtZSsnPC9hPic7CisgICAgICBpZiAoaSAhPT0gMCkKKyAgICAgICAgbGkgKz0gJywgJzsKKyAgICB9CisKKyAgICBjaGFuZ2VkTGlzdC5hcHBlbmQoJChsaSkpOworCisgICAgLyogTGF5ZXJzIHJlbW92ZWQgKi8KKyAgICBpZiAobGF5ZXJzVG9SbSAmJiBsYXllcnNUb1JtLmxlbmd0aCA+IDApeworICAgICAgaWYgKGxheWVyc1RvUm0ubGVuZ3RoID09IDEpCisgICAgICAgIGxpID0gJzxsaT48c3Ryb25nPjE8L3N0cm9uZz4gbGF5ZXIgZGVsZXRlZDogJytsYXllcnNUb1JtWzBdLm5hbWUrJzwvbGk+JzsKKyAgICAgIGVsc2UKKyAgICAgICAgbGkgPSAnPGxpPjxzdHJvbmc+JytsYXllcnNUb1JtLmxlbmd0aCsnPC9zdHJvbmc+IGxheWVycyBkZWxldGVkOiAnK2xheWVyc0RlbExpc3QrJzwvbGk+JzsKKworICAgICAgY2hhbmdlZExpc3QuYXBwZW5kKCQobGkpKTsKKyAgICB9CisKKyAgICBsaWJ0b2FzdGVyLnNob3dDaGFuZ2VOb3RpZmljYXRpb24obWVzc2FnZSk7CisgIH0KKworICAvKiBTaG93IHRoZSBtb2RhbCBkaWFsb2cgd2hpY2ggZ2l2ZXMgdGhlIG9wdGlvbiB0byByZW1vdmUgbGF5ZXJzIHdoaWNoCisgICAqIGFyZW4ndCBjb21wYXRpYmxlIHdpdGggdGhlIHByb3Bvc2VkIHJlbGVhc2UKKyAgICovCisgIGZ1bmN0aW9uIHNob3dSZWxlYXNlTGF5ZXJDaGFuZ2VNb2RhbChyZWxlYXNlLCBsYXllcnMpeworICAgIHZhciBsYXllcnNUb1JtTGlzdCA9IHJlbGVhc2VNb2RhbC5maW5kKCIjbGF5ZXJzLXRvLXJlbW92ZS1saXN0Iik7CisgICAgbGF5ZXJzVG9SbUxpc3QudGV4dCgiIik7CisKKyAgICByZWxlYXNlTW9kYWwuZmluZCgiLnByb3Bvc2VkLXJlbGVhc2UtY2hhbmdlLW5hbWUiKS50ZXh0KHJlbGVhc2UuZGVzY3JpcHRpb24pOworICAgIHJlbGVhc2VNb2RhbC5kYXRhKCJsYXllcnMiLCBsYXllcnMpOworICAgIHJlbGVhc2VNb2RhbC5kYXRhKCJyZWxlYXNlIiwgcmVsZWFzZSk7CisKKyAgICBmb3IgKHZhciBpIGluIGxheWVycyl7CisgICAgICBsYXllcnNUb1JtTGlzdC5hcHBlbmQoJCgiPGxpPjwvbGk+IikudGV4dChsYXllcnNbaV0ubmFtZSkpOworICAgIH0KKyAgICByZWxlYXNlTW9kYWwubW9kYWwoJ3Nob3cnKTsKKyAgfQorCisgICQoIiNjaGFuZ2UtcmVsZWFzZS1idG4iKS5jbGljayhmdW5jdGlvbihlKXsKKyAgICBlLnByZXZlbnREZWZhdWx0KCk7CisKKyAgICB2YXIgbmV3UmVsZWFzZSA9IHJlbGVhc2VGb3JtLmZpbmQoIm9wdGlvbjpzZWxlY3RlZCIpLmRhdGEoJ3JlbGVhc2UnKTsKKworICAgICQuZ2V0SlNPTihjdHgudGVzdFJlbGVhc2VDaGFuZ2VVcmwsCisgICAgICB7IG5ld19yZWxlYXNlX2lkOiBuZXdSZWxlYXNlLmlkIH0sCisgICAgICBmdW5jdGlvbihsYXllcnMpIHsKKyAgICAgICAgaWYgKGxheWVycy5yb3dzLmxlbmd0aCA9PT0gMCl7CisgICAgICAgICAgLyogTm8gbGF5ZXJzIHRvIGNoYW5nZSBmb3IgdGhpcyByZWxlYXNlICovCisgICAgICAgICAgY2hhbmdlUHJvamVjdFJlbGVhc2UobmV3UmVsZWFzZSwgW10pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNob3dSZWxlYXNlTGF5ZXJDaGFuZ2VNb2RhbChuZXdSZWxlYXNlLCBsYXllcnMucm93cyk7CisgICAgICAgIH0KKyAgICB9KTsKKyAgfSk7CisKKyAgLyogUmVsZWFzZSBjaGFuZ2UgbW9kYWwgYWNjZXB0ICovCisgICQoIiNjaGFuZ2UtcmVsZWFzZS1hbmQtcm0tbGF5ZXJzIikuY2xpY2soZnVuY3Rpb24oKXsKKyAgICB2YXIgbGF5ZXJzID0gcmVsZWFzZU1vZGFsLmRhdGEoImxheWVycyIpOworICAgIHZhciByZWxlYXNlID0gIHJlbGVhc2VNb2RhbC5kYXRhKCJyZWxlYXNlIik7CisKKyAgICBjaGFuZ2VQcm9qZWN0UmVsZWFzZShyZWxlYXNlLCBsYXllcnMpOworICB9KTsKKworfQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9qcy90YWJsZS5qcyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvanMvdGFibGUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE4MDM0ZAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvanMvdGFibGUuanMKQEAgLTAsMCArMSw1NTQgQEAKKyd1c2Ugc3RyaWN0JzsKKworZnVuY3Rpb24gdGFibGVJbml0KGN0eCl7CisKKyAgaWYgKGN0eC51cmwubGVuZ3RoID09PSAwKSB7CisgICAgdGhyb3cgIk5vIHVybCBzdXBwbGllZCBmb3IgcmV0cmVpdmluZyBkYXRhIjsKKyAgfQorCisgIHZhciB0YWJsZUNocm9tZURvbmUgPSBmYWxzZTsKKyAgdmFyIHRhYmxlVG90YWwgPSAwOworCisgIHZhciB0YWJsZVBhcmFtcyA9IHsKKyAgICBsaW1pdCA6IDI1LAorICAgIHBhZ2UgOiAxLAorICAgIG9yZGVyYnkgOiBudWxsLAorICAgIGZpbHRlciA6IG51bGwsCisgICAgc2VhcmNoIDogbnVsbCwKKyAgfTsKKworICB2YXIgZGVmYXVsdEhpZGRlbkNvbHMgPSBbXTsKKworICB2YXIgdGFibGUgPSAgJCgiIyIgKyBjdHgudGFibGVOYW1lKTsKKworICAvKiBpZiB3ZSdyZSBsb2FkaW5nIGNsZWFuIGZyb20gYSB1cmwgdXNlIGl0J3MgcGFyYW1ldGVycyBhcyB0aGUgZGVmYXVsdCAqLworICB2YXIgdXJsUGFyYW1zID0gbGlidG9hc3Rlci5wYXJzZVVybFBhcmFtcygpOworCisgIC8qIE1lcmdlIHRoZSB0YWJsZVBhcmFtcyBhbmQgdXJsUGFyYW1zIG9iamVjdCBwcm9wZXJ0aWVzICAqLworICB0YWJsZVBhcmFtcyA9ICQuZXh0ZW5kKHRhYmxlUGFyYW1zLCB1cmxQYXJhbXMpOworCisgIC8qIE5vdyBmaXggdGhlIHR5cGVzIHRoYXQgLmV4dGVuZCBjaGFuZ2VkIGZvciB1cyAqLworICB0YWJsZVBhcmFtcy5saW1pdCA9IE51bWJlcih0YWJsZVBhcmFtcy5saW1pdCk7CisgIHRhYmxlUGFyYW1zLnBhZ2UgPSBOdW1iZXIodGFibGVQYXJhbXMucGFnZSk7CisKKyAgbG9hZERhdGEodGFibGVQYXJhbXMpOworCisgIHdpbmRvdy5vbnBvcHN0YXRlID0gZnVuY3Rpb24oZXZlbnQpeworICAgIGlmIChldmVudC5zdGF0ZSl7CisgICAgICB0YWJsZVBhcmFtcyA9IGV2ZW50LnN0YXRlLnRhYmxlUGFyYW1zOworICAgICAgLyogV2Ugc2tpcCBsb2FkRGF0YSBhbmQganVzdCB1cGRhdGUgdGhlIHRhYmxlICovCisgICAgICB1cGRhdGVUYWJsZShldmVudC5zdGF0ZS50YWJsZURhdGEpOworICAgIH0KKyAgfTsKKworICBmdW5jdGlvbiBsb2FkRGF0YSh0YWJsZVBhcmFtcyl7CisgICAgJC5hamF4KHsKKyAgICAgICAgdHlwZTogIkdFVCIsCisgICAgICAgIHVybDogY3R4LnVybCwKKyAgICAgICAgZGF0YTogdGFibGVQYXJhbXMsCisgICAgICAgIGhlYWRlcnM6IHsgJ1gtQ1NSRlRva2VuJyA6ICQuY29va2llKCdjc3JmdG9rZW4nKX0sCisgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHRhYmxlRGF0YSkgeworICAgICAgICAgIHVwZGF0ZVRhYmxlKHRhYmxlRGF0YSk7CisgICAgICAgICAgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKHsKKyAgICAgICAgICAgICAgdGFibGVEYXRhOiB0YWJsZURhdGEsCisgICAgICAgICAgICAgIHRhYmxlUGFyYW1zOiB0YWJsZVBhcmFtcworICAgICAgICAgIH0sIG51bGwsIGxpYnRvYXN0ZXIuZHVtcHNVcmxQYXJhbXModGFibGVQYXJhbXMpKTsKKyAgICAgICAgfQorICAgIH0pOworICB9CisKKyAgZnVuY3Rpb24gdXBkYXRlVGFibGUodGFibGVEYXRhKSB7CisgICAgdmFyIHRhYmxlQm9keSA9IHRhYmxlLmNoaWxkcmVuKCJ0Ym9keSIpOworICAgIHZhciBwYWdpbmF0aW9uID0gJCgnI3BhZ2luYXRpb24tJytjdHgudGFibGVOYW1lKTsKKyAgICB2YXIgcGFnaW5hdGlvbkJ0bnMgPSBwYWdpbmF0aW9uLmNoaWxkcmVuKCd1bCcpOworICAgIHZhciB0YWJsZUNvbnRhaW5lciA9ICQoIiN0YWJsZS1jb250YWluZXItIitjdHgudGFibGVOYW1lKTsKKworICAgIHRhYmxlQ29udGFpbmVyLmNzcygidmlzaWJpbGl0eSIsICJoaWRkZW4iKTsKKyAgICAvKiBUbyBhdm9pZCBwYWdlIHJlLWxheW91dCBmbGlja2VyIHdoZW4gcGFnaW5nIHNldCBmaXhlZCBoZWlnaHQgKi8KKyAgICB0YWJsZS5jc3MoInBhZGRpbmctYm90dG9tIiwgdGFibGUuaGVpZ2h0KCkpOworCisgICAgLyogUmVzZXQgdGFibGUgY29tcG9uZW50cyAqLworICAgIHRhYmxlQm9keS5odG1sKCIiKTsKKyAgICBwYWdpbmF0aW9uQnRucy5odG1sKCIiKTsKKworICAgIGlmICh0YWJsZVBhcmFtcy5zZWFyY2gpCisgICAgICAkKCcucmVtb3ZlLXNlYXJjaC1idG4tJytjdHgudGFibGVOYW1lKS5zaG93KCk7CisgICAgZWxzZQorICAgICAgJCgnLnJlbW92ZS1zZWFyY2gtYnRuLScrY3R4LnRhYmxlTmFtZSkuaGlkZSgpOworCisgICAgJCgnLnRhYmxlLWNvdW50LScgKyBjdHgudGFibGVOYW1lKS50ZXh0KHRhYmxlRGF0YS50b3RhbCk7CisgICAgdGFibGVUb3RhbCA9IHRhYmxlRGF0YS50b3RhbDsKKworICAgIGlmICh0YWJsZURhdGEudG90YWwgPT09IDApeworICAgICAgdGFibGVDb250YWluZXIuaGlkZSgpOworICAgICAgLyogSWYgd2Ugd2VyZSBzZWFyY2hpbmcgc2hvdyB0aGUgbmV3IHNlYXJjaCBiYXIgYW5kIHJldHVybiAqLworICAgICAgaWYgKHRhYmxlUGFyYW1zLnNlYXJjaCl7CisgICAgICAgICQoIiNuZXctc2VhcmNoLWlucHV0LSIrY3R4LnRhYmxlTmFtZSkudmFsKHRhYmxlUGFyYW1zLnNlYXJjaCk7CisgICAgICAgICQoIiNuby1yZXN1bHRzLSIrY3R4LnRhYmxlTmFtZSkuc2hvdygpOworICAgICAgfQorICAgICAgdGFibGUudHJpZ2dlcigidGFibGUtZG9uZSIsIFt0YWJsZURhdGEudG90YWwsIHRhYmxlUGFyYW1zXSk7CisKKyAgICAgIHJldHVybjsKKworICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gY2x1dHRlciB0aGUgcGxhY2Ugd2l0aCB0aGUgdGFibGUgY2hyb21lIGlmIHRoZXJlCisgICAgICogYXJlIG9ubHkgYSBmZXcgcmVzdWx0cyAqLworICAgIH0gZWxzZSBpZiAodGFibGVEYXRhLnRvdGFsIDw9IDEwICYmCisgICAgICAgICAgICAgICAhdGFibGVQYXJhbXMuZmlsdGVyICYmCisgICAgICAgICAgICAgICAhdGFibGVQYXJhbXMuc2VhcmNoKXsKKyAgICAgICQoIiN0YWJsZS1jaHJvbWUtIitjdHgudGFibGVOYW1lKS5oaWRlKCk7CisgICAgICBwYWdpbmF0aW9uLmhpZGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgdGFibGVDb250YWluZXIuc2hvdygpOworICAgICAgJCgiI25vLXJlc3VsdHMtIitjdHgudGFibGVOYW1lKS5oaWRlKCk7CisgICAgfQorCisgICAgc2V0dXBUYWJsZUNocm9tZSh0YWJsZURhdGEpOworCisgICAgLyogQWRkIHRhYmxlIGRhdGEgcm93cyAqLworICAgIHZhciBjb2x1bW5faW5kZXg7CisgICAgZm9yICh2YXIgaSBpbiB0YWJsZURhdGEucm93cyl7CisgICAgICAvKiBvbmx5IGRpc3BsYXkgaWYgdGhlIGNvbHVtbiBpcyBkaXNwbGF5LWFibGUgKi8KKyAgICAgIHZhciByb3cgPSAkKCI8dHI+PC90cj4iKTsKKyAgICAgIGNvbHVtbl9pbmRleCA9IC0xOworICAgICAgZm9yICh2YXIga2V5X2ogaW4gdGFibGVEYXRhLnJvd3NbaV0peworCisgICAgICAgIC8qIGlmIHdlIGhhdmUgYSBzdGF0aWM6IHZlcnNpb24gb2YgYSBrZXksIHByZWZlciB0aGUgc3RhdGljOiB2ZXJzaW9uIGZvciByZW5kZXJpbmcgKi8KKyAgICAgICAgdmFyIG9yaWdfa2V5X2ogPSBrZXlfajsKKworICAgICAgICBpZiAoa2V5X2ouaW5kZXhPZigic3RhdGljOiIpID09PSAwKSB7CisgICAgICAgICAgaWYgKGtleV9qLnN1YnN0cigic3RhdGljOiIubGVuZ3RoKSBpbiB0YWJsZURhdGEucm93c1tpXSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICAgIG9yaWdfa2V5X2ogPSBrZXlfai5zdWJzdHIoInN0YXRpYzoiLmxlbmd0aCkKKyAgICAgICAgfSBlbHNlIGlmICgoInN0YXRpYzoiICsga2V5X2opIGluIHRhYmxlRGF0YS5yb3dzW2ldKSB7CisgICAgICAgICAga2V5X2ogPSAic3RhdGljOiIgKyBrZXlfajsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHdlIHNraXAgb3ZlciB1bi1kaXNwbGF5YWJsZSBjb2x1bW4gZW50cmllcyAqLworICAgICAgICBjb2x1bW5faW5kZXggKz0gMTsKKyAgICAgICAgaWYgKCEgdGFibGVEYXRhLmNvbHVtbnNbY29sdW1uX2luZGV4XS5kaXNwbGF5YWJsZSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHRkID0gJCgiPHRkPjwvdGQ+Iik7CisgICAgICAgIHRkLnByb3AoImNsYXNzIiwgb3JpZ19rZXlfaik7CisgICAgICAgIGlmICh0YWJsZURhdGEucm93c1tpXVtrZXlfal0peworICAgICAgICAgIHRkLmh0bWwodGFibGVEYXRhLnJvd3NbaV1ba2V5X2pdKTsKKyAgICAgICAgfQorICAgICAgICByb3cuYXBwZW5kKHRkKTsKKyAgICAgIH0KKyAgICAgIHRhYmxlQm9keS5hcHBlbmQocm93KTsKKworICAgICAgLyogSWYgd2UgaGF2ZSBsYXllcmJ0bnMgdGhlbiBpbml0aWFsaXNlIHRoZW0gKi8KKyAgICAgIGxheWVyQnRuc0luaXQoY3R4KTsKKworICAgICAgLyogSWYgd2UgaGF2ZSBwb3BvdmVycyBpbml0aWFsaXNlIHRoZW0gbm93ICovCisgICAgICAkKCd0ZCA+IGEuYnRuJykucG9wb3Zlcih7CisgICAgICAgIGh0bWw6dHJ1ZSwKKyAgICAgICAgcGxhY2VtZW50OidsZWZ0JywKKyAgICAgICAgY29udGFpbmVyOidib2R5JywKKyAgICAgICAgdHJpZ2dlcjonbWFudWFsJworICAgICAgfSkuY2xpY2soZnVuY3Rpb24oZSl7CisgICAgICAgICQoJ3RkID4gYS5idG4nKS5ub3QodGhpcykucG9wb3ZlcignaGlkZScpOworICAgICAgICAvKiBpZGVhbGx5IHdlIHdvdWxkIHVzZSAndG9nZ2xlJyBoZXJlCisgICAgICAgICAqIGJ1dCBpdCBzZWVtcyBidWdneSBpbiBvdXIgQm9vdHN0cmFwIHZlcnNpb24KKyAgICAgICAgICovCisgICAgICAgICQodGhpcykucG9wb3Zlcignc2hvdycpOworICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOworICAgICAgfSk7CisKKyAgICAgIC8qIGVuYWJsZSBoZWxwIGluZm9ybWF0aW9uIHRvb2x0aXAgKi8KKyAgICAgICQoIi5nZXQtaGVscCIpLnRvb2x0aXAoe2NvbnRhaW5lcjonYm9keScsIGh0bWw6dHJ1ZSwgZGVsYXk6e3Nob3c6MzAwfX0pOworICAgIH0KKworICAgIC8qIFNldHVwIHRoZSBwYWdpbmF0aW9uIGNvbnRyb2xzICovCisKKyAgICB2YXIgc3RhcnQgPSB0YWJsZVBhcmFtcy5wYWdlIC0gMjsKKyAgICB2YXIgZW5kID0gdGFibGVQYXJhbXMucGFnZSArIDI7CisgICAgdmFyIG51bVBhZ2VzID0gTWF0aC5jZWlsKHRhYmxlRGF0YS50b3RhbC90YWJsZVBhcmFtcy5saW1pdCk7CisKKyAgICBpZiAobnVtUGFnZXMgPiAgMSl7CisgICAgICBpZiAodGFibGVQYXJhbXMucGFnZSA8IDMpCisgICAgICAgIGVuZCA9IDU7CisKKyAgICAgIGZvciAodmFyIHBhZ2VfaT0xOyBwYWdlX2kgPD0gbnVtUGFnZXM7ICBwYWdlX2krKyl7CisgICAgICAgIGlmIChwYWdlX2kgPj0gc3RhcnQgJiYgcGFnZV9pIDw9IGVuZCl7CisgICAgICAgICAgdmFyIGJ0biA9ICQoJzxsaT48YSBocmVmPSIjIiBjbGFzcz0icGFnZSI+JytwYWdlX2krJzwvYT48L2xpPicpOworCisgICAgICAgICAgaWYgKHBhZ2VfaSA9PT0gdGFibGVQYXJhbXMucGFnZSl7CisgICAgICAgICAgICBidG4uYWRkQ2xhc3MoImFjdGl2ZSIpOworICAgICAgICAgIH0KKworICAgICAgICAgIC8qIEFkZCB0aGUgY2xpY2sgaGFuZGxlciAqLworICAgICAgICAgIGJ0bi5jbGljayhwYWdlQnV0dG9uQ2xpY2tlZCk7CisgICAgICAgICAgcGFnaW5hdGlvbkJ0bnMuYXBwZW5kKGJ0bik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBsb2FkQ29sdW1uc1ByZWZlcmVuY2UoKTsKKworICAgIHRhYmxlLmNzcygicGFkZGluZy1ib3R0b20iLCAwKTsKKyAgICB0YWJsZUNvbnRhaW5lci5jc3MoInZpc2liaWxpdHkiLCAidmlzaWJsZSIpOworCisgICAgdGFibGUudHJpZ2dlcigidGFibGUtZG9uZSIsIFt0YWJsZURhdGEudG90YWwsIHRhYmxlUGFyYW1zXSk7CisgIH0KKworICBmdW5jdGlvbiBzZXR1cFRhYmxlQ2hyb21lKHRhYmxlRGF0YSl7CisgICAgaWYgKHRhYmxlQ2hyb21lRG9uZSA9PT0gdHJ1ZSkKKyAgICAgIHJldHVybjsKKworICAgIHZhciB0YWJsZUhlYWRSb3cgPSB0YWJsZS5maW5kKCJ0aGVhZCIpOworICAgIHZhciBlZGl0Q29sTWVudSA9ICQoIiN0YWJsZS1jaHJvbWUtIitjdHgudGFibGVOYW1lKS5maW5kKCIuZWRpdGNvbCIpOworCisgICAgdGFibGVIZWFkUm93Lmh0bWwoIiIpOworICAgIGVkaXRDb2xNZW51Lmh0bWwoIiIpOworCisgICAgaWYgKCF0YWJsZVBhcmFtcy5vcmRlcmJ5ICYmIHRhYmxlRGF0YS5kZWZhdWx0X29yZGVyYnkpeworICAgICAgdGFibGVQYXJhbXMub3JkZXJieSA9IHRhYmxlRGF0YS5kZWZhdWx0X29yZGVyYnk7CisgICAgfQorCisgICAgLyogQWRkIHRhYmxlIGhlYWRlciBhbmQgY29sdW1uIHRvZ2dsZSBtZW51ICovCisgICAgZm9yICh2YXIgaSBpbiB0YWJsZURhdGEuY29sdW1ucyl7CisgICAgICB2YXIgY29sID0gdGFibGVEYXRhLmNvbHVtbnNbaV07CisgICAgICBpZiAoY29sLmRpc3BsYXlhYmxlID09PSBmYWxzZSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHZhciBoZWFkZXIgPSAkKCI8dGg+PC90aD4iKTsKKyAgICAgIGhlYWRlci5wcm9wKCJjbGFzcyIsIGNvbC5maWVsZF9uYW1lKTsKKworICAgICAgLyogU2V0dXAgdGhlIGhlbHAgdGV4dCAqLworICAgICAgaWYgKGNvbC5oZWxwX3RleHQubGVuZ3RoID4gMCkgeworICAgICAgICB2YXIgaGVscF90ZXh0ID0gJCgnPGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCI+IDwvaT4nKTsKKyAgICAgICAgaGVscF90ZXh0LnRvb2x0aXAoe3RpdGxlOiBjb2wuaGVscF90ZXh0fSk7CisgICAgICAgIGhlYWRlci5hcHBlbmQoaGVscF90ZXh0KTsKKyAgICAgIH0KKworICAgICAgLyogU2V0dXAgdGhlIG9yZGVyYWJsZSB0aXRsZSAqLworICAgICAgaWYgKGNvbC5vcmRlcmFibGUpIHsKKyAgICAgICAgdmFyIHRpdGxlID0gJCgnPGEgaHJlZj1cIiNcIiA+PC9hPicpOworCisgICAgICAgIHRpdGxlLmRhdGEoJ2ZpZWxkLW5hbWUnLCBjb2wuZmllbGRfbmFtZSk7CisgICAgICAgIHRpdGxlLnRleHQoY29sLnRpdGxlKTsKKyAgICAgICAgdGl0bGUuY2xpY2soc29ydENvbHVtbkNsaWNrZWQpOworCisgICAgICAgIGhlYWRlci5hcHBlbmQodGl0bGUpOworCisgICAgICAgIGhlYWRlci5hcHBlbmQoJyA8aSBjbGFzcz0iaWNvbi1jYXJldC1kb3duIiBzdHlsZT0iZGlzcGxheTpub25lIj48L2k+Jyk7CisgICAgICAgIGhlYWRlci5hcHBlbmQoJyA8aSBjbGFzcz0iaWNvbi1jYXJldC11cCIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PC9pPicpOworCisgICAgICAgIC8qIElmIHdlJ3JlIGN1cnJlbnRseSBvcmRlcmVkIHNldHVwIHRoZSB2aXN1YWwgaW5kaWNhdG9yICovCisgICAgICAgIGlmIChjb2wuZmllbGRfbmFtZSA9PT0gdGFibGVQYXJhbXMub3JkZXJieSB8fAorICAgICAgICAgICctJyArIGNvbC5maWVsZF9uYW1lID09PSB0YWJsZVBhcmFtcy5vcmRlcmJ5KXsKKyAgICAgICAgICBoZWFkZXIuY2hpbGRyZW4oImEiKS5hZGRDbGFzcygic29ydGVkIik7CisKKyAgICAgICAgICBpZiAodGFibGVQYXJhbXMub3JkZXJieS5pbmRleE9mKCItIikgPT09IC0xKXsKKyAgICAgICAgICAgIGhlYWRlci5maW5kKCcuaWNvbi1jYXJldC1kb3duJykuc2hvdygpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBoZWFkZXIuZmluZCgnLmljb24tY2FyZXQtdXAnKS5zaG93KCk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIE5vdCBvcmRlcmFibGUgKi8KKyAgICAgICAgaGVhZGVyLmFkZENsYXNzKCJtdXRlZCIpOworICAgICAgICBoZWFkZXIuY3NzKCJmb250LXdlaWdodCIsICJub3JtYWwiKTsKKyAgICAgICAgaGVhZGVyLmFwcGVuZChjb2wudGl0bGUrJyAnKTsKKyAgICAgIH0KKworICAgICAgLyogU2V0dXAgdGhlIGZpbHRlciBidXR0b24gKi8KKyAgICAgIGlmIChjb2wuZmlsdGVyX25hbWUpeworICAgICAgICB2YXIgZmlsdGVyQnRuID0gJCgnPGEgaHJlZj0iIyIgcm9sZT0iYnV0dG9uIiBjbGFzcz0icHVsbC1yaWdodCBidG4gYnRuLW1pbmkiIGRhdGEtdG9nZ2xlPSJtb2RhbCI+PGkgY2xhc3M9Imljb24tZmlsdGVyIGZpbHRlcmVkIj48L2k+PC9hPicpOworCisgICAgICAgIGZpbHRlckJ0bi5kYXRhKCdmaWx0ZXItbmFtZScsIGNvbC5maWx0ZXJfbmFtZSk7CisgICAgICAgIGZpbHRlckJ0bi5wcm9wKCdpZCcsIGNvbC5maWx0ZXJfbmFtZSk7CisgICAgICAgIGZpbHRlckJ0bi5jbGljayhmaWx0ZXJPcGVuQ2xpY2tlZCk7CisKKyAgICAgICAgLyogSWYgd2UncmUgY3VycmVudGx5IGJlaW5nIGZpbHRlcmVkIHNldHVwIHRoZSB2aXNpYWwgaW5kaWNhdG9yICovCisgICAgICAgIGlmICh0YWJsZVBhcmFtcy5maWx0ZXIgJiYKKyAgICAgICAgICAgIHRhYmxlUGFyYW1zLmZpbHRlci5tYXRjaCgnXicrY29sLmZpbHRlcl9uYW1lKSkgeworCisgICAgICAgICAgICBmaWx0ZXJCdG5BY3RpdmUoZmlsdGVyQnRuLCB0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBoZWFkZXIuYXBwZW5kKGZpbHRlckJ0bik7CisgICAgICB9CisKKyAgICAgIC8qIERvbmUgbWFraW5nIHRoZSBoZWFkZXIgbm93IGFkZCBpdCAqLworICAgICAgdGFibGVIZWFkUm93LmFwcGVuZChoZWFkZXIpOworCisgICAgICAvKiBOb3cgc2V0dXAgdGhlIGNoZWNrYm94IHN0YXRlIGFuZCBjbGljayBoYW5kbGVyICovCisgICAgICB2YXIgdG9nZ2xlciA9ICQoJzxsaT48bGFiZWwgY2xhc3M9ImNoZWNrYm94Ij4nK2NvbC50aXRsZSsnPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iY2hlY2tib3gtJysgY29sLmZpZWxkX25hbWUgKyciIGNsYXNzPSJjb2wtdG9nZ2xlIiB2YWx1ZT0iJytjb2wuZmllbGRfbmFtZSsnIiAvPjwvbGFiZWw+PC9saT4nKTsKKworICAgICAgdmFyIHRvZ2dsZXJJbnB1dCA9IHRvZ2dsZXIuZmluZCgiaW5wdXQiKTsKKworICAgICAgdG9nZ2xlcklucHV0LmF0dHIoImNoZWNrZWQiLCJjaGVja2VkIik7CisKKyAgICAgIC8qIElmIHdlIGNhbiBoaWRlIHRoZSBjb2x1bW4gZW5hYmxlIHRoZSBjaGVja2JveCBhY3Rpb24gKi8KKyAgICAgIGlmIChjb2wuaGlkZWFibGUpeworICAgICAgICB0b2dnbGVySW5wdXQuY2xpY2soY29sVG9nZ2xlQ2xpY2tlZCk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0b2dnbGVyLmZpbmQoImxhYmVsIikuYWRkQ2xhc3MoIm11dGVkIik7CisgICAgICAgIHRvZ2dsZXJJbnB1dC5hdHRyKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOworICAgICAgfQorCisgICAgICBpZiAoY29sLmhpZGRlbikgeworICAgICAgICBkZWZhdWx0SGlkZGVuQ29scy5wdXNoKGNvbC5maWVsZF9uYW1lKTsKKyAgICAgIH0KKworICAgICAgZWRpdENvbE1lbnUuYXBwZW5kKHRvZ2dsZXIpOworICAgIH0gLyogRW5kIGZvciBlYWNoIGNvbHVtbiAqLworCisgICAgdGFibGVDaHJvbWVEb25lID0gdHJ1ZTsKKyAgfQorCisgIC8qIFRvZ2dsZXMgdGhlIGFjdGl2ZSBzdGF0ZSBvZiB0aGUgZmlsdGVyIGJ1dHRvbiAqLworICBmdW5jdGlvbiBmaWx0ZXJCdG5BY3RpdmUoZmlsdGVyQnRuLCBhY3RpdmUpeworICAgIGlmIChhY3RpdmUpIHsKKyAgICAgIGZpbHRlckJ0bi5hZGRDbGFzcygiYnRuLXByaW1hcnkiKTsKKworICAgICAgZmlsdGVyQnRuLnRvb2x0aXAoeworICAgICAgICAgIGh0bWw6IHRydWUsCisgICAgICAgICAgdGl0bGU6ICc8YnV0dG9uIGNsYXNzPSJidG4gYnRuLXNtYWxsIGJ0bi1wcmltYXJ5IiBvbkNsaWNrPVwnJCgiI2NsZWFyLWZpbHRlci1idG4tJysgY3R4LnRhYmxlTmFtZSArJyIpLmNsaWNrKCk7XCc+Q2xlYXIgZmlsdGVyPC9idXR0b24+JywKKyAgICAgICAgICBwbGFjZW1lbnQ6ICdib3R0b20nLAorICAgICAgICAgIGRlbGF5OiB7CisgICAgICAgICAgICBoaWRlOiAxNTAwLAorICAgICAgICAgICAgc2hvdzogNDAwLAorICAgICAgICAgIH0sCisgICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgZmlsdGVyQnRuLnJlbW92ZUNsYXNzKCJidG4tcHJpbWFyeSIpOworICAgICAgZmlsdGVyQnRuLnRvb2x0aXAoJ2Rlc3Ryb3knKTsKKyAgICB9CisgIH0KKworICAvKiBEaXNwbGF5IG9yIGhpZGUgdGFibGUgY29sdW1ucyBiYXNlZCBvbiB0aGUgY29va2llIHByZWZlcmVuY2Ugb3IgZGVmYXVsdHMgKi8KKyAgZnVuY3Rpb24gbG9hZENvbHVtbnNQcmVmZXJlbmNlKCl7CisgICAgdmFyIGNvb2tpZV9kYXRhID0gJC5jb29raWUoImNvbHMiKTsKKworICAgIGlmIChjb29raWVfZGF0YSkgeworICAgICAgdmFyIGNvbHNfaGlkZGVuID0gSlNPTi5wYXJzZSgkLmNvb2tpZSgiY29scyIpKTsKKworICAgICAgLyogRm9yIGVhY2ggb2YgdGhlIGNvbHVtbnMgY2hlY2sgaWYgd2Ugc2hvdWxkIGhpZGUgdGhlbQorICAgICAgICogYWxzbyB1cGRhdGUgdGhlIGNoZWNrZWQgc3RhdHVzIGluIHRoZSBFZGl0IGNvbHVtbnMgbWVudQorICAgICAgICovCisgICAgICAkKCIjIitjdHgudGFibGVOYW1lKyIgdGgiKS5lYWNoKGZ1bmN0aW9uKCl7CisgICAgICAgIGZvciAodmFyIGkgaW4gY29sc19oaWRkZW4peworICAgICAgICAgIGlmICgkKHRoaXMpLmhhc0NsYXNzKGNvbHNfaGlkZGVuW2ldKSl7CisgICAgICAgICAgICAkKCIuIitjb2xzX2hpZGRlbltpXSkuaGlkZSgpOworICAgICAgICAgICAgJCgiI2NoZWNrYm94LSIrY29sc19oaWRkZW5baV0pLnJlbW92ZUF0dHIoImNoZWNrZWQiKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogRGlzYWJsZSB0aGVzZSBjb2x1bW5zIGJ5IGRlZmF1bHQgd2hlbiB3ZSBoYXZlIG5vIGNvbHVtbnMKKyAgICAgICAgICogdXNlciBzZXR0aW5nLgorICAgICAgICAgKi8KKyAgICAgICAgZm9yICh2YXIgaSBpbiBkZWZhdWx0SGlkZGVuQ29scykgeworICAgICAgICAgICQoIi4iK2RlZmF1bHRIaWRkZW5Db2xzW2ldKS5oaWRlKCk7CisgICAgICAgICAgJCgiI2NoZWNrYm94LSIrZGVmYXVsdEhpZGRlbkNvbHNbaV0pLnJlbW92ZUF0dHIoImNoZWNrZWQiKTsKKyAgICAgICAgfQorICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHNvcnRDb2x1bW5DbGlja2VkKCl7CisKKyAgICAvKiBXZSBvbmx5IGhhdmUgb25lIHNvcnQgYXQgYSB0aW1lIHNvIHJlbW92ZSBhbnkgZXhpc3Rpbmcgc29ydCBpbmRpY2F0b3JzICovCisgICAgJCgiIyIrY3R4LnRhYmxlTmFtZSsiIHRoIC5pY29uLWNhcmV0LWRvd24iKS5oaWRlKCk7CisgICAgJCgiIyIrY3R4LnRhYmxlTmFtZSsiIHRoIC5pY29uLWNhcmV0LXVwIikuaGlkZSgpOworICAgICQoIiMiK2N0eC50YWJsZU5hbWUrIiB0aCBhIikucmVtb3ZlQ2xhc3MoInNvcnRlZCIpOworCisgICAgdmFyIGZpZWxkTmFtZSA9ICQodGhpcykuZGF0YSgnZmllbGQtbmFtZScpOworCisgICAgLyogaWYgd2UncmUgYWxyZWFkeSBzb3J0ZWQgc29ydCB0aGUgb3RoZXIgd2F5ICovCisgICAgaWYgKHRhYmxlUGFyYW1zLm9yZGVyYnkgPT09IGZpZWxkTmFtZSAmJgorICAgICAgICB0YWJsZVBhcmFtcy5vcmRlcmJ5LmluZGV4T2YoJy0nKSA9PT0gLTEpIHsKKyAgICAgIHRhYmxlUGFyYW1zLm9yZGVyYnkgPSAnLScgKyAkKHRoaXMpLmRhdGEoJ2ZpZWxkLW5hbWUnKTsKKyAgICAgICQodGhpcykucGFyZW50KCkuY2hpbGRyZW4oJy5pY29uLWNhcmV0LXVwJykuc2hvdygpOworICAgIH0gZWxzZSB7CisgICAgICB0YWJsZVBhcmFtcy5vcmRlcmJ5ID0gJCh0aGlzKS5kYXRhKCdmaWVsZC1uYW1lJyk7CisgICAgICAkKHRoaXMpLnBhcmVudCgpLmNoaWxkcmVuKCcuaWNvbi1jYXJldC1kb3duJykuc2hvdygpOworICAgIH0KKworICAgICQodGhpcykuYWRkQ2xhc3MoInNvcnRlZCIpOworCisgICAgbG9hZERhdGEodGFibGVQYXJhbXMpOworICB9CisKKyAgZnVuY3Rpb24gcGFnZUJ1dHRvbkNsaWNrZWQoZSkgeworICAgIHRhYmxlUGFyYW1zLnBhZ2UgPSBOdW1iZXIoJCh0aGlzKS50ZXh0KCkpOworICAgIGxvYWREYXRhKHRhYmxlUGFyYW1zKTsKKyAgICAvKiBTdG9wIHBhZ2UganVtcHMgd2hlbiBjbGlja2luZyBvbiAjIGxpbmtzICovCisgICAgZS5wcmV2ZW50RGVmYXVsdCgpOworICB9CisKKyAgLyogVG9nZ2xlIGEgdGFibGUgY29sdW1uICovCisgIGZ1bmN0aW9uIGNvbFRvZ2dsZUNsaWNrZWQgKCl7CisgICAgdmFyIGNvbCA9ICQodGhpcykudmFsKCk7CisgICAgdmFyIGRpc2FibGVkX2NvbHMgPSBbXTsKKworICAgIGlmICgkKHRoaXMpLnByb3AoImNoZWNrZWQiKSkgeworICAgICAgJCgiLiIrY29sKS5zaG93KCk7CisgICAgfSAgZWxzZSB7CisgICAgICAkKCIuIitjb2wpLmhpZGUoKTsKKyAgICAgIC8qIElmIHdlJ3JlIG9yZGVyZWQgYnkgdGhlIGNvbHVtbiB3ZSdyZSBoaWRpbmcgcmVtb3ZlIHRoZSBvcmRlciBieSAqLworICAgICAgaWYgKGNvbCA9PT0gdGFibGVQYXJhbXMub3JkZXJieSB8fAorICAgICAgICAgICctJyArIGNvbCA9PT0gdGFibGVQYXJhbXMub3JkZXJieSl7CisgICAgICAgIHRhYmxlUGFyYW1zLm9yZGVyYnkgPSBudWxsOworICAgICAgICBsb2FkRGF0YSh0YWJsZVBhcmFtcyk7CisgICAgICB9CisgICAgfQorCisgICAgLyogVXBkYXRlIHRoZSBjb29raWUgd2l0aCB0aGUgdW5jaGVja2VkIGNvbHVtbnMgKi8KKyAgICAkKCIuY29sLXRvZ2dsZSIpLm5vdCgiOmNoZWNrZWQiKS5tYXAoZnVuY3Rpb24oKXsKKyAgICAgIGRpc2FibGVkX2NvbHMucHVzaCgkKHRoaXMpLnZhbCgpKTsKKyAgICB9KTsKKworICAgICQuY29va2llKCJjb2xzIiwgSlNPTi5zdHJpbmdpZnkoZGlzYWJsZWRfY29scykpOworICB9CisKKyAgZnVuY3Rpb24gZmlsdGVyT3BlbkNsaWNrZWQoKXsKKyAgICB2YXIgZmlsdGVyTmFtZSA9ICQodGhpcykuZGF0YSgnZmlsdGVyLW5hbWUnKTsKKworICAgIC8qIFdlIG5lZWQgdG8gcGFzcyBpbiB0aGUgY3VycmVuIHNlYXJjaCBzbyB0aGF0IHRoZSBmaWx0ZXIgY291bnRzIHRha2UKKyAgICAgKiBpbnRvIGFjY291bnQgdGhlIGN1cnJlbnQgc2VhcmNoIGZpbHRlcgorICAgICAqLworICAgIHZhciBwYXJhbXMgPSB7CisgICAgICAnbmFtZScgOiBmaWx0ZXJOYW1lLAorICAgICAgJ3NlYXJjaCc6IHRhYmxlUGFyYW1zLnNlYXJjaCwKKyAgICAgICdjbWQnOiAnZmlsdGVyaW5mbycsCisgICAgfTsKKworICAgICQuYWpheCh7CisgICAgICAgIHR5cGU6ICJHRVQiLAorICAgICAgICB1cmw6IGN0eC51cmwsCisgICAgICAgIGRhdGE6IHBhcmFtcywKKyAgICAgICAgaGVhZGVyczogeyAnWC1DU1JGVG9rZW4nIDogJC5jb29raWUoJ2NzcmZ0b2tlbicpfSwKKyAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGZpbHRlckRhdGEpIHsKKyAgICAgICAgICB2YXIgZmlsdGVyQWN0aW9uUmFkaW9zID0gJCgnI2ZpbHRlci1hY3Rpb25zLScrY3R4LnRhYmxlTmFtZSk7CisKKyAgICAgICAgICAkKCcjZmlsdGVyLW1vZGFsLXRpdGxlLScrY3R4LnRhYmxlTmFtZSkudGV4dChmaWx0ZXJEYXRhLnRpdGxlKTsKKworICAgICAgICAgIGZpbHRlckFjdGlvblJhZGlvcy50ZXh0KCIiKTsKKworICAgICAgICAgIGZvciAodmFyIGkgaW4gZmlsdGVyRGF0YS5maWx0ZXJfYWN0aW9ucyl7CisgICAgICAgICAgICB2YXIgZmlsdGVyQWN0aW9uID0gZmlsdGVyRGF0YS5maWx0ZXJfYWN0aW9uc1tpXTsKKworICAgICAgICAgICAgdmFyIGFjdGlvbiA9ICQoJzxsYWJlbCBjbGFzcz0icmFkaW8iPjxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iZmlsdGVyIiB2YWx1ZT0iIj48c3BhbiBjbGFzcz0iZmlsdGVyLXRpdGxlIj48L3NwYW4+PC9sYWJlbD4nKTsKKyAgICAgICAgICAgIHZhciBhY3Rpb25UaXRsZSA9IGZpbHRlckFjdGlvbi50aXRsZSArICcgKCcgKyBmaWx0ZXJBY3Rpb24uY291bnQgKyAnKSc7CisKKyAgICAgICAgICAgIHZhciByYWRpb0lucHV0ID0gYWN0aW9uLmNoaWxkcmVuKCJpbnB1dCIpOworCisgICAgICAgICAgICBpZiAoTnVtYmVyKGZpbHRlckFjdGlvbi5jb3VudCkgPT0gMCl7CisgICAgICAgICAgICAgIHJhZGlvSW5wdXQuYXR0cigiZGlzYWJsZWQiLCAiZGlzYWJsZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYWN0aW9uLmNoaWxkcmVuKCIuZmlsdGVyLXRpdGxlIikudGV4dChhY3Rpb25UaXRsZSk7CisKKyAgICAgICAgICAgIHJhZGlvSW5wdXQudmFsKGZpbHRlck5hbWUgKyAnOicgKyBmaWx0ZXJBY3Rpb24ubmFtZSk7CisKKyAgICAgICAgICAgIC8qIFNldHVwIHRoZSBjdXJyZW50IHNlbGVjdGVkIGZpbHRlciwgZGVmYXVsdCB0byAnYWxsJyBpZgorICAgICAgICAgICAgICogbm8gY3VycmVudCBmaWx0ZXIgc2VsZWN0ZWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICgodGFibGVQYXJhbXMuZmlsdGVyICYmCisgICAgICAgICAgICAgICAgdGFibGVQYXJhbXMuZmlsdGVyID09PSByYWRpb0lucHV0LnZhbCgpKSB8fAorICAgICAgICAgICAgICAgIGZpbHRlckFjdGlvbi5uYW1lID09ICdhbGwnKSB7CisgICAgICAgICAgICAgICAgcmFkaW9JbnB1dC5hdHRyKCJjaGVja2VkIiwgImNoZWNrZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmlsdGVyQWN0aW9uUmFkaW9zLmFwcGVuZChhY3Rpb24pOworICAgICAgICAgIH0KKworICAgICAgICAgICQoJyNmaWx0ZXItbW9kYWwtJytjdHgudGFibGVOYW1lKS5tb2RhbCgnc2hvdycpOworICAgICAgICB9CisgICAgfSk7CisgIH0KKworCisgICQoIi5nZXQtaGVscCIpLnRvb2x0aXAoe2NvbnRhaW5lcjonYm9keScsIGh0bWw6dHJ1ZSwgZGVsYXk6e3Nob3c6MzAwfX0pOworCisgIC8qIEtlZXAgdGhlIEVkaXQgY29sdW1ucyBtZW51IG9wZW4gYWZ0ZXIgY2xpY2sgYnkgZWF0aW5nIHRoZSBldmVudCAqLworICAkKCcuZHJvcGRvd24tbWVudScpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKKyAgICBlLnN0b3BQcm9wYWdhdGlvbigpOworICB9KTsKKworICAkKCIucGFnZXNpemUtIitjdHgudGFibGVOYW1lKS52YWwodGFibGVQYXJhbXMubGltaXQpOworCisgIC8qIHBhZ2Ugc2l6ZSBzZWxlY3RvciAgKi8KKyAgJCgiLnBhZ2VzaXplLSIrY3R4LnRhYmxlTmFtZSkuY2hhbmdlKGZ1bmN0aW9uKGUpeworICAgIHRhYmxlUGFyYW1zLmxpbWl0ID0gTnVtYmVyKHRoaXMudmFsdWUpOworICAgIGlmICgodGFibGVQYXJhbXMucGFnZSAqIHRhYmxlUGFyYW1zLmxpbWl0KSA+IHRhYmxlVG90YWwpCisgICAgICB0YWJsZVBhcmFtcy5wYWdlID0gMTsKKworICAgIGxvYWREYXRhKHRhYmxlUGFyYW1zKTsKKyAgICAvKiBzeW5jIHRoZSBvdGhlciBzZWxlY3RvcnMgb24gdGhlIHBhZ2UgKi8KKyAgICAkKCIucGFnZXNpemUtIitjdHgudGFibGVOYW1lKS52YWwodGhpcy52YWx1ZSk7CisgICAgZS5wcmV2ZW50RGVmYXVsdCgpOworICB9KTsKKworICAkKCIjc2VhcmNoLXN1Ym1pdC0iK2N0eC50YWJsZU5hbWUpLmNsaWNrKGZ1bmN0aW9uKGUpeworICAgIHZhciBzZWFyY2hUZXJtID0gJCgiI3NlYXJjaC1pbnB1dC0iK2N0eC50YWJsZU5hbWUpLnZhbCgpOworCisgICAgdGFibGVQYXJhbXMucGFnZSA9IDE7CisgICAgdGFibGVQYXJhbXMuc2VhcmNoID0gc2VhcmNoVGVybTsKKworICAgIC8qIElmIGEgZmlsdGVyIHdhcyBhY3RpdmUgd2UgcmVtb3ZlIGl0ICovCisgICAgaWYgKHRhYmxlUGFyYW1zLmZpbHRlcikgeworICAgICAgdmFyIGZpbHRlckJ0biA9ICQoIiMiICsgdGFibGVQYXJhbXMuZmlsdGVyLnNwbGl0KCI6IilbMF0pOworICAgICAgZmlsdGVyQnRuQWN0aXZlKGZpbHRlckJ0biwgZmFsc2UpOworICAgICAgdGFibGVQYXJhbXMuZmlsdGVyID0gbnVsbDsKKyAgICB9CisKKyAgICBsb2FkRGF0YSh0YWJsZVBhcmFtcyk7CisKKyAgICBlLnByZXZlbnREZWZhdWx0KCk7CisgIH0pOworCisgICQoJy5yZW1vdmUtc2VhcmNoLWJ0bi0nK2N0eC50YWJsZU5hbWUpLmNsaWNrKGZ1bmN0aW9uKGUpeworICAgIGUucHJldmVudERlZmF1bHQoKTsKKworICAgIHRhYmxlUGFyYW1zLnBhZ2UgPSAxOworICAgIHRhYmxlUGFyYW1zLnNlYXJjaCA9IG51bGw7CisgICAgbG9hZERhdGEodGFibGVQYXJhbXMpOworCisgICAgJCgiI3NlYXJjaC1pbnB1dC0iK2N0eC50YWJsZU5hbWUpLnZhbCgiIik7CisgICAgJCh0aGlzKS5oaWRlKCk7CisgIH0pOworCisgICQoIiNzZWFyY2gtaW5wdXQtIitjdHgudGFibGVOYW1lKS5rZXl1cChmdW5jdGlvbihlKXsKKyAgICBpZiAoZS53aGljaCA9PT0gMTMpCisgICAgICAkKCcjc2VhcmNoLXN1Ym1pdC0nK2N0eC50YWJsZU5hbWUpLmNsaWNrKCk7CisgIH0pOworCisgIC8qIFN0b3AgcGFnZSBqdW1wcyB3aGVuIGNsaWNraW5nIG9uICMgbGlua3MgKi8KKyAgJCgnYVtocmVmPSIjIl0nKS5jbGljayhmdW5jdGlvbihlKXsKKyAgICBlLnByZXZlbnREZWZhdWx0KCk7CisgIH0pOworCisgICQoIiNjbGVhci1maWx0ZXItYnRuLSIrY3R4LnRhYmxlTmFtZSkuY2xpY2soZnVuY3Rpb24oKXsKKyAgICB2YXIgZmlsdGVyQnRuID0gJCgiIyIgKyB0YWJsZVBhcmFtcy5maWx0ZXIuc3BsaXQoIjoiKVswXSk7CisgICAgZmlsdGVyQnRuQWN0aXZlKGZpbHRlckJ0biwgZmFsc2UpOworCisgICAgdGFibGVQYXJhbXMuZmlsdGVyID0gbnVsbDsKKyAgICBsb2FkRGF0YSh0YWJsZVBhcmFtcyk7CisgIH0pOworCisgICQoIiNmaWx0ZXItbW9kYWwtZm9ybS0iK2N0eC50YWJsZU5hbWUpLnN1Ym1pdChmdW5jdGlvbihlKXsKKyAgICBlLnByZXZlbnREZWZhdWx0KCk7CisKKyAgICB0YWJsZVBhcmFtcy5maWx0ZXIgPSAkKHRoaXMpLmZpbmQoImlucHV0W3R5cGU9J3JhZGlvJ106Y2hlY2tlZCIpLnZhbCgpOworCisgICAgdmFyIGZpbHRlckJ0biA9ICQoIiMiICsgdGFibGVQYXJhbXMuZmlsdGVyLnNwbGl0KCI6IilbMF0pOworCisgICAgLyogQWxsID09PSByZW1vdmUgZmlsdGVyICovCisgICAgaWYgKHRhYmxlUGFyYW1zLmZpbHRlci5tYXRjaCgiOmFsbCQiKSkgeworICAgICAgdGFibGVQYXJhbXMuZmlsdGVyID0gbnVsbDsKKyAgICAgIGZpbHRlckJ0bkFjdGl2ZShmaWx0ZXJCdG4sIGZhbHNlKTsKKyAgICB9IGVsc2UgeworICAgICAgZmlsdGVyQnRuQWN0aXZlKGZpbHRlckJ0biwgdHJ1ZSk7CisgICAgfQorCisgICAgbG9hZERhdGEodGFibGVQYXJhbXMpOworCisgICAgJCh0aGlzKS5wYXJlbnQoKS5tb2RhbCgnaGlkZScpOworICB9KTsKK30KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvanMvdGVzdHMvdGVzdC5qcyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvanMvdGVzdHMvdGVzdC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjEwMTEzCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3N0YXRpYy9qcy90ZXN0cy90ZXN0LmpzCkBAIC0wLDAgKzEsMTc1IEBACisidXNlIHN0cmljdCI7CisvKiBVbml0IHRlc3RzIGZvciBUb2FzdGVyJ3MgSlMgKi8KKworLyogbGlidG9hc3RlciB0ZXN0cyAqLworCitRVW5pdC50ZXN0KCJMYXllciBhbGVydCBub3RpZmljYXRpb24iLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgdmFyIGxheWVyID0geworICAgICJsYXllcmRldGFpbHVybCI6Ii90b2FzdGVyZ3VpL3Byb2plY3QvMS9sYXllci8yMiIsCisgICAgInZjc191cmwiOiJnaXQ6Ly9leGFtcGxlLmNvbS9leGFtcGxlLmdpdCIsCisgICAgImRldGFpbCI6IlsgZ2l0Oi8vZXhhbXBsZS5jb20vZXhhbXBsZS5naXQgfCBtYXN0ZXIgXSIsCisgICAgInZjc19yZWZlcmVuY2UiOiJtYXN0ZXIiLAorICAgICJpZCI6IDIyLAorICAgICJuYW1lIjoibWV0YS1leGFtcGxlIgorICB9OworCisgIHZhciBjb3JyZWN0UmVzcG9uc2UgPSAiWW91IGhhdmUgYWRkZWQgPHN0cm9uZz4zPC9zdHJvbmc+IGxheWVycyB0byB5b3VyIHByb2plY3Q6IDxhIGlkPVwibGF5ZXItYWZmZWN0ZWQtbmFtZVwiIGhyZWY9XCIvdG9hc3Rlcmd1aS9wcm9qZWN0LzEvbGF5ZXIvMjJcIj5tZXRhLWV4YW1wbGU8L2E+IGFuZCBpdHMgZGVwZW5kZW5jaWVzIDxhIGhyZWY9XCIvdG9hc3Rlcmd1aS9wcm9qZWN0LzEvbGF5ZXIvOVwiIGRhdGEtb3JpZ2luYWwtdGl0bGU9XCJcIiB0aXRsZT1cIlwiPm1ldGEtZXhhbXBsZS10d288L2E+LCA8YSBocmVmPVwiL3RvYXN0ZXJndWkvcHJvamVjdC8xL2xheWVyLzlcIiBkYXRhLW9yaWdpbmFsLXRpdGxlPVwiXCIgdGl0bGU9XCJcIj5tZXRhLWV4YW1wbGUtdGhyZWU8L2E+IjsKKworICB2YXIgbGF5ZXJEZXBzTGlzdCA9IFsKKyAgICB7CisgICAgImxheWVyZGV0YWlsdXJsIjoiL3RvYXN0ZXJndWkvcHJvamVjdC8xL2xheWVyLzkiLAorICAgICJ2Y3NfdXJsIjoiZ2l0Oi8vZXhhbXBsZS5jb20vZXhhbXBsZS5naXQiLAorICAgICJkZXRhaWwiOiJbIGdpdDovL2V4YW1wbGUuY29tL2V4YW1wbGUuZ2l0IHwgbWFzdGVyIF0iLAorICAgICJ2Y3NfcmVmZXJlbmNlIjoibWFzdGVyIiwKKyAgICAiaWQiOiA5LAorICAgICJuYW1lIjoibWV0YS1leGFtcGxlLXR3byIKKyAgICB9LAorICAgIHsKKyAgICAibGF5ZXJkZXRhaWx1cmwiOiIvdG9hc3Rlcmd1aS9wcm9qZWN0LzEvbGF5ZXIvOSIsCisgICAgInZjc191cmwiOiJnaXQ6Ly9leGFtcGxlLmNvbS9leGFtcGxlLmdpdCIsCisgICAgImRldGFpbCI6IlsgZ2l0Oi8vZXhhbXBsZS5jb20vZXhhbXBsZS5naXQgfCBtYXN0ZXIgXSIsCisgICAgInZjc19yZWZlcmVuY2UiOiJtYXN0ZXIiLAorICAgICJpZCI6IDEwLAorICAgICJuYW1lIjoibWV0YS1leGFtcGxlLXRocmVlIgorICAgIH0sCisgIF07CisKKyAgdmFyIG1zZyA9IGxpYnRvYXN0ZXIubWFrZUxheWVyQWRkUm1BbGVydE1zZyhsYXllciwgbGF5ZXJEZXBzTGlzdCwgdHJ1ZSk7CisgIHZhciB0ZXN0ID0gJCgiPGRpdj48L2Rpdj4iKTsKKworICB0ZXN0Lmh0bWwobXNnKTsKKworICBhc3NlcnQuZXF1YWwodGVzdC5jaGlsZHJlbigic3Ryb25nIikudGV4dCgpLCAiMyIpOworICBhc3NlcnQuZXF1YWwodGVzdC5jaGlsZHJlbigiYSIpLmxlbmd0aCwgMyk7Cit9KTsKKworUVVuaXQudGVzdCgiUHJvamVjdCBpbmZvIiwgZnVuY3Rpb24oYXNzZXJ0KXsKKyAgdmFyIGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgbGlidG9hc3Rlci5nZXRQcm9qZWN0SW5mbyhsaWJ0b2FzdGVyLmN0eC5wcm9qZWN0UGFnZVVybCwgZnVuY3Rpb24ocHJqSW5mbyl7CisgICAgYXNzZXJ0Lm9rKHByakluZm8ubWFjaGluZS5uYW1lKTsKKyAgICBhc3NlcnQub2socHJqSW5mby5yZWxlYXNlcy5sZW5ndGggPiAwKTsKKyAgICBhc3NlcnQub2socHJqSW5mby5sYXllcnMubGVuZ3RoID4gMCk7CisgICAgYXNzZXJ0Lm9rKHByakluZm8uZnJlcXRhcmdldHMpOworICAgIGFzc2VydC5vayhwcmpJbmZvLnJlbGVhc2UpOworICAgIGRvbmUoKTsKKyAgfSk7Cit9KTsKKworUVVuaXQudGVzdCgiU2hvdyBub3RpZmljYXRpb24iLCBmdW5jdGlvbihhc3NlcnQpeworICB2YXIgbXNnID0gIlRlc3RpbmciOworICB2YXIgZWxlbWVudCA9ICQoIiNjaGFuZ2Utbm90aWZpY2F0aW9uLW1zZyIpOworCisgIGxpYnRvYXN0ZXIuc2hvd0NoYW5nZU5vdGlmaWNhdGlvbihtc2cpOworCisgIGFzc2VydC5lcXVhbChlbGVtZW50LnRleHQoKSwgbXNnKTsKKyAgYXNzZXJ0Lm9rKGVsZW1lbnQuaXMoIjp2aXNpYmxlIikpOworCisgICQoIiNjaGFuZ2Utbm90aWZpY2F0aW9uIikuaGlkZSgpOworfSk7CisKK3ZhciBsYXllciA9IHsKKyAgImlkIjogOTEsCisgICJuYW1lIjogICJtZXRhLWNyeXN0YWxmb3Jlc3QiLAorICAibGF5ZXJkZXRhaWx1cmwiOiAiL3RvYXN0ZXJndWkvcHJvamVjdC80L2xheWVyLzkxIgorfTsKKworUVVuaXQudGVzdCgiQWRkIGxheWVyIiwgZnVuY3Rpb24oYXNzZXJ0KXsKKyAgdmFyIGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKworICAvKiBXYWl0IGZvciB0aGUgbW9kYWwgdG8gYmUgYWRkZWQgdG8gdGhlIGRvbSAqLworICB2YXIgY2hlY2tNb2RhbCA9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7CisgICAgaWYgKCQoIiNkZXBlbmRlbmNpZXMtbW9kYWwiKS5sZW5ndGggPiAwKSB7CisgICAgICAkKCIjZGVwZW5kZW5jaWVzLW1vZGFsIC5idG4tcHJpbWFyeSIpLmNsaWNrKCk7CisgICAgICBjbGVhckludGVydmFsKGNoZWNrTW9kYWwpOworICAgIH0KKyAgfSwgMjAwKTsKKworICBsaWJ0b2FzdGVyLmFkZFJtTGF5ZXIobGF5ZXIsIHRydWUsIGZ1bmN0aW9uKGRlcHMpeworICAgIGFzc2VydC5lcXVhbChkZXBzLmxlbmd0aCwgMSk7CisgICAgZG9uZSgpOworICB9KTsKKworfSk7CisKK1FVbml0LnRlc3QoIlJtIGxheWVyIiwgZnVuY3Rpb24oYXNzZXJ0KXsKKyAgdmFyIGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKworICBsaWJ0b2FzdGVyLmFkZFJtTGF5ZXIobGF5ZXIsIGZhbHNlLCBmdW5jdGlvbihkZXBzKXsKKyAgICBhc3NlcnQuZXF1YWwoZGVwcy5sZW5ndGgsIDApOworICAgIGRvbmUoKTsKKyAgfSk7CisKK30pOworCitRVW5pdC50ZXN0KCJQYXJzZSB1cmwgcGFyYW1zIiwgZnVuY3Rpb24oYXNzZXJ0KXsKKyAgdmFyIHBhcmFtcyA9IGxpYnRvYXN0ZXIucGFyc2VVcmxQYXJhbXMoKTsKKyAgYXNzZXJ0Lm9rKHBhcmFtcyk7Cit9KTsKKworUVVuaXQudGVzdCgiRHVtcCB1cmwgcGFyYW1zIiwgZnVuY3Rpb24oYXNzZXJ0KXsKKyAgdmFyIHBhcmFtcyA9IGxpYnRvYXN0ZXIuZHVtcHNVcmxQYXJhbXMoKTsKKyAgYXNzZXJ0Lm9rKHBhcmFtcyk7Cit9KTsKKworUVVuaXQudGVzdCgiTWFrZSB0eXBlYWhlYWRzIiwgZnVuY3Rpb24oYXNzZXJ0KXsKKyAgdmFyIGxheWVyc1QgPSAkKCIjbGF5ZXJzIik7CisgIHZhciBtYWNoaW5lc1QgPSAkKCIjbWFjaGluZXMiKTsKKyAgdmFyIHByb2plY3RzVCA9ICQoIiNwcm9qZWN0cyIpOworICB2YXIgcmVjaXBlc1QgPSAkKCIjcmVjaXBlcyIpOworCisgIGxpYnRvYXN0ZXIubWFrZVR5cGVhaGVhZChsYXllcnNULAorICAgIGxpYnRvYXN0ZXIuY3R4LmxheWVyc1R5cGVBaGVhZFVybCwge30sIGZ1bmN0aW9uKCl7fSk7CisKKyAgbGlidG9hc3Rlci5tYWtlVHlwZWFoZWFkKG1hY2hpbmVzVCwKKyAgICBsaWJ0b2FzdGVyLmN0eC5tYWNoaW5lc1R5cGVBaGVhZFVybCwge30sIGZ1bmN0aW9uKCl7fSk7CisKKyAgbGlidG9hc3Rlci5tYWtlVHlwZWFoZWFkKHByb2plY3RzVCwKKyAgICBsaWJ0b2FzdGVyLmN0eC5wcm9qZWN0c1R5cGVBaGVhZFVybCwge30sIGZ1bmN0aW9uKCl7fSk7CisKKyAgbGlidG9hc3Rlci5tYWtlVHlwZWFoZWFkKHJlY2lwZXNULAorICAgIGxpYnRvYXN0ZXIuY3R4LnJlY2lwZXNUeXBlQWhlYWRVcmwsIHt9LCBmdW5jdGlvbigpe30pOworCisgIGFzc2VydC5vayhyZWNpcGVzVC5kYXRhKCd0eXBlYWhlYWQnKSk7CisgIGFzc2VydC5vayhsYXllcnNULmRhdGEoJ3R5cGVhaGVhZCcpKTsKKyAgYXNzZXJ0Lm9rKHByb2plY3RzVC5kYXRhKCd0eXBlYWhlYWQnKSk7CisgIGFzc2VydC5vayhyZWNpcGVzVC5kYXRhKCd0eXBlYWhlYWQnKSk7Cit9KTsKKworCisKKy8qIFBhZ2UgaW5pdCBmdW5jdGlvbnMgKi8KKworUVVuaXQudGVzdCgiSW1wb3J0IGxheWVyIHBhZ2UgaW5pdCIsIGZ1bmN0aW9uKGFzc2VydCl7CisgIGFzc2VydC50aHJvd3MoaW1wb3J0TGF5ZXJQYWdlSW5pdCgpKTsKK30pOworCitRVW5pdC50ZXN0KCJQcm9qZWN0IHBhZ2UgaW5pdCIsIGZ1bmN0aW9uKGFzc2VydCl7CisgIGFzc2VydC50aHJvd3MocHJvamVjdFBhZ2VJbml0KCkpOworfSk7CisKK1FVbml0LnRlc3QoIkxheWVyIGRldGFpbHMgcGFnZSBpbml0IiwgZnVuY3Rpb24oYXNzZXJ0KXsKKyAgYXNzZXJ0LnRocm93cyhsYXllckRldGFpbHNQYWdlSW5pdCgpKTsKK30pOworCitRVW5pdC50ZXN0KCJMYXllciBidG5zIGluaXQiLCBmdW5jdGlvbihhc3NlcnQpeworICBhc3NlcnQudGhyb3dzKGxheWVyQnRuc0luaXQoeyBwcm9qZWN0TGF5ZXJzIDogW10gfSkpOworfSk7CisKK1FVbml0LnRlc3QoIlRhYmxlIGluaXQiLCBmdW5jdGlvbihhc3NlcnQpeworICBhc3NlcnQudGhyb3dzKHRhYmxlSW5pdCh7IHVybCA6IHRhYmxlVXJsIH0pKTsKK30pOworCiskKGRvY3VtZW50KS5hamF4RXJyb3IoZnVuY3Rpb24oZXZlbnQsIGpxeGhyLCBzZXR0aW5ncywgZXJyTXNnKXsKKyAgaWYgKGVyck1zZyA9PT0gJ2Fib3J0JykKKyAgICByZXR1cm47CisKKyAgUVVuaXQudGVzdCgiQWpheCBlcnJvciIsIGZ1bmN0aW9uKGFzc2VydCl7CisgICAgYXNzZXJ0Lm5vdE9rKGpxeGhyLnJlc3BvbnNlVGV4dCk7CisgIH0pOworfSk7CisKKworCisKKworCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2pzL3VpLWJvb3RzdHJhcC10cGxzLTAuMTEuMC5qcyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvanMvdWktYm9vdHN0cmFwLXRwbHMtMC4xMS4wLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNmE4NjEKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2pzL3VpLWJvb3RzdHJhcC10cGxzLTAuMTEuMC5qcwpAQCAtMCwwICsxLDEwIEBACisvKgorICogYW5ndWxhci11aS1ib290c3RyYXAKKyAqIGh0dHA6Ly9hbmd1bGFyLXVpLmdpdGh1Yi5pby9ib290c3RyYXAvCisKKyAqIFZlcnNpb246IDAuMTEuMCAtIDIwMTQtMDUtMDEKKyAqIExpY2Vuc2U6IE1JVAorICovCithbmd1bGFyLm1vZHVsZSgidWkuYm9vdHN0cmFwIixbInVpLmJvb3RzdHJhcC50cGxzIiwidWkuYm9vdHN0cmFwLnRyYW5zaXRpb24iLCJ1aS5ib290c3RyYXAuY29sbGFwc2UiLCJ1aS5ib290c3RyYXAuYWNjb3JkaW9uIiwidWkuYm9vdHN0cmFwLmFsZXJ0IiwidWkuYm9vdHN0cmFwLmJpbmRIdG1sIiwidWkuYm9vdHN0cmFwLmJ1dHRvbnMiLCJ1aS5ib290c3RyYXAuY2Fyb3VzZWwiLCJ1aS5ib290c3RyYXAuZGF0ZXBhcnNlciIsInVpLmJvb3RzdHJhcC5wb3NpdGlvbiIsInVpLmJvb3RzdHJhcC5kYXRlcGlja2VyIiwidWkuYm9vdHN0cmFwLmRyb3Bkb3duIiwidWkuYm9vdHN0cmFwLm1vZGFsIiwidWkuYm9vdHN0cmFwLnBhZ2luYXRpb24iLCJ1aS5ib290c3RyYXAudG9vbHRpcCIsInVpLmJvb3RzdHJhcC5wb3BvdmVyIiwidWkuYm9vdHN0cmFwLnByb2dyZXNzYmFyIiwidWkuYm9vdHN0cmFwLnJhdGluZyIsInVpLmJvb3RzdHJhcC50YWJzIiwidWkuYm9vdHN0cmFwLnRpbWVwaWNrZXIiLCJ1aS5ib290c3RyYXAudHlwZWFoZWFkIl0pLGFuZ3VsYXIubW9kdWxlKCJ1aS5ib290c3RyYXAudHBscyIsWyJ0ZW1wbGF0ZS9hY2NvcmRpb24vYWNjb3JkaW9uLWdyb3VwLmh0bWwiLCJ0ZW1wbGF0ZS9hY2NvcmRpb24vYWNjb3JkaW9uLmh0bWwiLCJ0ZW1wbGF0ZS9hbGVydC9hbGVydC5odG1sIiwidGVtcGxhdGUvY2Fyb3VzZWwvY2Fyb3VzZWwuaHRtbCIsInRlbXBsYXRlL2Nhcm91c2VsL3NsaWRlLmh0bWwiLCJ0ZW1wbGF0ZS9kYXRlcGlja2VyL2RhdGVwaWNrZXIuaHRtbCIsInRlbXBsYXRlL2RhdGVwaWNrZXIvZGF5Lmh0bWwiLCJ0ZW1wbGF0ZS9kYXRlcGlja2VyL21vbnRoLmh0bWwiLCJ0ZW1wbGF0ZS9kYXRlcGlja2VyL3BvcHVwLmh0bWwiLCJ0ZW1wbGF0ZS9kYXRlcGlja2VyL3llYXIuaHRtbCIsInRlbXBsYXRlL21vZGFsL2JhY2tkcm9wLmh0bWwiLCJ0ZW1wbGF0ZS9tb2RhbC93aW5kb3cuaHRtbCIsInRlbXBsYXRlL3BhZ2luYXRpb24vcGFnZXIuaHRtbCIsInRlbXBsYXRlL3BhZ2luYXRpb24vcGFnaW5hdGlvbi5odG1sIiwidGVtcGxhdGUvdG9vbHRpcC90b29sdGlwLWh0bWwtdW5zYWZlLXBvcHVwLmh0bWwiLCJ0ZW1wbGF0ZS90b29sdGlwL3Rvb2x0aXAtcG9wdXAuaHRtbCIsInRlbXBsYXRlL3BvcG92ZXIvcG9wb3Zlci5odG1sIiwidGVtcGxhdGUvcHJvZ3Jlc3NiYXIvYmFyLmh0bWwiLCJ0ZW1wbGF0ZS9wcm9ncmVzc2Jhci9wcm9ncmVzcy5odG1sIiwidGVtcGxhdGUvcHJvZ3Jlc3NiYXIvcHJvZ3Jlc3NiYXIuaHRtbCIsInRlbXBsYXRlL3JhdGluZy9yYXRpbmcuaHRtbCIsInRlbXBsYXRlL3RhYnMvdGFiLmh0bWwiLCJ0ZW1wbGF0ZS90YWJzL3RhYnNldC5odG1sIiwidGVtcGxhdGUvdGltZXBpY2tlci90aW1lcGlja2VyLmh0bWwiLCJ0ZW1wbGF0ZS90eXBlYWhlYWQvdHlwZWFoZWFkLW1hdGNoLmh0bWwiLCJ0ZW1wbGF0ZS90eXBlYWhlYWQvdHlwZWFoZWFkLXBvcHVwLmh0bWwiXSksYW5ndWxhci5tb2R1bGUoInVpLmJvb3RzdHJhcC50cmFuc2l0aW9uIixbXSkuZmFjdG9yeSgiJHRyYW5zaXRpb24iLFsiJHEiLCIkdGltZW91dCIsIiRyb290U2NvcGUiLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe2Zvcih2YXIgYiBpbiBhKWlmKHZvaWQgMCE9PWYuc3R5bGVbYl0pcmV0dXJuIGFbYl19dmFyIGU9ZnVuY3Rpb24oZCxmLGcpe2c9Z3x8e307dmFyIGg9YS5kZWZlcigpLGk9ZVtnLmFuaW1hdGlvbj8iYW5pbWF0aW9uRW5kRXZlbnROYW1lIjoidHJhbnNpdGlvbkVuZEV2ZW50TmFtZSJdLGo9ZnVuY3Rpb24oKXtjLiRhcHBseShmdW5jdGlvbigpe2QudW5iaW5kKGksaiksaC5yZXNvbHZlKGQpfSl9O3JldHVybiBpJiZkLmJpbmQoaSxqKSxiKGZ1bmN0aW9uKCl7YW5ndWxhci5pc1N0cmluZyhmKT9kLmFkZENsYXNzKGYpOmFuZ3VsYXIuaXNGdW5jdGlvbihmKT9mKGQpOmFuZ3VsYXIuaXNPYmplY3QoZikmJmQuY3NzKGYpLGl8fGgucmVzb2x2ZShkKX0pLGgucHJvbWlzZS5jYW5jZWw9ZnVuY3Rpb24oKXtpJiZkLnVuYmluZChpLGopLGgucmVqZWN0KCJUcmFuc2l0aW9uIGNhbmNlbGxlZCIpfSxoLnByb21pc2V9LGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHJhbnMiKSxnPXtXZWJraXRUcmFuc2l0aW9uOiJ3ZWJraXRUcmFuc2l0aW9uRW5kIixNb3pUcmFuc2l0aW9uOiJ0cmFuc2l0aW9uZW5kIixPVHJhbnNpdGlvbjoib1RyYW5zaXRpb25FbmQiLHRyYW5zaXRpb246InRyYW5zaXRpb25lbmQifSxoPXtXZWJraXRUcmFuc2l0aW9uOiJ3ZWJraXRBbmltYXRpb25FbmQiLE1velRyYW5zaXRpb246ImFuaW1hdGlvbmVuZCIsT1RyYW5zaXRpb246Im9BbmltYXRpb25FbmQiLHRyYW5zaXRpb246ImFuaW1hdGlvbmVuZCJ9O3JldHVybiBlLnRyYW5zaXRpb25FbmRFdmVudE5hbWU9ZChnKSxlLmFuaW1hdGlvbkVuZEV2ZW50TmFtZT1kKGgpLGV9XSksYW5ndWxhci5tb2R1bGUoInVpLmJvb3RzdHJhcC5jb2xsYXBzZSIsWyJ1aS5ib290c3RyYXAudHJhbnNpdGlvbiJdKS5kaXJlY3RpdmUoImNvbGxhcHNlIixbIiR0cmFuc2l0aW9uIixmdW5jdGlvbihhKXtyZXR1cm57bGluazpmdW5jdGlvbihiLGMsZCl7ZnVuY3Rpb24gZShiKXtmdW5jdGlvbiBkKCl7aj09PWUmJihqPXZvaWQgMCl9dmFyIGU9YShjLGIpO3JldHVybiBqJiZqLmNhbmNlbCgpLGo9ZSxlLnRoZW4oZCxkKSxlfWZ1bmN0aW9uIGYoKXtrPyhrPSExLGcoKSk6KGMucmVtb3ZlQ2xhc3MoImNvbGxhcHNlIikuYWRkQ2xhc3MoImNvbGxhcHNpbmciKSxlKHtoZWlnaHQ6Y1swXS5zY3JvbGxIZWlnaHQrInB4In0pLnRoZW4oZykpfWZ1bmN0aW9uIGcoKXtjLnJlbW92ZUNsYXNzKCJjb2xsYXBzaW5nIiksYy5hZGRDbGFzcygiY29sbGFwc2UgaW4iKSxjLmNzcyh7aGVpZ2h0OiJhdXRvIn0pfWZ1bmN0aW9uIGgoKXtpZihrKWs9ITEsaSgpLGMuY3NzKHtoZWlnaHQ6MH0pO2Vsc2V7Yy5jc3Moe2hlaWdodDpjWzBdLnNjcm9sbEhlaWdodCsicHgifSk7e2NbMF0ub2Zmc2V0V2lkdGh9Yy5yZW1vdmVDbGFzcygiY29sbGFwc2UgaW4iKS5hZGRDbGFzcygiY29sbGFwc2luZyIpLGUoe2hlaWdodDowfSkudGhlbihpKX19ZnVuY3Rpb24gaSgpe2MucmVtb3ZlQ2xhc3MoImNvbGxhcHNpbmciKSxjLmFkZENsYXNzKCJjb2xsYXBzZSIpfXZhciBqLGs9ITA7Yi4kd2F0Y2goZC5jb2xsYXBzZSxmdW5jdGlvbihhKXthP2goKTpmKCl9KX19fV0pLGFuZ3VsYXIubW9kdWxlKCJ1aS5ib290c3RyYXAuYWNjb3JkaW9uIixbInVpLmJvb3RzdHJhcC5jb2xsYXBzZSJdKS5jb25zdGFudCgiYWNjb3JkaW9uQ29uZmlnIix7Y2xvc2VPdGhlcnM6ITB9KS5jb250cm9sbGVyKCJBY2NvcmRpb25Db250cm9sbGVyIixbIiRzY29wZSIsIiRhdHRycyIsImFjY29yZGlvbkNvbmZpZyIsZnVuY3Rpb24oYSxiLGMpe3RoaXMuZ3JvdXBzPVtdLHRoaXMuY2xvc2VPdGhlcnM9ZnVuY3Rpb24oZCl7dmFyIGU9YW5ndWxhci5pc0RlZmluZWQoYi5jbG9zZU90aGVycyk/YS4kZXZhbChiLmNsb3NlT3RoZXJzKTpjLmNsb3NlT3RoZXJzO2UmJmFuZ3VsYXIuZm9yRWFjaCh0aGlzLmdyb3VwcyxmdW5jdGlvbihhKXthIT09ZCYmKGEuaXNPcGVuPSExKX0pfSx0aGlzLmFkZEdyb3VwPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7dGhpcy5ncm91cHMucHVzaChhKSxhLiRvbigiJGRlc3Ryb3kiLGZ1bmN0aW9uKCl7Yi5yZW1vdmVHcm91cChhKX0pfSx0aGlzLnJlbW92ZUdyb3VwPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ3JvdXBzLmluZGV4T2YoYSk7LTEhPT1iJiZ0aGlzLmdyb3Vwcy5zcGxpY2UoYiwxKX19XSkuZGlyZWN0aXZlKCJhY2NvcmRpb24iLGZ1bmN0aW9uKCl7cmV0dXJue3Jlc3RyaWN0OiJFQSIsY29udHJvbGxlcjoiQWNjb3JkaW9uQ29udHJvbGxlciIsdHJhbnNjbHVkZTohMCxyZXBsYWNlOiExLHRlbXBsYXRlVXJsOiJ0ZW1wbGF0ZS9hY2NvcmRpb24vYWNjb3JkaW9uLmh0bWwifX0pLmRpcmVjdGl2ZSgiYWNjb3JkaW9uR3JvdXAiLGZ1bmN0aW9uKCl7cmV0dXJue3JlcXVpcmU6Il5hY2NvcmRpb24iLHJlc3RyaWN0OiJFQSIsdHJhbnNjbHVkZTohMCxyZXBsYWNlOiEwLHRlbXBsYXRlVXJsOiJ0ZW1wbGF0ZS9hY2NvcmRpb24vYWNjb3JkaW9uLWdyb3VwLmh0bWwiLHNjb3BlOntoZWFkaW5nOiJAIixpc09wZW46Ij0/Iixpc0Rpc2FibGVkOiI9PyJ9LGNvbnRyb2xsZXI6ZnVuY3Rpb24oKXt0aGlzLnNldEhlYWRpbmc9ZnVuY3Rpb24oYSl7dGhpcy5oZWFkaW5nPWF9fSxsaW5rOmZ1bmN0aW9uKGEsYixjLGQpe2QuYWRkR3JvdXAoYSksYS4kd2F0Y2goImlzT3BlbiIsZnVuY3Rpb24oYil7YiYmZC5jbG9zZU90aGVycyhhKX0pLGEudG9nZ2xlT3Blbj1mdW5jdGlvbigpe2EuaXNEaXNhYmxlZHx8KGEuaXNPcGVuPSFhLmlzT3Blbil9fX19KS5kaXJlY3RpdmUoImFjY29yZGlvbkhlYWRpbmciLGZ1bmN0aW9uKCl7cmV0dXJue3Jlc3RyaWN0OiJFQSIsdHJhbnNjbHVkZTohMCx0ZW1wbGF0ZToiIixyZXBsYWNlOiEwLHJlcXVpcmU6Il5hY2NvcmRpb25Hcm91cCIsbGluazpmdW5jdGlvbihhLGIsYyxkLGUpe2Quc2V0SGVhZGluZyhlKGEsZnVuY3Rpb24oKXt9KSl9fX0pLmRpcmVjdGl2ZSgiYWNjb3JkaW9uVHJhbnNjbHVkZSIsZnVuY3Rpb24oKXtyZXR1cm57cmVxdWlyZToiXmFjY29yZGlvbkdyb3VwIixsaW5rOmZ1bmN0aW9uKGEsYixjLGQpe2EuJHdhdGNoKGZ1bmN0aW9uKCl7cmV0dXJuIGRbYy5hY2NvcmRpb25UcmFuc2NsdWRlXX0sZnVuY3Rpb24oYSl7YSYmKGIuaHRtbCgiIiksYi5hcHBlbmQoYSkpfSl9fX0pLGFuZ3VsYXIubW9kdWxlKCJ1aS5ib290c3RyYXAuYWxlcnQiLFtdKS5jb250cm9sbGVyKCJBbGVydENvbnRyb2xsZXIiLFsiJHNjb3BlIiwiJGF0dHJzIixmdW5jdGlvbihhLGIpe2EuY2xvc2VhYmxlPSJjbG9zZSJpbiBifV0pLmRpcmVjdGl2ZSgiYWxlcnQiLGZ1bmN0aW9uKCl7cmV0dXJue3Jlc3RyaWN0OiJFQSIsY29udHJvbGxlcjoiQWxlcnRDb250cm9sbGVyIix0ZW1wbGF0ZVVybDoidGVtcGxhdGUvYWxlcnQvYWxlcnQuaHRtbCIsdHJhbnNjbHVkZTohMCxyZXBsYWNlOiEwLHNjb3BlOnt0eXBlOiJAIixjbG9zZToiJiJ9fX0pLGFuZ3VsYXIubW9kdWxlKCJ1aS5ib290c3RyYXAuYmluZEh0bWwiLFtdKS5kaXJlY3RpdmUoImJpbmRIdG1sVW5zYWZlIixmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihhLGIsYyl7Yi5hZGRDbGFzcygibmctYmluZGluZyIpLmRhdGEoIiRiaW5kaW5nIixjLmJpbmRIdG1sVW5zYWZlKSxhLiR3YXRjaChjLmJpbmRIdG1sVW5zYWZlLGZ1bmN0aW9uKGEpe2IuaHRtbChhfHwiIil9KX19KSxhbmd1bGFyLm1vZHVsZSgidWkuYm9vdHN0cmFwLmJ1dHRvbnMiLFtdKS5jb25zdGFudCgiYnV0dG9uQ29uZmlnIix7YWN0aXZlQ2xhc3M6ImFjdGl2ZSIsdG9nZ2xlRXZlbnQ6ImNsaWNrIn0pLmNvbnRyb2xsZXIoIkJ1dHRvbnNDb250cm9sbGVyIixbImJ1dHRvbkNvbmZpZyIsZnVuY3Rpb24oYSl7dGhpcy5hY3RpdmVDbGFzcz1hLmFjdGl2ZUNsYXNzfHwiYWN0aXZlIix0aGlzLnRvZ2dsZUV2ZW50PWEudG9nZ2xlRXZlbnR8fCJjbGljayJ9XSkuZGlyZWN0aXZlKCJidG5SYWRpbyIsZnVuY3Rpb24oKXtyZXR1cm57cmVxdWlyZTpbImJ0blJhZGlvIiwibmdNb2RlbCJdLGNvbnRyb2xsZXI6IkJ1dHRvbnNDb250cm9sbGVyIixsaW5rOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWRbMF0sZj1kWzFdO2YuJHJlbmRlcj1mdW5jdGlvbigpe2IudG9nZ2xlQ2xhc3MoZS5hY3RpdmVDbGFzcyxhbmd1bGFyLmVxdWFscyhmLiRtb2RlbFZhbHVlLGEuJGV2YWwoYy5idG5SYWRpbykpKX0sYi5iaW5kKGUudG9nZ2xlRXZlbnQsZnVuY3Rpb24oKXt2YXIgZD1iLmhhc0NsYXNzKGUuYWN0aXZlQ2xhc3MpOyghZHx8YW5ndWxhci5pc0RlZmluZWQoYy51bmNoZWNrYWJsZSkpJiZhLiRhcHBseShmdW5jdGlvbigpe2YuJHNldFZpZXdWYWx1ZShkP251bGw6YS4kZXZhbChjLmJ0blJhZGlvKSksZi4kcmVuZGVyKCl9KX0pfX19KS5kaXJlY3RpdmUoImJ0bkNoZWNrYm94IixmdW5jdGlvbigpe3JldHVybntyZXF1aXJlOlsiYnRuQ2hlY2tib3giLCJuZ01vZGVsIl0sY29udHJvbGxlcjoiQnV0dG9uc0NvbnRyb2xsZXIiLGxpbms6ZnVuY3Rpb24oYSxiLGMsZCl7ZnVuY3Rpb24gZSgpe3JldHVybiBnKGMuYnRuQ2hlY2tib3hUcnVlLCEwKX1mdW5jdGlvbiBmKCl7cmV0dXJuIGcoYy5idG5DaGVja2JveEZhbHNlLCExKX1mdW5jdGlvbiBnKGIsYyl7dmFyIGQ9YS4kZXZhbChiKTtyZXR1cm4gYW5ndWxhci5pc0RlZmluZWQoZCk/ZDpjfXZhciBoPWRbMF0saT1kWzFdO2kuJHJlbmRlcj1mdW5jdGlvbigpe2IudG9nZ2xlQ2xhc3MoaC5hY3RpdmVDbGFzcyxhbmd1bGFyLmVxdWFscyhpLiRtb2RlbFZhbHVlLGUoKSkpfSxiLmJpbmQoaC50b2dnbGVFdmVudCxmdW5jdGlvbigpe2EuJGFwcGx5KGZ1bmN0aW9uKCl7aS4kc2V0Vmlld1ZhbHVlKGIuaGFzQ2xhc3MoaC5hY3RpdmVDbGFzcyk/ZigpOmUoKSksaS4kcmVuZGVyKCl9KX0pfX19KSxhbmd1bGFyLm1vZHVsZSgidWkuYm9vdHN0cmFwLmNhcm91c2VsIixbInVpLmJvb3RzdHJhcC50cmFuc2l0aW9uIl0pLmNvbnRyb2xsZXIoIkNhcm91c2VsQ29udHJvbGxlciIsWyIkc2NvcGUiLCIkdGltZW91dCIsIiR0cmFuc2l0aW9uIixmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZCgpe2UoKTt2YXIgYz0rYS5pbnRlcnZhbDshaXNOYU4oYykmJmM+PTAmJihnPWIoZixjKSl9ZnVuY3Rpb24gZSgpe2cmJihiLmNhbmNlbChnKSxnPW51bGwpfWZ1bmN0aW9uIGYoKXtoPyhhLm5leHQoKSxkKCkpOmEucGF1c2UoKX12YXIgZyxoLGk9dGhpcyxqPWkuc2xpZGVzPWEuc2xpZGVzPVtdLGs9LTE7aS5jdXJyZW50U2xpZGU9bnVsbDt2YXIgbD0hMTtpLnNlbGVjdD1hLnNlbGVjdD1mdW5jdGlvbihlLGYpe2Z1bmN0aW9uIGcoKXtpZighbCl7aWYoaS5jdXJyZW50U2xpZGUmJmFuZ3VsYXIuaXNTdHJpbmcoZikmJiFhLm5vVHJhbnNpdGlvbiYmZS4kZWxlbWVudCl7ZS4kZWxlbWVudC5hZGRDbGFzcyhmKTt7ZS4kZWxlbWVudFswXS5vZmZzZXRXaWR0aH1hbmd1bGFyLmZvckVhY2goaixmdW5jdGlvbihhKXthbmd1bGFyLmV4dGVuZChhLHtkaXJlY3Rpb246IiIsZW50ZXJpbmc6ITEsbGVhdmluZzohMSxhY3RpdmU6ITF9KX0pLGFuZ3VsYXIuZXh0ZW5kKGUse2RpcmVjdGlvbjpmLGFjdGl2ZTohMCxlbnRlcmluZzohMH0pLGFuZ3VsYXIuZXh0ZW5kKGkuY3VycmVudFNsaWRlfHx7fSx7ZGlyZWN0aW9uOmYsbGVhdmluZzohMH0pLGEuJGN1cnJlbnRUcmFuc2l0aW9uPWMoZS4kZWxlbWVudCx7fSksZnVuY3Rpb24oYixjKXthLiRjdXJyZW50VHJhbnNpdGlvbi50aGVuKGZ1bmN0aW9uKCl7aChiLGMpfSxmdW5jdGlvbigpe2goYixjKX0pfShlLGkuY3VycmVudFNsaWRlKX1lbHNlIGgoZSxpLmN1cnJlbnRTbGlkZSk7aS5jdXJyZW50U2xpZGU9ZSxrPW0sZCgpfX1mdW5jdGlvbiBoKGIsYyl7YW5ndWxhci5leHRlbmQoYix7ZGlyZWN0aW9uOiIiLGFjdGl2ZTohMCxsZWF2aW5nOiExLGVudGVyaW5nOiExfSksYW5ndWxhci5leHRlbmQoY3x8e30se2RpcmVjdGlvbjoiIixhY3RpdmU6ITEsbGVhdmluZzohMSxlbnRlcmluZzohMX0pLGEuJGN1cnJlbnRUcmFuc2l0aW9uPW51bGx9dmFyIG09ai5pbmRleE9mKGUpO3ZvaWQgMD09PWYmJihmPW0+az8ibmV4dCI6InByZXYiKSxlJiZlIT09aS5jdXJyZW50U2xpZGUmJihhLiRjdXJyZW50VHJhbnNpdGlvbj8oYS4kY3VycmVudFRyYW5zaXRpb24uY2FuY2VsKCksYihnKSk6ZygpKX0sYS4kb24oIiRkZXN0cm95IixmdW5jdGlvbigpe2w9ITB9KSxpLmluZGV4T2ZTbGlkZT1mdW5jdGlvbihhKXtyZXR1cm4gai5pbmRleE9mKGEpfSxhLm5leHQ9ZnVuY3Rpb24oKXt2YXIgYj0oaysxKSVqLmxlbmd0aDtyZXR1cm4gYS4kY3VycmVudFRyYW5zaXRpb24/dm9pZCAwOmkuc2VsZWN0KGpbYl0sIm5leHQiKX0sYS5wcmV2PWZ1bmN0aW9uKCl7dmFyIGI9MD5rLTE/ai5sZW5ndGgtMTprLTE7cmV0dXJuIGEuJGN1cnJlbnRUcmFuc2l0aW9uP3ZvaWQgMDppLnNlbGVjdChqW2JdLCJwcmV2Iil9LGEuaXNBY3RpdmU9ZnVuY3Rpb24oYSl7cmV0dXJuIGkuY3VycmVudFNsaWRlPT09YX0sYS4kd2F0Y2goImludGVydmFsIixkKSxhLiRvbigiJGRlc3Ryb3kiLGUpLGEucGxheT1mdW5jdGlvbigpe2h8fChoPSEwLGQoKSl9LGEucGF1c2U9ZnVuY3Rpb24oKXthLm5vUGF1c2V8fChoPSExLGUoKSl9LGkuYWRkU2xpZGU9ZnVuY3Rpb24oYixjKXtiLiRlbGVtZW50PWMsai5wdXNoKGIpLDE9PT1qLmxlbmd0aHx8Yi5hY3RpdmU/KGkuc2VsZWN0KGpbai5sZW5ndGgtMV0pLDE9PWoubGVuZ3RoJiZhLnBsYXkoKSk6Yi5hY3RpdmU9ITF9LGkucmVtb3ZlU2xpZGU9ZnVuY3Rpb24oYSl7dmFyIGI9ai5pbmRleE9mKGEpO2ouc3BsaWNlKGIsMSksai5sZW5ndGg+MCYmYS5hY3RpdmU/aS5zZWxlY3QoYj49ai5sZW5ndGg/altiLTFdOmpbYl0pOms+YiYmay0tfX1dKS5kaXJlY3RpdmUoImNhcm91c2VsIixbZnVuY3Rpb24oKXtyZXR1cm57cmVzdHJpY3Q6IkVBIix0cmFuc2NsdWRlOiEwLHJlcGxhY2U6ITAsY29udHJvbGxlcjoiQ2Fyb3VzZWxDb250cm9sbGVyIixyZXF1aXJlOiJjYXJvdXNlbCIsdGVtcGxhdGVVcmw6InRlbXBsYXRlL2Nhcm91c2VsL2Nhcm91c2VsLmh0bWwiLHNjb3BlOntpbnRlcnZhbDoiPSIsbm9UcmFuc2l0aW9uOiI9Iixub1BhdXNlOiI9In19fV0pLmRpcmVjdGl2ZSgic2xpZGUiLGZ1bmN0aW9uKCl7cmV0dXJue3JlcXVpcmU6Il5jYXJvdXNlbCIscmVzdHJpY3Q6IkVBIix0cmFuc2NsdWRlOiEwLHJlcGxhY2U6ITAsdGVtcGxhdGVVcmw6InRlbXBsYXRlL2Nhcm91c2VsL3NsaWRlLmh0bWwiLHNjb3BlOnthY3RpdmU6Ij0/In0sbGluazpmdW5jdGlvbihhLGIsYyxkKXtkLmFkZFNsaWRlKGEsYiksYS4kb24oIiRkZXN0cm95IixmdW5jdGlvbigpe2QucmVtb3ZlU2xpZGUoYSl9KSxhLiR3YXRjaCgiYWN0aXZlIixmdW5jdGlvbihiKXtiJiZkLnNlbGVjdChhKX0pfX19KSxhbmd1bGFyLm1vZHVsZSgidWkuYm9vdHN0cmFwLmRhdGVwYXJzZXIiLFtdKS5zZXJ2aWNlKCJkYXRlUGFyc2VyIixbIiRsb2NhbGUiLCJvcmRlckJ5RmlsdGVyIixmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiLGMpe3JldHVybiAxPT09YiYmYz4yOD8yOT09PWMmJihhJTQ9PT0wJiZhJTEwMCE9PTB8fGElNDAwPT09MCk6Mz09PWJ8fDU9PT1ifHw4PT09Ynx8MTA9PT1iPzMxPmM6ITB9dGhpcy5wYXJzZXJzPXt9O3ZhciBkPXt5eXl5OntyZWdleDoiXFxkezR9IixhcHBseTpmdW5jdGlvbihhKXt0aGlzLnllYXI9K2F9fSx5eTp7cmVnZXg6IlxcZHsyfSIsYXBwbHk6ZnVuY3Rpb24oYSl7dGhpcy55ZWFyPSthKzJlM319LHk6e3JlZ2V4OiJcXGR7MSw0fSIsYXBwbHk6ZnVuY3Rpb24oYSl7dGhpcy55ZWFyPSthfX0sTU1NTTp7cmVnZXg6YS5EQVRFVElNRV9GT1JNQVRTLk1PTlRILmpvaW4oInwiKSxhcHBseTpmdW5jdGlvbihiKXt0aGlzLm1vbnRoPWEuREFURVRJTUVfRk9STUFUUy5NT05USC5pbmRleE9mKGIpfX0sTU1NOntyZWdleDphLkRBVEVUSU1FX0ZPUk1BVFMuU0hPUlRNT05USC5qb2luKCJ8IiksYXBwbHk6ZnVuY3Rpb24oYil7dGhpcy5tb250aD1hLkRBVEVUSU1FX0ZPUk1BVFMuU0hPUlRNT05USC5pbmRleE9mKGIpfX0sTU06e3JlZ2V4OiIwWzEtOV18MVswLTJdIixhcHBseTpmdW5jdGlvbihhKXt0aGlzLm1vbnRoPWEtMX19LE06e3JlZ2V4OiJbMS05XXwxWzAtMl0iLGFwcGx5OmZ1bmN0aW9uKGEpe3RoaXMubW9udGg9YS0xfX0sZGQ6e3JlZ2V4OiJbMC0yXVswLTldezF9fDNbMC0xXXsxfSIsYXBwbHk6ZnVuY3Rpb24oYSl7dGhpcy5kYXRlPSthfX0sZDp7cmVnZXg6IlsxLTJdP1swLTldezF9fDNbMC0xXXsxfSIsYXBwbHk6ZnVuY3Rpb24oYSl7dGhpcy5kYXRlPSthfX0sRUVFRTp7cmVnZXg6YS5EQVRFVElNRV9GT1JNQVRTLkRBWS5qb2luKCJ8Iil9LEVFRTp7cmVnZXg6YS5EQVRFVElNRV9GT1JNQVRTLlNIT1JUREFZLmpvaW4oInwiKX19O3RoaXMuY3JlYXRlUGFyc2VyPWZ1bmN0aW9uKGEpe3ZhciBjPVtdLGU9YS5zcGxpdCgiIik7cmV0dXJuIGFuZ3VsYXIuZm9yRWFjaChkLGZ1bmN0aW9uKGIsZCl7dmFyIGY9YS5pbmRleE9mKGQpO2lmKGY+LTEpe2E9YS5zcGxpdCgiIiksZVtmXT0iKCIrYi5yZWdleCsiKSIsYVtmXT0iJCI7Zm9yKHZhciBnPWYrMSxoPWYrZC5sZW5ndGg7aD5nO2crKyllW2ddPSIiLGFbZ109IiQiO2E9YS5qb2luKCIiKSxjLnB1c2goe2luZGV4OmYsYXBwbHk6Yi5hcHBseX0pfX0pLHtyZWdleDpuZXcgUmVnRXhwKCJeIitlLmpvaW4oIiIpKyIkIiksbWFwOmIoYywiaW5kZXgiKX19LHRoaXMucGFyc2U9ZnVuY3Rpb24oYixkKXtpZighYW5ndWxhci5pc1N0cmluZyhiKSlyZXR1cm4gYjtkPWEuREFURVRJTUVfRk9STUFUU1tkXXx8ZCx0aGlzLnBhcnNlcnNbZF18fCh0aGlzLnBhcnNlcnNbZF09dGhpcy5jcmVhdGVQYXJzZXIoZCkpO3ZhciBlPXRoaXMucGFyc2Vyc1tkXSxmPWUucmVnZXgsZz1lLm1hcCxoPWIubWF0Y2goZik7aWYoaCYmaC5sZW5ndGgpe2Zvcih2YXIgaSxqPXt5ZWFyOjE5MDAsbW9udGg6MCxkYXRlOjEsaG91cnM6MH0saz0xLGw9aC5sZW5ndGg7bD5rO2srKyl7dmFyIG09Z1trLTFdO20uYXBwbHkmJm0uYXBwbHkuY2FsbChqLGhba10pfXJldHVybiBjKGoueWVhcixqLm1vbnRoLGouZGF0ZSkmJihpPW5ldyBEYXRlKGoueWVhcixqLm1vbnRoLGouZGF0ZSxqLmhvdXJzKSksaX19fV0pLGFuZ3VsYXIubW9kdWxlKCJ1aS5ib290c3RyYXAucG9zaXRpb24iLFtdKS5mYWN0b3J5KCIkcG9zaXRpb24iLFsiJGRvY3VtZW50IiwiJHdpbmRvdyIsZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYyl7cmV0dXJuIGEuY3VycmVudFN0eWxlP2EuY3VycmVudFN0eWxlW2NdOmIuZ2V0Q29tcHV0ZWRTdHlsZT9iLmdldENvbXB1dGVkU3R5bGUoYSlbY106YS5zdHlsZVtjXX1mdW5jdGlvbiBkKGEpe3JldHVybiJzdGF0aWMiPT09KGMoYSwicG9zaXRpb24iKXx8InN0YXRpYyIpfXZhciBlPWZ1bmN0aW9uKGIpe2Zvcih2YXIgYz1hWzBdLGU9Yi5vZmZzZXRQYXJlbnR8fGM7ZSYmZSE9PWMmJmQoZSk7KWU9ZS5vZmZzZXRQYXJlbnQ7cmV0dXJuIGV8fGN9O3JldHVybntwb3NpdGlvbjpmdW5jdGlvbihiKXt2YXIgYz10aGlzLm9mZnNldChiKSxkPXt0b3A6MCxsZWZ0OjB9LGY9ZShiWzBdKTtmIT1hWzBdJiYoZD10aGlzLm9mZnNldChhbmd1bGFyLmVsZW1lbnQoZikpLGQudG9wKz1mLmNsaWVudFRvcC1mLnNjcm9sbFRvcCxkLmxlZnQrPWYuY2xpZW50TGVmdC1mLnNjcm9sbExlZnQpO3ZhciBnPWJbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJue3dpZHRoOmcud2lkdGh8fGIucHJvcCgib2Zmc2V0V2lkdGgiKSxoZWlnaHQ6Zy5oZWlnaHR8fGIucHJvcCgib2Zmc2V0SGVpZ2h0IiksdG9wOmMudG9wLWQudG9wLGxlZnQ6Yy5sZWZ0LWQubGVmdH19LG9mZnNldDpmdW5jdGlvbihjKXt2YXIgZD1jWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybnt3aWR0aDpkLndpZHRofHxjLnByb3AoIm9mZnNldFdpZHRoIiksaGVpZ2h0OmQuaGVpZ2h0fHxjLnByb3AoIm9mZnNldEhlaWdodCIpLHRvcDpkLnRvcCsoYi5wYWdlWU9mZnNldHx8YVswXS5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wKSxsZWZ0OmQubGVmdCsoYi5wYWdlWE9mZnNldHx8YVswXS5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCl9fSxwb3NpdGlvbkVsZW1lbnRzOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGYsZyxoLGk9Yy5zcGxpdCgiLSIpLGo9aVswXSxrPWlbMV18fCJjZW50ZXIiO2U9ZD90aGlzLm9mZnNldChhKTp0aGlzLnBvc2l0aW9uKGEpLGY9Yi5wcm9wKCJvZmZzZXRXaWR0aCIpLGc9Yi5wcm9wKCJvZmZzZXRIZWlnaHQiKTt2YXIgbD17Y2VudGVyOmZ1bmN0aW9uKCl7cmV0dXJuIGUubGVmdCtlLndpZHRoLzItZi8yfSxsZWZ0OmZ1bmN0aW9uKCl7cmV0dXJuIGUubGVmdH0scmlnaHQ6ZnVuY3Rpb24oKXtyZXR1cm4gZS5sZWZ0K2Uud2lkdGh9fSxtPXtjZW50ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gZS50b3ArZS5oZWlnaHQvMi1nLzJ9LHRvcDpmdW5jdGlvbigpe3JldHVybiBlLnRvcH0sYm90dG9tOmZ1bmN0aW9uKCl7cmV0dXJuIGUudG9wK2UuaGVpZ2h0fX07c3dpdGNoKGope2Nhc2UicmlnaHQiOmg9e3RvcDptW2tdKCksbGVmdDpsW2pdKCl9O2JyZWFrO2Nhc2UibGVmdCI6aD17dG9wOm1ba10oKSxsZWZ0OmUubGVmdC1mfTticmVhaztjYXNlImJvdHRvbSI6aD17dG9wOm1bal0oKSxsZWZ0Omxba10oKX07YnJlYWs7ZGVmYXVsdDpoPXt0b3A6ZS50b3AtZyxsZWZ0Omxba10oKX19cmV0dXJuIGh9fX1dKSxhbmd1bGFyLm1vZHVsZSgidWkuYm9vdHN0cmFwLmRhdGVwaWNrZXIiLFsidWkuYm9vdHN0cmFwLmRhdGVwYXJzZXIiLCJ1aS5ib290c3RyYXAucG9zaXRpb24iXSkuY29uc3RhbnQoImRhdGVwaWNrZXJDb25maWciLHtmb3JtYXREYXk6ImRkIixmb3JtYXRNb250aDoiTU1NTSIsZm9ybWF0WWVhcjoieXl5eSIsZm9ybWF0RGF5SGVhZGVyOiJFRUUiLGZvcm1hdERheVRpdGxlOiJNTU1NIHl5eXkiLGZvcm1hdE1vbnRoVGl0bGU6Inl5eXkiLGRhdGVwaWNrZXJNb2RlOiJkYXkiLG1pbk1vZGU6ImRheSIsbWF4TW9kZToieWVhciIsc2hvd1dlZWtzOiEwLHN0YXJ0aW5nRGF5OjAseWVhclJhbmdlOjIwLG1pbkRhdGU6bnVsbCxtYXhEYXRlOm51bGx9KS5jb250cm9sbGVyKCJEYXRlcGlja2VyQ29udHJvbGxlciIsWyIkc2NvcGUiLCIkYXR0cnMiLCIkcGFyc2UiLCIkaW50ZXJwb2xhdGUiLCIkdGltZW91dCIsIiRsb2ciLCJkYXRlRmlsdGVyIiwiZGF0ZXBpY2tlckNvbmZpZyIsZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoKXt2YXIgaT10aGlzLGo9eyRzZXRWaWV3VmFsdWU6YW5ndWxhci5ub29wfTt0aGlzLm1vZGVzPVsiZGF5IiwibW9udGgiLCJ5ZWFyIl0sYW5ndWxhci5mb3JFYWNoKFsiZm9ybWF0RGF5IiwiZm9ybWF0TW9udGgiLCJmb3JtYXRZZWFyIiwiZm9ybWF0RGF5SGVhZGVyIiwiZm9ybWF0RGF5VGl0bGUiLCJmb3JtYXRNb250aFRpdGxlIiwibWluTW9kZSIsIm1heE1vZGUiLCJzaG93V2Vla3MiLCJzdGFydGluZ0RheSIsInllYXJSYW5nZSJdLGZ1bmN0aW9uKGMsZSl7aVtjXT1hbmd1bGFyLmlzRGVmaW5lZChiW2NdKT84PmU/ZChiW2NdKShhLiRwYXJlbnQpOmEuJHBhcmVudC4kZXZhbChiW2NdKTpoW2NdfSksYW5ndWxhci5mb3JFYWNoKFsibWluRGF0ZSIsIm1heERhdGUiXSxmdW5jdGlvbihkKXtiW2RdP2EuJHBhcmVudC4kd2F0Y2goYyhiW2RdKSxmdW5jdGlvbihhKXtpW2RdPWE/bmV3IERhdGUoYSk6bnVsbCxpLnJlZnJlc2hWaWV3KCl9KTppW2RdPWhbZF0/bmV3IERhdGUoaFtkXSk6bnVsbH0pLGEuZGF0ZXBpY2tlck1vZGU9YS5kYXRlcGlja2VyTW9kZXx8aC5kYXRlcGlja2VyTW9kZSxhLnVuaXF1ZUlkPSJkYXRlcGlja2VyLSIrYS4kaWQrIi0iK01hdGguZmxvb3IoMWU0Kk1hdGgucmFuZG9tKCkpLHRoaXMuYWN0aXZlRGF0ZT1hbmd1bGFyLmlzRGVmaW5lZChiLmluaXREYXRlKT9hLiRwYXJlbnQuJGV2YWwoYi5pbml0RGF0ZSk6bmV3IERhdGUsYS5pc0FjdGl2ZT1mdW5jdGlvbihiKXtyZXR1cm4gMD09PWkuY29tcGFyZShiLmRhdGUsaS5hY3RpdmVEYXRlKT8oYS5hY3RpdmVEYXRlSWQ9Yi51aWQsITApOiExfSx0aGlzLmluaXQ9ZnVuY3Rpb24oYSl7aj1hLGouJHJlbmRlcj1mdW5jdGlvbigpe2kucmVuZGVyKCl9fSx0aGlzLnJlbmRlcj1mdW5jdGlvbigpe2lmKGouJG1vZGVsVmFsdWUpe3ZhciBhPW5ldyBEYXRlKGouJG1vZGVsVmFsdWUpLGI9IWlzTmFOKGEpO2I/dGhpcy5hY3RpdmVEYXRlPWE6Zi5lcnJvcignRGF0ZXBpY2tlciBkaXJlY3RpdmU6ICJuZy1tb2RlbCIgdmFsdWUgbXVzdCBiZSBhIERhdGUgb2JqZWN0LCBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgMDEuMDEuMTk3MCBvciBhIHN0cmluZyByZXByZXNlbnRpbmcgYW4gUkZDMjgyMiBvciBJU08gODYwMSBkYXRlLicpLGouJHNldFZhbGlkaXR5KCJkYXRlIixiKX10aGlzLnJlZnJlc2hWaWV3KCl9LHRoaXMucmVmcmVzaFZpZXc9ZnVuY3Rpb24oKXtpZih0aGlzLmVsZW1lbnQpe3RoaXMuX3JlZnJlc2hWaWV3KCk7dmFyIGE9ai4kbW9kZWxWYWx1ZT9uZXcgRGF0ZShqLiRtb2RlbFZhbHVlKTpudWxsO2ouJHNldFZhbGlkaXR5KCJkYXRlLWRpc2FibGVkIiwhYXx8dGhpcy5lbGVtZW50JiYhdGhpcy5pc0Rpc2FibGVkKGEpKX19LHRoaXMuY3JlYXRlRGF0ZU9iamVjdD1mdW5jdGlvbihhLGIpe3ZhciBjPWouJG1vZGVsVmFsdWU/bmV3IERhdGUoai4kbW9kZWxWYWx1ZSk6bnVsbDtyZXR1cm57ZGF0ZTphLGxhYmVsOmcoYSxiKSxzZWxlY3RlZDpjJiYwPT09dGhpcy5jb21wYXJlKGEsYyksZGlzYWJsZWQ6dGhpcy5pc0Rpc2FibGVkKGEpLGN1cnJlbnQ6MD09PXRoaXMuY29tcGFyZShhLG5ldyBEYXRlKX19LHRoaXMuaXNEaXNhYmxlZD1mdW5jdGlvbihjKXtyZXR1cm4gdGhpcy5taW5EYXRlJiZ0aGlzLmNvbXBhcmUoYyx0aGlzLm1pbkRhdGUpPDB8fHRoaXMubWF4RGF0ZSYmdGhpcy5jb21wYXJlKGMsdGhpcy5tYXhEYXRlKT4wfHxiLmRhdGVEaXNhYmxlZCYmYS5kYXRlRGlzYWJsZWQoe2RhdGU6Yyxtb2RlOmEuZGF0ZXBpY2tlck1vZGV9KX0sdGhpcy5zcGxpdD1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1bXTthLmxlbmd0aD4wOyljLnB1c2goYS5zcGxpY2UoMCxiKSk7cmV0dXJuIGN9LGEuc2VsZWN0PWZ1bmN0aW9uKGIpe2lmKGEuZGF0ZXBpY2tlck1vZGU9PT1pLm1pbk1vZGUpe3ZhciBjPWouJG1vZGVsVmFsdWU/bmV3IERhdGUoai4kbW9kZWxWYWx1ZSk6bmV3IERhdGUoMCwwLDAsMCwwLDAsMCk7Yy5zZXRGdWxsWWVhcihiLmdldEZ1bGxZZWFyKCksYi5nZXRNb250aCgpLGIuZ2V0RGF0ZSgpKSxqLiRzZXRWaWV3VmFsdWUoYyksai4kcmVuZGVyKCl9ZWxzZSBpLmFjdGl2ZURhdGU9YixhLmRhdGVwaWNrZXJNb2RlPWkubW9kZXNbaS5tb2Rlcy5pbmRleE9mKGEuZGF0ZXBpY2tlck1vZGUpLTFdfSxhLm1vdmU9ZnVuY3Rpb24oYSl7dmFyIGI9aS5hY3RpdmVEYXRlLmdldEZ1bGxZZWFyKCkrYSooaS5zdGVwLnllYXJzfHwwKSxjPWkuYWN0aXZlRGF0ZS5nZXRNb250aCgpK2EqKGkuc3RlcC5tb250aHN8fDApO2kuYWN0aXZlRGF0ZS5zZXRGdWxsWWVhcihiLGMsMSksaS5yZWZyZXNoVmlldygpfSxhLnRvZ2dsZU1vZGU9ZnVuY3Rpb24oYil7Yj1ifHwxLGEuZGF0ZXBpY2tlck1vZGU9PT1pLm1heE1vZGUmJjE9PT1ifHxhLmRhdGVwaWNrZXJNb2RlPT09aS5taW5Nb2RlJiYtMT09PWJ8fChhLmRhdGVwaWNrZXJNb2RlPWkubW9kZXNbaS5tb2Rlcy5pbmRleE9mKGEuZGF0ZXBpY2tlck1vZGUpK2JdKX0sYS5rZXlzPXsxMzoiZW50ZXIiLDMyOiJzcGFjZSIsMzM6InBhZ2V1cCIsMzQ6InBhZ2Vkb3duIiwzNToiZW5kIiwzNjoiaG9tZSIsMzc6ImxlZnQiLDM4OiJ1cCIsMzk6InJpZ2h0Iiw0MDoiZG93biJ9O3ZhciBrPWZ1bmN0aW9uKCl7ZShmdW5jdGlvbigpe2kuZWxlbWVudFswXS5mb2N1cygpfSwwLCExKX07YS4kb24oImRhdGVwaWNrZXIuZm9jdXMiLGspLGEua2V5ZG93bj1mdW5jdGlvbihiKXt2YXIgYz1hLmtleXNbYi53aGljaF07aWYoYyYmIWIuc2hpZnRLZXkmJiFiLmFsdEtleSlpZihiLnByZXZlbnREZWZhdWx0KCksYi5zdG9wUHJvcGFnYXRpb24oKSwiZW50ZXIiPT09Y3x8InNwYWNlIj09PWMpe2lmKGkuaXNEaXNhYmxlZChpLmFjdGl2ZURhdGUpKXJldHVybjthLnNlbGVjdChpLmFjdGl2ZURhdGUpLGsoKX1lbHNlIWIuY3RybEtleXx8InVwIiE9PWMmJiJkb3duIiE9PWM/KGkuaGFuZGxlS2V5RG93bihjLGIpLGkucmVmcmVzaFZpZXcoKSk6KGEudG9nZ2xlTW9kZSgidXAiPT09Yz8xOi0xKSxrKCkpfX1dKS5kaXJlY3RpdmUoImRhdGVwaWNrZXIiLGZ1bmN0aW9uKCl7cmV0dXJue3Jlc3RyaWN0OiJFQSIscmVwbGFjZTohMCx0ZW1wbGF0ZVVybDoidGVtcGxhdGUvZGF0ZXBpY2tlci9kYXRlcGlja2VyLmh0bWwiLHNjb3BlOntkYXRlcGlja2VyTW9kZToiPT8iLGRhdGVEaXNhYmxlZDoiJiJ9LHJlcXVpcmU6WyJkYXRlcGlja2VyIiwiP15uZ01vZGVsIl0sY29udHJvbGxlcjoiRGF0ZXBpY2tlckNvbnRyb2xsZXIiLGxpbms6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9ZFswXSxmPWRbMV07ZiYmZS5pbml0KGYpfX19KS5kaXJlY3RpdmUoImRheXBpY2tlciIsWyJkYXRlRmlsdGVyIixmdW5jdGlvbihhKXtyZXR1cm57cmVzdHJpY3Q6IkVBIixyZXBsYWNlOiEwLHRlbXBsYXRlVXJsOiJ0ZW1wbGF0ZS9kYXRlcGlja2VyL2RheS5odG1sIixyZXF1aXJlOiJeZGF0ZXBpY2tlciIsbGluazpmdW5jdGlvbihiLGMsZCxlKXtmdW5jdGlvbiBmKGEsYil7cmV0dXJuIDEhPT1ifHxhJTQhPT0wfHxhJTEwMD09PTAmJmElNDAwIT09MD9pW2JdOjI5fWZ1bmN0aW9uIGcoYSxiKXt2YXIgYz1uZXcgQXJyYXkoYiksZD1uZXcgRGF0ZShhKSxlPTA7Zm9yKGQuc2V0SG91cnMoMTIpO2I+ZTspY1tlKytdPW5ldyBEYXRlKGQpLGQuc2V0RGF0ZShkLmdldERhdGUoKSsxKTtyZXR1cm4gY31mdW5jdGlvbiBoKGEpe3ZhciBiPW5ldyBEYXRlKGEpO2Iuc2V0RGF0ZShiLmdldERhdGUoKSs0LShiLmdldERheSgpfHw3KSk7dmFyIGM9Yi5nZXRUaW1lKCk7cmV0dXJuIGIuc2V0TW9udGgoMCksYi5zZXREYXRlKDEpLE1hdGguZmxvb3IoTWF0aC5yb3VuZCgoYy1iKS84NjRlNSkvNykrMX1iLnNob3dXZWVrcz1lLnNob3dXZWVrcyxlLnN0ZXA9e21vbnRoczoxfSxlLmVsZW1lbnQ9Yzt2YXIgaT1bMzEsMjgsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdO2UuX3JlZnJlc2hWaWV3PWZ1bmN0aW9uKCl7dmFyIGM9ZS5hY3RpdmVEYXRlLmdldEZ1bGxZZWFyKCksZD1lLmFjdGl2ZURhdGUuZ2V0TW9udGgoKSxmPW5ldyBEYXRlKGMsZCwxKSxpPWUuc3RhcnRpbmdEYXktZi5nZXREYXkoKSxqPWk+MD83LWk6LWksaz1uZXcgRGF0ZShmKTtqPjAmJmsuc2V0RGF0ZSgtaisxKTtmb3IodmFyIGw9ZyhrLDQyKSxtPTA7NDI+bTttKyspbFttXT1hbmd1bGFyLmV4dGVuZChlLmNyZWF0ZURhdGVPYmplY3QobFttXSxlLmZvcm1hdERheSkse3NlY29uZGFyeTpsW21dLmdldE1vbnRoKCkhPT1kLHVpZDpiLnVuaXF1ZUlkKyItIittfSk7Yi5sYWJlbHM9bmV3IEFycmF5KDcpO2Zvcih2YXIgbj0wOzc+bjtuKyspYi5sYWJlbHNbbl09e2FiYnI6YShsW25dLmRhdGUsZS5mb3JtYXREYXlIZWFkZXIpLGZ1bGw6YShsW25dLmRhdGUsIkVFRUUiKX07aWYoYi50aXRsZT1hKGUuYWN0aXZlRGF0ZSxlLmZvcm1hdERheVRpdGxlKSxiLnJvd3M9ZS5zcGxpdChsLDcpLGIuc2hvd1dlZWtzKXtiLndlZWtOdW1iZXJzPVtdO2Zvcih2YXIgbz1oKGIucm93c1swXVswXS5kYXRlKSxwPWIucm93cy5sZW5ndGg7Yi53ZWVrTnVtYmVycy5wdXNoKG8rKyk8cDspO319LGUuY29tcGFyZT1mdW5jdGlvbihhLGIpe3JldHVybiBuZXcgRGF0ZShhLmdldEZ1bGxZZWFyKCksYS5nZXRNb250aCgpLGEuZ2V0RGF0ZSgpKS1uZXcgRGF0ZShiLmdldEZ1bGxZZWFyKCksYi5nZXRNb250aCgpLGIuZ2V0RGF0ZSgpKX0sZS5oYW5kbGVLZXlEb3duPWZ1bmN0aW9uKGEpe3ZhciBiPWUuYWN0aXZlRGF0ZS5nZXREYXRlKCk7aWYoImxlZnQiPT09YSliLT0xO2Vsc2UgaWYoInVwIj09PWEpYi09NztlbHNlIGlmKCJyaWdodCI9PT1hKWIrPTE7ZWxzZSBpZigiZG93biI9PT1hKWIrPTc7ZWxzZSBpZigicGFnZXVwIj09PWF8fCJwYWdlZG93biI9PT1hKXt2YXIgYz1lLmFjdGl2ZURhdGUuZ2V0TW9udGgoKSsoInBhZ2V1cCI9PT1hPy0xOjEpO2UuYWN0aXZlRGF0ZS5zZXRNb250aChjLDEpLGI9TWF0aC5taW4oZihlLmFjdGl2ZURhdGUuZ2V0RnVsbFllYXIoKSxlLmFjdGl2ZURhdGUuZ2V0TW9udGgoKSksYil9ZWxzZSJob21lIj09PWE/Yj0xOiJlbmQiPT09YSYmKGI9ZihlLmFjdGl2ZURhdGUuZ2V0RnVsbFllYXIoKSxlLmFjdGl2ZURhdGUuZ2V0TW9udGgoKSkpO2UuYWN0aXZlRGF0ZS5zZXREYXRlKGIpfSxlLnJlZnJlc2hWaWV3KCl9fX1dKS5kaXJlY3RpdmUoIm1vbnRocGlja2VyIixbImRhdGVGaWx0ZXIiLGZ1bmN0aW9uKGEpe3JldHVybntyZXN0cmljdDoiRUEiLHJlcGxhY2U6ITAsdGVtcGxhdGVVcmw6InRlbXBsYXRlL2RhdGVwaWNrZXIvbW9udGguaHRtbCIscmVxdWlyZToiXmRhdGVwaWNrZXIiLGxpbms6ZnVuY3Rpb24oYixjLGQsZSl7ZS5zdGVwPXt5ZWFyczoxfSxlLmVsZW1lbnQ9YyxlLl9yZWZyZXNoVmlldz1mdW5jdGlvbigpe2Zvcih2YXIgYz1uZXcgQXJyYXkoMTIpLGQ9ZS5hY3RpdmVEYXRlLmdldEZ1bGxZZWFyKCksZj0wOzEyPmY7ZisrKWNbZl09YW5ndWxhci5leHRlbmQoZS5jcmVhdGVEYXRlT2JqZWN0KG5ldyBEYXRlKGQsZiwxKSxlLmZvcm1hdE1vbnRoKSx7dWlkOmIudW5pcXVlSWQrIi0iK2Z9KTtiLnRpdGxlPWEoZS5hY3RpdmVEYXRlLGUuZm9ybWF0TW9udGhUaXRsZSksYi5yb3dzPWUuc3BsaXQoYywzKX0sZS5jb21wYXJlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBEYXRlKGEuZ2V0RnVsbFllYXIoKSxhLmdldE1vbnRoKCkpLW5ldyBEYXRlKGIuZ2V0RnVsbFllYXIoKSxiLmdldE1vbnRoKCkpfSxlLmhhbmRsZUtleURvd249ZnVuY3Rpb24oYSl7dmFyIGI9ZS5hY3RpdmVEYXRlLmdldE1vbnRoKCk7aWYoImxlZnQiPT09YSliLT0xO2Vsc2UgaWYoInVwIj09PWEpYi09MztlbHNlIGlmKCJyaWdodCI9PT1hKWIrPTE7ZWxzZSBpZigiZG93biI9PT1hKWIrPTM7ZWxzZSBpZigicGFnZXVwIj09PWF8fCJwYWdlZG93biI9PT1hKXt2YXIgYz1lLmFjdGl2ZURhdGUuZ2V0RnVsbFllYXIoKSsoInBhZ2V1cCI9PT1hPy0xOjEpO2UuYWN0aXZlRGF0ZS5zZXRGdWxsWWVhcihjKX1lbHNlImhvbWUiPT09YT9iPTA6ImVuZCI9PT1hJiYoYj0xMSk7ZS5hY3RpdmVEYXRlLnNldE1vbnRoKGIpfSxlLnJlZnJlc2hWaWV3KCl9fX1dKS5kaXJlY3RpdmUoInllYXJwaWNrZXIiLFsiZGF0ZUZpbHRlciIsZnVuY3Rpb24oKXtyZXR1cm57cmVzdHJpY3Q6IkVBIixyZXBsYWNlOiEwLHRlbXBsYXRlVXJsOiJ0ZW1wbGF0ZS9kYXRlcGlja2VyL3llYXIuaHRtbCIscmVxdWlyZToiXmRhdGVwaWNrZXIiLGxpbms6ZnVuY3Rpb24oYSxiLGMsZCl7ZnVuY3Rpb24gZShhKXtyZXR1cm4gcGFyc2VJbnQoKGEtMSkvZiwxMCkqZisxfXZhciBmPWQueWVhclJhbmdlO2Quc3RlcD17eWVhcnM6Zn0sZC5lbGVtZW50PWIsZC5fcmVmcmVzaFZpZXc9ZnVuY3Rpb24oKXtmb3IodmFyIGI9bmV3IEFycmF5KGYpLGM9MCxnPWUoZC5hY3RpdmVEYXRlLmdldEZ1bGxZZWFyKCkpO2Y+YztjKyspYltjXT1hbmd1bGFyLmV4dGVuZChkLmNyZWF0ZURhdGVPYmplY3QobmV3IERhdGUoZytjLDAsMSksZC5mb3JtYXRZZWFyKSx7dWlkOmEudW5pcXVlSWQrIi0iK2N9KTthLnRpdGxlPVtiWzBdLmxhYmVsLGJbZi0xXS5sYWJlbF0uam9pbigiIC0gIiksYS5yb3dzPWQuc3BsaXQoYiw1KX0sZC5jb21wYXJlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0RnVsbFllYXIoKS1iLmdldEZ1bGxZZWFyKCl9LGQuaGFuZGxlS2V5RG93bj1mdW5jdGlvbihhKXt2YXIgYj1kLmFjdGl2ZURhdGUuZ2V0RnVsbFllYXIoKTsibGVmdCI9PT1hP2ItPTE6InVwIj09PWE/Yi09NToicmlnaHQiPT09YT9iKz0xOiJkb3duIj09PWE/Yis9NToicGFnZXVwIj09PWF8fCJwYWdlZG93biI9PT1hP2IrPSgicGFnZXVwIj09PWE/LTE6MSkqZC5zdGVwLnllYXJzOiJob21lIj09PWE/Yj1lKGQuYWN0aXZlRGF0ZS5nZXRGdWxsWWVhcigpKToiZW5kIj09PWEmJihiPWUoZC5hY3RpdmVEYXRlLmdldEZ1bGxZZWFyKCkpK2YtMSksZC5hY3RpdmVEYXRlLnNldEZ1bGxZZWFyKGIpfSxkLnJlZnJlc2hWaWV3KCl9fX1dKS5jb25zdGFudCgiZGF0ZXBpY2tlclBvcHVwQ29uZmlnIix7ZGF0ZXBpY2tlclBvcHVwOiJ5eXl5LU1NLWRkIixjdXJyZW50VGV4dDoiVG9kYXkiLGNsZWFyVGV4dDoiQ2xlYXIiLGNsb3NlVGV4dDoiRG9uZSIsY2xvc2VPbkRhdGVTZWxlY3Rpb246ITAsYXBwZW5kVG9Cb2R5OiExLHNob3dCdXR0b25CYXI6ITB9KS5kaXJlY3RpdmUoImRhdGVwaWNrZXJQb3B1cCIsWyIkY29tcGlsZSIsIiRwYXJzZSIsIiRkb2N1bWVudCIsIiRwb3NpdGlvbiIsImRhdGVGaWx0ZXIiLCJkYXRlUGFyc2VyIiwiZGF0ZXBpY2tlclBvcHVwQ29uZmlnIixmdW5jdGlvbihhLGIsYyxkLGUsZixnKXtyZXR1cm57cmVzdHJpY3Q6IkVBIixyZXF1aXJlOiJuZ01vZGVsIixzY29wZTp7aXNPcGVuOiI9PyIsY3VycmVudFRleHQ6IkAiLGNsZWFyVGV4dDoiQCIsY2xvc2VUZXh0OiJAIixkYXRlRGlzYWJsZWQ6IiYifSxsaW5rOmZ1bmN0aW9uKGgsaSxqLGspe2Z1bmN0aW9uIGwoYSl7cmV0dXJuIGEucmVwbGFjZSgvKFtBLVpdKS9nLGZ1bmN0aW9uKGEpe3JldHVybiItIithLnRvTG93ZXJDYXNlKCl9KX1mdW5jdGlvbiBtKGEpe2lmKGEpe2lmKGFuZ3VsYXIuaXNEYXRlKGEpJiYhaXNOYU4oYSkpcmV0dXJuIGsuJHNldFZhbGlkaXR5KCJkYXRlIiwhMCksYTtpZihhbmd1bGFyLmlzU3RyaW5nKGEpKXt2YXIgYj1mLnBhcnNlKGEsbil8fG5ldyBEYXRlKGEpO3JldHVybiBpc05hTihiKT92b2lkIGsuJHNldFZhbGlkaXR5KCJkYXRlIiwhMSk6KGsuJHNldFZhbGlkaXR5KCJkYXRlIiwhMCksYil9cmV0dXJuIHZvaWQgay4kc2V0VmFsaWRpdHkoImRhdGUiLCExKX1yZXR1cm4gay4kc2V0VmFsaWRpdHkoImRhdGUiLCEwKSxudWxsfXZhciBuLG89YW5ndWxhci5pc0RlZmluZWQoai5jbG9zZU9uRGF0ZVNlbGVjdGlvbik/aC4kcGFyZW50LiRldmFsKGouY2xvc2VPbkRhdGVTZWxlY3Rpb24pOmcuY2xvc2VPbkRhdGVTZWxlY3Rpb24scD1hbmd1bGFyLmlzRGVmaW5lZChqLmRhdGVwaWNrZXJBcHBlbmRUb0JvZHkpP2guJHBhcmVudC4kZXZhbChqLmRhdGVwaWNrZXJBcHBlbmRUb0JvZHkpOmcuYXBwZW5kVG9Cb2R5O2guc2hvd0J1dHRvbkJhcj1hbmd1bGFyLmlzRGVmaW5lZChqLnNob3dCdXR0b25CYXIpP2guJHBhcmVudC4kZXZhbChqLnNob3dCdXR0b25CYXIpOmcuc2hvd0J1dHRvbkJhcixoLmdldFRleHQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGhbYSsiVGV4dCJdfHxnW2ErIlRleHQiXX0sai4kb2JzZXJ2ZSgiZGF0ZXBpY2tlclBvcHVwIixmdW5jdGlvbihhKXtuPWF8fGcuZGF0ZXBpY2tlclBvcHVwLGsuJHJlbmRlcigpfSk7dmFyIHE9YW5ndWxhci5lbGVtZW50KCI8ZGl2IGRhdGVwaWNrZXItcG9wdXAtd3JhcD48ZGl2IGRhdGVwaWNrZXI+PC9kaXY+PC9kaXY+Iik7cS5hdHRyKHsibmctbW9kZWwiOiJkYXRlIiwibmctY2hhbmdlIjoiZGF0ZVNlbGVjdGlvbigpIn0pO3ZhciByPWFuZ3VsYXIuZWxlbWVudChxLmNoaWxkcmVuKClbMF0pO2ouZGF0ZXBpY2tlck9wdGlvbnMmJmFuZ3VsYXIuZm9yRWFjaChoLiRwYXJlbnQuJGV2YWwoai5kYXRlcGlja2VyT3B0aW9ucyksZnVuY3Rpb24oYSxiKXtyLmF0dHIobChiKSxhKX0pLGFuZ3VsYXIuZm9yRWFjaChbIm1pbkRhdGUiLCJtYXhEYXRlIl0sZnVuY3Rpb24oYSl7althXSYmKGguJHBhcmVudC4kd2F0Y2goYihqW2FdKSxmdW5jdGlvbihiKXtoW2FdPWJ9KSxyLmF0dHIobChhKSxhKSl9KSxqLmRhdGVEaXNhYmxlZCYmci5hdHRyKCJkYXRlLWRpc2FibGVkIiwiZGF0ZURpc2FibGVkKHsgZGF0ZTogZGF0ZSwgbW9kZTogbW9kZSB9KSIpLGsuJHBhcnNlcnMudW5zaGlmdChtKSxoLmRhdGVTZWxlY3Rpb249ZnVuY3Rpb24oYSl7YW5ndWxhci5pc0RlZmluZWQoYSkmJihoLmRhdGU9YSksay4kc2V0Vmlld1ZhbHVlKGguZGF0ZSksay4kcmVuZGVyKCksbyYmKGguaXNPcGVuPSExLGlbMF0uZm9jdXMoKSl9LGkuYmluZCgiaW5wdXQgY2hhbmdlIGtleXVwIixmdW5jdGlvbigpe2guJGFwcGx5KGZ1bmN0aW9uKCl7aC5kYXRlPWsuJG1vZGVsVmFsdWV9KX0pLGsuJHJlbmRlcj1mdW5jdGlvbigpe3ZhciBhPWsuJHZpZXdWYWx1ZT9lKGsuJHZpZXdWYWx1ZSxuKToiIjtpLnZhbChhKSxoLmRhdGU9bShrLiRtb2RlbFZhbHVlKX07dmFyIHM9ZnVuY3Rpb24oYSl7aC5pc09wZW4mJmEudGFyZ2V0IT09aVswXSYmaC4kYXBwbHkoZnVuY3Rpb24oKXtoLmlzT3Blbj0hMX0pfSx0PWZ1bmN0aW9uKGEpe2gua2V5ZG93bihhKX07aS5iaW5kKCJrZXlkb3duIix0KSxoLmtleWRvd249ZnVuY3Rpb24oYSl7Mjc9PT1hLndoaWNoPyhhLnByZXZlbnREZWZhdWx0KCksYS5zdG9wUHJvcGFnYXRpb24oKSxoLmNsb3NlKCkpOjQwIT09YS53aGljaHx8aC5pc09wZW58fChoLmlzT3Blbj0hMCl9LGguJHdhdGNoKCJpc09wZW4iLGZ1bmN0aW9uKGEpe2E/KGguJGJyb2FkY2FzdCgiZGF0ZXBpY2tlci5mb2N1cyIpLGgucG9zaXRpb249cD9kLm9mZnNldChpKTpkLnBvc2l0aW9uKGkpLGgucG9zaXRpb24udG9wPWgucG9zaXRpb24udG9wK2kucHJvcCgib2Zmc2V0SGVpZ2h0IiksYy5iaW5kKCJjbGljayIscykpOmMudW5iaW5kKCJjbGljayIscyl9KSxoLnNlbGVjdD1mdW5jdGlvbihhKXtpZigidG9kYXkiPT09YSl7dmFyIGI9bmV3IERhdGU7YW5ndWxhci5pc0RhdGUoay4kbW9kZWxWYWx1ZSk/KGE9bmV3IERhdGUoay4kbW9kZWxWYWx1ZSksYS5zZXRGdWxsWWVhcihiLmdldEZ1bGxZZWFyKCksYi5nZXRNb250aCgpLGIuZ2V0RGF0ZSgpKSk6YT1uZXcgRGF0ZShiLnNldEhvdXJzKDAsMCwwLDApKX1oLmRhdGVTZWxlY3Rpb24oYSl9LGguY2xvc2U9ZnVuY3Rpb24oKXtoLmlzT3Blbj0hMSxpWzBdLmZvY3VzKCl9O3ZhciB1PWEocSkoaCk7cD9jLmZpbmQoImJvZHkiKS5hcHBlbmQodSk6aS5hZnRlcih1KSxoLiRvbigiJGRlc3Ryb3kiLGZ1bmN0aW9uKCl7dS5yZW1vdmUoKSxpLnVuYmluZCgia2V5ZG93biIsdCksYy51bmJpbmQoImNsaWNrIixzKX0pfX19XSkuZGlyZWN0aXZlKCJkYXRlcGlja2VyUG9wdXBXcmFwIixmdW5jdGlvbigpe3JldHVybntyZXN0cmljdDoiRUEiLHJlcGxhY2U6ITAsdHJhbnNjbHVkZTohMCx0ZW1wbGF0ZVVybDoidGVtcGxhdGUvZGF0ZXBpY2tlci9wb3B1cC5odG1sIixsaW5rOmZ1bmN0aW9uKGEsYil7Yi5iaW5kKCJjbGljayIsZnVuY3Rpb24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpLGEuc3RvcFByb3BhZ2F0aW9uKCl9KX19fSksYW5ndWxhci5tb2R1bGUoInVpLmJvb3RzdHJhcC5kcm9wZG93biIsW10pLmNvbnN0YW50KCJkcm9wZG93bkNvbmZpZyIse29wZW5DbGFzczoib3BlbiJ9KS5zZXJ2aWNlKCJkcm9wZG93blNlcnZpY2UiLFsiJGRvY3VtZW50IixmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RoaXMub3Blbj1mdW5jdGlvbihlKXtifHwoYS5iaW5kKCJjbGljayIsYyksYS5iaW5kKCJrZXlkb3duIixkKSksYiYmYiE9PWUmJihiLmlzT3Blbj0hMSksYj1lfSx0aGlzLmNsb3NlPWZ1bmN0aW9uKGUpe2I9PT1lJiYoYj1udWxsLGEudW5iaW5kKCJjbGljayIsYyksYS51bmJpbmQoImtleWRvd24iLGQpKX07dmFyIGM9ZnVuY3Rpb24oYSl7YSYmYS5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8Yi4kYXBwbHkoZnVuY3Rpb24oKXtiLmlzT3Blbj0hMX0pfSxkPWZ1bmN0aW9uKGEpezI3PT09YS53aGljaCYmKGIuZm9jdXNUb2dnbGVFbGVtZW50KCksYygpKX19XSkuY29udHJvbGxlcigiRHJvcGRvd25Db250cm9sbGVyIixbIiRzY29wZSIsIiRhdHRycyIsIiRwYXJzZSIsImRyb3Bkb3duQ29uZmlnIiwiZHJvcGRvd25TZXJ2aWNlIiwiJGFuaW1hdGUiLGZ1bmN0aW9uKGEsYixjLGQsZSxmKXt2YXIgZyxoPXRoaXMsaT1hLiRuZXcoKSxqPWQub3BlbkNsYXNzLGs9YW5ndWxhci5ub29wLGw9Yi5vblRvZ2dsZT9jKGIub25Ub2dnbGUpOmFuZ3VsYXIubm9vcDt0aGlzLmluaXQ9ZnVuY3Rpb24oZCl7aC4kZWxlbWVudD1kLGIuaXNPcGVuJiYoZz1jKGIuaXNPcGVuKSxrPWcuYXNzaWduLGEuJHdhdGNoKGcsZnVuY3Rpb24oYSl7aS5pc09wZW49ISFhfSkpfSx0aGlzLnRvZ2dsZT1mdW5jdGlvbihhKXtyZXR1cm4gaS5pc09wZW49YXJndW1lbnRzLmxlbmd0aD8hIWE6IWkuaXNPcGVufSx0aGlzLmlzT3Blbj1mdW5jdGlvbigpe3JldHVybiBpLmlzT3Blbn0saS5mb2N1c1RvZ2dsZUVsZW1lbnQ9ZnVuY3Rpb24oKXtoLnRvZ2dsZUVsZW1lbnQmJmgudG9nZ2xlRWxlbWVudFswXS5mb2N1cygpfSxpLiR3YXRjaCgiaXNPcGVuIixmdW5jdGlvbihiLGMpe2ZbYj8iYWRkQ2xhc3MiOiJyZW1vdmVDbGFzcyJdKGguJGVsZW1lbnQsaiksYj8oaS5mb2N1c1RvZ2dsZUVsZW1lbnQoKSxlLm9wZW4oaSkpOmUuY2xvc2UoaSksayhhLGIpLGFuZ3VsYXIuaXNEZWZpbmVkKGIpJiZiIT09YyYmbChhLHtvcGVuOiEhYn0pfSksYS4kb24oIiRsb2NhdGlvbkNoYW5nZVN1Y2Nlc3MiLGZ1bmN0aW9uKCl7aS5pc09wZW49ITF9KSxhLiRvbigiJGRlc3Ryb3kiLGZ1bmN0aW9uKCl7aS4kZGVzdHJveSgpfSl9XSkuZGlyZWN0aXZlKCJkcm9wZG93biIsZnVuY3Rpb24oKXtyZXR1cm57cmVzdHJpY3Q6IkNBIixjb250cm9sbGVyOiJEcm9wZG93bkNvbnRyb2xsZXIiLGxpbms6ZnVuY3Rpb24oYSxiLGMsZCl7ZC5pbml0KGIpfX19KS5kaXJlY3RpdmUoImRyb3Bkb3duVG9nZ2xlIixmdW5jdGlvbigpe3JldHVybntyZXN0cmljdDoiQ0EiLHJlcXVpcmU6Ij9eZHJvcGRvd24iLGxpbms6ZnVuY3Rpb24oYSxiLGMsZCl7aWYoZCl7ZC50b2dnbGVFbGVtZW50PWI7dmFyIGU9ZnVuY3Rpb24oZSl7ZS5wcmV2ZW50RGVmYXVsdCgpLGIuaGFzQ2xhc3MoImRpc2FibGVkIil8fGMuZGlzYWJsZWR8fGEuJGFwcGx5KGZ1bmN0aW9uKCl7ZC50b2dnbGUoKX0pfTtiLmJpbmQoImNsaWNrIixlKSxiLmF0dHIoeyJhcmlhLWhhc3BvcHVwIjohMCwiYXJpYS1leHBhbmRlZCI6ITF9KSxhLiR3YXRjaChkLmlzT3BlbixmdW5jdGlvbihhKXtiLmF0dHIoImFyaWEtZXhwYW5kZWQiLCEhYSl9KSxhLiRvbigiJGRlc3Ryb3kiLGZ1bmN0aW9uKCl7Yi51bmJpbmQoImNsaWNrIixlKX0pfX19fSksYW5ndWxhci5tb2R1bGUoInVpLmJvb3RzdHJhcC5tb2RhbCIsWyJ1aS5ib290c3RyYXAudHJhbnNpdGlvbiJdKS5mYWN0b3J5KCIkJHN0YWNrZWRNYXAiLGZ1bmN0aW9uKCl7cmV0dXJue2NyZWF0ZU5ldzpmdW5jdGlvbigpe3ZhciBhPVtdO3JldHVybnthZGQ6ZnVuY3Rpb24oYixjKXthLnB1c2goe2tleTpiLHZhbHVlOmN9KX0sZ2V0OmZ1bmN0aW9uKGIpe2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGI9PWFbY10ua2V5KXJldHVybiBhW2NdfSxrZXlzOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXS5rZXkpO3JldHVybiBifSx0b3A6ZnVuY3Rpb24oKXtyZXR1cm4gYVthLmxlbmd0aC0xXX0scmVtb3ZlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYz0tMSxkPTA7ZDxhLmxlbmd0aDtkKyspaWYoYj09YVtkXS5rZXkpe2M9ZDticmVha31yZXR1cm4gYS5zcGxpY2UoYywxKVswXX0scmVtb3ZlVG9wOmZ1bmN0aW9uKCl7cmV0dXJuIGEuc3BsaWNlKGEubGVuZ3RoLTEsMSlbMF19LGxlbmd0aDpmdW5jdGlvbigpe3JldHVybiBhLmxlbmd0aH19fX19KS5kaXJlY3RpdmUoIm1vZGFsQmFja2Ryb3AiLFsiJHRpbWVvdXQiLGZ1bmN0aW9uKGEpe3JldHVybntyZXN0cmljdDoiRUEiLHJlcGxhY2U6ITAsdGVtcGxhdGVVcmw6InRlbXBsYXRlL21vZGFsL2JhY2tkcm9wLmh0bWwiLGxpbms6ZnVuY3Rpb24oYil7Yi5hbmltYXRlPSExLGEoZnVuY3Rpb24oKXtiLmFuaW1hdGU9ITB9KX19fV0pLmRpcmVjdGl2ZSgibW9kYWxXaW5kb3ciLFsiJG1vZGFsU3RhY2siLCIkdGltZW91dCIsZnVuY3Rpb24oYSxiKXtyZXR1cm57cmVzdHJpY3Q6IkVBIixzY29wZTp7aW5kZXg6IkAiLGFuaW1hdGU6Ij0ifSxyZXBsYWNlOiEwLHRyYW5zY2x1ZGU6ITAsdGVtcGxhdGVVcmw6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi50ZW1wbGF0ZVVybHx8InRlbXBsYXRlL21vZGFsL3dpbmRvdy5odG1sIn0sbGluazpmdW5jdGlvbihjLGQsZSl7ZC5hZGRDbGFzcyhlLndpbmRvd0NsYXNzfHwiIiksYy5zaXplPWUuc2l6ZSxiKGZ1bmN0aW9uKCl7Yy5hbmltYXRlPSEwLGRbMF0uZm9jdXMoKX0pLGMuY2xvc2U9ZnVuY3Rpb24oYil7dmFyIGM9YS5nZXRUb3AoKTtjJiZjLnZhbHVlLmJhY2tkcm9wJiYic3RhdGljIiE9Yy52YWx1ZS5iYWNrZHJvcCYmYi50YXJnZXQ9PT1iLmN1cnJlbnRUYXJnZXQmJihiLnByZXZlbnREZWZhdWx0KCksYi5zdG9wUHJvcGFnYXRpb24oKSxhLmRpc21pc3MoYy5rZXksImJhY2tkcm9wIGNsaWNrIikpfX19fV0pLmZhY3RvcnkoIiRtb2RhbFN0YWNrIixbIiR0cmFuc2l0aW9uIiwiJHRpbWVvdXQiLCIkZG9jdW1lbnQiLCIkY29tcGlsZSIsIiRyb290U2NvcGUiLCIkJHN0YWNrZWRNYXAiLGZ1bmN0aW9uKGEsYixjLGQsZSxmKXtmdW5jdGlvbiBnKCl7Zm9yKHZhciBhPS0xLGI9bi5rZXlzKCksYz0wO2M8Yi5sZW5ndGg7YysrKW4uZ2V0KGJbY10pLnZhbHVlLmJhY2tkcm9wJiYoYT1jKTtyZXR1cm4gYX1mdW5jdGlvbiBoKGEpe3ZhciBiPWMuZmluZCgiYm9keSIpLmVxKDApLGQ9bi5nZXQoYSkudmFsdWU7bi5yZW1vdmUoYSksaihkLm1vZGFsRG9tRWwsZC5tb2RhbFNjb3BlLDMwMCxmdW5jdGlvbigpe2QubW9kYWxTY29wZS4kZGVzdHJveSgpLGIudG9nZ2xlQ2xhc3MobSxuLmxlbmd0aCgpPjApLGkoKX0pfWZ1bmN0aW9uIGkoKXtpZihrJiYtMT09ZygpKXt2YXIgYT1sO2ooayxsLDE1MCxmdW5jdGlvbigpe2EuJGRlc3Ryb3koKSxhPW51bGx9KSxrPXZvaWQgMCxsPXZvaWQgMH19ZnVuY3Rpb24gaihjLGQsZSxmKXtmdW5jdGlvbiBnKCl7Zy5kb25lfHwoZy5kb25lPSEwLGMucmVtb3ZlKCksZiYmZigpKX1kLmFuaW1hdGU9ITE7dmFyIGg9YS50cmFuc2l0aW9uRW5kRXZlbnROYW1lO2lmKGgpe3ZhciBpPWIoZyxlKTtjLmJpbmQoaCxmdW5jdGlvbigpe2IuY2FuY2VsKGkpLGcoKSxkLiRhcHBseSgpfSl9ZWxzZSBiKGcsMCl9dmFyIGssbCxtPSJtb2RhbC1vcGVuIixuPWYuY3JlYXRlTmV3KCksbz17fTtyZXR1cm4gZS4kd2F0Y2goZyxmdW5jdGlvbihhKXtsJiYobC5pbmRleD1hKX0pLGMuYmluZCgia2V5ZG93biIsZnVuY3Rpb24oYSl7dmFyIGI7Mjc9PT1hLndoaWNoJiYoYj1uLnRvcCgpLGImJmIudmFsdWUua2V5Ym9hcmQmJihhLnByZXZlbnREZWZhdWx0KCksZS4kYXBwbHkoZnVuY3Rpb24oKXtvLmRpc21pc3MoYi5rZXksImVzY2FwZSBrZXkgcHJlc3MiKX0pKSl9KSxvLm9wZW49ZnVuY3Rpb24oYSxiKXtuLmFkZChhLHtkZWZlcnJlZDpiLmRlZmVycmVkLG1vZGFsU2NvcGU6Yi5zY29wZSxiYWNrZHJvcDpiLmJhY2tkcm9wLGtleWJvYXJkOmIua2V5Ym9hcmR9KTt2YXIgZj1jLmZpbmQoImJvZHkiKS5lcSgwKSxoPWcoKTtoPj0wJiYhayYmKGw9ZS4kbmV3KCEwKSxsLmluZGV4PWgsaz1kKCI8ZGl2IG1vZGFsLWJhY2tkcm9wPjwvZGl2PiIpKGwpLGYuYXBwZW5kKGspKTt2YXIgaT1hbmd1bGFyLmVsZW1lbnQoIjxkaXYgbW9kYWwtd2luZG93PjwvZGl2PiIpO2kuYXR0cih7InRlbXBsYXRlLXVybCI6Yi53aW5kb3dUZW1wbGF0ZVVybCwid2luZG93LWNsYXNzIjpiLndpbmRvd0NsYXNzLHNpemU6Yi5zaXplLGluZGV4Om4ubGVuZ3RoKCktMSxhbmltYXRlOiJhbmltYXRlIn0pLmh0bWwoYi5jb250ZW50KTt2YXIgaj1kKGkpKGIuc2NvcGUpO24udG9wKCkudmFsdWUubW9kYWxEb21FbD1qLGYuYXBwZW5kKGopLGYuYWRkQ2xhc3MobSl9LG8uY2xvc2U9ZnVuY3Rpb24oYSxiKXt2YXIgYz1uLmdldChhKS52YWx1ZTtjJiYoYy5kZWZlcnJlZC5yZXNvbHZlKGIpLGgoYSkpfSxvLmRpc21pc3M9ZnVuY3Rpb24oYSxiKXt2YXIgYz1uLmdldChhKS52YWx1ZTtjJiYoYy5kZWZlcnJlZC5yZWplY3QoYiksaChhKSl9LG8uZGlzbWlzc0FsbD1mdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRUb3AoKTtiOyl0aGlzLmRpc21pc3MoYi5rZXksYSksYj10aGlzLmdldFRvcCgpfSxvLmdldFRvcD1mdW5jdGlvbigpe3JldHVybiBuLnRvcCgpfSxvfV0pLnByb3ZpZGVyKCIkbW9kYWwiLGZ1bmN0aW9uKCl7dmFyIGE9e29wdGlvbnM6e2JhY2tkcm9wOiEwLGtleWJvYXJkOiEwfSwkZ2V0OlsiJGluamVjdG9yIiwiJHJvb3RTY29wZSIsIiRxIiwiJGh0dHAiLCIkdGVtcGxhdGVDYWNoZSIsIiRjb250cm9sbGVyIiwiJG1vZGFsU3RhY2siLGZ1bmN0aW9uKGIsYyxkLGUsZixnLGgpe2Z1bmN0aW9uIGkoYSl7cmV0dXJuIGEudGVtcGxhdGU/ZC53aGVuKGEudGVtcGxhdGUpOmUuZ2V0KGEudGVtcGxhdGVVcmwse2NhY2hlOmZ9KS50aGVuKGZ1bmN0aW9uKGEpe3JldHVybiBhLmRhdGF9KX1mdW5jdGlvbiBqKGEpe3ZhciBjPVtdO3JldHVybiBhbmd1bGFyLmZvckVhY2goYSxmdW5jdGlvbihhKXsoYW5ndWxhci5pc0Z1bmN0aW9uKGEpfHxhbmd1bGFyLmlzQXJyYXkoYSkpJiZjLnB1c2goZC53aGVuKGIuaW52b2tlKGEpKSl9KSxjfXZhciBrPXt9O3JldHVybiBrLm9wZW49ZnVuY3Rpb24oYil7dmFyIGU9ZC5kZWZlcigpLGY9ZC5kZWZlcigpLGs9e3Jlc3VsdDplLnByb21pc2Usb3BlbmVkOmYucHJvbWlzZSxjbG9zZTpmdW5jdGlvbihhKXtoLmNsb3NlKGssYSl9LGRpc21pc3M6ZnVuY3Rpb24oYSl7aC5kaXNtaXNzKGssYSl9fTtpZihiPWFuZ3VsYXIuZXh0ZW5kKHt9LGEub3B0aW9ucyxiKSxiLnJlc29sdmU9Yi5yZXNvbHZlfHx7fSwhYi50ZW1wbGF0ZSYmIWIudGVtcGxhdGVVcmwpdGhyb3cgbmV3IEVycm9yKCJPbmUgb2YgdGVtcGxhdGUgb3IgdGVtcGxhdGVVcmwgb3B0aW9ucyBpcyByZXF1aXJlZC4iKTt2YXIgbD1kLmFsbChbaShiKV0uY29uY2F0KGooYi5yZXNvbHZlKSkpO3JldHVybiBsLnRoZW4oZnVuY3Rpb24oYSl7dmFyIGQ9KGIuc2NvcGV8fGMpLiRuZXcoKTtkLiRjbG9zZT1rLmNsb3NlLGQuJGRpc21pc3M9ay5kaXNtaXNzO3ZhciBmLGk9e30saj0xO2IuY29udHJvbGxlciYmKGkuJHNjb3BlPWQsaS4kbW9kYWxJbnN0YW5jZT1rLGFuZ3VsYXIuZm9yRWFjaChiLnJlc29sdmUsZnVuY3Rpb24oYixjKXtpW2NdPWFbaisrXX0pLGY9ZyhiLmNvbnRyb2xsZXIsaSkpLGgub3BlbihrLHtzY29wZTpkLGRlZmVycmVkOmUsY29udGVudDphWzBdLGJhY2tkcm9wOmIuYmFja2Ryb3Asa2V5Ym9hcmQ6Yi5rZXlib2FyZCx3aW5kb3dDbGFzczpiLndpbmRvd0NsYXNzLHdpbmRvd1RlbXBsYXRlVXJsOmIud2luZG93VGVtcGxhdGVVcmwsc2l6ZTpiLnNpemV9KX0sZnVuY3Rpb24oYSl7ZS5yZWplY3QoYSl9KSxsLnRoZW4oZnVuY3Rpb24oKXtmLnJlc29sdmUoITApfSxmdW5jdGlvbigpe2YucmVqZWN0KCExKX0pLGt9LGt9XX07cmV0dXJuIGF9KSxhbmd1bGFyLm1vZHVsZSgidWkuYm9vdHN0cmFwLnBhZ2luYXRpb24iLFtdKS5jb250cm9sbGVyKCJQYWdpbmF0aW9uQ29udHJvbGxlciIsWyIkc2NvcGUiLCIkYXR0cnMiLCIkcGFyc2UiLGZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLGU9eyRzZXRWaWV3VmFsdWU6YW5ndWxhci5ub29wfSxmPWIubnVtUGFnZXM/YyhiLm51bVBhZ2VzKS5hc3NpZ246YW5ndWxhci5ub29wO3RoaXMuaW5pdD1mdW5jdGlvbihmLGcpe2U9Zix0aGlzLmNvbmZpZz1nLGUuJHJlbmRlcj1mdW5jdGlvbigpe2QucmVuZGVyKCl9LGIuaXRlbXNQZXJQYWdlP2EuJHBhcmVudC4kd2F0Y2goYyhiLml0ZW1zUGVyUGFnZSksZnVuY3Rpb24oYil7ZC5pdGVtc1BlclBhZ2U9cGFyc2VJbnQoYiwxMCksYS50b3RhbFBhZ2VzPWQuY2FsY3VsYXRlVG90YWxQYWdlcygpfSk6dGhpcy5pdGVtc1BlclBhZ2U9Zy5pdGVtc1BlclBhZ2V9LHRoaXMuY2FsY3VsYXRlVG90YWxQYWdlcz1mdW5jdGlvbigpe3ZhciBiPXRoaXMuaXRlbXNQZXJQYWdlPDE/MTpNYXRoLmNlaWwoYS50b3RhbEl0ZW1zL3RoaXMuaXRlbXNQZXJQYWdlKTtyZXR1cm4gTWF0aC5tYXgoYnx8MCwxKX0sdGhpcy5yZW5kZXI9ZnVuY3Rpb24oKXthLnBhZ2U9cGFyc2VJbnQoZS4kdmlld1ZhbHVlLDEwKXx8MX0sYS5zZWxlY3RQYWdlPWZ1bmN0aW9uKGIpe2EucGFnZSE9PWImJmI+MCYmYjw9YS50b3RhbFBhZ2VzJiYoZS4kc2V0Vmlld1ZhbHVlKGIpLGUuJHJlbmRlcigpKX0sYS5nZXRUZXh0PWZ1bmN0aW9uKGIpe3JldHVybiBhW2IrIlRleHQiXXx8ZC5jb25maWdbYisiVGV4dCJdfSxhLm5vUHJldmlvdXM9ZnVuY3Rpb24oKXtyZXR1cm4gMT09PWEucGFnZX0sYS5ub05leHQ9ZnVuY3Rpb24oKXtyZXR1cm4gYS5wYWdlPT09YS50b3RhbFBhZ2VzfSxhLiR3YXRjaCgidG90YWxJdGVtcyIsZnVuY3Rpb24oKXthLnRvdGFsUGFnZXM9ZC5jYWxjdWxhdGVUb3RhbFBhZ2VzKCl9KSxhLiR3YXRjaCgidG90YWxQYWdlcyIsZnVuY3Rpb24oYil7ZihhLiRwYXJlbnQsYiksYS5wYWdlPmI/YS5zZWxlY3RQYWdlKGIpOmUuJHJlbmRlcigpfSl9XSkuY29uc3RhbnQoInBhZ2luYXRpb25Db25maWciLHtpdGVtc1BlclBhZ2U6MTAsYm91bmRhcnlMaW5rczohMSxkaXJlY3Rpb25MaW5rczohMCxmaXJzdFRleHQ6IkZpcnN0IixwcmV2aW91c1RleHQ6IlByZXZpb3VzIixuZXh0VGV4dDoiTmV4dCIsbGFzdFRleHQ6Ikxhc3QiLHJvdGF0ZTohMH0pLmRpcmVjdGl2ZSgicGFnaW5hdGlvbiIsWyIkcGFyc2UiLCJwYWdpbmF0aW9uQ29uZmlnIixmdW5jdGlvbihhLGIpe3JldHVybntyZXN0cmljdDoiRUEiLHNjb3BlOnt0b3RhbEl0ZW1zOiI9IixmaXJzdFRleHQ6IkAiLHByZXZpb3VzVGV4dDoiQCIsbmV4dFRleHQ6IkAiLGxhc3RUZXh0OiJAIn0scmVxdWlyZTpbInBhZ2luYXRpb24iLCI/bmdNb2RlbCJdLGNvbnRyb2xsZXI6IlBhZ2luYXRpb25Db250cm9sbGVyIix0ZW1wbGF0ZVVybDoidGVtcGxhdGUvcGFnaW5hdGlvbi9wYWdpbmF0aW9uLmh0bWwiLHJlcGxhY2U6ITAsbGluazpmdW5jdGlvbihjLGQsZSxmKXtmdW5jdGlvbiBnKGEsYixjKXtyZXR1cm57bnVtYmVyOmEsdGV4dDpiLGFjdGl2ZTpjfX1mdW5jdGlvbiBoKGEsYil7dmFyIGM9W10sZD0xLGU9YixmPWFuZ3VsYXIuaXNEZWZpbmVkKGspJiZiPms7ZiYmKGw/KGQ9TWF0aC5tYXgoYS1NYXRoLmZsb29yKGsvMiksMSksZT1kK2stMSxlPmImJihlPWIsZD1lLWsrMSkpOihkPShNYXRoLmNlaWwoYS9rKS0xKSprKzEsZT1NYXRoLm1pbihkK2stMSxiKSkpO2Zvcih2YXIgaD1kO2U+PWg7aCsrKXt2YXIgaT1nKGgsaCxoPT09YSk7Yy5wdXNoKGkpfWlmKGYmJiFsKXtpZihkPjEpe3ZhciBqPWcoZC0xLCIuLi4iLCExKTtjLnVuc2hpZnQoail9aWYoYj5lKXt2YXIgbT1nKGUrMSwiLi4uIiwhMSk7Yy5wdXNoKG0pfX1yZXR1cm4gY312YXIgaT1mWzBdLGo9ZlsxXTtpZihqKXt2YXIgaz1hbmd1bGFyLmlzRGVmaW5lZChlLm1heFNpemUpP2MuJHBhcmVudC4kZXZhbChlLm1heFNpemUpOmIubWF4U2l6ZSxsPWFuZ3VsYXIuaXNEZWZpbmVkKGUucm90YXRlKT9jLiRwYXJlbnQuJGV2YWwoZS5yb3RhdGUpOmIucm90YXRlO2MuYm91bmRhcnlMaW5rcz1hbmd1bGFyLmlzRGVmaW5lZChlLmJvdW5kYXJ5TGlua3MpP2MuJHBhcmVudC4kZXZhbChlLmJvdW5kYXJ5TGlua3MpOmIuYm91bmRhcnlMaW5rcyxjLmRpcmVjdGlvbkxpbmtzPWFuZ3VsYXIuaXNEZWZpbmVkKGUuZGlyZWN0aW9uTGlua3MpP2MuJHBhcmVudC4kZXZhbChlLmRpcmVjdGlvbkxpbmtzKTpiLmRpcmVjdGlvbkxpbmtzLGkuaW5pdChqLGIpLGUubWF4U2l6ZSYmYy4kcGFyZW50LiR3YXRjaChhKGUubWF4U2l6ZSksZnVuY3Rpb24oYSl7az1wYXJzZUludChhLDEwKSxpLnJlbmRlcigpfSk7dmFyIG09aS5yZW5kZXI7aS5yZW5kZXI9ZnVuY3Rpb24oKXttKCksYy5wYWdlPjAmJmMucGFnZTw9Yy50b3RhbFBhZ2VzJiYoYy5wYWdlcz1oKGMucGFnZSxjLnRvdGFsUGFnZXMpKX19fX19XSkuY29uc3RhbnQoInBhZ2VyQ29uZmlnIix7aXRlbXNQZXJQYWdlOjEwLHByZXZpb3VzVGV4dDoiwqsgUHJldmlvdXMiLG5leHRUZXh0OiJOZXh0IMK7IixhbGlnbjohMH0pLmRpcmVjdGl2ZSgicGFnZXIiLFsicGFnZXJDb25maWciLGZ1bmN0aW9uKGEpe3JldHVybntyZXN0cmljdDoiRUEiLHNjb3BlOnt0b3RhbEl0ZW1zOiI9IixwcmV2aW91c1RleHQ6IkAiLG5leHRUZXh0OiJAIn0scmVxdWlyZTpbInBhZ2VyIiwiP25nTW9kZWwiXSxjb250cm9sbGVyOiJQYWdpbmF0aW9uQ29udHJvbGxlciIsdGVtcGxhdGVVcmw6InRlbXBsYXRlL3BhZ2luYXRpb24vcGFnZXIuaHRtbCIscmVwbGFjZTohMCxsaW5rOmZ1bmN0aW9uKGIsYyxkLGUpe3ZhciBmPWVbMF0sZz1lWzFdO2cmJihiLmFsaWduPWFuZ3VsYXIuaXNEZWZpbmVkKGQuYWxpZ24pP2IuJHBhcmVudC4kZXZhbChkLmFsaWduKTphLmFsaWduLGYuaW5pdChnLGEpKX19fV0pLGFuZ3VsYXIubW9kdWxlKCJ1aS5ib290c3RyYXAudG9vbHRpcCIsWyJ1aS5ib290c3RyYXAucG9zaXRpb24iLCJ1aS5ib290c3RyYXAuYmluZEh0bWwiXSkucHJvdmlkZXIoIiR0b29sdGlwIixmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7dmFyIGI9L1tBLVpdL2csYz0iLSI7CityZXR1cm4gYS5yZXBsYWNlKGIsZnVuY3Rpb24oYSxiKXtyZXR1cm4oYj9jOiIiKSthLnRvTG93ZXJDYXNlKCl9KX12YXIgYj17cGxhY2VtZW50OiJ0b3AiLGFuaW1hdGlvbjohMCxwb3B1cERlbGF5OjB9LGM9e21vdXNlZW50ZXI6Im1vdXNlbGVhdmUiLGNsaWNrOiJjbGljayIsZm9jdXM6ImJsdXIifSxkPXt9O3RoaXMub3B0aW9ucz1mdW5jdGlvbihhKXthbmd1bGFyLmV4dGVuZChkLGEpfSx0aGlzLnNldFRyaWdnZXJzPWZ1bmN0aW9uKGEpe2FuZ3VsYXIuZXh0ZW5kKGMsYSl9LHRoaXMuJGdldD1bIiR3aW5kb3ciLCIkY29tcGlsZSIsIiR0aW1lb3V0IiwiJHBhcnNlIiwiJGRvY3VtZW50IiwiJHBvc2l0aW9uIiwiJGludGVycG9sYXRlIixmdW5jdGlvbihlLGYsZyxoLGksaixrKXtyZXR1cm4gZnVuY3Rpb24oZSxsLG0pe2Z1bmN0aW9uIG4oYSl7dmFyIGI9YXx8by50cmlnZ2VyfHxtLGQ9Y1tiXXx8YjtyZXR1cm57c2hvdzpiLGhpZGU6ZH19dmFyIG89YW5ndWxhci5leHRlbmQoe30sYixkKSxwPWEoZSkscT1rLnN0YXJ0U3ltYm9sKCkscj1rLmVuZFN5bWJvbCgpLHM9IjxkaXYgIitwKyctcG9wdXAgdGl0bGU9IicrcSsidHRfdGl0bGUiK3IrJyIgY29udGVudD0iJytxKyJ0dF9jb250ZW50IityKyciIHBsYWNlbWVudD0iJytxKyJ0dF9wbGFjZW1lbnQiK3IrJyIgYW5pbWF0aW9uPSJ0dF9hbmltYXRpb24iIGlzLW9wZW49InR0X2lzT3BlbiI+PC9kaXY+JztyZXR1cm57cmVzdHJpY3Q6IkVBIixzY29wZTohMCxjb21waWxlOmZ1bmN0aW9uKCl7dmFyIGE9ZihzKTtyZXR1cm4gZnVuY3Rpb24oYixjLGQpe2Z1bmN0aW9uIGYoKXtiLnR0X2lzT3Blbj9tKCk6aygpfWZ1bmN0aW9uIGsoKXsoIXl8fGIuJGV2YWwoZFtsKyJFbmFibGUiXSkpJiYoYi50dF9wb3B1cERlbGF5P3Z8fCh2PWcocCxiLnR0X3BvcHVwRGVsYXksITEpLHYudGhlbihmdW5jdGlvbihhKXthKCl9KSk6cCgpKCkpfWZ1bmN0aW9uIG0oKXtiLiRhcHBseShmdW5jdGlvbigpe3EoKX0pfWZ1bmN0aW9uIHAoKXtyZXR1cm4gdj1udWxsLHUmJihnLmNhbmNlbCh1KSx1PW51bGwpLGIudHRfY29udGVudD8ocigpLHQuY3NzKHt0b3A6MCxsZWZ0OjAsZGlzcGxheToiYmxvY2sifSksdz9pLmZpbmQoImJvZHkiKS5hcHBlbmQodCk6Yy5hZnRlcih0KSx6KCksYi50dF9pc09wZW49ITAsYi4kZGlnZXN0KCkseik6YW5ndWxhci5ub29wfWZ1bmN0aW9uIHEoKXtiLnR0X2lzT3Blbj0hMSxnLmNhbmNlbCh2KSx2PW51bGwsYi50dF9hbmltYXRpb24/dXx8KHU9ZyhzLDUwMCkpOnMoKX1mdW5jdGlvbiByKCl7dCYmcygpLHQ9YShiLGZ1bmN0aW9uKCl7fSksYi4kZGlnZXN0KCl9ZnVuY3Rpb24gcygpe3U9bnVsbCx0JiYodC5yZW1vdmUoKSx0PW51bGwpfXZhciB0LHUsdix3PWFuZ3VsYXIuaXNEZWZpbmVkKG8uYXBwZW5kVG9Cb2R5KT9vLmFwcGVuZFRvQm9keTohMSx4PW4odm9pZCAwKSx5PWFuZ3VsYXIuaXNEZWZpbmVkKGRbbCsiRW5hYmxlIl0pLHo9ZnVuY3Rpb24oKXt2YXIgYT1qLnBvc2l0aW9uRWxlbWVudHMoYyx0LGIudHRfcGxhY2VtZW50LHcpO2EudG9wKz0icHgiLGEubGVmdCs9InB4Iix0LmNzcyhhKX07Yi50dF9pc09wZW49ITEsZC4kb2JzZXJ2ZShlLGZ1bmN0aW9uKGEpe2IudHRfY29udGVudD1hLCFhJiZiLnR0X2lzT3BlbiYmcSgpfSksZC4kb2JzZXJ2ZShsKyJUaXRsZSIsZnVuY3Rpb24oYSl7Yi50dF90aXRsZT1hfSksZC4kb2JzZXJ2ZShsKyJQbGFjZW1lbnQiLGZ1bmN0aW9uKGEpe2IudHRfcGxhY2VtZW50PWFuZ3VsYXIuaXNEZWZpbmVkKGEpP2E6by5wbGFjZW1lbnR9KSxkLiRvYnNlcnZlKGwrIlBvcHVwRGVsYXkiLGZ1bmN0aW9uKGEpe3ZhciBjPXBhcnNlSW50KGEsMTApO2IudHRfcG9wdXBEZWxheT1pc05hTihjKT9vLnBvcHVwRGVsYXk6Y30pO3ZhciBBPWZ1bmN0aW9uKCl7Yy51bmJpbmQoeC5zaG93LGspLGMudW5iaW5kKHguaGlkZSxtKX07ZC4kb2JzZXJ2ZShsKyJUcmlnZ2VyIixmdW5jdGlvbihhKXtBKCkseD1uKGEpLHguc2hvdz09PXguaGlkZT9jLmJpbmQoeC5zaG93LGYpOihjLmJpbmQoeC5zaG93LGspLGMuYmluZCh4LmhpZGUsbSkpfSk7dmFyIEI9Yi4kZXZhbChkW2wrIkFuaW1hdGlvbiJdKTtiLnR0X2FuaW1hdGlvbj1hbmd1bGFyLmlzRGVmaW5lZChCKT8hIUI6by5hbmltYXRpb24sZC4kb2JzZXJ2ZShsKyJBcHBlbmRUb0JvZHkiLGZ1bmN0aW9uKGEpe3c9YW5ndWxhci5pc0RlZmluZWQoYSk/aChhKShiKTp3fSksdyYmYi4kb24oIiRsb2NhdGlvbkNoYW5nZVN1Y2Nlc3MiLGZ1bmN0aW9uKCl7Yi50dF9pc09wZW4mJnEoKX0pLGIuJG9uKCIkZGVzdHJveSIsZnVuY3Rpb24oKXtnLmNhbmNlbCh1KSxnLmNhbmNlbCh2KSxBKCkscygpfSl9fX19fV19KS5kaXJlY3RpdmUoInRvb2x0aXBQb3B1cCIsZnVuY3Rpb24oKXtyZXR1cm57cmVzdHJpY3Q6IkVBIixyZXBsYWNlOiEwLHNjb3BlOntjb250ZW50OiJAIixwbGFjZW1lbnQ6IkAiLGFuaW1hdGlvbjoiJiIsaXNPcGVuOiImIn0sdGVtcGxhdGVVcmw6InRlbXBsYXRlL3Rvb2x0aXAvdG9vbHRpcC1wb3B1cC5odG1sIn19KS5kaXJlY3RpdmUoInRvb2x0aXAiLFsiJHRvb2x0aXAiLGZ1bmN0aW9uKGEpe3JldHVybiBhKCJ0b29sdGlwIiwidG9vbHRpcCIsIm1vdXNlZW50ZXIiKX1dKS5kaXJlY3RpdmUoInRvb2x0aXBIdG1sVW5zYWZlUG9wdXAiLGZ1bmN0aW9uKCl7cmV0dXJue3Jlc3RyaWN0OiJFQSIscmVwbGFjZTohMCxzY29wZTp7Y29udGVudDoiQCIscGxhY2VtZW50OiJAIixhbmltYXRpb246IiYiLGlzT3BlbjoiJiJ9LHRlbXBsYXRlVXJsOiJ0ZW1wbGF0ZS90b29sdGlwL3Rvb2x0aXAtaHRtbC11bnNhZmUtcG9wdXAuaHRtbCJ9fSkuZGlyZWN0aXZlKCJ0b29sdGlwSHRtbFVuc2FmZSIsWyIkdG9vbHRpcCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEoInRvb2x0aXBIdG1sVW5zYWZlIiwidG9vbHRpcCIsIm1vdXNlZW50ZXIiKX1dKSxhbmd1bGFyLm1vZHVsZSgidWkuYm9vdHN0cmFwLnBvcG92ZXIiLFsidWkuYm9vdHN0cmFwLnRvb2x0aXAiXSkuZGlyZWN0aXZlKCJwb3BvdmVyUG9wdXAiLGZ1bmN0aW9uKCl7cmV0dXJue3Jlc3RyaWN0OiJFQSIscmVwbGFjZTohMCxzY29wZTp7dGl0bGU6IkAiLGNvbnRlbnQ6IkAiLHBsYWNlbWVudDoiQCIsYW5pbWF0aW9uOiImIixpc09wZW46IiYifSx0ZW1wbGF0ZVVybDoidGVtcGxhdGUvcG9wb3Zlci9wb3BvdmVyLmh0bWwifX0pLmRpcmVjdGl2ZSgicG9wb3ZlciIsWyIkdG9vbHRpcCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEoInBvcG92ZXIiLCJwb3BvdmVyIiwiY2xpY2siKX1dKSxhbmd1bGFyLm1vZHVsZSgidWkuYm9vdHN0cmFwLnByb2dyZXNzYmFyIixbXSkuY29uc3RhbnQoInByb2dyZXNzQ29uZmlnIix7YW5pbWF0ZTohMCxtYXg6MTAwfSkuY29udHJvbGxlcigiUHJvZ3Jlc3NDb250cm9sbGVyIixbIiRzY29wZSIsIiRhdHRycyIsInByb2dyZXNzQ29uZmlnIixmdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcyxlPWFuZ3VsYXIuaXNEZWZpbmVkKGIuYW5pbWF0ZSk/YS4kcGFyZW50LiRldmFsKGIuYW5pbWF0ZSk6Yy5hbmltYXRlO3RoaXMuYmFycz1bXSxhLm1heD1hbmd1bGFyLmlzRGVmaW5lZChiLm1heCk/YS4kcGFyZW50LiRldmFsKGIubWF4KTpjLm1heCx0aGlzLmFkZEJhcj1mdW5jdGlvbihiLGMpe2V8fGMuY3NzKHt0cmFuc2l0aW9uOiJub25lIn0pLHRoaXMuYmFycy5wdXNoKGIpLGIuJHdhdGNoKCJ2YWx1ZSIsZnVuY3Rpb24oYyl7Yi5wZXJjZW50PSsoMTAwKmMvYS5tYXgpLnRvRml4ZWQoMil9KSxiLiRvbigiJGRlc3Ryb3kiLGZ1bmN0aW9uKCl7Yz1udWxsLGQucmVtb3ZlQmFyKGIpfSl9LHRoaXMucmVtb3ZlQmFyPWZ1bmN0aW9uKGEpe3RoaXMuYmFycy5zcGxpY2UodGhpcy5iYXJzLmluZGV4T2YoYSksMSl9fV0pLmRpcmVjdGl2ZSgicHJvZ3Jlc3MiLGZ1bmN0aW9uKCl7cmV0dXJue3Jlc3RyaWN0OiJFQSIscmVwbGFjZTohMCx0cmFuc2NsdWRlOiEwLGNvbnRyb2xsZXI6IlByb2dyZXNzQ29udHJvbGxlciIscmVxdWlyZToicHJvZ3Jlc3MiLHNjb3BlOnt9LHRlbXBsYXRlVXJsOiJ0ZW1wbGF0ZS9wcm9ncmVzc2Jhci9wcm9ncmVzcy5odG1sIn19KS5kaXJlY3RpdmUoImJhciIsZnVuY3Rpb24oKXtyZXR1cm57cmVzdHJpY3Q6IkVBIixyZXBsYWNlOiEwLHRyYW5zY2x1ZGU6ITAscmVxdWlyZToiXnByb2dyZXNzIixzY29wZTp7dmFsdWU6Ij0iLHR5cGU6IkAifSx0ZW1wbGF0ZVVybDoidGVtcGxhdGUvcHJvZ3Jlc3NiYXIvYmFyLmh0bWwiLGxpbms6ZnVuY3Rpb24oYSxiLGMsZCl7ZC5hZGRCYXIoYSxiKX19fSkuZGlyZWN0aXZlKCJwcm9ncmVzc2JhciIsZnVuY3Rpb24oKXtyZXR1cm57cmVzdHJpY3Q6IkVBIixyZXBsYWNlOiEwLHRyYW5zY2x1ZGU6ITAsY29udHJvbGxlcjoiUHJvZ3Jlc3NDb250cm9sbGVyIixzY29wZTp7dmFsdWU6Ij0iLHR5cGU6IkAifSx0ZW1wbGF0ZVVybDoidGVtcGxhdGUvcHJvZ3Jlc3NiYXIvcHJvZ3Jlc3NiYXIuaHRtbCIsbGluazpmdW5jdGlvbihhLGIsYyxkKXtkLmFkZEJhcihhLGFuZ3VsYXIuZWxlbWVudChiLmNoaWxkcmVuKClbMF0pKX19fSksYW5ndWxhci5tb2R1bGUoInVpLmJvb3RzdHJhcC5yYXRpbmciLFtdKS5jb25zdGFudCgicmF0aW5nQ29uZmlnIix7bWF4OjUsc3RhdGVPbjpudWxsLHN0YXRlT2ZmOm51bGx9KS5jb250cm9sbGVyKCJSYXRpbmdDb250cm9sbGVyIixbIiRzY29wZSIsIiRhdHRycyIsInJhdGluZ0NvbmZpZyIsZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXskc2V0Vmlld1ZhbHVlOmFuZ3VsYXIubm9vcH07dGhpcy5pbml0PWZ1bmN0aW9uKGUpe2Q9ZSxkLiRyZW5kZXI9dGhpcy5yZW5kZXIsdGhpcy5zdGF0ZU9uPWFuZ3VsYXIuaXNEZWZpbmVkKGIuc3RhdGVPbik/YS4kcGFyZW50LiRldmFsKGIuc3RhdGVPbik6Yy5zdGF0ZU9uLHRoaXMuc3RhdGVPZmY9YW5ndWxhci5pc0RlZmluZWQoYi5zdGF0ZU9mZik/YS4kcGFyZW50LiRldmFsKGIuc3RhdGVPZmYpOmMuc3RhdGVPZmY7dmFyIGY9YW5ndWxhci5pc0RlZmluZWQoYi5yYXRpbmdTdGF0ZXMpP2EuJHBhcmVudC4kZXZhbChiLnJhdGluZ1N0YXRlcyk6bmV3IEFycmF5KGFuZ3VsYXIuaXNEZWZpbmVkKGIubWF4KT9hLiRwYXJlbnQuJGV2YWwoYi5tYXgpOmMubWF4KTthLnJhbmdlPXRoaXMuYnVpbGRUZW1wbGF0ZU9iamVjdHMoZil9LHRoaXMuYnVpbGRUZW1wbGF0ZU9iamVjdHM9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTAsYz1hLmxlbmd0aDtjPmI7YisrKWFbYl09YW5ndWxhci5leHRlbmQoe2luZGV4OmJ9LHtzdGF0ZU9uOnRoaXMuc3RhdGVPbixzdGF0ZU9mZjp0aGlzLnN0YXRlT2ZmfSxhW2JdKTtyZXR1cm4gYX0sYS5yYXRlPWZ1bmN0aW9uKGIpeyFhLnJlYWRvbmx5JiZiPj0wJiZiPD1hLnJhbmdlLmxlbmd0aCYmKGQuJHNldFZpZXdWYWx1ZShiKSxkLiRyZW5kZXIoKSl9LGEuZW50ZXI9ZnVuY3Rpb24oYil7YS5yZWFkb25seXx8KGEudmFsdWU9YiksYS5vbkhvdmVyKHt2YWx1ZTpifSl9LGEucmVzZXQ9ZnVuY3Rpb24oKXthLnZhbHVlPWQuJHZpZXdWYWx1ZSxhLm9uTGVhdmUoKX0sYS5vbktleWRvd249ZnVuY3Rpb24oYil7LygzN3wzOHwzOXw0MCkvLnRlc3QoYi53aGljaCkmJihiLnByZXZlbnREZWZhdWx0KCksYi5zdG9wUHJvcGFnYXRpb24oKSxhLnJhdGUoYS52YWx1ZSsoMzg9PT1iLndoaWNofHwzOT09PWIud2hpY2g/MTotMSkpKX0sdGhpcy5yZW5kZXI9ZnVuY3Rpb24oKXthLnZhbHVlPWQuJHZpZXdWYWx1ZX19XSkuZGlyZWN0aXZlKCJyYXRpbmciLGZ1bmN0aW9uKCl7cmV0dXJue3Jlc3RyaWN0OiJFQSIscmVxdWlyZTpbInJhdGluZyIsIm5nTW9kZWwiXSxzY29wZTp7cmVhZG9ubHk6Ij0/IixvbkhvdmVyOiImIixvbkxlYXZlOiImIn0sY29udHJvbGxlcjoiUmF0aW5nQ29udHJvbGxlciIsdGVtcGxhdGVVcmw6InRlbXBsYXRlL3JhdGluZy9yYXRpbmcuaHRtbCIscmVwbGFjZTohMCxsaW5rOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWRbMF0sZj1kWzFdO2YmJmUuaW5pdChmKX19fSksYW5ndWxhci5tb2R1bGUoInVpLmJvb3RzdHJhcC50YWJzIixbXSkuY29udHJvbGxlcigiVGFic2V0Q29udHJvbGxlciIsWyIkc2NvcGUiLGZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYz1iLnRhYnM9YS50YWJzPVtdO2Iuc2VsZWN0PWZ1bmN0aW9uKGEpe2FuZ3VsYXIuZm9yRWFjaChjLGZ1bmN0aW9uKGIpe2IuYWN0aXZlJiZiIT09YSYmKGIuYWN0aXZlPSExLGIub25EZXNlbGVjdCgpKX0pLGEuYWN0aXZlPSEwLGEub25TZWxlY3QoKX0sYi5hZGRUYWI9ZnVuY3Rpb24oYSl7Yy5wdXNoKGEpLDE9PT1jLmxlbmd0aD9hLmFjdGl2ZT0hMDphLmFjdGl2ZSYmYi5zZWxlY3QoYSl9LGIucmVtb3ZlVGFiPWZ1bmN0aW9uKGEpe3ZhciBkPWMuaW5kZXhPZihhKTtpZihhLmFjdGl2ZSYmYy5sZW5ndGg+MSl7dmFyIGU9ZD09Yy5sZW5ndGgtMT9kLTE6ZCsxO2Iuc2VsZWN0KGNbZV0pfWMuc3BsaWNlKGQsMSl9fV0pLmRpcmVjdGl2ZSgidGFic2V0IixmdW5jdGlvbigpe3JldHVybntyZXN0cmljdDoiRUEiLHRyYW5zY2x1ZGU6ITAscmVwbGFjZTohMCxzY29wZTp7dHlwZToiQCJ9LGNvbnRyb2xsZXI6IlRhYnNldENvbnRyb2xsZXIiLHRlbXBsYXRlVXJsOiJ0ZW1wbGF0ZS90YWJzL3RhYnNldC5odG1sIixsaW5rOmZ1bmN0aW9uKGEsYixjKXthLnZlcnRpY2FsPWFuZ3VsYXIuaXNEZWZpbmVkKGMudmVydGljYWwpP2EuJHBhcmVudC4kZXZhbChjLnZlcnRpY2FsKTohMSxhLmp1c3RpZmllZD1hbmd1bGFyLmlzRGVmaW5lZChjLmp1c3RpZmllZCk/YS4kcGFyZW50LiRldmFsKGMuanVzdGlmaWVkKTohMX19fSkuZGlyZWN0aXZlKCJ0YWIiLFsiJHBhcnNlIixmdW5jdGlvbihhKXtyZXR1cm57cmVxdWlyZToiXnRhYnNldCIscmVzdHJpY3Q6IkVBIixyZXBsYWNlOiEwLHRlbXBsYXRlVXJsOiJ0ZW1wbGF0ZS90YWJzL3RhYi5odG1sIix0cmFuc2NsdWRlOiEwLHNjb3BlOnthY3RpdmU6Ij0/IixoZWFkaW5nOiJAIixvblNlbGVjdDoiJnNlbGVjdCIsb25EZXNlbGVjdDoiJmRlc2VsZWN0In0sY29udHJvbGxlcjpmdW5jdGlvbigpe30sY29tcGlsZTpmdW5jdGlvbihiLGMsZCl7cmV0dXJuIGZ1bmN0aW9uKGIsYyxlLGYpe2IuJHdhdGNoKCJhY3RpdmUiLGZ1bmN0aW9uKGEpe2EmJmYuc2VsZWN0KGIpfSksYi5kaXNhYmxlZD0hMSxlLmRpc2FibGVkJiZiLiRwYXJlbnQuJHdhdGNoKGEoZS5kaXNhYmxlZCksZnVuY3Rpb24oYSl7Yi5kaXNhYmxlZD0hIWF9KSxiLnNlbGVjdD1mdW5jdGlvbigpe2IuZGlzYWJsZWR8fChiLmFjdGl2ZT0hMCl9LGYuYWRkVGFiKGIpLGIuJG9uKCIkZGVzdHJveSIsZnVuY3Rpb24oKXtmLnJlbW92ZVRhYihiKX0pLGIuJHRyYW5zY2x1ZGVGbj1kfX19fV0pLmRpcmVjdGl2ZSgidGFiSGVhZGluZ1RyYW5zY2x1ZGUiLFtmdW5jdGlvbigpe3JldHVybntyZXN0cmljdDoiQSIscmVxdWlyZToiXnRhYiIsbGluazpmdW5jdGlvbihhLGIpe2EuJHdhdGNoKCJoZWFkaW5nRWxlbWVudCIsZnVuY3Rpb24oYSl7YSYmKGIuaHRtbCgiIiksYi5hcHBlbmQoYSkpfSl9fX1dKS5kaXJlY3RpdmUoInRhYkNvbnRlbnRUcmFuc2NsdWRlIixmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuIGEudGFnTmFtZSYmKGEuaGFzQXR0cmlidXRlKCJ0YWItaGVhZGluZyIpfHxhLmhhc0F0dHJpYnV0ZSgiZGF0YS10YWItaGVhZGluZyIpfHwidGFiLWhlYWRpbmciPT09YS50YWdOYW1lLnRvTG93ZXJDYXNlKCl8fCJkYXRhLXRhYi1oZWFkaW5nIj09PWEudGFnTmFtZS50b0xvd2VyQ2FzZSgpKX1yZXR1cm57cmVzdHJpY3Q6IkEiLHJlcXVpcmU6Il50YWJzZXQiLGxpbms6ZnVuY3Rpb24oYixjLGQpe3ZhciBlPWIuJGV2YWwoZC50YWJDb250ZW50VHJhbnNjbHVkZSk7ZS4kdHJhbnNjbHVkZUZuKGUuJHBhcmVudCxmdW5jdGlvbihiKXthbmd1bGFyLmZvckVhY2goYixmdW5jdGlvbihiKXthKGIpP2UuaGVhZGluZ0VsZW1lbnQ9YjpjLmFwcGVuZChiKX0pfSl9fX0pLGFuZ3VsYXIubW9kdWxlKCJ1aS5ib290c3RyYXAudGltZXBpY2tlciIsW10pLmNvbnN0YW50KCJ0aW1lcGlja2VyQ29uZmlnIix7aG91clN0ZXA6MSxtaW51dGVTdGVwOjEsc2hvd01lcmlkaWFuOiEwLG1lcmlkaWFuczpudWxsLHJlYWRvbmx5SW5wdXQ6ITEsbW91c2V3aGVlbDohMH0pLmNvbnRyb2xsZXIoIlRpbWVwaWNrZXJDb250cm9sbGVyIixbIiRzY29wZSIsIiRhdHRycyIsIiRwYXJzZSIsIiRsb2ciLCIkbG9jYWxlIiwidGltZXBpY2tlckNvbmZpZyIsZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2Z1bmN0aW9uIGcoKXt2YXIgYj1wYXJzZUludChhLmhvdXJzLDEwKSxjPWEuc2hvd01lcmlkaWFuP2I+MCYmMTM+YjpiPj0wJiYyND5iO3JldHVybiBjPyhhLnNob3dNZXJpZGlhbiYmKDEyPT09YiYmKGI9MCksYS5tZXJpZGlhbj09PXBbMV0mJihiKz0xMikpLGIpOnZvaWQgMH1mdW5jdGlvbiBoKCl7dmFyIGI9cGFyc2VJbnQoYS5taW51dGVzLDEwKTtyZXR1cm4gYj49MCYmNjA+Yj9iOnZvaWQgMH1mdW5jdGlvbiBpKGEpe3JldHVybiBhbmd1bGFyLmlzRGVmaW5lZChhKSYmYS50b1N0cmluZygpLmxlbmd0aDwyPyIwIithOmF9ZnVuY3Rpb24gaihhKXtrKCksby4kc2V0Vmlld1ZhbHVlKG5ldyBEYXRlKG4pKSxsKGEpfWZ1bmN0aW9uIGsoKXtvLiRzZXRWYWxpZGl0eSgidGltZSIsITApLGEuaW52YWxpZEhvdXJzPSExLGEuaW52YWxpZE1pbnV0ZXM9ITF9ZnVuY3Rpb24gbChiKXt2YXIgYz1uLmdldEhvdXJzKCksZD1uLmdldE1pbnV0ZXMoKTthLnNob3dNZXJpZGlhbiYmKGM9MD09PWN8fDEyPT09Yz8xMjpjJTEyKSxhLmhvdXJzPSJoIj09PWI/YzppKGMpLGEubWludXRlcz0ibSI9PT1iP2Q6aShkKSxhLm1lcmlkaWFuPW4uZ2V0SG91cnMoKTwxMj9wWzBdOnBbMV19ZnVuY3Rpb24gbShhKXt2YXIgYj1uZXcgRGF0ZShuLmdldFRpbWUoKSs2ZTQqYSk7bi5zZXRIb3VycyhiLmdldEhvdXJzKCksYi5nZXRNaW51dGVzKCkpLGooKX12YXIgbj1uZXcgRGF0ZSxvPXskc2V0Vmlld1ZhbHVlOmFuZ3VsYXIubm9vcH0scD1hbmd1bGFyLmlzRGVmaW5lZChiLm1lcmlkaWFucyk/YS4kcGFyZW50LiRldmFsKGIubWVyaWRpYW5zKTpmLm1lcmlkaWFuc3x8ZS5EQVRFVElNRV9GT1JNQVRTLkFNUE1TO3RoaXMuaW5pdD1mdW5jdGlvbihjLGQpe289YyxvLiRyZW5kZXI9dGhpcy5yZW5kZXI7dmFyIGU9ZC5lcSgwKSxnPWQuZXEoMSksaD1hbmd1bGFyLmlzRGVmaW5lZChiLm1vdXNld2hlZWwpP2EuJHBhcmVudC4kZXZhbChiLm1vdXNld2hlZWwpOmYubW91c2V3aGVlbDtoJiZ0aGlzLnNldHVwTW91c2V3aGVlbEV2ZW50cyhlLGcpLGEucmVhZG9ubHlJbnB1dD1hbmd1bGFyLmlzRGVmaW5lZChiLnJlYWRvbmx5SW5wdXQpP2EuJHBhcmVudC4kZXZhbChiLnJlYWRvbmx5SW5wdXQpOmYucmVhZG9ubHlJbnB1dCx0aGlzLnNldHVwSW5wdXRFdmVudHMoZSxnKX07dmFyIHE9Zi5ob3VyU3RlcDtiLmhvdXJTdGVwJiZhLiRwYXJlbnQuJHdhdGNoKGMoYi5ob3VyU3RlcCksZnVuY3Rpb24oYSl7cT1wYXJzZUludChhLDEwKX0pO3ZhciByPWYubWludXRlU3RlcDtiLm1pbnV0ZVN0ZXAmJmEuJHBhcmVudC4kd2F0Y2goYyhiLm1pbnV0ZVN0ZXApLGZ1bmN0aW9uKGEpe3I9cGFyc2VJbnQoYSwxMCl9KSxhLnNob3dNZXJpZGlhbj1mLnNob3dNZXJpZGlhbixiLnNob3dNZXJpZGlhbiYmYS4kcGFyZW50LiR3YXRjaChjKGIuc2hvd01lcmlkaWFuKSxmdW5jdGlvbihiKXtpZihhLnNob3dNZXJpZGlhbj0hIWIsby4kZXJyb3IudGltZSl7dmFyIGM9ZygpLGQ9aCgpO2FuZ3VsYXIuaXNEZWZpbmVkKGMpJiZhbmd1bGFyLmlzRGVmaW5lZChkKSYmKG4uc2V0SG91cnMoYyksaigpKX1lbHNlIGwoKX0pLHRoaXMuc2V0dXBNb3VzZXdoZWVsRXZlbnRzPWZ1bmN0aW9uKGIsYyl7dmFyIGQ9ZnVuY3Rpb24oYSl7YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO3ZhciBiPWEud2hlZWxEZWx0YT9hLndoZWVsRGVsdGE6LWEuZGVsdGFZO3JldHVybiBhLmRldGFpbHx8Yj4wfTtiLmJpbmQoIm1vdXNld2hlZWwgd2hlZWwiLGZ1bmN0aW9uKGIpe2EuJGFwcGx5KGQoYik/YS5pbmNyZW1lbnRIb3VycygpOmEuZGVjcmVtZW50SG91cnMoKSksYi5wcmV2ZW50RGVmYXVsdCgpfSksYy5iaW5kKCJtb3VzZXdoZWVsIHdoZWVsIixmdW5jdGlvbihiKXthLiRhcHBseShkKGIpP2EuaW5jcmVtZW50TWludXRlcygpOmEuZGVjcmVtZW50TWludXRlcygpKSxiLnByZXZlbnREZWZhdWx0KCl9KX0sdGhpcy5zZXR1cElucHV0RXZlbnRzPWZ1bmN0aW9uKGIsYyl7aWYoYS5yZWFkb25seUlucHV0KXJldHVybiBhLnVwZGF0ZUhvdXJzPWFuZ3VsYXIubm9vcCx2b2lkKGEudXBkYXRlTWludXRlcz1hbmd1bGFyLm5vb3ApO3ZhciBkPWZ1bmN0aW9uKGIsYyl7by4kc2V0Vmlld1ZhbHVlKG51bGwpLG8uJHNldFZhbGlkaXR5KCJ0aW1lIiwhMSksYW5ndWxhci5pc0RlZmluZWQoYikmJihhLmludmFsaWRIb3Vycz1iKSxhbmd1bGFyLmlzRGVmaW5lZChjKSYmKGEuaW52YWxpZE1pbnV0ZXM9Yyl9O2EudXBkYXRlSG91cnM9ZnVuY3Rpb24oKXt2YXIgYT1nKCk7YW5ndWxhci5pc0RlZmluZWQoYSk/KG4uc2V0SG91cnMoYSksaigiaCIpKTpkKCEwKX0sYi5iaW5kKCJibHVyIixmdW5jdGlvbigpeyFhLmludmFsaWRIb3VycyYmYS5ob3VyczwxMCYmYS4kYXBwbHkoZnVuY3Rpb24oKXthLmhvdXJzPWkoYS5ob3Vycyl9KX0pLGEudXBkYXRlTWludXRlcz1mdW5jdGlvbigpe3ZhciBhPWgoKTthbmd1bGFyLmlzRGVmaW5lZChhKT8obi5zZXRNaW51dGVzKGEpLGooIm0iKSk6ZCh2b2lkIDAsITApfSxjLmJpbmQoImJsdXIiLGZ1bmN0aW9uKCl7IWEuaW52YWxpZE1pbnV0ZXMmJmEubWludXRlczwxMCYmYS4kYXBwbHkoZnVuY3Rpb24oKXthLm1pbnV0ZXM9aShhLm1pbnV0ZXMpfSl9KX0sdGhpcy5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgYT1vLiRtb2RlbFZhbHVlP25ldyBEYXRlKG8uJG1vZGVsVmFsdWUpOm51bGw7aXNOYU4oYSk/KG8uJHNldFZhbGlkaXR5KCJ0aW1lIiwhMSksZC5lcnJvcignVGltZXBpY2tlciBkaXJlY3RpdmU6ICJuZy1tb2RlbCIgdmFsdWUgbXVzdCBiZSBhIERhdGUgb2JqZWN0LCBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgMDEuMDEuMTk3MCBvciBhIHN0cmluZyByZXByZXNlbnRpbmcgYW4gUkZDMjgyMiBvciBJU08gODYwMSBkYXRlLicpKTooYSYmKG49YSksaygpLGwoKSl9LGEuaW5jcmVtZW50SG91cnM9ZnVuY3Rpb24oKXttKDYwKnEpfSxhLmRlY3JlbWVudEhvdXJzPWZ1bmN0aW9uKCl7bSg2MCotcSl9LGEuaW5jcmVtZW50TWludXRlcz1mdW5jdGlvbigpe20ocil9LGEuZGVjcmVtZW50TWludXRlcz1mdW5jdGlvbigpe20oLXIpfSxhLnRvZ2dsZU1lcmlkaWFuPWZ1bmN0aW9uKCl7bSg3MjAqKG4uZ2V0SG91cnMoKTwxMj8xOi0xKSl9fV0pLmRpcmVjdGl2ZSgidGltZXBpY2tlciIsZnVuY3Rpb24oKXtyZXR1cm57cmVzdHJpY3Q6IkVBIixyZXF1aXJlOlsidGltZXBpY2tlciIsIj9ebmdNb2RlbCJdLGNvbnRyb2xsZXI6IlRpbWVwaWNrZXJDb250cm9sbGVyIixyZXBsYWNlOiEwLHNjb3BlOnt9LHRlbXBsYXRlVXJsOiJ0ZW1wbGF0ZS90aW1lcGlja2VyL3RpbWVwaWNrZXIuaHRtbCIsbGluazpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1kWzBdLGY9ZFsxXTtmJiZlLmluaXQoZixiLmZpbmQoImlucHV0IikpfX19KSxhbmd1bGFyLm1vZHVsZSgidWkuYm9vdHN0cmFwLnR5cGVhaGVhZCIsWyJ1aS5ib290c3RyYXAucG9zaXRpb24iLCJ1aS5ib290c3RyYXAuYmluZEh0bWwiXSkuZmFjdG9yeSgidHlwZWFoZWFkUGFyc2VyIixbIiRwYXJzZSIsZnVuY3Rpb24oYSl7dmFyIGI9L15ccyooLio/KSg/OlxzK2FzXHMrKC4qPykpP1xzK2ZvclxzKyg/OihbXCRcd11bXCRcd1xkXSopKVxzK2luXHMrKC4qKSQvO3JldHVybntwYXJzZTpmdW5jdGlvbihjKXt2YXIgZD1jLm1hdGNoKGIpO2lmKCFkKXRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdHlwZWFoZWFkIHNwZWNpZmljYXRpb24gaW4gZm9ybSBvZiAiX21vZGVsVmFsdWVfIChhcyBfbGFiZWxfKT8gZm9yIF9pdGVtXyBpbiBfY29sbGVjdGlvbl8iIGJ1dCBnb3QgIicrYysnIi4nKTtyZXR1cm57aXRlbU5hbWU6ZFszXSxzb3VyY2U6YShkWzRdKSx2aWV3TWFwcGVyOmEoZFsyXXx8ZFsxXSksbW9kZWxNYXBwZXI6YShkWzFdKX19fX1dKS5kaXJlY3RpdmUoInR5cGVhaGVhZCIsWyIkY29tcGlsZSIsIiRwYXJzZSIsIiRxIiwiJHRpbWVvdXQiLCIkZG9jdW1lbnQiLCIkcG9zaXRpb24iLCJ0eXBlYWhlYWRQYXJzZXIiLGZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe3ZhciBoPVs5LDEzLDI3LDM4LDQwXTtyZXR1cm57cmVxdWlyZToibmdNb2RlbCIsbGluazpmdW5jdGlvbihpLGosayxsKXt2YXIgbSxuPWkuJGV2YWwoay50eXBlYWhlYWRNaW5MZW5ndGgpfHwxLG89aS4kZXZhbChrLnR5cGVhaGVhZFdhaXRNcyl8fDAscD1pLiRldmFsKGsudHlwZWFoZWFkRWRpdGFibGUpIT09ITEscT1iKGsudHlwZWFoZWFkTG9hZGluZykuYXNzaWdufHxhbmd1bGFyLm5vb3Ascj1iKGsudHlwZWFoZWFkT25TZWxlY3QpLHM9ay50eXBlYWhlYWRJbnB1dEZvcm1hdHRlcj9iKGsudHlwZWFoZWFkSW5wdXRGb3JtYXR0ZXIpOnZvaWQgMCx0PWsudHlwZWFoZWFkQXBwZW5kVG9Cb2R5P2kuJGV2YWwoay50eXBlYWhlYWRBcHBlbmRUb0JvZHkpOiExLHU9YihrLm5nTW9kZWwpLmFzc2lnbix2PWcucGFyc2Uoay50eXBlYWhlYWQpLHc9aS4kbmV3KCk7aS4kb24oIiRkZXN0cm95IixmdW5jdGlvbigpe3cuJGRlc3Ryb3koKX0pO3ZhciB4PSJ0eXBlYWhlYWQtIit3LiRpZCsiLSIrTWF0aC5mbG9vcigxZTQqTWF0aC5yYW5kb20oKSk7ai5hdHRyKHsiYXJpYS1hdXRvY29tcGxldGUiOiJsaXN0IiwiYXJpYS1leHBhbmRlZCI6ITEsImFyaWEtb3ducyI6eH0pO3ZhciB5PWFuZ3VsYXIuZWxlbWVudCgiPGRpdiB0eXBlYWhlYWQtcG9wdXA+PC9kaXY+Iik7eS5hdHRyKHtpZDp4LG1hdGNoZXM6Im1hdGNoZXMiLGFjdGl2ZToiYWN0aXZlSWR4IixzZWxlY3Q6InNlbGVjdChhY3RpdmVJZHgpIixxdWVyeToicXVlcnkiLHBvc2l0aW9uOiJwb3NpdGlvbiJ9KSxhbmd1bGFyLmlzRGVmaW5lZChrLnR5cGVhaGVhZFRlbXBsYXRlVXJsKSYmeS5hdHRyKCJ0ZW1wbGF0ZS11cmwiLGsudHlwZWFoZWFkVGVtcGxhdGVVcmwpO3ZhciB6PWZ1bmN0aW9uKCl7dy5tYXRjaGVzPVtdLHcuYWN0aXZlSWR4PS0xLGouYXR0cigiYXJpYS1leHBhbmRlZCIsITEpfSxBPWZ1bmN0aW9uKGEpe3JldHVybiB4KyItb3B0aW9uLSIrYX07dy4kd2F0Y2goImFjdGl2ZUlkeCIsZnVuY3Rpb24oYSl7MD5hP2oucmVtb3ZlQXR0cigiYXJpYS1hY3RpdmVkZXNjZW5kYW50Iik6ai5hdHRyKCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnQiLEEoYSkpfSk7dmFyIEI9ZnVuY3Rpb24oYSl7dmFyIGI9eyR2aWV3VmFsdWU6YX07cShpLCEwKSxjLndoZW4odi5zb3VyY2UoaSxiKSkudGhlbihmdW5jdGlvbihjKXt2YXIgZD1hPT09bC4kdmlld1ZhbHVlO2lmKGQmJm0paWYoYy5sZW5ndGg+MCl7dy5hY3RpdmVJZHg9MCx3Lm1hdGNoZXMubGVuZ3RoPTA7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspYlt2Lml0ZW1OYW1lXT1jW2VdLHcubWF0Y2hlcy5wdXNoKHtpZDpBKGUpLGxhYmVsOnYudmlld01hcHBlcih3LGIpLG1vZGVsOmNbZV19KTt3LnF1ZXJ5PWEsdy5wb3NpdGlvbj10P2Yub2Zmc2V0KGopOmYucG9zaXRpb24oaiksdy5wb3NpdGlvbi50b3A9dy5wb3NpdGlvbi50b3Arai5wcm9wKCJvZmZzZXRIZWlnaHQiKSxqLmF0dHIoImFyaWEtZXhwYW5kZWQiLCEwKX1lbHNlIHooKTtkJiZxKGksITEpfSxmdW5jdGlvbigpe3ooKSxxKGksITEpfSl9O3ooKSx3LnF1ZXJ5PXZvaWQgMDt2YXIgQztsLiRwYXJzZXJzLnVuc2hpZnQoZnVuY3Rpb24oYSl7cmV0dXJuIG09ITAsYSYmYS5sZW5ndGg+PW4/bz4wPyhDJiZkLmNhbmNlbChDKSxDPWQoZnVuY3Rpb24oKXtCKGEpfSxvKSk6QihhKToocShpLCExKSx6KCkpLHA/YTphP3ZvaWQgbC4kc2V0VmFsaWRpdHkoImVkaXRhYmxlIiwhMSk6KGwuJHNldFZhbGlkaXR5KCJlZGl0YWJsZSIsITApLGEpfSksbC4kZm9ybWF0dGVycy5wdXNoKGZ1bmN0aW9uKGEpe3ZhciBiLGMsZD17fTtyZXR1cm4gcz8oZC4kbW9kZWw9YSxzKGksZCkpOihkW3YuaXRlbU5hbWVdPWEsYj12LnZpZXdNYXBwZXIoaSxkKSxkW3YuaXRlbU5hbWVdPXZvaWQgMCxjPXYudmlld01hcHBlcihpLGQpLGIhPT1jP2I6YSl9KSx3LnNlbGVjdD1mdW5jdGlvbihhKXt2YXIgYixjLGU9e307ZVt2Lml0ZW1OYW1lXT1jPXcubWF0Y2hlc1thXS5tb2RlbCxiPXYubW9kZWxNYXBwZXIoaSxlKSx1KGksYiksbC4kc2V0VmFsaWRpdHkoImVkaXRhYmxlIiwhMCkscihpLHskaXRlbTpjLCRtb2RlbDpiLCRsYWJlbDp2LnZpZXdNYXBwZXIoaSxlKX0pLHooKSxkKGZ1bmN0aW9uKCl7alswXS5mb2N1cygpfSwwLCExKX0sai5iaW5kKCJrZXlkb3duIixmdW5jdGlvbihhKXswIT09dy5tYXRjaGVzLmxlbmd0aCYmLTEhPT1oLmluZGV4T2YoYS53aGljaCkmJihhLnByZXZlbnREZWZhdWx0KCksNDA9PT1hLndoaWNoPyh3LmFjdGl2ZUlkeD0ody5hY3RpdmVJZHgrMSkldy5tYXRjaGVzLmxlbmd0aCx3LiRkaWdlc3QoKSk6Mzg9PT1hLndoaWNoPyh3LmFjdGl2ZUlkeD0ody5hY3RpdmVJZHg/dy5hY3RpdmVJZHg6dy5tYXRjaGVzLmxlbmd0aCktMSx3LiRkaWdlc3QoKSk6MTM9PT1hLndoaWNofHw5PT09YS53aGljaD93LiRhcHBseShmdW5jdGlvbigpe3cuc2VsZWN0KHcuYWN0aXZlSWR4KX0pOjI3PT09YS53aGljaCYmKGEuc3RvcFByb3BhZ2F0aW9uKCkseigpLHcuJGRpZ2VzdCgpKSl9KSxqLmJpbmQoImJsdXIiLGZ1bmN0aW9uKCl7bT0hMX0pO3ZhciBEPWZ1bmN0aW9uKGEpe2pbMF0hPT1hLnRhcmdldCYmKHooKSx3LiRkaWdlc3QoKSl9O2UuYmluZCgiY2xpY2siLEQpLGkuJG9uKCIkZGVzdHJveSIsZnVuY3Rpb24oKXtlLnVuYmluZCgiY2xpY2siLEQpfSk7dmFyIEU9YSh5KSh3KTt0P2UuZmluZCgiYm9keSIpLmFwcGVuZChFKTpqLmFmdGVyKEUpfX19XSkuZGlyZWN0aXZlKCJ0eXBlYWhlYWRQb3B1cCIsZnVuY3Rpb24oKXtyZXR1cm57cmVzdHJpY3Q6IkVBIixzY29wZTp7bWF0Y2hlczoiPSIscXVlcnk6Ij0iLGFjdGl2ZToiPSIscG9zaXRpb246Ij0iLHNlbGVjdDoiJiJ9LHJlcGxhY2U6ITAsdGVtcGxhdGVVcmw6InRlbXBsYXRlL3R5cGVhaGVhZC90eXBlYWhlYWQtcG9wdXAuaHRtbCIsbGluazpmdW5jdGlvbihhLGIsYyl7YS50ZW1wbGF0ZVVybD1jLnRlbXBsYXRlVXJsLGEuaXNPcGVuPWZ1bmN0aW9uKCl7cmV0dXJuIGEubWF0Y2hlcy5sZW5ndGg+MH0sYS5pc0FjdGl2ZT1mdW5jdGlvbihiKXtyZXR1cm4gYS5hY3RpdmU9PWJ9LGEuc2VsZWN0QWN0aXZlPWZ1bmN0aW9uKGIpe2EuYWN0aXZlPWJ9LGEuc2VsZWN0TWF0Y2g9ZnVuY3Rpb24oYil7YS5zZWxlY3Qoe2FjdGl2ZUlkeDpifSl9fX19KS5kaXJlY3RpdmUoInR5cGVhaGVhZE1hdGNoIixbIiRodHRwIiwiJHRlbXBsYXRlQ2FjaGUiLCIkY29tcGlsZSIsIiRwYXJzZSIsZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJue3Jlc3RyaWN0OiJFQSIsc2NvcGU6e2luZGV4OiI9IixtYXRjaDoiPSIscXVlcnk6Ij0ifSxsaW5rOmZ1bmN0aW9uKGUsZixnKXt2YXIgaD1kKGcudGVtcGxhdGVVcmwpKGUuJHBhcmVudCl8fCJ0ZW1wbGF0ZS90eXBlYWhlYWQvdHlwZWFoZWFkLW1hdGNoLmh0bWwiO2EuZ2V0KGgse2NhY2hlOmJ9KS5zdWNjZXNzKGZ1bmN0aW9uKGEpe2YucmVwbGFjZVdpdGgoYyhhLnRyaW0oKSkoZSkpfSl9fX1dKS5maWx0ZXIoInR5cGVhaGVhZEhpZ2hsaWdodCIsZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiBhLnJlcGxhY2UoLyhbLj8qK14kW1xdXFwoKXt9fC1dKS9nLCJcXCQxIil9cmV0dXJuIGZ1bmN0aW9uKGIsYyl7cmV0dXJuIGM/KCIiK2IpLnJlcGxhY2UobmV3IFJlZ0V4cChhKGMpLCJnaSIpLCI8c3Ryb25nPiQmPC9zdHJvbmc+Iik6Yn19KSxhbmd1bGFyLm1vZHVsZSgidGVtcGxhdGUvYWNjb3JkaW9uL2FjY29yZGlvbi1ncm91cC5odG1sIixbXSkucnVuKFsiJHRlbXBsYXRlQ2FjaGUiLGZ1bmN0aW9uKGEpe2EucHV0KCJ0ZW1wbGF0ZS9hY2NvcmRpb24vYWNjb3JkaW9uLWdyb3VwLmh0bWwiLCc8ZGl2IGNsYXNzPSJwYW5lbCBwYW5lbC1kZWZhdWx0Ij5cbiAgPGRpdiBjbGFzcz0icGFuZWwtaGVhZGluZyI+XG4gICAgPGg0IGNsYXNzPSJwYW5lbC10aXRsZSI+XG4gICAgICA8YSBjbGFzcz0iYWNjb3JkaW9uLXRvZ2dsZSIgbmctY2xpY2s9InRvZ2dsZU9wZW4oKSIgYWNjb3JkaW9uLXRyYW5zY2x1ZGU9ImhlYWRpbmciPjxzcGFuIG5nLWNsYXNzPSJ7XCd0ZXh0LW11dGVkXCc6IGlzRGlzYWJsZWR9Ij57e2hlYWRpbmd9fTwvc3Bhbj48L2E+XG4gICAgPC9oND5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9InBhbmVsLWNvbGxhcHNlIiBjb2xsYXBzZT0iIWlzT3BlbiI+XG4JICA8ZGl2IGNsYXNzPSJwYW5lbC1ib2R5IiBuZy10cmFuc2NsdWRlPjwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PicpfV0pLGFuZ3VsYXIubW9kdWxlKCJ0ZW1wbGF0ZS9hY2NvcmRpb24vYWNjb3JkaW9uLmh0bWwiLFtdKS5ydW4oWyIkdGVtcGxhdGVDYWNoZSIsZnVuY3Rpb24oYSl7YS5wdXQoInRlbXBsYXRlL2FjY29yZGlvbi9hY2NvcmRpb24uaHRtbCIsJzxkaXYgY2xhc3M9InBhbmVsLWdyb3VwIiBuZy10cmFuc2NsdWRlPjwvZGl2PicpfV0pLGFuZ3VsYXIubW9kdWxlKCJ0ZW1wbGF0ZS9hbGVydC9hbGVydC5odG1sIixbXSkucnVuKFsiJHRlbXBsYXRlQ2FjaGUiLGZ1bmN0aW9uKGEpe2EucHV0KCJ0ZW1wbGF0ZS9hbGVydC9hbGVydC5odG1sIiwnPGRpdiBjbGFzcz0iYWxlcnQiIG5nLWNsYXNzPSJ7XCdhbGVydC17e3R5cGUgfHwgXCd3YXJuaW5nXCd9fVwnOiB0cnVlLCBcJ2FsZXJ0LWRpc21pc3NhYmxlXCc6IGNsb3NlYWJsZX0iIHJvbGU9ImFsZXJ0Ij5cbiAgICA8YnV0dG9uIG5nLXNob3c9ImNsb3NlYWJsZSIgdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIG5nLWNsaWNrPSJjbG9zZSgpIj5cbiAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49InRydWUiPiZ0aW1lczs8L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPSJzci1vbmx5Ij5DbG9zZTwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8ZGl2IG5nLXRyYW5zY2x1ZGU+PC9kaXY+XG48L2Rpdj5cbicpfV0pLGFuZ3VsYXIubW9kdWxlKCJ0ZW1wbGF0ZS9jYXJvdXNlbC9jYXJvdXNlbC5odG1sIixbXSkucnVuKFsiJHRlbXBsYXRlQ2FjaGUiLGZ1bmN0aW9uKGEpe2EucHV0KCJ0ZW1wbGF0ZS9jYXJvdXNlbC9jYXJvdXNlbC5odG1sIiwnPGRpdiBuZy1tb3VzZWVudGVyPSJwYXVzZSgpIiBuZy1tb3VzZWxlYXZlPSJwbGF5KCkiIGNsYXNzPSJjYXJvdXNlbCIgbmctc3dpcGUtcmlnaHQ9InByZXYoKSIgbmctc3dpcGUtbGVmdD0ibmV4dCgpIj5cbiAgICA8b2wgY2xhc3M9ImNhcm91c2VsLWluZGljYXRvcnMiIG5nLXNob3c9InNsaWRlcy5sZW5ndGggPiAxIj5cbiAgICAgICAgPGxpIG5nLXJlcGVhdD0ic2xpZGUgaW4gc2xpZGVzIHRyYWNrIGJ5ICRpbmRleCIgbmctY2xhc3M9InthY3RpdmU6IGlzQWN0aXZlKHNsaWRlKX0iIG5nLWNsaWNrPSJzZWxlY3Qoc2xpZGUpIj48L2xpPlxuICAgIDwvb2w+XG4gICAgPGRpdiBjbGFzcz0iY2Fyb3VzZWwtaW5uZXIiIG5nLXRyYW5zY2x1ZGU+PC9kaXY+XG4gICAgPGEgY2xhc3M9ImxlZnQgY2Fyb3VzZWwtY29udHJvbCIgbmctY2xpY2s9InByZXYoKSIgbmctc2hvdz0ic2xpZGVzLmxlbmd0aCA+IDEiPjxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWNoZXZyb24tbGVmdCI+PC9zcGFuPjwvYT5cbiAgICA8YSBjbGFzcz0icmlnaHQgY2Fyb3VzZWwtY29udHJvbCIgbmctY2xpY2s9Im5leHQoKSIgbmctc2hvdz0ic2xpZGVzLmxlbmd0aCA+IDEiPjxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWNoZXZyb24tcmlnaHQiPjwvc3Bhbj48L2E+XG48L2Rpdj5cbicpfV0pLGFuZ3VsYXIubW9kdWxlKCJ0ZW1wbGF0ZS9jYXJvdXNlbC9zbGlkZS5odG1sIixbXSkucnVuKFsiJHRlbXBsYXRlQ2FjaGUiLGZ1bmN0aW9uKGEpe2EucHV0KCJ0ZW1wbGF0ZS9jYXJvdXNlbC9zbGlkZS5odG1sIiwiPGRpdiBuZy1jbGFzcz1cIntcbiAgICAnYWN0aXZlJzogbGVhdmluZyB8fCAoYWN0aXZlICYmICFlbnRlcmluZyksXG4gICAgJ3ByZXYnOiAobmV4dCB8fCBhY3RpdmUpICYmIGRpcmVjdGlvbj09J3ByZXYnLFxuICAgICduZXh0JzogKG5leHQgfHwgYWN0aXZlKSAmJiBkaXJlY3Rpb249PSduZXh0JyxcbiAgICAncmlnaHQnOiBkaXJlY3Rpb249PSdwcmV2JyxcbiAgICAnbGVmdCc6IGRpcmVjdGlvbj09J25leHQnXG4gIH1cIiBjbGFzcz1cIml0ZW0gdGV4dC1jZW50ZXJcIiBuZy10cmFuc2NsdWRlPjwvZGl2PlxuIil9XSksYW5ndWxhci5tb2R1bGUoInRlbXBsYXRlL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5odG1sIixbXSkucnVuKFsiJHRlbXBsYXRlQ2FjaGUiLGZ1bmN0aW9uKGEpe2EucHV0KCJ0ZW1wbGF0ZS9kYXRlcGlja2VyL2RhdGVwaWNrZXIuaHRtbCIsJzxkaXYgbmctc3dpdGNoPSJkYXRlcGlja2VyTW9kZSIgcm9sZT0iYXBwbGljYXRpb24iIG5nLWtleWRvd249ImtleWRvd24oJGV2ZW50KSI+XG4gIDxkYXlwaWNrZXIgbmctc3dpdGNoLXdoZW49ImRheSIgdGFiaW5kZXg9IjAiPjwvZGF5cGlja2VyPlxuICA8bW9udGhwaWNrZXIgbmctc3dpdGNoLXdoZW49Im1vbnRoIiB0YWJpbmRleD0iMCI+PC9tb250aHBpY2tlcj5cbiAgPHllYXJwaWNrZXIgbmctc3dpdGNoLXdoZW49InllYXIiIHRhYmluZGV4PSIwIj48L3llYXJwaWNrZXI+XG48L2Rpdj4nKX1dKSxhbmd1bGFyLm1vZHVsZSgidGVtcGxhdGUvZGF0ZXBpY2tlci9kYXkuaHRtbCIsW10pLnJ1bihbIiR0ZW1wbGF0ZUNhY2hlIixmdW5jdGlvbihhKXthLnB1dCgidGVtcGxhdGUvZGF0ZXBpY2tlci9kYXkuaHRtbCIsJzx0YWJsZSByb2xlPSJncmlkIiBhcmlhLWxhYmVsbGVkYnk9Int7dW5pcXVlSWR9fS10aXRsZSIgYXJpYS1hY3RpdmVkZXNjZW5kYW50PSJ7e2FjdGl2ZURhdGVJZH19Ij5cbiAgPHRoZWFkPlxuICAgIDx0cj5cbiAgICAgIDx0aD48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCBidG4tc20gcHVsbC1sZWZ0IiBuZy1jbGljaz0ibW92ZSgtMSkiIHRhYmluZGV4PSItMSI+PGkgY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tY2hldnJvbi1sZWZ0Ij48L2k+PC9idXR0b24+PC90aD5cbiAgICAgIDx0aCBjb2xzcGFuPSJ7ezUgKyBzaG93V2Vla3N9fSI+PGJ1dHRvbiBpZD0ie3t1bmlxdWVJZH19LXRpdGxlIiByb2xlPSJoZWFkaW5nIiBhcmlhLWxpdmU9ImFzc2VydGl2ZSIgYXJpYS1hdG9taWM9InRydWUiIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCBidG4tc20iIG5nLWNsaWNrPSJ0b2dnbGVNb2RlKCkiIHRhYmluZGV4PSItMSIgc3R5bGU9IndpZHRoOjEwMCU7Ij48c3Ryb25nPnt7dGl0bGV9fTwvc3Ryb25nPjwvYnV0dG9uPjwvdGg+XG4gICAgICA8dGg+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIHB1bGwtcmlnaHQiIG5nLWNsaWNrPSJtb3ZlKDEpIiB0YWJpbmRleD0iLTEiPjxpIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWNoZXZyb24tcmlnaHQiPjwvaT48L2J1dHRvbj48L3RoPlxuICAgIDwvdHI+XG4gICAgPHRyPlxuICAgICAgPHRoIG5nLXNob3c9InNob3dXZWVrcyIgY2xhc3M9InRleHQtY2VudGVyIj48L3RoPlxuICAgICAgPHRoIG5nLXJlcGVhdD0ibGFiZWwgaW4gbGFiZWxzIHRyYWNrIGJ5ICRpbmRleCIgY2xhc3M9InRleHQtY2VudGVyIj48c21hbGwgYXJpYS1sYWJlbD0ie3tsYWJlbC5mdWxsfX0iPnt7bGFiZWwuYWJicn19PC9zbWFsbD48L3RoPlxuICAgIDwvdHI+XG4gIDwvdGhlYWQ+XG4gIDx0Ym9keT5cbiAgICA8dHIgbmctcmVwZWF0PSJyb3cgaW4gcm93cyB0cmFjayBieSAkaW5kZXgiPlxuICAgICAgPHRkIG5nLXNob3c9InNob3dXZWVrcyIgY2xhc3M9InRleHQtY2VudGVyIGg2Ij48ZW0+e3sgd2Vla051bWJlcnNbJGluZGV4XSB9fTwvZW0+PC90ZD5cbiAgICAgIDx0ZCBuZy1yZXBlYXQ9ImR0IGluIHJvdyB0cmFjayBieSBkdC5kYXRlIiBjbGFzcz0idGV4dC1jZW50ZXIiIHJvbGU9ImdyaWRjZWxsIiBpZD0ie3tkdC51aWR9fSIgYXJpYS1kaXNhYmxlZD0ie3shIWR0LmRpc2FibGVkfX0iPlxuICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgc3R5bGU9IndpZHRoOjEwMCU7IiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbSIgbmctY2xhc3M9IntcJ2J0bi1pbmZvXCc6IGR0LnNlbGVjdGVkLCBhY3RpdmU6IGlzQWN0aXZlKGR0KX0iIG5nLWNsaWNrPSJzZWxlY3QoZHQuZGF0ZSkiIG5nLWRpc2FibGVkPSJkdC5kaXNhYmxlZCIgdGFiaW5kZXg9Ii0xIj48c3BhbiBuZy1jbGFzcz0ie1wndGV4dC1tdXRlZFwnOiBkdC5zZWNvbmRhcnksIFwndGV4dC1pbmZvXCc6IGR0LmN1cnJlbnR9Ij57e2R0LmxhYmVsfX08L3NwYW4+PC9idXR0b24+XG4gICAgICA8L3RkPlxuICAgIDwvdHI+XG4gIDwvdGJvZHk+XG48L3RhYmxlPlxuJyl9XSksYW5ndWxhci5tb2R1bGUoInRlbXBsYXRlL2RhdGVwaWNrZXIvbW9udGguaHRtbCIsW10pLnJ1bihbIiR0ZW1wbGF0ZUNhY2hlIixmdW5jdGlvbihhKXthLnB1dCgidGVtcGxhdGUvZGF0ZXBpY2tlci9tb250aC5odG1sIiwnPHRhYmxlIHJvbGU9ImdyaWQiIGFyaWEtbGFiZWxsZWRieT0ie3t1bmlxdWVJZH19LXRpdGxlIiBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQ9Int7YWN0aXZlRGF0ZUlkfX0iPlxuICA8dGhlYWQ+XG4gICAgPHRyPlxuICAgICAgPHRoPjxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbSBwdWxsLWxlZnQiIG5nLWNsaWNrPSJtb3ZlKC0xKSIgdGFiaW5kZXg9Ii0xIj48aSBjbGFzcz0iZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLWxlZnQiPjwvaT48L2J1dHRvbj48L3RoPlxuICAgICAgPHRoPjxidXR0b24gaWQ9Int7dW5pcXVlSWR9fS10aXRsZSIgcm9sZT0iaGVhZGluZyIgYXJpYS1saXZlPSJhc3NlcnRpdmUiIGFyaWEtYXRvbWljPSJ0cnVlIiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIiBuZy1jbGljaz0idG9nZ2xlTW9kZSgpIiB0YWJpbmRleD0iLTEiIHN0eWxlPSJ3aWR0aDoxMDAlOyI+PHN0cm9uZz57e3RpdGxlfX08L3N0cm9uZz48L2J1dHRvbj48L3RoPlxuICAgICAgPHRoPjxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbSBwdWxsLXJpZ2h0IiBuZy1jbGljaz0ibW92ZSgxKSIgdGFiaW5kZXg9Ii0xIj48aSBjbGFzcz0iZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLXJpZ2h0Ij48L2k+PC9idXR0b24+PC90aD5cbiAgICA8L3RyPlxuICA8L3RoZWFkPlxuICA8dGJvZHk+XG4gICAgPHRyIG5nLXJlcGVhdD0icm93IGluIHJvd3MgdHJhY2sgYnkgJGluZGV4Ij5cbiAgICAgIDx0ZCBuZy1yZXBlYXQ9ImR0IGluIHJvdyB0cmFjayBieSBkdC5kYXRlIiBjbGFzcz0idGV4dC1jZW50ZXIiIHJvbGU9ImdyaWRjZWxsIiBpZD0ie3tkdC51aWR9fSIgYXJpYS1kaXNhYmxlZD0ie3shIWR0LmRpc2FibGVkfX0iPlxuICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgc3R5bGU9IndpZHRoOjEwMCU7IiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IiBuZy1jbGFzcz0ie1wnYnRuLWluZm9cJzogZHQuc2VsZWN0ZWQsIGFjdGl2ZTogaXNBY3RpdmUoZHQpfSIgbmctY2xpY2s9InNlbGVjdChkdC5kYXRlKSIgbmctZGlzYWJsZWQ9ImR0LmRpc2FibGVkIiB0YWJpbmRleD0iLTEiPjxzcGFuIG5nLWNsYXNzPSJ7XCd0ZXh0LWluZm9cJzogZHQuY3VycmVudH0iPnt7ZHQubGFiZWx9fTwvc3Bhbj48L2J1dHRvbj5cbiAgICAgIDwvdGQ+XG4gICAgPC90cj5cbiAgPC90Ym9keT5cbjwvdGFibGU+XG4nKX1dKSxhbmd1bGFyLm1vZHVsZSgidGVtcGxhdGUvZGF0ZXBpY2tlci9wb3B1cC5odG1sIixbXSkucnVuKFsiJHRlbXBsYXRlQ2FjaGUiLGZ1bmN0aW9uKGEpe2EucHV0KCJ0ZW1wbGF0ZS9kYXRlcGlja2VyL3BvcHVwLmh0bWwiLCc8dWwgY2xhc3M9ImRyb3Bkb3duLW1lbnUiIG5nLXN0eWxlPSJ7ZGlzcGxheTogKGlzT3BlbiAmJiBcJ2Jsb2NrXCcpIHx8IFwnbm9uZVwnLCB0b3A6IHBvc2l0aW9uLnRvcCtcJ3B4XCcsIGxlZnQ6IHBvc2l0aW9uLmxlZnQrXCdweFwnfSIgbmcta2V5ZG93bj0ia2V5ZG93bigkZXZlbnQpIj5cbgk8bGkgbmctdHJhbnNjbHVkZT48L2xpPlxuCTxsaSBuZy1pZj0ic2hvd0J1dHRvbkJhciIgc3R5bGU9InBhZGRpbmc6MTBweCA5cHggMnB4Ij5cbgkJPHNwYW4gY2xhc3M9ImJ0bi1ncm91cCI+XG4JCQk8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tc20gYnRuLWluZm8iIG5nLWNsaWNrPSJzZWxlY3QoXCd0b2RheVwnKSI+e3sgZ2V0VGV4dChcJ2N1cnJlbnRcJykgfX08L2J1dHRvbj5cbgkJCTxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1zbSBidG4tZGFuZ2VyIiBuZy1jbGljaz0ic2VsZWN0KG51bGwpIj57eyBnZXRUZXh0KFwnY2xlYXJcJykgfX08L2J1dHRvbj5cbgkJPC9zcGFuPlxuCQk8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tc20gYnRuLXN1Y2Nlc3MgcHVsbC1yaWdodCIgbmctY2xpY2s9ImNsb3NlKCkiPnt7IGdldFRleHQoXCdjbG9zZVwnKSB9fTwvYnV0dG9uPlxuCTwvbGk+XG48L3VsPlxuJyl9XSksYW5ndWxhci5tb2R1bGUoInRlbXBsYXRlL2RhdGVwaWNrZXIveWVhci5odG1sIixbXSkucnVuKFsiJHRlbXBsYXRlQ2FjaGUiLGZ1bmN0aW9uKGEpe2EucHV0KCJ0ZW1wbGF0ZS9kYXRlcGlja2VyL3llYXIuaHRtbCIsJzx0YWJsZSByb2xlPSJncmlkIiBhcmlhLWxhYmVsbGVkYnk9Int7dW5pcXVlSWR9fS10aXRsZSIgYXJpYS1hY3RpdmVkZXNjZW5kYW50PSJ7e2FjdGl2ZURhdGVJZH19Ij5cbiAgPHRoZWFkPlxuICAgIDx0cj5cbiAgICAgIDx0aD48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCBidG4tc20gcHVsbC1sZWZ0IiBuZy1jbGljaz0ibW92ZSgtMSkiIHRhYmluZGV4PSItMSI+PGkgY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tY2hldnJvbi1sZWZ0Ij48L2k+PC9idXR0b24+PC90aD5cbiAgICAgIDx0aCBjb2xzcGFuPSIzIj48YnV0dG9uIGlkPSJ7e3VuaXF1ZUlkfX0tdGl0bGUiIHJvbGU9ImhlYWRpbmciIGFyaWEtbGl2ZT0iYXNzZXJ0aXZlIiBhcmlhLWF0b21pYz0idHJ1ZSIgdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbSIgbmctY2xpY2s9InRvZ2dsZU1vZGUoKSIgdGFiaW5kZXg9Ii0xIiBzdHlsZT0id2lkdGg6MTAwJTsiPjxzdHJvbmc+e3t0aXRsZX19PC9zdHJvbmc+PC9idXR0b24+PC90aD5cbiAgICAgIDx0aD48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCBidG4tc20gcHVsbC1yaWdodCIgbmctY2xpY2s9Im1vdmUoMSkiIHRhYmluZGV4PSItMSI+PGkgY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tY2hldnJvbi1yaWdodCI+PC9pPjwvYnV0dG9uPjwvdGg+XG4gICAgPC90cj5cbiAgPC90aGVhZD5cbiAgPHRib2R5PlxuICAgIDx0ciBuZy1yZXBlYXQ9InJvdyBpbiByb3dzIHRyYWNrIGJ5ICRpbmRleCI+XG4gICAgICA8dGQgbmctcmVwZWF0PSJkdCBpbiByb3cgdHJhY2sgYnkgZHQuZGF0ZSIgY2xhc3M9InRleHQtY2VudGVyIiByb2xlPSJncmlkY2VsbCIgaWQ9Int7ZHQudWlkfX0iIGFyaWEtZGlzYWJsZWQ9Int7ISFkdC5kaXNhYmxlZH19Ij5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIHN0eWxlPSJ3aWR0aDoxMDAlOyIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCIgbmctY2xhc3M9IntcJ2J0bi1pbmZvXCc6IGR0LnNlbGVjdGVkLCBhY3RpdmU6IGlzQWN0aXZlKGR0KX0iIG5nLWNsaWNrPSJzZWxlY3QoZHQuZGF0ZSkiIG5nLWRpc2FibGVkPSJkdC5kaXNhYmxlZCIgdGFiaW5kZXg9Ii0xIj48c3BhbiBuZy1jbGFzcz0ie1wndGV4dC1pbmZvXCc6IGR0LmN1cnJlbnR9Ij57e2R0LmxhYmVsfX08L3NwYW4+PC9idXR0b24+XG4gICAgICA8L3RkPlxuICAgIDwvdHI+XG4gIDwvdGJvZHk+XG48L3RhYmxlPlxuJyl9XSksYW5ndWxhci5tb2R1bGUoInRlbXBsYXRlL21vZGFsL2JhY2tkcm9wLmh0bWwiLFtdKS5ydW4oWyIkdGVtcGxhdGVDYWNoZSIsZnVuY3Rpb24oYSl7YS5wdXQoInRlbXBsYXRlL21vZGFsL2JhY2tkcm9wLmh0bWwiLCc8ZGl2IGNsYXNzPSJtb2RhbC1iYWNrZHJvcCBmYWRlIlxuICAgICBuZy1jbGFzcz0ie2luOiBhbmltYXRlfSJcbiAgICAgbmctc3R5bGU9IntcJ3otaW5kZXhcJzogMTA0MCArIChpbmRleCAmJiAxIHx8IDApICsgaW5kZXgqMTB9IlxuPjwvZGl2PlxuJyl9XSksYW5ndWxhci5tb2R1bGUoInRlbXBsYXRlL21vZGFsL3dpbmRvdy5odG1sIixbXSkucnVuKFsiJHRlbXBsYXRlQ2FjaGUiLGZ1bmN0aW9uKGEpe2EucHV0KCJ0ZW1wbGF0ZS9tb2RhbC93aW5kb3cuaHRtbCIsJzxkaXYgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciIGNsYXNzPSJtb2RhbCBmYWRlIiBuZy1jbGFzcz0ie2luOiBhbmltYXRlfSIgbmctc3R5bGU9IntcJ3otaW5kZXhcJzogMTA1MCArIGluZGV4KjEwLCBkaXNwbGF5OiBcJ2Jsb2NrXCd9IiBuZy1jbGljaz0iY2xvc2UoJGV2ZW50KSI+XG4gICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIiBuZy1jbGFzcz0ie1wnbW9kYWwtc21cJzogc2l6ZSA9PSBcJ3NtXCcsIFwnbW9kYWwtbGdcJzogc2l6ZSA9PSBcJ2xnXCd9Ij48ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50IiBuZy10cmFuc2NsdWRlPjwvZGl2PjwvZGl2PlxuPC9kaXY+Jyl9XSksYW5ndWxhci5tb2R1bGUoInRlbXBsYXRlL3BhZ2luYXRpb24vcGFnZXIuaHRtbCIsW10pLnJ1bihbIiR0ZW1wbGF0ZUNhY2hlIixmdW5jdGlvbihhKXthLnB1dCgidGVtcGxhdGUvcGFnaW5hdGlvbi9wYWdlci5odG1sIiwnPHVsIGNsYXNzPSJwYWdlciI+XG4gIDxsaSBuZy1jbGFzcz0ie2Rpc2FibGVkOiBub1ByZXZpb3VzKCksIHByZXZpb3VzOiBhbGlnbn0iPjxhIGhyZWYgbmctY2xpY2s9InNlbGVjdFBhZ2UocGFnZSAtIDEpIj57e2dldFRleHQoXCdwcmV2aW91c1wnKX19PC9hPjwvbGk+XG4gIDxsaSBuZy1jbGFzcz0ie2Rpc2FibGVkOiBub05leHQoKSwgbmV4dDogYWxpZ259Ij48YSBocmVmIG5nLWNsaWNrPSJzZWxlY3RQYWdlKHBhZ2UgKyAxKSI+e3tnZXRUZXh0KFwnbmV4dFwnKX19PC9hPjwvbGk+XG48L3VsPicpfV0pLGFuZ3VsYXIubW9kdWxlKCJ0ZW1wbGF0ZS9wYWdpbmF0aW9uL3BhZ2luYXRpb24uaHRtbCIsW10pLnJ1bihbIiR0ZW1wbGF0ZUNhY2hlIixmdW5jdGlvbihhKXthLnB1dCgidGVtcGxhdGUvcGFnaW5hdGlvbi9wYWdpbmF0aW9uLmh0bWwiLCc8dWwgY2xhc3M9InBhZ2luYXRpb24iPlxuICA8bGkgbmctaWY9ImJvdW5kYXJ5TGlua3MiIG5nLWNsYXNzPSJ7ZGlzYWJsZWQ6IG5vUHJldmlvdXMoKX0iPjxhIGhyZWYgbmctY2xpY2s9InNlbGVjdFBhZ2UoMSkiPnt7Z2V0VGV4dChcJ2ZpcnN0XCcpfX08L2E+PC9saT5cbiAgPGxpIG5nLWlmPSJkaXJlY3Rpb25MaW5rcyIgbmctY2xhc3M9IntkaXNhYmxlZDogbm9QcmV2aW91cygpfSI+PGEgaHJlZiBuZy1jbGljaz0ic2VsZWN0UGFnZShwYWdlIC0gMSkiPnt7Z2V0VGV4dChcJ3ByZXZpb3VzXCcpfX08L2E+PC9saT5cbiAgPGxpIG5nLXJlcGVhdD0icGFnZSBpbiBwYWdlcyB0cmFjayBieSAkaW5kZXgiIG5nLWNsYXNzPSJ7YWN0aXZlOiBwYWdlLmFjdGl2ZX0iPjxhIGhyZWYgbmctY2xpY2s9InNlbGVjdFBhZ2UocGFnZS5udW1iZXIpIj57e3BhZ2UudGV4dH19PC9hPjwvbGk+XG4gIDxsaSBuZy1pZj0iZGlyZWN0aW9uTGlua3MiIG5nLWNsYXNzPSJ7ZGlzYWJsZWQ6IG5vTmV4dCgpfSI+PGEgaHJlZiBuZy1jbGljaz0ic2VsZWN0UGFnZShwYWdlICsgMSkiPnt7Z2V0VGV4dChcJ25leHRcJyl9fTwvYT48L2xpPlxuICA8bGkgbmctaWY9ImJvdW5kYXJ5TGlua3MiIG5nLWNsYXNzPSJ7ZGlzYWJsZWQ6IG5vTmV4dCgpfSI+PGEgaHJlZiBuZy1jbGljaz0ic2VsZWN0UGFnZSh0b3RhbFBhZ2VzKSI+e3tnZXRUZXh0KFwnbGFzdFwnKX19PC9hPjwvbGk+XG48L3VsPicpfV0pLGFuZ3VsYXIubW9kdWxlKCJ0ZW1wbGF0ZS90b29sdGlwL3Rvb2x0aXAtaHRtbC11bnNhZmUtcG9wdXAuaHRtbCIsW10pLnJ1bihbIiR0ZW1wbGF0ZUNhY2hlIixmdW5jdGlvbihhKXthLnB1dCgidGVtcGxhdGUvdG9vbHRpcC90b29sdGlwLWh0bWwtdW5zYWZlLXBvcHVwLmh0bWwiLCc8ZGl2IGNsYXNzPSJ0b29sdGlwIHt7cGxhY2VtZW50fX0iIG5nLWNsYXNzPSJ7IGluOiBpc09wZW4oKSwgZmFkZTogYW5pbWF0aW9uKCkgfSI+XG4gIDxkaXYgY2xhc3M9InRvb2x0aXAtYXJyb3ciPjwvZGl2PlxuICA8ZGl2IGNsYXNzPSJ0b29sdGlwLWlubmVyIiBiaW5kLWh0bWwtdW5zYWZlPSJjb250ZW50Ij48L2Rpdj5cbjwvZGl2PlxuJyl9XSksYW5ndWxhci5tb2R1bGUoInRlbXBsYXRlL3Rvb2x0aXAvdG9vbHRpcC1wb3B1cC5odG1sIixbXSkucnVuKFsiJHRlbXBsYXRlQ2FjaGUiLGZ1bmN0aW9uKGEpe2EucHV0KCJ0ZW1wbGF0ZS90b29sdGlwL3Rvb2x0aXAtcG9wdXAuaHRtbCIsJzxkaXYgY2xhc3M9InRvb2x0aXAge3twbGFjZW1lbnR9fSIgbmctY2xhc3M9InsgaW46IGlzT3BlbigpLCBmYWRlOiBhbmltYXRpb24oKSB9Ij5cbiAgPGRpdiBjbGFzcz0idG9vbHRpcC1hcnJvdyI+PC9kaXY+XG4gIDxkaXYgY2xhc3M9InRvb2x0aXAtaW5uZXIiIG5nLWJpbmQ9ImNvbnRlbnQiPjwvZGl2PlxuPC9kaXY+XG4nKX1dKSxhbmd1bGFyLm1vZHVsZSgidGVtcGxhdGUvcG9wb3Zlci9wb3BvdmVyLmh0bWwiLFtdKS5ydW4oWyIkdGVtcGxhdGVDYWNoZSIsZnVuY3Rpb24oYSl7YS5wdXQoInRlbXBsYXRlL3BvcG92ZXIvcG9wb3Zlci5odG1sIiwnPGRpdiBjbGFzcz0icG9wb3ZlciB7e3BsYWNlbWVudH19IiBuZy1jbGFzcz0ieyBpbjogaXNPcGVuKCksIGZhZGU6IGFuaW1hdGlvbigpIH0iPlxuICA8ZGl2IGNsYXNzPSJhcnJvdyI+PC9kaXY+XG5cbiAgPGRpdiBjbGFzcz0icG9wb3Zlci1pbm5lciI+XG4gICAgICA8aDMgY2xhc3M9InBvcG92ZXItdGl0bGUiIG5nLWJpbmQ9InRpdGxlIiBuZy1zaG93PSJ0aXRsZSI+PC9oMz5cbiAgICAgIDxkaXYgY2xhc3M9InBvcG92ZXItY29udGVudCIgbmctYmluZD0iY29udGVudCI+PC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4nKX1dKSxhbmd1bGFyLm1vZHVsZSgidGVtcGxhdGUvcHJvZ3Jlc3NiYXIvYmFyLmh0bWwiLFtdKS5ydW4oWyIkdGVtcGxhdGVDYWNoZSIsZnVuY3Rpb24oYSl7YS5wdXQoInRlbXBsYXRlL3Byb2dyZXNzYmFyL2Jhci5odG1sIiwnPGRpdiBjbGFzcz0icHJvZ3Jlc3MtYmFyIiBuZy1jbGFzcz0idHlwZSAmJiBcJ3Byb2dyZXNzLWJhci1cJyArIHR5cGUiIHJvbGU9InByb2dyZXNzYmFyIiBhcmlhLXZhbHVlbm93PSJ7e3ZhbHVlfX0iIGFyaWEtdmFsdWVtaW49IjAiIGFyaWEtdmFsdWVtYXg9Int7bWF4fX0iIG5nLXN0eWxlPSJ7d2lkdGg6IHBlcmNlbnQgKyBcJyVcJ30iIGFyaWEtdmFsdWV0ZXh0PSJ7e3BlcmNlbnQgfCBudW1iZXI6MH19JSIgbmctdHJhbnNjbHVkZT48L2Rpdj4nKX1dKSxhbmd1bGFyLm1vZHVsZSgidGVtcGxhdGUvcHJvZ3Jlc3NiYXIvcHJvZ3Jlc3MuaHRtbCIsW10pLnJ1bihbIiR0ZW1wbGF0ZUNhY2hlIixmdW5jdGlvbihhKXthLnB1dCgidGVtcGxhdGUvcHJvZ3Jlc3NiYXIvcHJvZ3Jlc3MuaHRtbCIsJzxkaXYgY2xhc3M9InByb2dyZXNzIiBuZy10cmFuc2NsdWRlPjwvZGl2PicpfV0pLGFuZ3VsYXIubW9kdWxlKCJ0ZW1wbGF0ZS9wcm9ncmVzc2Jhci9wcm9ncmVzc2Jhci5odG1sIixbXSkucnVuKFsiJHRlbXBsYXRlQ2FjaGUiLGZ1bmN0aW9uKGEpe2EucHV0KCJ0ZW1wbGF0ZS9wcm9ncmVzc2Jhci9wcm9ncmVzc2Jhci5odG1sIiwnPGRpdiBjbGFzcz0icHJvZ3Jlc3MiPlxuICA8ZGl2IGNsYXNzPSJwcm9ncmVzcy1iYXIiIG5nLWNsYXNzPSJ0eXBlICYmIFwncHJvZ3Jlc3MtYmFyLVwnICsgdHlwZSIgcm9sZT0icHJvZ3Jlc3NiYXIiIGFyaWEtdmFsdWVub3c9Int7dmFsdWV9fSIgYXJpYS12YWx1ZW1pbj0iMCIgYXJpYS12YWx1ZW1heD0ie3ttYXh9fSIgbmctc3R5bGU9Int3aWR0aDogcGVyY2VudCArIFwnJVwnfSIgYXJpYS12YWx1ZXRleHQ9Int7cGVyY2VudCB8IG51bWJlcjowfX0lIiBuZy10cmFuc2NsdWRlPjwvZGl2PlxuPC9kaXY+Jyl9XSksYW5ndWxhci5tb2R1bGUoInRlbXBsYXRlL3JhdGluZy9yYXRpbmcuaHRtbCIsW10pLnJ1bihbIiR0ZW1wbGF0ZUNhY2hlIixmdW5jdGlvbihhKXthLnB1dCgidGVtcGxhdGUvcmF0aW5nL3JhdGluZy5odG1sIiwnPHNwYW4gbmctbW91c2VsZWF2ZT0icmVzZXQoKSIgbmcta2V5ZG93bj0ib25LZXlkb3duKCRldmVudCkiIHRhYmluZGV4PSIwIiByb2xlPSJzbGlkZXIiIGFyaWEtdmFsdWVtaW49IjAiIGFyaWEtdmFsdWVtYXg9Int7cmFuZ2UubGVuZ3RofX0iIGFyaWEtdmFsdWVub3c9Int7dmFsdWV9fSI+XG4gICAgPGkgbmctcmVwZWF0PSJyIGluIHJhbmdlIHRyYWNrIGJ5ICRpbmRleCIgbmctbW91c2VlbnRlcj0iZW50ZXIoJGluZGV4ICsgMSkiIG5nLWNsaWNrPSJyYXRlKCRpbmRleCArIDEpIiBjbGFzcz0iZ2x5cGhpY29uIiBuZy1jbGFzcz0iJGluZGV4IDwgdmFsdWUgJiYgKHIuc3RhdGVPbiB8fCBcJ2dseXBoaWNvbi1zdGFyXCcpIHx8IChyLnN0YXRlT2ZmIHx8IFwnZ2x5cGhpY29uLXN0YXItZW1wdHlcJykiPlxuICAgICAgICA8c3BhbiBjbGFzcz0ic3Itb25seSI+KHt7ICRpbmRleCA8IHZhbHVlID8gXCcqXCcgOiBcJyBcJyB9fSk8L3NwYW4+XG4gICAgPC9pPlxuPC9zcGFuPicpfV0pLGFuZ3VsYXIubW9kdWxlKCJ0ZW1wbGF0ZS90YWJzL3RhYi5odG1sIixbXSkucnVuKFsiJHRlbXBsYXRlQ2FjaGUiLGZ1bmN0aW9uKGEpe2EucHV0KCJ0ZW1wbGF0ZS90YWJzL3RhYi5odG1sIiwnPGxpIG5nLWNsYXNzPSJ7YWN0aXZlOiBhY3RpdmUsIGRpc2FibGVkOiBkaXNhYmxlZH0iPlxuICA8YSBuZy1jbGljaz0ic2VsZWN0KCkiIHRhYi1oZWFkaW5nLXRyYW5zY2x1ZGU+e3toZWFkaW5nfX08L2E+XG48L2xpPlxuJyl9XSksYW5ndWxhci5tb2R1bGUoInRlbXBsYXRlL3RhYnMvdGFic2V0LXRpdGxlcy5odG1sIixbXSkucnVuKFsiJHRlbXBsYXRlQ2FjaGUiLGZ1bmN0aW9uKGEpe2EucHV0KCJ0ZW1wbGF0ZS90YWJzL3RhYnNldC10aXRsZXMuaHRtbCIsIjx1bCBjbGFzcz1cIm5hdiB7e3R5cGUgJiYgJ25hdi0nICsgdHlwZX19XCIgbmctY2xhc3M9XCJ7J25hdi1zdGFja2VkJzogdmVydGljYWx9XCI+XG48L3VsPlxuIil9XSksYW5ndWxhci5tb2R1bGUoInRlbXBsYXRlL3RhYnMvdGFic2V0Lmh0bWwiLFtdKS5ydW4oWyIkdGVtcGxhdGVDYWNoZSIsZnVuY3Rpb24oYSl7YS5wdXQoInRlbXBsYXRlL3RhYnMvdGFic2V0Lmh0bWwiLCdcbjxkaXY+XG4gIDx1bCBjbGFzcz0ibmF2IG5hdi17e3R5cGUgfHwgXCd0YWJzXCd9fSIgbmctY2xhc3M9IntcJ25hdi1zdGFja2VkXCc6IHZlcnRpY2FsLCBcJ25hdi1qdXN0aWZpZWRcJzoganVzdGlmaWVkfSIgbmctdHJhbnNjbHVkZT48L3VsPlxuICA8ZGl2IGNsYXNzPSJ0YWItY29udGVudCI+XG4gICAgPGRpdiBjbGFzcz0idGFiLXBhbmUiIFxuICAgICAgICAgbmctcmVwZWF0PSJ0YWIgaW4gdGFicyIgXG4gICAgICAgICBuZy1jbGFzcz0ie2FjdGl2ZTogdGFiLmFjdGl2ZX0iXG4gICAgICAgICB0YWItY29udGVudC10cmFuc2NsdWRlPSJ0YWIiPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuJyl9XSksYW5ndWxhci5tb2R1bGUoInRlbXBsYXRlL3RpbWVwaWNrZXIvdGltZXBpY2tlci5odG1sIixbXSkucnVuKFsiJHRlbXBsYXRlQ2FjaGUiLGZ1bmN0aW9uKGEpe2EucHV0KCJ0ZW1wbGF0ZS90aW1lcGlja2VyL3RpbWVwaWNrZXIuaHRtbCIsJzx0YWJsZT5cbgk8dGJvZHk+XG4JCTx0ciBjbGFzcz0idGV4dC1jZW50ZXIiPlxuCQkJPHRkPjxhIG5nLWNsaWNrPSJpbmNyZW1lbnRIb3VycygpIiBjbGFzcz0iYnRuIGJ0bi1saW5rIj48c3BhbiBjbGFzcz0iZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLXVwIj48L3NwYW4+PC9hPjwvdGQ+XG4JCQk8dGQ+Jm5ic3A7PC90ZD5cbgkJCTx0ZD48YSBuZy1jbGljaz0iaW5jcmVtZW50TWludXRlcygpIiBjbGFzcz0iYnRuIGJ0bi1saW5rIj48c3BhbiBjbGFzcz0iZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLXVwIj48L3NwYW4+PC9hPjwvdGQ+XG4JCQk8dGQgbmctc2hvdz0ic2hvd01lcmlkaWFuIj48L3RkPlxuCQk8L3RyPlxuCQk8dHI+XG4JCQk8dGQgc3R5bGU9IndpZHRoOjUwcHg7IiBjbGFzcz0iZm9ybS1ncm91cCIgbmctY2xhc3M9IntcJ2hhcy1lcnJvclwnOiBpbnZhbGlkSG91cnN9Ij5cbgkJCQk8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9ImhvdXJzIiBuZy1jaGFuZ2U9InVwZGF0ZUhvdXJzKCkiIGNsYXNzPSJmb3JtLWNvbnRyb2wgdGV4dC1jZW50ZXIiIG5nLW1vdXNld2hlZWw9ImluY3JlbWVudEhvdXJzKCkiIG5nLXJlYWRvbmx5PSJyZWFkb25seUlucHV0IiBtYXhsZW5ndGg9IjIiPlxuCQkJPC90ZD5cbgkJCTx0ZD46PC90ZD5cbgkJCTx0ZCBzdHlsZT0id2lkdGg6NTBweDsiIGNsYXNzPSJmb3JtLWdyb3VwIiBuZy1jbGFzcz0ie1wnaGFzLWVycm9yXCc6IGludmFsaWRNaW51dGVzfSI+XG4JCQkJPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJtaW51dGVzIiBuZy1jaGFuZ2U9InVwZGF0ZU1pbnV0ZXMoKSIgY2xhc3M9ImZvcm0tY29udHJvbCB0ZXh0LWNlbnRlciIgbmctcmVhZG9ubHk9InJlYWRvbmx5SW5wdXQiIG1heGxlbmd0aD0iMiI+XG4JCQk8L3RkPlxuCQkJPHRkIG5nLXNob3c9InNob3dNZXJpZGlhbiI+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgdGV4dC1jZW50ZXIiIG5nLWNsaWNrPSJ0b2dnbGVNZXJpZGlhbigpIj57e21lcmlkaWFufX08L2J1dHRvbj48L3RkPlxuCQk8L3RyPlxuCQk8dHIgY2xhc3M9InRleHQtY2VudGVyIj5cbgkJCTx0ZD48YSBuZy1jbGljaz0iZGVjcmVtZW50SG91cnMoKSIgY2xhc3M9ImJ0biBidG4tbGluayI+PHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tY2hldnJvbi1kb3duIj48L3NwYW4+PC9hPjwvdGQ+XG4JCQk8dGQ+Jm5ic3A7PC90ZD5cbgkJCTx0ZD48YSBuZy1jbGljaz0iZGVjcmVtZW50TWludXRlcygpIiBjbGFzcz0iYnRuIGJ0bi1saW5rIj48c3BhbiBjbGFzcz0iZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLWRvd24iPjwvc3Bhbj48L2E+PC90ZD5cbgkJCTx0ZCBuZy1zaG93PSJzaG93TWVyaWRpYW4iPjwvdGQ+XG4JCTwvdHI+XG4JPC90Ym9keT5cbjwvdGFibGU+XG4nKX1dKSxhbmd1bGFyLm1vZHVsZSgidGVtcGxhdGUvdHlwZWFoZWFkL3R5cGVhaGVhZC1tYXRjaC5odG1sIixbXSkucnVuKFsiJHRlbXBsYXRlQ2FjaGUiLGZ1bmN0aW9uKGEpe2EucHV0KCJ0ZW1wbGF0ZS90eXBlYWhlYWQvdHlwZWFoZWFkLW1hdGNoLmh0bWwiLCc8YSB0YWJpbmRleD0iLTEiIGJpbmQtaHRtbC11bnNhZmU9Im1hdGNoLmxhYmVsIHwgdHlwZWFoZWFkSGlnaGxpZ2h0OnF1ZXJ5Ij48L2E+Jyl9XSksYW5ndWxhci5tb2R1bGUoInRlbXBsYXRlL3R5cGVhaGVhZC90eXBlYWhlYWQtcG9wdXAuaHRtbCIsW10pLnJ1bihbIiR0ZW1wbGF0ZUNhY2hlIixmdW5jdGlvbihhKXthLnB1dCgidGVtcGxhdGUvdHlwZWFoZWFkL3R5cGVhaGVhZC1wb3B1cC5odG1sIiwnPHVsIGNsYXNzPSJkcm9wZG93bi1tZW51IiBuZy1pZj0iaXNPcGVuKCkiIG5nLXN0eWxlPSJ7dG9wOiBwb3NpdGlvbi50b3ArXCdweFwnLCBsZWZ0OiBwb3NpdGlvbi5sZWZ0K1wncHhcJ30iIHN0eWxlPSJkaXNwbGF5OiBibG9jazsiIHJvbGU9Imxpc3Rib3giIGFyaWEtaGlkZGVuPSJ7eyFpc09wZW4oKX19Ij5cbiAgICA8bGkgbmctcmVwZWF0PSJtYXRjaCBpbiBtYXRjaGVzIHRyYWNrIGJ5ICRpbmRleCIgbmctY2xhc3M9InthY3RpdmU6IGlzQWN0aXZlKCRpbmRleCkgfSIgbmctbW91c2VlbnRlcj0ic2VsZWN0QWN0aXZlKCRpbmRleCkiIG5nLWNsaWNrPSJzZWxlY3RNYXRjaCgkaW5kZXgpIiByb2xlPSJvcHRpb24iIGlkPSJ7e21hdGNoLmlkfX0iPlxuICAgICAgICA8ZGl2IHR5cGVhaGVhZC1tYXRjaCBpbmRleD0iJGluZGV4IiBtYXRjaD0ibWF0Y2giIHF1ZXJ5PSJxdWVyeSIgdGVtcGxhdGUtdXJsPSJ0ZW1wbGF0ZVVybCI+PC9kaXY+XG4gICAgPC9saT5cbjwvdWw+JykKK31dKTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2pzL3VpLWJvb3RzdHJhcC10cGxzLTAuMTEuMC5taW4uanMgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvc3RhdGljL2pzL3VpLWJvb3RzdHJhcC10cGxzLTAuMTEuMC5taW4uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE2YTg2MQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS9zdGF0aWMvanMvdWktYm9vdHN0cmFwLXRwbHMtMC4xMS4wLm1pbi5qcwpAQCAtMCwwICsxLDEwIEBACisvKgorICogYW5ndWxhci11aS1ib290c3RyYXAKKyAqIGh0dHA6Ly9hbmd1bGFyLXVpLmdpdGh1Yi5pby9ib290c3RyYXAvCisKKyAqIFZlcnNpb246IDAuMTEuMCAtIDIwMTQtMDUtMDEKKyAqIExpY2Vuc2U6IE1JVAorICovCithbmd1bGFyLm1vZHVsZSgidWkuYm9vdHN0cmFwIixbInVpLmJvb3RzdHJhcC50cGxzIiwidWkuYm9vdHN0cmFwLnRyYW5zaXRpb24iLCJ1aS5ib290c3RyYXAuY29sbGFwc2UiLCJ1aS5ib290c3RyYXAuYWNjb3JkaW9uIiwidWkuYm9vdHN0cmFwLmFsZXJ0IiwidWkuYm9vdHN0cmFwLmJpbmRIdG1sIiwidWkuYm9vdHN0cmFwLmJ1dHRvbnMiLCJ1aS5ib290c3RyYXAuY2Fyb3VzZWwiLCJ1aS5ib290c3RyYXAuZGF0ZXBhcnNlciIsInVpLmJvb3RzdHJhcC5wb3NpdGlvbiIsInVpLmJvb3RzdHJhcC5kYXRlcGlja2VyIiwidWkuYm9vdHN0cmFwLmRyb3Bkb3duIiwidWkuYm9vdHN0cmFwLm1vZGFsIiwidWkuYm9vdHN0cmFwLnBhZ2luYXRpb24iLCJ1aS5ib290c3RyYXAudG9vbHRpcCIsInVpLmJvb3RzdHJhcC5wb3BvdmVyIiwidWkuYm9vdHN0cmFwLnByb2dyZXNzYmFyIiwidWkuYm9vdHN0cmFwLnJhdGluZyIsInVpLmJvb3RzdHJhcC50YWJzIiwidWkuYm9vdHN0cmFwLnRpbWVwaWNrZXIiLCJ1aS5ib290c3RyYXAudHlwZWFoZWFkIl0pLGFuZ3VsYXIubW9kdWxlKCJ1aS5ib290c3RyYXAudHBscyIsWyJ0ZW1wbGF0ZS9hY2NvcmRpb24vYWNjb3JkaW9uLWdyb3VwLmh0bWwiLCJ0ZW1wbGF0ZS9hY2NvcmRpb24vYWNjb3JkaW9uLmh0bWwiLCJ0ZW1wbGF0ZS9hbGVydC9hbGVydC5odG1sIiwidGVtcGxhdGUvY2Fyb3VzZWwvY2Fyb3VzZWwuaHRtbCIsInRlbXBsYXRlL2Nhcm91c2VsL3NsaWRlLmh0bWwiLCJ0ZW1wbGF0ZS9kYXRlcGlja2VyL2RhdGVwaWNrZXIuaHRtbCIsInRlbXBsYXRlL2RhdGVwaWNrZXIvZGF5Lmh0bWwiLCJ0ZW1wbGF0ZS9kYXRlcGlja2VyL21vbnRoLmh0bWwiLCJ0ZW1wbGF0ZS9kYXRlcGlja2VyL3BvcHVwLmh0bWwiLCJ0ZW1wbGF0ZS9kYXRlcGlja2VyL3llYXIuaHRtbCIsInRlbXBsYXRlL21vZGFsL2JhY2tkcm9wLmh0bWwiLCJ0ZW1wbGF0ZS9tb2RhbC93aW5kb3cuaHRtbCIsInRlbXBsYXRlL3BhZ2luYXRpb24vcGFnZXIuaHRtbCIsInRlbXBsYXRlL3BhZ2luYXRpb24vcGFnaW5hdGlvbi5odG1sIiwidGVtcGxhdGUvdG9vbHRpcC90b29sdGlwLWh0bWwtdW5zYWZlLXBvcHVwLmh0bWwiLCJ0ZW1wbGF0ZS90b29sdGlwL3Rvb2x0aXAtcG9wdXAuaHRtbCIsInRlbXBsYXRlL3BvcG92ZXIvcG9wb3Zlci5odG1sIiwidGVtcGxhdGUvcHJvZ3Jlc3NiYXIvYmFyLmh0bWwiLCJ0ZW1wbGF0ZS9wcm9ncmVzc2Jhci9wcm9ncmVzcy5odG1sIiwidGVtcGxhdGUvcHJvZ3Jlc3NiYXIvcHJvZ3Jlc3NiYXIuaHRtbCIsInRlbXBsYXRlL3JhdGluZy9yYXRpbmcuaHRtbCIsInRlbXBsYXRlL3RhYnMvdGFiLmh0bWwiLCJ0ZW1wbGF0ZS90YWJzL3RhYnNldC5odG1sIiwidGVtcGxhdGUvdGltZXBpY2tlci90aW1lcGlja2VyLmh0bWwiLCJ0ZW1wbGF0ZS90eXBlYWhlYWQvdHlwZWFoZWFkLW1hdGNoLmh0bWwiLCJ0ZW1wbGF0ZS90eXBlYWhlYWQvdHlwZWFoZWFkLXBvcHVwLmh0bWwiXSksYW5ndWxhci5tb2R1bGUoInVpLmJvb3RzdHJhcC50cmFuc2l0aW9uIixbXSkuZmFjdG9yeSgiJHRyYW5zaXRpb24iLFsiJHEiLCIkdGltZW91dCIsIiRyb290U2NvcGUiLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe2Zvcih2YXIgYiBpbiBhKWlmKHZvaWQgMCE9PWYuc3R5bGVbYl0pcmV0dXJuIGFbYl19dmFyIGU9ZnVuY3Rpb24oZCxmLGcpe2c9Z3x8e307dmFyIGg9YS5kZWZlcigpLGk9ZVtnLmFuaW1hdGlvbj8iYW5pbWF0aW9uRW5kRXZlbnROYW1lIjoidHJhbnNpdGlvbkVuZEV2ZW50TmFtZSJdLGo9ZnVuY3Rpb24oKXtjLiRhcHBseShmdW5jdGlvbigpe2QudW5iaW5kKGksaiksaC5yZXNvbHZlKGQpfSl9O3JldHVybiBpJiZkLmJpbmQoaSxqKSxiKGZ1bmN0aW9uKCl7YW5ndWxhci5pc1N0cmluZyhmKT9kLmFkZENsYXNzKGYpOmFuZ3VsYXIuaXNGdW5jdGlvbihmKT9mKGQpOmFuZ3VsYXIuaXNPYmplY3QoZikmJmQuY3NzKGYpLGl8fGgucmVzb2x2ZShkKX0pLGgucHJvbWlzZS5jYW5jZWw9ZnVuY3Rpb24oKXtpJiZkLnVuYmluZChpLGopLGgucmVqZWN0KCJUcmFuc2l0aW9uIGNhbmNlbGxlZCIpfSxoLnByb21pc2V9LGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHJhbnMiKSxnPXtXZWJraXRUcmFuc2l0aW9uOiJ3ZWJraXRUcmFuc2l0aW9uRW5kIixNb3pUcmFuc2l0aW9uOiJ0cmFuc2l0aW9uZW5kIixPVHJhbnNpdGlvbjoib1RyYW5zaXRpb25FbmQiLHRyYW5zaXRpb246InRyYW5zaXRpb25lbmQifSxoPXtXZWJraXRUcmFuc2l0aW9uOiJ3ZWJraXRBbmltYXRpb25FbmQiLE1velRyYW5zaXRpb246ImFuaW1hdGlvbmVuZCIsT1RyYW5zaXRpb246Im9BbmltYXRpb25FbmQiLHRyYW5zaXRpb246ImFuaW1hdGlvbmVuZCJ9O3JldHVybiBlLnRyYW5zaXRpb25FbmRFdmVudE5hbWU9ZChnKSxlLmFuaW1hdGlvbkVuZEV2ZW50TmFtZT1kKGgpLGV9XSksYW5ndWxhci5tb2R1bGUoInVpLmJvb3RzdHJhcC5jb2xsYXBzZSIsWyJ1aS5ib290c3RyYXAudHJhbnNpdGlvbiJdKS5kaXJlY3RpdmUoImNvbGxhcHNlIixbIiR0cmFuc2l0aW9uIixmdW5jdGlvbihhKXtyZXR1cm57bGluazpmdW5jdGlvbihiLGMsZCl7ZnVuY3Rpb24gZShiKXtmdW5jdGlvbiBkKCl7aj09PWUmJihqPXZvaWQgMCl9dmFyIGU9YShjLGIpO3JldHVybiBqJiZqLmNhbmNlbCgpLGo9ZSxlLnRoZW4oZCxkKSxlfWZ1bmN0aW9uIGYoKXtrPyhrPSExLGcoKSk6KGMucmVtb3ZlQ2xhc3MoImNvbGxhcHNlIikuYWRkQ2xhc3MoImNvbGxhcHNpbmciKSxlKHtoZWlnaHQ6Y1swXS5zY3JvbGxIZWlnaHQrInB4In0pLnRoZW4oZykpfWZ1bmN0aW9uIGcoKXtjLnJlbW92ZUNsYXNzKCJjb2xsYXBzaW5nIiksYy5hZGRDbGFzcygiY29sbGFwc2UgaW4iKSxjLmNzcyh7aGVpZ2h0OiJhdXRvIn0pfWZ1bmN0aW9uIGgoKXtpZihrKWs9ITEsaSgpLGMuY3NzKHtoZWlnaHQ6MH0pO2Vsc2V7Yy5jc3Moe2hlaWdodDpjWzBdLnNjcm9sbEhlaWdodCsicHgifSk7e2NbMF0ub2Zmc2V0V2lkdGh9Yy5yZW1vdmVDbGFzcygiY29sbGFwc2UgaW4iKS5hZGRDbGFzcygiY29sbGFwc2luZyIpLGUoe2hlaWdodDowfSkudGhlbihpKX19ZnVuY3Rpb24gaSgpe2MucmVtb3ZlQ2xhc3MoImNvbGxhcHNpbmciKSxjLmFkZENsYXNzKCJjb2xsYXBzZSIpfXZhciBqLGs9ITA7Yi4kd2F0Y2goZC5jb2xsYXBzZSxmdW5jdGlvbihhKXthP2goKTpmKCl9KX19fV0pLGFuZ3VsYXIubW9kdWxlKCJ1aS5ib290c3RyYXAuYWNjb3JkaW9uIixbInVpLmJvb3RzdHJhcC5jb2xsYXBzZSJdKS5jb25zdGFudCgiYWNjb3JkaW9uQ29uZmlnIix7Y2xvc2VPdGhlcnM6ITB9KS5jb250cm9sbGVyKCJBY2NvcmRpb25Db250cm9sbGVyIixbIiRzY29wZSIsIiRhdHRycyIsImFjY29yZGlvbkNvbmZpZyIsZnVuY3Rpb24oYSxiLGMpe3RoaXMuZ3JvdXBzPVtdLHRoaXMuY2xvc2VPdGhlcnM9ZnVuY3Rpb24oZCl7dmFyIGU9YW5ndWxhci5pc0RlZmluZWQoYi5jbG9zZU90aGVycyk/YS4kZXZhbChiLmNsb3NlT3RoZXJzKTpjLmNsb3NlT3RoZXJzO2UmJmFuZ3VsYXIuZm9yRWFjaCh0aGlzLmdyb3VwcyxmdW5jdGlvbihhKXthIT09ZCYmKGEuaXNPcGVuPSExKX0pfSx0aGlzLmFkZEdyb3VwPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7dGhpcy5ncm91cHMucHVzaChhKSxhLiRvbigiJGRlc3Ryb3kiLGZ1bmN0aW9uKCl7Yi5yZW1vdmVHcm91cChhKX0pfSx0aGlzLnJlbW92ZUdyb3VwPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ3JvdXBzLmluZGV4T2YoYSk7LTEhPT1iJiZ0aGlzLmdyb3Vwcy5zcGxpY2UoYiwxKX19XSkuZGlyZWN0aXZlKCJhY2NvcmRpb24iLGZ1bmN0aW9uKCl7cmV0dXJue3Jlc3RyaWN0OiJFQSIsY29udHJvbGxlcjoiQWNjb3JkaW9uQ29udHJvbGxlciIsdHJhbnNjbHVkZTohMCxyZXBsYWNlOiExLHRlbXBsYXRlVXJsOiJ0ZW1wbGF0ZS9hY2NvcmRpb24vYWNjb3JkaW9uLmh0bWwifX0pLmRpcmVjdGl2ZSgiYWNjb3JkaW9uR3JvdXAiLGZ1bmN0aW9uKCl7cmV0dXJue3JlcXVpcmU6Il5hY2NvcmRpb24iLHJlc3RyaWN0OiJFQSIsdHJhbnNjbHVkZTohMCxyZXBsYWNlOiEwLHRlbXBsYXRlVXJsOiJ0ZW1wbGF0ZS9hY2NvcmRpb24vYWNjb3JkaW9uLWdyb3VwLmh0bWwiLHNjb3BlOntoZWFkaW5nOiJAIixpc09wZW46Ij0/Iixpc0Rpc2FibGVkOiI9PyJ9LGNvbnRyb2xsZXI6ZnVuY3Rpb24oKXt0aGlzLnNldEhlYWRpbmc9ZnVuY3Rpb24oYSl7dGhpcy5oZWFkaW5nPWF9fSxsaW5rOmZ1bmN0aW9uKGEsYixjLGQpe2QuYWRkR3JvdXAoYSksYS4kd2F0Y2goImlzT3BlbiIsZnVuY3Rpb24oYil7YiYmZC5jbG9zZU90aGVycyhhKX0pLGEudG9nZ2xlT3Blbj1mdW5jdGlvbigpe2EuaXNEaXNhYmxlZHx8KGEuaXNPcGVuPSFhLmlzT3Blbil9fX19KS5kaXJlY3RpdmUoImFjY29yZGlvbkhlYWRpbmciLGZ1bmN0aW9uKCl7cmV0dXJue3Jlc3RyaWN0OiJFQSIsdHJhbnNjbHVkZTohMCx0ZW1wbGF0ZToiIixyZXBsYWNlOiEwLHJlcXVpcmU6Il5hY2NvcmRpb25Hcm91cCIsbGluazpmdW5jdGlvbihhLGIsYyxkLGUpe2Quc2V0SGVhZGluZyhlKGEsZnVuY3Rpb24oKXt9KSl9fX0pLmRpcmVjdGl2ZSgiYWNjb3JkaW9uVHJhbnNjbHVkZSIsZnVuY3Rpb24oKXtyZXR1cm57cmVxdWlyZToiXmFjY29yZGlvbkdyb3VwIixsaW5rOmZ1bmN0aW9uKGEsYixjLGQpe2EuJHdhdGNoKGZ1bmN0aW9uKCl7cmV0dXJuIGRbYy5hY2NvcmRpb25UcmFuc2NsdWRlXX0sZnVuY3Rpb24oYSl7YSYmKGIuaHRtbCgiIiksYi5hcHBlbmQoYSkpfSl9fX0pLGFuZ3VsYXIubW9kdWxlKCJ1aS5ib290c3RyYXAuYWxlcnQiLFtdKS5jb250cm9sbGVyKCJBbGVydENvbnRyb2xsZXIiLFsiJHNjb3BlIiwiJGF0dHJzIixmdW5jdGlvbihhLGIpe2EuY2xvc2VhYmxlPSJjbG9zZSJpbiBifV0pLmRpcmVjdGl2ZSgiYWxlcnQiLGZ1bmN0aW9uKCl7cmV0dXJue3Jlc3RyaWN0OiJFQSIsY29udHJvbGxlcjoiQWxlcnRDb250cm9sbGVyIix0ZW1wbGF0ZVVybDoidGVtcGxhdGUvYWxlcnQvYWxlcnQuaHRtbCIsdHJhbnNjbHVkZTohMCxyZXBsYWNlOiEwLHNjb3BlOnt0eXBlOiJAIixjbG9zZToiJiJ9fX0pLGFuZ3VsYXIubW9kdWxlKCJ1aS5ib290c3RyYXAuYmluZEh0bWwiLFtdKS5kaXJlY3RpdmUoImJpbmRIdG1sVW5zYWZlIixmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihhLGIsYyl7Yi5hZGRDbGFzcygibmctYmluZGluZyIpLmRhdGEoIiRiaW5kaW5nIixjLmJpbmRIdG1sVW5zYWZlKSxhLiR3YXRjaChjLmJpbmRIdG1sVW5zYWZlLGZ1bmN0aW9uKGEpe2IuaHRtbChhfHwiIil9KX19KSxhbmd1bGFyLm1vZHVsZSgidWkuYm9vdHN0cmFwLmJ1dHRvbnMiLFtdKS5jb25zdGFudCgiYnV0dG9uQ29uZmlnIix7YWN0aXZlQ2xhc3M6ImFjdGl2ZSIsdG9nZ2xlRXZlbnQ6ImNsaWNrIn0pLmNvbnRyb2xsZXIoIkJ1dHRvbnNDb250cm9sbGVyIixbImJ1dHRvbkNvbmZpZyIsZnVuY3Rpb24oYSl7dGhpcy5hY3RpdmVDbGFzcz1hLmFjdGl2ZUNsYXNzfHwiYWN0aXZlIix0aGlzLnRvZ2dsZUV2ZW50PWEudG9nZ2xlRXZlbnR8fCJjbGljayJ9XSkuZGlyZWN0aXZlKCJidG5SYWRpbyIsZnVuY3Rpb24oKXtyZXR1cm57cmVxdWlyZTpbImJ0blJhZGlvIiwibmdNb2RlbCJdLGNvbnRyb2xsZXI6IkJ1dHRvbnNDb250cm9sbGVyIixsaW5rOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWRbMF0sZj1kWzFdO2YuJHJlbmRlcj1mdW5jdGlvbigpe2IudG9nZ2xlQ2xhc3MoZS5hY3RpdmVDbGFzcyxhbmd1bGFyLmVxdWFscyhmLiRtb2RlbFZhbHVlLGEuJGV2YWwoYy5idG5SYWRpbykpKX0sYi5iaW5kKGUudG9nZ2xlRXZlbnQsZnVuY3Rpb24oKXt2YXIgZD1iLmhhc0NsYXNzKGUuYWN0aXZlQ2xhc3MpOyghZHx8YW5ndWxhci5pc0RlZmluZWQoYy51bmNoZWNrYWJsZSkpJiZhLiRhcHBseShmdW5jdGlvbigpe2YuJHNldFZpZXdWYWx1ZShkP251bGw6YS4kZXZhbChjLmJ0blJhZGlvKSksZi4kcmVuZGVyKCl9KX0pfX19KS5kaXJlY3RpdmUoImJ0bkNoZWNrYm94IixmdW5jdGlvbigpe3JldHVybntyZXF1aXJlOlsiYnRuQ2hlY2tib3giLCJuZ01vZGVsIl0sY29udHJvbGxlcjoiQnV0dG9uc0NvbnRyb2xsZXIiLGxpbms6ZnVuY3Rpb24oYSxiLGMsZCl7ZnVuY3Rpb24gZSgpe3JldHVybiBnKGMuYnRuQ2hlY2tib3hUcnVlLCEwKX1mdW5jdGlvbiBmKCl7cmV0dXJuIGcoYy5idG5DaGVja2JveEZhbHNlLCExKX1mdW5jdGlvbiBnKGIsYyl7dmFyIGQ9YS4kZXZhbChiKTtyZXR1cm4gYW5ndWxhci5pc0RlZmluZWQoZCk/ZDpjfXZhciBoPWRbMF0saT1kWzFdO2kuJHJlbmRlcj1mdW5jdGlvbigpe2IudG9nZ2xlQ2xhc3MoaC5hY3RpdmVDbGFzcyxhbmd1bGFyLmVxdWFscyhpLiRtb2RlbFZhbHVlLGUoKSkpfSxiLmJpbmQoaC50b2dnbGVFdmVudCxmdW5jdGlvbigpe2EuJGFwcGx5KGZ1bmN0aW9uKCl7aS4kc2V0Vmlld1ZhbHVlKGIuaGFzQ2xhc3MoaC5hY3RpdmVDbGFzcyk/ZigpOmUoKSksaS4kcmVuZGVyKCl9KX0pfX19KSxhbmd1bGFyLm1vZHVsZSgidWkuYm9vdHN0cmFwLmNhcm91c2VsIixbInVpLmJvb3RzdHJhcC50cmFuc2l0aW9uIl0pLmNvbnRyb2xsZXIoIkNhcm91c2VsQ29udHJvbGxlciIsWyIkc2NvcGUiLCIkdGltZW91dCIsIiR0cmFuc2l0aW9uIixmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZCgpe2UoKTt2YXIgYz0rYS5pbnRlcnZhbDshaXNOYU4oYykmJmM+PTAmJihnPWIoZixjKSl9ZnVuY3Rpb24gZSgpe2cmJihiLmNhbmNlbChnKSxnPW51bGwpfWZ1bmN0aW9uIGYoKXtoPyhhLm5leHQoKSxkKCkpOmEucGF1c2UoKX12YXIgZyxoLGk9dGhpcyxqPWkuc2xpZGVzPWEuc2xpZGVzPVtdLGs9LTE7aS5jdXJyZW50U2xpZGU9bnVsbDt2YXIgbD0hMTtpLnNlbGVjdD1hLnNlbGVjdD1mdW5jdGlvbihlLGYpe2Z1bmN0aW9uIGcoKXtpZighbCl7aWYoaS5jdXJyZW50U2xpZGUmJmFuZ3VsYXIuaXNTdHJpbmcoZikmJiFhLm5vVHJhbnNpdGlvbiYmZS4kZWxlbWVudCl7ZS4kZWxlbWVudC5hZGRDbGFzcyhmKTt7ZS4kZWxlbWVudFswXS5vZmZzZXRXaWR0aH1hbmd1bGFyLmZvckVhY2goaixmdW5jdGlvbihhKXthbmd1bGFyLmV4dGVuZChhLHtkaXJlY3Rpb246IiIsZW50ZXJpbmc6ITEsbGVhdmluZzohMSxhY3RpdmU6ITF9KX0pLGFuZ3VsYXIuZXh0ZW5kKGUse2RpcmVjdGlvbjpmLGFjdGl2ZTohMCxlbnRlcmluZzohMH0pLGFuZ3VsYXIuZXh0ZW5kKGkuY3VycmVudFNsaWRlfHx7fSx7ZGlyZWN0aW9uOmYsbGVhdmluZzohMH0pLGEuJGN1cnJlbnRUcmFuc2l0aW9uPWMoZS4kZWxlbWVudCx7fSksZnVuY3Rpb24oYixjKXthLiRjdXJyZW50VHJhbnNpdGlvbi50aGVuKGZ1bmN0aW9uKCl7aChiLGMpfSxmdW5jdGlvbigpe2goYixjKX0pfShlLGkuY3VycmVudFNsaWRlKX1lbHNlIGgoZSxpLmN1cnJlbnRTbGlkZSk7aS5jdXJyZW50U2xpZGU9ZSxrPW0sZCgpfX1mdW5jdGlvbiBoKGIsYyl7YW5ndWxhci5leHRlbmQoYix7ZGlyZWN0aW9uOiIiLGFjdGl2ZTohMCxsZWF2aW5nOiExLGVudGVyaW5nOiExfSksYW5ndWxhci5leHRlbmQoY3x8e30se2RpcmVjdGlvbjoiIixhY3RpdmU6ITEsbGVhdmluZzohMSxlbnRlcmluZzohMX0pLGEuJGN1cnJlbnRUcmFuc2l0aW9uPW51bGx9dmFyIG09ai5pbmRleE9mKGUpO3ZvaWQgMD09PWYmJihmPW0+az8ibmV4dCI6InByZXYiKSxlJiZlIT09aS5jdXJyZW50U2xpZGUmJihhLiRjdXJyZW50VHJhbnNpdGlvbj8oYS4kY3VycmVudFRyYW5zaXRpb24uY2FuY2VsKCksYihnKSk6ZygpKX0sYS4kb24oIiRkZXN0cm95IixmdW5jdGlvbigpe2w9ITB9KSxpLmluZGV4T2ZTbGlkZT1mdW5jdGlvbihhKXtyZXR1cm4gai5pbmRleE9mKGEpfSxhLm5leHQ9ZnVuY3Rpb24oKXt2YXIgYj0oaysxKSVqLmxlbmd0aDtyZXR1cm4gYS4kY3VycmVudFRyYW5zaXRpb24/dm9pZCAwOmkuc2VsZWN0KGpbYl0sIm5leHQiKX0sYS5wcmV2PWZ1bmN0aW9uKCl7dmFyIGI9MD5rLTE/ai5sZW5ndGgtMTprLTE7cmV0dXJuIGEuJGN1cnJlbnRUcmFuc2l0aW9uP3ZvaWQgMDppLnNlbGVjdChqW2JdLCJwcmV2Iil9LGEuaXNBY3RpdmU9ZnVuY3Rpb24oYSl7cmV0dXJuIGkuY3VycmVudFNsaWRlPT09YX0sYS4kd2F0Y2goImludGVydmFsIixkKSxhLiRvbigiJGRlc3Ryb3kiLGUpLGEucGxheT1mdW5jdGlvbigpe2h8fChoPSEwLGQoKSl9LGEucGF1c2U9ZnVuY3Rpb24oKXthLm5vUGF1c2V8fChoPSExLGUoKSl9LGkuYWRkU2xpZGU9ZnVuY3Rpb24oYixjKXtiLiRlbGVtZW50PWMsai5wdXNoKGIpLDE9PT1qLmxlbmd0aHx8Yi5hY3RpdmU/KGkuc2VsZWN0KGpbai5sZW5ndGgtMV0pLDE9PWoubGVuZ3RoJiZhLnBsYXkoKSk6Yi5hY3RpdmU9ITF9LGkucmVtb3ZlU2xpZGU9ZnVuY3Rpb24oYSl7dmFyIGI9ai5pbmRleE9mKGEpO2ouc3BsaWNlKGIsMSksai5sZW5ndGg+MCYmYS5hY3RpdmU/aS5zZWxlY3QoYj49ai5sZW5ndGg/altiLTFdOmpbYl0pOms+YiYmay0tfX1dKS5kaXJlY3RpdmUoImNhcm91c2VsIixbZnVuY3Rpb24oKXtyZXR1cm57cmVzdHJpY3Q6IkVBIix0cmFuc2NsdWRlOiEwLHJlcGxhY2U6ITAsY29udHJvbGxlcjoiQ2Fyb3VzZWxDb250cm9sbGVyIixyZXF1aXJlOiJjYXJvdXNlbCIsdGVtcGxhdGVVcmw6InRlbXBsYXRlL2Nhcm91c2VsL2Nhcm91c2VsLmh0bWwiLHNjb3BlOntpbnRlcnZhbDoiPSIsbm9UcmFuc2l0aW9uOiI9Iixub1BhdXNlOiI9In19fV0pLmRpcmVjdGl2ZSgic2xpZGUiLGZ1bmN0aW9uKCl7cmV0dXJue3JlcXVpcmU6Il5jYXJvdXNlbCIscmVzdHJpY3Q6IkVBIix0cmFuc2NsdWRlOiEwLHJlcGxhY2U6ITAsdGVtcGxhdGVVcmw6InRlbXBsYXRlL2Nhcm91c2VsL3NsaWRlLmh0bWwiLHNjb3BlOnthY3RpdmU6Ij0/In0sbGluazpmdW5jdGlvbihhLGIsYyxkKXtkLmFkZFNsaWRlKGEsYiksYS4kb24oIiRkZXN0cm95IixmdW5jdGlvbigpe2QucmVtb3ZlU2xpZGUoYSl9KSxhLiR3YXRjaCgiYWN0aXZlIixmdW5jdGlvbihiKXtiJiZkLnNlbGVjdChhKX0pfX19KSxhbmd1bGFyLm1vZHVsZSgidWkuYm9vdHN0cmFwLmRhdGVwYXJzZXIiLFtdKS5zZXJ2aWNlKCJkYXRlUGFyc2VyIixbIiRsb2NhbGUiLCJvcmRlckJ5RmlsdGVyIixmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiLGMpe3JldHVybiAxPT09YiYmYz4yOD8yOT09PWMmJihhJTQ9PT0wJiZhJTEwMCE9PTB8fGElNDAwPT09MCk6Mz09PWJ8fDU9PT1ifHw4PT09Ynx8MTA9PT1iPzMxPmM6ITB9dGhpcy5wYXJzZXJzPXt9O3ZhciBkPXt5eXl5OntyZWdleDoiXFxkezR9IixhcHBseTpmdW5jdGlvbihhKXt0aGlzLnllYXI9K2F9fSx5eTp7cmVnZXg6IlxcZHsyfSIsYXBwbHk6ZnVuY3Rpb24oYSl7dGhpcy55ZWFyPSthKzJlM319LHk6e3JlZ2V4OiJcXGR7MSw0fSIsYXBwbHk6ZnVuY3Rpb24oYSl7dGhpcy55ZWFyPSthfX0sTU1NTTp7cmVnZXg6YS5EQVRFVElNRV9GT1JNQVRTLk1PTlRILmpvaW4oInwiKSxhcHBseTpmdW5jdGlvbihiKXt0aGlzLm1vbnRoPWEuREFURVRJTUVfRk9STUFUUy5NT05USC5pbmRleE9mKGIpfX0sTU1NOntyZWdleDphLkRBVEVUSU1FX0ZPUk1BVFMuU0hPUlRNT05USC5qb2luKCJ8IiksYXBwbHk6ZnVuY3Rpb24oYil7dGhpcy5tb250aD1hLkRBVEVUSU1FX0ZPUk1BVFMuU0hPUlRNT05USC5pbmRleE9mKGIpfX0sTU06e3JlZ2V4OiIwWzEtOV18MVswLTJdIixhcHBseTpmdW5jdGlvbihhKXt0aGlzLm1vbnRoPWEtMX19LE06e3JlZ2V4OiJbMS05XXwxWzAtMl0iLGFwcGx5OmZ1bmN0aW9uKGEpe3RoaXMubW9udGg9YS0xfX0sZGQ6e3JlZ2V4OiJbMC0yXVswLTldezF9fDNbMC0xXXsxfSIsYXBwbHk6ZnVuY3Rpb24oYSl7dGhpcy5kYXRlPSthfX0sZDp7cmVnZXg6IlsxLTJdP1swLTldezF9fDNbMC0xXXsxfSIsYXBwbHk6ZnVuY3Rpb24oYSl7dGhpcy5kYXRlPSthfX0sRUVFRTp7cmVnZXg6YS5EQVRFVElNRV9GT1JNQVRTLkRBWS5qb2luKCJ8Iil9LEVFRTp7cmVnZXg6YS5EQVRFVElNRV9GT1JNQVRTLlNIT1JUREFZLmpvaW4oInwiKX19O3RoaXMuY3JlYXRlUGFyc2VyPWZ1bmN0aW9uKGEpe3ZhciBjPVtdLGU9YS5zcGxpdCgiIik7cmV0dXJuIGFuZ3VsYXIuZm9yRWFjaChkLGZ1bmN0aW9uKGIsZCl7dmFyIGY9YS5pbmRleE9mKGQpO2lmKGY+LTEpe2E9YS5zcGxpdCgiIiksZVtmXT0iKCIrYi5yZWdleCsiKSIsYVtmXT0iJCI7Zm9yKHZhciBnPWYrMSxoPWYrZC5sZW5ndGg7aD5nO2crKyllW2ddPSIiLGFbZ109IiQiO2E9YS5qb2luKCIiKSxjLnB1c2goe2luZGV4OmYsYXBwbHk6Yi5hcHBseX0pfX0pLHtyZWdleDpuZXcgUmVnRXhwKCJeIitlLmpvaW4oIiIpKyIkIiksbWFwOmIoYywiaW5kZXgiKX19LHRoaXMucGFyc2U9ZnVuY3Rpb24oYixkKXtpZighYW5ndWxhci5pc1N0cmluZyhiKSlyZXR1cm4gYjtkPWEuREFURVRJTUVfRk9STUFUU1tkXXx8ZCx0aGlzLnBhcnNlcnNbZF18fCh0aGlzLnBhcnNlcnNbZF09dGhpcy5jcmVhdGVQYXJzZXIoZCkpO3ZhciBlPXRoaXMucGFyc2Vyc1tkXSxmPWUucmVnZXgsZz1lLm1hcCxoPWIubWF0Y2goZik7aWYoaCYmaC5sZW5ndGgpe2Zvcih2YXIgaSxqPXt5ZWFyOjE5MDAsbW9udGg6MCxkYXRlOjEsaG91cnM6MH0saz0xLGw9aC5sZW5ndGg7bD5rO2srKyl7dmFyIG09Z1trLTFdO20uYXBwbHkmJm0uYXBwbHkuY2FsbChqLGhba10pfXJldHVybiBjKGoueWVhcixqLm1vbnRoLGouZGF0ZSkmJihpPW5ldyBEYXRlKGoueWVhcixqLm1vbnRoLGouZGF0ZSxqLmhvdXJzKSksaX19fV0pLGFuZ3VsYXIubW9kdWxlKCJ1aS5ib290c3RyYXAucG9zaXRpb24iLFtdKS5mYWN0b3J5KCIkcG9zaXRpb24iLFsiJGRvY3VtZW50IiwiJHdpbmRvdyIsZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYyl7cmV0dXJuIGEuY3VycmVudFN0eWxlP2EuY3VycmVudFN0eWxlW2NdOmIuZ2V0Q29tcHV0ZWRTdHlsZT9iLmdldENvbXB1dGVkU3R5bGUoYSlbY106YS5zdHlsZVtjXX1mdW5jdGlvbiBkKGEpe3JldHVybiJzdGF0aWMiPT09KGMoYSwicG9zaXRpb24iKXx8InN0YXRpYyIpfXZhciBlPWZ1bmN0aW9uKGIpe2Zvcih2YXIgYz1hWzBdLGU9Yi5vZmZzZXRQYXJlbnR8fGM7ZSYmZSE9PWMmJmQoZSk7KWU9ZS5vZmZzZXRQYXJlbnQ7cmV0dXJuIGV8fGN9O3JldHVybntwb3NpdGlvbjpmdW5jdGlvbihiKXt2YXIgYz10aGlzLm9mZnNldChiKSxkPXt0b3A6MCxsZWZ0OjB9LGY9ZShiWzBdKTtmIT1hWzBdJiYoZD10aGlzLm9mZnNldChhbmd1bGFyLmVsZW1lbnQoZikpLGQudG9wKz1mLmNsaWVudFRvcC1mLnNjcm9sbFRvcCxkLmxlZnQrPWYuY2xpZW50TGVmdC1mLnNjcm9sbExlZnQpO3ZhciBnPWJbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJue3dpZHRoOmcud2lkdGh8fGIucHJvcCgib2Zmc2V0V2lkdGgiKSxoZWlnaHQ6Zy5oZWlnaHR8fGIucHJvcCgib2Zmc2V0SGVpZ2h0IiksdG9wOmMudG9wLWQudG9wLGxlZnQ6Yy5sZWZ0LWQubGVmdH19LG9mZnNldDpmdW5jdGlvbihjKXt2YXIgZD1jWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybnt3aWR0aDpkLndpZHRofHxjLnByb3AoIm9mZnNldFdpZHRoIiksaGVpZ2h0OmQuaGVpZ2h0fHxjLnByb3AoIm9mZnNldEhlaWdodCIpLHRvcDpkLnRvcCsoYi5wYWdlWU9mZnNldHx8YVswXS5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wKSxsZWZ0OmQubGVmdCsoYi5wYWdlWE9mZnNldHx8YVswXS5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCl9fSxwb3NpdGlvbkVsZW1lbnRzOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGYsZyxoLGk9Yy5zcGxpdCgiLSIpLGo9aVswXSxrPWlbMV18fCJjZW50ZXIiO2U9ZD90aGlzLm9mZnNldChhKTp0aGlzLnBvc2l0aW9uKGEpLGY9Yi5wcm9wKCJvZmZzZXRXaWR0aCIpLGc9Yi5wcm9wKCJvZmZzZXRIZWlnaHQiKTt2YXIgbD17Y2VudGVyOmZ1bmN0aW9uKCl7cmV0dXJuIGUubGVmdCtlLndpZHRoLzItZi8yfSxsZWZ0OmZ1bmN0aW9uKCl7cmV0dXJuIGUubGVmdH0scmlnaHQ6ZnVuY3Rpb24oKXtyZXR1cm4gZS5sZWZ0K2Uud2lkdGh9fSxtPXtjZW50ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gZS50b3ArZS5oZWlnaHQvMi1nLzJ9LHRvcDpmdW5jdGlvbigpe3JldHVybiBlLnRvcH0sYm90dG9tOmZ1bmN0aW9uKCl7cmV0dXJuIGUudG9wK2UuaGVpZ2h0fX07c3dpdGNoKGope2Nhc2UicmlnaHQiOmg9e3RvcDptW2tdKCksbGVmdDpsW2pdKCl9O2JyZWFrO2Nhc2UibGVmdCI6aD17dG9wOm1ba10oKSxsZWZ0OmUubGVmdC1mfTticmVhaztjYXNlImJvdHRvbSI6aD17dG9wOm1bal0oKSxsZWZ0Omxba10oKX07YnJlYWs7ZGVmYXVsdDpoPXt0b3A6ZS50b3AtZyxsZWZ0Omxba10oKX19cmV0dXJuIGh9fX1dKSxhbmd1bGFyLm1vZHVsZSgidWkuYm9vdHN0cmFwLmRhdGVwaWNrZXIiLFsidWkuYm9vdHN0cmFwLmRhdGVwYXJzZXIiLCJ1aS5ib290c3RyYXAucG9zaXRpb24iXSkuY29uc3RhbnQoImRhdGVwaWNrZXJDb25maWciLHtmb3JtYXREYXk6ImRkIixmb3JtYXRNb250aDoiTU1NTSIsZm9ybWF0WWVhcjoieXl5eSIsZm9ybWF0RGF5SGVhZGVyOiJFRUUiLGZvcm1hdERheVRpdGxlOiJNTU1NIHl5eXkiLGZvcm1hdE1vbnRoVGl0bGU6Inl5eXkiLGRhdGVwaWNrZXJNb2RlOiJkYXkiLG1pbk1vZGU6ImRheSIsbWF4TW9kZToieWVhciIsc2hvd1dlZWtzOiEwLHN0YXJ0aW5nRGF5OjAseWVhclJhbmdlOjIwLG1pbkRhdGU6bnVsbCxtYXhEYXRlOm51bGx9KS5jb250cm9sbGVyKCJEYXRlcGlja2VyQ29udHJvbGxlciIsWyIkc2NvcGUiLCIkYXR0cnMiLCIkcGFyc2UiLCIkaW50ZXJwb2xhdGUiLCIkdGltZW91dCIsIiRsb2ciLCJkYXRlRmlsdGVyIiwiZGF0ZXBpY2tlckNvbmZpZyIsZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoKXt2YXIgaT10aGlzLGo9eyRzZXRWaWV3VmFsdWU6YW5ndWxhci5ub29wfTt0aGlzLm1vZGVzPVsiZGF5IiwibW9udGgiLCJ5ZWFyIl0sYW5ndWxhci5mb3JFYWNoKFsiZm9ybWF0RGF5IiwiZm9ybWF0TW9udGgiLCJmb3JtYXRZZWFyIiwiZm9ybWF0RGF5SGVhZGVyIiwiZm9ybWF0RGF5VGl0bGUiLCJmb3JtYXRNb250aFRpdGxlIiwibWluTW9kZSIsIm1heE1vZGUiLCJzaG93V2Vla3MiLCJzdGFydGluZ0RheSIsInllYXJSYW5nZSJdLGZ1bmN0aW9uKGMsZSl7aVtjXT1hbmd1bGFyLmlzRGVmaW5lZChiW2NdKT84PmU/ZChiW2NdKShhLiRwYXJlbnQpOmEuJHBhcmVudC4kZXZhbChiW2NdKTpoW2NdfSksYW5ndWxhci5mb3JFYWNoKFsibWluRGF0ZSIsIm1heERhdGUiXSxmdW5jdGlvbihkKXtiW2RdP2EuJHBhcmVudC4kd2F0Y2goYyhiW2RdKSxmdW5jdGlvbihhKXtpW2RdPWE/bmV3IERhdGUoYSk6bnVsbCxpLnJlZnJlc2hWaWV3KCl9KTppW2RdPWhbZF0/bmV3IERhdGUoaFtkXSk6bnVsbH0pLGEuZGF0ZXBpY2tlck1vZGU9YS5kYXRlcGlja2VyTW9kZXx8aC5kYXRlcGlja2VyTW9kZSxhLnVuaXF1ZUlkPSJkYXRlcGlja2VyLSIrYS4kaWQrIi0iK01hdGguZmxvb3IoMWU0Kk1hdGgucmFuZG9tKCkpLHRoaXMuYWN0aXZlRGF0ZT1hbmd1bGFyLmlzRGVmaW5lZChiLmluaXREYXRlKT9hLiRwYXJlbnQuJGV2YWwoYi5pbml0RGF0ZSk6bmV3IERhdGUsYS5pc0FjdGl2ZT1mdW5jdGlvbihiKXtyZXR1cm4gMD09PWkuY29tcGFyZShiLmRhdGUsaS5hY3RpdmVEYXRlKT8oYS5hY3RpdmVEYXRlSWQ9Yi51aWQsITApOiExfSx0aGlzLmluaXQ9ZnVuY3Rpb24oYSl7aj1hLGouJHJlbmRlcj1mdW5jdGlvbigpe2kucmVuZGVyKCl9fSx0aGlzLnJlbmRlcj1mdW5jdGlvbigpe2lmKGouJG1vZGVsVmFsdWUpe3ZhciBhPW5ldyBEYXRlKGouJG1vZGVsVmFsdWUpLGI9IWlzTmFOKGEpO2I/dGhpcy5hY3RpdmVEYXRlPWE6Zi5lcnJvcignRGF0ZXBpY2tlciBkaXJlY3RpdmU6ICJuZy1tb2RlbCIgdmFsdWUgbXVzdCBiZSBhIERhdGUgb2JqZWN0LCBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgMDEuMDEuMTk3MCBvciBhIHN0cmluZyByZXByZXNlbnRpbmcgYW4gUkZDMjgyMiBvciBJU08gODYwMSBkYXRlLicpLGouJHNldFZhbGlkaXR5KCJkYXRlIixiKX10aGlzLnJlZnJlc2hWaWV3KCl9LHRoaXMucmVmcmVzaFZpZXc9ZnVuY3Rpb24oKXtpZih0aGlzLmVsZW1lbnQpe3RoaXMuX3JlZnJlc2hWaWV3KCk7dmFyIGE9ai4kbW9kZWxWYWx1ZT9uZXcgRGF0ZShqLiRtb2RlbFZhbHVlKTpudWxsO2ouJHNldFZhbGlkaXR5KCJkYXRlLWRpc2FibGVkIiwhYXx8dGhpcy5lbGVtZW50JiYhdGhpcy5pc0Rpc2FibGVkKGEpKX19LHRoaXMuY3JlYXRlRGF0ZU9iamVjdD1mdW5jdGlvbihhLGIpe3ZhciBjPWouJG1vZGVsVmFsdWU/bmV3IERhdGUoai4kbW9kZWxWYWx1ZSk6bnVsbDtyZXR1cm57ZGF0ZTphLGxhYmVsOmcoYSxiKSxzZWxlY3RlZDpjJiYwPT09dGhpcy5jb21wYXJlKGEsYyksZGlzYWJsZWQ6dGhpcy5pc0Rpc2FibGVkKGEpLGN1cnJlbnQ6MD09PXRoaXMuY29tcGFyZShhLG5ldyBEYXRlKX19LHRoaXMuaXNEaXNhYmxlZD1mdW5jdGlvbihjKXtyZXR1cm4gdGhpcy5taW5EYXRlJiZ0aGlzLmNvbXBhcmUoYyx0aGlzLm1pbkRhdGUpPDB8fHRoaXMubWF4RGF0ZSYmdGhpcy5jb21wYXJlKGMsdGhpcy5tYXhEYXRlKT4wfHxiLmRhdGVEaXNhYmxlZCYmYS5kYXRlRGlzYWJsZWQoe2RhdGU6Yyxtb2RlOmEuZGF0ZXBpY2tlck1vZGV9KX0sdGhpcy5zcGxpdD1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1bXTthLmxlbmd0aD4wOyljLnB1c2goYS5zcGxpY2UoMCxiKSk7cmV0dXJuIGN9LGEuc2VsZWN0PWZ1bmN0aW9uKGIpe2lmKGEuZGF0ZXBpY2tlck1vZGU9PT1pLm1pbk1vZGUpe3ZhciBjPWouJG1vZGVsVmFsdWU/bmV3IERhdGUoai4kbW9kZWxWYWx1ZSk6bmV3IERhdGUoMCwwLDAsMCwwLDAsMCk7Yy5zZXRGdWxsWWVhcihiLmdldEZ1bGxZZWFyKCksYi5nZXRNb250aCgpLGIuZ2V0RGF0ZSgpKSxqLiRzZXRWaWV3VmFsdWUoYyksai4kcmVuZGVyKCl9ZWxzZSBpLmFjdGl2ZURhdGU9YixhLmRhdGVwaWNrZXJNb2RlPWkubW9kZXNbaS5tb2Rlcy5pbmRleE9mKGEuZGF0ZXBpY2tlck1vZGUpLTFdfSxhLm1vdmU9ZnVuY3Rpb24oYSl7dmFyIGI9aS5hY3RpdmVEYXRlLmdldEZ1bGxZZWFyKCkrYSooaS5zdGVwLnllYXJzfHwwKSxjPWkuYWN0aXZlRGF0ZS5nZXRNb250aCgpK2EqKGkuc3RlcC5tb250aHN8fDApO2kuYWN0aXZlRGF0ZS5zZXRGdWxsWWVhcihiLGMsMSksaS5yZWZyZXNoVmlldygpfSxhLnRvZ2dsZU1vZGU9ZnVuY3Rpb24oYil7Yj1ifHwxLGEuZGF0ZXBpY2tlck1vZGU9PT1pLm1heE1vZGUmJjE9PT1ifHxhLmRhdGVwaWNrZXJNb2RlPT09aS5taW5Nb2RlJiYtMT09PWJ8fChhLmRhdGVwaWNrZXJNb2RlPWkubW9kZXNbaS5tb2Rlcy5pbmRleE9mKGEuZGF0ZXBpY2tlck1vZGUpK2JdKX0sYS5rZXlzPXsxMzoiZW50ZXIiLDMyOiJzcGFjZSIsMzM6InBhZ2V1cCIsMzQ6InBhZ2Vkb3duIiwzNToiZW5kIiwzNjoiaG9tZSIsMzc6ImxlZnQiLDM4OiJ1cCIsMzk6InJpZ2h0Iiw0MDoiZG93biJ9O3ZhciBrPWZ1bmN0aW9uKCl7ZShmdW5jdGlvbigpe2kuZWxlbWVudFswXS5mb2N1cygpfSwwLCExKX07YS4kb24oImRhdGVwaWNrZXIuZm9jdXMiLGspLGEua2V5ZG93bj1mdW5jdGlvbihiKXt2YXIgYz1hLmtleXNbYi53aGljaF07aWYoYyYmIWIuc2hpZnRLZXkmJiFiLmFsdEtleSlpZihiLnByZXZlbnREZWZhdWx0KCksYi5zdG9wUHJvcGFnYXRpb24oKSwiZW50ZXIiPT09Y3x8InNwYWNlIj09PWMpe2lmKGkuaXNEaXNhYmxlZChpLmFjdGl2ZURhdGUpKXJldHVybjthLnNlbGVjdChpLmFjdGl2ZURhdGUpLGsoKX1lbHNlIWIuY3RybEtleXx8InVwIiE9PWMmJiJkb3duIiE9PWM/KGkuaGFuZGxlS2V5RG93bihjLGIpLGkucmVmcmVzaFZpZXcoKSk6KGEudG9nZ2xlTW9kZSgidXAiPT09Yz8xOi0xKSxrKCkpfX1dKS5kaXJlY3RpdmUoImRhdGVwaWNrZXIiLGZ1bmN0aW9uKCl7cmV0dXJue3Jlc3RyaWN0OiJFQSIscmVwbGFjZTohMCx0ZW1wbGF0ZVVybDoidGVtcGxhdGUvZGF0ZXBpY2tlci9kYXRlcGlja2VyLmh0bWwiLHNjb3BlOntkYXRlcGlja2VyTW9kZToiPT8iLGRhdGVEaXNhYmxlZDoiJiJ9LHJlcXVpcmU6WyJkYXRlcGlja2VyIiwiP15uZ01vZGVsIl0sY29udHJvbGxlcjoiRGF0ZXBpY2tlckNvbnRyb2xsZXIiLGxpbms6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9ZFswXSxmPWRbMV07ZiYmZS5pbml0KGYpfX19KS5kaXJlY3RpdmUoImRheXBpY2tlciIsWyJkYXRlRmlsdGVyIixmdW5jdGlvbihhKXtyZXR1cm57cmVzdHJpY3Q6IkVBIixyZXBsYWNlOiEwLHRlbXBsYXRlVXJsOiJ0ZW1wbGF0ZS9kYXRlcGlja2VyL2RheS5odG1sIixyZXF1aXJlOiJeZGF0ZXBpY2tlciIsbGluazpmdW5jdGlvbihiLGMsZCxlKXtmdW5jdGlvbiBmKGEsYil7cmV0dXJuIDEhPT1ifHxhJTQhPT0wfHxhJTEwMD09PTAmJmElNDAwIT09MD9pW2JdOjI5fWZ1bmN0aW9uIGcoYSxiKXt2YXIgYz1uZXcgQXJyYXkoYiksZD1uZXcgRGF0ZShhKSxlPTA7Zm9yKGQuc2V0SG91cnMoMTIpO2I+ZTspY1tlKytdPW5ldyBEYXRlKGQpLGQuc2V0RGF0ZShkLmdldERhdGUoKSsxKTtyZXR1cm4gY31mdW5jdGlvbiBoKGEpe3ZhciBiPW5ldyBEYXRlKGEpO2Iuc2V0RGF0ZShiLmdldERhdGUoKSs0LShiLmdldERheSgpfHw3KSk7dmFyIGM9Yi5nZXRUaW1lKCk7cmV0dXJuIGIuc2V0TW9udGgoMCksYi5zZXREYXRlKDEpLE1hdGguZmxvb3IoTWF0aC5yb3VuZCgoYy1iKS84NjRlNSkvNykrMX1iLnNob3dXZWVrcz1lLnNob3dXZWVrcyxlLnN0ZXA9e21vbnRoczoxfSxlLmVsZW1lbnQ9Yzt2YXIgaT1bMzEsMjgsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdO2UuX3JlZnJlc2hWaWV3PWZ1bmN0aW9uKCl7dmFyIGM9ZS5hY3RpdmVEYXRlLmdldEZ1bGxZZWFyKCksZD1lLmFjdGl2ZURhdGUuZ2V0TW9udGgoKSxmPW5ldyBEYXRlKGMsZCwxKSxpPWUuc3RhcnRpbmdEYXktZi5nZXREYXkoKSxqPWk+MD83LWk6LWksaz1uZXcgRGF0ZShmKTtqPjAmJmsuc2V0RGF0ZSgtaisxKTtmb3IodmFyIGw9ZyhrLDQyKSxtPTA7NDI+bTttKyspbFttXT1hbmd1bGFyLmV4dGVuZChlLmNyZWF0ZURhdGVPYmplY3QobFttXSxlLmZvcm1hdERheSkse3NlY29uZGFyeTpsW21dLmdldE1vbnRoKCkhPT1kLHVpZDpiLnVuaXF1ZUlkKyItIittfSk7Yi5sYWJlbHM9bmV3IEFycmF5KDcpO2Zvcih2YXIgbj0wOzc+bjtuKyspYi5sYWJlbHNbbl09e2FiYnI6YShsW25dLmRhdGUsZS5mb3JtYXREYXlIZWFkZXIpLGZ1bGw6YShsW25dLmRhdGUsIkVFRUUiKX07aWYoYi50aXRsZT1hKGUuYWN0aXZlRGF0ZSxlLmZvcm1hdERheVRpdGxlKSxiLnJvd3M9ZS5zcGxpdChsLDcpLGIuc2hvd1dlZWtzKXtiLndlZWtOdW1iZXJzPVtdO2Zvcih2YXIgbz1oKGIucm93c1swXVswXS5kYXRlKSxwPWIucm93cy5sZW5ndGg7Yi53ZWVrTnVtYmVycy5wdXNoKG8rKyk8cDspO319LGUuY29tcGFyZT1mdW5jdGlvbihhLGIpe3JldHVybiBuZXcgRGF0ZShhLmdldEZ1bGxZZWFyKCksYS5nZXRNb250aCgpLGEuZ2V0RGF0ZSgpKS1uZXcgRGF0ZShiLmdldEZ1bGxZZWFyKCksYi5nZXRNb250aCgpLGIuZ2V0RGF0ZSgpKX0sZS5oYW5kbGVLZXlEb3duPWZ1bmN0aW9uKGEpe3ZhciBiPWUuYWN0aXZlRGF0ZS5nZXREYXRlKCk7aWYoImxlZnQiPT09YSliLT0xO2Vsc2UgaWYoInVwIj09PWEpYi09NztlbHNlIGlmKCJyaWdodCI9PT1hKWIrPTE7ZWxzZSBpZigiZG93biI9PT1hKWIrPTc7ZWxzZSBpZigicGFnZXVwIj09PWF8fCJwYWdlZG93biI9PT1hKXt2YXIgYz1lLmFjdGl2ZURhdGUuZ2V0TW9udGgoKSsoInBhZ2V1cCI9PT1hPy0xOjEpO2UuYWN0aXZlRGF0ZS5zZXRNb250aChjLDEpLGI9TWF0aC5taW4oZihlLmFjdGl2ZURhdGUuZ2V0RnVsbFllYXIoKSxlLmFjdGl2ZURhdGUuZ2V0TW9udGgoKSksYil9ZWxzZSJob21lIj09PWE/Yj0xOiJlbmQiPT09YSYmKGI9ZihlLmFjdGl2ZURhdGUuZ2V0RnVsbFllYXIoKSxlLmFjdGl2ZURhdGUuZ2V0TW9udGgoKSkpO2UuYWN0aXZlRGF0ZS5zZXREYXRlKGIpfSxlLnJlZnJlc2hWaWV3KCl9fX1dKS5kaXJlY3RpdmUoIm1vbnRocGlja2VyIixbImRhdGVGaWx0ZXIiLGZ1bmN0aW9uKGEpe3JldHVybntyZXN0cmljdDoiRUEiLHJlcGxhY2U6ITAsdGVtcGxhdGVVcmw6InRlbXBsYXRlL2RhdGVwaWNrZXIvbW9udGguaHRtbCIscmVxdWlyZToiXmRhdGVwaWNrZXIiLGxpbms6ZnVuY3Rpb24oYixjLGQsZSl7ZS5zdGVwPXt5ZWFyczoxfSxlLmVsZW1lbnQ9YyxlLl9yZWZyZXNoVmlldz1mdW5jdGlvbigpe2Zvcih2YXIgYz1uZXcgQXJyYXkoMTIpLGQ9ZS5hY3RpdmVEYXRlLmdldEZ1bGxZZWFyKCksZj0wOzEyPmY7ZisrKWNbZl09YW5ndWxhci5leHRlbmQoZS5jcmVhdGVEYXRlT2JqZWN0KG5ldyBEYXRlKGQsZiwxKSxlLmZvcm1hdE1vbnRoKSx7dWlkOmIudW5pcXVlSWQrIi0iK2Z9KTtiLnRpdGxlPWEoZS5hY3RpdmVEYXRlLGUuZm9ybWF0TW9udGhUaXRsZSksYi5yb3dzPWUuc3BsaXQoYywzKX0sZS5jb21wYXJlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBEYXRlKGEuZ2V0RnVsbFllYXIoKSxhLmdldE1vbnRoKCkpLW5ldyBEYXRlKGIuZ2V0RnVsbFllYXIoKSxiLmdldE1vbnRoKCkpfSxlLmhhbmRsZUtleURvd249ZnVuY3Rpb24oYSl7dmFyIGI9ZS5hY3RpdmVEYXRlLmdldE1vbnRoKCk7aWYoImxlZnQiPT09YSliLT0xO2Vsc2UgaWYoInVwIj09PWEpYi09MztlbHNlIGlmKCJyaWdodCI9PT1hKWIrPTE7ZWxzZSBpZigiZG93biI9PT1hKWIrPTM7ZWxzZSBpZigicGFnZXVwIj09PWF8fCJwYWdlZG93biI9PT1hKXt2YXIgYz1lLmFjdGl2ZURhdGUuZ2V0RnVsbFllYXIoKSsoInBhZ2V1cCI9PT1hPy0xOjEpO2UuYWN0aXZlRGF0ZS5zZXRGdWxsWWVhcihjKX1lbHNlImhvbWUiPT09YT9iPTA6ImVuZCI9PT1hJiYoYj0xMSk7ZS5hY3RpdmVEYXRlLnNldE1vbnRoKGIpfSxlLnJlZnJlc2hWaWV3KCl9fX1dKS5kaXJlY3RpdmUoInllYXJwaWNrZXIiLFsiZGF0ZUZpbHRlciIsZnVuY3Rpb24oKXtyZXR1cm57cmVzdHJpY3Q6IkVBIixyZXBsYWNlOiEwLHRlbXBsYXRlVXJsOiJ0ZW1wbGF0ZS9kYXRlcGlja2VyL3llYXIuaHRtbCIscmVxdWlyZToiXmRhdGVwaWNrZXIiLGxpbms6ZnVuY3Rpb24oYSxiLGMsZCl7ZnVuY3Rpb24gZShhKXtyZXR1cm4gcGFyc2VJbnQoKGEtMSkvZiwxMCkqZisxfXZhciBmPWQueWVhclJhbmdlO2Quc3RlcD17eWVhcnM6Zn0sZC5lbGVtZW50PWIsZC5fcmVmcmVzaFZpZXc9ZnVuY3Rpb24oKXtmb3IodmFyIGI9bmV3IEFycmF5KGYpLGM9MCxnPWUoZC5hY3RpdmVEYXRlLmdldEZ1bGxZZWFyKCkpO2Y+YztjKyspYltjXT1hbmd1bGFyLmV4dGVuZChkLmNyZWF0ZURhdGVPYmplY3QobmV3IERhdGUoZytjLDAsMSksZC5mb3JtYXRZZWFyKSx7dWlkOmEudW5pcXVlSWQrIi0iK2N9KTthLnRpdGxlPVtiWzBdLmxhYmVsLGJbZi0xXS5sYWJlbF0uam9pbigiIC0gIiksYS5yb3dzPWQuc3BsaXQoYiw1KX0sZC5jb21wYXJlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0RnVsbFllYXIoKS1iLmdldEZ1bGxZZWFyKCl9LGQuaGFuZGxlS2V5RG93bj1mdW5jdGlvbihhKXt2YXIgYj1kLmFjdGl2ZURhdGUuZ2V0RnVsbFllYXIoKTsibGVmdCI9PT1hP2ItPTE6InVwIj09PWE/Yi09NToicmlnaHQiPT09YT9iKz0xOiJkb3duIj09PWE/Yis9NToicGFnZXVwIj09PWF8fCJwYWdlZG93biI9PT1hP2IrPSgicGFnZXVwIj09PWE/LTE6MSkqZC5zdGVwLnllYXJzOiJob21lIj09PWE/Yj1lKGQuYWN0aXZlRGF0ZS5nZXRGdWxsWWVhcigpKToiZW5kIj09PWEmJihiPWUoZC5hY3RpdmVEYXRlLmdldEZ1bGxZZWFyKCkpK2YtMSksZC5hY3RpdmVEYXRlLnNldEZ1bGxZZWFyKGIpfSxkLnJlZnJlc2hWaWV3KCl9fX1dKS5jb25zdGFudCgiZGF0ZXBpY2tlclBvcHVwQ29uZmlnIix7ZGF0ZXBpY2tlclBvcHVwOiJ5eXl5LU1NLWRkIixjdXJyZW50VGV4dDoiVG9kYXkiLGNsZWFyVGV4dDoiQ2xlYXIiLGNsb3NlVGV4dDoiRG9uZSIsY2xvc2VPbkRhdGVTZWxlY3Rpb246ITAsYXBwZW5kVG9Cb2R5OiExLHNob3dCdXR0b25CYXI6ITB9KS5kaXJlY3RpdmUoImRhdGVwaWNrZXJQb3B1cCIsWyIkY29tcGlsZSIsIiRwYXJzZSIsIiRkb2N1bWVudCIsIiRwb3NpdGlvbiIsImRhdGVGaWx0ZXIiLCJkYXRlUGFyc2VyIiwiZGF0ZXBpY2tlclBvcHVwQ29uZmlnIixmdW5jdGlvbihhLGIsYyxkLGUsZixnKXtyZXR1cm57cmVzdHJpY3Q6IkVBIixyZXF1aXJlOiJuZ01vZGVsIixzY29wZTp7aXNPcGVuOiI9PyIsY3VycmVudFRleHQ6IkAiLGNsZWFyVGV4dDoiQCIsY2xvc2VUZXh0OiJAIixkYXRlRGlzYWJsZWQ6IiYifSxsaW5rOmZ1bmN0aW9uKGgsaSxqLGspe2Z1bmN0aW9uIGwoYSl7cmV0dXJuIGEucmVwbGFjZSgvKFtBLVpdKS9nLGZ1bmN0aW9uKGEpe3JldHVybiItIithLnRvTG93ZXJDYXNlKCl9KX1mdW5jdGlvbiBtKGEpe2lmKGEpe2lmKGFuZ3VsYXIuaXNEYXRlKGEpJiYhaXNOYU4oYSkpcmV0dXJuIGsuJHNldFZhbGlkaXR5KCJkYXRlIiwhMCksYTtpZihhbmd1bGFyLmlzU3RyaW5nKGEpKXt2YXIgYj1mLnBhcnNlKGEsbil8fG5ldyBEYXRlKGEpO3JldHVybiBpc05hTihiKT92b2lkIGsuJHNldFZhbGlkaXR5KCJkYXRlIiwhMSk6KGsuJHNldFZhbGlkaXR5KCJkYXRlIiwhMCksYil9cmV0dXJuIHZvaWQgay4kc2V0VmFsaWRpdHkoImRhdGUiLCExKX1yZXR1cm4gay4kc2V0VmFsaWRpdHkoImRhdGUiLCEwKSxudWxsfXZhciBuLG89YW5ndWxhci5pc0RlZmluZWQoai5jbG9zZU9uRGF0ZVNlbGVjdGlvbik/aC4kcGFyZW50LiRldmFsKGouY2xvc2VPbkRhdGVTZWxlY3Rpb24pOmcuY2xvc2VPbkRhdGVTZWxlY3Rpb24scD1hbmd1bGFyLmlzRGVmaW5lZChqLmRhdGVwaWNrZXJBcHBlbmRUb0JvZHkpP2guJHBhcmVudC4kZXZhbChqLmRhdGVwaWNrZXJBcHBlbmRUb0JvZHkpOmcuYXBwZW5kVG9Cb2R5O2guc2hvd0J1dHRvbkJhcj1hbmd1bGFyLmlzRGVmaW5lZChqLnNob3dCdXR0b25CYXIpP2guJHBhcmVudC4kZXZhbChqLnNob3dCdXR0b25CYXIpOmcuc2hvd0J1dHRvbkJhcixoLmdldFRleHQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGhbYSsiVGV4dCJdfHxnW2ErIlRleHQiXX0sai4kb2JzZXJ2ZSgiZGF0ZXBpY2tlclBvcHVwIixmdW5jdGlvbihhKXtuPWF8fGcuZGF0ZXBpY2tlclBvcHVwLGsuJHJlbmRlcigpfSk7dmFyIHE9YW5ndWxhci5lbGVtZW50KCI8ZGl2IGRhdGVwaWNrZXItcG9wdXAtd3JhcD48ZGl2IGRhdGVwaWNrZXI+PC9kaXY+PC9kaXY+Iik7cS5hdHRyKHsibmctbW9kZWwiOiJkYXRlIiwibmctY2hhbmdlIjoiZGF0ZVNlbGVjdGlvbigpIn0pO3ZhciByPWFuZ3VsYXIuZWxlbWVudChxLmNoaWxkcmVuKClbMF0pO2ouZGF0ZXBpY2tlck9wdGlvbnMmJmFuZ3VsYXIuZm9yRWFjaChoLiRwYXJlbnQuJGV2YWwoai5kYXRlcGlja2VyT3B0aW9ucyksZnVuY3Rpb24oYSxiKXtyLmF0dHIobChiKSxhKX0pLGFuZ3VsYXIuZm9yRWFjaChbIm1pbkRhdGUiLCJtYXhEYXRlIl0sZnVuY3Rpb24oYSl7althXSYmKGguJHBhcmVudC4kd2F0Y2goYihqW2FdKSxmdW5jdGlvbihiKXtoW2FdPWJ9KSxyLmF0dHIobChhKSxhKSl9KSxqLmRhdGVEaXNhYmxlZCYmci5hdHRyKCJkYXRlLWRpc2FibGVkIiwiZGF0ZURpc2FibGVkKHsgZGF0ZTogZGF0ZSwgbW9kZTogbW9kZSB9KSIpLGsuJHBhcnNlcnMudW5zaGlmdChtKSxoLmRhdGVTZWxlY3Rpb249ZnVuY3Rpb24oYSl7YW5ndWxhci5pc0RlZmluZWQoYSkmJihoLmRhdGU9YSksay4kc2V0Vmlld1ZhbHVlKGguZGF0ZSksay4kcmVuZGVyKCksbyYmKGguaXNPcGVuPSExLGlbMF0uZm9jdXMoKSl9LGkuYmluZCgiaW5wdXQgY2hhbmdlIGtleXVwIixmdW5jdGlvbigpe2guJGFwcGx5KGZ1bmN0aW9uKCl7aC5kYXRlPWsuJG1vZGVsVmFsdWV9KX0pLGsuJHJlbmRlcj1mdW5jdGlvbigpe3ZhciBhPWsuJHZpZXdWYWx1ZT9lKGsuJHZpZXdWYWx1ZSxuKToiIjtpLnZhbChhKSxoLmRhdGU9bShrLiRtb2RlbFZhbHVlKX07dmFyIHM9ZnVuY3Rpb24oYSl7aC5pc09wZW4mJmEudGFyZ2V0IT09aVswXSYmaC4kYXBwbHkoZnVuY3Rpb24oKXtoLmlzT3Blbj0hMX0pfSx0PWZ1bmN0aW9uKGEpe2gua2V5ZG93bihhKX07aS5iaW5kKCJrZXlkb3duIix0KSxoLmtleWRvd249ZnVuY3Rpb24oYSl7Mjc9PT1hLndoaWNoPyhhLnByZXZlbnREZWZhdWx0KCksYS5zdG9wUHJvcGFnYXRpb24oKSxoLmNsb3NlKCkpOjQwIT09YS53aGljaHx8aC5pc09wZW58fChoLmlzT3Blbj0hMCl9LGguJHdhdGNoKCJpc09wZW4iLGZ1bmN0aW9uKGEpe2E/KGguJGJyb2FkY2FzdCgiZGF0ZXBpY2tlci5mb2N1cyIpLGgucG9zaXRpb249cD9kLm9mZnNldChpKTpkLnBvc2l0aW9uKGkpLGgucG9zaXRpb24udG9wPWgucG9zaXRpb24udG9wK2kucHJvcCgib2Zmc2V0SGVpZ2h0IiksYy5iaW5kKCJjbGljayIscykpOmMudW5iaW5kKCJjbGljayIscyl9KSxoLnNlbGVjdD1mdW5jdGlvbihhKXtpZigidG9kYXkiPT09YSl7dmFyIGI9bmV3IERhdGU7YW5ndWxhci5pc0RhdGUoay4kbW9kZWxWYWx1ZSk/KGE9bmV3IERhdGUoay4kbW9kZWxWYWx1ZSksYS5zZXRGdWxsWWVhcihiLmdldEZ1bGxZZWFyKCksYi5nZXRNb250aCgpLGIuZ2V0RGF0ZSgpKSk6YT1uZXcgRGF0ZShiLnNldEhvdXJzKDAsMCwwLDApKX1oLmRhdGVTZWxlY3Rpb24oYSl9LGguY2xvc2U9ZnVuY3Rpb24oKXtoLmlzT3Blbj0hMSxpWzBdLmZvY3VzKCl9O3ZhciB1PWEocSkoaCk7cD9jLmZpbmQoImJvZHkiKS5hcHBlbmQodSk6aS5hZnRlcih1KSxoLiRvbigiJGRlc3Ryb3kiLGZ1bmN0aW9uKCl7dS5yZW1vdmUoKSxpLnVuYmluZCgia2V5ZG93biIsdCksYy51bmJpbmQoImNsaWNrIixzKX0pfX19XSkuZGlyZWN0aXZlKCJkYXRlcGlja2VyUG9wdXBXcmFwIixmdW5jdGlvbigpe3JldHVybntyZXN0cmljdDoiRUEiLHJlcGxhY2U6ITAsdHJhbnNjbHVkZTohMCx0ZW1wbGF0ZVVybDoidGVtcGxhdGUvZGF0ZXBpY2tlci9wb3B1cC5odG1sIixsaW5rOmZ1bmN0aW9uKGEsYil7Yi5iaW5kKCJjbGljayIsZnVuY3Rpb24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpLGEuc3RvcFByb3BhZ2F0aW9uKCl9KX19fSksYW5ndWxhci5tb2R1bGUoInVpLmJvb3RzdHJhcC5kcm9wZG93biIsW10pLmNvbnN0YW50KCJkcm9wZG93bkNvbmZpZyIse29wZW5DbGFzczoib3BlbiJ9KS5zZXJ2aWNlKCJkcm9wZG93blNlcnZpY2UiLFsiJGRvY3VtZW50IixmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RoaXMub3Blbj1mdW5jdGlvbihlKXtifHwoYS5iaW5kKCJjbGljayIsYyksYS5iaW5kKCJrZXlkb3duIixkKSksYiYmYiE9PWUmJihiLmlzT3Blbj0hMSksYj1lfSx0aGlzLmNsb3NlPWZ1bmN0aW9uKGUpe2I9PT1lJiYoYj1udWxsLGEudW5iaW5kKCJjbGljayIsYyksYS51bmJpbmQoImtleWRvd24iLGQpKX07dmFyIGM9ZnVuY3Rpb24oYSl7YSYmYS5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8Yi4kYXBwbHkoZnVuY3Rpb24oKXtiLmlzT3Blbj0hMX0pfSxkPWZ1bmN0aW9uKGEpezI3PT09YS53aGljaCYmKGIuZm9jdXNUb2dnbGVFbGVtZW50KCksYygpKX19XSkuY29udHJvbGxlcigiRHJvcGRvd25Db250cm9sbGVyIixbIiRzY29wZSIsIiRhdHRycyIsIiRwYXJzZSIsImRyb3Bkb3duQ29uZmlnIiwiZHJvcGRvd25TZXJ2aWNlIiwiJGFuaW1hdGUiLGZ1bmN0aW9uKGEsYixjLGQsZSxmKXt2YXIgZyxoPXRoaXMsaT1hLiRuZXcoKSxqPWQub3BlbkNsYXNzLGs9YW5ndWxhci5ub29wLGw9Yi5vblRvZ2dsZT9jKGIub25Ub2dnbGUpOmFuZ3VsYXIubm9vcDt0aGlzLmluaXQ9ZnVuY3Rpb24oZCl7aC4kZWxlbWVudD1kLGIuaXNPcGVuJiYoZz1jKGIuaXNPcGVuKSxrPWcuYXNzaWduLGEuJHdhdGNoKGcsZnVuY3Rpb24oYSl7aS5pc09wZW49ISFhfSkpfSx0aGlzLnRvZ2dsZT1mdW5jdGlvbihhKXtyZXR1cm4gaS5pc09wZW49YXJndW1lbnRzLmxlbmd0aD8hIWE6IWkuaXNPcGVufSx0aGlzLmlzT3Blbj1mdW5jdGlvbigpe3JldHVybiBpLmlzT3Blbn0saS5mb2N1c1RvZ2dsZUVsZW1lbnQ9ZnVuY3Rpb24oKXtoLnRvZ2dsZUVsZW1lbnQmJmgudG9nZ2xlRWxlbWVudFswXS5mb2N1cygpfSxpLiR3YXRjaCgiaXNPcGVuIixmdW5jdGlvbihiLGMpe2ZbYj8iYWRkQ2xhc3MiOiJyZW1vdmVDbGFzcyJdKGguJGVsZW1lbnQsaiksYj8oaS5mb2N1c1RvZ2dsZUVsZW1lbnQoKSxlLm9wZW4oaSkpOmUuY2xvc2UoaSksayhhLGIpLGFuZ3VsYXIuaXNEZWZpbmVkKGIpJiZiIT09YyYmbChhLHtvcGVuOiEhYn0pfSksYS4kb24oIiRsb2NhdGlvbkNoYW5nZVN1Y2Nlc3MiLGZ1bmN0aW9uKCl7aS5pc09wZW49ITF9KSxhLiRvbigiJGRlc3Ryb3kiLGZ1bmN0aW9uKCl7aS4kZGVzdHJveSgpfSl9XSkuZGlyZWN0aXZlKCJkcm9wZG93biIsZnVuY3Rpb24oKXtyZXR1cm57cmVzdHJpY3Q6IkNBIixjb250cm9sbGVyOiJEcm9wZG93bkNvbnRyb2xsZXIiLGxpbms6ZnVuY3Rpb24oYSxiLGMsZCl7ZC5pbml0KGIpfX19KS5kaXJlY3RpdmUoImRyb3Bkb3duVG9nZ2xlIixmdW5jdGlvbigpe3JldHVybntyZXN0cmljdDoiQ0EiLHJlcXVpcmU6Ij9eZHJvcGRvd24iLGxpbms6ZnVuY3Rpb24oYSxiLGMsZCl7aWYoZCl7ZC50b2dnbGVFbGVtZW50PWI7dmFyIGU9ZnVuY3Rpb24oZSl7ZS5wcmV2ZW50RGVmYXVsdCgpLGIuaGFzQ2xhc3MoImRpc2FibGVkIil8fGMuZGlzYWJsZWR8fGEuJGFwcGx5KGZ1bmN0aW9uKCl7ZC50b2dnbGUoKX0pfTtiLmJpbmQoImNsaWNrIixlKSxiLmF0dHIoeyJhcmlhLWhhc3BvcHVwIjohMCwiYXJpYS1leHBhbmRlZCI6ITF9KSxhLiR3YXRjaChkLmlzT3BlbixmdW5jdGlvbihhKXtiLmF0dHIoImFyaWEtZXhwYW5kZWQiLCEhYSl9KSxhLiRvbigiJGRlc3Ryb3kiLGZ1bmN0aW9uKCl7Yi51bmJpbmQoImNsaWNrIixlKX0pfX19fSksYW5ndWxhci5tb2R1bGUoInVpLmJvb3RzdHJhcC5tb2RhbCIsWyJ1aS5ib290c3RyYXAudHJhbnNpdGlvbiJdKS5mYWN0b3J5KCIkJHN0YWNrZWRNYXAiLGZ1bmN0aW9uKCl7cmV0dXJue2NyZWF0ZU5ldzpmdW5jdGlvbigpe3ZhciBhPVtdO3JldHVybnthZGQ6ZnVuY3Rpb24oYixjKXthLnB1c2goe2tleTpiLHZhbHVlOmN9KX0sZ2V0OmZ1bmN0aW9uKGIpe2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGI9PWFbY10ua2V5KXJldHVybiBhW2NdfSxrZXlzOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXS5rZXkpO3JldHVybiBifSx0b3A6ZnVuY3Rpb24oKXtyZXR1cm4gYVthLmxlbmd0aC0xXX0scmVtb3ZlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYz0tMSxkPTA7ZDxhLmxlbmd0aDtkKyspaWYoYj09YVtkXS5rZXkpe2M9ZDticmVha31yZXR1cm4gYS5zcGxpY2UoYywxKVswXX0scmVtb3ZlVG9wOmZ1bmN0aW9uKCl7cmV0dXJuIGEuc3BsaWNlKGEubGVuZ3RoLTEsMSlbMF19LGxlbmd0aDpmdW5jdGlvbigpe3JldHVybiBhLmxlbmd0aH19fX19KS5kaXJlY3RpdmUoIm1vZGFsQmFja2Ryb3AiLFsiJHRpbWVvdXQiLGZ1bmN0aW9uKGEpe3JldHVybntyZXN0cmljdDoiRUEiLHJlcGxhY2U6ITAsdGVtcGxhdGVVcmw6InRlbXBsYXRlL21vZGFsL2JhY2tkcm9wLmh0bWwiLGxpbms6ZnVuY3Rpb24oYil7Yi5hbmltYXRlPSExLGEoZnVuY3Rpb24oKXtiLmFuaW1hdGU9ITB9KX19fV0pLmRpcmVjdGl2ZSgibW9kYWxXaW5kb3ciLFsiJG1vZGFsU3RhY2siLCIkdGltZW91dCIsZnVuY3Rpb24oYSxiKXtyZXR1cm57cmVzdHJpY3Q6IkVBIixzY29wZTp7aW5kZXg6IkAiLGFuaW1hdGU6Ij0ifSxyZXBsYWNlOiEwLHRyYW5zY2x1ZGU6ITAsdGVtcGxhdGVVcmw6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi50ZW1wbGF0ZVVybHx8InRlbXBsYXRlL21vZGFsL3dpbmRvdy5odG1sIn0sbGluazpmdW5jdGlvbihjLGQsZSl7ZC5hZGRDbGFzcyhlLndpbmRvd0NsYXNzfHwiIiksYy5zaXplPWUuc2l6ZSxiKGZ1bmN0aW9uKCl7Yy5hbmltYXRlPSEwLGRbMF0uZm9jdXMoKX0pLGMuY2xvc2U9ZnVuY3Rpb24oYil7dmFyIGM9YS5nZXRUb3AoKTtjJiZjLnZhbHVlLmJhY2tkcm9wJiYic3RhdGljIiE9Yy52YWx1ZS5iYWNrZHJvcCYmYi50YXJnZXQ9PT1iLmN1cnJlbnRUYXJnZXQmJihiLnByZXZlbnREZWZhdWx0KCksYi5zdG9wUHJvcGFnYXRpb24oKSxhLmRpc21pc3MoYy5rZXksImJhY2tkcm9wIGNsaWNrIikpfX19fV0pLmZhY3RvcnkoIiRtb2RhbFN0YWNrIixbIiR0cmFuc2l0aW9uIiwiJHRpbWVvdXQiLCIkZG9jdW1lbnQiLCIkY29tcGlsZSIsIiRyb290U2NvcGUiLCIkJHN0YWNrZWRNYXAiLGZ1bmN0aW9uKGEsYixjLGQsZSxmKXtmdW5jdGlvbiBnKCl7Zm9yKHZhciBhPS0xLGI9bi5rZXlzKCksYz0wO2M8Yi5sZW5ndGg7YysrKW4uZ2V0KGJbY10pLnZhbHVlLmJhY2tkcm9wJiYoYT1jKTtyZXR1cm4gYX1mdW5jdGlvbiBoKGEpe3ZhciBiPWMuZmluZCgiYm9keSIpLmVxKDApLGQ9bi5nZXQoYSkudmFsdWU7bi5yZW1vdmUoYSksaihkLm1vZGFsRG9tRWwsZC5tb2RhbFNjb3BlLDMwMCxmdW5jdGlvbigpe2QubW9kYWxTY29wZS4kZGVzdHJveSgpLGIudG9nZ2xlQ2xhc3MobSxuLmxlbmd0aCgpPjApLGkoKX0pfWZ1bmN0aW9uIGkoKXtpZihrJiYtMT09ZygpKXt2YXIgYT1sO2ooayxsLDE1MCxmdW5jdGlvbigpe2EuJGRlc3Ryb3koKSxhPW51bGx9KSxrPXZvaWQgMCxsPXZvaWQgMH19ZnVuY3Rpb24gaihjLGQsZSxmKXtmdW5jdGlvbiBnKCl7Zy5kb25lfHwoZy5kb25lPSEwLGMucmVtb3ZlKCksZiYmZigpKX1kLmFuaW1hdGU9ITE7dmFyIGg9YS50cmFuc2l0aW9uRW5kRXZlbnROYW1lO2lmKGgpe3ZhciBpPWIoZyxlKTtjLmJpbmQoaCxmdW5jdGlvbigpe2IuY2FuY2VsKGkpLGcoKSxkLiRhcHBseSgpfSl9ZWxzZSBiKGcsMCl9dmFyIGssbCxtPSJtb2RhbC1vcGVuIixuPWYuY3JlYXRlTmV3KCksbz17fTtyZXR1cm4gZS4kd2F0Y2goZyxmdW5jdGlvbihhKXtsJiYobC5pbmRleD1hKX0pLGMuYmluZCgia2V5ZG93biIsZnVuY3Rpb24oYSl7dmFyIGI7Mjc9PT1hLndoaWNoJiYoYj1uLnRvcCgpLGImJmIudmFsdWUua2V5Ym9hcmQmJihhLnByZXZlbnREZWZhdWx0KCksZS4kYXBwbHkoZnVuY3Rpb24oKXtvLmRpc21pc3MoYi5rZXksImVzY2FwZSBrZXkgcHJlc3MiKX0pKSl9KSxvLm9wZW49ZnVuY3Rpb24oYSxiKXtuLmFkZChhLHtkZWZlcnJlZDpiLmRlZmVycmVkLG1vZGFsU2NvcGU6Yi5zY29wZSxiYWNrZHJvcDpiLmJhY2tkcm9wLGtleWJvYXJkOmIua2V5Ym9hcmR9KTt2YXIgZj1jLmZpbmQoImJvZHkiKS5lcSgwKSxoPWcoKTtoPj0wJiYhayYmKGw9ZS4kbmV3KCEwKSxsLmluZGV4PWgsaz1kKCI8ZGl2IG1vZGFsLWJhY2tkcm9wPjwvZGl2PiIpKGwpLGYuYXBwZW5kKGspKTt2YXIgaT1hbmd1bGFyLmVsZW1lbnQoIjxkaXYgbW9kYWwtd2luZG93PjwvZGl2PiIpO2kuYXR0cih7InRlbXBsYXRlLXVybCI6Yi53aW5kb3dUZW1wbGF0ZVVybCwid2luZG93LWNsYXNzIjpiLndpbmRvd0NsYXNzLHNpemU6Yi5zaXplLGluZGV4Om4ubGVuZ3RoKCktMSxhbmltYXRlOiJhbmltYXRlIn0pLmh0bWwoYi5jb250ZW50KTt2YXIgaj1kKGkpKGIuc2NvcGUpO24udG9wKCkudmFsdWUubW9kYWxEb21FbD1qLGYuYXBwZW5kKGopLGYuYWRkQ2xhc3MobSl9LG8uY2xvc2U9ZnVuY3Rpb24oYSxiKXt2YXIgYz1uLmdldChhKS52YWx1ZTtjJiYoYy5kZWZlcnJlZC5yZXNvbHZlKGIpLGgoYSkpfSxvLmRpc21pc3M9ZnVuY3Rpb24oYSxiKXt2YXIgYz1uLmdldChhKS52YWx1ZTtjJiYoYy5kZWZlcnJlZC5yZWplY3QoYiksaChhKSl9LG8uZGlzbWlzc0FsbD1mdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRUb3AoKTtiOyl0aGlzLmRpc21pc3MoYi5rZXksYSksYj10aGlzLmdldFRvcCgpfSxvLmdldFRvcD1mdW5jdGlvbigpe3JldHVybiBuLnRvcCgpfSxvfV0pLnByb3ZpZGVyKCIkbW9kYWwiLGZ1bmN0aW9uKCl7dmFyIGE9e29wdGlvbnM6e2JhY2tkcm9wOiEwLGtleWJvYXJkOiEwfSwkZ2V0OlsiJGluamVjdG9yIiwiJHJvb3RTY29wZSIsIiRxIiwiJGh0dHAiLCIkdGVtcGxhdGVDYWNoZSIsIiRjb250cm9sbGVyIiwiJG1vZGFsU3RhY2siLGZ1bmN0aW9uKGIsYyxkLGUsZixnLGgpe2Z1bmN0aW9uIGkoYSl7cmV0dXJuIGEudGVtcGxhdGU/ZC53aGVuKGEudGVtcGxhdGUpOmUuZ2V0KGEudGVtcGxhdGVVcmwse2NhY2hlOmZ9KS50aGVuKGZ1bmN0aW9uKGEpe3JldHVybiBhLmRhdGF9KX1mdW5jdGlvbiBqKGEpe3ZhciBjPVtdO3JldHVybiBhbmd1bGFyLmZvckVhY2goYSxmdW5jdGlvbihhKXsoYW5ndWxhci5pc0Z1bmN0aW9uKGEpfHxhbmd1bGFyLmlzQXJyYXkoYSkpJiZjLnB1c2goZC53aGVuKGIuaW52b2tlKGEpKSl9KSxjfXZhciBrPXt9O3JldHVybiBrLm9wZW49ZnVuY3Rpb24oYil7dmFyIGU9ZC5kZWZlcigpLGY9ZC5kZWZlcigpLGs9e3Jlc3VsdDplLnByb21pc2Usb3BlbmVkOmYucHJvbWlzZSxjbG9zZTpmdW5jdGlvbihhKXtoLmNsb3NlKGssYSl9LGRpc21pc3M6ZnVuY3Rpb24oYSl7aC5kaXNtaXNzKGssYSl9fTtpZihiPWFuZ3VsYXIuZXh0ZW5kKHt9LGEub3B0aW9ucyxiKSxiLnJlc29sdmU9Yi5yZXNvbHZlfHx7fSwhYi50ZW1wbGF0ZSYmIWIudGVtcGxhdGVVcmwpdGhyb3cgbmV3IEVycm9yKCJPbmUgb2YgdGVtcGxhdGUgb3IgdGVtcGxhdGVVcmwgb3B0aW9ucyBpcyByZXF1aXJlZC4iKTt2YXIgbD1kLmFsbChbaShiKV0uY29uY2F0KGooYi5yZXNvbHZlKSkpO3JldHVybiBsLnRoZW4oZnVuY3Rpb24oYSl7dmFyIGQ9KGIuc2NvcGV8fGMpLiRuZXcoKTtkLiRjbG9zZT1rLmNsb3NlLGQuJGRpc21pc3M9ay5kaXNtaXNzO3ZhciBmLGk9e30saj0xO2IuY29udHJvbGxlciYmKGkuJHNjb3BlPWQsaS4kbW9kYWxJbnN0YW5jZT1rLGFuZ3VsYXIuZm9yRWFjaChiLnJlc29sdmUsZnVuY3Rpb24oYixjKXtpW2NdPWFbaisrXX0pLGY9ZyhiLmNvbnRyb2xsZXIsaSkpLGgub3BlbihrLHtzY29wZTpkLGRlZmVycmVkOmUsY29udGVudDphWzBdLGJhY2tkcm9wOmIuYmFja2Ryb3Asa2V5Ym9hcmQ6Yi5rZXlib2FyZCx3aW5kb3dDbGFzczpiLndpbmRvd0NsYXNzLHdpbmRvd1RlbXBsYXRlVXJsOmIud2luZG93VGVtcGxhdGVVcmwsc2l6ZTpiLnNpemV9KX0sZnVuY3Rpb24oYSl7ZS5yZWplY3QoYSl9KSxsLnRoZW4oZnVuY3Rpb24oKXtmLnJlc29sdmUoITApfSxmdW5jdGlvbigpe2YucmVqZWN0KCExKX0pLGt9LGt9XX07cmV0dXJuIGF9KSxhbmd1bGFyLm1vZHVsZSgidWkuYm9vdHN0cmFwLnBhZ2luYXRpb24iLFtdKS5jb250cm9sbGVyKCJQYWdpbmF0aW9uQ29udHJvbGxlciIsWyIkc2NvcGUiLCIkYXR0cnMiLCIkcGFyc2UiLGZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLGU9eyRzZXRWaWV3VmFsdWU6YW5ndWxhci5ub29wfSxmPWIubnVtUGFnZXM/YyhiLm51bVBhZ2VzKS5hc3NpZ246YW5ndWxhci5ub29wO3RoaXMuaW5pdD1mdW5jdGlvbihmLGcpe2U9Zix0aGlzLmNvbmZpZz1nLGUuJHJlbmRlcj1mdW5jdGlvbigpe2QucmVuZGVyKCl9LGIuaXRlbXNQZXJQYWdlP2EuJHBhcmVudC4kd2F0Y2goYyhiLml0ZW1zUGVyUGFnZSksZnVuY3Rpb24oYil7ZC5pdGVtc1BlclBhZ2U9cGFyc2VJbnQoYiwxMCksYS50b3RhbFBhZ2VzPWQuY2FsY3VsYXRlVG90YWxQYWdlcygpfSk6dGhpcy5pdGVtc1BlclBhZ2U9Zy5pdGVtc1BlclBhZ2V9LHRoaXMuY2FsY3VsYXRlVG90YWxQYWdlcz1mdW5jdGlvbigpe3ZhciBiPXRoaXMuaXRlbXNQZXJQYWdlPDE/MTpNYXRoLmNlaWwoYS50b3RhbEl0ZW1zL3RoaXMuaXRlbXNQZXJQYWdlKTtyZXR1cm4gTWF0aC5tYXgoYnx8MCwxKX0sdGhpcy5yZW5kZXI9ZnVuY3Rpb24oKXthLnBhZ2U9cGFyc2VJbnQoZS4kdmlld1ZhbHVlLDEwKXx8MX0sYS5zZWxlY3RQYWdlPWZ1bmN0aW9uKGIpe2EucGFnZSE9PWImJmI+MCYmYjw9YS50b3RhbFBhZ2VzJiYoZS4kc2V0Vmlld1ZhbHVlKGIpLGUuJHJlbmRlcigpKX0sYS5nZXRUZXh0PWZ1bmN0aW9uKGIpe3JldHVybiBhW2IrIlRleHQiXXx8ZC5jb25maWdbYisiVGV4dCJdfSxhLm5vUHJldmlvdXM9ZnVuY3Rpb24oKXtyZXR1cm4gMT09PWEucGFnZX0sYS5ub05leHQ9ZnVuY3Rpb24oKXtyZXR1cm4gYS5wYWdlPT09YS50b3RhbFBhZ2VzfSxhLiR3YXRjaCgidG90YWxJdGVtcyIsZnVuY3Rpb24oKXthLnRvdGFsUGFnZXM9ZC5jYWxjdWxhdGVUb3RhbFBhZ2VzKCl9KSxhLiR3YXRjaCgidG90YWxQYWdlcyIsZnVuY3Rpb24oYil7ZihhLiRwYXJlbnQsYiksYS5wYWdlPmI/YS5zZWxlY3RQYWdlKGIpOmUuJHJlbmRlcigpfSl9XSkuY29uc3RhbnQoInBhZ2luYXRpb25Db25maWciLHtpdGVtc1BlclBhZ2U6MTAsYm91bmRhcnlMaW5rczohMSxkaXJlY3Rpb25MaW5rczohMCxmaXJzdFRleHQ6IkZpcnN0IixwcmV2aW91c1RleHQ6IlByZXZpb3VzIixuZXh0VGV4dDoiTmV4dCIsbGFzdFRleHQ6Ikxhc3QiLHJvdGF0ZTohMH0pLmRpcmVjdGl2ZSgicGFnaW5hdGlvbiIsWyIkcGFyc2UiLCJwYWdpbmF0aW9uQ29uZmlnIixmdW5jdGlvbihhLGIpe3JldHVybntyZXN0cmljdDoiRUEiLHNjb3BlOnt0b3RhbEl0ZW1zOiI9IixmaXJzdFRleHQ6IkAiLHByZXZpb3VzVGV4dDoiQCIsbmV4dFRleHQ6IkAiLGxhc3RUZXh0OiJAIn0scmVxdWlyZTpbInBhZ2luYXRpb24iLCI/bmdNb2RlbCJdLGNvbnRyb2xsZXI6IlBhZ2luYXRpb25Db250cm9sbGVyIix0ZW1wbGF0ZVVybDoidGVtcGxhdGUvcGFnaW5hdGlvbi9wYWdpbmF0aW9uLmh0bWwiLHJlcGxhY2U6ITAsbGluazpmdW5jdGlvbihjLGQsZSxmKXtmdW5jdGlvbiBnKGEsYixjKXtyZXR1cm57bnVtYmVyOmEsdGV4dDpiLGFjdGl2ZTpjfX1mdW5jdGlvbiBoKGEsYil7dmFyIGM9W10sZD0xLGU9YixmPWFuZ3VsYXIuaXNEZWZpbmVkKGspJiZiPms7ZiYmKGw/KGQ9TWF0aC5tYXgoYS1NYXRoLmZsb29yKGsvMiksMSksZT1kK2stMSxlPmImJihlPWIsZD1lLWsrMSkpOihkPShNYXRoLmNlaWwoYS9rKS0xKSprKzEsZT1NYXRoLm1pbihkK2stMSxiKSkpO2Zvcih2YXIgaD1kO2U+PWg7aCsrKXt2YXIgaT1nKGgsaCxoPT09YSk7Yy5wdXNoKGkpfWlmKGYmJiFsKXtpZihkPjEpe3ZhciBqPWcoZC0xLCIuLi4iLCExKTtjLnVuc2hpZnQoail9aWYoYj5lKXt2YXIgbT1nKGUrMSwiLi4uIiwhMSk7Yy5wdXNoKG0pfX1yZXR1cm4gY312YXIgaT1mWzBdLGo9ZlsxXTtpZihqKXt2YXIgaz1hbmd1bGFyLmlzRGVmaW5lZChlLm1heFNpemUpP2MuJHBhcmVudC4kZXZhbChlLm1heFNpemUpOmIubWF4U2l6ZSxsPWFuZ3VsYXIuaXNEZWZpbmVkKGUucm90YXRlKT9jLiRwYXJlbnQuJGV2YWwoZS5yb3RhdGUpOmIucm90YXRlO2MuYm91bmRhcnlMaW5rcz1hbmd1bGFyLmlzRGVmaW5lZChlLmJvdW5kYXJ5TGlua3MpP2MuJHBhcmVudC4kZXZhbChlLmJvdW5kYXJ5TGlua3MpOmIuYm91bmRhcnlMaW5rcyxjLmRpcmVjdGlvbkxpbmtzPWFuZ3VsYXIuaXNEZWZpbmVkKGUuZGlyZWN0aW9uTGlua3MpP2MuJHBhcmVudC4kZXZhbChlLmRpcmVjdGlvbkxpbmtzKTpiLmRpcmVjdGlvbkxpbmtzLGkuaW5pdChqLGIpLGUubWF4U2l6ZSYmYy4kcGFyZW50LiR3YXRjaChhKGUubWF4U2l6ZSksZnVuY3Rpb24oYSl7az1wYXJzZUludChhLDEwKSxpLnJlbmRlcigpfSk7dmFyIG09aS5yZW5kZXI7aS5yZW5kZXI9ZnVuY3Rpb24oKXttKCksYy5wYWdlPjAmJmMucGFnZTw9Yy50b3RhbFBhZ2VzJiYoYy5wYWdlcz1oKGMucGFnZSxjLnRvdGFsUGFnZXMpKX19fX19XSkuY29uc3RhbnQoInBhZ2VyQ29uZmlnIix7aXRlbXNQZXJQYWdlOjEwLHByZXZpb3VzVGV4dDoiwqsgUHJldmlvdXMiLG5leHRUZXh0OiJOZXh0IMK7IixhbGlnbjohMH0pLmRpcmVjdGl2ZSgicGFnZXIiLFsicGFnZXJDb25maWciLGZ1bmN0aW9uKGEpe3JldHVybntyZXN0cmljdDoiRUEiLHNjb3BlOnt0b3RhbEl0ZW1zOiI9IixwcmV2aW91c1RleHQ6IkAiLG5leHRUZXh0OiJAIn0scmVxdWlyZTpbInBhZ2VyIiwiP25nTW9kZWwiXSxjb250cm9sbGVyOiJQYWdpbmF0aW9uQ29udHJvbGxlciIsdGVtcGxhdGVVcmw6InRlbXBsYXRlL3BhZ2luYXRpb24vcGFnZXIuaHRtbCIscmVwbGFjZTohMCxsaW5rOmZ1bmN0aW9uKGIsYyxkLGUpe3ZhciBmPWVbMF0sZz1lWzFdO2cmJihiLmFsaWduPWFuZ3VsYXIuaXNEZWZpbmVkKGQuYWxpZ24pP2IuJHBhcmVudC4kZXZhbChkLmFsaWduKTphLmFsaWduLGYuaW5pdChnLGEpKX19fV0pLGFuZ3VsYXIubW9kdWxlKCJ1aS5ib290c3RyYXAudG9vbHRpcCIsWyJ1aS5ib290c3RyYXAucG9zaXRpb24iLCJ1aS5ib290c3RyYXAuYmluZEh0bWwiXSkucHJvdmlkZXIoIiR0b29sdGlwIixmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7dmFyIGI9L1tBLVpdL2csYz0iLSI7CityZXR1cm4gYS5yZXBsYWNlKGIsZnVuY3Rpb24oYSxiKXtyZXR1cm4oYj9jOiIiKSthLnRvTG93ZXJDYXNlKCl9KX12YXIgYj17cGxhY2VtZW50OiJ0b3AiLGFuaW1hdGlvbjohMCxwb3B1cERlbGF5OjB9LGM9e21vdXNlZW50ZXI6Im1vdXNlbGVhdmUiLGNsaWNrOiJjbGljayIsZm9jdXM6ImJsdXIifSxkPXt9O3RoaXMub3B0aW9ucz1mdW5jdGlvbihhKXthbmd1bGFyLmV4dGVuZChkLGEpfSx0aGlzLnNldFRyaWdnZXJzPWZ1bmN0aW9uKGEpe2FuZ3VsYXIuZXh0ZW5kKGMsYSl9LHRoaXMuJGdldD1bIiR3aW5kb3ciLCIkY29tcGlsZSIsIiR0aW1lb3V0IiwiJHBhcnNlIiwiJGRvY3VtZW50IiwiJHBvc2l0aW9uIiwiJGludGVycG9sYXRlIixmdW5jdGlvbihlLGYsZyxoLGksaixrKXtyZXR1cm4gZnVuY3Rpb24oZSxsLG0pe2Z1bmN0aW9uIG4oYSl7dmFyIGI9YXx8by50cmlnZ2VyfHxtLGQ9Y1tiXXx8YjtyZXR1cm57c2hvdzpiLGhpZGU6ZH19dmFyIG89YW5ndWxhci5leHRlbmQoe30sYixkKSxwPWEoZSkscT1rLnN0YXJ0U3ltYm9sKCkscj1rLmVuZFN5bWJvbCgpLHM9IjxkaXYgIitwKyctcG9wdXAgdGl0bGU9IicrcSsidHRfdGl0bGUiK3IrJyIgY29udGVudD0iJytxKyJ0dF9jb250ZW50IityKyciIHBsYWNlbWVudD0iJytxKyJ0dF9wbGFjZW1lbnQiK3IrJyIgYW5pbWF0aW9uPSJ0dF9hbmltYXRpb24iIGlzLW9wZW49InR0X2lzT3BlbiI+PC9kaXY+JztyZXR1cm57cmVzdHJpY3Q6IkVBIixzY29wZTohMCxjb21waWxlOmZ1bmN0aW9uKCl7dmFyIGE9ZihzKTtyZXR1cm4gZnVuY3Rpb24oYixjLGQpe2Z1bmN0aW9uIGYoKXtiLnR0X2lzT3Blbj9tKCk6aygpfWZ1bmN0aW9uIGsoKXsoIXl8fGIuJGV2YWwoZFtsKyJFbmFibGUiXSkpJiYoYi50dF9wb3B1cERlbGF5P3Z8fCh2PWcocCxiLnR0X3BvcHVwRGVsYXksITEpLHYudGhlbihmdW5jdGlvbihhKXthKCl9KSk6cCgpKCkpfWZ1bmN0aW9uIG0oKXtiLiRhcHBseShmdW5jdGlvbigpe3EoKX0pfWZ1bmN0aW9uIHAoKXtyZXR1cm4gdj1udWxsLHUmJihnLmNhbmNlbCh1KSx1PW51bGwpLGIudHRfY29udGVudD8ocigpLHQuY3NzKHt0b3A6MCxsZWZ0OjAsZGlzcGxheToiYmxvY2sifSksdz9pLmZpbmQoImJvZHkiKS5hcHBlbmQodCk6Yy5hZnRlcih0KSx6KCksYi50dF9pc09wZW49ITAsYi4kZGlnZXN0KCkseik6YW5ndWxhci5ub29wfWZ1bmN0aW9uIHEoKXtiLnR0X2lzT3Blbj0hMSxnLmNhbmNlbCh2KSx2PW51bGwsYi50dF9hbmltYXRpb24/dXx8KHU9ZyhzLDUwMCkpOnMoKX1mdW5jdGlvbiByKCl7dCYmcygpLHQ9YShiLGZ1bmN0aW9uKCl7fSksYi4kZGlnZXN0KCl9ZnVuY3Rpb24gcygpe3U9bnVsbCx0JiYodC5yZW1vdmUoKSx0PW51bGwpfXZhciB0LHUsdix3PWFuZ3VsYXIuaXNEZWZpbmVkKG8uYXBwZW5kVG9Cb2R5KT9vLmFwcGVuZFRvQm9keTohMSx4PW4odm9pZCAwKSx5PWFuZ3VsYXIuaXNEZWZpbmVkKGRbbCsiRW5hYmxlIl0pLHo9ZnVuY3Rpb24oKXt2YXIgYT1qLnBvc2l0aW9uRWxlbWVudHMoYyx0LGIudHRfcGxhY2VtZW50LHcpO2EudG9wKz0icHgiLGEubGVmdCs9InB4Iix0LmNzcyhhKX07Yi50dF9pc09wZW49ITEsZC4kb2JzZXJ2ZShlLGZ1bmN0aW9uKGEpe2IudHRfY29udGVudD1hLCFhJiZiLnR0X2lzT3BlbiYmcSgpfSksZC4kb2JzZXJ2ZShsKyJUaXRsZSIsZnVuY3Rpb24oYSl7Yi50dF90aXRsZT1hfSksZC4kb2JzZXJ2ZShsKyJQbGFjZW1lbnQiLGZ1bmN0aW9uKGEpe2IudHRfcGxhY2VtZW50PWFuZ3VsYXIuaXNEZWZpbmVkKGEpP2E6by5wbGFjZW1lbnR9KSxkLiRvYnNlcnZlKGwrIlBvcHVwRGVsYXkiLGZ1bmN0aW9uKGEpe3ZhciBjPXBhcnNlSW50KGEsMTApO2IudHRfcG9wdXBEZWxheT1pc05hTihjKT9vLnBvcHVwRGVsYXk6Y30pO3ZhciBBPWZ1bmN0aW9uKCl7Yy51bmJpbmQoeC5zaG93LGspLGMudW5iaW5kKHguaGlkZSxtKX07ZC4kb2JzZXJ2ZShsKyJUcmlnZ2VyIixmdW5jdGlvbihhKXtBKCkseD1uKGEpLHguc2hvdz09PXguaGlkZT9jLmJpbmQoeC5zaG93LGYpOihjLmJpbmQoeC5zaG93LGspLGMuYmluZCh4LmhpZGUsbSkpfSk7dmFyIEI9Yi4kZXZhbChkW2wrIkFuaW1hdGlvbiJdKTtiLnR0X2FuaW1hdGlvbj1hbmd1bGFyLmlzRGVmaW5lZChCKT8hIUI6by5hbmltYXRpb24sZC4kb2JzZXJ2ZShsKyJBcHBlbmRUb0JvZHkiLGZ1bmN0aW9uKGEpe3c9YW5ndWxhci5pc0RlZmluZWQoYSk/aChhKShiKTp3fSksdyYmYi4kb24oIiRsb2NhdGlvbkNoYW5nZVN1Y2Nlc3MiLGZ1bmN0aW9uKCl7Yi50dF9pc09wZW4mJnEoKX0pLGIuJG9uKCIkZGVzdHJveSIsZnVuY3Rpb24oKXtnLmNhbmNlbCh1KSxnLmNhbmNlbCh2KSxBKCkscygpfSl9fX19fV19KS5kaXJlY3RpdmUoInRvb2x0aXBQb3B1cCIsZnVuY3Rpb24oKXtyZXR1cm57cmVzdHJpY3Q6IkVBIixyZXBsYWNlOiEwLHNjb3BlOntjb250ZW50OiJAIixwbGFjZW1lbnQ6IkAiLGFuaW1hdGlvbjoiJiIsaXNPcGVuOiImIn0sdGVtcGxhdGVVcmw6InRlbXBsYXRlL3Rvb2x0aXAvdG9vbHRpcC1wb3B1cC5odG1sIn19KS5kaXJlY3RpdmUoInRvb2x0aXAiLFsiJHRvb2x0aXAiLGZ1bmN0aW9uKGEpe3JldHVybiBhKCJ0b29sdGlwIiwidG9vbHRpcCIsIm1vdXNlZW50ZXIiKX1dKS5kaXJlY3RpdmUoInRvb2x0aXBIdG1sVW5zYWZlUG9wdXAiLGZ1bmN0aW9uKCl7cmV0dXJue3Jlc3RyaWN0OiJFQSIscmVwbGFjZTohMCxzY29wZTp7Y29udGVudDoiQCIscGxhY2VtZW50OiJAIixhbmltYXRpb246IiYiLGlzT3BlbjoiJiJ9LHRlbXBsYXRlVXJsOiJ0ZW1wbGF0ZS90b29sdGlwL3Rvb2x0aXAtaHRtbC11bnNhZmUtcG9wdXAuaHRtbCJ9fSkuZGlyZWN0aXZlKCJ0b29sdGlwSHRtbFVuc2FmZSIsWyIkdG9vbHRpcCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEoInRvb2x0aXBIdG1sVW5zYWZlIiwidG9vbHRpcCIsIm1vdXNlZW50ZXIiKX1dKSxhbmd1bGFyLm1vZHVsZSgidWkuYm9vdHN0cmFwLnBvcG92ZXIiLFsidWkuYm9vdHN0cmFwLnRvb2x0aXAiXSkuZGlyZWN0aXZlKCJwb3BvdmVyUG9wdXAiLGZ1bmN0aW9uKCl7cmV0dXJue3Jlc3RyaWN0OiJFQSIscmVwbGFjZTohMCxzY29wZTp7dGl0bGU6IkAiLGNvbnRlbnQ6IkAiLHBsYWNlbWVudDoiQCIsYW5pbWF0aW9uOiImIixpc09wZW46IiYifSx0ZW1wbGF0ZVVybDoidGVtcGxhdGUvcG9wb3Zlci9wb3BvdmVyLmh0bWwifX0pLmRpcmVjdGl2ZSgicG9wb3ZlciIsWyIkdG9vbHRpcCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEoInBvcG92ZXIiLCJwb3BvdmVyIiwiY2xpY2siKX1dKSxhbmd1bGFyLm1vZHVsZSgidWkuYm9vdHN0cmFwLnByb2dyZXNzYmFyIixbXSkuY29uc3RhbnQoInByb2dyZXNzQ29uZmlnIix7YW5pbWF0ZTohMCxtYXg6MTAwfSkuY29udHJvbGxlcigiUHJvZ3Jlc3NDb250cm9sbGVyIixbIiRzY29wZSIsIiRhdHRycyIsInByb2dyZXNzQ29uZmlnIixmdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcyxlPWFuZ3VsYXIuaXNEZWZpbmVkKGIuYW5pbWF0ZSk/YS4kcGFyZW50LiRldmFsKGIuYW5pbWF0ZSk6Yy5hbmltYXRlO3RoaXMuYmFycz1bXSxhLm1heD1hbmd1bGFyLmlzRGVmaW5lZChiLm1heCk/YS4kcGFyZW50LiRldmFsKGIubWF4KTpjLm1heCx0aGlzLmFkZEJhcj1mdW5jdGlvbihiLGMpe2V8fGMuY3NzKHt0cmFuc2l0aW9uOiJub25lIn0pLHRoaXMuYmFycy5wdXNoKGIpLGIuJHdhdGNoKCJ2YWx1ZSIsZnVuY3Rpb24oYyl7Yi5wZXJjZW50PSsoMTAwKmMvYS5tYXgpLnRvRml4ZWQoMil9KSxiLiRvbigiJGRlc3Ryb3kiLGZ1bmN0aW9uKCl7Yz1udWxsLGQucmVtb3ZlQmFyKGIpfSl9LHRoaXMucmVtb3ZlQmFyPWZ1bmN0aW9uKGEpe3RoaXMuYmFycy5zcGxpY2UodGhpcy5iYXJzLmluZGV4T2YoYSksMSl9fV0pLmRpcmVjdGl2ZSgicHJvZ3Jlc3MiLGZ1bmN0aW9uKCl7cmV0dXJue3Jlc3RyaWN0OiJFQSIscmVwbGFjZTohMCx0cmFuc2NsdWRlOiEwLGNvbnRyb2xsZXI6IlByb2dyZXNzQ29udHJvbGxlciIscmVxdWlyZToicHJvZ3Jlc3MiLHNjb3BlOnt9LHRlbXBsYXRlVXJsOiJ0ZW1wbGF0ZS9wcm9ncmVzc2Jhci9wcm9ncmVzcy5odG1sIn19KS5kaXJlY3RpdmUoImJhciIsZnVuY3Rpb24oKXtyZXR1cm57cmVzdHJpY3Q6IkVBIixyZXBsYWNlOiEwLHRyYW5zY2x1ZGU6ITAscmVxdWlyZToiXnByb2dyZXNzIixzY29wZTp7dmFsdWU6Ij0iLHR5cGU6IkAifSx0ZW1wbGF0ZVVybDoidGVtcGxhdGUvcHJvZ3Jlc3NiYXIvYmFyLmh0bWwiLGxpbms6ZnVuY3Rpb24oYSxiLGMsZCl7ZC5hZGRCYXIoYSxiKX19fSkuZGlyZWN0aXZlKCJwcm9ncmVzc2JhciIsZnVuY3Rpb24oKXtyZXR1cm57cmVzdHJpY3Q6IkVBIixyZXBsYWNlOiEwLHRyYW5zY2x1ZGU6ITAsY29udHJvbGxlcjoiUHJvZ3Jlc3NDb250cm9sbGVyIixzY29wZTp7dmFsdWU6Ij0iLHR5cGU6IkAifSx0ZW1wbGF0ZVVybDoidGVtcGxhdGUvcHJvZ3Jlc3NiYXIvcHJvZ3Jlc3NiYXIuaHRtbCIsbGluazpmdW5jdGlvbihhLGIsYyxkKXtkLmFkZEJhcihhLGFuZ3VsYXIuZWxlbWVudChiLmNoaWxkcmVuKClbMF0pKX19fSksYW5ndWxhci5tb2R1bGUoInVpLmJvb3RzdHJhcC5yYXRpbmciLFtdKS5jb25zdGFudCgicmF0aW5nQ29uZmlnIix7bWF4OjUsc3RhdGVPbjpudWxsLHN0YXRlT2ZmOm51bGx9KS5jb250cm9sbGVyKCJSYXRpbmdDb250cm9sbGVyIixbIiRzY29wZSIsIiRhdHRycyIsInJhdGluZ0NvbmZpZyIsZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXskc2V0Vmlld1ZhbHVlOmFuZ3VsYXIubm9vcH07dGhpcy5pbml0PWZ1bmN0aW9uKGUpe2Q9ZSxkLiRyZW5kZXI9dGhpcy5yZW5kZXIsdGhpcy5zdGF0ZU9uPWFuZ3VsYXIuaXNEZWZpbmVkKGIuc3RhdGVPbik/YS4kcGFyZW50LiRldmFsKGIuc3RhdGVPbik6Yy5zdGF0ZU9uLHRoaXMuc3RhdGVPZmY9YW5ndWxhci5pc0RlZmluZWQoYi5zdGF0ZU9mZik/YS4kcGFyZW50LiRldmFsKGIuc3RhdGVPZmYpOmMuc3RhdGVPZmY7dmFyIGY9YW5ndWxhci5pc0RlZmluZWQoYi5yYXRpbmdTdGF0ZXMpP2EuJHBhcmVudC4kZXZhbChiLnJhdGluZ1N0YXRlcyk6bmV3IEFycmF5KGFuZ3VsYXIuaXNEZWZpbmVkKGIubWF4KT9hLiRwYXJlbnQuJGV2YWwoYi5tYXgpOmMubWF4KTthLnJhbmdlPXRoaXMuYnVpbGRUZW1wbGF0ZU9iamVjdHMoZil9LHRoaXMuYnVpbGRUZW1wbGF0ZU9iamVjdHM9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTAsYz1hLmxlbmd0aDtjPmI7YisrKWFbYl09YW5ndWxhci5leHRlbmQoe2luZGV4OmJ9LHtzdGF0ZU9uOnRoaXMuc3RhdGVPbixzdGF0ZU9mZjp0aGlzLnN0YXRlT2ZmfSxhW2JdKTtyZXR1cm4gYX0sYS5yYXRlPWZ1bmN0aW9uKGIpeyFhLnJlYWRvbmx5JiZiPj0wJiZiPD1hLnJhbmdlLmxlbmd0aCYmKGQuJHNldFZpZXdWYWx1ZShiKSxkLiRyZW5kZXIoKSl9LGEuZW50ZXI9ZnVuY3Rpb24oYil7YS5yZWFkb25seXx8KGEudmFsdWU9YiksYS5vbkhvdmVyKHt2YWx1ZTpifSl9LGEucmVzZXQ9ZnVuY3Rpb24oKXthLnZhbHVlPWQuJHZpZXdWYWx1ZSxhLm9uTGVhdmUoKX0sYS5vbktleWRvd249ZnVuY3Rpb24oYil7LygzN3wzOHwzOXw0MCkvLnRlc3QoYi53aGljaCkmJihiLnByZXZlbnREZWZhdWx0KCksYi5zdG9wUHJvcGFnYXRpb24oKSxhLnJhdGUoYS52YWx1ZSsoMzg9PT1iLndoaWNofHwzOT09PWIud2hpY2g/MTotMSkpKX0sdGhpcy5yZW5kZXI9ZnVuY3Rpb24oKXthLnZhbHVlPWQuJHZpZXdWYWx1ZX19XSkuZGlyZWN0aXZlKCJyYXRpbmciLGZ1bmN0aW9uKCl7cmV0dXJue3Jlc3RyaWN0OiJFQSIscmVxdWlyZTpbInJhdGluZyIsIm5nTW9kZWwiXSxzY29wZTp7cmVhZG9ubHk6Ij0/IixvbkhvdmVyOiImIixvbkxlYXZlOiImIn0sY29udHJvbGxlcjoiUmF0aW5nQ29udHJvbGxlciIsdGVtcGxhdGVVcmw6InRlbXBsYXRlL3JhdGluZy9yYXRpbmcuaHRtbCIscmVwbGFjZTohMCxsaW5rOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWRbMF0sZj1kWzFdO2YmJmUuaW5pdChmKX19fSksYW5ndWxhci5tb2R1bGUoInVpLmJvb3RzdHJhcC50YWJzIixbXSkuY29udHJvbGxlcigiVGFic2V0Q29udHJvbGxlciIsWyIkc2NvcGUiLGZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYz1iLnRhYnM9YS50YWJzPVtdO2Iuc2VsZWN0PWZ1bmN0aW9uKGEpe2FuZ3VsYXIuZm9yRWFjaChjLGZ1bmN0aW9uKGIpe2IuYWN0aXZlJiZiIT09YSYmKGIuYWN0aXZlPSExLGIub25EZXNlbGVjdCgpKX0pLGEuYWN0aXZlPSEwLGEub25TZWxlY3QoKX0sYi5hZGRUYWI9ZnVuY3Rpb24oYSl7Yy5wdXNoKGEpLDE9PT1jLmxlbmd0aD9hLmFjdGl2ZT0hMDphLmFjdGl2ZSYmYi5zZWxlY3QoYSl9LGIucmVtb3ZlVGFiPWZ1bmN0aW9uKGEpe3ZhciBkPWMuaW5kZXhPZihhKTtpZihhLmFjdGl2ZSYmYy5sZW5ndGg+MSl7dmFyIGU9ZD09Yy5sZW5ndGgtMT9kLTE6ZCsxO2Iuc2VsZWN0KGNbZV0pfWMuc3BsaWNlKGQsMSl9fV0pLmRpcmVjdGl2ZSgidGFic2V0IixmdW5jdGlvbigpe3JldHVybntyZXN0cmljdDoiRUEiLHRyYW5zY2x1ZGU6ITAscmVwbGFjZTohMCxzY29wZTp7dHlwZToiQCJ9LGNvbnRyb2xsZXI6IlRhYnNldENvbnRyb2xsZXIiLHRlbXBsYXRlVXJsOiJ0ZW1wbGF0ZS90YWJzL3RhYnNldC5odG1sIixsaW5rOmZ1bmN0aW9uKGEsYixjKXthLnZlcnRpY2FsPWFuZ3VsYXIuaXNEZWZpbmVkKGMudmVydGljYWwpP2EuJHBhcmVudC4kZXZhbChjLnZlcnRpY2FsKTohMSxhLmp1c3RpZmllZD1hbmd1bGFyLmlzRGVmaW5lZChjLmp1c3RpZmllZCk/YS4kcGFyZW50LiRldmFsKGMuanVzdGlmaWVkKTohMX19fSkuZGlyZWN0aXZlKCJ0YWIiLFsiJHBhcnNlIixmdW5jdGlvbihhKXtyZXR1cm57cmVxdWlyZToiXnRhYnNldCIscmVzdHJpY3Q6IkVBIixyZXBsYWNlOiEwLHRlbXBsYXRlVXJsOiJ0ZW1wbGF0ZS90YWJzL3RhYi5odG1sIix0cmFuc2NsdWRlOiEwLHNjb3BlOnthY3RpdmU6Ij0/IixoZWFkaW5nOiJAIixvblNlbGVjdDoiJnNlbGVjdCIsb25EZXNlbGVjdDoiJmRlc2VsZWN0In0sY29udHJvbGxlcjpmdW5jdGlvbigpe30sY29tcGlsZTpmdW5jdGlvbihiLGMsZCl7cmV0dXJuIGZ1bmN0aW9uKGIsYyxlLGYpe2IuJHdhdGNoKCJhY3RpdmUiLGZ1bmN0aW9uKGEpe2EmJmYuc2VsZWN0KGIpfSksYi5kaXNhYmxlZD0hMSxlLmRpc2FibGVkJiZiLiRwYXJlbnQuJHdhdGNoKGEoZS5kaXNhYmxlZCksZnVuY3Rpb24oYSl7Yi5kaXNhYmxlZD0hIWF9KSxiLnNlbGVjdD1mdW5jdGlvbigpe2IuZGlzYWJsZWR8fChiLmFjdGl2ZT0hMCl9LGYuYWRkVGFiKGIpLGIuJG9uKCIkZGVzdHJveSIsZnVuY3Rpb24oKXtmLnJlbW92ZVRhYihiKX0pLGIuJHRyYW5zY2x1ZGVGbj1kfX19fV0pLmRpcmVjdGl2ZSgidGFiSGVhZGluZ1RyYW5zY2x1ZGUiLFtmdW5jdGlvbigpe3JldHVybntyZXN0cmljdDoiQSIscmVxdWlyZToiXnRhYiIsbGluazpmdW5jdGlvbihhLGIpe2EuJHdhdGNoKCJoZWFkaW5nRWxlbWVudCIsZnVuY3Rpb24oYSl7YSYmKGIuaHRtbCgiIiksYi5hcHBlbmQoYSkpfSl9fX1dKS5kaXJlY3RpdmUoInRhYkNvbnRlbnRUcmFuc2NsdWRlIixmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuIGEudGFnTmFtZSYmKGEuaGFzQXR0cmlidXRlKCJ0YWItaGVhZGluZyIpfHxhLmhhc0F0dHJpYnV0ZSgiZGF0YS10YWItaGVhZGluZyIpfHwidGFiLWhlYWRpbmciPT09YS50YWdOYW1lLnRvTG93ZXJDYXNlKCl8fCJkYXRhLXRhYi1oZWFkaW5nIj09PWEudGFnTmFtZS50b0xvd2VyQ2FzZSgpKX1yZXR1cm57cmVzdHJpY3Q6IkEiLHJlcXVpcmU6Il50YWJzZXQiLGxpbms6ZnVuY3Rpb24oYixjLGQpe3ZhciBlPWIuJGV2YWwoZC50YWJDb250ZW50VHJhbnNjbHVkZSk7ZS4kdHJhbnNjbHVkZUZuKGUuJHBhcmVudCxmdW5jdGlvbihiKXthbmd1bGFyLmZvckVhY2goYixmdW5jdGlvbihiKXthKGIpP2UuaGVhZGluZ0VsZW1lbnQ9YjpjLmFwcGVuZChiKX0pfSl9fX0pLGFuZ3VsYXIubW9kdWxlKCJ1aS5ib290c3RyYXAudGltZXBpY2tlciIsW10pLmNvbnN0YW50KCJ0aW1lcGlja2VyQ29uZmlnIix7aG91clN0ZXA6MSxtaW51dGVTdGVwOjEsc2hvd01lcmlkaWFuOiEwLG1lcmlkaWFuczpudWxsLHJlYWRvbmx5SW5wdXQ6ITEsbW91c2V3aGVlbDohMH0pLmNvbnRyb2xsZXIoIlRpbWVwaWNrZXJDb250cm9sbGVyIixbIiRzY29wZSIsIiRhdHRycyIsIiRwYXJzZSIsIiRsb2ciLCIkbG9jYWxlIiwidGltZXBpY2tlckNvbmZpZyIsZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2Z1bmN0aW9uIGcoKXt2YXIgYj1wYXJzZUludChhLmhvdXJzLDEwKSxjPWEuc2hvd01lcmlkaWFuP2I+MCYmMTM+YjpiPj0wJiYyND5iO3JldHVybiBjPyhhLnNob3dNZXJpZGlhbiYmKDEyPT09YiYmKGI9MCksYS5tZXJpZGlhbj09PXBbMV0mJihiKz0xMikpLGIpOnZvaWQgMH1mdW5jdGlvbiBoKCl7dmFyIGI9cGFyc2VJbnQoYS5taW51dGVzLDEwKTtyZXR1cm4gYj49MCYmNjA+Yj9iOnZvaWQgMH1mdW5jdGlvbiBpKGEpe3JldHVybiBhbmd1bGFyLmlzRGVmaW5lZChhKSYmYS50b1N0cmluZygpLmxlbmd0aDwyPyIwIithOmF9ZnVuY3Rpb24gaihhKXtrKCksby4kc2V0Vmlld1ZhbHVlKG5ldyBEYXRlKG4pKSxsKGEpfWZ1bmN0aW9uIGsoKXtvLiRzZXRWYWxpZGl0eSgidGltZSIsITApLGEuaW52YWxpZEhvdXJzPSExLGEuaW52YWxpZE1pbnV0ZXM9ITF9ZnVuY3Rpb24gbChiKXt2YXIgYz1uLmdldEhvdXJzKCksZD1uLmdldE1pbnV0ZXMoKTthLnNob3dNZXJpZGlhbiYmKGM9MD09PWN8fDEyPT09Yz8xMjpjJTEyKSxhLmhvdXJzPSJoIj09PWI/YzppKGMpLGEubWludXRlcz0ibSI9PT1iP2Q6aShkKSxhLm1lcmlkaWFuPW4uZ2V0SG91cnMoKTwxMj9wWzBdOnBbMV19ZnVuY3Rpb24gbShhKXt2YXIgYj1uZXcgRGF0ZShuLmdldFRpbWUoKSs2ZTQqYSk7bi5zZXRIb3VycyhiLmdldEhvdXJzKCksYi5nZXRNaW51dGVzKCkpLGooKX12YXIgbj1uZXcgRGF0ZSxvPXskc2V0Vmlld1ZhbHVlOmFuZ3VsYXIubm9vcH0scD1hbmd1bGFyLmlzRGVmaW5lZChiLm1lcmlkaWFucyk/YS4kcGFyZW50LiRldmFsKGIubWVyaWRpYW5zKTpmLm1lcmlkaWFuc3x8ZS5EQVRFVElNRV9GT1JNQVRTLkFNUE1TO3RoaXMuaW5pdD1mdW5jdGlvbihjLGQpe289YyxvLiRyZW5kZXI9dGhpcy5yZW5kZXI7dmFyIGU9ZC5lcSgwKSxnPWQuZXEoMSksaD1hbmd1bGFyLmlzRGVmaW5lZChiLm1vdXNld2hlZWwpP2EuJHBhcmVudC4kZXZhbChiLm1vdXNld2hlZWwpOmYubW91c2V3aGVlbDtoJiZ0aGlzLnNldHVwTW91c2V3aGVlbEV2ZW50cyhlLGcpLGEucmVhZG9ubHlJbnB1dD1hbmd1bGFyLmlzRGVmaW5lZChiLnJlYWRvbmx5SW5wdXQpP2EuJHBhcmVudC4kZXZhbChiLnJlYWRvbmx5SW5wdXQpOmYucmVhZG9ubHlJbnB1dCx0aGlzLnNldHVwSW5wdXRFdmVudHMoZSxnKX07dmFyIHE9Zi5ob3VyU3RlcDtiLmhvdXJTdGVwJiZhLiRwYXJlbnQuJHdhdGNoKGMoYi5ob3VyU3RlcCksZnVuY3Rpb24oYSl7cT1wYXJzZUludChhLDEwKX0pO3ZhciByPWYubWludXRlU3RlcDtiLm1pbnV0ZVN0ZXAmJmEuJHBhcmVudC4kd2F0Y2goYyhiLm1pbnV0ZVN0ZXApLGZ1bmN0aW9uKGEpe3I9cGFyc2VJbnQoYSwxMCl9KSxhLnNob3dNZXJpZGlhbj1mLnNob3dNZXJpZGlhbixiLnNob3dNZXJpZGlhbiYmYS4kcGFyZW50LiR3YXRjaChjKGIuc2hvd01lcmlkaWFuKSxmdW5jdGlvbihiKXtpZihhLnNob3dNZXJpZGlhbj0hIWIsby4kZXJyb3IudGltZSl7dmFyIGM9ZygpLGQ9aCgpO2FuZ3VsYXIuaXNEZWZpbmVkKGMpJiZhbmd1bGFyLmlzRGVmaW5lZChkKSYmKG4uc2V0SG91cnMoYyksaigpKX1lbHNlIGwoKX0pLHRoaXMuc2V0dXBNb3VzZXdoZWVsRXZlbnRzPWZ1bmN0aW9uKGIsYyl7dmFyIGQ9ZnVuY3Rpb24oYSl7YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO3ZhciBiPWEud2hlZWxEZWx0YT9hLndoZWVsRGVsdGE6LWEuZGVsdGFZO3JldHVybiBhLmRldGFpbHx8Yj4wfTtiLmJpbmQoIm1vdXNld2hlZWwgd2hlZWwiLGZ1bmN0aW9uKGIpe2EuJGFwcGx5KGQoYik/YS5pbmNyZW1lbnRIb3VycygpOmEuZGVjcmVtZW50SG91cnMoKSksYi5wcmV2ZW50RGVmYXVsdCgpfSksYy5iaW5kKCJtb3VzZXdoZWVsIHdoZWVsIixmdW5jdGlvbihiKXthLiRhcHBseShkKGIpP2EuaW5jcmVtZW50TWludXRlcygpOmEuZGVjcmVtZW50TWludXRlcygpKSxiLnByZXZlbnREZWZhdWx0KCl9KX0sdGhpcy5zZXR1cElucHV0RXZlbnRzPWZ1bmN0aW9uKGIsYyl7aWYoYS5yZWFkb25seUlucHV0KXJldHVybiBhLnVwZGF0ZUhvdXJzPWFuZ3VsYXIubm9vcCx2b2lkKGEudXBkYXRlTWludXRlcz1hbmd1bGFyLm5vb3ApO3ZhciBkPWZ1bmN0aW9uKGIsYyl7by4kc2V0Vmlld1ZhbHVlKG51bGwpLG8uJHNldFZhbGlkaXR5KCJ0aW1lIiwhMSksYW5ndWxhci5pc0RlZmluZWQoYikmJihhLmludmFsaWRIb3Vycz1iKSxhbmd1bGFyLmlzRGVmaW5lZChjKSYmKGEuaW52YWxpZE1pbnV0ZXM9Yyl9O2EudXBkYXRlSG91cnM9ZnVuY3Rpb24oKXt2YXIgYT1nKCk7YW5ndWxhci5pc0RlZmluZWQoYSk/KG4uc2V0SG91cnMoYSksaigiaCIpKTpkKCEwKX0sYi5iaW5kKCJibHVyIixmdW5jdGlvbigpeyFhLmludmFsaWRIb3VycyYmYS5ob3VyczwxMCYmYS4kYXBwbHkoZnVuY3Rpb24oKXthLmhvdXJzPWkoYS5ob3Vycyl9KX0pLGEudXBkYXRlTWludXRlcz1mdW5jdGlvbigpe3ZhciBhPWgoKTthbmd1bGFyLmlzRGVmaW5lZChhKT8obi5zZXRNaW51dGVzKGEpLGooIm0iKSk6ZCh2b2lkIDAsITApfSxjLmJpbmQoImJsdXIiLGZ1bmN0aW9uKCl7IWEuaW52YWxpZE1pbnV0ZXMmJmEubWludXRlczwxMCYmYS4kYXBwbHkoZnVuY3Rpb24oKXthLm1pbnV0ZXM9aShhLm1pbnV0ZXMpfSl9KX0sdGhpcy5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgYT1vLiRtb2RlbFZhbHVlP25ldyBEYXRlKG8uJG1vZGVsVmFsdWUpOm51bGw7aXNOYU4oYSk/KG8uJHNldFZhbGlkaXR5KCJ0aW1lIiwhMSksZC5lcnJvcignVGltZXBpY2tlciBkaXJlY3RpdmU6ICJuZy1tb2RlbCIgdmFsdWUgbXVzdCBiZSBhIERhdGUgb2JqZWN0LCBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgMDEuMDEuMTk3MCBvciBhIHN0cmluZyByZXByZXNlbnRpbmcgYW4gUkZDMjgyMiBvciBJU08gODYwMSBkYXRlLicpKTooYSYmKG49YSksaygpLGwoKSl9LGEuaW5jcmVtZW50SG91cnM9ZnVuY3Rpb24oKXttKDYwKnEpfSxhLmRlY3JlbWVudEhvdXJzPWZ1bmN0aW9uKCl7bSg2MCotcSl9LGEuaW5jcmVtZW50TWludXRlcz1mdW5jdGlvbigpe20ocil9LGEuZGVjcmVtZW50TWludXRlcz1mdW5jdGlvbigpe20oLXIpfSxhLnRvZ2dsZU1lcmlkaWFuPWZ1bmN0aW9uKCl7bSg3MjAqKG4uZ2V0SG91cnMoKTwxMj8xOi0xKSl9fV0pLmRpcmVjdGl2ZSgidGltZXBpY2tlciIsZnVuY3Rpb24oKXtyZXR1cm57cmVzdHJpY3Q6IkVBIixyZXF1aXJlOlsidGltZXBpY2tlciIsIj9ebmdNb2RlbCJdLGNvbnRyb2xsZXI6IlRpbWVwaWNrZXJDb250cm9sbGVyIixyZXBsYWNlOiEwLHNjb3BlOnt9LHRlbXBsYXRlVXJsOiJ0ZW1wbGF0ZS90aW1lcGlja2VyL3RpbWVwaWNrZXIuaHRtbCIsbGluazpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1kWzBdLGY9ZFsxXTtmJiZlLmluaXQoZixiLmZpbmQoImlucHV0IikpfX19KSxhbmd1bGFyLm1vZHVsZSgidWkuYm9vdHN0cmFwLnR5cGVhaGVhZCIsWyJ1aS5ib290c3RyYXAucG9zaXRpb24iLCJ1aS5ib290c3RyYXAuYmluZEh0bWwiXSkuZmFjdG9yeSgidHlwZWFoZWFkUGFyc2VyIixbIiRwYXJzZSIsZnVuY3Rpb24oYSl7dmFyIGI9L15ccyooLio/KSg/OlxzK2FzXHMrKC4qPykpP1xzK2ZvclxzKyg/OihbXCRcd11bXCRcd1xkXSopKVxzK2luXHMrKC4qKSQvO3JldHVybntwYXJzZTpmdW5jdGlvbihjKXt2YXIgZD1jLm1hdGNoKGIpO2lmKCFkKXRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdHlwZWFoZWFkIHNwZWNpZmljYXRpb24gaW4gZm9ybSBvZiAiX21vZGVsVmFsdWVfIChhcyBfbGFiZWxfKT8gZm9yIF9pdGVtXyBpbiBfY29sbGVjdGlvbl8iIGJ1dCBnb3QgIicrYysnIi4nKTtyZXR1cm57aXRlbU5hbWU6ZFszXSxzb3VyY2U6YShkWzRdKSx2aWV3TWFwcGVyOmEoZFsyXXx8ZFsxXSksbW9kZWxNYXBwZXI6YShkWzFdKX19fX1dKS5kaXJlY3RpdmUoInR5cGVhaGVhZCIsWyIkY29tcGlsZSIsIiRwYXJzZSIsIiRxIiwiJHRpbWVvdXQiLCIkZG9jdW1lbnQiLCIkcG9zaXRpb24iLCJ0eXBlYWhlYWRQYXJzZXIiLGZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe3ZhciBoPVs5LDEzLDI3LDM4LDQwXTtyZXR1cm57cmVxdWlyZToibmdNb2RlbCIsbGluazpmdW5jdGlvbihpLGosayxsKXt2YXIgbSxuPWkuJGV2YWwoay50eXBlYWhlYWRNaW5MZW5ndGgpfHwxLG89aS4kZXZhbChrLnR5cGVhaGVhZFdhaXRNcyl8fDAscD1pLiRldmFsKGsudHlwZWFoZWFkRWRpdGFibGUpIT09ITEscT1iKGsudHlwZWFoZWFkTG9hZGluZykuYXNzaWdufHxhbmd1bGFyLm5vb3Ascj1iKGsudHlwZWFoZWFkT25TZWxlY3QpLHM9ay50eXBlYWhlYWRJbnB1dEZvcm1hdHRlcj9iKGsudHlwZWFoZWFkSW5wdXRGb3JtYXR0ZXIpOnZvaWQgMCx0PWsudHlwZWFoZWFkQXBwZW5kVG9Cb2R5P2kuJGV2YWwoay50eXBlYWhlYWRBcHBlbmRUb0JvZHkpOiExLHU9YihrLm5nTW9kZWwpLmFzc2lnbix2PWcucGFyc2Uoay50eXBlYWhlYWQpLHc9aS4kbmV3KCk7aS4kb24oIiRkZXN0cm95IixmdW5jdGlvbigpe3cuJGRlc3Ryb3koKX0pO3ZhciB4PSJ0eXBlYWhlYWQtIit3LiRpZCsiLSIrTWF0aC5mbG9vcigxZTQqTWF0aC5yYW5kb20oKSk7ai5hdHRyKHsiYXJpYS1hdXRvY29tcGxldGUiOiJsaXN0IiwiYXJpYS1leHBhbmRlZCI6ITEsImFyaWEtb3ducyI6eH0pO3ZhciB5PWFuZ3VsYXIuZWxlbWVudCgiPGRpdiB0eXBlYWhlYWQtcG9wdXA+PC9kaXY+Iik7eS5hdHRyKHtpZDp4LG1hdGNoZXM6Im1hdGNoZXMiLGFjdGl2ZToiYWN0aXZlSWR4IixzZWxlY3Q6InNlbGVjdChhY3RpdmVJZHgpIixxdWVyeToicXVlcnkiLHBvc2l0aW9uOiJwb3NpdGlvbiJ9KSxhbmd1bGFyLmlzRGVmaW5lZChrLnR5cGVhaGVhZFRlbXBsYXRlVXJsKSYmeS5hdHRyKCJ0ZW1wbGF0ZS11cmwiLGsudHlwZWFoZWFkVGVtcGxhdGVVcmwpO3ZhciB6PWZ1bmN0aW9uKCl7dy5tYXRjaGVzPVtdLHcuYWN0aXZlSWR4PS0xLGouYXR0cigiYXJpYS1leHBhbmRlZCIsITEpfSxBPWZ1bmN0aW9uKGEpe3JldHVybiB4KyItb3B0aW9uLSIrYX07dy4kd2F0Y2goImFjdGl2ZUlkeCIsZnVuY3Rpb24oYSl7MD5hP2oucmVtb3ZlQXR0cigiYXJpYS1hY3RpdmVkZXNjZW5kYW50Iik6ai5hdHRyKCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnQiLEEoYSkpfSk7dmFyIEI9ZnVuY3Rpb24oYSl7dmFyIGI9eyR2aWV3VmFsdWU6YX07cShpLCEwKSxjLndoZW4odi5zb3VyY2UoaSxiKSkudGhlbihmdW5jdGlvbihjKXt2YXIgZD1hPT09bC4kdmlld1ZhbHVlO2lmKGQmJm0paWYoYy5sZW5ndGg+MCl7dy5hY3RpdmVJZHg9MCx3Lm1hdGNoZXMubGVuZ3RoPTA7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspYlt2Lml0ZW1OYW1lXT1jW2VdLHcubWF0Y2hlcy5wdXNoKHtpZDpBKGUpLGxhYmVsOnYudmlld01hcHBlcih3LGIpLG1vZGVsOmNbZV19KTt3LnF1ZXJ5PWEsdy5wb3NpdGlvbj10P2Yub2Zmc2V0KGopOmYucG9zaXRpb24oaiksdy5wb3NpdGlvbi50b3A9dy5wb3NpdGlvbi50b3Arai5wcm9wKCJvZmZzZXRIZWlnaHQiKSxqLmF0dHIoImFyaWEtZXhwYW5kZWQiLCEwKX1lbHNlIHooKTtkJiZxKGksITEpfSxmdW5jdGlvbigpe3ooKSxxKGksITEpfSl9O3ooKSx3LnF1ZXJ5PXZvaWQgMDt2YXIgQztsLiRwYXJzZXJzLnVuc2hpZnQoZnVuY3Rpb24oYSl7cmV0dXJuIG09ITAsYSYmYS5sZW5ndGg+PW4/bz4wPyhDJiZkLmNhbmNlbChDKSxDPWQoZnVuY3Rpb24oKXtCKGEpfSxvKSk6QihhKToocShpLCExKSx6KCkpLHA/YTphP3ZvaWQgbC4kc2V0VmFsaWRpdHkoImVkaXRhYmxlIiwhMSk6KGwuJHNldFZhbGlkaXR5KCJlZGl0YWJsZSIsITApLGEpfSksbC4kZm9ybWF0dGVycy5wdXNoKGZ1bmN0aW9uKGEpe3ZhciBiLGMsZD17fTtyZXR1cm4gcz8oZC4kbW9kZWw9YSxzKGksZCkpOihkW3YuaXRlbU5hbWVdPWEsYj12LnZpZXdNYXBwZXIoaSxkKSxkW3YuaXRlbU5hbWVdPXZvaWQgMCxjPXYudmlld01hcHBlcihpLGQpLGIhPT1jP2I6YSl9KSx3LnNlbGVjdD1mdW5jdGlvbihhKXt2YXIgYixjLGU9e307ZVt2Lml0ZW1OYW1lXT1jPXcubWF0Y2hlc1thXS5tb2RlbCxiPXYubW9kZWxNYXBwZXIoaSxlKSx1KGksYiksbC4kc2V0VmFsaWRpdHkoImVkaXRhYmxlIiwhMCkscihpLHskaXRlbTpjLCRtb2RlbDpiLCRsYWJlbDp2LnZpZXdNYXBwZXIoaSxlKX0pLHooKSxkKGZ1bmN0aW9uKCl7alswXS5mb2N1cygpfSwwLCExKX0sai5iaW5kKCJrZXlkb3duIixmdW5jdGlvbihhKXswIT09dy5tYXRjaGVzLmxlbmd0aCYmLTEhPT1oLmluZGV4T2YoYS53aGljaCkmJihhLnByZXZlbnREZWZhdWx0KCksNDA9PT1hLndoaWNoPyh3LmFjdGl2ZUlkeD0ody5hY3RpdmVJZHgrMSkldy5tYXRjaGVzLmxlbmd0aCx3LiRkaWdlc3QoKSk6Mzg9PT1hLndoaWNoPyh3LmFjdGl2ZUlkeD0ody5hY3RpdmVJZHg/dy5hY3RpdmVJZHg6dy5tYXRjaGVzLmxlbmd0aCktMSx3LiRkaWdlc3QoKSk6MTM9PT1hLndoaWNofHw5PT09YS53aGljaD93LiRhcHBseShmdW5jdGlvbigpe3cuc2VsZWN0KHcuYWN0aXZlSWR4KX0pOjI3PT09YS53aGljaCYmKGEuc3RvcFByb3BhZ2F0aW9uKCkseigpLHcuJGRpZ2VzdCgpKSl9KSxqLmJpbmQoImJsdXIiLGZ1bmN0aW9uKCl7bT0hMX0pO3ZhciBEPWZ1bmN0aW9uKGEpe2pbMF0hPT1hLnRhcmdldCYmKHooKSx3LiRkaWdlc3QoKSl9O2UuYmluZCgiY2xpY2siLEQpLGkuJG9uKCIkZGVzdHJveSIsZnVuY3Rpb24oKXtlLnVuYmluZCgiY2xpY2siLEQpfSk7dmFyIEU9YSh5KSh3KTt0P2UuZmluZCgiYm9keSIpLmFwcGVuZChFKTpqLmFmdGVyKEUpfX19XSkuZGlyZWN0aXZlKCJ0eXBlYWhlYWRQb3B1cCIsZnVuY3Rpb24oKXtyZXR1cm57cmVzdHJpY3Q6IkVBIixzY29wZTp7bWF0Y2hlczoiPSIscXVlcnk6Ij0iLGFjdGl2ZToiPSIscG9zaXRpb246Ij0iLHNlbGVjdDoiJiJ9LHJlcGxhY2U6ITAsdGVtcGxhdGVVcmw6InRlbXBsYXRlL3R5cGVhaGVhZC90eXBlYWhlYWQtcG9wdXAuaHRtbCIsbGluazpmdW5jdGlvbihhLGIsYyl7YS50ZW1wbGF0ZVVybD1jLnRlbXBsYXRlVXJsLGEuaXNPcGVuPWZ1bmN0aW9uKCl7cmV0dXJuIGEubWF0Y2hlcy5sZW5ndGg+MH0sYS5pc0FjdGl2ZT1mdW5jdGlvbihiKXtyZXR1cm4gYS5hY3RpdmU9PWJ9LGEuc2VsZWN0QWN0aXZlPWZ1bmN0aW9uKGIpe2EuYWN0aXZlPWJ9LGEuc2VsZWN0TWF0Y2g9ZnVuY3Rpb24oYil7YS5zZWxlY3Qoe2FjdGl2ZUlkeDpifSl9fX19KS5kaXJlY3RpdmUoInR5cGVhaGVhZE1hdGNoIixbIiRodHRwIiwiJHRlbXBsYXRlQ2FjaGUiLCIkY29tcGlsZSIsIiRwYXJzZSIsZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJue3Jlc3RyaWN0OiJFQSIsc2NvcGU6e2luZGV4OiI9IixtYXRjaDoiPSIscXVlcnk6Ij0ifSxsaW5rOmZ1bmN0aW9uKGUsZixnKXt2YXIgaD1kKGcudGVtcGxhdGVVcmwpKGUuJHBhcmVudCl8fCJ0ZW1wbGF0ZS90eXBlYWhlYWQvdHlwZWFoZWFkLW1hdGNoLmh0bWwiO2EuZ2V0KGgse2NhY2hlOmJ9KS5zdWNjZXNzKGZ1bmN0aW9uKGEpe2YucmVwbGFjZVdpdGgoYyhhLnRyaW0oKSkoZSkpfSl9fX1dKS5maWx0ZXIoInR5cGVhaGVhZEhpZ2hsaWdodCIsZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiBhLnJlcGxhY2UoLyhbLj8qK14kW1xdXFwoKXt9fC1dKS9nLCJcXCQxIil9cmV0dXJuIGZ1bmN0aW9uKGIsYyl7cmV0dXJuIGM/KCIiK2IpLnJlcGxhY2UobmV3IFJlZ0V4cChhKGMpLCJnaSIpLCI8c3Ryb25nPiQmPC9zdHJvbmc+Iik6Yn19KSxhbmd1bGFyLm1vZHVsZSgidGVtcGxhdGUvYWNjb3JkaW9uL2FjY29yZGlvbi1ncm91cC5odG1sIixbXSkucnVuKFsiJHRlbXBsYXRlQ2FjaGUiLGZ1bmN0aW9uKGEpe2EucHV0KCJ0ZW1wbGF0ZS9hY2NvcmRpb24vYWNjb3JkaW9uLWdyb3VwLmh0bWwiLCc8ZGl2IGNsYXNzPSJwYW5lbCBwYW5lbC1kZWZhdWx0Ij5cbiAgPGRpdiBjbGFzcz0icGFuZWwtaGVhZGluZyI+XG4gICAgPGg0IGNsYXNzPSJwYW5lbC10aXRsZSI+XG4gICAgICA8YSBjbGFzcz0iYWNjb3JkaW9uLXRvZ2dsZSIgbmctY2xpY2s9InRvZ2dsZU9wZW4oKSIgYWNjb3JkaW9uLXRyYW5zY2x1ZGU9ImhlYWRpbmciPjxzcGFuIG5nLWNsYXNzPSJ7XCd0ZXh0LW11dGVkXCc6IGlzRGlzYWJsZWR9Ij57e2hlYWRpbmd9fTwvc3Bhbj48L2E+XG4gICAgPC9oND5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9InBhbmVsLWNvbGxhcHNlIiBjb2xsYXBzZT0iIWlzT3BlbiI+XG4JICA8ZGl2IGNsYXNzPSJwYW5lbC1ib2R5IiBuZy10cmFuc2NsdWRlPjwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PicpfV0pLGFuZ3VsYXIubW9kdWxlKCJ0ZW1wbGF0ZS9hY2NvcmRpb24vYWNjb3JkaW9uLmh0bWwiLFtdKS5ydW4oWyIkdGVtcGxhdGVDYWNoZSIsZnVuY3Rpb24oYSl7YS5wdXQoInRlbXBsYXRlL2FjY29yZGlvbi9hY2NvcmRpb24uaHRtbCIsJzxkaXYgY2xhc3M9InBhbmVsLWdyb3VwIiBuZy10cmFuc2NsdWRlPjwvZGl2PicpfV0pLGFuZ3VsYXIubW9kdWxlKCJ0ZW1wbGF0ZS9hbGVydC9hbGVydC5odG1sIixbXSkucnVuKFsiJHRlbXBsYXRlQ2FjaGUiLGZ1bmN0aW9uKGEpe2EucHV0KCJ0ZW1wbGF0ZS9hbGVydC9hbGVydC5odG1sIiwnPGRpdiBjbGFzcz0iYWxlcnQiIG5nLWNsYXNzPSJ7XCdhbGVydC17e3R5cGUgfHwgXCd3YXJuaW5nXCd9fVwnOiB0cnVlLCBcJ2FsZXJ0LWRpc21pc3NhYmxlXCc6IGNsb3NlYWJsZX0iIHJvbGU9ImFsZXJ0Ij5cbiAgICA8YnV0dG9uIG5nLXNob3c9ImNsb3NlYWJsZSIgdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIG5nLWNsaWNrPSJjbG9zZSgpIj5cbiAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49InRydWUiPiZ0aW1lczs8L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPSJzci1vbmx5Ij5DbG9zZTwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8ZGl2IG5nLXRyYW5zY2x1ZGU+PC9kaXY+XG48L2Rpdj5cbicpfV0pLGFuZ3VsYXIubW9kdWxlKCJ0ZW1wbGF0ZS9jYXJvdXNlbC9jYXJvdXNlbC5odG1sIixbXSkucnVuKFsiJHRlbXBsYXRlQ2FjaGUiLGZ1bmN0aW9uKGEpe2EucHV0KCJ0ZW1wbGF0ZS9jYXJvdXNlbC9jYXJvdXNlbC5odG1sIiwnPGRpdiBuZy1tb3VzZWVudGVyPSJwYXVzZSgpIiBuZy1tb3VzZWxlYXZlPSJwbGF5KCkiIGNsYXNzPSJjYXJvdXNlbCIgbmctc3dpcGUtcmlnaHQ9InByZXYoKSIgbmctc3dpcGUtbGVmdD0ibmV4dCgpIj5cbiAgICA8b2wgY2xhc3M9ImNhcm91c2VsLWluZGljYXRvcnMiIG5nLXNob3c9InNsaWRlcy5sZW5ndGggPiAxIj5cbiAgICAgICAgPGxpIG5nLXJlcGVhdD0ic2xpZGUgaW4gc2xpZGVzIHRyYWNrIGJ5ICRpbmRleCIgbmctY2xhc3M9InthY3RpdmU6IGlzQWN0aXZlKHNsaWRlKX0iIG5nLWNsaWNrPSJzZWxlY3Qoc2xpZGUpIj48L2xpPlxuICAgIDwvb2w+XG4gICAgPGRpdiBjbGFzcz0iY2Fyb3VzZWwtaW5uZXIiIG5nLXRyYW5zY2x1ZGU+PC9kaXY+XG4gICAgPGEgY2xhc3M9ImxlZnQgY2Fyb3VzZWwtY29udHJvbCIgbmctY2xpY2s9InByZXYoKSIgbmctc2hvdz0ic2xpZGVzLmxlbmd0aCA+IDEiPjxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWNoZXZyb24tbGVmdCI+PC9zcGFuPjwvYT5cbiAgICA8YSBjbGFzcz0icmlnaHQgY2Fyb3VzZWwtY29udHJvbCIgbmctY2xpY2s9Im5leHQoKSIgbmctc2hvdz0ic2xpZGVzLmxlbmd0aCA+IDEiPjxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWNoZXZyb24tcmlnaHQiPjwvc3Bhbj48L2E+XG48L2Rpdj5cbicpfV0pLGFuZ3VsYXIubW9kdWxlKCJ0ZW1wbGF0ZS9jYXJvdXNlbC9zbGlkZS5odG1sIixbXSkucnVuKFsiJHRlbXBsYXRlQ2FjaGUiLGZ1bmN0aW9uKGEpe2EucHV0KCJ0ZW1wbGF0ZS9jYXJvdXNlbC9zbGlkZS5odG1sIiwiPGRpdiBuZy1jbGFzcz1cIntcbiAgICAnYWN0aXZlJzogbGVhdmluZyB8fCAoYWN0aXZlICYmICFlbnRlcmluZyksXG4gICAgJ3ByZXYnOiAobmV4dCB8fCBhY3RpdmUpICYmIGRpcmVjdGlvbj09J3ByZXYnLFxuICAgICduZXh0JzogKG5leHQgfHwgYWN0aXZlKSAmJiBkaXJlY3Rpb249PSduZXh0JyxcbiAgICAncmlnaHQnOiBkaXJlY3Rpb249PSdwcmV2JyxcbiAgICAnbGVmdCc6IGRpcmVjdGlvbj09J25leHQnXG4gIH1cIiBjbGFzcz1cIml0ZW0gdGV4dC1jZW50ZXJcIiBuZy10cmFuc2NsdWRlPjwvZGl2PlxuIil9XSksYW5ndWxhci5tb2R1bGUoInRlbXBsYXRlL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5odG1sIixbXSkucnVuKFsiJHRlbXBsYXRlQ2FjaGUiLGZ1bmN0aW9uKGEpe2EucHV0KCJ0ZW1wbGF0ZS9kYXRlcGlja2VyL2RhdGVwaWNrZXIuaHRtbCIsJzxkaXYgbmctc3dpdGNoPSJkYXRlcGlja2VyTW9kZSIgcm9sZT0iYXBwbGljYXRpb24iIG5nLWtleWRvd249ImtleWRvd24oJGV2ZW50KSI+XG4gIDxkYXlwaWNrZXIgbmctc3dpdGNoLXdoZW49ImRheSIgdGFiaW5kZXg9IjAiPjwvZGF5cGlja2VyPlxuICA8bW9udGhwaWNrZXIgbmctc3dpdGNoLXdoZW49Im1vbnRoIiB0YWJpbmRleD0iMCI+PC9tb250aHBpY2tlcj5cbiAgPHllYXJwaWNrZXIgbmctc3dpdGNoLXdoZW49InllYXIiIHRhYmluZGV4PSIwIj48L3llYXJwaWNrZXI+XG48L2Rpdj4nKX1dKSxhbmd1bGFyLm1vZHVsZSgidGVtcGxhdGUvZGF0ZXBpY2tlci9kYXkuaHRtbCIsW10pLnJ1bihbIiR0ZW1wbGF0ZUNhY2hlIixmdW5jdGlvbihhKXthLnB1dCgidGVtcGxhdGUvZGF0ZXBpY2tlci9kYXkuaHRtbCIsJzx0YWJsZSByb2xlPSJncmlkIiBhcmlhLWxhYmVsbGVkYnk9Int7dW5pcXVlSWR9fS10aXRsZSIgYXJpYS1hY3RpdmVkZXNjZW5kYW50PSJ7e2FjdGl2ZURhdGVJZH19Ij5cbiAgPHRoZWFkPlxuICAgIDx0cj5cbiAgICAgIDx0aD48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCBidG4tc20gcHVsbC1sZWZ0IiBuZy1jbGljaz0ibW92ZSgtMSkiIHRhYmluZGV4PSItMSI+PGkgY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tY2hldnJvbi1sZWZ0Ij48L2k+PC9idXR0b24+PC90aD5cbiAgICAgIDx0aCBjb2xzcGFuPSJ7ezUgKyBzaG93V2Vla3N9fSI+PGJ1dHRvbiBpZD0ie3t1bmlxdWVJZH19LXRpdGxlIiByb2xlPSJoZWFkaW5nIiBhcmlhLWxpdmU9ImFzc2VydGl2ZSIgYXJpYS1hdG9taWM9InRydWUiIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCBidG4tc20iIG5nLWNsaWNrPSJ0b2dnbGVNb2RlKCkiIHRhYmluZGV4PSItMSIgc3R5bGU9IndpZHRoOjEwMCU7Ij48c3Ryb25nPnt7dGl0bGV9fTwvc3Ryb25nPjwvYnV0dG9uPjwvdGg+XG4gICAgICA8dGg+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIHB1bGwtcmlnaHQiIG5nLWNsaWNrPSJtb3ZlKDEpIiB0YWJpbmRleD0iLTEiPjxpIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLWNoZXZyb24tcmlnaHQiPjwvaT48L2J1dHRvbj48L3RoPlxuICAgIDwvdHI+XG4gICAgPHRyPlxuICAgICAgPHRoIG5nLXNob3c9InNob3dXZWVrcyIgY2xhc3M9InRleHQtY2VudGVyIj48L3RoPlxuICAgICAgPHRoIG5nLXJlcGVhdD0ibGFiZWwgaW4gbGFiZWxzIHRyYWNrIGJ5ICRpbmRleCIgY2xhc3M9InRleHQtY2VudGVyIj48c21hbGwgYXJpYS1sYWJlbD0ie3tsYWJlbC5mdWxsfX0iPnt7bGFiZWwuYWJicn19PC9zbWFsbD48L3RoPlxuICAgIDwvdHI+XG4gIDwvdGhlYWQ+XG4gIDx0Ym9keT5cbiAgICA8dHIgbmctcmVwZWF0PSJyb3cgaW4gcm93cyB0cmFjayBieSAkaW5kZXgiPlxuICAgICAgPHRkIG5nLXNob3c9InNob3dXZWVrcyIgY2xhc3M9InRleHQtY2VudGVyIGg2Ij48ZW0+e3sgd2Vla051bWJlcnNbJGluZGV4XSB9fTwvZW0+PC90ZD5cbiAgICAgIDx0ZCBuZy1yZXBlYXQ9ImR0IGluIHJvdyB0cmFjayBieSBkdC5kYXRlIiBjbGFzcz0idGV4dC1jZW50ZXIiIHJvbGU9ImdyaWRjZWxsIiBpZD0ie3tkdC51aWR9fSIgYXJpYS1kaXNhYmxlZD0ie3shIWR0LmRpc2FibGVkfX0iPlxuICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgc3R5bGU9IndpZHRoOjEwMCU7IiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbSIgbmctY2xhc3M9IntcJ2J0bi1pbmZvXCc6IGR0LnNlbGVjdGVkLCBhY3RpdmU6IGlzQWN0aXZlKGR0KX0iIG5nLWNsaWNrPSJzZWxlY3QoZHQuZGF0ZSkiIG5nLWRpc2FibGVkPSJkdC5kaXNhYmxlZCIgdGFiaW5kZXg9Ii0xIj48c3BhbiBuZy1jbGFzcz0ie1wndGV4dC1tdXRlZFwnOiBkdC5zZWNvbmRhcnksIFwndGV4dC1pbmZvXCc6IGR0LmN1cnJlbnR9Ij57e2R0LmxhYmVsfX08L3NwYW4+PC9idXR0b24+XG4gICAgICA8L3RkPlxuICAgIDwvdHI+XG4gIDwvdGJvZHk+XG48L3RhYmxlPlxuJyl9XSksYW5ndWxhci5tb2R1bGUoInRlbXBsYXRlL2RhdGVwaWNrZXIvbW9udGguaHRtbCIsW10pLnJ1bihbIiR0ZW1wbGF0ZUNhY2hlIixmdW5jdGlvbihhKXthLnB1dCgidGVtcGxhdGUvZGF0ZXBpY2tlci9tb250aC5odG1sIiwnPHRhYmxlIHJvbGU9ImdyaWQiIGFyaWEtbGFiZWxsZWRieT0ie3t1bmlxdWVJZH19LXRpdGxlIiBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQ9Int7YWN0aXZlRGF0ZUlkfX0iPlxuICA8dGhlYWQ+XG4gICAgPHRyPlxuICAgICAgPHRoPjxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbSBwdWxsLWxlZnQiIG5nLWNsaWNrPSJtb3ZlKC0xKSIgdGFiaW5kZXg9Ii0xIj48aSBjbGFzcz0iZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLWxlZnQiPjwvaT48L2J1dHRvbj48L3RoPlxuICAgICAgPHRoPjxidXR0b24gaWQ9Int7dW5pcXVlSWR9fS10aXRsZSIgcm9sZT0iaGVhZGluZyIgYXJpYS1saXZlPSJhc3NlcnRpdmUiIGFyaWEtYXRvbWljPSJ0cnVlIiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIiBuZy1jbGljaz0idG9nZ2xlTW9kZSgpIiB0YWJpbmRleD0iLTEiIHN0eWxlPSJ3aWR0aDoxMDAlOyI+PHN0cm9uZz57e3RpdGxlfX08L3N0cm9uZz48L2J1dHRvbj48L3RoPlxuICAgICAgPHRoPjxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbSBwdWxsLXJpZ2h0IiBuZy1jbGljaz0ibW92ZSgxKSIgdGFiaW5kZXg9Ii0xIj48aSBjbGFzcz0iZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLXJpZ2h0Ij48L2k+PC9idXR0b24+PC90aD5cbiAgICA8L3RyPlxuICA8L3RoZWFkPlxuICA8dGJvZHk+XG4gICAgPHRyIG5nLXJlcGVhdD0icm93IGluIHJvd3MgdHJhY2sgYnkgJGluZGV4Ij5cbiAgICAgIDx0ZCBuZy1yZXBlYXQ9ImR0IGluIHJvdyB0cmFjayBieSBkdC5kYXRlIiBjbGFzcz0idGV4dC1jZW50ZXIiIHJvbGU9ImdyaWRjZWxsIiBpZD0ie3tkdC51aWR9fSIgYXJpYS1kaXNhYmxlZD0ie3shIWR0LmRpc2FibGVkfX0iPlxuICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgc3R5bGU9IndpZHRoOjEwMCU7IiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IiBuZy1jbGFzcz0ie1wnYnRuLWluZm9cJzogZHQuc2VsZWN0ZWQsIGFjdGl2ZTogaXNBY3RpdmUoZHQpfSIgbmctY2xpY2s9InNlbGVjdChkdC5kYXRlKSIgbmctZGlzYWJsZWQ9ImR0LmRpc2FibGVkIiB0YWJpbmRleD0iLTEiPjxzcGFuIG5nLWNsYXNzPSJ7XCd0ZXh0LWluZm9cJzogZHQuY3VycmVudH0iPnt7ZHQubGFiZWx9fTwvc3Bhbj48L2J1dHRvbj5cbiAgICAgIDwvdGQ+XG4gICAgPC90cj5cbiAgPC90Ym9keT5cbjwvdGFibGU+XG4nKX1dKSxhbmd1bGFyLm1vZHVsZSgidGVtcGxhdGUvZGF0ZXBpY2tlci9wb3B1cC5odG1sIixbXSkucnVuKFsiJHRlbXBsYXRlQ2FjaGUiLGZ1bmN0aW9uKGEpe2EucHV0KCJ0ZW1wbGF0ZS9kYXRlcGlja2VyL3BvcHVwLmh0bWwiLCc8dWwgY2xhc3M9ImRyb3Bkb3duLW1lbnUiIG5nLXN0eWxlPSJ7ZGlzcGxheTogKGlzT3BlbiAmJiBcJ2Jsb2NrXCcpIHx8IFwnbm9uZVwnLCB0b3A6IHBvc2l0aW9uLnRvcCtcJ3B4XCcsIGxlZnQ6IHBvc2l0aW9uLmxlZnQrXCdweFwnfSIgbmcta2V5ZG93bj0ia2V5ZG93bigkZXZlbnQpIj5cbgk8bGkgbmctdHJhbnNjbHVkZT48L2xpPlxuCTxsaSBuZy1pZj0ic2hvd0J1dHRvbkJhciIgc3R5bGU9InBhZGRpbmc6MTBweCA5cHggMnB4Ij5cbgkJPHNwYW4gY2xhc3M9ImJ0bi1ncm91cCI+XG4JCQk8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tc20gYnRuLWluZm8iIG5nLWNsaWNrPSJzZWxlY3QoXCd0b2RheVwnKSI+e3sgZ2V0VGV4dChcJ2N1cnJlbnRcJykgfX08L2J1dHRvbj5cbgkJCTxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1zbSBidG4tZGFuZ2VyIiBuZy1jbGljaz0ic2VsZWN0KG51bGwpIj57eyBnZXRUZXh0KFwnY2xlYXJcJykgfX08L2J1dHRvbj5cbgkJPC9zcGFuPlxuCQk8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tc20gYnRuLXN1Y2Nlc3MgcHVsbC1yaWdodCIgbmctY2xpY2s9ImNsb3NlKCkiPnt7IGdldFRleHQoXCdjbG9zZVwnKSB9fTwvYnV0dG9uPlxuCTwvbGk+XG48L3VsPlxuJyl9XSksYW5ndWxhci5tb2R1bGUoInRlbXBsYXRlL2RhdGVwaWNrZXIveWVhci5odG1sIixbXSkucnVuKFsiJHRlbXBsYXRlQ2FjaGUiLGZ1bmN0aW9uKGEpe2EucHV0KCJ0ZW1wbGF0ZS9kYXRlcGlja2VyL3llYXIuaHRtbCIsJzx0YWJsZSByb2xlPSJncmlkIiBhcmlhLWxhYmVsbGVkYnk9Int7dW5pcXVlSWR9fS10aXRsZSIgYXJpYS1hY3RpdmVkZXNjZW5kYW50PSJ7e2FjdGl2ZURhdGVJZH19Ij5cbiAgPHRoZWFkPlxuICAgIDx0cj5cbiAgICAgIDx0aD48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCBidG4tc20gcHVsbC1sZWZ0IiBuZy1jbGljaz0ibW92ZSgtMSkiIHRhYmluZGV4PSItMSI+PGkgY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tY2hldnJvbi1sZWZ0Ij48L2k+PC9idXR0b24+PC90aD5cbiAgICAgIDx0aCBjb2xzcGFuPSIzIj48YnV0dG9uIGlkPSJ7e3VuaXF1ZUlkfX0tdGl0bGUiIHJvbGU9ImhlYWRpbmciIGFyaWEtbGl2ZT0iYXNzZXJ0aXZlIiBhcmlhLWF0b21pYz0idHJ1ZSIgdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbSIgbmctY2xpY2s9InRvZ2dsZU1vZGUoKSIgdGFiaW5kZXg9Ii0xIiBzdHlsZT0id2lkdGg6MTAwJTsiPjxzdHJvbmc+e3t0aXRsZX19PC9zdHJvbmc+PC9idXR0b24+PC90aD5cbiAgICAgIDx0aD48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCBidG4tc20gcHVsbC1yaWdodCIgbmctY2xpY2s9Im1vdmUoMSkiIHRhYmluZGV4PSItMSI+PGkgY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tY2hldnJvbi1yaWdodCI+PC9pPjwvYnV0dG9uPjwvdGg+XG4gICAgPC90cj5cbiAgPC90aGVhZD5cbiAgPHRib2R5PlxuICAgIDx0ciBuZy1yZXBlYXQ9InJvdyBpbiByb3dzIHRyYWNrIGJ5ICRpbmRleCI+XG4gICAgICA8dGQgbmctcmVwZWF0PSJkdCBpbiByb3cgdHJhY2sgYnkgZHQuZGF0ZSIgY2xhc3M9InRleHQtY2VudGVyIiByb2xlPSJncmlkY2VsbCIgaWQ9Int7ZHQudWlkfX0iIGFyaWEtZGlzYWJsZWQ9Int7ISFkdC5kaXNhYmxlZH19Ij5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIHN0eWxlPSJ3aWR0aDoxMDAlOyIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCIgbmctY2xhc3M9IntcJ2J0bi1pbmZvXCc6IGR0LnNlbGVjdGVkLCBhY3RpdmU6IGlzQWN0aXZlKGR0KX0iIG5nLWNsaWNrPSJzZWxlY3QoZHQuZGF0ZSkiIG5nLWRpc2FibGVkPSJkdC5kaXNhYmxlZCIgdGFiaW5kZXg9Ii0xIj48c3BhbiBuZy1jbGFzcz0ie1wndGV4dC1pbmZvXCc6IGR0LmN1cnJlbnR9Ij57e2R0LmxhYmVsfX08L3NwYW4+PC9idXR0b24+XG4gICAgICA8L3RkPlxuICAgIDwvdHI+XG4gIDwvdGJvZHk+XG48L3RhYmxlPlxuJyl9XSksYW5ndWxhci5tb2R1bGUoInRlbXBsYXRlL21vZGFsL2JhY2tkcm9wLmh0bWwiLFtdKS5ydW4oWyIkdGVtcGxhdGVDYWNoZSIsZnVuY3Rpb24oYSl7YS5wdXQoInRlbXBsYXRlL21vZGFsL2JhY2tkcm9wLmh0bWwiLCc8ZGl2IGNsYXNzPSJtb2RhbC1iYWNrZHJvcCBmYWRlIlxuICAgICBuZy1jbGFzcz0ie2luOiBhbmltYXRlfSJcbiAgICAgbmctc3R5bGU9IntcJ3otaW5kZXhcJzogMTA0MCArIChpbmRleCAmJiAxIHx8IDApICsgaW5kZXgqMTB9IlxuPjwvZGl2PlxuJyl9XSksYW5ndWxhci5tb2R1bGUoInRlbXBsYXRlL21vZGFsL3dpbmRvdy5odG1sIixbXSkucnVuKFsiJHRlbXBsYXRlQ2FjaGUiLGZ1bmN0aW9uKGEpe2EucHV0KCJ0ZW1wbGF0ZS9tb2RhbC93aW5kb3cuaHRtbCIsJzxkaXYgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciIGNsYXNzPSJtb2RhbCBmYWRlIiBuZy1jbGFzcz0ie2luOiBhbmltYXRlfSIgbmctc3R5bGU9IntcJ3otaW5kZXhcJzogMTA1MCArIGluZGV4KjEwLCBkaXNwbGF5OiBcJ2Jsb2NrXCd9IiBuZy1jbGljaz0iY2xvc2UoJGV2ZW50KSI+XG4gICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIiBuZy1jbGFzcz0ie1wnbW9kYWwtc21cJzogc2l6ZSA9PSBcJ3NtXCcsIFwnbW9kYWwtbGdcJzogc2l6ZSA9PSBcJ2xnXCd9Ij48ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50IiBuZy10cmFuc2NsdWRlPjwvZGl2PjwvZGl2PlxuPC9kaXY+Jyl9XSksYW5ndWxhci5tb2R1bGUoInRlbXBsYXRlL3BhZ2luYXRpb24vcGFnZXIuaHRtbCIsW10pLnJ1bihbIiR0ZW1wbGF0ZUNhY2hlIixmdW5jdGlvbihhKXthLnB1dCgidGVtcGxhdGUvcGFnaW5hdGlvbi9wYWdlci5odG1sIiwnPHVsIGNsYXNzPSJwYWdlciI+XG4gIDxsaSBuZy1jbGFzcz0ie2Rpc2FibGVkOiBub1ByZXZpb3VzKCksIHByZXZpb3VzOiBhbGlnbn0iPjxhIGhyZWYgbmctY2xpY2s9InNlbGVjdFBhZ2UocGFnZSAtIDEpIj57e2dldFRleHQoXCdwcmV2aW91c1wnKX19PC9hPjwvbGk+XG4gIDxsaSBuZy1jbGFzcz0ie2Rpc2FibGVkOiBub05leHQoKSwgbmV4dDogYWxpZ259Ij48YSBocmVmIG5nLWNsaWNrPSJzZWxlY3RQYWdlKHBhZ2UgKyAxKSI+e3tnZXRUZXh0KFwnbmV4dFwnKX19PC9hPjwvbGk+XG48L3VsPicpfV0pLGFuZ3VsYXIubW9kdWxlKCJ0ZW1wbGF0ZS9wYWdpbmF0aW9uL3BhZ2luYXRpb24uaHRtbCIsW10pLnJ1bihbIiR0ZW1wbGF0ZUNhY2hlIixmdW5jdGlvbihhKXthLnB1dCgidGVtcGxhdGUvcGFnaW5hdGlvbi9wYWdpbmF0aW9uLmh0bWwiLCc8dWwgY2xhc3M9InBhZ2luYXRpb24iPlxuICA8bGkgbmctaWY9ImJvdW5kYXJ5TGlua3MiIG5nLWNsYXNzPSJ7ZGlzYWJsZWQ6IG5vUHJldmlvdXMoKX0iPjxhIGhyZWYgbmctY2xpY2s9InNlbGVjdFBhZ2UoMSkiPnt7Z2V0VGV4dChcJ2ZpcnN0XCcpfX08L2E+PC9saT5cbiAgPGxpIG5nLWlmPSJkaXJlY3Rpb25MaW5rcyIgbmctY2xhc3M9IntkaXNhYmxlZDogbm9QcmV2aW91cygpfSI+PGEgaHJlZiBuZy1jbGljaz0ic2VsZWN0UGFnZShwYWdlIC0gMSkiPnt7Z2V0VGV4dChcJ3ByZXZpb3VzXCcpfX08L2E+PC9saT5cbiAgPGxpIG5nLXJlcGVhdD0icGFnZSBpbiBwYWdlcyB0cmFjayBieSAkaW5kZXgiIG5nLWNsYXNzPSJ7YWN0aXZlOiBwYWdlLmFjdGl2ZX0iPjxhIGhyZWYgbmctY2xpY2s9InNlbGVjdFBhZ2UocGFnZS5udW1iZXIpIj57e3BhZ2UudGV4dH19PC9hPjwvbGk+XG4gIDxsaSBuZy1pZj0iZGlyZWN0aW9uTGlua3MiIG5nLWNsYXNzPSJ7ZGlzYWJsZWQ6IG5vTmV4dCgpfSI+PGEgaHJlZiBuZy1jbGljaz0ic2VsZWN0UGFnZShwYWdlICsgMSkiPnt7Z2V0VGV4dChcJ25leHRcJyl9fTwvYT48L2xpPlxuICA8bGkgbmctaWY9ImJvdW5kYXJ5TGlua3MiIG5nLWNsYXNzPSJ7ZGlzYWJsZWQ6IG5vTmV4dCgpfSI+PGEgaHJlZiBuZy1jbGljaz0ic2VsZWN0UGFnZSh0b3RhbFBhZ2VzKSI+e3tnZXRUZXh0KFwnbGFzdFwnKX19PC9hPjwvbGk+XG48L3VsPicpfV0pLGFuZ3VsYXIubW9kdWxlKCJ0ZW1wbGF0ZS90b29sdGlwL3Rvb2x0aXAtaHRtbC11bnNhZmUtcG9wdXAuaHRtbCIsW10pLnJ1bihbIiR0ZW1wbGF0ZUNhY2hlIixmdW5jdGlvbihhKXthLnB1dCgidGVtcGxhdGUvdG9vbHRpcC90b29sdGlwLWh0bWwtdW5zYWZlLXBvcHVwLmh0bWwiLCc8ZGl2IGNsYXNzPSJ0b29sdGlwIHt7cGxhY2VtZW50fX0iIG5nLWNsYXNzPSJ7IGluOiBpc09wZW4oKSwgZmFkZTogYW5pbWF0aW9uKCkgfSI+XG4gIDxkaXYgY2xhc3M9InRvb2x0aXAtYXJyb3ciPjwvZGl2PlxuICA8ZGl2IGNsYXNzPSJ0b29sdGlwLWlubmVyIiBiaW5kLWh0bWwtdW5zYWZlPSJjb250ZW50Ij48L2Rpdj5cbjwvZGl2PlxuJyl9XSksYW5ndWxhci5tb2R1bGUoInRlbXBsYXRlL3Rvb2x0aXAvdG9vbHRpcC1wb3B1cC5odG1sIixbXSkucnVuKFsiJHRlbXBsYXRlQ2FjaGUiLGZ1bmN0aW9uKGEpe2EucHV0KCJ0ZW1wbGF0ZS90b29sdGlwL3Rvb2x0aXAtcG9wdXAuaHRtbCIsJzxkaXYgY2xhc3M9InRvb2x0aXAge3twbGFjZW1lbnR9fSIgbmctY2xhc3M9InsgaW46IGlzT3BlbigpLCBmYWRlOiBhbmltYXRpb24oKSB9Ij5cbiAgPGRpdiBjbGFzcz0idG9vbHRpcC1hcnJvdyI+PC9kaXY+XG4gIDxkaXYgY2xhc3M9InRvb2x0aXAtaW5uZXIiIG5nLWJpbmQ9ImNvbnRlbnQiPjwvZGl2PlxuPC9kaXY+XG4nKX1dKSxhbmd1bGFyLm1vZHVsZSgidGVtcGxhdGUvcG9wb3Zlci9wb3BvdmVyLmh0bWwiLFtdKS5ydW4oWyIkdGVtcGxhdGVDYWNoZSIsZnVuY3Rpb24oYSl7YS5wdXQoInRlbXBsYXRlL3BvcG92ZXIvcG9wb3Zlci5odG1sIiwnPGRpdiBjbGFzcz0icG9wb3ZlciB7e3BsYWNlbWVudH19IiBuZy1jbGFzcz0ieyBpbjogaXNPcGVuKCksIGZhZGU6IGFuaW1hdGlvbigpIH0iPlxuICA8ZGl2IGNsYXNzPSJhcnJvdyI+PC9kaXY+XG5cbiAgPGRpdiBjbGFzcz0icG9wb3Zlci1pbm5lciI+XG4gICAgICA8aDMgY2xhc3M9InBvcG92ZXItdGl0bGUiIG5nLWJpbmQ9InRpdGxlIiBuZy1zaG93PSJ0aXRsZSI+PC9oMz5cbiAgICAgIDxkaXYgY2xhc3M9InBvcG92ZXItY29udGVudCIgbmctYmluZD0iY29udGVudCI+PC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4nKX1dKSxhbmd1bGFyLm1vZHVsZSgidGVtcGxhdGUvcHJvZ3Jlc3NiYXIvYmFyLmh0bWwiLFtdKS5ydW4oWyIkdGVtcGxhdGVDYWNoZSIsZnVuY3Rpb24oYSl7YS5wdXQoInRlbXBsYXRlL3Byb2dyZXNzYmFyL2Jhci5odG1sIiwnPGRpdiBjbGFzcz0icHJvZ3Jlc3MtYmFyIiBuZy1jbGFzcz0idHlwZSAmJiBcJ3Byb2dyZXNzLWJhci1cJyArIHR5cGUiIHJvbGU9InByb2dyZXNzYmFyIiBhcmlhLXZhbHVlbm93PSJ7e3ZhbHVlfX0iIGFyaWEtdmFsdWVtaW49IjAiIGFyaWEtdmFsdWVtYXg9Int7bWF4fX0iIG5nLXN0eWxlPSJ7d2lkdGg6IHBlcmNlbnQgKyBcJyVcJ30iIGFyaWEtdmFsdWV0ZXh0PSJ7e3BlcmNlbnQgfCBudW1iZXI6MH19JSIgbmctdHJhbnNjbHVkZT48L2Rpdj4nKX1dKSxhbmd1bGFyLm1vZHVsZSgidGVtcGxhdGUvcHJvZ3Jlc3NiYXIvcHJvZ3Jlc3MuaHRtbCIsW10pLnJ1bihbIiR0ZW1wbGF0ZUNhY2hlIixmdW5jdGlvbihhKXthLnB1dCgidGVtcGxhdGUvcHJvZ3Jlc3NiYXIvcHJvZ3Jlc3MuaHRtbCIsJzxkaXYgY2xhc3M9InByb2dyZXNzIiBuZy10cmFuc2NsdWRlPjwvZGl2PicpfV0pLGFuZ3VsYXIubW9kdWxlKCJ0ZW1wbGF0ZS9wcm9ncmVzc2Jhci9wcm9ncmVzc2Jhci5odG1sIixbXSkucnVuKFsiJHRlbXBsYXRlQ2FjaGUiLGZ1bmN0aW9uKGEpe2EucHV0KCJ0ZW1wbGF0ZS9wcm9ncmVzc2Jhci9wcm9ncmVzc2Jhci5odG1sIiwnPGRpdiBjbGFzcz0icHJvZ3Jlc3MiPlxuICA8ZGl2IGNsYXNzPSJwcm9ncmVzcy1iYXIiIG5nLWNsYXNzPSJ0eXBlICYmIFwncHJvZ3Jlc3MtYmFyLVwnICsgdHlwZSIgcm9sZT0icHJvZ3Jlc3NiYXIiIGFyaWEtdmFsdWVub3c9Int7dmFsdWV9fSIgYXJpYS12YWx1ZW1pbj0iMCIgYXJpYS12YWx1ZW1heD0ie3ttYXh9fSIgbmctc3R5bGU9Int3aWR0aDogcGVyY2VudCArIFwnJVwnfSIgYXJpYS12YWx1ZXRleHQ9Int7cGVyY2VudCB8IG51bWJlcjowfX0lIiBuZy10cmFuc2NsdWRlPjwvZGl2PlxuPC9kaXY+Jyl9XSksYW5ndWxhci5tb2R1bGUoInRlbXBsYXRlL3JhdGluZy9yYXRpbmcuaHRtbCIsW10pLnJ1bihbIiR0ZW1wbGF0ZUNhY2hlIixmdW5jdGlvbihhKXthLnB1dCgidGVtcGxhdGUvcmF0aW5nL3JhdGluZy5odG1sIiwnPHNwYW4gbmctbW91c2VsZWF2ZT0icmVzZXQoKSIgbmcta2V5ZG93bj0ib25LZXlkb3duKCRldmVudCkiIHRhYmluZGV4PSIwIiByb2xlPSJzbGlkZXIiIGFyaWEtdmFsdWVtaW49IjAiIGFyaWEtdmFsdWVtYXg9Int7cmFuZ2UubGVuZ3RofX0iIGFyaWEtdmFsdWVub3c9Int7dmFsdWV9fSI+XG4gICAgPGkgbmctcmVwZWF0PSJyIGluIHJhbmdlIHRyYWNrIGJ5ICRpbmRleCIgbmctbW91c2VlbnRlcj0iZW50ZXIoJGluZGV4ICsgMSkiIG5nLWNsaWNrPSJyYXRlKCRpbmRleCArIDEpIiBjbGFzcz0iZ2x5cGhpY29uIiBuZy1jbGFzcz0iJGluZGV4IDwgdmFsdWUgJiYgKHIuc3RhdGVPbiB8fCBcJ2dseXBoaWNvbi1zdGFyXCcpIHx8IChyLnN0YXRlT2ZmIHx8IFwnZ2x5cGhpY29uLXN0YXItZW1wdHlcJykiPlxuICAgICAgICA8c3BhbiBjbGFzcz0ic3Itb25seSI+KHt7ICRpbmRleCA8IHZhbHVlID8gXCcqXCcgOiBcJyBcJyB9fSk8L3NwYW4+XG4gICAgPC9pPlxuPC9zcGFuPicpfV0pLGFuZ3VsYXIubW9kdWxlKCJ0ZW1wbGF0ZS90YWJzL3RhYi5odG1sIixbXSkucnVuKFsiJHRlbXBsYXRlQ2FjaGUiLGZ1bmN0aW9uKGEpe2EucHV0KCJ0ZW1wbGF0ZS90YWJzL3RhYi5odG1sIiwnPGxpIG5nLWNsYXNzPSJ7YWN0aXZlOiBhY3RpdmUsIGRpc2FibGVkOiBkaXNhYmxlZH0iPlxuICA8YSBuZy1jbGljaz0ic2VsZWN0KCkiIHRhYi1oZWFkaW5nLXRyYW5zY2x1ZGU+e3toZWFkaW5nfX08L2E+XG48L2xpPlxuJyl9XSksYW5ndWxhci5tb2R1bGUoInRlbXBsYXRlL3RhYnMvdGFic2V0LXRpdGxlcy5odG1sIixbXSkucnVuKFsiJHRlbXBsYXRlQ2FjaGUiLGZ1bmN0aW9uKGEpe2EucHV0KCJ0ZW1wbGF0ZS90YWJzL3RhYnNldC10aXRsZXMuaHRtbCIsIjx1bCBjbGFzcz1cIm5hdiB7e3R5cGUgJiYgJ25hdi0nICsgdHlwZX19XCIgbmctY2xhc3M9XCJ7J25hdi1zdGFja2VkJzogdmVydGljYWx9XCI+XG48L3VsPlxuIil9XSksYW5ndWxhci5tb2R1bGUoInRlbXBsYXRlL3RhYnMvdGFic2V0Lmh0bWwiLFtdKS5ydW4oWyIkdGVtcGxhdGVDYWNoZSIsZnVuY3Rpb24oYSl7YS5wdXQoInRlbXBsYXRlL3RhYnMvdGFic2V0Lmh0bWwiLCdcbjxkaXY+XG4gIDx1bCBjbGFzcz0ibmF2IG5hdi17e3R5cGUgfHwgXCd0YWJzXCd9fSIgbmctY2xhc3M9IntcJ25hdi1zdGFja2VkXCc6IHZlcnRpY2FsLCBcJ25hdi1qdXN0aWZpZWRcJzoganVzdGlmaWVkfSIgbmctdHJhbnNjbHVkZT48L3VsPlxuICA8ZGl2IGNsYXNzPSJ0YWItY29udGVudCI+XG4gICAgPGRpdiBjbGFzcz0idGFiLXBhbmUiIFxuICAgICAgICAgbmctcmVwZWF0PSJ0YWIgaW4gdGFicyIgXG4gICAgICAgICBuZy1jbGFzcz0ie2FjdGl2ZTogdGFiLmFjdGl2ZX0iXG4gICAgICAgICB0YWItY29udGVudC10cmFuc2NsdWRlPSJ0YWIiPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuJyl9XSksYW5ndWxhci5tb2R1bGUoInRlbXBsYXRlL3RpbWVwaWNrZXIvdGltZXBpY2tlci5odG1sIixbXSkucnVuKFsiJHRlbXBsYXRlQ2FjaGUiLGZ1bmN0aW9uKGEpe2EucHV0KCJ0ZW1wbGF0ZS90aW1lcGlja2VyL3RpbWVwaWNrZXIuaHRtbCIsJzx0YWJsZT5cbgk8dGJvZHk+XG4JCTx0ciBjbGFzcz0idGV4dC1jZW50ZXIiPlxuCQkJPHRkPjxhIG5nLWNsaWNrPSJpbmNyZW1lbnRIb3VycygpIiBjbGFzcz0iYnRuIGJ0bi1saW5rIj48c3BhbiBjbGFzcz0iZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLXVwIj48L3NwYW4+PC9hPjwvdGQ+XG4JCQk8dGQ+Jm5ic3A7PC90ZD5cbgkJCTx0ZD48YSBuZy1jbGljaz0iaW5jcmVtZW50TWludXRlcygpIiBjbGFzcz0iYnRuIGJ0bi1saW5rIj48c3BhbiBjbGFzcz0iZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLXVwIj48L3NwYW4+PC9hPjwvdGQ+XG4JCQk8dGQgbmctc2hvdz0ic2hvd01lcmlkaWFuIj48L3RkPlxuCQk8L3RyPlxuCQk8dHI+XG4JCQk8dGQgc3R5bGU9IndpZHRoOjUwcHg7IiBjbGFzcz0iZm9ybS1ncm91cCIgbmctY2xhc3M9IntcJ2hhcy1lcnJvclwnOiBpbnZhbGlkSG91cnN9Ij5cbgkJCQk8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9ImhvdXJzIiBuZy1jaGFuZ2U9InVwZGF0ZUhvdXJzKCkiIGNsYXNzPSJmb3JtLWNvbnRyb2wgdGV4dC1jZW50ZXIiIG5nLW1vdXNld2hlZWw9ImluY3JlbWVudEhvdXJzKCkiIG5nLXJlYWRvbmx5PSJyZWFkb25seUlucHV0IiBtYXhsZW5ndGg9IjIiPlxuCQkJPC90ZD5cbgkJCTx0ZD46PC90ZD5cbgkJCTx0ZCBzdHlsZT0id2lkdGg6NTBweDsiIGNsYXNzPSJmb3JtLWdyb3VwIiBuZy1jbGFzcz0ie1wnaGFzLWVycm9yXCc6IGludmFsaWRNaW51dGVzfSI+XG4JCQkJPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJtaW51dGVzIiBuZy1jaGFuZ2U9InVwZGF0ZU1pbnV0ZXMoKSIgY2xhc3M9ImZvcm0tY29udHJvbCB0ZXh0LWNlbnRlciIgbmctcmVhZG9ubHk9InJlYWRvbmx5SW5wdXQiIG1heGxlbmd0aD0iMiI+XG4JCQk8L3RkPlxuCQkJPHRkIG5nLXNob3c9InNob3dNZXJpZGlhbiI+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQgdGV4dC1jZW50ZXIiIG5nLWNsaWNrPSJ0b2dnbGVNZXJpZGlhbigpIj57e21lcmlkaWFufX08L2J1dHRvbj48L3RkPlxuCQk8L3RyPlxuCQk8dHIgY2xhc3M9InRleHQtY2VudGVyIj5cbgkJCTx0ZD48YSBuZy1jbGljaz0iZGVjcmVtZW50SG91cnMoKSIgY2xhc3M9ImJ0biBidG4tbGluayI+PHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tY2hldnJvbi1kb3duIj48L3NwYW4+PC9hPjwvdGQ+XG4JCQk8dGQ+Jm5ic3A7PC90ZD5cbgkJCTx0ZD48YSBuZy1jbGljaz0iZGVjcmVtZW50TWludXRlcygpIiBjbGFzcz0iYnRuIGJ0bi1saW5rIj48c3BhbiBjbGFzcz0iZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLWRvd24iPjwvc3Bhbj48L2E+PC90ZD5cbgkJCTx0ZCBuZy1zaG93PSJzaG93TWVyaWRpYW4iPjwvdGQ+XG4JCTwvdHI+XG4JPC90Ym9keT5cbjwvdGFibGU+XG4nKX1dKSxhbmd1bGFyLm1vZHVsZSgidGVtcGxhdGUvdHlwZWFoZWFkL3R5cGVhaGVhZC1tYXRjaC5odG1sIixbXSkucnVuKFsiJHRlbXBsYXRlQ2FjaGUiLGZ1bmN0aW9uKGEpe2EucHV0KCJ0ZW1wbGF0ZS90eXBlYWhlYWQvdHlwZWFoZWFkLW1hdGNoLmh0bWwiLCc8YSB0YWJpbmRleD0iLTEiIGJpbmQtaHRtbC11bnNhZmU9Im1hdGNoLmxhYmVsIHwgdHlwZWFoZWFkSGlnaGxpZ2h0OnF1ZXJ5Ij48L2E+Jyl9XSksYW5ndWxhci5tb2R1bGUoInRlbXBsYXRlL3R5cGVhaGVhZC90eXBlYWhlYWQtcG9wdXAuaHRtbCIsW10pLnJ1bihbIiR0ZW1wbGF0ZUNhY2hlIixmdW5jdGlvbihhKXthLnB1dCgidGVtcGxhdGUvdHlwZWFoZWFkL3R5cGVhaGVhZC1wb3B1cC5odG1sIiwnPHVsIGNsYXNzPSJkcm9wZG93bi1tZW51IiBuZy1pZj0iaXNPcGVuKCkiIG5nLXN0eWxlPSJ7dG9wOiBwb3NpdGlvbi50b3ArXCdweFwnLCBsZWZ0OiBwb3NpdGlvbi5sZWZ0K1wncHhcJ30iIHN0eWxlPSJkaXNwbGF5OiBibG9jazsiIHJvbGU9Imxpc3Rib3giIGFyaWEtaGlkZGVuPSJ7eyFpc09wZW4oKX19Ij5cbiAgICA8bGkgbmctcmVwZWF0PSJtYXRjaCBpbiBtYXRjaGVzIHRyYWNrIGJ5ICRpbmRleCIgbmctY2xhc3M9InthY3RpdmU6IGlzQWN0aXZlKCRpbmRleCkgfSIgbmctbW91c2VlbnRlcj0ic2VsZWN0QWN0aXZlKCRpbmRleCkiIG5nLWNsaWNrPSJzZWxlY3RNYXRjaCgkaW5kZXgpIiByb2xlPSJvcHRpb24iIGlkPSJ7e21hdGNoLmlkfX0iPlxuICAgICAgICA8ZGl2IHR5cGVhaGVhZC1tYXRjaCBpbmRleD0iJGluZGV4IiBtYXRjaD0ibWF0Y2giIHF1ZXJ5PSJxdWVyeSIgdGVtcGxhdGUtdXJsPSJ0ZW1wbGF0ZVVybCI+PC9kaXY+XG4gICAgPC9saT5cbjwvdWw+JykKK31dKTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGFibGVzLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RhYmxlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmUzYjVjCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RhYmxlcy5weQpAQCAtMCwwICsxLDQ1MyBAQAorIworIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyMKKyMgQml0QmFrZSBUb2FzdGVyIEltcGxlbWVudGF0aW9uCisjCisjIENvcHlyaWdodCAoQykgMjAxNSAgICAgICAgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2Zyb20gdG9hc3Rlcmd1aS53aWRnZXRzIGltcG9ydCBUb2FzdGVyVGFibGUKK2Zyb20gb3JtLm1vZGVscyBpbXBvcnQgUmVjaXBlLCBQcm9qZWN0TGF5ZXIsIExheWVyX1ZlcnNpb24sIE1hY2hpbmUsIFByb2plY3QKK2Zyb20gZGphbmdvLmRiLm1vZGVscyBpbXBvcnQgUSwgTWF4Citmcm9tIGRqYW5nby5jb25mLnVybHMgaW1wb3J0IHVybAorZnJvbSBkamFuZ28uY29yZS51cmxyZXNvbHZlcnMgaW1wb3J0IHJldmVyc2UKK2Zyb20gZGphbmdvLnZpZXdzLmdlbmVyaWMgaW1wb3J0IFRlbXBsYXRlVmlldworCisKK2NsYXNzIFByb2plY3RGaWx0ZXJzTWl4aW4ob2JqZWN0KToKKyAgICAiIiJDb21tb24gbWl4aW4gZm9yIHJlY2lwZSwgbWFjaGluZSBpbiBwcm9qZWN0IGZpbHRlcnMiIiIKKworICAgIGRlZiBmaWx0ZXJfaW5fcHJvamVjdChzZWxmLCBjb3VudF9vbmx5PUZhbHNlKToKKyAgICAgICAgcXVlcnkgPSBzZWxmLnF1ZXJ5c2V0LmZpbHRlcihsYXllcl92ZXJzaW9uX19pbj1zZWxmLnByb2plY3RfbGF5ZXJzKQorICAgICAgICBpZiBjb3VudF9vbmx5OgorICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5LmNvdW50KCkKKworICAgICAgICBzZWxmLnF1ZXJ5c2V0ID0gcXVlcnkKKworICAgIGRlZiBmaWx0ZXJfbm90X2luX3Byb2plY3Qoc2VsZiwgY291bnRfb25seT1GYWxzZSk6CisgICAgICAgIHF1ZXJ5ID0gc2VsZi5xdWVyeXNldC5leGNsdWRlKGxheWVyX3ZlcnNpb25fX2luPXNlbGYucHJvamVjdF9sYXllcnMpCisgICAgICAgIGlmIGNvdW50X29ubHk6CisgICAgICAgICAgICByZXR1cm4gcXVlcnkuY291bnQoKQorCisgICAgICAgIHNlbGYucXVlcnlzZXQgPSBxdWVyeQorCitjbGFzcyBMYXllcnNUYWJsZShUb2FzdGVyVGFibGUpOgorICAgICIiIlRhYmxlIG9mIGxheWVycyBpbiBUb2FzdGVyIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgc3VwZXIoTGF5ZXJzVGFibGUsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykKKyAgICAgICAgc2VsZi5kZWZhdWx0X29yZGVyYnkgPSAibGF5ZXJfX25hbWUiCisKKyAgICBkZWYgZ2V0X2NvbnRleHRfZGF0YShzZWxmLCAqKmt3YXJncyk6CisgICAgICAgIGNvbnRleHQgPSBzdXBlcihMYXllcnNUYWJsZSwgc2VsZikuZ2V0X2NvbnRleHRfZGF0YSgqKmt3YXJncykKKworICAgICAgICBwcm9qZWN0ID0gUHJvamVjdC5vYmplY3RzLmdldChwaz1rd2FyZ3NbJ3BpZCddKQorCisgICAgICAgIGNvbnRleHRbJ3Byb2plY3QnXSA9IHByb2plY3QKKyAgICAgICAgY29udGV4dFsncHJvamVjdGxheWVycyddID0gbWFwKGxhbWJkYSBwcmpsYXllcjogcHJqbGF5ZXIubGF5ZXJjb21taXQuaWQsIFByb2plY3RMYXllci5vYmplY3RzLmZpbHRlcihwcm9qZWN0PXByb2plY3QpKQorCisgICAgICAgIHJldHVybiBjb250ZXh0CisKKworICAgIGRlZiBzZXR1cF9maWx0ZXJzKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHByb2plY3QgPSBQcm9qZWN0Lm9iamVjdHMuZ2V0KHBrPWt3YXJnc1sncGlkJ10pCisgICAgICAgIHNlbGYucHJvamVjdF9sYXllcnMgPSBQcm9qZWN0TGF5ZXIub2JqZWN0cy5maWx0ZXIocHJvamVjdD1wcm9qZWN0KQorCisKKyAgICAgICAgc2VsZi5hZGRfZmlsdGVyKHRpdGxlPSJGaWx0ZXIgYnkgcHJvamVjdCBsYXllcnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iaW5fY3VycmVudF9wcm9qZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9hY3Rpb25zPVsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1ha2VfZmlsdGVyX2FjdGlvbigiaW5fcHJvamVjdCIsICJMYXllcnMgYWRkZWQgdG8gdGhpcyBwcm9qZWN0Iiwgc2VsZi5maWx0ZXJfaW5fcHJvamVjdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tYWtlX2ZpbHRlcl9hY3Rpb24oIm5vdF9pbl9wcm9qZWN0IiwgIkxheWVycyBub3QgYWRkZWQgdG8gdGhpcyBwcm9qZWN0Iiwgc2VsZi5maWx0ZXJfbm90X2luX3Byb2plY3QpCisgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgZGVmIGZpbHRlcl9pbl9wcm9qZWN0KHNlbGYsIGNvdW50X29ubHk9RmFsc2UpOgorICAgICAgICBxdWVyeSA9IHNlbGYucXVlcnlzZXQuZmlsdGVyKHByb2plY3RsYXllcl9faW49c2VsZi5wcm9qZWN0X2xheWVycykKKyAgICAgICAgaWYgY291bnRfb25seToKKyAgICAgICAgICAgIHJldHVybiBxdWVyeS5jb3VudCgpCisKKyAgICAgICAgc2VsZi5xdWVyeXNldCA9IHF1ZXJ5CisKKyAgICBkZWYgZmlsdGVyX25vdF9pbl9wcm9qZWN0KHNlbGYsIGNvdW50X29ubHk9RmFsc2UpOgorICAgICAgICBxdWVyeSA9IHNlbGYucXVlcnlzZXQuZXhjbHVkZShwcm9qZWN0bGF5ZXJfX2luPXNlbGYucHJvamVjdF9sYXllcnMpCisgICAgICAgIGlmIGNvdW50X29ubHk6CisgICAgICAgICAgICByZXR1cm4gcXVlcnkuY291bnQoKQorCisgICAgICAgIHNlbGYucXVlcnlzZXQgPSBxdWVyeQorCisKKyAgICBkZWYgc2V0dXBfcXVlcnlzZXQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcHJqID0gUHJvamVjdC5vYmplY3RzLmdldChwayA9IGt3YXJnc1sncGlkJ10pCisgICAgICAgIGNvbXBhdGlibGVfbGF5ZXJzID0gcHJqLmNvbXBhdGlibGVfbGF5ZXJ2ZXJzaW9ucygpCisKKyAgICAgICAgc2VsZi5xdWVyeXNldCA9IGNvbXBhdGlibGVfbGF5ZXJzLm9yZGVyX2J5KHNlbGYuZGVmYXVsdF9vcmRlcmJ5KQorCisgICAgZGVmIHNldHVwX2NvbHVtbnMoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKworICAgICAgICBsYXllcl9saW5rX3RlbXBsYXRlID0gJycnCisgICAgICAgIDxhIGhyZWY9InslIHVybCAnbGF5ZXJkZXRhaWxzJyBleHRyYS5waWQgZGF0YS5pZCAlfSI+CisgICAgICAgICAge3tkYXRhLmxheWVyLm5hbWV9fQorICAgICAgICA8L2E+CisgICAgICAgICcnJworCisgICAgICAgIHNlbGYuYWRkX2NvbHVtbih0aXRsZT0iTGF5ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgaGlkZWFibGU9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcmFibGU9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19kYXRhX25hbWU9ImxheWVyX19uYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19kYXRhX3RlbXBsYXRlPWxheWVyX2xpbmtfdGVtcGxhdGUpCisKKyAgICAgICAgc2VsZi5hZGRfY29sdW1uKHRpdGxlPSJTdW1tYXJ5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX25hbWU9ImxheWVyX19zdW1tYXJ5IikKKworICAgICAgICBnaXRfdXJsX3RlbXBsYXRlID0gJycnCisgICAgICAgIDxhIGhyZWY9InslIHVybCAnbGF5ZXJkZXRhaWxzJyBleHRyYS5waWQgZGF0YS5pZCAlfSI+CisgICAgICAgICAgPGNvZGU+e3tkYXRhLmxheWVyLnZjc191cmx9fTwvY29kZT4KKyAgICAgICAgPC9hPgorICAgICAgICB7JSBpZiBkYXRhLmdldF92Y3NfbGlua191cmwgJX0KKyAgICAgICAgPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Int7IGRhdGEuZ2V0X3Zjc19saW5rX3VybCB9fSI+CisgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLXNoYXJlIGdldC1pbmZvIj48L2k+CisgICAgICAgIDwvYT4KKyAgICAgICAgeyUgZW5kaWYgJX0KKyAgICAgICAgJycnCisKKyAgICAgICAgc2VsZi5hZGRfY29sdW1uKHRpdGxlPSJHaXQgcmVwb3NpdG9yeSBVUkwiLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscF90ZXh0PSJUaGUgR2l0IHJlcG9zaXRvcnkgZm9yIHRoZSBsYXllciBzb3VyY2UgY29kZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW49VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19kYXRhX25hbWU9ImxheWVyX192Y3NfdXJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19kYXRhX3RlbXBsYXRlPWdpdF91cmxfdGVtcGxhdGUpCisKKyAgICAgICAgZ2l0X2Rpcl90ZW1wbGF0ZSA9ICcnJworICAgICAgICA8YSBocmVmPSJ7JSB1cmwgJ2xheWVyZGV0YWlscycgZXh0cmEucGlkIGRhdGEuaWQgJX0iPgorICAgICAgICAgPGNvZGU+e3tkYXRhLmRpcnBhdGh9fTwvY29kZT4KKyAgICAgICAgPC9hPgorICAgICAgICB7JSBpZiBkYXRhLmRpcnBhdGggYW5kIGRhdGEuZ2V0X3Zjc19kaXJwYXRoX2xpbmtfdXJsICV9CisgICAgICAgIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJ7eyBkYXRhLmdldF92Y3NfZGlycGF0aF9saW5rX3VybCB9fSI+CisgICAgICAgICAgPGkgY2xhc3M9Imljb24tc2hhcmUgZ2V0LWluZm8iPjwvaT4KKyAgICAgICAgPC9hPgorICAgICAgICB7JSBlbmRpZiAlfScnJworCisgICAgICAgIHNlbGYuYWRkX2NvbHVtbih0aXRsZT0iU3ViZGlyZWN0b3J5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHBfdGV4dD0iVGhlIGxheWVyIGRpcmVjdG9yeSB3aXRoaW4gdGhlIEdpdCByZXBvc2l0b3J5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbj1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2RhdGFfbmFtZT0iZ2l0X3N1YmRpciIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfZGF0YV90ZW1wbGF0ZT1naXRfZGlyX3RlbXBsYXRlKQorCisgICAgICAgIHJldmlzaW9uX3RlbXBsYXRlID0gICcnJworICAgICAgICB7JSBsb2FkIHByb2plY3R0YWdzICAlfQorICAgICAgICB7JSB3aXRoIHZjc19yZWY9ZGF0YS5nZXRfdmNzX3JlZmVyZW5jZSAlfQorICAgICAgICB7JSBpZiB2Y3NfcmVmfGlzX3NoYWlkICV9CisgICAgICAgIDxhIGNsYXNzPSJidG4iIGRhdGEtY29udGVudD0iPHVsIGNsYXNzPSd1bnN0eWxlZCc+IDxsaT57e3Zjc19yZWZ9fTwvbGk+IDwvdWw+Ij4KKyAgICAgICAge3t2Y3NfcmVmfHRydW5jYXRlY2hhcnM6MTB9fQorICAgICAgICA8L2E+CisgICAgICAgIHslIGVsc2UgJX0KKyAgICAgICAge3t2Y3NfcmVmfX0KKyAgICAgICAgeyUgZW5kaWYgJX0KKyAgICAgICAgeyUgZW5kd2l0aCAlfQorICAgICAgICAnJycKKworICAgICAgICBzZWxmLmFkZF9jb2x1bW4odGl0bGU9IlJldmlzaW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHBfdGV4dD0iVGhlIEdpdCBicmFuY2gsIHRhZyBvciBjb21taXQuIEZvciB0aGUgbGF5ZXJzIGZyb20gdGhlIE9wZW5FbWJlZGRlZCBsYXllciBzb3VyY2UsIHRoZSByZXZpc2lvbiBpcyBhbHdheXMgdGhlIGJyYW5jaCBjb21wYXRpYmxlIHdpdGggdGhlIFlvY3RvIFByb2plY3QgdmVyc2lvbiB5b3Ugc2VsZWN0ZWQgZm9yIHRoaXMgcHJvamVjdCIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfZGF0YV9uYW1lPSJyZXZpc2lvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfZGF0YV90ZW1wbGF0ZT1yZXZpc2lvbl90ZW1wbGF0ZSkKKworICAgICAgICBkZXBzX3RlbXBsYXRlID0gJycnCisgICAgICAgIHslIHdpdGggb2RzPWRhdGEuZGVwZW5kZW5jaWVzLmFsbCV9CisgICAgICAgIHslIGlmIG9kcy5jb3VudCAlfQorICAgICAgICAgICAgPGEgY2xhc3M9ImJ0biIgdGl0bGU9IjxhIGhyZWY9J3slIHVybCAibGF5ZXJkZXRhaWxzIiBleHRyYS5waWQgZGF0YS5pZCAlfSc+e3tkYXRhLmxheWVyLm5hbWV9fTwvYT4gZGVwZW5kZW5jaWVzIgorICAgICAgICBkYXRhLWNvbnRlbnQ9Ijx1bCBjbGFzcz0ndW5zdHlsZWQnPgorICAgICAgICB7JSBmb3IgaSBpbiBvZHMlfQorICAgICAgICA8bGk+PGEgaHJlZj0neyUgdXJsICJsYXllcmRldGFpbHMiIGV4dHJhLnBpZCBpLmRlcGVuZHNfb24ucGsgJX0nPnt7aS5kZXBlbmRzX29uLmxheWVyLm5hbWV9fTwvYT48L2xpPgorICAgICAgICB7JSBlbmRmb3IgJX0KKyAgICAgICAgPC91bD4iPgorICAgICAgICB7e29kcy5jb3VudH19CisgICAgICAgIDwvYT4KKyAgICAgICAgeyUgZW5kaWYgJX0KKyAgICAgICAgeyUgZW5kd2l0aCAlfQorICAgICAgICAnJycKKworICAgICAgICBzZWxmLmFkZF9jb2x1bW4odGl0bGU9IkRlcGVuZGVuY2llcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwX3RleHQ9Ik90aGVyIGxheWVycyBhIGxheWVyIGRlcGVuZHMgdXBvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfZGF0YV9uYW1lPSJkZXBlbmRlbmNpZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2RhdGFfdGVtcGxhdGU9ZGVwc190ZW1wbGF0ZSkKKworICAgICAgICBzZWxmLmFkZF9jb2x1bW4odGl0bGU9IkFkZCB8IERlbGV0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwX3RleHQ9IkFkZCBvciBkZWxldGUgbGF5ZXJzIHRvIC8gZnJvbSB5b3VyIHByb2plY3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgaGlkZWFibGU9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbmFtZT0iaW5fY3VycmVudF9wcm9qZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19kYXRhX25hbWU9ImFkZC1kZWwtbGF5ZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19kYXRhX3RlbXBsYXRlPSd7JSBpbmNsdWRlICJsYXllcl9idG4uaHRtbCIgJX0nKQorCisgICAgICAgIHByb2plY3QgPSBQcm9qZWN0Lm9iamVjdHMuZ2V0KHBrPWt3YXJnc1sncGlkJ10pCisgICAgICAgIHNlbGYuYWRkX2NvbHVtbih0aXRsZT0iTGF5ZXJEZXRhaWxzVXJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlhYmxlID0gRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9uYW1lPSJsYXllcmRldGFpbHVybCIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRhdGlvbiA9IGxhbWJkYSB4OiByZXZlcnNlKCdsYXllcmRldGFpbHMnLCBhcmdzPShwcm9qZWN0LmlkLCB4LmlkKSkpCisKKyAgICAgICAgc2VsZi5hZGRfY29sdW1uKHRpdGxlPSJuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlhYmxlID0gRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9uYW1lPSJuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGF0aW9uID0gbGFtYmRhIHg6IHgubGF5ZXIubmFtZSkKKworCitjbGFzcyBNYWNoaW5lc1RhYmxlKFRvYXN0ZXJUYWJsZSwgUHJvamVjdEZpbHRlcnNNaXhpbik6CisgICAgIiIiVGFibGUgb2YgTWFjaGluZXMgaW4gVG9hc3RlciIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHN1cGVyKE1hY2hpbmVzVGFibGUsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykKKyAgICAgICAgc2VsZi5lbXB0eV9zdGF0ZSA9ICJObyBtYWNoaW5lcyBtYXliZSB5b3UgbmVlZCB0byBkbyBhIGJ1aWxkPyIKKyAgICAgICAgc2VsZi5kZWZhdWx0X29yZGVyYnkgPSAibmFtZSIKKworICAgIGRlZiBnZXRfY29udGV4dF9kYXRhKHNlbGYsICoqa3dhcmdzKToKKyAgICAgICAgY29udGV4dCA9IHN1cGVyKE1hY2hpbmVzVGFibGUsIHNlbGYpLmdldF9jb250ZXh0X2RhdGEoKiprd2FyZ3MpCisgICAgICAgIGNvbnRleHRbJ3Byb2plY3QnXSA9IFByb2plY3Qub2JqZWN0cy5nZXQocGs9a3dhcmdzWydwaWQnXSkKKyAgICAgICAgY29udGV4dFsncHJvamVjdGxheWVycyddID0gbWFwKGxhbWJkYSBwcmpsYXllcjogcHJqbGF5ZXIubGF5ZXJjb21taXQuaWQsIFByb2plY3RMYXllci5vYmplY3RzLmZpbHRlcihwcm9qZWN0PWNvbnRleHRbJ3Byb2plY3QnXSkpCisgICAgICAgIHJldHVybiBjb250ZXh0CisKKyAgICBkZWYgc2V0dXBfZmlsdGVycyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBwcm9qZWN0ID0gUHJvamVjdC5vYmplY3RzLmdldChwaz1rd2FyZ3NbJ3BpZCddKQorICAgICAgICBzZWxmLnByb2plY3RfbGF5ZXJzID0gcHJvamVjdC5wcm9qZWN0bGF5ZXJfZXF1aXZhbGVudF9zZXQoKQorCisgICAgICAgIHNlbGYuYWRkX2ZpbHRlcih0aXRsZT0iRmlsdGVyIGJ5IHByb2plY3QgbWFjaGluZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iaW5fY3VycmVudF9wcm9qZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9hY3Rpb25zPVsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1ha2VfZmlsdGVyX2FjdGlvbigiaW5fcHJvamVjdCIsICJNYWNoaW5lcyBwcm92aWRlZCBieSBsYXllcnMgYWRkZWQgdG8gdGhpcyBwcm9qZWN0Iiwgc2VsZi5maWx0ZXJfaW5fcHJvamVjdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tYWtlX2ZpbHRlcl9hY3Rpb24oIm5vdF9pbl9wcm9qZWN0IiwgIk1hY2hpbmVzIHByb3ZpZGVkIGJ5IGxheWVycyBub3QgYWRkZWQgdG8gdGhpcyBwcm9qZWN0Iiwgc2VsZi5maWx0ZXJfbm90X2luX3Byb2plY3QpCisgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgZGVmIHNldHVwX3F1ZXJ5c2V0KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHByaiA9IFByb2plY3Qub2JqZWN0cy5nZXQocGsgPSBrd2FyZ3NbJ3BpZCddKQorICAgICAgICBzZWxmLnF1ZXJ5c2V0ID0gcHJqLmdldF9hbGxfY29tcGF0aWJsZV9tYWNoaW5lcygpCisgICAgICAgIHNlbGYucXVlcnlzZXQgPSBzZWxmLnF1ZXJ5c2V0Lm9yZGVyX2J5KHNlbGYuZGVmYXVsdF9vcmRlcmJ5KQorCisgICAgZGVmIHNldHVwX2NvbHVtbnMoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKworICAgICAgICBzZWxmLmFkZF9jb2x1bW4odGl0bGU9Ik1hY2hpbmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgaGlkZWFibGU9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcmFibGU9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX25hbWU9Im5hbWUiKQorCisgICAgICAgIHNlbGYuYWRkX2NvbHVtbih0aXRsZT0iRGVzY3JpcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfbmFtZT0iZGVzY3JpcHRpb24iKQorCisgICAgICAgIGxheWVyX2xpbmtfdGVtcGxhdGUgPSAnJycKKyAgICAgICAgPGEgaHJlZj0ieyUgdXJsICdsYXllcmRldGFpbHMnIGV4dHJhLnBpZCBkYXRhLmxheWVyX3ZlcnNpb24uaWQgJX0iPgorICAgICAgICB7e2RhdGEubGF5ZXJfdmVyc2lvbi5sYXllci5uYW1lfX08L2E+CisgICAgICAgICcnJworCisgICAgICAgIHNlbGYuYWRkX2NvbHVtbih0aXRsZT0iTGF5ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2RhdGFfbmFtZT0ibGF5ZXJfdmVyc2lvbl9fbGF5ZXJfX25hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2RhdGFfdGVtcGxhdGU9bGF5ZXJfbGlua190ZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyYWJsZT1UcnVlKQorCisgICAgICAgIHNlbGYuYWRkX2NvbHVtbih0aXRsZT0iUmV2aXNpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscF90ZXh0PSJUaGUgR2l0IGJyYW5jaCwgdGFnIG9yIGNvbW1pdC4gRm9yIHRoZSBsYXllcnMgZnJvbSB0aGUgT3BlbkVtYmVkZGVkIGxheWVyIHNvdXJjZSwgdGhlIHJldmlzaW9uIGlzIGFsd2F5cyB0aGUgYnJhbmNoIGNvbXBhdGlibGUgd2l0aCB0aGUgWW9jdG8gUHJvamVjdCB2ZXJzaW9uIHlvdSBzZWxlY3RlZCBmb3IgdGhpcyBwcm9qZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbj1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfbmFtZT0ibGF5ZXJfdmVyc2lvbl9fZ2V0X3Zjc19yZWZlcmVuY2UiKQorCisgICAgICAgIG1hY2hpbmVfZmlsZV90ZW1wbGF0ZSA9ICcnJzxjb2RlPmNvbmYvbWFjaGluZS97e2RhdGEubmFtZX19LmNvbmY8L2NvZGU+CisgICAgICAgIDxhIGhyZWY9Int7ZGF0YS5nZXRfdmNzX21hY2hpbmVfZmlsZV9saW5rX3VybH19IiB0YXJnZXQ9Il9ibGFuayI+PGkgY2xhc3M9Imljb24tc2hhcmUgZ2V0LWluZm8iPjwvaT48L2E+JycnCisKKyAgICAgICAgc2VsZi5hZGRfY29sdW1uKHRpdGxlPSJNYWNoaW5lIGZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfZGF0YV9uYW1lPSJtYWNoaW5lZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfZGF0YV90ZW1wbGF0ZT1tYWNoaW5lX2ZpbGVfdGVtcGxhdGUpCisKKyAgICAgICAgc2VsZi5hZGRfY29sdW1uKHRpdGxlPSJTZWxlY3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscF90ZXh0PSJTZXRzIHRoZSBzZWxlY3RlZCBtYWNoaW5lIGFzIHRoZSBwcm9qZWN0IG1hY2hpbmUuIFlvdSBjYW4gb25seSBoYXZlIG9uZSBtYWNoaW5lIHBlciBwcm9qZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpZGVhYmxlPUZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX25hbWU9ImluX2N1cnJlbnRfcHJvamVjdCIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfZGF0YV9uYW1lPSJhZGQtZGVsLWxheWVycyIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfZGF0YV90ZW1wbGF0ZT0neyUgaW5jbHVkZSAibWFjaGluZV9idG4uaHRtbCIgJX0nKQorCisKK2NsYXNzIExheWVyTWFjaGluZXNUYWJsZShNYWNoaW5lc1RhYmxlKToKKyAgICAiIiIgU21hbGxlciB2ZXJzaW9uIG9mIHRoZSBNYWNoaW5lcyB0YWJsZSBmb3IgdXNlIGluIGxheWVyIGRldGFpbHMgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgc3VwZXIoTGF5ZXJNYWNoaW5lc1RhYmxlLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCisKKyAgICBkZWYgZ2V0X2NvbnRleHRfZGF0YShzZWxmLCAqKmt3YXJncyk6CisgICAgICAgIGNvbnRleHQgPSBzdXBlcihMYXllck1hY2hpbmVzVGFibGUsIHNlbGYpLmdldF9jb250ZXh0X2RhdGEoKiprd2FyZ3MpCisgICAgICAgIGNvbnRleHRbJ2xheWVydmVyc2lvbiddID0gTGF5ZXJfVmVyc2lvbi5vYmplY3RzLmdldChwaz1rd2FyZ3NbJ2xheWVyaWQnXSkKKyAgICAgICAgcmV0dXJuIGNvbnRleHQKKworCisgICAgZGVmIHNldHVwX3F1ZXJ5c2V0KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIE1hY2hpbmVzVGFibGUuc2V0dXBfcXVlcnlzZXQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQorCisgICAgICAgIHNlbGYucXVlcnlzZXQgPSBzZWxmLnF1ZXJ5c2V0LmZpbHRlcihsYXllcl92ZXJzaW9uX19waz1pbnQoa3dhcmdzWydsYXllcmlkJ10pKQorICAgICAgICBzZWxmLnN0YXRpY19jb250ZXh0X2V4dHJhWydpbl9wcmonXSA9IFByb2plY3RMYXllci5vYmplY3RzLmZpbHRlcihRKHByb2plY3Q9a3dhcmdzWydwaWQnXSkgJiBRKGxheWVyY29tbWl0PWt3YXJnc1snbGF5ZXJpZCddKSkuY291bnQoKQorCisgICAgZGVmIHNldHVwX2NvbHVtbnMoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgc2VsZi5hZGRfY29sdW1uKHRpdGxlPSJNYWNoaW5lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpZGVhYmxlPUZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJhYmxlPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9uYW1lPSJuYW1lIikKKworICAgICAgICBzZWxmLmFkZF9jb2x1bW4odGl0bGU9IkRlc2NyaXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX25hbWU9ImRlc2NyaXB0aW9uIikKKworICAgICAgICBzZWxlY3RfYnRuX3RlbXBsYXRlID0gJzxhIGhyZWY9InslIHVybCAicHJvamVjdCIgZXh0cmEucGlkICV9P3NldE1hY2hpbmU9e3tkYXRhLm5hbWV9fSIgY2xhc3M9ImJ0biBidG4tYmxvY2sgc2VsZWN0LW1hY2hpbmUtYnRuIiB7JSBpZiBleHRyYS5pbl9wcmogPT0gMCV9ZGlzYWJsZWQ9ImRpc2FibGVkInslZW5kaWYlfT5TZWxlY3QgbWFjaGluZTwvYT4nCisKKyAgICAgICAgc2VsZi5hZGRfY29sdW1uKHRpdGxlPSJTZWxlY3QgbWFjaGluZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfZGF0YV9uYW1lPSJhZGQtZGVsLWxheWVycyIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfZGF0YV90ZW1wbGF0ZT1zZWxlY3RfYnRuX3RlbXBsYXRlKQorCisKK2NsYXNzIFJlY2lwZXNUYWJsZShUb2FzdGVyVGFibGUsIFByb2plY3RGaWx0ZXJzTWl4aW4pOgorICAgICIiIlRhYmxlIG9mIFJlY2lwZXMgaW4gVG9hc3RlciIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHN1cGVyKFJlY2lwZXNUYWJsZSwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICBzZWxmLmVtcHR5X3N0YXRlID0gIlRvYXN0ZXIgaGFzIG5vIHJlY2lwZSBpbmZvcm1hdGlvbi4gVG8gZ2VuZXJhdGUgcmVjaXBlIGluZm9ybWF0aW9uIHlvdSBjYW4gY29uZmlndXJlIGEgbGF5ZXIgc291cmNlIHRoZW4gcnVuIGEgYnVpbGQuIgorICAgICAgICBzZWxmLmRlZmF1bHRfb3JkZXJieSA9ICJuYW1lIgorCisgICAgZGVmIGdldF9jb250ZXh0X2RhdGEoc2VsZiwgKiprd2FyZ3MpOgorICAgICAgICBwcm9qZWN0ID0gUHJvamVjdC5vYmplY3RzLmdldChwaz1rd2FyZ3NbJ3BpZCddKQorICAgICAgICBjb250ZXh0ID0gc3VwZXIoUmVjaXBlc1RhYmxlLCBzZWxmKS5nZXRfY29udGV4dF9kYXRhKCoqa3dhcmdzKQorCisgICAgICAgIGNvbnRleHRbJ3Byb2plY3QnXSA9IHByb2plY3QKKworICAgICAgICBjb250ZXh0Wydwcm9qZWN0bGF5ZXJzJ10gPSBtYXAobGFtYmRhIHByamxheWVyOiBwcmpsYXllci5sYXllcmNvbW1pdC5pZCwgUHJvamVjdExheWVyLm9iamVjdHMuZmlsdGVyKHByb2plY3Q9Y29udGV4dFsncHJvamVjdCddKSkKKworICAgICAgICByZXR1cm4gY29udGV4dAorCisgICAgZGVmIHNldHVwX2ZpbHRlcnMoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcHJvamVjdCA9IFByb2plY3Qub2JqZWN0cy5nZXQocGs9a3dhcmdzWydwaWQnXSkKKyAgICAgICAgc2VsZi5wcm9qZWN0X2xheWVycyA9IHByb2plY3QucHJvamVjdGxheWVyX2VxdWl2YWxlbnRfc2V0KCkKKworICAgICAgICBzZWxmLmFkZF9maWx0ZXIodGl0bGU9IkZpbHRlciBieSBwcm9qZWN0IHJlY2lwZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iaW5fY3VycmVudF9wcm9qZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9hY3Rpb25zPVsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1ha2VfZmlsdGVyX2FjdGlvbigiaW5fcHJvamVjdCIsICJSZWNpcGVzIHByb3ZpZGVkIGJ5IGxheWVycyBhZGRlZCB0byB0aGlzIHByb2plY3QiLCBzZWxmLmZpbHRlcl9pbl9wcm9qZWN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1ha2VfZmlsdGVyX2FjdGlvbigibm90X2luX3Byb2plY3QiLCAiUmVjaXBlcyBwcm92aWRlZCBieSBsYXllcnMgbm90IGFkZGVkIHRvIHRoaXMgcHJvamVjdCIsIHNlbGYuZmlsdGVyX25vdF9pbl9wcm9qZWN0KQorICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworCisgICAgZGVmIHNldHVwX3F1ZXJ5c2V0KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHByaiA9IFByb2plY3Qub2JqZWN0cy5nZXQocGsgPSBrd2FyZ3NbJ3BpZCddKQorCisgICAgICAgIHNlbGYucXVlcnlzZXQgPSBwcmouZ2V0X2FsbF9jb21wYXRpYmxlX3JlY2lwZXMoKQorICAgICAgICBzZWxmLnF1ZXJ5c2V0ID0gc2VsZi5xdWVyeXNldC5vcmRlcl9ieShzZWxmLmRlZmF1bHRfb3JkZXJieSkKKworCisgICAgZGVmIHNldHVwX2NvbHVtbnMoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKworICAgICAgICBzZWxmLmFkZF9jb2x1bW4odGl0bGU9IlJlY2lwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwX3RleHQ9IkluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIHBpZWNlIG9mIHNvZnR3YXJlLCBpbmNsdWRpbmcgd2hlcmUgdG8gZG93bmxvYWQgdGhlIHNvdXJjZSwgY29uZmlndXJhdGlvbiBvcHRpb25zLCBob3cgdG8gY29tcGlsZSB0aGUgc291cmNlIGZpbGVzIGFuZCBob3cgdG8gcGFja2FnZSB0aGUgY29tcGlsZWQgb3V0cHV0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpZGVhYmxlPUZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJhYmxlPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9uYW1lPSJuYW1lIikKKworICAgICAgICBzZWxmLmFkZF9jb2x1bW4odGl0bGU9IlJlY2lwZSBWZXJzaW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbj1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfbmFtZT0idmVyc2lvbiIpCisKKyAgICAgICAgc2VsZi5hZGRfY29sdW1uKHRpdGxlPSJEZXNjcmlwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9uYW1lPSJnZXRfZGVzY3JpcHRpb25fb3Jfc3VtbWFyeSIpCisKKyAgICAgICAgcmVjaXBlX2ZpbGVfdGVtcGxhdGUgPSAnJycKKyAgICAgICAgPGNvZGU+e3tkYXRhLmZpbGVfcGF0aH19PC9jb2RlPgorICAgICAgICA8YSBocmVmPSJ7e2RhdGEuZ2V0X3Zjc19yZWNpcGVfZmlsZV9saW5rX3VybH19IiB0YXJnZXQ9Il9ibGFuayI+CisgICAgICAgICAgPGkgY2xhc3M9Imljb24tc2hhcmUgZ2V0LWluZm8iPjwvaT4KKyAgICAgICAgPC9hPgorICAgICAgICAgJycnCisKKyAgICAgICAgc2VsZi5hZGRfY29sdW1uKHRpdGxlPSJSZWNpcGUgZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwX3RleHQ9IlBhdGggdG8gdGhlIHJlY2lwZSAuYmIgZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW49VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19kYXRhX25hbWU9InJlY2lwZS1maWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19kYXRhX3RlbXBsYXRlPXJlY2lwZV9maWxlX3RlbXBsYXRlKQorCisgICAgICAgIHNlbGYuYWRkX2NvbHVtbih0aXRsZT0iU2VjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwX3RleHQ9IlRoZSBzZWN0aW9uIGluIHdoaWNoIHJlY2lwZXMgc2hvdWxkIGJlIGNhdGVnb3JpemVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyYWJsZT1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfbmFtZT0ic2VjdGlvbiIpCisKKyAgICAgICAgbGF5ZXJfbGlua190ZW1wbGF0ZSA9ICcnJworICAgICAgICA8YSBocmVmPSJ7JSB1cmwgJ2xheWVyZGV0YWlscycgZXh0cmEucGlkIGRhdGEubGF5ZXJfdmVyc2lvbi5pZCAlfSI+CisgICAgICAgIHt7ZGF0YS5sYXllcl92ZXJzaW9uLmxheWVyLm5hbWV9fTwvYT4KKyAgICAgICAgJycnCisKKyAgICAgICAgc2VsZi5hZGRfY29sdW1uKHRpdGxlPSJMYXllciIsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwX3RleHQ9IlRoZSBuYW1lIG9mIHRoZSBsYXllciBwcm92aWRpbmcgdGhlIHJlY2lwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcmFibGU9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19kYXRhX25hbWU9ImxheWVyX3ZlcnNpb25fX2xheWVyX19uYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19kYXRhX3RlbXBsYXRlPWxheWVyX2xpbmtfdGVtcGxhdGUpCisKKyAgICAgICAgc2VsZi5hZGRfY29sdW1uKHRpdGxlPSJMaWNlbnNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHBfdGV4dD0iVGhlIGxpc3Qgb2Ygc291cmNlIGxpY2Vuc2VzIGZvciB0aGUgcmVjaXBlLiBNdWx0aXBsZSBsaWNlbnNlIG5hbWVzIHNlcGFyYXRlZCBieSB0aGUgcGlwZSBjaGFyYWN0ZXIgaW5kaWNhdGVzIGEgY2hvaWNlIGJldHdlZW4gbGljZW5zZXMuIE11bHRpcGxlIGxpY2Vuc2UgbmFtZXMgc2VwYXJhdGVkIGJ5IHRoZSBhbXBlcnNhbmQgY2hhcmFjdGVyIGluZGljYXRlcyBtdWx0aXBsZSBsaWNlbnNlcyBleGlzdCB0aGF0IGNvdmVyIGRpZmZlcmVudCBwYXJ0cyBvZiB0aGUgc291cmNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyYWJsZT1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfbmFtZT0ibGljZW5zZSIpCisKKyAgICAgICAgc2VsZi5hZGRfY29sdW1uKHRpdGxlPSJSZXZpc2lvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9uYW1lPSJsYXllcl92ZXJzaW9uX19nZXRfdmNzX3JlZmVyZW5jZSIpCisKKyAgICAgICAgc2VsZi5hZGRfY29sdW1uKHRpdGxlPSJCdWlsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwX3RleHQ9IkFkZCBvciBkZWxldGUgcmVjaXBlcyB0byBhbmQgZnJvbSB5b3VyIHByb2plY3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgaGlkZWFibGU9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbmFtZT0iaW5fY3VycmVudF9wcm9qZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19kYXRhX25hbWU9ImFkZC1kZWwtbGF5ZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19kYXRhX3RlbXBsYXRlPSd7JSBpbmNsdWRlICJyZWNpcGVfYnRuLmh0bWwiICV9JykKKworICAgICAgICBwcm9qZWN0ID0gUHJvamVjdC5vYmplY3RzLmdldChwaz1rd2FyZ3NbJ3BpZCddKQorICAgICAgICBzZWxmLmFkZF9jb2x1bW4odGl0bGU9IlByb2plY3QgY29tcGF0aWJsZSBMYXllciBJRCIsCisgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5YWJsZSA9IEZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfbmFtZSA9ICJwcm9qZWN0Y29tcGF0aWJsZV9sYXllciIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRhdGlvbiA9IGxhbWJkYSB4OiAoeC5sYXllcl92ZXJzaW9uLmdldF9lcXVpdmFsZW50c193cHJpb3JpdHkocHJvamVjdClbMF0pKQorCitjbGFzcyBMYXllclJlY2lwZXNUYWJsZShSZWNpcGVzVGFibGUpOgorICAgICIiIiBTbWFsbGVyIHZlcnNpb24gb2YgdGhlIFJlY2lwZXMgdGFibGUgZm9yIHVzZSBpbiBsYXllciBkZXRhaWxzICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHN1cGVyKExheWVyUmVjaXBlc1RhYmxlLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCisKKyAgICBkZWYgZ2V0X2NvbnRleHRfZGF0YShzZWxmLCAqKmt3YXJncyk6CisgICAgICAgIGNvbnRleHQgPSBzdXBlcihMYXllclJlY2lwZXNUYWJsZSwgc2VsZikuZ2V0X2NvbnRleHRfZGF0YSgqKmt3YXJncykKKyAgICAgICAgY29udGV4dFsnbGF5ZXJ2ZXJzaW9uJ10gPSBMYXllcl9WZXJzaW9uLm9iamVjdHMuZ2V0KHBrPWt3YXJnc1snbGF5ZXJpZCddKQorICAgICAgICByZXR1cm4gY29udGV4dAorCisKKyAgICBkZWYgc2V0dXBfcXVlcnlzZXQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgUmVjaXBlc1RhYmxlLnNldHVwX3F1ZXJ5c2V0KHNlbGYsICphcmdzLCAqKmt3YXJncykKKyAgICAgICAgc2VsZi5xdWVyeXNldCA9IHNlbGYucXVlcnlzZXQuZmlsdGVyKGxheWVyX3ZlcnNpb25fX3BrPWludChrd2FyZ3NbJ2xheWVyaWQnXSkpCisKKyAgICAgICAgc2VsZi5zdGF0aWNfY29udGV4dF9leHRyYVsnaW5fcHJqJ10gPSBQcm9qZWN0TGF5ZXIub2JqZWN0cy5maWx0ZXIoUShwcm9qZWN0PWt3YXJnc1sncGlkJ10pICYgUShsYXllcmNvbW1pdD1rd2FyZ3NbJ2xheWVyaWQnXSkpLmNvdW50KCkKKworICAgIGRlZiBzZXR1cF9jb2x1bW5zKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHNlbGYuYWRkX2NvbHVtbih0aXRsZT0iUmVjaXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHBfdGV4dD0iSW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgcGllY2Ugb2Ygc29mdHdhcmUsIGluY2x1ZGluZyB3aGVyZSB0byBkb3dubG9hZCB0aGUgc291cmNlLCBjb25maWd1cmF0aW9uIG9wdGlvbnMsIGhvdyB0byBjb21waWxlIHRoZSBzb3VyY2UgZmlsZXMgYW5kIGhvdyB0byBwYWNrYWdlIHRoZSBjb21waWxlZCBvdXRwdXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgaGlkZWFibGU9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcmFibGU9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX25hbWU9Im5hbWUiKQorCisgICAgICAgIHNlbGYuYWRkX2NvbHVtbih0aXRsZT0iRGVzY3JpcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfbmFtZT0iZ2V0X2Rlc2NyaXB0aW9uX29yX3N1bW1hcnkiKQorCisKKyAgICAgICAgYnVpbGRfcmVjaXBlX3RlbXBsYXRlID0nPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1ibG9jayBidWlsZC1yZWNpcGUtYnRuIiBkYXRhLXJlY2lwZS1uYW1lPSJ7e2RhdGEubmFtZX19IiB7JWlmIGV4dHJhLmluX3ByaiA9PSAwICV9ZGlzYWJsZWQ9ImRpc2FibGVkInslZW5kaWYlfT5CdWlsZCByZWNpcGU8L2J1dHRvbj4nCisKKyAgICAgICAgc2VsZi5hZGRfY29sdW1uKHRpdGxlPSJCdWlsZCByZWNpcGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2RhdGFfbmFtZT0iYWRkLWRlbC1sYXllcnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2RhdGFfdGVtcGxhdGU9YnVpbGRfcmVjaXBlX3RlbXBsYXRlKQorCitjbGFzcyBQcm9qZWN0TGF5ZXJzUmVjaXBlc1RhYmxlKFJlY2lwZXNUYWJsZSk6CisgICAgIiIiIFRhYmxlIHRoYXQgbGlzdHMgb25seSByZWNpcGVzIGF2YWlsYWJsZSBmb3IgbGF5ZXJzIGFkZGVkIHRvIHRoZSBwcm9qZWN0ICIiIgorCisgICAgZGVmIHNldHVwX3F1ZXJ5c2V0KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHN1cGVyKFByb2plY3RMYXllcnNSZWNpcGVzVGFibGUsIHNlbGYpLnNldHVwX3F1ZXJ5c2V0KCphcmdzLCAqKmt3YXJncykKKyAgICAgICAgcHJqID0gUHJvamVjdC5vYmplY3RzLmdldChwayA9IGt3YXJnc1sncGlkJ10pCisgICAgICAgIHNlbGYucXVlcnlzZXQgPSBzZWxmLnF1ZXJ5c2V0LmZpbHRlcihsYXllcl92ZXJzaW9uX19pbiA9IHByai5wcm9qZWN0bGF5ZXJfZXF1aXZhbGVudF9zZXQoKSkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvYmFzZS5odG1sIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9iYXNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQwYmM0NwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvYmFzZS5odG1sCkBAIC0wLDAgKzEsMTgyIEBACis8IURPQ1RZUEUgaHRtbD4KK3slIGxvYWQgc3RhdGljICV9Cit7JSBsb2FkIHByb2plY3R0YWdzICV9Cis8aHRtbCBsYW5nPSJlbiI+CisgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT57JSBpZiBvYmplY3RuYW1lICV9IHt7b2JqZWN0bmFtZXx0aXRsZX19IC0geyUgZW5kaWYgJX1Ub2FzdGVyPC90aXRsZT4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0ieyUgc3RhdGljICdjc3MvYm9vdHN0cmFwLm1pbi5jc3MnICV9IiB0eXBlPSJ0ZXh0L2NzcyIvPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJ7JSBzdGF0aWMgJ2Nzcy9ib290c3RyYXAtcmVzcG9uc2l2ZS5taW4uY3NzJyAlfSIgdHlwZT0ndGV4dC9jc3MnLz4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0ieyUgc3RhdGljICdjc3MvZm9udC1hd2Vzb21lLm1pbi5jc3MnICV9IiB0eXBlPSd0ZXh0L2NzcycvPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJ7JSBzdGF0aWMgJ2Nzcy9wcmV0dGlmeS5jc3MnICV9IiB0eXBlPSd0ZXh0L2NzcycvPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJ7JSBzdGF0aWMgJ2Nzcy9kZWZhdWx0LmNzcycgJX0iIHR5cGU9J3RleHQvY3NzJy8+CisKKyAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCIgLz4KKyAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PVVURi04IiAvPgorICAgIDxzY3JpcHQgc3JjPSJ7JSBzdGF0aWMgJ2pzL2pxdWVyeS0yLjAuMy5taW4uanMnICV9Ij4KKyAgICA8L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0ieyUgc3RhdGljICdqcy9qcXVlcnkuY29va2llLmpzJyAlfSI+CisgICAgPC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9InslIHN0YXRpYyAnanMvYm9vdHN0cmFwLm1pbi5qcycgJX0iPgorICAgIDwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSJ7JSBzdGF0aWMgJ2pzL3ByZXR0aWZ5LmpzJyAlfSI+CisgICAgPC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9InslIHN0YXRpYyAnanMvbGlidG9hc3Rlci5qcycgJX0iPgorICAgIDwvc2NyaXB0PgorICAgIHslIGlmIERFQlVHICV9CisgICAgPHNjcmlwdD4KKyAgICAgIGxpYnRvYXN0ZXIuZGVidWcgPSB0cnVlOworICAgIDwvc2NyaXB0PgorICAgIHslIGVuZGlmICV9CisgICAgPHNjcmlwdD4KKyAgICAgIGxpYnRvYXN0ZXIuY3R4ID0geworICAgICAgICBqc1VybCA6ICJ7JSBzdGF0aWMgJ2pzLycgJX0iLAorICAgICAgICBodG1sVXJsIDogInslIHN0YXRpYyAnaHRtbC8nICV9IiwKKyAgICAgICAgcHJvamVjdHNVcmwgOiAieyUgdXJsICdhbGwtcHJvamVjdHMnICV9IiwKKyAgICAgICAgcHJvamVjdHNUeXBlQWhlYWRVcmw6IHslIHVybCAneGhyX3Byb2plY3RzdHlwZWFoZWFkJyBhcyBwcmp1cmwlfXt7cHJqdXJsfGpzb259fSwKKyAgICAgICAgeyUgaWYgcHJvamVjdC5pZCAlfQorICAgICAgICBwcm9qZWN0SWQgOiB7e3Byb2plY3QuaWR9fSwKKyAgICAgICAgcHJvamVjdFBhZ2VVcmwgOiB7JSB1cmwgJ3Byb2plY3QnIHByb2plY3QuaWQgYXMgcHVybCV9e3twdXJsfGpzb259fSwKKyAgICAgICAgcHJvamVjdE5hbWUgOiB7e3Byb2plY3QubmFtZXxqc29ufX0sCisgICAgICAgIHJlY2lwZXNUeXBlQWhlYWRVcmw6IHslIHVybCAneGhyX3JlY2lwZXN0eXBlYWhlYWQnIHByb2plY3QuaWQgYXMgcGF0dXJsJX17e3BhdHVybHxqc29ufX0sCisgICAgICAgIGxheWVyc1R5cGVBaGVhZFVybDogeyUgdXJsICd4aHJfbGF5ZXJzdHlwZWFoZWFkJyBwcm9qZWN0LmlkIGFzIHBhdHVybCV9e3twYXR1cmx8anNvbn19LAorICAgICAgICBtYWNoaW5lc1R5cGVBaGVhZFVybDogeyUgdXJsICd4aHJfbWFjaGluZXN0eXBlYWhlYWQnIHByb2plY3QuaWQgYXMgcGF0dXJsJX17e3BhdHVybHxqc29ufX0sCisKKyAgICAgICAgcHJvamVjdEJ1aWxkc1VybDogeyUgdXJsICdwcm9qZWN0YnVpbGRzJyBwcm9qZWN0LmlkIGFzIHBidXJsICV9e3twYnVybHxqc29ufX0sCisgICAgICAgIHByb2plY3RJZCA6IHt7cHJvamVjdC5pZH19LAorICAgICAgICB7JSBlbHNlICV9CisgICAgICAgIHByb2plY3RJZCA6IHVuZGVmaW5lZCwKKyAgICAgICAgcHJvamVjdFBhZ2VVcmwgOiB1bmRlZmluZWQsCisgICAgICAgIHByb2plY3ROYW1lIDogdW5kZWZpbmVkLAorICAgICAgICBwcm9qZWN0SWQgOiB1bmRlZmluZWQsCisgICAgICAgIHslIGVuZGlmICV9CisgICAgICB9OworICAgIDwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSJ7JSBzdGF0aWMgJ2pzL2Jhc2UuanMnICV9Ij48L3NjcmlwdD4KKyAgICA8c2NyaXB0PgorICAgICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCkgeworICAgICAgICAvKiBWYXJzIG5lZWRlZCBmb3IgYmFzZS5qcyAqLworICAgICAgICB2YXIgY3R4ID0ge307CisgICAgICAgIGN0eC5udW1Qcm9qZWN0cyA9IHt7cHJvamVjdHN8bGVuZ3RofX07CisgICAgICAgIGN0eC5jdXJyZW50VXJsID0gInt7cmVxdWVzdC5wYXRofGVzY2FwZWpzfX0iOworCisgICAgICAgIGJhc2VQYWdlSW5pdChjdHgpOworICAgICAgfSk7CisgICAgPC9zY3JpcHQ+CisKK3slIGJsb2NrIGV4dHJhaGVhZGNvbnRlbnQgJX0KK3slIGVuZGJsb2NrICV9CisgICAgPC9oZWFkPgorCis8Ym9keSBzdHlsZT0iaGVpZ2h0OiAxMDAlIj4KKworICB7JSBjc3JmX3Rva2VuICV9CisgIDxkaXYgaWQ9ImxvYWRpbmctbm90aWZpY2F0aW9uIiBjbGFzcz0iYWxlcnQgbGVhZCB0ZXh0LWNlbnRlciIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+CisgICAgTG9hZGluZyA8aSBjbGFzcz0iZmEtcHVsc2UgaWNvbi1zcGlubmVyIj48L2k+CisgIDwvZGl2PgorCisgIDxkaXYgaWQ9ImNoYW5nZS1ub3RpZmljYXRpb24iIGNsYXNzPSJhbGVydCBsZWFkIGFsZXJ0LWluZm8iIHN0eWxlPSJkaXNwbGF5Om5vbmUiPgorICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGlkPSJoaWRlLWFsZXJ0Ij4mdGltZXM7PC9idXR0b24+CisgICAgPHNwYW4gaWQ9ImNoYW5nZS1ub3RpZmljYXRpb24tbXNnIj48L3NwYW4+CisgIDwvZGl2PgorCisgICAgPGRpdiBjbGFzcz0ibmF2YmFyIG5hdmJhci1maXhlZC10b3AiPgorICAgICAgPGRpdiBjbGFzcz0ibmF2YmFyLWlubmVyIj4KKyAgICAgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyLWZsdWlkIj4KKyAgICAgICAgICA8YSBjbGFzcz0iYnJhbmQgbG9nbyIgaHJlZj0iIyI+PGltZyBzcmM9InslIHN0YXRpYyAnaW1nL2xvZ28ucG5nJyAlfSIgY2xhc3M9IiIgYWx0PSJZb2N0byBsb2dvIHByb2plY3QiLz48L2E+CisgICAgICAgICAgPHNwYW4gY2xhc3M9ImJyYW5kIj4KKyAgICAgICAgICAgIDxhIGhyZWY9Ii8iPlRvYXN0ZXI8L2E+CisgICAgICAgICAgICB7JSBpZiBERUJVRyAlfQorICAgICAgICAgICAgPGkgY2xhc3M9Imljb24taW5mby1zaWduIiB0aXRsZT0iPHN0cm9uZz5Ub2FzdGVyIHZlcnNpb24gaW5mb3JtYXRpb248L3N0cm9uZz4iIGRhdGEtY29udGVudD0iPGRsPjxkdD5CcmFuY2g8L2R0PjxkZD57e1RPQVNURVJfQlJBTkNIfX08L2RkPjxkdD5SZXZpc2lvbjwvZHQ+PGRkPnt7VE9BU1RFUl9SRVZJU0lPTn19PC9kZD48L2RsPiI+PC9pPgorICAgICAgICAgICAgeyUgZW5kaWYgJX0KKyAgICAgICAgICA8L3NwYW4+CisgICAgICAgICAgeyUgaWYgcmVxdWVzdC5yZXNvbHZlcl9tYXRjaC51cmxfbmFtZSAhPSAnbGFuZGluZycgYW5kIHJlcXVlc3QucmVzb2x2ZXJfbWF0Y2gudXJsX25hbWUgIT0gJ25ld3Byb2plY3QnICV9CisgICAgICAgICAgPHVsIGNsYXNzPSJuYXYiPgorICAgICAgICAgICAgPGxpICB7JSBpZiByZXF1ZXN0LnJlc29sdmVyX21hdGNoLnVybF9uYW1lID09ICdhbGwtYnVpbGRzJyAlfQorICAgICAgICAgICAgICAgIGNsYXNzPSJhY3RpdmUiCisgICAgICAgICAgICAgICAgeyUgZW5kaWYgJX0+CisgICAgICAgICAgICAgIDxhIGhyZWY9InslIHVybCAnYWxsLWJ1aWxkcycgJX0iPgorICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLXRhc2tzIj48L2k+CisgICAgICAgICAgICAgICAgQWxsIGJ1aWxkcworICAgICAgICAgICAgICA8L2E+CisgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgPGxpIHslIGlmIHJlcXVlc3QucmVzb2x2ZXJfbWF0Y2gudXJsX25hbWUgPT0gJ2FsbC1wcm9qZWN0cycgICV9CisgICAgICAgICAgICAgICAgY2xhc3M9ImFjdGl2ZSIKKyAgICAgICAgICAgICAgICB7JSBlbmRpZiAlfT4KKyAgICAgICAgICAgICAgPGEgaHJlZj0ieyUgdXJsICdhbGwtcHJvamVjdHMnICV9Ij4KKyAgICAgICAgICAgICAgICA8aSBjbGFzcz0iaWNvbi1mb2xkZXItb3BlbiI+PC9pPgorICAgICAgICAgICAgICAgIEFsbCBwcm9qZWN0cworICAgICAgICAgICAgICA8L2E+CisgICAgICAgICAgICA8L2xpPgorICAgICAgICAgIDwvdWw+CisgICAgICAgICAgeyUgZW5kaWYgJX0KKyAgICAgICAgICA8dWwgY2xhc3M9Im5hdiBwdWxsLXJpZ2h0Ij4KKyAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cueW9jdG9wcm9qZWN0Lm9yZy9kb2NzL2xhdGVzdC90b2FzdGVyLW1hbnVhbC90b2FzdGVyLW1hbnVhbC5odG1sIj4KKyAgICAgICAgICAgICAgICA8aSBjbGFzcz0iaWNvbi1ib29rIj48L2k+CisgICAgICAgICAgICAgICAgTWFudWFsCisgICAgICAgICAgICAgIDwvYT4KKyAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgPC91bD4KKyAgICAgICAgICA8c3BhbiBjbGFzcz0icHVsbC1yaWdodCBkaXZpZGVyLXZlcnRpY2FsIj48L3NwYW4+CisgICAgICAgICAgPGRpdiBjbGFzcz0iYnRuLWdyb3VwIHB1bGwtcmlnaHQiPgorICAgICAgICAgICAgPGEgY2xhc3M9ImJ0biIgaWQ9Im5ldy1wcm9qZWN0LWJ1dHRvbiIgaHJlZj0ieyUgdXJsICduZXdwcm9qZWN0JyAlfSI+TmV3IHByb2plY3Q8L2E+CisgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgPCEtLSBOZXcgYnVpbGQgcG9wb3ZlciAtLT4KKyAgICAgICAgICA8ZGl2IGNsYXNzPSJidG4tZ3JvdXAgcHVsbC1yaWdodCIgaWQ9Im5ldy1idWlsZC1idXR0b24iIHN0eWxlPSJkaXNwbGF5Om5vbmUiPgorICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGRyb3Bkb3duLXRvZ2dsZSIgZGF0YS10b2dnbGU9ImRyb3Bkb3duIj4KKyAgICAgICAgICAgICAgTmV3IGJ1aWxkCisgICAgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLWNhcmV0LWRvd24iPjwvaT4KKyAgICAgICAgICAgIDwvYnV0dG9uPgorICAgICAgICAgICAgPHVsIGNsYXNzPSJkcm9wZG93bi1tZW51IG5ldy1idWlsZCBtdWx0aS1zZWxlY3QiPgorICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgPGgzPk5ldyBidWlsZDwvaDM+CisgICAgICAgICAgICAgICAgPGg2PlByb2plY3Q6PC9oNj4KKyAgICAgICAgICAgICAgICA8c3BhbiBpZD0icHJvamVjdCI+CisgICAgICAgICAgICAgICAgICB7JSBpZiBwcm9qZWN0LmlkICV9CisgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0ibGVhZCIgaHJlZj0ieyUgdXJsICdwcm9qZWN0JyBwcm9qZWN0LmlkICV9Ij57e3Byb2plY3QubmFtZX19PC9hPgorICAgICAgICAgICAgICAgICAgeyUgZWxzZSAlfQorICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9ImxlYWQiIGhyZWY9IiMiPjwvYT4KKyAgICAgICAgICAgICAgICAgIHslIGVuZGlmICV9CisgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iaWNvbi1wZW5jaWwiPjwvaT4KKyAgICAgICAgICAgICAgICA8L3NwYW4+CisgICAgICAgICAgICAgICAgPGZvcm0gaWQ9ImNoYW5nZS1wcm9qZWN0LWZvcm0iIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KKyAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWFwcGVuZCI+CisgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iaW5wdXQtbWVkaXVtIiBpZD0icHJvamVjdC1uYW1lLWlucHV0IiBwbGFjZWhvbGRlcj0iVHlwZSBhIHByb2plY3QgbmFtZSIgYXV0b2NvbXBsZXRlPSJvZmYiIGRhdGEtbWluTGVuZ3RoPSIxIiBkYXRhLWF1dG9jb21wbGV0ZT0ib2ZmIiBkYXRhLXByb3ZpZGU9InR5cGVhaGVhZCIvPgorICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPSJzYXZlLXByb2plY3QtYnV0dG9uIiBjbGFzcz0iYnRuIiB0eXBlPSJidXR0b24iPlNhdmU8L2J1dHRvbj4KKyAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9ImNhbmNlbC1jaGFuZ2UtcHJvamVjdCIgY2xhc3M9ImJ0biBidG4tbGluayIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPkNhbmNlbDwvYT4KKyAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgPHA+PGEgaWQ9InZpZXctYWxsLXByb2plY3RzIiBocmVmPSJ7JSB1cmwgJ2FsbC1wcm9qZWN0cycgJX0iPlZpZXcgYWxsIHByb2plY3RzPC9hPjwvcD4KKyAgICAgICAgICAgICAgICA8L2Zvcm0+CisgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhbGVydCIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgorICAgICAgICAgICAgICAgICAgPHA+VGhpcyBwcm9qZWN0IGNvbmZpZ3VyYXRpb24gaXMgaW5jb21wbGV0ZSwgc28geW91IGNhbm5vdCBydW4gYnVpbGRzLjwvcD4KKyAgICAgICAgICAgICAgICAgIDxwPjxhIGhyZWY9InslIGlmIHByb2plY3QuaWQgJX17JSB1cmwgJ3Byb2plY3QnIHByb2plY3QuaWQgJX17JSBlbmRpZiAlfSI+VmlldyBwcm9qZWN0IGNvbmZpZ3VyYXRpb248L2E+PC9wPgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgaWQ9InRhcmdldHMtZm9ybSI+CisgICAgICAgICAgICAgICAgPGg2PlJlY2lwZShzKTo8L2g2PgorICAgICAgICAgICAgICAgIDxmb3JtPgorICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJpbnB1dC14bGFyZ2UgYnVpbGQtdGFyZ2V0LWlucHV0IiBwbGFjZWhvbGRlcj0iVHlwZSBhIHJlY2lwZSBuYW1lIiBhdXRvY29tcGxldGU9Im9mZiIgZGF0YS1taW5MZW5ndGg9IjEiIGRhdGEtYXV0b2NvbXBsZXRlPSJvZmYiIGRhdGEtcHJvdmlkZT0idHlwZWFoZWFkIiBkaXNhYmxlZC8+CisgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ctZmx1aWQiPgorICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLXByaW1hcnkgYnVpbGQtYnV0dG9uIiBkaXNhYmxlZD5CdWlsZDwvYnV0dG9uPgorICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPC9mb3JtPgorICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgPC91bD4KKyAgICAgICAgICA8L2Rpdj4KKworCisgICAgPC9kaXY+CisgPC9kaXY+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0iY29udGFpbmVyLWZsdWlkIHRvcC1wYWRkZWQiPgorPGRpdiBjbGFzcz0icm93LWZsdWlkIj4KK3slIGJsb2NrIHBhZ2Vjb250ZW50ICV9Cit7JSBlbmRibG9jayAlfQorPC9kaXY+Cis8L2Rpdj4KKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9iYXNlYnVpbGRkZXRhaWxwYWdlLmh0bWwgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL2Jhc2VidWlsZGRldGFpbHBhZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmNhNTBjCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9iYXNlYnVpbGRkZXRhaWxwYWdlLmh0bWwKQEAgLTAsMCArMSwyOSBAQAoreyUgZXh0ZW5kcyAiYmFzZS5odG1sIiAlfQoreyUgbG9hZCBodW1hbml6ZSAlfQoreyUgYmxvY2sgcGFnZWNvbnRlbnQgJX0KKworPGRpdiBjbGFzcz0icm93LWZsdWlkIj4KKzwhLS0gQnJlYWRjcnVtYnMgLS0+CisgICAgPGRpdiBjbGFzcz0ic2VjdGlvbiI+CisgICAgICAgIDx1bCBjbGFzcz0iYnJlYWRjcnVtYiIgaWQ9ImJyZWFkY3J1bWIiPgorICAgICAgICAgICAgPGxpIGNsYXNzPSJtdXRlZCI+e3tidWlsZC5wcm9qZWN0Lm5hbWV9fTo8L2xpPgorICAgICAgICAgICAgPGxpPjxhIGhyZWY9InslIHVybCAncHJvamVjdGJ1aWxkcycgYnVpbGQucHJvamVjdC5pZCAlfSI+QnVpbGRzPC9hPjwvbGk+CisgICAgICAgICAgICA8bGk+PGEgaHJlZj0ieyV1cmwgJ2J1aWxkZGFzaGJvYXJkJyBidWlsZC5wayV9Ij57e2J1aWxkLnRhcmdldF9zZXQuYWxsLjAudGFyZ2V0fX0geyVpZiBidWlsZC50YXJnZXRfc2V0LmFsbC5jb3VudCA+IDElfSgrIHt7YnVpbGQudGFyZ2V0X3NldC5hbGwuY291bnR8YWRkOiItMSJ9fSl7JWVuZGlmJX0gKHt7YnVpbGQuY29tcGxldGVkX29ufGRhdGU6ImQvbS95IEg6aSJ9fSk8L2E+PC9saT4KKyAgICAgICAgICAgIHslIGJsb2NrIGxvY2FsYnJlYWRjcnVtYiAlfXslIGVuZGJsb2NrICV9CisgICAgICAgIDwvdWw+CisgICAgICAgIDxzY3JpcHQ+CisgICAgICAgICQoIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgICQoJyNicmVhZGNydW1iID4gbGknKS5hcHBlbmQoJzxzcGFuIGNsYXNzPSJkaXZpZGVyIj4mcmFycjs8L3NwYW4+Jyk7CisgICAgICAgICAgICAkKCcjYnJlYWRjcnVtYiA+IGxpOmxhc3QnKS5hZGRDbGFzcygiYWN0aXZlIik7CisgICAgICAgICAgICAkKCcjYnJlYWRjcnVtYiA+IGxpOmxhc3QgPiBzcGFuLCAjYnJlYWRjcnVtYiA+IGxpOmZpcnN0ID4gc3BhbicpLnJlbW92ZSgpOworICAgICAgICB9KTsKKyAgICAgICAgPC9zY3JpcHQ+CisgICAgPC9kaXY+IDwhLS1zZWN0aW9uLS0+CisKKyAgICAgICAgPCEtLSBCZWdpbiBjb250YWluZXIgLS0+CisgICAgICAgIHslIGJsb2NrIHBhZ2VkZXRhaWxpbmZvbWFpbiAlfXslIGVuZGJsb2NrICV9CisgICAgICAgIDwhLS0gRW5kIGNvbnRhaW5lciAtLT4KKworPC9kaXY+CisKK3slIGVuZGJsb2NrICV9CmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL2Jhc2VidWlsZHBhZ2UuaHRtbCBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvYmFzZWJ1aWxkcGFnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NDFkZjgKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL2Jhc2VidWlsZHBhZ2UuaHRtbApAQCAtMCwwICsxLDg4IEBACit7JSBleHRlbmRzICJiYXNlLmh0bWwiICV9Cit7JSBsb2FkIHByb2plY3R0YWdzICV9Cit7JSBsb2FkIGh1bWFuaXplICV9Cit7JSBibG9jayBwYWdlY29udGVudCAlfQorCisKKyA8ZGl2IGNsYXNzPSIiPgorPCEtLSBCcmVhZGNydW1icyAtLT4KKyAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgICAgPHVsIGNsYXNzPSJicmVhZGNydW1iIiBpZD0iYnJlYWRjcnVtYiI+CisgICAgICAgICAgICA8bGkgY2xhc3M9Im11dGVkIj57e2J1aWxkLnByb2plY3QubmFtZX19OjwvbGk+CisgICAgICAgICAgICA8bGk+PGEgaHJlZj0ieyUgdXJsICdwcm9qZWN0YnVpbGRzJyBidWlsZC5wcm9qZWN0LmlkICV9Ij5CdWlsZHM8L2E+PC9saT4KKyAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgIHslIGJsb2NrIHBhcmVudGJyZWFkY3J1bWIgJX0KKyAgICAgICAgICAgIDxhIGhyZWY9InsldXJsICdidWlsZGRhc2hib2FyZCcgYnVpbGQucGslfSI+CisgICAgICAgICAgICAgICAge3tidWlsZC5nZXRfc29ydGVkX3RhcmdldF9saXN0LjAudGFyZ2V0fX0geyVpZiBidWlsZC50YXJnZXRfc2V0LmFsbC5jb3VudCA+IDElfSgrIHt7YnVpbGQudGFyZ2V0X3NldC5hbGwuY291bnR8YWRkOiItMSJ9fSl7JWVuZGlmJX0gKHt7YnVpbGQuY29tcGxldGVkX29ufGRhdGU6ImQvbS95IEg6aSJ9fSkKKyAgICAgICAgICAgIDwvYT4KKyAgICAgICAgICAgIHslIGVuZGJsb2NrICV9CisgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgeyUgYmxvY2sgbG9jYWxicmVhZGNydW1iICV9eyUgZW5kYmxvY2sgJX0KKyAgICAgICAgPC91bD4KKyAgICAgICAgPHNjcmlwdD4KKyAgICAgICAgJCggZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgJCgnI2JyZWFkY3J1bWIgPiBsaScpLmFwcGVuZCgnPHNwYW4gY2xhc3M9ImRpdmlkZXIiPiZyYXJyOzwvc3Bhbj4nKTsKKyAgICAgICAgICAgICQoJyNicmVhZGNydW1iID4gbGk6bGFzdCcpLmFkZENsYXNzKCJhY3RpdmUiKTsKKyAgICAgICAgICAgICQoJyNicmVhZGNydW1iID4gbGk6bGFzdCA+IHNwYW4sICNicmVhZGNydW1iID4gbGk6Zmlyc3QgPiBzcGFuJykucmVtb3ZlKCk7CisJICAgIGNvbnNvbGUubG9nKCJkb25lIik7CisgICAgICAgIH0pOworICAgICAgICA8L3NjcmlwdD4KKyAgICA8L2Rpdj4KKworICAgIDxkaXYgY2xhc3M9InJvdy1mbHVpZCI+CisKKyAgICAgICAgPCEtLSBiZWdpbiBsZWZ0IHNpZGViYXIgY29udGFpbmVyIC0tPgorICAgICAgICA8ZGl2IGlkPSJuYXYiIGNsYXNzPSJzcGFuMiI+CisgICAgICAgICAgICA8dWwgY2xhc3M9Im5hdiBuYXYtbGlzdCB3ZWxsIj4KKyAgICAgICAgICAgICAgPGxpCisgICAgICAgICAgICAgICAgeyUgaWYgcmVxdWVzdC5yZXNvbHZlcl9tYXRjaC51cmxfbmFtZSA9PSAnYnVpbGRkYXNoYm9hcmQnICAlfQorICAgICAgICAgICAgICAgICAgY2xhc3M9ImFjdGl2ZSIKKyAgICAgICAgICAgICAgICB7JSBlbmRpZiAlfSA+CisgICAgICAgICAgICAgICAgPGEgY2xhc3M9Im5hdi1wYXJlbnQiIGhyZWY9InslIHVybCAnYnVpbGRkYXNoYm9hcmQnIGJ1aWxkLnBrICV9Ij5CdWlsZCBzdW1tYXJ5PC9hPgorICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICB7JSBpZiBidWlsZC50YXJnZXRfc2V0LmFsbC4wLmlzX2ltYWdlIGFuZCBidWlsZC5vdXRjb21lID09IDAgJX0KKyAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1oZWFkZXIiPkltYWdlczwvbGk+CisgICAgICAgICAgICAgICAgeyUgYmxvY2sgbmF2LXRhcmdldCAlfQorICAgICAgICAgICAgICAgICAgeyUgZm9yIHQgaW4gYnVpbGQuZ2V0X3NvcnRlZF90YXJnZXRfbGlzdCAlfQorICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0ieyUgdXJsICd0YXJnZXQnIGJ1aWxkLnBrIHQucGsgJX0iPnt7dC50YXJnZXR9fTwvYT48bGk+CisgICAgICAgICAgICAgICAgICB7JSBlbmRmb3IgJX0KKyAgICAgICAgICAgICAgICB7JSBlbmRibG9jayAlfQorICAgICAgICAgICAgICB7JSBlbmRpZiAlfQorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1oZWFkZXIiPkJ1aWxkPC9saT4KKyAgICAgICAgICAgICAgeyUgYmxvY2sgbmF2LWNvbmZpZ3VyYXRpb24gJX0KKyAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJ7JSB1cmwgJ2NvbmZpZ3VyYXRpb24nIGJ1aWxkLnBrICV9Ij5Db25maWd1cmF0aW9uPC9hPjwvbGk+CisgICAgICAgICAgICAgIHslIGVuZGJsb2NrICV9CisgICAgICAgICAgICAgIHslIGJsb2NrIG5hdi10YXNrcyAlfQorICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9InslIHVybCAndGFza3MnIGJ1aWxkLnBrICV9Ij5UYXNrczwvYT48L2xpPgorICAgICAgICAgICAgICB7JSBlbmRibG9jayAlfQorICAgICAgICAgICAgICB7JSBibG9jayBuYXYtcmVjaXBlcyAlfQorICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9InslIHVybCAncmVjaXBlcycgYnVpbGQucGsgJX0iPlJlY2lwZXM8L2E+PC9saT4KKyAgICAgICAgICAgICAgeyUgZW5kYmxvY2sgJX0KKyAgICAgICAgICAgICAgeyUgYmxvY2sgbmF2LXBhY2thZ2VzICV9CisgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0ieyUgdXJsICdwYWNrYWdlcycgYnVpbGQucGsgJX0iPlBhY2thZ2VzPC9hPjwvbGk+CisgICAgICAgICAgICAgIHslIGVuZGJsb2NrICV9CisgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1oZWFkZXIiPlBlcmZvcm1hbmNlPC9saT4KKyAgICAgICAgICAgICAgeyUgYmxvY2sgbmF2LWJ1aWxkdGltZSAlfQorICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9InslIHVybCAnYnVpbGR0aW1lJyBidWlsZC5wayAlfSI+VGltZTwvYT48L2xpPgorICAgICAgICAgICAgICB7JSBlbmRibG9jayAlfQorICAgICAgICAgICAgICB7JSBibG9jayBuYXYtY3B1dXNhZ2UgJX0KKyAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJ7JSB1cmwgJ2NwdXVzYWdlJyBidWlsZC5wayAlfSI+Q1BVIHVzYWdlPC9hPjwvbGk+CisgICAgICAgICAgICAgIHslIGVuZGJsb2NrICV9CisgICAgICAgICAgICAgIHslIGJsb2NrIG5hdi1kaXNraW8gJX0KKyAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJ7JSB1cmwgJ2Rpc2tpbycgYnVpbGQucGsgJX0iPkRpc2sgSS9PPC9hPjwvbGk+CisgICAgICAgICAgICAgIHslIGVuZGJsb2NrICV9CisgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2Rpdj4KKyAgICAgICAgPCEtLSBlbmQgbGVmdCBzaWRlYmFyIGNvbnRhaW5lciAtLT4KKworICAgICAgICA8IS0tIEJlZ2luIHJpZ2h0IGNvbnRhaW5lciAtLT4KKyAgICAgICAgeyUgYmxvY2sgYnVpbGRpbmZvbWFpbiAlfXslIGVuZGJsb2NrICV9CisgICAgICAgIDwhLS0gRW5kIHJpZ2h0IGNvbnRhaW5lciAtLT4KKworCisgICAgPC9kaXY+CisgIDwvZGl2PgorCisKK3slIGVuZGJsb2NrICV9CisKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvYmFzZXByb2plY3RidWlsZHNwYWdlLmh0bWwgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL2Jhc2Vwcm9qZWN0YnVpbGRzcGFnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyOWNkMTcKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL2Jhc2Vwcm9qZWN0YnVpbGRzcGFnZS5odG1sCkBAIC0wLDAgKzEsMTUgQEAKK3slIGV4dGVuZHMgImJhc2UuaHRtbCIgJX0KK3slIGxvYWQgcHJvamVjdHRhZ3MgJX0KK3slIGxvYWQgaHVtYW5pemUgJX0KK3slIGJsb2NrIHBhZ2Vjb250ZW50ICV9CisKK3slIGluY2x1ZGUgInByb2plY3R0b3BiYXIuaHRtbCIgJX0KKworPCEtLSBCZWdpbiBtYWluIHBhZ2UgY29udGFpbmVyIC0tPgorPGRpdj4KKyAgICB7JSBibG9jayBwcm9qZWN0aW5mb21haW4gJX17JSBlbmRibG9jayAlfQorPC9kaXY+Cis8IS0tIEVuZCBtYWluIGNvbnRhaW5lciAtLT4KKworeyUgZW5kYmxvY2sgJX0KKwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9iYXNlcHJvamVjdHBhZ2UuaHRtbCBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvYmFzZXByb2plY3RwYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY4ZTBiZgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvYmFzZXByb2plY3RwYWdlLmh0bWwKQEAgLTAsMCArMSw0MCBAQAoreyUgZXh0ZW5kcyAiYmFzZS5odG1sIiAlfQoreyUgbG9hZCBwcm9qZWN0dGFncyAlfQoreyUgbG9hZCBodW1hbml6ZSAlfQoreyUgYmxvY2sgcGFnZWNvbnRlbnQgJX0KKworeyUgaW5jbHVkZSAicHJvamVjdHRvcGJhci5odG1sIiAlfQorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpeworICAgICAkKCIjY29uZmlnLW5hdiAubmF2IGxpIGEiKS5lYWNoKGZ1bmN0aW9uKCl7CisgICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSA9PT0gJCh0aGlzKS5hdHRyKCdocmVmJykpCisgICAgICAgICAkKHRoaXMpLnBhcmVudCgpLmFkZENsYXNzKCdhY3RpdmUnKTsKKyAgICAgICBlbHNlCisgICAgICAgICAkKHRoaXMpLnBhcmVudCgpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTsKKyAgICAgfSk7CisKKyAgICAgJCgiI3RvcGJhci1jb25maWd1cmF0aW9uLXRhYiIpLmFkZENsYXNzKCJhY3RpdmUiKQorICB9KTsKKzwvc2NyaXB0PgorCis8ZGl2IGNsYXNzPSJyb3ctZmx1aWQiPgorICA8IS0tIG9ubHkgb24gY29uZmlnIHBhZ2VzIC0tPgorICA8ZGl2IGlkPSJjb25maWctbmF2IiBjbGFzcz0ic3BhbjIiPgorICAgIDx1bCBjbGFzcz0ibmF2IG5hdi1saXN0IHdlbGwiPgorICAgICAgPGxpPjxhIGNsYXNzPSJuYXYtcGFyZW50IiBocmVmPSJ7JSB1cmwgJ3Byb2plY3QnIHByb2plY3QuaWQgJX0iPkNvbmZpZ3VyYXRpb248L2E+PC9saT4KKyAgICAgIDxsaSBjbGFzcz0ibmF2LWhlYWRlciI+Q29tcGF0aWJsZSBtZXRhZGF0YTwvbGk+Cis8IS0tICA8bGk+PGEgaHJlZj0iYWxsLWltYWdlLXJlY2lwZXMuaHRtbCI+SW1hZ2UgcmVjaXBlczwvYT48L2xpPiAtLT4KKyAgICAgIDxsaT48YSBocmVmPSJ7JSB1cmwgJ3Byb2plY3R0YXJnZXRzJyBwcm9qZWN0LmlkICV9Ij5SZWNpcGVzPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0ieyUgdXJsICdwcm9qZWN0bWFjaGluZXMnIHByb2plY3QuaWQgJX0iPk1hY2hpbmVzPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0ieyUgdXJsICdwcm9qZWN0bGF5ZXJzJyBwcm9qZWN0LmlkICV9Ij5MYXllcnM8L2E+PC9saT4KKyAgICAgIDxsaSBjbGFzcz0ibmF2LWhlYWRlciI+RXh0cmEgY29uZmlndXJhdGlvbjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0ieyUgdXJsICdwcm9qZWN0Y29uZicgcHJvamVjdC5pZCAlfSI+Qml0QmFrZSB2YXJpYWJsZXM8L2E+PC9saT4KKyAgICA8L3VsPgorICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ic3BhbjEwIj4KKyAgICB7JSBibG9jayBwcm9qZWN0aW5mb21haW4gJX17JSBlbmRibG9jayAlfQorICA8L2Rpdj4KKzwvZGl2PgorCit7JSBlbmRibG9jayAlfQorCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL2Jhc2V0YWJsZV9ib3R0b20uaHRtbCBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvYmFzZXRhYmxlX2JvdHRvbS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMDIzZjUKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL2Jhc2V0YWJsZV9ib3R0b20uaHRtbApAQCAtMCwwICsxLDk0IEBACisgICAgPC90Ym9keT4KKyAgICA8L3RhYmxlPgorCis8IS0tIFNob3cgcGFnaW5hdGlvbiBjb250cm9scyAtLT4KKzxkaXYgY2xhc3M9InBhZ2luYXRpb24gcGFnaW5hdGlvbi1jZW50ZXJlZCI+CisgICA8ZGl2IGNsYXNzPSJwdWxsLWxlZnQiPgorICAgU2hvd2luZyB7e29iamVjdHMuc3RhcnRfaW5kZXh9fSB0byB7e29iamVjdHMuZW5kX2luZGV4fX0gb3V0IG9mIHt7b2JqZWN0cy5wYWdpbmF0b3IuY291bnR9fSBlbnRyaWVzLgorICAgPC9kaXY+CisKKyAgIDx1bCBjbGFzcz0icGFnaW5hdGlvbiIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrLWlubGluZSI+Cit7JWlmIG9iamVjdHMuaGFzX3ByZXZpb3VzICV9CisgIDxsaT48YSBocmVmPSJqYXZhc2NyaXB0OnJlbG9hZF9wYXJhbXMoeydwYWdlJzp7e29iamVjdHMucHJldmlvdXNfcGFnZV9udW1iZXJ9fX0pIj4mbGFxdW87PC9hPjwvbGk+Cit7JWVsc2UlfQorICA8bGkgY2xhc3M9ImRpc2FibGVkIj48YSBocmVmPSIjIj4mbGFxdW87PC9hPjwvbGk+Cit7JWVuZGlmJX0KK3slIGZvciBpIGluIG9iamVjdHMucGFnZV9yYW5nZSAlfQorICA8bGl7JWlmIGkgPT0gb2JqZWN0cy5udW1iZXIgJX0gY2xhc3M9ImFjdGl2ZSIgeyVlbmRpZiV9PjxhIGhyZWY9ImphdmFzY3JpcHQ6cmVsb2FkX3BhcmFtcyh7J3BhZ2UnOnt7aX19fSkiPnt7aX19PC9hPjwvbGk+Cit7JSBlbmRmb3IgJX0KK3slaWYgb2JqZWN0cy5oYXNfbmV4dCV9CisgIDxsaT48YSBocmVmPSJqYXZhc2NyaXB0OnJlbG9hZF9wYXJhbXMoeydwYWdlJzp7e29iamVjdHMubmV4dF9wYWdlX251bWJlcn19fSkiPiZyYXF1bzs8L2E+PC9saT4KK3slZWxzZSV9CisgIDxsaSBjbGFzcz0iZGlzYWJsZWQiPjxhIGhyZWY9IiMiPiZyYXF1bzs8L2E+PC9saT4KK3slZW5kaWYlfQorICA8L3VsPgorICA8ZGl2IGNsYXNzPSJwdWxsLXJpZ2h0Ij4KKyAgICA8c3BhbiBjbGFzcz0iaGVscC1pbmxpbmUiIHN0eWxlPSJwYWRkaW5nLXRvcDo1cHg7Ij5TaG93IHJvd3M6PC9zcGFuPgorICAgIDxzZWxlY3Qgc3R5bGU9Im1hcmdpbi10b3A6NXB4O21hcmdpbi1ib3R0b206MHB4OyIgY2xhc3M9InBhZ2VzaXplIj4KKyAgICAgIHslIHdpdGggIjEwIDI1IDUwIDEwMCAxNTAiIGFzIGxpc3QlfQorICAgICAgICB7JSBmb3IgaSBpbiBsaXN0LnNwbGl0ICV9CisgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ7e2l9fSI+e3tpfX08L29wdGlvbj4KKyAgICAgICAgeyUgZW5kZm9yICV9CisgICAgICB7JSBlbmR3aXRoICV9CisgICAgPC9zZWxlY3Q+CisgICA8L2Rpdj4KKzwvZGl2PgorCis8IS0tIFVwZGF0ZSBwYWdlIGRpc3BsYXkgc2V0dGluZ3MgLS0+CisKKzxzY3JpcHQ+CisgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CisKKyAgICAvLyB3ZSBsb2FkIGNvb2tpZXMgZm9yIHRoZSBjb2x1bW4gZGlzcGxheQorICAgIHNhdmUgPSAkLmNvb2tpZSgnX2Rpc3BsYXljb2xzX3t7b2JqZWN0bmFtZX19Jyk7CisgICAgaWYgKHNhdmUgIT0gdW5kZWZpbmVkKSB7CisgICAgICAgIHNldHRpbmcgPSBzYXZlLnNwbGl0KCc7Jyk7CisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgc2V0dGluZy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKHNldHRpbmdbaV0ubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIHNwbGl0bGlzdCA9IHNldHRpbmdbaV0uc3BsaXQoJzonKTsKKyAgICAgICAgICAgICAgICBpZCA9IHNwbGl0bGlzdFswXSwgdiA9IHNwbGl0bGlzdFsxXTsKKyAgICAgICAgICAgICAgICBpZiAodiA9PSAndHJ1ZScpIHsKKyAgICAgICAgICAgICAgICAgICAgJCgnLmNoYnh0b2dnbGUjJytpZCkucHJvcCgnY2hlY2tlZCcsIHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJCgnLmNoYnh0b2dnbGUjJytpZCkucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBsb2FkIGRhdGEgZm9yIG51bWJlciBvZiBlbnRyaWVzIHRvIGJlIGRpc3BsYXllZCBvbiBwYWdlCisgICAgaWYgKHt7cmVxdWVzdC5HRVQuY291bnR9fSAhPSAiIikgeworICAgICAgcGFnZXNpemUgPSB7e3JlcXVlc3QuR0VULmNvdW50fX07CisgICAgfQorCisgICAgJCgnLnBhZ2VzaXplIG9wdGlvbicpLnByb3AoJ3NlbGVjdGVkJywgZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcignW3ZhbHVlPSInICsgcGFnZXNpemUgKyAnIl0nKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdzZWxlY3RlZCcsIHRydWUpOworCisgICAgJCgnLmNoYnh0b2dnbGUnKS5lYWNoKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgc2hvd2hpZGVUYWJsZUNvbHVtbigkKHRoaXMpLmF0dHIoJ2lkJyksICQodGhpcykuaXMoJzpjaGVja2VkJykpCisgICAgfSk7CisKKyAgICAvL3R1cm4gZWRpdCBjb2x1bW5zIGRyb3Bkb3duIGludG8gYSBtdWx0aS1zZWxlY3QgbWVudQorICAgICAkKCcuZHJvcGRvd24tbWVudSBpbnB1dCwgLmRyb3Bkb3duLW1lbnUgbGFiZWwnKS5jbGljayhmdW5jdGlvbihlKSB7CisgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CisgICAgfSk7CisKKyAgICAvL3Nob3cgdG9vbHRpcCB3aXRoIGFwcGxpZWQgZmlsdGVyCisgICAgJCgnI2ZpbHRlcmVkJykudG9vbHRpcCh7Y29udGFpbmVyOid0YWJsZScsIHBsYWNlbWVudDonYm90dG9tJywgZGVsYXk6e2hpZGU6MTUwMH0sIGh0bWw6dHJ1ZX0pOworCisgICAgLy9wcm9ncmVzcyBiYXIgdG9vbHRpcAorICAgICQoJy5wcm9ncmVzcywgLmxlYWQgc3BhbicpLnRvb2x0aXAoe2NvbnRhaW5lcjondGFibGUnLCBwbGFjZW1lbnQ6J3RvcCd9KTsKKworICAgICQoIi5wYWdlc2l6ZSIpLmNoYW5nZShmdW5jdGlvbiAoKSB7CisgICAgICAgIHJlbG9hZF9wYXJhbXMoeyJjb3VudCI6JCh0aGlzKS52YWwoKX0pOworICAgIH0pOworfSk7Cis8L3NjcmlwdD4KKworPCEtLSBtb2RhbCBmaWx0ZXIgYm94ZXMgLS0+CisgICB7JSBmb3IgdGMgaW4gdGFibGVjb2xzICV9eyUgaWYgdGMuZmlsdGVyICV9eyUgd2l0aCBvYmplY3RuYW1lPW9iamVjdG5hbWUgZj10Yy5maWx0ZXIgJX0KKyAgICAgICAgeyUgaW5jbHVkZSAiZmlsdGVyc25pcHBldC5odG1sIiAlfQorICAgeyUgZW5kd2l0aCAlfXslIGVuZGlmICV9IHslIGVuZGZvciAlfQorPCEtLSBlbmQgbW9kYWxzIC0tPgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9iYXNldGFibGVfdG9wLmh0bWwgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL2Jhc2V0YWJsZV90b3AuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2VkZTY2Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9iYXNldGFibGVfdG9wLmh0bWwKQEAgLTAsMCArMSwyMzkgQEAKK3slIGxvYWQgcHJvamVjdHRhZ3MgJX0KKzwhLS0gY29tcG9uZW50IHRvIGRpc3BsYXkgYSBnZW5lcmljIHRhYmxlIC0tPgorICAgIDxzY3JpcHQ+CisKKyAgICAvLworICAgIC8vIG1vc3Qgb2YgdGhlIGZvbGxvd2luZyBqYXZhc2NyaXB0IGlzIGZvciBtYW5hZ2luZyB0aGUgJ0VkaXQgQ29sdW1ucycKKyAgICAvLyBwb3AtdXAgZGlhbG9nIGFuZCBhY3Rpb25zLiB0aGUgaWRlYSBpcyB0aGF0IHRoZXJlIGFyZSAyIHR5cGVzCisgICAgLy8gb2YgYWN0aW9uczogaW1tZWRpYXRlIC0gcGVyZm9ybWVkIHdoaWxlIHRoZSBkaWFsb2cgaXMgc3RpbGwKKyAgICAvLyB2aXNpYmxlIC0gaGlkZS9zaG93IGNvbHVtbnMsIGFuZCBkZWxheWVkIC0gcGVyZm9ybWVkIHdoZW4gdGhlCisgICAgLy8gZGlhbG9nIGJlY29tZXMgaW52aXNpYmxlIC0gYW55IHJlc29ydGluZyBpZiBuZWNlc3NhcnkuCisgICAgLy8KKyAgICAvLyBXaGVuIHRoZSBkaWFsb2cgaXMgb3BlbiwgYW4gaW50ZXJ2YWwgdGltZXIgaXMgc2V0IHVwIHRvCisgICAgLy8gZGV0ZXJtaW5lIGlmIHRoZSBkaWFsb2cgaXMgc3RpbGwgdmlzaWJsZS4gd2hlbiB0aGUgZGlhbG9nCisgICAgLy8gY2xvc2VzIC0gZ29lcyBpbnZpc2libGUsIHRoZSBkZWxheWVkIGFjdGlvbnMgYXJlIHBlcmZvcm1lZC4KKyAgICAvLworICAgIC8vIHRoZSBpbnRlcnZhbCB0aW1lciBhbmQgaW50ZXJydXB0IGhhbmRsZXIgaXMgYSB3YXkgb2Ygc2ltdWxhdGluZworICAgIC8vIGFuIG9uY2xvc2UgZXZlbnQuIHRoZXJlIGlzIHByb2JhYmx5IGEgc2ltcGxlciB3YXkgdG8gZG8gdGhpcworICAgIC8vIGhvd2V2ZXIgdGhlIHBvcC11cCB3aW5kb3cgaWQgd2FzIGVsdXNpdmUuCisgICAgLy8KKworICAgIHZhciBlZGl0Q29sVGltZXI7CisgICAgdmFyIGVkaXRDb2xBY3Rpb247CisKKyAgICAvLworICAgIC8vIHRoaXMgaXMgdGhlIHRhcmdldCBmdW5jdGlvbiBvZiB0aGUgaW50ZXJ2YWwgdGltZW91dC4KKyAgICAvLyBjaGVjayB0byBzZWUgaWYgdGhlIGRpYWxvZyBpcyB2aXNpYmxlLiBpZiB0aGUgZGlhbG9nCisgICAgLy8gaGFzIGdvbmUgaW52aXNpYmxlIHNpbmNlIHRoZSBsYXN0IGNoZWNrLCB0YWtlIGFueSBkZWxheWVkCisgICAgLy8gYWN0aW9ucyBpbmRpY2F0ZWQgaW4gdGhlIGFjdGlvbiBsaXN0IGFuZCBjbGVhciB0aGUgdGltZXIuCisgICAgLy8KKworICAgIGZ1bmN0aW9uIGNoZWNrVmlzaWJsZSggKSB7CisgICAgICAgIGVkaXRjb2wgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ2VkaXRjb2wnICk7CisgICAgICAgIGlmICggZWRpdGNvbC5vZmZzZXRXaWR0aCA8PSAwICkgeworICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCggZWRpdENvbFRpbWVyICk7CisgICAgICAgICAgICBlZGl0Q29sVGltZXIgPSBmYWxzZTsKKyAgICAgICAgICAgIGhpZGVzaG93Q29sdW1ucyggKTsKKyAgICAgICAgICAgIGVkaXRDb2xBY3Rpb24gPSBbIF07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbiBmaWx0ZXJUYWJsZVJvd3ModGVzdCkgeworICAgICAgICBpZiAodGVzdC5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICB2YXIgciA9IHRlc3Quc3BsaXQoL1sgLF0rLykubWFwKGZ1bmN0aW9uIChlKSB7IHJldHVybiBuZXcgUmVnRXhwKGUsICdpJykgfSk7CisgICAgICAgICAgICAkKCd0ci5kYXRhJykubWFwKCBmdW5jdGlvbiAoaSwgZWwpIHsKKyAgICAgICAgICAgICAgICAoISByLm1hcChmdW5jdGlvbiAoaikgeyByZXR1cm4gai50ZXN0KCQoZWwpLmh0bWwoKSl9KS5yZWR1Y2UoZnVuY3Rpb24gKGMsIHApIHsgcmV0dXJuIGMgJiYgcDt9ICkpID8gJChlbCkuaGlkZSgpIDogJChlbCkuc2hvdygpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAkKCd0ci5kYXRhJykuc2hvdygpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8KKyAgICAvLyBkZXRlcm1pbmUgdGhlIHZhbHVlIG9mIHRoZSBpbmRpY2F0ZWQgdXJsIGFyZy4KKyAgICAvLyB0aGlzIGlzIG5lZWRlZCB0byBkZXRlcm1pbmUgd2hldGhlciBhIHJlc29ydAorICAgIC8vIGlzIG5lY2Vzc2FyeS4gaXQgbG9va3MgbGlrZSBhIGxvdCBvZiBnb3JwIHN0dWZmCisgICAgLy8gYnV0IGl0cyBhY3R1YWxseSBwcmV0dHkgc2ltcGxlLgorICAgIC8vCisKKyAgICBmdW5jdGlvbiBnZXRVUkxQYXJhbWV0ZXIoIG5hbWUgKSB7CisgICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoKG5ldyBSZWdFeHAoJ1s/fCZdJyArIG5hbWUgKyAnPScgKworICAgICAgICAgICcoW14mO10rPykoJnwjfDt8JCknKS5leGVjKGxvY2F0aW9uLnNlYXJjaCl8fFssIiJdKVsxXS5yZXBsYWNlKC9cKy9nLAorICAgICAgICAgICclMjAnKSl8fG51bGwKKyAgICB9CisKKyAgICAvLworICAgIC8vIHdoZW4gdGhlIGRpYWxvZyBib3ggZ29lcyBpbnZpc2libGUKKyAgICAvLyB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBpbnRlcnByZXQKKyAgICAvLyB0aGUgYWN0aW9uIGxpc3QgYW5kIHRha2UgYW55IGRlbGF5ZWQgYWN0aW9ucyBuZWNlc3NhcnkuCisgICAgLy8gdGhlIGVkaXRDb2xBY3Rpb24gbGlzdCBpcyBhIGhhc2ggdGFibGUgd2l0aAorICAgIC8vIHRoZSBjb2x1bW4gbmFtZSBhcyB0aGUgaGFzaCBrZXksIHRoZSBoYXNoIHZhbHVlCisgICAgLy8gaXMgYSAyIGVsZW1lbnQgbGlzdC4gdGhlIGZpcnN0IGVsZW1lbnQgaXMgYSBmbGFnCisgICAgLy8gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjb2x1bW4gaXMgb24gb3Igb2ZmLiB0aGUKKyAgICAvLyAybmQgZWxlbWVudCBpcyB0aGUgc29ydCBvcmRlciBpbmRpY2F0b3IgZm9yIHRoZSBjb2x1bW4uCisgICAgLy8KKworICAgIGZ1bmN0aW9uIGhpZGVzaG93Q29sdW1ucyggKSB7CisgICAgICAgIGZvciggdmFyIGsgaW4gZWRpdENvbEFjdGlvbiApIHsKKyAgICAgICAgICAgIHNob3doaWRlRGVsYXllZFRhYmxlQWN0aW9uKCBrLCBlZGl0Q29sQWN0aW9uWyBrIF1bIDAgXSwgZWRpdENvbEFjdGlvblsgayBdWyAxIF0pOworICAgICAgICB9CisgICAgfQorCisgICAgLy8KKyAgICAvLyB0aGlzIGZ1bmN0aW9uIGFjdHVhbGx5IHBlcmZvcm1zIHRoZSBkZWxheWVkIHRhYmxlIGFjdGlvbnMKKyAgICAvLyBuYW1lbHkgYW55IHJlc29ydGluZyBpZiBuZWNlc3NhcnkKKyAgICAvLworCisgICAgZnVuY3Rpb24gc2hvd2hpZGVEZWxheWVkVGFibGVBY3Rpb24oIGNsbmFtZSwgc2gsIG9yZGVya2V5ICkgeworICAgICAgICBpZiAoICFzaCApIHsKKyAgICAgICAgICAgIHAgPSBnZXRVUkxQYXJhbWV0ZXIoICJvcmRlcmJ5IiApLnNwbGl0KCAiOiIgKVsgMCBdOworICAgICAgICAgICAgaWYgKCBwID09IG9yZGVya2V5ICkgeworICAgICAgICAgICAgICAgIHJlbG9hZF9wYXJhbXMoeyAnb3JkZXJieScgOiAne3tkZWZhdWx0X29yZGVyYnl9fSd9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vCisgICAgLy8gdGhpcyBmdW5jdGlvbiBhY3R1YWxseSBwZXJmb3JtcyB0aGUgaW1tZWRpYXRlIHRhYmxlIGFjdGlvbnMKKyAgICAvLyBuYW1lbHkgYW55IGNvbHVtcyB0aGF0IG5lZWQgdG8gYmUgaGlkZGVuL3Nob3duCisgICAgLy8KKworICAgIGZ1bmN0aW9uIHNob3doaWRlSW1tZWRpYXRlVGFibGVBY3Rpb24oIGNsbmFtZSwgc2gsIG9yZGVya2V5ICkgeworICAgICAgICBpZiAoIHNoICkgeworICAgICAgICAgICAgJCggJy4nICsgY2xuYW1lICkuc2hvdyggMTAwICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAkKCAnLicgKyBjbG5hbWUgKS5oaWRlKCAxMDAgKTsKKyAgICAgICAgfQorCisJLy8gc2F2ZSBjb29raWUgZm9yIGFsbCBjaGVja2JveGVzCisJc2F2ZSA9ICcnOworCSQoICcuY2hieHRvZ2dsZScgKS5lYWNoKGZ1bmN0aW9uKCApIHsKKyAgICAgICAgICAgIGlmICggJCggdGhpcyApLmF0dHIoICdpZCcgKSAhPSB1bmRlZmluZWQgKSB7CisgICAgICAgICAgICAgICAgc2F2ZSArPSAnOycgKyAkKCB0aGlzICkuYXR0ciggJ2lkJyApICsnOicrICQoIHRoaXMgKS5pcyggJzpjaGVja2VkJyApCisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCSQuY29va2llKCAnX2Rpc3BsYXljb2xzX3t7b2JqZWN0bmFtZX19Jywgc2F2ZSApOworCXNhdmUgPSAnJzsKKyAgICB9CisKKyAgICAvLworICAgIC8vIHRoaXMgaXMgdGhlIG9uY2xpY2sgaGFuZGxlciBmb3IgYWxsIG9mIHRoZSBjaGVjayBib3gKKyAgICAvLyBpdGVtcyBpbiBlZGl0IGNvbHVtbnMgZGlhbG9nCisgICAgLy8KKworICAgIGZ1bmN0aW9uIHNob3doaWRlVGFibGVDb2x1bW4oIGNsbmFtZSwgc2gsIG9yZGVya2V5ICkgeworICAgICAgICBlZGl0Y29sID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICdlZGl0Y29sJyApOworICAgICAgICBpZiAoIGVkaXRjb2wub2Zmc2V0V2lkdGggPD0gMCApIHsKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIHRoaXMgcGF0aCBpcyB0YWtlbiB3aGVuIHRoZSBwYWdlIGlzIGZpcnN0CisgICAgICAgICAgICAvLyBnZXR0aW5nIGluaXRpYWxpemVkIC0gbm8gZGlhbG9nIHZpc2libGUsCisgICAgICAgICAgICAvLyBwZXJmb3JtIGJvdGggdGhlIGltbWVkaWF0ZSBhbmQgZGVsYXllZCBhY3Rpb25zCisgICAgICAgICAgICAvLworCisgICAgICAgICAgICBzaG93aGlkZUltbWVkaWF0ZVRhYmxlQWN0aW9uKCBjbG5hbWUsIHNoLCBvcmRlcmtleSApOworICAgICAgICAgICAgc2hvd2hpZGVEZWxheWVkVGFibGVBY3Rpb24oIGNsbmFtZSwgc2gsIG9yZGVya2V5ICk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAhZWRpdENvbFRpbWVyICkgeworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gd2UgZG9uJ3QgaGF2ZSBhIHRpbWVyIGFjdGl2ZSBzbyBzZXQgb25lIHVwCisgICAgICAgICAgICAvLyBhbmQgY2xlYXIgdGhlIGFjdGlvbiBsaXN0CisgICAgICAgICAgICAvLworCisgICAgICAgICAgICBlZGl0Q29sVGltZXIgPSBzZXRJbnRlcnZhbCggY2hlY2tWaXNpYmxlLCAyNTAgKTsKKyAgICAgICAgICAgIGVkaXRDb2xBY3Rpb24gPSBbIF07CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBzYXZlIHRoZSBhY3Rpb24gdG8gYmUgdGFrZW4gd2hlbiB0aGUgZGlhbG9nIGNsb3NlcworICAgICAgICAvLworCisgICAgICAgIGVkaXRDb2xBY3Rpb25bIGNsbmFtZSBdID0gWyBzaCwgb3JkZXJrZXkgXTsKKyAgICAgICAgc2hvd2hpZGVJbW1lZGlhdGVUYWJsZUFjdGlvbiggY2xuYW1lLCBzaCwgb3JkZXJrZXkgKTsKKyAgICB9CisKKyAgICA8L3NjcmlwdD4KKworPCEtLSBjb250cm9sIGhlYWRlciAtLT4KKzxkaXYgY2xhc3M9Im5hdmJhciI+CisgICAgPGRpdiBjbGFzcz0ibmF2YmFyLWlubmVyIj4KKyAgICAgICAgPGZvcm0gY2xhc3M9Im5hdmJhci1zZWFyY2ggaW5wdXQtYXBwZW5kIHB1bGwtbGVmdCIgaWQ9InNlYXJjaGZvcm0iPgorICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJpbnB1dC14eGxhcmdlIiBpZD0ic2VhcmNoIiBuYW1lPSJzZWFyY2giIHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSJTZWFyY2ggeyVpZiBvYmplY3Rfc2VhcmNoX2Rpc3BsYXkgJX17e29iamVjdF9zZWFyY2hfZGlzcGxheX19eyVlbHNlJX17e29iamVjdG5hbWV9fXslZW5kaWYlfSIgdmFsdWU9InslaWYgcmVxdWVzdC5HRVQuc2VhcmNoICV9e3tyZXF1ZXN0LkdFVC5zZWFyY2h9fXslIGVuZGlmICV9Ii8+eyUgaWYgcmVxdWVzdC5HRVQuc2VhcmNoICV9PGEgaHJlZj0iamF2YXNjcmlwdDokKCcjc2VhcmNoJykudmFsKCcnKTtzZWFyY2hmb3JtLnN1Ym1pdCgpIiBjbGFzcz0iYWRkLW9uIGJ0biIgdGFiaW5kZXg9Ii0xIj48aSBjbGFzcz0iaWNvbi1yZW1vdmUiPjwvaT48L2E+eyVlbmRpZiV9CisgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJvcmRlcmJ5IiB2YWx1ZT0ie3tyZXF1ZXN0LkdFVC5vcmRlcmJ5fX0iPgorICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0icGFnZSIgdmFsdWU9IjEiPgorICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIiBpZD0ic2VhcmNoLWJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iU2VhcmNoIj5TZWFyY2g8L2J1dHRvbj4KKyAgICAgICAgPC9mb3JtPgorICAgICAgICA8ZGl2IGNsYXNzPSJwdWxsLXJpZ2h0Ij4KK3slIGlmIHRhYmxlY29scyAlfQorICAgICAgICAgICAgPGRpdiBjbGFzcz0iYnRuLWdyb3VwIj4KKyAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPSJlZGl0LWNvbHVtbnMtYnV0dG9uIiBjbGFzcz0iYnRuIGRyb3Bkb3duLXRvZ2dsZSIgZGF0YS10b2dnbGU9ImRyb3Bkb3duIj5FZGl0IGNvbHVtbnMKKyAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNhcmV0Ij48L3NwYW4+CisgICAgICAgICAgICAgICAgPC9idXR0b24+Cis8IS0tCisJe3t0YWJsZWNvbHN8c29ydGNvbHN9fQorLS0+CisgICAgICAgICAgICAgICAgPHVsIGlkPSdlZGl0Y29sJyBjbGFzcz0iZHJvcGRvd24tbWVudSI+CisgICAgICAgICAgICAgICAgICB7JSBmb3IgaSBpbiB0YWJsZWNvbHN8c29ydGNvbHMgJX0KKyAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIHslIGlmIG5vdCBpLmNsY2xhc3MgJX0gY2xhc3M9ImNoZWNrYm94IG11dGVkIiB7JWVsc2UlfSBjbGFzcz0iY2hlY2tib3giIHslZW5kaWYlfT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGNsYXNzPSJjaGJ4dG9nZ2xlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7JSBpZiBpLmNsY2xhc3MgJX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPSJ7e2kuY2xjbGFzc319IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9ImN0e3tpLm5hbWV9fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHslIGlmIG5vdCBpLmhpZGRlbiAlfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9ImNoZWNrZWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7JWVuZGlmJX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uY2xpY2s9InNob3doaWRlVGFibGVDb2x1bW4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5hdHRyKCdpZCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuaXMoJzpjaGVja2VkJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyUgaWYgaS5vcmRlcmljb24gJX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAne3tpLm9yZGVya2V5fX0nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyUgZWxzZSAlfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHslIGVuZGlmICV9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7JWVsc2UlfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZCBkaXNhYmxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7JSBlbmRpZiAlfS8+ICAge3tpLm5hbWV9fQorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KKyAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgIHslIGVuZGZvciAlfQorICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgICAgICA8L2Rpdj4KK3slIGVuZGlmICV9CisgICAgICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OmlubGluZSI+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImRpdmlkZXItdmVydGljYWwiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaGVscC1pbmxpbmUiIHN0eWxlPSJwYWRkaW5nLXRvcDo1cHg7Ij5TaG93IHJvd3M6PC9zcGFuPgorICAgICAgICAgICAgICAgIDxzZWxlY3Qgc3R5bGU9Im1hcmdpbi10b3A6NXB4O21hcmdpbi1ib3R0b206MHB4OyIgY2xhc3M9InBhZ2VzaXplIj4KKyAgICAgICAgICAgICAgICAgIHslIHdpdGggIjEwIDI1IDUwIDEwMCAxNTAiIGFzIGxpc3QlfQorICAgICAgICAgICAgICAgICAgICB7JSBmb3IgaSBpbiBsaXN0LnNwbGl0ICV9CisgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ7e2l9fSI+e3tpfX08L29wdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgeyUgZW5kZm9yICV9CisgICAgICAgICAgICAgICAgICB7JSBlbmR3aXRoICV9CisgICAgICAgICAgICAgICAgPC9zZWxlY3Q+CisgICAgICAgICAgIDwvZGl2PgorICAgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4gPCEtLSBuYXZiYXItaW5uZXIgLS0+Cis8L2Rpdj4KKworPCEtLSB0aGUgYWN0dWFsIHJvd3Mgb2YgdGhlIHRhYmxlIC0tPgorICAgIDx0YWJsZSBjbGFzcz0idGFibGUgdGFibGUtYm9yZGVyZWQgdGFibGUtaG92ZXIgdGFibGVzb3J0ZXIiIGlkPSJvdGFibGUiPgorICAgIDx0aGVhZD4KKyAgICAgICAgPCEtLSBUYWJsZSBoZWFkZXIgcm93OyBnZW5lcmF0ZWQgZnJvbSAidGFibGVjb2xzIiBlbnRyeSBpbiB0aGUgY29udGV4dCBkaWN0IC0tPgorICAgICAgICA8dHI+CisgICAgICAgICAgICB7JSBmb3IgdGMgaW4gdGFibGVjb2xzICV9PHRoIGNsYXNzPSJ7JWlmIHRjLmRjbGFzcyV9e3t0Yy5kY2xhc3N9fXslZW5kaWYlfSB7JSBpZiB0Yy5jbGNsYXNzICV9e3t0Yy5jbGNsYXNzfX17JSBlbmRpZiAlfSI+CisgICAgICAgICAgICAgICAgeyVpZiB0Yy5xaGVscCV9PGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCIgdGl0bGU9Int7dGMucWhlbHB9fSI+PC9pPnslZW5kaWYlfQorICAgICAgICAgICAgICAgIHslaWYgdGMub3JkZXJmaWVsZCV9PGEgeyVpZiB0Yy5vcmRlcmljb24lfSBjbGFzcz0ic29ydGVkIiB7JWVuZGlmJX1ocmVmPSJqYXZhc2NyaXB0OnJlbG9hZF9wYXJhbXMoeydwYWdlJzogMSwgJ29yZGVyYnknIDogJ3t7dGMub3JkZXJmaWVsZH19JyB9KSI+e3t0Yy5uYW1lfX08L2E+eyVlbHNlJX08c3BhbiBjbGFzcz0ibXV0ZWQiPnt7dGMubmFtZX19PC9zcGFuPnslZW5kaWYlfQorICAgICAgICAgICAgICAgIHslaWYgdGMub3JkZXJpY29uJX0gPGkgY2xhc3M9Imljb24tY2FyZXQte3t0Yy5vcmRlcmljb259fSI+PC9pPnslZW5kaWYlfQorICAgICAgICAgICAgICAgIHslaWYgdGMuZmlsdGVyJX08ZGl2IGNsYXNzPSJidG4tZ3JvdXAgcHVsbC1yaWdodCI+CisgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiNmaWx0ZXJfe3t0Yy5maWx0ZXIuY2xhc3N9fSIgcm9sZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1taW5pIHslaWYgcmVxdWVzdC5HRVQuZmlsdGVyJX17e3RjLmZpbHRlci5vcHRpb25zfGZpbHRlcmVkX2ljb246cmVxdWVzdC5HRVQuZmlsdGVyfX0geyVlbmRpZiV9IiB7JWlmIHJlcXVlc3QuR0VULmZpbHRlciBhbmQgdGMuZmlsdGVyLm9wdGlvbnN8ZmlsdGVyZWRfdG9vbHRpcDpyZXF1ZXN0LkdFVC5maWx0ZXIgJX0gdGl0bGU9IjxwPnt7dGMuZmlsdGVyLm9wdGlvbnN8ZmlsdGVyZWRfdG9vbHRpcDpyZXF1ZXN0LkdFVC5maWx0ZXJ9fTwvcD48cD48YSBjbGFzcz0nYnRuIGJ0bi1zbWFsbCBidG4tcHJpbWFyeScgaHJlZj1qYXZhc2NyaXB0OnJlbG9hZF9wYXJhbXMoeydmaWx0ZXInOicnfSk+U2hvdyBhbGwgeyUgaWYgZmlsdGVyX3NlYXJjaF9kaXNwbGF5ICV9e3tmaWx0ZXJfc2VhcmNoX2Rpc3BsYXl9fXslIGVsc2UgJX17e29iamVjdG5hbWV9fXslIGVuZGlmICV9PC9hPjwvcD4iIHslZW5kaWYlfSBkYXRhLXRvZ2dsZT0ibW9kYWwiPiA8aSBjbGFzcz0iaWNvbi1maWx0ZXIgZmlsdGVyZWQiPjwvaT4gPC9hPgorICAgICAgICAgICAgICAgIDwvZGl2PnslZW5kaWYlfQorICAgICAgICAgICAgPC90aD57JSBlbmRmb3IgJX0KKyAgICAgICAgPC90cj4KKyAgICA8L3RoZWFkPgorICAgIDx0Ym9keT4KKwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9iYXNldGFibGVfdG9wX2xheWVycy5odG1sIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9iYXNldGFibGVfdG9wX2xheWVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMjA5MWIKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL2Jhc2V0YWJsZV90b3BfbGF5ZXJzLmh0bWwKQEAgLTAsMCArMSw1IEBACit7JSBleHRlbmRzICJiYXNldGFibGVfdG9wLmh0bWwiICV9CisKK3slYmxvY2sgY3VzdG9tYnV0dG9ucyAlfQorICAgIDxhIGNsYXNzPSJidG4iIGhyZWY9InslIHVybCAnaW1wb3J0bGF5ZXInIHByb2plY3QuaWQgJX0iIHN0eWxlPSJtYXJnaW4tcmlnaHQ6NXB4OyI+SW1wb3J0IGxheWVyPC9hPgoreyVlbmRibG9jayV9CmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL2JmaWxlLmh0bWwgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL2JmaWxlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdmNTk0MwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvYmZpbGUuaHRtbApAQCAtMCwwICsxLDI0IEBACit7JSBleHRlbmRzICJiYXNlYnVpbGRwYWdlLmh0bWwiICV9CisKK3slIGJsb2NrIHBhZ2V0aXRsZSAlfUZpbGVzIGZvciBwYWNrYWdlIHt7b2JqZWN0cy4wLmJwYWNrYWdlLm5hbWV9fSB7JSBlbmRibG9jayAlfQoreyUgYmxvY2sgcGFnZXRhYmxlICV9CisgICAgeyUgaWYgbm90IG9iamVjdHMgJX0KKyAgICAgICAgPHA+Tm8gZmlsZXMgd2VyZSByZWNvcmRlZCBmb3IgdGhpcyBwYWNrYWdlITwvcD4KKyAgICB7JSBlbHNlICV9CisKKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5OYW1lPC90aD4KKyAgICAgICAgICAgIDx0aD5TaXplIChCeXRlcyk8L3RoPgorICAgICAgICAgICAgPC90cj4KKworICAgICAgICAgICAgeyUgZm9yIGZpbGUgaW4gb2JqZWN0cyAlfQorCisgICAgICAgICAgICA8dHIgY2xhc3M9ImRhdGEiPgorICAgICAgICAgICAgPHRkPnt7ZmlsZS5wYXRofX08L3RkPgorICAgICAgICAgICAgPHRkPnt7ZmlsZS5zaXplfX08L3RkPgorCisgICAgICAgICAgICB7JSBlbmRmb3IgJX0KKworICAgIHslIGVuZGlmICV9CisKK3slIGVuZGJsb2NrICV9CmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL2JwYWNrYWdlLmh0bWwgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL2JwYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc3NWZlYwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvYnBhY2thZ2UuaHRtbApAQCAtMCwwICsxLDEwNyBAQAoreyUgZXh0ZW5kcyAiYmFzZWJ1aWxkcGFnZS5odG1sIiAlfQorCit7JSBsb2FkIHByb2plY3R0YWdzICV9CisKK3slIGJsb2NrIGxvY2FsYnJlYWRjcnVtYiAlfQorPGxpPlBhY2thZ2VzPC9saT4KK3slIGVuZGJsb2NrICV9CisKK3slIGJsb2NrIG5hdi1wYWNrYWdlcyAlfQorICA8bGkgY2xhc3M9ImFjdGl2ZSI+PGEgaHJlZj0ieyUgdXJsICdwYWNrYWdlcycgYnVpbGQucGsgJX0iPlBhY2thZ2VzPC9hPjwvbGk+Cit7JSBlbmRibG9jayAlfQorCit7JSBibG9jayBidWlsZGluZm9tYWluICV9Cis8ZGl2IGNsYXNzPSJzcGFuMTAiPgorCit7JSBpZiBub3QgcmVxdWVzdC5HRVQuZmlsdGVyIGFuZCBub3QgcmVxdWVzdC5HRVQuc2VhcmNoIGFuZCBub3Qgb2JqZWN0cy5wYWdpbmF0b3IuY291bnQgJX0KKworPCEtLSBFbXB0eSAtIG5vIGRhdGEgaW4gZGF0YWJhc2UgLS0+Cis8ZGl2IGNsYXNzPSJwYWdlLWhlYWRlciI+CisgICAgPGgxPgorICAgICAgICBQYWNrYWdlcworICAgIDwvaDE+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LWluZm8gbGVhZCI+CisgICAgPHN0cm9uZz5ObyBwYWNrYWdlcyB3ZXJlIGJ1aWx0Ljwvc3Ryb25nPiBIb3cgZGlkIHRoaXMgaGFwcGVuPyBXZWxsLCBCaXRCYWtlIHJldXNlcyBhcyBtdWNoIHN0dWZmIGFzIHBvc3NpYmxlLgorICAgIElmIGFsbCBvZiB0aGUgcGFja2FnZXMgbmVlZGVkIHdlcmUgYWxyZWFkeSBidWlsdCBhbmQgYXZhaWxhYmxlIGluIHlvdXIgYnVpbGQgaW5mcmFzdHJ1Y3R1cmUsIEJpdEJha2UKKyAgICB3aWxsIG5vdCByZWJ1aWxkIGFueSBvZiB0aGVtLiBUaGlzIG1pZ2h0IGJlIHNsaWdodGx5IGNvbmZ1c2luZywgYnV0IGl0IGRvZXMgbWFrZSBldmVyeXRoaW5nIGZhc3Rlci4KKzwvZGl2PgorCit7JSBlbHNlICV9CisKKzxkaXYgY2xhc3M9InBhZ2UtaGVhZGVyIj4KKyAgPGgxPgorICB7JSBpZiByZXF1ZXN0LkdFVC5zZWFyY2ggYW5kIG9iamVjdHMucGFnaW5hdG9yLmNvdW50ID4gMCAgJX0KKyAgICAgIHt7b2JqZWN0cy5wYWdpbmF0b3IuY291bnR9fSBwYWNrYWdle3tvYmplY3RzLnBhZ2luYXRvci5jb3VudHxwbHVyYWxpemV9fSBmb3VuZAorICB7JWVsaWYgcmVxdWVzdC5HRVQuc2VhcmNoIGFuZCBvYmplY3RzLnBhZ2luYXRvci5jb3VudCA9PSAwJX0KKyAgICAgIE5vIHBhY2thZ2VzIGZvdW5kCisgIHslZWxzZSV9CisgICAgICBQYWNrYWdlcworICB7JWVuZGlmJX0KKyAgPC9oMT4KKzwvZGl2PgorCisgIHslIGlmIG9iamVjdHMucGFnaW5hdG9yLmNvdW50ID09IDAgJX0KKyAgPGRpdiBjbGFzcz0icm93LWZsdWlkIj4KKyAgICAgIDxkaXYgY2xhc3M9ImFsZXJ0Ij4KKyAgICAgICAgPGZvcm0gY2xhc3M9Im5vLXJlc3VsdHMgaW5wdXQtYXBwZW5kIiBpZD0ic2VhcmNoZm9ybSI+CisgICAgICAgICAgICA8aW5wdXQgaWQ9InNlYXJjaCIgbmFtZT0ic2VhcmNoIiBjbGFzcz0iaW5wdXQteHhsYXJnZSIgdHlwZT0idGV4dCIgdmFsdWU9Int7cmVxdWVzdC5HRVQuc2VhcmNofX0iLz57JSBpZiByZXF1ZXN0LkdFVC5zZWFyY2ggJX08YSBocmVmPSJqYXZhc2NyaXB0OiQoJyNzZWFyY2gnKS52YWwoJycpO3NlYXJjaGZvcm0uc3VibWl0KCkiIGNsYXNzPSJhZGQtb24gYnRuIiB0YWJpbmRleD0iLTEiPjxpIGNsYXNzPSJpY29uLXJlbW92ZSI+PC9pPjwvYT57JSBlbmRpZiAlfQorICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJTZWFyY2giPlNlYXJjaDwvYnV0dG9uPgorICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1saW5rIiBvbmNsaWNrPSJqYXZhc2NyaXB0OiQoJyNzZWFyY2gnKS52YWwoJycpO3NlYXJjaGZvcm0uc3VibWl0KCkiPlNob3cgYWxsIHBhY2thZ2VzPC9idXR0b24+CisgICAgICAgIDwvZm9ybT4KKyAgICAgIDwvZGl2PgorICA8L2Rpdj4KKworICB7JSBlbHNlICV9CisgIHslIGluY2x1ZGUgImJhc2V0YWJsZV90b3AuaHRtbCIgJX0KKworICAgIHslIGZvciBwYWNrYWdlIGluIG9iamVjdHMgJX0KKworICAgIDx0ciBjbGFzcz0iZGF0YSI+CisKKyAgICAgICAgPCEtLSBQYWNrYWdlIC0tPgorICAgICAgICA8dGQgY2xhc3M9InBhY2thZ2VfbmFtZSI+PGEgaHJlZj0ieyUgdXJsICJwYWNrYWdlX2J1aWx0X2RldGFpbCIgYnVpbGQucGsgcGFja2FnZS5wayAlfSI+e3twYWNrYWdlLm5hbWV9fTwvYT48L3RkPgorICAgICAgICA8IS0tIFBhY2thZ2UgVmVyc2lvbiAtLT4KKyAgICAgICAgPHRkIGNsYXNzPSJwYWNrYWdlX3ZlcnNpb24iPnslaWYgcGFja2FnZS52ZXJzaW9uJX08YSBocmVmPSJ7JSB1cmwgInBhY2thZ2VfYnVpbHRfZGV0YWlsIiBidWlsZC5wayBwYWNrYWdlLnBrICV9Ij57e3BhY2thZ2UudmVyc2lvbn19LXt7cGFja2FnZS5yZXZpc2lvbn19PC9hPnslZW5kaWYlfTwvdGQ+CisgICAgICAgIDwhLS0gUGFja2FnZSBTaXplIC0tPgorICAgICAgICA8dGQgY2xhc3M9InNpemUgc2l6ZWNvbCI+e3twYWNrYWdlLnNpemV8ZmlsdGVyZWRfZmlsZXNpemVmb3JtYXR9fTwvdGQ+CisgICAgICAgIDwhLS0gTGljZW5zZSAtLT4KKyAgICAgICAgPHRkIGNsYXNzPSJsaWNlbnNlIj57e3BhY2thZ2UubGljZW5zZX19PC90ZD4KKworICAgICAgICB7JWlmIHBhY2thZ2UucmVjaXBlJX0KKyAgICAgICAgICAgIDwhLS0gUmVjaXBlIC0tPgorICAgICAgICAgICAgPHRkIGNsYXNzPSJyZWNpcGVfX25hbWUiPjxhIGhyZWY9InslIHVybCAicmVjaXBlIiBidWlsZC5wayBwYWNrYWdlLnJlY2lwZS5wayAlfSI+e3twYWNrYWdlLnJlY2lwZS5uYW1lfX08L2E+PC90ZD4KKyAgICAgICAgICAgIDwhLS0gUmVjaXBlIFZlcnNpb24gLS0+CisgICAgICAgICAgICA8dGQgY2xhc3M9InJlY2lwZV9fdmVyc2lvbiI+PGEgaHJlZj0ieyUgdXJsICJyZWNpcGUiIGJ1aWxkLnBrIHBhY2thZ2UucmVjaXBlLnBrICV9Ij57e3BhY2thZ2UucmVjaXBlLnZlcnNpb259fTwvYT48L3RkPgorCisgICAgICAgICAgICA8IS0tIExheWVyIC0tPgorICAgICAgICAgICAgPHRkIGNsYXNzPSJyZWNpcGVfX2xheWVyX3ZlcnNpb25fX2xheWVyX19uYW1lIj57e3BhY2thZ2UucmVjaXBlLmxheWVyX3ZlcnNpb24ubGF5ZXIubmFtZX19PC90ZD4KKyAgICAgICAgICAgIDwhLS0gTGF5ZXIgYnJhbmNoIC0tPgorICAgICAgICAgICAgPHRkIGNsYXNzPSJyZWNpcGVfX2xheWVyX3ZlcnNpb25fX2JyYW5jaCI+e3twYWNrYWdlLnJlY2lwZS5sYXllcl92ZXJzaW9uLmJyYW5jaH19PC90ZD4KKyAgICAgICAgICAgIDwhLS0gTGF5ZXIgY29tbWl0IC0tPgorICAgICAgICAgICAgPHRkIGNsYXNzPSJyZWNpcGVfX2xheWVyX3ZlcnNpb25fX2xheWVyX19jb21taXQiPgorICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJidG4iCisgICAgICAgICAgICAgICAgICAgIGRhdGEtY29udGVudD0iPHVsIGNsYXNzPSd1bnN0eWxlZCc+CisgICAgICAgICAgICAgICAgICAgICAgPGxpPnt7cGFja2FnZS5yZWNpcGUubGF5ZXJfdmVyc2lvbi5jb21taXR9fTwvbGk+CisgICAgICAgICAgICAgICAgICAgIDwvdWw+Ij4KKyAgICAgICAgICAgICAgICAgICAge3twYWNrYWdlLnJlY2lwZS5sYXllcl92ZXJzaW9uLmNvbW1pdHx0cnVuY2F0ZWNoYXJzOjEzfX0KKyAgICAgICAgICAgICAgICA8L2E+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgPCEtLSBMYXllciBkaXJlY3RvcnkgLS0+CisgICAgICAgIHslZWxzZSV9CisgICAgICAgICAgICA8dGQgY2xhc3M9InJlY2lwZV9fbmFtZSI+PC90ZD4KKyAgICAgICAgICAgIDx0ZCBjbGFzcz0icmVjaXBlX192ZXJzaW9uIj48L3RkPgorICAgICAgICAgICAgPHRkIGNsYXNzPSJyZWNpcGVfX2xheWVyX3ZlcnNpb25fX2xheWVyX19uYW1lIj48L3RkPgorICAgICAgICAgICAgPHRkIGNsYXNzPSJyZWNpcGVfX2xheWVyX3ZlcnNpb25fX2JyYW5jaCI+PC90ZD4KKyAgICAgICAgICAgIDx0ZCBjbGFzcz0icmVjaXBlX19sYXllcl92ZXJzaW9uX19sYXllcl9fY29tbWl0Ij48L3RkPgorICAgICAgICAgICAgPHRkIGNsYXNzPSJyZWNpcGVfX2xheWVyX3ZlcnNpb25fX2xvY2FsX3BhdGgiPjwvdGQ+CisgICAgICAgIHslZW5kaWYlfQorCisgICAgPC90cj4KKyAgICB7JSBlbmRmb3IgJX0KKworICB7JSBpbmNsdWRlICJiYXNldGFibGVfYm90dG9tLmh0bWwiICV9CisgIHslIGVuZGlmICV9IHsjIG9iamVjdHMucGFnaW5hdG9yLmNvdW50ICN9Cit7JSBlbmRpZiAlfSB7IyBFbXB0eSAjfQorPC9kaXY+Cit7JSBlbmRibG9jayAlfQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9icnRhcmdldHMuaHRtbCBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvYnJ0YXJnZXRzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGViZDA1OAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvYnJ0YXJnZXRzLmh0bWwKQEAgLTAsMCArMSwyMCBAQAorPHNwYW4gZGF0YS10b2dnbGU9InRvb2x0aXAiCisgICAgeyUgaWYgYnVpbGRyZXF1ZXN0LmJydGFyZ2V0X3NldC5hbGwuY291bnQgPiAxICV9CisgICAgICAgIHRpdGxlPSJUYXJnZXRzOgorICAgICAgICB7JSBmb3IgdGFyZ2V0IGluIGJ1aWxkcmVxdWVzdC5icnRhcmdldF9zZXQuYWxsICV9CisgICAgICAgICAgICB7JSBpZiB0YXJnZXQudGFzayAlfQorICAgICAgICAgICAgICAgIHt7dGFyZ2V0LnRhcmdldH19Ont7dGFyZ2V0LnRhc2t9fQorICAgICAgICAgICAgeyUgZWxzZSAlfQorICAgICAgICAgICAgICAgIHt7dGFyZ2V0LnRhcmdldH19CisgICAgICAgICAgICB7JSBlbmRpZiAlfQorICAgICAgICB7JWVuZGZvciV9IgorICAgIHslZW5kaWYlfT4KKyAgICB7JSBpZiBidWlsZHJlcXVlc3QuYnJ0YXJnZXRfc2V0LmFsbC4wLnRhc2sgJX0KKyAgICAgICAge3tidWlsZHJlcXVlc3QuYnJ0YXJnZXRfc2V0LmFsbC4wLnRhcmdldH19Ont7YnVpbGRyZXF1ZXN0LmJydGFyZ2V0X3NldC5hbGwuMC50YXNrfX0KKyAgICB7JSBlbHNlICV9CisgICAgICAgICB7e2J1aWxkcmVxdWVzdC5icnRhcmdldF9zZXQuYWxsLjAudGFyZ2V0fX0KKyAgICB7JSBlbmRpZiAlfQorICAgIHslIGlmIGJ1aWxkcmVxdWVzdC5icnRhcmdldF9zZXQuYWxsLmNvdW50ID4gMSAlfQorICAgICAgICAoKyB7e2J1aWxkcmVxdWVzdC5icnRhcmdldF9zZXQuYWxsLmNvdW50fGFkZDoiLTEifX0pCisgICAgeyUgZW5kaWYgJX0KKzwvc3Bhbj4KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvYnVpbGRkYXNoYm9hcmQuaHRtbCBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvYnVpbGRkYXNoYm9hcmQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWI4ZTM4Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9idWlsZGRhc2hib2FyZC5odG1sCkBAIC0wLDAgKzEsMzA3IEBACit7JSBleHRlbmRzICJiYXNlYnVpbGRwYWdlLmh0bWwiICV9Cit7JSBsb2FkIGh1bWFuaXplICV9Cit7JSBsb2FkIHByb2plY3R0YWdzICV9CisKK3slIGJsb2NrIHBhcmVudGJyZWFkY3J1bWIgJX0KK3t7YnVpbGQuZ2V0X3NvcnRlZF90YXJnZXRfbGlzdC4wLnRhcmdldH19IHslaWYgYnVpbGQudGFyZ2V0X3NldC5hbGwuY291bnQgPiAxJX0oKyB7e2J1aWxkLnRhcmdldF9zZXQuYWxsLmNvdW50fGFkZDoiLTEifX0peyVlbmRpZiV9IHt7YnVpbGQubWFjaGluZX19ICh7e2J1aWxkLmNvbXBsZXRlZF9vbnxkYXRlOiJkL20veSBIOmkifX0pCit7JSBlbmRibG9jayAlfQorCit7JSBibG9jayBidWlsZGluZm9tYWluICV9Cis8IS0tIHBhZ2UgdGl0bGUgLS0+Cis8ZGl2IGNsYXNzPSJyb3ctZmx1aWQgc3BhbjEwIj4KKyA8ZGl2IGNsYXNzPSJwYWdlLWhlYWRlciI+CisgICAgIDxoMT57e2J1aWxkLnRhcmdldF9zZXQuYWxsfGRpY3Rzb3J0OiJ0YXJnZXQifGpvaW46IiwgIn19IHt7YnVpbGQubWFjaGluZX19PC9oMT4KKyA8L2Rpdj4KKzwvZGl2PgorCis8IS0tIGJ1aWxkIHJlc3VsdCBiYXIgLS0+Cis8ZGl2IGNsYXNzPSJyb3ctZmx1aWQgc3BhbjEwIHB1bGwtcmlnaHQiPgorICA8ZGl2IGNsYXNzPSJhbGVydCB7JWlmIGJ1aWxkLm91dGNvbWUgPT0gYnVpbGQuU1VDQ0VFREVEJX1hbGVydC1zdWNjZXNzeyVlbGlmIGJ1aWxkLm91dGNvbWUgPT0gYnVpbGQuRkFJTEVEJX1hbGVydC1lcnJvcnslZWxzZSV9YWxlcnQtaW5mb3slZW5kaWYlfSI+CisgICAgPGRpdiBjbGFzcz0icm93LWZsdWlkIGxlYWQiPgorICAgICAgICAgICAgPHNwYW4gY2xhc3M9InB1bGwtbGVmdCI+PHN0cm9uZz4KKyAgICAgICAgICAgICAgICB7JWlmIGJ1aWxkLm91dGNvbWUgPT0gYnVpbGQuU1VDQ0VFREVEJX1Db21wbGV0ZWR7JWVsaWYgYnVpbGQub3V0Y29tZSA9PSBidWlsZC5GQUlMRUQlfUZhaWxlZHslZWxzZSV9eyVlbmRpZiV9CisgICAgICAgICAgICAgIDwvc3Ryb25nPiBvbgorICAgICAgICAgICAge3tidWlsZC5jb21wbGV0ZWRfb258ZGF0ZToiZC9tL3kgSDppIn19Cis8L3NwYW4+Cit7JSBpZiAgYnVpbGQud2FybmluZ3MuY291bnQgb3IgYnVpbGQuZXJyb3JzLmNvdW50ICV9CismbmJzcDt3aXRoCit7JSBlbmRpZiAlfQoreyVpZiBidWlsZC5vdXRjb21lID09IGJ1aWxkLlNVQ0NFRURFRCBvciBidWlsZC5vdXRjb21lID09IGJ1aWxkLkZBSUxFRCAlfQoreyUgaWYgIGJ1aWxkLmVycm9ycy5jb3VudCAlfQorICAgICA8c3BhbiA+IDxpIGNsYXNzPSJpY29uLW1pbnVzLXNpZ24gcmVkIj48L2k+PHN0cm9uZz48YSBocmVmPSIjZXJyb3JzIiBjbGFzcz0iZXJyb3Igc2hvdy1lcnJvcnMiPiB7e2J1aWxkLmVycm9ycy5jb3VudH19IGVycm9ye3tidWlsZC5lcnJvcnMuY291bnR8cGx1cmFsaXplfX08L2E+PC9zdHJvbmc+PC9zcGFuPgoreyUgZW5kaWYgJX0KK3slIGlmICBidWlsZC53YXJuaW5ncy5jb3VudCAlfQoreyUgaWYgIGJ1aWxkLmVycm9ycy5jb3VudCAlfQorICAgIGFuZAoreyUgZW5kaWYgJX0KKyAgICA8c3BhbiA+IDxpIGNsYXNzPSJpY29uLXdhcm5pbmctc2lnbiB5ZWxsb3ciPjwvaT48c3Ryb25nPjxhIGhyZWY9IiN3YXJuaW5ncyIgY2xhc3M9Indhcm5pbmcgc2hvdy13YXJuaW5ncyI+IHt7YnVpbGQud2FybmluZ3MuY291bnR9fSB3YXJuaW5ne3tidWlsZC53YXJuaW5ncy5jb3VudHxwbHVyYWxpemV9fTwvYT48L3N0cm9uZz48L3NwYW4+Cit7JSBlbmRpZiAlfQorICAgICAgICAgICAgPHNwYW4gY2xhc3M9InB1bGwtcmlnaHQiPkJ1aWxkIHRpbWU6IDxhIGhyZWY9InslIHVybCAnYnVpbGR0aW1lJyBidWlsZC5wayAlfSI+e3sgYnVpbGQudGltZXNwZW50X3NlY29uZHN8c2VjdG9obXMgfX08L2E+CisgICAgICAgICAgICA8YSBjbGFzcz0iYnRuIHslaWYgYnVpbGQub3V0Y29tZSA9PSBidWlsZC5TVUNDRUVERUQlfWJ0bi1zdWNjZXNzeyVlbHNlJX1idG4tZGFuZ2VyeyVlbmRpZiV9IHB1bGwtcmlnaHQgbG9nIiBocmVmPSJ7JSB1cmwgJ2J1aWxkX2FydGlmYWN0JyBidWlsZC5pZCAiY29va2VybG9nIiBidWlsZC5pZCAlfSI+RG93bmxvYWQgYnVpbGQgbG9nPC9hPgorICAgICAgICAgICAgPC9zcGFuPgorCit7JWVuZGlmJX0KKyAgICA8L2Rpdj4KKyAgICB7JSBpZiBidWlsZC50b2FzdGVyX2V4Y2VwdGlvbnMuY291bnQgPiAwICV9CisgICAgPGRpdiBjbGFzcz0icm93Ij4KKyAgICAgICAgPHNtYWxsIGNsYXNzPSJwdWxsLXJpZ2h0Ij4KKyAgICAgICAgPGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCBnZXQtaGVscC1ibHVlIiB0aXRsZT0iIiBkYXRhLW9yaWdpbmFsLXRpdGxlPSJUb2FzdGVyIGV4Y2VwdGlvbnMgZG8gbm90IGFmZmVjdCB5b3VyIGJ1aWxkOiBvbmx5IHRoZSBvcGVyYXRpb24gb2YgVG9hc3RlciI+PC9pPgorICAgICAgICA8YSBjbGFzcz0ic2hvdy1leGNlcHRpb25zIiBocmVmPSIjZXhjZXB0aW9ucyI+VG9hc3RlciB0aHJldyB7e2J1aWxkLnRvYXN0ZXJfZXhjZXB0aW9ucy5jb3VudH19IGV4Y2VwdGlvbnt7YnVpbGQudG9hc3Rlcl9leGNlcHRpb25zLmNvdW50fHBsdXJhbGl6ZX19PC9hPgorICAgIDwvc21hbGw+CisgICAgPC9kaXY+CisgICAgeyUgZW5kaWYgJX0KKyAgPC9kaXY+Cis8L2Rpdj4KKworeyUgaWYgYnVpbGQuZXJyb3JzLmNvdW50ICV9Cis8ZGl2IGNsYXNzPSJhY2NvcmRpb24gc3BhbjEwIHB1bGwtcmlnaHQiIGlkPSJlcnJvcnMiPgorICA8ZGl2IGNsYXNzPSJhY2NvcmRpb24tZ3JvdXAiPgorICAgIDxkaXYgY2xhc3M9ImFjY29yZGlvbi1oZWFkaW5nIj4KKyAgICAgICAgICAgIDxhIGNsYXNzPSJhY2NvcmRpb24tdG9nZ2xlIGVycm9yIHRvZ2dsZS1lcnJvcnMiPgorICAgICAgICAgPGgyIGlkPSJlcnJvci10b2dnbGUiPgorICAgICAgICAgICA8aSBjbGFzcz0iaWNvbi1taW51cy1zaWduIj48L2k+CisgICAgICAgICAgIHt7YnVpbGQuZXJyb3JzLmNvdW50fX0gZXJyb3J7e2J1aWxkLmVycm9ycy5jb3VudHxwbHVyYWxpemV9fQorICAgICAgICAgPC9oMj4KKyAgICAgIDwvYT4KKyAgICA8L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJhY2NvcmRpb24tYm9keSBjb2xsYXBzZSBpbiIgaWQ9ImNvbGxhcHNlLWVycm9ycyI+CisgICAgICA8ZGl2IGNsYXNzPSJhY2NvcmRpb24taW5uZXIiPgorICAgICAgICA8ZGl2IGNsYXNzPSJzcGFuMTAiPgorICAgICAgICAgIHslIGZvciBlcnJvciBpbiBsb2dtZXNzYWdlcyAlfXslIGlmIGVycm9yLmxldmVsID09IDIgJX0KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LWVycm9yIj4KKyAgICAgICAgICAgICAgPHByZT57e2Vycm9yLm1lc3NhZ2V9fTwvcHJlPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgeyUgZW5kaWYgJX0KKyAgICAgICAgICB7JSBlbmRmb3IgJX0KKyAgICAgICAgPC9kaXY+CisgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKyAgPC9kaXY+Cis8L2Rpdj4KK3slIGVuZGlmICV9CisKK3slaWYgYnVpbGQub3V0Y29tZSA9PSBidWlsZC5TVUNDRUVERUQlfQorPCEtLSBidWlsdCBpbWFnZXMgLS0+Cit7JSBpZiBoYXNJbWFnZXMgJX0KKzxkaXYgY2xhc3M9InJvdy1mbHVpZCBzcGFuMTAgcHVsbC1yaWdodCI+CisgICAgPGgyPkltYWdlczwvaDI+CisgICAgeyUgZm9yIHRhcmdldCBpbiB0YXJnZXRzICV9CisgICAgICAgIHslIGlmIHRhcmdldC50YXJnZXQuaXNfaW1hZ2UgJX0KKyAgICA8ZGl2IGNsYXNzPSJ3ZWxsIGRhc2hib2FyZC1zZWN0aW9uIj4KKyAgICAgICAgPGgzPjxhIGhyZWY9InslIHVybCAndGFyZ2V0JyBidWlsZC5wayB0YXJnZXQudGFyZ2V0LnBrICV9Ij57e3RhcmdldC50YXJnZXR9fTwvYT4KKyAgICAgICAgICAgICAgICA8L2gzPgorICAgICAgICA8ZGwgY2xhc3M9ImRsLWhvcml6b250YWwiPgorICAgICAgICAgICAgPGR0PlBhY2thZ2VzIGluY2x1ZGVkPC9kdD4KKyAgICAgICAgICAgIDxkZD48YSBocmVmPSJ7JSB1cmwgJ3RhcmdldCcgYnVpbGQucGsgdGFyZ2V0LnRhcmdldC5wayAlfSI+e3t0YXJnZXQubnBrZ319PC9hPjwvZGQ+CisgICAgICAgICAgICA8ZHQ+VG90YWwgcGFja2FnZSBzaXplPC9kdD4KKyAgICAgICAgICAgIDxkZD57e3RhcmdldC5wa2dzenxmaWx0ZXJlZF9maWxlc2l6ZWZvcm1hdH19PC9kZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIHslIGlmIHRhcmdldC50YXJnZXRIYXNOb0ltYWdlcyAlfQorICAgICAgICAgICAgICAgIDwvZGw+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93LWZsdWlkIj4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtaW5mbyBzcGFuNyI+CisgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGI+VGhpcyBidWlsZCBkaWQgbm90IGNyZWF0ZSBhbnkgaW1hZ2UgZmlsZXM8L2I+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBwcm9iYWJseSBiZWNhdXNlIHZhbGlkIGltYWdlIGFuZCBsaWNlbnNlIG1hbmlmZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlcyBmcm9tIGEgcHJldmlvdXMgYnVpbGQgYWxyZWFkeSBleGlzdCBpbiB5b3VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT4uLi4vcG9reS9idWlsZC90bXAvZGVwbG95PC9jb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5LiBZb3UgY2FuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHNvIDxhIGhyZWY9InslIHVybCAndGFyZ2V0cGtnJyBidWlsZC5wayB0YXJnZXQudGFyZ2V0LnBrICV9Ij52aWV3IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWNlbnNlIG1hbmlmZXN0IGluZm9ybWF0aW9uPC9hPiBpbiBUb2FzdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICB7JSBlbHNlICV9CisgICAgICAgICAgICA8ZHQ+CisgICAgICAgICAgICAgICAgPGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCIgdGl0bGU9IlRoZSBsb2NhdGlvbiBpbiBkaXNrIG9mIHRoZSBsaWNlbnNlIG1hbmlmZXN0LCBhIGRvY3VtZW50IGxpc3RpbmcgYWxsIHBhY2thZ2VzIGluc3RhbGxlZCBpbiB5b3VyIGltYWdlIGFuZCB0aGVpciBsaWNlbnNlcyI+PC9pPgorCisgICAgICAgICAgICAgICAgTGljZW5zZSBtYW5pZmVzdAorICAgICAgICAgICAgPC9kdD4KKyAgICAgICAgICAgIDxkZD4KKyAgICAgICAgICAgICAgICA8YSBocmVmPSJ7JSB1cmwgJ3RhcmdldHBrZycgYnVpbGQucGsgdGFyZ2V0LnRhcmdldC5wayAlfSI+VmlldyBpbiBUb2FzdGVyPC9hPiB8CisgICAgICAgICAgICAgICAgPGEgaHJlZj0ieyUgdXJsICdidWlsZF9hcnRpZmFjdCcgYnVpbGQucGsgJ2xpY2Vuc2VtYW5pZmVzdCcgdGFyZ2V0LnRhcmdldC5wayAlfSI+RG93bmxvYWQ8L2E+PC9kZD4KKyAgICAgICAgICAgIDxkdD4KKyAgICAgICAgICAgICAgICA8aSBjbGFzcz0iaWNvbi1xdWVzdGlvbi1zaWduIGdldC1oZWxwIiB0aXRsZT0iSW1hZ2UgZmlsZXMgYXJlIHN0b3JlZCBpbiA8Y29kZT4vYnVpbGQvdG1wL2RlcGxveS9pbWFnZXMvPC9jb2RlPiI+PC9pPgorICAgICAgICAgICAgICAgIEltYWdlIGZpbGVzCisgICAgICAgICAgICA8L2R0PgorICAgICAgICAgICAgPGRkPgorICAgICAgICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7JSBmb3IgaSBpbiB0YXJnZXQuaW1hZ2VGaWxlcyAlfQorICAgICAgICAgICAgeyUgaWYgYnVpbGQucHJvamVjdCAlfQorICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0ieyUgdXJsICdidWlsZF9hcnRpZmFjdCcgYnVpbGQucGsgJ2ltYWdlZmlsZScgaS5pZCAlfSI+e3tpLnBhdGh9fTwvYT4KKyAgICAgICAgICAgIHslIGVsc2UgJX0KKyAgICAgICAgICAgICAgICAgICAgPGxpPnt7aS5wYXRofX0KKyAgICAgICAgICAgIHslIGVuZGlmICV9CisgICAgICAgICAgICAgICAgICAgICh7e2kuc2l6ZXxmaWx0ZXJlZF9maWxlc2l6ZWZvcm1hdH19KTwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyUgZW5kZm9yICV9CisgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgICAgIDwvZGQ+CisgICAgICAgIDwvZGw+CisgICAgICAgICAgICAgICAgICAgICAgICB7JSBlbmRpZiAlfQorICAgIDwvZGl2PgorICAgICAgICB7JSBlbmRpZiAlfQorICAgIHslIGVuZGZvciAlfQorPC9kaXY+Cit7JSBlbmRpZiAlfQorCit7JWVsc2UlfQorPCEtLSBlcnJvciBkdW1wIC0tPgoreyVlbmRpZiV9CisKKzwhLS0gb3RoZXIgYXJ0aWZhY3RzIC0tPgoreyUgaWYgYnVpbGQuYnVpbGRhcnRpZmFjdF9zZXQuYWxsLmNvdW50ID4gMCAlfQorPGRpdiBjbGFzcz0icm93LWZsdWlkIHNwYW4xMCBwdWxsLXJpZ2h0Ij4KKzxoMj5PdGhlciBhcnRpZmFjdHM8L2gyPgorCisgICAgPGRpdiBjbGFzcz0id2VsbCBkYXNoYm9hcmQtc2VjdGlvbiI+CisgICAgICAgIDxkbCBjbGFzcz0iZGwtaG9yaXpvbnRhbCI+CisgICAgICAgICAgICA8ZHQ+CisgICAgICAgICAgICAgICAgPGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCIgdGl0bGU9IkJ1aWxkIGFydGlmYWN0cyBkaXNjb3ZlcmVkIGluIDxpPnRtcC9kZXBsb3kvaW1hZ2VzPC9pPi4gVXN1YWxseSBrZXJuZWwgaW1hZ2VzIGFuZCBrZXJuZWwgbW9kdWxlcy4iPjwvaT4KKyAgICAgICAgICAgICAgICBPdGhlciBhcnRpZmFjdHM8L2R0PgorICAgICAgICAgICAgPGRkPjxkaXY+CisgICAgICAgICAgICAgIHslIGZvciBiYSBpbiBidWlsZC5idWlsZGFydGlmYWN0X3NldC5hbGx8ZGljdHNvcnQ6ImZpbGVfbmFtZSIgJX0KKyAgICAgICAgICAgICAgICA8YSBocmVmPSJ7JXVybCAnYnVpbGRfYXJ0aWZhY3QnIGJ1aWxkLmlkICdidWlsZGFydGlmYWN0JyBiYS5pZCAlfSI+CisgICAgICAgICAgICAgICAgICAgIHt7YmEuZ2V0X2xvY2FsX2ZpbGVfbmFtZX19CisgICAgICAgICAgICAgICAgPC9hPgorCisgICAgICAgICAgICAgICAgKHt7YmEuZmlsZV9zaXplfGZpbHRlcmVkX2ZpbGVzaXplZm9ybWF0fX0pIDxici8+CisgICAgICAgICAgICAgIHslIGVuZGZvciAlfQorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPC9kZD4KKwk8L2RsPgorICAgIDwvZGl2PgorCis8L2Rpdj4KK3slIGVuZGlmICV9Cis8IS0tIGJ1aWxkIHN1bW1hcnkgLS0+Cis8ZGl2IGNsYXNzPSJyb3ctZmx1aWQgc3BhbjEwIHB1bGwtcmlnaHQiPgorPGgyPkJ1aWxkIHN1bW1hcnk8L2gyPgorICAgIDxkaXYgY2xhc3M9IndlbGwgc3BhbjQgZGFzaGJvYXJkLXNlY3Rpb24iIHN0eWxlPSJtYXJnaW4tbGVmdDowcHg7Ij4KKyAgICAgICAgPGg0PjxhIGhyZWY9InsldXJsICdjb25maWd1cmF0aW9uJyBidWlsZC5wayV9Ij5Db25maWd1cmF0aW9uPC9hPjwvaDQ+CisgICAgICAgICAgICA8ZGw+CisgICAgICAgIDxkdD5NYWNoaW5lPC9kdD48ZGQ+e3tidWlsZC5tYWNoaW5lfX08L2RkPgorICAgICAgICA8ZHQ+RGlzdHJvPC9kdD48ZGQ+e3tidWlsZC5kaXN0cm99fTwvZGQ+CisgICAgICAgIDxkdD5MYXllcnM8L2R0PnslIGZvciBpIGluIGJ1aWxkLmxheWVyX3ZlcnNpb25fYnVpbGQuYWxsfGRpY3Rzb3J0OiJsYXllci5uYW1lIiAlfTxkZD57e2kubGF5ZXIubmFtZX19PC9kZD57JWVuZGZvciV9CisgICAgICAgICAgICA8L2RsPgorICAgIDwvZGl2PgorICAgIDxkaXYgY2xhc3M9IndlbGwgc3BhbjQgZGFzaGJvYXJkLXNlY3Rpb24iPgorICAgICAgICA8aDQ+PGEgaHJlZj0ieyV1cmwgJ3Rhc2tzJyBidWlsZC5wayV9Ij5UYXNrczwvYT48L2g0PgorICAgICAgICAgICAgPGRsPgorICAgICAgICAgICAgeyUgcXVlcnkgYnVpbGQudGFza19idWlsZCBvdXRjb21lPTQgb3JkZXJfX2d0PTAgYXMgZXhlY3Rhc2slfQorICAgICAgICAgICAgeyUgaWYgZXhlY3Rhc2suY291bnQgPiAwICV9CisgICAgICAgICAgICAgICAgPGR0PkZhaWxlZCB0YXNrczwvZHQ+CisgICAgICAgICAgICAgICAgPGRkPgorICAgICAgICAgICAgICAgIHslIGlmIGV4ZWN0YXNrLmNvdW50ID09IDEgJX0KKyAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9ImVycm9yIiBocmVmPSJ7JSB1cmwgInRhc2siIGJ1aWxkLmlkIGV4ZWN0YXNrLjAuaWQgJX0iPgorICAgICAgICAgICAgICAgICAgICAgICAge3tleGVjdGFzay4wLnJlY2lwZS5uYW1lfX0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0YXNrLW5hbWUiPnt7ZXhlY3Rhc2suMC50YXNrX25hbWV9fTwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgPC9hPgorCisgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJ7JSB1cmwgJ2J1aWxkX2FydGlmYWN0JyBidWlsZC5pZCAidGFza2xvZ2ZpbGUiIGV4ZWN0YXNrLjAuaWQgJX0iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLWRvd25sb2FkLWFsdCIgdGl0bGU9IiIgZGF0YS1vcmlnaW5hbC10aXRsZT0iRG93bmxvYWQgdGFzayBsb2cgZmlsZSI+PC9pPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgorCisgICAgICAgICAgICAgICAgeyUgZWxpZiBleGVjdGFzay5jb3VudCA+IDElfQorICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iZXJyb3IiIGhyZWY9InslIHVybCAidGFza3MiIGJ1aWxkLmlkICV9P2ZpbHRlcj1vdXRjb21lJTNBNCI+e3tleGVjdGFzay5jb3VudH19PC9hPgorICAgICAgICAgICAgICAgIHslIGVuZGlmICV9CisgICAgICAgICAgICAgICAgPC9kZD4KKyAgICAgICAgICAgIHslIGVuZGlmICV9CisgICAgICAgIDxkdD5Ub3RhbCBudW1iZXIgb2YgdGFza3M8L2R0PjxkZD48YSBocmVmPSJ7JSB1cmwgJ3Rhc2tzJyBidWlsZC5wayAlfSI+eyUgcXVlcnkgYnVpbGQudGFza19idWlsZCBvcmRlcl9fZ3Q9MCBhcyBhbGx0YXNrcyAlfXt7YWxsdGFza3MuY291bnR9fTwvYT48L2RkPgorICAgICAgICA8ZHQ+CisgICAgICAgICAgICBUYXNrcyBleGVjdXRlZAorICAgICAgICAgICAgPGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCIgdGl0bGU9IidFeGVjdXRlZCcgdGFza3MgYXJlIHRob3NlIHRoYXQgbmVlZCB0byBiZSBydW4gaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlIHRhc2sgb3V0cHV0Ij48L2k+CisgICAgICAgIDwvZHQ+CisgICAgICAgIDxkZD48YSBocmVmPSJ7JSB1cmwgJ3Rhc2tzJyBidWlsZC5wayAlfT9maWx0ZXI9dGFza19leGVjdXRlZCUzQTEmYW1wO2NvdW50PTI1JmFtcDtzZWFyY2g9JmFtcDtwYWdlPTEmYW1wO29yZGVyYnk9b3JkZXIlM0ElMkIiPnslIHF1ZXJ5IGJ1aWxkLnRhc2tfYnVpbGQgdGFza19leGVjdXRlZD0xIG9yZGVyX19ndD0wIGFzIGV4ZWN0YXNrJX17e2V4ZWN0YXNrLmNvdW50fX08L2E+PC9kZD4KKyAgICAgICAgPGR0PgorICAgICAgICAgICAgVGFza3Mgbm90IGV4ZWN1dGVkCisgICAgICAgICAgICA8aSBjbGFzcz0iaWNvbi1xdWVzdGlvbi1zaWduIGdldC1oZWxwIiB0aXRsZT0iJ05vdCBleGVjdXRlZCcgdGFza3MgZG9uJ3QgbmVlZCB0byBydW4gYmVjYXVzZSB0aGVpciBvdXRjb21lIGlzIHByb3ZpZGVkIGJ5IGFub3RoZXIgdGFzayI+PC9pPgorICAgICAgICA8L2R0PgorICAgICAgICA8ZGQ+PGEgaHJlZj0ieyUgdXJsICd0YXNrcycgYnVpbGQucGsgJX0/ZmlsdGVyPXRhc2tfZXhlY3V0ZWQlM0EwJmFtcDtjb3VudD0yNSZhbXA7c2VhcmNoPSZhbXA7cGFnZT0xJmFtcDtvcmRlcmJ5PW9yZGVyJTNBJTJCIj57JSBxdWVyeSBidWlsZC50YXNrX2J1aWxkIHRhc2tfZXhlY3V0ZWQ9MCBvcmRlcl9fZ3Q9MCBhcyBub2V4ZWN0YXNrJX17e25vZXhlY3Rhc2suY291bnR9fTwvYT48L2RkPgorICAgICAgICA8ZHQ+CisgICAgICAgICAgICBSZXVzZQorICAgICAgICAgICAgPGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCIgdGl0bGU9IlRoZSBwZXJjZW50YWdlIG9mICdub3QgZXhlY3V0ZWQnIHRhc2tzIG92ZXIgdGhlIHRvdGFsIG51bWJlciBvZiB0YXNrcywgd2hpY2ggaXMgYSBtZWFzdXJlIG9mIHRoZSBlZmZpY2llbmN5IG9mIHlvdXIgYnVpbGQiPjwvaT4KKyAgICAgICAgPC9kdD4KKyAgICAgICAgPGRkPgoreyUgcXVlcnkgYnVpbGQudGFza19idWlsZCBvcmRlcl9fZ3Q9MCBhcyB0ZXhlYyAlfQoreyUgaWYgbm9leGVjdGFzay5jb3VudHxtdWx0aXBseToxMDB8ZGl2aWRlOnRleGVjLmNvdW50IDwgMCAlfQorMAoreyUgZWxzZSAlfQore3tub2V4ZWN0YXNrLmNvdW50fG11bHRpcGx5OjEwMHxkaXZpZGU6dGV4ZWMuY291bnR9fQoreyUgZW5kaWYgJX0KKyUKKyAgICAgICAgPC9kZD4KKyAgICAgICAgICAgIDwvZGw+CisgICAgPC9kaXY+CisgICAgPGRpdiBjbGFzcz0id2VsbCBzcGFuNCBkYXNoYm9hcmQtc2VjdGlvbiI+CisgICAgICAgIDxoND48YSBocmVmPSJ7JSB1cmwgJ3JlY2lwZXMnIGJ1aWxkLnBrICV9Ij5SZWNpcGVzPC9hPiAmIDxhIGhyZWY9InslIHVybCAncGFja2FnZXMnIGJ1aWxkLnBrICV9Ij5QYWNrYWdlczwvYT48L2g0PgorICAgICAgICAgICAgPGRsPgorICAgICAgICA8ZHQ+UmVjaXBlcyBidWlsdDwvZHQ+PGRkPjxhIGhyZWY9InslIHVybCAncmVjaXBlcycgYnVpbGQucGsgJX0iPnt7cmVjaXBlY291bnR9fTwvYT48L2RkPgorICAgICAgICA8ZHQ+UGFja2FnZXMgYnVpbHQ8L2R0PjxkZD48YSBocmVmPSJ7JSB1cmwgJ3BhY2thZ2VzJyBidWlsZC5wayAlfSI+e3twYWNrYWdlY291bnR9fTwvYT48L2RkPgorICAgICAgICAgICAgPC9kbD4KKyAgICA8L2Rpdj4KKzwvZGl2PgorCit7JSBpZiBidWlsZC53YXJuaW5ncy5jb3VudCAlfQorPGRpdiBjbGFzcz0iYWNjb3JkaW9uIHNwYW4xMCBwdWxsLXJpZ2h0IiBpZD0id2FybmluZ3MiPgorICA8ZGl2IGNsYXNzPSJhY2NvcmRpb24tZ3JvdXAiPgorICAgIDxkaXYgY2xhc3M9ImFjY29yZGlvbi1oZWFkaW5nIj4KKyAgICAgIDxhIGNsYXNzPSJhY2NvcmRpb24tdG9nZ2xlIHdhcm5pbmcgdG9nZ2xlLXdhcm5pbmdzIj4KKyAgICAgICAgPGgyIGlkPSJ3YXJuaW5nLXRvZ2dsZSI+CisgICAgICAgICAgPGkgY2xhc3M9Imljb24td2FybmluZy1zaWduIj48L2k+CisgICAgICAgICAge3tidWlsZC53YXJuaW5ncy5jb3VudH19IHdhcm5pbmd7e2J1aWxkLndhcm5pbmdzLmNvdW50fHBsdXJhbGl6ZX19CisgICAgICAgIDwvaDI+CisgICAgICA8L2E+CisgICAgPC9kaXY+CisgICAgPGRpdiBjbGFzcz0iYWNjb3JkaW9uLWJvZHkgY29sbGFwc2UiIGlkPSJjb2xsYXBzZS13YXJuaW5ncyI+CisgICAgICA8ZGl2IGNsYXNzPSJhY2NvcmRpb24taW5uZXIiPgorICAgICAgICA8ZGl2IGNsYXNzPSJzcGFuMTAiPgorICAgICAgICAgIHslIGZvciB3YXJuaW5nIGluIGxvZ21lc3NhZ2VzICV9eyUgaWYgd2FybmluZy5sZXZlbCA9PSAxICV9CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhbGVydCBhbGVydC13YXJuaW5nIj4KKyAgICAgICAgICAgICAgPHByZT57e3dhcm5pbmcubWVzc2FnZX19PC9wcmU+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICB7JSBlbmRpZiAlfXslIGVuZGZvciAlfQorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvZGl2PgorICAgIDwvZGl2PgorICA8L2Rpdj4KKzwvZGl2PgoreyUgZW5kaWYgJX0KKworCit7JSBpZiBidWlsZC50b2FzdGVyX2V4Y2VwdGlvbnMuY291bnQgPiAwICV9Cis8ZGl2IGNsYXNzPSJhY2NvcmRpb24gc3BhbjEwIHB1bGwtcmlnaHQiIGlkPSJleGNlcHRpb25zIj4KKyAgPGRpdiBjbGFzcz0iYWNjb3JkaW9uLWdyb3VwIj4KKyAgICA8ZGl2IGNsYXNzPSJhY2NvcmRpb24taGVhZGluZyI+CisgICAgICA8YSBjbGFzcz0iYWNjb3JkaW9uLXRvZ2dsZSBleGNlcHRpb24gdG9nZ2xlLWV4Y2VwdGlvbnMiPgorICAgICAgICA8aDIgaWQ9ImV4Y2VwdGlvbi10b2dnbGUiPgorICAgICAgICAgIDxpIGNsYXNzPSJpY29uLXdhcm5pbmctc2lnbiI+PC9pPgorICAgICAgICAgIHt7YnVpbGQudG9hc3Rlcl9leGNlcHRpb25zLmNvdW50fX0gVG9hc3RlciBleGNlcHRpb257e2J1aWxkLnRvYXN0ZXJfZXhjZXB0aW9ucy5jb3VudHxwbHVyYWxpemV9fQorICAgICAgICA8L2gyPgorICAgICAgPC9hPgorICAgIDwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImFjY29yZGlvbi1ib2R5IGNvbGxhcHNlIiBpZD0iY29sbGFwc2UtZXhjZXB0aW9ucyI+CisgICAgICA8ZGl2IGNsYXNzPSJhY2NvcmRpb24taW5uZXIiPgorICAgICAgICA8ZGl2IGNsYXNzPSJzcGFuMTAiPgorICAgICAgICAgIHslIGZvciBleGNlcHRpb24gaW4gYnVpbGQudG9hc3Rlcl9leGNlcHRpb25zICV9CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhbGVydCBhbGVydC1leGNlcHRpb24iPgorICAgICAgICAgICAgICA8cHJlPnt7ZXhjZXB0aW9uLm1lc3NhZ2V9fTwvcHJlPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgeyUgZW5kZm9yICV9CisgICAgICAgIDwvZGl2PgorICAgICAgPC9kaXY+CisgICAgPC9kaXY+CisgIDwvZGl2PgorPC9kaXY+Cit7JSBlbmRpZiAlfQorCis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CisgICAgICAgIC8vc2hvdyB3YXJuaW5ncyBzZWN0aW9uIHdoZW4gcmVxdWVzdGVkIGZyb20gdGhlIHByZXZpb3VzIHBhZ2UKKyAgICAgICAgaWYgKGxvY2F0aW9uLmhyZWYuc2VhcmNoKCcjd2FybmluZ3MnKSA+IC0xKSB7CisgICAgICAgICAgICAkKCcjY29sbGFwc2Utd2FybmluZ3MnKS5hZGRDbGFzcygnaW4nKTsKKyAgICAgICAgfQorICAgIH0pOworPC9zY3JpcHQ+CisKK3slIGVuZGJsb2NrICV9CmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL2J1aWxkcmVxdWVzdGRldGFpbHMuaHRtbCBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvYnVpbGRyZXF1ZXN0ZGV0YWlscy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZmExZmIKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL2J1aWxkcmVxdWVzdGRldGFpbHMuaHRtbApAQCAtMCwwICsxLDY0IEBACit7JSBleHRlbmRzICJiYXNlcHJvamVjdHBhZ2UuaHRtbCIgJX0KKworeyUgbG9hZCBzdGF0aWMgJX0KK3slIGxvYWQgcHJvamVjdHRhZ3MgJX0KK3slIGxvYWQgaHVtYW5pemUgJX0KKworCit7JSBibG9jayBwcm9qZWN0aW5mb21haW4gJX0KKyAgICAgIDwhLS0gYmVnaW4gY29udGVudCAtLT4KKworICAgICAgICAgIDxkaXYgY2xhc3M9InJvdy1mbHVpZCI+CisKKyAgICAgICAgICAgIDwhLS0gZW5kIGxlZnQgc2lkZWJhciBjb250YWluZXIgLS0+CisgICAgICAgICAgICA8IS0tIEJlZ2luIHJpZ2h0IGNvbnRhaW5lciAtLT4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9InNwYW4xMCI+CisgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtaGVhZGVyIj4KKyAgICAgICAgICAgICAgICA8aDE+CisgPHNwYW4gZGF0YS10b2dnbGU9InRvb2x0aXAiIHslaWYgYnVpbGRyZXF1ZXN0LmJydGFyZ2V0X3NldC5hbGwuY291bnQgPiAxJX10aXRsZT0iVGFyZ2V0czogeyVmb3IgdGFyZ2V0IGluIGJ1aWxkcmVxdWVzdC5icnRhcmdldF9zZXQuYWxsJX17e3RhcmdldC50YXJnZXR9fSB7JWVuZGZvciV9InslZW5kaWYlfT57e2J1aWxkcmVxdWVzdC5icnRhcmdldF9zZXQuYWxsLjAudGFyZ2V0fX0geyVpZiBidWlsZHJlcXVlc3QuYnJ0YXJnZXRfc2V0LmFsbC5jb3VudCA+IDElfSgrIHt7YnVpbGRyZXF1ZXN0LmJydGFyZ2V0X3NldC5hbGwuY291bnR8YWRkOiItMSJ9fSl7JWVuZGlmJX0ge3tidWlsZHJlcXVlc3QuZ2V0X21hY2hpbmV9fSA8L3NwYW4+CisKKyAgICAgICAgPC9oMT4KKyAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LWVycm9yIj4KKyAgICAgICAgICAgICAgICA8cCBjbGFzcz0ibGVhZCI+CisgICAgICAgICAgICAgICAgICA8c3Ryb25nPkZhaWxlZDwvc3Ryb25nPgorICAgICAgICAgICAgICAgICAgICBvbiB7eyBidWlsZHJlcXVlc3QudXBkYXRlZHxkYXRlOidkL20veSBIOmknIH19CisgICAgICAgICAgICB3aXRoCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLW1pbnVzLXNpZ24gZXJyb3IiIHN0eWxlPSJtYXJnaW4tbGVmdDo2cHg7Ij48L2k+CisgICAgICAgICAgICAgICAgICA8c3Ryb25nPjxhIGNsYXNzPSJlcnJvciBhY2NvcmRpb24tdG9nZ2xlIHRvZ2dsZS1lcnJvcnMiIGhyZWY9IiNlcnJvcnMiPgorICAgICAgICAgICAgICAgICAgICAgICAge3tidWlsZHJlcXVlc3QuYnJlcnJvcl9zZXQuYWxsLmNvdW50fX0gZXJyb3J7e2J1aWxkcmVxdWVzdC5icmVycm9yX3NldC5hbGwuY291bnR8cGx1cmFsaXplfX0KKyAgICAgICAgICAgICAgPC9hPjwvc3Ryb25nPgorICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InB1bGwtcmlnaHQiPkJ1aWxkIHRpbWU6IHt7YnVpbGRyZXF1ZXN0LmdldF9kdXJhdGlvbnxzZWN0b2htc319PC9zcGFuPgorICAgICAgICAgICAgICAgIDwvcD4KKyAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYWNjb3JkaW9uIiBpZD0iZXJyb3JzIj4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhY2NvcmRpb24tZ3JvdXAiPgorICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYWNjb3JkaW9uLWhlYWRpbmciPgorICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYWNjb3JkaW9uLXRvZ2dsZSBlcnJvciB0b2dnbGUtZXJyb3JzIj4KKyAgICAgICAgICAgICAgICAgICAgICA8aDI+CisgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iaWNvbi1taW51cy1zaWduIj48L2k+CisgICAgICAgICAgICAgICAgICAgICAgICB7e2J1aWxkcmVxdWVzdC5icmVycm9yX3NldC5hbGwuY291bnR9fSBlcnJvcnt7YnVpbGRyZXF1ZXN0LmJyZXJyb3Jfc2V0LmFsbC5jb3VudHxwbHVyYWxpemV9fQorICAgICAgICAgICAgICAgICAgICAgIDwvaDI+CisgICAgICAgICAgICAgICAgICAgIDwvYT4KKyAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYWNjb3JkaW9uLWJvZHkgY29sbGFwc2UgaW4iIGlkPSJjb2xsYXBzZS1lcnJvcnMiPgorICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhY2NvcmRpb24taW5uZXIiPgorICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNwYW4xMCI+CisgICAgICAgICAgICAgICB7JSBmb3IgZXJyb3IgaW4gYnVpbGRyZXF1ZXN0LmJyZXJyb3Jfc2V0LmFsbCAlfQorICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtZXJyb3IiPgorICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJPUjogPGRpdiBjbGFzcz0iYWlyIHdlbGwiPjxwcmU+e3tlcnJvci5lcnJtc2d9fTwvcHJlPjwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgeyUgZW5kZm9yICV9CisgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICA8L2Rpdj4gPCEtLSBlbmQgb2Ygcm93LWZsdWlkIC0tPgorCisKK3slZW5kYmxvY2slfQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9idWlsZHMuaHRtbCBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvYnVpbGRzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBkMGM2NAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvYnVpbGRzLmh0bWwKQEAgLTAsMCArMSwxMDkgQEAKK3slIGV4dGVuZHMgImJhc2UuaHRtbCIgJX0KKworeyUgbG9hZCBzdGF0aWMgJX0KK3slIGxvYWQgcHJvamVjdHRhZ3MgJX0KK3slIGxvYWQgaHVtYW5pemUgJX0KKworeyUgYmxvY2sgZXh0cmFoZWFkY29udGVudCAlfQorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvc3RhdGljL2Nzcy9qcXVlcnktdWkubWluLmNzcyIgdHlwZT0ndGV4dC9jc3MnPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvc3RhdGljL2Nzcy9qcXVlcnktdWkuc3RydWN0dXJlLm1pbi5jc3MiIHR5cGU9J3RleHQvY3NzJz4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL3N0YXRpYy9jc3MvanF1ZXJ5LXVpLnRoZW1lLm1pbi5jc3MiIHR5cGU9J3RleHQvY3NzJz4KKzxzY3JpcHQgc3JjPSIvc3RhdGljL2pzL2pxdWVyeS11aS5taW4uanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9Ii9zdGF0aWMvanMvZmlsdGVyc25pcHBldC5qcyI+PC9zY3JpcHQ+Cit7JSBlbmRibG9jayAlfQorCit7JSBibG9jayBwYWdlY29udGVudCAlfQorCit7JSBpZiBsYXN0X2RhdGVfZnJvbSBhbmQgbGFzdF9kYXRlX3RvICV9Cis8c2NyaXB0PgorICAgIC8vIGluaXRpYWxpemUgdGhlIGRhdGUgcmFuZ2UgY29udHJvbHMKKyAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKSB7CisgICAgICAgIGRhdGVfaW5pdCgnc3RhcnRlZF9vbicsJ3t7bGFzdF9kYXRlX2Zyb219fScsJ3t7bGFzdF9kYXRlX3RvfX0nLCd7e2RhdGVNaW5fc3RhcnRlZF9vbn19Jywne3tkYXRlTWF4X3N0YXJ0ZWRfb259fScsJ3t7ZGF0ZXJhbmdlX3NlbGVjdGVkfX0nKTsKKyAgICAgICAgZGF0ZV9pbml0KCdjb21wbGV0ZWRfb24nLCd7e2xhc3RfZGF0ZV9mcm9tfX0nLCd7e2xhc3RfZGF0ZV90b319Jywne3tkYXRlTWluX2NvbXBsZXRlZF9vbn19Jywne3tkYXRlTWF4X2NvbXBsZXRlZF9vbn19Jywne3tkYXRlcmFuZ2Vfc2VsZWN0ZWR9fScpOworICAgIH0pOworPC9zY3JpcHQ+Cit7JWVuZGlmJX0geyMgbGFzdF9kYXRlX2Zyb20gYW5kIGxhc3RfZGF0ZV90byAjfQorCis8ZGl2IGNsYXNzPSJyb3ctZmx1aWQiPgorCisgIHslIGluY2x1ZGUgIm1yYl9zZWN0aW9uLmh0bWwiICV9CisKKworICB7JSBpZiAxICV9CisgIDxkaXYgY2xhc3M9InBhZ2UtaGVhZGVyIHRvcC1haXIiPgorICAgICA8aDE+CisgICAgICB7JSBpZiByZXF1ZXN0LkdFVC5maWx0ZXIgYW5kIG9iamVjdHMucGFnaW5hdG9yLmNvdW50ID4gMCBvciByZXF1ZXN0LkdFVC5zZWFyY2ggYW5kIG9iamVjdHMucGFnaW5hdG9yLmNvdW50ID4gMCAlfQorICAgICAgICAgIHt7b2JqZWN0cy5wYWdpbmF0b3IuY291bnR9fSBidWlsZHt7b2JqZWN0cy5wYWdpbmF0b3IuY291bnR8cGx1cmFsaXplfX0gZm91bmQKKyAgICAgIHslZWxpZiByZXF1ZXN0LkdFVC5maWx0ZXIgYW5kIG9iamVjdHMucGFnaW5hdG9yLmNvdW50ID09IDAgb3IgcmVxdWVzdC5HRVQuc2VhcmNoIGFuZCBvYmplY3RzLnBhZ2luYXRvci5jb3VudCA9PSAwICV9CisgICAgICAgICAgTm8gYnVpbGRzIGZvdW5kCisgICAgICB7JWVsc2UlfQorICAgICAgICAgIEFsbCBidWlsZHMKKyAgICAgIHslZW5kaWYlfQorICAgICA8L2gxPgorICA8L2Rpdj4KKworICB7JSBpZiBvYmplY3RzLnBhZ2luYXRvci5jb3VudCA9PSAwICV9CisgICAgPGRpdiBjbGFzcz0icm93LWZsdWlkIj4KKyAgICAgIDxkaXYgY2xhc3M9ImFsZXJ0Ij4KKyAgICAgICAgPGZvcm0gY2xhc3M9Im5vLXJlc3VsdHMgaW5wdXQtYXBwZW5kIiBpZD0ic2VhcmNoZm9ybSI+CisgICAgICAgICAgICA8aW5wdXQgaWQ9InNlYXJjaCIgbmFtZT0ic2VhcmNoIiBjbGFzcz0iaW5wdXQteHhsYXJnZSIgdHlwZT0idGV4dCIgdmFsdWU9IgorICAgICAgICAgICAgeyUgaWYgcmVxdWVzdC5HRVQuc2VhcmNoICV9CisgICAgICAgICAgICAgICAge3tyZXF1ZXN0LkdFVC5zZWFyY2h9fQorICAgICAgICB7JSBlbmRpZiAlfSIvPgorICAgICAgICAgICAgeyUgaWYgcmVxdWVzdC5HRVQuc2VhcmNoICV9PGEgaHJlZj0iamF2YXNjcmlwdDokKCcjc2VhcmNoJykudmFsKCcnKTtzZWFyY2hmb3JtLnN1Ym1pdCgpIiBjbGFzcz0iYWRkLW9uIGJ0biIgdGFiaW5kZXg9Ii0xIj48aSBjbGFzcz0iaWNvbi1yZW1vdmUiPjwvaT48L2E+eyUgZW5kaWYgJX0KKyAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iU2VhcmNoIj5TZWFyY2g8L2J1dHRvbj4KKyAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBidG4tbGluayIgb25jbGljaz0iamF2YXNjcmlwdDokKCcjc2VhcmNoJykudmFsKCcnKTtzZWFyY2hmb3JtLnN1Ym1pdCgpIj5TaG93IGFsbCBidWlsZHM8L2J1dHRvbj4KKyAgICAgICAgPC9mb3JtPgorICAgICAgPC9kaXY+CisgICAgPC9kaXY+CisKKworICB7JSBlbHNlICV9CisgIHslIGluY2x1ZGUgImJhc2V0YWJsZV90b3AuaHRtbCIgJX0KKyAgICAgICAgPCEtLSBUYWJsZSBkYXRhIHJvd3M7IHRoZSBvcmRlciBuZWVkcyB0byBtYXRjaCB0aGUgb3JkZXIgb2YgInRhYmxlY29scyIgZGVmaW5pdGlvbnM7IGFuZCB0aGUgPHRkIGNsYXNzIHZhbHVlIG5lZWRzIHRvIG1hdGNoIHRoZSB0YWJsZWNvbHMgY2xjbGFzcyB2YWx1ZSBmb3Igc2hvdy9oaWRlIGJ1dHRvbnMgdG8gd29yayAtLT4KKyAgICAgICAgeyUgZm9yIGJ1aWxkIGluIG9iamVjdHMgJX0KKyAgICAgICAgPHRyIGNsYXNzPSJkYXRhIj4KKyAgICAgICAgICAgIDx0ZCBjbGFzcz0ib3V0Y29tZSI+CisgICAgICAgIDxhIGhyZWY9InslIHVybCAiYnVpbGRkYXNoYm9hcmQiIGJ1aWxkLmlkICV9Ij57JWlmIGJ1aWxkLm91dGNvbWUgPT0gYnVpbGQuU1VDQ0VFREVEJX08aSBjbGFzcz0iaWNvbi1vay1zaWduIHN1Y2Nlc3MiPjwvaT57JWVsaWYgYnVpbGQub3V0Y29tZSA9PSBidWlsZC5GQUlMRUQlfTxpIGNsYXNzPSJpY29uLW1pbnVzLXNpZ24gZXJyb3IiPjwvaT57JWVsc2UlfXslZW5kaWYlfTwvYT4gJm5ic3A7CisgICAgICAgIDwvdGQ+CisgICAgICAgICAgICA8dGQgY2xhc3M9InRhcmdldCI+eyUgZm9yIHQgaW4gYnVpbGQudGFyZ2V0X3NldC5hbGwgJX0gPGEgaHJlZj0ieyUgdXJsICJidWlsZGRhc2hib2FyZCIgYnVpbGQuaWQgJX0iPiB7e3QudGFyZ2V0fX0gPC9hPiA8YnIgLz57JSBlbmRmb3IgJX08L3RkPgorICAgICAgICAgICAgPHRkIGNsYXNzPSJtYWNoaW5lIj48YSBocmVmPSJ7JSB1cmwgImJ1aWxkZGFzaGJvYXJkIiBidWlsZC5pZCAlfSI+e3tidWlsZC5tYWNoaW5lfX08L2E+PC90ZD4KKyAgICAgICAgICAgIDx0ZCBjbGFzcz0ic3RhcnRlZF9vbiI+PGEgaHJlZj0ieyUgdXJsICJidWlsZGRhc2hib2FyZCIgYnVpbGQuaWQgJX0iPnt7YnVpbGQuc3RhcnRlZF9vbnxkYXRlOiJkL20veSBIOmkifX08L2E+PC90ZD4KKyAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29tcGxldGVkX29uIj48YSBocmVmPSJ7JSB1cmwgImJ1aWxkZGFzaGJvYXJkIiBidWlsZC5pZCAlfSI+e3tidWlsZC5jb21wbGV0ZWRfb258ZGF0ZToiZC9tL3kgSDppIn19PC9hPjwvdGQ+CisgICAgICAgICAgICA8dGQgY2xhc3M9ImZhaWxlZF90YXNrcyBlcnJvciI+CisgICAgICAgICAgICAgICAgeyUgcXVlcnkgYnVpbGQudGFza19idWlsZCBvdXRjb21lPTQgb3JkZXJfX2d0PTAgYXMgZXhlY3Rhc2slfQorICAgICAgICAgICAgICAgICAgICB7JSBpZiBleGVjdGFzay5jb3VudCA9PSAxICV9CisgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJ7JSB1cmwgInRhc2siIGJ1aWxkLmlkIGV4ZWN0YXNrLjAuaWQgJX0iPnt7ZXhlY3Rhc2suMC5yZWNpcGUubmFtZX19Lnt7ZXhlY3Rhc2suMC50YXNrX25hbWV9fTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9InslIHVybCAnYnVpbGRfYXJ0aWZhY3QnIGJ1aWxkLmlkICJ0YXNrbG9nZmlsZSIgZXhlY3Rhc2suMC5pZCAlfSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9Imljb24tZG93bmxvYWQtYWx0IiB0aXRsZT0iIiBkYXRhLW9yaWdpbmFsLXRpdGxlPSJEb3dubG9hZCB0YXNrIGxvZyBmaWxlIj48L2k+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CisgICAgICAgICAgICAgICAgICAgIHslIGVsaWYgZXhlY3Rhc2suY291bnQgPiAxJX0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9InslIHVybCAidGFza3MiIGJ1aWxkLmlkICV9P2ZpbHRlcj1vdXRjb21lJTNBNCI+e3tleGVjdGFzay5jb3VudH19IHRhc2t7e2V4ZWN0YXNrLmNvdW50fHBsdXJhbGl6ZX19PC9hPgorICAgICAgICAgICAgICAgICAgICB7JWVuZGlmJX0KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICA8dGQgY2xhc3M9ImVycm9ycy5jb3VudCBlcnJvcnNfbm8iPgorICAgICAgICAgICAgICAgIHslIGlmICBidWlsZC5lcnJvcnMuY291bnQgJX0KKyAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9ImVycm9ycy5jb3VudCBlcnJvciIgaHJlZj0ieyUgdXJsICJidWlsZGRhc2hib2FyZCIgYnVpbGQuaWQgJX0jZXJyb3JzIj57e2J1aWxkLmVycm9ycy5jb3VudH19IGVycm9ye3tidWlsZC5lcnJvcnMuY291bnR8cGx1cmFsaXplfX08L2E+CisgICAgICAgICAgICAgICAgeyVlbmRpZiV9CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgPHRkIGNsYXNzPSJ3YXJuaW5ncy5jb3VudCB3YXJuaW5nc19ubyI+eyUgaWYgIGJ1aWxkLndhcm5pbmdzLmNvdW50ICV9PGEgY2xhc3M9Indhcm5pbmdzLmNvdW50IHdhcm5pbmciIGhyZWY9InslIHVybCAiYnVpbGRkYXNoYm9hcmQiIGJ1aWxkLmlkICV9I3dhcm5pbmdzIj57e2J1aWxkLndhcm5pbmdzLmNvdW50fX0gd2FybmluZ3t7YnVpbGQud2FybmluZ3MuY291bnR8cGx1cmFsaXplfX08L2E+eyVlbmRpZiV9PC90ZD4KKyAgICAgICAgICAgIDx0ZCBjbGFzcz0idGltZSI+PGEgaHJlZj0ieyUgdXJsICJidWlsZHRpbWUiIGJ1aWxkLmlkICV9Ij57e2J1aWxkLnRpbWVzcGVudF9zZWNvbmRzfHNlY3RvaG1zfX08L2E+PC90ZD4KKyAgICAgICAgICAgIDx0ZCBjbGFzcz0ib3V0cHV0Ij4KKyAgICAgICAgICAgICAgeyUgaWYgYnVpbGQub3V0Y29tZSA9PSBidWlsZC5TVUNDRUVERUQgJX0KKyAgICAgICAgICAgICAgPGEgaHJlZj0ieyV1cmwgImJ1aWxkZGFzaGJvYXJkIiBidWlsZC5pZCV9I2ltYWdlcyI+e3tmc3R5cGVzfGdldF9kaWN0X3ZhbHVlOmJ1aWxkLmlkfX08L2E+CisgICAgICAgICAgICAgIHslIGVuZGlmICV9CisgICAgICAgICAgICA8L3RkPgorICAgICAgICA8dGQ+CisgICAgICAgICAgICAgICAgPGEgaHJlZj0ieyUgdXJsICdwcm9qZWN0JyBidWlsZC5wcm9qZWN0LmlkICV9Ij57e2J1aWxkLnByb2plY3QubmFtZX19PC9hPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgPC90cj4KKworICAgICAgICB7JSBlbmRmb3IgJX0KKworCisgIHslIGluY2x1ZGUgImJhc2V0YWJsZV9ib3R0b20uaHRtbCIgJX0KKyAgeyUgZW5kaWYgJX0geyMgb2JqZWN0cy5wYWdpbmF0b3IuY291bnQgI30KK3slIGVuZGlmICV9IHsjIGVtcHR5ICN9Cis8L2Rpdj48IS0tIGVuZCByb3ctZmx1aWQtLT4KKworeyUgZW5kYmxvY2sgJX0KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvYnVpbGR0aW1lLmh0bWwgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL2J1aWxkdGltZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhODRhZTcKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL2J1aWxkdGltZS5odG1sCkBAIC0wLDAgKzEsNCBAQAoreyUgZXh0ZW5kcyAiYmFzZWJ1aWxkcGFnZS5odG1sIiAlfQoreyUgYmxvY2sgbG9jYWxicmVhZGNydW1iICV9Cis8bGk+QnVpbGQgVGltZTwvbGk+Cit7JSBlbmRibG9jayAlfQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9jb25maWd1cmF0aW9uLmh0bWwgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL2NvbmZpZ3VyYXRpb24uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTQ4OTkxCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9jb25maWd1cmF0aW9uLmh0bWwKQEAgLTAsMCArMSw3MSBAQAoreyUgZXh0ZW5kcyAiYmFzZWJ1aWxkcGFnZS5odG1sIiAlfQoreyUgbG9hZCBwcm9qZWN0dGFncyAlfQorCit7JSBibG9jayBsb2NhbGJyZWFkY3J1bWIgJX0KKzxsaT5Db25maWd1cmF0aW9uPC9saT4KK3slIGVuZGJsb2NrICV9CisKK3slIGJsb2NrIG5hdi1jb25maWd1cmF0aW9uICV9CisgIDxsaSBjbGFzcz0iYWN0aXZlIj48YSBocmVmPSJ7JSB1cmwgJ2NvbmZpZ3VyYXRpb24nIGJ1aWxkLnBrICV9Ij5Db25maWd1cmF0aW9uPC9hPjwvbGk+Cit7JSBlbmRibG9jayAlfQorCit7JSBibG9jayBidWlsZGluZm9tYWluICV9Cis8IS0tIHBhZ2UgdGl0bGUgLS0+Cis8ZGl2IGNsYXNzPSJyb3ctZmx1aWQgc3BhbjEwIj4KKyA8ZGl2IGNsYXNzPSJwYWdlLWhlYWRlciI+CisgICAgIDxoMT5Db25maWd1cmF0aW9uPC9oMT4KKyA8L2Rpdj4KKzwvZGl2PgorCis8IS0tIGNvbmZpZ3VyYXRpb24gdGFibGUgLS0+Cis8ZGl2IGNsYXNzPSJyb3ctZmx1aWQgcHVsbC1yaWdodCBzcGFuMTAiIGlkPSJuYXZUYWIiPgorPHVsIGNsYXNzPSJuYXYgbmF2LXBpbGxzIj4KKyAgICA8bGkgY2xhc3M9ImFjdGl2ZSI+PGEgaHJlZj0iIyI+U3VtbWFyeTwvYT48L2xpPgorICAgIDxsaSBjbGFzcz0iIj48YSBocmVmPSJ7JSB1cmwgJ2NvbmZpZ3ZhcnMnIGJ1aWxkLmlkICV9Ij5CaXRCYWtlIHZhcmlhYmxlczwvYT48L2xpPgorPC91bD4KKworICA8IS0tIHN1bW1hcnkgLS0+CisgIDxkaXYgaWQ9InN1bW1hcnkiIGNsYXNzPSJ0YWItcGFuZSBhY3RpdmUiPgorICAgIDxoMz5CdWlsZCBjb25maWd1cmF0aW9uPC9oMz4KKyAgICA8ZGwgY2xhc3M9ImRsLWhvcml6b250YWwiPgorICAgICAgeyVpZiBCQl9WRVJTSU9OICV9PGR0PkJpdEJha2UgdmVyc2lvbjwvZHQ+PGRkPnt7QkJfVkVSU0lPTn19PC9kZD4geyUgZW5kaWYgJX0KKyAgICAgIHslaWYgQlVJTERfU1lTICV9PGR0PkJ1aWxkIHN5c3RlbTwvZHQ+PGRkPnt7QlVJTERfU1lTfX08L2RkPiB7JSBlbmRpZiAlfQorICAgICAgeyVpZiBOQVRJVkVMU0JTVFJJTkcgJX08ZHQ+SG9zdCBkaXN0cmlidXRpb248L2R0PjxkZD57e05BVElWRUxTQlNUUklOR319PC9kZD4geyUgZW5kaWYgJX0KKyAgICAgIHslaWYgVEFSR0VUX1NZUyAlfTxkdD5UYXJnZXQgc3lzdGVtPC9kdD48ZGQ+e3tUQVJHRVRfU1lTfX08L2RkPiB7JSBlbmRpZiAlfQorICAgICAgeyVpZiBNQUNISU5FICV9PGR0Pk1hY2hpbmU8L2R0PjxkZD57e01BQ0hJTkV9fTwvZGQ+IHslIGVuZGlmICV9CisgICAgICB7JWlmIERJU1RSTyAlfTxkdD5EaXN0cm88L2R0PjxkZD57e0RJU1RST319PC9kZD4geyUgZW5kaWYgJX0KKyAgICAgIHslaWYgRElTVFJPX1ZFUlNJT04gJX08ZHQ+RGlzdHJvIHZlcnNpb248L2R0PjxkZD57e0RJU1RST19WRVJTSU9OfX08L2RkPiB7JSBlbmRpZiAlfQorICAgICAgeyVpZiBUVU5FX0ZFQVRVUkVTICV9PGR0PlR1bmUgZmVhdHVyZXM8L2R0PjxkZD57e1RVTkVfRkVBVFVSRVN9fTwvZGQ+IHslIGVuZGlmICV9CisgICAgICB7JWlmIFRBUkdFVF9GUFUgJX08ZHQ+VGFyZ2V0IEZQVTwvZHQ+PGRkPnt7VEFSR0VUX0ZQVX19PC9kZD4geyUgZW5kaWYgJX0KKyAgICAgIHslaWYgdGFyZ2V0cy5hbGwgJX08ZHQ+VGFyZ2V0KHMpPC9kdD4KKyAgICAgICAgICA8ZGQ+IDx1bD4geyUgZm9yIHRhcmdldCBpbiB0YXJnZXRzLmFsbCAlfQorICAgICAgICAgICAgICAgPGxpPnt7dGFyZ2V0LnRhcmdldH19eyVpZiBmb3Jsb29wLmNvdW50ZXIgPiAxICV9PGJyPnslIGVuZGlmICV9PC9saT4KKyAgICAgICAgICB7JSBlbmRmb3IgJX0gPC91bD4gPC9kZD4geyUgZW5kaWYgJX0KKyAgICA8L2RsPgorICAgIDxoMz5MYXllcnM8L2gzPgorICAgIDxkaXYgY2xhc3M9InNwYW45IiBzdHlsZT0ibWFyZ2luLWxlZnQ6MHB4OyI+CisgICAgPHRhYmxlIGNsYXNzPSJ0YWJsZSB0YWJsZS1ib3JkZXJlZCB0YWJsZS1ob3ZlciI+CisgICAgICA8dGhlYWQ+CisgICAgICAgIDx0cj4KKyAgICAgICAgICA8dGg+TGF5ZXI8L3RoPgorICAgICAgICAgIDx0aD5MYXllciBicmFuY2g8L3RoPgorICAgICAgICAgIDx0aD5MYXllciBjb21taXQ8L3RoPgorICAgICAgICA8L3RyPgorICAgICAgPC90aGVhZD4KKyAgICAgIDx0Ym9keT57JSBmb3IgbHYgaW4gYnVpbGQubGF5ZXJfdmVyc2lvbl9idWlsZC5hbGx8ZGljdHNvcnQ6ImxheWVyLm5hbWUiICV9CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0ZD57e2x2LmxheWVyLm5hbWV9fTwvdGQ+CisgICAgICAgICAgICA8dGQ+e3tsdi5icmFuY2h9fTwvdGQ+CisgICAgICAgICAgICA8dGQ+IDxhIGNsYXNzPSJidG4iIGRhdGEtY29udGVudD0iPHVsIGNsYXNzPSd1bnN0eWxlZCc+CisgICAgICAgICAgICAgICAgPGxpPnt7bHYuY29tbWl0fX08L2xpPiA8L3VsPiI+CisgICAgICAgICAgICAgICAgICAgIHt7bHYuY29tbWl0fHRydW5jYXRlY2hhcnM6MTN9fQorICAgICAgICAgICAgICAgIDwvYT48L3RkPgorICAgICAgICA8L3RyPnslIGVuZGZvciAlfQorICAgICAgPC90Ym9keT4KKyAgICA8L3RhYmxlPgorICAgIDwvZGl2PgorICA8L2Rpdj4KKworCis8L2Rpdj4KK3slIGVuZGJsb2NrICV9CmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL2NvbmZpZ3ZhcnMuaHRtbCBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvY29uZmlndmFycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNTcyYWUKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL2NvbmZpZ3ZhcnMuaHRtbApAQCAtMCwwICsxLDEzMiBAQAoreyUgZXh0ZW5kcyAiYmFzZWJ1aWxkcGFnZS5odG1sIiAlfQoreyUgbG9hZCBwcm9qZWN0dGFncyAlfQorCit7JSBibG9jayBsb2NhbGJyZWFkY3J1bWIgJX0KKzxsaT5Db25maWd1cmF0aW9uPC9saT4KK3slIGVuZGJsb2NrICV9CisKK3slIGJsb2NrIG5hdi1jb25maWd1cmF0aW9uICV9CisgIDxsaSBjbGFzcz0iYWN0aXZlIj48YSBocmVmPSJ7JSB1cmwgJ2NvbmZpZ3VyYXRpb24nIGJ1aWxkLnBrICV9Ij5Db25maWd1cmF0aW9uPC9hPjwvbGk+Cit7JSBlbmRibG9jayAlfQorCit7JSBibG9jayBidWlsZGluZm9tYWluICV9Cis8IS0tIHBhZ2UgdGl0bGUgLS0+Cis8ZGl2IGNsYXNzPSJyb3ctZmx1aWQgc3BhbjEwIj4KKyA8ZGl2IGNsYXNzPSJwYWdlLWhlYWRlciI+CisgPGgxPgorICB7JSBpZiByZXF1ZXN0LkdFVC5maWx0ZXIgYW5kIG9iamVjdHMucGFnaW5hdG9yLmNvdW50ID4gMCBvciByZXF1ZXN0LkdFVC5zZWFyY2ggYW5kIG9iamVjdHMucGFnaW5hdG9yLmNvdW50ID4gMCAlfQorICAgICAge3tvYmplY3RzLnBhZ2luYXRvci5jb3VudH19IHZhcmlhYmxle3tvYmplY3RzLnBhZ2luYXRvci5jb3VudHxwbHVyYWxpemV9fSBmb3VuZAorICB7JWVsaWYgcmVxdWVzdC5HRVQuZmlsdGVyIGFuZCBvYmplY3RzLnBhZ2luYXRvci5jb3VudCA9PSAwIG9yIHJlcXVlc3QuR0VULnNlYXJjaCBhbmQgb2JqZWN0cy5wYWdpbmF0b3IuY291bnQgPT0gMCAlfQorICAgICAgTm8gdmFyaWFibGVzIGZvdW5kCisgIHslZWxzZSV9CisgICAgICBDb25maWd1cmF0aW9uCisgIHslZW5kaWYlfQorIDwvaDE+CisgPC9kaXY+Cis8L2Rpdj4KKworPCEtLSBjb25maWd1cmF0aW9uIHRhYmxlIC0tPgorPGRpdiBjbGFzcz0icm93LWZsdWlkIHB1bGwtcmlnaHQgc3BhbjEwIiBpZD0ibmF2VGFiIj4KKyAgPHVsIGNsYXNzPSJuYXYgbmF2LXBpbGxzIj4KKyAgICA8bGkgY2xhc3M9IiI+PGEgaHJlZj0ieyUgdXJsICdjb25maWd1cmF0aW9uJyBidWlsZC5pZCAlfSI+U3VtbWFyeTwvYT48L2xpPgorICAgIDxsaSBjbGFzcz0iYWN0aXZlIj48YSBocmVmPSIjIiA+Qml0QmFrZSB2YXJpYWJsZXM8L2E+PC9saT4KKyAgPC91bD4KKworICA8IS0tIHZhcmlhYmxlcyAtLT4KKyAgPGRpdiBpZD0idmFyaWFibGVzIiBjbGFzcz0idGFiLXBhbmUiPgorCisgIHslIGlmIG9iamVjdHMucGFnaW5hdG9yLmNvdW50ID09IDAgJX0KKyAgPGRpdiBjbGFzcz0icm93LWZsdWlkIj4KKyAgICAgIDxkaXYgY2xhc3M9ImFsZXJ0Ij4KKyAgICAgICAgPGZvcm0gY2xhc3M9Im5vLXJlc3VsdHMgaW5wdXQtYXBwZW5kIiBpZD0ic2VhcmNoZm9ybSI+CisgICAgICAgICAgICA8aW5wdXQgaWQ9InNlYXJjaCIgbmFtZT0ic2VhcmNoIiBjbGFzcz0iaW5wdXQteHhsYXJnZSIgdHlwZT0idGV4dCIgdmFsdWU9InslIGlmIHJlcXVlc3QuR0VULnNlYXJjaCAlfXt7cmVxdWVzdC5HRVQuc2VhcmNofX17JSBlbmRpZiAlfSIvPnslIGlmIHJlcXVlc3QuR0VULnNlYXJjaCAlfTxhIGhyZWY9ImphdmFzY3JpcHQ6JCgnI3NlYXJjaCcpLnZhbCgnJyk7c2VhcmNoZm9ybS5zdWJtaXQoKSIgY2xhc3M9ImFkZC1vbiBidG4iIHRhYmluZGV4PSItMSI+PGkgY2xhc3M9Imljb24tcmVtb3ZlIj48L2k+PC9hPnslIGVuZGlmICV9CisgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlNlYXJjaCI+U2VhcmNoPC9idXR0b24+CisgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLWxpbmsiIG9uY2xpY2s9ImphdmFzY3JpcHQ6JCgnI3NlYXJjaCcpLnZhbCgnJyk7c2VhcmNoZm9ybS5zdWJtaXQoKSI+U2hvdyBhbGwgdmFyaWFibGVzPC9idXR0b24+CisgICAgICAgIDwvZm9ybT4KKyAgICAgIDwvZGl2PgorICA8L2Rpdj4KKworICB7JSBlbHNlICV9CisgIHslIGluY2x1ZGUgImJhc2V0YWJsZV90b3AuaHRtbCIgJX0KKworICB7JSBmb3IgdmFyaWFibGUgaW4gb2JqZWN0cyAlfQorICAgIDx0ciBjbGFzcz0iZGF0YSI+CisgICAgICAgIDx0ZCBjbGFzcz0idmFyaWFibGVfbmFtZSI+PGEgZGF0YS10b2dnbGU9Im1vZGFsIiBocmVmPSIjdmFyaWFibGUte3t2YXJpYWJsZS5wa319Ij57e3ZhcmlhYmxlLnZhcmlhYmxlX25hbWV9fTwvYT48L3RkPgorICAgICAgICA8dGQgY2xhc3M9InZhcmlhYmxlX3ZhbHVlIj48YSBkYXRhLXRvZ2dsZT0ibW9kYWwiIGhyZWY9IiN2YXJpYWJsZS17e3ZhcmlhYmxlLnBrfX0iPnt7dmFyaWFibGUudmFyaWFibGVfdmFsdWV8dHJ1bmNhdGVjaGFyczoxNTN9fTwvYT48L3RkPgorICAgICAgICA8dGQgY2xhc3M9ImZpbGUiPjxhIGRhdGEtdG9nZ2xlPSJtb2RhbCIgaHJlZj0iI3ZhcmlhYmxlLXt7dmFyaWFibGUucGt9fSI+CisgICAgICAgICAgICB7JSBpZiB2YXJpYWJsZS52aGlzdG9yeS5hbGwgJX0KKyAgICAgICAgICAgICAgICB7JSBmb3IgcGF0aCBpbiB2YXJpYWJsZS52aGlzdG9yeS5hbGx8ZmlsdGVyX3NldGluX2ZpbGVzOmZpbGVfZmlsdGVyICV9CisgICAgICAgICAgICAgICAgICAgIHt7cGF0aH19PGJyLz4KKyAgICAgICAgICAgICAgICB7JSBlbmRmb3IgJX0KKyAgICAgICAgICAgIHslIGVuZGlmICV9CisgICAgICAgIDwvYT48L3RkPgorICAgICAgICA8dGQgY2xhc3M9ImRlc2NyaXB0aW9uIj4KKyAgICAgICAgICAgIHslIGlmIHZhcmlhYmxlLmRlc2NyaXB0aW9uICV9CisgICAgICAgICAgICAgICAge3t2YXJpYWJsZS5kZXNjcmlwdGlvbn19CisgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy55b2N0b3Byb2plY3Qub3JnL2RvY3MvY3VycmVudC9yZWYtbWFudWFsL3JlZi1tYW51YWwuaHRtbCN2YXIte3t2YXJpYWJsZS52YXJpYWJsZV9uYW1lfHZhcmlhYmxlX3BhcmVudF9uYW1lfX0iIHRhcmdldD0iX2JsYW5rIj4KKyAgICAgICAgICAgICAgICA8aSBjbGFzcz0iaWNvbi1zaGFyZSBnZXQtaW5mbyI+PC9pPjwvYT4KKyAgICAgICAgICAgIHslIGVuZGlmICV9CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KK3slIGVuZGZvciAlfQorCit7JSBpbmNsdWRlICJiYXNldGFibGVfYm90dG9tLmh0bWwiICV9Cit7JSBlbmRpZiAlfQorPC9kaXY+IDwhLS0gZW5kdmFyaWFibGVzIC0tPgorCis8IS0tIGZpbGUgbGlzdCBwb3B1cHMgLS0+Cit7JSBmb3IgdmFyaWFibGUgaW4gb2JqZWN0cyAlfQorICAgIHslIGlmIHZhcmlhYmxlLnZoaXN0b3J5LmNvdW50ICV9CisgICAgPGRpdiBpZD0idmFyaWFibGUte3t2YXJpYWJsZS5wa319IiBjbGFzcz0ibW9kYWwgaGlkZSBmYWRlIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyI+CisgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CisgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+eDwvYnV0dG9uPgorICAgICAgICAgICAgPGgzPkhpc3Rvcnkgb2Yge3t2YXJpYWJsZS52YXJpYWJsZV9uYW1lfX08L2gzPgorICAgICAgICA8L2Rpdj4KKyAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+CisgICAgICAgICAgICB7JSBpZiB2YXJpYWJsZS52YXJpYWJsZV92YWx1ZSAlfQorICAgICAgICAgICAgICB7JSBpZiB2YXJpYWJsZS52YXJpYWJsZV92YWx1ZXxsZW5ndGggPCA1NzAgJX0KKyAgICAgICAgICAgICAgICA8aDQ+e3t2YXJpYWJsZS52YXJpYWJsZV9uYW1lfX0gdmFsdWUgaXM6PC9oND4KKyAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICAgICAge3t2YXJpYWJsZS52YXJpYWJsZV92YWx1ZX19CisgICAgICAgICAgICAgICAgPC9wPgorICAgICAgICAgICAgICB7JSBlbHNlICV9CisgICAgICAgICAgICAgICAgPGg0Pnt7dmFyaWFibGUudmFyaWFibGVfbmFtZX19IHZhbHVlIGlzOjwvaDQ+CisgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7dmFyaWFibGUudmFyaWFibGVfdmFsdWV8c3RyaW5nX3NsaWNlOic6NTcwJ319CisgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZnVsbCI+IHt7dmFyaWFibGUudmFyaWFibGVfdmFsdWV8c3RyaW5nX3NsaWNlOic1NzA6J319CisgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnRuIGJ0bi1taW5pIGZ1bGwtc2hvdyI+Li4uPC9hPgorICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CisgICAgICAgICAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJidG4gYnRuLW1pbmkgZnVsbC1oaWRlIj5Db2xsYXBzZSB2YXJpYWJsZSB2YWx1ZSA8aSBjbGFzcz0iaWNvbi1jYXJldC11cCI+PC9pPgorICAgICAgICAgICAgICAgIDwvYT4KKyAgICAgICAgICAgICAgeyUgZW5kaWYgJX0KKyAgICAgICAgICAgIHslIGVsc2UgJX0KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhbGVydCBhbGVydC1pbmZvIj5UaGUgdmFsdWUgb2YgPHN0cm9uZz57e3ZhcmlhYmxlLnZhcmlhYmxlX25hbWV9fTwvc3Ryb25nPiBpcyBhbiBlbXB0eSBzdHJpbmc8L2Rpdj4KKyAgICAgICAgICAgIHslIGVuZGlmICV9CisgICAgICAgICAgICA8aDQ+VGhlIHZhbHVlIHdhcyBzZXQgaW4gdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIGZpbGVzOjwvaDQ+CisgICAgICAgICAgICA8dGFibGUgY2xhc3M9InRhYmxlIHRhYmxlLWJvcmRlcmVkIHRhYmxlLWhvdmVyIj4KKyAgICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5PcmRlcjwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGg+Q29uZmlndXJhdGlvbiBmaWxlPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5PcGVyYXRpb248L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkxpbmUgbnVtYmVyPC90aD4KKyAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICAgICAgeyUgZm9yIHZoIGluIHZhcmlhYmxlLnZoaXN0b3J5LmFsbCAlfQorICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tmb3Jsb29wLmNvdW50ZXJ9fTwvdGQ+PHRkPnt7dmguZmlsZV9uYW1lfX08L3RkPjx0ZD57e3ZoLm9wZXJhdGlvbn19PC90ZD48dGQ+e3t2aC5saW5lX251bWJlcn19PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgeyVlbmRmb3IlfQorICAgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKyAgICB7JSBlbmRpZiAlfQoreyUgZW5kZm9yICV9CisKKzwvZGl2PiA8IS0tIGJ1aWxkaW5mb21haW4gLS0+CisKK3slIGVuZGJsb2NrICV9CmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL2NwdXVzYWdlLmh0bWwgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL2NwdXVzYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJmMDdiNwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvY3B1dXNhZ2UuaHRtbApAQCAtMCwwICsxLDQgQEAKK3slIGV4dGVuZHMgImJhc2VidWlsZHBhZ2UuaHRtbCIgJX0KK3slIGJsb2NrIGxvY2FsYnJlYWRjcnVtYiAlfQorPGxpPkNwdSBVc2FnZTwvbGk+Cit7JSBlbmRibG9jayAlfQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9kZXRhaWxfcGFnaW5hdGlvbl9ib3R0b20uaHRtbCBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvZGV0YWlsX3BhZ2luYXRpb25fYm90dG9tLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQwYzIxZAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvZGV0YWlsX3BhZ2luYXRpb25fYm90dG9tLmh0bWwKQEAgLTAsMCArMSw1NSBAQAoreyUgY29tbWVudCAlfQorICAgIFNob3cgcGFnaW5hdGlvbiBjb250cm9scyBhcyBwZXIgc2VhcmNoL3BhZ2luYXRpb24gdGFibGUgZGV0YWlsIHNwZWMuCisgICAgSW5wdXQ6IG9iamVjdHMsIHNldHVwIGZvciBwYWdpbmF0aW9uIHVzaW5nIHRoZSBzdGFuZGFyZCBtZXRob2QgaW4gdmlld3MuCisgICAgICAgICAgIG9iamVjdF9jb3VudCwgY291bnQgZm9yIGNvbXBsZXRlIGxpc3Qgb2Ygb2JqZWN0cywgKGFsbCBwYWdlcywgbm8gcGF0dGVybikKK3slIGVuZGNvbW1lbnQgJX0KKworeyMgb25seSBwYWdpbmF0ZSBpZiAxMCBvciBtb3JlIHJvd3MgdW5maWx0ZXJlZCwgYWxsIHBhZ2VzICN9Cit7JSBpZiBvYmplY3RfY291bnQgPj0gMTAgJX0KKzxkaXYgY2xhc3M9InBhZ2luYXRpb24iPgorICA8dWw+Cit7JWlmIG9iamVjdHMuaGFzX3ByZXZpb3VzICV9CisgICAgPGxpPjxhIGhyZWY9ImphdmFzY3JpcHQ6cmVsb2FkX3BhcmFtcyh7J3BhZ2UnOnt7b2JqZWN0cy5wcmV2aW91c19wYWdlX251bWJlcn19fSkiPiZsYXF1bzs8L2E+PC9saT4KK3slZWxzZSV9CisgICAgPGxpIGNsYXNzPSJkaXNhYmxlZCI+PGEgaHJlZj0iIyI+JmxhcXVvOzwvYT48L2xpPgoreyVlbmRpZiV9Cit7JSBmb3IgaSBpbiBvYmplY3RzLnBhZ2VfcmFuZ2UgJX0KKyAgICA8bGl7JWlmIGkgPT0gb2JqZWN0cy5udW1iZXIgJX0gY2xhc3M9ImFjdGl2ZSIgeyVlbmRpZiV9PjxhIGhyZWY9ImphdmFzY3JpcHQ6cmVsb2FkX3BhcmFtcyh7J3BhZ2UnOnt7aX19fSkiPnt7aX19PC9hPjwvbGk+Cit7JSBlbmRmb3IgJX0KK3slaWYgb2JqZWN0cy5oYXNfbmV4dCV9CisgICAgPGxpPjxhIGhyZWY9ImphdmFzY3JpcHQ6cmVsb2FkX3BhcmFtcyh7J3BhZ2UnOnt7b2JqZWN0cy5uZXh0X3BhZ2VfbnVtYmVyfX19KSI+JnJhcXVvOzwvYT48L2xpPgoreyVlbHNlJX0KKyAgICA8bGkgY2xhc3M9ImRpc2FibGVkIj48YSBocmVmPSIjIj4mcmFxdW87PC9hPjwvbGk+Cit7JWVuZGlmJX0KKyAgPC91bD4KKworICA8ZGl2IGNsYXNzPSJwdWxsLXJpZ2h0Ij4KKyAgICA8c3BhbiBjbGFzcz0iaGVscC1pbmxpbmUiIHN0eWxlPSJwYWRkaW5nLWJvdHRvbToxMHB4OyI+U2hvdyByb3dzOjwvc3Bhbj4KKyAgICA8c2VsZWN0IGNsYXNzPSJwYWdlc2l6ZSI+CisgICAgICB7JSB3aXRoICIxMCAyNSA1MCAxMDAgMTUwIiBhcyBsaXN0JX0KKyAgICAgICAgeyUgZm9yIGkgaW4gbGlzdC5zcGxpdCAlfQorICAgICAgICAgIDxvcHRpb24gdmFsdWU9Int7aX19Ij57e2l9fTwvb3B0aW9uPgorICAgICAgICB7JSBlbmRmb3IgJX0KKyAgICAgIHslIGVuZHdpdGggJX0KKyAgICA8L3NlbGVjdD4KKyAgPC9kaXY+Cis8L2Rpdj4KKworPCEtLSBVcGRhdGUgcGFnZSBkaXNwbGF5IHNldHRpbmdzIC0tPgorPHNjcmlwdD4KKyAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKKyAgICAvLyBsb2FkIGRhdGEgZm9yIG51bWJlciBvZiBlbnRyaWVzIHRvIGJlIGRpc3BsYXllZCBvbiBwYWdlCisgICAgaWYgKHt7cmVxdWVzdC5HRVQuY291bnR9fSAhPSAiIikgeworICAgICAgcGFnZXNpemUgPSB7e3JlcXVlc3QuR0VULmNvdW50fX07CisgICAgfQorICAgICQoJy5wYWdlc2l6ZSBvcHRpb24nKS5wcm9wKCdzZWxlY3RlZCcsIGZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoJ1t2YWx1ZT0iJyArIHBhZ2VzaXplICsgJyJdJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignc2VsZWN0ZWQnLCB0cnVlKTsKKworICAgICQoIi5wYWdlc2l6ZSIpLmNoYW5nZShmdW5jdGlvbiAoKSB7CisgICAgICAgIHJlbG9hZF9wYXJhbXMoeyJjb3VudCI6JCh0aGlzKS52YWwoKX0pOworICAgIH0pOworfSk7Cis8L3NjcmlwdD4KK3slIGVuZGlmICV9CisKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvZGV0YWlsX3NlYXJjaF9oZWFkZXIuaHRtbCBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvZGV0YWlsX3NlYXJjaF9oZWFkZXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmVhM2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9kZXRhaWxfc2VhcmNoX2hlYWRlci5odG1sCkBAIC0wLDAgKzEsNjggQEAKK3slIGNvbW1lbnQgJX0KKyAgU2hvdyBhIGRldGFpbCB0YWJsZSBTZWFyY2ggZmllbGQgYW5kIFJvd3MgcGVyIHBhZ2UuCisgIElucHV0OgorICAgIG9iamVjdHMsIG91ciBib2lsZXJwbGF0ZWQgcGFnaW5hdGVkIHdpdGggc2VhcmNoIGZpZWxkcyBzZXQuCisgICAgb2JqZWN0X2NvdW50LCBjb3VudCBvZiBmdWxsLCB1bmZpbHRlcmVkLCBvYmplY3RzIGxpc3QKKyAgICBzZWFyY2hfd2hhdCwgZmlsbHMgaW4gIlNlYXJjaCBfX18iCisgIE9ubHkgc2hvdyB0aGUgc2VhcmNoIGZvcm0gaWYgd2UgaGF2ZSBtb3JlIHRoYW4gMTAgcmVzdWx0cywKKyAgb3IgaWYgcmV0dXJuIGZyb20gYSBwcmV2aW91cyBzZWFyY2guCit7JSBlbmRjb21tZW50ICV9CisKKworPHNjcmlwdD4KKyQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgeworICAvKiBDbGVhciB0aGUgY3VycmVudCBzZWFyY2ggc2VsZWN0aW9uIGFuZCByZWxvYWQgdGhlIHJlc3VsdHMgKi8KKyAgJCgiLnNlYXJjaC1jbGVhciIpLmNsaWNrKGZ1bmN0aW9uKCl7CisgICAgJCgiI3NlYXJjaCIpLnZhbCgiIik7CisgICAgJCh0aGlzKS5wYXJlbnRzKCJmb3JtIikuc3VibWl0KCk7CisgIH0pOworfSk7Cis8L3NjcmlwdD4KKzxkaXYgY2xhc3M9InJvdy1mbHVpZCI+Cit7JSBpZiBvYmplY3RzLnBhZ2luYXRvci5jb3VudCA+IDEwIG9yIHJlcXVlc3QuR0VULnNlYXJjaCAlfQorICB7JSBpZiBvYmplY3RzLnBhZ2luYXRvci5jb3VudCA9PSAwICV9CisgIDxkaXYgY2xhc3M9ImFsZXJ0Ij4KKyAgICA8aDM+Tm8ge3tzZWFyY2hfd2hhdH19IGZvdW5kPC9oMz4KKyAgICA8Zm9ybSBpZD0ic2VhcmNoZm9ybSIgY2xhc3M9ImlucHV0LWFwcGVuZCI+CisgIHslIGVsc2UgJX0KKyAgICA8Zm9ybSBpZD0ic2VhcmNoZm9ybSIgY2xhc3M9Im5hdmJhci1zZWFyY2ggaW5wdXQtYXBwZW5kIHB1bGwtbGVmdCI+CisgIHslIGVuZGlmICV9CisKKyAgICAgIDxpbnB1dCBpZD0ic2VhcmNoIiBjbGFzcz0iaW5wdXQteGxhcmdlIiB0eXBlPSJ0ZXh0IiBwbGFjZWhvbGRlcj0iU2VhcmNoIHt7c2VhcmNoX3doYXR9fSIgbmFtZT0ic2VhcmNoIiB2YWx1ZT0ieyUgaWYgcmVxdWVzdC5HRVQuc2VhcmNoICV9e3tyZXF1ZXN0LkdFVC5zZWFyY2h9fXslIGVuZGlmICV9Ij4KKyAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIHZhbHVlPSJuYW1lOisiIG5hbWU9Im9yZGVyYnkiPgorICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgdmFsdWU9ImwiIG5hbWU9InBhZ2UiPgorICB7JSBpZiByZXF1ZXN0LkdFVC5zZWFyY2ggJX0KKyAgICAgIDxhIGNsYXNzPSJhZGQtb24gYnRuIHNlYXJjaC1jbGVhciI+CisgICAgICAgIDxpIGNsYXNzPSJpY29uLXJlbW92ZSI+PC9pPgorICAgICAgPC9hPgorICB7JSBlbmRpZiAlfQorICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4iPlNlYXJjaDwvYnV0dG9uPgorICB7JSBpZiBvYmplY3RzLnBhZ2luYXRvci5jb3VudCA9PSAwICV9CisgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9ImJ0biBidG4tbGluayBzZWFyY2gtY2xlYXIiPgorICAgICAgICBTaG93IGFsbCB7e3NlYXJjaF93aGF0fX0KKyAgICAgIDwvYnV0dG9uPgorICB7JSBlbmRpZiAlfQorICAgIDwvZm9ybT4KK3slIGVuZGlmICV9CisKK3slIGlmIG9iamVjdHMucGFnaW5hdG9yLmNvdW50ID09IDAgJX0KKyAgPC9kaXY+IHsjIGVuZCBhbGVydCAjfQoreyUgZWxzZSAlfQorICB7JSBpZiBvYmplY3RfY291bnQgPiAxMCAlfQorICA8ZGl2IGNsYXNzPSJwdWxsLXJpZ2h0Ij4KKyAgICA8c3BhbiBjbGFzcz0iaGVscC1pbmxpbmUiIHN0eWxlPSJwYWRkaW5nLXRvcDo1cHg7Ij5TaG93IHJvd3M6PC9zcGFuPgorICAgIDxzZWxlY3Qgc3R5bGU9Im1hcmdpbi10b3A6NXB4O21hcmdpbi1ib3R0b206MHB4OyIgY2xhc3M9InBhZ2VzaXplIj4KKyAgICB7JSB3aXRoICIxMCAyNSA1MCAxMDAgMTUwIiBhcyBsaXN0JX0KKyAgICAgIHslIGZvciBpIGluIGxpc3Quc3BsaXQgJX0KKyAgICAgICAgeyUgaWYgcmVxdWVzdC5zZXNzaW9uLmxpbWl0ID09IGkgJX0KKyAgICAgIDxvcHRpb24gdmFsdWU9Int7aX19IiBzZWxlY3RlZD57e2l9fTwvb3B0aW9uPgorICAgICAgICB7JSBlbHNlICV9CisgICAgICA8b3B0aW9uIHZhbHVlPSJ7e2l9fSI+e3tpfX08L29wdGlvbj4KKyAgICAgICAgeyUgZW5kaWYgJX0KKyAgICAgIHslIGVuZGZvciAlfQorICAgIHslIGVuZHdpdGggJX0KKyAgICA8L3NlbGVjdD4KKyAgPC9kaXY+CisgIHslIGVuZGlmICV9Cit7JSBlbmRpZiAlfQorPC9kaXY+IHsjIHJvdy1mbHVpZCAjfQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9kZXRhaWxfc29ydGVkX2hlYWRlci5odG1sIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9kZXRhaWxfc29ydGVkX2hlYWRlci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZTI5MmUKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL2RldGFpbF9zb3J0ZWRfaGVhZGVyLmh0bWwKQEAgLTAsMCArMSwyNSBAQAoreyUgY29tbWVudCAlfQorICAgIEFkZHMgc29ydGVkIGNvbHVtbnMgdG8gYSBkZXRhaWwgdGFibGUuCisgICAgTXVzdCBiZSBwcmVjZWRlZCBieSA8dGFibGUgY2xhc3M9InRhYmxlIHRhYmxlLWJvcmRlcmVkIHRhYmxlLWhvdmVyIHRhYmxlc29ydGVyIiBpZD0ib3RhYmxlIj4KKyAgICBNdXN0IGJlIGZvbGxvd2VkIGJ5IDx0Ym9keT4uLi48L3Rib2R5PjwvdGFibGU+LgorICAgIFJlcXVpcmVzIHRhYmxlY29scyBzZXR1cCBjb2x1bW4gZmllbGRzIGRjbGFzcywgY2xjbGFzcywgcWhlbHAsIG9yZGVyZmllbGQuCit7JSBlbmRjb21tZW50ICV9Cit7JSBsb2FkIHByb2plY3R0YWdzICV9Cit7IyAgICA8dGFibGUgY2xhc3M9InRhYmxlIHRhYmxlLWJvcmRlcmVkIHRhYmxlLWhvdmVyIHRhYmxlc29ydGVyIiBpZD0ib3RhYmxlIj4gI30KKyAgICA8dGhlYWQ+CisgICAgICAgIDwhLS0gVGFibGUgaGVhZGVyIHJvdzsgZ2VuZXJhdGVkIGZyb20gInRhYmxlY29scyIgZW50cnkgaW4gdGhlIGNvbnRleHQgZGljdCAtLT4KKyAgICAgICAgPHRyPgorICAgICAgICAgICAgeyUgZm9yIHRjIGluIHRhYmxlY29scyAlfTx0aCBjbGFzcz0ieyVpZiB0Yy5kY2xhc3MlfXt7dGMuZGNsYXNzfX17JSBlbmRpZiAlfSB7JWlmIHRjLmNsYXNzICV9e3t0Yy5jbGNsYXNzfX17JSBlbmRpZiAlfSI+CisgICAgICAgICAgICAgICAgeyVpZiB0Yy5xaGVscCV9PGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCIgdGl0bGU9Int7dGMucWhlbHB9fSI+PC9pPnslZW5kaWYlfQorICAgICAgICAgICAgICAgIHslaWYgdGMub3JkZXJmaWVsZCV9PGEgeyVpZiB0Yy5vcmRlcmljb24lfSBjbGFzcz0ic29ydGVkIiB7JWVuZGlmJX1ocmVmPSJqYXZhc2NyaXB0OnJlbG9hZF9wYXJhbXMoeydwYWdlJzogMSwgJ29yZGVyYnknIDogJ3t7dGMub3JkZXJmaWVsZH19JyB9KSI+e3t0Yy5uYW1lfX08L2E+eyVlbHNlJX08c3BhbiBjbGFzcz0ibXV0ZWQiPnt7dGMubmFtZX19PC9zcGFuPnslZW5kaWYlfQorICAgICAgICAgICAgICAgIHslaWYgdGMub3JkZXJpY29uJX0gPGkgY2xhc3M9Imljb24tY2FyZXQte3t0Yy5vcmRlcmljb259fSI+PC9pPnslZW5kaWYlfQorICAgICAgICAgICAgICAgIHslIGlmIHJlcXVlc3QuR0VULnNlYXJjaCBhbmQgZm9ybG9vcC5maXJzdCAlfQorICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iYmFkZ2UgYmFkZ2UtaW5mbyI+e3tvYmplY3RzLnBhZ2luYXRvci5jb3VudH19PC9zcGFuPgorICAgICAgICAgICAgICAgIHslIGVuZGlmICV9CisgICAgICAgICAgICAgICAgeyVpZiB0Yy5maWx0ZXIlfTxkaXYgY2xhc3M9ImJ0bi1ncm91cCBwdWxsLXJpZ2h0Ij4KKyAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iI2ZpbHRlcl97e3RjLmZpbHRlci5jbGFzc319IiByb2xlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLW1pbmkgeyVpZiByZXF1ZXN0LkdFVC5maWx0ZXIlfXt7dGMuZmlsdGVyLm9wdGlvbnN8ZmlsdGVyZWRfaWNvbjpyZXF1ZXN0LkdFVC5maWx0ZXJ9fSB7JWVuZGlmJX0iIHslaWYgcmVxdWVzdC5HRVQuZmlsdGVyIGFuZCB0Yy5maWx0ZXIub3B0aW9uc3xmaWx0ZXJlZF90b29sdGlwOnJlcXVlc3QuR0VULmZpbHRlciAlfSB0aXRsZT0iPHA+e3t0Yy5maWx0ZXIub3B0aW9uc3xmaWx0ZXJlZF90b29sdGlwOnJlcXVlc3QuR0VULmZpbHRlcn19PC9wPjxwPjxhIGNsYXNzPSdidG4gYnRuLXNtYWxsIGJ0bi1wcmltYXJ5JyBocmVmPWphdmFzY3JpcHQ6cmVsb2FkX3BhcmFtcyh7J2ZpbHRlcic6Jyd9KT5TaG93IGFsbCB7JSBpZiBmaWx0ZXJfc2VhcmNoX2Rpc3BsYXkgJX17e2ZpbHRlcl9zZWFyY2hfZGlzcGxheX19eyUgZWxzZSAlfXt7b2JqZWN0bmFtZX19eyUgZW5kaWYgJX08L2E+PC9wPiIgeyVlbmRpZiV9IGRhdGEtdG9nZ2xlPSJtb2RhbCI+IDxpIGNsYXNzPSJpY29uLWZpbHRlciBmaWx0ZXJlZCI+PC9pPiA8L2E+CisgICAgICAgICAgICAgICAgPC9kaXY+eyVlbmRpZiV9CisgICAgICAgICAgICA8L3RoPnslIGVuZGZvciAlfQorICAgICAgICA8L3RyPgorICAgIDwvdGhlYWQ+CisKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvZGlyaW5mby5odG1sIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9kaXJpbmZvLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTViYzQ4MQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvZGlyaW5mby5odG1sCkBAIC0wLDAgKzEsMjM2IEBACit7JSBleHRlbmRzICJiYXNlYnVpbGRwYWdlLmh0bWwiICV9Cit7JSBibG9jayBleHRyYWhlYWRjb250ZW50ICV9Cit7JSBsb2FkIHN0YXRpYyAlfQorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJ7JSBzdGF0aWMgJ2Nzcy9qcXVlcnkudHJlZXRhYmxlLmNzcycgJX0iIHR5cGU9InRleHQvY3NzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0ieyUgc3RhdGljICdjc3MvanF1ZXJ5LnRyZWV0YWJsZS50aGVtZS50b2FzdGVyLmNzcycgJX0iIHR5cGU9InRleHQvY3NzIj4KK3slIGVuZGJsb2NrIGV4dHJhaGVhZGNvbnRlbnQgJX0KKworeyUgYmxvY2sgbG9jYWxicmVhZGNydW1iICV9Cis8bGk+e3t0YXJnZXQudGFyZ2V0fX08L2xpPgoreyUgZW5kYmxvY2sgbG9jYWxicmVhZGNydW1iJX0KKworeyUgYmxvY2sgYnVpbGRpbmZvbWFpbiAlfQorCit7JSBsb2FkIHN0YXRpYyAlfQorPHNjcmlwdCBzcmM9InslIHN0YXRpYyAnanMvanF1ZXJ5LnRyZWV0YWJsZS5qcycgJX0iPgorPC9zY3JpcHQ+Cit7JSBsb2FkIHByb2plY3R0YWdzICV9CisKKzxzY3JpcHQgdHlwZT0ndGV4dC9qYXZhc2NyaXB0Jz4KKyAgICBmdW5jdGlvbiBzZXR1cFRyZWV0YWJsZSgpIHsKKyAgICAgICAgJCgiI2RpcnRhYmxlIikudHJlZXRhYmxlKHsKKyAgICAgICAgICAgIGV4cGFuZGFibGU6IHRydWUsCisgICAgICAgICAgICBicmFuY2hBdHRyOiAidHRCcmFuY2giLAorICAgICAgICAgICAgY2xpY2thYmxlTm9kZU5hbWVzOiB0cnVlLAorICAgICAgICAgICAgb25Ob2RlQ29sbGFwc2U6IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgIC8qIERvIG5vdGhpbmcsIGtlZXAgY2FjaGVkICovCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgb25Ob2RlRXhwYW5kOiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLmlkOworICAgICAgICAgICAgICAgIHZhciBuID0gJCgiI2RpcnRhYmxlIikudHJlZXRhYmxlKCJub2RlIiwgc3RhcnQpOworICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogYWxyZWFkeSB3YXMgZXhwYW5kZWQgb25jZSAqLworICAgICAgICAgICAgICAgICAgICAkKCIjZGlydGFibGUiKS50cmVldGFibGUoInJldmVhbCIsIHN0YXJ0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHZhciB1cmwgPSAieyUgdXJsICJkaXJpbmZvX2FqYXgiIGJ1aWxkLmlkIHRhcmdldC5pZCAgJX0iOworICAgICAgICAgICAgICAgICAgICAkLmFqYXgoeworICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmM6IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSAgICA6ICJHRVQiLAorICAgICAgICAgICAgICAgICAgICAgICAgdXJsICAgICA6IHVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgICAgOiAic3RhcnQ9IiArIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA6IGZ1bmN0aW9uKHJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkUm93cyhuLCByZXNwb25zZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciAgIDogZnVuY3Rpb24oanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duICkge2FsZXJ0KHRleHRTdGF0dXMgKyAiOiIgKyBlcnJvclRocm93bil9LAorICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIH0sCisgICAgICAgfSk7CisgICAgfQorICAgIGZ1bmN0aW9uIHRkKGRhdGEpIHsKKyAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgeworICAgICAgICAgICAgZGF0YSA9ICcnOworICAgICAgICB9CisgICAgICAgIHJldHVybiAnPHRkPicgKyBkYXRhICsgJzwvdGQ+JworICAgIH0KKworICAgIGZ1bmN0aW9uIGZvcm1hdFJvdyhvKSB7CisgICAgICAgIC8qIHNldHVwIHRyLXdpZGUgZm9ybWF0dGluZyAqLworICAgICAgICB2YXIgdHIgPSAnPHRyIGNsYXNzPSInOworICAgICAgICBpZiAoby5saW5rX3RvICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyICs9ICdtdXRlZCAnOworICAgICAgICB9CisgICAgICAgIGlmIChvLmlzZGlyICYmIG8uY2hpbGRjb3VudCkgeworICAgICAgICAgICAgdHIgKz0gJ2JyYW5jaCIgZGF0YS10dC1icmFuY2g9InRydWUiICc7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB0ciArPSAnbGVhZiIgZGF0YS10dC1icmFuY2g9ImZhbHNlIiAnOworICAgICAgICB9CisgICAgICAgIHRyICs9ICAgICcgZGF0YS10dC1pZD0iJyArIG8uZnVsbHBhdGggKyciICc7CisgICAgICAgIGlmIChvLnBhcmVudCAhPSAiLyIpIHsKKyAgICAgICAgICAgIHRyICs9ICAgICcgZGF0YS10dC1wYXJlbnQtaWQ9IicgKyBvLnBhcmVudCArJyIgJzsKKyAgICAgICAgfQorICAgICAgICB0ciArPSAnPic7CisKKyAgICAgICAgLyogc2V0dXAgdGQgc3BlY2lmaWMgZm9ybWF0dGluZyAqLworICAgICAgICB2YXIgbGlua190byA9IHRkKG8ubGlua190byk7CisgICAgICAgIHZhciBzaXplID0gJzx0ZCBjbGFzcyA9ICJzaXplY29sIj4nICsgby5zaXplICsgJzwvdGQ+JworICAgICAgICB2YXIgcGVybWlzc2lvbiA9IHRkKG8ucGVybWlzc2lvbik7CisgICAgICAgIHZhciBvd25lciA9IHRkKG8ub3duZXIpOworICAgICAgICB2YXIgZ3JvdXAgPSB0ZChvLmdyb3VwKTsKKworICAgICAgICAvKiBoYW5kbGUgdGhlIG5hbWUgY29sdW1uICovCisgICAgICAgIHZhciBuYW1lID0gbnVsbDs7CisgICAgICAgIHZhciBuYW1lc3Bhbj0xOworICAgICAgICBpZiAoby5pc2RpcikgeworICAgICAgICAgICAgaWYgKG8ubGlua190byA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbmFtZXNwYW4gPSAyOworICAgICAgICAgICAgICAgIGlmIChvLnBhY2thZ2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBuYW1lc3BhbiA9IDM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIGNvbHNwYW4gPSAnY29sc3Bhbj0iJyArIG5hbWVzcGFuICsgJyInOworICAgICAgICAgICAgbmFtZSA9ICc8dGQgY2xhc3M9ImNvbnRlbnQtZGlyZWN0b3J5IicgKyBjb2xzcGFuICsgJz4nOworICAgICAgICAgICAgaWYgKG8uY2hpbGRjb3VudCkgeworICAgICAgICAgICAgICAgIG5hbWUgKz0gJzxhIGhyZWY9IiI+JzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5hbWUgKz0gJzxpIGNsYXNzPSJpY29uLWZvbGRlci1jbG9zZSI+PC9pPic7CisgICAgICAgICAgICBuYW1lICs9ICcmbmJzcDsnICsgby5uYW1lOworICAgICAgICAgICAgaWYgKG8uY2hpbGRjb3VudCkgeworICAgICAgICAgICAgICAgIG5hbWUgKz0gJzwvYT4nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmFtZSArPSAnPC90ZD4nOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbmFtZSA9ICc8dGQ+JzsKKyAgICAgICAgICAgIGlmIChvLmxpbmtfdG8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG5hbWUgKz0gJzxpIGNsYXNzPSJpY29uLWZpbGUiPjwvaT4nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbmFtZSArPSAnPGkgY2xhc3M9Imljb24taGFuZC1yaWdodCI+PC9pPic7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuYW1lICs9ICcmbmJzcDsnICsgby5uYW1lOworICAgICAgICAgICAgbmFtZSArPSAnPC90ZD4nOworICAgICAgICB9CisKKyAgICAgICAgLyogaGFuZGxlIHRoZSBwYWNrYWdlIGNvbHVtbiAqLworICAgICAgICB2YXIgcGFja2FnZSA9IG51bGw7CisgICAgICAgIGlmIChvLnBhY2thZ2UgIT0gbnVsbCkgeworICAgICAgICAgICAgLyogYWRkIGxpbmsgdG8gaW5jbHVkZWQgcGFja2FnZSBwYWdlICovCisgICAgICAgICAgICBidWlsZF9pZCA9IHt7IGJ1aWxkLmlkIH19OworICAgICAgICAgICAgdGFyZ2V0X2lkID0ge3sgdGFyZ2V0LmlkIH19OworICAgICAgICAgICAgLyogQ3JlYXRlIGEgdXJsIGZvciBhIGR1bW15IHBhY2thZ2UgaWQgb2YgMCAqLworICAgICAgICAgICAgZHVtbXkgPSAieyUgdXJsICdwYWNrYWdlX2luY2x1ZGVkX2RldGFpbCcgYnVpbGQuaWQgdGFyZ2V0LmlkIDAgJX0iCisgICAgICAgICAgICAvKiBmaWxsIGluIHRoZSBwYWNrYWdlIGlkICovCisgICAgICAgICAgICB1cmwgPSBkdW1teS5zdWJzdHIoMCwgZHVtbXkubGVuZ3RoLTEpICsgby5wYWNrYWdlX2lkOworICAgICAgICAgICAgcGFja2FnZSA9ICc8YSBocmVmPScgKyB1cmwgKyAnPicgOworICAgICAgICAgICAgcGFja2FnZSArPSBvLnBhY2thZ2U7CisgICAgICAgICAgICBwYWNrYWdlICs9ICc8L2E+JzsKKyAgICAgICAgICAgIGlmIChvLmluc3RhbGxlZF9wYWNrYWdlICE9IG8ucGFja2FnZSkgeworICAgICAgICAgICAgICAgIC8qIG1ha2UgY2xhc3MgbXV0ZWQgYW5kIGFkZCBob3ZlciBoZWxwICovCisgICAgICAgICAgICAgICAgcGFja2FnZSArPSAnPHNwYW4gY2xhc3M9Im11dGVkIj4gYXMgJyArIG8uaW5zdGFsbGVkX3BhY2thZ2UgKyAnIDwvc3Bhbj4nOworICAgICAgICAgICAgICAgIHBhY2thZ2UgKz0gJzxpIGNsYXNzPSJpY29uLXF1ZXN0aW9uLXNpZ24gZ2V0LWhlbHAgaG92ZXItaGVscCIgJzsKKyAgICAgICAgICAgICAgICBwYWNrYWdlICs9ICd0aXRsZT0iJyArIG8ucGFja2FnZSArICcgd2FzIHJlbmFtZWQgYXQgcGFja2FnaW5nIHRpbWUgYW5kIHdhcyBpbnN0YWxsZWQgaW4geW91ciBpbWFnZSBhcyAnICsgby5pbnN0YWxsZWRfcGFja2FnZSArICciPic7CisgICAgICAgICAgICAgICAgcGFja2FnZSArPSAnPC9pPic7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcGFja2FnZSA9IHRkKHBhY2thZ2UpOworCisgICAgICAgIHZhciBjb2xzMXRvMzsKKyAgICAgICAgc3dpdGNoIChuYW1lc3BhbikgeworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIGNvbHMxdG8zID0gbmFtZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgIDI6CisgICAgICAgICAgICAgICAgY29sczF0bzMgPSBuYW1lICsgcGFja2FnZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgY29sczF0bzMgPSBuYW1lICsgbGlua190byArIHBhY2thZ2U7CisgICAgICAgIH0KKyAgICAgICAgciA9IHRyICsgY29sczF0bzMgKyBzaXplICsgcGVybWlzc2lvbiArIG93bmVyICsgZ3JvdXAgKyAiPC90cj4iCisgICAgICAgIHJldHVybiByOworICAgIH0KKworICAgIGZ1bmN0aW9uIGFkZFJvd3Mobiwgb2JqcykgeworICAgICAgICByb3dzID0gIiI7CisgICAgICAgIGZvciAoaT0wOyBpPG9ianMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHJvd3MgKz0gZm9ybWF0Um93KG9ianNbaV0pOworICAgICAgICB9CisgICAgICAgICQoIiNkaXJ0YWJsZSIpLnRyZWV0YWJsZSgibG9hZEJyYW5jaCIsIG4sIHJvd3MpOworICAgIH0KKworICAgICQuZm4uaXNPZmZTY3JlZW4gPSBmdW5jdGlvbigpeworICAgICAgICB2YXIgd2luID0gJCh3aW5kb3cpOworICAgICAgICB2aWV3cG9ydEJvdHRvbSA9IHdpbi5zY3JvbGxUb3AoKSArIHdpbi5oZWlnaHQoKTsKKyAgICAgICAgCisgICAgICAgIHZhciBib3VuZHMgPSB0aGlzLm9mZnNldCgpOworICAgICAgICBib3VuZHMuYm90dG9tID0gYm91bmRzLnRvcCArIHRoaXMub3V0ZXJIZWlnaHQoKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiAoYm91bmRzLmJvdHRvbSA+IHZpZXdwb3J0Qm90dG9tKTsKKyAgICB9OworCisgICAgZnVuY3Rpb24gc2VsZWN0Um93KHBhdGgpIHsKKyAgICAgICAgdmFyIHJvdyAgPSAkKCd0cltkYXRhLXR0LWlkPSInICsgcGF0aCArICciXScpOworICAgICAgICByb3cuYWRkQ2xhc3MoIiBoaWdobGlnaHQiKTsKKyAgICAgICAgaWYgKHJvdy5pc09mZlNjcmVlbigpKSB7CisgICAgICAgICAgICAkKCdodG1sLCBib2R5JykuYW5pbWF0ZSh7IHNjcm9sbFRvcDogcm93Lm9mZnNldCgpLnRvcCAtIDE1MH0sIDIwMDApOworICAgICAgICB9CisgICAgfQorPC9zY3JpcHQ+CisKKzxkaXYgY2xhc3M9InNwYW4xMCI+CisKKyAgICA8ZGl2IGNsYXNzPSJwYWdlLWhlYWRlciI+CisgICAgICAgIDxoMT4ge3t0YXJnZXQudGFyZ2V0fX0gPC9oMT4KKyAgICA8L2Rpdj4KKworICAgIDx1bCBjbGFzcz0ibmF2IG5hdi1waWxscyI+CisgICAgICAgIDxsaSBjbGFzcz0iIj4KKyAgICAgICAgICAgIDxhIGhyZWY9InslIHVybCAndGFyZ2V0JyBidWlsZC5pZCB0YXJnZXQuaWQgJX0iPgorICAgICAgICAgICAgPGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCIgdGl0bGU9Ik9mIGFsbCB0aGUgcGFja2FnZXMgYnVpbHQsIHRoZSBzdWJzZXQgaW5zdGFsbGVkIGluIHRoZSByb290IGZpbGUgc3lzdGVtIG9mIHRoaXMgaW1hZ2UiPjwvaT4KKyAgICAgICAgICAgICAgICBQYWNrYWdlcyBpbmNsdWRlZCAoe3t0YXJnZXQucGFja2FnZV9jb3VudH19IC0ge3twYWNrYWdlc19zdW18ZmlsdGVyZWRfZmlsZXNpemVmb3JtYXR9fSkKKyAgICAgICAgICAgIDwvYT4KKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpIGNsYXNzPSJhY3RpdmUiPgorICAgICAgICAgICAgPGEgaHJlZj0ieyUgdXJsICdkaXJpbmZvJyBidWlsZC5pZCB0YXJnZXQuaWQgJX0iPgorICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLXF1ZXN0aW9uLXNpZ24gZ2V0LWhlbHAiIHRpdGxlPSJUaGUgZGlyZWN0b3JpZXMgYW5kIGZpbGVzIGluIHRoZSByb290IGZpbGUgc3lzdGVtIG9mIHRoaXMgaW1hZ2UiPjwvaT4KKyAgICAgICAgICAgICAgICBEaXJlY3Rvcnkgc3RydWN0dXJlCisgICAgICAgICAgICA8L2E+CisgICAgICAgIDwvbGk+CisgICAgPC91bD4KKworICAgIDxkaXYgaWQ9ImRpcmVjdG9yeS1zdHJ1Y3R1cmUiIGNsYXNzPSJ0YWItcGFuZSBhY3RpdmUiPgorICAgICAgICA8dGFibGUgaWQ9ImRpcnRhYmxlIiBjbGFzcz0idGFibGUgdGFibGUtYm9yZGVyZWQgdGFibGUtaG92ZXIgdHJlZXRhYmxlIj4KKyAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0aD5EaXJlY3RvcnkgLyBGaWxlPC90aD4KKyAgICAgICAgICAgICAgICAgICAgPHRoPlN5bWJvbGljIGxpbmsgdG88L3RoPgorICAgICAgICAgICAgICAgICAgICA8dGg+U291cmNlIHBhY2thZ2U8L3RoPgorICAgICAgICAgICAgICAgICAgICA8dGg+U2l6ZTwvdGg+CisgICAgICAgICAgICAgICAgICAgIDx0aD5QZXJtaXNzaW9uczwvdGg+CisgICAgICAgICAgICAgICAgICAgIDx0aD5Pd25lcjwvdGg+CisgICAgICAgICAgICAgICAgICAgIDx0aD5Hcm91cDwvdGg+CisgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICA8c2NyaXB0IHR5cGU9J3RleHQvamF2YXNjcmlwdCc+CisgICAgICAgICAgICAgICAgc2V0dXBUcmVldGFibGUoKTsKKyAgICAgICAgICAgICAgICBhZGRSb3dzKG51bGwsIHt7IG9iamVjdHN8c2FmZSB9fSApOworICAgICAgICAgICAgICAgIHslIGlmIGZpbGVfcGF0aCAlfQorICAgICAgICAgICAgICAgICAgICB7JSBjb21tZW50ICV9CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5rIGZyb20gcGFja2FnZV9pbmNsdWRlZF9kZXRhaWwgc3BlY2lmaWVzIGZpbGUgcGF0aAorICAgICAgICAgICAgICAgICAgICB7JSBlbmRjb21tZW50ICV9CisgICAgICAgICAgICAgICAgICAgIHslIGZvciBkaXJfZWxlbSBpbiBkaXJfbGlzdCAlfQorICAgICAgICAgICAgICAgICAgICAgICAgJCgiI2RpcnRhYmxlIikudHJlZXRhYmxlKCJleHBhbmROb2RlIiwgInt7ZGlyX2VsZW19fSIpOworICAgICAgICAgICAgICAgICAgICB7JSBlbmRmb3IgJX0KKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0Um93KCJ7e2ZpbGVfcGF0aH19Iik7CisgICAgICAgICAgICAgICAgeyUgZW5kaWYgJX0KKyAgICAgICAgICAgIDwvc2NyaXB0PgorICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgPC90YWJsZT4KKyAgICA8L2Rpdj4gPCEtLSBkaXJlY3Rvcnktc3RydWN0dXJlIC0tPgorPC9kaXY+IDwhLS0gc3BhbjEwIC0tPgorCit7JSBlbmRibG9jayBidWlsZGluZm9tYWluICV9CisKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvZGlza2lvLmh0bWwgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL2Rpc2tpby5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1Y2VmNmYKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL2Rpc2tpby5odG1sCkBAIC0wLDAgKzEsNCBAQAoreyUgZXh0ZW5kcyAiYmFzZWJ1aWxkcGFnZS5odG1sIiAlfQoreyUgYmxvY2sgbG9jYWxicmVhZGNydW1iICV9Cis8bGk+RGlzayBJL088L2xpPgoreyUgZW5kYmxvY2sgJX0KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvZmlsdGVyc25pcHBldC5odG1sIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9maWx0ZXJzbmlwcGV0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEwMWFhOAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvZmlsdGVyc25pcHBldC5odG1sCkBAIC0wLDAgKzEsNTcgQEAKK3slIGxvYWQgcHJvamVjdHRhZ3MgJX0KKzwhLS0gJ3t7Zi5jbGFzc319JyBmaWx0ZXIgLS0+Cit7JSB3aXRoIGYuY2xhc3MgYXMgIGtleSAlfQorPGZvcm0gaWQ9ImZpbHRlcl97e2YuY2xhc3N9fSIgY2xhc3M9Im1vZGFsIGhpZGUgZmFkZSIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciIGFyaWEtaGlkZGVuPSJ0cnVlIj4KKyAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic2VhcmNoIiB2YWx1ZT0ieyVpZiByZXF1ZXN0LkdFVC5zZWFyY2ggJX17e3JlcXVlc3QuR0VULnNlYXJjaH19eyVlbmRpZiV9Ii8+CisgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+CisgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+eDwvYnV0dG9uPgorICAgICAgICAgICAgeyUgaWYgc2VhcmNoX3Rlcm0gJX0KKyAgICAgICAgICAgICAgICAgPGgzPkZpbHRlciB7e3RvdGFsX2NvdW50fX0geyVpZiBmaWx0ZXJfc2VhcmNoX2Rpc3BsYXklfXt7ZmlsdGVyX3NlYXJjaF9kaXNwbGF5fHRpdGxlfX17JWVsc2UlfXt7b2JqZWN0bmFtZXx0aXRsZX19eyVlbmRpZiV9IG1hdGNoaW5nICd7e3NlYXJjaF90ZXJtfX0nIGJ5ICd7e3RjLm5hbWV9fSc8L2gzPgorICAgICAgICAgICAgeyUgZWxzZSAlfQorICAgICAgICAgICAgICAgIDxoMz5GaWx0ZXIgeyVpZiBmaWx0ZXJfc2VhcmNoX2Rpc3BsYXklfXt7ZmlsdGVyX3NlYXJjaF9kaXNwbGF5fHRpdGxlfX17JWVsc2UlfXt7b2JqZWN0bmFtZXx0aXRsZX19eyVlbmRpZiV9IGJ5ICd7e3RjLm5hbWV9fSc8L2gzPgorICAgICAgICAgICAgeyUgZW5kaWYgJX0KKyAgICAgICAgPC9kaXY+CisgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWJvZHkiPgorICAgICAgICAgICAgPHA+e3tmLmxhYmVsfX08L3A+CisgICAgICAgICAgICA8bGFiZWwgY2xhc3M9InJhZGlvIj4KKyAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9ImZpbHRlciIgeyVpZiByZXF1ZXN0LkdFVC5maWx0ZXIlfXt7Zi5vcHRpb25zfGNoZWNrX2ZpbHRlcl9zdGF0dXM6cmVxdWVzdC5HRVQuZmlsdGVyfX0geyVlbHNlJX0gY2hlY2tlZCB7JWVuZGlmJX0gdmFsdWU9IiIgZGF0YS1rZXk9Int7a2V5fX0iPiAgQWxsIHslaWYgZmlsdGVyX3NlYXJjaF9kaXNwbGF5JX17e2ZpbHRlcl9zZWFyY2hfZGlzcGxheXx0aXRsZX19eyVlbHNlJX17e29iamVjdG5hbWV8dGl0bGV9fXslZW5kaWYlfQorICAgICAgICAgICAgPC9sYWJlbD4KKyAgICAgICAgICAgIHslIGZvciBvcHRpb24gaW4gZi5vcHRpb25zICV9CisgICAgICAgICAgICAgICAgeyUgaWYgb3B0aW9uLjEgPT0gJ2RhdGVyYW5nZScgJX0KKyAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0taW5saW5lIj4KKyAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9InJhZGlvIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJmaWx0ZXIiIGlkPSJmaWx0ZXJfdmFsdWVfe3trZXl9fSIgeyVpZiBrZXkgPT0gZGF0ZXJhbmdlX3NlbGVjdGVkICV9Y2hlY2tlZHslZW5kaWYlfSB2YWx1ZT0ie3tvcHRpb24uMX19IiBkYXRhLWtleT0ie3trZXl9fSI+IHt7b3B0aW9uLjB9fQorICAgICAgICAgICAgICAgIHslIGVsc2UgJX0KKyAgICAgICAgICAgICAgICAgIHslIGlmIDEgJX0KKyAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9InJhZGlvIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJmaWx0ZXIiIHslaWYgcmVxdWVzdC5HRVQuZmlsdGVyID09IG9wdGlvbi4xICV9Y2hlY2tlZHslZW5kaWYlfSAgdmFsdWU9Int7b3B0aW9uLjF9fSIgZGF0YS1rZXk9Int7a2V5fX0iPiB7e29wdGlvbi4wfX0KKyAgICAgICAgICAgICAgICAgIHslIGNvbW1lbnQgImRvIG5vdCBkaXNhYmxlIHJhZGlvIHNlbGVjdGlvbnMgYnkgY291bnQgZm9yIG5vdyIgJX17JSBlbHNlICV9CisgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJyYWRpbyBtdXRlZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iZmlsdGVyIiBkaXNhYmxlZCB7JWlmIHJlcXVlc3QuR0VULmZpbHRlciA9PSBvcHRpb24uMSAlfWNoZWNrZWR7JWVuZGlmJX0gIHZhbHVlPSJ7e29wdGlvbi4xfX0iIGRhdGEta2V5PSJ7e2tleX19Ij4ge3tvcHRpb24uMH19CisgICAgICAgICAgICAgICAgICB7JSBlbmRjb21tZW50ICV9eyUgZW5kaWYgJX0KKyAgICAgICAgICAgICAgICB7JSBlbmRpZiAlfQorICAgICAgICAgICAgICAgIHslIGlmIG9wdGlvbi4zICV9PGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCIgZGF0YS1wbGFjZW1lbnQ9InJpZ2h0IiB0aXRsZT0ie3tvcHRpb24uM319Ij48L2k+eyUgZW5kaWYgJX0KKyAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CisgICAgICAgICAgICAgICAgeyUgaWYgb3B0aW9uLjEgPT0gJ2RhdGVyYW5nZScgJX0KKyAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iZGF0ZV9mcm9tX3t7a2V5fX0iIG5hbWU9ImRhdGVfZnJvbV97e2tleX19IiBkaXNhYmxlZCBjbGFzcz0iaW5wdXQtc21hbGwiIC8+PGxhYmVsIGNsYXNzPSJoZWxwLWlubGluZSI+dG88L2xhYmVsPgorICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJkYXRlX3RvX3t7a2V5fX0iIG5hbWU9ImRhdGVfdG9fe3trZXl9fSIgZGlzYWJsZWQgY2xhc3M9ImlucHV0LXNtYWxsIiAgLz4KKyAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iaGVscC1pbmxpbmUgZ2V0LWhlbHAiID4oZGQvbW0veXl5eSk8L2xhYmVsPgorICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgeyUgZW5kaWYgJX0KKyAgICAgICAgICAgIHslIGVuZGZvciAlfQorICAgICAgICA8IS0tIGRhdGVyYW5nZSBwZXJzaXN0ZW5jZSAtLT4KKyAgICAgICAgeyUgaWYgbGFzdF9kYXRlX2Zyb20gYW5kIGxhc3RfZGF0ZV90byAlfQorICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0ibGFzdF9kYXRlX2Zyb21fe3trZXl9fSIgbmFtZT0ibGFzdF9kYXRlX2Zyb20iIHZhbHVlPSJ7e2xhc3RfZGF0ZV9mcm9tfX0iLz4KKyAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9Imxhc3RfZGF0ZV90b197e2tleX19IiBuYW1lPSJsYXN0X2RhdGVfdG8iICAgdmFsdWU9Int7bGFzdF9kYXRlX3RvfX0iLz4KKyAgICAgICAgeyUgZW5kaWYgJX0KKyAgICAgICAgPC9kaXY+CisgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CisgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSIgZGF0YS1rZXk9Int7a2V5fX0iPkFwcGx5PC9idXR0b24+CisgICAgICAgICAgICB7JSBpZiByZXF1ZXN0LkdFVC5maWx0ZXIgJX0KKyAgICAgICAgICAgICAgICB7JSBpZiByZXF1ZXN0LkdFVC5maWx0ZXJ8c3RyaW5nX3JlbW92ZV9yZWdleDonOi4qJyAhPSBmLm9wdGlvbnMuMC4xfHN0cmluZ19yZW1vdmVfcmVnZXg6JzouKicgJX0KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaGVscC1pbmxpbmUgcHVsbC1sZWZ0Ij5Zb3UgY2FuIG9ubHkgYXBwbHkgb25lIGZpbHRlciB0byB0aGUgdGFibGUuIFRoaXMgZmlsdGVyIHdpbGwgb3ZlcnJpZGUgdGhlIGN1cnJlbnQgZmlsdGVyLjwvc3Bhbj4KKyAgICAgICAgICAgICAgICB7JSBlbmRpZiAlfQorICAgICAgICAgICAgeyUgZW5kaWYgJX0KKyAgICAgICAgPC9kaXY+Cis8L2Zvcm0+Cit7JSBlbmR3aXRoICV9CmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL2dlbmVyaWMtdG9hc3RlcnRhYmxlLXBhZ2UuaHRtbCBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvZ2VuZXJpYy10b2FzdGVydGFibGUtcGFnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYWE4Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL2dlbmVyaWMtdG9hc3RlcnRhYmxlLXBhZ2UuaHRtbApAQCAtMCwwICsxLDE3IEBACit7JSBleHRlbmRzICJiYXNlcHJvamVjdHBhZ2UuaHRtbCIgJX0KK3slIGxvYWQgcHJvamVjdHRhZ3MgJX0KK3slIGxvYWQgaHVtYW5pemUgJX0KK3slIGxvYWQgc3RhdGljICV9CisKK3slIGJsb2NrIHByb2plY3RpbmZvbWFpbiAlfQorCis8aDI+e3t0aXRsZX19ICg8c3BhbiBjbGFzcz0idGFibGUtY291bnQte3t0YWJsZV9uYW1lfX0iPjwvc3Bhbj4pCisgIHslIGlmIHByb2plY3QucmVsZWFzZSAlfQorICA8aSBjbGFzcz0iaWNvbi1xdWVzdGlvbi1zaWduIGdldC1oZWxwIGhlYWRpbmctaGVscCIgdGl0bGU9IlRoaXMgcGFnZSBsaXN0cyB7e3RpdGxlfX0gY29tcGF0aWJsZSB3aXRoIHRoZSByZWxlYXNlIHNlbGVjdGVkIGZvciB0aGlzIHByb2plY3QsIHdoaWNoIGlzIHt7cHJvamVjdC5yZWxlYXNlLmRlc2NyaXB0aW9ufX0iPjwvaT4KKyAgeyUgZW5kaWYgJX0KKzwvaDI+CisKK3slIHVybCB0YWJsZV9uYW1lIHByb2plY3QuaWQgYXMgeGhyX3RhYmxlX3VybCAlfQoreyUgaW5jbHVkZSAidG9hc3RlcnRhYmxlLmh0bWwiICV9CisKK3slIGVuZGJsb2NrICV9CmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL2ltcG9ydGxheWVyLmh0bWwgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL2ltcG9ydGxheWVyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UzZDcyNAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvaW1wb3J0bGF5ZXIuaHRtbApAQCAtMCwwICsxLDEzOCBAQAoreyUgZXh0ZW5kcyAiYmFzZS5odG1sIiAlfQoreyUgbG9hZCBwcm9qZWN0dGFncyAlfQoreyUgbG9hZCBodW1hbml6ZSAlfQoreyUgbG9hZCBzdGF0aWMgJX0KK3slIGJsb2NrIHBhZ2Vjb250ZW50ICV9CisKK3slIGluY2x1ZGUgInByb2plY3R0b3BiYXIuaHRtbCIgJX0KKworCisgICAgICAgIHslIGlmIHByb2plY3QgYW5kIHByb2plY3QucmVsZWFzZSAlfQorICAgICAgICAgICAgICAgICAgPHNjcmlwdCBzcmM9InslIHN0YXRpYyAnanMvbGF5ZXJEZXBzTW9kYWwuanMnICV9Ij48L3NjcmlwdD4KKyAgICAgICAgICAgICAgICAgIDxzY3JpcHQgc3JjPSJ7JSBzdGF0aWMgJ2pzL2ltcG9ydGxheWVyLmpzJyAlfSI+PC9zY3JpcHQ+CisgICAgICAgICAgICAgICAgICA8c2NyaXB0PgorICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKXsKKyAgICAgICAgICAgICAgICAgICAgICB2YXIgY3R4ID0geworICAgICAgICAgICAgICAgICAgICAgICAgeGhySW1wb3J0TGF5ZXJVcmwgOiAieyUgdXJsICd4aHJfaW1wb3J0bGF5ZXInICV9IiwKKyAgICAgICAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydExheWVyUGFnZUluaXQoY3R4KTsKKyAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC53cml0ZSgiU29ycnksIEFuIGVycm9yIGhhcyBvY2N1cnJlZCBsb2FkaW5nIHRoaXMgcGFnZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGUpOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICA8L3NjcmlwdD4KKworICAgICAgICAgICAgICAgIDxmb3JtIGNsYXNzPSJzcGFuMTEiPgorICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldD4KKyAgICAgICAgICAgICAgICAgICAgICA8bGVnZW5kPkxheWVyIHJlcG9zaXRvcnkgaW5mb3JtYXRpb248L2xlZ2VuZD4KKyAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaGVscC1ibG9jayI+VGhlIGxheWVyIHlvdSBhcmUgaW1wb3J0aW5nIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIDxzdHJvbmc+e3twcm9qZWN0LnJlbGVhc2UuZGVzY3JpcHRpb259fTwvc3Ryb25nPiwgd2hpY2ggaXMgdGhlIHJlbGVhc2UgeW91IGFyZSB1c2luZyBpbiB0aGlzIHByb2plY3QuPC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LWVycm9yIiBpZD0iaW1wb3J0LWVycm9yIiBzdHlsZT0iZGlzcGxheTpub25lIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcz0iYWxlcnQiPiZ0aW1lczs8L2J1dHRvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxoMz4mbmJzcDs8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+PC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVsPjwvdWw+CisgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWdyb3VwIiBpZD0ibGF5ZXItbmFtZS1jdHJsIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iY29udHJvbC1sYWJlbCBhaXIiIGZvcj0iaW1wb3J0LWxheWVyLW5hbWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExheWVyIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaWNvbi1xdWVzdGlvbi1zaWduIGdldC1oZWxwIiB0aXRsZT0iU29tZXRoaW5nIGxpa2UgJ21ldGEtbXlsYXllcicuIFlvdXIgbGF5ZXIgbmFtZSBtdXN0IGJlIHVuaXF1ZSBhbmQgY2FuIG9ubHkgaW5jbHVkZSBsZXR0ZXJzLCBudW1iZXJzIGFuZCBkYXNoZXMiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9scyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iaW1wb3J0LWxheWVyLW5hbWUiIHR5cGU9InRleHQiIHJlcXVpcmVkIGF1dG9mb2N1cyBkYXRhLWF1dG9jb21wbGV0ZT0ib2ZmIiBkYXRhLXByb3ZpZGU9InR5cGVhaGVhZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJoZWxwLWlubGluZSIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7IiBpZD0iaW52YWxpZC1sYXllci1uYW1lLWhpbnQiPkEgdmFsaWQgbGF5ZXIgbmFtZSBjYW4gb25seSBpbmNsdWRlIGxldHRlcnMsIG51bWJlcnMgYW5kIGRhc2hlczwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImhlbHAtaW5saW5lIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiIGlkPSJkdXBsaWNhdGVkLWxheWVyLW5hbWUtaGludCI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJkdXBsaWNhdGUtbGF5ZXItaW5mbyIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhbGVydCB3YXJuaW5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzPkEgbGF5ZXIgY2FsbGVkIDxhIGhyZWY9IiIgY2xhc3M9ImR1cC1sYXllci1saW5rIj48c3BhbiBjbGFzcz0iZHVwLWxheWVyLW5hbWUiPjwvc3Bhbj48L2E+IGFscmVhZHkgZXhpc3RzPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+TGF5ZXIgbmFtZXMgbXVzdCBiZSB1bnFpdWUuIFBsZWFzZSB1c2UgYSBkaWZmZXJlbnQgbGF5ZXIgbmFtZS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxkbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPGR0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSA8c3BhbiBjbGFzcz0iZHVwLWxheWVyLW5hbWUiPjwvc3Bhbj4gcmVwb3NpdG9yeSB1cmwgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kdD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPGRkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJkdXAtbGF5ZXItdmNzLXVybCI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RkPgorCisgICAgICAgICAgICAgICAgICAgICAgICAgIDxkdD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgPHNwYW4gY2xhc3M9ImR1cC1sYXllci1uYW1lIj48L3NwYW4+IHJldmlzaW9uIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZHQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iZHVwLWxheWVyLXJldmlzaW9uIj48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2RsPgorCisgICAgICAgICAgICAgICAgICAgICAgICA8cD48YSBocmVmPSIiIGNsYXNzPSJkdXAtbGF5ZXItbGluayI+VmlldyB0aGUgPHNwYW4gY2xhc3M9ImR1cC1sYXllci1uYW1lIj48L3NwYW4+IGxheWVyIGluZm9ybWF0aW9uPC9hPjwvcD4KKworICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmllbGRzLWFwYXJ0LWZyb20tbGF5ZXItbmFtZSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJsYXllci1naXQtcmVwby11cmwiIGNsYXNzPSJwcm9qZWN0LWZvcm0iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdpdCByZXBvc2l0b3J5IFVSTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpY29uLXF1ZXN0aW9uLXNpZ24gZ2V0LWhlbHAiIHRpdGxlPSJGZXRjaC9jbG9uZSBVUkwgb2YgdGhlIHJlcG9zaXRvcnkuIEN1cnJlbnRseSwgVG9hc3RlciBvbmx5IHN1cHBvcnRzIEdpdCByZXBvc2l0b3JpZXMuIiA+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KKworICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJsYXllci1naXQtcmVwby11cmwiIGNsYXNzPSJpbnB1dC14eGxhcmdlIiByZXF1aXJlZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0icHJvamVjdC1mb3JtIiBmb3I9ImxheWVyLXN1YmRpciI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwb3NpdG9yeSBzdWJkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibXV0ZWQiPihvcHRpb25hbCk8L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCIgdGl0bGU9IlN1YmRpcmVjdG9yeSB3aXRoaW4gdGhlIHJlcG9zaXRvcnkgd2hlcmUgdGhlIGxheWVyIGlzIGxvY2F0ZWQsIGlmIG5vdCBpbiB0aGUgcm9vdCAodXN1YWxseSBvbmx5IHVzZWQgaWYgdGhlIHJlcG9zaXRvcnkgY29udGFpbnMgbW9yZSB0aGFuIG9uZSBsYXllcikiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgIGlkPSJsYXllci1zdWJkaXIiPgorCisgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtZ3JvdXAiIGlkPSJsYXllci1yZXZpc2lvbi1jdHJsIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImNvbnRyb2wtbGFiZWwgcHJvamVjdC1mb3JtIiBmb3I9ImxheWVyLWdpdC1yZWYiPlJldmlzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaWNvbi1xdWVzdGlvbi1zaWduIGdldC1oZWxwIiB0aXRsZT0iWW91IGNhbiBwcm92aWRlIGEgR2l0IGJyYW5jaCwgYSB0YWcgb3IgYSBjb21taXQgU0hBIGFzIHRoZSByZXZpc2lvbiI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbHMiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJzcGFuMyIgaWQ9ImxheWVyLWdpdC1yZWYiIHJlcXVpcmVkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaGVscC1pbmxpbmUiIHN0eWxlPSJkaWFwbHk6bm9uZTsiIGlkPSJpbnZhbGlkLWxheWVyLXJldmlzaW9uLWhpbnQiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CisKKyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmllbGRzLWFwYXJ0LWZyb20tbGF5ZXItbmFtZSI+CisgICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iYWlyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsZWdlbmQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGF5ZXIgZGVwZW5kZW5jaWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im11dGVkIj4ob3B0aW9uYWwpPC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpY29uLXF1ZXN0aW9uLXNpZ24gZ2V0LWhlbHAgaGVhZGluZy1oZWxwIiB0aXRsZT0iT3RoZXIgbGF5ZXJzIHRoaXMgbGF5ZXIgZGVwZW5kcyB1cG9uIj48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xlZ2VuZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0idW5zdHlsZWQgY29uZmlndXJhdGlvbi1saXN0IiBpZD0ibGF5ZXItZGVwcy1saXN0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1hcHBlbmQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBhdXRvY29tcGxldGU9Im9mZiIgZGF0YS1taW5MZW5ndGg9IjEiIGRhdGEtYXV0b2NvbXBsZXRlPSJvZmYiIGRhdGEtcHJvdmlkZT0idHlwZWFoZWFkIiBwbGFjZWhvbGRlcj0iVHlwZSBhIGxheWVyIG5hbWUiIGlkPSJsYXllci1kZXBlbmRlbmN5IiBjbGFzcz0iaW5wdXQteGxhcmdlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnRuIiBpZD0iYWRkLWxheWVyLWRlcGVuZGVuY3ktYnRuIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkIGxheWVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaGVscC1pbmxpbmUiPllvdSBjYW4gb25seSBhZGQgbGF5ZXJzIFRvYXN0ZXIga25vd3MgYWJvdXQ8L3NwYW4+CisgICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFpciIgaWQ9ImZvcm0tYWN0aW9ucyI+CisgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IGJ0bi1sYXJnZSIgZGF0YS10b2dnbGU9Im1vZGFsIiBpZD0iaW1wb3J0LWFuZC1hZGQtYnRuIiBkYXRhLXRhcmdldD0iI2RlcGVuZGVuY2llcy1tZXNzYWdlIiBkaXNhYmxlZD5JbXBvcnQgYW5kIGFkZCB0byBwcm9qZWN0PC9idXR0b24+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaGVscC1pbmxpbmUiIGlkPSJpbXBvcnQtYW5kLWFkZC1oaW50IiBzdHlsZT0idmVydGljYWwtYWxpZ246IG1pZGRsZTsiPlRvIGltcG9ydCBhIGxheWVyIHlvdSBuZWVkIHRvIGVudGVyIGEgbGF5ZXIgbmFtZSwgYSBHaXQgcmVwb3NpdG9yeSBVUkwgYW5kIGEgcmV2aXNpb24gKGJyYW5jaCwgdGFnIG9yIGNvbW1pdCk8L3NwYW4+CisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICA8L2Zvcm0+CisKKyAgICAgICAgICB7JSBlbHNlICV9IHsjcHJvamVjdCBhbmQgcHJvamVjdCByZWxlYXNlI30KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLWhlYWRlciI+CisgICAgICAgICAgICAgICAgICAgIDxoMT5JbXBvcnQgbGF5ZXI8L2gxPgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LWluZm8iIGlkPSJpbXBvcnQtZXJyb3IiID4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5VbnN1cHBvcnRlZCBwcm9qZWN0IHR5cGU8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhpcyBwcm9qZWN0IGRvZXMgbm90IHN1cHBvcnQgaW1wb3J0aW5nIGxheWVycy48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWw+PC91bD4KKyAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgIHslIGVuZGlmICV9Cit7JSBlbmRibG9jayAlfQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9qcy11bml0LXRlc3RzLmh0bWwgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL2pzLXVuaXQtdGVzdHMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjhmZDg0Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9qcy11bml0LXRlc3RzLmh0bWwKQEAgLTAsMCArMSwzOSBAQAoreyUgZXh0ZW5kcyAiYmFzZS5odG1sIiAlfQoreyUgbG9hZCBwcm9qZWN0dGFncyAlfQoreyUgbG9hZCBodW1hbml6ZSAlfQoreyUgbG9hZCBzdGF0aWMgJX0KK3slIGJsb2NrIHBhZ2Vjb250ZW50ICV9CisKKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLy9jb2RlLmpxdWVyeS5jb20vcXVuaXQvcXVuaXQtMS4xOC4wLmNzcyIgLz4KKworPHNjcmlwdCBzcmM9Ii8vY29kZS5qcXVlcnkuY29tL3F1bml0L3F1bml0LTEuMTguMC5qcyI+PC9zY3JpcHQ+CisKKzxzY3JpcHQgc3JjPSJ7JSBzdGF0aWMgJ2pzL2xheWVyRGVwc01vZGFsLmpzJyAlfSI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ieyUgc3RhdGljICdqcy9wcm9qZWN0cGFnZS5qcycgJX0iPjwvc2NyaXB0PgorCis8c2NyaXB0IHNyYz0ieyUgc3RhdGljICdqcy9ib290c3RyYXAubWluLmpzJyAlfSI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ieyUgc3RhdGljICdqcy9maWx0ZXJzbmlwcGV0LmpzJyAlfSI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ieyUgc3RhdGljICdqcy9pbXBvcnRsYXllci5qcycgJX0iPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InslIHN0YXRpYyAnanMvcHJldHRpZnkuanMnICV9Ij48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJ7JSBzdGF0aWMgJ2pzL2xheWVyQnRuLmpzJyAlfSI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ieyUgc3RhdGljICdqcy9sYXllckRlcHNNb2RhbC5qcycgJX0iPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InslIHN0YXRpYyAnanMvcHJvamVjdHBhZ2UuanMnICV9Ij48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJ7JSBzdGF0aWMgJ2pzL2xheWVyZGV0YWlscy5qcycgJX0iPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InslIHN0YXRpYyAnanMvdGFibGUuanMnICV9Ij48L3NjcmlwdD4KKworPHNjcmlwdD4KKyAgdmFyIHRhYmxlVXJsID0gJ3slIHVybCAncHJvamVjdGxheWVycycgcHJvamVjdC5wayAlfSc7Cis8L3NjcmlwdD4KKworPHNjcmlwdCBzcmM9InslIHN0YXRpYyAnanMvdGVzdHMvdGVzdC5qcycgJX0iPjwvc2NyaXB0PgorCis8ZGl2IGlkPSJxdW5pdCI+PC9kaXY+CisKKzxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0ibGF5ZXJzIiBwbGFjZWhvbGRlcj0ibGF5ZXJzIiA+PC9pbnB1dD4KKzxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icmVjaXBlcyIgcGxhY2Vob2xkZXI9InJlY2lwZXMiPjwvaW5wdXQ+Cis8aW5wdXQgdHlwZT0idGV4dCIgaWQ9InByb2plY3RzIiBwbGFjZWhvbGRlcj0icHJvamVjdHMiPjwvaW5wdXQ+Cis8aW5wdXQgdHlwZT0idGV4dCIgaWQ9Im1hY2hpbmVzIiBwbGFjZWhvbGRlcj0ibWFjaGluZXMiPjwvaW5wdXQ+CisKK3slIGVuZGJsb2NrICV9CisKKwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9sYW5kaW5nLmh0bWwgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL2xhbmRpbmcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWU5NTMyCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9sYW5kaW5nLmh0bWwKQEAgLTAsMCArMSw1OCBAQAoreyUgZXh0ZW5kcyAiYmFzZS5odG1sIiAlfQorCit7JSBsb2FkIHN0YXRpYyAlfQoreyUgbG9hZCBwcm9qZWN0dGFncyAlfQoreyUgbG9hZCBodW1hbml6ZSAlfQorCit7JSBibG9jayBwYWdlY29udGVudCAlfQorCisgIDxkaXYgY2xhc3M9ImNvbnRhaW5lci1mbHVpZCI+CisgICA8ZGl2IGNsYXNzPSJyb3ctZmx1aWQiPgorICAgIDwhLS0gRW1wdHkgLSBubyBkYXRhIGluIGRhdGFiYXNlIC0tPgorICAgIDxkaXYgY2xhc3M9Imhlcm8tdW5pdCBzcGFuMTIgd2VsbC10cmFuc3BhcmVudCI+CisgICAgIDxkaXYgY2xhc3M9InJvdy1mbHVpZCI+CisgICAgICA8ZGl2IGNsYXNzPSJzcGFuNiI+CisgICAgICAgPGgxPgorICAgICAgICBUaGlzIGlzIFRvYXN0ZXIKKyAgICAgICA8L2gxPgorICAgICAgIDxwPkEgd2ViIGludGVyZmFjZSB0byA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5lbWJlZGRlZC5vcmciPk9wZW5FbWJlZGRlZDwvYT4gYW5kIDxhIGhyZWY9Imh0dHA6Ly93d3cueW9jdG9wcm9qZWN0Lm9yZy90b29scy1yZXNvdXJjZXMvcHJvamVjdHMvYml0YmFrZSI+Qml0QmFrZTwvYT4sIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LnlvY3RvcHJvamVjdC5vcmciPllvY3RvIFByb2plY3Q8L2E+IGJ1aWxkIHN5c3RlbS48L3A+CisKKworCQl7JSBpZiBsdnNfbm9zICV9CisJCSAgICA8cCBjbGFzcz0iaGVyby1hY3Rpb25zIj4KKwkJCSAgICA8YSBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IGJ0bi1sYXJnZSIgaHJlZj0ieyUgdXJsICduZXdwcm9qZWN0JyAlfSI+CisJCQkJICAgIFRvIHN0YXJ0IGJ1aWxkaW5nLCBjcmVhdGUgeW91ciBmaXJzdCBUb2FzdGVyIHByb2plY3QKKwkJCSAgICA8L2E+CisJCSAgICA8L3A+CisJCXslIGVsc2UgJX0KKwkJICAgIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LWluZm8gbGVhZCBhaXIiPgorCQkJICAgIFRvYXN0ZXIgaGFzIG5vIGxheWVyIGluZm9ybWF0aW9uLiBXaXRob3V0IGxheWVyIGluZm9ybWF0aW9uLCB5b3UgY2Fubm90IHJ1biBidWlsZHMuIFRvIGdlbmVyYXRlIGxheWVyIGluZm9ybWF0aW9uIHlvdSBjYW46CisJCQkgICAgPHVsPgorCQkJICAgICAgICA8bGk+CisJCQkgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LnlvY3RvcHJvamVjdC5vcmcvZG9jcy9sYXRlc3QvdG9hc3Rlci1tYW51YWwvdG9hc3Rlci1tYW51YWwuaHRtbCNsYXllci1zb3VyY2UiPkNvbmZpZ3VyZSBhIGxheWVyIHNvdXJjZTwvYT4KKwkJCSAgICAgICAgPC9saT4KKwkJCSAgICAgICAgPGxpPgorCQkJICAgICAgICAgICAgPGEgaHJlZj0ieyUgdXJsICduZXdwcm9qZWN0JyAlfSI+Q3JlYXRlIGEgcHJvamVjdDwvYT4sIHRoZW4gaW1wb3J0IGxheWVycworCQkJICAgICAgICA8L2xpPgorCQkJICAgIDwvdWw+CisJCSAgICA8L2Rpdj4KKwkgICAgICAgIHslIGVuZGlmICV9CisKKyAgICAgICAgPHVsIGNsYXNzPSJ1bnN0eWxlZCI+CisgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy55b2N0b3Byb2plY3Qub3JnL2RvY3MvbGF0ZXN0L3RvYXN0ZXItbWFudWFsL3RvYXN0ZXItbWFudWFsLmh0bWwiPlJlYWQgdGhlIFRvYXN0ZXIgbWFudWFsPC9hPgorICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3dpa2kueW9jdG9wcm9qZWN0Lm9yZy93aWtpL0NvbnRyaWJ1dGVfdG9fVG9hc3RlciI+Q29udHJpYnV0ZSB0byBUb2FzdGVyPC9hPgorICAgICAgICAgICAgPC9saT4KKyAgICAgICAgPC91bD4KKworICAgICAgPC9kaXY+CisgICAgICA8ZGl2IGNsYXNzPSJzcGFuNiI+CisgICAgICAgICAgPGltZyBhbHQ9IllvY3RvIFByb2plY3QiIGNsYXNzPSJ0aHVtYm5haWwiIHNyYz0ieyUgc3RhdGljICdpbWcvdG9hc3Rlcl9idy5wbmcnICV9Ii8+CisgICAgICA8L2Rpdj4KKyAgICAgPC9kaXY+CisgICAgPC9kaXY+CisgICA8L2Rpdj4KKworeyUgZW5kYmxvY2sgJX0KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvbGFuZGluZ19ub3RfbWFuYWdlZC5odG1sIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9sYW5kaW5nX25vdF9tYW5hZ2VkLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJjNDM1ZAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvbGFuZGluZ19ub3RfbWFuYWdlZC5odG1sCkBAIC0wLDAgKzEsMzIgQEAKK3slIGV4dGVuZHMgImJhc2UuaHRtbCIgJX0KKworeyUgbG9hZCBzdGF0aWMgJX0KK3slIGxvYWQgcHJvamVjdHRhZ3MgJX0KK3slIGxvYWQgaHVtYW5pemUgJX0KKworeyUgYmxvY2sgcGFnZWNvbnRlbnQgJX0KKworICA8ZGl2IGNsYXNzPSJjb250YWluZXItZmx1aWQiPgorICAgPGRpdiBjbGFzcz0icm93LWZsdWlkIj4KKyAgICA8IS0tIEVtcHR5IC0gbm8gYnVpbGQgbW9kdWxlIC0tPgorICAgIDxkaXYgY2xhc3M9InBhZ2UtaGVhZGVyIHRvcC1haXIiPgorICAgICA8aDE+CisgICAgICAgVGhpcyBwYWdlIG9ubHkgd29ya3Mgd2l0aCBUb2FzdGVyIGluICdCdWlsZCcgbW9kZQorICAgICA8L2gxPgorICAgIDwvZGl2PgorICAgIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LWluZm8gbGVhZCI+CisgICAgIDxwIj4KKyAgICAgVGhlICdCdWlsZCcgbW9kZSBhbGxvd3MgeW91IHRvIGNvbmZpZ3VyZSBhbmQgcnVuIHlvdXIgWW9jdG8gUHJvamVjdCBidWlsZHMgZnJvbSBUb2FzdGVyLgorICAgICA8dWw+CisgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cueW9jdG9wcm9qZWN0Lm9yZy9kb2NzL2xhdGVzdC90b2FzdGVyLW1hbnVhbC90b2FzdGVyLW1hbnVhbC5odG1sI2ludHJvLW1vZGVzIj4KKyAgICAgICBSZWFkIGFib3V0IHRoZSAnQnVpbGQnIG1vZGUKKyAgICAgICA8L2E+PC9saT4KKyAgICAgICA8bGk+PGEgaHJlZj0iLyI+CisgICAgICAgVmlldyB5b3VyIGJ1aWxkcworICAgICAgIDwvYT48L2xpPgorICAgICA8L3VsPgorICAgICA8L3A+CisgICAgPC9kaXY+CisgICA8L2Rpdj4KKworeyUgZW5kYmxvY2sgJX0KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvbGF5ZXJfYnRuLmh0bWwgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL2xheWVyX2J0bi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZTkzOTMKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL2xheWVyX2J0bi5odG1sCkBAIC0wLDAgKzEsOSBAQAorPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1kYW5nZXIgYnRuLWJsb2NrIGxheWVyLWV4aXN0cy17e2RhdGEucGt9fSBsYXllcmJ0biIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiIGRhdGEtbGF5ZXI9J3sgImlkIjoge3tkYXRhLnBrfX0sICJuYW1lIjogICJ7e2RhdGEubGF5ZXIubmFtZX19IiwgImxheWVyZGV0YWlsdXJsIjogInsldXJsICdsYXllcmRldGFpbHMnIGV4dHJhLnBpZCBkYXRhLnBrJX0ifScgZGF0YS1kaXJlY3RpdmU9InJlbW92ZSIgPgorICA8aSBjbGFzcz0iaWNvbi10cmFzaCI+PC9pPgorICBEZWxldGUgbGF5ZXIKKzwvYnV0dG9uPgorPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1ibG9jayBsYXllci1hZGQte3tkYXRhLnBrfX0gbGF5ZXJidG4iIGRhdGEtbGF5ZXI9J3sgImlkIjoge3tkYXRhLnBrfX0sICJuYW1lIjogICJ7e2RhdGEubGF5ZXIubmFtZX19IiwgImxheWVyZGV0YWlsdXJsIjogInsldXJsICdsYXllcmRldGFpbHMnIGV4dHJhLnBpZCBkYXRhLnBrJX0ifScgZGF0YS1kaXJlY3RpdmU9ImFkZCI+CisgIDxpIGNsYXNzPSJpY29uLXBsdXMiPjwvaT4KKyAgQWRkIGxheWVyCis8L2J1dHRvbj4KKwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9sYXllcmRldGFpbHMuaHRtbCBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvbGF5ZXJkZXRhaWxzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RkM2RiMgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvbGF5ZXJkZXRhaWxzLmh0bWwKQEAgLTAsMCArMSwyNzYgQEAKK3slIGV4dGVuZHMgImJhc2UuaHRtbCIgJX0KK3slIGxvYWQgcHJvamVjdHRhZ3MgJX0KK3slIGxvYWQgaHVtYW5pemUgJX0KK3slIGxvYWQgc3RhdGljICV9CisKK3slIGJsb2NrIHBhZ2Vjb250ZW50ICV9CisKKzxkaXYgY2xhc3M9InNlY3Rpb24iPgorICA8dWwgY2xhc3M9ImJyZWFkY3J1bWIiPgorICAgIDxsaSBjbGFzcz0ibXV0ZWQiPnt7cHJvamVjdC5uYW1lfX06PC9saT4KKyAgICA8bGk+CisgICAgICA8YSBocmVmPSJ7JSB1cmwgJ3Byb2plY3QnIHByb2plY3QuaWQgJX0iPkNvbmZpZ3VyYXRpb248L2E+CisgICAgICA8c3BhbiBjbGFzcz0iZGl2aWRlciI+JnJhcnI7PC9zcGFuPgorICAgIDwvbGk+CisgICAgPGxpPjxhIGhyZWY9InslIHVybCAncHJvamVjdGxheWVycycgcHJvamVjdC5pZCAlfSI+Q29tcGF0aWJsZSBsYXllcnM8L2E+CisgICAgICA8c3BhbiBjbGFzcz0iZGl2aWRlciI+JnJhcnI7PC9zcGFuPgorICAgIDwvbGk+CisgICAgPGxpIGNsYXNzPSJhY3RpdmUiPgorICAgICAge3tsYXllcnZlcnNpb24ubGF5ZXIubmFtZX19ICh7e2xheWVydmVyc2lvbi5nZXRfdmNzX3JlZmVyZW5jZXx0cnVuY2F0ZWNoYXJzOjEzfX0pCisgICAgPC9saT4KKyAgPC91bD4KKzwvZGl2PgorCit7IyBJZiB0aGlzIGlzIG5vdCBhbiBpbXBvcnRlZCBsYXllciB0aGVuIGhpZGUgdGhlIGVkaXQgdWkgI30KK3slIGlmIG5vdCBsYXllcnZlcnNpb24ubGF5ZXJfc291cmNlX2lkIG9yIGxheWVydmVyc2lvbi5sYXllcl9zb3VyY2Uuc291cmNldHlwZSAhPSBsYXllcnZlcnNpb24ubGF5ZXJfc291cmNlLlRZUEVfSU1QT1JURUQgJX0KKzxzdHlsZSBzY29wZWQ+CisgLmljb24tcGVuY2lsIHsKKyAgIGRpc3BsYXk6bm9uZTsKKyB9CisuZGVsZXRlLWN1cnJlbnQtdmFsdWV7CisgIGRpc3BsYXk6IG5vbmU7Cit9CisgbGkgLmljb24tdHJhc2ggeworICAgZGlzcGxheTpub25lOworIH0KKyAuYWRkLWRlcHMgeworICAgZGlzcGxheTpub25lOworIH0KKzwvc3R5bGU+Cit7JSBlbmRpZiAlfQorCisKKzxzY3JpcHQgc3JjPSJ7JSBzdGF0aWMgJ2pzL2xheWVyZGV0YWlscy5qcycgJX0iPjwvc2NyaXB0PgorPHNjcmlwdD4KKworICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKXsKKyAgICB2YXIgY3R4ID0geworICAgICAgcHJvamVjdEJ1aWxkc1VybCA6ICJ7JSB1cmwgJ3Byb2plY3RidWlsZHMnIHByb2plY3QuaWQgJX0iLAorICAgICAgeGhyVXBkYXRlTGF5ZXJVcmwgOiAieyUgdXJsICd4aHJfdXBkYXRlbGF5ZXInICV9IiwKKyAgICAgIGxheWVyVmVyc2lvbiA6IHsKKyAgICAgICAgbmFtZSA6ICJ7e2xheWVydmVyc2lvbi5sYXllci5uYW1lfX0iLAorICAgICAgICBpZCA6IHt7bGF5ZXJ2ZXJzaW9uLmlkfX0sCisgICAgICAgIGNvbW1pdDogInt7bGF5ZXJ2ZXJzaW9uLmdldF92Y3NfcmVmZXJlbmNlfX0iLAorICAgICAgeyVpZiBsYXllcnZlcnNpb24uaWQgaW4gcHJvamVjdGxheWVycyAlfQorICAgICAgICBpbkN1cnJlbnRQcmogOiB0cnVlLAorICAgICAgeyUgZWxzZSAlfQorICAgICAgICBpbkN1cnJlbnRQcmogOiBmYWxzZSwKKyAgICAgIHslIGVuZGlmICV9CisgICAgICAgIGxheWVyZGV0YWlsdXJsIDogInslIHVybCAnbGF5ZXJkZXRhaWxzJyBwcm9qZWN0LmlkIGxheWVydmVyc2lvbi5pZCAgJX0iLAorICAgICAgICBzb3VyY2VJZDoge3tsYXllcnZlcnNpb24ubGF5ZXJfc291cmNlX2lkfGpzb259fSwKKyAgICAgIH0KKyAgICB9OworCisgICAgdHJ5IHsKKyAgICAgIGxheWVyRGV0YWlsc1BhZ2VJbml0KGN0eCk7CisgICAgfSBjYXRjaCAoZSkgeworICAgICAgZG9jdW1lbnQud3JpdGUoIlNvcnJ5LCBBbiBlcnJvciBoYXMgb2NjdXJyZWQgbG9hZGluZyB0aGlzIHBhZ2UiKTsKKyAgICAgIGNvbnNvbGUud2FybihlKTsKKyAgICB9CisgIH0pOworPC9zY3JpcHQ+CisKKzxkaXYgY2xhc3M9InJvdy1mbHVpZCBzcGFuMTEiPgorICA8ZGl2IGNsYXNzPSJwYWdlLWhlYWRlciI+CisgICAgPGgxPnt7bGF5ZXJ2ZXJzaW9uLmxheWVyLm5hbWV9fSA8c21hbGwgY2xhc3M9ImNvbW1pdCIKKyAgICAgICAgICB7JSBpZiBsYXllcnZlcnNpb24uZ2V0X3Zjc19yZWZlcmVuY2V8bGVuZ3RoID4gMTMgJX0KKyAgICAgICAgZGF0YS10b2dnbGU9InRvb2x0aXAiIHRpdGxlPSJ7e2xheWVydmVyc2lvbi5nZXRfdmNzX3JlZmVyZW5jZX19IgorICAgICAgICB7JSBlbmRpZiAlfT4KKyAgICAgICAgKHt7bGF5ZXJ2ZXJzaW9uLmdldF92Y3NfcmVmZXJlbmNlfHRydW5jYXRlY2hhcnM6MTN9fSk8L3NtYWxsPjwvaDE+CisgIDwvZGl2PgorPC9kaXY+CisKKzwhLS0gY29udGFpbmVyIGZvciB0YWJzIC0tPgorPGRpdiBjbGFzcz0icm93LWZsdWlkIHNwYW43IHRhYmJhYmxlIj4KKyAgPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtaW5mbyBsZWFkIiBpZD0iYWxlcnQtYXJlYSIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+CisgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgaWQ9ImRpc21pc3MtYWxlcnQiPiZ0aW1lczs8L2J1dHRvbj4KKyAgICA8c3BhbiBpZD0iYWxlcnQtbXNnIj48L3NwYW4+CisgIDwvZGl2PgorICA8dWwgY2xhc3M9Im5hdiBuYXYtcGlsbHMiPgorICAgIDxsaSBjbGFzcz0iYWN0aXZlIj4KKyAgICAgIDxhIGRhdGEtdG9nZ2xlPSJ0YWIiIGhyZWY9IiNpbmZvcm1hdGlvbiIgaWQ9ImRldGFpbHMtdGFiIj5MYXllciBkZXRhaWxzPC9hPgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgPGEgZGF0YS10b2dnbGU9InRhYiIgaHJlZj0iI3JlY2lwZXMiIGNsYXNzPSJtdXRlZCIgaWQ9InRhcmdldHMtdGFiIj5SZWNpcGVzICg8c3BhbiBjbGFzcz0idGFibGUtY291bnQtcmVjaXBlc3RhYmxlIj48L3NwYW4+KTwvYT4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgIDxhIGRhdGEtdG9nZ2xlPSJ0YWIiIGhyZWY9IiNtYWNoaW5lcyIgY2xhc3M9Im11dGVkIiBpZD0ibWFjaGluZXMtdGFiIj5NYWNoaW5lcyAoPHNwYW4gY2xhc3M9InRhYmxlLWNvdW50LW1hY2hpbmVzdGFibGUiPjwvc3Bhbj4pPC9hPgorICAgIDwvbGk+CisgIDwvdWw+CisgIDxkaXYgY2xhc3M9InRhYi1jb250ZW50Ij4KKyAgICA8c3BhbiBjbGFzcz0iYnV0dG9uLXBsYWNlIj4KKyAgICAgIHslIGlmIGxheWVydmVyc2lvbi5pZCBub3QgaW4gcHJvamVjdGxheWVycyAlfQorICAgICAgPGJ1dHRvbiBpZD0iYWRkLXJlbW92ZS1sYXllci1idG4iIGRhdGEtZGlyZWN0aXZlPSJhZGQiIGNsYXNzPSJidG4gYnRuLWxhcmdlIGJ0bi1ibG9jayI+CisgICAgICAgIDxzcGFuIGNsYXNzPSJpY29uLXBsdXMiPjwvc3Bhbj4KKyAgICAgICAgQWRkIHRoZSB7e2xheWVydmVyc2lvbi5sYXllci5uYW1lfX0gbGF5ZXIgdG8geW91ciBwcm9qZWN0CisgICAgICA8L2J1dHRvbj4KKyAgICAgIHslIGVsc2UgJX0KKyAgICAgIDxidXR0b24gaWQ9ImFkZC1yZW1vdmUtbGF5ZXItYnRuIiBkYXRhLWRpcmVjdGl2ZT0icmVtb3ZlIiBjbGFzcz0iYnRuIGJ0bi1ibG9jayBidG4tbGFyZ2UgYnRuLWRhbmdlciI+CisgICAgICAgIDxzcGFuIGNsYXNzPSJpY29uLXRyYXNoIj48L3NwYW4+CisgICAgICAgIERlbGV0ZSB0aGUge3tsYXllcnZlcnNpb24ubGF5ZXIubmFtZX19IGxheWVyIGZyb20geW91ciBwcm9qZWN0CisgICAgICA8L2J1dHRvbj4KKyAgICAgIHslIGVuZGlmICV9CisgICAgPC9zcGFuPgorCisgICAgPCEtLSBsYXllciBkZXRhaWxzIHBhbmUgLS0+CisgICAgPGRpdiBpZD0iaW5mb3JtYXRpb24iIGNsYXNzPSJ0YWItcGFuZSBhY3RpdmUiPgorICAgICAgPGRsIGNsYXNzPSJkbC1ob3Jpem9udGFsIj4KKyAgICAgICAgPGR0IGNsYXNzPSIiPgorICAgICAgICAgIDxpIGNsYXNzPSJpY29uLXF1ZXN0aW9uLXNpZ24gZ2V0LWhlbHAiIHRpdGxlPSJGZXRjaC9jbG9uZSBVUkwgb2YgdGhlIHJlcG9zaXRvcnkiPjwvaT4KKyAgICAgICAgICBSZXBvc2l0b3J5IFVSTAorICAgICAgICA8L2R0PgorICAgICAgICA8ZGQ+CisgICAgICAgICAgPHNwYW4gY2xhc3M9ImN1cnJlbnQtdmFsdWUiPnt7bGF5ZXJ2ZXJzaW9uLmxheWVyLnZjc191cmx9fTwvc3Bhbj4KKyAgICAgICAgICB7JSBpZiBsYXllcnZlcnNpb24uZ2V0X3Zjc19saW5rX3VybCAlfQorICAgICAgICAgIDxhIGhyZWY9Int7bGF5ZXJ2ZXJzaW9uLmdldF92Y3NfbGlua191cmx9fS8iIGNsYXNzPSJpY29uLXNoYXJlIGdldC1pbmZvIiB0YXJnZXQ9Il9ibGFuayI+PC9hPgorICAgICAgICAgIHslIGVuZGlmICV9CisgICAgICAgICAgPGZvcm0gaWQ9ImNoYW5nZS1yZXBvLWZvcm0iIGNsYXNzPSJjb250cm9sLWdyb3VwIiBzdHlsZT0iZGlzcGxheTpub25lIj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWFwcGVuZCI+CisgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iaW5wdXQteGxhcmdlIiB2YWx1ZT0ie3tsYXllcnZlcnNpb24ubGF5ZXIudmNzX3VybH19Ij4KKyAgICAgICAgICAgICAgICA8YnV0dG9uIGRhdGEtbGF5ZXItcHJvcD0idmNzX3VybCIgY2xhc3M9ImJ0biBjaGFuZ2UtYnRuIiB0eXBlPSJidXR0b24iPlNhdmU8L2J1dHRvbj4KKyAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBzdHlsZT0iZGlzcGxheTpub25lIiBjbGFzcz0iYnRuIGJ0bi1saW5rIGNhbmNlbCI+Q2FuY2VsPC9hPgorICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDwvZm9ybT4KKyAgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLXBlbmNpbCIgPjwvaT4KKyAgICAgICAgICA8L2RkPgorICAgICAgICAgIDxkdD4KKyAgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLXF1ZXN0aW9uLXNpZ24gZ2V0LWhlbHAiIHRpdGxlPSJTdWJkaXJlY3Rvcnkgd2l0aGluIHRoZSByZXBvc2l0b3J5IHdoZXJlIHRoZSBsYXllciBpcyBsb2NhdGVkLCBpZiBub3QgaW4gdGhlIHJvb3QgKHVzdWFsbHkgb25seSB1c2VkIGlmIHRoZSByZXBvc2l0b3J5IGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgbGF5ZXIpIj48L2k+CisgICAgICAgICAgICBSZXBvc2l0b3J5IHN1YmRpcmVjdG9yeQorICAgICAgICAgIDwvZHQ+CisgICAgICAgICAgPGRkPgorICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im11dGVkIiBzdHlsZT0iZGlzcGxheTpub25lIj5Ob3Qgc2V0PC9zcGFuPgorICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImN1cnJlbnQtdmFsdWUiPnt7bGF5ZXJ2ZXJzaW9uLmRpcnBhdGh9fTwvc3Bhbj4KKyAgICAgICAgICAgIHslIGlmIGxheWVydmVyc2lvbi5nZXRfdmNzX2RpcnBhdGhfbGlua191cmwgJX0KKyAgICAgICAgICAgIDxhIGhyZWY9Int7bGF5ZXJ2ZXJzaW9uLmdldF92Y3NfZGlycGF0aF9saW5rX3VybH19IiBjbGFzcz0iaWNvbi1zaGFyZSBnZXQtaW5mbyIgdGFyZ2V0PSJfYmxhbmsiPjwvYT4KKyAgICAgICAgICAgIHslIGVuZGlmICV9CisgICAgICAgICAgICA8Zm9ybSBpZD0iY2hhbmdlLXN1YmRpci1mb3JtIiBzdHlsZT0iZGlzcGxheTpub25lOyI+CisgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWFwcGVuZCI+CisgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIHZhbHVlPSJ7e2xheWVydmVyc2lvbi5kaXJwYXRofX0iPgorICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWxheWVyLXByb3A9ImRpcnBhdGgiIGNsYXNzPSJidG4gY2hhbmdlLWJ0biIgdHlwZT0iYnV0dG9uIj5TYXZlPC9idXR0b24+CisgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBzdHlsZT0iZGlzcGxheTpub25lIiBjbGFzcz0iYnRuIGJ0bi1saW5rIGNhbmNlbCI+Q2FuY2VsPC9hPgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICA8L2Zvcm0+CisgICAgICAgICAgICAgIDxpIGlkPSJjaGFuZ2Utc3ViZGlyIiBjbGFzcz0iaWNvbi1wZW5jaWwiPjwvaT4KKyAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Imljb24tdHJhc2ggZGVsZXRlLWN1cnJlbnQtdmFsdWUiIGRhdGEtdG9nZ2xlPSJ0b29sdGlwIiB0aXRsZT0iRGVsZXRlIj48L3NwYW4+CisgICAgICAgICAgICA8L2RkPgorICAgICAgICAgICAgPGR0PgorICAgICAgICAgICAgICA8aSBjbGFzcz0iaWNvbi1xdWVzdGlvbi1zaWduIGdldC1oZWxwIiB0aXRsZT0iVGhlIEdpdCBicmFuY2gsIHRhZyBvciBjb21taXQiPjwvaT4KKyAgICAgICAgICAgICAgUmV2aXNpb24KKyAgICAgICAgICAgIDwvZHQ+CisgICAgICAgICAgICA8ZGQ+CisgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjdXJyZW50LXZhbHVlIj57e2xheWVydmVyc2lvbi5nZXRfdmNzX3JlZmVyZW5jZX19PC9zcGFuPgorICAgICAgICAgICAgICA8Zm9ybSBzdHlsZT0iZGlzcGxheTpub25lOyI+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtYXBwZW5kIj4KKyAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiB2YWx1ZT0ie3tsYXllcnZlcnNpb24uZ2V0X3Zjc19yZWZlcmVuY2V9fSI+CisgICAgICAgICAgICAgICAgICAgIDxidXR0b24gIGRhdGEtbGF5ZXItcHJvcD0iY29tbWl0IiBjbGFzcz0iYnRuIGNoYW5nZS1idG4iIHR5cGU9ImJ1dHRvbiI+U2F2ZTwvYnV0dG9uPgorICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBzdHlsZT0iZGlzcGxheTpub25lIiBjbGFzcz0iYnRuIGJ0bi1saW5rIGNhbmNlbCI+Q2FuY2VsPC9hPgorICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPC9mb3JtPgorICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLXBlbmNpbCI+PC9pPgorICAgICAgICAgICAgICA8L2RkPgorICAgICAgICAgICAgICA8ZHQ+CisgICAgICAgICAgICAgICAgPGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCIgdGl0bGU9Ik90aGVyIGxheWVycyB0aGlzIGxheWVyIGRlcGVuZHMgdXBvbiI+PC9pPgorICAgICAgICAgICAgICAgIExheWVyIGRlcGVuZGVuY2llcworICAgICAgICAgICAgICA8L2R0PgorICAgICAgICAgICAgICA8ZGQ+CisgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJ1bnN0eWxlZCBjdXJyZW50LXZhbHVlIiBpZD0ibGF5ZXItZGVwcy1saXN0Ij4KKyAgICAgICAgICAgICAgICAgIHslIGZvciBsZCBpbiBsYXllcnZlcnNpb24uZGVwZW5kZW5jaWVzLmFsbCAlfQorICAgICAgICAgICAgICAgICAgPGxpIGRhdGEtbGF5ZXItaWQ9Int7bGQuZGVwZW5kc19vbi5pZH19Ij4KKyAgICAgICAgICAgICAgICAgICAgPGEgZGF0YS10b2dnbGU9InRvb2x0aXAiIHRpdGxlPSJ7e2xkLmRlcGVuZHNfb24ubGF5ZXIudmNzX3VybH19IHwge3tsZC5kZXBlbmRzX29uLmdldF92Y3NfcmVmZXJlbmNlfX0iIGhyZWY9InslIHVybCAnbGF5ZXJkZXRhaWxzJyBwcm9qZWN0LmlkIGxkLmRlcGVuZHNfb24uaWQgJX0iPnt7bGQuZGVwZW5kc19vbi5sYXllci5uYW1lfX08L2E+CisgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpY29uLXRyYXNoICIgZGF0YS10b2dnbGU9InRvb2x0aXAiIHRpdGxlPSJEZWxldGUiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICB7JSBlbmRmb3IgJX0KKyAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWFwcGVuZCBhZGQtZGVwcyI+CisgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgYXV0b2NvbXBsZXRlPSJvZmYiIGRhdGEtbWluTGVuZ3RoPSIxIiBkYXRhLWF1dG9jb21wbGV0ZT0ib2ZmIiAgcGxhY2Vob2xkZXI9IlR5cGUgYSBsYXllciBuYW1lIiBpZD0ibGF5ZXItZGVwLWlucHV0Ij4KKyAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9ImJ0biIgaWQ9ImFkZC1sYXllci1kZXBlbmRlbmN5LWJ0biIgPgorICAgICAgICAgICAgICAgICAgICAgIEFkZCBsYXllcgorICAgICAgICAgICAgICAgICAgICA8L2E+CisgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJoZWxwLWJsb2NrIGFkZC1kZXBzIj5Zb3UgY2FuIG9ubHkgYWRkIGxheWVycyBUb2FzdGVyIGtub3dzIGFib3V0PC9zcGFuPgorICAgICAgICAgICAgICAgIDwvZGQ+CisgICAgICAgICAgICAgIDwvZGw+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDwhLS0gZW5kIGxheWVyZGV0YWlscyB0YWIgLS0+CisgICAgICAgICAgICA8IS0tIHRhcmdldHMgdGFiIC0tPgorICAgICAgICAgICAgPGRpdiBpZD0icmVjaXBlcyIgY2xhc3M9InRhYi1wYW5lIj4KKyAgICAgICAgICAgICAgPCEtLSBSZWNpcGUgdGFibGUgLS0+CisgICAgICAgICAgICAgIDxkaXYgaWQ9Im5vLXJlY2lwZXMteWV0IiBjbGFzcz0iYWxlcnQgYWxlcnQtaW5mbyIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+CisgICAgICAgICAgICAgICAgPHA+VG9hc3RlciBkb2VzIG5vdCBoYXZlIHJlY2lwZSBpbmZvcm1hdGlvbiBmb3IgdGhlIDxzdHJvbmc+IHt7bGF5ZXJ2ZXJzaW9uLmxheWVyLm5hbWV9fSA8L3N0cm9uZz4gbGF5ZXIuPC9wPgorICAgICAgICAgICAgICAgIDxwPlRvYXN0ZXIgbGVhcm5zIGFib3V0IGxheWVycyB3aGVuIHlvdSBidWlsZCB0aGVtLiBJZiB0aGlzIGxheWVyIHByb3ZpZGVzIGFueSByZWNpcGVzLCB0aGV5IHdpbGwgYmUgbGlzdGVkIGhlcmUgYWZ0ZXIgeW91IGJ1aWxkIHRoZSA8c3Ryb25nPiB7e2xheWVydmVyc2lvbi5sYXllci5uYW1lfX0gPC9zdHJvbmc+IGxheWVyLjwvcD4KKyAgICAgICAgICAgICAgPC9kaXY+CisKKworCisgICAgICAgICAgICAgIHslIHVybCAnbGF5ZXJyZWNpcGVzdGFibGUnIHByb2plY3QuaWQgbGF5ZXJ2ZXJzaW9uLmlkICBhcyB4aHJfdGFibGVfdXJsICV9CisgICAgICAgICAgICAgIHslIHdpdGggInJlY2lwZXN0YWJsZSIgYXMgdGFibGVfbmFtZSAlfQorICAgICAgICAgICAgICB7JSB3aXRoICJSZWNpcGVzIiBhcyB0aXRsZSAlfQorICAgICAgICAgICAgICB7JSBpbmNsdWRlICd0b2FzdGVydGFibGUtc2ltcGxlLmh0bWwnICV9CisgICAgICAgICAgICAgIHslIGVuZHdpdGggJX0KKyAgICAgICAgICAgICAgeyUgZW5kd2l0aCAlfQorICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgIDxkaXYgaWQ9Im1hY2hpbmVzIiBjbGFzcz0idGFiLXBhbmUiPgorCisgICAgICAgICAgICAgIDxkaXYgaWQ9Im5vLW1hY2hpbmVzLXlldCIgY2xhc3M9ImFsZXJ0IGFsZXJ0LWluZm8iIHN0eWxlPSJkaXNwbGF5Om5vbmUiPgorICAgICAgICAgICAgICAgIDxwPlRvYXN0ZXIgZG9lcyBub3QgaGF2ZSBtYWNoaW5lIGluZm9ybWF0aW9uIGZvciB0aGUgPHN0cm9uZz4ge3tsYXllcnZlcnNpb24ubGF5ZXIubmFtZX19IDwvc3Ryb25nPiBsYXllci48L3A+CisgICAgICAgICAgICAgICAgPHA+VG9hc3RlciBsZWFybnMgYWJvdXQgbGF5ZXJzIHdoZW4geW91IGJ1aWxkIHRoZW0uIElmIHRoaXMgbGF5ZXIgcHJvdmlkZXMgYW55IG1hY2hpbmVzLCB0aGV5IHdpbGwgYmUgbGlzdGVkIGhlcmUgYWZ0ZXIgeW91IGJ1aWxkIHRoZSA8c3Ryb25nPiB7e2xheWVydmVyc2lvbi5sYXllci5uYW1lfX0gPC9zdHJvbmc+IGxheWVyLjwvcD4KKyAgICAgICAgICAgICAgPC9kaXY+CisKKworICAgICAgICAgICAgICA8IS0tIE1hY2hpbmVzIHRhYmxlIC0tPgorICAgICAgICAgICAgICB7JSB1cmwgJ2xheWVybWFjaGluZXN0YWJsZScgcHJvamVjdC5pZCBsYXllcnZlcnNpb24uaWQgIGFzIHhocl90YWJsZV91cmwgJX0KKyAgICAgICAgICAgICAgeyUgd2l0aCAibWFjaGluZXN0YWJsZSIgYXMgdGFibGVfbmFtZSAgJX0KKyAgICAgICAgICAgICAgeyUgd2l0aCAiTWFjaGluZXMiIGFzIHRpdGxlICAlfQorICAgICAgICAgICAgICB7JSBpbmNsdWRlICd0b2FzdGVydGFibGUtc2ltcGxlLmh0bWwnICV9CisgICAgICAgICAgICAgIHslIGVuZHdpdGggJX0KKyAgICAgICAgICAgICAgeyUgZW5kd2l0aCAlfQorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgPC9kaXY+IDwhLS0gZW5kIHRhYiBjb250ZW50IC0tPgorICAgICAgICA8L2Rpdj4gPCEtLSBlbmQgdGFiYWJsZSAtLT4KKworICAgICAgICA8ZGl2IGNsYXNzPSJyb3ctZmx1aWQgc3BhbjQgd2VsbCI+IDwhLS0gaW5mbyBzaWRlIHBhbmVsIC0tPgorICAgICAgICAgIDxoMj5BYm91dCB7e2xheWVydmVyc2lvbi5sYXllci5uYW1lfX08L2gyPgorICAgICAgICAgIDxkbCBjbGFzcz0iaXRlbS1pbmZvIj4KKworICAgICAgICAgICAgPGR0PgorICAgICAgICAgICAgICBTdW1tYXJ5CisgICAgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLXF1ZXN0aW9uLXNpZ24gZ2V0LWhlbHAiIHRpdGxlPSJPbmUtbGluZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGF5ZXIiPjwvaT4KKyAgICAgICAgICAgIDwvZHQ+CisgICAgICAgICAgICA8ZGQ+CisgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJtdXRlZCIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+Tm90IHNldDwvc3Bhbj4KKyAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImN1cnJlbnQtdmFsdWUiPnt7bGF5ZXJ2ZXJzaW9uLmxheWVyLnN1bW1hcnl8ZGVmYXVsdF9pZl9ub25lOicnfX08L3NwYW4+CisgICAgICAgICAgICAgIDxmb3JtIHN0eWxlPSJkaXNwbGF5Om5vbmU7IG1hcmdpbi1ib3R0b206MjBweCI+CisgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPSJzcGFuMTIiIHJvd3M9IjIiPnslIGlmIGxheWVydmVyc2lvbi5sYXllci5zdW1tYXJ5ICV9e3tsYXllcnZlcnNpb24ubGF5ZXIuc3VtbWFyeX19eyUgZW5kaWYgJX08L3RleHRhcmVhPgorICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBjaGFuZ2UtYnRuIiBkYXRhLWxheWVyLXByb3A9InN1bW1hcnkiIHR5cGU9ImJ1dHRvbiI+U2F2ZTwvYnV0dG9uPgorICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJidG4gYnRuLWxpbmsgY2FuY2VsIj5DYW5jZWw8L2E+CisgICAgICAgICAgICAgIDwvZm9ybT4KKyAgICAgICAgICAgICAgPGkgY2xhc3M9Imljb24tcGVuY2lsIj48L2k+CisgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpY29uLXRyYXNoIGRlbGV0ZS1jdXJyZW50LXZhbHVlIiBkYXRhLXRvZ2dsZT0idG9vbHRpcCIgdGl0bGU9IkRlbGV0ZSI+PC9zcGFuPgorICAgICAgICAgICAgPC9kZD4KKyAgICAgICAgICAgIDxkdD4KKyAgICAgICAgICAgICAgRGVzY3JpcHRpb24KKyAgICAgICAgICAgIDwvZHQ+CisgICAgICAgICAgICA8ZGQ+CisgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJtdXRlZCIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+Tm90IHNldDwvc3Bhbj4KKyAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImN1cnJlbnQtdmFsdWUiPnt7bGF5ZXJ2ZXJzaW9uLmxheWVyLmRlc2NyaXB0aW9ufGRlZmF1bHRfaWZfbm9uZTonJ319PC9zcGFuPgorICAgICAgICAgICAgICA8Zm9ybSBzdHlsZT0iZGlzcGxheTpub25lOyBtYXJnaW4tYm90dG9tOjIwcHgiPgorICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz0ic3BhbjEyIiByb3dzPSI2Ij57JSBpZiBsYXllcnZlcnNpb24ubGF5ZXIuZGVzY3JpcHRpb24gJX17e2xheWVydmVyc2lvbi5sYXllci5kZXNjcmlwdGlvbn19eyUgZW5kaWYgJX08L3RleHRhcmVhPgorICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBjaGFuZ2UtYnRuIiBkYXRhLWxheWVyLXByb3A9ImRlc2NyaXB0aW9uIiB0eXBlPSJidXR0b24iID5TYXZlPC9idXR0b24+CisgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9ImJ0biBidG4tbGluayBjYW5jZWwiPkNhbmNlbDwvYT4KKyAgICAgICAgICAgICAgPC9mb3JtPgorICAgICAgICAgICAgICA8aSBjbGFzcz0iaWNvbi1wZW5jaWwiPjwvaT4KKyAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Imljb24tdHJhc2ggZGVsZXRlLWN1cnJlbnQtdmFsdWUiIGRhdGEtdG9nZ2xlPSJ0b29sdGlwIiB0aXRsZT0iRGVsZXRlIj48L3NwYW4+CisgICAgICAgICAgICA8L2RkPgorICAgICAgICAgICAgeyUgaWYgbGF5ZXJ2ZXJzaW9uLmxheWVyLnVwX2lkICV9CisgICAgICAgICAgICA8ZHQ+TGF5ZXIgaW5kZXg8L2R0PgorICAgICAgICAgICAgPGRkPgorICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vbGF5ZXJzLm9wZW5lbWJlZGRlZC5vcmcvbGF5ZXJpbmRleC9icmFuY2gve3tsYXllcnZlcnNpb24udXBfYnJhbmNoLm5hbWV9fS9sYXllci97e2xheWVydmVyc2lvbi5sYXllci5uYW1lfX0iPmxheWVyIGluZGV4IGxpbms8L2E+CisKKyAgICAgICAgICA8L2RkPgorICAgICAgICAgIHslIGVuZGlmICV9CisKKyAgICAgICAgPC9kbD4KKyAgICAgIDwvZGl2PgorCisgICAgICB7JSBlbmRibG9jayAlfQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9tYWNoaW5lX2J0bi5odG1sIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9tYWNoaW5lX2J0bi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyY2I1NWIKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL21hY2hpbmVfYnRuLmh0bWwKQEAgLTAsMCArMSw4IEBACis8YSBocmVmPSJ7JSB1cmwgJ3Byb2plY3QnIGV4dHJhLnBpZCAlfT9zZXRNYWNoaW5lPXt7ZGF0YS5uYW1lfX0iIGNsYXNzPSJidG4gYnRuLWJsb2NrIGxheWVyLWV4aXN0cy17e2RhdGEubGF5ZXJfdmVyc2lvbi5pZH19IiBzdHlsZT0ibWFyZ2luLXRvcDogNXB4OyBkaXNwbGF5Om5vbmUiPgorICBTZWxlY3QgbWFjaGluZTwvYT4KKzxidXR0b24gY2xhc3M9ImJ0biBidG4tYmxvY2sgbGF5ZXJidG4gbGF5ZXItYWRkLXt7ZGF0YS5sYXllcl92ZXJzaW9uLmlkfX0iIGRhdGEtbGF5ZXI9J3sgImlkIjoge3tkYXRhLmxheWVyX3ZlcnNpb24uaWR9fSwgIm5hbWUiOiAgInt7ZGF0YS5sYXllcl92ZXJzaW9uLmxheWVyLm5hbWV9fSIsICJsYXllcmRldGFpbHVybCI6ICJ7JXVybCAnbGF5ZXJkZXRhaWxzJyBleHRyYS5waWQgZGF0YS5sYXllcl92ZXJzaW9uLmlkICV9In0nIGRhdGEtZGlyZWN0aXZlPSJhZGQiPgorICA8aSBjbGFzcz0iaWNvbi1wbHVzIj48L2k+CisgIEFkZCBsYXllcgorICA8aSB0aXRsZT0iIiBjbGFzcz0iaWNvbi1xdWVzdGlvbi1zaWduIGdldC1oZWxwIiBkYXRhLW9yaWdpbmFsLXRpdGxlPSJUbyBlbmFibGUgdGhpcyBtYWNoaW5lLCB5b3UgbXVzdCBmaXJzdCBhZGQgdGhlIHt7ZGF0YS5sYXllcl92ZXJzaW9uLmxheWVyLm5hbWV9fSBsYXllciB0byB5b3VyIHByb2plY3QiPjwvaT4KKzwvYnV0dG9uPgorCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL21yYl9zZWN0aW9uLmh0bWwgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL21yYl9zZWN0aW9uLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk2ZmI4ZQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvbXJiX3NlY3Rpb24uaHRtbApAQCAtMCwwICsxLDEyMSBAQAoreyUgbG9hZCBzdGF0aWMgJX0KK3slIGxvYWQgcHJvamVjdHRhZ3MgJX0KK3slIGxvYWQgaHVtYW5pemUgJX0KKworCit7JWlmIG1ydS5jb3VudCA+IDAlfQorCisgIDxkaXYgY2xhc3M9InBhZ2UtaGVhZGVyIj4KKyAgICAgIDxoMT4KKyAgICAgICAgICBMYXRlc3QgYnVpbGRzCisgICAgICAgPC9oMT4KKyAgPC9kaXY+CisgIDxkaXYgaWQ9ImxhdGVzdC1idWlsZHMiPgorICB7JSBmb3IgYnVpbGQgaW4gbXJ1ICV9CisgICAgPGRpdiBjbGFzcz0iYWxlcnQgeyVpZiBidWlsZC5vdXRjb21lID09IGJ1aWxkLlNVQ0NFRURFRCV9YWxlcnQtc3VjY2Vzc3slZWxpZiBidWlsZC5vdXRjb21lID09IGJ1aWxkLkZBSUxFRCV9YWxlcnQtZXJyb3J7JWVsc2UlfWFsZXJ0LWluZm97JWVuZGlmJX0gcHJvamVjdC1uYW1lICI+CisgICAgICAgPHNwYW4gY2xhc3M9ImxhYmVsIHslaWYgYnVpbGQub3V0Y29tZSA9PSBidWlsZC5TVUNDRUVERUQlfWxhYmVsLXN1Y2Nlc3N7JWVsaWYgYnVpbGQub3V0Y29tZSA9PSBidWlsZC5GQUlMRUQlfWxhYmVsLWltcG9ydGFudHslZWxzZSV9bGFiZWwtaW5mb3slZW5kaWYlfSI+CisgICAgICAgICA8YSBocmVmPXslIHVybCAncHJvamVjdCcgYnVpbGQucHJvamVjdC5wayAlfT4KKyAgICAgICAgICAge3tidWlsZC5wcm9qZWN0Lm5hbWV9fQorICAgICAgICAgPC9hPgorICAgICAgIDwvc3Bhbj4KKworICAgICAgICA8ZGl2IGNsYXNzPSJyb3ctZmx1aWQiPgorICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3BhbjMgbGVhZCI+CisgICAgeyVpZiBidWlsZC5vdXRjb21lID09IGJ1aWxkLlNVQ0NFRURFRCBvciBidWlsZC5vdXRjb21lID09IGJ1aWxkLkZBSUxFRCAlfQorICAgICAgICAgICAgICAgIDxhIGhyZWY9InsldXJsICdidWlsZGRhc2hib2FyZCcgYnVpbGQucGslfSIgY2xhc3M9InslaWYgYnVpbGQub3V0Y29tZSA9PSBidWlsZC5TVUNDRUVERUQgJX1zdWNjZXNzeyVlbHNlJX1lcnJvcnslZW5kaWYlfSI+CisgICAgeyUgZW5kaWYgJX0KKyAgICAgICAgICAgIHslIGlmIGJ1aWxkLnRhcmdldF9zZXQuYWxsLmNvdW50ID4gMCAlfQorICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtdG9nZ2xlPSJ0b29sdGlwIgorICAgICAgICAgICAgICAgICAgeyVpZiBidWlsZC50YXJnZXRfc2V0LmFsbC5jb3VudCA+IDElfQorICAgICAgICAgICAgICAgICAgICB0aXRsZT0iVGFyZ2V0czogeyVmb3IgdGFyZ2V0IGluIGJ1aWxkLnRhcmdldF9zZXQuYWxsJX17e3RhcmdldC50YXJnZXR9fSB7JWVuZGZvciV9IgorICAgICAgICAgICAgICAgICAgeyVlbmRpZiV9CisgICAgICAgICAgICAgICAgPgorCisgICAgICAgICAgICAgICAgICB7e2J1aWxkLnRhcmdldF9zZXQuYWxsLjAudGFyZ2V0fX0geyVpZiBidWlsZC50YXJnZXRfc2V0LmFsbC5jb3VudCA+IDElfSgrIHt7YnVpbGQudGFyZ2V0X3NldC5hbGwuY291bnR8YWRkOiItMSJ9fSl7JWVuZGlmJX0KKyAgICAgICAgICAgICAgICA8L3NwYW4+CisgICAgICAgICAgICAgeyUgZW5kaWYgJX0KKyAgICB7JWlmIGJ1aWxkLm91dGNvbWUgPT0gYnVpbGQuU1VDQ0VFREVEIG9yIGJ1aWxkLm91dGNvbWUgPT0gYnVpbGQuRkFJTEVEICV9CisgICAgICAgICAgICAgICAgPC9hPgorICAgIHslIGVuZGlmICV9CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9InNwYW4yIGxlYWQiPgorICAgICAgICAgICAgICAgIHslIGlmIGJ1aWxkLmNvbXBsZXRlZF9vbnxmb3JtYXRfYnVpbGRfZGF0ZSAgJX0KKyAgICAgICAgICAgICAgICAgICAge3sgYnVpbGQuY29tcGxldGVkX29ufGRhdGU6J2QvbS95IEg6aScgfX0KKyAgICAgICAgICAgICAgICB7JSBlbHNlICV9CisgICAgICAgICAgICAgICAgICAgIHt7IGJ1aWxkLmNvbXBsZXRlZF9vbnxkYXRlOidIOmknIH19CisgICAgICAgICAgICAgICAgeyUgZW5kaWYgJX0KKyAgICAgICAgICAgIDwvZGl2PgorICAgIHslaWYgYnVpbGQub3V0Y29tZSA9PSBidWlsZC5TVUNDRUVERUQgb3IgYnVpbGQub3V0Y29tZSA9PSBidWlsZC5GQUlMRUQgJX0KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9InNwYW4yIGxlYWQiPgorICAgICAgeyUgaWYgIGJ1aWxkLmVycm9ycy5jb3VudCAlfQorICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLW1pbnVzLXNpZ24gcmVkIj48L2k+IDxhIGhyZWY9InsldXJsICdidWlsZGRhc2hib2FyZCcgYnVpbGQucGslfSNlcnJvcnMiIGNsYXNzPSJlcnJvciI+e3tidWlsZC5lcnJvcnMuY291bnR9fSBlcnJvcnt7YnVpbGQuZXJyb3JzLmNvdW50fHBsdXJhbGl6ZX19PC9hPgorICAgICAgeyUgZW5kaWYgJX0KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3BhbjIgbGVhZCI+CisgICAgICB7JSBpZiAgYnVpbGQud2FybmluZ3MuY291bnQgJX0KKyAgICAgICAgICAgICAgICA8aSBjbGFzcz0iaWNvbi13YXJuaW5nLXNpZ24geWVsbG93Ij48L2k+IDxhIGhyZWY9InsldXJsICdidWlsZGRhc2hib2FyZCcgYnVpbGQucGslfSN3YXJuaW5ncyIgY2xhc3M9Indhcm5pbmciPnt7YnVpbGQud2FybmluZ3MuY291bnR9fSB3YXJuaW5ne3tidWlsZC53YXJuaW5ncy5jb3VudHxwbHVyYWxpemV9fTwvYT4KKyAgICAgIHslIGVuZGlmICV9CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlYWQgIj4KKyAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImxlYWQiPgorICAgICAgICAgICAgICAgIEJ1aWxkIHRpbWU6IDxhIGhyZWY9InslIHVybCAnYnVpbGR0aW1lJyBidWlsZC5wayAlfSI+e3sgYnVpbGQudGltZXNwZW50X3NlY29uZHN8c2VjdG9obXMgfX08L2E+CisgICAgICAgICAgICAgIDwvc3Bhbj4KKyAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuCisgICAgICAgICAgICAgICAgICB7JSBpZiBidWlsZC5vdXRjb21lID09IGJ1aWxkLlNVQ0NFRURFRCAlfQorICAgICAgICAgICAgICAgICAgICAgIGJ0bi1zdWNjZXNzCisgICAgICAgICAgICAgICAgICB7JSBlbGlmIGJ1aWxkLm91dGNvbWUgPT0gYnVpbGQuRkFJTEVEICV9CisgICAgICAgICAgICAgICAgICAgICAgYnRuLWRhbmdlcgorICAgICAgICAgICAgICAgICAgeyUgZWxzZSAlfQorICAgICAgICAgICAgICAgICAgICAgIGJ0bi1pbmZvCisgICAgICAgICAgICAgICAgICB7JWVuZGlmJX0KKyAgICAgICAgICAgICAgICAgIHB1bGwtcmlnaHQiCisgICAgICAgICAgICAgICAgICBvbmNsaWNrPSdzY2hlZHVsZUJ1aWxkKHslIHVybCAncHJvamVjdGJ1aWxkcycgYnVpbGQucHJvamVjdC5pZCBhcyBicGkgJX17e2JwaXxqc29ufX0sCisgICAgICAgICAgICAgICAgICAgIHt7YnVpbGQucHJvamVjdC5uYW1lfGpzb259fSwKKyAgICAgICAgICAgICAgICAgICAgeyUgdXJsICdwcm9qZWN0JyBidWlsZC5wcm9qZWN0LmlkIGFzIGJwdXJsICV9e3ticHVybHxqc29ufX0sCisgICAgICAgICAgICAgICAgICAgIHt7YnVpbGQudGFyZ2V0X3NldC5hbGx8Z2V0X3Rhc2tzfGpzb259fSknPgorCisgICAgICAgICAgICAgICAgICAgIFJ1biBhZ2FpbgorICAgICAgICAgICAgICA8L2J1dHRvbj4KKyAgICAgICAgICAgIDwvZGl2PgorICAgIHslZW5kaWYlfQorICAgIHslaWYgYnVpbGQub3V0Y29tZSA9PSBidWlsZC5JTl9QUk9HUkVTUyAlfQorICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3BhbjQiPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InByb2dyZXNzIiBzdHlsZT0ibWFyZ2luLXRvcDo1cHg7IiBkYXRhLXRvZ2dsZT0idG9vbHRpcCIgdGl0bGU9Int7YnVpbGQuY29tcGxldGVwZXJ9fSUgb2YgdGFza3MgY29tcGxldGUiPgorICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJ3aWR0aDoge3tidWlsZC5jb21wbGV0ZXBlcn19JTsiIGNsYXNzPSJiYXIiPjwvZGl2PgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWFkIHB1bGwtcmlnaHQiPnt7YnVpbGQuY29tcGxldGVwZXJ9fSUgb2YgdGFza3MgY29tcGxldGU8L2Rpdj4KKyAgICB7JWVuZGlmJX0KKyAgICAgICAgPC9kaXY+CisgICAgPC9kaXY+CisKKyAgeyUgZW5kZm9yICV9CisgIDwvZGl2PgorCis8c2NyaXB0PgorCitmdW5jdGlvbiBzY2hlZHVsZUJ1aWxkKHVybCwgcHJvamVjdE5hbWUsIHByb2plY3RVcmwsIGJ1aWxkbGlzdCkgeworICBjb25zb2xlLmxvZygic2NoZWR1bGVCdWlsZCIpOworICBsaWJ0b2FzdGVyLnN0YXJ0QUJ1aWxkKHVybCwgbnVsbCwgYnVpbGRsaXN0LmpvaW4oIiAiKSwgZnVuY3Rpb24oKXsKKyAgICBjb25zb2xlLmxvZygicmVsb2FkaW5nIHBhZ2UiKTsKKyAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7CisgIH0sIG51bGwpOworfQorCiskKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpeworCisgICQoIi5jYW5jZWwtYnVpbGQtYnRuIikuY2xpY2soZnVuY3Rpb24gKCl7CisgICAgdmFyIHVybCA9ICQodGhpcykuZGF0YSgncmVxdWVzdC11cmwnKTsKKyAgICB2YXIgYnVpbGRJZHMgPSAkKHRoaXMpLmRhdGEoJ2J1aWxkLWlkJyk7CisgICAgdmFyIGJ0biA9ICQodGhpcyk7CisKKyAgICBsaWJ0b2FzdGVyLmNhbmNlbEFCdWlsZCh1cmwsIGJ1aWxkSWRzLCBmdW5jdGlvbigpeworICAgICAgYnRuLnBhcmVudHMoIi5hbGVydCIpLmZhZGVPdXQoKTsKKyAgICB9LCBudWxsKTsKKyAgfSk7Cit9KTsKKworPC9zY3JpcHQ+CisKK3slZW5kaWYlfQorCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL25ld3Byb2plY3QuaHRtbCBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvbmV3cHJvamVjdC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NzM5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL25ld3Byb2plY3QuaHRtbApAQCAtMCwwICsxLDEzMCBAQAoreyUgZXh0ZW5kcyAiYmFzZS5odG1sIiAlfQoreyUgbG9hZCBwcm9qZWN0dGFncyAlfQoreyUgbG9hZCBodW1hbml6ZSAlfQoreyUgYmxvY2sgcGFnZWNvbnRlbnQgJX0KKzxkaXYgY2xhc3M9InJvdy1mbHVpZCI+CisgICAgPGRpdiBjbGFzcz0icGFnZS1oZWFkZXIiPgorICAgICAgICAgIDxoMT5DcmVhdGUgYSBuZXcgcHJvamVjdDwvaDE+CisgICAgICAgIDwvZGl2PgorICAgICAgICA8ZGl2IGNsYXNzPSJjb250YWluZXItZmx1aWQiPgorICAgIHslIGlmIGFsZXJ0ICV9CisgICAgICA8ZGl2IGNsYXNzPSJhbGVydCBhbGVydC1lcnJvciByb3ctZmx1aWQiIHJvbGU9ImFsZXJ0Ij57e2FsZXJ0fX08L2Rpdj4KKyAgICB7JSBlbmRpZiAlfQorICAgICAgICA8L2Rpdj4KKworICAgICAgPGRpdiBjbGFzcz0icm93LWZsdWlkIj4KKyAgICAgICAgPGRpdiBjbGFzcz0ic3BhbjYiPgorICAgICAgICA8Zm9ybSBtZXRob2Q9IlBPU1QiPnslIGNzcmZfdG9rZW4gJX0KKworICAgICAgICAgICAgPGZpZWxkc2V0PgorICAgICAgICAgICAgICA8bGFiZWw+UHJvamVjdCBuYW1lIDxzcGFuIGNsYXNzPSJtdXRlZCI+KHJlcXVpcmVkKTwvc3Bhbj48L2xhYmVsPgorICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9ImlucHV0LXhsYXJnZSIgcmVxdWlyZWQgaWQ9Im5ldy1wcm9qZWN0LW5hbWUiIG5hbWU9InByb2plY3RuYW1lIj4KKyAgICAgICAgICAgIDwvZmllbGRzZXQ+Cis8IS0tCisgICAgICAgICAgICA8ZmllbGRzZXQ+CisgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJwcm9qZWN0LWZvcm0iPlByb2plY3QgdHlwZTwvbGFiZWw+CisgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0icHJvamVjdC1mb3JtIHJhZGlvIj48aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9InB0eXBlIiB2YWx1ZT0iYW5hbHlzaXMiIGNoZWNrZWQvPiBBbmFseXNpcyBQcm9qZWN0PC9sYWJlbD4KKworICAgICAgICAgICAgICAgIHslIGlmIHJlbGVhc2VzLmNvdW50ID4gMCAlfQorICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9InByb2plY3QtZm9ybSByYWRpbyI+PGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJwdHlwZSIgdmFsdWU9ImJ1aWxkIiBjaGVja2VkIC8+IEJ1aWxkIFByb2plY3Q8L2xhYmVsPgorICAgICAgICAgICAgICAgIHslIGVuZGlmICV9CisgICAgICAgICAgICAgIDwvZmllbGRzZXQ+IC0tPgorICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJwdHlwZSIgdmFsdWU9ImJ1aWxkIiAvPgorCisgICAgICAgIHslIGlmIHJlbGVhc2VzLmNvdW50ID4gMCAlfQorICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJyZWxlYXNlIj4KKyAgICAgICAgICAgIHslIGlmIHJlbGVhc2VzLmNvdW50ID4gMSAlfQorICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9InByb2plY3QtZm9ybSI+CisgICAgICAgICAgICAgICAgUmVsZWFzZQorICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLXF1ZXN0aW9uLXNpZ24gZ2V0LWhlbHAiIHRpdGxlPSJUaGUgdmVyc2lvbiBvZiB0aGUgYnVpbGQgc3lzdGVtIHlvdSB3YW50IHRvIHVzZSI+PC9pPgorICAgICAgICAgICAgICA8L2xhYmVsPgorICAgICAgICAgICAgICA8c2VsZWN0IG5hbWU9InByb2plY3R2ZXJzaW9uIiBpZD0icHJvamVjdHZlcnNpb24iPgorICAgICAgICAgICAgICAgIHslIGZvciByZWxlYXNlIGluIHJlbGVhc2VzICV9CisgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Int7cmVsZWFzZS5pZH19IgorICAgICAgICAgICAgICAgICAgICAgICAgeyVpZiBkZWZhdWx0YnJhbmNoID09IHJlbGVhc2UubmFtZSAlfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkCisgICAgICAgICAgICAgICAgICAgICAgICB7JWVuZGlmJX0KKyAgICAgICAgICAgICAgICAgICAgID57e3JlbGVhc2UuZGVzY3JpcHRpb259fTwvb3B0aW9uPgorICAgICAgICAgICAgICAgIHslIGVuZGZvciAlfQorICAgICAgICAgICAgICA8L3NlbGVjdD4KKyAgICAgICAgICAgICAgICB7JSBmb3IgcmVsZWFzZSBpbiByZWxlYXNlcyAlfQorICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ctZmx1aWQgaGVscHRleHQiIGlkPSJkZXNjcmlwdGlvbi17e3JlbGVhc2UuaWR9fSIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJoZWxwLWJsb2NrIHNwYW41Ij57e3JlbGVhc2UuaGVscHRleHR8c2FmZX19PC9zcGFuPgorICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICB7JSBlbmRmb3IgJX0KKyAgICAgICAgICAgIHslIGVsc2UgJX0KKyAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0icHJvamVjdHZlcnNpb24iIHZhbHVlPSJ7e3JlbGVhc2VzLjAuaWR9fSIvPgorICAgICAgICAgICAgeyUgZW5kaWYgJX0KKyAgICAgICAgICAgIDwvZmllbGRzZXQ+CisgICAgICAgIHslIGVuZGlmICV9CisKKyAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tYWN0aW9ucyI+CisgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIGlkPSJjcmVhdGUtcHJvamVjdC1idXR0b24iIGNsYXNzPSJidG4gYnRuLXByaW1hcnkgYnRuLWxhcmdlIiB2YWx1ZT0iQ3JlYXRlIHByb2plY3QiLz4KKyAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImhlbHAtaW5saW5lIiBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlOyI+VG8gY3JlYXRlIGEgcHJvamVjdCwgeW91IG5lZWQgdG8gZW50ZXIgYSBwcm9qZWN0IG5hbWU8L3NwYW4+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgPC9mb3JtPgorICAgICAgICA8L2Rpdj4KKyAgICAgICAgPCEtLQorICAgICAgICA8ZGl2IGNsYXNzPSJzcGFuNSB3ZWxsIj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaGVscC1ibG9jayI+CisgICAgICAgICAgICAgICAgIDxoND5Ub2FzdGVyIHByb2plY3QgdHlwZXM8L2g0PgorICAgICAgICAgICAgICAgICA8cD5XaXRoIGEgPHN0cm9uZz5idWlsZCBwcm9qZWN0PC9zdHJvbmc+IHlvdSBjb25maWd1cmUgYW5kIHJ1biB5b3VyIGJ1aWxkcyBmcm9tIFRvYXN0ZXIuPC9wPgorICAgICAgICAgICAgICAgICA8cD5XaXRoIGFuIDxzdHJvbmc+YW5hbHlzaXMgcHJvamVjdDwvc3Ryb25nPiwgdGhlIGJ1aWxkcyBhcmUgY29uZmlndXJlZCBhbmQgcnVuIGJ5IGFub3RoZXIgdG9vbAorICAgICAgICAgICAgICAgICAoc29tZXRoaW5nIGxpa2UgQnVpbGRib3Qgb3IgSmVua2lucyksIGFuZCB0aGUgcHJvamVjdCBvbmx5IGNvbGxlY3RzIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKyAgICAgICAgICAgICAgICAgYnVpbGRzIChwYWNrYWdlcywgcmVjaXBlcywgZGVwZW5kZW5jaWVzLCBsb2dzLCBldGMpLiA8L3A+CisgICAgICAgICAgICAgICAgIDxwPllvdSBjYW4gcmVhZCBtb3JlIG9uIDxhIGhyZWY9IiMiPmhvdyB0byBzZXQgdXAgYW4gYW5hbHlzaXMgcHJvamVjdDwvYT4KKyAgICAgICAgICAgICAgICAgaW4gdGhlIFRvYXN0ZXIgbWFudWFsLjwvcD4KKyAgICAgICAgICAgICAgICAgPGg0PlJlbGVhc2U8L2g0PgorICAgICAgICAgICAgICAgICA8cD5JZiB5b3UgY3JlYXRlIGEgPHN0cm9uZz5idWlsZCBwcm9qZWN0PC9zdHJvbmc+LCB5b3Ugd2lsbCBuZWVkIHRvIHNlbGVjdCBhIDxzdHJvbmc+cmVsZWFzZTwvc3Ryb25nPiwKKyAgICAgICAgICAgICAgICAgd2hpY2ggaXMgdGhlIHZlcnNpb24gb2YgdGhlIGJ1aWxkIHN5c3RlbSB5b3Ugd2FudCB0byB1c2UgdG8gcnVuIHlvdXIgYnVpbGRzLjwvcD4KKyAgICAgICAgICAgICA8L2Rpdj4gLS0+CisgICAgICAgIDwvZGl2PgorICAgIDwvZGl2PgorCisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgICAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICAvLyBoaWRlIHRoZSBuZXcgcHJvamVjdCBidXR0b24KKyAgICAgICAgICAgICQoIiNuZXctcHJvamVjdC1idXR0b24iKS5oaWRlKCk7CisgICAgICAgICAgICAkKCcuYnRuLXByaW1hcnknKS5hdHRyKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpOworCisgICAgICAgICAgICAvLyBlbmFibGUgc3VibWl0IGJ1dHRvbiB3aGVuIGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHBvcHVsYXRlZAorICAgICAgICAgICAgJCgiaW5wdXQjbmV3LXByb2plY3QtbmFtZSIpLm9uKCdpbnB1dCcsIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgIGlmICgkKCJpbnB1dCNuZXctcHJvamVjdC1uYW1lIikudmFsKCkubGVuZ3RoID4gMCApeworICAgICAgICAgICAgICAgICAgICAkKCcuYnRuLXByaW1hcnknKS5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpOworICAgICAgICAgICAgICAgICAgICAkKCIuaGVscC1pbmxpbmUiKS5jc3MoJ3Zpc2liaWxpdHknLCdoaWRkZW4nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICQoJy5idG4tcHJpbWFyeScpLmF0dHIoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7CisgICAgICAgICAgICAgICAgICAgICQoIi5oZWxwLWlubGluZSIpLmNzcygndmlzaWJpbGl0eScsJ3Zpc2libGUnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgLy8gc2hvdyByZWxldmFudCBoZWxwIHRleHQgZm9yIHRoZSBzZWxlY3RlZCByZWxlYXNlCisgICAgICAgICAgICB2YXIgc2VsZWN0ZWRfcmVsZWFzZSA9ICQoJ3NlbGVjdCcpLnZhbCgpOworICAgICAgICAgICAgJCgiI2Rlc2NyaXB0aW9uLSIgKyBzZWxlY3RlZF9yZWxlYXNlKS5zaG93KCk7CisKKworICAgICAgICAgICAgJCgnc2VsZWN0JykuY2hhbmdlKGZ1bmN0aW9uKCl7CisgICAgICAgICAgICAgICAgdmFyIG5ld19yZWxlYXNlID0gJCgnc2VsZWN0JykudmFsKCk7CisgICAgICAgICAgICAgICAgJCgiLmhlbHB0ZXh0IikuaGlkZSgpOworICAgICAgICAgICAgICAgICQoJyNkZXNjcmlwdGlvbi0nICsgbmV3X3JlbGVhc2UpLmZhZGVJbigpOworICAgICAgICAgICAgfSk7CisKKy8qCQkJLy8gSGlkZSB0aGUgcHJvamVjdCByZWxlYXNlIHdoZW4geW91IHNlbGVjdCBhbiBhbmFseXNpcyBwcm9qZWN0CisJCQlmdW5jdGlvbiBwcm9qZWN0VHlwZSgpIHsKKwkJCQlpZiAoJCgiaW5wdXRbdHlwZT0ncmFkaW8nXTpjaGVja2VkIikudmFsKCkgPT0gJ2J1aWxkJykgeworCQkJCQkkKCcucmVsZWFzZScpLmZhZGVJbigpOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJJCgnLnJlbGVhc2UnKS5mYWRlT3V0KCk7CisJCQkJfQorCQkJfQorCQkJcHJvamVjdFR5cGUoKTsKKworCQkJJCgnaW5wdXQ6cmFkaW8nKS5jaGFuZ2UoZnVuY3Rpb24oKXsKKwkJCQlwcm9qZWN0VHlwZSgpOworCQkJfSk7ICovCisgICAgICAgIH0pOworICAgIDwvc2NyaXB0PgorCit7JSBlbmRibG9jayAlfQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9wYWNrYWdlX2J1aWx0X2RlcGVuZGVuY2llcy5odG1sIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9wYWNrYWdlX2J1aWx0X2RlcGVuZGVuY2llcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZjIwYzMKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL3BhY2thZ2VfYnVpbHRfZGVwZW5kZW5jaWVzLmh0bWwKQEAgLTAsMCArMSw5OSBAQAoreyUgZXh0ZW5kcyAicGFja2FnZV9kZXRhaWxfYmFzZS5odG1sIiAlfQoreyUgbG9hZCBwcm9qZWN0dGFncyAlfQorCit7JSBibG9jayB0YWJjb250ZW50ICV9CisgICAgICAgIDx1bCBjbGFzcz0ibmF2IG5hdi1waWxscyI+CisgICAgICAgICAgICA8bGkgY2xhc3M9IiI+CisgICAgICAgICAgICAgICAgPGEgaHJlZj0ieyUgdXJsICdwYWNrYWdlX2J1aWx0X2RldGFpbCcgYnVpbGQuaWQgcGFja2FnZS5pZCAlfSI+CisgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLXF1ZXN0aW9uLXNpZ24gZ2V0LWhlbHAiIHRpdGxlPSJTaG93cyB0aGUgZmlsZXMgcHJvZHVjZWQgYnkgdGhpcyBwYWNrYWdlLiI+PC9pPgorICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZWQgZmlsZXMgKHt7cGFja2FnZS5idWlsZGZpbGVsaXN0X3BhY2thZ2UuY291bnR9fSkKKyAgICAgICAgICAgICAgICA8L2E+CisgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgPGxpIGNsYXNzPSJhY3RpdmUiPgorICAgICAgICAgICAgICAgIDxhIGhyZWY9InslIHVybCAncGFja2FnZV9idWlsdF9kZXBlbmRlbmNpZXMnIGJ1aWxkLmlkIHBhY2thZ2UuaWQgJX0iPgorICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iaWNvbi1xdWVzdGlvbi1zaWduIGdldC1oZWxwIiB0aXRsZT0iU2hvd3MgdGhlIHJ1bnRpbWUgcGFja2FnZXMgcmVxdWlyZWQgYnkgdGhpcyBwYWNrYWdlLiI+PC9pPgorICAgICAgICAgICAgICAgICAgICBSdW50aW1lIGRlcGVuZGVuY2llcyAoe3tkZXBlbmRlbmN5X2NvdW50fX0pCisgICAgICAgICAgICAgICAgPC9hPgorICAgICAgICAgICAgPC9saT4KKyAgICAgICAgPC91bD4KKyAgICAgICAgPGRpdiBjbGFzcz0idGFiLWNvbnRlbnQiPgorICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFiLXBhbmUgYWN0aXZlIiBpZD0iZGVwZW5kZW5jaWVzIj4KKyAgICAgICAgICAgIHslIGlmZXF1YWwgcnVudGltZV9kZXBzfGxlbmd0aCAwICV9CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtaW5mbyI+CisgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+e3twYWNrYWdlLmZ1bGxwYWNrYWdlc3BlY319PC9zdHJvbmc+IGhhcyBubyBydW50aW1lIGRlcGVuZGVuY2llcy4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIHslIGVsc2UgJX0KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhbGVydCBhbGVydC1pbmZvIj4KKyAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz57e3BhY2thZ2UuZnVsbHBhY2thZ2VzcGVjfX08L3N0cm9uZz4gaXMgPHN0cm9uZz5ub3QgaW5jbHVkZWQ8L3N0cm9uZz4gaW4gYW55IGltYWdlLiBUaGlzIHBhZ2Ugc2hvd3MgeW91IHRoZSBwcm9qZWN0ZWQgcnVudGltZSBkZXBlbmRlbmNpZXMgaWYgeW91IGluY2x1ZGUgPHN0cm9uZz57e3BhY2thZ2UuZnVsbHBhY2thZ2VzcGVjfX08L3N0cm9uZz4gaW4gZnV0dXJlIGJ1aWxkcy4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9InRhYmxlIHRhYmxlLWJvcmRlcmVkIHRhYmxlLWhvdmVyIj4KKyAgICAgICAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5QYWNrYWdlPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+VmVyc2lvbjwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJzaXplY29sIHNwYW4yIj5TaXplPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KKwkJCQkJCXslIGZvciBydW50aW1lX2RlcCBpbiBydW50aW1lX2RlcHMgJX0KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ciB7e3J1bnRpbWVfZGVwLnNpemV8Zm9ybWF0X3ZwYWNrYWdlX3Jvd2NsYXNzfX0gPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHslIGlmIHJ1bnRpbWVfZGVwLnNpemUgIT0gLTEgJX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9InslIHVybCAncGFja2FnZV9idWlsdF9kZXRhaWwnIGJ1aWxkLmlkIHJ1bnRpbWVfZGVwLmRlcGVuZHNfb25faWQgJX0iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tydW50aW1lX2RlcC5uYW1lfX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyUgZWxzZSAlfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tydW50aW1lX2RlcC5uYW1lfGZvcm1hdF92cGFja2FnZV9uYW1laGVscH19CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7JSBlbmRpZiAlfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e3J1bnRpbWVfZGVwLnZlcnNpb259fTwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJzaXplY29sIj57e3J1bnRpbWVfZGVwLnNpemV8ZmlsdGVyZWRfZmlsZXNpemVmb3JtYXR9fTwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorCQkJCQkJeyUgZW5kZm9yICV9CisgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgIHslIGVuZGlmZXF1YWwgJX0KKyAgICAgICAgICAgIHslIGlmbm90ZXF1YWwgb3RoZXJfZGVwc3xsZW5ndGggMCAlfQorICAgICAgICAgICAgICAgIDxoMz5PdGhlciBydW50aW1lIHJlbGF0aW9uc2hpcHM8L2gzPgorICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0idGFibGUgdGFibGUtYm9yZGVyZWQgdGFibGUtaG92ZXIiPgorICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlBhY2thZ2U8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5WZXJzaW9uPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9InNpemVjb2wgc3BhbjIiPlNpemU8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCIgdGl0bGU9IkZpdmUgcmVsYXRpb25zaGlwIHR5cGVzIGV4aXN0OiByZWNvbW1lbmRzLCBzdWdnZXN0cywgcHJvdmlkZXMsIHJlcGxhY2VzIGFuZCBjb25mbGljdHMiPjwvaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwIHR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgICAgICAgPHRib2R5PgorCQkJCQkJeyUgZm9yIG90aGVyX2RlcCBpbiBvdGhlcl9kZXBzICV9CisgICAgICAgICAgICAgICAgICAgICAgICA8dHIge3tvdGhlcl9kZXAuc2l6ZXxmb3JtYXRfdnBhY2thZ2Vfcm93Y2xhc3N9fSA+CisgICAgICAgICAgICAgICAgICAgICAgICB7JSBpZiBvdGhlcl9kZXAuc2l6ZSAhPSAtMSAlfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0ieyUgdXJsICdwYWNrYWdlX2J1aWx0X2RldGFpbCcgYnVpbGQuaWQgb3RoZXJfZGVwLmRlcGVuZHNfb25faWQgJX0iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tvdGhlcl9kZXAubmFtZX19CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgeyUgZWxzZSAlfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tvdGhlcl9kZXAubmFtZXxmb3JtYXRfdnBhY2thZ2VfbmFtZWhlbHB9fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICB7JSBlbmRpZiAlfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e290aGVyX2RlcC52ZXJzaW9ufX08L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ic2l6ZWNvbCI+e3tvdGhlcl9kZXAuc2l6ZXxmaWx0ZXJlZF9maWxlc2l6ZWZvcm1hdH19PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7b3RoZXJfZGVwLmRlcF90eXBlX2Rpc3BsYXl9fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iaWNvbi1xdWVzdGlvbi1zaWduIGdldC1oZWxwIGhvdmVyLWhlbHAiIHRpdGxlPSJ7e290aGVyX2RlcC5kZXBfdHlwZV9oZWxwfX0iID48L2k+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICAgIAl7JSBlbmRmb3IgJX0KKyAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgIHslIGVuZGlmbm90ZXF1YWwgJX0KKyAgICAgICAgICAgIDwvZGl2PiA8IS0tIHRhYi1wYW5lIC0tPgorICAgICAgICA8L2Rpdj4gPCEtLSB0YWItY29udGVudCAtLT4KK3slIGVuZGJsb2NrIHRhYmNvbnRlbnQgJX0KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvcGFja2FnZV9idWlsdF9kZXRhaWwuaHRtbCBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvcGFja2FnZV9idWlsdF9kZXRhaWwuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmU4Y2NiCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9wYWNrYWdlX2J1aWx0X2RldGFpbC5odG1sCkBAIC0wLDAgKzEsNjUgQEAKK3slIGV4dGVuZHMgInBhY2thZ2VfZGV0YWlsX2Jhc2UuaHRtbCIgJX0KK3slIGxvYWQgcHJvamVjdHRhZ3MgJX0KKworeyUgYmxvY2sgdGFiY29udGVudCAlfQorICAgIHslIHdpdGggcGFja2FnZUZpbGVDb3VudD1wYWNrYWdlLmJ1aWxkZmlsZWxpc3RfcGFja2FnZS5jb3VudCAlfQorICAgICAgICA8IS0tIEdlbmVyYXRlZCBGaWxlcyAtLT4KKyAgICAgICAgeyUgaWYgcGFja2FnZS5idWlsZHRhcmdldGxpc3RfcGFja2FnZS5jb3VudCA9PSAwICV9CisgICAgICAgICAgICB7IyBOb3QgaW5jbHVkZWQgY2FzZSAjfQorICAgICAgICAgICAgPHVsIGNsYXNzPSJuYXYgbmF2LXBpbGxzIj4KKyAgICAgICAgICAgICAgICA8bGkgY2xhc3M9ImFjdGl2ZSI+IDxhIGhyZWY9IiMiPgorICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iaWNvbi1xdWVzdGlvbi1zaWduIGdldC1oZWxwIiB0aXRsZT0iRmlsZXMgYWRkZWQgdG8gYSByb290IGZpbGUgc3lzdGVtIHdoZW4geW91IGluY2x1ZGUge3twYWNrYWdlLm5hbWV9fSBpbiBhbiBpbWFnZSI+PC9pPgorICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZWQgZmlsZXMgKHt7cGFja2FnZUZpbGVDb3VudH19KQorICAgICAgICAgICAgICAgIDwvYT48L2xpPgorICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iIj48YSBocmVmPSJ7JSB1cmwgJ3BhY2thZ2VfYnVpbHRfZGVwZW5kZW5jaWVzJyBidWlsZC5pZCBwYWNrYWdlLmlkICV9Ij4KKyAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCIgdGl0bGU9IlByb2plY3RlZCBydW50aW1lIGRlcGVuZGVuY2llcyB3aGVuIHlvdSBpbmNsdWRlIHt7cGFja2FnZS5uYW1lfX0gaW4gYW4gaW1hZ2UiPjwvaT4KKyAgICAgICAgICAgICAgICAgICAgUnVudGltZSBkZXBlbmRlbmNpZXMgKHt7ZGVwZW5kZW5jeV9jb3VudH19KQorICAgICAgICAgICAgICAgIDwvYT48L2xpPgorICAgICAgICAgICAgPC91bD4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYi1jb250ZW50Ij4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYi1wYW5lIGFjdGl2ZSIgaWQ9ImZpbGVzIj4KKyAgICAgICAgICAgIDwhLS0gUGFja2FnZSBmaWxlIGxpc3Qgb3IgaWYgZW1wdHksIGFsZXJ0IHBhbmUgLS0+CisgICAgICAgICAgICB7JSBpZiBwYWNrYWdlRmlsZUNvdW50ID4gMCAlfQorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LWluZm8iPgorICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPnt7cGFja2FnZS5mdWxscGFja2FnZXNwZWN9fTwvc3Ryb25nPiBpcyA8c3Ryb25nPm5vdCBpbmNsdWRlZDwvc3Ryb25nPiBpbiBhbnkgaW1hZ2UuIFRoaXMgcGFnZSBzaG93cyB5b3UgdGhlIGZpbGVzIGFkZGVkIHRvIGFuIGltYWdlIHJvb3QgZmlsZSBzeXN0ZW0gaWYgeW91IGluY2x1ZGUgPHN0cm9uZz57e3BhY2thZ2UuZnVsbHBhY2thZ2VzcGVjfX08L3N0cm9uZz4gaW4gZnV0dXJlIGJ1aWxkcy4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICB7JSBpbmNsdWRlICJ0YWJsZXNvcnQuaHRtbCIgJX0KKyAgICAgICAgICAgICAgICAgICAgPHRib2R5PgorCQkJCQkJeyUgZm9yIGZpbGUgaW4gb2JqZWN0cyAlfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJwYXRoIj57e2ZpbGUucGF0aH19PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmaWxlc2l6ZSBzaXplY29sIj57e2ZpbGUuc2l6ZXxmaWx0ZXJlZF9maWxlc2l6ZWZvcm1hdH19PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorCQkJCQkJeyUgZW5kZm9yICV9CisgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICAgICAgPC90YWJsZT4KKworICAgICAgICAgICAgeyUgZWxzZSAlfQorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LWluZm8iPgorICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPnt7cGFja2FnZS5mdWxscGFja2FnZXNwZWN9fTwvc3Ryb25nPiBkb2VzIG5vdCBnZW5lcmF0ZSBhbnkgZmlsZXMuCisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICB7JSBlbmRpZiAlfQorCisgICAgICAgICAgICA8L2Rpdj4gPCEtLSB0YWItcGFuZSBhY3RpdmUgLS0+CisgICAgICAgICAgICA8L2Rpdj4gPCEtLSB0YWItY29udGVudCAtLT4KKyAgICAgICAgeyUgZWxzZSAlfQorICAgICAgICAgICAgeyMgSW5jbHVkZWQgY2FzZSAjfQorICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFiLWNvbnRlbnQiPgorICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFiLXBhbmUgYWN0aXZlIj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlYWQgd2VsbCI+CisgICAgICAgICAgICAgICAgICAgIFBhY2thZ2UgaW5jbHVkZWQgaW46CisgICAgICAgICAgICAgICAgICAgIHslIGZvciBpdGFyZ2V0IGluIHBhY2thZ2UuYnVpbGR0YXJnZXRsaXN0X3BhY2thZ2UuYWxsfGRpY3Rzb3J0OiJ0YXJnZXQudGFyZ2V0IiAlfQorICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0ieyUgdXJsICdwYWNrYWdlX2luY2x1ZGVkX2RldGFpbCcgYnVpbGQuaWQgaXRhcmdldC50YXJnZXQuaWQgcGFja2FnZS5pZCAlfSI+CisgICAgICAgICAgICAgICAgICAgICAgICB7JSBpZiBmb3Jsb29wLmNvdW50ZXIwID4gMCAgJX0KKyAgICAgICAgICAgICAgICAgICAgICAgICwmbmJzcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHslIGVuZGlmICV9CisgICAgICAgICAgICAgICAgICAgICAgICB7e2l0YXJnZXQudGFyZ2V0LnRhcmdldH19CisgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CisgICAgICAgICAgICAgICAgICAgIHslIGVuZGZvciAlfQorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8L2Rpdj4gPCEtLSB0YWItcGFuZSBhY3RpdmUgLS0+CisgICAgICAgICAgICA8L2Rpdj4gPCEtLSB0YWItY29udGVudCAtLT4KKyAgICAgICAgeyUgZW5kaWYgJX0KKworICAgIHslIGVuZHdpdGggJX0KK3slIGVuZGJsb2NrIHRhYmNvbnRlbnQgJX0KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvcGFja2FnZV9kZXRhaWxfYmFzZS5odG1sIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9wYWNrYWdlX2RldGFpbF9iYXNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI0YmM4ZQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvcGFja2FnZV9kZXRhaWxfYmFzZS5odG1sCkBAIC0wLDAgKzEsMTQyIEBACit7JSBleHRlbmRzICJiYXNlYnVpbGRkZXRhaWxwYWdlLmh0bWwiICV9Cit7JSBsb2FkIHByb2plY3R0YWdzICV9CisKK3slIGJsb2NrIGV4dHJhaGVhZGNvbnRlbnQgJX0KKyAgICA8IS0tIGZ1bmN0aW9ucyB0byBmb3JtYXQgcGFja2FnZSAnaW5zdGFsbGVkX3BhY2thZ2UnIGFsaWFzIC0tPgorICAgIDxzY3JpcHQ+CisgICAgZnVuY3Rpb24gZm10QWxpYXNIZWxwKHBhY2thZ2VfbmFtZSwgYWxpYXMsIGhvdmVyKSB7CisgICAgICAgIHZhciByID0gbnVsbDsKKyAgICAgICAgaWYgKGFsaWFzICE9IG51bGwgJiYgYWxpYXMgIT0gJycpIHsKKyAgICAgICAgICAgIHIgPSAnPHNwYW4gY2xhc3M9Im11dGVkIj4gYXMgJyArIGFsaWFzICsgJyZuYnNwJzsKKyAgICAgICAgICAgIHIgKz0gJzxpIGNsYXNzPSJpY29uLXF1ZXN0aW9uLXNpZ24gZ2V0LWhlbHAnOworICAgICAgICAgICAgaWYgKGhvdmVyKSB7CisgICAgICAgICAgICAgICAgcis9ICcgaG92ZXItaGVscCc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICByKz0gJyBoZWFkaW5nLWhlbHAnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgciArPSAnIic7CisgICAgICAgICAgICB0aXRsZSA9IHBhY2thZ2VfbmFtZSArICcgd2FzIHJlbmFtZWQgYXQgcGFja2FnaW5nIHRpbWUgYW5kIHdhcyBpbnN0YWxsZWQgb24geW91ciBzeXN0ZW0gYXMgJyArIGFsaWFzOworICAgICAgICAgICAgciArPSAnIHRpdGxlPSInICsgdGl0bGUgKyAnIj4nOworICAgICAgICAgICAgciArPSAnPC9pPic7CisgICAgICAgICAgICByICs9ICc8L3NwYW4+JzsKKyAgICAgICAgICAgIGRvY3VtZW50LndyaXRlKHIpOworICAgICAgICB9CisgICAgfQorICAgIDwvc2NyaXB0PgoreyUgZW5kYmxvY2sgZXh0cmFoZWFkY29udGVudCAlfQoreyUgYmxvY2sgbG9jYWxicmVhZGNydW1iICV9CisgICAgeyUgaWYgdGFyZ2V0ICV9CisgICAgICAgIDxsaT48YSBocmVmPSJ7JSB1cmwgInRhcmdldCIgYnVpbGQuaWQgdGFyZ2V0LmlkICV9Ij57e3RhcmdldC50YXJnZXR9fTwvYT48L2xpPgorICAgICAgICA8bGk+e3twYWNrYWdlLmZ1bGxwYWNrYWdlc3BlY319IHslIGlmIHBhY2thZ2UuYWxpYXMgJX0gYXMge3twYWNrYWdlLmFsaWFzfX17JSBlbmRpZiAlfTwvbGk+CisgICAgeyUgZWxzZSAlfQorICAgICAgICA8bGk+PGEgaHJlZj0ieyUgdXJsICJwYWNrYWdlcyIgYnVpbGQuaWQgJX0iPiBQYWNrYWdlcyA8L2E+PC9saT4KKyAgICAgICAgPGxpPnt7cGFja2FnZS5mdWxscGFja2FnZXNwZWN9fTwvbGk+CisgICAgeyUgZW5kaWYgJX0KK3slIGVuZGJsb2NrIGxvY2FsYnJlYWRjcnVtYiAlfQorCit7JSBibG9jayBwYWdlZGV0YWlsaW5mb21haW4gJX0KKyAgICA8ZGl2IGNsYXNzPSJyb3cgc3BhbjExIj4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS1oZWFkZXIiPgorICAgICAgICAgICAgeyUgYmxvY2sgdGl0bGUgJX0KKyAgICAgICAgICAgIDxoMT57e3BhY2thZ2UuZnVsbHBhY2thZ2VzcGVjfX08L2gxPgorICAgICAgICAgICAgeyUgZW5kYmxvY2sgdGl0bGUgJX0KKyAgICAgICAgPC9kaXY+IDwhLS0gcGFnZS1oZWFkZXIgLS0+CisgICAgPC9kaXY+IDwhLS0gcm93IHNwYW4xMSBwYWdlLWhlYWRlciAtLT4KKworICAgIHslIGJsb2NrIHR3b2NvbHVtbnMgJX0KKyAgICA8ZGl2IGNsYXNzPSJyb3cgc3BhbjcgdGFiYmFibGUiPgorICAgICAgICB7JSBibG9jayB0YWJjb250ZW50ICV9CisgICAgICAgIHslIGVuZGJsb2NrIHRhYmNvbnRlbnQgJX0KKyAgICA8L2Rpdj4gPCEtLSByb3cgc3BhbjcgLS0+CisKKyAgICA8ZGl2IGNsYXNzPSJyb3cgc3BhbjQgd2VsbCI+CisgICAgICAgIDxoMj5QYWNrYWdlIGluZm9ybWF0aW9uPC9oMj4KKworICAgICAgICA8IS0tIGluZm8gcHJlc2VudGVkIGFzIGRlZmluaXRpb24gbGlzdCAtLT4KKyAgICAgICAgPGRsIGNsYXNzPSJpdGVtLWluZm8iPgorICAgICAgICAgICAgPGR0PgorICAgICAgICAgICAgICAgIFNpemUKKyAgICAgICAgICAgICAgICA8aSBjbGFzcz0iaWNvbi1xdWVzdGlvbi1zaWduIGdldC1oZWxwIiB0aXRsZT0iVGhlIHNpemUgb2YgdGhlIHBhY2thZ2UiPjwvaT4KKyAgICAgICAgICAgIDwvZHQ+CisgICAgICAgICAgICA8ZGQ+CisgICAgICAgICAgICAgICAgeyUgY29tbWVudCAlfQorICAgICAgICAgICAgICAgICAgICBpZiByZWNpcGUgaXMgYWJzZW50LCBmaWxlc2l6ZSBpcyBub3QgMAorICAgICAgICAgICAgICAgIHslIGVuZGNvbW1lbnQgJX0KKyAgICAgICAgICAgICAgICB7JSBpZiBwYWNrYWdlLnJlY2lwZV9pZCA+IDAgJX0KKyAgICAgICAgICAgICAgICAgICAge3twYWNrYWdlLnNpemV8ZmlsdGVyZWRfZmlsZXNpemVmb3JtYXR9fQorICAgICAgICAgICAgICAgICAgICB7JSBpZiB0YXJnZXQuZmlsZV9zaXplICV9CisgICAgICAgICAgICAgICAgICAgICAgICAoe3twYWNrYWdlLnNpemV8bXVsdGlwbHk6MTAwfGRpdmlkZTp0YXJnZXQuZmlsZV9zaXplfX0lIG9mIGluY2x1ZGVkIHBhY2thZ2Ugc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgeyUgZW5kaWYgJX0KKworICAgICAgICAgICAgICAgIHslIGVuZGlmICV9CisgICAgICAgICAgICA8L2RkPgorCisgICAgICAgICAgICA8ZHQ+CisgICAgICAgICAgICAgICAgTGljZW5zZQorICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLXF1ZXN0aW9uLXNpZ24gZ2V0LWhlbHAiIHRpdGxlPSJUaGUgbGljZW5zZSB1bmRlciB3aGljaCB0aGlzIHBhY2thZ2UgaXMgZGlzdHJpYnV0ZWQiPjwvaT4KKyAgICAgICAgICAgIDwvZHQ+CisgICAgICAgICAgICA8ZGQ+e3twYWNrYWdlLmxpY2Vuc2V9fTwvZGQ+CisKKyAgICAgICAgICAgIHslIGNvbW1lbnQgJX0KKyAgICAgICAgICAgICMgUmVtb3ZlZCBwZXIgcmV2aWV3IG9uIDEvMTgvMjAxNCB1bnRpbCBsaWNlbnNlIGRhdGEgcG9wdWxhdGlvbgorICAgICAgICAgICAgIyBwcm9ibGVtc2UgYXJlIHJlc29sdmVkLgorICAgICAgICAgICAgPGR0PgorICAgICAgICAgICAgICAgIExpY2Vuc2UgZmlsZXMKKyAgICAgICAgICAgICAgICA8aSBjbGFzcz0iaWNvbi1xdWVzdGlvbi1zaWduIGdldC1oZWxwIiB0aXRsZT0iUGF0aCB0byB0aGUgbGljZW5zZSBmaWxlcyB0aGF0IGFwcGx5IHRvIHRoZSBwYWNrYWdlIj48L2k+CisgICAgICAgICAgICA8L2R0PgorICAgICAgICAgICAgPGRkPjwvZGQ+CisgICAgICAgICAgICB7JSBlbmRjb21tZW50ICV9CisKKyAgICAgICAgICAgIDxkdD4KKyAgICAgICAgICAgICAgICBSZWNpcGUKKyAgICAgICAgICAgICAgICA8aSBjbGFzcz0iaWNvbi1xdWVzdGlvbi1zaWduIGdldC1oZWxwIiB0aXRsZT0iVGhlIG5hbWUgb2YgdGhlIHJlY2lwZSBidWlsZGluZyB0aGlzIHBhY2thZ2UiPjwvaT4KKyAgICAgICAgICAgIDwvZHQ+CisgICAgICAgICAgICA8ZGQ+CisgICAgICAgICAgICAgICAgeyUgaWYgcGFja2FnZS5yZWNpcGVfaWQgPiAwICV9CisgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9InslIHVybCAicmVjaXBlIiBidWlsZC5pZCBwYWNrYWdlLnJlY2lwZV9pZCAlfSI+IHt7cGFja2FnZS5yZWNpcGUubmFtZX19IDwvYT4KKyAgICAgICAgICAgICAgICB7JSBlbHNlICV9CisgICAgICAgICAgICAgICAgICAgIHt7cGFja2FnZS5yZWNpcGUubmFtZX19CisgICAgICAgICAgICAgICAgeyUgZW5kaWYgJX0KKyAgICAgICAgICAgIDwvZGQ+CisKKyAgICAgICAgICAgIDxkdD4KKyAgICAgICAgICAgICAgICBSZWNpcGUgdmVyc2lvbgorICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLXF1ZXN0aW9uLXNpZ24gZ2V0LWhlbHAiIHRpdGxlPSJUaGUgdmVyc2lvbiBvZiB0aGUgcmVjaXBlIGJ1aWxkaW5nIHRoaXMgcGFja2FnZSI+PC9pPgorICAgICAgICAgICAgPC9kdD4KKyAgICAgICAgICAgIDxkZD57e3BhY2thZ2UucmVjaXBlLnZlcnNpb259fTwvZGQ+CisKKyAgICAgICAgICAgIDxkdD4KKyAgICAgICAgICAgICAgICBMYXllcgorICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLXF1ZXN0aW9uLXNpZ24gZ2V0LWhlbHAiIHRpdGxlPSJUaGUgbmFtZSBvZiB0aGUgbGF5ZXIgcHJvdmlkaW5nIHRoZSByZWNpcGUgdGhhdCBidWlsZHMgdGhpcyBwYWNrYWdlIj48L2k+CisgICAgICAgICAgICA8L2R0PgorICAgICAgICAgICAgPGRkPgorICAgICAgICAgICAgICAgIHt7cGFja2FnZS5yZWNpcGUubGF5ZXJfdmVyc2lvbi5sYXllci5uYW1lfX0KKyAgICAgICAgICAgICAgICB7JSBpZiBwYWNrYWdlLnJlY2lwZS5sYXllcl92ZXJzaW9uLmxheWVyLm5hbWV8Zm9ybWF0X25vbmVfYW5kX3plcm8gIT0gIiIgJX0KKyAgICAgICAgICAgICAgICAgICAgeyUgY29tbWVudCAlfQorICAgICAgICAgICAgICAgICAgICAjIFJlbW92ZWQgcGVyIHRlYW0gbWVldGluZyBvZiAxLzI5LzIwMTQgdW50aWwKKyAgICAgICAgICAgICAgICAgICAgIyBkZWNpc2lvbiBvbiBpbmRleCBzZWFyY2ggYWxnb3JpdGhtCisgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9sYXllcnMub3BlbmVtYmVkZGVkLm9yZyIgIHRhcmdldD0iX2JsYW5rIj4KKyAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9Imljb24tc2hhcmUgZ2V0LWluZm8iPjwvaT4KKyAgICAgICAgICAgICAgICAgICAgPC9hPgorICAgICAgICAgICAgICAgICAgICB7JSBlbmRjb21tZW50ICV9CisgICAgICAgICAgICAgICAgeyUgZW5kaWYgJX0KKyAgICAgICAgICAgIDwvZGQ+CisgICAgICAgICAgICB7JSBpZiBwYWNrYWdlLnJlY2lwZS5sYXllcl92ZXJzaW9uLmJyYW5jaCAlfQorICAgICAgICAgICAgPGR0PgorICAgICAgICAgICAgICAgIExheWVyIGJyYW5jaAorICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLXF1ZXN0aW9uLXNpZ24gZ2V0LWhlbHAiIHRpdGxlPSJUaGUgR2l0IGJyYW5jaCBvZiB0aGUgbGF5ZXIgcHJvdmlkaW5nIHRoZSByZWNpcGUgdGhhdCBidWlsZHMgdGhpcyBwYWNrYWdlIj48L2k+CisgICAgICAgICAgICA8L2R0PgorICAgICAgICAgICAgPGRkPnt7cGFja2FnZS5yZWNpcGUubGF5ZXJfdmVyc2lvbi5icmFuY2h9fTwvZGQ+CisgICAgICAgICAgICB7JSBlbmRpZiAlfQorICAgICAgICAgICAgPGR0PgorICAgICAgICAgICAgICAgIExheWVyIGNvbW1pdAorICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLXF1ZXN0aW9uLXNpZ24gZ2V0LWhlbHAiIHRpdGxlPSJUaGUgR2l0IGNvbW1pdCBvZiB0aGUgbGF5ZXIgcHJvdmlkaW5nIHRoZSByZWNpcGUgdGhhdCBidWlsZHMgdGhpcyBwYWNrYWdlIj48L2k+CisgICAgICAgICAgICA8L2R0PgorCisgICAgICAgICAgICA8ZGQgY2xhc3M9ImlzY29tbWl0Ij57e3BhY2thZ2UucmVjaXBlLmxheWVyX3ZlcnNpb24uY29tbWl0fX08L2RkPgorCisgICAgICAgIDwvZGw+CisgICAgPC9kaXY+IDwhLS0gcm93NCB3ZWxsIC0tPgorICAgIHslIGVuZGJsb2NrIHR3b2NvbHVtbnMgJX0KK3slIGVuZGJsb2NrIHBhZ2VkZXRhaWxpbmZvbWFpbiAlfQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9wYWNrYWdlX2luY2x1ZGVkX2RlcGVuZGVuY2llcy5odG1sIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9wYWNrYWdlX2luY2x1ZGVkX2RlcGVuZGVuY2llcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MmNhNjkKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL3BhY2thZ2VfaW5jbHVkZWRfZGVwZW5kZW5jaWVzLmh0bWwKQEAgLTAsMCArMSwxMTAgQEAKK3slIGV4dGVuZHMgInBhY2thZ2VfZGV0YWlsX2Jhc2UuaHRtbCIgJX0KK3slIGxvYWQgcHJvamVjdHRhZ3MgJX0KKworeyUgYmxvY2sgdGl0bGUgJX0KKyAgICA8aDE+CisgICAgICAgIHt7cGFja2FnZS5mdWxscGFja2FnZXNwZWN9fQorICAgICAgICA8c2NyaXB0PiBmbXRBbGlhc0hlbHAoInt7cGFja2FnZS5uYW1lfX0iLCAie3twYWNrYWdlLmFsaWFzfX0iLCBmYWxzZSkgPC9zY3JpcHQ+CisgICAgICAgIDxzbWFsbD4oe3t0YXJnZXQudGFyZ2V0fX0pPC9zbWFsbD4KKyAgICA8L2gxPgoreyUgZW5kYmxvY2sgdGl0bGUgJX0KKworeyUgYmxvY2sgdGFiY29udGVudCAlfQorICAgIHslIHdpdGggcGFja2FnZUZpbGVDb3VudD1wYWNrYWdlLmJ1aWxkZmlsZWxpc3RfcGFja2FnZS5jb3VudCAlfQorICAgIHslIGluY2x1ZGUgInBhY2thZ2VfaW5jbHVkZWRfdGFicy5odG1sIiB3aXRoIGFjdGl2ZV90YWI9ImRlcGVuZGVuY2llcyIgJX0KKyAgICA8ZGl2IGNsYXNzPSJ0YWItY29udGVudCI+CisgICAgICAgPGRpdiBjbGFzcz0idGFiLXBhbmUgYWN0aXZlIiBpZD0iZGVwZW5kZW5jaWVzIj4KKyAgICAgICB7JSBpZm5vdGVxdWFsIHJ1bnRpbWVfZGVwc3xsZW5ndGggMCAlfQorICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJ0YWJsZSB0YWJsZS1ib3JkZXJlZCB0YWJsZS1ob3ZlciI+CisgICAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGg+UGFja2FnZTwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGg+VmVyc2lvbjwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9J3NpemVjb2wgc3BhbjInPlNpemU8L3RoPgorICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgICAgPHRib2R5PgorCQkJCQl7JSBmb3IgcnVudGltZV9kZXAgaW4gcnVudGltZV9kZXBzICV9CisgICAgICAgICAgICAgICAgICAgICAgICA8dHIge3tydW50aW1lX2RlcC5zaXplfGZvcm1hdF92cGFja2FnZV9yb3djbGFzc319ID4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7JSBpZiBydW50aW1lX2RlcC5zaXplICE9IC0xICV9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9InslIHVybCAncGFja2FnZV9pbmNsdWRlZF9kZXRhaWwnIGJ1aWxkLmlkIHRhcmdldC5pZCBydW50aW1lX2RlcC5kZXBlbmRzX29uX2lkICV9Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7cnVudGltZV9kZXAubmFtZX19CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNjcmlwdD5mbXRBbGlhc0hlbHAoInt7cnVudGltZV9kZXAubmFtZX19IiwgInt7cnVudGltZV9kZXAuYWxpYXN9fSIsIHRydWUpPC9zY3JpcHQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7JSBlbHNlICV9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3J1bnRpbWVfZGVwLm5hbWV8Zm9ybWF0X3ZwYWNrYWdlX25hbWVoZWxwfX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHslIGVuZGlmICV9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7cnVudGltZV9kZXAudmVyc2lvbn19Jm5ic3A7PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9J3NpemVjb2wnPnt7cnVudGltZV9kZXAuc2l6ZXxmaWx0ZXJlZF9maWxlc2l6ZWZvcm1hdH19Jm5ic3A7PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisJCQkJCXslIGVuZGZvciAlfQorICAgICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgeyUgZWxzZSAlfQorICAgICAgICAgICAgPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtaW5mbyI+CisgICAgICAgICAgICAgICAgPHN0cm9uZz57e3BhY2thZ2UuZnVsbHBhY2thZ2VzcGVjfX08L3N0cm9uZz4gaGFzIG5vIHJ1bnRpbWUgZGVwZW5kZW5jaWVzLgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgIHslIGVuZGlmbm90ZXF1YWwgJX0KKworICAgICAgICB7JSBpZm5vdGVxdWFsIG90aGVyX2RlcHN8bGVuZ3RoIDAgJX0KKyAgICAgICAgICAgIDxoMz5PdGhlciBydW50aW1lIHJlbGF0aW9uc2hpcHM8L2gzPgorICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJ0YWJsZSB0YWJsZS1ib3JkZXJlZCB0YWJsZS1ob3ZlciI+CisgICAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGg+UGFja2FnZTwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGg+VmVyc2lvbjwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9J3NpemVjb2wgc3BhbjInPlNpemU8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLXF1ZXN0aW9uLXNpZ24gZ2V0LWhlbHAiIHRpdGxlPSJGaXZlIHJlbGF0aW9uc2hpcCB0eXBlcyBleGlzdDogcmVjb21tZW5kcywgc3VnZ2VzdHMsIHByb3ZpZGVzLCByZXBsYWNlcyBhbmQgY29uZmxpY3RzIj48L2k+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwIHR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgICA8dGJvZHk+CisJCQkJCXslIGZvciBvdGhlcl9kZXAgaW4gb3RoZXJfZGVwcyAlfQorICAgICAgICAgICAgICAgICAgICAgICAgeyUgaWYgb3RoZXJfZGVwLmluc3RhbGxlZCAlfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciB7e290aGVyX2RlcC5zaXplfGZvcm1hdF92cGFja2FnZV9yb3djbGFzc319PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7JSBpZiBvdGhlcl9kZXAuc2l6ZSAhPSAtMSAlfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJ7JSB1cmwgJ3BhY2thZ2VfaW5jbHVkZWRfZGV0YWlsJyBidWlsZC5pZCB0YXJnZXQuaWQgb3RoZXJfZGVwLmRlcGVuZHNfb25faWQgJX0iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7b3RoZXJfZGVwLm5hbWV9fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzY3JpcHQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm10QWxpYXNIZWxwKCJ7e290aGVyX2RlcC5uYW1lfX0iLCJ7e290aGVyX2RlcC5hbGlhc319IiwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NjcmlwdD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyUgZWxzZSAlfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7b3RoZXJfZGVwLm5hbWV8Zm9ybWF0X3ZwYWNrYWdlX25hbWVoZWxwfX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHslIGVuZGlmICV9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e290aGVyX2RlcC52ZXJzaW9ufX0mbmJzcDs8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9J3NpemVjb2wnPnt7b3RoZXJfZGVwLnNpemV8ZmlsdGVyZWRfZmlsZXNpemVmb3JtYXR9fSZuYnNwOzwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7b3RoZXJfZGVwLmRlcF90eXBlX2Rpc3BsYXl9fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCBob3Zlci1oZWxwIiB0aXRsZT0ie3tvdGhlcl9kZXAuZGVwX3R5cGVfaGVscH19IiA+PC9pPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICAgICAgICB7JSBlbHNlICV9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJtdXRlZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e290aGVyX2RlcC5uYW1lfX08L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tvdGhlcl9kZXAudmVyc2lvbn19PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7b3RoZXJfZGVwLmRlcF90eXBlX2Rpc3BsYXl9fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCBob3Zlci1oZWxwIiB0aXRsZT0ie3tvdGhlcl9kZXAuZGVwX3R5cGVfaGVscH19IiA+PC9pPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICAgICAgICB7JSBlbmRpZiAlfQorCQkJCQl7JSBlbmRmb3IgJX0KKyAgICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgeyUgZW5kaWZub3RlcXVhbCAlfQorICAgICAgICA8L2Rpdj4gPCEtLSBlbmQgdGFiLXBhbmUgLS0+CisgICAgPC9kaXY+IDwhLS0gZW5kIHRhYiBjb250ZW50IC0tPgorICAgIHslIGVuZHdpdGggJX0KK3slIGVuZGJsb2NrIHRhYmNvbnRlbnQgJX0KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvcGFja2FnZV9pbmNsdWRlZF9kZXRhaWwuaHRtbCBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvcGFja2FnZV9pbmNsdWRlZF9kZXRhaWwuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmFhMjZlCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9wYWNrYWdlX2luY2x1ZGVkX2RldGFpbC5odG1sCkBAIC0wLDAgKzEsNDQgQEAKK3slIGV4dGVuZHMgInBhY2thZ2VfZGV0YWlsX2Jhc2UuaHRtbCIgJX0KK3slIGxvYWQgcHJvamVjdHRhZ3MgJX0KKworeyUgYmxvY2sgdGl0bGUgJX0KKyAgICAgICAgPGgxPgorICAgICAgICAgICAge3twYWNrYWdlLmZ1bGxwYWNrYWdlc3BlY319CisgICAgICAgICAgICA8c2NyaXB0PgorICAgICAgICAgICAgICAgIGZtdEFsaWFzSGVscCgie3twYWNrYWdlLm5hbWV9fSIsICJ7e3BhY2thZ2UuYWxpYXN9fSIsIGZhbHNlKQorICAgICAgICAgICAgPC9zY3JpcHQ+CisgICAgICAgICAgICA8c21hbGw+KHt7dGFyZ2V0LnRhcmdldH19KTwvc21hbGw+CisgICAgICAgIDwvaDE+Cit7JSBlbmRibG9jayB0aXRsZSAlfQorCit7JSBibG9jayB0YWJjb250ZW50ICV9Cit7JSB3aXRoIHBhY2thZ2VGaWxlQ291bnQ9cGFja2FnZS5idWlsZGZpbGVsaXN0X3BhY2thZ2UuY291bnQgJX0KKyAgICB7JSBpbmNsdWRlICJwYWNrYWdlX2luY2x1ZGVkX3RhYnMuaHRtbCIgd2l0aCBhY3RpdmVfdGFiPSJkZXRhaWwiICV9CisgICAgPGRpdiBjbGFzcz0idGFiLWNvbnRlbnQiPgorICAgICAgICA8ZGl2IGNsYXNzPSJ0YWItcGFuZSBhY3RpdmUiIGlkPSJmaWxlcyI+CisgICAgICAgICAgICB7JSBpZiBwYWNrYWdlRmlsZUNvdW50ID4gMCAlfQorICAgICAgICAgICAgeyUgaW5jbHVkZSAidGFibGVzb3J0Lmh0bWwiICV9CisgICAgICAgICAgICAgICAgPHRib2R5PgorCQkJCQl7JSBmb3IgZmlsZSBpbiBvYmplY3RzICV9CisgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJwYXRoIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0ieyUgdXJsICdkaXJpbmZvX2ZpbGVwYXRoJyBidWlsZC5pZCB0YXJnZXQuaWQgZmlsZS5wYXRoICV9Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZmlsZS5wYXRofX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmlsZXNpemUgc2l6ZWNvbCIgPnt7ZmlsZS5zaXplfGZpbHRlcmVkX2ZpbGVzaXplZm9ybWF0fX08L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKwkJCQkJeyUgZW5kZm9yICV9CisgICAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGFibGU+CisKKyAgICAgICAgICAgIHslIGVsc2UgJX0KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LWluZm8iPgorICAgICAgICAgICAgICAgIDxzdHJvbmc+e3twYWNrYWdlLmZ1bGxwYWNrYWdlc3BlY319PC9zdHJvbmc+IGRvZXMgbm90IGdlbmVyYXRlIGFueSBmaWxlcy4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgeyUgZW5kaWYgJX0KKyAgICAgICAgPC9kaXY+IDwhLS0gZW5kIHRhYi1wYW5lIC0tPgorICAgIDwvZGl2PiA8IS0tIGVuZCB0YWIgY29udGVudCAtLT4KKworeyUgZW5kd2l0aCAlfQoreyUgZW5kYmxvY2sgdGFiY29udGVudCAlfQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9wYWNrYWdlX2luY2x1ZGVkX3JldmVyc2VfZGVwZW5kZW5jaWVzLmh0bWwgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL3BhY2thZ2VfaW5jbHVkZWRfcmV2ZXJzZV9kZXBlbmRlbmNpZXMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2M4YjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9wYWNrYWdlX2luY2x1ZGVkX3JldmVyc2VfZGVwZW5kZW5jaWVzLmh0bWwKQEAgLTAsMCArMSw1MCBAQAoreyUgZXh0ZW5kcyAicGFja2FnZV9kZXRhaWxfYmFzZS5odG1sIiAlfQoreyUgbG9hZCBwcm9qZWN0dGFncyAlfQorCit7JSBibG9jayB0aXRsZSAlfQorICAgICAgICA8aDE+CisgICAgICAgICAgICB7e3BhY2thZ2UuZnVsbHBhY2thZ2VzcGVjfX0KKyAgICAgICAgICAgIDxzY3JpcHQ+IGZtdEFsaWFzSGVscCgie3twYWNrYWdlLm5hbWV9fSIsICJ7e3BhY2thZ2UuYWxpYXN9fSIsIGZhbHNlKSA8L3NjcmlwdD4KKyAgICAgICAgICAgIDxzbWFsbD4oe3t0YXJnZXQudGFyZ2V0fX0pPC9zbWFsbD4KKyAgICAgICAgPC9oMT4KK3slIGVuZGJsb2NrIHRpdGxlICV9CisKK3slIGJsb2NrIHRhYmNvbnRlbnQgJX0KKyAgICB7JSB3aXRoIHBhY2thZ2VGaWxlQ291bnQ9cGFja2FnZS5idWlsZGZpbGVsaXN0X3BhY2thZ2UuY291bnQgJX0KKyAgICB7JSBpbmNsdWRlICJwYWNrYWdlX2luY2x1ZGVkX3RhYnMuaHRtbCIgd2l0aCBhY3RpdmVfdGFiPSJyZXZlcnNlIiAlfQorICAgIDxkaXYgY2xhc3M9InRhYi1jb250ZW50Ij4KKyAgICAgICAgPGRpdiBjbGFzcz0idGFiLXBhbmUgYWN0aXZlIiBpZD0iYnJvdWdodC1pbi1ieSI+CisKKyAgICAgICAgeyUgaWZlcXVhbCByZXZlcnNlX2NvdW50IDAgJX0KKyAgICAgICAgICAgPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtaW5mbyI+CisgICAgICAgICAgICAgICAgPHN0cm9uZz57e3BhY2thZ2UuZnVsbHBhY2thZ2VzcGVjfX08L3N0cm9uZz4gaGFzIG5vIHJldmVyc2UgcnVudGltZSBkZXBlbmRlbmNpZXMuCisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgeyUgZWxzZSAlfQorICAgICAgICAgICAgeyUgaW5jbHVkZSAidGFibGVzb3J0Lmh0bWwiICV9CisgICAgICAgICAgICAgICAgPHRib2R5PgorCQkJCQl7JSBmb3IgcmV2ZXJzZV9kZXAgaW4gb2JqZWN0cyAlfQorICAgICAgICAgICAgICAgICAgICAgICAgPHRyIHslIGlmIHJldmVyc2VfZGVwLnNpemUgJX17e3JldmVyc2VfZGVwLnNpemV8Zm9ybWF0X3ZwYWNrYWdlX3Jvd2NsYXNzfX17JWVuZGlmJX0gPgorICAgICAgICAgICAgICAgICAgICAgICAgeyUgaWYgcmV2ZXJzZV9kZXAuc2l6ZSAhPSAtMSAlfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0ieyUgdXJsICdwYWNrYWdlX2luY2x1ZGVkX2RldGFpbCcgYnVpbGQuaWQgdGFyZ2V0LmlkIHJldmVyc2VfZGVwLnBhY2thZ2VfaWQgJX0iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tyZXZlcnNlX2RlcC5wYWNrYWdlLm5hbWV9fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzY3JpcHQ+Zm10QWxpYXNIZWxwKCJ7e3JldmVyc2VfZGVwLnBhY2thZ2UubmFtZX19IiwgInt7cmV2ZXJzZV9kZXAuYWxpYXN9fSIsIHRydWUpPC9zY3JpcHQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7JSBlbHNlICV9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3JldmVyc2VfZGVwLm5hbWV8Zm9ybWF0X3ZwYWNrYWdlX25hbWVoZWxwfX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHslIGVuZGlmICV9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tyZXZlcnNlX2RlcC5wYWNrYWdlLnZlcnNpb259fSZuYnNwOzwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSdzaXplY29sJz57e3JldmVyc2VfZGVwLnBhY2thZ2Uuc2l6ZXxmaWx0ZXJlZF9maWxlc2l6ZWZvcm1hdH19Jm5ic3A7PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisJCQkJCXslIGVuZGZvciAlfQorICAgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICB7JSBlbmRpZmVxdWFsICV9CisgICAgICAgIDwvZGl2PiA8IS0tIGVuZCB0YWItcGFuZSAtLT4KKyAgICA8L2Rpdj4gPCEtLSBlbmQgdGFiIGNvbnRlbnQgLS0+CisgICAgeyUgZW5kd2l0aCAlfQoreyUgZW5kYmxvY2sgdGFiY29udGVudCAlfQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9wYWNrYWdlX2luY2x1ZGVkX3RhYnMuaHRtbCBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvcGFja2FnZV9pbmNsdWRlZF90YWJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU4YWE4OAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvcGFja2FnZV9pbmNsdWRlZF90YWJzLmh0bWwKQEAgLTAsMCArMSwzMyBAQAorCisgICAgPHVsIGNsYXNzPSJuYXYgbmF2LXBpbGxzIj4KKyAgICB7JSBpZiBhY3RpdmVfdGFiID09ICJkZXRhaWwiICV9CisgICAgICAgIDxsaSBjbGFzcz0iYWN0aXZlIj4KKyAgICB7JSBlbHNlICV9CisgICAgICAgIDxsaSBjbGFzcz0iIj4KKyAgICB7JSBlbmRpZiAlfQorICAgICAgICAgICAgPGEgaHJlZj0ieyUgdXJsICdwYWNrYWdlX2luY2x1ZGVkX2RldGFpbCcgYnVpbGQuaWQgdGFyZ2V0LmlkIHBhY2thZ2UuaWQgJX0iPgorICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLXF1ZXN0aW9uLXNpZ24gZ2V0LWhlbHAiIHRpdGxlPSJUaGUgZmlsZXMgdGhpcyBwYWNrYWdlIGFkZHMgdG8gdGhlIGltYWdlIHJvb3QgZmlsZSBzeXN0ZW0iPjwvaT4KKyAgICAgICAgICAgICAgICBGaWxlcyBpbiByb290IGZpbGUgc3lzdGVtICh7e3BhY2thZ2VGaWxlQ291bnR9fSkKKyAgICAgICAgICAgIDwvYT4KKyAgICAgICAgPC9saT4KKyAgICB7JSBpZiBhY3RpdmVfdGFiID09ICJkZXBlbmRlbmNpZXMiICV9CisgICAgICAgIDxsaSBjbGFzcz0iYWN0aXZlIj4KKyAgICB7JSBlbHNlICV9CisgICAgICAgIDxsaSBjbGFzcz0iIj4KKyAgICB7JSBlbmRpZiAlfQorICAgICAgICAgICAgPGEgaHJlZj0ieyUgdXJsICdwYWNrYWdlX2luY2x1ZGVkX2RlcGVuZGVuY2llcycgYnVpbGQuaWQgdGFyZ2V0LmlkIHBhY2thZ2UuaWQgJX0iPgorICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLXF1ZXN0aW9uLXNpZ24gZ2V0LWhlbHAiIHRpdGxlPSJQYWNrYWdlIHJ1bnRpbWUgZGVwZW5kZW5jaWVzIj48L2k+CisgICAgICAgICAgICAgICAgUnVudGltZSBkZXBlbmRlbmNpZXMgKHt7ZGVwZW5kZW5jeV9jb3VudH19KQorICAgICAgICAgICAgPC9hPgorICAgICAgICA8L2xpPgorICAgIHslIGlmIGFjdGl2ZV90YWIgPT0gInJldmVyc2UiICV9CisgICAgICAgIDxsaSBjbGFzcz0iYWN0aXZlIj4KKyAgICB7JSBlbHNlICV9CisgICAgICAgIDxsaSBjbGFzcz0iIj4KKyAgICB7JSBlbmRpZiAlfQorICAgICAgICAgICAgPGEgaHJlZj0ieyUgdXJsICdwYWNrYWdlX2luY2x1ZGVkX3JldmVyc2VfZGVwZW5kZW5jaWVzJyBidWlsZC5pZCB0YXJnZXQuaWQgcGFja2FnZS5pZCAlfSI+CisgICAgICAgICAgICAgICAgPGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCIgdGl0bGU9IlRoZSBwYWNrYWdlIHJ1bnRpbWUgcmV2ZXJzZSBkZXBlbmRlbmNpZXMgKGkuZS4gdGhlIHBhY2thZ2VzIGluIHRoaXMgaW1hZ2UgdGhhdCBkZXBlbmQgb24gdGhpcyBwYWNrYWdlKS4gUmV2ZXJzZSBkZXBlbmRlbmNpZXMgcmVmbGVjdCBvbmx5IHRoZSAnZGVwZW5kcycgZGVwZW5kZW5jeSB0eXBlIj48L2k+CisgICAgICAgICAgICAgICAgUmV2ZXJzZSBydW50aW1lIGRlcGVuZGVuY2llcyAoe3tyZXZlcnNlX2NvdW50fX0pCisgICAgICAgICAgICA8L2E+CisgICAgICAgIDwvbGk+CisgICAgPC91bD4KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvcHJvamVjdC5odG1sIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9wcm9qZWN0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgzNTRmZAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvcHJvamVjdC5odG1sCkBAIC0wLDAgKzEsMTMwIEBACit7JSBleHRlbmRzICJiYXNlcHJvamVjdHBhZ2UuaHRtbCIgJX0KKworeyUgbG9hZCBwcm9qZWN0dGFncyAlfQoreyUgbG9hZCBodW1hbml6ZSAlfQoreyUgbG9hZCBzdGF0aWMgJX0KKworeyUgYmxvY2sgcHJvamVjdGluZm9tYWluICV9CisKKzxzY3JpcHQgc3JjPSJ7JSBzdGF0aWMgJ2pzL2xheWVyRGVwc01vZGFsLmpzJyAlfSI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ieyUgc3RhdGljICdqcy9wcm9qZWN0cGFnZS5qcycgJX0iPjwvc2NyaXB0PgorPHNjcmlwdD4KKyAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCl7CisgICAgdmFyIGN0eCA9IHsKKyAgICAgIHRlc3RSZWxlYXNlQ2hhbmdlVXJsOiAieyUgdXJsICd4aHJfdGVzdHJlbGVhc2VjaGFuZ2UnIHByb2plY3QuaWQgJX0iLAorICAgIH07CisKKyAgICB0cnkgeworICAgICAgcHJvamVjdFBhZ2VJbml0KGN0eCk7CisgICAgfSBjYXRjaCAoZSkgeworICAgICAgZG9jdW1lbnQud3JpdGUoIlNvcnJ5LCBBbiBlcnJvciBoYXMgb2NjdXJyZWQgbG9hZGluZyB0aGlzIHBhZ2UiKTsKKyAgICAgIGNvbnNvbGUud2FybihlKTsKKyAgICB9CisgIH0pOworPC9zY3JpcHQ+CisKKzxkaXYgaWQ9ImNoYW5nZS1yZWxlYXNlLW1vZGFsIiBjbGFzcz0ibW9kYWwgaGlkZSBmYWRlIGluIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1sYWJlbGxlZGJ5PSJjaGFuZ2UtcmVsZWFzZS1tb2RhbCIgYXJpYS1oaWRkZW49ImZhbHNlIj4KKyAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4KKyAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+eDwvYnV0dG9uPgorICAgIDxoMz5DaGFuZ2luZyBZb2N0byBQcm9qZWN0IHJlbGVhc2UgdG8gPHNwYW4gY2xhc3M9InByb3Bvc2VkLXJlbGVhc2UtY2hhbmdlLW5hbWUiPjwvc3Bhbj48L2gzPgorICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+CisgICAgPHA+VGhlIGZvbGxvd2luZyBhZGRlZCBsYXllcnMgZG8gbm90IGV4aXN0IGZvciA8c3BhbiBjbGFzcz0icHJvcG9zZWQtcmVsZWFzZS1jaGFuZ2UtbmFtZSI+PC9zcGFuPjogPC9wPgorICAgIDx1bCBpZD0ibGF5ZXJzLXRvLXJlbW92ZS1saXN0Ij4KKyAgICA8L3VsPgorICAgIDxwPklmIHlvdSBjaGFuZ2UgdGhlIFlvY3RvIFByb2plY3QgcmVsZWFzZSB0byA8c3BhbiBjbGFzcz0icHJvcG9zZWQtcmVsZWFzZS1jaGFuZ2UtbmFtZSI+PC9zcGFuPiwgdGhlIGFib3ZlIGxheWVycyB3aWxsIGJlIGRlbGV0ZWQgZnJvbSB5b3VyIGFkZGVkIGxheWVycy48L3A+CisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPgorICAgIDxidXR0b24gaWQ9ImNoYW5nZS1yZWxlYXNlLWFuZC1ybS1sYXllcnMiIGRhdGEtZGlzbWlzcz0ibW9kYWwiIHR5cGU9InN1Ym1pdCIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSI+Q2hhbmdlIHJlbGVhc2UgYW5kIGRlbGV0ZSBsYXllcnM8L2J1dHRvbj4KKyAgICA8YnV0dG9uIGNsYXNzPSJidG4iIGRhdGEtZGlzbWlzcz0ibW9kYWwiIGFyaWEtaGlkZGVuPSJ0cnVlIj5DYW5jZWw8L2J1dHRvbj4KKyAgPC9kaXY+Cis8L2Rpdj4KKworCis8ZGl2IGNsYXNzPSJyb3ctZmx1aWQiIGlkPSJwcm9qZWN0LXBhZ2UiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPgorICA8ZGl2IGNsYXNzPSJzcGFuNiI+CisgICAgPGRpdiBjbGFzcz0id2VsbCB3ZWxsLXRyYW5zcGFyZW50IiBpZD0ibWFjaGluZS1zZWN0aW9uIj4KKyAgICAgIDxoMz5NYWNoaW5lPC9oMz4KKworICAgICAgPHAgY2xhc3M9ImxlYWQiPjxzcGFuIGlkPSJwcm9qZWN0LW1hY2hpbmUtbmFtZSI+PC9zcGFuPiA8aSB0aXRsZT0iIiBkYXRhLW9yaWdpbmFsLXRpdGxlPSIiIGlkPSJjaGFuZ2UtbWFjaGluZS10b2dnbGUiIGNsYXNzPSJpY29uLXBlbmNpbCI+PC9pPjwvcD4KKworICAgICAgPGZvcm0gaWQ9InNlbGVjdC1tYWNoaW5lLWZvcm0iIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KKyAgICAgICAgPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtaW5mbyI+CisgICAgICAgICAgPHN0cm9uZz5NYWNoaW5lIGNoYW5nZXMgaGF2ZSBhIGJpZyBpbXBhY3Qgb24gYnVpbGQgb3V0Y29tZS48L3N0cm9uZz4gWW91IGNhbm5vdCByZWFsbHkgY29tcGFyZSB0aGUgYnVpbGRzIGZvciB0aGUgbmV3IG1hY2hpbmUgd2l0aCB0aGUgcHJldmlvdXMgb25lcy4KKyAgICAgICAgPC9kaXY+CisKKyAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtYXBwZW5kIj4KKyAgICAgICAgICA8aW5wdXQgaWQ9Im1hY2hpbmUtY2hhbmdlLWlucHV0IiBhdXRvY29tcGxldGU9Im9mZiIgdmFsdWU9IiIgZGF0YS1wcm92aWRlPSJ0eXBlYWhlYWQiIGRhdGEtbWlubGVuZ3RoPSIxIiBkYXRhLWF1dG9jb21wbGV0ZT0ib2ZmIiB0eXBlPSJ0ZXh0Ij4KKyAgICAgICAgICAgIDxidXR0b24gaWQ9Im1hY2hpbmUtY2hhbmdlLWJ0biIgY2xhc3M9ImJ0biIgdHlwZT0iYnV0dG9uIj5TYXZlPC9idXR0b24+IDxhIGhyZWY9IiMiIGlkPSJjYW5jZWwtbWFjaGluZS1jaGFuZ2UiIGNsYXNzPSJidG4gYnRuLWxpbmsiPkNhbmNlbDwvYT4KKyAgICAgICAgPC9kaXY+CisKKyAgICAgICAgPHA+PGEgaHJlZj0ieyUgdXJsICdwcm9qZWN0bWFjaGluZXMnIHByb2plY3QuaWQgJX0iIGNsYXNzPSJsaW5rIj5WaWV3IGNvbXBhdGlibGUgbWFjaGluZXM8L2E+PC9wPgorICAgICAgPC9mb3JtPgorICAgIDwvZGl2PgorCisgICAgPGRpdiBjbGFzcz0id2VsbCB3ZWxsLXRyYW5zcGFyZW50Ij4KKyAgICAgIDxoMz5Nb3N0IGJ1aWx0IHJlY2lwZXM8L2gzPgorCisgICAgICA8ZGl2IGNsYXNzPSJhbGVydCBhbGVydC1pbmZvIiBzdHlsZT0iZGlzcGxheTpub25lIiBpZD0ibm8tbW9zdC1idWlsdCI+CisgICAgICAgIDxzcGFuIGNsYXNzPSJsZWFkIj5Zb3UgaGF2ZW4ndCBidWlsdCBhbnkgcmVjaXBlcyB5ZXQ8L3NwYW4+CisgICAgICAgIDxwIHN0eWxlPSJtYXJnaW4tdG9wOiAxMHB4OyI+PGEgaHJlZj0ieyUgdXJsICdwcm9qZWN0dGFyZ2V0cycgcHJvamVjdC5pZCAlfSI+Q2hvb3NlIGEgcmVjaXBlIHRvIGJ1aWxkPC9hPjwvcD4KKyAgICAgIDwvZGl2PgorCisgICAgICA8dWwgY2xhc3M9InVuc3R5bGVkIGNvbmZpZ3VyYXRpb24tbGlzdCIgaWQ9ImZyZXEtYnVpbGQtbGlzdCI+CisgICAgICA8L3VsPgorICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IiBpZD0iZnJlcS1idWlsZC1idG4iIGRpc2FibGVkPSJkaXNhYmxlZCI+QnVpbGQgc2VsZWN0ZWQgcmVjaXBlczwvYnV0dG9uPgorICAgIDwvZGl2PgorCisgICAgPGRpdiBjbGFzcz0id2VsbCB3ZWxsLXRyYW5zcGFyZW50Ij4KKyAgICAgIDxoMz5Qcm9qZWN0IHJlbGVhc2U8L2gzPgorCisgICAgICA8cCBjbGFzcz0ibGVhZCI+PHNwYW4gaWQ9InByb2plY3QtcmVsZWFzZS10aXRsZSI+PC9zcGFuPiA8aSB0aXRsZT0iIiBkYXRhLW9yaWdpbmFsLXRpdGxlPSIiIGlkPSJyZWxlYXNlLWNoYW5nZS10b2dnbGUiIGNsYXNzPSJpY29uLXBlbmNpbCI+PC9pPjwvcD4KKworICAgICAgPGZvcm0gY2xhc3M9ImZvcm0taW5saW5lIiBpZD0iY2hhbmdlLXJlbGVhc2UtZm9ybSIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgorICAgICAgICA8c2VsZWN0Pjwvc2VsZWN0PgorICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4iIHN0eWxlPSJtYXJnaW4tbGVmdDo1cHg7IiBpZD0iY2hhbmdlLXJlbGVhc2UtYnRuIj5DaGFuZ2U8L2J1dHRvbj4gPGEgaHJlZj0iIyIgaWQ9ImNhbmNlbC1yZWxlYXNlLWNoYW5nZSIgY2xhc3M9ImJ0biBidG4tbGluayI+Q2FuY2VsPC9hPgorICAgICAgPC9mb3JtPgorICAgIDwvZGl2PgorICA8L2Rpdj4KKworICA8ZGl2IGNsYXNzPSJzcGFuNiI+CisgICAgPGRpdiBjbGFzcz0id2VsbCB3ZWxsLXRyYW5zcGFyZW50IiBpZD0ibGF5ZXItY29udGFpbmVyIj4KKyAgICAgIDxoMz5MYXllcnMgPHNwYW4gY2xhc3M9Im11dGVkIGNvdW50ZXIiPig8c3BhbiBpZD0icHJvamVjdC1sYXllcnMtY291bnQiPjwvc3Bhbj4pPC9zcGFuPgorICAgICAgICA8aSBkYXRhLW9yaWdpbmFsLXRpdGxlPSJPcGVuRW1iZWRkZWQgb3JnYW5pc2VzIG1ldGFkYXRhIGludG8gbW9kdWxlcyBjYWxsZWQgJ2xheWVycycuIExheWVycyBhbGxvdyB5b3UgdG8gaXNvbGF0ZSBkaWZmZXJlbnQgdHlwZXMgb2YgY3VzdG9taXphdGlvbnMgZnJvbSBlYWNoIG90aGVyLiA8YSBocmVmPSdodHRwOi8vd3d3LnlvY3RvcHJvamVjdC5vcmcvZG9jcy9jdXJyZW50L2Rldi1tYW51YWwvZGV2LW1hbnVhbC5odG1sI3VuZGVyc3RhbmRpbmctYW5kLWNyZWF0aW5nLWxheWVycycgdGFyZ2V0PSdfYmxhbmsnPk1vcmUgb24gbGF5ZXJzPC9hPiIgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCBoZWFkaW5nLWhlbHAiIHRpdGxlPSIiPjwvaT4KKyAgICAgIDwvaDM+CisKKyAgICAgIDxkaXYgY2xhc3M9ImFsZXJ0IGxlYWQiIGlkPSJuby1sYXllcnMtaW4tcHJvamVjdCIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+CisgICAgICAgIFlvdSBuZWVkIHRvIGFkZCBzb21lIGxheWVycy4gRm9yIHRoYXQgeW91IGNhbjoKKyAgICAgICAgPHVsPgorICAgICAgICAgIDxsaT48YSBocmVmPSJ7JSB1cmwgJ3Byb2plY3RsYXllcnMnIHByb2plY3QuaWQgJX0iPlZpZXcgYWxsIGxheWVycyBjb21wYXRpYmxlIHdpdGggdGhpcyBwcm9qZWN0PC9hPjwvbGk+CisgICAgICAgICAgPGxpPjxhIGhyZWY9InslIHVybCAnaW1wb3J0bGF5ZXInIHByb2plY3QuaWQgJX0iPkltcG9ydCBhIGxheWVyPC9hPjwvbGk+CisgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cueW9jdG9wcm9qZWN0Lm9yZy9kb2NzL2N1cnJlbnQvZGV2LW1hbnVhbC9kZXYtbWFudWFsLmh0bWwjdW5kZXJzdGFuZGluZy1hbmQtY3JlYXRpbmctbGF5ZXJzIiB0YXJnZXQ9Il9ibGFuayI+UmVhZCBhYm91dCBsYXllcnMgaW4gdGhlIGRvY3VtZW50YXRpb248L2E+PC9saT4KKyAgICAgICAgPC91bD4KKyAgICAgICAgPHA+T3IgdHlwZSBhIGxheWVyIG5hbWUgYmVsb3cuPC9wPgorICAgICAgPC9kaXY+CisKKyAgICAgIDxmb3JtIHN0eWxlPSJtYXJnaW4tdG9wOjIwcHgiPgorICAgICAgICA8IS0tZGl2IGNsYXNzPSJjb250cm9sLWdyb3VwIGVycm9yIi0tPgorCisgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWFwcGVuZCI+CisgICAgICAgICAgPGlucHV0IGlkPSJsYXllci1hZGQtaW5wdXQiIGF1dG9jb21wbGV0ZT0ib2ZmIiBwbGFjZWhvbGRlcj0iVHlwZSBhIGxheWVyIG5hbWUiIGRhdGEtbWlubGVuZ3RoPSIxIiBkYXRhLWF1dG9jb21wbGV0ZT0ib2ZmIiBkYXRhLXByb3ZpZGU9InR5cGVhaGVhZCIgZGF0YS1zb3VyY2U9IiIgdHlwZT0idGV4dCI+CisgICAgICAgICAgICA8YnV0dG9uIGlkPSJhZGQtbGF5ZXItYnRuIiBjbGFzcz0iYnRuIiBkaXNhYmxlZD5BZGQ8L2J1dHRvbj4KKyAgICAgICAgPC9kaXY+CisKKyAgICAgICAgPGRpdiBpZD0iaW1wb3J0LWFsZXJ0IiBjbGFzcz0iYWxlcnQgYWxlcnQtaW5mbyIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgorICAgICAgICAgIFRvYXN0ZXIgZG9lcyBub3Qga25vdyBhYm91dCB0aGlzIGxheWVyLiBQbGVhc2UgPGEgaHJlZj0iIyI+aW1wb3J0IGl0PC9hPgorICAgICAgICA8L2Rpdj4KKworICAgICAgICA8cD4KKyAgICAgICAgICA8YSBocmVmPSJ7JSB1cmwgJ3Byb2plY3RsYXllcnMnIHByb2plY3QuaWQgJX0iIGlkPSJ2aWV3LWNvbXBhdGlibGUtbGF5ZXJzIj5WaWV3IGNvbXBhdGlibGUgbGF5ZXJzPC9hPgorICAgICAgICAgIDxpIGRhdGEtb3JpZ2luYWwtdGl0bGU9IlZpZXcgYWxsIHRoZSBsYXllcnMgeW91IGNhbiBidWlsZCB3aXRoIHRoZSByZWxlYXNlIHNlbGVjdGVkIGZvciB0aGlzIHByb2plY3QsIHdoaWNoIGlzIFlvY3RvIFByb2plY3QgbWFzdGVyIiBjbGFzcz0iaWNvbi1xdWVzdGlvbi1zaWduIGdldC1oZWxwIiB0aXRsZT0iIj48L2k+CisgICAgICAgICAgfCA8YSBocmVmPSJ7JSB1cmwgJ2ltcG9ydGxheWVyJyBwcm9qZWN0LmlkICV9Ij5JbXBvcnQgbGF5ZXI8L2E+CisgICAgICAgIDwvcD4KKyAgICAgIDwvZm9ybT4KKworICAgICAgPHVsIGNsYXNzPSJ1bnN0eWxlZCBjb25maWd1cmF0aW9uLWxpc3QiIGlkPSJsYXllcnMtaW4tcHJvamVjdC1saXN0Ij4KKyAgICAgIDwvdWw+CisgICAgPC9kaXY+CisgIDwvZGl2PgorPC9kaXY+Cit7JSBlbmRibG9jayAlfQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9wcm9qZWN0YnVpbGRzLmh0bWwgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL3Byb2plY3RidWlsZHMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjgwOWRlCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9wcm9qZWN0YnVpbGRzLmh0bWwKQEAgLTAsMCArMSwxMDMgQEAKK3slIGV4dGVuZHMgImJhc2Vwcm9qZWN0YnVpbGRzcGFnZS5odG1sIiAlfQoreyUgbG9hZCBwcm9qZWN0dGFncyAlfQoreyUgbG9hZCBodW1hbml6ZSAlfQorCisKK3slIGJsb2NrIGV4dHJhaGVhZGNvbnRlbnQgJX0KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL3N0YXRpYy9jc3MvanF1ZXJ5LXVpLm1pbi5jc3MiIHR5cGU9J3RleHQvY3NzJz4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL3N0YXRpYy9jc3MvanF1ZXJ5LXVpLnN0cnVjdHVyZS5taW4uY3NzIiB0eXBlPSd0ZXh0L2Nzcyc+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii9zdGF0aWMvY3NzL2pxdWVyeS11aS50aGVtZS5taW4uY3NzIiB0eXBlPSd0ZXh0L2Nzcyc+Cis8c2NyaXB0IHNyYz0iL3N0YXRpYy9qcy9qcXVlcnktdWkubWluLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSIvc3RhdGljL2pzL2ZpbHRlcnNuaXBwZXQuanMiPjwvc2NyaXB0PgoreyUgZW5kYmxvY2sgJX0KKworeyUgYmxvY2sgcHJvamVjdGluZm9tYWluICV9CisKKzxzY3JpcHQ+CisgICAgLy8gaW5pdGlhbGl6ZSB0aGUgZGF0ZSByYW5nZSBjb250cm9scworICAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgpIHsKKyAgICAgICAgZGF0ZV9pbml0KCdjcmVhdGVkJywne3tsYXN0X2RhdGVfZnJvbX19Jywne3tsYXN0X2RhdGVfdG99fScsJ3t7ZGF0ZU1pbl9zdGFydGVkX29ufX0nLCd7e2RhdGVNYXhfc3RhcnRlZF9vbn19Jywne3tkYXRlcmFuZ2Vfc2VsZWN0ZWR9fScpOworICAgICAgICBkYXRlX2luaXQoJ3VwZGF0ZWQnLCd7e2xhc3RfZGF0ZV9mcm9tfX0nLCd7e2xhc3RfZGF0ZV90b319Jywne3tkYXRlTWluX2NvbXBsZXRlZF9vbn19Jywne3tkYXRlTWF4X2NvbXBsZXRlZF9vbn19Jywne3tkYXRlcmFuZ2Vfc2VsZWN0ZWR9fScpOworICAgIH0pOworPC9zY3JpcHQ+CisKKyAgICAgIDxoMj4KKyAgICAgICAgeyUgaWYgcmVxdWVzdC5HRVQuZmlsdGVyIGFuZCBvYmplY3RzLnBhZ2luYXRvci5jb3VudCA+IDAgb3IgcmVxdWVzdC5HRVQuc2VhcmNoIGFuZCBvYmplY3RzLnBhZ2luYXRvci5jb3VudCA+IDAgJX0KKyAgICAgICAgICAgIHt7b2JqZWN0cy5wYWdpbmF0b3IuY291bnR9fSBidWlsZHt7b2JqZWN0cy5wYWdpbmF0b3IuY291bnR8cGx1cmFsaXplfX0gZm91bmQKKyAgICAgICAgeyVlbGlmIHJlcXVlc3QuR0VULmZpbHRlciBhbmQgb2JqZWN0cy5wYWdpbmF0b3IuY291bnQgPT0gMCBvciByZXF1ZXN0LkdFVC5zZWFyY2ggYW5kIG9iamVjdHMucGFnaW5hdG9yLmNvdW50ID09IDAgJX0KKyAgICAgICAgICAgIE5vIGJ1aWxkcyBmb3VuZAorICAgICAgICB7JWVsc2UlfQorICAgICAgICAgICAgUHJvamVjdCBidWlsZHMKKyAgICAgICAgeyVlbmRpZiV9CisgICAgICAgIDxpIGNsYXNzPSJpY29uLXF1ZXN0aW9uLXNpZ24gZ2V0LWhlbHAgaGVhZGluZy1oZWxwIiB0aXRsZT0iVGhpcyBwYWdlIGxpc3RzIGFsbCB0aGUgYnVpbGRzIGZvciB0aGUgY3VycmVudCBwcm9qZWN0Ij48L2k+CisgICAgICA8L2gyPgorCisKKyB7JSBpZiBvYmplY3RzLnBhZ2luYXRvci5jb3VudCA9PSAwICV9CisgIHslIGlmIHJlcXVlc3QuR0VULmZpbHRlciBvciByZXF1ZXN0LkdFVC5zZWFyY2ggJX0KKyAgICA8ZGl2IGNsYXNzPSJyb3ctZmx1aWQiPgorICAgICAgPGRpdiBjbGFzcz0iYWxlcnQiPgorICAgICAgICA8Zm9ybSBjbGFzcz0ibm8tcmVzdWx0cyBpbnB1dC1hcHBlbmQiIGlkPSJzZWFyY2hmb3JtIj4KKyAgICAgICAgICAgIDxpbnB1dCBpZD0ic2VhcmNoIiBuYW1lPSJzZWFyY2giIGNsYXNzPSJpbnB1dC14eGxhcmdlIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0ie3tyZXF1ZXN0LkdFVC5zZWFyY2h9fSIvPnslIGlmIHJlcXVlc3QuR0VULnNlYXJjaCAlfTxhIGhyZWY9ImphdmFzY3JpcHQ6JCgnI3NlYXJjaCcpLnZhbCgnJyk7c2VhcmNoZm9ybS5zdWJtaXQoKSIgY2xhc3M9ImFkZC1vbiBidG4iIHRhYmluZGV4PSItMSI+PGkgY2xhc3M9Imljb24tcmVtb3ZlIj48L2k+PC9hPnslIGVuZGlmICV9CisgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlNlYXJjaCI+U2VhcmNoPC9idXR0b24+CisgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLWxpbmsiIG9uY2xpY2s9ImphdmFzY3JpcHQ6JCgnI3NlYXJjaCcpLnZhbCgnJyk7c2VhcmNoZm9ybS5zdWJtaXQoKSI+U2hvdyBhbGwgYnVpbGRzPC9idXR0b24+CisgICAgICAgIDwvZm9ybT4KKyAgICAgIDwvZGl2PgorICAgIDwvZGl2PgorICB7JSBlbHNlICV9CisgICAgPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtaW5mbyI+CisgICAgICA8cCBjbGFzcz0ibGVhZCI+CisgICAgICAgIFRoaXMgcHJvamVjdCBoYXMgbm8gYnVpbGRzLgorICAgICAgPC9wPgorICAgIDwvZGl2PgorICB7JSBlbmRpZiAlfQorCisgeyUgZWxzZSAlfQorCisgIHslIGluY2x1ZGUgImJhc2V0YWJsZV90b3AuaHRtbCIgJX0KKyAgICAgICAgPCEtLSBUYWJsZSBkYXRhIHJvd3M7IHRoZSBvcmRlciBuZWVkcyB0byBtYXRjaCB0aGUgb3JkZXIgb2YgInRhYmxlY29scyIgZGVmaW5pdGlvbnM7IGFuZCB0aGUgPHRkIGNsYXNzIHZhbHVlIG5lZWRzIHRvIG1hdGNoIHRoZSB0YWJsZWNvbHMgY2xjbGFzcyB2YWx1ZSBmb3Igc2hvdy9oaWRlIGJ1dHRvbnMgdG8gd29yayAtLT4KKyAgICAgICAgeyUgZm9yIGJ1aWxkIGluIG9iamVjdHMgJX0geyMgaWYgd2UgaGF2ZSBhIGJ1aWxkLCBqdXN0IGRpc3BsYXkgaXQgI30KKyAgICAgICAgPHRyIGNsYXNzPSJkYXRhIj4KKyAgICAgICAgICAgIDx0ZCBjbGFzcz0ib3V0Y29tZSI+PGEgaHJlZj0ieyUgdXJsICJidWlsZGRhc2hib2FyZCIgYnVpbGQuaWQgJX0iPnslaWYgYnVpbGQub3V0Y29tZSA9PSBidWlsZC5TVUNDRUVERUQlfTxpIGNsYXNzPSJpY29uLW9rLXNpZ24gc3VjY2VzcyI+PC9pPnslZWxpZiBidWlsZC5vdXRjb21lID09IGJ1aWxkLkZBSUxFRCV9PGkgY2xhc3M9Imljb24tbWludXMtc2lnbiBlcnJvciI+PC9pPnslZWxzZSV9eyVlbmRpZiV9PC9hPgorICAgICAgICAgICAgICAgICAgIHslIGlmIGJ1aWxkLnByb2plY3QgJX0KKyAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOyA8YSBocmVmPSJ7JSB1cmwgJ2J1aWxkX2FydGlmYWN0JyBidWlsZC5pZCAiY29va2VybG9nIiBidWlsZC5pZCAlfSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9Imljb24tZG93bmxvYWQtYWx0IiB0aXRsZT0iIiBkYXRhLW9yaWdpbmFsLXRpdGxlPSJEb3dubG9hZCBidWlsZCBsb2ciPjwvaT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KKyAgICAgICAgICAgICAgICAgICAgeyUgZW5kaWYgJX0KKyAgICAgICAgICAgIDwvdGQ+CisKKyAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFyZ2V0Ij57JSBmb3IgdCBpbiBidWlsZC50YXJnZXRfc2V0LmFsbCAlfSA8YSBocmVmPSJ7JSB1cmwgImJ1aWxkZGFzaGJvYXJkIiBidWlsZC5pZCAlfSI+IHt7dC50YXJnZXR9fSA8L2E+IDxiciAvPnslIGVuZGZvciAlfTwvdGQ+CisgICAgICAgICAgICA8dGQgY2xhc3M9Im1hY2hpbmUiPjxhIGhyZWY9InslIHVybCAiYnVpbGRkYXNoYm9hcmQiIGJ1aWxkLmlkICV9Ij57e2J1aWxkLm1hY2hpbmV9fTwvYT48L3RkPgorICAgICAgICAgICAgPHRkIGNsYXNzPSJzdGFydGVkX29uIj48YSBocmVmPSJ7JSB1cmwgImJ1aWxkZGFzaGJvYXJkIiBidWlsZC5pZCAlfSI+e3tidWlsZC5zdGFydGVkX29ufGRhdGU6ImQvbS95IEg6aSJ9fTwvYT48L3RkPgorICAgICAgICAgICAgPHRkIGNsYXNzPSJjb21wbGV0ZWRfb24iPjxhIGhyZWY9InslIHVybCAiYnVpbGRkYXNoYm9hcmQiIGJ1aWxkLmlkICV9Ij57e2J1aWxkLmNvbXBsZXRlZF9vbnxkYXRlOiJkL20veSBIOmkifX08L2E+PC90ZD4KKyAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmFpbGVkX3Rhc2tzIGVycm9yIj4KKyAgICAgICAgICAgICAgICB7JSBxdWVyeSBidWlsZC50YXNrX2J1aWxkIG91dGNvbWU9NCBvcmRlcl9fZ3Q9MCBhcyBleGVjdGFzayV9CisgICAgICAgICAgICAgICAgICAgIHslIGlmIGV4ZWN0YXNrLmNvdW50ID09IDEgJX0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9InslIHVybCAidGFzayIgYnVpbGQuaWQgZXhlY3Rhc2suMC5pZCAlfSI+e3tleGVjdGFzay4wLnJlY2lwZS5uYW1lfX0ue3tleGVjdGFzay4wLnRhc2tfbmFtZX19PC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0ieyUgdXJsICdidWlsZF9hcnRpZmFjdCcgYnVpbGQuaWQgInRhc2tsb2dmaWxlIiBleGVjdGFzay4wLmlkICV9Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iaWNvbi1kb3dubG9hZC1hbHQiIHRpdGxlPSIiIGRhdGEtb3JpZ2luYWwtdGl0bGU9IkRvd25sb2FkIHRhc2sgbG9nIGZpbGUiPjwvaT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KKyAgICAgICAgICAgICAgICAgICAgeyUgZWxpZiBleGVjdGFzay5jb3VudCA+IDElfQorICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0ieyUgdXJsICJ0YXNrcyIgYnVpbGQuaWQgJX0/ZmlsdGVyPW91dGNvbWUlM0E0Ij57e2V4ZWN0YXNrLmNvdW50fX0gdGFza3t7ZXhlY3Rhc2suY291bnR8cGx1cmFsaXplfX08L2E+CisgICAgICAgICAgICAgICAgICAgIHslZW5kaWYlfQorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgIDx0ZCBjbGFzcz0iZXJyb3JzLmNvdW50Ij4KKyAgICAgICAgICAgICAgICB7JSBpZiAgYnVpbGQuZXJyb3JzLmNvdW50ICV9CisgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJlcnJvcnMuY291bnQgZXJyb3IiIGhyZWY9InslIHVybCAiYnVpbGRkYXNoYm9hcmQiIGJ1aWxkLmlkICV9I2Vycm9ycyI+e3tidWlsZC5lcnJvcnMuY291bnR9fSBlcnJvcnt7YnVpbGQuZXJyb3JzLmNvdW50fHBsdXJhbGl6ZX19PC9hPgorICAgICAgICAgICAgICAgIHslZW5kaWYlfQorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgIDx0ZCBjbGFzcz0id2FybmluZ3MuY291bnQiPnslIGlmICBidWlsZC53YXJuaW5ncy5jb3VudCAlfTxhIGNsYXNzPSJ3YXJuaW5ncy5jb3VudCB3YXJuaW5nIiBocmVmPSJ7JSB1cmwgImJ1aWxkZGFzaGJvYXJkIiBidWlsZC5pZCAlfSN3YXJuaW5ncyI+e3tidWlsZC53YXJuaW5ncy5jb3VudH19IHdhcm5pbmd7e2J1aWxkLndhcm5pbmdzLmNvdW50fHBsdXJhbGl6ZX19PC9hPnslZW5kaWYlfTwvdGQ+CisgICAgICAgICAgICA8dGQgY2xhc3M9InRpbWUiPjxhIGhyZWY9InslIHVybCAiYnVpbGR0aW1lIiBidWlsZC5pZCAlfSI+e3tidWlsZC50aW1lc3BlbnRfc2Vjb25kc3xzZWN0b2htc319PC9hPjwvdGQ+CisgICAgICAgICAgICA8dGQgY2xhc3M9Im91dHB1dCI+CisgICAgICAgICAgICAgIHslIGlmIGJ1aWxkLm91dGNvbWUgPT0gYnVpbGQuU1VDQ0VFREVEICV9CisgICAgICAgICAgICAgIDxhIGhyZWY9InsldXJsICJidWlsZGRhc2hib2FyZCIgYnVpbGQuaWQlfSNpbWFnZXMiPnt7ZnN0eXBlc3xnZXRfZGljdF92YWx1ZTpidWlsZC5pZH19PC9hPgorICAgICAgICAgICAgICB7JSBlbmRpZiAlfQorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgeyUgZW5kZm9yICV9CisKKworICB7JSBpbmNsdWRlICJiYXNldGFibGVfYm90dG9tLmh0bWwiICV9Cit7JSBlbmRpZiAlfQorCit7JSBlbmRibG9jayAlfQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9wcm9qZWN0Y29uZi5odG1sIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9wcm9qZWN0Y29uZi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNWExODgKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL3Byb2plY3Rjb25mLmh0bWwKQEAgLTAsMCArMSw4NDkgQEAKK3slIGV4dGVuZHMgImJhc2Vwcm9qZWN0cGFnZS5odG1sIiAlfQoreyUgbG9hZCBwcm9qZWN0dGFncyAlfQoreyUgbG9hZCBodW1hbml6ZSAlfQorCisKK3slIGJsb2NrIHByb2plY3RpbmZvbWFpbiAlfQorCis8aDI+Qml0YmFrZSB2YXJpYWJsZXM8L2gyPgorCisgICAgPGRpdiBzdHlsZT0icGFkZGluZy1sZWZ0OjE5cHg7Ij4KKworICAgICAgICA8ZGwgY2xhc3M9ImRsLXZlcnRpY2FsIj4KKyAgICAgICAgICAgIHslIGlmIGRpc3Ryb19kZWZpbmVkICV9CisgICAgICAgICAgICA8ZHQ+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImpzLWNvbmZpZy12YXItbmFtZSBqcy1jb25maWctdmFyLW1hbmFnZWQtbmFtZSI+RElTVFJPPC9zcGFuPgorICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLXF1ZXN0aW9uLXNpZ24gZ2V0LWhlbHAiIHRpdGxlPSJUaGUgc2hvcnQgbmFtZSBvZiB0aGUgZGlzdHJpYnV0aW9uLiBJZiB0aGUgdmFyaWFibGUgaXMgYmxhbmssIG1ldGEvY29uZi9kaXN0cm8vZGVmYXVsdHNldHVwLmNvbmYgd2lsbCBiZSB1c2VkLiA8YnIgLz48YSBocmVmPSdodHRwOi8vd3d3LnlvY3RvcHJvamVjdC5vcmcvZG9jcy8xLjYuMS9yZWYtbWFudWFsL3JlZi1tYW51YWwuaHRtbCN2YXItRElTVFJPJyB0YXJnZXQ9J19ibGFuayc+UmVhZCBtb3JlIGluIHRoZSBtYW51YWw8L2E+Ij48L2k+CisgICAgICAgICAgICA8L2R0PgorICAgICAgICAgICAgPGRkIGNsYXNzPSJsZWFkIj4KKyAgICAgICAgICAgICAgICA8c3BhbiBpZD0iZGlzdHJvIj57e2Rpc3Ryb319PC9zcGFuPgorICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLXBlbmNpbCIgaWQ9ImNoYW5nZS1kaXN0cm8taWNvbiI+PC9pPgorICAgICAgICAgICAgICAgIDxmb3JtIGlkPSJjaGFuZ2UtZGlzdHJvLWZvcm0iIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtYXBwZW5kIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICBpZD0iZWRpdC1kaXN0cm8tbmFtZS1kaXYiIGNsYXNzPSJjb250cm9sLWdyb3VwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9Im5ldy1kaXN0cm8iIHZhbHVlPSJ7e2Rpc3Ryb319Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPSJhcHBseS1jaGFuZ2UtZGlzdHJvIiBjbGFzcz0iYnRuIiB0eXBlPSJidXR0b24iPlNhdmU8L2J1dHRvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPSJjYW5jZWwtY2hhbmdlLWRpc3RybyIgdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1saW5rIj5DYW5jZWw8L2J1dHRvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJoZWxwLWJsb2NrIGVycm9yIiBpZD0iZGlzdHJvLWVycm9yLW1lc3NhZ2UiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPC9mb3JtPgorICAgICAgICAgICAgPC9kZD4KKyAgICAgICAgICAgIHslIGVuZGlmICV9CisKKyAgICAgICAgICAgIHslIGlmIGZzdHlwZXNfZGVmaW5lZCAlfQorICAgICAgICAgICAgPGR0PgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJqcy1jb25maWctdmFyLW5hbWUganMtY29uZmlnLXZhci1tYW5hZ2VkLW5hbWUiPklNQUdFX0ZTVFlQRVM8L3NwYW4+CisgICAgICAgICAgICAgICAgPGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCIgdGl0bGU9IkZvcm1hdHMgb2Ygcm9vdCBmaWxlIHN5c3RlbSBpbWFnZXMgdGhhdCB5b3Ugd2FudCB0byBoYXZlIGNyZWF0ZWQgPGJyIC8+PGEgaHJlZj0naHR0cDovL3d3dy55b2N0b3Byb2plY3Qub3JnL2RvY3MvMS42LjEvcmVmLW1hbnVhbC9yZWYtbWFudWFsLmh0bWwjdmFyLUlNQUdFX0ZTVFlQRVMnIHRhcmdldD0nX2JsYW5rJz5SZWFkIG1vcmUgaW4gdGhlIG1hbnVhbDwvYT4iPjwvaT4KKyAgICAgICAgICAgIDwvZHQ+CisgICAgICAgICAgICA8ZGQgY2xhc3M9ImxlYWQiPgorICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJpbWFnZV9mc3R5cGVzIj57e2ZzdHlwZXN9fTwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8aSBjbGFzcz0iaWNvbi1wZW5jaWwiIGlkPSJjaGFuZ2UtaW1hZ2VfZnN0eXBlcy1pY29uIj48L2k+CisgICAgICAgICAgICAgICAgPGZvcm0gaWQ9ImNoYW5nZS1pbWFnZV9mc3R5cGVzLWZvcm0iIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KKyAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJmaWx0ZXItaW1hZ2VfZnN0eXBlcyIgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9IlNlYXJjaCBpbWFnZSB0eXBlcyIgY2xhc3M9InNwYW40Ij4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iYWxsLWltYWdlX2ZzdHlwZXMiIGNsYXNzPSJzY3JvbGxpbmciPgorICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iYXBwbHktY2hhbmdlLWltYWdlX2ZzdHlwZXMiIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biI+U2F2ZTwvYnV0dG9uPgorICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPSJjYW5jZWwtY2hhbmdlLWltYWdlX2ZzdHlwZXMiIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tbGluayI+Q2FuY2VsPC9idXR0b24+CisgICAgICAgICAgICAgICAgPC9mb3JtPgorICAgICAgICAgICAgPC9kZD4KKyAgICAgICAgICAgIHslIGVuZGlmICV9CisKKyAgICAgICAgICAgIHslIGlmIGltYWdlX2luc3RhbGxfYXBwZW5kX2RlZmluZWQgJX0KKyAgICAgICAgICAgIDxkdD4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ianMtY29uZmlnLXZhci1uYW1lIGpzLWNvbmZpZy12YXItbWFuYWdlZC1uYW1lIj5JTUFHRV9JTlNUQUxMX2FwcGVuZDwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8aSBjbGFzcz0iaWNvbi1xdWVzdGlvbi1zaWduIGdldC1oZWxwIiB0aXRsZT0iU3BlY2lmaWVzIGFkZGl0aW9uYWwgcGFja2FnZXMgdG8gaW5zdGFsbCBpbnRvIGFuIGltYWdlLiBJZiB5b3VyIGJ1aWxkIGNyZWF0ZXMgbW9yZSB0aGFuIG9uZSBpbWFnZSwgdGhlIHBhY2thZ2VzIHdpbGwgYmUgaW5zdGFsbGVkIGluIDxzdHJvbmc+YWxsIG9mIHRoZW08L3N0cm9uZz4gPGJyIC8+PGEgaHJlZj0naHR0cDovL3d3dy55b2N0b3Byb2plY3Qub3JnL2RvY3MvMS42LjEvcmVmLW1hbnVhbC9yZWYtbWFudWFsLmh0bWwjdmFyLUlNQUdFX0lOU1RBTEwnIHRhcmdldD0nX2JsYW5rJz5SZWFkIG1vcmUgaW4gdGhlIG1hbnVhbDwvYT4iPjwvaT4KKyAgICAgICAgICAgIDwvZHQ+CisgICAgICAgICAgICA8ZGQgY2xhc3M9ImxlYWQiPgorICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJpbWFnZV9pbnN0YWxsInslIGlmIGltYWdlX2luc3RhbGxfYXBwZW5kICV9eyVlbHNlJX0gY2xhc3M9Im11dGVkInslZW5kaWYlfT57JSBpZiBpbWFnZV9pbnN0YWxsX2FwcGVuZCAlfXt7aW1hZ2VfaW5zdGFsbF9hcHBlbmR9fXslZWxzZSV9Tm90IHNldHslZW5kaWYlfTwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8aSBjbGFzcz0iaWNvbi1wZW5jaWwiIGlkPSJjaGFuZ2UtaW1hZ2VfaW5zdGFsbC1pY29uIj48L2k+CisgICAgICAgICAgICAgICAgPGkgY2xhc3M9Imljb24tdHJhc2giIGlkPSJkZWxldGUtaW1hZ2VfaW5zdGFsbC1pY29uIiB7JSBpZiBpbWFnZV9pbnN0YWxsX2FwcGVuZCAlfXslZWxzZSV9c3R5bGU9ImRpc3BsYXk6bm9uZTsieyVlbmRpZiV9PjwvaT4KKyAgICAgICAgICAgICAgICA8Zm9ybSBpZD0iY2hhbmdlLWltYWdlX2luc3RhbGwtZm9ybSIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgorICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ctZmx1aWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImhlbHAtYmxvY2sgc3BhbjQiPlRvIHNldCBJTUFHRV9JTlNUQUxMX2FwcGVuZCB0byBtb3JlIHRoYW4gb25lIHBhY2thZ2UsIHR5cGUgdGhlIHBhY2thZ2UgbmFtZXMgc2VwYXJhdGVkIGJ5IGEgc3BhY2UuPC9zcGFuPgorICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtYXBwZW5kIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iaW5wdXQteGxhcmdlIiBpZD0ibmV3LWltYWdlX2luc3RhbGwiIHBsYWNlaG9sZGVyPSJUeXBlIG9uZSBvciBtb3JlIHBhY2thZ2UgbmFtZXMiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iYXBwbHktY2hhbmdlLWltYWdlX2luc3RhbGwiIGNsYXNzPSJidG4iIHR5cGU9ImJ1dHRvbiI+U2F2ZTwvYnV0dG9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iY2FuY2VsLWNoYW5nZS1pbWFnZV9pbnN0YWxsIiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWxpbmsiPkNhbmNlbDwvYnV0dG9uPgorICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8L2Zvcm0+CisgICAgICAgICAgICA8L2RkPgorICAgICAgICAgICAgeyUgZW5kaWYgJX0KKworICAgICAgICAgICAgeyUgaWYgcGFja2FnZV9jbGFzc2VzX2RlZmluZWQgJX0KKyAgICAgICAgICAgIDxkdD4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ianMtY29uZmlnLXZhci1uYW1lIGpzLWNvbmZpZy12YXItbWFuYWdlZC1uYW1lIj5QQUNLQUdFX0NMQVNTRVM8L3NwYW4+CisgICAgICAgICAgICAgICAgPGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCIgdGl0bGU9IlNwZWNpZmllcyB0aGUgcGFja2FnZSBtYW5hZ2VyIHRvIHVzZSB3aGVuIHBhY2thZ2luZyBkYXRhIDxiciAvPjxhIGhyZWY9J2h0dHA6Ly93d3cueW9jdG9wcm9qZWN0Lm9yZy9kb2NzLzEuNi4xL3JlZi1tYW51YWwvcmVmLW1hbnVhbC5odG1sI3Zhci1QQUNLQUdFX0NMQVNTRVMnIHRhcmdldD0nX2JsYW5rJz5SZWFkIG1vcmUgaW4gdGhlIG1hbnVhbDwvYT4iPjwvaT4KKyAgICAgICAgICAgIDwvZHQ+CisgICAgICAgICAgICA8ZGQgY2xhc3M9ImxlYWQiPgorICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJwYWNrYWdlX2NsYXNzZXMiPnt7cGFja2FnZV9jbGFzc2VzfX08L3NwYW4+CisgICAgICAgICAgICAgICAgPGkgaWQ9ImNoYW5nZS1wYWNrYWdlX2NsYXNzZXMtaWNvbiIgY2xhc3M9Imljb24tcGVuY2lsIj48L2k+CisgICAgICAgICAgICAgICAgPGZvcm0gaWQ9ImNoYW5nZS1wYWNrYWdlX2NsYXNzZXMtZm9ybSIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgorICAgICAgICAgICAgICAgICAgICA8bGFiZWw+CisgICAgICAgICAgICAgICAgICAgICAgICBSb290IGZpbGUgc3lzdGVtIHBhY2thZ2UgZm9ybWF0CisgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iaWNvbi1xdWVzdGlvbi1zaWduIGdldC1oZWxwIiB0aXRsZT0iVGhlIHBhY2thZ2UgZm9ybWF0IHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHJvb3QgZmlsZSBzeXN0ZW0uIE9wdGlvbnMgYXJlIDxjb2RlPmRldjwvY29kZT4sIDxjb2RlPmlwazwvY29kZT4gYW5kIDxjb2RlPnJwbTwvY29kZT4iPjwvaT4KKyAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KKyAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD0icGFja2FnZV9jbGFzc2VzLXNlbGVjdCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPnBhY2thZ2VfZGViPC9vcHRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPnBhY2thZ2VfaXBrPC9vcHRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPnBhY2thZ2VfcnBtPC9vcHRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PgorICAgICAgICAgICAgICAgICAgICA8bGFiZWw+CisgICAgICAgICAgICAgICAgICAgICAgICBBZGRpdGlvbmFsIHBhY2thZ2UgZm9ybWF0cworICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCIgdGl0bGU9IkV4dHJhIHBhY2thZ2UgZm9ybWF0cyB0byBidWlsZCI+PC9pPgorICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgorICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImNoZWNrYm94IiBpZD0icGFja2FnZV9jbGFzc18xIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9InBhY2thZ2VfY2xhc3NfMV9pbnB1dCI+IHBhY2thZ2VfZGViCisgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CisgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iY2hlY2tib3giIGlkPSJwYWNrYWdlX2NsYXNzXzIiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0icGFja2FnZV9jbGFzc18yX2lucHV0Ij4gcGFja2FnZV9pcGsKKyAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6MTBweDsiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iYXBwbHktY2hhbmdlLXBhY2thZ2VfY2xhc3NlcyIgdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIj5TYXZlPC9idXR0b24+CisgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPSJjYW5jZWwtY2hhbmdlLXBhY2thZ2VfY2xhc3NlcyIgdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1saW5rIj5DYW5jZWw8L2J1dHRvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPC9mb3JtPgorICAgICAgICAgICAgPC9kZD4KKyAgICAgICAgICAgIHslIGVuZGlmICV9CisKKyAgICAgICAgICAgIHslIGlmIHNka19tYWNoaW5lX2RlZmluZWQgJX0KKyAgICAgICAgICAgIDxkdD4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ianMtY29uZmlnLXZhci1uYW1lIGpzLWNvbmZpZy12YXItbWFuYWdlZC1uYW1lIj5TREtNQUNISU5FPC9zcGFuPgorICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLXF1ZXN0aW9uLXNpZ24gZ2V0LWhlbHAiIHRpdGxlPSJTcGVjaWZpZXMgdGhlIGFyY2hpdGVjdHVyZSAoaS5lLiBpNjg2IG9yIHg4Nl82NCkgZm9yIHdoaWNoIHRvIGJ1aWxkIFNESyBhbmQgQURUIGl0ZW1zIDxiciAvPjxhIGhyZWY9J2h0dHA6Ly93d3cueW9jdG9wcm9qZWN0Lm9yZy9kb2NzLzEuNi4xL3JlZi1tYW51YWwvcmVmLW1hbnVhbC5odG1sI3Zhci1TREtNQUNISU5FJyB0YXJnZXQ9J19ibGFuayc+UmVhZCBtb3JlIGluIHRoZSBtYW51YWw8L2E+Ij48L2k+CisgICAgICAgICAgICA8L2R0PgorICAgICAgICAgICAgPGRkIGNsYXNzPSJsZWFkIj4KKyAgICAgICAgICAgICAgICA8c3BhbiBpZD0ic2RrbWFjaGluZSI+e3tzZGtfbWFjaGluZX19PC9zcGFuPgorICAgICAgICAgICAgICAgIDxpIGlkPSJjaGFuZ2Utc2RrbWFjaGluZS1pY29uIiBjbGFzcz0iaWNvbi1wZW5jaWwiPjwvaT4KKyAgICAgICAgICAgICAgICA8Zm9ybSBpZD0iY2hhbmdlLXNka21hY2hpbmUtZm9ybSIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgorICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9InJhZGlvIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0ic2RrbWFjaGluZSIgdmFsdWU9Imk2ODYiPgorICAgICAgICAgICAgICAgICAgICAgICAgaTY4NgorICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgorICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9InJhZGlvIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0ic2RrbWFjaGluZSIgdmFsdWU9Ing4Nl82NCI+CisgICAgICAgICAgICAgICAgICAgICAgICB4ODZfNjQKKyAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0icGFkZGluZy10b3A6MTBweDsiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iYXBwbHktY2hhbmdlLXNka21hY2hpbmUiIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biI+U2F2ZTwvYnV0dG9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iY2FuY2VsLWNoYW5nZS1zZGttYWNoaW5lIiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWxpbmsiPkNhbmNlbDwvYnV0dG9uPgorICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8L2Zvcm0+CisgICAgICAgICAgICA8L2RkPgorICAgICAgICAgICAgeyUgZW5kaWYgJX0KKworICAgICAgICA8L2RsPgorCisgICAgICAgIDwhLS0gPHVsIGNsYXNzPSJ1bnN0eWxlZCBjb25maWd1cmF0aW9uLWxpc3QiIGlkPSJjb25maWd2YXItbGlzdCI+IC0tPgorICAgICAgICA8ZGwgaWQ9ImNvbmZpZ3Zhci1saXN0Ij4KKyAgICAgICAgICAgIDwhLS0gdGhlIGFkZGVkIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGFyZSBpbnNlcnRlZCBoZXJlIC0tPgorICAgICAgICA8L2RsPgorCisgICAgICAgIDwhLS0gcGFzcyB0aGUgZnN0eXBlcyBsaXN0LCBibGFjayBsaXN0LCBhbmQgZXh0ZXJuYWxseSBtYW5hZ2VkIHZhcmlhYmxlcyBoZXJlIC0tPgorICAgICAgICB7JSBmb3IgZnN0eXBlIGluIHZhcnNfZnN0eXBlcyAlfQorICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgY2xhc3M9ImpzLWNoZWNrYm94LWZzdHlwZXMtbGlzdCIgdmFsdWU9Int7ZnN0eXBlfX0iPgorICAgICAgICB7JSBlbmRmb3IgJX0KKyAgICAgICAgeyUgZm9yIGIgaW4gdmFyc19ibGFja2xpc3QgJX0KKyAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGNsYXNzPSJqcy1jb25maWctYmxhY2tsaXN0LW5hbWUiIHZhbHVlPSJ7e2J9fSI+CisgICAgICAgIHslIGVuZGZvciAlfQorICAgICAgICB7JSBmb3IgYiBpbiB2YXJzX21hbmFnZWQgJX0KKyAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGNsYXNzPSJqcy1jb25maWctbWFuYWdlZC1uYW1lIiB2YWx1ZT0ie3tifX0iPgorICAgICAgICB7JSBlbmRmb3IgJX0KKworICAgICAgICA8ZGl2IGNsYXNzPSJyb3ctZmx1aWQiPgorICAgICAgICAgIDxmb3JtIGlkPSJ2YXJpYWJsZS1mb3JtIj4KKyAgICAgICAgICAgIDxmaWVsZHNldCBzdHlsZT0icGFkZGluZy1sZWZ0OjBweDsiPgorICAgICAgICAgICAgICAgIDxsZWdlbmQ+QWRkIHZhcmlhYmxlPC9sZWdlbmQ+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3BhbjMiIHN0eWxlPSJtYXJnaW4tbGVmdDowcHg7Ij4KKyAgICAgICAgICAgICAgICAgICAgPHNwYW4gIGlkPSJhZGQtY29uZmlndmFyLW5hbWUtZGl2IiBjbGFzcz0iY29udHJvbC1ncm91cCI+CisgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPgorICAgICAgICAgICAgICAgICAgICAgICAgVmFyaWFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgIDxpIHRpdGxlPSIiIGNsYXNzPSJpY29uLXF1ZXN0aW9uLXNpZ24gZ2V0LWhlbHAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW9yaWdpbmFsLXRpdGxlPSJWYXJpYWJsZSBuYW1lcyBhcmUgY2FzZSBzZW5zaXRpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5ub3QgaGF2ZSBzcGFjZXMsIGFuZCBjYW4gb25seSBpbmNsdWRlIGxldHRlcnMsIG51bWJlcnMsIHVuZGVyc2NvcmVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZGFzaGVzIj48L2k+CisgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KKyAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9IlR5cGUgdmFyaWFibGUgbmFtZSIgaWQ9InZhcmlhYmxlIj4KKyAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaGVscC1ibG9jayBlcnJvciIgaWQ9Im5ldy12YXJpYWJsZS1lcnJvci1tZXNzYWdlIj48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlZhbHVlPC9sYWJlbD4KKyAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJ2YWx1ZSIgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9IlR5cGUgdmFyaWFibGUgdmFsdWUiPjxwPgorICAgICAgICAgICAgICAgICAgICA8ZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iYWRkLWNvbmZpZ3Zhci1idXR0b24iIGNsYXNzPSJidG4gc2F2ZSIgdHlwZT0iYnV0dG9uIiBkaXNhYmxlZD5BZGQgdmFyaWFibGU8L2J1dHRvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3BhbjUgaGVscC1ibG9jayI+CisgICAgICAgICAgICAgICAgICAgIDxoNT5Tb21lIHZhcmlhYmxlcyBhcmUgcmVzZXJ2ZWQgZnJvbSBUb2FzdGVyPC9oNT4KKyAgICAgICAgICAgICAgICAgICAgPHA+VG9hc3RlciBjYW5ub3Qgc2V0IGFueSB2YXJpYWJsZXMgdGhhdCBpbXBhY3QgMSkgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGJ1aWxkIHNlcnZlcnMsCisgICAgICAgICAgICAgICAgICAgIG9yIDIpIHdoZXJlIGFydGlmYWN0cyBwcm9kdWNlZCBieSB0aGUgYnVpbGQgYXJlIHN0b3JlZC4gU3VjaCB2YXJpYWJsZXMgaW5jbHVkZTogPC9wPgorICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICAgICAgPGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy55b2N0b3Byb2plY3Qub3JnL2RvY3MvMS42LjEvcmVmLW1hbnVhbC9yZWYtbWFudWFsLmh0bWwjdmFyLUJCX0RJU0tNT05fRElSUyIgdGFyZ2V0PSJfYmxhbmsiPkJCX0RJU0tNT05fRElSUzwvYT48L2NvZGU+CisgICAgICAgICAgICAgICAgICAgIDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cueW9jdG9wcm9qZWN0Lm9yZy9kb2NzLzEuNi4xL3JlZi1tYW51YWwvcmVmLW1hbnVhbC5odG1sI3Zhci1CQl9OVU1CRVJfVEhSRUFEUyIgdGFyZ2V0PSJfYmxhbmsiPkJCX05VTUJFUl9USFJFQURTPC9hPjwvY29kZT4KKyAgICAgICAgICAgICAgICAgICAgPGNvZGU+Q1ZTX1BST1hZX0hPU1Q8L2NvZGU+CisgICAgICAgICAgICAgICAgICAgIDxjb2RlPkNWU19QUk9YWV9QT1JUPC9jb2RlPgorICAgICAgICAgICAgICAgICAgICA8Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LnlvY3RvcHJvamVjdC5vcmcvZG9jcy8xLjYuMS9yZWYtbWFudWFsL3JlZi1tYW51YWwuaHRtbCN2YXItRExfRElSIiB0YXJnZXQ9Il9ibGFuayI+RExfRElSPC9hPjwvY29kZT4KKyAgICAgICAgICAgICAgICAgICAgPGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy55b2N0b3Byb2plY3Qub3JnL2RvY3MvMS42LjEvcmVmLW1hbnVhbC9yZWYtbWFudWFsLmh0bWwjdmFyLVBBUkFMTEVMX01BS0UiIHRhcmdldD0iX2JsYW5rIj5QQVJBTExFTF9NQUtFPC9hPjwvY29kZT4KKyAgICAgICAgICAgICAgICAgICAgPGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy55b2N0b3Byb2plY3Qub3JnL2RvY3MvMS42LjEvcmVmLW1hbnVhbC9yZWYtbWFudWFsLmh0bWwjdmFyLVNTVEFURV9ESVIiIHRhcmdldD0iX2JsYW5rIj5TU1RBVEVfRElSPC9hPjwvY29kZT4KKyAgICAgICAgICAgICAgICAgICAgPGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy55b2N0b3Byb2plY3Qub3JnL2RvY3MvMS42LjEvcmVmLW1hbnVhbC9yZWYtbWFudWFsLmh0bWwjdmFyLVNTVEFURV9NSVJST1JTIiB0YXJnZXQ9Il9ibGFuayI+U1NUQVRFX01JUlJPUlM8L2E+PC9jb2RlPgorICAgICAgICAgICAgICAgICAgICA8Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LnlvY3RvcHJvamVjdC5vcmcvZG9jcy8xLjYuMS9yZWYtbWFudWFsL3JlZi1tYW51YWwuaHRtbCN2YXItVE1QRElSIiB0YXJnZXQ9Il9ibGFuayI+VE1QRElSPC9hPjwvY29kZT48L3A+CisgICAgICAgICAgICAgICAgICAgIDxwPlBsdXMgdGhlIGZvbGxvd2luZyBzdGFuZGFyZCBzaGVsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6PC9wPgorICAgICAgICAgICAgICAgICAgICA8cD48Y29kZT5odHRwX3Byb3h5PC9jb2RlPiA8Y29kZT5mdHBfcHJveHk8L2NvZGU+IDxjb2RlPmh0dHBzX3Byb3h5PC9jb2RlPiA8Y29kZT5hbGxfcHJveHk8L2NvZGU+PC9wPgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPC9maWVsZHNldD4KKyAgICAgICAgICA8L2Zvcm0+CisgICAgICAgIDwvZGl2PgorCisgICAgPC9kaXY+CisKKyAgICA8c2NyaXB0PgorCisgICAgICAgIC8vIGdsb2JhbCB2YXJpYWJsZXMKKyAgICAgICAgdmFyIGRvX3JlbG9hZD1mYWxzZTsKKworICAgICAgICAvLyB2YWxpZGF0ZSBuZXcgdmFyaWFibGUgbmFtZQorICAgICAgICBmdW5jdGlvbiB2YWxpZGF0ZV9uZXdfdmFyaWFibGUoKSB7CisgICAgICAgICAgICB2YXIgdmFyaWFibGUgPSAkKCJpbnB1dCN2YXJpYWJsZSIpLnZhbCgpOworICAgICAgICAgICAgdmFyIHZhbHVlICAgID0gJCgiaW5wdXQjdmFsdWUiKS52YWwoKTsKKworICAgICAgICAgICAgLy8gcHJlc3VtZWQgaW5ub2NlbmNlCisgICAgICAgICAgICAkKCcjbmV3LXZhcmlhYmxlLWVycm9yLW1lc3NhZ2UnKS50ZXh0KCIiKTsKKyAgICAgICAgICAgIHZhciBlcnJvcl9tc2cgPSAiIjsKKworICAgICAgICAgICAgdmFyIGV4aXN0aW5nX2NvbmZpZ3ZhcnMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdqcy1jb25maWctdmFyLW5hbWUnKTsKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBleGlzdGluZ19jb25maWd2YXJzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nX2NvbmZpZ3ZhcnNbaV0uaW5uZXJIVE1MLnRvVXBwZXJDYXNlKCkgPT0gdmFyaWFibGUudG9VcHBlckNhc2UoKSkgeworICAgICAgICAgICAgICAgICAgICBlcnJvcl9tc2cgPSAiVGhpcyB2YXJpYWJsZSBpcyBhbHJlYWR5IHNldCBpbiB0aGlzIHBhZ2UsIGVkaXQgaXRzIHZhbHVlIGluc3RlYWQiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJsYWNrbGlzdF9jb25maWd2YXJzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnanMtY29uZmlnLWJsYWNrbGlzdC1uYW1lJyk7CisgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gYmxhY2tsaXN0X2NvbmZpZ3ZhcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYmxhY2tsaXN0X2NvbmZpZ3ZhcnNbaV0udmFsdWUudG9VcHBlckNhc2UoKSA9PSB2YXJpYWJsZS50b1VwcGVyQ2FzZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGVycm9yX21zZyA9ICJZb3UgY2Fubm90IGVkaXQgdGhpcyB2YXJpYWJsZSBpbiBUb2FzdGVyIGJlY2F1c2UgaXQgaXMgc2V0IGJ5IHRoZSBidWlsZCBzZXJ2ZXJzIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBtYW5hZ2VkX2NvbmZpZ3ZhcnMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdqcy1jb25maWctbWFuYWdlZC1uYW1lJyk7CisgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gbWFuYWdlZF9jb25maWd2YXJzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKG1hbmFnZWRfY29uZmlndmFyc1tpXS52YWx1ZS50b1VwcGVyQ2FzZSgpID09IHZhcmlhYmxlLnRvVXBwZXJDYXNlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JfbXNnID0gIllvdSBjYW5ub3Qgc2V0IHRoaXMgdmFyaWFibGUgaGVyZS4gUGxlYXNlIHNldCBpdCBpbiB0aGUgPGEgaHJlZj1cInslIHVybCAncHJvamVjdCcgcHJvamVjdC5pZCAlfVwiPnByb2plY3QgbWFpbiBwYWdlPC9hPiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYmFkX2NoYXJzICA9IC9bXmEtekEtWjAtOVwtX10vLnRlc3QodmFyaWFibGUpOworICAgICAgICAgICAgdmFyIGhhc19zcGFjZXMgPSAoMCA8PSB2YXJpYWJsZS5pbmRleE9mKCIgIikpOworICAgICAgICAgICAgdmFyIG9ubHlfc3BhY2VzID0gKDAgPCB2YXJpYWJsZS5sZW5ndGgpICYmICgwID09IHZhcmlhYmxlLnRyaW0oKS5sZW5ndGgpOworCisgICAgICAgICAgICBpZiAob25seV9zcGFjZXMpIHsKKyAgICAgICAgICAgICAgICBlcnJvcl9tc2cgPSAiQSB2YWxpZCB2YXJpYWJsZSBuYW1lIGNhbm5vdCBpbmNsdWRlIHNwYWNlcyI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGJhZF9jaGFycyAmJiBoYXNfc3BhY2VzKSB7CisgICAgICAgICAgICAgICAgZXJyb3JfbXNnID0gIkEgdmFsaWQgdmFyaWFibGUgbmFtZSBjYW4gb25seSBpbmNsdWRlIGxldHRlcnMsIG51bWJlcnMsIHVuZGVyc2NvcmVzLCBkYXNoZXMsIGFuZCBjYW5ub3QgaW5jbHVkZSBzcGFjZXMiOworICAgICAgICAgICAgfSBlbHNlIGlmIChiYWRfY2hhcnMpIHsKKyAgICAgICAgICAgICAgICBlcnJvcl9tc2cgPSAiQSB2YWxpZCB2YXJpYWJsZSBuYW1lIGNhbiBvbmx5IGluY2x1ZGUgbGV0dGVycywgbnVtYmVycywgdW5kZXJzY29yZXMsIGFuZCBkYXNoZXMiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIiIgIT0gZXJyb3JfbXNnKSB7CisgICAgICAgICAgICAgICAgJCgnI25ldy12YXJpYWJsZS1lcnJvci1tZXNzYWdlJykuaHRtbChlcnJvcl9tc2cpOworICAgICAgICAgICAgICAgICQoIi5zYXZlIikuYXR0cigiZGlzYWJsZWQiLCJkaXNhYmxlZCIpOworCisgICAgICAgICAgICAgICAgLy8gYWRkIG9uZSAoYW5kIG9ubHkgb25lKSBlcnJvciBjbGFzcyBhcHBlbmQKKyAgICAgICAgICAgICAgICB2YXIgZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhZGQtY29uZmlndmFyLW5hbWUtZGl2Iik7CisgICAgICAgICAgICAgICAgZC5jbGFzc05hbWUgPSBkLmNsYXNzTmFtZS5yZXBsYWNlKCIgZXJyb3IiLCIiKTsKKyAgICAgICAgICAgICAgICBkLmNsYXNzTmFtZSA9IGQuY2xhc3NOYW1lICsgIiBlcnJvciI7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKDAgPT0gdmFyaWFibGUubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgJCgiLnNhdmUiKS5hdHRyKCJkaXNhYmxlZCIsImRpc2FibGVkIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhZGQtY29uZmlndmFyLW5hbWUtZGl2Iik7CisgICAgICAgICAgICBkLmNsYXNzTmFtZSA9IGQuY2xhc3NOYW1lLnJlcGxhY2UoIiBlcnJvciIsIiIpOworCisgICAgICAgICAgICAvLyBub3cgc2V0IHRoZSAiU2F2ZSIgZW5hYmxlbWVudCBpZiAndmFsdWUnIGFsc28gcGFzc2VzCisgICAgICAgICAgICBpZiAodmFsdWUudHJpbSgpLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAkKCIuc2F2ZSIpLnJlbW92ZUF0dHIoImRpc2FibGVkIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICQoIi5zYXZlIikuYXR0cigiZGlzYWJsZWQiLCJkaXNhYmxlZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZhbGlkYXRlIGRpc3RybyBuYW1lCisgICAgICAgIGZ1bmN0aW9uIHZhbGlkYXRlX2Rpc3Ryb19uYW1lKCkgeworICAgICAgICAgICAgIHZhciB2YWx1ZSAgICA9ICQoImlucHV0I25ldy1kaXN0cm8iKS52YWwoKTsKKworICAgICAgICAgICAgLy8gcHJlc3VtZWQgaW5ub2NlbmNlCisgICAgICAgICAgICAkKCcjZGlzdHJvLWVycm9yLW1lc3NhZ2UnKS50ZXh0KCIiKTsKKyAgICAgICAgICAgIHZhciBlcnJvcl9tc2cgPSAiIjsKKworICAgICAgICAgICAgdmFyIGhhc19zcGFjZXMgPSAoMCA8PSB2YWx1ZS5pbmRleE9mKCIgIikpOworCisgICAgICAgICAgICBpZiAoaGFzX3NwYWNlcykgeworICAgICAgICAgICAgICAgIGVycm9yX21zZyA9ICJBIHZhbGlkIGRpc3RybyBuYW1lIGNhbm5vdCBpbmNsdWRlIHNwYWNlcyI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKDAgPT0gdmFsdWUubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgZXJyb3JfbXNnID0gIiAiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIiIgIT0gZXJyb3JfbXNnKSB7CisgICAgICAgICAgICAgICAgJCgnI2Rpc3Ryby1lcnJvci1tZXNzYWdlJykudGV4dChlcnJvcl9tc2cpOworICAgICAgICAgICAgICAgICQoIiNhcHBseS1jaGFuZ2UtZGlzdHJvIikuYXR0cigiZGlzYWJsZWQiLCJkaXNhYmxlZCIpOworCisgICAgICAgICAgICAgICAgLy8gYWRkIG9uZSAoYW5kIG9ubHkgb25lKSBlcnJvciBjbGFzcyBhcHBlbmQKKyAgICAgICAgICAgICAgICB2YXIgZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlZGl0LWRpc3Ryby1uYW1lLWRpdiIpOworICAgICAgICAgICAgICAgIGQuY2xhc3NOYW1lID0gZC5jbGFzc05hbWUucmVwbGFjZSgiIGVycm9yIiwiIik7CisgICAgICAgICAgICAgICAgZC5jbGFzc05hbWUgPSBkLmNsYXNzTmFtZSArICIgZXJyb3IiOworCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlZGl0LWRpc3Ryby1uYW1lLWRpdiIpOworICAgICAgICAgICAgZC5jbGFzc05hbWUgPSBkLmNsYXNzTmFtZS5yZXBsYWNlKCIgZXJyb3IiLCIiKTsKKyAgICAgICAgICAgICQoIiNhcHBseS1jaGFuZ2UtZGlzdHJvIikucmVtb3ZlQXR0cigiZGlzYWJsZWQiKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGVzdCB0byBpbnN1cmUgYXQgbGVhc3Qgb25lIEZTIFR5cGUgaXMgY2hlY2tlZAorICAgICAgICBmdW5jdGlvbiBlbmFibGVGc1R5cGVzU2F2ZSgpIHsKKyAgICAgICAgICAgIHZhciBhbnlfY2hlY2tlZCA9IDA7CisgICAgICAgICAgICAkKCIuZnMtY2hlY2tib3gtZnN0eXBlczpjaGVja2VkIikuZWFjaChmdW5jdGlvbigpeworICAgICAgICAgICAgICAgIGFueV9jaGVja2VkID0gMTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgaWYgKCAwID09IGFueV9jaGVja2VkICkgeworICAgICAgICAgICAgICAgICQoIiNhcHBseS1jaGFuZ2UtaW1hZ2VfZnN0eXBlcyIpLmF0dHIoImRpc2FibGVkIiwiZGlzYWJsZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICQoIiNhcHBseS1jaGFuZ2UtaW1hZ2VfZnN0eXBlcyIpLnJlbW92ZUF0dHIoImRpc2FibGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBQcmVzZXQgb3IgcmVzZXQgdGhlIFBhY2thZ2UgQ2xhc3MgY2hlY2tib3ggbGFiZWxzCisgICAgICAgIGZ1bmN0aW9uIHVwZGF0ZVBhY2thZ2VDbGFzc0NoZWNrYm94ZXMoKSB7CisgICAgICAgICAgICAkKCcjcGFja2FnZV9jbGFzc18xLCAjcGFja2FnZV9jbGFzc18yJykuaGlkZSgpOworICAgICAgICAgICAgaWYgKCQoJ3NlbGVjdCcpLnZhbCgpID09ICdwYWNrYWdlX2RlYicpIHsKKyAgICAgICAgICAgICAgICAkKCcjcGFja2FnZV9jbGFzc18xJykuaHRtbCgnPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0icGFja2FnZV9jbGFzc18xX2lucHV0Ij4gcGFja2FnZV9pcGsnKTsKKyAgICAgICAgICAgICAgICAkKCcjcGFja2FnZV9jbGFzc18yJykuaHRtbCgnPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0icGFja2FnZV9jbGFzc18yX2lucHV0Ij4gcGFja2FnZV9ycG0nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgkKCdzZWxlY3QnKS52YWwoKSA9PSAncGFja2FnZV9pcGsnKSB7CisgICAgICAgICAgICAgICAgJCgnI3BhY2thZ2VfY2xhc3NfMScpLmh0bWwoJzxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9InBhY2thZ2VfY2xhc3NfMV9pbnB1dCI+IHBhY2thZ2VfZGViJyk7CisgICAgICAgICAgICAgICAgJCgnI3BhY2thZ2VfY2xhc3NfMicpLmh0bWwoJzxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9InBhY2thZ2VfY2xhc3NfMl9pbnB1dCI+IHBhY2thZ2VfcnBtJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoJCgnc2VsZWN0JykudmFsKCkgPT0gJ3BhY2thZ2VfcnBtJykgeworICAgICAgICAgICAgICAgICQoJyNwYWNrYWdlX2NsYXNzXzEnKS5odG1sKCc8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJwYWNrYWdlX2NsYXNzXzFfaW5wdXQiPiBwYWNrYWdlX2RlYicpOworICAgICAgICAgICAgICAgICQoJyNwYWNrYWdlX2NsYXNzXzInKS5odG1sKCc8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJwYWNrYWdlX2NsYXNzXzJfaW5wdXQiPiBwYWNrYWdlX2lwaycpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgJCgnI3BhY2thZ2VfY2xhc3NfMSwgI3BhY2thZ2VfY2xhc3NfMicpLmZhZGVJbigxNTAwKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlLWFzc2VydCBoYW5kbGVycyB3aGVuIHRoZSBwYWdlIGlzIHNlcnZlZCBhbmQvb3IgcmVmcmVzaGVkIHZpYSBBamF4CisgICAgICAgIGZ1bmN0aW9uIHNldEV2ZW50SGFuZGxlcnNGb3JEeW5hbWljRWxlbWVudHMoKSB7CisKKyAgICAgICAgICAgIC8vIGNoYW5nZSB2YXJpYWJsZSB2YWx1ZQorICAgICAgICAgICAgJCgnLmpzLWljb24tcGVuY2lsLWNvbmZpZ192YXInKS5jbGljayhmdW5jdGlvbiAoZXZ0KSB7CisgICAgICAgICAgICAgICAgdmFyIHBrID0gZXZ0LnRhcmdldC5hdHRyaWJ1dGVzWyJ4LWRhdGEiXS52YWx1ZTsKKyAgICAgICAgICAgICAgICB2YXIgY3VycmVudF92YWwgPSAkKCJzcGFuI2NvbmZpZ192YXJfdmFsdWVfIitwaykudGV4dCgpOworICAgICAgICAgICAgICAgICQoJy5qcy1pY29uLXBlbmNpbC1jb25maWdfdmFyLCAuanMtaWNvbi10cmFzaC1jb25maWdfdmFyLCAjY29uZmlnX3Zhcl92YWx1ZV8nK3BrKS5oaWRlKCk7CisgICAgICAgICAgICAgICAgJCgiI2NoYW5nZS1jb25maWdfdmFyLWZvcm1fIitwaykuc2xpZGVEb3duKCk7CisgICAgICAgICAgICAgICAgJCgiaW5wdXQjbmV3LWNvbmZpZ192YXJfIitwaykudmFsKGN1cnJlbnRfdmFsKTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAkKCcuanMtY2FuY2VsLWNoYW5nZS1jb25maWdfdmFyJykuY2xpY2soZnVuY3Rpb24gKGV2dCkgeworICAgICAgICAgICAgICAgIHZhciBwayA9IGV2dC50YXJnZXQuYXR0cmlidXRlc1sieC1kYXRhIl0udmFsdWU7CisgICAgICAgICAgICAgICAgJCgiI2NoYW5nZS1jb25maWdfdmFyLWZvcm1fIitwaykuc2xpZGVVcChmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgJCgnLmpzLWljb24tcGVuY2lsLWNvbmZpZ192YXIsIC5qcy1pY29uLXRyYXNoLWNvbmZpZ192YXIsICNjb25maWdfdmFyX3ZhbHVlXycrcGspLnNob3coKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAkKCIuanMtbmV3LWNvbmZpZ192YXIiKS5vbignaW5wdXQnLCBmdW5jdGlvbigpeworICAgICAgICAgICAgICAgIGlmICgkKHRoaXMpLnZhbCgpLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICQoIi5qcy1hcHBseS1jaGFuZ2UtY29uZmlnX3ZhciIpLmF0dHIoImRpc2FibGVkIiwiZGlzYWJsZWQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICQoIi5qcy1hcHBseS1jaGFuZ2UtY29uZmlnX3ZhciIpLnJlbW92ZUF0dHIoImRpc2FibGVkIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICQoJy5qcy1hcHBseS1jaGFuZ2UtY29uZmlnX3ZhcicpLmNsaWNrKGZ1bmN0aW9uIChldnQpIHsKKyAgICAgICAgICAgICAgICB2YXIgeGRhdGEgICAgPSBldnQudGFyZ2V0LmF0dHJpYnV0ZXNbIngtZGF0YSJdLnZhbHVlLnNwbGl0KCI6Iik7CisgICAgICAgICAgICAgICAgdmFyIHBrICAgICAgID0geGRhdGFbMF07CisgICAgICAgICAgICAgICAgdmFyIHZhcmlhYmxlID0geGRhdGFbMV07CisgICAgICAgICAgICAgICAgdmFyIHZhbCAgICAgID0gJCgnI25ldy1jb25maWdfdmFyXycrcGspLnZhbCgpOworICAgICAgICAgICAgICAgIHBvc3RFZGl0QWpheFJlcXVlc3QoeyJjb25maWd2YXJDaGFuZ2UiIDogdmFyaWFibGUrJzonK3ZhbH0pOworICAgICAgICAgICAgICAgICQoJyNjb25maWdfdmFyX3ZhbHVlXycrcGspLnBhcmVudCgpLnJlbW92ZUNsYXNzKCdtdXRlZCcpOworICAgICAgICAgICAgICAgICQoIiNjaGFuZ2UtY29uZmlnX3Zhci1mb3JtXyIrcGspLnNsaWRlVXAoZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgICAgICQoJy5qcy1pY29uLXBlbmNpbC1jb25maWdfdmFyLCAuanMtaWNvbi10cmFzaC1jb25maWdfdmFyLCAjY29uZmlnX3Zhcl92YWx1ZV8nK3BrKS5zaG93KCk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgLy8gZGVsZXRlIHZhcmlhYmxlCisgICAgICAgICAgICAkKCIuanMtaWNvbi10cmFzaC1jb25maWdfdmFyIikuY2xpY2soZnVuY3Rpb24gKGV2dCkgeworICAgICAgICAgICAgICAgIHZhciB4ZGF0YSAgICA9IGV2dC50YXJnZXQuYXR0cmlidXRlc1sieC1kYXRhIl0udmFsdWUuc3BsaXQoIjoiKTsKKyAgICAgICAgICAgICAgICB2YXIgcGsgICAgICAgPSB4ZGF0YVswXTsKKworICAgICAgICAgICAgICAgIC8vIGhpZGUgdGhlIGRhbmdsaW5nIHRyYXNoIHRvb2x0aXAKKyAgICAgICAgICAgICAgICAkKCcjY29uZmlnX3Zhcl90cmFzaF8nK3BrKS5oaWRlKCk7CisKKyAgICAgICAgICAgICAgICAvLyBmYWRlIG91dCB0aGUgdmFyaWFibGUrdmFsdWUgZGl2LCB0aGVuIHJlZnJlc2ggdGhlIHZhcmlhYmxlIGxpc3QKKyAgICAgICAgICAgICAgICAkKCcjY29uZmlnX3Zhcl9lbnRyeV8nK3BrKS5wYXJlbnQoKS5wYXJlbnQoKS5mYWRlT3V0KDEwMDAsIGZ1bmN0aW9uKCl7CisgICAgICAgICAgICAgICAgICAgICBwb3N0RWRpdEFqYXhSZXF1ZXN0KHsiY29uZmlndmFyRGVsIjogZXZ0LnRhcmdldC5hdHRyaWJ1dGVzWyJ4LWRhdGEiXS52YWx1ZX0pOworICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICB9KTsKKworICAgICAgICB9CisKKyAgICAgICAgZnVuY3Rpb24gb25FZGl0UGFnZVVwZGF0ZShkYXRhKSB7CisgICAgICAgICAgICAvLyB1cGRhdGUgdGFyZ2V0cworICAgICAgICAgICAgdmFyIGk7IHZhciBvcmlnaHRtbCA9ICIiOworCisgICAgICAgICAgICB2YXIgY29uZmlndmFyc19zb3J0ZWQgPSBkYXRhLmNvbmZpZ3ZhcnMuc29ydChmdW5jdGlvbihhLCBiKXtyZXR1cm4gYVswXSA+IGJbMF19KTsKKworICAgICAgICAgICAgdmFyIG1hbmFnZWRfY29uZmlndmFycyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2pzLWNvbmZpZy12YXItbWFuYWdlZC1uYW1lJyk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb25maWd2YXJzX3NvcnRlZC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIC8vIHNraXAgaWYgdGhlIHZhcmlhYmxlIG5hbWUgaGFzIGEgc3BlY2lhbCBjb250ZXh0IChub3QgdXNlciBkZWZpbmVkKQorICAgICAgICAgICAgICAgIHZhciB2YXJfY29udGV4dD11bmRlZmluZWQ7CisgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDAsIGxlbmd0aCA9IG1hbmFnZWRfY29uZmlndmFycy5sZW5ndGg7IGogPCBsZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoKG1hbmFnZWRfY29uZmlndmFyc1tqXS5pbm5lckhUTUwgPT0gY29uZmlndmFyc19zb3J0ZWRbaV1bMF0pIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAobWFuYWdlZF9jb25maWd2YXJzW2pdLnZhbHVlICAgICA9PSBjb25maWd2YXJzX3NvcnRlZFtpXVswXSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXJfY29udGV4dD0nbSc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHZhcl9jb250ZXh0ID09IHVuZGVmaW5lZCkgeworICAgICAgICAgICAgICAgICAgICBvcmlnaHRtbCArPSAnPGRpdj4gPGR0PjxzcGFuIGlkPSJjb25maWdfdmFyX2VudHJ5XycrY29uZmlndmFyc19zb3J0ZWRbaV1bMl0rJyIgY2xhc3M9ImpzLWNvbmZpZy12YXItbmFtZSI+PC9zcGFuPjxpIGNsYXNzPSJpY29uLXRyYXNoIGpzLWljb24tdHJhc2gtY29uZmlnX3ZhciIgaWQ9ImNvbmZpZ192YXJfdHJhc2hfJytjb25maWd2YXJzX3NvcnRlZFtpXVsyXSsnIiB4LWRhdGE9IicrY29uZmlndmFyc19zb3J0ZWRbaV1bMl0rJyI+PC9pPiA8L2R0PicKKyAgICAgICAgICAgICAgICAgICAgb3JpZ2h0bWwgKz0gJzxkZCBjbGFzcz0ibGVhZCI+JworICAgICAgICAgICAgICAgICAgICBvcmlnaHRtbCArPSAnICAgIDxzcGFuIGlkPSJjb25maWdfdmFyX3ZhbHVlXycrY29uZmlndmFyc19zb3J0ZWRbaV1bMl0rJyI+PC9zcGFuPicKKyAgICAgICAgICAgICAgICAgICAgb3JpZ2h0bWwgKz0gJyAgICA8aSBjbGFzcz0iaWNvbi1wZW5jaWwganMtaWNvbi1wZW5jaWwtY29uZmlnX3ZhciIgeC1kYXRhPSInK2NvbmZpZ3ZhcnNfc29ydGVkW2ldWzJdKyciPjwvaT4nCisgICAgICAgICAgICAgICAgICAgIG9yaWdodG1sICs9ICcgICAgPGZvcm0gaWQ9ImNoYW5nZS1jb25maWdfdmFyLWZvcm1fJytjb25maWd2YXJzX3NvcnRlZFtpXVsyXSsnIiBzdHlsZT0iZGlzcGxheTpub25lOyI+JworICAgICAgICAgICAgICAgICAgICBvcmlnaHRtbCArPSAnICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1hcHBlbmQiPicKKyAgICAgICAgICAgICAgICAgICAgb3JpZ2h0bWwgKz0gJyAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iaW5wdXQteGxhcmdlIGpzLW5ldy1jb25maWdfdmFyIiBpZD0ibmV3LWNvbmZpZ192YXJfJytjb25maWd2YXJzX3NvcnRlZFtpXVsyXSsnIiB2YWx1ZT0iIj4nCisgICAgICAgICAgICAgICAgICAgIG9yaWdodG1sICs9ICcgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4ganMtYXBwbHktY2hhbmdlLWNvbmZpZ192YXIiIHR5cGU9ImJ1dHRvbiIgeC1kYXRhPSInK2NvbmZpZ3ZhcnNfc29ydGVkW2ldWzJdKyc6Jytjb25maWd2YXJzX3NvcnRlZFtpXVswXSsnIiBkaXNhYmxlZD5TYXZlPC9idXR0b24+JworICAgICAgICAgICAgICAgICAgICBvcmlnaHRtbCArPSAnICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLWxpbmsganMtY2FuY2VsLWNoYW5nZS1jb25maWdfdmFyIiB4LWRhdGE9IicrY29uZmlndmFyc19zb3J0ZWRbaV1bMl0rJyI+Q2FuY2VsPC9idXR0b24+JworICAgICAgICAgICAgICAgICAgICBvcmlnaHRtbCArPSAnICAgICAgICA8L2Rpdj4nCisgICAgICAgICAgICAgICAgICAgIG9yaWdodG1sICs9ICcgICAgPC9mb3JtPicKKyAgICAgICAgICAgICAgICAgICAgb3JpZ2h0bWwgKz0gJzwvZGQ+IDwvZGl2PicKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHVwZGF0ZSBjb25maWd2YXJzIGxpc3QgSFRNTCBmcmFtZXdvcmsKKyAgICAgICAgICAgICQoImRsI2NvbmZpZ3Zhci1saXN0IikuaHRtbChvcmlnaHRtbCk7CisKKyAgICAgICAgICAgIC8vIGluc2VydCB0aGUgbmFtZS92YWx1ZSBwYWlycyBzYWZlbHkgYXMgbm9uLUhUTUwKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb25maWd2YXJzX3NvcnRlZC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICQoJyNjb25maWdfdmFyX2VudHJ5XycrY29uZmlndmFyc19zb3J0ZWRbaV1bMl0pLnRleHQoY29uZmlndmFyc19zb3J0ZWRbaV1bMF0pOworICAgICAgICAgICAgICAgICQoJyNjb25maWdfdmFyX3ZhbHVlXycrY29uZmlndmFyc19zb3J0ZWRbaV1bMl0pLnRleHQoY29uZmlndmFyc19zb3J0ZWRbaV1bMV0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBZGQgdGhlIHRvb2x0aXBzCisgICAgICAgICAgICAkKCIuanMtaWNvbi10cmFzaC1jb25maWdfdmFyIikuZWFjaCggZnVuY3Rpb24oKXsgc2V0RGVsZXRlVG9vbHRpcCgkKHRoaXMpKTsgfSk7CisgICAgICAgICAgICAkKCIuanMtaWNvbi1wZW5jaWwtY29uZmlnX3ZhciIpLmVhY2goZnVuY3Rpb24oKXsgc2V0Q2hhbmdlVG9vbHRpcCgkKHRoaXMpKTsgfSk7CisKKyAgICAgICAgICAgIC8vIHJlLWFzc2VydCB0aGVzZSBldmVudCBoYW5kbGVycworICAgICAgICAgICAgc2V0RXZlbnRIYW5kbGVyc0ZvckR5bmFtaWNFbGVtZW50cygpOworICAgICAgICB9CisKKyAgICAgICAgZnVuY3Rpb24gb25FZGl0QWpheFN1Y2Nlc3MoZGF0YSwgdGV4dHN0YXR1cykgeworICAgICAgICAgICAgLy8gY29uc29sZS5sb2coIlhIUiByZXR1cm5lZDoiLCBkYXRhLCAiKCIgKyB0ZXh0c3RhdHVzICsgIikiKTsKKyAgICAgICAgICAgIGlmIChkYXRhLmVycm9yICE9ICJvayIpIHsKKyAgICAgICAgICAgICAgICBhbGVydCgiZXJyb3Igb24gcmVxdWVzdDpcbiIgKyBkYXRhLmVycm9yKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGRlbGF5ZWQgcGFnZSByZWxvYWQ/CisgICAgICAgICAgICBpZiAoZG9fcmVsb2FkKSB7CisgICAgICAgICAgICAgICAgZG9fcmVsb2FkPWZhbHNlOworICAgICAgICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb25FZGl0UGFnZVVwZGF0ZShkYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZ1bmN0aW9uIG9uRWRpdEFqYXhFcnJvcihqcVhIUiwgdGV4dHN0YXR1cywgZXJyb3IpIHsKKyAgICAgICAgICAgIGFsZXJ0KCJYSFIgZXJyb3JlZDpcbiIgKyBlcnJvciArICJcbigiICsgdGV4dHN0YXR1cyArICIpIik7CisgICAgICAgICAgICAvLyByZS1hc3NlcnQgdGhlIGV2ZW50IGhhbmRsZXJzCisgICAgICAgIH0KKworICAgICAgICAvKiBlbnN1cmUgY29va2llIGV4aXN0cyB7JSBjc3JmX3Rva2VuICV9ICovCisgICAgICAgIGZ1bmN0aW9uIHBvc3RFZGl0QWpheFJlcXVlc3QocmVxZGF0YSkgeworICAgICAgICAgICAgdmFyIGFqYXggPSAkLmFqYXgoeworICAgICAgICAgICAgICAgICAgICB0eXBlOiJQT1NUIiwKKyAgICAgICAgICAgICAgICAgICAgZGF0YTogJC5wYXJhbShyZXFkYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgdXJsOiJ7JSB1cmwgJ3hocl9jb25maWd2YXJlZGl0JyBwcm9qZWN0LmlkJX0iLAorICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7ICdYLUNTUkZUb2tlbic6ICQuY29va2llKCJjc3JmdG9rZW4iKX0sCisgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IG9uRWRpdEFqYXhTdWNjZXNzLAorICAgICAgICAgICAgICAgICAgICBlcnJvcjogb25FZGl0QWpheEVycm9yLAorICAgICAgICAgICAgfSkKKyAgICAgICAgfQorCisgICAgICAgIGZ1bmN0aW9uIHNldERlbGV0ZVRvb2x0aXAob2JqZWN0KSB7CisgICAgICAgICAgICBvYmplY3QudG9vbHRpcCh7IGNvbnRhaW5lcjogJ2JvZHknLCBodG1sOiB0cnVlLCBkZWxheToge3Nob3c6IDQwMH0sIHRpdGxlOiAiRGVsZXRlIiB9KTsKKyAgICAgICAgfQorICAgICAgICBmdW5jdGlvbiBzZXRDaGFuZ2VUb29sdGlwKG9iamVjdCkgeworICAgICAgICAgICAgb2JqZWN0LnRvb2x0aXAoeyBjb250YWluZXI6ICdib2R5JywgaHRtbDogdHJ1ZSwgZGVsYXk6IHtzaG93OiA0MDB9LCB0aXRsZTogIkNoYW5nZSIgfSk7CisgICAgICAgIH0KKworICAgICAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFJlZ2lzdGVyIGhhbmRsZXJzIGZvciBzdGF0aWMgZWxlbWVudHMKKyAgICAgICAgICAgIC8vCisKKyAgICAgICAgICAgIHslIGlmIGRpc3Ryb19kZWZpbmVkICV9CisgICAgICAgICAgICAvLyBjaGFuZ2UgZGlzdHJvIHZhcmlhYmxlCisgICAgICAgICAgICAkKCcjY2hhbmdlLWRpc3Ryby1pY29uJykuY2xpY2soZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgJCgnI2NoYW5nZS1kaXN0cm8taWNvbiwgI2Rpc3RybycpLmhpZGUoKTsKKyAgICAgICAgICAgICAgICAkKCIjY2hhbmdlLWRpc3Ryby1mb3JtIikuc2xpZGVEb3duKCk7CisgICAgICAgICAgICAgICAgJCgiI25ldy1kaXN0cm8iKS52YWwoICQoJyNkaXN0cm8nKS50ZXh0KCkgKTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAkKCcjY2FuY2VsLWNoYW5nZS1kaXN0cm8nKS5jbGljayhmdW5jdGlvbigpeworICAgICAgICAgICAgICAgICQoIiNjaGFuZ2UtZGlzdHJvLWZvcm0iKS5zbGlkZVVwKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICAkKCcjZGlzdHJvLCAjY2hhbmdlLWRpc3Ryby1pY29uJykuc2hvdygpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0IGFueSBkYW5nbGluZyBlcnJvciBzdGF0ZQorICAgICAgICAgICAgICAgICAgICAkKCcjZGlzdHJvLWVycm9yLW1lc3NhZ2UnKS50ZXh0KCIiKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZWRpdC1kaXN0cm8tbmFtZS1kaXYiKTsKKyAgICAgICAgICAgICAgICAgICAgZC5jbGFzc05hbWUgPSBkLmNsYXNzTmFtZS5yZXBsYWNlKCIgZXJyb3IiLCIiKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAvLyB2YWxpZGF0ZSBuZXcgZGlzdHJvIG5hbWUKKyAgICAgICAgICAgICQoImlucHV0I25ldy1kaXN0cm8iKS5vbignaW5wdXQnLCBmdW5jdGlvbiAoZXZ0KSB7CisgICAgICAgICAgICAgICAgdmFsaWRhdGVfZGlzdHJvX25hbWUoKTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAkKCcjYXBwbHktY2hhbmdlLWRpc3RybycpLmNsaWNrKGZ1bmN0aW9uKCl7CisgICAgICAgICAgICAgICAgLy8kKCcjcmVwbycpLnBhcmVudCgpLnJlbW92ZUNsYXNzKCdoaWdobGlnaHQtZ28nKTsKKyAgICAgICAgICAgICAgICB2YXIgbmFtZSA9ICQoJyNuZXctZGlzdHJvJykudmFsKCk7CisgICAgICAgICAgICAgICAgcG9zdEVkaXRBamF4UmVxdWVzdCh7ImNvbmZpZ3ZhckNoYW5nZSIgOiAnRElTVFJPOicrbmFtZX0pOworICAgICAgICAgICAgICAgICQoJyNkaXN0cm8nKS50ZXh0KG5hbWUpOworICAgICAgICAgICAgICAgICQoIiNjaGFuZ2UtZGlzdHJvLWZvcm0iKS5zbGlkZVVwKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgICAgICAgICAgJCgnI2Rpc3RybywgI2NoYW5nZS1kaXN0cm8taWNvbicpLnNob3coKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgeyUgZW5kaWYgJX0KKworCisgICAgICAgICAgICB7JSBpZiBmc3R5cGVzX2RlZmluZWQgJX0KKyAgICAgICAgICAgIC8vIGNoYW5nZSBJTUFHRV9GU1RZUEVTIHZhcmlhYmxlCisKKyAgICAgICAgICAgICQoJyNjaGFuZ2UtaW1hZ2VfZnN0eXBlcy1pY29uJykuY2xpY2soZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgJCgnI2NoYW5nZS1pbWFnZV9mc3R5cGVzLWljb24sICNpbWFnZV9mc3R5cGVzJykuaGlkZSgpOworICAgICAgICAgICAgICAgICQoIiNjaGFuZ2UtaW1hZ2VfZnN0eXBlcy1mb3JtIikuc2xpZGVEb3duKCk7CisgICAgICAgICAgICAgICAgLy8gYXZvaWQgZmFsc2Ugc3Vic3RyaW5nIG1hdGNoZXMgYnkgaW5jbHVkaW5nIHNwYWNlIHNlcGFyYXRvcnMKKyAgICAgICAgICAgICAgICB2YXIgaHRtbCAgICAgICAgID0gIiI7CisgICAgICAgICAgICAgICAgdmFyIGZzdHlwZXMgICAgICA9ICIgIiArIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJpbWFnZV9mc3R5cGVzIikuaW5uZXJIVE1MICsgIiAiOworICAgICAgICAgICAgICAgIHZhciBmc3R5cGVzX2xpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdqcy1jaGVja2JveC1mc3R5cGVzLWxpc3QnKTsKKyAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGNoZWNrZWQgYm94ZXMgZmlyc3QKKyAgICAgICAgICAgICAgICBpZiAoIiAgIiAhPSBmc3R5cGVzKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBmc3R5cGVzX2xpc3QubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwIDw9IGZzdHlwZXMuaW5kZXhPZigiICIrZnN0eXBlc19saXN0W2ldLnZhbHVlKyIgIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCArPSAnPGxhYmVsIGNsYXNzPSJjaGVja2JveCI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBjbGFzcz0iZnMtY2hlY2tib3gtZnN0eXBlcyIgdmFsdWU9IicrZnN0eXBlc19saXN0W2ldLnZhbHVlKyciIGNoZWNrZWQ9ImNoZWNrZWQiPicrZnN0eXBlc19saXN0W2ldLnZhbHVlKyc8L2xhYmVsPlxuJzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIHVuLWNoZWNrZWQgYm94ZXMgc2Vjb25kCisgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGZzdHlwZXNfbGlzdC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoMCAgPiBmc3R5cGVzLmluZGV4T2YoIiAiK2ZzdHlwZXNfbGlzdFtpXS52YWx1ZSsiICIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCArPSAnPGxhYmVsIGNsYXNzPSJjaGVja2JveCI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBjbGFzcz0iZnMtY2hlY2tib3gtZnN0eXBlcyIgdmFsdWU9IicrZnN0eXBlc19saXN0W2ldLnZhbHVlKyciPicrZnN0eXBlc19saXN0W2ldLnZhbHVlKyc8L2xhYmVsPlxuJzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxsLWltYWdlX2ZzdHlwZXMiKS5pbm5lckhUTUwgPSBodG1sOworCisgICAgICAgICAgICAgICAgLy8gV2F0Y2ggZWxlbWVudHMgdG8gZGlzYWJsZSBTYXZlIHdoZW4gbm9uZSBhcmUgY2hlY2tlZAorICAgICAgICAgICAgICAgICQoIi5mcy1jaGVja2JveC1mc3R5cGVzIikuZWFjaChmdW5jdGlvbigpeworICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNsaWNrKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlRnNUeXBlc1NhdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICAvLyBjbGVhciB0aGUgcHJldmlvdXMgZmlsdGVyIHZhbHVlcworICAgICAgICAgICAgICAgICQoImlucHV0I2ZpbHRlci1pbWFnZV9mc3R5cGVzIikudmFsKCIiKTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAkKCcjY2FuY2VsLWNoYW5nZS1pbWFnZV9mc3R5cGVzJykuY2xpY2soZnVuY3Rpb24oKXsKKyAgICAgICAgICAgICAgICAkKCIjY2hhbmdlLWltYWdlX2ZzdHlwZXMtZm9ybSIpLnNsaWRlVXAoZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgICAgICQoJyNpbWFnZV9mc3R5cGVzLCAjY2hhbmdlLWltYWdlX2ZzdHlwZXMtaWNvbicpLnNob3coKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAkKCcjZmlsdGVyLWltYWdlX2ZzdHlwZXMnKS5vbignaW5wdXQnLCBmdW5jdGlvbigpeworICAgICAgICAgICAgICAgICAgIHZhciB2YWxUaGlzID0gJCh0aGlzKS52YWwoKS50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgICAgICQoJyNhbGwtaW1hZ2VfZnN0eXBlcyBsYWJlbCcpLmVhY2goZnVuY3Rpb24oKXsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHRleHQgPSAkKHRoaXMpLnRleHQoKS50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSB0ZXh0LmluZGV4T2YodmFsVGhpcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLnNob3coKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuaGlkZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgJCgnI2FwcGx5LWNoYW5nZS1pbWFnZV9mc3R5cGVzJykuY2xpY2soZnVuY3Rpb24oKXsKKyAgICAgICAgICAgICAgICAvLyBleHRyYWN0IHRoZSBzZWxlY3RlZCBmc3R5cGVzIGFuZCBzb3J0IHRoZW0KKyAgICAgICAgICAgICAgICB2YXIgZnN0eXBlc19hcnJheSA9IFtdOworICAgICAgICAgICAgICAgIHZhciBjaGVja2JveGVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZnMtY2hlY2tib3gtZnN0eXBlcycpOworICAgICAgICAgICAgICAgICQoIi5mcy1jaGVja2JveC1mc3R5cGVzOmNoZWNrZWQiKS5lYWNoKGZ1bmN0aW9uKCl7CisgICAgICAgICAgICAgICAgICAgICAgIGZzdHlwZXNfYXJyYXkucHVzaCgkKHRoaXMpLnZhbCgpKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBmc3R5cGVzX2FycmF5LnNvcnQoKTsKKworICAgICAgICAgICAgICAgIC8vIG5vdyBtYWtlIGEgc3RyaW5nIG9mIHRoZW0KKyAgICAgICAgICAgICAgICB2YXIgZnN0eXBlcyA9ICcnOworICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBmc3R5cGVzX2FycmF5Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGZzdHlwZXMgKz0gZnN0eXBlc19hcnJheVtpXSArICcgJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZnN0eXBlcyA9IGZzdHlwZXMudHJpbSgpOworCisgICAgICAgICAgICAgICAgcG9zdEVkaXRBamF4UmVxdWVzdCh7ImNvbmZpZ3ZhckNoYW5nZSIgOiAnSU1BR0VfRlNUWVBFUzonK2ZzdHlwZXN9KTsKKyAgICAgICAgICAgICAgICAkKCcjaW1hZ2VfZnN0eXBlcycpLnRleHQoZnN0eXBlcyk7CisgICAgICAgICAgICAgICAgJCgnI2ltYWdlX2ZzdHlwZXMnKS5wYXJlbnQoKS5yZW1vdmVDbGFzcygnbXV0ZWQnKTsKKworICAgICAgICAgICAgICAgICQoIiNjaGFuZ2UtaW1hZ2VfZnN0eXBlcy1mb3JtIikuc2xpZGVVcChmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgJCgnI2ltYWdlX2ZzdHlwZXMsICNjaGFuZ2UtaW1hZ2VfZnN0eXBlcy1pY29uJykuc2hvdygpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB7JSBlbmRpZiAlfQorCisKKyAgICAgICAgICAgIHslIGlmIGltYWdlX2luc3RhbGxfYXBwZW5kX2RlZmluZWQgJX0KKworICAgICAgICAgICAgLy8gaW5pdCBJTUFHRV9JTlNUQUxMX2FwcGVuZCB0cmFzaCBpY29uCisgICAgICAgICAgICBzZXREZWxldGVUb29sdGlwKCQoJyNkZWxldGUtaW1hZ2VfaW5zdGFsbC1pY29uJykpOworCisgICAgICAgICAgICAvLyBjaGFuZ2UgSU1BR0VfSU5TVEFMTF9hcHBlbmQgdmFyaWFibGUKKyAgICAgICAgICAgICQoJyNjaGFuZ2UtaW1hZ2VfaW5zdGFsbC1pY29uJykuY2xpY2soZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgLy8gcHJlc2V0IHRoZSBlZGl0IHZhbHVlCisgICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRfdmFsID0gJCgic3BhbiNpbWFnZV9pbnN0YWxsIikudGV4dCgpLnRyaW0oKTsKKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudF92YWwgPT0gIk5vdCBzZXQiKSB7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdmFsPSIiOworICAgICAgICAgICAgICAgICAgICAkKCIjYXBwbHktY2hhbmdlLWltYWdlX2luc3RhbGwiKS5hdHRyKCJkaXNhYmxlZCIsImRpc2FibGVkIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaW5zdXJlIHRoZXNlIG5vbi1lbXB0eSB2YWx1ZXMgaGF2ZSBzaW5nbGUgc3BhY2UgcHJlZml4CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdmFsPSIgIiArIGN1cnJlbnRfdmFsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAkKCJpbnB1dCNuZXctaW1hZ2VfaW5zdGFsbCIpLnZhbChjdXJyZW50X3ZhbCk7CisKKyAgICAgICAgICAgICAgICAkKCcjY2hhbmdlLWltYWdlX2luc3RhbGwtaWNvbiwgI2RlbGV0ZS1pbWFnZV9pbnN0YWxsLWljb24sICNpbWFnZV9pbnN0YWxsJykuaGlkZSgpOworICAgICAgICAgICAgICAgICQoIiNjaGFuZ2UtaW1hZ2VfaW5zdGFsbC1mb3JtIikuc2xpZGVEb3duKCk7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgJCgnI2NhbmNlbC1jaGFuZ2UtaW1hZ2VfaW5zdGFsbCcpLmNsaWNrKGZ1bmN0aW9uKCl7CisgICAgICAgICAgICAgICAgJCgiI2NoYW5nZS1pbWFnZV9pbnN0YWxsLWZvcm0iKS5zbGlkZVVwKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICAkKCcjaW1hZ2VfaW5zdGFsbCwgI2NoYW5nZS1pbWFnZV9pbnN0YWxsLWljb24nKS5zaG93KCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgkKCJzcGFuI2ltYWdlX2luc3RhbGwiKS50ZXh0KCkgIT0gIk5vdCBzZXQiKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkKCcjZGVsZXRlLWltYWdlX2luc3RhbGwtaWNvbicpLnNob3coKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldERlbGV0ZVRvb2x0aXAoJCgnI2RlbGV0ZS1pbWFnZV9pbnN0YWxsLWljb24nKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAkKCIjbmV3LWltYWdlX2luc3RhbGwiKS5vbignaW5wdXQnLCBmdW5jdGlvbigpeworICAgICAgICAgICAgICAgIGlmICgkKHRoaXMpLnZhbCgpLnRyaW0oKS5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAkKCIjYXBwbHktY2hhbmdlLWltYWdlX2luc3RhbGwiKS5hdHRyKCJkaXNhYmxlZCIsImRpc2FibGVkIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkKCIjYXBwbHktY2hhbmdlLWltYWdlX2luc3RhbGwiKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAkKCcjYXBwbHktY2hhbmdlLWltYWdlX2luc3RhbGwnKS5jbGljayhmdW5jdGlvbigpeworICAgICAgICAgICAgICAgIC8vIGluc3VyZSB0aGVzZSBub24tZW1wdHkgdmFsdWVzIGhhdmUgc2luZ2xlIHNwYWNlIHByZWZpeAorICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9ICIgIiArICQoJyNuZXctaW1hZ2VfaW5zdGFsbCcpLnZhbCgpLnRyaW0oKTsKKyAgICAgICAgICAgICAgICBwb3N0RWRpdEFqYXhSZXF1ZXN0KHsiY29uZmlndmFyQ2hhbmdlIiA6ICdJTUFHRV9JTlNUQUxMX2FwcGVuZDonK3ZhbHVlfSk7CisgICAgICAgICAgICAgICAgJCgnI2ltYWdlX2luc3RhbGwnKS50ZXh0KHZhbHVlKTsKKyAgICAgICAgICAgICAgICAkKCcjaW1hZ2VfaW5zdGFsbCcpLnJlbW92ZUNsYXNzKCdtdXRlZCcpOworICAgICAgICAgICAgICAgICQoIiNjaGFuZ2UtaW1hZ2VfaW5zdGFsbC1mb3JtIikuc2xpZGVVcChmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICAgICAgICAgICQoJyNpbWFnZV9pbnN0YWxsLCAjY2hhbmdlLWltYWdlX2luc3RhbGwtaWNvbicpLnNob3coKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkKCcjZGVsZXRlLWltYWdlX2luc3RhbGwtaWNvbicpLnNob3coKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldERlbGV0ZVRvb2x0aXAoJCgnI2RlbGV0ZS1pbWFnZV9pbnN0YWxsLWljb24nKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIC8vIGRlbGV0ZSBJTUFHRV9JTlNUQUxMX2FwcGVuZCB2YXJpYWJsZSB2YWx1ZQorICAgICAgICAgICAgJCgnI2RlbGV0ZS1pbWFnZV9pbnN0YWxsLWljb24nKS5jbGljayhmdW5jdGlvbigpeworICAgICAgICAgICAgICAgICQodGhpcykudG9vbHRpcCgnaGlkZScpOworICAgICAgICAgICAgICAgIHBvc3RFZGl0QWpheFJlcXVlc3QoeyJjb25maWd2YXJDaGFuZ2UiIDogJ0lNQUdFX0lOU1RBTExfYXBwZW5kOicrJyd9KTsKKyAgICAgICAgICAgICAgICAkKCcjaW1hZ2VfaW5zdGFsbCcpLnBhcmVudCgpLmZhZGVPdXQoMTAwMCwgZnVuY3Rpb24oKXsKKyAgICAgICAgICAgICAgICAgICAgJCgnI2ltYWdlX2luc3RhbGwnKS5hZGRDbGFzcygnbXV0ZWQnKTsKKyAgICAgICAgICAgICAgICAgICAgJCgnI2ltYWdlX2luc3RhbGwnKS50ZXh0KCdOb3Qgc2V0Jyk7CisgICAgICAgICAgICAgICAgICAgICQoJyNkZWxldGUtaW1hZ2VfaW5zdGFsbC1pY29uJykuaGlkZSgpOworICAgICAgICAgICAgICAgICAgICAkKCcjaW1hZ2VfaW5zdGFsbCcpLnBhcmVudCgpLmZhZGVJbigxMDAwKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgeyUgZW5kaWYgJX0KKworCisgICAgICAgICAgICB7JSBpZiBwYWNrYWdlX2NsYXNzZXNfZGVmaW5lZCAlfQorICAgICAgICAgICAgLy8gY2hhbmdlIFBBQ0tBR0VfQ0xBU1NFUyB2YXJpYWJsZQorICAgICAgICAgICAgJCgnI2NoYW5nZS1wYWNrYWdlX2NsYXNzZXMtaWNvbicpLmNsaWNrKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICQoJyNjaGFuZ2UtcGFja2FnZV9jbGFzc2VzLWljb24sICNwYWNrYWdlX2NsYXNzZXMnKS5oaWRlKCk7CisgICAgICAgICAgICAgICAgJCgiI2NoYW5nZS1wYWNrYWdlX2NsYXNzZXMtZm9ybSIpLnNsaWRlRG93bigpOworCisgICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgcHVsbGRvd24gYW5kIGNoZWNrYm94ZXMKKyAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSAkKCIjcGFja2FnZV9jbGFzc2VzIikudGV4dCgpOworICAgICAgICAgICAgICAgIGlmICggdmFsdWUuaW5kZXhPZigicGFja2FnZV9kZWIiKSA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAkKCIjcGFja2FnZV9jbGFzc2VzLXNlbGVjdCIpLnByb3AoJ3NlbGVjdGVkSW5kZXgnLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlUGFja2FnZUNsYXNzQ2hlY2tib3hlcygpOworICAgICAgICAgICAgICAgICAgICBpZiAoIHZhbHVlLmluZGV4T2YoIl9pcGsiKSA+IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkKCIjcGFja2FnZV9jbGFzc18xX2lucHV0IikuYXR0cigiY2hlY2tlZCIsdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCB2YWx1ZS5pbmRleE9mKCJfcnBtIikgPiAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgJCgiI3BhY2thZ2VfY2xhc3NfMl9pbnB1dCIpLmF0dHIoImNoZWNrZWQiLHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCB2YWx1ZS5pbmRleE9mKCJwYWNrYWdlX2lwayIpID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICQoIiNwYWNrYWdlX2NsYXNzZXMtc2VsZWN0IikucHJvcCgnc2VsZWN0ZWRJbmRleCcsIDEpOworICAgICAgICAgICAgICAgICAgICB1cGRhdGVQYWNrYWdlQ2xhc3NDaGVja2JveGVzKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICggdmFsdWUuaW5kZXhPZigiX2RlYiIpID4gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICQoIiNwYWNrYWdlX2NsYXNzXzFfaW5wdXQiKS5hdHRyKCJjaGVja2VkIix0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIHZhbHVlLmluZGV4T2YoIl9ycG0iKSA+IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkKCIjcGFja2FnZV9jbGFzc18yX2lucHV0IikuYXR0cigiY2hlY2tlZCIsdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIHZhbHVlLmluZGV4T2YoInBhY2thZ2VfcnBtIikgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgJCgiI3BhY2thZ2VfY2xhc3Nlcy1zZWxlY3QiKS5wcm9wKCdzZWxlY3RlZEluZGV4JywgMik7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBhY2thZ2VDbGFzc0NoZWNrYm94ZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCB2YWx1ZS5pbmRleE9mKCJfZGViIikgPiAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgJCgiI3BhY2thZ2VfY2xhc3NfMV9pbnB1dCIpLmF0dHIoImNoZWNrZWQiLHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICggdmFsdWUuaW5kZXhPZigiX2lwayIpID4gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICQoIiNwYWNrYWdlX2NsYXNzXzJfaW5wdXQiKS5hdHRyKCJjaGVja2VkIix0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAkKCcjY2FuY2VsLWNoYW5nZS1wYWNrYWdlX2NsYXNzZXMnKS5jbGljayhmdW5jdGlvbigpeworICAgICAgICAgICAgICAgICQoIiNjaGFuZ2UtcGFja2FnZV9jbGFzc2VzLWZvcm0iKS5zbGlkZVVwKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICAkKCcjcGFja2FnZV9jbGFzc2VzLCAjY2hhbmdlLXBhY2thZ2VfY2xhc3Nlcy1pY29uJykuc2hvdygpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICQoJ3NlbGVjdCcpLmNoYW5nZShmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVQYWNrYWdlQ2xhc3NDaGVja2JveGVzKCk7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgJCgnI2FwcGx5LWNoYW5nZS1wYWNrYWdlX2NsYXNzZXMnKS5jbGljayhmdW5jdGlvbigpeworICAgICAgICAgICAgICAgIHZhciBlICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGFja2FnZV9jbGFzc2VzLXNlbGVjdCIpOworICAgICAgICAgICAgICAgIHZhciB2YWwgPSBlLm9wdGlvbnNbZS5zZWxlY3RlZEluZGV4XS50ZXh0OworCisgICAgICAgICAgICAgICAgcGMxX2NoZWNrZWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGFja2FnZV9jbGFzc18xX2lucHV0IikuY2hlY2tlZDsKKyAgICAgICAgICAgICAgICBwYzJfY2hlY2tlZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwYWNrYWdlX2NsYXNzXzJfaW5wdXQiKS5jaGVja2VkOworICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gInBhY2thZ2VfZGViIikgeworICAgICAgICAgICAgICAgICAgICBpZiAocGMxX2NoZWNrZWQpIHZhbCA9IHZhbCArICIgcGFja2FnZV9pcGsiOworICAgICAgICAgICAgICAgICAgICBpZiAocGMyX2NoZWNrZWQpIHZhbCA9IHZhbCArICIgcGFja2FnZV9ycG0iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodmFsID09ICJwYWNrYWdlX2lwayIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBjMV9jaGVja2VkKSB2YWwgPSB2YWwgKyAiIHBhY2thZ2VfZGViIjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBjMl9jaGVja2VkKSB2YWwgPSB2YWwgKyAiIHBhY2thZ2VfcnBtIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHZhbCA9PSAicGFja2FnZV9ycG0iKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYzFfY2hlY2tlZCkgdmFsID0gdmFsICsgIiBwYWNrYWdlX2RlYiI7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYzJfY2hlY2tlZCkgdmFsID0gdmFsICsgIiBwYWNrYWdlX2lwayI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgJCgnI3BhY2thZ2VfY2xhc3NlcycpLnRleHQodmFsKTsKKyAgICAgICAgICAgICAgICAvLyQoJyNwYWNrYWdlX2NsYXNzZXMnKS5wYXJlbnQoKS5yZW1vdmVDbGFzcygnbXV0ZWQnKTsKKyAgICAgICAgICAgICAgICBwb3N0RWRpdEFqYXhSZXF1ZXN0KHsiY29uZmlndmFyQ2hhbmdlIiA6ICdQQUNLQUdFX0NMQVNTRVM6Jyt2YWx9KTsKKyAgICAgICAgICAgICAgICAkKCIjY2hhbmdlLXBhY2thZ2VfY2xhc3Nlcy1mb3JtIikuc2xpZGVVcChmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgJCgnI3BhY2thZ2VfY2xhc3NlcywgI2NoYW5nZS1wYWNrYWdlX2NsYXNzZXMtaWNvbicpLnNob3coKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgeyUgZW5kaWYgJX0KKworCisgICAgICAgICAgICB7JSBpZiBzZGtfbWFjaGluZV9kZWZpbmVkICV9CisgICAgICAgICAgICAvLyBjaGFuZ2UgU0RLTUFDSElORSB2YXJpYWJsZQorICAgICAgICAgICAgJCgnI2NoYW5nZS1zZGttYWNoaW5lLWljb24nKS5jbGljayhmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICB2YXIgY3VycmVudF92YWx1ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZGttYWNoaW5lIikuaW5uZXJIVE1MOworICAgICAgICAgICAgICAgIHZhciByYWRpb3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgnc2RrbWFjaGluZScpOworICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSByYWRpb3MubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcmFkaW9zW2ldLmNoZWNrZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJhZGlvc1tpXS52YWx1ZSA9PSBjdXJyZW50X3ZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByYWRpb3NbaV0uY2hlY2tlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgJCgnI2NoYW5nZS1zZGttYWNoaW5lLWljb24sICNzZGttYWNoaW5lJykuaGlkZSgpOworICAgICAgICAgICAgICAgICQoIiNjaGFuZ2Utc2RrbWFjaGluZS1mb3JtIikuc2xpZGVEb3duKCk7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgJCgnI2NhbmNlbC1jaGFuZ2Utc2RrbWFjaGluZScpLmNsaWNrKGZ1bmN0aW9uKCl7CisgICAgICAgICAgICAgICAgJCgiI2NoYW5nZS1zZGttYWNoaW5lLWZvcm0iKS5zbGlkZVVwKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICAkKCcjc2RrbWFjaGluZSwgI2NoYW5nZS1zZGttYWNoaW5lLWljb24nKS5zaG93KCk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgJCgnI2FwcGx5LWNoYW5nZS1zZGttYWNoaW5lJykuY2xpY2soZnVuY3Rpb24oKXsKKyAgICAgICAgICAgICAgICB2YXIgdmFsdWU9IiI7CisgICAgICAgICAgICAgICAgdmFyIHJhZGlvcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCdzZGttYWNoaW5lJyk7CisgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHJhZGlvcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAocmFkaW9zW2ldLmNoZWNrZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhlIGNoZWNrZWQgcmFkaW8KKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXJhZGlvc1tpXS52YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBvc3RFZGl0QWpheFJlcXVlc3QoeyJjb25maWd2YXJDaGFuZ2UiIDogJ1NES01BQ0hJTkU6Jyt2YWx1ZX0pOworICAgICAgICAgICAgICAgICQoJyNzZGttYWNoaW5lJykudGV4dCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgJCgiI2NoYW5nZS1zZGttYWNoaW5lLWZvcm0iKS5zbGlkZVVwKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICAkKCcjc2RrbWFjaGluZSwgI2NoYW5nZS1zZGttYWNoaW5lLWljb24nKS5zaG93KCk7CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgeyUgZW5kaWYgJX0KKworCisgICAgICAgICAgICAvLyBhZGQgbmV3IHZhcmlhYmxlCisgICAgICAgICAgICAkKCJidXR0b24jYWRkLWNvbmZpZ3Zhci1idXR0b24iKS5jbGljayggZnVuY3Rpb24gKGV2dCkgeworICAgICAgICAgICAgICAgIHZhciB2YXJpYWJsZSA9ICQoImlucHV0I3ZhcmlhYmxlIikudmFsKCk7CisgICAgICAgICAgICAgICAgdmFyIHZhbHVlICAgID0gJCgiaW5wdXQjdmFsdWUiKS52YWwoKTsKKworICAgICAgICAgICAgICAgIHBvc3RFZGl0QWpheFJlcXVlc3QoeyJjb25maWd2YXJBZGQiIDogdmFyaWFibGUrJzonK3ZhbHVlfSk7CisKKyAgICAgICAgICAgICAgICAvLyBjbGVhciB0aGUgcHJldmlvdXMgdmFsdWVzCisgICAgICAgICAgICAgICAgJCgiaW5wdXQjdmFyaWFibGUiKS52YWwoIiIpOworICAgICAgICAgICAgICAgICQoImlucHV0I3ZhbHVlIikudmFsKCIiKTsKKyAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIGFkZCBidXR0b24KKyAgICAgICAgICAgICAgICAkKCIuc2F2ZSIpLmF0dHIoImRpc2FibGVkIiwiZGlzYWJsZWQiKTsKKworICAgICAgICAgICAgICAgIC8vIFJlbG9hZCBwYWdlIGlmIGFkbWluLXJlbW92ZWQgY29yZSBtYW5hZ2VkIHZhbHVlIGlzIG1hbnVhbGx5IGFkZGVkIGJhY2sgaW4KKyAgICAgICAgICAgICAgICBpZiAoMCA8PSAiIERJU1RSTyBJTUFHRV9GU1RZUEVTIElNQUdFX0lOU1RBTExfYXBwZW5kIFBBQ0tBR0VfQ0xBU1NFUyBTREtNQUNISU5FICIuaW5kZXhPZiggIiAiK3ZhcmlhYmxlKyIgIiApKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGRlbGF5ZWQgcmVsb2FkIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9uIHdpdGggcG9zdEVkaXRBamF4UmVxdWVzdAorICAgICAgICAgICAgICAgICAgICBkb19yZWxvYWQ9dHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgLy8gdmFsaWRhdGUgbmV3IHZhcmlhYmxlIG5hbWUgYW5kIHZhbHVlCisgICAgICAgICAgICAkKCIjdmFyaWFibGUsICN2YWx1ZSIpLm9uKCdpbnB1dCcsIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgIHZhbGlkYXRlX25ld192YXJpYWJsZSgpOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBkcmF3IGFuZCByZWdpc3RlciB0aGUgZHluYW1pYyBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBhbmQgaGFuZGxlcnMKKyAgICAgICAgICAgIC8vCisKKyAgICAgICAgICAgIHZhciBkYXRhID0geworICAgICAgICAgICAgICAgIGNvbmZpZ3ZhcnMgOiBbXQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHslIGZvciBjIGluIGNvbmZpZ3ZhcnMgJX0KKyAgICAgICAgICAgICAgICBkYXRhLmNvbmZpZ3ZhcnMucHVzaChbICJ7e2MubmFtZX19Iiwie3tjLnZhbHVlfX0iLCJ7e2MucGt9fSIgXSk7CisgICAgICAgICAgICAgICAgeyUgaWYgJycgIT0gdmFyc19jb250ZXh0fGdldF9kaWN0X3ZhbHVlOmMubmFtZSAlfQorICAgICAgICAgICAgICAgICAgICBkYXRhLnZhcnNfY29udGV4dFsgInt7Yy5uYW1lfX0iIF0gPSAie3t2YXJzX2NvbnRleHR8Z2V0X2RpY3RfdmFsdWU6Yy5uYW1lIH19IjsKKyAgICAgICAgICAgICAgICB7JSBlbmRpZiAlfQorICAgICAgICAgICAgeyUgZW5kZm9yICV9CisKKyAgICAgICAgICAgIC8vIGRyYXcgdGhlc2UgZWxlbWVudHMgYW5kIGFzc2VydCB0aGVpciBldmVudCBoYW5kbGVycworICAgICAgICAgICAgb25FZGl0UGFnZVVwZGF0ZShkYXRhKTsKKyAgICAgICAgfSk7CisKKyAgICA8L3NjcmlwdD4KKworeyUgZW5kYmxvY2sgJX0KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvcHJvamVjdHMuaHRtbCBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvcHJvamVjdHMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmQ3N2I1Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9wcm9qZWN0cy5odG1sCkBAIC0wLDAgKzEsNzcgQEAKK3slIGV4dGVuZHMgImJhc2UuaHRtbCIgJX0KKworeyUgbG9hZCBzdGF0aWMgJX0KK3slIGxvYWQgcHJvamVjdHRhZ3MgJX0KK3slIGxvYWQgaHVtYW5pemUgJX0KKworeyUgYmxvY2sgcGFnZWNvbnRlbnQgJX0KKworCisgIDxkaXYgY2xhc3M9InBhZ2UtaGVhZGVyIHRvcC1haXIiPgorICAgICAgPGgxPgorICAgICAgeyUgaWYgcmVxdWVzdC5HRVQuZmlsdGVyIGFuZCBvYmplY3RzLnBhZ2luYXRvci5jb3VudCA+IDAgb3IgcmVxdWVzdC5HRVQuc2VhcmNoIGFuZCBvYmplY3RzLnBhZ2luYXRvci5jb3VudCA+IDAgJX0KKyAgICAgICAgICB7e29iamVjdHMucGFnaW5hdG9yLmNvdW50fX0gcHJvamVjdHt7b2JqZWN0cy5wYWdpbmF0b3IuY291bnR8cGx1cmFsaXplfX0gZm91bmQKKyAgICAgIHslZWxpZiByZXF1ZXN0LkdFVC5maWx0ZXIgYW5kIG9iamVjdHMucGFnaW5hdG9yLmNvdW50ID09IDAgb3IgcmVxdWVzdC5HRVQuc2VhcmNoIGFuZCBvYmplY3RzLnBhZ2luYXRvci5jb3VudCA9PSAwICV9CisgICAgICAgICAgTm8gcHJvamVjdHMgZm91bmQKKyAgICAgIHslZWxzZSV9CisgICAgICAgICAgQWxsIHByb2plY3RzCisgICAgICB7JWVuZGlmJX0KKyAgICAgICA8L2gxPgorICA8L2Rpdj4KKworICB7JSBpZiBvYmplY3RzLnBhZ2luYXRvci5jb3VudCA9PSAwICV9CisgICAgPGRpdiBjbGFzcz0icm93LWZsdWlkIj4KKyAgICAgIDxkaXYgY2xhc3M9ImFsZXJ0Ij4KKyAgICAgICAgPGZvcm0gY2xhc3M9Im5vLXJlc3VsdHMgaW5wdXQtYXBwZW5kIiBpZD0ic2VhcmNoZm9ybSI+CisgICAgICAgICAgICA8aW5wdXQgaWQ9InNlYXJjaCIgbmFtZT0ic2VhcmNoIiBjbGFzcz0iaW5wdXQteHhsYXJnZSIgdHlwZT0idGV4dCIgdmFsdWU9IgorICAgICAgICAgICAgICAgIHslIGlmIHJlcXVlc3QuR0VULnNlYXJjaCAlfQorICAgICAgICAgICAgICAgICAgICB7e3JlcXVlc3QuR0VULnNlYXJjaH19CisgICAgICAgICAgICAgICAgeyUgZW5kaWYgJX0iLz57JSBpZiByZXF1ZXN0LkdFVC5zZWFyY2ggJX08YSBocmVmPSJqYXZhc2NyaXB0OiQoJyNzZWFyY2gnKS52YWwoJycpO3NlYXJjaGZvcm0uc3VibWl0KCkiIGNsYXNzPSJhZGQtb24gYnRuIiB0YWJpbmRleD0iLTEiPjxpIGNsYXNzPSJpY29uLXJlbW92ZSI+PC9pPjwvYT57JSBlbmRpZiAlfQorICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJTZWFyY2giPlNlYXJjaDwvYnV0dG9uPgorICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1saW5rIiBvbmNsaWNrPSJqYXZhc2NyaXB0OiQoJyNzZWFyY2gnKS52YWwoJycpO3NlYXJjaGZvcm0uc3VibWl0KCkiPlNob3cgYWxsIHByb2plY3RzPC9idXR0b24+CisgICAgICAgIDwvZm9ybT4KKyAgICAgIDwvZGl2PgorICAgIDwvZGl2PgorCisgIHslIGVsc2UgJX0geyMgV2UgaGF2ZSBidWlsZHMgdG8gZGlzcGxheSAjfQorICB7JSBpbmNsdWRlICJiYXNldGFibGVfdG9wLmh0bWwiICV9CisgIHslIGZvciBvIGluIG9iamVjdHMgJX0KKyAgICA8dHIgY2xhc3M9ImRhdGEiPgorICAgICAgPHRkPjxhIGhyZWY9InslIHVybCAncHJvamVjdCcgby5pZCAlfSI+e3tvLm5hbWV9fTwvYT48L3RkPgorICAgICAgPHRkIGNsYXNzPSJ1cGRhdGVkIj48YSBocmVmPSJ7JSB1cmwgJ3Byb2plY3QnIG8uaWQgJX0iPnt7by51cGRhdGVkfGRhdGU6ImQvbS95IEg6aSJ9fTwvYT48L3RkPgorICAgICAgPHRkPgorICAgICAgICB7JSBpZiBvLnJlbGVhc2UgJX0KKyAgICAgICAgICAgIDxhIGhyZWY9InslIHVybCAncHJvamVjdCcgby5pZCAlfSNwcm9qZWN0LWRldGFpbHMiPnt7by5yZWxlYXNlLm5hbWV9fTwvYT4KKyAgICAgICAgeyUgZWxzZSAlfQorICAgICAgICAgICAgTm8gcmVsZWFzZSBhdmFpbGFibGUKKyAgICAgICAgeyUgZW5kaWYgJX0KKyAgICAgIDwvdGQ+CisgICAgICA8dGQ+PGEgaHJlZj0ieyUgdXJsICdwcm9qZWN0JyBvLmlkICV9I21hY2hpbmUtZGlzdHJvIj57e28uZ2V0X2N1cnJlbnRfbWFjaGluZV9uYW1lfX08L2E+PC90ZD4KKyAgICAgIHslIGlmIG8uZ2V0X251bWJlcl9vZl9idWlsZHMgPT0gMCAlfQorICAgICAgPHRkIGNsYXNzPSJtdXRlZCI+e3tvLmdldF9udW1iZXJfb2ZfYnVpbGRzfX08L3RkPgorICAgICAgPHRkIGNsYXNzPSJsb3V0Y29tZSI+PC90ZD4KKyAgICAgIDx0ZCBjbGFzcz0ibHRhcmdldCI+PC90ZD4KKyAgICAgIDx0ZCBjbGFzcz0ibGVycm9ycyI+PC90ZD4KKyAgICAgIDx0ZCBjbGFzcz0ibHdhcm5pbmdzIj48L3RkPgorICAgICAgPHRkIGNsYXNzPSJsaW1hZ2VmaWxlcyI+PC90ZD4KKyAgICAgIHslIGVsc2UgJX0KKyAgICAgIDx0ZD48YSBocmVmPSJ7JSB1cmwgJ3Byb2plY3RidWlsZHMnIG8uaWQgJX0iPnt7by5nZXRfbnVtYmVyX29mX2J1aWxkc319PC9hPjwvdGQ+CisgICAgICA8dGQgY2xhc3M9ImxvdXRjb21lIj48YSBocmVmPSJ7JSB1cmwgImJ1aWxkZGFzaGJvYXJkIiBvLmdldF9sYXN0X2J1aWxkX2lkICV9Ij57JWlmIG8uZ2V0X2xhc3Rfb3V0Y29tZSA9PSBidWlsZF9TVUNDRUVERUQlfTxpIGNsYXNzPSJpY29uLW9rLXNpZ24gc3VjY2VzcyI+PC9pPnslZWxpZiBvLmdldF9sYXN0X291dGNvbWUgPT0gYnVpbGRfRkFJTEVEJX08aSBjbGFzcz0iaWNvbi1taW51cy1zaWduIGVycm9yIj48L2k+eyVlbHNlJX17JWVuZGlmJX08L2E+PC90ZD4KKyAgICAgIDx0ZCBjbGFzcz0ibHRhcmdldCI+PGEgaHJlZj0ieyUgdXJsICJidWlsZGRhc2hib2FyZCIgby5nZXRfbGFzdF9idWlsZF9pZCAlfSI+e3tvLmdldF9sYXN0X3RhcmdldH19IDwvYT48L3RkPgorICAgICAgPHRkIGNsYXNzPSJsZXJyb3JzIj57JSBpZiBvLmdldF9sYXN0X2Vycm9ycyAlfTxhIGNsYXNzPSJlcnJvcnMuY291bnQgZXJyb3IiIGhyZWY9InslIHVybCAiYnVpbGRkYXNoYm9hcmQiIG8uZ2V0X2xhc3RfYnVpbGRfaWQgJX0jZXJyb3JzIj57e28uZ2V0X2xhc3RfZXJyb3JzfX0gZXJyb3J7e28uZ2V0X2xhc3RfZXJyb3JzfHBsdXJhbGl6ZX19PC9hPnslZW5kaWYlfTwvdGQ+CisgICAgICA8dGQgY2xhc3M9Imx3YXJuaW5ncyI+eyUgaWYgby5nZXRfbGFzdF93YXJuaW5ncyAlfTxhIGNsYXNzPSJ3YXJuaW5ncy5jb3VudCB3YXJuaW5nIiBocmVmPSJ7JSB1cmwgImJ1aWxkZGFzaGJvYXJkIiBvLmdldF9sYXN0X2J1aWxkX2lkICV9I3dhcm5pbmdzIj57e28uZ2V0X2xhc3Rfd2FybmluZ3N9fSB3YXJuaW5ne3tvLmdldF9sYXN0X3dhcm5pbmdzfHBsdXJhbGl6ZX19PC9hPnslZW5kaWYlfTwvdGQ+CisgICAgICA8dGQgY2xhc3M9ImxpbWFnZWZpbGVzIj4KKyAgICAgICAgeyUgaWYgby5nZXRfbGFzdF9vdXRjb21lID09IGJ1aWxkX1NVQ0NFRURFRCAlfQorICAgICAgICA8YSBocmVmPSJ7JXVybCAiYnVpbGRkYXNoYm9hcmQiIG8uZ2V0X2xhc3RfYnVpbGRfaWQgJX0jaW1hZ2VzIj57e2ZzdHlwZXN8Z2V0X2RpY3RfdmFsdWU6by5pZH19PC9hPgorICAgICAgICB7JSBlbmRpZiAlfQorICAgICAgPC90ZD4KKworICAgICAgeyUgZW5kaWYgJX0KKyAgICA8L3RyPgorICB7JSBlbmRmb3IgJX0KKyAgeyUgaW5jbHVkZSAiYmFzZXRhYmxlX2JvdHRvbS5odG1sIiAlfQorICB7JSBlbmRpZiAlfSB7IyBlbXB0eSAjfQorCit7JSBlbmRibG9jayAlfQorCisKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvcHJvamVjdHRvcGJhci5odG1sIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9wcm9qZWN0dG9wYmFyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EyNzQxZAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvcHJvamVjdHRvcGJhci5odG1sCkBAIC0wLDAgKzEsNDcgQEAKKzxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LXN1Y2Nlc3MgbGVhZCIgaWQ9InByb2plY3QtY3JlYXRlZC1ub3RpZmljYXRpb24iIHN0eWxlPSJtYXJnaW4tdG9wOjE1cHg7IGRpc3BsYXk6bm9uZSI+CisgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcz0iYWxlcnQiPsOXPC9idXR0b24+CisgIFlvdXIgcHJvamVjdCA8c3Ryb25nPnt7cHJvamVjdC5uYW1lfX08L3N0cm9uZz4gaGFzIGJlZW4gY3JlYXRlZC4gWW91IGNhbiBub3cgPGEgaHJlZj0ieyUgdXJsICdwcm9qZWN0bWFjaGluZXMnIHByb2plY3QuaWQgJX0iPnNlbGVjdCB5b3VyIHRhcmdldCBtYWNoaW5lPC9hPiBhbmQgPGEgaHJlZj0ieyUgdXJsICdwcm9qZWN0dGFyZ2V0cycgcHJvamVjdC5pZCAlfSI+Y2hvb3NlIGltYWdlIHJlY2lwZXM8L2E+IHRvIGJ1aWxkLgorPC9kaXY+CisKKzwhLS0gcHJvamVjdCBuYW1lIC0tPgorPGRpdiBjbGFzcz0icGFnZS1oZWFkZXIiPgorICA8aDE+PHNwYW4gaWQ9InByb2plY3QtbmFtZSI+e3twcm9qZWN0Lm5hbWV9fTwvc3Bhbj4KKyAgICA8aSBjbGFzcz0iaWNvbi1wZW5jaWwiIGRhdGEtb3JpZ2luYWwtdGl0bGU9IiIgaWQ9InByb2plY3QtY2hhbmdlLWZvcm0tdG9nZ2xlIiB0aXRsZT0iIj48L2k+CisgIDwvaDE+CisgIDxmb3JtIGlkPSJwcm9qZWN0LW5hbWUtY2hhbmdlLWZvcm0iIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwcHg7IGRpc3BsYXk6IG5vbmU7Ij4KKyAgICA8ZGl2IGNsYXNzPSJpbnB1dC1hcHBlbmQiPgorICAgICAgPGlucHV0IGNsYXNzPSJodWdlIGlucHV0LXh4bGFyZ2UiIHR5cGU9InRleHQiIGlkPSJwcm9qZWN0LW5hbWUtY2hhbmdlLWlucHV0IiBhdXRvY29tcGxldGU9Im9mZiIgdmFsdWU9Int7cHJvamVjdC5uYW1lfX0iPgorICAgICAgICA8YnV0dG9uIGlkPSJwcm9qZWN0LW5hbWUtY2hhbmdlLWJ0biIgY2xhc3M9ImJ0biBidG4tbGFyZ2UiIHR5cGU9ImJ1dHRvbiI+U2F2ZTwvYnV0dG9uPgorICAgICAgICA8YSBocmVmPSIjIiBpZD0icHJvamVjdC1uYW1lLWNoYW5nZS1jYW5jZWwiIGNsYXNzPSJidG4gYnRuLWxhcmdlIGJ0bi1saW5rIj5DYW5jZWw8L2E+CisgICAgPC9kaXY+CisgIDwvZm9ybT4KKzwvZGl2PgorCis8ZGl2IGlkPSJwcm9qZWN0LXRvcGJhciI+CisgIDx1bCBjbGFzcz0ibmF2IG5hdi1waWxscyI+CisgICAgPGxpPgorICAgICAgPGEgaHJlZj0ieyUgdXJsICdwcm9qZWN0YnVpbGRzJyBwcm9qZWN0LmlkICV9Ij4KKyAgICAgICAgQnVpbGRzICg8c3BhbiBjbGFzcz0idG90YWwtYnVpbGRzIj4wPC9zcGFuPikKKyAgICAgIDwvYT4KKyAgICA8L2xpPgorICAgIDxsaSBpZD0idG9wYmFyLWNvbmZpZ3VyYXRpb24tdGFiIj4KKyAgICAgIDxhIGhyZWY9InslIHVybCAncHJvamVjdCcgcHJvamVjdC5pZCAlfSI+CisgICAgICAgIENvbmZpZ3VyYXRpb24KKyAgICAgIDwvYT4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgIDxhIGhyZWY9InslIHVybCAnaW1wb3J0bGF5ZXInIHByb2plY3QuaWQgJX0iPgorICAgICAgICBJbXBvcnQgbGF5ZXIKKyAgICAgIDwvYT4KKyAgICA8L2xpPgorICAgIDxsaSBjbGFzcz0icHVsbC1yaWdodCI+CisgICAgICA8Zm9ybSBjbGFzcz0iZm9ybS1pbmxpbmUiIHN0eWxlPSJtYXJnaW4tYm90dG9tOjBweDsiPgorICAgICAgICA8aSBjbGFzcz0iaWNvbi1xdWVzdGlvbi1zaWduIGdldC1oZWxwIGhlYWRpbmctaGVscCIgZGF0YS1wbGFjZW1lbnQ9ImxlZnQiIHRpdGxlPSIiIGRhdGEtb3JpZ2luYWwtdGl0bGU9IlR5cGUgdGhlIG5hbWUgb2Ygb25lIG9yIG1vcmUgcmVjaXBlcyB5b3Ugd2FudCB0byBidWlsZCwgc2VwYXJhdGVkIGJ5IGEgc3BhY2UuIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IGEgdGFzayBieSBhcHBlbmRpbmcgYSBzZW1pY29sb24gYW5kIGEgdGFzayBuYW1lIHRvIHRoZSByZWNpcGUgbmFtZSwgbGlrZSBzbzogPGNvZGU+YnVzeWJveDpjbGVhbjwvY29kZT4iPjwvaT4KKyAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtYXBwZW5kIj4KKyAgICAgICAgICA8aW5wdXQgaWQ9ImJ1aWxkLWlucHV0IiB0eXBlPSJ0ZXh0IiBjbGFzcz0iaW5wdXQteGxhcmdlIGlucHV0LWxnIGJ1aWxkLXRhcmdldC1pbnB1dCIgcGxhY2Vob2xkZXI9IlR5cGUgdGhlIHJlY2lwZSB5b3Ugd2FudCB0byBidWlsZCIgYXV0b2NvbXBsZXRlPSJvZmYiIGRpc2FibGVkPgorICAgICAgICAgIDxidXR0b24gaWQ9ImJ1aWxkLWJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSBidG4tbGFyZ2UgYnVpbGQtYnV0dG9uIiBkYXRhLXByb2plY3QtaWQ9Int7cHJvamVjdC5pZH19IiBkaXNhYmxlZD5CdWlsZDwvYnV0dG9uPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvZm9ybT4KKyAgICA8L2xpPgorICA8L3VsPgorPC9kaXY+CmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL3JlY2lwZS5odG1sIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9yZWNpcGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWU0MTkyCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9yZWNpcGUuaHRtbApAQCAtMCwwICsxLDI0MiBAQAoreyUgZXh0ZW5kcyAiYmFzZWJ1aWxkZGV0YWlscGFnZS5odG1sIiAlfQorCit7JSBsb2FkIHByb2plY3R0YWdzICV9CisKK3slIGJsb2NrIGxvY2FsYnJlYWRjcnVtYiAlfQorPGxpPjxhIGhyZWY9InslIHVybCAncmVjaXBlcycgYnVpbGQucGsgJX0iPlJlY2lwZXM8L2E+PC9saT4KKzxsaT57e29iamVjdC5uYW1lfX1fe3tvYmplY3QudmVyc2lvbn19IDwvbGk+Cit7JSBlbmRibG9jayAlfQorCit7JSBibG9jayBwYWdlZGV0YWlsaW5mb21haW4gJX0KKworPCEtLSBCZWdpbiBjb250YWluZXIgLS0+CisKKzxkaXYgY2xhc3M9InJvdyBzcGFuMTEiPgorICAgIDxkaXYgY2xhc3M9InBhZ2UtaGVhZGVyIj4KKyAgICAgICAgPGgxPnt7b2JqZWN0Lm5hbWV9fV97e29iamVjdC52ZXJzaW9ufX08L2gxPgorICAgIDwvZGl2PgorPC9kaXY+CisKKzxkaXYgY2xhc3M9InJvdyBzcGFuNyB0YWJiYWJsZSI+CisgICAgPHVsIGNsYXNzPSJuYXYgbmF2LXBpbGxzIj4KKyAgICAgICAgPGxpIGNsYXNzPSJ7e3RhYl9zdGF0ZXMuMX19Ij4KKyAgICAgICAgICAgIDxhIGhyZWY9IiNpbmZvcm1hdGlvbiIgZGF0YS10b2dnbGU9InRhYiI+CisgICAgICAgICAgICAgICAgPGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCIgdGl0bGU9IkJ1aWxkLXJlbGF0ZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlY2lwZSI+PC9pPgorICAgICAgICAgICAgICAgIFJlY2lwZSBkZXRhaWxzCisgICAgICAgICAgICA8L2E+CisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICAgICA8YSBocmVmPSJ7JSB1cmwgInJlY2lwZV9wYWNrYWdlcyIgYnVpbGQucGsgb2JqZWN0LmlkICV9Ij4KKyAgICAgICAgICAgICAgICA8aSBjbGFzcz0iaWNvbi1xdWVzdGlvbi1zaWduIGdldC1oZWxwIiB0aXRsZT0iVGhlIHBhY2thZ2VkIG91dHB1dCByZXN1bHRpbmcgZnJvbSBidWlsZGluZyB0aGUgcmVjaXBlIj48L2k+CisgICAgICAgICAgICAgICAgUGFja2FnZXMgKHt7cGFja2FnZV9jb3VudH19KQorICAgICAgICAgICAgPC9hPgorICAgICAgICA8L2xpPgorICAgICAgICA8bGkgY2xhc3M9Int7dGFiX3N0YXRlcy4zfX0iPgorICAgICAgICAgICAgPGEgaHJlZj0iI2RlcGVuZGVuY2llcyIgZGF0YS10b2dnbGU9InRhYiI+CisgICAgICAgICAgICAgICAgPGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCIgdGl0bGU9IlRoZSByZWNpcGUgYnVpbGQtdGltZSBkZXBlbmRlbmNpZXMgKGkuZS4gb3RoZXIgcmVjaXBlcykiPjwvaT4KKyAgICAgICAgICAgICAgICBCdWlsZCBkZXBlbmRlbmNpZXMgKHt7b2JqZWN0LnJfZGVwZW5kZW5jaWVzX3JlY2lwZS5hbGwuY291bnR9fSkKKyAgICAgICAgICAgIDwvYT4KKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpIGNsYXNzPSJ7e3RhYl9zdGF0ZXMuNH19Ij4KKyAgICAgICAgICAgIDxhIGhyZWY9IiNicm91Z2h0LWluLWJ5IiBkYXRhLXRvZ2dsZT0idGFiIj4KKyAgICAgICAgICAgICAgICA8aSBjbGFzcz0iaWNvbi1xdWVzdGlvbi1zaWduIGdldC1oZWxwIiB0aXRsZT0iVGhlIHJlY2lwZSBidWlsZC10aW1lIHJldmVyc2UgZGVwZW5kZW5jaWVzIChpLmUuIHRoZSByZWNpcGVzIHRoYXQgZGVwZW5kIG9uIHRoaXMgcmVjaXBlKSI+PC9pPgorICAgICAgICAgICAgICAgIFJldmVyc2UgYnVpbGQgZGVwZW5kZW5jaWVzICh7e29iamVjdC5yX2RlcGVuZGVuY2llc19kZXBlbmRzLmFsbC5jb3VudH19KQorICAgICAgICAgICAgPC9hPgorICAgICAgICA8L2xpPgorICAgIDwvdWw+CisgICAgPGRpdiBjbGFzcz0idGFiLWNvbnRlbnQiPgorICAgICAgICA8ZGl2IGNsYXNzPSJ0YWItcGFuZSB7e3RhYl9zdGF0ZXMuMX19IiBpZD0iaW5mb3JtYXRpb24iPgorICAgICAgICAgICAgPGRsIGNsYXNzPSJkbC1ob3Jpem9udGFsIj4KKyAgICAgICAgICAgICAgICA8ZHQ+CisgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLXF1ZXN0aW9uLXNpZ24gZ2V0LWhlbHAiIHRpdGxlPSJUaGUgbmFtZSBvZiB0aGUgbGF5ZXIgcHJvdmlkaW5nIHRoZSByZWNpcGUiPjwvaT4KKyAgICAgICAgICAgICAgICAgICAgTGF5ZXIKKyAgICAgICAgICAgICAgICA8L2R0PgorICAgICAgICAgICAgICAgIDxkZD57e2xheWVyLm5hbWV9fTwvZGQ+CisKKyAgICAgICAgICAgICAgICA8ZHQ+CisgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLXF1ZXN0aW9uLXNpZ24gZ2V0LWhlbHAiIHRpdGxlPSJQYXRoIHRvIHRoZSByZWNpcGUgLmJiIGZpbGUiPjwvaT4KKyAgICAgICAgICAgICAgICAgICAgUmVjaXBlIGZpbGUKKyAgICAgICAgICAgICAgICA8L2R0PgorICAgICAgICAgICAgICAgIDxkZD48Y29kZT57e29iamVjdC5maWxlX3BhdGh9fSB7JSBpZiBvYmplY3QucGF0aGZsYWdzICV9PGk+KHt7b2JqZWN0LnBhdGhmbGFnc319KTwvaT57JSBlbmRpZiAlfTwvY29kZT48L2RkPgorICAgICAgICAgICAgICAgIHslIGlmIGxheWVyX3ZlcnNpb24uYnJhbmNoICV9CisgICAgICAgICAgICAgICAgPGR0PgorICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iaWNvbi1xdWVzdGlvbi1zaWduIGdldC1oZWxwIiB0aXRsZT0iVGhlIEdpdCBicmFuY2ggb2YgdGhlIGxheWVyIHByb3ZpZGluZyB0aGUgcmVjaXBlIj48L2k+CisgICAgICAgICAgICAgICAgICAgIExheWVyIGJyYW5jaAorICAgICAgICAgICAgICAgIDwvZHQ+CisgICAgICAgICAgICAgICAgPGRkPnt7bGF5ZXJfdmVyc2lvbi5icmFuY2h9fTwvZGQ+CisgICAgICAgICAgICAgICAgeyUgZW5kaWYgJX0KKyAgICAgICAgICAgICAgICA8ZHQ+CisgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLXF1ZXN0aW9uLXNpZ24gZ2V0LWhlbHAiIHRpdGxlPSJUaGUgR2l0IGNvbW1pdCBvZiB0aGUgbGF5ZXIgcHJvdmlkaW5nIHRoZSByZWNpcGUiPjwvaT4KKyAgICAgICAgICAgICAgICAgICAgTGF5ZXIgY29tbWl0CisgICAgICAgICAgICAgICAgPC9kdD4KKyAgICAgICAgICAgICAgICA8ZGQgY2xhc3M9ImlzY29tbWl0Ij57e2xheWVyX3ZlcnNpb24uY29tbWl0fX08L2RkPgorICAgICAgICAgICAgPC9kbD4KKworICAgICAgICAgICAgPGgyIGNsYXNzPSJkZXRhaWxzIj5UYXNrczwvaDI+CisgICAgICAgICAgICB7JSBpZiBub3QgdGFza3MgJX0KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LWluZm8iPgorICAgICAgICAgICAgICAgIDxzdHJvbmc+e3tvYmplY3QubmFtZX19X3t7b2JqZWN0LnZlcnNpb259fTwvc3Ryb25nPiBkb2VzIG5vdCBoYXZlIGFueSB0YXNrcyBpbiB0aGlzIGJ1aWxkLgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICB7JSBlbHNlICV9CisgICAgICAgICAgICA8dGFibGUgY2xhc3M9InRhYmxlIHRhYmxlLWJvcmRlcmVkIHRhYmxlLWhvdmVyIj4KKyAgICAgICAgICAgICAgICA8dGhlYWQ+CisJCSAgPHRyPgorICAgICAgICAgICAgICAgICAgICA8dGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iaWNvbi1xdWVzdGlvbi1zaWduIGdldC1oZWxwIiB0aXRsZT0iVGhlIHJ1bm5pbmcgc2VxdWVuY2Ugb2YgZWFjaCB0YXNrIGluIHRoZSBidWlsZCI+PC9pPgorICAgICAgICAgICAgICAgICAgICAgICAgT3JkZXIKKyAgICAgICAgICAgICAgICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgPHRoPgorICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCIgdGl0bGU9IlRoZSBuYW1lIG9mIHRoZSB0YXNrIj48L2k+CisgICAgICAgICAgICAgICAgICAgICAgICBUYXNrCisgICAgICAgICAgICAgICAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgIDx0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLXF1ZXN0aW9uLXNpZ24gZ2V0LWhlbHAiIHRpdGxlPSJUaGlzIHZhbHVlIHRlbGxzIHlvdSBpZiBhIHRhc2sgaGFkIHRvIHJ1biAoZXhlY3V0ZWQpIGluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSB0YXNrIG91dHB1dCwgb3IgaWYgdGhlIG91dHB1dCB3YXMgcHJvdmlkZWQgYnkgYW5vdGhlciB0YXNrIGFuZCB0aGVyZWZvcmUgdGhlIHRhc2sgZGlkbid0IG5lZWQgdG8gcnVuIChub3QgZXhlY3V0ZWQpIj48L2k+CisgICAgICAgICAgICAgICAgICAgICAgICBFeGVjdXRlZAorICAgICAgICAgICAgICAgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICA8dGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iaWNvbi1xdWVzdGlvbi1zaWduIGdldC1oZWxwIiB0aXRsZT0iVGhpcyBjb2x1bW4gdGVsbHMgeW91IGlmICdleGVjdXRlZCcgdGFza3Mgc3VjY2VlZGVkIG9yIGZhaWxlZC4gVGhlIGNvbHVtbiBhbHNvIHRlbGxzIHlvdSB3aHkgJ25vdCBleGVjdXRlZCcgdGFza3MgZGlkIG5vdCBuZWVkIHRvIHJ1biI+PC9pPgorICAgICAgICAgICAgICAgICAgICAgICAgT3V0Y29tZQorICAgICAgICAgICAgICAgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICA8dGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iaWNvbi1xdWVzdGlvbi1zaWduIGdldC1oZWxwIiB0aXRsZT0iVGhpcyBjb2x1bW4gdGVsbHMgeW91IGlmIGEgdGFzayB0cmllZCB0byByZXN0b3JlIG91dHB1dCBmcm9tIHRoZSA8Y29kZT5zc3RhdGUtY2FjaGU8L2NvZGU+IGRpcmVjdG9yeSBvciBtaXJyb3JzLCBhbmQgcmVwb3J0cyB0aGUgcmVzdWx0OiBTdWNjZWVkZWQsIEZhaWxlZCBvciBGaWxlIG5vdCBpbiBjYWNoZSI+PC9pPgorICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGUgYXR0ZW1wdAorICAgICAgICAgICAgICAgICAgICA8L3RoPgorCQkgIDwvdHI+CisgICAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgICA8dGJvZHk+CisKKyAgICAgICAgICAgICAgICAgICAgeyUgZm9yIHRhc2sgaW4gdGFza3MgJX0KKworICAgICAgICAgICAgICAgICAgICA8dHIge3sgdGFza3x0YXNrX2NvbG9yIH19ID4KKworICAgICAgICAgICAgICAgICAgICA8dGQ+PGEge3sgdGFza3x0YXNrX2NvbG9yIH19IGhyZWY9InslIHVybCAidGFzayIgYnVpbGQucGsgdGFzay5wayAlfSI+e3t0YXNrLm9yZGVyfX08L2E+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGEge3sgdGFza3x0YXNrX2NvbG9yIH19IGhyZWY9InslIHVybCAidGFzayIgYnVpbGQucGsgdGFzay5wayAlfSI+e3t0YXNrLnRhc2tfbmFtZX19PC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgeyUgaWYgdGFzay5nZXRfZGVzY3JpcHRpb24gJX08aSBjbGFzcz0iaWNvbi1xdWVzdGlvbi1zaWduIGdldC1oZWxwIGhvdmVyLWhlbHAiIHRpdGxlPSIiIGRhdGEtb3JpZ2luYWwtdGl0bGU9Int7dGFzay5nZXRfZGVzY3JpcHRpb259fSI+PC9pPiB7JSBlbmRpZiAlfQorICAgICAgICAgICAgICAgICAgICA8L3RkPgorCisgICAgICAgICAgICAgICAgICAgIDx0ZD48YSB7eyB0YXNrfHRhc2tfY29sb3IgfX0gaHJlZj0ieyUgdXJsICJ0YXNrIiBidWlsZC5wayB0YXNrLnBrICV9Ij57e3Rhc2suZ2V0X2V4ZWN1dGVkX2Rpc3BsYXl9fTwvYT48L3RkPgorCisgICAgICAgICAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhIHt7IHRhc2t8dGFza19jb2xvciB9fSBocmVmPSJ7JSB1cmwgInRhc2siIGJ1aWxkLnBrIHRhc2sucGsgJX0iPnt7dGFzay5nZXRfb3V0Y29tZV9kaXNwbGF5fX0gPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgeyUgaWYgdGFzay5vdXRjb21lID0gdGFzay5PVVRDT01FX0ZBSUxFRCAlfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9InslIHVybCAnYnVpbGRfYXJ0aWZhY3QnIGJ1aWxkLnBrICJ0YXNrbG9nZmlsZSIgdGFzay5wayAlfSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLWRvd25sb2FkLWFsdCIgdGl0bGU9IkRvd25sb2FkIHRhc2sgbG9nIGZpbGUiPjwvaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICB7JSBlbmRpZiAlfQorICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCBob3Zlci1oZWxwIiB0aXRsZT0ie3t0YXNrLmdldF9vdXRjb21lX2hlbHB9fSI+PC9pPgorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgICAgICAgICAgICB7JSBpZm5vdGVxdWFsIHRhc2suc3N0YXRlX3Jlc3VsdCB0YXNrLlNTVEFURV9OQSAlfQorICAgICAgICAgICAgICAgICAgICAgICAgPGEge3sgdGFza3x0YXNrX2NvbG9yIH19IGhyZWY9InslIHVybCAidGFzayIgYnVpbGQucGsgdGFzay5wayAlfSI+e3t0YXNrLmdldF9zc3RhdGVfcmVzdWx0X2Rpc3BsYXl9fTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHslIGVuZGlmbm90ZXF1YWwgJX0KKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKworICAgICAgICAgICAgICAgICAgICA8L3RyPgorCisgICAgICAgICAgICAgICAgICAgIHslIGVuZGZvciAlfQorICAgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgeyUgZW5kaWYgJX0KKyAgICAgICAgPC9kaXY+CisgICAgICAgIDxkaXYgY2xhc3M9InRhYi1wYW5lIHt7dGFiX3N0YXRlcy4zfX0iIGlkPSJkZXBlbmRlbmNpZXMiPgorCisgICAgICAgICAgICB7JSBpZiBub3Qgb2JqZWN0LnJfZGVwZW5kZW5jaWVzX3JlY2lwZS5hbGwgJX0KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LWluZm8iPgorICAgICAgICAgICAgICAgIDxzdHJvbmc+e3tvYmplY3QubmFtZX19X3t7b2JqZWN0LnZlcnNpb259fTwvc3Ryb25nPiBoYXMgbm8gYnVpbGQgZGVwZW5kZW5jaWVzLgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICB7JSBlbHNlICV9CisgICAgICAgICAgICA8dGFibGUgY2xhc3M9InRhYmxlIHRhYmxlLWJvcmRlcmVkIHRhYmxlLWhvdmVyIj4KKyAgICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNpcGUKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICAgIDx0Ym9keT4KKworICAgICAgICAgICAgICAgICAgICB7JSBmb3IgcnIgaW4gb2JqZWN0LnJfZGVwZW5kZW5jaWVzX3JlY2lwZS5hbGx8ZGljdHNvcnQ6ImRlcGVuZHNfb24ubmFtZSIgJX0KKyAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxhIGhyZWY9InslIHVybCAicmVjaXBlIiBidWlsZC5wayByci5kZXBlbmRzX29uLnBrICV9Ij57e3JyLmRlcGVuZHNfb24ubmFtZX19PC9hPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGEgaHJlZj0ieyUgdXJsICJyZWNpcGUiIGJ1aWxkLnBrIHJyLmRlcGVuZHNfb24ucGsgJX0iPnt7cnIuZGVwZW5kc19vbi52ZXJzaW9ufX08L2E+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgeyUgZW5kZm9yICV9CisKKyAgICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgIHslIGVuZGlmICV9CisKKyAgICAgICAgPC9kaXY+CisgICAgICAgIDxkaXYgY2xhc3M9InRhYi1wYW5lIHt7dGFiX3N0YXRlcy40fX0iIGlkPSJicm91Z2h0LWluLWJ5Ij4KKworICAgICAgICAgICAgeyUgaWYgbm90IG9iamVjdC5yX2RlcGVuZGVuY2llc19kZXBlbmRzLmFsbCAlfQorICAgICAgICAgICAgPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtaW5mbyI+CisgICAgICAgICAgICAgICAgPHN0cm9uZz57e29iamVjdC5uYW1lfX1fe3tvYmplY3QudmVyc2lvbn19PC9zdHJvbmc+IGhhcyBubyByZXZlcnNlIGJ1aWxkIGRlcGVuZGVuY2llcy4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgeyUgZWxzZSAlfQorICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJ0YWJsZSB0YWJsZS1ib3JkZXJlZCB0YWJsZS1ob3ZlciI+CisgICAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjaXBlCisgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgICA8dGJvZHk+CisKKyAgICAgICAgICAgICAgICAgICAgeyUgZm9yIHJyIGluIG9iamVjdC5yX2RlcGVuZGVuY2llc19kZXBlbmRzLmFsbHxkaWN0c29ydDoicmVjaXBlLm5hbWUiICV9CisgICAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48YSBocmVmPSJ7JSB1cmwgInJlY2lwZSIgYnVpbGQucGsgcnIucmVjaXBlLnBrICV9Ij57e3JyLnJlY2lwZS5uYW1lfX08L2E+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48YSBocmVmPSJ7JSB1cmwgInJlY2lwZSIgYnVpbGQucGsgcnIucmVjaXBlLnBrICV9Ij57e3JyLnJlY2lwZS52ZXJzaW9ufX08L2E+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgeyUgZW5kZm9yICV9CisKKyAgICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgIHslIGVuZGlmICV9CisKKyAgICAgICAgPC9kaXY+CisgICAgPC9kaXY+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0icm93IHNwYW40IHdlbGwiPgorICAgIDxoMj5BYm91dCB7e29iamVjdC5uYW1lfX08L2gyPgorICAgIDxkbCBjbGFzcz0iaXRlbS1pbmZvIj4KKyAgICAgICAgeyUgaWYgb2JqZWN0LnN1bW1hcnkgJX0KKyAgICAgICAgICAgIDxkdD5TdW1tYXJ5PC9kdD4KKyAgICAgICAgICAgIDxkZD57e29iamVjdC5zdW1tYXJ5fX08L2RkPgorICAgICAgICB7JSBlbmRpZiAlfQorICAgICAgICB7JSBpZiBvYmplY3QuZGVzY3JpcHRpb24gJX0KKyAgICAgICAgICAgIDxkdD5EZXNjcmlwdGlvbjwvZHQ+CisgICAgICAgICAgICA8ZGQ+e3tvYmplY3QuZGVzY3JpcHRpb259fTwvZGQ+CisgICAgICAgIHslIGVuZGlmICV9CisgICAgICAgIHslIGlmIG9iamVjdC5ob21lcGFnZSAlfQorICAgICAgICAgICAgPGR0PkhvbWVwYWdlPC9kdD4KKyAgICAgICAgICAgIDxkZD48YSBocmVmPSJ7e29iamVjdC5ob21lcGFnZX19Ij57e29iamVjdC5ob21lcGFnZX19PC9hPjwvZGQ+CisgICAgICAgIHslIGVuZGlmICV9CisgICAgICAgIHslIGlmIG9iamVjdC5idWd0cmFja2VyICV9CisgICAgICAgICAgICA8ZHQ+QnVndHJhY2tlcjwvZHQ+CisgICAgICAgICAgICA8ZGQ+PGEgaHJlZj0ie3tvYmplY3QuYnVndHJhY2tlcn19Ij57e29iamVjdC5idWd0cmFja2VyfX08L2E+PC9kZD4KKyAgICAgICAgeyUgZW5kaWYgJX0KKyAgICAgICAgeyUgaWYgb2JqZWN0LnNlY3Rpb24gJX0KKyAgICAgICAgICAgIDxkdD4KKyAgICAgICAgICAgIFNlY3Rpb24KKyAgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLXF1ZXN0aW9uLXNpZ24gZ2V0LWhlbHAiIHRpdGxlPSJUaGUgc2VjdGlvbiBpbiB3aGljaCByZWNpcGVzIHNob3VsZCBiZSBjYXRlZ29yaXplZCI+PC9pPgorICAgICAgICAgICAgPC9kdD4KKyAgICAgICAgICAgIDxkZD57e29iamVjdC5zZWN0aW9ufX08L2RkPgorICAgICAgICB7JSBlbmRpZiAlfQorICAgICAgICB7JSBpZiBvYmplY3QubGljZW5zZSAlfQorICAgICAgICAgICAgPGR0PkxpY2Vuc2U8L2R0PgorICAgICAgICAgICAgPGRkPnt7b2JqZWN0LmxpY2Vuc2V9fTwvZGQ+CisgICAgICAgIHslIGVuZGlmICV9CisgICAgPC9kbD4KKzwvZGl2PgorCit7JSBlbmRibG9jayAlfQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9yZWNpcGVfYnRuLmh0bWwgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL3JlY2lwZV9idG4uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2MxYjIzCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9yZWNpcGVfYnRuLmh0bWwKQEAgLTAsMCArMSw4IEBACis8YnV0dG9uIGRhdGEtcmVjaXBlLW5hbWU9Int7ZGF0YS5uYW1lfX0iIGNsYXNzPSJidG4gYnRuLWJsb2NrIGxheWVyLWV4aXN0cy17e2RhdGEubGF5ZXJfdmVyc2lvbi5wa319IGJ1aWxkLXJlY2lwZS1idG4iIHN0eWxlPSJkaXNwbGF5Om5vbmU7IG1hcmdpbi10b3A6IDVweDsiID4KKyAgQnVpbGQgcmVjaXBlCis8L2J1dHRvbj4KKzxidXR0b24gY2xhc3M9ImJ0biBidG4tYmxvY2sgbGF5ZXJidG4gbGF5ZXItYWRkLXt7ZGF0YS5sYXllcl92ZXJzaW9uLnBrfX0iIGRhdGEtbGF5ZXI9J3sgImlkIjoge3tkYXRhLmxheWVyX3ZlcnNpb24ucGt9fSwgIm5hbWUiOiAgInt7ZGF0YS5sYXllcl92ZXJzaW9uLmxheWVyLm5hbWV9fSIsICJsYXllcmRldGFpbHVybCI6ICJ7JXVybCAnbGF5ZXJkZXRhaWxzJyBleHRyYS5waWQgZGF0YS5sYXllcl92ZXJzaW9uLnBrJX0ifScgZGF0YS1kaXJlY3RpdmU9ImFkZCI+CisgIDxpIGNsYXNzPSJpY29uLXBsdXMiPjwvaT4KKyAgQWRkIGxheWVyCisgIDxpIHRpdGxlPSIiIGNsYXNzPSJpY29uLXF1ZXN0aW9uLXNpZ24gZ2V0LWhlbHAiIGRhdGEtb3JpZ2luYWwtdGl0bGU9IlRvIGJ1aWxkIHRoaXMgdGFyZ2V0LCB5b3UgbXVzdCBmaXJzdCBhZGQgdGhlIHt7ZGF0YS5sYXllcl92ZXJzaW9uLmxheWVyLm5hbWV9fSBsYXllciB0byB5b3VyIHByb2plY3QiPjwvaT4KKzwvYnV0dG9uPgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy9yZWNpcGVfcGFja2FnZXMuaHRtbCBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvcmVjaXBlX3BhY2thZ2VzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI1ODQ3YgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvcmVjaXBlX3BhY2thZ2VzLmh0bWwKQEAgLTAsMCArMSwxMjMgQEAKK3slIGV4dGVuZHMgImJhc2VidWlsZGRldGFpbHBhZ2UuaHRtbCIgJX0KKworeyUgbG9hZCBwcm9qZWN0dGFncyAlfQoreyUgbG9hZCBodW1hbml6ZSAlfQoreyUgYmxvY2sgbG9jYWxicmVhZGNydW1iICV9Cis8bGk+PGEgaHJlZj0ieyUgdXJsICdyZWNpcGVzJyBidWlsZC5wayAlfSI+UmVjaXBlczwvYT48L2xpPgorPGxpPnt7cmVjaXBlLm5hbWV9fV97e3JlY2lwZS52ZXJzaW9ufX0gPC9saT4KK3slIGVuZGJsb2NrICV9CisKK3slIGJsb2NrIHBhZ2VkZXRhaWxpbmZvbWFpbiAlfQorCis8IS0tIEJlZ2luIGNvbnRhaW5lciAtLT4KKworPGRpdiBjbGFzcz0icm93LWZsdWlkIHNwYW4xMSI+CisgICAgPGRpdiBjbGFzcz0icGFnZS1oZWFkZXIiPgorICAgICAgICA8aDE+e3tyZWNpcGUubmFtZX19X3t7cmVjaXBlLnZlcnNpb259fTwvaDE+CisgICAgPC9kaXY+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0icm93LWZsdWlkIHNwYW43IHRhYmJhYmxlIj4KKyAgICA8dWwgY2xhc3M9Im5hdiBuYXYtcGlsbHMiPgorICAgICAgICA8bGk+CisgICAgICAgICAgICA8YSBocmVmPSJ7JSB1cmwgInJlY2lwZSIgYnVpbGQucGsgcmVjaXBlLmlkICIxIiAlfSI+CisgICAgICAgICAgICAgICAgPGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCIgdGl0bGU9IkJ1aWxkLXJlbGF0ZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlY2lwZSI+PC9pPgorICAgICAgICAgICAgICAgIFJlY2lwZSBkZXRhaWxzCisgICAgICAgICAgICA8L2E+CisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaSBjbGFzcz0iYWN0aXZlIj4KKwkJCTxhIGhyZWY9IiNwYWNrYWdlcy1idWlsdCIgZGF0YS10b2dnbGU9InRhYiI+CisgICAgICAgICAgICAgICAgPGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCIgdGl0bGU9IlRoZSBwYWNrYWdlZCBvdXRwdXQgcmVzdWx0aW5nIGZyb20gYnVpbGRpbmcgdGhlIHJlY2lwZSI+PC9pPgorICAgICAgICAgICAgICAgIFBhY2thZ2VzICh7e29iamVjdF9jb3VudH19KQorICAgICAgICAgICAgPC9hPgorICAgICAgICA8L2xpPgorICAgICAgICA8bGk+CisgICAgICAgICAgICA8YSBocmVmPSJ7JSB1cmwgInJlY2lwZSIgYnVpbGQucGsgcmVjaXBlLmlkICIzIiAlfSI+CisgICAgICAgICAgICAgICAgPGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCIgdGl0bGU9IlRoZSByZWNpcGUgYnVpbGQtdGltZSBkZXBlbmRlbmNpZXMgKGkuZS4gb3RoZXIgcmVjaXBlcykiPjwvaT4KKyAgICAgICAgICAgICAgICBCdWlsZCBkZXBlbmRlbmNpZXMgKHt7cmVjaXBlLnJfZGVwZW5kZW5jaWVzX3JlY2lwZS5hbGwuY291bnR9fSkKKyAgICAgICAgICAgIDwvYT4KKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPgorICAgICAgICAgICAgPGEgaHJlZj0ieyUgdXJsICJyZWNpcGUiIGJ1aWxkLnBrIHJlY2lwZS5pZCAiNCIgJX0iPgorICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLXF1ZXN0aW9uLXNpZ24gZ2V0LWhlbHAiIHRpdGxlPSJUaGUgcmVjaXBlIGJ1aWxkLXRpbWUgcmV2ZXJzZSBkZXBlbmRlbmNpZXMgKGkuZS4gdGhlIHJlY2lwZXMgdGhhdCBkZXBlbmQgb24gdGhpcyByZWNpcGUpIj48L2k+CisgICAgICAgICAgICAgICAgUmV2ZXJzZSBidWlsZCBkZXBlbmRlbmNpZXMgKHt7cmVjaXBlLnJfZGVwZW5kZW5jaWVzX2RlcGVuZHMuYWxsLmNvdW50fX0pCisgICAgICAgICAgICA8L2E+CisgICAgICAgIDwvbGk+CisgICAgPC91bD4KKyAgICA8ZGl2IGNsYXNzPSJ0YWItY29udGVudCI+Cit7IyAgICAgICAgPGRpdiBjbGFzcz0idGFiLXBhbmUgYWN0aXZlIiBpZD0icGFja2FnZXMtYnVpbHQiIG5hbWU9InBhY2thZ2VzLWJ1aWx0Ij4jfQorICAgICAgIDxkaXYgY2xhc3M9InRhYi1wYW5lIGFjdGl2ZSIgaWQ9InBhY2thZ2VzLWJ1aWx0Ij4KKyAgICAgICAgICAgIHslIGlmIG5vdCBvYmplY3RzIGFuZCBub3QgcmVxdWVzdC5HRVQuc2VhcmNoICV9CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhbGVydCBhbGVydC1pbmZvIj4KKyAgICAgICAgICAgICAgICA8c3Ryb25nPnt7cmVjaXBlLm5hbWV9fV97e3JlY2lwZS52ZXJzaW9ufX08L3N0cm9uZz4gZG9lcyBub3QgYnVpbGQgYW55IHBhY2thZ2VzLgorICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgIHslIGVsaWYgbm90IG9iamVjdHMgJX0KKyAgICAgICAgICAgICAgICB7IyBoYXZlIGVtcHR5IHNlYXJjaCByZXN1bHRzLCBubyB0YWJsZSBub3IgcGFnaW5hdGlvbiAjfQorICAgICAgICAgICAgICAgIHslIHdpdGggInBhY2thZ2VzIiBhcyBzZWFyY2hfd2hhdCAlfQorICAgICAgICAgICAgICAgIHslIGluY2x1ZGUgImRldGFpbF9zZWFyY2hfaGVhZGVyLmh0bWwiICV9CisgICAgICAgICAgICAgICAgeyUgZW5kd2l0aCAlfQorCisgICAgICAgICAgICB7JSBlbHNlICV9CisKKworICAgICAgICAgICAgICAgIHslIHdpdGggInBhY2thZ2VzIiBhcyBzZWFyY2hfd2hhdCAlfQorICAgICAgICAgICAgICAgIHslIGluY2x1ZGUgImRldGFpbF9zZWFyY2hfaGVhZGVyLmh0bWwiICV9CisgICAgICAgICAgICAgICAgeyUgZW5kd2l0aCAlfQorICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJ0YWJsZSB0YWJsZS1ib3JkZXJlZCB0YWJsZS1ob3ZlciB0YWJsZXNvcnRlciIgaWQ9Im90YWJsZSI+CisgICAgICAgICAgICAgICAgeyUgaW5jbHVkZSAiZGV0YWlsX3NvcnRlZF9oZWFkZXIuaHRtbCIgJX0KKworICAgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICAgICAgeyUgZm9yIHBhY2thZ2UgaW4gb2JqZWN0cyAlfQorCisgICAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48YSBocmVmPSJ7JSB1cmwgInBhY2thZ2VfYnVpbHRfZGV0YWlsIiBidWlsZC5wayBwYWNrYWdlLnBrICV9Ij57e3BhY2thZ2UubmFtZX19PC9hPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGEgaHJlZj0ieyUgdXJsICJwYWNrYWdlX2J1aWx0X2RldGFpbCIgYnVpbGQucGsgcGFja2FnZS5wayAlfSI+e3twYWNrYWdlLnZlcnNpb259fV97e3BhY2thZ2UucmV2aXNpb259fTwvYT48L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJzaXplY29sIj48YSBocmVmPSJ7JSB1cmwgInBhY2thZ2VfYnVpbHRfZGV0YWlsIiBidWlsZC5wayBwYWNrYWdlLnBrICV9Ij57e3BhY2thZ2Uuc2l6ZXxmaWx0ZXJlZF9maWxlc2l6ZWZvcm1hdH19PC9hPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDwvdHI+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHslIGVuZGZvciAlfQorCisgICAgICAgICAgICB7JSBlbmRpZiAlfQorICAgICAgICAgICAgeyUgaWYgb2JqZWN0cyAlfQorICAgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgIHslIGluY2x1ZGUgImRldGFpbF9wYWdpbmF0aW9uX2JvdHRvbS5odG1sIiAlfQorICAgICAgICAgICAgeyUgZW5kaWYgJX0KKyAgICAgICAgPC9kaXY+IHsjIHRhYi1wYW5lICN9CisgICAgPC9kaXY+IHsjIHRhYi1jb250ZW50ICN9Cis8L2Rpdj4geyMgc3BhbjcgI30KKworPGRpdiBjbGFzcz0icm93IHNwYW40IHdlbGwiPgorICAgIDxoMj5BYm91dCB7e3JlY2lwZS5uYW1lfX08L2gyPgorICAgIDxkbCBjbGFzcz0iaXRlbS1pbmZvIj4KKyAgICAgICAgeyUgaWYgcmVjaXBlLnN1bW1hcnkgJX0KKyAgICAgICAgICAgIDxkdD5TdW1tYXJ5PC9kdD4KKyAgICAgICAgICAgIDxkZD57e3JlY2lwZS5zdW1tYXJ5fX08L2RkPgorICAgICAgICB7JSBlbmRpZiAlfQorICAgICAgICB7JSBpZiByZWNpcGUuZGVzY3JpcHRpb24gJX0KKyAgICAgICAgICAgIDxkdD5EZXNjcmlwdGlvbjwvZHQ+CisgICAgICAgICAgICA8ZGQ+e3tyZWNpcGUuZGVzY3JpcHRpb259fTwvZGQ+CisgICAgICAgIHslIGVuZGlmICV9CisgICAgICAgIHslIGlmIHJlY2lwZS5ob21lcGFnZSAlfQorICAgICAgICAgICAgPGR0PkhvbWVwYWdlPC9kdD4KKyAgICAgICAgICAgIDxkZD48YSBocmVmPSJ7e3JlY2lwZS5ob21lcGFnZX19Ij57e3JlY2lwZS5ob21lcGFnZX19PC9hPjwvZGQ+CisgICAgICAgIHslIGVuZGlmICV9CisgICAgICAgIHslIGlmIHJlY2lwZS5idWd0cmFja2VyICV9CisgICAgICAgICAgICA8ZHQ+QnVndHJhY2tlcjwvZHQ+CisgICAgICAgICAgICA8ZGQ+PGEgaHJlZj0ie3tyZWNpcGUuYnVndHJhY2tlcn19Ij57e3JlY2lwZS5idWd0cmFja2VyfX08L2E+PC9kZD4KKyAgICAgICAgeyUgZW5kaWYgJX0KKyAgICAgICAgeyUgaWYgcmVjaXBlLnNlY3Rpb24gJX0KKyAgICAgICAgICAgIDxkdD4KKyAgICAgICAgICAgIFNlY3Rpb24KKyAgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLXF1ZXN0aW9uLXNpZ24gZ2V0LWhlbHAiIHRpdGxlPSJUaGUgc2VjdGlvbiBpbiB3aGljaCByZWNpcGVzIHNob3VsZCBiZSBjYXRlZ29yaXplZCI+PC9pPgorICAgICAgICAgICAgPC9kdD4KKyAgICAgICAgICAgIDxkZD57e3JlY2lwZS5zZWN0aW9ufX08L2RkPgorICAgICAgICB7JSBlbmRpZiAlfQorICAgICAgICB7JSBpZiByZWNpcGUubGljZW5zZSAlfQorICAgICAgICAgICAgPGR0PkxpY2Vuc2U8L2R0PgorICAgICAgICAgICAgPGRkPnt7cmVjaXBlLmxpY2Vuc2V9fTwvZGQ+CisgICAgICAgIHslIGVuZGlmICV9CisgICAgPC9kbD4KKzwvZGl2PgoreyUgZW5kYmxvY2sgcGFnZWRldGFpbGluZm9tYWluICV9CmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL3JlY2lwZXMuaHRtbCBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvcmVjaXBlcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZGFjNDMKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL3JlY2lwZXMuaHRtbApAQCAtMCwwICsxLDExMiBAQAoreyUgZXh0ZW5kcyAiYmFzZWJ1aWxkcGFnZS5odG1sIiAlfQorCit7JSBsb2FkIHByb2plY3R0YWdzICV9CisKK3slIGJsb2NrIGxvY2FsYnJlYWRjcnVtYiAlfQorPGxpPlJlY2lwZXM8L2xpPgoreyUgZW5kYmxvY2sgJX0KKworeyUgYmxvY2sgbmF2LXJlY2lwZXMgJX0KKyAgPGxpIGNsYXNzPSJhY3RpdmUiPjxhIGhyZWY9InslIHVybCAncmVjaXBlcycgYnVpbGQucGsgJX0iPlJlY2lwZXM8L2E+PC9saT4KK3slIGVuZGJsb2NrICV9CisKK3slIGJsb2NrIGJ1aWxkaW5mb21haW4gJX0KKzxkaXYgY2xhc3M9InNwYW4xMCI+Cis8ZGl2IGNsYXNzPSJwYWdlLWhlYWRlciI+Cis8aDE+CisgIHslIGlmIHJlcXVlc3QuR0VULnNlYXJjaCBhbmQgb2JqZWN0cy5wYWdpbmF0b3IuY291bnQgPiAwICAlfQorICAgICAge3tvYmplY3RzLnBhZ2luYXRvci5jb3VudH19IHJlY2lwZXt7b2JqZWN0cy5wYWdpbmF0b3IuY291bnR8cGx1cmFsaXplfX0gZm91bmQKKyAgeyVlbGlmIHJlcXVlc3QuR0VULnNlYXJjaCBhbmQgb2JqZWN0cy5wYWdpbmF0b3IuY291bnQgPT0gMCV9CisgICAgICBObyByZWNpcGVzIGZvdW5kCisgIHslZWxzZSV9CisgICAgICBSZWNpcGVzCisgIHslZW5kaWYlfQorIDwvaDE+Cis8L2Rpdj4KKworeyUgaWYgb2JqZWN0cy5wYWdpbmF0b3IuY291bnQgPT0gMCAlfQorICA8ZGl2IGNsYXNzPSJyb3ctZmx1aWQiPgorICAgICAgPGRpdiBjbGFzcz0iYWxlcnQiPgorICAgICAgICA8Zm9ybSBjbGFzcz0ibm8tcmVzdWx0cyBpbnB1dC1hcHBlbmQiIGlkPSJzZWFyY2hmb3JtIj4KKyAgICAgICAgICAgIDxpbnB1dCBpZD0ic2VhcmNoIiBuYW1lPSJzZWFyY2giIGNsYXNzPSJpbnB1dC14eGxhcmdlIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0ieyVpZiByZXF1ZXN0LkdFVC5zZWFyY2glfXt7cmVxdWVzdC5HRVQuc2VhcmNofX17JWVuZGlmJX0iLz57JSBpZiByZXF1ZXN0LkdFVC5zZWFyY2ggJX08YSBocmVmPSJqYXZhc2NyaXB0OiQoJyNzZWFyY2gnKS52YWwoJycpO3NlYXJjaGZvcm0uc3VibWl0KCkiIGNsYXNzPSJhZGQtb24gYnRuIiB0YWJpbmRleD0iLTEiPjxpIGNsYXNzPSJpY29uLXJlbW92ZSI+PC9pPjwvYT57JSBlbmRpZiAlfQorICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJTZWFyY2giPlNlYXJjaDwvYnV0dG9uPgorICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1saW5rIiBvbmNsaWNrPSJqYXZhc2NyaXB0OiQoJyNzZWFyY2gnKS52YWwoJycpO3NlYXJjaGZvcm0uc3VibWl0KCkiPlNob3cgYWxsIHJlY2lwZXM8L2J1dHRvbj4KKyAgICAgICAgPC9mb3JtPgorICAgICAgPC9kaXY+CisgIDwvZGl2PgorCit7JSBlbHNlICV9Cit7JSBpbmNsdWRlICJiYXNldGFibGVfdG9wLmh0bWwiICV9CisKKyAgICB7JSBmb3IgcmVjaXBlIGluIG9iamVjdHMgJX0KKworICAgIDx0ciBjbGFzcz0iZGF0YSI+CisgICAgICAgIDx0ZCBjbGFzcz0icmVjaXBlX19uYW1lIj4KKyAgICAgICAgICAgIDxhIGhyZWY9InslIHVybCAicmVjaXBlIiBidWlsZC5wayByZWNpcGUucGsgJX0iPnt7cmVjaXBlLm5hbWV9fTwvYT4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGNsYXNzPSJyZWNpcGVfX3ZlcnNpb24iPgorICAgICAgICAgICAgPGEgaHJlZj0ieyUgdXJsICJyZWNpcGUiIGJ1aWxkLnBrIHJlY2lwZS5wayAlfSI+e3tyZWNpcGUudmVyc2lvbn19PC9hPgorICAgICAgICA8L3RkPgorICAgICAgICA8IS0tIERlcGVuZHMgLS0+CisgICAgICAgIDx0ZCBjbGFzcz0iZGVwZW5kc19vbiI+CisgICAgICAgICAgICB7JSB3aXRoIGRlcHM9cmVjaXBlX2RlcHN8Z2V0X2RpY3RfdmFsdWU6cmVjaXBlLnBrICV9CisgICAgICAgICAgICB7JSB3aXRoIGNvdW50PWRlcHN8bGVuZ3RoICV9CisgICAgICAgICAgICB7JSBpZiBjb3VudCAlfQorICAgICAgICAgICAgPGEgY2xhc3M9ImJ0biIKKyAgICAgICAgICAgICAgICB0aXRsZT0iPGEgaHJlZj0neyUgdXJsICJyZWNpcGUiIGJ1aWxkLnBrIHJlY2lwZS5wayAlfSNkZXBlbmRlbmNpZXMnPnt7cmVjaXBlLm5hbWV9fTwvYT4gZGVwZW5kZW5jaWVzIgorICAgICAgICAgICAgICAgIGRhdGEtY29udGVudD0iPHVsIGNsYXNzPSd1bnN0eWxlZCc+CisgICAgICAgICAgICAgICAgICB7JSBmb3IgaSBpbiBkZXBzfGRpY3Rzb3J0OiJkZXBlbmRzX29uLm5hbWUiJX0KKyAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9J3slIHVybCAicmVjaXBlIiBidWlsZC5wayBpLmRlcGVuZHNfb24ucGsgJX0nPnt7aS5kZXBlbmRzX29uLm5hbWV9fTwvYT48L2xpPgorICAgICAgICAgICAgICAgICAgeyUgZW5kZm9yICV9CisgICAgICAgICAgICAgICAgPC91bD4iPgorICAgICAgICAgICAgICAgIHt7Y291bnR9fQorICAgICAgICAgICAgPC9hPgorICAgICAgICAgICAgeyUgZW5kaWYgJX0KKyAgICAgICAgICAgIHslIGVuZHdpdGggJX0KKyAgICAgICAgICAgIHslIGVuZHdpdGggJX0KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPCEtLSAgQnJvdWdodCBpbiBieSAtLT4KKyAgICAgICAgPHRkIGNsYXNzPSJkZXBlbmRzX2J5Ij4KKyAgICAgICAgICAgIHslIHdpdGggcmV2cz1yZWNpcGVfcmV2c3xnZXRfZGljdF92YWx1ZTpyZWNpcGUucGsgJX0KKyAgICAgICAgICAgIHslIHdpdGggY291bnQ9cmV2c3xsZW5ndGggJX0KKyAgICAgICAgICAgIHslIGlmIGNvdW50ICV9CisgICAgICAgICAgICA8YSBjbGFzcz0iYnRuIgorICAgICAgICAgICAgICAgIHRpdGxlPSI8YSBocmVmPSd7JSB1cmwgInJlY2lwZSIgYnVpbGQucGsgcmVjaXBlLnBrICV9I2Jyb3VnaHQtaW4tYnknPnt7cmVjaXBlLm5hbWV9fTwvYT4gcmV2ZXJzZSBkZXBlbmRlbmNpZXMiCisgICAgICAgICAgICAgICAgZGF0YS1jb250ZW50PSI8dWwgY2xhc3M9J3Vuc3R5bGVkJz4KKyAgICAgICAgICAgICAgICAgIHslIGZvciBpIGluIHJldnN8ZGljdHNvcnQ6InJlY2lwZS5uYW1lIiAlfQorICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0neyUgdXJsICJyZWNpcGUiIGJ1aWxkLnBrIGkucmVjaXBlLnBrICV9Jz57e2kucmVjaXBlLm5hbWV9fTwvYT48L2xpPgorICAgICAgICAgICAgICAgICAgeyUgZW5kZm9yICV9CisgICAgICAgICAgICAgICAgPC91bD4iPgorICAgICAgICAgICAgICAgIHt7Y291bnR9fQorICAgICAgICAgICAgPC9hPgorICAgICAgICAgICAgeyUgZW5kaWYgJX0KKyAgICAgICAgICAgIHslIGVuZHdpdGggJX0KKyAgICAgICAgICAgIHslIGVuZHdpdGggJX0KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPCEtLSBSZWNpcGUgZmlsZSAtLT4KKyAgICAgICAgPHRkIGNsYXNzPSJyZWNpcGVfZmlsZSI+e3tyZWNpcGUuZmlsZV9wYXRofX0geyUgaWYgcmVjaXBlLnBhdGhmbGFncyAlfTxpPih7e3JlY2lwZS5wYXRoZmxhZ3N9fSk8L2k+eyUgZW5kaWYgJX08L3RkPgorICAgICAgICA8IS0tIFNlY3Rpb24gLS0+CisgICAgICAgIDx0ZCBjbGFzcz0icmVjaXBlX3NlY3Rpb24iPnt7cmVjaXBlLnNlY3Rpb259fTwvdGQ+CisgICAgICAgIDwhLS0gTGljZW5zZSAtLT4KKyAgICAgICAgPHRkIGNsYXNzPSJyZWNpcGVfbGljZW5zZSI+e3tyZWNpcGUubGljZW5zZX19PC90ZD4KKyAgICAgICAgPCEtLSBMYXllciAtLT4KKyAgICAgICAgPHRkIGNsYXNzPSJsYXllcl92ZXJzaW9uX19sYXllcl9fbmFtZSI+e3tyZWNpcGUubGF5ZXJfdmVyc2lvbi5sYXllci5uYW1lfX08L3RkPgorICAgICAgICA8IS0tIExheWVyIGJyYW5jaCAtLT4KKyAgICAgICAgPHRkIGNsYXNzPSJsYXllcl92ZXJzaW9uX19icmFuY2giPnt7cmVjaXBlLmxheWVyX3ZlcnNpb24uYnJhbmNofX08L3RkPgorICAgICAgICA8IS0tIExheWVyIGNvbW1pdCAtLT4KKyAgICAgICAgPHRkIGNsYXNzPSJsYXllcl92ZXJzaW9uX19sYXllcl9fY29tbWl0Ij4KKyAgICAgICAgICAgIDxhIGNsYXNzPSJidG4iCisgICAgICAgICAgICAgICAgZGF0YS1jb250ZW50PSI8dWwgY2xhc3M9J3Vuc3R5bGVkJz4KKyAgICAgICAgICAgICAgICAgIDxsaT57e3JlY2lwZS5sYXllcl92ZXJzaW9uLmNvbW1pdH19PC9saT4KKyAgICAgICAgICAgICAgICA8L3VsPiI+CisgICAgICAgICAgICAgICAge3tyZWNpcGUubGF5ZXJfdmVyc2lvbi5jb21taXR8dHJ1bmNhdGVjaGFyczoxM319CisgICAgICAgICAgICA8L2E+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKworICAgIHslIGVuZGZvciAlfQorCit7JSBpbmNsdWRlICJiYXNldGFibGVfYm90dG9tLmh0bWwiICV9Cit7JSBlbmRpZiAlfQorPC9kaXY+Cit7JSBlbmRibG9jayAlfQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy90YWJsZXNvcnQuaHRtbCBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvdGFibGVzb3J0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYyNDc0MgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvdGFibGVzb3J0Lmh0bWwKQEAgLTAsMCArMSwzOCBAQAoreyUgbG9hZCBwcm9qZWN0dGFncyAlfQorPCEtLSBjb21wb25lbnQgdG8gZGlzcGxheSBhIGdlbmVyaWMgdGFibGUgLS0+CisgICAgeyUgaWYgZGlzYWJsZV9zb3J0ICV9CisgICAgPHRhYmxlIGNsYXNzPSJ0YWJsZSB0YWJsZS1ib3JkZXJlZCB0YWJsZS1ob3ZlciIgaWQ9ImRldGFpbF90YWJsZSI+CisgICAgPHRoZWFkPgorICAgICAgICA8dHI+CisgICAgICAgICAgICB7JSBmb3IgdGMgaW4gdGFibGVjb2xzICV9CisgICAgICAgICAgICA8dGggY2xhc3M9InslaWYgdGMuZGNsYXNzJX17e3RjLmRjbGFzc319eyVlbmRpZiV9IHslaWYgdGMuY2xjbGFzcyV9e3t0Yy5jbGNsYXNzfX17JWVuZGlmJX0iPgorICAgICAgICAgICAgICAgIHslaWYgdGMucWhlbHAlfTxpIGNsYXNzPSJpY29uLXF1ZXN0aW9uLXNpZ24gZ2V0LWhlbHAiIHRpdGxlPSJ7e3RjLnFoZWxwfX0iPjwvaT57JWVuZGlmJX0KKyAgICAgICAgICAgICAgICB7e3RjLm5hbWV9fQorICAgICAgICAgICAgPC90aD4KKyAgICAgICAgICAgIHslIGVuZGZvciAlfQorICAgICAgICA8L3RyPgorICAgIDwvdGhlYWQ+CisgICAgeyUgZWxzZSAlfQorICAgIDx0YWJsZSBjbGFzcz0idGFibGUgdGFibGUtYm9yZGVyZWQgdGFibGUtaG92ZXIgdGFibGVzb3J0ZXIiIGlkPSJvdGFibGUiPgorICAgIDx0aGVhZD4KKyAgICAgICAgPCEtLSBUYWJsZSBoZWFkZXIgcm93OyBnZW5lcmF0ZWQgZnJvbSAidGFibGVjb2xzIiBlbnRyeSBpbiB0aGUgY29udGV4dCBkaWN0IC0tPgorICAgICAgICA8dHI+CisgICAgICAgICAgICB7JSBmb3IgdGMgaW4gdGFibGVjb2xzICV9CisgICAgICAgICAgICA8dGggY2xhc3M9InslaWYgdGMuZGNsYXNzJX17e3RjLmRjbGFzc319eyVlbmRpZiV9IHslaWYgdGMuY2xjbGFzcyV9e3t0Yy5jbGNsYXNzfX17JWVuZGlmJX0iPgorICAgICAgICAgICAgICAgIHslaWYgdGMucWhlbHAlfTxpIGNsYXNzPSJpY29uLXF1ZXN0aW9uLXNpZ24gZ2V0LWhlbHAiIHRpdGxlPSJ7e3RjLnFoZWxwfX0iPjwvaT57JWVuZGlmJX0KKyAgICAgICAgICAgICAgICB7JWlmIHRjLm9yZGVyZmllbGQlfQorICAgICAgICAgICAgICAgICAgICA8YSB7JWlmIHRjLm9yZGVyaWNvbiV9IGNsYXNzPSJzb3J0ZWQiIHslZW5kaWYlfQorICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj0iamF2YXNjcmlwdDpyZWxvYWRfcGFyYW1zKHsncGFnZSc6IDEsICdvcmRlcmJ5JyA6ICd7e3RjLm9yZGVyZmllbGR9fScgfSkiID4KKyAgICAgICAgICAgICAgICAgICAgICAgIHt7dGMubmFtZX19CisgICAgICAgICAgICAgICAgICAgIDwvYT4KKyAgICAgICAgICAgICAgICB7JWVsc2UlfQorICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibXV0ZWQiPgorICAgICAgICAgICAgICAgICAgICAgICAge3t0Yy5uYW1lfX0KKyAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgorICAgICAgICAgICAgICAgIHslZW5kaWYlfQorICAgICAgICAgICAgICAgIHslaWYgdGMub3JkZXJpY29uJX0gPGkgY2xhc3M9Imljb24tY2FyZXQte3t0Yy5vcmRlcmljb259fSI+PC9pPnslZW5kaWYlfQorICAgICAgICAgICAgPC90aD4KKyAgICAgICAgICAgIHslIGVuZGZvciAlfQorICAgICAgICA8L3RyPgorICAgIDwvdGhlYWQ+CisgICAgeyUgZW5kaWYgJX0KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvdGFyZ2V0Lmh0bWwgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL3RhcmdldC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZTZjNGEKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL3RhcmdldC5odG1sCkBAIC0wLDAgKzEsMTYyIEBACit7JSBleHRlbmRzICJiYXNlYnVpbGRwYWdlLmh0bWwiICV9Cit7JSBibG9jayBsb2NhbGJyZWFkY3J1bWIgJX0KKzxsaT57e3RhcmdldC50YXJnZXR9fTwvbGk+Cit7JSBlbmRibG9jayBsb2NhbGJyZWFkY3J1bWIlfQorCit7JSBsb2FkIHByb2plY3R0YWdzICV9CisKK3slIGJsb2NrIG5hdi10YXJnZXQgJX0KKyAgeyUgZm9yIHQgaW4gYnVpbGQuZ2V0X3NvcnRlZF90YXJnZXRfbGlzdCAlfQorICAgIHslIGlmZXF1YWwgdGFyZ2V0LnBrIHQucGsgJX0KKyAgICAgIDxsaSBjbGFzcz0iYWN0aXZlIj48YSBocmVmPSJ7JSB1cmwgJ3RhcmdldCcgYnVpbGQucGsgdC5wayAlfSI+e3t0LnRhcmdldH19PC9hPjxsaT4KKyAgICB7JSBlbHNlICV9CisgICAgICA8bGk+PGEgaHJlZj0ieyUgdXJsICd0YXJnZXQnIGJ1aWxkLnBrIHQucGsgJX0iPnt7dC50YXJnZXR9fTwvYT48bGk+CisgICAgeyUgZW5kaWZlcXVhbCAlfQorICB7JSBlbmRmb3IgJX0KK3slIGVuZGJsb2NrICV9CisKK3slIGJsb2NrIGJ1aWxkaW5mb21haW4gJX0KKworPGRpdiBjbGFzcz0icm93LWZsdWlkIHNwYW4xMCI+CisgICAgPGRpdiBjbGFzcz0icGFnZS1oZWFkZXIiPgorICAgICAgICA8aDE+CisgICAgICAgICAgICB7JSBpZiByZXF1ZXN0LkdFVC5zZWFyY2ggYW5kIG9iamVjdHMucGFnaW5hdG9yLmNvdW50ID4gMCAlfQorICAgICAgICAgICAgICAgIHt7b2JqZWN0cy5wYWdpbmF0b3IuY291bnR9fSBwYWNrYWdle3tvYmplY3RzLnBhZ2luYXRvci5jb3VudHxwbHVyYWxpemV9fSBmb3VuZAorICAgICAgICAgICAgeyUgZWxpZiByZXF1ZXN0LkdFVC5zZWFyY2ggYW5kIG9iamVjdHMucGFnaW5hdG9yLmNvdW50ID09IDAgJX0KKyAgICAgICAgICAgICAgICBObyBwYWNrYWdlcyBmb3VuZAorICAgICAgICAgICAgeyUgZWxzZSAlfQorICAgICAgICAgICAgICAgIHt7dGFyZ2V0LnRhcmdldH19CisgICAgICAgICAgICB7JSBlbmRpZiAlfQorICAgICAgICA8L2gxPgorICAgIDwvZGl2PgorPC9kaXY+CisKKzxkaXYgY2xhc3M9InJvdy1mbHVpZCBwdWxsLXJpZ2h0IHNwYW4xMCIgaWQ9Im5hdlRhYiI+CisgICAgPHVsIGNsYXNzPSJuYXYgbmF2LXBpbGxzIj4KKyAgICAgICAgPGxpIGNsYXNzPSJhY3RpdmUiPgorICAgICAgICAgICAgPGEgaHJlZj0iI3RhcmdldCI+CisgICAgICAgICAgICA8aSBjbGFzcz0iaWNvbi1xdWVzdGlvbi1zaWduIGdldC1oZWxwIiB0aXRsZT0iT2YgYWxsIHRoZSBwYWNrYWdlcyBidWlsdCwgdGhlIHN1YnNldCBpbnN0YWxsZWQgaW4gdGhlIHJvb3QgZmlsZSBzeXN0ZW0gb2YgdGhpcyBpbWFnZSI+PC9pPgorICAgICAgICAgICAgICAgIFBhY2thZ2VzIGluY2x1ZGVkICh7e3RhcmdldC5wYWNrYWdlX2NvdW50fX0gLSB7e3BhY2thZ2VzX3N1bXxmaWx0ZXJlZF9maWxlc2l6ZWZvcm1hdH19KQorICAgICAgICAgICAgPC9hPgorICAgICAgICA8L2xpPgorICAgICAgICA8bGk+CisgICAgICAgICAgICA8YSBocmVmPSJ7JSB1cmwgJ2RpcmluZm8nIGJ1aWxkLmlkIHRhcmdldC5pZCAlfSI+CisgICAgICAgICAgICAgICAgPGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCIgdGl0bGU9IlRoZSBkaXJlY3RvcmllcyBhbmQgZmlsZXMgaW4gdGhlIHJvb3QgZmlsZSBzeXN0ZW0gb2YgdGhpcyBpbWFnZSI+PC9pPgorICAgICAgICAgICAgICAgIERpcmVjdG9yeSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIDwvYT4KKyAgICAgICAgPC9saT4KKyAgICA8L3VsPgorCisgICAgPGRpdiBpZD0iaW1hZ2UtcGFja2FnZXMiIGNsYXNzPSJ0YWItcGFuZSI+CisKKyAgICB7JSBpZiBvYmplY3RzLnBhZ2luYXRvci5jb3VudCA9PSAwICV9CisgICAgPGRpdiBjbGFzcz0icm93LWZsdWlkIj4KKyAgICAgICAgPGRpdiBjbGFzcz0iYWxlcnQiPgorICAgICAgICAgICAgPGZvcm0gY2xhc3M9Im5vLXJlc3VsdHMgaW5wdXQtYXBwZW5kIiBpZD0ic2VhcmNoZm9ybSI+CisgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJzZWFyY2giIG5hbWU9InNlYXJjaCIgY2xhc3M9ImlucHV0LXh4bGFyZ2UiIHR5cGU9InRleHQiIHZhbHVlPSJ7JSBpZiByZXF1ZXN0LkdFVC5zZWFyY2ggJX17e3JlcXVlc3QuR0VULnNlYXJjaH19eyUgZW5kaWYgJX0iLz57JSBpZiByZXF1ZXN0LkdFVC5zZWFyY2ggJX08YSBocmVmPSJqYXZhc2NyaXB0OiQoJyNzZWFyY2gnKS52YWwoJycpO3NlYXJjaGZvcm0uc3VibWl0KCkiIGNsYXNzPSJhZGQtb24gYnRuIiB0YWJpbmRleD0iLTEiPjxpIGNsYXNzPSJpY29uLXJlbW92ZSI+PC9pPjwvYT57JSBlbmRpZiAlfQorICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iU2VhcmNoIj5TZWFyY2g8L2J1dHRvbj4KKyAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLWxpbmsiIG9uY2xpY2s9ImphdmFzY3JpcHQ6JCgnI3NlYXJjaCcpLnZhbCgnJyk7c2VhcmNoZm9ybS5zdWJtaXQoKSI+U2hvdyBhbGwgcGFja2FnZXM8L2J1dHRvbj4KKyAgICAgICAgICAgIDwvZm9ybT4KKyAgICAgICAgPC9kaXY+CisgICAgPC9kaXY+CisKKworICAgIHslIGVsc2UgJX0KKyAgICB7JSBpbmNsdWRlICJiYXNldGFibGVfdG9wLmh0bWwiICV9CisgICAgeyUgZm9yIHBhY2thZ2UgaW4gb2JqZWN0cyAlfQorICAgIDx0cj4KKyAgICAgIHsjIG9yZGVyIG9mIHRoZSB0YWJsZSBkYXRhIG11c3QgbWF0Y2ggdGhlIGNvbHVtbnMgZGVmaW5lZCBpbiB0ZW1wbGF0ZSdzIGNvbnRleHQgdGFibGVjb2xzICAjfQorICAgICAgICA8dGQgY2xhc3M9InBhY2thZ2VfbmFtZSI+CisgICAgICAgICAgICA8YSBocmVmPSJ7JSB1cmwgJ3BhY2thZ2VfaW5jbHVkZWRfZGV0YWlsJyBidWlsZC5pZCB0YXJnZXQuaWQgcGFja2FnZS5pZCAlfSI+CisgICAgICAgICAgICB7e3BhY2thZ2UubmFtZX19CisgICAgICAgICAgICA8L2E+CisgICAgICAgICAgICB7JSBpZiBwYWNrYWdlLmluc3RhbGxlZF9uYW1lIGFuZCBwYWNrYWdlLm5hbWUgIT0gcGFja2FnZS5pbnN0YWxsZWRfbmFtZSAlfQorICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im11dGVkIj4gYXMge3twYWNrYWdlLmluc3RhbGxlZF9uYW1lfX08L3NwYW4+CisgICAgICAgICAgICA8aSBjbGFzcz0iaWNvbi1xdWVzdGlvbi1zaWduIGdldC1oZWxwIGhvdmVyLWhlbHAiIHRpdGxlPSd7e3BhY2thZ2UubmFtZXxhZGQ6IiB3YXMgcmVuYW1lZCBhdCBwYWNrYWdpbmcgdGltZSBhbmQgd2FzIGluc3RhbGxlZCBpbiB5b3VyIGltYWdlIGFzICJ8YWRkOnBhY2thZ2UuaW5zdGFsbGVkX25hbWV9fSc+PC9pPgorICAgICAgICAgICAgeyUgZW5kaWYgJX0KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGNsYXNzPSJwYWNrYWdlX3ZlcnNpb24iPgorICAgICAgICAgICAgPGEgaHJlZj0ieyUgdXJsICdwYWNrYWdlX2luY2x1ZGVkX2RldGFpbCcgYnVpbGQuaWQgdGFyZ2V0LmlkIHBhY2thZ2UuaWQgJX0iPgorICAgICAgICAgICAge3twYWNrYWdlLnZlcnNpb258ZmlsdGVyZWRfcGFja2FnZXZlcnNpb246cGFja2FnZS5yZXZpc2lvbn19CisgICAgICAgICAgICA8L2E+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBjbGFzcz0ibGljZW5zZSI+CisgICAgICAgICAgICB7e3BhY2thZ2UubGljZW5zZX19CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBjbGFzcz0ic2l6ZSBzaXplY29sIj4KKyAgICAgICAgICAgIHt7cGFja2FnZS5zaXplfGZpbHRlcmVkX2luc3RhbGxlZHNpemU6cGFja2FnZS5pbnN0YWxsZWRfc2l6ZXxmaWx0ZXJlZF9maWxlc2l6ZWZvcm1hdH19CisgICAgICAgIDwvdGQ+CisKKyAgICAgICAgPHRkIGNsYXNzPSJzaXplX292ZXJfdG90YWwgc2l6ZWNvbCI+CisgICAgICAgICAgICB7e3BhY2thZ2V8ZmlsdGVyX3NpemVvdmVydG90YWw6cGFja2FnZXNfc3VtfX0KKyAgICAgICAgPC90ZD4KKyAgICAgICA8dGQgY2xhc3M9ImRlcGVuZHMiPgorICAgICAgICAgICAgeyUgd2l0aCBkZXBzPXBhY2thZ2UucnVudGltZV9kZXBlbmRlbmNpZXMgJX0KKyAgICAgICAgICAgIHslIHdpdGggZGVwc19jb3VudD1kZXBzfGxlbmd0aCAlfQorICAgICAgICAgICAgeyUgaWYgZGVwc19jb3VudCA+IDAgJX0KKyAgICAgICAgICAgIDxhIGNsYXNzPSJidG4iCisgICAgICAgICAgICAgICAgdGl0bGU9IjxhIGhyZWY9J3slIHVybCAicGFja2FnZV9pbmNsdWRlZF9kZXBlbmRlbmNpZXMiIGJ1aWxkLmlkIHRhcmdldC5pZCBwYWNrYWdlLmlkICV9Jz57e3BhY2thZ2UubmFtZX19PC9hPiBkZXBlbmRlbmNpZXMiCisgICAgICAgICAgICAgICAgZGF0YS1jb250ZW50PSI8dWwgY2xhc3M9J3Vuc3R5bGVkJz4KKyAgICAgICAgICAgICAgICAgIHslIGZvciBpIGluIGRlcHN8ZGljdHNvcnQ6J2RlcGVuZHNfb24ubmFtZScgJX0KKyAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9J3slIHVybCAicGFja2FnZV9pbmNsdWRlZF9kZXRhaWwiIGJ1aWxkLnBrIHRhcmdldC5pZCBpLmRlcGVuZHNfb24ucGsgJX0nPnt7aS5kZXBlbmRzX29uLm5hbWV9fTwvYT48L2xpPgorICAgICAgICAgICAgICAgICAgeyUgZW5kZm9yICV9CisgICAgICAgICAgICAgICAgPC91bD4iPgorICAgICAgICAgICAgICAgIHt7ZGVwc19jb3VudH19CisgICAgICAgICAgICA8L2E+CisgICAgICAgICAgICB7JSBlbmRpZiAlfQorICAgICAgICAgICAgeyUgZW5kd2l0aCAlfQorICAgICAgICAgICAgeyUgZW5kd2l0aCAlfQorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgY2xhc3M9ImJyb3VnaHRfaW5fYnkiPgorICAgICAgICAgICAgeyUgd2l0aCByZGVwcz1wYWNrYWdlLnJldmVyc2VfcnVudGltZV9kZXBlbmRlbmNpZXMgJX0KKyAgICAgICAgICAgIHslIHdpdGggcmRlcHNfY291bnQ9cmRlcHN8bGVuZ3RoICV9CisgICAgICAgICAgICB7JSBpZiByZGVwc19jb3VudCA+IDAgJX0KKyAgICAgICAgICAgIDxhIGNsYXNzPSJidG4iCisgICAgICAgICAgICAgICAgdGl0bGU9IjxhIGhyZWY9J3slIHVybCAicGFja2FnZV9pbmNsdWRlZF9yZXZlcnNlX2RlcGVuZGVuY2llcyIgYnVpbGQuaWQgdGFyZ2V0LmlkIHBhY2thZ2UuaWQgJX0nPnt7cGFja2FnZS5uYW1lfX08L2E+IHJldmVyc2UgZGVwZW5kZW5jaWVzIgorICAgICAgICAgICAgICAgIGRhdGEtY29udGVudD0iPHVsIGNsYXNzPSd1bnN0eWxlZCc+CisgICAgICAgICAgICAgICAgICB7JSBmb3IgaSBpbiByZGVwc3xkaWN0c29ydDoncGFja2FnZS5uYW1lJyAlfQorICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0neyUgdXJsICJwYWNrYWdlX2luY2x1ZGVkX2RldGFpbCIgYnVpbGQuaWQgdGFyZ2V0LmlkIGkucGFja2FnZS5pZCAlfSc+e3tpLnBhY2thZ2UubmFtZX19PC9hPjwvbGk+CisgICAgICAgICAgICAgICAgICB7JSBlbmRmb3IgJX0KKyAgICAgICAgICAgICAgICA8L3VsPiI+CisgICAgICAgICAgICAgICAge3tyZGVwc19jb3VudH19CisgICAgICAgICAgICA8L2E+CisgICAgICAgICAgICB7JSBlbmRpZiAlfQorICAgICAgICAgICAgeyUgZW5kd2l0aCAlfQorICAgICAgICAgICAgeyUgZW5kd2l0aCAlfQorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgY2xhc3M9InJlY2lwZV9uYW1lIj4KKyAgICAgICAgICAgIHslIGlmIHBhY2thZ2UucmVjaXBlLnZlcnNpb24gJX0KKyAgICAgICAgICAgIDxhIGhyZWY9InslIHVybCAncmVjaXBlJyBidWlsZC5pZCBwYWNrYWdlLnJlY2lwZV9pZCAlfSI+CisgICAgICAgICAgICB7eyBwYWNrYWdlLnJlY2lwZS5uYW1lIH19CisgICAgICAgICAgICA8L2E+CisgICAgICAgICAgICB7JSBlbmRpZiAlfQorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgY2xhc3M9InJlY2lwZV92ZXJzaW9uIj4KKyAgICAgICAgICAgIHslIGlmIHBhY2thZ2UucmVjaXBlLnZlcnNpb24gJX0KKyAgICAgICAgICAgIDxhIGhyZWY9InslIHVybCAncmVjaXBlJyBidWlsZC5pZCBwYWNrYWdlLnJlY2lwZV9pZCAlfSI+CisgICAgICAgICAgICB7eyBwYWNrYWdlLnJlY2lwZS52ZXJzaW9uIH19CisgICAgICAgICAgICA8L2E+CisgICAgICAgICAgICB7JSBlbmRpZiAlfQorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgY2xhc3M9ImxheWVyX25hbWUiPgorICAgICAgICAgICAge3sgcGFja2FnZS5yZWNpcGUubGF5ZXJfdmVyc2lvbi5sYXllci5uYW1lIH19CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBjbGFzcz0ibGF5ZXJfYnJhbmNoIj4KKyAgICAgICAgICAgIHt7IHBhY2thZ2UucmVjaXBlLmxheWVyX3ZlcnNpb24uYnJhbmNofX0KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGNsYXNzPSJsYXllcl9jb21taXQiPgorICAgICAgICAgICAgPGEgY2xhc3M9ImJ0biIKKyAgICAgICAgICAgICAgICBkYXRhLWNvbnRlbnQ9Ijx1bCBjbGFzcz0ndW5zdHlsZWQnPgorICAgICAgICAgICAgICAgICAgPGxpPnt7cGFja2FnZS5yZWNpcGUubGF5ZXJfdmVyc2lvbi5jb21taXR9fTwvbGk+CisgICAgICAgICAgICAgICAgPC91bD4iPgorICAgICAgICAgICAgICAgIHt7cGFja2FnZS5yZWNpcGUubGF5ZXJfdmVyc2lvbi5jb21taXR8dHJ1bmNhdGVjaGFyczoxM319CisgICAgICAgICAgICA8L2E+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICB7JSBlbmRmb3IgJX0KKworICAgIHslIGluY2x1ZGUgImJhc2V0YWJsZV9ib3R0b20uaHRtbCIgJX0KKyAgICB7JSBlbmRpZiAlfQorICAgIDwvZGl2PiA8IS0tIHRhYnBhbmUgLS0+Cis8L2Rpdj4gPCEtLXNwYW4gMTAtLT4KK3slIGVuZGJsb2NrIGJ1aWxkaW5mb21haW4gJX0KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvdGFzay5odG1sIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy90YXNrLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM1MDk4YQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvdGFzay5odG1sCkBAIC0wLDAgKzEsMjY5IEBACit7JSBleHRlbmRzICJiYXNlYnVpbGRkZXRhaWxwYWdlLmh0bWwiICV9CisKK3slIGxvYWQgcHJvamVjdHRhZ3MgJX0KK3slIGxvYWQgaHVtYW5pemUgJX0KKworeyUgYmxvY2sgbG9jYWxicmVhZGNydW1iICV9Cis8bGk+PGEgaHJlZj0ieyUgdXJsICd0YXNrcycgYnVpbGQucGsgJX0iPlRhc2tzPC9hPjwvbGk+Cis8bGk+e3t0YXNrLnJlY2lwZS5uYW1lfX1fe3t0YXNrLnJlY2lwZS52ZXJzaW9ufX0ge3t0YXNrLnRhc2tfbmFtZX19PC9saT4KK3slIGVuZGJsb2NrICV9CisKK3slIGJsb2NrIHBhZ2VkZXRhaWxpbmZvbWFpbiAlfQorCis8ZGl2IGNsYXNzPSJyb3cgc3BhbjExIj4KKyAgICA8ZGl2IGNsYXNzPSJwYWdlLWhlYWRlciI+CisgICAgICAgIDxoMT48YSBocmVmPSJ7JXVybCAncmVjaXBlJyBidWlsZC5wayB0YXNrLnJlY2lwZS5wayAlfSI+e3t0YXNrLnJlY2lwZS5uYW1lfX1fe3t0YXNrLnJlY2lwZS52ZXJzaW9ufX08L2E+IHt7dGFzay50YXNrX25hbWV9fTwvaDE+CisgICAgPC9kaXY+CisKK3sjIE91dGNvbWUgc2VjdGlvbiAjfQorPGgyIHt7IHRhc2t8dGFza19jb2xvcjpUcnVlIH19PgorICAgIHt7dGFzay5nZXRfb3V0Y29tZV9kaXNwbGF5fX0KKyAgICA8aSBjbGFzcz0iaWNvbi1xdWVzdGlvbi1zaWduIGdldC1oZWxwIGhlYWRpbmctaGVscCIgdGl0bGU9Int7dGFzay5nZXRfb3V0Y29tZV9oZWxwfX0iPjwvaT4KKzwvaDI+Cit7JWlmIHRhc2sudGFza19leGVjdXRlZCAlfQorICAgIHsjIGV4ZWN1dGVkIHRhc2tzIG91dGNvbWUgI30KKyAgICB7JSBpZiB0YXNrLmxvZ2ZpbGUgJX0KKyAgICAgICAgICAgIDxhIGNsYXNzPSJidG4gYnRuLWxhcmdlIiBocmVmPSJ7JSB1cmwgJ2J1aWxkX2FydGlmYWN0JyBidWlsZC5pZCAidGFza2xvZ2ZpbGUiIHRhc2sucGsgJX0iIHN0eWxlPSJtYXJnaW46MTVweDsiPkRvd25sb2FkIHRhc2sgbG9nPC9hPgorICAgIHslIGVuZGlmICV9CisgICAgICAgIHsjIHNob3cgc3RhY2sgdHJhY2UgZm9yIGZhaWxlZCB0YXNrICN9CisgICAgICAgIHslIGlmIHRhc2sub3V0Y29tZSA9PSB0YXNrLk9VVENPTUVfRkFJTEVEIGFuZCBsb2dfaGVhZCAlfQorICAgICAgICAgICAgPGgzPlB5dGhvbiBzdGFjayB0cmFjZTwvaDM+CisgICAgICAgICAgICA8ZGl2PgorICAgICAgICAgICAgICAgIDxwcmUgc3R5bGU9Im1pbi1oZWlnaHQ6MTYwcHg7Ij4KKyAgICAgICAgICAgICAgICAgICAgPGNvZGU+e3tsb2dfaGVhZH19PC9jb2RlPjxhIGlkPSJmdWxsLXRyYWNlLXNob3ciIGRhdGEtdGFyZ2V0PSIjZnVsbHRyYWNlIiBkYXRhLXRvZ2dsZT0iY29sbGFwc2UiIGNsYXNzPSJidG4gYnRuLW1pbmkiPi4uLjwvYT4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iZnVsbHRyYWNlIiBjbGFzcz0iY29sbGFwc2UiIHN0eWxlPSJtYXJnaW4tdG9wOiAtMjBweDsgaGVpZ2h0OiAwcHg7Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPnt7bG9nX2JvZHl9fTwvY29kZT48YnI+PGEgaWQ9ImZ1bGwtdHJhY2UtaGlkZSIgY2xhc3M9ImJ0biBidG4tbWluaSBjb2xsYXBzZWQiIHN0eWxlPSJmb250LWZhbWlseTpIZWx2ZXRpY2EgTmV1ZSIgZGF0YS10YXJnZXQ9IiNmdWxsdHJhY2UiIGRhdGEtdG9nZ2xlPSJjb2xsYXBzZSI+Q29sbGFwc2Ugc3RhY2sgdHJhY2U8aSBjbGFzcz0iaWNvbi1jYXJldC11cCI+PC9pPjwvYT48L2Rpdj48L3ByZT4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICB7JSBlbmRpZiAlfQoreyUgZWxzZSAlfQoreyMgbm90IGV4ZWN1dGVkIHRhc2tzIG91dGNvbWUgI30KKyAgICB7JSBpZiB0YXNrLm91dGNvbWUgPT0gdGFzay5PVVRDT01FX1BSRUJVSUxUICV9CisgICAgICAgIHslIGlmIG5vdCBzaG93aW5nX21hdGNoZXMgJX0KKyAgICAgICAgICAgIDxhIGNsYXNzPSJidG4iIGhyZWY9ImphdmFzY3JpcHQ6cmVsb2FkX3BhcmFtcyh7J3Nob3dfbWF0Y2hlcycgOiAndHJ1ZScgfSkiPk1hdGNoIHRvIHRhc2tzIGluIHByZXZpb3VzIGJ1aWxkcyA8aSBjbGFzcz0iaWNvbi1xdWVzdGlvbi1zaWduIGdldC1oZWxwIiBzdHlsZT0ibWFyZ2luLXRvcDoyMHB4OyIgdGl0bGU9IlRoaXMgc2hvd3MgeW91IGEgbGlzdCBvZiB0YXNrcyBmcm9tIHByZXZpb3VzIGJ1aWxkcyB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZSBnZW5lcmF0ZWQgZnJvbSB0aGUgc2FtZSBpbnB1dHMgYXMgdXNlZCBpbiB0aGUgcHJlYnVpbHQgdGFzay4gQW55IG9mIHRoZW0gY291bGQgYmUgdGhlIHRhc2sgdGhhdCBnZW5lcmF0ZWQgdGhlIG91dHB1dCB0aGlzIHByZWJ1aWx0IHRhc2sgaXMgcmV1c2luZyI+PC9pPjwvYT4KKyAgICAgICAgeyUgZWxpZiBtYXRjaGluZ190YXNrcyAlfQorICAgICAgICAgICAgPGgzIGNsYXNzPSJkZXRhaWxzIj5QcmVidWlsdCB0YXNrIGNvdWxkIGJlIGJhc2VkIG9uCisgICAgICAgICAgICAgICAgPGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCBoZWFkaW5nLWhlbHAiIHRpdGxlPSJUaGlzIHRhYmxlIHNob3dzIGEgbGlzdCBvZiB0YXNrcyBmcm9tIHByZXZpb3VzIGJ1aWxkcyB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZSBnZW5lcmF0ZWQgZnJvbSB0aGUgc2FtZSBpbnB1dHMgYXMgdXNlZCBpbiB0aGUgcHJlYnVpbHQgdGFzay4gQW55IG9mIHRoZW0gY291bGQgYmUgdGhlIHRhc2sgdGhhdCBnZW5lcmF0ZWQgdGhlIG91dHB1dCB0aGlzIHByZWJ1aWx0IHRhc2sgaXMgcmV1c2luZyI+PC9pPgorICAgICAgICAgICAgPC9oMz4KKyAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0idGFibGUgdGFibGUtYm9yZGVyZWQgdGFibGUtaG92ZXIiPgorICAgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICAgICAgPHRoPgorICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCIgdGl0bGU9IlRoZSBuYW1lIG9mIHRoZSByZWNpcGUgdG8gd2hpY2ggZWFjaCB0YXNrIGFwcGxpZXMiPjwvaT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFJlY2lwZQorICAgICAgICAgICAgICAgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICA8dGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iaWNvbi1xdWVzdGlvbi1zaWduIGdldC1oZWxwIiB0aXRsZT0iVGhlIG5hbWUgb2YgdGhlIHRhc2siPjwvaT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRhc2sKKyAgICAgICAgICAgICAgICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgPHRoPgorICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCIgdGl0bGU9IlRoaXMgdmFsdWUgdGVsbHMgeW91IGlmIGEgdGFzayBoYWQgdG8gcnVuIChleGVjdXRlZCkgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlIHRhc2sgb3V0cHV0LCBvciBpZiB0aGUgb3V0cHV0IHdhcyBwcm92aWRlZCBieSBhbm90aGVyIHRhc2sgYW5kIHRoZXJlZm9yZSB0aGUgdGFzayBkaWRuJ3QgbmVlZCB0byBydW4gKG5vdCBleGVjdXRlZCkiPjwvaT4KKyAgICAgICAgICAgICAgICAgICAgICAgIEV4ZWN1dGVkCisgICAgICAgICAgICAgICAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgIDx0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLXF1ZXN0aW9uLXNpZ24gZ2V0LWhlbHAiIHRpdGxlPSJUaGlzIGNvbHVtbiB0ZWxscyB5b3UgaWYgJ2V4ZWN1dGVkJyB0YXNrcyBzdWNjZWVkZWQgb3IgZmFpbGVkLiBUaGUgY29sdW1uIGFsc28gdGVsbHMgeW91IHdoeSAnbm90IGV4ZWN1dGVkJyB0YXNrcyBkaWQgbm90IG5lZWQgdG8gcnVuIj48L2k+CisgICAgICAgICAgICAgICAgICAgICAgICBPdXRjb21lCisgICAgICAgICAgICAgICAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgIDx0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLXF1ZXN0aW9uLXNpZ24gZ2V0LWhlbHAiIHRpdGxlPSJUaGUgZGF0ZSBhbmQgdGltZSB0aGUgYnVpbGQgZmluaXNoZWQiPjwvaT4KKyAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkIGNvbXBsZXRlZCBvbgorICAgICAgICAgICAgICAgICAgICA8L3RoPgorICAgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgICAgICB7JSBmb3IgbWF0Y2ggaW4gbWF0Y2hpbmdfdGFza3MgJX0KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ciB7eyBtYXRjaHx0YXNrX2NvbG9yIH19PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0ieyV1cmwgInRhc2siIG1hdGNoLmJ1aWxkLnBrIG1hdGNoLnBrJX0iPnt7bWF0Y2gucmVjaXBlLm5hbWV9fTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0ieyV1cmwgInRhc2siIG1hdGNoLmJ1aWxkLnBrIG1hdGNoLnBrJX0iPnt7bWF0Y2gudGFza19uYW1lfX08L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHslIGlmIHRhc2suZ2V0X2Rlc2NyaXB0aW9uICV9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iaWNvbi1xdWVzdGlvbi1zaWduIGdldC1oZWxwIGhvdmVyLWhlbHAiIHRpdGxlPSJ7e3Rhc2suZ2V0X2Rlc2NyaXB0aW9ufX0iPjwvaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyUgZW5kaWYgJX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0ieyV1cmwgInRhc2siIG1hdGNoLmJ1aWxkLnBrIG1hdGNoLnBrJX0iPnt7bWF0Y2guZ2V0X2V4ZWN1dGVkX2Rpc3BsYXl9fTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0ieyV1cmwgInRhc2siIG1hdGNoLmJ1aWxkLnBrIG1hdGNoLnBrJX0iPnt7bWF0Y2guZ2V0X291dGNvbWVfZGlzcGxheX19IDwvYT48aSBjbGFzcz0iaWNvbi1xdWVzdGlvbi1zaWduIGdldC1oZWxwIGhvdmVyLWhlbHAiIHRpdGxlPSJ7e21hdGNoLmdldF9vdXRjb21lX2hlbHB9fSI+PC9pPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJ7JXVybCAidGFzayIgbWF0Y2guYnVpbGQucGsgbWF0Y2gucGslfSI+e3ttYXRjaC5idWlsZC5jb21wbGV0ZWRfb258ZGF0ZToiZC9tL3kgSDppIn19PC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgICB7JSBlbmRmb3IgJX0KKyAgICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgeyUgZWxzZSAlfQorICAgICAgICAgICAgPHAgY2xhc3M9ImFsZXJ0Ij4KKyAgICAgICAgICAgICAgICA8c3Ryb25nPiBXZSBoYXZlIGZvdW5kIG5vIHRhc2tzIG1hdGNoaW5nIHRoaXMgcHJlYnVpbHQgdGFzazwvc3Ryb25nPjxici8+CisgICAgICAgICAgICAgICAgVGhlIHRhc2sgeW91IGFyZSBsb29raW5nIGZvciBjb3VsZCBiZWxvbmcgdG8gYSBidWlsZCBmb3Igd2hpY2ggVG9hc3RlciBoYXMgbm8gZGF0YS4KKyAgICAgICAgICAgIDwvcD4KKyAgICAgICAgeyUgZW5kaWYgJX0KKyAgICB7JSBlbGlmIHRhc2sub3V0Y29tZSA9PSB0YXNrLk9VVENPTUVfQ09WRVJFRCAlfQorICAgICAgICA8ZGwgY2xhc3M9ImRsLWhvcml6b250YWwiPgorICAgICAgICAgICAgPGR0PgorICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLXF1ZXN0aW9uLXNpZ24gZ2V0LWhlbHAiIHRpdGxlPSJUaGUgdGFzayhzKSBwcm92aWRpbmcgdGhlIG91dGNvbWUgb2YgdGhpcyB0YXNrIj48L2k+IFRhc2sgY292ZXJlZCBieQorICAgICAgICAgICAgPC9kdD4KKyAgICAgICAgICAgIDxkZD4KKyAgICAgICAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICB7JSBmb3IgdCBpbiBjb3ZlcmVkX2J5ICV9CisgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJ7JXVybCAndGFzaycgdC5idWlsZC5wayB0LnBrJX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9InRhc2staW5mbyIKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPSJ7e3QuZ2V0X2V4ZWN1dGVkX2Rpc3BsYXl9fSB8IHt7dC5nZXRfb3V0Y29tZV9kaXNwbGF5fX0iPgorICAgICAgICAgICAgICAgICAgICAgICAge3t0LnJlY2lwZS5uYW1lfX1fe3t0LnJlY2lwZS52ZXJzaW9ufX0KKyAgICAgICAgICAgICAgICAgICAgICAgIHt7dC50YXNrX25hbWV9fQorICAgICAgICAgICAgICAgICAgICAgIDwvYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgIHslIGVuZGZvciAlfQorICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgICAgICA8L2RkPgorICAgICAgICA8L2RsPgorICAgIHslZWxpZiB0YXNrLm91dGNvbWUgPT0gdGFzay5PVVRDT01FX0NBQ0hFRCV9CisgICAgICAgICAgICB7JSBmb3IgdCBpbiB0YXNrLmdldF9yZWxhdGVkX3NldHNjZW5lICV9CisgICAgICAgICAgICAgICAgeyUgaWYgZm9ybG9vcC5sYXN0ICV9CisgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJidG4gYnRuLWxhcmdlIiBocmVmPSJ7JSB1cmwgJ2J1aWxkX2FydGlmYWN0JyBidWlsZC5pZCAidGFza2xvZ2ZpbGUiIHQucGsgJX0iIHN0eWxlPSJtYXJnaW46MTVweDsiPkRvd25sb2FkIHRhc2sgbG9nPC9hPgorICAgICAgICAgICAgICAgIHslIGVuZGlmICV9CisgICAgICAgICAgICB7JSBlbmRmb3IgJX0KKworICAgIHslZWxpZiB0YXNrLm91dGNvbWUgPT0gdGFzay5PVVRDT01FX0VNUFRZJX0KKyAgICAgICAgPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtaW5mbyBkZXRhaWxzIj4KKyAgICAgICAgICAgIFRoaXMgdGFzayBpcyBlbXB0eSBiZWNhdXNlIGl0IGhhcyB0aGUgPGNvZGU+bm9leGVjPC9jb2RlPiBmbGFnIHNldCB0byA8Y29kZT4xPC9jb2RlPiwgb3IgdGhlIHRhc2sgZnVuY3Rpb24gaXMgZW1wdHkKKyAgICAgICAgPC9kaXY+CisgICAgeyUgZW5kaWYgJX0KK3slIGVuZGlmICV9CisKK3sjIEV4ZWN1dGlvbiBzZWN0aW9uICN9CisgICAgeyUgaWYgdGFzay50YXNrX2V4ZWN1dGVkICV9CisgICAgPGgyPgorICAgICAgICBFeGVjdXRlZAorICAgICAgICA8aSBjbGFzcz0iaWNvbi1xdWVzdGlvbi1zaWduIGdldC1oZWxwIGhlYWRpbmctaGVscCIgdGl0bGU9IidFeGVjdXRlZCcgdGFza3MgYXJlIHRob3NlIHRoYXQgbmVlZCB0byBydW4gaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlIHRhc2sgb3V0cHV0Ij48L2k+CisgICAgeyUgZWxzZSAlfQorICAgIDxoMiBjbGFzcz0ibXV0ZWQiPgorICAgICAgICBOb3QgRXhlY3V0ZWQKKyAgICAgICAgPGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCBoZWFkaW5nLWhlbHAiIHRpdGxlPSInTm90IGV4ZWN1dGVkJyB0YXNrcyBkb24ndCBuZWVkIHRvIHJ1biBiZWNhdXNlIHRoZWlyIG91dGNvbWUgaXMgcHJvdmlkZWQgYnkgYW5vdGhlciB0YXNrIj48L2k+CisgICAgeyUgZW5kaWYgJX0KKyAgICA8L2gyPgorCis8ZGwgY2xhc3M9ImRsLWhvcml6b250YWwiPgorICAgIDxkdD4KKyAgICAgICAgPGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCIgdGl0bGU9IlRvIG1ha2UgYnVpbGRzIG1vcmUgZWZmaWNpZW50LCB0aGUgYnVpbGQgc3lzdGVtIGRldGVjdHMgY2hhbmdlcyBpbiB0aGUgJ2lucHV0cycgdG8gYSBnaXZlbiB0YXNrIGJ5IGNyZWF0aW5nIGEgJ3Rhc2sgc2lnbmF0dXJlJy4gSWYgdGhlIHNpZ25hdHVyZSBjaGFuZ2VzLCB0aGUgYnVpbGQgc3lzdGVtIGFzc3VtZXMgdGhlIGlucHV0cyBoYXZlIGNoYW5nZWQgYW5kIHRoZSB0YXNrIG5lZWRzIHRvIGJlIHJlcnVuIj48L2k+CisgICAgICAgIFRhc2sgaW5wdXRzIHNpZ25hdHVyZQorICAgIDwvZHQ+CisgICAgPGRkPgorICAgICAgICB7e3Rhc2suc3N0YXRlX2NoZWNrc3VtfX0KKyAgICA8L2RkPgorPC9kbD4KKyAgICB7JSBpZiB0YXNrLnNzdGF0ZV9yZXN1bHQgIT0gdGFzay5TU1RBVEVfTkEgJX0KKyAgICAgICAgPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtaW5mbyI+QXR0ZW1wdGluZyB0byByZXN0b3JlIG91dHB1dCBmcm9tIHNzdGF0ZSBjYWNoZQorICAgICAgICAgICAgPGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCBnZXQtaGVscC1ibHVlIiB0aXRsZT0iVGhlIGJ1aWxkIHN5c3RlbSBpcyBzZWFyY2hpbmcgZm9yIHRoZSB0YXNrIG91dHB1dCBpbiB5b3VyIDxjb2RlPnNzdGF0ZS1jYWNoZTwvY29kZT4gZGlyZWN0b3J5IGFuZCBtaXJyb3JzLiBJZiB0aGUgYnVpbGQgc3lzdGVtIGZpbmRzIHRoZSB0YXNrIG91dHB1dCwgaXQgd2lsbCByZXVzZSBpdCBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGl0IGZyb20gc2NyYXRjaCBieSBydW5uaW5nIHRoZSByZWFsIHRhc2suIFJldXNpbmcgdGhlIHRhc2sgb3V0cHV0IG1ha2VzIHRoZSBidWlsZCBmYXN0ZXIiPjwvaT4KKyAgICAgICAgPC9kaXY+CisgICAgICAgIDxkbCBjbGFzcz0iZGwtaG9yaXpvbnRhbCI+CisgICAgICAgICAgICA8ZHQ+CisgICAgICAgICAgICAgICAgPGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCIgdGl0bGU9IlRoZSBuYW1lIG9mIHRoZSBmaWxlIHNlYXJjaGVkIGZvciBpbiB5b3VyIDxjb2RlPnNzdGF0ZS1jYWNoZTwvY29kZT4gZGlyZWN0b3J5IGFuZCBtaXJyb3JzIj48L2k+CisgICAgICAgICAgICAgICAgRmlsZSBzZWFyY2hlZCBmb3IKKyAgICAgICAgICAgIDwvZHQ+CisgICAgICAgICAgICA8ZGQ+PGNvZGU+e3t0YXNrLnBhdGhfdG9fc3N0YXRlX29ian19PC9jb2RlPjwvZGQ+CisgICAgICAgICAgICA8ZHQ+CisgICAgICAgICAgICAgICAgPGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCIgdGl0bGU9IlRoZSBsb2NhdGlvbnMgc2VhcmNoZWQgZm9yIHRoZSBhYm92ZSBmaWxlIChpLmUuIHlvdXIgPGNvZGU+c3N0YXRlLWNhY2hlPC9jb2RlPiBkaXJlY3RvcnkgYW5kIGFueSBtaXJyb3JzIHlvdSBoYXZlIHNldCB1cCkiPjwvaT4KKyAgICAgICAgICAgICAgICBVUkkocykgc2VhcmNoZWQKKyAgICAgICAgICAgIDwvZHQ+CisgICAgICAgICAgICA8ZGQ+PHVsPnslIGZvciB1cmkgaW4gdXJpX2xpc3QgJX08bGk+PGNvZGU+e3t1cml9fTwvY29kZT48L2xpPnslIGVuZGZvciAlfTwvdWw+PC9kZD4KKyAgICAgICAgPC9kbD4KKyAgICB7JSBlbmRpZiAlfQorICAgIHslIGlmIHRhc2suc3N0YXRlX3Jlc3VsdCA9PSB0YXNrLlNTVEFURV9NSVNTICV9CisgICAgICAgIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LWluZm8iPgorICAgICAgICAgICAgPHN0cm9uZz5GaWxlIG5vdCBpbiBzc3RhdGUgY2FjaGUuPC9zdHJvbmc+IFJ1bm5pbmcgdGhlIHJlYWwgdGFzayBpbnN0ZWFkLgorICAgICAgICA8L2Rpdj4KKyAgICB7JSBlbGlmIHRhc2suc3N0YXRlX3Jlc3VsdCA9PSB0YXNrLlNTVEFURV9GQUlMRUQlfQorICAgICAgICA8ZGl2IGNsYXNzPSJhbGVydCI+CisgICAgICAgICAgICA8c3Ryb25nPkZhaWxlZDwvc3Ryb25nPiB0byByZXN0b3JlIG91dHB1dCBmcm9tIHNzdGF0ZSBjYWNoZS4gVGhlIGZpbGUgd2FzIGZvdW5kIGJ1dCBjb3VsZCBub3QgYmUgdW5wYWNrZWQuCisgICAgICAgIDwvZGl2PgorICAgICAgICA8ZGwgY2xhc3M9ImRsLWhvcml6b250YWwiPgorICAgICAgICAgICAgPGEgaHJlZj0ieyUgdXJsICdidWlsZF9hcnRpZmFjdCcgYnVpbGQuaWQgInRhc2tsb2dmaWxlIiB0YXNrLnBrICV9IiBzdHlsZT0ibWFyZ2luOjE1cHg7Ij5Eb3dubG9hZCBsb2c8L2E+CisgICAgICAgIDwvZGw+CisgICAgICAgIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LWluZm8iPgorICAgICAgICAgICAgUnVubmluZyB0aGUgcmVhbCB0YXNrIGluc3RlYWQuCisgICAgICAgIDwvZGl2PgorICAgIHslIGVsaWYgdGFzay5zc3RhdGVfcmVzdWx0ID09IHRhc2suU1NUQVRFX1JFU1RPUkVEICV9CisgICAgICAgIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LWluZm8iPgorICAgICAgICAgICAgT3V0cHV0IDxzdHJvbmc+c3VjY2Vzc2Z1bGx5IHJlc3RvcmVkPC9zdHJvbmc+IGZyb20gc3N0YXRlIGNhY2hlLgorICAgICAgICA8L2Rpdj4KKyAgICB7JSBlbmRpZiAlfQorICAgIDxkbCBjbGFzcz0iZGwtaG9yaXpvbnRhbCI+CisgICAgPGR0PgorICAgICAgICA8aSBjbGFzcz0iaWNvbi1xdWVzdGlvbi1zaWduIGdldC1oZWxwIiB0aXRsZT0iVGhlIHJ1bm5pbmcgc2VxdWVuY2Ugb2YgZWFjaCB0YXNrIGluIHRoZSBidWlsZCI+PC9pPgorICAgICAgICBUYXNrIG9yZGVyCisgICAgPC9kdD4KKyAgICA8ZGQ+PGEgaHJlZj0ieyV1cmwgInRhc2tzX3Rhc2siIGJ1aWxkLnBrIHRhc2sub3JkZXIgJX0je3t0YXNrLm9yZGVyfX0iPnt7dGFzay5vcmRlcn19PC9hPjwvZGQ+CisgICAgeyUgaWYgdGFzay50YXNrX2V4ZWN1dGVkICV9CisgICAgICAgIDxkdD4KKyAgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLXF1ZXN0aW9uLXNpZ24gZ2V0LWhlbHAiIHRpdGxlPSJJbmRpY2F0ZXMgaWYgdGhpcyB0YXNrIGV4ZWN1dGVzIGEgUHl0aG9uIG9yIFNoZWxsIGZ1bmN0aW9uKHMpIj48L2k+CisgICAgICAgICAgICBUYXNrIHNjcmlwdCB0eXBlCisgICAgICAgIDwvZHQ+CisgICAgICAgIDxkZD57e3Rhc2suZ2V0X3NjcmlwdF90eXBlX2Rpc3BsYXl9fTwvZGQ+CisgICAgeyUgZW5kaWYgJX0KKzwhLS0KKyAgICA8ZHQ+CisgICAgICAgIDxpIGNsYXNzPSJpY29uLXF1ZXN0aW9uLXNpZ24gZ2V0LWhlbHAiIHRpdGxlPSJUaGUgY29kZSBleGVjdXRlZCBieSB0aGUgdGFzayI+PC9pPgorICAgICAgICBUYXNrIGV4ZWN1dGFibGUgb3V0cHV0CisgICAgPC9kdD4KKyAgICA8ZGQ+PGNvZGU+e3t0YXNrLnNvdXJjZV91cmx9fTwvY29kZT48L2RkPgorLS0+CisgICAgPGR0PgorICAgICAgICA8aSBjbGFzcz0iaWNvbi1xdWVzdGlvbi1zaWduIGdldC1oZWxwIiB0aXRsZT0iVGFzayBkZXBlbmRlbmN5IGNoYWluIChpLmUuIG90aGVyIHRhc2tzKSI+PC9pPgorICAgICAgICBEZXBlbmRlbmNpZXMKKyAgICA8L2R0PgorICAgIDxkZD4KKyAgICAgICAgPHVsPgorICAgICAgICAgICAgeyUgZm9yIGRlcCBpbiBkZXBzICV9CisgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9InsldXJsICd0YXNrJyBkZXAuYnVpbGQucGsgZGVwLnBrJX0iIGNsYXNzPSJ0YXNrLWluZm8iIHRpdGxlPSJ7e2RlcC5nZXRfZXhlY3V0ZWRfZGlzcGxheX19IHwge3tkZXAuZ2V0X291dGNvbWVfZGlzcGxheX19Ij57e2RlcC5yZWNpcGUubmFtZX19X3t7ZGVwLnJlY2lwZS52ZXJzaW9ufX0gPHNwYW4gY2xhc3M9InRhc2stbmFtZSI+e3tkZXAudGFza19uYW1lfX08L3NwYW4+PC9hPjwvbGk+CisgICAgICAgICAgICB7JSBlbXB0eSAlfQorICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibXV0ZWQiPlRoaXMgdGFzayBoYXMgbm8gZGVwZW5kZW5jaWVzPC9saT4KKyAgICAgICAgICAgIHslIGVuZGZvciAlfQorICAgICAgICA8L3VsPgorICAgIDwvZGQ+CisgICAgPGR0PgorICAgICAgICA8aSBjbGFzcz0iaWNvbi1xdWVzdGlvbi1zaWduIGdldC1oZWxwIiB0aXRsZT0iVGFza3MgdGhhdCBkZXBlbmQgb24gdGhpcyB0YXNrIj48L2k+CisgICAgICAgIFJldmVyc2UgZGVwZW5kZW5jaWVzCisgICAgPC9kdD4KKyAgICA8ZGQ+CisgICAgICAgIDx1bD4KKyAgICAgICAgICAgIHslIGZvciBkZXAgaW4gcmRlcHMgJX0KKyAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0ieyV1cmwgJ3Rhc2snIGRlcC5idWlsZC5wayBkZXAucGslfSIgY2xhc3M9InRhc2staW5mbyIgdGl0bGU9Int7ZGVwLmdldF9leGVjdXRlZF9kaXNwbGF5fX0gfCB7e2RlcC5nZXRfb3V0Y29tZV9kaXNwbGF5fX0iPnt7ZGVwLnJlY2lwZS5uYW1lfX1fe3tkZXAucmVjaXBlLnZlcnNpb259fSA8c3BhbiBjbGFzcz0idGFzay1uYW1lIj57e2RlcC50YXNrX25hbWV9fTwvc3Bhbj48L2E+PC9saT4KKyAgICAgICAgICAgIHslIGVtcHR5ICV9CisgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtdXRlZCI+VGhpcyB0YXNrIGhhcyBubyByZXZlcnNlIGRlcGVuZGVuY2llczwvbGk+CisgICAgICAgICAgICB7JSBlbmRmb3IgJX0KKyAgICAgICAgPC91bD4KKzwvZGw+CisKK3sjIFBlcmZvcm1hbmNlIHNlY3Rpb24gLSBzaG93biBvbmx5IGZvciBleGVjdXRlZCB0YXNrcyAjfQoreyVpZiB0YXNrLmVsYXBzZWRfdGltZSBvciB0YXNrLmNwdV91c2FnZSBvciB0YXNrLmRpc2tfaW8gJX0KKyAgICA8aDIgY2xhc3M9ImRldGFpbHMiPlBlcmZvcm1hbmNlPC9oMj4KK3slIGVuZGlmICV9CisgICAgPGRsIGNsYXNzPSJkbC1ob3Jpem9udGFsIj4KKyAgICAgICAgeyUgaWYgdGFzay5lbGFwc2VkX3RpbWUgJX0KKyAgICAgICAgPGR0PgorICAgICAgICAgICAgPGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCIgdGl0bGU9IkhvdyBsb25nIGl0IHRvb2sgdGhlIHRhc2sgdG8gZmluaXNoIGluIHNlY29uZHMiPjwvaT4KKyAgICAgICAgICAgIFRpbWUgKHNlY3MpCisgICAgICAgIDwvZHQ+CisgICAgICAgIDxkZD57e3Rhc2suZWxhcHNlZF90aW1lfGZvcm1hdF9ub25lX2FuZF96ZXJvfGZsb2F0Zm9ybWF0OjJ9fTwvZGQ+CisgICAgICAgIHslIGVuZGlmICV9CisgICAgICAgIHslIGlmIHRhc2suY3B1X3VzYWdlID4gMCAlfQorICAgICAgICA8ZHQ+CisgICAgICAgICAgICA8aSBjbGFzcz0iaWNvbi1xdWVzdGlvbi1zaWduIGdldC1oZWxwIiB0aXRsZT0iVGhlIHBlcmNlbnRhZ2Ugb2YgdGFzayBDUFUgdXRpbGl6YXRpb24iPjwvaT4KKyAgICAgICAgICAgIENQVSB1c2FnZQorICAgICAgICA8L2R0PgorICAgICAgICA8ZGQ+e3t0YXNrLmNwdV91c2FnZXxmb3JtYXRfbm9uZV9hbmRfemVyb3xmbG9hdGZvcm1hdDoyfX0lPC9kZD4KKyAgICAgICAgeyUgZW5kaWYgJX0KKyAgICAgICAgeyUgaWYgdGFzay5kaXNrX2lvID4gMCAlfQorICAgICAgICA8ZHQ+CisgICAgICAgICAgICA8aSBjbGFzcz0iaWNvbi1xdWVzdGlvbi1zaWduIGdldC1oZWxwIiB0aXRsZT0iTnVtYmVyIG9mIG1pbGlzZWNvbmRzIHRoZSB0YXNrIHNwZW50IGRvaW5nIGRpc2sgaW5wdXQgYW5kIG91dHB1dCI+PC9pPgorICAgICAgICAgICAgRGlzayBJL08gKG1zKQorICAgICAgICA8L2R0PgorICAgICAgICA8ZGQ+e3t0YXNrLmRpc2tfaW98Zm9ybWF0X25vbmVfYW5kX3plcm99fTwvZGQ+CisgICAgICAgIHslIGVuZGlmICV9CisgICAgPC9kbD4KKworPC9kaXY+Cit7JSBlbmRibG9jayAlfQorCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL3Rhc2tzLmh0bWwgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL3Rhc2tzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE4YjVjNwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvdGFza3MuaHRtbApAQCAtMCwwICsxLDEzNiBAQAoreyUgZXh0ZW5kcyAiYmFzZWJ1aWxkcGFnZS5odG1sIiAlfQoreyUgbG9hZCBwcm9qZWN0dGFncyAlfQorCit7JSBibG9jayBsb2NhbGJyZWFkY3J1bWIgJX0KKzxsaT57e3RpdGxlfX08L2xpPgoreyUgZW5kYmxvY2sgJX0KKworeyUgYmxvY2sgbmF2LXRhc2tzICV9CisgIHslIGlmICdUYXNrcycgPT0gdGl0bGUgJX0KKyAgICA8bGkgY2xhc3M9ImFjdGl2ZSI+PGEgaHJlZj0ieyUgdXJsICd0YXNrcycgYnVpbGQucGsgJX0iPlRhc2tzPC9hPjwvbGk+CisgIHslIGVsc2UgJX0KKyAgICA8bGk+PGEgaHJlZj0ieyUgdXJsICd0YXNrcycgYnVpbGQucGsgJX0iPlRhc2tzPC9hPjwvbGk+CisgIHslIGVuZGlmICV9Cit7JSBlbmRibG9jayAlfQoreyUgYmxvY2sgbmF2LWJ1aWxkdGltZSAlfQorICB7JSBpZiAnVGltZScgPT0gdGl0bGUgJX0KKyAgICA8bGkgY2xhc3M9ImFjdGl2ZSI+PGEgaHJlZj0ieyUgdXJsICdidWlsZHRpbWUnIGJ1aWxkLnBrICV9Ij5UaW1lPC9hPjwvbGk+CisgIHslIGVsc2UgJX0KKyAgICA8bGk+PGEgaHJlZj0ieyUgdXJsICdidWlsZHRpbWUnIGJ1aWxkLnBrICV9Ij5UaW1lPC9hPjwvbGk+CisgIHslIGVuZGlmICV9Cit7JSBlbmRibG9jayAlfQoreyUgYmxvY2sgbmF2LWNwdXVzYWdlICV9CisgIHslIGlmICdDUFUgdXNhZ2UnID09IHRpdGxlICV9CisgICAgPGxpIGNsYXNzPSJhY3RpdmUiPjxhIGhyZWY9InslIHVybCAnY3B1dXNhZ2UnIGJ1aWxkLnBrICV9Ij5DUFUgdXNhZ2U8L2E+PC9saT4KKyAgeyUgZWxzZSAlfQorICAgIDxsaT48YSBocmVmPSJ7JSB1cmwgJ2NwdXVzYWdlJyBidWlsZC5wayAlfSI+Q1BVIHVzYWdlPC9hPjwvbGk+CisgIHslIGVuZGlmICV9Cit7JSBlbmRibG9jayAlfQoreyUgYmxvY2sgbmF2LWRpc2tpbyAlfQorICB7JSBpZiAnRGlzayBJL08nID09IHRpdGxlICV9CisgICAgPGxpIGNsYXNzPSJhY3RpdmUiPjxhIGhyZWY9InslIHVybCAnZGlza2lvJyBidWlsZC5wayAlfSI+RGlzayBJL088L2E+PC9saT4KKyAgeyUgZWxzZSAlfQorICAgIDxsaT48YSBocmVmPSJ7JSB1cmwgJ2Rpc2tpbycgYnVpbGQucGsgJX0iPkRpc2sgSS9PPC9hPjwvbGk+CisgIHslIGVuZGlmICV9Cit7JSBlbmRibG9jayAlfQorCit7JSBibG9jayBidWlsZGluZm9tYWluICV9Cis8ZGl2IGNsYXNzPSJzcGFuMTAiPgoreyUgaWYgbm90IHJlcXVlc3QuR0VULmZpbHRlciBhbmQgbm90IHJlcXVlc3QuR0VULnNlYXJjaCBhbmQgbm90IG9iamVjdHMucGFnaW5hdG9yLmNvdW50ICV9CisgIDwhLS0gRW1wdHkgLSBubyBkYXRhIGluIGRhdGFiYXNlIC0tPgorICA8ZGl2IGNsYXNzPSJwYWdlLWhlYWRlciI+CisgIDxoMT57e3RpdGxlfX08L2gxPgorICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtaW5mbyBsZWFkIj4KKyAgTm8gZGF0YSB3YXMgcmVjb3JkZWQgZm9yIHRoaXMgYnVpbGQuCisgIDwvZGl2PgorCit7JSBlbHNlICV9CisKKyAgPGRpdiBjbGFzcz0icGFnZS1oZWFkZXIiPgorICA8aDE+CisgIHslIGlmICByZXF1ZXN0LkdFVC5maWx0ZXIgYW5kIG9iamVjdHMucGFnaW5hdG9yLmNvdW50ID4gIDAgb3IgcmVxdWVzdC5HRVQuc2VhcmNoIGFuZCBvYmplY3RzLnBhZ2luYXRvci5jb3VudCA+ICAwICV9CisgICAgICB7e29iamVjdHMucGFnaW5hdG9yLmNvdW50fX0gdGFza3t7b2JqZWN0cy5wYWdpbmF0b3IuY291bnR8cGx1cmFsaXplfX0gZm91bmQKKyAgeyVlbGlmIHJlcXVlc3QuR0VULmZpbHRlciBhbmQgb2JqZWN0cy5wYWdpbmF0b3IuY291bnQgPT0gMCBvciByZXF1ZXN0LkdFVC5zZWFyY2ggYW5kIG9iamVjdHMucGFnaW5hdG9yLmNvdW50ID09IDAgJX0KKyAgICAgIE5vIHRhc2tzIGZvdW5kCisgIHslZWxzZSV9CisgICAgICB7e3RpdGxlfX0KKyAgeyVlbmRpZiV9CisgIDwvaDE+CisgIDwvZGl2PgorCisgIHslIGlmIG9iamVjdHMucGFnaW5hdG9yLmNvdW50ID09IDAgJX0KKyAgPGRpdiBjbGFzcz0icm93LWZsdWlkIj4KKyAgICAgIDxkaXYgY2xhc3M9ImFsZXJ0Ij4KKyAgICAgICAgPGZvcm0gY2xhc3M9Im5vLXJlc3VsdHMgaW5wdXQtYXBwZW5kIiBpZD0ic2VhcmNoZm9ybSI+CisgICAgICAgICAgICA8aW5wdXQgaWQ9InNlYXJjaCIgbmFtZT0ic2VhcmNoIiBjbGFzcz0iaW5wdXQteHhsYXJnZSIgdHlwZT0idGV4dCIgdmFsdWU9Int7cmVxdWVzdC5HRVQuc2VhcmNofX0iLz57JSBpZiByZXF1ZXN0LkdFVC5zZWFyY2ggJX08YSBocmVmPSJqYXZhc2NyaXB0OiQoJyNzZWFyY2gnKS52YWwoJycpO3NlYXJjaGZvcm0uc3VibWl0KCkiIGNsYXNzPSJhZGQtb24gYnRuIiB0YWJpbmRleD0iLTEiPjxpIGNsYXNzPSJpY29uLXJlbW92ZSI+PC9pPjwvYT57JSBlbmRpZiAlfQorICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJTZWFyY2giPlNlYXJjaDwvYnV0dG9uPgorICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1saW5rIiBvbmNsaWNrPSJqYXZhc2NyaXB0OiQoJyNzZWFyY2gnKS52YWwoJycpO3NlYXJjaGZvcm0uc3VibWl0KCkiPlNob3cgYWxsIHRhc2tzPC9idXR0b24+CisgICAgICAgIDwvZm9ybT4KKyAgICAgIDwvZGl2PgorICA8L2Rpdj4KKworCisgIHslIGVsc2UgJX0KKyAgeyUgaW5jbHVkZSAiYmFzZXRhYmxlX3RvcC5odG1sIiAlfQorCisgICAgeyUgZm9yIHRhc2sgaW4gb2JqZWN0cyAlfQorICAgICAgICA8dHIge3sgdGFza3x0YXNrX2NvbG9yIH19IGlkPSJ7e3Rhc2sub3JkZXJ9fSI+CisgICAgICAgICAgICA8dGQgY2xhc3M9Im9yZGVyIj4KKyAgICAgICAgICAgICAgICA8YSBocmVmPSJ7JXVybCAidGFzayIgYnVpbGQucGsgdGFzay5wayV9Ij57e3Rhc2sub3JkZXJ9fTwvYT4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICA8dGQgY2xhc3M9InJlY2lwZV9uYW1lIiA+CisgICAgICAgICAgICAgICAgPGEgaHJlZj0ieyUgdXJsICJyZWNpcGUiIGJ1aWxkLnBrIHRhc2sucmVjaXBlLnBrICV9Ij57e3Rhc2sucmVjaXBlLm5hbWV9fTwvYT4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICA8dGQgY2xhc3M9InJlY2lwZV92ZXJzaW9uIj4KKyAgICAgICAgICAgICAgICA8YSBocmVmPSJ7JSB1cmwgInJlY2lwZSIgYnVpbGQucGsgdGFzay5yZWNpcGUucGsgJX0iPnt7dGFzay5yZWNpcGUudmVyc2lvbn19PC9hPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFza19uYW1lIj4KKyAgICAgICAgICAgICAgICA8YSBocmVmPSJ7JXVybCAidGFzayIgYnVpbGQucGsgdGFzay5wayV9Ij57e3Rhc2sudGFza19uYW1lfX08L2E+IHslIGlmIHRhc2suZ2V0X2Rlc2NyaXB0aW9uICV9PGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBnZXQtaGVscCBob3Zlci1oZWxwIiB0aXRsZT0ie3t0YXNrLmdldF9kZXNjcmlwdGlvbn19Ij48L2k+IHslIGVuZGlmICV9CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgPHRkIGNsYXNzPSJleGVjdXRlZCI+CisgICAgICAgICAgICAgICAgPGEgaHJlZj0ieyV1cmwgInRhc2siIGJ1aWxkLnBrIHRhc2sucGslfSI+e3t0YXNrLmdldF9leGVjdXRlZF9kaXNwbGF5fX08L2E+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgPHRkIGNsYXNzPSJvdXRjb21lIj4KKyAgICAgICAgICAgICAgICA8YSBocmVmPSJ7JXVybCAidGFzayIgYnVpbGQucGsgdGFzay5wayV9Ij57e3Rhc2suZ2V0X291dGNvbWVfZGlzcGxheX19IDwvYT4KKyAgICAgICAgICAgICAgICB7JSBpZiB0YXNrLm91dGNvbWUgPSB0YXNrLk9VVENPTUVfRkFJTEVEICV9CisgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9InslIHVybCAnYnVpbGRfYXJ0aWZhY3QnIGJ1aWxkLnBrICJ0YXNrbG9nZmlsZSIgdGFzay5wayAlfSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iaWNvbi1kb3dubG9hZC1hbHQiIHRpdGxlPSJEb3dubG9hZCB0YXNrIGxvZyBmaWxlIj48L2k+CisgICAgICAgICAgICAgICAgICAgIDwvYT4KKyAgICAgICAgICAgICAgICB7JSBlbmRpZiAlfQorICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLXF1ZXN0aW9uLXNpZ24gZ2V0LWhlbHAgaG92ZXItaGVscCIgdGl0bGU9Int7dGFzay5nZXRfb3V0Y29tZV9oZWxwfX0iPjwvaT4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICA8dGQgY2xhc3M9ImNhY2hlX2F0dGVtcHQiPgorICAgICAgICAgICAgICAgIDxhIGhyZWY9InsldXJsICJ0YXNrIiBidWlsZC5wayB0YXNrLnBrJX0iPnt7dGFzay5nZXRfc3N0YXRlX3Jlc3VsdF9kaXNwbGF5fGZvcm1hdF9ub25lX2FuZF96ZXJvfX08L2E+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgPHRkIGNsYXNzPSJ0aW1lX3Rha2VuIj4KKyAgICAgICAgICAgICAgICB7e3Rhc2suZWxhcHNlZF90aW1lfGZvcm1hdF9ub25lX2FuZF96ZXJvfGZsb2F0Zm9ybWF0OjJ9fQorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgIDx0ZCBjbGFzcz0iY3B1X3VzZWQiPgorICAgICAgICAgICAgICAgIHt7dGFzay5jcHVfdXNhZ2V8Zm9ybWF0X25vbmVfYW5kX3plcm98ZmxvYXRmb3JtYXQ6Mn19eyUgaWYgdGFzay5jcHVfdXNhZ2UgJX0leyUgZW5kaWYgJX0KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICA8dGQgY2xhc3M9ImRpc2tfaW8iPgorICAgICAgICAgICAgICAgIHt7dGFzay5kaXNrX2lvfGZvcm1hdF9ub25lX2FuZF96ZXJvfX0KKyAgICAgICAgICAgIDwvdGQ+CisKKyAgICAgICAgPC90cj4KKyAgICB7JSBlbmRmb3IgJX0KKworICB7JSBpbmNsdWRlICJiYXNldGFibGVfYm90dG9tLmh0bWwiICV9CisgIHslIGVuZGlmICV9IHsjIG9iamVjdHMucGFnaW5hdG9yLmNvdW50ICN9Cit7JSBlbmRpZiAlfSB7IyBlbXB0eSAjfQorPC9kaXY+CisKKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKworICAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgeworICAgICAgICAvLyBlbmFibGUgYmx1ZSBoaWdodGxpZ2h0IGFuaW1hdGlvbiBmb3IgdGhlIG9yZGVyIGxpbmsKKyAgICAgICAgaWYgKGxvY2F0aW9uLmhyZWYuc2VhcmNoKCcjJykgPiAtMSkgeworICAgICAgICAgICAgdmFyIHRhc2tfb3JkZXIgPSBsb2NhdGlvbi5ocmVmLnNwbGl0KCcjJylbMV07CisgICAgICAgICAgICAkKCIjIiArIHRhc2tfb3JkZXIpLmFkZENsYXNzKCJoaWdobGlnaHQiKTsKKyAgICAgICAgfQorICAgIH0pOworCis8L3NjcmlwdD4KKworeyUgZW5kYmxvY2sgJX0KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvdG9hc3RlcnRhYmxlLWZpbHRlci5odG1sIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy90b2FzdGVydGFibGUtZmlsdGVyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M4ZGM0OQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvdG9hc3RlcnRhYmxlLWZpbHRlci5odG1sCkBAIC0wLDAgKzEsMTggQEAKKzwhLS0gZmlsdGVyIG1vZGFsIC0tPgorPGRpdiBpZD0iZmlsdGVyLW1vZGFsLXt7dGFibGVfbmFtZX19IiBjbGFzcz0ibW9kYWwgaGlkZSBmYWRlIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgYXJpYS1oaWRkZW49ImZhbHNlIj4KKyAgPGZvcm0gaWQ9ImZpbHRlci1tb2RhbC1mb3JtLXt7dGFibGVfbmFtZX19IiBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMHB4Ij4KKyAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPgorICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzPSJtb2RhbCIgYXJpYS1oaWRkZW49InRydWUiPng8L2J1dHRvbj4KKyAgICAgIDxoMyBpZD0iZmlsdGVyLW1vZGFsLXRpdGxlLXt7dGFibGVfbmFtZX19Ij4mbmJzcDs8L2gzPgorICAgIDwvZGl2PgorICAgIDxkaXYgY2xhc3M9Im1vZGFsLWJvZHkiPgorICAgICAgPHA+U2hvdzo8L3A+CisgICAgICA8c3BhbiBpZD0iZmlsdGVyLWFjdGlvbnMte3t0YWJsZV9uYW1lfX0iPjwvc3Bhbj4KKyAgICA8L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPgorICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IiB0eXBlPSJzdWJtaXQiPkFwcGx5PC9idXR0b24+CisgICAgPC9kaXY+CisgIDwvZm9ybT4KKzwvZGl2PgorPGJ1dHRvbiBpZD0iY2xlYXItZmlsdGVyLWJ0bi17e3RhYmxlX25hbWV9fSIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PC9idXR0b24+Cis8IS0tIGVuZCBmaWx0ZXIgbW9kYWwgLS0+CmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL3RvYXN0ZXJ0YWJsZS1zaW1wbGUuaHRtbCBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvdG9hc3RlcnRhYmxlLXNpbXBsZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMjMxOGIKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL3RvYXN0ZXJ0YWJsZS1zaW1wbGUuaHRtbApAQCAtMCwwICsxLDk0IEBACisKK3slIGxvYWQgc3RhdGljICV9Cit7JSBsb2FkIHByb2plY3R0YWdzICV9CisKKzxzY3JpcHQgc3JjPSJ7JSBzdGF0aWMgJ2pzL3RhYmxlLmpzJyAlfSI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ieyUgc3RhdGljICdqcy9sYXllckJ0bi5qcycgJX0iPjwvc2NyaXB0PgorPHNjcmlwdD4KKyAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CisgICAgKGZ1bmN0aW9uKCl7CisKKyAgICB2YXIgY3R4ID0geworICAgICAgdGFibGVOYW1lIDogInt7dGFibGVfbmFtZX19IiwKKyAgICAgIHVybCA6ICJ7eyB4aHJfdGFibGVfdXJsIH19P2Zvcm1hdD1qc29uIiwKKyAgICAgIHRpdGxlIDogInt7dGl0bGV9fSIsCisgICAgICBwcm9qZWN0TGF5ZXJzIDoge3twcm9qZWN0bGF5ZXJzfGpzb259fSwKKyAgICB9OworCisgICAgdHJ5IHsKKyAgICAgIHRhYmxlSW5pdChjdHgpOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgIGRvY3VtZW50LndyaXRlKCJQcm9ibGVtIGxvYWRpbmcgdGFibGUgd2lkZ2V0OiAiICsgZSk7CisgICAgfQorICAgIH0pKCk7CisgIH0pOworPC9zY3JpcHQ+CisKK3slIGluY2x1ZGUgJ3RvYXN0ZXJ0YWJsZS1maWx0ZXIuaHRtbCcgJX0KKworPGRpdiBjbGFzcz0icm93LWZsdWlkIiBpZD0ibm8tcmVzdWx0cy17e3RhYmxlX25hbWV9fSIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+CisgIDxkaXYgY2xhc3M9ImFsZXJ0Ij4KKyAgICA8Zm9ybSBjbGFzcz0ibm8tcmVzdWx0cyBpbnB1dC1hcHBlbmQiPgorICAgICAgPGlucHV0IGNsYXNzPSJpbnB1dC14bGFyZ2UiIGlkPSJuZXctc2VhcmNoLWlucHV0LXt7dGFibGVfbmFtZX19IiBuYW1lPSJzZWFyY2giIHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSJTZWFyY2gge3t0aXRsZXxsb3dlcn19IiB2YWx1ZT0ieyUgaWYgcmVxdWVzdC5HRVQuc2VhcmNoICV9e3tyZXF1ZXN0LkdFVC5zZWFyY2h9fXslIGVuZGlmICV9Ii8+CisgICAgICA8YSBocmVmPSIjIiBjbGFzcz0iYWRkLW9uIGJ0biByZW1vdmUtc2VhcmNoLWJ0bi17e3RhYmxlX25hbWV9fSIgdGFiaW5kZXg9Ii0xIj4KKyAgICAgICAgPGkgY2xhc3M9Imljb24tcmVtb3ZlIj48L2k+CisgICAgICA8L2E+CisgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gc2VhcmNoLXN1Ym1pdC17e3RhYmxlX25hbWV9fSIgPlNlYXJjaDwvYnV0dG9uPgorICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1saW5rIHJlbW92ZS1zZWFyY2gtYnRuLXt7dGFibGVfbmFtZX19Ij5TaG93IHt7dGl0bGV8bG93ZXJ9fQorICAgICAgPC9idXR0b24+CisgICAgPC9mb3JtPgorICA8L2Rpdj4KKzwvZGl2PgorPGRpdiBpZD0idGFibGUtY29udGFpbmVyLXt7dGFibGVfbmFtZX19IiBzdHlsZT0idmlzaWJpbGl0eTogaGlkZGVuIj4KKyAgPCEtLSBjb250cm9sIGhlYWRlciAtLT4KKyAgPGRpdiBjbGFzcz0icm93LWZsdWlkIiBpZD0idGFibGUtY2hyb21lLXt7dGFibGVfbmFtZX19Ij4KKyAgICAgIDxkaXYgY2xhc3M9Im5hdmJhci1zZWFyY2ggaW5wdXQtYXBwZW5kIHB1bGwtbGVmdCI+CisKKyAgICAgICAgPGlucHV0IGNsYXNzPSJpbnB1dC14bGFyZ2UiIGlkPSJzZWFyY2gtaW5wdXQte3t0YWJsZV9uYW1lfX0iIG5hbWU9InNlYXJjaCIgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9IlNlYXJjaCB7e3RpdGxlfGxvd2VyfX0iIHZhbHVlPSJ7JSBpZiByZXF1ZXN0LkdFVC5zZWFyY2ggJX17e3JlcXVlc3QuR0VULnNlYXJjaH19eyUgZW5kaWYgJX0iLz4KKyAgICAgICAgPGEgaHJlZj0iIyIgc3R5bGU9ImRpc3BsYXk6bm9uZSIgY2xhc3M9ImFkZC1vbiBidG4gcmVtb3ZlLXNlYXJjaC1idG4te3t0YWJsZV9uYW1lfX0iIHRhYmluZGV4PSItMSI+CisgICAgICAgICAgPGkgY2xhc3M9Imljb24tcmVtb3ZlIj48L2k+CisgICAgICAgIDwvYT4KKyAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIiBpZD0ic2VhcmNoLXN1Ym1pdC17e3RhYmxlX25hbWV9fSIgPlNlYXJjaDwvYnV0dG9uPgorICAgICAgPC9kaXY+CisKKyAgICAgIDxkaXYgY2xhc3M9InB1bGwtcmlnaHQiPgorCisgICAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6aW5saW5lIj4KKyAgICAgICAgICA8c3BhbiBjbGFzcz0iZGl2aWRlci12ZXJ0aWNhbCI+PC9zcGFuPgorICAgICAgICAgIDxzcGFuIGNsYXNzPSJoZWxwLWlubGluZSIgc3R5bGU9InBhZGRpbmctdG9wOjVweDsiPlNob3cgcm93czo8L3NwYW4+CisgICAgICAgICAgPHNlbGVjdCBzdHlsZT0ibWFyZ2luLXRvcDo1cHg7bWFyZ2luLWJvdHRvbTowcHg7IiBjbGFzcz0icGFnZXNpemUte3t0YWJsZV9uYW1lfX0iPgorICAgICAgICAgICAgeyUgd2l0aCAiMTAgMjUgNTAgMTAwIDE1MCIgYXMgbGlzdCV9CisgICAgICAgICAgICB7JSBmb3IgaSBpbiBsaXN0LnNwbGl0ICV9CisgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ7e2l9fSI+e3tpfX08L29wdGlvbj4KKyAgICAgICAgICAgIHslIGVuZGZvciAlfQorICAgICAgICAgICAgeyUgZW5kd2l0aCAlfQorICAgICAgICAgIDwvc2VsZWN0PgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvZGl2PgorICA8L2Rpdj4KKworICA8IS0tIFRoZSBhY3R1YWwgdGFibGUgLS0+CisgIDx0YWJsZSBjbGFzcz0idGFibGUgdGFibGUtYm9yZGVyZWQgdGFibGUtaG92ZXIgdGFibGVzb3J0ZXIiIGlkPSJ7e3RhYmxlX25hbWV9fSI+CisgICAgPHRoZWFkPgorICAgICAgPHRyPjx0aD48L3RoPjwvdHI+CisgICAgPC90aGVhZD4KKyAgICA8dGJvZHk+PC90Ym9keT4KKyAgPC90YWJsZT4KKworICA8IS0tIFBhZ2luYXRpb24gY29udHJvbHMgLS0+CisgIDxkaXYgY2xhc3M9InBhZ2luYXRpb24gcGFnaW5hdGlvbi1jZW50ZXJlZCIgaWQ9InBhZ2luYXRpb24te3t0YWJsZV9uYW1lfX0iPgorICAgIDx1bCBjbGFzcz0icGFnaW5hdGlvbiIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrLWlubGluZSI+CisgICAgPC91bD4KKworICAgIDxkaXYgY2xhc3M9InB1bGwtcmlnaHQiPgorICAgICAgPHNwYW4gY2xhc3M9ImhlbHAtaW5saW5lIiBzdHlsZT0icGFkZGluZy10b3A6NXB4OyI+U2hvdyByb3dzOjwvc3Bhbj4KKyAgICAgIDxzZWxlY3Qgc3R5bGU9Im1hcmdpbi10b3A6NXB4O21hcmdpbi1ib3R0b206MHB4OyIgY2xhc3M9InBhZ2VzaXplLXt7dGFibGVfbmFtZX19Ij4KKyAgICAgICAgeyUgd2l0aCAiMTAgMjUgNTAgMTAwIDE1MCIgYXMgbGlzdCV9CisgICAgICAgIHslIGZvciBpIGluIGxpc3Quc3BsaXQgJX0KKyAgICAgICAgPG9wdGlvbiB2YWx1ZT0ie3tpfX0iPnt7aX19PC9vcHRpb24+CisgICAgICAgIHslIGVuZGZvciAlfQorICAgICAgICB7JSBlbmR3aXRoICV9CisgICAgICA8L3NlbGVjdD4KKyAgICA8L2Rpdj4KKyAgPC9kaXY+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXMvdG9hc3RlcnRhYmxlLmh0bWwgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL3RvYXN0ZXJ0YWJsZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZjRjNmYKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL3RvYXN0ZXJ0YWJsZS5odG1sCkBAIC0wLDAgKzEsMTAzIEBACisKK3slIGxvYWQgc3RhdGljICV9Cit7JSBsb2FkIHByb2plY3R0YWdzICV9CisKKzxzY3JpcHQgc3JjPSJ7JSBzdGF0aWMgJ2pzL3RhYmxlLmpzJyAlfSI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ieyUgc3RhdGljICdqcy9sYXllckJ0bi5qcycgJX0iPjwvc2NyaXB0PgorPHNjcmlwdD4KKyAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CisgICAgKGZ1bmN0aW9uKCl7CisKKyAgICB2YXIgY3R4ID0geworICAgICAgdGFibGVOYW1lIDogInt7dGFibGVfbmFtZX19IiwKKyAgICAgIHVybCA6ICJ7eyB4aHJfdGFibGVfdXJsIH19P2Zvcm1hdD1qc29uIiwKKyAgICAgIHRpdGxlIDogInt7dGl0bGV9fSIsCisgICAgICBwcm9qZWN0TGF5ZXJzIDoge3twcm9qZWN0bGF5ZXJzfGpzb259fSwKKyAgICB9OworCisgICAgdHJ5IHsKKyAgICAgIHRhYmxlSW5pdChjdHgpOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgIGRvY3VtZW50LndyaXRlKCJQcm9ibGVtIGxvYWRpbmcgdGFibGUgd2lkZ2V0OiAiICsgZSk7CisgICAgfQorICAgIH0pKCk7CisgIH0pOworPC9zY3JpcHQ+CisKK3slIGluY2x1ZGUgJ3RvYXN0ZXJ0YWJsZS1maWx0ZXIuaHRtbCcgJX0KKworPGRpdiBjbGFzcz0icm93LWZsdWlkIiBpZD0ibm8tcmVzdWx0cy17e3RhYmxlX25hbWV9fSIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+CisgIDxkaXYgY2xhc3M9ImFsZXJ0Ij4KKyAgICA8Zm9ybSBjbGFzcz0ibm8tcmVzdWx0cyBpbnB1dC1hcHBlbmQiPgorICAgICAgPGlucHV0IGNsYXNzPSJpbnB1dC14eGxhcmdlIiBpZD0ibmV3LXNlYXJjaC1pbnB1dC17e3RhYmxlX25hbWV9fSIgbmFtZT0ic2VhcmNoIiB0eXBlPSJ0ZXh0IiBwbGFjZWhvbGRlcj0iU2VhcmNoIHt7dGl0bGV8bG93ZXJ9fSIgdmFsdWU9InslaWYgcmVxdWVzdC5HRVQuc2VhcmNoICV9e3tyZXF1ZXN0LkdFVC5zZWFyY2h9fXslZW5kaWYlfSIvPgorICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9ImFkZC1vbiBidG4gcmVtb3ZlLXNlYXJjaC1idG4te3t0YWJsZV9uYW1lfX0iIHRhYmluZGV4PSItMSI+CisgICAgICAgIDxpIGNsYXNzPSJpY29uLXJlbW92ZSI+PC9pPgorICAgICAgPC9hPgorICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIHNlYXJjaC1zdWJtaXQte3t0YWJsZV9uYW1lfX0iID5TZWFyY2g8L2J1dHRvbj4KKyAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBidG4tbGluayByZW1vdmUtc2VhcmNoLWJ0bi17e3RhYmxlX25hbWV9fSI+U2hvdyB7e3RpdGxlfGxvd2VyfX0KKyAgICAgIDwvYnV0dG9uPgorICAgIDwvZm9ybT4KKyAgPC9kaXY+Cis8L2Rpdj4KKworPGRpdiBpZD0idGFibGUtY29udGFpbmVyLXt7dGFibGVfbmFtZX19IiBzdHlsZT0idmlzaWJpbGl0eTogaGlkZGVuIj4KKyAgPCEtLSBjb250cm9sIGhlYWRlciAtLT4KKyAgPGRpdiBjbGFzcz0ibmF2YmFyIiBpZD0idGFibGUtY2hyb21lLXt7dGFibGVfbmFtZX19Ij4KKyAgICA8ZGl2IGNsYXNzPSJuYXZiYXItaW5uZXIiPgorICAgICAgPGRpdiBjbGFzcz0ibmF2YmFyLXNlYXJjaCBpbnB1dC1hcHBlbmQgcHVsbC1sZWZ0Ij4KKworICAgICAgICA8aW5wdXQgY2xhc3M9ImlucHV0LXh4bGFyZ2UiIGlkPSJzZWFyY2gtaW5wdXQte3t0YWJsZV9uYW1lfX0iIG5hbWU9InNlYXJjaCIgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9IlNlYXJjaCB7e3RpdGxlfGxvd2VyfX0iIHZhbHVlPSJ7JWlmIHJlcXVlc3QuR0VULnNlYXJjaCV9e3tyZXF1ZXN0LkdFVC5zZWFyY2h9fXslZW5kaWYlfSIvPgorICAgICAgICA8YSBocmVmPSIjIiBzdHlsZT0iZGlzcGxheTpub25lIiBjbGFzcz0iYWRkLW9uIGJ0biByZW1vdmUtc2VhcmNoLWJ0bi17e3RhYmxlX25hbWV9fSIgdGFiaW5kZXg9Ii0xIj4KKyAgICAgICAgICA8aSBjbGFzcz0iaWNvbi1yZW1vdmUiPjwvaT4KKyAgICAgICAgPC9hPgorICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4iIGlkPSJzZWFyY2gtc3VibWl0LXt7dGFibGVfbmFtZX19IiA+U2VhcmNoPC9idXR0b24+CisgICAgICA8L2Rpdj4KKworICAgICAgPGRpdiBjbGFzcz0icHVsbC1yaWdodCI+CisgICAgICAgIDxkaXYgY2xhc3M9ImJ0bi1ncm91cCI+CisgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGRyb3Bkb3duLXRvZ2dsZSIgZGF0YS10b2dnbGU9ImRyb3Bkb3duIj5FZGl0IGNvbHVtbnMKKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjYXJldCI+PC9zcGFuPgorICAgICAgICAgIDwvYnV0dG9uPgorICAgICAgICAgIDx1bCBjbGFzcz0iZHJvcGRvd24tbWVudSBlZGl0Y29sIj4KKyAgICAgICAgICA8L3VsPgorICAgICAgICA8L2Rpdj4KKyAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTppbmxpbmUiPgorICAgICAgICAgIDxzcGFuIGNsYXNzPSJkaXZpZGVyLXZlcnRpY2FsIj48L3NwYW4+CisgICAgICAgICAgPHNwYW4gY2xhc3M9ImhlbHAtaW5saW5lIiBzdHlsZT0icGFkZGluZy10b3A6NXB4OyI+U2hvdyByb3dzOjwvc3Bhbj4KKyAgICAgICAgICA8c2VsZWN0IHN0eWxlPSJtYXJnaW4tdG9wOjVweDttYXJnaW4tYm90dG9tOjBweDsiIGNsYXNzPSJwYWdlc2l6ZS17e3RhYmxlX25hbWV9fSI+CisgICAgICAgICAgICB7JSB3aXRoICIxMCAyNSA1MCAxMDAgMTUwIiBhcyBsaXN0JX0KKyAgICAgICAgICAgIHslIGZvciBpIGluIGxpc3Quc3BsaXQgJX0KKyAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Int7aX19Ij57e2l9fTwvb3B0aW9uPgorICAgICAgICAgICAgeyUgZW5kZm9yICV9CisgICAgICAgICAgICB7JSBlbmR3aXRoICV9CisgICAgICAgICAgPC9zZWxlY3Q+CisgICAgICAgIDwvZGl2PgorICAgICAgPC9kaXY+CisgICAgPC9kaXY+CisgIDwvZGl2PgorCisgIDwhLS0gVGhlIGFjdHVhbCB0YWJsZSAtLT4KKyAgPHRhYmxlIGNsYXNzPSJ0YWJsZSB0YWJsZS1ib3JkZXJlZCB0YWJsZS1ob3ZlciB0YWJsZXNvcnRlciIgaWQ9Int7dGFibGVfbmFtZX19Ij4KKyAgICA8dGhlYWQ+CisgICAgICA8dHI+PHRoPjwvdGg+PC90cj4KKyAgICA8L3RoZWFkPgorICAgIDx0Ym9keT48L3Rib2R5PgorICA8L3RhYmxlPgorCisgIDwhLS0gUGFnaW5hdGlvbiBjb250cm9scyAtLT4KKyAgPGRpdiBjbGFzcz0icGFnaW5hdGlvbiBwYWdpbmF0aW9uLWNlbnRlcmVkIiBpZD0icGFnaW5hdGlvbi17e3RhYmxlX25hbWV9fSI+CisgICAgPHVsIGNsYXNzPSJwYWdpbmF0aW9uIiBzdHlsZT0iZGlzcGxheTogYmxvY2staW5saW5lIj4KKyAgICA8L3VsPgorCisgICAgPGRpdiBjbGFzcz0icHVsbC1yaWdodCI+CisgICAgICA8c3BhbiBjbGFzcz0iaGVscC1pbmxpbmUiIHN0eWxlPSJwYWRkaW5nLXRvcDo1cHg7Ij5TaG93IHJvd3M6PC9zcGFuPgorICAgICAgPHNlbGVjdCBzdHlsZT0ibWFyZ2luLXRvcDo1cHg7bWFyZ2luLWJvdHRvbTowcHg7IiBjbGFzcz0icGFnZXNpemUte3t0YWJsZV9uYW1lfX0iPgorICAgICAgICB7JSB3aXRoICIxMCAyNSA1MCAxMDAgMTUwIiBhcyBsaXN0JX0KKyAgICAgICAgeyUgZm9yIGkgaW4gbGlzdC5zcGxpdCAlfQorICAgICAgICA8b3B0aW9uIHZhbHVlPSJ7e2l9fSI+e3tpfX08L29wdGlvbj4KKyAgICAgICAgeyUgZW5kZm9yICV9CisgICAgICAgIHslIGVuZHdpdGggJX0KKyAgICAgIDwvc2VsZWN0PgorICAgIDwvZGl2PgorICA8L2Rpdj4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy91bmF2YWlsYWJsZV9hcnRpZmFjdC5odG1sIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRlcy91bmF2YWlsYWJsZV9hcnRpZmFjdC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZjhmZWUKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGVzL3VuYXZhaWxhYmxlX2FydGlmYWN0Lmh0bWwKQEAgLTAsMCArMSwxNSBAQAoreyUgZXh0ZW5kcyAiYmFzZS5odG1sIiAlfQoreyUgbG9hZCBwcm9qZWN0dGFncyAlfQoreyUgbG9hZCBodW1hbml6ZSAlfQoreyUgbG9hZCBzdGF0aWMgJX0KKworeyUgYmxvY2sgcGFnZWNvbnRlbnQgJX0KKworPGRpdiBjbGFzcz0icm93LWZsdWlkIGFpciI+CisgICAgPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtaW5mbyBzcGFuOCBsZWFkIj4KKyAgICAgICAgPHAiPiBUaGUgYnVpbGQgYXJ0aWZhY3QgeW91IGFyZSB0cnlpbmcgdG8gZG93bmxvYWQgbm8gbG9uZ2VyIGV4aXN0cy48L3A+CisgICAgICAgIDxwPjxhIGhyZWY9ImphdmFzY3JpcHQ6d2luZG93Lmhpc3RvcnkuYmFjaygpIj5CYWNrIHRvIHByZXZpb3VzIHBhZ2U8L2E+PC9wPgorICAgIDwvZGl2PgorPC9kaXY+Cit7JSBlbmRibG9jayAlfQorCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVtcGxhdGV0YWdzL19faW5pdF9fLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRldGFncy9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRldGFncy9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3RlbXBsYXRldGFncy9wcm9qZWN0dGFncy5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXRhZ3MvcHJvamVjdHRhZ3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVmMjI2MQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90ZW1wbGF0ZXRhZ3MvcHJvamVjdHRhZ3MucHkKQEAgLTAsMCArMSwyOTkgQEAKKyMKKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisjCisjIEJpdEJha2UgVG9hc3RlciBJbXBsZW1lbnRhdGlvbgorIworIyBDb3B5cmlnaHQgKEMpIDIwMTMgICAgICAgIEludGVsIENvcnBvcmF0aW9uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitmcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRldGltZSwgdGltZWRlbHRhCitmcm9tIG9zLnBhdGggaW1wb3J0IHJlbHBhdGgKK2ltcG9ydCByZQorZnJvbSBkamFuZ28gaW1wb3J0IHRlbXBsYXRlCitmcm9tIGRqYW5nby51dGlscyBpbXBvcnQgdGltZXpvbmUKK2Zyb20gZGphbmdvLnRlbXBsYXRlLmRlZmF1bHRmaWx0ZXJzIGltcG9ydCBmaWxlc2l6ZWZvcm1hdAoraW1wb3J0IGpzb24gYXMgSnNvbkxpYgorZnJvbSBkamFuZ28udXRpbHMuc2FmZXN0cmluZyBpbXBvcnQgbWFya19zYWZlCisKK3JlZ2lzdGVyID0gdGVtcGxhdGUuTGlicmFyeSgpCisKK0ByZWdpc3Rlci5zaW1wbGVfdGFnCitkZWYgdGltZV9kaWZmZXJlbmNlKHN0YXJ0X3RpbWUsIGVuZF90aW1lKToKKyAgICByZXR1cm4gZW5kX3RpbWUgLSBzdGFydF90aW1lCisKK0ByZWdpc3Rlci5maWx0ZXIobmFtZSA9ICdzZWN0b2htcycpCitkZWYgc2VjdG9obXModGltZSk6CisgICAgdHJ5OgorICAgICAgICB0ZHNlYyA9IGludCh0aW1lKQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICB0ZHNlYyA9IDAKKyAgICBob3VycyA9IGludCh0ZHNlYyAvIDM2MDApCisgICAgcmV0dXJuICIlMDJkOiUwMmQ6JTAyZCIgJSAoaG91cnMsIGludCgodGRzZWMgLSAoaG91cnMgKiAzNjAwKSkvIDYwKSwgaW50KHRkc2VjKSAlIDYwKQorCisKK0ByZWdpc3Rlci5maWx0ZXIobmFtZSA9ICdnZXRfdGFza3MnKQorZGVmIGdldF90YXNrcyhxdWVyeXNldCk6CisgICAgcmV0dXJuIGxpc3QodGFyZ2V0ICsgJzonICsgdGFzayBpZiB0YXNrIGVsc2UgdGFyZ2V0IFwKKyAgICAgICAgICAgICAgICAgICAgZm9yIHRhcmdldCwgdGFzayBpbiBxdWVyeXNldC52YWx1ZXNfbGlzdCgndGFyZ2V0JywgJ3Rhc2snKSkKKworCitAcmVnaXN0ZXIuZmlsdGVyKG5hbWUgPSAianNvbiIpCitkZWYganNvbih2YWx1ZSwgZGVmYXVsdCA9IE5vbmUpOgorICAgICMgSlNPTiBzcGVjIHNheXMgdGhhdCAiXC8iIGlzIGZ1bmN0aW9uYWxseSBpZGVudGljYWwgdG8gIi8iIHRvIGFsbG93IGZvciBIVE1MLXRhZyBlbWJlZGRpbmcgaW4gSlNPTiBzdHJpbmdzCisgICAgIyB1bmZvcnR1bmF0ZWx5LCBJIGNhbid0IGZpbmQgYW55IG9wdGlvbiBpbiB0aGUganNvbiBtb2R1bGUgdG8gdHVybiBvbiBmb3J3YXJkLXNsYXNoIGVzY2FwaW5nLCBzbyB3ZSBkbworICAgICMgaXQgbWFudWFsbHkgaGVyZQorICAgIHJldHVybiBtYXJrX3NhZmUoSnNvbkxpYi5kdW1wcyh2YWx1ZSwgaW5kZW50PTIsIGRlZmF1bHQgPSBkZWZhdWx0LCBlbnN1cmVfYXNjaWk9RmFsc2UpLnJlcGxhY2UoJzwvJywgJzxcXC8nKSkKKworQHJlZ2lzdGVyLmFzc2lnbm1lbnRfdGFnCitkZWYgcXVlcnkocXMsICoqa3dhcmdzKToKKyAgICAiIiIgdGVtcGxhdGUgdGFnIHdoaWNoIGFsbG93cyBxdWVyeXNldCBmaWx0ZXJpbmcuIFVzYWdlOgorICAgICAgICAgIHslIHF1ZXJ5IGJvb2tzIGF1dGhvcj1hdXRob3IgYXMgbXlib29rcyAlfQorICAgICAgICAgIHslIGZvciBib29rIGluIG15Ym9va3MgJX0KKyAgICAgICAgICAgIC4uLgorICAgICAgICAgIHslIGVuZGZvciAlfQorICAgICIiIgorICAgIHJldHVybiBxcy5maWx0ZXIoKiprd2FyZ3MpCisKKworQHJlZ2lzdGVyLmZpbHRlcigid2hpdGVzcGFjZV9zbGljZSIpCitkZWYgd2hpdGVzcGFjZV9zcGFjZV9maWx0ZXIodmFsdWUsIGFyZyk6CisgICAgdHJ5OgorICAgICAgICBiaXRzID0gW10KKyAgICAgICAgZm9yIHggaW4gYXJnLnNwbGl0KCI6Iik6CisgICAgICAgICAgICBpZiBsZW4oeCkgPT0gMDoKKyAgICAgICAgICAgICAgICBiaXRzLmFwcGVuZChOb25lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIGNvbnZlcnQgbnVtZXJpYyB2YWx1ZSB0byB0aGUgZmlyc3Qgd2hpdGVzcGFjZSBhZnRlcgorICAgICAgICAgICAgICAgIGZpcnN0X3doaXRlc3BhY2UgPSB2YWx1ZS5maW5kKCIgIiwgaW50KHgpKQorICAgICAgICAgICAgICAgIGlmIGZpcnN0X3doaXRlc3BhY2UgPT0gLTE6CisgICAgICAgICAgICAgICAgICAgIGJpdHMuYXBwZW5kKGludCh4KSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBiaXRzLmFwcGVuZChmaXJzdF93aGl0ZXNwYWNlKQorICAgICAgICByZXR1cm4gdmFsdWVbc2xpY2UoKmJpdHMpXQorICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgVHlwZUVycm9yKToKKyAgICAgICAgcmFpc2UKKworQHJlZ2lzdGVyLmZpbHRlcgorZGVmIGRpdmlkZSh2YWx1ZSwgYXJnKToKKyAgICBpZiBpbnQoYXJnKSA9PSAwOgorICAgICAgICByZXR1cm4gLTEKKyAgICByZXR1cm4gaW50KHZhbHVlKSAvIGludChhcmcpCisKK0ByZWdpc3Rlci5maWx0ZXIKK2RlZiBtdWx0aXBseSh2YWx1ZSwgYXJnKToKKyAgICByZXR1cm4gaW50KHZhbHVlKSAqIGludChhcmcpCisKK0ByZWdpc3Rlci5hc3NpZ25tZW50X3RhZworZGVmIGRhdGVjb21wdXRlKGRlbHRhLCBzdGFydCA9IHRpbWV6b25lLm5vdygpKToKKyAgICByZXR1cm4gc3RhcnQgKyB0aW1lZGVsdGEoZGVsdGEpCisKKworQHJlZ2lzdGVyLmZpbHRlcihuYW1lID0gJ3NvcnRjb2xzJykKK2RlZiBzb3J0Y29scyh0YWJsZWNvbHMpOgorICAgIHJldHVybiBzb3J0ZWQodGFibGVjb2xzLCBrZXkgPSBsYW1iZGEgdDogdFsnbmFtZSddKQorCitAcmVnaXN0ZXIuZmlsdGVyCitkZWYgdGFza19jb2xvcih0YXNrX29iamVjdCwgc2hvd19ncmVlbj1GYWxzZSk6CisgICAgIiIiIFJldHVybiBjc3MgY2xhc3MgZGVwZW5kaW5nIG9uIFRhc2sgZXhlY3V0aW9uIHN0YXR1cyBhbmQgZXhlY3V0aW9uIG91dGNvbWUuCisgICAgICAgIEJ5IGRlZmF1bHQsIGdyZWVuIGlzIG5vdCByZXR1cm5lZCBmb3IgZXhlY3V0ZWQgYW5kIHN1Y2Nlc3NmdWwgdGFza3M7CisgICAgICAgIHNob3dfZ3JlZW4gYXJndW1lbnQgc2hvdWxkIGJlIFRydWUgdG8gZ2V0IGdyZWVuIGNvbG9yLgorICAgICIiIgorICAgIGlmIG5vdCB0YXNrX29iamVjdC50YXNrX2V4ZWN1dGVkOgorICAgICAgICByZXR1cm4gJ2NsYXNzPW11dGVkJworICAgIGVsaWYgdGFza19vYmplY3Qub3V0Y29tZSA9PSB0YXNrX29iamVjdC5PVVRDT01FX0ZBSUxFRDoKKyAgICAgICAgcmV0dXJuICdjbGFzcz1lcnJvcicKKyAgICBlbGlmIHRhc2tfb2JqZWN0Lm91dGNvbWUgPT0gdGFza19vYmplY3QuT1VUQ09NRV9TVUNDRVNTIGFuZCBzaG93X2dyZWVuOgorICAgICAgICByZXR1cm4gJ2NsYXNzPWdyZWVuJworICAgIGVsc2U6CisgICAgICAgIHJldHVybiAnJworCitAcmVnaXN0ZXIuZmlsdGVyCitkZWYgZmlsdGVyZWRfaWNvbihvcHRpb25zLCBmaWx0ZXIpOgorICAgICIiIlJldHVybnMgYnRuLXByaW1hcnkgaWYgdGhlIGZpbHRlciBtYXRjaGVzIG9uZSBvZiB0aGUgZmlsdGVyIG9wdGlvbnMKKyAgICAiIiIKKyAgICBmb3Igb3B0aW9uIGluIG9wdGlvbnM6CisgICAgICAgIGlmIGZpbHRlciA9PSBvcHRpb25bMV06CisgICAgICAgICAgICByZXR1cm4gImJ0bi1wcmltYXJ5IgorICAgICAgICBpZiAoJ2RhdGVyYW5nZScgPT0gb3B0aW9uWzFdKSBhbmQgZmlsdGVyLnN0YXJ0c3dpdGgob3B0aW9uWzRdKToKKyAgICAgICAgICAgIHJldHVybiAiYnRuLXByaW1hcnkiCisgICAgcmV0dXJuICIiCisKK0ByZWdpc3Rlci5maWx0ZXIKK2RlZiBmaWx0ZXJlZF90b29sdGlwKG9wdGlvbnMsIGZpbHRlcik6CisgICAgIiIiUmV0dXJucyB0b29sdGlwIGZvciB0aGUgZmlsdGVyIGljb24gaWYgdGhlIGZpbHRlciBtYXRjaGVzIG9uZSBvZiB0aGUgZmlsdGVyIG9wdGlvbnMKKyAgICAiIiIKKyAgICBmb3Igb3B0aW9uIGluIG9wdGlvbnM6CisgICAgICAgIGlmIGZpbHRlciA9PSBvcHRpb25bMV06CisgICAgICAgICAgICByZXR1cm4gIlNob3dpbmcgb25seSAlcyIlb3B0aW9uWzBdCisgICAgICAgIGlmICgnZGF0ZXJhbmdlJyA9PSBvcHRpb25bMV0pIGFuZCBmaWx0ZXIuc3RhcnRzd2l0aChvcHRpb25bNF0pOgorICAgICAgICAgICAgcmV0dXJuICJTaG93aW5nIG9ubHkgJXMiJW9wdGlvblswXQorICAgIHJldHVybiAiIgorCitAcmVnaXN0ZXIuZmlsdGVyCitkZWYgZm9ybWF0X25vbmVfYW5kX3plcm8odmFsdWUpOgorICAgICIiIlJldHVybiBlbXB0eSBzdHJpbmcgaWYgdGhlIHZhbHVlIGlzIE5vbmUsIHplcm8gb3IgTm90IEFwcGxpY2FibGUKKyAgICAiIiIKKyAgICByZXR1cm4gIiIgaWYgKG5vdCB2YWx1ZSkgb3IgKHZhbHVlID09IDApIG9yICh2YWx1ZSA9PSAiMCIpIG9yICh2YWx1ZSA9PSAnTm90IEFwcGxpY2FibGUnKSBlbHNlIHZhbHVlCisKK0ByZWdpc3Rlci5maWx0ZXIKK2RlZiBmaWx0ZXJlZF9maWxlc2l6ZWZvcm1hdCh2YWx1ZSk6CisgICAgIiIiCisgICAgSWYgdGhlIHZhbHVlIGlzIC0xIHJldHVybiBhbiBlbXB0eSBzdHJpbmcuIE90aGVyd2lzZSwKKyAgICBjaGFuZ2Ugb3V0cHV0IGZyb20gZmlsZWZvcm1hdHNpemUgdG8gc3VwcHJlc3MgdHJhaWxpbmcgJy4wJworICAgIGFuZCBjaGFuZ2UgJ2J5dGVzJyB0byAnQicuCisgICAgIiIiCisgICAgaWYgdmFsdWUgPT0gLTE6CisgICAgICAgIHJldHVybiAnJworCisgICAgcmV0dXJuIGZpbGVzaXplZm9ybWF0KHZhbHVlKS5yZXBsYWNlKCJieXRlcyIsICJCIikKKworQHJlZ2lzdGVyLmZpbHRlcgorZGVmIGZpbHRlcmVkX3BhY2thZ2VzcGVjKHZhbHVlKToKKyAgICAiIiJTdHJpcCBvZmYgZW1wdHkgdmVyc2lvbiBhbmQgcmV2aXNpb24iIiIKKyAgICByZXR1cm4gcmUuc3ViKHInKC0tJCknLCAnJywgdmFsdWUpCisKK0ByZWdpc3Rlci5maWx0ZXIKK2RlZiBjaGVja19maWx0ZXJfc3RhdHVzKG9wdGlvbnMsIGZpbHRlcik6CisgICAgIiIiQ2hlY2sgaWYgdGhlIGFjdGl2ZSBmaWx0ZXIgaXMgYW1vbmcgdGhlIGF2YWlsYWJsZSBvcHRpb25zLCBhbmQgcmV0dXJuICdjaGVja2VkJworICAgICAgIGlmIGZpbHRlciBpcyBub3QgYWN0aXZlLgorICAgICAgIFVzZWQgaW4gRmlsdGVyRGlhbG9nIHRvIHNlbGVjdCB0aGUgZmlyc3QgcmFkaW8gYnV0dG9uIGlmIHRoZSBmaWx0ZXIgaXMgbm90IGFjdGl2ZS4KKyAgICAiIiIKKyAgICBmb3Igb3B0aW9uIGluIG9wdGlvbnM6CisgICAgICAgIGlmIGZpbHRlciA9PSBvcHRpb25bMV06CisgICAgICAgICAgICByZXR1cm4gIiIKKyAgICByZXR1cm4gImNoZWNrZWQiCisKK0ByZWdpc3Rlci5maWx0ZXIKK2RlZiB2YXJpYWJsZV9wYXJlbnRfbmFtZSh2YWx1ZSk6CisgICAgIiIiIGZpbHRlciBleHRlbmRlZCB2YXJpYWJsZSBuYW1lcyB0byB0aGUgcGFyZW50IG5hbWUKKyAgICAiIiIKKyAgICB2YWx1ZT1yZS5zdWIoJ19cJC4qJywgJycsIHZhbHVlKQorICAgIHJldHVybiByZS5zdWIoJ19bYS16XS4qJywgJycsIHZhbHVlKQorCitAcmVnaXN0ZXIuZmlsdGVyCitkZWYgZmlsdGVyX3NldGluX2ZpbGVzKGZpbGVfbGlzdCwgbWF0Y2hzdHIpOgorICAgICIiIkZpbHRlci9zZWFyY2ggdGhlICdzZXQgaW4nIGZpbGUgbGlzdHMuIiIiCisgICAgcmVzdWx0ID0gW10KKyAgICBzZWFyY2gsIGZpbHRlciA9IG1hdGNoc3RyLnNwbGl0KCc6JykKKyAgICBmb3IgcGF0dGVybiBpbiAoc2VhcmNoLCBmaWx0ZXIpOgorICAgICAgICBpZiBwYXR0ZXJuOgorICAgICAgICAgICAgZm9yIGZvYmogaW4gZmlsZV9saXN0OgorICAgICAgICAgICAgICAgIGZuYW1lID0gZm9iai5maWxlX25hbWUKKyAgICAgICAgICAgICAgICBpZiBmbmFtZSBub3QgaW4gcmVzdWx0IGFuZCByZS5zZWFyY2gocGF0dGVybiwgZm5hbWUpOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGZuYW1lKQorCisgICAgIyBubyBmaWx0ZXIsIHNob3cgbGFzdCBmaWxlIChpZiBhbnkpCisgICAgbGFzdCA9IGxpc3QoZmlsZV9saXN0KVstMV0uZmlsZV9uYW1lCisgICAgaWYgbm90IGZpbHRlciBhbmQgbGFzdCBub3QgaW4gcmVzdWx0OgorICAgICAgICByZXN1bHQuYXBwZW5kKGxhc3QpCisKKyAgICByZXR1cm4gcmVzdWx0CisKK0ByZWdpc3Rlci5maWx0ZXIKK2RlZiBzdHJpbmdfc2xpY2Uoc3RydmFyLHNsaWNldmFyKToKKyAgICAiIiIgc2xpY2UgYSBzdHJpbmcgd2l0aCB8c3RyaW5nX3NsaWNlOidbZmlyc3RdOltsYXN0XScKKyAgICAiIiIKKyAgICBmaXJzdCxsYXN0PSBzbGljZXZhci5wYXJ0aXRpb24oJzonKVs6OjJdCisgICAgaWYgZmlyc3Q9PScnOgorICAgICAgICByZXR1cm4gc3RydmFyWzppbnQobGFzdCldCisgICAgZWxpZiBsYXN0PT0nJzoKKyAgICAgICAgcmV0dXJuIHN0cnZhcltpbnQoZmlyc3QpOl0KKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gc3RydmFyW2ludChmaXJzdCk6aW50KGxhc3QpXQorCitAcmVnaXN0ZXIuZmlsdGVyCitkZWYgc3RyaW5nX3JlbW92ZV9yZWdleCh2YWx1ZSxleCk6CisgICAgIiIiIHJlbW92ZSBzdWItc3RyaW5nIG9mIHN0cmluZyB0aGF0IG1hdGNoZXMgcmVnZXgKKyAgICAiIiIKKyAgICByZXR1cm4gcmUuc3ViKGV4LCAnJywgdmFsdWUpCisKK0ByZWdpc3Rlci5maWx0ZXIKK2RlZiBmaWx0ZXJlZF9pbnN0YWxsZWRzaXplKHNpemUsIGluc3RhbGxlZF9zaXplKToKKyAgICAiIiJJZiBwYWNrYWdlLmluc3RhbGxlZF9zaXplIG5vdCBudWxsIGFuZCBub3QgZW1wdHkgcmV0dXJuIGl0LAorICAgICAgIGVsc2UgcmV0dXJuIHBhY2thZ2Uuc2l6ZQorICAgICIiIgorICAgIHJldHVybiBzaXplIGlmIChpbnN0YWxsZWRfc2l6ZSA9PSAwKSBvciAoaW5zdGFsbGVkX3NpemUgPT0gIiIpIG9yIChpbnN0YWxsZWRfc2l6ZSA9PSBOb25lKSBlbHNlIGluc3RhbGxlZF9zaXplCisKK0ByZWdpc3Rlci5maWx0ZXIKK2RlZiBmaWx0ZXJlZF9wYWNrYWdldmVyc2lvbih2ZXJzaW9uLCByZXZpc2lvbik6CisgICAgIiIiIEVtaXQgInZlcnNpb24tcmV2aXNpb24iIGlmIHZlcnNpb24gYW5kIHJldmlzaW9uIGFyZSBub3QgbnVsbAorICAgICAgICBlbHNlICJ2ZXJzaW9uIiBpZiB2ZXJzaW9uIGlzIG5vdCBudWxsCisgICAgICAgIGVsc2UgIiIKKyAgICAiIiIKKyAgICByZXR1cm4gIiIgaWYgKG5vdCB2ZXJzaW9uIG9yIHZlcnNpb24gPT0gIiIpIGVsc2UgdmVyc2lvbiBpZiAobm90IHJldmlzaW9uIG9yIHJldmlzaW9uID09ICIiKSBlbHNlIHZlcnNpb24gKyAiLSIgKyByZXZpc2lvbgorCitAcmVnaXN0ZXIuZmlsdGVyCitkZWYgZmlsdGVyX3NpemVvdmVydG90YWwocGFja2FnZV9vYmplY3QsIHRvdGFsX3NpemUpOgorICAgICIiIiBSZXR1cm4gdGhlICUgc2l6ZSBvZiB0aGUgcGFja2FnZSBvdmVyIHRoZSB0b3RhbCBzaXplIGFyZ3VtZW50CisgICAgICAgIGZvcm1hdHRlZCBuaWNlbHkuCisgICAgIiIiCisgICAgc2l6ZSA9IHBhY2thZ2Vfb2JqZWN0Lmluc3RhbGxlZF9zaXplCisgICAgaWYgc2l6ZSA9PSBOb25lIG9yIHNpemUgPT0gJyc6CisgICAgICAgIHNpemUgPSBwYWNrYWdlX29iamVjdC5zaXplCisKKyAgICByZXR1cm4gJ3s6LjElfScuZm9ybWF0KGZsb2F0KHNpemUpL2Zsb2F0KHRvdGFsX3NpemUpKQorCitmcm9tIGRqYW5nby51dGlscy5zYWZlc3RyaW5nIGltcG9ydCBtYXJrX3NhZmUKK0ByZWdpc3Rlci5maWx0ZXIKK2RlZiBmb3JtYXRfdnBhY2thZ2Vfcm93Y2xhc3Moc2l6ZSk6CisgICAgaWYgc2l6ZSA9PSAtMToKKyAgICAgICAgcmV0dXJuIG1hcmtfc2FmZSgnY2xhc3M9Im11dGVkIicpCisgICAgcmV0dXJuICcnCisKK0ByZWdpc3Rlci5maWx0ZXIKK2RlZiBmb3JtYXRfdnBhY2thZ2VfbmFtZWhlbHAobmFtZSk6CisgICAgciA9ICBuYW1lICsgJyZuYnNwOycKKyAgICByICs9ICc8aSBjbGFzcz0iaWNvbi1xdWVzdGlvbi1zaWduIGdldC1oZWxwIGhvdmVyLWhlbHAiJworICAgIHIgKz0gJyB0aXRsZSA9ICInICsgbmFtZSArICcgaGFzIG5vdCBiZWVuIGJ1aWx0Ij4nCisgICAgciArPSAnPC9pPicKKyAgICByZXR1cm4gbWFya19zYWZlKHIpCisKK0ByZWdpc3Rlci5maWx0ZXIKK2RlZiBnZXRfZGljdF92YWx1ZShkaWN0aW9uYXJ5LCBrZXkpOgorICAgICIiIiByZXR1cm4gdGhlIHZhbHVlIG9mIGEgZGljdGlvbmFyeSBrZXkKKyAgICAiIiIKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBkaWN0aW9uYXJ5W2tleV0KKyAgICBleGNlcHQgKEtleUVycm9yLCBJbmRleEVycm9yKToKKyAgICAgICAgcmV0dXJuICcnCisKK0ByZWdpc3Rlci5maWx0ZXIKK2RlZiBmb3JtYXRfYnVpbGRfZGF0ZShjb21wbGV0ZWRfb24pOgorICAgIG5vdyA9IHRpbWV6b25lLm5vdygpCisgICAgZGVsdGEgPSBub3cgLSBjb21wbGV0ZWRfb24KKworICAgIGlmIGRlbHRhLmRheXMgPj0gMToKKyAgICAgICAgcmV0dXJuIFRydWUKKworQHJlZ2lzdGVyLmZpbHRlcgorZGVmIGlzX3NoYWlkKHRleHQpOgorICAgICIiIiByZXR1cm4gVHJ1ZSBpZiB0ZXh0IGxlbmd0aCBpcyA0MCBjaGFyYWN0ZXJzIGFuZCBhbGwgaGV4LWRpZ2l0cworICAgICIiIgorICAgIHRyeToKKyAgICAgICAgaW50KHRleHQsIDE2KQorICAgICAgICBpZiBsZW4odGV4dCkgPT0gNDA6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKK0ByZWdpc3Rlci5maWx0ZXIKK2RlZiBjdXRfcGF0aF9wcmVmaXgoZnVsbHBhdGgsIHByZWZpeGVzKToKKyAgICAiIiJDdXQgcGF0aCBwcmVmaXggZnJvbSBmdWxscGF0aC4iIiIKKyAgICBmb3IgcHJlZml4IGluIHByZWZpeGVzOgorICAgICAgICBpZiBmdWxscGF0aC5zdGFydHN3aXRoKHByZWZpeCk6CisgICAgICAgICAgICByZXR1cm4gcmVscGF0aChmdWxscGF0aCwgcHJlZml4KQorICAgIHJldHVybiBmdWxscGF0aApkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3Rlc3RzLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3Rlc3RzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhOGI0NzgKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdGVzdHMucHkKQEAgLTAsMCArMSwyOTQgQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisjCisjIEJpdEJha2UgVG9hc3RlciBJbXBsZW1lbnRhdGlvbgorIworIyBDb3B5cmlnaHQgKEMpIDIwMTMtMjAxNSBJbnRlbCBDb3Jwb3JhdGlvbgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworIiIiVGVzdCBjYXNlcyBmb3IgVG9hc3RlciBHVUkgYW5kIFJlU1QuIiIiCisKK2Zyb20gZGphbmdvLnRlc3QgaW1wb3J0IFRlc3RDYXNlCitmcm9tIGRqYW5nby5jb3JlLnVybHJlc29sdmVycyBpbXBvcnQgcmV2ZXJzZQorZnJvbSBkamFuZ28udXRpbHMgaW1wb3J0IHRpbWV6b25lCitmcm9tIG9ybS5tb2RlbHMgaW1wb3J0IFByb2plY3QsIFJlbGVhc2UsIEJpdGJha2VWZXJzaW9uLCBCdWlsZAorZnJvbSBvcm0ubW9kZWxzIGltcG9ydCBSZWxlYXNlTGF5ZXJTb3VyY2VQcmlvcml0eSwgTGF5ZXJTb3VyY2UsIExheWVyCitmcm9tIG9ybS5tb2RlbHMgaW1wb3J0IExheWVyX1ZlcnNpb24sIFJlY2lwZSwgTWFjaGluZSwgUHJvamVjdExheWVyCitpbXBvcnQganNvbgorCitQUk9KRUNUX05BTUUgPSAidGVzdCBwcm9qZWN0IgorCitjbGFzcyBWaWV3VGVzdHMoVGVzdENhc2UpOgorICAgICIiIlRlc3RzIHRvIHZlcmlmeSB2aWV3IEFQSXMuIiIiCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGJidiA9IEJpdGJha2VWZXJzaW9uLm9iamVjdHMuY3JlYXRlKG5hbWU9InRlc3QgYmJ2IiwgZ2l0dXJsPSIvdG1wLyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyYW5jaD0ibWFzdGVyIiwgZGlycGF0aD0iIikKKyAgICAgICAgcmVsZWFzZSA9IFJlbGVhc2Uub2JqZWN0cy5jcmVhdGUobmFtZT0idGVzdCByZWxlYXNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0YmFrZV92ZXJzaW9uPWJidikKKyAgICAgICAgc2VsZi5wcm9qZWN0ID0gUHJvamVjdC5vYmplY3RzLmNyZWF0ZV9wcm9qZWN0KG5hbWU9UFJPSkVDVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZT1yZWxlYXNlKQorCisgICAgICAgIGxheWVyc3JjID0gTGF5ZXJTb3VyY2Uub2JqZWN0cy5jcmVhdGUoc291cmNldHlwZT1MYXllclNvdXJjZS5UWVBFX0lNUE9SVEVEKQorICAgICAgICBzZWxmLnByaW9yaXR5ID0gUmVsZWFzZUxheWVyU291cmNlUHJpb3JpdHkub2JqZWN0cy5jcmVhdGUocmVsZWFzZT1yZWxlYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJfc291cmNlPWxheWVyc3JjKQorICAgICAgICBsYXllciA9IExheWVyLm9iamVjdHMuY3JlYXRlKG5hbWU9ImJhc2UtbGF5ZXIiLCBsYXllcl9zb3VyY2U9bGF5ZXJzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmNzX3VybD0iL3RtcC8iKQorCisgICAgICAgIGx2ZXIgPSBMYXllcl9WZXJzaW9uLm9iamVjdHMuY3JlYXRlKGxheWVyPWxheWVyLCBwcm9qZWN0PXNlbGYucHJvamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJfc291cmNlPWxheWVyc3JjLCBjb21taXQ9Im1hc3RlciIpCisKKyAgICAgICAgUmVjaXBlLm9iamVjdHMuY3JlYXRlKGxheWVyX3NvdXJjZT1sYXllcnNyYywgbmFtZT0iYmFzZS1yZWNpcGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj0iMS4yIiwgc3VtbWFyeT0ib25lIHJlY2lwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0icmVjaXBlIiwgbGF5ZXJfdmVyc2lvbj1sdmVyKQorCisgICAgICAgIE1hY2hpbmUub2JqZWN0cy5jcmVhdGUobGF5ZXJfdmVyc2lvbj1sdmVyLCBuYW1lPSJ3aXNrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0id2lza2luZyBtYWNoaW5lIikKKworICAgICAgICBQcm9qZWN0TGF5ZXIub2JqZWN0cy5jcmVhdGUocHJvamVjdD1zZWxmLnByb2plY3QsIGxheWVyY29tbWl0PWx2ZXIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGx2ZXIgaW4gc2VsZi5wcm9qZWN0LmNvbXBhdGlibGVfbGF5ZXJ2ZXJzaW9ucygpKQorCisgICAgZGVmIHRlc3RfZ2V0X2Jhc2VfY2FsbF9yZXR1cm5zX2h0bWwoc2VsZik6CisgICAgICAgICIiIkJhc2ljIHRlc3QgZm9yIGFsbC1wcm9qZWN0cyB2aWV3IiIiCisgICAgICAgIHJlc3BvbnNlID0gc2VsZi5jbGllbnQuZ2V0KHJldmVyc2UoJ2FsbC1wcm9qZWN0cycpLCBmb2xsb3c9VHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNwb25zZS5zdGF0dXNfY29kZSwgMjAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzcG9uc2VbJ0NvbnRlbnQtVHlwZSddLnN0YXJ0c3dpdGgoJ3RleHQvaHRtbCcpKQorICAgICAgICBzZWxmLmFzc2VydFRlbXBsYXRlVXNlZChyZXNwb25zZSwgInByb2plY3RzLmh0bWwiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoUFJPSkVDVF9OQU1FIGluIHJlc3BvbnNlLmNvbnRlbnQpCisKKyAgICBkZWYgdGVzdF9nZXRfanNvbl9jYWxsX3JldHVybnNfanNvbihzZWxmKToKKyAgICAgICAgIiIiVGVzdCBmb3IgYWxsIHByb2plY3RzIG91dHB1dCBpbiBqc29uIGZvcm1hdCIiIgorICAgICAgICB1cmwgPSByZXZlcnNlKCdhbGwtcHJvamVjdHMnKQorICAgICAgICByZXNwb25zZSA9IHNlbGYuY2xpZW50LmdldCh1cmwsIHsiZm9ybWF0IjogImpzb24ifSwgZm9sbG93PVRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzcG9uc2Uuc3RhdHVzX2NvZGUsIDIwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3BvbnNlWydDb250ZW50LVR5cGUnXS5zdGFydHN3aXRoKCdhcHBsaWNhdGlvbi9qc29uJykpCisKKyAgICAgICAgZGF0YSA9IGpzb24ubG9hZHMocmVzcG9uc2UuY29udGVudCkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoImVycm9yIiBpbiBkYXRhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGFbImVycm9yIl0sICJvayIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgicm93cyIgaW4gZGF0YSkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoUFJPSkVDVF9OQU1FIGluIFt4WyJuYW1lIl0gZm9yIHggaW4gZGF0YVsicm93cyJdXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJpZCIgaW4gZGF0YVsicm93cyJdWzBdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKGRhdGFbInJvd3MiXVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgWydiaXRiYWtlX3ZlcnNpb25faWQnLCAnY3JlYXRlZCcsICdpZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdpc19kZWZhdWx0JywgJ2xheWVyc1R5cGVBaGVhZFVybCcsICduYW1lJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ251bV9idWlsZHMnLCAncHJvamVjdEJ1aWxkc1VybCcsICdwcm9qZWN0UGFnZVVybCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdyZWNpcGVzVHlwZUFoZWFkVXJsJywgJ3JlbGVhc2VfaWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnc2hvcnRfZGVzY3JpcHRpb24nLCAndXBkYXRlZCcsICd1c2VyX2lkJ10pCisKKyAgICBkZWYgdGVzdF90eXBlYWhlYWRzKHNlbGYpOgorICAgICAgICAiIiJUZXN0IHR5cGVhaGVhZCBSZVNUIEFQSSIiIgorICAgICAgICBsYXllcnNfdXJsID0gcmV2ZXJzZSgneGhyX2xheWVyc3R5cGVhaGVhZCcsIGFyZ3M9KHNlbGYucHJvamVjdC5pZCwpKQorICAgICAgICBwcmpfdXJsID0gcmV2ZXJzZSgneGhyX3Byb2plY3RzdHlwZWFoZWFkJykKKworICAgICAgICB1cmxzID0gW2xheWVyc191cmwsCisgICAgICAgICAgICAgICAgcHJqX3VybCwKKyAgICAgICAgICAgICAgICByZXZlcnNlKCd4aHJfcmVjaXBlc3R5cGVhaGVhZCcsIGFyZ3M9KHNlbGYucHJvamVjdC5pZCwpKSwKKyAgICAgICAgICAgICAgICByZXZlcnNlKCd4aHJfbWFjaGluZXN0eXBlYWhlYWQnLCBhcmdzPShzZWxmLnByb2plY3QuaWQsKSksCisgICAgICAgICAgICAgICBdCisKKyAgICAgICAgZGVmIGJhc2ljX3JlcG9uc2VfY2hlY2socmVzcG9uc2UsIHVybCk6CisgICAgICAgICAgICAiIiJDaGVjayBkYXRhIHN0cnVjdHVyZSBvZiBodHRwIHJlc3BvbnNlLiIiIgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNwb25zZS5zdGF0dXNfY29kZSwgMjAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3BvbnNlWydDb250ZW50LVR5cGUnXS5zdGFydHN3aXRoKCdhcHBsaWNhdGlvbi9qc29uJykpCisKKyAgICAgICAgICAgIGRhdGEgPSBqc29uLmxvYWRzKHJlc3BvbnNlLmNvbnRlbnQpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiZXJyb3IiIGluIGRhdGEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGFbImVycm9yIl0sICJvayIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoInJlc3VsdHMiIGluIGRhdGEpCisKKyAgICAgICAgICAgICMgV2UgZ290IGEgcmVzdWx0IHNvIG5vdyBjaGVjayB0aGUgZmllbGRzCisgICAgICAgICAgICBpZiBsZW4oZGF0YVsncmVzdWx0cyddKSA+IDA6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gZGF0YVsncmVzdWx0cyddWzBdCisKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlc3VsdFsnbmFtZSddKSA+IDApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJkZXRhaWwiIGluIHJlc3VsdCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzdWx0WydpZCddID4gMCkKKworICAgICAgICAgICAgICAgICMgU3BlY2lhbCBjaGVjayBmb3IgdGhlIGxheWVycyB0eXBlYWhlYWQncyBleHRyYSBmaWVsZHMKKyAgICAgICAgICAgICAgICBpZiB1cmwgPT0gbGF5ZXJzX3VybDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihyZXN1bHRbJ2xheWVyZGV0YWlsdXJsJ10pID4gMCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihyZXN1bHRbJ3Zjc191cmwnXSkgPiAwKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlc3VsdFsndmNzX3JlZmVyZW5jZSddKSA+IDApCisgICAgICAgICAgICAgICAgIyBTcGVjaWFsIGNoZWNrIGZvciBwcm9qZWN0IHR5cGVhaGVhZCBleHRyYSBmaWVsZHMKKyAgICAgICAgICAgICAgICBlbGlmIHVybCA9PSBwcmpfdXJsOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlc3VsdFsncHJvamVjdFBhZ2VVcmwnXSkgPiAwKQorCisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgaW1wb3J0IHN0cmluZworCisgICAgICAgIGZvciB1cmwgaW4gdXJsczoKKyAgICAgICAgICAgIHJlc3VsdHMgPSBGYWxzZQorCisgICAgICAgICAgICBmb3IgdHlwZWluZyBpbiBsaXN0KHN0cmluZy5hc2NpaV9sZXR0ZXJzKToKKyAgICAgICAgICAgICAgICByZXNwb25zZSA9IHNlbGYuY2xpZW50LmdldCh1cmwsIHsnc2VhcmNoJzogdHlwZWluZ30pCisgICAgICAgICAgICAgICAgcmVzdWx0cyA9IGJhc2ljX3JlcG9uc2VfY2hlY2socmVzcG9uc2UsIHVybCkKKyAgICAgICAgICAgICAgICBpZiByZXN1bHRzOgorICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICAjIEFmdGVyICJ0eXBlaW5nIiB0aGUgYWxwYWJldCB3ZSBzaG91bGQgaGF2ZSByZXN1bHQgdHJ1ZQorICAgICAgICAgICAgIyBmcm9tIGVhY2ggb2YgdGhlIHVybHMKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHRzKQorCisgICAgZGVmIHRlc3RfeGhyX2ltcG9ydF9sYXllcihzZWxmKToKKyAgICAgICAgIiIiVGVzdCB4aHJfaW1wb3J0bGF5ZXIgQVBJIiIiCisgICAgICAgICNUZXN0IGZvciBpbXBvcnRpbmcgYW4gYWxyZWFkeSBleGlzdGluZyBsYXllcgorICAgICAgICBhcmdzID0geyd2Y3NfdXJsJyA6ICJnaXQ6Ly9naXQuZXhhbXBsZS5jb20vdGVzdCIsCisgICAgICAgICAgICAgICAgJ25hbWUnIDogImJhc2UtbGF5ZXIiLAorICAgICAgICAgICAgICAgICdnaXRfcmVmJzogImMxMmI5NTk2YWZkMjM2MTE2YjI1Y2UyNmRiZTBkNzkzZGU5ZGM3Y2UiLAorICAgICAgICAgICAgICAgICdwcm9qZWN0X2lkJzogMSwgJ2Rpcl9wYXRoJyA6ICIvcGF0aC9pbi9yZXBvc2l0b3J5In0KKyAgICAgICAgcmVzcG9uc2UgPSBzZWxmLmNsaWVudC5wb3N0KHJldmVyc2UoJ3hocl9pbXBvcnRsYXllcicpLCBhcmdzKQorICAgICAgICBkYXRhID0ganNvbi5sb2FkcyhyZXNwb25zZS5jb250ZW50KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3BvbnNlLnN0YXR1c19jb2RlLCAyMDApCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZGF0YVsiZXJyb3IiXSwgIm9rIikKKworICAgICAgICAjVGVzdCB0byB2ZXJpZnkgaW1wb3J0IG9mIGEgbGF5ZXIgc3VjY2Vzc2Z1bAorICAgICAgICBhcmdzWyduYW1lJ10gPSAibWV0YS1vZSIKKyAgICAgICAgcmVzcG9uc2UgPSBzZWxmLmNsaWVudC5wb3N0KHJldmVyc2UoJ3hocl9pbXBvcnRsYXllcicpLCBhcmdzKQorICAgICAgICBkYXRhID0ganNvbi5sb2FkcyhyZXNwb25zZS5jb250ZW50KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZGF0YVsiZXJyb3IiXSwgIm9rIikKKworICAgICAgICAjVGVzdCBmb3IgaHRtbCB0YWcgaW4gdGhlIGRhdGEKKyAgICAgICAgYXJnc1snPCddID0gInRlc3RpbmcgaHRtbCB0YWciCisgICAgICAgIHJlc3BvbnNlID0gc2VsZi5jbGllbnQucG9zdChyZXZlcnNlKCd4aHJfaW1wb3J0bGF5ZXInKSwgYXJncykKKyAgICAgICAgZGF0YSA9IGpzb24ubG9hZHMocmVzcG9uc2UuY29udGVudCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChkYXRhWyJlcnJvciJdLCAib2siKQorCisgICAgICAgICNFbXB0eSBkYXRhIHBhc3NlZAorICAgICAgICBhcmdzID0ge30KKyAgICAgICAgcmVzcG9uc2UgPSBzZWxmLmNsaWVudC5wb3N0KHJldmVyc2UoJ3hocl9pbXBvcnRsYXllcicpLCBhcmdzKQorICAgICAgICBkYXRhID0ganNvbi5sb2FkcyhyZXNwb25zZS5jb250ZW50KQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGRhdGFbImVycm9yIl0sICJvayIpCisKK2NsYXNzIExhbmRpbmdQYWdlVGVzdHMoVGVzdENhc2UpOgorICAgICIiIiBUZXN0cyBmb3IgcmVkaXJlY3RzIG9uIHRoZSBsYW5kaW5nIHBhZ2UgIiIiCisgICAgIyBkaXNhYmxlIGJvZ3VzIHB5bGludCBtZXNzYWdlIGVycm9yOgorICAgICMgIkluc3RhbmNlIG9mICdXU0dJUmVxdWVzdCcgaGFzIG5vICd1cmwnIG1lbWJlciAobm8tbWVtYmVyKSIKKyAgICAjIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL2xhbmRzY2FwZWlvL3B5bGludC1kamFuZ28vaXNzdWVzLzQyKQorICAgICMgcHlsaW50OiBkaXNhYmxlPUUxMTAzCisKKyAgICBMQU5ESU5HX1BBR0VfVElUTEUgPSAnVGhpcyBpcyBUb2FzdGVyJworCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAiIiIgQWRkIGRlZmF1bHQgcHJvamVjdCBtYW51YWxseSAiIiIKKyAgICAgICAgc2VsZi5wcm9qZWN0ID0gUHJvamVjdC5vYmplY3RzLmNyZWF0ZV9wcm9qZWN0KCdmb28nLCBOb25lKQorICAgICAgICBzZWxmLnByb2plY3QuaXNfZGVmYXVsdCA9IFRydWUKKyAgICAgICAgc2VsZi5wcm9qZWN0LnNhdmUoKQorCisgICAgZGVmIHRlc3Rfb25seV9kZWZhdWx0X3Byb2plY3Qoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBObyBwcm9qZWN0cyBleGNlcHQgZGVmYXVsdAorICAgICAgICA9PiBnZXQgdGhlIGxhbmRpbmcgcGFnZQorICAgICAgICAiIiIKKyAgICAgICAgcmVzcG9uc2UgPSBzZWxmLmNsaWVudC5nZXQocmV2ZXJzZSgnbGFuZGluZycpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5MQU5ESU5HX1BBR0VfVElUTEUgaW4gcmVzcG9uc2UuY29udGVudCkKKworICAgIGRlZiB0ZXN0X2RlZmF1bHRfcHJvamVjdF9oYXNfYnVpbGQoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBEZWZhdWx0IHByb2plY3QgaGFzIGEgYnVpbGQsIG5vIG90aGVyIHByb2plY3RzCisgICAgICAgID0+IGdldCB0aGUgYnVpbGRzIHBhZ2UKKyAgICAgICAgIiIiCisgICAgICAgIG5vdyA9IHRpbWV6b25lLm5vdygpCisgICAgICAgIGJ1aWxkID0gQnVpbGQub2JqZWN0cy5jcmVhdGUocHJvamVjdD1zZWxmLnByb2plY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZF9vbj1ub3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkX29uPW5vdykKKyAgICAgICAgYnVpbGQuc2F2ZSgpCisKKyAgICAgICAgcmVzcG9uc2UgPSBzZWxmLmNsaWVudC5nZXQocmV2ZXJzZSgnbGFuZGluZycpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3BvbnNlLnN0YXR1c19jb2RlLCAzMDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3Jlc3BvbnNlIHNob3VsZCBiZSBhIHJlZGlyZWN0JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCcvYnVpbGRzJyBpbiByZXNwb25zZS51cmwsCisgICAgICAgICAgICAgICAgICAgICAgICAnc2hvdWxkIHJlZGlyZWN0IHRvIGJ1aWxkcycpCisKKyAgICBkZWYgdGVzdF91c2VyX3Byb2plY3RfZXhpc3RzKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgVXNlciBoYXMgYWRkZWQgYSBwcm9qZWN0ICh3aXRob3V0IGJ1aWxkcykKKyAgICAgICAgPT4gZ2V0IHRoZSBwcm9qZWN0cyBwYWdlCisgICAgICAgICIiIgorICAgICAgICB1c2VyX3Byb2plY3QgPSBQcm9qZWN0Lm9iamVjdHMuY3JlYXRlX3Byb2plY3QoJ2ZvbycsIE5vbmUpCisgICAgICAgIHVzZXJfcHJvamVjdC5zYXZlKCkKKworICAgICAgICByZXNwb25zZSA9IHNlbGYuY2xpZW50LmdldChyZXZlcnNlKCdsYW5kaW5nJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzcG9uc2Uuc3RhdHVzX2NvZGUsIDMwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAncmVzcG9uc2Ugc2hvdWxkIGJlIGEgcmVkaXJlY3QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJy9wcm9qZWN0cycgaW4gcmVzcG9uc2UudXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3Nob3VsZCByZWRpcmVjdCB0byBwcm9qZWN0cycpCisKKyAgICBkZWYgdGVzdF91c2VyX3Byb2plY3RfaGFzX2J1aWxkKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgVXNlciBoYXMgYWRkZWQgYSBwcm9qZWN0ICh3aXRoIGJ1aWxkcykKKyAgICAgICAgPT4gZ2V0IHRoZSBidWlsZHMgcGFnZQorICAgICAgICAiIiIKKyAgICAgICAgdXNlcl9wcm9qZWN0ID0gUHJvamVjdC5vYmplY3RzLmNyZWF0ZV9wcm9qZWN0KCdmb28nLCBOb25lKQorICAgICAgICB1c2VyX3Byb2plY3Quc2F2ZSgpCisKKyAgICAgICAgbm93ID0gdGltZXpvbmUubm93KCkKKyAgICAgICAgYnVpbGQgPSBCdWlsZC5vYmplY3RzLmNyZWF0ZShwcm9qZWN0PXVzZXJfcHJvamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGVkX29uPW5vdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWRfb249bm93KQorICAgICAgICBidWlsZC5zYXZlKCkKKworICAgICAgICByZXNwb25zZSA9IHNlbGYuY2xpZW50LmdldChyZXZlcnNlKCdsYW5kaW5nJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzcG9uc2Uuc3RhdHVzX2NvZGUsIDMwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAncmVzcG9uc2Ugc2hvdWxkIGJlIGEgcmVkaXJlY3QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJy9idWlsZHMnIGluIHJlc3BvbnNlLnVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICdzaG91bGQgcmVkaXJlY3QgdG8gYnVpbGRzJykKKworY2xhc3MgUHJvamVjdHNQYWdlVGVzdHMoVGVzdENhc2UpOgorICAgICIiIiBUZXN0cyBmb3IgcHJvamVjdHMgcGFnZSAiIiIKKworICAgIFBST0pFQ1RfTkFNRSA9ICdjbGkgYnVpbGRzJworCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAiIiIgQWRkIGRlZmF1bHQgcHJvamVjdCBtYW51YWxseSAiIiIKKyAgICAgICAgcHJvamVjdCA9IFByb2plY3Qub2JqZWN0cy5jcmVhdGVfcHJvamVjdChzZWxmLlBST0pFQ1RfTkFNRSwgTm9uZSkKKyAgICAgICAgc2VsZi5kZWZhdWx0X3Byb2plY3QgPSBwcm9qZWN0CisgICAgICAgIHNlbGYuZGVmYXVsdF9wcm9qZWN0LmlzX2RlZmF1bHQgPSBUcnVlCisgICAgICAgIHNlbGYuZGVmYXVsdF9wcm9qZWN0LnNhdmUoKQorCisgICAgZGVmIHRlc3RfZGVmYXVsdF9wcm9qZWN0X2hpZGRlbihzZWxmKToKKyAgICAgICAgIiIiIFRoZSBkZWZhdWx0IHByb2plY3Qgc2hvdWxkIGJlIGhpZGRlbiBpZiBpdCBoYXMgbm8gYnVpbGRzICIiIgorICAgICAgICBwYXJhbXMgPSB7ImNvdW50IjogMTAsICJvcmRlcmJ5IjogInVwZGF0ZWQ6LSIsICJwYWdlIjogMX0KKyAgICAgICAgcmVzcG9uc2UgPSBzZWxmLmNsaWVudC5nZXQocmV2ZXJzZSgnYWxsLXByb2plY3RzJyksIHBhcmFtcykKKworICAgICAgICBzZWxmLmFzc2VydFRydWUobm90KCd0ciBjbGFzcz0iZGF0YSInIGluIHJlc3BvbnNlLmNvbnRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3Nob3VsZCBiZSBubyBwcm9qZWN0IHJvd3MgaW4gdGhlIHBhZ2UnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90KHNlbGYuUFJPSkVDVF9OQU1FIGluIHJlc3BvbnNlLmNvbnRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHQgcHJvamVjdCAiY2xpIGJ1aWxkcyIgc2hvdWxkIG5vdCBiZSBpbiBwYWdlJykKKworICAgIGRlZiB0ZXN0X2RlZmF1bHRfcHJvamVjdF9oYXNfYnVpbGQoc2VsZik6CisgICAgICAgICIiIiBUaGUgZGVmYXVsdCBwcm9qZWN0IHNob3VsZCBiZSBzaG93biBpZiBpdCBoYXMgYnVpbGRzICIiIgorICAgICAgICBub3cgPSB0aW1lem9uZS5ub3coKQorICAgICAgICBidWlsZCA9IEJ1aWxkLm9iamVjdHMuY3JlYXRlKHByb2plY3Q9c2VsZi5kZWZhdWx0X3Byb2plY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZF9vbj1ub3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkX29uPW5vdykKKyAgICAgICAgYnVpbGQuc2F2ZSgpCisKKyAgICAgICAgcGFyYW1zID0geyJjb3VudCI6IDEwLCAib3JkZXJieSI6ICJ1cGRhdGVkOi0iLCAicGFnZSI6IDF9CisgICAgICAgIHJlc3BvbnNlID0gc2VsZi5jbGllbnQuZ2V0KHJldmVyc2UoJ2FsbC1wcm9qZWN0cycpLCBwYXJhbXMpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCd0ciBjbGFzcz0iZGF0YSInIGluIHJlc3BvbnNlLmNvbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAnc2hvdWxkIGJlIGEgcHJvamVjdCByb3cgaW4gdGhlIHBhZ2UnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5QUk9KRUNUX05BTUUgaW4gcmVzcG9uc2UuY29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICdkZWZhdWx0IHByb2plY3QgImNsaSBidWlsZHMiIHNob3VsZCBiZSBpbiBwYWdlJykKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90eXBlYWhlYWRzLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3R5cGVhaGVhZHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDViZWM1OAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS90eXBlYWhlYWRzLnB5CkBAIC0wLDAgKzEsMTQ1IEBACisjCisjIEJpdEJha2UgVG9hc3RlciBJbXBsZW1lbnRhdGlvbgorIworIyBDb3B5cmlnaHQgKEMpIDIwMTUgICAgICAgIEludGVsIENvcnBvcmF0aW9uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitmcm9tIHRvYXN0ZXJndWkud2lkZ2V0cyBpbXBvcnQgVG9hc3RlclR5cGVBaGVhZAorZnJvbSBvcm0ubW9kZWxzIGltcG9ydCBQcm9qZWN0Citmcm9tIGRqYW5nby5jb3JlLnVybHJlc29sdmVycyBpbXBvcnQgcmV2ZXJzZQorCitjbGFzcyBMYXllcnNUeXBlQWhlYWQoVG9hc3RlclR5cGVBaGVhZCk6CisgICAgIiIiIFR5cGVhaGVhZCBmb3IgbGF5ZXJzIGF2YWlsYWJsZSBhbmQgbm90IGFkZGVkIGluIHRoZSBjdXJyZW50IHByb2plY3QncworICAgIGNvbmZpZ3VyYXRpb24gIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgc3VwZXIoTGF5ZXJzVHlwZUFoZWFkLCBzZWxmKS5fX2luaXRfXygpCisKKyAgICBkZWYgYXBwbHlfc2VhcmNoKHNlbGYsIHNlYXJjaF90ZXJtLCBwcmosIHJlcXVlc3QpOgorICAgICAgICBsYXllcnMgPSBwcmouY29tcGF0aWJsZV9sYXllcnZlcnNpb25zKCkKKyAgICAgICAgbGF5ZXJzID0gbGF5ZXJzLm9yZGVyX2J5KCdsYXllcl9fbmFtZScpCisKKyAgICAgICAgIyBVbmxpa2UgdGhlIG90aGVyIHR5cGVhaGVhZHMgd2UgYWxzbyBkb24ndCB3YW50IHRvIHNob3cgc3VnZ2VzdGlvbnMKKyAgICAgICAgIyBmb3IgbGF5ZXJzIGFscmVhZHkgaW4gdGhlIHByb2plY3QgdW5sZXNzIHJlcXVpcmVkIHN1Y2ggYXMgd2hlbiBhZGRpbmcKKyAgICAgICAgIyBsYXllcmRlcHMgdG8gYSBuZXcgbGF5ZXIuCisgICAgICAgIGlmICgiaW5jbHVkZV9hZGRlZCIgaW4gcmVxdWVzdC5HRVQgYW5kCisgICAgICAgICAgICAgICAgcmVxdWVzdC5HRVRbJ2luY2x1ZGVfYWRkZWQnXSAhPSAidHJ1ZSIpOgorICAgICAgICAgICAgbGF5ZXJzID0gbGF5ZXJzLmV4Y2x1ZGUocGtfX2luPXByai5wcm9qZWN0bGF5ZXJfZXF1aXZhbGVudF9zZXQpCisKKyAgICAgICAgcHJpbWFyeV9yZXN1bHRzID0gbGF5ZXJzLmZpbHRlcihsYXllcl9fbmFtZV9faXN0YXJ0c3dpdGg9c2VhcmNoX3Rlcm0pCisgICAgICAgIHNlY29uZGFyeV9yZXN1bHRzID0gbGF5ZXJzLmZpbHRlcihsYXllcl9fbmFtZV9faWNvbnRhaW5zPXNlYXJjaF90ZXJtKS5leGNsdWRlKHBrX19pbj1wcmltYXJ5X3Jlc3VsdHMpCisKKyAgICAgICAgcmVzdWx0cyA9IFtdCisKKyAgICAgICAgZm9yIGxheWVyX3ZlcnNpb24gaW4gbGlzdChwcmltYXJ5X3Jlc3VsdHMpICsgbGlzdChzZWNvbmRhcnlfcmVzdWx0cyk6CisgICAgICAgICAgICB2Y3NfcmVmZXJlbmNlID0gbGF5ZXJfdmVyc2lvbi5nZXRfdmNzX3JlZmVyZW5jZSgpCisKKyAgICAgICAgICAgIGRldGFpbCA9ICJbICVzIHwgJXMgXSIgJSAobGF5ZXJfdmVyc2lvbi5sYXllci52Y3NfdXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Y3NfcmVmZXJlbmNlKQorICAgICAgICAgICAgbmVlZGVkX2ZpZWxkcyA9IHsKKyAgICAgICAgICAgICAgICAnaWQnIDogbGF5ZXJfdmVyc2lvbi5waywKKyAgICAgICAgICAgICAgICAnbmFtZScgOiBsYXllcl92ZXJzaW9uLmxheWVyLm5hbWUsCisgICAgICAgICAgICAgICAgJ2xheWVyZGV0YWlsdXJsJyA6IGxheWVyX3ZlcnNpb24uZ2V0X2RldGFpbHNwYWdlX3VybChwcmoucGspLAorICAgICAgICAgICAgICAgICd2Y3NfdXJsJyA6IGxheWVyX3ZlcnNpb24ubGF5ZXIudmNzX3VybCwKKyAgICAgICAgICAgICAgICAndmNzX3JlZmVyZW5jZScgOiB2Y3NfcmVmZXJlbmNlLAorICAgICAgICAgICAgICAgICdkZXRhaWwnIDogZGV0YWlsLAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXN1bHRzLmFwcGVuZChuZWVkZWRfZmllbGRzKQorCisgICAgICAgIHJldHVybiByZXN1bHRzCisKK2NsYXNzIE1hY2hpbmVzVHlwZUFoZWFkKFRvYXN0ZXJUeXBlQWhlYWQpOgorICAgICIiIiBUeXBlYWhlYWQgZm9yIGFsbCB0aGUgbWFjaGluZXMgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IHByb2plY3QncworICAgIGNvbmZpZ3VyYXRpb24gIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzdXBlcihNYWNoaW5lc1R5cGVBaGVhZCwgc2VsZikuX19pbml0X18oKQorCisgICAgZGVmIGFwcGx5X3NlYXJjaChzZWxmLCBzZWFyY2hfdGVybSwgcHJqLCByZXF1ZXN0KToKKyAgICAgICAgbWFjaGluZXMgPSBwcmouZ2V0X2F2YWlsYWJsZV9tYWNoaW5lcygpCisgICAgICAgIG1hY2hpbmVzID0gbWFjaGluZXMub3JkZXJfYnkoIm5hbWUiKQorCisgICAgICAgIHByaW1hcnlfcmVzdWx0cyA9IG1hY2hpbmVzLmZpbHRlcihuYW1lX19pc3RhcnRzd2l0aD1zZWFyY2hfdGVybSkKKyAgICAgICAgc2Vjb25kYXJ5X3Jlc3VsdHMgPSBtYWNoaW5lcy5maWx0ZXIobmFtZV9faWNvbnRhaW5zPXNlYXJjaF90ZXJtKS5leGNsdWRlKHBrX19pbj1wcmltYXJ5X3Jlc3VsdHMpCisgICAgICAgIHRlcnRpYXJ5X3Jlc3VsdHMgPSBtYWNoaW5lcy5maWx0ZXIobGF5ZXJfdmVyc2lvbl9fbGF5ZXJfX25hbWVfX2ljb250YWlucz1zZWFyY2hfdGVybSkuZXhjbHVkZShwa19faW49cHJpbWFyeV9yZXN1bHRzKS5leGNsdWRlKHBrX19pbj1zZWNvbmRhcnlfcmVzdWx0cykKKworICAgICAgICByZXN1bHRzID0gW10KKworICAgICAgICBmb3IgbWFjaGluZSBpbiBsaXN0KHByaW1hcnlfcmVzdWx0cykgKyBsaXN0KHNlY29uZGFyeV9yZXN1bHRzKSArIGxpc3QodGVydGlhcnlfcmVzdWx0cyk6CisKKyAgICAgICAgICAgIGRldGFpbCA9ICJbICVzIF0iICUgKG1hY2hpbmUubGF5ZXJfdmVyc2lvbi5sYXllci5uYW1lKQorICAgICAgICAgICAgbmVlZGVkX2ZpZWxkcyA9IHsKKyAgICAgICAgICAgICAgICAnaWQnIDogbWFjaGluZS5waywKKyAgICAgICAgICAgICAgICAnbmFtZScgOiBtYWNoaW5lLm5hbWUsCisgICAgICAgICAgICAgICAgJ2RldGFpbCcgOiBkZXRhaWwsCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKG5lZWRlZF9maWVsZHMpCisKKyAgICAgICAgcmV0dXJuIHJlc3VsdHMKKworY2xhc3MgUmVjaXBlc1R5cGVBaGVhZChUb2FzdGVyVHlwZUFoZWFkKToKKyAgICAiIiIgVHlwZWFoZWFkIGZvciBhbGwgdGhlIHJlY2lwZXMgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IHByb2plY3QncworICAgIGNvbmZpZ3VyYXRpb24gIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzdXBlcihSZWNpcGVzVHlwZUFoZWFkLCBzZWxmKS5fX2luaXRfXygpCisKKyAgICBkZWYgYXBwbHlfc2VhcmNoKHNlbGYsIHNlYXJjaF90ZXJtLCBwcmosIHJlcXVlc3QpOgorICAgICAgICByZWNpcGVzID0gcHJqLmdldF9hdmFpbGFibGVfcmVjaXBlcygpCisgICAgICAgIHJlY2lwZXMgPSByZWNpcGVzLm9yZGVyX2J5KCJuYW1lIikKKworCisgICAgICAgIHByaW1hcnlfcmVzdWx0cyA9IHJlY2lwZXMuZmlsdGVyKG5hbWVfX2lzdGFydHN3aXRoPXNlYXJjaF90ZXJtKQorICAgICAgICBzZWNvbmRhcnlfcmVzdWx0cyA9IHJlY2lwZXMuZmlsdGVyKG5hbWVfX2ljb250YWlucz1zZWFyY2hfdGVybSkuZXhjbHVkZShwa19faW49cHJpbWFyeV9yZXN1bHRzKQorICAgICAgICB0ZXJ0aWFyeV9yZXN1bHRzID0gcmVjaXBlcy5maWx0ZXIobGF5ZXJfdmVyc2lvbl9fbGF5ZXJfX25hbWVfX2ljb250YWlucz1zZWFyY2hfdGVybSkuZXhjbHVkZShwa19faW49cHJpbWFyeV9yZXN1bHRzKS5leGNsdWRlKHBrX19pbj1zZWNvbmRhcnlfcmVzdWx0cykKKworICAgICAgICByZXN1bHRzID0gW10KKworICAgICAgICBmb3IgcmVjaXBlIGluIGxpc3QocHJpbWFyeV9yZXN1bHRzKSArIGxpc3Qoc2Vjb25kYXJ5X3Jlc3VsdHMpICsgbGlzdCh0ZXJ0aWFyeV9yZXN1bHRzKToKKworICAgICAgICAgICAgZGV0YWlsID0gIlsgJXMgXSIgJSAocmVjaXBlLmxheWVyX3ZlcnNpb24ubGF5ZXIubmFtZSkKKyAgICAgICAgICAgIG5lZWRlZF9maWVsZHMgPSB7CisgICAgICAgICAgICAgICAgJ2lkJyA6IHJlY2lwZS5waywKKyAgICAgICAgICAgICAgICAnbmFtZScgOiByZWNpcGUubmFtZSwKKyAgICAgICAgICAgICAgICAnZGV0YWlsJyA6IGRldGFpbCwKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQobmVlZGVkX2ZpZWxkcykKKworICAgICAgICByZXR1cm4gcmVzdWx0cworCitjbGFzcyBQcm9qZWN0c1R5cGVBaGVhZChUb2FzdGVyVHlwZUFoZWFkKToKKyAgICAiIiIgVHlwZWFoZWFkIGZvciBhbGwgdGhlIHByb2plY3RzICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc3VwZXIoUHJvamVjdHNUeXBlQWhlYWQsIHNlbGYpLl9faW5pdF9fKCkKKworICAgIGRlZiBhcHBseV9zZWFyY2goc2VsZiwgc2VhcmNoX3Rlcm0sIHByaiwgcmVxdWVzdCk6CisgICAgICAgIHByb2plY3RzID0gUHJvamVjdC5vYmplY3RzLmFsbCgpLm9yZGVyX2J5KCJuYW1lIikKKworICAgICAgICBwcmltYXJ5X3Jlc3VsdHMgPSBwcm9qZWN0cy5maWx0ZXIobmFtZV9faXN0YXJ0c3dpdGg9c2VhcmNoX3Rlcm0pCisgICAgICAgIHNlY29uZGFyeV9yZXN1bHRzID0gcHJvamVjdHMuZmlsdGVyKG5hbWVfX2ljb250YWlucz1zZWFyY2hfdGVybSkuZXhjbHVkZShwa19faW49cHJpbWFyeV9yZXN1bHRzKQorCisgICAgICAgIHJlc3VsdHMgPSBbXQorCisgICAgICAgIGZvciBwcm9qZWN0IGluIGxpc3QocHJpbWFyeV9yZXN1bHRzKSArIGxpc3Qoc2Vjb25kYXJ5X3Jlc3VsdHMpOgorICAgICAgICAgICAgbmVlZGVkX2ZpZWxkcyA9IHsKKyAgICAgICAgICAgICAgICAnaWQnIDogcHJvamVjdC5waywKKyAgICAgICAgICAgICAgICAnbmFtZScgOiBwcm9qZWN0Lm5hbWUsCisgICAgICAgICAgICAgICAgJ2RldGFpbCcgOiAiIiwKKyAgICAgICAgICAgICAgICAncHJvamVjdFBhZ2VVcmwnIDogcmV2ZXJzZSgncHJvamVjdCcsIGFyZ3M9KHByb2plY3QucGssKSkKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQobmVlZGVkX2ZpZWxkcykKKworICAgICAgICByZXR1cm4gcmVzdWx0cwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3VybHMucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdXJscy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmU1NzYxCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3VybHMucHkKQEAgLTAsMCArMSwxNTMgQEAKKyMKKyMgQml0QmFrZSBUb2FzdGVyIEltcGxlbWVudGF0aW9uCisjCisjIENvcHlyaWdodCAoQykgMjAxMyAgICAgICAgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2Zyb20gZGphbmdvLmNvbmYudXJscyBpbXBvcnQgcGF0dGVybnMsIGluY2x1ZGUsIHVybAorZnJvbSBkamFuZ28udmlld3MuZ2VuZXJpYyBpbXBvcnQgUmVkaXJlY3RWaWV3LCBUZW1wbGF0ZVZpZXcKKworZnJvbSBkamFuZ28uaHR0cCBpbXBvcnQgSHR0cFJlc3BvbnNlQmFkUmVxdWVzdAorZnJvbSB0b2FzdGVyZ3VpIGltcG9ydCB0YWJsZXMKK2Zyb20gdG9hc3Rlcmd1aSBpbXBvcnQgdHlwZWFoZWFkcworCit1cmxwYXR0ZXJucyA9IHBhdHRlcm5zKCd0b2FzdGVyZ3VpLnZpZXdzJywKKyAgICAgICAgIyBsYW5kaW5nIHBhZ2UKKyAgICAgICAgdXJsKHInXmxhbmRpbmcvJCcsICdsYW5kaW5nJywgbmFtZT0nbGFuZGluZycpLAorCisgICAgICAgIHVybChyJ15idWlsZHMvJCcsICdidWlsZHMnLCBuYW1lPSdhbGwtYnVpbGRzJyksCisgICAgICAgICMgYnVpbGQgaW5mbyBuYXZpZ2F0aW9uCisgICAgICAgIHVybChyJ15idWlsZC8oP1A8YnVpbGRfaWQ+XGQrKSQnLCAnYnVpbGRkYXNoYm9hcmQnLCBuYW1lPSJidWlsZGRhc2hib2FyZCIpLAorCisgICAgICAgIHVybChyJ15idWlsZC8oP1A8YnVpbGRfaWQ+XGQrKS90YXNrcy8kJywgJ3Rhc2tzJywgbmFtZT0ndGFza3MnKSwKKyAgICAgICAgdXJsKHInXmJ1aWxkLyg/UDxidWlsZF9pZD5cZCspL3Rhc2tzLyg/UDx0YXNrX2lkPlxkKykvJCcsICd0YXNrc190YXNrJywgbmFtZT0ndGFza3NfdGFzaycpLAorICAgICAgICB1cmwocideYnVpbGQvKD9QPGJ1aWxkX2lkPlxkKykvdGFzay8oP1A8dGFza19pZD5cZCspJCcsICd0YXNrJywgbmFtZT0ndGFzaycpLAorCisgICAgICAgIHVybChyJ15idWlsZC8oP1A8YnVpbGRfaWQ+XGQrKS9yZWNpcGVzLyQnLCAncmVjaXBlcycsIG5hbWU9J3JlY2lwZXMnKSwKKyAgICAgICAgdXJsKHInXmJ1aWxkLyg/UDxidWlsZF9pZD5cZCspL3JlY2lwZS8oP1A8cmVjaXBlX2lkPlxkKykvYWN0aXZlX3RhYi8oP1A8YWN0aXZlX3RhYj5cZHsxfSkkJywgJ3JlY2lwZScsIG5hbWU9J3JlY2lwZScpLAorICAgICAgICB1cmwocideYnVpbGQvKD9QPGJ1aWxkX2lkPlxkKykvcmVjaXBlLyg/UDxyZWNpcGVfaWQ+XGQrKSQnLCAncmVjaXBlJywgbmFtZT0ncmVjaXBlJyksCisgICAgICAgIHVybChyJ15idWlsZC8oP1A8YnVpbGRfaWQ+XGQrKS9yZWNpcGVfcGFja2FnZXMvKD9QPHJlY2lwZV9pZD5cZCspJCcsICdyZWNpcGVfcGFja2FnZXMnLCBuYW1lPSdyZWNpcGVfcGFja2FnZXMnKSwKKworICAgICAgICB1cmwocideYnVpbGQvKD9QPGJ1aWxkX2lkPlxkKykvcGFja2FnZXMvJCcsICdicGFja2FnZScsIG5hbWU9J3BhY2thZ2VzJyksCisgICAgICAgIHVybChyJ15idWlsZC8oP1A8YnVpbGRfaWQ+XGQrKS9wYWNrYWdlLyg/UDxwYWNrYWdlX2lkPlxkKykkJywgJ3BhY2thZ2VfYnVpbHRfZGV0YWlsJywKKyAgICAgICAgICAgICAgICBuYW1lPSdwYWNrYWdlX2J1aWx0X2RldGFpbCcpLAorICAgICAgICB1cmwocideYnVpbGQvKD9QPGJ1aWxkX2lkPlxkKykvcGFja2FnZV9idWlsdF9kZXBlbmRlbmNpZXMvKD9QPHBhY2thZ2VfaWQ+XGQrKSQnLAorICAgICAgICAgICAgJ3BhY2thZ2VfYnVpbHRfZGVwZW5kZW5jaWVzJywgbmFtZT0ncGFja2FnZV9idWlsdF9kZXBlbmRlbmNpZXMnKSwKKyAgICAgICAgdXJsKHInXmJ1aWxkLyg/UDxidWlsZF9pZD5cZCspL3BhY2thZ2VfaW5jbHVkZWRfZGV0YWlsLyg/UDx0YXJnZXRfaWQ+XGQrKS8oP1A8cGFja2FnZV9pZD5cZCspJCcsCisgICAgICAgICAgICAncGFja2FnZV9pbmNsdWRlZF9kZXRhaWwnLCBuYW1lPSdwYWNrYWdlX2luY2x1ZGVkX2RldGFpbCcpLAorICAgICAgICB1cmwocideYnVpbGQvKD9QPGJ1aWxkX2lkPlxkKykvcGFja2FnZV9pbmNsdWRlZF9kZXBlbmRlbmNpZXMvKD9QPHRhcmdldF9pZD5cZCspLyg/UDxwYWNrYWdlX2lkPlxkKykkJywKKyAgICAgICAgICAgICdwYWNrYWdlX2luY2x1ZGVkX2RlcGVuZGVuY2llcycsIG5hbWU9J3BhY2thZ2VfaW5jbHVkZWRfZGVwZW5kZW5jaWVzJyksCisgICAgICAgIHVybChyJ15idWlsZC8oP1A8YnVpbGRfaWQ+XGQrKS9wYWNrYWdlX2luY2x1ZGVkX3JldmVyc2VfZGVwZW5kZW5jaWVzLyg/UDx0YXJnZXRfaWQ+XGQrKS8oP1A8cGFja2FnZV9pZD5cZCspJCcsCisgICAgICAgICAgICAncGFja2FnZV9pbmNsdWRlZF9yZXZlcnNlX2RlcGVuZGVuY2llcycsIG5hbWU9J3BhY2thZ2VfaW5jbHVkZWRfcmV2ZXJzZV9kZXBlbmRlbmNpZXMnKSwKKworICAgICAgICAjIGltYWdlcyBhcmUga25vd24gYXMgdGFyZ2V0cyBpbiB0aGUgaW50ZXJuYWwgbW9kZWwKKyAgICAgICAgdXJsKHInXmJ1aWxkLyg/UDxidWlsZF9pZD5cZCspL3RhcmdldC8oP1A8dGFyZ2V0X2lkPlxkKykkJywgJ3RhcmdldCcsIG5hbWU9J3RhcmdldCcpLAorICAgICAgICB1cmwocideYnVpbGQvKD9QPGJ1aWxkX2lkPlxkKykvdGFyZ2V0Lyg/UDx0YXJnZXRfaWQ+XGQrKS90YXJnZXRwa2ckJywgJ3RhcmdldHBrZycsIG5hbWU9J3RhcmdldHBrZycpLAorICAgICAgICB1cmwocideZGVudHJpZXMvYnVpbGQvKD9QPGJ1aWxkX2lkPlxkKykvdGFyZ2V0Lyg/UDx0YXJnZXRfaWQ+XGQrKSQnLCAneGhyX2RpcmluZm8nLCBuYW1lPSdkaXJpbmZvX2FqYXgnKSwKKyAgICAgICAgdXJsKHInXmJ1aWxkLyg/UDxidWlsZF9pZD5cZCspL3RhcmdldC8oP1A8dGFyZ2V0X2lkPlxkKykvZGlyaW5mbyQnLCAnZGlyaW5mbycsIG5hbWU9J2RpcmluZm8nKSwKKyAgICAgICAgdXJsKHInXmJ1aWxkLyg/UDxidWlsZF9pZD5cZCspL3RhcmdldC8oP1A8dGFyZ2V0X2lkPlxkKykvZGlyaW5mb19maWxlcGF0aC9fKD9QPGZpbGVfcGF0aD4oPzovW14vXG5dKykqKSQnLCAnZGlyaW5mbycsIG5hbWU9J2RpcmluZm9fZmlsZXBhdGgnKSwKKyAgICAgICAgdXJsKHInXmJ1aWxkLyg/UDxidWlsZF9pZD5cZCspL2NvbmZpZ3VyYXRpb24kJywgJ2NvbmZpZ3VyYXRpb24nLCBuYW1lPSdjb25maWd1cmF0aW9uJyksCisgICAgICAgIHVybChyJ15idWlsZC8oP1A8YnVpbGRfaWQ+XGQrKS9jb25maWd2YXJzJCcsICdjb25maWd2YXJzJywgbmFtZT0nY29uZmlndmFycycpLAorICAgICAgICB1cmwocideYnVpbGQvKD9QPGJ1aWxkX2lkPlxkKykvYnVpbGR0aW1lJCcsICdidWlsZHRpbWUnLCBuYW1lPSdidWlsZHRpbWUnKSwKKyAgICAgICAgdXJsKHInXmJ1aWxkLyg/UDxidWlsZF9pZD5cZCspL2NwdXVzYWdlJCcsICdjcHV1c2FnZScsIG5hbWU9J2NwdXVzYWdlJyksCisgICAgICAgIHVybChyJ15idWlsZC8oP1A8YnVpbGRfaWQ+XGQrKS9kaXNraW8kJywgJ2Rpc2tpbycsIG5hbWU9J2Rpc2tpbycpLAorCisgICAgICAgICMgaW1hZ2UgaW5mb3JtYXRpb24gZGlyCisgICAgICAgIHVybChyJ15idWlsZC8oP1A8YnVpbGRfaWQ+XGQrKS90YXJnZXQvKD9QPHRhcmdldF9pZD5cZCspL3BhY2thZ2VmaWxlLyg/UDxwYWNrYWdlZmlsZV9pZD5cZCspJCcsCisgICAgICAgICAgICAgJ2ltYWdlX2luZm9ybWF0aW9uX2RpcicsIG5hbWU9J2ltYWdlX2luZm9ybWF0aW9uX2RpcicpLAorCisgICAgICAgICMgYnVpbGQgZG93bmxvYWQgYXJ0aWZhY3QKKyAgICAgICAgdXJsKHInXmJ1aWxkLyg/UDxidWlsZF9pZD5cZCspL2FydGlmYWN0Lyg/UDxhcnRpZmFjdF90eXBlPlx3KykvaWQvKD9QPGFydGlmYWN0X2lkPlx3KyknLCAnYnVpbGRfYXJ0aWZhY3QnLCBuYW1lPSJidWlsZF9hcnRpZmFjdCIpLAorCisgICAgICAgICMgcHJvamVjdCBVUkxzCisgICAgICAgIHVybChyJ15uZXdwcm9qZWN0LyQnLCAnbmV3cHJvamVjdCcsIG5hbWU9J25ld3Byb2plY3QnKSwKKworCisgICAgICAgIHVybChyJ15wcm9qZWN0cy8kJywgJ3Byb2plY3RzJywgbmFtZT0nYWxsLXByb2plY3RzJyksCisKKyAgICAgICAgdXJsKHInXnByb2plY3QvKD9QPHBpZD5cZCspLyQnLCAncHJvamVjdCcsIG5hbWU9J3Byb2plY3QnKSwKKyAgICAgICAgdXJsKHInXnByb2plY3QvKD9QPHBpZD5cZCspL2NvbmZpZ3VyYXRpb24kJywgJ3Byb2plY3Rjb25mJywgbmFtZT0ncHJvamVjdGNvbmYnKSwKKyAgICAgICAgdXJsKHInXnByb2plY3QvKD9QPHBpZD5cZCspL2J1aWxkcy8kJywgJ3Byb2plY3RidWlsZHMnLCBuYW1lPSdwcm9qZWN0YnVpbGRzJyksCisKKyAgICAgICAgIyB0aGUgaW1wb3J0IGxheWVyIGlzIGEgcHJvamVjdC1zcGVjaWZpYyBmdW5jdGlvbmFsaXR5OworICAgICAgICB1cmwocidecHJvamVjdC8oP1A8cGlkPlxkKykvaW1wb3J0bGF5ZXIkJywgJ2ltcG9ydGxheWVyJywgbmFtZT0naW1wb3J0bGF5ZXInKSwKKworICAgICAgICAjIHRoZSB0YWJsZSBwYWdlcyB0aGF0IGhhdmUgYmVlbiBjb252ZXJ0ZWQgdG8gVG9hc3RlclRhYmxlIHdpZGdldAorICAgICAgICB1cmwocidecHJvamVjdC8oP1A8cGlkPlxkKykvbWFjaGluZXMvJCcsCisgICAgICAgICAgICB0YWJsZXMuTWFjaGluZXNUYWJsZS5hc192aWV3KHRlbXBsYXRlX25hbWU9ImdlbmVyaWMtdG9hc3RlcnRhYmxlLXBhZ2UuaHRtbCIpLAorICAgICAgICAgICAgeyAndGFibGVfbmFtZSc6IHRhYmxlcy5NYWNoaW5lc1RhYmxlLl9fbmFtZV9fLmxvd2VyKCksCisgICAgICAgICAgICAgICd0aXRsZScgOiAnQ29tcGF0aWJsZSBtYWNoaW5lcycgfSwKKyAgICAgICAgICAgIG5hbWU9InByb2plY3RtYWNoaW5lcyIpLAorCisgICAgICAgIHVybChyJ15wcm9qZWN0Lyg/UDxwaWQ+XGQrKS9yZWNpcGVzLyQnLAorICAgICAgICAgICAgdGFibGVzLlJlY2lwZXNUYWJsZS5hc192aWV3KHRlbXBsYXRlX25hbWU9ImdlbmVyaWMtdG9hc3RlcnRhYmxlLXBhZ2UuaHRtbCIpLAorICAgICAgICAgICAgeyAndGFibGVfbmFtZSc6IHRhYmxlcy5SZWNpcGVzVGFibGUuX19uYW1lX18ubG93ZXIoKSwKKyAgICAgICAgICAgICAgJ3RpdGxlJyA6ICdDb21wYXRpYmxlIHJlY2lwZXMnIH0sCisgICAgICAgICAgICBuYW1lPSJwcm9qZWN0dGFyZ2V0cyIpLAorCisgICAgICAgIHVybChyJ15wcm9qZWN0Lyg/UDxwaWQ+XGQrKS9hdmFpbGFibGVyZWNpcGVzLyQnLAorICAgICAgICAgICAgdGFibGVzLlByb2plY3RMYXllcnNSZWNpcGVzVGFibGUuYXNfdmlldyh0ZW1wbGF0ZV9uYW1lPSJnZW5lcmljLXRvYXN0ZXJ0YWJsZS1wYWdlLmh0bWwiKSwKKyAgICAgICAgICAgIHsgJ3RhYmxlX25hbWUnOiB0YWJsZXMuUHJvamVjdExheWVyc1JlY2lwZXNUYWJsZS5fX25hbWVfXy5sb3dlcigpLAorICAgICAgICAgICAgICAndGl0bGUnIDogJ1JlY2lwZXMgYXZhaWxhYmxlIGZvciBsYXllcnMgaW4gdGhlIGN1cnJlbnQgcHJvamVjdCcgfSwKKyAgICAgICAgICAgIG5hbWU9InByb2plY3RhdmFpbGFibGV0YXJnZXRzIiksCisKKyAgICAgICAgdXJsKHInXnByb2plY3QvKD9QPHBpZD5cZCspL2xheWVycy8kJywKKyAgICAgICAgICAgIHRhYmxlcy5MYXllcnNUYWJsZS5hc192aWV3KHRlbXBsYXRlX25hbWU9ImdlbmVyaWMtdG9hc3RlcnRhYmxlLXBhZ2UuaHRtbCIpLAorICAgICAgICAgICAgeyAndGFibGVfbmFtZSc6IHRhYmxlcy5MYXllcnNUYWJsZS5fX25hbWVfXy5sb3dlcigpLAorICAgICAgICAgICAgICAndGl0bGUnIDogJ0NvbXBhdGlibGUgbGF5ZXJzJyB9LAorICAgICAgICAgICAgbmFtZT0icHJvamVjdGxheWVycyIpLAorCisgICAgICAgIHVybChyJ15wcm9qZWN0Lyg/UDxwaWQ+XGQrKS9sYXllci8oP1A8bGF5ZXJpZD5cZCspJCcsCisgICAgICAgICAgICAnbGF5ZXJkZXRhaWxzJywgbmFtZT0nbGF5ZXJkZXRhaWxzJyksCisKKyAgICAgICAgdXJsKHInXnByb2plY3QvKD9QPHBpZD5cZCspL2xheWVyLyg/UDxsYXllcmlkPlxkKykvcmVjaXBlcy8kJywKKyAgICAgICAgICAgIHRhYmxlcy5MYXllclJlY2lwZXNUYWJsZS5hc192aWV3KHRlbXBsYXRlX25hbWU9ImdlbmVyaWMtdG9hc3RlcnRhYmxlLXBhZ2UuaHRtbCIpLAorICAgICAgICAgICAgeyAndGFibGVfbmFtZSc6IHRhYmxlcy5MYXllclJlY2lwZXNUYWJsZS5fX25hbWVfXy5sb3dlcigpLAorICAgICAgICAgICAgICAndGl0bGUnIDogJ0FsbCByZWNpcGVzIGluIGxheWVyJyB9LAorICAgICAgICAgICAgIG5hbWU9dGFibGVzLkxheWVyUmVjaXBlc1RhYmxlLl9fbmFtZV9fLmxvd2VyKCkpLAorCisgICAgICAgIHVybChyJ15wcm9qZWN0Lyg/UDxwaWQ+XGQrKS9sYXllci8oP1A8bGF5ZXJpZD5cZCspL21hY2hpbmVzLyQnLAorICAgICAgICAgICAgdGFibGVzLkxheWVyTWFjaGluZXNUYWJsZS5hc192aWV3KHRlbXBsYXRlX25hbWU9ImdlbmVyaWMtdG9hc3RlcnRhYmxlLXBhZ2UuaHRtbCIpLAorICAgICAgICAgICAgeyAndGFibGVfbmFtZSc6IHRhYmxlcy5MYXllck1hY2hpbmVzVGFibGUuX19uYW1lX18ubG93ZXIoKSwKKyAgICAgICAgICAgICAgJ3RpdGxlJyA6ICdBbGwgbWFjaGluZXMgaW4gbGF5ZXInIH0sCisgICAgICAgICAgICBuYW1lPXRhYmxlcy5MYXllck1hY2hpbmVzVGFibGUuX19uYW1lX18ubG93ZXIoKSksCisKKworICAgICAgICAjIHR5cGVhaGVhZCBhcGkgZW5kIHBvaW50cworICAgICAgICB1cmwocideeGhyX3R5cGVhaGVhZC8oP1A8cGlkPlxkKykvbGF5ZXJzJCcsCisgICAgICAgICAgICB0eXBlYWhlYWRzLkxheWVyc1R5cGVBaGVhZC5hc192aWV3KCksIG5hbWU9J3hocl9sYXllcnN0eXBlYWhlYWQnKSwKKyAgICAgICAgdXJsKHInXnhocl90eXBlYWhlYWQvKD9QPHBpZD5cZCspL21hY2hpbmVzJCcsCisgICAgICAgICAgICB0eXBlYWhlYWRzLk1hY2hpbmVzVHlwZUFoZWFkLmFzX3ZpZXcoKSwgbmFtZT0neGhyX21hY2hpbmVzdHlwZWFoZWFkJyksCisgICAgICAgIHVybChyJ154aHJfdHlwZWFoZWFkLyg/UDxwaWQ+XGQrKS9yZWNpcGVzJCcsCisgICAgICAgICAgICB0eXBlYWhlYWRzLlJlY2lwZXNUeXBlQWhlYWQuYXNfdmlldygpLCBuYW1lPSd4aHJfcmVjaXBlc3R5cGVhaGVhZCcpLAorICAgICAgICB1cmwocideeGhyX3R5cGVhaGVhZC9wcm9qZWN0cyQnLAorICAgICAgICAgICAgdHlwZWFoZWFkcy5Qcm9qZWN0c1R5cGVBaGVhZC5hc192aWV3KCksIG5hbWU9J3hocl9wcm9qZWN0c3R5cGVhaGVhZCcpLAorCisKKworICAgICAgICB1cmwocideeGhyX3Rlc3RyZWxlYXNlY2hhbmdlLyg/UDxwaWQ+XGQrKSQnLCAneGhyX3Rlc3RyZWxlYXNlY2hhbmdlJywKKyAgICAgICAgICAgIG5hbWU9J3hocl90ZXN0cmVsZWFzZWNoYW5nZScpLAorICAgICAgICB1cmwocideeGhyX2NvbmZpZ3ZhcmVkaXQvKD9QPHBpZD5cZCspJCcsICd4aHJfY29uZmlndmFyZWRpdCcsCisgICAgICAgICAgICBuYW1lPSd4aHJfY29uZmlndmFyZWRpdCcpLAorCisgICAgICAgIHVybChyJ154aHJfaW1wb3J0bGF5ZXIvJCcsICd4aHJfaW1wb3J0bGF5ZXInLCBuYW1lPSd4aHJfaW1wb3J0bGF5ZXInKSwKKyAgICAgICAgdXJsKHInXnhocl91cGRhdGVsYXllci8kJywgJ3hocl91cGRhdGVsYXllcicsIG5hbWU9J3hocl91cGRhdGVsYXllcicpLAorCisgICAgICAgICMgSlMgVW5pdCB0ZXN0cworICAgICAgICB1cmwocideanMtdW5pdC10ZXN0cy8kJywgJ2pzdW5pdHRlc3RzJywgbmFtZT0nanMtdW5pdC10ZXN0cycpLAorCisgICAgICAgICMgZGVmYXVsdCByZWRpcmVjdGlvbgorICAgICAgICB1cmwocideJCcsIFJlZGlyZWN0Vmlldy5hc192aWV3KCB1cmw9ICdsYW5kaW5nJykpLAorKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3ZpZXdzLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVyZ3VpL3ZpZXdzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRlOGY2OWUKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvdmlld3MucHkKQEAgLTAsMCArMSwyOTEyIEBACisjCisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIworIyBCaXRCYWtlIFRvYXN0ZXIgSW1wbGVtZW50YXRpb24KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEzICAgICAgICBJbnRlbCBDb3Jwb3JhdGlvbgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworIyBweWxpbnQ6IGRpc2FibGU9bWV0aG9kLWhpZGRlbgorIyBHaXZlcyBFOjg0OCwgNDogQW4gYXR0cmlidXRlIGRlZmluZWQgaW4ganNvbi5lbmNvZGVyIGxpbmUgMTYyIGhpZGVzIHRoaXMgbWV0aG9kIChtZXRob2QtaGlkZGVuKQorIyB3aGljaCBpcyBhbiBpbnZhbGlkIHdhcm5pbmcKKworaW1wb3J0IG9wZXJhdG9yLHJlCisKK2Zyb20gZGphbmdvLmRiLm1vZGVscyBpbXBvcnQgRiwgUSwgU3VtLCBDb3VudCwgTWF4Citmcm9tIGRqYW5nby5kYiBpbXBvcnQgSW50ZWdyaXR5RXJyb3IKK2Zyb20gZGphbmdvLnNob3J0Y3V0cyBpbXBvcnQgcmVuZGVyLCByZWRpcmVjdAorZnJvbSBvcm0ubW9kZWxzIGltcG9ydCBCdWlsZCwgVGFyZ2V0LCBUYXNrLCBMYXllciwgTGF5ZXJfVmVyc2lvbiwgUmVjaXBlLCBMb2dNZXNzYWdlLCBWYXJpYWJsZQorZnJvbSBvcm0ubW9kZWxzIGltcG9ydCBUYXNrX0RlcGVuZGVuY3ksIFJlY2lwZV9EZXBlbmRlbmN5LCBQYWNrYWdlLCBQYWNrYWdlX0ZpbGUsIFBhY2thZ2VfRGVwZW5kZW5jeQorZnJvbSBvcm0ubW9kZWxzIGltcG9ydCBUYXJnZXRfSW5zdGFsbGVkX1BhY2thZ2UsIFRhcmdldF9GaWxlLCBUYXJnZXRfSW1hZ2VfRmlsZSwgQnVpbGRBcnRpZmFjdAorZnJvbSBvcm0ubW9kZWxzIGltcG9ydCBCaXRiYWtlVmVyc2lvbgorZnJvbSBibGRjb250cm9sIGltcG9ydCBiYmNvbnRyb2xsZXIKK2Zyb20gZGphbmdvLnZpZXdzLmRlY29yYXRvcnMuY2FjaGUgaW1wb3J0IGNhY2hlX2NvbnRyb2wKK2Zyb20gZGphbmdvLmNvcmUudXJscmVzb2x2ZXJzIGltcG9ydCByZXZlcnNlLCByZXNvbHZlCitmcm9tIGRqYW5nby5jb3JlLmV4Y2VwdGlvbnMgaW1wb3J0IE11bHRpcGxlT2JqZWN0c1JldHVybmVkCitmcm9tIGRqYW5nby5jb3JlLnBhZ2luYXRvciBpbXBvcnQgUGFnaW5hdG9yLCBFbXB0eVBhZ2UsIFBhZ2VOb3RBbkludGVnZXIKK2Zyb20gZGphbmdvLmh0dHAgaW1wb3J0IEh0dHBSZXNwb25zZUJhZFJlcXVlc3QsIEh0dHBSZXNwb25zZU5vdEZvdW5kCitmcm9tIGRqYW5nby51dGlscyBpbXBvcnQgdGltZXpvbmUKK2Zyb20gZGphbmdvLnV0aWxzLmh0bWwgaW1wb3J0IGVzY2FwZQorZnJvbSBkYXRldGltZSBpbXBvcnQgdGltZWRlbHRhLCBkYXRldGltZSwgZGF0ZQorZnJvbSBkamFuZ28udXRpbHMgaW1wb3J0IGZvcm1hdHMKK2Zyb20gdG9hc3Rlcmd1aS50ZW1wbGF0ZXRhZ3MucHJvamVjdHRhZ3MgaW1wb3J0IGpzb24gYXMganNvbmZpbHRlcgoraW1wb3J0IGpzb24KK2Zyb20gb3MucGF0aCBpbXBvcnQgZGlybmFtZQoraW1wb3J0IGl0ZXJ0b29scworCitpbXBvcnQgbG9nZ2luZworCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigidG9hc3RlciIpCisKKyMgYWxsIG5ldyBzZXNzaW9ucyBzaG91bGQgY29tZSB0aHJvdWdoIHRoZSBsYW5kaW5nIHBhZ2U7CisjIGRldGVybWluZSBpbiB3aGljaCBtb2RlIHdlIGFyZSBydW5uaW5nIGluLCBhbmQgcmVkaXJlY3QgYXBwcm9wcmlhdGVseQorZGVmIGxhbmRpbmcocmVxdWVzdCk6CisgICAgIyB3ZSBvbmx5IHJlZGlyZWN0IHRvIHByb2plY3RzIHBhZ2UgaWYgdGhlcmUgaXMgYSB1c2VyLWdlbmVyYXRlZCBwcm9qZWN0CisgICAgdXNlcl9wcm9qZWN0cyA9IFByb2plY3Qub2JqZWN0cy5maWx0ZXIoaXNfZGVmYXVsdCA9IEZhbHNlKQorICAgIGhhc191c2VyX3Byb2plY3QgPSB1c2VyX3Byb2plY3RzLmNvdW50KCkgPiAwCisKKyAgICBpZiBCdWlsZC5vYmplY3RzLmNvdW50KCkgPT0gMCBhbmQgaGFzX3VzZXJfcHJvamVjdDoKKyAgICAgICAgcmV0dXJuIHJlZGlyZWN0KHJldmVyc2UoJ2FsbC1wcm9qZWN0cycpLCBwZXJtYW5lbnQgPSBGYWxzZSkKKworICAgIGlmIEJ1aWxkLm9iamVjdHMuYWxsKCkuY291bnQoKSA+IDA6CisgICAgICAgIHJldHVybiByZWRpcmVjdChyZXZlcnNlKCdhbGwtYnVpbGRzJyksIHBlcm1hbmVudCA9IEZhbHNlKQorCisgICAgY29udGV4dCA9IHsnbHZzX25vcycgOiBMYXllcl9WZXJzaW9uLm9iamVjdHMuYWxsKCkuY291bnQoKX0KKworICAgIHJldHVybiByZW5kZXIocmVxdWVzdCwgJ2xhbmRpbmcuaHRtbCcsIGNvbnRleHQpCisKKworCisjIHJldHVybnMgYSBsaXN0IGZvciBtb3N0IHJlY2VudCBidWlsZHM7CitkZWYgX2dldF9sYXRlc3RfYnVpbGRzKHByaj1Ob25lKToKKyAgICBxdWVyeXNldCA9IEJ1aWxkLm9iamVjdHMuYWxsKCkKKworICAgIGlmIHByaiBpcyBub3QgTm9uZToKKyAgICAgICAgcXVlcnlzZXQgPSBxdWVyeXNldC5maWx0ZXIocHJvamVjdCA9IHByaikKKworICAgIHJldHVybiBsaXN0KGl0ZXJ0b29scy5jaGFpbigKKyAgICAgICAgcXVlcnlzZXQuZmlsdGVyKG91dGNvbWU9QnVpbGQuSU5fUFJPR1JFU1MpLm9yZGVyX2J5KCItcGsiKSwKKyAgICAgICAgcXVlcnlzZXQuZmlsdGVyKG91dGNvbWVfX2x0PUJ1aWxkLklOX1BST0dSRVNTKS5vcmRlcl9ieSgiLXBrIilbOjNdICkpCisKKworIyBhIEpTT04tYWJsZSBkaWN0IG9mIHJlY2VudCBidWlsZHM7IGZvciB1c2UgaW4gdGhlIFByb2plY3QgcGFnZSwgeGhyXyB1cGRhdGVzLCAgYW5kIG90aGVyIHBsYWNlcywgYXMgbmVlZGVkCitkZWYgX3Byb2plY3RfcmVjZW50X2J1aWxkX2xpc3QocHJqKToKKyAgICBkYXRhID0gW10KKyAgICAjIHRha2UgdGhlIG1vc3QgcmVjZW50IDMgY29tcGxldGVkIGJ1aWxkcywgcGx1cyBhbnkgYnVpbGRzIGluIHByb2dyZXNzCisgICAgZm9yIHggaW4gX2dldF9sYXRlc3RfYnVpbGRzKHByaik6CisgICAgICAgIGQgPSB7CisgICAgICAgICAgICAiaWQiOiAgeC5waywKKyAgICAgICAgICAgICJ0YXJnZXRzIiA6IG1hcChsYW1iZGEgeTogeyJ0YXJnZXQiOiB5LnRhcmdldCwgInRhc2siOiB5LnRhc2sgfSwgeC50YXJnZXRfc2V0LmFsbCgpKSwgIyBUT0RPOiBjcmVhdGUgdGhlIHRhc2sgZW50cnkgaW4gdGhlIFRhcmdldCB0YWJsZQorICAgICAgICAgICAgInN0YXR1cyI6IHguZ2V0X2N1cnJlbnRfc3RhdHVzKCksCisgICAgICAgICAgICAiZXJyb3JzIjogbWFwKGxhbWJkYSB5OiB7InR5cGUiOiB5LmxpbmVubywgIm1zZyI6IHkubWVzc2FnZSwgInRiIjogeS5wYXRobmFtZX0sICh4LmxvZ21lc3NhZ2Vfc2V0LmZpbHRlcihsZXZlbF9fZ3RlPUxvZ01lc3NhZ2UuV0FSTklORyl8eC5sb2dtZXNzYWdlX3NldC5maWx0ZXIobGV2ZWw9TG9nTWVzc2FnZS5FWENFUFRJT04pKSksCisgICAgICAgICAgICAidXBkYXRlZCI6IHguY29tcGxldGVkX29uLnN0cmZ0aW1lKCclcycpKyIwMDAiLAorICAgICAgICAgICAgImNvbW1hbmRfdGltZSI6ICh4LmNvbXBsZXRlZF9vbiAtIHguc3RhcnRlZF9vbikudG90YWxfc2Vjb25kcygpLAorICAgICAgICAgICAgImJyX3BhZ2VfdXJsIjogcmV2ZXJzZSgnYnVpbGRkYXNoYm9hcmQnLCBhcmdzPSh4LnBrLCkgKSwKKyAgICAgICAgICAgICJidWlsZCIgOiBtYXAoIGxhbWJkYSB5OiB7ImlkIjogeS5waywKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdGF0dXMiOiB5LmdldF9vdXRjb21lX2Rpc3BsYXkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb21wbGV0ZWRfb24iIDogeS5jb21wbGV0ZWRfb24uc3RyZnRpbWUoJyVzJykrIjAwMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiYnVpbGRfdGltZSIgOiAoeS5jb21wbGV0ZWRfb24gLSB5LnN0YXJ0ZWRfb24pLnRvdGFsX3NlY29uZHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJidWlsZF9wYWdlX3VybCIgOiByZXZlcnNlKCdidWlsZGRhc2hib2FyZCcsIGFyZ3M9KHkucGssKSksCisgICAgICAgICAgICAgICAgICAgICAgICAnYnVpbGRfdGltZV9wYWdlX3VybCc6IHJldmVyc2UoJ2J1aWxkdGltZScsIGFyZ3M9KHkucGssKSksCisgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3JzIjogeS5lcnJvcnMuY291bnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ3YXJuaW5ncyI6IHkud2FybmluZ3MuY291bnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb21wbGV0ZXBlciI6IHkuY29tcGxldGVwZXIoKSBpZiB5Lm91dGNvbWUgPT0gQnVpbGQuSU5fUFJPR1JFU1MgZWxzZSAiMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiZXRhIjogeS5ldGEoKS5zdHJmdGltZSgnJXMnKSsiMDAwIiBpZiB5Lm91dGNvbWUgPT0gQnVpbGQuSU5fUFJPR1JFU1MgZWxzZSAiMCIsCisgICAgICAgICAgICAgICAgICAgICAgICB9LCBbeF0pLAorICAgICAgICAgICAgfQorICAgICAgICBkYXRhLmFwcGVuZChkKQorCisgICAgcmV0dXJuIGRhdGEKKworCisKK2RlZiBvYmp0b2pzb24ob2JqKToKKyAgICBmcm9tIGRqYW5nby5kYi5tb2RlbHMucXVlcnkgaW1wb3J0IFF1ZXJ5U2V0CisgICAgZnJvbSBkamFuZ28uZGIubW9kZWxzIGltcG9ydCBNb2RlbAorCisgICAgaWYgaXNpbnN0YW5jZShvYmosIGRhdGV0aW1lKToKKyAgICAgICAgcmV0dXJuIG9iai5pc29mb3JtYXQoKQorICAgIGVsaWYgaXNpbnN0YW5jZShvYmosIHRpbWVkZWx0YSk6CisgICAgICAgIHJldHVybiBvYmoudG90YWxfc2Vjb25kcygpCisgICAgZWxpZiBpc2luc3RhbmNlKG9iaiwgUXVlcnlTZXQpIG9yIGlzaW5zdGFuY2Uob2JqLCBzZXQpOgorICAgICAgICByZXR1cm4gbGlzdChvYmopCisgICAgZWxpZiB0eXBlKG9iaikuX19uYW1lX18gPT0gIlJlbGF0ZWRNYW5hZ2VyIjoKKyAgICAgICAgcmV0dXJuIFt4LnBrIGZvciB4IGluIG9iai5hbGwoKV0KKyAgICBlbGlmIGhhc2F0dHIoIG9iaiwgJ19fZGljdF9fJykgYW5kIGlzaW5zdGFuY2Uob2JqLCBNb2RlbCk6CisgICAgICAgIGQgPSBvYmouX19kaWN0X18KKyAgICAgICAgbmQgPSBkaWN0KGQpCisgICAgICAgIGZvciBkaSBpbiBkLmtleXMoKToKKyAgICAgICAgICAgIGlmIGRpLnN0YXJ0c3dpdGgoIl8iKToKKyAgICAgICAgICAgICAgICBkZWwgbmRbZGldCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZFtkaV0sIE1vZGVsKToKKyAgICAgICAgICAgICAgICBuZFtkaV0gPSBkW2RpXS5waworICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKGRbZGldLCBpbnQpIGFuZCBoYXNhdHRyKG9iaiwgImdldF8lc19kaXNwbGF5IiAlIGRpKToKKyAgICAgICAgICAgICAgICBuZFtkaV0gPSBnZXRhdHRyKG9iaiwgImdldF8lc19kaXNwbGF5IiAlIGRpKSgpCisgICAgICAgIHJldHVybiBuZAorICAgIGVsaWYgaXNpbnN0YW5jZSggb2JqLCB0eXBlKGxhbWJkYSB4OngpKToKKyAgICAgICAgaW1wb3J0IGluc3BlY3QKKyAgICAgICAgcmV0dXJuIGluc3BlY3QuZ2V0c291cmNlbGluZXMob2JqKVswXQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiVW5zZXJpYWxpemFibGUgb2JqZWN0ICVzICglcykgb2YgdHlwZSAlcyIgJSAoIG9iaiwgZGlyKG9iaiksIHR5cGUob2JqKSkpCisKKworZGVmIF90ZW1wbGF0ZV9yZW5kZXJlcih0ZW1wbGF0ZSk6CisgICAgZGVmIGZ1bmNfd3JhcHBlcih2aWV3KToKKyAgICAgICAgZGVmIHJldHVybmVkX3dyYXBwZXIocmVxdWVzdCwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjb250ZXh0ID0gdmlldyhyZXF1ZXN0LCAqYXJncywgKiprd2FyZ3MpCisgICAgICAgICAgICBleGNlcHQgUmVkaXJlY3RFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRfcmVkaXJlY3RfcmVzcG9uc2UoKQorCisgICAgICAgICAgICBpZiByZXF1ZXN0LkdFVC5nZXQoJ2Zvcm1hdCcsIE5vbmUpID09ICdqc29uJzoKKyAgICAgICAgICAgICAgICAjIG9iamVjdHMgaXMgYSBzcGVjaWFsIGtleXdvcmQgLSBpdCdzIGEgUGFnZSwgYnV0IHdlIG5lZWQgdGhlIGFjdHVhbCBvYmplY3RzIGhlcmUKKyAgICAgICAgICAgICAgICAjIGluIFhIUiwgdGhlIG9iamVjdHMgY29tZSBpbiB0aGUgInJvd3MiIHByb3BlcnR5CisgICAgICAgICAgICAgICAgaWYgIm9iamVjdHMiIGluIGNvbnRleHQ6CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRbInJvd3MiXSA9IGNvbnRleHRbIm9iamVjdHMiXS5vYmplY3RfbGlzdAorICAgICAgICAgICAgICAgICAgICBkZWwgY29udGV4dFsib2JqZWN0cyJdCisKKyAgICAgICAgICAgICAgICAjIHdlJ3JlIGFib3V0IHRvIHJldHVybjsgdG8ga2VlcCB1cCB3aXRoIHRoZSBYSFIgQVBJLCB3ZSBzZXQgdGhlIGVycm9yIHRvIE9LCisgICAgICAgICAgICAgICAgY29udGV4dFsiZXJyb3IiXSA9ICJvayIKKworICAgICAgICAgICAgICAgIHJldHVybiBIdHRwUmVzcG9uc2UoanNvbmZpbHRlcihjb250ZXh0LCBkZWZhdWx0PW9ianRvanNvbiApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZSA9ICJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04IikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlbmRlcihyZXF1ZXN0LCB0ZW1wbGF0ZSwgY29udGV4dCkKKyAgICAgICAgcmV0dXJuIHJldHVybmVkX3dyYXBwZXIKKyAgICByZXR1cm4gZnVuY193cmFwcGVyCisKKworZGVmIF9sdl90b19kaWN0KHByaiwgeCA9IE5vbmUpOgorICAgIGlmIHggaXMgTm9uZToKKyAgICAgICAgZGVmIHdyYXBwZXIoeCk6CisgICAgICAgICAgICByZXR1cm4gX2x2X3RvX2RpY3QocHJqLCB4KQorICAgICAgICByZXR1cm4gd3JhcHBlcgorCisgICAgcmV0dXJuIHsiaWQiOiB4LnBrLAorICAgICAgICAgICAgIm5hbWUiOiB4LmxheWVyLm5hbWUsCisgICAgICAgICAgICAidG9vbHRpcCI6ICIlcyB8ICVzIiAlICh4LmxheWVyLnZjc191cmwseC5nZXRfdmNzX3JlZmVyZW5jZSgpKSwKKyAgICAgICAgICAgICJkZXRhaWwiOiAiKCVzIiAlIHgubGF5ZXIudmNzX3VybCArICgiKSIgaWYgeC51cF9icmFuY2ggPT0gTm9uZSBlbHNlICIgfCAiK3guZ2V0X3Zjc19yZWZlcmVuY2UoKSsiKSIpLAorICAgICAgICAgICAgImdpdHVybCI6IHgubGF5ZXIudmNzX3VybCwKKyAgICAgICAgICAgICJsYXllcmRldGFpbHVybCIgOiByZXZlcnNlKCdsYXllcmRldGFpbHMnLCBhcmdzPShwcmouaWQseC5waykpLAorICAgICAgICAgICAgInJldmlzaW9uIiA6IHguZ2V0X3Zjc19yZWZlcmVuY2UoKSwKKyAgICAgICAgICAgfQorCisKK2RlZiBfYnVpbGRfcGFnZV9yYW5nZShwYWdpbmF0b3IsIGluZGV4ID0gMSk6CisgICAgdHJ5OgorICAgICAgICBwYWdlID0gcGFnaW5hdG9yLnBhZ2UoaW5kZXgpCisgICAgZXhjZXB0IFBhZ2VOb3RBbkludGVnZXI6CisgICAgICAgIHBhZ2UgPSBwYWdpbmF0b3IucGFnZSgxKQorICAgIGV4Y2VwdCAgRW1wdHlQYWdlOgorICAgICAgICBwYWdlID0gcGFnaW5hdG9yLnBhZ2UocGFnaW5hdG9yLm51bV9wYWdlcykKKworCisgICAgcGFnZS5wYWdlX3JhbmdlID0gW3BhZ2UubnVtYmVyXQorICAgIGNydF9yYW5nZSA9IDAKKyAgICBmb3IgaSBpbiByYW5nZSgxLDUpOgorICAgICAgICBpZiAocGFnZS5udW1iZXIgKyBpKSA8PSBwYWdpbmF0b3IubnVtX3BhZ2VzOgorICAgICAgICAgICAgcGFnZS5wYWdlX3JhbmdlID0gcGFnZS5wYWdlX3JhbmdlICsgWyBwYWdlLm51bWJlciArIGldCisgICAgICAgICAgICBjcnRfcmFuZ2UgKz0xCisgICAgICAgIGlmIChwYWdlLm51bWJlciAtIGkpID4gMDoKKyAgICAgICAgICAgIHBhZ2UucGFnZV9yYW5nZSA9ICBbcGFnZS5udW1iZXIgLWldICsgcGFnZS5wYWdlX3JhbmdlCisgICAgICAgICAgICBjcnRfcmFuZ2UgKz0xCisgICAgICAgIGlmIGNydF9yYW5nZSA9PSA0OgorICAgICAgICAgICAgYnJlYWsKKyAgICByZXR1cm4gcGFnZQorCisKK2RlZiBfdmVyaWZ5X3BhcmFtZXRlcnMoZywgbWFuZGF0b3J5X3BhcmFtZXRlcnMpOgorICAgIG1pc3MgPSBbXQorICAgIGZvciBtcCBpbiBtYW5kYXRvcnlfcGFyYW1ldGVyczoKKyAgICAgICAgaWYgbm90IG1wIGluIGc6CisgICAgICAgICAgICBtaXNzLmFwcGVuZChtcCkKKyAgICBpZiBsZW4obWlzcyk6CisgICAgICAgIHJldHVybiBtaXNzCisgICAgcmV0dXJuIE5vbmUKKworZGVmIF9yZWRpcmVjdF9wYXJhbWV0ZXJzKHZpZXcsIGcsIG1hbmRhdG9yeV9wYXJhbWV0ZXJzLCAqYXJncywgKiprd2FyZ3MpOgorICAgIGltcG9ydCB1cmxsaWIKKyAgICB1cmwgPSByZXZlcnNlKHZpZXcsIGt3YXJncz1rd2FyZ3MpCisgICAgcGFyYW1zID0ge30KKyAgICBmb3IgaSBpbiBnOgorICAgICAgICBwYXJhbXNbaV0gPSBnW2ldCisgICAgZm9yIGkgaW4gbWFuZGF0b3J5X3BhcmFtZXRlcnM6CisgICAgICAgIGlmIG5vdCBpIGluIHBhcmFtczoKKyAgICAgICAgICAgIHBhcmFtc1tpXSA9IHVybGxpYi51bnF1b3RlKHN0cihtYW5kYXRvcnlfcGFyYW1ldGVyc1tpXSkpCisKKyAgICByZXR1cm4gcmVkaXJlY3QodXJsICsgIj8lcyIgJSB1cmxsaWIudXJsZW5jb2RlKHBhcmFtcyksIHBlcm1hbmVudCA9IEZhbHNlLCAqKmt3YXJncykKKworY2xhc3MgUmVkaXJlY3RFeGNlcHRpb24oRXhjZXB0aW9uKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdmlldywgZywgbWFuZGF0b3J5X3BhcmFtZXRlcnMsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHN1cGVyKFJlZGlyZWN0RXhjZXB0aW9uLCBzZWxmKS5fX2luaXRfXygpCisgICAgICAgIHNlbGYudmlldyA9IHZpZXcKKyAgICAgICAgc2VsZi5nID0gZworICAgICAgICBzZWxmLm1hbmRhdG9yeV9wYXJhbWV0ZXJzID0gbWFuZGF0b3J5X3BhcmFtZXRlcnMKKyAgICAgICAgc2VsZi5vYXJncyAgPSBhcmdzCisgICAgICAgIHNlbGYub2t3YXJncyA9IGt3YXJncworCisgICAgZGVmIGdldF9yZWRpcmVjdF9yZXNwb25zZShzZWxmKToKKyAgICAgICAgcmV0dXJuIF9yZWRpcmVjdF9wYXJhbWV0ZXJzKHNlbGYudmlldywgc2VsZi5nLCBzZWxmLm1hbmRhdG9yeV9wYXJhbWV0ZXJzLCBzZWxmLm9hcmdzLCAqKnNlbGYub2t3YXJncykKKworRklFTERfU0VQQVJBVE9SID0gIjoiCitBTkRfVkFMVUVfU0VQQVJBVE9SID0gIiEiCitPUl9WQUxVRV9TRVBBUkFUT1IgPSAifCIKK0RFU0NFTkRJTkcgPSAiLSIKKworZGVmIF9fZ2V0X3FfZm9yX3ZhbChuYW1lLCB2YWx1ZSk6CisgICAgaWYgIk9SIiBpbiB2YWx1ZToKKyAgICAgICAgcmV0dXJuIHJlZHVjZShvcGVyYXRvci5vcl8sIG1hcChsYW1iZGEgeDogX19nZXRfcV9mb3JfdmFsKG5hbWUsIHgpLCBbIHggZm9yIHggaW4gdmFsdWUuc3BsaXQoIk9SIikgXSkpCisgICAgaWYgIkFORCIgaW4gdmFsdWU6CisgICAgICAgIHJldHVybiByZWR1Y2Uob3BlcmF0b3IuYW5kXywgbWFwKGxhbWJkYSB4OiBfX2dldF9xX2Zvcl92YWwobmFtZSwgeCksIFsgeCBmb3IgeCBpbiB2YWx1ZS5zcGxpdCgiQU5EIikgXSkpCisgICAgaWYgdmFsdWUuc3RhcnRzd2l0aCgiTk9UIik6CisgICAgICAgIHZhbHVlID0gdmFsdWVbMzpdCisgICAgICAgIGlmIHZhbHVlID09ICdOb25lJzoKKyAgICAgICAgICAgIHZhbHVlID0gTm9uZQorICAgICAgICBrd2FyZ3MgPSB7IG5hbWUgOiB2YWx1ZSB9CisgICAgICAgIHJldHVybiB+USgqKmt3YXJncykKKyAgICBlbHNlOgorICAgICAgICBpZiB2YWx1ZSA9PSAnTm9uZSc6CisgICAgICAgICAgICB2YWx1ZSA9IE5vbmUKKyAgICAgICAga3dhcmdzID0geyBuYW1lIDogdmFsdWUgfQorICAgICAgICByZXR1cm4gUSgqKmt3YXJncykKKworZGVmIF9nZXRfZmlsdGVyaW5nX3F1ZXJ5KGZpbHRlcl9zdHJpbmcpOgorCisgICAgc2VhcmNoX3Rlcm1zID0gZmlsdGVyX3N0cmluZy5zcGxpdChGSUVMRF9TRVBBUkFUT1IpCisgICAgYW5kX2tleXMgPSBzZWFyY2hfdGVybXNbMF0uc3BsaXQoQU5EX1ZBTFVFX1NFUEFSQVRPUikKKyAgICBhbmRfdmFsdWVzID0gc2VhcmNoX3Rlcm1zWzFdLnNwbGl0KEFORF9WQUxVRV9TRVBBUkFUT1IpCisKKyAgICBhbmRfcXVlcnkgPSBbXQorICAgIGZvciBrdiBpbiB6aXAoYW5kX2tleXMsIGFuZF92YWx1ZXMpOgorICAgICAgICBvcl9rZXlzID0ga3ZbMF0uc3BsaXQoT1JfVkFMVUVfU0VQQVJBVE9SKQorICAgICAgICBvcl92YWx1ZXMgPSBrdlsxXS5zcGxpdChPUl9WQUxVRV9TRVBBUkFUT1IpCisgICAgICAgIHF1ZXJ5ZGljdCA9IGRpY3QoemlwKG9yX2tleXMsIG9yX3ZhbHVlcykpCisgICAgICAgIGFuZF9xdWVyeS5hcHBlbmQocmVkdWNlKG9wZXJhdG9yLm9yXywgbWFwKGxhbWJkYSB4OiBfX2dldF9xX2Zvcl92YWwoeCwgcXVlcnlkaWN0W3hdKSwgW2sgZm9yIGsgaW4gcXVlcnlkaWN0XSkpKQorCisgICAgcmV0dXJuIHJlZHVjZShvcGVyYXRvci5hbmRfLCBbayBmb3IgayBpbiBhbmRfcXVlcnldKQorCitkZWYgX2dldF90b2dnbGVfb3JkZXIocmVxdWVzdCwgb3JkZXJrZXksIHRvZ2dsZV9yZXZlcnNlID0gRmFsc2UpOgorICAgIGlmIHRvZ2dsZV9yZXZlcnNlOgorICAgICAgICByZXR1cm4gIiVzOisiICUgb3JkZXJrZXkgaWYgcmVxdWVzdC5HRVQuZ2V0KCdvcmRlcmJ5JywgIiIpID09ICIlczotIiAlIG9yZGVya2V5IGVsc2UgIiVzOi0iICUgb3JkZXJrZXkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gIiVzOi0iICUgb3JkZXJrZXkgaWYgcmVxdWVzdC5HRVQuZ2V0KCdvcmRlcmJ5JywgIiIpID09ICIlczorIiAlIG9yZGVya2V5IGVsc2UgIiVzOisiICUgb3JkZXJrZXkKKworZGVmIF9nZXRfdG9nZ2xlX29yZGVyX2ljb24ocmVxdWVzdCwgb3JkZXJrZXkpOgorICAgIGlmIHJlcXVlc3QuR0VULmdldCgnb3JkZXJieScsICIiKSA9PSAiJXM6KyIlb3JkZXJrZXk6CisgICAgICAgIHJldHVybiAiZG93biIKKyAgICBlbGlmIHJlcXVlc3QuR0VULmdldCgnb3JkZXJieScsICIiKSA9PSAiJXM6LSIlb3JkZXJrZXk6CisgICAgICAgIHJldHVybiAidXAiCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIE5vbmUKKworIyB3ZSBjaGVjayB0aGF0IHRoZSBpbnB1dCBjb21lcyBpbiBhIHZhbGlkIGZvcm0gdGhhdCB3ZSBjYW4gcmVjb2duaXplCitkZWYgX3ZhbGlkYXRlX2lucHV0KGZpZWxkX2lucHV0LCBtb2RlbCk6CisKKyAgICBpbnZhbGlkID0gTm9uZQorCisgICAgaWYgZmllbGRfaW5wdXQ6CisgICAgICAgIGZpZWxkX2lucHV0X2xpc3QgPSBmaWVsZF9pbnB1dC5zcGxpdChGSUVMRF9TRVBBUkFUT1IpCisKKyAgICAgICAgIyBDaGVjayB3ZSBoYXZlIG9ubHkgb25lIGNvbG9uCisgICAgICAgIGlmIGxlbihmaWVsZF9pbnB1dF9saXN0KSAhPSAyOgorICAgICAgICAgICAgaW52YWxpZCA9ICJXZSBoYXZlIGFuIGludmFsaWQgbnVtYmVyIG9mIHNlcGFyYXRvcnM6ICIgKyBmaWVsZF9pbnB1dCArICIgLT4gIiArIHN0cihmaWVsZF9pbnB1dF9saXN0KQorICAgICAgICAgICAgcmV0dXJuIE5vbmUsIGludmFsaWQKKworICAgICAgICAjIENoZWNrIHdlIGhhdmUgYW4gZXF1YWwgbnVtYmVyIG9mIHRlcm1zIGJvdGggc2lkZXMgb2YgdGhlIGNvbG9uCisgICAgICAgIGlmIGxlbihmaWVsZF9pbnB1dF9saXN0WzBdLnNwbGl0KEFORF9WQUxVRV9TRVBBUkFUT1IpKSAhPSBsZW4oZmllbGRfaW5wdXRfbGlzdFsxXS5zcGxpdChBTkRfVkFMVUVfU0VQQVJBVE9SKSk6CisgICAgICAgICAgICBpbnZhbGlkID0gIk5vdCBhbGwgYXJnIG5hbWVzIGdvdCB2YWx1ZXMiCisgICAgICAgICAgICByZXR1cm4gTm9uZSwgaW52YWxpZCArIHN0cihmaWVsZF9pbnB1dF9saXN0KQorCisgICAgICAgICMgQ2hlY2sgd2UgYXJlIGxvb2tpbmcgZm9yIGEgdmFsaWQgZmllbGQKKyAgICAgICAgdmFsaWRfZmllbGRzID0gbW9kZWwuX21ldGEuZ2V0X2FsbF9maWVsZF9uYW1lcygpCisgICAgICAgIGZvciBmaWVsZCBpbiBmaWVsZF9pbnB1dF9saXN0WzBdLnNwbGl0KEFORF9WQUxVRV9TRVBBUkFUT1IpOgorICAgICAgICAgICAgaWYgbm90IHJlZHVjZShsYW1iZGEgeCwgeTogeCBvciB5LCBbIGZpZWxkLnN0YXJ0c3dpdGgoeCkgZm9yIHggaW4gdmFsaWRfZmllbGRzIF0pOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lLCAoZmllbGQsIFsgeCBmb3IgeCBpbiB2YWxpZF9maWVsZHMgXSkKKworICAgIHJldHVybiBmaWVsZF9pbnB1dCwgaW52YWxpZAorCisjIHVzZXMgc2VhcmNoX2FsbG93ZWRfZmllbGRzIGluIG9ybS9tb2RlbHMucHkgdG8gY3JlYXRlIGEgc2VhcmNoIHF1ZXJ5CisjIGZvciB0aGVzZSBmaWVsZHMgd2l0aCB0aGUgc3VwcGxpZWQgaW5wdXQgdGV4dAorZGVmIF9nZXRfc2VhcmNoX3Jlc3VsdHMoc2VhcmNoX3Rlcm0sIHF1ZXJ5c2V0LCBtb2RlbCk6CisgICAgc2VhcmNoX29iamVjdHMgPSBbXQorICAgIGZvciBzdCBpbiBzZWFyY2hfdGVybS5zcGxpdCgiICIpOgorICAgICAgICBxX21hcCA9IG1hcChsYW1iZGEgeDogUSgqKnt4KydfX2ljb250YWlucyc6IHN0fSksCisgICAgICAgICAgICAgICAgbW9kZWwuc2VhcmNoX2FsbG93ZWRfZmllbGRzKQorCisgICAgICAgIHNlYXJjaF9vYmplY3RzLmFwcGVuZChyZWR1Y2Uob3BlcmF0b3Iub3JfLCBxX21hcCkpCisgICAgc2VhcmNoX29iamVjdCA9IHJlZHVjZShvcGVyYXRvci5hbmRfLCBzZWFyY2hfb2JqZWN0cykKKyAgICBxdWVyeXNldCA9IHF1ZXJ5c2V0LmZpbHRlcihzZWFyY2hfb2JqZWN0KQorCisgICAgcmV0dXJuIHF1ZXJ5c2V0CisKKworIyBmdW5jdGlvbiB0byBleHRyYWN0IHRoZSBzZWFyY2gvZmlsdGVyL29yZGVyaW5nIHBhcmFtZXRlcnMgZnJvbSB0aGUgcmVxdWVzdAorIyBpdCB1c2VzIHRoZSByZXF1ZXN0IGFuZCB0aGUgbW9kZWwgdG8gdmFsaWRhdGUgaW5wdXQgZm9yIHRoZSBmaWx0ZXIgYW5kIG9yZGVyYnkgdmFsdWVzCitkZWYgX3NlYXJjaF90dXBsZShyZXF1ZXN0LCBtb2RlbCk6CisgICAgb3JkZXJpbmdfc3RyaW5nLCBpbnZhbGlkID0gX3ZhbGlkYXRlX2lucHV0KHJlcXVlc3QuR0VULmdldCgnb3JkZXJieScsICcnKSwgbW9kZWwpCisgICAgaWYgaW52YWxpZDoKKyAgICAgICAgcmFpc2UgQmFzZUV4Y2VwdGlvbigiSW52YWxpZCBvcmRlcmluZyBtb2RlbDoiICsgc3RyKG1vZGVsKSArIHN0cihpbnZhbGlkKSkKKworICAgIGZpbHRlcl9zdHJpbmcsIGludmFsaWQgPSBfdmFsaWRhdGVfaW5wdXQocmVxdWVzdC5HRVQuZ2V0KCdmaWx0ZXInLCAnJyksIG1vZGVsKQorICAgIGlmIGludmFsaWQ6CisgICAgICAgIHJhaXNlIEJhc2VFeGNlcHRpb24oIkludmFsaWQgZmlsdGVyICIgKyBzdHIoaW52YWxpZCkpCisKKyAgICBzZWFyY2hfdGVybSA9IHJlcXVlc3QuR0VULmdldCgnc2VhcmNoJywgJycpCisgICAgcmV0dXJuIChmaWx0ZXJfc3RyaW5nLCBzZWFyY2hfdGVybSwgb3JkZXJpbmdfc3RyaW5nKQorCisKKyMgcmV0dXJucyBhIGxhenktZXZhbHVhdGVkIHF1ZXJ5c2V0IGZvciBhIGZpbHRlci9zZWFyY2gvb3JkZXIgY29tYmluYXRpb24KK2RlZiBfZ2V0X3F1ZXJ5c2V0KG1vZGVsLCBxdWVyeXNldCwgZmlsdGVyX3N0cmluZywgc2VhcmNoX3Rlcm0sIG9yZGVyaW5nX3N0cmluZywgb3JkZXJpbmdfc2Vjb25kYXJ5PScnKToKKyAgICBpZiBmaWx0ZXJfc3RyaW5nOgorICAgICAgICBmaWx0ZXJfcXVlcnkgPSBfZ2V0X2ZpbHRlcmluZ19xdWVyeShmaWx0ZXJfc3RyaW5nKQorICAgICAgICBxdWVyeXNldCA9IHF1ZXJ5c2V0LmZpbHRlcihmaWx0ZXJfcXVlcnkpCisgICAgZWxzZToKKyAgICAgICAgcXVlcnlzZXQgPSBxdWVyeXNldC5hbGwoKQorCisgICAgaWYgc2VhcmNoX3Rlcm06CisgICAgICAgIHF1ZXJ5c2V0ID0gX2dldF9zZWFyY2hfcmVzdWx0cyhzZWFyY2hfdGVybSwgcXVlcnlzZXQsIG1vZGVsKQorCisgICAgaWYgb3JkZXJpbmdfc3RyaW5nOgorICAgICAgICBjb2x1bW4sIG9yZGVyID0gb3JkZXJpbmdfc3RyaW5nLnNwbGl0KCc6JykKKyAgICAgICAgaWYgY29sdW1uID09IHJlLnN1YignLScsJycsb3JkZXJpbmdfc2Vjb25kYXJ5KToKKyAgICAgICAgICAgIG9yZGVyaW5nX3NlY29uZGFyeT0nJworICAgICAgICBpZiBvcmRlci5sb3dlcigpID09IERFU0NFTkRJTkc6CisgICAgICAgICAgICBjb2x1bW4gPSAnLScgKyBjb2x1bW4KKyAgICAgICAgaWYgb3JkZXJpbmdfc2Vjb25kYXJ5OgorICAgICAgICAgICAgcXVlcnlzZXQgPSBxdWVyeXNldC5vcmRlcl9ieShjb2x1bW4sIG9yZGVyaW5nX3NlY29uZGFyeSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHF1ZXJ5c2V0ID0gcXVlcnlzZXQub3JkZXJfYnkoY29sdW1uKQorCisgICAgIyBpbnN1cmUgb25seSBkaXN0aW5jdCByZWNvcmRzIChlLmcuIGZyb20gbXVsdGlwbGUgc2VhcmNoIGhpdHMpIGFyZSByZXR1cm5lZAorICAgIHJldHVybiBxdWVyeXNldC5kaXN0aW5jdCgpCisKKyMgcmV0dXJucyB0aGUgdmFsdWUgb2YgZW50cmllcyBwZXIgcGFnZSBhbmQgdGhlIG5hbWUgb2YgdGhlIGFwcGxpZWQgc29ydGluZyBmaWVsZC4KKyMgaWYgdGhlIHZhbHVlIGlzIGdpdmVuIGV4cGxpY2l0bHkgYXMgYSBHRVQgcGFyYW1ldGVyIGl0IHdpbGwgYmUgdGhlIGZpcnN0IHNlbGVjdGVkLAorIyBvdGhlcndpc2UgdGhlIGNvb2tpZSB2YWx1ZSB3aWxsIGJlIHVzZWQuCitkZWYgX2dldF9wYXJhbWV0ZXJzX3ZhbHVlcyhyZXF1ZXN0LCBkZWZhdWx0X2NvdW50LCBkZWZhdWx0X29yZGVyKToKKyAgICBjdXJyZW50X3VybCA9IHJlc29sdmUocmVxdWVzdC5wYXRoX2luZm8pLnVybF9uYW1lCisgICAgcGFnZXNpemUgPSByZXF1ZXN0LkdFVC5nZXQoJ2NvdW50JywgcmVxdWVzdC5zZXNzaW9uLmdldCgnJXNfY291bnQnICUgY3VycmVudF91cmwsIGRlZmF1bHRfY291bnQpKQorICAgIG9yZGVyYnkgPSByZXF1ZXN0LkdFVC5nZXQoJ29yZGVyYnknLCByZXF1ZXN0LnNlc3Npb24uZ2V0KCclc19vcmRlcmJ5JyAlIGN1cnJlbnRfdXJsLCBkZWZhdWx0X29yZGVyKSkKKyAgICByZXR1cm4gKHBhZ2VzaXplLCBvcmRlcmJ5KQorCisKKyMgc2V0IGNvb2tpZXMgZm9yIHBhcmFtZXRlcnMuIHRoaXMgaXMgdXNlZnVsbCBpbiBjYXNlIHBhcmFtZXRlcnMgYXJlIHNldAorIyBtYW51YWxseSBmcm9tIHRoZSBHRVQgdmFsdWVzIG9mIHRoZSBsaW5rCitkZWYgX3NldF9wYXJhbWV0ZXJzX3ZhbHVlcyhwYWdlc2l6ZSwgb3JkZXJieSwgcmVxdWVzdCk6CisgICAgZnJvbSBkamFuZ28uY29yZS51cmxyZXNvbHZlcnMgaW1wb3J0IHJlc29sdmUKKyAgICBjdXJyZW50X3VybCA9IHJlc29sdmUocmVxdWVzdC5wYXRoX2luZm8pLnVybF9uYW1lCisgICAgcmVxdWVzdC5zZXNzaW9uWyclc19jb3VudCcgJSBjdXJyZW50X3VybF0gPSBwYWdlc2l6ZQorICAgIHJlcXVlc3Quc2Vzc2lvblsnJXNfb3JkZXJieScgJSBjdXJyZW50X3VybF0gPW9yZGVyYnkKKworIyBkYXRlIHJhbmdlOiBub3JtYWxpemUgR1VJJ3MgZGQvbW0veXl5eSB0byBkYXRlIG9iamVjdAorZGVmIF9ub3JtYWxpemVfaW5wdXRfZGF0ZShkYXRlX3N0cixkZWZhdWx0KToKKyAgICBkYXRlX3N0cj1yZS5zdWIoJy8nLCAnLScsIGRhdGVfc3RyKQorICAgICMgYWNjZXB0IGRkL21tL3l5eXkgdG8gZC9tL3l5CisgICAgdHJ5OgorICAgICAgICBkYXRlX2luID0gZGF0ZXRpbWUuc3RycHRpbWUoZGF0ZV9zdHIsICIlZC0lbS0lWSIpCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICMgY291cnRlc3kgdHJ5IHdpdGggdHdvIGRpZ2l0IHllYXIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGF0ZV9pbiA9IGRhdGV0aW1lLnN0cnB0aW1lKGRhdGVfc3RyLCAiJWQtJW0tJXkiKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0CisgICAgZGF0ZV9pbiA9IGRhdGVfaW4ucmVwbGFjZSh0emluZm89ZGVmYXVsdC50emluZm8pCisgICAgcmV0dXJuIGRhdGVfaW4KKworIyBjb252ZXJ0IGFuZCBub3JtYWxpemUgYW55IHJlY2VpdmVkIGRhdGUgcmFuZ2UgZmlsdGVyLCBmb3IgZXhhbXBsZToKKyMgImNvbXBsZXRlZF9vbl9fZ3RlIWNvbXBsZXRlZF9vbl9fbHQ6MDEvMDMvMjAxNSEwMi8wMy8yMDE1X2RhdGVyYW5nZSIgdG8KKyMgImNvbXBsZXRlZF9vbl9fZ3RlIWNvbXBsZXRlZF9vbl9fbHQ6MjAxNS0wMy0wMSEyMDE1LTAzLTAyIgorZGVmIF9tb2RpZnlfZGF0ZV9yYW5nZV9maWx0ZXIoZmlsdGVyX3N0cmluZyk6CisgICAgIyB3YXMgdGhlIGRhdGUgcmFuZ2UgcmFkaW8gYnV0dG9uIHNlbGVjdGVkPworICAgIGlmIDAgPiAgZmlsdGVyX3N0cmluZy5maW5kKCdfZGF0ZXJhbmdlJyk6CisgICAgICAgIHJldHVybiBmaWx0ZXJfc3RyaW5nLCcnCisgICAgIyBub3JtYWxpemUgR1VJIGRhdGVzIHRvIGRhdGFiYXNlIGZvcm1hdAorICAgIGZpbHRlcl9zdHJpbmcgPSBmaWx0ZXJfc3RyaW5nLnJlcGxhY2UoJ19kYXRlcmFuZ2UnLCcnKS5yZXBsYWNlKCc6JywnIScpOworICAgIGZpbHRlcl9saXN0ID0gZmlsdGVyX3N0cmluZy5zcGxpdCgnIScpOworICAgIGlmIDQgIT0gbGVuKGZpbHRlcl9saXN0KToKKyAgICAgICAgcmV0dXJuIGZpbHRlcl9zdHJpbmcKKyAgICB0b2RheSA9IHRpbWV6b25lLmxvY2FsdGltZSh0aW1lem9uZS5ub3coKSkKKyAgICBkYXRlX2lkID0gZmlsdGVyX2xpc3RbMV0KKyAgICBkYXRlX2Zyb20gPSBfbm9ybWFsaXplX2lucHV0X2RhdGUoZmlsdGVyX2xpc3RbMl0sdG9kYXkpCisgICAgZGF0ZV90byA9IF9ub3JtYWxpemVfaW5wdXRfZGF0ZShmaWx0ZXJfbGlzdFszXSx0b2RheSkKKyAgICAjIHN3YXAgZGF0ZXMgaWYgbWFudWFsbHkgc2V0IGRhdGVzIGFyZSBvdXQgb2Ygb3JkZXIKKyAgICBpZiAgZGF0ZV90byA8IGRhdGVfZnJvbToKKyAgICAgICAgZGF0ZV90byxkYXRlX2Zyb20gPSBkYXRlX2Zyb20sZGF0ZV90bworICAgICMgY29udmVydCB0byBzdHJpbmdzLCBtYWtlICdkYXRlX3RvJyBpbmNsdXNpdmUgYnkgbW92aW5nIHRvIGJlZ2luaW5nIG9mIG5leHQgZGF5CisgICAgZGF0ZV9mcm9tX3N0ciA9IGRhdGVfZnJvbS5zdHJmdGltZSgiJVktJW0tJWQiKQorICAgIGRhdGVfdG9fc3RyID0gKGRhdGVfdG8rdGltZWRlbHRhKGRheXM9MSkpLnN0cmZ0aW1lKCIlWS0lbS0lZCIpCisgICAgZmlsdGVyX3N0cmluZz1maWx0ZXJfbGlzdFswXSsnIScrZmlsdGVyX2xpc3RbMV0rJzonK2RhdGVfZnJvbV9zdHIrJyEnK2RhdGVfdG9fc3RyCisgICAgZGF0ZXJhbmdlX3NlbGVjdGVkID0gcmUuc3ViKCdfXy4qJywnJywgZGF0ZV9pZCkKKyAgICByZXR1cm4gZmlsdGVyX3N0cmluZyxkYXRlcmFuZ2Vfc2VsZWN0ZWQKKworZGVmIF9hZGRfZGF0ZXJhbmdlX2NvbnRleHQocXVlcnlzZXRfYWxsLCByZXF1ZXN0LCBkYXRlcmFuZ2VfbGlzdCk6CisgICAgIyBjYWxjdWxhdGUgdGhlIGV4YWN0IGJlZ2luaW5nIG9mIGxvY2FsIHRvZGF5IGFuZCB5ZXN0ZXJkYXkKKyAgICB0b2RheV9iZWdpbiA9IHRpbWV6b25lLmxvY2FsdGltZSh0aW1lem9uZS5ub3coKSkKKyAgICB0b2RheV9iZWdpbiA9IGRhdGUodG9kYXlfYmVnaW4ueWVhcix0b2RheV9iZWdpbi5tb250aCx0b2RheV9iZWdpbi5kYXkpCisgICAgeWVzdGVyZGF5X2JlZ2luID0gdG9kYXlfYmVnaW4tdGltZWRlbHRhKGRheXM9MSkKKyAgICAjIGFkZCBkYXRlcmFuZ2UgcGVyc2lzdGVudAorICAgIGNvbnRleHRfZGF0ZSA9IHt9CisgICAgY29udGV4dF9kYXRlWydsYXN0X2RhdGVfZnJvbSddID0gcmVxdWVzdC5HRVQuZ2V0KCdsYXN0X2RhdGVfZnJvbScsdGltZXpvbmUubG9jYWx0aW1lKHRpbWV6b25lLm5vdygpKS5zdHJmdGltZSgiJWQvJW0vJVkiKSkKKyAgICBjb250ZXh0X2RhdGVbJ2xhc3RfZGF0ZV90bycgIF0gPSByZXF1ZXN0LkdFVC5nZXQoJ2xhc3RfZGF0ZV90bycgICxjb250ZXh0X2RhdGVbJ2xhc3RfZGF0ZV9mcm9tJ10pCisgICAgIyBjYWxjdWxhdGUgdGhlIGRhdGUgcmFuZ2VzLCBhdm9pZCBzZWNvbmQgc29ydCBmb3IgJ2NyZWF0ZWQnCisgICAgIyBmZXRjaCB0aGUgcmVzcGVjdGl2ZSBtYXggcmFuZ2UgZnJvbSB0aGUgZGF0YWJhc2UKKyAgICBjb250ZXh0X2RhdGVbJ2RhdGVyYW5nZV9maWx0ZXInXT0nJworICAgIGZvciBrZXkgaW4gZGF0ZXJhbmdlX2xpc3Q6CisgICAgICAgIHF1ZXJ5c2V0X2tleSA9IHF1ZXJ5c2V0X2FsbC5vcmRlcl9ieShrZXkpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbnRleHRfZGF0ZVsnZGF0ZU1pbl8nK2tleV09dGltZXpvbmUubG9jYWx0aW1lKGdldGF0dHIocXVlcnlzZXRfa2V5LmZpcnN0KCksa2V5KSkuc3RyZnRpbWUoIiVkLyVtLyVZIikKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgY29udGV4dF9kYXRlWydkYXRlTWluXycra2V5XT10aW1lem9uZS5sb2NhbHRpbWUodGltZXpvbmUubm93KCkpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbnRleHRfZGF0ZVsnZGF0ZU1heF8nK2tleV09dGltZXpvbmUubG9jYWx0aW1lKGdldGF0dHIocXVlcnlzZXRfa2V5Lmxhc3QoKSxrZXkpKS5zdHJmdGltZSgiJWQvJW0vJVkiKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBjb250ZXh0X2RhdGVbJ2RhdGVNYXhfJytrZXldPXRpbWV6b25lLmxvY2FsdGltZSh0aW1lem9uZS5ub3coKSkKKyAgICByZXR1cm4gY29udGV4dF9kYXRlLHRvZGF5X2JlZ2luLHllc3RlcmRheV9iZWdpbgorCisKKyMjCisjIGJ1aWxkIGRhc2hib2FyZCBmb3IgYSBzaW5nbGUgYnVpbGQsIGNvbWluZyBpbiBhcyBhcmd1bWVudAorIyBFYWNoIGJ1aWxkIG1heSBjb250YWluIG11bHRpcGxlIHRhcmdldHMgYW5kIGVhY2ggdGFyZ2V0CisjIG1heSBnZW5lcmF0ZSBtdWx0aXBsZSBpbWFnZSBmaWxlcy4gZGlzcGxheSB0aGVtIGFsbC4KKyMKK2RlZiBidWlsZGRhc2hib2FyZCggcmVxdWVzdCwgYnVpbGRfaWQgKToKKyAgICB0ZW1wbGF0ZSA9ICJidWlsZGRhc2hib2FyZC5odG1sIgorICAgIGlmIEJ1aWxkLm9iamVjdHMuZmlsdGVyKCBwaz1idWlsZF9pZCApLmNvdW50KCApID09IDAgOgorICAgICAgICByZXR1cm4gcmVkaXJlY3QoIGJ1aWxkcyApCisgICAgYnVpbGQgPSBCdWlsZC5vYmplY3RzLmdldCggcGsgPSBidWlsZF9pZCApOworICAgIGxheWVyVmVyc2lvbklkID0gTGF5ZXJfVmVyc2lvbi5vYmplY3RzLmZpbHRlciggYnVpbGQgPSBidWlsZF9pZCApOworICAgIHJlY2lwZUNvdW50ID0gUmVjaXBlLm9iamVjdHMuZmlsdGVyKCBsYXllcl92ZXJzaW9uX19pZF9faW4gPSBsYXllclZlcnNpb25JZCApLmNvdW50KCApOworICAgIHRndHMgPSBUYXJnZXQub2JqZWN0cy5maWx0ZXIoIGJ1aWxkX2lkID0gYnVpbGRfaWQgKS5vcmRlcl9ieSggJ3RhcmdldCcgKTsKKworICAgICMjCisgICAgIyBzZXQgdXAgY3VzdG9tIHRhcmdldCBsaXN0IHdpdGggY29tcHV0ZWQgcGFja2FnZSBhbmQgaW1hZ2UgZGF0YQorICAgICMKKworICAgIHRhcmdldHMgPSBbIF0KKyAgICBudGFyZ2V0cyA9IDAKKyAgICBoYXNJbWFnZXMgPSBGYWxzZQorICAgIHRhcmdldEhhc05vSW1hZ2VzID0gRmFsc2UKKyAgICBmb3IgdCBpbiB0Z3RzOgorICAgICAgICBlbGVtID0geyB9CisgICAgICAgIGVsZW1bICd0YXJnZXQnIF0gPSB0CisgICAgICAgIGlmICggdC5pc19pbWFnZSApOgorICAgICAgICAgICAgaGFzSW1hZ2VzID0gVHJ1ZQorICAgICAgICBucGtnID0gMAorICAgICAgICBwa2dzeiA9IDAKKyAgICAgICAgcGFja2FnZSA9IE5vbmUKKyAgICAgICAgZm9yIHBhY2thZ2UgaW4gUGFja2FnZS5vYmplY3RzLmZpbHRlcihpZF9faW4gPSBbeC5wYWNrYWdlX2lkIGZvciB4IGluIHQudGFyZ2V0X2luc3RhbGxlZF9wYWNrYWdlX3NldC5hbGwoKV0pOgorICAgICAgICAgICAgcGtnc3ogPSBwa2dzeiArIHBhY2thZ2Uuc2l6ZQorICAgICAgICAgICAgaWYgKCBwYWNrYWdlLmluc3RhbGxlZF9uYW1lICk6CisgICAgICAgICAgICAgICAgbnBrZyA9IG5wa2cgKyAxCisgICAgICAgIGVsZW1bICducGtnJyBdID0gbnBrZworICAgICAgICBlbGVtWyAncGtnc3onIF0gPSBwa2dzegorICAgICAgICB0aSA9IFRhcmdldF9JbWFnZV9GaWxlLm9iamVjdHMuZmlsdGVyKCB0YXJnZXRfaWQgPSB0LmlkICkKKyAgICAgICAgaW1hZ2VGaWxlcyA9IFsgXQorICAgICAgICBmb3IgaSBpbiB0aToKKyAgICAgICAgICAgIG5keCA9IGkuZmlsZV9uYW1lLnJmaW5kKCAnLycgKQorICAgICAgICAgICAgaWYgKCBuZHggPCAwICk6CisgICAgICAgICAgICAgICAgbmR4ID0gMDsKKyAgICAgICAgICAgIGYgPSBpLmZpbGVfbmFtZVsgbmR4ICsgMTogXQorICAgICAgICAgICAgaW1hZ2VGaWxlcy5hcHBlbmQoeyAnaWQnOiBpLmlkLCAncGF0aCc6IGYsICdzaXplJyA6IGkuZmlsZV9zaXplIH0pCisgICAgICAgIGlmICggdC5pc19pbWFnZSBhbmQKKyAgICAgICAgICAgICAoKCBsZW4oIGltYWdlRmlsZXMgKSA8PSAwICkgb3IgKCBsZW4oIHQubGljZW5zZV9tYW5pZmVzdF9wYXRoICkgPD0gMCApKSk6CisgICAgICAgICAgICB0YXJnZXRIYXNOb0ltYWdlcyA9IFRydWUKKyAgICAgICAgZWxlbVsgJ2ltYWdlRmlsZXMnIF0gPSBpbWFnZUZpbGVzCisgICAgICAgIGVsZW1bICd0YXJnZXRIYXNOb0ltYWdlcycgXSA9IHRhcmdldEhhc05vSW1hZ2VzCisgICAgICAgIHRhcmdldHMuYXBwZW5kKCBlbGVtICkKKworICAgICMjCisgICAgIyBob3cgbWFueSBwYWNrYWdlcyBpbiB0aGlzIGJ1aWxkIC0gaWdub3JlIGFub255bW91cyBvbmVzCisgICAgIworCisgICAgcGFja2FnZUNvdW50ID0gMAorICAgIHBhY2thZ2VzID0gUGFja2FnZS5vYmplY3RzLmZpbHRlciggYnVpbGRfaWQgPSBidWlsZF9pZCApCisgICAgZm9yIHAgaW4gcGFja2FnZXM6CisgICAgICAgIGlmICggcC5pbnN0YWxsZWRfbmFtZSApOgorICAgICAgICAgICAgcGFja2FnZUNvdW50ID0gcGFja2FnZUNvdW50ICsgMQorCisgICAgbG9nbWVzc2FnZXMgPSBsaXN0KExvZ01lc3NhZ2Uub2JqZWN0cy5maWx0ZXIoIGJ1aWxkID0gYnVpbGRfaWQgKSkKKworICAgIGNvbnRleHQgPSB7CisgICAgICAgICAgICAnYnVpbGQnICAgICAgICAgICA6IGJ1aWxkLAorICAgICAgICAgICAgJ2hhc0ltYWdlcycgICAgICAgOiBoYXNJbWFnZXMsCisgICAgICAgICAgICAnbnRhcmdldHMnICAgICAgICA6IG50YXJnZXRzLAorICAgICAgICAgICAgJ3RhcmdldHMnICAgICAgICAgOiB0YXJnZXRzLAorICAgICAgICAgICAgJ3JlY2lwZWNvdW50JyAgICAgOiByZWNpcGVDb3VudCwKKyAgICAgICAgICAgICdwYWNrYWdlY291bnQnICAgIDogcGFja2FnZUNvdW50LAorICAgICAgICAgICAgJ2xvZ21lc3NhZ2VzJyAgICAgOiBsb2dtZXNzYWdlcywKKyAgICB9CisgICAgcmV0dXJuIHJlbmRlciggcmVxdWVzdCwgdGVtcGxhdGUsIGNvbnRleHQgKQorCisKKworZGVmIGdlbmVyYXRlQ292ZXJlZExpc3QyKCByZXZsaXN0ID0gTm9uZSApOgorICAgIGlmIG5vdCByZXZsaXN0OgorICAgICAgICByZXZsaXN0ID0gW10KKyAgICBjb3ZlcmVkX2xpc3QgPSAgWyB4IGZvciB4IGluIHJldmxpc3QgaWYgeC5vdXRjb21lID09IFRhc2suT1VUQ09NRV9DT1ZFUkVEIF0KKyAgICB3aGlsZSBsZW4oY292ZXJlZF9saXN0KToKKyAgICAgICAgcmV2bGlzdCA9ICBbIHggZm9yIHggaW4gcmV2bGlzdCBpZiB4Lm91dGNvbWUgIT0gVGFzay5PVVRDT01FX0NPVkVSRUQgXQorICAgICAgICBpZiBsZW4ocmV2bGlzdCkgPiAwOgorICAgICAgICAgICAgcmV0dXJuIHJldmxpc3QKKworICAgICAgICBuZXdsaXN0ID0gX2ZpbmRfdGFza19yZXZkZXBfbGlzdChjb3ZlcmVkX2xpc3QpCisKKyAgICAgICAgcmV2bGlzdCA9IGxpc3Qoc2V0KHJldmxpc3QgKyBuZXdsaXN0KSkKKyAgICAgICAgY292ZXJlZF9saXN0ID0gIFsgeCBmb3IgeCBpbiByZXZsaXN0IGlmIHgub3V0Y29tZSA9PSBUYXNrLk9VVENPTUVfQ09WRVJFRCBdCisgICAgcmV0dXJuIHJldmxpc3QKKworZGVmIHRhc2soIHJlcXVlc3QsIGJ1aWxkX2lkLCB0YXNrX2lkICk6CisgICAgdGVtcGxhdGUgPSAidGFzay5odG1sIgorICAgIHRhc2tzX2xpc3QgPSBUYXNrLm9iamVjdHMuZmlsdGVyKCBwaz10YXNrX2lkICkKKyAgICBpZiB0YXNrc19saXN0LmNvdW50KCApID09IDA6CisgICAgICAgIHJldHVybiByZWRpcmVjdCggYnVpbGRzICkKKyAgICB0YXNrX29iamVjdCA9IHRhc2tzX2xpc3RbIDAgXTsKKyAgICBkZXBlbmRlbmNpZXMgPSBzb3J0ZWQoCisgICAgICAgIF9maW5kX3Rhc2tfZGVwKCB0YXNrX29iamVjdCApLAorICAgICAgICBrZXk9bGFtYmRhIHQ6JyVzXyVzICVzJyUodC5yZWNpcGUubmFtZSwgdC5yZWNpcGUudmVyc2lvbiwgdC50YXNrX25hbWUpKQorICAgIHJldmVyc2VfZGVwZW5kZW5jaWVzID0gc29ydGVkKAorICAgICAgICBfZmluZF90YXNrX3JldmRlcCggdGFza19vYmplY3QgKSwKKyAgICAgICAga2V5PWxhbWJkYSB0Oiclc18lcyAlcyclKCB0LnJlY2lwZS5uYW1lLCB0LnJlY2lwZS52ZXJzaW9uLCB0LnRhc2tfbmFtZSApKQorICAgIGNvdmVyZWRCeSA9ICcnOworICAgIGlmICggdGFza19vYmplY3Qub3V0Y29tZSA9PSBUYXNrLk9VVENPTUVfQ09WRVJFRCApOgorIyAgICAgICAgX2xpc3QgPSBnZW5lcmF0ZUNvdmVyZWRMaXN0KCB0YXNrICkKKyAgICAgICAgY292ZXJlZEJ5ID0gc29ydGVkKGdlbmVyYXRlQ292ZXJlZExpc3QyKCBfZmluZF90YXNrX3JldmRlcCggdGFza19vYmplY3QgKSApLCBrZXkgPSBsYW1iZGEgeDogeC5yZWNpcGUubmFtZSkKKyAgICBsb2dfaGVhZCA9ICcnCisgICAgbG9nX2JvZHkgPSAnJworICAgIGlmIHRhc2tfb2JqZWN0Lm91dGNvbWUgPT0gdGFza19vYmplY3QuT1VUQ09NRV9GQUlMRUQ6CisgICAgICAgIHBhc3MKKworICAgIHVyaV9saXN0PSBbIF0KKyAgICB2YXJpYWJsZXMgPSBWYXJpYWJsZS5vYmplY3RzLmZpbHRlcihidWlsZD1idWlsZF9pZCkKKyAgICB2PXZhcmlhYmxlcy5maWx0ZXIodmFyaWFibGVfbmFtZT0nU1NUQVRFX0RJUicpCisgICAgaWYgdi5jb3VudCgpID4gMDoKKyAgICAgICAgdXJpX2xpc3QuYXBwZW5kKHZbMF0udmFyaWFibGVfdmFsdWUpCisgICAgdj12YXJpYWJsZXMuZmlsdGVyKHZhcmlhYmxlX25hbWU9J1NTVEFURV9NSVJST1JTJykKKyAgICBpZiAodi5jb3VudCgpID4gMCk6CisgICAgICAgIGZvciBtaXJyb3IgaW4gdlswXS52YXJpYWJsZV92YWx1ZS5zcGxpdCgnXFxuJyk6CisgICAgICAgICAgICBzPXJlLnN1YignLiogJywnJyxtaXJyb3Iuc3RyaXAoJyBcdFxuXHInKSkKKyAgICAgICAgICAgIGlmIGxlbihzKToKKyAgICAgICAgICAgICAgICB1cmlfbGlzdC5hcHBlbmQocykKKworICAgIGNvbnRleHQgPSB7CisgICAgICAgICAgICAnYnVpbGQnICAgICAgICAgICA6IEJ1aWxkLm9iamVjdHMuZmlsdGVyKCBwayA9IGJ1aWxkX2lkIClbIDAgXSwKKyAgICAgICAgICAgICdvYmplY3QnICAgICAgICAgIDogdGFza19vYmplY3QsCisgICAgICAgICAgICAndGFzaycgICAgICAgICAgICA6IHRhc2tfb2JqZWN0LAorICAgICAgICAgICAgJ2NvdmVyZWRfYnknICAgICAgOiBjb3ZlcmVkQnksCisgICAgICAgICAgICAnZGVwcycgICAgICAgICAgICA6IGRlcGVuZGVuY2llcywKKyAgICAgICAgICAgICdyZGVwcycgICAgICAgICAgIDogcmV2ZXJzZV9kZXBlbmRlbmNpZXMsCisgICAgICAgICAgICAnbG9nX2hlYWQnICAgICAgICA6IGxvZ19oZWFkLAorICAgICAgICAgICAgJ2xvZ19ib2R5JyAgICAgICAgOiBsb2dfYm9keSwKKyAgICAgICAgICAgICdzaG93aW5nX21hdGNoZXMnIDogRmFsc2UsCisgICAgICAgICAgICAndXJpX2xpc3QnICAgICAgICA6IHVyaV9saXN0LAorICAgIH0KKyAgICBpZiByZXF1ZXN0LkdFVC5nZXQoICdzaG93X21hdGNoZXMnLCAiIiApOgorICAgICAgICBjb250ZXh0WyAnc2hvd2luZ19tYXRjaGVzJyBdID0gVHJ1ZQorICAgICAgICBjb250ZXh0WyAnbWF0Y2hpbmdfdGFza3MnIF0gPSBUYXNrLm9iamVjdHMuZmlsdGVyKAorICAgICAgICAgICAgc3N0YXRlX2NoZWNrc3VtPXRhc2tfb2JqZWN0LnNzdGF0ZV9jaGVja3N1bSApLmZpbHRlcigKKyAgICAgICAgICAgIGJ1aWxkX19jb21wbGV0ZWRfb25fX2x0PXRhc2tfb2JqZWN0LmJ1aWxkLmNvbXBsZXRlZF9vbikuZXhjbHVkZSgKKyAgICAgICAgICAgIG9yZGVyX19pc251bGw9VHJ1ZSkuZXhjbHVkZShvdXRjb21lPVRhc2suT1VUQ09NRV9OQSkub3JkZXJfYnkoJy1idWlsZF9fY29tcGxldGVkX29uJykKKworICAgIHJldHVybiByZW5kZXIoIHJlcXVlc3QsIHRlbXBsYXRlLCBjb250ZXh0ICkKKworZGVmIHJlY2lwZShyZXF1ZXN0LCBidWlsZF9pZCwgcmVjaXBlX2lkLCBhY3RpdmVfdGFiPSIxIik6CisgICAgdGVtcGxhdGUgPSAicmVjaXBlLmh0bWwiCisgICAgaWYgUmVjaXBlLm9iamVjdHMuZmlsdGVyKHBrPXJlY2lwZV9pZCkuY291bnQoKSA9PSAwIDoKKyAgICAgICAgcmV0dXJuIHJlZGlyZWN0KGJ1aWxkcykKKworICAgIHJlY2lwZV9vYmplY3QgPSBSZWNpcGUub2JqZWN0cy5nZXQocGs9cmVjaXBlX2lkKQorICAgIGxheWVyX3ZlcnNpb24gPSBMYXllcl9WZXJzaW9uLm9iamVjdHMuZ2V0KHBrPXJlY2lwZV9vYmplY3QubGF5ZXJfdmVyc2lvbl9pZCkKKyAgICBsYXllciAgPSBMYXllci5vYmplY3RzLmdldChwaz1sYXllcl92ZXJzaW9uLmxheWVyX2lkKQorICAgIHRhc2tzX2xpc3QgID0gVGFzay5vYmplY3RzLmZpbHRlcihyZWNpcGVfaWQgPSByZWNpcGVfaWQsIGJ1aWxkX2lkID0gYnVpbGRfaWQpLmV4Y2x1ZGUob3JkZXJfX2lzbnVsbD1UcnVlKS5leGNsdWRlKHRhc2tfbmFtZV9fZW5kc3dpdGg9J19zZXRzY2VuZScpLmV4Y2x1ZGUob3V0Y29tZT1UYXNrLk9VVENPTUVfTkEpCisgICAgcGFja2FnZV9jb3VudCA9IFBhY2thZ2Uub2JqZWN0cy5maWx0ZXIocmVjaXBlX2lkID0gcmVjaXBlX2lkKS5maWx0ZXIoYnVpbGRfaWQgPSBidWlsZF9pZCkuZmlsdGVyKHNpemVfX2d0ZT0wKS5jb3VudCgpCisKKyAgICBpZiBhY3RpdmVfdGFiICE9ICcxJyBhbmQgYWN0aXZlX3RhYiAhPSAnMycgYW5kIGFjdGl2ZV90YWIgIT0gJzQnIDoKKyAgICAgICAgYWN0aXZlX3RhYiA9ICcxJworICAgIHRhYl9zdGF0ZXMgPSB7JzEnOiAnJywgJzMnOiAnJywgJzQnOiAnJ30KKyAgICB0YWJfc3RhdGVzW2FjdGl2ZV90YWJdID0gJ2FjdGl2ZScKKworICAgIGNvbnRleHQgPSB7CisgICAgICAgICAgICAnYnVpbGQnICAgOiBCdWlsZC5vYmplY3RzLmdldChwaz1idWlsZF9pZCksCisgICAgICAgICAgICAnb2JqZWN0JyAgOiByZWNpcGVfb2JqZWN0LAorICAgICAgICAgICAgJ2xheWVyX3ZlcnNpb24nIDogbGF5ZXJfdmVyc2lvbiwKKyAgICAgICAgICAgICdsYXllcicgICA6IGxheWVyLAorICAgICAgICAgICAgJ3Rhc2tzJyAgIDogdGFza3NfbGlzdCwKKyAgICAgICAgICAgICdwYWNrYWdlX2NvdW50JyA6IHBhY2thZ2VfY291bnQsCisgICAgICAgICAgICAndGFiX3N0YXRlcycgOiB0YWJfc3RhdGVzLAorICAgIH0KKyAgICByZXR1cm4gcmVuZGVyKHJlcXVlc3QsIHRlbXBsYXRlLCBjb250ZXh0KQorCitkZWYgcmVjaXBlX3BhY2thZ2VzKHJlcXVlc3QsIGJ1aWxkX2lkLCByZWNpcGVfaWQpOgorICAgIHRlbXBsYXRlID0gInJlY2lwZV9wYWNrYWdlcy5odG1sIgorICAgIGlmIFJlY2lwZS5vYmplY3RzLmZpbHRlcihwaz1yZWNpcGVfaWQpLmNvdW50KCkgPT0gMCA6CisgICAgICAgIHJldHVybiByZWRpcmVjdChidWlsZHMpCisKKyAgICAocGFnZXNpemUsIG9yZGVyYnkpID0gX2dldF9wYXJhbWV0ZXJzX3ZhbHVlcyhyZXF1ZXN0LCAxMCwgJ25hbWU6KycpCisgICAgbWFuZGF0b3J5X3BhcmFtZXRlcnMgPSB7ICdjb3VudCc6IHBhZ2VzaXplLCAgJ3BhZ2UnIDogMSwgJ29yZGVyYnknOiBvcmRlcmJ5IH0KKyAgICByZXR2YWwgPSBfdmVyaWZ5X3BhcmFtZXRlcnMoIHJlcXVlc3QuR0VULCBtYW5kYXRvcnlfcGFyYW1ldGVycyApCisgICAgaWYgcmV0dmFsOgorICAgICAgICByZXR1cm4gX3JlZGlyZWN0X3BhcmFtZXRlcnMoICdyZWNpcGVfcGFja2FnZXMnLCByZXF1ZXN0LkdFVCwgbWFuZGF0b3J5X3BhcmFtZXRlcnMsIGJ1aWxkX2lkID0gYnVpbGRfaWQsIHJlY2lwZV9pZCA9IHJlY2lwZV9pZCkKKyAgICAoZmlsdGVyX3N0cmluZywgc2VhcmNoX3Rlcm0sIG9yZGVyaW5nX3N0cmluZykgPSBfc2VhcmNoX3R1cGxlKHJlcXVlc3QsIFBhY2thZ2UpCisKKyAgICByZWNpcGVfb2JqZWN0ID0gUmVjaXBlLm9iamVjdHMuZ2V0KHBrPXJlY2lwZV9pZCkKKyAgICBxdWVyeXNldCA9IFBhY2thZ2Uub2JqZWN0cy5maWx0ZXIocmVjaXBlX2lkID0gcmVjaXBlX2lkKS5maWx0ZXIoYnVpbGRfaWQgPSBidWlsZF9pZCkuZmlsdGVyKHNpemVfX2d0ZT0wKQorICAgIHBhY2thZ2VfY291bnQgPSBxdWVyeXNldC5jb3VudCgpCisgICAgcXVlcnlzZXQgPSBfZ2V0X3F1ZXJ5c2V0KFBhY2thZ2UsIHF1ZXJ5c2V0LCBmaWx0ZXJfc3RyaW5nLCBzZWFyY2hfdGVybSwgb3JkZXJpbmdfc3RyaW5nLCAnbmFtZScpCisKKyAgICBwYWNrYWdlcyA9IF9idWlsZF9wYWdlX3JhbmdlKFBhZ2luYXRvcihxdWVyeXNldCwgcGFnZXNpemUpLHJlcXVlc3QuR0VULmdldCgncGFnZScsIDEpKQorCisgICAgY29udGV4dCA9IHsKKyAgICAgICAgICAgICdidWlsZCcgICA6IEJ1aWxkLm9iamVjdHMuZ2V0KHBrPWJ1aWxkX2lkKSwKKyAgICAgICAgICAgICdyZWNpcGUnICA6IHJlY2lwZV9vYmplY3QsCisgICAgICAgICAgICAnb2JqZWN0cycgIDogcGFja2FnZXMsCisgICAgICAgICAgICAnb2JqZWN0X2NvdW50JyA6IHBhY2thZ2VfY291bnQsCisgICAgICAgICAgICAndGFibGVjb2xzJzpbCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAnbmFtZSc6J1BhY2thZ2UnLAorICAgICAgICAgICAgICAgICAgICAnb3JkZXJmaWVsZCc6IF9nZXRfdG9nZ2xlX29yZGVyKHJlcXVlc3QsIm5hbWUiKSwKKyAgICAgICAgICAgICAgICAgICAgJ29yZGVyaWNvbic6IF9nZXRfdG9nZ2xlX29yZGVyX2ljb24ocmVxdWVzdCwibmFtZSIpLAorICAgICAgICAgICAgICAgICAgICAnb3JkZXJrZXknOiAibmFtZSIsCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICduYW1lJzonVmVyc2lvbicsCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICduYW1lJzonU2l6ZScsCisgICAgICAgICAgICAgICAgICAgICdvcmRlcmZpZWxkJzogX2dldF90b2dnbGVfb3JkZXIocmVxdWVzdCwic2l6ZSIsIFRydWUpLAorICAgICAgICAgICAgICAgICAgICAnb3JkZXJpY29uJzogX2dldF90b2dnbGVfb3JkZXJfaWNvbihyZXF1ZXN0LCJzaXplIiksCisgICAgICAgICAgICAgICAgICAgICdvcmRlcmtleSc6ICdzaXplJywKKyAgICAgICAgICAgICAgICAgICAgJ2RjbGFzcyc6ICdzaXplY29sIHNwYW4yJywKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICBdCisgICAgICAgfQorICAgIHJlc3BvbnNlID0gcmVuZGVyKHJlcXVlc3QsIHRlbXBsYXRlLCBjb250ZXh0KQorICAgIF9zZXRfcGFyYW1ldGVyc192YWx1ZXMocGFnZXNpemUsIG9yZGVyYnksIHJlcXVlc3QpCisgICAgcmV0dXJuIHJlc3BvbnNlCisKK2RlZiB0YXJnZXRfY29tbW9uKCByZXF1ZXN0LCBidWlsZF9pZCwgdGFyZ2V0X2lkLCB2YXJpYW50ICk6CisgICAgdGVtcGxhdGUgPSAidGFyZ2V0Lmh0bWwiCisgICAgKHBhZ2VzaXplLCBvcmRlcmJ5KSA9IF9nZXRfcGFyYW1ldGVyc192YWx1ZXMocmVxdWVzdCwgMjUsICduYW1lOisnKQorICAgIG1hbmRhdG9yeV9wYXJhbWV0ZXJzID0geyAnY291bnQnOiBwYWdlc2l6ZSwgICdwYWdlJyA6IDEsICdvcmRlcmJ5Jzogb3JkZXJieSB9CisgICAgcmV0dmFsID0gX3ZlcmlmeV9wYXJhbWV0ZXJzKCByZXF1ZXN0LkdFVCwgbWFuZGF0b3J5X3BhcmFtZXRlcnMgKQorICAgIGlmIHJldHZhbDoKKyAgICAgICAgcmV0dXJuIF9yZWRpcmVjdF9wYXJhbWV0ZXJzKAorICAgICAgICAgICAgICAgICAgICB2YXJpYW50LCByZXF1ZXN0LkdFVCwgbWFuZGF0b3J5X3BhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgIGJ1aWxkX2lkID0gYnVpbGRfaWQsIHRhcmdldF9pZCA9IHRhcmdldF9pZCApCisgICAgKCBmaWx0ZXJfc3RyaW5nLCBzZWFyY2hfdGVybSwgb3JkZXJpbmdfc3RyaW5nICkgPSBfc2VhcmNoX3R1cGxlKCByZXF1ZXN0LCBQYWNrYWdlICkKKworICAgICMgRlVUVVJFOiAgZ2V0IHJpZCBvZiBuZXN0ZWQgc3ViLXF1ZXJpZXMgcmVwbGFjaW5nIHdpdGggTWFueVRvTWFueSBmaWVsZAorICAgIHF1ZXJ5c2V0ID0gUGFja2FnZS5vYmplY3RzLmZpbHRlcigKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV9fZ3RlID0gMCwKKyAgICAgICAgICAgICAgICAgICAgaWRfX2luID0gVGFyZ2V0X0luc3RhbGxlZF9QYWNrYWdlLm9iamVjdHMuZmlsdGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2lkPXRhcmdldF9pZCApLnZhbHVlcyggJ3BhY2thZ2VfaWQnICkpCisgICAgcGFja2FnZXNfc3VtID0gIHF1ZXJ5c2V0LmFnZ3JlZ2F0ZSggU3VtKCAnaW5zdGFsbGVkX3NpemUnICkpCisgICAgcXVlcnlzZXQgPSBfZ2V0X3F1ZXJ5c2V0KAorICAgICAgICAgICAgUGFja2FnZSwgcXVlcnlzZXQsIGZpbHRlcl9zdHJpbmcsIHNlYXJjaF90ZXJtLCBvcmRlcmluZ19zdHJpbmcsICduYW1lJyApCisgICAgcXVlcnlzZXQgPSBxdWVyeXNldC5zZWxlY3RfcmVsYXRlZCgicmVjaXBlIiwgInJlY2lwZV9fbGF5ZXJfdmVyc2lvbiIsICJyZWNpcGVfX2xheWVyX3ZlcnNpb25fX2xheWVyIikKKyAgICBwYWNrYWdlcyA9IF9idWlsZF9wYWdlX3JhbmdlKCBQYWdpbmF0b3IocXVlcnlzZXQsIHBhZ2VzaXplKSwgcmVxdWVzdC5HRVQuZ2V0KCAncGFnZScsIDEgKSkKKworCisKKyAgICBidWlsZCA9IEJ1aWxkLm9iamVjdHMuZ2V0KCBwayA9IGJ1aWxkX2lkICkKKworICAgICMgYnJpbmcgaW4gcGFja2FnZSBkZXBlbmRlbmNpZXMKKyAgICBmb3IgcCBpbiBwYWNrYWdlcy5vYmplY3RfbGlzdDoKKyAgICAgICAgcC5ydW50aW1lX2RlcGVuZGVuY2llcyA9IHAucGFja2FnZV9kZXBlbmRlbmNpZXNfc291cmNlLmZpbHRlcigKKyAgICAgICAgICAgIHRhcmdldF9pZCA9IHRhcmdldF9pZCwgZGVwX3R5cGU9UGFja2FnZV9EZXBlbmRlbmN5LlRZUEVfVFJERVBFTkRTICkuc2VsZWN0X3JlbGF0ZWQoImRlcGVuZHNfb24iKQorICAgICAgICBwLnJldmVyc2VfcnVudGltZV9kZXBlbmRlbmNpZXMgPSBwLnBhY2thZ2VfZGVwZW5kZW5jaWVzX3RhcmdldC5maWx0ZXIoCisgICAgICAgICAgICB0YXJnZXRfaWQgPSB0YXJnZXRfaWQsIGRlcF90eXBlPVBhY2thZ2VfRGVwZW5kZW5jeS5UWVBFX1RSREVQRU5EUyApLnNlbGVjdF9yZWxhdGVkKCJwYWNrYWdlIikKKyAgICB0Y19wYWNrYWdlID0geworICAgICAgICAnbmFtZScgICAgICAgOiAnUGFja2FnZScsCisgICAgICAgICdxaGVscCcgICAgICA6ICdQYWNrYWdlZCBvdXRwdXQgcmVzdWx0aW5nIGZyb20gYnVpbGRpbmcgYSByZWNpcGUgaW5jbHVkZWQgaW4gdGhpcyBpbWFnZScsCisgICAgICAgICdvcmRlcmZpZWxkJyA6IF9nZXRfdG9nZ2xlX29yZGVyKCByZXF1ZXN0LCAibmFtZSIgKSwKKyAgICAgICAgJ29yZGVyaWNvbicgIDogX2dldF90b2dnbGVfb3JkZXJfaWNvbiggcmVxdWVzdCwgIm5hbWUiICksCisgICAgICAgIH0KKyAgICB0Y19wYWNrYWdlVmVyc2lvbiA9IHsKKyAgICAgICAgJ25hbWUnICAgICAgIDogJ1BhY2thZ2UgdmVyc2lvbicsCisgICAgICAgICdxaGVscCcgICAgICA6ICdUaGUgcGFja2FnZSB2ZXJzaW9uIGFuZCByZXZpc2lvbicsCisgICAgICAgIH0KKyAgICB0Y19zaXplID0geworICAgICAgICAnbmFtZScgICAgICAgOiAnU2l6ZScsCisgICAgICAgICdxaGVscCcgICAgICA6ICdUaGUgc2l6ZSBvZiB0aGUgcGFja2FnZScsCisgICAgICAgICdvcmRlcmZpZWxkJyA6IF9nZXRfdG9nZ2xlX29yZGVyKCByZXF1ZXN0LCAic2l6ZSIsIFRydWUgKSwKKyAgICAgICAgJ29yZGVyaWNvbicgIDogX2dldF90b2dnbGVfb3JkZXJfaWNvbiggcmVxdWVzdCwgInNpemUiICksCisgICAgICAgICdvcmRlcmtleScgICA6ICdzaXplJywKKyAgICAgICAgJ2NsY2xhc3MnICAgIDogJ3NpemUnLAorICAgICAgICAnZGNsYXNzJyAgICAgOiAnc3BhbjInLAorICAgICAgICB9CisgICAgaWYgKCB2YXJpYW50ID09ICd0YXJnZXQnICk6CisgICAgICAgIHRjX3NpemVbICJoaWRkZW4iIF0gPSAwCisgICAgZWxzZToKKyAgICAgICAgdGNfc2l6ZVsgImhpZGRlbiIgXSA9IDEKKyAgICB0Y19zaXplUGVyY2VudGFnZSA9IHsKKyAgICAgICAgJ25hbWUnICAgICAgIDogJ1NpemUgb3ZlciB0b3RhbCAoJSknLAorICAgICAgICAncWhlbHAnICAgICAgOiAnUHJvcG9ydGlvbiBvZiB0aGUgb3ZlcmFsbCBzaXplIHJlcHJlc2VudGVkIGJ5IHRoaXMgcGFja2FnZScsCisgICAgICAgICdjbGNsYXNzJyAgICA6ICdzaXplX292ZXJfdG90YWwnLAorICAgICAgICAnaGlkZGVuJyAgICAgOiAxLAorICAgICAgICB9CisgICAgdGNfbGljZW5zZSA9IHsKKyAgICAgICAgJ25hbWUnICAgICAgIDogJ0xpY2Vuc2UnLAorICAgICAgICAncWhlbHAnICAgICAgOiAnVGhlIGxpY2Vuc2UgdW5kZXIgd2hpY2ggdGhlIHBhY2thZ2UgaXMgZGlzdHJpYnV0ZWQuIFNlcGFyYXRlIGxpY2Vuc2UgbmFtZXMgdVwKK3NpbmcgfCAocGlwZSkgbWVhbnMgdGhlcmUgaXMgYSBjaG9pY2UgYmV0d2VlbiBsaWNlbnNlcy4gU2VwYXJhdGUgbGljZW5zZSBuYW1lcyB1c2luZyAmIChhbXBlcnNhbmQpIG1cCitlYW5zIG11bHRpcGxlIGxpY2Vuc2VzIGV4aXN0IHRoYXQgY292ZXIgZGlmZmVyZW50IHBhcnRzIG9mIHRoZSBzb3VyY2UnLAorICAgICAgICAnb3JkZXJmaWVsZCcgOiBfZ2V0X3RvZ2dsZV9vcmRlciggcmVxdWVzdCwgImxpY2Vuc2UiICksCisgICAgICAgICdvcmRlcmljb24nICA6IF9nZXRfdG9nZ2xlX29yZGVyX2ljb24oIHJlcXVlc3QsICJsaWNlbnNlIiApLAorICAgICAgICAnb3JkZXJrZXknICAgOiAnbGljZW5zZScsCisgICAgICAgICdjbGNsYXNzJyAgICA6ICdsaWNlbnNlJywKKyAgICAgICAgfQorICAgIGlmICggdmFyaWFudCA9PSAndGFyZ2V0JyApOgorICAgICAgICB0Y19saWNlbnNlWyAiaGlkZGVuIiBdID0gMQorICAgIGVsc2U6CisgICAgICAgIHRjX2xpY2Vuc2VbICJoaWRkZW4iIF0gPSAwCisgICAgdGNfZGVwZW5kZW5jaWVzID0geworICAgICAgICAnbmFtZScgICAgICAgOiAnRGVwZW5kZW5jaWVzJywKKyAgICAgICAgJ3FoZWxwJyAgICAgIDogIlBhY2thZ2UgcnVudGltZSBkZXBlbmRlbmNpZXMgKG90aGVyIHBhY2thZ2VzKSIsCisgICAgICAgICdjbGNsYXNzJyAgICA6ICdkZXBlbmRzJywKKyAgICAgICAgfQorICAgIGlmICggdmFyaWFudCA9PSAndGFyZ2V0JyApOgorICAgICAgICB0Y19kZXBlbmRlbmNpZXNbICJoaWRkZW4iIF0gPSAwCisgICAgZWxzZToKKyAgICAgICAgdGNfZGVwZW5kZW5jaWVzWyAiaGlkZGVuIiBdID0gMQorICAgIHRjX3JkZXBlbmRlbmNpZXMgPSB7CisgICAgICAgICduYW1lJyAgICAgICA6ICdSZXZlcnNlIGRlcGVuZGVuY2llcycsCisgICAgICAgICdxaGVscCcgICAgICA6ICdQYWNrYWdlIHJ1bi10aW1lIHJldmVyc2UgZGVwZW5kZW5jaWVzIChpLmUuIHdoaWNoIG90aGVyIHBhY2thZ2VzIGRlcGVuZCBvbiB0aGlzIHBhY2thZ2UnLAorICAgICAgICAnY2xjbGFzcycgICAgOiAnYnJvdWdodF9pbl9ieScsCisgICAgICAgIH0KKyAgICBpZiAoIHZhcmlhbnQgPT0gJ3RhcmdldCcgKToKKyAgICAgICAgdGNfcmRlcGVuZGVuY2llc1sgImhpZGRlbiIgXSA9IDAKKyAgICBlbHNlOgorICAgICAgICB0Y19yZGVwZW5kZW5jaWVzWyAiaGlkZGVuIiBdID0gMQorICAgIHRjX3JlY2lwZSA9IHsKKyAgICAgICAgJ25hbWUnICAgICAgIDogJ1JlY2lwZScsCisgICAgICAgICdxaGVscCcgICAgICA6ICdUaGUgbmFtZSBvZiB0aGUgcmVjaXBlIGJ1aWxkaW5nIHRoZSBwYWNrYWdlJywKKyAgICAgICAgJ29yZGVyZmllbGQnIDogX2dldF90b2dnbGVfb3JkZXIoIHJlcXVlc3QsICJyZWNpcGVfX25hbWUiICksCisgICAgICAgICdvcmRlcmljb24nICA6IF9nZXRfdG9nZ2xlX29yZGVyX2ljb24oIHJlcXVlc3QsICJyZWNpcGVfX25hbWUiICksCisgICAgICAgICdvcmRlcmtleScgICA6ICJyZWNpcGVfX25hbWUiLAorICAgICAgICAnY2xjbGFzcycgICAgOiAncmVjaXBlX25hbWUnLAorICAgICAgICAnaGlkZGVuJyAgICAgOiAwLAorICAgICAgICB9CisgICAgdGNfcmVjaXBlVmVyc2lvbiA9IHsKKyAgICAgICAgJ25hbWUnICAgICAgIDogJ1JlY2lwZSB2ZXJzaW9uJywKKyAgICAgICAgJ3FoZWxwJyAgICAgIDogJ1ZlcnNpb24gYW5kIHJldmlzaW9uIG9mIHRoZSByZWNpcGUgYnVpbGRpbmcgdGhlIHBhY2thZ2UnLAorICAgICAgICAnY2xjbGFzcycgICAgOiAncmVjaXBlX3ZlcnNpb24nLAorICAgICAgICAnaGlkZGVuJyAgICAgOiAxLAorICAgICAgICB9CisgICAgdGNfbGF5ZXIgPSB7CisgICAgICAgICduYW1lJyAgICAgICA6ICdMYXllcicsCisgICAgICAgICdxaGVscCcgICAgICA6ICdUaGUgbmFtZSBvZiB0aGUgbGF5ZXIgcHJvdmlkaW5nIHRoZSByZWNpcGUgdGhhdCBidWlsZHMgdGhlIHBhY2thZ2UnLAorICAgICAgICAnb3JkZXJmaWVsZCcgOiBfZ2V0X3RvZ2dsZV9vcmRlciggcmVxdWVzdCwgInJlY2lwZV9fbGF5ZXJfdmVyc2lvbl9fbGF5ZXJfX25hbWUiICksCisgICAgICAgICdvcmRlcmljb24nICA6IF9nZXRfdG9nZ2xlX29yZGVyX2ljb24oIHJlcXVlc3QsICJyZWNpcGVfX2xheWVyX3ZlcnNpb25fX2xheWVyX19uYW1lIiApLAorICAgICAgICAnb3JkZXJrZXknICAgOiAicmVjaXBlX19sYXllcl92ZXJzaW9uX19sYXllcl9fbmFtZSIsCisgICAgICAgICdjbGNsYXNzJyAgICA6ICdsYXllcl9uYW1lJywKKyAgICAgICAgJ2hpZGRlbicgICAgIDogMSwKKyAgICAgICAgfQorICAgIHRjX2xheWVyQnJhbmNoID0geworICAgICAgICAnbmFtZScgICAgICAgOiAnTGF5ZXIgYnJhbmNoJywKKyAgICAgICAgJ3FoZWxwJyAgICAgIDogJ1RoZSBHaXQgYnJhbmNoIG9mIHRoZSBsYXllciBwcm92aWRpbmcgdGhlIHJlY2lwZSB0aGF0IGJ1aWxkcyB0aGUgcGFja2FnZScsCisgICAgICAgICdvcmRlcmZpZWxkJyA6IF9nZXRfdG9nZ2xlX29yZGVyKCByZXF1ZXN0LCAicmVjaXBlX19sYXllcl92ZXJzaW9uX19icmFuY2giICksCisgICAgICAgICdvcmRlcmljb24nICA6IF9nZXRfdG9nZ2xlX29yZGVyX2ljb24oIHJlcXVlc3QsICJyZWNpcGVfX2xheWVyX3ZlcnNpb25fX2JyYW5jaCIgKSwKKyAgICAgICAgJ29yZGVya2V5JyAgIDogInJlY2lwZV9fbGF5ZXJfdmVyc2lvbl9fYnJhbmNoIiwKKyAgICAgICAgJ2NsY2xhc3MnICAgIDogJ2xheWVyX2JyYW5jaCcsCisgICAgICAgICdoaWRkZW4nICAgICA6IDEsCisgICAgICAgIH0KKyAgICB0Y19sYXllckNvbW1pdCA9IHsKKyAgICAgICAgJ25hbWUnICAgICAgIDogJ0xheWVyIGNvbW1pdCcsCisgICAgICAgICdxaGVscCcgICAgICA6ICdUaGUgR2l0IGNvbW1pdCBvZiB0aGUgbGF5ZXIgcHJvdmlkaW5nIHRoZSByZWNpcGUgdGhhdCBidWlsZHMgdGhlIHBhY2thZ2UnLAorICAgICAgICAnY2xjbGFzcycgICAgOiAnbGF5ZXJfY29tbWl0JywKKyAgICAgICAgJ2hpZGRlbicgICAgIDogMSwKKyAgICAgICAgfQorCisgICAgY29udGV4dCA9IHsKKyAgICAgICAgJ29iamVjdG5hbWUnOiB2YXJpYW50LAorICAgICAgICAnYnVpbGQnICAgICAgICAgICAgICAgIDogYnVpbGQsCisgICAgICAgICd0YXJnZXQnICAgICAgICAgICAgICAgOiBUYXJnZXQub2JqZWN0cy5maWx0ZXIoIHBrID0gdGFyZ2V0X2lkIClbIDAgXSwKKyAgICAgICAgJ29iamVjdHMnICAgICAgICAgICAgICA6IHBhY2thZ2VzLAorICAgICAgICAncGFja2FnZXNfc3VtJyAgICAgICAgIDogcGFja2FnZXNfc3VtWyAnaW5zdGFsbGVkX3NpemVfX3N1bScgXSwKKyAgICAgICAgJ29iamVjdF9zZWFyY2hfZGlzcGxheSc6ICJwYWNrYWdlcyBpbmNsdWRlZCIsCisgICAgICAgICdkZWZhdWx0X29yZGVyYnknICAgICAgOiBvcmRlcmJ5LAorICAgICAgICAndGFibGVjb2xzJyAgICAgICAgICAgIDogWworICAgICAgICAgICAgICAgICAgICB0Y19wYWNrYWdlLAorICAgICAgICAgICAgICAgICAgICB0Y19wYWNrYWdlVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgdGNfbGljZW5zZSwKKyAgICAgICAgICAgICAgICAgICAgdGNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgdGNfc2l6ZVBlcmNlbnRhZ2UsCisgICAgICAgICAgICAgICAgICAgIHRjX2RlcGVuZGVuY2llcywKKyAgICAgICAgICAgICAgICAgICAgdGNfcmRlcGVuZGVuY2llcywKKyAgICAgICAgICAgICAgICAgICAgdGNfcmVjaXBlLAorICAgICAgICAgICAgICAgICAgICB0Y19yZWNpcGVWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICB0Y19sYXllciwKKyAgICAgICAgICAgICAgICAgICAgdGNfbGF5ZXJCcmFuY2gsCisgICAgICAgICAgICAgICAgICAgIHRjX2xheWVyQ29tbWl0LAorICAgICAgICAgICAgICAgIF0KKyAgICAgICAgfQorCisKKyAgICByZXNwb25zZSA9IHJlbmRlcihyZXF1ZXN0LCB0ZW1wbGF0ZSwgY29udGV4dCkKKyAgICBfc2V0X3BhcmFtZXRlcnNfdmFsdWVzKHBhZ2VzaXplLCBvcmRlcmJ5LCByZXF1ZXN0KQorICAgIHJldHVybiByZXNwb25zZQorCitkZWYgdGFyZ2V0KCByZXF1ZXN0LCBidWlsZF9pZCwgdGFyZ2V0X2lkICk6CisgICAgcmV0dXJuKCB0YXJnZXRfY29tbW9uKCByZXF1ZXN0LCBidWlsZF9pZCwgdGFyZ2V0X2lkLCAidGFyZ2V0IiApKQorCitkZWYgdGFyZ2V0cGtnKCByZXF1ZXN0LCBidWlsZF9pZCwgdGFyZ2V0X2lkICk6CisgICAgcmV0dXJuKCB0YXJnZXRfY29tbW9uKCByZXF1ZXN0LCBidWlsZF9pZCwgdGFyZ2V0X2lkLCAidGFyZ2V0cGtnIiApKQorCitmcm9tIGRqYW5nby5jb3JlLnNlcmlhbGl6ZXJzLmpzb24gaW1wb3J0IERqYW5nb0pTT05FbmNvZGVyCitmcm9tIGRqYW5nby5odHRwIGltcG9ydCBIdHRwUmVzcG9uc2UKK2RlZiB4aHJfZGlyaW5mbyhyZXF1ZXN0LCBidWlsZF9pZCwgdGFyZ2V0X2lkKToKKyAgICB0b3AgPSByZXF1ZXN0LkdFVC5nZXQoJ3N0YXJ0JywgJy8nKQorICAgIHJldHVybiBIdHRwUmVzcG9uc2UoX2dldF9kaXJfZW50cmllcyhidWlsZF9pZCwgdGFyZ2V0X2lkLCB0b3ApLCBjb250ZW50X3R5cGUgPSAiYXBwbGljYXRpb24vanNvbiIpCisKK2Zyb20gZGphbmdvLnV0aWxzLmZ1bmN0aW9uYWwgaW1wb3J0IFByb21pc2UKK2Zyb20gZGphbmdvLnV0aWxzLmVuY29kaW5nIGltcG9ydCBmb3JjZV90ZXh0CitjbGFzcyBMYXp5RW5jb2Rlcihqc29uLkpTT05FbmNvZGVyKToKKyAgICBkZWYgZGVmYXVsdChzZWxmLCBvYmopOgorICAgICAgICBpZiBpc2luc3RhbmNlKG9iaiwgUHJvbWlzZSk6CisgICAgICAgICAgICByZXR1cm4gZm9yY2VfdGV4dChvYmopCisgICAgICAgIHJldHVybiBzdXBlcihMYXp5RW5jb2Rlciwgc2VsZikuZGVmYXVsdChvYmopCisKK2Zyb20gdG9hc3Rlcmd1aS50ZW1wbGF0ZXRhZ3MucHJvamVjdHRhZ3MgaW1wb3J0IGZpbHRlcmVkX2ZpbGVzaXplZm9ybWF0CitpbXBvcnQgb3MKK2RlZiBfZ2V0X2Rpcl9lbnRyaWVzKGJ1aWxkX2lkLCB0YXJnZXRfaWQsIHN0YXJ0KToKKyAgICBub2RlX3N0ciA9IHsKKyAgICAgICAgVGFyZ2V0X0ZpbGUuSVRZUEVfUkVHVUxBUiAgIDogJy0nLAorICAgICAgICBUYXJnZXRfRmlsZS5JVFlQRV9ESVJFQ1RPUlkgOiAnZCcsCisgICAgICAgIFRhcmdldF9GaWxlLklUWVBFX1NZTUxJTksgICA6ICdsJywKKyAgICAgICAgVGFyZ2V0X0ZpbGUuSVRZUEVfU09DS0VUICAgIDogJ3MnLAorICAgICAgICBUYXJnZXRfRmlsZS5JVFlQRV9GSUZPICAgICAgOiAncCcsCisgICAgICAgIFRhcmdldF9GaWxlLklUWVBFX0NIQVJBQ1RFUiA6ICdjJywKKyAgICAgICAgVGFyZ2V0X0ZpbGUuSVRZUEVfQkxPQ0sgICAgIDogJ2InLAorICAgIH0KKyAgICByZXNwb25zZSA9IFtdCisgICAgb2JqZWN0cyAgPSBUYXJnZXRfRmlsZS5vYmplY3RzLmZpbHRlcih0YXJnZXRfX2V4YWN0PXRhcmdldF9pZCwgZGlyZWN0b3J5X19wYXRoPXN0YXJ0KQorICAgIHRhcmdldF9wYWNrYWdlcyA9IFRhcmdldF9JbnN0YWxsZWRfUGFja2FnZS5vYmplY3RzLmZpbHRlcih0YXJnZXRfX2V4YWN0PXRhcmdldF9pZCkudmFsdWVzX2xpc3QoJ3BhY2thZ2VfaWQnLCBmbGF0PVRydWUpCisgICAgZm9yIG8gaW4gb2JqZWN0czoKKyAgICAgICAgIyBleGNsdWRlIHJvb3QgaW5vZGUgJy8nCisgICAgICAgIGlmIG8ucGF0aCA9PSAnLyc6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBlbnRyeSA9IHt9CisgICAgICAgICAgICBlbnRyeVsncGFyZW50J10gPSBzdGFydAorICAgICAgICAgICAgZW50cnlbJ25hbWUnXSA9IG9zLnBhdGguYmFzZW5hbWUoby5wYXRoKQorICAgICAgICAgICAgZW50cnlbJ2Z1bGxwYXRoJ10gPSBvLnBhdGgKKworICAgICAgICAgICAgIyBzZXQgZGVmYXVsdHMsIG5vdCBhbGwgZGVudHJpZXMgaGF2ZSBwYWNrYWdlcworICAgICAgICAgICAgZW50cnlbJ2luc3RhbGxlZF9wYWNrYWdlJ10gPSBOb25lCisgICAgICAgICAgICBlbnRyeVsncGFja2FnZV9pZCddID0gTm9uZQorICAgICAgICAgICAgZW50cnlbJ3BhY2thZ2UnXSA9IE5vbmUKKyAgICAgICAgICAgIGVudHJ5WydsaW5rX3RvJ10gPSBOb25lCisgICAgICAgICAgICBpZiBvLmlub2RldHlwZSA9PSBUYXJnZXRfRmlsZS5JVFlQRV9ESVJFQ1RPUlk6CisgICAgICAgICAgICAgICAgZW50cnlbJ2lzZGlyJ10gPSAxCisgICAgICAgICAgICAgICAgIyBpcyB0aGVyZSBjb250ZW50IGluIGRpcmVjdG9yeQorICAgICAgICAgICAgICAgIGVudHJ5WydjaGlsZGNvdW50J10gPSBUYXJnZXRfRmlsZS5vYmplY3RzLmZpbHRlcih0YXJnZXRfX2V4YWN0PXRhcmdldF9pZCwgZGlyZWN0b3J5X19wYXRoPW8ucGF0aCkuYWxsKCkuY291bnQoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBlbnRyeVsnaXNkaXInXSA9IDAKKworICAgICAgICAgICAgICAgICMgcmVzb2x2ZSB0aGUgZmlsZSB0byBnZXQgdGhlIHBhY2thZ2UgZnJvbSB0aGUgcmVzb2x2ZWQgZmlsZQorICAgICAgICAgICAgICAgIHJlc29sdmVkX2lkID0gby5zeW1fdGFyZ2V0X2lkCisgICAgICAgICAgICAgICAgcmVzb2x2ZWRfcGF0aCA9IG8ucGF0aAorICAgICAgICAgICAgICAgIGlmIHRhcmdldF9wYWNrYWdlcy5jb3VudCgpOgorICAgICAgICAgICAgICAgICAgICB3aGlsZSByZXNvbHZlZF9pZCAhPSAiIiBhbmQgcmVzb2x2ZWRfaWQgIT0gTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRmID0gVGFyZ2V0X0ZpbGUub2JqZWN0cy5nZXQocGs9cmVzb2x2ZWRfaWQpCisgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZF9wYXRoID0gdGYucGF0aAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRfaWQgPSB0Zi5zeW1fdGFyZ2V0X2lkCisKKyAgICAgICAgICAgICAgICAgICAgdGhpc2ZpbGU9UGFja2FnZV9GaWxlLm9iamVjdHMuYWxsKCkuZmlsdGVyKHBhdGhfX2V4YWN0PXJlc29sdmVkX3BhdGgsIHBhY2thZ2VfaWRfX2luPXRhcmdldF9wYWNrYWdlcykKKyAgICAgICAgICAgICAgICAgICAgaWYgdGhpc2ZpbGUuY291bnQoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBQYWNrYWdlLm9iamVjdHMuZ2V0KHBrPXRoaXNmaWxlWzBdLnBhY2thZ2VfaWQpCisgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeVsnaW5zdGFsbGVkX3BhY2thZ2UnXSA9IHAuaW5zdGFsbGVkX25hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5WydwYWNrYWdlX2lkJ10gPSBzdHIocC5pZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5WydwYWNrYWdlJ10gPSBwLm5hbWUKKyAgICAgICAgICAgICAgICAjIGRvbid0IHVzZSByZXNvbHZlZCBwYXRoIGZyb20gYWJvdmUsIHNob3cgaW1tZWRpYXRlIGxpbmstdG8KKyAgICAgICAgICAgICAgICBpZiBvLnN5bV90YXJnZXRfaWQgIT0gIiIgYW5kIG8uc3ltX3RhcmdldF9pZCAhPSBOb25lOgorICAgICAgICAgICAgICAgICAgICBlbnRyeVsnbGlua190byddID0gVGFyZ2V0X0ZpbGUub2JqZWN0cy5nZXQocGs9by5zeW1fdGFyZ2V0X2lkKS5wYXRoCisgICAgICAgICAgICBlbnRyeVsnc2l6ZSddID0gZmlsdGVyZWRfZmlsZXNpemVmb3JtYXQoby5zaXplKQorICAgICAgICAgICAgaWYgZW50cnlbJ2xpbmtfdG8nXSAhPSBOb25lOgorICAgICAgICAgICAgICAgIGVudHJ5WydwZXJtaXNzaW9uJ10gPSBub2RlX3N0cltvLmlub2RldHlwZV0gKyBvLnBlcm1pc3Npb24KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZW50cnlbJ3Blcm1pc3Npb24nXSA9IG5vZGVfc3RyW28uaW5vZGV0eXBlXSArIG8ucGVybWlzc2lvbgorICAgICAgICAgICAgZW50cnlbJ293bmVyJ10gPSBvLm93bmVyCisgICAgICAgICAgICBlbnRyeVsnZ3JvdXAnXSA9IG8uZ3JvdXAKKyAgICAgICAgICAgIHJlc3BvbnNlLmFwcGVuZChlbnRyeSkKKworICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICBwcmludCAiRXhjZXB0aW9uICIsIGUKKyAgICAgICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoZSkKKworICAgICMgc29ydCBieSBkaXJlY3RvcmllcyBmaXJzdCwgdGhlbiBieSBuYW1lCisgICAgcnNvcnRlZCA9IHNvcnRlZChyZXNwb25zZSwga2V5PWxhbWJkYSBlbnRyeSA6ICBlbnRyeVsnbmFtZSddKQorICAgIHJzb3J0ZWQgPSBzb3J0ZWQocnNvcnRlZCwga2V5PWxhbWJkYSBlbnRyeSA6ICBlbnRyeVsnaXNkaXInXSwgcmV2ZXJzZT1UcnVlKQorICAgIHJldHVybiBqc29uLmR1bXBzKHJzb3J0ZWQsIGNscz1MYXp5RW5jb2RlcikucmVwbGFjZSgnPC8nLCAnPFxcLycpCisKK2RlZiBkaXJpbmZvKHJlcXVlc3QsIGJ1aWxkX2lkLCB0YXJnZXRfaWQsIGZpbGVfcGF0aD1Ob25lKToKKyAgICB0ZW1wbGF0ZSA9ICJkaXJpbmZvLmh0bWwiCisgICAgb2JqZWN0cyA9IF9nZXRfZGlyX2VudHJpZXMoYnVpbGRfaWQsIHRhcmdldF9pZCwgJy8nKQorICAgIHBhY2thZ2VzX3N1bSA9IFBhY2thZ2Uub2JqZWN0cy5maWx0ZXIoaWRfX2luPVRhcmdldF9JbnN0YWxsZWRfUGFja2FnZS5vYmplY3RzLmZpbHRlcih0YXJnZXRfaWQ9dGFyZ2V0X2lkKS52YWx1ZXMoJ3BhY2thZ2VfaWQnKSkuYWdncmVnYXRlKFN1bSgnaW5zdGFsbGVkX3NpemUnKSkKKyAgICBkaXJfbGlzdCA9IE5vbmUKKyAgICBpZiBmaWxlX3BhdGggIT0gTm9uZToKKyAgICAgICAgIiIiCisgICAgICAgIExpbmsgZnJvbSB0aGUgaW5jbHVkZWQgcGFja2FnZSBkZXRhaWwgZmlsZSBsaXN0IHBhZ2UgYW5kIGlzCisgICAgICAgIHJlcXVlc3Rpbmcgb3BlbmluZyB0aGUgZGlyIGluZm8gdG8gYSBzcGVjaWZpYyBmaWxlIHBhdGguCisgICAgICAgIFByb3ZpZGUgdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdG8gZXhwYW5kIGFuZCB0aGUgZnVsbCBwYXRoIHRvCisgICAgICAgIGhpZ2hsaWdodCBpbiB0aGUgcGFnZS4KKyAgICAgICAgIiIiCisgICAgICAgICMgQWFzc3VtZSB0YXJnZXQncyBwYXRoIHNlcGFyYXRvciBtYXRjaGVzIGhvc3QncywgdGhhdCBpcywgb3Muc2VwCisgICAgICAgIHNlcCA9IG9zLnNlcAorICAgICAgICBkaXJfbGlzdCA9IFtdCisgICAgICAgIGhlYWQgPSBmaWxlX3BhdGgKKyAgICAgICAgd2hpbGUgaGVhZCAhPSBzZXA6CisgICAgICAgICAgICAoaGVhZCwgdGFpbCkgPSBvcy5wYXRoLnNwbGl0KGhlYWQpCisgICAgICAgICAgICBpZiBoZWFkICE9IHNlcDoKKyAgICAgICAgICAgICAgICBkaXJfbGlzdC5pbnNlcnQoMCwgaGVhZCkKKworICAgIGNvbnRleHQgPSB7ICdidWlsZCc6IEJ1aWxkLm9iamVjdHMuZ2V0KHBrPWJ1aWxkX2lkKSwKKyAgICAgICAgICAgICAgICAndGFyZ2V0JzogVGFyZ2V0Lm9iamVjdHMuZ2V0KHBrPXRhcmdldF9pZCksCisgICAgICAgICAgICAgICAgJ3BhY2thZ2VzX3N1bSc6IHBhY2thZ2VzX3N1bVsnaW5zdGFsbGVkX3NpemVfX3N1bSddLAorICAgICAgICAgICAgICAgICdvYmplY3RzJzogb2JqZWN0cywKKyAgICAgICAgICAgICAgICAnZGlyX2xpc3QnOiBkaXJfbGlzdCwKKyAgICAgICAgICAgICAgICAnZmlsZV9wYXRoJzogZmlsZV9wYXRoLAorICAgICAgICAgICAgICB9CisgICAgcmV0dXJuIHJlbmRlcihyZXF1ZXN0LCB0ZW1wbGF0ZSwgY29udGV4dCkKKworZGVmIF9maW5kX3Rhc2tfZGVwKHRhc2tfb2JqZWN0KToKKyAgICByZXR1cm4gbWFwKGxhbWJkYSB4OiB4LmRlcGVuZHNfb24sIFRhc2tfRGVwZW5kZW5jeS5vYmplY3RzLmZpbHRlcih0YXNrPXRhc2tfb2JqZWN0KS5maWx0ZXIoZGVwZW5kc19vbl9fb3JkZXJfX2d0ID0gMCkuZXhjbHVkZShkZXBlbmRzX29uX19vdXRjb21lID0gVGFzay5PVVRDT01FX05BKS5zZWxlY3RfcmVsYXRlZCgiZGVwZW5kc19vbiIpKQorCisKK2RlZiBfZmluZF90YXNrX3JldmRlcCh0YXNrX29iamVjdCk6CisgICAgdHAgPSBbXQorICAgIHRwID0gbWFwKGxhbWJkYSB0OiB0LnRhc2ssIFRhc2tfRGVwZW5kZW5jeS5vYmplY3RzLmZpbHRlcihkZXBlbmRzX29uPXRhc2tfb2JqZWN0KS5maWx0ZXIodGFza19fb3JkZXJfX2d0PTApLmV4Y2x1ZGUodGFza19fb3V0Y29tZSA9IFRhc2suT1VUQ09NRV9OQSkuc2VsZWN0X3JlbGF0ZWQoInRhc2siLCAidGFza19fcmVjaXBlIiwgInRhc2tfX2J1aWxkIikpCisgICAgcmV0dXJuIHRwCisKK2RlZiBfZmluZF90YXNrX3JldmRlcF9saXN0KHRhc2tsaXN0KToKKyAgICB0cCA9IFtdCisgICAgdHAgPSBtYXAobGFtYmRhIHQ6IHQudGFzaywgVGFza19EZXBlbmRlbmN5Lm9iamVjdHMuZmlsdGVyKGRlcGVuZHNfb25fX2luPXRhc2tsaXN0KS5maWx0ZXIodGFza19fb3JkZXJfX2d0PTApLmV4Y2x1ZGUodGFza19fb3V0Y29tZSA9IFRhc2suT1VUQ09NRV9OQSkuc2VsZWN0X3JlbGF0ZWQoInRhc2siLCAidGFza19fcmVjaXBlIiwgInRhc2tfX2J1aWxkIikpCisgICAgcmV0dXJuIHRwCisKK2RlZiBfZmluZF90YXNrX3Byb3ZpZGVyKHRhc2tfb2JqZWN0KToKKyAgICB0YXNrX3JldmRlcHMgPSBfZmluZF90YXNrX3JldmRlcCh0YXNrX29iamVjdCkKKyAgICBmb3IgdHIgaW4gdGFza19yZXZkZXBzOgorICAgICAgICBpZiB0ci5vdXRjb21lICE9IFRhc2suT1VUQ09NRV9DT1ZFUkVEOgorICAgICAgICAgICAgcmV0dXJuIHRyCisgICAgZm9yIHRyIGluIHRhc2tfcmV2ZGVwczoKKyAgICAgICAgdHJjID0gX2ZpbmRfdGFza19wcm92aWRlcih0cikKKyAgICAgICAgaWYgdHJjIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHRyYworICAgIHJldHVybiBOb25lCisKK2RlZiB0YXNrc19jb21tb24ocmVxdWVzdCwgYnVpbGRfaWQsIHZhcmlhbnQsIHRhc2tfYW5jaG9yKToKKyMgVGhpcyBjbGFzcyBpcyBzaGFyZWQgYmV0d2VlbiB0aGVzZSBwYWdlcworIworIyBDb2x1bW4gICAgdGFza3MgIGJ1aWxkdGltZSAgZGlza2lvICBjcHV1c2FnZQorIyAtLS0tLS0tLS0gLS0tLS0tIC0tLS0tLS0tLS0gLS0tLS0tLSAtLS0tLS0tLS0KKyMgQ2FjaGUgICAgICBkZWYKKyMgQ1BVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4gLQorIyBEaXNrICAgICAgICAgICAgICAgICAgICAgICAgIG1pbiAtCisjIEV4ZWN1dGVkICAgZGVmICAgICBkZWYgICAgICAgZGVmICAgICAgZGVmCisjIExvZworIyBPcmRlciAgICAgIGRlZiArCisjIE91dGNvbWUgICAgZGVmICAgICBkZWYgICAgICAgZGVmICAgICAgZGVmCisjIFJlY2lwZSAgICAgbWluICAgICBtaW4gICAgICAgbWluICAgICAgbWluCisjIFZlcnNpb24KKyMgVGFzayAgICAgICBtaW4gICAgIG1pbiAgICAgICBtaW4gICAgICBtaW4KKyMgVGltZSAgICAgICAgICAgICAgIG1pbiAtCisjCisjICdtaW4nOm9uIGFsd2F5cywgJ2RlZic6b24gYnkgZGVmYXVsdCwgZWxzZSBoaWRkZW4KKyMgJysnIGRlZmF1bHQgY29sdW1uIHNvcnQgdXAsICctJyBkZWZhdWx0IGNvbHVtbiBzb3J0IGRvd24KKworICAgIGFuY2hvciA9IHJlcXVlc3QuR0VULmdldCgnYW5jaG9yJywgJycpCisgICAgaWYgbm90IGFuY2hvcjoKKyAgICAgICAgYW5jaG9yPXRhc2tfYW5jaG9yCisKKyAgICAjIGRlZmF1bHQgb3JkZXJpbmcgZGVwZW5kcyBvbiB2YXJpYW50CisgICAgaWYgICAnYnVpbGR0aW1lJyA9PSB2YXJpYW50OgorICAgICAgICB0aXRsZV92YXJpYW50PSdUaW1lJworICAgICAgICBvYmplY3Rfc2VhcmNoX2Rpc3BsYXk9InRpbWUgZGF0YSIKKyAgICAgICAgZmlsdGVyX3NlYXJjaF9kaXNwbGF5PSJ0YXNrcyIKKyAgICAgICAgKHBhZ2VzaXplLCBvcmRlcmJ5KSA9IF9nZXRfcGFyYW1ldGVyc192YWx1ZXMocmVxdWVzdCwgMjUsICdlbGFwc2VkX3RpbWU6LScpCisgICAgZWxpZiAnZGlza2lvJyAgICA9PSB2YXJpYW50OgorICAgICAgICB0aXRsZV92YXJpYW50PSdEaXNrIEkvTycKKyAgICAgICAgb2JqZWN0X3NlYXJjaF9kaXNwbGF5PSJkaXNrIEkvTyBkYXRhIgorICAgICAgICBmaWx0ZXJfc2VhcmNoX2Rpc3BsYXk9InRhc2tzIgorICAgICAgICAocGFnZXNpemUsIG9yZGVyYnkpID0gX2dldF9wYXJhbWV0ZXJzX3ZhbHVlcyhyZXF1ZXN0LCAyNSwgJ2Rpc2tfaW86LScpCisgICAgZWxpZiAnY3B1dXNhZ2UnICA9PSB2YXJpYW50OgorICAgICAgICB0aXRsZV92YXJpYW50PSdDUFUgdXNhZ2UnCisgICAgICAgIG9iamVjdF9zZWFyY2hfZGlzcGxheT0iQ1BVIHVzYWdlIGRhdGEiCisgICAgICAgIGZpbHRlcl9zZWFyY2hfZGlzcGxheT0idGFza3MiCisgICAgICAgIChwYWdlc2l6ZSwgb3JkZXJieSkgPSBfZ2V0X3BhcmFtZXRlcnNfdmFsdWVzKHJlcXVlc3QsIDI1LCAnY3B1X3VzYWdlOi0nKQorICAgIGVsc2UgOgorICAgICAgICB0aXRsZV92YXJpYW50PSdUYXNrcycKKyAgICAgICAgb2JqZWN0X3NlYXJjaF9kaXNwbGF5PSJ0YXNrcyIKKyAgICAgICAgZmlsdGVyX3NlYXJjaF9kaXNwbGF5PSJ0YXNrcyIKKyAgICAgICAgKHBhZ2VzaXplLCBvcmRlcmJ5KSA9IF9nZXRfcGFyYW1ldGVyc192YWx1ZXMocmVxdWVzdCwgMjUsICdvcmRlcjorJykKKworCisgICAgbWFuZGF0b3J5X3BhcmFtZXRlcnMgPSB7ICdjb3VudCc6IHBhZ2VzaXplLCAgJ3BhZ2UnIDogMSwgJ29yZGVyYnknOiBvcmRlcmJ5IH0KKworICAgIHRlbXBsYXRlID0gJ3Rhc2tzLmh0bWwnCisgICAgcmV0dmFsID0gX3ZlcmlmeV9wYXJhbWV0ZXJzKCByZXF1ZXN0LkdFVCwgbWFuZGF0b3J5X3BhcmFtZXRlcnMgKQorICAgIGlmIHJldHZhbDoKKyAgICAgICAgaWYgdGFza19hbmNob3I6CisgICAgICAgICAgICBtYW5kYXRvcnlfcGFyYW1ldGVyc1snYW5jaG9yJ109dGFza19hbmNob3IKKyAgICAgICAgcmV0dXJuIF9yZWRpcmVjdF9wYXJhbWV0ZXJzKCB2YXJpYW50LCByZXF1ZXN0LkdFVCwgbWFuZGF0b3J5X3BhcmFtZXRlcnMsIGJ1aWxkX2lkID0gYnVpbGRfaWQpCisgICAgKGZpbHRlcl9zdHJpbmcsIHNlYXJjaF90ZXJtLCBvcmRlcmluZ19zdHJpbmcpID0gX3NlYXJjaF90dXBsZShyZXF1ZXN0LCBUYXNrKQorICAgIHF1ZXJ5c2V0X2FsbCA9IFRhc2sub2JqZWN0cy5maWx0ZXIoYnVpbGQ9YnVpbGRfaWQpLmV4Y2x1ZGUob3JkZXJfX2lzbnVsbD1UcnVlKS5leGNsdWRlKG91dGNvbWU9VGFzay5PVVRDT01FX05BKQorICAgIHF1ZXJ5c2V0X2FsbCA9IHF1ZXJ5c2V0X2FsbC5zZWxlY3RfcmVsYXRlZCgicmVjaXBlIiwgImJ1aWxkIikKKworICAgIHF1ZXJ5c2V0X3dpdGhfc2VhcmNoID0gX2dldF9xdWVyeXNldChUYXNrLCBxdWVyeXNldF9hbGwsIE5vbmUgLCBzZWFyY2hfdGVybSwgb3JkZXJpbmdfc3RyaW5nLCAnb3JkZXInKQorCisgICAgaWYgb3JkZXJpbmdfc3RyaW5nLnN0YXJ0c3dpdGgoJ291dGNvbWUnKToKKyAgICAgICAgcXVlcnlzZXQgPSBfZ2V0X3F1ZXJ5c2V0KFRhc2ssIHF1ZXJ5c2V0X2FsbCwgZmlsdGVyX3N0cmluZywgc2VhcmNoX3Rlcm0sICdvcmRlcjorJywgJ29yZGVyJykKKyAgICAgICAgcXVlcnlzZXQgPSBzb3J0ZWQocXVlcnlzZXQsIGtleT1sYW1iZGEgdXI6ICh1ci5vdXRjb21lX3RleHQpLCByZXZlcnNlPW9yZGVyaW5nX3N0cmluZy5lbmRzd2l0aCgnLScpKQorICAgIGVsaWYgb3JkZXJpbmdfc3RyaW5nLnN0YXJ0c3dpdGgoJ3NzdGF0ZV9yZXN1bHQnKToKKyAgICAgICAgcXVlcnlzZXQgPSBfZ2V0X3F1ZXJ5c2V0KFRhc2ssIHF1ZXJ5c2V0X2FsbCwgZmlsdGVyX3N0cmluZywgc2VhcmNoX3Rlcm0sICdvcmRlcjorJywgJ29yZGVyJykKKyAgICAgICAgcXVlcnlzZXQgPSBzb3J0ZWQocXVlcnlzZXQsIGtleT1sYW1iZGEgdXI6ICh1ci5zc3RhdGVfdGV4dCksIHJldmVyc2U9b3JkZXJpbmdfc3RyaW5nLmVuZHN3aXRoKCctJykpCisgICAgZWxzZToKKyAgICAgICAgcXVlcnlzZXQgPSBfZ2V0X3F1ZXJ5c2V0KFRhc2ssIHF1ZXJ5c2V0X2FsbCwgZmlsdGVyX3N0cmluZywgc2VhcmNoX3Rlcm0sIG9yZGVyaW5nX3N0cmluZywgJ29yZGVyJykKKworCisgICAgIyBjb21wdXRlIHRoZSBhbmNob3IncyBwYWdlCisgICAgaWYgYW5jaG9yOgorICAgICAgICByZXF1ZXN0LkdFVCA9IHJlcXVlc3QuR0VULmNvcHkoKQorICAgICAgICBkZWwgcmVxdWVzdC5HRVRbJ2FuY2hvciddCisgICAgICAgIGk9MAorICAgICAgICBhPWludChhbmNob3IpCisgICAgICAgIGNvdW50X3Blcl9wYWdlPWludChwYWdlc2l6ZSkKKyAgICAgICAgZm9yIHRhc2tfb2JqZWN0IGluIHF1ZXJ5c2V0Lml0ZXJhdG9yKCk6CisgICAgICAgICAgICBpZiBhID09IHRhc2tfb2JqZWN0Lm9yZGVyOgorICAgICAgICAgICAgICAgIG5ld19wYWdlPSAoaSAvIGNvdW50X3Blcl9wYWdlICkgKyAxCisgICAgICAgICAgICAgICAgcmVxdWVzdC5HRVQuX19zZXRpdGVtX18oJ3BhZ2UnLCBuZXdfcGFnZSkKKyAgICAgICAgICAgICAgICBtYW5kYXRvcnlfcGFyYW1ldGVyc1sncGFnZSddPW5ld19wYWdlCisgICAgICAgICAgICAgICAgcmV0dXJuIF9yZWRpcmVjdF9wYXJhbWV0ZXJzKCB2YXJpYW50LCByZXF1ZXN0LkdFVCwgbWFuZGF0b3J5X3BhcmFtZXRlcnMsIGJ1aWxkX2lkID0gYnVpbGRfaWQpCisgICAgICAgICAgICBpICs9IDEKKworICAgIHRhc2tfb2JqZWN0cyA9IF9idWlsZF9wYWdlX3JhbmdlKFBhZ2luYXRvcihxdWVyeXNldCwgcGFnZXNpemUpLHJlcXVlc3QuR0VULmdldCgncGFnZScsIDEpKQorCisgICAgIyBkZWZpbmUgKGFuZCBtb2RpZnkgYnkgdmFyaWFudHMpIHRoZSAndGFibGVjb2xzJyBtZW1iZXJzCisgICAgdGNfb3JkZXI9eworICAgICAgICAnbmFtZSc6J09yZGVyJywKKyAgICAgICAgJ3FoZWxwJzonVGhlIHJ1bm5pbmcgc2VxdWVuY2Ugb2YgZWFjaCB0YXNrIGluIHRoZSBidWlsZCcsCisgICAgICAgICdjbGNsYXNzJzogJ29yZGVyJywgJ2hpZGRlbicgOiAxLAorICAgICAgICAnb3JkZXJrZXknIDogJ29yZGVyJywKKyAgICAgICAgJ29yZGVyZmllbGQnOl9nZXRfdG9nZ2xlX29yZGVyKHJlcXVlc3QsICJvcmRlciIpLAorICAgICAgICAnb3JkZXJpY29uJzpfZ2V0X3RvZ2dsZV9vcmRlcl9pY29uKHJlcXVlc3QsICJvcmRlciIpfQorICAgIGlmICd0YXNrcycgPT0gdmFyaWFudDoKKyAgICAgICAgdGNfb3JkZXJbJ2hpZGRlbiddPScwJworICAgICAgICBkZWwgdGNfb3JkZXJbJ2NsY2xhc3MnXQorCisgICAgdGNfcmVjaXBlPXsKKyAgICAgICAgJ25hbWUnOidSZWNpcGUnLAorICAgICAgICAncWhlbHAnOidUaGUgbmFtZSBvZiB0aGUgcmVjaXBlIHRvIHdoaWNoIGVhY2ggdGFzayBhcHBsaWVzJywKKyAgICAgICAgJ29yZGVya2V5JyA6ICdyZWNpcGVfX25hbWUnLAorICAgICAgICAnb3JkZXJmaWVsZCc6IF9nZXRfdG9nZ2xlX29yZGVyKHJlcXVlc3QsICJyZWNpcGVfX25hbWUiKSwKKyAgICAgICAgJ29yZGVyaWNvbic6X2dldF90b2dnbGVfb3JkZXJfaWNvbihyZXF1ZXN0LCAicmVjaXBlX19uYW1lIiksCisgICAgfQorICAgIHRjX3JlY2lwZV92ZXJzaW9uPXsKKyAgICAgICAgJ25hbWUnOidSZWNpcGUgdmVyc2lvbicsCisgICAgICAgICdxaGVscCc6J1RoZSB2ZXJzaW9uIG9mIHRoZSByZWNpcGUgdG8gd2hpY2ggZWFjaCB0YXNrIGFwcGxpZXMnLAorICAgICAgICAnY2xjbGFzcyc6ICdyZWNpcGVfdmVyc2lvbicsICdoaWRkZW4nIDogMSwKKyAgICB9CisgICAgdGNfdGFzaz17CisgICAgICAgICduYW1lJzonVGFzaycsCisgICAgICAgICdxaGVscCc6J1RoZSBuYW1lIG9mIHRoZSB0YXNrJywKKyAgICAgICAgJ29yZGVyZmllbGQnOiBfZ2V0X3RvZ2dsZV9vcmRlcihyZXF1ZXN0LCAidGFza19uYW1lIiksCisgICAgICAgICdvcmRlcmljb24nOl9nZXRfdG9nZ2xlX29yZGVyX2ljb24ocmVxdWVzdCwgInRhc2tfbmFtZSIpLAorICAgICAgICAnb3JkZXJrZXknIDogJ3Rhc2tfbmFtZScsCisgICAgfQorICAgIHRjX2V4ZWN1dGVkPXsKKyAgICAgICAgJ25hbWUnOidFeGVjdXRlZCcsCisgICAgICAgICdxaGVscCc6IlRoaXMgdmFsdWUgdGVsbHMgeW91IGlmIGEgdGFzayBoYWQgdG8gcnVuIChleGVjdXRlZCkgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlIHRhc2sgb3V0cHV0LCBvciBpZiB0aGUgb3V0cHV0IHdhcyBwcm92aWRlZCBieSBhbm90aGVyIHRhc2sgYW5kIHRoZXJlZm9yZSB0aGUgdGFzayBkaWRuJ3QgbmVlZCB0byBydW4gKG5vdCBleGVjdXRlZCkiLAorICAgICAgICAnY2xjbGFzcyc6ICdleGVjdXRlZCcsICdoaWRkZW4nIDogMCwKKyAgICAgICAgJ29yZGVyZmllbGQnOiBfZ2V0X3RvZ2dsZV9vcmRlcihyZXF1ZXN0LCAidGFza19leGVjdXRlZCIpLAorICAgICAgICAnb3JkZXJpY29uJzpfZ2V0X3RvZ2dsZV9vcmRlcl9pY29uKHJlcXVlc3QsICJ0YXNrX2V4ZWN1dGVkIiksCisgICAgICAgICdvcmRlcmtleScgOiAndGFza19leGVjdXRlZCcsCisgICAgICAgICdmaWx0ZXInIDogeworICAgICAgICAgICAgICAgICAgICdjbGFzcycgOiAnZXhlY3V0ZWQnLAorICAgICAgICAgICAgICAgICAgICdsYWJlbCc6ICdTaG93OicsCisgICAgICAgICAgICAgICAgICAgJ29wdGlvbnMnIDogWworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnRXhlY3V0ZWQgVGFza3MnLCAndGFza19leGVjdXRlZDoxJywgcXVlcnlzZXRfd2l0aF9zZWFyY2guZmlsdGVyKHRhc2tfZXhlY3V0ZWQ9MSkuY291bnQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdOb3QgRXhlY3V0ZWQgVGFza3MnLCAndGFza19leGVjdXRlZDowJywgcXVlcnlzZXRfd2l0aF9zZWFyY2guZmlsdGVyKHRhc2tfZXhlY3V0ZWQ9MCkuY291bnQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgICAgIH0KKworICAgIH0KKyAgICB0Y19vdXRjb21lPXsKKyAgICAgICAgJ25hbWUnOidPdXRjb21lJywKKyAgICAgICAgJ3FoZWxwJzoiVGhpcyBjb2x1bW4gdGVsbHMgeW91IGlmICdleGVjdXRlZCcgdGFza3Mgc3VjY2VlZGVkIG9yIGZhaWxlZC4gVGhlIGNvbHVtbiBhbHNvIHRlbGxzIHlvdSB3aHkgJ25vdCBleGVjdXRlZCcgdGFza3MgZGlkIG5vdCBuZWVkIHRvIHJ1biIsCisgICAgICAgICdjbGNsYXNzJzogJ291dGNvbWUnLCAnaGlkZGVuJyA6IDAsCisgICAgICAgICdvcmRlcmZpZWxkJzogX2dldF90b2dnbGVfb3JkZXIocmVxdWVzdCwgIm91dGNvbWUiKSwKKyAgICAgICAgJ29yZGVyaWNvbic6X2dldF90b2dnbGVfb3JkZXJfaWNvbihyZXF1ZXN0LCAib3V0Y29tZSIpLAorICAgICAgICAnb3JkZXJrZXknIDogJ291dGNvbWUnLAorICAgICAgICAnZmlsdGVyJyA6IHsKKyAgICAgICAgICAgICAgICAgICAnY2xhc3MnIDogJ291dGNvbWUnLAorICAgICAgICAgICAgICAgICAgICdsYWJlbCc6ICdTaG93OicsCisgICAgICAgICAgICAgICAgICAgJ29wdGlvbnMnIDogWworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnU3VjY2VlZGVkIFRhc2tzJywgJ291dGNvbWU6JWQnJVRhc2suT1VUQ09NRV9TVUNDRVNTLCBxdWVyeXNldF93aXRoX3NlYXJjaC5maWx0ZXIob3V0Y29tZT1UYXNrLk9VVENPTUVfU1VDQ0VTUykuY291bnQoKSwgIidTdWNjZWVkZWQnIHRhc2tzIGFyZSB0aG9zZSB0aGF0IHJhbiBhbmQgY29tcGxldGVkIGR1cmluZyB0aGUgYnVpbGQiICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdGYWlsZWQgVGFza3MnLCAnb3V0Y29tZTolZCclVGFzay5PVVRDT01FX0ZBSUxFRCwgcXVlcnlzZXRfd2l0aF9zZWFyY2guZmlsdGVyKG91dGNvbWU9VGFzay5PVVRDT01FX0ZBSUxFRCkuY291bnQoKSwgIidGYWlsZWQnIHRhc2tzIGFyZSB0aG9zZSB0aGF0IHJhbiBidXQgZGlkIG5vdCBjb21wbGV0ZSBkdXJpbmcgdGhlIGJ1aWxkIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdDYWNoZWQgVGFza3MnLCAnb3V0Y29tZTolZCclVGFzay5PVVRDT01FX0NBQ0hFRCwgcXVlcnlzZXRfd2l0aF9zZWFyY2guZmlsdGVyKG91dGNvbWU9VGFzay5PVVRDT01FX0NBQ0hFRCkuY291bnQoKSwgJ0NhY2hlZCB0YXNrcyByZXN0b3JlIG91dHB1dCBmcm9tIHRoZSA8Y29kZT5zc3RhdGUtY2FjaGU8L2NvZGU+IGRpcmVjdG9yeSBvciBtaXJyb3JzJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdQcmVidWlsdCBUYXNrcycsICdvdXRjb21lOiVkJyVUYXNrLk9VVENPTUVfUFJFQlVJTFQsIHF1ZXJ5c2V0X3dpdGhfc2VhcmNoLmZpbHRlcihvdXRjb21lPVRhc2suT1VUQ09NRV9QUkVCVUlMVCkuY291bnQoKSwnUHJlYnVpbHQgdGFza3MgZGlkblwndCBuZWVkIHRvIHJ1biBiZWNhdXNlIHRoZWlyIG91dHB1dCB3YXMgcmV1c2VkIGZyb20gYSBwcmV2aW91cyBidWlsZCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnQ292ZXJlZCBUYXNrcycsICdvdXRjb21lOiVkJyVUYXNrLk9VVENPTUVfQ09WRVJFRCwgcXVlcnlzZXRfd2l0aF9zZWFyY2guZmlsdGVyKG91dGNvbWU9VGFzay5PVVRDT01FX0NPVkVSRUQpLmNvdW50KCksICdDb3ZlcmVkIHRhc2tzIGRpZG5cJ3QgbmVlZCB0byBydW4gYmVjYXVzZSB0aGVpciBvdXRwdXQgaXMgcHJvdmlkZWQgYnkgYW5vdGhlciB0YXNrIGluIHRoaXMgYnVpbGQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ0VtcHR5IFRhc2tzJywgJ291dGNvbWU6JWQnJVRhc2suT1VUQ09NRV9FTVBUWSwgcXVlcnlzZXRfd2l0aF9zZWFyY2guZmlsdGVyKG91dGNvbWU9VGFzay5PVVRDT01FX0VNUFRZKS5jb3VudCgpLCAnRW1wdHkgdGFza3MgaGF2ZSBubyBleGVjdXRhYmxlIGNvbnRlbnQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICAgICAgICAgfQorCisgICAgfQorCisgICAgdGNfY2FjaGU9eworICAgICAgICAnbmFtZSc6J0NhY2hlIGF0dGVtcHQnLAorICAgICAgICAncWhlbHAnOidUaGlzIGNvbHVtbiB0ZWxscyB5b3UgaWYgYSB0YXNrIHRyaWVkIHRvIHJlc3RvcmUgb3V0cHV0IGZyb20gdGhlIDxjb2RlPnNzdGF0ZS1jYWNoZTwvY29kZT4gZGlyZWN0b3J5IG9yIG1pcnJvcnMsIGFuZCByZXBvcnRzIHRoZSByZXN1bHQ6IFN1Y2NlZWRlZCwgRmFpbGVkIG9yIEZpbGUgbm90IGluIGNhY2hlJywKKyAgICAgICAgJ2NsY2xhc3MnOiAnY2FjaGVfYXR0ZW1wdCcsICdoaWRkZW4nIDogMCwKKyAgICAgICAgJ29yZGVyZmllbGQnOiBfZ2V0X3RvZ2dsZV9vcmRlcihyZXF1ZXN0LCAic3N0YXRlX3Jlc3VsdCIpLAorICAgICAgICAnb3JkZXJpY29uJzpfZ2V0X3RvZ2dsZV9vcmRlcl9pY29uKHJlcXVlc3QsICJzc3RhdGVfcmVzdWx0IiksCisgICAgICAgICdvcmRlcmtleScgOiAnc3N0YXRlX3Jlc3VsdCcsCisgICAgICAgICdmaWx0ZXInIDogeworICAgICAgICAgICAgICAgICAgICdjbGFzcycgOiAnY2FjaGVfYXR0ZW1wdCcsCisgICAgICAgICAgICAgICAgICAgJ2xhYmVsJzogJ1Nob3c6JywKKyAgICAgICAgICAgICAgICAgICAnb3B0aW9ucycgOiBbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdUYXNrcyB3aXRoIGNhY2hlIGF0dGVtcHRzJywgJ3NzdGF0ZV9yZXN1bHRfX2d0OiVkJyVUYXNrLlNTVEFURV9OQSwgcXVlcnlzZXRfd2l0aF9zZWFyY2guZmlsdGVyKHNzdGF0ZV9yZXN1bHRfX2d0PVRhc2suU1NUQVRFX05BKS5jb3VudCgpLCAnU2hvdyBhbGwgdGFza3MgdGhhdCB0cmllZCB0byByZXN0b3JlIG91cHV0IGZyb20gdGhlIDxjb2RlPnNzdGF0ZS1jYWNoZTwvY29kZT4gZGlyZWN0b3J5IG9yIG1pcnJvcnMnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIlRhc2tzIHdpdGggJ0ZpbGUgbm90IGluIGNhY2hlJyBhdHRlbXB0cyIsICdzc3RhdGVfcmVzdWx0OiVkJyVUYXNrLlNTVEFURV9NSVNTLCAgcXVlcnlzZXRfd2l0aF9zZWFyY2guZmlsdGVyKHNzdGF0ZV9yZXN1bHQ9VGFzay5TU1RBVEVfTUlTUykuY291bnQoKSwgJ1Nob3cgdGFza3MgdGhhdCB0cmllZCB0byByZXN0b3JlIG91dHB1dCwgYnV0IGRpZCBub3QgZmluZCBpdCBpbiB0aGUgPGNvZGU+c3N0YXRlLWNhY2hlPC9jb2RlPiBkaXJlY3Rvcnkgb3IgbWlycm9ycycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiVGFza3Mgd2l0aCAnRmFpbGVkJyBjYWNoZSBhdHRlbXB0cyIsICdzc3RhdGVfcmVzdWx0OiVkJyVUYXNrLlNTVEFURV9GQUlMRUQsICBxdWVyeXNldF93aXRoX3NlYXJjaC5maWx0ZXIoc3N0YXRlX3Jlc3VsdD1UYXNrLlNTVEFURV9GQUlMRUQpLmNvdW50KCksICdTaG93IHRhc2tzIHRoYXQgZm91bmQgdGhlIHJlcXVpcmVkIG91dHB1dCBpbiB0aGUgPGNvZGU+c3N0YXRlLWNhY2hlPC9jb2RlPiBkaXJlY3Rvcnkgb3IgbWlycm9ycywgYnV0IGNvdWxkIG5vdCByZXN0b3JlIGl0JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJUYXNrcyB3aXRoICdTdWNjZWVkZWQnIGNhY2hlIGF0dGVtcHRzIiwgJ3NzdGF0ZV9yZXN1bHQ6JWQnJVRhc2suU1NUQVRFX1JFU1RPUkVELCAgcXVlcnlzZXRfd2l0aF9zZWFyY2guZmlsdGVyKHNzdGF0ZV9yZXN1bHQ9VGFzay5TU1RBVEVfUkVTVE9SRUQpLmNvdW50KCksICdTaG93IHRhc2tzIHRoYXQgc3VjY2Vzc2Z1bGx5IHJlc3RvcmVkIHRoZSByZXF1aXJlZCBvdXRwdXQgZnJvbSB0aGUgPGNvZGU+c3N0YXRlLWNhY2hlPC9jb2RlPiBkaXJlY3Rvcnkgb3IgbWlycm9ycycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICAgICB9CisKKyAgICB9CisgICAgI2lmICAgJ3Rhc2tzJyA9PSB2YXJpYW50OiB0Y19jYWNoZVsnaGlkZGVuJ109JzAnOworICAgIHRjX3RpbWU9eworICAgICAgICAnbmFtZSc6J1RpbWUgKHNlY3MpJywKKyAgICAgICAgJ3FoZWxwJzonSG93IGxvbmcgaXQgdG9vayB0aGUgdGFzayB0byBmaW5pc2ggaW4gc2Vjb25kcycsCisgICAgICAgICdvcmRlcmZpZWxkJzogX2dldF90b2dnbGVfb3JkZXIocmVxdWVzdCwgImVsYXBzZWRfdGltZSIsIFRydWUpLAorICAgICAgICAnb3JkZXJpY29uJzpfZ2V0X3RvZ2dsZV9vcmRlcl9pY29uKHJlcXVlc3QsICJlbGFwc2VkX3RpbWUiKSwKKyAgICAgICAgJ29yZGVya2V5JyA6ICdlbGFwc2VkX3RpbWUnLAorICAgICAgICAnY2xjbGFzcyc6ICd0aW1lX3Rha2VuJywgJ2hpZGRlbicgOiAxLAorICAgIH0KKyAgICBpZiAnYnVpbGR0aW1lJyA9PSB2YXJpYW50OgorICAgICAgICB0Y190aW1lWydoaWRkZW4nXT0nMCcKKyAgICAgICAgZGVsIHRjX3RpbWVbJ2NsY2xhc3MnXQorICAgICAgICB0Y19jYWNoZVsnaGlkZGVuJ109JzEnCisKKyAgICB0Y19jcHU9eworICAgICAgICAnbmFtZSc6J0NQVSB1c2FnZScsCisgICAgICAgICdxaGVscCc6J1RoZSBwZXJjZW50YWdlIG9mIHRhc2sgQ1BVIHV0aWxpemF0aW9uJywKKyAgICAgICAgJ29yZGVyZmllbGQnOiBfZ2V0X3RvZ2dsZV9vcmRlcihyZXF1ZXN0LCAiY3B1X3VzYWdlIiwgVHJ1ZSksCisgICAgICAgICdvcmRlcmljb24nOl9nZXRfdG9nZ2xlX29yZGVyX2ljb24ocmVxdWVzdCwgImNwdV91c2FnZSIpLAorICAgICAgICAnb3JkZXJrZXknIDogJ2NwdV91c2FnZScsCisgICAgICAgICdjbGNsYXNzJzogJ2NwdV91c2VkJywgJ2hpZGRlbicgOiAxLAorICAgIH0KKworICAgIGlmICAnY3B1dXNhZ2UnID09IHZhcmlhbnQ6CisgICAgICAgIHRjX2NwdVsnaGlkZGVuJ109JzAnCisgICAgICAgIGRlbCB0Y19jcHVbJ2NsY2xhc3MnXQorICAgICAgICB0Y19jYWNoZVsnaGlkZGVuJ109JzEnCisKKyAgICB0Y19kaXNraW89eworICAgICAgICAnbmFtZSc6J0Rpc2sgSS9PIChtcyknLAorICAgICAgICAncWhlbHAnOidOdW1iZXIgb2YgbWlsaXNlY29uZHMgdGhlIHRhc2sgc3BlbnQgZG9pbmcgZGlzayBpbnB1dCBhbmQgb3V0cHV0JywKKyAgICAgICAgJ29yZGVyZmllbGQnOiBfZ2V0X3RvZ2dsZV9vcmRlcihyZXF1ZXN0LCAiZGlza19pbyIsIFRydWUpLAorICAgICAgICAnb3JkZXJpY29uJzpfZ2V0X3RvZ2dsZV9vcmRlcl9pY29uKHJlcXVlc3QsICJkaXNrX2lvIiksCisgICAgICAgICdvcmRlcmtleScgOiAnZGlza19pbycsCisgICAgICAgICdjbGNsYXNzJzogJ2Rpc2tfaW8nLCAnaGlkZGVuJyA6IDEsCisgICAgfQorICAgIGlmICdkaXNraW8nID09IHZhcmlhbnQ6CisgICAgICAgIHRjX2Rpc2tpb1snaGlkZGVuJ109JzAnCisgICAgICAgIGRlbCB0Y19kaXNraW9bJ2NsY2xhc3MnXQorICAgICAgICB0Y19jYWNoZVsnaGlkZGVuJ109JzEnCisKKyAgICBidWlsZCA9IEJ1aWxkLm9iamVjdHMuZ2V0KHBrPWJ1aWxkX2lkKQorCisgICAgY29udGV4dCA9IHsgJ29iamVjdG5hbWUnOiB2YXJpYW50LAorICAgICAgICAgICAgICAgICdvYmplY3Rfc2VhcmNoX2Rpc3BsYXknOiBvYmplY3Rfc2VhcmNoX2Rpc3BsYXksCisgICAgICAgICAgICAgICAgJ2ZpbHRlcl9zZWFyY2hfZGlzcGxheSc6IGZpbHRlcl9zZWFyY2hfZGlzcGxheSwKKyAgICAgICAgICAgICAgICAndGl0bGUnOiB0aXRsZV92YXJpYW50LAorICAgICAgICAgICAgICAgICdidWlsZCc6IGJ1aWxkLAorICAgICAgICAgICAgICAgICdvYmplY3RzJzogdGFza19vYmplY3RzLAorICAgICAgICAgICAgICAgICdkZWZhdWx0X29yZGVyYnknIDogb3JkZXJieSwKKyAgICAgICAgICAgICAgICAnc2VhcmNoX3Rlcm0nOiBzZWFyY2hfdGVybSwKKyAgICAgICAgICAgICAgICAndG90YWxfY291bnQnOiBxdWVyeXNldF93aXRoX3NlYXJjaC5jb3VudCgpLAorICAgICAgICAgICAgICAgICd0YWJsZWNvbHMnOlsKKyAgICAgICAgICAgICAgICAgICAgdGNfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgIHRjX3JlY2lwZSwKKyAgICAgICAgICAgICAgICAgICAgdGNfcmVjaXBlX3ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgIHRjX3Rhc2ssCisgICAgICAgICAgICAgICAgICAgIHRjX2V4ZWN1dGVkLAorICAgICAgICAgICAgICAgICAgICB0Y19vdXRjb21lLAorICAgICAgICAgICAgICAgICAgICB0Y19jYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgdGNfdGltZSwKKyAgICAgICAgICAgICAgICAgICAgdGNfY3B1LAorICAgICAgICAgICAgICAgICAgICB0Y19kaXNraW8sCisgICAgICAgICAgICAgICAgXX0KKworCisgICAgcmVzcG9uc2UgPSByZW5kZXIocmVxdWVzdCwgdGVtcGxhdGUsIGNvbnRleHQpCisgICAgX3NldF9wYXJhbWV0ZXJzX3ZhbHVlcyhwYWdlc2l6ZSwgb3JkZXJieSwgcmVxdWVzdCkKKyAgICByZXR1cm4gcmVzcG9uc2UKKworZGVmIHRhc2tzKHJlcXVlc3QsIGJ1aWxkX2lkKToKKyAgICByZXR1cm4gdGFza3NfY29tbW9uKHJlcXVlc3QsIGJ1aWxkX2lkLCAndGFza3MnLCAnJykKKworZGVmIHRhc2tzX3Rhc2socmVxdWVzdCwgYnVpbGRfaWQsIHRhc2tfaWQpOgorICAgIHJldHVybiB0YXNrc19jb21tb24ocmVxdWVzdCwgYnVpbGRfaWQsICd0YXNrcycsIHRhc2tfaWQpCisKK2RlZiBidWlsZHRpbWUocmVxdWVzdCwgYnVpbGRfaWQpOgorICAgIHJldHVybiB0YXNrc19jb21tb24ocmVxdWVzdCwgYnVpbGRfaWQsICdidWlsZHRpbWUnLCAnJykKKworZGVmIGRpc2tpbyhyZXF1ZXN0LCBidWlsZF9pZCk6CisgICAgcmV0dXJuIHRhc2tzX2NvbW1vbihyZXF1ZXN0LCBidWlsZF9pZCwgJ2Rpc2tpbycsICcnKQorCitkZWYgY3B1dXNhZ2UocmVxdWVzdCwgYnVpbGRfaWQpOgorICAgIHJldHVybiB0YXNrc19jb21tb24ocmVxdWVzdCwgYnVpbGRfaWQsICdjcHV1c2FnZScsICcnKQorCisKK2RlZiByZWNpcGVzKHJlcXVlc3QsIGJ1aWxkX2lkKToKKyAgICB0ZW1wbGF0ZSA9ICdyZWNpcGVzLmh0bWwnCisgICAgKHBhZ2VzaXplLCBvcmRlcmJ5KSA9IF9nZXRfcGFyYW1ldGVyc192YWx1ZXMocmVxdWVzdCwgMTAwLCAnbmFtZTorJykKKyAgICBtYW5kYXRvcnlfcGFyYW1ldGVycyA9IHsgJ2NvdW50JzogcGFnZXNpemUsICAncGFnZScgOiAxLCAnb3JkZXJieScgOiBvcmRlcmJ5IH0KKyAgICByZXR2YWwgPSBfdmVyaWZ5X3BhcmFtZXRlcnMoIHJlcXVlc3QuR0VULCBtYW5kYXRvcnlfcGFyYW1ldGVycyApCisgICAgaWYgcmV0dmFsOgorICAgICAgICByZXR1cm4gX3JlZGlyZWN0X3BhcmFtZXRlcnMoICdyZWNpcGVzJywgcmVxdWVzdC5HRVQsIG1hbmRhdG9yeV9wYXJhbWV0ZXJzLCBidWlsZF9pZCA9IGJ1aWxkX2lkKQorICAgIChmaWx0ZXJfc3RyaW5nLCBzZWFyY2hfdGVybSwgb3JkZXJpbmdfc3RyaW5nKSA9IF9zZWFyY2hfdHVwbGUocmVxdWVzdCwgUmVjaXBlKQorICAgIHF1ZXJ5c2V0ID0gUmVjaXBlLm9iamVjdHMuZmlsdGVyKGxheWVyX3ZlcnNpb25fX2lkX19pbj1MYXllcl9WZXJzaW9uLm9iamVjdHMuZmlsdGVyKGJ1aWxkPWJ1aWxkX2lkKSkuc2VsZWN0X3JlbGF0ZWQoImxheWVyX3ZlcnNpb24iLCAibGF5ZXJfdmVyc2lvbl9fbGF5ZXIiKQorICAgIHF1ZXJ5c2V0ID0gX2dldF9xdWVyeXNldChSZWNpcGUsIHF1ZXJ5c2V0LCBmaWx0ZXJfc3RyaW5nLCBzZWFyY2hfdGVybSwgb3JkZXJpbmdfc3RyaW5nLCAnbmFtZScpCisKKyAgICByZWNpcGVzID0gX2J1aWxkX3BhZ2VfcmFuZ2UoUGFnaW5hdG9yKHF1ZXJ5c2V0LCBwYWdlc2l6ZSkscmVxdWVzdC5HRVQuZ2V0KCdwYWdlJywgMSkpCisKKyAgICAjIHByZWZldGNoIHRoZSBmb3J3YXJkIGFuZCByZXZlcnNlIHJlY2lwZSBkZXBlbmRlbmNpZXMKKyAgICBkZXBzID0geyB9CisgICAgcmV2cyA9IHsgfQorICAgIHF1ZXJ5c2V0X2RlcGVuZGVuY3k9UmVjaXBlX0RlcGVuZGVuY3kub2JqZWN0cy5maWx0ZXIocmVjaXBlX19sYXllcl92ZXJzaW9uX19idWlsZF9pZCA9IGJ1aWxkX2lkKS5zZWxlY3RfcmVsYXRlZCgiZGVwZW5kc19vbiIsICJyZWNpcGUiKQorICAgIGZvciByZWNpcGUgaW4gcmVjaXBlczoKKyAgICAgICAgZGVwbGlzdCA9IFsgXQorICAgICAgICBmb3IgcmVjaXBlX2RlcCBpbiBbeCBmb3IgeCBpbiBxdWVyeXNldF9kZXBlbmRlbmN5IGlmIHgucmVjaXBlX2lkID09IHJlY2lwZS5pZF06CisgICAgICAgICAgICBkZXBsaXN0LmFwcGVuZChyZWNpcGVfZGVwKQorICAgICAgICBkZXBzW3JlY2lwZS5pZF0gPSBkZXBsaXN0CisgICAgICAgIHJldmxpc3QgPSBbIF0KKyAgICAgICAgZm9yIHJlY2lwZV9kZXAgaW4gW3ggZm9yIHggaW4gcXVlcnlzZXRfZGVwZW5kZW5jeSBpZiB4LmRlcGVuZHNfb25faWQgPT0gcmVjaXBlLmlkXToKKyAgICAgICAgICAgIHJldmxpc3QuYXBwZW5kKHJlY2lwZV9kZXApCisgICAgICAgIHJldnNbcmVjaXBlLmlkXSA9IHJldmxpc3QKKworICAgIGJ1aWxkID0gQnVpbGQub2JqZWN0cy5nZXQocGs9YnVpbGRfaWQpCisKKyAgICBjb250ZXh0ID0geworICAgICAgICAnb2JqZWN0bmFtZSc6ICdyZWNpcGVzJywKKyAgICAgICAgJ2J1aWxkJzogYnVpbGQsCisgICAgICAgICdvYmplY3RzJzogcmVjaXBlcywKKyAgICAgICAgJ2RlZmF1bHRfb3JkZXJieScgOiAnbmFtZTorJywKKyAgICAgICAgJ3JlY2lwZV9kZXBzJyA6IGRlcHMsCisgICAgICAgICdyZWNpcGVfcmV2cycgOiByZXZzLAorICAgICAgICAndGFibGVjb2xzJzpbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJ25hbWUnOidSZWNpcGUnLAorICAgICAgICAgICAgICAgICdxaGVscCc6J0luZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIHBpZWNlIG9mIHNvZnR3YXJlLCBpbmNsdWRpbmcgd2hlcmUgdG8gZG93bmxvYWQgdGhlIHNvdXJjZSwgY29uZmlndXJhdGlvbiBvcHRpb25zLCBob3cgdG8gY29tcGlsZSB0aGUgc291cmNlIGZpbGVzIGFuZCBob3cgdG8gcGFja2FnZSB0aGUgY29tcGlsZWQgb3V0cHV0JywKKyAgICAgICAgICAgICAgICAnb3JkZXJmaWVsZCc6IF9nZXRfdG9nZ2xlX29yZGVyKHJlcXVlc3QsICJuYW1lIiksCisgICAgICAgICAgICAgICAgJ29yZGVyaWNvbic6X2dldF90b2dnbGVfb3JkZXJfaWNvbihyZXF1ZXN0LCAibmFtZSIpLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAnbmFtZSc6J1JlY2lwZSB2ZXJzaW9uJywKKyAgICAgICAgICAgICAgICAncWhlbHAnOidUaGUgcmVjaXBlIHZlcnNpb24gYW5kIHJldmlzaW9uJywKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJ25hbWUnOidEZXBlbmRlbmNpZXMnLAorICAgICAgICAgICAgICAgICdxaGVscCc6J1JlY2lwZSBidWlsZC10aW1lIGRlcGVuZGVuY2llcyAoaS5lLiBvdGhlciByZWNpcGVzKScsCisgICAgICAgICAgICAgICAgJ2NsY2xhc3MnOiAnZGVwZW5kc19vbicsICdoaWRkZW4nOiAxLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAnbmFtZSc6J1JldmVyc2UgZGVwZW5kZW5jaWVzJywKKyAgICAgICAgICAgICAgICAncWhlbHAnOidSZWNpcGUgYnVpbGQtdGltZSByZXZlcnNlIGRlcGVuZGVuY2llcyAoaS5lLiB0aGUgcmVjaXBlcyB0aGF0IGRlcGVuZCBvbiB0aGlzIHJlY2lwZSknLAorICAgICAgICAgICAgICAgICdjbGNsYXNzJzogJ2RlcGVuZHNfYnknLCAnaGlkZGVuJzogMSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJ25hbWUnOidSZWNpcGUgZmlsZScsCisgICAgICAgICAgICAgICAgJ3FoZWxwJzonUGF0aCB0byB0aGUgcmVjaXBlIC5iYiBmaWxlJywKKyAgICAgICAgICAgICAgICAnb3JkZXJmaWVsZCc6IF9nZXRfdG9nZ2xlX29yZGVyKHJlcXVlc3QsICJmaWxlX3BhdGgiKSwKKyAgICAgICAgICAgICAgICAnb3JkZXJpY29uJzpfZ2V0X3RvZ2dsZV9vcmRlcl9pY29uKHJlcXVlc3QsICJmaWxlX3BhdGgiKSwKKyAgICAgICAgICAgICAgICAnb3JkZXJrZXknIDogJ2ZpbGVfcGF0aCcsCisgICAgICAgICAgICAgICAgJ2NsY2xhc3MnOiAncmVjaXBlX2ZpbGUnLCAnaGlkZGVuJzogMCwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJ25hbWUnOidTZWN0aW9uJywKKyAgICAgICAgICAgICAgICAncWhlbHAnOidUaGUgc2VjdGlvbiBpbiB3aGljaCByZWNpcGVzIHNob3VsZCBiZSBjYXRlZ29yaXplZCcsCisgICAgICAgICAgICAgICAgJ29yZGVyZmllbGQnOiBfZ2V0X3RvZ2dsZV9vcmRlcihyZXF1ZXN0LCAic2VjdGlvbiIpLAorICAgICAgICAgICAgICAgICdvcmRlcmljb24nOl9nZXRfdG9nZ2xlX29yZGVyX2ljb24ocmVxdWVzdCwgInNlY3Rpb24iKSwKKyAgICAgICAgICAgICAgICAnb3JkZXJrZXknIDogJ3NlY3Rpb24nLAorICAgICAgICAgICAgICAgICdjbGNsYXNzJzogJ3JlY2lwZV9zZWN0aW9uJywgJ2hpZGRlbic6IDAsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICduYW1lJzonTGljZW5zZScsCisgICAgICAgICAgICAgICAgJ3FoZWxwJzonVGhlIGxpc3Qgb2Ygc291cmNlIGxpY2Vuc2VzIGZvciB0aGUgcmVjaXBlLiBNdWx0aXBsZSBsaWNlbnNlIG5hbWVzIHNlcGFyYXRlZCBieSB0aGUgcGlwZSBjaGFyYWN0ZXIgaW5kaWNhdGVzIGEgY2hvaWNlIGJldHdlZW4gbGljZW5zZXMuIE11bHRpcGxlIGxpY2Vuc2UgbmFtZXMgc2VwYXJhdGVkIGJ5IHRoZSBhbXBlcnNhbmQgY2hhcmFjdGVyIGluZGljYXRlcyBtdWx0aXBsZSBsaWNlbnNlcyBleGlzdCB0aGF0IGNvdmVyIGRpZmZlcmVudCBwYXJ0cyBvZiB0aGUgc291cmNlJywKKyAgICAgICAgICAgICAgICAnb3JkZXJmaWVsZCc6IF9nZXRfdG9nZ2xlX29yZGVyKHJlcXVlc3QsICJsaWNlbnNlIiksCisgICAgICAgICAgICAgICAgJ29yZGVyaWNvbic6X2dldF90b2dnbGVfb3JkZXJfaWNvbihyZXF1ZXN0LCAibGljZW5zZSIpLAorICAgICAgICAgICAgICAgICdvcmRlcmtleScgOiAnbGljZW5zZScsCisgICAgICAgICAgICAgICAgJ2NsY2xhc3MnOiAncmVjaXBlX2xpY2Vuc2UnLCAnaGlkZGVuJzogMCwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJ25hbWUnOidMYXllcicsCisgICAgICAgICAgICAgICAgJ3FoZWxwJzonVGhlIG5hbWUgb2YgdGhlIGxheWVyIHByb3ZpZGluZyB0aGUgcmVjaXBlJywKKyAgICAgICAgICAgICAgICAnb3JkZXJmaWVsZCc6IF9nZXRfdG9nZ2xlX29yZGVyKHJlcXVlc3QsICJsYXllcl92ZXJzaW9uX19sYXllcl9fbmFtZSIpLAorICAgICAgICAgICAgICAgICdvcmRlcmljb24nOl9nZXRfdG9nZ2xlX29yZGVyX2ljb24ocmVxdWVzdCwgImxheWVyX3ZlcnNpb25fX2xheWVyX19uYW1lIiksCisgICAgICAgICAgICAgICAgJ29yZGVya2V5JyA6ICdsYXllcl92ZXJzaW9uX19sYXllcl9fbmFtZScsCisgICAgICAgICAgICAgICAgJ2NsY2xhc3MnOiAnbGF5ZXJfdmVyc2lvbl9fbGF5ZXJfX25hbWUnLCAnaGlkZGVuJzogMCwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJ25hbWUnOidMYXllciBicmFuY2gnLAorICAgICAgICAgICAgICAgICdxaGVscCc6J1RoZSBHaXQgYnJhbmNoIG9mIHRoZSBsYXllciBwcm92aWRpbmcgdGhlIHJlY2lwZScsCisgICAgICAgICAgICAgICAgJ29yZGVyZmllbGQnOiBfZ2V0X3RvZ2dsZV9vcmRlcihyZXF1ZXN0LCAibGF5ZXJfdmVyc2lvbl9fYnJhbmNoIiksCisgICAgICAgICAgICAgICAgJ29yZGVyaWNvbic6X2dldF90b2dnbGVfb3JkZXJfaWNvbihyZXF1ZXN0LCAibGF5ZXJfdmVyc2lvbl9fYnJhbmNoIiksCisgICAgICAgICAgICAgICAgJ29yZGVya2V5JyA6ICdsYXllcl92ZXJzaW9uX19icmFuY2gnLAorICAgICAgICAgICAgICAgICdjbGNsYXNzJzogJ2xheWVyX3ZlcnNpb25fX2JyYW5jaCcsICdoaWRkZW4nOiAxLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAnbmFtZSc6J0xheWVyIGNvbW1pdCcsCisgICAgICAgICAgICAgICAgJ3FoZWxwJzonVGhlIEdpdCBjb21taXQgb2YgdGhlIGxheWVyIHByb3ZpZGluZyB0aGUgcmVjaXBlJywKKyAgICAgICAgICAgICAgICAnY2xjbGFzcyc6ICdsYXllcl92ZXJzaW9uX19sYXllcl9fY29tbWl0JywgJ2hpZGRlbic6IDEsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgXQorICAgICAgICB9CisKKyAgICByZXNwb25zZSA9IHJlbmRlcihyZXF1ZXN0LCB0ZW1wbGF0ZSwgY29udGV4dCkKKyAgICBfc2V0X3BhcmFtZXRlcnNfdmFsdWVzKHBhZ2VzaXplLCBvcmRlcmJ5LCByZXF1ZXN0KQorICAgIHJldHVybiByZXNwb25zZQorCitkZWYgY29uZmlndXJhdGlvbihyZXF1ZXN0LCBidWlsZF9pZCk6CisgICAgdGVtcGxhdGUgPSAnY29uZmlndXJhdGlvbi5odG1sJworCisgICAgdmFyX25hbWVzID0gKCdCQl9WRVJTSU9OJywgJ0JVSUxEX1NZUycsICdOQVRJVkVMU0JTVFJJTkcnLCAnVEFSR0VUX1NZUycsCisgICAgICAgICAgICAgICAgICdNQUNISU5FJywgJ0RJU1RSTycsICdESVNUUk9fVkVSU0lPTicsICdUVU5FX0ZFQVRVUkVTJywgJ1RBUkdFVF9GUFUnKQorICAgIGNvbnRleHQgPSBkaWN0KFZhcmlhYmxlLm9iamVjdHMuZmlsdGVyKGJ1aWxkPWJ1aWxkX2lkLCB2YXJpYWJsZV9uYW1lX19pbj12YXJfbmFtZXMpXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZXNfbGlzdCgndmFyaWFibGVfbmFtZScsICd2YXJpYWJsZV92YWx1ZScpKQorICAgIGNvbnRleHQudXBkYXRlKHsnb2JqZWN0bmFtZSc6ICdjb25maWd1cmF0aW9uJywKKyAgICAgICAgICAgICAgICAgICAgJ29iamVjdF9zZWFyY2hfZGlzcGxheSc6J3ZhcmlhYmxlcycsCisgICAgICAgICAgICAgICAgICAgICdmaWx0ZXJfc2VhcmNoX2Rpc3BsYXknOid2YXJpYWJsZXMnLAorICAgICAgICAgICAgICAgICAgICAnYnVpbGQnOiBCdWlsZC5vYmplY3RzLmdldChwaz1idWlsZF9pZCksCisgICAgICAgICAgICAgICAgICAgICd0YXJnZXRzJzogVGFyZ2V0Lm9iamVjdHMuZmlsdGVyKGJ1aWxkPWJ1aWxkX2lkKX0pCisgICAgcmV0dXJuIHJlbmRlcihyZXF1ZXN0LCB0ZW1wbGF0ZSwgY29udGV4dCkKKworCitkZWYgY29uZmlndmFycyhyZXF1ZXN0LCBidWlsZF9pZCk6CisgICAgdGVtcGxhdGUgPSAnY29uZmlndmFycy5odG1sJworICAgIChwYWdlc2l6ZSwgb3JkZXJieSkgPSBfZ2V0X3BhcmFtZXRlcnNfdmFsdWVzKHJlcXVlc3QsIDEwMCwgJ3ZhcmlhYmxlX25hbWU6KycpCisgICAgbWFuZGF0b3J5X3BhcmFtZXRlcnMgPSB7ICdjb3VudCc6IHBhZ2VzaXplLCAgJ3BhZ2UnIDogMSwgJ29yZGVyYnknIDogb3JkZXJieSwgJ2ZpbHRlcicgOiAnZGVzY3JpcHRpb25fX3JlZ2V4Oi4rJyB9CisgICAgcmV0dmFsID0gX3ZlcmlmeV9wYXJhbWV0ZXJzKCByZXF1ZXN0LkdFVCwgbWFuZGF0b3J5X3BhcmFtZXRlcnMgKQorICAgIChmaWx0ZXJfc3RyaW5nLCBzZWFyY2hfdGVybSwgb3JkZXJpbmdfc3RyaW5nKSA9IF9zZWFyY2hfdHVwbGUocmVxdWVzdCwgVmFyaWFibGUpCisgICAgaWYgcmV0dmFsOgorICAgICAgICAjIGlmIG5ldyBzZWFyY2gsIGNsZWFyIHRoZSBkZWZhdWx0IGZpbHRlcgorICAgICAgICBpZiBzZWFyY2hfdGVybSBhbmQgbGVuKHNlYXJjaF90ZXJtKToKKyAgICAgICAgICAgIG1hbmRhdG9yeV9wYXJhbWV0ZXJzWydmaWx0ZXInXT0nJworICAgICAgICByZXR1cm4gX3JlZGlyZWN0X3BhcmFtZXRlcnMoICdjb25maWd2YXJzJywgcmVxdWVzdC5HRVQsIG1hbmRhdG9yeV9wYXJhbWV0ZXJzLCBidWlsZF9pZCA9IGJ1aWxkX2lkKQorCisgICAgcXVlcnlzZXQgPSBWYXJpYWJsZS5vYmplY3RzLmZpbHRlcihidWlsZD1idWlsZF9pZCkuZXhjbHVkZSh2YXJpYWJsZV9uYW1lX19pc3RhcnRzd2l0aD0nQl8nKS5leGNsdWRlKHZhcmlhYmxlX25hbWVfX2lzdGFydHN3aXRoPSdkb18nKQorICAgIHF1ZXJ5c2V0X3dpdGhfc2VhcmNoID0gIF9nZXRfcXVlcnlzZXQoVmFyaWFibGUsIHF1ZXJ5c2V0LCBOb25lLCBzZWFyY2hfdGVybSwgb3JkZXJpbmdfc3RyaW5nLCAndmFyaWFibGVfbmFtZScpLmV4Y2x1ZGUodmFyaWFibGVfdmFsdWU9Jycsdmhpc3RvcnlfX2ZpbGVfbmFtZV9faXNudWxsPVRydWUpCisgICAgcXVlcnlzZXQgPSBfZ2V0X3F1ZXJ5c2V0KFZhcmlhYmxlLCBxdWVyeXNldCwgZmlsdGVyX3N0cmluZywgc2VhcmNoX3Rlcm0sIG9yZGVyaW5nX3N0cmluZywgJ3ZhcmlhYmxlX25hbWUnKQorICAgICMgcmVtb3ZlIHJlY29yZHMgd2hlcmUgdGhlIHZhbHVlIGlzIGVtcHR5IEFORCB0aGVyZSBhcmUgbm8gaGlzdG9yeSBmaWxlcworICAgIHF1ZXJ5c2V0ID0gcXVlcnlzZXQuZXhjbHVkZSh2YXJpYWJsZV92YWx1ZT0nJyx2aGlzdG9yeV9fZmlsZV9uYW1lX19pc251bGw9VHJ1ZSkKKworICAgIHZhcmlhYmxlcyA9IF9idWlsZF9wYWdlX3JhbmdlKFBhZ2luYXRvcihxdWVyeXNldCwgcGFnZXNpemUpLCByZXF1ZXN0LkdFVC5nZXQoJ3BhZ2UnLCAxKSkKKworICAgICMgc2hvdyBhbGwgbWF0Y2hpbmcgZmlsZXMgKG5vdCBqdXN0IHRoZSBsYXN0IG9uZSkKKyAgICBmaWxlX2ZpbHRlcj0gc2VhcmNoX3Rlcm0gKyAiOiIKKyAgICBpZiBmaWx0ZXJfc3RyaW5nLmZpbmQoJy9jb25mLycpID4gMDoKKyAgICAgICAgZmlsZV9maWx0ZXIgKz0gJ2NvbmYvKGxvY2FsfGJibGF5ZXJzKS5jb25mJworICAgIGlmIGZpbHRlcl9zdHJpbmcuZmluZCgnY29uZi9tYWNoaW5lLycpID4gMDoKKyAgICAgICAgZmlsZV9maWx0ZXIgKz0gJ2NvbmYvbWFjaGluZS8nCisgICAgaWYgZmlsdGVyX3N0cmluZy5maW5kKCdjb25mL2Rpc3Ryby8nKSA+IDA6CisgICAgICAgIGZpbGVfZmlsdGVyICs9ICdjb25mL2Rpc3Ryby8nCisgICAgaWYgZmlsdGVyX3N0cmluZy5maW5kKCcvYml0YmFrZS5jb25mJykgPiAwOgorICAgICAgICBmaWxlX2ZpbHRlciArPSAnL2JpdGJha2UuY29uZicKKyAgICBidWlsZF9kaXI9cmUuc3ViKCIvdG1wL2xvZy8uKiIsIiIsQnVpbGQub2JqZWN0cy5nZXQocGs9YnVpbGRfaWQpLmNvb2tlcl9sb2dfcGF0aCkKKworICAgIGNvbnRleHQgPSB7CisgICAgICAgICAgICAgICAgJ29iamVjdG5hbWUnOiAnY29uZmlndmFycycsCisgICAgICAgICAgICAgICAgJ29iamVjdF9zZWFyY2hfZGlzcGxheSc6J0JpdEJha2UgdmFyaWFibGVzJywKKyAgICAgICAgICAgICAgICAnZmlsdGVyX3NlYXJjaF9kaXNwbGF5JzondmFyaWFibGVzJywKKyAgICAgICAgICAgICAgICAnZmlsZV9maWx0ZXInOiBmaWxlX2ZpbHRlciwKKyAgICAgICAgICAgICAgICAnYnVpbGQnOiBCdWlsZC5vYmplY3RzLmdldChwaz1idWlsZF9pZCksCisgICAgICAgICAgICAgICAgJ29iamVjdHMnIDogdmFyaWFibGVzLAorICAgICAgICAgICAgICAgICd0b3RhbF9jb3VudCc6cXVlcnlzZXRfd2l0aF9zZWFyY2guY291bnQoKSwKKyAgICAgICAgICAgICAgICAnZGVmYXVsdF9vcmRlcmJ5JyA6ICd2YXJpYWJsZV9uYW1lOisnLAorICAgICAgICAgICAgICAgICdzZWFyY2hfdGVybSc6c2VhcmNoX3Rlcm0sCisgICAgICAgICAgICAjIFNwZWNpZmllcyB0aGUgZGlzcGxheSBvZiBjb2x1bW5zIGZvciB0aGUgdGFibGUsIGFwcGVhcmFuY2UgaW4gIkVkaXQgY29sdW1ucyIgYm94LCB0b2dnbGluZyBkZWZhdWx0IHNob3cvaGlkZSwgYW5kIHNwZWNpZnlpbmcgZmlsdGVycyBmb3IgY29sdW1ucworICAgICAgICAgICAgICAgICd0YWJsZWNvbHMnIDogWworICAgICAgICAgICAgICAgIHsnbmFtZSc6ICdWYXJpYWJsZScsCisgICAgICAgICAgICAgICAgICdxaGVscCc6ICJCaXRCYWtlIGlzIGEgZ2VuZXJpYyB0YXNrIGV4ZWN1dG9yIHRoYXQgY29uc2lkZXJzIGEgbGlzdCBvZiB0YXNrcyB3aXRoIGRlcGVuZGVuY2llcyBhbmQgaGFuZGxlcyBtZXRhZGF0YSB0aGF0IGNvbnNpc3RzIG9mIHZhcmlhYmxlcyBpbiBhIGNlcnRhaW4gZm9ybWF0IHRoYXQgZ2V0IHBhc3NlZCB0byB0aGUgdGFza3MiLAorICAgICAgICAgICAgICAgICAnb3JkZXJmaWVsZCc6IF9nZXRfdG9nZ2xlX29yZGVyKHJlcXVlc3QsICJ2YXJpYWJsZV9uYW1lIiksCisgICAgICAgICAgICAgICAgICdvcmRlcmljb24nOl9nZXRfdG9nZ2xlX29yZGVyX2ljb24ocmVxdWVzdCwgInZhcmlhYmxlX25hbWUiKSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsnbmFtZSc6ICdWYWx1ZScsCisgICAgICAgICAgICAgICAgICdxaGVscCc6ICJUaGUgdmFsdWUgYXNzaWduZWQgdG8gdGhlIHZhcmlhYmxlIiwKKyAgICAgICAgICAgICAgICAgJ2RjbGFzcyc6ICJzcGFuNCIsCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7J25hbWUnOiAnU2V0IGluIGZpbGUnLAorICAgICAgICAgICAgICAgICAncWhlbHAnOiAiVGhlIGxhc3QgY29uZmlndXJhdGlvbiBmaWxlIHRoYXQgdG91Y2hlZCB0aGUgdmFyaWFibGUgdmFsdWUiLAorICAgICAgICAgICAgICAgICAnY2xjbGFzcyc6ICdmaWxlJywgJ2hpZGRlbicgOiAwLAorICAgICAgICAgICAgICAgICAnb3JkZXJrZXknIDogJ3ZoaXN0b3J5X19maWxlX25hbWUnLAorICAgICAgICAgICAgICAgICAnZmlsdGVyJyA6IHsKKyAgICAgICAgICAgICAgICAgICAgJ2NsYXNzJyA6ICd2aGlzdG9yeV9fZmlsZV9uYW1lJywKKyAgICAgICAgICAgICAgICAgICAgJ2xhYmVsJzogJ1Nob3c6JywKKyAgICAgICAgICAgICAgICAgICAgJ29wdGlvbnMnIDogWworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnTG9jYWwgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMnLCAndmhpc3RvcnlfX2ZpbGVfbmFtZV9fY29udGFpbnM6JytidWlsZF9kaXIrJy9jb25mLycscXVlcnlzZXRfd2l0aF9zZWFyY2guZmlsdGVyKHZoaXN0b3J5X19maWxlX25hbWVfX2NvbnRhaW5zPWJ1aWxkX2RpcisnL2NvbmYvJykuY291bnQoKSwgJ1NlbGVjdCB0aGlzIGZpbHRlciB0byBzZWUgdmFyaWFibGVzIHNldCBieSB0aGUgPGNvZGU+bG9jYWwuY29uZjwvY29kZT4gYW5kIDxjb2RlPmJibGF5ZXJzLmNvbmY8L2NvZGU+IGNvbmZpZ3VyYXRpb24gZmlsZXMgaW5zaWRlIHRoZSA8Y29kZT4vYnVpbGQvY29uZi88L2NvZGU+IGRpcmVjdG9yeScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnTWFjaGluZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcycsICd2aGlzdG9yeV9fZmlsZV9uYW1lX19jb250YWluczpjb25mL21hY2hpbmUvJyxxdWVyeXNldF93aXRoX3NlYXJjaC5maWx0ZXIodmhpc3RvcnlfX2ZpbGVfbmFtZV9fY29udGFpbnM9J2NvbmYvbWFjaGluZScpLmNvdW50KCksICdTZWxlY3QgdGhpcyBmaWx0ZXIgdG8gc2VlIHZhcmlhYmxlcyBzZXQgYnkgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZShzKSBpbnNpZGUgeW91ciBsYXllcnMgPGNvZGU+L2NvbmYvbWFjaGluZS88L2NvZGU+IGRpcmVjdG9yeScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnRGlzdHJvIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzJywgJ3ZoaXN0b3J5X19maWxlX25hbWVfX2NvbnRhaW5zOmNvbmYvZGlzdHJvLycscXVlcnlzZXRfd2l0aF9zZWFyY2guZmlsdGVyKHZoaXN0b3J5X19maWxlX25hbWVfX2NvbnRhaW5zPSdjb25mL2Rpc3RybycpLmNvdW50KCksICdTZWxlY3QgdGhpcyBmaWx0ZXIgdG8gc2VlIHZhcmlhYmxlcyBzZXQgYnkgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZShzKSBpbnNpZGUgeW91ciBsYXllcnMgPGNvZGU+L2NvbmYvZGlzdHJvLzwvY29kZT4gZGlyZWN0b3J5JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdMYXllciBjb25maWd1cmF0aW9uIHZhcmlhYmxlcycsICd2aGlzdG9yeV9fZmlsZV9uYW1lX19jb250YWluczpjb25mL2xheWVyLmNvbmYnLHF1ZXJ5c2V0X3dpdGhfc2VhcmNoLmZpbHRlcih2aGlzdG9yeV9fZmlsZV9uYW1lX19jb250YWlucz0nY29uZi9sYXllci5jb25mJykuY291bnQoKSwgJ1NlbGVjdCB0aGlzIGZpbHRlciB0byBzZWUgdmFyaWFibGVzIHNldCBieSB0aGUgPGNvZGU+bGF5ZXIuY29uZjwvY29kZT4gY29uZmlndXJhdGlvbiBmaWxlIGluc2lkZSB5b3VyIGxheWVycycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnYml0YmFrZS5jb25mIHZhcmlhYmxlcycsICd2aGlzdG9yeV9fZmlsZV9uYW1lX19jb250YWluczovYml0YmFrZS5jb25mJyxxdWVyeXNldF93aXRoX3NlYXJjaC5maWx0ZXIodmhpc3RvcnlfX2ZpbGVfbmFtZV9fY29udGFpbnM9Jy9iaXRiYWtlLmNvbmYnKS5jb3VudCgpLCAnU2VsZWN0IHRoaXMgZmlsdGVyIHRvIHNlZSB2YXJpYWJsZXMgc2V0IGJ5IHRoZSA8Y29kZT5iaXRiYWtlLmNvbmY8L2NvZGU+IGNvbmZpZ3VyYXRpb24gZmlsZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsnbmFtZSc6ICdEZXNjcmlwdGlvbicsCisgICAgICAgICAgICAgICAgICdxaGVscCc6ICJBIGJyaWVmIGV4cGxhbmF0aW9uIG9mIHRoZSB2YXJpYWJsZSIsCisgICAgICAgICAgICAgICAgICdjbGNsYXNzJzogJ2Rlc2NyaXB0aW9uJywgJ2hpZGRlbicgOiAwLAorICAgICAgICAgICAgICAgICAnZGNsYXNzJzogInNwYW40IiwKKyAgICAgICAgICAgICAgICAgJ2ZpbHRlcicgOiB7CisgICAgICAgICAgICAgICAgICAgICdjbGFzcycgOiAnZGVzY3JpcHRpb24nLAorICAgICAgICAgICAgICAgICAgICAnbGFiZWwnOiAnU2hvdzonLAorICAgICAgICAgICAgICAgICAgICAnb3B0aW9ucycgOiBbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdWYXJpYWJsZXMgd2l0aCBkZXNjcmlwdGlvbicsICdkZXNjcmlwdGlvbl9fcmVnZXg6LisnLCBxdWVyeXNldF93aXRoX3NlYXJjaC5maWx0ZXIoZGVzY3JpcHRpb25fX3JlZ2V4PScuKycpLmNvdW50KCksICdXZSBwcm92aWRlIGRlc2NyaXB0aW9ucyBmb3IgdGhlIG1vc3QgY29tbW9uIEJpdEJha2UgdmFyaWFibGVzLiBUaGUgbGlzdCBvZiBkZXNjcmlwdGlvbnMgbGl2ZXMgaW4gPGNvZGU+bWV0YS9jb25mL2RvY3VtZW50YXRpb24uY29uZjwvY29kZT4nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICB9CisKKyAgICByZXNwb25zZSA9IHJlbmRlcihyZXF1ZXN0LCB0ZW1wbGF0ZSwgY29udGV4dCkKKyAgICBfc2V0X3BhcmFtZXRlcnNfdmFsdWVzKHBhZ2VzaXplLCBvcmRlcmJ5LCByZXF1ZXN0KQorICAgIHJldHVybiByZXNwb25zZQorCitkZWYgYnBhY2thZ2UocmVxdWVzdCwgYnVpbGRfaWQpOgorICAgIHRlbXBsYXRlID0gJ2JwYWNrYWdlLmh0bWwnCisgICAgKHBhZ2VzaXplLCBvcmRlcmJ5KSA9IF9nZXRfcGFyYW1ldGVyc192YWx1ZXMocmVxdWVzdCwgMTAwLCAnbmFtZTorJykKKyAgICBtYW5kYXRvcnlfcGFyYW1ldGVycyA9IHsgJ2NvdW50JyA6IHBhZ2VzaXplLCAgJ3BhZ2UnIDogMSwgJ29yZGVyYnknIDogb3JkZXJieSB9CisgICAgcmV0dmFsID0gX3ZlcmlmeV9wYXJhbWV0ZXJzKCByZXF1ZXN0LkdFVCwgbWFuZGF0b3J5X3BhcmFtZXRlcnMgKQorICAgIGlmIHJldHZhbDoKKyAgICAgICAgcmV0dXJuIF9yZWRpcmVjdF9wYXJhbWV0ZXJzKCAncGFja2FnZXMnLCByZXF1ZXN0LkdFVCwgbWFuZGF0b3J5X3BhcmFtZXRlcnMsIGJ1aWxkX2lkID0gYnVpbGRfaWQpCisgICAgKGZpbHRlcl9zdHJpbmcsIHNlYXJjaF90ZXJtLCBvcmRlcmluZ19zdHJpbmcpID0gX3NlYXJjaF90dXBsZShyZXF1ZXN0LCBQYWNrYWdlKQorICAgIHF1ZXJ5c2V0ID0gUGFja2FnZS5vYmplY3RzLmZpbHRlcihidWlsZCA9IGJ1aWxkX2lkKS5maWx0ZXIoc2l6ZV9fZ3RlPTApCisgICAgcXVlcnlzZXQgPSBfZ2V0X3F1ZXJ5c2V0KFBhY2thZ2UsIHF1ZXJ5c2V0LCBmaWx0ZXJfc3RyaW5nLCBzZWFyY2hfdGVybSwgb3JkZXJpbmdfc3RyaW5nLCAnbmFtZScpCisKKyAgICBwYWNrYWdlcyA9IF9idWlsZF9wYWdlX3JhbmdlKFBhZ2luYXRvcihxdWVyeXNldCwgcGFnZXNpemUpLHJlcXVlc3QuR0VULmdldCgncGFnZScsIDEpKQorCisgICAgYnVpbGQgPSBCdWlsZC5vYmplY3RzLmdldCggcGsgPSBidWlsZF9pZCApCisKKyAgICBjb250ZXh0ID0geworICAgICAgICAnb2JqZWN0bmFtZSc6ICdwYWNrYWdlcyBidWlsdCcsCisgICAgICAgICdidWlsZCc6IGJ1aWxkLAorICAgICAgICAnb2JqZWN0cycgOiBwYWNrYWdlcywKKyAgICAgICAgJ2RlZmF1bHRfb3JkZXJieScgOiAnbmFtZTorJywKKyAgICAgICAgJ3RhYmxlY29scyc6WworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICduYW1lJzonUGFja2FnZScsCisgICAgICAgICAgICAgICAgJ3FoZWxwJzonUGFja2FnZWQgb3V0cHV0IHJlc3VsdGluZyBmcm9tIGJ1aWxkaW5nIGEgcmVjaXBlJywKKyAgICAgICAgICAgICAgICAnb3JkZXJmaWVsZCc6IF9nZXRfdG9nZ2xlX29yZGVyKHJlcXVlc3QsICJuYW1lIiksCisgICAgICAgICAgICAgICAgJ29yZGVyaWNvbic6X2dldF90b2dnbGVfb3JkZXJfaWNvbihyZXF1ZXN0LCAibmFtZSIpLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAnbmFtZSc6J1BhY2thZ2UgdmVyc2lvbicsCisgICAgICAgICAgICAgICAgJ3FoZWxwJzonVGhlIHBhY2thZ2UgdmVyc2lvbiBhbmQgcmV2aXNpb24nLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAnbmFtZSc6J1NpemUnLAorICAgICAgICAgICAgICAgICdxaGVscCc6J1RoZSBzaXplIG9mIHRoZSBwYWNrYWdlJywKKyAgICAgICAgICAgICAgICAnb3JkZXJmaWVsZCc6IF9nZXRfdG9nZ2xlX29yZGVyKHJlcXVlc3QsICJzaXplIiwgVHJ1ZSksCisgICAgICAgICAgICAgICAgJ29yZGVyaWNvbic6X2dldF90b2dnbGVfb3JkZXJfaWNvbihyZXF1ZXN0LCAic2l6ZSIpLAorICAgICAgICAgICAgICAgICdvcmRlcmtleScgOiAnc2l6ZScsCisgICAgICAgICAgICAgICAgJ2NsY2xhc3MnOiAnc2l6ZScsICdoaWRkZW4nOiAwLAorICAgICAgICAgICAgICAgICdkY2xhc3MnIDogJ3NwYW4yJywKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJ25hbWUnOidMaWNlbnNlJywKKyAgICAgICAgICAgICAgICAncWhlbHAnOidUaGUgbGljZW5zZSB1bmRlciB3aGljaCB0aGUgcGFja2FnZSBpcyBkaXN0cmlidXRlZC4gTXVsdGlwbGUgbGljZW5zZSBuYW1lcyBzZXBhcmF0ZWQgYnkgdGhlIHBpcGUgY2hhcmFjdGVyIGluZGljYXRlcyBhIGNob2ljZSBiZXR3ZWVuIGxpY2Vuc2VzLiBNdWx0aXBsZSBsaWNlbnNlIG5hbWVzIHNlcGFyYXRlZCBieSB0aGUgYW1wZXJzYW5kIGNoYXJhY3RlciBpbmRpY2F0ZXMgbXVsdGlwbGUgbGljZW5zZXMgZXhpc3QgdGhhdCBjb3ZlciBkaWZmZXJlbnQgcGFydHMgb2YgdGhlIHNvdXJjZScsCisgICAgICAgICAgICAgICAgJ29yZGVyZmllbGQnOiBfZ2V0X3RvZ2dsZV9vcmRlcihyZXF1ZXN0LCAibGljZW5zZSIpLAorICAgICAgICAgICAgICAgICdvcmRlcmljb24nOl9nZXRfdG9nZ2xlX29yZGVyX2ljb24ocmVxdWVzdCwgImxpY2Vuc2UiKSwKKyAgICAgICAgICAgICAgICAnb3JkZXJrZXknIDogJ2xpY2Vuc2UnLAorICAgICAgICAgICAgICAgICdjbGNsYXNzJzogJ2xpY2Vuc2UnLCAnaGlkZGVuJzogMSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJ25hbWUnOidSZWNpcGUnLAorICAgICAgICAgICAgICAgICdxaGVscCc6J1RoZSBuYW1lIG9mIHRoZSByZWNpcGUgYnVpbGRpbmcgdGhlIHBhY2thZ2UnLAorICAgICAgICAgICAgICAgICdvcmRlcmZpZWxkJzogX2dldF90b2dnbGVfb3JkZXIocmVxdWVzdCwgInJlY2lwZV9fbmFtZSIpLAorICAgICAgICAgICAgICAgICdvcmRlcmljb24nOl9nZXRfdG9nZ2xlX29yZGVyX2ljb24ocmVxdWVzdCwgInJlY2lwZV9fbmFtZSIpLAorICAgICAgICAgICAgICAgICdvcmRlcmtleScgOiAncmVjaXBlX19uYW1lJywKKyAgICAgICAgICAgICAgICAnY2xjbGFzcyc6ICdyZWNpcGVfX25hbWUnLCAnaGlkZGVuJzogMCwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJ25hbWUnOidSZWNpcGUgdmVyc2lvbicsCisgICAgICAgICAgICAgICAgJ3FoZWxwJzonVmVyc2lvbiBhbmQgcmV2aXNpb24gb2YgdGhlIHJlY2lwZSBidWlsZGluZyB0aGUgcGFja2FnZScsCisgICAgICAgICAgICAgICAgJ2NsY2xhc3MnOiAncmVjaXBlX192ZXJzaW9uJywgJ2hpZGRlbic6IDEsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICduYW1lJzonTGF5ZXInLAorICAgICAgICAgICAgICAgICdxaGVscCc6J1RoZSBuYW1lIG9mIHRoZSBsYXllciBwcm92aWRpbmcgdGhlIHJlY2lwZSB0aGF0IGJ1aWxkcyB0aGUgcGFja2FnZScsCisgICAgICAgICAgICAgICAgJ29yZGVyZmllbGQnOiBfZ2V0X3RvZ2dsZV9vcmRlcihyZXF1ZXN0LCAicmVjaXBlX19sYXllcl92ZXJzaW9uX19sYXllcl9fbmFtZSIpLAorICAgICAgICAgICAgICAgICdvcmRlcmljb24nOl9nZXRfdG9nZ2xlX29yZGVyX2ljb24ocmVxdWVzdCwgInJlY2lwZV9fbGF5ZXJfdmVyc2lvbl9fbGF5ZXJfX25hbWUiKSwKKyAgICAgICAgICAgICAgICAnb3JkZXJrZXknIDogJ3JlY2lwZV9fbGF5ZXJfdmVyc2lvbl9fbGF5ZXJfX25hbWUnLAorICAgICAgICAgICAgICAgICdjbGNsYXNzJzogJ3JlY2lwZV9fbGF5ZXJfdmVyc2lvbl9fbGF5ZXJfX25hbWUnLCAnaGlkZGVuJzogMSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJ25hbWUnOidMYXllciBicmFuY2gnLAorICAgICAgICAgICAgICAgICdxaGVscCc6J1RoZSBHaXQgYnJhbmNoIG9mIHRoZSBsYXllciBwcm92aWRpbmcgdGhlIHJlY2lwZSB0aGF0IGJ1aWxkcyB0aGUgcGFja2FnZScsCisgICAgICAgICAgICAgICAgJ29yZGVyZmllbGQnOiBfZ2V0X3RvZ2dsZV9vcmRlcihyZXF1ZXN0LCAicmVjaXBlX19sYXllcl92ZXJzaW9uX19icmFuY2giKSwKKyAgICAgICAgICAgICAgICAnb3JkZXJpY29uJzpfZ2V0X3RvZ2dsZV9vcmRlcl9pY29uKHJlcXVlc3QsICJyZWNpcGVfX2xheWVyX3ZlcnNpb25fX2JyYW5jaCIpLAorICAgICAgICAgICAgICAgICdvcmRlcmtleScgOiAncmVjaXBlX19sYXllcl92ZXJzaW9uX19icmFuY2gnLAorICAgICAgICAgICAgICAgICdjbGNsYXNzJzogJ3JlY2lwZV9fbGF5ZXJfdmVyc2lvbl9fYnJhbmNoJywgJ2hpZGRlbic6IDEsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICduYW1lJzonTGF5ZXIgY29tbWl0JywKKyAgICAgICAgICAgICAgICAncWhlbHAnOidUaGUgR2l0IGNvbW1pdCBvZiB0aGUgbGF5ZXIgcHJvdmlkaW5nIHRoZSByZWNpcGUgdGhhdCBidWlsZHMgdGhlIHBhY2thZ2UnLAorICAgICAgICAgICAgICAgICdjbGNsYXNzJzogJ3JlY2lwZV9fbGF5ZXJfdmVyc2lvbl9fbGF5ZXJfX2NvbW1pdCcsICdoaWRkZW4nOiAxLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIF0KKyAgICAgICAgfQorCisgICAgcmVzcG9uc2UgPSByZW5kZXIocmVxdWVzdCwgdGVtcGxhdGUsIGNvbnRleHQpCisgICAgX3NldF9wYXJhbWV0ZXJzX3ZhbHVlcyhwYWdlc2l6ZSwgb3JkZXJieSwgcmVxdWVzdCkKKyAgICByZXR1cm4gcmVzcG9uc2UKKworZGVmIGJmaWxlKHJlcXVlc3QsIGJ1aWxkX2lkLCBwYWNrYWdlX2lkKToKKyAgICB0ZW1wbGF0ZSA9ICdiZmlsZS5odG1sJworICAgIGZpbGVzID0gUGFja2FnZV9GaWxlLm9iamVjdHMuZmlsdGVyKHBhY2thZ2UgPSBwYWNrYWdlX2lkKQorICAgIGNvbnRleHQgPSB7J2J1aWxkJzogQnVpbGQub2JqZWN0cy5nZXQocGs9YnVpbGRfaWQpLCAnb2JqZWN0cycgOiBmaWxlc30KKyAgICByZXR1cm4gcmVuZGVyKHJlcXVlc3QsIHRlbXBsYXRlLCBjb250ZXh0KQorCisKKyMgQSBzZXQgb2YgZGVwZW5kZW5jeSB0eXBlcyB2YWxpZCBmb3IgYm90aCBpbmNsdWRlZCBhbmQgYnVpbHQgcGFja2FnZSB2aWV3cworT1RIRVJfREVQRU5EU19CQVNFID0gWworICAgIFBhY2thZ2VfRGVwZW5kZW5jeS5UWVBFX1JTVUdHRVNUUywKKyAgICBQYWNrYWdlX0RlcGVuZGVuY3kuVFlQRV9SUFJPVklERVMsCisgICAgUGFja2FnZV9EZXBlbmRlbmN5LlRZUEVfUlJFUExBQ0VTLAorICAgIFBhY2thZ2VfRGVwZW5kZW5jeS5UWVBFX1JDT05GTElDVFMsCisgICAgXQorCisjIHZhbHVlIGZvciBpbnZhbGlkIHJvdyBpZAorSU5WQUxJRF9LRVkgPSAtMQorCisiIiIKK0dpdmVuIGEgcGFja2FnZSBpZCwgdGFyZ2V0X2lkIHJldHJpZXZlcyB0d28gc2V0cyBvZiB0aGlzIGltYWdlIGFuZCBwYWNrYWdlJ3MKK2RlcGVuZGVuY2llcy4gIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBkaWN0aW9uYXJ5IGNvbnNpc3Rpbmcgb2YgdHdvIG90aGVyCitsaXN0czogYSBsaXN0IG9mICdydW50aW1lJyBkZXBlbmRlbmNpZXMsIHRoYXQgaXMsIGhhdmluZyBSREVQRU5EUwordmFsdWVzIGluIHNvdXJjZSBwYWNrYWdlJ3MgcmVjaXBlLCBhbmQgYSBsaXN0IG9mIG90aGVyIGRlcGVuZGVuY2llcywgdGhhdCBpcwordGhlIGxpc3Qgb2YgcG9zc2libGUgcmVjaXBlIHZhcmlhYmxlcyBhcyBmb3VuZCBpbiBPVEhFUl9ERVBFTkRTX0JBU0UgcGx1cwordGhlIFJSRUNPTU1FTkRTIG9yIFRSRUNPTU1FTkRTIHZhbHVlLgorVGhlIGxpc3RzIGFyZSBidWlsdCBpbiB0aGUgc29ydCBvcmRlciBzcGVjaWZpZWQgZm9yIHRoZSBwYWNrYWdlIHJ1bnRpbWUKK2RlcGVuZGVuY3kgdmlld3MuCisiIiIKK2RlZiBfZ2V0X3BhY2thZ2VfZGVwZW5kZW5jaWVzKHBhY2thZ2VfaWQsIHRhcmdldF9pZCA9IElOVkFMSURfS0VZKToKKyAgICBydW50aW1lX2RlcHMgPSBbXQorICAgIG90aGVyX2RlcHMgPSBbXQorICAgIG90aGVyX2RlcGVuZHNfdHlwZXMgPSBPVEhFUl9ERVBFTkRTX0JBU0UKKworICAgIGlmIHRhcmdldF9pZCAhPSBJTlZBTElEX0tFWSA6CisgICAgICAgIHJkZXBlbmRzX3R5cGUgPSBQYWNrYWdlX0RlcGVuZGVuY3kuVFlQRV9UUkRFUEVORFMKKyAgICAgICAgb3RoZXJfZGVwZW5kc190eXBlcyArPSAgW1BhY2thZ2VfRGVwZW5kZW5jeS5UWVBFX1RSRUNPTU1FTkRTXQorICAgIGVsc2UgOgorICAgICAgICByZGVwZW5kc190eXBlID0gUGFja2FnZV9EZXBlbmRlbmN5LlRZUEVfUkRFUEVORFMKKyAgICAgICAgb3RoZXJfZGVwZW5kc190eXBlcyArPSBbUGFja2FnZV9EZXBlbmRlbmN5LlRZUEVfUlJFQ09NTUVORFNdCisKKyAgICBwYWNrYWdlID0gUGFja2FnZS5vYmplY3RzLmdldChwaz1wYWNrYWdlX2lkKQorICAgIGlmIHRhcmdldF9pZCAhPSBJTlZBTElEX0tFWSA6CisgICAgICAgIGFsbGRlcHMgPSBwYWNrYWdlLnBhY2thZ2VfZGVwZW5kZW5jaWVzX3NvdXJjZS5maWx0ZXIodGFyZ2V0X2lkX19leGFjdCA9IHRhcmdldF9pZCkKKyAgICBlbHNlIDoKKyAgICAgICAgYWxsZGVwcyA9IHBhY2thZ2UucGFja2FnZV9kZXBlbmRlbmNpZXNfc291cmNlLmFsbCgpCisgICAgZm9yIGlkZXAgaW4gYWxsZGVwczoKKyAgICAgICAgZGVwX3BhY2thZ2UgPSBQYWNrYWdlLm9iamVjdHMuZ2V0KHBrPWlkZXAuZGVwZW5kc19vbl9pZCkKKyAgICAgICAgZGVwX2VudHJ5ID0gUGFja2FnZV9EZXBlbmRlbmN5LkRFUEVORFNfRElDVFtpZGVwLmRlcF90eXBlXQorICAgICAgICBpZiBkZXBfcGFja2FnZS52ZXJzaW9uID09ICcnIDoKKyAgICAgICAgICAgIHZlcnNpb24gPSAnJworICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgIHZlcnNpb24gPSBkZXBfcGFja2FnZS52ZXJzaW9uICsgIi0iICsgZGVwX3BhY2thZ2UucmV2aXNpb24KKyAgICAgICAgaW5zdGFsbGVkID0gRmFsc2UKKyAgICAgICAgaWYgdGFyZ2V0X2lkICE9IElOVkFMSURfS0VZIDoKKyAgICAgICAgICAgIGlmIFRhcmdldF9JbnN0YWxsZWRfUGFja2FnZS5vYmplY3RzLmZpbHRlcih0YXJnZXRfaWRfX2V4YWN0ID0gdGFyZ2V0X2lkLCBwYWNrYWdlX2lkX19leGFjdCA9IGRlcF9wYWNrYWdlLmlkKS5jb3VudCgpID4gMDoKKyAgICAgICAgICAgICAgICBpbnN0YWxsZWQgPSBUcnVlCisgICAgICAgIGRlcCA9ICAgeworICAgICAgICAgICAgICAgICduYW1lJyA6IGRlcF9wYWNrYWdlLm5hbWUsCisgICAgICAgICAgICAgICAgJ3ZlcnNpb24nIDogdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAnc2l6ZScgOiBkZXBfcGFja2FnZS5zaXplLAorICAgICAgICAgICAgICAgICdkZXBfdHlwZScgOiBpZGVwLmRlcF90eXBlLAorICAgICAgICAgICAgICAgICdkZXBfdHlwZV9kaXNwbGF5JyA6IGRlcF9lbnRyeVswXS5jYXBpdGFsaXplKCksCisgICAgICAgICAgICAgICAgJ2RlcF90eXBlX2hlbHAnIDogZGVwX2VudHJ5WzFdICUgKGRlcF9wYWNrYWdlLm5hbWUsIHBhY2thZ2UubmFtZSksCisgICAgICAgICAgICAgICAgJ2RlcGVuZHNfb25faWQnIDogZGVwX3BhY2thZ2UuaWQsCisgICAgICAgICAgICAgICAgJ2luc3RhbGxlZCcgOiBpbnN0YWxsZWQsCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgIGlmIHRhcmdldF9pZCAhPSBJTlZBTElEX0tFWToKKyAgICAgICAgICAgICAgICBkZXBbJ2FsaWFzJ10gPSBfZ2V0X3BhY2thZ2VfYWxpYXMoZGVwX3BhY2thZ2UpCisKKyAgICAgICAgaWYgaWRlcC5kZXBfdHlwZSA9PSByZGVwZW5kc190eXBlIDoKKyAgICAgICAgICAgIHJ1bnRpbWVfZGVwcy5hcHBlbmQoZGVwKQorICAgICAgICBlbGlmIGlkZXAuZGVwX3R5cGUgaW4gb3RoZXJfZGVwZW5kc190eXBlcyA6CisgICAgICAgICAgICBvdGhlcl9kZXBzLmFwcGVuZChkZXApCisKKyAgICByZGVwX3NvcnRlZCA9IHNvcnRlZChydW50aW1lX2RlcHMsIGtleT1sYW1iZGEgazoga1snbmFtZSddKQorICAgIG9kZXBfc29ydGVkID0gc29ydGVkKAorICAgICAgICAgICAgc29ydGVkKG90aGVyX2RlcHMsIGtleT1sYW1iZGEgazoga1snbmFtZSddKSwKKyAgICAgICAgICAgIGtleT1sYW1iZGEgazoga1snZGVwX3R5cGUnXSkKKyAgICByZXR2YWx1ZXMgPSB7J3J1bnRpbWVfZGVwcycgOiByZGVwX3NvcnRlZCwgJ290aGVyX2RlcHMnIDogb2RlcF9zb3J0ZWR9CisgICAgcmV0dXJuIHJldHZhbHVlcworCisjIFJldHVybiB0aGUgY291bnQgb2YgcGFja2FnZXMgZGVwZW5kZW50IG9uIHBhY2thZ2UgZm9yIHRoaXMgdGFyZ2V0X2lkIGltYWdlCitkZWYgX2dldF9wYWNrYWdlX3JldmVyc2VfZGVwX2NvdW50KHBhY2thZ2UsIHRhcmdldF9pZCk6CisgICAgcmV0dXJuIHBhY2thZ2UucGFja2FnZV9kZXBlbmRlbmNpZXNfdGFyZ2V0LmZpbHRlcih0YXJnZXRfaWRfX2V4YWN0PXRhcmdldF9pZCwgZGVwX3R5cGVfX2V4YWN0ID0gUGFja2FnZV9EZXBlbmRlbmN5LlRZUEVfVFJERVBFTkRTKS5jb3VudCgpCisKKyMgUmV0dXJuIHRoZSBjb3VudCBvZiB0aGUgcGFja2FnZXMgdGhhdCB0aGlzIHBhY2thZ2VfaWQgaXMgZGVwZW5kZW50IG9uLgorIyBVc2Ugb25lIG9mIHRoZSB0d28gUkRFUEVORFMgdHlwZXMsIGVpdGhlciBUUkRFUEVORFMgaWYgdGhlIHBhY2thZ2Ugd2FzCisjIGluc3RhbGxlZCwgb3IgZWxzZSBSREVQRU5EUyBpZiBvbmx5IGJ1aWx0LgorZGVmIF9nZXRfcGFja2FnZV9kZXBlbmRlbmN5X2NvdW50KHBhY2thZ2UsIHRhcmdldF9pZCwgaXNfaW5zdGFsbGVkKToKKyAgICBpZiBpc19pbnN0YWxsZWQgOgorICAgICAgICByZXR1cm4gcGFja2FnZS5wYWNrYWdlX2RlcGVuZGVuY2llc19zb3VyY2UuZmlsdGVyKHRhcmdldF9pZF9fZXhhY3QgPSB0YXJnZXRfaWQsCisgICAgICAgICAgICBkZXBfdHlwZV9fZXhhY3QgPSBQYWNrYWdlX0RlcGVuZGVuY3kuVFlQRV9UUkRFUEVORFMpLmNvdW50KCkKKyAgICBlbHNlIDoKKyAgICAgICAgcmV0dXJuIHBhY2thZ2UucGFja2FnZV9kZXBlbmRlbmNpZXNfc291cmNlLmZpbHRlcihkZXBfdHlwZV9fZXhhY3QgPSBQYWNrYWdlX0RlcGVuZGVuY3kuVFlQRV9SREVQRU5EUykuY291bnQoKQorCitkZWYgX2dldF9wYWNrYWdlX2FsaWFzKHBhY2thZ2UpOgorICAgIGFsaWFzID0gcGFja2FnZS5pbnN0YWxsZWRfbmFtZQorICAgIGlmIGFsaWFzICE9IE5vbmUgYW5kIGFsaWFzICE9ICcnIGFuZCBhbGlhcyAhPSBwYWNrYWdlLm5hbWU6CisgICAgICAgIHJldHVybiBhbGlhcworICAgIGVsc2U6CisgICAgICAgIHJldHVybiAnJworCitkZWYgX2dldF9mdWxscGFja2FnZXNwZWMocGFja2FnZSk6CisgICAgciA9IHBhY2thZ2UubmFtZQorICAgIHZlcnNpb25fZ29vZCA9IHBhY2thZ2UudmVyc2lvbiAhPSBOb25lIGFuZCAgcGFja2FnZS52ZXJzaW9uICE9ICcnCisgICAgcmV2aXNpb25fZ29vZCA9IHBhY2thZ2UucmV2aXNpb24gIT0gTm9uZSBhbmQgcGFja2FnZS5yZXZpc2lvbiAhPSAnJworICAgIGlmIHZlcnNpb25fZ29vZCBvciByZXZpc2lvbl9nb29kOgorICAgICAgICByICs9ICdfJworICAgICAgICBpZiB2ZXJzaW9uX2dvb2Q6CisgICAgICAgICAgICByICs9IHBhY2thZ2UudmVyc2lvbgorICAgICAgICAgICAgaWYgcmV2aXNpb25fZ29vZDoKKyAgICAgICAgICAgICAgICByICs9ICctJworICAgICAgICBpZiByZXZpc2lvbl9nb29kOgorICAgICAgICAgICAgciArPSBwYWNrYWdlLnJldmlzaW9uCisgICAgcmV0dXJuIHIKKworZGVmIHBhY2thZ2VfYnVpbHRfZGV0YWlsKHJlcXVlc3QsIGJ1aWxkX2lkLCBwYWNrYWdlX2lkKToKKyAgICB0ZW1wbGF0ZSA9ICJwYWNrYWdlX2J1aWx0X2RldGFpbC5odG1sIgorICAgIGlmIEJ1aWxkLm9iamVjdHMuZmlsdGVyKHBrPWJ1aWxkX2lkKS5jb3VudCgpID09IDAgOgorICAgICAgICByZXR1cm4gcmVkaXJlY3QoYnVpbGRzKQorCisgICAgIyBmb2xsb3cgY29udmVudGlvbiBmb3IgcGFnaW5hdGlvbiB3LyBzZWFyY2ggYWx0aG91Z2ggbm90IHVzZWQgZm9yIHRoaXMgdmlldworICAgIHF1ZXJ5c2V0ID0gUGFja2FnZV9GaWxlLm9iamVjdHMuZmlsdGVyKHBhY2thZ2VfaWRfX2V4YWN0PXBhY2thZ2VfaWQpCisgICAgKHBhZ2VzaXplLCBvcmRlcmJ5KSA9IF9nZXRfcGFyYW1ldGVyc192YWx1ZXMocmVxdWVzdCwgMjUsICdwYXRoOisnKQorICAgIG1hbmRhdG9yeV9wYXJhbWV0ZXJzID0geyAnY291bnQnOiBwYWdlc2l6ZSwgICdwYWdlJyA6IDEsICdvcmRlcmJ5JyA6IG9yZGVyYnkgfQorICAgIHJldHZhbCA9IF92ZXJpZnlfcGFyYW1ldGVycyggcmVxdWVzdC5HRVQsIG1hbmRhdG9yeV9wYXJhbWV0ZXJzICkKKyAgICBpZiByZXR2YWw6CisgICAgICAgIHJldHVybiBfcmVkaXJlY3RfcGFyYW1ldGVycyggJ3BhY2thZ2VfYnVpbHRfZGV0YWlsJywgcmVxdWVzdC5HRVQsIG1hbmRhdG9yeV9wYXJhbWV0ZXJzLCBidWlsZF9pZCA9IGJ1aWxkX2lkLCBwYWNrYWdlX2lkID0gcGFja2FnZV9pZCkKKworICAgIChmaWx0ZXJfc3RyaW5nLCBzZWFyY2hfdGVybSwgb3JkZXJpbmdfc3RyaW5nKSA9IF9zZWFyY2hfdHVwbGUocmVxdWVzdCwgUGFja2FnZV9GaWxlKQorICAgIHBhdGhzID0gX2dldF9xdWVyeXNldChQYWNrYWdlX0ZpbGUsIHF1ZXJ5c2V0LCBmaWx0ZXJfc3RyaW5nLCBzZWFyY2hfdGVybSwgb3JkZXJpbmdfc3RyaW5nLCAncGF0aCcpCisKKyAgICBwYWNrYWdlID0gUGFja2FnZS5vYmplY3RzLmdldChwaz1wYWNrYWdlX2lkKQorICAgIHBhY2thZ2UuZnVsbHBhY2thZ2VzcGVjID0gX2dldF9mdWxscGFja2FnZXNwZWMocGFja2FnZSkKKyAgICBjb250ZXh0ID0geworICAgICAgICAgICAgJ2J1aWxkJyA6IEJ1aWxkLm9iamVjdHMuZ2V0KHBrPWJ1aWxkX2lkKSwKKyAgICAgICAgICAgICdwYWNrYWdlJyA6IHBhY2thZ2UsCisgICAgICAgICAgICAnZGVwZW5kZW5jeV9jb3VudCcgOiBfZ2V0X3BhY2thZ2VfZGVwZW5kZW5jeV9jb3VudChwYWNrYWdlLCAtMSwgRmFsc2UpLAorICAgICAgICAgICAgJ29iamVjdHMnIDogcGF0aHMsCisgICAgICAgICAgICAndGFibGVjb2xzJzpbCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAnbmFtZSc6J0ZpbGUnLAorICAgICAgICAgICAgICAgICAgICAnb3JkZXJmaWVsZCc6IF9nZXRfdG9nZ2xlX29yZGVyKHJlcXVlc3QsICJwYXRoIiksCisgICAgICAgICAgICAgICAgICAgICdvcmRlcmljb24nOl9nZXRfdG9nZ2xlX29yZGVyX2ljb24ocmVxdWVzdCwgInBhdGgiKSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgJ25hbWUnOidTaXplJywKKyAgICAgICAgICAgICAgICAgICAgJ29yZGVyZmllbGQnOiBfZ2V0X3RvZ2dsZV9vcmRlcihyZXF1ZXN0LCAic2l6ZSIsIFRydWUpLAorICAgICAgICAgICAgICAgICAgICAnb3JkZXJpY29uJzpfZ2V0X3RvZ2dsZV9vcmRlcl9pY29uKHJlcXVlc3QsICJzaXplIiksCisgICAgICAgICAgICAgICAgICAgICdkY2xhc3MnOiAnc2l6ZWNvbCBzcGFuMicsCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIF0KKyAgICB9CisgICAgaWYgcGF0aHMuYWxsKCkuY291bnQoKSA8IDI6CisgICAgICAgIGNvbnRleHRbJ2Rpc2FibGVfc29ydCddID0gVHJ1ZTsKKworICAgIHJlc3BvbnNlID0gcmVuZGVyKHJlcXVlc3QsIHRlbXBsYXRlLCBjb250ZXh0KQorICAgIF9zZXRfcGFyYW1ldGVyc192YWx1ZXMocGFnZXNpemUsIG9yZGVyYnksIHJlcXVlc3QpCisgICAgcmV0dXJuIHJlc3BvbnNlCisKK2RlZiBwYWNrYWdlX2J1aWx0X2RlcGVuZGVuY2llcyhyZXF1ZXN0LCBidWlsZF9pZCwgcGFja2FnZV9pZCk6CisgICAgdGVtcGxhdGUgPSAicGFja2FnZV9idWlsdF9kZXBlbmRlbmNpZXMuaHRtbCIKKyAgICBpZiBCdWlsZC5vYmplY3RzLmZpbHRlcihwaz1idWlsZF9pZCkuY291bnQoKSA9PSAwIDoKKyAgICAgICAgIHJldHVybiByZWRpcmVjdChidWlsZHMpCisKKyAgICBwYWNrYWdlID0gUGFja2FnZS5vYmplY3RzLmdldChwaz1wYWNrYWdlX2lkKQorICAgIHBhY2thZ2UuZnVsbHBhY2thZ2VzcGVjID0gX2dldF9mdWxscGFja2FnZXNwZWMocGFja2FnZSkKKyAgICBkZXBlbmRlbmNpZXMgPSBfZ2V0X3BhY2thZ2VfZGVwZW5kZW5jaWVzKHBhY2thZ2VfaWQpCisgICAgY29udGV4dCA9IHsKKyAgICAgICAgICAgICdidWlsZCcgOiBCdWlsZC5vYmplY3RzLmdldChwaz1idWlsZF9pZCksCisgICAgICAgICAgICAncGFja2FnZScgOiBwYWNrYWdlLAorICAgICAgICAgICAgJ3J1bnRpbWVfZGVwcycgOiBkZXBlbmRlbmNpZXNbJ3J1bnRpbWVfZGVwcyddLAorICAgICAgICAgICAgJ290aGVyX2RlcHMnIDogICBkZXBlbmRlbmNpZXNbJ290aGVyX2RlcHMnXSwKKyAgICAgICAgICAgICdkZXBlbmRlbmN5X2NvdW50JyA6IF9nZXRfcGFja2FnZV9kZXBlbmRlbmN5X2NvdW50KHBhY2thZ2UsIC0xLCAgRmFsc2UpCisgICAgfQorICAgIHJldHVybiByZW5kZXIocmVxdWVzdCwgdGVtcGxhdGUsIGNvbnRleHQpCisKKworZGVmIHBhY2thZ2VfaW5jbHVkZWRfZGV0YWlsKHJlcXVlc3QsIGJ1aWxkX2lkLCB0YXJnZXRfaWQsIHBhY2thZ2VfaWQpOgorICAgIHRlbXBsYXRlID0gInBhY2thZ2VfaW5jbHVkZWRfZGV0YWlsLmh0bWwiCisgICAgaWYgQnVpbGQub2JqZWN0cy5maWx0ZXIocGs9YnVpbGRfaWQpLmNvdW50KCkgPT0gMCA6CisgICAgICAgIHJldHVybiByZWRpcmVjdChidWlsZHMpCisKKyAgICAjIGZvbGxvdyBjb252ZW50aW9uIGZvciBwYWdpbmF0aW9uIHcvIHNlYXJjaCBhbHRob3VnaCBub3QgdXNlZCBmb3IgdGhpcyB2aWV3CisgICAgKHBhZ2VzaXplLCBvcmRlcmJ5KSA9IF9nZXRfcGFyYW1ldGVyc192YWx1ZXMocmVxdWVzdCwgMjUsICdwYXRoOisnKQorICAgIG1hbmRhdG9yeV9wYXJhbWV0ZXJzID0geyAnY291bnQnOiBwYWdlc2l6ZSwgICdwYWdlJyA6IDEsICdvcmRlcmJ5JyA6IG9yZGVyYnkgfQorICAgIHJldHZhbCA9IF92ZXJpZnlfcGFyYW1ldGVycyggcmVxdWVzdC5HRVQsIG1hbmRhdG9yeV9wYXJhbWV0ZXJzICkKKyAgICBpZiByZXR2YWw6CisgICAgICAgIHJldHVybiBfcmVkaXJlY3RfcGFyYW1ldGVycyggJ3BhY2thZ2VfaW5jbHVkZWRfZGV0YWlsJywgcmVxdWVzdC5HRVQsIG1hbmRhdG9yeV9wYXJhbWV0ZXJzLCBidWlsZF9pZCA9IGJ1aWxkX2lkLCB0YXJnZXRfaWQgPSB0YXJnZXRfaWQsIHBhY2thZ2VfaWQgPSBwYWNrYWdlX2lkKQorICAgIChmaWx0ZXJfc3RyaW5nLCBzZWFyY2hfdGVybSwgb3JkZXJpbmdfc3RyaW5nKSA9IF9zZWFyY2hfdHVwbGUocmVxdWVzdCwgUGFja2FnZV9GaWxlKQorCisgICAgcXVlcnlzZXQgPSBQYWNrYWdlX0ZpbGUub2JqZWN0cy5maWx0ZXIocGFja2FnZV9pZF9fZXhhY3Q9cGFja2FnZV9pZCkKKyAgICBwYXRocyA9IF9nZXRfcXVlcnlzZXQoUGFja2FnZV9GaWxlLCBxdWVyeXNldCwgZmlsdGVyX3N0cmluZywgc2VhcmNoX3Rlcm0sIG9yZGVyaW5nX3N0cmluZywgJ3BhdGgnKQorCisgICAgcGFja2FnZSA9IFBhY2thZ2Uub2JqZWN0cy5nZXQocGs9cGFja2FnZV9pZCkKKyAgICBwYWNrYWdlLmZ1bGxwYWNrYWdlc3BlYyA9IF9nZXRfZnVsbHBhY2thZ2VzcGVjKHBhY2thZ2UpCisgICAgcGFja2FnZS5hbGlhcyA9IF9nZXRfcGFja2FnZV9hbGlhcyhwYWNrYWdlKQorICAgIHRhcmdldCA9IFRhcmdldC5vYmplY3RzLmdldChwaz10YXJnZXRfaWQpCisgICAgY29udGV4dCA9IHsKKyAgICAgICAgICAgICdidWlsZCcgOiBCdWlsZC5vYmplY3RzLmdldChwaz1idWlsZF9pZCksCisgICAgICAgICAgICAndGFyZ2V0JyAgOiB0YXJnZXQsCisgICAgICAgICAgICAncGFja2FnZScgOiBwYWNrYWdlLAorICAgICAgICAgICAgJ3JldmVyc2VfY291bnQnIDogX2dldF9wYWNrYWdlX3JldmVyc2VfZGVwX2NvdW50KHBhY2thZ2UsIHRhcmdldF9pZCksCisgICAgICAgICAgICAnZGVwZW5kZW5jeV9jb3VudCcgOiBfZ2V0X3BhY2thZ2VfZGVwZW5kZW5jeV9jb3VudChwYWNrYWdlLCB0YXJnZXRfaWQsIFRydWUpLAorICAgICAgICAgICAgJ29iamVjdHMnOiBwYXRocywKKyAgICAgICAgICAgICd0YWJsZWNvbHMnOlsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICduYW1lJzonRmlsZScsCisgICAgICAgICAgICAgICAgICAgICdvcmRlcmZpZWxkJzogX2dldF90b2dnbGVfb3JkZXIocmVxdWVzdCwgInBhdGgiKSwKKyAgICAgICAgICAgICAgICAgICAgJ29yZGVyaWNvbic6X2dldF90b2dnbGVfb3JkZXJfaWNvbihyZXF1ZXN0LCAicGF0aCIpLAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAnbmFtZSc6J1NpemUnLAorICAgICAgICAgICAgICAgICAgICAnb3JkZXJmaWVsZCc6IF9nZXRfdG9nZ2xlX29yZGVyKHJlcXVlc3QsICJzaXplIiwgVHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICdvcmRlcmljb24nOl9nZXRfdG9nZ2xlX29yZGVyX2ljb24ocmVxdWVzdCwgInNpemUiKSwKKyAgICAgICAgICAgICAgICAgICAgJ2RjbGFzcyc6ICdzaXplY29sIHNwYW4yJywKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgXQorICAgIH0KKyAgICBpZiBwYXRocy5hbGwoKS5jb3VudCgpIDwgMjoKKyAgICAgICAgY29udGV4dFsnZGlzYWJsZV9zb3J0J10gPSBUcnVlCisgICAgcmVzcG9uc2UgPSByZW5kZXIocmVxdWVzdCwgdGVtcGxhdGUsIGNvbnRleHQpCisgICAgX3NldF9wYXJhbWV0ZXJzX3ZhbHVlcyhwYWdlc2l6ZSwgb3JkZXJieSwgcmVxdWVzdCkKKyAgICByZXR1cm4gcmVzcG9uc2UKKworZGVmIHBhY2thZ2VfaW5jbHVkZWRfZGVwZW5kZW5jaWVzKHJlcXVlc3QsIGJ1aWxkX2lkLCB0YXJnZXRfaWQsIHBhY2thZ2VfaWQpOgorICAgIHRlbXBsYXRlID0gInBhY2thZ2VfaW5jbHVkZWRfZGVwZW5kZW5jaWVzLmh0bWwiCisgICAgaWYgQnVpbGQub2JqZWN0cy5maWx0ZXIocGs9YnVpbGRfaWQpLmNvdW50KCkgPT0gMCA6CisgICAgICAgIHJldHVybiByZWRpcmVjdChidWlsZHMpCisKKyAgICBwYWNrYWdlID0gUGFja2FnZS5vYmplY3RzLmdldChwaz1wYWNrYWdlX2lkKQorICAgIHBhY2thZ2UuZnVsbHBhY2thZ2VzcGVjID0gX2dldF9mdWxscGFja2FnZXNwZWMocGFja2FnZSkKKyAgICBwYWNrYWdlLmFsaWFzID0gX2dldF9wYWNrYWdlX2FsaWFzKHBhY2thZ2UpCisgICAgdGFyZ2V0ID0gVGFyZ2V0Lm9iamVjdHMuZ2V0KHBrPXRhcmdldF9pZCkKKworICAgIGRlcGVuZGVuY2llcyA9IF9nZXRfcGFja2FnZV9kZXBlbmRlbmNpZXMocGFja2FnZV9pZCwgdGFyZ2V0X2lkKQorICAgIGNvbnRleHQgPSB7CisgICAgICAgICAgICAnYnVpbGQnIDogQnVpbGQub2JqZWN0cy5nZXQocGs9YnVpbGRfaWQpLAorICAgICAgICAgICAgJ3BhY2thZ2UnIDogcGFja2FnZSwKKyAgICAgICAgICAgICd0YXJnZXQnIDogdGFyZ2V0LAorICAgICAgICAgICAgJ3J1bnRpbWVfZGVwcycgOiBkZXBlbmRlbmNpZXNbJ3J1bnRpbWVfZGVwcyddLAorICAgICAgICAgICAgJ290aGVyX2RlcHMnIDogICBkZXBlbmRlbmNpZXNbJ290aGVyX2RlcHMnXSwKKyAgICAgICAgICAgICdyZXZlcnNlX2NvdW50JyA6IF9nZXRfcGFja2FnZV9yZXZlcnNlX2RlcF9jb3VudChwYWNrYWdlLCB0YXJnZXRfaWQpLAorICAgICAgICAgICAgJ2RlcGVuZGVuY3lfY291bnQnIDogX2dldF9wYWNrYWdlX2RlcGVuZGVuY3lfY291bnQocGFja2FnZSwgdGFyZ2V0X2lkLCBUcnVlKQorICAgIH0KKyAgICByZXR1cm4gcmVuZGVyKHJlcXVlc3QsIHRlbXBsYXRlLCBjb250ZXh0KQorCitkZWYgcGFja2FnZV9pbmNsdWRlZF9yZXZlcnNlX2RlcGVuZGVuY2llcyhyZXF1ZXN0LCBidWlsZF9pZCwgdGFyZ2V0X2lkLCBwYWNrYWdlX2lkKToKKyAgICB0ZW1wbGF0ZSA9ICJwYWNrYWdlX2luY2x1ZGVkX3JldmVyc2VfZGVwZW5kZW5jaWVzLmh0bWwiCisgICAgaWYgQnVpbGQub2JqZWN0cy5maWx0ZXIocGs9YnVpbGRfaWQpLmNvdW50KCkgPT0gMCA6CisgICAgICAgIHJldHVybiByZWRpcmVjdChidWlsZHMpCisKKyAgICAocGFnZXNpemUsIG9yZGVyYnkpID0gX2dldF9wYXJhbWV0ZXJzX3ZhbHVlcyhyZXF1ZXN0LCAyNSwgJ3BhY2thZ2VfX25hbWU6KycpCisgICAgbWFuZGF0b3J5X3BhcmFtZXRlcnMgPSB7ICdjb3VudCc6IHBhZ2VzaXplLCAgJ3BhZ2UnIDogMSwgJ29yZGVyYnknOiBvcmRlcmJ5IH0KKyAgICByZXR2YWwgPSBfdmVyaWZ5X3BhcmFtZXRlcnMoIHJlcXVlc3QuR0VULCBtYW5kYXRvcnlfcGFyYW1ldGVycyApCisgICAgaWYgcmV0dmFsOgorICAgICAgICByZXR1cm4gX3JlZGlyZWN0X3BhcmFtZXRlcnMoICdwYWNrYWdlX2luY2x1ZGVkX3JldmVyc2VfZGVwZW5kZW5jaWVzJywgcmVxdWVzdC5HRVQsIG1hbmRhdG9yeV9wYXJhbWV0ZXJzLCBidWlsZF9pZCA9IGJ1aWxkX2lkLCB0YXJnZXRfaWQgPSB0YXJnZXRfaWQsIHBhY2thZ2VfaWQgPSBwYWNrYWdlX2lkKQorICAgIChmaWx0ZXJfc3RyaW5nLCBzZWFyY2hfdGVybSwgb3JkZXJpbmdfc3RyaW5nKSA9IF9zZWFyY2hfdHVwbGUocmVxdWVzdCwgUGFja2FnZV9GaWxlKQorCisgICAgcXVlcnlzZXQgPSBQYWNrYWdlX0RlcGVuZGVuY3kub2JqZWN0cy5zZWxlY3RfcmVsYXRlZCgnZGVwZW5kc19vbl9fbmFtZScsICdkZXBlbmRzX29uX19zaXplJykuZmlsdGVyKGRlcGVuZHNfb249cGFja2FnZV9pZCwgdGFyZ2V0X2lkPXRhcmdldF9pZCwgZGVwX3R5cGU9UGFja2FnZV9EZXBlbmRlbmN5LlRZUEVfVFJERVBFTkRTKQorICAgIG9iamVjdHMgPSBfZ2V0X3F1ZXJ5c2V0KFBhY2thZ2VfRGVwZW5kZW5jeSwgcXVlcnlzZXQsIGZpbHRlcl9zdHJpbmcsIHNlYXJjaF90ZXJtLCBvcmRlcmluZ19zdHJpbmcsICdwYWNrYWdlX19uYW1lJykKKworICAgIHBhY2thZ2UgPSBQYWNrYWdlLm9iamVjdHMuZ2V0KHBrPXBhY2thZ2VfaWQpCisgICAgcGFja2FnZS5mdWxscGFja2FnZXNwZWMgPSBfZ2V0X2Z1bGxwYWNrYWdlc3BlYyhwYWNrYWdlKQorICAgIHBhY2thZ2UuYWxpYXMgPSBfZ2V0X3BhY2thZ2VfYWxpYXMocGFja2FnZSkKKyAgICB0YXJnZXQgPSBUYXJnZXQub2JqZWN0cy5nZXQocGs9dGFyZ2V0X2lkKQorICAgIGZvciBvIGluIG9iamVjdHM6CisgICAgICAgIGlmIG8ucGFja2FnZS52ZXJzaW9uICE9ICcnOgorICAgICAgICAgICAgby5wYWNrYWdlLnZlcnNpb24gKz0gJy0nICsgby5wYWNrYWdlLnJldmlzaW9uCisgICAgICAgIG8uYWxpYXMgPSBfZ2V0X3BhY2thZ2VfYWxpYXMoby5wYWNrYWdlKQorICAgIGNvbnRleHQgPSB7CisgICAgICAgICAgICAnYnVpbGQnIDogQnVpbGQub2JqZWN0cy5nZXQocGs9YnVpbGRfaWQpLAorICAgICAgICAgICAgJ3BhY2thZ2UnIDogcGFja2FnZSwKKyAgICAgICAgICAgICd0YXJnZXQnIDogdGFyZ2V0LAorICAgICAgICAgICAgJ29iamVjdHMnIDogb2JqZWN0cywKKyAgICAgICAgICAgICdyZXZlcnNlX2NvdW50JyA6IF9nZXRfcGFja2FnZV9yZXZlcnNlX2RlcF9jb3VudChwYWNrYWdlLCB0YXJnZXRfaWQpLAorICAgICAgICAgICAgJ2RlcGVuZGVuY3lfY291bnQnIDogX2dldF9wYWNrYWdlX2RlcGVuZGVuY3lfY291bnQocGFja2FnZSwgdGFyZ2V0X2lkLCBUcnVlKSwKKyAgICAgICAgICAgICd0YWJsZWNvbHMnOlsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICduYW1lJzonUGFja2FnZScsCisgICAgICAgICAgICAgICAgICAgICdvcmRlcmZpZWxkJzogX2dldF90b2dnbGVfb3JkZXIocmVxdWVzdCwgInBhY2thZ2VfX25hbWUiKSwKKyAgICAgICAgICAgICAgICAgICAgJ29yZGVyaWNvbic6IF9nZXRfdG9nZ2xlX29yZGVyX2ljb24ocmVxdWVzdCwgInBhY2thZ2VfX25hbWUiKSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgJ25hbWUnOidWZXJzaW9uJywKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgJ25hbWUnOidTaXplJywKKyAgICAgICAgICAgICAgICAgICAgJ29yZGVyZmllbGQnOiBfZ2V0X3RvZ2dsZV9vcmRlcihyZXF1ZXN0LCAicGFja2FnZV9fc2l6ZSIsIFRydWUpLAorICAgICAgICAgICAgICAgICAgICAnb3JkZXJpY29uJzogX2dldF90b2dnbGVfb3JkZXJfaWNvbihyZXF1ZXN0LCAicGFja2FnZV9fc2l6ZSIpLAorICAgICAgICAgICAgICAgICAgICAnZGNsYXNzJzogJ3NpemVjb2wgc3BhbjInLAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICBdCisgICAgfQorICAgIGlmIG9iamVjdHMuYWxsKCkuY291bnQoKSA8IDI6CisgICAgICAgIGNvbnRleHRbJ2Rpc2FibGVfc29ydCddID0gVHJ1ZQorICAgIHJlc3BvbnNlID0gcmVuZGVyKHJlcXVlc3QsIHRlbXBsYXRlLCBjb250ZXh0KQorICAgIF9zZXRfcGFyYW1ldGVyc192YWx1ZXMocGFnZXNpemUsIG9yZGVyYnksIHJlcXVlc3QpCisgICAgcmV0dXJuIHJlc3BvbnNlCisKK2RlZiBpbWFnZV9pbmZvcm1hdGlvbl9kaXIocmVxdWVzdCwgYnVpbGRfaWQsIHRhcmdldF9pZCwgcGFja2FnZWZpbGVfaWQpOgorICAgICMgc3R1YmJlZCBmb3Igbm93CisgICAgcmV0dXJuIHJlZGlyZWN0KGJ1aWxkcykKKyAgICAjIHRoZSBjb250ZXh0IHByb2Nlc3NvciB0aGF0IHN1cHBsaWVzIGRhdGEgdXNlZCBhY3Jvc3MgYWxsIHRoZSBwYWdlcworCisKK2RlZiBtYW5hZ2VkY29udGV4dHByb2Nlc3NvcihyZXF1ZXN0KToKKyAgICByZXQgPSB7CisgICAgICAgICJwcm9qZWN0cyI6IFByb2plY3Qub2JqZWN0cy5hbGwoKSwKKyAgICAgICAgIkRFQlVHIiA6IHRvYXN0ZXJtYWluLnNldHRpbmdzLkRFQlVHLAorICAgICAgICAiVE9BU1RFUl9CUkFOQ0giOiB0b2FzdGVybWFpbi5zZXR0aW5ncy5UT0FTVEVSX0JSQU5DSCwKKyAgICAgICAgIlRPQVNURVJfUkVWSVNJT04iIDogdG9hc3Rlcm1haW4uc2V0dGluZ3MuVE9BU1RFUl9SRVZJU0lPTiwKKyAgICB9CisgICAgcmV0dXJuIHJldAorCisKKworaW1wb3J0IHRvYXN0ZXJtYWluLnNldHRpbmdzCisKK2Zyb20gb3JtLm1vZGVscyBpbXBvcnQgUHJvamVjdCwgUHJvamVjdExheWVyLCBQcm9qZWN0VGFyZ2V0LCBQcm9qZWN0VmFyaWFibGUKKworIyB3ZSBoYXZlIGEgc2V0IG9mIGZ1bmN0aW9ucyBpZiB3ZSdyZSBpbiBtYW5hZ2VkIG1vZGUsIG9yCisjIGEgZGVmYXVsdCAicGFnZSBub3QgYXZhaWxhYmxlIiBzaW1wbGUgZnVuY3Rpb25zIGZvciBpbnRlcmFjdGl2ZSBtb2RlCisKK2lmIFRydWU6CisgICAgZnJvbSBkamFuZ28uY29udHJpYi5hdXRoLm1vZGVscyBpbXBvcnQgVXNlcgorICAgIGZyb20gZGphbmdvLmNvbnRyaWIuYXV0aCBpbXBvcnQgYXV0aGVudGljYXRlLCBsb2dpbgorICAgIGZyb20gZGphbmdvLmNvbnRyaWIuYXV0aC5kZWNvcmF0b3JzIGltcG9ydCBsb2dpbl9yZXF1aXJlZAorCisgICAgZnJvbSBvcm0ubW9kZWxzIGltcG9ydCBCcmFuY2gsIExheWVyU291cmNlLCBUb2FzdGVyU2V0dGluZywgUmVsZWFzZSwgTWFjaGluZSwgTGF5ZXJWZXJzaW9uRGVwZW5kZW5jeQorICAgIGZyb20gYmxkY29udHJvbC5tb2RlbHMgaW1wb3J0IEJ1aWxkUmVxdWVzdAorCisgICAgaW1wb3J0IHRyYWNlYmFjaworCisgICAgY2xhc3MgQmFkUGFyYW1ldGVyRXhjZXB0aW9uKEV4Y2VwdGlvbik6CisgICAgICAgICcnJyBUaGUgZXhjZXB0aW9uIHJhaXNlZCBvbiBpbnZhbGlkIFBPU1QgcmVxdWVzdHMgJycnCisgICAgICAgIHBhc3MKKworICAgICMgc2hvd3MgdGhlICJhbGwgYnVpbGRzIiBwYWdlIGZvciBtYW5hZ2VkIG1vZGU7IGl0IGRpc3BsYXlzIGJ1aWxkIHJlcXVlc3RzIChhdCBsZWFzdCBzdGFydGVkISkgaW5zdGVhZCBvZiBhY3R1YWwgYnVpbGRzCisgICAgQF90ZW1wbGF0ZV9yZW5kZXJlcigiYnVpbGRzLmh0bWwiKQorICAgIGRlZiBidWlsZHMocmVxdWVzdCk6CisgICAgICAgICMgZGVmaW5lIGhlcmUgd2hhdCBwYXJhbWV0ZXJzIHRoZSB2aWV3IG5lZWRzIGluIHRoZSBHRVQgcG9ydGlvbiBpbiBvcmRlciB0bworICAgICAgICAjIGJlIGFibGUgdG8gZGlzcGxheSBzb21ldGhpbmcuICAnY291bnQnIGFuZCAncGFnZScgYXJlIG1hbmRhdG9yeSBmb3IgYWxsIHZpZXdzCisgICAgICAgICMgdGhhdCB1c2UgcGFnaW5hdG9ycy4KKworICAgICAgICBxdWVyeXNldCA9IEJ1aWxkLm9iamVjdHMuZXhjbHVkZShvdXRjb21lID0gQnVpbGQuSU5fUFJPR1JFU1MpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29udGV4dCwgcGFnZXNpemUsIG9yZGVyYnkgPSBfYnVpbGRfbGlzdF9oZWxwZXIocmVxdWVzdCwgcXVlcnlzZXQpCisgICAgICAgICAgICAjIGFsbCBidWlsZHMgcGFnZSBhcyBhIFByb2plY3QgY29sdW1uCisgICAgICAgICAgICBjb250ZXh0Wyd0YWJsZWNvbHMnXS5hcHBlbmQoeyduYW1lJzogJ1Byb2plY3QnLCAnY2xjYWxzcyc6ICdwcm9qZWN0X2NvbHVtbicsIH0pCisgICAgICAgIGV4Y2VwdCBSZWRpcmVjdEV4Y2VwdGlvbiBhcyByZToKKyAgICAgICAgICAgICMgcmV3cml0ZSB0aGUgUmVkaXJlY3RFeGNlcHRpb24KKyAgICAgICAgICAgIHJlLnZpZXcgPSByZXNvbHZlKHJlcXVlc3QucGF0aF9pbmZvKS51cmxfbmFtZQorICAgICAgICAgICAgcmFpc2UgcmUKKworICAgICAgICBfc2V0X3BhcmFtZXRlcnNfdmFsdWVzKHBhZ2VzaXplLCBvcmRlcmJ5LCByZXF1ZXN0KQorICAgICAgICByZXR1cm4gY29udGV4dAorCisKKyAgICAjIGhlbHBlciBmdW5jdGlvbiwgdG8gYmUgdXNlZCBvbiAiYWxsIGJ1aWxkcyIgYW5kICJwcm9qZWN0IGJ1aWxkcyIgcGFnZXMKKyAgICBkZWYgX2J1aWxkX2xpc3RfaGVscGVyKHJlcXVlc3QsIHF1ZXJ5c2V0X2FsbCk6CisKKyAgICAgICAgZGVmYXVsdF9vcmRlcmJ5ID0gJ2NvbXBsZXRlZF9vbjotJworICAgICAgICAocGFnZXNpemUsIG9yZGVyYnkpID0gX2dldF9wYXJhbWV0ZXJzX3ZhbHVlcyhyZXF1ZXN0LCAxMCwgZGVmYXVsdF9vcmRlcmJ5KQorICAgICAgICBtYW5kYXRvcnlfcGFyYW1ldGVycyA9IHsgJ2NvdW50JzogcGFnZXNpemUsICAncGFnZScgOiAxLCAnb3JkZXJieScgOiBvcmRlcmJ5IH0KKyAgICAgICAgcmV0dmFsID0gX3ZlcmlmeV9wYXJhbWV0ZXJzKCByZXF1ZXN0LkdFVCwgbWFuZGF0b3J5X3BhcmFtZXRlcnMgKQorICAgICAgICBpZiByZXR2YWw6CisgICAgICAgICAgICByYWlzZSBSZWRpcmVjdEV4Y2VwdGlvbiggTm9uZSwgcmVxdWVzdC5HRVQsIG1hbmRhdG9yeV9wYXJhbWV0ZXJzKQorCisgICAgICAgICMgYm9pbGVycGxhdGUgY29kZSB0aGF0IHRha2VzIGEgcmVxdWVzdCBmb3IgYW4gb2JqZWN0IHR5cGUgYW5kIHJldHVybnMgYSBxdWVyeXNldAorICAgICAgICAjIGZvciB0aGF0IG9iamVjdCB0eXBlLiBjb3B5cGFzdGEgZm9yIGFsbCBuZWVkZWQgdGFibGUgc2VhcmNoZXMKKyAgICAgICAgKGZpbHRlcl9zdHJpbmcsIHNlYXJjaF90ZXJtLCBvcmRlcmluZ19zdHJpbmcpID0gX3NlYXJjaF90dXBsZShyZXF1ZXN0LCBCdWlsZCkKKyAgICAgICAgIyBwb3N0LXByb2Nlc3MgYW55IGRhdGUgcmFuZ2UgZmlsdGVycworICAgICAgICBmaWx0ZXJfc3RyaW5nLGRhdGVyYW5nZV9zZWxlY3RlZCA9IF9tb2RpZnlfZGF0ZV9yYW5nZV9maWx0ZXIoZmlsdGVyX3N0cmluZykKKyAgICAgICAgcXVlcnlzZXRfYWxsID0gcXVlcnlzZXRfYWxsLnNlbGVjdF9yZWxhdGVkKCJwcm9qZWN0IikuYW5ub3RhdGUoZXJyb3JzX25vID0gQ291bnQoJ2xvZ21lc3NhZ2UnLCBvbmx5PVEobG9nbWVzc2FnZV9fbGV2ZWw9TG9nTWVzc2FnZS5FUlJPUil8UShsb2dtZXNzYWdlX19sZXZlbD1Mb2dNZXNzYWdlLkVYQ0VQVElPTikpKS5hbm5vdGF0ZSh3YXJuaW5nc19ubyA9IENvdW50KCdsb2dtZXNzYWdlJywgb25seT1RKGxvZ21lc3NhZ2VfX2xldmVsPUxvZ01lc3NhZ2UuV0FSTklORykpKS5leHRyYShzZWxlY3Q9eyd0aW1lc3BlbnQnOidjb21wbGV0ZWRfb24gLSBzdGFydGVkX29uJ30pCisgICAgICAgIHF1ZXJ5c2V0X3dpdGhfc2VhcmNoID0gX2dldF9xdWVyeXNldChCdWlsZCwgcXVlcnlzZXRfYWxsLCBOb25lLCBzZWFyY2hfdGVybSwgb3JkZXJpbmdfc3RyaW5nLCAnLWNvbXBsZXRlZF9vbicpCisgICAgICAgIHF1ZXJ5c2V0ID0gX2dldF9xdWVyeXNldChCdWlsZCwgcXVlcnlzZXRfYWxsLCBmaWx0ZXJfc3RyaW5nLCBzZWFyY2hfdGVybSwgb3JkZXJpbmdfc3RyaW5nLCAnLWNvbXBsZXRlZF9vbicpCisKKyAgICAgICAgIyByZXRyaWV2ZSB0aGUgb2JqZWN0cyB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSB0YWJsZTsgYnVpbGRzIGEgcGFnaW5hdG9yIGFuZCBnZXRzIGEgcGFnZSByYW5nZSB0byBkaXNwbGF5CisgICAgICAgIGJ1aWxkX2luZm8gPSBfYnVpbGRfcGFnZV9yYW5nZShQYWdpbmF0b3IocXVlcnlzZXQsIHBhZ2VzaXplKSwgcmVxdWVzdC5HRVQuZ2V0KCdwYWdlJywgMSkpCisKKyAgICAgICAgIyBidWlsZCB2aWV3LXNwZWNpZmljIGluZm9ybWF0aW9uOyB0aGlzIGlzIHJlbmRlcmVkIHNwZWNpZmljYWxseSBpbiB0aGUgYnVpbGRzIHBhZ2UsIGF0IHRoZSB0b3Agb2YgdGhlIHBhZ2UgKGkuZS4gUmVjZW50IGJ1aWxkcykKKyAgICAgICAgYnVpbGRfbXJ1ID0gQnVpbGQub2JqZWN0cy5vcmRlcl9ieSgiLXN0YXJ0ZWRfb24iKVs6M10KKworICAgICAgICAjIGNhbGN1bGF0ZSB0aGUgZXhhY3QgYmVnaW5pbmcgb2YgbG9jYWwgdG9kYXkgYW5kIHllc3RlcmRheSwgYXBwZW5kIGNvbnRleHQKKyAgICAgICAgY29udGV4dF9kYXRlLHRvZGF5X2JlZ2luLHllc3RlcmRheV9iZWdpbiA9IF9hZGRfZGF0ZXJhbmdlX2NvbnRleHQocXVlcnlzZXRfYWxsLCByZXF1ZXN0LCB7J3N0YXJ0ZWRfb24nLCdjb21wbGV0ZWRfb24nfSkKKworICAgICAgICAjIHNldCB1cCBsaXN0IG9mIGZzdHlwZXMgZm9yIGVhY2ggYnVpbGQKKyAgICAgICAgZnN0eXBlc19tYXAgPSB7fTsKKyAgICAgICAgZm9yIGJ1aWxkIGluIGJ1aWxkX2luZm86CisgICAgICAgICAgICB0YXJnZXRzID0gVGFyZ2V0Lm9iamVjdHMuZmlsdGVyKCBidWlsZF9pZCA9IGJ1aWxkLmlkICkKKyAgICAgICAgICAgIGNvbW1hID0gIiI7CisgICAgICAgICAgICBleHRlbnNpb25zID0gIiI7CisgICAgICAgICAgICBmb3IgdCBpbiB0YXJnZXRzOgorICAgICAgICAgICAgICAgIGlmICggbm90IHQuaXNfaW1hZ2UgKToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICB0aWYgPSBUYXJnZXRfSW1hZ2VfRmlsZS5vYmplY3RzLmZpbHRlciggdGFyZ2V0X2lkID0gdC5pZCApCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gdGlmOgorICAgICAgICAgICAgICAgICAgICBzPXJlLnN1YignLip0YXIuYnoyJywgJ3Rhci5iejInLCBpLmZpbGVfbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgcyA9PSBpLmZpbGVfbmFtZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHM9cmUuc3ViKCcuKlwuJywgJycsIGkuZmlsZV9uYW1lKQorICAgICAgICAgICAgICAgICAgICBpZiBOb25lID09IHJlLnNlYXJjaChzLGV4dGVuc2lvbnMpOgorICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucyArPSBjb21tYSArIHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hID0gIiwgIgorICAgICAgICAgICAgZnN0eXBlc19tYXBbYnVpbGQuaWRdPWV4dGVuc2lvbnMKKworICAgICAgICAjIHNlbmQgdGhlIGRhdGEgdG8gdGhlIHRlbXBsYXRlCisgICAgICAgIGNvbnRleHQgPSB7CisgICAgICAgICAgICAgICAgIyBzcGVjaWZpYyBpbmZvIGZvcgorICAgICAgICAgICAgICAgICAgICAnbXJ1JyA6IGJ1aWxkX21ydSwKKyAgICAgICAgICAgICAgICAjIFRPRE86IGNvbW1vbiBvYmplY3RzIGZvciBhbGwgdGFibGUgdmlld3MsIGFkYXB0IGFzIG5lZWRlZAorICAgICAgICAgICAgICAgICAgICAnb2JqZWN0cycgOiBidWlsZF9pbmZvLAorICAgICAgICAgICAgICAgICAgICAnb2JqZWN0bmFtZScgOiAiYnVpbGRzIiwKKyAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHRfb3JkZXJieScgOiBkZWZhdWx0X29yZGVyYnksCisgICAgICAgICAgICAgICAgICAgICdmc3R5cGVzJyA6IGZzdHlwZXNfbWFwLAorICAgICAgICAgICAgICAgICAgICAnc2VhcmNoX3Rlcm0nIDogc2VhcmNoX3Rlcm0sCisgICAgICAgICAgICAgICAgICAgICd0b3RhbF9jb3VudCcgOiBxdWVyeXNldF93aXRoX3NlYXJjaC5jb3VudCgpLAorICAgICAgICAgICAgICAgICAgICAnZGF0ZXJhbmdlX3NlbGVjdGVkJyA6IGRhdGVyYW5nZV9zZWxlY3RlZCwKKyAgICAgICAgICAgICAgICAjIFNwZWNpZmllcyB0aGUgZGlzcGxheSBvZiBjb2x1bW5zIGZvciB0aGUgdGFibGUsIGFwcGVhcmFuY2UgaW4gIkVkaXQgY29sdW1ucyIgYm94LCB0b2dnbGluZyBkZWZhdWx0IHNob3cvaGlkZSwgYW5kIHNwZWNpZnlpbmcgZmlsdGVycyBmb3IgY29sdW1ucworICAgICAgICAgICAgICAgICAgICAndGFibGVjb2xzJyA6IFsKKyAgICAgICAgICAgICAgICAgICAgeyduYW1lJzogJ091dGNvbWUnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY29sdW1uIHdpdGggYSBzaW5nbGUgZmlsdGVyCisgICAgICAgICAgICAgICAgICAgICAncWhlbHAnIDogIlRoZSBvdXRjb21lIHRlbGxzIHlvdSBpZiBhIGJ1aWxkIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgb3IgZmFpbGVkIiwgICAgICMgdGhlIGhlbHAgYnV0dG9uIGNvbnRlbnQKKyAgICAgICAgICAgICAgICAgICAgICdkY2xhc3MnIDogInNwYW4yIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGluZGljYXRpb24gYWJvdXQgY29sdW1uIHdpZHRoOyBjb21lcyBmcm9tIHRoZSBkZXNpZ24KKyAgICAgICAgICAgICAgICAgICAgICdvcmRlcmZpZWxkJzogX2dldF90b2dnbGVfb3JkZXIocmVxdWVzdCwgIm91dGNvbWUiKSwgICAgICAgICAgICAgICAjIGFkZHMgb3JkZXJpbmcgYnkgdGhlIGZpZWxkIHZhbHVlOyBkZWZhdWx0IGFzY2VuZGluZyB1bmxlc3MgY2xpY2tlZCBmcm9tIGFzY2VuZGluZyBpbnRvIGRlc2NlbmRpbmcKKyAgICAgICAgICAgICAgICAgICAgICdvcmRlcmljb24nOl9nZXRfdG9nZ2xlX29yZGVyX2ljb24ocmVxdWVzdCwgIm91dGNvbWUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAjIGZpbHRlciBmaWVsZCB3aWxsIHNldCBhIGZpbHRlciBvbiB0aGF0IGNvbHVtbiB3aXRoIHRoZSBzcGVjcyBpbiB0aGUgZmlsdGVyIGRlc2NyaXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgY2xhc3MgZmllbGQgaW4gdGhlIGZpbHRlciBoYXMgbm8gcmVsYXRpb24gd2l0aCBjbGNsYXNzOyB0aGUgY29udHJvbCBkaWZmZXJlbnQgYXNwZWN0cyBvZiB0aGUgVUkKKyAgICAgICAgICAgICAgICAgICAgICAjIHN0aWxsLCBpdCBpcyByZWNvbW1lbmRlZCBmb3IgdGhlIHZhbHVlcyB0byBiZSBpZGVudGljYWwgZm9yIGVhc3kgdHJhY2tpbmcgaW4gdGhlIGdlbmVyYXRlZCBIVE1MCisgICAgICAgICAgICAgICAgICAgICAnZmlsdGVyJyA6IHsnY2xhc3MnIDogJ291dGNvbWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhYmVsJzogJ1Nob3c6JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvcHRpb25zJyA6IFsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnU3VjY2Vzc2Z1bCBidWlsZHMnLCAnb3V0Y29tZTonICsgc3RyKEJ1aWxkLlNVQ0NFRURFRCksIHF1ZXJ5c2V0X3dpdGhfc2VhcmNoLmZpbHRlcihvdXRjb21lPXN0cihCdWlsZC5TVUNDRUVERUQpKS5jb3VudCgpKSwgICMgdGhpcyBpcyB0aGUgZmllbGQgc2VhcmNoIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnRmFpbGVkIGJ1aWxkcycsICdvdXRjb21lOicrIHN0cihCdWlsZC5GQUlMRUQpLCBxdWVyeXNldF93aXRoX3NlYXJjaC5maWx0ZXIob3V0Y29tZT1zdHIoQnVpbGQuRkFJTEVEKSkuY291bnQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgeyduYW1lJzogJ1JlY2lwZScsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZGVmYXVsdCBjb2x1bW4sIGRpc2FibGVkIGJveCwgd2l0aCBqdXN0IHRoZSBuYW1lIGluIHRoZSBsaXN0CisgICAgICAgICAgICAgICAgICAgICAncWhlbHAnOiAiV2hhdCB5b3UgYnVpbHQgKGkuZS4gb25lIG9yIG1vcmUgcmVjaXBlcyBvciBpbWFnZSByZWNpcGVzKSIsCisgICAgICAgICAgICAgICAgICAgICAnb3JkZXJmaWVsZCc6IF9nZXRfdG9nZ2xlX29yZGVyKHJlcXVlc3QsICJ0YXJnZXRfX3RhcmdldCIpLAorICAgICAgICAgICAgICAgICAgICAgJ29yZGVyaWNvbic6X2dldF90b2dnbGVfb3JkZXJfaWNvbihyZXF1ZXN0LCAidGFyZ2V0X190YXJnZXQiKSwKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgeyduYW1lJzogJ01hY2hpbmUnLAorICAgICAgICAgICAgICAgICAgICAgJ3FoZWxwJzogIlRoZSBtYWNoaW5lIGlzIHRoZSBoYXJkd2FyZSBmb3Igd2hpY2ggeW91IGFyZSBidWlsZGluZyBhIHJlY2lwZSBvciBpbWFnZSByZWNpcGUiLAorICAgICAgICAgICAgICAgICAgICAgJ29yZGVyZmllbGQnOiBfZ2V0X3RvZ2dsZV9vcmRlcihyZXF1ZXN0LCAibWFjaGluZSIpLAorICAgICAgICAgICAgICAgICAgICAgJ29yZGVyaWNvbic6X2dldF90b2dnbGVfb3JkZXJfaWNvbihyZXF1ZXN0LCAibWFjaGluZSIpLAorICAgICAgICAgICAgICAgICAgICAgJ2RjbGFzcyc6ICdzcGFuMycKKyAgICAgICAgICAgICAgICAgICAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGEgc2xpZ2h0bHkgd2lkZXIgY29sdW1uCisgICAgICAgICAgICAgICAgICAgIHsnbmFtZSc6ICdTdGFydGVkIG9uJywgJ2NsY2xhc3MnOiAnc3RhcnRlZF9vbicsICdoaWRkZW4nIDogMSwgICAgICAjIHRoaXMgaXMgYW4gdW5jaGVja2VkIGJveCwgd2hpY2ggaGlkZXMgdGhlIGNvbHVtbgorICAgICAgICAgICAgICAgICAgICAgJ3FoZWxwJzogIlRoZSBkYXRlIGFuZCB0aW1lIHlvdSBzdGFydGVkIHRoZSBidWlsZCIsCisgICAgICAgICAgICAgICAgICAgICAnb3JkZXJmaWVsZCc6IF9nZXRfdG9nZ2xlX29yZGVyKHJlcXVlc3QsICJzdGFydGVkX29uIiwgVHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAnb3JkZXJpY29uJzpfZ2V0X3RvZ2dsZV9vcmRlcl9pY29uKHJlcXVlc3QsICJzdGFydGVkX29uIiksCisgICAgICAgICAgICAgICAgICAgICAnb3JkZXJrZXknIDogInN0YXJ0ZWRfb24iLAorICAgICAgICAgICAgICAgICAgICAgJ2ZpbHRlcicgOiB7J2NsYXNzJyA6ICdzdGFydGVkX29uJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYWJlbCc6ICdTaG93OicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3B0aW9ucycgOiBbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIlRvZGF5J3MgYnVpbGRzIiAsICdzdGFydGVkX29uX19ndGU6Jyt0b2RheV9iZWdpbi5zdHJmdGltZSgiJVktJW0tJWQiKSwgcXVlcnlzZXRfYWxsLmZpbHRlcihzdGFydGVkX29uX19ndGU9dG9kYXlfYmVnaW4pLmNvdW50KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJZZXN0ZXJkYXkncyBidWlsZHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdGFydGVkX29uX19ndGUhc3RhcnRlZF9vbl9fbHQ6JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAreWVzdGVyZGF5X2JlZ2luLnN0cmZ0aW1lKCIlWS0lbS0lZCIpKychJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArdG9kYXlfYmVnaW4uc3RyZnRpbWUoIiVZLSVtLSVkIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlzZXRfYWxsLmZpbHRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZF9vbl9fZ3RlPXllc3RlcmRheV9iZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZF9vbl9fbHQ9dG9kYXlfYmVnaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5jb3VudCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiQnVpbGQgZGF0ZSByYW5nZSIsICdkYXRlcmFuZ2UnLCAxLCAnJywgJ3N0YXJ0ZWRfb24nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgeyduYW1lJzogJ0NvbXBsZXRlZCBvbicsCisgICAgICAgICAgICAgICAgICAgICAncWhlbHAnOiAiVGhlIGRhdGUgYW5kIHRpbWUgdGhlIGJ1aWxkIGZpbmlzaGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICdvcmRlcmZpZWxkJzogX2dldF90b2dnbGVfb3JkZXIocmVxdWVzdCwgImNvbXBsZXRlZF9vbiIsIFRydWUpLAorICAgICAgICAgICAgICAgICAgICAgJ29yZGVyaWNvbic6X2dldF90b2dnbGVfb3JkZXJfaWNvbihyZXF1ZXN0LCAiY29tcGxldGVkX29uIiksCisgICAgICAgICAgICAgICAgICAgICAnb3JkZXJrZXknIDogJ2NvbXBsZXRlZF9vbicsCisgICAgICAgICAgICAgICAgICAgICAnZmlsdGVyJyA6IHsnY2xhc3MnIDogJ2NvbXBsZXRlZF9vbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFiZWwnOiAnU2hvdzonLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29wdGlvbnMnIDogWworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJUb2RheSdzIGJ1aWxkcyIgLCAnY29tcGxldGVkX29uX19ndGU6Jyt0b2RheV9iZWdpbi5zdHJmdGltZSgiJVktJW0tJWQiKSwgcXVlcnlzZXRfYWxsLmZpbHRlcihjb21wbGV0ZWRfb25fX2d0ZT10b2RheV9iZWdpbikuY291bnQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIlllc3RlcmRheSdzIGJ1aWxkcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbXBsZXRlZF9vbl9fZ3RlIWNvbXBsZXRlZF9vbl9fbHQ6JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAreWVzdGVyZGF5X2JlZ2luLnN0cmZ0aW1lKCIlWS0lbS0lZCIpKychJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArdG9kYXlfYmVnaW4uc3RyZnRpbWUoIiVZLSVtLSVkIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlzZXRfYWxsLmZpbHRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkX29uX19ndGU9eWVzdGVyZGF5X2JlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWRfb25fX2x0PXRvZGF5X2JlZ2luCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuY291bnQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIkJ1aWxkIGRhdGUgcmFuZ2UiLCAnZGF0ZXJhbmdlJywgMSwgJycsICdjb21wbGV0ZWRfb24nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICB7J25hbWUnOiAnRmFpbGVkIHRhc2tzJywgJ2NsY2xhc3MnOiAnZmFpbGVkX3Rhc2tzJywgICAgICAgICAgICAgICAgIyBzcGVjaWZpbmcgYSBjbGNsYXNzIHdpbGwgZW5hYmxlIHRoZSBjaGVja2JveAorICAgICAgICAgICAgICAgICAgICAgJ3FoZWxwJzogIkhvdyBtYW55IHRhc2tzIGZhaWxlZCBkdXJpbmcgdGhlIGJ1aWxkIiwKKyAgICAgICAgICAgICAgICAgICAgICdmaWx0ZXInIDogeydjbGFzcycgOiAnZmFpbGVkX3Rhc2tzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYWJlbCc6ICdTaG93OicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3B0aW9ucycgOiBbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ0J1aWxkcyB3aXRoIGZhaWxlZCB0YXNrcycsICd0YXNrX2J1aWxkX19vdXRjb21lOjQnLCBxdWVyeXNldF93aXRoX3NlYXJjaC5maWx0ZXIodGFza19idWlsZF9fb3V0Y29tZT00KS5jb3VudCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnQnVpbGRzIHdpdGhvdXQgZmFpbGVkIHRhc2tzJywgJ3Rhc2tfYnVpbGRfX291dGNvbWU6Tk9UNCcsIHF1ZXJ5c2V0X3dpdGhfc2VhcmNoLmZpbHRlcih+USh0YXNrX2J1aWxkX19vdXRjb21lPTQpKS5jb3VudCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICB7J25hbWUnOiAnRXJyb3JzJywgJ2NsY2xhc3MnOiAnZXJyb3JzX25vJywKKyAgICAgICAgICAgICAgICAgICAgICdxaGVscCc6ICJIb3cgbWFueSBlcnJvcnMgd2VyZSBlbmNvdW50ZXJlZCBkdXJpbmcgdGhlIGJ1aWxkIChpZiBhbnkpIiwKKyAgICAgICAgICAgICAgICAgICAgICdvcmRlcmZpZWxkJzogX2dldF90b2dnbGVfb3JkZXIocmVxdWVzdCwgImVycm9yc19ubyIsIFRydWUpLAorICAgICAgICAgICAgICAgICAgICAgJ29yZGVyaWNvbic6X2dldF90b2dnbGVfb3JkZXJfaWNvbihyZXF1ZXN0LCAiZXJyb3JzX25vIiksCisgICAgICAgICAgICAgICAgICAgICAnb3JkZXJrZXknIDogJ2Vycm9yc19ubycsCisgICAgICAgICAgICAgICAgICAgICAnZmlsdGVyJyA6IHsnY2xhc3MnIDogJ2Vycm9yc19ubycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFiZWwnOiAnU2hvdzonLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29wdGlvbnMnIDogWworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdCdWlsZHMgd2l0aCBlcnJvcnMnLCAnZXJyb3JzX25vX19ndGU6MScsIHF1ZXJ5c2V0X3dpdGhfc2VhcmNoLmZpbHRlcihlcnJvcnNfbm9fX2d0ZT0xKS5jb3VudCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnQnVpbGRzIHdpdGhvdXQgZXJyb3JzJywgJ2Vycm9yc19ubzowJywgcXVlcnlzZXRfd2l0aF9zZWFyY2guZmlsdGVyKGVycm9yc19ubz0wKS5jb3VudCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICB7J25hbWUnOiAnV2FybmluZ3MnLCAnY2xjbGFzcyc6ICd3YXJuaW5nc19ubycsCisgICAgICAgICAgICAgICAgICAgICAncWhlbHAnOiAiSG93IG1hbnkgd2FybmluZ3Mgd2VyZSBlbmNvdW50ZXJlZCBkdXJpbmcgdGhlIGJ1aWxkIChpZiBhbnkpIiwKKyAgICAgICAgICAgICAgICAgICAgICdvcmRlcmZpZWxkJzogX2dldF90b2dnbGVfb3JkZXIocmVxdWVzdCwgIndhcm5pbmdzX25vIiwgVHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAnb3JkZXJpY29uJzpfZ2V0X3RvZ2dsZV9vcmRlcl9pY29uKHJlcXVlc3QsICJ3YXJuaW5nc19ubyIpLAorICAgICAgICAgICAgICAgICAgICAgJ29yZGVya2V5JyA6ICd3YXJuaW5nc19ubycsCisgICAgICAgICAgICAgICAgICAgICAnZmlsdGVyJyA6IHsnY2xhc3MnIDogJ3dhcm5pbmdzX25vJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYWJlbCc6ICdTaG93OicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3B0aW9ucycgOiBbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ0J1aWxkcyB3aXRoIHdhcm5pbmdzJywnd2FybmluZ3Nfbm9fX2d0ZToxJywgcXVlcnlzZXRfd2l0aF9zZWFyY2guZmlsdGVyKHdhcm5pbmdzX25vX19ndGU9MSkuY291bnQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ0J1aWxkcyB3aXRob3V0IHdhcm5pbmdzJywnd2FybmluZ3Nfbm86MCcsIHF1ZXJ5c2V0X3dpdGhfc2VhcmNoLmZpbHRlcih3YXJuaW5nc19ubz0wKS5jb3VudCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICB7J25hbWUnOiAnVGltZScsICdjbGNsYXNzJzogJ3RpbWUnLCAnaGlkZGVuJyA6IDEsCisgICAgICAgICAgICAgICAgICAgICAncWhlbHAnOiAiSG93IGxvbmcgaXQgdG9vayB0aGUgYnVpbGQgdG8gZmluaXNoIiwKKyAgICAgICAgICAgICAgICAgICAgICdvcmRlcmZpZWxkJzogX2dldF90b2dnbGVfb3JkZXIocmVxdWVzdCwgInRpbWVzcGVudCIsIFRydWUpLAorICAgICAgICAgICAgICAgICAgICAgJ29yZGVyaWNvbic6X2dldF90b2dnbGVfb3JkZXJfaWNvbihyZXF1ZXN0LCAidGltZXNwZW50IiksCisgICAgICAgICAgICAgICAgICAgICAnb3JkZXJrZXknIDogJ3RpbWVzcGVudCcsCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIHsnbmFtZSc6ICdJbWFnZSBmaWxlcycsICdjbGNsYXNzJzogJ291dHB1dCcsCisgICAgICAgICAgICAgICAgICAgICAncWhlbHAnOiAiVGhlIHJvb3QgZmlsZSBzeXN0ZW0gdHlwZXMgcHJvZHVjZWQgYnkgdGhlIGJ1aWxkLiBZb3UgY2FuIGZpbmQgdGhlbSBpbiB5b3VyIDxjb2RlPi9idWlsZC90bXAvZGVwbG95L2ltYWdlcy88L2NvZGU+IGRpcmVjdG9yeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAjIFRPRE86IGNvbXB1dGUgaW1hZ2UgZnN0eXBlcyBmcm9tIFRhcmdldF9JbWFnZV9GaWxlCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAjIG1lcmdlIGRhdGVyYW5nZSB2YWx1ZXMKKyAgICAgICAgY29udGV4dC51cGRhdGUoY29udGV4dF9kYXRlKQorICAgICAgICByZXR1cm4gY29udGV4dCwgcGFnZXNpemUsIG9yZGVyYnkKKworCisKKyAgICAjIG5ldyBwcm9qZWN0CisgICAgZGVmIG5ld3Byb2plY3QocmVxdWVzdCk6CisgICAgICAgIHRlbXBsYXRlID0gIm5ld3Byb2plY3QuaHRtbCIKKyAgICAgICAgY29udGV4dCA9IHsKKyAgICAgICAgICAgICdlbWFpbCc6IHJlcXVlc3QudXNlci5lbWFpbCBpZiByZXF1ZXN0LnVzZXIuaXNfYXV0aGVudGljYXRlZCgpIGVsc2UgJycsCisgICAgICAgICAgICAndXNlcm5hbWUnOiByZXF1ZXN0LnVzZXIudXNlcm5hbWUgaWYgcmVxdWVzdC51c2VyLmlzX2F1dGhlbnRpY2F0ZWQoKSBlbHNlICcnLAorICAgICAgICAgICAgJ3JlbGVhc2VzJzogUmVsZWFzZS5vYmplY3RzLm9yZGVyX2J5KCJkZXNjcmlwdGlvbiIpLAorICAgICAgICB9CisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29udGV4dFsnZGVmYXVsdGJyYW5jaCddID0gVG9hc3RlclNldHRpbmcub2JqZWN0cy5nZXQobmFtZSA9ICJERUZBVUxUX1JFTEVBU0UiKS52YWx1ZQorICAgICAgICBleGNlcHQgVG9hc3RlclNldHRpbmcuRG9lc05vdEV4aXN0OgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGlmIHJlcXVlc3QubWV0aG9kID09ICJHRVQiOgorICAgICAgICAgICAgIyByZW5kZXIgbmV3IHByb2plY3QgcGFnZQorICAgICAgICAgICAgcmV0dXJuIHJlbmRlcihyZXF1ZXN0LCB0ZW1wbGF0ZSwgY29udGV4dCkKKyAgICAgICAgZWxpZiByZXF1ZXN0Lm1ldGhvZCA9PSAiUE9TVCI6CisgICAgICAgICAgICBtYW5kYXRvcnlfZmllbGRzID0gWydwcm9qZWN0bmFtZScsICdwdHlwZSddCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcHR5cGUgPSByZXF1ZXN0LlBPU1QuZ2V0KCdwdHlwZScpCisgICAgICAgICAgICAgICAgaWYgcHR5cGUgPT0gImJ1aWxkIjoKKyAgICAgICAgICAgICAgICAgICAgbWFuZGF0b3J5X2ZpZWxkcy5hcHBlbmQoJ3Byb2plY3R2ZXJzaW9uJykKKyAgICAgICAgICAgICAgICAjIG1ha2Ugc3VyZSB3ZSBoYXZlIHZhbHVlcyBmb3IgYWxsIG1hbmRhdG9yeV9maWVsZHMKKyAgICAgICAgICAgICAgICBpZiByZWR1Y2UoIGxhbWJkYSB4LCB5OiB4IG9yIHksIG1hcChsYW1iZGEgeDogbGVuKHJlcXVlc3QuUE9TVC5nZXQoeCwgJycpKSA9PSAwLCBtYW5kYXRvcnlfZmllbGRzKSk6CisgICAgICAgICAgICAgICAgIyBzZXQgYWxlcnQgZm9yIG1pc3NpbmcgZmllbGRzCisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEJhZFBhcmFtZXRlckV4Y2VwdGlvbigiRmllbGRzIG1pc3Npbmc6ICIgKworICAgICAgICAgICAgIiwgIi5qb2luKFt4IGZvciB4IGluIG1hbmRhdG9yeV9maWVsZHMgaWYgbGVuKHJlcXVlc3QuUE9TVC5nZXQoeCwgJycpKSA9PSAwIF0pKQorCisgICAgICAgICAgICAgICAgaWYgbm90IHJlcXVlc3QudXNlci5pc19hdXRoZW50aWNhdGVkKCk6CisgICAgICAgICAgICAgICAgICAgIHVzZXIgPSBhdXRoZW50aWNhdGUodXNlcm5hbWUgPSByZXF1ZXN0LlBPU1QuZ2V0KCd1c2VybmFtZScsICdfYW5vbnVzZXInKSwgcGFzc3dvcmQgPSAnbm9wYXNzJykKKyAgICAgICAgICAgICAgICAgICAgaWYgdXNlciBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgdXNlciA9IFVzZXIub2JqZWN0cy5jcmVhdGVfdXNlcih1c2VybmFtZSA9IHJlcXVlc3QuUE9TVC5nZXQoJ3VzZXJuYW1lJywgJ19hbm9udXNlcicpLCBlbWFpbCA9IHJlcXVlc3QuUE9TVC5nZXQoJ2VtYWlsJywgJycpLCBwYXNzd29yZCA9ICJub3Bhc3MiKQorCisgICAgICAgICAgICAgICAgICAgICAgICB1c2VyID0gYXV0aGVudGljYXRlKHVzZXJuYW1lID0gdXNlci51c2VybmFtZSwgcGFzc3dvcmQgPSAnbm9wYXNzJykKKyAgICAgICAgICAgICAgICAgICAgbG9naW4ocmVxdWVzdCwgdXNlcikKKworICAgICAgICAgICAgICAgICMgIHNhdmUgdGhlIHByb2plY3QKKyAgICAgICAgICAgICAgICBpZiBwdHlwZSA9PSAiYW5hbHlzaXMiOgorICAgICAgICAgICAgICAgICAgICByZWxlYXNlID0gTm9uZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJlbGVhc2UgPSBSZWxlYXNlLm9iamVjdHMuZ2V0KHBrID0gcmVxdWVzdC5QT1NULmdldCgncHJvamVjdHZlcnNpb24nLCBOb25lICkpCisKKyAgICAgICAgICAgICAgICBwcmogPSBQcm9qZWN0Lm9iamVjdHMuY3JlYXRlX3Byb2plY3QobmFtZSA9IHJlcXVlc3QuUE9TVFsncHJvamVjdG5hbWUnXSwgcmVsZWFzZSA9IHJlbGVhc2UpCisgICAgICAgICAgICAgICAgcHJqLnVzZXJfaWQgPSByZXF1ZXN0LnVzZXIucGsKKyAgICAgICAgICAgICAgICBwcmouc2F2ZSgpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlZGlyZWN0KHJldmVyc2UocHJvamVjdCwgYXJncz0ocHJqLnBrLCkpICsgIj9ub3RpZnk9bmV3LXByb2plY3QiKQorCisgICAgICAgICAgICBleGNlcHQgKEludGVncml0eUVycm9yLCBCYWRQYXJhbWV0ZXJFeGNlcHRpb24pIGFzIGU6CisgICAgICAgICAgICAgICAgIyBmaWxsIGluIHBhZ2Ugd2l0aCBwcmV2aW91c2x5IHN1Ym1pdHRlZCB2YWx1ZXMKKyAgICAgICAgICAgICAgICBtYXAobGFtYmRhIHg6IGNvbnRleHQuX19zZXRpdGVtX18oeCwgcmVxdWVzdC5QT1NULmdldCh4LCAiLS0gbWlzc2luZyIpKSwgbWFuZGF0b3J5X2ZpZWxkcykKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGUsIEludGVncml0eUVycm9yKSBhbmQgInVzZXJuYW1lIiBpbiBzdHIoZSk6CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRbJ2FsZXJ0J10gPSAiWW91ciBjaG9zZW4gdXNlcm5hbWUgaXMgYWxyZWFkeSB1c2VkIgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRbJ2FsZXJ0J10gPSBzdHIoZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyKHJlcXVlc3QsIHRlbXBsYXRlLCBjb250ZXh0KQorCisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiSW52YWxpZCBIVFRQIG1ldGhvZCBmb3IgdGhpcyBwYWdlIikKKworCisKKyAgICAjIFNob3dzIHRoZSBlZGl0IHByb2plY3QgcGFnZQorICAgIEBfdGVtcGxhdGVfcmVuZGVyZXIoJ3Byb2plY3QuaHRtbCcpCisgICAgZGVmIHByb2plY3QocmVxdWVzdCwgcGlkKToKKyAgICAgICAgcHJqID0gUHJvamVjdC5vYmplY3RzLmdldChpZCA9IHBpZCkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBwdXNlciA9IFVzZXIub2JqZWN0cy5nZXQoaWQgPSBwcmoudXNlcl9pZCkKKyAgICAgICAgZXhjZXB0IFVzZXIuRG9lc05vdEV4aXN0OgorICAgICAgICAgICAgcHVzZXIgPSBOb25lCisKKyAgICAgICAgIyBleGVjdXRlIFBPU1QgcmVxdWVzdHMKKyAgICAgICAgaWYgcmVxdWVzdC5tZXRob2QgPT0gIlBPU1QiOgorICAgICAgICAgICAgIyBhZGQgbGF5ZXJzCisgICAgICAgICAgICBpZiAnbGF5ZXJBZGQnIGluIHJlcXVlc3QuUE9TVCBhbmQgbGVuKHJlcXVlc3QuUE9TVFsnbGF5ZXJBZGQnXSkgPiAwOgorICAgICAgICAgICAgICAgIGZvciBsYyBpbiBMYXllcl9WZXJzaW9uLm9iamVjdHMuZmlsdGVyKHBrX19pbj1baSBmb3IgaSBpbiByZXF1ZXN0LlBPU1RbJ2xheWVyQWRkJ10uc3BsaXQoIiwiKSBpZiBsZW4oaSkgPiAwXSk6CisgICAgICAgICAgICAgICAgICAgIFByb2plY3RMYXllci5vYmplY3RzLmdldF9vcl9jcmVhdGUocHJvamVjdCA9IHByaiwgbGF5ZXJjb21taXQgPSBsYykKKworICAgICAgICAgICAgIyByZW1vdmUgbGF5ZXJzCisgICAgICAgICAgICBpZiAnbGF5ZXJEZWwnIGluIHJlcXVlc3QuUE9TVCBhbmQgbGVuKHJlcXVlc3QuUE9TVFsnbGF5ZXJEZWwnXSkgPiAwOgorICAgICAgICAgICAgICAgIGZvciB0IGluIHJlcXVlc3QuUE9TVFsnbGF5ZXJEZWwnXS5zdHJpcCgpLnNwbGl0KCIgIik6CisgICAgICAgICAgICAgICAgICAgIHB0ID0gUHJvamVjdExheWVyLm9iamVjdHMuZmlsdGVyKHByb2plY3QgPSBwcmosIGxheWVyY29tbWl0X2lkID0gaW50KHQpKS5kZWxldGUoKQorCisgICAgICAgICAgICBpZiAncHJvamVjdE5hbWUnIGluIHJlcXVlc3QuUE9TVDoKKyAgICAgICAgICAgICAgICBwcmoubmFtZSA9IHJlcXVlc3QuUE9TVFsncHJvamVjdE5hbWUnXQorICAgICAgICAgICAgICAgIHByai5zYXZlKCk7CisKKyAgICAgICAgICAgIGlmICdwcm9qZWN0VmVyc2lvbicgaW4gcmVxdWVzdC5QT1NUOgorICAgICAgICAgICAgICAgICMgSWYgdGhlIHJlbGVhc2UgaXMgdGhlIGN1cnJlbnQgcHJvamVjdCB0aGVuIHJldHVybiBub3cKKyAgICAgICAgICAgICAgICBpZiBwcmoucmVsZWFzZS5wayA9PSBpbnQocmVxdWVzdC5QT1NULmdldCgncHJvamVjdFZlcnNpb24nLC0xKSk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB7fQorCisgICAgICAgICAgICAgICAgcHJqLnJlbGVhc2UgPSBSZWxlYXNlLm9iamVjdHMuZ2V0KHBrID0gcmVxdWVzdC5QT1NUWydwcm9qZWN0VmVyc2lvbiddKQorICAgICAgICAgICAgICAgICMgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIGJpdGJha2UgdmVyc2lvbgorICAgICAgICAgICAgICAgIHByai5iaXRiYWtlX3ZlcnNpb24gPSBwcmoucmVsZWFzZS5iaXRiYWtlX3ZlcnNpb24KKyAgICAgICAgICAgICAgICBwcmouc2F2ZSgpCisgICAgICAgICAgICAgICAgIyB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgbGF5ZXJzCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcHJqLnByb2plY3RsYXllcl9zZXQuYWxsKCk6CisgICAgICAgICAgICAgICAgICAgICMgZmluZCBhbmQgYWRkIGEgc2ltaWxhcmx5LW5hbWVkIGxheWVyIG9uIHRoZSBuZXcgYnJhbmNoCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGx2ID0gcHJqLmNvbXBhdGlibGVfbGF5ZXJ2ZXJzaW9ucyhsYXllcl9uYW1lID0gaS5sYXllcmNvbW1pdC5sYXllci5uYW1lKVswXQorICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdExheWVyLm9iamVjdHMuZ2V0X29yX2NyZWF0ZShwcm9qZWN0ID0gcHJqLCBsYXllcmNvbW1pdCA9IGx2KQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgZ2V0IHJpZCBvZiB0aGUgb2xkIGVudHJ5CisgICAgICAgICAgICAgICAgICAgICAgICBpLmRlbGV0ZSgpCisKKyAgICAgICAgICAgIGlmICdtYWNoaW5lTmFtZScgaW4gcmVxdWVzdC5QT1NUOgorICAgICAgICAgICAgICAgIG1hY2hpbmV2YXIgPSBwcmoucHJvamVjdHZhcmlhYmxlX3NldC5nZXQobmFtZT0iTUFDSElORSIpCisgICAgICAgICAgICAgICAgbWFjaGluZXZhci52YWx1ZT1yZXF1ZXN0LlBPU1RbJ21hY2hpbmVOYW1lJ10KKyAgICAgICAgICAgICAgICBtYWNoaW5ldmFyLnNhdmUoKQorCisKKyAgICAgICAgIyB3ZSB1c2UgaW1wbGljaXQga25vd2xlZGdlIG9mIHRoZSBjdXJyZW50IHVzZXIncyBwcm9qZWN0IHRvIGZpbHRlciBsYXllciBpbmZvcm1hdGlvbiwgZS5nLgorICAgICAgICBwaWQgPSBwcmouaWQKKworICAgICAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBDb3VudGVyCisgICAgICAgIGZyZXF0YXJnZXRzID0gW10KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnJlcXRhcmdldHMgKz0gbWFwKGxhbWJkYSB4OiB4LnRhcmdldCwgcmVkdWNlKGxhbWJkYSB4LCB5OiB4ICsgeSwgICBtYXAobGFtYmRhIHg6IGxpc3QoeC50YXJnZXRfc2V0LmFsbCgpKSwgQnVpbGQub2JqZWN0cy5maWx0ZXIocHJvamVjdCA9IHByaiwgb3V0Y29tZV9fbHQgPSBCdWlsZC5JTl9QUk9HUkVTUykpKSkKKyAgICAgICAgICAgIGZyZXF0YXJnZXRzICs9IG1hcChsYW1iZGEgeDogeC50YXJnZXQsIHJlZHVjZShsYW1iZGEgeCwgeTogeCArIHksICAgbWFwKGxhbWJkYSB4OiBsaXN0KHguYnJ0YXJnZXRfc2V0LmFsbCgpKSwgQnVpbGRSZXF1ZXN0Lm9iamVjdHMuZmlsdGVyKHByb2plY3QgPSBwcmosIHN0YXRlID0gQnVpbGRSZXF1ZXN0LlJFUV9GQUlMRUQpKSkpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGZyZXF0YXJnZXRzID0gQ291bnRlcihmcmVxdGFyZ2V0cykKKyAgICAgICAgZnJlcXRhcmdldHMgPSBzb3J0ZWQoZnJlcXRhcmdldHMsIGtleSA9IGxhbWJkYSB4OiBmcmVxdGFyZ2V0c1t4XSwgcmV2ZXJzZT1UcnVlKQorCisgICAgICAgIGNvbnRleHQgPSB7CisgICAgICAgICAgICAicHJvamVjdCIgOiBwcmosCisgICAgICAgICAgICAibHZzX25vcyIgOiBMYXllcl9WZXJzaW9uLm9iamVjdHMuYWxsKCkuY291bnQoKSwKKyAgICAgICAgICAgICJjb21wbGV0ZWRidWlsZHMiOiBCdWlsZC5vYmplY3RzLmZpbHRlcihwcm9qZWN0X2lkID0gcGlkKS5maWx0ZXIob3V0Y29tZV9fbHRlID0gQnVpbGQuSU5fUFJPR1JFU1MpLAorICAgICAgICAgICAgInByaiIgOiB7Im5hbWUiOiBwcmoubmFtZSwgfSwKKyAgICAgICAgICAgICJidWlsZHJlcXVlc3RzIiA6IHByai5idWlsZF9zZXQuZmlsdGVyKG91dGNvbWU9QnVpbGQuSU5fUFJPR1JFU1MpLAorICAgICAgICAgICAgImJ1aWxkcyIgOiBfcHJvamVjdF9yZWNlbnRfYnVpbGRfbGlzdChwcmopLAorICAgICAgICAgICAgImxheWVycyIgOiAgbWFwKGxhbWJkYSB4OiB7CisgICAgICAgICAgICAgICAgICAgICAgICAiaWQiOiB4LmxheWVyY29tbWl0LnBrLAorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyaWQiOiB4LnBrLAorICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiIDogeC5sYXllcmNvbW1pdC5sYXllci5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgInZjc191cmwiOiB4LmxheWVyY29tbWl0LmxheWVyLnZjc191cmwsCisgICAgICAgICAgICAgICAgICAgICAgICAidmNzX3JlZmVyZW5jZSIgOiB4LmxheWVyY29tbWl0LmdldF92Y3NfcmVmZXJlbmNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAidXJsIjogeC5sYXllcmNvbW1pdC5sYXllci5sYXllcl9pbmRleF91cmwsCisgICAgICAgICAgICAgICAgICAgICAgICAibGF5ZXJkZXRhaWx1cmwiOiB4LmxheWVyY29tbWl0LmdldF9kZXRhaWxzcGFnZV91cmwocHJqLnBrKSwKKyAgICAgICAgICAgICAgICAjIFRoaXMgYnJhbmNoIG5hbWUgaXMgYWN0dWFsbHkgdGhlIHJlbGVhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICJicmFuY2giIDogeyAibmFtZSIgOiB4LmxheWVyY29tbWl0LmdldF92Y3NfcmVmZXJlbmNlKCksICJsYXllcnNvdXJjZSIgOiB4LmxheWVyY29tbWl0LnVwX2JyYW5jaC5sYXllcl9zb3VyY2UubmFtZSBpZiB4LmxheWVyY29tbWl0LnVwX2JyYW5jaCAhPSBOb25lIGVsc2UgTm9uZX19LAorICAgICAgICAgICAgICAgICAgICBwcmoucHJvamVjdGxheWVyX3NldC5hbGwoKS5vcmRlcl9ieSgiaWQiKSksCisgICAgICAgICAgICAidGFyZ2V0cyIgOiBtYXAobGFtYmRhIHg6IHsidGFyZ2V0IiA6IHgudGFyZ2V0LCAidGFzayIgOiB4LnRhc2ssICJwayI6IHgucGt9LCBwcmoucHJvamVjdHRhcmdldF9zZXQuYWxsKCkpLAorICAgICAgICAgICAgInZhcmlhYmxlcyI6IG1hcChsYW1iZGEgeDogKHgubmFtZSwgeC52YWx1ZSksIHByai5wcm9qZWN0dmFyaWFibGVfc2V0LmFsbCgpKSwKKyAgICAgICAgICAgICJmcmVxdGFyZ2V0cyI6IGZyZXF0YXJnZXRzWzo1XSwKKyAgICAgICAgICAgICJyZWxlYXNlcyI6IG1hcChsYW1iZGEgeDogeyJpZCI6IHgucGssICJuYW1lIjogeC5uYW1lLCAiZGVzY3JpcHRpb24iOnguZGVzY3JpcHRpb259LCBSZWxlYXNlLm9iamVjdHMuYWxsKCkpLAorICAgICAgICAgICAgInByb2plY3RfaHRtbCI6IDEsCisgICAgICAgICAgICAicmVjaXBlc1R5cGVBaGVhZFVybCI6IHJldmVyc2UoJ3hocl9yZWNpcGVzdHlwZWFoZWFkJywgYXJncz0ocHJqLnBrLCkpLAorICAgICAgICAgICAgInByb2plY3RCdWlsZHNVcmwiOiByZXZlcnNlKCdwcm9qZWN0YnVpbGRzJywgYXJncz0ocHJqLnBrLCkpLAorICAgICAgICB9CisKKyAgICAgICAgaWYgcHJqLnJlbGVhc2UgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBjb250ZXh0WydyZWxlYXNlJ10gPSB7ICJpZCI6IHByai5yZWxlYXNlLnBrLCAibmFtZSI6IHByai5yZWxlYXNlLm5hbWUsICJkZXNjcmlwdGlvbiI6IHByai5yZWxlYXNlLmRlc2NyaXB0aW9ufQorCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29udGV4dFsibWFjaGluZSJdID0geyJuYW1lIjogcHJqLnByb2plY3R2YXJpYWJsZV9zZXQuZ2V0KG5hbWU9Ik1BQ0hJTkUiKS52YWx1ZX0KKyAgICAgICAgZXhjZXB0IFByb2plY3RWYXJpYWJsZS5Eb2VzTm90RXhpc3Q6CisgICAgICAgICAgICBjb250ZXh0WyJtYWNoaW5lIl0gPSBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbnRleHRbImRpc3RybyJdID0gcHJqLnByb2plY3R2YXJpYWJsZV9zZXQuZ2V0KG5hbWU9IkRJU1RSTyIpLnZhbHVlCisgICAgICAgIGV4Y2VwdCBQcm9qZWN0VmFyaWFibGUuRG9lc05vdEV4aXN0OgorICAgICAgICAgICAgY29udGV4dFsiZGlzdHJvIl0gPSAiLS0gbm90IHNldCB5ZXQiCisKKyAgICAgICAgcmV0dXJuIGNvbnRleHQKKworICAgIGRlZiBqc3VuaXR0ZXN0cyhyZXF1ZXN0KToKKyAgICAgICIiIiBQcm92aWRlcyBhIHBhZ2UgZm9yIHRoZSBqcyB1bml0IHRlc3RzICIiIgorICAgICAgYmJ2ID0gQml0YmFrZVZlcnNpb24ub2JqZWN0cy5maWx0ZXIoYnJhbmNoPSJtYXN0ZXIiKS5maXJzdCgpCisgICAgICByZWxlYXNlID0gUmVsZWFzZS5vYmplY3RzLmZpbHRlcihiaXRiYWtlX3ZlcnNpb249YmJ2KS5maXJzdCgpCisKKyAgICAgIG5hbWUgPSAiX2pzX3VuaXRfdGVzdF9wcmpfIgorCisgICAgICAjIElmIHRoZXJlIGlzIGFuIGV4aXN0aW5nIHByb2plY3QgYnkgdGhpcyBuYW1lIGRlbGV0ZSBpdC4gV2UgZG9uJ3Qgd2FudAorICAgICAgIyBMb3RzIG9mIGR1cGxpY2F0ZXMgY2x1dHRlcmluZyB1cCB0aGUgcHJvamVjdHMuCisgICAgICBQcm9qZWN0Lm9iamVjdHMuZmlsdGVyKG5hbWU9bmFtZSkuZGVsZXRlKCkKKworICAgICAgbmV3X3Byb2plY3QgPSBQcm9qZWN0Lm9iamVjdHMuY3JlYXRlX3Byb2plY3QobmFtZT1uYW1lLCByZWxlYXNlPXJlbGVhc2UpCisKKyAgICAgIGNvbnRleHQgPSB7ICdwcm9qZWN0JyA6IG5ld19wcm9qZWN0IH0KKyAgICAgIHJldHVybiByZW5kZXIocmVxdWVzdCwgImpzLXVuaXQtdGVzdHMuaHRtbCIsIGNvbnRleHQpCisKKyAgICBmcm9tIGRqYW5nby52aWV3cy5kZWNvcmF0b3JzLmNzcmYgaW1wb3J0IGNzcmZfZXhlbXB0CisgICAgQGNzcmZfZXhlbXB0CisgICAgZGVmIHhocl90ZXN0cmVsZWFzZWNoYW5nZShyZXF1ZXN0LCBwaWQpOgorICAgICAgICBkZWYgcmVzcG9uc2UoZGF0YSk6CisgICAgICAgICAgICByZXR1cm4gSHR0cFJlc3BvbnNlKGpzb25maWx0ZXIoZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZT0iYXBwbGljYXRpb24vanNvbiIpCisKKyAgICAgICAgIiIiIHJldHVybnMgbGF5ZXIgdmVyc2lvbnMgdGhhdCB3b3VsZCBiZSBkZWxldGVkIG9uIHRoZSBuZXcKKyAgICAgICAgcmVsZWFzZV9fcGsgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHByaiA9IFByb2plY3Qub2JqZWN0cy5nZXQocGsgPSBwaWQpCisgICAgICAgICAgICBuZXdfcmVsZWFzZV9pZCA9IHJlcXVlc3QuR0VUWyduZXdfcmVsZWFzZV9pZCddCisKKyAgICAgICAgICAgICMgSWYgd2UncmUgYWxyZWFkeSBvbiB0aGlzIHByb2plY3QgZG8gbm90aGluZworICAgICAgICAgICAgaWYgcHJqLnJlbGVhc2UucGsgPT0gaW50KG5ld19yZWxlYXNlX2lkKToKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVwb25zZSh7ImVycm9yIjogIm9rIiwgInJvd3MiOiBbXX0pCisKKyAgICAgICAgICAgIHJldHZhbCA9IFtdCisKKyAgICAgICAgICAgIGZvciBpIGluIHByai5wcm9qZWN0bGF5ZXJfc2V0LmFsbCgpOgorICAgICAgICAgICAgICAgIGx2ID0gcHJqLmNvbXBhdGlibGVfbGF5ZXJ2ZXJzaW9ucyhyZWxlYXNlID0gUmVsZWFzZS5vYmplY3RzLmdldChwaz1uZXdfcmVsZWFzZV9pZCkpLmZpbHRlcihsYXllcl9fbmFtZSA9IGkubGF5ZXJjb21taXQubGF5ZXIubmFtZSkKKyAgICAgICAgICAgICAgICAjIHRoZXJlIGlzIG5vIGxheWVyX3ZlcnNpb24gd2l0aCB0aGUgbmV3IHJlbGVhc2UgaWQsCisgICAgICAgICAgICAgICAgIyBhbmQgdGhlIHNhbWUgbmFtZQorICAgICAgICAgICAgICAgIGlmIGx2LmNvdW50KCkgPCAxOgorICAgICAgICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKGkpCisKKyAgICAgICAgICAgIHJldHVybiByZXNwb25zZSh7ImVycm9yIjoib2siLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicm93cyIgOiBtYXAoIF9sdl90b19kaWN0KHByaiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAobGFtYmRhIHg6IHgubGF5ZXJjb21taXQsIHJldHZhbCApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlKHsiZXJyb3IiOiBzdHIoZSkgfSkKKworICAgIGRlZiB4aHJfY29uZmlndmFyZWRpdChyZXF1ZXN0LCBwaWQpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBwcmogPSBQcm9qZWN0Lm9iamVjdHMuZ2V0KGlkID0gcGlkKQorICAgICAgICAgICAgIyBhZGQgY29uZiB2YXJpYWJsZXMKKyAgICAgICAgICAgIGlmICdjb25maWd2YXJBZGQnIGluIHJlcXVlc3QuUE9TVDoKKyAgICAgICAgICAgICAgICB0PXJlcXVlc3QuUE9TVFsnY29uZmlndmFyQWRkJ10uc3RyaXAoKQorICAgICAgICAgICAgICAgIGlmICI6IiBpbiB0OgorICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSwgdmFsdWUgPSB0LnNwbGl0KCI6IikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSA9IHQKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAiIgorCisgICAgICAgICAgICAgICAgcHQsIGNyZWF0ZWQgPSBQcm9qZWN0VmFyaWFibGUub2JqZWN0cy5nZXRfb3JfY3JlYXRlKHByb2plY3QgPSBwcmosIG5hbWUgPSB2YXJpYWJsZSwgdmFsdWUgPSB2YWx1ZSkKKyAgICAgICAgICAgICMgY2hhbmdlIGNvbmYgdmFyaWFibGVzCisgICAgICAgICAgICBpZiAnY29uZmlndmFyQ2hhbmdlJyBpbiByZXF1ZXN0LlBPU1Q6CisgICAgICAgICAgICAgICAgdD1yZXF1ZXN0LlBPU1RbJ2NvbmZpZ3ZhckNoYW5nZSddLnN0cmlwKCkKKyAgICAgICAgICAgICAgICBpZiAiOiIgaW4gdDoKKyAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUsIHZhbHVlID0gdC5zcGxpdCgiOiIpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgPSB0CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gIiIKKworICAgICAgICAgICAgICAgIHB0LCBjcmVhdGVkID0gUHJvamVjdFZhcmlhYmxlLm9iamVjdHMuZ2V0X29yX2NyZWF0ZShwcm9qZWN0ID0gcHJqLCBuYW1lID0gdmFyaWFibGUpCisgICAgICAgICAgICAgICAgcHQudmFsdWU9dmFsdWUKKyAgICAgICAgICAgICAgICBwdC5zYXZlKCkKKyAgICAgICAgICAgICMgcmVtb3ZlIGNvbmYgdmFyaWFibGVzCisgICAgICAgICAgICBpZiAnY29uZmlndmFyRGVsJyBpbiByZXF1ZXN0LlBPU1Q6CisgICAgICAgICAgICAgICAgdD1yZXF1ZXN0LlBPU1RbJ2NvbmZpZ3ZhckRlbCddLnN0cmlwKCkKKyAgICAgICAgICAgICAgICBwdCA9IFByb2plY3RWYXJpYWJsZS5vYmplY3RzLmdldChwayA9IGludCh0KSkuZGVsZXRlKCkKKworICAgICAgICAgICAgIyByZXR1cm4gYWxsIHByb2plY3Qgc2V0dGluZ3MsIGZpbHRlciBvdXQgYmxhY2tsaXN0IGFuZCBlbHNld2hlcmUtbWFuYWdlZCB2YXJpYWJsZXMKKyAgICAgICAgICAgIHZhcnNfbWFuYWdlZCx2YXJzX2ZzdHlwZXMsdmFyc19ibGFja2xpc3QgPSBnZXRfcHJvamVjdF9jb25maWd2YXJzX2NvbnRleHQoKQorICAgICAgICAgICAgY29uZmlndmFyc19xdWVyeSA9IFByb2plY3RWYXJpYWJsZS5vYmplY3RzLmZpbHRlcihwcm9qZWN0X2lkID0gcGlkKS5hbGwoKQorICAgICAgICAgICAgZm9yIHZhciBpbiB2YXJzX21hbmFnZWQ6CisgICAgICAgICAgICAgICAgY29uZmlndmFyc19xdWVyeSA9IGNvbmZpZ3ZhcnNfcXVlcnkuZXhjbHVkZShuYW1lID0gdmFyKQorICAgICAgICAgICAgZm9yIHZhciBpbiB2YXJzX2JsYWNrbGlzdDoKKyAgICAgICAgICAgICAgICBjb25maWd2YXJzX3F1ZXJ5ID0gY29uZmlndmFyc19xdWVyeS5leGNsdWRlKG5hbWUgPSB2YXIpCisKKyAgICAgICAgICAgIHJldHVybl9kYXRhID0geworICAgICAgICAgICAgICAgICJlcnJvciI6ICJvayIsCisgICAgICAgICAgICAgICAgJ2NvbmZpZ3ZhcnMnICAgOiBtYXAobGFtYmRhIHg6ICh4Lm5hbWUsIHgudmFsdWUsIHgucGspLCBjb25maWd2YXJzX3F1ZXJ5KSwKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm5fZGF0YVsnZGlzdHJvJ10gPSBQcm9qZWN0VmFyaWFibGUub2JqZWN0cy5nZXQocHJvamVjdCA9IHByaiwgbmFtZSA9ICJESVNUUk8iKS52YWx1ZSwKKyAgICAgICAgICAgIGV4Y2VwdCBQcm9qZWN0VmFyaWFibGUuRG9lc05vdEV4aXN0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm5fZGF0YVsnZnN0eXBlcyddID0gUHJvamVjdFZhcmlhYmxlLm9iamVjdHMuZ2V0KHByb2plY3QgPSBwcmosIG5hbWUgPSAiSU1BR0VfRlNUWVBFUyIpLnZhbHVlLAorICAgICAgICAgICAgZXhjZXB0IFByb2plY3RWYXJpYWJsZS5Eb2VzTm90RXhpc3Q6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJldHVybl9kYXRhWydpbWFnZV9pbnN0YWxsX2FwcGVuZCddID0gUHJvamVjdFZhcmlhYmxlLm9iamVjdHMuZ2V0KHByb2plY3QgPSBwcmosIG5hbWUgPSAiSU1BR0VfSU5TVEFMTF9hcHBlbmQiKS52YWx1ZSwKKyAgICAgICAgICAgIGV4Y2VwdCBQcm9qZWN0VmFyaWFibGUuRG9lc05vdEV4aXN0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm5fZGF0YVsncGFja2FnZV9jbGFzc2VzJ10gPSBQcm9qZWN0VmFyaWFibGUub2JqZWN0cy5nZXQocHJvamVjdCA9IHByaiwgbmFtZSA9ICJQQUNLQUdFX0NMQVNTRVMiKS52YWx1ZSwKKyAgICAgICAgICAgIGV4Y2VwdCBQcm9qZWN0VmFyaWFibGUuRG9lc05vdEV4aXN0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm5fZGF0YVsnc2RrX21hY2hpbmUnXSA9IFByb2plY3RWYXJpYWJsZS5vYmplY3RzLmdldChwcm9qZWN0ID0gcHJqLCBuYW1lID0gIlNES01BQ0hJTkUiKS52YWx1ZSwKKyAgICAgICAgICAgIGV4Y2VwdCBQcm9qZWN0VmFyaWFibGUuRG9lc05vdEV4aXN0OgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgcmV0dXJuIEh0dHBSZXNwb25zZShqc29uLmR1bXBzKCByZXR1cm5fZGF0YSApLCBjb250ZW50X3R5cGUgPSAiYXBwbGljYXRpb24vanNvbiIpCisKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgcmV0dXJuIEh0dHBSZXNwb25zZShqc29uLmR1bXBzKHsiZXJyb3IiOnN0cihlKSArICJcbiIgKyB0cmFjZWJhY2suZm9ybWF0X2V4YygpfSksIGNvbnRlbnRfdHlwZSA9ICJhcHBsaWNhdGlvbi9qc29uIikKKworCisgICAgZGVmIHhocl9pbXBvcnRsYXllcihyZXF1ZXN0KToKKyAgICAgICAgaWYgKG5vdCByZXF1ZXN0LlBPU1QuaGFzX2tleSgndmNzX3VybCcpIG9yCisgICAgICAgICAgICBub3QgcmVxdWVzdC5QT1NULmhhc19rZXkoJ25hbWUnKSBvcgorICAgICAgICAgICAgbm90IHJlcXVlc3QuUE9TVC5oYXNfa2V5KCdnaXRfcmVmJykgb3IKKyAgICAgICAgICAgIG5vdCByZXF1ZXN0LlBPU1QuaGFzX2tleSgncHJvamVjdF9pZCcpKToKKyAgICAgICAgICByZXR1cm4gSHR0cFJlc3BvbnNlKGpzb25maWx0ZXIoeyJlcnJvciI6ICJNaXNzaW5nIHBhcmFtZXRlcnM7IHJlcXVpcmVzIHZjc191cmwsIG5hbWUsIGdpdF9yZWYgYW5kIHByb2plY3RfaWQifSksIGNvbnRlbnRfdHlwZSA9ICJhcHBsaWNhdGlvbi9qc29uIikKKworICAgICAgICBsYXllcnNfYWRkZWQgPSBbXTsKKworICAgICAgICAjIFJ1ZGltZW50YXJ5IGNoZWNrIGZvciBhbnkgcG9zc2libGUgaHRtbCB0YWdzCisgICAgICAgIGlmICI8IiBpbiByZXF1ZXN0LlBPU1Q6CisgICAgICAgICAgcmV0dXJuIEh0dHBSZXNwb25zZShqc29uZmlsdGVyKHsiZXJyb3IiOiAiSW52YWxpZCBjaGFyYWN0ZXIgPCJ9KSwgY29udGVudF90eXBlID0gImFwcGxpY2F0aW9uL2pzb24iKQorCisgICAgICAgIHByaiA9IFByb2plY3Qub2JqZWN0cy5nZXQocGs9cmVxdWVzdC5QT1NUWydwcm9qZWN0X2lkJ10pCisKKyAgICAgICAgIyBTdHJpcCB0cmFpbGluZy9sZWFkaW5nIHdoaXRlc3BhY2UgZnJvbSBhbGwgdmFsdWVzCisgICAgICAgICMgcHV0IGludG8gYSBuZXcgZGljdCBiZWNhdXNlIFBPU1Qgb25lIGlzIGltbXV0YWJsZQorICAgICAgICBwb3N0X2RhdGEgPSBkaWN0KCkKKyAgICAgICAgZm9yIGtleSx2YWwgaW4gcmVxdWVzdC5QT1NULml0ZXJpdGVtcygpOgorICAgICAgICAgIHBvc3RfZGF0YVtrZXldID0gdmFsLnN0cmlwKCkKKworCisgICAgICAgICMgV2UgbmVlZCB0byBrbm93IHdoYXQgcmVsZWFzZSB0aGUgY3VycmVudCBwcm9qZWN0IGlzIHNvIHRoYXQgd2UKKyAgICAgICAgIyBjYW4gc2V0IHRoZSBpbXBvcnRlZCBsYXllcidzIHVwX2JyYW5jaF9pZAorICAgICAgICBwcmpfYnJhbmNoX25hbWUgPSBSZWxlYXNlLm9iamVjdHMuZ2V0KHBrPXByai5yZWxlYXNlX2lkKS5icmFuY2hfbmFtZQorICAgICAgICB1cF9icmFuY2gsIGJyYW5jaF9jcmVhdGVkID0gQnJhbmNoLm9iamVjdHMuZ2V0X29yX2NyZWF0ZShuYW1lPXByal9icmFuY2hfbmFtZSwgbGF5ZXJfc291cmNlX2lkPUxheWVyU291cmNlLlRZUEVfSU1QT1JURUQpCisKKyAgICAgICAgbGF5ZXJfc291cmNlID0gTGF5ZXJTb3VyY2Uub2JqZWN0cy5nZXQoc291cmNldHlwZT1MYXllclNvdXJjZS5UWVBFX0lNUE9SVEVEKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBsYXllciwgbGF5ZXJfY3JlYXRlZCA9IExheWVyLm9iamVjdHMuZ2V0X29yX2NyZWF0ZShuYW1lPXBvc3RfZGF0YVsnbmFtZSddKQorICAgICAgICBleGNlcHQgTXVsdGlwbGVPYmplY3RzUmV0dXJuZWQ6CisgICAgICAgICAgICByZXR1cm4gSHR0cFJlc3BvbnNlKGpzb25maWx0ZXIoeyJlcnJvciI6ICJoaW50LWxheWVyLWV4aXN0cyJ9KSwgY29udGVudF90eXBlID0gImFwcGxpY2F0aW9uL2pzb24iKQorCisgICAgICAgIGlmIGxheWVyOgorICAgICAgICAgICAgaWYgbGF5ZXJfY3JlYXRlZDoKKyAgICAgICAgICAgICAgICBsYXllci5sYXllcl9zb3VyY2UgPSBsYXllcl9zb3VyY2UKKyAgICAgICAgICAgICAgICBsYXllci52Y3NfdXJsID0gcG9zdF9kYXRhWyd2Y3NfdXJsJ10KKyAgICAgICAgICAgICAgICBsYXllci51cF9kYXRlID0gdGltZXpvbmUubm93KCkKKyAgICAgICAgICAgICAgICBsYXllci5zYXZlKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBXZSBoYXZlIGFuIGV4aXN0aW5nIGxheWVyIGJ5IHRoaXMgbmFtZSwgbGV0J3Mgc2VlIGlmIHRoZSBnaXQKKyAgICAgICAgICAgICAgICAjIHVybCBpcyB0aGUgc2FtZSwgaWYgaXQgaXMgdGhlbiB3ZSBjYW4ganVzdCBjcmVhdGUgYSBuZXcgbGF5ZXIKKyAgICAgICAgICAgICAgICAjIHZlcnNpb24gZm9yIHRoaXMgbGF5ZXIuIE90aGVyd2lzZSB3ZSBuZWVkIHRvIGJhaWwgb3V0LgorICAgICAgICAgICAgICAgIGlmIGxheWVyLnZjc191cmwgIT0gcG9zdF9kYXRhWyd2Y3NfdXJsJ106CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBIdHRwUmVzcG9uc2UoanNvbmZpbHRlcih7ImVycm9yIjogImhpbnQtbGF5ZXItZXhpc3RzLXdpdGgtZGlmZmVyZW50LXVybCIgLCAiY3VycmVudF91cmwiIDogbGF5ZXIudmNzX3VybCwgImN1cnJlbnRfaWQiOiBsYXllci5pZCB9KSwgY29udGVudF90eXBlID0gImFwcGxpY2F0aW9uL2pzb24iKQorCisKKyAgICAgICAgICAgIGxheWVyX3ZlcnNpb24sIHZlcnNpb25fY3JlYXRlZCA9IExheWVyX1ZlcnNpb24ub2JqZWN0cy5nZXRfb3JfY3JlYXRlKGxheWVyX3NvdXJjZT1sYXllcl9zb3VyY2UsIGxheWVyPWxheWVyLCBwcm9qZWN0PXByaiwgdXBfYnJhbmNoX2lkPXVwX2JyYW5jaC5pZCxicmFuY2g9cG9zdF9kYXRhWydnaXRfcmVmJ10sICBjb21taXQ9cG9zdF9kYXRhWydnaXRfcmVmJ10sIGRpcnBhdGg9cG9zdF9kYXRhWydkaXJfcGF0aCddKQorCisgICAgICAgICAgICBpZiBsYXllcl92ZXJzaW9uOgorICAgICAgICAgICAgICAgIGlmIG5vdCB2ZXJzaW9uX2NyZWF0ZWQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBIdHRwUmVzcG9uc2UoanNvbmZpbHRlcih7ImVycm9yIjogImhpbnQtbGF5ZXItdmVyc2lvbi1leGlzdHMiLCAiZXhpc3RpbmdfbGF5ZXJfdmVyc2lvbiI6IGxheWVyX3ZlcnNpb24uaWQgfSksIGNvbnRlbnRfdHlwZSA9ICJhcHBsaWNhdGlvbi9qc29uIikKKworICAgICAgICAgICAgICAgIGxheWVyX3ZlcnNpb24udXBfZGF0ZSA9IHRpbWV6b25lLm5vdygpCisgICAgICAgICAgICAgICAgbGF5ZXJfdmVyc2lvbi5zYXZlKCkKKworICAgICAgICAgICAgICAgICMgQWRkIHRoZSBkZXBlbmRlbmNpZXMgc3BlY2lmaWVkIGZvciB0aGlzIG5ldyBsYXllcgorICAgICAgICAgICAgICAgIGlmIChwb3N0X2RhdGEuaGFzX2tleSgibGF5ZXJfZGVwcyIpIGFuZAorICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uX2NyZWF0ZWQgYW5kCisgICAgICAgICAgICAgICAgICAgIGxlbihwb3N0X2RhdGFbImxheWVyX2RlcHMiXSkgPiAwKToKKyAgICAgICAgICAgICAgICAgICAgZm9yIGxheWVyX2RlcF9pZCBpbiBwb3N0X2RhdGFbImxheWVyX2RlcHMiXS5zcGxpdCgiLCIpOgorCisgICAgICAgICAgICAgICAgICAgICAgICBsYXllcl9kZXBfb2JqID0gTGF5ZXJfVmVyc2lvbi5vYmplY3RzLmdldChwaz1sYXllcl9kZXBfaWQpCisgICAgICAgICAgICAgICAgICAgICAgICBMYXllclZlcnNpb25EZXBlbmRlbmN5Lm9iamVjdHMuZ2V0X29yX2NyZWF0ZShsYXllcl92ZXJzaW9uPWxheWVyX3ZlcnNpb24sIGRlcGVuZHNfb249bGF5ZXJfZGVwX29iaikKKyAgICAgICAgICAgICAgICAgICAgICAgICMgTm93IGFkZCB0aGVtIHRvIHRoZSBwcm9qZWN0LCB3ZSBjb3VsZCBnZXQgYW4gZXhlY3B0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAjIGlmIHRoZSBwcm9qZWN0IG5vdyBjb250YWlucyB0aGUgZXhhY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICMgZGVwZW5kZW5jeSBhbHJlYWR5IChsaWtlIG1vZGlmaWVkIG9uIGFub3RoZXIgcGFnZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmpfbGF5ZXIsIHByal9sYXllcl9jcmVhdGVkID0gUHJvamVjdExheWVyLm9iamVjdHMuZ2V0X29yX2NyZWF0ZShsYXllcmNvbW1pdD1sYXllcl9kZXBfb2JqLCBwcm9qZWN0PXByaikKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBJbnRlZ3JpdHlFcnJvciBhcyBlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCJJbnRlZ3JpdHkgZXJyb3Igd2hpbGUgc2F2aW5nIFByb2plY3QgTGF5ZXJzOiAlcyAob3JpZ2luYWwgJXMpIiAlIChlLCBlLl9fY2F1c2VfXykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgcHJqX2xheWVyX2NyZWF0ZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJkZXBkZXRhaWx1cmwgPSByZXZlcnNlKCdsYXllcmRldGFpbHMnLCBhcmdzPShwcmouaWQsIGxheWVyX2RlcF9vYmoucGspKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyc19hZGRlZC5hcHBlbmQoeydpZCc6IGxheWVyX2RlcF9vYmouaWQsICduYW1lJzogTGF5ZXIub2JqZWN0cy5nZXQoaWQ9bGF5ZXJfZGVwX29iai5sYXllcl9pZCkubmFtZSwgJ2xheWVyZGV0YWlsdXJsJzogbGF5ZXJkZXBkZXRhaWx1cmwgfSkKKworCisgICAgICAgICAgICAgICAgIyBJZiBhbiBvbGQgbGF5ZXIgdmVyc2lvbiBleGlzdHMgaW4gb3VyIHByb2plY3QgdGhlbiByZW1vdmUgaXQKKyAgICAgICAgICAgICAgICBmb3IgcHJqX2xheWVycyBpbiBQcm9qZWN0TGF5ZXIub2JqZWN0cy5maWx0ZXIocHJvamVjdD1wcmopOgorICAgICAgICAgICAgICAgICAgICBkdXBfbGF5ZXJfdiA9IExheWVyX1ZlcnNpb24ub2JqZWN0cy5maWx0ZXIoaWQ9cHJqX2xheWVycy5sYXllcmNvbW1pdF9pZCwgbGF5ZXJfaWQ9bGF5ZXIuaWQpCisgICAgICAgICAgICAgICAgICAgIGlmIGxlbihkdXBfbGF5ZXJfdikgPjAgOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJqX2xheWVycy5kZWxldGUoKQorCisgICAgICAgICAgICAgICAgIyBmaW5hbGx5IGFkZCB0aGUgaW1wb3J0ZWQgbGF5ZXIgKHZlcnNpb24gaWQpIHRvIHRoZSBwcm9qZWN0CisgICAgICAgICAgICAgICAgUHJvamVjdExheWVyLm9iamVjdHMuY3JlYXRlKGxheWVyY29tbWl0PWxheWVyX3ZlcnNpb24sIHByb2plY3Q9cHJqLG9wdGlvbmFsPTEpCisKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBXZSBkaWRuJ3QgY3JlYXRlIGEgbGF5ZXIgdmVyc2lvbiBzbyBiYWNrIG91dCBub3cgYW5kIGNsZWFuIHVwLgorICAgICAgICAgICAgICAgIGlmIGxheWVyX2NyZWF0ZWQ6CisgICAgICAgICAgICAgICAgICAgIGxheWVyLmRlbGV0ZSgpCisKKyAgICAgICAgICAgICAgICByZXR1cm4gSHR0cFJlc3BvbnNlKGpzb25maWx0ZXIoeyJlcnJvciI6ICJVbmNhdWdodCBlcnJvcjogQ291bGQgbm90IGNyZWF0ZSBsYXllciB2ZXJzaW9uIn0pLCBjb250ZW50X3R5cGUgPSAiYXBwbGljYXRpb24vanNvbiIpCisKKyAgICAgICAgbGF5ZXJkZXRhaWx1cmwgPSByZXZlcnNlKCdsYXllcmRldGFpbHMnLCBhcmdzPShwcmouaWQsIGxheWVyX3ZlcnNpb24ucGspKQorCisgICAgICAgIGpzb25fcmVzcG9uc2UgPSB7ImVycm9yIjogIm9rIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaW1wb3J0ZWRfbGF5ZXIiIDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiIDogbGF5ZXIubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZCI6IGxheWVyX3ZlcnNpb24uaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibGF5ZXJkZXRhaWx1cmwiOiBsYXllcmRldGFpbHVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICJkZXBzX2FkZGVkIjogbGF5ZXJzX2FkZGVkIH0KKworICAgICAgICByZXR1cm4gSHR0cFJlc3BvbnNlKGpzb25maWx0ZXIoanNvbl9yZXNwb25zZSksIGNvbnRlbnRfdHlwZSA9ICJhcHBsaWNhdGlvbi9qc29uIikKKworICAgIGRlZiB4aHJfdXBkYXRlbGF5ZXIocmVxdWVzdCk6CisKKyAgICAgICAgZGVmIGVycm9yX3Jlc3BvbnNlKGVycm9yKToKKyAgICAgICAgICAgIHJldHVybiBIdHRwUmVzcG9uc2UoanNvbmZpbHRlcih7ImVycm9yIjogZXJyb3J9KSwgY29udGVudF90eXBlID0gImFwcGxpY2F0aW9uL2pzb24iKQorCisgICAgICAgIGlmIG5vdCByZXF1ZXN0LlBPU1QuaGFzX2tleSgibGF5ZXJfdmVyc2lvbl9pZCIpOgorICAgICAgICAgICAgcmV0dXJuIGVycm9yX3Jlc3BvbnNlKCJQbGVhc2Ugc3BlY2lmeSBhIGxheWVyIHZlcnNpb24gaWQiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBsYXllcl92ZXJzaW9uX2lkID0gcmVxdWVzdC5QT1NUWyJsYXllcl92ZXJzaW9uX2lkIl0KKyAgICAgICAgICAgIGxheWVyX3ZlcnNpb24gPSBMYXllcl9WZXJzaW9uLm9iamVjdHMuZ2V0KGlkPWxheWVyX3ZlcnNpb25faWQpCisgICAgICAgIGV4Y2VwdCBMYXllcl9WZXJzaW9uLkRvZXNOb3RFeGlzdDoKKyAgICAgICAgICAgIHJldHVybiBlcnJvcl9yZXNwb25zZSgiQ2Fubm90IGZpbmQgbGF5ZXIgdG8gdXBkYXRlIikKKworCisgICAgICAgIGlmIHJlcXVlc3QuUE9TVC5oYXNfa2V5KCJ2Y3NfdXJsIik6CisgICAgICAgICAgICBsYXllcl92ZXJzaW9uLmxheWVyLnZjc191cmwgPSByZXF1ZXN0LlBPU1RbInZjc191cmwiXQorICAgICAgICBpZiByZXF1ZXN0LlBPU1QuaGFzX2tleSgiZGlycGF0aCIpOgorICAgICAgICAgICAgbGF5ZXJfdmVyc2lvbi5kaXJwYXRoID0gcmVxdWVzdC5QT1NUWyJkaXJwYXRoIl0KKyAgICAgICAgaWYgcmVxdWVzdC5QT1NULmhhc19rZXkoImNvbW1pdCIpOgorICAgICAgICAgICAgbGF5ZXJfdmVyc2lvbi5jb21taXQgPSByZXF1ZXN0LlBPU1RbImNvbW1pdCJdCisgICAgICAgIGlmIHJlcXVlc3QuUE9TVC5oYXNfa2V5KCJ1cF9icmFuY2giKToKKyAgICAgICAgICAgIGxheWVyX3ZlcnNpb24udXBfYnJhbmNoX2lkID0gaW50KHJlcXVlc3QuUE9TVFsidXBfYnJhbmNoIl0pCisKKyAgICAgICAgaWYgcmVxdWVzdC5QT1NULmhhc19rZXkoImFkZF9kZXAiKToKKyAgICAgICAgICAgIGx2ZCA9IExheWVyVmVyc2lvbkRlcGVuZGVuY3kobGF5ZXJfdmVyc2lvbj1sYXllcl92ZXJzaW9uLCBkZXBlbmRzX29uX2lkPXJlcXVlc3QuUE9TVFsiYWRkX2RlcCJdKQorICAgICAgICAgICAgbHZkLnNhdmUoKQorCisgICAgICAgIGlmIHJlcXVlc3QuUE9TVC5oYXNfa2V5KCJybV9kZXAiKToKKyAgICAgICAgICAgIHJtX2RlcCA9IExheWVyVmVyc2lvbkRlcGVuZGVuY3kub2JqZWN0cy5nZXQobGF5ZXJfdmVyc2lvbj1sYXllcl92ZXJzaW9uLCBkZXBlbmRzX29uX2lkPXJlcXVlc3QuUE9TVFsicm1fZGVwIl0pCisgICAgICAgICAgICBybV9kZXAuZGVsZXRlKCkKKworICAgICAgICBpZiByZXF1ZXN0LlBPU1QuaGFzX2tleSgic3VtbWFyeSIpOgorICAgICAgICAgICAgbGF5ZXJfdmVyc2lvbi5sYXllci5zdW1tYXJ5ID0gcmVxdWVzdC5QT1NUWyJzdW1tYXJ5Il0KKyAgICAgICAgaWYgcmVxdWVzdC5QT1NULmhhc19rZXkoImRlc2NyaXB0aW9uIik6CisgICAgICAgICAgICBsYXllcl92ZXJzaW9uLmxheWVyLmRlc2NyaXB0aW9uID0gcmVxdWVzdC5QT1NUWyJkZXNjcmlwdGlvbiJdCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbGF5ZXJfdmVyc2lvbi5sYXllci5zYXZlKCkKKyAgICAgICAgICAgIGxheWVyX3ZlcnNpb24uc2F2ZSgpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgIHJldHVybiBlcnJvcl9yZXNwb25zZSgiQ291bGQgbm90IHVwZGF0ZSBsYXllciB2ZXJzaW9uIGVudHJ5OiAlcyIgJSBlKQorCisgICAgICAgIHJldHVybiBIdHRwUmVzcG9uc2UoanNvbmZpbHRlcih7ImVycm9yIjogIm9rIix9KSwgY29udGVudF90eXBlID0gImFwcGxpY2F0aW9uL2pzb24iKQorCisKKworICAgIGRlZiBpbXBvcnRsYXllcihyZXF1ZXN0LCBwaWQpOgorICAgICAgICB0ZW1wbGF0ZSA9ICJpbXBvcnRsYXllci5odG1sIgorICAgICAgICBjb250ZXh0ID0geworICAgICAgICAgICAgJ3Byb2plY3QnOiBQcm9qZWN0Lm9iamVjdHMuZ2V0KGlkPXBpZCksCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlbmRlcihyZXF1ZXN0LCB0ZW1wbGF0ZSwgY29udGV4dCkKKworICAgIEBfdGVtcGxhdGVfcmVuZGVyZXIoJ2xheWVyZGV0YWlscy5odG1sJykKKyAgICBkZWYgbGF5ZXJkZXRhaWxzKHJlcXVlc3QsIHBpZCwgbGF5ZXJpZCk6CisgICAgICAgIHByb2plY3QgPSBQcm9qZWN0Lm9iamVjdHMuZ2V0KHBrPXBpZCkKKyAgICAgICAgbGF5ZXJfdmVyc2lvbiA9IExheWVyX1ZlcnNpb24ub2JqZWN0cy5nZXQocGs9bGF5ZXJpZCkKKworICAgICAgICBjb250ZXh0ID0geyAncHJvamVjdCcgOiBwcm9qZWN0LAorICAgICAgICAgICAgICAgICAgICdsYXllcnZlcnNpb24nIDogbGF5ZXJfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAnbGF5ZXJkZXBzJyA6IHsgImxpc3QiOiBbCisgICAgICAgICAgICAgICAgICAgICBbeyJpZCI6IHkuaWQsICJuYW1lIjogeS5sYXllci5uYW1lfSBmb3IgeSBpbiB4LmRlcGVuZHNfb24uZ2V0X2VxdWl2YWxlbnRzX3dwcmlvcml0eShwcm9qZWN0KV1bMF0gZm9yIHggaW4gbGF5ZXJfdmVyc2lvbi5kZXBlbmRlbmNpZXMuYWxsKCldfSwKKyAgICAgICAgICAgICAgICAgICAncHJvamVjdGxheWVycyc6IG1hcChsYW1iZGEgcHJqbGF5ZXI6IHByamxheWVyLmxheWVyY29tbWl0LmlkLCBQcm9qZWN0TGF5ZXIub2JqZWN0cy5maWx0ZXIocHJvamVjdD1wcm9qZWN0KSkKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY29udGV4dAorCisKKyAgICBkZWYgZ2V0X3Byb2plY3RfY29uZmlndmFyc19jb250ZXh0KCk6CisgICAgICAgICMgVmFycyBtYW5hZ2VkIG91dHNpZGUgb2YgdGhpcyB2aWV3CisgICAgICAgIHZhcnNfbWFuYWdlZCA9IHsKKyAgICAgICAgICAgICdNQUNISU5FJywgJ0JCTEFZRVJTJworICAgICAgICB9CisKKyAgICAgICAgdmFyc19ibGFja2xpc3QgID0geworICAgICAgICAgICAgJ0RMX0RSJywnUEFSQUxMRUxfTUFLRScsJ0JCX05VTUJFUl9USFJFQURTJywnU1NUQVRFX0RJUicsCisgICAgICAgICAgICAnQkJfRElTS01PTl9ESVJTJywnQkJfTlVNQkVSX1RIUkVBRFMnLCdDVlNfUFJPWFlfSE9TVCcsJ0NWU19QUk9YWV9QT1JUJywKKyAgICAgICAgICAgICdETF9ESVInLCdQQVJBTExFTF9NQUtFJywnU1NUQVRFX0RJUicsJ1NTVEFURV9ESVInLCdTU1RBVEVfTUlSUk9SUycsJ1RNUERJUicsCisgICAgICAgICAgICAnYWxsX3Byb3h5JywnZnRwX3Byb3h5JywnaHR0cF9wcm94eSAnLCdodHRwc19wcm94eScKKyAgICAgICAgICAgIH0KKworICAgICAgICB2YXJzX2ZzdHlwZXMgID0geworICAgICAgICAgICAgJ2J0cmZzJywnY3BpbycsJ2NwaW8uZ3onLCdjcGlvLmx6NCcsJ2NwaW8ubHptYScsJ2NwaW8ueHonLCdjcmFtZnMnLAorICAgICAgICAgICAgJ2VsZicsJ2V4dDInLCdleHQyLmJ6MicsJ2V4dDIuZ3onLCdleHQyLmx6bWEnLCAnZXh0NCcsICdleHQ0Lmd6JywgJ2V4dDMnLCdleHQzLmd6JywnaGRkaW1nJywKKyAgICAgICAgICAgICdpc28nLCdqZmZzMicsJ2pmZnMyLnN1bScsJ3NxdWFzaGZzJywnc3F1YXNoZnMtbHpvJywnc3F1YXNoZnMteHonLCd0YXIuYnoyJywKKyAgICAgICAgICAgICd0YXIubHo0JywndGFyLnh6JywndGFydGFyLmd6JywndWJpJywndWJpZnMnLCd2bWRrJworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuKHZhcnNfbWFuYWdlZCxzb3J0ZWQodmFyc19mc3R5cGVzKSx2YXJzX2JsYWNrbGlzdCkKKworICAgIEBfdGVtcGxhdGVfcmVuZGVyZXIoInByb2plY3Rjb25mLmh0bWwiKQorICAgIGRlZiBwcm9qZWN0Y29uZihyZXF1ZXN0LCBwaWQpOgorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHByaiA9IFByb2plY3Qub2JqZWN0cy5nZXQoaWQgPSBwaWQpCisgICAgICAgIGV4Y2VwdCBQcm9qZWN0LkRvZXNOb3RFeGlzdDoKKyAgICAgICAgICAgIHJldHVybiBIdHRwUmVzcG9uc2VOb3RGb3VuZCgiPGgxPlByb2plY3QgaWQgIiArIHBpZCArICIgaXMgdW5hdmFpbGFibGU8L2gxPiIpCisKKyAgICAgICAgIyByZW1vdmUgYmxhY2tsaXN0IGFuZCBleHRlcm5hbGx5IG1hbmFnZWQgdmFyYWlibGVzIGZyb20gdGhpcyBsaXN0CisgICAgICAgIHZhcnNfbWFuYWdlZCx2YXJzX2ZzdHlwZXMsdmFyc19ibGFja2xpc3QgPSBnZXRfcHJvamVjdF9jb25maWd2YXJzX2NvbnRleHQoKQorICAgICAgICBjb25maWd2YXJzID0gUHJvamVjdFZhcmlhYmxlLm9iamVjdHMuZmlsdGVyKHByb2plY3RfaWQgPSBwaWQpLmFsbCgpCisgICAgICAgIGZvciB2YXIgaW4gdmFyc19tYW5hZ2VkOgorICAgICAgICAgICAgY29uZmlndmFycyA9IGNvbmZpZ3ZhcnMuZXhjbHVkZShuYW1lID0gdmFyKQorICAgICAgICBmb3IgdmFyIGluIHZhcnNfYmxhY2tsaXN0OgorICAgICAgICAgICAgY29uZmlndmFycyA9IGNvbmZpZ3ZhcnMuZXhjbHVkZShuYW1lID0gdmFyKQorCisgICAgICAgIGNvbnRleHQgPSB7CisgICAgICAgICAgICAncHJvamVjdCc6ICAgICAgICAgIHByaiwKKyAgICAgICAgICAgICdjb25maWd2YXJzJzogICAgICAgY29uZmlndmFycywKKyAgICAgICAgICAgICd2YXJzX21hbmFnZWQnOiAgICAgdmFyc19tYW5hZ2VkLAorICAgICAgICAgICAgJ3ZhcnNfZnN0eXBlcyc6ICAgICB2YXJzX2ZzdHlwZXMsCisgICAgICAgICAgICAndmFyc19ibGFja2xpc3QnOiAgIHZhcnNfYmxhY2tsaXN0LAorICAgICAgICB9CisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29udGV4dFsnZGlzdHJvJ10gPSAgUHJvamVjdFZhcmlhYmxlLm9iamVjdHMuZ2V0KHByb2plY3QgPSBwcmosIG5hbWUgPSAiRElTVFJPIikudmFsdWUKKyAgICAgICAgICAgIGNvbnRleHRbJ2Rpc3Ryb19kZWZpbmVkJ10gPSAiMSIKKyAgICAgICAgZXhjZXB0IFByb2plY3RWYXJpYWJsZS5Eb2VzTm90RXhpc3Q6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbnRleHRbJ2ZzdHlwZXMnXSA9ICBQcm9qZWN0VmFyaWFibGUub2JqZWN0cy5nZXQocHJvamVjdCA9IHByaiwgbmFtZSA9ICJJTUFHRV9GU1RZUEVTIikudmFsdWUKKyAgICAgICAgICAgIGNvbnRleHRbJ2ZzdHlwZXNfZGVmaW5lZCddID0gIjEiCisgICAgICAgIGV4Y2VwdCBQcm9qZWN0VmFyaWFibGUuRG9lc05vdEV4aXN0OgorICAgICAgICAgICAgcGFzcworICAgICAgICB0cnk6CisgICAgICAgICAgICBjb250ZXh0WydpbWFnZV9pbnN0YWxsX2FwcGVuZCddID0gIFByb2plY3RWYXJpYWJsZS5vYmplY3RzLmdldChwcm9qZWN0ID0gcHJqLCBuYW1lID0gIklNQUdFX0lOU1RBTExfYXBwZW5kIikudmFsdWUKKyAgICAgICAgICAgIGNvbnRleHRbJ2ltYWdlX2luc3RhbGxfYXBwZW5kX2RlZmluZWQnXSA9ICIxIgorICAgICAgICBleGNlcHQgUHJvamVjdFZhcmlhYmxlLkRvZXNOb3RFeGlzdDoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29udGV4dFsncGFja2FnZV9jbGFzc2VzJ10gPSAgUHJvamVjdFZhcmlhYmxlLm9iamVjdHMuZ2V0KHByb2plY3QgPSBwcmosIG5hbWUgPSAiUEFDS0FHRV9DTEFTU0VTIikudmFsdWUKKyAgICAgICAgICAgIGNvbnRleHRbJ3BhY2thZ2VfY2xhc3Nlc19kZWZpbmVkJ10gPSAiMSIKKyAgICAgICAgZXhjZXB0IFByb2plY3RWYXJpYWJsZS5Eb2VzTm90RXhpc3Q6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbnRleHRbJ3Nka19tYWNoaW5lJ10gPSAgUHJvamVjdFZhcmlhYmxlLm9iamVjdHMuZ2V0KHByb2plY3QgPSBwcmosIG5hbWUgPSAiU0RLTUFDSElORSIpLnZhbHVlCisgICAgICAgICAgICBjb250ZXh0WydzZGtfbWFjaGluZV9kZWZpbmVkJ10gPSAiMSIKKyAgICAgICAgZXhjZXB0IFByb2plY3RWYXJpYWJsZS5Eb2VzTm90RXhpc3Q6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgcmV0dXJuIGNvbnRleHQKKworICAgIEBfdGVtcGxhdGVfcmVuZGVyZXIoJ3Byb2plY3RidWlsZHMuaHRtbCcpCisgICAgZGVmIHByb2plY3RidWlsZHMocmVxdWVzdCwgcGlkKToKKyAgICAgICAgcHJqID0gUHJvamVjdC5vYmplY3RzLmdldChpZCA9IHBpZCkKKworICAgICAgICBpZiByZXF1ZXN0Lm1ldGhvZCA9PSAiUE9TVCI6CisgICAgICAgICAgICAjIHByb2Nlc3MgYW55IGJ1aWxkIHJlcXVlc3QKKworICAgICAgICAgICAgaWYgJ2J1aWxkQ2FuY2VsJyBpbiByZXF1ZXN0LlBPU1Q6CisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmVxdWVzdC5QT1NUWydidWlsZENhbmNlbCddLnN0cmlwKCkuc3BsaXQoIiAiKToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgYnIgPSBCdWlsZFJlcXVlc3Qub2JqZWN0cy5zZWxlY3RfZm9yX3VwZGF0ZSgpLmdldChwcm9qZWN0ID0gcHJqLCBwayA9IGksIHN0YXRlX19sdGUgPSBCdWlsZFJlcXVlc3QuUkVRX1FVRVVFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyLnN0YXRlID0gQnVpbGRSZXF1ZXN0LlJFUV9ERUxFVEVECisgICAgICAgICAgICAgICAgICAgICAgICBici5zYXZlKCkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEJ1aWxkUmVxdWVzdC5Eb2VzTm90RXhpc3Q6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIGlmICdidWlsZERlbGV0ZScgaW4gcmVxdWVzdC5QT1NUOgorICAgICAgICAgICAgICAgIGZvciBpIGluIHJlcXVlc3QuUE9TVFsnYnVpbGREZWxldGUnXS5zdHJpcCgpLnNwbGl0KCIgIik6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyID0gQnVpbGRSZXF1ZXN0Lm9iamVjdHMuc2VsZWN0X2Zvcl91cGRhdGUoKS5nZXQocHJvamVjdCA9IHByaiwgcGsgPSBpLCBzdGF0ZV9fbHRlID0gQnVpbGRSZXF1ZXN0LlJFUV9ERUxFVEVEKS5kZWxldGUoKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgQnVpbGRSZXF1ZXN0LkRvZXNOb3RFeGlzdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgaWYgJ3RhcmdldHMnIGluIHJlcXVlc3QuUE9TVDoKKyAgICAgICAgICAgICAgICBQcm9qZWN0VGFyZ2V0Lm9iamVjdHMuZmlsdGVyKHByb2plY3QgPSBwcmopLmRlbGV0ZSgpCisgICAgICAgICAgICAgICAgcyA9IHN0cihyZXF1ZXN0LlBPU1RbJ3RhcmdldHMnXSkKKyAgICAgICAgICAgICAgICBmb3IgdCBpbiBzLnRyYW5zbGF0ZShOb25lLCAiOyV8XCIiKS5zcGxpdCgiICIpOgorICAgICAgICAgICAgICAgICAgICBpZiAiOiIgaW4gdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCwgdGFzayA9IHQuc3BsaXQoIjoiKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gdAorICAgICAgICAgICAgICAgICAgICAgICAgdGFzayA9ICIiCisgICAgICAgICAgICAgICAgICAgIFByb2plY3RUYXJnZXQub2JqZWN0cy5jcmVhdGUocHJvamVjdCA9IHByaiwgdGFyZ2V0ID0gdGFyZ2V0LCB0YXNrID0gdGFzaykKKworICAgICAgICAgICAgICAgIGJyID0gcHJqLnNjaGVkdWxlX2J1aWxkKCkKKworCisgICAgICAgIHF1ZXJ5c2V0ID0gQnVpbGQub2JqZWN0cy5maWx0ZXIob3V0Y29tZV9fbHRlID0gQnVpbGQuSU5fUFJPR1JFU1MpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29udGV4dCwgcGFnZXNpemUsIG9yZGVyYnkgPSBfYnVpbGRfbGlzdF9oZWxwZXIocmVxdWVzdCwgcXVlcnlzZXQpCisgICAgICAgIGV4Y2VwdCBSZWRpcmVjdEV4Y2VwdGlvbiBhcyByZToKKyAgICAgICAgICAgICMgcmV3cml0ZSB0aGUgUmVkaXJlY3RFeGNlcHRpb24gd2l0aCBvdXIgY3VycmVudCB1cmwgaW5mb3JtYXRpb24KKyAgICAgICAgICAgIHJlLnZpZXcgPSByZXNvbHZlKHJlcXVlc3QucGF0aF9pbmZvKS51cmxfbmFtZQorICAgICAgICAgICAgcmUub2t3YXJncyA9IHsicGlkIiA6IHBpZH0KKyAgICAgICAgICAgIHJhaXNlIHJlCisKKyAgICAgICAgY29udGV4dFsncHJvamVjdCddID0gcHJqCisgICAgICAgIF9zZXRfcGFyYW1ldGVyc192YWx1ZXMocGFnZXNpemUsIG9yZGVyYnksIHJlcXVlc3QpCisKKyAgICAgICAgcmV0dXJuIGNvbnRleHQKKworCisgICAgZGVmIF9maWxlX25hbWVfZm9yX2FydGlmYWN0KGIsIGFydGlmYWN0X3R5cGUsIGFydGlmYWN0X2lkKToKKyAgICAgICAgZmlsZV9uYW1lID0gTm9uZQorICAgICAgICAjIFRhcmdldF9JbWFnZV9GaWxlIGZpbGVfbmFtZQorICAgICAgICBpZiBhcnRpZmFjdF90eXBlID09ICJpbWFnZWZpbGUiOgorICAgICAgICAgICAgZmlsZV9uYW1lID0gVGFyZ2V0X0ltYWdlX0ZpbGUub2JqZWN0cy5nZXQodGFyZ2V0X19idWlsZCA9IGIsIHBrID0gYXJ0aWZhY3RfaWQpLmZpbGVfbmFtZQorCisgICAgICAgIGVsaWYgYXJ0aWZhY3RfdHlwZSA9PSAiYnVpbGRhcnRpZmFjdCI6CisgICAgICAgICAgICBmaWxlX25hbWUgPSBCdWlsZEFydGlmYWN0Lm9iamVjdHMuZ2V0KGJ1aWxkID0gYiwgcGsgPSBhcnRpZmFjdF9pZCkuZmlsZV9uYW1lCisKKyAgICAgICAgZWxpZiBhcnRpZmFjdF90eXBlID09ICAibGljZW5zZW1hbmlmZXN0IjoKKyAgICAgICAgICAgIGZpbGVfbmFtZSA9IFRhcmdldC5vYmplY3RzLmdldChidWlsZCA9IGIsIHBrID0gYXJ0aWZhY3RfaWQpLmxpY2Vuc2VfbWFuaWZlc3RfcGF0aAorCisgICAgICAgIGVsaWYgYXJ0aWZhY3RfdHlwZSA9PSAidGFza2xvZ2ZpbGUiOgorICAgICAgICAgICAgZmlsZV9uYW1lID0gVGFzay5vYmplY3RzLmdldChidWlsZCA9IGIsIHBrID0gYXJ0aWZhY3RfaWQpLmxvZ2ZpbGUKKworICAgICAgICBlbGlmIGFydGlmYWN0X3R5cGUgPT0gImxvZ21lc3NhZ2VmaWxlIjoKKyAgICAgICAgICAgIGZpbGVfbmFtZSA9IExvZ01lc3NhZ2Uub2JqZWN0cy5nZXQoYnVpbGQgPSBiLCBwayA9IGFydGlmYWN0X2lkKS5wYXRobmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJGSVhNRTogYXJ0aWZhY3QgdHlwZSAlcyBub3QgaW1wbGVtZW50ZWQiICUgKGFydGlmYWN0X3R5cGUpKQorCisgICAgICAgIHJldHVybiBmaWxlX25hbWUKKworCisgICAgZGVmIGJ1aWxkX2FydGlmYWN0KHJlcXVlc3QsIGJ1aWxkX2lkLCBhcnRpZmFjdF90eXBlLCBhcnRpZmFjdF9pZCk6CisgICAgICAgIGlmIGFydGlmYWN0X3R5cGUgaW4gWyJjb29rZXJsb2ciXToKKyAgICAgICAgICAgICMgdGhlc2UgYXJ0aWZhY3RzIGFyZSBzYXZlZCBhZnRlciBidWlsZGluZywgc28gdGhleSBhcmUgb24gdGhlIHNlcnZlciBpdHNlbGYKKyAgICAgICAgICAgIGRlZiBfbWltZXR5cGVfZm9yX2FydGlmYWN0KHBhdGgpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgaW1wb3J0IG1hZ2ljCisKKyAgICAgICAgICAgICAgICAgICAgIyBmYWlyIHdhcm5pbmc6IHRoaXMgaXMgYSBtZXNzOyB0aGVyZSBhcmUgbXVsdGlwbGUgY29tcGV0aW5nIGFuZCBpbmNvbXBhdGlibGUKKyAgICAgICAgICAgICAgICAgICAgIyBtYWdpYyBtb2R1bGVzIGZsb2F0aW5nIGFyb3VuZCwgc28gd2UgdHJ5IHNvbWUgb2YgdGhlIG1vc3QgY29tbW9uIGNvbWJpbmF0aW9ucworCisgICAgICAgICAgICAgICAgICAgIHRyeTogICAgIyB3ZSB0cnkgdWJ1bnR1J3MgcHl0aG9uLW1hZ2ljIDUuNAorICAgICAgICAgICAgICAgICAgICAgICAgbSA9IG1hZ2ljLm9wZW4obWFnaWMuTUFHSUNfTUlNRV9UWVBFKQorICAgICAgICAgICAgICAgICAgICAgICAgbS5sb2FkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtLmZpbGUocGF0aCkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICAgICAgICAgIHRyeTogICAgIyB3ZSB0cnkgcHl0aG9uLW1hZ2ljIDAuNC42CisgICAgICAgICAgICAgICAgICAgICAgICBtID0gbWFnaWMuTWFnaWMobWFnaWMuTUFHSUNfTUlNRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtLmZyb21fZmlsZShwYXRoKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgICAgICAgICAgdHJ5OiAgICAjIHdlIHRyeSBwaXAgZmlsZW1hZ2ljIDEuNgorICAgICAgICAgICAgICAgICAgICAgICAgbSA9IG1hZ2ljLk1hZ2ljKGZsYWdzPW1hZ2ljLk1BR0lDX01JTUVfVFlQRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtLmlkX2ZpbGVuYW1lKHBhdGgpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gImJpbmFyeS9vY3RldC1zdHJlYW0iCisgICAgICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gImJpbmFyeS9vY3RldC1zdHJlYW0iCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgIyBtYXRjaCBjb2RlIHdpdGggcnVuYnVpbGRzLkNvbW1hbmQuYXJjaGl2ZSgpCisgICAgICAgICAgICAgICAgYnVpbGRfYXJ0aWZhY3Rfc3RvcmFnZV9kaXIgPSBvcy5wYXRoLmpvaW4oVG9hc3RlclNldHRpbmcub2JqZWN0cy5nZXQobmFtZT0iQVJUSUZBQ1RTX1NUT1JBR0VfRElSIikudmFsdWUsICIlZCIgJSBpbnQoYnVpbGRfaWQpKQorICAgICAgICAgICAgICAgIGZpbGVfbmFtZSA9IG9zLnBhdGguam9pbihidWlsZF9hcnRpZmFjdF9zdG9yYWdlX2RpciwgImNvb2tlcl9sb2cudHh0IikKKworICAgICAgICAgICAgICAgIGZzb2NrID0gb3BlbihmaWxlX25hbWUsICJyIikKKyAgICAgICAgICAgICAgICBjb250ZW50X3R5cGU9X21pbWV0eXBlX2Zvcl9hcnRpZmFjdChmaWxlX25hbWUpCisKKyAgICAgICAgICAgICAgICByZXNwb25zZSA9IEh0dHBSZXNwb25zZShmc29jaywgY29udGVudF90eXBlID0gY29udGVudF90eXBlKQorCisgICAgICAgICAgICAgICAgcmVzcG9uc2VbJ0NvbnRlbnQtRGlzcG9zaXRpb24nXSA9ICdhdHRhY2htZW50OyBmaWxlbmFtZT0nICsgb3MucGF0aC5iYXNlbmFtZShmaWxlX25hbWUpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICBjb250ZXh0ID0geworICAgICAgICAgICAgICAgICAgICAnYnVpbGQnIDogQnVpbGQub2JqZWN0cy5nZXQocGsgPSBidWlsZF9pZCksCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZW5kZXIocmVxdWVzdCwgInVuYXZhaWxhYmxlX2FydGlmYWN0Lmh0bWwiLCBjb250ZXh0KQorCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIHJldHJpZXZlIHRoZSBhcnRpZmFjdCBkaXJlY3RseSBmcm9tIHRoZSBidWlsZCBlbnZpcm9ubWVudAorICAgICAgICAgICAgcmV0dXJuIF9nZXRfYmVfYXJ0aWZhY3QocmVxdWVzdCwgYnVpbGRfaWQsIGFydGlmYWN0X3R5cGUsIGFydGlmYWN0X2lkKQorCisKKyAgICBkZWYgX2dldF9iZV9hcnRpZmFjdChyZXF1ZXN0LCBidWlsZF9pZCwgYXJ0aWZhY3RfdHlwZSwgYXJ0aWZhY3RfaWQpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBiID0gQnVpbGQub2JqZWN0cy5nZXQocGs9YnVpbGRfaWQpCisgICAgICAgICAgICBpZiBiLmJ1aWxkcmVxdWVzdCBpcyBOb25lIG9yIGIuYnVpbGRyZXF1ZXN0LmVudmlyb25tZW50IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJBcnRpZmFjdCBub3QgYXZhaWxhYmxlIGZvciBkb3dubG9hZCAobWlzc2luZyBidWlsZCByZXF1ZXN0IG9yIGJ1aWxkIGVudmlyb25tZW50KSIpCisKKyAgICAgICAgICAgIGZpbGVfbmFtZSA9IF9maWxlX25hbWVfZm9yX2FydGlmYWN0KGIsIGFydGlmYWN0X3R5cGUsIGFydGlmYWN0X2lkKQorICAgICAgICAgICAgZnNvY2sgPSBOb25lCisgICAgICAgICAgICBjb250ZW50X3R5cGU9J2FwcGxpY2F0aW9uL2ZvcmNlLWRvd25sb2FkJworCisgICAgICAgICAgICBpZiBmaWxlX25hbWUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIkNvdWxkIG5vdCBoYW5kbGUgYXJ0aWZhY3QgJXMgaWQgJXMiICUgKGFydGlmYWN0X3R5cGUsIGFydGlmYWN0X2lkKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY29udGVudF90eXBlID0gYi5idWlsZHJlcXVlc3QuZW52aXJvbm1lbnQuZ2V0X2FydGlmYWN0X3R5cGUoZmlsZV9uYW1lKQorICAgICAgICAgICAgICAgIGZzb2NrID0gYi5idWlsZHJlcXVlc3QuZW52aXJvbm1lbnQuZ2V0X2FydGlmYWN0KGZpbGVfbmFtZSkKKyAgICAgICAgICAgICAgICBmaWxlX25hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGZpbGVfbmFtZSkgIyB3ZSBhc3N1bWUgdGhhdCB0aGUgYnVpbGQgZW52aXJvbm1lbnQgc3lzdGVtIGhhcyB0aGUgc2FtZSBwYXRoIGNvbnZlbnRpb25zIGFzIGhvc3QKKworICAgICAgICAgICAgcmVzcG9uc2UgPSBIdHRwUmVzcG9uc2UoZnNvY2ssIGNvbnRlbnRfdHlwZSA9IGNvbnRlbnRfdHlwZSkKKworICAgICAgICAgICAgIyByZXR1cm5zIGEgZmlsZSBmcm9tIHRoZSBlbnZpcm9ubWVudAorICAgICAgICAgICAgcmVzcG9uc2VbJ0NvbnRlbnQtRGlzcG9zaXRpb24nXSA9ICdhdHRhY2htZW50OyBmaWxlbmFtZT0nICsgZmlsZV9uYW1lCisgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UKKyAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICBjb250ZXh0ID0geworICAgICAgICAgICAgICAgICdidWlsZCcgOiBCdWlsZC5vYmplY3RzLmdldChwayA9IGJ1aWxkX2lkKSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZW5kZXIocmVxdWVzdCwgInVuYXZhaWxhYmxlX2FydGlmYWN0Lmh0bWwiLCBjb250ZXh0KQorCisKKworCisgICAgQF90ZW1wbGF0ZV9yZW5kZXJlcigicHJvamVjdHMuaHRtbCIpCisgICAgZGVmIHByb2plY3RzKHJlcXVlc3QpOgorICAgICAgICAocGFnZXNpemUsIG9yZGVyYnkpID0gX2dldF9wYXJhbWV0ZXJzX3ZhbHVlcyhyZXF1ZXN0LCAxMCwgJ3VwZGF0ZWQ6LScpCisgICAgICAgIG1hbmRhdG9yeV9wYXJhbWV0ZXJzID0geyAnY291bnQnOiBwYWdlc2l6ZSwgICdwYWdlJyA6IDEsICdvcmRlcmJ5JyA6IG9yZGVyYnkgfQorICAgICAgICByZXR2YWwgPSBfdmVyaWZ5X3BhcmFtZXRlcnMoIHJlcXVlc3QuR0VULCBtYW5kYXRvcnlfcGFyYW1ldGVycyApCisgICAgICAgIGlmIHJldHZhbDoKKyAgICAgICAgICAgIHJhaXNlIFJlZGlyZWN0RXhjZXB0aW9uKCAnYWxsLXByb2plY3RzJywgcmVxdWVzdC5HRVQsIG1hbmRhdG9yeV9wYXJhbWV0ZXJzICkKKworICAgICAgICBxdWVyeXNldF9hbGwgPSBQcm9qZWN0Lm9iamVjdHMuYWxsKCkKKworICAgICAgICAjIGFubm90YXRlIGVhY2ggcHJvamVjdCB3aXRoIGl0cyBudW1iZXIgb2YgYnVpbGRzCisgICAgICAgIHF1ZXJ5c2V0X2FsbCA9IHF1ZXJ5c2V0X2FsbC5hbm5vdGF0ZShudW1fYnVpbGRzPUNvdW50KCdidWlsZCcpKQorCisgICAgICAgICMgZXhjbHVkZSB0aGUgY29tbWFuZCBsaW5lIGJ1aWxkcyBwcm9qZWN0IGlmIGl0IGhhcyBubyBidWlsZHMKKyAgICAgICAgcV9kZWZhdWx0X3dpdGhfYnVpbGRzID0gUShpc19kZWZhdWx0PVRydWUpICYgUShudW1fYnVpbGRzX19ndD0wKQorICAgICAgICBxdWVyeXNldF9hbGwgPSBxdWVyeXNldF9hbGwuZmlsdGVyKFEoaXNfZGVmYXVsdD1GYWxzZSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFfZGVmYXVsdF93aXRoX2J1aWxkcykKKworICAgICAgICAjIGJvaWxlcnBsYXRlIGNvZGUgdGhhdCB0YWtlcyBhIHJlcXVlc3QgZm9yIGFuIG9iamVjdCB0eXBlIGFuZCByZXR1cm5zIGEgcXVlcnlzZXQKKyAgICAgICAgIyBmb3IgdGhhdCBvYmplY3QgdHlwZS4gY29weXBhc3RhIGZvciBhbGwgbmVlZGVkIHRhYmxlIHNlYXJjaGVzCisgICAgICAgIChmaWx0ZXJfc3RyaW5nLCBzZWFyY2hfdGVybSwgb3JkZXJpbmdfc3RyaW5nKSA9IF9zZWFyY2hfdHVwbGUocmVxdWVzdCwgUHJvamVjdCkKKyAgICAgICAgcXVlcnlzZXRfd2l0aF9zZWFyY2ggPSBfZ2V0X3F1ZXJ5c2V0KFByb2plY3QsIHF1ZXJ5c2V0X2FsbCwgTm9uZSwgc2VhcmNoX3Rlcm0sIG9yZGVyaW5nX3N0cmluZywgJy11cGRhdGVkJykKKyAgICAgICAgcXVlcnlzZXQgPSBfZ2V0X3F1ZXJ5c2V0KFByb2plY3QsIHF1ZXJ5c2V0X2FsbCwgZmlsdGVyX3N0cmluZywgc2VhcmNoX3Rlcm0sIG9yZGVyaW5nX3N0cmluZywgJy11cGRhdGVkJykKKworICAgICAgICAjIHJldHJpZXZlIHRoZSBvYmplY3RzIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIHRhYmxlOyBwcm9qZWN0cyBhIHBhZ2luYXRvciBhbmQgZ2V0cyBhIHBhZ2UgcmFuZ2UgdG8gZGlzcGxheQorICAgICAgICBwcm9qZWN0X2luZm8gPSBfYnVpbGRfcGFnZV9yYW5nZShQYWdpbmF0b3IocXVlcnlzZXQsIHBhZ2VzaXplKSwgcmVxdWVzdC5HRVQuZ2V0KCdwYWdlJywgMSkpCisKKyAgICAgICAgIyBhZGQgZmllbGRzIG5lZWRlZCBpbiBKU09OIGR1bXBzIGZvciBBUEkgY2FsbCBzdXBwb3J0CisgICAgICAgIGZvciBwIGluIHByb2plY3RfaW5mby5vYmplY3RfbGlzdDoKKyAgICAgICAgICAgIHAuaWQgPSBwLnBrCisgICAgICAgICAgICBwLnByb2plY3RQYWdlVXJsID0gcmV2ZXJzZSgncHJvamVjdCcsIGFyZ3M9KHAuaWQsKSkKKyAgICAgICAgICAgIHAubGF5ZXJzVHlwZUFoZWFkVXJsID0gcmV2ZXJzZSgneGhyX2xheWVyc3R5cGVhaGVhZCcsIGFyZ3M9KHAuaWQsKSkKKyAgICAgICAgICAgIHAucmVjaXBlc1R5cGVBaGVhZFVybCA9IHJldmVyc2UoJ3hocl9yZWNpcGVzdHlwZWFoZWFkJywgYXJncz0ocC5pZCwpKQorICAgICAgICAgICAgcC5wcm9qZWN0QnVpbGRzVXJsID0gcmV2ZXJzZSgncHJvamVjdGJ1aWxkcycsIGFyZ3M9KHAuaWQsKSkKKworICAgICAgICAjIGJ1aWxkIHZpZXctc3BlY2lmaWMgaW5mb3JtYXRpb247IHRoaXMgaXMgcmVuZGVyZWQgc3BlY2lmaWNhbGx5IGluIHRoZSBidWlsZHMgcGFnZSwgYXQgdGhlIHRvcCBvZiB0aGUgcGFnZSAoaS5lLiBSZWNlbnQgYnVpbGRzKQorICAgICAgICBidWlsZF9tcnUgPSBfZ2V0X2xhdGVzdF9idWlsZHMoKQorCisgICAgICAgICMgdHJhbnNsYXRlIHRoZSBwcm9qZWN0J3MgYnVpbGQgdGFyZ2V0IHN0cmluZ3MKKyAgICAgICAgZnN0eXBlc19tYXAgPSB7fTsKKyAgICAgICAgZm9yIHByb2plY3QgaW4gcHJvamVjdF9pbmZvOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRhcmdldHMgPSBUYXJnZXQub2JqZWN0cy5maWx0ZXIoIGJ1aWxkX2lkID0gcHJvamVjdC5nZXRfbGFzdF9idWlsZF9pZCgpICkKKyAgICAgICAgICAgICAgICBjb21tYSA9ICIiOworICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMgPSAiIjsKKyAgICAgICAgICAgICAgICBmb3IgdCBpbiB0YXJnZXRzOgorICAgICAgICAgICAgICAgICAgICBpZiAoIG5vdCB0LmlzX2ltYWdlICk6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICB0aWYgPSBUYXJnZXRfSW1hZ2VfRmlsZS5vYmplY3RzLmZpbHRlciggdGFyZ2V0X2lkID0gdC5pZCApCisgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHRpZjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHM9cmUuc3ViKCcuKnRhci5iejInLCAndGFyLmJ6MicsIGkuZmlsZV9uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgcyA9PSBpLmZpbGVfbmFtZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzPXJlLnN1YignLipcLicsICcnLCBpLmZpbGVfbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIE5vbmUgPT0gcmUuc2VhcmNoKHMsZXh0ZW5zaW9ucyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucyArPSBjb21tYSArIHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYSA9ICIsICIKKyAgICAgICAgICAgICAgICBmc3R5cGVzX21hcFtwcm9qZWN0LmlkXT1leHRlbnNpb25zCisgICAgICAgICAgICBleGNlcHQgKFRhcmdldC5Eb2VzTm90RXhpc3QsSW5kZXhFcnJvcik6CisgICAgICAgICAgICAgICAgZnN0eXBlc19tYXBbcHJvamVjdC5pZF09cHJvamVjdC5nZXRfbGFzdF9pbWdmaWxlcworCisgICAgICAgIGNvbnRleHQgPSB7CisgICAgICAgICAgICAgICAgJ21ydScgOiBidWlsZF9tcnUsCisKKyAgICAgICAgICAgICAgICAnb2JqZWN0cycgOiBwcm9qZWN0X2luZm8sCisgICAgICAgICAgICAgICAgJ29iamVjdG5hbWUnIDogInByb2plY3RzIiwKKyAgICAgICAgICAgICAgICAnZGVmYXVsdF9vcmRlcmJ5JyA6ICdpZDotJywKKyAgICAgICAgICAgICAgICAnc2VhcmNoX3Rlcm0nIDogc2VhcmNoX3Rlcm0sCisgICAgICAgICAgICAgICAgJ3RvdGFsX2NvdW50JyA6IHF1ZXJ5c2V0X3dpdGhfc2VhcmNoLmNvdW50KCksCisgICAgICAgICAgICAgICAgJ2ZzdHlwZXMnIDogZnN0eXBlc19tYXAsCisgICAgICAgICAgICAgICAgJ2J1aWxkX0ZBSUxFRCcgOiBCdWlsZC5GQUlMRUQsCisgICAgICAgICAgICAgICAgJ2J1aWxkX1NVQ0NFRURFRCcgOiBCdWlsZC5TVUNDRUVERUQsCisgICAgICAgICAgICAgICAgJ3RhYmxlY29scyc6IFsKKyAgICAgICAgICAgICAgICAgICAgeyduYW1lJzogJ1Byb2plY3QnLAorICAgICAgICAgICAgICAgICAgICAnb3JkZXJmaWVsZCc6IF9nZXRfdG9nZ2xlX29yZGVyKHJlcXVlc3QsICJuYW1lIiksCisgICAgICAgICAgICAgICAgICAgICdvcmRlcmljb24nOl9nZXRfdG9nZ2xlX29yZGVyX2ljb24ocmVxdWVzdCwgIm5hbWUiKSwKKyAgICAgICAgICAgICAgICAgICAgJ29yZGVya2V5JyA6ICduYW1lJywKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgeyduYW1lJzogJ0xhc3QgYWN0aXZpdHkgb24nLAorICAgICAgICAgICAgICAgICAgICAnY2xjbGFzcyc6ICd1cGRhdGVkJywKKyAgICAgICAgICAgICAgICAgICAgJ3FoZWxwJzogIlNob3dzIHRoZSBzdGFydGluZyBkYXRlIGFuZCB0aW1lIG9mIHRoZSBsYXN0IHByb2plY3QgYnVpbGQuIElmIHRoZSBwcm9qZWN0IGhhcyBubyBidWlsZHMsIGl0IHNob3dzIHRoZSBkYXRlIHRoZSBwcm9qZWN0IHdhcyBjcmVhdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgJ29yZGVyZmllbGQnOiBfZ2V0X3RvZ2dsZV9vcmRlcihyZXF1ZXN0LCAidXBkYXRlZCIsIFRydWUpLAorICAgICAgICAgICAgICAgICAgICAnb3JkZXJpY29uJzpfZ2V0X3RvZ2dsZV9vcmRlcl9pY29uKHJlcXVlc3QsICJ1cGRhdGVkIiksCisgICAgICAgICAgICAgICAgICAgICdvcmRlcmtleScgOiAndXBkYXRlZCcsCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIHsnbmFtZSc6ICdSZWxlYXNlJywKKyAgICAgICAgICAgICAgICAgICAgJ3FoZWxwJyA6ICJUaGUgdmVyc2lvbiBvZiB0aGUgYnVpbGQgc3lzdGVtIHVzZWQgYnkgdGhlIHByb2plY3QiLAorICAgICAgICAgICAgICAgICAgICAnb3JkZXJmaWVsZCc6IF9nZXRfdG9nZ2xlX29yZGVyKHJlcXVlc3QsICJyZWxlYXNlX19uYW1lIiksCisgICAgICAgICAgICAgICAgICAgICdvcmRlcmljb24nOl9nZXRfdG9nZ2xlX29yZGVyX2ljb24ocmVxdWVzdCwgInJlbGVhc2VfX25hbWUiKSwKKyAgICAgICAgICAgICAgICAgICAgJ29yZGVya2V5JyA6ICdyZWxlYXNlX19uYW1lJywKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgeyduYW1lJzogJ01hY2hpbmUnLAorICAgICAgICAgICAgICAgICAgICAncWhlbHAnOiAiVGhlIGhhcmR3YXJlIGN1cnJlbnRseSBzZWxlY3RlZCBmb3IgdGhlIHByb2plY3QiLAorICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICB7J25hbWUnOiAnTnVtYmVyIG9mIGJ1aWxkcycsCisgICAgICAgICAgICAgICAgICAgICdxaGVscCc6ICJIb3cgbWFueSBidWlsZHMgaGF2ZSBiZWVuIHJ1biBmb3IgdGhlIHByb2plY3QiLAorICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICB7J25hbWUnOiAnTGFzdCBidWlsZCBvdXRjb21lJywgJ2NsY2xhc3MnOiAnbG91dGNvbWUnLAorICAgICAgICAgICAgICAgICAgICAncWhlbHAnOiAiVGVsbHMgeW91IGlmIHRoZSBsYXN0IHByb2plY3QgYnVpbGQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBvciBmYWlsZWQiLAorICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICB7J25hbWUnOiAnUmVjaXBlJywgJ2NsY2xhc3MnOiAnbHRhcmdldCcsCisgICAgICAgICAgICAgICAgICAgICdxaGVscCc6ICJUaGUgbGFzdCByZWNpcGUgdGhhdCB3YXMgYnVpbHQgaW4gdGhpcyBwcm9qZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgeyduYW1lJzogJ0Vycm9ycycsICdjbGNsYXNzJzogJ2xlcnJvcnMnLAorICAgICAgICAgICAgICAgICAgICAncWhlbHAnOiAiSG93IG1hbnkgZXJyb3JzIHdlcmUgZW5jb3VudGVyZWQgZHVyaW5nIHRoZSBsYXN0IHByb2plY3QgYnVpbGQgKGlmIGFueSkiLAorICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICB7J25hbWUnOiAnV2FybmluZ3MnLCAnY2xjbGFzcyc6ICdsd2FybmluZ3MnLAorICAgICAgICAgICAgICAgICAgICAncWhlbHAnOiAiSG93IG1hbnkgd2FybmlnbnMgd2VyZSBlbmNvdW50ZXJlZCBkdXJpbmcgdGhlIGxhc3QgcHJvamVjdCBidWlsZCAoaWYgYW55KSIsCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIHsnbmFtZSc6ICdJbWFnZSBmaWxlcycsICdjbGNsYXNzJzogJ2xpbWFnZWZpbGVzJywgJ2hpZGRlbic6IDEsCisgICAgICAgICAgICAgICAgICAgICdxaGVscCc6ICJUaGUgcm9vdCBmaWxlIHN5c3RlbSB0eXBlcyBwcm9kdWNlZCBieSB0aGUgbGFzdCBwcm9qZWN0IGJ1aWxkIiwKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgfQorCisgICAgICAgIF9zZXRfcGFyYW1ldGVyc192YWx1ZXMocGFnZXNpemUsIG9yZGVyYnksIHJlcXVlc3QpCisgICAgICAgIHJldHVybiBjb250ZXh0CmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvd2lkZ2V0cy5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcmd1aS93aWRnZXRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMjkxNGQKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJndWkvd2lkZ2V0cy5weQpAQCAtMCwwICsxLDQxMSBAQAorIworIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyMKKyMgQml0QmFrZSBUb2FzdGVyIEltcGxlbWVudGF0aW9uCisjCisjIENvcHlyaWdodCAoQykgMjAxNSAgICAgICAgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2Zyb20gZGphbmdvLnZpZXdzLmdlbmVyaWMgaW1wb3J0IFZpZXcsIFRlbXBsYXRlVmlldworZnJvbSBkamFuZ28uc2hvcnRjdXRzIGltcG9ydCBIdHRwUmVzcG9uc2UKK2Zyb20gZGphbmdvLmh0dHAgaW1wb3J0IEh0dHBSZXNwb25zZUJhZFJlcXVlc3QKK2Zyb20gZGphbmdvLmNvcmUgaW1wb3J0IHNlcmlhbGl6ZXJzCitmcm9tIGRqYW5nby5jb3JlLmNhY2hlIGltcG9ydCBjYWNoZQorZnJvbSBkamFuZ28uY29yZS5wYWdpbmF0b3IgaW1wb3J0IFBhZ2luYXRvciwgRW1wdHlQYWdlCitmcm9tIGRqYW5nby5kYi5tb2RlbHMgaW1wb3J0IFEKK2Zyb20gb3JtLm1vZGVscyBpbXBvcnQgUHJvamVjdCwgUHJvamVjdExheWVyLCBMYXllcl9WZXJzaW9uCitmcm9tIGRqYW5nby50ZW1wbGF0ZSBpbXBvcnQgQ29udGV4dCwgVGVtcGxhdGUKK2Zyb20gZGphbmdvLmNvcmUuc2VyaWFsaXplcnMuanNvbiBpbXBvcnQgRGphbmdvSlNPTkVuY29kZXIKK2Zyb20gZGphbmdvLmNvcmUuZXhjZXB0aW9ucyBpbXBvcnQgRmllbGRFcnJvcgorZnJvbSBkamFuZ28uY29uZi51cmxzIGltcG9ydCB1cmwsIHBhdHRlcm5zCisKK2ltcG9ydCB0eXBlcworaW1wb3J0IGpzb24KK2ltcG9ydCBjb2xsZWN0aW9ucworaW1wb3J0IG9wZXJhdG9yCitpbXBvcnQgcmUKKworZnJvbSB0b2FzdGVyZ3VpLnZpZXdzIGltcG9ydCBvYmp0b2pzb24KKworY2xhc3MgVG9hc3RlclRhYmxlKFRlbXBsYXRlVmlldyk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHN1cGVyKFRvYXN0ZXJUYWJsZSwgc2VsZikuX19pbml0X18oKQorICAgICAgICBpZiAndGVtcGxhdGVfbmFtZScgaW4ga3dhcmdzOgorICAgICAgICAgICAgc2VsZi50ZW1wbGF0ZV9uYW1lID0ga3dhcmdzWyd0ZW1wbGF0ZV9uYW1lJ10KKyAgICAgICAgc2VsZi50aXRsZSA9IE5vbmUKKyAgICAgICAgc2VsZi5xdWVyeXNldCA9IE5vbmUKKyAgICAgICAgc2VsZi5jb2x1bW5zID0gW10KKyAgICAgICAgc2VsZi5maWx0ZXJzID0ge30KKyAgICAgICAgc2VsZi50b3RhbF9jb3VudCA9IDAKKyAgICAgICAgc2VsZi5zdGF0aWNfY29udGV4dF9leHRyYSA9IHt9CisgICAgICAgIHNlbGYuZmlsdGVyX2FjdGlvbnMgPSB7fQorICAgICAgICBzZWxmLmVtcHR5X3N0YXRlID0gIlNvcnJ5IC0gbm8gZGF0YSBmb3VuZCIKKyAgICAgICAgc2VsZi5kZWZhdWx0X29yZGVyYnkgPSAiIgorCisgICAgICAgICMgYWRkIHRoZSAiaWQiIGNvbHVtbiwgdW5kaXNwbGF5YWJsZSwgYnkgZGVmYXVsdAorICAgICAgICBzZWxmLmFkZF9jb2x1bW4odGl0bGU9IklkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlhYmxlPUZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJhYmxlPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9uYW1lPSJpZCIpCisKKworICAgIGRlZiBnZXQoc2VsZiwgcmVxdWVzdCwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgaWYgcmVxdWVzdC5HRVQuZ2V0KCdmb3JtYXQnLCBOb25lKSA9PSAnanNvbic6CisKKyAgICAgICAgICAgIHNlbGYuc2V0dXBfcXVlcnlzZXQoKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICAgICAgIyBQdXQgdGhlIHByb2plY3QgaWQgaW50byB0aGUgY29udGV4dCBmb3IgdGhlIHN0YXRpY19kYXRhX3RlbXBsYXRlCisgICAgICAgICAgICBpZiAncGlkJyBpbiBrd2FyZ3M6CisgICAgICAgICAgICAgICAgc2VsZi5zdGF0aWNfY29udGV4dF9leHRyYVsncGlkJ10gPSBrd2FyZ3NbJ3BpZCddCisKKyAgICAgICAgICAgIGNtZCA9IHJlcXVlc3QuR0VULmdldCgnY21kJywgTm9uZSkKKyAgICAgICAgICAgIGlmIGNtZCBhbmQgJ2ZpbHRlcmluZm8nIGluIGNtZDoKKyAgICAgICAgICAgICAgICBkYXRhID0gc2VsZi5nZXRfZmlsdGVyX2luZm8ocmVxdWVzdCwgKiprd2FyZ3MpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgSWYgbm8gY21kIGlzIHNwZWNpZmllZCB3ZSBnaXZlIHlvdSB0aGUgdGFibGUgZGF0YQorICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLmdldF9kYXRhKHJlcXVlc3QsICoqa3dhcmdzKQorCisgICAgICAgICAgICByZXR1cm4gSHR0cFJlc3BvbnNlKGRhdGEsIGNvbnRlbnRfdHlwZT0iYXBwbGljYXRpb24vanNvbiIpCisKKyAgICAgICAgcmV0dXJuIHN1cGVyKFRvYXN0ZXJUYWJsZSwgc2VsZikuZ2V0KHJlcXVlc3QsICphcmdzLCAqKmt3YXJncykKKworICAgIGRlZiBnZXRfZmlsdGVyX2luZm8oc2VsZiwgcmVxdWVzdCwgKiprd2FyZ3MpOgorICAgICAgICBkYXRhID0gTm9uZQorCisgICAgICAgIHNlbGYuc2V0dXBfZmlsdGVycygqKmt3YXJncykKKworICAgICAgICBzZWFyY2ggPSByZXF1ZXN0LkdFVC5nZXQoInNlYXJjaCIsIE5vbmUpCisgICAgICAgIGlmIHNlYXJjaDoKKyAgICAgICAgICAgIHNlbGYuYXBwbHlfc2VhcmNoKHNlYXJjaCkKKworICAgICAgICBuYW1lID0gcmVxdWVzdC5HRVQuZ2V0KCJuYW1lIiwgTm9uZSkKKyAgICAgICAgaWYgbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgZGF0YSA9IGpzb24uZHVtcHMoc2VsZi5maWx0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50PTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHM9RGphbmdvSlNPTkVuY29kZXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmb3IgYWN0aW9ucyBpbiBzZWxmLmZpbHRlcnNbbmFtZV1bJ2ZpbHRlcl9hY3Rpb25zJ106CisgICAgICAgICAgICAgICAgYWN0aW9uc1snY291bnQnXSA9IHNlbGYuZmlsdGVyX2FjdGlvbnNbYWN0aW9uc1snbmFtZSddXShjb3VudF9vbmx5PVRydWUpCisKKyAgICAgICAgICAgICMgQWRkIHRoZSAiQWxsIiBpdGVtcyBmaWx0ZXIgYWN0aW9uCisgICAgICAgICAgICBzZWxmLmZpbHRlcnNbbmFtZV1bJ2ZpbHRlcl9hY3Rpb25zJ10uaW5zZXJ0KDAsIHsKKyAgICAgICAgICAgICAgICAnbmFtZScgOiAnYWxsJywKKyAgICAgICAgICAgICAgICAndGl0bGUnIDogJ0FsbCcsCisgICAgICAgICAgICAgICAgJ2NvdW50JyA6IHNlbGYucXVlcnlzZXQuY291bnQoKSwKKyAgICAgICAgICAgIH0pCisKKyAgICAgICAgICAgIGRhdGEgPSBqc29uLmR1bXBzKHNlbGYuZmlsdGVyc1tuYW1lXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudD0yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzPURqYW5nb0pTT05FbmNvZGVyKQorCisgICAgICAgICAgICByZXR1cm4gZGF0YQorCisgICAgZGVmIHNldHVwX2NvbHVtbnMoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgIiIiIGZ1bmN0aW9uIHRvIGltcGxlbWVudCBpbiB0aGUgc3ViY2xhc3Mgd2hpY2ggc2V0cyB1cCB0aGUgY29sdW1ucyAiIiIKKyAgICAgICAgcGFzcworICAgIGRlZiBzZXR1cF9maWx0ZXJzKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICIiIiBmdW5jdGlvbiB0byBpbXBsZW1lbnQgaW4gdGhlIHN1YmNsYXNzIHdoaWNoIHNldHMgdXAgdGhlIGZpbHRlcnMgIiIiCisgICAgICAgIHBhc3MKKyAgICBkZWYgc2V0dXBfcXVlcnlzZXQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgIiIiIGZ1bmN0aW9uIHRvIGltcGxlbWVudCBpbiB0aGUgc3ViY2xhc3Mgd2hpY2ggc2V0cyB1cCB0aGUgcXVlcnlzZXQiIiIKKyAgICAgICAgcGFzcworCisgICAgZGVmIGFkZF9maWx0ZXIoc2VsZiwgbmFtZSwgdGl0bGUsIGZpbHRlcl9hY3Rpb25zKToKKyAgICAgICAgIiIiQWRkIGEgZmlsdGVyIHRvIHRoZSB0YWJsZS4KKworICAgICAgICBBcmdzOgorICAgICAgICAgICAgbmFtZSAoc3RyKTogVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGZpbHRlci4KKyAgICAgICAgICAgIHRpdGxlIChzdHIpOiBUaXRsZSBvZiB0aGUgZmlsdGVyLgorICAgICAgICAgICAgZmlsdGVyX2FjdGlvbnM6IEFjdGlvbnMgZm9yIGFsbCB0aGUgZmlsdGVycy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuZmlsdGVyc1tuYW1lXSA9IHsKKyAgICAgICAgICAndGl0bGUnIDogdGl0bGUsCisgICAgICAgICAgJ2ZpbHRlcl9hY3Rpb25zJyA6IGZpbHRlcl9hY3Rpb25zLAorICAgICAgICB9CisKKyAgICBkZWYgbWFrZV9maWx0ZXJfYWN0aW9uKHNlbGYsIG5hbWUsIHRpdGxlLCBhY3Rpb25fZnVuY3Rpb24pOgorICAgICAgICAiIiIgVXRpbGl0eSB0byBtYWtlIGEgZmlsdGVyX2FjdGlvbiAiIiIKKworICAgICAgICBhY3Rpb24gPSB7CisgICAgICAgICAgJ3RpdGxlJyA6IHRpdGxlLAorICAgICAgICAgICduYW1lJyA6IG5hbWUsCisgICAgICAgIH0KKworICAgICAgICBzZWxmLmZpbHRlcl9hY3Rpb25zW25hbWVdID0gYWN0aW9uX2Z1bmN0aW9uCisKKyAgICAgICAgcmV0dXJuIGFjdGlvbgorCisgICAgZGVmIGFkZF9jb2x1bW4oc2VsZiwgdGl0bGU9IiIsIGhlbHBfdGV4dD0iIiwKKyAgICAgICAgICAgICAgICAgICBvcmRlcmFibGU9RmFsc2UsIGhpZGVhYmxlPVRydWUsIGhpZGRlbj1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICBmaWVsZF9uYW1lPSIiLCBmaWx0ZXJfbmFtZT1Ob25lLCBzdGF0aWNfZGF0YV9uYW1lPU5vbmUsCisgICAgICAgICAgICAgICAgICAgZGlzcGxheWFibGU9VHJ1ZSwgY29tcHV0YXRpb249Tm9uZSwKKyAgICAgICAgICAgICAgICAgICBzdGF0aWNfZGF0YV90ZW1wbGF0ZT1Ob25lKToKKyAgICAgICAgIiIiQWRkIGEgY29sdW1uIHRvIHRoZSB0YWJsZS4KKworICAgICAgICBBcmdzOgorICAgICAgICAgICAgdGl0bGUgKHN0cik6IFRpdGxlIGZvciB0aGUgdGFibGUgaGVhZGVyCisgICAgICAgICAgICBoZWxwX3RleHQgKHN0cik6IE9wdGlvbmFsIGhlbHAgdGV4dCB0byBkZXNjcmliZSB0aGUgY29sdW1uCisgICAgICAgICAgICBvcmRlcmFibGUgKGJvb2wpOiBXaGV0aGVyIHRoZSBjb2x1bW4gY2FuIGJlIG9yZGVyZWQuCisgICAgICAgICAgICAgICAgV2Ugb3JkZXIgb24gdGhlIGZpZWxkX25hbWUuCisgICAgICAgICAgICBoaWRlYWJsZSAoYm9vbCk6IFdoZXRoZXIgdGhlIHVzZXIgY2FuIGhpZGUgdGhlIGNvbHVtbgorICAgICAgICAgICAgaGlkZGVuIChib29sKTogV2hldGhlciB0aGUgY29sdW1uIGlzIGRlZmF1bHQgaGlkZGVuCisgICAgICAgICAgICBmaWVsZF9uYW1lIChzdHIgb3IgbGlzdCk6IGZpZWxkKHMpIHJlcXVpcmVkIGZvciB0aGlzIGNvbHVtbidzIGRhdGEKKyAgICAgICAgICAgIHN0YXRpY19kYXRhX25hbWUgKHN0ciwgb3B0aW9uYWwpOiBUaGUgY29sdW1uJ3MgbWFpbiBpZGVudGlmaWVyCisgICAgICAgICAgICAgICAgd2hpY2ggd2lsbCByZXBsYWNlIHRoZSBmaWVsZF9uYW1lLgorICAgICAgICAgICAgc3RhdGljX2RhdGFfdGVtcGxhdGUoc3RyLCBvcHRpb25hbCk6IFRoZSB0ZW1wbGF0ZSB0byBiZSByZW5kZXJlZAorICAgICAgICAgICAgICAgIGFzIGRhdGEKKyAgICAgICAgIiIiCisKKyAgICAgICAgc2VsZi5jb2x1bW5zLmFwcGVuZCh7J3RpdGxlJyA6IHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGVscF90ZXh0JyA6IGhlbHBfdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29yZGVyYWJsZScgOiBvcmRlcmFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoaWRlYWJsZScgOiBoaWRlYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hpZGRlbicgOiBoaWRkZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaWVsZF9uYW1lJyA6IGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaWx0ZXJfbmFtZScgOiBmaWx0ZXJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0YXRpY19kYXRhX25hbWUnOiBzdGF0aWNfZGF0YV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3RhdGljX2RhdGFfdGVtcGxhdGUnOiBzdGF0aWNfZGF0YV90ZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Rpc3BsYXlhYmxlJzogZGlzcGxheWFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb21wdXRhdGlvbic6IGNvbXB1dGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisKKyAgICBkZWYgcmVuZGVyX3N0YXRpY19kYXRhKHNlbGYsIHRlbXBsYXRlLCByb3cpOgorICAgICAgICAiIiJVdGlsaXR5IGZ1bmN0aW9uIHRvIHJlbmRlciB0aGUgc3RhdGljIGRhdGEgdGVtcGxhdGUiIiIKKworICAgICAgICBjb250ZXh0ID0geworICAgICAgICAgICdleHRyYScgOiBzZWxmLnN0YXRpY19jb250ZXh0X2V4dHJhLAorICAgICAgICAgICdkYXRhJyA6IHJvdywKKyAgICAgICAgfQorCisgICAgICAgIGNvbnRleHQgPSBDb250ZXh0KGNvbnRleHQpCisgICAgICAgIHRlbXBsYXRlID0gVGVtcGxhdGUodGVtcGxhdGUpCisKKyAgICAgICAgcmV0dXJuIHRlbXBsYXRlLnJlbmRlcihjb250ZXh0KQorCisgICAgZGVmIGFwcGx5X2ZpbHRlcihzZWxmLCBmaWx0ZXJzLCAqKmt3YXJncyk6CisgICAgICAgIHNlbGYuc2V0dXBfZmlsdGVycygqKmt3YXJncykKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBmaWx0ZXJfbmFtZSwgZmlsdGVyX2FjdGlvbiA9IGZpbHRlcnMuc3BsaXQoJzonKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmICJhbGwiIGluIGZpbHRlcl9hY3Rpb246CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmZpbHRlcl9hY3Rpb25zW2ZpbHRlcl9hY3Rpb25dKCkKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgIyBwYXNzIGl0IHRvIHRoZSB1c2VyIC0gcHJvZ3JhbW1pbmcgZXJyb3IgaGVyZQorICAgICAgICAgICAgcmFpc2UKKworICAgIGRlZiBhcHBseV9vcmRlcmJ5KHNlbGYsIG9yZGVyYnkpOgorICAgICAgICAjIE5vdGUgdGhhdCBkamFuZ28gd2lsbCBleGVjdXRlIHRoaXMgd2hlbiB3ZSB0cnkgdG8gcmV0cmlldmUgdGhlIGRhdGEKKyAgICAgICAgc2VsZi5xdWVyeXNldCA9IHNlbGYucXVlcnlzZXQub3JkZXJfYnkob3JkZXJieSkKKworICAgIGRlZiBhcHBseV9zZWFyY2goc2VsZiwgc2VhcmNoX3Rlcm0pOgorICAgICAgICAiIiJDcmVhdGVzIGEgcXVlcnkgYmFzZWQgb24gdGhlIG1vZGVsJ3Mgc2VhcmNoX2FsbG93ZWRfZmllbGRzIiIiCisKKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZi5xdWVyeXNldC5tb2RlbCwgJ3NlYXJjaF9hbGxvd2VkX2ZpZWxkcycpOgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJFcnIgU2VhcmNoIGZpZWxkcyBhcmVuJ3QgZGVmaW5lZCBpbiB0aGUgbW9kZWwiKQorCisgICAgICAgIHNlYXJjaF9xdWVyaWVzID0gW10KKyAgICAgICAgZm9yIHN0IGluIHNlYXJjaF90ZXJtLnNwbGl0KCIgIik6CisgICAgICAgICAgICBxX21hcCA9IFtRKCoqe2ZpZWxkICsgJ19faWNvbnRhaW5zJzogc3R9KQorICAgICAgICAgICAgICAgICAgICAgZm9yIGZpZWxkIGluIHNlbGYucXVlcnlzZXQubW9kZWwuc2VhcmNoX2FsbG93ZWRfZmllbGRzXQorCisgICAgICAgICAgICBzZWFyY2hfcXVlcmllcy5hcHBlbmQocmVkdWNlKG9wZXJhdG9yLm9yXywgcV9tYXApKQorCisgICAgICAgIHNlYXJjaF9xdWVyaWVzID0gcmVkdWNlKG9wZXJhdG9yLmFuZF8sIHNlYXJjaF9xdWVyaWVzKQorCisgICAgICAgIHNlbGYucXVlcnlzZXQgPSBzZWxmLnF1ZXJ5c2V0LmZpbHRlcihzZWFyY2hfcXVlcmllcykKKworCisgICAgZGVmIGdldF9kYXRhKHNlbGYsIHJlcXVlc3QsICoqa3dhcmdzKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgZGF0YSBmb3IgdGhlIHBhZ2UgcmVxdWVzdGVkIHdpdGggdGhlIHNwZWNpZmllZAorICAgICAgICBwYXJhbWV0ZXJzIGFwcGxpZWQiIiIKKworICAgICAgICBwYWdlX251bSA9IHJlcXVlc3QuR0VULmdldCgicGFnZSIsIDEpCisgICAgICAgIGxpbWl0ID0gcmVxdWVzdC5HRVQuZ2V0KCJsaW1pdCIsIDEwKQorICAgICAgICBzZWFyY2ggPSByZXF1ZXN0LkdFVC5nZXQoInNlYXJjaCIsIE5vbmUpCisgICAgICAgIGZpbHRlcnMgPSByZXF1ZXN0LkdFVC5nZXQoImZpbHRlciIsIE5vbmUpCisgICAgICAgIG9yZGVyYnkgPSByZXF1ZXN0LkdFVC5nZXQoIm9yZGVyYnkiLCBOb25lKQorCisgICAgICAgICMgTWFrZSBhIHVuaXF1ZSBjYWNoZSBuYW1lCisgICAgICAgIGNhY2hlX25hbWUgPSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworCisgICAgICAgIGZvciBrZXksIHZhbCBpbiByZXF1ZXN0LkdFVC5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIGNhY2hlX25hbWUgPSBjYWNoZV9uYW1lICsgc3RyKGtleSkgKyBzdHIodmFsKQorCisgICAgICAgIGZvciBrZXksIHZhbCBpbiBrd2FyZ3MuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICBjYWNoZV9uYW1lID0gY2FjaGVfbmFtZSArIHN0cihrZXkpICsgc3RyKHZhbCkKKworICAgICAgICAjIE5vIHNwZWNpYWwgY2hhcnMgYWxsb3dlZCBpbiB0aGUgY2FjaGUgbmFtZSBhcGFydCBmcm9tIGRhc2gKKyAgICAgICAgY2FjaGVfbmFtZSA9IHJlLnN1YihyJ1teQS1aYS16MC05LV0nLCAiIiwgY2FjaGVfbmFtZSkKKyAgICAgICAgZGF0YSA9IGNhY2hlLmdldChjYWNoZV9uYW1lKQorCisgICAgICAgIGlmIGRhdGE6CisgICAgICAgICAgICByZXR1cm4gZGF0YQorCisgICAgICAgIHNlbGYuc2V0dXBfY29sdW1ucygqKmt3YXJncykKKworICAgICAgICBpZiBzZWFyY2g6CisgICAgICAgICAgICBzZWxmLmFwcGx5X3NlYXJjaChzZWFyY2gpCisgICAgICAgIGlmIGZpbHRlcnM6CisgICAgICAgICAgICBzZWxmLmFwcGx5X2ZpbHRlcihmaWx0ZXJzLCAqKmt3YXJncykKKyAgICAgICAgaWYgb3JkZXJieToKKyAgICAgICAgICAgIHNlbGYuYXBwbHlfb3JkZXJieShvcmRlcmJ5KQorCisgICAgICAgIHBhZ2luYXRvciA9IFBhZ2luYXRvcihzZWxmLnF1ZXJ5c2V0LCBsaW1pdCkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBwYWdlID0gcGFnaW5hdG9yLnBhZ2UocGFnZV9udW0pCisgICAgICAgIGV4Y2VwdCBFbXB0eVBhZ2U6CisgICAgICAgICAgICBwYWdlID0gcGFnaW5hdG9yLnBhZ2UoMSkKKworICAgICAgICBkYXRhID0geworICAgICAgICAgICAgJ3RvdGFsJyA6IHNlbGYucXVlcnlzZXQuY291bnQoKSwKKyAgICAgICAgICAgICdkZWZhdWx0X29yZGVyYnknIDogc2VsZi5kZWZhdWx0X29yZGVyYnksCisgICAgICAgICAgICAnY29sdW1ucycgOiBzZWxmLmNvbHVtbnMsCisgICAgICAgICAgICAncm93cycgOiBbXSwKKyAgICAgICAgICAgICdlcnJvcicgOiAib2siLAorICAgICAgICB9CisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIHJvdyBpbiBwYWdlLm9iamVjdF9saXN0OgorICAgICAgICAgICAgICAgICNVc2UgY29sbGVjdGlvbiB0byBtYWludGFpbiB0aGUgb3JkZXIKKyAgICAgICAgICAgICAgICByZXF1aXJlZF9kYXRhID0gY29sbGVjdGlvbnMuT3JkZXJlZERpY3QoKQorCisgICAgICAgICAgICAgICAgZm9yIGNvbCBpbiBzZWxmLmNvbHVtbnM6CisgICAgICAgICAgICAgICAgICAgIGZpZWxkID0gY29sWydmaWVsZF9uYW1lJ10KKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGZpZWxkOgorICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgPSBjb2xbJ3N0YXRpY19kYXRhX25hbWUnXQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgZmllbGQ6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIk11c3Qgc3VwcGx5IGEgZmllbGRfbmFtZSBvciBzdGF0aWNfZGF0YV9uYW1lIGZvciBjb2x1bW4gJXMuJXMiICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLGNvbCkpCisgICAgICAgICAgICAgICAgICAgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBwcm9jZXNzIHNvbWUgc3RhdGljIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgaWYgInN0YXRpY19kYXRhX25hbWUiIGluIGNvbCBhbmQgY29sWydzdGF0aWNfZGF0YV9uYW1lJ106CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZF9kYXRhWyJzdGF0aWM6JXMiICUgY29sWydzdGF0aWNfZGF0YV9uYW1lJ11dID0gc2VsZi5yZW5kZXJfc3RhdGljX2RhdGEoY29sWydzdGF0aWNfZGF0YV90ZW1wbGF0ZSddLCByb3cpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICMgT3ZlcndyaXRlIHRoZSBmaWVsZF9uYW1lIHdpdGggc3RhdGljX2RhdGFfbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgIyBzbyB0aGF0IHRoaXMgY2FuIGJlIHVzZWQgYXMgdGhlIGh0bWwgY2xhc3MgbmFtZQorCisgICAgICAgICAgICAgICAgICAgICAgICBjb2xbJ2ZpZWxkX25hbWUnXSA9IGNvbFsnc3RhdGljX2RhdGFfbmFtZSddCisKKyAgICAgICAgICAgICAgICAgICAgIyBjb21wdXRlIHRoZSBjb21wdXRhdGlvbiBvbiB0aGUgcmF3IGRhdGEgaWYgbmVlZGVkCisgICAgICAgICAgICAgICAgICAgIG1vZGVsX2RhdGEgPSByb3cKKyAgICAgICAgICAgICAgICAgICAgaWYgY29sWydjb21wdXRhdGlvbiddOgorICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfZGF0YSA9IGNvbFsnY29tcHV0YXRpb24nXShyb3cpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAjIFRyYXZlcnNlIHRvIGFueSBmb3JpZWduIGtleSBpbiB0aGUgb2JqZWN0IGhpZXJhY2h5CisgICAgICAgICAgICAgICAgICAgICAgICBmb3Igc3ViZmllbGQgaW4gZmllbGQuc3BsaXQoIl9fIik6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihtb2RlbF9kYXRhLCBzdWJmaWVsZCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2RhdGEgPSBnZXRhdHRyKG1vZGVsX2RhdGEsIHN1YmZpZWxkKQorICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgZmllbGQgY291bGQgYmUgYSBmdW5jdGlvbiBvbiB0aGUgbW9kZWwgc28gY2hlY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICMgSWYgaXQgaXMgdGhlbiBjYWxsIGl0CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG1vZGVsX2RhdGEsIHR5cGVzLk1ldGhvZFR5cGUpOgorICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9kYXRhID0gbW9kZWxfZGF0YSgpCisKKyAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRfZGF0YVtjb2xbJ2ZpZWxkX25hbWUnXV0gPSBtb2RlbF9kYXRhCisKKyAgICAgICAgICAgICAgICBkYXRhWydyb3dzJ10uYXBwZW5kKHJlcXVpcmVkX2RhdGEpCisKKyAgICAgICAgZXhjZXB0IEZpZWxkRXJyb3I6CisgICAgICAgICAgICAjIHBhc3MgIGl0IHRvIHRoZSB1c2VyIC0gcHJvZ3JhbW1pbmctZXJyb3IgaGVyZQorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZGF0YSA9IGpzb24uZHVtcHMoZGF0YSwgaW5kZW50PTIsIGRlZmF1bHQ9b2JqdG9qc29uKQorICAgICAgICBjYWNoZS5zZXQoY2FjaGVfbmFtZSwgZGF0YSwgNjAqMzApCisKKyAgICAgICAgcmV0dXJuIGRhdGEKKworCitjbGFzcyBUb2FzdGVyVGVtcGxhdGVWaWV3KFRlbXBsYXRlVmlldyk6CisgICAgIyByZW5kZXJzIGEgaW5zdGFuY2UgaW4gYSB0ZW1wbGF0ZSwgb3IgcmV0dXJucyB0aGUgY29udGV4dCBhcyBqc29uCisgICAgIyB0aGUgY2xhc3MtZXF1aXZhbGVudCBvZiB0aGUgX3RlbXBsYXRlX3JlbmRlcmVyIGRlY29yYXRvciBmb3Igdmlld3MKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBzdXBlcihUb2FzdGVyVGVtcGxhdGVWaWV3LCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCisgICAgICAgIHNlbGYuY29udGV4dF9lbnRyaWVzID0gW10KKworICAgIGRlZiBnZXQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgaWYgc2VsZi5yZXF1ZXN0LkdFVC5nZXQoJ2Zvcm1hdCcsIE5vbmUpID09ICdqc29uJzoKKyAgICAgICAgICAgIGZyb20gZGphbmdvLmNvcmUudXJscmVzb2x2ZXJzIGltcG9ydCByZXZlcnNlCisgICAgICAgICAgICBmcm9tIGRqYW5nby5zaG9ydGN1dHMgaW1wb3J0IEh0dHBSZXNwb25zZQorICAgICAgICAgICAgZnJvbSB2aWV3cyBpbXBvcnQgb2JqdG9qc29uCisgICAgICAgICAgICBmcm9tIHRvYXN0ZXJndWkudGVtcGxhdGV0YWdzLnByb2plY3R0YWdzIGltcG9ydCBqc29uIGFzIGpzb25maWx0ZXIKKworICAgICAgICAgICAgY29udGV4dCA9IHNlbGYuZ2V0X2NvbnRleHRfZGF0YSgqKmt3YXJncykKKworICAgICAgICAgICAgZm9yIHggaW4gY29udGV4dC5rZXlzKCk6CisgICAgICAgICAgICAgICAgaWYgeCBub3QgaW4gc2VsZi5jb250ZXh0X2VudHJpZXM6CisgICAgICAgICAgICAgICAgICAgIGRlbCBjb250ZXh0W3hdCisKKyAgICAgICAgICAgIGNvbnRleHRbImVycm9yIl0gPSAib2siCisKKyAgICAgICAgICAgIHJldHVybiBIdHRwUmVzcG9uc2UoanNvbmZpbHRlcihjb250ZXh0LCAgZGVmYXVsdD1vYmp0b2pzb24gKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50X3R5cGUgPSAiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCIpCisKKyAgICAgICAgcmV0dXJuIHN1cGVyKFRvYXN0ZXJUZW1wbGF0ZVZpZXcsIHNlbGYpLmdldCgqYXJncywgKiprd2FyZ3MpCisKK2NsYXNzIFRvYXN0ZXJUeXBlQWhlYWQoVmlldyk6CisgICAgIiIiIEEgdHlwZWFoZWFkIG1lY2hhbmlzbSB0byBzdXBwb3J0IHRoZSBmcm9udCBlbmQgdHlwZWFoZWFkIHdpZGdldHMgIiIiCisgICAgTUFYX1JFU1VMVFMgPSA2CisKKyAgICBjbGFzcyBNaXNzaW5nRmllbGRzRXhjZXB0aW9uKEV4Y2VwdGlvbik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBzdXBlcihUb2FzdGVyVHlwZUFoZWFkLCBzZWxmKS5fX2luaXRfXygpCisKKyAgICBkZWYgZ2V0KHNlbGYsIHJlcXVlc3QsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIGRlZiByZXNwb25zZShkYXRhKToKKyAgICAgICAgICAgIHJldHVybiBIdHRwUmVzcG9uc2UoanNvbi5kdW1wcyhkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudD0yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNscz1EamFuZ29KU09ORW5jb2RlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZT0iYXBwbGljYXRpb24vanNvbiIpCisKKyAgICAgICAgZXJyb3IgPSAib2siCisKKyAgICAgICAgc2VhcmNoX3Rlcm0gPSByZXF1ZXN0LkdFVC5nZXQoInNlYXJjaCIsIE5vbmUpCisgICAgICAgIGlmIHNlYXJjaF90ZXJtID09IE5vbmU6CisgICAgICAgICAgICAjIFdlIGdvdCBubyBzZWFyY2ggdmFsdWUgc28gcmV0dXJuIGVtcHR5IHJlcG9uc2UKKyAgICAgICAgICAgIHJldHVybiByZXNwb25zZSh7J2Vycm9yJyA6IGVycm9yICwgJ3Jlc3VsdHMnOiBbXX0pCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcHJqID0gUHJvamVjdC5vYmplY3RzLmdldChwaz1rd2FyZ3NbJ3BpZCddKQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBwcmogPSBOb25lCisKKyAgICAgICAgcmVzdWx0cyA9IHNlbGYuYXBwbHlfc2VhcmNoKHNlYXJjaF90ZXJtLCBwcmosIHJlcXVlc3QpWzpUb2FzdGVyVHlwZUFoZWFkLk1BWF9SRVNVTFRTXQorCisgICAgICAgIGlmIGxlbihyZXN1bHRzKSA+IDA6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi52YWxpZGF0ZV9maWVsZHMocmVzdWx0c1swXSkKKyAgICAgICAgICAgIGV4Y2VwdCBNaXNzaW5nRmllbGRzRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICAgICAgZXJyb3IgPSBlCisKKyAgICAgICAgZGF0YSA9IHsgJ3Jlc3VsdHMnIDogcmVzdWx0cywKKyAgICAgICAgICAgICAgICAnZXJyb3InIDogZXJyb3IsCisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3BvbnNlKGRhdGEpCisKKyAgICBkZWYgdmFsaWRhdGVfZmllbGRzKHNlbGYsIHJlc3VsdCk6CisgICAgICAgIGlmICduYW1lJyBpbiByZXN1bHQgPT0gRmFsc2Ugb3IgJ2RldGFpbCcgaW4gcmVzdWx0ID09IEZhbHNlOgorICAgICAgICAgICAgcmFpc2UgTWlzc2luZ0ZpZWxkc0V4Y2VwdGlvbigibmFtZSBhbmQgZGV0YWlsIGFyZSByZXF1aXJlZCBmaWVsZHMiKQorCisgICAgZGVmIGFwcGx5X3NlYXJjaChzZWxmLCBzZWFyY2hfdGVybSwgcHJqKToKKyAgICAgICAgIiIiIE92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gdG8gaW1wbGVtZW50IHNlYXJjaC4gUmV0dXJuIGFuIGFycmF5IG9mCisgICAgICAgIGRpY3Rpb25hcmllcyB3aXRoIGEgbWluaXVtIG9mIGEgbmFtZSBhbmQgZGV0YWlsIGZpZWxkIiIiCisgICAgICAgIHBhc3MKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcm1haW4vX19pbml0X18ucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJtYWluL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJtYWluL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJtYWluL21hbmFnZW1lbnQvX19pbml0X18ucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJtYWluL21hbmFnZW1lbnQvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcm1haW4vbWFuYWdlbWVudC9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVybWFpbi9tYW5hZ2VtZW50L2NvbW1hbmRzL19faW5pdF9fLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVybWFpbi9tYW5hZ2VtZW50L2NvbW1hbmRzL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJtYWluL21hbmFnZW1lbnQvY29tbWFuZHMvX19pbml0X18ucHkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcm1haW4vbWFuYWdlbWVudC9jb21tYW5kcy9idWlsZGRlbGV0ZS5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcm1haW4vbWFuYWdlbWVudC9jb21tYW5kcy9idWlsZGRlbGV0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDNkMzExCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVybWFpbi9tYW5hZ2VtZW50L2NvbW1hbmRzL2J1aWxkZGVsZXRlLnB5CkBAIC0wLDAgKzEsNDkgQEAKK2Zyb20gZGphbmdvLmNvcmUubWFuYWdlbWVudC5iYXNlIGltcG9ydCBCYXNlQ29tbWFuZCwgQ29tbWFuZEVycm9yCitmcm9tIG9ybS5tb2RlbHMgaW1wb3J0IEJ1aWxkCitmcm9tIGRqYW5nby5kYiBpbXBvcnQgT3BlcmF0aW9uYWxFcnJvcgoraW1wb3J0IG9zCisKKworCitjbGFzcyBDb21tYW5kKEJhc2VDb21tYW5kKToKKyAgICBhcmdzICAgID0gImJ1aWxkSWQiCisgICAgaGVscCAgICA9ICJEZWxldGVzIHNlbGVjdGVkIGJ1aWxkKHMpIgorCisgICAgZGVmIGhhbmRsZShzZWxmLCBidWlsZElkLCAqYXJncywgKipvcHRpb25zKToKKyAgICAgICAgZm9yIGJpZCBpbiBidWlsZElkLnNwbGl0KCIsIik6CisgICAgICAgICAgICBiID0gQnVpbGQub2JqZWN0cy5nZXQocGsgPSBiaWQpCisgICAgICAgICAgICAjIHRoZW9yZXRpY2FsbHksIGp1c3QgYi5kZWxldGUoKSB3b3VsZCBzdWZmaWNlCisgICAgICAgICAgICAjIGhvd2V2ZXIgU1FMaXRlIHJ1bnMgaW50byBwcm9ibGVtcyB3aGVuIHlvdSB0cnkgdG8KKyAgICAgICAgICAgICMgZGVsZXRlIHRvbyBtYW55IHJvd3MgYXQgb25jZSwgc28gd2UgZGVsZXRlIHNvbWUgZGlyZWN0CisgICAgICAgICAgICAjIHJlbGF0aW9uc2hpcHMgZnJvbSBCdWlsZCBtYW51YWxseS4KKyAgICAgICAgICAgIGZvciB0IGluIGIudGFyZ2V0X3NldC5hbGwoKToKKyAgICAgICAgICAgICAgICB0LmRlbGV0ZSgpCisgICAgICAgICAgICBmb3IgdCBpbiBiLnRhc2tfYnVpbGQuYWxsKCk6CisgICAgICAgICAgICAgICAgdC5kZWxldGUoKQorICAgICAgICAgICAgZm9yIHAgaW4gYi5wYWNrYWdlX3NldC5hbGwoKToKKyAgICAgICAgICAgICAgICBwLmRlbGV0ZSgpCisgICAgICAgICAgICBmb3IgbHYgaW4gYi5sYXllcl92ZXJzaW9uX2J1aWxkLmFsbCgpOgorICAgICAgICAgICAgICAgIGx2LmRlbGV0ZSgpCisgICAgICAgICAgICBmb3IgdiBpbiBiLnZhcmlhYmxlX2J1aWxkLmFsbCgpOgorICAgICAgICAgICAgICAgIHYuZGVsZXRlKCkKKyAgICAgICAgICAgIGZvciBsIGluIGIubG9nbWVzc2FnZV9zZXQuYWxsKCk6CisgICAgICAgICAgICAgICAgbC5kZWxldGUoKQorCisgICAgICAgICAgICAjIGRlbGV0ZSB0aGUgYnVpbGQ7IHNvbWUgZGF0YWJhc2VzIG1pZ2h0IGhhdmUgaGFkIHByb2JsZW0gd2l0aCBtaWdyYXRpb24gb2YgdGhlIGJsZGNvbnRyb2wgYXBwCisgICAgICAgICAgICByZXRyeV9jb3VudCA9IDAKKyAgICAgICAgICAgIG5lZWRfYmxkY29udHJvbF9taWdyYXRpb24gPSBGYWxzZQorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICBpZiByZXRyeV9jb3VudCA+PSA1OgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHJldHJ5X2NvdW50ICs9IDEKKyAgICAgICAgICAgICAgICBpZiBuZWVkX2JsZGNvbnRyb2xfbWlncmF0aW9uOgorICAgICAgICAgICAgICAgICAgICBmcm9tIGRqYW5nby5jb3JlIGltcG9ydCBtYW5hZ2VtZW50CisgICAgICAgICAgICAgICAgICAgIG1hbmFnZW1lbnQuY2FsbF9jb21tYW5kKCdtaWdyYXRlJywgJ2JsZGNvbnRyb2wnLCBpbnRlcmFjdGl2ZT1GYWxzZSkKKworICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgYi5kZWxldGUoKQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGV4Y2VwdCBPcGVyYXRpb25hbEVycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgICAgICMgZXhlY3V0ZSBtaWdyYXRpb25zCisgICAgICAgICAgICAgICAgICAgIG5lZWRfYmxkY29udHJvbF9taWdyYXRpb24gPSBUcnVlCisKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcm1haW4vbWFuYWdlbWVudC9jb21tYW5kcy9idWlsZHNsaXN0LnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVybWFpbi9tYW5hZ2VtZW50L2NvbW1hbmRzL2J1aWxkc2xpc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FkOTg3ZgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcm1haW4vbWFuYWdlbWVudC9jb21tYW5kcy9idWlsZHNsaXN0LnB5CkBAIC0wLDAgKzEsMTMgQEAKK2Zyb20gZGphbmdvLmNvcmUubWFuYWdlbWVudC5iYXNlIGltcG9ydCBOb0FyZ3NDb21tYW5kLCBDb21tYW5kRXJyb3IKK2Zyb20gb3JtLm1vZGVscyBpbXBvcnQgQnVpbGQKK2ltcG9ydCBvcworCisKKworY2xhc3MgQ29tbWFuZChOb0FyZ3NDb21tYW5kKToKKyAgICBhcmdzICAgID0gIiIKKyAgICBoZWxwICAgID0gIkxpc3RzIGN1cnJlbnQgYnVpbGRzIgorCisgICAgZGVmIGhhbmRsZV9ub2FyZ3Moc2VsZiwqKm9wdGlvbnMpOgorICAgICAgICBmb3IgYiBpbiBCdWlsZC5vYmplY3RzLmFsbCgpOgorICAgICAgICAgICAgcHJpbnQgIiVkOiAlcyAlcyAlcyIgJSAoYi5waywgYi5tYWNoaW5lLCBiLmRpc3RybywgIiwiLmpvaW4oW3gudGFyZ2V0IGZvciB4IGluIGIudGFyZ2V0X3NldC5hbGwoKV0pKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVybWFpbi9tYW5hZ2VtZW50L2NvbW1hbmRzL3BlcmYucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJtYWluL21hbmFnZW1lbnQvY29tbWFuZHMvcGVyZi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWE0OGU5Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVybWFpbi9tYW5hZ2VtZW50L2NvbW1hbmRzL3BlcmYucHkKQEAgLTAsMCArMSw1OCBAQAorZnJvbSBkamFuZ28uY29yZS5tYW5hZ2VtZW50LmJhc2UgaW1wb3J0IEJhc2VDb21tYW5kCitmcm9tIGRqYW5nby50ZXN0LmNsaWVudCBpbXBvcnQgQ2xpZW50CitpbXBvcnQgb3MsIHN5cywgcmUKK2ltcG9ydCByZXF1ZXN0cworZnJvbSBkamFuZ28uY29uZiBpbXBvcnQgc2V0dGluZ3MKKworIyBweWxpbnQ6IGRpc2FibGU9RTExMDMKKyMgSW5zdGFuY2Ugb2YgJ1dTR0lSZXF1ZXN0JyBoYXMgbm8gJ3N0YXR1c19jb2RlJyBtZW1iZXIKKyMgKGJ1dCBzb21lIHR5cGVzIGNvdWxkIG5vdCBiZSBpbmZlcnJlZCkgKG1heWJlLW5vLW1lbWJlcikKKworCitjbGFzcyBDb21tYW5kKEJhc2VDb21tYW5kKToKKyAgICBoZWxwICAgID0gIlRlc3QgdGhlIHJlc3BvbnNlIHRpbWUgZm9yIGFsbCB0b2FzdGVyIHVybHMiCisKKyAgICBkZWYgaGFuZGxlKHNlbGYsICphcmdzLCAqKm9wdGlvbnMpOgorCXJvb3RfdXJsY29uZiA9IF9faW1wb3J0X18oc2V0dGluZ3MuUk9PVF9VUkxDT05GKQorCXBhdHRlcm5zID0gcm9vdF91cmxjb25mLnVybHMudXJscGF0dGVybnMKKwlnbG9iYWwgZnVsbF91cmwKKwlmb3IgcGF0IGluIHBhdHRlcm5zOgorCSAgICBpZiBwYXQuX19jbGFzc19fLl9fbmFtZV9fID09ICdSZWdleFVSTFJlc29sdmVyJzoKKwkJdXJsX3Jvb3RfcmVzID0gc3RyKHBhdCkuc3BsaXQoJ14nKVsxXS5yZXBsYWNlKCc+JywgJycpCisJCWlmICdndWknIGluIHVybF9yb290X3JlczoKKwkJICAgIGZvciB1cmxfcGF0dCBpbiBwYXQudXJsX3BhdHRlcm5zOgorCQkJZnVsbF91cmwgPSBzZWxmLmdldF9mdWxsX3VybCh1cmxfcGF0dCwgdXJsX3Jvb3RfcmVzKQorCQkJaW5mbyA9IHNlbGYudXJsX2luZm8oZnVsbF91cmwpCisJCQlzdGF0dXNfY29kZSA9IGluZm9bMF0KKwkJCWxvYWRfdGltZSA9IGluZm9bMV0KKwkJCXByaW50ICdUcnlpbmcgXCcnICsgZnVsbF91cmwgKyAnXCcsICcgKyBzdHIoc3RhdHVzX2NvZGUpICsgJywgJyArIHN0cihsb2FkX3RpbWUpCisKKyAgICBkZWYgZ2V0X2Z1bGxfdXJsKHNlbGYsIHVybF9wYXR0LCB1cmxfcm9vdF9yZXMpOgorCWZ1bGxfdXJsID0gc3RyKHVybF9wYXR0KS5zcGxpdCgnXicpWzFdLnJlcGxhY2UoJyQ+JywgJycpLnJlcGxhY2UoJyg/UDxmaWxlX3BhdGg+KD86L1snLCAnL2Jpbi9idXN5Ym94JykucmVwbGFjZSgnLionLCAnJykKKwlmdWxsX3VybCA9IHN0cih1cmxfcm9vdF9yZXMgKyBmdWxsX3VybCkKKwlmdWxsX3VybCA9IHJlLnN1YignXChcP1A8Lio/PlxcXGRcK1wpJywgJzEnLCBmdWxsX3VybCkKKwlmdWxsX3VybCA9ICdodHRwOi8vbG9jYWxob3N0OjgwMDAvJyArIGZ1bGxfdXJsCisJcmV0dXJuIGZ1bGxfdXJsCisKKyAgICBkZWYgdXJsX2luZm8oc2VsZiwgZnVsbF91cmwpOgorCWNsaWVudCA9IENsaWVudCgpCisJaW5mbyA9IFtdCisJdHJ5OgorCSAgICByZXNwID0gY2xpZW50LmdldChmdWxsX3VybCwgZm9sbG93ID0gVHJ1ZSkKKwlleGNlcHQgRXhjZXB0aW9uIGFzIGVfc3RhdHVzX2NvZGU6CisgICAgICAgICAgICBzZWxmLmVycm9yKCdVcmw6ICVzLCBlcnJvcjogJXMnICUgKGZ1bGxfdXJsLCBlX3N0YXR1c19jb2RlKSkKKyAgICAgICAgICAgIHJlc3AgPSB0eXBlKCdvYmplY3QnLCAoKSwgeydzdGF0dXNfY29kZSc6MCwgJ2NvbnRlbnQnOiBzdHIoZV9zdGF0dXNfY29kZSl9KQorCXN0YXR1c19jb2RlID0gcmVzcC5zdGF0dXNfY29kZQorCWluZm8uYXBwZW5kKHN0YXR1c19jb2RlKQorCXRyeToKKwkgICAgcmVxID0gcmVxdWVzdHMuZ2V0KGZ1bGxfdXJsKQorCWV4Y2VwdCBFeGNlcHRpb24gYXMgZV9sb2FkX3RpbWU6CisgICAgICAgICAgICBzZWxmLmVycm9yKCdVcmw6ICVzLCBlcnJvcjogJXMnICUgKGZ1bGxfdXJsLCBlX2xvYWRfdGltZSkpCisJbG9hZF90aW1lID0gcmVxLmVsYXBzZWQKKwlpbmZvLmFwcGVuZChsb2FkX3RpbWUpCisJcmV0dXJuIGluZm8KKworICAgIGRlZiBlcnJvcihzZWxmLCAqYXJncyk6CisJZm9yIGFyZyBpbiBhcmdzOgorCSAgICBwcmludCA+PnN5cy5zdGRlcnIsIGFyZywKKwlwcmludCA+PnN5cy5zdGRlcnIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcm1haW4vc2V0dGluZ3MucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJtYWluL3NldHRpbmdzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNDlhNWUKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJtYWluL3NldHRpbmdzLnB5CkBAIC0wLDAgKzEsNDEwIEBACisjCisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIworIyBCaXRCYWtlIFRvYXN0ZXIgSW1wbGVtZW50YXRpb24KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEzICAgICAgICBJbnRlbCBDb3Jwb3JhdGlvbgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworIyBEamFuZ28gc2V0dGluZ3MgZm9yIFRvYXN0ZXIgcHJvamVjdC4KKworaW1wb3J0IG9zLCByZQorCitERUJVRyA9IFRydWUKK1RFTVBMQVRFX0RFQlVHID0gREVCVUcKKworIyBTZXQgdG8gVHJ1ZSB0byBzZWUgdGhlIFNRTCBxdWVyaWVzIGluIGNvbnNvbGUKK1NRTF9ERUJVRyA9IEZhbHNlCitpZiBvcy5lbnZpcm9uLmdldCgiVE9BU1RFUl9TUUxERUJVRyIsIE5vbmUpIGlzIG5vdCBOb25lOgorICAgIFNRTF9ERUJVRyA9IFRydWUKKworCitBRE1JTlMgPSAoCisgICAgIyAoJ1lvdXIgTmFtZScsICd5b3VyX2VtYWlsQGV4YW1wbGUuY29tJyksCispCisKK01BTkFHRVJTID0gQURNSU5TCisKK0RBVEFCQVNFUyA9IHsKKyAgICAnZGVmYXVsdCc6IHsKKyAgICAgICAgJ0VOR0lORSc6ICdkamFuZ28uZGIuYmFja2VuZHMuc3FsaXRlMycsICMgQWRkICdwb3N0Z3Jlc3FsX3BzeWNvcGcyJywgJ215c3FsJywgJ3NxbGl0ZTMnIG9yICdvcmFjbGUnLgorICAgICAgICAnTkFNRSc6ICd0b2FzdGVyLnNxbGl0ZScsICAgICAgICAgICAgICAgICAgICAgICMgT3IgcGF0aCB0byBkYXRhYmFzZSBmaWxlIGlmIHVzaW5nIHNxbGl0ZTMuCisgICAgICAgICdVU0VSJzogJycsCisgICAgICAgICdQQVNTV09SRCc6ICcnLAorICAgICAgICAnSE9TVCc6ICcxMjcuMC4wLjEnLCAgICAgICAgICAgICAgICAgICAgICAjIEVtcHR5IGZvciBsb2NhbGhvc3QgdGhyb3VnaCBkb21haW4gc29ja2V0cyBvciAnMTI3LjAuMC4xJyBmb3IgbG9jYWxob3N0IHRocm91Z2ggVENQLgorICAgICAgICAnUE9SVCc6ICczMzA2JywgICAgICAgICAgICAgICAgICAgICAgIyBTZXQgdG8gZW1wdHkgc3RyaW5nIGZvciBkZWZhdWx0LgorICAgIH0KK30KKworIyBOZWVkZWQgd2hlbiBVc2luZyBzcWxpdGUgZXNwZWNpYWxseSB0byBhZGQgYSBsb25nZXIgdGltZW91dCBmb3Igd2FpdGluZworIyBmb3IgdGhlIGRhdGFiYXNlIGxvY2sgdG8gYmUgIHJlbGVhc2VkCisjIGh0dHBzOi8vZG9jcy5kamFuZ29wcm9qZWN0LmNvbS9lbi8xLjYvcmVmL2RhdGFiYXNlcy8jZGF0YWJhc2UtaXMtbG9ja2VkLWVycm9ycworaWYgJ3NxbGl0ZScgaW4gREFUQUJBU0VTWydkZWZhdWx0J11bJ0VOR0lORSddOgorICAgIERBVEFCQVNFU1snZGVmYXVsdCddWydPUFRJT05TJ10gPSB7ICd0aW1lb3V0JzogMjAgfQorCisjIFJlaW50ZXJwcmV0IGRhdGFiYXNlIHNldHRpbmdzIGlmIHdlIGhhdmUgREFUQUJBU0VfVVJMIGVudmlyb25tZW50IHZhcmlhYmxlIGRlZmluZWQKKworaWYgJ0RBVEFCQVNFX1VSTCcgaW4gb3MuZW52aXJvbjoKKyAgICBkYnVybCA9IG9zLmVudmlyb25bJ0RBVEFCQVNFX1VSTCddCisgICAgaWYgZGJ1cmwuc3RhcnRzd2l0aCgnc3FsaXRlMzovLycpOgorICAgICAgICByZXN1bHQgPSByZS5tYXRjaCgnc3FsaXRlMzovLyguKiknLCBkYnVybCkKKyAgICAgICAgaWYgcmVzdWx0IGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIkVSUk9SOiBDb3VsZCBub3QgcmVhZCBzcWxpdGUgZGF0YWJhc2UgdXJsOiAlcyIgJSBkYnVybCkKKyAgICAgICAgREFUQUJBU0VTWydkZWZhdWx0J10gPSB7CisgICAgICAgICAgICAnRU5HSU5FJzogJ2RqYW5nby5kYi5iYWNrZW5kcy5zcWxpdGUzJywKKyAgICAgICAgICAgICdOQU1FJzogcmVzdWx0Lmdyb3VwKDEpLAorICAgICAgICAgICAgJ1VTRVInOiAnJywKKyAgICAgICAgICAgICdQQVNTV09SRCc6ICcnLAorICAgICAgICAgICAgJ0hPU1QnOiAnJywKKyAgICAgICAgICAgICdQT1JUJzogJycsCisgICAgICAgIH0KKyAgICBlbGlmIGRidXJsLnN0YXJ0c3dpdGgoJ215c3FsOi8vJyk6CisgICAgICAgICMgVVJMIG11c3QgYmUgaW4gdGhpcyBmb3JtOiBteXNxbDovL3VzZXI6cGFzc0Bob3N0OnBvcnQvbmFtZQorICAgICAgICByZXN1bHQgPSByZS5tYXRjaChyIm15c3FsOi8vKFteOl0qKTooW15AXSopQChbXjpdKik6KFxkKykvKFteL10qKSIsIGRidXJsKQorICAgICAgICBpZiByZXN1bHQgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiRVJST1I6IENvdWxkIG5vdCByZWFkIG15c3FsIGRhdGFiYXNlIHVybDogJXMiICUgZGJ1cmwpCisgICAgICAgIERBVEFCQVNFU1snZGVmYXVsdCddID0geworICAgICAgICAgICAgJ0VOR0lORSc6ICdkamFuZ28uZGIuYmFja2VuZHMubXlzcWwnLAorICAgICAgICAgICAgJ05BTUUnOiByZXN1bHQuZ3JvdXAoNSksCisgICAgICAgICAgICAnVVNFUic6IHJlc3VsdC5ncm91cCgxKSwKKyAgICAgICAgICAgICdQQVNTV09SRCc6IHJlc3VsdC5ncm91cCgyKSwKKyAgICAgICAgICAgICdIT1NUJzogcmVzdWx0Lmdyb3VwKDMpLAorICAgICAgICAgICAgJ1BPUlQnOiByZXN1bHQuZ3JvdXAoNCksCisgICAgICAgIH0KKyAgICBlbHNlOgorICAgICAgICByYWlzZSBFeGNlcHRpb24oIkZJWE1FOiBQbGVhc2UgaW1wbGVtZW50IG1pc3NpbmcgZGF0YWJhc2UgdXJsIHNjaGVtYSBmb3IgdXJsOiAlcyIgJSBkYnVybCkKKworCitpZiAnVE9BU1RFUl9NQU5BR0VEJyBpbiBvcy5lbnZpcm9uIGFuZCBvcy5lbnZpcm9uWydUT0FTVEVSX01BTkFHRUQnXSA9PSAiMSI6CisgICAgTUFOQUdFRCA9IFRydWUKK2Vsc2U6CisgICAgTUFOQUdFRCA9IEZhbHNlCisKKyMgQWxsb3dzIGN1cnJlbnQgZGF0YWJhc2Ugc2V0dGluZ3MgdG8gYmUgZXhwb3J0ZWQgYXMgYSBEQVRBQkFTRV9VUkwgZW52aXJvbm1lbnQgdmFyaWFibGUgdmFsdWUKKworZGVmIGdldERBVEFCQVNFX1VSTCgpOgorICAgIGQgPSBEQVRBQkFTRVNbJ2RlZmF1bHQnXQorICAgIGlmIGRbJ0VOR0lORSddID09ICdkamFuZ28uZGIuYmFja2VuZHMuc3FsaXRlMyc6CisgICAgICAgIGlmIGRbJ05BTUUnXSA9PSAnOm1lbW9yeTonOgorICAgICAgICAgICAgcmV0dXJuICdzcWxpdGUzOi8vOm1lbW9yeTonCisgICAgICAgIGVsaWYgZFsnTkFNRSddLnN0YXJ0c3dpdGgoIi8iKToKKyAgICAgICAgICAgIHJldHVybiAnc3FsaXRlMzovLycgKyBkWydOQU1FJ10KKyAgICAgICAgcmV0dXJuICJzcWxpdGUzOi8vIiArIG9zLnBhdGguam9pbihvcy5nZXRjd2QoKSwgZFsnTkFNRSddKQorCisgICAgZWxpZiBkWydFTkdJTkUnXSA9PSAnZGphbmdvLmRiLmJhY2tlbmRzLm15c3FsJzoKKyAgICAgICAgcmV0dXJuICJteXNxbDovLyIgKyBkWydVU0VSJ10gKyAiOiIgKyBkWydQQVNTV09SRCddICsgIkAiICsgZFsnSE9TVCddICsgIjoiICsgZFsnUE9SVCddICsgIi8iICsgZFsnTkFNRSddCisKKyAgICByYWlzZSBFeGNlcHRpb24oIkZJWE1FOiBQbGVhc2UgaW1wbGVtZW50IG1pc3NpbmcgZGF0YWJhc2UgdXJsIHNjaGVtYSBmb3IgZW5naW5lOiAlcyIgJSBkWydFTkdJTkUnXSkKKworCisKKyMgSG9zdHMvZG9tYWluIG5hbWVzIHRoYXQgYXJlIHZhbGlkIGZvciB0aGlzIHNpdGU7IHJlcXVpcmVkIGlmIERFQlVHIGlzIEZhbHNlCisjIFNlZSBodHRwczovL2RvY3MuZGphbmdvcHJvamVjdC5jb20vZW4vMS41L3JlZi9zZXR0aW5ncy8jYWxsb3dlZC1ob3N0cworQUxMT1dFRF9IT1NUUyA9IFtdCisKKyMgTG9jYWwgdGltZSB6b25lIGZvciB0aGlzIGluc3RhbGxhdGlvbi4gQ2hvaWNlcyBjYW4gYmUgZm91bmQgaGVyZToKKyMgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MaXN0X29mX3R6X3pvbmVzX2J5X25hbWUKKyMgYWx0aG91Z2ggbm90IGFsbCBjaG9pY2VzIG1heSBiZSBhdmFpbGFibGUgb24gYWxsIG9wZXJhdGluZyBzeXN0ZW1zLgorIyBJbiBhIFdpbmRvd3MgZW52aXJvbm1lbnQgdGhpcyBtdXN0IGJlIHNldCB0byB5b3VyIHN5c3RlbSB0aW1lIHpvbmUuCisKKyMgQWx3YXlzIHVzZSBsb2NhbCBjb21wdXRlcidzIHRpbWUgem9uZSwgZmluZAoraW1wb3J0IGhhc2hsaWIKK2lmICdUWicgaW4gb3MuZW52aXJvbjoKKyAgICBUSU1FX1pPTkUgPSBvcy5lbnZpcm9uWydUWiddCitlbHNlOgorICAgICMgbmVlZCB0byByZWFkIHRoZSAvZXRjL2xvY2FsdGltZSBmaWxlIHdoaWNoIGlzIHRoZSBsaWJjIHN0YW5kYXJkCisgICAgIyBhbmQgZG8gYSByZXZlcnNlLW1hcHBpbmcgdG8gL3Vzci9zaGFyZS96b25laW5mby87CisgICAgIyBzaW5jZSB0aGUgdGltZXpvbmUgbWF5IG1hdGNoIGFueSBudW1iZXIgb2YgaWRlbnRpY2FsIHRpbWV6b25lIGRlZmluaXRpb25zLAorCisgICAgem9uZWZpbGVsaXN0ID0ge30KKyAgICBaT05FSU5GT1BBVEggPSAnL3Vzci9zaGFyZS96b25laW5mby8nCisgICAgZm9yIGRpcnBhdGgsIGRpcm5hbWVzLCBmaWxlbmFtZXMgaW4gb3Mud2FsayhaT05FSU5GT1BBVEgpOgorICAgICAgICBmb3IgZm4gaW4gZmlsZW5hbWVzOgorICAgICAgICAgICAgZmlsZXBhdGggPSBvcy5wYXRoLmpvaW4oZGlycGF0aCwgZm4pCisgICAgICAgICAgICB6b25lbmFtZSA9IGZpbGVwYXRoLmxzdHJpcChaT05FSU5GT1BBVEgpLnN0cmlwKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbXBvcnQgcHl0egorICAgICAgICAgICAgICAgIGZyb20gcHl0ei5leGNlcHRpb25zIGltcG9ydCBVbmtub3duVGltZVpvbmVFcnJvcgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGlmIHB5dHoudGltZXpvbmUoem9uZW5hbWUpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgem9uZWZpbGVsaXN0W2hhc2hsaWIubWQ1KG9wZW4oZmlsZXBhdGgpLnJlYWQoKSkuaGV4ZGlnZXN0KCldID0gem9uZW5hbWUKKyAgICAgICAgICAgICAgICBleGNlcHQgVW5rbm93blRpbWVab25lRXJyb3IsIFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICMgd2UgZXhwZWN0IHRpbWV6b25lIGZhaWx1cmVzIGhlcmUsIGp1c3QgbW92ZSBvdmVyCisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICB6b25lZmlsZWxpc3RbaGFzaGxpYi5tZDUob3BlbihmaWxlcGF0aCkucmVhZCgpKS5oZXhkaWdlc3QoKV0gPSB6b25lbmFtZQorCisgICAgVElNRV9aT05FID0gem9uZWZpbGVsaXN0W2hhc2hsaWIubWQ1KG9wZW4oJy9ldGMvbG9jYWx0aW1lJykucmVhZCgpKS5oZXhkaWdlc3QoKV0KKworIyBMYW5ndWFnZSBjb2RlIGZvciB0aGlzIGluc3RhbGxhdGlvbi4gQWxsIGNob2ljZXMgY2FuIGJlIGZvdW5kIGhlcmU6CisjIGh0dHA6Ly93d3cuaTE4bmd1eS5jb20vdW5pY29kZS9sYW5ndWFnZS1pZGVudGlmaWVycy5odG1sCitMQU5HVUFHRV9DT0RFID0gJ2VuLXVzJworCitTSVRFX0lEID0gMQorCisjIElmIHlvdSBzZXQgdGhpcyB0byBGYWxzZSwgRGphbmdvIHdpbGwgbWFrZSBzb21lIG9wdGltaXphdGlvbnMgc28gYXMgbm90CisjIHRvIGxvYWQgdGhlIGludGVybmF0aW9uYWxpemF0aW9uIG1hY2hpbmVyeS4KK1VTRV9JMThOID0gVHJ1ZQorCisjIElmIHlvdSBzZXQgdGhpcyB0byBGYWxzZSwgRGphbmdvIHdpbGwgbm90IGZvcm1hdCBkYXRlcywgbnVtYmVycyBhbmQKKyMgY2FsZW5kYXJzIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBsb2NhbGUuCitVU0VfTDEwTiA9IFRydWUKKworIyBJZiB5b3Ugc2V0IHRoaXMgdG8gRmFsc2UsIERqYW5nbyB3aWxsIG5vdCB1c2UgdGltZXpvbmUtYXdhcmUgZGF0ZXRpbWVzLgorVVNFX1RaID0gVHJ1ZQorCisjIEFic29sdXRlIGZpbGVzeXN0ZW0gcGF0aCB0byB0aGUgZGlyZWN0b3J5IHRoYXQgd2lsbCBob2xkIHVzZXItdXBsb2FkZWQgZmlsZXMuCisjIEV4YW1wbGU6ICIvdmFyL3d3dy9leGFtcGxlLmNvbS9tZWRpYS8iCitNRURJQV9ST09UID0gJycKKworIyBVUkwgdGhhdCBoYW5kbGVzIHRoZSBtZWRpYSBzZXJ2ZWQgZnJvbSBNRURJQV9ST09ULiBNYWtlIHN1cmUgdG8gdXNlIGEKKyMgdHJhaWxpbmcgc2xhc2guCisjIEV4YW1wbGVzOiAiaHR0cDovL2V4YW1wbGUuY29tL21lZGlhLyIsICJodHRwOi8vbWVkaWEuZXhhbXBsZS5jb20vIgorTUVESUFfVVJMID0gJycKKworIyBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBkaXJlY3Rvcnkgc3RhdGljIGZpbGVzIHNob3VsZCBiZSBjb2xsZWN0ZWQgdG8uCisjIERvbid0IHB1dCBhbnl0aGluZyBpbiB0aGlzIGRpcmVjdG9yeSB5b3Vyc2VsZjsgc3RvcmUgeW91ciBzdGF0aWMgZmlsZXMKKyMgaW4gYXBwcycgInN0YXRpYy8iIHN1YmRpcmVjdG9yaWVzIGFuZCBpbiBTVEFUSUNGSUxFU19ESVJTLgorIyBFeGFtcGxlOiAiL3Zhci93d3cvZXhhbXBsZS5jb20vc3RhdGljLyIKK1NUQVRJQ19ST09UID0gJycKKworIyBVUkwgcHJlZml4IGZvciBzdGF0aWMgZmlsZXMuCisjIEV4YW1wbGU6ICJodHRwOi8vZXhhbXBsZS5jb20vc3RhdGljLyIsICJodHRwOi8vc3RhdGljLmV4YW1wbGUuY29tLyIKK1NUQVRJQ19VUkwgPSAnL3N0YXRpYy8nCisKKyMgQWRkaXRpb25hbCBsb2NhdGlvbnMgb2Ygc3RhdGljIGZpbGVzCitTVEFUSUNGSUxFU19ESVJTID0gKAorICAgICMgUHV0IHN0cmluZ3MgaGVyZSwgbGlrZSAiL2hvbWUvaHRtbC9zdGF0aWMiIG9yICJDOi93d3cvZGphbmdvL3N0YXRpYyIuCisgICAgIyBBbHdheXMgdXNlIGZvcndhcmQgc2xhc2hlcywgZXZlbiBvbiBXaW5kb3dzLgorICAgICMgRG9uJ3QgZm9yZ2V0IHRvIHVzZSBhYnNvbHV0ZSBwYXRocywgbm90IHJlbGF0aXZlIHBhdGhzLgorKQorCisjIExpc3Qgb2YgZmluZGVyIGNsYXNzZXMgdGhhdCBrbm93IGhvdyB0byBmaW5kIHN0YXRpYyBmaWxlcyBpbgorIyB2YXJpb3VzIGxvY2F0aW9ucy4KK1NUQVRJQ0ZJTEVTX0ZJTkRFUlMgPSAoCisgICAgJ2RqYW5nby5jb250cmliLnN0YXRpY2ZpbGVzLmZpbmRlcnMuRmlsZVN5c3RlbUZpbmRlcicsCisgICAgJ2RqYW5nby5jb250cmliLnN0YXRpY2ZpbGVzLmZpbmRlcnMuQXBwRGlyZWN0b3JpZXNGaW5kZXInLAorIyAgICAnZGphbmdvLmNvbnRyaWIuc3RhdGljZmlsZXMuZmluZGVycy5EZWZhdWx0U3RvcmFnZUZpbmRlcicsCispCisKKyMgTWFrZSB0aGlzIHVuaXF1ZSwgYW5kIGRvbid0IHNoYXJlIGl0IHdpdGggYW55Ym9keS4KK1NFQ1JFVF9LRVkgPSAnTk9UX1NVSVRBQkxFX0ZPUl9IT1NURURfREVQTE9ZTUVOVCcKKworIyBMaXN0IG9mIGNhbGxhYmxlcyB0aGF0IGtub3cgaG93IHRvIGltcG9ydCB0ZW1wbGF0ZXMgZnJvbSB2YXJpb3VzIHNvdXJjZXMuCitURU1QTEFURV9MT0FERVJTID0gKAorICAgICdkamFuZ28udGVtcGxhdGUubG9hZGVycy5maWxlc3lzdGVtLkxvYWRlcicsCisgICAgJ2RqYW5nby50ZW1wbGF0ZS5sb2FkZXJzLmFwcF9kaXJlY3Rvcmllcy5Mb2FkZXInLAorIyAgICAgJ2RqYW5nby50ZW1wbGF0ZS5sb2FkZXJzLmVnZ3MuTG9hZGVyJywKKykKKworTUlERExFV0FSRV9DTEFTU0VTID0gKAorICAgICdkamFuZ28ubWlkZGxld2FyZS5jb21tb24uQ29tbW9uTWlkZGxld2FyZScsCisgICAgJ2RqYW5nby5jb250cmliLnNlc3Npb25zLm1pZGRsZXdhcmUuU2Vzc2lvbk1pZGRsZXdhcmUnLAorICAgICdkamFuZ28ubWlkZGxld2FyZS5jc3JmLkNzcmZWaWV3TWlkZGxld2FyZScsCisgICAgJ2RqYW5nby5jb250cmliLmF1dGgubWlkZGxld2FyZS5BdXRoZW50aWNhdGlvbk1pZGRsZXdhcmUnLAorICAgICdkamFuZ28uY29udHJpYi5tZXNzYWdlcy5taWRkbGV3YXJlLk1lc3NhZ2VNaWRkbGV3YXJlJywKKyAgICAjIFVuY29tbWVudCB0aGUgbmV4dCBsaW5lIGZvciBzaW1wbGUgY2xpY2tqYWNraW5nIHByb3RlY3Rpb246CisgICAgIyAnZGphbmdvLm1pZGRsZXdhcmUuY2xpY2tqYWNraW5nLlhGcmFtZU9wdGlvbnNNaWRkbGV3YXJlJywKKykKKworQ0FDSEVTID0geworICAgICMgICAgICAgICdkZWZhdWx0JzogeworICAgICMgICAgICAgICAgICAnQkFDS0VORCc6ICdkamFuZ28uY29yZS5jYWNoZS5iYWNrZW5kcy5tZW1jYWNoZWQuTWVtY2FjaGVkQ2FjaGUnLAorICAgICMgICAgICAgICAgICAnTE9DQVRJT04nOiAnMTI3LjAuMC4xOjExMjExJywKKyAgICAjICAgICAgICB9LAorICAgICAgICAgICAnZGVmYXVsdCc6IHsKKyAgICAgICAgICAgICAgICdCQUNLRU5EJzogJ2RqYW5nby5jb3JlLmNhY2hlLmJhY2tlbmRzLmZpbGViYXNlZC5GaWxlQmFzZWRDYWNoZScsCisgICAgICAgICAgICAgICAnTE9DQVRJT04nOiAnL3RtcC9kamFuZ28tZGVmYXVsdC1jYWNoZScsCisgICAgICAgICAgICAgICAnVElNRU9VVCc6IDEsCisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisKK2Zyb20gb3MucGF0aCBpbXBvcnQgZGlybmFtZSBhcyBETgorU0lURV9ST09UPUROKEROKG9zLnBhdGguYWJzcGF0aChfX2ZpbGVfXykpKQorCitpbXBvcnQgc3VicHJvY2VzcworVE9BU1RFUl9CUkFOQ0ggPSBzdWJwcm9jZXNzLlBvcGVuKCdnaXQgYnJhbmNoIHwgZ3JlcCAiXiogIiB8IHRyIC1kICIqICInLCBjd2QgPSBTSVRFX1JPT1QsIHNoZWxsPVRydWUsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpLmNvbW11bmljYXRlKClbMF0KK1RPQVNURVJfUkVWSVNJT04gPSBzdWJwcm9jZXNzLlBvcGVuKCdnaXQgcmV2LXBhcnNlIEhFQUQgJywgY3dkID0gU0lURV9ST09ULCBzaGVsbD1UcnVlLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKS5jb21tdW5pY2F0ZSgpWzBdCisKK1JPT1RfVVJMQ09ORiA9ICd0b2FzdGVybWFpbi51cmxzJworCisjIFB5dGhvbiBkb3R0ZWQgcGF0aCB0byB0aGUgV1NHSSBhcHBsaWNhdGlvbiB1c2VkIGJ5IERqYW5nbydzIHJ1bnNlcnZlci4KK1dTR0lfQVBQTElDQVRJT04gPSAndG9hc3Rlcm1haW4ud3NnaS5hcHBsaWNhdGlvbicKKworVEVNUExBVEVfRElSUyA9ICgKKyAgICAjIFB1dCBzdHJpbmdzIGhlcmUsIGxpa2UgIi9ob21lL2h0bWwvZGphbmdvX3RlbXBsYXRlcyIgb3IgIkM6L3d3dy9kamFuZ28vdGVtcGxhdGVzIi4KKyAgICAjIEFsd2F5cyB1c2UgZm9yd2FyZCBzbGFzaGVzLCBldmVuIG9uIFdpbmRvd3MuCisgICAgIyBEb24ndCBmb3JnZXQgdG8gdXNlIGFic29sdXRlIHBhdGhzLCBub3QgcmVsYXRpdmUgcGF0aHMuCispCisKK1RFTVBMQVRFX0NPTlRFWFRfUFJPQ0VTU09SUyA9ICgnZGphbmdvLmNvbnRyaWIuYXV0aC5jb250ZXh0X3Byb2Nlc3NvcnMuYXV0aCcsCisgJ2RqYW5nby5jb3JlLmNvbnRleHRfcHJvY2Vzc29ycy5kZWJ1ZycsCisgJ2RqYW5nby5jb3JlLmNvbnRleHRfcHJvY2Vzc29ycy5pMThuJywKKyAnZGphbmdvLmNvcmUuY29udGV4dF9wcm9jZXNzb3JzLm1lZGlhJywKKyAnZGphbmdvLmNvcmUuY29udGV4dF9wcm9jZXNzb3JzLnN0YXRpYycsCisgJ2RqYW5nby5jb3JlLmNvbnRleHRfcHJvY2Vzc29ycy50eicsCisgJ2RqYW5nby5jb250cmliLm1lc3NhZ2VzLmNvbnRleHRfcHJvY2Vzc29ycy5tZXNzYWdlcycsCisgImRqYW5nby5jb3JlLmNvbnRleHRfcHJvY2Vzc29ycy5yZXF1ZXN0IiwKKyAndG9hc3Rlcmd1aS52aWV3cy5tYW5hZ2VkY29udGV4dHByb2Nlc3NvcicsCisgKQorCitJTlNUQUxMRURfQVBQUyA9ICgKKyAgICAnZGphbmdvLmNvbnRyaWIuYXV0aCcsCisgICAgJ2RqYW5nby5jb250cmliLmNvbnRlbnR0eXBlcycsCisgICAgJ2RqYW5nby5jb250cmliLm1lc3NhZ2VzJywKKyAgICAnZGphbmdvLmNvbnRyaWIuc2Vzc2lvbnMnLAorICAgICdkamFuZ28uY29udHJpYi5hZG1pbicsCisgICAgJ2RqYW5nby5jb250cmliLnN0YXRpY2ZpbGVzJywKKworICAgICMgVW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gZW5hYmxlIGFkbWluIGRvY3VtZW50YXRpb246CisgICAgIyAnZGphbmdvLmNvbnRyaWIuYWRtaW5kb2NzJywKKyAgICAnZGphbmdvLmNvbnRyaWIuaHVtYW5pemUnLAorICAgICdibGRjb2xsZWN0b3InLAorICAgICd0b2FzdGVybWFpbicsCisgICAgJ3NvdXRoJywKKykKKworCitJTlRFUk5BTF9JUFMgPSBbJzEyNy4wLjAuMScsICcxOTIuMTY4LjIuMjgnXQorCisjIExvYWQgZGphbmdvLWZyZXNoIGlzIFRPQVNURVJfREVWRUwgaXMgc2V0LCBhbmQgdGhlIG1vZHVsZSBpcyBhdmFpbGFibGUKK0ZSRVNIX0VOQUJMRUQgPSBGYWxzZQoraWYgb3MuZW52aXJvbi5nZXQoJ1RPQVNURVJfREVWRUwnLCBOb25lKSBpcyBub3QgTm9uZToKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCBmcmVzaAorICAgICAgICBNSURETEVXQVJFX0NMQVNTRVMgPSAoImZyZXNoLm1pZGRsZXdhcmUuRnJlc2hNaWRkbGV3YXJlIiwpICsgTUlERExFV0FSRV9DTEFTU0VTCisgICAgICAgIElOU1RBTExFRF9BUFBTID0gSU5TVEFMTEVEX0FQUFMgKyAoJ2ZyZXNoJywpCisgICAgICAgIEZSRVNIX0VOQUJMRUQgPSBUcnVlCisgICAgZXhjZXB0OgorICAgICAgICBwYXNzCisKK0RFQlVHX1BBTkVMX0VOQUJMRUQgPSBGYWxzZQoraWYgb3MuZW52aXJvbi5nZXQoJ1RPQVNURVJfREVWRUwnLCBOb25lKSBpcyBub3QgTm9uZToKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCBkZWJ1Z190b29sYmFyLCBkZWJ1Z19wYW5lbAorICAgICAgICBNSURETEVXQVJFX0NMQVNTRVMgPSAoJ2RlYnVnX3BhbmVsLm1pZGRsZXdhcmUuRGVidWdQYW5lbE1pZGRsZXdhcmUnLCkgKyBNSURETEVXQVJFX0NMQVNTRVMKKyAgICAgICAgI01JRERMRVdBUkVfQ0xBU1NFUyA9IE1JRERMRVdBUkVfQ0xBU1NFUyArICgnZGVidWdfdG9vbGJhci5taWRkbGV3YXJlLkRlYnVnVG9vbGJhck1pZGRsZXdhcmUnLCkKKyAgICAgICAgSU5TVEFMTEVEX0FQUFMgPSBJTlNUQUxMRURfQVBQUyArICgnZGVidWdfdG9vbGJhcicsJ2RlYnVnX3BhbmVsJywpCisgICAgICAgIERFQlVHX1BBTkVMX0VOQUJMRUQgPSBUcnVlCisKKyAgICAgICAgIyB0aGlzIGNhY2hlIGJhY2tlbmQgd2lsbCBiZSB1c2VkIGJ5IGRqYW5nby1kZWJ1Zy1wYW5lbAorICAgICAgICBDQUNIRVNbJ2RlYnVnLXBhbmVsJ10gPSB7CisgICAgICAgICAgICAgICAgJ0JBQ0tFTkQnOiAnZGphbmdvLmNvcmUuY2FjaGUuYmFja2VuZHMuZmlsZWJhc2VkLkZpbGVCYXNlZENhY2hlJywKKyAgICAgICAgICAgICAgICAnTE9DQVRJT04nOiAnL3Zhci90bXAvZGVidWctcGFuZWwtY2FjaGUnLAorICAgICAgICAgICAgICAgICdUSU1FT1VUJzogMzAwLAorICAgICAgICAgICAgICAgICdPUFRJT05TJzogeworICAgICAgICAgICAgICAgICAgICAnTUFYX0VOVFJJRVMnOiAyMDAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIGV4Y2VwdDoKKyAgICAgICAgcGFzcworCisKK1NPVVRIX1RFU1RTX01JR1JBVEUgPSBGYWxzZQorCisKKyMgV2UgYXV0b21hdGljYWxseSBkZXRlY3QgYW5kIGluc3RhbGwgYXBwbGljYXRpb25zIGhlcmUgaWYKKyMgdGhleSBoYXZlIGEgJ21vZGVscy5weScgb3IgJ3ZpZXdzLnB5JyBmaWxlCitpbXBvcnQgb3MKK2N1cnJlbnRkaXIgPSBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pCitmb3IgdCBpbiBvcy53YWxrKG9zLnBhdGguZGlybmFtZShjdXJyZW50ZGlyKSk6CisgICAgbW9kdWxlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUodFswXSkKKyAgICAjaWYgd2UgaGF2ZSBhIHZpcnR1YWxlbnYgc2tpcCBpdCB0byBhdm9pZCBpbmNvcnJlY3QgaW1wb3J0cworICAgIGlmIG9zLmVudmlyb24uaGFzX2tleSgnVklSVFVBTF9FTlYnKSBhbmQgb3MuZW52aXJvblsnVklSVFVBTF9FTlYnXSBpbiB0WzBdOgorICAgICAgICBjb250aW51ZQorCisgICAgaWYgKCJ2aWV3cy5weSIgaW4gdFsyXSBvciAibW9kZWxzLnB5IiBpbiB0WzJdKSBhbmQgbm90IG1vZHVsZW5hbWUgaW4gSU5TVEFMTEVEX0FQUFM6CisgICAgICAgIElOU1RBTExFRF9BUFBTID0gSU5TVEFMTEVEX0FQUFMgKyAobW9kdWxlbmFtZSwpCisKKyMgQSBzYW1wbGUgbG9nZ2luZyBjb25maWd1cmF0aW9uLiBUaGUgb25seSB0YW5naWJsZSBsb2dnaW5nCisjIHBlcmZvcm1lZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24gaXMgdG8gc2VuZCBhbiBlbWFpbCB0bworIyB0aGUgc2l0ZSBhZG1pbnMgb24gZXZlcnkgSFRUUCA1MDAgZXJyb3Igd2hlbiBERUJVRz1GYWxzZS4KKyMgU2VlIGh0dHA6Ly9kb2NzLmRqYW5nb3Byb2plY3QuY29tL2VuL2Rldi90b3BpY3MvbG9nZ2luZyBmb3IKKyMgbW9yZSBkZXRhaWxzIG9uIGhvdyB0byBjdXN0b21pemUgeW91ciBsb2dnaW5nIGNvbmZpZ3VyYXRpb24uCitMT0dHSU5HID0geworICAgICd2ZXJzaW9uJzogMSwKKyAgICAnZGlzYWJsZV9leGlzdGluZ19sb2dnZXJzJzogRmFsc2UsCisgICAgJ2ZpbHRlcnMnOiB7CisgICAgICAgICdyZXF1aXJlX2RlYnVnX2ZhbHNlJzogeworICAgICAgICAgICAgJygpJzogJ2RqYW5nby51dGlscy5sb2cuUmVxdWlyZURlYnVnRmFsc2UnCisgICAgICAgIH0KKyAgICB9LAorICAgICdmb3JtYXR0ZXJzJzogeworICAgICAgICAnZGF0ZXRpbWUnOiB7CisgICAgICAgICAgICAnZm9ybWF0JzogJyUoYXNjdGltZSlzICUobGV2ZWxuYW1lKXMgJShtZXNzYWdlKXMnCisgICAgICAgIH0KKyAgICB9LAorICAgICdoYW5kbGVycyc6IHsKKyAgICAgICAgJ21haWxfYWRtaW5zJzogeworICAgICAgICAgICAgJ2xldmVsJzogJ0VSUk9SJywKKyAgICAgICAgICAgICdmaWx0ZXJzJzogWydyZXF1aXJlX2RlYnVnX2ZhbHNlJ10sCisgICAgICAgICAgICAnY2xhc3MnOiAnZGphbmdvLnV0aWxzLmxvZy5BZG1pbkVtYWlsSGFuZGxlcicKKyAgICAgICAgfSwKKyAgICAgICAgJ2NvbnNvbGUnOiB7CisgICAgICAgICAgICAnbGV2ZWwnOiAnREVCVUcnLAorICAgICAgICAgICAgJ2NsYXNzJzogJ2xvZ2dpbmcuU3RyZWFtSGFuZGxlcicsCisgICAgICAgICAgICAnZm9ybWF0dGVyJzogJ2RhdGV0aW1lJywKKyAgICAgICAgfQorICAgIH0sCisgICAgJ2xvZ2dlcnMnOiB7CisgICAgICAgICd0b2FzdGVyJyA6IHsKKyAgICAgICAgICAgICdoYW5kbGVycyc6IFsnY29uc29sZSddLAorICAgICAgICAgICAgJ2xldmVsJzogJ0RFQlVHJywKKyAgICAgICAgfSwKKyAgICAgICAgJ2RqYW5nby5yZXF1ZXN0JzogeworICAgICAgICAgICAgJ2hhbmRsZXJzJzogWydjb25zb2xlJ10sCisgICAgICAgICAgICAnbGV2ZWwnOiAnV0FSTicsCisgICAgICAgICAgICAncHJvcGFnYXRlJzogVHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9Cit9CisKK2lmIERFQlVHIGFuZCBTUUxfREVCVUc6CisgICAgTE9HR0lOR1snbG9nZ2VycyddWydkamFuZ28uZGIuYmFja2VuZHMnXSA9IHsKKyAgICAgICAgICAgICdsZXZlbCc6ICdERUJVRycsCisgICAgICAgICAgICAnaGFuZGxlcnMnOiBbJ2NvbnNvbGUnXSwKKyAgICAgICAgfQorCisKKyMgSWYgd2UncmUgdXNpbmcgc3FsaXRlLCB3ZSBuZWVkIHRvIHR3ZWFrIHRoZSBwZXJmb3JtYW5jZSBhIGJpdAorZnJvbSBkamFuZ28uZGIuYmFja2VuZHMuc2lnbmFscyBpbXBvcnQgY29ubmVjdGlvbl9jcmVhdGVkCitkZWYgYWN0aXZhdGVfc3luY2hyb25vdXNfb2ZmKHNlbmRlciwgY29ubmVjdGlvbiwgKiprd2FyZ3MpOgorICAgIGlmIGNvbm5lY3Rpb24udmVuZG9yID09ICdzcWxpdGUnOgorICAgICAgICBjdXJzb3IgPSBjb25uZWN0aW9uLmN1cnNvcigpCisgICAgICAgIGN1cnNvci5leGVjdXRlKCdQUkFHTUEgc3luY2hyb25vdXMgPSAwOycpCitjb25uZWN0aW9uX2NyZWF0ZWQuY29ubmVjdChhY3RpdmF0ZV9zeW5jaHJvbm91c19vZmYpCisjCisKKworY2xhc3MgSW52YWxpZFN0cmluZyhzdHIpOgorICAgIGRlZiBfX21vZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgZnJvbSBkamFuZ28udGVtcGxhdGUuYmFzZSBpbXBvcnQgVGVtcGxhdGVTeW50YXhFcnJvcgorICAgICAgICByYWlzZSBUZW1wbGF0ZVN5bnRheEVycm9yKAorICAgICAgICAgICAgIlVuZGVmaW5lZCB2YXJpYWJsZSBvciB1bmtub3duIHZhbHVlIGZvcjogXCIlc1wiIiAlIG90aGVyKQorCitURU1QTEFURV9TVFJJTkdfSUZfSU5WQUxJRCA9IEludmFsaWRTdHJpbmcoIiVzIikKKworaW1wb3J0IHN5cworc3lzLnBhdGguYXBwZW5kKAorICAgIG9zLnBhdGguam9pbigKKyAgICBvcy5wYXRoLmpvaW4oCisgICAgICAgIG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKF9fZmlsZV9fKSkpLAorICAgICAgICAgICAgImNvbnRyaWIiKSwKKyAgICAgICAgICAgICJkamFuZ28tYWdncmVnYXRlLWlmLW1hc3RlciIpCisgICAgKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVybWFpbi91cmxzLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVybWFpbi91cmxzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMTU4OGEKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL3RvYXN0ZXJtYWluL3VybHMucHkKQEAgLTAsMCArMSw5MSBAQAorIworIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyMKKyMgQml0QmFrZSBUb2FzdGVyIEltcGxlbWVudGF0aW9uCisjCisjIENvcHlyaWdodCAoQykgMjAxMyAgICAgICAgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2Zyb20gZGphbmdvLmNvbmYudXJscyBpbXBvcnQgcGF0dGVybnMsIGluY2x1ZGUsIHVybAorZnJvbSBkamFuZ28udmlld3MuZ2VuZXJpYyBpbXBvcnQgUmVkaXJlY3RWaWV3Citmcm9tIGRqYW5nby52aWV3cy5kZWNvcmF0b3JzLmNhY2hlIGltcG9ydCBuZXZlcl9jYWNoZQorCitpbXBvcnQgbG9nZ2luZworCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigidG9hc3RlciIpCisKKyMgVW5jb21tZW50IHRoZSBuZXh0IHR3byBsaW5lcyB0byBlbmFibGUgdGhlIGFkbWluOgorZnJvbSBkamFuZ28uY29udHJpYiBpbXBvcnQgYWRtaW4KK2FkbWluLmF1dG9kaXNjb3ZlcigpCisKK3VybHBhdHRlcm5zID0gcGF0dGVybnMoJycsCisKKyAgICAjIEV4YW1wbGVzOgorICAgICMgdXJsKHInXnRvYXN0ZXIvJywgaW5jbHVkZSgndG9hc3Rlci5mb28udXJscycpKSwKKworICAgICMgVW5jb21tZW50IHRoZSBhZG1pbi9kb2MgbGluZSBiZWxvdyB0byBlbmFibGUgYWRtaW4gZG9jdW1lbnRhdGlvbjoKKyAgICAjIHVybChyJ15hZG1pbi9kb2MvJywgaW5jbHVkZSgnZGphbmdvLmNvbnRyaWIuYWRtaW5kb2NzLnVybHMnKSksCisKKworICAgICMgVGhpcyBpcyBoZXJlIHRvIG1haW50YWluIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYW5kIHdpbGwgYmUgZGVwcmVjYXRlZAorICAgICMgaW4gdGhlIGZ1dHVyZS4KKyAgICB1cmwocideb3JtL2V2ZW50ZmlsZSQnLCAnYmxkY29sbGVjdG9yLnZpZXdzLmV2ZW50ZmlsZScpLAorCisgICAgIyBpZiBubyBhcHBsaWNhdGlvbiBpcyBzZWxlY3RlZCwgd2UgaGF2ZSB0aGUgbWFnaWMgdG9hc3Rlcmd1aSBhcHAgaGVyZQorICAgIHVybChyJ14kJywgbmV2ZXJfY2FjaGUoUmVkaXJlY3RWaWV3LmFzX3ZpZXcodXJsPScvdG9hc3Rlcmd1aS8nKSkpLAorKQorCitpbXBvcnQgdG9hc3Rlcm1haW4uc2V0dGluZ3MKKworaWYgdG9hc3Rlcm1haW4uc2V0dGluZ3MuRlJFU0hfRU5BQkxFRDoKKyAgICB1cmxwYXR0ZXJucy5pbnNlcnQoMSwgdXJsKHInJywgaW5jbHVkZSgnZnJlc2gudXJscycpKSkKKyAgICAjbG9nZ2VyLmluZm8oIkVuYWJsZWQgZGphbmdvLWZyZXNoIGV4dGVuc2lvbiIpCisKK2lmIHRvYXN0ZXJtYWluLnNldHRpbmdzLkRFQlVHX1BBTkVMX0VOQUJMRUQ6CisgICAgaW1wb3J0IGRlYnVnX3Rvb2xiYXIKKyAgICB1cmxwYXR0ZXJucy5pbnNlcnQoMSwgdXJsKHInJywgaW5jbHVkZShkZWJ1Z190b29sYmFyLnVybHMpKSkKKyAgICAjbG9nZ2VyLmluZm8oIkVuYWJsZWQgZGphbmdvX3Rvb2xiYXIgZXh0ZW5zaW9uIikKKworCitpZiB0b2FzdGVybWFpbi5zZXR0aW5ncy5NQU5BR0VEOgorICAgIHVybHBhdHRlcm5zID0gWworICAgICAgICAjIFVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIGVuYWJsZSB0aGUgYWRtaW46CisgICAgICAgIHVybChyJ15hZG1pbi8nLCBpbmNsdWRlKGFkbWluLnNpdGUudXJscykpLAorICAgIF0gKyB1cmxwYXR0ZXJucworIyBBdXRvbWF0aWNhbGx5IGRpc2NvdmVyIHVybHMucHkgaW4gdmFyaW91cyBhcHBzLCBiZXNpZGUgb3VyIG93bgorIyBhbmQgbWFwIG1vZHVsZSBkaXJlY3RvcmllcyB0byB0aGUgcGF0dGVybnMKKworaW1wb3J0IG9zCitjdXJyZW50ZGlyID0gb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKQorZm9yIHQgaW4gb3Mud2Fsayhvcy5wYXRoLmRpcm5hbWUoY3VycmVudGRpcikpOgorICAgICNpZiB3ZSBoYXZlIGEgdmlydHVhbGVudiBza2lwIGl0IHRvIGF2b2lkIGluY29ycmVjdCBpbXBvcnRzCisgICAgaWYgb3MuZW52aXJvbi5oYXNfa2V5KCdWSVJUVUFMX0VOVicpIGFuZCBvcy5lbnZpcm9uWydWSVJUVUFMX0VOViddIGluIHRbMF06CisgICAgICAgIGNvbnRpbnVlCisKKyAgICBpZiAidXJscy5weSIgaW4gdFsyXSBhbmQgdFswXSAhPSBjdXJyZW50ZGlyOgorICAgICAgICBtb2R1bGVuYW1lID0gb3MucGF0aC5iYXNlbmFtZSh0WzBdKQorICAgICAgICAjIG1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIHRoaXMgbW9kdWxlIG5hbWUgaW4KKyAgICAgICAgY29uZmxpY3QgPSBGYWxzZQorICAgICAgICBmb3IgcCBpbiB1cmxwYXR0ZXJuczoKKyAgICAgICAgICAgIGlmIHAucmVnZXgucGF0dGVybiA9PSAnXicgKyBtb2R1bGVuYW1lICsgJy8nOgorICAgICAgICAgICAgICAgIGNvbmZsaWN0ID0gVHJ1ZQorICAgICAgICBpZiBub3QgY29uZmxpY3Q6CisgICAgICAgICAgICB1cmxwYXR0ZXJucy5pbnNlcnQoMCwgdXJsKHInXicgKyBtb2R1bGVuYW1lICsgJy8nLCBpbmNsdWRlICggbW9kdWxlbmFtZSArICcudXJscycpKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxvZ2dlci53YXJuKCJNb2R1bGUgXCclc1wnIGhhcyBhIHJlZ2V4cCBjb25mbGljdCwgd2FzIG5vdCBhZGRlZCB0byB0aGUgdXJscGF0dGVybnMiICUgbW9kdWxlbmFtZSkKKworZnJvbSBwcHJpbnQgaW1wb3J0IHBmb3JtYXQKKyNsb2dnZXIuZGVidWcoInVybHBhdHRlcm5zIGxpc3QgJXMiLCBwZm9ybWF0KHVybHBhdHRlcm5zKSkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcm1haW4vd3NnaS5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvdG9hc3Rlcm1haW4vd3NnaS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzFiMzE0Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci90b2FzdGVybWFpbi93c2dpLnB5CkBAIC0wLDAgKzEsMzUgQEAKKyIiIgorIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyMKK1dTR0kgY29uZmlnIGZvciBUb2FzdGVyIHByb2plY3QuCisKK1RoaXMgbW9kdWxlIGNvbnRhaW5zIHRoZSBXU0dJIGFwcGxpY2F0aW9uIHVzZWQgYnkgRGphbmdvJ3MgZGV2ZWxvcG1lbnQgc2VydmVyCithbmQgYW55IHByb2R1Y3Rpb24gV1NHSSBkZXBsb3ltZW50cy4gSXQgc2hvdWxkIGV4cG9zZSBhIG1vZHVsZS1sZXZlbCB2YXJpYWJsZQorbmFtZWQgYGBhcHBsaWNhdGlvbmBgLiBEamFuZ28ncyBgYHJ1bnNlcnZlcmBgIGFuZCBgYHJ1bmZjZ2lgYCBjb21tYW5kcyBkaXNjb3ZlcgordGhpcyBhcHBsaWNhdGlvbiB2aWEgdGhlIGBgV1NHSV9BUFBMSUNBVElPTmBgIHNldHRpbmcuCisKK1VzdWFsbHkgeW91IHdpbGwgaGF2ZSB0aGUgc3RhbmRhcmQgRGphbmdvIFdTR0kgYXBwbGljYXRpb24gaGVyZSwgYnV0IGl0IGFsc28KK21pZ2h0IG1ha2Ugc2Vuc2UgdG8gcmVwbGFjZSB0aGUgd2hvbGUgRGphbmdvIFdTR0kgYXBwbGljYXRpb24gd2l0aCBhIGN1c3RvbSBvbmUKK3RoYXQgbGF0ZXIgZGVsZWdhdGVzIHRvIHRoZSBEamFuZ28gb25lLiBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIGludHJvZHVjZSBXU0dJCittaWRkbGV3YXJlIGhlcmUsIG9yIGNvbWJpbmUgYSBEamFuZ28gYXBwbGljYXRpb24gd2l0aCBhbiBhcHBsaWNhdGlvbiBvZiBhbm90aGVyCitmcmFtZXdvcmsuCisKKyIiIgoraW1wb3J0IG9zCisKKyMgV2UgZGVmZXIgdG8gYSBESkFOR09fU0VUVElOR1NfTU9EVUxFIGFscmVhZHkgaW4gdGhlIGVudmlyb25tZW50LiBUaGlzIGJyZWFrcworIyBpZiBydW5uaW5nIG11bHRpcGxlIHNpdGVzIGluIHRoZSBzYW1lIG1vZF93c2dpIHByb2Nlc3MuIFRvIGZpeCB0aGlzLCB1c2UKKyMgbW9kX3dzZ2kgZGFlbW9uIG1vZGUgd2l0aCBlYWNoIHNpdGUgaW4gaXRzIG93biBkYWVtb24gcHJvY2Vzcywgb3IgdXNlCisjIG9zLmVudmlyb25bIkRKQU5HT19TRVRUSU5HU19NT0RVTEUiXSA9ICJUb2FzdGVyLnNldHRpbmdzIgorb3MuZW52aXJvbi5zZXRkZWZhdWx0KCJESkFOR09fU0VUVElOR1NfTU9EVUxFIiwgInRvYXN0ZXJtYWluLnNldHRpbmdzIikKKworIyBUaGlzIGFwcGxpY2F0aW9uIG9iamVjdCBpcyB1c2VkIGJ5IGFueSBXU0dJIHNlcnZlciBjb25maWd1cmVkIHRvIHVzZSB0aGlzCisjIGZpbGUuIFRoaXMgaW5jbHVkZXMgRGphbmdvJ3MgZGV2ZWxvcG1lbnQgc2VydmVyLCBpZiB0aGUgV1NHSV9BUFBMSUNBVElPTgorIyBzZXR0aW5nIHBvaW50cyBoZXJlLgorZnJvbSBkamFuZ28uY29yZS53c2dpIGltcG9ydCBnZXRfd3NnaV9hcHBsaWNhdGlvbgorYXBwbGljYXRpb24gPSBnZXRfd3NnaV9hcHBsaWNhdGlvbigpCisKKyMgQXBwbHkgV1NHSSBtaWRkbGV3YXJlIGhlcmUuCisjIGZyb20gaGVsbG93b3JsZC53c2dpIGltcG9ydCBIZWxsb1dvcmxkQXBwbGljYXRpb24KKyMgYXBwbGljYXRpb24gPSBIZWxsb1dvcmxkQXBwbGljYXRpb24oYXBwbGljYXRpb24pCmRpZmYgLS1naXQgYS9iaXRiYWtlL3RvYXN0ZXItcmVxdWlyZW1lbnRzLnR4dCBiL2JpdGJha2UvdG9hc3Rlci1yZXF1aXJlbWVudHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YjUyOTMKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL3RvYXN0ZXItcmVxdWlyZW1lbnRzLnR4dApAQCAtMCwwICsxLDQgQEAKK0RqYW5nbz09MS42CitTb3V0aD09MC44LjQKK2FyZ3BhcnNlPT0xLjIuMQord3NnaXJlZj09MC4xLjIK