I3ZlcnNpb24gNDMwDQoNCiNleHRlbnNpb24gR0xfM0RMX2FycmF5X29iamVjdHMgOiBlbmFibGUNCg0Kb3V0IFZlcnRleCB7DQogICAgdmVjNCBQb3NpdGlvbjsgIC8vIEFQSSB0cmFuc2Zvcm0vZmVlZGJhY2sgd2lsbCB1c2Ugk1ZlcnRleC5Qb3NpdGlvbpQNCiAgICB2ZWMyIFRleHR1cmU7DQp9IENvb3JkczsgICAgICAgICAgIC8vIHNoYWRlciB3aWxsIHVzZSCTQ29vcmRzLlBvc2l0aW9ulA0KDQpvdXQgVmVydGV4MiB7DQogICAgdmVjNCBDb2xvcjsgICAgIC8vIEFQSSB3aWxsIHVzZSCTQ29sb3KUDQp9Ow0KDQp1bmlmb3JtIFRyYW5zZm9ybSB7ICAvLyBBUEkgdXNlcyCTVHJhbnNmb3JtWzJdlCB0byByZWZlciB0byBpbnN0YW5jZSAyDQogICAgbWF0NCAgICAgICAgICAgTW9kZWxWaWV3TWF0cml4Ow0KICAgIG1hdDQgICAgICAgICAgIE1vZGVsVmlld1Byb2plY3Rpb25NYXRyaXg7DQogICAgdmVjNCAgICAgICAgICAgYVtdOyAgLy8gYXJyYXkgd2lsbCBnZXQgaW1wbGljaXRseSBzaXplZA0KICAgIGZsb2F0ICAgICAgICAgIERlZm9ybWF0aW9uOw0KfSB0cmFuc2Zvcm1zWzRdOw0KDQpsYXlvdXQobG9jYXRpb24gPSAzKSBpbiB2ZWM0IG5vcm1hbDsNCmxheW91dChsb2NhdGlvbiA9IDYpIGluIHZlYzQgY29sb3JzWzNdOw0KbGF5b3V0KGxvY2F0aW9uID0gOSkgaW4gbWF0NCB0cmFuc2Zvcm1zWzJdOw0KDQpsYXlvdXQobG9jYXRpb24gPSAzKSBzdHJ1Y3QgUyB7DQogICAgdmVjMyBhMTsNCiAgICBtYXQyIGI7DQogICAgdmVjNCBjWzJdOw0KfSBzOw0KDQpsYXlvdXQodHJpYW5nbGVzLCBpbnZvY2F0aW9ucyA9IDYpIGluOw0KDQpsYXlvdXQobGluZXMpIGluOyAgICAvLyBsZWdhbCBmb3IgQ29sb3IyLCBpbnB1dCBzaXplIGlzIDIsIG1hdGNoaW5nIENvbG9yMg0KDQpsYXlvdXQodHJpYW5nbGVfc3RyaXAsIG1heF92ZXJ0aWNlcyA9IDYwKSBvdXQ7ICAvLyBvcmRlciBkb2VzIG5vdCBtYXR0ZXINCmxheW91dChtYXhfdmVydGljZXMgPSA2MCkgb3V0OyAgICAgIC8vIHJlZGVjbGFyYXRpb24gb2theQ0KbGF5b3V0KHRyaWFuZ2xlX3N0cmlwKSBvdXQ7ICAgICAgICAgLy8gcmVkZWNsYXJhdGlvbiBva2F5DQovL2xheW91dChwb2ludHMpIG91dDsgICAgICAgICAgICAgICAgIC8vIGVycm9yLCBjb250cmFkaWN0cyB0cmlhbmdsZV9zdHJpcA0KLy9sYXlvdXQobWF4X3ZlcnRpY2VzID0gMzApIG91dDsgICAgICAvLyBlcnJvciwgY29udHJhZGljdHMgNjANCg0KbGF5b3V0KHN0cmVhbSA9IDEpIG91dDsNCg0KbGF5b3V0KHN0cmVhbT0xKSBvdXQ7ICAgICAgICAgICAgIC8vIGRlZmF1bHQgaXMgbm93IHN0cmVhbSAxDQpvdXQgdmVjNCB2YXIxOyAgICAgICAgICAgICAgICAgICAgLy8gdmFyMSBnZXRzIGRlZmF1bHQgc3RyZWFtICgxKQ0KbGF5b3V0KHN0cmVhbT0yKSBvdXQgQmxvY2sxIHsgICAgIC8vICJCbG9jazEiIGJlbG9uZ3MgdG8gc3RyZWFtIDINCiAgICBsYXlvdXQoc3RyZWFtPTIpIHZlYzQgdmFyMjsgICAvLyByZWR1bmRhbnQgYmxvY2sgbWVtYmVyIHN0cmVhbSBkZWNsDQogICAgbGF5b3V0KHN0cmVhbT0zKSB2ZWMyIHZhcjM7ICAgLy8gSUxMRUdBTCAobXVzdCBtYXRjaCBibG9jayBzdHJlYW0pDQogICAgdmVjMyB2YXI0OyAgICAgICAgICAgICAgICAgICAgLy8gYmVsb25ncyB0byBzdHJlYW0gMg0KfTsNCmxheW91dChzdHJlYW09MCkgb3V0OyAgICAgICAgICAgICAvLyBkZWZhdWx0IGlzIG5vdyBzdHJlYW0gMA0Kb3V0IHZlYzQgdmFyNTsgICAgICAgICAgICAgICAgICAgIC8vIHZhcjUgZ2V0cyBkZWZhdWx0IHN0cmVhbSAoMCkNCm91dCBCbG9jazIgeyAgICAgICAgICAgICAgICAgICAgICAvLyAiQmxvY2syIiBnZXRzIGRlZmF1bHQgc3RyZWFtICgwKQ0KICAgIHZlYzQgdmFyNjsNCn07DQpsYXlvdXQoc3RyZWFtPTMpIG91dCB2ZWM0IHZhcjc7ICAgLy8gdmFyNyBiZWxvbmdzIHRvIHN0cmVhbSAzDQoNCmxheW91dChzaGFyZWQsIGNvbHVtbl9tYWpvcikgdW5pZm9ybTsNCmxheW91dChzaGFyZWQsIGNvbHVtbl9tYWpvcikgYnVmZmVyOw0KDQpsYXlvdXQocm93X21ham9yLCBjb2x1bW5fbWFqb3IpDQoNCmxheW91dChzaGFyZWQsIHJvd19tYWpvcikgdW5pZm9ybTsgLy8gZGVmYXVsdCBpcyBub3cgc2hhcmVkIGFuZCByb3dfbWFqb3INCg0KbGF5b3V0KHN0ZDE0MCkgdW5pZm9ybSBUcmFuc2Zvcm0yIHsgLy8gbGF5b3V0IG9mIHRoaXMgYmxvY2sgaXMgc3RkMTQwDQogICAgbWF0NCBNMTsgICAgICAgICAgICAgICAgICAgICAgIC8vIHJvd19tYWpvcg0KICAgIGxheW91dChjb2x1bW5fbWFqb3IpIG1hdDQgTTI7ICAvLyBjb2x1bW4gbWFqb3INCiAgICBtYXQzIE4xOyAgICAgICAgICAgICAgICAgICAgICAgLy8gcm93X21ham9yDQp9Ow0KDQpsYXlvdXQoY29sdW1uX21ham9yKSB1bmlmb3JtIFQzIHsgIC8vIHNoYXJlZCBhbmQgY29sdW1uX21ham9yDQogICAgbWF0NCBNMTM7ICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbHVtbl9tYWpvcg0KICAgIGxheW91dChyb3dfbWFqb3IpIG1hdDQgbTE0OyAgICAvLyByb3cgbWFqb3INCiAgICBtYXQzIE4xMjsgICAgICAgICAgICAgICAgICAgICAgLy8gY29sdW1uX21ham9yDQp9Ow0KDQovLyBpbiBvbmUgY29tcGlsYXRpb24gdW5pdC4uLg0KbGF5b3V0KGJpbmRpbmc9MykgdW5pZm9ybSBzYW1wbGVyMkQgczE3OyAvLyBzIGJvdW5kIHRvIHVuaXQgMw0KDQovLyBpbiBhbm90aGVyIGNvbXBpbGF0aW9uIHVuaXQuLi4NCnVuaWZvcm0gc2FtcGxlcjJEIHMxNzsgICAgICAgICAgICAgICAgICAgLy8gb2theSwgcyBzdGlsbCBib3VuZCBhdCAzDQoNCi8vIGluIGFub3RoZXIgY29tcGlsYXRpb24gdW5pdC4uLg0KLy9sYXlvdXQoYmluZGluZz00KSB1bmlmb3JtIHNhbXBsZXIyRCBzOyAvLyBFUlJPUjogY29udHJhZGljdG9yeSBiaW5kaW5ncw0KDQpsYXlvdXQgKGJpbmRpbmcgPSAyLCBvZmZzZXQgPSA0KSB1bmlmb3JtIGF0b21pY191aW50IGEyOw0KDQpsYXlvdXQgKGJpbmRpbmcgPSAyKSB1bmlmb3JtIGF0b21pY191aW50IGJhcjsNCg0KbGF5b3V0IChiaW5kaW5nID0gMiwgb2Zmc2V0ID0gNCkgdW5pZm9ybSBhdG9taWNfdWludDsNCg0KbGF5b3V0IChiaW5kaW5nID0gMikgdW5pZm9ybSBhdG9taWNfdWludCBiYXI7IC8vIG9mZnNldCBpcyA0DQpsYXlvdXQgKG9mZnNldCA9IDgpIHVuaWZvcm0gYXRvbWljX3VpbnQgYmFyMjM7ICAvLyBlcnJvciwgbm8gZGVmYXVsdCBiaW5kaW5nDQoNCmxheW91dCAoYmluZGluZz0zLCBvZmZzZXQ9NCkgdW5pZm9ybSBhdG9taWNfdWludCBhMjsgLy8gb2Zmc2V0ID0gNA0KbGF5b3V0IChiaW5kaW5nPTIpIHVuaWZvcm0gYXRvbWljX3VpbnQgYjI7ICAgICAgICAgICAvLyBvZmZzZXQgPSAwDQpsYXlvdXQgKGJpbmRpbmc9MykgdW5pZm9ybSBhdG9taWNfdWludCBjMjsgICAgICAgICAgIC8vIG9mZnNldCA9IDgNCmxheW91dCAoYmluZGluZz0yKSB1bmlmb3JtIGF0b21pY191aW50IGQyOyAgICAgICAgICAgLy8gb2Zmc2V0ID0gNA0KDQovL2xheW91dCAob2Zmc2V0PTQpICAgICAgICAgICAgICAgIC8vIGVycm9yLCBtdXN0IGluY2x1ZGUgYmluZGluZw0KLy9sYXlvdXQgKGJpbmRpbmc9MSwgb2Zmc2V0PTApICBhOyAvLyBva2F5DQovL2xheW91dCAoYmluZGluZz0yLCBvZmZzZXQ9MCkgIGI7IC8vIG9rYXkNCi8vbGF5b3V0IChiaW5kaW5nPTEsIG9mZnNldD0wKSAgYzsgLy8gZXJyb3IsIG9mZnNldHMgbXVzdCBub3QgYmUgc2hhcmVkDQovLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICBiZXR3ZWVuIGEgYW5kIGMNCi8vbGF5b3V0IChiaW5kaW5nPTEsIG9mZnNldD0yKSAgZDsgLy8gZXJyb3IsIG92ZXJsYXBzIG9mZnNldCAwIG9mIGENCg0KZmxhdCAgaW4gdmVjNCBnbF9Gcm9udENvbG9yOyAgLy8gaW5wdXQgdG8gZ2VvbWV0cnkgc2hhZGVyLCBubyCTZ2xfaW5bXZQNCmZsYXQgb3V0IHZlYzQgZ2xfRnJvbnRDb2xvcjsgIC8vIG91dHB1dCBmcm9tIGdlb21ldHJ5IHNoYWRlcg0KDQppbnZhcmlhbnQgZ2xfUG9zaXRpb247ICAgLy8gbWFrZSBleGlzdGluZyBnbF9Qb3NpdGlvbiBiZSBpbnZhcmlhbnQNCg0Kb3V0IHZlYzMgQ29sb3JJbnY7DQppbnZhcmlhbnQgQ29sb3JJdm47ICAgICAgLy8gbWFrZSBleGlzdGluZyBDb2xvciBiZSBpbnZhcmlhbnQNCg0KaW52YXJpYW50IGNlbnRyb2lkIG91dCB2ZWMzIENvbG9yNDsNCnByZWNpc2Ugb3V0IHZlYzQgcG9zaXRpb247DQoNCm91dCB2ZWMzIENvbG9yNTsNCnByZWNpc2UgQ29sb3I1OyAgICAgICAgICAgIC8vIG1ha2UgZXhpc3RpbmcgQ29sb3IgYmUgcHJlY2lzZQ0KaW4gdmVjNCBhLCBiLCBjLCBkOw0KcHJlY2lzZSBvdXQgdmVjNCB2Ow0KDQpjb2hlcmVudCBidWZmZXIgQmxvY2sgew0KICAgIHJlYWRvbmx5IHZlYzQgbWVtYmVyMTsNCiAgICB2ZWM0IG1lbWJlcjI7DQp9Ow0KDQpidWZmZXIgQmxvY2syYSB7DQogICAgY29oZXJlbnQgcmVhZG9ubHkgdmVjNCBtZW1iZXIxQTsNCiAgICBjb2hlcmVudCB2ZWM0IG1lbWJlcjJBOw0KfTsNCg0Kc2hhcmVkIHZlYzQgc2h2Ow0KDQp2ZWM0IGZ1bmNBKHJlc3RyaWN0IGltYWdlMkQgYSkgICB7ICB9DQoNCnZlYzQgZnVuY0IoaW1hZ2UyRCBhKSAgICAgICAgICAgIHsgIH0NCmxheW91dChyZ2JhMzJmKSB1bmlmb3JtIGltYWdlMkQgaW1nMTsNCmxheW91dChyZ2JhMzJmKSBjb2hlcmVudCB1bmlmb3JtIGltYWdlMkQgaW1nMjsNCg0KZmxvYXQgZnVuYyhmbG9hdCBlLCBmbG9hdCBmLCBmbG9hdCBnLCBmbG9hdCBoKQ0Kew0KICAgIHJldHVybiAoZSpmKSArIChnKmgpOyAgICAgICAgICAgIC8vIG5vIGNvbnN0cmFpbnQgb24gb3JkZXIgb3IgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3BlcmF0b3IgY29uc2lzdGVuY3kNCn0NCg0KZmxvYXQgZnVuYzIoZmxvYXQgZSwgZmxvYXQgZiwgZmxvYXQgZywgZmxvYXQgaCkNCnsNCiAgICBwcmVjaXNlIGZsb2F0IHJlc3VsdCA9IChlKmYpICsgKGcqaCk7ICAvLyBlbnN1cmVzIHNhbWUgcHJlY2lzaW9uIGZvcg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0d28gbXVsdGlwbGllcw0KICAgIHJldHVybiByZXN1bHQ7DQp9DQoNCmZsb2F0IGZ1bmMzKGZsb2F0IGksIGZsb2F0IGosIHByZWNpc2Ugb3V0IGZsb2F0IGspDQp7DQogICAgayA9IGkgKiBpICsgajsgICAgICAgICAgICAgICAgICAgLy8gcHJlY2lzZSwgZHVlIHRvIDxrPiBkZWNsYXJhdGlvbg0KfQ0KDQp2b2lkIG1haW4oKQ0Kew0KICAgIHZlYzMgciA9IHZlYzMoYSAqIGIpOyAgICAgICAgICAgLy8gcHJlY2lzZSwgdXNlZCB0byBjb21wdXRlIHYueHl6DQogICAgdmVjMyBzID0gdmVjMyhjICogZCk7ICAgICAgICAgICAvLyBwcmVjaXNlLCB1c2VkIHRvIGNvbXB1dGUgdi54eXoNCiAgICB2Lnh5eiA9IHIgKyBzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJlY2lzZSAgICAgICAgICAgICAgICAgICAgICANCiAgICB2LncgPSAoYS53ICogYi53KSArIChjLncgKiBkLncpOyAgICAgICAgLy8gcHJlY2lzZQ0KICAgIHYueCA9IGZ1bmMoYS54LCBiLngsIGMueCwgZC54KTsgICAgICAgICAvLyB2YWx1ZXMgY29tcHV0ZWQgaW4gZnVuYygpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZSBOT1QgcHJlY2lzZQ0KICAgIHYueCA9IGZ1bmMyKGEueCwgYi54LCBjLngsIGQueCk7ICAgICAgICAvLyBwcmVjaXNlIQ0KICAgIGZ1bmMzKGEueCAqIGIueCwgYy54ICogZC54LCB2LngpOyAgICAgICAvLyBwcmVjaXNlIQ0KICAgICAgICANCiAgICBmdW5jQShpbWcxKTsgICAgICAgICAgICAgIC8vIE9LLCBhZGRpbmcgInJlc3RyaWN0IiBpcyBhbGxvd2VkDQogICAgZnVuY0IoaW1nMik7ICAgICAgICAgICAgICAvLyBpbGxlZ2FsLCBzdHJpcHBpbmcgImNvaGVyZW50IiBpcyBub3QNCg0KICAgIHsNCiAgICAgICAgc3RydWN0IGxpZ2h0IHsNCiAgICAgICAgICAgIGZsb2F0IGludGVuc2l0eTsNCiAgICAgICAgICAgIHZlYzMgcG9zaXRpb247DQogICAgICAgIH07DQoNCiAgICAgICAgbGlnaHQgbGlnaHRWYXIgPSBsaWdodCgzLjAsIHZlYzMoMS4wLCAyLjAsIDMuMCkpOw0KICAgIH0NCiAgICB7DQogICAgICAgIGNvbnN0IGZsb2F0IGNbM10gPSBmbG9hdFszXSg1LjAsIDcuMiwgMS4xKTsNCiAgICAgICAgY29uc3QgZmxvYXQgZFszXSA9IGZsb2F0W10oNS4wLCA3LjIsIDEuMSk7DQoNCiAgICAgICAgZmxvYXQgZzsNCiAgICAgICAgZmxvYXQgYVs1XSA9IGZsb2F0WzVdKGcsIDEsIGcsIDIuMywgZyk7DQogICAgICAgIGZsb2F0IGJbM107DQoNCiAgICAgICAgYiA9IGZsb2F0WzNdKGcsIGcgKyAxLjAsIGcgKyAyLjApOw0KICAgIH0NCiAgICB7DQogICAgICAgIHZlYzQgYlsyXSA9IHsgdmVjNCgxLjApLCB2ZWM0KDEuMCkgfTsNCiAgICAgICAgdmVjNFszXVsyXShiLCBiLCBiKTsgICAgICAgIC8vIGNvbnN0cnVjdG9yDQogICAgICAgIHZlYzRbXVsyXShiLCBiLCBiKTsgICAgICAgICAvLyBjb25zdHJ1Y3RvciwgdmFsaWQsIHNpemUgZGVkdWNlZA0KICAgICAgICB2ZWM0WzNdW10oYiwgYiwgYik7ICAgICAgICAgLy8gY29tcGlsZS10aW1lIGVycm9yLCBpbnZhbGlkIHR5cGUgY29uc3RydWN0ZWQNCiAgICB9DQp9DQo=