ZGlmZiAtLWdpdCBhL3N1cHdpc2RvbS9wcm90b2NvbC9hbWFzc3Byb3RvY29sLnB5IGIvc3Vwd2lzZG9tL3Byb3RvY29sL2FtYXNzcHJvdG9jb2wucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ2YWJkMQotLS0gL2Rldi9udWxsCisrKyBiL3N1cHdpc2RvbS9wcm90b2NvbC9hbWFzc3Byb3RvY29sLnB5CkBAIC0wLDAgKzEsMzc1IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04DQorIiIiILvjtuDQrdLpt+LXsA0KKyIiIg0KK2ltcG9ydCBjb2RlY3MNCitpbXBvcnQgc3RydWN0DQorDQorSUZUX05VTEwgPSAwDQorSUZUX1VMT05HID0gMQ0KK0lGVF9CWVRFID0gMg0KK0lGVF9VU0hPUlQgPSAzDQorSUZUX0RBVEVUSU1FID0gNA0KK0lGVF9CVUZGRVIgPSA1DQorSUZUX1NUUklORyA9IDYNCitJRlRfTE9ORyA9IDcNCisNCisjICgwLDAsMSxJRlRfQllURSwwLCJtc2d0eXBlIiwiz/vPosLrIiksDQorDQorRkxEX05PX0lEWCA9IDANCitGTERfTEVOR1RIX0lEWCA9IDINCitGTERfVFlQRV9JRFggPSAzDQorRkxEX0ZMQUdfSURYID0gNA0KK0ZMRF9OQU1FX0lEWCA9IDUNCitGTERfREVTQ19JRFggPSA2DQorDQorSERGaWVsZHNEZWYgPSBbDQorKDEsIDAsIDAsIElGVF9OVUxMLCAwLCAiZXh0ZW5kIiwgdSLAqdW50/K38SIpLA0KKygyLCAwLCA0LCBJRlRfVUxPTkcsIDAsICJ0ZXJtaW5hbHNuIiwgdSIg1tW2y9DywdC6xSIpLA0KKygzLCAwLCAyLCBJRlRfVVNIT1JULCAwLCAiYWRkcmVzcyIsIHUiQ0FOtdjWtyIpLA0KKyg0LCAwLCA0LCBJRlRfVUxPTkcsIDAsICJjYXJkbnVtYmVyIiwgdSK/qLrFIiksDQorKDUsIDAsIDEsIElGVF9CWVRFLCAwLCAiaW5kZXhvZmV3IiwgdSIgx66w/Mv30v0iKSwNCisoNiwgMCwgMiwgSUZUX1VTSE9SVCwgMCwgInRyYWNlb2ZldyIsIHUiIMeusPzB98uuusUiKSwNCisoNywgMCwgNCwgSUZUX0xPTkcsIDAsICJhbW91bnQiLCB1IiC9u9LXvfC27iIpLA0KKyg4LCAwLCA0LCBJRlRfTE9ORywgMCwgImFkZGl0aW9uYWxhbW91bnQxIiwgdSK4vbzTvfC27iIpLA0KKyg5LCAwLCA0LCBJRlRfVUxPTkcsIDAsICJ0cmFjZW9mcG9zIiwgdSJQT1PB98uuusUiKSwNCisoMTAsIDAsIDQsIElGVF9VTE9ORywgMCwgIm9yZ3RyYW5zdHJhY2UiLCB1ItStvbvS18H3y666xSIpLA0KKygxMSwgMCwgNywgSUZUX0RBVEVUSU1FLCAwLCAiZGF0ZXRpbWUiLCB1Ir270tfI1cbaus3KsbzkIiksDQorKDEyLCAwLCAxLCBJRlRfQllURSwgMCwgInJlc3BvbnNlY29kZSIsIHUiz+zTpsLrIiksDQorKDEzLCAwLCAyLCBJRlRfVVNIT1JULCAwLCAidGVybWluYWxpZCIsIHUi1tW2y7rFIiksDQorKDE0LCAwLCAyLCBJRlRfVVNIT1JULCAwLCAidGVybWluYWx0eXBlIiwgdSLW1bbLwODQzSIpLA0KKygxNSwgMCwgMiwgSUZUX1VTSE9SVCwgMCwgIm1lcmNoYW50aWQiLCB1IsnMu6cozfi14ym6xSIpLA0KKygxNiwgMCwgNCwgSUZUX1VMT05HLCAwLCAib3BlcmF0b3JpZCIsIHUistnX99SxusUiKSwNCisoMTcsIDAsIDgsIElGVF9CVUZGRVIsIDAsICJwaW4iLCB1Irj2yMvKtrHwwutQSU4iKSwNCisoMTgsIDAsIDQsIElGVF9VTE9ORywgMCwgInZlcm9mbGlzdCIsIHUiutrD+7WlsOaxviIpLA0KKygxOSwgMCwgNCwgSUZUX1VMT05HLCAwLCAibWFuYWdlZmVlIiwgdSK9u9LXxfq0zrrFKNTdsrvTwykiKSwNCisoMjAsIDAsIDM2MCwgSUZUX0JVRkZFUiwgMiwgImFkZGl0aW9uYWxkYXRhMSIsIHUiuL2809DFz6IxIiksDQorKDIxLCAwLCA1MjgsIElGVF9CVUZGRVIsIDIsICJhZGRpdGlvbmFsZGF0YTIiLCB1Iri9vNPQxc+iMiIpLA0KKygyMiwgMCwgNTI4LCBJRlRfU1RSSU5HLCAyLCAiYWRkaXRpb25hbGRhdGEzIiwgdSK4vbzT0MXPojMiKSwNCisoMjMsIDAsIDUyOCwgSUZUX1NUUklORywgMiwgImFkZGl0aW9uYWxkYXRhNCIsIHUiuL2809DFz6I0IiksDQorKDI0LCAwLCAyLCBJRlRfVVNIT1JULCAwLCAibWFjIiwgdSLP+8+iyM/WpMLrIildDQorDQorDQorY2xhc3MgSERQYWNrOg0KKyAgICAnJycgu+O24CA4NTgzINCt0umw/CAnJycNCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOg0KKyAgICAgICAgc2VsZi5tc2dfdHlwZSA9IDANCisgICAgICAgIHNlbGYudmFsdWUgPSB7fQ0KKyAgICAgICAgc2VsZi5maWVsZF9pZHggPSB7fQ0KKyAgICAgICAgc2VsZi5maWVsZF9uYW1lID0ge30NCisgICAgICAgIHNlbGYubXNndHlwZSA9IDANCisgICAgICAgIHNlbGYubG9hZF9jb25maWcoKQ0KKw0KKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToNCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBIRFBhY2spOg0KKyAgICAgICAgICAgIHJldHVybiBGYWxzZQ0KKyAgICAgICAgcmV0dXJuIHNlbGYuY29tcGFyZShvdGhlcikNCisNCisgICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6DQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgSERQYWNrKToNCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQ0KKyAgICAgICAgcmV0dXJuIG5vdCBzZWxmLmNvbXBhcmUob3RoZXIpDQorDQorICAgIGRlZiBjb21wYXJlKHNlbGYsIG90aGVyKToNCisgICAgICAgIGlmIHNlbGYubXNndHlwZSAhPSBvdGhlci5tc2d0eXBlOg0KKyAgICAgICAgICAgIHJldHVybiBGYWxzZQ0KKyAgICAgICAgZm9yIGssIHYgaW4gc2VsZi52YWx1ZS5pdGVtcygpOg0KKyAgICAgICAgICAgIGlmIGsgbm90IGluIG90aGVyLnZhbHVlOg0KKyAgICAgICAgICAgICAgICBwcmludCAiZmllbGQgWyVzXSBub3QgZXF1YWwiICUgaw0KKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UNCisgICAgICAgICAgICBpZiB2ICE9IG90aGVyLmdldChrKToNCisgICAgICAgICAgICAgICAgcHJpbnQgImZpZWxkIFslc10gdmFsdWUgbm90IGVxdWFsIFslcywlc10iICUgKGssIHYsIG90aGVyLmdldChrKSkNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlDQorICAgICAgICByZXR1cm4gVHJ1ZQ0KKw0KKyAgICBkZWYgbG9hZF9jb25maWcoc2VsZik6DQorICAgICAgICBmb3IgZmllbGQgaW4gSERGaWVsZHNEZWY6DQorICAgICAgICAgICAgaW5kZXgsIHQsIGxlbiwgdHlwZSwgZmxhZywgbmFtZSwgZGVzYyA9IGZpZWxkDQorICAgICAgICAgICAgc2VsZi5maWVsZF9pZHhbaW5kZXhdID0gZmllbGQNCisgICAgICAgICAgICBzZWxmLmZpZWxkX25hbWVbbmFtZV0gPSBmaWVsZA0KKyAgICAgICAgI3ByaW50IHNlbGYuZmllbGRfbmFtZQ0KKw0KKyAgICBkZWYgZ2V0X2ZpZWxkX2RlZihzZWxmLCBpbmRleCk6DQorICAgICAgICBmaWVsZF9kZWYgPSBOb25lDQorICAgICAgICBpZiBpc2luc3RhbmNlKGluZGV4LCBpbnQpOg0KKyAgICAgICAgICAgIGlmIGluZGV4IG5vdCBpbiBzZWxmLmZpZWxkX2lkeDoNCisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZmllbGQgaW5kZXggJWQgbm90IGV4aXN0cyIgJSBpbmRleCkNCisgICAgICAgICAgICBmaWVsZF9kZWYgPSBzZWxmLmZpZWxkX2lkeFtpbmRleF0NCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShpbmRleCwgc3RyKToNCisgICAgICAgICAgICBpZiBpbmRleCBub3QgaW4gc2VsZi5maWVsZF9uYW1lOg0KKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJmaWVsZCBpbmRleCAlcyBub3QgZXhpc3RzIiAlIGluZGV4KQ0KKyAgICAgICAgICAgIGZpZWxkX2RlZiA9IHNlbGYuZmllbGRfbmFtZVtpbmRleF0NCisgICAgICAgIGVsc2U6DQorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZmllbGQgaW5kZXggdHlwZSBub3Qgc3VwcG9ydCIpDQorICAgICAgICByZXR1cm4gZmllbGRfZGVmDQorDQorICAgIGRlZiBzZXQoc2VsZiwgaW5kZXgsIHZhbHVlKToNCisgICAgICAgIGZpZWxkX2RlZiA9IHNlbGYuZ2V0X2ZpZWxkX2RlZihpbmRleCkNCisgICAgICAgIHQgPSBmaWVsZF9kZWZbRkxEX1RZUEVfSURYXQ0KKyAgICAgICAgbiA9IGZpZWxkX2RlZltGTERfTkFNRV9JRFhdDQorICAgICAgICBsID0gZmllbGRfZGVmW0ZMRF9MRU5HVEhfSURYXQ0KKyAgICAgICAgZiA9IGZpZWxkX2RlZltGTERfRkxBR19JRFhdDQorICAgICAgICBpZiB0ID09IElGVF9VU0hPUlQgb3IgdCA9PSBJRlRfVUxPTkcgb3IgdCA9PSBJRlRfTlVMTCBvciB0ID09IElGVF9CWVRFIG9yIHQgPT0gSUZUX0xPTkc6DQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgaW50KToNCisgICAgICAgICAgICAgICAgYiA9IHZhbHVlDQorICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHZhbHVlLCBzdHIpOg0KKyAgICAgICAgICAgICAgICBpZiB2YWx1ZS5zdGFydHN3aXRoKCcweCcpOg0KKyAgICAgICAgICAgICAgICAgICAgYiA9IGludCh2YWx1ZSwgMTYpDQorICAgICAgICAgICAgICAgIGVsc2U6DQorICAgICAgICAgICAgICAgICAgICBiID0gaW50KHZhbHVlKQ0KKyAgICAgICAgICAgIGVsc2U6DQorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImZpZWxkICVzIHZhbHVlIHR5cGUgbm90IGludGVnZXIiICUgbikNCisgICAgICAgIGVsaWYgdCA9PSBJRlRfREFURVRJTUU6DQorICAgICAgICAgICAgaWYgbGVuKHZhbHVlKSAhPSAxMiBhbmQgbGVuKHZhbHVlKSAhPSAxNDoNCisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZmllbGQgJXMgbGVuZ3RoIG11c3QgYmUgMTIgb3IgMTQiICUgbikNCisgICAgICAgICAgICBpZiBsZW4odmFsdWUpID09IDE0Og0KKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlWzI6XQ0KKyAgICAgICAgICAgIGIgPSB2YWx1ZSArICIwMCINCisgICAgICAgIGVsc2U6DQorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIHN0cik6DQorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImZpZWxkICVzIHZhbHVlIHR5cGUgbm90IHN0cmluZyIgJSBuKQ0KKyAgICAgICAgICAgIGlmIHQgPT0gSUZUX0RBVEVUSU1FOg0KKyAgICAgICAgICAgICAgICBsICo9IDINCisgICAgICAgICAgICBlbGlmIHZhbHVlLnN0YXJ0c3dpdGgoJzB4Jyk6DQorICAgICAgICAgICAgICAgIGwgKj0gMg0KKyAgICAgICAgICAgICAgICBsICs9IDINCisgICAgICAgICAgICBpZiBmICE9IDIgYW5kIGxlbih2YWx1ZSkgIT0gbDoNCisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZmllbGQgJXMgdmFsdWUgZGF0YSBsZW5ndGggbm90IGVxdWFsICVkPD4lZCAiICUNCisgICAgICAgICAgICAgICAgICAgIChuLCBsZW4odmFsdWUpLCBsKSkNCisgICAgICAgICAgICBlbGlmIGxlbih2YWx1ZSkgPiBsOg0KKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJmaWVsZCAlcyB2YWx1ZSBkYXRhIGxlbmd0aCBleGNlZWQgJWQgIiAlIChuLCBsKSkNCisgICAgICAgICAgICBiID0gdmFsdWUNCisgICAgICAgIHNlbGYudmFsdWVbbl0gPSBiDQorDQorICAgIGRlZiBnZXQoc2VsZiwgaW5kZXgpOg0KKyAgICAgICAgZmllbGRfZGVmID0gc2VsZi5nZXRfZmllbGRfZGVmKGluZGV4KQ0KKyAgICAgICAgI3QgPSBmaWVsZF9kZWZbM10NCisgICAgICAgIG4gPSBmaWVsZF9kZWZbNV0NCisgICAgICAgIGlmIG4gaW4gc2VsZi52YWx1ZToNCisgICAgICAgICAgICByZXR1cm4gc2VsZi52YWx1ZVtuXQ0KKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRmllbGQgJXMgbm90IHNwZWNpZmllZCIgJSBuKQ0KKw0KKyAgICBkZWYgZW5jb2RlX2JpdG1hcChzZWxmLCBiaXRtYXApOg0KKyAgICAgICAgYnVmZmVyID0gW10NCisgICAgICAgIG9mZnNldCA9IDANCisgICAgICAgICNwcmludCAiYml0IGxlblslZF0iICUgbGVuKGJpdG1hcCkNCisgICAgICAgIHdoaWxlIG9mZnNldCA8IGxlbihiaXRtYXApOg0KKyAgICAgICAgICAgIGJpdCA9IDANCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSg4KToNCisgICAgICAgICAgICAgICAgdCA9IG9yZChiaXRtYXBbb2Zmc2V0ICsgaV0pIC0gMHgzMA0KKyAgICAgICAgICAgICAgICBpZiB0ID09IDA6IGNvbnRpbnVlDQorICAgICAgICAgICAgICAgIGJpdCB8PSAoMSA8PCAoNyAtIGkgJSA4KSkNCisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGNocihiaXQgJiAweEZGKSkNCisgICAgICAgICAgICBvZmZzZXQgKz0gOA0KKyAgICAgICAgcmV0dXJuICIiLmpvaW4oYnVmZmVyKQ0KKw0KKyAgICBkZWYgcGFjayhzZWxmLCB3b3Jra2V5PU5vbmUpOg0KKyAgICAgICAgYnVmZmVyID0gW10NCisgICAgICAgIGJpdG1hcCA9IFsnMCcgZm9yIGkgaW4gcmFuZ2UoMjQpXQ0KKyAgICAgICAgZm9yIGZpZWxkIGluIEhERmllbGRzRGVmOg0KKyAgICAgICAgICAgIGluZGV4LCB4LCBsZW4sIHQsIGZsYWcsIG5hbWUsIGRlc2MgPSBmaWVsZA0KKyAgICAgICAgICAgIGlmIG5hbWUgbm90IGluIHNlbGYudmFsdWU6DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlDQorICAgICAgICAgICAgaWYgdCA9PSBJRlRfVVNIT1JUIG9yIHQgPT0gSUZUX1VMT05HIG9yIHQgPT0gSUZUX05VTEwgb3IgdCA9PSBJRlRfQllURSBvciB0ID09IElGVF9MT05HOg0KKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKHNlbGYuaW50XzJfYnVmZmVyKHNlbGYudmFsdWVbbmFtZV0sIHQsIGxlbikpDQorICAgICAgICAgICAgZWxzZToNCisgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChzZWxmLnN0cmluZ18yX2J1ZmZlcihzZWxmLnZhbHVlW25hbWVdLCB0LCBsZW4sIGZsYWcpKQ0KKyAgICAgICAgICAgIGJpdG1hcFtpbmRleCAtIDFdID0gJzEnDQorICAgICAgICAjcHJpbnQgYml0bWFwDQorICAgICAgICBiaXRtYXBfYnVmZmVyID0gc2VsZi5lbmNvZGVfYml0bWFwKGJpdG1hcCkNCisgICAgICAgIGZ1bGxfZGF0YSA9IGNocihzZWxmLm1zZ3R5cGUgJiAweEZGKSArIGJpdG1hcF9idWZmZXIgKyAiIi5qb2luKGJ1ZmZlcikNCisgICAgICAgIGhlYWRlciA9IHNlbGYuZGF0YV9oZWFkZXIoZnVsbF9kYXRhKQ0KKyAgICAgICAgI3ByaW50ICJoWyVzXWRbJXNdIiAlIChjb2RlY3MuZW5jb2RlKGhlYWRlciwnaGV4JyksY29kZWNzLmVuY29kZShmdWxsX2RhdGEsJ2hleCcpKQ0KKyAgICAgICAgcmV0dXJuIGhlYWRlciArIGZ1bGxfZGF0YQ0KKw0KKyAgICBkZWYgZGF0YV9oZWFkZXIoc2VsZiwgYnVmZmVyKToNCisgICAgICAgIGlmIGxlbihidWZmZXIpID4gMHhGRkZGOg0KKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkJ1ZmZlciBtYXggbGVuZ3RoIGV4Y2VlZCAlZCIsIGxlbihidWZmZXIpKQ0KKyAgICAgICAgaGVhZGVyID0gc3RydWN0LnBhY2soJzxIJywgbGVuKGJ1ZmZlcikpDQorICAgICAgICByZXR1cm4gaGVhZGVyDQorDQorICAgIGRlZiBpbnRfMl9idWZmZXIoc2VsZiwgdmFsdWUsIHR5cGUsIGxlbmd0aCk6DQorICAgICAgICBidWZmZXIgPSAnJw0KKyAgICAgICAgaWYgdHlwZSA9PSBJRlRfQllURToNCisgICAgICAgICAgICBidWZmZXIgPSBjaHIodmFsdWUgJSAweDEwMCkNCisgICAgICAgIGVsaWYgdHlwZSA9PSBJRlRfTlVMTDoNCisgICAgICAgICAgICByZXR1cm4gYnVmZmVyDQorICAgICAgICBlbGlmIHR5cGUgPT0gSUZUX1VTSE9SVDoNCisgICAgICAgICAgICB2ID0gdmFsdWUgJSAweDEwMDAwDQorICAgICAgICAgICAgYnVmZmVyID0gc3RydWN0LnBhY2soJzxIJywgdikNCisgICAgICAgIGVsaWYgdHlwZSA9PSBJRlRfVUxPTkc6DQorICAgICAgICAgICAgYnVmZmVyID0gc3RydWN0LnBhY2soJzxJJywgdmFsdWUpDQorICAgICAgICBlbGlmIHR5cGUgPT0gSUZUX0xPTkc6DQorICAgICAgICAgICAgYnVmZmVyID0gc3RydWN0LnBhY2soJzxpJywgdmFsdWUpDQorICAgICAgICBlbHNlOg0KKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0lucHV0IEVycm9yJykNCisgICAgICAgIHJldHVybiBidWZmZXINCisNCisgICAgZGVmIGVuY29kZV9iY2Qoc2VsZiwgdmFsdWUpOg0KKyAgICAgICAgaWYgbGVuKHZhbHVlKSAlIDIgIT0gMDoNCisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ2YWx1ZSBsZW5ndGggbXVzdCBkaXYgMiIpDQorICAgICAgICBpID0gMA0KKyAgICAgICAgI3ByaW50ICJ2YWx1ZSBbJXNdIiAlIHZhbHVlDQorICAgICAgICBidWZmZXIgPSBbXQ0KKyAgICAgICAgd2hpbGUgaSA8IGxlbih2YWx1ZSk6DQorICAgICAgICAgICAgdDEgPSAob3JkKHZhbHVlW2ldKSAtIDB4MzApICYgMHhGRg0KKyAgICAgICAgICAgIHQyID0gKG9yZCh2YWx1ZVtpICsgMV0pIC0gMHgzMCkgJiAweEZGDQorICAgICAgICAgICAgI3ByaW50ICJ0MVslZF10MlslZF0iICUgKHQxLHQyKQ0KKyAgICAgICAgICAgIHQgPSAoKHQxIDw8IDQpIHwgdDIpICYgMHhGRg0KKyAgICAgICAgICAgICNwcmludCAidDFbJWRddDJbJWRddFslZF0iICUgKHQxLHQyLHQpDQorICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChjaHIodCkpDQorICAgICAgICAgICAgaSArPSAyDQorICAgICAgICAjcHJpbnQgImJjZCB2YWx1ZVslc10iICUgY29kZWNzLmVuY29kZShidWZmZXIsJ2hleCcpDQorICAgICAgICByZXR1cm4gIiIuam9pbihidWZmZXIpDQorDQorICAgIGRlZiBkZWNvZGVfYmNkKHNlbGYsIHZhbHVlKToNCisgICAgICAgIGJ1ZmZlciA9IFtdDQorICAgICAgICAjcHJpbnQgImJjZCBbJXNdIiAlIGNvZGVjcy5lbmNvZGUodmFsdWUsJ2hleCcpDQorICAgICAgICBmb3IgYyBpbiB2YWx1ZToNCisgICAgICAgICAgICB0ID0gb3JkKGMpICYgMHhGRg0KKyAgICAgICAgICAgIHQxID0gKHQgPj4gNCkgJiAweDBGDQorICAgICAgICAgICAgdDIgPSB0ICYgMHgwRg0KKyAgICAgICAgICAgICNwcmludCAidFslMDJ4XXQxWyVkXXQyWyVkXSIgJSAodCx0MSx0MikNCisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGNocih0MSArIDB4MzApICsgY2hyKHQyICsgMHgzMCkpDQorICAgICAgICAjcHJpbnQgImJjZCB2YWx1ZVslc10iICUgYnVmZmVyDQorICAgICAgICByZXR1cm4gIiIuam9pbihidWZmZXIpDQorDQorICAgIGRlZiBzdHJpbmdfMl9idWZmZXIoc2VsZiwgdmFsdWUsIHR5cGUsIGxlbmd0aCwgZmxhZyk6DQorICAgICAgICBidWZmZXIgPSAnJw0KKyAgICAgICAgaWYgdHlwZSA9PSBJRlRfU1RSSU5HIG9yIHR5cGUgPT0gSUZUX0JVRkZFUjoNCisgICAgICAgICAgICBpZiB2YWx1ZS5zdGFydHN3aXRoKCcweCcpOg0KKyAgICAgICAgICAgICAgICBidWZmZXIgPSBjb2RlY3MuZGVjb2RlKHZhbHVlWzI6XSwgJ2hleCcpDQorICAgICAgICAgICAgZWxzZToNCisgICAgICAgICAgICAgICAgYnVmZmVyID0gdmFsdWUNCisgICAgICAgIGVsaWYgdHlwZSA9PSBJRlRfREFURVRJTUU6DQorICAgICAgICAgICAgYnVmZmVyID0gJycNCisgICAgICAgICAgICBpID0gMA0KKyAgICAgICAgICAgIHdoaWxlIGkgPCBsZW4odmFsdWUpOg0KKyAgICAgICAgICAgICAgICB0ID0gaW50KHZhbHVlW2k6aSArIDJdKQ0KKyAgICAgICAgICAgICAgICBidWZmZXIgKz0gY2hyKHQgJiAweEZGKQ0KKyAgICAgICAgICAgICAgICBpICs9IDINCisgICAgICAgIGVsc2U6DQorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignSW5wdXQgRXJyb3InKQ0KKyAgICAgICAgaWYgZmxhZyA9PSAyOg0KKyAgICAgICAgICAgIGhlYWRlciA9IHN0cnVjdC5wYWNrKCc8SCcsIGxlbihidWZmZXIpICUgMHgxMDAwMCkNCisgICAgICAgICAgICByZXR1cm4gaGVhZGVyICsgYnVmZmVyDQorICAgICAgICBlbHNlOg0KKyAgICAgICAgICAgICNpZiB0eXBlID09IElGVF9CVUZGRVI6DQorICAgICAgICAgICAgIyAgICBpZiBsZW4oYnVmZmVyKSAlIDIgPD4gMCBvciBsZW4oYnVmZmVyKS8yIDw+IGxlbmd0aDoNCisgICAgICAgICAgICAjICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJWYWx1ZSBsZW5ndGggbm90IG1hdGNoZWQgWyVzXSIgJSB2YWx1ZSkNCisgICAgICAgICAgICAjICAgIGJ1ZmZlciA9IGNvZGVjcy5kZWNvZGUoYnVmZmVyLCdoZXgnKQ0KKyAgICAgICAgICAgIGlmIGxlbihidWZmZXIpICE9IGxlbmd0aDoNCisgICAgICAgICAgICAgICAgcGFkbGVuID0gbGVuZ3RoIC0gbGVuKGJ1ZmZlcikNCisgICAgICAgICAgICAgICAgaWYgcGFkbGVuIDwgMDoNCisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlZhbHVlIGxlbmd0aCBub3QgbWF0Y2hlZCBbJXNdIiAlIHZhbHVlKQ0KKyAgICAgICAgICAgICAgICBwYWQgPSBjaHIoMCkgKiBwYWRsZW4NCisgICAgICAgICAgICAgICAgYnVmZmVyID0gcGFkICsgYnVmZmVyDQorICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcg0KKw0KKyAgICBkZWYgZGVjb2RlX2JpdG1hcChzZWxmLCBiaXRtYXApOg0KKyAgICAgICAgaWYgbGVuKGJpdG1hcCkgIT0gMzoNCisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJiaXRtYXAgbGVuZ3RoIGVycm9yIikNCisgICAgICAgICNwcmludCAiYml0bWFwWyVzXSIgJSBjb2RlY3MuZW5jb2RlKGJpdG1hcCwnaGV4JykNCisgICAgICAgIGJ1ZmZlciA9IFtdDQorICAgICAgICBmb3IgdCBpbiBiaXRtYXA6DQorICAgICAgICAgICAgdiA9IG9yZCh0KSAmIDB4RkYNCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSg4KToNCisgICAgICAgICAgICAgICAgeCA9ICh2ICYgKDEgPDwgKDcgLSBpKSkpDQorICAgICAgICAgICAgICAgIGlmIHggPiAwOg0KKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnMScpDQorICAgICAgICAgICAgICAgIGVsc2U6DQorICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCcwJykNCisgICAgICAgIHJldHVybiBidWZmZXINCisNCisgICAgZGVmIHVucGFjayhzZWxmLCBkYXRhKToNCisgICAgICAgIHNlbGYudmFsdWUgPSB7fQ0KKyAgICAgICAgI3ByaW50ICJkYXRhWyVzXSIgJSBjb2RlY3MuZW5jb2RlKGRhdGEsJ2hleCcpDQorICAgICAgICBkYXRhX2xlbiA9IHN0cnVjdC51bnBhY2soJzxIJywgZGF0YVs6Ml0pWzBdDQorICAgICAgICBpZiBsZW4oZGF0YSkgIT0gZGF0YV9sZW4gKyAyOg0KKyAgICAgICAgICAgIHByaW50ICJpbnB1dFslZF0gZXh0dWFsbHlbJWRdIiAlIChkYXRhX2xlbiwgbGVuKGRhdGEpKQ0KKyAgICAgICAgICAgIHJldHVybiBGYWxzZQ0KKyAgICAgICAgb2Zmc2V0ID0gMg0KKyAgICAgICAgc2VsZi5tc2d0eXBlID0gb3JkKGRhdGFbb2Zmc2V0XSkgJiAweEZGDQorICAgICAgICBvZmZzZXQgKz0gMQ0KKyAgICAgICAgYml0bWFwID0gc2VsZi5kZWNvZGVfYml0bWFwKGRhdGFbb2Zmc2V0Om9mZnNldCArIDNdKQ0KKyAgICAgICAgb2Zmc2V0ICs9IDMNCisgICAgICAgICNwcmludCBiaXRtYXANCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihiaXRtYXApKToNCisgICAgICAgICAgICBpZiBiaXRtYXBbaV0gPT0gJzAnOiBjb250aW51ZQ0KKyAgICAgICAgICAgIGZpbmRleCA9IGkgKyAxDQorICAgICAgICAgICAgZmllbGQgPSBzZWxmLmdldF9maWVsZF9kZWYoZmluZGV4KQ0KKyAgICAgICAgICAgIGZ0eXBlID0gZmllbGRbRkxEX1RZUEVfSURYXQ0KKyAgICAgICAgICAgIGZsZW4gPSBmaWVsZFtGTERfTEVOR1RIX0lEWF0NCisgICAgICAgICAgICBmZmxhZyA9IGZpZWxkW0ZMRF9GTEFHX0lEWF0NCisgICAgICAgICAgICAjZm5hbWUgPSBmaWVsZFtGTERfTkFNRV9JRFhdDQorICAgICAgICAgICAgI3ByaW50ICJwYXJzZSBmaWVsZFslc10gWyVkXW9mZlslZF1bJXNdIiAlIChmbmFtZSxmZmxhZyxvZmZzZXQsY29kZWNzLmVuY29kZShkYXRhW29mZnNldDpvZmZzZXQrMl0sJ2hleCcpKQ0KKyAgICAgICAgICAgICMgseSzpMr9vt0NCisgICAgICAgICAgICBpZiBmZmxhZyA9PSAyOg0KKyAgICAgICAgICAgICAgICAjcHJpbnQgImxlbiBbJXNdIiAlIGNvZGVjcy5lbmNvZGUoZGF0YVtvZmZzZXQ6b2Zmc2V0KzJdLCdoZXgnKQ0KKyAgICAgICAgICAgICAgICBlbmRwb3MgPSBzZWxmLmJ1ZmZlcl8yX2ludChkYXRhW29mZnNldDpvZmZzZXQgKyAyXSwgSUZUX1VTSE9SVCkNCisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDINCisgICAgICAgICAgICAgICAgZW5kcG9zICs9IG9mZnNldA0KKyAgICAgICAgICAgIGVsc2U6DQorICAgICAgICAgICAgICAgIGVuZHBvcyA9IG9mZnNldCArIGZsZW4NCisgICAgICAgICAgICBpZiBmdHlwZSA9PSBJRlRfVVNIT1JUIG9yIGZ0eXBlID09IElGVF9VTE9ORyBvciBmdHlwZSA9PSBJRlRfTlVMTCBvciBmdHlwZSA9PSBJRlRfQllURSBvciBmdHlwZSA9PSBJRlRfTE9ORzoNCisgICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLmJ1ZmZlcl8yX2ludChkYXRhW29mZnNldDplbmRwb3NdLCBmdHlwZSkNCisgICAgICAgICAgICBlbHNlOg0KKyAgICAgICAgICAgICAgICAjdGVtcCA9IHNlbGYuYnVmZmVyXzJfc3RyaW5nKGRhdGFbb2Zmc2V0OmVuZHBvc10sZnR5cGUpDQorICAgICAgICAgICAgICAgICNpZiBmZmxhZyAhPSAyIGFuZCBmdHlwZSA9PSBJRlRfU1RSSU5HOg0KKyAgICAgICAgICAgICAgICAjICAgIGZvciBpIGluIHRlbXA6DQorICAgICAgICAgICAgICAgICMgICAgICAgIHByaW50ICJjaGFyIFslMDJ4XSIgJSBvcmQoaSkNCisgICAgICAgICAgICAgICAgIyAgICAgICAgaWYgb3JkKGkpID4gMDoNCisgICAgICAgICAgICAgICAgIyAgICAgICAgICAgIHZhbHVlICs9IGkNCisgICAgICAgICAgICAgICAgI2Vsc2U6DQorICAgICAgICAgICAgICAgICMgICAgdmFsdWUgPSB0ZW1wDQorICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5idWZmZXJfMl9zdHJpbmcoZGF0YVtvZmZzZXQ6ZW5kcG9zXSwgZnR5cGUpDQorICAgICAgICAgICAgICAgIGlmIGZmbGFnICE9IDIgYW5kIGZ0eXBlID09IElGVF9CVUZGRVI6DQorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICcweCcgKyBjb2RlY3MuZW5jb2RlKHZhbHVlLCAnaGV4JykNCisgICAgICAgICAgICBzZWxmLnNldChmaW5kZXgsIHZhbHVlKQ0KKyAgICAgICAgICAgICNwcmludCAicGFyc2UgZmllbGRbJXNdIE9LID09PT09IiAlIGZuYW1lDQorICAgICAgICAgICAgb2Zmc2V0ID0gZW5kcG9zDQorICAgICAgICAjcHJpbnQgc2VsZi52YWx1ZQ0KKyAgICAgICAgcmV0dXJuIFRydWUNCisNCisgICAgZGVmIGJ1ZmZlcl8yX2ludChzZWxmLCBkYXRhLCB0eXBlKToNCisgICAgICAgIGlmIHR5cGUgPT0gSUZUX0JZVEU6DQorICAgICAgICAgICAgcmV0dXJuIG9yZChkYXRhKQ0KKyAgICAgICAgZWxpZiB0eXBlID09IElGVF9VU0hPUlQ6DQorICAgICAgICAgICAgcmV0dXJuIHN0cnVjdC51bnBhY2soJzxIJywgZGF0YSlbMF0NCisgICAgICAgIGVsaWYgdHlwZSA9PSBJRlRfVUxPTkc6DQorICAgICAgICAgICAgcmV0dXJuIHN0cnVjdC51bnBhY2soJzxJJywgZGF0YSlbMF0NCisgICAgICAgIGVsaWYgdHlwZSA9PSBJRlRfTE9ORzoNCisgICAgICAgICAgICByZXR1cm4gc3RydWN0LnVucGFjaygnPGknLCBkYXRhKVswXQ0KKyAgICAgICAgZWxpZiB0eXBlID09IElGVF9OVUxMOg0KKyAgICAgICAgICAgIHJldHVybiBOb25lDQorICAgICAgICBlbHNlOg0KKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImlucHV0IGRhdGEgdHlwZSBlcnJvciIpDQorDQorICAgIGRlZiBidWZmZXJfMl9zdHJpbmcoc2VsZiwgZGF0YSwgdHlwZSk6DQorICAgICAgICBpZiB0eXBlID09IElGVF9TVFJJTkc6DQorICAgICAgICAgICAgcmV0dXJuIGRhdGENCisgICAgICAgIGVsaWYgdHlwZSA9PSBJRlRfQlVGRkVSOg0KKyAgICAgICAgICAgIHJldHVybiBkYXRhDQorICAgICAgICBlbGlmIHR5cGUgPT0gSUZUX0RBVEVUSU1FOg0KKyAgICAgICAgICAgIHJldHVybiBzZWxmLmRlY29kZV9iY2QoZGF0YSkNCisgICAgICAgIGVsc2U6DQorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaW5wdXQgZGF0YSB0eXBlIGVycm9yIikNCisNCisgICAgZGVmIGdldF8yYnl0ZV9pbnQoc2VsZiwgZGF0YSk6DQorICAgICAgICByZXR1cm4gc3RydWN0LnVucGFjaygiPkgiLCBkYXRhKVswXQ0KKw0KKyAgICBkZWYgZ2V0XzNieXRlX2ludChzZWxmLCBkYXRhKToNCisgICAgICAgIHRlbXAgPSBkYXRhICsgY2hyKDApDQorICAgICAgICByZXR1cm4gc3RydWN0LnVucGFjaygiPEkiLCB0ZW1wKVswXQ0KKw0KKyAgICBkZWYgZ2V0XzRieXRlX2ludChzZWxmLCBkYXRhKToNCisgICAgICAgIHJldHVybiBzdHJ1Y3QudW5wYWNrKCI8SSIsIGRhdGEpWzBdDQorDQorICAgIGRlZiBzZXRfMmJ5dGVfaW50KHNlbGYsIGRhdGEpOg0KKyAgICAgICAgcmV0dXJuIHN0cnVjdC5wYWNrKCc8SCcsIGRhdGEpDQorDQorICAgIGRlZiBzZXRfM2J5dGVfaW50KHNlbGYsIGRhdGEpOg0KKyAgICAgICAgdGVtcCA9IHN0cnVjdC5wYWNrKCc8SCcsIGRhdGEpDQorICAgICAgICByZXR1cm4gdGVtcFs6LTFdDQorDQorICAgIGRlZiBzZXRfNGJ5dGVfaW50KHNlbGYsIGRhdGEpOg0KKyAgICAgICAgcmV0dXJuIHN0cnVjdC5wYWNrKCc8SScsIGRhdGEpDQo=