ImportExport
3.3.91
OTRS AG
http://otrs.org/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
Build for OTRS::ITSM 4 beta1.
The ImportExport package.
Das ImportExport Paket.
El paquete ImportExport.
4.0.x
</br>
<strong>ATTENTION</strong>
</br>
</br>
If you uninstall this package, all database tables that were created during installation will be deleted.
All data from these tables will be irrevocably lost!
</br>
</br>
((enjoy))</br>
</br>
</br>
<strong>ACHTUNG</strong>
</br>
</br>
Bei der Deinstallation werden die von diesem Paket angelegten Datenbank-Tabellen gelöscht.
Alle darin enthaltenen Daten gehen unwiderruflich verloren!
</br>
</br>
((enjoy))</br>
</br>
<br/>
<strong>ATENCIÓN</strong>
<br/>
<br/>
Si usted desinstala este paquete, todas las tablas de la base de datos que se crearon durante la instalación
del mismo, se eliminarán. ¡La totalidad de los datos que contenían dichas tablas, se perderá irrevocablemente!
<br/>
<br/>
((enjoy))<br/>
<br/>
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# discard internally stored object, so that the next access to object creates them newly
$Kernel::OM->ObjectsDiscard(
Objects => [$CodeModule],
ForcePackageReload => 1,
);
$Kernel::OM->Get($CodeModule)->CodeUpgradeFromBefore_2_0_3();
2014-09-04 00:43:43
opms.otrs.com
IyEvdXNyL2Jpbi9wZXJsCiMgLS0KIyBvdHJzLkltcG9ydEV4cG9ydC5wbCAtIGltcG9ydC9leHBvcnQgc2NyaXB0CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTQgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBBRkZFUk8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgojIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxIFVTQQojIG9yIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBGaWxlOjpCYXNlbmFtZTsKdXNlIEZpbmRCaW4gcXcoJFJlYWxCaW4pOwp1c2UgbGliIGRpcm5hbWUoJFJlYWxCaW4pOwp1c2UgbGliIGRpcm5hbWUoJFJlYWxCaW4pIC4gJy9LZXJuZWwvY3Bhbi1saWInOwp1c2UgdmFycyBxdygkUmVhbEJpbik7Cgp1c2UgR2V0b3B0OjpTdGQ7Cgp1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7Cgpsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycgPT4gewogICAgICAgIExvZ1ByZWZpeCA9PiAnT1RSUy1JbXBvcnRFeHBvcnQnLAogICAgfSwKKTsKCiMgZ2V0IG9wdGlvbnMKbXkgJU9wdHM7CmdldG9wdHMoICdobjphOmk6bzonLCBcJU9wdHMgKTsKCmlmICggJE9wdHN7aH0gKSB7CgogICAgcHJpbnQgU1RET1VUICJvdHJzLkltcG9ydEV4cG9ydC5wbCAtIGFuIGltcG9ydC9leHBvcnQgdG9vbFxuIjsKICAgIHByaW50IFNURE9VVCAiQ29weXJpZ2h0IChDKSAyMDAxLTIwMTQgT1RSUyBBRywgaHR0cDovL290cnMuY29tL1xuIjsKICAgIHByaW50IFNURE9VVCAiXG4iOwogICAgcHJpbnQgU1RET1VUICJ1c2FnZTogb3Rycy5JbXBvcnRFeHBvcnQucGwgLW4gPFRlbXBsYXRlTnVtYmVyPiAtYSBpbXBvcnR8ZXhwb3J0ICI7CiAgICBwcmludCBTVERPVVQgIlstaSA8U291cmNlRmlsZT5dIFstbyA8RGVzdGluYXRpb25GaWxlPl1cbiI7CiAgICBwcmludCBTVERPVVQgIlxuIjsKICAgIHByaW50IFNURE9VVCAiICAgZXhhbXBsZXM6XG4iOwogICAgcHJpbnQgU1RET1VUICIgICAgICAgb3Rycy5JbXBvcnRFeHBvcnQucGwgLW4gMDAwMDQgLWEgaW1wb3J0IC1pIC90bXAvaW1wb3J0LmNzdlxuIjsKICAgIHByaW50IFNURE9VVCAiICAgICAgIG90cnMuSW1wb3J0RXhwb3J0LnBsIC1uIDAwMDA0IC1hIGV4cG9ydCAtbyAvdG1wL2V4cG9ydC5jc3ZcbiI7CgogICAgZXhpdCAxOwp9CgojIGNoZWNrIHRlbXBsYXRlIG51bWJlcgppZiAoICEkT3B0c3tufSApIHsKICAgIHByaW50IFNUREVSUiAiRVJST1I6IE5lZWQgLW4gVGVtcGxhdGVOdW1iZXJcbiI7CiAgICBleGl0IDE7Cn0KaWYgKCAkT3B0c3tufSAhfiBteyBcQSBcZCsgXHogfXhtcyApIHsKICAgIHByaW50IFNUREVSUiAiRVJST1I6IEludmFsaWQgVGVtcGxhdGVOdW1iZXJcbiI7CiAgICBleGl0IDE7Cn0KbXkgJFRlbXBsYXRlSUQgPSBpbnQgJE9wdHN7bn07CgojIGNoZWNrIGFjdGlvbiBtb2RlCmlmICggISRPcHRze2F9ICkgewogICAgcHJpbnQgU1RERVJSICJFUlJPUjogTmVlZCAtYSBpbXBvcnR8ZXhwb3J0XG4iOwogICAgZXhpdCAxOwp9CmlmICggbGMgJE9wdHN7YX0gbmUgJ2ltcG9ydCcgJiYgbGMgJE9wdHN7YX0gbmUgJ2V4cG9ydCcgKSB7CiAgICBwcmludCBTVERFUlIgIkVSUk9SOiBJbnZhbGlkIGFjdGlvblxuIjsKICAgIGV4aXQgMTsKfQoKIyBnZXQgdGVtcGxhdGUgZGF0YQpteSAkVGVtcGxhdGVEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydCcpLT5UZW1wbGF0ZUdldCgKICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICBVc2VySUQgICAgID0+IDEsCik7CgppZiAoICEkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gKSB7CiAgICBwcmludCBTVERFUlIgIkVSUk9SOiBUZW1wbGF0ZSAkT3B0c3tufSBub3QgZm91bmQhXG4iOwogICAgcHJpbnQgU1RERVJSICJFeHBvcnQgYWJvcnRlZC5cbiI7CiAgICBleGl0IDE7Cn0KCiMgdGltZSB0byBzdGFydAppZiAoIGxjICRPcHRze2F9IGVxICdpbXBvcnQnICkgewoKICAgIG15ICRTb3VyY2VDb250ZW50ID0gXGRvIHsnJ307CiAgICBpZiAoICRPcHRze2l9ICkgewoKICAgICAgICBwcmludCBTVERPVVQgIlJlYWQgRmlsZSAkT3B0c3tpfS5cbiI7CgogICAgICAgICMgcmVhZCBzb3VyY2UgZmlsZQogICAgICAgICRTb3VyY2VDb250ZW50ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+RmlsZVJlYWQoCiAgICAgICAgICAgIExvY2F0aW9uID0+ICRPcHRze2l9LAogICAgICAgICAgICBSZXN1bHQgICA9PiAnU0NBTEFSJywKICAgICAgICAgICAgTW9kZSAgICAgPT4gJ2Jpbm1vZGUnLAogICAgICAgICk7CgogICAgICAgIGRpZSAiQ2FuJ3QgcmVhZCBmaWxlICRPcHRze2l9LlxuSW1wb3J0IGFib3J0ZWQuXG4iIGlmICEkU291cmNlQ29udGVudDsKICAgIH0KCiAgICBwcmludCBTVERPVVQgIkltcG9ydCBpbiBwcm9jZXNzLi4uXG4iOwoKICAgICMgaW1wb3J0IGRhdGEKICAgIG15ICRSZXN1bHQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0JyktPkltcG9ydCgKICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlELAogICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJFNvdXJjZUNvbnRlbnQsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgKTsKCiAgICBkaWUgIlxuRXJyb3Igb2NjdXJyZWQuIEltcG9ydCBpbXBvc3NpYmxlISBTZWUgdGhlIE9UUlMgbG9nIGZvciBkZXRhaWxzLlxuIiBpZiAhZGVmaW5lZCAkUmVzdWx0OwoKICAgICMgUHJpbnQgcmVzdWx0CiAgICBwcmludCBTVERPVVQgIlxuIjsKICAgIHByaW50IFNURE9VVAogICAgICAgICJJbXBvcnQgb2YgJFJlc3VsdC0+e0NvdW50ZXJ9ICRSZXN1bHQtPntPYmplY3R9IHJlY29yZHM6ICIKICAgICAgICAuICIkUmVzdWx0LT57RmFpbGVkfSBmYWlsZWQsICRSZXN1bHQtPntTdWNjZXNzfSBzdWNjZWVkZWRcbiI7CiAgICBmb3IgbXkgJFJldENvZGUgKCBzb3J0IGtleXMgJXsgJFJlc3VsdC0+e1JldENvZGV9IH0gKSB7CiAgICAgICAgbXkgJENvdW50ID0gJFJlc3VsdC0+e1JldENvZGV9LT57JFJldENvZGV9IHx8IDA7CiAgICAgICAgcHJpbnQgU1RET1VUCiAgICAgICAgICAgICJJbXBvcnQgb2YgJFJlc3VsdC0+e0NvdW50ZXJ9ICRSZXN1bHQtPntPYmplY3R9IHJlY29yZHM6ICRDb3VudCAkUmV0Q29kZVxuIiwKICAgIH0KICAgIGlmICggJFJlc3VsdC0+e0ZhaWxlZH0gKSB7CiAgICAgICAgcHJpbnQgU1RET1VUCiAgICAgICAgICAgICJMYXN0IHByb2Nlc3NlZCBsaW5lIG51bWJlciBvZiBpbXBvcnQgZmlsZTogJFJlc3VsdC0+e0NvdW50ZXJ9XG4iOwogICAgfQp9CmVsc2lmICggbGMgJE9wdHN7YX0gZXEgJ2V4cG9ydCcgKSB7CgogICAgcHJpbnQgU1RET1VUICJFeHBvcnQgaW4gcHJvY2Vzcy4uLlxuIjsKCiAgICAjIGV4cG9ydCBkYXRhCiAgICBteSAkUmVzdWx0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydCcpLT5FeHBvcnQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKICAgIGRpZSAiXG5FcnJvciBvY2N1cnJlZC4gRXhwb3J0IGltcG9zc2libGUhIFNlZSBTeXNsb2cgZm9yIGRldGFpbHMuXG4iIGlmICFkZWZpbmVkICRSZXN1bHQ7CgogICAgcHJpbnQgU1RET1VUCiAgICAgICAgIlxuIiwKICAgICAgICAiU3VjY2VzczogJFJlc3VsdC0+e1N1Y2Nlc3N9XG4iLAogICAgICAgICJGYWlsZWQgOiAkUmVzdWx0LT57RmFpbGVkfVxuIiwKICAgICAgICAiXG4iOwoKICAgIGlmICggJE9wdHN7b30gKSB7CgogICAgICAgIG15ICRGaWxlQ29udGVudCA9IGpvaW4gIlxuIiwgQHsgJFJlc3VsdC0+e0Rlc3RpbmF0aW9uQ29udGVudH0gfTsKCiAgICAgICAgIyBzYXZlIGRlc3RpbmF0aW9uIGNvbnRlbnQgdG8gZmlsZQogICAgICAgIG15ICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+RmlsZVdyaXRlKAogICAgICAgICAgICBMb2NhdGlvbiA9PiAkT3B0c3tvfSwKICAgICAgICAgICAgQ29udGVudCAgPT4gXCRGaWxlQ29udGVudCwKICAgICAgICApOwoKICAgICAgICBkaWUgIkNhbid0IHdyaXRlIGZpbGUgJE9wdHN7b30uXG5FeHBvcnQgYWJvcnRlZC5cbiIgaWYgISRTdWNjZXNzOwoKICAgICAgICBwcmludCBTVERPVVQgIkZpbGUgJE9wdHN7b30gc2F2ZWQuXG4iOwogICAgfQoKICAgIHByaW50IFNURE9VVCAiRXhwb3J0IGNvbXBsZXRlLlxuIjsKfQoKZXhpdCAwOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBTb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
H4sIAAAAAAACA+1d35ObthZ+z1/BOC/tjKNFP0BQN+ncdtq5nWknd5r0JS8e2Wa93GDwAN6N+3D/9iuBvWswGAzIiXePM/HuGlmfhPUdHenTOf7xpy+rwLj34sSPwrcjjMyR4YXzaOGHy7ejvz/+9sYZ/fTu1Y8LX/wg/y9jsTLkO8JE/fV2dJem6x9ubh4eHlCwTUQaxSjwNyjxbv4ngkDcyEI3o3evDOOwgoVIhXpt96pI09ifbVLPCMXKezuaifnnZRxtwsUoL7UrN4+CKDbuRfB29Po2e4xudtXcFOo5UfdaLL1Z7InP9VWb8uG6Xapee3G52tU6SnxZJN2uj4rU1KOeD8rsSiWyULh89/pf+HXepN0LT3VVNbQWJF2JeOmHxzjy3gT5jSDIIYTIm2G5jmtyxvH+npwPN7ssXHBZuPiycH4yXUdxGgs/PYacRVHgiTBHvRVB4nUHSuYikGPsVL9MZBHqYMuklqO6xynpjnfrp2k0UJfylx8JeC6Zl7G/OM3lQomaWh78RXo3/dJwA7vfsLz+rbb67/3EnwVeVQ/8MM0BcP/qt8NUX/6EMqP+9PaeIyKvrXbWWDie5VnnzxrLjb/wkoahVixTU9PdrthN010vl2t7Y/KXSnN4BhGIrRfvqv/5afY2dh+wnG7ijTcyxDz17/d/HdyTaPZfb57uOvshFeFCxAvjjfHR+5KODnyTkeEv3o7em8W7Ve6frE3ax6PbtY4ex5Q1xqTc/WMDUlf3bFauOpatF+Ey8B6rN5H0IawJsZHDTQWHbIy7QabqJjSM9FKZOnOeeQyFciXn4v3Hvz4YFFHjN/kJew9R/LnG2ThBxTrbHoVpFbR63bgVKz/YyhaKMBkZSbpVY0Y6ovlb/+0F917qz8Xh0D6/BXeev7yrbMPhNG2bhQfuh1kch81jsQtG0TDVmCd+q/71A5LOwDJcedWfoxduVrsZpyVKpdk5jxv3WZPK7HhqCm2gXP5ibn5a2KOfvX98L/7DD70Dq2TurBLua5XMsY01WqU3JsLSS7OdcfYb5nhiOdkvElddsruBz7x/plkv2vetggXW2HJPFuDIdFx7bBHEbdM+WdQZm926Mo/i0Iun6nNP6geVeQReee0cYOlle9Myj49dDKH+9UDI3MXjYfLkKhKz1vqdDZZZ8fq72HECXojkLvDC5al+kGFZ/8lffhLL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+c7OzqSkpPz8fMuqLl68WFlZ+cEHH/zud797//33hRArV66Mj4+X5ii89NJLK1eu/POf/yzvv2DBgqysrPXr18sZAfX19T2auyddB9oe0qN2HZwHIcTatWs3bNhgMBj27ds3d+5cKV/JcT+d7L/ZbL755pv/+te/Sptqtfqpp55Sq9XSZpft2jtvK1as0Ov1JSUlISEhH2iBIegAACAASURBVH74oRT+k+3atausrGz37t3yoHpav2z37t2//vWvux2a5QO4nSkXQkyYMOH5558nuuRevb6/k40fP16K1AghlErl3LlzW1paysrKvv32W2miWf/erNnTZXTGqjA4OHjRokWvvfbaoUOHRowYYTabi4uL/f39Fy1a1GV+iYcMzRN4QXTJ9cLDw3/+859bRSV9fX3nz58/ffr0kpKSs2fP1tTUNDY2fvfdd999993EiRPvvffeXqxX19DQcPDgwfDwcNu1h1xwuD1Tp061LWxsbFSr1RUVFTqdTv7uEUJcunTJduekpCTLzdjYWAfllpnD5eXlQoibbrrJqsJJkybt2rVL/tYJCQmJjo6ura3VaDQjR460nAFXUlJSUVExbdq0qqoqg8EQHR0tT5eVLjJmzJhhVfnMmTPLy8vPnDnjzHmQfPTRR9J36owZM1JTU5nGAqCPTCaTILoEYCDFxcXJaf7SpUtsbKxGo3FwyNNPPy2EuP/++9evXy+9EELs2LHj9ddfl/eJioqSokujR4/+7//+74ceekiv1xcUFIwePdqyqvT09CFDhmRkZCxdulQqef31148fPy69zsrKmjhxohTlkXzwwQfSJZx849pfetFul+fh5MmTTz75pFqt7ujoSEpKkqdxOWYblLFn9erVq1at2rNnjxBi1apVq1evlsodt2vb/7feeuvo0aPSNKX7779f6rxs7dq1fn5+8+fPNxgMvatfdvr0afma3wHp1xTny4UQ8fHxXUYr4Eq9vr+T3XLLLbYlZWVl8h+3H2/W+k6lUs2dO/e99977+OOPpaDw3Llz5VVZrHjX0AaUF0SXgoKCGhsbGxsbbWdvyhobG6U9e9eEFK3s7Oysra3ds2fP6dOn33zzzd/+9rf+/v5We8bExMTExAghzGbzhQsXSktLv/nmm9LS0sjISHlVIGfaamtru3Tp0tGjR7/99ttNmzY9+OCDVt/BA3q4Y7YzvLRa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YGdSUlKyd+/etra29957z7cheY7OJLSQXQIAhDm73R4TE8PAJQAeMplMvq2wt7dXSXN77sKFCwFryz0v7obXwQNhJqQ7E6vVumDBAl+F4R06k9BCdgkAEOY0Gs2oUaPy8vIC33RXV1dLS0tPT0/gmwYi3Oeff953RphSsnXr1pSUlMrKyqNHj6anp5eXlzsOaG5unjJlikajyc7OXrlypePNMD8/X5Kk/Px85ePIkSMlSbr66qsddVZXV3/zm99MT0+/6667DAaDo8Lu7u7FixePHj06Pz9/7ty5XV1dLsG0t7cvW7YsOTn5wQcfVMqvueYaJWzJiSeX7KYtIcS5c+emTp2q1WqXL19uNBqdYxiolYHuhhDiwIEDBQUFSUlJ3/jGN1555ZWxY8deYfBA0IrAzmTEiBEuJ3odxqA3SgixfPny7OzscePGHTx40FFIZxKSZAAA4B/nz5+vqanp6upSOxBfmjZt2vXXX692FHBVXFwcFxendhQDSk5OvnDhQuDb7fusK4TYtGnTyy+/nJGRUVJSsm/fvtjYWMfepUuXvv/++xaLpbu7++DBgz/72c8cu06fPl1aWtrd3W2z2V588cX6+nrnOv/jP/6jsbFRluWnn376Jz/5iWPXypUrP/vsM2X73XffXbFihUswN9100+7duzs7OweNfFBu2hJCPP744+fPn29vb//lL3/pfF1uWhzobuzateu2226rrq7u6elpaWn57//+b51Od4XB+8q8efNeeukltVrHoCoqKq699lqvTz98+PCMGTN8GI/nIqozcXOiF2G4v1GyLBuNRrvd/tFHHyUlJfkq+CukfC9osVhUaT10kV0CAMBfzp07V1NTYzAY1A7El8guBSeyS/3q94XQsWG3212O0el0zt/CZmZmOp/70UcfTZo0ad68eVVVVS51Xrx4Udlub29PT0937MrOzna8n/T09GRnZ7ucaDQaPYx8UG7aEkI43mA7OjpcrmugFge6G6NGjXL/t0l2CQMJs+ySYyPMOhM3J3oRhvsb9eGHH06cODExMXHKlClubnKAkV3yDjPjAADwF7vdLoSIiuJ/WyAY9Z1nMX78eOcH5aamJue9SUlJGo2mvr7+0qVLA1Uly3JcXJyjXJZlpR8QA6wKnJSU5EmoZrN50GMGbUsRGxvrYafk5m44GvKEJ8EDIS3MOhM3rjCMvjdq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eCkmJkav1zc1NV199dWO8Ufbt29/5ZVXRo0aJYTYvHnzddddt2XLFmXXM8884/jGr99znQ2UF3jxxRdfe+21vLw8IcSzzz777W9/+8ovxGg0btu2raysrLe3t6enJzExsaCg4Ne//rXjgA8++MDN6aNGjbr66qu9br22tvZKkmLolyzLZrNZCJGQkKB2LL5XVVU1ceJEtaMAAG98/vnnSg/m/B+98pXAU089tX79+jfffLOnp2fhwoW7du1asGCBckBzc3NxcfEnn3ySlZV1xx13/Pa3v01KShJC5OfnNzQ05OXl1dfXCyFGjhx59uzZq6666ty5c0qdJ06cuOOOOxoaGubPn//73/8+OTlZqbC7u/vee++trKw0m80FBQV79+5NTU11DqatrW316tX79++/++67n3nmGSHENddcU1dXJ746ptv91xiDXpcQYvny5X/605/S09M3bty4cOFC5xP7Dd79dfV7ex1n7dmz58knnzx58qQQYu/evUoYJpPpwQcf3L9//6hRo/74xz+OHz9+0OsCEJwYuwQgVL3yyitHjx6dNGnS2LFjHcOIzp49O378eEmSJEkaPnz4+fPnHcc7p2D6PddZTk5OvzmXhoaG0aNHK9vXXHON8y69Xt/vcKdB9fT0tLe322w2x/Miy2EimH3rW98qLi5WOwoA8MaECRP6Zi6UEpvNtmvXru9973v/9V//tX379pKSEscBpaWlmzdvtlgsdXV1M2fOLC0tVcrr6+tPnz79gx/8wGAw2O32srKy+vr6c+fOOeo8duzY0aNHOzo6Jk+e/MgjjzgqXLdu3bp1686dO3fx4sXS0tJ169a5BPP973//pptu0uv1SmpJCHH69Glll+zE/cUOel1CiOeee66xsfHFF1/80Y9+5HJiv8G7v65+b6/jrDfffPPAgQNms3nv3r2OMNasWaPT6RobGysqKo4cOSJILQGhSwaA4JaQkGA0GpVtZUC481673f7GG28MHz5c+Thu3Lgvv/yybyX9dncu5zq74447du/e3ff0r33taydOnFC2q6qqnKvdtWvX4sWLPb4sV62trevWrUtKSoqLi0tPTzeZTF5XBdXZ7faampqamhqbzaZ2LIgUDz30UGZmptpRAIGTk5NTU1Pj3bl9nwocJUIIu93ucozLb5u6/Fv76KOPJk2aNG/evKqqKpc6L168qGy3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AAAAAGBQePbZZwOBwEUXXdQxWhJC/P73v7/wwgsDgcCzzz7bUzOeeOKJQoi2trboRrfbLYQ47rjjemqWZHR30lmzZjkcji+//PKf//yn0vLVV1999dVXDodj5syZKZdhMBiEEAUFBWm+t7eRLgEAAAAAMChs2rRJCHHNNdfE66Bcev/993tqxi+//FIIEbMSasyYMUKI+fPn//DDDz01UZe6O6nZbFZO9V69erXSojy44oorzGZzCgWEw+E9e/Yo7/CNN96YtnvTg51xAAAAAAAMCg6Ho6WlpampyeFwdNrh8OHDBQUFeXl5hw8f7ni1WzvjDh8+vHXr1jvuuOPAgQOLFy9esmSJ2nPr1q3Tp0/3+XxCiGOOOeakk0765S9/ecYZZ5x55pl6vb7LV5HazrjkJ1UH+frrr0866aTc3NyamhohRHFxcWtr69dffz169OjEb0W8woQQpaWld99996233prkjUd4b9qQLgEAAAAAMCgYjcZQKBQMBpU9Vh0Fg0GTyWQwGILBYMeryaRLHV166aUvvPCC0WiMbvzuu++WLVv21ltvOZ1OtbGsrOzxxx+/8MILE7+K1NKl5CeNHmT8+PGff/75K6+8Isvy5ZdfPn78+M8++6zLieIVJoQwGAxnnHHG0qVLkz9z6kjuTRvSJQAAAAAABoU0rF2KUVZWtn79emVXWkfhcHjnzp27du367LPP3n333b1790qSVFFRcf755yd4FSmnS0lOGj3Is88+e8MNN0yZMkWW5Q8++ODZZ5+97rrrkpwoRigUqqmpefvttxcvXtzW1vb3v/996tSpabg3PUiXAAAAAAAYFCZMmLBjx46NGzdOmzat0w4bN248++yzJ0yY8Omnn3a8mvzOuGAw+OOPPy5duvTFF18sKCj45ptvioqKEtcWiUTuvffehx9+OOZr2rpVRndDn04njR6kra2tpKTE6/UKISwWS21trd1uT2GiaH//+99nzJgxbty4HTt2pPPeXsWp3gAAAAAADArKgpeVK1fG66BcOvJ1MUajccSIEWvXrj377LMbGxvvvffeLm/R6XQLFy4UQuzatesIZ09el5NmZ2dfdNFFsizLsnzxxRcr0dIROuOMMxLM2Hv39irSJQAAAAAABoXrr7/eaDS+8cYbL730UserL7744ptvvmkyma6//voemU6SpCeffNJgMLzwwgt79uzpsr/ybW42m61HZk9Sl5POnz8/5sER+uSTT4QQhYWFab63V5EuAQAAAAAwKAwdOvShhx4SQlx11VXXXnvtjh07PB6P1+v9/PPPr7vuurlz5wohHn744fLy8p6accSIEfPmzQuFQtHLl0aNGnXvvfe+9957lZWVfr/f5/P9+OOP//3f/62cfDRjxoyemj1aypOeccYZytqlyZMnd3fSX//61y+++OK+ffv8fr/b7d6zZ88f//jH2bNnCyHmzJmjdpMkqeOpVUne20dw7hIAAAAAAIPI0qVLFy9eHIlEYtp1Ot2DDz74hz/8Id6NyZ+7FK2mpmb48OE+n++zzz4bN26ciP/tckKIE0444YMPPhgyZEiC+lM7dyn5SZM5UynJc5fiTXrWWWe9/fbbmZmZCUZL8t4+gnQJAAAAAIDBZdeuXU8//fTmzZurq6tlWS4rKzvrrLNuueWWUaNGJbgrtXRJCLFo0aLly5dPnTp106ZNQojdu3e/9dZbW7Zs2bVrV0NDgyzLeXl5o0aNuuCCC66++uqMjIzExaeWLiU/aQ+mSzt27HjppZc+/PDDffv2hUKh/Pz8MWPGXHbZZZdeeqlO9/+byTodLcl7+wjSJQAAAAAAAKSuz8VdAAAAAAAA6EdIlwAAAAAAAJA60iUAAAAAAACkjnQJAAAAAAAAqSNdAgAAAAAAQOpIlwAAAAAAAJA60iUAAAAAAACkjnQJAAAAAAAAqTNoXQAAAAAAAEgHSZJkWda6iv8nSVLHxj5VIZJEugQAAAAAAHpdp9mWtllSX4vb+i92xgEAAAAAACB1pEsAAAAAAAwukiS98sor48ePz8zMtNls06ZN27lz54YNG0477TSr1Zqfn3/ZZZc1NTWpnZ977rnjjjvOZDIde+yxa9eujR7queeeGz58uMlkGj58+MqVK2OmOOWUU2w2m16vVzbBST/pssLrr7/+0ksvjW6ZM2fO9ddfr2FJSEQGAAAAAACDgBoCCCFGjhz5/vvvO53O2traq666yuFw/OIXv9i0aZPactlll6mdhw0b9tFHHzmdzg8//HDo0KHvvfeecmndunVlZWWbN29ub2/fvHlzWVnZ+vXr1btGjBixefNmt9sdM3vHejoKBAKnn376M888ozx9+umnJ0+eHAgEerskpIYdhgAAAAAADArqMUOSJH3++ecnn3yy0t7Y2FhYWPjFF1+MHTtWbTnhhBMOHz6sdF6/fv25556rXHrrrbcef/zxjz76SAhx2mmnLViw4IILLlAuVVRUPProo5988oly15YtWyZPntxx9uiWjkWqfRoaGk477bQ///nPQog5c+b84x//KCwsVG/spZKQGt5HAAAAAAAGheh0KRwO63S66EsdW9TOLS0tOTk5SntLS8vw4cOVfXMOh2Pfvn25ubnqpWOPPba5uVm5y+v1ZmRkdBwwQUuML774Ys6cOQaD4eWXX1aTr14tCanh3CUAAAAAAAad6CApXssRis5xUvPpp5/a7Xa/33/o0KE+UhI6RboEAAAAAAAS2bp1q/r4448//uUvf6k8PuGEE7Zs2RJ96Re/+EW8QQwGQzgcTn7Sr7/++v7773/99ddfe+216667bt++fZqXhHhIlwAAAAAAQCK33HLLxx9/7HK5Pvroo9tuu+2ee+5R2u+6665bb731o48+Ui8tXLgw3iBDhw59//33I5FIMjO63e7Zs2c//vjjxx577Pjx4//zP//zoosu8vl8GpaEBNhhCAAAAADAoBB9lFKXRyBFd/6f//mfFStWHDx4sLy8/L777ps3b57a7dlnn1UuDRs2bOHChddcc028AdetW3fXXXcdOnQoHA6rI3csUrl01VVX6fX6559/Xm2/7LLLLBbL6tWre7UkpIZ0CQAAAAAAxNUHj77ugyUNcuyMAwAAAAAAQOpIlwAAAAAAAJA61pIBAAAAAAAgdaxdAgAAAAAAQOpIlwAAAAAAAJA60iUAAAAAAACkjnQJAAAAAAAAqSNdAgAAAABg0Dl48GBlZaXy2OVyHThwQHns9/ubmpqEELIs79u3b9++fTE3qh1iblR1OhoGNoPWBQAAAAAAgLRav379v/71r+bm5qOPPvqiiy66/fbbTzzxRLPZfN555/3xj39sbGx86623/vWvf23atKmhocFgMCxbtky5ce/evWqH2tpa9cY777xT6RDdGD2adq8V6SDJsqx1DQAAAAAAIN3a29tvuOGGSZMmjRo16t/+7d9mzZq1bt06IcQFF1yg5EGRSOTQoUNLlixZs2ZN9I1Kh6effjrmRiFEx0Z1NAxg7IwDAAAAAGDQkWX57rvvXrBgQWNjY0FBQad9KioqFi1adM455+zfv//zzz/3er3RV6NvVDskGA0DGOkSAAAAAACDzl133XXxxRefdNJJpaWlNTU1QghJkmL6XHjhhX/+859feumlmpqa7777zufzRV+NvlHtkGA0DGD6+++/X+saAAAAAABA+vzpT39644033G733r17L7300gceeOCTTz6ZPHnysGHDFixY8Mknn3i93tbW1jVr1rz55psnnXTSpZdeOnr0aIvF0tzcrHb493//d/XG888/X+lw9NFHdzra6aefrvWLRi/i3CUAAAAAAAY1WZZ9Pp/FYolpdzqdJpPJbDZ368Z4o2EA+1965ho/uMBXfQAAAABJRU5ErkJggg==
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdHJzX2NvbmZpZyB2ZXJzaW9uPSIxLjAiIGluaXQ9IkZyYW1ld29yayI+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWRtaW5JbXBvcnRFeHBvcnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JbXBvcnRFeHBvcnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cD5hZG1pbjwvR3JvdXA+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5JbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5JbXBvcnQvRXhwb3J0PC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkFkbWluPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPE5hdkJhck1vZHVsZT4KICAgICAgICAgICAgICAgICAgICA8TW9kdWxlPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpOYXZCYXJNb2R1bGVBZG1pbjwvTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxOYW1lIFRyYW5zbGF0YWJsZT0iMSI+SW1wb3J0L0V4cG9ydDwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+U3lzdGVtPC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8UHJpbz43MTA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhck1vZHVsZT4KICAgICAgICAgICAgICAgIDxMb2FkZXI+CiAgICAgICAgICAgICAgICAgICAgPENTUz5JVFNNLkltcG9ydEV4cG9ydC5jc3M8L0NTUz4KICAgICAgICAgICAgICAgIDwvTG9hZGVyPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZFJlZ2lzdHJhdGlvbiMjI0NTViIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gb3JtYXQgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SW1wb3J0RXhwb3J0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Rm9ybWF0QmFja2VuZDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6Q1NWPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5DU1Y8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+Cjwvb3Ryc19jb25maWc+Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9iZ19JbXBvcnRFeHBvcnQucG0gLSB0cmFuc2xhdGlvbiBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTQgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpiZ19JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFJbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBtYXBwaW5nIHRlbXBsYXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYXJzZXQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb24gKDopJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4gU2VwYXJhdG9yJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvdCAoLiknfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VtaWNvbG9uICg7KSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUYWJ1bGF0b3IgKFRBQiknfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jbHVkZSBDb2x1bW4gSGVhZGVycyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgc3VtbWFyeSBmb3InfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0ZWQgcmVjb3Jkcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBvcnRlZCByZWNvcmRzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY29yZHMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2tpcHBlZCd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSB0ZW1wbGF0ZSB0byBpbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEltcG9ydCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBFeHBvcnQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVsZXRlIFRlbXBsYXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZSBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2JqZWN0IGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgZm9ybWF0IGluZm9ybWF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG1hcCBlbGVtZW50cyBmb3VuZC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIE1hcHBpbmcgRWxlbWVudCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IHNlYXJjaCBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXN0cmljdCBleHBvcnQgcGVyIHNlYXJjaCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU291cmNlIEZpbGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VjY2Vzcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGYWlsZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVwbGljYXRlIG5hbWVzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgcHJvY2Vzc2VkIGxpbmUgbnVtYmVyIG9mIGltcG9ydCBmaWxlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09rJ30gPSAnJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGJhY2tlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGltcG9ydC9leHBvcnQgbW9kdWxlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCd9ID0gJyc7CgogICAgIwogICAgIyBPQlNPTEVURSBFTlRSSUVTIEZPUiBSRUZFUkVOQ0UsIERPIE5PVCBUUkFOU0xBVEUhCiAgICAjCgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jc19JbXBvcnRFeHBvcnQucG0gLSB0cmFuc2xhdGlvbiBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTQgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpjc19JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFJbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBtYXBwaW5nIHRlbXBsYXRlJ30gPSAnTm92w6EgxaFhYmxvbmEgem9icmF6ZW7DrSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFyc2V0J30gPSAnWm5ha292w6Egc2FkYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvbiAoOiknfSA9ICdEdm9qdGXEjWthICg6KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4nfSA9ICdTbG91cGVjJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbiBTZXBhcmF0b3InfSA9ICdPZGTEm2xvdmHEjSBTbG91cGPFryc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb3QgKC4pJ30gPSAnVGXEjWthICguKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZW1pY29sb24gKDspJ30gPSAnU3TFmWVkbsOtayAoOyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGFidWxhdG9yIChUQUIpJ30gPSAnVGFidWzDoXRvciAoVEFCKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNsdWRlIENvbHVtbiBIZWFkZXJzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBzdW1tYXJ5IGZvcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnRlZCByZWNvcmRzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cG9ydGVkIHJlY29yZHMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3Jkcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTa2lwcGVkJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkltcG9ydEV4cG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCBNYW5hZ2VtZW50J30gPSAnSW1wb3J0L0V4cG9ydCBTcHLDoXZhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIHRlbXBsYXRlIHRvIGltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgSW1wb3J0J30gPSAnWmFow6FqaXQgSW1wb3J0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEV4cG9ydCd9ID0gJ1phaMOhaml0IEV4cG9ydCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWxldGUgVGVtcGxhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCd9ID0gJ0tyb2snOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSA9ICdFZGl0YWNlIG9iZWNuw71jaCBpbmZvcm1hY8OtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05hbWUgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09iamVjdCBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IG9iamVjdCBpbmZvcm1hdGlvbid9ID0gJ0VkaXRhY2UgaW5mb3JtYWPDrSBvIG9iamVrdHUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24nfSA9ICdFZGl0YWNlIGZvcm3DoXR1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uJ30gPSAnRWRpdGFjZSBtYXBvdsOhbsOtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG1hcCBlbGVtZW50cyBmb3VuZC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIE1hcHBpbmcgRWxlbWVudCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IHNlYXJjaCBpbmZvcm1hdGlvbid9ID0gJ0VkaXRhY2UgdnlobGVkw6F2w6Fuw60nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzdHJpY3QgZXhwb3J0IHBlciBzZWFyY2gnfSA9ICdPbWV6aXQgRXhwb3J0IHZ5aGxlZMOhdsOhbsOtbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSA9ICdJbmZvcm1hY2UgbyBJbXBvcnR1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvdXJjZSBGaWxlJ30gPSAnWmRyb2pvdsO9IFNvdWJvcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWNjZXNzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZhaWxlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdXBsaWNhdGUgbmFtZXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFzdCBwcm9jZXNzZWQgbGluZSBudW1iZXIgb2YgaW1wb3J0IGZpbGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2snfSA9ICcnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQvRXhwb3J0J30gPSAnSW1wb3J0L0V4cG9ydCc7CgogICAgIwogICAgIyBPQlNPTEVURSBFTlRSSUVTIEZPUiBSRUZFUkVOQ0UsIERPIE5PVCBUUkFOU0xBVEUhCiAgICAjCgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jdF9JbXBvcnRFeHBvcnQucG0gLSB0cmFuc2xhdGlvbiBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTQgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpjdF9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFJbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBtYXBwaW5nIHRlbXBsYXRlJ30gPSAnQWZlZ2lyIHBsYW50aWxsYSBkZSBtYXBhdGdlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYXJzZXQnfSA9ICdDb25qdW50IGRlIGNhcsOgY3RlcnMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb24gKDopJ30gPSAnRG9zIHB1bnRzICg6KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4nfSA9ICdDb2x1bW5hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbiBTZXBhcmF0b3InfSA9ICdTZXBhcmFkb3IgZGUgY29sdW1uYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb3QgKC4pJ30gPSAnUHVudCAoLiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VtaWNvbG9uICg7KSd9ID0gJ1B1bnQgaSBjb21hICg7KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUYWJ1bGF0b3IgKFRBQiknfSA9ICdUYWJ1bGFkb3IgKFRBQiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jbHVkZSBDb2x1bW4gSGVhZGVycyd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ID0gJ0dlc3Rpw7IgZGUgSW1wb3J0YXIvRXhwb3J0YXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIHRlbXBsYXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIHRlbXBsYXRlIHRvIGltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgSW1wb3J0J30gPSAnQ29tZW7Dp2FyIGltcG9ydGFjacOzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEV4cG9ydCd9ID0gJ0NvbWVuw6dhciBleHBvcnRhY2nDsyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWxldGUgVGVtcGxhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCd9ID0gJ1Bhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbid9ID0gJ0VkaXRhciBpbmZvcm1hY2nDsyBjb211bmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2JqZWN0IGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gPSAnRWRpdGFyIGluZm9ybWFjacOzIGRcJ29iamVjdGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24nfSA9ICdFZGl0YXIgaW5mb3JtYWNpw7MgZGUgZm9ybWF0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uJ30gPSAnRWRpdGFyIGluZm9ybWFjacOzIGRlIG1hcGF0Z2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbWFwIGVsZW1lbnRzIGZvdW5kLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgTWFwcGluZyBFbGVtZW50J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgc2VhcmNoIGluZm9ybWF0aW9uJ30gPSAnRWRpdGFyIGluZm9ybWFjacOzIGRlIHJlY2VyY2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzdHJpY3QgZXhwb3J0IHBlciBzZWFyY2gnfSA9ICdSZXN0cmluZ2lyIGV4cG9ydGFjacOzIHBlciByZWNlcmNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBpbmZvcm1hdGlvbid9ID0gJ0ltcG9ydGFyIGluZm9ybWFjacOzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvdXJjZSBGaWxlJ30gPSAnRml0eGVyIGZvbnQnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCd9ID0gJ0ltcG9ydGFyL0V4cG9ydGFyJzsKCiAgICAjCiAgICAjIE9CU09MRVRFIEVOVFJJRVMgRk9SIFJFRkVSRU5DRSwgRE8gTk9UIFRSQU5TTEFURSEKICAgICMKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kYV9JbXBvcnRFeHBvcnQucG0gLSB0cmFuc2xhdGlvbiBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTQgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpkYV9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFJbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBtYXBwaW5nIHRlbXBsYXRlJ30gPSAnVGlsZsO4aiBNYXBwaW5nLVRlbXBsYXRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYXJzZXQnfSA9ICdUZWduc8OmdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvbiAoOiknfSA9ICdLb2xvbiAoOiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uJ30gPSAnS29sb25uZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4gU2VwYXJhdG9yJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvdCAoLiknfSA9ICdQdW5rdHVtICguKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZW1pY29sb24gKDspJ30gPSAnU2VtaWtvbG9uICg7KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUYWJ1bGF0b3IgKFRBQiknfSA9ICdUYWJ1bGF0b3IgKFRBQiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jbHVkZSBDb2x1bW4gSGVhZGVycyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgc3VtbWFyeSBmb3InfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0ZWQgcmVjb3Jkcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBvcnRlZCByZWNvcmRzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY29yZHMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2tpcHBlZCd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ID0gJ0ltcG9ydC9Fa3BvcnQgc3R5cmluZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSB0ZW1wbGF0ZSB0byBpbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEltcG9ydCd9ID0gJ1N0YXJ0IGltcG9ydCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBFeHBvcnQnfSA9ICdTdGFydCBla3BvcnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVsZXRlIFRlbXBsYXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAnfSA9ICdUcmluJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgY29tbW9uIGluZm9ybWF0aW9uJ30gPSAnUmV0IGbDpmxsZXMgaW5mb3JtYXRpb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZSBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2JqZWN0IGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gPSAnUmV0IG9iamVrdCBpbmZvcm1hdGlvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ID0gJ1JldCBmb3JtYXQgaW5mb3JtYXRpb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnIGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24nfSA9ICdSZXQgbWFwcGluZyBpbmZvcm1hdGlvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBtYXAgZWxlbWVudHMgZm91bmQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBNYXBwaW5nIEVsZW1lbnQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSA9ICdSZXQgc8O4Z2VpbmZvcm1hdGlvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXN0cmljdCBleHBvcnQgcGVyIHNlYXJjaCd9ID0gJ0JlZ3LDpm5zIGVrcG9ydCBwci4gc8O4Z25pbmcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gPSAnSW1wb3J0IGluZm9ybWF0aW9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvdXJjZSBGaWxlJ30gPSAnS2lsZGUgZmlsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3MnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmFpbGVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1cGxpY2F0ZSBuYW1lcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IHByb2Nlc3NlZCBsaW5lIG51bWJlciBvZiBpbXBvcnQgZmlsZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPayd9ID0gJyc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQnfSA9ICdJbXBvcnQvRWtwb3J0JzsKCiAgICAjCiAgICAjIE9CU09MRVRFIEVOVFJJRVMgRk9SIFJFRkVSRU5DRSwgRE8gTk9UIFRSQU5TTEFURSEKICAgICMKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbiBTZXBlcmF0b3InfSA9ICdLb2xvbm5lIGFkc2tpbGxlbHNlJzsKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9JbXBvcnRFeHBvcnQucG0gLSB0cmFuc2xhdGlvbiBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTQgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpkZV9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFJbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBtYXBwaW5nIHRlbXBsYXRlJ30gPSAnTWFwcGluZy1UZW1wbGF0ZSBoaW56dWbDvGdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFyc2V0J30gPSAnWmVpY2hlbnNhdHonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb24gKDopJ30gPSAnRG9wcGVscHVua3QgKDopJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbid9ID0gJ1NwYWx0ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4gU2VwYXJhdG9yJ30gPSAnU3BhbHRlbnRyZW5uZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG90ICguKSd9ID0gJ1B1bmt0ICguKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZW1pY29sb24gKDspJ30gPSAnU2VtaWNvbG9uICg7KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUYWJ1bGF0b3IgKFRBQiknfSA9ICdUYWJ1bGF0b3IgKFRBQiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jbHVkZSBDb2x1bW4gSGVhZGVycyd9ID0gJ01pdCBTcGFsdGVuw7xiZXJzY2hyaWZ0ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IHN1bW1hcnkgZm9yJ30gPSAnSW1wb3J0LUJlcmljaHQgZsO8cic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnRlZCByZWNvcmRzJ30gPSAnSW1wb3J0aWVydGUgRGF0ZW5zw6R0emUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXhwb3J0ZWQgcmVjb3Jkcyd9ID0gJ0V4cG9ydGllcnRlIERhdGVuc8OkdHplJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY29yZHMnfSA9ICdEYXRlbnPDpHR6ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTa2lwcGVkJ30gPSAnw5xiZXJzcHJ1bmdlbic7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ID0gJ0ltcG9ydC9FeHBvcnQtVmVyd2FsdHVuZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSB0ZW1wbGF0ZSB0byBpbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnRXJzdGVsbGVuIGVpbmVyIFZvcmxhZ2UgenVtIEltcG9ydGllcmVuIHVuZCBFeHBvcnRpZXJlbiB2b24gT2JqZWt0LUluZm9ybWF0aW9uZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEltcG9ydCd9ID0gJ0ltcG9ydCBzdGFydGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEV4cG9ydCd9ID0gJ0V4cG9ydCBzdGFydGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlbGV0ZSBUZW1wbGF0ZSd9ID0gJ1RlbXBsYXRlIGzDtnNjaGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAnfSA9ICdTY2hyaXR0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgY29tbW9uIGluZm9ybWF0aW9uJ30gPSAnQWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuIGJlYXJiZWl0ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZSBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2JqZWN0IGlzIHJlcXVpcmVkISd9ID0gJ09iamVrdCBpc3QgZXJmb3JkZXJsaWNoISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgaXMgcmVxdWlyZWQhJ30gPSAnRm9ybWF0IGlzdCBlcmZvcmRlcmxpY2ghJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gPSAnT2JqZWt0LUluZm9ybWF0aW9uZW4gYmVhcmJlaXRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ID0gJ0Zvcm1hdC1JbmZvcm1hdGlvbmVuIGJlYXJiZWl0ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnIGlzIHJlcXVpcmVkISd9ID0gJyB3aXJkIGJlbsO2dGlndCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uJ30gPSAnTWFwcGluZy1JbmZvcm1hdGlvbmVuIGJlYXJiZWl0ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbWFwIGVsZW1lbnRzIGZvdW5kLid9ID0gJ0tlaW5lIE1hcHBpbmctRWxlbWVudGUgZ2VmdW5kZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBNYXBwaW5nIEVsZW1lbnQnfSA9ICdNYXBwaW5nLUVsZW1lbnQgaGluenVmw7xnZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSA9ICdTdWNoLUluZm9ybWF0aW9uZW4gYmVhcmJlaXRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXN0cmljdCBleHBvcnQgcGVyIHNlYXJjaCd9ID0gJ0V4cG9ydCBwZXIgU3VjaGUgZWluc2NocsOkbmtlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSA9ICdJbXBvcnQtSW5mb3JtYXRpb25lbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb3VyY2UgRmlsZSd9ID0gJ1F1ZWxsLURhdGVpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3MnfSA9ICdFcmZvbGdyZWljaCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGYWlsZWQnfSA9ICdOaWNodCBlcmZvbGdyZWljaCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdXBsaWNhdGUgbmFtZXMnfSA9ICdEb3BwZWx0ZSBOYW1lbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IHByb2Nlc3NlZCBsaW5lIG51bWJlciBvZiBpbXBvcnQgZmlsZSd9ID0gJ1p1bGV0enQgdmVyYXJiZWl0ZXRlIFplaWxlIGRlciBJbXBvcnQtRGF0ZWknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2snfSA9ICdPayc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9CiAgICAgICAgJ0Zvcm1hdC1CYWNrZW5kIE1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgSW1wb3J0L0V4cG9ydCBNb2R1bHMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICdJbXBvdGllcmVuIHVuZCBFeHBvcnRpZXJlbiB2b24gT2JqZWt0LUluZm9ybWF0aW9uZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQnfSA9ICdJbXBvcnQvRXhwb3J0JzsKCiAgICAjCiAgICAjIE9CU09MRVRFIEVOVFJJRVMgRk9SIFJFRkVSRU5DRSwgRE8gTk9UIFRSQU5TTEFURSEKICAgICMKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9lc19JbXBvcnRFeHBvcnQucG0gLSB0cmFuc2xhdGlvbiBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTQgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjplc19JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFJbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBtYXBwaW5nIHRlbXBsYXRlJ30gPSAnQcOxYWRpciBwbGFudGlsbGEgZGUgbWFwZW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhcnNldCd9ID0gJ0p1ZWdvIGRlIGNhcmFjdGVyZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb24gKDopJ30gPSAnRG9zIHB1bnRvcyAoOiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uJ30gPSAnQ29sdW1uYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4gU2VwYXJhdG9yJ30gPSAnU2VwYXJhZG9yIGRlIENvbHVtbmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG90ICguKSd9ID0gJ1B1bnRvICguKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZW1pY29sb24gKDspJ30gPSAnUHVudG8geSBDb21hICg7KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUYWJ1bGF0b3IgKFRBQiknfSA9ICdUYWJ1bGFkb3IgKFRBQiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jbHVkZSBDb2x1bW4gSGVhZGVycyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgc3VtbWFyeSBmb3InfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0ZWQgcmVjb3Jkcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBvcnRlZCByZWNvcmRzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY29yZHMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2tpcHBlZCd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ID0gJ0dlc3Rpw7NuIGRlIEltcG9ydGFjacOzbi9FeHBvcnRhY2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgdGVtcGxhdGUgdG8gaW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBJbXBvcnQnfSA9ICdJbmljaWFyIEltcG9ydGFjacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBFeHBvcnQnfSA9ICdJbmljaWFyIEV4cG9ydGFjacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWxldGUgVGVtcGxhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCd9ID0gJ1Bhc28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSA9ICdFZGl0YXIgaW5mb3JtYWNpw7NuIGNvbcO6bic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOYW1lIGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPYmplY3QgaXMgcmVxdWlyZWQhJ30gPSAnwqFEZWJlIGVzcGVjaWZpY2FyIE9iamV0byEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGlzIHJlcXVpcmVkISd9ID0gJ8KhRGViZSBlc3BlY2lmaWNhciBGb3JtYXRvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IG9iamVjdCBpbmZvcm1hdGlvbid9ID0gJ0VkaXRhciBpbmZvcm1hY2nDs24gZGUgb2JqZXRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgZm9ybWF0IGluZm9ybWF0aW9uJ30gPSAnRWRpdGFyIGluZm9ybWFjacOzbiBkZWwgZm9ybWF0byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgbWFwcGluZyBpbmZvcm1hdGlvbid9ID0gJ0VkaXRhciBpbmZvcm1hY2nDs24gZGUgbWFwZW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbWFwIGVsZW1lbnRzIGZvdW5kLid9ID0gJ05vIHNlIGVuY29udHJhcm9uIGVsZW1lbnRvcyBkZSBtYXBlby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIE1hcHBpbmcgRWxlbWVudCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IHNlYXJjaCBpbmZvcm1hdGlvbid9ID0gJ0VkaXRhciBpbmZvcm1hY2nDs24gZGUgYsO6c3F1ZWRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnUmVzdHJpbmdpciBleHBvcnRhY2nDs24gcG9yIGLDunNxdWVkYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSA9ICdJbXBvcnRhciBpbmZvcm1hY2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU291cmNlIEZpbGUnfSA9ICdBcmNoaXZvIG9yaWdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWNjZXNzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZhaWxlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdXBsaWNhdGUgbmFtZXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFzdCBwcm9jZXNzZWQgbGluZSBudW1iZXIgb2YgaW1wb3J0IGZpbGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2snfSA9ICcnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuJ30gPQogICAgICAgICdSZWdpc3RybyBkZSBtw7NkdWxvIGRlIGZvcm1hdG8gYmFja2VuZCBwYXJhIGVsIG3Ds2R1bG8gaW1wb3J0L2V4cG9ydC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJ0ltcG9ydGFyIHkgZXhwb3J0YXIgaW5mb3JtYWNpw7NuIGRlIG9iamV0b3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQnfSA9ICdJbXBvcnRhci9FeHBvcnRhcic7CgogICAgIwogICAgIyBPQlNPTEVURSBFTlRSSUVTIEZPUiBSRUZFUkVOQ0UsIERPIE5PVCBUUkFOU0xBVEUhCiAgICAjCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGFzcyBpcyByZXF1aXJlZCEnfSA9ICfCoURlYmUgZXNwZWNpZmljYXIgQ2xhc2UhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbiBTZXBhcmF0b3IgaXMgcmVxdWlyZWQhJ30gPSAnwqFEZWJlIGVzcGVjaWZpY2FyIFNlcGFyYWRvciBkZSBDb2x1bW5hISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb21tYSAoLCknfSA9ICdDb21hICgsKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSB0ZW1wbGF0ZSBpbiBvcmRlciB0byBjYW4gaW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0KICAgICAgICAnQWdyZWd1ZSB1bmEgcGxhbnRpbGxhIG51ZXZhIHBhcmEgcG9kZXIgaW1wb3J0YXIgeSBleHBvcnRhci4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW1wdHkgZmllbGRzIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWVzIGFyZSBrZXB0J30gPSAnTG9zIGNhbXBvcyB2YWPDrW9zIGluZGljYW4gcXVlIGxvcyB2YWxvcmVzIGFjdHVhbGVzIHNlIG1hbnRpZW5lbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHbyBiYWNrJ30gPSAnUmVncmVzYXInOwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mYV9JbXBvcnRFeHBvcnQucG0gLSB0cmFuc2xhdGlvbiBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTQgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpmYV9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFJbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBtYXBwaW5nIHRlbXBsYXRlJ30gPSAn2KfYttin2YHZhyDaqdix2K/ZhiDbjNqpINmC2KfZhNioINmG2q/Yp9i02KonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhcnNldCd9ID0gJ9qp2K/YqNmG2K/bjCDYp9i32YTYp9i52KfYqic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvbiAoOiknfSA9ICfYr9mI2YbZgti32YcgKDopJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbid9ID0gJ9iz2KrZiNmGJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbiBTZXBhcmF0b3InfSA9ICfYrNiv2KfaqdmG2YbYr9mHINiz2KrZiNmG4oCM2YfYpyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb3QgKC4pJ30gPSAn2YbZgti32YcgKC4pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbWljb2xvbiAoOyknfSA9ICfYs9mF24wg2qnYp9mE2YYgKDspJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RhYnVsYXRvciAoVEFCKSd9ID0gJ9is2K/ZiNmEINiz2KfYsiAoVEFCKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNsdWRlIENvbHVtbiBIZWFkZXJzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBzdW1tYXJ5IGZvcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnRlZCByZWNvcmRzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cG9ydGVkIHJlY29yZHMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3Jkcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTa2lwcGVkJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkltcG9ydEV4cG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCBNYW5hZ2VtZW50J30gPSAn2YXYr9uM2LHbjNiqINmI2LHZiNivL9i12K/ZiNixJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIHRlbXBsYXRlIHRvIGltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICfYs9in2K7YqiDZgtin2YTYqNuMINio2LHYp9uMINmI2LHZiNivINmIINi12K/ZiNixINin2LfZhNin2LnYp9iqINii2KjYrNqp2KonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgSW1wb3J0J30gPSAn2LTYsdmI2Lkg2LnZhdmE24zYp9iqINmI2LHZiNivJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEV4cG9ydCd9ID0gJ9i02LHZiNi5INi52YXZhNuM2KfYqiDYtdiv2YjYsSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWxldGUgVGVtcGxhdGUnfSA9ICfYrdiw2YEg2YLYp9mE2KgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCd9ID0gJ9qv2KfZhSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbid9ID0gJ9mI24zYsdin24zYtCDYp9i32YTYp9i52KfYqiDYudmF2YjZhduMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05hbWUgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09iamVjdCBpcyByZXF1aXJlZCEnfSA9ICfYotio2KzaqdiqINmF2YjYsdivINmG24zYp9iyINin2LPYqiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGlzIHJlcXVpcmVkISd9ID0gJ9mC2KfZhNio4oCM2KjZhtiv24wg2YXZiNix2K8g2YbbjNin2LIg2KfYs9iqISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IG9iamVjdCBpbmZvcm1hdGlvbid9ID0gJ9mI24zYsdin24zYtCDYp9i32YTYp9i52KfYqiDYotio2Kzaqdiq24wnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24nfSA9ICfZiNuM2LHYp9uM2LQg2KfYt9mE2KfYudin2Kog2YLYp9mE2KjigIzYqNmG2K/bjCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycgaXMgcmVxdWlyZWQhJ30gPSAnINmF2YjYsdivINmG24zYp9iyINin2LPYqiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uJ30gPSAn2YjbjNix2KfbjNi0INin2LfZhNin2LnYp9iqINmG2q/Yp9i02KonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbWFwIGVsZW1lbnRzIGZvdW5kLid9ID0gJ9mH24zahiDYudmG2LXYsSDZhtqv2KfYtNiq24wg24zYp9mB2Kog2YbYtNivLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgTWFwcGluZyBFbGVtZW50J30gPSAn2KfZgdiy2YjYr9mGINi52YbYtdixINmG2q/Yp9i02KonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSA9ICfZiNuM2LHYp9uM2LQg2KfYt9mE2KfYudin2Kog2KzYs9iq2KzZiCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXN0cmljdCBleHBvcnQgcGVyIHNlYXJjaCd9ID0gJ9mF2K3Yr9mI2K/Ys9in2LLbjCDYudmF2YTbjNin2Kog2LXYr9mI2LEg2KjZhyDYp9iy2KfbjCDYrNiz2KrYrNmIJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBpbmZvcm1hdGlvbid9ID0gJ9mI2LHZiNivINin2LfZhNin2LnYp9iqJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvdXJjZSBGaWxlJ30gPSAn2YHYp9uM2YQg2YXZhtio2LknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VjY2Vzcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGYWlsZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVwbGljYXRlIG5hbWVzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgcHJvY2Vzc2VkIGxpbmUgbnVtYmVyIG9mIGltcG9ydCBmaWxlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09rJ30gPSAnJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGJhY2tlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGltcG9ydC9leHBvcnQgbW9kdWxlLid9ID0KICAgICAgICAn2YLYp9mE2KjigIzYqNmG2K/bjCDYq9io2Kog2YXYp9qY2YjZhCDYqNix2KfbjCDZhdin2pjZiNmEINmI2LHZiNivL9i12K/ZiNixJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICfZiNix2YjYryDZiCDYtdiv2YjYsSDYp9i32YTYp9i52KfYqiDYotio2KzaqdiqJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQnfSA9ICfZiNix2YjYry/Ytdiv2YjYsSc7CgogICAgIwogICAgIyBPQlNPTEVURSBFTlRSSUVTIEZPUiBSRUZFUkVOQ0UsIERPIE5PVCBUUkFOU0xBVEUhCiAgICAjCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZW1wbGF0ZSBMaXN0J30gPSAn2YHZh9ix2LPYqiDZgtin2YTYqOKAjNmH2KcnOwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mcl9JbXBvcnRFeHBvcnQucG0gLSB0cmFuc2xhdGlvbiBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTQgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpmcl9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFJbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBtYXBwaW5nIHRlbXBsYXRlJ30gPSAnQWpvdXRlciB1biB0ZW1wbGF0ZSBkZSBtYXBwYWdlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYXJzZXQnfSA9ICdKZXUgZGUgY2FyYWN0w6hyZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb24gKDopJ30gPSAnRGV1eCBwb2ludHMgKDopJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbid9ID0gJ0NvbG9ubmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uIFNlcGFyYXRvcid9ID0gJ1PDqXBhcmF0ZXVyIGRlIGNvbG9ubmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG90ICguKSd9ID0gJ1BvaW50ICguKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZW1pY29sb24gKDspJ30gPSAnUG9pbnQgdmlyZ3VsZSAoOyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGFidWxhdG9yIChUQUIpJ30gPSAnVGFidWxhdGlvbiAoVEFCKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNsdWRlIENvbHVtbiBIZWFkZXJzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBzdW1tYXJ5IGZvcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnRlZCByZWNvcmRzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cG9ydGVkIHJlY29yZHMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3Jkcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTa2lwcGVkJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkltcG9ydEV4cG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCBNYW5hZ2VtZW50J30gPSAnR2VzdGlvbiBkZSBsXCdJbXBvcnQvRXhwb3J0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIHRlbXBsYXRlIHRvIGltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgSW1wb3J0J30gPSAnRMOpbWFycmVyIEltcG9ydCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBFeHBvcnQnfSA9ICdEw6ltYXJyZXIgRXhwb3J0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlbGV0ZSBUZW1wbGF0ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwJ30gPSAnRXRhcGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSA9ICdFZGl0ZXIgbGVzIGluZm9ybWF0aW9ucyBjb21tdW5lcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOYW1lIGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPYmplY3QgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBvYmplY3QgaW5mb3JtYXRpb24nfSA9ICdFZGl0ZXIgbGVzIGluZm9ybWF0aW9ucyBkZSBsXCdvYmpldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ID0gJ0VkaXRlciBsZXMgaW5mb3JtYXRpb25zIGRlIGZvcm1hdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgbWFwcGluZyBpbmZvcm1hdGlvbid9ID0gJ0VkaXRlciBsZXMgaW5mb3JtYXRpb25zIGRlIG1hcHBhZ2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbWFwIGVsZW1lbnRzIGZvdW5kLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgTWFwcGluZyBFbGVtZW50J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgc2VhcmNoIGluZm9ybWF0aW9uJ30gPSAnRWRpdGVyIGxlcyBpbmZvcm1hdGlvbnMgZGUgcmVjaGVyY2hlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnUmVzdHJlaW5kcmUgbFwnZXhwb3J0IHBhciByZWNoZXJjaGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gPSAnSW5mb3JtYXRpb25zIGRcJ2ltcG9ydCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb3VyY2UgRmlsZSd9ID0gJ0ZpY2hpZXIgU291cmNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3MnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmFpbGVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1cGxpY2F0ZSBuYW1lcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IHByb2Nlc3NlZCBsaW5lIG51bWJlciBvZiBpbXBvcnQgZmlsZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPayd9ID0gJyc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQnfSA9ICdJbXBvcnRlci9FeHBvcnRlcic7CgogICAgIwogICAgIyBPQlNPTEVURSBFTlRSSUVTIEZPUiBSRUZFUkVOQ0UsIERPIE5PVCBUUkFOU0xBVEUhCiAgICAjCgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9pdF9JbXBvcnRFeHBvcnQucG0gLSB0cmFuc2xhdGlvbiBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTQgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjppdF9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFJbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBtYXBwaW5nIHRlbXBsYXRlJ30gPSAnQWdnaXVuZ2kgbWFwcGF0dXJhIG1vZGVsbG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhcnNldCd9ID0gJ0NoYXJzZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb24gKDopJ30gPSAnRHVlIHB1bnRpICg6KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4nfSA9ICdDb2xvbm5hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbiBTZXBhcmF0b3InfSA9ICdTZXBhcmF0b3JlIGRpIGNvbG9ubmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG90ICguKSd9ID0gJ1B1bnRvICguKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZW1pY29sb24gKDspJ30gPSAnUHVudG8gZSB2aXJnb2xhICg7KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUYWJ1bGF0b3IgKFRBQiknfSA9ICdUYWJ1bGF0b3JlIChUQUIpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2x1ZGUgQ29sdW1uIEhlYWRlcnMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IHN1bW1hcnkgZm9yJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydGVkIHJlY29yZHMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXhwb3J0ZWQgcmVjb3Jkcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvcmRzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NraXBwZWQnfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFkbWluSW1wb3J0RXhwb3J0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQvRXhwb3J0IE1hbmFnZW1lbnQnfSA9ICdHZXN0aW9uZSBJbXBvcnRhemlvbmUvRXNwb3J0YXppb25lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIHRlbXBsYXRlIHRvIGltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgSW1wb3J0J30gPSAnSW5pemlhcmUgSW1wb3J0YXppb25lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEV4cG9ydCd9ID0gJ0luaXppYXJlIEVzcG9ydGF6aW9uZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWxldGUgVGVtcGxhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCd9ID0gJ1Bhc3NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgY29tbW9uIGluZm9ybWF0aW9uJ30gPSAnTW9kaWZpY2EgaW5mb3JtYXppb25pIGNvbXVuaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOYW1lIGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPYmplY3QgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBvYmplY3QgaW5mb3JtYXRpb24nfSA9ICdNb2RpZmljYSBpbmZvcm1hemlvbmkgb2dnZXR0byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ID0gJ01vZGlmaWNhIGZvcm1hdG8gaW5mb3JtYXppb25lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uJ30gPSAnTW9kaWZpY2EgbWFwcGF0dXJhIGluZm9ybWF6aW9uaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBtYXAgZWxlbWVudHMgZm91bmQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBNYXBwaW5nIEVsZW1lbnQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSA9ICdNb2RpZmljYSBpbmZvcm1hemlvbmkgZGkgcmljZXJjYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXN0cmljdCBleHBvcnQgcGVyIHNlYXJjaCd9ID0gJ1Jlc3RyaW5nZXJlIGVzcG9ydGF6aW9uZSBwZXIgcmljZXJjYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSA9ICdJbXBvcnRhcmUgaW5mb3JtYXppb25lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvdXJjZSBGaWxlJ30gPSAnQXJjaGl2aW8gb3JpZ2luZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWNjZXNzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZhaWxlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdXBsaWNhdGUgbmFtZXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFzdCBwcm9jZXNzZWQgbGluZSBudW1iZXIgb2YgaW1wb3J0IGZpbGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2snfSA9ICcnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQvRXhwb3J0J30gPSAnSW1wb3J0YXJlL0VzcG9ydGFyZSc7CgogICAgIwogICAgIyBPQlNPTEVURSBFTlRSSUVTIEZPUiBSRUZFUkVOQ0UsIERPIE5PVCBUUkFOU0xBVEUhCiAgICAjCgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9qYV9JbXBvcnRFeHBvcnQucG0gLSB0cmFuc2xhdGlvbiBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTQgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpqYV9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFJbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBtYXBwaW5nIHRlbXBsYXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYXJzZXQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb24gKDopJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4gU2VwYXJhdG9yJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvdCAoLiknfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VtaWNvbG9uICg7KSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUYWJ1bGF0b3IgKFRBQiknfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jbHVkZSBDb2x1bW4gSGVhZGVycyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgc3VtbWFyeSBmb3InfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0ZWQgcmVjb3Jkcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBvcnRlZCByZWNvcmRzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY29yZHMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2tpcHBlZCd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSB0ZW1wbGF0ZSB0byBpbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEltcG9ydCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBFeHBvcnQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVsZXRlIFRlbXBsYXRlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZSBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2JqZWN0IGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgZm9ybWF0IGluZm9ybWF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG1hcCBlbGVtZW50cyBmb3VuZC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIE1hcHBpbmcgRWxlbWVudCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IHNlYXJjaCBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXN0cmljdCBleHBvcnQgcGVyIHNlYXJjaCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU291cmNlIEZpbGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VjY2Vzcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGYWlsZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVwbGljYXRlIG5hbWVzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgcHJvY2Vzc2VkIGxpbmUgbnVtYmVyIG9mIGltcG9ydCBmaWxlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09rJ30gPSAnJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGJhY2tlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGltcG9ydC9leHBvcnQgbW9kdWxlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCd9ID0gJyc7CgogICAgIwogICAgIyBPQlNPTEVURSBFTlRSSUVTIEZPUiBSRUZFUkVOQ0UsIERPIE5PVCBUUkFOU0xBVEUhCiAgICAjCgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9tc19JbXBvcnRFeHBvcnQucG0gLSB0cmFuc2xhdGlvbiBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTQgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjptc19JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFJbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBtYXBwaW5nIHRlbXBsYXRlJ30gPSAnVGFtYmFoIHRlbXBsYXQgcGV0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFyc2V0J30gPSAnU2V0IGthcmFrdGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9uICg6KSd9ID0gJ1RpdGlrIGJlcnRpbmRpaCAoOiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uJ30gPSAnS29sdW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uIFNlcGFyYXRvcid9ID0gJ0tvbHVtIHBlbWlzYWgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG90ICguKSd9ID0gJ1RpdGlrICguKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZW1pY29sb24gKDspJ30gPSAnU2VtaWtvbG9uICg7KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUYWJ1bGF0b3IgKFRBQiknfSA9ICdUYWJ1bGF0b3IgKFRBQiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jbHVkZSBDb2x1bW4gSGVhZGVycyd9ID0gJ1Rlcm1hc3VrIEtvbHVtIEtlcGFsYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgc3VtbWFyeSBmb3InfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0ZWQgcmVjb3Jkcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBvcnRlZCByZWNvcmRzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY29yZHMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2tpcHBlZCd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ID0gJ1Blbmd1cnVzYW4gSW1wb3J0L0Vrc3BvcnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgdGVtcGxhdGUgdG8gaW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJ0NpcHRhIHRlbXBsYXQgdW50dWsgaW1wb3J0IGRhbiBla3Nwb3J0IGluZm9ybWFzaSBvYmplay4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgSW1wb3J0J30gPSAnTXVsYSBpbXBvcnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgRXhwb3J0J30gPSAnTXVsYSBla3Nwb3J0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlbGV0ZSBUZW1wbGF0ZSd9ID0gJ1BhZGFtIHRlbXBsYXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCd9ID0gJ0xhbmdrYWgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSA9ICdBdWRpdCBpbmZvcm1hc2kgYmlhc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZSBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2JqZWN0IGlzIHJlcXVpcmVkISd9ID0gJ09iamVrIGFkYWxhaCBkaXBlcmx1a2FuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgaXMgcmVxdWlyZWQhJ30gPSAnRm9ybWF0IGFkYWxhaCBkaXBlcmx1a2FuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IG9iamVjdCBpbmZvcm1hdGlvbid9ID0gJ0F1ZGl0IGluZm9ybWFzaSBvYmplayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ID0gJ0F1ZGl0IGluZm9ybWFzaSBmb3JtYXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnIGlzIHJlcXVpcmVkISd9ID0gJyBhZGFsYWggZGlwZXJsdWthbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uJ30gPSAnQXVkaXQgaW5mb3JtYXNpIHBldGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbWFwIGVsZW1lbnRzIGZvdW5kLid9ID0gJ1RpYWRhIGVsZW1lbiBwZXRhIGRpdGVtdWkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBNYXBwaW5nIEVsZW1lbnQnfSA9ICdUYW1iYWggZWxlbWVuIHBldGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSA9ICdBdWRpdCBpbmZvcm1hc2kgY2FyaWFuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnRGlsYXJhbmcgZWtzcG9ydCBwZXIgY2FyaWFuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBpbmZvcm1hdGlvbid9ID0gJ0luZm9ybWFzaSBpbXBvcnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU291cmNlIEZpbGUnfSA9ICdTdW1iZXIgZmFpbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWNjZXNzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZhaWxlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdXBsaWNhdGUgbmFtZXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFzdCBwcm9jZXNzZWQgbGluZSBudW1iZXIgb2YgaW1wb3J0IGZpbGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2snfSA9ICcnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuJ30gPQogICAgICAgICdGb3JtYXQgYmFja2VuZCBtb2R1bCBwZW5kYWZ0YXJhbiB1bnR1ayBtb2R1bCBpbXBvcnQvZWtzcG9ydC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJ0luZm9ybWFzaSBvYmplayBpbXBvcnQgZGFuIGVrc3BvcnQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQnfSA9ICdJbXBvcnQvRWtzcG9ydCc7CgogICAgIwogICAgIyBPQlNPTEVURSBFTlRSSUVTIEZPUiBSRUZFUkVOQ0UsIERPIE5PVCBUUkFOU0xBVEUhCiAgICAjCgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9uYl9OT19JbXBvcnRFeHBvcnQucG0gLSB0cmFuc2xhdGlvbiBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTQgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpuYl9OT19JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFJbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBtYXBwaW5nIHRlbXBsYXRlJ30gPSAnTGVnZyB0aWwgbWFsIGZvciBtYXBwaW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYXJzZXQnfSA9ICdUZWduc2V0dCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvbiAoOiknfSA9ICdLb2xvbiAoOiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uJ30gPSAnS29sb25uZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4gU2VwYXJhdG9yJ30gPSAnS29sb25uZXNlcGFyYXRvcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb3QgKC4pJ30gPSAnUHVua3R1bSAoLiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VtaWNvbG9uICg7KSd9ID0gJ1NlbWlrb2xvbiAoOyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGFidWxhdG9yIChUQUIpJ30gPSAnVGFidWxhdG9yIChUQUIpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2x1ZGUgQ29sdW1uIEhlYWRlcnMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IHN1bW1hcnkgZm9yJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydGVkIHJlY29yZHMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXhwb3J0ZWQgcmVjb3Jkcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvcmRzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NraXBwZWQnfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFkbWluSW1wb3J0RXhwb3J0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQvRXhwb3J0IE1hbmFnZW1lbnQnfSA9ICdBZG1pbmlzdHJhc2pvbiBhdiBJbXBvcnQvRWtzcG9ydCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSB0ZW1wbGF0ZSB0byBpbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnT3BwcmV0dCBlbiBtYWwgZm9yIMOlIGVrc3BvcnRlcmUgb2cgaW1wb3J0ZXJlIGluZm9ybWFzam9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEltcG9ydCd9ID0gJ1N0YXJ0IGltcG9ydCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBFeHBvcnQnfSA9ICdTdGFydCBla3Nwb3J0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlbGV0ZSBUZW1wbGF0ZSd9ID0gJ1NsZXR0IG1hbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwJ30gPSAnU3RlZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbid9ID0gJ0VuZHJlIGZlbGxlc2luZm9ybWFzam9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05hbWUgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09iamVjdCBpcyByZXF1aXJlZCEnfSA9ICdPYmpla3QgZXIgcMOla3JldmQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBpcyByZXF1aXJlZCEnfSA9ICdGb3JtYXQgZXIgcMOla3JldmQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gPSAnRW5kcmUgb2JqZWt0ZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24nfSA9ICdFbmRyZSBmb3JtYXRldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycgaXMgcmVxdWlyZWQhJ30gPSAnIGVyIHDDpWtyZXZkISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24nfSA9ICdFbmRyZSBtYXBwaW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG1hcCBlbGVtZW50cyBmb3VuZC4nfSA9ICdJbmdlbiBlbGVtZW50ZXIgZnVubmV0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgTWFwcGluZyBFbGVtZW50J30gPSAnTGVnZyB0aWwgbWFwcGluZy1lbGVtZW50JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgc2VhcmNoIGluZm9ybWF0aW9uJ30gPSAnRW5kcmUgc8O4ayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXN0cmljdCBleHBvcnQgcGVyIHNlYXJjaCd9ID0gJ0JlZ3JlbnMgZWtzcG9ydCBwZXIgc8O4ayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSA9ICdJbXBvcnQtaW5mb3JtYXNqb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU291cmNlIEZpbGUnfSA9ICdLaWxkZWZpbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWNjZXNzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZhaWxlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdXBsaWNhdGUgbmFtZXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFzdCBwcm9jZXNzZWQgbGluZSBudW1iZXIgb2YgaW1wb3J0IGZpbGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2snfSA9ICcnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuJ30gPQogICAgICAgICdCYWtzaWRlbW9kdWwtcmVnaXN0cmVyaW5nIGZvciBmb3JtYXRldCB0aWwgaW1wb3J0L2Vrc3BvcnQtbW9kdWxlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnSW5mb3JtYXNqb24gZm9yIGltcG9ydC0gb2cgZWtzcG9ydC1vYmpla3QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCd9ID0gJ0ltcG9ydC9Fa3Nwb3J0JzsKCiAgICAjCiAgICAjIE9CU09MRVRFIEVOVFJJRVMgRk9SIFJFRkVSRU5DRSwgRE8gTk9UIFRSQU5TTEFURSEKICAgICMKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbiBTZXBlcmF0b3InfSA9ICdLb2xvbm5lIGFkc2tpbGxlbHNlJzsKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ubF9JbXBvcnRFeHBvcnQucG0gLSB0cmFuc2xhdGlvbiBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTQgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpubF9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFJbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBtYXBwaW5nIHRlbXBsYXRlJ30gPSAnTWFwcGluZ3RlbXBsYXRlIHRvZXZvZWdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFyc2V0J30gPSAnS2FyYWt0ZXJzZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb24gKDopJ30gPSAnRHViYmVsZSBwdW50ICg6KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4nfSA9ICdLb2xvbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4gU2VwYXJhdG9yJ30gPSAnS29sb21zY2hlaWRpbmdzdGVrZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG90ICguKSd9ID0gJ1B1bnQgKC4pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbWljb2xvbiAoOyknfSA9ICdQdW50a29tbWEgKDspJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RhYnVsYXRvciAoVEFCKSd9ID0gJ1RhYic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNsdWRlIENvbHVtbiBIZWFkZXJzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBzdW1tYXJ5IGZvcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnRlZCByZWNvcmRzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cG9ydGVkIHJlY29yZHMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3Jkcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTa2lwcGVkJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkltcG9ydEV4cG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCBNYW5hZ2VtZW50J30gPSAnSW1wb3J0L0V4cG9ydCBiZWhlZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgdGVtcGxhdGUgdG8gaW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBJbXBvcnQnfSA9ICdJbXBvcnQgc3RhcnRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBFeHBvcnQnfSA9ICdFeHBvcnQgc3RhcnRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWxldGUgVGVtcGxhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCd9ID0gJ1N0YXAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSA9ICdBbGdlbWVuZSBpbmZvcm1hdGllIGJld2Vya2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05hbWUgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09iamVjdCBpcyByZXF1aXJlZCEnfSA9ICdPYmplY3QgaXMgdmVycGxpY2h0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgaXMgcmVxdWlyZWQhJ30gPSAnRm9ybWFhdCBpcyB2ZXJwbGljaHQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gPSAnT2JqZWN0LWluZm9ybWF0aWUgYmV3ZXJrZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24nfSA9ICdGb3JtYXQtaW5mb3JtYXRpb25lbiBiZXdlcmtlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgbWFwcGluZyBpbmZvcm1hdGlvbid9ID0gJ01hcHBpbmctaW5mb3JtYXRpZSBiZXdlcmtlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBtYXAgZWxlbWVudHMgZm91bmQuJ30gPSAnR2VlbiBlbGVtZW50ZW4gZ2V2b25kZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBNYXBwaW5nIEVsZW1lbnQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSA9ICdab2VrLWluZm9ybWF0aWUgYmV3ZXJrZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzdHJpY3QgZXhwb3J0IHBlciBzZWFyY2gnfSA9ICdCZXBlcmsgZXhwb3J0IHRvdCB6b2Vrb3BkcmFjaHQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gPSAnSW1wb3J0LWluZm9ybWF0aWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU291cmNlIEZpbGUnfSA9ICdCcm9uYmVzdGFuZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWNjZXNzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZhaWxlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdXBsaWNhdGUgbmFtZXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFzdCBwcm9jZXNzZWQgbGluZSBudW1iZXIgb2YgaW1wb3J0IGZpbGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2snfSA9ICcnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJ0ltcG9ydCBlbiBleHBvcnQgb2JqZWN0aW5mb3JtYXRpZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQvRXhwb3J0J30gPSAnSW1wb3J0L0V4cG9ydCc7CgogICAgIwogICAgIyBPQlNPTEVURSBFTlRSSUVTIEZPUiBSRUZFUkVOQ0UsIERPIE5PVCBUUkFOU0xBVEUhCiAgICAjCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGFzcyBpcyByZXF1aXJlZCEnfSA9ICdLbGFzc2UgaXMgdmVycGxpY2h0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4gU2VwYXJhdG9yIGlzIHJlcXVpcmVkISd9ID0gJ1NjaGVpZGluZ3N0ZWtlbiBpcyB2ZXJwbGljaHQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgdGVtcGxhdGUgaW4gb3JkZXIgdG8gY2FuIGltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9CiAgICAgICAgJ01hYWsgZWVuIHRlbXBsYXRlIGFhbiBvbSBvYmplY3RlbiB0ZSBpbXBvcnRlcmVuIG9mIGV4cG9ydGVyZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VtcHR5IGZpZWxkcyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlcyBhcmUga2VwdCd9ID0gJ0JpaiBsZWdlIHZlbGRlbiB3b3JkdCBkZSBodWlkaWdlIHdhYXJkZSBiZWhvdWRlbic7Cgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wbF9JbXBvcnRFeHBvcnQucG0gLSB0cmFuc2xhdGlvbiBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTQgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpwbF9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFJbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBtYXBwaW5nIHRlbXBsYXRlJ30gPSAnRG9kYWogc3phYmxvbiBtYXBvd2FuaWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhcnNldCd9ID0gJ0tvZG93YW5pZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvbiAoOiknfSA9ICdEd3Vrcm9wZWsgKDopJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbid9ID0gJ0tvbHVtbmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uIFNlcGFyYXRvcid9ID0gJ1NlcGFyYXRvciBrb2x1bW55JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvdCAoLiknfSA9ICdLcm9wa2EgKC4pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbWljb2xvbiAoOyknfSA9ICfFmnJlZG5payAoOyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGFidWxhdG9yIChUQUIpJ30gPSAnVGFidWxhdG9yIChUQUIpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2x1ZGUgQ29sdW1uIEhlYWRlcnMnfSA9ICdVbWllxZvEhyBuYWfFgsOzd2tpIGtvbHVtbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgc3VtbWFyeSBmb3InfSA9ICdQb2RzdW1vd2FuaWUgaW1wb3J0dSBkbGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0ZWQgcmVjb3Jkcyd9ID0gJ1phaW1wb3J0b3dhbmUgcmVrb3JkeSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBvcnRlZCByZWNvcmRzJ30gPSAnV3lla3Nwb3J0b3dhbmUgcmVrb3JkeSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvcmRzJ30gPSAnUmVrb3JkeSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTa2lwcGVkJ30gPSAnUG9taW5pxJl0ZSc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ID0gJ1phcnrEhWR6YW5pZSBJbXBvcnRlbS9FeHBvcnRlbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSB0ZW1wbGF0ZSB0byBpbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnVXR3w7NyeiBzemFibG9uIGRvIGltcG9ydHUgaSBla3Nwb3J0dSBkYW55Y2ggb2JpZWt0w7N3Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBJbXBvcnQnfSA9ICdSb3pwb2N6bmlqIGltcG9ydCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBFeHBvcnQnfSA9ICdSb3pwb2N6bmlqIGVrc3BvcnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVsZXRlIFRlbXBsYXRlJ30gPSAnVXN1xYQgc3phYmxvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwJ30gPSAnS3Jvayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbid9ID0gJ0VkeXR1aiBpbmZvcm1hY2plIHdzcMOzbG5lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05hbWUgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09iamVjdCBpcyByZXF1aXJlZCEnfSA9ICdPYmlla3QgamVzdCB3eW1hZ2FueSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGlzIHJlcXVpcmVkISd9ID0gJ0Zvcm1hdCBqZXN0IHd5bWFnYW55ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IG9iamVjdCBpbmZvcm1hdGlvbid9ID0gJ0VkeXR1aiBpbmZvcm1hY2plIG9iaWVrdHUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24nfSA9ICdFZHl0dWogZm9ybWF0IG9iaWVrdHUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnIGlzIHJlcXVpcmVkISd9ID0gJyBqZXN0IHd5bWFnYW5lISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24nfSA9ICdFZHl0dWogaW5mb3JtYWNqZSBtYXBvd2FuaWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbWFwIGVsZW1lbnRzIGZvdW5kLid9ID0gJ05pZSB6bmFsZXppb25vIGVsZW1lbnTDs3cgbWFweS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIE1hcHBpbmcgRWxlbWVudCd9ID0gJ0RvZGFqIGVsZW1lbnQgbWFwb3dhbmlhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgc2VhcmNoIGluZm9ybWF0aW9uJ30gPSAnRWR5dHVqIGluZm9ybWFjamUgd3lzenVraXdhbmlhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnT2dyYW5pY3ogZWtzcG9ydCBwcnpleiB3eXN6dWthbmllJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBpbmZvcm1hdGlvbid9ID0gJ0ltcG9ydHVqIGluZm9ybWFjamUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU291cmNlIEZpbGUnfSA9ICdQbGlrIMW6csOzZMWCb3d5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3MnfSA9ICdQb3dvZHplbmllJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZhaWxlZCd9ID0gJ05pZXBvd29kemVuaWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVwbGljYXRlIG5hbWVzJ30gPSAnRHVwbGlrYXR5IG5hencnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFzdCBwcm9jZXNzZWQgbGluZSBudW1iZXIgb2YgaW1wb3J0IGZpbGUnfSA9ICdOciBvc3RhbmllaiBwcnpldHdvcnpvbmVqIGxpbmlpIHBsaWt1IGltcG9ydG93ZWdvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09rJ30gPSAnT2snOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuJ30gPQogICAgICAgICdNb2R1xYIgZm9ybWF0b3dhbmlhIGJhY2tlbmQgZGxhIG1vZHXFgnUgaW1wb3J0L2Vrc3BvcnQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICdJbXBvcnR1aiBpIGVrc3BvcnR1aiBpbmZvcm1hY2plIG9iaWVrdMOzdy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCd9ID0gJ0ltcG9ydC9la3Nwb3J0JzsKCiAgICAjCiAgICAjIE9CU09MRVRFIEVOVFJJRVMgRk9SIFJFRkVSRU5DRSwgRE8gTk9UIFRSQU5TTEFURSEKICAgICMKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsYXNzJ30gPSAnS2xhc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlnIEl0ZW0nfSA9ICdDSSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbGVtZW50IHJlcXVpcmVkLCBwbGVhc2UgaW5zZXJ0IGRhdGEnfSA9ICdFbGVtZW50IHd5bWFnYW55LCBwb2RhaiB3YXJ0b8WbxIcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW1wdHkgZmllbGRzIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWVzIGFyZSBrZXB0J30gPSAnUHVzdGUgcG9sYSBvem5hY3phasSFIHphY2hvd2FuaWUgYmllxbzEhWNlaiB3YXJ0b8WbY2knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWF4aW11bSBudW1iZXIgb2Ygb25lIGVsZW1lbnQnfSA9ICdNYWtzeW1hbG5hIGxpY3piYSB3eXN0xIVwaWXFhCBwb2plZHluY3plZ28gZWxlbWVudHUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVtcGxhdGUgTGlzdCd9ID0gJ0xpc3RhIHN6YWJsb27Ds3cnOwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wdF9CUl9JbXBvcnRFeHBvcnQucG0gLSB0cmFuc2xhdGlvbiBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTQgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpwdF9CUl9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFJbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBtYXBwaW5nIHRlbXBsYXRlJ30gPSAnQWRpY2lvbmFyIG1vZGVsbyBkZSBtYXBlYW1lbnRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYXJzZXQnfSA9ICdDb2RpZmljYcOnw6NvIGRlIENhcmFjdGVyZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb24gKDopJ30gPSAnRG9pcyBQb250b3MgKDopJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbid9ID0gJ0NvbHVuYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4gU2VwYXJhdG9yJ30gPSAnU2VwYXJhZG9yIGRlIENvbHVuYXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG90ICguKSd9ID0gJ1BvbnRvICguKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZW1pY29sb24gKDspJ30gPSAnUG9udG8gZSBWw61yZ3VsYSAoOyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGFidWxhdG9yIChUQUIpJ30gPSAnVGFidWxhw6fDo28gKFRBQiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jbHVkZSBDb2x1bW4gSGVhZGVycyd9ID0gJ0luY2x1aXIgQ2FiZcOnYWxob3MgZGUgQ29sdW5hcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgc3VtbWFyeSBmb3InfSA9ICdSZXN1bW8gZGUgaW1wb3J0YcOnw6NvIHBhcmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0ZWQgcmVjb3Jkcyd9ID0gJ1JlZ2lzdHJvcyBpbXBvcnRhZG9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cG9ydGVkIHJlY29yZHMnfSA9ICdSZWdpc3Ryb3MgZXhwb3J0YWRvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvcmRzJ30gPSAnUmVnaXN0cm9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NraXBwZWQnfSA9ICdEZXNjb25zaWRlcmFkb3MnOwoKICAgICMgVGVtcGxhdGU6IEFkbWluSW1wb3J0RXhwb3J0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQvRXhwb3J0IE1hbmFnZW1lbnQnfSA9ICdHZXJlbmNpYW1lbnRvIGRlIEltcG9ydGHDp8Ojby9FeHBvcnRhw6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgdGVtcGxhdGUgdG8gaW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJ0NyaWFyIHVtIG1vZGVsbyBwYXJhIGltcG9ydGFyIGUgZXhwb3J0YXIgaW5mb3JtYcOnw7VlcyBkZSBvYmpldG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEltcG9ydCd9ID0gJ0luaWNpYXIgSW1wb3J0YcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEV4cG9ydCd9ID0gJ0luaWNpYXIgRXhwb3J0YcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlbGV0ZSBUZW1wbGF0ZSd9ID0gJ0V4Y2x1aXIgTW9kZWxvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAnfSA9ICdQYXNzbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbid9ID0gJ0VkaXRhciBpbmZvcm1hw6fDtWVzIGNvbXVucyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOYW1lIGlzIHJlcXVpcmVkISd9ID0gJ05vbWUgw6kgb2JyaWdhdMOzcmlvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPYmplY3QgaXMgcmVxdWlyZWQhJ30gPSAnT2JqZXRvIMOpIG9icmlnYXTDs3JpbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGlzIHJlcXVpcmVkISd9ID0gJ08gZm9ybWF0byDDqSBvYnJpZ2F0w7NyaW8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gPSAnRWRpdGFyIGluZm9ybWHDp8O1ZXMgZG8gb2JqZXRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgZm9ybWF0IGluZm9ybWF0aW9uJ30gPSAnRWRpdGFyIGluZm9ybWHDp8O1ZXMgZG8gZm9ybWF0byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycgaXMgcmVxdWlyZWQhJ30gPSAnIMOpIG9icmlnYXTDs3JpbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uJ30gPSAnRWRpdGFyIGluZm9ybWHDp8O1ZXMgZG8gbWFwZWFtZW50byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBtYXAgZWxlbWVudHMgZm91bmQuJ30gPSAnTsOjbyBow6EgZWxlbWVudG9zIG1hcGEgZW5jb250cmFkby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIE1hcHBpbmcgRWxlbWVudCd9ID0gJ0FkaWNpb25hciBlbGVtZW50byBkZSBtYXBlYW1lbnRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgc2VhcmNoIGluZm9ybWF0aW9uJ30gPSAnRWRpdGFyIGluZm9ybWHDp8O1ZXMgZGUgcGVzcXVpc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzdHJpY3QgZXhwb3J0IHBlciBzZWFyY2gnfSA9ICdSZXN0cmluZ2lyIGV4cG9ydGHDp8OjbyBwb3IgcGVzcXVpc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gPSAnSW5mb3JtYcOnw7VlcyBkZSBpbXBvcnRhw6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU291cmNlIEZpbGUnfSA9ICdBcnF1aXZvIGRlIE9yaWdlbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWNjZXNzJ30gPSAnU3VjZXNzbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGYWlsZWQnfSA9ICdGYWxob3UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVwbGljYXRlIG5hbWVzJ30gPSAnTm9tZXMgZHVwbGljYWRvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IHByb2Nlc3NlZCBsaW5lIG51bWJlciBvZiBpbXBvcnQgZmlsZSd9ID0gJ8OabHRpbW8gbsO6bWVybyBkZSBsaW5oYSBwcm9jZXNzYWRhIGRvIGFycXVpdm8gZGUgaW1wb3JhdGHDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPayd9ID0gJyc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9CiAgICAgICAgJ0Zvcm1hdG8gZGUgcmVnaXN0cm8gYmFja2VuZCBkbyBtw7NkdWxvIGRlIGltcG9ydGHDp8OjbyAvIGV4cG9ydGHDp8OjbyBtw7NkdWxvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnSW1wb3J0YXIgZSBleHBvcnRhciBpbmZvcm1hw6fDtWVzIGRlIG9iamV0by4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCd9ID0gJ0ltcG9ydGHDp8Ojby9FeHBvcnRhw6fDo28nOwoKICAgICMKICAgICMgT0JTT0xFVEUgRU5UUklFUyBGT1IgUkVGRVJFTkNFLCBETyBOT1QgVFJBTlNMQVRFIQogICAgIwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wdF9QVF9JbXBvcnRFeHBvcnQucG0gLSB0cmFuc2xhdGlvbiBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTQgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIENvcHlyaWdodCAoQykgMjAxMiBGQ0NOIC0gUnVpIEZyYW5jaXNjbyA8cnVpLmZyYW5jaXNjb0BmY2NuLnB0PgojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpwdF9QVF9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFJbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBtYXBwaW5nIHRlbXBsYXRlJ30gPSAnQWRpY2lvbmFyIG1vZGVsbyBkZSBtYXBlYW1lbnRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYXJzZXQnfSA9ICdDb2RpZmljYcOnw6NvIGRlIENhcmFjdGVyZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb24gKDopJ30gPSAnRG9pcyBQb250b3MgKDopJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbid9ID0gJ0NvbHVuYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4gU2VwYXJhdG9yJ30gPSAnU2VwYXJhZG9yIGRlIENvbHVuYXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG90ICguKSd9ID0gJ1BvbnRvICguKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZW1pY29sb24gKDspJ30gPSAnUG9udG8gZSBWw61yZ3VsYSAoOyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGFidWxhdG9yIChUQUIpJ30gPSAnVGFidWxhw6fDo28gKFRBQiknOwoKICAgICMgVGVtcGxhdGU6IEFkbWluSW1wb3J0RXhwb3J0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQvRXhwb3J0IE1hbmFnZW1lbnQnfSA9ICdHZXN0w6NvIGRlIEltcG9ydGHDp8Ojby9FeHBvcnRhw6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIHRlbXBsYXRlJ30gPSAnQWRpY2lvbmFyIG1vZGVsbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSB0ZW1wbGF0ZSB0byBpbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnQ3JpYXIgdW0gbW9kZWxvIHBhcmEgaW1wb3J0YXIgZSBleHBvcnRhciBpbmZvcm1hw6fDtWVzIGRlIG9iamV0by4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgSW1wb3J0J30gPSAnSW5pY2lhciBJbXBvcnRhw6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgRXhwb3J0J30gPSAnSW5pY2lhciBFeHBvcnRhw6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVsZXRlIFRlbXBsYXRlJ30gPSAnQXBhZ2FyIE1vZGVsbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwJ30gPSAnUGFzc28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSA9ICdFZGl0YXIgaW5mb3JtYcOnw7VlcyBjb211bnMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2JqZWN0IGlzIHJlcXVpcmVkISd9ID0gJ09iamV0byDDqSBuZWNlc3PDoXJpbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGlzIHJlcXVpcmVkISd9ID0gJ08gZm9ybWF0byDDqSBuZWNlc3PDoXJpbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBvYmplY3QgaW5mb3JtYXRpb24nfSA9ICdFZGl0YXIgaW5mb3JtYcOnw7VlcyBkbyBvYmpldG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24nfSA9ICdFZGl0YXIgaW5mb3JtYcOnw7VlcyBkbyBmb3JtYXRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyBpcyByZXF1aXJlZCEnfSA9ICcgw6kgbmVjZXNzw6FyaW8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgbWFwcGluZyBpbmZvcm1hdGlvbid9ID0gJ0VkaXRhciBpbmZvcm1hw6fDtWVzIGRvIG1hcGVhbWVudG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbWFwIGVsZW1lbnRzIGZvdW5kLid9ID0gJ07Do28gZm9yYW0gZW5jb250cmFkb3MgZWxlbWVudG9zIG1hcGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBNYXBwaW5nIEVsZW1lbnQnfSA9ICdBZGljaW9uYXIgZWxlbWVudG8gZGUgbWFwZWFtZW50byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IHNlYXJjaCBpbmZvcm1hdGlvbid9ID0gJ0VkaXRhciBpbmZvcm1hw6fDtWVzIGRlIHBlc3F1aXNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnUmVzdHJpbmdpciBleHBvcnRhw6fDo28gcG9yIHBlc3F1aXNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBpbmZvcm1hdGlvbid9ID0gJ0luZm9ybWHDp8O1ZXMgZGUgaW1wb3J0YcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvdXJjZSBGaWxlJ30gPSAnRmljaGVpcm8gZm9udGUnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuJ30gPSAnRm9ybWF0byBkZSByZWdpc3RybyBiYWNrZW5kIGRvIG3Ds2R1bG8gZGUgaW1wb3J0YcOnw6NvIC8gZXhwb3J0YcOnw6NvIG3Ds2R1bG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICdJbXBvcnRhciBlIGV4cG9ydGFyIGluZm9ybWHDp8O1ZXMgZGUgb2JqZXRvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQvRXhwb3J0J30gPSAnSW1wb3J0YcOnw6NvL0V4cG9ydGHDp8Ojbyc7CgogICAgIwogICAgIyBPQlNPTEVURSBFTlRSSUVTIEZPUiBSRUZFUkVOQ0UsIERPIE5PVCBUUkFOU0xBVEUhCiAgICAjCgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ydV9JbXBvcnRFeHBvcnQucG0gLSB0cmFuc2xhdGlvbiBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTQgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIENvcHlyaWdodCAoQykgMjAxMyBZdXJpeSBLb2xlc25pa292IDx5bmtvbGVzbmlrb3YgYXQgZ21haWwuY29tPgojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpydV9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFJbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBtYXBwaW5nIHRlbXBsYXRlJ30gPSAn0JTQvtCx0LDQstC70LXQvdC40LUg0YjQsNCx0LvQvtC90LAg0YHQvtC+0YLQstC10YLRgdGC0LLQuNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYXJzZXQnfSA9ICfQmtC+0LTQuNGA0L7QstC60LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb24gKDopJ30gPSAn0JTQstC+0LXRgtC+0YfQuNC1ICg6KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4nfSA9ICfQodGC0L7Qu9Cx0LXRhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4gU2VwYXJhdG9yJ30gPSAn0KDQsNC30LTQtdC70LjRgtC10LvRjCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb3QgKC4pJ30gPSAn0KLQvtGH0LrQsCAoLiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VtaWNvbG9uICg7KSd9ID0gJ9Ci0L7Rh9C60LAg0YEg0LfQsNC/0Y/RgtC+0LkgKDspJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RhYnVsYXRvciAoVEFCKSd9ID0gJ9Ci0LDQsdGD0LvRj9GG0LjRjyAoVEFCKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNsdWRlIENvbHVtbiBIZWFkZXJzJ30gPSAn0JLQutC70Y7Rh9C40YLRjCDQt9Cw0LPQvtC70L7QstC60Lgg0YHRgtC+0LvQsdGG0L7Qsic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgc3VtbWFyeSBmb3InfSA9ICfQntGC0YfQtdGCINC+0LEg0LjQvNC/0L7RgNGC0LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0ZWQgcmVjb3Jkcyd9ID0gJ9CY0LzQv9C+0YDRgtC40YDQvtCy0LDQvdC+INC30LDQv9C40YHQtdC5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cG9ydGVkIHJlY29yZHMnfSA9ICfQrdC60YHQv9C+0YDRgtC40YDQvtCy0LDQvdC+INC30LDQv9C40YHQtdC5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY29yZHMnfSA9ICfQl9Cw0L/QuNGB0LXQuSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTa2lwcGVkJ30gPSAn0J/RgNC+0L/Rg9GJ0LXQvdC+JzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkltcG9ydEV4cG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCBNYW5hZ2VtZW50J30gPSAn0KPQv9GA0LDQstC70LXQvdC40LUg0JjQvNC/0L7RgNGC0L7QvC/QrdC60YHQv9C+0YDRgtC+0LwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgdGVtcGxhdGUgdG8gaW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJ9Ch0L7Qt9C00LDQudGC0LUg0YjQsNCx0LvQvtC9INC00LvRjyDQuNC80L/QvtGA0YLQsCDQuCDRjdC60YHQv9C+0YDRgtCwINC40L3RhNC+0YDQvNCw0YbQuNC4INC+0LHRitC10LrRgtC+0LInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgSW1wb3J0J30gPSAn0J3QsNGH0LDRgtGMINC40LzQv9C+0YDRgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBFeHBvcnQnfSA9ICfQndCw0YfQsNGC0Ywg0Y3QutGB0L/QvtGA0YInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVsZXRlIFRlbXBsYXRlJ30gPSAn0KPQtNCw0LvQuNGC0Ywg0YjQsNCx0LvQvtC9JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAnfSA9ICfQqNCw0LMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSA9ICfQoNC10LTQsNC60YLQuNGA0L7QstCw0YLRjCDQvtCx0YnRg9GOINC40L3RhNC+0YDQvNCw0YbQuNGOJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09iamVjdCBpcyByZXF1aXJlZCEnfSA9ICfQntCx0YrQtdC60YIg0L7QsdGP0LfQsNGC0LXQu9C10L0hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBpcyByZXF1aXJlZCEnfSA9ICfQpNC+0YDQvNCw0YIg0L7QsdGP0LfQsNGC0LXQu9C10L0hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gPSAn0KDQtdC00LDQutGC0LjRgNC+0LLQsNGC0Ywg0LjQvdGE0L7RgNC80LDRhtC40Y4g0L7QsSDQvtCx0YrQtdC60YLQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ID0gJ9Cg0LXQtNCw0LrRgtC40YDQvtCy0LDRgtGMINGE0L7RgNC80LDRgiDQtNCw0L3QvdGL0YUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnIGlzIHJlcXVpcmVkISd9ID0gJ9C+0LHRj9C30LDRgtC10LvQtdC9ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24nfSA9ICfQoNC10LTQsNC60YLQuNGA0L7QstCw0YLRjCDQuNC90YTQvtGA0LzQsNGG0LjRjiDRgdC+0L7RgtCy0LXRgtGB0YLQstC40Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbWFwIGVsZW1lbnRzIGZvdW5kLid9ID0gJ9Cd0LXRgiDRjdC70LXQvNC10L3RgtC+0LIg0YHQvtC/0L7RgdGC0LDQstC70LXQvdC40Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIE1hcHBpbmcgRWxlbWVudCd9ID0gJ9CU0L7QsdCw0LLRjNGC0LUg0Y3Qu9C10LzQtdC90YIg0YHQvtC/0L7RgdGC0LDQstC70LXQvdC40Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSA9ICfQoNC10LTQsNC60YLQuNGA0L7QstCw0YLRjCDQv9C+0LjRgdC60L7QstGD0Y4g0LjQvdGE0L7RgNC80LDRhtC40Y4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzdHJpY3QgZXhwb3J0IHBlciBzZWFyY2gnfSA9ICfQntCz0YDQsNC90LjRh9C40YLRjCDRjdC60YHQv9C+0YDRgiDQv9C+0LjRgdC60L7QvCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSA9ICfQmNC90YTQvtGA0LzQsNGG0LjRjyDQuNC80L/QvtGA0YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb3VyY2UgRmlsZSd9ID0gJ9CY0YHRhdC+0LTQvdGL0Lkg0YTQsNC50LsnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VjY2Vzcyd9ID0gJ9Cj0YHQv9C10YjQvdC+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZhaWxlZCd9ID0gJ9Cd0LUg0YPQtNCw0LvQvtGB0Ywg0LLRi9C/0L7Qu9C90LjRgtGMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1cGxpY2F0ZSBuYW1lcyd9ID0gJ9CU0YPQsdC70LjRgNGD0Y7RidC40LUg0LjQvNC10L3QsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IHByb2Nlc3NlZCBsaW5lIG51bWJlciBvZiBpbXBvcnQgZmlsZSd9ID0gJ9Cd0L7QvNC10YAg0L/QvtGB0LvQtdC00L3QtdC5INC+0LHRgNCw0LHQvtGC0LDQvdC90L7QuSDRgdGC0YDQvtC60Lgg0LjQvNC/0L7RgNGC0LjRgNGD0LXQvNC+0LPQviDRhNCw0LnQu9CwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09rJ30gPSAnJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGJhY2tlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGltcG9ydC9leHBvcnQgbW9kdWxlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICfQmNC80L/QvtGA0YIg0Lgg0Y3QutGB0L/QvtGA0YIg0LjQvdGE0L7RgNC80LDRhtC40Lgg0L7QsSDQvtCx0YrQtdC60YLQsNGFJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQnfSA9ICfQmNC80L/QvtGA0YIv0K3QutGB0L/QvtGA0YInOwoKICAgICMKICAgICMgT0JTT0xFVEUgRU5UUklFUyBGT1IgUkVGRVJFTkNFLCBETyBOT1QgVFJBTlNMQVRFIQogICAgIwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS96aF9DTl9JbXBvcnRFeHBvcnQucG0gLSB0cmFuc2xhdGlvbiBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTQgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgQ29weXJpZ2h0IChDKSAyMDEzIE1pY2hhZWwgU2hpIDxtaWNzaGkgYXQgMTYzLmNvbT4KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6emhfQ05fSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSW1wb3J0RXhwb3J0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgbWFwcGluZyB0ZW1wbGF0ZSd9ID0gJ+WinuWKoOaYoOWwhOaooeeJiCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFyc2V0J30gPSAn5a2X56ym6ZuGJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9uICg6KSd9ID0gJ+WGkuWPtyAoOiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uJ30gPSAn5YiXJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbW1hICgsKSd9ID0gJ+mAl+WPtygsKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4gU2VwYXJhdG9yJ30gPSAn5YiX5YiG6ZqU56ymJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvdCAoLiknfSA9ICflj6Xlj7cgKC4pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbWljb2xvbiAoOyknfSA9ICfliIblj7cgKDspJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RhYnVsYXRvciAoVEFCKSd9ID0gJ+WItuihqOmUriAoVEFCKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNsdWRlIENvbHVtbiBIZWFkZXJzJ30gPSAn5YyF5ous5YiX5qCH6aKYJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBzdW1tYXJ5IGZvcid9ID0gJ+WvvOWFpeaAu+e7kyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnRlZCByZWNvcmRzJ30gPSAn5a+85YWl6K6w5b2VJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cG9ydGVkIHJlY29yZHMnfSA9ICflr7zlh7rorrDlvZUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3Jkcyd9ID0gJ+iusOW9lSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTa2lwcGVkJ30gPSAn6Lez6L+H55qEJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkltcG9ydEV4cG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCBNYW5hZ2VtZW50J30gPSAn5a+85YWlL+WvvOWHuueuoeeQhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSB0ZW1wbGF0ZSB0byBpbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAn5Yib5bu65qih5p2/5a+85YWl5ZKM5a+85Ye65a+56LGh5L+h5oGv44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEltcG9ydCd9ID0gJ+W8gOWni+WvvOWFpSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBFeHBvcnQnfSA9ICflvIDlp4vlr7zlh7onOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVsZXRlIFRlbXBsYXRlJ30gPSAn5Yig6Zmk5qih5p2/JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAnfSA9ICfmraXpqqQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSA9ICfnvJbovpHlhbHnlKjkv6Hmga8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIG5hbWUgaXMgcmVxdWlyZWQhJ30gPSAn5ZCN56ew5piv5b+F6ZyA55qE77yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09iamVjdCBpcyByZXF1aXJlZCEnfSA9ICflr7nosaHmmK/lv4XpnIDnmoTvvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGlzIHJlcXVpcmVkISd9ID0gJ+agvOW8j+aYr+W/hemcgOeahCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IG9iamVjdCBpbmZvcm1hdGlvbid9ID0gJ+e8lui+keWvueWDj+S/oeaBryc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ID0gJ+e8lui+keagvOW8j+S/oeaBryc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycgaXMgcmVxdWlyZWQhJ30gPSAn5piv5b+F6ZyA55qEISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24nfSA9ICfnvJbovpHmmKDlsITkv6Hmga8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbWFwIGVsZW1lbnRzIGZvdW5kLid9ID0gJ+ayoeacieaJvuWIsOaYoOWwhOeahOWtl+autSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgTWFwcGluZyBFbGVtZW50J30gPSAn5re75Yqg5pig5bCE5a2X5q61JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgc2VhcmNoIGluZm9ybWF0aW9uJ30gPSAn57yW6L6R5pCc57Si5L+h5oGvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAn6ZmQ5Yi25a+85Ye65q+P5Liq5pCc5a+7JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBpbmZvcm1hdGlvbid9ID0gJ+WvvOWFpeS/oeaBryc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb3VyY2UgRmlsZSd9ID0gJ+a6kOaWh+S7tic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWNjZXNzJ30gPSAn5oiQ5YqfJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZhaWxlZCd9ID0gJ+Wksei0pSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdXBsaWNhdGUgbmFtZXMnfSA9ICfph43lpI3nmoTlkI3np7AnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFzdCBwcm9jZXNzZWQgbGluZSBudW1iZXIgb2YgaW1wb3J0IGZpbGUnfSA9ICflr7zlhaXmlofku7bmnIDlkI7lpITnkIbnmoTooYzmlbAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2snfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVtcGxhdGUgTGlzdCd9ID0gJ+aooeadv+WIl+ihqCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbXB0eSBmaWVsZHMgaW5kaWNhdGUgdGhhdCB0aGUgY3VycmVudCB2YWx1ZXMgYXJlIGtlcHQnfSA9ICfnqbrlrZfmrrXooajnpLrkv53mjIHlvZPliY3nmoTlgLwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uIFNlcGFyYXRvciBpcyByZXF1aXJlZCEnfSA9ICflv4XpobvmjIflrprliJfliIbpmpTnrKYhJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGJhY2tlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGltcG9ydC9leHBvcnQgbW9kdWxlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICflr7zlhaXlkozlr7zlh7rlr7nosaHkv6Hmga8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCd9ID0gJ+WvvOWFpS/lr7zlh7onOwoKCiAgICAjCiAgICAjIE9CU09MRVRFIEVOVFJJRVMgRk9SIFJFRkVSRU5DRSwgRE8gTk9UIFRSQU5TTEFURSEKICAgICMKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS96aF9UV19JbXBvcnRFeHBvcnQucG0gLSB0cmFuc2xhdGlvbiBmaWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTQgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgQ29weXJpZ2h0IChDKSAyMDEzIE1pY2hhZWwgU2hpIDxtaWNzaGkgYXQgMTYzLmNvbT4KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6emhfVFdfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSW1wb3J0RXhwb3J0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgbWFwcGluZyB0ZW1wbGF0ZSd9ID0gJ+WinuWKoOaYoOWwhOaooeeJiCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFyc2V0J30gPSAn5a2X56ym6ZuGJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9uICg6KSd9ID0gJ+WGkuiZnyAoOiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uJ30gPSAn5YiXJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbW1hICgsKSd9ID0gJ+mAl+iZnygsKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4gU2VwYXJhdG9yJ30gPSAn5YiX5YiG6ZqU56ymJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvdCAoLiknfSA9ICflj6XomZ8gKC4pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbWljb2xvbiAoOyknfSA9ICfliIbomZ8gKDspJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RhYnVsYXRvciAoVEFCKSd9ID0gJ+WItuihqOmNtSAoVEFCKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNsdWRlIENvbHVtbiBIZWFkZXJzJ30gPSAn5YyF5ous5YiX5qiZ6aGMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBzdW1tYXJ5IGZvcid9ID0gJ+WwjuWFpee4vee1kCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnRlZCByZWNvcmRzJ30gPSAn5bCO5YWl57SA6YyEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cG9ydGVkIHJlY29yZHMnfSA9ICflsI7lh7rntIDpjIQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3Jkcyd9ID0gJ+e0gOmMhCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTa2lwcGVkJ30gPSAn6Lez6YGO55qEJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkltcG9ydEV4cG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCBNYW5hZ2VtZW50J30gPSAn5bCO5YWlL+WwjuWHuueuoeeQhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSB0ZW1wbGF0ZSB0byBpbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAn5Ym15bu65qih5p2/5bCO5YWl5ZKM5bCO5Ye65bCN6LGh5L+h5oGv44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEltcG9ydCd9ID0gJ+mWi+Wni+WwjuWFpSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBFeHBvcnQnfSA9ICfplovlp4vlsI7lh7onOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVsZXRlIFRlbXBsYXRlJ30gPSAn5Yig6Zmk5qih5p2/JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAnfSA9ICfmraXpqZ8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSA9ICfnt6jovK/lhbHnlKjkv6Hmga8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlIG5hbWUgaXMgcmVxdWlyZWQhJ30gPSAn5ZCN56ix5piv5b+F6ZyA55qE77yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09iamVjdCBpcyByZXF1aXJlZCEnfSA9ICflsI3osaHmmK/lv4XpnIDnmoTvvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGlzIHJlcXVpcmVkISd9ID0gJ+agvOW8j+aYr+W/hemcgOeahCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IG9iamVjdCBpbmZvcm1hdGlvbid9ID0gJ+e3qOi8r+WwjeixoeS/oeaBryc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ID0gJ+e3qOi8r+agvOW8j+S/oeaBryc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycgaXMgcmVxdWlyZWQhJ30gPSAn5piv5b+F6ZyA55qEISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24nfSA9ICfnt6jovK/mmKDlsITkv6Hmga8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbWFwIGVsZW1lbnRzIGZvdW5kLid9ID0gJ+aykuacieaJvuWIsOaYoOWwhOeahOWtl+autSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgTWFwcGluZyBFbGVtZW50J30gPSAn5re75Yqg5pig5bCE5a2X5q61JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgc2VhcmNoIGluZm9ybWF0aW9uJ30gPSAn57eo6Lyv5pCc57Si5L+h5oGvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAn6ZmQ5Yi25bCO5Ye65q+P5YCL5pCc5bCLJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBpbmZvcm1hdGlvbid9ID0gJ+WwjuWFpeS/oeaBryc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb3VyY2UgRmlsZSd9ID0gJ+a6kOaWh+S7tic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWNjZXNzJ30gPSAn5oiQ5YqfJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZhaWxlZCd9ID0gJ+WkseaVlyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdXBsaWNhdGUgbmFtZXMnfSA9ICfph43opIfnmoTlkI3nqLEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFzdCBwcm9jZXNzZWQgbGluZSBudW1iZXIgb2YgaW1wb3J0IGZpbGUnfSA9ICflsI7lhaXmlofku7bmnIDlvozomZXnkIbnmoTooYzmlbgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2snfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVtcGxhdGUgTGlzdCd9ID0gJ+aooeadv+WIl+ihqCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbXB0eSBmaWVsZHMgaW5kaWNhdGUgdGhhdCB0aGUgY3VycmVudCB2YWx1ZXMgYXJlIGtlcHQnfSA9ICfnqbrlrZfmrrXooajnpLrkv53mjIHnlbbliY3nmoTlgLwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uIFNlcGFyYXRvciBpcyByZXF1aXJlZCEnfSA9ICflv4XpobvmjIflrprliJfliIbpmpTnrKYhJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGJhY2tlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGltcG9ydC9leHBvcnQgbW9kdWxlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICflsI7lhaXlkozlsI7lh7rlsI3osaHkv6Hmga8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCd9ID0gJ+WwjuWFpS/lsI7lh7onOwoKCiAgICAjCiAgICAjIE9CU09MRVRFIEVOVFJJRVMgRk9SIFJFRkVSRU5DRSwgRE8gTk9UIFRSQU5TTEFURSEKICAgICMKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluSW1wb3J0RXhwb3J0LnBtIC0gYWRtaW4gZnJvbnRlbmQgb2YgaW1wb3J0IGV4cG9ydCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWRtaW5JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYWxpZDsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBQYXJhbU9iamVjdCBMb2dPYmplY3QgTGF5b3V0T2JqZWN0IEVuY29kZU9iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0LT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1ZhbGlkT2JqZWN0fSAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQtPm5ldyggJXskU2VsZn0gKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHRlbXBsYXRlIGVkaXQgKGNvbW1vbikKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdUZW1wbGF0ZUVkaXQxJyApIHsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGxpc3QKICAgICAgICBteSAkT2JqZWN0TGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+T2JqZWN0TGlzdCgpOwoKICAgICAgICBpZiAoICEkT2JqZWN0TGlzdCApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZvcm1hdCBsaXN0CiAgICAgICAgbXkgJEZvcm1hdExpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdExpc3QoKTsKCiAgICAgICAgaWYgKCAhJEZvcm1hdExpc3QgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJyApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBteSAkVGVtcGxhdGVEYXRhOwogICAgICAgIG15ICRUZW1wbGF0ZUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgbXkgJFNhdmVDb250aW51ZTsKICAgICAgICAkU2F2ZUNvbnRpbnVlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnU3VibWl0TmV4dCcgKTsKCiAgICAgICAgaWYgKCAhJFNhdmVDb250aW51ZSApIHsKCiAgICAgICAgICAgICMgaWYgbmVlZGVkIG5ldyBmb3JtCiAgICAgICAgICAgIGlmICggISRUZW1wbGF0ZUlEICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fTWFza1RlbXBsYXRlRWRpdDEoIE5ldyA9PiAxLCAlUGFyYW0gKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpZiB0aGVyZSBpcyB0ZW1wbGF0ZSBpZAogICAgICAgICAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICAgICAgICAgICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlR2V0KAogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdUZW1wbGF0ZSBub3QgZm91bmQhJyApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGlmIGVkaXQKICAgICAgICAgICAgaWYgKCAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPl9NYXNrVGVtcGxhdGVFZGl0MSggJVBhcmFtLCAleyRUZW1wbGF0ZURhdGF9ICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgfQoKICAgICAgICAjIGlmIHNhdmUgJiBjb250aW51ZQogICAgICAgIG15ICVTZXJ2ZXJFcnJvcjsKCiAgICAgICAgIyBnZXQgYWxsIGRhdGEgZm9yIHBhcmFtcyBhbmQgY2hlY2sgZm9yIGVycm9ycwogICAgICAgIGZvciBteSAkUGFyYW0gKHF3KENvbW1lbnQgT2JqZWN0IEZvcm1hdCBOYW1lIFZhbGlkSUQgVGVtcGxhdGVJRCkpIHsKICAgICAgICAgICAgJFRlbXBsYXRlRGF0YS0+eyRQYXJhbX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbSApIHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBpcyBhIG5ldyB0ZW1wbGF0ZT8KICAgICAgICBteSAkTmV3OwogICAgICAgIGlmICggISRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSApIHsKICAgICAgICAgICAgJE5ldyA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIG5lZWRlZCBmaWVsZHMKICAgICAgICAjIGZvciBuZXcgdGVtcGxhdGVzCiAgICAgICAgaWYgKCROZXcpIHsKCiAgICAgICAgICAgIGlmICggISRUZW1wbGF0ZURhdGEtPntPYmplY3R9ICkgewogICAgICAgICAgICAgICAgJFNlcnZlckVycm9ye09iamVjdH0gPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICEkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSApIHsKICAgICAgICAgICAgICAgICRTZXJ2ZXJFcnJvcntGb3JtYXR9ID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgICMgZm9yIGFsbCB0ZW1wbGF0ZXMKICAgICAgICBpZiAoICEkVGVtcGxhdGVEYXRhLT57TmFtZX0gKSB7CiAgICAgICAgICAgICRTZXJ2ZXJFcnJvcntOYW1lfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGlmIHNvbWUgZXJyb3IKICAgICAgICBpZiAoICRTZXJ2ZXJFcnJvcntGb3JtYXR9IHx8ICRTZXJ2ZXJFcnJvcntPYmplY3R9IHx8ICRTZXJ2ZXJFcnJvcntOYW1lfSApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fTWFza1RlbXBsYXRlRWRpdDEoCiAgICAgICAgICAgICAgICBTZXJ2ZXJFcnJvciA9PiBcJVNlcnZlckVycm9yLAogICAgICAgICAgICAgICAgTmV3ICAgICAgICAgPT4gJE5ldywKICAgICAgICAgICAgICAgICV7JFRlbXBsYXRlRGF0YX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNhdmUgdG8gZGF0YWJhc2UKICAgICAgICBteSAkU3VjY2VzczsKCiAgICAgICAgaWYgKCROZXcpIHsKICAgICAgICAgICAgJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUFkZCgKICAgICAgICAgICAgICAgICV7JFRlbXBsYXRlRGF0YX0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU3VjY2VzcyA9ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTdWNjZXNzID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZVVwZGF0ZSgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAleyRUZW1wbGF0ZURhdGF9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiQ2FuJ3QgaW5zZXJ0L3VwZGF0ZSB0ZW1wbGF0ZSEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PgogICAgICAgICAgICAgICAgIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn07U3ViYWN0aW9uPVRlbXBsYXRlRWRpdDI7VGVtcGxhdGVJRD0kVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0iLAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB0ZW1wbGF0ZSBlZGl0IChvYmplY3QpCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVGVtcGxhdGVFZGl0MicgKSB7CgogICAgICAgICMgZ2V0IG9iamVjdCBsaXN0CiAgICAgICAgbXkgJE9iamVjdExpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdExpc3QoKTsKCiAgICAgICAgaWYgKCAhJE9iamVjdExpc3QgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnTm8gb2JqZWN0IGJhY2tlbmQgZm91bmQhJyApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGdldCBmb3JtYXQgbGlzdAogICAgICAgIG15ICRGb3JtYXRMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXRMaXN0KCk7CgogICAgICAgIGlmICggISRGb3JtYXRMaXN0ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ05vIGZvcm1hdCBiYWNrZW5kIGZvdW5kIScgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdGVtcGxhdGUgaWQKICAgICAgICBteSAkVGVtcGxhdGVJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RlbXBsYXRlSUQnICk7CgogICAgICAgIGlmICggISRUZW1wbGF0ZUlEICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ05lZWRlZCBUZW1wbGF0ZUlEIScgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgbXkgJFN1Ym1pdE5leHQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdTdWJtaXROZXh0JyApOwoKICAgICAgICBpZiAoICEkU3VibWl0TmV4dCApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fTWFza1RlbXBsYXRlRWRpdDIoIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQgKTsKICAgICAgICB9CgogICAgICAgICMgc2F2ZSB0ZW1wbGF0ZSBzdGFydHMgaGVyZQoKICAgICAgICAjIGdldCBvYmplY3QgYXR0cmlidXRlcwogICAgICAgIG15ICRPYmplY3RBdHRyaWJ1dGVMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBteSAlQXR0cmlidXRlVmFsdWVzOwoKICAgICAgICBteSAkRXJyb3IgPSAwOwogICAgICAgIG15ICVTZXJ2ZXJFcnJvcjsKICAgICAgICBteSAlRGF0YVR5cGVFcnJvcjsKCiAgICAgICAgIyBnZXQgYXR0cmlidXRlIHZhbHVlcyBmcm9tIGZvcm0KICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyRPYmplY3RBdHRyaWJ1dGVMaXN0fSApIHsKCiAgICAgICAgICAgICMgZ2V0IGZvcm0gZGF0YQogICAgICAgICAgICAkQXR0cmlidXRlVmFsdWVzeyAkSXRlbS0+e0tleX0gfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SW1wb3J0RXhwb3J0Rm9ybURhdGFHZXQoCiAgICAgICAgICAgICAgICBJdGVtID0+ICRJdGVtLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyByZWxvYWQgZm9ybSBpZiB2YWx1ZSBpcyByZXF1aXJlZCBhbmQgaXMgbm90IHRoZXJlCiAgICAgICAgICAgIGlmICggJEl0ZW0tPntGb3JtfS0+e0ludmFsaWR9ICkgewogICAgICAgICAgICAgICAgJFNlcnZlckVycm9yeyAkSXRlbS0+e05hbWV9IH0gPSAxOwogICAgICAgICAgICAgICAgJEVycm9yID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkQXR0cmlidXRlVmFsdWVzeyAkSXRlbS0+e0tleX0gfSApIHsKCiAgICAgICAgICAgICAgICAjIGxvb2sgZm9yIHJlZ2V4cCBmb3IgZGF0YSB0eXBlIGFsbG93ZWQKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkSXRlbS0+e0lucHV0fS0+e1JlZ2V4fQogICAgICAgICAgICAgICAgICAgICYmCiAgICAgICAgICAgICAgICAgICAgISRBdHRyaWJ1dGVWYWx1ZXN7ICRJdGVtLT57S2V5fSB9ID1+ICRJdGVtLT57SW5wdXR9LT57UmVnZXh9CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICAkRGF0YVR5cGVFcnJvcnsgJEl0ZW0tPntOYW1lfSB9ID0gMTsKICAgICAgICAgICAgICAgICAgICAkRXJyb3IgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgIyByZWxvYWQgd2l0aCBzZXJ2ZXIgZXJyb3JzCiAgICAgICAgaWYgKCRFcnJvcikgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPl9NYXNrVGVtcGxhdGVFZGl0MigKICAgICAgICAgICAgICAgIFNlcnZlckVycm9yICAgICAgPT4gXCVTZXJ2ZXJFcnJvciwKICAgICAgICAgICAgICAgIERhdGFUeXBlRXJyb3IgICAgPT4gXCVEYXRhVHlwZUVycm9yLAogICAgICAgICAgICAgICAgVGVtcGxhdGVEYXRhRm9ybSA9PiBcJUF0dHJpYnV0ZVZhbHVlcywKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgICAgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNhdmUgdGhlIG9iamVjdCBkYXRhCiAgICAgICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3REYXRhU2F2ZSgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiBcJUF0dHJpYnV0ZVZhbHVlcywKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259O1N1YmFjdGlvbj1UZW1wbGF0ZUVkaXQzO1RlbXBsYXRlSUQ9JFRlbXBsYXRlSUQiLAogICAgICAgICk7CgogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVtcGxhdGUgZWRpdCAoZm9ybWF0KQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RlbXBsYXRlRWRpdDMnICkgewoKICAgICAgICAjIGdldCBvYmplY3QgbGlzdAogICAgICAgIG15ICRPYmplY3RMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3RMaXN0KCk7CgogICAgICAgIGlmICggISRPYmplY3RMaXN0ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ05vIG9iamVjdCBiYWNrZW5kIGZvdW5kIScgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZm9ybWF0IGxpc3QKICAgICAgICBteSAkRm9ybWF0TGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0TGlzdCgpOwoKICAgICAgICBpZiAoICEkRm9ybWF0TGlzdCApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdObyBmb3JtYXQgYmFja2VuZCBmb3VuZCEnICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGlkCiAgICAgICAgbXkgJFRlbXBsYXRlSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApOwoKICAgICAgICBpZiAoICEkVGVtcGxhdGVJRCApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdOZWVkZWQgVGVtcGxhdGVJRCEnICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIG15ICRTdWJtaXROZXh0ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnU3VibWl0TmV4dCcgKTsKCiAgICAgICAgaWYgKCAhJFN1Ym1pdE5leHQgKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+X01hc2tUZW1wbGF0ZUVkaXQzKCBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEICk7CiAgICAgICAgfQoKICAgICAgICAjIHNhdmUgc3RhcnRpbmcgaGVyZQoKICAgICAgICAjIGdldCBmb3JtYXQgYXR0cmlidXRlcwogICAgICAgIG15ICRGb3JtYXRBdHRyaWJ1dGVMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBmb3JtYXQgZGF0YQogICAgICAgIG15ICRGb3JtYXREYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXREYXRhR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBteSAkRXJyb3IgPSAwOwogICAgICAgIG15ICVTZXJ2ZXJFcnJvcjsKCiAgICAgICAgIyBnZXQgYXR0cmlidXRlIHZhbHVlcyBmcm9tIGZvcm0KICAgICAgICBteSAlQXR0cmlidXRlVmFsdWVzOwogICAgICAgIGZvciBteSAkSXRlbSAoIEB7JEZvcm1hdEF0dHJpYnV0ZUxpc3R9ICkgewoKICAgICAgICAgICAgIyBnZXQgZm9ybSBkYXRhCiAgICAgICAgICAgICRBdHRyaWJ1dGVWYWx1ZXN7ICRJdGVtLT57S2V5fSB9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JbXBvcnRFeHBvcnRGb3JtRGF0YUdldCgKICAgICAgICAgICAgICAgIEl0ZW0gPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlbG9hZCBmb3JtIGlmIHZhbHVlIGlzIHJlcXVpcmVkCiAgICAgICAgICAgIGlmICggJEl0ZW0tPntGb3JtfS0+e0ludmFsaWR9ICkgewogICAgICAgICAgICAgICAgJFNlcnZlckVycm9yeyAkSXRlbS0+e05hbWV9IH0gPSAxOwogICAgICAgICAgICAgICAgJEVycm9yID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyByZWxvYWQgd2l0aCBzZXJ2ZXIgZXJyb3JzCiAgICAgICAgaWYgKCRFcnJvcikgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPl9NYXNrVGVtcGxhdGVFZGl0MygKICAgICAgICAgICAgICAgIFNlcnZlckVycm9yID0+IFwlU2VydmVyRXJyb3IsCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2F2ZSB0aGUgZm9ybWF0IGRhdGEKICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdERhdGFTYXZlKAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBGb3JtYXREYXRhID0+IFwlQXR0cmlidXRlVmFsdWVzLAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn07U3ViYWN0aW9uPVRlbXBsYXRlRWRpdDQ7VGVtcGxhdGVJRD0kVGVtcGxhdGVJRCIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHRlbXBsYXRlIGVkaXQgKG1hcHBpbmcpCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVGVtcGxhdGVFZGl0NCcgKSB7CgogICAgICAgICMgZ2V0IG9iamVjdCBsaXN0CiAgICAgICAgbXkgJE9iamVjdExpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdExpc3QoKTsKCiAgICAgICAgaWYgKCAhJE9iamVjdExpc3QgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnTm8gb2JqZWN0IGJhY2tlbmQgZm91bmQhJyApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGdldCBmb3JtYXQgbGlzdAogICAgICAgIG15ICRGb3JtYXRMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXRMaXN0KCk7CgogICAgICAgIGlmICggISRGb3JtYXRMaXN0ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ05vIGZvcm1hdCBiYWNrZW5kIGZvdW5kIScgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgbXkgJFRlbXBsYXRlRGF0YSA9IHt9OwogICAgICAgICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RlbXBsYXRlSUQnICk7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgICAgICAkVGVtcGxhdGVEYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUdldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggISRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdUZW1wbGF0ZSBub3QgZm91bmQhJyApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGdlbmVyYXRlIE9iamVjdE9wdGlvblN0cmcKICAgICAgICBteSAkT2JqZWN0T3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkT2JqZWN0TGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdPYmplY3QnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFRlbXBsYXRlRGF0YS0+e09iamVjdH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGdlbmVyYXRlIEZvcm1hdE9wdGlvblN0cmcKICAgICAgICBteSAkRm9ybWF0T3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkRm9ybWF0TGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdGb3JtYXQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBvdmVydmlldwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBPYmplY3RPcHRpb25TdHJnID0+ICRPYmplY3RPcHRpb25TdHJnLAogICAgICAgICAgICAgICAgRm9ybWF0T3B0aW9uU3RyZyA9PiAkRm9ybWF0T3B0aW9uU3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25MaXN0JyApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbk92ZXJ2aWV3JyApOwoKICAgICAgICAjIG91dHB1dCBoZWFkbGluZQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7JFRlbXBsYXRlRGF0YX0sCiAgICAgICAgICAgICAgICBPYmplY3ROYW1lID0+ICRPYmplY3RMaXN0LT57ICRUZW1wbGF0ZURhdGEtPntPYmplY3R9IH0sCiAgICAgICAgICAgICAgICBGb3JtYXROYW1lID0+ICRGb3JtYXRMaXN0LT57ICRUZW1wbGF0ZURhdGEtPntGb3JtYXR9IH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgbWFwcGluZyBkYXRhIGxpc3QKICAgICAgICBteSAkTWFwcGluZ0xpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdMaXN0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGF0dHJpYnV0ZXMKICAgICAgICBteSAkTWFwcGluZ09iamVjdEF0dHJpYnV0ZXMgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgZm9ybWF0IGF0dHJpYnV0ZXMKICAgICAgICBteSAkTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXMgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgaGVhZGVycyBmb3Igb2JqZWN0IGFuZCBhZGQgY29tbW9uIGhlYWRlcnMKICAgICAgICBteSBASGVhZGVyczsKCiAgICAgICAgZm9yIG15ICRIZWFkZXIgKCBAeyRNYXBwaW5nT2JqZWN0QXR0cmlidXRlc30gKSB7CiAgICAgICAgICAgIHB1c2ggQEhlYWRlcnMsICRIZWFkZXItPntOYW1lfTsKICAgICAgICB9CgogICAgICAgIGZvciBteSAkQ29tbW9uSGVhZGVyICggJ0NvbHVtbicsICdVcCcsICdEb3duJywgJ0RlbGV0ZScgKSB7CiAgICAgICAgICAgIHB1c2ggQEhlYWRlcnMsICRDb21tb25IZWFkZXI7CiAgICAgICAgfQoKICAgICAgICBmb3IgbXkgJEhlYWRlciAoQEhlYWRlcnMpIHsKCiAgICAgICAgICAgICMgb3V0cHV0IGF0dHJpYnV0ZSByb3cKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDRUYWJsZUhlYWRlcicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBIZWFkZXIgPT4gJEhlYWRlciwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHRvIHVzZSBpbiBjb2xzcGFuIGZvciAnbm8gZGF0YSBmb3VuZCcgbWVzc2FnZQogICAgICAgIG15ICRIZWFkZXJDb3VudGVyID0gQEhlYWRlcnM7CgogICAgICAgIG15ICRFbXB0eU1hcCAgICAgICAgICAgID0gMTsKICAgICAgICBteSAkQXRyaWJ1dHRlUm93Q291bnRlciA9IDA7CiAgICAgICAgZm9yIG15ICRNYXBwaW5nSUQgKCBAeyRNYXBwaW5nTGlzdH0gKSB7CgogICAgICAgICAgICAkRW1wdHlNYXAgPSAwOwoKICAgICAgICAgICAgIyBvdXRwdXQgYXR0cmlidXRlIHJvdwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGVtcGxhdGVFZGl0NFJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBNYXBwaW5nSUQgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBtYXBwaW5nIG9iamVjdCBkYXRhCiAgICAgICAgICAgIG15ICRNYXBwaW5nT2JqZWN0RGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ09iamVjdERhdGFHZXQoCiAgICAgICAgICAgICAgICBNYXBwaW5nSUQgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBtYXBwaW5nIGZvcm1hdCBkYXRhCiAgICAgICAgICAgIG15ICRNYXBwaW5nRm9ybWF0RGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0Zvcm1hdERhdGFHZXQoCiAgICAgICAgICAgICAgICBNYXBwaW5nSUQgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyRNYXBwaW5nT2JqZWN0QXR0cmlidXRlc30gKSB7CgogICAgICAgICAgICAgICAgIyBjcmVhdGUgZm9ybSBpbnB1dAogICAgICAgICAgICAgICAgbXkgJElucHV0U3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JbXBvcnRFeHBvcnRGb3JtSW5wdXRDcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgSXRlbSAgID0+ICRJdGVtLAogICAgICAgICAgICAgICAgICAgIFByZWZpeCA9PiAnT2JqZWN0OjonIC4gJEF0cmlidXR0ZVJvd0NvdW50ZXIgLiAnOjonLAogICAgICAgICAgICAgICAgICAgIFZhbHVlICA9PiAkTWFwcGluZ09iamVjdERhdGEtPnsgJEl0ZW0tPntLZXl9IH0sCiAgICAgICAgICAgICAgICAgICAgSUQgICAgID0+ICRJdGVtLT57S2V5fSAuICRBdHJpYnV0dGVSb3dDb3VudGVyLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIG91dHB1dCBhdHRyaWJ1dGUgcm93CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDRDb2x1bW4nLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJEl0ZW0tPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgSUQgICAgICAgID0+ICdPYmplY3Q6OicgLiAkQXRyaWJ1dHRlUm93Q291bnRlciAuICc6OicgLiAkSXRlbS0+e0tleX0sCiAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZyA9PiAkSW5wdXRTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgIENvdW50ZXIgICA9PiAkQXRyaWJ1dHRlUm93Q291bnRlciwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yIG15ICRJdGVtICggQHskTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXN9ICkgewoKICAgICAgICAgICAgICAgICMgY3JlYXRlIGZvcm0gaW5wdXQKICAgICAgICAgICAgICAgIG15ICRJbnB1dFN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SW1wb3J0RXhwb3J0Rm9ybUlucHV0Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgIEl0ZW0gICA9PiAkSXRlbSwKICAgICAgICAgICAgICAgICAgICBQcmVmaXggPT4gJ0Zvcm1hdDo6JyAuICRBdHJpYnV0dGVSb3dDb3VudGVyIC4gJzo6JywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgPT4gJE1hcHBpbmdGb3JtYXREYXRhLT57ICRJdGVtLT57S2V5fSB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIG91dHB1dCBhdHRyaWJ1dGUgcm93CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDRNYXBOdW1iZXJDb2x1bW4nLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJEl0ZW0tPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJnID0+ICRJbnB1dFN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRlciAgID0+ICRBdHJpYnV0dGVSb3dDb3VudGVyLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGhpZGUgdGhlIHVwIGJ1dHRvbiBmb3IgZmlyc3QgZWxlbWVudCBhbmQgZG93biBidXR0b24gZm9yIHRoZSBsYXN0IGVsZW1lbnQKICAgICAgICAgICAgbXkgJFVwQmxvY2s7CiAgICAgICAgICAgIG15ICREb3duQmxvY2s7CiAgICAgICAgICAgIG15ICROdW1iZXJPZkVsZW1lbnRzID0gQHskTWFwcGluZ0xpc3R9OwoKICAgICAgICAgICAgaWYgKCAkQXRyaWJ1dHRlUm93Q291bnRlciA9PSAwICkgewogICAgICAgICAgICAgICAgJFVwQmxvY2sgPSAnVGVtcGxhdGVFZGl0NE5vVXBCdXR0b24nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFVwQmxvY2sgPSAnVGVtcGxhdGVFZGl0NFVwQnV0dG9uJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBpZiB0aGlzIGlzIHRoZSBsYXN0IGVsZW1lbnQKICAgICAgICAgICAgaWYgKCAkQXRyaWJ1dHRlUm93Q291bnRlciA9PSAoICROdW1iZXJPZkVsZW1lbnRzIC0gMSApICkgewogICAgICAgICAgICAgICAgJERvd25CbG9jayA9ICdUZW1wbGF0ZUVkaXQ0Tm9Eb3duQnV0dG9uJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICREb3duQmxvY2sgPSAnVGVtcGxhdGVFZGl0NERvd25CdXR0b24nOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHVwIGJ1dHRvbiBibG9jawogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAkVXBCbG9jaywKICAgICAgICAgICAgICAgIERhdGEgPT4geyBNYXBwaW5nSUQgPT4gJE1hcHBpbmdJRCB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkb3duIGJ1dHRvbiBibG9jawogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAkRG93bkJsb2NrLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7IE1hcHBpbmdJRCA9PiAkTWFwcGluZ0lEIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkQXRyaWJ1dHRlUm93Q291bnRlcisrOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgYW4gZW1wdHkgbGlzdAogICAgICAgIGlmICgkRW1wdHlNYXApIHsKCiAgICAgICAgICAgICMgb3V0cHV0IGxpc3QKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDROb01hcEZvdW5kJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIENvbHVtbnMgPT4gJEhlYWRlckNvdW50ZXIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyIGFuZCBuYXZiYXIKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIHN0YXJ0IHRlbXBsYXRlIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JbXBvcnRFeHBvcnQnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB0ZW1wbGF0ZSBzYXZlIChtYXBwaW5nKQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RlbXBsYXRlU2F2ZTQnICkgewoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBpZAogICAgICAgIG15ICRUZW1wbGF0ZUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgbXkgJVN1Ym1pdCA9ICgKICAgICAgICAgICAgU3VibWl0TmV4dCA9PiAnVGVtcGxhdGVFZGl0NScsCiAgICAgICAgICAgIFN1Ym1pdEJhY2sgPT4gJ1RlbXBsYXRlRWRpdDMnLAogICAgICAgICAgICBSZWxvYWQgICAgID0+ICdUZW1wbGF0ZUVkaXQ0JywKICAgICAgICAgICAgTWFwcGluZ0FkZCA9PiAnVGVtcGxhdGVFZGl0NCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc3VibWl0IGFjdGlvbgogICAgICAgIG15ICRTdWJhY3Rpb24gICAgPSAkU3VibWl0e1JlbG9hZH07CiAgICAgICAgbXkgJFN1Ym1pdEJ1dHRvbiA9ICcnOwoKICAgICAgICBQQVJBTToKICAgICAgICBmb3IgbXkgJFN1Ym1pdEtleSAoIHNvcnQga2V5cyAlU3VibWl0ICkgewogICAgICAgICAgICBuZXh0IFBBUkFNIGlmICEkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRTdWJtaXRLZXkgKTsKCiAgICAgICAgICAgICRTdWJhY3Rpb24gICAgPSAkU3VibWl0eyRTdWJtaXRLZXl9OwogICAgICAgICAgICAkU3VibWl0QnV0dG9uID0gJFN1Ym1pdEtleTsKICAgICAgICAgICAgbGFzdCBQQVJBTTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IG1hcHBpbmcgZGF0YSBsaXN0CiAgICAgICAgbXkgJE1hcHBpbmdMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nTGlzdCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGF0dHJpYnV0ZXMKICAgICAgICBteSAkTWFwcGluZ09iamVjdEF0dHJpYnV0ZXMgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBmb3JtYXQgYXR0cmlidXRlcwogICAgICAgIG15ICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlcyA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIG15ICRDb3VudGVyID0gMDsKICAgICAgICBNQVBQSU5HSUQ6CiAgICAgICAgZm9yIG15ICRNYXBwaW5nSUQgKCBAeyRNYXBwaW5nTGlzdH0gKSB7CgogICAgICAgICAgICAjIGdldCBvYmplY3QgYXR0cmlidXRlIHZhbHVlcwogICAgICAgICAgICBteSAlT2JqZWN0QXR0cmlidXRlVmFsdWVzOwogICAgICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyRNYXBwaW5nT2JqZWN0QXR0cmlidXRlc30gKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgb2JqZWN0IGZvcm0gZGF0YQogICAgICAgICAgICAgICAgJE9iamVjdEF0dHJpYnV0ZVZhbHVlc3sgJEl0ZW0tPntLZXl9IH0KICAgICAgICAgICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SW1wb3J0RXhwb3J0Rm9ybURhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgSXRlbSAgID0+ICRJdGVtLAogICAgICAgICAgICAgICAgICAgIFByZWZpeCA9PiAnT2JqZWN0OjonIC4gJENvdW50ZXIgLiAnOjonLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2F2ZSB0aGUgbWFwcGluZyBvYmplY3QgZGF0YQogICAgICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdPYmplY3REYXRhU2F2ZSgKICAgICAgICAgICAgICAgIE1hcHBpbmdJRCAgICAgICAgID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBcJU9iamVjdEF0dHJpYnV0ZVZhbHVlcywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IGZvcm1hdCBhdHRyaWJ1dGUgdmFsdWVzCiAgICAgICAgICAgIG15ICVGb3JtYXRBdHRyaWJ1dGVWYWx1ZXM7CiAgICAgICAgICAgIGZvciBteSAkSXRlbSAoIEB7JE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzfSApIHsKCiAgICAgICAgICAgICAgICAjIGdldCBmb3JtYXQgZm9ybSBkYXRhCiAgICAgICAgICAgICAgICAkRm9ybWF0QXR0cmlidXRlVmFsdWVzeyAkSXRlbS0+e0tleX0gfQogICAgICAgICAgICAgICAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JbXBvcnRFeHBvcnRGb3JtRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICBJdGVtICAgPT4gJEl0ZW0sCiAgICAgICAgICAgICAgICAgICAgUHJlZml4ID0+ICdGb3JtYXQ6OicgLiAkQ291bnRlciAuICc6OicsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzYXZlIHRoZSBtYXBwaW5nIGZvcm1hdCBkYXRhCiAgICAgICAgICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0Zvcm1hdERhdGFTYXZlKAogICAgICAgICAgICAgICAgTWFwcGluZ0lEICAgICAgICAgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgICAgIE1hcHBpbmdGb3JtYXREYXRhID0+IFwlRm9ybWF0QXR0cmlidXRlVmFsdWVzLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICB9CgogICAgICAgIE1BUFBJTkdJRDoKICAgICAgICBmb3IgbXkgJE1hcHBpbmdJRCAoIEB7JE1hcHBpbmdMaXN0fSApIHsKCiAgICAgICAgICAgICMgZGVsZXRlIHRoaXMgbWFwcGluZyByb3cKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJNYXBwaW5nRGVsZXRlOjokTWFwcGluZ0lEIiApICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nRGVsZXRlKAogICAgICAgICAgICAgICAgICAgIE1hcHBpbmdJRCAgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBuZXh0IE1BUFBJTkdJRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBtb3ZlIG1hcHBpbmcgZGF0YSByb3cgdXAKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJNYXBwaW5nVXA6OiRNYXBwaW5nSUQiICkgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdVcCgKICAgICAgICAgICAgICAgICAgICBNYXBwaW5nSUQgID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBNQVBQSU5HSUQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgbW92ZSBtYXBwaW5nIGRhdGEgcm93IGRvd24KICAgICAgICAgICAgaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJNYXBwaW5nRG93bjo6JE1hcHBpbmdJRCIgKSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0Rvd24oCiAgICAgICAgICAgICAgICAgICAgTWFwcGluZ0lEICA9PiAkTWFwcGluZ0lELAogICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG5leHQgTUFQUElOR0lEOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBhIG5ldyBtYXBwaW5nIHJvdwogICAgICAgIGlmICggJFN1Ym1pdEJ1dHRvbiBlcSAnTWFwcGluZ0FkZCcgKSB7CiAgICAgICAgICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0FkZCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufTtTdWJhY3Rpb249JFN1YmFjdGlvbjtUZW1wbGF0ZUlEPSRUZW1wbGF0ZUlEIiwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVtcGxhdGUgZWRpdCAoc2VhcmNoKQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RlbXBsYXRlRWRpdDUnICkgewoKICAgICAgICAjIGdldCBvYmplY3QgbGlzdAogICAgICAgIG15ICRPYmplY3RMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3RMaXN0KCk7CgogICAgICAgIGlmICggISRPYmplY3RMaXN0ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ05vIG9iamVjdCBiYWNrZW5kIGZvdW5kIScgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZm9ybWF0IGxpc3QKICAgICAgICBteSAkRm9ybWF0TGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0TGlzdCgpOwoKICAgICAgICBpZiAoICEkRm9ybWF0TGlzdCApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdObyBmb3JtYXQgYmFja2VuZCBmb3VuZCEnICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIG15ICRUZW1wbGF0ZURhdGEgPSB7fTsKICAgICAgICAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApOwoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICAgICAgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnVGVtcGxhdGUgbm90IGZvdW5kIScgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBnZW5lcmF0ZSBPYmplY3RPcHRpb25TdHJnCiAgICAgICAgbXkgJE9iamVjdE9wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJE9iamVjdExpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnT2JqZWN0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRUZW1wbGF0ZURhdGEtPntPYmplY3R9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBGb3JtYXRPcHRpb25TdHJnCiAgICAgICAgbXkgJEZvcm1hdE9wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJEZvcm1hdExpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnRm9ybWF0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRUZW1wbGF0ZURhdGEtPntGb3JtYXR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgT2JqZWN0T3B0aW9uU3RyZyA9PiAkT2JqZWN0T3B0aW9uU3RyZywKICAgICAgICAgICAgICAgIEZvcm1hdE9wdGlvblN0cmcgPT4gJEZvcm1hdE9wdGlvblN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uTGlzdCcgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25PdmVydmlldycgKTsKCiAgICAgICAgIyBnZXQgc2VhcmNoIGRhdGEKICAgICAgICBteSAkU2VhcmNoRGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+U2VhcmNoRGF0YUdldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIHJlc2NyaWN0IGV4cG9ydCBzdHJpbmcKICAgICAgICBteSAkUmVzdHJpY3RFeHBvcnRTdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JbXBvcnRFeHBvcnRGb3JtSW5wdXRDcmVhdGUoCiAgICAgICAgICAgIEl0ZW0gPT4gewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ1Jlc3RyaWN0RXhwb3J0JywKICAgICAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICdDaGVja2JveCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBWYWx1ZSA9PiBzY2FsYXIga2V5cyAleyRTZWFyY2hEYXRhfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBsaXN0CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGVtcGxhdGVFZGl0NScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJXskVGVtcGxhdGVEYXRhfSwKICAgICAgICAgICAgICAgIFJlc3RyaWN0RXhwb3J0U3RyZyA9PiAkUmVzdHJpY3RFeHBvcnRTdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNlYXJjaCBhdHRyaWJ1dGVzCiAgICAgICAgbXkgJFNlYXJjaEF0dHJpYnV0ZUxpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlNlYXJjaEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBvYmplY3QgYXR0cmlidXRlcwogICAgICAgIGZvciBteSAkSXRlbSAoIEB7JFNlYXJjaEF0dHJpYnV0ZUxpc3R9ICkgewoKICAgICAgICAgICAgIyBjcmVhdGUgZm9ybSBpbnB1dAogICAgICAgICAgICBteSAkSW5wdXRTdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkltcG9ydEV4cG9ydEZvcm1JbnB1dENyZWF0ZSgKICAgICAgICAgICAgICAgIEl0ZW0gID0+ICRJdGVtLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFNlYXJjaERhdGEtPnsgJEl0ZW0tPntLZXl9IH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG91dHB1dCBhdHRyaWJ1dGUgcm93CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZUVkaXQ1RWxlbWVudCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRJdGVtLT57TmFtZX0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJnID0+ICRJbnB1dFN0cmluZywKICAgICAgICAgICAgICAgICAgICBJRCAgICAgICAgPT4gJEl0ZW0tPntLZXl9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGhlYWRlciBhbmQgbmF2YmFyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluSW1wb3J0RXhwb3J0JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVtcGxhdGUgc2F2ZSAoc2VhcmNoKQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RlbXBsYXRlU2F2ZTUnICkgewoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBpZAogICAgICAgIG15ICRUZW1wbGF0ZUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgbXkgJVN1Ym1pdCA9ICgKICAgICAgICAgICAgU3VibWl0TmV4dCA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBTdWJtaXRCYWNrID0+ICdUZW1wbGF0ZUVkaXQ0JywKICAgICAgICAgICAgUmVsb2FkICAgICA9PiAnVGVtcGxhdGVFZGl0NScsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc3VibWl0IGFjdGlvbgogICAgICAgIG15ICRTdWJhY3Rpb24gPSAkU3VibWl0e1JlbG9hZH07CgogICAgICAgIFBBUkFNOgogICAgICAgIGZvciBteSAkU3VibWl0S2V5ICggc29ydCBrZXlzICVTdWJtaXQgKSB7CiAgICAgICAgICAgIG5leHQgUEFSQU0gaWYgISRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFN1Ym1pdEtleSApOwoKICAgICAgICAgICAgJFN1YmFjdGlvbiA9ICRTdWJtaXR7JFN1Ym1pdEtleX07CiAgICAgICAgICAgIGxhc3QgUEFSQU07CiAgICAgICAgfQoKICAgICAgICAjIGRlbGV0ZSBhbGwgc2VhcmNoIHJlc3RyaWN0aW9ucwogICAgICAgIGlmICggISRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1Jlc3RyaWN0RXhwb3J0JyApICkgewoKICAgICAgICAgICAgIyBkZWxldGUgYWxsIHNlYXJjaCBkYXRhCiAgICAgICAgICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+U2VhcmNoRGF0YURlbGV0ZSgKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn07U3ViYWN0aW9uPSRTdWJhY3Rpb247VGVtcGxhdGVJRD0kVGVtcGxhdGVJRCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBzZWFyY2ggYXR0cmlidXRlcwogICAgICAgIG15ICRTZWFyY2hBdHRyaWJ1dGVMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5TZWFyY2hBdHRyaWJ1dGVzR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBhdHRyaWJ1dGUgdmFsdWVzIGZyb20gZm9ybQogICAgICAgIG15ICVBdHRyaWJ1dGVWYWx1ZXM7CiAgICAgICAgZm9yIG15ICRJdGVtICggQHskU2VhcmNoQXR0cmlidXRlTGlzdH0gKSB7CgogICAgICAgICAgICAjIGdldCBmb3JtIGRhdGEKICAgICAgICAgICAgJEF0dHJpYnV0ZVZhbHVlc3sgJEl0ZW0tPntLZXl9IH0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkltcG9ydEV4cG9ydEZvcm1EYXRhR2V0KAogICAgICAgICAgICAgICAgSXRlbSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcmVsb2FkIGZvcm0gaWYgdmFsdWUgaXMgcmVxdWlyZWQKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0Zvcm19LT57SW52YWxpZH0gKSB7CiAgICAgICAgICAgICAgICAkU3ViYWN0aW9uID0gJFN1Ym1pdHtSZWxvYWR9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNhdmUgdGhlIHNlYXJjaCBkYXRhCiAgICAgICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5TZWFyY2hEYXRhU2F2ZSgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgU2VhcmNoRGF0YSA9PiBcJUF0dHJpYnV0ZVZhbHVlcywKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259O1N1YmFjdGlvbj0kU3ViYWN0aW9uO1RlbXBsYXRlSUQ9JFRlbXBsYXRlSUQiLAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB0ZW1wbGF0ZSBkZWxldGUKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdUZW1wbGF0ZURlbGV0ZScgKSB7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGlkCiAgICAgICAgbXkgJFRlbXBsYXRlSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApOwoKICAgICAgICAjIGRlbGV0ZSB0ZW1wbGF0ZSBmcm9tIGRhdGFiYXNlCiAgICAgICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZURlbGV0ZSgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZWRpcmVjdCB0byBvdmVydmlldwogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGltcG9ydCBpbmZvcm1hdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0ltcG9ydEluZm9ybWF0aW9uJyApIHsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGxpc3QKICAgICAgICBteSAkT2JqZWN0TGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+T2JqZWN0TGlzdCgpOwoKICAgICAgICBpZiAoICEkT2JqZWN0TGlzdCApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZvcm1hdCBsaXN0CiAgICAgICAgbXkgJEZvcm1hdExpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdExpc3QoKTsKCiAgICAgICAgaWYgKCAhJEZvcm1hdExpc3QgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJyApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBteSAkVGVtcGxhdGVEYXRhID0ge307CiAgICAgICAgJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgICAgICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ1RlbXBsYXRlIG5vdCBmb3VuZCEnICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZ2VuZXJhdGUgT2JqZWN0T3B0aW9uU3RyZwogICAgICAgIG15ICRPYmplY3RPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRPYmplY3RMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ09iamVjdCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgRm9ybWF0T3B0aW9uU3RyZwogICAgICAgIG15ICRGb3JtYXRPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRGb3JtYXRMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0Zvcm1hdCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIE9iamVjdE9wdGlvblN0cmcgPT4gJE9iamVjdE9wdGlvblN0cmcsCiAgICAgICAgICAgICAgICBGb3JtYXRPcHRpb25TdHJnID0+ICRGb3JtYXRPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbkxpc3QnICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uT3ZlcnZpZXcnICk7CgogICAgICAgICMgb3V0cHV0IGxpc3QKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdJbXBvcnRJbmZvcm1hdGlvbicsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJXskVGVtcGxhdGVEYXRhfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBoZWFkZXIgYW5kIG5hdmJhcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkltcG9ydEV4cG9ydCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGltcG9ydAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0ltcG9ydCcgKSB7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIG15ICRUZW1wbGF0ZURhdGEgPSB7fTsKICAgICAgICAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApOwoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICAgICAgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnVGVtcGxhdGUgbm90IGZvdW5kIScgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgc291cmNlIGZpbGUKICAgICAgICBteSAlU291cmNlRmlsZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgIFBhcmFtICA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgIFNvdXJjZSA9PiAnU3RyaW5nJywKICAgICAgICApOwoKICAgICAgICAkU291cmNlRmlsZXtDb250ZW50fSB8fD0gJyc7CgogICAgICAgICMgaW1wb3J0IGRhdGEKICAgICAgICBteSAkUmVzdWx0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5JbXBvcnQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+IFwkU291cmNlRmlsZXtDb250ZW50fSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFJlc3VsdCApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAnRXJyb3Igb2NjdXJyZWQuIEltcG9ydCBpbXBvc3NpYmxlISBTZWUgU3lzbG9nIGZvciBkZXRhaWxzLicsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGhlYWRlciBhbmQgbmF2YmFyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBvdXRwdXQgaW1wb3J0IHJlc3VsdHMKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdJbXBvcnRSZXN1bHQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7JFJlc3VsdH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYWxsIHJldHVybiBjb2RlcyBhbmQgY29sbGVjdCB0aGUgZHVwbGljYXRlIG5hbWVzCiAgICAgICAgbXkgQER1cGxpY2F0ZU5hbWVzOwogICAgICAgIFJFVFVSTkNPREU6CiAgICAgICAgZm9yIG15ICRSZXRDb2RlICggc29ydCBrZXlzICV7ICRSZXN1bHQtPntSZXRDb2RlfSB9ICkgewoKICAgICAgICAgICAgIyBqdXN0IGdldCB0aGUgZHVwbGljYXRlIG5hbWUKICAgICAgICAgICAgaWYgKCAkUmV0Q29kZSA9fiBteyBcQSBEdXBsaWNhdGVOYW1lIFxzKyAoLispIH14bXMgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBEdXBsaWNhdGVOYW1lcywgJDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0ltcG9ydFJlc3VsdFJldHVybkNvZGUnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5Db2RlTmFtZSAgPT4gJFJldENvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybkNvZGVDb3VudCA9PiAkUmVzdWx0LT57UmV0Q29kZX0tPnskUmV0Q29kZX0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGR1cGxpY2F0ZSBuYW1lcyBpZiBuZWNjZXNzYXJ5CiAgICAgICAgaWYgKEBEdXBsaWNhdGVOYW1lcykgewoKICAgICAgICAgICAgbXkgJER1cGxpY2F0ZU5hbWVzU3RyaW5nID0gam9pbiAnLCAnLCBARHVwbGljYXRlTmFtZXM7CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSW1wb3J0UmVzdWx0RHVwbGljYXRlTmFtZXMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgRHVwbGljYXRlTmFtZXMgPT4gJER1cGxpY2F0ZU5hbWVzU3RyaW5nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGxhc3QgcHJvY2Vzc2VkIGxpbmUgbXVtYmVyIG9mIGltcG9ydCBmaWxlCiAgICAgICAgaWYgKCAkUmVzdWx0LT57RmFpbGVkfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0ltcG9ydFJlc3VsdExhc3RMaW5lTnVtYmVyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIExhc3RMaW5lTnVtYmVyID0+ICRSZXN1bHQtPntDb3VudGVyfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHN0YXJ0IG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JbXBvcnRFeHBvcnQnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGV4cG9ydAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0V4cG9ydCcgKSB7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIG15ICRUZW1wbGF0ZURhdGEgPSB7fTsKICAgICAgICAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApOwoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICAgICAgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnVGVtcGxhdGUgbm90IGZvdW5kIScgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBleHBvcnQgZGF0YQogICAgICAgIG15ICRSZXN1bHQgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkV4cG9ydCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggISRSZXN1bHQgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ0Vycm9yIG9jY3VycmVkLiBFeHBvcnQgaW1wb3NzaWJsZSEgU2VlIFN5c2xvZyBmb3IgZGV0YWlscy4nLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBteSAkRmlsZUNvbnRlbnQgPSBqb2luICJcbiIsIEB7ICRSZXN1bHQtPntEZXN0aW5hdGlvbkNvbnRlbnR9IH07CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJ0V4cG9ydC5jc3YnLAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9jc3YnLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkRmlsZUNvbnRlbnQsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIG92ZXJ2aWV3CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNlIHsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGxpc3QKICAgICAgICBteSAkT2JqZWN0TGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+T2JqZWN0TGlzdCgpOwoKICAgICAgICBpZiAoICEkT2JqZWN0TGlzdCApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZvcm1hdCBsaXN0CiAgICAgICAgbXkgJEZvcm1hdExpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdExpc3QoKTsKCiAgICAgICAgaWYgKCAhJEZvcm1hdExpc3QgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJyApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBvdmVydmlldwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uTGlzdCcgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25BZGQnICk7CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3UmVzdWx0JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHZhbGlkIGxpc3QKICAgICAgICBteSAlVmFsaWRMaXN0ID0gJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTGlzdCgpOwoKICAgICAgICBteSAkRW1wdHlEYXRhYmFzZSA9IDE7CgogICAgICAgIENMQVNTOgogICAgICAgIGZvciBteSAkT2JqZWN0ICggc29ydCB7ICRPYmplY3RMaXN0LT57JGF9IGNtcCAkT2JqZWN0TGlzdC0+eyRifSB9IGtleXMgJXskT2JqZWN0TGlzdH0gKSB7CgogICAgICAgICAgICAjIGdldCB0ZW1wbGF0ZSBsaXN0CiAgICAgICAgICAgIG15ICRUZW1wbGF0ZUxpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlTGlzdCgKICAgICAgICAgICAgICAgIE9iamVjdCA9PiAkT2JqZWN0LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRUZW1wbGF0ZUxpc3QgfHwgcmVmICRUZW1wbGF0ZUxpc3QgbmUgJ0FSUkFZJyB8fCAhQHskVGVtcGxhdGVMaXN0fSApIHsKICAgICAgICAgICAgICAgIG5leHQgQ0xBU1M7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRFbXB0eURhdGFiYXNlID0gMDsKCiAgICAgICAgICAgICMgb3V0cHV0IGxpc3QKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lID0+ICRPYmplY3RMaXN0LT57JE9iamVjdH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgZm9yIG15ICRUZW1wbGF0ZUlEICggQHskVGVtcGxhdGVMaXN0fSApIHsKCiAgICAgICAgICAgICAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICAgICAgICAgICAgICBteSAkVGVtcGxhdGVEYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUdldCgKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIG91dHB1dCByb3cKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdMaXN0Um93JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJXskVGVtcGxhdGVEYXRhfSwKICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0TmFtZSA9PiAkRm9ybWF0TGlzdC0+eyAkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSB9LAogICAgICAgICAgICAgICAgICAgICAgICBWYWxpZCAgICAgID0+ICRWYWxpZExpc3R7ICRUZW1wbGF0ZURhdGEtPntWYWxpZElEfSB9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBhbiBlbXB0eSBsaXN0CiAgICAgICAgaWYgKCRFbXB0eURhdGFiYXNlKSB7CgogICAgICAgICAgICAjIG91dHB1dCBsaXN0CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0xpc3QnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSA9PiAnVGVtcGxhdGUgTGlzdCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdOb0RhdGFGb3VuZE1zZycgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGhlYWRlciBhbmQgbmF2YmFyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluSW1wb3J0RXhwb3J0JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgpzdWIgX01hc2tUZW1wbGF0ZUVkaXQxIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJVNlcnZlckVycm9yOwogICAgaWYgKCAkUGFyYW17U2VydmVyRXJyb3J9ICkgewogICAgICAgICVTZXJ2ZXJFcnJvciA9ICV7ICRQYXJhbXtTZXJ2ZXJFcnJvcn0gfTsKICAgIH0KCiAgICAjIG91dHB1dCBvdmVydmlldwogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25MaXN0JyApOwogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uT3ZlcnZpZXcnICk7CgogICAgIyBnZW5lcmF0ZSBWYWxpZE9wdGlvblN0cmcKICAgIG15ICVWYWxpZExpc3QgICAgICAgID0gJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTGlzdCgpOwogICAgbXkgJVZhbGlkTGlzdFJldmVyc2UgPSByZXZlcnNlICVWYWxpZExpc3Q7CiAgICBteSAkVmFsaWRPcHRpb25TdHJnICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgTmFtZSAgICAgICA9PiAnVmFsaWRJRCcsCiAgICAgICAgRGF0YSAgICAgICA9PiBcJVZhbGlkTGlzdCwKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtWYWxpZElEfSB8fCAkVmFsaWRMaXN0UmV2ZXJzZXt2YWxpZH0sCiAgICApOwoKICAgIG15ICRDbGFzcyA9ICcgVmFsaWRhdGVfUmVxdWlyZWQgJzsKCiAgICBpZiAoICRTZXJ2ZXJFcnJvcntOYW1lfSApIHsKICAgICAgICAkQ2xhc3MgLj0gJ1NlcnZlckVycm9yJzsKICAgIH0KCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDEnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIFZhbGlkT3B0aW9uU3RyZyA9PiAkVmFsaWRPcHRpb25TdHJnLAogICAgICAgICAgICBOYW1lQ2xhc3MgICAgICAgPT4gJENsYXNzLAogICAgICAgIH0sCiAgICApOwoKICAgIGlmICggJFBhcmFte1RlbXBsYXRlSUR9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0VkaXRPYmplY3RGb3JtYXQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgPT4gJFBhcmFte09iamVjdH0sCiAgICAgICAgICAgICAgICBGb3JtYXROYW1lID0+ICRQYXJhbXtGb3JtYXR9LAogICAgICAgICAgICAgICAgfQogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17TmV3fSApIHsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGxpc3QKICAgICAgICBteSAkT2JqZWN0TGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+T2JqZWN0TGlzdCgpOwoKICAgICAgICBpZiAoICEkT2JqZWN0TGlzdCApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZvcm1hdCBsaXN0CiAgICAgICAgbXkgJEZvcm1hdExpc3QgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPkZvcm1hdExpc3QoKTsKCiAgICAgICAgaWYgKCAhJEZvcm1hdExpc3QgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJyApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAkQ2xhc3MgPSAnIFZhbGlkYXRlX1JlcXVpcmVkICc7CgogICAgICAgIGlmICggJFNlcnZlckVycm9ye09iamVjdH0gKSB7CiAgICAgICAgICAgICRDbGFzcyAuPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgIyBnZW5lcmF0ZSBPYmplY3RPcHRpb25TdHJnCiAgICAgICAgbXkgJE9iamVjdE9wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJE9iamVjdExpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnT2JqZWN0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtPYmplY3R9IHx8ICcnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAkQ2xhc3MsCiAgICAgICAgKTsKCiAgICAgICAgJENsYXNzID0gJyBWYWxpZGF0ZV9SZXF1aXJlZCAnOwogICAgICAgIGlmICggJFNlcnZlckVycm9ye0Zvcm1hdH0gKSB7CiAgICAgICAgICAgICRDbGFzcyAuPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgIyBnZW5lcmF0ZSBGb3JtYXRPcHRpb25TdHJnCiAgICAgICAgbXkgJEZvcm1hdE9wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJEZvcm1hdExpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnRm9ybWF0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtGb3JtYXR9IHx8ICcnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAkQ2xhc3MsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTmV3T2JqZWN0Rm9ybWF0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBPYmplY3RPcHRpb24gPT4gJE9iamVjdE9wdGlvblN0cmcsCiAgICAgICAgICAgICAgICBGb3JtYXRPcHRpb24gPT4gJEZvcm1hdE9wdGlvblN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG91dHB1dCBoZWFkZXIgYW5kIG5hdmJhcgogICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JbXBvcnRFeHBvcnQnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIF9NYXNrVGVtcGxhdGVFZGl0MiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVTZXJ2ZXJFcnJvcjsKICAgIGlmICggJFBhcmFte1NlcnZlckVycm9yfSApIHsKICAgICAgICAlU2VydmVyRXJyb3IgPSAleyAkUGFyYW17U2VydmVyRXJyb3J9IH07CiAgICB9CgogICAgbXkgJURhdGFUeXBlRXJyb3I7CiAgICBpZiAoICRQYXJhbXtEYXRhVHlwZUVycm9yfSApIHsKICAgICAgICAlRGF0YVR5cGVFcnJvciA9ICV7ICRQYXJhbXtEYXRhVHlwZUVycm9yfSB9OwogICAgfQoKICAgIG15ICRUZW1wbGF0ZUlEOwogICAgaWYgKCAkUGFyYW17VGVtcGxhdGVJRH0gKSB7CiAgICAgICAgJFRlbXBsYXRlSUQgPSAkUGFyYW17VGVtcGxhdGVJRH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ05lZWRlZCBUZW1wbGF0ZUlEIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgbXkgJFRlbXBsYXRlRGF0YTsKICAgICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlRlbXBsYXRlR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIGlmICggISRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ1RlbXBsYXRlIG5vdCBmb3VuZCEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICRQYXJhbXtCYWNrVVJMfSA9ICJBY3Rpb249JFNlbGYtPntBY3Rpb259O1N1YmFjdGlvbj1UZW1wbGF0ZUVkaXQxO1RlbXBsYXRlSUQ9JFRlbXBsYXRlSUQiOwoKICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbkxpc3QnICk7CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25PdmVydmlldycgKTsKCiAgICAjIG91dHB1dCBsaXN0CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDInLAogICAgICAgIERhdGEgPT4gJFRlbXBsYXRlRGF0YSwKICAgICk7CgogICAgIyBnZXQgb2JqZWN0IGF0dHJpYnV0ZXMKICAgIG15ICRPYmplY3RBdHRyaWJ1dGVMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCBvYmplY3QgZGF0YQogICAgbXkgJE9iamVjdERhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk9iamVjdERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgamF2YXNjcmlwdCB2YWxpZGF0aW9uIGNsYXNzIHBlciBkYXRhdHlwZQogICAgbXkgJUpTQ2xhc3M7CiAgICBteSAlUHJlZGVmaW5lZEVycm9yTWVzc2FnZXM7CgogICAgJEpTQ2xhc3N7TnVtYmVyfSAgICAgICAgICAgICAgICA9ICdWYWxpZGF0ZV9OdW1iZXInOwogICAgJEpTQ2xhc3N7TnVtYmVyQmlnZ2VyVGhhblplcm99ICA9ICdWYWxpZGF0ZV9OdW1iZXJCaWdnZXJUaGFuWmVybyc7CiAgICAkSlNDbGFzc3tJbnRlZ2VyfSAgICAgICAgICAgICAgID0gJ1ZhbGlkYXRlX051bWJlckludGVnZXInOwogICAgJEpTQ2xhc3N7SW50ZWdlckJpZ2dlclRoYW5aZXJvfSA9ICdWYWxpZGF0ZV9OdW1iZXJJbnRlZ2VyQmlnZ2VyVGhhblplcm8nOwoKICAgICRQcmVkZWZpbmVkRXJyb3JNZXNzYWdlc3tOdW1iZXJ9ICAgICAgICAgICAgICAgID0gJ251bWJlcic7CiAgICAkUHJlZGVmaW5lZEVycm9yTWVzc2FnZXN7TnVtYmVyQmlnZ2VyVGhhblplcm99ICA9ICdudW1iZXIgYmlnZ2VyIHRoYW4gemVybyc7CiAgICAkUHJlZGVmaW5lZEVycm9yTWVzc2FnZXN7SW50ZWdlcn0gICAgICAgICAgICAgICA9ICdpbnRlZ2VyJzsKICAgICRQcmVkZWZpbmVkRXJyb3JNZXNzYWdlc3tJbnRlZ2VyQmlnZ2VyVGhhblplcm99ID0gJ2ludGVnZXIgYmlnZ2VyIHRoYW4gemVybyc7CgogICAgIyBvdXRwdXQgb2JqZWN0IGF0dHJpYnV0ZXMKICAgIGZvciBteSAkSXRlbSAoIEB7JE9iamVjdEF0dHJpYnV0ZUxpc3R9ICkgewoKICAgICAgICBteSAkQ2xhc3MgPSAnICc7CiAgICAgICAgbXkgJFZhbHVlOwoKICAgICAgICBteSAkRGF0YVR5cGVFcnJvcjsKICAgICAgICBteSAkRXJyb3JNZXNzYWdlOwoKICAgICAgICBpZiAoICRJdGVtLT57SW5wdXR9LT57UmVxdWlyZWR9ICkgewogICAgICAgICAgICAkQ2xhc3MgICAgICAgID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAgICAgJEVycm9yTWVzc2FnZSA9ICdFbGVtZW50IHJlcXVpcmVkLCBwbGVhc2UgaW5zZXJ0IGRhdGEnOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkSXRlbS0+e0lucHV0fS0+e0RhdGFUeXBlfSApIHsKICAgICAgICAgICAgJENsYXNzIC49ICIgJEpTQ2xhc3N7ICRJdGVtLT57SW5wdXR9LT57RGF0YVR5cGV9IH0iOwogICAgICAgICAgICAkRXJyb3JNZXNzYWdlID0gJ0ludmFsaWQgZGF0YSwgcGxlYXNlIGluc2VydCBhIHZhbGlkICc7CiAgICAgICAgICAgICRFcnJvck1lc3NhZ2UgLj0gIiRQcmVkZWZpbmVkRXJyb3JNZXNzYWdlc3skSXRlbS0+e0lucHV0fS0+e0RhdGFUeXBlfX0iOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZGF0YSBmcm9tIGZvcm0gb3IgZnJvbSBkYXRhYmFzZQogICAgICAgICMgU2VydmVyRXJyb3IgPSBzaG93IHRoZSB3cm9uZyBkYXRhIGluIGZvcm0KICAgICAgICAjICFTZXJ2ZXJFcnJvciA9IHNob3cgZGF0YWJhc2UgZGF0YSBvciBuZXcgZmllbGRzCgogICAgICAgIGlmICggJFBhcmFte1NlcnZlckVycm9yfSB8fCAkUGFyYW17RGF0YVR5cGVFcnJvcn0gKSB7CiAgICAgICAgICAgICRWYWx1ZSA9ICRQYXJhbXtUZW1wbGF0ZURhdGFGb3JtfS0+eyAkSXRlbS0+e0tleX0gfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRWYWx1ZSA9ICRPYmplY3REYXRhLT57ICRJdGVtLT57S2V5fSB9OwogICAgICAgIH0KCiAgICAgICAgIyBlcnJvciBhcmVhCgogICAgICAgICMgcHJlcGFyZSBkaWZmZXJlbnQgZGF0YSAmIG1lc3NhZ2UgcGVyIGVycm9yCiAgICAgICAgaWYgKCAkU2VydmVyRXJyb3J7ICRJdGVtLT57TmFtZX0gfSB8fCAkRGF0YVR5cGVFcnJvcnsgJEl0ZW0tPntOYW1lfSB9ICkgewogICAgICAgICAgICAkQ2xhc3MgLj0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBmb3JtIGlucHV0CiAgICAgICAgbXkgJElucHV0U3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JbXBvcnRFeHBvcnRGb3JtSW5wdXRDcmVhdGUoCiAgICAgICAgICAgIEl0ZW0gID0+ICRJdGVtLAogICAgICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZSwKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIGlkCiAgICAgICAgbXkgJElEOwogICAgICAgIGlmICggJEl0ZW0tPntQcmVmaXh9ICkgewogICAgICAgICAgICAkSUQgPSAiJEl0ZW0tPntQcmVmaXh9JEl0ZW0tPntLZXl9IjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRJRCA9ICRJdGVtLT57S2V5fTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGF0dHJpYnV0ZSByb3cKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZUVkaXQyRWxlbWVudCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSA9PiAkSXRlbS0+e05hbWV9IHx8ICcnLAogICAgICAgICAgICAgICAgSW5wdXRTdHJnICAgID0+ICRJbnB1dFN0cmluZywKICAgICAgICAgICAgICAgIElEICAgICAgICAgICA9PiAkSUQsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gJEVycm9yTWVzc2FnZSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IGhlYWRlciBhbmQgbmF2YmFyCiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkltcG9ydEV4cG9ydCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICApOwoKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgIHJldHVybiAkT3V0cHV0OwoKfQoKc3ViIF9NYXNrVGVtcGxhdGVFZGl0MyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVTZXJ2ZXJFcnJvcjsKICAgIGlmICggJFBhcmFte1NlcnZlckVycm9yfSApIHsKICAgICAgICAlU2VydmVyRXJyb3IgPSAleyAkUGFyYW17U2VydmVyRXJyb3J9IH07CiAgICB9CgogICAgbXkgJFRlbXBsYXRlSUQ7CiAgICBpZiAoICRQYXJhbXtUZW1wbGF0ZUlEfSApIHsKICAgICAgICAkVGVtcGxhdGVJRCA9ICRQYXJhbXtUZW1wbGF0ZUlEfTsKICAgIH0KCiAgICBpZiAoICEkVGVtcGxhdGVJRCApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ1RlbXBsYXRlIG5vdCBmb3VuZCEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgIG15ICRUZW1wbGF0ZURhdGE7CiAgICAkVGVtcGxhdGVEYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBpZiAoICEkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICdUZW1wbGF0ZSBub3QgZm91bmQhJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAkUGFyYW17QmFja1VSTH0gPSAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufTtTdWJhY3Rpb249VGVtcGxhdGVFZGl0MjtUZW1wbGF0ZUlEPSRUZW1wbGF0ZUlEIjsKCiAgICAjIG91dHB1dCBvdmVydmlldwogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25MaXN0JyApOwogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uT3ZlcnZpZXcnICk7CgogICAgIyBvdXRwdXQgbGlzdAogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZUVkaXQzJywKICAgICAgICBEYXRhID0+ICRUZW1wbGF0ZURhdGEsCiAgICApOwoKICAgICMgZ2V0IGZvcm1hdCBhdHRyaWJ1dGVzCiAgICBteSAkRm9ybWF0QXR0cmlidXRlTGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0QXR0cmlidXRlc0dldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBnZXQgZm9ybWF0IGRhdGEKICAgIG15ICRGb3JtYXREYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5Gb3JtYXREYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBpZiAoICEkRm9ybWF0RGF0YSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gJ0Zvcm1hdCBub3QgZm91bmQhJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIG91dHB1dCBmb3JtYXQgYXR0cmlidXRlcwogICAgZm9yIG15ICRJdGVtICggQHskRm9ybWF0QXR0cmlidXRlTGlzdH0gKSB7CgogICAgICAgICMgYnVpbGQgaWQKICAgICAgICBteSAkSUQ7CiAgICAgICAgaWYgKCAkSXRlbS0+e1ByZWZpeH0gKSB7CiAgICAgICAgICAgICRJRCA9ICIkSXRlbS0+e1ByZWZpeH0kSXRlbS0+e0tleX0iOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJElEID0gIiRJdGVtLT57S2V5fSI7CiAgICAgICAgfQoKICAgICAgICBteSAkQ2xhc3MgPSAnICc7CiAgICAgICAgaWYgKCAkSXRlbS0+e0lucHV0fS0+e1JlcXVpcmVkfSApIHsKICAgICAgICAgICAgJENsYXNzID0gJ1ZhbGlkYXRlX1JlcXVpcmVkICc7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRTZXJ2ZXJFcnJvcnsgJEl0ZW0tPntOYW1lfSB9ICkgewogICAgICAgICAgICAkQ2xhc3MgLj0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBmb3JtIGlucHV0CiAgICAgICAgbXkgJElucHV0U3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JbXBvcnRFeHBvcnRGb3JtSW5wdXRDcmVhdGUoCiAgICAgICAgICAgIEl0ZW0gID0+ICRJdGVtLAogICAgICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgICAgIFZhbHVlID0+ICRGb3JtYXREYXRhLT57ICRJdGVtLT57S2V5fSB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGF0dHJpYnV0ZSByb3cKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZUVkaXQzRWxlbWVudCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSA9PiAkSXRlbS0+e05hbWV9IHx8ICcnLAogICAgICAgICAgICAgICAgSW5wdXRTdHJnID0+ICRJbnB1dFN0cmluZywKICAgICAgICAgICAgICAgIElEICAgICAgICA9PiAkSUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgcmVxdWlyZWQgbm90aWNlCiAgICAgICAgaWYgKCAkSXRlbS0+e0lucHV0fS0+e1JlcXVpcmVkfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDNFbGVtZW50UmVxdWlyZWQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkSXRlbS0+e05hbWV9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgIElEID0+ICRJRCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgb3V0cHV0IGhlYWRlciBhbmQgbmF2YmFyCiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkltcG9ydEV4cG9ydCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICApOwoKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgIHJldHVybiAkT3V0cHV0OwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JbXBvcnRFeHBvcnRMYXlvdXRDaGVja2JveC5wbSAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE0IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydExheW91dENoZWNrYm94OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnRMYXlvdXRDaGVja2JveCAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBmb3IgY2hlY2tib3ggZWxlbWVudHMgaW4gaW1wb3J0L2V4cG9ydC4KCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SW1wb3J0RXhwb3J0TGF5b3V0Q2hlY2tib3gtPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFBhcmFtT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIEZvcm1JbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+Rm9ybUlucHV0Q3JlYXRlKAogICAgICAgIEl0ZW0gICA9PiAkSXRlbVJlZiwKICAgICAgICBQcmVmaXggPT4gJ1ByZWZpeDo6JywgICMgKG9wdGlvbmFsKQogICAgICAgIFZhbHVlICA9PiAnVmFsdWUnLCAgICAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEZvcm1JbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEl0ZW0hJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAkUGFyYW17UHJlZml4fSB8fD0gJyc7CgogICAgbXkgJENoZWNrZWQgPSAkUGFyYW17VmFsdWV9ID8gJ2NoZWNrZWQ9ImNoZWNrZWQiJyA6ICcnOwoKICAgIHJldHVybgogICAgICAgIHFxezxpbnB1dCBpZD0iJFBhcmFte1ByZWZpeH0kUGFyYW17SXRlbX0tPntLZXl9IiB0eXBlPSJjaGVja2JveCIgbmFtZT0iJFBhcmFte1ByZWZpeH0kUGFyYW17SXRlbX0tPntLZXl9IiAkQ2hlY2tlZCAvPn07Cn0KCj1pdGVtIEZvcm1EYXRhR2V0KCkKCmdldCBmb3JtIGRhdGEKCiAgICBteSAkRm9ybURhdGEgPSAkQmFja2VuZE9iamVjdC0+Rm9ybURhdGFHZXQoCiAgICAgICAgSXRlbSAgID0+ICRJdGVtUmVmLAogICAgICAgIFByZWZpeCA9PiAnUHJlZml4OjonLCAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSXRlbSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICRQYXJhbXtQcmVmaXh9IHx8PSAnJzsKCiAgICAjIGdldCBmb3JtIGRhdGEKICAgIG15ICRGb3JtRGF0YSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSgKICAgICAgICBQYXJhbSA9PiAkUGFyYW17UHJlZml4fSAuICRQYXJhbXtJdGVtfS0+e0tleX0sCiAgICApOwoKICAgIHJldHVybiAkRm9ybURhdGE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JbXBvcnRFeHBvcnRMYXlvdXREVEwucG0gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnRMYXlvdXREVEw7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydExheW91dERUTCAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBmb3IgZGlzcGxheSBEVEwgY29kZQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnRMYXlvdXREVEwtPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFBhcmFtT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIEZvcm1JbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+Rm9ybUlucHV0Q3JlYXRlKAogICAgICAgIEl0ZW0gICA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybUlucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBJdGVtIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e0RhdGF9Owp9Cgo9aXRlbSBGb3JtRGF0YUdldCgpCgpnZXQgZm9ybSBkYXRhCgogICAgbXkgJEZvcm1EYXRhID0gJEJhY2tlbmRPYmplY3QtPkZvcm1EYXRhR2V0KCk7Cgo9Y3V0CgpzdWIgRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm47Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JbXBvcnRFeHBvcnRMYXlvdXRTZWxlY3Rpb24ucG0gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnRMYXlvdXRTZWxlY3Rpb247Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydExheW91dFNlbGVjdGlvbiAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBmb3Igc2VsZWN0aW9uIGVsZW1lbnRzCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydExheW91dFNlbGVjdGlvbi0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgUGFyYW1PYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gRm9ybUlucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtSW5wdXRDcmVhdGUoCiAgICAgICAgSXRlbSAgID0+ICRJdGVtUmVmLAogICAgICAgIFByZWZpeCA9PiAnUHJlZml4OjonLCAgIyAob3B0aW9uYWwpCiAgICAgICAgVmFsdWUgID0+ICdWYWx1ZScsICAgICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybUlucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBJdGVtIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCB2YWx1ZQogICAgJFBhcmFte1ByZWZpeH0gfHw9ICcnOwogICAgJFBhcmFte1ZhbHVlfSAgfHw9ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlRGVmYXVsdH07CgogICAgaWYgKCAkUGFyYW17VmFsdWV9ICYmICRQYXJhbXtWYWx1ZX0gPX4gbXsgIyMjIyMgfXhtcyApIHsKICAgICAgICBteSBAVmFsdWVzID0gc3BsaXQgJyMjIyMjJywgJFBhcmFte1ZhbHVlfTsKICAgICAgICAkUGFyYW17VmFsdWV9ID0gXEBWYWx1ZXM7CiAgICB9CgogICAgIyBnZW5lcmF0ZSBvcHRpb24gc3RyaW5nCiAgICBteSAkU3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBJRCAgICAgICAgICAgPT4gJFBhcmFte1ByZWZpeH0gLiAkUGFyYW17SXRlbX0tPntLZXl9LAogICAgICAgIENsYXNzICAgICAgICA9PiAkUGFyYW17Q2xhc3N9LAogICAgICAgIE5hbWUgICAgICAgICA9PiAkUGFyYW17UHJlZml4fSAuICRQYXJhbXtJdGVtfS0+e0tleX0sCiAgICAgICAgRGF0YSAgICAgICAgID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e0RhdGF9IHx8IHt9LAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17VmFsdWV9LAogICAgICAgIFRyYW5zbGF0aW9uICA9PiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntUcmFuc2xhdGlvbn0sCiAgICAgICAgUG9zc2libGVOb25lID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1Bvc3NpYmxlTm9uZX0sCiAgICAgICAgTXVsdGlwbGUgICAgID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e011bHRpcGxlfSwKICAgICAgICBTaXplICAgICAgICAgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57U2l6ZX0sCiAgICApOwoKICAgIHJldHVybiAkU3RyaW5nOwp9Cgo9aXRlbSBGb3JtRGF0YUdldCgpCgpnZXQgZm9ybSBkYXRhCgogICAgbXkgJEZvcm1EYXRhID0gJEJhY2tlbmRPYmplY3QtPkZvcm1EYXRhR2V0KAogICAgICAgIEl0ZW0gICA9PiAkSXRlbVJlZiwKICAgICAgICBQcmVmaXggPT4gJ1ByZWZpeDo6JywgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBGb3JtRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgSXRlbSEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICRQYXJhbXtQcmVmaXh9IHx8PSAnJzsKCiAgICAjIGdldCBmb3JtIGRhdGEKICAgIG15IEBGb3JtRGF0YXMgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoCiAgICAgICAgUGFyYW0gPT4gJFBhcmFte1ByZWZpeH0gLiAkUGFyYW17SXRlbX0tPntLZXl9LAogICAgKTsKCiAgICBteSAkRm9ybURhdGEgPSBqb2luICcjIyMjIycsIEBGb3JtRGF0YXM7CgogICAgcmV0dXJuICRGb3JtRGF0YSBpZiAkRm9ybURhdGE7CiAgICByZXR1cm4gJEZvcm1EYXRhIGlmICEkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZXF1aXJlZH07CgogICAgIyBzZXQgaW52YWxpZCBwYXJhbQogICAgJFBhcmFte0l0ZW19LT57Rm9ybX0tPntJbnZhbGlkfSA9IDE7CgogICAgcmV0dXJuICRGb3JtRGF0YTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JbXBvcnRFeHBvcnRMYXlvdXRUZXh0LnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTQgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SW1wb3J0RXhwb3J0TGF5b3V0VGV4dDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SW1wb3J0RXhwb3J0TGF5b3V0VGV4dCAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBmb3IgdGV4dCBlbGVtZW50cwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnRMYXlvdXRUZXh0LT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCBQYXJhbU9iamVjdCBMYXlvdXRPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBGb3JtSW5wdXRDcmVhdGUoKQoKY3JlYXRlIGEgaW5wdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkZvcm1JbnB1dENyZWF0ZSgKICAgICAgICBJdGVtICAgPT4gJEl0ZW1SZWYsCiAgICAgICAgUHJlZml4ID0+ICdQcmVmaXg6OicsICAjIChvcHRpb25hbCkKICAgICAgICBWYWx1ZSAgPT4gJ1ZhbHVlJywgICAgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBGb3JtSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0l0ZW19ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIEl0ZW0hJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAkUGFyYW17UHJlZml4fSB8fD0gJyc7CgogICAgbXkgJFZhbHVlID0gJFBhcmFte1ZhbHVlfSB8fCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZURlZmF1bHR9OwogICAgbXkgJFNpemUgPSAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntTaXplfSB8fCA0MDsKICAgIG15ICRTaXplQ2xhc3M7CiAgICBpZiAoICRTaXplIDwgMTUgKSB7CiAgICAgICAgJFNpemVDbGFzcyA9ICdXMTBwYyc7CiAgICB9CiAgICBlbHNpZiAoICRTaXplIDwgMzUgKSB7CiAgICAgICAgJFNpemVDbGFzcyA9ICdXMzNwYyc7CiAgICB9CiAgICBlbHNpZiAoICRTaXplIDwgNTAgKSB7CiAgICAgICAgJFNpemVDbGFzcyA9ICdXNTBwYyc7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2l6ZUNsYXNzID0gJ1c3NXBjJzsKICAgIH0KCiAgICAjIHByZXBhcmUgZGF0YQogICAgbXkgJElEID0gKCAkUGFyYW17UHJlZml4fSB8fCAnJyApIC4gKCAkUGFyYW17SXRlbX0tPntLZXl9ICk7CiAgICBteSAkTmFtZSA9ICggJFBhcmFte1ByZWZpeH0gfHwgJycgKSAuICggJFBhcmFte05hbWV9IHx8ICRJRCApOwogICAgbXkgJENsYXNzID0gKCAkU2l6ZUNsYXNzIHx8ICcnICkgLiAoICRQYXJhbXtDbGFzc30gfHwgJycgKTsKCiAgICBteSAkU3RyaW5nCiAgICAgICAgPSAiPGlucHV0IGlkPVwiJElEXCIgdHlwZT1cInRleHRcIiBuYW1lPVwiJE5hbWVcIiBjbGFzcz1cIiRDbGFzc1wiICI7CgogICAgaWYgKCRWYWx1ZSkgewoKICAgICAgICAjIHRyYW5zbGF0ZQogICAgICAgIGlmICggJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHJhbnNsYXRpb259ICkgewogICAgICAgICAgICAkVmFsdWUgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgkVmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgIyB0cmFuc2Zvcm0gYXNjaWkgdG8gaHRtbAogICAgICAgICRWYWx1ZSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICAgICAgVGV4dCAgICAgICAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgICAgICk7CgogICAgICAgICRTdHJpbmcgLj0gInZhbHVlPVwiJFZhbHVlXCIgIjsKICAgIH0KCiAgICAjIGFkZCBtYXhpbXVtIGxlbmd0aAogICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntNYXhMZW5ndGh9ICkgewogICAgICAgICRTdHJpbmcgLj0gIm1heGxlbmd0aD1cIiRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e01heExlbmd0aH1cIiAiOwogICAgfQoKICAgICRTdHJpbmcgLj0gIi8+ICI7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCj1pdGVtIEZvcm1EYXRhR2V0KCkKCmdldCBmb3JtIGRhdGEKCiAgICBteSAkRm9ybURhdGEgPSAkQmFja2VuZE9iamVjdC0+Rm9ybURhdGFHZXQoCiAgICAgICAgSXRlbSAgID0+ICRJdGVtUmVmLAogICAgICAgIFByZWZpeCA9PiAnUHJlZml4OjonLCAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBJdGVtIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJFBhcmFte1ByZWZpeH0gfHw9ICcnOwoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgbXkgJEZvcm1EYXRhID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKAogICAgICAgIFBhcmFtID0+ICRQYXJhbXtQcmVmaXh9IC4gJFBhcmFte0l0ZW19LT57S2V5fSwKICAgICk7CgogICAgIyByZWdleCBjaGVjawogICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZWdleH0gJiYgJEZvcm1EYXRhICF+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1JlZ2V4fSApIHsKCiAgICAgICAgJFBhcmFte0l0ZW19LT57Rm9ybX0tPntJbnZhbGlkfSA9IDE7CiAgICAgICAgcmV0dXJuICRGb3JtRGF0YTsKICAgIH0KCiAgICByZXR1cm4gJEZvcm1EYXRhIGlmICRGb3JtRGF0YTsKICAgIHJldHVybiAkRm9ybURhdGEgaWYgISRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1JlcXVpcmVkfTsKCiAgICAjIHNldCBpbnZhbGlkIHBhcmFtCiAgICAkUGFyYW17SXRlbX0tPntGb3JtfS0+e0ludmFsaWR9ID0gMTsKCiAgICByZXR1cm4gJEZvcm1EYXRhOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKEw8aHR0cDovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MYXlvdXRJbXBvcnRFeHBvcnQucG0gLSBwcm92aWRlcyBnZW5lcmljIEhUTUwgb3V0cHV0IGZvciBJbXBvcnRFeHBvcnQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXRJbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgo9b3ZlcgoKPWl0ZW0gSW1wb3J0RXhwb3J0Rm9ybUlucHV0Q3JlYXRlKCkKCnJldHVybnMgYSBpbnB1dCBmaWVsZCBodG1sIHN0cmluZwoKICAgIG15ICRTdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5JbXBvcnRFeHBvcnRGb3JtSW5wdXRDcmVhdGUoCiAgICAgICAgSXRlbSAgPT4gJEl0ZW1SZWYsCiAgICAgICAgVmFsdWUgPT4gJ1ZhbHVlJywgICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0RXhwb3J0Rm9ybUlucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSXRlbSEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFNlbGYtPl9JbXBvcnRFeHBvcnRMb2FkTGF5b3V0QmFja2VuZCgKICAgICAgICBUeXBlID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1R5cGV9LAogICAgKTsKCiAgICByZXR1cm4gJycgaWYgISRCYWNrZW5kT2JqZWN0OwoKICAgICMgbG9va3VwIGl0ZW0gdmFsdWUKICAgIG15ICRTdHJpbmcgPSAkQmFja2VuZE9iamVjdC0+Rm9ybUlucHV0Q3JlYXRlKCVQYXJhbSk7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCj1pdGVtIEltcG9ydEV4cG9ydEZvcm1EYXRhR2V0KCkKCnJldHVybnMgdGhlIHZhbHVlcyBmcm9tIHRoZSBodG1sIGZvcm0gYXMgaGFzaCByZWZlcmVuY2UKCiAgICBteSAkRm9ybURhdGEgPSAkTGF5b3V0T2JqZWN0LT5JbXBvcnRFeHBvcnRGb3JtRGF0YUdldCgKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnRFeHBvcnRGb3JtRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgSXRlbSEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fSW1wb3J0RXhwb3J0TG9hZExheW91dEJhY2tlbmQoCiAgICAgICAgVHlwZSA9PiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntUeXBlfSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQmFja2VuZE9iamVjdDsKCiAgICAjIGdldCBmb3JtIGRhdGEKICAgIG15ICRGb3JtRGF0YSA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtRGF0YUdldCglUGFyYW0pOwoKICAgIHJldHVybiAkRm9ybURhdGE7Cn0KCj1pdGVtIF9JbXBvcnRFeHBvcnRMb2FkTGF5b3V0QmFja2VuZCgpCgp0byBsb2FkIGEgaW1wb3J0L2V4cG9ydCBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCiAgICBteSAkQmFja2VuZCA9ICRMYXlvdXRPYmplY3QtPl9JbXBvcnRFeHBvcnRMb2FkTGF5b3V0QmFja2VuZCgKICAgICAgICBUeXBlID0+ICdTZWxlY3Rpb24nLAogICAgKTsKCkFuIGluc3RhbmNlIG9mIHRoZSBsb2FkZWQgYmFja2VuZCBtb2R1bGUgaXMgcmV0dXJuZWQuCgo9Y3V0CgpzdWIgX0ltcG9ydEV4cG9ydExvYWRMYXlvdXRCYWNrZW5kIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAhJFBhcmFte1R5cGV9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBUeXBlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydExheW91dCRQYXJhbXtUeXBlfSI7CgogICAgIyBsb2FkIHRoZSBiYWNrZW5kIG1vZHVsZQogICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkR2VuZXJpY01vZHVsZSkgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBsb2FkIGJhY2tlbmQgbW9kdWxlICRQYXJhbXtUeXBlfSEiCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgbmV3IGluc3RhbmNlCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRHZW5lcmljTW9kdWxlLT5uZXcoCiAgICAgICAgJXskU2VsZn0sCiAgICAgICAgJVBhcmFtLAogICAgICAgIExheW91dE9iamVjdCA9PiAkU2VsZiwKICAgICk7CgogICAgaWYgKCAhJEJhY2tlbmRPYmplY3QgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgYmFja2VuZCBtb2R1bGUgJFBhcmFte1R5cGV9ISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuICRCYWNrZW5kT2JqZWN0Owp9CgoxOwoKPWJhY2sK
IyAtLQojIEFBQUltcG9ydEV4cG9ydC50dCAtICRUZXh0IHZhcmlhYmxlIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgojIENvbW1vbgpbJSBUcmFuc2xhdGUoIkFkZCBtYXBwaW5nIHRlbXBsYXRlIikgfCBodG1sICVdClslIFRyYW5zbGF0ZSgiQ2hhcnNldCIpIHwgaHRtbCAlXQpbJSBUcmFuc2xhdGUoIkNvbG9uICg6KSIpIHwgaHRtbCAlXQpbJSBUcmFuc2xhdGUoIkNvbHVtbiIpIHwgaHRtbCAlXQpbJSBUcmFuc2xhdGUoIkNvbHVtbiBTZXBhcmF0b3IiKSB8IGh0bWwgJV0KWyUgVHJhbnNsYXRlKCJEb3QgKC4pIikgfCBodG1sICVdClslIFRyYW5zbGF0ZSgiU2VtaWNvbG9uICg7KSIpIHwgaHRtbCAlXQpbJSBUcmFuc2xhdGUoIlRhYnVsYXRvciAoVEFCKSIpIHwgaHRtbCAlXQpbJSBUcmFuc2xhdGUoIkluY2x1ZGUgQ29sdW1uIEhlYWRlcnMiKSB8IGh0bWwgJV0KWyUgVHJhbnNsYXRlKCJJbXBvcnQgc3VtbWFyeSBmb3IiKSB8IGh0bWwgJV0KWyUgVHJhbnNsYXRlKCJJbXBvcnRlZCByZWNvcmRzIikgfCBodG1sICVdClslIFRyYW5zbGF0ZSgiRXhwb3J0ZWQgcmVjb3JkcyIpIHwgaHRtbCAlXQpbJSBUcmFuc2xhdGUoIlJlY29yZHMiKSB8IGh0bWwgJV0KWyUgVHJhbnNsYXRlKCJTa2lwcGVkIikgfCBodG1sICVdCg==
IyAtLQojIEFkbWluSW1wb3J0RXhwb3J0LnR0IC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZG1pbkltcG9ydEV4cG9ydAojIENvcHlyaWdodCAoQykgMjAwMS0yMDE0IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3IikgJV0KPGRpdiBjbGFzcz0iTWFpbkJveCBBUklBUm9sZU1haW4gTGF5b3V0Rml4ZWRTaWRlYmFyIFNpZGViYXJGaXJzdCI+CiAgICA8aDE+WyUgVHJhbnNsYXRlKCJJbXBvcnQvRXhwb3J0IE1hbmFnZW1lbnQiKSB8IGh0bWwgJV08L2gxPgoKICAgIDxkaXYgY2xhc3M9IlNpZGViYXJDb2x1bW4iPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQWN0aW9uTGlzdCIpICVdCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkFjdGlvbnMiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IkFjdGlvbkxpc3QiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBY3Rpb25PdmVydmlldyIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXSIgY2xhc3M9IkNhbGxGb3JBY3Rpb24iPjxzcGFuPlslIFRyYW5zbGF0ZSgiR28gdG8gb3ZlcnZpZXciKSB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJBY3Rpb25PdmVydmlldyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkFjdGlvbkFkZCIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtTdWJhY3Rpb249VGVtcGxhdGVFZGl0MSIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gUGx1cyI+PHNwYW4+WyUgVHJhbnNsYXRlKCJBZGQgdGVtcGxhdGUiKSB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJBY3Rpb25BZGQiKSAlXQogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJBY3Rpb25MaXN0IikgJV0KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiTm90ZSIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkNyZWF0ZSBhIHRlbXBsYXRlIHRvIGltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJDb250ZW50Q29sdW1uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld0xpc3QiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZShEYXRhLk9iamVjdE5hbWUpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRGF0YVRhYmxlIj4KICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIk51bWJlciIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJOYW1lIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIkZvcm1hdCIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJ2YWxpZCIpIHwgaHRtbCAlXS9bJSBUcmFuc2xhdGUoImludmFsaWQiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiRGVsZXRlIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIlN0YXJ0IEltcG9ydCIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJTdGFydCBFeHBvcnQiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgPHRib2R5PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJOb0RhdGFGb3VuZE1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI3Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5vIGRhdGEgZm91bmQuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiTm9EYXRhRm91bmRNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld0xpc3RSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9IkFzQmxvY2siIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1UZW1wbGF0ZUVkaXQxO1RlbXBsYXRlSUQ9WyUgRGF0YS5UZW1wbGF0ZUlEIHwgdXJpICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5OdW1iZXIgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5bJSBEYXRhLk5hbWUgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5bJSBUcmFuc2xhdGUoRGF0YS5Gb3JtYXROYW1lKSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlslIFRyYW5zbGF0ZShEYXRhLlZhbGlkKSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJUcmFzaENhbiIgdGl0bGU9IkRlbGV0ZSBUZW1wbGF0ZSIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPVRlbXBsYXRlRGVsZXRlO1RlbXBsYXRlSUQ9WyUgRGF0YS5UZW1wbGF0ZUlEIHwgdXJpICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJEZWxldGUgVGVtcGxhdGUiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1JbXBvcnRJbmZvcm1hdGlvbjtUZW1wbGF0ZUlEPVslIERhdGEuVGVtcGxhdGVJRCB8IHVyaSAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiSW1wb3J0IikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtTdWJhY3Rpb249RXhwb3J0O1RlbXBsYXRlSUQ9WyUgRGF0YS5UZW1wbGF0ZUlEIHwgdXJpICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJFeHBvcnQiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdMaXN0Um93IikgJV0KICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld0xpc3QiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGVtcGxhdGVFZGl0MSIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJTdGVwIikgfCBodG1sICVdIDEgWyUgVHJhbnNsYXRlKCJvZiIpIHwgaHRtbCAlXSA1IC0gWyUgVHJhbnNsYXRlKCJFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbiIpIHwgaHRtbCAlXTo8L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iIC8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iVGVtcGxhdGVFZGl0MSIgLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUZW1wbGF0ZUlEIiB2YWx1ZT0iWyUgRGF0YS5UZW1wbGF0ZUlEICVdIiAvPgoKICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJOYW1lIj5bJSBUcmFuc2xhdGUoIk5hbWUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgoKPCEtLSBWYWxpZGF0ZV9SZXF1aXJlZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iTmFtZSIgY2xhc3M9IlslIERhdGEuTmFtZUNsYXNzICVdIiB0eXBlPSJ0ZXh0IiBuYW1lPSJOYW1lIiB2YWx1ZT0iWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSIgc2l6ZT0iNTAiIG1heGxlbmd0aD0iMjAwIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iTmFtZUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJOYW1lIGlzIHJlcXVpcmVkISIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iTmFtZVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJOYW1lIGlzIHJlcXVpcmVkISIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIk5ld09iamVjdEZvcm1hdCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ik9iamVjdCI+WyUgVHJhbnNsYXRlKCJPYmplY3QiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuT2JqZWN0T3B0aW9uICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJPYmplY3RFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiT2JqZWN0IGlzIHJlcXVpcmVkISIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iT2JqZWN0U2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIk9iamVjdCBpcyByZXF1aXJlZCEiKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJGb3JtYXQiPlslIFRyYW5zbGF0ZSgiRm9ybWF0IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZvcm1hdE9wdGlvbiAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iRm9ybWF0RXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIkZvcm1hdCBpcyByZXF1aXJlZCEiKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkZvcm1hdFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJGb3JtYXQgaXMgcmVxdWlyZWQhIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk5ld09iamVjdEZvcm1hdCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkVkaXRPYmplY3RGb3JtYXQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJPYmplY3QiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+WyUgRGF0YS5PYmplY3ROYW1lIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Ik9iamVjdCIgdmFsdWU9IlslIERhdGEuT2JqZWN0IHwgaHRtbCAlXSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkZvcm1hdCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5bJSBEYXRhLkZvcm1hdE5hbWUgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRm9ybWF0IiB2YWx1ZT0iWyUgRGF0YS5Gb3JtYXQgfCBodG1sICVdIiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkVkaXRPYmplY3RGb3JtYXQiKSAlXQoKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVmFsaWRJRCI+WyUgVHJhbnNsYXRlKCJWYWxpZCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlZhbGlkT3B0aW9uU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iQ29tbWVudCI+WyUgVHJhbnNsYXRlKCJDb21tZW50IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iQ29tbWVudCIgdHlwZT0idGV4dCIgbmFtZT0iQ29tbWVudCIgdmFsdWU9IlslIERhdGEuQ29tbWVudCB8IGh0bWwgJV0iIHNpemU9IjUwIiBtYXhsZW5ndGg9IjIwMCIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSIgdHlwZT0ic3VibWl0IiBuYW1lPSJTdWJtaXROZXh0IiB2YWx1ZT0iU3VibWl0TmV4dCI+WyUgVHJhbnNsYXRlKCJOZXh0IikgfCBodG1sICVdPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIm9yIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtTdWJhY3Rpb249J092ZXJ2aWV3JyI+WyUgVHJhbnNsYXRlKCJDYW5jZWwiKSB8IGh0bWwgJV0gPC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRlbXBsYXRlRWRpdDEiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGVtcGxhdGVFZGl0MiIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJTdGVwIikgfCBodG1sICVdIDIgWyUgVHJhbnNsYXRlKCJvZiIpIHwgaHRtbCAlXSA1IC0gWyUgVHJhbnNsYXRlKCJFZGl0IG9iamVjdCBpbmZvcm1hdGlvbiIpIHwgaHRtbCAlXTo8L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iIC8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iVGVtcGxhdGVFZGl0MiIgLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUZW1wbGF0ZUlEIiB2YWx1ZT0iWyUgRGF0YS5UZW1wbGF0ZUlEIHwgaHRtbCAlXSIgLz4KCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiTmFtZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLk5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJPYmplY3QiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5PYmplY3QgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUZW1wbGF0ZUVkaXQyRWxlbWVudCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlslIERhdGEuSUQgJV0iPlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5JbnB1dFN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlslIERhdGEuSUQgJV1FcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZShEYXRhLkVycm9yTWVzc2FnZSkgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJbJSBEYXRhLklEICVdU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoRGF0YS5FcnJvck1lc3NhZ2UpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRlbXBsYXRlRWRpdDJFbGVtZW50IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJCYWNrIiB0eXBlPSJidXR0b24iIG5hbWU9IkJhY2siID5bJSBUcmFuc2xhdGUoIkJhY2siKSB8IGh0bWwgJV08L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IlByaW1hcnkiIHR5cGU9InN1Ym1pdCIgbmFtZT0iU3VibWl0TmV4dCIgdmFsdWU9IlN1Ym1pdE5leHQiID5bJSBUcmFuc2xhdGUoIk5leHQiKSB8IGh0bWwgJV08L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJUZW1wbGF0ZUVkaXQyIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlRlbXBsYXRlRWRpdDMiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiU3RlcCIpIHwgaHRtbCAlXSAzIFslIFRyYW5zbGF0ZSgib2YiKSB8IGh0bWwgJV0gNSAtIFslIFRyYW5zbGF0ZSgiRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24iKSB8IGh0bWwgJV06PC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGNsYXNzPSJWYWxpZGF0ZSBQcmV2ZW50TXVsdGlwbGVTdWJtaXRzIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJbJSBFbnYoIkFjdGlvbiIpICVdIiAvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlRlbXBsYXRlRWRpdDMiIC8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGVtcGxhdGVJRCIgdmFsdWU9IlslIERhdGEuVGVtcGxhdGVJRCB8IGh0bWwgJV0iIC8+CgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIk5hbWUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5OYW1lIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiRm9ybWF0IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRm9ybWF0IHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGVtcGxhdGVFZGl0M0VsZW1lbnQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJbJSBEYXRhLklEICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuSW5wdXRTdHJnICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlRlbXBsYXRlRWRpdDNFbGVtZW50UmVxdWlyZWQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iWyUgRGF0YS5JRCAlXUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdIFslIFRyYW5zbGF0ZSgiaXMgcmVxdWlyZWQhIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJbJSBEYXRhLklEICVdU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV0gWyUgVHJhbnNsYXRlKCJpcyByZXF1aXJlZCEiKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRlbXBsYXRlRWRpdDNFbGVtZW50UmVxdWlyZWQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRlbXBsYXRlRWRpdDNFbGVtZW50IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJCYWNrIiB0eXBlPSJidXR0b24iIG5hbWU9IkJhY2siID5bJSBUcmFuc2xhdGUoIkJhY2siKSB8IGh0bWwgJV08L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IlByaW1hcnkiIHR5cGU9InN1Ym1pdCIgbmFtZT0iU3VibWl0TmV4dCIgdmFsdWU9IlN1Ym1pdE5leHQiPlslIFRyYW5zbGF0ZSgiTmV4dCIpIHwgaHRtbCAlXTwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRlbXBsYXRlRWRpdDMiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGVtcGxhdGVFZGl0NCIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJTdGVwIikgfCBodG1sICVdIDQgWyUgVHJhbnNsYXRlKCJvZiIpIHwgaHRtbCAlXSA1IC0gWyUgVHJhbnNsYXRlKCJFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24iKSB8IGh0bWwgJV06PC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iTWFwSGVhZGVyUm93IFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIk5hbWUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5OYW1lIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiT2JqZWN0IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuT2JqZWN0TmFtZSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkZvcm1hdCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZvcm1hdE5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iIC8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iVGVtcGxhdGVTYXZlNCIgLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUZW1wbGF0ZUlEIiB2YWx1ZT0iWyUgRGF0YS5UZW1wbGF0ZUlEIHwgaHRtbCAlXSIgLz4KICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9IkRhdGFUYWJsZSBTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUZW1wbGF0ZUVkaXQ0VGFibGVIZWFkZXIiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iQ2VudGVyIj5bJSBUcmFuc2xhdGUoRGF0YS5IZWFkZXIpIHwgaHRtbCAlXTwvdGg+ClslIFJlbmRlckJsb2NrRW5kKCJUZW1wbGF0ZUVkaXQ0VGFibGVIZWFkZXIiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUZW1wbGF0ZUVkaXQ0Tm9NYXBGb3VuZCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IlslIERhdGEuQ29sdW1ucyAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiTm8gbWFwIGVsZW1lbnRzIGZvdW5kLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGVtcGxhdGVFZGl0NE5vTWFwRm91bmQiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGVtcGxhdGVFZGl0NFJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlRlbXBsYXRlRWRpdDRDb2x1bW4iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iQ2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5JbnB1dFN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGVtcGxhdGVFZGl0NENvbHVtbiIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlRlbXBsYXRlRWRpdDRNYXBOdW1iZXJDb2x1bW4iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iQ2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5JbnB1dFN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGVtcGxhdGVFZGl0NE1hcE51bWJlckNvbHVtbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJDZW50ZXIiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUZW1wbGF0ZUVkaXQ0VXBCdXR0b24iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJBcnJvd1VwInR5cGU9InN1Ym1pdCIgbmFtZT0iTWFwcGluZ1VwOjpbJSBEYXRhLk1hcHBpbmdJRCB8IGh0bWwgJV0iIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlVwIikgfCBodG1sICVdIj4gWyUgVHJhbnNsYXRlKCJVcCIpIHwgaHRtbCAlXSA8L2J1dHRvbj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRlbXBsYXRlRWRpdDRVcEJ1dHRvbiIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlRlbXBsYXRlRWRpdDROb1VwQnV0dG9uIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iQXJyb3dVcCIgdHlwZT0ic3VibWl0IiBkaXNhYmxlZD0iZGlzYWJsZWQiPiBbJSBUcmFuc2xhdGUoIlVwIikgfCBodG1sICVdPC9idXR0b24+ClslIFJlbmRlckJsb2NrRW5kKCJUZW1wbGF0ZUVkaXQ0Tm9VcEJ1dHRvbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IkNlbnRlciI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlRlbXBsYXRlRWRpdDREb3duQnV0dG9uIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iQXJyb3dEb3duIiB0eXBlPSJzdWJtaXQiIG5hbWU9Ik1hcHBpbmdEb3duOjpbJSBEYXRhLk1hcHBpbmdJRCB8IGh0bWwgJV0iIHZhbHVlPSJbJSBUcmFuc2xhdGUoIkRvd24iKSB8IGh0bWwgJV0iPiBbJSBUcmFuc2xhdGUoIkRvd24iKSB8IGh0bWwgJV08L2J1dHRvbj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRlbXBsYXRlRWRpdDREb3duQnV0dG9uIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGVtcGxhdGVFZGl0NE5vRG93bkJ1dHRvbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IkFycm93RG93biIgdHlwZT0ic3VibWl0IiBkaXNhYmxlZD0iZGlzYWJsZWQiPiBbJSBUcmFuc2xhdGUoIkRvd24iKSB8IGh0bWwgJV08L2J1dHRvbj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRlbXBsYXRlRWRpdDROb0Rvd25CdXR0b24iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJDZW50ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJUcmFzaENhbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJNYXBwaW5nRGVsZXRlOjpbJSBEYXRhLk1hcHBpbmdJRCB8IGh0bWwgJV0iIHZhbHVlPSJbJSBUcmFuc2xhdGUoIkRlbGV0ZSIpIHwgaHRtbCAlXSI+IFslIFRyYW5zbGF0ZSgiRGVsZXRlIikgfCBodG1sICVdIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGVtcGxhdGVFZGl0NFJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXMTAwcGMgU3BhY2luZ1RvcFNtYWxsIExlZnQiPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJDYWxsRm9yQWN0aW9uIFBsdXMiIGlkPSJNYXBwaW5nQWRkIiB0eXBlPSJzdWJtaXQiIG5hbWU9Ik1hcHBpbmdBZGQiIHZhbHVlPSJbJSBUcmFuc2xhdGUoIkFkZCIpIHwgaHRtbCAlXSI+PHNwYW4+IFslIFRyYW5zbGF0ZSgiQWRkIE1hcHBpbmcgRWxlbWVudCIpIHwgaHRtbCAlXTwvc3Bhbj4gPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgbmFtZT0iU3VibWl0QmFjayIgdmFsdWU9IlN1Ym1pdEJhY2siPlslIFRyYW5zbGF0ZSgiQmFjayIpIHwgaHRtbCAlXTwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJQcmltYXJ5IiB0eXBlPSJzdWJtaXQiIG5hbWU9IlN1Ym1pdE5leHQiIHZhbHVlPSJTdWJtaXROZXh0Ij5bJSBUcmFuc2xhdGUoIk5leHQiKSB8IGh0bWwgJV08L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPC9kaXY+CgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwoKICAgIC8vIGZpbmQgdGhlIG5leHQgYnV0dG9uIGFuZCBnZXQgdGhlIGZpcnN0IGNvbHVtbiBkcm9wZG93bgogICAgdmFyICROZXh0QnV0dG9uID0gJCgiYnV0dG9uLlByaW1hcnlbbmFtZT0nU3VibWl0TmV4dCddIikuZmlyc3QoKSwKICAgICAgICAkRmlyc3RDb2x1bW4gPSAkKCcjT2JqZWN0XFw6XFw6MFxcOlxcOktleScpOwoKICAgIC8vIGhhbmRsZSBjaGFuZ2VzIHRvIHRoZSBmaXJzdCBjb2x1bW4gc2VsZWN0b3IKICAgICRGaXJzdENvbHVtbi5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKCiAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY29sdW1uIHdpdGggYSB2YWx1ZQogICAgaWYgKCAkRmlyc3RDb2x1bW4udmFsKCkgKSB7CiAgICAgICAgLy8gd2UgcmVtb3ZlIHRoZSBkaXNhYmxlZCBhdHRyaWJ1dGUKICAgICAgICAkTmV4dEJ1dHRvbi5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgLy8gd2UgYWRkIHRoZSBkaXNhYmxlZCBhdHRyaWJ1dGUKICAgICAgICAkTmV4dEJ1dHRvbi5hdHRyKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOwogICAgfQoKfSkudHJpZ2dlcignY2hhbmdlJyk7CgovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KClslIFJlbmRlckJsb2NrRW5kKCJUZW1wbGF0ZUVkaXQ0IikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlRlbXBsYXRlRWRpdDUiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiU3RlcCIpIHwgaHRtbCAlXSA1IFslIFRyYW5zbGF0ZSgib2YiKSB8IGh0bWwgJV0gNSAtIFslIFRyYW5zbGF0ZSgiRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24iKSB8IGh0bWwgJV06PC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGNsYXNzPSJWYWxpZGF0ZSBQcmV2ZW50TXVsdGlwbGVTdWJtaXRzIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJbJSBFbnYoIkFjdGlvbiIpICVdIiAvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlRlbXBsYXRlU2F2ZTUiIC8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGVtcGxhdGVJRCIgdmFsdWU9IlslIERhdGEuVGVtcGxhdGVJRCB8IGh0bWwgJV0iIC8+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJUZW1wbGF0ZSBOYW1lIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTmFtZSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlJlc3RyaWN0RXhwb3J0Ij5bJSBUcmFuc2xhdGUoIlJlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdCb3R0b20iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5SZXN0cmljdEV4cG9ydFN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIlRlbXBsYXRlRWRpdDVFbGVtZW50IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iWyUgRGF0YS5JRCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLklucHV0U3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRlbXBsYXRlRWRpdDVFbGVtZW50IikgJV0KCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIG5hbWU9IlN1Ym1pdEJhY2siIHZhbHVlPSJTdWJtaXRCYWNrIj5bJSBUcmFuc2xhdGUoIkJhY2siKSB8IGh0bWwgJV08L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IlByaW1hcnkiIHR5cGU9InN1Ym1pdCIgbmFtZT0iU3VibWl0TmV4dCIgdmFsdWU9IlN1Ym1pdE5leHQiPlslIFRyYW5zbGF0ZSgiRmluaXNoIikgfCBodG1sICVdPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGVtcGxhdGVFZGl0NSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbXBvcnRJbmZvcm1hdGlvbiIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJJbXBvcnQgaW5mb3JtYXRpb24iKSB8IGh0bWwgJV06PC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIGNsYXNzPSJWYWxpZGF0ZSBQcmV2ZW50TXVsdGlwbGVTdWJtaXRzIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJbJSBFbnYoIkFjdGlvbiIpICVdIiAvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IkltcG9ydCIgLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUZW1wbGF0ZUlEIiB2YWx1ZT0iWyUgRGF0YS5UZW1wbGF0ZUlEIHwgaHRtbCAlXSIgLz4KCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU291cmNlRmlsZSI+WyUgVHJhbnNsYXRlKCJOYW1lIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTmFtZSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlNvdXJjZUZpbGUiPlslIFRyYW5zbGF0ZSgiU291cmNlIEZpbGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImZpbGUiIG5hbWU9IlNvdXJjZUZpbGUiIHNpemU9IjQwIiBjbGFzcz0iZml4ZWQiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IlByaW1hcnkiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiU3RhcnQgSW1wb3J0IikgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoIlN0YXJ0IEltcG9ydCIpIHwgaHRtbCAlXTwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkltcG9ydEluZm9ybWF0aW9uIikgJV0KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQogICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAgICAgJCgnYnV0dG9uLkJhY2snKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgbG9jYXRpb24uaHJlZiA9ICJbJSBFbnYoIkJhc2VsaW5rIikgJV1bJSBEYXRhLkJhY2tVUkwgfCBodG1sICVdIjsKICAgICAgICB9KTsKICAgIC8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQoKWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKCiAgICBDb3JlLkZvcm0uVmFsaWRhdGUuQWRkTWV0aG9kKCJWYWxpZGF0ZV9OdW1iZXJCaWdnZXJUaGFuWmVybyIsIGZ1bmN0aW9uKFZhbHVlLCBFbGVtZW50KSB7CiAgICAgICAgdmFyIE51bWJlciA9IHBhcnNlSW50KFZhbHVlLCAxMCk7CiAgICAgICAgaWYgKGlzTmFOKE51bWJlcikpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgaWYgKE51bWJlciA+IDApIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKCiAgICB9KTsKCiAgICBDb3JlLkZvcm0uVmFsaWRhdGUuQWRkTWV0aG9kKCJWYWxpZGF0ZV9OdW1iZXJJbnRlZ2VyIiwgZnVuY3Rpb24oVmFsdWUsIEVsZW1lbnQpIHsKICAgICAgICByZXR1cm4gKFZhbHVlLm1hdGNoKC9eWzAtOV0rJC8pKSA/IHRydWUgOiBmYWxzZTsKCiAgICB9KTsKCiAgICBDb3JlLkZvcm0uVmFsaWRhdGUuQWRkUnVsZSgiVmFsaWRhdGVfTnVtYmVyQmlnZ2VyVGhhblplcm8iLCB7IFZhbGlkYXRlX051bWJlckJpZ2dlclRoYW5aZXJvOiB0cnVlIH0pOwogICAgQ29yZS5Gb3JtLlZhbGlkYXRlLkFkZFJ1bGUoIlZhbGlkYXRlX051bWJlckludGVnZXIiLCB7IFZhbGlkYXRlX051bWJlckludGVnZXI6IHRydWUgfSk7CiAgICBDb3JlLkZvcm0uVmFsaWRhdGUuQWRkUnVsZSgiVmFsaWRhdGVfTnVtYmVySW50ZWdlckJpZ2dlclRoYW5aZXJvIiwgeyBWYWxpZGF0ZV9OdW1iZXJJbnRlZ2VyOiB0cnVlLCBWYWxpZGF0ZV9OdW1iZXJCaWdnZXJUaGFuWmVybzogdHJ1ZSB9KTsKCi8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQoKPC9kaXY+CgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXciKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiSW1wb3J0UmVzdWx0IikgJV0KPGRpdiBjbGFzcz0iTWFpbkJveCBBcmlhUm9sZU1haW4iPgogICAgPGRpdiBjbGFzcz0iVzUwcGMgU3BhY2luZ1RvcExhcmdlIFNwYWNpbmdCb3R0b21MYXJnZSBDZW50ZXJCb3giPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJJbXBvcnQgc3VtbWFyeSBmb3IiKSB8IGh0bWwgJV0gWyUgRGF0YS5PYmplY3QgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgoKICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJbJSBFbnYoIkFjdGlvbiIpICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iT3ZlcnZpZXciLz4KCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJSZWNvcmRzIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlZhbHVlIj5bJSBEYXRhLkNvdW50ZXIgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlN1Y2Nlc3MiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iVmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TdWNjZXNzIHwgaHRtbCAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbXBvcnRSZXN1bHRSZXR1cm5Db2RlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIChbJSBUcmFuc2xhdGUoRGF0YS5SZXR1cm5Db2RlTmFtZSkgfCBodG1sICVdOiBbJSBEYXRhLlJldHVybkNvZGVDb3VudCB8IGh0bWwgJV0pClslIFJlbmRlckJsb2NrRW5kKCJJbXBvcnRSZXN1bHRSZXR1cm5Db2RlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkZhaWxlZCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJWYWx1ZSI+WyUgRGF0YS5GYWlsZWQgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIkltcG9ydFJlc3VsdER1cGxpY2F0ZU5hbWVzIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiRHVwbGljYXRlIG5hbWVzIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlZhbHVlIj5bJSBEYXRhLkR1cGxpY2F0ZU5hbWVzIHwgaHRtbCAlXTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJJbXBvcnRSZXN1bHREdXBsaWNhdGVOYW1lcyIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbXBvcnRSZXN1bHRMYXN0TGluZU51bWJlciIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkxhc3QgcHJvY2Vzc2VkIGxpbmUgbnVtYmVyIG9mIGltcG9ydCBmaWxlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlZhbHVlIj5bJSBEYXRhLkxhc3RMaW5lTnVtYmVyIHwgaHRtbCAlXTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJJbXBvcnRSZXN1bHRMYXN0TGluZU51bWJlciIpICVdCiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KCiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkNlbnRlciBTcGFjaW5nVG9wU21hbGwiPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgbmFtZT0iT2siIHZhbHVlPSJbJSBUcmFuc2xhdGUoIk9rIikgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoIk9rIikgfCBodG1sICVdPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2Pgo8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkltcG9ydFJlc3VsdCIpICVdCg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0LnBtIC0gYWxsIGltcG9ydCBhbmQgZXhwb3J0IGZ1bmN0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDE0IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtJywKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0IC0gaW1wb3J0LCBleHBvcnQgbGliCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBpbXBvcnQgYW5kIGV4cG9ydCBmdW5jdGlvbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRJbXBvcnRFeHBvcnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0Jyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gVGVtcGxhdGVMaXN0KCkKCnJldHVybiBhIGxpc3Qgb2YgdGVtcGxhdGVzIGFzIGFycmF5IHJlZmVyZW5jZQoKICAgIG15ICRUZW1wbGF0ZUxpc3QgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZUxpc3QoCiAgICAgICAgT2JqZWN0ID0+ICdUaWNrZXQnLCAgIyAob3B0aW9uYWwpCiAgICAgICAgRm9ybWF0ID0+ICdDU1YnICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFRlbXBsYXRlTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlcklEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgc3FsIHN0cmluZwogICAgbXkgJFNRTCA9ICdTRUxFQ1QgaWQgRlJPTSBpbWV4cG9ydF90ZW1wbGF0ZSBXSEVSRSAxPTEgJzsKICAgIG15IEBCSU5EOwoKICAgIGlmICggJFBhcmFte09iamVjdH0gKSB7CiAgICAgICAgJFNRTCAuPSAnQU5EIGltZXhwb3J0X29iamVjdCA9ID8gJzsKICAgICAgICBwdXNoIEBCSU5ELCBcJFBhcmFte09iamVjdH07CiAgICB9CiAgICBpZiAoICRQYXJhbXtGb3JtYXR9ICkgewogICAgICAgICRTUUwgLj0gJ0FORCBpbWV4cG9ydF9mb3JtYXQgPSA/ICc7CiAgICAgICAgcHVzaCBAQklORCwgXCRQYXJhbXtGb3JtYXR9OwogICAgfQoKICAgICMgYWRkIG9yZGVyIG9wdGlvbgogICAgJFNRTCAuPSAnT1JERVIgQlkgaWQnOwoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJJTkQsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQFRlbXBsYXRlTGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBAVGVtcGxhdGVMaXN0LCAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiBcQFRlbXBsYXRlTGlzdDsKfQoKPWl0ZW0gVGVtcGxhdGVHZXQoKQoKZ2V0IGEgaW1wb3J0IGV4cG9ydCB0ZW1wbGF0ZQoKUmV0dXJuCiAgICAkVGVtcGxhdGVEYXRhe1RlbXBsYXRlSUR9CiAgICAkVGVtcGxhdGVEYXRhe051bWJlcn0KICAgICRUZW1wbGF0ZURhdGF7T2JqZWN0fQogICAgJFRlbXBsYXRlRGF0YXtGb3JtYXR9CiAgICAkVGVtcGxhdGVEYXRhe05hbWV9CiAgICAkVGVtcGxhdGVEYXRhe1ZhbGlkSUR9CiAgICAkVGVtcGxhdGVEYXRhe0NvbW1lbnR9CiAgICAkVGVtcGxhdGVEYXRhe0NyZWF0ZVRpbWV9CiAgICAkVGVtcGxhdGVEYXRhe0NyZWF0ZUJ5fQogICAgJFRlbXBsYXRlRGF0YXtDaGFuZ2VUaW1lfQogICAgJFRlbXBsYXRlRGF0YXtDaGFuZ2VCeX0KCiAgICBteSAkVGVtcGxhdGVEYXRhUmVmID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgVGVtcGxhdGVHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgcmVzdWx0IGlzIGFscmVhZHkgY2FjaGVkCiAgICByZXR1cm4gJFNlbGYtPntDYWNoZX0tPntUZW1wbGF0ZUdldH0tPnsgJFBhcmFte1RlbXBsYXRlSUR9IH0KICAgICAgICBpZiAkU2VsZi0+e0NhY2hlfS0+e1RlbXBsYXRlR2V0fS0+eyAkUGFyYW17VGVtcGxhdGVJRH0gfTsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQsIGltZXhwb3J0X29iamVjdCwgaW1leHBvcnRfZm9ybWF0LCBuYW1lLCB2YWxpZF9pZCwgY29tbWVudHMsICcKICAgICAgICAgICAgLiAnY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSBGUk9NIGltZXhwb3J0X3RlbXBsYXRlIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1RlbXBsYXRlSUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlVGVtcGxhdGVEYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkVGVtcGxhdGVEYXRhe1RlbXBsYXRlSUR9ID0gJFJvd1swXTsKICAgICAgICAkVGVtcGxhdGVEYXRhe09iamVjdH0gICAgID0gJFJvd1sxXTsKICAgICAgICAkVGVtcGxhdGVEYXRhe0Zvcm1hdH0gICAgID0gJFJvd1syXTsKICAgICAgICAkVGVtcGxhdGVEYXRhe05hbWV9ICAgICAgID0gJFJvd1szXTsKICAgICAgICAkVGVtcGxhdGVEYXRhe1ZhbGlkSUR9ICAgID0gJFJvd1s0XTsKICAgICAgICAkVGVtcGxhdGVEYXRhe0NvbW1lbnR9ICAgID0gJFJvd1s1XSB8fCAnJzsKICAgICAgICAkVGVtcGxhdGVEYXRhe0NyZWF0ZVRpbWV9ID0gJFJvd1s2XTsKICAgICAgICAkVGVtcGxhdGVEYXRhe0NyZWF0ZUJ5fSAgID0gJFJvd1s3XTsKICAgICAgICAkVGVtcGxhdGVEYXRhe0NoYW5nZVRpbWV9ID0gJFJvd1s4XTsKICAgICAgICAkVGVtcGxhdGVEYXRhe0NoYW5nZUJ5fSAgID0gJFJvd1s5XTsKCiAgICAgICAgJFRlbXBsYXRlRGF0YXtOdW1iZXJ9ID0gc3ByaW50ZiAiJTA2ZCIsICRUZW1wbGF0ZURhdGF7VGVtcGxhdGVJRH07CiAgICB9CgogICAgIyBjYWNoZSB0aGUgcmVzdWx0CiAgICAkU2VsZi0+e0NhY2hlfS0+e1RlbXBsYXRlR2V0fS0+eyAkUGFyYW17VGVtcGxhdGVJRH0gfSA9IFwlVGVtcGxhdGVEYXRhOwoKICAgIHJldHVybiBcJVRlbXBsYXRlRGF0YTsKfQoKPWl0ZW0gVGVtcGxhdGVBZGQoKQoKYWRkIGEgbmV3IGltcG9ydC9leHBvcnQgdGVtcGxhdGUKCiAgICBteSAkVGVtcGxhdGVJRCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlRlbXBsYXRlQWRkKAogICAgICAgIE9iamVjdCAgPT4gJ1RpY2tldCcsCiAgICAgICAgRm9ybWF0ICA9PiAnQ1NWJywKICAgICAgICBOYW1lICAgID0+ICdUZW1wbGF0ZSBOYW1lJywKICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgQ29tbWVudCA9PiAnQ29tbWVudCcsICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgVGVtcGxhdGVBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoT2JqZWN0IEZvcm1hdCBOYW1lIFZhbGlkSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlcwogICAgJFBhcmFte0NvbW1lbnR9IHx8PSAnJzsKCiAgICAjIGNsZWFudXAgZ2l2ZW4gcGFyYW1zCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhPYmplY3QgRm9ybWF0KSkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nKS0+U3RyaW5nQ2xlYW4oCiAgICAgICAgICAgIFN0cmluZ1JlZiAgICAgICAgID0+IFwkUGFyYW17JEFyZ3VtZW50fSwKICAgICAgICAgICAgUmVtb3ZlQWxsTmV3bGluZXMgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsVGFicyAgICAgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsU3BhY2VzICAgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTmFtZSBDb21tZW50KSkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nKS0+U3RyaW5nQ2xlYW4oCiAgICAgICAgICAgIFN0cmluZ1JlZiAgICAgICAgID0+IFwkUGFyYW17JEFyZ3VtZW50fSwKICAgICAgICAgICAgUmVtb3ZlQWxsTmV3bGluZXMgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsVGFicyAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgZmluZCBleGl0aW5nIHRlbXBsYXRlIHdpdGggc2FtZSBuYW1lCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGlkIEZST00gaW1leHBvcnRfdGVtcGxhdGUgV0hFUkUgaW1leHBvcnRfb2JqZWN0ID0gPyBBTkQgbmFtZSA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtPYmplY3R9LCBcJFBhcmFte05hbWV9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkTm9BZGQ7CiAgICB3aGlsZSAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJE5vQWRkID0gMTsKICAgIH0KCiAgICAjIGFib3J0IGluc2VydCBvZiBuZXcgdGVtcGxhdGUsIGlmIHRlbXBsYXRlIG5hbWUgYWxyZWFkeSBleGlzdHMKICAgIGlmICgkTm9BZGQpIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgIkNhbid0IGFkZCBuZXcgdGVtcGxhdGUhIFRlbXBsYXRlIHdpdGggc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzIGluIHRoaXMgb2JqZWN0LiIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBpbnNlcnQgbmV3IHRlbXBsYXRlCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGltZXhwb3J0X3RlbXBsYXRlICcKICAgICAgICAgICAgLiAnKGltZXhwb3J0X29iamVjdCwgaW1leHBvcnRfZm9ybWF0LCBuYW1lLCB2YWxpZF9pZCwgY29tbWVudHMsICcKICAgICAgICAgICAgLiAnY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSkgVkFMVUVTICcKICAgICAgICAgICAgLiAnKD8sID8sID8sID8sID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPyknLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte09iamVjdH0sIFwkUGFyYW17Rm9ybWF0fSwgXCRQYXJhbXtOYW1lfSwgXCRQYXJhbXtWYWxpZElEfSwKICAgICAgICAgICAgXCRQYXJhbXtDb21tZW50fSwgXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte1VzZXJJRH0sCiAgICAgICAgXSwKICAgICk7CgogICAgIyBmaW5kIGlkIG9mIG5ldyB0ZW1wbGF0ZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIGltZXhwb3J0X3RlbXBsYXRlIFdIRVJFIGltZXhwb3J0X29iamVjdCA9ID8gQU5EIG5hbWUgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17T2JqZWN0fSwgXCRQYXJhbXtOYW1lfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJFRlbXBsYXRlSUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRUZW1wbGF0ZUlEID0gJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gJFRlbXBsYXRlSUQ7Cn0KCj1pdGVtIFRlbXBsYXRlVXBkYXRlKCkKCnVwZGF0ZSBhIGV4aXN0aW5nIGltcG9ydC9leHBvcnQgdGVtcGxhdGUKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlRlbXBsYXRlVXBkYXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIE5hbWUgICAgICAgPT4gJ1RlbXBsYXRlIE5hbWUnLAogICAgICAgIFZhbGlkSUQgICAgPT4gMSwKICAgICAgICBDb21tZW50ICAgID0+ICdDb21tZW50JywgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgVGVtcGxhdGVVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBOYW1lIFZhbGlkSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlcwogICAgJFBhcmFte0NvbW1lbnR9IHx8PSAnJzsKCiAgICAjIGNsZWFudXAgZ2l2ZW4gcGFyYW1zCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhOYW1lIENvbW1lbnQpKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbScpLT5TdHJpbmdDbGVhbigKICAgICAgICAgICAgU3RyaW5nUmVmICAgICAgICAgPT4gXCRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICAgICBSZW1vdmVBbGxOZXdsaW5lcyA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxUYWJzICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgdGhlIG9iamVjdCBvZiB0aGlzIHRlbXBsYXRlIGlkCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGltZXhwb3J0X29iamVjdCBGUk9NIGltZXhwb3J0X3RlbXBsYXRlIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1RlbXBsYXRlSUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkT2JqZWN0OwogICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkT2JqZWN0ID0gJFJvd1swXTsKICAgIH0KCiAgICBpZiAoICEkT2JqZWN0ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgdXBkYXRlIHRlbXBsYXRlIGJlY2F1c2UgaXQgaGFzbid0IGJlZW4gZm91bmQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGZpbmQgZXhpdGluZyB0ZW1wbGF0ZSB3aXRoIHNhbWUgbmFtZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIGltZXhwb3J0X3RlbXBsYXRlIFdIRVJFIGltZXhwb3J0X29iamVjdCA9ID8gQU5EIG5hbWUgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkT2JqZWN0LCBcJFBhcmFte05hbWV9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkVXBkYXRlID0gMTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgaWYgKCAkUGFyYW17VGVtcGxhdGVJRH0gbmUgJFJvd1swXSApIHsKICAgICAgICAgICAgJFVwZGF0ZSA9IDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRVcGRhdGUgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICJDYW4ndCB1cGRhdGUgdGVtcGxhdGUhIFRlbXBsYXRlIHdpdGggc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzIGluIHRoaXMgb2JqZWN0LiIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyByZXNldCBjYWNoZQogICAgZGVsZXRlICRTZWxmLT57Q2FjaGV9LT57VGVtcGxhdGVHZXR9LT57ICRQYXJhbXtUZW1wbGF0ZUlEfSB9OwoKICAgICMgdXBkYXRlIHRlbXBsYXRlCiAgICByZXR1cm4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCA9PiAnVVBEQVRFIGltZXhwb3J0X3RlbXBsYXRlIFNFVCBuYW1lID0gPywnCiAgICAgICAgICAgIC4gJ3ZhbGlkX2lkID0gPywgY29tbWVudHMgPSA/LCAnCiAgICAgICAgICAgIC4gJ2NoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAsIGNoYW5nZV9ieSA9ID8gJwogICAgICAgICAgICAuICdXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte05hbWV9LCBcJFBhcmFte1ZhbGlkSUR9LCBcJFBhcmFte0NvbW1lbnR9LAogICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sIFwkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgXSwKICAgICk7Cn0KCj1pdGVtIFRlbXBsYXRlRGVsZXRlKCkKCmRlbGV0ZSBleGlzdGluZyBpbXBvcnQvZXhwb3J0IHRlbXBsYXRlcwoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiBbMSw0NCwxNjYsNV0sCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBUZW1wbGF0ZURlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhcmVmICRQYXJhbXtUZW1wbGF0ZUlEfSApIHsKICAgICAgICAkUGFyYW17VGVtcGxhdGVJRH0gPSBbICRQYXJhbXtUZW1wbGF0ZUlEfSBdOwogICAgfQogICAgZWxzaWYgKCByZWYgJFBhcmFte1RlbXBsYXRlSUR9IG5lICdBUlJBWScgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdUZW1wbGF0ZUlEIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIG9yIGEgc3RyaW5nIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWxldGUgZXhpc3Rpbmcgc2VhcmNoIGRhdGEKICAgICRTZWxmLT5TZWFyY2hEYXRhRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZGVsZXRlIGFsbCBtYXBwaW5nIGRhdGEKICAgIGZvciBteSAkVGVtcGxhdGVJRCAoIEB7ICRQYXJhbXtUZW1wbGF0ZUlEfSB9ICkgewogICAgICAgICRTZWxmLT5NYXBwaW5nRGVsZXRlKAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBkZWxldGUgZXhpc3RpbmcgZm9ybWF0IGRhdGEKICAgICRTZWxmLT5Gb3JtYXREYXRhRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZGVsZXRlIGV4aXN0aW5nIG9iamVjdCBkYXRhCiAgICAkU2VsZi0+T2JqZWN0RGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNyZWF0ZSB0aGUgdGVtcGxhdGUgaWQgc3RyaW5nCiAgICBteSAkVGVtcGxhdGVJRFN0cmluZyA9IGpvaW4gcXssIH0sIG1hcCB7Jz8nfSBAeyAkUGFyYW17VGVtcGxhdGVJRH0gfTsKCiAgICAjIGNyZWF0ZSBhbmQgYWRkIGJpbmQgcGFyYW1ldGVycwogICAgbXkgQEJJTkQgPSBtYXAgeyBcJF8gfSBAeyAkUGFyYW17VGVtcGxhdGVJRH0gfTsKCiAgICAjIHJlc2V0IGNhY2hlCiAgICBkZWxldGUgJFNlbGYtPntDYWNoZX0tPntUZW1wbGF0ZUdldH07CgogICAgIyBkZWxldGUgdGVtcGxhdGVzCiAgICByZXR1cm4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCAgPT4gIkRFTEVURSBGUk9NIGltZXhwb3J0X3RlbXBsYXRlIFdIRVJFIGlkIElOICggJFRlbXBsYXRlSURTdHJpbmcgKSIsCiAgICAgICAgQmluZCA9PiBcQEJJTkQsCiAgICApOwp9Cgo9aXRlbSBPYmplY3RMaXN0KCkKCnJldHVybiBhIGxpc3Qgb2YgYXZhaWxhYmxlIG9iamVjdHMgYXMgaGFzaCByZWZlcmVuY2UKCiAgICBteSAkT2JqZWN0TGlzdCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk9iamVjdExpc3QoKTsKCj1jdXQKCnN1YiBPYmplY3RMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY29uZmlnCiAgICBteSAkTW9kdWxlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnSW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kUmVnaXN0cmF0aW9uJyk7CgogICAgcmV0dXJuIGlmICEkTW9kdWxlTGlzdDsKICAgIHJldHVybiBpZiByZWYgJE1vZHVsZUxpc3QgbmUgJ0hBU0gnOwoKICAgICMgY3JlYXRlIHRoZSBvYmplY3QgbGlzdAogICAgbXkgJE9iamVjdExpc3QgPSB7fTsKICAgIGZvciBteSAkTW9kdWxlICggc29ydCBrZXlzICV7JE1vZHVsZUxpc3R9ICkgewogICAgICAgICRPYmplY3RMaXN0LT57JE1vZHVsZX0gPSAkTW9kdWxlTGlzdC0+eyRNb2R1bGV9LT57TmFtZX07CiAgICB9CgogICAgcmV0dXJuICRPYmplY3RMaXN0Owp9Cgo9aXRlbSBPYmplY3RBdHRyaWJ1dGVzR2V0KCkKCmdldCB0aGUgYXR0cmlidXRlcyBvZiBhbiBvYmplY3QgYmFja2VuZCBhcyBhcnJheS9oYXNoIHJlZmVyZW5jZQoKICAgIG15ICRBdHRyaWJ1dGVzID0gJEltcG9ydEV4cG9ydE9iamVjdC0+T2JqZWN0QXR0cmlidXRlc0dldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE9iamVjdEF0dHJpYnV0ZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgIG15ICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayB0ZW1wbGF0ZSBkYXRhCiAgICBpZiAoICEkVGVtcGxhdGVEYXRhIHx8ICEkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRlbXBsYXRlIHdpdGggSUQgJFBhcmFte1RlbXBsYXRlSUR9IGlzIGluY29tcGxldGUhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmQgPSAkS2VybmVsOjpPTS0+R2V0KCAnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6JyAuICRUZW1wbGF0ZURhdGEtPntPYmplY3R9ICk7CgogICAgcmV0dXJuIGlmICEkQmFja2VuZDsKCiAgICAjIGdldCBhbiBhdHRyaWJ1dGUgbGlzdCBvZiB0aGUgb2JqZWN0CiAgICBteSAkQXR0cmlidXRlcyA9ICRCYWNrZW5kLT5PYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRBdHRyaWJ1dGVzOwp9Cgo9aXRlbSBPYmplY3REYXRhR2V0KCkKCmdldCB0aGUgb2JqZWN0IGRhdGEgZnJvbSBhIHRlbXBsYXRlCgogICAgbXkgJE9iamVjdERhdGFSZWYgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5PYmplY3REYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE9iamVjdERhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICdTRUxFQ1QgZGF0YV9rZXksIGRhdGFfdmFsdWUgRlJPTSBpbWV4cG9ydF9vYmplY3QgV0hFUkUgdGVtcGxhdGVfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVPYmplY3REYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkT2JqZWN0RGF0YXsgJFJvd1swXSB9ID0gJFJvd1sxXTsKICAgIH0KCiAgICByZXR1cm4gXCVPYmplY3REYXRhOwp9Cgo9aXRlbSBPYmplY3REYXRhU2F2ZSgpCgpzYXZlIHRoZSBvYmplY3QgZGF0YSBvZiBhIHRlbXBsYXRlCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5PYmplY3REYXRhU2F2ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBPYmplY3REYXRhID0+ICRIYXNoUmVmLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0RGF0YVNhdmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBPYmplY3REYXRhIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCByZWYgJFBhcmFte09iamVjdERhdGF9IG5lICdIQVNIJyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ09iamVjdERhdGEgbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWxldGUgZXhpc3Rpbmcgb2JqZWN0IGRhdGEKICAgICRTZWxmLT5PYmplY3REYXRhRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIERBVEFLRVk6CiAgICBmb3IgbXkgJERhdGFLZXkgKCBzb3J0IGtleXMgJXsgJFBhcmFte09iamVjdERhdGF9IH0gKSB7CgogICAgICAgIG15ICREYXRhVmFsdWUgPSAkUGFyYW17T2JqZWN0RGF0YX0tPnskRGF0YUtleX07CgogICAgICAgIG5leHQgREFUQUtFWSBpZiAhZGVmaW5lZCAkRGF0YUtleTsKICAgICAgICBuZXh0IERBVEFLRVkgaWYgIWRlZmluZWQgJERhdGFWYWx1ZTsKCiAgICAgICAgIyBpbnNlcnQgb25lIHJvdwogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBpbWV4cG9ydF9vYmplY3QgJwogICAgICAgICAgICAgICAgLiAnKHRlbXBsYXRlX2lkLCBkYXRhX2tleSwgZGF0YV92YWx1ZSkgVkFMVUVTICcKICAgICAgICAgICAgICAgIC4gJyg/LCA/LCA/KScsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1RlbXBsYXRlSUR9LCBcJERhdGFLZXksIFwkRGF0YVZhbHVlIF0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gT2JqZWN0RGF0YURlbGV0ZSgpCgpkZWxldGUgdGhlIGV4aXN0aW5nIG9iamVjdCBkYXRhIG9mIGEgdGVtcGxhdGUKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk9iamVjdERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+T2JqZWN0RGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IFsxLDQ0LDE2Niw1XSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE9iamVjdERhdGFEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggIXJlZiAkUGFyYW17VGVtcGxhdGVJRH0gKSB7CiAgICAgICAgJFBhcmFte1RlbXBsYXRlSUR9ID0gWyAkUGFyYW17VGVtcGxhdGVJRH0gXTsKICAgIH0KICAgIGVsc2lmICggcmVmICRQYXJhbXtUZW1wbGF0ZUlEfSBuZSAnQVJSQVknICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnVGVtcGxhdGVJRCBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSBvciBhIHN0cmluZyEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSB0ZW1wbGF0ZSBpZCBzdHJpbmcKICAgIG15ICRUZW1wbGF0ZUlEU3RyaW5nID0gam9pbiBxeywgfSwgbWFwIHsnPyd9IEB7ICRQYXJhbXtUZW1wbGF0ZUlEfSB9OwoKICAgICMgY3JlYXRlIGFuZCBhZGQgYmluZCBwYXJhbWV0ZXJzCiAgICBteSBAQklORCA9IG1hcCB7IFwkXyB9IEB7ICRQYXJhbXtUZW1wbGF0ZUlEfSB9OwoKICAgICMgZGVsZXRlIHRlbXBsYXRlcwogICAgcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgID0+ICJERUxFVEUgRlJPTSBpbWV4cG9ydF9vYmplY3QgV0hFUkUgdGVtcGxhdGVfaWQgSU4gKCAkVGVtcGxhdGVJRFN0cmluZyApIiwKICAgICAgICBCaW5kID0+IFxAQklORCwKICAgICk7Cn0KCj1pdGVtIEZvcm1hdExpc3QoKQoKcmV0dXJuIGEgbGlzdCBvZiBhdmFpbGFibGUgZm9ybWF0cyBhcyBoYXNoIHJlZmVyZW5jZQoKICAgIG15ICRGb3JtYXRMaXN0ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+Rm9ybWF0TGlzdCgpOwoKPWN1dAoKc3ViIEZvcm1hdExpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjb25maWcKICAgIG15ICRNb2R1bGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmRSZWdpc3RyYXRpb24nKTsKCiAgICByZXR1cm4gaWYgISRNb2R1bGVMaXN0OwogICAgcmV0dXJuIGlmIHJlZiAkTW9kdWxlTGlzdCBuZSAnSEFTSCc7CgogICAgIyBjcmVhdGUgdGhlIGZvcm1hdCBsaXN0CiAgICBteSAkRm9ybWF0TGlzdCA9IHt9OwogICAgZm9yIG15ICRNb2R1bGUgKCBzb3J0IGtleXMgJXskTW9kdWxlTGlzdH0gKSB7CiAgICAgICAgJEZvcm1hdExpc3QtPnskTW9kdWxlfSA9ICRNb2R1bGVMaXN0LT57JE1vZHVsZX0tPntOYW1lfTsKICAgIH0KCiAgICByZXR1cm4gJEZvcm1hdExpc3Q7Cn0KCj1pdGVtIEZvcm1hdEF0dHJpYnV0ZXNHZXQoKQoKZ2V0IHRoZSBhdHRyaWJ1dGVzIG9mIGEgZm9ybWF0IGJhY2tlbmQgYXMgYXJyYXkvaGFzaCByZWZlcmVuY2UKCiAgICBteSAkQXR0cmlidXRlcyA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkZvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBGb3JtYXRBdHRyaWJ1dGVzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICBteSAkVGVtcGxhdGVEYXRhID0gJFNlbGYtPlRlbXBsYXRlR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgdGVtcGxhdGUgZGF0YQogICAgaWYgKCAhJFRlbXBsYXRlRGF0YSB8fCAhJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUZW1wbGF0ZSB3aXRoIElEICRQYXJhbXtUZW1wbGF0ZUlEfSBpcyBpbmNvbXBsZXRlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kID0gJEtlcm5lbDo6T00tPkdldCggJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmQ6OicgLiAkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSApOwoKICAgIHJldHVybiBpZiAhJEJhY2tlbmQ7CgogICAgIyBnZXQgYW4gYXR0cmlidXRlIGxpc3Qgb2YgdGhlIGZvcm1hdAogICAgbXkgJEF0dHJpYnV0ZXMgPSAkQmFja2VuZC0+Rm9ybWF0QXR0cmlidXRlc0dldCgKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkQXR0cmlidXRlczsKfQoKPWl0ZW0gRm9ybWF0RGF0YUdldCgpCgpnZXQgdGhlIGZvcm1hdCBkYXRhIGZyb20gYSB0ZW1wbGF0ZQoKICAgIG15ICRGb3JtYXREYXRhUmVmID0gJEltcG9ydEV4cG9ydE9iamVjdC0+Rm9ybWF0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBGb3JtYXREYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFzayBkYXRhYmFzZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAnU0VMRUNUIGRhdGFfa2V5LCBkYXRhX3ZhbHVlIEZST00gaW1leHBvcnRfZm9ybWF0IFdIRVJFIHRlbXBsYXRlX2lkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VGVtcGxhdGVJRH0gXSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlRm9ybWF0RGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJEZvcm1hdERhdGF7ICRSb3dbMF0gfSA9ICRSb3dbMV07CiAgICB9CgogICAgcmV0dXJuIFwlRm9ybWF0RGF0YTsKfQoKPWl0ZW0gRm9ybWF0RGF0YVNhdmUoKQoKc2F2ZSB0aGUgZm9ybWF0IGRhdGEgb2YgYSB0ZW1wbGF0ZQoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+Rm9ybWF0RGF0YVNhdmUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgRm9ybWF0RGF0YSA9PiAkSGFzaFJlZiwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEZvcm1hdERhdGFTYXZlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgRm9ybWF0RGF0YSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggcmVmICRQYXJhbXtGb3JtYXREYXRhfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdGb3JtYXREYXRhIG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZGVsZXRlIGV4aXN0aW5nIGZvcm1hdCBkYXRhCiAgICAkU2VsZi0+Rm9ybWF0RGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICBEQVRBS0VZOgogICAgZm9yIG15ICREYXRhS2V5ICggc29ydCBrZXlzICV7ICRQYXJhbXtGb3JtYXREYXRhfSB9ICkgewoKICAgICAgICBteSAkRGF0YVZhbHVlID0gJFBhcmFte0Zvcm1hdERhdGF9LT57JERhdGFLZXl9OwoKICAgICAgICBuZXh0IERBVEFLRVkgaWYgIWRlZmluZWQgJERhdGFLZXk7CiAgICAgICAgbmV4dCBEQVRBS0VZIGlmICFkZWZpbmVkICREYXRhVmFsdWU7CgogICAgICAgICMgaW5zZXJ0IG9uZSByb3cKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gaW1leHBvcnRfZm9ybWF0ICcKICAgICAgICAgICAgICAgIC4gJyh0ZW1wbGF0ZV9pZCwgZGF0YV9rZXksIGRhdGFfdmFsdWUpIFZBTFVFUyAoPywgPywgPyknLAogICAgICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSwgXCREYXRhS2V5LCBcJERhdGFWYWx1ZSBdLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEZvcm1hdERhdGFEZWxldGUoKQoKZGVsZXRlIHRoZSBleGlzdGluZyBmb3JtYXQgZGF0YSBvZiBhIHRlbXBsYXRlCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5Gb3JtYXREYXRhRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkZvcm1hdERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiBbMSw0NCwxNjYsNV0sCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBGb3JtYXREYXRhRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICFyZWYgJFBhcmFte1RlbXBsYXRlSUR9ICkgewogICAgICAgICRQYXJhbXtUZW1wbGF0ZUlEfSA9IFsgJFBhcmFte1RlbXBsYXRlSUR9IF07CiAgICB9CiAgICBlbHNpZiAoIHJlZiAkUGFyYW17VGVtcGxhdGVJRH0gbmUgJ0FSUkFZJyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1RlbXBsYXRlSUQgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2Ugb3IgYSBzdHJpbmchJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgdGVtcGxhdGUgaWQgc3RyaW5nCiAgICBteSAkVGVtcGxhdGVJRFN0cmluZyA9IGpvaW4gcXssIH0sIG1hcCB7Jz8nfSBAeyAkUGFyYW17VGVtcGxhdGVJRH0gfTsKCiAgICAjIGNyZWF0ZSBhbmQgYWRkIGJpbmQgcGFyYW1ldGVycwogICAgbXkgQEJJTkQgPSBtYXAgeyBcJF8gfSBAeyAkUGFyYW17VGVtcGxhdGVJRH0gfTsKCiAgICAjIGRlbGV0ZSB0ZW1wbGF0ZXMKICAgIHJldHVybiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAiREVMRVRFIEZST00gaW1leHBvcnRfZm9ybWF0IFdIRVJFIHRlbXBsYXRlX2lkIElOICggJFRlbXBsYXRlSURTdHJpbmcgKSIsCiAgICAgICAgQmluZCA9PiBcQEJJTkQsCiAgICApOwp9Cgo9aXRlbSBNYXBwaW5nTGlzdCgpCgpyZXR1cm4gYSBsaXN0IG9mIG1hcHBpbmcgZGF0YSBpZHMgc29ydGVkIGJ5IHBvc2l0aW9uIGFzIGFycmF5IHJlZmVyZW5jZQoKICAgIG15ICRNYXBwaW5nTGlzdCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdMaXN0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ0xpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICdTRUxFQ1QgaWQgRlJPTSBpbWV4cG9ydF9tYXBwaW5nIFdIRVJFIHRlbXBsYXRlX2lkID0gPyBPUkRFUiBCWSBwb3NpdGlvbicsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VGVtcGxhdGVJRH0gXSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBATWFwcGluZ0xpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQE1hcHBpbmdMaXN0LCAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiBcQE1hcHBpbmdMaXN0Owp9Cgo9aXRlbSBNYXBwaW5nQWRkKCkKCmFkZCBhIG5ldyBtYXBwaW5nIGRhdGEgcm93CgogICAgbXkgJE1hcHBpbmdJRCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdBZGQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGZpbmQgbWF4aW11bSBwb3NpdGlvbgogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBtYXgocG9zaXRpb24pIEZST00gaW1leHBvcnRfbWFwcGluZyBXSEVSRSB0ZW1wbGF0ZV9pZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJE5ld1Bvc2l0aW9uID0gMDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgIGlmICggZGVmaW5lZCAkUm93WzBdICkgewogICAgICAgICAgICAkTmV3UG9zaXRpb24gPSAkUm93WzBdOwogICAgICAgICAgICAkTmV3UG9zaXRpb24rKzsKICAgICAgICB9CiAgICB9CgogICAgIyBpbnNlcnQgYSBuZXcgbWFwcGluZyBkYXRhIHJvdwogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBpbWV4cG9ydF9tYXBwaW5nICh0ZW1wbGF0ZV9pZCwgcG9zaXRpb24pIFZBTFVFUyAoPywgPyknLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1RlbXBsYXRlSUR9LCBcJE5ld1Bvc2l0aW9uIF0sCiAgICApOwoKICAgICMgZmluZCBpZCBvZiBuZXcgbWFwcGluZyBkYXRhIHJvdwogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIGltZXhwb3J0X21hcHBpbmcgV0hFUkUgdGVtcGxhdGVfaWQgPSA/IEFORCBwb3NpdGlvbiA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSwgXCROZXdQb3NpdGlvbiBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJE1hcHBpbmdJRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJE1hcHBpbmdJRCA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuICRNYXBwaW5nSUQ7Cn0KCj1pdGVtIE1hcHBpbmdEZWxldGUoKQoKZGVsZXRlIGV4aXN0aW5nIG1hcHBpbmcgZGF0YSByb3dzCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nRGVsZXRlKAogICAgICAgIE1hcHBpbmdJRCAgPT4gMTIzLAogICAgICAgIFRlbXBsYXRlSUQgPT4gMzIxLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAzMjEsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIGRlZmluZWQgJFBhcmFte01hcHBpbmdJRH0gKSB7CgogICAgICAgICMgZGVsZXRlIGV4aXN0aW5nIG9iamVjdCBtYXBwaW5nIGRhdGEKICAgICAgICAkU2VsZi0+TWFwcGluZ09iamVjdERhdGFEZWxldGUoCiAgICAgICAgICAgIE1hcHBpbmdJRCA9PiAkUGFyYW17TWFwcGluZ0lEfSwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIGV4aXN0aW5nIGZvcm1hdCBtYXBwaW5nIGRhdGEKICAgICAgICAkU2VsZi0+TWFwcGluZ0Zvcm1hdERhdGFEZWxldGUoCiAgICAgICAgICAgIE1hcHBpbmdJRCA9PiAkUGFyYW17TWFwcGluZ0lEfSwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIG9uZSBtYXBwaW5nIHJvdwogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gaW1leHBvcnRfbWFwcGluZyBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtNYXBwaW5nSUR9IF0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZWJ1aWxkIG1hcHBpbmcgcG9zaXRpb25zCiAgICAgICAgJFNlbGYtPk1hcHBpbmdQb3NpdGlvblJlYnVpbGQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAxOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgZ2V0IG1hcHBpbmcgbGlzdAogICAgICAgIG15ICRNYXBwaW5nTGlzdCA9ICRTZWxmLT5NYXBwaW5nTGlzdCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgZm9yIG15ICRNYXBwaW5nSUQgKCBAeyRNYXBwaW5nTGlzdH0gKSB7CgogICAgICAgICAgICAjIGRlbGV0ZSBleGlzdGluZyBvYmplY3QgbWFwcGluZyBkYXRhCiAgICAgICAgICAgICRTZWxmLT5NYXBwaW5nT2JqZWN0RGF0YURlbGV0ZSgKICAgICAgICAgICAgICAgIE1hcHBpbmdJRCA9PiAkTWFwcGluZ0lELAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkZWxldGUgZXhpc3RpbmcgZm9ybWF0IG1hcHBpbmcgZGF0YQogICAgICAgICAgICAkU2VsZi0+TWFwcGluZ0Zvcm1hdERhdGFEZWxldGUoCiAgICAgICAgICAgICAgICBNYXBwaW5nSUQgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZGVsZXRlIGFsbCBtYXBwaW5nIHJvd3Mgb2YgdGhpcyB0ZW1wbGF0ZQogICAgICAgIHJldHVybiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIGltZXhwb3J0X21hcHBpbmcgV0hFUkUgdGVtcGxhdGVfaWQgPSA/JywKICAgICAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VGVtcGxhdGVJRH0gXSwKICAgICAgICApOwogICAgfQp9Cgo9aXRlbSBNYXBwaW5nVXAoKQoKbW92ZSBhbiBtYXBwaW5nIGRhdGEgcm93IHVwCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nVXAoCiAgICAgICAgTWFwcGluZ0lEICA9PiAxMjMsCiAgICAgICAgVGVtcGxhdGVJRCA9PiAzMjEsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nVXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTWFwcGluZ0lEIFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBtYXBwaW5nIGRhdGEgbGlzdAogICAgbXkgJE1hcHBpbmdMaXN0ID0gJFNlbGYtPk1hcHBpbmdMaXN0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAxIGlmICRQYXJhbXtNYXBwaW5nSUR9ID09ICRNYXBwaW5nTGlzdC0+WzBdOwoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICdTRUxFQ1QgcG9zaXRpb24gRlJPTSBpbWV4cG9ydF9tYXBwaW5nIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17TWFwcGluZ0lEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRQb3NpdGlvbjsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFBvc2l0aW9uID0gJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gMSBpZiAhJFBvc2l0aW9uOwoKICAgIG15ICRQb3NpdGlvblVwcGVyID0gJFBvc2l0aW9uIC0gMTsKCiAgICAjIHVwZGF0ZSBwb3NpdGlvbnMKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgPT4gJ1VQREFURSBpbWV4cG9ydF9tYXBwaW5nIFNFVCBwb3NpdGlvbiA9ID8gV0hFUkUgdGVtcGxhdGVfaWQgPSA/IEFORCBwb3NpdGlvbiA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBvc2l0aW9uLCBcJFBhcmFte1RlbXBsYXRlSUR9LCBcJFBvc2l0aW9uVXBwZXIgXSwKICAgICk7CiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMID0+ICdVUERBVEUgaW1leHBvcnRfbWFwcGluZyBTRVQgcG9zaXRpb24gPSA/IFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUG9zaXRpb25VcHBlciwgXCRQYXJhbXtNYXBwaW5nSUR9IF0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBNYXBwaW5nRG93bigpCgptb3ZlIGFuIG1hcHBpbmcgZGF0YSByb3cgZG93bgoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0Rvd24oCiAgICAgICAgTWFwcGluZ0lEICA9PiAxMjMsCiAgICAgICAgVGVtcGxhdGVJRCA9PiAzMjEsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nRG93biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhNYXBwaW5nSUQgVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG1hcHBpbmcgZGF0YSBsaXN0CiAgICBteSAkTWFwcGluZ0xpc3QgPSAkU2VsZi0+TWFwcGluZ0xpc3QoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDEgaWYgJFBhcmFte01hcHBpbmdJRH0gPT0gJE1hcHBpbmdMaXN0LT5bLTFdOwoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICdTRUxFQ1QgcG9zaXRpb24gRlJPTSBpbWV4cG9ydF9tYXBwaW5nIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17TWFwcGluZ0lEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRQb3NpdGlvbjsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFBvc2l0aW9uID0gJFJvd1swXTsKICAgIH0KCiAgICBteSAkUG9zaXRpb25Eb3duID0gJFBvc2l0aW9uICsgMTsKCiAgICAjIHVwZGF0ZSBwb3NpdGlvbnMKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgPT4gJ1VQREFURSBpbWV4cG9ydF9tYXBwaW5nIFNFVCBwb3NpdGlvbiA9ID8gV0hFUkUgdGVtcGxhdGVfaWQgPSA/IEFORCBwb3NpdGlvbiA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBvc2l0aW9uLCBcJFBhcmFte1RlbXBsYXRlSUR9LCBcJFBvc2l0aW9uRG93biBdLAogICAgKTsKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgPT4gJ1VQREFURSBpbWV4cG9ydF9tYXBwaW5nIFNFVCBwb3NpdGlvbiA9ID8gV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQb3NpdGlvbkRvd24sIFwkUGFyYW17TWFwcGluZ0lEfSBdLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gTWFwcGluZ1Bvc2l0aW9uUmVidWlsZCgpCgpyZWJ1aWxkIHRoZSBwb3NpdGlvbnMgb2YgYSBtYXBwaW5nIGxpc3QKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdQb3NpdGlvblJlYnVpbGQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nUG9zaXRpb25SZWJ1aWxkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBtYXBwaW5nIGRhdGEgbGlzdAogICAgbXkgJE1hcHBpbmdMaXN0ID0gJFNlbGYtPk1hcHBpbmdMaXN0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgdXBkYXRlIHBvc2l0aW9uCiAgICBteSAkQ291bnRlciA9IDA7CiAgICBmb3IgbXkgJE1hcHBpbmdJRCAoIEB7JE1hcHBpbmdMaXN0fSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnVVBEQVRFIGltZXhwb3J0X21hcHBpbmcgU0VUIHBvc2l0aW9uID0gPyBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsgXCRDb3VudGVyLCBcJE1hcHBpbmdJRCBdLAogICAgICAgICk7CiAgICAgICAgJENvdW50ZXIrKzsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gTWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQoKQoKZ2V0IHRoZSBhdHRyaWJ1dGVzIG9mIGFuIG9iamVjdCBiYWNrZW5kIGFzIGFycmF5L2hhc2ggcmVmZXJlbmNlCgogICAgbXkgJEF0dHJpYnV0ZXMgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICBteSAkVGVtcGxhdGVEYXRhID0gJFNlbGYtPlRlbXBsYXRlR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgdGVtcGxhdGUgZGF0YQogICAgaWYgKCAhJFRlbXBsYXRlRGF0YSB8fCAhJFRlbXBsYXRlRGF0YS0+e09iamVjdH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUZW1wbGF0ZSB3aXRoIElEICRQYXJhbXtUZW1wbGF0ZUlEfSBpcyBpbmNvbXBsZXRlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kID0gJEtlcm5lbDo6T00tPkdldCggJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OicgLiAkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSApOwoKICAgIHJldHVybiBpZiAhJEJhY2tlbmQ7CgogICAgIyBnZXQgYW4gYXR0cmlidXRlIGxpc3Qgb2YgdGhlIG9iamVjdAogICAgbXkgJEF0dHJpYnV0ZXMgPSAkQmFja2VuZC0+TWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRBdHRyaWJ1dGVzOwp9Cgo9aXRlbSBNYXBwaW5nT2JqZWN0RGF0YURlbGV0ZSgpCgpkZWxldGUgdGhlIGV4aXN0aW5nIG9iamVjdCBkYXRhIG9mIGEgbWFwcGluZwoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ09iamVjdERhdGFEZWxldGUoCiAgICAgICAgTWFwcGluZ0lEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdPYmplY3REYXRhRGVsZXRlKAogICAgICAgIE1hcHBpbmdJRCA9PiBbMSw0NCwxNjYsNV0sCiAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdPYmplY3REYXRhRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE1hcHBpbmdJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggIXJlZiAkUGFyYW17TWFwcGluZ0lEfSApIHsKICAgICAgICAkUGFyYW17TWFwcGluZ0lEfSA9IFsgJFBhcmFte01hcHBpbmdJRH0gXTsKICAgIH0KICAgIGVsc2lmICggcmVmICRQYXJhbXtNYXBwaW5nSUR9IG5lICdBUlJBWScgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdNYXBwaW5nSUQgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2Ugb3IgYSBzdHJpbmchJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgdGVtcGxhdGUgaWQgc3RyaW5nCiAgICBteSAkTWFwcGluZ0lEU3RyaW5nID0gam9pbiBxeywgfSwgbWFwIHsnPyd9IEB7ICRQYXJhbXtNYXBwaW5nSUR9IH07CgogICAgIyBjcmVhdGUgYW5kIGFkZCBiaW5kIHBhcmFtZXRlcnMKICAgIG15IEBCSU5EID0gbWFwIHsgXCRfIH0gQHsgJFBhcmFte01hcHBpbmdJRH0gfTsKCiAgICAjIGRlbGV0ZSBtYXBwaW5nIG9iamVjdCBkYXRhCiAgICByZXR1cm4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCAgPT4gIkRFTEVURSBGUk9NIGltZXhwb3J0X21hcHBpbmdfb2JqZWN0IFdIRVJFIG1hcHBpbmdfaWQgSU4gKCAkTWFwcGluZ0lEU3RyaW5nICkiLAogICAgICAgIEJpbmQgPT4gXEBCSU5ELAogICAgKTsKfQoKPWl0ZW0gTWFwcGluZ09iamVjdERhdGFTYXZlKCkKCnNhdmUgdGhlIG9iamVjdCBkYXRhIG9mIGEgbWFwcGluZwoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ09iamVjdERhdGFTYXZlKAogICAgICAgIE1hcHBpbmdJRCAgICAgICAgID0+IDEyMywKICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiAkSGFzaFJlZiwKICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nT2JqZWN0RGF0YVNhdmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTWFwcGluZ0lEIE1hcHBpbmdPYmplY3REYXRhIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCByZWYgJFBhcmFte01hcHBpbmdPYmplY3REYXRhfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdNYXBwaW5nT2JqZWN0RGF0YSBtdXN0IGJlIGEgaGFzaCByZWZlcmVuY2UhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGRlbGV0ZSBleGlzdGluZyBvYmplY3QgbWFwcGluZyBkYXRhCiAgICAkU2VsZi0+TWFwcGluZ09iamVjdERhdGFEZWxldGUoCiAgICAgICAgTWFwcGluZ0lEID0+ICRQYXJhbXtNYXBwaW5nSUR9LAogICAgICAgIFVzZXJJRCAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgREFUQUtFWToKICAgIGZvciBteSAkRGF0YUtleSAoIHNvcnQga2V5cyAleyAkUGFyYW17TWFwcGluZ09iamVjdERhdGF9IH0gKSB7CgogICAgICAgIG15ICREYXRhVmFsdWUgPSAkUGFyYW17TWFwcGluZ09iamVjdERhdGF9LT57JERhdGFLZXl9OwoKICAgICAgICBuZXh0IERBVEFLRVkgaWYgIWRlZmluZWQgJERhdGFLZXk7CiAgICAgICAgbmV4dCBEQVRBS0VZIGlmICFkZWZpbmVkICREYXRhVmFsdWU7CgogICAgICAgICMgaW5zZXJ0IG9uZSBtYXBwaW5nIG9iamVjdCByb3cKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gaW1leHBvcnRfbWFwcGluZ19vYmplY3QgJwogICAgICAgICAgICAgICAgLiAnKG1hcHBpbmdfaWQsIGRhdGFfa2V5LCBkYXRhX3ZhbHVlKSBWQUxVRVMgKD8sID8sID8pJywKICAgICAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17TWFwcGluZ0lEfSwgXCREYXRhS2V5LCBcJERhdGFWYWx1ZSBdLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIE1hcHBpbmdPYmplY3REYXRhR2V0KCkKCmdldCB0aGUgb2JqZWN0IGRhdGEgb2YgYSBtYXBwaW5nCgogICAgbXkgJE9iamVjdERhdGFSZWYgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nT2JqZWN0RGF0YUdldCgKICAgICAgICBNYXBwaW5nSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nT2JqZWN0RGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhNYXBwaW5nSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFzayBkYXRhYmFzZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAnU0VMRUNUIGRhdGFfa2V5LCBkYXRhX3ZhbHVlIEZST00gaW1leHBvcnRfbWFwcGluZ19vYmplY3QgV0hFUkUgbWFwcGluZ19pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte01hcHBpbmdJRH0gXSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlTWFwcGluZ09iamVjdERhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRNYXBwaW5nT2JqZWN0RGF0YXsgJFJvd1swXSB9ID0gJFJvd1sxXTsKICAgIH0KCiAgICByZXR1cm4gXCVNYXBwaW5nT2JqZWN0RGF0YTsKfQoKPWl0ZW0gTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoKQoKZ2V0IHRoZSBhdHRyaWJ1dGVzIG9mIGFuIGZvcm1hdCBiYWNrZW5kIGFzIGFycmF5L2hhc2ggcmVmZXJlbmNlCgogICAgbXkgJEF0dHJpYnV0ZXMgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICBteSAkVGVtcGxhdGVEYXRhID0gJFNlbGYtPlRlbXBsYXRlR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgdGVtcGxhdGUgZGF0YQogICAgaWYgKCAhJFRlbXBsYXRlRGF0YSB8fCAhJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUZW1wbGF0ZSB3aXRoIElEICRQYXJhbXtUZW1wbGF0ZUlEfSBpcyBpbmNvbXBsZXRlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kID0gJEtlcm5lbDo6T00tPkdldCggJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmQ6OicgLiAkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSApOwoKICAgIHJldHVybiBpZiAhJEJhY2tlbmQ7CgogICAgIyBnZXQgYW4gYXR0cmlidXRlIGxpc3Qgb2YgdGhlIGZvcm1hdAogICAgbXkgJEF0dHJpYnV0ZXMgPSAkQmFja2VuZC0+TWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZXM7Cn0KCj1pdGVtIE1hcHBpbmdGb3JtYXREYXRhRGVsZXRlKCkKCmRlbGV0ZSB0aGUgZXhpc3RpbmcgZm9ybWF0IGRhdGEgb2YgYSBtYXBwaW5nCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nRm9ybWF0RGF0YURlbGV0ZSgKICAgICAgICBNYXBwaW5nSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0Zvcm1hdERhdGFEZWxldGUoCiAgICAgICAgTWFwcGluZ0lEID0+IFsxLDQ0LDE2Niw1XSwKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ0Zvcm1hdERhdGFEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTWFwcGluZ0lEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhcmVmICRQYXJhbXtNYXBwaW5nSUR9ICkgewogICAgICAgICRQYXJhbXtNYXBwaW5nSUR9ID0gWyAkUGFyYW17TWFwcGluZ0lEfSBdOwogICAgfQogICAgZWxzaWYgKCByZWYgJFBhcmFte01hcHBpbmdJRH0gbmUgJ0FSUkFZJyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ01hcHBpbmdJRCBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSBvciBhIHN0cmluZyEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSB0ZW1wbGF0ZSBpZCBzdHJpbmcKICAgIG15ICRNYXBwaW5nSURTdHJpbmcgPSBqb2luIHF7LCB9LCBtYXAgeyc/J30gQHsgJFBhcmFte01hcHBpbmdJRH0gfTsKCiAgICAjIGNyZWF0ZSBhbmQgYWRkIGJpbmQgcGFyYW1ldGVycwogICAgbXkgQEJJTkQgPSBtYXAgeyBcJF8gfSBAeyAkUGFyYW17TWFwcGluZ0lEfSB9OwoKICAgICMgZGVsZXRlIG1hcHBpbmcgZm9ybWF0IGRhdGEKICAgIHJldHVybiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAiREVMRVRFIEZST00gaW1leHBvcnRfbWFwcGluZ19mb3JtYXQgV0hFUkUgbWFwcGluZ19pZCBJTiAoICRNYXBwaW5nSURTdHJpbmcgKSIsCiAgICAgICAgQmluZCA9PiBcQEJJTkQsCiAgICApOwp9Cgo9aXRlbSBNYXBwaW5nRm9ybWF0RGF0YVNhdmUoKQoKc2F2ZSB0aGUgZm9ybWF0IGRhdGEgb2YgYSBtYXBwaW5nCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nRm9ybWF0RGF0YVNhdmUoCiAgICAgICAgTWFwcGluZ0lEICAgICAgICAgPT4gMTIzLAogICAgICAgIE1hcHBpbmdGb3JtYXREYXRhID0+ICRIYXNoUmVmLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdGb3JtYXREYXRhU2F2ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhNYXBwaW5nSUQgTWFwcGluZ0Zvcm1hdERhdGEgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIHJlZiAkUGFyYW17TWFwcGluZ0Zvcm1hdERhdGF9IG5lICdIQVNIJyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ01hcHBpbmdGb3JtYXREYXRhIG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZGVsZXRlIGV4aXN0aW5nIGZvcm1hdCBtYXBwaW5nIGRhdGEKICAgICRTZWxmLT5NYXBwaW5nRm9ybWF0RGF0YURlbGV0ZSgKICAgICAgICBNYXBwaW5nSUQgPT4gJFBhcmFte01hcHBpbmdJRH0sCiAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICBEQVRBS0VZOgogICAgZm9yIG15ICREYXRhS2V5ICggc29ydCBrZXlzICV7ICRQYXJhbXtNYXBwaW5nRm9ybWF0RGF0YX0gfSApIHsKCiAgICAgICAgbXkgJERhdGFWYWx1ZSA9ICRQYXJhbXtNYXBwaW5nRm9ybWF0RGF0YX0tPnskRGF0YUtleX07CgogICAgICAgIG5leHQgREFUQUtFWSBpZiAhZGVmaW5lZCAkRGF0YUtleTsKICAgICAgICBuZXh0IERBVEFLRVkgaWYgIWRlZmluZWQgJERhdGFWYWx1ZTsKCiAgICAgICAgIyBpbnNlcnQgb25lIG1hcHBpbmcgZm9ybWF0IHJvdwogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBpbWV4cG9ydF9tYXBwaW5nX2Zvcm1hdCAnCiAgICAgICAgICAgICAgICAuICcobWFwcGluZ19pZCwgZGF0YV9rZXksIGRhdGFfdmFsdWUpIFZBTFVFUyAoPywgPywgPyknLAogICAgICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtNYXBwaW5nSUR9LCBcJERhdGFLZXksIFwkRGF0YVZhbHVlIF0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gTWFwcGluZ0Zvcm1hdERhdGFHZXQoKQoKZ2V0IHRoZSBmb3JtYXQgZGF0YSBvZiBhIG1hcHBpbmcKCiAgICBteSAkT2JqZWN0RGF0YVJlZiA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdGb3JtYXREYXRhR2V0KAogICAgICAgIE1hcHBpbmdJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdGb3JtYXREYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE1hcHBpbmdJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICdTRUxFQ1QgZGF0YV9rZXksIGRhdGFfdmFsdWUgRlJPTSBpbWV4cG9ydF9tYXBwaW5nX2Zvcm1hdCBXSEVSRSBtYXBwaW5nX2lkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17TWFwcGluZ0lEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVNYXBwaW5nRm9ybWF0RGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJE1hcHBpbmdGb3JtYXREYXRheyAkUm93WzBdIH0gPSAkUm93WzFdOwogICAgfQoKICAgIHJldHVybiBcJU1hcHBpbmdGb3JtYXREYXRhOwp9Cgo9aXRlbSBTZWFyY2hBdHRyaWJ1dGVzR2V0KCkKCmdldCB0aGUgc2VhcmNoIGF0dHJpYnV0ZXMgb2YgYSBvYmplY3QgYmFja2VuZCBhcyBhcnJheS9oYXNoIHJlZmVyZW5jZQoKICAgIG15ICRBdHRyaWJ1dGVzID0gJEltcG9ydEV4cG9ydE9iamVjdC0+U2VhcmNoQXR0cmlidXRlc0dldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaEF0dHJpYnV0ZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgIG15ICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayB0ZW1wbGF0ZSBkYXRhCiAgICBpZiAoICEkVGVtcGxhdGVEYXRhIHx8ICEkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRlbXBsYXRlIHdpdGggSUQgJFBhcmFte1RlbXBsYXRlSUR9IGlzIGluY29tcGxldGUhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmQgPSAkS2VybmVsOjpPTS0+R2V0KCAnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6JyAuICRUZW1wbGF0ZURhdGEtPntPYmplY3R9ICk7CgogICAgcmV0dXJuIGlmICEkQmFja2VuZDsKCiAgICAjIGdldCBhbiBzZWFyY2ggYXR0cmlidXRlIGxpc3Qgb2YgYW4gb2JqZWN0CiAgICBteSAkQXR0cmlidXRlcyA9ICRCYWNrZW5kLT5TZWFyY2hBdHRyaWJ1dGVzR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkQXR0cmlidXRlczsKfQoKPWl0ZW0gU2VhcmNoRGF0YUdldCgpCgpnZXQgdGhlIHNlYXJjaCBkYXRhIGZyb20gYSB0ZW1wbGF0ZQoKICAgIG15ICRTZWFyY2hEYXRhUmVmID0gJEltcG9ydEV4cG9ydE9iamVjdC0+U2VhcmNoRGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hEYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFzayBkYXRhYmFzZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAnU0VMRUNUIGRhdGFfa2V5LCBkYXRhX3ZhbHVlIEZST00gaW1leHBvcnRfc2VhcmNoIFdIRVJFIHRlbXBsYXRlX2lkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VGVtcGxhdGVJRH0gXSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlU2VhcmNoRGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFNlYXJjaERhdGF7ICRSb3dbMF0gfSA9ICRSb3dbMV07CiAgICB9CgogICAgcmV0dXJuIFwlU2VhcmNoRGF0YTsKfQoKPWl0ZW0gU2VhcmNoRGF0YVNhdmUoKQoKc2F2ZSB0aGUgc2VhcmNoIGRhdGEgb2YgYSB0ZW1wbGF0ZQoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+U2VhcmNoRGF0YVNhdmUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgU2VhcmNoRGF0YSA9PiAkSGFzaFJlZiwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaERhdGFTYXZlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgU2VhcmNoRGF0YSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggcmVmICRQYXJhbXtTZWFyY2hEYXRhfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdTZWFyY2hEYXRhIG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZGVsZXRlIGV4aXN0aW5nIHNlYXJjaCBkYXRhCiAgICAkU2VsZi0+U2VhcmNoRGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICBEQVRBS0VZOgogICAgZm9yIG15ICREYXRhS2V5ICggc29ydCBrZXlzICV7ICRQYXJhbXtTZWFyY2hEYXRhfSB9ICkgewoKICAgICAgICAjIHF1b3RlCiAgICAgICAgbXkgJERhdGFWYWx1ZSA9ICRQYXJhbXtTZWFyY2hEYXRhfS0+eyREYXRhS2V5fTsKCiAgICAgICAgbmV4dCBEQVRBS0VZIGlmICEkRGF0YUtleTsKICAgICAgICBuZXh0IERBVEFLRVkgaWYgISREYXRhVmFsdWU7CgogICAgICAgICMgaW5zZXJ0IG9uZSByb3cKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gaW1leHBvcnRfc2VhcmNoICcKICAgICAgICAgICAgICAgIC4gJyh0ZW1wbGF0ZV9pZCwgZGF0YV9rZXksIGRhdGFfdmFsdWUpIFZBTFVFUyAoPywgPywgPyknLAogICAgICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSwgXCREYXRhS2V5LCBcJERhdGFWYWx1ZSBdLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFNlYXJjaERhdGFEZWxldGUoKQoKZGVsZXRlIHRoZSBleGlzdGluZyBzZWFyY2ggZGF0YSBvZiBhIHRlbXBsYXRlCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5TZWFyY2hEYXRhRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlNlYXJjaERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiBbMSw0NCwxNjYsNV0sCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hEYXRhRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICFyZWYgJFBhcmFte1RlbXBsYXRlSUR9ICkgewogICAgICAgICRQYXJhbXtUZW1wbGF0ZUlEfSA9IFsgJFBhcmFte1RlbXBsYXRlSUR9IF07CiAgICB9CiAgICBlbHNpZiAoIHJlZiAkUGFyYW17VGVtcGxhdGVJRH0gbmUgJ0FSUkFZJyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1RlbXBsYXRlSUQgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2Ugb3IgYSBzdHJpbmchJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgdGVtcGxhdGUgaWQgc3RyaW5nCiAgICBteSAkVGVtcGxhdGVJRFN0cmluZyA9IGpvaW4gcXssIH0sIG1hcCB7Jz8nfSBAeyAkUGFyYW17VGVtcGxhdGVJRH0gfTsKCiAgICAjIGNyZWF0ZSBhbmQgYWRkIGJpbmQgcGFyYW1ldGVycwogICAgbXkgQEJJTkQgPSBtYXAgeyBcJF8gfSBAeyAkUGFyYW17VGVtcGxhdGVJRH0gfTsKCiAgICAjIGRlbGV0ZSB0ZW1wbGF0ZXMKICAgIHJldHVybiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAiREVMRVRFIEZST00gaW1leHBvcnRfc2VhcmNoIFdIRVJFIHRlbXBsYXRlX2lkIElOICggJFRlbXBsYXRlSURTdHJpbmcgKSIsCiAgICAgICAgQmluZCA9PiBcQEJJTkQsCiAgICApOwp9Cgo9aXRlbSBFeHBvcnQoKQoKZXhwb3J0IGZ1bmN0aW9uCgogICAgbXkgJFJlc3VsdFJlZiA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkV4cG9ydCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKcmV0dXJucyBzb21ldGhpbmcgbGlrZQoKICAgICRSZXN1bHRSZWYgPSB7CiAgICAgICAgU3VjY2VzcyAgID0+IDIsCiAgICAgICAgRmFpbGVkICAgID0+IDAsCiAgICAgICAgRGVzdGluYXRpb25Db250ZW50ID0+IFsKICAgICAgICAgICAgWyAnQXR0cl8xYScsICdBdHRyXzFiJywgJ0F0dHJfMWMnLCBdLAogICAgICAgICAgICBbICdBdHRyXzJhJywgJ0F0dHJfMmInLCAnQXR0cl8zYycsIF0sCiAgICAgICAgXSwKICAgIH07Cgo9Y3V0CgpzdWIgRXhwb3J0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICBteSAkVGVtcGxhdGVEYXRhID0gJFNlbGYtPlRlbXBsYXRlR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgdGVtcGxhdGUgZGF0YQogICAgaWYgKCAhJFRlbXBsYXRlRGF0YSB8fCAhJFRlbXBsYXRlRGF0YS0+e09iamVjdH0gfHwgISRUZW1wbGF0ZURhdGEtPntGb3JtYXR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGVtcGxhdGUgd2l0aCBJRCAkUGFyYW17VGVtcGxhdGVJRH0gaXMgaW5jb21wbGV0ZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBvYmplY3QgYmFja2VuZAogICAgbXkgJE9iamVjdEJhY2tlbmQgPSAkS2VybmVsOjpPTS0+R2V0KCAnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6JyAuICRUZW1wbGF0ZURhdGEtPntPYmplY3R9ICk7CgogICAgcmV0dXJuIGlmICEkT2JqZWN0QmFja2VuZDsKCiAgICAjIGxvYWQgZm9ybWF0IGJhY2tlbmQKICAgIG15ICRGb3JtYXRCYWNrZW5kID0gJEtlcm5lbDo6T00tPkdldCggJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmQ6OicgLiAkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSApOwoKICAgIHJldHVybiBpZiAhJEZvcm1hdEJhY2tlbmQ7CgogICAgIyBnZXQgZXhwb3J0IGRhdGEKICAgIG15ICRFeHBvcnREYXRhID0gJE9iamVjdEJhY2tlbmQtPkV4cG9ydERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBnZXQgZm9ybWF0IGRhdGEKICAgIG15ICRGb3JtYXREYXRhID0gJFNlbGYtPkZvcm1hdERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBpZiBjb2x1bW4gaGVhZGVycyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGV4cG9ydAogICAgaWYgKCAkRm9ybWF0RGF0YS0+e0luY2x1ZGVDb2x1bW5IZWFkZXJzfSApIHsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGF0dHJpYnV0ZXMgKHRoZSBuYW1lIG9mIHRoZSBjb2x1bW5zKQogICAgICAgIG15ICRNYXBwaW5nT2JqZWN0QXR0cmlidXRlcyA9ICRTZWxmLT5NYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgYSBsb29rdXAgaGFzaCBmb3IgdGhlIG9iamVjdCBhdHRyaWJ1dGUgbmFtZXMKICAgICAgICBteSAlQXR0cmlidXRlTG9va3VwCiAgICAgICAgICAgID0gbWFwIHsgJF8tPntLZXl9ID0+ICRfLT57VmFsdWV9IH0gQHsgJE1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzLT5bMF0tPntJbnB1dH0tPntEYXRhfSB9OwoKICAgICAgICAjIGdldCBtYXBwaW5nIGRhdGEgbGlzdAogICAgICAgIG15ICRNYXBwaW5nTGlzdCA9ICRTZWxmLT5NYXBwaW5nTGlzdCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdGhlIGNvbHVtbiBuYW1lcwogICAgICAgIG15IEBDb2x1bW5OYW1lczsKICAgICAgICBmb3IgbXkgJE1hcHBpbmdJRCAoIEB7JE1hcHBpbmdMaXN0fSApIHsKCiAgICAgICAgICAgICMgZ2V0IG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgICAgICAgICAgbXkgJE1hcHBpbmdPYmplY3REYXRhID0gJFNlbGYtPk1hcHBpbmdPYmplY3REYXRhR2V0KAogICAgICAgICAgICAgICAgTWFwcGluZ0lEID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCB0aGUgY29sdW1uIG5hbWUKICAgICAgICAgICAgbXkgJENvbHVtbk5hbWUgPSAkQXR0cmlidXRlTG9va3VweyAkTWFwcGluZ09iamVjdERhdGEtPntLZXl9IH07CgogICAgICAgICAgICBwdXNoIEBDb2x1bW5OYW1lcywgJENvbHVtbk5hbWU7CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBjb2x1bW4gaGVhZGVycyBhcyBmaXJzdCByb3cKICAgICAgICB1bnNoaWZ0IEB7JEV4cG9ydERhdGF9LCBcQENvbHVtbk5hbWVzOwogICAgfQoKICAgIG15ICVSZXN1bHQgPSAoCiAgICAgICAgU3VjY2VzcyAgICAgICAgICAgID0+IDAsCiAgICAgICAgRmFpbGVkICAgICAgICAgICAgID0+IDAsCiAgICAgICAgRGVzdGluYXRpb25Db250ZW50ID0+IFtdLAogICAgKTsKCiAgICBFWFBPUlREQVRBUk9XOgogICAgZm9yIG15ICRFeHBvcnREYXRhUm93ICggQHskRXhwb3J0RGF0YX0gKSB7CgogICAgICAgICMgZXhwb3J0IG9uZSByb3cKICAgICAgICBteSAkRGVzdGluYXRpb25Db250ZW50Um93ID0gJEZvcm1hdEJhY2tlbmQtPkV4cG9ydERhdGFTYXZlKAogICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiAkRXhwb3J0RGF0YVJvdywKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICFkZWZpbmVkICREZXN0aW5hdGlvbkNvbnRlbnRSb3cgKSB7CiAgICAgICAgICAgICRSZXN1bHR7RmFpbGVkfSsrOwogICAgICAgICAgICBuZXh0IEVYUE9SVERBVEFST1c7CiAgICAgICAgfQoKICAgICAgICAjIGFkZCByb3cgdG8gZGVzdGluYXRpb24gY29udGVudAogICAgICAgIHB1c2ggQHsgJFJlc3VsdHtEZXN0aW5hdGlvbkNvbnRlbnR9IH0sICREZXN0aW5hdGlvbkNvbnRlbnRSb3c7CiAgICAgICAgJFJlc3VsdHtTdWNjZXNzfSsrOwogICAgfQoKICAgICMgbG9nIHJlc3VsdAogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgTWVzc2FnZSAgPT4gIkV4cG9ydCBvZiAkUmVzdWx0e0ZhaWxlZH0gcmVjb3JkcyAoJFRlbXBsYXRlRGF0YS0+e09iamVjdH0pOiBmYWlsZWQhIiwKICAgICk7CiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICBNZXNzYWdlICA9PiAiRXhwb3J0IG9mICRSZXN1bHR7U3VjY2Vzc30gcmVjb3JkcyAoJFRlbXBsYXRlRGF0YS0+e09iamVjdH0pOiBzdWNjZXNzZnVsISIsCiAgICApOwoKICAgIHJldHVybiBcJVJlc3VsdDsKfQoKPWl0ZW0gSW1wb3J0KCkKCmltcG9ydCBmdW5jdGlvbgoKICAgIG15ICRSZXN1bHRSZWYgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5JbXBvcnQoCiAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAxMjMsCiAgICAgICAgU291cmNlQ29udGVudCA9PiAkU3RyaW5nUmVmLCAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgIG15ICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayB0ZW1wbGF0ZSBkYXRhCiAgICBpZiAoICEkVGVtcGxhdGVEYXRhIHx8ICEkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSB8fCAhJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUZW1wbGF0ZSB3aXRoIElEICRQYXJhbXtUZW1wbGF0ZUlEfSBpcyBpbmNvbXBsZXRlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIG9iamVjdCBiYWNrZW5kCiAgICBteSAkT2JqZWN0QmFja2VuZCA9ICRLZXJuZWw6Ok9NLT5HZXQoICdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjonIC4gJFRlbXBsYXRlRGF0YS0+e09iamVjdH0gKTsKCiAgICByZXR1cm4gaWYgISRPYmplY3RCYWNrZW5kOwoKICAgICMgbG9hZCBmb3JtYXQgYmFja2VuZAogICAgbXkgJEZvcm1hdEJhY2tlbmQgPSAkS2VybmVsOjpPTS0+R2V0KCAnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6JyAuICRUZW1wbGF0ZURhdGEtPntGb3JtYXR9ICk7CgogICAgcmV0dXJuIGlmICEkRm9ybWF0QmFja2VuZDsKCiAgICAjIGdldCBpbXBvcnQgZGF0YQogICAgbXkgJEltcG9ydERhdGEgPSAkRm9ybWF0QmFja2VuZC0+SW1wb3J0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBTb3VyY2VDb250ZW50ID0+ICRQYXJhbXtTb3VyY2VDb250ZW50fSwKICAgICAgICBVc2VySUQgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gaWYgISRJbXBvcnREYXRhOwoKICAgICMgZ2V0IGZvcm1hdCBkYXRhCiAgICBteSAkRm9ybWF0RGF0YSA9ICRTZWxmLT5Gb3JtYXREYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgaWYgY29sdW1uIGhlYWRlcnMgYXJlIGFjdGl2YXRlZCwgdGhlIGZpcnN0IHJvdyBtdXN0IGJlIHJlbW92ZWQKICAgIGlmICggJEZvcm1hdERhdGEtPntJbmNsdWRlQ29sdW1uSGVhZGVyc30gKSB7CiAgICAgICAgc2hpZnQgQHskSW1wb3J0RGF0YX07CiAgICB9CgogICAgIyBOdW1iZXIgb2Ygc3VjY2Vzc2Z1bGx5IGFuZCBub3Qgc3VjY2Vzc2Z1bGx5IGltcG9ydGVkIHJvd3MKICAgIG15ICVSZXN1bHQgPSAoCiAgICAgICAgT2JqZWN0ICA9PiAkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgRmFpbGVkICA9PiAwLAogICAgICAgIFJldENvZGUgPT4ge30sCiAgICAgICAgQ291bnRlciA9PiAwLAogICAgKTsKICAgIElNUE9SVERBVEFST1c6CiAgICBmb3IgbXkgJEltcG9ydERhdGFSb3cgKCBAeyRJbXBvcnREYXRhfSApIHsKCiAgICAgICAgJFJlc3VsdHtDb3VudGVyfSsrOwoKICAgICAgICAjIGltcG9ydCBhIHNpbmdsZSByb3cKICAgICAgICBteSAoICRJRCwgJFJldENvZGUgKSA9ICRPYmplY3RCYWNrZW5kLT5JbXBvcnREYXRhU2F2ZSgKICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gJEltcG9ydERhdGFSb3csCiAgICAgICAgICAgIENvdW50ZXIgICAgICAgPT4gJFJlc3VsdHtDb3VudGVyfSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkSUQgKSB7CgogICAgICAgICAgICAjIGNvdW50IER1cGxpY2F0ZU5hbWUgZW50cmllcyBhcyBlcnJvcnMKICAgICAgICAgICAgaWYgKCAkUmV0Q29kZSAmJiAkUmV0Q29kZSA9fiBteyBcQSBEdXBsaWNhdGVOYW1lIH14bXMgKSB7CiAgICAgICAgICAgICAgICAkUmVzdWx0e1JldENvZGV9LT57JFJldENvZGV9Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFJlc3VsdHtGYWlsZWR9Kys7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUmVzdWx0e1JldENvZGV9LT57JFJldENvZGV9Kys7CiAgICAgICAgICAgICRSZXN1bHR7U3VjY2Vzc30rKzsKICAgICAgICB9CiAgICB9CgogICAgIyBsb2cgcmVzdWx0CiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICJJbXBvcnQgb2YgJFJlc3VsdHtDb3VudGVyfSAkUmVzdWx0e09iamVjdH0gcmVjb3JkczogIgogICAgICAgICAgICAuICIkUmVzdWx0e0ZhaWxlZH0gZmFpbGVkLCAkUmVzdWx0e1N1Y2Nlc3N9IHN1Y2NlZWRlZCIsCiAgICApOwogICAgZm9yIG15ICRSZXRDb2RlICggc29ydCBrZXlzICV7ICRSZXN1bHR7UmV0Q29kZX0gfSApIHsKICAgICAgICBteSAkQ291bnQgPSAkUmVzdWx0e1JldENvZGV9LT57JFJldENvZGV9IHx8IDA7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAiSW1wb3J0IG9mICRSZXN1bHR7Q291bnRlcn0gJFJlc3VsdHtPYmplY3R9IHJlY29yZHM6ICRDb3VudCAkUmV0Q29kZSIsCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFJlc3VsdHtGYWlsZWR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkxhc3QgcHJvY2Vzc2VkIGxpbmUgbnVtYmVyIG9mIGltcG9ydCBmaWxlOiAkUmVzdWx0e0NvdW50ZXJ9IiwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiBcJVJlc3VsdDsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgU29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0L0Zvcm1hdEJhY2tlbmQvQ1NWLnBtIC0gaW1wb3J0L2V4cG9ydCBiYWNrZW5kIGZvciBDU1YKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmQ6OkNTVjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kOjpDU1YgLSBpbXBvcnQvZXhwb3J0IGJhY2tlbmQgZm9yIENTVgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgZnVuY3Rpb25zIHRvIGltcG9ydCBhbmQgZXhwb3J0IGEgY3N2IGZvcm1hdAoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRJbXBvcnRFeHBvcnRDU1ZCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6Q1NWJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIGlmICggISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoJ1RleHQ6OkNTVicpICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ1BBTiBtb2R1bGUgVGV4dDo6Q1NWIGlzIHJlcXVpcmVkIHRvIHVzZSB0aGUgQ1NWIGltcG9ydC9leHBvcnQgbW9kdWxlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWZpbmUgYXZhaWxhYmxlIHNlcGFyYXRvcnMKICAgICRTZWxmLT57QXZhaWxhYmxlU2VwYXJhdG9yc30gPSB7CiAgICAgICAgVGFidWxhdG9yID0+ICJcdCIsCiAgICAgICAgU2VtaWNvbG9uID0+ICc7JywKICAgICAgICBDb2xvbiAgICAgPT4gJzonLAogICAgICAgIERvdCAgICAgICA9PiAnLicsCiAgICAgICAgQ29tbWEgICAgID0+ICcsJywKICAgIH07CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBGb3JtYXRBdHRyaWJ1dGVzR2V0KCkKCmdldCB0aGUgZm9ybWF0IGF0dHJpYnV0ZXMgb2YgYSBmb3JtYXQgYXMgYXJyYXkvaGFzaCByZWZlcmVuY2UKCiAgICBteSAkQXR0cmlidXRlcyA9ICRGb3JtYXRCYWNrZW5kLT5Gb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBGb3JtYXRBdHRyaWJ1dGVzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkQXR0cmlidXRlcyA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdDb2x1bW5TZXBhcmF0b3InLAogICAgICAgICAgICBOYW1lICA9PiAnQ29sdW1uIFNlcGFyYXRvcicsCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1NlbGVjdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUYWJ1bGF0b3IgPT4gJ1RhYnVsYXRvciAoVEFCKScsCiAgICAgICAgICAgICAgICAgICAgU2VtaWNvbG9uID0+ICdTZW1pY29sb24gKDspJywKICAgICAgICAgICAgICAgICAgICBDb2xvbiAgICAgPT4gJ0NvbG9uICg6KScsCiAgICAgICAgICAgICAgICAgICAgRG90ICAgICAgID0+ICdEb3QgKC4pJywKICAgICAgICAgICAgICAgICAgICBDb21tYSAgICAgPT4gJ0NvbW1hICgsKScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUmVxdWlyZWQgICAgID0+IDEsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnQ2hhcnNldCcsCiAgICAgICAgICAgIE5hbWUgID0+ICdDaGFyc2V0JywKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgIFZhbHVlRGVmYXVsdCA9PiAnVVRGLTgnLAogICAgICAgICAgICAgICAgUmVxdWlyZWQgICAgID0+IDEsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgIFNpemUgICAgICAgICA9PiAyMCwKICAgICAgICAgICAgICAgIE1heExlbmd0aCAgICA9PiAyMCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0luY2x1ZGVDb2x1bW5IZWFkZXJzJywKICAgICAgICAgICAgTmFtZSAgPT4gJ0luY2x1ZGUgQ29sdW1uIEhlYWRlcnMnLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdTZWxlY3Rpb24nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgMCA9PiAnTm8nLAogICAgICAgICAgICAgICAgICAgIDEgPT4gJ1llcycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgXTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZXM7Cn0KCj1pdGVtIE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0KCkKCmdldCB0aGUgbWFwcGluZyBhdHRyaWJ1dGVzIG9mIGFuIGZvcm1hdCBhcyBhcnJheS9oYXNoIHJlZmVyZW5jZQoKICAgIG15ICRBdHRyaWJ1dGVzID0gJEZvcm1hdEJhY2tlbmQtPk1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdAogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRBdHRyaWJ1dGVzID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0NvbHVtbicsCiAgICAgICAgICAgIE5hbWUgID0+ICdDb2x1bW4nLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAnRFRMJywKICAgICAgICAgICAgICAgIERhdGEgICAgID0+ICckUURhdGF7IkNvdW50ZXIifScsCiAgICAgICAgICAgICAgICBSZXF1aXJlZCA9PiAwLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICBdOwoKICAgIHJldHVybiAkQXR0cmlidXRlczsKfQoKPWl0ZW0gSW1wb3J0RGF0YUdldCgpCgpnZXQgaW1wb3J0IGRhdGEgYXMgMkQtYXJyYXkgcmVmZXJlbmNlCgogICAgbXkgJEltcG9ydERhdGEgPSAkRm9ybWF0QmFja2VuZC0+SW1wb3J0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEICAgID0+IDEyMywKICAgICAgICBTb3VyY2VDb250ZW50ID0+ICRTdHJpbmdSZWYsICAjIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydERhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBbXSBpZiAhZGVmaW5lZCAkUGFyYW17U291cmNlQ29udGVudH07CgogICAgIyBjaGVjayBzb3VyY2UgY29udGVudAogICAgaWYgKCByZWYgJFBhcmFte1NvdXJjZUNvbnRlbnR9IG5lICdTQ0FMQVInICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnU291cmNlQ29udGVudCBtdXN0IGJlIGEgc2NhbGFyIHJlZmVyZW5jZScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgZm9ybWF0IGRhdGEKICAgIG15ICRGb3JtYXREYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydCcpLT5Gb3JtYXREYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZm9ybWF0IGRhdGEKICAgIGlmICggISRGb3JtYXREYXRhIHx8IHJlZiAkRm9ybWF0RGF0YSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBmb3JtYXQgZGF0YSBmb3VuZCBmb3IgdGhlIHRlbXBsYXRlIGlkICRQYXJhbXtUZW1wbGF0ZUlEfSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgY2hhcnNldAogICAgbXkgJENoYXJzZXQgPSAkRm9ybWF0RGF0YS0+e0NoYXJzZXR9IHx8PSAnJzsKICAgICRDaGFyc2V0ID1+IHN7IFxzKiAodXRmLTh8dXRmOCkgXHMqIH17VVRGLTh9eG1zaTsKCiAgICAjIGNoZWNrIHRoZSBjaGFyc2V0CiAgICBpZiAoICEkQ2hhcnNldCApIHsKCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyB2YWxpZCBjaGFyc2V0IGZvdW5kIGZvciB0aGUgdGVtcGxhdGUgaWQgJFBhcmFte1RlbXBsYXRlSUR9IiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBzZXBhcmF0b3IKICAgICRGb3JtYXREYXRhLT57Q29sdW1uU2VwYXJhdG9yfSB8fD0gJyc7CiAgICBteSAkU2VwYXJhdG9yID0gJFNlbGYtPntBdmFpbGFibGVTZXBhcmF0b3JzfS0+eyAkRm9ybWF0RGF0YS0+e0NvbHVtblNlcGFyYXRvcn0gfSB8fCAnJzsKCiAgICAjIGNoZWNrIHRoZSBzZXBhcmF0b3IKICAgIGlmICggISRTZXBhcmF0b3IgKSB7CgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gdmFsaWQgc2VwYXJhdG9yIGZvdW5kIGZvciB0aGUgdGVtcGxhdGUgaWQgJFBhcmFte1RlbXBsYXRlSUR9IiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgcGFyc2VyIG9iamVjdAogICAgbXkgJFBhcnNlT2JqZWN0ID0gVGV4dDo6Q1NWLT5uZXcoCiAgICAgICAgewogICAgICAgICAgICBxdW90ZV9jaGFyICAgICAgICAgID0+ICciJywKICAgICAgICAgICAgZXNjYXBlX2NoYXIgICAgICAgICA9PiAnIicsCiAgICAgICAgICAgIHNlcF9jaGFyICAgICAgICAgICAgPT4gJFNlcGFyYXRvciwKICAgICAgICAgICAgZW9sICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgYWx3YXlzX3F1b3RlICAgICAgICA9PiAxLAogICAgICAgICAgICBiaW5hcnkgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIGtlZXBfbWV0YV9pbmZvICAgICAgPT4gMCwKICAgICAgICAgICAgYWxsb3dfbG9vc2VfcXVvdGVzICA9PiAwLAogICAgICAgICAgICBhbGxvd19sb29zZV9lc2NhcGVzID0+IDAsCiAgICAgICAgICAgIGFsbG93X3doaXRlc3BhY2UgICAgPT4gMCwKICAgICAgICAgICAgYmxhbmtfaXNfdW5kZWYgICAgICA9PiAwLAogICAgICAgICAgICB2ZXJiYXRpbSAgICAgICAgICAgID0+IDAsCiAgICAgICAgfQogICAgKTsKCiAgICAjIGNyZWF0ZSBhbiBpbiBtZW1vcnkgdGVtcCBmaWxlIGFuZCBvcGVuIGl0CiAgICBteSAkRmlsZUNvbnRlbnQgPSAnJzsKICAgIG9wZW4gbXkgJEZILCAnKzwnLCBcJEZpbGVDb250ZW50OyAgICAjIyBubyBjcml0aWMKCiAgICAjIHdyaXRlIHNvdXJjZSBjb250ZW50CiAgICBwcmludCAkRkggJHsgJFBhcmFte1NvdXJjZUNvbnRlbnR9IH07CgogICAgIyByZXdpbmQgZmlsZSBoYW5kbGUKICAgIHNlZWsgJEZILCAwLCAwOwoKICAgICMgcGFyc2UgdGhlIGNvbnRlbnQKICAgIG15ICRMaW5lQ291bnQgPSAxOwogICAgbXkgQEltcG9ydERhdGE7CgogICAgIyBpdCBpcyBpbXBvcnRhbnQgdG8gdXNlIHRoaXMgc3ludGF4ICJ3aGlsZSAoICFlb2YoJEZIKSApIgogICAgIyBhcyB0aGUgQ1BBTiBtb2R1bGUgVGV4dDo6Q1NWX1hTIG1pZ2h0IHNob3cgZXJyb3JzIGlmIHRoZQogICAgIyBnZXRsaW5lIGNhbGwgaXMgd2l0aGluIHRoZSB3aGlsZSB0ZXN0CiAgICAjIGhhdmUgYSBsb29rIGF0IGh0dHA6Ly9idWdzLm90cnMub3JnL3Nob3dfYnVnLmNnaT9pZD05MjcwCiAgICB3aGlsZSAoICFlb2YoJEZIKSApIHsKICAgICAgICBteSAkQ29sdW1uID0gJFBhcnNlT2JqZWN0LT5nZXRsaW5lKCRGSCk7CiAgICAgICAgcHVzaCBASW1wb3J0RGF0YSwgJENvbHVtbjsKICAgICAgICAkTGluZUNvdW50Kys7CiAgICB9CgogICAgIyBlcnJvciBoYW5kbGluZwogICAgbXkgKCAkUGFyc2VFcnJvckNvZGUsICRQYXJzZUVycm9yU3RyaW5nICkgPSAkUGFyc2VPYmplY3QtPmVycm9yX2RpYWcoKTsKICAgIGlmICgkUGFyc2VFcnJvckNvZGUpIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkltcG9ydEVycm9yIGF0IGxpbmUgJExpbmVDb3VudCwgIgogICAgICAgICAgICAgICAgLiAiRXJyb3JDb2RlOiAkUGFyc2VFcnJvckNvZGUgJyRQYXJzZUVycm9yU3RyaW5nJyAiLAogICAgICAgICk7CiAgICB9CgogICAgIyBjbG9zZSB0aGUgaW4gbWVtb3J5IGZpbGUgaGFuZGxlCiAgICBjbG9zZSAkRkg7CgogICAgcmV0dXJuIFxASW1wb3J0RGF0YSBpZiAkQ2hhcnNldCBuZSAnVVRGLTgnOwoKICAgICMgc2V0IHV0ZjggZmxhZwogICAgZm9yIG15ICRSb3cgKEBJbXBvcnREYXRhKSB7CiAgICAgICAgZm9yIG15ICRDZWxsICggQHskUm93fSApIHsKICAgICAgICAgICAgRW5jb2RlOjpfdXRmOF9vbigkQ2VsbCk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBcQEltcG9ydERhdGE7Cn0KCj1pdGVtIEV4cG9ydERhdGFTYXZlKCkKCmV4cG9ydCBvbmUgcm93IG9mIHRoZSBleHBvcnQgZGF0YQoKICAgIG15ICREZXN0aW5hdGlvbkNvbnRlbnQgPSAkRm9ybWF0QmFja2VuZC0+RXhwb3J0RGF0YVNhdmUoCiAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAxMjMsCiAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiAkQXJyYXlSZWYsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBFeHBvcnREYXRhU2F2ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIEV4cG9ydERhdGFSb3cgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGV4cG9ydCBkYXRhIHJvdwogICAgaWYgKCByZWYgJFBhcmFte0V4cG9ydERhdGFSb3d9IG5lICdBUlJBWScgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdFeHBvcnREYXRhUm93IG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBmb3JtYXQgZGF0YQogICAgbXkgJEZvcm1hdERhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0JyktPkZvcm1hdERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBmb3JtYXQgZGF0YQogICAgaWYgKCAhJEZvcm1hdERhdGEgfHwgcmVmICRGb3JtYXREYXRhIG5lICdIQVNIJyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIGZvcm1hdCBkYXRhIGZvdW5kIGZvciB0aGUgdGVtcGxhdGUgaWQgJFBhcmFte1RlbXBsYXRlSUR9IiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBjaGFyc2V0CiAgICBteSAkQ2hhcnNldCA9ICRGb3JtYXREYXRhLT57Q2hhcnNldH0gfHw9ICcnOwogICAgJENoYXJzZXQgPX4gc3sgXHMqICh1dGYtOHx1dGY4KSBccyogfXtVVEYtOH14bXNpOwoKICAgICMgY2hlY2sgdGhlIGNoYXJzZXQKICAgIGlmICggISRDaGFyc2V0ICkgewoKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHZhbGlkIGNoYXJzZXQgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGNoYXJzZXQKICAgICRGb3JtYXREYXRhLT57Q29sdW1uU2VwYXJhdG9yfSB8fD0gJyc7CiAgICBteSAkU2VwYXJhdG9yID0gJFNlbGYtPntBdmFpbGFibGVTZXBhcmF0b3JzfS0+eyAkRm9ybWF0RGF0YS0+e0NvbHVtblNlcGFyYXRvcn0gfSB8fCAnJzsKCiAgICAjIGNoZWNrIHRoZSBzZXBhcmF0b3IKICAgIGlmICggISRTZXBhcmF0b3IgKSB7CgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gdmFsaWQgc2VwYXJhdG9yIGZvdW5kIGZvciB0aGUgdGVtcGxhdGUgaWQgJFBhcmFte1RlbXBsYXRlSUR9IiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgcGFyc2VyIG9iamVjdAogICAgbXkgJFBhcnNlT2JqZWN0ID0gVGV4dDo6Q1NWLT5uZXcoCiAgICAgICAgewogICAgICAgICAgICBxdW90ZV9jaGFyICAgICAgICAgID0+ICciJywKICAgICAgICAgICAgZXNjYXBlX2NoYXIgICAgICAgICA9PiAnIicsCiAgICAgICAgICAgIHNlcF9jaGFyICAgICAgICAgICAgPT4gJFNlcGFyYXRvciwKICAgICAgICAgICAgZW9sICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgYWx3YXlzX3F1b3RlICAgICAgICA9PiAxLAogICAgICAgICAgICBiaW5hcnkgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIGtlZXBfbWV0YV9pbmZvICAgICAgPT4gMCwKICAgICAgICAgICAgYWxsb3dfbG9vc2VfcXVvdGVzICA9PiAwLAogICAgICAgICAgICBhbGxvd19sb29zZV9lc2NhcGVzID0+IDAsCiAgICAgICAgICAgIGFsbG93X3doaXRlc3BhY2UgICAgPT4gMCwKICAgICAgICAgICAgYmxhbmtfaXNfdW5kZWYgICAgICA9PiAwLAogICAgICAgICAgICB2ZXJiYXRpbSAgICAgICAgICAgID0+IDAsCiAgICAgICAgfQogICAgKTsKCiAgICBpZiAoICEkUGFyc2VPYmplY3QtPmNvbWJpbmUoIEB7ICRQYXJhbXtFeHBvcnREYXRhUm93fSB9ICkgKSB7CgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgY29tYmluZSB0aGUgZXhwb3J0IGRhdGEgdG8gYSBzdHJpbmchIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgQ1NWIHN0cmluZwogICAgbXkgJFN0cmluZyA9ICRQYXJzZU9iamVjdC0+c3RyaW5nKCk7CgogICAgcmV0dXJuICRTdHJpbmcgaWYgJENoYXJzZXQgbmUgJ1VURi04JzsKCiAgICAjIHNldCB1dGY4IGZsYWcKICAgIEVuY29kZTo6X3V0Zjhfb24oJFN0cmluZyk7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIEltcG9ydEV4cG9ydC50IC0gYWxsIGdlbmVyYWwgaW1wb3J0IGV4cG9ydCB0ZXN0cwojIENvcHlyaWdodCAoQykgMjAwMS0yMDE0IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyBxdygkU2VsZik7CgpteSAkQ29uZmlnT2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKbXkgJFVzZXJPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7Cm15ICRJbXBvcnRFeHBvcnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0Jyk7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgbWFrZSBwcmVwYXJhdGlvbnMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBjcmVhdGUgbmVlZGVkIHVzZXJzCm15IEBVc2VySURzOwp7CgogICAgIyBkaXNhYmxlIGVtYWlsIGNoZWNrcyB0byBjcmVhdGUgbmV3IHVzZXIKICAgIG15ICRDaGVja0VtYWlsQWRkcmVzc2VzT3JnID0KICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ0NoZWNrRW1haWxBZGRyZXNzZXMnKSB8fCAxOwoKICAgICRDb25maWdPYmplY3QtPlNldCgKICAgICAgICBLZXkgICA9PiAnQ2hlY2tFbWFpbEFkZHJlc3NlcycsCiAgICAgICAgVmFsdWUgPT4gMCwKICAgICk7CgogICAgZm9yIG15ICRDb3VudGVyICggMSAuLiAyICkgewoKICAgICAgICAjIGNyZWF0ZSBuZXcgdXNlcnMgZm9yIHRoZSB0ZXN0cwogICAgICAgIG15ICRVc2VySUQgPSAkVXNlck9iamVjdC0+VXNlckFkZCgKICAgICAgICAgICAgVXNlckZpcnN0bmFtZSA9PiAnSW1wb3J0RXhwb3J0JyAuICRDb3VudGVyLAogICAgICAgICAgICBVc2VyTGFzdG5hbWUgID0+ICdVbml0VGVzdCcsCiAgICAgICAgICAgIFVzZXJMb2dpbiAgICAgPT4gJ1VuaXRUZXN0LUltcG9ydEV4cG9ydC0nIC4gJENvdW50ZXIgLiBpbnQgcmFuZCAxXzAwMF8wMDAsCiAgICAgICAgICAgIFVzZXJFbWFpbCAgICAgPT4gJ1VuaXRUZXN0LUltcG9ydEV4cG9ydC0nIC4gJENvdW50ZXIgLiAnQGxvY2FsaG9zdCcsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlVXNlcklEICA9PiAxLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQFVzZXJJRHMsICRVc2VySUQ7CiAgICB9CgogICAgIyByZXN0b3JlIG9yaWdpbmFsIGVtYWlsIGNoZWNrIHBhcmFtCgogICAgJENvbmZpZ09iamVjdC0+U2V0KAogICAgICAgIEtleSAgID0+ICdDaGVja0VtYWlsQWRkcmVzc2VzJywKICAgICAgICBWYWx1ZSA9PiAkQ2hlY2tFbWFpbEFkZHJlc3Nlc09yZywKICAgICk7Cn0KCiMgY3JlYXRlIG5lZWRlZCByYW5kb20gdGVtcGxhdGUgbmFtZXMKbXkgQFRlbXBsYXRlTmFtZTsKCmZvciBteSAkQ291bnRlciAoIDEgLi4gNSApIHsKCiAgICBwdXNoIEBUZW1wbGF0ZU5hbWUsICdVbml0VGVzdCcgLiBpbnQgcmFuZCAxXzAwMF8wMDA7Cn0KCiMgY3JlYXRlIG5lZWRlZCByYW5kb20gb2JqZWN0IG5hbWVzCm15IEBPYmplY3ROYW1lOwpwdXNoIEBPYmplY3ROYW1lLCAnVW5pdFRlc3QnIC4gaW50IHJhbmQgMV8wMDBfMDAwOwoKIyBjcmVhdGUgbmVlZGVkIGZvcm1hdCBuYW1lcwpteSBARm9ybWF0TmFtZSA9ICgnQ1NWJyk7CgojIGdldCBvcmlnaW5hbCB0ZW1wbGF0ZSBsaXN0IGZvciBsYXRlciBjaGVja3MgKGFsbCBlbGVtZW50cykKbXkgJFRlbXBsYXRlTGlzdDFBbGwgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZUxpc3QoCiAgICBVc2VySUQgPT4gMSwKKTsKCiMgZ2V0IG9yaWdpbmFsIHRlbXBsYXRlIGxpc3QgZm9yIGxhdGVyIGNoZWNrcyAoYWxsIGVsZW1lbnRzKQpteSAkVGVtcGxhdGVMaXN0MU9iamVjdCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlRlbXBsYXRlTGlzdCgKICAgIE9iamVjdCA9PiAkT2JqZWN0TmFtZVswXSwKICAgIFVzZXJJRCA9PiAxLAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGRlZmluZSBnZW5lcmFsIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRJdGVtRGF0YSA9IFsKCiAgICAjIHRoaXMgdGVtcGxhdGUgaXMgTk9UIGNvbXBsZXRlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIEZvcm1hdCAgPT4gJEZvcm1hdE5hbWVbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJFRlbXBsYXRlTmFtZVswXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHRlbXBsYXRlIGlzIE5PVCBjb21wbGV0ZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBPYmplY3QgID0+ICRPYmplY3ROYW1lWzBdLAogICAgICAgICAgICBOYW1lICAgID0+ICRUZW1wbGF0ZU5hbWVbMF0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyB0ZW1wbGF0ZSBpcyBOT1QgY29tcGxldGUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgT2JqZWN0ICA9PiAkT2JqZWN0TmFtZVswXSwKICAgICAgICAgICAgRm9ybWF0ICA9PiAkRm9ybWF0TmFtZVswXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHRlbXBsYXRlIGlzIE5PVCBjb21wbGV0ZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBPYmplY3QgPT4gJE9iamVjdE5hbWVbMF0sCiAgICAgICAgICAgIEZvcm1hdCA9PiAkRm9ybWF0TmFtZVswXSwKICAgICAgICAgICAgTmFtZSAgID0+ICRUZW1wbGF0ZU5hbWVbMF0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyB0ZW1wbGF0ZSBpcyBOT1QgY29tcGxldGUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgT2JqZWN0ICA9PiAkT2JqZWN0TmFtZVswXSwKICAgICAgICAgICAgRm9ybWF0ICA9PiAkRm9ybWF0TmFtZVswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAkVGVtcGxhdGVOYW1lWzBdLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHRlbXBsYXRlIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBPYmplY3QgID0+ICRPYmplY3ROYW1lWzBdLAogICAgICAgICAgICBGb3JtYXQgID0+ICRGb3JtYXROYW1lWzBdLAogICAgICAgICAgICBOYW1lICAgID0+ICRUZW1wbGF0ZU5hbWVbMF0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgT2JqZWN0ICAgPT4gJE9iamVjdE5hbWVbMF0sCiAgICAgICAgICAgIEZvcm1hdCAgID0+ICRGb3JtYXROYW1lWzBdLAogICAgICAgICAgICBOYW1lICAgICA9PiAkVGVtcGxhdGVOYW1lWzBdLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgdGVtcGxhdGUgaGF2ZSB0aGUgc2FtZSBuYW1lIGFzIG9uZSB0ZXN0IGJlZm9yZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBPYmplY3QgID0+ICRPYmplY3ROYW1lWzBdLAogICAgICAgICAgICBGb3JtYXQgID0+ICRGb3JtYXROYW1lWzBdLAogICAgICAgICAgICBOYW1lICAgID0+ICRUZW1wbGF0ZU5hbWVbMF0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyB0ZW1wbGF0ZSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5CiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgT2JqZWN0ICA9PiAkT2JqZWN0TmFtZVswXSwKICAgICAgICAgICAgRm9ybWF0ICA9PiAkRm9ybWF0TmFtZVswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAkVGVtcGxhdGVOYW1lWzFdLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1Rlc3RDb21tZW50JywKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgT2JqZWN0ICAgPT4gJE9iamVjdE5hbWVbMF0sCiAgICAgICAgICAgIEZvcm1hdCAgID0+ICRGb3JtYXROYW1lWzBdLAogICAgICAgICAgICBOYW1lICAgICA9PiAkVGVtcGxhdGVOYW1lWzFdLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnVGVzdENvbW1lbnQnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHRlbXBsYXRlIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBOT1QgdXBkYXRlZCAodGVtcGxhdGUgdXBkYXRlIGFyZ3VtZW50cyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgVmFsaWRJRCA9PiAyLAogICAgICAgICAgICBVc2VySUQgID0+ICRVc2VySURzWzBdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHRlbXBsYXRlIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBOT1QgdXBkYXRlZCAodGVtcGxhdGUgdXBkYXRlIGFyZ3VtZW50cyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgID0+ICRUZW1wbGF0ZU5hbWVbMV0gLiAnVVBEQVRFMScsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSB0ZW1wbGF0ZSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgTk9UIHVwZGF0ZWQgKHRlbXBsYXRlIHVwZGF0ZSBhcmd1bWVudHMgTk9UIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJFRlbXBsYXRlTmFtZVsxXSAuICdVUERBVEUyJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAyLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHRlbXBsYXRlIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkICh0ZW1wbGF0ZSB1cGRhdGUgYXJndW1lbnRzIGFyZSBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRUZW1wbGF0ZU5hbWVbMV0gLiAnVVBEQVRFMycsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1Rlc3RDb21tZW50IFVQREFURTMnLAogICAgICAgICAgICBWYWxpZElEID0+IDIsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgfSwKICAgICAgICBVcGRhdGVHZXQgPT4gewogICAgICAgICAgICBOYW1lICAgICA9PiAkVGVtcGxhdGVOYW1lWzFdIC4gJ1VQREFURTMnLAogICAgICAgICAgICBWYWxpZElEICA9PiAyLAogICAgICAgICAgICBDb21tZW50ICA9PiAnVGVzdENvbW1lbnQgVVBEQVRFMycsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+ICRVc2VySURzWzBdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHRlbXBsYXRlIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkICh0ZW1wbGF0ZSB1cGRhdGUgYXJndW1lbnRzIGFyZSBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRUZW1wbGF0ZU5hbWVbMV0gLiAnVVBEQVRFNCcsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCA9PiAnJywKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgPT4gJFRlbXBsYXRlTmFtZVsxXSAuICdVUERBVEU0JywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHRlbXBsYXRlIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkgKGNoZWNrIHN0cmluZyBjbGVhbmVyIGZ1bmN0aW9uKQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE9iamVjdCAgPT4gIiBcdCBcbiBcciAiIC4gJE9iamVjdE5hbWVbMF0gLiAiIFx0IFxuIFxyICIsCiAgICAgICAgICAgIEZvcm1hdCAgPT4gIiBcdCBcbiBcciAiIC4gJEZvcm1hdE5hbWVbMF0gLiAiIFx0IFxuIFxyICIsCiAgICAgICAgICAgIE5hbWUgICAgPT4gIiBcdCBcbiBcciAiIC4gJFRlbXBsYXRlTmFtZVsyXSAuICIgXHQgXG4gXHIgIiwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBDb21tZW50ID0+ICIgXHQgXG4gXHIgVGVzdCBDb21tZW50IFx0IFxuIFxyICIsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFkZEdldCA9PiB7CiAgICAgICAgICAgIE9iamVjdCAgID0+ICRPYmplY3ROYW1lWzBdLAogICAgICAgICAgICBGb3JtYXQgICA9PiAkRm9ybWF0TmFtZVswXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJFRlbXBsYXRlTmFtZVsyXSwKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJ1Rlc3QgQ29tbWVudCcsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgdGVtcGxhdGUgb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgKGNoZWNrIHN0cmluZyBjbGVhbmVyIGZ1bmN0aW9uKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gIiBcdCBcbiBcciAiIC4gJFRlbXBsYXRlTmFtZVsyXSAuICJVUERBVEUxIFx0IFxuIFxyICIsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCA9PiAiIFx0IFxuIFxyIFRlc3QgQ29tbWVudCBVUERBVEUxIFx0IFxuIFxyICIsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgID0+ICRUZW1wbGF0ZU5hbWVbMl0gLiAnVVBEQVRFMScsCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICdUZXN0IENvbW1lbnQgVVBEQVRFMScsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHRlbXBsYXRlIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkgKHVuaWNvZGUgY2hlY2tzKQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE9iamVjdCAgPT4gJyDGlSDGmCAnIC4gJE9iamVjdE5hbWVbMF0gLiAnIMa1IMa7ICcsCiAgICAgICAgICAgIEZvcm1hdCAgPT4gJyDHkyDHoyAnIC4gJEZvcm1hdE5hbWVbMF0gLiAnIMelIMeuICcsCiAgICAgICAgICAgIE5hbWUgICAgPT4gJyDHtyDInCAnIC4gJFRlbXBsYXRlTmFtZVszXSAuICcgyJ4gyKAgJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAyLAogICAgICAgICAgICBDb21tZW50ID0+ICcg0aAg0aQgVGVzdENvbW1lbnQ1IM+gIM6pICcsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFkZEdldCA9PiB7CiAgICAgICAgICAgIE9iamVjdCAgID0+ICfGlcaYJyAuICRPYmplY3ROYW1lWzBdIC4gJ8a1xrsnLAogICAgICAgICAgICBGb3JtYXQgICA9PiAnx5PHoycgLiAkRm9ybWF0TmFtZVswXSAuICfHpceuJywKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ8e3IMicICcgLiAkVGVtcGxhdGVOYW1lWzNdIC4gJyDIniDIoCcsCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDIsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICfRoCDRpCBUZXN0Q29tbWVudDUgz6AgzqknLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LApdOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHJ1biBnZW5lcmFsIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRUZXN0Q291bnQgPSAxOwpteSBAQWRkZWRUZW1wbGF0ZUlEczsKClRFTVBMQVRFOgpmb3IgbXkgJEl0ZW0gKCBAeyRJdGVtRGF0YX0gKSB7CgogICAgaWYgKCAkSXRlbS0+e0FkZH0gKSB7CgogICAgICAgICMgYWRkIG5ldyB0ZW1wbGF0ZQogICAgICAgIG15ICRUZW1wbGF0ZUlEID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVBZGQoICV7ICRJdGVtLT57QWRkfSB9ICk7CgogICAgICAgIGlmICgkVGVtcGxhdGVJRCkgewogICAgICAgICAgICBwdXNoIEBBZGRlZFRlbXBsYXRlSURzLCAkVGVtcGxhdGVJRDsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgdGVtcGxhdGUgd2FzIGFkZGVkIHN1Y2Nlc3NmdWxseSBvciBub3QKICAgICAgICBpZiAoICRJdGVtLT57QWRkR2V0fSApIHsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlQWRkKCkgLSBUZW1wbGF0ZUtleTogJFRlbXBsYXRlSUQiCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+RmFsc2UoICRUZW1wbGF0ZUlELCAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZUFkZCgpIiApOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRJdGVtLT57QWRkR2V0fSApIHsKCiAgICAgICAgIyBnZXQgdGVtcGxhdGUgZGF0YSB0byBjaGVjayB0aGUgdmFsdWVzIGFmdGVyIHRlbXBsYXRlIHdhcyBhZGRlZAogICAgICAgIG15ICRUZW1wbGF0ZUdldCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlRlbXBsYXRlR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRBZGRlZFRlbXBsYXRlSURzWy0xXSwKICAgICAgICAgICAgVXNlcklEID0+ICRJdGVtLT57QWRkfS0+e1VzZXJJRH0gfHwgMSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIHRlbXBsYXRlIGRhdGEgYWZ0ZXIgY3JlYXRpb24gb2YgdGVtcGxhdGUKICAgICAgICBmb3IgbXkgJFRlbXBsYXRlQXR0cmlidXRlICggc29ydCBrZXlzICV7ICRJdGVtLT57QWRkR2V0fSB9ICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkVGVtcGxhdGVHZXQtPnskVGVtcGxhdGVBdHRyaWJ1dGV9IHx8ICcnLAogICAgICAgICAgICAgICAgJEl0ZW0tPntBZGRHZXR9LT57JFRlbXBsYXRlQXR0cmlidXRlfSB8fCAnJywKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlR2V0KCkgLSAkVGVtcGxhdGVBdHRyaWJ1dGUiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRJdGVtLT57VXBkYXRlfSApIHsKCiAgICAgICAgIyBjaGVjayBsYXN0IHRlbXBsYXRlIGlkIHZhcmFpYmxlCiAgICAgICAgaWYgKCAhJEFkZGVkVGVtcGxhdGVJRHNbLTFdICkgewogICAgICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogTk8gTEFTVCBJVEVNIElEIEdJVkVOLiBQbGVhc2UgYWRkIGEgdGVtcGxhdGUgZmlyc3QuIgogICAgICAgICAgICApOwogICAgICAgICAgICBsYXN0IFRFTVBMQVRFOwogICAgICAgIH0KCiAgICAgICAgIyB1cGRhdGUgdGhlIHRlbXBsYXRlCiAgICAgICAgbXkgJFVwZGF0ZVN1Y2VzcyA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlRlbXBsYXRlVXBkYXRlKAogICAgICAgICAgICAleyAkSXRlbS0+e1VwZGF0ZX0gfSwKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkQWRkZWRUZW1wbGF0ZUlEc1stMV0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiB0ZW1wbGF0ZSB3YXMgdXBkYXRlZCBzdWNjZXNzZnVsbHkgb3Igbm90CiAgICAgICAgaWYgKCAkSXRlbS0+e1VwZGF0ZUdldH0gKSB7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFVwZGF0ZVN1Y2VzcywKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlVXBkYXRlKCkgLSBUZW1wbGF0ZUtleTogJEFkZGVkVGVtcGxhdGVJRHNbLTFdIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgICAgICRVcGRhdGVTdWNlc3MsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZVVwZGF0ZSgpIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkSXRlbS0+e1VwZGF0ZUdldH0gKSB7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEgdG8gY2hlY2sgdGhlIHZhbHVlcyBhZnRlciB0aGUgdXBkYXRlCiAgICAgICAgbXkgJFRlbXBsYXRlR2V0ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJEFkZGVkVGVtcGxhdGVJRHNbLTFdLAogICAgICAgICAgICBVc2VySUQgPT4gJEl0ZW0tPntVcGRhdGV9LT57VXNlcklEfSB8fCAxLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgdGVtcGxhdGUgZGF0YSBhZnRlciB1cGRhdGUKICAgICAgICBmb3IgbXkgJFRlbXBsYXRlQXR0cmlidXRlICggc29ydCBrZXlzICV7ICRJdGVtLT57VXBkYXRlR2V0fSB9ICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkVGVtcGxhdGVHZXQtPnskVGVtcGxhdGVBdHRyaWJ1dGV9IHx8ICcnLAogICAgICAgICAgICAgICAgJEl0ZW0tPntVcGRhdGVHZXR9LT57JFRlbXBsYXRlQXR0cmlidXRlfSB8fCAnJywKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlR2V0KCkgLSAkVGVtcGxhdGVBdHRyaWJ1dGUiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KfQpjb250aW51ZSB7CgogICAgIyBpbmNyZW1lbnQgdGhlIGNvdW50ZXIKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIFRlbXBsYXRlTGlzdCB0ZXN0IDEgKGNoZWNrIGFycmF5IHJlZmVyZW5jZXMpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgbGlzdCBtdXN0IGJlIGFuIGVtcHR5IGFycmF5IHJlZmVyZW5jZQokU2VsZi0+VHJ1ZSgKICAgIHJlZiAkVGVtcGxhdGVMaXN0MUFsbCBlcSAnQVJSQVknICYmIHJlZiAkVGVtcGxhdGVMaXN0MU9iamVjdCBlcSAnQVJSQVknLAogICAgIlRlc3QgJFRlc3RDb3VudDogVGVtcGxhdGVMaXN0KCkgLSBhcnJheSByZWZlcmVuY2VzIiwKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBUZW1wbGF0ZUxpc3QgdGVzdCAyIChsaXN0IG11c3QgYmUgZW1wdHkpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgbGlzdCBtdXN0IGJlIGFuIGVtcHR5IGxpc3QKJFNlbGYtPlRydWUoCiAgICBzY2FsYXIgQHskVGVtcGxhdGVMaXN0MU9iamVjdH0gZXEgMCwKICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlTGlzdCgpIC0gZW1wdHkgbGlzdCIsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgVGVtcGxhdGVMaXN0IHRlc3QgMiAoY2hlY2sgY29ycmVjdCBudW1iZXIgb2YgbmV3IGl0ZW1zKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCB0ZW1wbGF0ZSBsaXN0IHdpdGggYWxsIGVsZW1lbnRzCm15ICRUZW1wbGF0ZUxpc3QyID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVMaXN0KAogICAgVXNlcklEID0+IDEsCik7CgojIGxpc3QgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UKJFNlbGYtPlRydWUoCiAgICByZWYgJFRlbXBsYXRlTGlzdDIgZXEgJ0FSUkFZJywKICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlTGlzdCgpIC0gYXJyYXkgcmVmZXJlbmNlIiwKKTsKCm15ICRUZW1wbGF0ZUxpc3RDb3VudCA9IHNjYWxhciBAeyRUZW1wbGF0ZUxpc3QyfSAtIHNjYWxhciBAeyRUZW1wbGF0ZUxpc3QxQWxsfTsKCiMgY2hlY2sgY29ycmVjdCBudW1iZXIgb2YgbmV3IGl0ZW1zCiRTZWxmLT5UcnVlKAogICAgJFRlbXBsYXRlTGlzdENvdW50IGVxIHNjYWxhciBAQWRkZWRUZW1wbGF0ZUlEcywKICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlTGlzdCgpIC0gY29ycmVjdCBudW1iZXIgb2YgbmV3IGl0ZW1zIiwKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBUZW1wbGF0ZURlbGV0ZSB0ZXN0IDEgKGFkZCBvbmUgdGVtcGxhdGUgYW5kIGRlbGV0ZSBpdCkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBnZXQgdGVtcGxhdGUgbGlzdCB3aXRoIGFsbCBlbGVtZW50cwpteSAkVGVtcGxhdGVEZWxldGUxTGlzdDEgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZUxpc3QoCiAgICBPYmplY3QgPT4gJE9iamVjdE5hbWVbMF0sCiAgICBVc2VySUQgPT4gMSwKKTsKCiMgYWRkIGEgdGVzdCB0ZW1wbGF0ZQpteSAkVGVtcGxhdGVEZWxldGVJRCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlRlbXBsYXRlQWRkKAogICAgT2JqZWN0ICA9PiAkT2JqZWN0TmFtZVswXSwKICAgIEZvcm1hdCAgPT4gJEZvcm1hdE5hbWVbMF0sCiAgICBOYW1lICAgID0+ICRUZW1wbGF0ZU5hbWVbNF0sCiAgICBWYWxpZElEID0+IDEsCiAgICBVc2VySUQgID0+IDEsCik7CgojIGdldCB0ZW1wbGF0ZSBsaXN0IHdpdGggYWxsIGVsZW1lbnRzCm15ICRUZW1wbGF0ZURlbGV0ZTFMaXN0MiA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlRlbXBsYXRlTGlzdCgKICAgIE9iamVjdCA9PiAkT2JqZWN0TmFtZVswXSwKICAgIFVzZXJJRCA9PiAxLAopOwoKIyBsaXN0IG11c3QgaGF2ZSBvbmUgbW9yZSBlbGVtZW50CiRTZWxmLT5UcnVlKAogICAgc2NhbGFyIEB7JFRlbXBsYXRlRGVsZXRlMUxpc3QxfSBlcSAoIHNjYWxhciBAeyRUZW1wbGF0ZURlbGV0ZTFMaXN0Mn0gKSAtIDEsCiAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZURlbGV0ZSgpIC0gbnVtYmVyIG9mIGxpc3RlZCBlbGVtZW50cyIsCik7CgojIGRlbGV0ZSB0aGUgbmV3IHRlbXBsYXRlCm15ICRUZW1wbGF0ZURlbGV0ZTEgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZURlbGV0ZSgKICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGVsZXRlSUQsCiAgICBVc2VySUQgICAgID0+IDEsCik7CgojIGxpc3QgbXVzdCBiZSBzdWNjZXNzZnVsbAokU2VsZi0+VHJ1ZSgKICAgICRUZW1wbGF0ZURlbGV0ZTEsCiAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZURlbGV0ZSgpIiwKKTsKCiMgZ2V0IHRlbXBsYXRlIGxpc3Qgd2l0aCBhbGwgZWxlbWVudHMKbXkgJFRlbXBsYXRlRGVsZXRlMUxpc3QzID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVMaXN0KAogICAgT2JqZWN0ID0+ICRPYmplY3ROYW1lWzBdLAogICAgVXNlcklEID0+IDEsCik7CgojIGxpc3QgbXVzdCBoYXZlIHRoZSBvcmlnaW5hbCBudW1iZXIgb2YgZWxlbWVudHMKJFNlbGYtPlRydWUoCiAgICBzY2FsYXIgQHskVGVtcGxhdGVEZWxldGUxTGlzdDF9IGVxIHNjYWxhciBAeyRUZW1wbGF0ZURlbGV0ZTFMaXN0M30sCiAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZURlbGV0ZSgpIC0gbnVtYmVyIG9mIGxpc3RlZCBlbGVtZW50cyIsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgVGVtcGxhdGVEZWxldGUgdGVzdCAyIChkZWxldGUgYWxsIHVuaXR0ZXN0IHRlbXBsYXRlcykKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKZm9yIG15ICRUZW1wbGF0ZUlEIChAQWRkZWRUZW1wbGF0ZUlEcykgewoKICAgICMgZGVsZXRlIHRoZSB0ZW1wbGF0ZQogICAgbXkgJFN1Y2Nlc3MgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CgogICAgIyBjaGVjayBzdWNjZXNzCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZURlbGV0ZSgpIFRlbXBsYXRlSUQgJFRlbXBsYXRlSUQiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBPYmplY3RMaXN0IHRlc3QgMSAoY2hlY2sgZ2VuZXJhbCBmdW5jdGlvbmFsaXR5KQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGRlZmluZSB0ZXN0IGxpc3QKbXkgJE9iamVjdExpc3QxVGVzdExpc3QgPSB7CiAgICBVbml0VGVzdDEgPT4gewogICAgICAgIE1vZHVsZSA9PiAnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6VW5pdFRlc3QxJywKICAgICAgICBOYW1lICAgPT4gJ1VuaXQgVGVzdCAxJywKICAgIH0sCiAgICBVbml0VGVzdDIgPT4gewogICAgICAgIE1vZHVsZSA9PiAnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6VW5pdFRlc3QyJywKICAgICAgICBOYW1lICAgPT4gJ1VuaXQgVGVzdCAyJywKICAgIH0sCn07CgojIGdldCBvcmlnaW5hbCBvYmplY3QgbGlzdApteSAkT2JqZWN0TGlzdE9yZyA9CiAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZFJlZ2lzdHJhdGlvbicpOwoKIyBzZXQgdGVzdCBsaXN0CgokQ29uZmlnT2JqZWN0LT5TZXQoCiAgICBLZXkgICA9PiAnSW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kUmVnaXN0cmF0aW9uJywKICAgIFZhbHVlID0+ICRPYmplY3RMaXN0MVRlc3RMaXN0LAopOwoKIyBnZXQgb2JqZWN0IGxpc3QKbXkgJE9iamVjdExpc3QxID0gJEltcG9ydEV4cG9ydE9iamVjdC0+T2JqZWN0TGlzdCgpOwoKIyBsaXN0IG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZQokU2VsZi0+VHJ1ZSgKICAgIHJlZiAkT2JqZWN0TGlzdDEgZXEgJ0hBU0gnLAogICAgIlRlc3QgJFRlc3RDb3VudDogT2JqZWN0TGlzdCgpIC0gaGFzaCByZWZlcmVuY2UiLAopOwoKIyBjaGVjayB0aGUgbGlzdApLRVk6CmZvciBteSAkS2V5ICggc29ydCBrZXlzICV7JE9iamVjdExpc3QxfSApIHsKCiAgICBpZiAoICEkT2JqZWN0TGlzdDFUZXN0TGlzdC0+eyRLZXl9ICkgewogICAgICAgICRPYmplY3RMaXN0MVRlc3RMaXN0LT57RHVtbXl9ID0gMTsKICAgIH0KCiAgICBuZXh0IEtFWSBpZiAkT2JqZWN0TGlzdDEtPnskS2V5fSBuZSAkT2JqZWN0TGlzdDFUZXN0TGlzdC0+eyRLZXl9LT57TmFtZX07CgogICAgZGVsZXRlICRPYmplY3RMaXN0MVRlc3RMaXN0LT57JEtleX07Cn0KCiRTZWxmLT5UcnVlKAogICAgISV7JE9iamVjdExpc3QxVGVzdExpc3R9LAogICAgIlRlc3QgJFRlc3RDb3VudDogT2JqZWN0TGlzdCgpIC0gY29udGVudCBpcyB2YWxpZCIsCik7CgojIHJlc3RvcmUgb3JpZ2luYWwgb2JqZWN0IGxpc3QKCiRDb25maWdPYmplY3QtPlNldCgKICAgIEtleSAgID0+ICdJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmRSZWdpc3RyYXRpb24nLAogICAgVmFsdWUgPT4gJE9iamVjdExpc3RPcmcsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgRm9ybWF0TGlzdCB0ZXN0IDEgKGNoZWNrIGdlbmVyYWwgZnVuY3Rpb25hbGl0eSkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBkZWZpbmUgdGVzdCBsaXN0Cm15ICRGb3JtYXRMaXN0MVRlc3RMaXN0ID0gewogICAgVW5pdFRlc3QxID0+IHsKICAgICAgICBNb2R1bGUgPT4gJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmQ6OlVuaXRUZXN0MScsCiAgICAgICAgTmFtZSAgID0+ICdVbml0IFRlc3QgMScsCiAgICB9LAogICAgVW5pdFRlc3QyID0+IHsKICAgICAgICBNb2R1bGUgPT4gJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmQ6OlVuaXRUZXN0MicsCiAgICAgICAgTmFtZSAgID0+ICdVbml0IFRlc3QgMicsCiAgICB9LAp9OwoKIyBnZXQgb3JpZ2luYWwgZm9ybWF0IGxpc3QKbXkgJEZvcm1hdExpc3RPcmcgPQogICAgJENvbmZpZ09iamVjdC0+R2V0KCdJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmRSZWdpc3RyYXRpb24nKTsKCiMgc2V0IHRlc3QgbGlzdAoKJENvbmZpZ09iamVjdC0+U2V0KAogICAgS2V5ICAgPT4gJ0ltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZFJlZ2lzdHJhdGlvbicsCiAgICBWYWx1ZSA9PiAkRm9ybWF0TGlzdDFUZXN0TGlzdCwKKTsKCiMgZ2V0IGZvcm1hdCBsaXN0Cm15ICRGb3JtYXRMaXN0MSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkZvcm1hdExpc3QoKTsKCiMgbGlzdCBtdXN0IGJlIGEgaGFzaCByZWZlcmVuY2UKJFNlbGYtPlRydWUoCiAgICByZWYgJEZvcm1hdExpc3QxIGVxICdIQVNIJywKICAgICJUZXN0ICRUZXN0Q291bnQ6IEZvcm1hdExpc3QoKSAtIGhhc2ggcmVmZXJlbmNlIiwKKTsKCiMgY2hlY2sgdGhlIGxpc3QKS0VZOgpmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyRGb3JtYXRMaXN0MX0gKSB7CgogICAgaWYgKCAhJEZvcm1hdExpc3QxVGVzdExpc3QtPnskS2V5fSApIHsKICAgICAgICAkRm9ybWF0TGlzdDFUZXN0TGlzdC0+e0R1bW15fSA9IDE7CiAgICB9CgogICAgbmV4dCBLRVkgaWYgJEZvcm1hdExpc3QxLT57JEtleX0gbmUgJEZvcm1hdExpc3QxVGVzdExpc3QtPnskS2V5fS0+e05hbWV9OwoKICAgIGRlbGV0ZSAkRm9ybWF0TGlzdDFUZXN0TGlzdC0+eyRLZXl9Owp9CgokU2VsZi0+VHJ1ZSgKICAgICEleyRGb3JtYXRMaXN0MVRlc3RMaXN0fSwKICAgICJUZXN0ICRUZXN0Q291bnQ6IEZvcm1hdExpc3QoKSAtIGNvbnRlbnQgaXMgdmFsaWQiLAopOwoKIyByZXN0b3JlIG9yaWdpbmFsIGZvcm1hdCBsaXN0CgokQ29uZmlnT2JqZWN0LT5TZXQoCiAgICBLZXkgICA9PiAnSW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kUmVnaXN0cmF0aW9uJywKICAgIFZhbHVlID0+ICRGb3JtYXRMaXN0T3JnLAopOwoKJFRlc3RDb3VudCsrOwoKMTsK
IyAtLQojIEltcG9ydEV4cG9ydEZvcm1hdENTVi50IC0gYWxsIGltcG9ydCBleHBvcnQgdGVzdHMgZm9yIHRoZSBDU1YgZm9ybWF0IGJhY2tlbmQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgcXcoJFNlbGYpOwoKdXNlIERhdGE6OkR1bXBlcjsKCm15ICRDb25maWdPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKbXkgJE1haW5PYmplY3QgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwpteSAkSW1wb3J0RXhwb3J0T2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQnKTsKbXkgJEZvcm1hdEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kOjpDU1YnKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBtYWtlIHByZXBhcmF0aW9ucwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBob21lIGRpcmVjdG9yeQokU2VsZi0+e0hvbWV9ID0gJENvbmZpZ09iamVjdC0+R2V0KCdIb21lJyk7CgojIGFkZCBzb21lIHRlc3QgdGVtcGxhdGVzIGZvciBsYXRlciBjaGVja3MKbXkgQFRlbXBsYXRlSURzOwpmb3IgKCAxIC4uIDMwICkgewoKICAgICMgYWRkIGEgdGVzdCB0ZW1wbGF0ZSBmb3IgbGF0ZXIgY2hlY2tzCiAgICBteSAkVGVtcGxhdGVJRCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlRlbXBsYXRlQWRkKAogICAgICAgIE9iamVjdCAgPT4gJ1VuaXRUZXN0JyAuIGludCByYW5kIDFfMDAwXzAwMCwKICAgICAgICBGb3JtYXQgID0+ICdDU1YnLAogICAgICAgIE5hbWUgICAgPT4gJ1VuaXRUZXN0JyAuIGludCByYW5kIDFfMDAwXzAwMCwKICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKCiAgICBwdXNoIEBUZW1wbGF0ZUlEcywgJFRlbXBsYXRlSUQ7Cn0KCm15ICRUZXN0Q291bnQgPSAxOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIEZvcm1hdExpc3QgdGVzdCAxIChjaGVjayBDU1YgaXRlbSkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBnZXQgZm9ybWF0IGxpc3QKbXkgJEZvcm1hdExpc3QxID0gJEltcG9ydEV4cG9ydE9iamVjdC0+Rm9ybWF0TGlzdCgpOwoKIyBjaGVjayBmb3JtYXQgbGlzdAokU2VsZi0+VHJ1ZSgKICAgICRGb3JtYXRMaXN0MSAmJiByZWYgJEZvcm1hdExpc3QxIGVxICdIQVNIJyAmJiAkRm9ybWF0TGlzdDEtPntDU1Z9LAogICAgIlRlc3QgJFRlc3RDb3VudDogRm9ybWF0TGlzdCgpIC0gQ1NWIGV4aXN0cyIsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgRm9ybWF0QXR0cmlidXRlc0dldCB0ZXN0IDEgKGNoZWNrIGF0dHJpYnV0ZSBoYXNoKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBmb3JtYXQgYXR0cmlidXRlcwpteSAkRm9ybWF0QXR0cmlidXRlc0dldDEgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5Gb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbMF0sCiAgICBVc2VySUQgICAgID0+IDEsCik7CgojIGNoZWNrIGZvcm1hdCBhdHRyaWJ1dGUgcmVmZXJlbmNlCiRTZWxmLT5UcnVlKAogICAgJEZvcm1hdEF0dHJpYnV0ZXNHZXQxICYmIHJlZiAkRm9ybWF0QXR0cmlidXRlc0dldDEgZXEgJ0FSUkFZJywKICAgICJUZXN0ICRUZXN0Q291bnQ6IEZvcm1hdEF0dHJpYnV0ZXNHZXQoKSAtIGNoZWNrIGFycmF5IHJlZmVyZW5jZSIsCik7CgojIGRlZmluZSB0aGUgcmVmZXJlbmNlIGhhc2gKbXkgJEZvcm1hdEF0dHJpYnV0ZXNHZXQxUmVmZXJlbmNlID0gWwogICAgewogICAgICAgIEtleSAgID0+ICdDb2x1bW5TZXBhcmF0b3InLAogICAgICAgIE5hbWUgID0+ICdDb2x1bW4gU2VwYXJhdG9yJywKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ1NlbGVjdGlvbicsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVGFidWxhdG9yID0+ICdUYWJ1bGF0b3IgKFRBQiknLAogICAgICAgICAgICAgICAgU2VtaWNvbG9uID0+ICdTZW1pY29sb24gKDspJywKICAgICAgICAgICAgICAgIENvbG9uICAgICA9PiAnQ29sb24gKDopJywKICAgICAgICAgICAgICAgIERvdCAgICAgICA9PiAnRG90ICguKScsCiAgICAgICAgICAgICAgICBDb21tYSAgICAgPT4gJ0NvbW1hICgsKScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJlcXVpcmVkICAgICA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ICAgPT4gJ0NoYXJzZXQnLAogICAgICAgIE5hbWUgID0+ICdDaGFyc2V0JywKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgICAgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgIFZhbHVlRGVmYXVsdCA9PiAnVVRGLTgnLAogICAgICAgICAgICBSZXF1aXJlZCAgICAgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgIFNpemUgICAgICAgICA9PiAyMCwKICAgICAgICAgICAgTWF4TGVuZ3RoICAgID0+IDIwLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSAgID0+ICdJbmNsdWRlQ29sdW1uSGVhZGVycycsCiAgICAgICAgTmFtZSAgPT4gJ0luY2x1ZGUgQ29sdW1uIEhlYWRlcnMnLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnU2VsZWN0aW9uJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAwID0+ICdObycsCiAgICAgICAgICAgICAgICAxID0+ICdZZXMnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDAsCiAgICAgICAgfSwKICAgIH0sCl07CgojIHR1cm4gb2ZmIGFsbCBwcmV0dHkgcHJpbnQKJERhdGE6OkR1bXBlcjo6SW5kZW50ID0gMDsKCiMgZHVtcCB0aGUgbGlzdCBmcm9tIEZvcm1hdEF0dHJpYnV0ZXNHZXQoKSBhbmQgdGhlIHJlZmVyZW5jZSB0YWJsZQojIyBubyBjcml0aWMKbXkgJEZvcm1hdEF0dHJpYnV0ZXNHZXREdW1wMSA9IERhdGE6OkR1bXBlcjo6RHVtcGVyKCRGb3JtYXRBdHRyaWJ1dGVzR2V0MSk7Cm15ICRGb3JtYXRBdHRyaWJ1dGVzUmVmRHVtcDEgPSBEYXRhOjpEdW1wZXI6OkR1bXBlcigkRm9ybWF0QXR0cmlidXRlc0dldDFSZWZlcmVuY2UpOwojIyB1c2UgY3JpdGljCgokU2VsZi0+VHJ1ZSgKICAgICRGb3JtYXRBdHRyaWJ1dGVzR2V0RHVtcDEgZXEgJEZvcm1hdEF0dHJpYnV0ZXNSZWZEdW1wMSwKICAgICJUZXN0ICRUZXN0Q291bnQ6IEZvcm1hdEF0dHJpYnV0ZXNHZXQoKSAtIGF0dHJpYnV0ZXMgb2YgdGhlIHJvdyBhcmUgaWRlbnRpY2FsIiwKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBGb3JtYXRBdHRyaWJ1dGVzR2V0IHRlc3QgMiAoY2hlY2sgd2l0aCBub24gZXhpc3RpbmcgdGVtcGxhdGUpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZ2V0IGZvcm1hdCBhdHRyaWJ1dGVzCm15ICRGb3JtYXRBdHRyaWJ1dGVzR2V0MiA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkZvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1stMV0gKyAxLAogICAgVXNlcklEICAgICA9PiAxLAopOwoKIyBjaGVjayBmYWxzZSByZXR1cm4KJFNlbGYtPkZhbHNlKAogICAgJEZvcm1hdEF0dHJpYnV0ZXNHZXQyLAogICAgIlRlc3QgJFRlc3RDb3VudDogRm9ybWF0QXR0cmlidXRlc0dldCgpIC0gY2hlY2sgZmFsc2UgcmV0dXJuIiwKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCB0ZXN0IDEgKGNoZWNrIGF0dHJpYnV0ZSBoYXNoKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBtYXBwaW5nIGZvcm1hdCBhdHRyaWJ1dGVzCm15ICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldDEgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCgKICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzBdLAogICAgVXNlcklEICAgICA9PiAxLAopOwoKIyBjaGVjayBtYXBwaW5nIGZvcm1hdCBhdHRyaWJ1dGUgcmVmZXJlbmNlCiRTZWxmLT5UcnVlKAogICAgJE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0MSAmJiByZWYgJE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0MSBlcSAnQVJSQVknLAogICAgIlRlc3QgJFRlc3RDb3VudDogTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoKSAtIGNoZWNrIGFycmF5IHJlZmVyZW5jZSIsCik7CgojIGRlZmluZSB0aGUgcmVmZXJlbmNlIGhhc2gKbXkgJE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0MVJlZmVyZW5jZSA9IFsKICAgIHsKICAgICAgICBLZXkgICA9PiAnQ29sdW1uJywKICAgICAgICBOYW1lICA9PiAnQ29sdW1uJywKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgICAgID0+ICdEVEwnLAogICAgICAgICAgICBEYXRhICAgICA9PiAnJFFEYXRheyJDb3VudGVyIn0nLAogICAgICAgICAgICBSZXF1aXJlZCA9PiAwLAogICAgICAgIH0sCiAgICB9LApdOwoKIyB0dXJuIG9mZiBhbGwgcHJldHR5IHByaW50CiREYXRhOjpEdW1wZXI6OkluZGVudCA9IDA7CgojIGR1bXAgdGhlIGxpc3QgZnJvbSBNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCgpIGFuZCB0aGUgcmVmZXJlbmNlIHRhYmxlCiMjIG5vIGNyaXRpYwpteSAkTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXREdW1wMSA9IERhdGE6OkR1bXBlcjo6RHVtcGVyKCRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldDEpOwpteSAkTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNSZWZEdW1wMSA9IERhdGE6OkR1bXBlcjo6RHVtcGVyKCRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldDFSZWZlcmVuY2UpOwojIyB1c2UgY3JpdGljCgokU2VsZi0+VHJ1ZSgKICAgICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldER1bXAxIGVxICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc1JlZkR1bXAxLAogICAgIlRlc3QgJFRlc3RDb3VudDogTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoKSAtIGF0dHJpYnV0ZXMgb2YgdGhlIHJvdyBhcmUgaWRlbnRpY2FsIiwKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCB0ZXN0IDIgKGNoZWNrIHdpdGggbm9uIGV4aXN0aW5nIHRlbXBsYXRlKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBtYXBwaW5nIGZvcm1hdCBhdHRyaWJ1dGVzCm15ICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldDIgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCgKICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWy0xXSArIDEsCiAgICBVc2VySUQgICAgID0+IDEsCik7CgojIGNoZWNrIGZhbHNlIHJldHVybgokU2VsZi0+RmFsc2UoCiAgICAkTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQyLAogICAgIlRlc3QgJFRlc3RDb3VudDogTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoKSAtIGNoZWNrIGZhbHNlIHJldHVybiIsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgZGVmaW5lIGdlbmVyYWwgSW1wb3J0RGF0YUdldCB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSAkSW1wb3J0RGF0YVRlc3RzID0gWwoKICAgICMgSW1wb3J0RGF0YUdldCBkb2Vzbid0IGNvbnRhaW5zIGFsbCBkYXRhIChjaGVjayByZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgSW1wb3J0RGF0YUdldCBkb2Vzbid0IGNvbnRhaW5zIGFsbCBkYXRhIChjaGVjayByZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzFdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgbm8gc291cmNlIGNvbnRlbnQgYXJlIGdpdmVuIChlbXB0eSBhcnJheSByZWZlcmVuY2UgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1sxXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gW10sCiAgICB9LAoKICAgICMgc291cmNlIGNvbnRlbnQgbXVzdCBiZSBhIHNjYWxhciByZWZlcmVuY2UgKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1sxXSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gW10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBzb3VyY2UgY29udGVudCBtdXN0IGJlIGEgc2NhbGFyIHJlZmVyZW5jZSAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzFdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiB7fSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHNvdXJjZSBjb250ZW50IG11c3QgYmUgYSBzY2FsYXIgcmVmZXJlbmNlIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICcnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgbm8gZXhpc3RpbmcgdGVtcGxhdGUgaWQgaXMgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1stMV0gKyAxLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiBcZG8geydEdW1teSd9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgbm8gY29sdW1uIFNlcGFyYXRvciBhbmQgY2hhcnNldCBhcmUgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syXSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gXGRvIHsnRHVtbXknfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIG5vIGNvbHVtbiBTZXBhcmF0b3IgaXMgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDaGFyc2V0ID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMl0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+IFxkbyB7J0R1bW15J30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBubyBjaGFyc2V0IGlzIGdpdmVuIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdEdW1teScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMl0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+IFxkbyB7J0R1bW15J30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBpbnZhbGlkIGNvbHVtbiBTZXBhcmF0b3IgaXMgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0R1bW15JywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzJdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiBcZG8geydEdW1teSd9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiBidXQgc291cmNlIGNvbnRlbnQgaXMgZW1wdHkgKGVtcHR5IGFycmF5IHJlZmVyZW5jZSBtdXN0IGJlIHJldHVybmVkKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzNdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiBcZG8geycnfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gW10sCiAgICB9LAoKICAgICMgc291cmNlIGNvbnRlbnQgaXMgb25seSBhIHN0cmluZyB3aXRoIHNwYWNlcyAob25lIGNlbGwgYXJyYXkgd2l0aCB0aGUgc3BhY2VzIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNF0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+IFxkbyB7JyAgJ30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWycgICddLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDEtTVNFeGNlbC1TZW1pY29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s1XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ1JvdzEtQ29sMScsICdSb3cxLUNvbDInLCAnUm93MS1Db2wzJyBdLAogICAgICAgICAgICBbICdSb3cyLUNvbDEnLCAnUm93Mi1Db2wyJywgJ1JvdzItQ29sMycgXSwKICAgICAgICAgICAgWyAnUm93My1Db2wxJywgJ1JvdzMtQ29sMicsICdSb3czLUNvbDMnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiwgYnV0IFRhYnVsYXRvciBpcyB1c2VkIGFzIFNlcGFyYXRvciAoY2hlY2sgdGhlIHBhcnNlZCBjb250ZW50KQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwMS1NU0V4Y2VsLVNlbWljb2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzVdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWydSb3cxLUNvbDE7Um93MS1Db2wyO1JvdzEtQ29sMyddLAogICAgICAgICAgICBbJ1JvdzItQ29sMTtSb3cyLUNvbDI7Um93Mi1Db2wzJ10sCiAgICAgICAgICAgIFsnUm93My1Db2wxO1JvdzMtQ29sMjtSb3czLUNvbDMnXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayB0aGUgcGFyc2VkIGNvbnRlbnQpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAxLU1TRXhjZWwtVGFidWxhdG9yLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgWyAnUm93Mi1Db2wxJywgJ1JvdzItQ29sMicsICdSb3cyLUNvbDMnIF0sCiAgICAgICAgICAgIFsgJ1JvdzMtQ29sMScsICdSb3czLUNvbDInLCAnUm93My1Db2wzJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4sIGJ1dCBTZW1pY29sb24gaXMgdXNlZCBhcyBTZXBhcmF0b3IgKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDEtTVNFeGNlbC1UYWJ1bGF0b3IuY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s1XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsiUm93MS1Db2wxXHRSb3cxLUNvbDJcdFJvdzEtQ29sMyJdLAogICAgICAgICAgICBbIlJvdzItQ29sMVx0Um93Mi1Db2wyXHRSb3cyLUNvbDMiXSwKICAgICAgICAgICAgWyJSb3czLUNvbDFcdFJvdzMtQ29sMlx0Um93My1Db2wzIl0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoY2hlY2sgdGhlIHBhcnNlZCBjb250ZW50KQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwMS1PcGVuT2ZmaWNlLVNlbWljb2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzVdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnUm93MS1Db2wxJywgJ1JvdzEtQ29sMicsICdSb3cxLUNvbDMnIF0sCiAgICAgICAgICAgIFsgJ1JvdzItQ29sMScsICdSb3cyLUNvbDInLCAnUm93Mi1Db2wzJyBdLAogICAgICAgICAgICBbICdSb3czLUNvbDEnLCAnUm93My1Db2wyJywgJ1JvdzMtQ29sMycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayB0aGUgcGFyc2VkIGNvbnRlbnQpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAxLU9wZW5PZmZpY2UtVGFidWxhdG9yLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgWyAnUm93Mi1Db2wxJywgJ1JvdzItQ29sMicsICdSb3cyLUNvbDMnIF0sCiAgICAgICAgICAgIFsgJ1JvdzMtQ29sMScsICdSb3czLUNvbDInLCAnUm93My1Db2wzJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0NvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwMS1PcGVuT2ZmaWNlLUNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgWyAnUm93Mi1Db2wxJywgJ1JvdzItQ29sMicsICdSb3cyLUNvbDMnIF0sCiAgICAgICAgICAgIFsgJ1JvdzMtQ29sMScsICdSb3czLUNvbDInLCAnUm93My1Db2wzJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKG5ld2xpbmUgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwMi1NU0V4Y2VsLVNlbWljb2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzZdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAiXG5UZXN0IDEgLSAxIiwgIlRlc3QgMSAtIDIiLCAgICJUZXN0IDFcbi0gMyIsICAnVGVzdCBcblx0XHJccycgXSwKICAgICAgICAgICAgWyAiVGVzdCAyIFxuLSAxIiwgIlRlXG5zdCAyIC0gMiIsICJUZXN0IDIgLSAzXG4iLCAnJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKG5ld2xpbmUgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwMi1NU0V4Y2VsLVRhYnVsYXRvci5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzZdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAiXG5UZXN0IDEgLSAxIiwgJ1Rlc3QgMSAtIDInLCAgICJUZXN0IDFcbi0gMyIsICAnVGVzdCBcblx0XHJccycgXSwKICAgICAgICAgICAgWyAiVGVzdCAyIFxuLSAxIiwgIlRlXG5zdCAyIC0gMiIsICJUZXN0IDIgLSAzXG4iLCAnJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKG5ld2xpbmUgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwMi1PcGVuT2ZmaWNlLVNlbWljb2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzZdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAiXG5UZXN0IDEgLSAxIiwgIlRlc3QgMSAtIDIiLCAgICJUZXN0IDFcbi0gMyIsICAnVGVzdCBcblx0XHJccycgXSwKICAgICAgICAgICAgWyAiVGVzdCAyIFxuLSAxIiwgIlRlXG5zdCAyIC0gMiIsICJUZXN0IDIgLSAzXG4iLCAnJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKG5ld2xpbmUgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwMi1PcGVuT2ZmaWNlLVRhYnVsYXRvci5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzZdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAiXG5UZXN0IDEgLSAxIiwgIlRlc3QgMSAtIDIiLCAgICJUZXN0IDFcbi0gMyIsICAnVGVzdCBcblx0XHJccycgXSwKICAgICAgICAgICAgWyAiVGVzdCAyIFxuLSAxIiwgIlRlXG5zdCAyIC0gMiIsICJUZXN0IDIgLSAzXG4iLCAnJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKG5ld2xpbmUgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnQ29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAyLU9wZW5PZmZpY2UtQ29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s2XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgIlxuVGVzdCAxIC0gMSIsICJUZXN0IDEgLSAyIiwgICAiVGVzdCAxXG4tIDMiLCAgJ1Rlc3QgXG5cdFxyXHMnIF0sCiAgICAgICAgICAgIFsgIlRlc3QgMiBcbi0gMSIsICJUZVxuc3QgMiAtIDIiLCAiVGVzdCAyIC0gM1xuIiwgJycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGFjZXMgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwMy1NU0V4Y2VsLVNlbWljb2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzddLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnICBUZXN0ICAnLCAnICAgICcsICdUZXN0ICAnIF0sCiAgICAgICAgICAgIFsgJyAgICBUZXN0JywgJycsICAgICAnVGVzdCcgXSwKICAgICAgICAgICAgWyAnJywgICAgICAgICAnJywgICAgICcgJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwYWNlcyBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAzLU1TRXhjZWwtVGFidWxhdG9yLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbN10sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICcgIFRlc3QgICcsICcgICAgJywgJ1Rlc3QgICcgXSwKICAgICAgICAgICAgWyAnICAgIFRlc3QnLCAnJywgICAgICdUZXN0JyBdLAogICAgICAgICAgICBbICcnLCAgICAgICAgICcnLCAgICAgJyAnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BhY2VzIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDMtT3Blbk9mZmljZS1TZW1pY29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s3XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJyAgVGVzdCAgJywgJyAgICAnLCAnVGVzdCAgJyBdLAogICAgICAgICAgICBbICcgICAgVGVzdCcsICcnLCAgICAgJ1Rlc3QnIF0sCiAgICAgICAgICAgIFsgJycsICAgICAgICAgJycsICAgICAnICcgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGFjZXMgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwMy1PcGVuT2ZmaWNlLVRhYnVsYXRvci5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzddLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnICBUZXN0ICAnLCAnICAgICcsICdUZXN0ICAnIF0sCiAgICAgICAgICAgIFsgJyAgICBUZXN0JywgJycsICAgICAnVGVzdCcgXSwKICAgICAgICAgICAgWyAnJywgICAgICAgICAnJywgICAgICcgJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwYWNlcyBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDMtT3Blbk9mZmljZS1Db2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzddLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnICBUZXN0ICAnLCAnICAgICcsICdUZXN0ICAnIF0sCiAgICAgICAgICAgIFsgJyAgICBUZXN0JywgJycsICAgICAnVGVzdCcgXSwKICAgICAgICAgICAgWyAnJywgICAgICAgICAnJywgICAgICcgJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwZWNpYWwgY2hhcmFjdGVyIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDQtTVNFeGNlbC1TZW1pY29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s4XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ1Rlc3Q7Ol/CsF4hIsKnJCUmLygpPT/CtGAqK1Rlc3QnLCAnPjxAflwnfXtbXVxcJyBdLAogICAgICAgICAgICBbICciIjs7OjouLi0tX18jIycsICAgICAgICAgICAgICAgICAgJycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDA0LU1TRXhjZWwtVGFidWxhdG9yLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbOF0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICdUZXN0OzpfwrBeISLCpyQlJi8oKT0/wrRgKitUZXN0JywgJz48QH5cJ317W11cXCcgXSwKICAgICAgICAgICAgWyAnIiI7Ozo6Li4tLV9fIyMnLCAgICAgICAgICAgICAgICAgICcnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BlY2lhbCBjaGFyYWN0ZXIgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwNC1PcGVuT2ZmaWNlLVNlbWljb2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzhdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnVGVzdDs6X8KwXiEiwqckJSYvKCk9P8K0YCorVGVzdCcsICc+PEB+XCd9e1tdXFwnIF0sCiAgICAgICAgICAgIFsgJyIiOzs6Oi4uLS1fXyMjJywgICAgICAgICAgICAgICAgICAnJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwZWNpYWwgY2hhcmFjdGVyIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDQtT3Blbk9mZmljZS1UYWJ1bGF0b3IuY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s4XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ1Rlc3Q7Ol/CsF4hIsKnJCUmLygpPT/CtGAqK1Rlc3QnLCAnPjxAflwnfXtbXVxcJyBdLAogICAgICAgICAgICBbICciIjs7OjouLi0tX18jIycsICAgICAgICAgICAgICAgICAgJycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDQtT3Blbk9mZmljZS1Db2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzhdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnVGVzdDs6X8KwXiEiwqckJSYvKCk9P8K0YCorVGVzdCcsICc+PEB+XCd9e1tdXFwnIF0sCiAgICAgICAgICAgIFsgJyIiOzs6Oi4uLS1fXyMjJywgICAgICAgICAgICAgICAgICAnJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKElTTy04ODU5IGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDUtTVNFeGNlbC1TZW1pY29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s5XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ8O8w7bDpMOfJywgJ8Ocw5bDhCcgXSwKICAgICAgICAgICAgWyAnw5/DpMO2w7wnLCAnw4TDlsOcJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKElTTy04ODU5IGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDUtTVNFeGNlbC1UYWJ1bGF0b3IuY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s5XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ8O8w7bDpMOfJywgJ8Ocw5bDhCcgXSwKICAgICAgICAgICAgWyAnw5/DpMO2w7wnLCAnw4TDlsOcJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKElTTy04ODU5IGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDUtT3Blbk9mZmljZS1TZW1pY29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s5XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ8O8w7bDpMOfJywgJ8Ocw5bDhCcgXSwKICAgICAgICAgICAgWyAnw5/DpMO2w7wnLCAnw4TDlsOcJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKElTTy04ODU5IGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDUtT3Blbk9mZmljZS1UYWJ1bGF0b3IuY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s5XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ8O8w7bDpMOfJywgJ8Ocw5bDhCcgXSwKICAgICAgICAgICAgWyAnw5/DpMO2w7wnLCAnw4TDlsOcJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKElTTy04ODU5IGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0NvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwNS1PcGVuT2ZmaWNlLUNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbOV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICfDvMO2w6TDnycsICfDnMOWw4QnIF0sCiAgICAgICAgICAgIFsgJ8Ofw6TDtsO8JywgJ8OEw5bDnCcgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChVVEYtOCBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwNi1PcGVuT2ZmaWNlLVNlbWljb2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzEwXSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ8qpIMqsIMquJywgICAgICcgyqEgy6QgzowgJyBdLAogICAgICAgICAgICBbICcgIM6XIM+XIM+gICAnLCAnzoYgzpsgzp4nIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoVVRGLTggY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDYtT3Blbk9mZmljZS1UYWJ1bGF0b3IuY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1sxMF0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICfKqSDKrCDKricsICAgICAnIMqhIMukIM6MICcgXSwKICAgICAgICAgICAgWyAnICDOlyDPlyDPoCAgJywgJ86GIM6bIM6eJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKFVURi04IGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0NvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDYtT3Blbk9mZmljZS1Db2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzEwXSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ8qpIMqsIMquJywgICAgICcgyqEgy6QgzowgJyBdLAogICAgICAgICAgICBbICcgIM6XIM+XIM+gICAnLCAnzoYgzpsgzp4nIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoY2hlY2sgdGhlIHBhcnNlZCBjb250ZW50KQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwNy1PcGVuT2ZmaWNlLVNlbWljb2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzVdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnUm93MS1Db2wxJywgJ1JvdzEtQ29sMicsICAnUm93MS1Db2wzJyBdLAogICAgICAgICAgICBbICdSb3cyLUNvbDEnLCAnUm93Mi1Db2wyJywgICdSb3cyLUNvbDMnIF0sCiAgICAgICAgICAgIFsgJ1JvdzMtQ29sMScsICcwUm93My1Db2wyJywgJ1JvdzMtQ29sMycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayB0aGUgcGFyc2VkIGNvbnRlbnQpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDA4LU9wZW5PZmZpY2UtU2VtaWNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgICdSb3cxLUNvbDMnIF0sCiAgICAgICAgICAgIFsgJ1JvdzItQ29sMScsICcwUm93Mi1Db2wyJywgJ1JvdzItQ29sMycgXSwKICAgICAgICAgICAgWyAnUm93My1Db2wxJywgJ1JvdzMtQ29sMicsICAnUm93My1Db2wzJyBdLAogICAgICAgIF0sCiAgICB9LAoKXTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBydW4gZ2VuZXJhbCBJbXBvcnREYXRhR2V0IHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKClRFU1Q6CmZvciBteSAkVGVzdCAoIEB7JEltcG9ydERhdGFUZXN0c30gKSB7CgogICAgIyBjaGVjayBTb3VyY2VJbXBvcnREYXRhIGF0dHJpYnV0ZQogICAgaWYgKCAhJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfSB8fCByZWYgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfSBuZSAnSEFTSCcgKSB7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAwLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBObyBTb3VyY2VJbXBvcnREYXRhIGZvdW5kIGZvciB0aGlzIHRlc3QuIgogICAgICAgICk7CgogICAgICAgIG5leHQgVEVTVDsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IEltcG9ydERhdGFHZXQKICAgIGlmICggISRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntJbXBvcnREYXRhR2V0fSApIHsKICAgICAgICAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57SW1wb3J0RGF0YUdldH0gPSB7fTsKICAgIH0KCiAgICAjIHNldCBzb3VyY2UgY29udGVudAogICAgaWYgKAogICAgICAgICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntTb3VyY2VGaWxlfQogICAgICAgICYmICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntJbXBvcnREYXRhR2V0fS0+e1NvdXJjZUNvbnRlbnR9CiAgICAgICAgJiYgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e0ltcG9ydERhdGFHZXR9LT57U291cmNlQ29udGVudH0gZXEgJ1NvdXJjZUZpbGUnCiAgICAgICAgKQogICAgewoKICAgICAgICBteSAkU291cmNlRmlsZSA9ICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntTb3VyY2VGaWxlfTsKCiAgICAgICAgIyByZWFkIHNvdXJjZSBmaWxlCiAgICAgICAgbXkgJFNvdXJjZUNvbnRlbnQgPSAkTWFpbk9iamVjdC0+RmlsZVJlYWQoCiAgICAgICAgICAgIExvY2F0aW9uID0+ICRTZWxmLT57SG9tZX0gLiAnL3NjcmlwdHMvdGVzdC9zYW1wbGUvSW1wb3J0RXhwb3J0LycgLiAkU291cmNlRmlsZSwKICAgICAgICAgICAgUmVzdWx0ICAgPT4gJ1NDQUxBUicsCiAgICAgICAgICAgIE1vZGUgICAgID0+ICdiaW5tb2RlJywKICAgICAgICApOwoKICAgICAgICAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57SW1wb3J0RGF0YUdldH0tPntTb3VyY2VDb250ZW50fSA9ICRTb3VyY2VDb250ZW50OwogICAgfQoKICAgICMgc2V0IHRoZSBmb3JtYXQgZGF0YQogICAgaWYgKAogICAgICAgICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntGb3JtYXREYXRhfQogICAgICAgICYmIHJlZiAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57Rm9ybWF0RGF0YX0gZXEgJ0hBU0gnCiAgICAgICAgJiYgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e0ltcG9ydERhdGFHZXR9LT57VGVtcGxhdGVJRH0KICAgICAgICApCiAgICB7CgogICAgICAgICMgc2F2ZSBmb3JtYXQgZGF0YQogICAgICAgICRJbXBvcnRFeHBvcnRPYmplY3QtPkZvcm1hdERhdGFTYXZlKAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntJbXBvcnREYXRhR2V0fS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBGb3JtYXREYXRhID0+ICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntGb3JtYXREYXRhfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgaW1wb3J0IGRhdGEKICAgIG15ICRJbXBvcnREYXRhID0gJEZvcm1hdEJhY2tlbmRPYmplY3QtPkltcG9ydERhdGFHZXQoCiAgICAgICAgJXsgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e0ltcG9ydERhdGFHZXR9IH0sCiAgICApOwoKICAgIGlmICggISRUZXN0LT57UmVmZXJlbmNlSW1wb3J0RGF0YX0gKSB7CgogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJEltcG9ydERhdGEsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEltcG9ydERhdGFHZXQoKSAtIHJldHVybiBmYWxzZSIKICAgICAgICApOwoKICAgICAgICBuZXh0IFRFU1Q7CiAgICB9CgogICAgaWYgKCByZWYgJEltcG9ydERhdGEgbmUgJ0FSUkFZJyApIHsKCiAgICAgICAgIyBjaGVjayBhcnJheSByZWZlcmVuY2UKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSW1wb3J0RGF0YUdldCgpIC0gcmV0dXJuIHZhbHVlIGlzIGFuIGFycmF5IHJlZmVyZW5jZSIsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBURVNUOwogICAgfQoKICAgICMgY2hlY2sgbnVtYmVyIG9mIHJvd3MKICAgICRTZWxmLT5JcygKICAgICAgICBzY2FsYXIgQHskSW1wb3J0RGF0YX0sCiAgICAgICAgc2NhbGFyIEB7ICRUZXN0LT57UmVmZXJlbmNlSW1wb3J0RGF0YX0gfSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJbXBvcnREYXRhR2V0KCkgLSBzYW1lIG51bWJlciBvZiByb3dzIiwKICAgICk7CgogICAgIyBjaGVjayBjb250ZW50IG9mIGltcG9ydCBkYXRhCiAgICBteSAkQ291bnRlclJvdyA9IDA7CiAgICBST1c6CiAgICBmb3IgbXkgJEltcG9ydFJvdyAoIEB7JEltcG9ydERhdGF9ICkgewoKICAgICAgICAjIGV4dHJhY3QgcmVmZXJlbmNlIHJvdwogICAgICAgIG15ICRSZWZlcmVuY2VSb3cgPSAkVGVzdC0+e1JlZmVyZW5jZUltcG9ydERhdGF9LT5bJENvdW50ZXJSb3ddOwoKICAgICAgICBpZiAoIHJlZiAkSW1wb3J0Um93IG5lICdBUlJBWScgfHwgcmVmICRSZWZlcmVuY2VSb3cgbmUgJ0FSUkFZJyApIHsKCiAgICAgICAgICAgICMgY2hlY2sgYXJyYXkgcmVmZXJlbmNlCiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEltcG9ydERhdGFHZXQoKSAtIGltcG9ydCByb3cgYW5kIHJlZmVyZW5jZSByb3cgbWF0Y2hlZCIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IFRFU1Q7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIG51bWJlciBvZiBjb2x1bW5zCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICBzY2FsYXIgQHskSW1wb3J0Um93fSwKICAgICAgICAgICAgc2NhbGFyIEB7JFJlZmVyZW5jZVJvd30sCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEltcG9ydERhdGFHZXQoKSAtIHNhbWUgbnVtYmVyIG9mIGNvbHVtbnMiLAogICAgICAgICk7CgogICAgICAgIG15ICRDb3VudGVyQ29sdW1uID0gMDsKICAgICAgICBmb3IgbXkgJENlbGwgKCBAeyRJbXBvcnRSb3d9ICkgewoKICAgICAgICAgICAgIyBzZXQgY29udGVudCBpZiB2YWx1ZXMgYXJlIHVuZGVmCiAgICAgICAgICAgIGlmICggIWRlZmluZWQgJENlbGwgKSB7CiAgICAgICAgICAgICAgICAkQ2VsbCA9ICdVTkRFRi11bml0dGVzdCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkUmVmZXJlbmNlUm93LT5bJENvdW50ZXJDb2x1bW5dICkgewogICAgICAgICAgICAgICAgJFJlZmVyZW5jZVJvdy0+WyRDb3VudGVyQ29sdW1uXSA9ICdVTkRFRi11bml0dGVzdCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgY2VsbCBkYXRhCiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRDZWxsLAogICAgICAgICAgICAgICAgJFJlZmVyZW5jZVJvdy0+WyRDb3VudGVyQ29sdW1uXSwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEltcG9ydERhdGFHZXQoKSAiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJENvdW50ZXJDb2x1bW4rKzsKICAgICAgICB9CgogICAgICAgICRDb3VudGVyUm93Kys7CiAgICB9Cn0KY29udGludWUgewogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgZGVmaW5lIGdlbmVyYWwgRXhwb3J0RGF0YVNhdmUgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJEV4cG9ydERhdGFUZXN0cyA9IFsKCiAgICAjIEV4cG9ydERhdGFTYXZlIGRvZXNuJ3QgY29udGFpbnMgYWxsIGRhdGEgKGNoZWNrIHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWydEdW1teSddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgRXhwb3J0RGF0YVNhdmUgZG9lc24ndCBjb250YWlucyBhbGwgZGF0YSAoY2hlY2sgcmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbMjBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgRXhwb3J0RGF0YVNhdmUgZG9lc24ndCBjb250YWlucyBhbGwgZGF0YSAoY2hlY2sgcmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjBdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbJ0R1bW15J10sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSByb3cgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UgKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjBdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiAnJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGV4cG9ydCBkYXRhIHJvdyBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMF0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IHt9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgbm8gZXhpc3RpbmcgdGVtcGxhdGUgaWQgaXMgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbLTFdICsgMSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWydEdW1teSddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgbm8gY29sdW1uIFNlcGFyYXRvciBhbmQgY2hhcnNldCBhcmUgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjFdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbJ0R1bW15J10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBubyBjb2x1bW4gU2VwYXJhdG9yIGlzIGdpdmVuIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2hhcnNldCA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMV0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsnRHVtbXknXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIG5vIGNoYXJzZXQgaXMgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0R1bW15JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjFdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbJ0R1bW15J10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBpbnZhbGlkIGNvbHVtbiBTZXBhcmF0b3IgaXMgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0R1bW15JywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMV0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsnRHVtbXknXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGV4cG9ydCBkYXRhIGFyZSBvbmUgY2VsbHMgd2l0aCBlbXB0eSBzdHJpbmdzIChvbmUgZW1wdHkgY2VsbCBtdXN0IGJlIHJldHVybmVkKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMl0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsnJ10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyIiJywKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSBhcmUgb25lIGNlbGxzIHdpdGggZW1wdHkgc3RyaW5ncyAob25lIGVtcHR5IGNlbGwgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjJdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbJyddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICciIicsCiAgICB9LAoKICAgICMgZXhwb3J0IGRhdGEgYXJlIG9uZSBjZWxscyB3aXRoIGVtcHR5IHN0cmluZ3MgKG9uZSBlbXB0eSBjZWxsIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjJdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbJyddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICciIicsCiAgICB9LAoKICAgICMgZXhwb3J0IGRhdGEgYXJlIG9uZSBjZWxscyB3aXRoIGVtcHR5IHN0cmluZ3MgKG9uZSBlbXB0eSBjZWxsIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdEb3QnLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIyXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWycnXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIiInLAogICAgfSwKCiAgICAjIGV4cG9ydCBkYXRhIGFyZSB0aHJlZSBjZWxscyB3aXRoIGVtcHR5IHN0cmluZ3MgKHRocmVlIGVtcHR5IGNlbGxzIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIyXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnJywgJycsICcnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyIiOyIiOyIiJywKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSBhcmUgdGhyZWUgY2VsbHMgd2l0aCBlbXB0eSBzdHJpbmdzICh0aHJlZSBlbXB0eSBjZWxscyBtdXN0IGJlIHJldHVybmVkKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMl0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgJycsICcnLCAnJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICJcIlwiXHRcIlwiXHRcIlwiIiwKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSBhcmUgdGhyZWUgY2VsbHMgd2l0aCBlbXB0eSBzdHJpbmdzICh0aHJlZSBlbXB0eSBjZWxscyBtdXN0IGJlIHJldHVybmVkKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnQ29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIyXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnJywgJycsICcnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyIiOiIiOiIiJywKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSBhcmUgdGhyZWUgY2VsbHMgd2l0aCBlbXB0eSBzdHJpbmdzICh0aHJlZSBlbXB0eSBjZWxscyBtdXN0IGJlIHJldHVybmVkKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnRG90JywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMl0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgJycsICcnLCAnJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICciIi4iIi4iIicsCiAgICB9LAoKICAgICMgZXhwb3J0IGRhdGEgYXJlIHRocmVlIGNlbGxzIHdpdGggZW1wdHkgYW5kIHVuZGVmIGNvbnRlbnQgKHRocmVlIGVtcHR5IGNlbGxzIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIyXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyB1bmRlZiwgJycsIHVuZGVmIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJzsiIjsnLAogICAgfSwKCiAgICAjIGV4cG9ydCBkYXRhIGFyZSB0aHJlZSBjZWxscyB3aXRoIGVtcHR5IGFuZCB1bmRlZiBjb250ZW50ICh0aHJlZSBlbXB0eSBjZWxscyBtdXN0IGJlIHJldHVybmVkKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMl0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgdW5kZWYsICcnLCB1bmRlZiBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICJcdFwiXCJcdCIsCiAgICB9LAoKICAgICMgZXhwb3J0IGRhdGEgYXJlIHRocmVlIGNlbGxzIHdpdGggZW1wdHkgYW5kIHVuZGVmIGNvbnRlbnQgKHRocmVlIGVtcHR5IGNlbGxzIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjJdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbIHVuZGVmLCAnJywgdW5kZWYgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnOiIiOicsCiAgICB9LAoKICAgICMgZXhwb3J0IGRhdGEgYXJlIHRocmVlIGNlbGxzIHdpdGggZW1wdHkgYW5kIHVuZGVmIGNvbnRlbnQgKHRocmVlIGVtcHR5IGNlbGxzIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdEb3QnLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIyXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyB1bmRlZiwgJycsIHVuZGVmIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJy4iIi4nLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayB0aGUgcGFyc2VkIGNvbnRlbnQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjNdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIlJvdzEtQ29sMSI7IlJvdzEtQ29sMiI7IlJvdzEtQ29sMyInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayB0aGUgcGFyc2VkIGNvbnRlbnQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdDb21tYScsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syM10sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgJ1JvdzEtQ29sMScsICdSb3cxLUNvbDInLCAnUm93MS1Db2wzJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICciUm93MS1Db2wxIiwiUm93MS1Db2wyIiwiUm93MS1Db2wzIicsCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syM10sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgJ1JvdzEtQ29sMScsICdSb3cxLUNvbDInLCAnUm93MS1Db2wzJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICJcIlJvdzEtQ29sMVwiXHRcIlJvdzEtQ29sMlwiXHRcIlJvdzEtQ29sM1wiIiwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoY2hlY2sgdGhlIHBhcnNlZCBjb250ZW50KQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnQ29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjNdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIlJvdzEtQ29sMSI6IlJvdzEtQ29sMiI6IlJvdzEtQ29sMyInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayB0aGUgcGFyc2VkIGNvbnRlbnQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdEb3QnLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjNdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIlJvdzEtQ29sMSIuIlJvdzEtQ29sMiIuIlJvdzEtQ29sMyInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChuZXdsaW5lIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNF0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgIlxuVGVzdCAxIiwgIlRlc3QgXG4gMiIsICdUZXN0IDMgXG5cdFxyXHMnLCAiVGVzdCA0XG4iIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gcXF7IlxuVGVzdCAxIjsiVGVzdCBcbiAyIjsiVGVzdCAzIFxcblxcdFxcclxccyI7IlRlc3QgNFxuIn0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKG5ld2xpbmUgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI0XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAiXG5UZXN0IDEiLCAiVGVzdCBcbiAyIiwgJ1Rlc3QgMyBcblx0XHJccycsICJUZXN0IDRcbiIgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PgogICAgICAgICAgICBxcXsiXG5UZXN0IDEiXHQiVGVzdCBcbiAyIlx0IlRlc3QgMyBcXG5cXHRcXHJcXHMiXHQiVGVzdCA0XG4ifSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAobmV3bGluZSBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNF0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgIlxuVGVzdCAxIiwgIlRlc3QgXG4gMiIsICdUZXN0IDMgXG5cdFxyXHMnLCAiVGVzdCA0XG4iIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gcXF7IlxuVGVzdCAxIjoiVGVzdCBcbiAyIjoiVGVzdCAzIFxcblxcdFxcclxccyI6IlRlc3QgNFxuIn0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKG5ld2xpbmUgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnRG90JywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI0XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAiXG5UZXN0IDEiLCAiVGVzdCBcbiAyIiwgJ1Rlc3QgMyBcblx0XHJccycsICJUZXN0IDRcbiIgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiBxcXsiXG5UZXN0IDEiLiJUZXN0IFxuIDIiLiJUZXN0IDMgXFxuXFx0XFxyXFxzIi4iVGVzdCA0XG4ifSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BhY2VzIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNF0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgJyAgVGVzdCAgJywgJyAgICAnLCAnVGVzdCAgJywgJyAgICBUZXN0JywgJycsICdUZXN0JywgJycsICcgJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICciICBUZXN0ICAiOyIgICAgIjsiVGVzdCAgIjsiICAgIFRlc3QiOyIiOyJUZXN0IjsiIjsiICInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGFjZXMgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI0XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnICBUZXN0ICAnLCAnICAgICcsICdUZXN0ICAnLCAnICAgIFRlc3QnLCAnJywgJ1Rlc3QnLCAnJywgJyAnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4KICAgICAgICAgICAgIlwiICBUZXN0ICBcIlx0XCIgICAgXCJcdFwiVGVzdCAgXCJcdFwiICAgIFRlc3RcIlx0XCJcIlx0XCJUZXN0XCJcdFwiXCJcdFwiIFwiIiwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BhY2VzIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0NvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI0XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnICBUZXN0ICAnLCAnICAgICcsICdUZXN0ICAnLCAnICAgIFRlc3QnLCAnJywgJ1Rlc3QnLCAnJywgJyAnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyIgIFRlc3QgICI6IiAgICAiOiJUZXN0ICAiOiIgICAgVGVzdCI6IiI6IlRlc3QiOiIiOiIgIicsCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwYWNlcyBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdEb3QnLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjRdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICcgIFRlc3QgICcsICcgICAgJywgJ1Rlc3QgICcsICcgICAgVGVzdCcsICcnLCAnVGVzdCcsICcnLCAnICcgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIiAgVGVzdCAgIi4iICAgICIuIlRlc3QgICIuIiAgICBUZXN0Ii4iIi4iVGVzdCIuIiIuIiAiJywKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BlY2lhbCBjaGFyYWN0ZXIgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI1XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICdUZXN0OzpfXiEiJCUmLygpPT9gKitUZXN0JywKICAgICAgICAgICAgICAgICAgICAnPjxAflwnfXtbXVxcJywKICAgICAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgICAgICAnIiI7Ozo6Li4tLV9fIyMnCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4KICAgICAgICAgICAgJyJUZXN0OzpfXiEiIiQlJi8oKT0/YCorVGVzdCI7Ij48QH5cJ317W11cIjsiIjsiIiIiIjs7OjouLi0tX18jIyInCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwZWNpYWwgY2hhcmFjdGVyIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ0lTTy04ODU5LTEnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNV0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsKICAgICAgICAgICAgICAgICAgICAnVGVzdDs6X14hIiQlJi8oKT0/YCorVGVzdCcsCiAgICAgICAgICAgICAgICAgICAgJz48QH5cJ317W11cXCcsCiAgICAgICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICAgICAgJyIiOzs6Oi4uLS1fXyMjJwogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+CiAgICAgICAgICAgICciVGVzdDs6X14hIiIkJSYvKCk9P2AqK1Rlc3QiJwogICAgICAgICAgICAuICJcdCIKICAgICAgICAgICAgLiAnIj48QH5cJ317W11cXCInCiAgICAgICAgICAgIC4gIlx0IgogICAgICAgICAgICAuICciIicKICAgICAgICAgICAgLiAiXHQiCiAgICAgICAgICAgIC4gJyIiIiIiOzs6Oi4uLS1fXyMjIicsCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwZWNpYWwgY2hhcmFjdGVyIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0NvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnSVNPLTg4NTktMScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI1XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICdUZXN0OzpfXiEiJCUmLygpPT9gKitUZXN0JywKICAgICAgICAgICAgICAgICAgICAnPjxAflwnfXtbXVxcJywKICAgICAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgICAgICAnIiI7Ozo6Li4tLV9fIyMnCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4KICAgICAgICAgICAgJyJUZXN0OzpfXiEiIiQlJi8oKT0/YCorVGVzdCI6Ij48QH5cJ317W11cIjoiIjoiIiIiIjs7OjouLi0tX18jIyInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdEb3QnLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdJU08tODg1OS0xJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjVdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1Rlc3Q7Ol9eISIkJSYvKCk9P2AqK1Rlc3QnLAogICAgICAgICAgICAgICAgICAgICc+PEB+XCd9e1tdXFwnLAogICAgICAgICAgICAgICAgICAgICcnLAogICAgICAgICAgICAgICAgICAgICciIjs7OjouLi0tX18jIycKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PgogICAgICAgICAgICAnIlRlc3Q7Ol9eISIiJCUmLygpPT9gKitUZXN0Ii4iPjxAflwnfXtbXVxcIi4iIi4iIiIiIjs7OjouLi0tX18jIyInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChVVEYtOCBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI2XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnINGqINGsINGyJywgJ9GvING0ING/JywgJ9KCINKKINKWICcgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIiDRqiDRrCDRsiI7ItGvING0ING/Ijsi0oIg0oog0pYgIicsCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKFVURi04IGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjZdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICcg0aog0awg0bInLCAn0a8g0bQg0b8nLCAn0oIg0oog0pYgJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICJcIiDRqiDRrCDRslwiXHRcItGvING0ING/XCJcdFwi0oIg0oog0pYgXCIiLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChVVEYtOCBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjZdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICcg0aog0awg0bInLCAn0a8g0bQg0b8nLCAn0oIg0oog0pYgJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICciINGqINGsINGyIjoi0a8g0bQg0b8iOiLSgiDSiiDSliAiJywKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoVVRGLTggY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnRG90JywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNl0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgJyDRqiDRrCDRsicsICfRryDRtCDRvycsICfSgiDSiiDSliAnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyIg0aog0awg0bIiLiLRryDRtCDRvyIuItKCINKKINKWICInLAogICAgfSwKXTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBydW4gZ2VuZXJhbCBFeHBvcnREYXRhU2F2ZSB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpURVNUOgpmb3IgbXkgJFRlc3QgKCBAeyRFeHBvcnREYXRhVGVzdHN9ICkgewoKICAgICMgY2hlY2sgU291cmNlRXhwb3J0RGF0YSBhdHRyaWJ1dGUKICAgIGlmICggISRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0gfHwgcmVmICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0gbmUgJ0hBU0gnICkgewoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogTm8gU291cmNlRXhwb3J0RGF0YSBmb3VuZCBmb3IgdGhpcyB0ZXN0LiIKICAgICAgICApOwoKICAgICAgICBuZXh0IFRFU1Q7CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCBFeHBvcnREYXRhU2F2ZQogICAgaWYgKCAhJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e0V4cG9ydERhdGFTYXZlfSApIHsKICAgICAgICAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9LT57RXhwb3J0RGF0YVNhdmV9ID0ge307CiAgICB9CgogICAgIyBzZXQgdGhlIGZvcm1hdCBkYXRhCiAgICBpZiAoCiAgICAgICAgJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e0Zvcm1hdERhdGF9CiAgICAgICAgJiYgcmVmICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntGb3JtYXREYXRhfSBlcSAnSEFTSCcKICAgICAgICAmJiAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9LT57RXhwb3J0RGF0YVNhdmV9LT57VGVtcGxhdGVJRH0KICAgICAgICApCiAgICB7CgogICAgICAgICMgc2F2ZSBmb3JtYXQgZGF0YQogICAgICAgICRJbXBvcnRFeHBvcnRPYmplY3QtPkZvcm1hdERhdGFTYXZlKAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntFeHBvcnREYXRhU2F2ZX0tPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9LT57Rm9ybWF0RGF0YX0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGV4cG9ydCBkYXRhIHJvdwogICAgbXkgJEV4cG9ydFN0cmluZyA9ICRGb3JtYXRCYWNrZW5kT2JqZWN0LT5FeHBvcnREYXRhU2F2ZSgKICAgICAgICAleyAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9LT57RXhwb3J0RGF0YVNhdmV9IH0sCiAgICApOwoKICAgIGlmICggIWRlZmluZWQgJFRlc3QtPntSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnR9ICkgewoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgIWRlZmluZWQgJEV4cG9ydFN0cmluZywKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogRXhwb3J0RGF0YVNhdmUoKSAtIHJldHVybiBmYWxzZSIKICAgICAgICApOwoKICAgICAgICBuZXh0IFRFU1Q7CiAgICB9CgogICAgaWYgKCAhZGVmaW5lZCAkRXhwb3J0U3RyaW5nICkgewoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgIWRlZmluZWQgJFRlc3QtPntSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnR9LAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBFeHBvcnREYXRhU2F2ZSgpIC0gcmV0dXJuIGZhbHNlIgogICAgICAgICk7CgogICAgICAgIG5leHQgVEVTVDsKICAgIH0KCiAgICBpZiAoICEkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9LT57RXhwb3J0RGF0YVNhdmV9LT57RXhwb3J0RGF0YVJvd30gKSB7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBkZWZpbmVkICRFeHBvcnRTdHJpbmcsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEV4cG9ydERhdGFTYXZlKCkgLSByZXR1cm4gZmFsc2UiCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBURVNUOwogICAgfQoKICAgICMgY2hlY2sgdGhlIGV4cG9ydCBzdHJpbmcKICAgICRTZWxmLT5JcygKICAgICAgICAkRXhwb3J0U3RyaW5nLAogICAgICAgICRUZXN0LT57UmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50fSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBFeHBvcnREYXRhU2F2ZSgpIiwKICAgICk7Cn0KY29udGludWUgewogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgY2xlYW4gdGhlIHN5c3RlbQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGRlbGV0ZSB0aGUgdGVzdCB0ZW1wbGF0ZXMKJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVEZWxldGUoCiAgICBUZW1wbGF0ZUlEID0+IFxAVGVtcGxhdGVJRHMsCiAgICBVc2VySUQgICAgID0+IDEsCik7CgoxOwo=
Um93MS1Db2wxO1JvdzEtQ29sMjtSb3cxLUNvbDMNClJvdzItQ29sMTtSb3cyLUNvbDI7Um93Mi1Db2wzDQpSb3czLUNvbDE7Um93My1Db2wyO1JvdzMtQ29sMw0K
Um93MS1Db2wxCVJvdzEtQ29sMglSb3cxLUNvbDMNClJvdzItQ29sMQlSb3cyLUNvbDIJUm93Mi1Db2wzDQpSb3czLUNvbDEJUm93My1Db2wyCVJvdzMtQ29sMw0K
IlJvdzEtQ29sMSI6IlJvdzEtQ29sMiI6IlJvdzEtQ29sMyINCiJSb3cyLUNvbDEiOiJSb3cyLUNvbDIiOiJSb3cyLUNvbDMiDQoiUm93My1Db2wxIjoiUm93My1Db2wyIjoiUm93My1Db2wzIg0K
IlJvdzEtQ29sMSI7IlJvdzEtQ29sMiI7IlJvdzEtQ29sMyINCiJSb3cyLUNvbDEiOyJSb3cyLUNvbDIiOyJSb3cyLUNvbDMiDQoiUm93My1Db2wxIjsiUm93My1Db2wyIjsiUm93My1Db2wzIg0K
IlJvdzEtQ29sMSIJIlJvdzEtQ29sMiIJIlJvdzEtQ29sMyINCiJSb3cyLUNvbDEiCSJSb3cyLUNvbDIiCSJSb3cyLUNvbDMiDQoiUm93My1Db2wxIgkiUm93My1Db2wyIgkiUm93My1Db2wzIg0K
IgpUZXN0IDEgLSAxIjtUZXN0IDEgLSAyOyJUZXN0IDEKLSAzIjtUZXN0IFxuXHRcclxzDQoiVGVzdCAyIAotIDEiOyJUZQpzdCAyIC0gMiI7IlRlc3QgMiAtIDMKIjsNCg==
IgpUZXN0IDEgLSAxIglUZXN0IDEgLSAyCSJUZXN0IDEKLSAzIglUZXN0IFxuXHRcclxzDQoiVGVzdCAyIAotIDEiCSJUZQpzdCAyIC0gMiIJIlRlc3QgMiAtIDMKIgkNCg==
IgpUZXN0IDEgLSAxIjoiVGVzdCAxIC0gMiI6IlRlc3QgMQotIDMiOiJUZXN0IFxuXHRcclxzIg0KIlRlc3QgMiAKLSAxIjoiVGUKc3QgMiAtIDIiOiJUZXN0IDIgLSAzCiI6DQo=
IgpUZXN0IDEgLSAxIjsiVGVzdCAxIC0gMiI7IlRlc3QgMQotIDMiOyJUZXN0IFxuXHRcclxzIg0KIlRlc3QgMiAKLSAxIjsiVGUKc3QgMiAtIDIiOyJUZXN0IDIgLSAzCiI7DQo=
IgpUZXN0IDEgLSAxIgkiVGVzdCAxIC0gMiIJIlRlc3QgMQotIDMiCSJUZXN0IFxuXHRcclxzIg0KIlRlc3QgMiAKLSAxIgkiVGUKc3QgMiAtIDIiCSJUZXN0IDIgLSAzCiIJDQo=
ICBUZXN0ICA7ICAgIDtUZXN0ICANCiAgICBUZXN0OztUZXN0DQo7OyANCg==
ICBUZXN0ICAJICAgIAlUZXN0ICANCiAgICBUZXN0CQlUZXN0DQoJCSANCg==
IiAgVGVzdCAgIjoiICAgICI6IlRlc3QgICINCiIgICAgVGVzdCI6OiJUZXN0Ig0KOjoiICINCg==
IiAgVGVzdCAgIjsiICAgICI7IlRlc3QgICINCiIgICAgVGVzdCI7OyJUZXN0Ig0KOzsiICINCg==
IiAgVGVzdCAgIgkiICAgICIJIlRlc3QgICINCiIgICAgVGVzdCIJCSJUZXN0Ig0KCQkiICINCg==
IlRlc3Q7Ol+wXiEiIqckJSYvKCk9P7RgKitUZXN0Ijs+PEB+J317W11cDQoiIiIiIjs7OjouLi0tX18jIyI7DQo=
IlRlc3Q7Ol+wXiEiIqckJSYvKCk9P7RgKitUZXN0Igk+PEB+J317W11cDQoiIiIiIjs7OjouLi0tX18jIyIJDQo=
IlRlc3Q7Ol+wXiEiIqckJSYvKCk9P7RgKitUZXN0IjoiPjxAfid9e1tdXCINCiIiIiIiOzs6Oi4uLS1fXyMjIjoNCg==
IlRlc3Q7Ol+wXiEiIqckJSYvKCk9P7RgKitUZXN0IjsiPjxAfid9e1tdXCINCiIiIiIiOzs6Oi4uLS1fXyMjIjsNCg==
IlRlc3Q7Ol+wXiEiIqckJSYvKCk9P7RgKitUZXN0IgkiPjxAfid9e1tdXCINCiIiIiIiOzs6Oi4uLS1fXyMjIgkNCg==
/Pbk3zvc1sQNCt/k9vw7xNbcDQo=
/Pbk3wnc1sQNCt/k9vwJxNbcDQo=
Ivz25N8iOiLc1sQiDQoi3+T2/CI6IsTW3CINCg==
Ivz25N8iOyLc1sQiDQoi3+T2/CI7IsTW3CINCg==
Ivz25N8iCSLc1sQiDQoi3+T2/CIJIsTW3CINCg==
IsqpIMqsIMquIjsiIMqhIMukIM6MICINCiIgIM6XIM+XIM+gICAiOyLOhiDOmyDOniINCg==
IsqpIMqsIMquIjoiIMqhIMukIM6MICINCiIgIM6XIM+XIM+gICAiOiLOhiDOmyDOniINCg==
IsqpIMqsIMquIgkiIMqhIMukIM6MICINCiIgIM6XIM+XIM+gICAiCSLOhiDOmyDOniINCg==
IlJvdzEtQ29sMSI7IlJvdzEtQ29sMiI7IlJvdzEtQ29sMyINCiJSb3cyLUNvbDEiOyJSb3cyLUNvbDIiOyJSb3cyLUNvbDMiDQoiUm93My1Db2wxIjsiMFJvdzMtQ29sMiI7IlJvdzMtQ29sMyINCg==
IlJvdzEtQ29sMSI7IlJvdzEtQ29sMiI7IlJvdzEtQ29sMyINCiJSb3cyLUNvbDEiOyIwUm93Mi1Db2wyIjsiUm93Mi1Db2wzIg0KIlJvdzMtQ29sMSI7IlJvdzMtQ29sMiI7IlJvdzMtQ29sMyINCg==
IyAtLQojIEltcG9ydEV4cG9ydC5wbSAtIGNvZGUgdG8gZXhjZWN1dGUgZHVyaW5nIHBhY2thZ2UgaW5zdGFsbGF0aW9uCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTQgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSB2YXI6OnBhY2thZ2VzZXR1cDo6SW1wb3J0RXhwb3J0OyAgICAjIyBubyBjcml0aWMKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCik7Cgo9aGVhZDEgTkFNRQoKSW1wb3J0RXhwb3J0LnBtIC0gY29kZSB0byBleGNlY3V0ZSBkdXJpbmcgcGFja2FnZSBpbnN0YWxsYXRpb24KCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGZ1bmN0aW9ucwoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkQ29kZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ3Zhcjo6cGFja2FnZXNldHVwOjpJbXBvcnRFeHBvcnQnKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBhbHdheXMgZGlzY2FyZCB0aGUgY29uZmlnIG9iamVjdCBiZWZvcmUgcGFja2FnZSBjb2RlIGlzIGV4ZWN1dGVkLAogICAgIyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgY29uZmlnIG9iamVjdCB3aWxsIGJlIGNyZWF0ZWQgbmV3bHksIHNvIHRoYXQgaXQKICAgICMgd2lsbCB1c2UgdGhlIHJlY2VudGx5IHdyaXR0ZW4gbmV3IGNvbmZpZyBmcm9tIHRoZSBwYWNrYWdlCiAgICAkS2VybmVsOjpPTS0+T2JqZWN0c0Rpc2NhcmQoCiAgICAgICAgT2JqZWN0cyA9PiBbICdLZXJuZWw6OkNvbmZpZycgXSwKICAgICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBDb2RlSW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlSW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVJbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVSZWluc3RhbGwoKQoKcnVuIHRoZSBjb2RlIHJlaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlUmVpbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZVJlaW5zdGFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlVXBncmFkZSgpCgpydW4gdGhlIGNvZGUgdXBncmFkZSBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlVXBncmFkZSgpOwoKPWN1dAoKc3ViIENvZGVVcGdyYWRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVVcGdyYWRlRnJvbUJlZm9yZV8yXzBfMygpCgpUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgZXhlY3V0ZWQgaWYgdGhlIGluc3RhbGxlZCBtb2R1bGUgdmVyc2lvbiBpcyBzbWFsbGVyIHRoYW4gMi4wLjMuCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlVXBncmFkZUZyb21CZWZvcmVfMl8wXzMoKTsKCj1jdXQKCnN1YiBDb2RlVXBncmFkZUZyb21CZWZvcmVfMl8wXzMgeyAgICAjIyBubyBjcml0aWMKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBmaXggYSB0eXBvIGluIHRoZSBkYXRhYmFzZQogICAgJFNlbGYtPl9GaXhEYXRhYmFzZVR5cG8oKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVVuaW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgdW5pbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVbmluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlVW5pbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIDE7Cn0KCj1iZWdpbiBJbnRlcm5hbDoKCj1pdGVtIF9GaXhEYXRhYmFzZVR5cG8oKQoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X0ZpeERhdGFiYXNlVHlwbygpOwoKPWN1dAoKc3ViIF9GaXhEYXRhYmFzZVR5cG8gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGZpeCB0aGUgQ29sdW1uU2VwZXJhdG9yIHR5cG8gKGNvcnJlY3QgaXMgQ29sdW1uU2VwYXJhdG9yKQogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMID0+ICJVUERBVEUgaW1leHBvcnRfZm9ybWF0ICIKICAgICAgICAgICAgLiAiU0VUIGRhdGFfa2V5ID0gJ0NvbHVtblNlcGFyYXRvcicgIgogICAgICAgICAgICAuICJXSEVSRSBkYXRhX2tleSA9ICdDb2x1bW5TZXBlcmF0b3InIiwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9ZW5kIEludGVybmFsOgoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBTb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAo=
LyoqCiAqIEBwcm9qZWN0ICAgICBPVFJTIChodHRwOi8vd3d3Lm90cnMub3JnKSAtIEFnZW50IEZyb250ZW5kCiAqIEBjb3B5cmlnaHQgICBPVFJTIEFHCiAqIEBsaWNlbnNlICAgICBBR1BMIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQpCiAqLwoKLyoqCiAqIEBwYWNrYWdlICAgICBTa2luICJEZWZhdWx0IgogKiBAc2VjdGlvbiAgICAgSW1wb3J0IEV4cG9ydCBTY3JlZW4KICovCgpAbWVkaWEgc2NyZWVuLHByb2plY3Rpb24sdHYsaGFuZGhlbGQgewoKLyoqCiAqIEBzdWJzZWN0aW9uCiAqLwoKCi5NYXBIZWFkZXJSb3cgbGFiZWwgewogICAgY29sb3I6ICM5MjkyOTI7Cn0KCi5NYXBIZWFkZXJSb3cgLkhlYWRlciwKLk1hcEhlYWRlclJvdyAuRmllbGQgewogICAgZGlzcGxheTogaW5saW5lOwogICAgbWFyZ2luLXJpZ2h0OiAxNXB4OwogICAgcGFkZGluZy1sZWZ0OiAycHg7Cn0KCmJ1dHRvbi5BcnJvd1VwLApidXR0b24uQXJyb3dEb3duIHsKICAgIGhlaWdodDogMTZweDsKICAgIHdpZHRoOiAxNnB4OwogICAgcGFkZGluZzogMXB4OwogICAgbWFyZ2luLXRvcDogMDsKICAgIG1hcmdpbi1ib3R0b206IDFweDsKICAgIGJvcmRlci1zdHlsZTogbm9uZTsKICAgIHRleHQtaW5kZW50OiAtOTk5OXB4OwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKYnV0dG9uLkFycm93VXA6YWN0aXZlLApidXR0b24uQXJyb3dEb3duOmFjdGl2ZSB7CiAgICBtYXJnaW4tdG9wOiAxcHg7CiAgICBtYXJnaW4tYm90dG9tOiAwOwp9CgpidXR0b24uQXJyb3dVcFtkaXNhYmxlZD0iZGlzYWJsZWQiXTphY3RpdmUsCmJ1dHRvbi5BcnJvd0Rvd25bZGlzYWJsZWQ9ImRpc2FibGVkIl06YWN0aXZlIHsKICAgIG1hcmdpbi10b3A6IDBweDsKICAgIG1hcmdpbi1ib3R0b206IDFweDsKfQoKYnV0dG9uLkFycm93VXAgewogICAgYmFja2dyb3VuZDogdXJsKC4uL2ltZy9pY29ucy9pbXBvcnRleHBvcnRfYXJyb3dfdXAucG5nKTsKfQoKYnV0dG9uLkFycm93VXBbZGlzYWJsZWQ9ImRpc2FibGVkIl0gewogICAgYmFja2dyb3VuZDogdXJsKC4uL2ltZy9pY29ucy9pbXBvcnRleHBvcnRfYXJyb3dfdXBfZGlzYWJsZWQucG5nKTsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQoKYnV0dG9uLkFycm93RG93biB7CiAgICBiYWNrZ3JvdW5kOiB1cmwoLi4vaW1nL2ljb25zL2ltcG9ydGV4cG9ydF9hcnJvd19kb3duLnBuZyk7Cn0KCmJ1dHRvbi5BcnJvd0Rvd25bZGlzYWJsZWQ9ImRpc2FibGVkIl17CiAgICBiYWNrZ3JvdW5kOiB1cmwoLi4vaW1nL2ljb25zL2ltcG9ydGV4cG9ydF9hcnJvd19kb3duX2Rpc2FibGVkLnBuZyk7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCn0gLyogZW5kIEBtZWRpYSAqLwo=
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAZlJREFUeNqkUztLA0EQnr3bvEhhI9FC09gJInJiZbAQREHUWhTtbK8ULEWwFVLZaJE/YKWFgn2SQgxBgjYSIoYkEsxxuec6c/FxCXmAGZjbmdmZ7+a1TAgBw5AEQxL3K7OnjxAMhyEQCkEgGARJllfJ7jrOjWWaYBkGmM0mPBzOdAdoIyF2MFD9lkfxmxqYgT/Ysix1fzOukHp59apCq1epgT0QFGya6u56XMnnG0C8vTahkI3u+gJ4wYah7m1NKcWiBrregFqtArlcCTaWxhW66wRpKwEdEjTW5EUmS/riXEzhXMB9upSFdMnzYYwl/KXwjgwOsHEgXBds285oQgYHAQ1dB875PJMkmkz/Jjq2DbqmeXJFDoHDwAMwUI9Eo/0BtHod9EbjVy/zKDgugIkARHSy52uUFroDFM9WgI9NQ2T5qJUBj2AJfwD63QnY73mUznuPkRy022MwcfNsJnlMMtlawYMXadItP8Wst1yhmmz9SVQLBbTRUn0iv1CrfpyZ/zXiiOgYQY72WHDq5QfGuF0B/kNfAgwAlIbWNoRkTzIAAAAASUVORK5CYII=
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAAXNSR0IArs4c6QAAAAJiS0dEAP+Hj8y/AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH2goUEigB30KkogAAAMpJREFUKM+lkT0OAWEQhp/9ESJKF5FPK1oSCQfYXvvVDuAcCola5w5sKdkL6EQhYv+NYpddSyi8xUwxT2bemTGE7zJ/1LGzNKNBnRrWANJNTEjAvAzkclINtFm+dQAQJ9ZjBWstFIhZlCM9Uh4eQxVpcSqAOKGeqAM+J/b0VfhE8hFRT1i40FEWWxfA6GVjckCmKTeSXcoNH7trYlVNJlwBQQiAZhU4c8k6IfiAT+sVOD52AQJ4xsJk6VrRp1PHWXJXgOGWAePvb94BXKRFykgCmkUAAAAASUVORK5CYII=
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAZBJREFUeNrEU79Lw0AUfpemhZI4CIpCJ92cHE4HJ0HEQcFRQdShIJ0E/5SCOBSkgxZE7CS4iIt06NIMnVxUcKhWCJb+iPl1l/gu1ppKKkIHH1zu3r33ffnu3Tvi+z4MYxIMaXLYWcy/9taEkBxOtOtqqDTzFbtNT0QTeIyFXbq5kgoIzq9rf1PgOk5fsNVyQZTo5/5AgqauQ1JVe75puuB5AI5lfe91OvidiiYwms0gOakogd9ovYPjuuCY5ifYMMC17cEKhDEEGO02yLIMNYsB9wjYSMCwPh7nvx8BK51DzZSjbo5E9biCBBAQoFW6ORpOmegi2nYJEyhNr9EHPOo9qvXAB3V1iY4mAF7OrjS83tLARkJwwbWsbPmoqCkJCXQmwRuPQVyW4Clf1ERM5IQxJNzK6vwWSmcQm1nfxv2Dsb0dyjHcOD4Vf87yu8uCVb2AMKaPAJPEJK5gRF7Y3yCTs7uBsnr1hJUPi7gUd9j2Q6AognEcKRwxMr08FxA83lS6KaLXnxHjRRL8y2v8EGAAqEvNnH+aSSAAAAAASUVORK5CYII=
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAAXNSR0IArs4c6QAAAAJiS0dEAP+Hj8y/AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH2goUEig6bklNhgAAAMlJREFUKM+lkT0KAjEQhb9IFEE9TToP4BU8gq2exG23FAKCYCmIra25iYL4w/6asVhddlW0cJo3yXy8CS9K+F6NH3N0IVMAVIgBnIwAJlXgVogZGNh8ckgfxzNS9jXgQAeACE8MwLUOnIjpACcyYuBa+uinVc4ZzQVPRI5/XSGhN54cQYhhB+IYVYBkK2ZojkR4+qbNyqltLSixSTBzLRIyNEuXBGJfkhSbBtb16LJwaTmuPBLEZszHoIKmfcvhieR70Ovqnfr7N++lLlCSshf+TwAAAABJRU5ErkJggg==