I3ZlcnNpb24gNDMwDQoNCiNleHRlbnNpb24gR0xfM0RMX2FycmF5X29iamVjdHMgOiBlbmFibGUNCg0Kb3V0IFZlcnRleCB7DQogICAgdmVjNCBQb3NpdGlvbjsgIC8vIEFQSSB0cmFuc2Zvcm0vZmVlZGJhY2sgd2lsbCB1c2Ugk1ZlcnRleC5Qb3NpdGlvbpQNCiAgICB2ZWMyIFRleHR1cmU7DQp9IENvb3JkczsgICAgICAgICAgIC8vIHNoYWRlciB3aWxsIHVzZSCTQ29vcmRzLlBvc2l0aW9ulA0KDQpvdXQgVmVydGV4MiB7DQogICAgdmVjNCBDb2xvcjsgICAgIC8vIEFQSSB3aWxsIHVzZSCTQ29sb3KUDQp9Ow0KDQp1bmlmb3JtIFRyYW5zZm9ybSB7ICAvLyBBUEkgdXNlcyCTVHJhbnNmb3JtWzJdlCB0byByZWZlciB0byBpbnN0YW5jZSAyDQogICAgbWF0NCAgICAgICAgICAgTW9kZWxWaWV3TWF0cml4Ow0KICAgIG1hdDQgICAgICAgICAgIE1vZGVsVmlld1Byb2plY3Rpb25NYXRyaXg7DQogICAgdmVjNCAgICAgICAgICAgYVtdOyAgLy8gYXJyYXkgd2lsbCBnZXQgaW1wbGljaXRseSBzaXplZA0KICAgIGZsb2F0ICAgICAgICAgIERlZm9ybWF0aW9uOw0KfSB0cmFuc2Zvcm1zWzRdOw0KDQpsYXlvdXQobG9jYXRpb24gPSAzKSBpbiB2ZWM0IG5vcm1hbDsNCmxheW91dChsb2NhdGlvbiA9IDYpIGluIHZlYzQgY29sb3JzWzNdOw0KbGF5b3V0KGxvY2F0aW9uID0gOSkgaW4gbWF0NCB0cmFuc2Zvcm1zMlsyXTsNCg0KbGF5b3V0KGxvY2F0aW9uID0gMykgc3RydWN0IFMgew0KICAgIHZlYzMgYTE7DQogICAgbWF0MiBiOw0KICAgIHZlYzQgY1syXTsNCn0gczsNCg0KbGF5b3V0KHRyaWFuZ2xlcywgaW52b2NhdGlvbnMgPSA2KSBpbjsNCg0KbGF5b3V0KGxpbmVzKSBpbjsgICAgLy8gbGVnYWwgZm9yIENvbG9yMiwgaW5wdXQgc2l6ZSBpcyAyLCBtYXRjaGluZyBDb2xvcjINCg0KbGF5b3V0KHRyaWFuZ2xlX3N0cmlwLCBtYXhfdmVydGljZXMgPSA2MCkgb3V0OyAgLy8gb3JkZXIgZG9lcyBub3QgbWF0dGVyDQpsYXlvdXQobWF4X3ZlcnRpY2VzID0gNjApIG91dDsgICAgICAvLyByZWRlY2xhcmF0aW9uIG9rYXkNCmxheW91dCh0cmlhbmdsZV9zdHJpcCkgb3V0OyAgICAgICAgIC8vIHJlZGVjbGFyYXRpb24gb2theQ0KLy9sYXlvdXQocG9pbnRzKSBvdXQ7ICAgICAgICAgICAgICAgICAvLyBlcnJvciwgY29udHJhZGljdHMgdHJpYW5nbGVfc3RyaXANCi8vbGF5b3V0KG1heF92ZXJ0aWNlcyA9IDMwKSBvdXQ7ICAgICAgLy8gZXJyb3IsIGNvbnRyYWRpY3RzIDYwDQoNCmxheW91dChzdHJlYW0gPSAxKSBvdXQ7DQoNCmxheW91dChzdHJlYW09MSkgb3V0OyAgICAgICAgICAgICAvLyBkZWZhdWx0IGlzIG5vdyBzdHJlYW0gMQ0Kb3V0IHZlYzQgdmFyMTsgICAgICAgICAgICAgICAgICAgIC8vIHZhcjEgZ2V0cyBkZWZhdWx0IHN0cmVhbSAoMSkNCmxheW91dChzdHJlYW09Mikgb3V0IEJsb2NrMSB7ICAgICAvLyAiQmxvY2sxIiBiZWxvbmdzIHRvIHN0cmVhbSAyDQogICAgbGF5b3V0KHN0cmVhbT0yKSB2ZWM0IHZhcjI7ICAgLy8gcmVkdW5kYW50IGJsb2NrIG1lbWJlciBzdHJlYW0gZGVjbA0KICAgIGxheW91dChzdHJlYW09MykgdmVjMiB2YXIzOyAgIC8vIElMTEVHQUwgKG11c3QgbWF0Y2ggYmxvY2sgc3RyZWFtKQ0KICAgIHZlYzMgdmFyNDsgICAgICAgICAgICAgICAgICAgIC8vIGJlbG9uZ3MgdG8gc3RyZWFtIDINCn07DQpsYXlvdXQoc3RyZWFtPTApIG91dDsgICAgICAgICAgICAgLy8gZGVmYXVsdCBpcyBub3cgc3RyZWFtIDANCm91dCB2ZWM0IHZhcjU7ICAgICAgICAgICAgICAgICAgICAvLyB2YXI1IGdldHMgZGVmYXVsdCBzdHJlYW0gKDApDQpvdXQgQmxvY2syIHsgICAgICAgICAgICAgICAgICAgICAgLy8gIkJsb2NrMiIgZ2V0cyBkZWZhdWx0IHN0cmVhbSAoMCkNCiAgICB2ZWM0IHZhcjY7DQp9Ow0KbGF5b3V0KHN0cmVhbT0zKSBvdXQgdmVjNCB2YXI3OyAgIC8vIHZhcjcgYmVsb25ncyB0byBzdHJlYW0gMw0KDQpsYXlvdXQoc2hhcmVkLCBjb2x1bW5fbWFqb3IpIHVuaWZvcm07DQpsYXlvdXQoc2hhcmVkLCBjb2x1bW5fbWFqb3IpIGJ1ZmZlcjsNCg0KbGF5b3V0KHJvd19tYWpvciwgY29sdW1uX21ham9yKQ0KDQpsYXlvdXQoc2hhcmVkLCByb3dfbWFqb3IpIHVuaWZvcm07IC8vIGRlZmF1bHQgaXMgbm93IHNoYXJlZCBhbmQgcm93X21ham9yDQoNCmxheW91dChzdGQxNDApIHVuaWZvcm0gVHJhbnNmb3JtMiB7IC8vIGxheW91dCBvZiB0aGlzIGJsb2NrIGlzIHN0ZDE0MA0KICAgIG1hdDQgTTE7ICAgICAgICAgICAgICAgICAgICAgICAvLyByb3dfbWFqb3INCiAgICBsYXlvdXQoY29sdW1uX21ham9yKSBtYXQ0IE0yOyAgLy8gY29sdW1uIG1ham9yDQogICAgbWF0MyBOMTsgICAgICAgICAgICAgICAgICAgICAgIC8vIHJvd19tYWpvcg0KfTsNCg0KbGF5b3V0KGNvbHVtbl9tYWpvcikgdW5pZm9ybSBUMyB7ICAvLyBzaGFyZWQgYW5kIGNvbHVtbl9tYWpvcg0KICAgIG1hdDQgTTEzOyAgICAgICAgICAgICAgICAgICAgICAvLyBjb2x1bW5fbWFqb3INCiAgICBsYXlvdXQocm93X21ham9yKSBtYXQ0IG0xNDsgICAgLy8gcm93IG1ham9yDQogICAgbWF0MyBOMTI7ICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbHVtbl9tYWpvcg0KfTsNCg0KLy8gaW4gb25lIGNvbXBpbGF0aW9uIHVuaXQuLi4NCmxheW91dChiaW5kaW5nPTMpIHVuaWZvcm0gc2FtcGxlcjJEIHMxNzsgLy8gcyBib3VuZCB0byB1bml0IDMNCg0KLy8gaW4gYW5vdGhlciBjb21waWxhdGlvbiB1bml0Li4uDQp1bmlmb3JtIHNhbXBsZXIyRCBzMTc7ICAgICAgICAgICAgICAgICAgIC8vIG9rYXksIHMgc3RpbGwgYm91bmQgYXQgMw0KDQovLyBpbiBhbm90aGVyIGNvbXBpbGF0aW9uIHVuaXQuLi4NCi8vbGF5b3V0KGJpbmRpbmc9NCkgdW5pZm9ybSBzYW1wbGVyMkQgczsgLy8gRVJST1I6IGNvbnRyYWRpY3RvcnkgYmluZGluZ3MNCg0KbGF5b3V0IChiaW5kaW5nID0gMiwgb2Zmc2V0ID0gNCkgdW5pZm9ybSBhdG9taWNfdWludCBhMjsNCg0KbGF5b3V0IChiaW5kaW5nID0gMikgdW5pZm9ybSBhdG9taWNfdWludCBiYXI7DQoNCmxheW91dCAoYmluZGluZyA9IDIsIG9mZnNldCA9IDQpIHVuaWZvcm0gYXRvbWljX3VpbnQ7DQoNCmxheW91dCAoYmluZGluZyA9IDIpIHVuaWZvcm0gYXRvbWljX3VpbnQgYmFyOyAvLyBvZmZzZXQgaXMgNA0KbGF5b3V0IChvZmZzZXQgPSA4KSB1bmlmb3JtIGF0b21pY191aW50IGJhcjIzOyAgLy8gZXJyb3IsIG5vIGRlZmF1bHQgYmluZGluZw0KDQpsYXlvdXQgKGJpbmRpbmc9Mywgb2Zmc2V0PTQpIHVuaWZvcm0gYXRvbWljX3VpbnQgYTI7IC8vIG9mZnNldCA9IDQNCmxheW91dCAoYmluZGluZz0yKSB1bmlmb3JtIGF0b21pY191aW50IGIyOyAgICAgICAgICAgLy8gb2Zmc2V0ID0gMA0KbGF5b3V0IChiaW5kaW5nPTMpIHVuaWZvcm0gYXRvbWljX3VpbnQgYzI7ICAgICAgICAgICAvLyBvZmZzZXQgPSA4DQpsYXlvdXQgKGJpbmRpbmc9MikgdW5pZm9ybSBhdG9taWNfdWludCBkMjsgICAgICAgICAgIC8vIG9mZnNldCA9IDQNCg0KLy9sYXlvdXQgKG9mZnNldD00KSAgICAgICAgICAgICAgICAvLyBlcnJvciwgbXVzdCBpbmNsdWRlIGJpbmRpbmcNCi8vbGF5b3V0IChiaW5kaW5nPTEsIG9mZnNldD0wKSAgYTsgLy8gb2theQ0KLy9sYXlvdXQgKGJpbmRpbmc9Miwgb2Zmc2V0PTApICBiOyAvLyBva2F5DQovL2xheW91dCAoYmluZGluZz0xLCBvZmZzZXQ9MCkgIGM7IC8vIGVycm9yLCBvZmZzZXRzIG11c3Qgbm90IGJlIHNoYXJlZA0KLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgYmV0d2VlbiBhIGFuZCBjDQovL2xheW91dCAoYmluZGluZz0xLCBvZmZzZXQ9MikgIGQ7IC8vIGVycm9yLCBvdmVybGFwcyBvZmZzZXQgMCBvZiBhDQoNCmZsYXQgIGluIHZlYzQgZ2xfRnJvbnRDb2xvcjsgIC8vIGlucHV0IHRvIGdlb21ldHJ5IHNoYWRlciwgbm8gk2dsX2luW12UDQpmbGF0IG91dCB2ZWM0IGdsX0Zyb250Q29sb3I7ICAvLyBvdXRwdXQgZnJvbSBnZW9tZXRyeSBzaGFkZXINCg0KaW52YXJpYW50IGdsX1Bvc2l0aW9uOyAgIC8vIG1ha2UgZXhpc3RpbmcgZ2xfUG9zaXRpb24gYmUgaW52YXJpYW50DQoNCm91dCB2ZWMzIENvbG9ySW52Ow0KaW52YXJpYW50IENvbG9ySXZuOyAgICAgIC8vIG1ha2UgZXhpc3RpbmcgQ29sb3IgYmUgaW52YXJpYW50DQoNCmludmFyaWFudCBjZW50cm9pZCBvdXQgdmVjMyBDb2xvcjQ7DQpwcmVjaXNlIG91dCB2ZWM0IHBvc2l0aW9uOw0KDQpvdXQgdmVjMyBDb2xvcjU7DQpwcmVjaXNlIENvbG9yNTsgICAgICAgICAgICAvLyBtYWtlIGV4aXN0aW5nIENvbG9yIGJlIHByZWNpc2UNCmluIHZlYzQgYSwgYiwgYywgZDsNCnByZWNpc2Ugb3V0IHZlYzQgdjsNCg0KY29oZXJlbnQgYnVmZmVyIEJsb2NrIHsNCiAgICByZWFkb25seSB2ZWM0IG1lbWJlcjE7DQogICAgdmVjNCBtZW1iZXIyOw0KfTsNCg0KYnVmZmVyIEJsb2NrMmEgew0KICAgIGNvaGVyZW50IHJlYWRvbmx5IHZlYzQgbWVtYmVyMUE7DQogICAgY29oZXJlbnQgdmVjNCBtZW1iZXIyQTsNCn07DQoNCnNoYXJlZCB2ZWM0IHNodjsNCg0KdmVjNCBmdW5jQShyZXN0cmljdCBpbWFnZTJEIGEpICAgeyAgfQ0KDQp2ZWM0IGZ1bmNCKGltYWdlMkQgYSkgICAgICAgICAgICB7ICB9DQpsYXlvdXQocmdiYTMyZikgdW5pZm9ybSBpbWFnZTJEIGltZzE7DQpsYXlvdXQocmdiYTMyZikgY29oZXJlbnQgdW5pZm9ybSBpbWFnZTJEIGltZzI7DQoNCmZsb2F0IGZ1bmMoZmxvYXQgZSwgZmxvYXQgZiwgZmxvYXQgZywgZmxvYXQgaCkNCnsNCiAgICByZXR1cm4gKGUqZikgKyAoZypoKTsgICAgICAgICAgICAvLyBubyBjb25zdHJhaW50IG9uIG9yZGVyIG9yIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wZXJhdG9yIGNvbnNpc3RlbmN5DQp9DQoNCmZsb2F0IGZ1bmMyKGZsb2F0IGUsIGZsb2F0IGYsIGZsb2F0IGcsIGZsb2F0IGgpDQp7DQogICAgcHJlY2lzZSBmbG9hdCByZXN1bHQgPSAoZSpmKSArIChnKmgpOyAgLy8gZW5zdXJlcyBzYW1lIHByZWNpc2lvbiBmb3INCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdHdvIG11bHRpcGxpZXMNCiAgICByZXR1cm4gcmVzdWx0Ow0KfQ0KDQpmbG9hdCBmdW5jMyhmbG9hdCBpLCBmbG9hdCBqLCBwcmVjaXNlIG91dCBmbG9hdCBrKQ0Kew0KICAgIGsgPSBpICogaSArIGo7ICAgICAgICAgICAgICAgICAgIC8vIHByZWNpc2UsIGR1ZSB0byA8az4gZGVjbGFyYXRpb24NCn0NCg0Kdm9pZCBtYWluKCkNCnsNCiAgICB2ZWMzIHIgPSB2ZWMzKGEgKiBiKTsgICAgICAgICAgIC8vIHByZWNpc2UsIHVzZWQgdG8gY29tcHV0ZSB2Lnh5eg0KICAgIHZlYzMgcyA9IHZlYzMoYyAqIGQpOyAgICAgICAgICAgLy8gcHJlY2lzZSwgdXNlZCB0byBjb21wdXRlIHYueHl6DQogICAgdi54eXogPSByICsgczsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZWNpc2UgICAgICAgICAgICAgICAgICAgICAgDQogICAgdi53ID0gKGEudyAqIGIudykgKyAoYy53ICogZC53KTsgICAgICAgIC8vIHByZWNpc2UNCiAgICB2LnggPSBmdW5jKGEueCwgYi54LCBjLngsIGQueCk7ICAgICAgICAgLy8gdmFsdWVzIGNvbXB1dGVkIGluIGZ1bmMoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcmUgTk9UIHByZWNpc2UNCiAgICB2LnggPSBmdW5jMihhLngsIGIueCwgYy54LCBkLngpOyAgICAgICAgLy8gcHJlY2lzZSENCiAgICBmdW5jMyhhLnggKiBiLngsIGMueCAqIGQueCwgdi54KTsgICAgICAgLy8gcHJlY2lzZSENCiAgICAgICAgDQogICAgZnVuY0EoaW1nMSk7ICAgICAgICAgICAgICAvLyBPSywgYWRkaW5nICJyZXN0cmljdCIgaXMgYWxsb3dlZCwgRVJST1IsIGNoYW5naW5nIGZvcm1hdHMNCiAgICBmdW5jQihpbWcyKTsgICAgICAgICAgICAgIC8vIGlsbGVnYWwsIHN0cmlwcGluZyAiY29oZXJlbnQiIGlzIG5vdCwgRVJST1IsIGNoYW5naW5nIGZvcm1hdHMNCg0KICAgIHsNCiAgICAgICAgc3RydWN0IGxpZ2h0IHsNCiAgICAgICAgICAgIGZsb2F0IGludGVuc2l0eTsNCiAgICAgICAgICAgIHZlYzMgcG9zaXRpb247DQogICAgICAgIH07DQoNCiAgICAgICAgbGlnaHQgbGlnaHRWYXIgPSBsaWdodCgzLjAsIHZlYzMoMS4wLCAyLjAsIDMuMCkpOw0KICAgIH0NCiAgICB7DQogICAgICAgIGNvbnN0IGZsb2F0IGNbM10gPSBmbG9hdFszXSg1LjAsIDcuMiwgMS4xKTsNCiAgICAgICAgY29uc3QgZmxvYXQgZFszXSA9IGZsb2F0W10oNS4wLCA3LjIsIDEuMSk7DQoNCiAgICAgICAgZmxvYXQgZzsNCiAgICAgICAgZmxvYXQgYVs1XSA9IGZsb2F0WzVdKGcsIDEsIGcsIDIuMywgZyk7DQogICAgICAgIGZsb2F0IGJbM107DQoNCiAgICAgICAgYiA9IGZsb2F0WzNdKGcsIGcgKyAxLjAsIGcgKyAyLjApOw0KICAgIH0NCiAgICB7DQogICAgICAgIHZlYzQgYlsyXSA9IHsgdmVjNCgxLjApLCB2ZWM0KDEuMCkgfTsNCiAgICAgICAgdmVjNFszXVsyXShiLCBiLCBiKTsgICAgICAgIC8vIGNvbnN0cnVjdG9yDQogICAgICAgIHZlYzRbXVsyXShiLCBiLCBiKTsgICAgICAgICAvLyBjb25zdHJ1Y3RvciwgdmFsaWQsIHNpemUgZGVkdWNlZA0KICAgICAgICB2ZWM0WzNdW10oYiwgYiwgYik7ICAgICAgICAgLy8gY29tcGlsZS10aW1lIGVycm9yLCBpbnZhbGlkIHR5cGUgY29uc3RydWN0ZWQNCiAgICB9DQp9DQo=