IyAtKi0gY29kaW5nOiBsYXRpbi0xIC0qLQ0KDQoiIiJIZWFwIHF1ZXVlIGFsZ29yaXRobSAoYS5rLmEuIHByaW9yaXR5IHF1ZXVlKS4NCg0KSGVhcHMgYXJlIGFycmF5cyBmb3Igd2hpY2ggYVtrXSA8PSBhWzIqaysxXSBhbmQgYVtrXSA8PSBhWzIqaysyXSBmb3INCmFsbCBrLCBjb3VudGluZyBlbGVtZW50cyBmcm9tIDAuICBGb3IgdGhlIHNha2Ugb2YgY29tcGFyaXNvbiwNCm5vbi1leGlzdGluZyBlbGVtZW50cyBhcmUgY29uc2lkZXJlZCB0byBiZSBpbmZpbml0ZS4gIFRoZSBpbnRlcmVzdGluZw0KcHJvcGVydHkgb2YgYSBoZWFwIGlzIHRoYXQgYVswXSBpcyBhbHdheXMgaXRzIHNtYWxsZXN0IGVsZW1lbnQuDQoNClVzYWdlOg0KDQpoZWFwID0gW10gICAgICAgICAgICAjIGNyZWF0ZXMgYW4gZW1wdHkgaGVhcA0KaGVhcHB1c2goaGVhcCwgaXRlbSkgIyBwdXNoZXMgYSBuZXcgaXRlbSBvbiB0aGUgaGVhcA0KaXRlbSA9IGhlYXBwb3AoaGVhcCkgIyBwb3BzIHRoZSBzbWFsbGVzdCBpdGVtIGZyb20gdGhlIGhlYXANCml0ZW0gPSBoZWFwWzBdICAgICAgICMgc21hbGxlc3QgaXRlbSBvbiB0aGUgaGVhcCB3aXRob3V0IHBvcHBpbmcgaXQNCmhlYXBpZnkoeCkgICAgICAgICAgICMgdHJhbnNmb3JtcyBsaXN0IGludG8gYSBoZWFwLCBpbi1wbGFjZSwgaW4gbGluZWFyIHRpbWUNCml0ZW0gPSBoZWFwcmVwbGFjZShoZWFwLCBpdGVtKSAjIHBvcHMgYW5kIHJldHVybnMgc21hbGxlc3QgaXRlbSwgYW5kIGFkZHMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5ldyBpdGVtOyB0aGUgaGVhcCBzaXplIGlzIHVuY2hhbmdlZA0KDQpPdXIgQVBJIGRpZmZlcnMgZnJvbSB0ZXh0Ym9vayBoZWFwIGFsZ29yaXRobXMgYXMgZm9sbG93czoNCg0KLSBXZSB1c2UgMC1iYXNlZCBpbmRleGluZy4gIFRoaXMgbWFrZXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZQ0KICBpbmRleCBmb3IgYSBub2RlIGFuZCB0aGUgaW5kZXhlcyBmb3IgaXRzIGNoaWxkcmVuIHNsaWdodGx5IGxlc3MNCiAgb2J2aW91cywgYnV0IGlzIG1vcmUgc3VpdGFibGUgc2luY2UgUHl0aG9uIHVzZXMgMC1iYXNlZCBpbmRleGluZy4NCg0KLSBPdXIgaGVhcHBvcCgpIG1ldGhvZCByZXR1cm5zIHRoZSBzbWFsbGVzdCBpdGVtLCBub3QgdGhlIGxhcmdlc3QuDQoNClRoZXNlIHR3byBtYWtlIGl0IHBvc3NpYmxlIHRvIHZpZXcgdGhlIGhlYXAgYXMgYSByZWd1bGFyIFB5dGhvbiBsaXN0DQp3aXRob3V0IHN1cnByaXNlczogaGVhcFswXSBpcyB0aGUgc21hbGxlc3QgaXRlbSwgYW5kIGhlYXAuc29ydCgpDQptYWludGFpbnMgdGhlIGhlYXAgaW52YXJpYW50IQ0KIiIiDQoNCiMgT3JpZ2luYWwgY29kZSBieSBLZXZpbiBPJ0Nvbm5vciwgYXVnbWVudGVkIGJ5IFRpbSBQZXRlcnMgYW5kIFJheW1vbmQgSGV0dGluZ2VyDQoNCl9fYWJvdXRfXyA9ICIiIkhlYXAgcXVldWVzDQoNCltleHBsYW5hdGlvbiBieSBGcmFu529pcyBQaW5hcmRdDQoNCkhlYXBzIGFyZSBhcnJheXMgZm9yIHdoaWNoIGFba10gPD0gYVsyKmsrMV0gYW5kIGFba10gPD0gYVsyKmsrMl0gZm9yDQphbGwgaywgY291bnRpbmcgZWxlbWVudHMgZnJvbSAwLiAgRm9yIHRoZSBzYWtlIG9mIGNvbXBhcmlzb24sDQpub24tZXhpc3RpbmcgZWxlbWVudHMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgaW5maW5pdGUuICBUaGUgaW50ZXJlc3RpbmcNCnByb3BlcnR5IG9mIGEgaGVhcCBpcyB0aGF0IGFbMF0gaXMgYWx3YXlzIGl0cyBzbWFsbGVzdCBlbGVtZW50Lg0KDQpUaGUgc3RyYW5nZSBpbnZhcmlhbnQgYWJvdmUgaXMgbWVhbnQgdG8gYmUgYW4gZWZmaWNpZW50IG1lbW9yeQ0KcmVwcmVzZW50YXRpb24gZm9yIGEgdG91cm5hbWVudC4gIFRoZSBudW1iZXJzIGJlbG93IGFyZSBgaycsIG5vdCBhW2tdOg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDANCg0KICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDINCg0KICAgICAgICAgIDMgICAgICAgICAgICAgICA0ICAgICAgICAgICAgICAgIDUgICAgICAgICAgICAgICA2DQoNCiAgICAgIDcgICAgICAgOCAgICAgICA5ICAgICAgIDEwICAgICAgMTEgICAgICAxMiAgICAgIDEzICAgICAgMTQNCg0KICAgIDE1IDE2ICAgMTcgMTggICAxOSAyMCAgIDIxIDIyICAgMjMgMjQgICAyNSAyNiAgIDI3IDI4ICAgMjkgMzANCg0KDQpJbiB0aGUgdHJlZSBhYm92ZSwgZWFjaCBjZWxsIGBrJyBpcyB0b3BwaW5nIGAyKmsrMScgYW5kIGAyKmsrMicuICBJbg0KYW4gdXN1YWwgYmluYXJ5IHRvdXJuYW1lbnQgd2Ugc2VlIGluIHNwb3J0cywgZWFjaCBjZWxsIGlzIHRoZSB3aW5uZXINCm92ZXIgdGhlIHR3byBjZWxscyBpdCB0b3BzLCBhbmQgd2UgY2FuIHRyYWNlIHRoZSB3aW5uZXIgZG93biB0aGUgdHJlZQ0KdG8gc2VlIGFsbCBvcHBvbmVudHMgcy9oZSBoYWQuICBIb3dldmVyLCBpbiBtYW55IGNvbXB1dGVyIGFwcGxpY2F0aW9ucw0Kb2Ygc3VjaCB0b3VybmFtZW50cywgd2UgZG8gbm90IG5lZWQgdG8gdHJhY2UgdGhlIGhpc3Rvcnkgb2YgYSB3aW5uZXIuDQpUbyBiZSBtb3JlIG1lbW9yeSBlZmZpY2llbnQsIHdoZW4gYSB3aW5uZXIgaXMgcHJvbW90ZWQsIHdlIHRyeSB0bw0KcmVwbGFjZSBpdCBieSBzb21ldGhpbmcgZWxzZSBhdCBhIGxvd2VyIGxldmVsLCBhbmQgdGhlIHJ1bGUgYmVjb21lcw0KdGhhdCBhIGNlbGwgYW5kIHRoZSB0d28gY2VsbHMgaXQgdG9wcyBjb250YWluIHRocmVlIGRpZmZlcmVudCBpdGVtcywNCmJ1dCB0aGUgdG9wIGNlbGwgIndpbnMiIG92ZXIgdGhlIHR3byB0b3BwZWQgY2VsbHMuDQoNCklmIHRoaXMgaGVhcCBpbnZhcmlhbnQgaXMgcHJvdGVjdGVkIGF0IGFsbCB0aW1lLCBpbmRleCAwIGlzIGNsZWFybHkNCnRoZSBvdmVyYWxsIHdpbm5lci4gIFRoZSBzaW1wbGVzdCBhbGdvcml0aG1pYyB3YXkgdG8gcmVtb3ZlIGl0IGFuZA0KZmluZCB0aGUgIm5leHQiIHdpbm5lciBpcyB0byBtb3ZlIHNvbWUgbG9zZXIgKGxldCdzIHNheSBjZWxsIDMwIGluIHRoZQ0KZGlhZ3JhbSBhYm92ZSkgaW50byB0aGUgMCBwb3NpdGlvbiwgYW5kIHRoZW4gcGVyY29sYXRlIHRoaXMgbmV3IDAgZG93bg0KdGhlIHRyZWUsIGV4Y2hhbmdpbmcgdmFsdWVzLCB1bnRpbCB0aGUgaW52YXJpYW50IGlzIHJlLWVzdGFibGlzaGVkLg0KVGhpcyBpcyBjbGVhcmx5IGxvZ2FyaXRobWljIG9uIHRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHRyZWUuDQpCeSBpdGVyYXRpbmcgb3ZlciBhbGwgaXRlbXMsIHlvdSBnZXQgYW4gTyhuIGxuIG4pIHNvcnQuDQoNCkEgbmljZSBmZWF0dXJlIG9mIHRoaXMgc29ydCBpcyB0aGF0IHlvdSBjYW4gZWZmaWNpZW50bHkgaW5zZXJ0IG5ldw0KaXRlbXMgd2hpbGUgdGhlIHNvcnQgaXMgZ29pbmcgb24sIHByb3ZpZGVkIHRoYXQgdGhlIGluc2VydGVkIGl0ZW1zIGFyZQ0Kbm90ICJiZXR0ZXIiIHRoYW4gdGhlIGxhc3QgMCd0aCBlbGVtZW50IHlvdSBleHRyYWN0ZWQuICBUaGlzIGlzDQplc3BlY2lhbGx5IHVzZWZ1bCBpbiBzaW11bGF0aW9uIGNvbnRleHRzLCB3aGVyZSB0aGUgdHJlZSBob2xkcyBhbGwNCmluY29taW5nIGV2ZW50cywgYW5kIHRoZSAid2luIiBjb25kaXRpb24gbWVhbnMgdGhlIHNtYWxsZXN0IHNjaGVkdWxlZA0KdGltZS4gIFdoZW4gYW4gZXZlbnQgc2NoZWR1bGUgb3RoZXIgZXZlbnRzIGZvciBleGVjdXRpb24sIHRoZXkgYXJlDQpzY2hlZHVsZWQgaW50byB0aGUgZnV0dXJlLCBzbyB0aGV5IGNhbiBlYXNpbHkgZ28gaW50byB0aGUgaGVhcC4gIFNvLCBhDQpoZWFwIGlzIGEgZ29vZCBzdHJ1Y3R1cmUgZm9yIGltcGxlbWVudGluZyBzY2hlZHVsZXJzICh0aGlzIGlzIHdoYXQgSQ0KdXNlZCBmb3IgbXkgTUlESSBzZXF1ZW5jZXIgOi0pLg0KDQpWYXJpb3VzIHN0cnVjdHVyZXMgZm9yIGltcGxlbWVudGluZyBzY2hlZHVsZXJzIGhhdmUgYmVlbiBleHRlbnNpdmVseQ0Kc3R1ZGllZCwgYW5kIGhlYXBzIGFyZSBnb29kIGZvciB0aGlzLCBhcyB0aGV5IGFyZSByZWFzb25hYmx5IHNwZWVkeSwNCnRoZSBzcGVlZCBpcyBhbG1vc3QgY29uc3RhbnQsIGFuZCB0aGUgd29yc3QgY2FzZSBpcyBub3QgbXVjaCBkaWZmZXJlbnQNCnRoYW4gdGhlIGF2ZXJhZ2UgY2FzZS4gIEhvd2V2ZXIsIHRoZXJlIGFyZSBvdGhlciByZXByZXNlbnRhdGlvbnMgd2hpY2gNCmFyZSBtb3JlIGVmZmljaWVudCBvdmVyYWxsLCB5ZXQgdGhlIHdvcnN0IGNhc2VzIG1pZ2h0IGJlIHRlcnJpYmxlLg0KDQpIZWFwcyBhcmUgYWxzbyB2ZXJ5IHVzZWZ1bCBpbiBiaWcgZGlzayBzb3J0cy4gIFlvdSBtb3N0IHByb2JhYmx5IGFsbA0Ka25vdyB0aGF0IGEgYmlnIHNvcnQgaW1wbGllcyBwcm9kdWNpbmcgInJ1bnMiICh3aGljaCBhcmUgcHJlLXNvcnRlZA0Kc2VxdWVuY2VzLCB3aGljaCBzaXplIGlzIHVzdWFsbHkgcmVsYXRlZCB0byB0aGUgYW1vdW50IG9mIENQVSBtZW1vcnkpLA0KZm9sbG93ZWQgYnkgYSBtZXJnaW5nIHBhc3NlcyBmb3IgdGhlc2UgcnVucywgd2hpY2ggbWVyZ2luZyBpcyBvZnRlbg0KdmVyeSBjbGV2ZXJseSBvcmdhbmlzZWRbMV0uICBJdCBpcyB2ZXJ5IGltcG9ydGFudCB0aGF0IHRoZSBpbml0aWFsDQpzb3J0IHByb2R1Y2VzIHRoZSBsb25nZXN0IHJ1bnMgcG9zc2libGUuICBUb3VybmFtZW50cyBhcmUgYSBnb29kIHdheQ0KdG8gdGhhdC4gIElmLCB1c2luZyBhbGwgdGhlIG1lbW9yeSBhdmFpbGFibGUgdG8gaG9sZCBhIHRvdXJuYW1lbnQsIHlvdQ0KcmVwbGFjZSBhbmQgcGVyY29sYXRlIGl0ZW1zIHRoYXQgaGFwcGVuIHRvIGZpdCB0aGUgY3VycmVudCBydW4sIHlvdSdsbA0KcHJvZHVjZSBydW5zIHdoaWNoIGFyZSB0d2ljZSB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGZvciByYW5kb20gaW5wdXQsDQphbmQgbXVjaCBiZXR0ZXIgZm9yIGlucHV0IGZ1enppbHkgb3JkZXJlZC4NCg0KTW9yZW92ZXIsIGlmIHlvdSBvdXRwdXQgdGhlIDAndGggaXRlbSBvbiBkaXNrIGFuZCBnZXQgYW4gaW5wdXQgd2hpY2gNCm1heSBub3QgZml0IGluIHRoZSBjdXJyZW50IHRvdXJuYW1lbnQgKGJlY2F1c2UgdGhlIHZhbHVlICJ3aW5zIiBvdmVyDQp0aGUgbGFzdCBvdXRwdXQgdmFsdWUpLCBpdCBjYW5ub3QgZml0IGluIHRoZSBoZWFwLCBzbyB0aGUgc2l6ZSBvZiB0aGUNCmhlYXAgZGVjcmVhc2VzLiAgVGhlIGZyZWVkIG1lbW9yeSBjb3VsZCBiZSBjbGV2ZXJseSByZXVzZWQgaW1tZWRpYXRlbHkNCmZvciBwcm9ncmVzc2l2ZWx5IGJ1aWxkaW5nIGEgc2Vjb25kIGhlYXAsIHdoaWNoIGdyb3dzIGF0IGV4YWN0bHkgdGhlDQpzYW1lIHJhdGUgdGhlIGZpcnN0IGhlYXAgaXMgbWVsdGluZy4gIFdoZW4gdGhlIGZpcnN0IGhlYXAgY29tcGxldGVseQ0KdmFuaXNoZXMsIHlvdSBzd2l0Y2ggaGVhcHMgYW5kIHN0YXJ0IGEgbmV3IHJ1bi4gIENsZXZlciBhbmQgcXVpdGUNCmVmZmVjdGl2ZSENCg0KSW4gYSB3b3JkLCBoZWFwcyBhcmUgdXNlZnVsIG1lbW9yeSBzdHJ1Y3R1cmVzIHRvIGtub3cuICBJIHVzZSB0aGVtIGluDQphIGZldyBhcHBsaWNhdGlvbnMsIGFuZCBJIHRoaW5rIGl0IGlzIGdvb2QgdG8ga2VlcCBhIGBoZWFwJyBtb2R1bGUNCmFyb3VuZC4gOi0pDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tDQpbMV0gVGhlIGRpc2sgYmFsYW5jaW5nIGFsZ29yaXRobXMgd2hpY2ggYXJlIGN1cnJlbnQsIG5vd2FkYXlzLCBhcmUNCm1vcmUgYW5ub3lpbmcgdGhhbiBjbGV2ZXIsIGFuZCB0aGlzIGlzIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHNlZWtpbmcNCmNhcGFiaWxpdGllcyBvZiB0aGUgZGlza3MuICBPbiBkZXZpY2VzIHdoaWNoIGNhbm5vdCBzZWVrLCBsaWtlIGJpZw0KdGFwZSBkcml2ZXMsIHRoZSBzdG9yeSB3YXMgcXVpdGUgZGlmZmVyZW50LCBhbmQgb25lIGhhZCB0byBiZSB2ZXJ5DQpjbGV2ZXIgdG8gZW5zdXJlIChmYXIgaW4gYWR2YW5jZSkgdGhhdCBlYWNoIHRhcGUgbW92ZW1lbnQgd2lsbCBiZSB0aGUNCm1vc3QgZWZmZWN0aXZlIHBvc3NpYmxlICh0aGF0IGlzLCB3aWxsIGJlc3QgcGFydGljaXBhdGUgYXQNCiJwcm9ncmVzc2luZyIgdGhlIG1lcmdlKS4gIFNvbWUgdGFwZXMgd2VyZSBldmVuIGFibGUgdG8gcmVhZA0KYmFja3dhcmRzLCBhbmQgdGhpcyB3YXMgYWxzbyB1c2VkIHRvIGF2b2lkIHRoZSByZXdpbmRpbmcgdGltZS4NCkJlbGlldmUgbWUsIHJlYWwgZ29vZCB0YXBlIHNvcnRzIHdlcmUgcXVpdGUgc3BlY3RhY3VsYXIgdG8gd2F0Y2ghDQpGcm9tIGFsbCB0aW1lcywgc29ydGluZyBoYXMgYWx3YXlzIGJlZW4gYSBHcmVhdCBBcnQhIDotKQ0KIiIiDQoNCl9fYWxsX18gPSBbJ2hlYXBwdXNoJywgJ2hlYXBwb3AnLCAnaGVhcGlmeScsICdoZWFwcmVwbGFjZScsICdtZXJnZScsDQogICAgICAgICAgICdubGFyZ2VzdCcsICduc21hbGxlc3QnLCAnaGVhcHB1c2hwb3AnXQ0KDQpmcm9tIGl0ZXJ0b29scyBpbXBvcnQgaXNsaWNlLCByZXBlYXQsIGNvdW50LCBpbWFwLCBpemlwLCB0ZWUsIGNoYWluDQpmcm9tIG9wZXJhdG9yIGltcG9ydCBpdGVtZ2V0dGVyDQppbXBvcnQgYmlzZWN0DQoNCmRlZiBjbXBfbHQoeCwgeSk6DQogICAgIyBVc2UgX19sdF9fIGlmIGF2YWlsYWJsZTsgb3RoZXJ3aXNlLCB0cnkgX19sZV9fLg0KICAgICMgSW4gUHkzLngsIG9ubHkgX19sdF9fIHdpbGwgYmUgY2FsbGVkLg0KICAgIHJldHVybiAoeCA8IHkpIGlmIGhhc2F0dHIoeCwgJ19fbHRfXycpIGVsc2UgKG5vdCB5IDw9IHgpDQoNCmRlZiBoZWFwcHVzaChoZWFwLCBpdGVtKToNCiAgICAiIiJQdXNoIGl0ZW0gb250byBoZWFwLCBtYWludGFpbmluZyB0aGUgaGVhcCBpbnZhcmlhbnQuIiIiDQogICAgaGVhcC5hcHBlbmQoaXRlbSkNCiAgICBfc2lmdGRvd24oaGVhcCwgMCwgbGVuKGhlYXApLTEpDQoNCmRlZiBoZWFwcG9wKGhlYXApOg0KICAgICIiIlBvcCB0aGUgc21hbGxlc3QgaXRlbSBvZmYgdGhlIGhlYXAsIG1haW50YWluaW5nIHRoZSBoZWFwIGludmFyaWFudC4iIiINCiAgICBsYXN0ZWx0ID0gaGVhcC5wb3AoKSAgICAjIHJhaXNlcyBhcHByb3ByaWF0ZSBJbmRleEVycm9yIGlmIGhlYXAgaXMgZW1wdHkNCiAgICBpZiBoZWFwOg0KICAgICAgICByZXR1cm5pdGVtID0gaGVhcFswXQ0KICAgICAgICBoZWFwWzBdID0gbGFzdGVsdA0KICAgICAgICBfc2lmdHVwKGhlYXAsIDApDQogICAgZWxzZToNCiAgICAgICAgcmV0dXJuaXRlbSA9IGxhc3RlbHQNCiAgICByZXR1cm4gcmV0dXJuaXRlbQ0KDQpkZWYgaGVhcHJlcGxhY2UoaGVhcCwgaXRlbSk6DQogICAgIiIiUG9wIGFuZCByZXR1cm4gdGhlIGN1cnJlbnQgc21hbGxlc3QgdmFsdWUsIGFuZCBhZGQgdGhlIG5ldyBpdGVtLg0KDQogICAgVGhpcyBpcyBtb3JlIGVmZmljaWVudCB0aGFuIGhlYXBwb3AoKSBmb2xsb3dlZCBieSBoZWFwcHVzaCgpLCBhbmQgY2FuIGJlDQogICAgbW9yZSBhcHByb3ByaWF0ZSB3aGVuIHVzaW5nIGEgZml4ZWQtc2l6ZSBoZWFwLiAgTm90ZSB0aGF0IHRoZSB2YWx1ZQ0KICAgIHJldHVybmVkIG1heSBiZSBsYXJnZXIgdGhhbiBpdGVtISAgVGhhdCBjb25zdHJhaW5zIHJlYXNvbmFibGUgdXNlcyBvZg0KICAgIHRoaXMgcm91dGluZSB1bmxlc3Mgd3JpdHRlbiBhcyBwYXJ0IG9mIGEgY29uZGl0aW9uYWwgcmVwbGFjZW1lbnQ6DQoNCiAgICAgICAgaWYgaXRlbSA+IGhlYXBbMF06DQogICAgICAgICAgICBpdGVtID0gaGVhcHJlcGxhY2UoaGVhcCwgaXRlbSkNCiAgICAiIiINCiAgICByZXR1cm5pdGVtID0gaGVhcFswXSAgICAjIHJhaXNlcyBhcHByb3ByaWF0ZSBJbmRleEVycm9yIGlmIGhlYXAgaXMgZW1wdHkNCiAgICBoZWFwWzBdID0gaXRlbQ0KICAgIF9zaWZ0dXAoaGVhcCwgMCkNCiAgICByZXR1cm4gcmV0dXJuaXRlbQ0KDQpkZWYgaGVhcHB1c2hwb3AoaGVhcCwgaXRlbSk6DQogICAgIiIiRmFzdCB2ZXJzaW9uIG9mIGEgaGVhcHB1c2ggZm9sbG93ZWQgYnkgYSBoZWFwcG9wLiIiIg0KICAgIGlmIGhlYXAgYW5kIGNtcF9sdChoZWFwWzBdLCBpdGVtKToNCiAgICAgICAgaXRlbSwgaGVhcFswXSA9IGhlYXBbMF0sIGl0ZW0NCiAgICAgICAgX3NpZnR1cChoZWFwLCAwKQ0KICAgIHJldHVybiBpdGVtDQoNCmRlZiBoZWFwaWZ5KHgpOg0KICAgICIiIlRyYW5zZm9ybSBsaXN0IGludG8gYSBoZWFwLCBpbi1wbGFjZSwgaW4gTyhsZW4oeCkpIHRpbWUuIiIiDQogICAgbiA9IGxlbih4KQ0KICAgICMgVHJhbnNmb3JtIGJvdHRvbS11cC4gIFRoZSBsYXJnZXN0IGluZGV4IHRoZXJlJ3MgYW55IHBvaW50IHRvIGxvb2tpbmcgYXQNCiAgICAjIGlzIHRoZSBsYXJnZXN0IHdpdGggYSBjaGlsZCBpbmRleCBpbi1yYW5nZSwgc28gbXVzdCBoYXZlIDIqaSArIDEgPCBuLA0KICAgICMgb3IgaSA8IChuLTEpLzIuICBJZiBuIGlzIGV2ZW4gPSAyKmosIHRoaXMgaXMgKDIqai0xKS8yID0gai0xLzIgc28NCiAgICAjIGotMSBpcyB0aGUgbGFyZ2VzdCwgd2hpY2ggaXMgbi8vMiAtIDEuICBJZiBuIGlzIG9kZCA9IDIqaisxLCB0aGlzIGlzDQogICAgIyAoMipqKzEtMSkvMiA9IGogc28gai0xIGlzIHRoZSBsYXJnZXN0LCBhbmQgdGhhdCdzIGFnYWluIG4vLzItMS4NCiAgICBmb3IgaSBpbiByZXZlcnNlZCh4cmFuZ2Uobi8vMikpOg0KICAgICAgICBfc2lmdHVwKHgsIGkpDQoNCmRlZiBubGFyZ2VzdChuLCBpdGVyYWJsZSk6DQogICAgIiIiRmluZCB0aGUgbiBsYXJnZXN0IGVsZW1lbnRzIGluIGEgZGF0YXNldC4NCg0KICAgIEVxdWl2YWxlbnQgdG86ICBzb3J0ZWQoaXRlcmFibGUsIHJldmVyc2U9VHJ1ZSlbOm5dDQogICAgIiIiDQogICAgaXQgPSBpdGVyKGl0ZXJhYmxlKQ0KICAgIHJlc3VsdCA9IGxpc3QoaXNsaWNlKGl0LCBuKSkNCiAgICBpZiBub3QgcmVzdWx0Og0KICAgICAgICByZXR1cm4gcmVzdWx0DQogICAgaGVhcGlmeShyZXN1bHQpDQogICAgX2hlYXBwdXNocG9wID0gaGVhcHB1c2hwb3ANCiAgICBmb3IgZWxlbSBpbiBpdDoNCiAgICAgICAgX2hlYXBwdXNocG9wKHJlc3VsdCwgZWxlbSkNCiAgICByZXN1bHQuc29ydChyZXZlcnNlPVRydWUpDQogICAgcmV0dXJuIHJlc3VsdA0KDQpkZWYgbnNtYWxsZXN0KG4sIGl0ZXJhYmxlKToNCiAgICAiIiJGaW5kIHRoZSBuIHNtYWxsZXN0IGVsZW1lbnRzIGluIGEgZGF0YXNldC4NCg0KICAgIEVxdWl2YWxlbnQgdG86ICBzb3J0ZWQoaXRlcmFibGUpWzpuXQ0KICAgICIiIg0KICAgIGlmIGhhc2F0dHIoaXRlcmFibGUsICdfX2xlbl9fJykgYW5kIG4gKiAxMCA8PSBsZW4oaXRlcmFibGUpOg0KICAgICAgICAjIEZvciBzbWFsbGVyIHZhbHVlcyBvZiBuLCB0aGUgYmlzZWN0IG1ldGhvZCBpcyBmYXN0ZXIgdGhhbiBhIG1pbmhlYXAuDQogICAgICAgICMgSXQgaXMgYWxzbyBtZW1vcnkgZWZmaWNpZW50LCBjb25zdW1pbmcgb25seSBuIGVsZW1lbnRzIG9mIHNwYWNlLg0KICAgICAgICBpdCA9IGl0ZXIoaXRlcmFibGUpDQogICAgICAgIHJlc3VsdCA9IHNvcnRlZChpc2xpY2UoaXQsIDAsIG4pKQ0KICAgICAgICBpZiBub3QgcmVzdWx0Og0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdA0KICAgICAgICBpbnNvcnQgPSBiaXNlY3QuaW5zb3J0DQogICAgICAgIHBvcCA9IHJlc3VsdC5wb3ANCiAgICAgICAgbG9zID0gcmVzdWx0Wy0xXSAgICAjIGxvcyAtLT4gTGFyZ2VzdCBvZiB0aGUgbnNtYWxsZXN0DQogICAgICAgIGZvciBlbGVtIGluIGl0Og0KICAgICAgICAgICAgaWYgY21wX2x0KGVsZW0sIGxvcyk6DQogICAgICAgICAgICAgICAgaW5zb3J0KHJlc3VsdCwgZWxlbSkNCiAgICAgICAgICAgICAgICBwb3AoKQ0KICAgICAgICAgICAgICAgIGxvcyA9IHJlc3VsdFstMV0NCiAgICAgICAgcmV0dXJuIHJlc3VsdA0KICAgICMgQW4gYWx0ZXJuYXRpdmUgYXBwcm9hY2ggbWFuaWZlc3RzIHRoZSB3aG9sZSBpdGVyYWJsZSBpbiBtZW1vcnkgYnV0DQogICAgIyBzYXZlcyBjb21wYXJpc29ucyBieSBoZWFwaWZ5aW5nIGFsbCBhdCBvbmNlLiAgQWxzbywgc2F2ZXMgdGltZQ0KICAgICMgb3ZlciBiaXNlY3QuaW5zb3J0KCkgd2hpY2ggaGFzIE8obikgZGF0YSBtb3ZlbWVudCB0aW1lIGZvciBldmVyeQ0KICAgICMgaW5zZXJ0aW9uLiAgRmluZGluZyB0aGUgbiBzbWFsbGVzdCBvZiBhbiBtIGxlbmd0aCBpdGVyYWJsZSByZXF1aXJlcw0KICAgICMgICAgTyhtKSArIE8obiBsb2cgbSkgY29tcGFyaXNvbnMuDQogICAgaCA9IGxpc3QoaXRlcmFibGUpDQogICAgaGVhcGlmeShoKQ0KICAgIHJldHVybiBtYXAoaGVhcHBvcCwgcmVwZWF0KGgsIG1pbihuLCBsZW4oaCkpKSkNCg0KIyAnaGVhcCcgaXMgYSBoZWFwIGF0IGFsbCBpbmRpY2VzID49IHN0YXJ0cG9zLCBleGNlcHQgcG9zc2libHkgZm9yIHBvcy4gIHBvcw0KIyBpcyB0aGUgaW5kZXggb2YgYSBsZWFmIHdpdGggYSBwb3NzaWJseSBvdXQtb2Ytb3JkZXIgdmFsdWUuICBSZXN0b3JlIHRoZQ0KIyBoZWFwIGludmFyaWFudC4NCmRlZiBfc2lmdGRvd24oaGVhcCwgc3RhcnRwb3MsIHBvcyk6DQogICAgbmV3aXRlbSA9IGhlYXBbcG9zXQ0KICAgICMgRm9sbG93IHRoZSBwYXRoIHRvIHRoZSByb290LCBtb3ZpbmcgcGFyZW50cyBkb3duIHVudGlsIGZpbmRpbmcgYSBwbGFjZQ0KICAgICMgbmV3aXRlbSBmaXRzLg0KICAgIHdoaWxlIHBvcyA+IHN0YXJ0cG9zOg0KICAgICAgICBwYXJlbnRwb3MgPSAocG9zIC0gMSkgPj4gMQ0KICAgICAgICBwYXJlbnQgPSBoZWFwW3BhcmVudHBvc10NCiAgICAgICAgaWYgY21wX2x0KG5ld2l0ZW0sIHBhcmVudCk6DQogICAgICAgICAgICBoZWFwW3Bvc10gPSBwYXJlbnQNCiAgICAgICAgICAgIHBvcyA9IHBhcmVudHBvcw0KICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgYnJlYWsNCiAgICBoZWFwW3Bvc10gPSBuZXdpdGVtDQoNCiMgVGhlIGNoaWxkIGluZGljZXMgb2YgaGVhcCBpbmRleCBwb3MgYXJlIGFscmVhZHkgaGVhcHMsIGFuZCB3ZSB3YW50IHRvIG1ha2UNCiMgYSBoZWFwIGF0IGluZGV4IHBvcyB0b28uICBXZSBkbyB0aGlzIGJ5IGJ1YmJsaW5nIHRoZSBzbWFsbGVyIGNoaWxkIG9mDQojIHBvcyB1cCAoYW5kIHNvIG9uIHdpdGggdGhhdCBjaGlsZCdzIGNoaWxkcmVuLCBldGMpIHVudGlsIGhpdHRpbmcgYSBsZWFmLA0KIyB0aGVuIHVzaW5nIF9zaWZ0ZG93biB0byBtb3ZlIHRoZSBvZGRiYWxsIG9yaWdpbmFsbHkgYXQgaW5kZXggcG9zIGludG8gcGxhY2UuDQojDQojIFdlICpjb3VsZCogYnJlYWsgb3V0IG9mIHRoZSBsb29wIGFzIHNvb24gYXMgd2UgZmluZCBhIHBvcyB3aGVyZSBuZXdpdGVtIDw9DQojIGJvdGggaXRzIGNoaWxkcmVuLCBidXQgdHVybnMgb3V0IHRoYXQncyBub3QgYSBnb29kIGlkZWEsIGFuZCBkZXNwaXRlIHRoYXQNCiMgbWFueSBib29rcyB3cml0ZSB0aGUgYWxnb3JpdGhtIHRoYXQgd2F5LiAgRHVyaW5nIGEgaGVhcCBwb3AsIHRoZSBsYXN0IGFycmF5DQojIGVsZW1lbnQgaXMgc2lmdGVkIGluLCBhbmQgdGhhdCB0ZW5kcyB0byBiZSBsYXJnZSwgc28gdGhhdCBjb21wYXJpbmcgaXQNCiMgYWdhaW5zdCB2YWx1ZXMgc3RhcnRpbmcgZnJvbSB0aGUgcm9vdCB1c3VhbGx5IGRvZXNuJ3QgcGF5ICg9IHVzdWFsbHkgZG9lc24ndA0KIyBnZXQgdXMgb3V0IG9mIHRoZSBsb29wIGVhcmx5KS4gIFNlZSBLbnV0aCwgVm9sdW1lIDMsIHdoZXJlIHRoaXMgaXMNCiMgZXhwbGFpbmVkIGFuZCBxdWFudGlmaWVkIGluIGFuIGV4ZXJjaXNlLg0KIw0KIyBDdXR0aW5nIHRoZSAjIG9mIGNvbXBhcmlzb25zIGlzIGltcG9ydGFudCwgc2luY2UgdGhlc2Ugcm91dGluZXMgaGF2ZSBubw0KIyB3YXkgdG8gZXh0cmFjdCAidGhlIHByaW9yaXR5IiBmcm9tIGFuIGFycmF5IGVsZW1lbnQsIHNvIHRoYXQgaW50ZWxsaWdlbmNlDQojIGlzIGxpa2VseSB0byBiZSBoaWRpbmcgaW4gY3VzdG9tIF9fY21wX18gbWV0aG9kcywgb3IgaW4gYXJyYXkgZWxlbWVudHMNCiMgc3RvcmluZyAocHJpb3JpdHksIHJlY29yZCkgdHVwbGVzLiAgQ29tcGFyaXNvbnMgYXJlIHRodXMgcG90ZW50aWFsbHkNCiMgZXhwZW5zaXZlLg0KIw0KIyBPbiByYW5kb20gYXJyYXlzIG9mIGxlbmd0aCAxMDAwLCBtYWtpbmcgdGhpcyBjaGFuZ2UgY3V0IHRoZSBudW1iZXIgb2YNCiMgY29tcGFyaXNvbnMgbWFkZSBieSBoZWFwaWZ5KCkgYSBsaXR0bGUsIGFuZCB0aG9zZSBtYWRlIGJ5IGV4aGF1c3RpdmUNCiMgaGVhcHBvcCgpIGEgbG90LCBpbiBhY2NvcmQgd2l0aCB0aGVvcnkuICBIZXJlIGFyZSB0eXBpY2FsIHJlc3VsdHMgZnJvbSAzDQojIHJ1bnMgKDMganVzdCB0byBkZW1vbnN0cmF0ZSBob3cgc21hbGwgdGhlIHZhcmlhbmNlIGlzKToNCiMNCiMgQ29tcGFyZXMgbmVlZGVkIGJ5IGhlYXBpZnkgICAgIENvbXBhcmVzIG5lZWRlZCBieSAxMDAwIGhlYXBwb3BzDQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyAxODM3IGN1dCB0byAxNjYzICAgICAgICAgICAgICAgMTQ5OTYgY3V0IHRvIDg2ODANCiMgMTg1NSBjdXQgdG8gMTY1OSAgICAgICAgICAgICAgIDE0OTY2IGN1dCB0byA4Njc4DQojIDE4NDcgY3V0IHRvIDE2NjAgICAgICAgICAgICAgICAxNTAyNCBjdXQgdG8gODcwMw0KIw0KIyBCdWlsZGluZyB0aGUgaGVhcCBieSB1c2luZyBoZWFwcHVzaCgpIDEwMDAgdGltZXMgaW5zdGVhZCByZXF1aXJlZA0KIyAyMTk4LCAyMTQ4LCBhbmQgMjIxOSBjb21wYXJlczogIGhlYXBpZnkoKSBpcyBtb3JlIGVmZmljaWVudCwgd2hlbg0KIyB5b3UgY2FuIHVzZSBpdC4NCiMNCiMgVGhlIHRvdGFsIGNvbXBhcmVzIG5lZWRlZCBieSBsaXN0LnNvcnQoKSBvbiB0aGUgc2FtZSBsaXN0cyB3ZXJlIDg2MjcsDQojIDg2MjcsIGFuZCA4NjMyICh0aGlzIHNob3VsZCBiZSBjb21wYXJlZCB0byB0aGUgc3VtIG9mIGhlYXBpZnkoKSBhbmQNCiMgaGVhcHBvcCgpIGNvbXBhcmVzKTogIGxpc3Quc29ydCgpIGlzICh1bnN1cnByaXNpbmdseSEpIG1vcmUgZWZmaWNpZW50DQojIGZvciBzb3J0aW5nLg0KDQpkZWYgX3NpZnR1cChoZWFwLCBwb3MpOg0KICAgIGVuZHBvcyA9IGxlbihoZWFwKQ0KICAgIHN0YXJ0cG9zID0gcG9zDQogICAgbmV3aXRlbSA9IGhlYXBbcG9zXQ0KICAgICMgQnViYmxlIHVwIHRoZSBzbWFsbGVyIGNoaWxkIHVudGlsIGhpdHRpbmcgYSBsZWFmLg0KICAgIGNoaWxkcG9zID0gMipwb3MgKyAxICAgICMgbGVmdG1vc3QgY2hpbGQgcG9zaXRpb24NCiAgICB3aGlsZSBjaGlsZHBvcyA8IGVuZHBvczoNCiAgICAgICAgIyBTZXQgY2hpbGRwb3MgdG8gaW5kZXggb2Ygc21hbGxlciBjaGlsZC4NCiAgICAgICAgcmlnaHRwb3MgPSBjaGlsZHBvcyArIDENCiAgICAgICAgaWYgcmlnaHRwb3MgPCBlbmRwb3MgYW5kIG5vdCBjbXBfbHQoaGVhcFtjaGlsZHBvc10sIGhlYXBbcmlnaHRwb3NdKToNCiAgICAgICAgICAgIGNoaWxkcG9zID0gcmlnaHRwb3MNCiAgICAgICAgIyBNb3ZlIHRoZSBzbWFsbGVyIGNoaWxkIHVwLg0KICAgICAgICBoZWFwW3Bvc10gPSBoZWFwW2NoaWxkcG9zXQ0KICAgICAgICBwb3MgPSBjaGlsZHBvcw0KICAgICAgICBjaGlsZHBvcyA9IDIqcG9zICsgMQ0KICAgICMgVGhlIGxlYWYgYXQgcG9zIGlzIGVtcHR5IG5vdy4gIFB1dCBuZXdpdGVtIHRoZXJlLCBhbmQgYnViYmxlIGl0IHVwDQogICAgIyB0byBpdHMgZmluYWwgcmVzdGluZyBwbGFjZSAoYnkgc2lmdGluZyBpdHMgcGFyZW50cyBkb3duKS4NCiAgICBoZWFwW3Bvc10gPSBuZXdpdGVtDQogICAgX3NpZnRkb3duKGhlYXAsIHN0YXJ0cG9zLCBwb3MpDQoNCiMgSWYgYXZhaWxhYmxlLCB1c2UgQyBpbXBsZW1lbnRhdGlvbg0KdHJ5Og0KICAgIGZyb20gX2hlYXBxIGltcG9ydCAqDQpleGNlcHQgSW1wb3J0RXJyb3I6DQogICAgcGFzcw0KDQpkZWYgbWVyZ2UoKml0ZXJhYmxlcyk6DQogICAgJycnTWVyZ2UgbXVsdGlwbGUgc29ydGVkIGlucHV0cyBpbnRvIGEgc2luZ2xlIHNvcnRlZCBvdXRwdXQuDQoNCiAgICBTaW1pbGFyIHRvIHNvcnRlZChpdGVydG9vbHMuY2hhaW4oKml0ZXJhYmxlcykpIGJ1dCByZXR1cm5zIGEgZ2VuZXJhdG9yLA0KICAgIGRvZXMgbm90IHB1bGwgdGhlIGRhdGEgaW50byBtZW1vcnkgYWxsIGF0IG9uY2UsIGFuZCBhc3N1bWVzIHRoYXQgZWFjaCBvZg0KICAgIHRoZSBpbnB1dCBzdHJlYW1zIGlzIGFscmVhZHkgc29ydGVkIChzbWFsbGVzdCB0byBsYXJnZXN0KS4NCg0KICAgID4+PiBsaXN0KG1lcmdlKFsxLDMsNSw3XSwgWzAsMiw0LDhdLCBbNSwxMCwxNSwyMF0sIFtdLCBbMjVdKSkNCiAgICBbMCwgMSwgMiwgMywgNCwgNSwgNSwgNywgOCwgMTAsIDE1LCAyMCwgMjVdDQoNCiAgICAnJycNCiAgICBfaGVhcHBvcCwgX2hlYXByZXBsYWNlLCBfU3RvcEl0ZXJhdGlvbiA9IGhlYXBwb3AsIGhlYXByZXBsYWNlLCBTdG9wSXRlcmF0aW9uDQoNCiAgICBoID0gW10NCiAgICBoX2FwcGVuZCA9IGguYXBwZW5kDQogICAgZm9yIGl0bnVtLCBpdCBpbiBlbnVtZXJhdGUobWFwKGl0ZXIsIGl0ZXJhYmxlcykpOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICBuZXh0ID0gaXQubmV4dA0KICAgICAgICAgICAgaF9hcHBlbmQoW25leHQoKSwgaXRudW0sIG5leHRdKQ0KICAgICAgICBleGNlcHQgX1N0b3BJdGVyYXRpb246DQogICAgICAgICAgICBwYXNzDQogICAgaGVhcGlmeShoKQ0KDQogICAgd2hpbGUgMToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgd2hpbGUgMToNCiAgICAgICAgICAgICAgICB2LCBpdG51bSwgbmV4dCA9IHMgPSBoWzBdICAgIyByYWlzZXMgSW5kZXhFcnJvciB3aGVuIGggaXMgZW1wdHkNCiAgICAgICAgICAgICAgICB5aWVsZCB2DQogICAgICAgICAgICAgICAgc1swXSA9IG5leHQoKSAgICAgICAgICAgICAgICMgcmFpc2VzIFN0b3BJdGVyYXRpb24gd2hlbiBleGhhdXN0ZWQNCiAgICAgICAgICAgICAgICBfaGVhcHJlcGxhY2UoaCwgcykgICAgICAgICAgIyByZXN0b3JlIGhlYXAgY29uZGl0aW9uDQogICAgICAgIGV4Y2VwdCBfU3RvcEl0ZXJhdGlvbjoNCiAgICAgICAgICAgIF9oZWFwcG9wKGgpICAgICAgICAgICAgICAgICAgICAgIyByZW1vdmUgZW1wdHkgaXRlcmF0b3INCiAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6DQogICAgICAgICAgICByZXR1cm4NCg0KIyBFeHRlbmQgdGhlIGltcGxlbWVudGF0aW9ucyBvZiBuc21hbGxlc3QgYW5kIG5sYXJnZXN0IHRvIHVzZSBhIGtleT0gYXJndW1lbnQNCl9uc21hbGxlc3QgPSBuc21hbGxlc3QNCmRlZiBuc21hbGxlc3QobiwgaXRlcmFibGUsIGtleT1Ob25lKToNCiAgICAiIiJGaW5kIHRoZSBuIHNtYWxsZXN0IGVsZW1lbnRzIGluIGEgZGF0YXNldC4NCg0KICAgIEVxdWl2YWxlbnQgdG86ICBzb3J0ZWQoaXRlcmFibGUsIGtleT1rZXkpWzpuXQ0KICAgICIiIg0KICAgICMgU2hvcnQtY3V0IGZvciBuPT0xIGlzIHRvIHVzZSBtaW4oKSB3aGVuIGxlbihpdGVyYWJsZSk+MA0KICAgIGlmIG4gPT0gMToNCiAgICAgICAgaXQgPSBpdGVyKGl0ZXJhYmxlKQ0KICAgICAgICBoZWFkID0gbGlzdChpc2xpY2UoaXQsIDEpKQ0KICAgICAgICBpZiBub3QgaGVhZDoNCiAgICAgICAgICAgIHJldHVybiBbXQ0KICAgICAgICBpZiBrZXkgaXMgTm9uZToNCiAgICAgICAgICAgIHJldHVybiBbbWluKGNoYWluKGhlYWQsIGl0KSldDQogICAgICAgIHJldHVybiBbbWluKGNoYWluKGhlYWQsIGl0KSwga2V5PWtleSldDQoNCiAgICAjIFdoZW4gbj49c2l6ZSwgaXQncyBmYXN0ZXIgdG8gdXNlIHNvcnRlZCgpDQogICAgdHJ5Og0KICAgICAgICBzaXplID0gbGVuKGl0ZXJhYmxlKQ0KICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBBdHRyaWJ1dGVFcnJvcik6DQogICAgICAgIHBhc3MNCiAgICBlbHNlOg0KICAgICAgICBpZiBuID49IHNpemU6DQogICAgICAgICAgICByZXR1cm4gc29ydGVkKGl0ZXJhYmxlLCBrZXk9a2V5KVs6bl0NCg0KICAgICMgV2hlbiBrZXkgaXMgbm9uZSwgdXNlIHNpbXBsZXIgZGVjb3JhdGlvbg0KICAgIGlmIGtleSBpcyBOb25lOg0KICAgICAgICBpdCA9IGl6aXAoaXRlcmFibGUsIGNvdW50KCkpICAgICAgICAgICAgICAgICAgICAgICAgIyBkZWNvcmF0ZQ0KICAgICAgICByZXN1bHQgPSBfbnNtYWxsZXN0KG4sIGl0KQ0KICAgICAgICByZXR1cm4gbWFwKGl0ZW1nZXR0ZXIoMCksIHJlc3VsdCkgICAgICAgICAgICAgICAgICAgIyB1bmRlY29yYXRlDQoNCiAgICAjIEdlbmVyYWwgY2FzZSwgc2xvd2VzdCBtZXRob2QNCiAgICBpbjEsIGluMiA9IHRlZShpdGVyYWJsZSkNCiAgICBpdCA9IGl6aXAoaW1hcChrZXksIGluMSksIGNvdW50KCksIGluMikgICAgICAgICAgICAgICAgICMgZGVjb3JhdGUNCiAgICByZXN1bHQgPSBfbnNtYWxsZXN0KG4sIGl0KQ0KICAgIHJldHVybiBtYXAoaXRlbWdldHRlcigyKSwgcmVzdWx0KSAgICAgICAgICAgICAgICAgICAgICAgIyB1bmRlY29yYXRlDQoNCl9ubGFyZ2VzdCA9IG5sYXJnZXN0DQpkZWYgbmxhcmdlc3QobiwgaXRlcmFibGUsIGtleT1Ob25lKToNCiAgICAiIiJGaW5kIHRoZSBuIGxhcmdlc3QgZWxlbWVudHMgaW4gYSBkYXRhc2V0Lg0KDQogICAgRXF1aXZhbGVudCB0bzogIHNvcnRlZChpdGVyYWJsZSwga2V5PWtleSwgcmV2ZXJzZT1UcnVlKVs6bl0NCiAgICAiIiINCg0KICAgICMgU2hvcnQtY3V0IGZvciBuPT0xIGlzIHRvIHVzZSBtYXgoKSB3aGVuIGxlbihpdGVyYWJsZSk+MA0KICAgIGlmIG4gPT0gMToNCiAgICAgICAgaXQgPSBpdGVyKGl0ZXJhYmxlKQ0KICAgICAgICBoZWFkID0gbGlzdChpc2xpY2UoaXQsIDEpKQ0KICAgICAgICBpZiBub3QgaGVhZDoNCiAgICAgICAgICAgIHJldHVybiBbXQ0KICAgICAgICBpZiBrZXkgaXMgTm9uZToNCiAgICAgICAgICAgIHJldHVybiBbbWF4KGNoYWluKGhlYWQsIGl0KSldDQogICAgICAgIHJldHVybiBbbWF4KGNoYWluKGhlYWQsIGl0KSwga2V5PWtleSldDQoNCiAgICAjIFdoZW4gbj49c2l6ZSwgaXQncyBmYXN0ZXIgdG8gdXNlIHNvcnRlZCgpDQogICAgdHJ5Og0KICAgICAgICBzaXplID0gbGVuKGl0ZXJhYmxlKQ0KICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBBdHRyaWJ1dGVFcnJvcik6DQogICAgICAgIHBhc3MNCiAgICBlbHNlOg0KICAgICAgICBpZiBuID49IHNpemU6DQogICAgICAgICAgICByZXR1cm4gc29ydGVkKGl0ZXJhYmxlLCBrZXk9a2V5LCByZXZlcnNlPVRydWUpWzpuXQ0KDQogICAgIyBXaGVuIGtleSBpcyBub25lLCB1c2Ugc2ltcGxlciBkZWNvcmF0aW9uDQogICAgaWYga2V5IGlzIE5vbmU6DQogICAgICAgIGl0ID0gaXppcChpdGVyYWJsZSwgY291bnQoMCwtMSkpICAgICAgICAgICAgICAgICAgICAjIGRlY29yYXRlDQogICAgICAgIHJlc3VsdCA9IF9ubGFyZ2VzdChuLCBpdCkNCiAgICAgICAgcmV0dXJuIG1hcChpdGVtZ2V0dGVyKDApLCByZXN1bHQpICAgICAgICAgICAgICAgICAgICMgdW5kZWNvcmF0ZQ0KDQogICAgIyBHZW5lcmFsIGNhc2UsIHNsb3dlc3QgbWV0aG9kDQogICAgaW4xLCBpbjIgPSB0ZWUoaXRlcmFibGUpDQogICAgaXQgPSBpemlwKGltYXAoa2V5LCBpbjEpLCBjb3VudCgwLC0xKSwgaW4yKSAgICAgICAgICAgICAjIGRlY29yYXRlDQogICAgcmVzdWx0ID0gX25sYXJnZXN0KG4sIGl0KQ0KICAgIHJldHVybiBtYXAoaXRlbWdldHRlcigyKSwgcmVzdWx0KSAgICAgICAgICAgICAgICAgICAgICAgIyB1bmRlY29yYXRlDQoNCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6DQogICAgIyBTaW1wbGUgc2FuaXR5IHRlc3QNCiAgICBoZWFwID0gW10NCiAgICBkYXRhID0gWzEsIDMsIDUsIDcsIDksIDIsIDQsIDYsIDgsIDBdDQogICAgZm9yIGl0ZW0gaW4gZGF0YToNCiAgICAgICAgaGVhcHB1c2goaGVhcCwgaXRlbSkNCiAgICBzb3J0ID0gW10NCiAgICB3aGlsZSBoZWFwOg0KICAgICAgICBzb3J0LmFwcGVuZChoZWFwcG9wKGhlYXApKQ0KICAgIHByaW50IHNvcnQNCg0KICAgIGltcG9ydCBkb2N0ZXN0DQogICAgZG9jdGVzdC50ZXN0bW9kKCkNCg==