This repository has been archived by the owner on Dec 25, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathVEX2019.vex
1 lines (1 loc) · 28 KB
/
VEX2019.vex
1
./___ThIsisATemPoRaRyFiLE___.json 000644 000765 000024 0000064746 13431670611 022543 0 ustar 00mathandprotonwiz 000000 000000 13431670611 13431670611 {"title":"VEX2019","description":"Team 2585 VEX2019","version":"0.0.1","icon":"USER000x.bmp","files":{"robot-config.h":"dXNpbmcgbmFtZXNwYWNlIHZleDsKYnJhaW4gQnJhaW47CmNvbnRyb2xsZXIgQ29udHJvbGxlcjEgPSBjb250cm9sbGVyKCk7CgpuYW1lc3BhY2UgdmV4IHsKICBjbGFzcyBtb3Rvcl9zcGVjaWFsIDogcHVibGljIG1vdG9yIHsKICAgIHByaXZhdGU6CiAgICAgIHVpbnQzMl90ICBfbG9jYWxfaW5kZXg7CgogICAgcHVibGljOgogICAgICBtb3Rvcl9zcGVjaWFsKCBpbnQzMl90IGluZGV4LCBib29sIGlzUmV2ZXJzZWQgKSA6ICBtb3RvciggaW5kZXgsIGlzUmV2ZXJzZWQgKSwgX2xvY2FsX2luZGV4KGluZGV4KSB7fTsgIAogICAgICB+bW90b3Jfc3BlY2lhbCgpIHt9OwoKICAgICAgLy8gQWxsb3cgb3ZlcmxvYWRpbmcgb2YgYmFzZSBjbGFzcyBtZXRob2RzCiAgICAgIHVzaW5nIG1vdG9yOjpzcGluOwogICAgICAKICAgICAgLy8gVGhpcyBpcyBzaW1pbGFyLCBub3QgcXVpdGUgdGhlIHNhbWUsIGFzIG5ldyBhIG1ldGhvZCBpbiB0aGUgbmV4dCAoTm92ID8pIFNESyByZWxlYXNlCiAgICAgIC8vIHZvbHRhZ2UgY2FuIGJlICsvLTEyLjAgdm9sdGEgb3IgKy8tMTIwMDAgbVYKICAgICAgdm9pZCBzcGluKCBkaXJlY3Rpb25UeXBlIGRpciwgZG91YmxlIHZvbHRhZ2UsIHZvbHRhZ2VVbml0cyB1bml0cyApIHsKICAgICAgICAvLyBjb252ZXJ0IHZvbHRzIHRvIG1WIGlzIG5lY2Vzc2FyeQogICAgICAgIGludDMyX3Qgdm9sdGFnZV9tdiA9ICh1bml0cyA9PSB2b2x0YWdlVW5pdHM6OnZvbHQgPyB2b2x0YWdlICogMTAwMC4wIDogdm9sdGFnZSApOwoKICAgICAgICAvLyBmbGlwIGJhc2VkIG9uIGRpcmVjdGlvbiBmbGFnCiAgICAgICAgdm9sdGFnZV9tdiA9IChkaXIgPT0gZGlyZWN0aW9uVHlwZTo6ZndkID8gdm9sdGFnZV9tdiA6IC0odm9sdGFnZV9tdikgKTsKCiAgICAgICAgaWYoIHZvbHRhZ2VfbXYgPT0gMCApIHsKICAgICAgICAgIHN0b3AoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gc2VuZCBtViB2YWx1ZSB0byBjb250cm9sIG1vdG9yIG9wZW4gbG9vcAogICAgICAgICAgdmV4TW90b3JWb2x0YWdlU2V0KCBfbG9jYWxfaW5kZXgsIHZvbHRhZ2VfbXYgKTsKICAgICAgICB9CiAgICAgIH0KICB9Owp9CgovL1BvcnQgZGVjbGFyYXRpb25zCm1vdG9yX3NwZWNpYWwgTEJNb3RvciA9IG1vdG9yX3NwZWNpYWwoUE9SVDEsIGZhbHNlKTsKbW90b3Jfc3BlY2lhbCBMRk1vdG9yID0gbW90b3Jfc3BlY2lhbChQT1JUMiwgZmFsc2UpOwptb3Rvcl9zcGVjaWFsIFJCTW90b3IgPSBtb3Rvcl9zcGVjaWFsKFBPUlQxMCwgdHJ1ZSk7Cm1vdG9yX3NwZWNpYWwgUkZNb3RvciA9IG1vdG9yX3NwZWNpYWwoUE9SVDksIHRydWUpOwoKbW90b3IgTGVmdEJhY2tNb3RvciA9IG1vdG9yKFBPUlQxLCBmYWxzZSk7Cm1vdG9yIExlZnRGcm9udE1vdG9yID0gbW90b3IoUE9SVDIsIGZhbHNlKTsKbW90b3IgUmlnaHRCYWNrTW90b3IgPSBtb3RvcihQT1JUMTAsIHRydWUpOwptb3RvciBSaWdodEZyb250TW90b3IgPSBtb3RvcihQT1JUOSwgdHJ1ZSk7Cm1vdG9yIGRyaXZlVHJhaW5Nb3RvcnNbXSA9IHtMZWZ0QmFja01vdG9yLCBMZWZ0RnJvbnRNb3RvciwgUmlnaHRCYWNrTW90b3IsIFJpZ2h0RnJvbnRNb3Rvcn07Cm1vdG9yIEFybU1vdG9yID0gbW90b3IoUE9SVDExLCB0cnVlKTsKbW90b3IgRmVlZGVyID0gbW90b3IoUE9SVDIwLCB0cnVlKTsKbW90b3IgSW50YWtlTW90b3IgPSBtb3RvcihQT1JUMyk7Cm1vdG9yIFNob290ZXJNb3RvciA9IG1vdG9yKFBPUlQ1LCB0cnVlKTsKCi8vU2Vuc29ycwovL1Zpc2lvbiBTZXR1cAp2aXNpb246OnNpZ25hdHVyZSBTSUdfMSAoMSwgMCwgMCwgMCwgMCwgMCwgMCwgMywgMCk7CnZpc2lvbjo6c2lnbmF0dXJlIEJMVUVfT0JKICgyLCAtMjk3OSwgMzgxLCAtMTI5OSwgLTEsIDEwNDI3LCA1MjEzLCAwLjMwMDAwMDAxMTkyMDkyODk2LCAxKTsKdmlzaW9uOjpzaWduYXR1cmUgUkVEX09CSiAoMywgNDEzMSwgMTE4NDMsIDc5ODcsIC0zMDk5LCAtMTUzMSwgLTIzMTUsIDEsIDEpOwp2aXNpb246OnNpZ25hdHVyZSBHUkVFTl9GTEFHICg0LCAtMzUyMSwgLTI0MjEsIC0yOTcxLCAtNzU4MywgLTY3MzMsIC03MTU4LCAxLjcwMDAwMDA0NzY4MzcxNTgsIDEpOwp2aXNpb246OnNpZ25hdHVyZSBTSUdfNSAoNSwgMCwgMCwgMCwgMCwgMCwgMCwgMywgMCk7CnZpc2lvbjo6c2lnbmF0dXJlIFNJR182ICg2LCAwLCAwLCAwLCAwLCAwLCAwLCAzLCAwKTsKdmlzaW9uOjpzaWduYXR1cmUgU0lHXzcgKDcsIDAsIDAsIDAsIDAsIDAsIDAsIDMsIDApOwp2aXNpb246OmNvZGUgQkxVRV9GTEFHIChCTFVFX09CSiwgR1JFRU5fRkxBRyk7CnZpc2lvbjo6Y29kZSBSRURfRkxBRyAoUkVEX09CSiwgR1JFRU5fRkxBRyk7CnZpc2lvbiBWaXNpb25TZW5zb3IgPSB2aXNpb24oUE9SVDUsIDUwLCBTSUdfMSwgQkxVRV9PQkosIFJFRF9PQkosIEdSRUVOX0ZMQUcsIFNJR181LCBTSUdfNiwgU0lHXzcpOwoKLy9MaW5lIHRyYWNrZXIKbGluZSBMaW5lVHJhY2tlciA9IGxpbmUoQnJhaW4uVGhyZWVXaXJlUG9ydC5BKTsKCi8vIFJvYm90IHN0YXJ0aW5nIHBvc2l0aW9uCmNvbnN0IGJvb2wgaXNCbHVlID0gZmFsc2U7CmNvbnN0IGJvb2wgaXNGcm9udCA9IHRydWU7Cg==","main.cpp":"I2luY2x1ZGUgInJvYm90LWNvbmZpZy5oIgojaW5jbHVkZSA8Y21hdGg+Ci8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgIERlc2NyaXB0aW9uOiBUZWFtIDI1ODUncyBWRVggQ29udHJvbCBTb2Z0d2FyZSBmb3IgMjAxOC0xOSAgICAgICAgICAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8vQ3JlYXRlcyBhIGNvbXBldGl0aW9uIG9iamVjdCB0aGF0IGFsbG93cyBhY2Nlc3MgdG8gQ29tcGV0aXRpb24gbWV0aG9kcy4KY29tcGV0aXRpb24gICAgQ29tcGV0aXRpb247CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICBQcmUtQXV0b25vbW91cyBGdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgUGVyZm9ybXMgZnVuY3Rpb25zIGJlZm9yZSB0aGUgZ2FtZSBzdGFydHMuIFlvdSBtdXN0IHJldHVybiBmcm9tIHRoaXMgICAgICovCi8qICBvciB0aGUgYXV0b25vbW91cyBhbmQgdXNlcmNvbnRyb2wgdGFza3Mgd2lsbCBub3QgYmUgc3RhcnRlZC4gVGhpcyAgICAgICAgKi8KLyogIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIG9uY2UgYWZ0ZXIgdGhlIGNvcnRleCBoYXMgYmVlbiBwb3dlcmVkIG9uIGFuZCAgICAqLyAKLyogIG5vdCBldmVyeSB0aW1lIHRoYXQgdGhlIHJvYm90IGlzIGRpc2FibGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnZvaWQgcHJlX2F1dG9uKCB2b2lkICkgewogICAgZm9yKG1vdG9yIGVhY2g6IGRyaXZlVHJhaW5Nb3RvcnMpewogICAgICAgIGVhY2gucmVzZXRSb3RhdGlvbigpOwogICAgfQogICAgcmV0dXJuOwp9CgovLyBSb2JvdCBtZWFzdXJlbWVudHMKY29uc3QgZmxvYXQgd2hlZWxEaWFtZXRlciA9IDQuMTI1OyAvLyBpbmNoZXMKY29uc3QgZmxvYXQgdHVybmluZ0RpYW1ldGVyID0gMTcuNTsgLy9pbmNoZXMgKFRPRE86IHJlLW1lYXN1cmUgaG9yaXpvbnRhbGx5KQpjb25zdCBmbG9hdCBnZWFyUmF0aW8gPSAxLjA7IC8vIDEgdHVybnMgb2YgbW90b3IvPGdlYXJSYXRpbz4gdHVybnMgb2Ygd2hlZWwKY29uc3QgZmxvYXQgd2hlZWxDaXJjdW1mZXJlbmNlID0gd2hlZWxEaWFtZXRlciAqIDMuMTQxNTkyNjUzNTg5Owpjb25zdCBmbG9hdCBpbmNoZXNQZXJEZWdyZWUgPSB3aGVlbENpcmN1bWZlcmVuY2UgLyAzNjAuMDsKLy8gc2hvdWxkIGJlIHR1cm5pbmdEaWFtZXRlci93aGVlbERpYW1ldGVyCi8vIERpZG4ndCB3b3JrIHNvIDMuMzM3IG1lYXN1cmVkIGV4cGVyaW1lbnRhbGx5CmNvbnN0IGZsb2F0IGVuY29kZXJUaWNrc1BlckRlZ3JlZSA9IDMuMzM3Owpjb25zdCBmbG9hdCBmbHlXaGVlbFRhcmdldFNwZWVkID0gMTg1OyAvL3JwbQoKLyp2b2lkIGZseXdoZWVsQmFuZ0JhbmcobW90b3IgZmx5V2hlZWxNb3Rvcil7CiAgICBpZihmbHlXaGVlbE1vdG9yLnZlbG9jaXR5KHZlbG9jaXR5VW5pdHM6OnJwbSkgPiBmbHlXaGVlbFRhcmdldFNwZWVkKXsKICAgICAgICBmbHlXaGVlbE1vdG9yLgogICAgfSBlbHNlIGlmKGZseVdoZWVsTW90b3IudmVsb2NpdHkodmVsb2NpdHlVbml0czo6cnBtKSA+IGZseVdoZWVsVGFyZ2V0U3BlZWQpewogICAgICAgIAogICAgfQp9Ki8KCnZvaWQgcnVuSW50YWtlKGZsb2F0IGludGFrZVNwZWVkKXsKICAgIEludGFrZU1vdG9yLnNwaW4oZGlyZWN0aW9uVHlwZTo6ZndkLCBpbnRha2VTcGVlZCwgdmVsb2NpdHlVbml0czo6cGN0KTsKfQoKdm9pZCBydW5Bcm0oZmxvYXQgYXJtU3BlZWQpIHsKICAgIGlmIChhcm1TcGVlZCA9PSAwKSB7CiAgICAgICAgQXJtTW90b3Iuc3RvcChicmFrZVR5cGU6OmJyYWtlKTsKICAgIH0gZWxzZSB7CiAgICAgICAgQXJtTW90b3Iuc3BpbihkaXJlY3Rpb25UeXBlOjpmd2QsIGFybVNwZWVkLCB2ZWxvY2l0eVVuaXRzOjpwY3QpOwogICAgfQp9Cgp2b2lkIHJ1bkZlZWRlcihmbG9hdCBmZWVkZXJTcGVlZCl7CiAgICBpZihmZWVkZXJTcGVlZCA9PSAwKXsKICAgICAgICBGZWVkZXIuc3RvcChicmFrZVR5cGU6OmJyYWtlKTsKICAgIH0gZWxzZSB7CiAgICAgICAgRmVlZGVyLnNwaW4oZGlyZWN0aW9uVHlwZTo6ZndkLCBmZWVkZXJTcGVlZCwgdmVsb2NpdHlVbml0czo6cGN0KTsKICAgIH0KfQoKdm9pZCBhY3RpdmVCcmFrZSgpewogICAgZm9yKG1vdG9yIGVhY2g6IGRyaXZlVHJhaW5Nb3RvcnMpewogICAgICAgIGVhY2guc3RvcChicmFrZVR5cGU6OmhvbGQpOwogICAgfQp9Cgp2b2lkIHJ1bkRyaXZlVGFuayhmbG9hdCBsZWZ0dkwsIGZsb2F0IHJpZ2h0dkwsIGJvb2wgaXNSZXZlcnNlZCkgewogICAgaWYgKGlzUmV2ZXJzZWQpIHsKICAgICAgICBsZWZ0dkwgKj0gLTE7CiAgICAgICAgcmlnaHR2TCAqPSAtMTsKICAgIH0KICAgIExCTW90b3Iuc3BpbihkaXJlY3Rpb25UeXBlOjpmd2QsIGxlZnR2TCwgdm9sdGFnZVVuaXRzOjp2b2x0KTsKICAgIExGTW90b3Iuc3BpbihkaXJlY3Rpb25UeXBlOjpmd2QsIGxlZnR2TCwgdm9sdGFnZVVuaXRzOjp2b2x0KTsKICAgCiAgICBSQk1vdG9yLnNwaW4oZGlyZWN0aW9uVHlwZTo6ZndkLCByaWdodHZMLCB2b2x0YWdlVW5pdHM6OnZvbHQpOwogICAgUkZNb3Rvci5zcGluKGRpcmVjdGlvblR5cGU6OmZ3ZCwgcmlnaHR2TCwgdm9sdGFnZVVuaXRzOjp2b2x0KTsKfQoKdm9pZCBydW5Ecml2ZUFyY2FkZShmbG9hdCBwb3dlcnZMLCBmbG9hdCByb3RhdGlvbnZMLCBib29sIGlzUmV2ZXJzZWQpIHsKICAgIC8vcG9zaXRpdmUgcm90YXRpb24gLS0+IHR1cm5pbmcgcmlnaHQKICAgIC8vbmVnYXRpdmUgcm90YXRpb24gLS0+IHR1cm5pbmcgbGVmdAogICAgcG93ZXJ2TCA9IChpc1JldmVyc2VkKSA/IHBvd2VydkwgKiAtMSA6IHBvd2Vydkw7CiAgICBydW5Ecml2ZVRhbmsocG93ZXJ2TCArIHJvdGF0aW9udkwsIHBvd2VydkwgLSByb3RhdGlvbnZMLCBmYWxzZSk7Cn0KCnZvaWQgYXV0b0RyaXZlRm9yd2FyZCggZmxvYXQgaW5jaGVzLCBmbG9hdCBwb3dlciApIHsgLy8gZGlzdGFuY2UgaW4gaW5jaGVzCiAgICBmbG9hdCBkZWdyZWVzVHVybiA9IGluY2hlcyAvIGluY2hlc1BlckRlZ3JlZSAqIGdlYXJSYXRpbzsKCiAgICBMZWZ0QmFja01vdG9yLnN0YXJ0Um90YXRlRm9yKGRlZ3JlZXNUdXJuLCByb3RhdGlvblVuaXRzOjpkZWcsIHBvd2VyLCB2ZWxvY2l0eVVuaXRzOjpwY3QpOwogICAgTGVmdEZyb250TW90b3Iuc3RhcnRSb3RhdGVGb3IoZGVncmVlc1R1cm4sIHJvdGF0aW9uVW5pdHM6OmRlZywgcG93ZXIsIHZlbG9jaXR5VW5pdHM6OnBjdCk7CgogICAgUmlnaHRCYWNrTW90b3Iuc3RhcnRSb3RhdGVGb3IoZGVncmVlc1R1cm4sIHJvdGF0aW9uVW5pdHM6OmRlZywgcG93ZXIsIHZlbG9jaXR5VW5pdHM6OnBjdCk7CiAgICBSaWdodEZyb250TW90b3Iucm90YXRlRm9yKGRlZ3JlZXNUdXJuLCByb3RhdGlvblVuaXRzOjpkZWcsIHBvd2VyLCB2ZWxvY2l0eVVuaXRzOjpwY3QpOwp9ICAKCnZvaWQgYXV0b0RyaXZlRm9yd2FyZFJhdyhmbG9hdCBwb3dlciwgZmxvYXQgdGltZSl7CiAgICBmb3IobW90b3IgZWFjaDogZHJpdmVUcmFpbk1vdG9ycyl7CiAgICAgICAgZWFjaC5zcGluKGRpcmVjdGlvblR5cGU6OmZ3ZCwgcG93ZXIsIHZlbG9jaXR5VW5pdHM6OnBjdCk7CiAgICB9CgogICAgdGFzazo6c2xlZXAodGltZSAqIDEwMDApOyAvL3RpbWUoaW4gc2Vjb25kcykgdG8gbWlsbGlzZWNvbmRzCgogICAgZm9yKG1vdG9yIGVhY2g6IGRyaXZlVHJhaW5Nb3RvcnMpewogICAgICAgIGVhY2guc3RvcChicmFrZVR5cGU6OmJyYWtlKTsKICAgIH0KCn0KCnZvaWQgYXV0b1R1cm4oIGZsb2F0IGRlZ3JlZXMgKSB7CiAgICAvLyBOb3RlOiArOTAgZGVncmVlcyBpcyBhIHJpZ2h0IHR1cm4KICAgIGZsb2F0IGVuY29kZXJEZWdyZWVzID0gZW5jb2RlclRpY2tzUGVyRGVncmVlICogZGVncmVlczsKICAgIExlZnRCYWNrTW90b3Iuc3RhcnRSb3RhdGVGb3IoZW5jb2RlckRlZ3JlZXMsIHJvdGF0aW9uVW5pdHM6OmRlZywgNTAsIHZlbG9jaXR5VW5pdHM6OnBjdCk7CiAgICBMZWZ0RnJvbnRNb3Rvci5zdGFydFJvdGF0ZUZvcihlbmNvZGVyRGVncmVlcywgcm90YXRpb25Vbml0czo6ZGVnLCA1MCwgdmVsb2NpdHlVbml0czo6cGN0KTsKCiAgICBSaWdodEJhY2tNb3Rvci5zdGFydFJvdGF0ZUZvcigtZW5jb2RlckRlZ3JlZXMsIHJvdGF0aW9uVW5pdHM6OmRlZywgNTAsIHZlbG9jaXR5VW5pdHM6OnBjdCk7CiAgICBSaWdodEZyb250TW90b3Iucm90YXRlRm9yKC1lbmNvZGVyRGVncmVlcywgcm90YXRpb25Vbml0czo6ZGVnLCA1MCwgdmVsb2NpdHlVbml0czo6cGN0KTsKfQoKdm9pZCBwb2ludFRvKHZpc2lvbjo6c2lnbmF0dXJlIHNpZykgewogICAgLy9jYW1lcmEgaW1hZ2UgaXMgMzE2IHBpeGVscyB3aWRlLCBzbyB0aGUgY2VudGVyIGlzIDMxNi8yCiAgICBpbnQgc2NyZWVuTWlkZGxlWCA9IDMxNiAvIDI7CiAgICBib29sIGlzTGluZWRVcCA9IGZhbHNlOwogICAgd2hpbGUoIWlzTGluZWRVcCkgewogICAgICAgIC8vc25hcCBhIHBpY3R1cmUKICAgICAgICBWaXNpb25TZW5zb3IudGFrZVNuYXBzaG90KHNpZyk7CiAgICAgICAgLy9kaWQgd2Ugc2VlIGFueXRoaW5nPwogICAgICAgIGlmKFZpc2lvblNlbnNvci5vYmplY3RDb3VudCA+IDApIHsKICAgICAgICAgICAgLy93aGVyZSB3YXMgdGhlIGxhcmdlc3QgdGhpbmc/CiAgICAgICAgICAgIGlmKFZpc2lvblNlbnNvci5sYXJnZXN0T2JqZWN0LmNlbnRlclggPCBzY3JlZW5NaWRkbGVYIC0gNSkgewogICAgICAgICAgICAgICAgLy9vbiB0aGUgbGVmdCwgdHVybiBsZWZ0CiAgICAgICAgICAgICAgICBydW5Ecml2ZUFyY2FkZSgwLCAtMTAsIGZhbHNlKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChWaXNpb25TZW5zb3IubGFyZ2VzdE9iamVjdC5jZW50ZXJYID4gc2NyZWVuTWlkZGxlWCArIDUpIHsKICAgICAgICAgICAgICAgIC8vb24gdGhlIHJpZ2h0LCB0dXJuIHJpZ2h0CiAgICAgICAgICAgICAgICBydW5Ecml2ZUFyY2FkZSgwLCAxMCwgZmFsc2UpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy9pbiB0aGUgbWlkZGxlLCB3ZSdyZSBkb25lIGxpbmluZyB1cAogICAgICAgICAgICAgICAgaXNMaW5lZFVwID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHJ1bkRyaXZlQXJjYWRlKDAsIDAsIGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm47Cn0KCnZvaWQgcG9pbnRUbyh2aXNpb246OmNvZGUgc2lnKSB7CiAgICAvL2NhbWVyYSBpbWFnZSBpcyAzMTYgcGl4ZWxzIHdpZGUsIHNvIHRoZSBjZW50ZXIgaXMgMzE2LzIKICAgIGludCBzY3JlZW5NaWRkbGVYID0gMzE2IC8gMjsKICAgIGJvb2wgaXNMaW5lZFVwID0gZmFsc2U7CiAgICB3aGlsZSghaXNMaW5lZFVwKSB7CiAgICAgICAgLy9zbmFwIGEgcGljdHVyZQogICAgICAgIFZpc2lvblNlbnNvci50YWtlU25hcHNob3Qoc2lnKTsKICAgICAgICAvL2RpZCB3ZSBzZWUgYW55dGhpbmc/CiAgICAgICAgaWYoVmlzaW9uU2Vuc29yLm9iamVjdENvdW50ID4gMCkgewogICAgICAgICAgICAvL3doZXJlIHdhcyB0aGUgbGFyZ2VzdCB0aGluZz8KICAgICAgICAgICAgaWYoVmlzaW9uU2Vuc29yLmxhcmdlc3RPYmplY3QuY2VudGVyWCA8IHNjcmVlbk1pZGRsZVggLSA1KSB7CiAgICAgICAgICAgICAgICAvL29uIHRoZSBsZWZ0LCB0dXJuIGxlZnQKICAgICAgICAgICAgICAgIHJ1bkRyaXZlQXJjYWRlKDAsIC0xMCwgZmFsc2UpOwogICAgICAgICAgICB9IGVsc2UgaWYgKFZpc2lvblNlbnNvci5sYXJnZXN0T2JqZWN0LmNlbnRlclggPiBzY3JlZW5NaWRkbGVYICsgNSkgewogICAgICAgICAgICAgICAgLy9vbiB0aGUgcmlnaHQsIHR1cm4gcmlnaHQKICAgICAgICAgICAgICAgIHJ1bkRyaXZlQXJjYWRlKDAsIDEwLCBmYWxzZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvL2luIHRoZSBtaWRkbGUsIHdlJ3JlIGRvbmUgbGluaW5nIHVwCiAgICAgICAgICAgICAgICBpc0xpbmVkVXAgPSB0cnVlOwogICAgICAgICAgICAgICAgcnVuRHJpdmVBcmNhZGUoMCwgMCwgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybjsKfQoKdm9pZCBzdGFydEZlZWRlcigpewogICAgRmVlZGVyLnN0YXJ0Um90YXRlRm9yKDI3MCwgcm90YXRpb25Vbml0czo6ZGVnLCA1MCwgdmVsb2NpdHlVbml0czo6cGN0KTsKfQoKdm9pZCBzdGFydEZlZWRlckRlbGF5KCl7CiAgICBGZWVkZXIucm90YXRlRm9yKDI3MCwgcm90YXRpb25Vbml0czo6ZGVnLCA1MCwgdmVsb2NpdHlVbml0czo6cGN0KTsKfQoKdm9pZCBkb3VibGVTaG9vdCgpewogICAgU2hvb3Rlck1vdG9yLnNwaW4oZGlyZWN0aW9uVHlwZTo6ZndkLCAxMDAsIHZlbG9jaXR5VW5pdHM6OnBjdCk7CiAgICB3aGlsZShTaG9vdGVyTW90b3IudmVsb2NpdHkodmVsb2NpdHlVbml0czo6cGN0KSA8IDk1KXsKICAgICAgICB0YXNrOjpzbGVlcCg1MDApOwogICAgfQogICAgc3RhcnRGZWVkZXJEZWxheSgpOwogICAgcnVuSW50YWtlKDEwMCk7CiAgICB0YXNrOjpzbGVlcCg1MDApOwogICAgcnVuSW50YWtlKDApOwogICAgd2hpbGUoU2hvb3Rlck1vdG9yLnZlbG9jaXR5KHZlbG9jaXR5VW5pdHM6OnBjdCkgPiA3MCl7CiAgICAgICAgU2hvb3Rlck1vdG9yLnNwaW4oZGlyZWN0aW9uVHlwZTo6ZndkLCBTaG9vdGVyTW90b3IudmVsb2NpdHkodmVsb2NpdHlVbml0czo6cGN0KSAtIDIsIHZlbG9jaXR5VW5pdHM6OnBjdCk7CiAgICAgICAgdGFzazo6c2xlZXAoNTApOwogICAgfQogICAgc3RhcnRGZWVkZXJEZWxheSgpOwogICAgU2hvb3Rlck1vdG9yLnN0b3AoYnJha2VUeXBlOjpjb2FzdCk7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dG9ub21vdXMgVGFzayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIFRoaXMgdGFzayBpcyB1c2VkIHRvIGNvbnRyb2wgdGhlIHJvYm90IGR1cmluZyB0aGUgYXV0b25vbW91cyBwaGFzZSBvZiAgICAqLwovKiAgYSBWRVggQ29tcGV0aXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kdm9pZCBhdXRvbm9tb3VzKCB2b2lkICkgewogICAgaWYoaXNGcm9udCl7CiAgICAgICAgLy9DaGFyZ2UgdXAgc2hvb3RlcgogICAgICAgIFNob290ZXJNb3Rvci5zcGluKGRpcmVjdGlvblR5cGU6OmZ3ZCwgMTAwLCB2ZWxvY2l0eVVuaXRzOjpwY3QpOwogICAgICAgIAogICAgICAgIC8vSGl0IGxvdyBmbGFnCiAgICAgICAgYXV0b0RyaXZlRm9yd2FyZCg0OCwgOTApOwogICAgICAgIGF1dG9Ecml2ZUZvcndhcmRSYXcoNTAsIDAuMjUpOwogICAgICAgIAogICAgICAgIC8vSGl0IGhpZ2ggZmxhZwogICAgICAgIGF1dG9Ecml2ZUZvcndhcmQoLTE2LjUsIDEwMCk7CiAgICAgICAgaWYoaXNCbHVlKXsKICAgICAgICAgICAgYXV0b1R1cm4oLTE1KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhdXRvVHVybigxNSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIEludGFrZU1vdG9yLnN0YXJ0Um90YXRlRm9yKDEwMCwgcm90YXRpb25Vbml0czo6cmV2LCAxMDAsIHZlbG9jaXR5VW5pdHM6OnBjdCk7CiAgICAgICAgRmVlZGVyLnN0YXJ0Um90YXRlRm9yKDEwLCByb3RhdGlvblVuaXRzOjpyZXYsIDIwLCB2ZWxvY2l0eVVuaXRzOjpwY3QpOwogICAgICAgIHRhc2s6OnNsZWVwKDIwMDApOwogICAgICAgIEZlZWRlci5zdG9wKGJyYWtlVHlwZTo6Y29hc3QpOwogICAgICAgIEludGFrZU1vdG9yLnN0b3AoYnJha2VUeXBlOjpjb2FzdCk7CiAgICAgICAgU2hvb3Rlck1vdG9yLnN0b3AoYnJha2VUeXBlOjpjb2FzdCk7CiAgICAgICAgaWYoaXNCbHVlKXsKICAgICAgICAgICAgYXV0b1R1cm4oMTUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGF1dG9UdXJuKC0xNSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGF1dG9Ecml2ZUZvcndhcmQoLTguNSwgNzUpOwogICAgICAgIAogICAgICAgIC8vRmxpcCBjYXAKICAgICAgICBpZihpc0JsdWUpewogICAgICAgICAgICBhdXRvVHVybigtOTApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGF1dG9UdXJuKDkwKTsKICAgICAgICB9CiAgICAgICAgYXV0b0RyaXZlRm9yd2FyZFJhdygtNTAsIDAuNSk7CiAgICAgICAgYXV0b0RyaXZlRm9yd2FyZCgxMiwgNzUpOwogICAgICAgIEludGFrZU1vdG9yLnN0YXJ0Um90YXRlRm9yKC0xMDAsIHJvdGF0aW9uVW5pdHM6OnJldiwgMTAwLCB2ZWxvY2l0eVVuaXRzOjpwY3QpOwogICAgICAgIGF1dG9Ecml2ZUZvcndhcmQoMTIsIDI1KTsKICAgICAgICBJbnRha2VNb3Rvci5zdG9wKGJyYWtlVHlwZTo6Y29hc3QpOwogICAgICAgIAogICAgICAgIGF1dG9Ecml2ZUZvcndhcmQoLTI0LCAxMDApOwogICAgICAgIGF1dG9Ecml2ZUZvcndhcmRSYXcoLTUwLCAwLjUpOwogICAgICAgIGF1dG9Ecml2ZUZvcndhcmQoOCwgNzUpOwogICAgICAgIAogICAgICAgIGlmKGlzQmx1ZSl7CiAgICAgICAgICAgIGF1dG9UdXJuKC05MCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYXV0b1R1cm4oOTApOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBhdXRvRHJpdmVGb3J3YXJkKDE4LCAxMDApOwogICAgICAgIGlmKGlzQmx1ZSl7CiAgICAgICAgICAgIGF1dG9UdXJuKDkwKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhdXRvVHVybigtOTApOwogICAgICAgIH0KICAgICAgICBhdXRvRHJpdmVGb3J3YXJkUmF3KC01MCwgMC4yNSk7CiAgICAgICAgCiAgICAgICAgYXV0b0RyaXZlRm9yd2FyZCgyNCwgMTAwKTsKICAgICAgICBJbnRha2VNb3Rvci5zdGFydFJvdGF0ZUZvcigxMDAsIHJvdGF0aW9uVW5pdHM6OnJldiwgMTAwLCB2ZWxvY2l0eVVuaXRzOjpwY3QpOwogICAgICAgIGF1dG9Ecml2ZUZvcndhcmQoMTgsIDUwKTsKICAgICAgICB0YXNrOjpzbGVlcCg1MDApOwogICAgICAgIEludGFrZU1vdG9yLnN0b3AoYnJha2VUeXBlOjpjb2FzdCk7CiAgICAgICAgYXV0b0RyaXZlRm9yd2FyZCgtMTIsIDc1KTsKICAgICAgICBpZihpc0JsdWUpewogICAgICAgICAgICBhdXRvVHVybig5MCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYXV0b1R1cm4oLTkwKTsKICAgICAgICB9CiAgICAgICAgLy9IaXQgZmxhZwogICAgICAgIGF1dG9Ecml2ZUZvcndhcmQoLTEyLCA3NSk7CiAgICAgICAgYXV0b0RyaXZlRm9yd2FyZCgtNDgsIDEwMCk7CiAgICB9IGVsc2UgeyAvLyBpbiB0aGUgYmFjawogICAgICAgIC8vZmxpcCBjYXAKICAgICAgICBTaG9vdGVyTW90b3Iuc3BpbihkaXJlY3Rpb25UeXBlOjpmd2QsIDEwMCwgdmVsb2NpdHlVbml0czo6cGN0KTsKICAgICAgICBhdXRvRHJpdmVGb3J3YXJkKDI0LCA1MCk7CiAgICAgICAKICAgICAgICAvL0ludGFrZSBiYWxsCiAgICAgICAgSW50YWtlTW90b3Iuc3RhcnRSb3RhdGVGb3IoMTAwLCByb3RhdGlvblVuaXRzOjpyZXYsIDEwMCwgdmVsb2NpdHlVbml0czo6cGN0KTsKICAgICAgICBhdXRvRHJpdmVGb3J3YXJkKDE4LCA1MCk7CiAgICAgICAgdGFzazo6c2xlZXAoNTAwKTsKICAgICAgICAKICAgICAgICAvL1Jlc2V0IHBvc2l0aW9uCiAgICAgICAgSW50YWtlTW90b3Iuc3RvcChicmFrZVR5cGU6OmNvYXN0KTsKICAgICAgICBhdXRvRHJpdmVGb3J3YXJkKC00MiwgNTApOwogICAgICAgIGF1dG9Ecml2ZUZvcndhcmRSYXcoLTI1LCAwLjkpOwogICAgICAgIGF1dG9Ecml2ZUZvcndhcmQoNiwgNTApOwogICAgICAgIGlmKGlzQmx1ZSl7CiAgICAgICAgICAgIGF1dG9UdXJuKDkwKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhdXRvVHVybigtOTApOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBJbnRha2VNb3Rvci5zdGFydFJvdGF0ZUZvcigxMDAsIHJvdGF0aW9uVW5pdHM6OnJldiwgMTAwLCB2ZWxvY2l0eVVuaXRzOjpwY3QpOwogICAgICAgIEZlZWRlci5zdGFydFJvdGF0ZUZvcigxMCwgcm90YXRpb25Vbml0czo6cmV2LCAyMCwgdmVsb2NpdHlVbml0czo6cGN0KTsKICAgICAgICB0YXNrOjpzbGVlcCgxMDAwKTsKICAgICAgICBGZWVkZXIuc3RvcChicmFrZVR5cGU6OmNvYXN0KTsKICAgICAgICBhdXRvRHJpdmVGb3J3YXJkKDI0LCA1MCk7CiAgICAgICAgRmVlZGVyLnN0YXJ0Um90YXRlRm9yKDEwLCByb3RhdGlvblVuaXRzOjpyZXYsIDQwLCB2ZWxvY2l0eVVuaXRzOjpwY3QpOwogICAgICAgIHRhc2s6OnNsZWVwKDE1MDApOwogICAgICAgIEludGFrZU1vdG9yLnN0b3AoYnJha2VUeXBlOjpjb2FzdCk7CiAgICAgICAgRmVlZGVyLnN0b3AoYnJha2VUeXBlOjpjb2FzdCk7CiAgICAgICAgU2hvb3Rlck1vdG9yLnN0b3AoYnJha2VUeXBlOjpjb2FzdCk7CiAgICAgICAgCiAgICAgICAgLy9DbGltYiBwbGF0Zm9ybQogICAgICAgIGlmKGlzQmx1ZSl7CiAgICAgICAgICAgIGF1dG9UdXJuKDkwKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhdXRvVHVybigtOTApOwogICAgICAgIH0KICAgICAgICBhdXRvRHJpdmVGb3J3YXJkUmF3KDI1LCAwLjUpOwogICAgICAgIGF1dG9Ecml2ZUZvcndhcmQoLTY1LCAxMDApOyAvL3BhcmsgdG8gYWxsaWFuY2UgcGxhdGZvcm0KICAgIH0KICAgIHJldHVybjsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlciBDb250cm9sIFRhc2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgVGhpcyB0YXNrIGlzIHVzZWQgdG8gY29udHJvbCB5b3VyIHJvYm90IGR1cmluZyB0aGUgdXNlciBjb250cm9sIHBoYXNlIG9mICovCi8qICBhIFZFWCBDb21wZXRpdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp2b2lkIHVzZXJjb250cm9sKCB2b2lkICkgewogICAgcHJlX2F1dG9uKCk7CiAgICBpbnQgaW5kZXggPSAwOwogICAgLy9Vc2UgdGhlc2UgdmFyaWFibGVzIHRvIHNldCB0aGUgc3BlZWQgb2YgdGhlIGFybSwgaW50YWtlLCBhbmQgc2hvb3Rlci4KICAgIGludCBhcm1TcGVlZFBDVCA9IDIwOwogICAgaW50IGludGFrZVNwZWVkUENUID0gMTAwOwogICAgaW50IGZlZWRlclNwZWVkUENUID0gNjA7CgogICAgQ29udHJvbGxlcjEuU2NyZWVuLnByaW50KCJXZWxjb21lIEFib2FyZCEiKTsKICAgIENvbnRyb2xsZXIxLlNjcmVlbi5uZXdMaW5lKCk7CiAgICBDb250cm9sbGVyMS5TY3JlZW4ucHJpbnQoIkdldCByZWFkeSB0byBydW1ibGUhISEiKTsKICAgIENvbnRyb2xsZXIxLlNjcmVlbi5uZXdMaW5lKCk7CgogICAgQ29udHJvbGxlcjEuU2NyZWVuLnByaW50KCJGT1JXQVJEIE1PREUhIik7CiAgICBDb250cm9sbGVyMS5TY3JlZW4ubmV3TGluZSgpOwogICAgQ29udHJvbGxlcjEucnVtYmxlKCItLS4uLSIpOwoKICAgIC8vIEtlZXAgdHJhY2sgb2YgcGFzdCBidXR0b24gc3RhdGUgdG8gZGV0ZWN0IGluaXRhbCBwcmVzc2VzCiAgICBib29sIGlzUmV2ZXJzZWQgPSBmYWxzZTsKICAgIGJvb2wgc2hvdWxkU2hvb3QgPSBmYWxzZTsKICAgIGJvb2wgd2FzVXBQcmVzc2VkID0gZmFsc2U7CiAgICBib29sIHdhc0Rvd25QcmVzc2VkID0gZmFsc2U7CiAgICBib29sIHdhc0ZlZWRpbmcgPSBmYWxzZTsKICAgIGJvb2wgd2FzRG91YmxlU2hvb3RpbmcgPSBmYWxzZTsKICAgIAogICAgd2hpbGUgKDEpIHsKICAgICAgICAvLyBUaGlzIGlzIHRoZSBtYWluIGV4ZWN1dGlvbiBsb29wIGZvciB0aGUgdXNlciBjb250cm9sIHByb2dyYW0uCiAgICAgICAgLy8gRWFjaCB0aW1lIHRocm91Z2ggdGhlIGxvb3AgeW91ciBwcm9ncmFtIHNob3VsZCB1cGRhdGUgbW90b3IgKyBzZXJ2bwogICAgICAgIAogICAgICAgIC8vRHJpdmUgQ29udHJvbAogICAgICAgIC8vIEFyY2FkZSBDb250cm9sCiAgICAgICAgZmxvYXQgcG93ZXJ2TCA9IENvbnRyb2xsZXIxLkF4aXMzLnZhbHVlKCkgKiAxMi4wIC8gMTI3OwogICAgICAgIAogICAgICAgIGZsb2F0IHJvdGF0aW9udkwgPSAwOy8vID0gMC4zICogQ29udHJvbGxlcjEuQXhpczEudmFsdWUoKSAqIDEyLjAgLyAxMjc7CiAgICAgICAgZmxvYXQgc2xvd1JvdGF0aW9udkwgPSAwOy8vID0gMC4xNSAqIENvbnRyb2xsZXIxLkF4aXM0LnZhbHVlKCkgKiAxMi4wIC8gMTI3OwogICAgICAgIAogICAgICAgIC8vIFRhbmsgQ29udHJvbAogICAgICAgIGZsb2F0IGxlZnR2TCA9IHBvd2Vydkw7CiAgICAgICAgZmxvYXQgcmlnaHR2TCA9IENvbnRyb2xsZXIxLkF4aXMyLnZhbHVlKCkgKiAxMi4wIC8gMTI3OwogICAgICAgIC8qaWYoc3RkOjphYnMoQ29udHJvbGxlcjEuQXhpczQudmFsdWUoKSkgPCAxMDApewogICAgICAgICAgICBzbG93Um90YXRpb252TCA9IDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBpZihzdGQ6OmFicyhDb250cm9sbGVyMS5BeGlzMS52YWx1ZSgpKSA8IDEwMCkKICAgICAgICAgICAgICAgIHJvdGF0aW9udkwgPSBzbG93Um90YXRpb252TDsKICAgICAgICB9Ki8KICAgICAgICAKICAgICAgICBpZihDb250cm9sbGVyMS5CdXR0b25MZWZ0LnByZXNzaW5nKCkpIHsKICAgICAgICAgICAgcm90YXRpb252TCA9IC0wLjE1ICogMTIuMCA7CiAgICAgICAgfSBlbHNlIGlmKENvbnRyb2xsZXIxLkJ1dHRvblJpZ2h0LnByZXNzaW5nKCkpewogICAgICAgICAgICByb3RhdGlvbnZMID0gMC4xNSAqIDEyLjAgOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihyb3RhdGlvbnZMICE9IDApewogICAgICAgICAgICBydW5Ecml2ZUFyY2FkZShwb3dlcnZMLCByb3RhdGlvbnZMLCBpc1JldmVyc2VkKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBydW5Ecml2ZVRhbmsobGVmdHZMLCByaWdodHZMLCBpc1JldmVyc2VkKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy9BY3RpdmUgYnJha2UKICAgICAgICBpZihDb250cm9sbGVyMS5CdXR0b25BLnByZXNzaW5nKCkgfHwgQ29udHJvbGxlcjEuQnV0dG9uWC5wcmVzc2luZygpKXsKICAgICAgICAgICAgYWN0aXZlQnJha2UoKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKENvbnRyb2xsZXIxLkJ1dHRvblVwLnByZXNzaW5nKCkgJiYgIXdhc1VwUHJlc3NlZCkgewogICAgICAgICAgICAvLyBDaGFuZ2UgdG8gZm9yd2FyZAogICAgICAgICAgICBpc1JldmVyc2VkID0gZmFsc2U7CiAgICAgICAgICAgIENvbnRyb2xsZXIxLlNjcmVlbi5wcmludCgiRk9SV0FSRCBNT0RFISIpOwogICAgICAgICAgICBDb250cm9sbGVyMS5TY3JlZW4ubmV3TGluZSgpOwogICAgICAgICAgICBDb250cm9sbGVyMS5ydW1ibGUoIi4uLiIpOwogICAgICAgIH0gZWxzZSBpZiAoQ29udHJvbGxlcjEuQnV0dG9uRG93bi5wcmVzc2luZygpICYmICF3YXNEb3duUHJlc3NlZCkgewogICAgICAgICAgICAvLyBDaGFuZ2UgdG8gcmV2ZXJzZQogICAgICAgICAgICBpc1JldmVyc2VkID0gdHJ1ZTsKICAgICAgICAgICAgQ29udHJvbGxlcjEuU2NyZWVuLnByaW50KCJSRVZFUlNFIE1PREUhIik7CiAgICAgICAgICAgIENvbnRyb2xsZXIxLlNjcmVlbi5uZXdMaW5lKCk7CiAgICAgICAgICAgIENvbnRyb2xsZXIxLnJ1bWJsZSgiLi4uIik7CiAgICAgICAgfQogICAgICAgIHdhc1VwUHJlc3NlZCA9IENvbnRyb2xsZXIxLkJ1dHRvblVwLnByZXNzaW5nKCk7CiAgICAgICAgd2FzRG93blByZXNzZWQgPSBDb250cm9sbGVyMS5CdXR0b25Eb3duLnByZXNzaW5nKCk7CgogICAgICAgIC8vQXJtIENvbnRyb2w6IFggaXMgdXAsIFkgaXMgZG93bgogICAgICAgIC8qCiAgICAgICAgaWYoQ29udHJvbGxlcjEuQnV0dG9uWS5wcmVzc2luZygpKSB7IC8vSWYgYnV0dG9uIHVwIGlzIHByZXNzZWQuLi4KICAgICAgICAgICAgLy8uLi5TcGluIHRoZSBhcm0gbW90b3IgZm9yd2FyZC4KICAgICAgICAgICAgcnVuQXJtKGFybVNwZWVkUENUKTsKICAgICAgICB9IGVsc2UgaWYoQ29udHJvbGxlcjEuQnV0dG9uWC5wcmVzc2luZygpKSB7IC8vSWYgdGhlIGRvd24gYnV0dG9uIGlzIHByZXNzZWQuLi4KICAgICAgICAgICAgLy8uLi5TcGluIHRoZSBhcm0gbW90b3IgYmFja3dhcmQuCiAgICAgICAgICAgIHJ1bkFybSgtYXJtU3BlZWRQQ1QpOwogICAgICAgIH0gZWxzZSB7IC8vSWYgdGhlIHRoZSB1cCBvciBkb3duIGJ1dHRvbiBpcyBub3QgcHJlc3NlZC4uLgogICAgICAgICAgICAvLy4uLkJyYWtlIHRoZSBhcm0gbW90b3IuCiAgICAgICAgICAgIHJ1bkFybSgwKTsKICAgICAgICB9CiAgICAgICAgKi8KCiAgICAgICAgaWYoQ29udHJvbGxlcjEuQnV0dG9uWC5wcmVzc2luZygpKXsKICAgICAgICAgICAgaWYoIXdhc0RvdWJsZVNob290aW5nKXsKICAgICAgICAgICAgICAgIGRvdWJsZVNob290KCk7CiAgICAgICAgICAgICAgICB3YXNEb3VibGVTaG9vdGluZyA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3YXNEb3VibGVTaG9vdGluZyA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvL0ZlZWRlciBDb250cm9sCiAgICAgICAgaWYoQ29udHJvbGxlcjEuQnV0dG9uQS5wcmVzc2luZygpKSB7CiAgICAgICAgICAgIGlmKCF3YXNGZWVkaW5nKXsKICAgICAgICAgICAgICAgIHN0YXJ0RmVlZGVyKCk7CiAgICAgICAgICAgICAgICBDb250cm9sbGVyMS5TY3JlZW4uY2xlYXJTY3JlZW4oKTsKICAgICAgICAgICAgICAgIENvbnRyb2xsZXIxLlNjcmVlbi5wcmludChMaW5lVHJhY2tlci52YWx1ZShwZXJjZW50VW5pdHM6OnBjdCkpOwogICAgICAgICAgICAgICAgd2FzRmVlZGluZyA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYoQ29udHJvbGxlcjEuQnV0dG9uQi5wcmVzc2luZygpKXsKICAgICAgICAgICAgcnVuRmVlZGVyKC1mZWVkZXJTcGVlZFBDVCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcnVuRmVlZGVyKDApOwogICAgICAgICAgICB3YXNGZWVkaW5nID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIEludGFrZSBDb250cm9sCiAgICAgICAgaWYoQ29udHJvbGxlcjEuQnV0dG9uTDEucHJlc3NpbmcoKSkgeyAvL0lmIHRoZSB1cHBlciBsZWZ0IHRyaWdnZXIgaXMgcHJlc3NlZC4uLgogICAgICAgICAgICAvLy4uLlNwaW4gdGhlIGludGFrZSBtb3RvciBmb3J3YXJkLgogICAgICAgICAgICBydW5JbnRha2UoaW50YWtlU3BlZWRQQ1QpOwogICAgICAgIH0gZWxzZSBpZihDb250cm9sbGVyMS5CdXR0b25MMi5wcmVzc2luZygpKSB7CiAgICAgICAgICAgIC8vLi4uU3BpbiB0aGUgaW50YWtlIG1vdG9yIGJhY2t3YXJkLgogICAgICAgICAgICBydW5JbnRha2UoLWludGFrZVNwZWVkUENUKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLy4uLlN0b3Agc3Bpbm5pbmcgaW50YWtlIG1vdG9yLgogICAgICAgICAgICBydW5JbnRha2UoMCk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIFNob290ZXIgQ29udHJvbAogICAgICAgIGlmKENvbnRyb2xsZXIxLkJ1dHRvblIxLnByZXNzaW5nKCkpewogICAgICAgICAgICBzaG91bGRTaG9vdCA9IHRydWU7CiAgICAgICAgfSBlbHNlIGlmIChDb250cm9sbGVyMS5CdXR0b25SMi5wcmVzc2luZygpKXsKICAgICAgICAgICAgc2hvdWxkU2hvb3QgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYoc2hvdWxkU2hvb3QpIHsKICAgICAgICAgICAgLy8uLi5TcGluIHRoZSBzaG9vdGVyIG1vdG9yIGZvcndhcmQuCiAgICAgICAgICAgIFNob290ZXJNb3Rvci5zcGluKGRpcmVjdGlvblR5cGU6OmZ3ZCwgMTAwLCB2ZWxvY2l0eVVuaXRzOjpwY3QpOwogICAgICAgICAgICBpZihTaG9vdGVyTW90b3IudmVsb2NpdHkodmVsb2NpdHlVbml0czo6cnBtKSA+IDE4NSl7CiAgICAgICAgICAgICAgICBDb250cm9sbGVyMS5TY3JlZW4ucHJpbnQoIkZVTEwgUE9XRVIgUkVBQ0hFRCIpOwogICAgICAgICAgICAgICAgQ29udHJvbGxlcjEucnVtYmxlKCItLi0iKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vLi4uU3RvcCB0aGUgc2hvb3RlciBtb3Rvci4KICAgICAgICAgICAgU2hvb3Rlck1vdG9yLnNwaW4oZGlyZWN0aW9uVHlwZTo6ZndkLCAwLCB2ZWxvY2l0eVVuaXRzOjpwY3QpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICB0YXNrOjpzbGVlcCgzMCk7IC8vU2xlZXAgdGhlIHRhc2sgZm9yIGEgc2hvcnQgYW1vdW50IG9mIHRpbWUgdG8gcHJldmVudCB3YXN0ZWQgcmVzb3VyY2VzLiAKICAgIH0KfQoKLy8gTWFpbiB3aWxsIHNldCB1cCB0aGUgY29tcGV0aXRpb24gZnVuY3Rpb25zIGFuZCBjYWxsYmFja3MuCmludCBtYWluKCkgewogICAgLy9SdW4gdGhlIHByZS1hdXRvbm9tb3VzIGZ1bmN0aW9uLiAKICAgIHByZV9hdXRvbigpOwogICAgLy9TZXQgdXAgY2FsbGJhY2tzIGZvciBhdXRvbm9tb3VzIGFuZCBkcml2ZXIgY29udHJvbCBwZXJpb2RzLgogICAgQ29tcGV0aXRpb24uYXV0b25vbW91cyggYXV0b25vbW91cyApOwogICAgQ29tcGV0aXRpb24uZHJpdmVyY29udHJvbCggdXNlcmNvbnRyb2wgKTsKCiAgICAvL1ByZXZlbnQgbWFpbiBmcm9tIGV4aXRpbmcgd2l0aCBhbiBpbmZpbml0ZSBsb29wLiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgd2hpbGUoMSkgewogICAgICB0YXNrOjpzbGVlcCgxMDApOy8vU2xlZXAgdGhlIHRhc2sgZm9yIGEgc2hvcnQgYW1vdW50IG9mIHRpbWUgdG8gcHJldmVudCB3YXN0ZWQgcmVzb3VyY2VzLgogICAgfQp9Cg=="},"device":{"slot":1,"type":"vexV5"},"language":{"name":"c++"},"components":[]}