{
    "id": "event_66151d81c952b430",
    "timestamp": 1776863951,
    "branch_id": "main",
    "parent_event_id": null,
    "type": "patch_apply",
    "label": "Assouplir villes livraison et défauts PDV",
    "source": "patch",
    "author": "CNOC",
    "session_id": "43305eb2706f6eee2531a5a173355a18",
    "payload": [
        {
            "path": "caisse-aqp/public/api/_lib/clientUpsert.php",
            "kind": "file",
            "before": {
                "exists": true,
                "kind": "file",
                "size": 9905,
                "sha1": "b406a71becbb6fb0054a492a1f4b9a878b11d8c2",
                "content_b64": "PD9waHAKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgovKiBkb2MtcHJvamVjdCB8IGNhaXNzZS1hcXAvcHVibGljL2FwaS9fbGliL2NsaWVudFVwc2VydC5waHAgfCBGb3Vybml0IGxlcyBoZWxwZXJzIGRlIG5vcm1hbGlzYXRpb24sIHZhbGlkYXRpb24gZXQgdXBzZXJ0IGZ1c2lvbm7DqSBkZXMgY2xpZW50cyBwb3VyIENSRUFURS9VUERBVEUsIGF2ZWMgY2Fub25pY2FsaXNhdGlvbiBkdSBjb3VwbGUgdmlsbGUgLyBjb2RlIHBvc3RhbCBhdXRvcmlzw6kgc2Vsb24gbGUgUERWIHF1YW5kIHVuZSBvcHRpb24gdmFsaWRlIGVzdCByw6llbGxlbWVudCBzw6lsZWN0aW9ubsOpZSwgZXQgY29uc2VydmF0aW9uIGV4cGxpY2l0ZSBkZXMgdmFsZXVycyBkw6lqw6AgcHLDqXNlbnRlcyBlbiBiYXNlIHF1YW5kIGxlIHPDqWxlY3RldXIgY29tcG9zaXRlIGVzdCB2aWRlIG91IGhvcnMgY29ycmVzcG9uZGFuY2UgcG91ciBsZSBQRFYgY291cmFudC4gfCBFeHBvc2U6IG5vcm1hbGl6ZVBob25lRm9yRGIsIGNsZWFuU3RyLCBiaW5kVmFsdWVOdWxsYWJsZSwgZXhlY3V0ZUNsaWVudFVwZGF0ZVdpdGhOdWxsRmFsbGJhY2ssIHVwc2VydENsaWVudEZyb21QYXlsb2FkIHwgRMOpcGVuZCBkZTogY2xpZW50UGhvbmVSZXNvbHZlci5waHAsIGRlbGl2ZXJ5Q2l0eUNob2ljZXMucGhwLCBQRE8sIFBET1N0YXRlbWVudCwgUERPRXhjZXB0aW9uIHwgSW1wYWN0ZTogcGVyc2lzdGFuY2UgU1FMIHN0ZF9jbGllbnRzLCBtaXNlIMOgIGpvdXIvaW5zZXJ0IGRlcyBkb25uw6llcyBjbGllbnQgfCBUYWJsZXM6IHN0ZF9jbGllbnRzKHBob25lTnVtYmVyLCBub21fcHJlbm9tLCBhZHJlc3NlLCBjb21wbGVtZW50X2FkcmVzc2UsIGNvZGVfcG9zdGFsLCB2aWxsZSwgbnVtX3N1cHAxLCBudW1fc3VwcDIsIHByb2JsZW1lLCBzdG9wX3Ntcywgb3JkZXJfb25saW5lLCBwb2ludHNfZmlkLCBkZWxpdmVyeV9uZWFyX2NvbmZpcm1lZCkgKi8KQHJlcXVpcmVfb25jZSBfX0RJUl9fIC4gJy9jbGllbnRQaG9uZVJlc29sdmVyLnBocCc7CkByZXF1aXJlX29uY2UgX19ESVJfXyAuICcvZGVsaXZlcnlDaXR5Q2hvaWNlcy5waHAnOwovKioKICogU2hhcmVkIGNsaWVudCB1cHNlcnQgaGVscGVycy4KICogR29hbDoga2VlcCBjbGllbnQgcGVyc2lzdGVuY2UgcnVsZXMgaWRlbnRpY2FsIGFjcm9zcyBDUkVBVEUgYW5kIFVQREFURS4KICoKICogUnVsZXM6CiAqIC0gcGhvbmUgaXMgbm9ybWFsaXplZCAoc2FtZSBhcyBjbGllbnRMb29rdXAucGhwKSBhbmQgaXMgdGhlIHByaW1hcnkgbWF0Y2hpbmcga2V5OgogKiAgIHN0ZF9jbGllbnRzLnBob25lTnVtYmVyIE9SIG51bV9zdXBwMS8yCiAqIC0gbWVyZ2UgKG1lcmdlLXBhdGNoIHNlbWFudGljcyk6CiAqICAgLSBrZXkgQUJTRU5UIGluIHBheWxvYWQgPT4gZG8gbm90IG1vZGlmeSBjb2x1bW4KICogICAtIGtleSBQUkVTRU5UIHdpdGggbnVsbCA9PiBjbGVhciBjb2x1bW4gKHNldCBOVUxMOyBpZiBEQiByZWplY3RzIE5VTEwsIGZhbGxiYWNrIHRvICcnKQogKiAgIC0ga2V5IFBSRVNFTlQgd2l0aCBub24tZW1wdHkgc3RyaW5nID0+IHVwZGF0ZSBjb2x1bW4KICogICAtIGtleSBQUkVTRU5UIHdpdGggZW1wdHkgc3RyaW5nID0+IGlnbm9yZSAoYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBjbGllbnRzKQogKi8KCmZ1bmN0aW9uIG5vcm1hbGl6ZVBob25lRm9yRGIoc3RyaW5nICRpbnB1dCk6IHN0cmluZyB7CiAgJHJhdyA9IHRyaW0oJGlucHV0KTsKICBpZiAoJHJhdyA9PT0gJycpIHJldHVybiAnJzsKCiAgJHMgPSBwcmVnX3JlcGxhY2UoJy9ccysvJywgJycsICRyYXcpOwogIGlmICgkcyA9PT0gbnVsbCkgJHMgPSAkcmF3OwoKICAvLyBIYW5kbGUgKyAvIDAwIHByZWZpeGVzCiAgaWYgKHN0cmxlbigkcykgPiAwICYmICRzWzBdID09PSAnKycpIHsKICAgICRzID0gc3Vic3RyKCRzLCAxKTsKICB9CiAgaWYgKHN0cnBvcygkcywgJzAwJykgPT09IDApIHsKICAgICRzID0gc3Vic3RyKCRzLCAyKTsKICB9CgogIC8vIERpZ2l0cyBvbmx5CiAgJGRpZ2l0cyA9IHByZWdfcmVwbGFjZSgnL1xEKy8nLCAnJywgJHMpOwogIGlmICgkZGlnaXRzID09PSBudWxsKSAkZGlnaXRzID0gJyc7CiAgJGRpZ2l0cyA9IHRyaW0oJGRpZ2l0cyk7CiAgaWYgKCRkaWdpdHMgPT09ICcnKSByZXR1cm4gJyc7CgogIC8vIEZyYW5jZSBsb2NhbDogMTAgZGlnaXRzIHN0YXJ0aW5nIHdpdGggMCA9PiAzMyArIGxhc3QgOQogIGlmIChwcmVnX21hdGNoKCcvXjBcZHs5fSQvJywgJGRpZ2l0cykgPT09IDEpIHsKICAgIHJldHVybiAnMzMnIC4gc3Vic3RyKCRkaWdpdHMsIDEpOwogIH0KICAvLyBGcmFuY2UgYWxyZWFkeSBub3JtYWxpemVkOiAzMyArIDkgZGlnaXRzCiAgaWYgKHByZWdfbWF0Y2goJy9eMzNcZHs5fSQvJywgJGRpZ2l0cykgPT09IDEpIHsKICAgIHJldHVybiAkZGlnaXRzOwogIH0KICAvLyBJbnRlcm5hdGlvbmFsOiBrZWVwIGRpZ2l0cwogIHJldHVybiAkZGlnaXRzOwp9CgpmdW5jdGlvbiBjbGVhblN0cigkdiwgaW50ICRtYXhMZW4gPSAwKTogc3RyaW5nIHsKICAkcyA9IHRyaW0oKHN0cmluZykoJHYgPz8gJycpKTsKICBpZiAoJHMgPT09ICcnKSByZXR1cm4gJyc7CiAgaWYgKCRtYXhMZW4gPiAwICYmIG1iX3N0cmxlbigkcywgJ1VURi04JykgPiAkbWF4TGVuKSB7CiAgICAkcyA9IG1iX3N1YnN0cigkcywgMCwgJG1heExlbiwgJ1VURi04Jyk7CiAgfQogIHJldHVybiAkczsKfQoKLyoqCiAqIEJpbmQgaGVscGVyIHRoYXQgc3VwcG9ydHMgTlVMTCBleHBsaWNpdGx5LgogKi8KZnVuY3Rpb24gYmluZFZhbHVlTnVsbGFibGUoUERPU3RhdGVtZW50ICRzdG10LCBzdHJpbmcgJGtleSwgJHZhbHVlKTogdm9pZCB7CiAgaWYgKCR2YWx1ZSA9PT0gbnVsbCkgewogICAgJHN0bXQtPmJpbmRWYWx1ZSgka2V5LCBudWxsLCBQRE86OlBBUkFNX05VTEwpOwogICAgcmV0dXJuOwogIH0KICAkc3RtdC0+YmluZFZhbHVlKCRrZXksICR2YWx1ZSwgaXNfaW50KCR2YWx1ZSkgPyBQRE86OlBBUkFNX0lOVCA6IFBETzo6UEFSQU1fU1RSKTsKfQoKLyoqCiAqIEV4ZWN1dGUgYW4gVVBEQVRFIHRoYXQgbWF5IGluY2x1ZGUgTlVMTCBiaW5kcy4KICogSWYgREIgcmVqZWN0cyBOVUxMIGZvciBzb21lIGNvbHVtbnMgKE5PVCBOVUxMKSwgcmV0cnkgYnkgY29udmVydGluZyBOVUxMIC0+ICcnIGZvciB0aG9zZSBmaWVsZHMuCiAqLwpmdW5jdGlvbiBleGVjdXRlQ2xpZW50VXBkYXRlV2l0aE51bGxGYWxsYmFjayhQRE8gJHBkbywgc3RyaW5nICRzcWxVLCBhcnJheSAkYmluZCk6IHZvaWQgewogICRzdG10VSA9ICRwZG8tPnByZXBhcmUoJHNxbFUpOwogIGZvcmVhY2ggKCRiaW5kIGFzICRrID0+ICR2KSBiaW5kVmFsdWVOdWxsYWJsZSgkc3RtdFUsICRrLCAkdik7CiAgdHJ5IHsKICAgICRzdG10VS0+ZXhlY3V0ZSgpOwogICAgcmV0dXJuOwogIH0gY2F0Y2ggKFBET0V4Y2VwdGlvbiAkZSkgewogICAgJGNvZGUgPSAoc3RyaW5nKSRlLT5nZXRDb2RlKCk7CiAgICAkbXNnID0gc3RydG9sb3dlcigoc3RyaW5nKSRlLT5nZXRNZXNzYWdlKCkpOwogICAgJGxvb2tzTGlrZU51bGxWaW9sYXRpb24gPSAoJGNvZGUgPT09ICcyMzAwMCcgfHwgc3RyX2NvbnRhaW5zKCRtc2csICdjYW5ub3QgYmUgbnVsbCcpIHx8IHN0cl9jb250YWlucygkbXNnLCAnbm90IG51bGwnKSk7CiAgICBpZiAoISRsb29rc0xpa2VOdWxsVmlvbGF0aW9uKSB0aHJvdyAkZTsKCiAgICAvLyBSZXRyeSB3aXRoIE5VTEwgLT4gJycgKGJlc3QtZWZmb3J0IGZvciBOT1QgTlVMTCBjb2x1bW5zKS4KICAgICRiaW5kMiA9ICRiaW5kOwogICAgZm9yZWFjaCAoJGJpbmQyIGFzICRrID0+ICR2KSB7CiAgICAgIGlmICgkdiA9PT0gbnVsbCAmJiAkayAhPT0gJzppZCcgJiYgJGsgIT09ICc6cGhvbmUnKSAkYmluZDJbJGtdID0gJyc7CiAgICB9CiAgICAkc3RtdDIgPSAkcGRvLT5wcmVwYXJlKCRzcWxVKTsKICAgIGZvcmVhY2ggKCRiaW5kMiBhcyAkayA9PiAkdikgYmluZFZhbHVlTnVsbGFibGUoJHN0bXQyLCAkaywgJHYpOwogICAgJHN0bXQyLT5leGVjdXRlKCk7CiAgfQp9CgpmdW5jdGlvbiBzaG91bGRQcmVzZXJ2ZUV4aXN0aW5nRGVsaXZlcnlDaXR5KGFycmF5ICRwYXlsb2FkKTogYm9vbCB7CiAgJHJhdyA9ICRwYXlsb2FkWydkZWxpdmVyeUNpdHlDaG9pY2VQcmVzZXJ2ZUV4aXN0aW5nJ10gPz8gZmFsc2U7CiAgaWYgKCRyYXcgPT09IHRydWUgfHwgJHJhdyA9PT0gMSB8fCAkcmF3ID09PSAnMScpIHJldHVybiB0cnVlOwogICRzID0gc3RydG9sb3dlcih0cmltKChzdHJpbmcpJHJhdykpOwogIHJldHVybiBpbl9hcnJheSgkcywgWyd0cnVlJywgJ29uJywgJ3llcyddLCB0cnVlKTsKfQoKZnVuY3Rpb24gdXBzZXJ0Q2xpZW50RnJvbVBheWxvYWQoUERPICRwZG8sIHN0cmluZyAkcGhvbmVSYXcsICRjbGllbnRQYXlsb2FkLCBzdHJpbmcgJHN0b3JlSWQgPSAnJyk6IGludCB7CiAgJHBob25lID0gbm9ybWFsaXplUGhvbmVGb3JEYigkcGhvbmVSYXcpOwogIGlmICgkcGhvbmUgPT09ICcnKSByZXR1cm4gMDsKCiAgLy8gQmFzaWMgdmFsaWRhdGlvbiAoRS4xNjQgbWF4IDE1IGRpZ2l0czsgYWNjZXB0IGRvd24gdG8gNiB0byBhdm9pZCBub2lzeSBqdW5rKQogIGlmIChwcmVnX21hdGNoKCcvXlxkKyQvJywgJHBob25lKSAhPT0gMSkgcmV0dXJuIDA7CiAgJGxlbiA9IHN0cmxlbigkcGhvbmUpOwogIGlmICgkbGVuIDwgNiB8fCAkbGVuID4gMTUpIHJldHVybiAwOwoKICAkY3AgPSAoaXNfYXJyYXkoJGNsaWVudFBheWxvYWQpID8gJGNsaWVudFBheWxvYWQgOiBbXSk7CiAgJHByZXNlcnZlRGVsaXZlcnlDaXR5ID0gc2hvdWxkUHJlc2VydmVFeGlzdGluZ0RlbGl2ZXJ5Q2l0eSgkY3ApOwogIHVuc2V0KCRjcFsnZGVsaXZlcnlDaXR5Q2hvaWNlUHJlc2VydmVFeGlzdGluZyddKTsKICBpZiAoJHN0b3JlSWQgIT09ICcnKSB7CiAgICBpZiAoJHByZXNlcnZlRGVsaXZlcnlDaXR5KSB7CiAgICAgIHVuc2V0KAogICAgICAgICRjcFsndmlsbGUnXSwKICAgICAgICAkY3BbJ2NvZGVfcG9zdGFsJ10sCiAgICAgICAgJGNwWydjb2RlUG9zdGFsJ10sCiAgICAgICAgJGNwWydjaXR5J10sCiAgICAgICAgJGNwWydkZWxpdmVyeUNpdHlDaG9pY2UnXSwKICAgICAgICAkY3BbJ2NpdHlfY2hvaWNlJ10KICAgICAgKTsKICAgIH0gZWxzZWlmIChhcnJheV9rZXlfZXhpc3RzKCd2aWxsZScsICRjcCkgfHwgYXJyYXlfa2V5X2V4aXN0cygnY29kZV9wb3N0YWwnLCAkY3ApKSB7CiAgICAgICRub3JtYWxpemVkID0gY2Fpc3NlTm9ybWFsaXplRGVsaXZlcnlDaXR5UGF5bG9hZCgkY3AsICRzdG9yZUlkLCAndmlsbGUnLCAnY29kZV9wb3N0YWwnKTsKICAgICAgaWYgKCFlbXB0eSgkbm9ybWFsaXplZFsnb2snXSkgJiYgaXNfYXJyYXkoJG5vcm1hbGl6ZWRbJ3BheWxvYWQnXSkpIHsKICAgICAgICAkY3AgPSAkbm9ybWFsaXplZFsncGF5bG9hZCddOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBBbGxvd2VkIGZpZWxkcyAoREIgY29sdW1ucykgKyBtZXJnZS1wYXRjaCBpbnRlcnByZXRhdGlvbgogIC8vIElNUE9SVEFOVDogdXNlIGFycmF5X2tleV9leGlzdHMoKSB0byBkaXN0aW5ndWlzaCAiYWJzZW50IiB2cyAicHJlc2VudCA9PiBudWxsIi4KICAkZmllbGREZWZzID0gWwogICAgWydrZXknID0+ICdub21fcHJlbm9tJywgICAgICAgICAgJ2NvbCcgPT4gJ25vbV9wcmVub20nLCAgICAgICAgICAnbWF4JyA9PiAxMjBdLAogICAgWydrZXknID0+ICdhZHJlc3NlJywgICAgICAgICAgICAgJ2NvbCcgPT4gJ2FkcmVzc2UnLCAgICAgICAgICAgICAnbWF4JyA9PiAyNTVdLAogICAgWydrZXknID0+ICdjb21wbGVtZW50X2FkcmVzc2UnLCAgJ2NvbCcgPT4gJ2NvbXBsZW1lbnRfYWRyZXNzZScsICAnbWF4JyA9PiAyNTVdLAogICAgWydrZXknID0+ICdjb2RlX3Bvc3RhbCcsICAgICAgICAgJ2NvbCcgPT4gJ2NvZGVfcG9zdGFsJywgICAgICAgICAnbWF4JyA9PiAyMF0sCiAgICBbJ2tleScgPT4gJ3ZpbGxlJywgICAgICAgICAgICAgICAnY29sJyA9PiAndmlsbGUnLCAgICAgICAgICAgICAgICdtYXgnID0+IDEyMF0sCiAgICBbJ2tleScgPT4gJ251bV9zdXBwMScsICAgICAgICAgICAnY29sJyA9PiAnbnVtX3N1cHAxJywgICAgICAgICAgICdtYXgnID0+IDMwXSwKICAgIFsna2V5JyA9PiAnbnVtX3N1cHAyJywgICAgICAgICAgICdjb2wnID0+ICdudW1fc3VwcDInLCAgICAgICAgICAgJ21heCcgPT4gMzBdLAogICAgWydrZXknID0+ICdwcm9ibGVtZScsICAgICAgICAgICAgJ2NvbCcgPT4gJ3Byb2JsZW1lJywgICAgICAgICAgICAnbWF4JyA9PiA1MDBdLAogIF07CgogIC8vIDEpIExvb2t1cCBleGlzdGluZyBjbGllbnQgKGRldGVybWluaXN0aWM6IHByZWZlciBwcmltYXJ5IHBob25lTnVtYmVyIG93bmVyLAogIC8vIHRoZW4gdW5pcXVlIHN1cHBsZW1lbnRhcnkgb3duZXI7IG5ldmVyIHJlbHkgb24gTElNSVQgMSBvdmVyIE9SIG1hdGNoZXMpLgogICRyb3cgPSByZXNvbHZlQ2xpZW50QnlQaG9uZU1hdGNoKCRwZG8sICRwaG9uZSk7CiAgaWYgKGlzX2FycmF5KCRyb3cpICYmIGlzc2V0KCRyb3dbJ2lkJ10pKSB7CiAgICAkaWQgPSAoaW50KSRyb3dbJ2lkJ107CiAgICBpZiAoJGlkIDw9IDApIHJldHVybiAwOwoKICAgIC8vIDIpIFVQREFURSB3aXRoIG1lcmdlLXBhdGNoIHJ1bGUgKGFic2VudD1ubyBjaGFuZ2UsIG51bGw9Y2xlYXIsIG5vbi1lbXB0eSBzdHJpbmc9c2V0KS4KICAgICRzZXRzID0gW107CiAgICAkYmluZCA9IFsnOmlkJyA9PiAkaWQsICc6cGhvbmUnID0+ICRwaG9uZV07CgogICAgLy8gQWx3YXlzIGtlZXAgcGhvbmVOdW1iZXIgbm9ybWFsaXplZCB0byB0aGUgY29tbWl0dGVkIHBob25lIChzYWZlKQogICAgJHNldHNbXSA9ICJwaG9uZU51bWJlciA9IDpwaG9uZSI7CgogICAgZm9yZWFjaCAoJGZpZWxkRGVmcyBhcyAkZmQpIHsKICAgICAgJGsgPSAoc3RyaW5nKSRmZFsna2V5J107CiAgICAgICRjb2wgPSAoc3RyaW5nKSRmZFsnY29sJ107CiAgICAgICRtYXggPSAoaW50KSRmZFsnbWF4J107CgogICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoJGssICRjcCkpIGNvbnRpbnVlOyAvLyBhYnNlbnQgPT4gbm8gY2hhbmdlCgogICAgICAkcmF3ViA9ICRjcFska107CiAgICAgIGlmICgkcmF3ViA9PT0gbnVsbCkgewogICAgICAgIC8vIHByZXNlbnQgbnVsbCA9PiBjbGVhcgogICAgICAgICRwaCA9ICc6JyAuICRrOwogICAgICAgICRzZXRzW10gPSAieyRjb2x9ID0geyRwaH0iOwogICAgICAgICRiaW5kWyRwaF0gPSBudWxsOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CgogICAgICAvLyBwcmVzZW50IG5vbi1udWxsID0+IHNldCBvbmx5IGlmIG5vbi1lbXB0eSBhZnRlciBjbGVhbmluZyAoYmFja3dhcmQgY29tcGF0KQogICAgICAkY2xlYW4gPSBjbGVhblN0cigkcmF3ViwgJG1heCk7CiAgICAgIGlmICgkY2xlYW4gPT09ICcnKSBjb250aW51ZTsKICAgICAgJHBoID0gJzonIC4gJGs7CiAgICAgICRzZXRzW10gPSAieyRjb2x9ID0geyRwaH0iOwogICAgICAkYmluZFskcGhdID0gJGNsZWFuOwogICAgfQoKICAgICRzcWxVID0gIlVQREFURSBzdGRfY2xpZW50cyBTRVQgIiAuIGltcGxvZGUoIiwgIiwgJHNldHMpIC4gIiBXSEVSRSBpZCA9IDppZCI7CiAgICBleGVjdXRlQ2xpZW50VXBkYXRlV2l0aE51bGxGYWxsYmFjaygkcGRvLCAkc3FsVSwgJGJpbmQpOwogICAgcmV0dXJuICRpZDsKICB9CgogIC8vIDMpIElOU0VSVCBuZXcgY2xpZW50CiAgJHNxbEkgPSAiSU5TRVJUIElOVE8gc3RkX2NsaWVudHMgKAogICAgcGhvbmVOdW1iZXIsCiAgICBub21fcHJlbm9tLAogICAgYWRyZXNzZSwKICAgIGNvbXBsZW1lbnRfYWRyZXNzZSwKICAgIGNvZGVfcG9zdGFsLAogICAgdmlsbGUsCiAgICBudW1fc3VwcDEsCiAgICBudW1fc3VwcDIsCiAgICBwcm9ibGVtZSwKICAgIHN0b3Bfc21zLAogICAgb3JkZXJfb25saW5lLAogICAgcG9pbnRzX2ZpZCwKICAgIGRlbGl2ZXJ5X25lYXJfY29uZmlybWVkCiAgKSBWQUxVRVMgKAogICAgOnBob25lTnVtYmVyLAogICAgOm5vbV9wcmVub20sCiAgICA6YWRyZXNzZSwKICAgIDpjb21wbGVtZW50X2FkcmVzc2UsCiAgICA6Y29kZV9wb3N0YWwsCiAgICA6dmlsbGUsCiAgICA6bnVtX3N1cHAxLAogICAgOm51bV9zdXBwMiwKICAgIDpwcm9ibGVtZSwKICAgIDAsCiAgICAwLAogICAgMCwKICAgIDAKICApIjsKICAkc3RtdEkgPSAkcGRvLT5wcmVwYXJlKCRzcWxJKTsKICAvLyBGb3IgSU5TRVJUOiBrZWVwIGV4aXN0aW5nIGJlaGF2aW9yIChlbXB0eSBzdHJpbmdzIGFsbG93ZWQpLCBidXQgYWNjZXB0IGV4cGxpY2l0IG51bGwgdG9vLgogICRub21QcmVub20gPSBhcnJheV9rZXlfZXhpc3RzKCdub21fcHJlbm9tJywgJGNwKSAmJiAkY3BbJ25vbV9wcmVub20nXSA9PT0gbnVsbCA/IG51bGwgOiBjbGVhblN0cigkY3BbJ25vbV9wcmVub20nXSA/PyAnJywgMTIwKTsKICAkYWRyZXNzZSAgID0gYXJyYXlfa2V5X2V4aXN0cygnYWRyZXNzZScsICRjcCkgJiYgJGNwWydhZHJlc3NlJ10gPT09IG51bGwgPyBudWxsIDogY2xlYW5TdHIoJGNwWydhZHJlc3NlJ10gPz8gJycsIDI1NSk7CiAgJGNvbXAgICAgICA9IGFycmF5X2tleV9leGlzdHMoJ2NvbXBsZW1lbnRfYWRyZXNzZScsICRjcCkgJiYgJGNwWydjb21wbGVtZW50X2FkcmVzc2UnXSA9PT0gbnVsbCA/IG51bGwgOiBjbGVhblN0cigkY3BbJ2NvbXBsZW1lbnRfYWRyZXNzZSddID8/ICcnLCAyNTUpOwogICRjb2RlUG9zdGFsPSBhcnJheV9rZXlfZXhpc3RzKCdjb2RlX3Bvc3RhbCcsICRjcCkgJiYgJGNwWydjb2RlX3Bvc3RhbCddID09PSBudWxsID8gbnVsbCA6IGNsZWFuU3RyKCRjcFsnY29kZV9wb3N0YWwnXSA/PyAnJywgMjApOwogICR2aWxsZSAgICAgPSBhcnJheV9rZXlfZXhpc3RzKCd2aWxsZScsICRjcCkgJiYgJGNwWyd2aWxsZSddID09PSBudWxsID8gbnVsbCA6IGNsZWFuU3RyKCRjcFsndmlsbGUnXSA/PyAnJywgMTIwKTsKICAkbnVtMSAgICAgID0gYXJyYXlfa2V5X2V4aXN0cygnbnVtX3N1cHAxJywgJGNwKSAmJiAkY3BbJ251bV9zdXBwMSddID09PSBudWxsID8gbnVsbCA6IGNsZWFuU3RyKCRjcFsnbnVtX3N1cHAxJ10gPz8gJycsIDMwKTsKICAkbnVtMiAgICAgID0gYXJyYXlfa2V5X2V4aXN0cygnbnVtX3N1cHAyJywgJGNwKSAmJiAkY3BbJ251bV9zdXBwMiddID09PSBudWxsID8gbnVsbCA6IGNsZWFuU3RyKCRjcFsnbnVtX3N1cHAyJ10gPz8gJycsIDMwKTsKICAkcHJvYmxlbWUgID0gYXJyYXlfa2V5X2V4aXN0cygncHJvYmxlbWUnLCAkY3ApICYmICRjcFsncHJvYmxlbWUnXSA9PT0gbnVsbCA/IG51bGwgOiBjbGVhblN0cigkY3BbJ3Byb2JsZW1lJ10gPz8gJycsIDUwMCk7CgogICRzdG10SS0+YmluZFZhbHVlKCc6cGhvbmVOdW1iZXInLCAkcGhvbmUsIFBETzo6UEFSQU1fU1RSKTsKICBiaW5kVmFsdWVOdWxsYWJsZSgkc3RtdEksICc6bm9tX3ByZW5vbScsICRub21QcmVub20pOwogIGJpbmRWYWx1ZU51bGxhYmxlKCRzdG10SSwgJzphZHJlc3NlJywgJGFkcmVzc2UpOwogIGJpbmRWYWx1ZU51bGxhYmxlKCRzdG10SSwgJzpjb21wbGVtZW50X2FkcmVzc2UnLCAkY29tcCk7CiAgYmluZFZhbHVlTnVsbGFibGUoJHN0bXRJLCAnOmNvZGVfcG9zdGFsJywgJGNvZGVQb3N0YWwpOwogIGJpbmRWYWx1ZU51bGxhYmxlKCRzdG10SSwgJzp2aWxsZScsICR2aWxsZSk7CiAgYmluZFZhbHVlTnVsbGFibGUoJHN0bXRJLCAnOm51bV9zdXBwMScsICRudW0xKTsKICBiaW5kVmFsdWVOdWxsYWJsZSgkc3RtdEksICc6bnVtX3N1cHAyJywgJG51bTIpOwogIGJpbmRWYWx1ZU51bGxhYmxlKCRzdG10SSwgJzpwcm9ibGVtZScsICRwcm9ibGVtZSk7CiAgJHN0bXRJLT5leGVjdXRlKCk7CgogICRuZXdJZCA9IChpbnQpJHBkby0+bGFzdEluc2VydElkKCk7CiAgcmV0dXJuICgkbmV3SWQgPiAwKSA/ICRuZXdJZCA6IDA7Cn0="
            },
            "after": {
                "exists": true,
                "kind": "file",
                "size": 9908,
                "sha1": "bb98178db0efc1210975b2f1112b91d7d91d3656",
                "content_b64": "PD9waHAKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgovKiBkb2MtcHJvamVjdCB8IGNhaXNzZS1hcXAvcHVibGljL2FwaS9fbGliL2NsaWVudFVwc2VydC5waHAgfCBGb3Vybml0IGxlcyBoZWxwZXJzIGRlIG5vcm1hbGlzYXRpb24sIHZhbGlkYXRpb24gZXQgdXBzZXJ0IGZ1c2lvbm7DqSBkZXMgY2xpZW50cyBwb3VyIENSRUFURS9VUERBVEUsIGF2ZWMgY2Fub25pY2FsaXNhdGlvbiBkdSBjb3VwbGUgdmlsbGUgLyBjb2RlIHBvc3RhbCBxdWFuZCB1bmUgb3B0aW9uIHZhbGlkZSBkdSBQRFYgZXN0IHLDqWVsbGVtZW50IHPDqWxlY3Rpb25uw6llLCBjb25zZXJ2YXRpb24gZXhwbGljaXRlIGRlcyB2YWxldXJzIGTDqWrDoCBwcsOpc2VudGVzIGVuIGJhc2UgcXVhbmQgbGUgc8OpbGVjdGV1ciBjb21wb3NpdGUgZXN0IHZpZGUgb3UgaG9ycyBjb3JyZXNwb25kYW5jZSBwb3VyIGxlIFBEViBjb3VyYW50LCBldCBwZXJzaXN0YW5jZSBub24gYmxvcXVhbnRlIGRlcyBhZHJlc3NlcyBoaXN0b3JpcXVlcyBvdSBzYWlzaWVzIGxpYnJlbWVudC4gfCBFeHBvc2U6IG5vcm1hbGl6ZVBob25lRm9yRGIsIGNsZWFuU3RyLCBiaW5kVmFsdWVOdWxsYWJsZSwgZXhlY3V0ZUNsaWVudFVwZGF0ZVdpdGhOdWxsRmFsbGJhY2ssIHVwc2VydENsaWVudEZyb21QYXlsb2FkIHwgRMOpcGVuZCBkZTogY2xpZW50UGhvbmVSZXNvbHZlci5waHAsIGRlbGl2ZXJ5Q2l0eUNob2ljZXMucGhwLCBQRE8sIFBET1N0YXRlbWVudCwgUERPRXhjZXB0aW9uIHwgSW1wYWN0ZTogcGVyc2lzdGFuY2UgU1FMIHN0ZF9jbGllbnRzLCBtaXNlIMOgIGpvdXIvaW5zZXJ0IGRlcyBkb25uw6llcyBjbGllbnQgfCBUYWJsZXM6IHN0ZF9jbGllbnRzKHBob25lTnVtYmVyLCBub21fcHJlbm9tLCBhZHJlc3NlLCBjb21wbGVtZW50X2FkcmVzc2UsIGNvZGVfcG9zdGFsLCB2aWxsZSwgbnVtX3N1cHAxLCBudW1fc3VwcDIsIHByb2JsZW1lLCBzdG9wX3Ntcywgb3JkZXJfb25saW5lLCBwb2ludHNfZmlkLCBkZWxpdmVyeV9uZWFyX2NvbmZpcm1lZCkgKi8KQHJlcXVpcmVfb25jZSBfX0RJUl9fIC4gJy9jbGllbnRQaG9uZVJlc29sdmVyLnBocCc7CkByZXF1aXJlX29uY2UgX19ESVJfXyAuICcvZGVsaXZlcnlDaXR5Q2hvaWNlcy5waHAnOwovKioKICogU2hhcmVkIGNsaWVudCB1cHNlcnQgaGVscGVycy4KICogR29hbDoga2VlcCBjbGllbnQgcGVyc2lzdGVuY2UgcnVsZXMgaWRlbnRpY2FsIGFjcm9zcyBDUkVBVEUgYW5kIFVQREFURS4KICoKICogUnVsZXM6CiAqIC0gcGhvbmUgaXMgbm9ybWFsaXplZCAoc2FtZSBhcyBjbGllbnRMb29rdXAucGhwKSBhbmQgaXMgdGhlIHByaW1hcnkgbWF0Y2hpbmcga2V5OgogKiAgIHN0ZF9jbGllbnRzLnBob25lTnVtYmVyIE9SIG51bV9zdXBwMS8yCiAqIC0gbWVyZ2UgKG1lcmdlLXBhdGNoIHNlbWFudGljcyk6CiAqICAgLSBrZXkgQUJTRU5UIGluIHBheWxvYWQgPT4gZG8gbm90IG1vZGlmeSBjb2x1bW4KICogICAtIGtleSBQUkVTRU5UIHdpdGggbnVsbCA9PiBjbGVhciBjb2x1bW4gKHNldCBOVUxMOyBpZiBEQiByZWplY3RzIE5VTEwsIGZhbGxiYWNrIHRvICcnKQogKiAgIC0ga2V5IFBSRVNFTlQgd2l0aCBub24tZW1wdHkgc3RyaW5nID0+IHVwZGF0ZSBjb2x1bW4KICogICAtIGtleSBQUkVTRU5UIHdpdGggZW1wdHkgc3RyaW5nID0+IGlnbm9yZSAoYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBjbGllbnRzKQogKi8KCmZ1bmN0aW9uIG5vcm1hbGl6ZVBob25lRm9yRGIoc3RyaW5nICRpbnB1dCk6IHN0cmluZyB7CiAgJHJhdyA9IHRyaW0oJGlucHV0KTsKICBpZiAoJHJhdyA9PT0gJycpIHJldHVybiAnJzsKCiAgJHMgPSBwcmVnX3JlcGxhY2UoJy9ccysvJywgJycsICRyYXcpOwogIGlmICgkcyA9PT0gbnVsbCkgJHMgPSAkcmF3OwoKICAvLyBIYW5kbGUgKyAvIDAwIHByZWZpeGVzCiAgaWYgKHN0cmxlbigkcykgPiAwICYmICRzWzBdID09PSAnKycpIHsKICAgICRzID0gc3Vic3RyKCRzLCAxKTsKICB9CiAgaWYgKHN0cnBvcygkcywgJzAwJykgPT09IDApIHsKICAgICRzID0gc3Vic3RyKCRzLCAyKTsKICB9CgogIC8vIERpZ2l0cyBvbmx5CiAgJGRpZ2l0cyA9IHByZWdfcmVwbGFjZSgnL1xEKy8nLCAnJywgJHMpOwogIGlmICgkZGlnaXRzID09PSBudWxsKSAkZGlnaXRzID0gJyc7CiAgJGRpZ2l0cyA9IHRyaW0oJGRpZ2l0cyk7CiAgaWYgKCRkaWdpdHMgPT09ICcnKSByZXR1cm4gJyc7CgogIC8vIEZyYW5jZSBsb2NhbDogMTAgZGlnaXRzIHN0YXJ0aW5nIHdpdGggMCA9PiAzMyArIGxhc3QgOQogIGlmIChwcmVnX21hdGNoKCcvXjBcZHs5fSQvJywgJGRpZ2l0cykgPT09IDEpIHsKICAgIHJldHVybiAnMzMnIC4gc3Vic3RyKCRkaWdpdHMsIDEpOwogIH0KICAvLyBGcmFuY2UgYWxyZWFkeSBub3JtYWxpemVkOiAzMyArIDkgZGlnaXRzCiAgaWYgKHByZWdfbWF0Y2goJy9eMzNcZHs5fSQvJywgJGRpZ2l0cykgPT09IDEpIHsKICAgIHJldHVybiAkZGlnaXRzOwogIH0KICAvLyBJbnRlcm5hdGlvbmFsOiBrZWVwIGRpZ2l0cwogIHJldHVybiAkZGlnaXRzOwp9CgpmdW5jdGlvbiBjbGVhblN0cigkdiwgaW50ICRtYXhMZW4gPSAwKTogc3RyaW5nIHsKICAkcyA9IHRyaW0oKHN0cmluZykoJHYgPz8gJycpKTsKICBpZiAoJHMgPT09ICcnKSByZXR1cm4gJyc7CiAgaWYgKCRtYXhMZW4gPiAwICYmIG1iX3N0cmxlbigkcywgJ1VURi04JykgPiAkbWF4TGVuKSB7CiAgICAkcyA9IG1iX3N1YnN0cigkcywgMCwgJG1heExlbiwgJ1VURi04Jyk7CiAgfQogIHJldHVybiAkczsKfQoKLyoqCiAqIEJpbmQgaGVscGVyIHRoYXQgc3VwcG9ydHMgTlVMTCBleHBsaWNpdGx5LgogKi8KZnVuY3Rpb24gYmluZFZhbHVlTnVsbGFibGUoUERPU3RhdGVtZW50ICRzdG10LCBzdHJpbmcgJGtleSwgJHZhbHVlKTogdm9pZCB7CiAgaWYgKCR2YWx1ZSA9PT0gbnVsbCkgewogICAgJHN0bXQtPmJpbmRWYWx1ZSgka2V5LCBudWxsLCBQRE86OlBBUkFNX05VTEwpOwogICAgcmV0dXJuOwogIH0KICAkc3RtdC0+YmluZFZhbHVlKCRrZXksICR2YWx1ZSwgaXNfaW50KCR2YWx1ZSkgPyBQRE86OlBBUkFNX0lOVCA6IFBETzo6UEFSQU1fU1RSKTsKfQoKLyoqCiAqIEV4ZWN1dGUgYW4gVVBEQVRFIHRoYXQgbWF5IGluY2x1ZGUgTlVMTCBiaW5kcy4KICogSWYgREIgcmVqZWN0cyBOVUxMIGZvciBzb21lIGNvbHVtbnMgKE5PVCBOVUxMKSwgcmV0cnkgYnkgY29udmVydGluZyBOVUxMIC0+ICcnIGZvciB0aG9zZSBmaWVsZHMuCiAqLwpmdW5jdGlvbiBleGVjdXRlQ2xpZW50VXBkYXRlV2l0aE51bGxGYWxsYmFjayhQRE8gJHBkbywgc3RyaW5nICRzcWxVLCBhcnJheSAkYmluZCk6IHZvaWQgewogICRzdG10VSA9ICRwZG8tPnByZXBhcmUoJHNxbFUpOwogIGZvcmVhY2ggKCRiaW5kIGFzICRrID0+ICR2KSBiaW5kVmFsdWVOdWxsYWJsZSgkc3RtdFUsICRrLCAkdik7CiAgdHJ5IHsKICAgICRzdG10VS0+ZXhlY3V0ZSgpOwogICAgcmV0dXJuOwogIH0gY2F0Y2ggKFBET0V4Y2VwdGlvbiAkZSkgewogICAgJGNvZGUgPSAoc3RyaW5nKSRlLT5nZXRDb2RlKCk7CiAgICAkbXNnID0gc3RydG9sb3dlcigoc3RyaW5nKSRlLT5nZXRNZXNzYWdlKCkpOwogICAgJGxvb2tzTGlrZU51bGxWaW9sYXRpb24gPSAoJGNvZGUgPT09ICcyMzAwMCcgfHwgc3RyX2NvbnRhaW5zKCRtc2csICdjYW5ub3QgYmUgbnVsbCcpIHx8IHN0cl9jb250YWlucygkbXNnLCAnbm90IG51bGwnKSk7CiAgICBpZiAoISRsb29rc0xpa2VOdWxsVmlvbGF0aW9uKSB0aHJvdyAkZTsKCiAgICAvLyBSZXRyeSB3aXRoIE5VTEwgLT4gJycgKGJlc3QtZWZmb3J0IGZvciBOT1QgTlVMTCBjb2x1bW5zKS4KICAgICRiaW5kMiA9ICRiaW5kOwogICAgZm9yZWFjaCAoJGJpbmQyIGFzICRrID0+ICR2KSB7CiAgICAgIGlmICgkdiA9PT0gbnVsbCAmJiAkayAhPT0gJzppZCcgJiYgJGsgIT09ICc6cGhvbmUnKSAkYmluZDJbJGtdID0gJyc7CiAgICB9CiAgICAkc3RtdDIgPSAkcGRvLT5wcmVwYXJlKCRzcWxVKTsKICAgIGZvcmVhY2ggKCRiaW5kMiBhcyAkayA9PiAkdikgYmluZFZhbHVlTnVsbGFibGUoJHN0bXQyLCAkaywgJHYpOwogICAgJHN0bXQyLT5leGVjdXRlKCk7CiAgfQp9CgpmdW5jdGlvbiBzaG91bGRQcmVzZXJ2ZUV4aXN0aW5nRGVsaXZlcnlDaXR5KGFycmF5ICRwYXlsb2FkKTogYm9vbCB7CiAgJHJhdyA9ICRwYXlsb2FkWydkZWxpdmVyeUNpdHlDaG9pY2VQcmVzZXJ2ZUV4aXN0aW5nJ10gPz8gZmFsc2U7CiAgaWYgKCRyYXcgPT09IHRydWUgfHwgJHJhdyA9PT0gMSB8fCAkcmF3ID09PSAnMScpIHJldHVybiB0cnVlOwogICRzID0gc3RydG9sb3dlcih0cmltKChzdHJpbmcpJHJhdykpOwogIHJldHVybiBpbl9hcnJheSgkcywgWyd0cnVlJywgJ29uJywgJ3llcyddLCB0cnVlKTsKfQoKZnVuY3Rpb24gdXBzZXJ0Q2xpZW50RnJvbVBheWxvYWQoUERPICRwZG8sIHN0cmluZyAkcGhvbmVSYXcsICRjbGllbnRQYXlsb2FkLCBzdHJpbmcgJHN0b3JlSWQgPSAnJyk6IGludCB7CiAgJHBob25lID0gbm9ybWFsaXplUGhvbmVGb3JEYigkcGhvbmVSYXcpOwogIGlmICgkcGhvbmUgPT09ICcnKSByZXR1cm4gMDsKCiAgLy8gQmFzaWMgdmFsaWRhdGlvbiAoRS4xNjQgbWF4IDE1IGRpZ2l0czsgYWNjZXB0IGRvd24gdG8gNiB0byBhdm9pZCBub2lzeSBqdW5rKQogIGlmIChwcmVnX21hdGNoKCcvXlxkKyQvJywgJHBob25lKSAhPT0gMSkgcmV0dXJuIDA7CiAgJGxlbiA9IHN0cmxlbigkcGhvbmUpOwogIGlmICgkbGVuIDwgNiB8fCAkbGVuID4gMTUpIHJldHVybiAwOwoKICAkY3AgPSAoaXNfYXJyYXkoJGNsaWVudFBheWxvYWQpID8gJGNsaWVudFBheWxvYWQgOiBbXSk7CiAgJHByZXNlcnZlRGVsaXZlcnlDaXR5ID0gc2hvdWxkUHJlc2VydmVFeGlzdGluZ0RlbGl2ZXJ5Q2l0eSgkY3ApOwogIHVuc2V0KCRjcFsnZGVsaXZlcnlDaXR5Q2hvaWNlUHJlc2VydmVFeGlzdGluZyddKTsKICBpZiAoJHN0b3JlSWQgIT09ICcnKSB7CiAgICBpZiAoJHByZXNlcnZlRGVsaXZlcnlDaXR5KSB7CiAgICAgIHVuc2V0KAogICAgICAgICRjcFsndmlsbGUnXSwKICAgICAgICAkY3BbJ2NvZGVfcG9zdGFsJ10sCiAgICAgICAgJGNwWydjb2RlUG9zdGFsJ10sCiAgICAgICAgJGNwWydjaXR5J10sCiAgICAgICAgJGNwWydkZWxpdmVyeUNpdHlDaG9pY2UnXSwKICAgICAgICAkY3BbJ2NpdHlfY2hvaWNlJ10KICAgICAgKTsKICAgIH0gZWxzZWlmIChhcnJheV9rZXlfZXhpc3RzKCd2aWxsZScsICRjcCkgfHwgYXJyYXlfa2V5X2V4aXN0cygnY29kZV9wb3N0YWwnLCAkY3ApKSB7CiAgICAgICRub3JtYWxpemVkID0gY2Fpc3NlTm9ybWFsaXplRGVsaXZlcnlDaXR5UGF5bG9hZCgkY3AsICRzdG9yZUlkLCAndmlsbGUnLCAnY29kZV9wb3N0YWwnKTsKICAgICAgaWYgKGlzX2FycmF5KCRub3JtYWxpemVkWydwYXlsb2FkJ10gPz8gbnVsbCkpIHsKICAgICAgICAkY3AgPSAkbm9ybWFsaXplZFsncGF5bG9hZCddOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBBbGxvd2VkIGZpZWxkcyAoREIgY29sdW1ucykgKyBtZXJnZS1wYXRjaCBpbnRlcnByZXRhdGlvbgogIC8vIElNUE9SVEFOVDogdXNlIGFycmF5X2tleV9leGlzdHMoKSB0byBkaXN0aW5ndWlzaCAiYWJzZW50IiB2cyAicHJlc2VudCA9PiBudWxsIi4KICAkZmllbGREZWZzID0gWwogICAgWydrZXknID0+ICdub21fcHJlbm9tJywgICAgICAgICAgJ2NvbCcgPT4gJ25vbV9wcmVub20nLCAgICAgICAgICAnbWF4JyA9PiAxMjBdLAogICAgWydrZXknID0+ICdhZHJlc3NlJywgICAgICAgICAgICAgJ2NvbCcgPT4gJ2FkcmVzc2UnLCAgICAgICAgICAgICAnbWF4JyA9PiAyNTVdLAogICAgWydrZXknID0+ICdjb21wbGVtZW50X2FkcmVzc2UnLCAgJ2NvbCcgPT4gJ2NvbXBsZW1lbnRfYWRyZXNzZScsICAnbWF4JyA9PiAyNTVdLAogICAgWydrZXknID0+ICdjb2RlX3Bvc3RhbCcsICAgICAgICAgJ2NvbCcgPT4gJ2NvZGVfcG9zdGFsJywgICAgICAgICAnbWF4JyA9PiAyMF0sCiAgICBbJ2tleScgPT4gJ3ZpbGxlJywgICAgICAgICAgICAgICAnY29sJyA9PiAndmlsbGUnLCAgICAgICAgICAgICAgICdtYXgnID0+IDEyMF0sCiAgICBbJ2tleScgPT4gJ251bV9zdXBwMScsICAgICAgICAgICAnY29sJyA9PiAnbnVtX3N1cHAxJywgICAgICAgICAgICdtYXgnID0+IDMwXSwKICAgIFsna2V5JyA9PiAnbnVtX3N1cHAyJywgICAgICAgICAgICdjb2wnID0+ICdudW1fc3VwcDInLCAgICAgICAgICAgJ21heCcgPT4gMzBdLAogICAgWydrZXknID0+ICdwcm9ibGVtZScsICAgICAgICAgICAgJ2NvbCcgPT4gJ3Byb2JsZW1lJywgICAgICAgICAgICAnbWF4JyA9PiA1MDBdLAogIF07CgogIC8vIDEpIExvb2t1cCBleGlzdGluZyBjbGllbnQgKGRldGVybWluaXN0aWM6IHByZWZlciBwcmltYXJ5IHBob25lTnVtYmVyIG93bmVyLAogIC8vIHRoZW4gdW5pcXVlIHN1cHBsZW1lbnRhcnkgb3duZXI7IG5ldmVyIHJlbHkgb24gTElNSVQgMSBvdmVyIE9SIG1hdGNoZXMpLgogICRyb3cgPSByZXNvbHZlQ2xpZW50QnlQaG9uZU1hdGNoKCRwZG8sICRwaG9uZSk7CiAgaWYgKGlzX2FycmF5KCRyb3cpICYmIGlzc2V0KCRyb3dbJ2lkJ10pKSB7CiAgICAkaWQgPSAoaW50KSRyb3dbJ2lkJ107CiAgICBpZiAoJGlkIDw9IDApIHJldHVybiAwOwoKICAgIC8vIDIpIFVQREFURSB3aXRoIG1lcmdlLXBhdGNoIHJ1bGUgKGFic2VudD1ubyBjaGFuZ2UsIG51bGw9Y2xlYXIsIG5vbi1lbXB0eSBzdHJpbmc9c2V0KS4KICAgICRzZXRzID0gW107CiAgICAkYmluZCA9IFsnOmlkJyA9PiAkaWQsICc6cGhvbmUnID0+ICRwaG9uZV07CgogICAgLy8gQWx3YXlzIGtlZXAgcGhvbmVOdW1iZXIgbm9ybWFsaXplZCB0byB0aGUgY29tbWl0dGVkIHBob25lIChzYWZlKQogICAgJHNldHNbXSA9ICJwaG9uZU51bWJlciA9IDpwaG9uZSI7CgogICAgZm9yZWFjaCAoJGZpZWxkRGVmcyBhcyAkZmQpIHsKICAgICAgJGsgPSAoc3RyaW5nKSRmZFsna2V5J107CiAgICAgICRjb2wgPSAoc3RyaW5nKSRmZFsnY29sJ107CiAgICAgICRtYXggPSAoaW50KSRmZFsnbWF4J107CgogICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoJGssICRjcCkpIGNvbnRpbnVlOyAvLyBhYnNlbnQgPT4gbm8gY2hhbmdlCgogICAgICAkcmF3ViA9ICRjcFska107CiAgICAgIGlmICgkcmF3ViA9PT0gbnVsbCkgewogICAgICAgIC8vIHByZXNlbnQgbnVsbCA9PiBjbGVhcgogICAgICAgICRwaCA9ICc6JyAuICRrOwogICAgICAgICRzZXRzW10gPSAieyRjb2x9ID0geyRwaH0iOwogICAgICAgICRiaW5kWyRwaF0gPSBudWxsOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CgogICAgICAvLyBwcmVzZW50IG5vbi1udWxsID0+IHNldCBvbmx5IGlmIG5vbi1lbXB0eSBhZnRlciBjbGVhbmluZyAoYmFja3dhcmQgY29tcGF0KQogICAgICAkY2xlYW4gPSBjbGVhblN0cigkcmF3ViwgJG1heCk7CiAgICAgIGlmICgkY2xlYW4gPT09ICcnKSBjb250aW51ZTsKICAgICAgJHBoID0gJzonIC4gJGs7CiAgICAgICRzZXRzW10gPSAieyRjb2x9ID0geyRwaH0iOwogICAgICAkYmluZFskcGhdID0gJGNsZWFuOwogICAgfQoKICAgICRzcWxVID0gIlVQREFURSBzdGRfY2xpZW50cyBTRVQgIiAuIGltcGxvZGUoIiwgIiwgJHNldHMpIC4gIiBXSEVSRSBpZCA9IDppZCI7CiAgICBleGVjdXRlQ2xpZW50VXBkYXRlV2l0aE51bGxGYWxsYmFjaygkcGRvLCAkc3FsVSwgJGJpbmQpOwogICAgcmV0dXJuICRpZDsKICB9CgogIC8vIDMpIElOU0VSVCBuZXcgY2xpZW50CiAgJHNxbEkgPSAiSU5TRVJUIElOVE8gc3RkX2NsaWVudHMgKAogICAgcGhvbmVOdW1iZXIsCiAgICBub21fcHJlbm9tLAogICAgYWRyZXNzZSwKICAgIGNvbXBsZW1lbnRfYWRyZXNzZSwKICAgIGNvZGVfcG9zdGFsLAogICAgdmlsbGUsCiAgICBudW1fc3VwcDEsCiAgICBudW1fc3VwcDIsCiAgICBwcm9ibGVtZSwKICAgIHN0b3Bfc21zLAogICAgb3JkZXJfb25saW5lLAogICAgcG9pbnRzX2ZpZCwKICAgIGRlbGl2ZXJ5X25lYXJfY29uZmlybWVkCiAgKSBWQUxVRVMgKAogICAgOnBob25lTnVtYmVyLAogICAgOm5vbV9wcmVub20sCiAgICA6YWRyZXNzZSwKICAgIDpjb21wbGVtZW50X2FkcmVzc2UsCiAgICA6Y29kZV9wb3N0YWwsCiAgICA6dmlsbGUsCiAgICA6bnVtX3N1cHAxLAogICAgOm51bV9zdXBwMiwKICAgIDpwcm9ibGVtZSwKICAgIDAsCiAgICAwLAogICAgMCwKICAgIDAKICApIjsKICAkc3RtdEkgPSAkcGRvLT5wcmVwYXJlKCRzcWxJKTsKICAvLyBGb3IgSU5TRVJUOiBrZWVwIGV4aXN0aW5nIGJlaGF2aW9yIChlbXB0eSBzdHJpbmdzIGFsbG93ZWQpLCBidXQgYWNjZXB0IGV4cGxpY2l0IG51bGwgdG9vLgogICRub21QcmVub20gPSBhcnJheV9rZXlfZXhpc3RzKCdub21fcHJlbm9tJywgJGNwKSAmJiAkY3BbJ25vbV9wcmVub20nXSA9PT0gbnVsbCA/IG51bGwgOiBjbGVhblN0cigkY3BbJ25vbV9wcmVub20nXSA/PyAnJywgMTIwKTsKICAkYWRyZXNzZSAgID0gYXJyYXlfa2V5X2V4aXN0cygnYWRyZXNzZScsICRjcCkgJiYgJGNwWydhZHJlc3NlJ10gPT09IG51bGwgPyBudWxsIDogY2xlYW5TdHIoJGNwWydhZHJlc3NlJ10gPz8gJycsIDI1NSk7CiAgJGNvbXAgICAgICA9IGFycmF5X2tleV9leGlzdHMoJ2NvbXBsZW1lbnRfYWRyZXNzZScsICRjcCkgJiYgJGNwWydjb21wbGVtZW50X2FkcmVzc2UnXSA9PT0gbnVsbCA/IG51bGwgOiBjbGVhblN0cigkY3BbJ2NvbXBsZW1lbnRfYWRyZXNzZSddID8/ICcnLCAyNTUpOwogICRjb2RlUG9zdGFsPSBhcnJheV9rZXlfZXhpc3RzKCdjb2RlX3Bvc3RhbCcsICRjcCkgJiYgJGNwWydjb2RlX3Bvc3RhbCddID09PSBudWxsID8gbnVsbCA6IGNsZWFuU3RyKCRjcFsnY29kZV9wb3N0YWwnXSA/PyAnJywgMjApOwogICR2aWxsZSAgICAgPSBhcnJheV9rZXlfZXhpc3RzKCd2aWxsZScsICRjcCkgJiYgJGNwWyd2aWxsZSddID09PSBudWxsID8gbnVsbCA6IGNsZWFuU3RyKCRjcFsndmlsbGUnXSA/PyAnJywgMTIwKTsKICAkbnVtMSAgICAgID0gYXJyYXlfa2V5X2V4aXN0cygnbnVtX3N1cHAxJywgJGNwKSAmJiAkY3BbJ251bV9zdXBwMSddID09PSBudWxsID8gbnVsbCA6IGNsZWFuU3RyKCRjcFsnbnVtX3N1cHAxJ10gPz8gJycsIDMwKTsKICAkbnVtMiAgICAgID0gYXJyYXlfa2V5X2V4aXN0cygnbnVtX3N1cHAyJywgJGNwKSAmJiAkY3BbJ251bV9zdXBwMiddID09PSBudWxsID8gbnVsbCA6IGNsZWFuU3RyKCRjcFsnbnVtX3N1cHAyJ10gPz8gJycsIDMwKTsKICAkcHJvYmxlbWUgID0gYXJyYXlfa2V5X2V4aXN0cygncHJvYmxlbWUnLCAkY3ApICYmICRjcFsncHJvYmxlbWUnXSA9PT0gbnVsbCA/IG51bGwgOiBjbGVhblN0cigkY3BbJ3Byb2JsZW1lJ10gPz8gJycsIDUwMCk7CgogICRzdG10SS0+YmluZFZhbHVlKCc6cGhvbmVOdW1iZXInLCAkcGhvbmUsIFBETzo6UEFSQU1fU1RSKTsKICBiaW5kVmFsdWVOdWxsYWJsZSgkc3RtdEksICc6bm9tX3ByZW5vbScsICRub21QcmVub20pOwogIGJpbmRWYWx1ZU51bGxhYmxlKCRzdG10SSwgJzphZHJlc3NlJywgJGFkcmVzc2UpOwogIGJpbmRWYWx1ZU51bGxhYmxlKCRzdG10SSwgJzpjb21wbGVtZW50X2FkcmVzc2UnLCAkY29tcCk7CiAgYmluZFZhbHVlTnVsbGFibGUoJHN0bXRJLCAnOmNvZGVfcG9zdGFsJywgJGNvZGVQb3N0YWwpOwogIGJpbmRWYWx1ZU51bGxhYmxlKCRzdG10SSwgJzp2aWxsZScsICR2aWxsZSk7CiAgYmluZFZhbHVlTnVsbGFibGUoJHN0bXRJLCAnOm51bV9zdXBwMScsICRudW0xKTsKICBiaW5kVmFsdWVOdWxsYWJsZSgkc3RtdEksICc6bnVtX3N1cHAyJywgJG51bTIpOwogIGJpbmRWYWx1ZU51bGxhYmxlKCRzdG10SSwgJzpwcm9ibGVtZScsICRwcm9ibGVtZSk7CiAgJHN0bXRJLT5leGVjdXRlKCk7CgogICRuZXdJZCA9IChpbnQpJHBkby0+bGFzdEluc2VydElkKCk7CiAgcmV0dXJuICgkbmV3SWQgPiAwKSA/ICRuZXdJZCA6IDA7Cn0="
            }
        },
        {
            "path": "caisse-aqp/public/api/_lib/deliveryCityChoices.php",
            "kind": "file",
            "before": {
                "exists": true,
                "kind": "file",
                "size": 1785,
                "sha1": "f6558fcb4106bfadc98735ae11a31572177eeb90",
                "content_b64": "PD9waHAKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgovKiBkb2MtcHJvamVjdCB8IGNhaXNzZS1hcXAvcHVibGljL2FwaS9fbGliL2RlbGl2ZXJ5Q2l0eUNob2ljZXMucGhwIHwgUsOpdXRpbGlzZSBsYSBzb3VyY2UgZGUgdsOpcml0w6kgd2ViIFYxIGRlcyBjb21tdW5lcyBhdXRvcmlzw6llcyBwYXIgUERWIHBvdXIgbGEgY2Fpc3NlIGV0IGZvdXJuaXQgZGVzIGhlbHBlcnMgcGFydGFnw6lzIGRlIG1hdGNoaW5nL2Nhbm9uaWNhbGlzYXRpb24gc2VydmV1ci4gfCBFeHBvc2U6IGNhaXNzZURlbGl2ZXJ5Q2l0eUNob2ljZU1hdGNoLCBjYWlzc2VOb3JtYWxpemVEZWxpdmVyeUNpdHlQYXlsb2FkIHwgRMOpcGVuZCBkZTogY29tbWFuZGUvdjEvaW5jL3JlcG8vZGVsaXZlcnlfY2l0eV9jaG9pY2VzLnBocCB8IEltcGFjdGU6IHZhbGlkYXRpb24gc2VydmV1ciBkZXMgYWRyZXNzZXMgY2xpZW50IGV0IHByb3Zpc29pcmVzIGPDtHTDqSBjYWlzc2UgfCBUYWJsZXM6IGF1Y3VuZSAqLwoKcmVxdWlyZV9vbmNlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL2NvbW1hbmRlL3YxL2luYy9yZXBvL2RlbGl2ZXJ5X2NpdHlfY2hvaWNlcy5waHAnOwoKLyoqCiAqIEByZXR1cm4gYXJyYXl7Y2l0eTpzdHJpbmcscG9zdGFsX2NvZGU6c3RyaW5nfXxudWxsCiAqLwpmdW5jdGlvbiBjYWlzc2VEZWxpdmVyeUNpdHlDaG9pY2VNYXRjaChzdHJpbmcgJHN0b3JlSWQsIHN0cmluZyAkY2l0eSwgc3RyaW5nICRwb3N0YWxDb2RlKTogP2FycmF5CnsKICAgIHJldHVybiB2MV9kZWxpdmVyeV9jaXR5X2Nob2ljZV9tYXRjaCgkc3RvcmVJZCwgJGNpdHksICRwb3N0YWxDb2RlKTsKfQoKLyoqCiAqIEBwYXJhbSBhcnJheTxzdHJpbmcsbWl4ZWQ+ICRwYXlsb2FkCiAqIEByZXR1cm4gYXJyYXl7b2s6Ym9vbCxwYXlsb2FkOmFycmF5PHN0cmluZyxtaXhlZD4sZXJyb3I/OnN0cmluZ30KICovCmZ1bmN0aW9uIGNhaXNzZU5vcm1hbGl6ZURlbGl2ZXJ5Q2l0eVBheWxvYWQoYXJyYXkgJHBheWxvYWQsIHN0cmluZyAkc3RvcmVJZCwgc3RyaW5nICRjaXR5S2V5ID0gJ3ZpbGxlJywgc3RyaW5nICRwb3N0YWxLZXkgPSAnY29kZV9wb3N0YWwnKTogYXJyYXkKewogICAgJGNpdHkgPSBhcnJheV9rZXlfZXhpc3RzKCRjaXR5S2V5LCAkcGF5bG9hZCkgPyAoc3RyaW5nKSRwYXlsb2FkWyRjaXR5S2V5XSA6ICcnOwogICAgJHBvc3RhbCA9IGFycmF5X2tleV9leGlzdHMoJHBvc3RhbEtleSwgJHBheWxvYWQpID8gKHN0cmluZykkcGF5bG9hZFskcG9zdGFsS2V5XSA6ICcnOwogICAgaWYgKHRyaW0oJGNpdHkpID09PSAnJyAmJiB0cmltKCRwb3N0YWwpID09PSAnJykgewogICAgICByZXR1cm4gWydvaycgPT4gdHJ1ZSwgJ3BheWxvYWQnID0+ICRwYXlsb2FkXTsKICAgIH0KCiAgICAkbWF0Y2ggPSBjYWlzc2VEZWxpdmVyeUNpdHlDaG9pY2VNYXRjaCgkc3RvcmVJZCwgJGNpdHksICRwb3N0YWwpOwogICAgaWYgKCEkbWF0Y2gpIHsKICAgICAgcmV0dXJuIFsKICAgICAgICAnb2snID0+IGZhbHNlLAogICAgICAgICdwYXlsb2FkJyA9PiAkcGF5bG9hZCwKICAgICAgICAnZXJyb3InID0+ICdWaWxsZSAvIGNvZGUgcG9zdGFsIG5vbiBhdXRvcmlzw6lzIHBvdXIgY2UgcG9pbnQgZGUgdmVudGUuJywKICAgICAgXTsKICAgIH0KCiAgICAkcGF5bG9hZFskY2l0eUtleV0gPSAoc3RyaW5nKSRtYXRjaFsnY2l0eSddOwogICAgJHBheWxvYWRbJHBvc3RhbEtleV0gPSAoc3RyaW5nKSRtYXRjaFsncG9zdGFsX2NvZGUnXTsKICAgIHJldHVybiBbJ29rJyA9PiB0cnVlLCAncGF5bG9hZCcgPT4gJHBheWxvYWRdOwp9"
            },
            "after": {
                "exists": true,
                "kind": "file",
                "size": 1834,
                "sha1": "2ca71da8398e590b8c6679871c346c9257665009",
                "content_b64": "PD9waHAKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgovKiBkb2MtcHJvamVjdCB8IGNhaXNzZS1hcXAvcHVibGljL2FwaS9fbGliL2RlbGl2ZXJ5Q2l0eUNob2ljZXMucGhwIHwgUsOpdXRpbGlzZSBsYSBzb3VyY2UgZGUgdsOpcml0w6kgd2ViIFYxIGRlcyBjb21tdW5lcyBhdXRvcmlzw6llcyBwYXIgUERWIHBvdXIgbGEgY2Fpc3NlIGV0IGZvdXJuaXQgZGVzIGhlbHBlcnMgcGFydGFnw6lzIGRlIG1hdGNoaW5nL2Nhbm9uaWNhbGlzYXRpb24gc2VydmV1ciwgZMOpc29ybWFpcyB0b2zDqXJhbnRzIGFmaW4gZGUgbmUgamFtYWlzIGJsb3F1ZXIgbGEgc2F1dmVnYXJkZSBxdWFuZCB1bmUgYWRyZXNzZSBleGlzdGFudGUgb3Ugc2Fpc2llIG5lIGNvcnJlc3BvbmQgcGFzIGF1eCBjaG9peCBkdSBQRFYuIHwgRXhwb3NlOiBjYWlzc2VEZWxpdmVyeUNpdHlDaG9pY2VNYXRjaCwgY2Fpc3NlTm9ybWFsaXplRGVsaXZlcnlDaXR5UGF5bG9hZCB8IETDqXBlbmQgZGU6IGNvbW1hbmRlL3YxL2luYy9yZXBvL2RlbGl2ZXJ5X2NpdHlfY2hvaWNlcy5waHAgfCBJbXBhY3RlOiBjYW5vbmljYWxpc2F0aW9uIHNlcnZldXIgbm9uIGJsb3F1YW50ZSBkZXMgYWRyZXNzZXMgY2xpZW50IGV0IHByb3Zpc29pcmVzIGPDtHTDqSBjYWlzc2UgfCBUYWJsZXM6IGF1Y3VuZSAqLwoKcmVxdWlyZV9vbmNlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL2NvbW1hbmRlL3YxL2luYy9yZXBvL2RlbGl2ZXJ5X2NpdHlfY2hvaWNlcy5waHAnOwoKLyoqCiAqIEByZXR1cm4gYXJyYXl7Y2l0eTpzdHJpbmcscG9zdGFsX2NvZGU6c3RyaW5nfXxudWxsCiAqLwpmdW5jdGlvbiBjYWlzc2VEZWxpdmVyeUNpdHlDaG9pY2VNYXRjaChzdHJpbmcgJHN0b3JlSWQsIHN0cmluZyAkY2l0eSwgc3RyaW5nICRwb3N0YWxDb2RlKTogP2FycmF5CnsKICAgIHJldHVybiB2MV9kZWxpdmVyeV9jaXR5X2Nob2ljZV9tYXRjaCgkc3RvcmVJZCwgJGNpdHksICRwb3N0YWxDb2RlKTsKfQoKLyoqCiAqIEBwYXJhbSBhcnJheTxzdHJpbmcsbWl4ZWQ+ICRwYXlsb2FkCiAqIEByZXR1cm4gYXJyYXl7b2s6Ym9vbCxwYXlsb2FkOmFycmF5PHN0cmluZyxtaXhlZD4sZXJyb3I/OnN0cmluZ30KICovCmZ1bmN0aW9uIGNhaXNzZU5vcm1hbGl6ZURlbGl2ZXJ5Q2l0eVBheWxvYWQoYXJyYXkgJHBheWxvYWQsIHN0cmluZyAkc3RvcmVJZCwgc3RyaW5nICRjaXR5S2V5ID0gJ3ZpbGxlJywgc3RyaW5nICRwb3N0YWxLZXkgPSAnY29kZV9wb3N0YWwnKTogYXJyYXkKewogICAgJGNpdHkgPSBhcnJheV9rZXlfZXhpc3RzKCRjaXR5S2V5LCAkcGF5bG9hZCkgPyAoc3RyaW5nKSRwYXlsb2FkWyRjaXR5S2V5XSA6ICcnOwogICAgJHBvc3RhbCA9IGFycmF5X2tleV9leGlzdHMoJHBvc3RhbEtleSwgJHBheWxvYWQpID8gKHN0cmluZykkcGF5bG9hZFskcG9zdGFsS2V5XSA6ICcnOwogICAgaWYgKHRyaW0oJGNpdHkpID09PSAnJyAmJiB0cmltKCRwb3N0YWwpID09PSAnJykgewogICAgICByZXR1cm4gWydvaycgPT4gdHJ1ZSwgJ3BheWxvYWQnID0+ICRwYXlsb2FkXTsKICAgIH0KCiAgICAkbWF0Y2ggPSBjYWlzc2VEZWxpdmVyeUNpdHlDaG9pY2VNYXRjaCgkc3RvcmVJZCwgJGNpdHksICRwb3N0YWwpOwogICAgaWYgKCEkbWF0Y2gpIHsKICAgICAgcmV0dXJuIFsnb2snID0+IHRydWUsICdwYXlsb2FkJyA9PiAkcGF5bG9hZF07CiAgICB9CgogICAgJHBheWxvYWRbJGNpdHlLZXldID0gKHN0cmluZykkbWF0Y2hbJ2NpdHknXTsKICAgICRwYXlsb2FkWyRwb3N0YWxLZXldID0gKHN0cmluZykkbWF0Y2hbJ3Bvc3RhbF9jb2RlJ107CiAgICByZXR1cm4gWydvaycgPT4gdHJ1ZSwgJ3BheWxvYWQnID0+ICRwYXlsb2FkXTsKfQ=="
            }
        },
        {
            "path": "caisse-aqp/public/api/_lib/tempAddress.php",
            "kind": "file",
            "before": {
                "exists": true,
                "kind": "file",
                "size": 7471,
                "sha1": "0be75750a2185445131f975c437d278cb62218c9",
                "content_b64": "PD9waHAKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgovKiBkb2MtcHJvamVjdCB8IGNhaXNzZS1hcXAvcHVibGljL2FwaS9fbGliL3RlbXBBZGRyZXNzLnBocCB8IENlbnRyYWxpc2UgbGEgbm9ybWFsaXNhdGlvbiwgbGEgcGVyc2lzdGFuY2UgZXQgbGEgcsOpc29sdXRpb24gZGUgbOKAmWFkcmVzc2UgZGUgbGl2cmFpc29uIHByb3Zpc29pcmUgcG9ydMOpZSBwYXIgbGEgY29tbWFuZGUgdmlhIHBvc190ZW1wX2FkcmVzc2VzLCBhdmVjIGNvbnRyw7RsZSBkdSBjb3VwbGUgdmlsbGUgLyBjb2RlIHBvc3RhbCBhdXRvcmlzw6kgc2Vsb24gbGUgUERWLiB8IEV4cG9zZTogdGVtcEFkZHJlc3NDbGVhblN0cmluZywgdGVtcEFkZHJlc3NOb3JtYWxpemVQYXlsb2FkLCB0ZW1wQWRkcmVzc0ZldGNoLCB0ZW1wQWRkcmVzc1BlcnNpc3QsIHRlbXBBZGRyZXNzVG9BcGksIHRlbXBBZGRyZXNzRnJvbUNsaWVudCwgdGVtcEFkZHJlc3NSZXNvbHZlRWZmZWN0aXZlIHwgRMOpcGVuZCBkZTogUERPLCBwb3NfdGVtcF9hZHJlc3Nlcywgc3RkX2NsaWVudHMsIGRlbGl2ZXJ5Q2l0eUNob2ljZXMucGhwIHwgSW1wYWN0ZTogcGVyc2lzdGFuY2UgZOKAmWFkcmVzc2UgcHJvdmlzb2lyZSwgcGF5bG9hZHMgQVBJIGNvbW1hbmRlLCByw6lzb2x1dGlvbiBk4oCZYWRyZXNzZSBlZmZlY3RpdmUgfCBUYWJsZXM6IHBvc190ZW1wX2FkcmVzc2VzKGlkLCBhZHJlc3NlLCBjb21wbGVtZW50X2FkcmVzc2UsIGNvZGVfcG9zdGFsLCB2aWxsZSwgZXhwbGljYXRpb25zLCBudW1lcm9fdXJnZW5jZSwgbGF0aXR1ZGUsIGxvbmdpdHVkZSksIHN0ZF9jbGllbnRzKGFkcmVzc2UsIGNvbXBsZW1lbnRfYWRyZXNzZSwgY29kZV9wb3N0YWwsIHZpbGxlKSAqLwoKcmVxdWlyZV9vbmNlIF9fRElSX18gLiAnL2RlbGl2ZXJ5Q2l0eUNob2ljZXMucGhwJzsKCmZ1bmN0aW9uIHRlbXBBZGRyZXNzQ2xlYW5TdHJpbmcoJHZhbHVlLCBpbnQgJG1heExlbiA9IDApOiBzdHJpbmcKewogICAgJHMgPSB0cmltKChzdHJpbmcpKCR2YWx1ZSA/PyAnJykpOwogICAgJHMgPSBwcmVnX3JlcGxhY2UoJ35ccyt+dScsICcgJywgJHMpOwogICAgaWYgKCFpc19zdHJpbmcoJHMpKSAkcyA9ICcnOwogICAgaWYgKCRtYXhMZW4gPiAwKSB7CiAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfc3RybGVuJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdtYl9zdWJzdHInKSkgewogICAgICAgICAgICBpZiAobWJfc3RybGVuKCRzLCAnVVRGLTgnKSA+ICRtYXhMZW4pICRzID0gKHN0cmluZyltYl9zdWJzdHIoJHMsIDAsICRtYXhMZW4sICdVVEYtOCcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChzdHJsZW4oJHMpID4gJG1heExlbikgJHMgPSBzdWJzdHIoJHMsIDAsICRtYXhMZW4pOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiB0cmltKCRzKTsKfQoKZnVuY3Rpb24gdGVtcEFkZHJlc3NOb3JtYWxpemVQYXlsb2FkKCRwYXlsb2FkLCBzdHJpbmcgJHN0b3JlSWQgPSAnJyk6ID9hcnJheQp7CiAgICBpZiAoIWlzX2FycmF5KCRwYXlsb2FkKSkgcmV0dXJuIG51bGw7CgogICAgJGVuYWJsZWRSYXcgPSAkcGF5bG9hZFsnZW5hYmxlZCddID8/ICRwYXlsb2FkWydhY3RpdmUnXSA/PyB0cnVlOwogICAgJGVuYWJsZWQgPSAoJGVuYWJsZWRSYXcgPT09IHRydWUgfHwgJGVuYWJsZWRSYXcgPT09IDEgfHwgJGVuYWJsZWRSYXcgPT09ICcxJyB8fCAkZW5hYmxlZFJhdyA9PT0gJ3RydWUnKTsKICAgIGlmICghJGVuYWJsZWQpIHJldHVybiBudWxsOwoKICAgICRjb2RlUG9zdGFsID0gcHJlZ19yZXBsYWNlKCd+XEQrficsICcnLCAoc3RyaW5nKSgkcGF5bG9hZFsnY29kZV9wb3N0YWwnXSA/PyAkcGF5bG9hZFsnY29kZVBvc3RhbCddID8/ICcnKSk7CiAgICBpZiAoIWlzX3N0cmluZygkY29kZVBvc3RhbCkpICRjb2RlUG9zdGFsID0gJyc7CgogICAgJG91dCA9IFsKICAgICAgICAnYWRyZXNzZScgPT4gdGVtcEFkZHJlc3NDbGVhblN0cmluZygkcGF5bG9hZFsnYWRyZXNzZSddID8/ICcnLCAxOTApLAogICAgICAgICdjb21wbGVtZW50X2FkcmVzc2UnID0+IHRlbXBBZGRyZXNzQ2xlYW5TdHJpbmcoJHBheWxvYWRbJ2NvbXBsZW1lbnRfYWRyZXNzZSddID8/ICRwYXlsb2FkWydjb21wbGVtZW50QWRyZXNzZSddID8/ICcnLCAxOTApLAogICAgICAgICdjb2RlX3Bvc3RhbCcgPT4gdHJpbSgkY29kZVBvc3RhbCksCiAgICAgICAgJ3ZpbGxlJyA9PiB0ZW1wQWRkcmVzc0NsZWFuU3RyaW5nKCRwYXlsb2FkWyd2aWxsZSddID8/ICcnLCAxMjApLAogICAgICAgICdleHBsaWNhdGlvbnMnID0+IHRlbXBBZGRyZXNzQ2xlYW5TdHJpbmcoJHBheWxvYWRbJ2V4cGxpY2F0aW9ucyddID8/ICcnLCA1MDApLAogICAgICAgICdudW1lcm9fdXJnZW5jZScgPT4gdGVtcEFkZHJlc3NDbGVhblN0cmluZygkcGF5bG9hZFsnbnVtZXJvX3VyZ2VuY2UnXSA/PyAkcGF5bG9hZFsnbnVtZXJvVXJnZW5jZSddID8/ICcnLCAzMCksCiAgICBdOwoKICAgICRoYXNBbnkgPSBmYWxzZTsKICAgIGZvcmVhY2ggKCRvdXQgYXMgJHZhbHVlKSB7CiAgICAgICAgaWYgKCR2YWx1ZSAhPT0gJycpIHsKICAgICAgICAgICAgJGhhc0FueSA9IHRydWU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIGlmICghJGhhc0FueSkgcmV0dXJuIG51bGw7CgogICAgaWYgKCRvdXRbJ2FkcmVzc2UnXSA9PT0gJycgfHwgJG91dFsnY29kZV9wb3N0YWwnXSA9PT0gJycgfHwgJG91dFsndmlsbGUnXSA9PT0gJycpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBpZiAoJHN0b3JlSWQgIT09ICcnKSB7CiAgICAgICAgJG5vcm1hbGl6ZWQgPSBjYWlzc2VOb3JtYWxpemVEZWxpdmVyeUNpdHlQYXlsb2FkKCRvdXQsICRzdG9yZUlkLCAndmlsbGUnLCAnY29kZV9wb3N0YWwnKTsKICAgICAgICBpZiAoZW1wdHkoJG5vcm1hbGl6ZWRbJ29rJ10pIHx8ICFpc19hcnJheSgkbm9ybWFsaXplZFsncGF5bG9hZCddKSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgJG91dCA9ICRub3JtYWxpemVkWydwYXlsb2FkJ107CiAgICB9CgogICAgcmV0dXJuICRvdXQ7Cn0KCmZ1bmN0aW9uIHRlbXBBZGRyZXNzRmV0Y2goUERPICRwZG8sIGludCAkaWQpOiA/YXJyYXkKewogICAgaWYgKCRpZCA8PSAwKSByZXR1cm4gbnVsbDsKICAgICRzdG10ID0gJHBkby0+cHJlcGFyZSgnU0VMRUNUICogRlJPTSBwb3NfdGVtcF9hZHJlc3NlcyBXSEVSRSBpZCA9IDppZCBMSU1JVCAxJyk7CiAgICAkc3RtdC0+YmluZFZhbHVlKCc6aWQnLCAkaWQsIFBETzo6UEFSQU1fSU5UKTsKICAgICRzdG10LT5leGVjdXRlKCk7CiAgICAkcm93ID0gJHN0bXQtPmZldGNoKFBETzo6RkVUQ0hfQVNTT0MpOwogICAgcmV0dXJuIGlzX2FycmF5KCRyb3cpID8gJHJvdyA6IG51bGw7Cn0KCmZ1bmN0aW9uIHRlbXBBZGRyZXNzUGVyc2lzdChQRE8gJHBkbywgJHBheWxvYWQsID9pbnQgJGV4aXN0aW5nSWQgPSBudWxsLCBzdHJpbmcgJHN0b3JlSWQgPSAnJyk6ID9pbnQKewogICAgJGRhdGEgPSB0ZW1wQWRkcmVzc05vcm1hbGl6ZVBheWxvYWQoJHBheWxvYWQsICRzdG9yZUlkKTsKICAgIGlmICgkZGF0YSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7CgogICAgJGV4aXN0aW5nSWQgPSAoaW50KSgkZXhpc3RpbmdJZCA/PyAwKTsKICAgIGlmICgkZXhpc3RpbmdJZCA+IDAgJiYgdGVtcEFkZHJlc3NGZXRjaCgkcGRvLCAkZXhpc3RpbmdJZCkpIHsKICAgICAgICAkc3RtdCA9ICRwZG8tPnByZXBhcmUoCiAgICAgICAgICAgICdVUERBVEUgcG9zX3RlbXBfYWRyZXNzZXMKICAgICAgICAgICAgIFNFVCBhZHJlc3NlID0gOmFkcmVzc2UsCiAgICAgICAgICAgICAgICAgY29tcGxlbWVudF9hZHJlc3NlID0gOmNvbXBsZW1lbnRfYWRyZXNzZSwKICAgICAgICAgICAgICAgICBjb2RlX3Bvc3RhbCA9IDpjb2RlX3Bvc3RhbCwKICAgICAgICAgICAgICAgICB2aWxsZSA9IDp2aWxsZSwKICAgICAgICAgICAgICAgICBleHBsaWNhdGlvbnMgPSA6ZXhwbGljYXRpb25zLAogICAgICAgICAgICAgICAgIG51bWVyb191cmdlbmNlID0gOm51bWVyb191cmdlbmNlCiAgICAgICAgICAgICBXSEVSRSBpZCA9IDppZCcKICAgICAgICApOwogICAgICAgICRzdG10LT5iaW5kVmFsdWUoJzppZCcsICRleGlzdGluZ0lkLCBQRE86OlBBUkFNX0lOVCk7CiAgICAgICAgJHN0bXQtPmJpbmRWYWx1ZSgnOmFkcmVzc2UnLCAkZGF0YVsnYWRyZXNzZSddLCBQRE86OlBBUkFNX1NUUik7CiAgICAgICAgJHN0bXQtPmJpbmRWYWx1ZSgnOmNvbXBsZW1lbnRfYWRyZXNzZScsICRkYXRhWydjb21wbGVtZW50X2FkcmVzc2UnXSwgUERPOjpQQVJBTV9TVFIpOwogICAgICAgICRzdG10LT5iaW5kVmFsdWUoJzpjb2RlX3Bvc3RhbCcsICRkYXRhWydjb2RlX3Bvc3RhbCddLCBQRE86OlBBUkFNX1NUUik7CiAgICAgICAgJHN0bXQtPmJpbmRWYWx1ZSgnOnZpbGxlJywgJGRhdGFbJ3ZpbGxlJ10sIFBETzo6UEFSQU1fU1RSKTsKICAgICAgICAkc3RtdC0+YmluZFZhbHVlKCc6ZXhwbGljYXRpb25zJywgJGRhdGFbJ2V4cGxpY2F0aW9ucyddLCBQRE86OlBBUkFNX1NUUik7CiAgICAgICAgJHN0bXQtPmJpbmRWYWx1ZSgnOm51bWVyb191cmdlbmNlJywgJGRhdGFbJ251bWVyb191cmdlbmNlJ10sIFBETzo6UEFSQU1fU1RSKTsKICAgICAgICAkc3RtdC0+ZXhlY3V0ZSgpOwogICAgICAgIHJldHVybiAkZXhpc3RpbmdJZDsKICAgIH0KCiAgICAkc3RtdCA9ICRwZG8tPnByZXBhcmUoCiAgICAgICAgJ0lOU0VSVCBJTlRPIHBvc190ZW1wX2FkcmVzc2VzICgKICAgICAgICAgICAgYWRyZXNzZSwKICAgICAgICAgICAgY29tcGxlbWVudF9hZHJlc3NlLAogICAgICAgICAgICBjb2RlX3Bvc3RhbCwKICAgICAgICAgICAgdmlsbGUsCiAgICAgICAgICAgIGV4cGxpY2F0aW9ucywKICAgICAgICAgICAgbnVtZXJvX3VyZ2VuY2UKICAgICAgICApIFZBTFVFUyAoCiAgICAgICAgICAgIDphZHJlc3NlLAogICAgICAgICAgICA6Y29tcGxlbWVudF9hZHJlc3NlLAogICAgICAgICAgICA6Y29kZV9wb3N0YWwsCiAgICAgICAgICAgIDp2aWxsZSwKICAgICAgICAgICAgOmV4cGxpY2F0aW9ucywKICAgICAgICAgICAgOm51bWVyb191cmdlbmNlCiAgICAgICAgKScKICAgICk7CiAgICAkc3RtdC0+YmluZFZhbHVlKCc6YWRyZXNzZScsICRkYXRhWydhZHJlc3NlJ10sIFBETzo6UEFSQU1fU1RSKTsKICAgICRzdG10LT5iaW5kVmFsdWUoJzpjb21wbGVtZW50X2FkcmVzc2UnLCAkZGF0YVsnY29tcGxlbWVudF9hZHJlc3NlJ10sIFBETzo6UEFSQU1fU1RSKTsKICAgICRzdG10LT5iaW5kVmFsdWUoJzpjb2RlX3Bvc3RhbCcsICRkYXRhWydjb2RlX3Bvc3RhbCddLCBQRE86OlBBUkFNX1NUUik7CiAgICAkc3RtdC0+YmluZFZhbHVlKCc6dmlsbGUnLCAkZGF0YVsndmlsbGUnXSwgUERPOjpQQVJBTV9TVFIpOwogICAgJHN0bXQtPmJpbmRWYWx1ZSgnOmV4cGxpY2F0aW9ucycsICRkYXRhWydleHBsaWNhdGlvbnMnXSwgUERPOjpQQVJBTV9TVFIpOwogICAgJHN0bXQtPmJpbmRWYWx1ZSgnOm51bWVyb191cmdlbmNlJywgJGRhdGFbJ251bWVyb191cmdlbmNlJ10sIFBETzo6UEFSQU1fU1RSKTsKICAgICRzdG10LT5leGVjdXRlKCk7CiAgICAkbmV3SWQgPSAoaW50KSRwZG8tPmxhc3RJbnNlcnRJZCgpOwogICAgcmV0dXJuICgkbmV3SWQgPiAwKSA/ICRuZXdJZCA6IG51bGw7Cn0KCmZ1bmN0aW9uIHRlbXBBZGRyZXNzVG9BcGkoP2FycmF5ICRyb3cpOiA/YXJyYXkKewogICAgaWYgKCFpc19hcnJheSgkcm93KSkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gWwogICAgICAgICdpZCcgPT4gKGludCkoJHJvd1snaWQnXSA/PyAwKSwKICAgICAgICAnYWRyZXNzZScgPT4gKHN0cmluZykoJHJvd1snYWRyZXNzZSddID8/ICcnKSwKICAgICAgICAnY29tcGxlbWVudF9hZHJlc3NlJyA9PiAoc3RyaW5nKSgkcm93Wydjb21wbGVtZW50X2FkcmVzc2UnXSA/PyAnJyksCiAgICAgICAgJ2NvZGVfcG9zdGFsJyA9PiAoc3RyaW5nKSgkcm93Wydjb2RlX3Bvc3RhbCddID8/ICcnKSwKICAgICAgICAndmlsbGUnID0+IChzdHJpbmcpKCRyb3dbJ3ZpbGxlJ10gPz8gJycpLAogICAgICAgICdleHBsaWNhdGlvbnMnID0+IChzdHJpbmcpKCRyb3dbJ2V4cGxpY2F0aW9ucyddID8/ICcnKSwKICAgICAgICAnbnVtZXJvX3VyZ2VuY2UnID0+IChzdHJpbmcpKCRyb3dbJ251bWVyb191cmdlbmNlJ10gPz8gJycpLAogICAgICAgICdsYXRpdHVkZScgPT4gaXNzZXQoJHJvd1snbGF0aXR1ZGUnXSkgPyAoc3RyaW5nKSRyb3dbJ2xhdGl0dWRlJ10gOiAnJywKICAgICAgICAnbG9uZ2l0dWRlJyA9PiBpc3NldCgkcm93Wydsb25naXR1ZGUnXSkgPyAoc3RyaW5nKSRyb3dbJ2xvbmdpdHVkZSddIDogJycsCiAgICBdOwp9CgpmdW5jdGlvbiB0ZW1wQWRkcmVzc0Zyb21DbGllbnQoP2FycmF5ICRjbGllbnQpOiA/YXJyYXkKewogICAgaWYgKCFpc19hcnJheSgkY2xpZW50KSkgcmV0dXJuIG51bGw7CiAgICAkYWRyZXNzZSA9IHRlbXBBZGRyZXNzQ2xlYW5TdHJpbmcoJGNsaWVudFsnYWRyZXNzZSddID8/ICcnLCAxOTApOwogICAgJGNvZGVQb3N0YWwgPSB0ZW1wQWRkcmVzc0NsZWFuU3RyaW5nKCRjbGllbnRbJ2NvZGVfcG9zdGFsJ10gPz8gJycsIDIwKTsKICAgICR2aWxsZSA9IHRlbXBBZGRyZXNzQ2xlYW5TdHJpbmcoJGNsaWVudFsndmlsbGUnXSA/PyAnJywgMTIwKTsKICAgIGlmICgkYWRyZXNzZSA9PT0gJycgfHwgJGNvZGVQb3N0YWwgPT09ICcnIHx8ICR2aWxsZSA9PT0gJycpIHJldHVybiBudWxsOwogICAgcmV0dXJuIFsKICAgICAgICAnYWRyZXNzZScgPT4gJGFkcmVzc2UsCiAgICAgICAgJ2NvbXBsZW1lbnRfYWRyZXNzZScgPT4gdGVtcEFkZHJlc3NDbGVhblN0cmluZygkY2xpZW50Wydjb21wbGVtZW50X2FkcmVzc2UnXSA/PyAnJywgMTkwKSwKICAgICAgICAnY29kZV9wb3N0YWwnID0+ICRjb2RlUG9zdGFsLAogICAgICAgICd2aWxsZScgPT4gJHZpbGxlLAogICAgICAgICdleHBsaWNhdGlvbnMnID0+ICcnLAogICAgICAgICdudW1lcm9fdXJnZW5jZScgPT4gJycsCiAgICAgICAgJ2xhdGl0dWRlJyA9PiBpc3NldCgkY2xpZW50WydsYXRpdHVkZSddKSA/IChzdHJpbmcpJGNsaWVudFsnbGF0aXR1ZGUnXSA6ICcnLAogICAgICAgICdsb25naXR1ZGUnID0+IGlzc2V0KCRjbGllbnRbJ2xvbmdpdHVkZSddKSA/IChzdHJpbmcpJGNsaWVudFsnbG9uZ2l0dWRlJ10gOiAnJywKICAgIF07Cn0KCmZ1bmN0aW9uIHRlbXBBZGRyZXNzUmVzb2x2ZUVmZmVjdGl2ZSg/YXJyYXkgJGNsaWVudCwgP2FycmF5ICR0ZW1wQWRkcmVzcyk6ID9hcnJheQp7CiAgICAkdGVtcEFwaSA9IHRlbXBBZGRyZXNzVG9BcGkoJHRlbXBBZGRyZXNzKTsKICAgIGlmIChpc19hcnJheSgkdGVtcEFwaSkgJiYgdHJpbSgoc3RyaW5nKSgkdGVtcEFwaVsnYWRyZXNzZSddID8/ICcnKSkgIT09ICcnKSB7CiAgICAgICAgcmV0dXJuICR0ZW1wQXBpOwogICAgfQogICAgcmV0dXJuIHRlbXBBZGRyZXNzRnJvbUNsaWVudCgkY2xpZW50KTsKfQ=="
            },
            "after": {
                "exists": true,
                "kind": "file",
                "size": 7521,
                "sha1": "4a43329dd14933d7671bb626b15e7dd240b3c191",
                "content_b64": "PD9waHAKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgovKiBkb2MtcHJvamVjdCB8IGNhaXNzZS1hcXAvcHVibGljL2FwaS9fbGliL3RlbXBBZGRyZXNzLnBocCB8IENlbnRyYWxpc2UgbGEgbm9ybWFsaXNhdGlvbiwgbGEgcGVyc2lzdGFuY2UgZXQgbGEgcsOpc29sdXRpb24gZGUgbOKAmWFkcmVzc2UgZGUgbGl2cmFpc29uIHByb3Zpc29pcmUgcG9ydMOpZSBwYXIgbGEgY29tbWFuZGUgdmlhIHBvc190ZW1wX2FkcmVzc2VzLCBhdmVjIGNhbm9uaWNhbGlzYXRpb24gbm9uIGJsb3F1YW50ZSBkdSBjb3VwbGUgdmlsbGUgLyBjb2RlIHBvc3RhbCBsb3JzcXXigJl1biBjaG9peCBQRFYgcmVjb25udSBlc3QgZm91cm5pIGV0IGNvbnNlcnZhdGlvbiBkZXMgYWRyZXNzZXMgc2Fpc2llcyBsaWJyZW1lbnQgc2lub24uIHwgRXhwb3NlOiB0ZW1wQWRkcmVzc0NsZWFuU3RyaW5nLCB0ZW1wQWRkcmVzc05vcm1hbGl6ZVBheWxvYWQsIHRlbXBBZGRyZXNzRmV0Y2gsIHRlbXBBZGRyZXNzUGVyc2lzdCwgdGVtcEFkZHJlc3NUb0FwaSwgdGVtcEFkZHJlc3NGcm9tQ2xpZW50LCB0ZW1wQWRkcmVzc1Jlc29sdmVFZmZlY3RpdmUgfCBEw6lwZW5kIGRlOiBQRE8sIHBvc190ZW1wX2FkcmVzc2VzLCBzdGRfY2xpZW50cywgZGVsaXZlcnlDaXR5Q2hvaWNlcy5waHAgfCBJbXBhY3RlOiBwZXJzaXN0YW5jZSBk4oCZYWRyZXNzZSBwcm92aXNvaXJlLCBwYXlsb2FkcyBBUEkgY29tbWFuZGUsIHLDqXNvbHV0aW9uIGTigJlhZHJlc3NlIGVmZmVjdGl2ZSB8IFRhYmxlczogcG9zX3RlbXBfYWRyZXNzZXMoaWQsIGFkcmVzc2UsIGNvbXBsZW1lbnRfYWRyZXNzZSwgY29kZV9wb3N0YWwsIHZpbGxlLCBleHBsaWNhdGlvbnMsIG51bWVyb191cmdlbmNlLCBsYXRpdHVkZSwgbG9uZ2l0dWRlKSwgc3RkX2NsaWVudHMoYWRyZXNzZSwgY29tcGxlbWVudF9hZHJlc3NlLCBjb2RlX3Bvc3RhbCwgdmlsbGUpICovCgpyZXF1aXJlX29uY2UgX19ESVJfXyAuICcvZGVsaXZlcnlDaXR5Q2hvaWNlcy5waHAnOwoKZnVuY3Rpb24gdGVtcEFkZHJlc3NDbGVhblN0cmluZygkdmFsdWUsIGludCAkbWF4TGVuID0gMCk6IHN0cmluZwp7CiAgICAkcyA9IHRyaW0oKHN0cmluZykoJHZhbHVlID8/ICcnKSk7CiAgICAkcyA9IHByZWdfcmVwbGFjZSgnflxzK351JywgJyAnLCAkcyk7CiAgICBpZiAoIWlzX3N0cmluZygkcykpICRzID0gJyc7CiAgICBpZiAoJG1heExlbiA+IDApIHsKICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJsZW4nKSAmJiBmdW5jdGlvbl9leGlzdHMoJ21iX3N1YnN0cicpKSB7CiAgICAgICAgICAgIGlmIChtYl9zdHJsZW4oJHMsICdVVEYtOCcpID4gJG1heExlbikgJHMgPSAoc3RyaW5nKW1iX3N1YnN0cigkcywgMCwgJG1heExlbiwgJ1VURi04Jyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKHN0cmxlbigkcykgPiAkbWF4TGVuKSAkcyA9IHN1YnN0cigkcywgMCwgJG1heExlbik7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHRyaW0oJHMpOwp9CgpmdW5jdGlvbiB0ZW1wQWRkcmVzc05vcm1hbGl6ZVBheWxvYWQoJHBheWxvYWQsIHN0cmluZyAkc3RvcmVJZCA9ICcnKTogP2FycmF5CnsKICAgIGlmICghaXNfYXJyYXkoJHBheWxvYWQpKSByZXR1cm4gbnVsbDsKCiAgICAkZW5hYmxlZFJhdyA9ICRwYXlsb2FkWydlbmFibGVkJ10gPz8gJHBheWxvYWRbJ2FjdGl2ZSddID8/IHRydWU7CiAgICAkZW5hYmxlZCA9ICgkZW5hYmxlZFJhdyA9PT0gdHJ1ZSB8fCAkZW5hYmxlZFJhdyA9PT0gMSB8fCAkZW5hYmxlZFJhdyA9PT0gJzEnIHx8ICRlbmFibGVkUmF3ID09PSAndHJ1ZScpOwogICAgaWYgKCEkZW5hYmxlZCkgcmV0dXJuIG51bGw7CgogICAgJGNvZGVQb3N0YWwgPSBwcmVnX3JlcGxhY2UoJ35cRCt+JywgJycsIChzdHJpbmcpKCRwYXlsb2FkWydjb2RlX3Bvc3RhbCddID8/ICRwYXlsb2FkWydjb2RlUG9zdGFsJ10gPz8gJycpKTsKICAgIGlmICghaXNfc3RyaW5nKCRjb2RlUG9zdGFsKSkgJGNvZGVQb3N0YWwgPSAnJzsKCiAgICAkb3V0ID0gWwogICAgICAgICdhZHJlc3NlJyA9PiB0ZW1wQWRkcmVzc0NsZWFuU3RyaW5nKCRwYXlsb2FkWydhZHJlc3NlJ10gPz8gJycsIDE5MCksCiAgICAgICAgJ2NvbXBsZW1lbnRfYWRyZXNzZScgPT4gdGVtcEFkZHJlc3NDbGVhblN0cmluZygkcGF5bG9hZFsnY29tcGxlbWVudF9hZHJlc3NlJ10gPz8gJHBheWxvYWRbJ2NvbXBsZW1lbnRBZHJlc3NlJ10gPz8gJycsIDE5MCksCiAgICAgICAgJ2NvZGVfcG9zdGFsJyA9PiB0cmltKCRjb2RlUG9zdGFsKSwKICAgICAgICAndmlsbGUnID0+IHRlbXBBZGRyZXNzQ2xlYW5TdHJpbmcoJHBheWxvYWRbJ3ZpbGxlJ10gPz8gJycsIDEyMCksCiAgICAgICAgJ2V4cGxpY2F0aW9ucycgPT4gdGVtcEFkZHJlc3NDbGVhblN0cmluZygkcGF5bG9hZFsnZXhwbGljYXRpb25zJ10gPz8gJycsIDUwMCksCiAgICAgICAgJ251bWVyb191cmdlbmNlJyA9PiB0ZW1wQWRkcmVzc0NsZWFuU3RyaW5nKCRwYXlsb2FkWydudW1lcm9fdXJnZW5jZSddID8/ICRwYXlsb2FkWydudW1lcm9VcmdlbmNlJ10gPz8gJycsIDMwKSwKICAgIF07CgogICAgJGhhc0FueSA9IGZhbHNlOwogICAgZm9yZWFjaCAoJG91dCBhcyAkdmFsdWUpIHsKICAgICAgICBpZiAoJHZhbHVlICE9PSAnJykgewogICAgICAgICAgICAkaGFzQW55ID0gdHJ1ZTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQogICAgaWYgKCEkaGFzQW55KSByZXR1cm4gbnVsbDsKCiAgICBpZiAoJG91dFsnYWRyZXNzZSddID09PSAnJyB8fCAkb3V0Wydjb2RlX3Bvc3RhbCddID09PSAnJyB8fCAkb3V0Wyd2aWxsZSddID09PSAnJykgewogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGlmICgkc3RvcmVJZCAhPT0gJycpIHsKICAgICAgICAkbm9ybWFsaXplZCA9IGNhaXNzZU5vcm1hbGl6ZURlbGl2ZXJ5Q2l0eVBheWxvYWQoJG91dCwgJHN0b3JlSWQsICd2aWxsZScsICdjb2RlX3Bvc3RhbCcpOwogICAgICAgIGlmIChpc19hcnJheSgkbm9ybWFsaXplZFsncGF5bG9hZCddID8/IG51bGwpKSB7CiAgICAgICAgICAgICRvdXQgPSAkbm9ybWFsaXplZFsncGF5bG9hZCddOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJG91dDsKfQoKZnVuY3Rpb24gdGVtcEFkZHJlc3NGZXRjaChQRE8gJHBkbywgaW50ICRpZCk6ID9hcnJheQp7CiAgICBpZiAoJGlkIDw9IDApIHJldHVybiBudWxsOwogICAgJHN0bXQgPSAkcGRvLT5wcmVwYXJlKCdTRUxFQ1QgKiBGUk9NIHBvc190ZW1wX2FkcmVzc2VzIFdIRVJFIGlkID0gOmlkIExJTUlUIDEnKTsKICAgICRzdG10LT5iaW5kVmFsdWUoJzppZCcsICRpZCwgUERPOjpQQVJBTV9JTlQpOwogICAgJHN0bXQtPmV4ZWN1dGUoKTsKICAgICRyb3cgPSAkc3RtdC0+ZmV0Y2goUERPOjpGRVRDSF9BU1NPQyk7CiAgICByZXR1cm4gaXNfYXJyYXkoJHJvdykgPyAkcm93IDogbnVsbDsKfQoKZnVuY3Rpb24gdGVtcEFkZHJlc3NQZXJzaXN0KFBETyAkcGRvLCAkcGF5bG9hZCwgP2ludCAkZXhpc3RpbmdJZCA9IG51bGwsIHN0cmluZyAkc3RvcmVJZCA9ICcnKTogP2ludAp7CiAgICAkZGF0YSA9IHRlbXBBZGRyZXNzTm9ybWFsaXplUGF5bG9hZCgkcGF5bG9hZCwgJHN0b3JlSWQpOwogICAgaWYgKCRkYXRhID09PSBudWxsKSByZXR1cm4gbnVsbDsKCiAgICAkZXhpc3RpbmdJZCA9IChpbnQpKCRleGlzdGluZ0lkID8/IDApOwogICAgaWYgKCRleGlzdGluZ0lkID4gMCAmJiB0ZW1wQWRkcmVzc0ZldGNoKCRwZG8sICRleGlzdGluZ0lkKSkgewogICAgICAgICRzdG10ID0gJHBkby0+cHJlcGFyZSgKICAgICAgICAgICAgJ1VQREFURSBwb3NfdGVtcF9hZHJlc3NlcwogICAgICAgICAgICAgU0VUIGFkcmVzc2UgPSA6YWRyZXNzZSwKICAgICAgICAgICAgICAgICBjb21wbGVtZW50X2FkcmVzc2UgPSA6Y29tcGxlbWVudF9hZHJlc3NlLAogICAgICAgICAgICAgICAgIGNvZGVfcG9zdGFsID0gOmNvZGVfcG9zdGFsLAogICAgICAgICAgICAgICAgIHZpbGxlID0gOnZpbGxlLAogICAgICAgICAgICAgICAgIGV4cGxpY2F0aW9ucyA9IDpleHBsaWNhdGlvbnMsCiAgICAgICAgICAgICAgICAgbnVtZXJvX3VyZ2VuY2UgPSA6bnVtZXJvX3VyZ2VuY2UKICAgICAgICAgICAgIFdIRVJFIGlkID0gOmlkJwogICAgICAgICk7CiAgICAgICAgJHN0bXQtPmJpbmRWYWx1ZSgnOmlkJywgJGV4aXN0aW5nSWQsIFBETzo6UEFSQU1fSU5UKTsKICAgICAgICAkc3RtdC0+YmluZFZhbHVlKCc6YWRyZXNzZScsICRkYXRhWydhZHJlc3NlJ10sIFBETzo6UEFSQU1fU1RSKTsKICAgICAgICAkc3RtdC0+YmluZFZhbHVlKCc6Y29tcGxlbWVudF9hZHJlc3NlJywgJGRhdGFbJ2NvbXBsZW1lbnRfYWRyZXNzZSddLCBQRE86OlBBUkFNX1NUUik7CiAgICAgICAgJHN0bXQtPmJpbmRWYWx1ZSgnOmNvZGVfcG9zdGFsJywgJGRhdGFbJ2NvZGVfcG9zdGFsJ10sIFBETzo6UEFSQU1fU1RSKTsKICAgICAgICAkc3RtdC0+YmluZFZhbHVlKCc6dmlsbGUnLCAkZGF0YVsndmlsbGUnXSwgUERPOjpQQVJBTV9TVFIpOwogICAgICAgICRzdG10LT5iaW5kVmFsdWUoJzpleHBsaWNhdGlvbnMnLCAkZGF0YVsnZXhwbGljYXRpb25zJ10sIFBETzo6UEFSQU1fU1RSKTsKICAgICAgICAkc3RtdC0+YmluZFZhbHVlKCc6bnVtZXJvX3VyZ2VuY2UnLCAkZGF0YVsnbnVtZXJvX3VyZ2VuY2UnXSwgUERPOjpQQVJBTV9TVFIpOwogICAgICAgICRzdG10LT5leGVjdXRlKCk7CiAgICAgICAgcmV0dXJuICRleGlzdGluZ0lkOwogICAgfQoKICAgICRzdG10ID0gJHBkby0+cHJlcGFyZSgKICAgICAgICAnSU5TRVJUIElOVE8gcG9zX3RlbXBfYWRyZXNzZXMgKAogICAgICAgICAgICBhZHJlc3NlLAogICAgICAgICAgICBjb21wbGVtZW50X2FkcmVzc2UsCiAgICAgICAgICAgIGNvZGVfcG9zdGFsLAogICAgICAgICAgICB2aWxsZSwKICAgICAgICAgICAgZXhwbGljYXRpb25zLAogICAgICAgICAgICBudW1lcm9fdXJnZW5jZQogICAgICAgICkgVkFMVUVTICgKICAgICAgICAgICAgOmFkcmVzc2UsCiAgICAgICAgICAgIDpjb21wbGVtZW50X2FkcmVzc2UsCiAgICAgICAgICAgIDpjb2RlX3Bvc3RhbCwKICAgICAgICAgICAgOnZpbGxlLAogICAgICAgICAgICA6ZXhwbGljYXRpb25zLAogICAgICAgICAgICA6bnVtZXJvX3VyZ2VuY2UKICAgICAgICApJwogICAgKTsKICAgICRzdG10LT5iaW5kVmFsdWUoJzphZHJlc3NlJywgJGRhdGFbJ2FkcmVzc2UnXSwgUERPOjpQQVJBTV9TVFIpOwogICAgJHN0bXQtPmJpbmRWYWx1ZSgnOmNvbXBsZW1lbnRfYWRyZXNzZScsICRkYXRhWydjb21wbGVtZW50X2FkcmVzc2UnXSwgUERPOjpQQVJBTV9TVFIpOwogICAgJHN0bXQtPmJpbmRWYWx1ZSgnOmNvZGVfcG9zdGFsJywgJGRhdGFbJ2NvZGVfcG9zdGFsJ10sIFBETzo6UEFSQU1fU1RSKTsKICAgICRzdG10LT5iaW5kVmFsdWUoJzp2aWxsZScsICRkYXRhWyd2aWxsZSddLCBQRE86OlBBUkFNX1NUUik7CiAgICAkc3RtdC0+YmluZFZhbHVlKCc6ZXhwbGljYXRpb25zJywgJGRhdGFbJ2V4cGxpY2F0aW9ucyddLCBQRE86OlBBUkFNX1NUUik7CiAgICAkc3RtdC0+YmluZFZhbHVlKCc6bnVtZXJvX3VyZ2VuY2UnLCAkZGF0YVsnbnVtZXJvX3VyZ2VuY2UnXSwgUERPOjpQQVJBTV9TVFIpOwogICAgJHN0bXQtPmV4ZWN1dGUoKTsKICAgICRuZXdJZCA9IChpbnQpJHBkby0+bGFzdEluc2VydElkKCk7CiAgICByZXR1cm4gKCRuZXdJZCA+IDApID8gJG5ld0lkIDogbnVsbDsKfQoKZnVuY3Rpb24gdGVtcEFkZHJlc3NUb0FwaSg/YXJyYXkgJHJvdyk6ID9hcnJheQp7CiAgICBpZiAoIWlzX2FycmF5KCRyb3cpKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBbCiAgICAgICAgJ2lkJyA9PiAoaW50KSgkcm93WydpZCddID8/IDApLAogICAgICAgICdhZHJlc3NlJyA9PiAoc3RyaW5nKSgkcm93WydhZHJlc3NlJ10gPz8gJycpLAogICAgICAgICdjb21wbGVtZW50X2FkcmVzc2UnID0+IChzdHJpbmcpKCRyb3dbJ2NvbXBsZW1lbnRfYWRyZXNzZSddID8/ICcnKSwKICAgICAgICAnY29kZV9wb3N0YWwnID0+IChzdHJpbmcpKCRyb3dbJ2NvZGVfcG9zdGFsJ10gPz8gJycpLAogICAgICAgICd2aWxsZScgPT4gKHN0cmluZykoJHJvd1sndmlsbGUnXSA/PyAnJyksCiAgICAgICAgJ2V4cGxpY2F0aW9ucycgPT4gKHN0cmluZykoJHJvd1snZXhwbGljYXRpb25zJ10gPz8gJycpLAogICAgICAgICdudW1lcm9fdXJnZW5jZScgPT4gKHN0cmluZykoJHJvd1snbnVtZXJvX3VyZ2VuY2UnXSA/PyAnJyksCiAgICAgICAgJ2xhdGl0dWRlJyA9PiBpc3NldCgkcm93WydsYXRpdHVkZSddKSA/IChzdHJpbmcpJHJvd1snbGF0aXR1ZGUnXSA6ICcnLAogICAgICAgICdsb25naXR1ZGUnID0+IGlzc2V0KCRyb3dbJ2xvbmdpdHVkZSddKSA/IChzdHJpbmcpJHJvd1snbG9uZ2l0dWRlJ10gOiAnJywKICAgIF07Cn0KCmZ1bmN0aW9uIHRlbXBBZGRyZXNzRnJvbUNsaWVudCg/YXJyYXkgJGNsaWVudCk6ID9hcnJheQp7CiAgICBpZiAoIWlzX2FycmF5KCRjbGllbnQpKSByZXR1cm4gbnVsbDsKICAgICRhZHJlc3NlID0gdGVtcEFkZHJlc3NDbGVhblN0cmluZygkY2xpZW50WydhZHJlc3NlJ10gPz8gJycsIDE5MCk7CiAgICAkY29kZVBvc3RhbCA9IHRlbXBBZGRyZXNzQ2xlYW5TdHJpbmcoJGNsaWVudFsnY29kZV9wb3N0YWwnXSA/PyAnJywgMjApOwogICAgJHZpbGxlID0gdGVtcEFkZHJlc3NDbGVhblN0cmluZygkY2xpZW50Wyd2aWxsZSddID8/ICcnLCAxMjApOwogICAgaWYgKCRhZHJlc3NlID09PSAnJyB8fCAkY29kZVBvc3RhbCA9PT0gJycgfHwgJHZpbGxlID09PSAnJykgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gWwogICAgICAgICdhZHJlc3NlJyA9PiAkYWRyZXNzZSwKICAgICAgICAnY29tcGxlbWVudF9hZHJlc3NlJyA9PiB0ZW1wQWRkcmVzc0NsZWFuU3RyaW5nKCRjbGllbnRbJ2NvbXBsZW1lbnRfYWRyZXNzZSddID8/ICcnLCAxOTApLAogICAgICAgICdjb2RlX3Bvc3RhbCcgPT4gJGNvZGVQb3N0YWwsCiAgICAgICAgJ3ZpbGxlJyA9PiAkdmlsbGUsCiAgICAgICAgJ2V4cGxpY2F0aW9ucycgPT4gJycsCiAgICAgICAgJ251bWVyb191cmdlbmNlJyA9PiAnJywKICAgICAgICAnbGF0aXR1ZGUnID0+IGlzc2V0KCRjbGllbnRbJ2xhdGl0dWRlJ10pID8gKHN0cmluZykkY2xpZW50WydsYXRpdHVkZSddIDogJycsCiAgICAgICAgJ2xvbmdpdHVkZScgPT4gaXNzZXQoJGNsaWVudFsnbG9uZ2l0dWRlJ10pID8gKHN0cmluZykkY2xpZW50Wydsb25naXR1ZGUnXSA6ICcnLAogICAgXTsKfQoKZnVuY3Rpb24gdGVtcEFkZHJlc3NSZXNvbHZlRWZmZWN0aXZlKD9hcnJheSAkY2xpZW50LCA/YXJyYXkgJHRlbXBBZGRyZXNzKTogP2FycmF5CnsKICAgICR0ZW1wQXBpID0gdGVtcEFkZHJlc3NUb0FwaSgkdGVtcEFkZHJlc3MpOwogICAgaWYgKGlzX2FycmF5KCR0ZW1wQXBpKSAmJiB0cmltKChzdHJpbmcpKCR0ZW1wQXBpWydhZHJlc3NlJ10gPz8gJycpKSAhPT0gJycpIHsKICAgICAgICByZXR1cm4gJHRlbXBBcGk7CiAgICB9CiAgICByZXR1cm4gdGVtcEFkZHJlc3NGcm9tQ2xpZW50KCRjbGllbnQpOwp9"
            }
        },
        {
            "path": "caisse-aqp/public/api/saveOrder.php",
            "kind": "file",
            "before": {
                "exists": true,
                "kind": "file",
                "size": 20587,
                "sha1": "e9f1c778f22bd49b9eb7df765398abde3dc879ee",
                "content_b64": "PD9waHAKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgovKiBkb2MtcHJvamVjdCB8IGNhaXNzZS1hcXAvcHVibGljL2FwaS9zYXZlT3JkZXIucGhwIHwgUmXDp29pdCwgdmFsaWRlIGV0IGVucmVnaXN0cmUgdW5lIGNvbW1hbmRlIGNhaXNzZSBlbiBiYXNlLCBwdWlzIGZpbGUgbGVzIHTDomNoZXMgZOKAmWltcHJlc3Npb24gZXQgZGUgU01TLCBhdmVjIHBlcnNpc3RhbmNlIGRlIGzigJlhZHJlc3NlIGRlIGxpdnJhaXNvbiBwcm92aXNvaXJlIHBvcnTDqWUgcGFyIGxhIGNvbW1hbmRlLCBjb250csO0bGUgc2VydmV1ciBkZXMgY291cGxlcyBjb2RlIHBvc3RhbCAvIHZpbGxlIGF1dG9yaXPDqXMgc2Vsb24gbGUgUERWIGxvcnNxdeKAmXVuZSBvcHRpb24gdmFsaWRlIGVzdCBjaG9pc2llLCBjb25zZXJ2YXRpb24gZXhwbGljaXRlIGRlcyB2YWxldXJzIGV4aXN0YW50ZXMgcXVhbmQgbGUgc8OpbGVjdGV1ciBjb21wb3NpdGUgbmUgZm91cm5pdCBhdWN1bmUgY29ycmVzcG9uZGFuY2UgZXhwbG9pdGFibGUsIGV0IHZhbGlkYXRpb24gYmxvcXVhbnRlIGRlIGxhIGZpZMOpbGl0w6kganVzdGUgYXZhbnQgZW5yZWdpc3RyZW1lbnQgZmluYWwgcG91ciBlbXDDqmNoZXIgdG91dGUgZG91YmxlIGNvbnNvbW1hdGlvbiBzdXIgbGEgam91cm7DqWUuIHwgRXhwb3NlOiByZXNwb25kLCBub3JtYWxpemVCb29sLCBzaG91bGRQcmVzZXJ2ZURlbGl2ZXJ5Q2l0eVBheWxvYWQsIGNvbXB1dGVEYXlCb3VuZHNNcywgY29tcHV0ZU5leHRJZERhdGUgfCBEw6lwZW5kIGRlOiBjb25maWcucGhwLCBfbGliL2NsaWVudFVwc2VydC5waHAsIF9saWIvcGF5TGluay5waHAsIF9saWIvcHJpbnRKb2JzLnBocCwgX2xpYi9zbXNRdWV1ZS5waHAsIF9saWIvZmlyc3ROYW1lc1Vwc2VydC5waHAsIF9saWIvdGVtcEFkZHJlc3MucGhwLCBfbGliL2RlbGl2ZXJ5Q2l0eUNob2ljZXMucGhwLCBsaWIvbG95YWx0eS5waHAgfCBJbXBhY3RlOiBCREQsIGZpbGUgZOKAmWltcHJlc3Npb24sIGZpbGUgU01TLCDDqXRhdCBkZSB0cmFuc2FjdGlvbiwgdmFsaWRhdGlvbiBtw6l0aWVyIGRlcyBhZHJlc3NlcyBjYWlzc2UsIGJsb2NhZ2Ugc2VydmV1ciBkZXMgY29uZmxpdHMgZmlkw6lsaXTDqSB8IFRhYmxlczogcG9zX2NvbW1hbmRlcyhfcGVsKSwgcG9zX3Bpenphc19jb21tYW5kZWVzKF9wZWwpLCBwb3NfbW9kaWZzX3BpenphcyhfcGVsKSwgcG9zX3Bpenphcywgc3RkX2NsaWVudHMsIHBvc19saXN0ZV9wcmVub21zLCBwb3NfdGVtcF9hZHJlc3NlcyAqLwoKaGVhZGVyKCdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgnKTsKLy8gTmV2ZXIgY2FjaGUgd3JpdGVzCmhlYWRlcignQ2FjaGUtQ29udHJvbDogbm8tc3RvcmUsIG5vLWNhY2hlLCBtdXN0LXJldmFsaWRhdGUsIG1heC1hZ2U9MCcpOwpoZWFkZXIoJ1ByYWdtYTogbm8tY2FjaGUnKTsKaGVhZGVyKCdFeHBpcmVzOiAwJyk7CgpmdW5jdGlvbiByZXNwb25kKGludCAkY29kZSwgYXJyYXkgJHBheWxvYWQpOiB2b2lkIHsKICBodHRwX3Jlc3BvbnNlX2NvZGUoJGNvZGUpOwogIGVjaG8ganNvbl9lbmNvZGUoJHBheWxvYWQsIEpTT05fVU5FU0NBUEVEX1VOSUNPREUgfCBKU09OX1VORVNDQVBFRF9TTEFTSEVTKTsKICBleGl0Owp9CgovKioKICogTm9ybWFsaXplIG1peGVkIEpTT04gaW5wdXRzIHRvIGJvb2xlYW4uCiAqIEFjY2VwdHMgYm9vbCwgMC8xLCAidHJ1ZSIvImZhbHNlIiwgIm9uIi8ib2ZmIi4KICovCmZ1bmN0aW9uIG5vcm1hbGl6ZUJvb2woJHYpOiBib29sIHsKICBpZiAoaXNfYm9vbCgkdikpIHJldHVybiAkdjsKICBpZiAoaXNfaW50KCR2KSB8fCBpc19mbG9hdCgkdikpIHJldHVybiAoKGludCkkdikgPT09IDE7CiAgJHMgPSBzdHJ0b2xvd2VyKHRyaW0oKHN0cmluZykoJHYgPz8gJycpKSk7CiAgaWYgKCRzID09PSAnMScgfHwgJHMgPT09ICd0cnVlJyB8fCAkcyA9PT0gJ29uJyB8fCAkcyA9PT0gJ3llcycpIHJldHVybiB0cnVlOwogIHJldHVybiBmYWxzZTsKfQoKZnVuY3Rpb24gc2hvdWxkUHJlc2VydmVEZWxpdmVyeUNpdHlQYXlsb2FkKCRwYXlsb2FkKTogYm9vbCB7CiAgJHNyYyA9IGlzX2FycmF5KCRwYXlsb2FkKSA/ICRwYXlsb2FkIDogW107CiAgcmV0dXJuIG5vcm1hbGl6ZUJvb2woJHNyY1snZGVsaXZlcnlDaXR5Q2hvaWNlUHJlc2VydmVFeGlzdGluZyddID8/IGZhbHNlKTsKfQoKZnVuY3Rpb24gY29tcHV0ZURheUJvdW5kc01zKHN0cmluZyAkZGF0ZU9ubHksIERhdGVUaW1lWm9uZSAkdHopOiBhcnJheSB7CiAgJGRheSA9IERhdGVUaW1lSW1tdXRhYmxlOjpjcmVhdGVGcm9tRm9ybWF0KCdZLW0tZCcsICRkYXRlT25seSwgJHR6KTsKICBpZiAoISRkYXkpIHJldHVybiBbMCwgMF07CiAgJHN0YXJ0ID0gJGRheS0+c2V0VGltZSgwLCAwLCAwKTsKICAkZW5kICAgPSAkZGF5LT5zZXRUaW1lKDIzLCA1OSwgNTkpOwogICRzdGFydE1zID0gKChpbnQpJHN0YXJ0LT5mb3JtYXQoJ1UnKSkgKiAxMDAwOwogICRlbmRNcyAgID0gKChpbnQpJGVuZC0+Zm9ybWF0KCdVJykpICogMTAwMCArIDk5OTsKICByZXR1cm4gWyRzdGFydE1zLCAkZW5kTXNdOwp9CgpmdW5jdGlvbiBjb21wdXRlTmV4dElkRGF0ZShQRE8gJHBkbywgc3RyaW5nICR0YWJsZU9yZGVycywgaW50ICRzdGFydE1zLCBpbnQgJGVuZE1zKTogaW50IHsKICAkc3FsID0gIlNFTEVDVCBNQVgoaWRfZGF0ZSkgQVMgbWF4X2lkX2RhdGUKICAgICAgICAgIEZST00geyR0YWJsZU9yZGVyc30KICAgICAgICAgIFdIRVJFIChzdGF0dXQgSVMgTlVMTCBPUiBzdGF0dXQgPD4gJ2RlbGV0ZWQnKQogICAgICAgICAgICBBTkQgaGV1cmVfcHJlcGEgQkVUV0VFTiA6c3RhcnRNcyBBTkQgOmVuZE1zIjsKICAkc3RtdCA9ICRwZG8tPnByZXBhcmUoJHNxbCk7CiAgJHN0bXQtPmJpbmRWYWx1ZSgnOnN0YXJ0TXMnLCAkc3RhcnRNcywgUERPOjpQQVJBTV9JTlQpOwogICRzdG10LT5iaW5kVmFsdWUoJzplbmRNcycsICRlbmRNcywgUERPOjpQQVJBTV9JTlQpOwogICRzdG10LT5leGVjdXRlKCk7CiAgJHJvdyA9ICRzdG10LT5mZXRjaChQRE86OkZFVENIX0FTU09DKSA/OiBbXTsKICAkbWF4ID0gaXNzZXQoJHJvd1snbWF4X2lkX2RhdGUnXSkgPyAoaW50KSRyb3dbJ21heF9pZF9kYXRlJ10gOiAwOwogICRuZXh0ID0gJG1heCArIDE7CiAgcmV0dXJuICgkbmV4dCA+IDApID8gJG5leHQgOiAxOwp9CgovLyBMb2FkIFBETyBmcm9tIHByb2plY3Qgcm9vdCBjb25maWcucGhwCkByZXF1aXJlX29uY2UgX19ESVJfXyAuICcvLi4vLi4vY29uZmlnLnBocCc7CkByZXF1aXJlX29uY2UgX19ESVJfXyAuICcvX2xpYi9jbGllbnRVcHNlcnQucGhwJzsKQHJlcXVpcmVfb25jZSBfX0RJUl9fIC4gJy9fbGliL3BheUxpbmsucGhwJzsKQHJlcXVpcmVfb25jZSBfX0RJUl9fIC4gJy9fbGliL3ByaW50Sm9icy5waHAnOwpAcmVxdWlyZV9vbmNlIF9fRElSX18gLiAnL19saWIvc21zUXVldWUucGhwJzsKQHJlcXVpcmVfb25jZSBfX0RJUl9fIC4gJy9fbGliL2ZpcnN0TmFtZXNVcHNlcnQucGhwJzsKQHJlcXVpcmVfb25jZSBfX0RJUl9fIC4gJy9fbGliL3RlbXBBZGRyZXNzLnBocCc7CkByZXF1aXJlX29uY2UgX19ESVJfXyAuICcvX2xpYi9kZWxpdmVyeUNpdHlDaG9pY2VzLnBocCc7CkByZXF1aXJlX29uY2UgX19ESVJfXyAuICcvbGliL2xveWFsdHkucGhwJzsKCmlmICghaXNzZXQoJHBkbykgfHwgISgkcGRvIGluc3RhbmNlb2YgUERPKSkgewogIHJlc3BvbmQoNTAwLCBbJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnREIgbm90IGNvbmZpZ3VyZWQnXSk7Cn0KCiRyYXcgPSBmaWxlX2dldF9jb250ZW50cygncGhwOi8vaW5wdXQnKTsKJGpzb24gPSBpc19zdHJpbmcoJHJhdykgPyBqc29uX2RlY29kZSgkcmF3LCB0cnVlKSA6IG51bGw7CmlmICghaXNfYXJyYXkoJGpzb24pKSB7CiAgcmVzcG9uZCg0MDAsIFsnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdJbnZhbGlkIEpTT04nXSk7Cn0KCiRzdG9yZSA9IGlzc2V0KCRqc29uWydzdG9yZSddKSA/IChzdHJpbmcpJGpzb25bJ3N0b3JlJ10gOiAnJzsKaWYgKCFwcmVnX21hdGNoKCcvXihsYW58cGVsKSQvJywgJHN0b3JlKSkgewogIHJlc3BvbmQoNDAwLCBbJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnSW52YWxpZCBzdG9yZSddKTsKfQoKLy8gVUkgZmxhZyAoZnV0dXJlIFNNUyBkZWNpc2lvbikg4oCUIGN1cnJlbnRseSBuby1vcCAobm8gREIgd3JpdGUpLgokbW9kaWZDb21tYW5kZSA9IG5vcm1hbGl6ZUJvb2woJGpzb25bJ21vZGlmX2NvbW1hbmRlJ10gPz8gZmFsc2UpOwppZiAoJG1vZGlmQ29tbWFuZGUpIGVycm9yX2xvZygiW3NhdmVPcmRlcl0gbW9kaWZfY29tbWFuZGU9dHJ1ZSBzdG9yZT17JHN0b3JlfSIpOwoKLy8gU3RvcmUtc3BlY2lmaWMgdGFibGVzIChzdHJpY3Qgd2hpdGVsaXN0KQokdGFibGVPcmRlcnMgPSAoJHN0b3JlID09PSAncGVsJykgPyAncG9zX2NvbW1hbmRlc19wZWwnIDogJ3Bvc19jb21tYW5kZXMnOwokdGFibGVMaW5lcyAgPSAoJHN0b3JlID09PSAncGVsJykgPyAncG9zX3Bpenphc19jb21tYW5kZWVzX3BlbCcgOiAncG9zX3Bpenphc19jb21tYW5kZWVzJzsKJGNvbE9yZGVyRmsgID0gKCRzdG9yZSA9PT0gJ3BlbCcpID8gJ2lkX3Bvc19jb21tYW5kZXNfcGVsJyA6ICdpZF9wb3NfY29tbWFuZGVzJzsKJHRhYmxlTW9kaWZzID0gKCRzdG9yZSA9PT0gJ3BlbCcpID8gJ3Bvc19tb2RpZnNfcGl6emFzX3BlbCcgOiAncG9zX21vZGlmc19waXp6YXMnOwokY29sTGluZUZrICAgPSAoJHN0b3JlID09PSAncGVsJykgPyAnaWRfcG9zX3Bpenphc19jb21tYW5kZWVzX3BlbCcgOiAnaWRfcG9zX3Bpenphc19jb21tYW5kZWVzJzsKCi8vIElucHV0IGZpZWxkcwokZGF0ZUlTTyA9IGlzc2V0KCRqc29uWydkYXRlSVNPJ10pID8gKHN0cmluZykkanNvblsnZGF0ZUlTTyddIDogJyc7CiRpZERhdGVSYXcgPSAkanNvblsnaWRfZGF0ZSddID8/IG51bGw7CiRoZXVyZUhITU0gPSBpc3NldCgkanNvblsnaGV1cmVfcHJlcGFfaGhtbSddKSA/IChzdHJpbmcpJGpzb25bJ2hldXJlX3ByZXBhX2hobW0nXSA6ICcnOwokaGV1cmVNc1JhdyA9ICRqc29uWydoZXVyZV9wcmVwYV9tcyddID8/IG51bGw7CgokY291cGUgPSBpc3NldCgkanNvblsnY291cGUnXSkgPyAoaW50KSRqc29uWydjb3VwZSddIDogMDsKJGxpdnJhaXNvbiA9IGlzc2V0KCRqc29uWydsaXZyYWlzb24nXSkgPyAoaW50KSRqc29uWydsaXZyYWlzb24nXSA6IDA7CiRpZENsaWVudCA9IGlzc2V0KCRqc29uWydpZF9jbGllbnQnXSkgPyAoaW50KSRqc29uWydpZF9jbGllbnQnXSA6IDA7CiRwaG9uZVJhdyA9IGlzc2V0KCRqc29uWydwaG9uZU51bWJlciddKSA/IChzdHJpbmcpJGpzb25bJ3Bob25lTnVtYmVyJ10gOiAnJzsKJHRvUHJpbnQgPSBpc3NldCgkanNvblsndG9fcHJpbnQnXSkgPyAoaW50KSRqc29uWyd0b19wcmludCddIDogMDsKJGNsaWVudFBheWxvYWQgPSAkanNvblsnY2xpZW50J10gPz8gbnVsbDsKCiR0ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MgPSAoaXNzZXQoJGpzb25bJ3RlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcyddKSAmJiBpc19hcnJheSgkanNvblsndGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzJ10pKQogID8gJGpzb25bJ3RlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcyddCiAgOiBudWxsOwoKJGl0ZW1zID0gJGpzb25bJ2l0ZW1zJ10gPz8gbnVsbDsKaWYgKCFpc19hcnJheSgkaXRlbXMpIHx8IGNvdW50KCRpdGVtcykgPT09IDApIHsKICByZXNwb25kKDQwMCwgWydvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ1BhbmllciB2aWRlJ10pOwp9CgovLyBWYWxpZGF0ZSBkYXRlX29ubHkKJHR6ID0gbmV3IERhdGVUaW1lWm9uZSgnRXVyb3BlL1BhcmlzJyk7CiRkYXRlT25seSA9IG51bGw7CmlmIChpc19zdHJpbmcoJGRhdGVJU08pICYmIHByZWdfbWF0Y2goJy9eXGR7NH0tXGR7Mn0tXGR7Mn0kLycsICRkYXRlSVNPKSkgewogICRkID0gRGF0ZVRpbWVJbW11dGFibGU6OmNyZWF0ZUZyb21Gb3JtYXQoJ1ktbS1kJywgJGRhdGVJU08sICR0eik7CiAgaWYgKCRkIGluc3RhbmNlb2YgRGF0ZVRpbWVJbW11dGFibGUpICRkYXRlT25seSA9ICRkLT5mb3JtYXQoJ1ktbS1kJyk7Cn0KaWYgKCRkYXRlT25seSA9PT0gbnVsbCkgewogICRkYXRlT25seSA9IChuZXcgRGF0ZVRpbWVJbW11dGFibGUoJ25vdycsICR0eikpLT5mb3JtYXQoJ1ktbS1kJyk7Cn0KCi8vIGlkX2RhdGUgaXMgYXNzaWduZWQgc2VydmVyLXNpZGUgKG5leHQgYXZhaWxhYmxlIGZvciB0aGUgY29tcHV0ZWQgZGF5KQokaWREYXRlID0gaXNfbnVtZXJpYygkaWREYXRlUmF3KSA/IChpbnQpJGlkRGF0ZVJhdyA6IDA7CgovLyBWYWxpZGF0ZSBoZXVyZV9wcmVwYSAoZXBvY2ggbXMgb3IgSEg6TU0pCiRoZXVyZVByZXBhTXMgPSBudWxsOwppZiAoaXNfbnVtZXJpYygkaGV1cmVNc1JhdykpIHsKICAkbXMgPSAoaW50KSRoZXVyZU1zUmF3OwogIGlmICgkbXMgPiAwKSAkaGV1cmVQcmVwYU1zID0gJG1zOwp9CmlmICgkaGV1cmVQcmVwYU1zID09PSBudWxsKSB7CiAgaWYgKCFwcmVnX21hdGNoKCcvXlxkezJ9OlxkezJ9JC8nLCAkaGV1cmVISE1NKSkgewogICAgcmVzcG9uZCg0MDAsIFsnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdDaG9pc2lyIHVuIGNyw6luZWF1J10pOwogIH0KICAvLyBCdWlsZCB0aW1lc3RhbXAgZnJvbSBzZWxlY3RlZCBkYXRlICsgSEg6TU0gaW4gRXVyb3BlL1BhcmlzCiAgJGR0ID0gRGF0ZVRpbWVJbW11dGFibGU6OmNyZWF0ZUZyb21Gb3JtYXQoJ1ktbS1kIEg6aScsICRkYXRlT25seSAuICcgJyAuICRoZXVyZUhITU0sICR0eik7CiAgaWYgKCEkZHQpIHsKICAgIHJlc3BvbmQoNDAwLCBbJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnSW52YWxpZCBoZXVyZV9wcmVwYSddKTsKICB9CiAgJGhldXJlUHJlcGFNcyA9ICgoaW50KSRkdC0+Zm9ybWF0KCdVJykpICogMTAwMDsKfQoKLy8gQ29tcHV0ZSBuZXh0IGlkX2RhdGUgZm9yIHRoZSBkYXkgZGVyaXZlZCBmcm9tIGhldXJlX3ByZXBhL2RhdGVPbmx5IChzdG9yZS1zcGVjaWZpYyB0YWJsZSkKdHJ5IHsKICBbJGRheVN0YXJ0TXMsICRkYXlFbmRNc10gPSBjb21wdXRlRGF5Qm91bmRzTXMoJGRhdGVPbmx5LCAkdHopOwogIGlmICgkZGF5U3RhcnRNcyA8PSAwIHx8ICRkYXlFbmRNcyA8PSAwKSB7CiAgICByZXNwb25kKDQwMCwgWydvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ0ludmFsaWQgZGF0ZV9vbmx5J10pOwogIH0KICAkaWREYXRlID0gY29tcHV0ZU5leHRJZERhdGUoJHBkbywgJHRhYmxlT3JkZXJzLCAkZGF5U3RhcnRNcywgJGRheUVuZE1zKTsKfSBjYXRjaCAoVGhyb3dhYmxlICRlKSB7CiAgZXJyb3JfbG9nKCJbc2F2ZU9yZGVyXSBjb21wdXRlTmV4dElkRGF0ZSBmYWlsZWQgc3RvcmU9eyRzdG9yZX0gZGF0ZU9ubHk9eyRkYXRlT25seX0gZXJyPSIgLiAkZS0+Z2V0TWVzc2FnZSgpKTsKICByZXNwb25kKDUwMCwgWydvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ1NlcnZlciBlcnJvciddKTsKfQoKLy8gTm9ybWFsaXplIGZsYWdzCiRjb3VwZSA9ICgkY291cGUgPT09IDEpID8gMSA6IDA7CiRsaXZyYWlzb24gPSAoJGxpdnJhaXNvbiA9PT0gMSkgPyAxIDogMDsKJHRvUHJpbnQgPSAoJHRvUHJpbnQgPT09IDEpID8gMSA6IDA7CmlmICgkbGl2cmFpc29uICE9PSAxKSAkdGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzID0gbnVsbDsKCmlmICgkbGl2cmFpc29uID09PSAxICYmIGlzX2FycmF5KCRjbGllbnRQYXlsb2FkKSAmJiAhc2hvdWxkUHJlc2VydmVEZWxpdmVyeUNpdHlQYXlsb2FkKCRjbGllbnRQYXlsb2FkKSkgewogICRub3JtYWxpemVkQ2xpZW50UGF5bG9hZCA9IGNhaXNzZU5vcm1hbGl6ZURlbGl2ZXJ5Q2l0eVBheWxvYWQoJGNsaWVudFBheWxvYWQsICRzdG9yZSwgJ3ZpbGxlJywgJ2NvZGVfcG9zdGFsJyk7CiAgaWYgKGVtcHR5KCRub3JtYWxpemVkQ2xpZW50UGF5bG9hZFsnb2snXSkgfHwgIWlzX2FycmF5KCRub3JtYWxpemVkQ2xpZW50UGF5bG9hZFsncGF5bG9hZCddKSkgewogICAgcmVzcG9uZCg0MDAsIFsKICAgICAgJ29rJyA9PiBmYWxzZSwKICAgICAgJ2Vycm9yJyA9PiAnZGVsaXZlcnlfY2l0eV9ub3RfYWxsb3dlZCcsCiAgICAgICd0YXJnZXQnID0+ICdjbGllbnQnLAogICAgICAnbWVzc2FnZScgPT4gJ0FkcmVzc2UgY2xpZW50IDogdmlsbGUgLyBjb2RlIHBvc3RhbCBub24gYXV0b3Jpc8OpcyBwb3VyIGNlIHBvaW50IGRlIHZlbnRlLicsCiAgICBdKTsKICB9CiAgJGNsaWVudFBheWxvYWQgPSAkbm9ybWFsaXplZENsaWVudFBheWxvYWRbJ3BheWxvYWQnXTsKfQoKaWYgKCRsaXZyYWlzb24gPT09IDEgJiYgaXNfYXJyYXkoJHRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcykgJiYgIXNob3VsZFByZXNlcnZlRGVsaXZlcnlDaXR5UGF5bG9hZCgkdGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzKSkgewogICRub3JtYWxpemVkVGVtcG9yYXJ5QWRkcmVzcyA9IGNhaXNzZU5vcm1hbGl6ZURlbGl2ZXJ5Q2l0eVBheWxvYWQoJHRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcywgJHN0b3JlLCAndmlsbGUnLCAnY29kZV9wb3N0YWwnKTsKICBpZiAoZW1wdHkoJG5vcm1hbGl6ZWRUZW1wb3JhcnlBZGRyZXNzWydvayddKSB8fCAhaXNfYXJyYXkoJG5vcm1hbGl6ZWRUZW1wb3JhcnlBZGRyZXNzWydwYXlsb2FkJ10pKSB7CiAgICByZXNwb25kKDQwMCwgWwogICAgICAnb2snID0+IGZhbHNlLAogICAgICAnZXJyb3InID0+ICdkZWxpdmVyeV9jaXR5X25vdF9hbGxvd2VkJywKICAgICAgJ3RhcmdldCcgPT4gJ3RlbXBvcmFyeV9kZWxpdmVyeV9hZGRyZXNzJywKICAgICAgJ21lc3NhZ2UnID0+ICdBZHJlc3NlIHByb3Zpc29pcmUgOiB2aWxsZSAvIGNvZGUgcG9zdGFsIG5vbiBhdXRvcmlzw6lzIHBvdXIgY2UgcG9pbnQgZGUgdmVudGUuJywKICAgIF0pOwogIH0KICAkdGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzID0gJG5vcm1hbGl6ZWRUZW1wb3JhcnlBZGRyZXNzWydwYXlsb2FkJ107Cn0KCi8vIFByZXBhcmUgaXRlbXM6IHZhbGlkYXRlIGlkcyBhbmQgY29tcHV0ZSB0b3RhbHMgdXNpbmcgREIgcHJpY2VzCiRwb3NJZHMgPSBbXTsKJG5vcm1JdGVtcyA9IFtdOwokbmJyUGl6emFzID0gMDsKZm9yZWFjaCAoJGl0ZW1zIGFzICRpdCkgewogIGlmICghaXNfYXJyYXkoJGl0KSkgY29udGludWU7CiAgJHBpZCA9IGlzc2V0KCRpdFsnaWRfcG9zX3BpenphcyddKSA/IChpbnQpJGl0WydpZF9wb3NfcGl6emFzJ10gOiAwOwogIGlmICgkcGlkIDw9IDApIHJlc3BvbmQoNDAwLCBbJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnSW52YWxpZCBpdGVtIGlkX3Bvc19waXp6YXMnXSk7CiAgJGRhdGFJZCA9IGlzc2V0KCRpdFsnZGF0YV9pZCddKSA/IHRyaW0oKHN0cmluZykkaXRbJ2RhdGFfaWQnXSkgOiAnJzsKICBpZiAoJGRhdGFJZCA9PT0gJycpIHJlc3BvbmQoNDAwLCBbJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnSW52YWxpZCBpdGVtIGRhdGFfaWQnXSk7CgogICRjbHMgPSBpc3NldCgkaXRbJ2NsYXNzJ10pID8gc3RydG9sb3dlcih0cmltKChzdHJpbmcpJGl0WydjbGFzcyddKSkgOiAnJzsKICBpZiAoJGNscyA9PT0gJ3BpenphJykgJG5iclBpenphcyArPSAxOwoKICAkbW9kaWZzID0gJGl0Wydtb2RpZnMnXSA/PyBbXTsKICBpZiAoIWlzX2FycmF5KCRtb2RpZnMpKSAkbW9kaWZzID0gW107CgogICRub3JtSXRlbXNbXSA9IFsKICAgICdpZF9wb3NfcGl6emFzJyA9PiAkcGlkLAogICAgJ2RhdGFfaWQnID0+ICRkYXRhSWQsCiAgICAnY2xhc3MnID0+ICRjbHMsCiAgICAnbW9kaWZzJyA9PiAkbW9kaWZzLAogIF07CiAgJHBvc0lkc1skcGlkXSA9IHRydWU7Cn0KaWYgKGNvdW50KCRub3JtSXRlbXMpID09PSAwKSB7CiAgcmVzcG9uZCg0MDAsIFsnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdQYW5pZXIgdmlkZSddKTsKfQoKLy8gTG9hZCBiYXNlIHByaWNlcyBmcm9tIHBvc19waXp6YXMKJGlkcyA9IGFycmF5X2tleXMoJHBvc0lkcyk7CiRwbGFjZWhvbGRlcnMgPSBpbXBsb2RlKCcsJywgYXJyYXlfZmlsbCgwLCBjb3VudCgkaWRzKSwgJz8nKSk7CiRwcmljZUJ5SWQgPSBbXTsKdHJ5IHsKICAkc3RtdFAgPSAkcGRvLT5wcmVwYXJlKCJTRUxFQ1QgaWQsIHByaWNlX2xhcmdlIEZST00gcG9zX3BpenphcyBXSEVSRSBpZCBJTiAoJHBsYWNlaG9sZGVycykiKTsKICBmb3JlYWNoICgkaWRzIGFzICRpID0+ICRwaWQpIHsKICAgICRzdG10UC0+YmluZFZhbHVlKCRpICsgMSwgKGludCkkcGlkLCBQRE86OlBBUkFNX0lOVCk7CiAgfQogICRzdG10UC0+ZXhlY3V0ZSgpOwogIHdoaWxlICgkcm93ID0gJHN0bXRQLT5mZXRjaChQRE86OkZFVENIX0FTU09DKSkgewogICAgJHJpZCA9IGlzc2V0KCRyb3dbJ2lkJ10pID8gKGludCkkcm93WydpZCddIDogMDsKICAgICRwciA9IGlzc2V0KCRyb3dbJ3ByaWNlX2xhcmdlJ10pID8gKGZsb2F0KSRyb3dbJ3ByaWNlX2xhcmdlJ10gOiAwLjA7CiAgICBpZiAoJHJpZCA+IDApICRwcmljZUJ5SWRbJHJpZF0gPSAkcHI7CiAgfQp9IGNhdGNoIChUaHJvd2FibGUgJGUpIHsKICBlcnJvcl9sb2coIltzYXZlT3JkZXJdIGxvYWQgcHJpY2VzIGZhaWxlZCBzdG9yZT17JHN0b3JlfSBlcnI9IiAuICRlLT5nZXRNZXNzYWdlKCkpOwogIHJlc3BvbmQoNTAwLCBbJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnU2VydmVyIGVycm9yJ10pOwp9CgovLyBDb21wdXRlIHRvdGFsIGluIGNlbnRzIChiYXNlICsgbW9kaWZzIGZvciBwaXp6YXMpCiR0b3RhbENlbnRzID0gMDsKZm9yZWFjaCAoJG5vcm1JdGVtcyBhcyAkaXQpIHsKICAkcGlkID0gKGludCkkaXRbJ2lkX3Bvc19waXp6YXMnXTsKICBpZiAoIWFycmF5X2tleV9leGlzdHMoJHBpZCwgJHByaWNlQnlJZCkpIHsKICAgIHJlc3BvbmQoNDAwLCBbJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnVW5rbm93biBwb3NfcGl6emFzIGlkOiAnIC4gJHBpZF0pOwogIH0KICAkYmFzZSA9IChmbG9hdCkkcHJpY2VCeUlkWyRwaWRdOwogICR0b3RhbENlbnRzICs9IChpbnQpcm91bmQoJGJhc2UgKiAxMDApOwoKICBpZiAoJGl0WydjbGFzcyddID09PSAncGl6emEnICYmIGlzX2FycmF5KCRpdFsnbW9kaWZzJ10pKSB7CiAgICBmb3JlYWNoICgkaXRbJ21vZGlmcyddIGFzICRtKSB7CiAgICAgIGlmICghaXNfYXJyYXkoJG0pKSBjb250aW51ZTsKICAgICAgJGRwID0gJG1bJ2RhdGFfcHJpY2UnXSA/PyAwOwogICAgICAkbiA9IGlzX251bWVyaWMoJGRwKSA/IChmbG9hdCkkZHAgOiAwLjA7CiAgICAgICR0b3RhbENlbnRzICs9IChpbnQpcm91bmQoJG4gKiAxMDApOwogICAgfQogIH0KfQokcHJpeENvbSA9ICR0b3RhbENlbnRzIC8gMTAwLjA7CiRwcml4Q29tU3RyID0gbnVtYmVyX2Zvcm1hdCgkcHJpeENvbSwgMiwgJy4nLCAnJyk7Cgp0cnkgewogICRwZG8tPmJlZ2luVHJhbnNhY3Rpb24oKTsKCiAgLy8gVXBzZXJ0IGNsaWVudCBpbnNpZGUgdHJhbnNhY3Rpb24gKGNsaWVudCAtPiBvcmRlciAtPiBsaW5lcykKICBpZiAodHJpbSgkcGhvbmVSYXcpID09PSAnJykgewogICAgJHBkby0+cm9sbEJhY2soKTsKICAgIHJlc3BvbmQoNDAwLCBbJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnTWlzc2luZyBwaG9uZU51bWJlciAoY2xpZW50IHJlcXVpcmVkKSddKTsKICB9CiAgJHVwc2VydGVkSWQgPSB1cHNlcnRDbGllbnRGcm9tUGF5bG9hZCgkcGRvLCAkcGhvbmVSYXcsICRjbGllbnRQYXlsb2FkLCAkc3RvcmUpOwogIGlmICgkdXBzZXJ0ZWRJZCA8PSAwKSB7CiAgICAkcGRvLT5yb2xsQmFjaygpOwogICAgcmVzcG9uZCg1MDAsIFsnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdVbmFibGUgdG8gcmVzb2x2ZSBjbGllbnQnXSk7CiAgfQogICRpZENsaWVudCA9ICR1cHNlcnRlZElkOwogICR0ZW1wQWRkcmVzc0lkID0gdGVtcEFkZHJlc3NQZXJzaXN0KCRwZG8sICR0ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MsIG51bGwsICRzdG9yZSk7CgogIC8vIEF1dG8tbGVhcm4gZmlyc3QgbmFtZSAoZmFpbC1zYWZlKTogYWRkIHRvIHBvc19saXN0ZV9wcmVub21zIGlmIG1pc3NpbmcuCiAgaWYgKGZ1bmN0aW9uX2V4aXN0cygncmVtZW1iZXJGaXJzdE5hbWVGcm9tQ2xpZW50SWQnKSkgewogICAgdHJ5IHsKICAgICAgcmVtZW1iZXJGaXJzdE5hbWVGcm9tQ2xpZW50SWQoJHBkbywgJGlkQ2xpZW50KTsKICAgIH0gY2F0Y2ggKFRocm93YWJsZSAkZUZuKSB7CiAgICAgIC8vIEZhaWwtc2FmZTogbmV2ZXIgYmxvY2sgb3JkZXIgc2F2ZSBvbiBmaXJzdC1uYW1lIGxlYXJuaW5nIGlzc3Vlcy4KICAgICAgZXJyb3JfbG9nKCJbc2F2ZU9yZGVyXSBmaXJzdE5hbWUgdXBzZXJ0IHNraXBwZWQgKGZhaWwtc2FmZSkgc3RvcmU9eyRzdG9yZX0gY2xpZW50X2lkPXskaWRDbGllbnR9IGVycj0iIC4gJGVGbi0+Z2V0TWVzc2FnZSgpKTsKICAgIH0KICB9CgogIC8vIEdlbmVyYXRlIHBheUxpbmsgKyB2ZXJpZl9jb2RlIGluc2lkZSB0aGUgc2FtZSB0cmFuc2FjdGlvbiAoYmVmb3JlIElOU0VSVCBvcmRlcikKICAvLyBOT1RFOiBwYXlMaW5rIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgc3RvcmUtc3BlY2lmaWMgb3JkZXJzIHRhYmxlLgogICRwYXlMaW5rID0gZ2VuZXJhdGVVbmlxdWVQYXlMaW5rSWRGb3JUYWJsZSgkcGRvLCAkdGFibGVPcmRlcnMpOwogICR2ZXJpZkNvZGUgPSBnZW5lcmF0ZVZlcmlmaWNhdGlvbkNvZGUoKTsKCiAgLy8gSW5zZXJ0IGNvbW1hbmRlCiAgJHNxbE8gPSAiSU5TRVJUIElOVE8geyR0YWJsZU9yZGVyc30gKAogICAgZGF0ZV9jb20sCiAgICBkYXRlX29ubHksCiAgICBpZF9kYXRlLAogICAgaWRfY2xpZW50LAogICAgc3RhdHV0LAogICAgaGV1cmVfcHJlcGEsCiAgICBjb3VwZSwKICAgIGxpdnJhaXNvbiwKICAgIG5icl9waXp6YXMsCiAgICBwcml4X2NvbSwKICAgIHN0YXR1dFNtcywKICAgIHNtc1JldGFyZCwKICAgIHNtc1ByZXBhLAogICAgcGF5TGluaywKICAgIHZlcmlmX2NvZGUsCiAgICBhZHJlc3NlX3RlbXBvcmFpcmUsCiAgICBpc19vbmxpbmUsCiAgICBuZWVkX2FjY291bnQsCiAgICB0b19wcmludCwKICAgIGFjY291bnRfdG9fcHJpbnQKICApIFZBTFVFUyAoCiAgICA6ZGF0ZV9jb20sCiAgICA6ZGF0ZV9vbmx5LAogICAgOmlkX2RhdGUsCiAgICA6aWRfY2xpZW50LAogICAgJ3BlbmRpbmcnLAogICAgOmhldXJlX3ByZXBhLAogICAgOmNvdXBlLAogICAgOmxpdnJhaXNvbiwKICAgIDpuYnJfcGl6emFzLAogICAgOnByaXhfY29tLAogICAgMSwKICAgIDAsCiAgICAwLAogICAgOnBheUxpbmssCiAgICA6dmVyaWZfY29kZSwKICAgIDphZHJlc3NlX3RlbXBvcmFpcmUsCiAgICAwLAogICAgMCwKICAgIDp0b19wcmludCwKICAgIDAKICApIjsKCiAgJG5vdyA9IG5ldyBEYXRlVGltZUltbXV0YWJsZSgnbm93JywgJHR6KTsKICAkc3RtdE8gPSAkcGRvLT5wcmVwYXJlKCRzcWxPKTsKICAkc3RtdE8tPmJpbmRWYWx1ZSgnOmRhdGVfY29tJywgJG5vdy0+Zm9ybWF0KCdZLW0tZCBIOmk6cycpLCBQRE86OlBBUkFNX1NUUik7CiAgJHN0bXRPLT5iaW5kVmFsdWUoJzpkYXRlX29ubHknLCAkZGF0ZU9ubHksIFBETzo6UEFSQU1fU1RSKTsKICAkc3RtdE8tPmJpbmRWYWx1ZSgnOmlkX2RhdGUnLCAkaWREYXRlLCBQRE86OlBBUkFNX0lOVCk7CiAgJHN0bXRPLT5iaW5kVmFsdWUoJzppZF9jbGllbnQnLCAkaWRDbGllbnQsIFBETzo6UEFSQU1fSU5UKTsKICAkc3RtdE8tPmJpbmRWYWx1ZSgnOmhldXJlX3ByZXBhJywgJGhldXJlUHJlcGFNcywgUERPOjpQQVJBTV9JTlQpOwogICRzdG10Ty0+YmluZFZhbHVlKCc6Y291cGUnLCAkY291cGUsIFBETzo6UEFSQU1fSU5UKTsKICAkc3RtdE8tPmJpbmRWYWx1ZSgnOmxpdnJhaXNvbicsICRsaXZyYWlzb24sIFBETzo6UEFSQU1fSU5UKTsKICAkc3RtdE8tPmJpbmRWYWx1ZSgnOm5icl9waXp6YXMnLCAkbmJyUGl6emFzLCBQRE86OlBBUkFNX0lOVCk7CiAgJHN0bXRPLT5iaW5kVmFsdWUoJzpwcml4X2NvbScsICRwcml4Q29tU3RyLCBQRE86OlBBUkFNX1NUUik7CiAgJHN0bXRPLT5iaW5kVmFsdWUoJzpwYXlMaW5rJywgJHBheUxpbmssIFBETzo6UEFSQU1fU1RSKTsKICAkc3RtdE8tPmJpbmRWYWx1ZSgnOnZlcmlmX2NvZGUnLCAkdmVyaWZDb2RlLCBQRE86OlBBUkFNX1NUUik7CiAgaWYgKCR0ZW1wQWRkcmVzc0lkID09PSBudWxsKSAkc3RtdE8tPmJpbmRWYWx1ZSgnOmFkcmVzc2VfdGVtcG9yYWlyZScsIG51bGwsIFBETzo6UEFSQU1fTlVMTCk7CiAgZWxzZSAkc3RtdE8tPmJpbmRWYWx1ZSgnOmFkcmVzc2VfdGVtcG9yYWlyZScsICR0ZW1wQWRkcmVzc0lkLCBQRE86OlBBUkFNX0lOVCk7CiAgJHN0bXRPLT5iaW5kVmFsdWUoJzp0b19wcmludCcsICR0b1ByaW50LCBQRE86OlBBUkFNX0lOVCk7CiAgJHN0bXRPLT5leGVjdXRlKCk7CgogICRvcmRlcklkID0gKGludCkkcGRvLT5sYXN0SW5zZXJ0SWQoKTsKICBpZiAoJG9yZGVySWQgPD0gMCkgewogICAgJHBkby0+cm9sbEJhY2soKTsKICAgIHJlc3BvbmQoNTAwLCBbJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnSW5zZXJ0IGZhaWxlZCddKTsKICB9CgogIC8vIEluc2VydCBsaW5lcwogIGlmICgkc3RvcmUgPT09ICdwZWwnKSB7CiAgICAkc3FsTCA9ICJJTlNFUlQgSU5UTyB7JHRhYmxlTGluZXN9ICgKICAgICAgeyRjb2xPcmRlckZrfSwKICAgICAgaWRfcG9zX3BpenphcywKICAgICAgZGF0YV9pZCwKICAgICAgZGF0YV90eXBlLAogICAgICBpc193ZWJfYWRkaXRpb24sCiAgICAgIGlzX2ZyZWUKICAgICkgVkFMVUVTICgKICAgICAgOm9yZGVyX2lkLAogICAgICA6aWRfcG9zX3BpenphcywKICAgICAgOmRhdGFfaWQsCiAgICAgIE5VTEwsCiAgICAgIDAsCiAgICAgIDAKICAgICkiOwogIH0gZWxzZSB7CiAgICAkc3FsTCA9ICJJTlNFUlQgSU5UTyB7JHRhYmxlTGluZXN9ICgKICAgICAgeyRjb2xPcmRlckZrfSwKICAgICAgaWRfcG9zX3BpenphcywKICAgICAgZGF0YV9pZCwKICAgICAgaXNfd2ViX2FkZGl0aW9uLAogICAgICBpc19mcmVlCiAgICApIFZBTFVFUyAoCiAgICAgIDpvcmRlcl9pZCwKICAgICAgOmlkX3Bvc19waXp6YXMsCiAgICAgIDpkYXRhX2lkLAogICAgICAwLAogICAgICAwCiAgICApIjsKICB9CgogICRzdG10TCA9ICRwZG8tPnByZXBhcmUoJHNxbEwpOwoKICAvLyBJbnNlcnQgbW9kaWZzIChvbmx5IGZvciBwaXp6YXMpCiAgJHNxbE0gPSAiSU5TRVJUIElOVE8geyR0YWJsZU1vZGlmc30gKAogICAgeyRjb2xMaW5lRmt9LAogICAgbm9tX29wdGlvbiwKICAgIGNsYXNzX29wdGlvbiwKICAgIGRhdGFfcHJpY2UKICApIFZBTFVFUyAoCiAgICA6bGluZV9pZCwKICAgIDpub21fb3B0aW9uLAogICAgOmNsYXNzX29wdGlvbiwKICAgIDpkYXRhX3ByaWNlCiAgKSI7CiAgJHN0bXRNID0gJHBkby0+cHJlcGFyZSgkc3FsTSk7CgogICRsaW5lQ291bnQgPSAwOwogICRtb2RpZkNvdW50ID0gMDsKCiAgZm9yZWFjaCAoJG5vcm1JdGVtcyBhcyAkaXQpIHsKICAgICRzdG10TC0+YmluZFZhbHVlKCc6b3JkZXJfaWQnLCAkb3JkZXJJZCwgUERPOjpQQVJBTV9JTlQpOwogICAgJHN0bXRMLT5iaW5kVmFsdWUoJzppZF9wb3NfcGl6emFzJywgKGludCkkaXRbJ2lkX3Bvc19waXp6YXMnXSwgUERPOjpQQVJBTV9JTlQpOwogICAgJHN0bXRMLT5iaW5kVmFsdWUoJzpkYXRhX2lkJywgKHN0cmluZykkaXRbJ2RhdGFfaWQnXSwgUERPOjpQQVJBTV9TVFIpOwogICAgJHN0bXRMLT5leGVjdXRlKCk7CiAgICAkbGluZUlkID0gKGludCkkcGRvLT5sYXN0SW5zZXJ0SWQoKTsKICAgICRsaW5lQ291bnQgKz0gMTsKCiAgICBpZiAoJGl0WydjbGFzcyddID09PSAncGl6emEnICYmIGlzX2FycmF5KCRpdFsnbW9kaWZzJ10pICYmICRsaW5lSWQgPiAwKSB7CiAgICAgIGZvcmVhY2ggKCRpdFsnbW9kaWZzJ10gYXMgJG0pIHsKICAgICAgICBpZiAoIWlzX2FycmF5KCRtKSkgY29udGludWU7CiAgICAgICAgJG5vbSA9IGlzc2V0KCRtWydub21fb3B0aW9uJ10pID8gdHJpbSgoc3RyaW5nKSRtWydub21fb3B0aW9uJ10pIDogJyc7CiAgICAgICAgaWYgKCRub20gPT09ICcnKSBjb250aW51ZTsKICAgICAgICBpZiAobWJfc3RybGVuKCRub20sICdVVEYtOCcpID4gMTIwKSAkbm9tID0gbWJfc3Vic3RyKCRub20sIDAsIDEyMCwgJ1VURi04Jyk7CgogICAgICAgICRjbHMgPSBpc3NldCgkbVsnY2xhc3Nfb3B0aW9uJ10pID8gdHJpbSgoc3RyaW5nKSRtWydjbGFzc19vcHRpb24nXSkgOiAnJzsKICAgICAgICAkY2xzTm9ybSA9IHN0cnRvbG93ZXIoJGNscyk7CiAgICAgICAgaWYgKCRjbHNOb3JtID09PSAnJykgJGNsc05vcm0gPSAnbW9kaWYtaXRlbSc7CiAgICAgICAgLy8gTm9ybWFsaXplIGNvbW1vbiB2YXJpYW50cyBjb21pbmcgZnJvbSBkaWZmZXJlbnQgY2xpZW50cy9zeXN0ZW1zLgogICAgICAgIGlmICgkY2xzTm9ybSA9PT0gJ2NvbXBvc2l0aW9uJyB8fCAkY2xzTm9ybSA9PT0gJ3JlbW92ZWQnIHx8ICRjbHNOb3JtID09PSAncmVtb3ZlJyB8fCAkY2xzTm9ybSA9PT0gJ3JldHJhaXQnIHx8ICRjbHNOb3JtID09PSAnaW5ncmVkaWVudC1yZW1vdmVkJykgewogICAgICAgICAgJGNsc05vcm0gPSAnY29tcG9zaXRpb24taXRlbSc7CiAgICAgICAgfQogICAgICAgICRrbm93bkludGVudENsYXNzZXMgPSBbJ2NvbXBvc2l0aW9uLWl0ZW0nLCAnZXh0cmEtaXRlbScsICdvcHRpb24taXRlbScsICdpbmdyZWRpZW50LWl0ZW0nXTsKICAgICAgICBpZiAobWJfc3RybGVuKCRjbHMsICdVVEYtOCcpID4gNjApICRjbHMgPSBtYl9zdWJzdHIoJGNscywgMCwgNjAsICdVVEYtOCcpOwoKICAgICAgICAkZHAgPSAkbVsnZGF0YV9wcmljZSddID8/IDA7CiAgICAgICAgJG4gPSBpc19udW1lcmljKCRkcCkgPyAoZmxvYXQpJGRwIDogMC4wOwogICAgICAgICRkcFN0ciA9IG51bWJlcl9mb3JtYXQoJG4sIDIsICcuJywgJycpOwoKICAgICAgICAvLyBIZXVyaXN0aWM6IGlmIHByaWNlIGlzIDAgYW5kIGl0J3MgTk9UIGFuIGV4cGxpY2l0ICIrIG9wdGlvbiIsCiAgICAgICAgLy8gdHJlYXQgaXQgYXMgYSByZW1vdmVkIGNvbXBvc2l0aW9uIGluZ3JlZGllbnQgZm9yIHByaW50aW5nIHBhcml0eS4KICAgICAgICAvLyAoS2VlcHMgcGFpZCBleHRyYXMvb3B0aW9ucyB1bmNoYW5nZWQuKQogICAgICAgIGlmICghaW5fYXJyYXkoJGNsc05vcm0sICRrbm93bkludGVudENsYXNzZXMsIHRydWUpICYmIGFicygkbikgPCAwLjAwMDAxICYmIHByZWdfbWF0Y2goJy9eXHMqXCsvdScsICRub20pICE9PSAxKSB7CiAgICAgICAgICAkY2xzTm9ybSA9ICdjb21wb3NpdGlvbi1pdGVtJzsKICAgICAgICB9CgogICAgICAgICRzdG10TS0+YmluZFZhbHVlKCc6bGluZV9pZCcsICRsaW5lSWQsIFBETzo6UEFSQU1fSU5UKTsKICAgICAgICAkc3RtdE0tPmJpbmRWYWx1ZSgnOm5vbV9vcHRpb24nLCAkbm9tLCBQRE86OlBBUkFNX1NUUik7CiAgICAgICAgJHN0bXRNLT5iaW5kVmFsdWUoJzpjbGFzc19vcHRpb24nLCAkY2xzTm9ybSwgUERPOjpQQVJBTV9TVFIpOwogICAgICAgICRzdG10TS0+YmluZFZhbHVlKCc6ZGF0YV9wcmljZScsICRkcFN0ciwgUERPOjpQQVJBTV9TVFIpOwogICAgICAgICRzdG10TS0+ZXhlY3V0ZSgpOwogICAgICAgICRtb2RpZkNvdW50ICs9IDE7CiAgICAgIH0KICAgIH0KICB9CgogICRjdXN0b21lclJvdyA9IGxvYWRDdXN0b21lckJ5SWQoJHBkbywgJGlkQ2xpZW50KTsKICBpZiAoaXNfYXJyYXkoJGN1c3RvbWVyUm93KSkgewogICAgJGxveWFsdHlHdWFyZCA9IGVuZm9yY2VPcmRlckZpbmFsTG95YWx0eVVzYWdlKCRwZG8sICRjdXN0b21lclJvdywgJHN0b3JlLCAkb3JkZXJJZCwgJGhldXJlUHJlcGFNcywgJ3JlamVjdCcpOwogICAgaWYgKGVtcHR5KCRsb3lhbHR5R3VhcmRbJ29rJ10pKSB7CiAgICAgICRwZG8tPnJvbGxCYWNrKCk7CiAgICAgIHJlc3BvbmQoNDA5LCBbCiAgICAgICAgJ29rJyA9PiBmYWxzZSwKICAgICAgICAnZXJyb3InID0+ICdsb3lhbHR5X2FscmVhZHlfdXNlZF9vbl9kYXknLAogICAgICAgICdraW5kJyA9PiAnYnVzaW5lc3NfcnVsZV9yZWNhbGNfcmVxdWlyZWQnLAogICAgICAgICdtZXNzYWdlJyA9PiAnTOKAmWF2YW50YWdlIGZpZMOpbGl0w6kgYSBkw6lqw6Agw6l0w6kgY29uc29tbcOpIHN1ciBjZXR0ZSBqb3VybsOpZSBwb3VyIGNlIGNsaWVudC9ncm91cGUuIE1lcmNpIGRlIHJlY2FsY3VsZXIgbGEgY29tbWFuZGUuJywKICAgICAgICAnZGF0ZV9vbmx5JyA9PiAoc3RyaW5nKSgkbG95YWx0eUd1YXJkWydkYXRlX29ubHknXSA/PyAkZGF0ZU9ubHkpLAogICAgICBdKTsKICAgIH0KICB9CgogIC8vIFF1ZXVlIEVTQy9QT1MgcHJpbnQgam9iIChyZWNlaXB0IHRpY2tldCBmcm9tIHNhdmVkIG9yZGVyKSBhdG9taWNhbGx5IHdpdGggdGhlIG9yZGVyIHNhdmUuCiAgJHByaW50UXVldWVkID0gZmFsc2U7CiAgJHByaW50Sm9iSWQgPSAwOwogIGlmIChmdW5jdGlvbl9leGlzdHMoJ3F1ZXVlT3JkZXJSZWNlaXB0VGlja2V0Sm9iJykpIHsKICAgIHRyeSB7CiAgICAgICRwcmludEpvYklkID0gKGludClxdWV1ZU9yZGVyUmVjZWlwdFRpY2tldEpvYigkcGRvLCAkc3RvcmUsICRvcmRlcklkLCAnY2Fpc3NlJyk7CiAgICAgIGlmICgkcHJpbnRKb2JJZCA+IDApICRwcmludFF1ZXVlZCA9IHRydWU7CiAgICAgIGVsc2UgZXJyb3JfbG9nKCJbc2F2ZU9yZGVyXSBwcmludCBqb2IgaW5zZXJ0IGZhaWxlZCAoZmFpbC1zYWZlKSBzdG9yZT17JHN0b3JlfSBvcmRlcl9pZD17JG9yZGVySWR9Iik7CiAgICB9IGNhdGNoIChUaHJvd2FibGUgJGVQcmludCkgewogICAgICBlcnJvcl9sb2coIltzYXZlT3JkZXJdIHByaW50IGpvYiBmYWlsZWQgKGZhaWwtc2FmZSkgc3RvcmU9eyRzdG9yZX0gb3JkZXJfaWQ9eyRvcmRlcklkfSBlcnI9IiAuICRlUHJpbnQtPmdldE1lc3NhZ2UoKSk7CiAgICB9CiAgfSBlbHNlIHsKICAgIGVycm9yX2xvZygiW3NhdmVPcmRlcl0gcHJpbnRKb2JzIGhlbHBlciBtaXNzaW5nOyBza2lwIHByaW50IGpvYiBzdG9yZT17JHN0b3JlfSBvcmRlcl9pZD17JG9yZGVySWR9Iik7CiAgfQoKICAvLyBRdWV1ZSBTTVMgKGZhaWwtc2FmZSk6IHVzZXMgcG9zX3RleHRfc21zIHRlbXBsYXRlcyArIHN0ZF9jbGllbnRzLnN0b3Bfc21zIG9wdC1vdXQuCiAgLy8gS2VlcCBpbnNpZGUgdGhlIHNhbWUgdHJhbnNhY3Rpb24gYXMgb3JkZXIgc2F2ZS4KICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdxdWV1ZU9yZGVyU21zJykpIHsKICAgIHRyeSB7CiAgICAgICRzbXNUeXBlID0gJG1vZGlmQ29tbWFuZGUgPyAnb3JkZXJfbW9kaWYnIDogJ29yZGVyX2NvbmZpcm0nOwogICAgICAkZGVsaXZlcnlNb2RlID0gKCRsaXZyYWlzb24gPT09IDEpID8gJ2RlbGl2ZXJ5JyA6ICdwaWNrdXAnOwogICAgICBxdWV1ZU9yZGVyU21zKCRwZG8sICRzdG9yZSwgJG9yZGVySWQsICRpZENsaWVudCwgJHNtc1R5cGUsICRkZWxpdmVyeU1vZGUpOwogICAgfSBjYXRjaCAoVGhyb3dhYmxlICRlU21zKSB7CiAgICAgIC8vIEZhaWwtc2FmZTogbmV2ZXIgYmxvY2sgb3JkZXIgdmFsaWRhdGlvbiBvbiBTTVMgaXNzdWVzLgogICAgICBlcnJvcl9sb2coIltzYXZlT3JkZXJdIFNNUyBza2lwcGVkIChmYWlsLXNhZmUpOiBzdG9yZT17JHN0b3JlfSBvcmRlcl9pZD17JG9yZGVySWR9IGVycj0iIC4gJGVTbXMtPmdldE1lc3NhZ2UoKSk7CiAgICB9CiAgfSBlbHNlIHsKICAgIGVycm9yX2xvZygiW3NhdmVPcmRlcl0gc21zUXVldWUgaGVscGVyIG1pc3Npbmc7IHNraXAgU01TIHN0b3JlPXskc3RvcmV9IG9yZGVyX2lkPXskb3JkZXJJZH0iKTsKICB9CgogICRwZG8tPmNvbW1pdCgpOwoKICByZXNwb25kKDIwMCwgWwogICAgJ29rJyA9PiB0cnVlLAogICAgJ3N0b3JlJyA9PiAkc3RvcmUsCiAgICAnb3JkZXJfaWQnID0+ICRvcmRlcklkLAogICAgJ2lkX2NsaWVudCcgPT4gJGlkQ2xpZW50LCAvLyByZWxpYWJsZSAobmV3IG9yIGV4aXN0aW5nIGFmdGVyIHVwc2VydCkKICAgICdpZF9kYXRlJyA9PiAkaWREYXRlLAogICAgJ2RhdGVfb25seScgPT4gJGRhdGVPbmx5LAogICAgJ2hldXJlX3ByZXBhJyA9PiAkaGV1cmVQcmVwYU1zLAogICAgJ3RlbXBfYWRkcmVzc19pZCcgPT4gJHRlbXBBZGRyZXNzSWQsCiAgICAnbmJyX3BpenphcycgPT4gJG5iclBpenphcywKICAgICdwcml4X2NvbScgPT4gKGZsb2F0KSRwcml4Q29tU3RyLAogICAgJ3BheUxpbmsnID0+ICRwYXlMaW5rLAogICAgJ3ZlcmlmX2NvZGUnID0+ICR2ZXJpZkNvZGUsCiAgICAnbGluZXNfaW5zZXJ0ZWQnID0+ICRsaW5lQ291bnQsCiAgICAnbW9kaWZzX2luc2VydGVkJyA9PiAkbW9kaWZDb3VudCwKICAgICdwcmludF9qb2InID0+IFsKICAgICAgJ3F1ZXVlZCcgPT4gJHByaW50UXVldWVkLAogICAgICAnam9iX2lkJyA9PiAkcHJpbnRKb2JJZCwKICAgIF0sCiAgXSk7Cn0gY2F0Y2ggKFRocm93YWJsZSAkZSkgewogIHRyeSB7CiAgICBpZiAoJHBkby0+aW5UcmFuc2FjdGlvbigpKSAkcGRvLT5yb2xsQmFjaygpOwogIH0gY2F0Y2ggKFRocm93YWJsZSAkZTIpIHt9CiAgJHN0b3JlTG9nID0gaXNzZXQoJHN0b3JlKSA/IChzdHJpbmcpJHN0b3JlIDogJyc7CiAgZXJyb3JfbG9nKCJbc2F2ZU9yZGVyXSBjcmFzaCBzdG9yZT17JHN0b3JlTG9nfSBlcnI9IiAuICRlLT5nZXRNZXNzYWdlKCkgLiAiIEAgIiAuICRlLT5nZXRGaWxlKCkgLiAiOiIgLiAkZS0+Z2V0TGluZSgpKTsKICByZXNwb25kKDUwMCwgWydvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ1NlcnZlciBlcnJvcicsICdraW5kJyA9PiAnc2VydmVyX2Vycm9yJ10pOwp9Cg=="
            },
            "after": {
                "exists": true,
                "kind": "file",
                "size": 20019,
                "sha1": "00a2414ff5721a2c54b9a0b6823d7834459a0260",
                "content_b64": "PD9waHAKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgovKiBkb2MtcHJvamVjdCB8IGNhaXNzZS1hcXAvcHVibGljL2FwaS9zYXZlT3JkZXIucGhwIHwgUmXDp29pdCwgdmFsaWRlIGV0IGVucmVnaXN0cmUgdW5lIGNvbW1hbmRlIGNhaXNzZSBlbiBiYXNlLCBwdWlzIGZpbGUgbGVzIHTDomNoZXMgZOKAmWltcHJlc3Npb24gZXQgZGUgU01TLCBhdmVjIHBlcnNpc3RhbmNlIGRlIGzigJlhZHJlc3NlIGRlIGxpdnJhaXNvbiBwcm92aXNvaXJlIHBvcnTDqWUgcGFyIGxhIGNvbW1hbmRlLCBjYW5vbmljYWxpc2F0aW9uIG5vbiBibG9xdWFudGUgZHUgY291cGxlIGNvZGUgcG9zdGFsIC8gdmlsbGUgcXVhbmQgdW5lIG9wdGlvbiBQRFYgcmVjb25udWUgZXN0IGNob2lzaWUsIGNvbnNlcnZhdGlvbiBleHBsaWNpdGUgZGVzIHZhbGV1cnMgZXhpc3RhbnRlcyBvdSBzYWlzaWVzIGxpYnJlbWVudCBzaW5vbiwgZXQgdmFsaWRhdGlvbiBibG9xdWFudGUgZGUgbGEgZmlkw6lsaXTDqSBqdXN0ZSBhdmFudCBlbnJlZ2lzdHJlbWVudCBmaW5hbCBwb3VyIGVtcMOqY2hlciB0b3V0ZSBkb3VibGUgY29uc29tbWF0aW9uIHN1ciBsYSBqb3VybsOpZS4gfCBFeHBvc2U6IHJlc3BvbmQsIG5vcm1hbGl6ZUJvb2wsIHNob3VsZFByZXNlcnZlRGVsaXZlcnlDaXR5UGF5bG9hZCwgY29tcHV0ZURheUJvdW5kc01zLCBjb21wdXRlTmV4dElkRGF0ZSB8IETDqXBlbmQgZGU6IGNvbmZpZy5waHAsIF9saWIvY2xpZW50VXBzZXJ0LnBocCwgX2xpYi9wYXlMaW5rLnBocCwgX2xpYi9wcmludEpvYnMucGhwLCBfbGliL3Ntc1F1ZXVlLnBocCwgX2xpYi9maXJzdE5hbWVzVXBzZXJ0LnBocCwgX2xpYi90ZW1wQWRkcmVzcy5waHAsIF9saWIvZGVsaXZlcnlDaXR5Q2hvaWNlcy5waHAsIGxpYi9sb3lhbHR5LnBocCB8IEltcGFjdGU6IEJERCwgZmlsZSBk4oCZaW1wcmVzc2lvbiwgZmlsZSBTTVMsIMOpdGF0IGRlIHRyYW5zYWN0aW9uLCBwZXJzaXN0YW5jZSBkZXMgYWRyZXNzZXMgY2Fpc3NlIHNhbnMgYmxvY2FnZSBzdXIgbGEgY29tbXVuZSwgYmxvY2FnZSBzZXJ2ZXVyIGRlcyBjb25mbGl0cyBmaWTDqWxpdMOpIHwgVGFibGVzOiBwb3NfY29tbWFuZGVzKF9wZWwpLCBwb3NfcGl6emFzX2NvbW1hbmRlZXMoX3BlbCksIHBvc19tb2RpZnNfcGl6emFzKF9wZWwpLCBwb3NfcGl6emFzLCBzdGRfY2xpZW50cywgcG9zX2xpc3RlX3ByZW5vbXMsIHBvc190ZW1wX2FkcmVzc2VzICovCgpoZWFkZXIoJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCcpOwovLyBOZXZlciBjYWNoZSB3cml0ZXMKaGVhZGVyKCdDYWNoZS1Db250cm9sOiBuby1zdG9yZSwgbm8tY2FjaGUsIG11c3QtcmV2YWxpZGF0ZSwgbWF4LWFnZT0wJyk7CmhlYWRlcignUHJhZ21hOiBuby1jYWNoZScpOwpoZWFkZXIoJ0V4cGlyZXM6IDAnKTsKCmZ1bmN0aW9uIHJlc3BvbmQoaW50ICRjb2RlLCBhcnJheSAkcGF5bG9hZCk6IHZvaWQgewogIGh0dHBfcmVzcG9uc2VfY29kZSgkY29kZSk7CiAgZWNobyBqc29uX2VuY29kZSgkcGF5bG9hZCwgSlNPTl9VTkVTQ0FQRURfVU5JQ09ERSB8IEpTT05fVU5FU0NBUEVEX1NMQVNIRVMpOwogIGV4aXQ7Cn0KCi8qKgogKiBOb3JtYWxpemUgbWl4ZWQgSlNPTiBpbnB1dHMgdG8gYm9vbGVhbi4KICogQWNjZXB0cyBib29sLCAwLzEsICJ0cnVlIi8iZmFsc2UiLCAib24iLyJvZmYiLgogKi8KZnVuY3Rpb24gbm9ybWFsaXplQm9vbCgkdik6IGJvb2wgewogIGlmIChpc19ib29sKCR2KSkgcmV0dXJuICR2OwogIGlmIChpc19pbnQoJHYpIHx8IGlzX2Zsb2F0KCR2KSkgcmV0dXJuICgoaW50KSR2KSA9PT0gMTsKICAkcyA9IHN0cnRvbG93ZXIodHJpbSgoc3RyaW5nKSgkdiA/PyAnJykpKTsKICBpZiAoJHMgPT09ICcxJyB8fCAkcyA9PT0gJ3RydWUnIHx8ICRzID09PSAnb24nIHx8ICRzID09PSAneWVzJykgcmV0dXJuIHRydWU7CiAgcmV0dXJuIGZhbHNlOwp9CgpmdW5jdGlvbiBzaG91bGRQcmVzZXJ2ZURlbGl2ZXJ5Q2l0eVBheWxvYWQoJHBheWxvYWQpOiBib29sIHsKICAkc3JjID0gaXNfYXJyYXkoJHBheWxvYWQpID8gJHBheWxvYWQgOiBbXTsKICByZXR1cm4gbm9ybWFsaXplQm9vbCgkc3JjWydkZWxpdmVyeUNpdHlDaG9pY2VQcmVzZXJ2ZUV4aXN0aW5nJ10gPz8gZmFsc2UpOwp9CgpmdW5jdGlvbiBjb21wdXRlRGF5Qm91bmRzTXMoc3RyaW5nICRkYXRlT25seSwgRGF0ZVRpbWVab25lICR0eik6IGFycmF5IHsKICAkZGF5ID0gRGF0ZVRpbWVJbW11dGFibGU6OmNyZWF0ZUZyb21Gb3JtYXQoJ1ktbS1kJywgJGRhdGVPbmx5LCAkdHopOwogIGlmICghJGRheSkgcmV0dXJuIFswLCAwXTsKICAkc3RhcnQgPSAkZGF5LT5zZXRUaW1lKDAsIDAsIDApOwogICRlbmQgICA9ICRkYXktPnNldFRpbWUoMjMsIDU5LCA1OSk7CiAgJHN0YXJ0TXMgPSAoKGludCkkc3RhcnQtPmZvcm1hdCgnVScpKSAqIDEwMDA7CiAgJGVuZE1zICAgPSAoKGludCkkZW5kLT5mb3JtYXQoJ1UnKSkgKiAxMDAwICsgOTk5OwogIHJldHVybiBbJHN0YXJ0TXMsICRlbmRNc107Cn0KCmZ1bmN0aW9uIGNvbXB1dGVOZXh0SWREYXRlKFBETyAkcGRvLCBzdHJpbmcgJHRhYmxlT3JkZXJzLCBpbnQgJHN0YXJ0TXMsIGludCAkZW5kTXMpOiBpbnQgewogICRzcWwgPSAiU0VMRUNUIE1BWChpZF9kYXRlKSBBUyBtYXhfaWRfZGF0ZQogICAgICAgICAgRlJPTSB7JHRhYmxlT3JkZXJzfQogICAgICAgICAgV0hFUkUgKHN0YXR1dCBJUyBOVUxMIE9SIHN0YXR1dCA8PiAnZGVsZXRlZCcpCiAgICAgICAgICAgIEFORCBoZXVyZV9wcmVwYSBCRVRXRUVOIDpzdGFydE1zIEFORCA6ZW5kTXMiOwogICRzdG10ID0gJHBkby0+cHJlcGFyZSgkc3FsKTsKICAkc3RtdC0+YmluZFZhbHVlKCc6c3RhcnRNcycsICRzdGFydE1zLCBQRE86OlBBUkFNX0lOVCk7CiAgJHN0bXQtPmJpbmRWYWx1ZSgnOmVuZE1zJywgJGVuZE1zLCBQRE86OlBBUkFNX0lOVCk7CiAgJHN0bXQtPmV4ZWN1dGUoKTsKICAkcm93ID0gJHN0bXQtPmZldGNoKFBETzo6RkVUQ0hfQVNTT0MpID86IFtdOwogICRtYXggPSBpc3NldCgkcm93WydtYXhfaWRfZGF0ZSddKSA/IChpbnQpJHJvd1snbWF4X2lkX2RhdGUnXSA6IDA7CiAgJG5leHQgPSAkbWF4ICsgMTsKICByZXR1cm4gKCRuZXh0ID4gMCkgPyAkbmV4dCA6IDE7Cn0KCi8vIExvYWQgUERPIGZyb20gcHJvamVjdCByb290IGNvbmZpZy5waHAKQHJlcXVpcmVfb25jZSBfX0RJUl9fIC4gJy8uLi8uLi9jb25maWcucGhwJzsKQHJlcXVpcmVfb25jZSBfX0RJUl9fIC4gJy9fbGliL2NsaWVudFVwc2VydC5waHAnOwpAcmVxdWlyZV9vbmNlIF9fRElSX18gLiAnL19saWIvcGF5TGluay5waHAnOwpAcmVxdWlyZV9vbmNlIF9fRElSX18gLiAnL19saWIvcHJpbnRKb2JzLnBocCc7CkByZXF1aXJlX29uY2UgX19ESVJfXyAuICcvX2xpYi9zbXNRdWV1ZS5waHAnOwpAcmVxdWlyZV9vbmNlIF9fRElSX18gLiAnL19saWIvZmlyc3ROYW1lc1Vwc2VydC5waHAnOwpAcmVxdWlyZV9vbmNlIF9fRElSX18gLiAnL19saWIvdGVtcEFkZHJlc3MucGhwJzsKQHJlcXVpcmVfb25jZSBfX0RJUl9fIC4gJy9fbGliL2RlbGl2ZXJ5Q2l0eUNob2ljZXMucGhwJzsKQHJlcXVpcmVfb25jZSBfX0RJUl9fIC4gJy9saWIvbG95YWx0eS5waHAnOwoKaWYgKCFpc3NldCgkcGRvKSB8fCAhKCRwZG8gaW5zdGFuY2VvZiBQRE8pKSB7CiAgcmVzcG9uZCg1MDAsIFsnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdEQiBub3QgY29uZmlndXJlZCddKTsKfQoKJHJhdyA9IGZpbGVfZ2V0X2NvbnRlbnRzKCdwaHA6Ly9pbnB1dCcpOwokanNvbiA9IGlzX3N0cmluZygkcmF3KSA/IGpzb25fZGVjb2RlKCRyYXcsIHRydWUpIDogbnVsbDsKaWYgKCFpc19hcnJheSgkanNvbikpIHsKICByZXNwb25kKDQwMCwgWydvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ0ludmFsaWQgSlNPTiddKTsKfQoKJHN0b3JlID0gaXNzZXQoJGpzb25bJ3N0b3JlJ10pID8gKHN0cmluZykkanNvblsnc3RvcmUnXSA6ICcnOwppZiAoIXByZWdfbWF0Y2goJy9eKGxhbnxwZWwpJC8nLCAkc3RvcmUpKSB7CiAgcmVzcG9uZCg0MDAsIFsnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdJbnZhbGlkIHN0b3JlJ10pOwp9CgovLyBVSSBmbGFnIChmdXR1cmUgU01TIGRlY2lzaW9uKSDigJQgY3VycmVudGx5IG5vLW9wIChubyBEQiB3cml0ZSkuCiRtb2RpZkNvbW1hbmRlID0gbm9ybWFsaXplQm9vbCgkanNvblsnbW9kaWZfY29tbWFuZGUnXSA/PyBmYWxzZSk7CmlmICgkbW9kaWZDb21tYW5kZSkgZXJyb3JfbG9nKCJbc2F2ZU9yZGVyXSBtb2RpZl9jb21tYW5kZT10cnVlIHN0b3JlPXskc3RvcmV9Iik7CgovLyBTdG9yZS1zcGVjaWZpYyB0YWJsZXMgKHN0cmljdCB3aGl0ZWxpc3QpCiR0YWJsZU9yZGVycyA9ICgkc3RvcmUgPT09ICdwZWwnKSA/ICdwb3NfY29tbWFuZGVzX3BlbCcgOiAncG9zX2NvbW1hbmRlcyc7CiR0YWJsZUxpbmVzICA9ICgkc3RvcmUgPT09ICdwZWwnKSA/ICdwb3NfcGl6emFzX2NvbW1hbmRlZXNfcGVsJyA6ICdwb3NfcGl6emFzX2NvbW1hbmRlZXMnOwokY29sT3JkZXJGayAgPSAoJHN0b3JlID09PSAncGVsJykgPyAnaWRfcG9zX2NvbW1hbmRlc19wZWwnIDogJ2lkX3Bvc19jb21tYW5kZXMnOwokdGFibGVNb2RpZnMgPSAoJHN0b3JlID09PSAncGVsJykgPyAncG9zX21vZGlmc19waXp6YXNfcGVsJyA6ICdwb3NfbW9kaWZzX3Bpenphcyc7CiRjb2xMaW5lRmsgICA9ICgkc3RvcmUgPT09ICdwZWwnKSA/ICdpZF9wb3NfcGl6emFzX2NvbW1hbmRlZXNfcGVsJyA6ICdpZF9wb3NfcGl6emFzX2NvbW1hbmRlZXMnOwoKLy8gSW5wdXQgZmllbGRzCiRkYXRlSVNPID0gaXNzZXQoJGpzb25bJ2RhdGVJU08nXSkgPyAoc3RyaW5nKSRqc29uWydkYXRlSVNPJ10gOiAnJzsKJGlkRGF0ZVJhdyA9ICRqc29uWydpZF9kYXRlJ10gPz8gbnVsbDsKJGhldXJlSEhNTSA9IGlzc2V0KCRqc29uWydoZXVyZV9wcmVwYV9oaG1tJ10pID8gKHN0cmluZykkanNvblsnaGV1cmVfcHJlcGFfaGhtbSddIDogJyc7CiRoZXVyZU1zUmF3ID0gJGpzb25bJ2hldXJlX3ByZXBhX21zJ10gPz8gbnVsbDsKCiRjb3VwZSA9IGlzc2V0KCRqc29uWydjb3VwZSddKSA/IChpbnQpJGpzb25bJ2NvdXBlJ10gOiAwOwokbGl2cmFpc29uID0gaXNzZXQoJGpzb25bJ2xpdnJhaXNvbiddKSA/IChpbnQpJGpzb25bJ2xpdnJhaXNvbiddIDogMDsKJGlkQ2xpZW50ID0gaXNzZXQoJGpzb25bJ2lkX2NsaWVudCddKSA/IChpbnQpJGpzb25bJ2lkX2NsaWVudCddIDogMDsKJHBob25lUmF3ID0gaXNzZXQoJGpzb25bJ3Bob25lTnVtYmVyJ10pID8gKHN0cmluZykkanNvblsncGhvbmVOdW1iZXInXSA6ICcnOwokdG9QcmludCA9IGlzc2V0KCRqc29uWyd0b19wcmludCddKSA/IChpbnQpJGpzb25bJ3RvX3ByaW50J10gOiAwOwokY2xpZW50UGF5bG9hZCA9ICRqc29uWydjbGllbnQnXSA/PyBudWxsOwoKJHRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcyA9IChpc3NldCgkanNvblsndGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzJ10pICYmIGlzX2FycmF5KCRqc29uWyd0ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MnXSkpCiAgPyAkanNvblsndGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzJ10KICA6IG51bGw7CgokaXRlbXMgPSAkanNvblsnaXRlbXMnXSA/PyBudWxsOwppZiAoIWlzX2FycmF5KCRpdGVtcykgfHwgY291bnQoJGl0ZW1zKSA9PT0gMCkgewogIHJlc3BvbmQoNDAwLCBbJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnUGFuaWVyIHZpZGUnXSk7Cn0KCi8vIFZhbGlkYXRlIGRhdGVfb25seQokdHogPSBuZXcgRGF0ZVRpbWVab25lKCdFdXJvcGUvUGFyaXMnKTsKJGRhdGVPbmx5ID0gbnVsbDsKaWYgKGlzX3N0cmluZygkZGF0ZUlTTykgJiYgcHJlZ19tYXRjaCgnL15cZHs0fS1cZHsyfS1cZHsyfSQvJywgJGRhdGVJU08pKSB7CiAgJGQgPSBEYXRlVGltZUltbXV0YWJsZTo6Y3JlYXRlRnJvbUZvcm1hdCgnWS1tLWQnLCAkZGF0ZUlTTywgJHR6KTsKICBpZiAoJGQgaW5zdGFuY2VvZiBEYXRlVGltZUltbXV0YWJsZSkgJGRhdGVPbmx5ID0gJGQtPmZvcm1hdCgnWS1tLWQnKTsKfQppZiAoJGRhdGVPbmx5ID09PSBudWxsKSB7CiAgJGRhdGVPbmx5ID0gKG5ldyBEYXRlVGltZUltbXV0YWJsZSgnbm93JywgJHR6KSktPmZvcm1hdCgnWS1tLWQnKTsKfQoKLy8gaWRfZGF0ZSBpcyBhc3NpZ25lZCBzZXJ2ZXItc2lkZSAobmV4dCBhdmFpbGFibGUgZm9yIHRoZSBjb21wdXRlZCBkYXkpCiRpZERhdGUgPSBpc19udW1lcmljKCRpZERhdGVSYXcpID8gKGludCkkaWREYXRlUmF3IDogMDsKCi8vIFZhbGlkYXRlIGhldXJlX3ByZXBhIChlcG9jaCBtcyBvciBISDpNTSkKJGhldXJlUHJlcGFNcyA9IG51bGw7CmlmIChpc19udW1lcmljKCRoZXVyZU1zUmF3KSkgewogICRtcyA9IChpbnQpJGhldXJlTXNSYXc7CiAgaWYgKCRtcyA+IDApICRoZXVyZVByZXBhTXMgPSAkbXM7Cn0KaWYgKCRoZXVyZVByZXBhTXMgPT09IG51bGwpIHsKICBpZiAoIXByZWdfbWF0Y2goJy9eXGR7Mn06XGR7Mn0kLycsICRoZXVyZUhITU0pKSB7CiAgICByZXNwb25kKDQwMCwgWydvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ0Nob2lzaXIgdW4gY3LDqW5lYXUnXSk7CiAgfQogIC8vIEJ1aWxkIHRpbWVzdGFtcCBmcm9tIHNlbGVjdGVkIGRhdGUgKyBISDpNTSBpbiBFdXJvcGUvUGFyaXMKICAkZHQgPSBEYXRlVGltZUltbXV0YWJsZTo6Y3JlYXRlRnJvbUZvcm1hdCgnWS1tLWQgSDppJywgJGRhdGVPbmx5IC4gJyAnIC4gJGhldXJlSEhNTSwgJHR6KTsKICBpZiAoISRkdCkgewogICAgcmVzcG9uZCg0MDAsIFsnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdJbnZhbGlkIGhldXJlX3ByZXBhJ10pOwogIH0KICAkaGV1cmVQcmVwYU1zID0gKChpbnQpJGR0LT5mb3JtYXQoJ1UnKSkgKiAxMDAwOwp9CgovLyBDb21wdXRlIG5leHQgaWRfZGF0ZSBmb3IgdGhlIGRheSBkZXJpdmVkIGZyb20gaGV1cmVfcHJlcGEvZGF0ZU9ubHkgKHN0b3JlLXNwZWNpZmljIHRhYmxlKQp0cnkgewogIFskZGF5U3RhcnRNcywgJGRheUVuZE1zXSA9IGNvbXB1dGVEYXlCb3VuZHNNcygkZGF0ZU9ubHksICR0eik7CiAgaWYgKCRkYXlTdGFydE1zIDw9IDAgfHwgJGRheUVuZE1zIDw9IDApIHsKICAgIHJlc3BvbmQoNDAwLCBbJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnSW52YWxpZCBkYXRlX29ubHknXSk7CiAgfQogICRpZERhdGUgPSBjb21wdXRlTmV4dElkRGF0ZSgkcGRvLCAkdGFibGVPcmRlcnMsICRkYXlTdGFydE1zLCAkZGF5RW5kTXMpOwp9IGNhdGNoIChUaHJvd2FibGUgJGUpIHsKICBlcnJvcl9sb2coIltzYXZlT3JkZXJdIGNvbXB1dGVOZXh0SWREYXRlIGZhaWxlZCBzdG9yZT17JHN0b3JlfSBkYXRlT25seT17JGRhdGVPbmx5fSBlcnI9IiAuICRlLT5nZXRNZXNzYWdlKCkpOwogIHJlc3BvbmQoNTAwLCBbJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnU2VydmVyIGVycm9yJ10pOwp9CgovLyBOb3JtYWxpemUgZmxhZ3MKJGNvdXBlID0gKCRjb3VwZSA9PT0gMSkgPyAxIDogMDsKJGxpdnJhaXNvbiA9ICgkbGl2cmFpc29uID09PSAxKSA/IDEgOiAwOwokdG9QcmludCA9ICgkdG9QcmludCA9PT0gMSkgPyAxIDogMDsKaWYgKCRsaXZyYWlzb24gIT09IDEpICR0ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MgPSBudWxsOwoKaWYgKCRsaXZyYWlzb24gPT09IDEgJiYgaXNfYXJyYXkoJGNsaWVudFBheWxvYWQpICYmICFzaG91bGRQcmVzZXJ2ZURlbGl2ZXJ5Q2l0eVBheWxvYWQoJGNsaWVudFBheWxvYWQpKSB7CiAgJG5vcm1hbGl6ZWRDbGllbnRQYXlsb2FkID0gY2Fpc3NlTm9ybWFsaXplRGVsaXZlcnlDaXR5UGF5bG9hZCgkY2xpZW50UGF5bG9hZCwgJHN0b3JlLCAndmlsbGUnLCAnY29kZV9wb3N0YWwnKTsKICBpZiAoaXNfYXJyYXkoJG5vcm1hbGl6ZWRDbGllbnRQYXlsb2FkWydwYXlsb2FkJ10gPz8gbnVsbCkpIHsKICAgICRjbGllbnRQYXlsb2FkID0gJG5vcm1hbGl6ZWRDbGllbnRQYXlsb2FkWydwYXlsb2FkJ107CiAgfQp9CgppZiAoJGxpdnJhaXNvbiA9PT0gMSAmJiBpc19hcnJheSgkdGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzKSAmJiAhc2hvdWxkUHJlc2VydmVEZWxpdmVyeUNpdHlQYXlsb2FkKCR0ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MpKSB7CiAgJG5vcm1hbGl6ZWRUZW1wb3JhcnlBZGRyZXNzID0gY2Fpc3NlTm9ybWFsaXplRGVsaXZlcnlDaXR5UGF5bG9hZCgkdGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzLCAkc3RvcmUsICd2aWxsZScsICdjb2RlX3Bvc3RhbCcpOwogIGlmIChpc19hcnJheSgkbm9ybWFsaXplZFRlbXBvcmFyeUFkZHJlc3NbJ3BheWxvYWQnXSA/PyBudWxsKSkgewogICAgJHRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcyA9ICRub3JtYWxpemVkVGVtcG9yYXJ5QWRkcmVzc1sncGF5bG9hZCddOwogIH0KfQoKLy8gUHJlcGFyZSBpdGVtczogdmFsaWRhdGUgaWRzIGFuZCBjb21wdXRlIHRvdGFscyB1c2luZyBEQiBwcmljZXMKJHBvc0lkcyA9IFtdOwokbm9ybUl0ZW1zID0gW107CiRuYnJQaXp6YXMgPSAwOwpmb3JlYWNoICgkaXRlbXMgYXMgJGl0KSB7CiAgaWYgKCFpc19hcnJheSgkaXQpKSBjb250aW51ZTsKICAkcGlkID0gaXNzZXQoJGl0WydpZF9wb3NfcGl6emFzJ10pID8gKGludCkkaXRbJ2lkX3Bvc19waXp6YXMnXSA6IDA7CiAgaWYgKCRwaWQgPD0gMCkgcmVzcG9uZCg0MDAsIFsnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdJbnZhbGlkIGl0ZW0gaWRfcG9zX3BpenphcyddKTsKICAkZGF0YUlkID0gaXNzZXQoJGl0WydkYXRhX2lkJ10pID8gdHJpbSgoc3RyaW5nKSRpdFsnZGF0YV9pZCddKSA6ICcnOwogIGlmICgkZGF0YUlkID09PSAnJykgcmVzcG9uZCg0MDAsIFsnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdJbnZhbGlkIGl0ZW0gZGF0YV9pZCddKTsKCiAgJGNscyA9IGlzc2V0KCRpdFsnY2xhc3MnXSkgPyBzdHJ0b2xvd2VyKHRyaW0oKHN0cmluZykkaXRbJ2NsYXNzJ10pKSA6ICcnOwogIGlmICgkY2xzID09PSAncGl6emEnKSAkbmJyUGl6emFzICs9IDE7CgogICRtb2RpZnMgPSAkaXRbJ21vZGlmcyddID8/IFtdOwogIGlmICghaXNfYXJyYXkoJG1vZGlmcykpICRtb2RpZnMgPSBbXTsKCiAgJG5vcm1JdGVtc1tdID0gWwogICAgJ2lkX3Bvc19waXp6YXMnID0+ICRwaWQsCiAgICAnZGF0YV9pZCcgPT4gJGRhdGFJZCwKICAgICdjbGFzcycgPT4gJGNscywKICAgICdtb2RpZnMnID0+ICRtb2RpZnMsCiAgXTsKICAkcG9zSWRzWyRwaWRdID0gdHJ1ZTsKfQppZiAoY291bnQoJG5vcm1JdGVtcykgPT09IDApIHsKICByZXNwb25kKDQwMCwgWydvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ1BhbmllciB2aWRlJ10pOwp9CgovLyBMb2FkIGJhc2UgcHJpY2VzIGZyb20gcG9zX3BpenphcwokaWRzID0gYXJyYXlfa2V5cygkcG9zSWRzKTsKJHBsYWNlaG9sZGVycyA9IGltcGxvZGUoJywnLCBhcnJheV9maWxsKDAsIGNvdW50KCRpZHMpLCAnPycpKTsKJHByaWNlQnlJZCA9IFtdOwp0cnkgewogICRzdG10UCA9ICRwZG8tPnByZXBhcmUoIlNFTEVDVCBpZCwgcHJpY2VfbGFyZ2UgRlJPTSBwb3NfcGl6emFzIFdIRVJFIGlkIElOICgkcGxhY2Vob2xkZXJzKSIpOwogIGZvcmVhY2ggKCRpZHMgYXMgJGkgPT4gJHBpZCkgewogICAgJHN0bXRQLT5iaW5kVmFsdWUoJGkgKyAxLCAoaW50KSRwaWQsIFBETzo6UEFSQU1fSU5UKTsKICB9CiAgJHN0bXRQLT5leGVjdXRlKCk7CiAgd2hpbGUgKCRyb3cgPSAkc3RtdFAtPmZldGNoKFBETzo6RkVUQ0hfQVNTT0MpKSB7CiAgICAkcmlkID0gaXNzZXQoJHJvd1snaWQnXSkgPyAoaW50KSRyb3dbJ2lkJ10gOiAwOwogICAgJHByID0gaXNzZXQoJHJvd1sncHJpY2VfbGFyZ2UnXSkgPyAoZmxvYXQpJHJvd1sncHJpY2VfbGFyZ2UnXSA6IDAuMDsKICAgIGlmICgkcmlkID4gMCkgJHByaWNlQnlJZFskcmlkXSA9ICRwcjsKICB9Cn0gY2F0Y2ggKFRocm93YWJsZSAkZSkgewogIGVycm9yX2xvZygiW3NhdmVPcmRlcl0gbG9hZCBwcmljZXMgZmFpbGVkIHN0b3JlPXskc3RvcmV9IGVycj0iIC4gJGUtPmdldE1lc3NhZ2UoKSk7CiAgcmVzcG9uZCg1MDAsIFsnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdTZXJ2ZXIgZXJyb3InXSk7Cn0KCi8vIENvbXB1dGUgdG90YWwgaW4gY2VudHMgKGJhc2UgKyBtb2RpZnMgZm9yIHBpenphcykKJHRvdGFsQ2VudHMgPSAwOwpmb3JlYWNoICgkbm9ybUl0ZW1zIGFzICRpdCkgewogICRwaWQgPSAoaW50KSRpdFsnaWRfcG9zX3BpenphcyddOwogIGlmICghYXJyYXlfa2V5X2V4aXN0cygkcGlkLCAkcHJpY2VCeUlkKSkgewogICAgcmVzcG9uZCg0MDAsIFsnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdVbmtub3duIHBvc19waXp6YXMgaWQ6ICcgLiAkcGlkXSk7CiAgfQogICRiYXNlID0gKGZsb2F0KSRwcmljZUJ5SWRbJHBpZF07CiAgJHRvdGFsQ2VudHMgKz0gKGludClyb3VuZCgkYmFzZSAqIDEwMCk7CgogIGlmICgkaXRbJ2NsYXNzJ10gPT09ICdwaXp6YScgJiYgaXNfYXJyYXkoJGl0Wydtb2RpZnMnXSkpIHsKICAgIGZvcmVhY2ggKCRpdFsnbW9kaWZzJ10gYXMgJG0pIHsKICAgICAgaWYgKCFpc19hcnJheSgkbSkpIGNvbnRpbnVlOwogICAgICAkZHAgPSAkbVsnZGF0YV9wcmljZSddID8/IDA7CiAgICAgICRuID0gaXNfbnVtZXJpYygkZHApID8gKGZsb2F0KSRkcCA6IDAuMDsKICAgICAgJHRvdGFsQ2VudHMgKz0gKGludClyb3VuZCgkbiAqIDEwMCk7CiAgICB9CiAgfQp9CiRwcml4Q29tID0gJHRvdGFsQ2VudHMgLyAxMDAuMDsKJHByaXhDb21TdHIgPSBudW1iZXJfZm9ybWF0KCRwcml4Q29tLCAyLCAnLicsICcnKTsKCnRyeSB7CiAgJHBkby0+YmVnaW5UcmFuc2FjdGlvbigpOwoKICAvLyBVcHNlcnQgY2xpZW50IGluc2lkZSB0cmFuc2FjdGlvbiAoY2xpZW50IC0+IG9yZGVyIC0+IGxpbmVzKQogIGlmICh0cmltKCRwaG9uZVJhdykgPT09ICcnKSB7CiAgICAkcGRvLT5yb2xsQmFjaygpOwogICAgcmVzcG9uZCg0MDAsIFsnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdNaXNzaW5nIHBob25lTnVtYmVyIChjbGllbnQgcmVxdWlyZWQpJ10pOwogIH0KICAkdXBzZXJ0ZWRJZCA9IHVwc2VydENsaWVudEZyb21QYXlsb2FkKCRwZG8sICRwaG9uZVJhdywgJGNsaWVudFBheWxvYWQsICRzdG9yZSk7CiAgaWYgKCR1cHNlcnRlZElkIDw9IDApIHsKICAgICRwZG8tPnJvbGxCYWNrKCk7CiAgICByZXNwb25kKDUwMCwgWydvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ1VuYWJsZSB0byByZXNvbHZlIGNsaWVudCddKTsKICB9CiAgJGlkQ2xpZW50ID0gJHVwc2VydGVkSWQ7CiAgJHRlbXBBZGRyZXNzSWQgPSB0ZW1wQWRkcmVzc1BlcnNpc3QoJHBkbywgJHRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcywgbnVsbCwgJHN0b3JlKTsKCiAgLy8gQXV0by1sZWFybiBmaXJzdCBuYW1lIChmYWlsLXNhZmUpOiBhZGQgdG8gcG9zX2xpc3RlX3ByZW5vbXMgaWYgbWlzc2luZy4KICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdyZW1lbWJlckZpcnN0TmFtZUZyb21DbGllbnRJZCcpKSB7CiAgICB0cnkgewogICAgICByZW1lbWJlckZpcnN0TmFtZUZyb21DbGllbnRJZCgkcGRvLCAkaWRDbGllbnQpOwogICAgfSBjYXRjaCAoVGhyb3dhYmxlICRlRm4pIHsKICAgICAgLy8gRmFpbC1zYWZlOiBuZXZlciBibG9jayBvcmRlciBzYXZlIG9uIGZpcnN0LW5hbWUgbGVhcm5pbmcgaXNzdWVzLgogICAgICBlcnJvcl9sb2coIltzYXZlT3JkZXJdIGZpcnN0TmFtZSB1cHNlcnQgc2tpcHBlZCAoZmFpbC1zYWZlKSBzdG9yZT17JHN0b3JlfSBjbGllbnRfaWQ9eyRpZENsaWVudH0gZXJyPSIgLiAkZUZuLT5nZXRNZXNzYWdlKCkpOwogICAgfQogIH0KCiAgLy8gR2VuZXJhdGUgcGF5TGluayArIHZlcmlmX2NvZGUgaW5zaWRlIHRoZSBzYW1lIHRyYW5zYWN0aW9uIChiZWZvcmUgSU5TRVJUIG9yZGVyKQogIC8vIE5PVEU6IHBheUxpbmsgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBzdG9yZS1zcGVjaWZpYyBvcmRlcnMgdGFibGUuCiAgJHBheUxpbmsgPSBnZW5lcmF0ZVVuaXF1ZVBheUxpbmtJZEZvclRhYmxlKCRwZG8sICR0YWJsZU9yZGVycyk7CiAgJHZlcmlmQ29kZSA9IGdlbmVyYXRlVmVyaWZpY2F0aW9uQ29kZSgpOwoKICAvLyBJbnNlcnQgY29tbWFuZGUKICAkc3FsTyA9ICJJTlNFUlQgSU5UTyB7JHRhYmxlT3JkZXJzfSAoCiAgICBkYXRlX2NvbSwKICAgIGRhdGVfb25seSwKICAgIGlkX2RhdGUsCiAgICBpZF9jbGllbnQsCiAgICBzdGF0dXQsCiAgICBoZXVyZV9wcmVwYSwKICAgIGNvdXBlLAogICAgbGl2cmFpc29uLAogICAgbmJyX3BpenphcywKICAgIHByaXhfY29tLAogICAgc3RhdHV0U21zLAogICAgc21zUmV0YXJkLAogICAgc21zUHJlcGEsCiAgICBwYXlMaW5rLAogICAgdmVyaWZfY29kZSwKICAgIGFkcmVzc2VfdGVtcG9yYWlyZSwKICAgIGlzX29ubGluZSwKICAgIG5lZWRfYWNjb3VudCwKICAgIHRvX3ByaW50LAogICAgYWNjb3VudF90b19wcmludAogICkgVkFMVUVTICgKICAgIDpkYXRlX2NvbSwKICAgIDpkYXRlX29ubHksCiAgICA6aWRfZGF0ZSwKICAgIDppZF9jbGllbnQsCiAgICAncGVuZGluZycsCiAgICA6aGV1cmVfcHJlcGEsCiAgICA6Y291cGUsCiAgICA6bGl2cmFpc29uLAogICAgOm5icl9waXp6YXMsCiAgICA6cHJpeF9jb20sCiAgICAxLAogICAgMCwKICAgIDAsCiAgICA6cGF5TGluaywKICAgIDp2ZXJpZl9jb2RlLAogICAgOmFkcmVzc2VfdGVtcG9yYWlyZSwKICAgIDAsCiAgICAwLAogICAgOnRvX3ByaW50LAogICAgMAogICkiOwoKICAkbm93ID0gbmV3IERhdGVUaW1lSW1tdXRhYmxlKCdub3cnLCAkdHopOwogICRzdG10TyA9ICRwZG8tPnByZXBhcmUoJHNxbE8pOwogICRzdG10Ty0+YmluZFZhbHVlKCc6ZGF0ZV9jb20nLCAkbm93LT5mb3JtYXQoJ1ktbS1kIEg6aTpzJyksIFBETzo6UEFSQU1fU1RSKTsKICAkc3RtdE8tPmJpbmRWYWx1ZSgnOmRhdGVfb25seScsICRkYXRlT25seSwgUERPOjpQQVJBTV9TVFIpOwogICRzdG10Ty0+YmluZFZhbHVlKCc6aWRfZGF0ZScsICRpZERhdGUsIFBETzo6UEFSQU1fSU5UKTsKICAkc3RtdE8tPmJpbmRWYWx1ZSgnOmlkX2NsaWVudCcsICRpZENsaWVudCwgUERPOjpQQVJBTV9JTlQpOwogICRzdG10Ty0+YmluZFZhbHVlKCc6aGV1cmVfcHJlcGEnLCAkaGV1cmVQcmVwYU1zLCBQRE86OlBBUkFNX0lOVCk7CiAgJHN0bXRPLT5iaW5kVmFsdWUoJzpjb3VwZScsICRjb3VwZSwgUERPOjpQQVJBTV9JTlQpOwogICRzdG10Ty0+YmluZFZhbHVlKCc6bGl2cmFpc29uJywgJGxpdnJhaXNvbiwgUERPOjpQQVJBTV9JTlQpOwogICRzdG10Ty0+YmluZFZhbHVlKCc6bmJyX3BpenphcycsICRuYnJQaXp6YXMsIFBETzo6UEFSQU1fSU5UKTsKICAkc3RtdE8tPmJpbmRWYWx1ZSgnOnByaXhfY29tJywgJHByaXhDb21TdHIsIFBETzo6UEFSQU1fU1RSKTsKICAkc3RtdE8tPmJpbmRWYWx1ZSgnOnBheUxpbmsnLCAkcGF5TGluaywgUERPOjpQQVJBTV9TVFIpOwogICRzdG10Ty0+YmluZFZhbHVlKCc6dmVyaWZfY29kZScsICR2ZXJpZkNvZGUsIFBETzo6UEFSQU1fU1RSKTsKICBpZiAoJHRlbXBBZGRyZXNzSWQgPT09IG51bGwpICRzdG10Ty0+YmluZFZhbHVlKCc6YWRyZXNzZV90ZW1wb3JhaXJlJywgbnVsbCwgUERPOjpQQVJBTV9OVUxMKTsKICBlbHNlICRzdG10Ty0+YmluZFZhbHVlKCc6YWRyZXNzZV90ZW1wb3JhaXJlJywgJHRlbXBBZGRyZXNzSWQsIFBETzo6UEFSQU1fSU5UKTsKICAkc3RtdE8tPmJpbmRWYWx1ZSgnOnRvX3ByaW50JywgJHRvUHJpbnQsIFBETzo6UEFSQU1fSU5UKTsKICAkc3RtdE8tPmV4ZWN1dGUoKTsKCiAgJG9yZGVySWQgPSAoaW50KSRwZG8tPmxhc3RJbnNlcnRJZCgpOwogIGlmICgkb3JkZXJJZCA8PSAwKSB7CiAgICAkcGRvLT5yb2xsQmFjaygpOwogICAgcmVzcG9uZCg1MDAsIFsnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdJbnNlcnQgZmFpbGVkJ10pOwogIH0KCiAgLy8gSW5zZXJ0IGxpbmVzCiAgaWYgKCRzdG9yZSA9PT0gJ3BlbCcpIHsKICAgICRzcWxMID0gIklOU0VSVCBJTlRPIHskdGFibGVMaW5lc30gKAogICAgICB7JGNvbE9yZGVyRmt9LAogICAgICBpZF9wb3NfcGl6emFzLAogICAgICBkYXRhX2lkLAogICAgICBkYXRhX3R5cGUsCiAgICAgIGlzX3dlYl9hZGRpdGlvbiwKICAgICAgaXNfZnJlZQogICAgKSBWQUxVRVMgKAogICAgICA6b3JkZXJfaWQsCiAgICAgIDppZF9wb3NfcGl6emFzLAogICAgICA6ZGF0YV9pZCwKICAgICAgTlVMTCwKICAgICAgMCwKICAgICAgMAogICAgKSI7CiAgfSBlbHNlIHsKICAgICRzcWxMID0gIklOU0VSVCBJTlRPIHskdGFibGVMaW5lc30gKAogICAgICB7JGNvbE9yZGVyRmt9LAogICAgICBpZF9wb3NfcGl6emFzLAogICAgICBkYXRhX2lkLAogICAgICBpc193ZWJfYWRkaXRpb24sCiAgICAgIGlzX2ZyZWUKICAgICkgVkFMVUVTICgKICAgICAgOm9yZGVyX2lkLAogICAgICA6aWRfcG9zX3BpenphcywKICAgICAgOmRhdGFfaWQsCiAgICAgIDAsCiAgICAgIDAKICAgICkiOwogIH0KCiAgJHN0bXRMID0gJHBkby0+cHJlcGFyZSgkc3FsTCk7CgogIC8vIEluc2VydCBtb2RpZnMgKG9ubHkgZm9yIHBpenphcykKICAkc3FsTSA9ICJJTlNFUlQgSU5UTyB7JHRhYmxlTW9kaWZzfSAoCiAgICB7JGNvbExpbmVGa30sCiAgICBub21fb3B0aW9uLAogICAgY2xhc3Nfb3B0aW9uLAogICAgZGF0YV9wcmljZQogICkgVkFMVUVTICgKICAgIDpsaW5lX2lkLAogICAgOm5vbV9vcHRpb24sCiAgICA6Y2xhc3Nfb3B0aW9uLAogICAgOmRhdGFfcHJpY2UKICApIjsKICAkc3RtdE0gPSAkcGRvLT5wcmVwYXJlKCRzcWxNKTsKCiAgJGxpbmVDb3VudCA9IDA7CiAgJG1vZGlmQ291bnQgPSAwOwoKICBmb3JlYWNoICgkbm9ybUl0ZW1zIGFzICRpdCkgewogICAgJHN0bXRMLT5iaW5kVmFsdWUoJzpvcmRlcl9pZCcsICRvcmRlcklkLCBQRE86OlBBUkFNX0lOVCk7CiAgICAkc3RtdEwtPmJpbmRWYWx1ZSgnOmlkX3Bvc19waXp6YXMnLCAoaW50KSRpdFsnaWRfcG9zX3BpenphcyddLCBQRE86OlBBUkFNX0lOVCk7CiAgICAkc3RtdEwtPmJpbmRWYWx1ZSgnOmRhdGFfaWQnLCAoc3RyaW5nKSRpdFsnZGF0YV9pZCddLCBQRE86OlBBUkFNX1NUUik7CiAgICAkc3RtdEwtPmV4ZWN1dGUoKTsKICAgICRsaW5lSWQgPSAoaW50KSRwZG8tPmxhc3RJbnNlcnRJZCgpOwogICAgJGxpbmVDb3VudCArPSAxOwoKICAgIGlmICgkaXRbJ2NsYXNzJ10gPT09ICdwaXp6YScgJiYgaXNfYXJyYXkoJGl0Wydtb2RpZnMnXSkgJiYgJGxpbmVJZCA+IDApIHsKICAgICAgZm9yZWFjaCAoJGl0Wydtb2RpZnMnXSBhcyAkbSkgewogICAgICAgIGlmICghaXNfYXJyYXkoJG0pKSBjb250aW51ZTsKICAgICAgICAkbm9tID0gaXNzZXQoJG1bJ25vbV9vcHRpb24nXSkgPyB0cmltKChzdHJpbmcpJG1bJ25vbV9vcHRpb24nXSkgOiAnJzsKICAgICAgICBpZiAoJG5vbSA9PT0gJycpIGNvbnRpbnVlOwogICAgICAgIGlmIChtYl9zdHJsZW4oJG5vbSwgJ1VURi04JykgPiAxMjApICRub20gPSBtYl9zdWJzdHIoJG5vbSwgMCwgMTIwLCAnVVRGLTgnKTsKCiAgICAgICAgJGNscyA9IGlzc2V0KCRtWydjbGFzc19vcHRpb24nXSkgPyB0cmltKChzdHJpbmcpJG1bJ2NsYXNzX29wdGlvbiddKSA6ICcnOwogICAgICAgICRjbHNOb3JtID0gc3RydG9sb3dlcigkY2xzKTsKICAgICAgICBpZiAoJGNsc05vcm0gPT09ICcnKSAkY2xzTm9ybSA9ICdtb2RpZi1pdGVtJzsKICAgICAgICAvLyBOb3JtYWxpemUgY29tbW9uIHZhcmlhbnRzIGNvbWluZyBmcm9tIGRpZmZlcmVudCBjbGllbnRzL3N5c3RlbXMuCiAgICAgICAgaWYgKCRjbHNOb3JtID09PSAnY29tcG9zaXRpb24nIHx8ICRjbHNOb3JtID09PSAncmVtb3ZlZCcgfHwgJGNsc05vcm0gPT09ICdyZW1vdmUnIHx8ICRjbHNOb3JtID09PSAncmV0cmFpdCcgfHwgJGNsc05vcm0gPT09ICdpbmdyZWRpZW50LXJlbW92ZWQnKSB7CiAgICAgICAgICAkY2xzTm9ybSA9ICdjb21wb3NpdGlvbi1pdGVtJzsKICAgICAgICB9CiAgICAgICAgJGtub3duSW50ZW50Q2xhc3NlcyA9IFsnY29tcG9zaXRpb24taXRlbScsICdleHRyYS1pdGVtJywgJ29wdGlvbi1pdGVtJywgJ2luZ3JlZGllbnQtaXRlbSddOwogICAgICAgIGlmIChtYl9zdHJsZW4oJGNscywgJ1VURi04JykgPiA2MCkgJGNscyA9IG1iX3N1YnN0cigkY2xzLCAwLCA2MCwgJ1VURi04Jyk7CgogICAgICAgICRkcCA9ICRtWydkYXRhX3ByaWNlJ10gPz8gMDsKICAgICAgICAkbiA9IGlzX251bWVyaWMoJGRwKSA/IChmbG9hdCkkZHAgOiAwLjA7CiAgICAgICAgJGRwU3RyID0gbnVtYmVyX2Zvcm1hdCgkbiwgMiwgJy4nLCAnJyk7CgogICAgICAgIC8vIEhldXJpc3RpYzogaWYgcHJpY2UgaXMgMCBhbmQgaXQncyBOT1QgYW4gZXhwbGljaXQgIisgb3B0aW9uIiwKICAgICAgICAvLyB0cmVhdCBpdCBhcyBhIHJlbW92ZWQgY29tcG9zaXRpb24gaW5ncmVkaWVudCBmb3IgcHJpbnRpbmcgcGFyaXR5LgogICAgICAgIC8vIChLZWVwcyBwYWlkIGV4dHJhcy9vcHRpb25zIHVuY2hhbmdlZC4pCiAgICAgICAgaWYgKCFpbl9hcnJheSgkY2xzTm9ybSwgJGtub3duSW50ZW50Q2xhc3NlcywgdHJ1ZSkgJiYgYWJzKCRuKSA8IDAuMDAwMDEgJiYgcHJlZ19tYXRjaCgnL15ccypcKy91JywgJG5vbSkgIT09IDEpIHsKICAgICAgICAgICRjbHNOb3JtID0gJ2NvbXBvc2l0aW9uLWl0ZW0nOwogICAgICAgIH0KCiAgICAgICAgJHN0bXRNLT5iaW5kVmFsdWUoJzpsaW5lX2lkJywgJGxpbmVJZCwgUERPOjpQQVJBTV9JTlQpOwogICAgICAgICRzdG10TS0+YmluZFZhbHVlKCc6bm9tX29wdGlvbicsICRub20sIFBETzo6UEFSQU1fU1RSKTsKICAgICAgICAkc3RtdE0tPmJpbmRWYWx1ZSgnOmNsYXNzX29wdGlvbicsICRjbHNOb3JtLCBQRE86OlBBUkFNX1NUUik7CiAgICAgICAgJHN0bXRNLT5iaW5kVmFsdWUoJzpkYXRhX3ByaWNlJywgJGRwU3RyLCBQRE86OlBBUkFNX1NUUik7CiAgICAgICAgJHN0bXRNLT5leGVjdXRlKCk7CiAgICAgICAgJG1vZGlmQ291bnQgKz0gMTsKICAgICAgfQogICAgfQogIH0KCiAgJGN1c3RvbWVyUm93ID0gbG9hZEN1c3RvbWVyQnlJZCgkcGRvLCAkaWRDbGllbnQpOwogIGlmIChpc19hcnJheSgkY3VzdG9tZXJSb3cpKSB7CiAgICAkbG95YWx0eUd1YXJkID0gZW5mb3JjZU9yZGVyRmluYWxMb3lhbHR5VXNhZ2UoJHBkbywgJGN1c3RvbWVyUm93LCAkc3RvcmUsICRvcmRlcklkLCAkaGV1cmVQcmVwYU1zLCAncmVqZWN0Jyk7CiAgICBpZiAoZW1wdHkoJGxveWFsdHlHdWFyZFsnb2snXSkpIHsKICAgICAgJHBkby0+cm9sbEJhY2soKTsKICAgICAgcmVzcG9uZCg0MDksIFsKICAgICAgICAnb2snID0+IGZhbHNlLAogICAgICAgICdlcnJvcicgPT4gJ2xveWFsdHlfYWxyZWFkeV91c2VkX29uX2RheScsCiAgICAgICAgJ2tpbmQnID0+ICdidXNpbmVzc19ydWxlX3JlY2FsY19yZXF1aXJlZCcsCiAgICAgICAgJ21lc3NhZ2UnID0+ICdM4oCZYXZhbnRhZ2UgZmlkw6lsaXTDqSBhIGTDqWrDoCDDqXTDqSBjb25zb21tw6kgc3VyIGNldHRlIGpvdXJuw6llIHBvdXIgY2UgY2xpZW50L2dyb3VwZS4gTWVyY2kgZGUgcmVjYWxjdWxlciBsYSBjb21tYW5kZS4nLAogICAgICAgICdkYXRlX29ubHknID0+IChzdHJpbmcpKCRsb3lhbHR5R3VhcmRbJ2RhdGVfb25seSddID8/ICRkYXRlT25seSksCiAgICAgIF0pOwogICAgfQogIH0KCiAgLy8gUXVldWUgRVNDL1BPUyBwcmludCBqb2IgKHJlY2VpcHQgdGlja2V0IGZyb20gc2F2ZWQgb3JkZXIpIGF0b21pY2FsbHkgd2l0aCB0aGUgb3JkZXIgc2F2ZS4KICAkcHJpbnRRdWV1ZWQgPSBmYWxzZTsKICAkcHJpbnRKb2JJZCA9IDA7CiAgaWYgKGZ1bmN0aW9uX2V4aXN0cygncXVldWVPcmRlclJlY2VpcHRUaWNrZXRKb2InKSkgewogICAgdHJ5IHsKICAgICAgJHByaW50Sm9iSWQgPSAoaW50KXF1ZXVlT3JkZXJSZWNlaXB0VGlja2V0Sm9iKCRwZG8sICRzdG9yZSwgJG9yZGVySWQsICdjYWlzc2UnKTsKICAgICAgaWYgKCRwcmludEpvYklkID4gMCkgJHByaW50UXVldWVkID0gdHJ1ZTsKICAgICAgZWxzZSBlcnJvcl9sb2coIltzYXZlT3JkZXJdIHByaW50IGpvYiBpbnNlcnQgZmFpbGVkIChmYWlsLXNhZmUpIHN0b3JlPXskc3RvcmV9IG9yZGVyX2lkPXskb3JkZXJJZH0iKTsKICAgIH0gY2F0Y2ggKFRocm93YWJsZSAkZVByaW50KSB7CiAgICAgIGVycm9yX2xvZygiW3NhdmVPcmRlcl0gcHJpbnQgam9iIGZhaWxlZCAoZmFpbC1zYWZlKSBzdG9yZT17JHN0b3JlfSBvcmRlcl9pZD17JG9yZGVySWR9IGVycj0iIC4gJGVQcmludC0+Z2V0TWVzc2FnZSgpKTsKICAgIH0KICB9IGVsc2UgewogICAgZXJyb3JfbG9nKCJbc2F2ZU9yZGVyXSBwcmludEpvYnMgaGVscGVyIG1pc3Npbmc7IHNraXAgcHJpbnQgam9iIHN0b3JlPXskc3RvcmV9IG9yZGVyX2lkPXskb3JkZXJJZH0iKTsKICB9CgogIC8vIFF1ZXVlIFNNUyAoZmFpbC1zYWZlKTogdXNlcyBwb3NfdGV4dF9zbXMgdGVtcGxhdGVzICsgc3RkX2NsaWVudHMuc3RvcF9zbXMgb3B0LW91dC4KICAvLyBLZWVwIGluc2lkZSB0aGUgc2FtZSB0cmFuc2FjdGlvbiBhcyBvcmRlciBzYXZlLgogIGlmIChmdW5jdGlvbl9leGlzdHMoJ3F1ZXVlT3JkZXJTbXMnKSkgewogICAgdHJ5IHsKICAgICAgJHNtc1R5cGUgPSAkbW9kaWZDb21tYW5kZSA/ICdvcmRlcl9tb2RpZicgOiAnb3JkZXJfY29uZmlybSc7CiAgICAgICRkZWxpdmVyeU1vZGUgPSAoJGxpdnJhaXNvbiA9PT0gMSkgPyAnZGVsaXZlcnknIDogJ3BpY2t1cCc7CiAgICAgIHF1ZXVlT3JkZXJTbXMoJHBkbywgJHN0b3JlLCAkb3JkZXJJZCwgJGlkQ2xpZW50LCAkc21zVHlwZSwgJGRlbGl2ZXJ5TW9kZSk7CiAgICB9IGNhdGNoIChUaHJvd2FibGUgJGVTbXMpIHsKICAgICAgLy8gRmFpbC1zYWZlOiBuZXZlciBibG9jayBvcmRlciB2YWxpZGF0aW9uIG9uIFNNUyBpc3N1ZXMuCiAgICAgIGVycm9yX2xvZygiW3NhdmVPcmRlcl0gU01TIHNraXBwZWQgKGZhaWwtc2FmZSk6IHN0b3JlPXskc3RvcmV9IG9yZGVyX2lkPXskb3JkZXJJZH0gZXJyPSIgLiAkZVNtcy0+Z2V0TWVzc2FnZSgpKTsKICAgIH0KICB9IGVsc2UgewogICAgZXJyb3JfbG9nKCJbc2F2ZU9yZGVyXSBzbXNRdWV1ZSBoZWxwZXIgbWlzc2luZzsgc2tpcCBTTVMgc3RvcmU9eyRzdG9yZX0gb3JkZXJfaWQ9eyRvcmRlcklkfSIpOwogIH0KCiAgJHBkby0+Y29tbWl0KCk7CgogIHJlc3BvbmQoMjAwLCBbCiAgICAnb2snID0+IHRydWUsCiAgICAnc3RvcmUnID0+ICRzdG9yZSwKICAgICdvcmRlcl9pZCcgPT4gJG9yZGVySWQsCiAgICAnaWRfY2xpZW50JyA9PiAkaWRDbGllbnQsIC8vIHJlbGlhYmxlIChuZXcgb3IgZXhpc3RpbmcgYWZ0ZXIgdXBzZXJ0KQogICAgJ2lkX2RhdGUnID0+ICRpZERhdGUsCiAgICAnZGF0ZV9vbmx5JyA9PiAkZGF0ZU9ubHksCiAgICAnaGV1cmVfcHJlcGEnID0+ICRoZXVyZVByZXBhTXMsCiAgICAndGVtcF9hZGRyZXNzX2lkJyA9PiAkdGVtcEFkZHJlc3NJZCwKICAgICduYnJfcGl6emFzJyA9PiAkbmJyUGl6emFzLAogICAgJ3ByaXhfY29tJyA9PiAoZmxvYXQpJHByaXhDb21TdHIsCiAgICAncGF5TGluaycgPT4gJHBheUxpbmssCiAgICAndmVyaWZfY29kZScgPT4gJHZlcmlmQ29kZSwKICAgICdsaW5lc19pbnNlcnRlZCcgPT4gJGxpbmVDb3VudCwKICAgICdtb2RpZnNfaW5zZXJ0ZWQnID0+ICRtb2RpZkNvdW50LAogICAgJ3ByaW50X2pvYicgPT4gWwogICAgICAncXVldWVkJyA9PiAkcHJpbnRRdWV1ZWQsCiAgICAgICdqb2JfaWQnID0+ICRwcmludEpvYklkLAogICAgXSwKICBdKTsKfSBjYXRjaCAoVGhyb3dhYmxlICRlKSB7CiAgdHJ5IHsKICAgIGlmICgkcGRvLT5pblRyYW5zYWN0aW9uKCkpICRwZG8tPnJvbGxCYWNrKCk7CiAgfSBjYXRjaCAoVGhyb3dhYmxlICRlMikge30KICAkc3RvcmVMb2cgPSBpc3NldCgkc3RvcmUpID8gKHN0cmluZykkc3RvcmUgOiAnJzsKICBlcnJvcl9sb2coIltzYXZlT3JkZXJdIGNyYXNoIHN0b3JlPXskc3RvcmVMb2d9IGVycj0iIC4gJGUtPmdldE1lc3NhZ2UoKSAuICIgQCAiIC4gJGUtPmdldEZpbGUoKSAuICI6IiAuICRlLT5nZXRMaW5lKCkpOwogIHJlc3BvbmQoNTAwLCBbJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnU2VydmVyIGVycm9yJywgJ2tpbmQnID0+ICdzZXJ2ZXJfZXJyb3InXSk7Cn0K"
            }
        },
        {
            "path": "caisse-aqp/public/api/updateOrder.php",
            "kind": "file",
            "before": {
                "exists": true,
                "kind": "file",
                "size": 26306,
                "sha1": "0aa202b56d5ab387819f76d7cb923cb02162489a",
                "content_b64": "PD9waHAKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgovKiBkb2MtcHJvamVjdCB8IGNhaXNzZS1hcXAvcHVibGljL2FwaS91cGRhdGVPcmRlci5waHAgfCBNZXQgw6Agam91ciB1bmUgY29tbWFuZGUgZXhpc3RhbnRlLCBzZXMgbGlnbmVzLCBzZXMgbW9kaWZzLCBsZSBjbGllbnQsIGzigJlhZHJlc3NlIGRlIGxpdnJhaXNvbiBwcm92aXNvaXJlIHBvcnTDqWUgcGFyIGxhIGNvbW1hbmRlLCBwdWlzIGTDqWNsZW5jaGUgbGVzIGVmZmV0cyBkZSBib3JkIGRlIHByw6lwYXJhdGlvbi9ub3RpZmljYXRpb24sIGF2ZWMgdmFsaWRhdGlvbiBzZXJ2ZXVyIGRlcyBjb3VwbGVzIGNvZGUgcG9zdGFsIC8gdmlsbGUgYXV0b3Jpc8OpcyBzZWxvbiBsZSBQRFYgbG9yc3F14oCZdW5lIG9wdGlvbiB2YWxpZGUgZXN0IGNob2lzaWUsIGNvbnNlcnZhdGlvbiBleHBsaWNpdGUgZGVzIHZhbGV1cnMgZXhpc3RhbnRlcyBxdWFuZCBsZSBzw6lsZWN0ZXVyIGNvbXBvc2l0ZSBuZSBmb3Vybml0IGF1Y3VuZSBjb3JyZXNwb25kYW5jZSBleHBsb2l0YWJsZSwgZXQgcmV2YWxpZGF0aW9uIGJsb3F1YW50ZSBkZSBsYSBmaWTDqWxpdMOpIGp1c3RlIGF2YW50IHZhbGlkYXRpb24gZmluYWxlIGRlIGxhIGNvbW1hbmRlIG1vZGlmacOpZS4gfCBFeHBvc2U6IHJlc3BvbmQsIG5vcm1hbGl6ZUJvb2wsIHNob3VsZFByZXNlcnZlRGVsaXZlcnlDaXR5UGF5bG9hZCB8IETDqXBlbmQgZGU6IGNvbmZpZy5waHAsIF9saWIvc3RvcmVTbG90Q29uZmlnLnBocCwgX2xpYi9jaGlwU2xvdHMucGhwLCBfbGliL2NsaWVudFVwc2VydC5waHAsIF9saWIvcHJpbnRKb2JzLnBocCwgX2xpYi9zbXNRdWV1ZS5waHAsIF9saWIvZmlyc3ROYW1lc1Vwc2VydC5waHAsIF9saWIvdGVtcEFkZHJlc3MucGhwLCBfbGliL2RlbGl2ZXJ5Q2l0eUNob2ljZXMucGhwLCBsaWIvbG95YWx0eS5waHAgfCBJbXBhY3RlOiBCREQsIGZpbGUgZOKAmWF0dGVudGUgZOKAmWltcHJlc3Npb24sIGZpbGUgU01TLCBsb2dzIHNlcnZldXIsIHZhbGlkYXRpb24gbcOpdGllciBkZXMgYWRyZXNzZXMgY2Fpc3NlLCBibG9jYWdlIHNlcnZldXIgZGVzIGNvbmZsaXRzIGZpZMOpbGl0w6kgfCBUYWJsZXM6IHBvc19jb21tYW5kZXMoaWQsIGlkX2RhdGUsIGhldXJlX3ByZXBhLCBpZF9jbGllbnQsIGxpdnJhaXNvbiwgY291cGUsIG5icl9waXp6YXMsIHByaXhfY29tLCBhZHJlc3NlX3RlbXBvcmFpcmUsIHN0YXR1dCksIHBvc19waXp6YXNfY29tbWFuZGVlcyhpZCwgaWRfcG9zX3BpenphcywgZGF0YV9pZCwgaXNfd2ViX2FkZGl0aW9uLCBpc19mcmVlKSwgcG9zX21vZGlmc19waXp6YXMoaWQsIG5vbV9vcHRpb24sIGNsYXNzX29wdGlvbiwgZGF0YV9wcmljZSksIHBvc190ZW1wX2FkcmVzc2VzICovCmhlYWRlcignQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04Jyk7Ci8vIE5ldmVyIGNhY2hlIHdyaXRlcwpoZWFkZXIoJ0NhY2hlLUNvbnRyb2w6IG5vLXN0b3JlLCBuby1jYWNoZSwgbXVzdC1yZXZhbGlkYXRlLCBtYXgtYWdlPTAnKTsKaGVhZGVyKCdQcmFnbWE6IG5vLWNhY2hlJyk7CmhlYWRlcignRXhwaXJlczogMCcpOwoKZnVuY3Rpb24gcmVzcG9uZChpbnQgJGNvZGUsIGFycmF5ICRwYXlsb2FkKTogdm9pZCB7CiAgaHR0cF9yZXNwb25zZV9jb2RlKCRjb2RlKTsKICBlY2hvIGpzb25fZW5jb2RlKCRwYXlsb2FkLCBKU09OX1VORVNDQVBFRF9VTklDT0RFIHwgSlNPTl9VTkVTQ0FQRURfU0xBU0hFUyk7CiAgZXhpdDsKfQoKLyoqCiAqIE5vcm1hbGl6ZSBtaXhlZCBKU09OIGlucHV0cyB0byBib29sZWFuLgogKiBBY2NlcHRzIGJvb2wsIDAvMSwgInRydWUiLyJmYWxzZSIsICJvbiIvIm9mZiIuCiAqLwpmdW5jdGlvbiBub3JtYWxpemVCb29sKCR2KTogYm9vbCB7CiAgaWYgKGlzX2Jvb2woJHYpKSByZXR1cm4gJHY7CiAgaWYgKGlzX2ludCgkdikgfHwgaXNfZmxvYXQoJHYpKSByZXR1cm4gKChpbnQpJHYpID09PSAxOwogICRzID0gc3RydG9sb3dlcih0cmltKChzdHJpbmcpKCR2ID8/ICcnKSkpOwogIGlmICgkcyA9PT0gJzEnIHx8ICRzID09PSAndHJ1ZScgfHwgJHMgPT09ICdvbicgfHwgJHMgPT09ICd5ZXMnKSByZXR1cm4gdHJ1ZTsKICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIHNob3VsZFByZXNlcnZlRGVsaXZlcnlDaXR5UGF5bG9hZCgkcGF5bG9hZCk6IGJvb2wgewogICRzcmMgPSBpc19hcnJheSgkcGF5bG9hZCkgPyAkcGF5bG9hZCA6IFtdOwogIHJldHVybiBub3JtYWxpemVCb29sKCRzcmNbJ2RlbGl2ZXJ5Q2l0eUNob2ljZVByZXNlcnZlRXhpc3RpbmcnXSA/PyBmYWxzZSk7Cn0KCkByZXF1aXJlX29uY2UgX19ESVJfXyAuICcvLi4vLi4vY29uZmlnLnBocCc7CkByZXF1aXJlX29uY2UgX19ESVJfXyAuICcvX2xpYi9zdG9yZVNsb3RDb25maWcucGhwJzsKQHJlcXVpcmVfb25jZSBfX0RJUl9fIC4gJy9fbGliL2NoaXBTbG90cy5waHAnOwpAcmVxdWlyZV9vbmNlIF9fRElSX18gLiAnL19saWIvY2xpZW50VXBzZXJ0LnBocCc7CkByZXF1aXJlX29uY2UgX19ESVJfXyAuICcvX2xpYi9wcmludEpvYnMucGhwJzsKQHJlcXVpcmVfb25jZSBfX0RJUl9fIC4gJy9fbGliL3Ntc1F1ZXVlLnBocCc7CkByZXF1aXJlX29uY2UgX19ESVJfXyAuICcvX2xpYi9maXJzdE5hbWVzVXBzZXJ0LnBocCc7CkByZXF1aXJlX29uY2UgX19ESVJfXyAuICcvX2xpYi90ZW1wQWRkcmVzcy5waHAnOwpAcmVxdWlyZV9vbmNlIF9fRElSX18gLiAnL19saWIvZGVsaXZlcnlDaXR5Q2hvaWNlcy5waHAnOwpAcmVxdWlyZV9vbmNlIF9fRElSX18gLiAnL2xpYi9sb3lhbHR5LnBocCc7CgppZiAoIWlzc2V0KCRwZG8pIHx8ICEoJHBkbyBpbnN0YW5jZW9mIFBETykpIHsKICByZXNwb25kKDUwMCwgWydvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ0RCIG5vdCBjb25maWd1cmVkJ10pOwp9CgokcmF3ID0gZmlsZV9nZXRfY29udGVudHMoJ3BocDovL2lucHV0Jyk7CiRqc29uID0gaXNfc3RyaW5nKCRyYXcpID8ganNvbl9kZWNvZGUoJHJhdywgdHJ1ZSkgOiBudWxsOwppZiAoIWlzX2FycmF5KCRqc29uKSkgewogIHJlc3BvbmQoNDAwLCBbJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnSW52YWxpZCBKU09OJ10pOwp9Cgokc3RvcmUgPSBpc3NldCgkanNvblsnc3RvcmUnXSkgPyAoc3RyaW5nKSRqc29uWydzdG9yZSddIDogJyc7CmlmICghcHJlZ19tYXRjaCgnL14obGFufHBlbCkkLycsICRzdG9yZSkpIHsKICByZXNwb25kKDQwMCwgWydvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ0ludmFsaWQgc3RvcmUnXSk7Cn0KCi8vIFN0b3JlLXNwZWNpZmljIHRhYmxlcyAoc3RyaWN0IHdoaXRlbGlzdCkKJHRhYmxlT3JkZXJzID0gKCRzdG9yZSA9PT0gJ3BlbCcpID8gJ3Bvc19jb21tYW5kZXNfcGVsJyA6ICdwb3NfY29tbWFuZGVzJzsKJHRhYmxlTGluZXMgID0gKCRzdG9yZSA9PT0gJ3BlbCcpID8gJ3Bvc19waXp6YXNfY29tbWFuZGVlc19wZWwnIDogJ3Bvc19waXp6YXNfY29tbWFuZGVlcyc7CiRjb2xPcmRlckZrICA9ICgkc3RvcmUgPT09ICdwZWwnKSA/ICdpZF9wb3NfY29tbWFuZGVzX3BlbCcgOiAnaWRfcG9zX2NvbW1hbmRlcyc7CiR0YWJsZU1vZGlmcyA9ICgkc3RvcmUgPT09ICdwZWwnKSA/ICdwb3NfbW9kaWZzX3Bpenphc19wZWwnIDogJ3Bvc19tb2RpZnNfcGl6emFzJzsKJGNvbExpbmVGayAgID0gKCRzdG9yZSA9PT0gJ3BlbCcpID8gJ2lkX3Bvc19waXp6YXNfY29tbWFuZGVlc19wZWwnIDogJ2lkX3Bvc19waXp6YXNfY29tbWFuZGVlcyc7CgovLyBSZXF1aXJlZCBpZGVudGlmaWVycyAobG9hZGVkIG9yZGVyIGNvbnRleHQpCiRpZFJhdyA9ICRqc29uWydpZCddID8/IG51bGw7CiRpZERhdGVSYXcgPSAkanNvblsnaWRfZGF0ZSddID8/IG51bGw7CiRkYXRlSVNPID0gaXNzZXQoJGpzb25bJ2RhdGVJU08nXSkgPyAoc3RyaW5nKSRqc29uWydkYXRlSVNPJ10gOiAnJzsKCmlmICghaXNfbnVtZXJpYygkaWRSYXcpIHx8IChpbnQpJGlkUmF3IDw9IDApIHJlc3BvbmQoNDAwLCBbJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnSW52YWxpZCBpZCddKTsKaWYgKCFpc19udW1lcmljKCRpZERhdGVSYXcpIHx8IChpbnQpJGlkRGF0ZVJhdyA8PSAwKSByZXNwb25kKDQwMCwgWydvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ0ludmFsaWQgaWRfZGF0ZSddKTsKaWYgKCFwcmVnX21hdGNoKCcvXlxkezR9LVxkezJ9LVxkezJ9JC8nLCAkZGF0ZUlTTykpIHJlc3BvbmQoNDAwLCBbJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnSW52YWxpZCBkYXRlSVNPJ10pOwoKJG9yZGVySWQgPSAoaW50KSRpZFJhdzsKJGlkRGF0ZSA9IChpbnQpJGlkRGF0ZVJhdzsKCi8vIFVJIGZsYWcgKGZ1dHVyZSBTTVMgZGVjaXNpb24pIOKAlCBjdXJyZW50bHkgbm8tb3AgKG5vIERCIHdyaXRlKS4KJG1vZGlmQ29tbWFuZGUgPSBub3JtYWxpemVCb29sKCRqc29uWydtb2RpZl9jb21tYW5kZSddID8/IGZhbHNlKTsKaWYgKCRtb2RpZkNvbW1hbmRlKSBlcnJvcl9sb2coIlt1cGRhdGVPcmRlcl0gbW9kaWZfY29tbWFuZGU9dHJ1ZSBzdG9yZT17JHN0b3JlfSBvcmRlcl9pZD17JG9yZGVySWR9IGlkX2RhdGU9eyRpZERhdGV9Iik7CgokY291cGUgPSBpc3NldCgkanNvblsnY291cGUnXSkgPyAoaW50KSRqc29uWydjb3VwZSddIDogMDsKJGxpdnJhaXNvbiA9IGlzc2V0KCRqc29uWydsaXZyYWlzb24nXSkgPyAoaW50KSRqc29uWydsaXZyYWlzb24nXSA6IDA7CiRuYnJQaXp6YXMgPSBpc3NldCgkanNvblsnbmJyX3BpenphcyddKSA/IChpbnQpJGpzb25bJ25icl9waXp6YXMnXSA6IDA7CiRwcml4Q29tUmF3ID0gJGpzb25bJ3ByaXhfY29tJ10gPz8gbnVsbDsKJHByaXhDb20gPSBpc19udW1lcmljKCRwcml4Q29tUmF3KSA/IChmbG9hdCkkcHJpeENvbVJhdyA6IDAuMDsKJHByaXhDb21TdHIgPSBudW1iZXJfZm9ybWF0KCRwcml4Q29tLCAyLCAnLicsICcnKTsKCiR0ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MgPSAoaXNzZXQoJGpzb25bJ3RlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcyddKSAmJiBpc19hcnJheSgkanNvblsndGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzJ10pKQogID8gJGpzb25bJ3RlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcyddCiAgOiBudWxsOwoKJGhldXJlSEhNTSA9IGlzc2V0KCRqc29uWydoZXVyZV9wcmVwYV9oaG1tJ10pID8gKHN0cmluZykkanNvblsnaGV1cmVfcHJlcGFfaGhtbSddIDogJyc7CmlmICghcHJlZ19tYXRjaCgnL15cZHsyfTpcZHsyfSQvJywgJGhldXJlSEhNTSkpIHsKICByZXNwb25kKDQwMCwgWydvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ0Nob2lzaXIgdW4gY3LDqW5lYXUnXSk7Cn0KCi8vIENsaWVudCBwYXlsb2FkIChtdXN0IGJlIHBlcnNpc3RlZCBvbiBVUERBVEUgdG9vIGlmIG9wZXJhdG9yIGVkaXRlZCBmaWVsZHMpCiRwaG9uZVJhdyA9IGlzc2V0KCRqc29uWydwaG9uZU51bWJlciddKSA/IChzdHJpbmcpJGpzb25bJ3Bob25lTnVtYmVyJ10gOiAnJzsKJGNsaWVudFBheWxvYWQgPSAkanNvblsnY2xpZW50J10gPz8gbnVsbDsKCi8vIERpZmYgcGF5bG9hZAokZGlmZiA9IGlzc2V0KCRqc29uWydkaWZmJ10pICYmIGlzX2FycmF5KCRqc29uWydkaWZmJ10pID8gJGpzb25bJ2RpZmYnXSA6IFtdOwokYWRkTGlzdCA9IChpc3NldCgkZGlmZlsnYWRkJ10pICYmIGlzX2FycmF5KCRkaWZmWydhZGQnXSkpID8gJGRpZmZbJ2FkZCddIDogW107CiR1cGRMaXN0ID0gKGlzc2V0KCRkaWZmWyd1cGRhdGUnXSkgJiYgaXNfYXJyYXkoJGRpZmZbJ3VwZGF0ZSddKSkgPyAkZGlmZlsndXBkYXRlJ10gOiBbXTsKJGRlbExpc3QgPSAoaXNzZXQoJGRpZmZbJ2RlbGV0ZSddKSAmJiBpc19hcnJheSgkZGlmZlsnZGVsZXRlJ10pKSA/ICRkaWZmWydkZWxldGUnXSA6IFtdOwoKLy8gTk9URTogY2xpZW50VXBzZXJ0LnBocCBkZWZpbmVzIGNsZWFuU3RyKCkuIEF2b2lkIHJlZGVjbGFyZSBmYXRhbCBieSB1c2luZyBsb2NhbCBuYW1lcyBoZXJlLgpmdW5jdGlvbiBjbGVhblN0ckxvY2FsKCR2LCBpbnQgJG1heExlbiA9IDApOiBzdHJpbmcgewogICRzID0gdHJpbSgoc3RyaW5nKSgkdiA/PyAnJykpOwogIGlmICgkcyA9PT0gJycpIHJldHVybiAnJzsKICBpZiAoJG1heExlbiA+IDAgJiYgbWJfc3RybGVuKCRzLCAnVVRGLTgnKSA+ICRtYXhMZW4pICRzID0gbWJfc3Vic3RyKCRzLCAwLCAkbWF4TGVuLCAnVVRGLTgnKTsKICByZXR1cm4gJHM7Cn0KCmZ1bmN0aW9uIHJvdW5kMkxvY2FsKCR2KTogZmxvYXQgewogICRuID0gaXNfbnVtZXJpYygkdikgPyAoZmxvYXQpJHYgOiAwLjA7CiAgcmV0dXJuIHJvdW5kKCRuLCAyKTsKfQoKLy8gUm9idXN0IG1vbmV5IHBhcnNpbmcgPT4gaW50ZWdlciBjZW50cyAoYXZvaWQgZmxvYXQgZHJpZnQgaW4gY29tcGFyaXNvbnMpCmZ1bmN0aW9uIG1vbmV5VG9DZW50c0xvY2FsKCR2KTogaW50IHsKICAkcyA9IHRyaW0oKHN0cmluZykoJHYgPz8gJycpKTsKICBpZiAoJHMgPT09ICcnKSByZXR1cm4gMDsKICAkcyA9IHN0cl9yZXBsYWNlKFsi4oKsIiwgIiAiXSwgIiIsICRzKTsKICAkcyA9IHN0cl9yZXBsYWNlKCIsIiwgIi4iLCAkcyk7CgogIGlmICghcHJlZ19tYXRjaCgnL14oWystXSk/KFxkKykoPzpcLihcZHsxLDJ9KSk/JC8nLCAkcywgJG0pKSByZXR1cm4gMDsKICAkc2lnbiA9ICgoJG1bMV0gPz8gJycpID09PSAnLScpID8gLTEgOiAxOwogICRldXJvcyA9IChpbnQpJG1bMl07CiAgJGNlbnRzID0gaXNzZXQoJG1bM10pID8gKGludClzdHJfcGFkKChzdHJpbmcpJG1bM10sIDIsICcwJykgOiAwOwogIHJldHVybiAkc2lnbiAqICgkZXVyb3MgKiAxMDAgKyAkY2VudHMpOwp9CgovLyBDb21wdXRlIG9yZGVyIHRvdGFsIChsaW5lcyBiYXNlIHByaWNlX2xhcmdlICsgbW9kaWZzIGRhdGFfcHJpY2UpIGluIGNlbnRzLgovLyBVc2VzIERCIGFzIHNvdXJjZS1vZi10cnV0aCAod29ya3MgZXZlbiBpZiBwcml4X2NvbSBpcyBzdGFsZSBvciBmbG9hdC1yb3VuZGVkKS4KZnVuY3Rpb24gZmV0Y2hPcmRlclRvdGFsQ2VudHNMb2NhbChQRE8gJHBkbywgc3RyaW5nICR0YWJsZUxpbmVzLCBzdHJpbmcgJHRhYmxlTW9kaWZzLCBzdHJpbmcgJGNvbE9yZGVyRmssIHN0cmluZyAkY29sTGluZUZrLCBpbnQgJG9yZGVySWQpOiBpbnQgewogICR0b3RhbCA9IDA7CiAgJGxpbmVJZHMgPSBbXTsKCiAgLy8gTGluZXMgYmFzZSBwcmljZSAocG9zX3Bpenphcy5wcmljZV9sYXJnZSkKICAkc3RtdCA9ICRwZG8tPnByZXBhcmUoIgogICAgU0VMRUNUIHBwYy5pZCBBUyBsaW5lX2lkLCBwcC5wcmljZV9sYXJnZSBBUyBwcmljZV9sYXJnZQogICAgRlJPTSB7JHRhYmxlTGluZXN9IHBwYwogICAgTEVGVCBKT0lOIHBvc19waXp6YXMgcHAgT04gcHBjLmlkX3Bvc19waXp6YXMgPSBwcC5pZAogICAgV0hFUkUgcHBjLnskY29sT3JkZXJGa30gPSA6b3JkZXJfaWQKICAiKTsKICAkc3RtdC0+YmluZFZhbHVlKCc6b3JkZXJfaWQnLCAkb3JkZXJJZCwgUERPOjpQQVJBTV9JTlQpOwogICRzdG10LT5leGVjdXRlKCk7CiAgd2hpbGUgKCRyID0gJHN0bXQtPmZldGNoKFBETzo6RkVUQ0hfQVNTT0MpKSB7CiAgICAkbGlkID0gKGludCkoJHJbJ2xpbmVfaWQnXSA/PyAwKTsKICAgIGlmICgkbGlkID4gMCkgJGxpbmVJZHNbXSA9ICRsaWQ7CiAgICAkdG90YWwgKz0gbW9uZXlUb0NlbnRzTG9jYWwoJHJbJ3ByaWNlX2xhcmdlJ10gPz8gMCk7CiAgfQoKICAvLyBPcHRpb25zL21vZGlmcyBzdW0gKGRhdGFfcHJpY2UpCiAgaWYgKCRsaW5lSWRzKSB7CiAgICAkcGggPSBpbXBsb2RlKCcsJywgYXJyYXlfZmlsbCgwLCBjb3VudCgkbGluZUlkcyksICc/JykpOwogICAgJHN0bXRNID0gJHBkby0+cHJlcGFyZSgiU0VMRUNUIGRhdGFfcHJpY2UgRlJPTSB7JHRhYmxlTW9kaWZzfSBXSEVSRSB7JGNvbExpbmVGa30gSU4gKHskcGh9KSIpOwogICAgZm9yZWFjaCAoJGxpbmVJZHMgYXMgJGkgPT4gJGxpZCkgJHN0bXRNLT5iaW5kVmFsdWUoJGkgKyAxLCAkbGlkLCBQRE86OlBBUkFNX0lOVCk7CiAgICAkc3RtdE0tPmV4ZWN1dGUoKTsKICAgIHdoaWxlICgkbSA9ICRzdG10TS0+ZmV0Y2goUERPOjpGRVRDSF9BU1NPQykpIHsKICAgICAgJHRvdGFsICs9IG1vbmV5VG9DZW50c0xvY2FsKCRtWydkYXRhX3ByaWNlJ10gPz8gMCk7CiAgICB9CiAgfQoKICByZXR1cm4gKGludCkkdG90YWw7Cn0KCmZ1bmN0aW9uIG5vcm1hbGl6ZUxpbmVGb3JJbnNlcnQoJGl0KTogYXJyYXkgewogICRhID0gaXNfYXJyYXkoJGl0KSA/ICRpdCA6IFtdOwogICRwaWQgPSBpc3NldCgkYVsnaWRfcG9zX3BpenphcyddKSA/IChpbnQpJGFbJ2lkX3Bvc19waXp6YXMnXSA6IDA7CiAgJGRhdGFJZCA9IGNsZWFuU3RyTG9jYWwoJGFbJ2RhdGFfaWQnXSA/PyAnJywgODApOwogICRjbHMgPSBzdHJ0b2xvd2VyKGNsZWFuU3RyTG9jYWwoJGFbJ2NsYXNzJ10gPz8gJycsIDQwKSk7CiAgJG1vZGlmcyA9IChpc3NldCgkYVsnbW9kaWZzJ10pICYmIGlzX2FycmF5KCRhWydtb2RpZnMnXSkpID8gJGFbJ21vZGlmcyddIDogW107CiAgcmV0dXJuIFsKICAgICdpZF9wb3NfcGl6emFzJyA9PiAkcGlkLAogICAgJ2RhdGFfaWQnID0+ICRkYXRhSWQsCiAgICAnY2xhc3MnID0+ICRjbHMsCiAgICAnbW9kaWZzJyA9PiAkbW9kaWZzLAogIF07Cn0KCmZ1bmN0aW9uIG5vcm1hbGl6ZVVwZGF0ZUxpbmUoJGl0KTogYXJyYXkgewogICRhID0gaXNfYXJyYXkoJGl0KSA/ICRpdCA6IFtdOwogICRvaWQgPSBpc3NldCgkYVsnb3JkZXJlZF9pZCddKSA/IChpbnQpJGFbJ29yZGVyZWRfaWQnXSA6IDA7CiAgJHBpZCA9IGlzc2V0KCRhWydpZF9wb3NfcGl6emFzJ10pID8gKGludCkkYVsnaWRfcG9zX3BpenphcyddIDogMDsKICAkZGF0YUlkID0gY2xlYW5TdHJMb2NhbCgkYVsnZGF0YV9pZCddID8/ICcnLCA4MCk7CiAgJGNscyA9IHN0cnRvbG93ZXIoY2xlYW5TdHJMb2NhbCgkYVsnY2xhc3MnXSA/PyAnJywgNDApKTsKICAkbW9kaWZzID0gKGlzc2V0KCRhWydtb2RpZnMnXSkgJiYgaXNfYXJyYXkoJGFbJ21vZGlmcyddKSkgPyAkYVsnbW9kaWZzJ10gOiBbXTsKICByZXR1cm4gWwogICAgJ29yZGVyZWRfaWQnID0+ICRvaWQsCiAgICAnaWRfcG9zX3BpenphcycgPT4gJHBpZCwKICAgICdkYXRhX2lkJyA9PiAkZGF0YUlkLAogICAgJ2NsYXNzJyA9PiAkY2xzLAogICAgJ21vZGlmcycgPT4gJG1vZGlmcywKICBdOwp9CgpmdW5jdGlvbiBub3JtYWxpemVEZWxldGVMaW5lKCRpdCk6IGludCB7CiAgJGEgPSBpc19hcnJheSgkaXQpID8gJGl0IDogW107CiAgcmV0dXJuIGlzc2V0KCRhWydvcmRlcmVkX2lkJ10pID8gKGludCkkYVsnb3JkZXJlZF9pZCddIDogMDsKfQoKZnVuY3Rpb24gdmFsaWRhdGVNb2RpZnNBcnJheSgkbW9kaWZzKTogYXJyYXkgewogICRvdXQgPSBbXTsKICBpZiAoIWlzX2FycmF5KCRtb2RpZnMpKSByZXR1cm4gJG91dDsKICBmb3JlYWNoICgkbW9kaWZzIGFzICRtKSB7CiAgICBpZiAoIWlzX2FycmF5KCRtKSkgY29udGludWU7CiAgICAkbm9tID0gY2xlYW5TdHJMb2NhbCgkbVsnbm9tX29wdGlvbiddID8/ICcnLCAxMjApOwogICAgaWYgKCRub20gPT09ICcnKSBjb250aW51ZTsKICAgICRkcCA9IHJvdW5kMkxvY2FsKCRtWydkYXRhX3ByaWNlJ10gPz8gMCk7CiAgICAkY2xzID0gY2xlYW5TdHJMb2NhbCgkbVsnY2xhc3Nfb3B0aW9uJ10gPz8gJycsIDYwKTsKICAgICRjbHNOb3JtID0gc3RydG9sb3dlcigkY2xzKTsKICAgIGlmICgkY2xzTm9ybSA9PT0gJycpICRjbHNOb3JtID0gJ21vZGlmLWl0ZW0nOwogICAgLy8gTm9ybWFsaXplIGNvbW1vbiB2YXJpYW50cyBjb21pbmcgZnJvbSBkaWZmZXJlbnQgY2xpZW50cy9zeXN0ZW1zLgogICAgaWYgKCRjbHNOb3JtID09PSAnY29tcG9zaXRpb24nIHx8ICRjbHNOb3JtID09PSAncmVtb3ZlZCcgfHwgJGNsc05vcm0gPT09ICdyZW1vdmUnIHx8ICRjbHNOb3JtID09PSAncmV0cmFpdCcgfHwgJGNsc05vcm0gPT09ICdpbmdyZWRpZW50LXJlbW92ZWQnKSB7CiAgICAgICRjbHNOb3JtID0gJ2NvbXBvc2l0aW9uLWl0ZW0nOwogICAgfQogICAgJGtub3duSW50ZW50Q2xhc3NlcyA9IFsnY29tcG9zaXRpb24taXRlbScsICdleHRyYS1pdGVtJywgJ29wdGlvbi1pdGVtJywgJ2luZ3JlZGllbnQtaXRlbSddOwogICAgLy8gSGV1cmlzdGljOiBpZiBwcmljZSBpcyAwIGFuZCBpdCdzIE5PVCBhbiBleHBsaWNpdCAiKyBvcHRpb24iLAogICAgLy8gdHJlYXQgaXQgYXMgYSByZW1vdmVkIGNvbXBvc2l0aW9uIGluZ3JlZGllbnQgZm9yIHByaW50aW5nIHBhcml0eS4KICAgIGlmICghaW5fYXJyYXkoJGNsc05vcm0sICRrbm93bkludGVudENsYXNzZXMsIHRydWUpICYmIGFicygkZHApIDwgMC4wMDAwMSAmJiBwcmVnX21hdGNoKCcvXlxzKlwrL3UnLCAkbm9tKSAhPT0gMSkgewogICAgICAkY2xzTm9ybSA9ICdjb21wb3NpdGlvbi1pdGVtJzsKICAgIH0KICAgICRvdXRbXSA9IFsKICAgICAgJ25vbV9vcHRpb24nID0+ICRub20sCiAgICAgICdjbGFzc19vcHRpb24nID0+ICRjbHNOb3JtLAogICAgICAnZGF0YV9wcmljZScgPT4gJGRwLAogICAgXTsKICB9CiAgcmV0dXJuICRvdXQ7Cn0KCnRyeSB7CiAgJHR6ID0gbmV3IERhdGVUaW1lWm9uZSgnRXVyb3BlL1BhcmlzJyk7CiAgJGRheSA9IERhdGVUaW1lSW1tdXRhYmxlOjpjcmVhdGVGcm9tRm9ybWF0KCdZLW0tZCcsICRkYXRlSVNPLCAkdHopOwogIGlmICghJGRheSkgcmVzcG9uZCg0MDAsIFsnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdJbnZhbGlkIGRhdGVJU08nXSk7CgogICRzdGFydCA9ICRkYXktPnNldFRpbWUoMCwgMCwgMCk7CiAgJGVuZCAgID0gJGRheS0+c2V0VGltZSgyMywgNTksIDU5KTsKICAkc3RhcnRNcyA9ICgoaW50KSRzdGFydC0+Zm9ybWF0KCdVJykpICogMTAwMDsKICAkZW5kTXMgICA9ICgoaW50KSRlbmQtPmZvcm1hdCgnVScpKSAqIDEwMDAgKyA5OTk7CgogIC8vIFN0cmljdCBVSSBncmlkIGNoZWNrIGZvciBISDpNTSAobm8gYWRqdXN0bWVudCkKICAkY2ZnID0gZmV0Y2hTdG9yZVNsb3RDb25maWcoJHBkbywgJHN0b3JlKTsKICAkZmlyc3REaXNwbGF5U2xvdCA9IG5vcm1hbGl6ZUhITU0oKHN0cmluZykoJGNmZ1snZmlyc3RfZGlzcGxheV9zbG90J10gPz8gJzE4OjAwJyksICcxODowMCcpOwogICRsYXN0RGlzcGxheVNsb3QgPSBub3JtYWxpemVISE1NKChzdHJpbmcpKCRjZmdbJ2xhc3RfZGlzcGxheV9zbG90J10gPz8gJzIzOjUwJyksICcyMzo1MCcpOwogICRzbG90RHVyYXRpb25NaW4gPSAoaW50KSgkY2ZnWydzbG90X2R1cmF0aW9uX21pbiddID8/IDEwKTsKICBpZiAoJHNsb3REdXJhdGlvbk1pbiA8PSAwKSAkc2xvdER1cmF0aW9uTWluID0gMTA7CiAgJGNoaXBTbG90cyA9IGJ1aWxkQ2hpcFNsb3RzRnJvbUhITU0oJGZpcnN0RGlzcGxheVNsb3QsICRsYXN0RGlzcGxheVNsb3QsICRzbG90RHVyYXRpb25NaW4pOwogICRjaGlwU2xvdFNldCA9IGFycmF5X2ZpbGxfa2V5cygkY2hpcFNsb3RzLCB0cnVlKTsKICBpZiAoIWlzc2V0KCRjaGlwU2xvdFNldFskaGV1cmVISE1NXSkpIHsKICAgIGVycm9yX2xvZygiW3VwZGF0ZU9yZGVyXSBvZmYtZ3JpZCBoZXVyZV9wcmVwYV9oaG1tOyBzdG9yZT17JHN0b3JlfSBkYXRlPXskZGF0ZUlTT30gaGhtbT17JGhldXJlSEhNTX0iKTsKICAgIHJlc3BvbmQoNDAwLCBbJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnSGV1cmUgaG9ycyBncmlsbGUgKHN0cmljdCB0aW1lKScsICdraW5kJyA9PiAnaGV1cmVfcHJlcGFfb2ZmZ3JpZCcsICdoaG1tJyA9PiAkaGV1cmVISE1NXSk7CiAgfQoKICAvLyBCdWlsZCBoZXVyZV9wcmVwYSBtcyBmcm9tIHNlbGVjdGVkIGRhdGUgKyBISDpNTSBpbiBFdXJvcGUvUGFyaXMKICAkZHQgPSBEYXRlVGltZUltbXV0YWJsZTo6Y3JlYXRlRnJvbUZvcm1hdCgnWS1tLWQgSDppJywgJGRhdGVJU08gLiAnICcgLiAkaGV1cmVISE1NLCAkdHopOwogIGlmICghJGR0KSByZXNwb25kKDQwMCwgWydvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ0ludmFsaWQgaGV1cmVfcHJlcGEnXSk7CiAgJGhldXJlUHJlcGFNcyA9ICgoaW50KSRkdC0+Zm9ybWF0KCdVJykpICogMTAwMDsKCiAgaWYgKCRoZXVyZVByZXBhTXMgPCAkc3RhcnRNcyB8fCAkaGV1cmVQcmVwYU1zID4gJGVuZE1zKSB7CiAgICByZXNwb25kKDQwMCwgWydvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ0hldXJlIGhvcnMgam91cm7DqWUgKHN0cmljdCknLCAna2luZCcgPT4gJ2hldXJlX3ByZXBhX291dF9vZl9kYXknXSk7CiAgfQoKICAvLyBMb2NhdGUgb3JkZXIgc3RyaWN0bHkgYnkgKGlkLCBpZF9kYXRlKSBhbmQgZW5zdXJlIGl0IGJlbG9uZ3MgdG8gdGhlIHNlbGVjdGVkIGRheQogICRzcWxGaW5kID0gIlNFTEVDVCBpZCwgaWRfZGF0ZSwgaGV1cmVfcHJlcGEsIGlkX2NsaWVudCwgbGl2cmFpc29uLCBhZHJlc3NlX3RlbXBvcmFpcmUKICAgICAgICAgICAgICBGUk9NIHskdGFibGVPcmRlcnN9CiAgICAgICAgICAgICAgV0hFUkUgKHN0YXR1dCBJUyBOVUxMIE9SIHN0YXR1dCA8PiAnZGVsZXRlZCcpCiAgICAgICAgICAgICAgICBBTkQgaWQgPSA6aWQKICAgICAgICAgICAgICAgIEFORCBpZF9kYXRlID0gOmlkX2RhdGUKICAgICAgICAgICAgICAgIEFORCBoZXVyZV9wcmVwYSBCRVRXRUVOIDpzdGFydE1zIEFORCA6ZW5kTXMKICAgICAgICAgICAgICBMSU1JVCAxIjsKICAkc3RtdEYgPSAkcGRvLT5wcmVwYXJlKCRzcWxGaW5kKTsKICAkc3RtdEYtPmJpbmRWYWx1ZSgnOmlkJywgJG9yZGVySWQsIFBETzo6UEFSQU1fSU5UKTsKICAkc3RtdEYtPmJpbmRWYWx1ZSgnOmlkX2RhdGUnLCAkaWREYXRlLCBQRE86OlBBUkFNX0lOVCk7CiAgJHN0bXRGLT5iaW5kVmFsdWUoJzpzdGFydE1zJywgJHN0YXJ0TXMsIFBETzo6UEFSQU1fSU5UKTsKICAkc3RtdEYtPmJpbmRWYWx1ZSgnOmVuZE1zJywgJGVuZE1zLCBQRE86OlBBUkFNX0lOVCk7CiAgJHN0bXRGLT5leGVjdXRlKCk7CiAgJGZvdW5kID0gJHN0bXRGLT5mZXRjaChQRE86OkZFVENIX0FTU09DKTsKICBpZiAoISRmb3VuZCkgewogICAgZXJyb3JfbG9nKCJbdXBkYXRlT3JkZXJdIE9yZGVyIG5vdCBmb3VuZCBmb3IgZGF5OyBzdG9yZT17JHN0b3JlfSBkYXRlSVNPPXskZGF0ZUlTT30gb3JkZXJfaWQ9eyRvcmRlcklkfSBpZF9kYXRlPXskaWREYXRlfSBzdGFydE1zPXskc3RhcnRNc30gZW5kTXM9eyRlbmRNc30iKTsKICAgIHJlc3BvbmQoNDA0LCBbJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnT3JkZXIgbm90IGZvdW5kIGZvciBkYXknXSk7CiAgfQogICRpZENsaWVudCA9IGlzc2V0KCRmb3VuZFsnaWRfY2xpZW50J10pID8gKGludCkkZm91bmRbJ2lkX2NsaWVudCddIDogMDsKCiAgLy8g4pSA4pSAIFNuYXBzaG90IEJFRk9SRSB1cGRhdGUgKERCIHNvdXJjZSBvZiB0cnV0aCkg4pSA4pSACiAgJGJlZm9yZUhldXJlUHJlcGFNcyA9IChpbnQpKCRmb3VuZFsnaGV1cmVfcHJlcGEnXSA/PyAwKTsKICAkYmVmb3JlTGl2cmFpc29uID0gKChpbnQpKCRmb3VuZFsnbGl2cmFpc29uJ10gPz8gMCkgPT09IDEpID8gMSA6IDA7CiAgJGJlZm9yZVRvdGFsQ2VudHMgPSBmZXRjaE9yZGVyVG90YWxDZW50c0xvY2FsKCRwZG8sICR0YWJsZUxpbmVzLCAkdGFibGVNb2RpZnMsICRjb2xPcmRlckZrLCAkY29sTGluZUZrLCAkb3JkZXJJZCk7CgogIC8vIE5vcm1hbGl6ZSBmbGFncwogICRjb3VwZSA9ICgkY291cGUgPT09IDEpID8gMSA6IDA7CiAgJGxpdnJhaXNvbiA9ICgkbGl2cmFpc29uID09PSAxKSA/IDEgOiAwOwogIGlmICgkbGl2cmFpc29uICE9PSAxKSAkdGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzID0gbnVsbDsKICBpZiAoJG5iclBpenphcyA8IDApICRuYnJQaXp6YXMgPSAwOwoKICBpZiAoJGxpdnJhaXNvbiA9PT0gMSAmJiBpc19hcnJheSgkY2xpZW50UGF5bG9hZCkgJiYgIXNob3VsZFByZXNlcnZlRGVsaXZlcnlDaXR5UGF5bG9hZCgkY2xpZW50UGF5bG9hZCkpIHsKICAgICRub3JtYWxpemVkQ2xpZW50UGF5bG9hZCA9IGNhaXNzZU5vcm1hbGl6ZURlbGl2ZXJ5Q2l0eVBheWxvYWQoJGNsaWVudFBheWxvYWQsICRzdG9yZSwgJ3ZpbGxlJywgJ2NvZGVfcG9zdGFsJyk7CiAgICBpZiAoZW1wdHkoJG5vcm1hbGl6ZWRDbGllbnRQYXlsb2FkWydvayddKSB8fCAhaXNfYXJyYXkoJG5vcm1hbGl6ZWRDbGllbnRQYXlsb2FkWydwYXlsb2FkJ10pKSB7CiAgICAgIHJlc3BvbmQoNDAwLCBbCiAgICAgICAgJ29rJyA9PiBmYWxzZSwKICAgICAgICAnZXJyb3InID0+ICdkZWxpdmVyeV9jaXR5X25vdF9hbGxvd2VkJywKICAgICAgICAndGFyZ2V0JyA9PiAnY2xpZW50JywKICAgICAgICAnbWVzc2FnZScgPT4gJ0FkcmVzc2UgY2xpZW50IDogdmlsbGUgLyBjb2RlIHBvc3RhbCBub24gYXV0b3Jpc8OpcyBwb3VyIGNlIHBvaW50IGRlIHZlbnRlLicsCiAgICAgIF0pOwogICAgfQogICAgJGNsaWVudFBheWxvYWQgPSAkbm9ybWFsaXplZENsaWVudFBheWxvYWRbJ3BheWxvYWQnXTsKICB9CgogIGlmICgkbGl2cmFpc29uID09PSAxICYmIGlzX2FycmF5KCR0ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MpICYmICFzaG91bGRQcmVzZXJ2ZURlbGl2ZXJ5Q2l0eVBheWxvYWQoJHRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcykpIHsKICAgICRub3JtYWxpemVkVGVtcG9yYXJ5QWRkcmVzcyA9IGNhaXNzZU5vcm1hbGl6ZURlbGl2ZXJ5Q2l0eVBheWxvYWQoJHRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcywgJHN0b3JlLCAndmlsbGUnLCAnY29kZV9wb3N0YWwnKTsKICAgIGlmIChlbXB0eSgkbm9ybWFsaXplZFRlbXBvcmFyeUFkZHJlc3NbJ29rJ10pIHx8ICFpc19hcnJheSgkbm9ybWFsaXplZFRlbXBvcmFyeUFkZHJlc3NbJ3BheWxvYWQnXSkpIHsKICAgICAgcmVzcG9uZCg0MDAsIFsKICAgICAgICAnb2snID0+IGZhbHNlLAogICAgICAgICdlcnJvcicgPT4gJ2RlbGl2ZXJ5X2NpdHlfbm90X2FsbG93ZWQnLAogICAgICAgICd0YXJnZXQnID0+ICd0ZW1wb3JhcnlfZGVsaXZlcnlfYWRkcmVzcycsCiAgICAgICAgJ21lc3NhZ2UnID0+ICdBZHJlc3NlIHByb3Zpc29pcmUgOiB2aWxsZSAvIGNvZGUgcG9zdGFsIG5vbiBhdXRvcmlzw6lzIHBvdXIgY2UgcG9pbnQgZGUgdmVudGUuJywKICAgICAgXSk7CiAgICB9CiAgICAkdGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzID0gJG5vcm1hbGl6ZWRUZW1wb3JhcnlBZGRyZXNzWydwYXlsb2FkJ107CiAgfQoKICAvLyBOb3JtYWxpemUgZGlmZiBsaW5lcwogICRhZGRzID0gW107CiAgZm9yZWFjaCAoJGFkZExpc3QgYXMgJGl0KSB7CiAgICAkbCA9IG5vcm1hbGl6ZUxpbmVGb3JJbnNlcnQoJGl0KTsKICAgIGlmICgkbFsnaWRfcG9zX3BpenphcyddIDw9IDApIHJlc3BvbmQoNDAwLCBbJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnSW52YWxpZCBhZGQgbGluZSBpZF9wb3NfcGl6emFzJ10pOwogICAgaWYgKCRsWydkYXRhX2lkJ10gPT09ICcnKSByZXNwb25kKDQwMCwgWydvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ0ludmFsaWQgYWRkIGxpbmUgZGF0YV9pZCddKTsKICAgICRsWydtb2RpZnMnXSA9IHZhbGlkYXRlTW9kaWZzQXJyYXkoJGxbJ21vZGlmcyddKTsKICAgICRhZGRzW10gPSAkbDsKICB9CiAgJHVwZHMgPSBbXTsKICBmb3JlYWNoICgkdXBkTGlzdCBhcyAkaXQpIHsKICAgICRsID0gbm9ybWFsaXplVXBkYXRlTGluZSgkaXQpOwogICAgaWYgKCRsWydvcmRlcmVkX2lkJ10gPD0gMCkgcmVzcG9uZCg0MDAsIFsnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdJbnZhbGlkIHVwZGF0ZSBvcmRlcmVkX2lkJ10pOwogICAgaWYgKCRsWydpZF9wb3NfcGl6emFzJ10gPD0gMCkgcmVzcG9uZCg0MDAsIFsnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdJbnZhbGlkIHVwZGF0ZSBsaW5lIGlkX3Bvc19waXp6YXMnXSk7CiAgICBpZiAoJGxbJ2RhdGFfaWQnXSA9PT0gJycpIHJlc3BvbmQoNDAwLCBbJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnSW52YWxpZCB1cGRhdGUgbGluZSBkYXRhX2lkJ10pOwogICAgJGxbJ21vZGlmcyddID0gdmFsaWRhdGVNb2RpZnNBcnJheSgkbFsnbW9kaWZzJ10pOwogICAgJHVwZHNbXSA9ICRsOwogIH0KICAkZGVscyA9IFtdOwogIGZvcmVhY2ggKCRkZWxMaXN0IGFzICRpdCkgewogICAgJG9pZCA9IG5vcm1hbGl6ZURlbGV0ZUxpbmUoJGl0KTsKICAgIGlmICgkb2lkID4gMCkgJGRlbHNbXSA9ICRvaWQ7CiAgfQoKICAkcGRvLT5iZWdpblRyYW5zYWN0aW9uKCk7CgogIC8vIOKUgOKUgCBVcHNlcnQgY2xpZW50IG9uIFVQREFURSAoc2FtZSBydWxlIGFzIENSRUFURSkg4pSA4pSACiAgLy8gU291cmNlIG9mIHRydXRoID0gVUkgYXQgdmFsaWRhdGUgdGltZS4gSWYgY2xpZW50IGluZm8gd2FzIGVkaXRlZCwgcGVyc2lzdCBpdC4KICAvLyBGYWlsLXNhZmU6IGlmIG5vIHBob25lIHByb3ZpZGVkLCB3ZSBrZWVwIGV4aXN0aW5nIGlkX2NsaWVudCAoYmFja3dhcmQgY29tcGF0aWJsZSksCiAgLy8gYnV0IGlmIHBob25lIGlzIHByb3ZpZGVkIGl0IG11c3QgcmVzb2x2ZSB0byBhIGNsaWVudC4KICBpZiAodHJpbSgkcGhvbmVSYXcpICE9PSAnJykgewogICAgJG5ld0NsaWVudElkID0gdXBzZXJ0Q2xpZW50RnJvbVBheWxvYWQoJHBkbywgJHBob25lUmF3LCAkY2xpZW50UGF5bG9hZCwgJHN0b3JlKTsKICAgIGlmICgkbmV3Q2xpZW50SWQgPD0gMCkgewogICAgICAkcGRvLT5yb2xsQmFjaygpOwogICAgICByZXNwb25kKDUwMCwgWydvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ1VuYWJsZSB0byByZXNvbHZlIGNsaWVudCddKTsKICAgIH0KICAgICRpZENsaWVudCA9ICRuZXdDbGllbnRJZDsKICB9CgogIC8vIEF1dG8tbGVhcm4gZmlyc3QgbmFtZSAoZmFpbC1zYWZlKTogYWRkIHRvIHBvc19saXN0ZV9wcmVub21zIGlmIG1pc3NpbmcuCiAgLy8gV2UgZG8gdGhpcyBhZnRlciBwb3RlbnRpYWwgdXBzZXJ0LCBhbmQgYWx3YXlzIGZyb20gREIgKHN0ZF9jbGllbnRzKSBzbyBpdCBhbHNvIHdvcmtzCiAgLy8gd2hlbiB0aGUgVVBEQVRFIHBheWxvYWQgaXMgYSBtZXJnZS1wYXRjaCB3aXRob3V0IG5vbV9wcmVub20uCiAgaWYgKGZ1bmN0aW9uX2V4aXN0cygncmVtZW1iZXJGaXJzdE5hbWVGcm9tQ2xpZW50SWQnKSAmJiAkaWRDbGllbnQgPiAwKSB7CiAgICB0cnkgewogICAgICByZW1lbWJlckZpcnN0TmFtZUZyb21DbGllbnRJZCgkcGRvLCAkaWRDbGllbnQpOwogICAgfSBjYXRjaCAoVGhyb3dhYmxlICRlRm4pIHsKICAgICAgLy8gRmFpbC1zYWZlOiBuZXZlciBibG9jayBvcmRlciB1cGRhdGUgb24gZmlyc3QtbmFtZSBsZWFybmluZyBpc3N1ZXMuCiAgICAgIGVycm9yX2xvZygiW3VwZGF0ZU9yZGVyXSBmaXJzdE5hbWUgdXBzZXJ0IHNraXBwZWQgKGZhaWwtc2FmZSkgc3RvcmU9eyRzdG9yZX0gY2xpZW50X2lkPXskaWRDbGllbnR9IG9yZGVyX2lkPXskb3JkZXJJZH0gZXJyPSIgLiAkZUZuLT5nZXRNZXNzYWdlKCkpOwogICAgfQogIH0KICAkZXhpc3RpbmdUZW1wQWRkcmVzc0lkID0gaXNzZXQoJGZvdW5kWydhZHJlc3NlX3RlbXBvcmFpcmUnXSkgPyAoaW50KSRmb3VuZFsnYWRyZXNzZV90ZW1wb3JhaXJlJ10gOiAwOwogICR0ZW1wQWRkcmVzc0lkID0gdGVtcEFkZHJlc3NQZXJzaXN0KCRwZG8sICR0ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MsICRleGlzdGluZ1RlbXBBZGRyZXNzSWQgPiAwID8gJGV4aXN0aW5nVGVtcEFkZHJlc3NJZCA6IG51bGwsICRzdG9yZSk7CgogIC8vIERFTEVURSBsaW5lcwogIGlmIChjb3VudCgkZGVscykgPiAwKSB7CiAgICAkcGxhY2Vob2xkZXJzID0gaW1wbG9kZSgnLCcsIGFycmF5X2ZpbGwoMCwgY291bnQoJGRlbHMpLCAnPycpKTsKICAgIC8vIGRlbGV0ZSBtb2RpZnMgZmlyc3QKICAgICRzdG10RE0gPSAkcGRvLT5wcmVwYXJlKCJERUxFVEUgRlJPTSB7JHRhYmxlTW9kaWZzfSBXSEVSRSB7JGNvbExpbmVGa30gSU4gKHskcGxhY2Vob2xkZXJzfSkiKTsKICAgIGZvcmVhY2ggKCRkZWxzIGFzICRpID0+ICRvaWQpICRzdG10RE0tPmJpbmRWYWx1ZSgkaSArIDEsIChpbnQpJG9pZCwgUERPOjpQQVJBTV9JTlQpOwogICAgJHN0bXRETS0+ZXhlY3V0ZSgpOwogICAgLy8gZGVsZXRlIGxpbmUgcm93cyAoZW5zdXJlIHRoZXkgYmVsb25nIHRvIHRoaXMgb3JkZXIpCiAgICAvLyBJTVBPUlRBTlQ6IGRvIG5vdCBtaXggcG9zaXRpb25hbCAoPykgYW5kIG5hbWVkICg6eCkgcGxhY2Vob2xkZXJzIGluIHRoZSBzYW1lIHN0YXRlbWVudCAoUERPIGVycm9yIC0+IDUwMCkuCiAgICAkc3RtdERMID0gJHBkby0+cHJlcGFyZSgiREVMRVRFIEZST00geyR0YWJsZUxpbmVzfSBXSEVSRSBpZCBJTiAoeyRwbGFjZWhvbGRlcnN9KSBBTkQgeyRjb2xPcmRlckZrfSA9ID8iKTsKICAgIGZvcmVhY2ggKCRkZWxzIGFzICRpID0+ICRvaWQpIHsKICAgICAgJHN0bXRETC0+YmluZFZhbHVlKCRpICsgMSwgKGludCkkb2lkLCBQRE86OlBBUkFNX0lOVCk7CiAgICB9CiAgICAvLyBsYXN0IHBvc2l0aW9uYWwgcGFyYW0gPSBvcmRlcl9pZAogICAgJHN0bXRETC0+YmluZFZhbHVlKGNvdW50KCRkZWxzKSArIDEsICRvcmRlcklkLCBQRE86OlBBUkFNX0lOVCk7CiAgICAkc3RtdERMLT5leGVjdXRlKCk7CiAgfQoKICAvLyBVUERBVEUgZXhpc3RpbmcgbGluZXMgKHJvdyArIG1vZGlmcyByZWZyZXNoKQogICRzdG10Q2hlY2tMaW5lID0gJHBkby0+cHJlcGFyZSgiU0VMRUNUIGlkIEZST00geyR0YWJsZUxpbmVzfSBXSEVSRSBpZCA9IDppZCBBTkQgeyRjb2xPcmRlckZrfSA9IDpvcmRlcl9pZCBMSU1JVCAxIik7CiAgJHN0bXRVTCA9ICRwZG8tPnByZXBhcmUoIlVQREFURSB7JHRhYmxlTGluZXN9IFNFVCBpZF9wb3NfcGl6emFzID0gOmlkX3Bvc19waXp6YXMsIGRhdGFfaWQgPSA6ZGF0YV9pZCBXSEVSRSBpZCA9IDppZCBBTkQgeyRjb2xPcmRlckZrfSA9IDpvcmRlcl9pZCIpOwogICRzdG10RGVsTSA9ICRwZG8tPnByZXBhcmUoIkRFTEVURSBGUk9NIHskdGFibGVNb2RpZnN9IFdIRVJFIHskY29sTGluZUZrfSA9IDpsaW5lX2lkIik7CiAgJHN0bXRJbnNNID0gJHBkby0+cHJlcGFyZSgiSU5TRVJUIElOVE8geyR0YWJsZU1vZGlmc30gKHskY29sTGluZUZrfSwgbm9tX29wdGlvbiwgY2xhc3Nfb3B0aW9uLCBkYXRhX3ByaWNlKSBWQUxVRVMgKDpsaW5lX2lkLCA6bm9tX29wdGlvbiwgOmNsYXNzX29wdGlvbiwgOmRhdGFfcHJpY2UpIik7CgogICR1cGRhdGVkTGluZXMgPSAwOwogICR1cGRhdGVkTW9kaWZzID0gMDsKICBmb3JlYWNoICgkdXBkcyBhcyAkdSkgewogICAgJG9pZCA9IChpbnQpJHVbJ29yZGVyZWRfaWQnXTsKICAgICRzdG10Q2hlY2tMaW5lLT5iaW5kVmFsdWUoJzppZCcsICRvaWQsIFBETzo6UEFSQU1fSU5UKTsKICAgICRzdG10Q2hlY2tMaW5lLT5iaW5kVmFsdWUoJzpvcmRlcl9pZCcsICRvcmRlcklkLCBQRE86OlBBUkFNX0lOVCk7CiAgICAkc3RtdENoZWNrTGluZS0+ZXhlY3V0ZSgpOwogICAgJGV4aXN0cyA9ICRzdG10Q2hlY2tMaW5lLT5mZXRjaENvbHVtbigpOwogICAgaWYgKCRleGlzdHMgPT09IGZhbHNlKSB7CiAgICAgICRwZG8tPnJvbGxCYWNrKCk7CiAgICAgIHJlc3BvbmQoNDAwLCBbJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnVXBkYXRlIGxpbmUgbm90IGluIG9yZGVyJywgJ29yZGVyZWRfaWQnID0+ICRvaWRdKTsKICAgIH0KCiAgICAkc3RtdFVMLT5iaW5kVmFsdWUoJzppZCcsICRvaWQsIFBETzo6UEFSQU1fSU5UKTsKICAgICRzdG10VUwtPmJpbmRWYWx1ZSgnOm9yZGVyX2lkJywgJG9yZGVySWQsIFBETzo6UEFSQU1fSU5UKTsKICAgICRzdG10VUwtPmJpbmRWYWx1ZSgnOmlkX3Bvc19waXp6YXMnLCAoaW50KSR1WydpZF9wb3NfcGl6emFzJ10sIFBETzo6UEFSQU1fSU5UKTsKICAgICRzdG10VUwtPmJpbmRWYWx1ZSgnOmRhdGFfaWQnLCAoc3RyaW5nKSR1WydkYXRhX2lkJ10sIFBETzo6UEFSQU1fU1RSKTsKICAgICRzdG10VUwtPmV4ZWN1dGUoKTsKICAgICR1cGRhdGVkTGluZXMgKz0gMTsKCiAgICAvLyByZWZyZXNoIG1vZGlmcwogICAgJHN0bXREZWxNLT5iaW5kVmFsdWUoJzpsaW5lX2lkJywgJG9pZCwgUERPOjpQQVJBTV9JTlQpOwogICAgJHN0bXREZWxNLT5leGVjdXRlKCk7CiAgICBmb3JlYWNoICgkdVsnbW9kaWZzJ10gYXMgJG0pIHsKICAgICAgJHN0bXRJbnNNLT5iaW5kVmFsdWUoJzpsaW5lX2lkJywgJG9pZCwgUERPOjpQQVJBTV9JTlQpOwogICAgICAkc3RtdEluc00tPmJpbmRWYWx1ZSgnOm5vbV9vcHRpb24nLCAoc3RyaW5nKSRtWydub21fb3B0aW9uJ10sIFBETzo6UEFSQU1fU1RSKTsKICAgICAgJHN0bXRJbnNNLT5iaW5kVmFsdWUoJzpjbGFzc19vcHRpb24nLCAoc3RyaW5nKSRtWydjbGFzc19vcHRpb24nXSwgUERPOjpQQVJBTV9TVFIpOwogICAgICAkc3RtdEluc00tPmJpbmRWYWx1ZSgnOmRhdGFfcHJpY2UnLCBudW1iZXJfZm9ybWF0KChmbG9hdCkkbVsnZGF0YV9wcmljZSddLCAyLCAnLicsICcnKSwgUERPOjpQQVJBTV9TVFIpOwogICAgICAkc3RtdEluc00tPmV4ZWN1dGUoKTsKICAgICAgJHVwZGF0ZWRNb2RpZnMgKz0gMTsKICAgIH0KICB9CgogIC8vIElOU0VSVCBuZXcgbGluZXMKICAkaW5zZXJ0ZWRMaW5lcyA9IDA7CiAgJGluc2VydGVkTW9kaWZzID0gMDsKICBpZiAoJHN0b3JlID09PSAncGVsJykgewogICAgJHNxbElMID0gIklOU0VSVCBJTlRPIHskdGFibGVMaW5lc30gKHskY29sT3JkZXJGa30sIGlkX3Bvc19waXp6YXMsIGRhdGFfaWQsIGRhdGFfdHlwZSwgaXNfd2ViX2FkZGl0aW9uLCBpc19mcmVlKQogICAgICAgICAgICAgIFZBTFVFUyAoOm9yZGVyX2lkLCA6aWRfcG9zX3BpenphcywgOmRhdGFfaWQsIE5VTEwsIDAsIDApIjsKICB9IGVsc2UgewogICAgJHNxbElMID0gIklOU0VSVCBJTlRPIHskdGFibGVMaW5lc30gKHskY29sT3JkZXJGa30sIGlkX3Bvc19waXp6YXMsIGRhdGFfaWQsIGlzX3dlYl9hZGRpdGlvbiwgaXNfZnJlZSkKICAgICAgICAgICAgICBWQUxVRVMgKDpvcmRlcl9pZCwgOmlkX3Bvc19waXp6YXMsIDpkYXRhX2lkLCAwLCAwKSI7CiAgfQogICRzdG10SUwgPSAkcGRvLT5wcmVwYXJlKCRzcWxJTCk7CgogIGZvcmVhY2ggKCRhZGRzIGFzICRhKSB7CiAgICAkc3RtdElMLT5iaW5kVmFsdWUoJzpvcmRlcl9pZCcsICRvcmRlcklkLCBQRE86OlBBUkFNX0lOVCk7CiAgICAkc3RtdElMLT5iaW5kVmFsdWUoJzppZF9wb3NfcGl6emFzJywgKGludCkkYVsnaWRfcG9zX3BpenphcyddLCBQRE86OlBBUkFNX0lOVCk7CiAgICAkc3RtdElMLT5iaW5kVmFsdWUoJzpkYXRhX2lkJywgKHN0cmluZykkYVsnZGF0YV9pZCddLCBQRE86OlBBUkFNX1NUUik7CiAgICAkc3RtdElMLT5leGVjdXRlKCk7CiAgICAkbGluZUlkID0gKGludCkkcGRvLT5sYXN0SW5zZXJ0SWQoKTsKICAgICRpbnNlcnRlZExpbmVzICs9IDE7CgogICAgZm9yZWFjaCAoJGFbJ21vZGlmcyddIGFzICRtKSB7CiAgICAgICRzdG10SW5zTS0+YmluZFZhbHVlKCc6bGluZV9pZCcsICRsaW5lSWQsIFBETzo6UEFSQU1fSU5UKTsKICAgICAgJHN0bXRJbnNNLT5iaW5kVmFsdWUoJzpub21fb3B0aW9uJywgKHN0cmluZykkbVsnbm9tX29wdGlvbiddLCBQRE86OlBBUkFNX1NUUik7CiAgICAgICRzdG10SW5zTS0+YmluZFZhbHVlKCc6Y2xhc3Nfb3B0aW9uJywgKHN0cmluZykkbVsnY2xhc3Nfb3B0aW9uJ10sIFBETzo6UEFSQU1fU1RSKTsKICAgICAgJHN0bXRJbnNNLT5iaW5kVmFsdWUoJzpkYXRhX3ByaWNlJywgbnVtYmVyX2Zvcm1hdCgoZmxvYXQpJG1bJ2RhdGFfcHJpY2UnXSwgMiwgJy4nLCAnJyksIFBETzo6UEFSQU1fU1RSKTsKICAgICAgJHN0bXRJbnNNLT5leGVjdXRlKCk7CiAgICAgICRpbnNlcnRlZE1vZGlmcyArPSAxOwogICAgfQogIH0KCiAgLy8gVXBkYXRlIG9yZGVyIGhlYWRlciAoa2VlcCBpZF9kYXRlIGltbXV0YWJsZTsgaGV1cmVfcHJlcGEgY2FuIG1vdmUgd2l0aGluIGRheSkKICAkc3FsVU8gPSAiVVBEQVRFIHskdGFibGVPcmRlcnN9CiAgICAgICAgICAgIFNFVCBoZXVyZV9wcmVwYSA9IDpoZXVyZV9wcmVwYSwKICAgICAgICAgICAgICAgIGlkX2NsaWVudCA9IDppZF9jbGllbnQsCiAgICAgICAgICAgICAgICBjb3VwZSA9IDpjb3VwZSwKICAgICAgICAgICAgICAgIGxpdnJhaXNvbiA9IDpsaXZyYWlzb24sCiAgICAgICAgICAgICAgICBuYnJfcGl6emFzID0gOm5icl9waXp6YXMsCiAgICAgICAgICAgICAgICBwcml4X2NvbSA9IDpwcml4X2NvbSwKICAgICAgICAgICAgICAgIGFkcmVzc2VfdGVtcG9yYWlyZSA9IDphZHJlc3NlX3RlbXBvcmFpcmUKICAgICAgICAgICAgV0hFUkUgaWQgPSA6aWQgQU5EIGlkX2RhdGUgPSA6aWRfZGF0ZSI7CiAgJHN0bXRVTyA9ICRwZG8tPnByZXBhcmUoJHNxbFVPKTsKICAkc3RtdFVPLT5iaW5kVmFsdWUoJzpoZXVyZV9wcmVwYScsICRoZXVyZVByZXBhTXMsIFBETzo6UEFSQU1fSU5UKTsKICAkc3RtdFVPLT5iaW5kVmFsdWUoJzppZF9jbGllbnQnLCAkaWRDbGllbnQsIFBETzo6UEFSQU1fSU5UKTsKICAkc3RtdFVPLT5iaW5kVmFsdWUoJzpjb3VwZScsICRjb3VwZSwgUERPOjpQQVJBTV9JTlQpOwogICRzdG10VU8tPmJpbmRWYWx1ZSgnOmxpdnJhaXNvbicsICRsaXZyYWlzb24sIFBETzo6UEFSQU1fSU5UKTsKICAkc3RtdFVPLT5iaW5kVmFsdWUoJzpuYnJfcGl6emFzJywgJG5iclBpenphcywgUERPOjpQQVJBTV9JTlQpOwogICRzdG10VU8tPmJpbmRWYWx1ZSgnOnByaXhfY29tJywgJHByaXhDb21TdHIsIFBETzo6UEFSQU1fU1RSKTsKICBpZiAoJHRlbXBBZGRyZXNzSWQgPT09IG51bGwpICRzdG10VU8tPmJpbmRWYWx1ZSgnOmFkcmVzc2VfdGVtcG9yYWlyZScsIG51bGwsIFBETzo6UEFSQU1fTlVMTCk7CiAgZWxzZSAkc3RtdFVPLT5iaW5kVmFsdWUoJzphZHJlc3NlX3RlbXBvcmFpcmUnLCAkdGVtcEFkZHJlc3NJZCwgUERPOjpQQVJBTV9JTlQpOwogICRzdG10VU8tPmJpbmRWYWx1ZSgnOmlkJywgJG9yZGVySWQsIFBETzo6UEFSQU1fSU5UKTsKICAkc3RtdFVPLT5iaW5kVmFsdWUoJzppZF9kYXRlJywgJGlkRGF0ZSwgUERPOjpQQVJBTV9JTlQpOwogICRzdG10VU8tPmV4ZWN1dGUoKTsKCiAgJGN1c3RvbWVyUm93ID0gbG9hZEN1c3RvbWVyQnlJZCgkcGRvLCAkaWRDbGllbnQpOwogIGlmIChpc19hcnJheSgkY3VzdG9tZXJSb3cpKSB7CiAgICAkbG95YWx0eUd1YXJkID0gZW5mb3JjZU9yZGVyRmluYWxMb3lhbHR5VXNhZ2UoJHBkbywgJGN1c3RvbWVyUm93LCAkc3RvcmUsICRvcmRlcklkLCAkaGV1cmVQcmVwYU1zLCAncmVqZWN0Jyk7CiAgICBpZiAoZW1wdHkoJGxveWFsdHlHdWFyZFsnb2snXSkpIHsKICAgICAgJHBkby0+cm9sbEJhY2soKTsKICAgICAgcmVzcG9uZCg0MDksIFsKICAgICAgICAnb2snID0+IGZhbHNlLAogICAgICAgICdlcnJvcicgPT4gJ2xveWFsdHlfYWxyZWFkeV91c2VkX29uX2RheScsCiAgICAgICAgJ2tpbmQnID0+ICdidXNpbmVzc19ydWxlX3JlY2FsY19yZXF1aXJlZCcsCiAgICAgICAgJ21lc3NhZ2UnID0+ICdM4oCZYXZhbnRhZ2UgZmlkw6lsaXTDqSBhIGTDqWrDoCDDqXTDqSBjb25zb21tw6kgc3VyIGNldHRlIGpvdXJuw6llIHBvdXIgY2UgY2xpZW50L2dyb3VwZS4gTWVyY2kgZGUgcmVjYWxjdWxlciBsYSBjb21tYW5kZS4nLAogICAgICAgICdkYXRlX29ubHknID0+IChzdHJpbmcpKCRsb3lhbHR5R3VhcmRbJ2RhdGVfb25seSddID8/ICRkYXRlSVNPKSwKICAgICAgXSk7CiAgICB9CiAgfQoKICAvLyBRdWV1ZSBFU0MvUE9TIHByaW50IGpvYiAocmVjZWlwdCB0aWNrZXQgZnJvbSB1cGRhdGVkIG9yZGVyKSBhdG9taWNhbGx5IHdpdGggdGhlIG9yZGVyIHVwZGF0ZS4KICAkcHJpbnRRdWV1ZWQgPSBmYWxzZTsKICAkcHJpbnRKb2JJZCA9IDA7CiAgaWYgKGZ1bmN0aW9uX2V4aXN0cygncXVldWVPcmRlclJlY2VpcHRUaWNrZXRKb2InKSkgewogICAgdHJ5IHsKICAgICAgJHByaW50Sm9iSWQgPSAoaW50KXF1ZXVlT3JkZXJSZWNlaXB0VGlja2V0Sm9iKCRwZG8sICRzdG9yZSwgJG9yZGVySWQsICdjYWlzc2UnKTsKICAgICAgaWYgKCRwcmludEpvYklkID4gMCkgJHByaW50UXVldWVkID0gdHJ1ZTsKICAgICAgZWxzZSBlcnJvcl9sb2coIlt1cGRhdGVPcmRlcl0gcHJpbnQgam9iIGluc2VydCBmYWlsZWQgKGZhaWwtc2FmZSkgc3RvcmU9eyRzdG9yZX0gb3JkZXJfaWQ9eyRvcmRlcklkfSIpOwogICAgfSBjYXRjaCAoVGhyb3dhYmxlICRlUHJpbnQpIHsKICAgICAgZXJyb3JfbG9nKCJbdXBkYXRlT3JkZXJdIHByaW50IGpvYiBmYWlsZWQgKGZhaWwtc2FmZSkgc3RvcmU9eyRzdG9yZX0gb3JkZXJfaWQ9eyRvcmRlcklkfSBlcnI9IiAuICRlUHJpbnQtPmdldE1lc3NhZ2UoKSk7CiAgICB9CiAgfSBlbHNlIHsKICAgIGVycm9yX2xvZygiW3VwZGF0ZU9yZGVyXSBwcmludEpvYnMgaGVscGVyIG1pc3Npbmc7IHNraXAgcHJpbnQgam9iIHN0b3JlPXskc3RvcmV9IG9yZGVyX2lkPXskb3JkZXJJZH0iKTsKICB9CgogIC8vIOKUgOKUgCBBdXRvIGRlY2lzaW9uOiBxdWV1ZSBTTVMgb24gVVBEQVRFIG9ubHkgaWYgKHRvdGFsIE9SIGhldXJlX3ByZXBhIE9SIGxpdnJhaXNvbikgY2hhbmdlZCDilIDilIAKICAvLyBLZWVwIGluc2lkZSB0aGUgc2FtZSB0cmFuc2FjdGlvbiBhcyBvcmRlciB1cGRhdGUgKGZhaWwtc2FmZSkuCiAgJGFmdGVyVG90YWxDZW50cyA9IGZldGNoT3JkZXJUb3RhbENlbnRzTG9jYWwoJHBkbywgJHRhYmxlTGluZXMsICR0YWJsZU1vZGlmcywgJGNvbE9yZGVyRmssICRjb2xMaW5lRmssICRvcmRlcklkKTsKICAkc2hvdWxkU2VuZFNtcyA9ICEoCiAgICAkYmVmb3JlVG90YWxDZW50cyA9PT0gJGFmdGVyVG90YWxDZW50cyAmJgogICAgJGJlZm9yZUhldXJlUHJlcGFNcyA9PT0gJGhldXJlUHJlcGFNcyAmJgogICAgJGJlZm9yZUxpdnJhaXNvbiA9PT0gJGxpdnJhaXNvbgogICk7CgogIGlmICgkc2hvdWxkU2VuZFNtcyAmJiBmdW5jdGlvbl9leGlzdHMoJ3F1ZXVlT3JkZXJTbXMnKSkgewogICAgdHJ5IHsKICAgICAgaWYgKCRpZENsaWVudCA+IDApIHsKICAgICAgICAkc21zVHlwZSA9ICdvcmRlcl9tb2RpZic7CiAgICAgICAgJGRlbGl2ZXJ5TW9kZSA9ICgkbGl2cmFpc29uID09PSAxKSA/ICdkZWxpdmVyeScgOiAncGlja3VwJzsKICAgICAgICBxdWV1ZU9yZGVyU21zKCRwZG8sICRzdG9yZSwgJG9yZGVySWQsICRpZENsaWVudCwgJHNtc1R5cGUsICRkZWxpdmVyeU1vZGUpOwogICAgICB9IGVsc2UgewogICAgICAgIGVycm9yX2xvZygiW3VwZGF0ZU9yZGVyXSBTTVMgc2tpcDogbWlzc2luZyBpZF9jbGllbnQgc3RvcmU9eyRzdG9yZX0gb3JkZXJfaWQ9eyRvcmRlcklkfSIpOwogICAgICB9CiAgICB9IGNhdGNoIChUaHJvd2FibGUgJGVTbXMpIHsKICAgICAgLy8gRmFpbC1zYWZlOiBuZXZlciBibG9jayB1cGRhdGUgb24gU01TIGlzc3Vlcy4KICAgICAgZXJyb3JfbG9nKCJbdXBkYXRlT3JkZXJdIFNNUyBza2lwcGVkIChmYWlsLXNhZmUpOiBzdG9yZT17JHN0b3JlfSBvcmRlcl9pZD17JG9yZGVySWR9IGVycj0iIC4gJGVTbXMtPmdldE1lc3NhZ2UoKSk7CiAgICB9CiAgfQoKICAkcGRvLT5jb21taXQoKTsKCiAgcmVzcG9uZCgyMDAsIFsKICAgICdvaycgPT4gdHJ1ZSwKICAgICdzdG9yZScgPT4gJHN0b3JlLAogICAgJ2lkJyA9PiAkb3JkZXJJZCwKICAgICdpZF9kYXRlJyA9PiAkaWREYXRlLAogICAgJ2RhdGVJU08nID0+ICRkYXRlSVNPLAogICAgJ2hldXJlX3ByZXBhJyA9PiAkaGV1cmVQcmVwYU1zLAogICAgJ3RlbXBfYWRkcmVzc19pZCcgPT4gJHRlbXBBZGRyZXNzSWQsCiAgICAnaWRfY2xpZW50JyA9PiAkaWRDbGllbnQsCiAgICAnZGlmZicgPT4gWwogICAgICAnbGluZXNfaW5zZXJ0ZWQnID0+ICRpbnNlcnRlZExpbmVzLAogICAgICAnbGluZXNfZGVsZXRlZCcgPT4gY291bnQoJGRlbHMpLAogICAgICAnbGluZXNfdXBkYXRlZCcgPT4gJHVwZGF0ZWRMaW5lcywKICAgICAgJ21vZGlmc19pbnNlcnRlZCcgPT4gJGluc2VydGVkTW9kaWZzLAogICAgICAnbW9kaWZzX3VwZGF0ZWQnID0+ICR1cGRhdGVkTW9kaWZzLAogICAgXSwKICAgICdwcmludF9qb2InID0+IFsKICAgICAgJ3F1ZXVlZCcgPT4gJHByaW50UXVldWVkLAogICAgICAnam9iX2lkJyA9PiAkcHJpbnRKb2JJZCwKICAgIF0sCiAgXSk7Cn0gY2F0Y2ggKFRocm93YWJsZSAkZSkgewogIHRyeSB7IGlmICgkcGRvLT5pblRyYW5zYWN0aW9uKCkpICRwZG8tPnJvbGxCYWNrKCk7IH0gY2F0Y2ggKFRocm93YWJsZSAkZTIpIHt9CiAgJHN0b3JlTG9nID0gaXNzZXQoJHN0b3JlKSA/IChzdHJpbmcpJHN0b3JlIDogJyc7CiAgJG9yZGVyTG9nID0gaXNzZXQoJG9yZGVySWQpID8gKGludCkkb3JkZXJJZCA6IDA7CiAgZXJyb3JfbG9nKCJbdXBkYXRlT3JkZXJdIGNyYXNoIHN0b3JlPXskc3RvcmVMb2d9IG9yZGVyX2lkPXskb3JkZXJMb2d9IGVycj0iIC4gJGUtPmdldE1lc3NhZ2UoKSAuICIgQCAiIC4gJGUtPmdldEZpbGUoKSAuICI6IiAuICRlLT5nZXRMaW5lKCkpOwogIHJlc3BvbmQoNTAwLCBbJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnU2VydmVyIGVycm9yJywgJ2tpbmQnID0+ICdzZXJ2ZXJfZXJyb3InXSk7Cn0="
            },
            "after": {
                "exists": true,
                "kind": "file",
                "size": 25713,
                "sha1": "96622f60422deafbc16e590870c7f1ea30666680",
                "content_b64": "PD9waHAKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgovKiBkb2MtcHJvamVjdCB8IGNhaXNzZS1hcXAvcHVibGljL2FwaS91cGRhdGVPcmRlci5waHAgfCBNZXQgw6Agam91ciB1bmUgY29tbWFuZGUgZXhpc3RhbnRlLCBzZXMgbGlnbmVzLCBzZXMgbW9kaWZzLCBsZSBjbGllbnQsIGzigJlhZHJlc3NlIGRlIGxpdnJhaXNvbiBwcm92aXNvaXJlIHBvcnTDqWUgcGFyIGxhIGNvbW1hbmRlLCBwdWlzIGTDqWNsZW5jaGUgbGVzIGVmZmV0cyBkZSBib3JkIGRlIHByw6lwYXJhdGlvbi9ub3RpZmljYXRpb24sIGF2ZWMgY2Fub25pY2FsaXNhdGlvbiBub24gYmxvcXVhbnRlIGR1IGNvdXBsZSBjb2RlIHBvc3RhbCAvIHZpbGxlIHF1YW5kIHVuZSBvcHRpb24gUERWIHJlY29ubnVlIGVzdCBjaG9pc2llLCBjb25zZXJ2YXRpb24gZXhwbGljaXRlIGRlcyB2YWxldXJzIGV4aXN0YW50ZXMgb3Ugc2Fpc2llcyBsaWJyZW1lbnQgc2lub24sIGV0IHJldmFsaWRhdGlvbiBibG9xdWFudGUgZGUgbGEgZmlkw6lsaXTDqSBqdXN0ZSBhdmFudCB2YWxpZGF0aW9uIGZpbmFsZSBkZSBsYSBjb21tYW5kZSBtb2RpZmnDqWUuIHwgRXhwb3NlOiByZXNwb25kLCBub3JtYWxpemVCb29sLCBzaG91bGRQcmVzZXJ2ZURlbGl2ZXJ5Q2l0eVBheWxvYWQgfCBEw6lwZW5kIGRlOiBjb25maWcucGhwLCBfbGliL3N0b3JlU2xvdENvbmZpZy5waHAsIF9saWIvY2hpcFNsb3RzLnBocCwgX2xpYi9jbGllbnRVcHNlcnQucGhwLCBfbGliL3ByaW50Sm9icy5waHAsIF9saWIvc21zUXVldWUucGhwLCBfbGliL2ZpcnN0TmFtZXNVcHNlcnQucGhwLCBfbGliL3RlbXBBZGRyZXNzLnBocCwgX2xpYi9kZWxpdmVyeUNpdHlDaG9pY2VzLnBocCwgbGliL2xveWFsdHkucGhwIHwgSW1wYWN0ZTogQkRELCBmaWxlIGTigJlhdHRlbnRlIGTigJlpbXByZXNzaW9uLCBmaWxlIFNNUywgbG9ncyBzZXJ2ZXVyLCBwZXJzaXN0YW5jZSBkZXMgYWRyZXNzZXMgY2Fpc3NlIHNhbnMgYmxvY2FnZSBzdXIgbGEgY29tbXVuZSwgYmxvY2FnZSBzZXJ2ZXVyIGRlcyBjb25mbGl0cyBmaWTDqWxpdMOpIHwgVGFibGVzOiBwb3NfY29tbWFuZGVzKGlkLCBpZF9kYXRlLCBoZXVyZV9wcmVwYSwgaWRfY2xpZW50LCBsaXZyYWlzb24sIGNvdXBlLCBuYnJfcGl6emFzLCBwcml4X2NvbSwgYWRyZXNzZV90ZW1wb3JhaXJlLCBzdGF0dXQpLCBwb3NfcGl6emFzX2NvbW1hbmRlZXMoaWQsIGlkX3Bvc19waXp6YXMsIGRhdGFfaWQsIGlzX3dlYl9hZGRpdGlvbiwgaXNfZnJlZSksIHBvc19tb2RpZnNfcGl6emFzKGlkLCBub21fb3B0aW9uLCBjbGFzc19vcHRpb24sIGRhdGFfcHJpY2UpLCBwb3NfdGVtcF9hZHJlc3NlcyAqLwpoZWFkZXIoJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCcpOwovLyBOZXZlciBjYWNoZSB3cml0ZXMKaGVhZGVyKCdDYWNoZS1Db250cm9sOiBuby1zdG9yZSwgbm8tY2FjaGUsIG11c3QtcmV2YWxpZGF0ZSwgbWF4LWFnZT0wJyk7CmhlYWRlcignUHJhZ21hOiBuby1jYWNoZScpOwpoZWFkZXIoJ0V4cGlyZXM6IDAnKTsKCmZ1bmN0aW9uIHJlc3BvbmQoaW50ICRjb2RlLCBhcnJheSAkcGF5bG9hZCk6IHZvaWQgewogIGh0dHBfcmVzcG9uc2VfY29kZSgkY29kZSk7CiAgZWNobyBqc29uX2VuY29kZSgkcGF5bG9hZCwgSlNPTl9VTkVTQ0FQRURfVU5JQ09ERSB8IEpTT05fVU5FU0NBUEVEX1NMQVNIRVMpOwogIGV4aXQ7Cn0KCi8qKgogKiBOb3JtYWxpemUgbWl4ZWQgSlNPTiBpbnB1dHMgdG8gYm9vbGVhbi4KICogQWNjZXB0cyBib29sLCAwLzEsICJ0cnVlIi8iZmFsc2UiLCAib24iLyJvZmYiLgogKi8KZnVuY3Rpb24gbm9ybWFsaXplQm9vbCgkdik6IGJvb2wgewogIGlmIChpc19ib29sKCR2KSkgcmV0dXJuICR2OwogIGlmIChpc19pbnQoJHYpIHx8IGlzX2Zsb2F0KCR2KSkgcmV0dXJuICgoaW50KSR2KSA9PT0gMTsKICAkcyA9IHN0cnRvbG93ZXIodHJpbSgoc3RyaW5nKSgkdiA/PyAnJykpKTsKICBpZiAoJHMgPT09ICcxJyB8fCAkcyA9PT0gJ3RydWUnIHx8ICRzID09PSAnb24nIHx8ICRzID09PSAneWVzJykgcmV0dXJuIHRydWU7CiAgcmV0dXJuIGZhbHNlOwp9CgpmdW5jdGlvbiBzaG91bGRQcmVzZXJ2ZURlbGl2ZXJ5Q2l0eVBheWxvYWQoJHBheWxvYWQpOiBib29sIHsKICAkc3JjID0gaXNfYXJyYXkoJHBheWxvYWQpID8gJHBheWxvYWQgOiBbXTsKICByZXR1cm4gbm9ybWFsaXplQm9vbCgkc3JjWydkZWxpdmVyeUNpdHlDaG9pY2VQcmVzZXJ2ZUV4aXN0aW5nJ10gPz8gZmFsc2UpOwp9CgpAcmVxdWlyZV9vbmNlIF9fRElSX18gLiAnLy4uLy4uL2NvbmZpZy5waHAnOwpAcmVxdWlyZV9vbmNlIF9fRElSX18gLiAnL19saWIvc3RvcmVTbG90Q29uZmlnLnBocCc7CkByZXF1aXJlX29uY2UgX19ESVJfXyAuICcvX2xpYi9jaGlwU2xvdHMucGhwJzsKQHJlcXVpcmVfb25jZSBfX0RJUl9fIC4gJy9fbGliL2NsaWVudFVwc2VydC5waHAnOwpAcmVxdWlyZV9vbmNlIF9fRElSX18gLiAnL19saWIvcHJpbnRKb2JzLnBocCc7CkByZXF1aXJlX29uY2UgX19ESVJfXyAuICcvX2xpYi9zbXNRdWV1ZS5waHAnOwpAcmVxdWlyZV9vbmNlIF9fRElSX18gLiAnL19saWIvZmlyc3ROYW1lc1Vwc2VydC5waHAnOwpAcmVxdWlyZV9vbmNlIF9fRElSX18gLiAnL19saWIvdGVtcEFkZHJlc3MucGhwJzsKQHJlcXVpcmVfb25jZSBfX0RJUl9fIC4gJy9fbGliL2RlbGl2ZXJ5Q2l0eUNob2ljZXMucGhwJzsKQHJlcXVpcmVfb25jZSBfX0RJUl9fIC4gJy9saWIvbG95YWx0eS5waHAnOwoKaWYgKCFpc3NldCgkcGRvKSB8fCAhKCRwZG8gaW5zdGFuY2VvZiBQRE8pKSB7CiAgcmVzcG9uZCg1MDAsIFsnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdEQiBub3QgY29uZmlndXJlZCddKTsKfQoKJHJhdyA9IGZpbGVfZ2V0X2NvbnRlbnRzKCdwaHA6Ly9pbnB1dCcpOwokanNvbiA9IGlzX3N0cmluZygkcmF3KSA/IGpzb25fZGVjb2RlKCRyYXcsIHRydWUpIDogbnVsbDsKaWYgKCFpc19hcnJheSgkanNvbikpIHsKICByZXNwb25kKDQwMCwgWydvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ0ludmFsaWQgSlNPTiddKTsKfQoKJHN0b3JlID0gaXNzZXQoJGpzb25bJ3N0b3JlJ10pID8gKHN0cmluZykkanNvblsnc3RvcmUnXSA6ICcnOwppZiAoIXByZWdfbWF0Y2goJy9eKGxhbnxwZWwpJC8nLCAkc3RvcmUpKSB7CiAgcmVzcG9uZCg0MDAsIFsnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdJbnZhbGlkIHN0b3JlJ10pOwp9CgovLyBTdG9yZS1zcGVjaWZpYyB0YWJsZXMgKHN0cmljdCB3aGl0ZWxpc3QpCiR0YWJsZU9yZGVycyA9ICgkc3RvcmUgPT09ICdwZWwnKSA/ICdwb3NfY29tbWFuZGVzX3BlbCcgOiAncG9zX2NvbW1hbmRlcyc7CiR0YWJsZUxpbmVzICA9ICgkc3RvcmUgPT09ICdwZWwnKSA/ICdwb3NfcGl6emFzX2NvbW1hbmRlZXNfcGVsJyA6ICdwb3NfcGl6emFzX2NvbW1hbmRlZXMnOwokY29sT3JkZXJGayAgPSAoJHN0b3JlID09PSAncGVsJykgPyAnaWRfcG9zX2NvbW1hbmRlc19wZWwnIDogJ2lkX3Bvc19jb21tYW5kZXMnOwokdGFibGVNb2RpZnMgPSAoJHN0b3JlID09PSAncGVsJykgPyAncG9zX21vZGlmc19waXp6YXNfcGVsJyA6ICdwb3NfbW9kaWZzX3Bpenphcyc7CiRjb2xMaW5lRmsgICA9ICgkc3RvcmUgPT09ICdwZWwnKSA/ICdpZF9wb3NfcGl6emFzX2NvbW1hbmRlZXNfcGVsJyA6ICdpZF9wb3NfcGl6emFzX2NvbW1hbmRlZXMnOwoKLy8gUmVxdWlyZWQgaWRlbnRpZmllcnMgKGxvYWRlZCBvcmRlciBjb250ZXh0KQokaWRSYXcgPSAkanNvblsnaWQnXSA/PyBudWxsOwokaWREYXRlUmF3ID0gJGpzb25bJ2lkX2RhdGUnXSA/PyBudWxsOwokZGF0ZUlTTyA9IGlzc2V0KCRqc29uWydkYXRlSVNPJ10pID8gKHN0cmluZykkanNvblsnZGF0ZUlTTyddIDogJyc7CgppZiAoIWlzX251bWVyaWMoJGlkUmF3KSB8fCAoaW50KSRpZFJhdyA8PSAwKSByZXNwb25kKDQwMCwgWydvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ0ludmFsaWQgaWQnXSk7CmlmICghaXNfbnVtZXJpYygkaWREYXRlUmF3KSB8fCAoaW50KSRpZERhdGVSYXcgPD0gMCkgcmVzcG9uZCg0MDAsIFsnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdJbnZhbGlkIGlkX2RhdGUnXSk7CmlmICghcHJlZ19tYXRjaCgnL15cZHs0fS1cZHsyfS1cZHsyfSQvJywgJGRhdGVJU08pKSByZXNwb25kKDQwMCwgWydvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ0ludmFsaWQgZGF0ZUlTTyddKTsKCiRvcmRlcklkID0gKGludCkkaWRSYXc7CiRpZERhdGUgPSAoaW50KSRpZERhdGVSYXc7CgovLyBVSSBmbGFnIChmdXR1cmUgU01TIGRlY2lzaW9uKSDigJQgY3VycmVudGx5IG5vLW9wIChubyBEQiB3cml0ZSkuCiRtb2RpZkNvbW1hbmRlID0gbm9ybWFsaXplQm9vbCgkanNvblsnbW9kaWZfY29tbWFuZGUnXSA/PyBmYWxzZSk7CmlmICgkbW9kaWZDb21tYW5kZSkgZXJyb3JfbG9nKCJbdXBkYXRlT3JkZXJdIG1vZGlmX2NvbW1hbmRlPXRydWUgc3RvcmU9eyRzdG9yZX0gb3JkZXJfaWQ9eyRvcmRlcklkfSBpZF9kYXRlPXskaWREYXRlfSIpOwoKJGNvdXBlID0gaXNzZXQoJGpzb25bJ2NvdXBlJ10pID8gKGludCkkanNvblsnY291cGUnXSA6IDA7CiRsaXZyYWlzb24gPSBpc3NldCgkanNvblsnbGl2cmFpc29uJ10pID8gKGludCkkanNvblsnbGl2cmFpc29uJ10gOiAwOwokbmJyUGl6emFzID0gaXNzZXQoJGpzb25bJ25icl9waXp6YXMnXSkgPyAoaW50KSRqc29uWyduYnJfcGl6emFzJ10gOiAwOwokcHJpeENvbVJhdyA9ICRqc29uWydwcml4X2NvbSddID8/IG51bGw7CiRwcml4Q29tID0gaXNfbnVtZXJpYygkcHJpeENvbVJhdykgPyAoZmxvYXQpJHByaXhDb21SYXcgOiAwLjA7CiRwcml4Q29tU3RyID0gbnVtYmVyX2Zvcm1hdCgkcHJpeENvbSwgMiwgJy4nLCAnJyk7CgokdGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzID0gKGlzc2V0KCRqc29uWyd0ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MnXSkgJiYgaXNfYXJyYXkoJGpzb25bJ3RlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcyddKSkKICA/ICRqc29uWyd0ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MnXQogIDogbnVsbDsKCiRoZXVyZUhITU0gPSBpc3NldCgkanNvblsnaGV1cmVfcHJlcGFfaGhtbSddKSA/IChzdHJpbmcpJGpzb25bJ2hldXJlX3ByZXBhX2hobW0nXSA6ICcnOwppZiAoIXByZWdfbWF0Y2goJy9eXGR7Mn06XGR7Mn0kLycsICRoZXVyZUhITU0pKSB7CiAgcmVzcG9uZCg0MDAsIFsnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdDaG9pc2lyIHVuIGNyw6luZWF1J10pOwp9CgovLyBDbGllbnQgcGF5bG9hZCAobXVzdCBiZSBwZXJzaXN0ZWQgb24gVVBEQVRFIHRvbyBpZiBvcGVyYXRvciBlZGl0ZWQgZmllbGRzKQokcGhvbmVSYXcgPSBpc3NldCgkanNvblsncGhvbmVOdW1iZXInXSkgPyAoc3RyaW5nKSRqc29uWydwaG9uZU51bWJlciddIDogJyc7CiRjbGllbnRQYXlsb2FkID0gJGpzb25bJ2NsaWVudCddID8/IG51bGw7CgovLyBEaWZmIHBheWxvYWQKJGRpZmYgPSBpc3NldCgkanNvblsnZGlmZiddKSAmJiBpc19hcnJheSgkanNvblsnZGlmZiddKSA/ICRqc29uWydkaWZmJ10gOiBbXTsKJGFkZExpc3QgPSAoaXNzZXQoJGRpZmZbJ2FkZCddKSAmJiBpc19hcnJheSgkZGlmZlsnYWRkJ10pKSA/ICRkaWZmWydhZGQnXSA6IFtdOwokdXBkTGlzdCA9IChpc3NldCgkZGlmZlsndXBkYXRlJ10pICYmIGlzX2FycmF5KCRkaWZmWyd1cGRhdGUnXSkpID8gJGRpZmZbJ3VwZGF0ZSddIDogW107CiRkZWxMaXN0ID0gKGlzc2V0KCRkaWZmWydkZWxldGUnXSkgJiYgaXNfYXJyYXkoJGRpZmZbJ2RlbGV0ZSddKSkgPyAkZGlmZlsnZGVsZXRlJ10gOiBbXTsKCi8vIE5PVEU6IGNsaWVudFVwc2VydC5waHAgZGVmaW5lcyBjbGVhblN0cigpLiBBdm9pZCByZWRlY2xhcmUgZmF0YWwgYnkgdXNpbmcgbG9jYWwgbmFtZXMgaGVyZS4KZnVuY3Rpb24gY2xlYW5TdHJMb2NhbCgkdiwgaW50ICRtYXhMZW4gPSAwKTogc3RyaW5nIHsKICAkcyA9IHRyaW0oKHN0cmluZykoJHYgPz8gJycpKTsKICBpZiAoJHMgPT09ICcnKSByZXR1cm4gJyc7CiAgaWYgKCRtYXhMZW4gPiAwICYmIG1iX3N0cmxlbigkcywgJ1VURi04JykgPiAkbWF4TGVuKSAkcyA9IG1iX3N1YnN0cigkcywgMCwgJG1heExlbiwgJ1VURi04Jyk7CiAgcmV0dXJuICRzOwp9CgpmdW5jdGlvbiByb3VuZDJMb2NhbCgkdik6IGZsb2F0IHsKICAkbiA9IGlzX251bWVyaWMoJHYpID8gKGZsb2F0KSR2IDogMC4wOwogIHJldHVybiByb3VuZCgkbiwgMik7Cn0KCi8vIFJvYnVzdCBtb25leSBwYXJzaW5nID0+IGludGVnZXIgY2VudHMgKGF2b2lkIGZsb2F0IGRyaWZ0IGluIGNvbXBhcmlzb25zKQpmdW5jdGlvbiBtb25leVRvQ2VudHNMb2NhbCgkdik6IGludCB7CiAgJHMgPSB0cmltKChzdHJpbmcpKCR2ID8/ICcnKSk7CiAgaWYgKCRzID09PSAnJykgcmV0dXJuIDA7CiAgJHMgPSBzdHJfcmVwbGFjZShbIuKCrCIsICIgIl0sICIiLCAkcyk7CiAgJHMgPSBzdHJfcmVwbGFjZSgiLCIsICIuIiwgJHMpOwoKICBpZiAoIXByZWdfbWF0Y2goJy9eKFsrLV0pPyhcZCspKD86XC4oXGR7MSwyfSkpPyQvJywgJHMsICRtKSkgcmV0dXJuIDA7CiAgJHNpZ24gPSAoKCRtWzFdID8/ICcnKSA9PT0gJy0nKSA/IC0xIDogMTsKICAkZXVyb3MgPSAoaW50KSRtWzJdOwogICRjZW50cyA9IGlzc2V0KCRtWzNdKSA/IChpbnQpc3RyX3BhZCgoc3RyaW5nKSRtWzNdLCAyLCAnMCcpIDogMDsKICByZXR1cm4gJHNpZ24gKiAoJGV1cm9zICogMTAwICsgJGNlbnRzKTsKfQoKLy8gQ29tcHV0ZSBvcmRlciB0b3RhbCAobGluZXMgYmFzZSBwcmljZV9sYXJnZSArIG1vZGlmcyBkYXRhX3ByaWNlKSBpbiBjZW50cy4KLy8gVXNlcyBEQiBhcyBzb3VyY2Utb2YtdHJ1dGggKHdvcmtzIGV2ZW4gaWYgcHJpeF9jb20gaXMgc3RhbGUgb3IgZmxvYXQtcm91bmRlZCkuCmZ1bmN0aW9uIGZldGNoT3JkZXJUb3RhbENlbnRzTG9jYWwoUERPICRwZG8sIHN0cmluZyAkdGFibGVMaW5lcywgc3RyaW5nICR0YWJsZU1vZGlmcywgc3RyaW5nICRjb2xPcmRlckZrLCBzdHJpbmcgJGNvbExpbmVGaywgaW50ICRvcmRlcklkKTogaW50IHsKICAkdG90YWwgPSAwOwogICRsaW5lSWRzID0gW107CgogIC8vIExpbmVzIGJhc2UgcHJpY2UgKHBvc19waXp6YXMucHJpY2VfbGFyZ2UpCiAgJHN0bXQgPSAkcGRvLT5wcmVwYXJlKCIKICAgIFNFTEVDVCBwcGMuaWQgQVMgbGluZV9pZCwgcHAucHJpY2VfbGFyZ2UgQVMgcHJpY2VfbGFyZ2UKICAgIEZST00geyR0YWJsZUxpbmVzfSBwcGMKICAgIExFRlQgSk9JTiBwb3NfcGl6emFzIHBwIE9OIHBwYy5pZF9wb3NfcGl6emFzID0gcHAuaWQKICAgIFdIRVJFIHBwYy57JGNvbE9yZGVyRmt9ID0gOm9yZGVyX2lkCiAgIik7CiAgJHN0bXQtPmJpbmRWYWx1ZSgnOm9yZGVyX2lkJywgJG9yZGVySWQsIFBETzo6UEFSQU1fSU5UKTsKICAkc3RtdC0+ZXhlY3V0ZSgpOwogIHdoaWxlICgkciA9ICRzdG10LT5mZXRjaChQRE86OkZFVENIX0FTU09DKSkgewogICAgJGxpZCA9IChpbnQpKCRyWydsaW5lX2lkJ10gPz8gMCk7CiAgICBpZiAoJGxpZCA+IDApICRsaW5lSWRzW10gPSAkbGlkOwogICAgJHRvdGFsICs9IG1vbmV5VG9DZW50c0xvY2FsKCRyWydwcmljZV9sYXJnZSddID8/IDApOwogIH0KCiAgLy8gT3B0aW9ucy9tb2RpZnMgc3VtIChkYXRhX3ByaWNlKQogIGlmICgkbGluZUlkcykgewogICAgJHBoID0gaW1wbG9kZSgnLCcsIGFycmF5X2ZpbGwoMCwgY291bnQoJGxpbmVJZHMpLCAnPycpKTsKICAgICRzdG10TSA9ICRwZG8tPnByZXBhcmUoIlNFTEVDVCBkYXRhX3ByaWNlIEZST00geyR0YWJsZU1vZGlmc30gV0hFUkUgeyRjb2xMaW5lRmt9IElOICh7JHBofSkiKTsKICAgIGZvcmVhY2ggKCRsaW5lSWRzIGFzICRpID0+ICRsaWQpICRzdG10TS0+YmluZFZhbHVlKCRpICsgMSwgJGxpZCwgUERPOjpQQVJBTV9JTlQpOwogICAgJHN0bXRNLT5leGVjdXRlKCk7CiAgICB3aGlsZSAoJG0gPSAkc3RtdE0tPmZldGNoKFBETzo6RkVUQ0hfQVNTT0MpKSB7CiAgICAgICR0b3RhbCArPSBtb25leVRvQ2VudHNMb2NhbCgkbVsnZGF0YV9wcmljZSddID8/IDApOwogICAgfQogIH0KCiAgcmV0dXJuIChpbnQpJHRvdGFsOwp9CgpmdW5jdGlvbiBub3JtYWxpemVMaW5lRm9ySW5zZXJ0KCRpdCk6IGFycmF5IHsKICAkYSA9IGlzX2FycmF5KCRpdCkgPyAkaXQgOiBbXTsKICAkcGlkID0gaXNzZXQoJGFbJ2lkX3Bvc19waXp6YXMnXSkgPyAoaW50KSRhWydpZF9wb3NfcGl6emFzJ10gOiAwOwogICRkYXRhSWQgPSBjbGVhblN0ckxvY2FsKCRhWydkYXRhX2lkJ10gPz8gJycsIDgwKTsKICAkY2xzID0gc3RydG9sb3dlcihjbGVhblN0ckxvY2FsKCRhWydjbGFzcyddID8/ICcnLCA0MCkpOwogICRtb2RpZnMgPSAoaXNzZXQoJGFbJ21vZGlmcyddKSAmJiBpc19hcnJheSgkYVsnbW9kaWZzJ10pKSA/ICRhWydtb2RpZnMnXSA6IFtdOwogIHJldHVybiBbCiAgICAnaWRfcG9zX3BpenphcycgPT4gJHBpZCwKICAgICdkYXRhX2lkJyA9PiAkZGF0YUlkLAogICAgJ2NsYXNzJyA9PiAkY2xzLAogICAgJ21vZGlmcycgPT4gJG1vZGlmcywKICBdOwp9CgpmdW5jdGlvbiBub3JtYWxpemVVcGRhdGVMaW5lKCRpdCk6IGFycmF5IHsKICAkYSA9IGlzX2FycmF5KCRpdCkgPyAkaXQgOiBbXTsKICAkb2lkID0gaXNzZXQoJGFbJ29yZGVyZWRfaWQnXSkgPyAoaW50KSRhWydvcmRlcmVkX2lkJ10gOiAwOwogICRwaWQgPSBpc3NldCgkYVsnaWRfcG9zX3BpenphcyddKSA/IChpbnQpJGFbJ2lkX3Bvc19waXp6YXMnXSA6IDA7CiAgJGRhdGFJZCA9IGNsZWFuU3RyTG9jYWwoJGFbJ2RhdGFfaWQnXSA/PyAnJywgODApOwogICRjbHMgPSBzdHJ0b2xvd2VyKGNsZWFuU3RyTG9jYWwoJGFbJ2NsYXNzJ10gPz8gJycsIDQwKSk7CiAgJG1vZGlmcyA9IChpc3NldCgkYVsnbW9kaWZzJ10pICYmIGlzX2FycmF5KCRhWydtb2RpZnMnXSkpID8gJGFbJ21vZGlmcyddIDogW107CiAgcmV0dXJuIFsKICAgICdvcmRlcmVkX2lkJyA9PiAkb2lkLAogICAgJ2lkX3Bvc19waXp6YXMnID0+ICRwaWQsCiAgICAnZGF0YV9pZCcgPT4gJGRhdGFJZCwKICAgICdjbGFzcycgPT4gJGNscywKICAgICdtb2RpZnMnID0+ICRtb2RpZnMsCiAgXTsKfQoKZnVuY3Rpb24gbm9ybWFsaXplRGVsZXRlTGluZSgkaXQpOiBpbnQgewogICRhID0gaXNfYXJyYXkoJGl0KSA/ICRpdCA6IFtdOwogIHJldHVybiBpc3NldCgkYVsnb3JkZXJlZF9pZCddKSA/IChpbnQpJGFbJ29yZGVyZWRfaWQnXSA6IDA7Cn0KCmZ1bmN0aW9uIHZhbGlkYXRlTW9kaWZzQXJyYXkoJG1vZGlmcyk6IGFycmF5IHsKICAkb3V0ID0gW107CiAgaWYgKCFpc19hcnJheSgkbW9kaWZzKSkgcmV0dXJuICRvdXQ7CiAgZm9yZWFjaCAoJG1vZGlmcyBhcyAkbSkgewogICAgaWYgKCFpc19hcnJheSgkbSkpIGNvbnRpbnVlOwogICAgJG5vbSA9IGNsZWFuU3RyTG9jYWwoJG1bJ25vbV9vcHRpb24nXSA/PyAnJywgMTIwKTsKICAgIGlmICgkbm9tID09PSAnJykgY29udGludWU7CiAgICAkZHAgPSByb3VuZDJMb2NhbCgkbVsnZGF0YV9wcmljZSddID8/IDApOwogICAgJGNscyA9IGNsZWFuU3RyTG9jYWwoJG1bJ2NsYXNzX29wdGlvbiddID8/ICcnLCA2MCk7CiAgICAkY2xzTm9ybSA9IHN0cnRvbG93ZXIoJGNscyk7CiAgICBpZiAoJGNsc05vcm0gPT09ICcnKSAkY2xzTm9ybSA9ICdtb2RpZi1pdGVtJzsKICAgIC8vIE5vcm1hbGl6ZSBjb21tb24gdmFyaWFudHMgY29taW5nIGZyb20gZGlmZmVyZW50IGNsaWVudHMvc3lzdGVtcy4KICAgIGlmICgkY2xzTm9ybSA9PT0gJ2NvbXBvc2l0aW9uJyB8fCAkY2xzTm9ybSA9PT0gJ3JlbW92ZWQnIHx8ICRjbHNOb3JtID09PSAncmVtb3ZlJyB8fCAkY2xzTm9ybSA9PT0gJ3JldHJhaXQnIHx8ICRjbHNOb3JtID09PSAnaW5ncmVkaWVudC1yZW1vdmVkJykgewogICAgICAkY2xzTm9ybSA9ICdjb21wb3NpdGlvbi1pdGVtJzsKICAgIH0KICAgICRrbm93bkludGVudENsYXNzZXMgPSBbJ2NvbXBvc2l0aW9uLWl0ZW0nLCAnZXh0cmEtaXRlbScsICdvcHRpb24taXRlbScsICdpbmdyZWRpZW50LWl0ZW0nXTsKICAgIC8vIEhldXJpc3RpYzogaWYgcHJpY2UgaXMgMCBhbmQgaXQncyBOT1QgYW4gZXhwbGljaXQgIisgb3B0aW9uIiwKICAgIC8vIHRyZWF0IGl0IGFzIGEgcmVtb3ZlZCBjb21wb3NpdGlvbiBpbmdyZWRpZW50IGZvciBwcmludGluZyBwYXJpdHkuCiAgICBpZiAoIWluX2FycmF5KCRjbHNOb3JtLCAka25vd25JbnRlbnRDbGFzc2VzLCB0cnVlKSAmJiBhYnMoJGRwKSA8IDAuMDAwMDEgJiYgcHJlZ19tYXRjaCgnL15ccypcKy91JywgJG5vbSkgIT09IDEpIHsKICAgICAgJGNsc05vcm0gPSAnY29tcG9zaXRpb24taXRlbSc7CiAgICB9CiAgICAkb3V0W10gPSBbCiAgICAgICdub21fb3B0aW9uJyA9PiAkbm9tLAogICAgICAnY2xhc3Nfb3B0aW9uJyA9PiAkY2xzTm9ybSwKICAgICAgJ2RhdGFfcHJpY2UnID0+ICRkcCwKICAgIF07CiAgfQogIHJldHVybiAkb3V0Owp9Cgp0cnkgewogICR0eiA9IG5ldyBEYXRlVGltZVpvbmUoJ0V1cm9wZS9QYXJpcycpOwogICRkYXkgPSBEYXRlVGltZUltbXV0YWJsZTo6Y3JlYXRlRnJvbUZvcm1hdCgnWS1tLWQnLCAkZGF0ZUlTTywgJHR6KTsKICBpZiAoISRkYXkpIHJlc3BvbmQoNDAwLCBbJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnSW52YWxpZCBkYXRlSVNPJ10pOwoKICAkc3RhcnQgPSAkZGF5LT5zZXRUaW1lKDAsIDAsIDApOwogICRlbmQgICA9ICRkYXktPnNldFRpbWUoMjMsIDU5LCA1OSk7CiAgJHN0YXJ0TXMgPSAoKGludCkkc3RhcnQtPmZvcm1hdCgnVScpKSAqIDEwMDA7CiAgJGVuZE1zICAgPSAoKGludCkkZW5kLT5mb3JtYXQoJ1UnKSkgKiAxMDAwICsgOTk5OwoKICAvLyBTdHJpY3QgVUkgZ3JpZCBjaGVjayBmb3IgSEg6TU0gKG5vIGFkanVzdG1lbnQpCiAgJGNmZyA9IGZldGNoU3RvcmVTbG90Q29uZmlnKCRwZG8sICRzdG9yZSk7CiAgJGZpcnN0RGlzcGxheVNsb3QgPSBub3JtYWxpemVISE1NKChzdHJpbmcpKCRjZmdbJ2ZpcnN0X2Rpc3BsYXlfc2xvdCddID8/ICcxODowMCcpLCAnMTg6MDAnKTsKICAkbGFzdERpc3BsYXlTbG90ID0gbm9ybWFsaXplSEhNTSgoc3RyaW5nKSgkY2ZnWydsYXN0X2Rpc3BsYXlfc2xvdCddID8/ICcyMzo1MCcpLCAnMjM6NTAnKTsKICAkc2xvdER1cmF0aW9uTWluID0gKGludCkoJGNmZ1snc2xvdF9kdXJhdGlvbl9taW4nXSA/PyAxMCk7CiAgaWYgKCRzbG90RHVyYXRpb25NaW4gPD0gMCkgJHNsb3REdXJhdGlvbk1pbiA9IDEwOwogICRjaGlwU2xvdHMgPSBidWlsZENoaXBTbG90c0Zyb21ISE1NKCRmaXJzdERpc3BsYXlTbG90LCAkbGFzdERpc3BsYXlTbG90LCAkc2xvdER1cmF0aW9uTWluKTsKICAkY2hpcFNsb3RTZXQgPSBhcnJheV9maWxsX2tleXMoJGNoaXBTbG90cywgdHJ1ZSk7CiAgaWYgKCFpc3NldCgkY2hpcFNsb3RTZXRbJGhldXJlSEhNTV0pKSB7CiAgICBlcnJvcl9sb2coIlt1cGRhdGVPcmRlcl0gb2ZmLWdyaWQgaGV1cmVfcHJlcGFfaGhtbTsgc3RvcmU9eyRzdG9yZX0gZGF0ZT17JGRhdGVJU099IGhobW09eyRoZXVyZUhITU19Iik7CiAgICByZXNwb25kKDQwMCwgWydvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ0hldXJlIGhvcnMgZ3JpbGxlIChzdHJpY3QgdGltZSknLCAna2luZCcgPT4gJ2hldXJlX3ByZXBhX29mZmdyaWQnLCAnaGhtbScgPT4gJGhldXJlSEhNTV0pOwogIH0KCiAgLy8gQnVpbGQgaGV1cmVfcHJlcGEgbXMgZnJvbSBzZWxlY3RlZCBkYXRlICsgSEg6TU0gaW4gRXVyb3BlL1BhcmlzCiAgJGR0ID0gRGF0ZVRpbWVJbW11dGFibGU6OmNyZWF0ZUZyb21Gb3JtYXQoJ1ktbS1kIEg6aScsICRkYXRlSVNPIC4gJyAnIC4gJGhldXJlSEhNTSwgJHR6KTsKICBpZiAoISRkdCkgcmVzcG9uZCg0MDAsIFsnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdJbnZhbGlkIGhldXJlX3ByZXBhJ10pOwogICRoZXVyZVByZXBhTXMgPSAoKGludCkkZHQtPmZvcm1hdCgnVScpKSAqIDEwMDA7CgogIGlmICgkaGV1cmVQcmVwYU1zIDwgJHN0YXJ0TXMgfHwgJGhldXJlUHJlcGFNcyA+ICRlbmRNcykgewogICAgcmVzcG9uZCg0MDAsIFsnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdIZXVyZSBob3JzIGpvdXJuw6llIChzdHJpY3QpJywgJ2tpbmQnID0+ICdoZXVyZV9wcmVwYV9vdXRfb2ZfZGF5J10pOwogIH0KCiAgLy8gTG9jYXRlIG9yZGVyIHN0cmljdGx5IGJ5IChpZCwgaWRfZGF0ZSkgYW5kIGVuc3VyZSBpdCBiZWxvbmdzIHRvIHRoZSBzZWxlY3RlZCBkYXkKICAkc3FsRmluZCA9ICJTRUxFQ1QgaWQsIGlkX2RhdGUsIGhldXJlX3ByZXBhLCBpZF9jbGllbnQsIGxpdnJhaXNvbiwgYWRyZXNzZV90ZW1wb3JhaXJlCiAgICAgICAgICAgICAgRlJPTSB7JHRhYmxlT3JkZXJzfQogICAgICAgICAgICAgIFdIRVJFIChzdGF0dXQgSVMgTlVMTCBPUiBzdGF0dXQgPD4gJ2RlbGV0ZWQnKQogICAgICAgICAgICAgICAgQU5EIGlkID0gOmlkCiAgICAgICAgICAgICAgICBBTkQgaWRfZGF0ZSA9IDppZF9kYXRlCiAgICAgICAgICAgICAgICBBTkQgaGV1cmVfcHJlcGEgQkVUV0VFTiA6c3RhcnRNcyBBTkQgOmVuZE1zCiAgICAgICAgICAgICAgTElNSVQgMSI7CiAgJHN0bXRGID0gJHBkby0+cHJlcGFyZSgkc3FsRmluZCk7CiAgJHN0bXRGLT5iaW5kVmFsdWUoJzppZCcsICRvcmRlcklkLCBQRE86OlBBUkFNX0lOVCk7CiAgJHN0bXRGLT5iaW5kVmFsdWUoJzppZF9kYXRlJywgJGlkRGF0ZSwgUERPOjpQQVJBTV9JTlQpOwogICRzdG10Ri0+YmluZFZhbHVlKCc6c3RhcnRNcycsICRzdGFydE1zLCBQRE86OlBBUkFNX0lOVCk7CiAgJHN0bXRGLT5iaW5kVmFsdWUoJzplbmRNcycsICRlbmRNcywgUERPOjpQQVJBTV9JTlQpOwogICRzdG10Ri0+ZXhlY3V0ZSgpOwogICRmb3VuZCA9ICRzdG10Ri0+ZmV0Y2goUERPOjpGRVRDSF9BU1NPQyk7CiAgaWYgKCEkZm91bmQpIHsKICAgIGVycm9yX2xvZygiW3VwZGF0ZU9yZGVyXSBPcmRlciBub3QgZm91bmQgZm9yIGRheTsgc3RvcmU9eyRzdG9yZX0gZGF0ZUlTTz17JGRhdGVJU099IG9yZGVyX2lkPXskb3JkZXJJZH0gaWRfZGF0ZT17JGlkRGF0ZX0gc3RhcnRNcz17JHN0YXJ0TXN9IGVuZE1zPXskZW5kTXN9Iik7CiAgICByZXNwb25kKDQwNCwgWydvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ09yZGVyIG5vdCBmb3VuZCBmb3IgZGF5J10pOwogIH0KICAkaWRDbGllbnQgPSBpc3NldCgkZm91bmRbJ2lkX2NsaWVudCddKSA/IChpbnQpJGZvdW5kWydpZF9jbGllbnQnXSA6IDA7CgogIC8vIOKUgOKUgCBTbmFwc2hvdCBCRUZPUkUgdXBkYXRlIChEQiBzb3VyY2Ugb2YgdHJ1dGgpIOKUgOKUgAogICRiZWZvcmVIZXVyZVByZXBhTXMgPSAoaW50KSgkZm91bmRbJ2hldXJlX3ByZXBhJ10gPz8gMCk7CiAgJGJlZm9yZUxpdnJhaXNvbiA9ICgoaW50KSgkZm91bmRbJ2xpdnJhaXNvbiddID8/IDApID09PSAxKSA/IDEgOiAwOwogICRiZWZvcmVUb3RhbENlbnRzID0gZmV0Y2hPcmRlclRvdGFsQ2VudHNMb2NhbCgkcGRvLCAkdGFibGVMaW5lcywgJHRhYmxlTW9kaWZzLCAkY29sT3JkZXJGaywgJGNvbExpbmVGaywgJG9yZGVySWQpOwoKICAvLyBOb3JtYWxpemUgZmxhZ3MKICAkY291cGUgPSAoJGNvdXBlID09PSAxKSA/IDEgOiAwOwogICRsaXZyYWlzb24gPSAoJGxpdnJhaXNvbiA9PT0gMSkgPyAxIDogMDsKICBpZiAoJGxpdnJhaXNvbiAhPT0gMSkgJHRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcyA9IG51bGw7CiAgaWYgKCRuYnJQaXp6YXMgPCAwKSAkbmJyUGl6emFzID0gMDsKCiAgaWYgKCRsaXZyYWlzb24gPT09IDEgJiYgaXNfYXJyYXkoJGNsaWVudFBheWxvYWQpICYmICFzaG91bGRQcmVzZXJ2ZURlbGl2ZXJ5Q2l0eVBheWxvYWQoJGNsaWVudFBheWxvYWQpKSB7CiAgICAkbm9ybWFsaXplZENsaWVudFBheWxvYWQgPSBjYWlzc2VOb3JtYWxpemVEZWxpdmVyeUNpdHlQYXlsb2FkKCRjbGllbnRQYXlsb2FkLCAkc3RvcmUsICd2aWxsZScsICdjb2RlX3Bvc3RhbCcpOwogICAgaWYgKGlzX2FycmF5KCRub3JtYWxpemVkQ2xpZW50UGF5bG9hZFsncGF5bG9hZCddID8/IG51bGwpKSB7CiAgICAgICRjbGllbnRQYXlsb2FkID0gJG5vcm1hbGl6ZWRDbGllbnRQYXlsb2FkWydwYXlsb2FkJ107CiAgICB9CiAgfQoKICBpZiAoJGxpdnJhaXNvbiA9PT0gMSAmJiBpc19hcnJheSgkdGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzKSAmJiAhc2hvdWxkUHJlc2VydmVEZWxpdmVyeUNpdHlQYXlsb2FkKCR0ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MpKSB7CiAgICAkbm9ybWFsaXplZFRlbXBvcmFyeUFkZHJlc3MgPSBjYWlzc2VOb3JtYWxpemVEZWxpdmVyeUNpdHlQYXlsb2FkKCR0ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MsICRzdG9yZSwgJ3ZpbGxlJywgJ2NvZGVfcG9zdGFsJyk7CiAgICBpZiAoaXNfYXJyYXkoJG5vcm1hbGl6ZWRUZW1wb3JhcnlBZGRyZXNzWydwYXlsb2FkJ10gPz8gbnVsbCkpIHsKICAgICAgJHRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcyA9ICRub3JtYWxpemVkVGVtcG9yYXJ5QWRkcmVzc1sncGF5bG9hZCddOwogICAgfQogIH0KCiAgLy8gTm9ybWFsaXplIGRpZmYgbGluZXMKICAkYWRkcyA9IFtdOwogIGZvcmVhY2ggKCRhZGRMaXN0IGFzICRpdCkgewogICAgJGwgPSBub3JtYWxpemVMaW5lRm9ySW5zZXJ0KCRpdCk7CiAgICBpZiAoJGxbJ2lkX3Bvc19waXp6YXMnXSA8PSAwKSByZXNwb25kKDQwMCwgWydvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ0ludmFsaWQgYWRkIGxpbmUgaWRfcG9zX3BpenphcyddKTsKICAgIGlmICgkbFsnZGF0YV9pZCddID09PSAnJykgcmVzcG9uZCg0MDAsIFsnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdJbnZhbGlkIGFkZCBsaW5lIGRhdGFfaWQnXSk7CiAgICAkbFsnbW9kaWZzJ10gPSB2YWxpZGF0ZU1vZGlmc0FycmF5KCRsWydtb2RpZnMnXSk7CiAgICAkYWRkc1tdID0gJGw7CiAgfQogICR1cGRzID0gW107CiAgZm9yZWFjaCAoJHVwZExpc3QgYXMgJGl0KSB7CiAgICAkbCA9IG5vcm1hbGl6ZVVwZGF0ZUxpbmUoJGl0KTsKICAgIGlmICgkbFsnb3JkZXJlZF9pZCddIDw9IDApIHJlc3BvbmQoNDAwLCBbJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnSW52YWxpZCB1cGRhdGUgb3JkZXJlZF9pZCddKTsKICAgIGlmICgkbFsnaWRfcG9zX3BpenphcyddIDw9IDApIHJlc3BvbmQoNDAwLCBbJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnSW52YWxpZCB1cGRhdGUgbGluZSBpZF9wb3NfcGl6emFzJ10pOwogICAgaWYgKCRsWydkYXRhX2lkJ10gPT09ICcnKSByZXNwb25kKDQwMCwgWydvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ0ludmFsaWQgdXBkYXRlIGxpbmUgZGF0YV9pZCddKTsKICAgICRsWydtb2RpZnMnXSA9IHZhbGlkYXRlTW9kaWZzQXJyYXkoJGxbJ21vZGlmcyddKTsKICAgICR1cGRzW10gPSAkbDsKICB9CiAgJGRlbHMgPSBbXTsKICBmb3JlYWNoICgkZGVsTGlzdCBhcyAkaXQpIHsKICAgICRvaWQgPSBub3JtYWxpemVEZWxldGVMaW5lKCRpdCk7CiAgICBpZiAoJG9pZCA+IDApICRkZWxzW10gPSAkb2lkOwogIH0KCiAgJHBkby0+YmVnaW5UcmFuc2FjdGlvbigpOwoKICAvLyDilIDilIAgVXBzZXJ0IGNsaWVudCBvbiBVUERBVEUgKHNhbWUgcnVsZSBhcyBDUkVBVEUpIOKUgOKUgAogIC8vIFNvdXJjZSBvZiB0cnV0aCA9IFVJIGF0IHZhbGlkYXRlIHRpbWUuIElmIGNsaWVudCBpbmZvIHdhcyBlZGl0ZWQsIHBlcnNpc3QgaXQuCiAgLy8gRmFpbC1zYWZlOiBpZiBubyBwaG9uZSBwcm92aWRlZCwgd2Uga2VlcCBleGlzdGluZyBpZF9jbGllbnQgKGJhY2t3YXJkIGNvbXBhdGlibGUpLAogIC8vIGJ1dCBpZiBwaG9uZSBpcyBwcm92aWRlZCBpdCBtdXN0IHJlc29sdmUgdG8gYSBjbGllbnQuCiAgaWYgKHRyaW0oJHBob25lUmF3KSAhPT0gJycpIHsKICAgICRuZXdDbGllbnRJZCA9IHVwc2VydENsaWVudEZyb21QYXlsb2FkKCRwZG8sICRwaG9uZVJhdywgJGNsaWVudFBheWxvYWQsICRzdG9yZSk7CiAgICBpZiAoJG5ld0NsaWVudElkIDw9IDApIHsKICAgICAgJHBkby0+cm9sbEJhY2soKTsKICAgICAgcmVzcG9uZCg1MDAsIFsnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdVbmFibGUgdG8gcmVzb2x2ZSBjbGllbnQnXSk7CiAgICB9CiAgICAkaWRDbGllbnQgPSAkbmV3Q2xpZW50SWQ7CiAgfQoKICAvLyBBdXRvLWxlYXJuIGZpcnN0IG5hbWUgKGZhaWwtc2FmZSk6IGFkZCB0byBwb3NfbGlzdGVfcHJlbm9tcyBpZiBtaXNzaW5nLgogIC8vIFdlIGRvIHRoaXMgYWZ0ZXIgcG90ZW50aWFsIHVwc2VydCwgYW5kIGFsd2F5cyBmcm9tIERCIChzdGRfY2xpZW50cykgc28gaXQgYWxzbyB3b3JrcwogIC8vIHdoZW4gdGhlIFVQREFURSBwYXlsb2FkIGlzIGEgbWVyZ2UtcGF0Y2ggd2l0aG91dCBub21fcHJlbm9tLgogIGlmIChmdW5jdGlvbl9leGlzdHMoJ3JlbWVtYmVyRmlyc3ROYW1lRnJvbUNsaWVudElkJykgJiYgJGlkQ2xpZW50ID4gMCkgewogICAgdHJ5IHsKICAgICAgcmVtZW1iZXJGaXJzdE5hbWVGcm9tQ2xpZW50SWQoJHBkbywgJGlkQ2xpZW50KTsKICAgIH0gY2F0Y2ggKFRocm93YWJsZSAkZUZuKSB7CiAgICAgIC8vIEZhaWwtc2FmZTogbmV2ZXIgYmxvY2sgb3JkZXIgdXBkYXRlIG9uIGZpcnN0LW5hbWUgbGVhcm5pbmcgaXNzdWVzLgogICAgICBlcnJvcl9sb2coIlt1cGRhdGVPcmRlcl0gZmlyc3ROYW1lIHVwc2VydCBza2lwcGVkIChmYWlsLXNhZmUpIHN0b3JlPXskc3RvcmV9IGNsaWVudF9pZD17JGlkQ2xpZW50fSBvcmRlcl9pZD17JG9yZGVySWR9IGVycj0iIC4gJGVGbi0+Z2V0TWVzc2FnZSgpKTsKICAgIH0KICB9CiAgJGV4aXN0aW5nVGVtcEFkZHJlc3NJZCA9IGlzc2V0KCRmb3VuZFsnYWRyZXNzZV90ZW1wb3JhaXJlJ10pID8gKGludCkkZm91bmRbJ2FkcmVzc2VfdGVtcG9yYWlyZSddIDogMDsKICAkdGVtcEFkZHJlc3NJZCA9IHRlbXBBZGRyZXNzUGVyc2lzdCgkcGRvLCAkdGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzLCAkZXhpc3RpbmdUZW1wQWRkcmVzc0lkID4gMCA/ICRleGlzdGluZ1RlbXBBZGRyZXNzSWQgOiBudWxsLCAkc3RvcmUpOwoKICAvLyBERUxFVEUgbGluZXMKICBpZiAoY291bnQoJGRlbHMpID4gMCkgewogICAgJHBsYWNlaG9sZGVycyA9IGltcGxvZGUoJywnLCBhcnJheV9maWxsKDAsIGNvdW50KCRkZWxzKSwgJz8nKSk7CiAgICAvLyBkZWxldGUgbW9kaWZzIGZpcnN0CiAgICAkc3RtdERNID0gJHBkby0+cHJlcGFyZSgiREVMRVRFIEZST00geyR0YWJsZU1vZGlmc30gV0hFUkUgeyRjb2xMaW5lRmt9IElOICh7JHBsYWNlaG9sZGVyc30pIik7CiAgICBmb3JlYWNoICgkZGVscyBhcyAkaSA9PiAkb2lkKSAkc3RtdERNLT5iaW5kVmFsdWUoJGkgKyAxLCAoaW50KSRvaWQsIFBETzo6UEFSQU1fSU5UKTsKICAgICRzdG10RE0tPmV4ZWN1dGUoKTsKICAgIC8vIGRlbGV0ZSBsaW5lIHJvd3MgKGVuc3VyZSB0aGV5IGJlbG9uZyB0byB0aGlzIG9yZGVyKQogICAgLy8gSU1QT1JUQU5UOiBkbyBub3QgbWl4IHBvc2l0aW9uYWwgKD8pIGFuZCBuYW1lZCAoOngpIHBsYWNlaG9sZGVycyBpbiB0aGUgc2FtZSBzdGF0ZW1lbnQgKFBETyBlcnJvciAtPiA1MDApLgogICAgJHN0bXRETCA9ICRwZG8tPnByZXBhcmUoIkRFTEVURSBGUk9NIHskdGFibGVMaW5lc30gV0hFUkUgaWQgSU4gKHskcGxhY2Vob2xkZXJzfSkgQU5EIHskY29sT3JkZXJGa30gPSA/Iik7CiAgICBmb3JlYWNoICgkZGVscyBhcyAkaSA9PiAkb2lkKSB7CiAgICAgICRzdG10REwtPmJpbmRWYWx1ZSgkaSArIDEsIChpbnQpJG9pZCwgUERPOjpQQVJBTV9JTlQpOwogICAgfQogICAgLy8gbGFzdCBwb3NpdGlvbmFsIHBhcmFtID0gb3JkZXJfaWQKICAgICRzdG10REwtPmJpbmRWYWx1ZShjb3VudCgkZGVscykgKyAxLCAkb3JkZXJJZCwgUERPOjpQQVJBTV9JTlQpOwogICAgJHN0bXRETC0+ZXhlY3V0ZSgpOwogIH0KCiAgLy8gVVBEQVRFIGV4aXN0aW5nIGxpbmVzIChyb3cgKyBtb2RpZnMgcmVmcmVzaCkKICAkc3RtdENoZWNrTGluZSA9ICRwZG8tPnByZXBhcmUoIlNFTEVDVCBpZCBGUk9NIHskdGFibGVMaW5lc30gV0hFUkUgaWQgPSA6aWQgQU5EIHskY29sT3JkZXJGa30gPSA6b3JkZXJfaWQgTElNSVQgMSIpOwogICRzdG10VUwgPSAkcGRvLT5wcmVwYXJlKCJVUERBVEUgeyR0YWJsZUxpbmVzfSBTRVQgaWRfcG9zX3BpenphcyA9IDppZF9wb3NfcGl6emFzLCBkYXRhX2lkID0gOmRhdGFfaWQgV0hFUkUgaWQgPSA6aWQgQU5EIHskY29sT3JkZXJGa30gPSA6b3JkZXJfaWQiKTsKICAkc3RtdERlbE0gPSAkcGRvLT5wcmVwYXJlKCJERUxFVEUgRlJPTSB7JHRhYmxlTW9kaWZzfSBXSEVSRSB7JGNvbExpbmVGa30gPSA6bGluZV9pZCIpOwogICRzdG10SW5zTSA9ICRwZG8tPnByZXBhcmUoIklOU0VSVCBJTlRPIHskdGFibGVNb2RpZnN9ICh7JGNvbExpbmVGa30sIG5vbV9vcHRpb24sIGNsYXNzX29wdGlvbiwgZGF0YV9wcmljZSkgVkFMVUVTICg6bGluZV9pZCwgOm5vbV9vcHRpb24sIDpjbGFzc19vcHRpb24sIDpkYXRhX3ByaWNlKSIpOwoKICAkdXBkYXRlZExpbmVzID0gMDsKICAkdXBkYXRlZE1vZGlmcyA9IDA7CiAgZm9yZWFjaCAoJHVwZHMgYXMgJHUpIHsKICAgICRvaWQgPSAoaW50KSR1WydvcmRlcmVkX2lkJ107CiAgICAkc3RtdENoZWNrTGluZS0+YmluZFZhbHVlKCc6aWQnLCAkb2lkLCBQRE86OlBBUkFNX0lOVCk7CiAgICAkc3RtdENoZWNrTGluZS0+YmluZFZhbHVlKCc6b3JkZXJfaWQnLCAkb3JkZXJJZCwgUERPOjpQQVJBTV9JTlQpOwogICAgJHN0bXRDaGVja0xpbmUtPmV4ZWN1dGUoKTsKICAgICRleGlzdHMgPSAkc3RtdENoZWNrTGluZS0+ZmV0Y2hDb2x1bW4oKTsKICAgIGlmICgkZXhpc3RzID09PSBmYWxzZSkgewogICAgICAkcGRvLT5yb2xsQmFjaygpOwogICAgICByZXNwb25kKDQwMCwgWydvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ1VwZGF0ZSBsaW5lIG5vdCBpbiBvcmRlcicsICdvcmRlcmVkX2lkJyA9PiAkb2lkXSk7CiAgICB9CgogICAgJHN0bXRVTC0+YmluZFZhbHVlKCc6aWQnLCAkb2lkLCBQRE86OlBBUkFNX0lOVCk7CiAgICAkc3RtdFVMLT5iaW5kVmFsdWUoJzpvcmRlcl9pZCcsICRvcmRlcklkLCBQRE86OlBBUkFNX0lOVCk7CiAgICAkc3RtdFVMLT5iaW5kVmFsdWUoJzppZF9wb3NfcGl6emFzJywgKGludCkkdVsnaWRfcG9zX3BpenphcyddLCBQRE86OlBBUkFNX0lOVCk7CiAgICAkc3RtdFVMLT5iaW5kVmFsdWUoJzpkYXRhX2lkJywgKHN0cmluZykkdVsnZGF0YV9pZCddLCBQRE86OlBBUkFNX1NUUik7CiAgICAkc3RtdFVMLT5leGVjdXRlKCk7CiAgICAkdXBkYXRlZExpbmVzICs9IDE7CgogICAgLy8gcmVmcmVzaCBtb2RpZnMKICAgICRzdG10RGVsTS0+YmluZFZhbHVlKCc6bGluZV9pZCcsICRvaWQsIFBETzo6UEFSQU1fSU5UKTsKICAgICRzdG10RGVsTS0+ZXhlY3V0ZSgpOwogICAgZm9yZWFjaCAoJHVbJ21vZGlmcyddIGFzICRtKSB7CiAgICAgICRzdG10SW5zTS0+YmluZFZhbHVlKCc6bGluZV9pZCcsICRvaWQsIFBETzo6UEFSQU1fSU5UKTsKICAgICAgJHN0bXRJbnNNLT5iaW5kVmFsdWUoJzpub21fb3B0aW9uJywgKHN0cmluZykkbVsnbm9tX29wdGlvbiddLCBQRE86OlBBUkFNX1NUUik7CiAgICAgICRzdG10SW5zTS0+YmluZFZhbHVlKCc6Y2xhc3Nfb3B0aW9uJywgKHN0cmluZykkbVsnY2xhc3Nfb3B0aW9uJ10sIFBETzo6UEFSQU1fU1RSKTsKICAgICAgJHN0bXRJbnNNLT5iaW5kVmFsdWUoJzpkYXRhX3ByaWNlJywgbnVtYmVyX2Zvcm1hdCgoZmxvYXQpJG1bJ2RhdGFfcHJpY2UnXSwgMiwgJy4nLCAnJyksIFBETzo6UEFSQU1fU1RSKTsKICAgICAgJHN0bXRJbnNNLT5leGVjdXRlKCk7CiAgICAgICR1cGRhdGVkTW9kaWZzICs9IDE7CiAgICB9CiAgfQoKICAvLyBJTlNFUlQgbmV3IGxpbmVzCiAgJGluc2VydGVkTGluZXMgPSAwOwogICRpbnNlcnRlZE1vZGlmcyA9IDA7CiAgaWYgKCRzdG9yZSA9PT0gJ3BlbCcpIHsKICAgICRzcWxJTCA9ICJJTlNFUlQgSU5UTyB7JHRhYmxlTGluZXN9ICh7JGNvbE9yZGVyRmt9LCBpZF9wb3NfcGl6emFzLCBkYXRhX2lkLCBkYXRhX3R5cGUsIGlzX3dlYl9hZGRpdGlvbiwgaXNfZnJlZSkKICAgICAgICAgICAgICBWQUxVRVMgKDpvcmRlcl9pZCwgOmlkX3Bvc19waXp6YXMsIDpkYXRhX2lkLCBOVUxMLCAwLCAwKSI7CiAgfSBlbHNlIHsKICAgICRzcWxJTCA9ICJJTlNFUlQgSU5UTyB7JHRhYmxlTGluZXN9ICh7JGNvbE9yZGVyRmt9LCBpZF9wb3NfcGl6emFzLCBkYXRhX2lkLCBpc193ZWJfYWRkaXRpb24sIGlzX2ZyZWUpCiAgICAgICAgICAgICAgVkFMVUVTICg6b3JkZXJfaWQsIDppZF9wb3NfcGl6emFzLCA6ZGF0YV9pZCwgMCwgMCkiOwogIH0KICAkc3RtdElMID0gJHBkby0+cHJlcGFyZSgkc3FsSUwpOwoKICBmb3JlYWNoICgkYWRkcyBhcyAkYSkgewogICAgJHN0bXRJTC0+YmluZFZhbHVlKCc6b3JkZXJfaWQnLCAkb3JkZXJJZCwgUERPOjpQQVJBTV9JTlQpOwogICAgJHN0bXRJTC0+YmluZFZhbHVlKCc6aWRfcG9zX3BpenphcycsIChpbnQpJGFbJ2lkX3Bvc19waXp6YXMnXSwgUERPOjpQQVJBTV9JTlQpOwogICAgJHN0bXRJTC0+YmluZFZhbHVlKCc6ZGF0YV9pZCcsIChzdHJpbmcpJGFbJ2RhdGFfaWQnXSwgUERPOjpQQVJBTV9TVFIpOwogICAgJHN0bXRJTC0+ZXhlY3V0ZSgpOwogICAgJGxpbmVJZCA9IChpbnQpJHBkby0+bGFzdEluc2VydElkKCk7CiAgICAkaW5zZXJ0ZWRMaW5lcyArPSAxOwoKICAgIGZvcmVhY2ggKCRhWydtb2RpZnMnXSBhcyAkbSkgewogICAgICAkc3RtdEluc00tPmJpbmRWYWx1ZSgnOmxpbmVfaWQnLCAkbGluZUlkLCBQRE86OlBBUkFNX0lOVCk7CiAgICAgICRzdG10SW5zTS0+YmluZFZhbHVlKCc6bm9tX29wdGlvbicsIChzdHJpbmcpJG1bJ25vbV9vcHRpb24nXSwgUERPOjpQQVJBTV9TVFIpOwogICAgICAkc3RtdEluc00tPmJpbmRWYWx1ZSgnOmNsYXNzX29wdGlvbicsIChzdHJpbmcpJG1bJ2NsYXNzX29wdGlvbiddLCBQRE86OlBBUkFNX1NUUik7CiAgICAgICRzdG10SW5zTS0+YmluZFZhbHVlKCc6ZGF0YV9wcmljZScsIG51bWJlcl9mb3JtYXQoKGZsb2F0KSRtWydkYXRhX3ByaWNlJ10sIDIsICcuJywgJycpLCBQRE86OlBBUkFNX1NUUik7CiAgICAgICRzdG10SW5zTS0+ZXhlY3V0ZSgpOwogICAgICAkaW5zZXJ0ZWRNb2RpZnMgKz0gMTsKICAgIH0KICB9CgogIC8vIFVwZGF0ZSBvcmRlciBoZWFkZXIgKGtlZXAgaWRfZGF0ZSBpbW11dGFibGU7IGhldXJlX3ByZXBhIGNhbiBtb3ZlIHdpdGhpbiBkYXkpCiAgJHNxbFVPID0gIlVQREFURSB7JHRhYmxlT3JkZXJzfQogICAgICAgICAgICBTRVQgaGV1cmVfcHJlcGEgPSA6aGV1cmVfcHJlcGEsCiAgICAgICAgICAgICAgICBpZF9jbGllbnQgPSA6aWRfY2xpZW50LAogICAgICAgICAgICAgICAgY291cGUgPSA6Y291cGUsCiAgICAgICAgICAgICAgICBsaXZyYWlzb24gPSA6bGl2cmFpc29uLAogICAgICAgICAgICAgICAgbmJyX3BpenphcyA9IDpuYnJfcGl6emFzLAogICAgICAgICAgICAgICAgcHJpeF9jb20gPSA6cHJpeF9jb20sCiAgICAgICAgICAgICAgICBhZHJlc3NlX3RlbXBvcmFpcmUgPSA6YWRyZXNzZV90ZW1wb3JhaXJlCiAgICAgICAgICAgIFdIRVJFIGlkID0gOmlkIEFORCBpZF9kYXRlID0gOmlkX2RhdGUiOwogICRzdG10VU8gPSAkcGRvLT5wcmVwYXJlKCRzcWxVTyk7CiAgJHN0bXRVTy0+YmluZFZhbHVlKCc6aGV1cmVfcHJlcGEnLCAkaGV1cmVQcmVwYU1zLCBQRE86OlBBUkFNX0lOVCk7CiAgJHN0bXRVTy0+YmluZFZhbHVlKCc6aWRfY2xpZW50JywgJGlkQ2xpZW50LCBQRE86OlBBUkFNX0lOVCk7CiAgJHN0bXRVTy0+YmluZFZhbHVlKCc6Y291cGUnLCAkY291cGUsIFBETzo6UEFSQU1fSU5UKTsKICAkc3RtdFVPLT5iaW5kVmFsdWUoJzpsaXZyYWlzb24nLCAkbGl2cmFpc29uLCBQRE86OlBBUkFNX0lOVCk7CiAgJHN0bXRVTy0+YmluZFZhbHVlKCc6bmJyX3BpenphcycsICRuYnJQaXp6YXMsIFBETzo6UEFSQU1fSU5UKTsKICAkc3RtdFVPLT5iaW5kVmFsdWUoJzpwcml4X2NvbScsICRwcml4Q29tU3RyLCBQRE86OlBBUkFNX1NUUik7CiAgaWYgKCR0ZW1wQWRkcmVzc0lkID09PSBudWxsKSAkc3RtdFVPLT5iaW5kVmFsdWUoJzphZHJlc3NlX3RlbXBvcmFpcmUnLCBudWxsLCBQRE86OlBBUkFNX05VTEwpOwogIGVsc2UgJHN0bXRVTy0+YmluZFZhbHVlKCc6YWRyZXNzZV90ZW1wb3JhaXJlJywgJHRlbXBBZGRyZXNzSWQsIFBETzo6UEFSQU1fSU5UKTsKICAkc3RtdFVPLT5iaW5kVmFsdWUoJzppZCcsICRvcmRlcklkLCBQRE86OlBBUkFNX0lOVCk7CiAgJHN0bXRVTy0+YmluZFZhbHVlKCc6aWRfZGF0ZScsICRpZERhdGUsIFBETzo6UEFSQU1fSU5UKTsKICAkc3RtdFVPLT5leGVjdXRlKCk7CgogICRjdXN0b21lclJvdyA9IGxvYWRDdXN0b21lckJ5SWQoJHBkbywgJGlkQ2xpZW50KTsKICBpZiAoaXNfYXJyYXkoJGN1c3RvbWVyUm93KSkgewogICAgJGxveWFsdHlHdWFyZCA9IGVuZm9yY2VPcmRlckZpbmFsTG95YWx0eVVzYWdlKCRwZG8sICRjdXN0b21lclJvdywgJHN0b3JlLCAkb3JkZXJJZCwgJGhldXJlUHJlcGFNcywgJ3JlamVjdCcpOwogICAgaWYgKGVtcHR5KCRsb3lhbHR5R3VhcmRbJ29rJ10pKSB7CiAgICAgICRwZG8tPnJvbGxCYWNrKCk7CiAgICAgIHJlc3BvbmQoNDA5LCBbCiAgICAgICAgJ29rJyA9PiBmYWxzZSwKICAgICAgICAnZXJyb3InID0+ICdsb3lhbHR5X2FscmVhZHlfdXNlZF9vbl9kYXknLAogICAgICAgICdraW5kJyA9PiAnYnVzaW5lc3NfcnVsZV9yZWNhbGNfcmVxdWlyZWQnLAogICAgICAgICdtZXNzYWdlJyA9PiAnTOKAmWF2YW50YWdlIGZpZMOpbGl0w6kgYSBkw6lqw6Agw6l0w6kgY29uc29tbcOpIHN1ciBjZXR0ZSBqb3VybsOpZSBwb3VyIGNlIGNsaWVudC9ncm91cGUuIE1lcmNpIGRlIHJlY2FsY3VsZXIgbGEgY29tbWFuZGUuJywKICAgICAgICAnZGF0ZV9vbmx5JyA9PiAoc3RyaW5nKSgkbG95YWx0eUd1YXJkWydkYXRlX29ubHknXSA/PyAkZGF0ZUlTTyksCiAgICAgIF0pOwogICAgfQogIH0KCiAgLy8gUXVldWUgRVNDL1BPUyBwcmludCBqb2IgKHJlY2VpcHQgdGlja2V0IGZyb20gdXBkYXRlZCBvcmRlcikgYXRvbWljYWxseSB3aXRoIHRoZSBvcmRlciB1cGRhdGUuCiAgJHByaW50UXVldWVkID0gZmFsc2U7CiAgJHByaW50Sm9iSWQgPSAwOwogIGlmIChmdW5jdGlvbl9leGlzdHMoJ3F1ZXVlT3JkZXJSZWNlaXB0VGlja2V0Sm9iJykpIHsKICAgIHRyeSB7CiAgICAgICRwcmludEpvYklkID0gKGludClxdWV1ZU9yZGVyUmVjZWlwdFRpY2tldEpvYigkcGRvLCAkc3RvcmUsICRvcmRlcklkLCAnY2Fpc3NlJyk7CiAgICAgIGlmICgkcHJpbnRKb2JJZCA+IDApICRwcmludFF1ZXVlZCA9IHRydWU7CiAgICAgIGVsc2UgZXJyb3JfbG9nKCJbdXBkYXRlT3JkZXJdIHByaW50IGpvYiBpbnNlcnQgZmFpbGVkIChmYWlsLXNhZmUpIHN0b3JlPXskc3RvcmV9IG9yZGVyX2lkPXskb3JkZXJJZH0iKTsKICAgIH0gY2F0Y2ggKFRocm93YWJsZSAkZVByaW50KSB7CiAgICAgIGVycm9yX2xvZygiW3VwZGF0ZU9yZGVyXSBwcmludCBqb2IgZmFpbGVkIChmYWlsLXNhZmUpIHN0b3JlPXskc3RvcmV9IG9yZGVyX2lkPXskb3JkZXJJZH0gZXJyPSIgLiAkZVByaW50LT5nZXRNZXNzYWdlKCkpOwogICAgfQogIH0gZWxzZSB7CiAgICBlcnJvcl9sb2coIlt1cGRhdGVPcmRlcl0gcHJpbnRKb2JzIGhlbHBlciBtaXNzaW5nOyBza2lwIHByaW50IGpvYiBzdG9yZT17JHN0b3JlfSBvcmRlcl9pZD17JG9yZGVySWR9Iik7CiAgfQoKICAvLyDilIDilIAgQXV0byBkZWNpc2lvbjogcXVldWUgU01TIG9uIFVQREFURSBvbmx5IGlmICh0b3RhbCBPUiBoZXVyZV9wcmVwYSBPUiBsaXZyYWlzb24pIGNoYW5nZWQg4pSA4pSACiAgLy8gS2VlcCBpbnNpZGUgdGhlIHNhbWUgdHJhbnNhY3Rpb24gYXMgb3JkZXIgdXBkYXRlIChmYWlsLXNhZmUpLgogICRhZnRlclRvdGFsQ2VudHMgPSBmZXRjaE9yZGVyVG90YWxDZW50c0xvY2FsKCRwZG8sICR0YWJsZUxpbmVzLCAkdGFibGVNb2RpZnMsICRjb2xPcmRlckZrLCAkY29sTGluZUZrLCAkb3JkZXJJZCk7CiAgJHNob3VsZFNlbmRTbXMgPSAhKAogICAgJGJlZm9yZVRvdGFsQ2VudHMgPT09ICRhZnRlclRvdGFsQ2VudHMgJiYKICAgICRiZWZvcmVIZXVyZVByZXBhTXMgPT09ICRoZXVyZVByZXBhTXMgJiYKICAgICRiZWZvcmVMaXZyYWlzb24gPT09ICRsaXZyYWlzb24KICApOwoKICBpZiAoJHNob3VsZFNlbmRTbXMgJiYgZnVuY3Rpb25fZXhpc3RzKCdxdWV1ZU9yZGVyU21zJykpIHsKICAgIHRyeSB7CiAgICAgIGlmICgkaWRDbGllbnQgPiAwKSB7CiAgICAgICAgJHNtc1R5cGUgPSAnb3JkZXJfbW9kaWYnOwogICAgICAgICRkZWxpdmVyeU1vZGUgPSAoJGxpdnJhaXNvbiA9PT0gMSkgPyAnZGVsaXZlcnknIDogJ3BpY2t1cCc7CiAgICAgICAgcXVldWVPcmRlclNtcygkcGRvLCAkc3RvcmUsICRvcmRlcklkLCAkaWRDbGllbnQsICRzbXNUeXBlLCAkZGVsaXZlcnlNb2RlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBlcnJvcl9sb2coIlt1cGRhdGVPcmRlcl0gU01TIHNraXA6IG1pc3NpbmcgaWRfY2xpZW50IHN0b3JlPXskc3RvcmV9IG9yZGVyX2lkPXskb3JkZXJJZH0iKTsKICAgICAgfQogICAgfSBjYXRjaCAoVGhyb3dhYmxlICRlU21zKSB7CiAgICAgIC8vIEZhaWwtc2FmZTogbmV2ZXIgYmxvY2sgdXBkYXRlIG9uIFNNUyBpc3N1ZXMuCiAgICAgIGVycm9yX2xvZygiW3VwZGF0ZU9yZGVyXSBTTVMgc2tpcHBlZCAoZmFpbC1zYWZlKTogc3RvcmU9eyRzdG9yZX0gb3JkZXJfaWQ9eyRvcmRlcklkfSBlcnI9IiAuICRlU21zLT5nZXRNZXNzYWdlKCkpOwogICAgfQogIH0KCiAgJHBkby0+Y29tbWl0KCk7CgogIHJlc3BvbmQoMjAwLCBbCiAgICAnb2snID0+IHRydWUsCiAgICAnc3RvcmUnID0+ICRzdG9yZSwKICAgICdpZCcgPT4gJG9yZGVySWQsCiAgICAnaWRfZGF0ZScgPT4gJGlkRGF0ZSwKICAgICdkYXRlSVNPJyA9PiAkZGF0ZUlTTywKICAgICdoZXVyZV9wcmVwYScgPT4gJGhldXJlUHJlcGFNcywKICAgICd0ZW1wX2FkZHJlc3NfaWQnID0+ICR0ZW1wQWRkcmVzc0lkLAogICAgJ2lkX2NsaWVudCcgPT4gJGlkQ2xpZW50LAogICAgJ2RpZmYnID0+IFsKICAgICAgJ2xpbmVzX2luc2VydGVkJyA9PiAkaW5zZXJ0ZWRMaW5lcywKICAgICAgJ2xpbmVzX2RlbGV0ZWQnID0+IGNvdW50KCRkZWxzKSwKICAgICAgJ2xpbmVzX3VwZGF0ZWQnID0+ICR1cGRhdGVkTGluZXMsCiAgICAgICdtb2RpZnNfaW5zZXJ0ZWQnID0+ICRpbnNlcnRlZE1vZGlmcywKICAgICAgJ21vZGlmc191cGRhdGVkJyA9PiAkdXBkYXRlZE1vZGlmcywKICAgIF0sCiAgICAncHJpbnRfam9iJyA9PiBbCiAgICAgICdxdWV1ZWQnID0+ICRwcmludFF1ZXVlZCwKICAgICAgJ2pvYl9pZCcgPT4gJHByaW50Sm9iSWQsCiAgICBdLAogIF0pOwp9IGNhdGNoIChUaHJvd2FibGUgJGUpIHsKICB0cnkgeyBpZiAoJHBkby0+aW5UcmFuc2FjdGlvbigpKSAkcGRvLT5yb2xsQmFjaygpOyB9IGNhdGNoIChUaHJvd2FibGUgJGUyKSB7fQogICRzdG9yZUxvZyA9IGlzc2V0KCRzdG9yZSkgPyAoc3RyaW5nKSRzdG9yZSA6ICcnOwogICRvcmRlckxvZyA9IGlzc2V0KCRvcmRlcklkKSA/IChpbnQpJG9yZGVySWQgOiAwOwogIGVycm9yX2xvZygiW3VwZGF0ZU9yZGVyXSBjcmFzaCBzdG9yZT17JHN0b3JlTG9nfSBvcmRlcl9pZD17JG9yZGVyTG9nfSBlcnI9IiAuICRlLT5nZXRNZXNzYWdlKCkgLiAiIEAgIiAuICRlLT5nZXRGaWxlKCkgLiAiOiIgLiAkZS0+Z2V0TGluZSgpKTsKICByZXNwb25kKDUwMCwgWydvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ1NlcnZlciBlcnJvcicsICdraW5kJyA9PiAnc2VydmVyX2Vycm9yJ10pOwp9"
            }
        },
        {
            "path": "caisse-aqp/public/assets/js/app-js/address/deliveryCityChoices.js",
            "kind": "file",
            "before": {
                "exists": true,
                "kind": "file",
                "size": 3082,
                "sha1": "9bc103606890ea6307a3f1fb3901e8e95d91dbdd",
                "content_b64": "LyogZG9jLXByb2plY3QgfCBjYWlzc2UtYXFwL3B1YmxpYy9hc3NldHMvanMvYXBwLWpzL2FkZHJlc3MvZGVsaXZlcnlDaXR5Q2hvaWNlcy5qcyB8IENlbnRyYWxpc2UgZW4gY2Fpc3NlIGxhIGxpc3RlIGRlcyBjb3VwbGVzIGNvZGUgcG9zdGFsIC8gdmlsbGUgYXV0b3Jpc8OpcyBwYXIgUERWIGF2ZWMgbGVzIG3Dqm1lcyByw6hnbGVzIGRlIG5vcm1hbGlzYXRpb24gZXQgZGUgbWF0Y2hpbmcgcXVlIGxhIGNvbW1hbmRlIHdlYiBWMSBhZmluIGTigJlhbGltZW50ZXIgdW4gc8OpbGVjdGV1ciB1bmlxdWUsIGRlIHJlY29uc3RpdHVlciBzYSB2YWxldXIgZGVwdWlzIGxhIEJERCBldCBkZSBkaXN0aW5ndWVyIGNsYWlyZW1lbnQgdW5lIHPDqWxlY3Rpb24gdmFsaWRlIGTigJl1biBzaW1wbGUgYWZmaWNoYWdlIGNvbnNlcnbDqSBob3JzIFBEViBjb3VyYW50LiB8IEV4cG9zZTogbm9ybWFsaXplU3RvcmVJZCwgbm9ybWFsaXplVGV4dCwgZ2V0QWxsb3dlZENob2ljZXMsIGZpbmRFeGFjdEFsbG93ZWRDaG9pY2UsIGJ1aWxkQWxsb3dlZENob2ljZVZhbHVlLCBpc0FsbG93ZWRDaG9pY2UsIGZvcm1hdENob2ljZUxhYmVsIHwgRMOpcGVuZCBkZTogYXVjdW5lIHwgSW1wYWN0ZTogVUkgY2Fpc3NlLCB2YWxpZGF0aW9uIGZyb250ZW5kIGRlcyBhZHJlc3NlcyBjbGllbnQgZXQgcHJvdmlzb2lyZXMsIHJlc3RpdHV0aW9uIGRlcyB2YWxldXJzIHNhdXZlZ2FyZMOpZXMsIHByw6lyZW1wbGlzc2FnZSBkdSBzw6lsZWN0ZXVyIGNvbXBvc2l0ZSB8IFRhYmxlczogYXVjdW5lICovCgpjb25zdCBDSE9JQ0VTID0gewogIGxhbjogWwogICAgeyBjaXR5OiAiTGFuw6dvbi1Qcm92ZW5jZSIsIHBvc3RhbENvZGU6ICIxMzY4MCIgfSwKICAgIHsgY2l0eTogIkdyYW5zIiwgcG9zdGFsQ29kZTogIjEzNDUwIiB9LAogICAgeyBjaXR5OiAiU2Fsb24tZGUtUHJvdmVuY2UiLCBwb3N0YWxDb2RlOiAiMTMzMDAiIH0sCiAgXSwKICBwZWw6IFsKICAgIHsgY2l0eTogIlDDqWxpc3Nhbm5lIiwgcG9zdGFsQ29kZTogIjEzMzMwIiB9LAogICAgeyBjaXR5OiAiQXVyb25zIiwgcG9zdGFsQ29kZTogIjEzMTIxIiB9LAogICAgeyBjaXR5OiAiTGEgQmFyYmVuIiwgcG9zdGFsQ29kZTogIjEzMzMwIiB9LAogICAgeyBjaXR5OiAiU2Fsb24tZGUtUHJvdmVuY2UiLCBwb3N0YWxDb2RlOiAiMTMzMDAiIH0sCiAgXSwKfTsKCmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVTdG9yZUlkKHN0b3JlSWQpewogIGNvbnN0IHMgPSBTdHJpbmcoc3RvcmVJZCA/PyAiIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7CiAgaWYgKHMgPT09ICJwZWwiIHx8IHMgPT09ICJww6lsaXNzYW5uZSIgfHwgcyA9PT0gInBlbGlzc2FubmUiKSByZXR1cm4gInBlbCI7CiAgcmV0dXJuICJsYW4iOwp9CgpleHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplVGV4dCh2YWx1ZSl7CiAgbGV0IHMgPSBTdHJpbmcodmFsdWUgPz8gIiIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwogIGlmICghcykgcmV0dXJuICIiOwogIHRyeXsKICAgIHMgPSBzLm5vcm1hbGl6ZSgiTkZEIikucmVwbGFjZSgvW1x1MDMwMC1cdTAzNmZdL2csICIiKTsKICB9IGNhdGNoIChfZSkge30KICBzID0gcy5yZXBsYWNlKC9bJ+KAmV0vZywgIiAiKTsKICBzID0gcy5yZXBsYWNlKC8tL2csICIgIik7CiAgcyA9IHMucmVwbGFjZSgvW15hLXowLTldKy9nLCAiICIpOwogIHMgPSBzLnJlcGxhY2UoL1xzKy9nLCAiICIpLnRyaW0oKTsKICByZXR1cm4gczsKfQoKZnVuY3Rpb24gbm9ybWFsaXplUG9zdGFsQ29kZSh2YWx1ZSl7CiAgcmV0dXJuIFN0cmluZyh2YWx1ZSA/PyAiIikucmVwbGFjZSgvXEQrL2csICIiKTsKfQoKZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdENob2ljZUxhYmVsKGNob2ljZSl7CiAgaWYgKCFjaG9pY2UpIHJldHVybiAiIjsKICByZXR1cm4gYCR7U3RyaW5nKGNob2ljZS5wb3N0YWxDb2RlID8/ICIiKX0gLSAke1N0cmluZyhjaG9pY2UuY2l0eSA/PyAiIil9YDsKfQoKZXhwb3J0IGZ1bmN0aW9uIGdldEFsbG93ZWRDaG9pY2VzKHN0b3JlSWQpewogIGNvbnN0IHJvd3MgPSBDSE9JQ0VTW25vcm1hbGl6ZVN0b3JlSWQoc3RvcmVJZCldIHx8IFtdOwogIHJldHVybiByb3dzLm1hcCgocm93KSA9PiB7CiAgICBjb25zdCBjaXR5ID0gU3RyaW5nKHJvdy5jaXR5ID8/ICIiKTsKICAgIGNvbnN0IHBvc3RhbENvZGUgPSBTdHJpbmcocm93LnBvc3RhbENvZGUgPz8gIiIpOwogICAgcmV0dXJuIHsKICAgICAgY2l0eSwKICAgICAgcG9zdGFsQ29kZSwKICAgICAgY2l0eU5vcm06IG5vcm1hbGl6ZVRleHQoY2l0eSksCiAgICAgIHBvc3RhbENvZGVOb3JtOiBub3JtYWxpemVQb3N0YWxDb2RlKHBvc3RhbENvZGUpLAogICAgICBjaG9pY2VWYWx1ZTogYCR7cG9zdGFsQ29kZX18JHtjaXR5fWAsCiAgICB9OwogIH0pOwp9CgpleHBvcnQgZnVuY3Rpb24gZmluZEV4YWN0QWxsb3dlZENob2ljZShzdG9yZUlkLCBjaXR5LCBwb3N0YWxDb2RlKXsKICBjb25zdCBjaXR5Tm9ybSA9IG5vcm1hbGl6ZVRleHQoY2l0eSk7CiAgY29uc3QgcG9zdGFsQ29kZU5vcm0gPSBub3JtYWxpemVQb3N0YWxDb2RlKHBvc3RhbENvZGUpOwogIGlmICghY2l0eU5vcm0gfHwgIXBvc3RhbENvZGVOb3JtKSByZXR1cm4gbnVsbDsKICBjb25zdCByb3dzID0gZ2V0QWxsb3dlZENob2ljZXMoc3RvcmVJZCk7CiAgZm9yIChjb25zdCByb3cgb2Ygcm93cyl7CiAgICBpZiAocm93LmNpdHlOb3JtID09PSBjaXR5Tm9ybSAmJiByb3cucG9zdGFsQ29kZU5vcm0gPT09IHBvc3RhbENvZGVOb3JtKSByZXR1cm4gcm93OwogIH0KICByZXR1cm4gbnVsbDsKfQoKZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQWxsb3dlZENob2ljZVZhbHVlKHN0b3JlSWQsIGNpdHksIHBvc3RhbENvZGUpewogIGNvbnN0IHJvdyA9IGZpbmRFeGFjdEFsbG93ZWRDaG9pY2Uoc3RvcmVJZCwgY2l0eSwgcG9zdGFsQ29kZSk7CiAgcmV0dXJuIHJvdyA/IFN0cmluZyhyb3cuY2hvaWNlVmFsdWUgfHwgIiIpIDogIiI7Cn0KCmV4cG9ydCBmdW5jdGlvbiBpc0FsbG93ZWRDaG9pY2Uoc3RvcmVJZCwgY2l0eSwgcG9zdGFsQ29kZSl7CiAgcmV0dXJuICEhZmluZEV4YWN0QWxsb3dlZENob2ljZShzdG9yZUlkLCBjaXR5LCBwb3N0YWxDb2RlKTsKfQ=="
            },
            "after": {
                "exists": true,
                "kind": "file",
                "size": 3489,
                "sha1": "1c85293c8afd92114565fcbdbc5e30d43be5916f",
                "content_b64": "LyogZG9jLXByb2plY3QgfCBjYWlzc2UtYXFwL3B1YmxpYy9hc3NldHMvanMvYXBwLWpzL2FkZHJlc3MvZGVsaXZlcnlDaXR5Q2hvaWNlcy5qcyB8IENlbnRyYWxpc2UgZW4gY2Fpc3NlIGxhIGxpc3RlIGRlcyBjb3VwbGVzIGNvZGUgcG9zdGFsIC8gdmlsbGUgcHJvcG9zw6lzIHBhciBQRFYgYXZlYyBsZXMgbcOqbWVzIHLDqGdsZXMgZGUgbm9ybWFsaXNhdGlvbiBldCBkZSBtYXRjaGluZyBxdWUgbGEgY29tbWFuZGUgd2ViIFYxIGFmaW4gZOKAmWFsaW1lbnRlciB1biBzw6lsZWN0ZXVyIHVuaXF1ZSwgZGUgcmVjb25zdGl0dWVyIHNhIHZhbGV1ciBkZXB1aXMgbGEgQkRELCBkZSBkaXN0aW5ndWVyIGNsYWlyZW1lbnQgdW5lIHPDqWxlY3Rpb24gdmFsaWRlIGTigJl1biBzaW1wbGUgYWZmaWNoYWdlIGNvbnNlcnbDqSBob3JzIFBEViBjb3VyYW50IGV0IGRlIGZvdXJuaXIgbGUgY2hvaXggcGFyIGTDqWZhdXQgYXR0ZW5kdSBwb3VyIGNoYXF1ZSBtYWdhc2luIGxvcnMgZHUgcGFzc2FnZSBlbiBsaXZyYWlzb24uIHwgRXhwb3NlOiBub3JtYWxpemVTdG9yZUlkLCBub3JtYWxpemVUZXh0LCBnZXRBbGxvd2VkQ2hvaWNlcywgZmluZEV4YWN0QWxsb3dlZENob2ljZSwgYnVpbGRBbGxvd2VkQ2hvaWNlVmFsdWUsIGlzQWxsb3dlZENob2ljZSwgZm9ybWF0Q2hvaWNlTGFiZWwsIGdldERlZmF1bHRDaG9pY2UsIGJ1aWxkRGVmYXVsdENob2ljZVZhbHVlIHwgRMOpcGVuZCBkZTogYXVjdW5lIHwgSW1wYWN0ZTogVUkgY2Fpc3NlLCBzw6lsZWN0aW9uIHBhciBkw6lmYXV0IFBEViBkZXMgY29tbXVuZXMgZGUgbGl2cmFpc29uLCByZXN0aXR1dGlvbiBkZXMgdmFsZXVycyBzYXV2ZWdhcmTDqWVzLCBwcsOpcmVtcGxpc3NhZ2UgZHUgc8OpbGVjdGV1ciBjb21wb3NpdGUgfCBUYWJsZXM6IGF1Y3VuZSAqLwoKY29uc3QgQ0hPSUNFUyA9IHsKICBsYW46IFsKICAgIHsgY2l0eTogIkxhbsOnb24tUHJvdmVuY2UiLCBwb3N0YWxDb2RlOiAiMTM2ODAiIH0sCiAgICB7IGNpdHk6ICJHcmFucyIsIHBvc3RhbENvZGU6ICIxMzQ1MCIgfSwKICAgIHsgY2l0eTogIlNhbG9uLWRlLVByb3ZlbmNlIiwgcG9zdGFsQ29kZTogIjEzMzAwIiB9LAogIF0sCiAgcGVsOiBbCiAgICB7IGNpdHk6ICJQw6lsaXNzYW5uZSIsIHBvc3RhbENvZGU6ICIxMzMzMCIgfSwKICAgIHsgY2l0eTogIkF1cm9ucyIsIHBvc3RhbENvZGU6ICIxMzEyMSIgfSwKICAgIHsgY2l0eTogIkxhIEJhcmJlbiIsIHBvc3RhbENvZGU6ICIxMzMzMCIgfSwKICAgIHsgY2l0eTogIlNhbG9uLWRlLVByb3ZlbmNlIiwgcG9zdGFsQ29kZTogIjEzMzAwIiB9LAogIF0sCn07CgpleHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplU3RvcmVJZChzdG9yZUlkKXsKICBjb25zdCBzID0gU3RyaW5nKHN0b3JlSWQgPz8gIiIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwogIGlmIChzID09PSAicGVsIiB8fCBzID09PSAicMOpbGlzc2FubmUiIHx8IHMgPT09ICJwZWxpc3Nhbm5lIikgcmV0dXJuICJwZWwiOwogIHJldHVybiAibGFuIjsKfQoKZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVRleHQodmFsdWUpewogIGxldCBzID0gU3RyaW5nKHZhbHVlID8/ICIiKS50cmltKCkudG9Mb3dlckNhc2UoKTsKICBpZiAoIXMpIHJldHVybiAiIjsKICB0cnl7CiAgICBzID0gcy5ub3JtYWxpemUoIk5GRCIpLnJlcGxhY2UoL1tcdTAzMDAtXHUwMzZmXS9nLCAiIik7CiAgfSBjYXRjaCAoX2UpIHt9CiAgcyA9IHMucmVwbGFjZSgvWyfigJldL2csICIgIik7CiAgcyA9IHMucmVwbGFjZSgvLS9nLCAiICIpOwogIHMgPSBzLnJlcGxhY2UoL1teYS16MC05XSsvZywgIiAiKTsKICBzID0gcy5yZXBsYWNlKC9ccysvZywgIiAiKS50cmltKCk7CiAgcmV0dXJuIHM7Cn0KCmZ1bmN0aW9uIG5vcm1hbGl6ZVBvc3RhbENvZGUodmFsdWUpewogIHJldHVybiBTdHJpbmcodmFsdWUgPz8gIiIpLnJlcGxhY2UoL1xEKy9nLCAiIik7Cn0KCmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRDaG9pY2VMYWJlbChjaG9pY2UpewogIGlmICghY2hvaWNlKSByZXR1cm4gIiI7CiAgcmV0dXJuIGAke1N0cmluZyhjaG9pY2UucG9zdGFsQ29kZSA/PyAiIil9IC0gJHtTdHJpbmcoY2hvaWNlLmNpdHkgPz8gIiIpfWA7Cn0KCmV4cG9ydCBmdW5jdGlvbiBnZXRBbGxvd2VkQ2hvaWNlcyhzdG9yZUlkKXsKICBjb25zdCByb3dzID0gQ0hPSUNFU1tub3JtYWxpemVTdG9yZUlkKHN0b3JlSWQpXSB8fCBbXTsKICByZXR1cm4gcm93cy5tYXAoKHJvdykgPT4gewogICAgY29uc3QgY2l0eSA9IFN0cmluZyhyb3cuY2l0eSA/PyAiIik7CiAgICBjb25zdCBwb3N0YWxDb2RlID0gU3RyaW5nKHJvdy5wb3N0YWxDb2RlID8/ICIiKTsKICAgIHJldHVybiB7CiAgICAgIGNpdHksCiAgICAgIHBvc3RhbENvZGUsCiAgICAgIGNpdHlOb3JtOiBub3JtYWxpemVUZXh0KGNpdHkpLAogICAgICBwb3N0YWxDb2RlTm9ybTogbm9ybWFsaXplUG9zdGFsQ29kZShwb3N0YWxDb2RlKSwKICAgICAgY2hvaWNlVmFsdWU6IGAke3Bvc3RhbENvZGV9fCR7Y2l0eX1gLAogICAgfTsKICB9KTsKfQoKZXhwb3J0IGZ1bmN0aW9uIGZpbmRFeGFjdEFsbG93ZWRDaG9pY2Uoc3RvcmVJZCwgY2l0eSwgcG9zdGFsQ29kZSl7CiAgY29uc3QgY2l0eU5vcm0gPSBub3JtYWxpemVUZXh0KGNpdHkpOwogIGNvbnN0IHBvc3RhbENvZGVOb3JtID0gbm9ybWFsaXplUG9zdGFsQ29kZShwb3N0YWxDb2RlKTsKICBpZiAoIWNpdHlOb3JtIHx8ICFwb3N0YWxDb2RlTm9ybSkgcmV0dXJuIG51bGw7CiAgY29uc3Qgcm93cyA9IGdldEFsbG93ZWRDaG9pY2VzKHN0b3JlSWQpOwogIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpewogICAgaWYgKHJvdy5jaXR5Tm9ybSA9PT0gY2l0eU5vcm0gJiYgcm93LnBvc3RhbENvZGVOb3JtID09PSBwb3N0YWxDb2RlTm9ybSkgcmV0dXJuIHJvdzsKICB9CiAgcmV0dXJuIG51bGw7Cn0KCmV4cG9ydCBmdW5jdGlvbiBidWlsZEFsbG93ZWRDaG9pY2VWYWx1ZShzdG9yZUlkLCBjaXR5LCBwb3N0YWxDb2RlKXsKICBjb25zdCByb3cgPSBmaW5kRXhhY3RBbGxvd2VkQ2hvaWNlKHN0b3JlSWQsIGNpdHksIHBvc3RhbENvZGUpOwogIHJldHVybiByb3cgPyBTdHJpbmcocm93LmNob2ljZVZhbHVlIHx8ICIiKSA6ICIiOwp9CgpleHBvcnQgZnVuY3Rpb24gaXNBbGxvd2VkQ2hvaWNlKHN0b3JlSWQsIGNpdHksIHBvc3RhbENvZGUpewogIHJldHVybiAhIWZpbmRFeGFjdEFsbG93ZWRDaG9pY2Uoc3RvcmVJZCwgY2l0eSwgcG9zdGFsQ29kZSk7Cn0KCmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0Q2hvaWNlKHN0b3JlSWQpewogIGNvbnN0IHJvd3MgPSBnZXRBbGxvd2VkQ2hvaWNlcyhzdG9yZUlkKTsKICByZXR1cm4gcm93cy5sZW5ndGggPiAwID8gcm93c1swXSA6IG51bGw7Cn0KCmV4cG9ydCBmdW5jdGlvbiBidWlsZERlZmF1bHRDaG9pY2VWYWx1ZShzdG9yZUlkKXsKICBjb25zdCByb3cgPSBnZXREZWZhdWx0Q2hvaWNlKHN0b3JlSWQpOwogIHJldHVybiByb3cgPyBTdHJpbmcocm93LmNob2ljZVZhbHVlIHx8ICIiKSA6ICIiOwp9"
            }
        },
        {
            "path": "caisse-aqp/public/assets/js/app-js/address/deliveryCityStateSync.js",
            "kind": "file",
            "before": {
                "exists": true,
                "kind": "file",
                "size": 3632,
                "sha1": "fa2c58245ce8251f3909fea816ae5b516b93ce15",
                "content_b64": "LyogZG9jLXByb2plY3QgfCBjYWlzc2UtYXFwL3B1YmxpYy9hc3NldHMvanMvYXBwLWpzL2FkZHJlc3MvZGVsaXZlcnlDaXR5U3RhdGVTeW5jLmpzIHwgUmVzeW5jaHJvbmlzZSBjw7R0w6kgZnJvbnQgbGVzIHPDqWxlY3RldXJzIGNvbXBvc2l0ZXMgY29kZSBwb3N0YWwgLyB2aWxsZSDDoCBwYXJ0aXIgZGVzIHZhbGV1cnMgZMOpasOgIGNvbm51ZXMgZXQvb3UgcGVyc2lzdMOpZXMgZGFucyBsZSBzdGF0ZSBjbGllbnQgZXQgbOKAmWFkcmVzc2UgcHJvdmlzb2lyZSBkZSBjb21tYW5kZSwgYWZpbiBxdWUgbOKAmWFjdGl2YXRpb24gdGFyZGl2ZSBkdSBtb2RlIGxpdnJhaXNvbiBwdWlzc2UgcmV0cm91dmVyIGF1dG9tYXRpcXVlbWVudCB1bmUgb3B0aW9uIGF1dG9yaXPDqWUgZHUgUERWIHNhbnMgZMOpcGVuZHJlIGTigJl1biBhbmNpZW4gw6l0YXQgZHUgRE9NLiB8IEV4cG9zZTogc3luY0NsaWVudERlbGl2ZXJ5Q2l0eVNlbGVjdGlvbiwgc3luY1RlbXBvcmFyeURlbGl2ZXJ5Q2l0eVNlbGVjdGlvbiwgc3luY0RlbGl2ZXJ5QWRkcmVzc1NlbGVjdGlvbnMgfCBEw6lwZW5kIGRlOiAuL2RlbGl2ZXJ5Q2l0eUNob2ljZXMuanM/dHM9MjAyNjA0MDUtMSB8IEltcGFjdGU6IMOpdGF0IGZyb250ZW5kIGNsaWVudCwgw6l0YXQgYWRyZXNzZSB0ZW1wb3JhaXJlIGRlIGNvbW1hbmRlLCBwcsOpLXPDqWxlY3Rpb24gVUkgZHUgY291cGxlIHZpbGxlL2NvZGUgcG9zdGFsIGxvcnMgZGVzIHJlcmVuZGVycyB8IFRhYmxlczogYXVjdW5lICovCgppbXBvcnQgeyBidWlsZEFsbG93ZWRDaG9pY2VWYWx1ZSBhcyBidWlsZEFsbG93ZWREZWxpdmVyeUNpdHlDaG9pY2VWYWx1ZSB9IGZyb20gIi4vZGVsaXZlcnlDaXR5Q2hvaWNlcy5qcz90cz0yMDI2MDQwNS0xIjsKCmZ1bmN0aW9uIHJlYWROb25FbXB0eShzb3VyY2UsIGtleXMpewogIGNvbnN0IHNyYyA9IChzb3VyY2UgJiYgdHlwZW9mIHNvdXJjZSA9PT0gIm9iamVjdCIpID8gc291cmNlIDoge307CiAgY29uc3QgbGlzdCA9IEFycmF5LmlzQXJyYXkoa2V5cykgPyBrZXlzIDogW107CiAgZm9yIChjb25zdCBrZXkgb2YgbGlzdCl7CiAgICBjb25zdCB2YWx1ZSA9IFN0cmluZyhzcmM/LltrZXldID8/ICIiKS50cmltKCk7CiAgICBpZiAodmFsdWUpIHJldHVybiB2YWx1ZTsKICB9CiAgcmV0dXJuICIiOwp9CgpmdW5jdGlvbiBzaG91bGRTeW5jKHsgc3RhdGUsIHdoZW5MaXZyYWlzb25Pbmx5IH0gPSB7fSl7CiAgaWYgKCFzdGF0ZSB8fCB0eXBlb2Ygc3RhdGUgIT09ICJvYmplY3QiKSByZXR1cm4gZmFsc2U7CiAgaWYgKCF3aGVuTGl2cmFpc29uT25seSkgcmV0dXJuIHRydWU7CiAgcmV0dXJuICEhc3RhdGUubGl2cmFpc29uOwp9CgpleHBvcnQgZnVuY3Rpb24gc3luY0NsaWVudERlbGl2ZXJ5Q2l0eVNlbGVjdGlvbih7IHN0YXRlLCBzdG9yZUlkLCB3aGVuTGl2cmFpc29uT25seSA9IGZhbHNlIH0gPSB7fSl7CiAgaWYgKCFzaG91bGRTeW5jKHsgc3RhdGUsIHdoZW5MaXZyYWlzb25Pbmx5IH0pKSByZXR1cm4gZmFsc2U7CiAgaWYgKCFzdGF0ZS5jbGllbnQgfHwgdHlwZW9mIHN0YXRlLmNsaWVudCAhPT0gIm9iamVjdCIpIHJldHVybiBmYWxzZTsKCiAgY29uc3QgY2xpZW50ID0gc3RhdGUuY2xpZW50OwogIGNvbnN0IGVmZmVjdGl2ZVBvc3RhbCA9IHJlYWROb25FbXB0eShjbGllbnQsIFsiY29kZVBvc3RhbCIsICJjb2RlX3Bvc3RhbCIsICJkZWxpdmVyeUNpdHlQZXJzaXN0ZWRDb2RlUG9zdGFsIl0pOwogIGNvbnN0IGVmZmVjdGl2ZUNpdHkgPSByZWFkTm9uRW1wdHkoY2xpZW50LCBbInZpbGxlIiwgImNpdHkiLCAiZGVsaXZlcnlDaXR5UGVyc2lzdGVkVmlsbGUiXSk7CiAgY29uc3QgbmV4dENob2ljZVZhbHVlID0gYnVpbGRBbGxvd2VkRGVsaXZlcnlDaXR5Q2hvaWNlVmFsdWUoc3RvcmVJZCwgZWZmZWN0aXZlQ2l0eSwgZWZmZWN0aXZlUG9zdGFsKTsKICBpZiAoIW5leHRDaG9pY2VWYWx1ZSkgcmV0dXJuIGZhbHNlOwoKICBjbGllbnQuY29kZVBvc3RhbCA9IGVmZmVjdGl2ZVBvc3RhbDsKICBjbGllbnQudmlsbGUgPSBlZmZlY3RpdmVDaXR5OwogIGNsaWVudC5kZWxpdmVyeUNpdHlQZXJzaXN0ZWRDb2RlUG9zdGFsID0gcmVhZE5vbkVtcHR5KGNsaWVudCwgWyJkZWxpdmVyeUNpdHlQZXJzaXN0ZWRDb2RlUG9zdGFsIl0pIHx8IGVmZmVjdGl2ZVBvc3RhbDsKICBjbGllbnQuZGVsaXZlcnlDaXR5UGVyc2lzdGVkVmlsbGUgPSByZWFkTm9uRW1wdHkoY2xpZW50LCBbImRlbGl2ZXJ5Q2l0eVBlcnNpc3RlZFZpbGxlIl0pIHx8IGVmZmVjdGl2ZUNpdHk7CiAgY2xpZW50LmRlbGl2ZXJ5Q2l0eUNob2ljZSA9IG5leHRDaG9pY2VWYWx1ZTsKICByZXR1cm4gdHJ1ZTsKfQoKZXhwb3J0IGZ1bmN0aW9uIHN5bmNUZW1wb3JhcnlEZWxpdmVyeUNpdHlTZWxlY3Rpb24oeyBzdGF0ZSwgc3RvcmVJZCwgd2hlbkxpdnJhaXNvbk9ubHkgPSBmYWxzZSB9ID0ge30pewogIGlmICghc2hvdWxkU3luYyh7IHN0YXRlLCB3aGVuTGl2cmFpc29uT25seSB9KSkgcmV0dXJuIGZhbHNlOwogIGlmICghc3RhdGUudGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzIHx8IHR5cGVvZiBzdGF0ZS50ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MgIT09ICJvYmplY3QiKSByZXR1cm4gZmFsc2U7CgogIGNvbnN0IHRlbXAgPSBzdGF0ZS50ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3M7CiAgY29uc3QgZWZmZWN0aXZlUG9zdGFsID0gcmVhZE5vbkVtcHR5KHRlbXAsIFsiY29kZVBvc3RhbCIsICJjb2RlX3Bvc3RhbCIsICJwZXJzaXN0ZWRDb2RlUG9zdGFsIl0pOwogIGNvbnN0IGVmZmVjdGl2ZUNpdHkgPSByZWFkTm9uRW1wdHkodGVtcCwgWyJ2aWxsZSIsICJjaXR5IiwgInBlcnNpc3RlZFZpbGxlIl0pOwogIGNvbnN0IG5leHRDaG9pY2VWYWx1ZSA9IGJ1aWxkQWxsb3dlZERlbGl2ZXJ5Q2l0eUNob2ljZVZhbHVlKHN0b3JlSWQsIGVmZmVjdGl2ZUNpdHksIGVmZmVjdGl2ZVBvc3RhbCk7CiAgaWYgKCFuZXh0Q2hvaWNlVmFsdWUpIHJldHVybiBmYWxzZTsKCiAgdGVtcC5jb2RlUG9zdGFsID0gZWZmZWN0aXZlUG9zdGFsOwogIHRlbXAudmlsbGUgPSBlZmZlY3RpdmVDaXR5OwogIHRlbXAucGVyc2lzdGVkQ29kZVBvc3RhbCA9IHJlYWROb25FbXB0eSh0ZW1wLCBbInBlcnNpc3RlZENvZGVQb3N0YWwiXSkgfHwgZWZmZWN0aXZlUG9zdGFsOwogIHRlbXAucGVyc2lzdGVkVmlsbGUgPSByZWFkTm9uRW1wdHkodGVtcCwgWyJwZXJzaXN0ZWRWaWxsZSJdKSB8fCBlZmZlY3RpdmVDaXR5OwogIHRlbXAudGVtcG9yYXJ5RGVsaXZlcnlDaXR5Q2hvaWNlID0gbmV4dENob2ljZVZhbHVlOwogIHJldHVybiB0cnVlOwp9CgpleHBvcnQgZnVuY3Rpb24gc3luY0RlbGl2ZXJ5QWRkcmVzc1NlbGVjdGlvbnMoeyBzdGF0ZSwgc3RvcmVJZCwgd2hlbkxpdnJhaXNvbk9ubHkgPSBmYWxzZSB9ID0ge30pewogIGNvbnN0IGNsaWVudFN5bmNlZCA9IHN5bmNDbGllbnREZWxpdmVyeUNpdHlTZWxlY3Rpb24oeyBzdGF0ZSwgc3RvcmVJZCwgd2hlbkxpdnJhaXNvbk9ubHkgfSk7CiAgY29uc3QgdGVtcG9yYXJ5U3luY2VkID0gc3luY1RlbXBvcmFyeURlbGl2ZXJ5Q2l0eVNlbGVjdGlvbih7IHN0YXRlLCBzdG9yZUlkLCB3aGVuTGl2cmFpc29uT25seSB9KTsKICByZXR1cm4gewogICAgY2xpZW50U3luY2VkLAogICAgdGVtcG9yYXJ5U3luY2VkLAogIH07Cn0="
            },
            "after": {
                "exists": true,
                "kind": "file",
                "size": 5431,
                "sha1": "ca02687b82dd86c493abcf2a77e35ef68e4002a8",
                "content_b64": "LyogZG9jLXByb2plY3QgfCBjYWlzc2UtYXFwL3B1YmxpYy9hc3NldHMvanMvYXBwLWpzL2FkZHJlc3MvZGVsaXZlcnlDaXR5U3RhdGVTeW5jLmpzIHwgUmVzeW5jaHJvbmlzZSBjw7R0w6kgZnJvbnQgbGVzIHPDqWxlY3RldXJzIGNvbXBvc2l0ZXMgY29kZSBwb3N0YWwgLyB2aWxsZSDDoCBwYXJ0aXIgZGVzIHZhbGV1cnMgZMOpasOgIGNvbm51ZXMgZXQvb3UgcGVyc2lzdMOpZXMgZGFucyBsZSBzdGF0ZSBjbGllbnQgZXQgbOKAmWFkcmVzc2UgcHJvdmlzb2lyZSBkZSBjb21tYW5kZSwgYWZpbiBxdWUgbOKAmWFjdGl2YXRpb24gdGFyZGl2ZSBkdSBtb2RlIGxpdnJhaXNvbiBwdWlzc2UgcmV0cm91dmVyIGF1dG9tYXRpcXVlbWVudCB1bmUgb3B0aW9uIGF1dG9yaXPDqWUgZHUgUERWIHNhbnMgZMOpcGVuZHJlIGTigJl1biBhbmNpZW4gw6l0YXQgZHUgRE9NLCBldCBhcHBsaXF1ZSBkw6lzb3JtYWlzIGxlIGNob2l4IHBhciBkw6lmYXV0IGR1IG1hZ2FzaW4gdW5pcXVlbWVudCBsb3JzcXXigJlhdWN1biBjb3VwbGUgdmlsbGUgLyBjb2RlIHBvc3RhbCBu4oCZZXN0IGTDqWrDoCByZW5zZWlnbsOpLiB8IEV4cG9zZTogc3luY0NsaWVudERlbGl2ZXJ5Q2l0eVNlbGVjdGlvbiwgc3luY1RlbXBvcmFyeURlbGl2ZXJ5Q2l0eVNlbGVjdGlvbiwgc3luY0RlbGl2ZXJ5QWRkcmVzc1NlbGVjdGlvbnMgfCBEw6lwZW5kIGRlOiAuL2RlbGl2ZXJ5Q2l0eUNob2ljZXMuanM/dHM9MjAyNjA0MjItMSB8IEltcGFjdGU6IMOpdGF0IGZyb250ZW5kIGNsaWVudCwgw6l0YXQgYWRyZXNzZSB0ZW1wb3JhaXJlIGRlIGNvbW1hbmRlLCBwcsOpLXPDqWxlY3Rpb24gVUkgZHUgY291cGxlIHZpbGxlL2NvZGUgcG9zdGFsIGxvcnMgZGVzIHJlcmVuZGVycywgdmFsZXVyIHBhciBkw6lmYXV0IGRlIGxpdnJhaXNvbiBwYXIgUERWIHwgVGFibGVzOiBhdWN1bmUgKi8KCmltcG9ydCB7CiAgYnVpbGRBbGxvd2VkQ2hvaWNlVmFsdWUgYXMgYnVpbGRBbGxvd2VkRGVsaXZlcnlDaXR5Q2hvaWNlVmFsdWUsCiAgZ2V0RGVmYXVsdENob2ljZSBhcyBnZXREZWZhdWx0RGVsaXZlcnlDaXR5Q2hvaWNlLAp9IGZyb20gIi4vZGVsaXZlcnlDaXR5Q2hvaWNlcy5qcz90cz0yMDI2MDQyMi0xIjsKCmZ1bmN0aW9uIHJlYWROb25FbXB0eShzb3VyY2UsIGtleXMpewogIGNvbnN0IHNyYyA9IChzb3VyY2UgJiYgdHlwZW9mIHNvdXJjZSA9PT0gIm9iamVjdCIpID8gc291cmNlIDoge307CiAgY29uc3QgbGlzdCA9IEFycmF5LmlzQXJyYXkoa2V5cykgPyBrZXlzIDogW107CiAgZm9yIChjb25zdCBrZXkgb2YgbGlzdCl7CiAgICBjb25zdCB2YWx1ZSA9IFN0cmluZyhzcmM/LltrZXldID8/ICIiKS50cmltKCk7CiAgICBpZiAodmFsdWUpIHJldHVybiB2YWx1ZTsKICB9CiAgcmV0dXJuICIiOwp9CgpmdW5jdGlvbiBzaG91bGRTeW5jKHsgc3RhdGUsIHdoZW5MaXZyYWlzb25Pbmx5IH0gPSB7fSl7CiAgaWYgKCFzdGF0ZSB8fCB0eXBlb2Ygc3RhdGUgIT09ICJvYmplY3QiKSByZXR1cm4gZmFsc2U7CiAgaWYgKCF3aGVuTGl2cmFpc29uT25seSkgcmV0dXJuIHRydWU7CiAgcmV0dXJuICEhc3RhdGUubGl2cmFpc29uOwp9CgpleHBvcnQgZnVuY3Rpb24gc3luY0NsaWVudERlbGl2ZXJ5Q2l0eVNlbGVjdGlvbih7IHN0YXRlLCBzdG9yZUlkLCB3aGVuTGl2cmFpc29uT25seSA9IGZhbHNlIH0gPSB7fSl7CiAgaWYgKCFzaG91bGRTeW5jKHsgc3RhdGUsIHdoZW5MaXZyYWlzb25Pbmx5IH0pKSByZXR1cm4gZmFsc2U7CiAgaWYgKCFzdGF0ZS5jbGllbnQgfHwgdHlwZW9mIHN0YXRlLmNsaWVudCAhPT0gIm9iamVjdCIpIHJldHVybiBmYWxzZTsKCiAgY29uc3QgY2xpZW50ID0gc3RhdGUuY2xpZW50OwogIGNvbnN0IGVmZmVjdGl2ZVBvc3RhbCA9IHJlYWROb25FbXB0eShjbGllbnQsIFsiY29kZVBvc3RhbCIsICJjb2RlX3Bvc3RhbCIsICJkZWxpdmVyeUNpdHlQZXJzaXN0ZWRDb2RlUG9zdGFsIl0pOwogIGNvbnN0IGVmZmVjdGl2ZUNpdHkgPSByZWFkTm9uRW1wdHkoY2xpZW50LCBbInZpbGxlIiwgImNpdHkiLCAiZGVsaXZlcnlDaXR5UGVyc2lzdGVkVmlsbGUiXSk7CiAgY29uc3QgbmV4dENob2ljZVZhbHVlID0gYnVpbGRBbGxvd2VkRGVsaXZlcnlDaXR5Q2hvaWNlVmFsdWUoc3RvcmVJZCwgZWZmZWN0aXZlQ2l0eSwgZWZmZWN0aXZlUG9zdGFsKTsKICBpZiAobmV4dENob2ljZVZhbHVlKXsKICAgIGNsaWVudC5jb2RlUG9zdGFsID0gZWZmZWN0aXZlUG9zdGFsOwogICAgY2xpZW50LnZpbGxlID0gZWZmZWN0aXZlQ2l0eTsKICAgIGNsaWVudC5kZWxpdmVyeUNpdHlQZXJzaXN0ZWRDb2RlUG9zdGFsID0gcmVhZE5vbkVtcHR5KGNsaWVudCwgWyJkZWxpdmVyeUNpdHlQZXJzaXN0ZWRDb2RlUG9zdGFsIl0pIHx8IGVmZmVjdGl2ZVBvc3RhbDsKICAgIGNsaWVudC5kZWxpdmVyeUNpdHlQZXJzaXN0ZWRWaWxsZSA9IHJlYWROb25FbXB0eShjbGllbnQsIFsiZGVsaXZlcnlDaXR5UGVyc2lzdGVkVmlsbGUiXSkgfHwgZWZmZWN0aXZlQ2l0eTsKICAgIGNsaWVudC5kZWxpdmVyeUNpdHlDaG9pY2UgPSBuZXh0Q2hvaWNlVmFsdWU7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGlmIChlZmZlY3RpdmVQb3N0YWwgfHwgZWZmZWN0aXZlQ2l0eSkgewogICAgY2xpZW50LmNvZGVQb3N0YWwgPSBlZmZlY3RpdmVQb3N0YWw7CiAgICBjbGllbnQudmlsbGUgPSBlZmZlY3RpdmVDaXR5OwogICAgY2xpZW50LmRlbGl2ZXJ5Q2l0eVBlcnNpc3RlZENvZGVQb3N0YWwgPSByZWFkTm9uRW1wdHkoY2xpZW50LCBbImRlbGl2ZXJ5Q2l0eVBlcnNpc3RlZENvZGVQb3N0YWwiXSkgfHwgZWZmZWN0aXZlUG9zdGFsOwogICAgY2xpZW50LmRlbGl2ZXJ5Q2l0eVBlcnNpc3RlZFZpbGxlID0gcmVhZE5vbkVtcHR5KGNsaWVudCwgWyJkZWxpdmVyeUNpdHlQZXJzaXN0ZWRWaWxsZSJdKSB8fCBlZmZlY3RpdmVDaXR5OwogICAgY2xpZW50LmRlbGl2ZXJ5Q2l0eUNob2ljZSA9ICIiOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgY29uc3QgZGVmYXVsdENob2ljZSA9IGdldERlZmF1bHREZWxpdmVyeUNpdHlDaG9pY2Uoc3RvcmVJZCk7CiAgaWYgKCFkZWZhdWx0Q2hvaWNlKSByZXR1cm4gZmFsc2U7CgogIGNsaWVudC5jb2RlUG9zdGFsID0gU3RyaW5nKGRlZmF1bHRDaG9pY2UucG9zdGFsQ29kZSB8fCAiIik7CiAgY2xpZW50LnZpbGxlID0gU3RyaW5nKGRlZmF1bHRDaG9pY2UuY2l0eSB8fCAiIik7CiAgY2xpZW50LmRlbGl2ZXJ5Q2l0eVBlcnNpc3RlZENvZGVQb3N0YWwgPSBjbGllbnQuY29kZVBvc3RhbDsKICBjbGllbnQuZGVsaXZlcnlDaXR5UGVyc2lzdGVkVmlsbGUgPSBjbGllbnQudmlsbGU7CiAgY2xpZW50LmRlbGl2ZXJ5Q2l0eUNob2ljZSA9IFN0cmluZyhkZWZhdWx0Q2hvaWNlLmNob2ljZVZhbHVlIHx8ICIiKTsKICByZXR1cm4gdHJ1ZTsKfQoKZXhwb3J0IGZ1bmN0aW9uIHN5bmNUZW1wb3JhcnlEZWxpdmVyeUNpdHlTZWxlY3Rpb24oeyBzdGF0ZSwgc3RvcmVJZCwgd2hlbkxpdnJhaXNvbk9ubHkgPSBmYWxzZSB9ID0ge30pewogIGlmICghc2hvdWxkU3luYyh7IHN0YXRlLCB3aGVuTGl2cmFpc29uT25seSB9KSkgcmV0dXJuIGZhbHNlOwogIGlmICghc3RhdGUudGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzIHx8IHR5cGVvZiBzdGF0ZS50ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MgIT09ICJvYmplY3QiKSByZXR1cm4gZmFsc2U7CgogIGNvbnN0IHRlbXAgPSBzdGF0ZS50ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3M7CiAgY29uc3QgZWZmZWN0aXZlUG9zdGFsID0gcmVhZE5vbkVtcHR5KHRlbXAsIFsiY29kZVBvc3RhbCIsICJjb2RlX3Bvc3RhbCIsICJwZXJzaXN0ZWRDb2RlUG9zdGFsIl0pOwogIGNvbnN0IGVmZmVjdGl2ZUNpdHkgPSByZWFkTm9uRW1wdHkodGVtcCwgWyJ2aWxsZSIsICJjaXR5IiwgInBlcnNpc3RlZFZpbGxlIl0pOwogIGNvbnN0IG5leHRDaG9pY2VWYWx1ZSA9IGJ1aWxkQWxsb3dlZERlbGl2ZXJ5Q2l0eUNob2ljZVZhbHVlKHN0b3JlSWQsIGVmZmVjdGl2ZUNpdHksIGVmZmVjdGl2ZVBvc3RhbCk7CiAgaWYgKG5leHRDaG9pY2VWYWx1ZSl7CiAgICB0ZW1wLmNvZGVQb3N0YWwgPSBlZmZlY3RpdmVQb3N0YWw7CiAgICB0ZW1wLnZpbGxlID0gZWZmZWN0aXZlQ2l0eTsKICAgIHRlbXAucGVyc2lzdGVkQ29kZVBvc3RhbCA9IHJlYWROb25FbXB0eSh0ZW1wLCBbInBlcnNpc3RlZENvZGVQb3N0YWwiXSkgfHwgZWZmZWN0aXZlUG9zdGFsOwogICAgdGVtcC5wZXJzaXN0ZWRWaWxsZSA9IHJlYWROb25FbXB0eSh0ZW1wLCBbInBlcnNpc3RlZFZpbGxlIl0pIHx8IGVmZmVjdGl2ZUNpdHk7CiAgICB0ZW1wLnRlbXBvcmFyeURlbGl2ZXJ5Q2l0eUNob2ljZSA9IG5leHRDaG9pY2VWYWx1ZTsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgaWYgKGVmZmVjdGl2ZVBvc3RhbCB8fCBlZmZlY3RpdmVDaXR5KSB7CiAgICB0ZW1wLmNvZGVQb3N0YWwgPSBlZmZlY3RpdmVQb3N0YWw7CiAgICB0ZW1wLnZpbGxlID0gZWZmZWN0aXZlQ2l0eTsKICAgIHRlbXAucGVyc2lzdGVkQ29kZVBvc3RhbCA9IHJlYWROb25FbXB0eSh0ZW1wLCBbInBlcnNpc3RlZENvZGVQb3N0YWwiXSkgfHwgZWZmZWN0aXZlUG9zdGFsOwogICAgdGVtcC5wZXJzaXN0ZWRWaWxsZSA9IHJlYWROb25FbXB0eSh0ZW1wLCBbInBlcnNpc3RlZFZpbGxlIl0pIHx8IGVmZmVjdGl2ZUNpdHk7CiAgICB0ZW1wLnRlbXBvcmFyeURlbGl2ZXJ5Q2l0eUNob2ljZSA9ICIiOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgY29uc3QgZGVmYXVsdENob2ljZSA9IGdldERlZmF1bHREZWxpdmVyeUNpdHlDaG9pY2Uoc3RvcmVJZCk7CiAgaWYgKCFkZWZhdWx0Q2hvaWNlKSByZXR1cm4gZmFsc2U7CgogIHRlbXAuY29kZVBvc3RhbCA9IFN0cmluZyhkZWZhdWx0Q2hvaWNlLnBvc3RhbENvZGUgfHwgIiIpOwogIHRlbXAudmlsbGUgPSBTdHJpbmcoZGVmYXVsdENob2ljZS5jaXR5IHx8ICIiKTsKICB0ZW1wLnBlcnNpc3RlZENvZGVQb3N0YWwgPSB0ZW1wLmNvZGVQb3N0YWw7CiAgdGVtcC5wZXJzaXN0ZWRWaWxsZSA9IHRlbXAudmlsbGU7CiAgdGVtcC50ZW1wb3JhcnlEZWxpdmVyeUNpdHlDaG9pY2UgPSBTdHJpbmcoZGVmYXVsdENob2ljZS5jaG9pY2VWYWx1ZSB8fCAiIik7CiAgcmV0dXJuIHRydWU7Cn0KCmV4cG9ydCBmdW5jdGlvbiBzeW5jRGVsaXZlcnlBZGRyZXNzU2VsZWN0aW9ucyh7IHN0YXRlLCBzdG9yZUlkLCB3aGVuTGl2cmFpc29uT25seSA9IGZhbHNlIH0gPSB7fSl7CiAgY29uc3QgY2xpZW50U3luY2VkID0gc3luY0NsaWVudERlbGl2ZXJ5Q2l0eVNlbGVjdGlvbih7IHN0YXRlLCBzdG9yZUlkLCB3aGVuTGl2cmFpc29uT25seSB9KTsKICBjb25zdCB0ZW1wb3JhcnlTeW5jZWQgPSBzeW5jVGVtcG9yYXJ5RGVsaXZlcnlDaXR5U2VsZWN0aW9uKHsgc3RhdGUsIHN0b3JlSWQsIHdoZW5MaXZyYWlzb25Pbmx5IH0pOwogIHJldHVybiB7CiAgICBjbGllbnRTeW5jZWQsCiAgICB0ZW1wb3JhcnlTeW5jZWQsCiAgfTsKfQ=="
            }
        },
        {
            "path": "caisse-aqp/public/assets/js/app-js/bindings/saveOrderValidation.js",
            "kind": "file",
            "before": {
                "exists": true,
                "kind": "file",
                "size": 30699,
                "sha1": "0f2945b4d1eb19be040f53e694030b03b46a5099",
                "content_b64": "LyogZ2xvYmFsIGRvY3VtZW50LCB3aW5kb3cgKi8KLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqLwovKiBkb2MtcHJvamVjdCB8IGNhaXNzZS1hcXAvcHVibGljL2Fzc2V0cy9qcy9hcHAtanMvYmluZGluZ3Mvc2F2ZU9yZGVyVmFsaWRhdGlvbi5qcyB8IFZhbGlkZSBldCBlbnJlZ2lzdHJlIHVuZSBjb21tYW5kZSwgaW50ZXJjZXB0ZSBsZXMgc2F1dmVnYXJkZXMgc3VyIHVuIGpvdXIgZGlmZsOpcmVudCBk4oCZYXVqb3VyZOKAmWh1aSB2aWEgdW5lIG1vZGFsZSBkw6lkacOpZSwgZ8OocmUgbGEgY3LDqWF0aW9uIG91IGxhIG1pc2Ugw6Agam91ciwgbGVzIGNvbnRyw7RsZXMgcHLDqWFsYWJsZXMsIGxhIHN5bmNocm9uaXNhdGlvbiBkZXMgZG9ubsOpZXMgY2xpZW50L2FydGljbGVzLCBsYSBwZXJzaXN0YW5jZSBkZSBs4oCZYWRyZXNzZSBkZSBsaXZyYWlzb24gcHJvdmlzb2lyZSBhdSBuaXZlYXUgY29tbWFuZGUsIGxlIGNvbnRyw7RsZSBmcm9udGVuZCBkZXMgY291cGxlcyBjb2RlIHBvc3RhbCAvIHZpbGxlIGF1dG9yaXPDqXMgc2Vsb24gbGUgUERWLCBldCBtYXNxdWUgZMOpc29ybWFpcyBs4oCZYWN0aW9uIHJhcGlkZSDigJxEZW1haW7igJ0gcXVhbmQgbGEgZGF0ZSBzw6lsZWN0aW9ubsOpZSBlc3QgZMOpasOgIGRlbWFpbiBlbiBmdXNlYXUgRXVyb3BlL1BhcmlzLiB8IEV4cG9zZTogYmluZFNhdmVPcmRlclZhbGlkYXRpb24gfCBEw6lwZW5kIGRlOiAuLi8uLi9wb3Mvb3JkZXJTdW1tYXJ5LmpzLCAuLi8uLi9zZXJ2aWNlcy9hcGkvc2F2ZU9yZGVyQXBpLmpzLCAuLi8uLi9zZXJ2aWNlcy9hcGkvdXBkYXRlT3JkZXJBcGkuanMsIC4uLy4uL3VpL3RvYXN0LmpzLCAuLi8uLi91aS9kb20uanM/dHM9MjAyNjA0MDYtMSwgLi4vbG9hZGVycy9vcmRlcnNMb2FkZXIuanMsIC4uL2xvYWRlcnMvc2xvdEJhZGdlc0xvYWRlci5qcywgLi4vc3RhdGUvYWZ0ZXJPcmRlclNhdmVkU3VjY2Vzcy5qcywgLi4vc3RhdGUvcmVzZXQuanMsIC4uL2xvYWRlcnMvZmlyc3ROYW1lc0xvYWRlci5qcywgLi4vdmFsaWRhdGlvbnMvcHJlVmFsaWRhdGVDaGVja3MuanMsIC4uL3RpbWUvYWN0aXZlVGltZS5qcywgLi4vZGF0ZS9zZWxlY3RlZERhdGUuanMsIC4uLy4uL3V0aWxzL2RhdGUvcGFyaXMuanM/dHM9MjAyNjA0MDYtMSwgLi4vcGR2LmpzLCAuLi9hZGRyZXNzL2RlbGl2ZXJ5Q2l0eUNob2ljZXMuanMgfCBJbXBhY3RlOiDDqXRhdCBkZSBzZXNzaW9uIG3DqXRpZXIsIHBhbmllciwgY29tbWFuZGVzLCBVSSB0b2FzdC9tb2RhbGVzLCBjaGFuZ2VtZW50IGRlIGRhdGUgYXZhbnQgc2F1dmVnYXJkZSwgY2FjaGUgZGVzIHByw6lub21zLCBlbnZvaSBBUEksIHZhbGlkYXRpb24gZnJvbnRlbmQgZGVzIGNvbW11bmVzIGF1dG9yaXPDqWVzLCBwZXJ0aW5lbmNlIFVYIGRlcyByYWNjb3VyY2lzIGRlIGRhdGUgfCBUYWJsZXM6IHN0ZF9jbGllbnRzLCBjb21tYW5kZXMsIGNvbW1hbmRlc19pdGVtcywgcGl6emFzLCBpbmdyZWRpZW50cywgb3B0aW9ucywgcG9zX3RlbXBfYWRyZXNzZXMgKi8KCmltcG9ydCB7IGNvbXB1dGVPcmRlclN1bW1hcnkgfSBmcm9tICIuLi8uLi9wb3Mvb3JkZXJTdW1tYXJ5LmpzIjsKaW1wb3J0IHsgc2F2ZU9yZGVyIH0gZnJvbSAiLi4vLi4vc2VydmljZXMvYXBpL3NhdmVPcmRlckFwaS5qcyI7CmltcG9ydCB7IHVwZGF0ZU9yZGVyIH0gZnJvbSAiLi4vLi4vc2VydmljZXMvYXBpL3VwZGF0ZU9yZGVyQXBpLmpzIjsKaW1wb3J0IHsgc2hvd1RvYXN0IH0gZnJvbSAiLi4vLi4vdWkvdG9hc3QuanMiOwppbXBvcnQgeyBvcmRlckRhdGVDb25maXJtTW9kYWwgfSBmcm9tICIuLi8uLi91aS9kb20uanMiOwppbXBvcnQgeyBsb2FkRGFpbHlPcmRlclRhYnMgfSBmcm9tICIuLi9sb2FkZXJzL29yZGVyc0xvYWRlci5qcyI7CmltcG9ydCB7IGxvYWRTbG90QmFkZ2VzIH0gZnJvbSAiLi4vbG9hZGVycy9zbG90QmFkZ2VzTG9hZGVyLmpzIjsKaW1wb3J0IHsgYWZ0ZXJPcmRlclNhdmVkU3VjY2VzcyB9IGZyb20gIi4uL3N0YXRlL2FmdGVyT3JkZXJTYXZlZFN1Y2Nlc3MuanMiOwppbXBvcnQgeyBleGl0TG9hZGVkT3JkZXJFZGl0TW9kZUtlZXBEcmFmdCB9IGZyb20gIi4uL3N0YXRlL3Jlc2V0LmpzIjsKaW1wb3J0IHsgYWRkRmlyc3ROYW1lVG9DYWNoZSB9IGZyb20gIi4uL2xvYWRlcnMvZmlyc3ROYW1lc0xvYWRlci5qcyI7CmltcG9ydCB7IHJ1blByZVZhbGlkYXRlQ2hlY2tzIH0gZnJvbSAiLi4vdmFsaWRhdGlvbnMvcHJlVmFsaWRhdGVDaGVja3MuanMiOwppbXBvcnQgeyBzZXRBY3RpdmVUaW1lLCBjbGVhckFjdGl2ZVRpbWUgfSBmcm9tICIuLi90aW1lL2FjdGl2ZVRpbWUuanMiOwppbXBvcnQgeyBhcHBseVNlbGVjdGVkRGF0ZUlTTywgc2hpZnRJU09EYXRlIH0gZnJvbSAiLi4vZGF0ZS9zZWxlY3RlZERhdGUuanMiOwppbXBvcnQgeyBnZXRQYXJpc1RvZGF5SVNPLCBnZXRQYXJpc1RvbW9ycm93SVNPLCBmb3JtYXRJU09EYXRlU2hvcnROb1llYXJGUiB9IGZyb20gIi4uLy4uL3V0aWxzL2RhdGUvcGFyaXMuanM/dHM9MjAyNjA0MDYtMSI7CmltcG9ydCB7IHN0b3JlVG9TdWZmaXggfSBmcm9tICIuLi9wZHYuanMiOwppbXBvcnQgeyBmaW5kRXhhY3RBbGxvd2VkQ2hvaWNlIGFzIGZpbmRFeGFjdEFsbG93ZWREZWxpdmVyeUNpdHlDaG9pY2UgfSBmcm9tICIuLi9hZGRyZXNzL2RlbGl2ZXJ5Q2l0eUNob2ljZXMuanMiOwoKbGV0IF9fYm91bmQgPSBmYWxzZTsKCmZ1bmN0aW9uIGFzSW50KHYsIGZhbGxiYWNrID0gMCl7CiAgY29uc3QgbiA9IE51bWJlcih2KTsKICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKG4pID8gKG4gfCAwKSA6IGZhbGxiYWNrOwp9CgpmdW5jdGlvbiBib29sMDEodil7CiAgcmV0dXJuIHYgPyAxIDogMDsKfQoKZnVuY3Rpb24gY2xlYW5TdHIodiwgbWF4TGVuID0gbnVsbCl7CiAgbGV0IHMgPSBTdHJpbmcodiA/PyAiIikudHJpbSgpOwogIGlmICghcykgcmV0dXJuICIiOwogIGlmIChOdW1iZXIuaXNGaW5pdGUoTnVtYmVyKG1heExlbikpICYmIG1heExlbiA+IDAgJiYgcy5sZW5ndGggPiBtYXhMZW4pewogICAgcyA9IHMuc2xpY2UoMCwgbWF4TGVuKTsKICB9CiAgcmV0dXJuIHM7Cn0KCmZ1bmN0aW9uIG5vcm1hbGl6ZUZvbGRMb2NhbChzKXsKICBjb25zdCBzdHIgPSBTdHJpbmcocyA/PyAiIik7CiAgdHJ5ewogICAgcmV0dXJuIHN0cgogICAgICAudG9Mb3dlckNhc2UoKQogICAgICAubm9ybWFsaXplKCJORkQiKQogICAgICAucmVwbGFjZSgvW1x1MDMwMC1cdTAzNmZdL2csICIiKQogICAgICAucmVwbGFjZSgvXHMrL2csICIgIikKICAgICAgLnRyaW0oKQogICAgICAucmVwbGFjZSgvXlwrXHMqLywgIiIpOwogIH0gY2F0Y2ggKGUpewogICAgcmV0dXJuIHN0ci50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xzKy9nLCAiICIpLnRyaW0oKS5yZXBsYWNlKC9eXCtccyovLCAiIik7CiAgfQp9CgpmdW5jdGlvbiBwYXJzZURpc3BsYXlMaW5lTGFiZWxQcmljZSh0eHQpewogIGNvbnN0IHMgPSBTdHJpbmcodHh0ID8/ICIiKS50cmltKCk7CiAgaWYgKCFzKSByZXR1cm4gbnVsbDsKICAvLyBNYXRjaDogIkxhYmVsICgrMCw1MOKCrCkiIC8gIkxhYmVsICgtMS4wMOKCrCkiIC8gIkxhYmVsICgwLDUw4oKsKSIKICBjb25zdCBtID0gcy5tYXRjaCgvXiguKj8pXHMqXChccyooWystXT9cZCsoPzpbLixdXGR7MSwyfSk/KVxzKuKCrFxzKlwpXHMqJC91KTsKICBpZiAoIW0pewogICAgcmV0dXJuIHsgbGFiZWw6IHMsIHByaWNlOiBudWxsIH07CiAgfQogIGNvbnN0IGxhYmVsID0gU3RyaW5nKG1bMV0gPz8gIiIpLnRyaW0oKTsKICBjb25zdCBudW0gPSBTdHJpbmcobVsyXSA/PyAiIikudHJpbSgpLnJlcGxhY2UoIiwiLCAiLiIpOwogIGNvbnN0IHAgPSBOdW1iZXIobnVtKTsKICByZXR1cm4gewogICAgbGFiZWw6IGxhYmVsIHx8IHMsCiAgICBwcmljZTogTnVtYmVyLmlzRmluaXRlKHApID8gcCA6IG51bGwsCiAgfTsKfQoKZnVuY3Rpb24gYnVpbGREaXNwbGF5TGluZUluZm9NYXAobGluZXMpewogIGNvbnN0IGxpc3QgPSBBcnJheS5pc0FycmF5KGxpbmVzKSA/IGxpbmVzIDogW107CiAgY29uc3QgbWFwID0gbmV3IE1hcCgpOwogIGZvciAoY29uc3QgcmF3IG9mIGxpc3QpewogICAgY29uc3QgcGFyc2VkID0gcGFyc2VEaXNwbGF5TGluZUxhYmVsUHJpY2UocmF3KTsKICAgIGlmICghcGFyc2VkKSBjb250aW51ZTsKICAgIGNvbnN0IGxibCA9IFN0cmluZyhwYXJzZWQubGFiZWwgPz8gIiIpLnRyaW0oKTsKICAgIGlmICghbGJsKSBjb250aW51ZTsKICAgIGNvbnN0IGsgPSBub3JtYWxpemVGb2xkTG9jYWwobGJsKTsKICAgIGlmICghaykgY29udGludWU7CgogICAgY29uc3QgY3VyID0gbWFwLmdldChrKSB8fCBudWxsOwogICAgY29uc3QgbmV4dFByaWNlID0gKHBhcnNlZC5wcmljZSAhPSBudWxsICYmIE51bWJlci5pc0Zpbml0ZShwYXJzZWQucHJpY2UpKSA/IHBhcnNlZC5wcmljZSA6IG51bGw7CiAgICBpZiAoIWN1cil7CiAgICAgIG1hcC5zZXQoaywgeyBsYWJlbDogbGJsLCBwcmljZTogbmV4dFByaWNlIH0pOwogICAgfSBlbHNlIGlmIChjdXIucHJpY2UgPT0gbnVsbCAmJiBuZXh0UHJpY2UgIT0gbnVsbCl7CiAgICAgIC8vIFVwZ3JhZGUgd2l0aCBhIGtub3duIHByaWNlIGlmIHdlIHByZXZpb3VzbHkgb25seSBoYWQgYSBsYWJlbAogICAgICBtYXAuc2V0KGssIHsgbGFiZWw6IGN1ci5sYWJlbCB8fCBsYmwsIHByaWNlOiBuZXh0UHJpY2UgfSk7CiAgICB9CiAgfQogIHJldHVybiBtYXA7Cn0KCmZ1bmN0aW9uIGNsZWFuS2V5TGFiZWwoayl7CiAgcmV0dXJuIFN0cmluZyhrID8/ICIiKS50cmltKCkucmVwbGFjZSgvXm5hbWU6LywgIiIpLnJlcGxhY2UoL15pZDovLCAiIikudHJpbSgpLnJlcGxhY2UoL15cK1xzKi8sICIiKTsKfQoKZnVuY3Rpb24gbm9ybWFsaXplTW9kaWZzRm9yQ29tcGFyZShtb2RpZnMpewogIGNvbnN0IGxpc3QgPSBBcnJheS5pc0FycmF5KG1vZGlmcykgPyBtb2RpZnMgOiBbXTsKICBjb25zdCBub3JtID0gbGlzdC5tYXAoKG0pID0+ICh7CiAgICBub21fb3B0aW9uOiBTdHJpbmcobT8ubm9tX29wdGlvbiA/PyAiIikudHJpbSgpLAogICAgY2xhc3Nfb3B0aW9uOiBTdHJpbmcobT8uY2xhc3Nfb3B0aW9uID8/ICIiKS50cmltKCksCiAgICBkYXRhX3ByaWNlOiAoTnVtYmVyKG0/LmRhdGFfcHJpY2UgPz8gMCkgfHwgMCksCiAgfSkpLmZpbHRlcigobSkgPT4gbS5ub21fb3B0aW9uICE9PSAiIik7CiAgbm9ybS5zb3J0KChhLCBiKSA9PiB7CiAgICBjb25zdCBrYSA9IGAke2EuY2xhc3Nfb3B0aW9ufXwke2Eubm9tX29wdGlvbn18JHthLmRhdGFfcHJpY2V9YDsKICAgIGNvbnN0IGtiID0gYCR7Yi5jbGFzc19vcHRpb259fCR7Yi5ub21fb3B0aW9ufXwke2IuZGF0YV9wcmljZX1gOwogICAgcmV0dXJuIGthLmxvY2FsZUNvbXBhcmUoa2IpOwogIH0pOwogIHJldHVybiBub3JtOwp9CgpmdW5jdGlvbiBzdGFibGVMaW5lS2V5Rm9yQ29tcGFyZSh7IGlkX3Bvc19waXp6YXMsIGRhdGFfaWQsIGNsYXNzTmFtZSwgbW9kaWZzIH0gPSB7fSl7CiAgY29uc3QgcGlkID0gTnVtYmVyKGlkX3Bvc19waXp6YXMpIHx8IDA7CiAgY29uc3QgZGlkID0gU3RyaW5nKGRhdGFfaWQgPz8gIiIpLnRyaW0oKTsKICBjb25zdCBjbHMgPSBTdHJpbmcoY2xhc3NOYW1lID8/ICIiKS50cmltKCkudG9Mb3dlckNhc2UoKTsKICBjb25zdCBtID0gbm9ybWFsaXplTW9kaWZzRm9yQ29tcGFyZShtb2RpZnMpOwogIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IHBpZCwgZGlkLCBjbHMsIG0gfSk7Cn0KCmZ1bmN0aW9uIGJ1aWxkQ2xpZW50UGF5bG9hZEZvclNhdmUoY2xpZW50LCBzdG9yZUlkID0gIiIpewogIGNvbnN0IGMgPSAoY2xpZW50ICYmIHR5cGVvZiBjbGllbnQgPT09ICJvYmplY3QiKSA/IGNsaWVudCA6IHt9OwogIGNvbnN0IG1hdGNoZWRDaXR5ID0gZmluZEV4YWN0QWxsb3dlZERlbGl2ZXJ5Q2l0eUNob2ljZShzdG9yZUlkLCBjLnZpbGxlLCBjLmNvZGVQb3N0YWwpOwogIC8vIE5PVEU6CiAgLy8gQmFja2VuZCBub3cgc3VwcG9ydHMgbWVyZ2UtcGF0Y2ggc2VtYW50aWNzIGZvciBVUERBVEUgb2Ygc3RkX2NsaWVudHM6CiAgLy8gLSBrZXkgYWJzZW50ID0+IG5vIGNoYW5nZQogIC8vIC0ga2V5IG51bGwgICA9PiBjbGVhciAoc2V0IE5VTEwgLyAnJyBmYWxsYmFjaykKICAvLyAtIG5vbi1lbXB0eSAgPT4gc2V0CiAgLy8gRm9yIFNBVkUgKG5ldyBvcmRlciksIHdlIHVwc2VydCB0aGUgY2xpZW50IHRvby4gSWYgb3BlcmF0b3IgY2xlYXJzICJwcm9ibGVtZSIKICAvLyB3ZSBNVVNUIHNlbmQgbnVsbCAobm90IGVtcHR5IHN0cmluZykgc28gdGhlIERCIHZhbHVlIGlzIGFjdHVhbGx5IGNsZWFyZWQuCiAgY29uc3QgcHJvYmxlbWVDbGVhbiA9IGNsZWFuU3RyKGMucHJvYmxlbWUsIDUwMCk7CiAgcmV0dXJuIHsKICAgIC8vIHBob25lIGlzIHN0aWxsIHBhc3NlZCBhdCB0b3AtbGV2ZWwgYXMgcGhvbmVOdW1iZXIKICAgIG5vbV9wcmVub206IGNsZWFuU3RyKGMucHJlbm9tLCAxMjApLAogICAgYWRyZXNzZTogY2xlYW5TdHIoYy5hZHJlc3NlLCAyNTUpLAogICAgY29tcGxlbWVudF9hZHJlc3NlOiBjbGVhblN0cihjLmNvbXBsZW1lbnRBZHJlc3NlLCAyNTUpLAogICAgY29kZV9wb3N0YWw6IG1hdGNoZWRDaXR5ID8gU3RyaW5nKG1hdGNoZWRDaXR5LnBvc3RhbENvZGUgfHwgIiIpIDogY2xlYW5TdHIoYy5jb2RlUG9zdGFsLCAyMCksCiAgICB2aWxsZTogbWF0Y2hlZENpdHkgPyBTdHJpbmcobWF0Y2hlZENpdHkuY2l0eSB8fCAiIikgOiBjbGVhblN0cihjLnZpbGxlLCAxMjApLAogICAgbnVtX3N1cHAxOiBjbGVhblN0cihjLm51bVBsdXMxLCAzMCksCiAgICBudW1fc3VwcDI6IGNsZWFuU3RyKGMubnVtUGx1czIsIDMwKSwKICAgIC8vIElNUE9SVEFOVDogZW1wdHkgPT4gbnVsbCBzbyB1cHNlcnQgY2xlYXJzIGV4aXN0aW5nIHZhbHVlIG9uIFNBVkUgdG9vLgogICAgcHJvYmxlbWU6IHByb2JsZW1lQ2xlYW4gPT09ICIiID8gbnVsbCA6IHByb2JsZW1lQ2xlYW4sCiAgfTsKfQoKZnVuY3Rpb24gbm9ybUNsaWVudFZhbHVlKHYsIG1heExlbil7CiAgY29uc3QgcyA9IGNsZWFuU3RyKHYsIG1heExlbik7CiAgcmV0dXJuIHM7Cn0KCmZ1bmN0aW9uIGdldE9yaWdDbGllbnRWYWx1ZShvcmlnLCBrZXlzKXsKICBjb25zdCBvID0gKG9yaWcgJiYgdHlwZW9mIG9yaWcgPT09ICJvYmplY3QiKSA/IG9yaWcgOiB7fTsKICBmb3IgKGNvbnN0IGsgb2Yga2V5cyl7CiAgICBpZiAob1trXSAhPSBudWxsKSByZXR1cm4gU3RyaW5nKG9ba10pOwogIH0KICByZXR1cm4gIiI7Cn0KCi8qKgogKiBCdWlsZCBhIE1FUkdFLVBBVENIIHBheWxvYWQgZm9yIGNsaWVudCBmaWVsZHMgb24gVVBEQVRFOgogKiAtIEFCU0VOVCBrZXkgPT4gbm8gY2hhbmdlCiAqIC0ga2V5OiBudWxsICA9PiBjbGVhcgogKiAtIGtleTogIngiICAgPT4gc2V0CiAqCiAqIFdlIGluY2x1ZGUgT05MWSBjaGFuZ2VkIGtleXMgKHZzIHRoZSBvcmlnaW5hbGx5IGxvYWRlZCBjbGllbnQpLgogKi8KZnVuY3Rpb24gYnVpbGRDbGllbnRQYXRjaFBheWxvYWQoY3VycmVudENsaWVudCwgb3JpZ2luYWxDbGllbnQpewogIGNvbnN0IGMgPSAoY3VycmVudENsaWVudCAmJiB0eXBlb2YgY3VycmVudENsaWVudCA9PT0gIm9iamVjdCIpID8gY3VycmVudENsaWVudCA6IHt9OwogIGNvbnN0IG8gPSAob3JpZ2luYWxDbGllbnQgJiYgdHlwZW9mIG9yaWdpbmFsQ2xpZW50ID09PSAib2JqZWN0IikgPyBvcmlnaW5hbENsaWVudCA6IHt9OwoKICBjb25zdCBkZWZzID0gWwogICAgeyBvdXQ6ICJub21fcHJlbm9tIiwgbWF4OiAxMjAsIGN1cktleXM6IFsicHJlbm9tIiwgIm5vbV9wcmVub20iXSwgb3JpZ0tleXM6IFsibm9tX3ByZW5vbSJdIH0sCiAgICB7IG91dDogImFkcmVzc2UiLCBtYXg6IDI1NSwgY3VyS2V5czogWyJhZHJlc3NlIl0sIG9yaWdLZXlzOiBbImFkcmVzc2UiXSB9LAogICAgeyBvdXQ6ICJjb21wbGVtZW50X2FkcmVzc2UiLCBtYXg6IDI1NSwgY3VyS2V5czogWyJjb21wbGVtZW50QWRyZXNzZSIsICJjb21wbGVtZW50X2FkcmVzc2UiXSwgb3JpZ0tleXM6IFsiY29tcGxlbWVudF9hZHJlc3NlIl0gfSwKICAgIHsgb3V0OiAiY29kZV9wb3N0YWwiLCBtYXg6IDIwLCBjdXJLZXlzOiBbImNvZGVQb3N0YWwiLCAiY29kZV9wb3N0YWwiXSwgb3JpZ0tleXM6IFsiY29kZV9wb3N0YWwiXSB9LAogICAgeyBvdXQ6ICJ2aWxsZSIsIG1heDogMTIwLCBjdXJLZXlzOiBbInZpbGxlIl0sIG9yaWdLZXlzOiBbInZpbGxlIl0gfSwKICAgIHsgb3V0OiAibnVtX3N1cHAxIiwgbWF4OiAzMCwgY3VyS2V5czogWyJudW1QbHVzMSIsICJudW1fc3VwcDEiXSwgb3JpZ0tleXM6IFsibnVtX3N1cHAxIl0gfSwKICAgIHsgb3V0OiAibnVtX3N1cHAyIiwgbWF4OiAzMCwgY3VyS2V5czogWyJudW1QbHVzMiIsICJudW1fc3VwcDIiXSwgb3JpZ0tleXM6IFsibnVtX3N1cHAyIl0gfSwKICAgIHsgb3V0OiAicHJvYmxlbWUiLCBtYXg6IDUwMCwgY3VyS2V5czogWyJwcm9ibGVtZSJdLCBvcmlnS2V5czogWyJwcm9ibGVtZSJdIH0sCiAgXTsKCiAgY29uc3QgcGF0Y2ggPSB7fTsKICBmb3IgKGNvbnN0IGQgb2YgZGVmcyl7CiAgICBjb25zdCBjdXJSYXcgPSBnZXRPcmlnQ2xpZW50VmFsdWUoYywgZC5jdXJLZXlzKTsKICAgIGNvbnN0IG9yaWdSYXcgPSBnZXRPcmlnQ2xpZW50VmFsdWUobywgZC5vcmlnS2V5cyk7CiAgICBjb25zdCBjdXIgPSBub3JtQ2xpZW50VmFsdWUoY3VyUmF3LCBkLm1heCk7CiAgICBjb25zdCBvcmlnID0gbm9ybUNsaWVudFZhbHVlKG9yaWdSYXcsIGQubWF4KTsKCiAgICBpZiAoY3VyID09PSBvcmlnKSBjb250aW51ZTsKICAgIGlmIChjdXIgPT09ICIiKSBwYXRjaFtkLm91dF0gPSBudWxsOyAgICAgIC8vIGV4cGxpY2l0IGNsZWFyCiAgICBlbHNlIHBhdGNoW2Qub3V0XSA9IGN1cjsgICAgICAgICAgICAgICAgICAgLy8gZXhwbGljaXQgc2V0CiAgfQogIHJldHVybiBwYXRjaDsKfQoKZnVuY3Rpb24gbWFrZURhdGFJZEZyb21MaW5lKGxpbmUpewogIGNvbnN0IGRpcmVjdCA9CiAgICAodHlwZW9mIGxpbmU/LmRhdGFfaWQgPT09ICJzdHJpbmciICYmIGxpbmUuZGF0YV9pZC50cmltKCkpID8gbGluZS5kYXRhX2lkLnRyaW0oKSA6CiAgICAodHlwZW9mIGxpbmU/LmRhdGFJZCA9PT0gInN0cmluZyIgJiYgbGluZS5kYXRhSWQudHJpbSgpKSA/IGxpbmUuZGF0YUlkLnRyaW0oKSA6CiAgICAiIjsKICBpZiAoZGlyZWN0KSByZXR1cm4gZGlyZWN0OwoKICBjb25zdCB1aWQgPSAodHlwZW9mIGxpbmU/LnVpZCA9PT0gInN0cmluZyIgJiYgbGluZS51aWQudHJpbSgpKSA/IGxpbmUudWlkLnRyaW0oKSA6ICIiOwogIGlmICh1aWQpewogICAgY29uc3Qgc2FmZSA9IHVpZC5yZXBsYWNlKC9bXmEtekEtWjAtOV8tXS9nLCAiLSIpOwogICAgcmV0dXJuIHNhZmUuc3RhcnRzV2l0aCgicGl6emEtIikgPyBzYWZlIDogYHBpenphLSR7c2FmZS5yZXBsYWNlKC9fL2csICItIil9YDsKICB9CiAgcmV0dXJuIGBwaXp6YS0ke0RhdGUubm93KCl9LSR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMCl9YDsKfQoKZnVuY3Rpb24gcGlja1Bvc1BpenphSWQobGluZSl7CiAgY29uc3QgY2FuZHMgPSBbCiAgICBsaW5lPy5waXp6YV9pZCwKICAgIGxpbmU/LnBpenphSWQsCiAgICBsaW5lPy5pZF9wb3NfcGl6emFzLAogICAgbGluZT8ucG9zX3Bpenphc19pZCwKICAgIGxpbmU/LmlkLAogIF07CiAgZm9yIChjb25zdCBjIG9mIGNhbmRzKXsKICAgIGNvbnN0IG4gPSBOdW1iZXIoYyk7CiAgICBpZiAoTnVtYmVyLmlzRmluaXRlKG4pICYmIG4gPiAwKSByZXR1cm4gKG4gfCAwKTsKICB9CiAgcmV0dXJuIG51bGw7Cn0KCmZ1bmN0aW9uIGJ1aWxkVGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzUGF5bG9hZCh0ZW1wQWRkcmVzcywgc3RvcmVJZCA9ICIiKXsKICBjb25zdCB0ID0gKHRlbXBBZGRyZXNzICYmIHR5cGVvZiB0ZW1wQWRkcmVzcyA9PT0gIm9iamVjdCIpID8gdGVtcEFkZHJlc3MgOiBudWxsOwogIGlmICghdCB8fCB0LmVuYWJsZWQgIT09IHRydWUpIHJldHVybiBudWxsOwogIGNvbnN0IG1hdGNoZWRDaXR5ID0gZmluZEV4YWN0QWxsb3dlZERlbGl2ZXJ5Q2l0eUNob2ljZShzdG9yZUlkLCB0LnZpbGxlLCB0LmNvZGVQb3N0YWwpOwogIGNvbnN0IHBheWxvYWQgPSB7CiAgICBlbmFibGVkOiAxLAogICAgYWRyZXNzZTogY2xlYW5TdHIodC5hZHJlc3NlLCAxOTApLAogICAgY29tcGxlbWVudF9hZHJlc3NlOiBjbGVhblN0cih0LmNvbXBsZW1lbnRBZHJlc3NlID8/IHQuY29tcGxlbWVudF9hZHJlc3NlLCAxOTApLAogICAgY29kZV9wb3N0YWw6IG1hdGNoZWRDaXR5ID8gU3RyaW5nKG1hdGNoZWRDaXR5LnBvc3RhbENvZGUgfHwgIiIpIDogY2xlYW5TdHIodC5jb2RlUG9zdGFsID8/IHQuY29kZV9wb3N0YWwsIDIwKSwKICAgIHZpbGxlOiBtYXRjaGVkQ2l0eSA/IFN0cmluZyhtYXRjaGVkQ2l0eS5jaXR5IHx8ICIiKSA6IGNsZWFuU3RyKHQudmlsbGUsIDEyMCksCiAgICBleHBsaWNhdGlvbnM6IGNsZWFuU3RyKHQuZXhwbGljYXRpb25zLCA1MDApLAogICAgbnVtZXJvX3VyZ2VuY2U6IGNsZWFuU3RyKHQubnVtZXJvVXJnZW5jZSA/PyB0Lm51bWVyb191cmdlbmNlLCAzMCksCiAgfTsKICBjb25zdCBoYXNBbnkgPSBPYmplY3Qua2V5cyhwYXlsb2FkKS5zb21lKChrKSA9PiBrICE9PSAiZW5hYmxlZCIgJiYgU3RyaW5nKHBheWxvYWRba10gPz8gIiIpLnRyaW0oKSAhPT0gIiIpOwogIHJldHVybiBoYXNBbnkgPyBwYXlsb2FkIDogbnVsbDsKfQoKZnVuY3Rpb24gdmFsaWRhdGVBbGxvd2VkRGVsaXZlcnlDaXR5Rm9yU2F2ZSh7IHN0b3JlSWQsIGNpdHksIHBvc3RhbENvZGUsIGxhYmVsIH0gPSB7fSl7CiAgY29uc3QgaGFzQW55ID0gY2xlYW5TdHIoY2l0eSwgMTIwKSAhPT0gIiIgfHwgY2xlYW5TdHIocG9zdGFsQ29kZSwgMjApICE9PSAiIjsKICBpZiAoIWhhc0FueSkgcmV0dXJuICIiOwogIGNvbnN0IG1hdGNoZWQgPSBmaW5kRXhhY3RBbGxvd2VkRGVsaXZlcnlDaXR5Q2hvaWNlKHN0b3JlSWQsIGNpdHksIHBvc3RhbENvZGUpOwogIGlmIChtYXRjaGVkKSByZXR1cm4gIiI7CiAgY29uc3QgcHJlZml4ID0gY2xlYW5TdHIobGFiZWwsIDgwKSB8fCAiQWRyZXNzZSI7CiAgcmV0dXJuIGAke3ByZWZpeH0gOiBjb2RlIHBvc3RhbCAvIHZpbGxlIG5vbiBhdXRvcmlzw6lzIHBvdXIgY2UgcG9pbnQgZGUgdmVudGVgOwp9CgpmdW5jdGlvbiByb3VuZDIobil7CiAgY29uc3QgeCA9IE51bWJlcihuKTsKICBpZiAoIU51bWJlci5pc0Zpbml0ZSh4KSkgcmV0dXJuIDA7CiAgcmV0dXJuIE1hdGgucm91bmQoeCAqIDEwMCkgLyAxMDA7Cn0KCmZ1bmN0aW9uIGRpc3BhdGNoVUlSZW5kZXIoa2luZCl7CiAgdHJ5ewogICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInVpOnJlbmRlciIsIHsgZGV0YWlsOiB7IGtpbmQ6IFN0cmluZyhraW5kID8/ICIiKS50cmltKCkgfHwgInVua25vd24iIH0gfSkpOwogIH0gY2F0Y2ggKF9lKSB7fQp9Cgphc3luYyBmdW5jdGlvbiBjb25maXJtQW5kTWF5YmVDaGFuZ2VOb25Ub2RheURhdGUoeyBzdGF0ZSB9ID0ge30pewogIGNvbnN0IHN0ID0gKHN0YXRlICYmIHR5cGVvZiBzdGF0ZSA9PT0gIm9iamVjdCIpID8gc3RhdGUgOiBudWxsOwogIGlmICghc3QpIHJldHVybiB7IG9rOiB0cnVlIH07CgogIGNvbnN0IHNlbGVjdGVkRGF0ZUlTTyA9IFN0cmluZyhzdC5zZWxlY3RlZERhdGVJU08gPz8gIiIpLnRyaW0oKTsKICBjb25zdCB0b2RheUlTTyA9IGdldFBhcmlzVG9kYXlJU08oKTsKICBpZiAoIXNlbGVjdGVkRGF0ZUlTTyB8fCBzZWxlY3RlZERhdGVJU08gPT09IHRvZGF5SVNPKSByZXR1cm4geyBvazogdHJ1ZSB9OwoKICBjb25zdCB0b21vcnJvd0lTTyA9IGdldFBhcmlzVG9tb3Jyb3dJU08oKTsKICBjb25zdCBzaG93VG9tb3Jyb3dBY3Rpb24gPSBzZWxlY3RlZERhdGVJU08gIT09IHRvbW9ycm93SVNPOwogIGNvbnN0IHRhcmdldExhYmVsID0gZm9ybWF0SVNPRGF0ZVNob3J0Tm9ZZWFyRlIoc2VsZWN0ZWREYXRlSVNPKTsKICBjb25zdCBwaWNrZWQgPSBhd2FpdCBvcmRlckRhdGVDb25maXJtTW9kYWwoewogICAgdGl0bGU6ICJEYXRlIGRlIGNvbW1hbmRlIGRpZmbDqXJlbnRlIiwKICAgIGRhdGVJU086IHNlbGVjdGVkRGF0ZUlTTywKICAgIGRhdGVMYWJlbDogdGFyZ2V0TGFiZWwsCiAgICB0b2RheUlTTywKICAgIHRvbW9ycm93SVNPLAogICAgc2hvd1RvbW9ycm93QWN0aW9uLAogIH0pOwoKICBpZiAoIXBpY2tlZCB8fCBwaWNrZWQuYWN0aW9uID09PSAiY2FuY2VsIil7CiAgICByZXR1cm4geyBvazogZmFsc2UsIGNoYW5nZWREYXRlOiBmYWxzZSB9OwogIH0KICBpZiAocGlja2VkLmFjdGlvbiA9PT0gImNvbmZpcm0iKXsKICAgIHJldHVybiB7IG9rOiB0cnVlLCBjaGFuZ2VkRGF0ZTogZmFsc2UgfTsKICB9CgogIGNvbnN0IG5leHREYXRlSVNPID0gU3RyaW5nKHBpY2tlZC5kYXRlSVNPID8/ICIiKS50cmltKCk7CiAgaWYgKCEvXlxkezR9LVxkezJ9LVxkezJ9JC8udGVzdChuZXh0RGF0ZUlTTykpewogICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBjaGFuZ2VkRGF0ZTogZmFsc2UgfTsKICB9CgogIGFwcGx5U2VsZWN0ZWREYXRlSVNPKHsgc3RhdGU6IHN0LCBkYXRlSVNPOiBuZXh0RGF0ZUlTTyB9KTsKICBjbGVhckFjdGl2ZVRpbWUoeyBzdGF0ZTogc3QsIHNvdXJjZTogIm9yZGVyX2RhdGVfY2hhbmdlZF9iZWZvcmVfc2F2ZSIgfSk7CiAgZXhpdExvYWRlZE9yZGVyRWRpdE1vZGVLZWVwRHJhZnQoeyBzdGF0ZTogc3QgfSk7CiAgZGlzcGF0Y2hVSVJlbmRlcigib3JkZXJEYXRlQ2hhbmdlZEJlZm9yZVNhdmUiKTsKCiAgYXdhaXQgUHJvbWlzZS5hbGwoWwogICAgbG9hZERhaWx5T3JkZXJUYWJzKHsgc3RhdGU6IHN0IH0pLAogICAgbG9hZFNsb3RCYWRnZXMoeyBzdGF0ZTogc3QgfSksCiAgXSk7CgogIGRpc3BhdGNoVUlSZW5kZXIoIm9yZGVyRGF0ZUNoYW5nZWRCZWZvcmVTYXZlTG9hZGVkIik7CiAgc2hvd1RvYXN0KHsgbWVzc2FnZTogIkRhdGUgY2hhbmfDqWUuIENob2lzaXIgdW4gY3LDqW5lYXUgcG91ciBlbnJlZ2lzdHJlci4iLCBraW5kOiAic3VjY2VzcyIgfSk7CiAgcmV0dXJuIHsgb2s6IGZhbHNlLCBjaGFuZ2VkRGF0ZTogdHJ1ZSB9Owp9CgpmdW5jdGlvbiByZXNvbHZlUm93RnJvbUtleShrZXksIG1hcHMpewogIGNvbnN0IGsgPSBTdHJpbmcoa2V5ID8/ICIiKS50cmltKCk7CiAgaWYgKCFrKSByZXR1cm4gbnVsbDsKICBjb25zdCBpc0lkID0gay5zdGFydHNXaXRoKCJpZDoiKTsKICBjb25zdCByYXcgPSBrLnJlcGxhY2UoL15pZDovLCAiIikucmVwbGFjZSgvXm5hbWU6LywgIiIpLnRyaW0oKTsKICBpZiAoIXJhdykgcmV0dXJuIG51bGw7CgogIGlmIChtYXBzLmtpbmQgPT09ICJpbmdyZWRpZW50Iil7CiAgICBpZiAoaXNJZCl7CiAgICAgIGNvbnN0IGlkID0gTnVtYmVyKHJhdyk7CiAgICAgIHJldHVybiAoTnVtYmVyLmlzRmluaXRlKGlkKSAmJiBtYXBzLmJ5SWQpID8gKG1hcHMuYnlJZC5nZXQoaWQpIHx8IG51bGwpIDogbnVsbDsKICAgIH0KICAgIHJldHVybiBtYXBzLmJ5TmFtZSA/IChtYXBzLmJ5TmFtZS5nZXQoU3RyaW5nKHJhdykudG9Mb3dlckNhc2UoKSkgfHwgbnVsbCkgOiBudWxsOwogIH0KCiAgaWYgKG1hcHMua2luZCA9PT0gIm9wdGlvbiIpewogICAgaWYgKGlzSWQpewogICAgICBjb25zdCBpZCA9IE51bWJlcihyYXcpOwogICAgICByZXR1cm4gKE51bWJlci5pc0Zpbml0ZShpZCkgJiYgbWFwcy5ieUlkKSA/IChtYXBzLmJ5SWQuZ2V0KGlkKSB8fCBudWxsKSA6IG51bGw7CiAgICB9CiAgICAvLyBPcHRpb25zIG1heSBiZSBzdG9yZWQgd2l0aCAiKyAiIHByZWZpeCBpbiBEQi9jYXRhbG9nOyB0cnkgYSBmZXcgYWxpYXNlcy4KICAgIGNvbnN0IGJhc2UgPSBTdHJpbmcocmF3KS50b0xvd2VyQ2FzZSgpOwogICAgcmV0dXJuICgKICAgICAgKG1hcHMuYnlOYW1lID8gbWFwcy5ieU5hbWUuZ2V0KGJhc2UpIDogbnVsbCkgfHwKICAgICAgKG1hcHMuYnlOYW1lID8gbWFwcy5ieU5hbWUuZ2V0KGArICR7YmFzZX1gKSA6IG51bGwpIHx8CiAgICAgIChtYXBzLmJ5TmFtZSA/IG1hcHMuYnlOYW1lLmdldChgKyR7YmFzZX1gKSA6IG51bGwpIHx8CiAgICAgIG51bGwKICAgICk7CiAgfQoKICByZXR1cm4gbnVsbDsKfQoKZnVuY3Rpb24gYnVpbGRQaXp6YU1vZGlmcyh7IHN0YXRlLCBsaW5lIH0gPSB7fSl7CiAgY29uc3QgbCA9IChsaW5lICYmIHR5cGVvZiBsaW5lID09PSAib2JqZWN0IikgPyBsaW5lIDogbnVsbDsKICBpZiAoIWwgfHwgbC5jbGFzcyAhPT0gInBpenphIikgcmV0dXJuIFtdOwoKICBjb25zdCBpZHggPSAoc3RhdGUgJiYgdHlwZW9mIHN0YXRlID09PSAib2JqZWN0IiAmJiBzdGF0ZS5jYXRhbG9nSW5kZXggJiYgdHlwZW9mIHN0YXRlLmNhdGFsb2dJbmRleCA9PT0gIm9iamVjdCIpCiAgICA/IHN0YXRlLmNhdGFsb2dJbmRleAogICAgOiBudWxsOwoKICBjb25zdCBpbmdyZWRpZW50TWFwcyA9IHsKICAgIGtpbmQ6ICJpbmdyZWRpZW50IiwKICAgIGJ5SWQ6IChpZHg/LmluZ3JlZGllbnRCeUlkIGluc3RhbmNlb2YgTWFwKSA/IGlkeC5pbmdyZWRpZW50QnlJZCA6IG51bGwsCiAgICBieU5hbWU6IChpZHg/LmluZ3JlZGllbnRCeU5hbWUgaW5zdGFuY2VvZiBNYXApID8gaWR4LmluZ3JlZGllbnRCeU5hbWUgOiBudWxsLAogIH07CiAgY29uc3Qgb3B0aW9uTWFwcyA9IHsKICAgIGtpbmQ6ICJvcHRpb24iLAogICAgYnlJZDogKGlkeD8ub3B0aW9uQnlJZCBpbnN0YW5jZW9mIE1hcCkgPyBpZHgub3B0aW9uQnlJZCA6IG51bGwsCiAgICBieU5hbWU6IChpZHg/Lm9wdGlvbkJ5TmFtZSBpbnN0YW5jZW9mIE1hcCkgPyBpZHgub3B0aW9uQnlOYW1lIDogbnVsbCwKICB9OwoKICAvLyBVc2UgVUkgbGluZXMgYXMgc291cmNlLW9mLXRydXRoIGZhbGxiYWNrIGZvciBwcmljZXMgKHJvYnVzdCBmb3IgaW1wb3J0ZWQgb3JkZXJzCiAgLy8gKyBmcmVlLXRleHQgaXRlbXMgbm90IHByZXNlbnQgaW4gdGhlIGNhdGFsb2cpLgogIGNvbnN0IGFkZGVkSW5mb0J5TGFiZWwgPSBidWlsZERpc3BsYXlMaW5lSW5mb01hcChsLmFkZGVkSW5ncmVkaWVudExpbmVzKTsKICBjb25zdCBvcHRJbmZvQnlMYWJlbCA9IGJ1aWxkRGlzcGxheUxpbmVJbmZvTWFwKGwuc2VsZWN0ZWRPcHRpb25MaW5lcyk7CgogIGNvbnN0IG91dCA9IFtdOwoKICAvLyBNYW51YWwgZXh0cmEgLyByZWR1Y3Rpb24gb24gcGl6emEgKG11bHRpLWVudHJ5KQogIGNvbnN0IG1hbnVhbEV4dHJhcyA9IEFycmF5LmlzQXJyYXkobC5tYW51YWxFeHRyYXMpID8gbC5tYW51YWxFeHRyYXMgOiBbXTsKICBpZiAobWFudWFsRXh0cmFzLmxlbmd0aCl7CiAgICBmb3IgKGNvbnN0IGl0IG9mIG1hbnVhbEV4dHJhcyl7CiAgICAgIGNvbnN0IGxibCA9IFN0cmluZyhpdD8ubGFiZWwgPz8gIiIpLnRyaW0oKTsKICAgICAgY29uc3QgYW10ID0gTnVtYmVyKGl0Py5hbW91bnQpOwogICAgICBjb25zdCBhID0gTnVtYmVyLmlzRmluaXRlKGFtdCkgPyBhbXQgOiAwOwogICAgICBpZiAoIWxibCAmJiBhID09PSAwKSBjb250aW51ZTsKICAgICAgb3V0LnB1c2goewogICAgICAgIG5vbV9vcHRpb246IGxibCB8fCAoYSA8IDAgPyAiUsOpZHVjdGlvbiIgOiAiRXh0cmEiKSwKICAgICAgICBjbGFzc19vcHRpb246ICJleHRyYS1pdGVtIiwKICAgICAgICBkYXRhX3ByaWNlOiByb3VuZDIoYSksCiAgICAgIH0pOwogICAgfQogIH0gZWxzZSB7CiAgICAvLyBMZWdhY3kgc2luZ2xlIGV4dHJhIC8gcmVkdWN0aW9uCiAgICBjb25zdCBleHRyYUxibCA9IFN0cmluZyhsLmV4dHJhTGFiZWwgPz8gIiIpLnRyaW0oKTsKICAgIGNvbnN0IGV4dHJhQW10ID0gTnVtYmVyKGwuZXh0cmFBbW91bnQpOwogICAgaWYgKChleHRyYUxibCAmJiBleHRyYUxibCAhPT0gIiIpIHx8IChOdW1iZXIuaXNGaW5pdGUoZXh0cmFBbXQpICYmIGV4dHJhQW10ICE9PSAwKSl7CiAgICAgIG91dC5wdXNoKHsKICAgICAgICBub21fb3B0aW9uOiBleHRyYUxibCB8fCAoZXh0cmFBbXQgPCAwID8gIlLDqWR1Y3Rpb24iIDogIkV4dHJhIiksCiAgICAgICAgY2xhc3Nfb3B0aW9uOiAiZXh0cmEtaXRlbSIsCiAgICAgICAgZGF0YV9wcmljZTogcm91bmQyKE51bWJlci5pc0Zpbml0ZShleHRyYUFtdCkgPyBleHRyYUFtdCA6IDApLAogICAgICB9KTsKICAgIH0KICB9CgogIC8vIEFkZGVkIGluZ3JlZGllbnRzCiAgY29uc3QgYWRkZWQgPSBBcnJheS5pc0FycmF5KGwuYWRkZWRJbmdyZWRpZW50cykgPyBsLmFkZGVkSW5ncmVkaWVudHMgOiBbXTsKICBmb3IgKGNvbnN0IGsgb2YgYWRkZWQpewogICAgY29uc3Qgcm93ID0gcmVzb2x2ZVJvd0Zyb21LZXkoaywgaW5ncmVkaWVudE1hcHMpOwogICAgY29uc3Qga2V5TGFiZWwgPSBjbGVhbktleUxhYmVsKGspOwogICAgY29uc3QgaW5mbyA9IGtleUxhYmVsID8gKGFkZGVkSW5mb0J5TGFiZWwuZ2V0KG5vcm1hbGl6ZUZvbGRMb2NhbChrZXlMYWJlbCkpIHx8IG51bGwpIDogbnVsbDsKICAgIGNvbnN0IG5hbWUgPQogICAgICBTdHJpbmcoaW5mbz8ubGFiZWwgPz8gIiIpLnRyaW0oKSB8fAogICAgICBTdHJpbmcocm93Py5pbmdyZWRpZW50X25hbWUgPz8gIiIpLnRyaW0oKSB8fAogICAgICBrZXlMYWJlbDsKICAgIGlmICghbmFtZSkgY29udGludWU7CiAgICBjb25zdCBwcmljZUZyb21VSSA9IChpbmZvICYmIE51bWJlci5pc0Zpbml0ZShOdW1iZXIoaW5mby5wcmljZSkpKSA/IE51bWJlcihpbmZvLnByaWNlKSA6IG51bGw7CiAgICBjb25zdCBwcmljZUZyb21DYXRhbG9nID0gTnVtYmVyKHJvdz8uaW5ncmVkaWVudF9wcmljZSk7CiAgICBjb25zdCBwcmljZSA9CiAgICAgIChwcmljZUZyb21VSSAhPSBudWxsKQogICAgICAgID8gcHJpY2VGcm9tVUkKICAgICAgICA6IChOdW1iZXIuaXNGaW5pdGUocHJpY2VGcm9tQ2F0YWxvZykgPyBwcmljZUZyb21DYXRhbG9nIDogMCk7CiAgICBvdXQucHVzaCh7CiAgICAgIG5vbV9vcHRpb246IG5hbWUsCiAgICAgIGNsYXNzX29wdGlvbjogImluZ3JlZGllbnQtaXRlbSIsCiAgICAgIGRhdGFfcHJpY2U6IHJvdW5kMihOdW1iZXIuaXNGaW5pdGUocHJpY2UpID8gcHJpY2UgOiAwKSwKICAgIH0pOwogIH0KCiAgLy8gU2VsZWN0ZWQgb3B0aW9ucwogIGNvbnN0IG9wdHMgPSBBcnJheS5pc0FycmF5KGwuc2VsZWN0ZWRPcHRpb25zKSA/IGwuc2VsZWN0ZWRPcHRpb25zIDogW107CiAgZm9yIChjb25zdCBrIG9mIG9wdHMpewogICAgY29uc3Qgcm93ID0gcmVzb2x2ZVJvd0Zyb21LZXkoaywgb3B0aW9uTWFwcyk7CiAgICBjb25zdCBrZXlMYWJlbCA9IGNsZWFuS2V5TGFiZWwoayk7CiAgICBjb25zdCBpbmZvID0ga2V5TGFiZWwgPyAob3B0SW5mb0J5TGFiZWwuZ2V0KG5vcm1hbGl6ZUZvbGRMb2NhbChrZXlMYWJlbCkpIHx8IG51bGwpIDogbnVsbDsKICAgIGNvbnN0IG5hbWUgPQogICAgICBTdHJpbmcoaW5mbz8ubGFiZWwgPz8gIiIpLnRyaW0oKSB8fAogICAgICBTdHJpbmcocm93Py5vcHRpb25fbmFtZSA/PyAiIikudHJpbSgpIHx8CiAgICAgIGtleUxhYmVsOwogICAgaWYgKCFuYW1lKSBjb250aW51ZTsKICAgIGNvbnN0IHByaWNlRnJvbVVJID0gKGluZm8gJiYgTnVtYmVyLmlzRmluaXRlKE51bWJlcihpbmZvLnByaWNlKSkpID8gTnVtYmVyKGluZm8ucHJpY2UpIDogbnVsbDsKICAgIGNvbnN0IHByaWNlRnJvbUNhdGFsb2cgPSBOdW1iZXIocm93Py5wcmljZV9hZGp1c3RtZW50KTsKICAgIGNvbnN0IHByaWNlID0KICAgICAgKHByaWNlRnJvbVVJICE9IG51bGwpCiAgICAgICAgPyBwcmljZUZyb21VSQogICAgICAgIDogKE51bWJlci5pc0Zpbml0ZShwcmljZUZyb21DYXRhbG9nKSA/IHByaWNlRnJvbUNhdGFsb2cgOiAwKTsKICAgIG91dC5wdXNoKHsKICAgICAgbm9tX29wdGlvbjogbmFtZSwKICAgICAgY2xhc3Nfb3B0aW9uOiAib3B0aW9uLWl0ZW0iLAogICAgICBkYXRhX3ByaWNlOiByb3VuZDIoTnVtYmVyLmlzRmluaXRlKHByaWNlKSA/IHByaWNlIDogMCksCiAgICB9KTsKICB9CgogIC8vIFJlbW92ZWQgaW5ncmVkaWVudHMgKG5vIHByaWNlIGltcGFjdCwgYnV0IGtlZXAgaW5mbyBmb3Iga2l0Y2hlbikKICBjb25zdCByZW1vdmVkTmFtZXMgPSBBcnJheS5pc0FycmF5KGwucmVtb3ZlZEluZ3JlZGllbnROYW1lcykgPyBsLnJlbW92ZWRJbmdyZWRpZW50TmFtZXMgOiBbXTsKICBjb25zdCByZW1vdmVkS2V5cyA9IEFycmF5LmlzQXJyYXkobC5yZW1vdmVkSW5ncmVkaWVudHMpID8gbC5yZW1vdmVkSW5ncmVkaWVudHMgOiBbXTsKICBjb25zdCByZW1vdmVkTGlzdCA9IHJlbW92ZWROYW1lcy5sZW5ndGggPyByZW1vdmVkTmFtZXMgOiByZW1vdmVkS2V5czsKICBmb3IgKGNvbnN0IGsgb2YgcmVtb3ZlZExpc3QpewogICAgY29uc3QgYXNLZXkgPSBTdHJpbmcoayA/PyAiIikudHJpbSgpOwogICAgaWYgKCFhc0tleSkgY29udGludWU7CiAgICBjb25zdCByb3cgPSByZXNvbHZlUm93RnJvbUtleShhc0tleSwgaW5ncmVkaWVudE1hcHMpOwogICAgY29uc3QgbmFtZSA9IFN0cmluZyhyb3c/LmluZ3JlZGllbnRfbmFtZSA/PyAiIikudHJpbSgpIHx8IGFzS2V5LnJlcGxhY2UoL15uYW1lOi8sICIiKS5yZXBsYWNlKC9eaWQ6LywgIiIpLnRyaW0oKTsKICAgIGlmICghbmFtZSkgY29udGludWU7CiAgICBvdXQucHVzaCh7CiAgICAgIG5vbV9vcHRpb246IG5hbWUsCiAgICAgIGNsYXNzX29wdGlvbjogInJlbW92ZWQtaXRlbSIsCiAgICAgIGRhdGFfcHJpY2U6IDAsCiAgICB9KTsKICB9CgogIHJldHVybiBvdXQ7Cn0KCmV4cG9ydCBmdW5jdGlvbiBiaW5kU2F2ZU9yZGVyVmFsaWRhdGlvbih7IHN0YXRlLCByZWZyZXNoUmlnaHRQYW5lbE9ubHkgfSA9IHt9KXsKICBpZiAoX19ib3VuZCkgcmV0dXJuOwogIF9fYm91bmQgPSB0cnVlOwoKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJvcmRlcjp2YWxpZGF0ZSIsIGFzeW5jIChldikgPT4gewogICAgY29uc3Qgc3QgPSBzdGF0ZSAmJiB0eXBlb2Ygc3RhdGUgPT09ICJvYmplY3QiID8gc3RhdGUgOiBudWxsOwogICAgaWYgKCFzdCkgcmV0dXJuOwogICAgLy8gR3VhcmQ6IHByZXZlbnQgY29uY3VycmVudC9kb3VibGUgdmFsaWRhdGlvbiAoZG91YmxlIGNsaWNrIC8gZHVwbGljYXRlZCBldmVudCBkaXNwYXRjaCkuCiAgICAvLyBXaXRob3V0IHRoaXMsIHByZS12YWxpZGF0ZSBtb2RhbHMgKG9mZmVyZWQgZHJpbmtzLCBzbG90IHJlcXVpcmVkKSBjYW4gcmVvcGVuIGV2ZW4gaWYKICAgIC8vIHRoZSBmaXJzdCB2YWxpZGF0aW9uIGZsb3cgYWxyZWFkeSBhZGRlZCB0aGUgcmVxdWlyZWQgaXRlbXMuCiAgICBpZiAoc3QuX192YWxpZGF0aW9uSW5GbGlnaHQgPT09IHRydWUpIHJldHVybjsKICAgIHN0Ll9fdmFsaWRhdGlvbkluRmxpZ2h0ID0gdHJ1ZTsKCiAgICB0cnl7CiAgICAgIC8vIElNUE9SVEFOVDogbmV2ZXIgcGFyc2UgUERWIGxhYmVsIHRleHQgKGFjY2VudCBsaWtlICJQw6lsaXNzYW5uZSIgYnJlYWtzIGluY2x1ZGVzKCJwZWwiKSkuCiAgICAgIC8vIFVzZSB0aGUgc2luZ2xlIHNvdXJjZS1vZi10cnV0aCBtYXBwZXIgdXNlZCBldmVyeXdoZXJlIGVsc2UgaW4gdGhlIGFwcC4KICAgICAgY29uc3Qgc3RvcmVDdXJyZW50ID0gc3RvcmVUb1N1ZmZpeChldj8uZGV0YWlsPy5wZHZDdXJyZW50KTsKCiAgICAgIGNvbnN0IGl0ZW1zID0gQXJyYXkuaXNBcnJheShzdC5hZGRlZEl0ZW1zKSA/IHN0LmFkZGVkSXRlbXMgOiBbXTsKICAgICAgaWYgKCFpdGVtcy5sZW5ndGgpewogICAgICAgIHNob3dUb2FzdCh7IG1lc3NhZ2U6ICJQYW5pZXIgdmlkZSIsIGtpbmQ6ICJlcnJvciIgfSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgLy8gSWYgYW4gb3JkZXIgaXMgbG9hZGVkLCB3ZSBhcmUgaW4gInVwZGF0ZSBleGlzdGluZyBvcmRlciIgbW9kZS4KICAgIGNvbnN0IGxvYWRlZE1ldGEgPSAoc3QubG9hZGVkT3JkZXJNZXRhICYmIHR5cGVvZiBzdC5sb2FkZWRPcmRlck1ldGEgPT09ICJvYmplY3QiKSA/IHN0LmxvYWRlZE9yZGVyTWV0YSA6IG51bGw7CiAgICBjb25zdCBsb2FkZWRTbmFwc2hvdCA9IChzdC5sb2FkZWRPcmRlclNuYXBzaG90ICYmIHR5cGVvZiBzdC5sb2FkZWRPcmRlclNuYXBzaG90ID09PSAib2JqZWN0IikgPyBzdC5sb2FkZWRPcmRlclNuYXBzaG90IDogbnVsbDsKICAgIGNvbnN0IGlzVXBkYXRlTW9kZSA9ICEhKGxvYWRlZE1ldGEgJiYgTnVtYmVyKGxvYWRlZE1ldGE/LmlkKSA+IDAgJiYgTnVtYmVyKGxvYWRlZE1ldGE/LmlkX2RhdGUpID4gMCAmJiB0eXBlb2YgbG9hZGVkTWV0YT8uZGF0ZUlTTyA9PT0gInN0cmluZyIpOwogICAgLy8gSW4gVVBEQVRFIG1vZGUsIGFsd2F5cyB1c2UgdGhlIHN0b3JlIG9mIHRoZSBsb2FkZWQgb3JkZXIgdG8gYXZvaWQgbWlzbWF0Y2hlcwogICAgLy8gKGVnOiBvcGVyYXRvciB0b2dnbGVzIFBEViBhZnRlciBzZWxlY3RpbmcvbG9hZGluZyBhbiBvcmRlcikuCiAgICBjb25zdCBzdG9yZVVwZGF0ZSA9IChpc1VwZGF0ZU1vZGUgJiYgdHlwZW9mIGxvYWRlZE1ldGE/LnN0b3JlID09PSAic3RyaW5nIiAmJiAvXihsYW58cGVsKSQvLnRlc3QobG9hZGVkTWV0YS5zdG9yZSkpCiAgICAgID8gbG9hZGVkTWV0YS5zdG9yZQogICAgICA6IHN0b3JlQ3VycmVudDsKCiAgICAvLyBpZF9kYXRlIGlzIG5vdyBhc3NpZ25lZCBzZXJ2ZXItc2lkZSAobmV4dCBhdmFpbGFibGUgZm9yIHRoZSBkYXkgYmFzZWQgb24gaGV1cmVfcHJlcGEpLgogICAgLy8gS2VlcCBzZW5kaW5nIHRoZSBjdXJyZW50IFVJIHRhYiB2YWx1ZSBpZiBwcmVzZW50IChkZWJ1ZyksIGJ1dCBkbyBub3QgYmxvY2sgdmFsaWRhdGlvbiBvbiBpdC4KICAgIGNvbnN0IGlkRGF0ZSA9IGFzSW50KHN0LmFjdGl2ZU51bWJlciwgMCk7CgogICAgY29uc3QgZGF0ZUlTTyA9ICh0eXBlb2Ygc3Quc2VsZWN0ZWREYXRlSVNPID09PSAic3RyaW5nIiAmJiAvXlxkezR9LVxkezJ9LVxkezJ9JC8udGVzdChzdC5zZWxlY3RlZERhdGVJU08pKQogICAgICA/IHN0LnNlbGVjdGVkRGF0ZUlTTwogICAgICA6ICIiOwoKICAgIGNvbnN0IGRhdGVHdWFyZCA9IGF3YWl0IGNvbmZpcm1BbmRNYXliZUNoYW5nZU5vblRvZGF5RGF0ZSh7IHN0YXRlOiBzdCB9KTsKICAgIGlmICghZGF0ZUd1YXJkPy5vaykgcmV0dXJuOwoKICAgIC8vIENvbnN0cmFpbnQ6IHVwZGF0ZSBtdXN0IHN0YXkgb24gdGhlIHNhbWUgZGF5IChpZF9kYXRlIGltbXV0YWJsZSkKICAgIGlmIChpc1VwZGF0ZU1vZGUpewogICAgICBjb25zdCBtZXRhRGF0ZSA9IFN0cmluZyhsb2FkZWRNZXRhLmRhdGVJU08gPz8gIiIpLnRyaW0oKTsKICAgICAgaWYgKG1ldGFEYXRlICYmIGRhdGVJU08gJiYgbWV0YURhdGUgIT09IGRhdGVJU08pewogICAgICAgIHNob3dUb2FzdCh7IG1lc3NhZ2U6ICJJbXBvc3NpYmxlOiB1bmUgY29tbWFuZGUgbW9kaWZpw6llIGRvaXQgcmVzdGVyIHN1ciBsZSBtw6ptZSBqb3VyLiIsIGtpbmQ6ICJlcnJvciIgfSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CgogICAgLy8gYWN0aXZlVGltZSBjYW4gYmUgIkhIOk1NIiwgb3IgYW4gb2JqZWN0IHdpdGgge3RpbWV9LCBldGMuCiAgICBsZXQgaGhtbSA9ICIiOwogICAgaWYgKHR5cGVvZiBzdC5hY3RpdmVUaW1lID09PSAic3RyaW5nIikgaGhtbSA9IHN0LmFjdGl2ZVRpbWUudHJpbSgpOwogICAgZWxzZSBpZiAoc3QuYWN0aXZlVGltZSAmJiB0eXBlb2Ygc3QuYWN0aXZlVGltZSA9PT0gIm9iamVjdCIgJiYgdHlwZW9mIHN0LmFjdGl2ZVRpbWUudGltZSA9PT0gInN0cmluZyIpIGhobW0gPSBzdC5hY3RpdmVUaW1lLnRpbWUudHJpbSgpOwoKICAgIC8vIFJlcXVpcmVtZW50OiBpZiBubyBzbG90IGlzIHNlbGVjdGVkLCBzaG93IGEgYmxvY2tpbmcgbW9kYWwgd2l0aCB0aGUgU0FNRSB1cGRhdGVkIGNoaXBzIGJhci4KICAgIC8vIFBpY2tpbmcgYSBzbG90IGZyb20gdGhlIG1vZGFsIGltbWVkaWF0ZWx5IHZhbGlkYXRlcyB0aGUgb3JkZXIuCiAgICBpZiAoIS9eXGR7Mn06XGR7Mn0kLy50ZXN0KGhobW0pKXsKICAgICAgdHJ5ewogICAgICAgIGNvbnN0IHsgdGltZVNsb3RSZXF1aXJlZE1vZGFsIH0gPSBhd2FpdCBpbXBvcnQoIi4uLy4uL3VpL2RvbS5qcyIpOwogICAgICAgIGNvbnN0IHNlbCA9IGF3YWl0IHRpbWVTbG90UmVxdWlyZWRNb2RhbCh7CiAgICAgICAgICBzdGF0ZTogc3QsCiAgICAgICAgICB0aW1lQmFkZ2VzOiBBcnJheS5pc0FycmF5KHN0LnRpbWVCYWRnZXMpID8gc3QudGltZUJhZGdlcyA6IFtdLAogICAgICAgICAgdGl0bGU6ICJIb3JhaXJlIHJlcXVpcyIsCiAgICAgICAgICBtZXNzYWdlOiAiSWwgZmF1dCBzw6lsZWN0aW9ubmVyIHVuZSBoZXVyZSBwb3VyIGNldHRlIGNvbW1hbmRlIiwKICAgICAgICB9KTsKICAgICAgICBpZiAoIXNlbD8ub2sgfHwgIS9eXGR7Mn06XGR7Mn0kLy50ZXN0KFN0cmluZyhzZWw/LmhobW0gPz8gIiIpKSl7CiAgICAgICAgICAvLyBPcGVyYXRvciBjYW5jZWxsZWQgPT4gZG8gbm90IHZhbGlkYXRlCiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGhobW0gPSBTdHJpbmcoc2VsLmhobW0pLnRyaW0oKTsKICAgICAgICAvLyBVcGRhdGUgZ2xvYmFsIHN0YXRlIHRocm91Z2ggdGhlIHNpbmdsZSBzb3VyY2Utb2YtdHJ1dGggaGVscGVyIChrZWVwcyBVSSBjb25zaXN0ZW50KS4KICAgICAgICBzZXRBY3RpdmVUaW1lKHsgc3RhdGU6IHN0LCBoaG1tLCBzb3VyY2U6ICJ2YWxpZGF0ZV9tb2RhbCIgfSk7CiAgICAgIH0gY2F0Y2ggKGUpewogICAgICAgIHNob3dUb2FzdCh7IG1lc3NhZ2U6ICJDaG9pc2lyIHVuIGNyw6luZWF1Iiwga2luZDogImVycm9yIiB9KTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KCiAgICBjb25zdCBjb3VwZSA9IGJvb2wwMShzdC5jb3VwZSk7CiAgICBjb25zdCBsaXZyYWlzb24gPSBib29sMDEoc3QubGl2cmFpc29uKTsKICAgIGNvbnN0IGNsaWVudElkID0gYXNJbnQoc3Q/LmNsaWVudD8uaWQsIDApOwogICAgLy8gQXQgc2F2ZSB0aW1lIHdlIG11c3QgaGF2ZSBhbiBpZF9jbGllbnQ6CiAgICAvLyBUaGUgYmFja2VuZCB3aWxsIHVwc2VydCBzdGRfY2xpZW50cyBiYXNlZCBvbiBwaG9uZU51bWJlciBpZiBuZWVkZWQuCiAgICBjb25zdCBwaG9uZU51bWJlciA9CiAgICAgICh0eXBlb2Ygc3Q/LmNsaWVudD8ucGhvbmVOdW1iZXIgPT09ICJzdHJpbmciICYmIHN0LmNsaWVudC5waG9uZU51bWJlci50cmltKCkpID8gc3QuY2xpZW50LnBob25lTnVtYmVyLnRyaW0oKSA6CiAgICAgICh0eXBlb2Ygc3Q/LmNsaWVudD8udGVsZXBob25lID09PSAic3RyaW5nIiAmJiBzdC5jbGllbnQudGVsZXBob25lLnRyaW0oKSkgPyBzdC5jbGllbnQudGVsZXBob25lLnRyaW0oKSA6CiAgICAgICIiOwogICAgaWYgKCFwaG9uZU51bWJlcil7CiAgICAgIHNob3dUb2FzdCh7IG1lc3NhZ2U6ICJTYWlzaXIgbGUgdMOpbMOpcGhvbmUgZHUgY2xpZW50Iiwga2luZDogImVycm9yIiB9KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgICBjb25zdCBjbGllbnRQYXlsb2FkID0gYnVpbGRDbGllbnRQYXlsb2FkRm9yU2F2ZShzdC5jbGllbnQsIHN0b3JlQ3VycmVudCk7CiAgICAgIGNvbnN0IHRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcyA9IChsaXZyYWlzb24gPT09IDEpCiAgICAgID8gYnVpbGRUZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3NQYXlsb2FkKHN0LnRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcywgc3RvcmVDdXJyZW50KQogICAgICA6IG51bGw7CgogICAgICBpZiAobGl2cmFpc29uID09PSAxKXsKICAgICAgICBjb25zdCBjbGllbnRDaXR5RXJyID0gdmFsaWRhdGVBbGxvd2VkRGVsaXZlcnlDaXR5Rm9yU2F2ZSh7CiAgICAgICAgICBzdG9yZUlkOiBzdG9yZUN1cnJlbnQsCiAgICAgICAgICBjaXR5OiBzdD8uY2xpZW50Py52aWxsZSwKICAgICAgICAgIHBvc3RhbENvZGU6IHN0Py5jbGllbnQ/LmNvZGVQb3N0YWwsCiAgICAgICAgICBsYWJlbDogIkFkcmVzc2UgY2xpZW50IiwKICAgICAgICB9KTsKICAgICAgICBpZiAoY2xpZW50Q2l0eUVycil7CiAgICAgICAgICBzaG93VG9hc3QoeyBtZXNzYWdlOiBjbGllbnRDaXR5RXJyLCBraW5kOiAiZXJyb3IiIH0pOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAodGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzKXsKICAgICAgICAgIGNvbnN0IHRlbXBDaXR5RXJyID0gdmFsaWRhdGVBbGxvd2VkRGVsaXZlcnlDaXR5Rm9yU2F2ZSh7CiAgICAgICAgICAgIHN0b3JlSWQ6IHN0b3JlQ3VycmVudCwKICAgICAgICAgICAgY2l0eTogdGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzLnZpbGxlLAogICAgICAgICAgICBwb3N0YWxDb2RlOiB0ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MuY29kZV9wb3N0YWwsCiAgICAgICAgICAgIGxhYmVsOiAiQWRyZXNzZSBwcm92aXNvaXJlIiwKICAgICAgICAgIH0pOwogICAgICAgICAgaWYgKHRlbXBDaXR5RXJyKXsKICAgICAgICAgICAgc2hvd1RvYXN0KHsgbWVzc2FnZTogdGVtcENpdHlFcnIsIGtpbmQ6ICJlcnJvciIgfSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICBjb25zdCBzdW1tYXJ5ID0gY29tcHV0ZU9yZGVyU3VtbWFyeShpdGVtcyk7CiAgICBjb25zdCBwcml4Q29tID0gcm91bmQyKHN1bW1hcnkudG90YWwpOwogICAgY29uc3QgbmJyUGl6emFzID0gYXNJbnQoc3VtbWFyeS5jb3VudCwgMCk7CgogICAgICAvLyDilIDilIAgUHJlLXZhbGlkYXRpb24gVUkgY2hlY2tzIChtb3JlIHdpbGwgYmUgYWRkZWQgbGF0ZXIpIOKUgOKUgAogICAgICAvLyBJZiBhIGNoZWNrIHJldHVybnMgZmFsc2UsIHdlIHN0b3AgdmFsaWRhdGlvbiB0byBsZXQgdGhlIG9wZXJhdG9yIGFkanVzdCB0aGUgYmFza2V0L29wdGlvbnMuCiAgICAgIHRyeXsKICAgICAgICBjb25zdCBva0NoZWNrcyA9IGF3YWl0IHJ1blByZVZhbGlkYXRlQ2hlY2tzKHsgc3RhdGU6IHN0LCBpdGVtcywgbGl2cmFpc29uLCBuYnJQaXp6YXMgfSk7CiAgICAgICAgaWYgKCFva0NoZWNrcykgcmV0dXJuOwogICAgICB9IGNhdGNoIChlKXsKICAgICAgICAvLyBEZWZlbnNpdmU6IG5ldmVyIGJsb2NrIHZhbGlkYXRpb24gb24gYSBVSSBjaGVjayBjcmFzaAogICAgICB9CgogICAgY29uc3QgcGF5bG9hZEl0ZW1zID0gW107CiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgaXRlbXMpewogICAgICBjb25zdCBwaWQgPSBwaWNrUG9zUGl6emFJZChsaW5lKTsKICAgICAgaWYgKCFwaWQpewogICAgICAgIHNob3dUb2FzdCh7IG1lc3NhZ2U6ICJJbXBvc3NpYmxlIGTigJllbnJlZ2lzdHJlcjogYXJ0aWNsZSBzYW5zIElEIiwga2luZDogImVycm9yIiB9KTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3Qgb3JkZXJlZElkID0gTnVtYmVyKGxpbmU/Lm9yZGVyZWRfaWQpOwogICAgICBwYXlsb2FkSXRlbXMucHVzaCh7CiAgICAgICAgaWRfcG9zX3BpenphczogcGlkLAogICAgICAgIGRhdGFfaWQ6IG1ha2VEYXRhSWRGcm9tTGluZShsaW5lKSwKICAgICAgICBjbGFzczogU3RyaW5nKGxpbmU/LmNsYXNzID8/ICIiKS50cmltKCkudG9Mb3dlckNhc2UoKSwKICAgICAgICBtb2RpZnM6IChTdHJpbmcobGluZT8uY2xhc3MgPz8gIiIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpID09PSAicGl6emEiKSA/IGJ1aWxkUGl6emFNb2RpZnMoeyBzdGF0ZTogc3QsIGxpbmUgfSkgOiBbXSwKICAgICAgICBvcmRlcmVkX2lkOiBOdW1iZXIuaXNGaW5pdGUob3JkZXJlZElkKSA/IG9yZGVyZWRJZCA6IG51bGwsCiAgICAgIH0pOwogICAgfQoKICAgICAgdHJ5ewogICAgICAgIGxldCByZXMgPSBudWxsOwoKICAgICAgaWYgKCFpc1VwZGF0ZU1vZGUpewogICAgICAgIHJlcyA9IGF3YWl0IHNhdmVPcmRlcih7CiAgICAgICAgICBzdG9yZTogc3RvcmVDdXJyZW50LAogICAgICAgICAgZGF0ZUlTTywKICAgICAgICAgIC8vIHNlcnZlciBjb21wdXRlcyBuZXh0IGlkX2RhdGU7IGtlZXAgdGhpcyBmb3IgZGVidWcvYmFja3dhcmQgY29tcGF0aWJpbGl0eQogICAgICAgICAgaWRfZGF0ZTogaWREYXRlLAogICAgICAgICAgaGV1cmVfcHJlcGFfaGhtbTogaGhtbSwKICAgICAgICAgIGNvdXBlLAogICAgICAgICAgbGl2cmFpc29uLAogICAgICAgICAgaWRfY2xpZW50OiBjbGllbnRJZCwKICAgICAgICAgIHBob25lTnVtYmVyLAogICAgICAgICAgY2xpZW50OiBjbGllbnRQYXlsb2FkLAogICAgICAgICAgdGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzLAogICAgICAgICAgbmJyX3BpenphczogbmJyUGl6emFzLAogICAgICAgICAgcHJpeF9jb206IHByaXhDb20sCiAgICAgICAgICB0b19wcmludDogMCwKICAgICAgICAgIGl0ZW1zOiBwYXlsb2FkSXRlbXMsCiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3Qgc25hcEl0ZW1zID0gQXJyYXkuaXNBcnJheShsb2FkZWRTbmFwc2hvdD8uaXRlbXMpID8gbG9hZGVkU25hcHNob3QuaXRlbXMgOiBbXTsKICAgICAgICBjb25zdCBpbml0aWFsQnlPcmRlcmVkSWQgPSBuZXcgTWFwKCk7CiAgICAgICAgZm9yIChjb25zdCBpdCBvZiBzbmFwSXRlbXMpewogICAgICAgICAgY29uc3Qgb2lkID0gTnVtYmVyKGl0Py5vcmRlcmVkX2lkKTsKICAgICAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUob2lkKSAmJiBvaWQgPiAwKSBpbml0aWFsQnlPcmRlcmVkSWQuc2V0KG9pZCwgaXQpOwogICAgICAgIH0KCiAgICAgICAgY29uc3QgY3VycmVudE9yZGVyZWRJZFNldCA9IG5ldyBTZXQoKTsKICAgICAgICBjb25zdCBhZGQgPSBbXTsKICAgICAgICBjb25zdCB1cGRhdGUgPSBbXTsKCiAgICAgICAgZm9yIChjb25zdCBpdCBvZiBwYXlsb2FkSXRlbXMpewogICAgICAgICAgY29uc3Qgb2lkID0gTnVtYmVyKGl0Py5vcmRlcmVkX2lkKTsKICAgICAgICAgIGNvbnN0IGxpbmVTaGFwZSA9IHsKICAgICAgICAgICAgaWRfcG9zX3BpenphczogaXQuaWRfcG9zX3BpenphcywKICAgICAgICAgICAgZGF0YV9pZDogaXQuZGF0YV9pZCwKICAgICAgICAgICAgY2xhc3M6IGl0LmNsYXNzLAogICAgICAgICAgICBtb2RpZnM6IGl0Lm1vZGlmcywKICAgICAgICAgIH07CiAgICAgICAgICBpZiAoTnVtYmVyLmlzRmluaXRlKG9pZCkgJiYgb2lkID4gMCAmJiBpbml0aWFsQnlPcmRlcmVkSWQuaGFzKG9pZCkpewogICAgICAgICAgICBjdXJyZW50T3JkZXJlZElkU2V0LmFkZChvaWQpOwogICAgICAgICAgICBjb25zdCBpbmkgPSBpbml0aWFsQnlPcmRlcmVkSWQuZ2V0KG9pZCk7CiAgICAgICAgICAgIGNvbnN0IGswID0gc3RhYmxlTGluZUtleUZvckNvbXBhcmUoewogICAgICAgICAgICAgIGlkX3Bvc19waXp6YXM6IGluaT8uaWRfcG9zX3BpenphcywKICAgICAgICAgICAgICBkYXRhX2lkOiBpbmk/LmRhdGFfaWQsCiAgICAgICAgICAgICAgY2xhc3NOYW1lOiBpbmk/LmNsYXNzLAogICAgICAgICAgICAgIG1vZGlmczogaW5pPy5tb2RpZnMsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjb25zdCBrMSA9IHN0YWJsZUxpbmVLZXlGb3JDb21wYXJlKHsKICAgICAgICAgICAgICBpZF9wb3NfcGl6emFzOiBsaW5lU2hhcGUuaWRfcG9zX3BpenphcywKICAgICAgICAgICAgICBkYXRhX2lkOiBsaW5lU2hhcGUuZGF0YV9pZCwKICAgICAgICAgICAgICBjbGFzc05hbWU6IGxpbmVTaGFwZS5jbGFzcywKICAgICAgICAgICAgICBtb2RpZnM6IGxpbmVTaGFwZS5tb2RpZnMsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAoazAgIT09IGsxKXsKICAgICAgICAgICAgICB1cGRhdGUucHVzaCh7IG9yZGVyZWRfaWQ6IG9pZCwgLi4ubGluZVNoYXBlIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhZGQucHVzaChsaW5lU2hhcGUpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgY29uc3QgZGVsID0gW107CiAgICAgICAgZm9yIChjb25zdCBbb2lkXSBvZiBpbml0aWFsQnlPcmRlcmVkSWQuZW50cmllcygpKXsKICAgICAgICAgIGlmICghY3VycmVudE9yZGVyZWRJZFNldC5oYXMob2lkKSkgZGVsLnB1c2goeyBvcmRlcmVkX2lkOiBvaWQgfSk7CiAgICAgICAgfQoKICAgICAgICAvLyBOby1vcCBndWFyZDogc3RpbGwgYWxsb3cgaGV1cmVfcHJlcGEgdXBkYXRlcyBldmVuIGlmIG5vIGxpbmUgY2hhbmdlZC4KICAgICAgICAvLyBDbGllbnQgcGF5bG9hZCBvbiBVUERBVEUgTVVTVCBiZSBtZXJnZS1wYXRjaCAobnVsbCBjbGVhcnM7IGFic2VudD1ubyBjaGFuZ2UpLgogICAgICAgIC8vIFByZWZlciB0aGUgb3JpZ2luYWxseSBsb2FkZWQgY3VzdG9tZXIgaWYgYXZhaWxhYmxlOyBmYWxsYmFjayB0byBsb2FkZWRDdXN0b21lclJhdy4KICAgICAgICBjb25zdCBvcmlnQ3VzdG9tZXIgPQogICAgICAgICAgKGxvYWRlZFNuYXBzaG90ICYmIHR5cGVvZiBsb2FkZWRTbmFwc2hvdCA9PT0gIm9iamVjdCIgJiYgbG9hZGVkU25hcHNob3Q/LmN1c3RvbWVyICYmIHR5cGVvZiBsb2FkZWRTbmFwc2hvdC5jdXN0b21lciA9PT0gIm9iamVjdCIpCiAgICAgICAgICAgID8gbG9hZGVkU25hcHNob3QuY3VzdG9tZXIKICAgICAgICAgICAgOiAoc3QubG9hZGVkQ3VzdG9tZXJSYXcgJiYgdHlwZW9mIHN0LmxvYWRlZEN1c3RvbWVyUmF3ID09PSAib2JqZWN0IiA/IHN0LmxvYWRlZEN1c3RvbWVyUmF3IDoge30pOwogICAgICAgIGNvbnN0IGNsaWVudFBhdGNoID0gYnVpbGRDbGllbnRQYXRjaFBheWxvYWQoc3QuY2xpZW50LCBvcmlnQ3VzdG9tZXIpOwoKICAgICAgICByZXMgPSBhd2FpdCB1cGRhdGVPcmRlcih7CiAgICAgICAgICBzdG9yZTogc3RvcmVVcGRhdGUsCiAgICAgICAgICBkYXRlSVNPLAogICAgICAgICAgaWQ6IE51bWJlcihsb2FkZWRNZXRhLmlkKSwKICAgICAgICAgIGlkX2RhdGU6IE51bWJlcihsb2FkZWRNZXRhLmlkX2RhdGUpLAogICAgICAgICAgaGV1cmVfcHJlcGFfaGhtbTogaGhtbSwKICAgICAgICAgIGNvdXBlLAogICAgICAgICAgbGl2cmFpc29uLAogICAgICAgICAgdGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzLAogICAgICAgICAgbmJyX3BpenphczogbmJyUGl6emFzLAogICAgICAgICAgcHJpeF9jb206IHByaXhDb20sCiAgICAgICAgICAvLyBFbnN1cmUgY2xpZW50IGVkaXRzIGFyZSBwZXJzaXN0ZWQgb24gVVBEQVRFIHRvbyAoc2FtZSBhcyBDUkVBVEUpCiAgICAgICAgICBwaG9uZU51bWJlciwKICAgICAgICAgIGNsaWVudDogY2xpZW50UGF0Y2gsCiAgICAgICAgICBkaWZmOiB7IGFkZCwgdXBkYXRlLCBkZWxldGU6IGRlbCB9LAogICAgICAgIH0pOwogICAgICB9CgogICAgICAgIGlmICghcmVzIHx8ICFyZXMub2spewogICAgICAgICAgc2hvd1RvYXN0KHsgbWVzc2FnZTogU3RyaW5nKHJlcz8ubWVzc2FnZSB8fCAiRXJyZXVyOiBjb21tYW5kZSBub24gZW5yZWdpc3Ryw6llIiksIGtpbmQ6ICJlcnJvciIgfSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBVWCBib251czogaW5qZWN0IGZpcnN0IG5hbWUgaW1tZWRpYXRlbHkgaW50byBsb2NhbCBmaXJzdC1uYW1lcyBjYWNoZSAoYXV0b2NvbXBsZXRlKS4KICAgICAgICB0cnl7CiAgICAgICAgICBjb25zdCBmbiA9IFN0cmluZyhzdD8uY2xpZW50Py5wcmVub20gPz8gIiIpLnRyaW0oKTsKICAgICAgICAgIGlmIChmbikgYWRkRmlyc3ROYW1lVG9DYWNoZSh7IHN0YXRlOiBzdCwgZmlyc3ROYW1lOiBmbiB9KTsKICAgICAgICB9IGNhdGNoIChfZSkge30KCiAgICAgICAgaWYgKCFpc1VwZGF0ZU1vZGUpewogICAgICAgICAgc2hvd1RvYXN0KHsgbWVzc2FnZTogYENvbW1hbmRlIGVucmVnaXN0csOpZSAoIyR7cmVzLm9yZGVyX2lkfSlgLCBraW5kOiAic3VjY2VzcyIgfSk7CiAgICAgICAgICBzdC50ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MgPSBudWxsOwogICAgICAgICAgLy8gQWZ0ZXIgQ1JFQVRFIHN1Y2Nlc3M6IGZ1bGwgcmVzZXQgKGNsaWVudCArIGJhc2tldCArIHNlYXJjaCkgKyBmb2N1cyBzZWFyY2guCiAgICAgICAgICBhd2FpdCBhZnRlck9yZGVyU2F2ZWRTdWNjZXNzKHsgc3RhdGU6IHN0IH0pOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgIHNob3dUb2FzdCh7IG1lc3NhZ2U6ICJDb21tYW5kZSBtb2RpZmnDqWUiLCBraW5kOiAic3VjY2VzcyIgfSk7CiAgICAgIHN0LnRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcyA9IG51bGw7CgogICAgICAvLyBBZnRlciBVUERBVEUgc3VjY2VzczogZnVsbCByZXNldCAoZXhpdCB1cGRhdGUgbW9kZSArIGNsZWFyIFVJKSArIGZvY3VzIHNlYXJjaC4KICAgICAgLy8gU3BlYzogcmVzZXQgb25seSBvbiBBUEkgc3VjY2Vzczsgb24gZXJyb3Igd2Uga2VlcCBldmVyeXRoaW5nIHRvIGFsbG93IGNvcnJlY3Rpb25zLgogICAgICAgIGF3YWl0IGFmdGVyT3JkZXJTYXZlZFN1Y2Nlc3MoeyBzdGF0ZTogc3QgfSk7CgogICAgICB9IGNhdGNoIChlKXsKICAgICAgICBjb25zb2xlLmVycm9yKGUpOwogICAgICAgIHNob3dUb2FzdCh7IG1lc3NhZ2U6IFN0cmluZyhlPy5wYXlsb2FkPy5tZXNzYWdlIHx8ICJFcnJldXIgQVBJOiBjb21tYW5kZSBub24gZW5yZWdpc3Ryw6llIiksIGtpbmQ6ICJlcnJvciIgfSk7CiAgICAgICAgdHJ5ewogICAgICAgICAgLy8gT3B0aW9uYWwgZmFsbGJhY2sgdG8gYSBibG9ja2luZyBhbGVydCAocmVxdWVzdGVkIOKAnG1vZGFsL2FsZXJ0ZeKAnSkKICAgICAgICAgIHdpbmRvdy5hbGVydChTdHJpbmcoZT8ucGF5bG9hZD8ubWVzc2FnZSB8fCAiRXJyZXVyOiBjb21tYW5kZSBub24gZW5yZWdpc3Ryw6llIikpOwogICAgICAgIH0gY2F0Y2ggKGVycikge30KICAgICAgfQogICAgfSBmaW5hbGx5IHsKICAgICAgLy8gQWx3YXlzIHJlbGVhc2UgdGhlIGluLWZsaWdodCBsb2NrLCBldmVuIGlmIGEgbW9kYWwgd2FzIGNhbmNlbGxlZCBvciBhbiBleGNlcHRpb24gb2NjdXJyZWQuCiAgICAgIHRyeSB7IHN0Ll9fdmFsaWRhdGlvbkluRmxpZ2h0ID0gZmFsc2U7IH0gY2F0Y2ggKGUpIHt9CiAgICB9CiAgfSk7Cn0K"
            },
            "after": {
                "exists": true,
                "kind": "file",
                "size": 28876,
                "sha1": "8684a20fa4593989e004dc8be0b1fc25c4e6c646",
                "content_b64": "LyogZ2xvYmFsIGRvY3VtZW50LCB3aW5kb3cgKi8KLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqLwovKiBkb2MtcHJvamVjdCB8IGNhaXNzZS1hcXAvcHVibGljL2Fzc2V0cy9qcy9hcHAtanMvYmluZGluZ3Mvc2F2ZU9yZGVyVmFsaWRhdGlvbi5qcyB8IFZhbGlkZSBldCBlbnJlZ2lzdHJlIHVuZSBjb21tYW5kZSwgaW50ZXJjZXB0ZSBsZXMgc2F1dmVnYXJkZXMgc3VyIHVuIGpvdXIgZGlmZsOpcmVudCBk4oCZYXVqb3VyZOKAmWh1aSB2aWEgdW5lIG1vZGFsZSBkw6lkacOpZSwgZ8OocmUgbGEgY3LDqWF0aW9uIG91IGxhIG1pc2Ugw6Agam91ciwgbGVzIGNvbnRyw7RsZXMgcHLDqWFsYWJsZXMsIGxhIHN5bmNocm9uaXNhdGlvbiBkZXMgZG9ubsOpZXMgY2xpZW50L2FydGljbGVzLCBsYSBwZXJzaXN0YW5jZSBkZSBs4oCZYWRyZXNzZSBkZSBsaXZyYWlzb24gcHJvdmlzb2lyZSBhdSBuaXZlYXUgY29tbWFuZGUgZXQgbWFzcXVlIGTDqXNvcm1haXMgbOKAmWFjdGlvbiByYXBpZGUg4oCcRGVtYWlu4oCdIHF1YW5kIGxhIGRhdGUgc8OpbGVjdGlvbm7DqWUgZXN0IGTDqWrDoCBkZW1haW4gZW4gZnVzZWF1IEV1cm9wZS9QYXJpcywgc2FucyBibG9xdWVyIGxhIHNhdXZlZ2FyZGUgc3VyIGxlIGNvdXBsZSBjb2RlIHBvc3RhbCAvIHZpbGxlLiB8IEV4cG9zZTogYmluZFNhdmVPcmRlclZhbGlkYXRpb24gfCBEw6lwZW5kIGRlOiAuLi8uLi9wb3Mvb3JkZXJTdW1tYXJ5LmpzLCAuLi8uLi9zZXJ2aWNlcy9hcGkvc2F2ZU9yZGVyQXBpLmpzLCAuLi8uLi9zZXJ2aWNlcy9hcGkvdXBkYXRlT3JkZXJBcGkuanMsIC4uLy4uL3VpL3RvYXN0LmpzLCAuLi8uLi91aS9kb20uanM/dHM9MjAyNjA0MDYtMSwgLi4vbG9hZGVycy9vcmRlcnNMb2FkZXIuanMsIC4uL2xvYWRlcnMvc2xvdEJhZGdlc0xvYWRlci5qcywgLi4vc3RhdGUvYWZ0ZXJPcmRlclNhdmVkU3VjY2Vzcy5qcywgLi4vc3RhdGUvcmVzZXQuanMsIC4uL2xvYWRlcnMvZmlyc3ROYW1lc0xvYWRlci5qcywgLi4vdmFsaWRhdGlvbnMvcHJlVmFsaWRhdGVDaGVja3MuanMsIC4uL3RpbWUvYWN0aXZlVGltZS5qcywgLi4vZGF0ZS9zZWxlY3RlZERhdGUuanMsIC4uLy4uL3V0aWxzL2RhdGUvcGFyaXMuanM/dHM9MjAyNjA0MDYtMSwgLi4vcGR2LmpzLCAuLi9hZGRyZXNzL2RlbGl2ZXJ5Q2l0eUNob2ljZXMuanMgfCBJbXBhY3RlOiDDqXRhdCBkZSBzZXNzaW9uIG3DqXRpZXIsIHBhbmllciwgY29tbWFuZGVzLCBVSSB0b2FzdC9tb2RhbGVzLCBjaGFuZ2VtZW50IGRlIGRhdGUgYXZhbnQgc2F1dmVnYXJkZSwgY2FjaGUgZGVzIHByw6lub21zLCBlbnZvaSBBUEksIHBlcnRpbmVuY2UgVVggZGVzIHJhY2NvdXJjaXMgZGUgZGF0ZSB8IFRhYmxlczogc3RkX2NsaWVudHMsIGNvbW1hbmRlcywgY29tbWFuZGVzX2l0ZW1zLCBwaXp6YXMsIGluZ3JlZGllbnRzLCBvcHRpb25zLCBwb3NfdGVtcF9hZHJlc3NlcyAqLwoKaW1wb3J0IHsgY29tcHV0ZU9yZGVyU3VtbWFyeSB9IGZyb20gIi4uLy4uL3Bvcy9vcmRlclN1bW1hcnkuanMiOwppbXBvcnQgeyBzYXZlT3JkZXIgfSBmcm9tICIuLi8uLi9zZXJ2aWNlcy9hcGkvc2F2ZU9yZGVyQXBpLmpzIjsKaW1wb3J0IHsgdXBkYXRlT3JkZXIgfSBmcm9tICIuLi8uLi9zZXJ2aWNlcy9hcGkvdXBkYXRlT3JkZXJBcGkuanMiOwppbXBvcnQgeyBzaG93VG9hc3QgfSBmcm9tICIuLi8uLi91aS90b2FzdC5qcyI7CmltcG9ydCB7IG9yZGVyRGF0ZUNvbmZpcm1Nb2RhbCB9IGZyb20gIi4uLy4uL3VpL2RvbS5qcyI7CmltcG9ydCB7IGxvYWREYWlseU9yZGVyVGFicyB9IGZyb20gIi4uL2xvYWRlcnMvb3JkZXJzTG9hZGVyLmpzIjsKaW1wb3J0IHsgbG9hZFNsb3RCYWRnZXMgfSBmcm9tICIuLi9sb2FkZXJzL3Nsb3RCYWRnZXNMb2FkZXIuanMiOwppbXBvcnQgeyBhZnRlck9yZGVyU2F2ZWRTdWNjZXNzIH0gZnJvbSAiLi4vc3RhdGUvYWZ0ZXJPcmRlclNhdmVkU3VjY2Vzcy5qcyI7CmltcG9ydCB7IGV4aXRMb2FkZWRPcmRlckVkaXRNb2RlS2VlcERyYWZ0IH0gZnJvbSAiLi4vc3RhdGUvcmVzZXQuanMiOwppbXBvcnQgeyBhZGRGaXJzdE5hbWVUb0NhY2hlIH0gZnJvbSAiLi4vbG9hZGVycy9maXJzdE5hbWVzTG9hZGVyLmpzIjsKaW1wb3J0IHsgcnVuUHJlVmFsaWRhdGVDaGVja3MgfSBmcm9tICIuLi92YWxpZGF0aW9ucy9wcmVWYWxpZGF0ZUNoZWNrcy5qcyI7CmltcG9ydCB7IHNldEFjdGl2ZVRpbWUsIGNsZWFyQWN0aXZlVGltZSB9IGZyb20gIi4uL3RpbWUvYWN0aXZlVGltZS5qcyI7CmltcG9ydCB7IGFwcGx5U2VsZWN0ZWREYXRlSVNPLCBzaGlmdElTT0RhdGUgfSBmcm9tICIuLi9kYXRlL3NlbGVjdGVkRGF0ZS5qcyI7CmltcG9ydCB7IGdldFBhcmlzVG9kYXlJU08sIGdldFBhcmlzVG9tb3Jyb3dJU08sIGZvcm1hdElTT0RhdGVTaG9ydE5vWWVhckZSIH0gZnJvbSAiLi4vLi4vdXRpbHMvZGF0ZS9wYXJpcy5qcz90cz0yMDI2MDQwNi0xIjsKaW1wb3J0IHsgc3RvcmVUb1N1ZmZpeCB9IGZyb20gIi4uL3Bkdi5qcyI7CmxldCBfX2JvdW5kID0gZmFsc2U7CgpmdW5jdGlvbiBhc0ludCh2LCBmYWxsYmFjayA9IDApewogIGNvbnN0IG4gPSBOdW1iZXIodik7CiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShuKSA/IChuIHwgMCkgOiBmYWxsYmFjazsKfQoKZnVuY3Rpb24gYm9vbDAxKHYpewogIHJldHVybiB2ID8gMSA6IDA7Cn0KCmZ1bmN0aW9uIGNsZWFuU3RyKHYsIG1heExlbiA9IG51bGwpewogIGxldCBzID0gU3RyaW5nKHYgPz8gIiIpLnRyaW0oKTsKICBpZiAoIXMpIHJldHVybiAiIjsKICBpZiAoTnVtYmVyLmlzRmluaXRlKE51bWJlcihtYXhMZW4pKSAmJiBtYXhMZW4gPiAwICYmIHMubGVuZ3RoID4gbWF4TGVuKXsKICAgIHMgPSBzLnNsaWNlKDAsIG1heExlbik7CiAgfQogIHJldHVybiBzOwp9CgpmdW5jdGlvbiBub3JtYWxpemVGb2xkTG9jYWwocyl7CiAgY29uc3Qgc3RyID0gU3RyaW5nKHMgPz8gIiIpOwogIHRyeXsKICAgIHJldHVybiBzdHIKICAgICAgLnRvTG93ZXJDYXNlKCkKICAgICAgLm5vcm1hbGl6ZSgiTkZEIikKICAgICAgLnJlcGxhY2UoL1tcdTAzMDAtXHUwMzZmXS9nLCAiIikKICAgICAgLnJlcGxhY2UoL1xzKy9nLCAiICIpCiAgICAgIC50cmltKCkKICAgICAgLnJlcGxhY2UoL15cK1xzKi8sICIiKTsKICB9IGNhdGNoIChlKXsKICAgIHJldHVybiBzdHIudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9ccysvZywgIiAiKS50cmltKCkucmVwbGFjZSgvXlwrXHMqLywgIiIpOwogIH0KfQoKZnVuY3Rpb24gcGFyc2VEaXNwbGF5TGluZUxhYmVsUHJpY2UodHh0KXsKICBjb25zdCBzID0gU3RyaW5nKHR4dCA/PyAiIikudHJpbSgpOwogIGlmICghcykgcmV0dXJuIG51bGw7CiAgLy8gTWF0Y2g6ICJMYWJlbCAoKzAsNTDigqwpIiAvICJMYWJlbCAoLTEuMDDigqwpIiAvICJMYWJlbCAoMCw1MOKCrCkiCiAgY29uc3QgbSA9IHMubWF0Y2goL14oLio/KVxzKlwoXHMqKFsrLV0/XGQrKD86Wy4sXVxkezEsMn0pPylccyrigqxccypcKVxzKiQvdSk7CiAgaWYgKCFtKXsKICAgIHJldHVybiB7IGxhYmVsOiBzLCBwcmljZTogbnVsbCB9OwogIH0KICBjb25zdCBsYWJlbCA9IFN0cmluZyhtWzFdID8/ICIiKS50cmltKCk7CiAgY29uc3QgbnVtID0gU3RyaW5nKG1bMl0gPz8gIiIpLnRyaW0oKS5yZXBsYWNlKCIsIiwgIi4iKTsKICBjb25zdCBwID0gTnVtYmVyKG51bSk7CiAgcmV0dXJuIHsKICAgIGxhYmVsOiBsYWJlbCB8fCBzLAogICAgcHJpY2U6IE51bWJlci5pc0Zpbml0ZShwKSA/IHAgOiBudWxsLAogIH07Cn0KCmZ1bmN0aW9uIGJ1aWxkRGlzcGxheUxpbmVJbmZvTWFwKGxpbmVzKXsKICBjb25zdCBsaXN0ID0gQXJyYXkuaXNBcnJheShsaW5lcykgPyBsaW5lcyA6IFtdOwogIGNvbnN0IG1hcCA9IG5ldyBNYXAoKTsKICBmb3IgKGNvbnN0IHJhdyBvZiBsaXN0KXsKICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlRGlzcGxheUxpbmVMYWJlbFByaWNlKHJhdyk7CiAgICBpZiAoIXBhcnNlZCkgY29udGludWU7CiAgICBjb25zdCBsYmwgPSBTdHJpbmcocGFyc2VkLmxhYmVsID8/ICIiKS50cmltKCk7CiAgICBpZiAoIWxibCkgY29udGludWU7CiAgICBjb25zdCBrID0gbm9ybWFsaXplRm9sZExvY2FsKGxibCk7CiAgICBpZiAoIWspIGNvbnRpbnVlOwoKICAgIGNvbnN0IGN1ciA9IG1hcC5nZXQoaykgfHwgbnVsbDsKICAgIGNvbnN0IG5leHRQcmljZSA9IChwYXJzZWQucHJpY2UgIT0gbnVsbCAmJiBOdW1iZXIuaXNGaW5pdGUocGFyc2VkLnByaWNlKSkgPyBwYXJzZWQucHJpY2UgOiBudWxsOwogICAgaWYgKCFjdXIpewogICAgICBtYXAuc2V0KGssIHsgbGFiZWw6IGxibCwgcHJpY2U6IG5leHRQcmljZSB9KTsKICAgIH0gZWxzZSBpZiAoY3VyLnByaWNlID09IG51bGwgJiYgbmV4dFByaWNlICE9IG51bGwpewogICAgICAvLyBVcGdyYWRlIHdpdGggYSBrbm93biBwcmljZSBpZiB3ZSBwcmV2aW91c2x5IG9ubHkgaGFkIGEgbGFiZWwKICAgICAgbWFwLnNldChrLCB7IGxhYmVsOiBjdXIubGFiZWwgfHwgbGJsLCBwcmljZTogbmV4dFByaWNlIH0pOwogICAgfQogIH0KICByZXR1cm4gbWFwOwp9CgpmdW5jdGlvbiBjbGVhbktleUxhYmVsKGspewogIHJldHVybiBTdHJpbmcoayA/PyAiIikudHJpbSgpLnJlcGxhY2UoL15uYW1lOi8sICIiKS5yZXBsYWNlKC9eaWQ6LywgIiIpLnRyaW0oKS5yZXBsYWNlKC9eXCtccyovLCAiIik7Cn0KCmZ1bmN0aW9uIG5vcm1hbGl6ZU1vZGlmc0ZvckNvbXBhcmUobW9kaWZzKXsKICBjb25zdCBsaXN0ID0gQXJyYXkuaXNBcnJheShtb2RpZnMpID8gbW9kaWZzIDogW107CiAgY29uc3Qgbm9ybSA9IGxpc3QubWFwKChtKSA9PiAoewogICAgbm9tX29wdGlvbjogU3RyaW5nKG0/Lm5vbV9vcHRpb24gPz8gIiIpLnRyaW0oKSwKICAgIGNsYXNzX29wdGlvbjogU3RyaW5nKG0/LmNsYXNzX29wdGlvbiA/PyAiIikudHJpbSgpLAogICAgZGF0YV9wcmljZTogKE51bWJlcihtPy5kYXRhX3ByaWNlID8/IDApIHx8IDApLAogIH0pKS5maWx0ZXIoKG0pID0+IG0ubm9tX29wdGlvbiAhPT0gIiIpOwogIG5vcm0uc29ydCgoYSwgYikgPT4gewogICAgY29uc3Qga2EgPSBgJHthLmNsYXNzX29wdGlvbn18JHthLm5vbV9vcHRpb259fCR7YS5kYXRhX3ByaWNlfWA7CiAgICBjb25zdCBrYiA9IGAke2IuY2xhc3Nfb3B0aW9ufXwke2Iubm9tX29wdGlvbn18JHtiLmRhdGFfcHJpY2V9YDsKICAgIHJldHVybiBrYS5sb2NhbGVDb21wYXJlKGtiKTsKICB9KTsKICByZXR1cm4gbm9ybTsKfQoKZnVuY3Rpb24gc3RhYmxlTGluZUtleUZvckNvbXBhcmUoeyBpZF9wb3NfcGl6emFzLCBkYXRhX2lkLCBjbGFzc05hbWUsIG1vZGlmcyB9ID0ge30pewogIGNvbnN0IHBpZCA9IE51bWJlcihpZF9wb3NfcGl6emFzKSB8fCAwOwogIGNvbnN0IGRpZCA9IFN0cmluZyhkYXRhX2lkID8/ICIiKS50cmltKCk7CiAgY29uc3QgY2xzID0gU3RyaW5nKGNsYXNzTmFtZSA/PyAiIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7CiAgY29uc3QgbSA9IG5vcm1hbGl6ZU1vZGlmc0ZvckNvbXBhcmUobW9kaWZzKTsKICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoeyBwaWQsIGRpZCwgY2xzLCBtIH0pOwp9CgpmdW5jdGlvbiBidWlsZENsaWVudFBheWxvYWRGb3JTYXZlKGNsaWVudCwgc3RvcmVJZCA9ICIiKXsKICBjb25zdCBjID0gKGNsaWVudCAmJiB0eXBlb2YgY2xpZW50ID09PSAib2JqZWN0IikgPyBjbGllbnQgOiB7fTsKICAvLyBOT1RFOgogIC8vIEJhY2tlbmQgbm93IHN1cHBvcnRzIG1lcmdlLXBhdGNoIHNlbWFudGljcyBmb3IgVVBEQVRFIG9mIHN0ZF9jbGllbnRzOgogIC8vIC0ga2V5IGFic2VudCA9PiBubyBjaGFuZ2UKICAvLyAtIGtleSBudWxsICAgPT4gY2xlYXIgKHNldCBOVUxMIC8gJycgZmFsbGJhY2spCiAgLy8gLSBub24tZW1wdHkgID0+IHNldAogIC8vIEZvciBTQVZFIChuZXcgb3JkZXIpLCB3ZSB1cHNlcnQgdGhlIGNsaWVudCB0b28uIElmIG9wZXJhdG9yIGNsZWFycyAicHJvYmxlbWUiCiAgLy8gd2UgTVVTVCBzZW5kIG51bGwgKG5vdCBlbXB0eSBzdHJpbmcpIHNvIHRoZSBEQiB2YWx1ZSBpcyBhY3R1YWxseSBjbGVhcmVkLgogIGNvbnN0IHByb2JsZW1lQ2xlYW4gPSBjbGVhblN0cihjLnByb2JsZW1lLCA1MDApOwogIHJldHVybiB7CiAgICAvLyBwaG9uZSBpcyBzdGlsbCBwYXNzZWQgYXQgdG9wLWxldmVsIGFzIHBob25lTnVtYmVyCiAgICBub21fcHJlbm9tOiBjbGVhblN0cihjLnByZW5vbSwgMTIwKSwKICAgIGFkcmVzc2U6IGNsZWFuU3RyKGMuYWRyZXNzZSwgMjU1KSwKICAgIGNvbXBsZW1lbnRfYWRyZXNzZTogY2xlYW5TdHIoYy5jb21wbGVtZW50QWRyZXNzZSwgMjU1KSwKICAgIGNvZGVfcG9zdGFsOiBjbGVhblN0cihjLmNvZGVQb3N0YWwsIDIwKSwKICAgIHZpbGxlOiBjbGVhblN0cihjLnZpbGxlLCAxMjApLAogICAgbnVtX3N1cHAxOiBjbGVhblN0cihjLm51bVBsdXMxLCAzMCksCiAgICBudW1fc3VwcDI6IGNsZWFuU3RyKGMubnVtUGx1czIsIDMwKSwKICAgIC8vIElNUE9SVEFOVDogZW1wdHkgPT4gbnVsbCBzbyB1cHNlcnQgY2xlYXJzIGV4aXN0aW5nIHZhbHVlIG9uIFNBVkUgdG9vLgogICAgcHJvYmxlbWU6IHByb2JsZW1lQ2xlYW4gPT09ICIiID8gbnVsbCA6IHByb2JsZW1lQ2xlYW4sCiAgfTsKfQoKZnVuY3Rpb24gbm9ybUNsaWVudFZhbHVlKHYsIG1heExlbil7CiAgY29uc3QgcyA9IGNsZWFuU3RyKHYsIG1heExlbik7CiAgcmV0dXJuIHM7Cn0KCmZ1bmN0aW9uIGdldE9yaWdDbGllbnRWYWx1ZShvcmlnLCBrZXlzKXsKICBjb25zdCBvID0gKG9yaWcgJiYgdHlwZW9mIG9yaWcgPT09ICJvYmplY3QiKSA/IG9yaWcgOiB7fTsKICBmb3IgKGNvbnN0IGsgb2Yga2V5cyl7CiAgICBpZiAob1trXSAhPSBudWxsKSByZXR1cm4gU3RyaW5nKG9ba10pOwogIH0KICByZXR1cm4gIiI7Cn0KCi8qKgogKiBCdWlsZCBhIE1FUkdFLVBBVENIIHBheWxvYWQgZm9yIGNsaWVudCBmaWVsZHMgb24gVVBEQVRFOgogKiAtIEFCU0VOVCBrZXkgPT4gbm8gY2hhbmdlCiAqIC0ga2V5OiBudWxsICA9PiBjbGVhcgogKiAtIGtleTogIngiICAgPT4gc2V0CiAqCiAqIFdlIGluY2x1ZGUgT05MWSBjaGFuZ2VkIGtleXMgKHZzIHRoZSBvcmlnaW5hbGx5IGxvYWRlZCBjbGllbnQpLgogKi8KZnVuY3Rpb24gYnVpbGRDbGllbnRQYXRjaFBheWxvYWQoY3VycmVudENsaWVudCwgb3JpZ2luYWxDbGllbnQpewogIGNvbnN0IGMgPSAoY3VycmVudENsaWVudCAmJiB0eXBlb2YgY3VycmVudENsaWVudCA9PT0gIm9iamVjdCIpID8gY3VycmVudENsaWVudCA6IHt9OwogIGNvbnN0IG8gPSAob3JpZ2luYWxDbGllbnQgJiYgdHlwZW9mIG9yaWdpbmFsQ2xpZW50ID09PSAib2JqZWN0IikgPyBvcmlnaW5hbENsaWVudCA6IHt9OwoKICBjb25zdCBkZWZzID0gWwogICAgeyBvdXQ6ICJub21fcHJlbm9tIiwgbWF4OiAxMjAsIGN1cktleXM6IFsicHJlbm9tIiwgIm5vbV9wcmVub20iXSwgb3JpZ0tleXM6IFsibm9tX3ByZW5vbSJdIH0sCiAgICB7IG91dDogImFkcmVzc2UiLCBtYXg6IDI1NSwgY3VyS2V5czogWyJhZHJlc3NlIl0sIG9yaWdLZXlzOiBbImFkcmVzc2UiXSB9LAogICAgeyBvdXQ6ICJjb21wbGVtZW50X2FkcmVzc2UiLCBtYXg6IDI1NSwgY3VyS2V5czogWyJjb21wbGVtZW50QWRyZXNzZSIsICJjb21wbGVtZW50X2FkcmVzc2UiXSwgb3JpZ0tleXM6IFsiY29tcGxlbWVudF9hZHJlc3NlIl0gfSwKICAgIHsgb3V0OiAiY29kZV9wb3N0YWwiLCBtYXg6IDIwLCBjdXJLZXlzOiBbImNvZGVQb3N0YWwiLCAiY29kZV9wb3N0YWwiXSwgb3JpZ0tleXM6IFsiY29kZV9wb3N0YWwiXSB9LAogICAgeyBvdXQ6ICJ2aWxsZSIsIG1heDogMTIwLCBjdXJLZXlzOiBbInZpbGxlIl0sIG9yaWdLZXlzOiBbInZpbGxlIl0gfSwKICAgIHsgb3V0OiAibnVtX3N1cHAxIiwgbWF4OiAzMCwgY3VyS2V5czogWyJudW1QbHVzMSIsICJudW1fc3VwcDEiXSwgb3JpZ0tleXM6IFsibnVtX3N1cHAxIl0gfSwKICAgIHsgb3V0OiAibnVtX3N1cHAyIiwgbWF4OiAzMCwgY3VyS2V5czogWyJudW1QbHVzMiIsICJudW1fc3VwcDIiXSwgb3JpZ0tleXM6IFsibnVtX3N1cHAyIl0gfSwKICAgIHsgb3V0OiAicHJvYmxlbWUiLCBtYXg6IDUwMCwgY3VyS2V5czogWyJwcm9ibGVtZSJdLCBvcmlnS2V5czogWyJwcm9ibGVtZSJdIH0sCiAgXTsKCiAgY29uc3QgcGF0Y2ggPSB7fTsKICBmb3IgKGNvbnN0IGQgb2YgZGVmcyl7CiAgICBjb25zdCBjdXJSYXcgPSBnZXRPcmlnQ2xpZW50VmFsdWUoYywgZC5jdXJLZXlzKTsKICAgIGNvbnN0IG9yaWdSYXcgPSBnZXRPcmlnQ2xpZW50VmFsdWUobywgZC5vcmlnS2V5cyk7CiAgICBjb25zdCBjdXIgPSBub3JtQ2xpZW50VmFsdWUoY3VyUmF3LCBkLm1heCk7CiAgICBjb25zdCBvcmlnID0gbm9ybUNsaWVudFZhbHVlKG9yaWdSYXcsIGQubWF4KTsKCiAgICBpZiAoY3VyID09PSBvcmlnKSBjb250aW51ZTsKICAgIGlmIChjdXIgPT09ICIiKSBwYXRjaFtkLm91dF0gPSBudWxsOyAgICAgIC8vIGV4cGxpY2l0IGNsZWFyCiAgICBlbHNlIHBhdGNoW2Qub3V0XSA9IGN1cjsgICAgICAgICAgICAgICAgICAgLy8gZXhwbGljaXQgc2V0CiAgfQogIHJldHVybiBwYXRjaDsKfQoKZnVuY3Rpb24gbWFrZURhdGFJZEZyb21MaW5lKGxpbmUpewogIGNvbnN0IGRpcmVjdCA9CiAgICAodHlwZW9mIGxpbmU/LmRhdGFfaWQgPT09ICJzdHJpbmciICYmIGxpbmUuZGF0YV9pZC50cmltKCkpID8gbGluZS5kYXRhX2lkLnRyaW0oKSA6CiAgICAodHlwZW9mIGxpbmU/LmRhdGFJZCA9PT0gInN0cmluZyIgJiYgbGluZS5kYXRhSWQudHJpbSgpKSA/IGxpbmUuZGF0YUlkLnRyaW0oKSA6CiAgICAiIjsKICBpZiAoZGlyZWN0KSByZXR1cm4gZGlyZWN0OwoKICBjb25zdCB1aWQgPSAodHlwZW9mIGxpbmU/LnVpZCA9PT0gInN0cmluZyIgJiYgbGluZS51aWQudHJpbSgpKSA/IGxpbmUudWlkLnRyaW0oKSA6ICIiOwogIGlmICh1aWQpewogICAgY29uc3Qgc2FmZSA9IHVpZC5yZXBsYWNlKC9bXmEtekEtWjAtOV8tXS9nLCAiLSIpOwogICAgcmV0dXJuIHNhZmUuc3RhcnRzV2l0aCgicGl6emEtIikgPyBzYWZlIDogYHBpenphLSR7c2FmZS5yZXBsYWNlKC9fL2csICItIil9YDsKICB9CiAgcmV0dXJuIGBwaXp6YS0ke0RhdGUubm93KCl9LSR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMCl9YDsKfQoKZnVuY3Rpb24gcGlja1Bvc1BpenphSWQobGluZSl7CiAgY29uc3QgY2FuZHMgPSBbCiAgICBsaW5lPy5waXp6YV9pZCwKICAgIGxpbmU/LnBpenphSWQsCiAgICBsaW5lPy5pZF9wb3NfcGl6emFzLAogICAgbGluZT8ucG9zX3Bpenphc19pZCwKICAgIGxpbmU/LmlkLAogIF07CiAgZm9yIChjb25zdCBjIG9mIGNhbmRzKXsKICAgIGNvbnN0IG4gPSBOdW1iZXIoYyk7CiAgICBpZiAoTnVtYmVyLmlzRmluaXRlKG4pICYmIG4gPiAwKSByZXR1cm4gKG4gfCAwKTsKICB9CiAgcmV0dXJuIG51bGw7Cn0KCmZ1bmN0aW9uIGJ1aWxkVGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzUGF5bG9hZCh0ZW1wQWRkcmVzcywgc3RvcmVJZCA9ICIiKXsKICBjb25zdCB0ID0gKHRlbXBBZGRyZXNzICYmIHR5cGVvZiB0ZW1wQWRkcmVzcyA9PT0gIm9iamVjdCIpID8gdGVtcEFkZHJlc3MgOiBudWxsOwogIGlmICghdCB8fCB0LmVuYWJsZWQgIT09IHRydWUpIHJldHVybiBudWxsOwogIGNvbnN0IHBheWxvYWQgPSB7CiAgICBlbmFibGVkOiAxLAogICAgYWRyZXNzZTogY2xlYW5TdHIodC5hZHJlc3NlLCAxOTApLAogICAgY29tcGxlbWVudF9hZHJlc3NlOiBjbGVhblN0cih0LmNvbXBsZW1lbnRBZHJlc3NlID8/IHQuY29tcGxlbWVudF9hZHJlc3NlLCAxOTApLAogICAgY29kZV9wb3N0YWw6IGNsZWFuU3RyKHQuY29kZVBvc3RhbCA/PyB0LmNvZGVfcG9zdGFsLCAyMCksCiAgICB2aWxsZTogY2xlYW5TdHIodC52aWxsZSwgMTIwKSwKICAgIGV4cGxpY2F0aW9uczogY2xlYW5TdHIodC5leHBsaWNhdGlvbnMsIDUwMCksCiAgICBudW1lcm9fdXJnZW5jZTogY2xlYW5TdHIodC5udW1lcm9VcmdlbmNlID8/IHQubnVtZXJvX3VyZ2VuY2UsIDMwKSwKICB9OwogIGNvbnN0IGhhc0FueSA9IE9iamVjdC5rZXlzKHBheWxvYWQpLnNvbWUoKGspID0+IGsgIT09ICJlbmFibGVkIiAmJiBTdHJpbmcocGF5bG9hZFtrXSA/PyAiIikudHJpbSgpICE9PSAiIik7CiAgcmV0dXJuIGhhc0FueSA/IHBheWxvYWQgOiBudWxsOwp9CgpmdW5jdGlvbiByb3VuZDIobil7CiAgY29uc3QgeCA9IE51bWJlcihuKTsKICBpZiAoIU51bWJlci5pc0Zpbml0ZSh4KSkgcmV0dXJuIDA7CiAgcmV0dXJuIE1hdGgucm91bmQoeCAqIDEwMCkgLyAxMDA7Cn0KCmZ1bmN0aW9uIGRpc3BhdGNoVUlSZW5kZXIoa2luZCl7CiAgdHJ5ewogICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInVpOnJlbmRlciIsIHsgZGV0YWlsOiB7IGtpbmQ6IFN0cmluZyhraW5kID8/ICIiKS50cmltKCkgfHwgInVua25vd24iIH0gfSkpOwogIH0gY2F0Y2ggKF9lKSB7fQp9Cgphc3luYyBmdW5jdGlvbiBjb25maXJtQW5kTWF5YmVDaGFuZ2VOb25Ub2RheURhdGUoeyBzdGF0ZSB9ID0ge30pewogIGNvbnN0IHN0ID0gKHN0YXRlICYmIHR5cGVvZiBzdGF0ZSA9PT0gIm9iamVjdCIpID8gc3RhdGUgOiBudWxsOwogIGlmICghc3QpIHJldHVybiB7IG9rOiB0cnVlIH07CgogIGNvbnN0IHNlbGVjdGVkRGF0ZUlTTyA9IFN0cmluZyhzdC5zZWxlY3RlZERhdGVJU08gPz8gIiIpLnRyaW0oKTsKICBjb25zdCB0b2RheUlTTyA9IGdldFBhcmlzVG9kYXlJU08oKTsKICBpZiAoIXNlbGVjdGVkRGF0ZUlTTyB8fCBzZWxlY3RlZERhdGVJU08gPT09IHRvZGF5SVNPKSByZXR1cm4geyBvazogdHJ1ZSB9OwoKICBjb25zdCB0b21vcnJvd0lTTyA9IGdldFBhcmlzVG9tb3Jyb3dJU08oKTsKICBjb25zdCBzaG93VG9tb3Jyb3dBY3Rpb24gPSBzZWxlY3RlZERhdGVJU08gIT09IHRvbW9ycm93SVNPOwogIGNvbnN0IHRhcmdldExhYmVsID0gZm9ybWF0SVNPRGF0ZVNob3J0Tm9ZZWFyRlIoc2VsZWN0ZWREYXRlSVNPKTsKICBjb25zdCBwaWNrZWQgPSBhd2FpdCBvcmRlckRhdGVDb25maXJtTW9kYWwoewogICAgdGl0bGU6ICJEYXRlIGRlIGNvbW1hbmRlIGRpZmbDqXJlbnRlIiwKICAgIGRhdGVJU086IHNlbGVjdGVkRGF0ZUlTTywKICAgIGRhdGVMYWJlbDogdGFyZ2V0TGFiZWwsCiAgICB0b2RheUlTTywKICAgIHRvbW9ycm93SVNPLAogICAgc2hvd1RvbW9ycm93QWN0aW9uLAogIH0pOwoKICBpZiAoIXBpY2tlZCB8fCBwaWNrZWQuYWN0aW9uID09PSAiY2FuY2VsIil7CiAgICByZXR1cm4geyBvazogZmFsc2UsIGNoYW5nZWREYXRlOiBmYWxzZSB9OwogIH0KICBpZiAocGlja2VkLmFjdGlvbiA9PT0gImNvbmZpcm0iKXsKICAgIHJldHVybiB7IG9rOiB0cnVlLCBjaGFuZ2VkRGF0ZTogZmFsc2UgfTsKICB9CgogIGNvbnN0IG5leHREYXRlSVNPID0gU3RyaW5nKHBpY2tlZC5kYXRlSVNPID8/ICIiKS50cmltKCk7CiAgaWYgKCEvXlxkezR9LVxkezJ9LVxkezJ9JC8udGVzdChuZXh0RGF0ZUlTTykpewogICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBjaGFuZ2VkRGF0ZTogZmFsc2UgfTsKICB9CgogIGFwcGx5U2VsZWN0ZWREYXRlSVNPKHsgc3RhdGU6IHN0LCBkYXRlSVNPOiBuZXh0RGF0ZUlTTyB9KTsKICBjbGVhckFjdGl2ZVRpbWUoeyBzdGF0ZTogc3QsIHNvdXJjZTogIm9yZGVyX2RhdGVfY2hhbmdlZF9iZWZvcmVfc2F2ZSIgfSk7CiAgZXhpdExvYWRlZE9yZGVyRWRpdE1vZGVLZWVwRHJhZnQoeyBzdGF0ZTogc3QgfSk7CiAgZGlzcGF0Y2hVSVJlbmRlcigib3JkZXJEYXRlQ2hhbmdlZEJlZm9yZVNhdmUiKTsKCiAgYXdhaXQgUHJvbWlzZS5hbGwoWwogICAgbG9hZERhaWx5T3JkZXJUYWJzKHsgc3RhdGU6IHN0IH0pLAogICAgbG9hZFNsb3RCYWRnZXMoeyBzdGF0ZTogc3QgfSksCiAgXSk7CgogIGRpc3BhdGNoVUlSZW5kZXIoIm9yZGVyRGF0ZUNoYW5nZWRCZWZvcmVTYXZlTG9hZGVkIik7CiAgc2hvd1RvYXN0KHsgbWVzc2FnZTogIkRhdGUgY2hhbmfDqWUuIENob2lzaXIgdW4gY3LDqW5lYXUgcG91ciBlbnJlZ2lzdHJlci4iLCBraW5kOiAic3VjY2VzcyIgfSk7CiAgcmV0dXJuIHsgb2s6IGZhbHNlLCBjaGFuZ2VkRGF0ZTogdHJ1ZSB9Owp9CgpmdW5jdGlvbiByZXNvbHZlUm93RnJvbUtleShrZXksIG1hcHMpewogIGNvbnN0IGsgPSBTdHJpbmcoa2V5ID8/ICIiKS50cmltKCk7CiAgaWYgKCFrKSByZXR1cm4gbnVsbDsKICBjb25zdCBpc0lkID0gay5zdGFydHNXaXRoKCJpZDoiKTsKICBjb25zdCByYXcgPSBrLnJlcGxhY2UoL15pZDovLCAiIikucmVwbGFjZSgvXm5hbWU6LywgIiIpLnRyaW0oKTsKICBpZiAoIXJhdykgcmV0dXJuIG51bGw7CgogIGlmIChtYXBzLmtpbmQgPT09ICJpbmdyZWRpZW50Iil7CiAgICBpZiAoaXNJZCl7CiAgICAgIGNvbnN0IGlkID0gTnVtYmVyKHJhdyk7CiAgICAgIHJldHVybiAoTnVtYmVyLmlzRmluaXRlKGlkKSAmJiBtYXBzLmJ5SWQpID8gKG1hcHMuYnlJZC5nZXQoaWQpIHx8IG51bGwpIDogbnVsbDsKICAgIH0KICAgIHJldHVybiBtYXBzLmJ5TmFtZSA/IChtYXBzLmJ5TmFtZS5nZXQoU3RyaW5nKHJhdykudG9Mb3dlckNhc2UoKSkgfHwgbnVsbCkgOiBudWxsOwogIH0KCiAgaWYgKG1hcHMua2luZCA9PT0gIm9wdGlvbiIpewogICAgaWYgKGlzSWQpewogICAgICBjb25zdCBpZCA9IE51bWJlcihyYXcpOwogICAgICByZXR1cm4gKE51bWJlci5pc0Zpbml0ZShpZCkgJiYgbWFwcy5ieUlkKSA/IChtYXBzLmJ5SWQuZ2V0KGlkKSB8fCBudWxsKSA6IG51bGw7CiAgICB9CiAgICAvLyBPcHRpb25zIG1heSBiZSBzdG9yZWQgd2l0aCAiKyAiIHByZWZpeCBpbiBEQi9jYXRhbG9nOyB0cnkgYSBmZXcgYWxpYXNlcy4KICAgIGNvbnN0IGJhc2UgPSBTdHJpbmcocmF3KS50b0xvd2VyQ2FzZSgpOwogICAgcmV0dXJuICgKICAgICAgKG1hcHMuYnlOYW1lID8gbWFwcy5ieU5hbWUuZ2V0KGJhc2UpIDogbnVsbCkgfHwKICAgICAgKG1hcHMuYnlOYW1lID8gbWFwcy5ieU5hbWUuZ2V0KGArICR7YmFzZX1gKSA6IG51bGwpIHx8CiAgICAgIChtYXBzLmJ5TmFtZSA/IG1hcHMuYnlOYW1lLmdldChgKyR7YmFzZX1gKSA6IG51bGwpIHx8CiAgICAgIG51bGwKICAgICk7CiAgfQoKICByZXR1cm4gbnVsbDsKfQoKZnVuY3Rpb24gYnVpbGRQaXp6YU1vZGlmcyh7IHN0YXRlLCBsaW5lIH0gPSB7fSl7CiAgY29uc3QgbCA9IChsaW5lICYmIHR5cGVvZiBsaW5lID09PSAib2JqZWN0IikgPyBsaW5lIDogbnVsbDsKICBpZiAoIWwgfHwgbC5jbGFzcyAhPT0gInBpenphIikgcmV0dXJuIFtdOwoKICBjb25zdCBpZHggPSAoc3RhdGUgJiYgdHlwZW9mIHN0YXRlID09PSAib2JqZWN0IiAmJiBzdGF0ZS5jYXRhbG9nSW5kZXggJiYgdHlwZW9mIHN0YXRlLmNhdGFsb2dJbmRleCA9PT0gIm9iamVjdCIpCiAgICA/IHN0YXRlLmNhdGFsb2dJbmRleAogICAgOiBudWxsOwoKICBjb25zdCBpbmdyZWRpZW50TWFwcyA9IHsKICAgIGtpbmQ6ICJpbmdyZWRpZW50IiwKICAgIGJ5SWQ6IChpZHg/LmluZ3JlZGllbnRCeUlkIGluc3RhbmNlb2YgTWFwKSA/IGlkeC5pbmdyZWRpZW50QnlJZCA6IG51bGwsCiAgICBieU5hbWU6IChpZHg/LmluZ3JlZGllbnRCeU5hbWUgaW5zdGFuY2VvZiBNYXApID8gaWR4LmluZ3JlZGllbnRCeU5hbWUgOiBudWxsLAogIH07CiAgY29uc3Qgb3B0aW9uTWFwcyA9IHsKICAgIGtpbmQ6ICJvcHRpb24iLAogICAgYnlJZDogKGlkeD8ub3B0aW9uQnlJZCBpbnN0YW5jZW9mIE1hcCkgPyBpZHgub3B0aW9uQnlJZCA6IG51bGwsCiAgICBieU5hbWU6IChpZHg/Lm9wdGlvbkJ5TmFtZSBpbnN0YW5jZW9mIE1hcCkgPyBpZHgub3B0aW9uQnlOYW1lIDogbnVsbCwKICB9OwoKICAvLyBVc2UgVUkgbGluZXMgYXMgc291cmNlLW9mLXRydXRoIGZhbGxiYWNrIGZvciBwcmljZXMgKHJvYnVzdCBmb3IgaW1wb3J0ZWQgb3JkZXJzCiAgLy8gKyBmcmVlLXRleHQgaXRlbXMgbm90IHByZXNlbnQgaW4gdGhlIGNhdGFsb2cpLgogIGNvbnN0IGFkZGVkSW5mb0J5TGFiZWwgPSBidWlsZERpc3BsYXlMaW5lSW5mb01hcChsLmFkZGVkSW5ncmVkaWVudExpbmVzKTsKICBjb25zdCBvcHRJbmZvQnlMYWJlbCA9IGJ1aWxkRGlzcGxheUxpbmVJbmZvTWFwKGwuc2VsZWN0ZWRPcHRpb25MaW5lcyk7CgogIGNvbnN0IG91dCA9IFtdOwoKICAvLyBNYW51YWwgZXh0cmEgLyByZWR1Y3Rpb24gb24gcGl6emEgKG11bHRpLWVudHJ5KQogIGNvbnN0IG1hbnVhbEV4dHJhcyA9IEFycmF5LmlzQXJyYXkobC5tYW51YWxFeHRyYXMpID8gbC5tYW51YWxFeHRyYXMgOiBbXTsKICBpZiAobWFudWFsRXh0cmFzLmxlbmd0aCl7CiAgICBmb3IgKGNvbnN0IGl0IG9mIG1hbnVhbEV4dHJhcyl7CiAgICAgIGNvbnN0IGxibCA9IFN0cmluZyhpdD8ubGFiZWwgPz8gIiIpLnRyaW0oKTsKICAgICAgY29uc3QgYW10ID0gTnVtYmVyKGl0Py5hbW91bnQpOwogICAgICBjb25zdCBhID0gTnVtYmVyLmlzRmluaXRlKGFtdCkgPyBhbXQgOiAwOwogICAgICBpZiAoIWxibCAmJiBhID09PSAwKSBjb250aW51ZTsKICAgICAgb3V0LnB1c2goewogICAgICAgIG5vbV9vcHRpb246IGxibCB8fCAoYSA8IDAgPyAiUsOpZHVjdGlvbiIgOiAiRXh0cmEiKSwKICAgICAgICBjbGFzc19vcHRpb246ICJleHRyYS1pdGVtIiwKICAgICAgICBkYXRhX3ByaWNlOiByb3VuZDIoYSksCiAgICAgIH0pOwogICAgfQogIH0gZWxzZSB7CiAgICAvLyBMZWdhY3kgc2luZ2xlIGV4dHJhIC8gcmVkdWN0aW9uCiAgICBjb25zdCBleHRyYUxibCA9IFN0cmluZyhsLmV4dHJhTGFiZWwgPz8gIiIpLnRyaW0oKTsKICAgIGNvbnN0IGV4dHJhQW10ID0gTnVtYmVyKGwuZXh0cmFBbW91bnQpOwogICAgaWYgKChleHRyYUxibCAmJiBleHRyYUxibCAhPT0gIiIpIHx8IChOdW1iZXIuaXNGaW5pdGUoZXh0cmFBbXQpICYmIGV4dHJhQW10ICE9PSAwKSl7CiAgICAgIG91dC5wdXNoKHsKICAgICAgICBub21fb3B0aW9uOiBleHRyYUxibCB8fCAoZXh0cmFBbXQgPCAwID8gIlLDqWR1Y3Rpb24iIDogIkV4dHJhIiksCiAgICAgICAgY2xhc3Nfb3B0aW9uOiAiZXh0cmEtaXRlbSIsCiAgICAgICAgZGF0YV9wcmljZTogcm91bmQyKE51bWJlci5pc0Zpbml0ZShleHRyYUFtdCkgPyBleHRyYUFtdCA6IDApLAogICAgICB9KTsKICAgIH0KICB9CgogIC8vIEFkZGVkIGluZ3JlZGllbnRzCiAgY29uc3QgYWRkZWQgPSBBcnJheS5pc0FycmF5KGwuYWRkZWRJbmdyZWRpZW50cykgPyBsLmFkZGVkSW5ncmVkaWVudHMgOiBbXTsKICBmb3IgKGNvbnN0IGsgb2YgYWRkZWQpewogICAgY29uc3Qgcm93ID0gcmVzb2x2ZVJvd0Zyb21LZXkoaywgaW5ncmVkaWVudE1hcHMpOwogICAgY29uc3Qga2V5TGFiZWwgPSBjbGVhbktleUxhYmVsKGspOwogICAgY29uc3QgaW5mbyA9IGtleUxhYmVsID8gKGFkZGVkSW5mb0J5TGFiZWwuZ2V0KG5vcm1hbGl6ZUZvbGRMb2NhbChrZXlMYWJlbCkpIHx8IG51bGwpIDogbnVsbDsKICAgIGNvbnN0IG5hbWUgPQogICAgICBTdHJpbmcoaW5mbz8ubGFiZWwgPz8gIiIpLnRyaW0oKSB8fAogICAgICBTdHJpbmcocm93Py5pbmdyZWRpZW50X25hbWUgPz8gIiIpLnRyaW0oKSB8fAogICAgICBrZXlMYWJlbDsKICAgIGlmICghbmFtZSkgY29udGludWU7CiAgICBjb25zdCBwcmljZUZyb21VSSA9IChpbmZvICYmIE51bWJlci5pc0Zpbml0ZShOdW1iZXIoaW5mby5wcmljZSkpKSA/IE51bWJlcihpbmZvLnByaWNlKSA6IG51bGw7CiAgICBjb25zdCBwcmljZUZyb21DYXRhbG9nID0gTnVtYmVyKHJvdz8uaW5ncmVkaWVudF9wcmljZSk7CiAgICBjb25zdCBwcmljZSA9CiAgICAgIChwcmljZUZyb21VSSAhPSBudWxsKQogICAgICAgID8gcHJpY2VGcm9tVUkKICAgICAgICA6IChOdW1iZXIuaXNGaW5pdGUocHJpY2VGcm9tQ2F0YWxvZykgPyBwcmljZUZyb21DYXRhbG9nIDogMCk7CiAgICBvdXQucHVzaCh7CiAgICAgIG5vbV9vcHRpb246IG5hbWUsCiAgICAgIGNsYXNzX29wdGlvbjogImluZ3JlZGllbnQtaXRlbSIsCiAgICAgIGRhdGFfcHJpY2U6IHJvdW5kMihOdW1iZXIuaXNGaW5pdGUocHJpY2UpID8gcHJpY2UgOiAwKSwKICAgIH0pOwogIH0KCiAgLy8gU2VsZWN0ZWQgb3B0aW9ucwogIGNvbnN0IG9wdHMgPSBBcnJheS5pc0FycmF5KGwuc2VsZWN0ZWRPcHRpb25zKSA/IGwuc2VsZWN0ZWRPcHRpb25zIDogW107CiAgZm9yIChjb25zdCBrIG9mIG9wdHMpewogICAgY29uc3Qgcm93ID0gcmVzb2x2ZVJvd0Zyb21LZXkoaywgb3B0aW9uTWFwcyk7CiAgICBjb25zdCBrZXlMYWJlbCA9IGNsZWFuS2V5TGFiZWwoayk7CiAgICBjb25zdCBpbmZvID0ga2V5TGFiZWwgPyAob3B0SW5mb0J5TGFiZWwuZ2V0KG5vcm1hbGl6ZUZvbGRMb2NhbChrZXlMYWJlbCkpIHx8IG51bGwpIDogbnVsbDsKICAgIGNvbnN0IG5hbWUgPQogICAgICBTdHJpbmcoaW5mbz8ubGFiZWwgPz8gIiIpLnRyaW0oKSB8fAogICAgICBTdHJpbmcocm93Py5vcHRpb25fbmFtZSA/PyAiIikudHJpbSgpIHx8CiAgICAgIGtleUxhYmVsOwogICAgaWYgKCFuYW1lKSBjb250aW51ZTsKICAgIGNvbnN0IHByaWNlRnJvbVVJID0gKGluZm8gJiYgTnVtYmVyLmlzRmluaXRlKE51bWJlcihpbmZvLnByaWNlKSkpID8gTnVtYmVyKGluZm8ucHJpY2UpIDogbnVsbDsKICAgIGNvbnN0IHByaWNlRnJvbUNhdGFsb2cgPSBOdW1iZXIocm93Py5wcmljZV9hZGp1c3RtZW50KTsKICAgIGNvbnN0IHByaWNlID0KICAgICAgKHByaWNlRnJvbVVJICE9IG51bGwpCiAgICAgICAgPyBwcmljZUZyb21VSQogICAgICAgIDogKE51bWJlci5pc0Zpbml0ZShwcmljZUZyb21DYXRhbG9nKSA/IHByaWNlRnJvbUNhdGFsb2cgOiAwKTsKICAgIG91dC5wdXNoKHsKICAgICAgbm9tX29wdGlvbjogbmFtZSwKICAgICAgY2xhc3Nfb3B0aW9uOiAib3B0aW9uLWl0ZW0iLAogICAgICBkYXRhX3ByaWNlOiByb3VuZDIoTnVtYmVyLmlzRmluaXRlKHByaWNlKSA/IHByaWNlIDogMCksCiAgICB9KTsKICB9CgogIC8vIFJlbW92ZWQgaW5ncmVkaWVudHMgKG5vIHByaWNlIGltcGFjdCwgYnV0IGtlZXAgaW5mbyBmb3Iga2l0Y2hlbikKICBjb25zdCByZW1vdmVkTmFtZXMgPSBBcnJheS5pc0FycmF5KGwucmVtb3ZlZEluZ3JlZGllbnROYW1lcykgPyBsLnJlbW92ZWRJbmdyZWRpZW50TmFtZXMgOiBbXTsKICBjb25zdCByZW1vdmVkS2V5cyA9IEFycmF5LmlzQXJyYXkobC5yZW1vdmVkSW5ncmVkaWVudHMpID8gbC5yZW1vdmVkSW5ncmVkaWVudHMgOiBbXTsKICBjb25zdCByZW1vdmVkTGlzdCA9IHJlbW92ZWROYW1lcy5sZW5ndGggPyByZW1vdmVkTmFtZXMgOiByZW1vdmVkS2V5czsKICBmb3IgKGNvbnN0IGsgb2YgcmVtb3ZlZExpc3QpewogICAgY29uc3QgYXNLZXkgPSBTdHJpbmcoayA/PyAiIikudHJpbSgpOwogICAgaWYgKCFhc0tleSkgY29udGludWU7CiAgICBjb25zdCByb3cgPSByZXNvbHZlUm93RnJvbUtleShhc0tleSwgaW5ncmVkaWVudE1hcHMpOwogICAgY29uc3QgbmFtZSA9IFN0cmluZyhyb3c/LmluZ3JlZGllbnRfbmFtZSA/PyAiIikudHJpbSgpIHx8IGFzS2V5LnJlcGxhY2UoL15uYW1lOi8sICIiKS5yZXBsYWNlKC9eaWQ6LywgIiIpLnRyaW0oKTsKICAgIGlmICghbmFtZSkgY29udGludWU7CiAgICBvdXQucHVzaCh7CiAgICAgIG5vbV9vcHRpb246IG5hbWUsCiAgICAgIGNsYXNzX29wdGlvbjogInJlbW92ZWQtaXRlbSIsCiAgICAgIGRhdGFfcHJpY2U6IDAsCiAgICB9KTsKICB9CgogIHJldHVybiBvdXQ7Cn0KCmV4cG9ydCBmdW5jdGlvbiBiaW5kU2F2ZU9yZGVyVmFsaWRhdGlvbih7IHN0YXRlLCByZWZyZXNoUmlnaHRQYW5lbE9ubHkgfSA9IHt9KXsKICBpZiAoX19ib3VuZCkgcmV0dXJuOwogIF9fYm91bmQgPSB0cnVlOwoKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJvcmRlcjp2YWxpZGF0ZSIsIGFzeW5jIChldikgPT4gewogICAgY29uc3Qgc3QgPSBzdGF0ZSAmJiB0eXBlb2Ygc3RhdGUgPT09ICJvYmplY3QiID8gc3RhdGUgOiBudWxsOwogICAgaWYgKCFzdCkgcmV0dXJuOwogICAgLy8gR3VhcmQ6IHByZXZlbnQgY29uY3VycmVudC9kb3VibGUgdmFsaWRhdGlvbiAoZG91YmxlIGNsaWNrIC8gZHVwbGljYXRlZCBldmVudCBkaXNwYXRjaCkuCiAgICAvLyBXaXRob3V0IHRoaXMsIHByZS12YWxpZGF0ZSBtb2RhbHMgKG9mZmVyZWQgZHJpbmtzLCBzbG90IHJlcXVpcmVkKSBjYW4gcmVvcGVuIGV2ZW4gaWYKICAgIC8vIHRoZSBmaXJzdCB2YWxpZGF0aW9uIGZsb3cgYWxyZWFkeSBhZGRlZCB0aGUgcmVxdWlyZWQgaXRlbXMuCiAgICBpZiAoc3QuX192YWxpZGF0aW9uSW5GbGlnaHQgPT09IHRydWUpIHJldHVybjsKICAgIHN0Ll9fdmFsaWRhdGlvbkluRmxpZ2h0ID0gdHJ1ZTsKCiAgICB0cnl7CiAgICAgIC8vIElNUE9SVEFOVDogbmV2ZXIgcGFyc2UgUERWIGxhYmVsIHRleHQgKGFjY2VudCBsaWtlICJQw6lsaXNzYW5uZSIgYnJlYWtzIGluY2x1ZGVzKCJwZWwiKSkuCiAgICAgIC8vIFVzZSB0aGUgc2luZ2xlIHNvdXJjZS1vZi10cnV0aCBtYXBwZXIgdXNlZCBldmVyeXdoZXJlIGVsc2UgaW4gdGhlIGFwcC4KICAgICAgY29uc3Qgc3RvcmVDdXJyZW50ID0gc3RvcmVUb1N1ZmZpeChldj8uZGV0YWlsPy5wZHZDdXJyZW50KTsKCiAgICAgIGNvbnN0IGl0ZW1zID0gQXJyYXkuaXNBcnJheShzdC5hZGRlZEl0ZW1zKSA/IHN0LmFkZGVkSXRlbXMgOiBbXTsKICAgICAgaWYgKCFpdGVtcy5sZW5ndGgpewogICAgICAgIHNob3dUb2FzdCh7IG1lc3NhZ2U6ICJQYW5pZXIgdmlkZSIsIGtpbmQ6ICJlcnJvciIgfSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgLy8gSWYgYW4gb3JkZXIgaXMgbG9hZGVkLCB3ZSBhcmUgaW4gInVwZGF0ZSBleGlzdGluZyBvcmRlciIgbW9kZS4KICAgIGNvbnN0IGxvYWRlZE1ldGEgPSAoc3QubG9hZGVkT3JkZXJNZXRhICYmIHR5cGVvZiBzdC5sb2FkZWRPcmRlck1ldGEgPT09ICJvYmplY3QiKSA/IHN0LmxvYWRlZE9yZGVyTWV0YSA6IG51bGw7CiAgICBjb25zdCBsb2FkZWRTbmFwc2hvdCA9IChzdC5sb2FkZWRPcmRlclNuYXBzaG90ICYmIHR5cGVvZiBzdC5sb2FkZWRPcmRlclNuYXBzaG90ID09PSAib2JqZWN0IikgPyBzdC5sb2FkZWRPcmRlclNuYXBzaG90IDogbnVsbDsKICAgIGNvbnN0IGlzVXBkYXRlTW9kZSA9ICEhKGxvYWRlZE1ldGEgJiYgTnVtYmVyKGxvYWRlZE1ldGE/LmlkKSA+IDAgJiYgTnVtYmVyKGxvYWRlZE1ldGE/LmlkX2RhdGUpID4gMCAmJiB0eXBlb2YgbG9hZGVkTWV0YT8uZGF0ZUlTTyA9PT0gInN0cmluZyIpOwogICAgLy8gSW4gVVBEQVRFIG1vZGUsIGFsd2F5cyB1c2UgdGhlIHN0b3JlIG9mIHRoZSBsb2FkZWQgb3JkZXIgdG8gYXZvaWQgbWlzbWF0Y2hlcwogICAgLy8gKGVnOiBvcGVyYXRvciB0b2dnbGVzIFBEViBhZnRlciBzZWxlY3RpbmcvbG9hZGluZyBhbiBvcmRlcikuCiAgICBjb25zdCBzdG9yZVVwZGF0ZSA9IChpc1VwZGF0ZU1vZGUgJiYgdHlwZW9mIGxvYWRlZE1ldGE/LnN0b3JlID09PSAic3RyaW5nIiAmJiAvXihsYW58cGVsKSQvLnRlc3QobG9hZGVkTWV0YS5zdG9yZSkpCiAgICAgID8gbG9hZGVkTWV0YS5zdG9yZQogICAgICA6IHN0b3JlQ3VycmVudDsKCiAgICAvLyBpZF9kYXRlIGlzIG5vdyBhc3NpZ25lZCBzZXJ2ZXItc2lkZSAobmV4dCBhdmFpbGFibGUgZm9yIHRoZSBkYXkgYmFzZWQgb24gaGV1cmVfcHJlcGEpLgogICAgLy8gS2VlcCBzZW5kaW5nIHRoZSBjdXJyZW50IFVJIHRhYiB2YWx1ZSBpZiBwcmVzZW50IChkZWJ1ZyksIGJ1dCBkbyBub3QgYmxvY2sgdmFsaWRhdGlvbiBvbiBpdC4KICAgIGNvbnN0IGlkRGF0ZSA9IGFzSW50KHN0LmFjdGl2ZU51bWJlciwgMCk7CgogICAgY29uc3QgZGF0ZUlTTyA9ICh0eXBlb2Ygc3Quc2VsZWN0ZWREYXRlSVNPID09PSAic3RyaW5nIiAmJiAvXlxkezR9LVxkezJ9LVxkezJ9JC8udGVzdChzdC5zZWxlY3RlZERhdGVJU08pKQogICAgICA/IHN0LnNlbGVjdGVkRGF0ZUlTTwogICAgICA6ICIiOwoKICAgIGNvbnN0IGRhdGVHdWFyZCA9IGF3YWl0IGNvbmZpcm1BbmRNYXliZUNoYW5nZU5vblRvZGF5RGF0ZSh7IHN0YXRlOiBzdCB9KTsKICAgIGlmICghZGF0ZUd1YXJkPy5vaykgcmV0dXJuOwoKICAgIC8vIENvbnN0cmFpbnQ6IHVwZGF0ZSBtdXN0IHN0YXkgb24gdGhlIHNhbWUgZGF5IChpZF9kYXRlIGltbXV0YWJsZSkKICAgIGlmIChpc1VwZGF0ZU1vZGUpewogICAgICBjb25zdCBtZXRhRGF0ZSA9IFN0cmluZyhsb2FkZWRNZXRhLmRhdGVJU08gPz8gIiIpLnRyaW0oKTsKICAgICAgaWYgKG1ldGFEYXRlICYmIGRhdGVJU08gJiYgbWV0YURhdGUgIT09IGRhdGVJU08pewogICAgICAgIHNob3dUb2FzdCh7IG1lc3NhZ2U6ICJJbXBvc3NpYmxlOiB1bmUgY29tbWFuZGUgbW9kaWZpw6llIGRvaXQgcmVzdGVyIHN1ciBsZSBtw6ptZSBqb3VyLiIsIGtpbmQ6ICJlcnJvciIgfSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CgogICAgLy8gYWN0aXZlVGltZSBjYW4gYmUgIkhIOk1NIiwgb3IgYW4gb2JqZWN0IHdpdGgge3RpbWV9LCBldGMuCiAgICBsZXQgaGhtbSA9ICIiOwogICAgaWYgKHR5cGVvZiBzdC5hY3RpdmVUaW1lID09PSAic3RyaW5nIikgaGhtbSA9IHN0LmFjdGl2ZVRpbWUudHJpbSgpOwogICAgZWxzZSBpZiAoc3QuYWN0aXZlVGltZSAmJiB0eXBlb2Ygc3QuYWN0aXZlVGltZSA9PT0gIm9iamVjdCIgJiYgdHlwZW9mIHN0LmFjdGl2ZVRpbWUudGltZSA9PT0gInN0cmluZyIpIGhobW0gPSBzdC5hY3RpdmVUaW1lLnRpbWUudHJpbSgpOwoKICAgIC8vIFJlcXVpcmVtZW50OiBpZiBubyBzbG90IGlzIHNlbGVjdGVkLCBzaG93IGEgYmxvY2tpbmcgbW9kYWwgd2l0aCB0aGUgU0FNRSB1cGRhdGVkIGNoaXBzIGJhci4KICAgIC8vIFBpY2tpbmcgYSBzbG90IGZyb20gdGhlIG1vZGFsIGltbWVkaWF0ZWx5IHZhbGlkYXRlcyB0aGUgb3JkZXIuCiAgICBpZiAoIS9eXGR7Mn06XGR7Mn0kLy50ZXN0KGhobW0pKXsKICAgICAgdHJ5ewogICAgICAgIGNvbnN0IHsgdGltZVNsb3RSZXF1aXJlZE1vZGFsIH0gPSBhd2FpdCBpbXBvcnQoIi4uLy4uL3VpL2RvbS5qcyIpOwogICAgICAgIGNvbnN0IHNlbCA9IGF3YWl0IHRpbWVTbG90UmVxdWlyZWRNb2RhbCh7CiAgICAgICAgICBzdGF0ZTogc3QsCiAgICAgICAgICB0aW1lQmFkZ2VzOiBBcnJheS5pc0FycmF5KHN0LnRpbWVCYWRnZXMpID8gc3QudGltZUJhZGdlcyA6IFtdLAogICAgICAgICAgdGl0bGU6ICJIb3JhaXJlIHJlcXVpcyIsCiAgICAgICAgICBtZXNzYWdlOiAiSWwgZmF1dCBzw6lsZWN0aW9ubmVyIHVuZSBoZXVyZSBwb3VyIGNldHRlIGNvbW1hbmRlIiwKICAgICAgICB9KTsKICAgICAgICBpZiAoIXNlbD8ub2sgfHwgIS9eXGR7Mn06XGR7Mn0kLy50ZXN0KFN0cmluZyhzZWw/LmhobW0gPz8gIiIpKSl7CiAgICAgICAgICAvLyBPcGVyYXRvciBjYW5jZWxsZWQgPT4gZG8gbm90IHZhbGlkYXRlCiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGhobW0gPSBTdHJpbmcoc2VsLmhobW0pLnRyaW0oKTsKICAgICAgICAvLyBVcGRhdGUgZ2xvYmFsIHN0YXRlIHRocm91Z2ggdGhlIHNpbmdsZSBzb3VyY2Utb2YtdHJ1dGggaGVscGVyIChrZWVwcyBVSSBjb25zaXN0ZW50KS4KICAgICAgICBzZXRBY3RpdmVUaW1lKHsgc3RhdGU6IHN0LCBoaG1tLCBzb3VyY2U6ICJ2YWxpZGF0ZV9tb2RhbCIgfSk7CiAgICAgIH0gY2F0Y2ggKGUpewogICAgICAgIHNob3dUb2FzdCh7IG1lc3NhZ2U6ICJDaG9pc2lyIHVuIGNyw6luZWF1Iiwga2luZDogImVycm9yIiB9KTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KCiAgICBjb25zdCBjb3VwZSA9IGJvb2wwMShzdC5jb3VwZSk7CiAgICBjb25zdCBsaXZyYWlzb24gPSBib29sMDEoc3QubGl2cmFpc29uKTsKICAgIGNvbnN0IGNsaWVudElkID0gYXNJbnQoc3Q/LmNsaWVudD8uaWQsIDApOwogICAgLy8gQXQgc2F2ZSB0aW1lIHdlIG11c3QgaGF2ZSBhbiBpZF9jbGllbnQ6CiAgICAvLyBUaGUgYmFja2VuZCB3aWxsIHVwc2VydCBzdGRfY2xpZW50cyBiYXNlZCBvbiBwaG9uZU51bWJlciBpZiBuZWVkZWQuCiAgICBjb25zdCBwaG9uZU51bWJlciA9CiAgICAgICh0eXBlb2Ygc3Q/LmNsaWVudD8ucGhvbmVOdW1iZXIgPT09ICJzdHJpbmciICYmIHN0LmNsaWVudC5waG9uZU51bWJlci50cmltKCkpID8gc3QuY2xpZW50LnBob25lTnVtYmVyLnRyaW0oKSA6CiAgICAgICh0eXBlb2Ygc3Q/LmNsaWVudD8udGVsZXBob25lID09PSAic3RyaW5nIiAmJiBzdC5jbGllbnQudGVsZXBob25lLnRyaW0oKSkgPyBzdC5jbGllbnQudGVsZXBob25lLnRyaW0oKSA6CiAgICAgICIiOwogICAgaWYgKCFwaG9uZU51bWJlcil7CiAgICAgIHNob3dUb2FzdCh7IG1lc3NhZ2U6ICJTYWlzaXIgbGUgdMOpbMOpcGhvbmUgZHUgY2xpZW50Iiwga2luZDogImVycm9yIiB9KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgICBjb25zdCBjbGllbnRQYXlsb2FkID0gYnVpbGRDbGllbnRQYXlsb2FkRm9yU2F2ZShzdC5jbGllbnQsIHN0b3JlQ3VycmVudCk7CiAgICAgIGNvbnN0IHRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcyA9IChsaXZyYWlzb24gPT09IDEpCiAgICAgID8gYnVpbGRUZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3NQYXlsb2FkKHN0LnRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcywgc3RvcmVDdXJyZW50KQogICAgICA6IG51bGw7CgogICAgY29uc3Qgc3VtbWFyeSA9IGNvbXB1dGVPcmRlclN1bW1hcnkoaXRlbXMpOwogICAgY29uc3QgcHJpeENvbSA9IHJvdW5kMihzdW1tYXJ5LnRvdGFsKTsKICAgIGNvbnN0IG5iclBpenphcyA9IGFzSW50KHN1bW1hcnkuY291bnQsIDApOwoKICAgICAgLy8g4pSA4pSAIFByZS12YWxpZGF0aW9uIFVJIGNoZWNrcyAobW9yZSB3aWxsIGJlIGFkZGVkIGxhdGVyKSDilIDilIAKICAgICAgLy8gSWYgYSBjaGVjayByZXR1cm5zIGZhbHNlLCB3ZSBzdG9wIHZhbGlkYXRpb24gdG8gbGV0IHRoZSBvcGVyYXRvciBhZGp1c3QgdGhlIGJhc2tldC9vcHRpb25zLgogICAgICB0cnl7CiAgICAgICAgY29uc3Qgb2tDaGVja3MgPSBhd2FpdCBydW5QcmVWYWxpZGF0ZUNoZWNrcyh7IHN0YXRlOiBzdCwgaXRlbXMsIGxpdnJhaXNvbiwgbmJyUGl6emFzIH0pOwogICAgICAgIGlmICghb2tDaGVja3MpIHJldHVybjsKICAgICAgfSBjYXRjaCAoZSl7CiAgICAgICAgLy8gRGVmZW5zaXZlOiBuZXZlciBibG9jayB2YWxpZGF0aW9uIG9uIGEgVUkgY2hlY2sgY3Jhc2gKICAgICAgfQoKICAgIGNvbnN0IHBheWxvYWRJdGVtcyA9IFtdOwogICAgZm9yIChjb25zdCBsaW5lIG9mIGl0ZW1zKXsKICAgICAgY29uc3QgcGlkID0gcGlja1Bvc1BpenphSWQobGluZSk7CiAgICAgIGlmICghcGlkKXsKICAgICAgICBzaG93VG9hc3QoeyBtZXNzYWdlOiAiSW1wb3NzaWJsZSBk4oCZZW5yZWdpc3RyZXI6IGFydGljbGUgc2FucyBJRCIsIGtpbmQ6ICJlcnJvciIgfSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IG9yZGVyZWRJZCA9IE51bWJlcihsaW5lPy5vcmRlcmVkX2lkKTsKICAgICAgcGF5bG9hZEl0ZW1zLnB1c2goewogICAgICAgIGlkX3Bvc19waXp6YXM6IHBpZCwKICAgICAgICBkYXRhX2lkOiBtYWtlRGF0YUlkRnJvbUxpbmUobGluZSksCiAgICAgICAgY2xhc3M6IFN0cmluZyhsaW5lPy5jbGFzcyA/PyAiIikudHJpbSgpLnRvTG93ZXJDYXNlKCksCiAgICAgICAgbW9kaWZzOiAoU3RyaW5nKGxpbmU/LmNsYXNzID8/ICIiKS50cmltKCkudG9Mb3dlckNhc2UoKSA9PT0gInBpenphIikgPyBidWlsZFBpenphTW9kaWZzKHsgc3RhdGU6IHN0LCBsaW5lIH0pIDogW10sCiAgICAgICAgb3JkZXJlZF9pZDogTnVtYmVyLmlzRmluaXRlKG9yZGVyZWRJZCkgPyBvcmRlcmVkSWQgOiBudWxsLAogICAgICB9KTsKICAgIH0KCiAgICAgIHRyeXsKICAgICAgICBsZXQgcmVzID0gbnVsbDsKCiAgICAgIGlmICghaXNVcGRhdGVNb2RlKXsKICAgICAgICByZXMgPSBhd2FpdCBzYXZlT3JkZXIoewogICAgICAgICAgc3RvcmU6IHN0b3JlQ3VycmVudCwKICAgICAgICAgIGRhdGVJU08sCiAgICAgICAgICAvLyBzZXJ2ZXIgY29tcHV0ZXMgbmV4dCBpZF9kYXRlOyBrZWVwIHRoaXMgZm9yIGRlYnVnL2JhY2t3YXJkIGNvbXBhdGliaWxpdHkKICAgICAgICAgIGlkX2RhdGU6IGlkRGF0ZSwKICAgICAgICAgIGhldXJlX3ByZXBhX2hobW06IGhobW0sCiAgICAgICAgICBjb3VwZSwKICAgICAgICAgIGxpdnJhaXNvbiwKICAgICAgICAgIGlkX2NsaWVudDogY2xpZW50SWQsCiAgICAgICAgICBwaG9uZU51bWJlciwKICAgICAgICAgIGNsaWVudDogY2xpZW50UGF5bG9hZCwKICAgICAgICAgIHRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcywKICAgICAgICAgIG5icl9waXp6YXM6IG5iclBpenphcywKICAgICAgICAgIHByaXhfY29tOiBwcml4Q29tLAogICAgICAgICAgdG9fcHJpbnQ6IDAsCiAgICAgICAgICBpdGVtczogcGF5bG9hZEl0ZW1zLAogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IHNuYXBJdGVtcyA9IEFycmF5LmlzQXJyYXkobG9hZGVkU25hcHNob3Q/Lml0ZW1zKSA/IGxvYWRlZFNuYXBzaG90Lml0ZW1zIDogW107CiAgICAgICAgY29uc3QgaW5pdGlhbEJ5T3JkZXJlZElkID0gbmV3IE1hcCgpOwogICAgICAgIGZvciAoY29uc3QgaXQgb2Ygc25hcEl0ZW1zKXsKICAgICAgICAgIGNvbnN0IG9pZCA9IE51bWJlcihpdD8ub3JkZXJlZF9pZCk7CiAgICAgICAgICBpZiAoTnVtYmVyLmlzRmluaXRlKG9pZCkgJiYgb2lkID4gMCkgaW5pdGlhbEJ5T3JkZXJlZElkLnNldChvaWQsIGl0KTsKICAgICAgICB9CgogICAgICAgIGNvbnN0IGN1cnJlbnRPcmRlcmVkSWRTZXQgPSBuZXcgU2V0KCk7CiAgICAgICAgY29uc3QgYWRkID0gW107CiAgICAgICAgY29uc3QgdXBkYXRlID0gW107CgogICAgICAgIGZvciAoY29uc3QgaXQgb2YgcGF5bG9hZEl0ZW1zKXsKICAgICAgICAgIGNvbnN0IG9pZCA9IE51bWJlcihpdD8ub3JkZXJlZF9pZCk7CiAgICAgICAgICBjb25zdCBsaW5lU2hhcGUgPSB7CiAgICAgICAgICAgIGlkX3Bvc19waXp6YXM6IGl0LmlkX3Bvc19waXp6YXMsCiAgICAgICAgICAgIGRhdGFfaWQ6IGl0LmRhdGFfaWQsCiAgICAgICAgICAgIGNsYXNzOiBpdC5jbGFzcywKICAgICAgICAgICAgbW9kaWZzOiBpdC5tb2RpZnMsCiAgICAgICAgICB9OwogICAgICAgICAgaWYgKE51bWJlci5pc0Zpbml0ZShvaWQpICYmIG9pZCA+IDAgJiYgaW5pdGlhbEJ5T3JkZXJlZElkLmhhcyhvaWQpKXsKICAgICAgICAgICAgY3VycmVudE9yZGVyZWRJZFNldC5hZGQob2lkKTsKICAgICAgICAgICAgY29uc3QgaW5pID0gaW5pdGlhbEJ5T3JkZXJlZElkLmdldChvaWQpOwogICAgICAgICAgICBjb25zdCBrMCA9IHN0YWJsZUxpbmVLZXlGb3JDb21wYXJlKHsKICAgICAgICAgICAgICBpZF9wb3NfcGl6emFzOiBpbmk/LmlkX3Bvc19waXp6YXMsCiAgICAgICAgICAgICAgZGF0YV9pZDogaW5pPy5kYXRhX2lkLAogICAgICAgICAgICAgIGNsYXNzTmFtZTogaW5pPy5jbGFzcywKICAgICAgICAgICAgICBtb2RpZnM6IGluaT8ubW9kaWZzLAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgY29uc3QgazEgPSBzdGFibGVMaW5lS2V5Rm9yQ29tcGFyZSh7CiAgICAgICAgICAgICAgaWRfcG9zX3BpenphczogbGluZVNoYXBlLmlkX3Bvc19waXp6YXMsCiAgICAgICAgICAgICAgZGF0YV9pZDogbGluZVNoYXBlLmRhdGFfaWQsCiAgICAgICAgICAgICAgY2xhc3NOYW1lOiBsaW5lU2hhcGUuY2xhc3MsCiAgICAgICAgICAgICAgbW9kaWZzOiBsaW5lU2hhcGUubW9kaWZzLAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaWYgKGswICE9PSBrMSl7CiAgICAgICAgICAgICAgdXBkYXRlLnB1c2goeyBvcmRlcmVkX2lkOiBvaWQsIC4uLmxpbmVTaGFwZSB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYWRkLnB1c2gobGluZVNoYXBlKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGNvbnN0IGRlbCA9IFtdOwogICAgICAgIGZvciAoY29uc3QgW29pZF0gb2YgaW5pdGlhbEJ5T3JkZXJlZElkLmVudHJpZXMoKSl7CiAgICAgICAgICBpZiAoIWN1cnJlbnRPcmRlcmVkSWRTZXQuaGFzKG9pZCkpIGRlbC5wdXNoKHsgb3JkZXJlZF9pZDogb2lkIH0pOwogICAgICAgIH0KCiAgICAgICAgLy8gTm8tb3AgZ3VhcmQ6IHN0aWxsIGFsbG93IGhldXJlX3ByZXBhIHVwZGF0ZXMgZXZlbiBpZiBubyBsaW5lIGNoYW5nZWQuCiAgICAgICAgLy8gQ2xpZW50IHBheWxvYWQgb24gVVBEQVRFIE1VU1QgYmUgbWVyZ2UtcGF0Y2ggKG51bGwgY2xlYXJzOyBhYnNlbnQ9bm8gY2hhbmdlKS4KICAgICAgICAvLyBQcmVmZXIgdGhlIG9yaWdpbmFsbHkgbG9hZGVkIGN1c3RvbWVyIGlmIGF2YWlsYWJsZTsgZmFsbGJhY2sgdG8gbG9hZGVkQ3VzdG9tZXJSYXcuCiAgICAgICAgY29uc3Qgb3JpZ0N1c3RvbWVyID0KICAgICAgICAgIChsb2FkZWRTbmFwc2hvdCAmJiB0eXBlb2YgbG9hZGVkU25hcHNob3QgPT09ICJvYmplY3QiICYmIGxvYWRlZFNuYXBzaG90Py5jdXN0b21lciAmJiB0eXBlb2YgbG9hZGVkU25hcHNob3QuY3VzdG9tZXIgPT09ICJvYmplY3QiKQogICAgICAgICAgICA/IGxvYWRlZFNuYXBzaG90LmN1c3RvbWVyCiAgICAgICAgICAgIDogKHN0LmxvYWRlZEN1c3RvbWVyUmF3ICYmIHR5cGVvZiBzdC5sb2FkZWRDdXN0b21lclJhdyA9PT0gIm9iamVjdCIgPyBzdC5sb2FkZWRDdXN0b21lclJhdyA6IHt9KTsKICAgICAgICBjb25zdCBjbGllbnRQYXRjaCA9IGJ1aWxkQ2xpZW50UGF0Y2hQYXlsb2FkKHN0LmNsaWVudCwgb3JpZ0N1c3RvbWVyKTsKCiAgICAgICAgcmVzID0gYXdhaXQgdXBkYXRlT3JkZXIoewogICAgICAgICAgc3RvcmU6IHN0b3JlVXBkYXRlLAogICAgICAgICAgZGF0ZUlTTywKICAgICAgICAgIGlkOiBOdW1iZXIobG9hZGVkTWV0YS5pZCksCiAgICAgICAgICBpZF9kYXRlOiBOdW1iZXIobG9hZGVkTWV0YS5pZF9kYXRlKSwKICAgICAgICAgIGhldXJlX3ByZXBhX2hobW06IGhobW0sCiAgICAgICAgICBjb3VwZSwKICAgICAgICAgIGxpdnJhaXNvbiwKICAgICAgICAgIHRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcywKICAgICAgICAgIG5icl9waXp6YXM6IG5iclBpenphcywKICAgICAgICAgIHByaXhfY29tOiBwcml4Q29tLAogICAgICAgICAgLy8gRW5zdXJlIGNsaWVudCBlZGl0cyBhcmUgcGVyc2lzdGVkIG9uIFVQREFURSB0b28gKHNhbWUgYXMgQ1JFQVRFKQogICAgICAgICAgcGhvbmVOdW1iZXIsCiAgICAgICAgICBjbGllbnQ6IGNsaWVudFBhdGNoLAogICAgICAgICAgZGlmZjogeyBhZGQsIHVwZGF0ZSwgZGVsZXRlOiBkZWwgfSwKICAgICAgICB9KTsKICAgICAgfQoKICAgICAgICBpZiAoIXJlcyB8fCAhcmVzLm9rKXsKICAgICAgICAgIHNob3dUb2FzdCh7IG1lc3NhZ2U6IFN0cmluZyhyZXM/Lm1lc3NhZ2UgfHwgIkVycmV1cjogY29tbWFuZGUgbm9uIGVucmVnaXN0csOpZSIpLCBraW5kOiAiZXJyb3IiIH0pOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gVVggYm9udXM6IGluamVjdCBmaXJzdCBuYW1lIGltbWVkaWF0ZWx5IGludG8gbG9jYWwgZmlyc3QtbmFtZXMgY2FjaGUgKGF1dG9jb21wbGV0ZSkuCiAgICAgICAgdHJ5ewogICAgICAgICAgY29uc3QgZm4gPSBTdHJpbmcoc3Q/LmNsaWVudD8ucHJlbm9tID8/ICIiKS50cmltKCk7CiAgICAgICAgICBpZiAoZm4pIGFkZEZpcnN0TmFtZVRvQ2FjaGUoeyBzdGF0ZTogc3QsIGZpcnN0TmFtZTogZm4gfSk7CiAgICAgICAgfSBjYXRjaCAoX2UpIHt9CgogICAgICAgIGlmICghaXNVcGRhdGVNb2RlKXsKICAgICAgICAgIHNob3dUb2FzdCh7IG1lc3NhZ2U6IGBDb21tYW5kZSBlbnJlZ2lzdHLDqWUgKCMke3Jlcy5vcmRlcl9pZH0pYCwga2luZDogInN1Y2Nlc3MiIH0pOwogICAgICAgICAgc3QudGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzID0gbnVsbDsKICAgICAgICAgIC8vIEFmdGVyIENSRUFURSBzdWNjZXNzOiBmdWxsIHJlc2V0IChjbGllbnQgKyBiYXNrZXQgKyBzZWFyY2gpICsgZm9jdXMgc2VhcmNoLgogICAgICAgICAgYXdhaXQgYWZ0ZXJPcmRlclNhdmVkU3VjY2Vzcyh7IHN0YXRlOiBzdCB9KTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICBzaG93VG9hc3QoeyBtZXNzYWdlOiAiQ29tbWFuZGUgbW9kaWZpw6llIiwga2luZDogInN1Y2Nlc3MiIH0pOwogICAgICBzdC50ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MgPSBudWxsOwoKICAgICAgLy8gQWZ0ZXIgVVBEQVRFIHN1Y2Nlc3M6IGZ1bGwgcmVzZXQgKGV4aXQgdXBkYXRlIG1vZGUgKyBjbGVhciBVSSkgKyBmb2N1cyBzZWFyY2guCiAgICAgIC8vIFNwZWM6IHJlc2V0IG9ubHkgb24gQVBJIHN1Y2Nlc3M7IG9uIGVycm9yIHdlIGtlZXAgZXZlcnl0aGluZyB0byBhbGxvdyBjb3JyZWN0aW9ucy4KICAgICAgICBhd2FpdCBhZnRlck9yZGVyU2F2ZWRTdWNjZXNzKHsgc3RhdGU6IHN0IH0pOwoKICAgICAgfSBjYXRjaCAoZSl7CiAgICAgICAgY29uc29sZS5lcnJvcihlKTsKICAgICAgICBzaG93VG9hc3QoeyBtZXNzYWdlOiBTdHJpbmcoZT8ucGF5bG9hZD8ubWVzc2FnZSB8fCAiRXJyZXVyIEFQSTogY29tbWFuZGUgbm9uIGVucmVnaXN0csOpZSIpLCBraW5kOiAiZXJyb3IiIH0pOwogICAgICAgIHRyeXsKICAgICAgICAgIC8vIE9wdGlvbmFsIGZhbGxiYWNrIHRvIGEgYmxvY2tpbmcgYWxlcnQgKHJlcXVlc3RlZCDigJxtb2RhbC9hbGVydGXigJ0pCiAgICAgICAgICB3aW5kb3cuYWxlcnQoU3RyaW5nKGU/LnBheWxvYWQ/Lm1lc3NhZ2UgfHwgIkVycmV1cjogY29tbWFuZGUgbm9uIGVucmVnaXN0csOpZSIpKTsKICAgICAgICB9IGNhdGNoIChlcnIpIHt9CiAgICAgIH0KICAgIH0gZmluYWxseSB7CiAgICAgIC8vIEFsd2F5cyByZWxlYXNlIHRoZSBpbi1mbGlnaHQgbG9jaywgZXZlbiBpZiBhIG1vZGFsIHdhcyBjYW5jZWxsZWQgb3IgYW4gZXhjZXB0aW9uIG9jY3VycmVkLgogICAgICB0cnkgeyBzdC5fX3ZhbGlkYXRpb25JbkZsaWdodCA9IGZhbHNlOyB9IGNhdGNoIChlKSB7fQogICAgfQogIH0pOwp9Cg=="
            }
        },
        {
            "path": "caisse-aqp/public/assets/js/app-js/loaders/ordersLoader.js",
            "kind": "file",
            "before": {
                "exists": true,
                "kind": "file",
                "size": 24473,
                "sha1": "d51f023d904bb068c9fcc7bc4f08bd5626d848b7",
                "content_b64": "LyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqLwovKiBkb2MtcHJvamVjdCB8IGNhaXNzZS1hcXAvcHVibGljL2Fzc2V0cy9qcy9hcHAtanMvbG9hZGVycy9vcmRlcnNMb2FkZXIuanMgfCBDaGFyZ2UgbGVzIGNvbW1hbmRlcyBkdSBqb3VyLCByZXN0YXVyZSB1bmUgY29tbWFuZGUgcGFyIGlkL2RhdGUsIHBlcm1ldCBhdXNzaSBkZSByZWxpcmUgdW5lIGNvbW1hbmRlIHRlbXBvcmFpcmUgcGF5bWVudF9yZXF1aXJlZCBwYXIgb3JkZXJfaWQgcG91ciBsYSByZXByaXNlIGNhaXNzZSBzYW5zIHBhbmllciBKU09OIGxlZ2FjeSwgcHVpcyBpbmplY3RlIGzigJnDqXRhdCBVSSBhc3NvY2nDqSAodGVtcHMsIGNsaWVudCwgcGFuaWVyLCBiYWRnZXMpIGFpbnNpIHF1ZSBs4oCZYWRyZXNzZSBkZSBsaXZyYWlzb24gcHJvdmlzb2lyZSBwb3J0w6llIHBhciBsYSBjb21tYW5kZSwgZW4gbcOpbW9yaXNhbnQgYXVzc2kgbGUgY291cGxlIGNvZGUgcG9zdGFsIC8gdmlsbGUgZOKAmW9yaWdpbmUgcG91ciBxdWUgbGUgc8OpbGVjdGV1ciBjb21wb3NpdGUgcHVpc3NlIHJlc3RlciB2aWRlIGhvcnMgUERWIGNvdXJhbnQgc2FucyBwZXJkcmUgbGVzIHZhbGV1cnMgZMOpasOgIGVucmVnaXN0csOpZXMuIFByw6ljb25zdHJ1aXQgYXVzc2kgbOKAmcOpdGF0IGNvbXBvc2l0ZSBsaXZyYWlzb24gZHUgY2xpZW50IGltcG9ydMOpIHBvdXIgcXVlIGxhIHByw6lzw6lsZWN0aW9uIHJlc3RlIGRpc3BvbmlibGUgbcOqbWUgc2kgbGEgem9uZSBsaXZyYWlzb24gw6l0YWl0IG1hc3F1w6llIGF1IG1vbWVudCBkdSBjaGFyZ2VtZW50LiBBcHBsaXF1ZSBkw6lzb3JtYWlzIGxlcyBtb2RlcyBjb3VwZS9saXZyYWlzb24gdmlhIHVuZSByw6hnbGUgbcOpdGllciBjZW50cmFsaXPDqWUgcG91ciBjb25zZXJ2ZXIgc3lzdMOpbWF0aXF1ZW1lbnQgbGVzIHZhbGV1cnMgcsOpZWxsZW1lbnQgc2F1dmVnYXJkw6llcyBsb3JzIGTigJl1biBjaGFyZ2VtZW50L2ltcG9ydC4gfCBFeHBvc2U6IHJlY292ZXJPcmRlciwgbG9hZERhaWx5T3JkZXJUYWJzLCBsb2FkT3JkZXJCeUlkRGF0ZSwgbG9hZE9yZGVyQnlPcmRlcklkIHwgRMOpcGVuZCBkZTogLi4vLi4vc2VydmljZXMvYXBpL29yZGVyc0FwaS5qcywgLi4vLi4vc2VydmljZXMvYXBpL29yZGVyRGV0YWlsc0FwaS5qcywgLi4vLi4vdWkvZG9tLmpzLCAuLi8uLi9wb3MvcGl6emFPcmRlci5qcywgLi4vLi4vcG9zL29yZGVyTGluZS5qcywgLi4vLi4vZGF0YS9tb2NrLmpzLCAuLi90aW1lL2FjdGl2ZVRpbWUuanMsIC4uL3Bkdi5qcywgLi4vY2F0YWxvZ0NhY2hlLmpzLCAuLi9wb3MvYmFza2V0LmpzLCAuLi9zdGF0ZS9jbGllbnQuanM/dHM9MjAyNjA0MDUtMiwgLi4vdGltZS9saXZyYWlzb25TbG90cy5qcywgLi4vdGltZS90aW1lY2hpcHNTY3JvbGwuanMsIC4vc2xvdEJhZGdlc0xvYWRlci5qcywgLi4vYWRkcmVzcy9kZWxpdmVyeUNpdHlDaG9pY2VzLmpzP3RzPTIwMjYwNDA1LTEsIC4uL29yZGVyTW9kZS9vcmRlck1vZGVTdGF0ZS5qcz90cz0yMDI2MDQwNi0xLCBhcGkvb3JkZXJEZXRhaWxzLnBocCwgZmV0Y2gsIFVSTFNlYXJjaFBhcmFtcyB8IEltcGFjdGU6IMOpdGF0IGRlIHNlc3Npb24gVUksIHPDqWxlY3Rpb24gZOKAmWhldXJlLCBwYW5pZXIsIGNsaWVudCwgYWRyZXNzZSB0ZW1wb3JhaXJlIGRlIGNvbW1hbmRlLCBzY3JvbGwgZGVzIHRpbWUgY2hpcHMsIG5vdGlmaWNhdGlvbnMgdG9hc3QsIHJlcHJpc2UgY2Fpc3NlIGRlcHVpcyBwb3NfY29tbWFuZGVzL3Bvc19jb21tYW5kZXNfcGVsLCByZXN0YXVyYXRpb24gZmlhYmxlIGRlcyBzd2l0Y2hlcyBjb3VwZS9saXZyYWlzb24gfCBUYWJsZXM6IGF1Y3VuZSAqLwoKaW1wb3J0IHsgZmV0Y2hPcmRlcnNTdW1tYXJ5IH0gZnJvbSAiLi4vLi4vc2VydmljZXMvYXBpL29yZGVyc0FwaS5qcyI7CmltcG9ydCB7IGZldGNoT3JkZXJEZXRhaWxzIH0gZnJvbSAiLi4vLi4vc2VydmljZXMvYXBpL29yZGVyRGV0YWlsc0FwaS5qcyI7CmltcG9ydCB7IHRvYXN0IH0gZnJvbSAiLi4vLi4vdWkvZG9tLmpzIjsKaW1wb3J0IHsgbWFrZVBpenphTGluZSB9IGZyb20gIi4uLy4uL3Bvcy9waXp6YU9yZGVyLmpzIjsKaW1wb3J0IHsgbWFrZU9yZGVyTGluZSB9IGZyb20gIi4uLy4uL3Bvcy9vcmRlckxpbmUuanMiOwppbXBvcnQgeyBidWlsZFRpbWVzLCBidWlsZFRpbWVCYWRnZXMgfSBmcm9tICIuLi8uLi9kYXRhL21vY2suanMiOwppbXBvcnQgeyBzZXRBY3RpdmVUaW1lIH0gZnJvbSAiLi4vdGltZS9hY3RpdmVUaW1lLmpzIjsKCmltcG9ydCB7IGdldFBEVkN1cnJlbnQsIHN0b3JlVG9TdWZmaXggfSBmcm9tICIuLi9wZHYuanMiOwppbXBvcnQgeyBlbnN1cmVQaXp6YUJhc2UgfSBmcm9tICIuLi9jYXRhbG9nQ2FjaGUuanMiOwppbXBvcnQgeyBub3JtYWxpemVLZXlGcm9tTmFtZSwgcmVjb21wdXRlRXh0cmFGb3JMaW5lIH0gZnJvbSAiLi4vcG9zL2Jhc2tldC5qcyI7CmltcG9ydCB7IGJ1aWxkSW5qZWN0ZWRDbGllbnRGcm9tQXBpLCBzeW5jSW5qZWN0ZWRDbGllbnREZWxpdmVyeVN0YXRlLCBidWlsZEVtcHR5Q2xpZW50IH0gZnJvbSAiLi4vc3RhdGUvY2xpZW50LmpzP3RzPTIwMjYwNDA1LTIiOwppbXBvcnQgeyBidWlsZEFsbG93ZWRDaG9pY2VWYWx1ZSBhcyBidWlsZEFsbG93ZWREZWxpdmVyeUNpdHlDaG9pY2VWYWx1ZSB9IGZyb20gIi4uL2FkZHJlc3MvZGVsaXZlcnlDaXR5Q2hvaWNlcy5qcz90cz0yMDI2MDQwNS0xIjsKaW1wb3J0IHsgYnVpbGRMaXZyYWlzb25CeVNsb3QgfSBmcm9tICIuLi90aW1lL2xpdnJhaXNvblNsb3RzLmpzIjsKaW1wb3J0IHsgY2FwdHVyZVRpbWVDaGlwc1Njcm9sbCwgcmVzdG9yZVRpbWVDaGlwc1Njcm9sbCwgaXNTbG90SW5ET00gfSBmcm9tICIuLi90aW1lL3RpbWVjaGlwc1Njcm9sbC5qcyI7CmltcG9ydCB7IGxvYWRTbG90QmFkZ2VzIH0gZnJvbSAiLi9zbG90QmFkZ2VzTG9hZGVyLmpzIjsKaW1wb3J0IHsgYXBwbHlJbXBvcnRlZE9yZGVyTW9kZXMgfSBmcm9tICIuLi9vcmRlck1vZGUvb3JkZXJNb2RlU3RhdGUuanM/dHM9MjAyNjA0MDYtMSI7CgpmdW5jdGlvbiByZWFkU3RvcFNtc1ZhbHVlKGFueUNsaWVudCl7CiAgY29uc3QgYyA9IChhbnlDbGllbnQgJiYgdHlwZW9mIGFueUNsaWVudCA9PT0gIm9iamVjdCIpID8gYW55Q2xpZW50IDoge307CiAgY29uc3QgcmF3ID0gKGMuc3RvcFNtcyAhPSBudWxsKSA/IGMuc3RvcFNtcyA6IGMuc3RvcF9zbXM7CiAgaWYgKHJhdyA9PT0gdHJ1ZSB8fCByYXcgPT09IDEgfHwgcmF3ID09PSAiMSIpIHJldHVybiAxOwogIHJldHVybiAwOwp9CgpmdW5jdGlvbiBidWlsZExvYWRlZFRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcyhhcGlBZGRyZXNzLCBzdG9yZVN1ZmZpeCl7CiAgY29uc3QgYSA9IChhcGlBZGRyZXNzICYmIHR5cGVvZiBhcGlBZGRyZXNzID09PSAib2JqZWN0IikgPyBhcGlBZGRyZXNzIDogbnVsbDsKICBpZiAoIWEpIHJldHVybiBudWxsOwogIGNvbnN0IGFkcmVzc2UgPSBTdHJpbmcoYS5hZHJlc3NlID8/ICIiKS50cmltKCk7CiAgY29uc3QgY29kZVBvc3RhbCA9IFN0cmluZyhhLmNvZGVfcG9zdGFsID8/IGEuY29kZVBvc3RhbCA/PyAiIikudHJpbSgpOwogIGNvbnN0IHZpbGxlID0gU3RyaW5nKGEudmlsbGUgPz8gIiIpLnRyaW0oKTsKICBpZiAoIWFkcmVzc2UgfHwgIWNvZGVQb3N0YWwgfHwgIXZpbGxlKSByZXR1cm4gbnVsbDsKICByZXR1cm4gewogICAgZW5hYmxlZDogdHJ1ZSwKICAgIGFkcmVzc2UsCiAgICBjb21wbGVtZW50QWRyZXNzZTogU3RyaW5nKGEuY29tcGxlbWVudF9hZHJlc3NlID8/IGEuY29tcGxlbWVudEFkcmVzc2UgPz8gIiIpLnRyaW0oKSwKICAgIGNvZGVQb3N0YWwsCiAgICB2aWxsZSwKICAgIHRlbXBvcmFyeURlbGl2ZXJ5Q2l0eUNob2ljZTogYnVpbGRBbGxvd2VkRGVsaXZlcnlDaXR5Q2hvaWNlVmFsdWUoc3RvcmVTdWZmaXgsIHZpbGxlLCBjb2RlUG9zdGFsKSwKICAgIHBlcnNpc3RlZENvZGVQb3N0YWw6IGNvZGVQb3N0YWwsCiAgICBwZXJzaXN0ZWRWaWxsZTogdmlsbGUsCiAgICBleHBsaWNhdGlvbnM6IFN0cmluZyhhLmV4cGxpY2F0aW9ucyA/PyAiIikudHJpbSgpLAogICAgbnVtZXJvVXJnZW5jZTogU3RyaW5nKGEubnVtZXJvX3VyZ2VuY2UgPz8gYS5udW1lcm9VcmdlbmNlID8/ICIiKS50cmltKCksCiAgfTsKfQoKZnVuY3Rpb24gZm10RXVyb1NpZ25lZEZSKHZhbCl7CiAgY29uc3QgbiA9IE51bWJlcih2YWwpOwogIGNvbnN0IHNhZmUgPSBOdW1iZXIuaXNGaW5pdGUobikgPyBuIDogMDsKICBjb25zdCBzaWduID0gc2FmZSA+IDAgPyAiKyIgOiAiIjsKICByZXR1cm4gYCR7c2lnbn0ke3NhZmUudG9GaXhlZCgyKS5yZXBsYWNlKCIuIiwgIiwiKX3igqxgOwp9CgpmdW5jdGlvbiB0b1BhcmlzSEhNTUZyb21FcG9jaE1zKG1zKXsKICBjb25zdCBuID0gTnVtYmVyKG1zKTsKICBpZiAoIU51bWJlci5pc0Zpbml0ZShuKSB8fCBuIDw9IDApIHJldHVybiAiIjsKICBjb25zdCBkID0gbmV3IERhdGUobik7CiAgdHJ5ewogICAgY29uc3QgcGFydHMgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgiZnItRlIiLCB7CiAgICAgIHRpbWVab25lOiAiRXVyb3BlL1BhcmlzIiwKICAgICAgaG91cjogIjItZGlnaXQiLAogICAgICBtaW51dGU6ICIyLWRpZ2l0IiwKICAgICAgaG91ckN5Y2xlOiAiaDIzIiwKICAgIH0pLmZvcm1hdFRvUGFydHMoZCk7CiAgICBjb25zdCBoaCA9IHBhcnRzLmZpbmQoKHApID0+IHAudHlwZSA9PT0gImhvdXIiKT8udmFsdWUgPz8gIiI7CiAgICBjb25zdCBtbSA9IHBhcnRzLmZpbmQoKHApID0+IHAudHlwZSA9PT0gIm1pbnV0ZSIpPy52YWx1ZSA/PyAiIjsKICAgIGlmICghaGggfHwgIW1tKSByZXR1cm4gIiI7CiAgICByZXR1cm4gYCR7aGh9OiR7bW19YDsKICB9IGNhdGNoIChlKXsKICAgIGNvbnN0IGhoID0gU3RyaW5nKGQuZ2V0SG91cnMoKSkucGFkU3RhcnQoMiwgIjAiKTsKICAgIGNvbnN0IG1tID0gU3RyaW5nKGQuZ2V0TWludXRlcygpKS5wYWRTdGFydCgyLCAiMCIpOwogICAgcmV0dXJuIGAke2hofToke21tfWA7CiAgfQp9CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZE9yZGVyQnlPcmRlcklkKHsgc3RhdGUsIG1vY2ssIGRhdGVJU08sIG9yZGVySWQsIGVuc3VyZURheUxvYWRlZCA9IHRydWUgfSA9IHt9KXsKICBpZiAoIXN0YXRlIHx8IHR5cGVvZiBzdGF0ZSAhPT0gIm9iamVjdCIpIHJldHVybiBmYWxzZTsKICBjb25zdCBvcmRlcl9pZCA9IE51bWJlcihvcmRlcklkKTsKICBpZiAoIU51bWJlci5pc0Zpbml0ZShvcmRlcl9pZCkgfHwgb3JkZXJfaWQgPD0gMCkgcmV0dXJuIGZhbHNlOwoKICBjb25zdCBuZXh0RGF0ZUlTTyA9IFN0cmluZyhkYXRlSVNPID8/IHN0YXRlLnNlbGVjdGVkRGF0ZUlTTyA/PyAiIikudHJpbSgpOwogIGlmICgvXlxkezR9LVxkezJ9LVxkezJ9JC8udGVzdChuZXh0RGF0ZUlTTykpIHsKICAgIHN0YXRlLnNlbGVjdGVkRGF0ZUlTTyA9IG5leHREYXRlSVNPOwogIH0KCiAgaWYgKGVuc3VyZURheUxvYWRlZCkgewogICAgdHJ5IHsgYXdhaXQgbG9hZERhaWx5T3JkZXJUYWJzKHsgc3RhdGUsIG1vY2sgfSk7IH0gY2F0Y2ggKGUpIHt9CiAgICB0cnkgeyBhd2FpdCBsb2FkU2xvdEJhZGdlcyh7IHN0YXRlLCBtb2NrLCBmb3JjZTogdHJ1ZSB9KTsgfSBjYXRjaCAoZSkge30KICB9CgogIGNvbnN0IHBkdiA9IGdldFBEVkN1cnJlbnQoKTsKICBjb25zdCBzdG9yZSA9IHN0b3JlVG9TdWZmaXgocGR2KTsKICBjb25zdCBkYXRlID0gc3RhdGUuc2VsZWN0ZWREYXRlSVNPOwoKICB0cnl7CiAgICB0b2FzdChgQ2hhcmdlbWVudCBjb21tYW5kZSB0ZW1wb3JhaXJlICR7b3JkZXJfaWR94oCmYCwgeyBkdXJhdGlvbjogMTIwMCB9KTsKICB9IGNhdGNoIChlKSB7fQoKICB0cnl7CiAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgZmV0Y2hPcmRlckRldGFpbHNCeU9yZGVySWRMb2NhbCh7IHN0b3JlLCBkYXRlLCBvcmRlcklkOiBvcmRlcl9pZCB9KTsKICAgIHJldHVybiBhd2FpdCBoeWRyYXRlTG9hZGVkT3JkZXJQYXlsb2FkKHsKICAgICAgc3RhdGUsCiAgICAgIG1vY2ssCiAgICAgIHN0b3JlLAogICAgICBkYXRlLAogICAgICBwYXlsb2FkLAogICAgICBsb2FkZWRNZXRhOiB7CiAgICAgICAgc3RvcmUsCiAgICAgICAgaWQ6IG9yZGVyX2lkLAogICAgICAgIGlkX2RhdGU6IDAsCiAgICAgICAgZGF0ZUlTTzogZGF0ZSwKICAgICAgICBoZXVyZV9wcmVwYTogTnVtYmVyKHBheWxvYWQ/Lm9yZGVyPy5oZXVyZV9wcmVwYSA/PyAwKSB8fCAwLAogICAgICB9LAogICAgICBwcmVzZXJ2ZUxvYWRlZE9yZGVyQ29udGV4dDogZmFsc2UsCiAgICB9KTsKICB9IGNhdGNoIChlKSB7CiAgICBjb25zb2xlLndhcm4oIltvcmRlcnNdIGxvYWRPcmRlckJ5T3JkZXJJZCBmYWlsZWQ6IiwgZSk7CiAgICBzdGF0ZS5sb2FkZWRPcmRlclBheW1lbnRzID0gW107CiAgICBzdGF0ZS5pbXBvcnRlZE9yZGVySWREYXRlID0gbnVsbDsKICAgIHRyeXsgdG9hc3QoIkltcG9zc2libGUgZGUgY2hhcmdlciBsYSBjb21tYW5kZSB0ZW1wb3JhaXJlLiIpOyB9IGNhdGNoIChlMikge30KICAgIHJldHVybiBmYWxzZTsKICB9Cn0KLyoqCiAqIHJlY292ZXJPcmRlcih7IHN0YXRlLCBtb2NrLCBkYXRlSVNPLCBpZERhdGUsIGVuc3VyZURheUxvYWRlZCB9KSAtPiBQcm9taXNlPGJvb2xlYW4+CiAqIC0gUmV1c2FibGUgd3JhcHBlcjogZW5zdXJlcyB0aGUgYXBwIHN0YXRlIG1hdGNoZXMgdGhlIG9yZGVyIGRheSwgcmVmcmVzaGVzIHRhYnMsCiAqICAgdGhlbiBsb2FkcyB0aGUgb3JkZXIgZGV0YWlscyB1c2luZyB0aGUgZXhpc3RpbmcgbG9hZGVyIGNoYWluLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlY292ZXJPcmRlcih7IHN0YXRlLCBtb2NrLCBkYXRlSVNPLCBpZERhdGUsIGVuc3VyZURheUxvYWRlZCA9IHRydWUgfSA9IHt9KXsKICBpZiAoIXN0YXRlIHx8IHR5cGVvZiBzdGF0ZSAhPT0gIm9iamVjdCIpIHJldHVybiBmYWxzZTsKICBjb25zdCBkID0gU3RyaW5nKGRhdGVJU08gPz8gIiIpLnRyaW0oKTsKICBjb25zdCBuSWQgPSBOdW1iZXIoaWREYXRlKTsKCiAgaWYgKGQgJiYgL15cZHs0fS1cZHsyfS1cZHsyfSQvLnRlc3QoZCkpewogICAgc3RhdGUuc2VsZWN0ZWREYXRlSVNPID0gZDsKICB9CgogIC8vIElNUE9SVEFOVDoga2VlcCB0YWIgc2VsZWN0aW9uIGNvbnNpc3RlbnQgd2l0aCB0aGUgImNsaWNrIGlkX2RhdGUgdGFiIiBmbG93LgogIC8vIFdpdGhvdXQgdGhpcywgdGhlIG9yZGVyIGNhbiBiZSBsb2FkZWQgaW4gbWVtb3J5IGJ1dCBVSSBtYXkgbm90IHJlZmxlY3QgdGhlIGFjdGl2ZSB0YWIuCiAgaWYgKE51bWJlci5pc0Zpbml0ZShuSWQpKXsKICAgIHN0YXRlLmFjdGl2ZU51bWJlciA9IG5JZDsKICB9CgogIHRyeXsKICAgIC8vIEVuc3VyZSB0aGUgc2FtZSAiZGF5IGNvbnRleHQiIGFzIGFjdGlvbnMub25EYXRlQ2hhbmdlZCgpOgogICAgLy8gdGFicyArIHNsb3RCYWRnZXMgKHRpbWUgY2hpcHMgZ3JpZCArIGJhZGdlcykgbXVzdCBleGlzdCBCRUZPUkUgaW1wb3J0aW5nLAogICAgLy8gc28gc3RyaWN0IGhldXJlX3ByZXBhIC0+IEhIOk1NIHNlbGVjdGlvbiArIGZvcmNlZCBzY3JvbGwgY2FuIHN1Y2NlZWQgb24gZnV0dXJlIGRheXMuCiAgICBpZiAoZW5zdXJlRGF5TG9hZGVkKXsKICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoWwogICAgICAgIGxvYWREYWlseU9yZGVyVGFicyh7IHN0YXRlIH0pLAogICAgICAgIGxvYWRTbG90QmFkZ2VzKHsgc3RhdGUgfSksCiAgICAgIF0pOwogICAgfSBlbHNlIHsKICAgICAgYXdhaXQgbG9hZERhaWx5T3JkZXJUYWJzKHsgc3RhdGUgfSk7CiAgICB9CiAgfSBjYXRjaCAoZSkge30KICByZXR1cm4gbG9hZE9yZGVyQnlJZERhdGUoeyBzdGF0ZSwgbW9jaywgaWREYXRlOiBuSWQgfSk7Cn0KCmZ1bmN0aW9uIHN0cmljdENoaXBUaW1lRnJvbUhldXJlUHJlcGEoeyBzdGF0ZSwgbW9jaywgaGV1cmVQcmVwYU1zLCBjb250ZXh0IH0gPSB7fSl7CiAgY29uc3QgdCA9IHRvUGFyaXNISE1NRnJvbUVwb2NoTXMoaGV1cmVQcmVwYU1zKTsKICBjb25zdCBjdHggPSAoY29udGV4dCAmJiB0eXBlb2YgY29udGV4dCA9PT0gIm9iamVjdCIpID8gY29udGV4dCA6IHt9OwogIGlmICghdCkgewogICAgaWYgKHN0YXRlICYmIHR5cGVvZiBzdGF0ZSA9PT0gIm9iamVjdCIpIHN0YXRlLmFjdGl2ZVRpbWVFcnJvciA9IHsKICAgICAga2luZDogImhldXJlX3ByZXBhX2ludmFsaWQiLAogICAgICAuLi5jdHgsCiAgICAgIGhldXJlX3ByZXBhX21zOiBoZXVyZVByZXBhTXMsCiAgICAgIGhobW06ICIiLAogICAgfTsKICAgIGNvbnNvbGUuZXJyb3IoIltvcmRlcnNdIGludmFsaWQgaGV1cmVfcHJlcGEgKGNhbm5vdCBmb3JtYXQgSEg6TU0pOiIsIHsgLi4uY3R4LCBoZXVyZV9wcmVwYV9tczogaGV1cmVQcmVwYU1zIH0pOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBjb25zdCBiYWRnZXMgPSBBcnJheS5pc0FycmF5KHN0YXRlPy50aW1lQmFkZ2VzKQogICAgPyBzdGF0ZS50aW1lQmFkZ2VzCiAgICA6IChBcnJheS5pc0FycmF5KG1vY2s/LnRpbWVCYWRnZXMpID8gbW9jay50aW1lQmFkZ2VzIDogW10pOwogIGNvbnN0IGxpc3QgPSBiYWRnZXMKICAgIC5tYXAoKHgpID0+IFN0cmluZyh4Py50aW1lID8/ICIiKS50cmltKCkpCiAgICAuZmlsdGVyKCh4KSA9PiAvXlxkezJ9OlxkezJ9JC8udGVzdCh4KSk7CgogIGlmIChsaXN0LmluY2x1ZGVzKHQpKSB7CiAgICBpZiAoc3RhdGUgJiYgdHlwZW9mIHN0YXRlID09PSAib2JqZWN0Iikgc3RhdGUuYWN0aXZlVGltZUVycm9yID0gbnVsbDsKICAgIHJldHVybiB0OwogIH0KCiAgY29uc3QgZXJyID0gewogICAga2luZDogImhldXJlX3ByZXBhX29mZmdyaWQiLAogICAgLi4uY3R4LAogICAgaGV1cmVfcHJlcGFfbXM6IGhldXJlUHJlcGFNcywKICAgIGhobW06IHQsCiAgfTsKICBpZiAoc3RhdGUgJiYgdHlwZW9mIHN0YXRlID09PSAib2JqZWN0Iikgc3RhdGUuYWN0aXZlVGltZUVycm9yID0gZXJyOwogIGNvbnNvbGUuZXJyb3IoIltvcmRlcnNdIGhldXJlX3ByZXBhIGRvZXMgbm90IG1hdGNoIGFueSBVSSBjaGlwIChzdHJpY3QpOiIsIGVycik7CiAgdHJ5IHsgdG9hc3QoYEVycmV1cjogaG9yYWlyZSAke3R9IGhvcnMgZ3JpbGxlYCwgeyBkdXJhdGlvbjogMjUwMCB9KTsgfSBjYXRjaCAoZSkge30KICByZXR1cm4gbnVsbDsKfQoKZnVuY3Rpb24gZmluZENhdGFsb2dQaXp6YUJ5SWQoc3RhdGUsIGlkKXsKICBjb25zdCBwaWQgPSBOdW1iZXIoaWQpOwogIGlmICghTnVtYmVyLmlzRmluaXRlKHBpZCkpIHJldHVybiBudWxsOwogIGNvbnN0IGxpc3QgPSBBcnJheS5pc0FycmF5KHN0YXRlPy5jYXRhbG9nPy5waXp6YXMpID8gc3RhdGUuY2F0YWxvZy5waXp6YXMgOiBbXTsKICBmb3IgKGNvbnN0IHAgb2YgbGlzdCl7CiAgICBjb25zdCBuID0gTnVtYmVyKHA/LmlkKTsKICAgIGlmIChOdW1iZXIuaXNGaW5pdGUobikgJiYgbiA9PT0gcGlkKSByZXR1cm4gcDsKICB9CiAgcmV0dXJuIG51bGw7Cn0KCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkRGFpbHlPcmRlclRhYnMoeyBzdGF0ZSB9ID0ge30pewogIGNvbnN0IHBkdiA9IGdldFBEVkN1cnJlbnQoKTsKICBjb25zdCBzdG9yZSA9IHN0b3JlVG9TdWZmaXgocGR2KTsKICBjb25zdCBkYXRlID0gc3RhdGUuc2VsZWN0ZWREYXRlSVNPOwoKICB0cnl7CiAgICAvLyDilIDilIAgQ2FwdHVyZSBzY3JvbGwgYmVmb3JlIHRhYnMgcmVsb2FkIG1heSB0cmlnZ2VyIGEgcmUtcmVuZGVyIOKUgOKUgAogICAgY29uc3Qgc2F2ZWRTY3JvbGwgPSBjYXB0dXJlVGltZUNoaXBzU2Nyb2xsKCk7CiAgICBjb25zdCBoYWRBY3RpdmVUaW1lID0gISEoc3RhdGUuYWN0aXZlVGltZSAmJiBTdHJpbmcoc3RhdGUuYWN0aXZlVGltZSkudHJpbSgpKTsKCiAgICBjb25zdCB7IGlkRGF0ZXMsIGxpdnJhaXNvblNsb3RzLCBjaGlwR3JpZCB9ID0gYXdhaXQgZmV0Y2hPcmRlcnNTdW1tYXJ5KHsgc3RvcmUsIGRhdGUgfSk7CgogICAgLy8g4pSA4pSAIFJlYnVpbGQgdGltZSBjaGlwcyBmcm9tIEFQSSBjaGlwX2dyaWQgaWYgbm90IHlldCBzZXQgYnkgc2xvdEJhZGdlc0xvYWRlciDilIDilIAKICAgIGlmIChjaGlwR3JpZCAmJiBjaGlwR3JpZC5zdGFydCAmJiAhc3RhdGUuY2hpcEdyaWQpIHsKICAgICAgc3RhdGUuY2hpcEdyaWQgPSBjaGlwR3JpZDsKICAgICAgY29uc3QgdGltZXMgPSBidWlsZFRpbWVzKGNoaXBHcmlkLnN0YXJ0LCBjaGlwR3JpZC5lbmQsIGNoaXBHcmlkLnN0ZXBNaW4pOwogICAgICBzdGF0ZS50aW1lQmFkZ2VzID0gYnVpbGRUaW1lQmFkZ2VzKHRpbWVzKTsKICAgICAgLy8gSU1QT1JUQU5UOiBkbyBOT1QgYXV0by1zZWxlY3QgYSBkZWZhdWx0IHNsb3QuCiAgICAgIC8vIElmIHRoZSBwcmV2aW91c2x5IHNlbGVjdGVkIHNsb3Qgbm8gbG9uZ2VyIGV4aXN0cyBpbiB0aGUgbmV3IGdyaWQsCiAgICAgIC8vIGNsZWFyIHNlbGVjdGlvbiBpbnN0ZWFkIG9mIGZhbGxpbmcgYmFjayB0byB0aGUgZmlyc3Qgc2xvdC4KICAgICAgaWYgKHN0YXRlLmFjdGl2ZVRpbWUgJiYgIXRpbWVzLmluY2x1ZGVzKHN0YXRlLmFjdGl2ZVRpbWUpKSB7CiAgICAgICAgc3RhdGUuYWN0aXZlVGltZSA9IG51bGw7CiAgICAgIH0KICAgIH0KCiAgICBzdGF0ZS5udW1iZXJzID0gaWREYXRlczsKICAgIHN0YXRlLmxpdnJhaXNvbkJ5U2xvdCA9IGJ1aWxkTGl2cmFpc29uQnlTbG90KGxpdnJhaXNvblNsb3RzKTsgLy8ge30gbWVhbnMgImtub3duOiBub25lIgogICAgLy8gS2VlcCBzZWxlY3Rpb24gY29uc2lzdGVudAogICAgaWYgKGlkRGF0ZXMubGVuZ3RoID09PSAwKXsKICAgICAgc3RhdGUuYWN0aXZlTnVtYmVyID0gbnVsbDsKICAgIH0gZWxzZSBpZiAoIWlkRGF0ZXMuaW5jbHVkZXMoc3RhdGUuYWN0aXZlTnVtYmVyKSl7CiAgICAgIHN0YXRlLmFjdGl2ZU51bWJlciA9IGlkRGF0ZXNbMF07CiAgICB9CgogICAgLy8g4pSA4pSAIFJlc3RvcmUgc2Nyb2xsIHBvc2l0aW9uIGlmIGEgc2xvdCB3YXMgKGFuZCBzdGlsbCBpcykgc2VsZWN0ZWQg4pSA4pSACiAgICBpZiAoaGFkQWN0aXZlVGltZSAmJiBzdGF0ZS5hY3RpdmVUaW1lKXsKICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsKICAgICAgICBpZiAoaXNTbG90SW5ET00oc3RhdGUuYWN0aXZlVGltZSkpewogICAgICAgICAgcmVzdG9yZVRpbWVDaGlwc1Njcm9sbChzYXZlZFNjcm9sbCk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KCiAgfSBjYXRjaCAoZSl7CiAgICAvLyBJbiBjYXNlIG9mIEFQSSBlcnJvciwga2VlcCBsYXN0IGtub3duIHN0YXRlIGJ1dCBhdm9pZCBjcmFzaGluZyBVSQogICAgY29uc29sZS53YXJuKCJbb3JkZXJzXSBsb2FkRGFpbHlPcmRlclRhYnMgZmFpbGVkOiIsIGUpOwogIH0KfQoKYXN5bmMgZnVuY3Rpb24gZmV0Y2hPcmRlckRldGFpbHNCeU9yZGVySWRMb2NhbCh7IHN0b3JlLCBkYXRlLCBvcmRlcklkIH0gPSB7fSl7CiAgY29uc3QgcyA9IChzdG9yZSA9PT0gInBlbCIpID8gInBlbCIgOiAibGFuIjsKICBjb25zdCBkID0gU3RyaW5nKGRhdGUgPz8gIiIpLnRyaW0oKTsKICBjb25zdCBpZCA9IE51bWJlcihvcmRlcklkKTsKICBpZiAoIU51bWJlci5pc0Zpbml0ZShpZCkgfHwgaWQgPD0gMCkgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIG9yZGVyX2lkIik7CgogIGNvbnN0IHFzID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7CiAgICBzdG9yZTogcywKICAgIGRhdGU6IGQsCiAgICBvcmRlcl9pZDogU3RyaW5nKE1hdGgudHJ1bmMoaWQpKSwKICAgIF90czogU3RyaW5nKERhdGUubm93KCkpLAogIH0pOwoKICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgYXBpL29yZGVyRGV0YWlscy5waHA/JHtxcy50b1N0cmluZygpfWAsIHsKICAgIG1ldGhvZDogIkdFVCIsCiAgICBoZWFkZXJzOiB7IEFjY2VwdDogImFwcGxpY2F0aW9uL2pzb24iIH0sCiAgICBjcmVkZW50aWFsczogInNhbWUtb3JpZ2luIiwKICAgIGNhY2hlOiAibm8tc3RvcmUiLAogIH0pOwoKICBjb25zdCB0eHQgPSBhd2FpdCByZXMudGV4dCgpOwogIGxldCBkYXRhID0gbnVsbDsKICB0cnkgewogICAgZGF0YSA9IEpTT04ucGFyc2UodHh0KTsKICB9IGNhdGNoIChlKSB7CiAgICBkYXRhID0gbnVsbDsKICB9CgogIGlmICghcmVzLm9rIHx8ICFkYXRhIHx8IGRhdGEub2sgIT09IHRydWUpIHsKICAgIHRocm93IG5ldyBFcnJvcigoZGF0YSAmJiBkYXRhLmVycm9yKSA/IFN0cmluZyhkYXRhLmVycm9yKSA6ICJBUEkgZXJyb3IiKTsKICB9CgogIHJldHVybiBkYXRhOwp9Cgphc3luYyBmdW5jdGlvbiBoeWRyYXRlTG9hZGVkT3JkZXJQYXlsb2FkKHsKICBzdGF0ZSwKICBtb2NrLAogIHN0b3JlLAogIGRhdGUsCiAgcGF5bG9hZCwKICBsb2FkZWRNZXRhID0gbnVsbCwKICBwcmVzZXJ2ZUxvYWRlZE9yZGVyQ29udGV4dCA9IHRydWUsCn0gPSB7fSl7CiAgY29uc3Qgb3JkZXIgPSBwYXlsb2FkPy5vcmRlciAmJiB0eXBlb2YgcGF5bG9hZC5vcmRlciA9PT0gIm9iamVjdCIgPyBwYXlsb2FkLm9yZGVyIDogbnVsbDsKICBjb25zdCBjdXN0b21lciA9IHBheWxvYWQ/LmN1c3RvbWVyICYmIHR5cGVvZiBwYXlsb2FkLmN1c3RvbWVyID09PSAib2JqZWN0IiA/IHBheWxvYWQuY3VzdG9tZXIgOiBudWxsOwogIGNvbnN0IHBpenphcyA9IEFycmF5LmlzQXJyYXkocGF5bG9hZD8ucGl6emFzKSA/IHBheWxvYWQucGl6emFzIDogW107CiAgY29uc3QgcGF5bWVudHMgPSBBcnJheS5pc0FycmF5KHBheWxvYWQ/LnBheW1lbnRzKSA/IHBheWxvYWQucGF5bWVudHMgOiBbXTsKICBjb25zdCBocDAgPSBvcmRlcj8uaGV1cmVfcHJlcGEgPz8gbnVsbDsKICBjb25zdCBub3JtYWxpemVkTWV0YSA9IChsb2FkZWRNZXRhICYmIHR5cGVvZiBsb2FkZWRNZXRhID09PSAib2JqZWN0IikKICAgID8gewogICAgICBzdG9yZSwKICAgICAgaWQ6IE51bWJlcihsb2FkZWRNZXRhPy5pZCA/PyBvcmRlcj8uaWQgPz8gMCkgfHwgMCwKICAgICAgaWRfZGF0ZTogTnVtYmVyKGxvYWRlZE1ldGE/LmlkX2RhdGUgPz8gb3JkZXI/LmlkX2RhdGUgPz8gMCkgfHwgMCwKICAgICAgZGF0ZUlTTzogU3RyaW5nKGxvYWRlZE1ldGE/LmRhdGVJU08gPz8gZGF0ZSA/PyAiIikudHJpbSgpLAogICAgICBoZXVyZV9wcmVwYTogTnVtYmVyKGxvYWRlZE1ldGE/LmhldXJlX3ByZXBhID8/IGhwMCA/PyAwKSB8fCAwLAogICAgfQogICAgOiB7CiAgICAgIHN0b3JlLAogICAgICBpZDogTnVtYmVyKG9yZGVyPy5pZCA/PyAwKSB8fCAwLAogICAgICBpZF9kYXRlOiBOdW1iZXIob3JkZXI/LmlkX2RhdGUgPz8gMCkgfHwgMCwKICAgICAgZGF0ZUlTTzogU3RyaW5nKGRhdGUgPz8gIiIpLnRyaW0oKSwKICAgICAgaGV1cmVfcHJlcGE6IE51bWJlcihocDApIHx8IDAsCiAgICB9OwoKICAvLyBTdG9yZSByYXcgcGF5bG9hZCBmb3IgbGF0ZXIgbmVlZHMgKG5vbi1pbmplY3RhYmxlIGluZm8pCiAgc3RhdGUubG9hZGVkT3JkZXIgPSBvcmRlcjsKICBzdGF0ZS5sb2FkZWRDdXN0b21lclJhdyA9IGN1c3RvbWVyOwogIHN0YXRlLmxvYWRlZE9yZGVyUGF5bWVudHMgPSBwYXltZW50czsKICBzdGF0ZS5sb2FkZWRPcmRlck1ldGEgPSBub3JtYWxpemVkTWV0YTsKICAvLyBVSS1vbmx5IHRyYWNlOiBzaG93IHdoaWNoIGltcG9ydGVkIG9yZGVyIGlzIGN1cnJlbnRseSBvcGVuZWQgaW4gY2Fpc3NlLgogIHN0YXRlLmltcG9ydGVkT3JkZXJJZERhdGUgPSAobm9ybWFsaXplZE1ldGEuaWRfZGF0ZSA+IDApID8gbm9ybWFsaXplZE1ldGEuaWRfZGF0ZSA6IG51bGw7CgogIC8vIEFwcGx5IHNhdmVkIG9yZGVyIHRvZ2dsZXMgdGhyb3VnaCB0aGUgY2VudHJhbGl6ZWQgaW1wb3J0ZWQtb3JkZXIgcnVsZS4KICBhcHBseUltcG9ydGVkT3JkZXJNb2Rlcyh7IHN0YXRlLCBvcmRlciB9KTsKCiAgLy8gU2VsZWN0IGNoaXAgYnkgaGV1cmVfcHJlcGEgKHN0cmljdCBtYXRjaDogbm8gYWRqdXN0bWVudCwgbm8gZmFsbGJhY2spCiAgY29uc3QgaHAgPSBocDA7CiAgY29uc3QgaGhtbSA9IHN0cmljdENoaXBUaW1lRnJvbUhldXJlUHJlcGEoewogICAgc3RhdGUsCiAgICBtb2NrLAogICAgaGV1cmVQcmVwYU1zOiBocCwKICAgIGNvbnRleHQ6IHsgc3RvcmUsIGRhdGUsIGlkX2RhdGU6IG5vcm1hbGl6ZWRNZXRhLmlkX2RhdGUgfHwgMCB9LAogIH0pOwogIC8vIElNUE9SVEFOVDogdXNlIHRoZSBleGFjdCBzYW1lIHVwZGF0ZSBtZWNoYW5pc20gYXMgYSB1c2VyIGNsaWNrCiAgLy8gKHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggKyBjb25zaXN0ZW50IFVJIHJlZnJlc2ggcGF0aCkuCiAgc2V0QWN0aXZlVGltZSh7CiAgICBzdGF0ZSwKICAgIGhobW0sCiAgICBzb3VyY2U6ICJvcmRlcl9pbXBvcnQiLAogICAgLy8ga2VlcCBleGlzdGluZyBzdHJpY3QgYmVoYXZpb3VyOiBpZiBoaG1tIGlzIG51bGwsIHdlIGtlZXAgYWN0aXZlVGltZSBhcy1pcwogICAgaWdub3JlSW52YWxpZDogdHJ1ZSwKICB9KTsKCiAgLy8gSU1QT1JUQU5UOgogIC8vIC0gRG8gTk9UIHVzZSAic2Nyb2xsIHRvIG5vdyAtMTAiIGhlcmUgKHRvZGF5LW9ubHkgYmVoYXZpb3IpLgogIC8vIC0gRm9yIG9yZGVyIGltcG9ydC9yZWNvdmVyLCB3ZSBNVVNUIGZvcmNlLXNjcm9sbCB0byB0aGUgaW1wb3J0ZWQgaGV1cmVfcHJlcGEgY2hpcCwKICAvLyAgIGV2ZW4gb24gcGFzdC9mdXR1cmUgZGF5cy4KICAvLyBXZSBkZWZlciB0aGUgYWN0dWFsIHNjcm9sbCB0byB0aGUgVUkgcmVuZGVyIHBhdGggdG8gYXZvaWQgcmFjZXMgd2l0aAogIC8vIGNvbnRyb2xsZXIncyAicmVzdG9yZSBwcmV2aW91cyBzY3JvbGwiIGxvZ2ljLgogIGlmIChzdGF0ZS5hY3RpdmVUaW1lKXsKICAgIHN0YXRlLnVpU2Nyb2xsVG9UaW1lID0gc3RhdGUuYWN0aXZlVGltZTsKICB9CgogIC8vIEluamVjdCBjbGllbnQgaW50byBsZWZ0IHBhbmVsIChrZWVwIGVtcHR5IGlmIEFQSSBoYXMgbm8gY3VzdG9tZXIpCiAgc3RhdGUuY2xpZW50ID0gY3VzdG9tZXIgPyBidWlsZEluamVjdGVkQ2xpZW50RnJvbUFwaShjdXN0b21lcikgOiBidWlsZEVtcHR5Q2xpZW50KCk7CiAgLy8gS2VlcCBzdG9wX3NtcyBhdmFpbGFibGUgd2l0aG91dCByZWx5aW5nIG9uIGJ1aWxkSW5qZWN0ZWRDbGllbnRGcm9tQXBpIG1hcHBpbmcgKGRlZmVuc2l2ZSkuCiAgaWYgKGN1c3RvbWVyICYmIHN0YXRlLmNsaWVudCAmJiB0eXBlb2Ygc3RhdGUuY2xpZW50ID09PSAib2JqZWN0Iil7CiAgICBzdGF0ZS5jbGllbnQuc3RvcFNtcyA9IHJlYWRTdG9wU21zVmFsdWUoY3VzdG9tZXIpOwogIH0KICBpZiAoc3RhdGUuY2xpZW50ICYmIHR5cGVvZiBzdGF0ZS5jbGllbnQgPT09ICJvYmplY3QiKXsKICAgIHN5bmNJbmplY3RlZENsaWVudERlbGl2ZXJ5U3RhdGUoc3RhdGUuY2xpZW50LCBzdG9yZSk7CiAgfQogIHN0YXRlLnRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcyA9IGJ1aWxkTG9hZGVkVGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzKHBheWxvYWQ/LnRlbXBvcmFyeV9kZWxpdmVyeV9hZGRyZXNzLCBzdG9yZSk7CgogIC8vIFJlc2V0IGJhc2tldCArIHJlYnVpbGQgZnJvbSBvcmRlciBwaXp6YXMKICBzdGF0ZS5hZGRlZEl0ZW1zID0gW107CiAgc3RhdGUubGFzdEFkZGVkUGl6emEgPSBudWxsOwoKICAvLyBTbmFwc2hvdCBmb3IgZGlmZiB1cGRhdGU6IHN0b3JlZCBpbiBwYXJhbGxlbCB3aXRoIGluamVjdGVkIGJhc2tldCBsaW5lcwogIGNvbnN0IHNuYXBzaG90SXRlbXMgPSBbXTsKICBmb3IgKGNvbnN0IHB6IG9mIHBpenphcyl7CiAgICBjb25zdCBwaXp6YUlkID0gcHo/LnBpenphX2lkID8/IHB6Py5pZF9wb3NfcGl6emFzID8/IHB6Py5pZCA/PyBudWxsOwogICAgY29uc3Qgb3JkZXJlZElkID0gcHo/Lm9yZGVyZWRfaWQgPz8gcHo/LmlkX3Bvc19waXp6YXNfY29tbWFuZGVlcyA/PyBudWxsOwogICAgY29uc3QgbW9kaWZzID0gQXJyYXkuaXNBcnJheShwej8ubW9kaWZzKSA/IHB6Lm1vZGlmcyA6IFtdOwoKICAgIC8vIFByZWZlciBjYXRhbG9nIGRhdGEgKGJlc3QgVUkgZmlkZWxpdHkpLCBmYWxsYmFjayB0byBBUEktcHJvdmlkZWQgYmFzaWNzCiAgICBjb25zdCBjYXQgPSBmaW5kQ2F0YWxvZ1BpenphQnlJZChzdGF0ZSwgcGl6emFJZCk7CiAgICBjb25zdCBiYXNlRnJvbUFwaSA9IFN0cmluZyhwej8uYmFzZSA/PyAiIikudHJpbSgpOwogICAgY29uc3QgcGl6emFPYmogPSBjYXQKICAgICAgPyB7IC4uLmNhdCB9CiAgICAgIDogewogICAgICAgIGlkOiBOdW1iZXIocGl6emFJZCksCiAgICAgICAgbmFtZTogU3RyaW5nKHB6Py5uYW1lID8/IHB6Py5waXp6YV9uYW1lID8/ICIiKS50cmltKCksCiAgICAgICAgY29tcGxldGVfbmFtZTogU3RyaW5nKHB6Py5jb21wbGV0ZV9uYW1lID8/ICIiKS50cmltKCksCiAgICAgICAgYmFzZTogYmFzZUZyb21BcGkgfHwgIlNhdWNlIFRvbWF0ZSIsCiAgICAgICAgcHJpY2VfbGFyZ2U6IE51bWJlcihwej8ucHJpY2VfbGFyZ2UgPz8gMCksCiAgICAgICAgcHJpY2VfbWVkaXVtOiBOdW1iZXIocHo/LnByaWNlX21lZGl1bSA/PyAwKSwKICAgICAgICByYWNjb3VyY2lzOiAiIiwKICAgICAgfTsKCiAgICAvLyBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGxpbmUgaXMgYSBwaXp6YSB2cyBib2lzc29uL3LDqWR1Y3Rpb24gZnJvbSBpdHMgYmFzZS4KICAgIC8vIElNUE9SVEFOVDogZG8gbm90IGZvcmNlIHBpenphIGJhc2UgZGVmYXVsdHMgZm9yIG5vbi1waXp6YSBsaW5lcy4KICAgIGNvbnN0IHRtcExpbmUgPSBtYWtlT3JkZXJMaW5lKHBpenphT2JqKTsKICAgIGlmICghdG1wTGluZSB8fCAhdG1wTGluZS5uYW1lKSBjb250aW51ZTsKCiAgICBpZiAodG1wTGluZS5jbGFzcyA9PT0gInBpenphIil7CiAgICAgIGVuc3VyZVBpenphQmFzZShwaXp6YU9iaik7CiAgICB9CgogICAgLy8gQnVpbGQgdGhlIGZpbmFsIGxpbmUgc2hhcGU6CiAgICAvLyAtIHBpenphcyB1c2UgbWFrZVBpenphTGluZSAoc3VwcG9ydHMgZXh0cmFzL21vZGlmcykKICAgIC8vIC0gbm9uLXBpenphcyB1c2UgbWFrZU9yZGVyTGluZSAoY291bnQgZXhjbHVkZWQgYnV0IHByaWNlIGluY2x1ZGVkKQogICAgY29uc3QgbGluZSA9ICh0bXBMaW5lLmNsYXNzID09PSAicGl6emEiKSA/IG1ha2VQaXp6YUxpbmUocGl6emFPYmopIDogdG1wTGluZTsKICAgIGlmICghbGluZSB8fCAhbGluZS5uYW1lKSBjb250aW51ZTsKCiAgICAvLyBFbnN1cmUgc3RhYmxlIGlkcyBmb3IgY29tcG9zaXRpb24gbW9kYWwKICAgIGNvbnN0IHBpZCA9IE51bWJlcihwaXp6YU9iaj8uaWQpOwogICAgaWYgKE51bWJlci5pc0Zpbml0ZShwaWQpKXsKICAgICAgaWYgKGxpbmUucGl6emFfaWQgPT0gbnVsbCB8fCBTdHJpbmcobGluZS5waXp6YV9pZCkudHJpbSgpID09PSAiIikgbGluZS5waXp6YV9pZCA9IHBpZDsKICAgICAgaWYgKGxpbmUuaWQgPT0gbnVsbCB8fCBTdHJpbmcobGluZS5pZCkudHJpbSgpID09PSAiIikgbGluZS5pZCA9IHBpZDsKICAgIH0KCiAgICAvLyBUYWcgbGluZSB3aXRoIGJhY2tlbmQgb3JkZXJlZCBpZCAoZGVidWcvdHJhY2UsIG5vbi1VSSkKICAgIGlmIChvcmRlcmVkSWQgIT0gbnVsbCkgbGluZS5vcmRlcmVkX2lkID0gb3JkZXJlZElkOwoKICAgIC8vIFJlY29yZCBzbmFwc2hvdCByZXByZXNlbnRhdGlvbiAob3JkZXJlZF9pZCBpcyB0aGUgc3RhYmxlIHNlcnZlci1zaWRlIGxpbmUgaWRlbnRpZmllcikKICAgIGNvbnN0IHNuYXAgPSB7CiAgICAgIG9yZGVyZWRfaWQ6IChvcmRlcmVkSWQgIT0gbnVsbCkgPyBOdW1iZXIob3JkZXJlZElkKSA6IG51bGwsCiAgICAgIGlkX3Bvc19waXp6YXM6IE51bWJlcihwaXp6YU9iaj8uaWQpIHx8IE51bWJlcihwaXp6YUlkKSB8fCBudWxsLAogICAgICBkYXRhX2lkOiBTdHJpbmcocHo/LmRhdGFfaWQgPz8gbGluZT8uZGF0YV9pZCA/PyAiIikudHJpbSgpLAogICAgICBjbGFzczogU3RyaW5nKGxpbmU/LmNsYXNzID8/IHRtcExpbmU/LmNsYXNzID8/ICIiKS50cmltKCkudG9Mb3dlckNhc2UoKSwKICAgICAgbW9kaWZzOiBBcnJheS5pc0FycmF5KG1vZGlmcykgPyBtb2RpZnMubWFwKChtKSA9PiAoewogICAgICAgIG5vbV9vcHRpb246IFN0cmluZyhtPy5ub21fb3B0aW9uID8/ICIiKS50cmltKCksCiAgICAgICAgY2xhc3Nfb3B0aW9uOiBTdHJpbmcobT8uY2xhc3Nfb3B0aW9uID8/ICIiKS50cmltKCksCiAgICAgICAgZGF0YV9wcmljZTogTnVtYmVyKG0/LmRhdGFfcHJpY2UgPz8gMCkgfHwgMCwKICAgICAgfSkpIDogW10sCiAgICB9OwogICAgc25hcHNob3RJdGVtcy5wdXNoKHNuYXApOwoKICAgIC8vIEFwcGx5IG1vZGlmaWNhdGlvbnMgT05MWSBmb3IgcGl6emEgbGluZXMgKGV4dHJhcyBpbXBhY3QgdG90YWwsIGJ1dCBub3QgcGl6emEgY291bnQgbG9naWMpLgogICAgaWYgKGxpbmUuY2xhc3MgPT09ICJwaXp6YSIpewogICAgICBsaW5lLmFkZGVkSW5ncmVkaWVudHMgPSBbXTsKICAgICAgbGluZS5zZWxlY3RlZE9wdGlvbnMgPSBbXTsKICAgICAgbGluZS5hZGRlZEluZ3JlZGllbnRMaW5lcyA9IFtdOwogICAgICBsaW5lLnNlbGVjdGVkT3B0aW9uTGluZXMgPSBbXTsKICAgICAgbGluZS5yZW1vdmVkSW5ncmVkaWVudHMgPSBbXTsKICAgICAgbGluZS5yZW1vdmVkSW5ncmVkaWVudE5hbWVzID0gW107CiAgICAgIGxpbmUubWFudWFsRXh0cmFzID0gW107CgogICAgICAvLyDilIDilIAgQnVpbGQgY29tcG9zaXRpb24gc2V0IHRvIGRldGVjdCByZW1vdmFscyB2cyBhZGRpdGlvbnMg4pSA4pSACiAgICAgIGNvbnN0IGNvbXBvc2l0aW9uTmFtZVNldCA9IG5ldyBTZXQoKTsKICAgICAgY29uc3QgX2lkeCA9IHN0YXRlLmNhdGFsb2dJbmRleDsKICAgICAgY29uc3QgX2Fzc29jQnlQaXp6YSA9IF9pZHg/LnBpenphQXNzb2NCeUlkIGluc3RhbmNlb2YgTWFwID8gX2lkeC5waXp6YUFzc29jQnlJZCA6IG51bGw7CiAgICAgIGNvbnN0IF9pbmdCeUlkID0gX2lkeD8uaW5ncmVkaWVudEJ5SWQgaW5zdGFuY2VvZiBNYXAgPyBfaWR4LmluZ3JlZGllbnRCeUlkIDogbnVsbDsKCiAgICAgIGNvbnN0IF9waWQgPSBOdW1iZXIocGl6emFPYmo/LmlkKTsKICAgICAgaWYgKE51bWJlci5pc0Zpbml0ZShfcGlkKSAmJiBfYXNzb2NCeVBpenphICYmIF9hc3NvY0J5UGl6emEuaGFzKF9waWQpKXsKICAgICAgICBjb25zdCBhc3NvY0xpc3QgPSBfYXNzb2NCeVBpenphLmdldChfcGlkKSB8fCBbXTsKICAgICAgICBmb3IgKGNvbnN0IGEgb2YgYXNzb2NMaXN0KXsKICAgICAgICAgIGNvbnN0IGlpZCA9IE51bWJlcihhPy5pbmdyZWRpZW50X2lkKTsKICAgICAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKGlpZCkpIGNvbnRpbnVlOwogICAgICAgICAgY29uc3QgaW5nID0gX2luZ0J5SWQgPyBfaW5nQnlJZC5nZXQoaWlkKSA6IG51bGw7CiAgICAgICAgICBpZiAoaW5nKXsKICAgICAgICAgICAgY29uc3QgaW5nTmFtZSA9IFN0cmluZyhpbmcuaW5ncmVkaWVudF9uYW1lID8/ICIiKS50cmltKCkudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgaWYgKGluZ05hbWUpIGNvbXBvc2l0aW9uTmFtZVNldC5hZGQoaW5nTmFtZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBmb3IgKGNvbnN0IG0gb2YgbW9kaWZzKXsKICAgICAgICBjb25zdCBjbHMgPSBTdHJpbmcobT8uY2xhc3Nfb3B0aW9uID8/IG0/LmNsYXNzID8/ICIiKS50cmltKCkudG9Mb3dlckNhc2UoKTsKICAgICAgICBsZXQgbm0gPSBTdHJpbmcobT8ubm9tX29wdGlvbiA/PyBtPy5uYW1lID8/ICIiKS50cmltKCk7CiAgICAgICAgaWYgKCFubSkgY29udGludWU7CiAgICAgICAgLy8gQ29tbW9uIERCIHZhbHVlczogIisgZW1tZW50YWwiIC8gImNob3Jpem8iCiAgICAgICAgY29uc3Qgbm1DbGVhbiA9IG5tLnJlcGxhY2UoL15cK1xzKi8sICIiKS50cmltKCk7CiAgICAgICAgY29uc3QgcHJpY2UgPSBOdW1iZXIobT8uZGF0YV9wcmljZSA/PyBtPy5wcmljZSA/PyAwKTsKICAgICAgICBjb25zdCBubUxvd2VyID0gbm1DbGVhbi50b0xvd2VyQ2FzZSgpOwoKICAgICAgICAvLyDilIDilIAgUHJlc2VydmUgIm1leHRyYV9faW5wdXQiIC8gZnJlZS10ZXh0IHBhaWQgZXh0cmFzIOKUgOKUgAogICAgICAgIC8vIFRoZXNlIGFyZSBzdG9yZWQgaW4gREIgYXMgY2xhc3Nfb3B0aW9uPSJleHRyYS1pdGVtIiB3aXRoIGEgZGF0YV9wcmljZS4KICAgICAgICAvLyBJZiB3ZSBpbmNvcnJlY3RseSBtYXAgdGhlbSB0byBpbmdyZWRpZW50L29wdGlvbnMgYXJyYXlzLCB0aGUgbGF0ZXIKICAgICAgICAvLyBjYXRhbG9nIGxvb2t1cCBtYXkgZmFpbCBhbmQgdGhlIHByaWNlIGJlY29tZXMgMCBvbiBpbXBvcnQgKyBvbiBzYXZlL3VwZGF0ZS4KICAgICAgICBjb25zdCBpc0V4dHJhSXRlbSA9IChjbHMgPT09ICJleHRyYS1pdGVtIiB8fCBjbHMuaW5jbHVkZXMoImV4dHJhIikpOwogICAgICAgIGlmIChpc0V4dHJhSXRlbSl7CiAgICAgICAgICBjb25zdCBwID0gTnVtYmVyLmlzRmluaXRlKHByaWNlKSA/IHByaWNlIDogMDsKICAgICAgICAgIGNvbnN0IGxibCA9IG5tQ2xlYW47CiAgICAgICAgICAvLyBLZWVwIGVhY2ggREIgcm93IGFzIGEgZGlzdGluY3QgbWFudWFsIGVudHJ5LgogICAgICAgICAgbGluZS5tYW51YWxFeHRyYXMucHVzaCh7IGxhYmVsOiBsYmwsIGFtb3VudDogcCB9KTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgLy8g4pSA4pSAIERldGVjdCByZW1vdmFsIOKUgOKUgAogICAgICAgIC8vIFJlbW92ZWQgaWY6IGluIGJhc2UgY29tcG9zaXRpb24gKyBwcmljZSA9PSAwICsgbm90IGFuIG9wdGlvbgogICAgICAgIGNvbnN0IGlzT3B0aW9uID0gY2xzLmluY2x1ZGVzKCJvcHRpb24iKTsKICAgICAgICBjb25zdCBpc0luQ29tcG9zaXRpb24gPSBjb21wb3NpdGlvbk5hbWVTZXQuaGFzKG5tTG93ZXIpOwogICAgICAgIGNvbnN0IGlzUmVtb3ZhbCA9ICFpc09wdGlvbiAmJiBpc0luQ29tcG9zaXRpb24gJiYgKCFOdW1iZXIuaXNGaW5pdGUocHJpY2UpIHx8IHByaWNlID09PSAwKTsKCiAgICAgICAgaWYgKGlzUmVtb3ZhbCl7CiAgICAgICAgICAvLyBSZW1vdmVkIGluZ3JlZGllbnQg4oaSIHN0eWxlIGJhcnLDqSwgbm8gcHJpY2UgaW1wYWN0CiAgICAgICAgICBjb25zdCBrZXkgPSBub3JtYWxpemVLZXlGcm9tTmFtZSh7IHN0YXRlLCBuYW1lOiBubUNsZWFuLCBraW5kOiAiYWRkZWRJbmdyZWRpZW50IiB9KTsKICAgICAgICAgIGlmIChrZXkpIGxpbmUucmVtb3ZlZEluZ3JlZGllbnRzLnB1c2goa2V5KTsKICAgICAgICAgIGxpbmUucmVtb3ZlZEluZ3JlZGllbnROYW1lcy5wdXNoKG5tQ2xlYW4pOwoKICAgICAgICB9IGVsc2UgaWYgKGlzT3B0aW9uKXsKICAgICAgICAgIC8vIE9wdGlvbiDihpIgc2VsZWN0ZWRPcHRpb25zIChpbXBhY3RzIGV4dHJhQ29tcHV0ZWQgaWYgcGFpZCkKICAgICAgICAgIGNvbnN0IGtleSA9IG5vcm1hbGl6ZUtleUZyb21OYW1lKHsgc3RhdGUsIG5hbWU6IG5tQ2xlYW4sIGtpbmQ6ICJzZWxlY3RlZE9wdGlvbiIgfSk7CiAgICAgICAgICBpZiAoa2V5KSBsaW5lLnNlbGVjdGVkT3B0aW9ucy5wdXNoKGtleSk7CiAgICAgICAgICBjb25zdCBsaW5lVHh0ID0gKE51bWJlci5pc0Zpbml0ZShwcmljZSkgJiYgcHJpY2UgIT09IDApCiAgICAgICAgICAgID8gYCR7bm1DbGVhbn0gKCR7Zm10RXVyb1NpZ25lZEZSKHByaWNlKX0pYAogICAgICAgICAgICA6IG5tQ2xlYW47CiAgICAgICAgICBsaW5lLnNlbGVjdGVkT3B0aW9uTGluZXMucHVzaChsaW5lVHh0KTsKCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIEFkZGVkIGluZ3JlZGllbnQg4oaSIGFkZGVkSW5ncmVkaWVudHMgKGltcGFjdHMgZXh0cmFDb21wdXRlZCBpZiBwYWlkKQogICAgICAgICAgY29uc3Qga2V5ID0gbm9ybWFsaXplS2V5RnJvbU5hbWUoeyBzdGF0ZSwgbmFtZTogbm1DbGVhbiwga2luZDogImFkZGVkSW5ncmVkaWVudCIgfSk7CiAgICAgICAgICBpZiAoa2V5KSBsaW5lLmFkZGVkSW5ncmVkaWVudHMucHVzaChrZXkpOwogICAgICAgICAgY29uc3QgbGluZVR4dCA9IChOdW1iZXIuaXNGaW5pdGUocHJpY2UpICYmIHByaWNlICE9PSAwKQogICAgICAgICAgICA/IGAke25tQ2xlYW59ICgke2ZtdEV1cm9TaWduZWRGUihwcmljZSl9KWAKICAgICAgICAgICAgOiBubUNsZWFuOwogICAgICAgICAgbGluZS5hZGRlZEluZ3JlZGllbnRMaW5lcy5wdXNoKGxpbmVUeHQpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gS2VlcCBiYWNrd2FyZC1jb21wYXRpYmxlIGFnZ3JlZ2F0ZXMgaW4gc3luYwogICAgICBpZiAoQXJyYXkuaXNBcnJheShsaW5lLm1hbnVhbEV4dHJhcykgJiYgbGluZS5tYW51YWxFeHRyYXMubGVuZ3RoKXsKICAgICAgICBsZXQgc3VtID0gMDsKICAgICAgICBjb25zdCBsYWJlbHMgPSBbXTsKICAgICAgICBmb3IgKGNvbnN0IGl0IG9mIGxpbmUubWFudWFsRXh0cmFzKXsKICAgICAgICAgIGNvbnN0IGEgPSBOdW1iZXIoaXQ/LmFtb3VudCk7CiAgICAgICAgICBpZiAoTnVtYmVyLmlzRmluaXRlKGEpKSBzdW0gKz0gYTsKICAgICAgICAgIGNvbnN0IGxibCA9IFN0cmluZyhpdD8ubGFiZWwgPz8gIiIpLnRyaW0oKTsKICAgICAgICAgIGlmIChsYmwgJiYgIWxhYmVscy5pbmNsdWRlcyhsYmwpKSBsYWJlbHMucHVzaChsYmwpOwogICAgICAgIH0KICAgICAgICBsaW5lLmV4dHJhQW1vdW50ID0gTnVtYmVyLmlzRmluaXRlKHN1bSkgPyBzdW0gOiAwOwogICAgICAgIGxpbmUuZXh0cmFMYWJlbCA9IGxhYmVscy5qb2luKCIgLyAiKTsKICAgICAgfQoKICAgICAgcmVjb21wdXRlRXh0cmFGb3JMaW5lKHsgc3RhdGUsIGxpbmUgfSk7CiAgICB9CgogICAgc3RhdGUuYWRkZWRJdGVtcy5wdXNoKGxpbmUpOwogICAgaWYgKGxpbmUuY2xhc3MgPT09ICJwaXp6YSIpIHN0YXRlLmxhc3RBZGRlZFBpenphID0gbGluZTsKICB9CgogIGlmIChwcmVzZXJ2ZUxvYWRlZE9yZGVyQ29udGV4dCkgewogICAgLy8gUGVyc2lzdCBpbml0aWFsIHNuYXBzaG90IGZvciBsYXRlciBkaWZmLWJhc2VkIHVwZGF0ZQogICAgc3RhdGUubG9hZGVkT3JkZXJTbmFwc2hvdCA9IHsgaXRlbXM6IHNuYXBzaG90SXRlbXMgfTsKICB9IGVsc2UgewogICAgLy8gSW1wb3J0ZWQgdGVtcG9yYXJ5IHdlYiBvcmRlcnMgbXVzdCBiZWhhdmUgbGlrZSBhIG5ldyBlZGl0YWJsZSBiYXNrZXQsCiAgICAvLyBub3QgbGlrZSBhIGxpdmUgdXBkYXRlIG9mIHRoZSBzb3VyY2UgREIgb3JkZXIuCiAgICBzdGF0ZS5sb2FkZWRPcmRlck1ldGEgPSBudWxsOwogICAgc3RhdGUuaW1wb3J0ZWRPcmRlcklkRGF0ZSA9IG51bGw7CiAgICBzdGF0ZS5sb2FkZWRPcmRlclNuYXBzaG90ID0gW107CiAgICBzdGF0ZS5sb2FkZWRPcmRlclBheW1lbnRzID0gW107CiAgICBzdGF0ZS5tb2RpZkNvbW1hbmRlID0gZmFsc2U7CiAgfQoKICAvLyBVWDogc3VwcHJlc3MgIkRvdWJsZSBjbGlxdWUgcG91ciBpbXBvcnRlci4uLiIgaGludCByaWdodCBhZnRlciBhbiBpbXBvcnQuCiAgLy8gKE9wZXJhdG9ycyBvZnRlbiB0YXAgYSB0YWIgcmlnaHQgYWZ0ZXIgaW1wb3J0OyB3ZSBkb24ndCB3YW50IHRvIG5hZy4pCiAgdHJ5ewogICAgc3RhdGUudWlMYXN0T3JkZXJJbXBvcnRlZEF0ID0gRGF0ZS5ub3coKTsKICB9IGNhdGNoIChlKSB7fQogIHJldHVybiB0cnVlOwp9CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZE9yZGVyQnlJZERhdGUoeyBzdGF0ZSwgbW9jaywgaWREYXRlIH0gPSB7fSl7CiAgY29uc3QgcGR2ID0gZ2V0UERWQ3VycmVudCgpOwogIGNvbnN0IHN0b3JlID0gc3RvcmVUb1N1ZmZpeChwZHYpOwogIGNvbnN0IGRhdGUgPSBzdGF0ZS5zZWxlY3RlZERhdGVJU087CiAgY29uc3QgaWRfZGF0ZSA9IE51bWJlcihpZERhdGUpOwogIGlmICghTnVtYmVyLmlzRmluaXRlKGlkX2RhdGUpKSByZXR1cm4gZmFsc2U7CgogIHRyeXsKICAgIHRvYXN0KGBDaGFyZ2VtZW50IGNvbW1hbmRlICR7aWRfZGF0ZX3igKZgLCB7IGR1cmF0aW9uOiAxMjAwIH0pOwogIH0gY2F0Y2ggKGUpIHt9CgogIHRyeXsKICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCBmZXRjaE9yZGVyRGV0YWlscyh7IHN0b3JlLCBkYXRlLCBpZERhdGU6IGlkX2RhdGUgfSk7CiAgICByZXR1cm4gYXdhaXQgaHlkcmF0ZUxvYWRlZE9yZGVyUGF5bG9hZCh7CiAgICAgIHN0YXRlLAogICAgICBtb2NrLAogICAgICBzdG9yZSwKICAgICAgZGF0ZSwKICAgICAgcGF5bG9hZCwKICAgICAgbG9hZGVkTWV0YTogewogICAgICAgIHN0b3JlLAogICAgICAgIGlkOiBOdW1iZXIocGF5bG9hZD8ub3JkZXI/LmlkID8/IDApIHx8IDAsCiAgICAgICAgaWRfZGF0ZSwKICAgICAgICBkYXRlSVNPOiBkYXRlLAogICAgICAgIGhldXJlX3ByZXBhOiBOdW1iZXIocGF5bG9hZD8ub3JkZXI/LmhldXJlX3ByZXBhID8/IDApIHx8IDAsCiAgICAgIH0sCiAgICAgIHByZXNlcnZlTG9hZGVkT3JkZXJDb250ZXh0OiB0cnVlLAogICAgfSk7CiAgfSBjYXRjaCAoZSl7CiAgICBjb25zb2xlLndhcm4oIltvcmRlcnNdIGxvYWRPcmRlckJ5SWREYXRlIGZhaWxlZDoiLCBlKTsKICAgIC8vIERlZmVuc2l2ZTogbmV2ZXIga2VlcCBzdGFsZSBwYXltZW50cyB3aGVuIGxvYWQgZmFpbHMKICAgIHN0YXRlLmxvYWRlZE9yZGVyUGF5bWVudHMgPSBbXTsKICAgIHN0YXRlLmltcG9ydGVkT3JkZXJJZERhdGUgPSBudWxsOwogICAgdHJ5eyB0b2FzdCgiSW1wb3NzaWJsZSBkZSBjaGFyZ2VyIGxhIGNvbW1hbmRlLiIpOyB9IGNhdGNoIChlMikge30KICAgIHJldHVybiBmYWxzZTsKICB9Cn0="
            },
            "after": {
                "exists": true,
                "kind": "file",
                "size": 24588,
                "sha1": "884855c9f771f8c86bb587558686ee4f00964da6",
                "content_b64": "LyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqLwovKiBkb2MtcHJvamVjdCB8IGNhaXNzZS1hcXAvcHVibGljL2Fzc2V0cy9qcy9hcHAtanMvbG9hZGVycy9vcmRlcnNMb2FkZXIuanMgfCBDaGFyZ2UgbGVzIGNvbW1hbmRlcyBkdSBqb3VyLCByZXN0YXVyZSB1bmUgY29tbWFuZGUgcGFyIGlkL2RhdGUsIHBlcm1ldCBhdXNzaSBkZSByZWxpcmUgdW5lIGNvbW1hbmRlIHRlbXBvcmFpcmUgcGF5bWVudF9yZXF1aXJlZCBwYXIgb3JkZXJfaWQgcG91ciBsYSByZXByaXNlIGNhaXNzZSBzYW5zIHBhbmllciBKU09OIGxlZ2FjeSwgcHVpcyBpbmplY3RlIGzigJnDqXRhdCBVSSBhc3NvY2nDqSAodGVtcHMsIGNsaWVudCwgcGFuaWVyLCBiYWRnZXMpIGFpbnNpIHF1ZSBs4oCZYWRyZXNzZSBkZSBsaXZyYWlzb24gcHJvdmlzb2lyZSBwb3J0w6llIHBhciBsYSBjb21tYW5kZSwgZW4gbcOpbW9yaXNhbnQgYXVzc2kgbGUgY291cGxlIGNvZGUgcG9zdGFsIC8gdmlsbGUgZOKAmW9yaWdpbmUgcG91ciBxdWUgbGUgc8OpbGVjdGV1ciBjb21wb3NpdGUgcHVpc3NlIHJlc3RlciB2aWRlIGhvcnMgUERWIGNvdXJhbnQgc2FucyBwZXJkcmUgbGVzIHZhbGV1cnMgZMOpasOgIGVucmVnaXN0csOpZXMuIFByw6ljb25zdHJ1aXQgYXVzc2kgbOKAmcOpdGF0IGNvbXBvc2l0ZSBsaXZyYWlzb24gZHUgY2xpZW50IGltcG9ydMOpIHBvdXIgcXVlIGxhIHByw6lzw6lsZWN0aW9uIHJlc3RlIGRpc3BvbmlibGUgbcOqbWUgc2kgbGEgem9uZSBsaXZyYWlzb24gw6l0YWl0IG1hc3F1w6llIGF1IG1vbWVudCBkdSBjaGFyZ2VtZW50LCB0b3V0IGVuIGNvbnNlcnZhbnQgdmlkZSBsZSBzw6lsZWN0ZXVyIGxvcnNxdeKAmXVuZSBhZHJlc3NlIGhpc3RvcmlxdWUgbuKAmWFwcGFydGllbnQgcGFzIGF1eCBjaG9peCBkdSBQRFYgY291cmFudC4gQXBwbGlxdWUgZMOpc29ybWFpcyBsZXMgbW9kZXMgY291cGUvbGl2cmFpc29uIHZpYSB1bmUgcsOoZ2xlIG3DqXRpZXIgY2VudHJhbGlzw6llIHBvdXIgY29uc2VydmVyIHN5c3TDqW1hdGlxdWVtZW50IGxlcyB2YWxldXJzIHLDqWVsbGVtZW50IHNhdXZlZ2FyZMOpZXMgbG9ycyBk4oCZdW4gY2hhcmdlbWVudC9pbXBvcnQuIHwgRXhwb3NlOiByZWNvdmVyT3JkZXIsIGxvYWREYWlseU9yZGVyVGFicywgbG9hZE9yZGVyQnlJZERhdGUsIGxvYWRPcmRlckJ5T3JkZXJJZCB8IETDqXBlbmQgZGU6IC4uLy4uL3NlcnZpY2VzL2FwaS9vcmRlcnNBcGkuanMsIC4uLy4uL3NlcnZpY2VzL2FwaS9vcmRlckRldGFpbHNBcGkuanMsIC4uLy4uL3VpL2RvbS5qcywgLi4vLi4vcG9zL3BpenphT3JkZXIuanMsIC4uLy4uL3Bvcy9vcmRlckxpbmUuanMsIC4uLy4uL2RhdGEvbW9jay5qcywgLi4vdGltZS9hY3RpdmVUaW1lLmpzLCAuLi9wZHYuanMsIC4uL2NhdGFsb2dDYWNoZS5qcywgLi4vcG9zL2Jhc2tldC5qcywgLi4vc3RhdGUvY2xpZW50LmpzP3RzPTIwMjYwNDIyLTEsIC4uL3RpbWUvbGl2cmFpc29uU2xvdHMuanMsIC4uL3RpbWUvdGltZWNoaXBzU2Nyb2xsLmpzLCAuL3Nsb3RCYWRnZXNMb2FkZXIuanMsIC4uL2FkZHJlc3MvZGVsaXZlcnlDaXR5Q2hvaWNlcy5qcz90cz0yMDI2MDQyMi0xLCAuLi9vcmRlck1vZGUvb3JkZXJNb2RlU3RhdGUuanM/dHM9MjAyNjA0MDYtMSwgYXBpL29yZGVyRGV0YWlscy5waHAsIGZldGNoLCBVUkxTZWFyY2hQYXJhbXMgfCBJbXBhY3RlOiDDqXRhdCBkZSBzZXNzaW9uIFVJLCBzw6lsZWN0aW9uIGTigJloZXVyZSwgcGFuaWVyLCBjbGllbnQsIGFkcmVzc2UgdGVtcG9yYWlyZSBkZSBjb21tYW5kZSwgc2Nyb2xsIGRlcyB0aW1lIGNoaXBzLCBub3RpZmljYXRpb25zIHRvYXN0LCByZXByaXNlIGNhaXNzZSBkZXB1aXMgcG9zX2NvbW1hbmRlcy9wb3NfY29tbWFuZGVzX3BlbCwgcmVzdGF1cmF0aW9uIGZpYWJsZSBkZXMgc3dpdGNoZXMgY291cGUvbGl2cmFpc29uIHwgVGFibGVzOiBhdWN1bmUgKi8KCmltcG9ydCB7IGZldGNoT3JkZXJzU3VtbWFyeSB9IGZyb20gIi4uLy4uL3NlcnZpY2VzL2FwaS9vcmRlcnNBcGkuanMiOwppbXBvcnQgeyBmZXRjaE9yZGVyRGV0YWlscyB9IGZyb20gIi4uLy4uL3NlcnZpY2VzL2FwaS9vcmRlckRldGFpbHNBcGkuanMiOwppbXBvcnQgeyB0b2FzdCB9IGZyb20gIi4uLy4uL3VpL2RvbS5qcyI7CmltcG9ydCB7IG1ha2VQaXp6YUxpbmUgfSBmcm9tICIuLi8uLi9wb3MvcGl6emFPcmRlci5qcyI7CmltcG9ydCB7IG1ha2VPcmRlckxpbmUgfSBmcm9tICIuLi8uLi9wb3Mvb3JkZXJMaW5lLmpzIjsKaW1wb3J0IHsgYnVpbGRUaW1lcywgYnVpbGRUaW1lQmFkZ2VzIH0gZnJvbSAiLi4vLi4vZGF0YS9tb2NrLmpzIjsKaW1wb3J0IHsgc2V0QWN0aXZlVGltZSB9IGZyb20gIi4uL3RpbWUvYWN0aXZlVGltZS5qcyI7CgppbXBvcnQgeyBnZXRQRFZDdXJyZW50LCBzdG9yZVRvU3VmZml4IH0gZnJvbSAiLi4vcGR2LmpzIjsKaW1wb3J0IHsgZW5zdXJlUGl6emFCYXNlIH0gZnJvbSAiLi4vY2F0YWxvZ0NhY2hlLmpzIjsKaW1wb3J0IHsgbm9ybWFsaXplS2V5RnJvbU5hbWUsIHJlY29tcHV0ZUV4dHJhRm9yTGluZSB9IGZyb20gIi4uL3Bvcy9iYXNrZXQuanMiOwppbXBvcnQgeyBidWlsZEluamVjdGVkQ2xpZW50RnJvbUFwaSwgc3luY0luamVjdGVkQ2xpZW50RGVsaXZlcnlTdGF0ZSwgYnVpbGRFbXB0eUNsaWVudCB9IGZyb20gIi4uL3N0YXRlL2NsaWVudC5qcz90cz0yMDI2MDQyMi0xIjsKaW1wb3J0IHsgYnVpbGRBbGxvd2VkQ2hvaWNlVmFsdWUgYXMgYnVpbGRBbGxvd2VkRGVsaXZlcnlDaXR5Q2hvaWNlVmFsdWUgfSBmcm9tICIuLi9hZGRyZXNzL2RlbGl2ZXJ5Q2l0eUNob2ljZXMuanM/dHM9MjAyNjA0MjItMSI7CmltcG9ydCB7IGJ1aWxkTGl2cmFpc29uQnlTbG90IH0gZnJvbSAiLi4vdGltZS9saXZyYWlzb25TbG90cy5qcyI7CmltcG9ydCB7IGNhcHR1cmVUaW1lQ2hpcHNTY3JvbGwsIHJlc3RvcmVUaW1lQ2hpcHNTY3JvbGwsIGlzU2xvdEluRE9NIH0gZnJvbSAiLi4vdGltZS90aW1lY2hpcHNTY3JvbGwuanMiOwppbXBvcnQgeyBsb2FkU2xvdEJhZGdlcyB9IGZyb20gIi4vc2xvdEJhZGdlc0xvYWRlci5qcyI7CmltcG9ydCB7IGFwcGx5SW1wb3J0ZWRPcmRlck1vZGVzIH0gZnJvbSAiLi4vb3JkZXJNb2RlL29yZGVyTW9kZVN0YXRlLmpzP3RzPTIwMjYwNDA2LTEiOwoKZnVuY3Rpb24gcmVhZFN0b3BTbXNWYWx1ZShhbnlDbGllbnQpewogIGNvbnN0IGMgPSAoYW55Q2xpZW50ICYmIHR5cGVvZiBhbnlDbGllbnQgPT09ICJvYmplY3QiKSA/IGFueUNsaWVudCA6IHt9OwogIGNvbnN0IHJhdyA9IChjLnN0b3BTbXMgIT0gbnVsbCkgPyBjLnN0b3BTbXMgOiBjLnN0b3Bfc21zOwogIGlmIChyYXcgPT09IHRydWUgfHwgcmF3ID09PSAxIHx8IHJhdyA9PT0gIjEiKSByZXR1cm4gMTsKICByZXR1cm4gMDsKfQoKZnVuY3Rpb24gYnVpbGRMb2FkZWRUZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MoYXBpQWRkcmVzcywgc3RvcmVTdWZmaXgpewogIGNvbnN0IGEgPSAoYXBpQWRkcmVzcyAmJiB0eXBlb2YgYXBpQWRkcmVzcyA9PT0gIm9iamVjdCIpID8gYXBpQWRkcmVzcyA6IG51bGw7CiAgaWYgKCFhKSByZXR1cm4gbnVsbDsKICBjb25zdCBhZHJlc3NlID0gU3RyaW5nKGEuYWRyZXNzZSA/PyAiIikudHJpbSgpOwogIGNvbnN0IGNvZGVQb3N0YWwgPSBTdHJpbmcoYS5jb2RlX3Bvc3RhbCA/PyBhLmNvZGVQb3N0YWwgPz8gIiIpLnRyaW0oKTsKICBjb25zdCB2aWxsZSA9IFN0cmluZyhhLnZpbGxlID8/ICIiKS50cmltKCk7CiAgaWYgKCFhZHJlc3NlIHx8ICFjb2RlUG9zdGFsIHx8ICF2aWxsZSkgcmV0dXJuIG51bGw7CiAgcmV0dXJuIHsKICAgIGVuYWJsZWQ6IHRydWUsCiAgICBhZHJlc3NlLAogICAgY29tcGxlbWVudEFkcmVzc2U6IFN0cmluZyhhLmNvbXBsZW1lbnRfYWRyZXNzZSA/PyBhLmNvbXBsZW1lbnRBZHJlc3NlID8/ICIiKS50cmltKCksCiAgICBjb2RlUG9zdGFsLAogICAgdmlsbGUsCiAgICB0ZW1wb3JhcnlEZWxpdmVyeUNpdHlDaG9pY2U6IGJ1aWxkQWxsb3dlZERlbGl2ZXJ5Q2l0eUNob2ljZVZhbHVlKHN0b3JlU3VmZml4LCB2aWxsZSwgY29kZVBvc3RhbCksCiAgICBwZXJzaXN0ZWRDb2RlUG9zdGFsOiBjb2RlUG9zdGFsLAogICAgcGVyc2lzdGVkVmlsbGU6IHZpbGxlLAogICAgZXhwbGljYXRpb25zOiBTdHJpbmcoYS5leHBsaWNhdGlvbnMgPz8gIiIpLnRyaW0oKSwKICAgIG51bWVyb1VyZ2VuY2U6IFN0cmluZyhhLm51bWVyb191cmdlbmNlID8/IGEubnVtZXJvVXJnZW5jZSA/PyAiIikudHJpbSgpLAogIH07Cn0KCmZ1bmN0aW9uIGZtdEV1cm9TaWduZWRGUih2YWwpewogIGNvbnN0IG4gPSBOdW1iZXIodmFsKTsKICBjb25zdCBzYWZlID0gTnVtYmVyLmlzRmluaXRlKG4pID8gbiA6IDA7CiAgY29uc3Qgc2lnbiA9IHNhZmUgPiAwID8gIisiIDogIiI7CiAgcmV0dXJuIGAke3NpZ259JHtzYWZlLnRvRml4ZWQoMikucmVwbGFjZSgiLiIsICIsIil94oKsYDsKfQoKZnVuY3Rpb24gdG9QYXJpc0hITU1Gcm9tRXBvY2hNcyhtcyl7CiAgY29uc3QgbiA9IE51bWJlcihtcyk7CiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUobikgfHwgbiA8PSAwKSByZXR1cm4gIiI7CiAgY29uc3QgZCA9IG5ldyBEYXRlKG4pOwogIHRyeXsKICAgIGNvbnN0IHBhcnRzID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoImZyLUZSIiwgewogICAgICB0aW1lWm9uZTogIkV1cm9wZS9QYXJpcyIsCiAgICAgIGhvdXI6ICIyLWRpZ2l0IiwKICAgICAgbWludXRlOiAiMi1kaWdpdCIsCiAgICAgIGhvdXJDeWNsZTogImgyMyIsCiAgICB9KS5mb3JtYXRUb1BhcnRzKGQpOwogICAgY29uc3QgaGggPSBwYXJ0cy5maW5kKChwKSA9PiBwLnR5cGUgPT09ICJob3VyIik/LnZhbHVlID8/ICIiOwogICAgY29uc3QgbW0gPSBwYXJ0cy5maW5kKChwKSA9PiBwLnR5cGUgPT09ICJtaW51dGUiKT8udmFsdWUgPz8gIiI7CiAgICBpZiAoIWhoIHx8ICFtbSkgcmV0dXJuICIiOwogICAgcmV0dXJuIGAke2hofToke21tfWA7CiAgfSBjYXRjaCAoZSl7CiAgICBjb25zdCBoaCA9IFN0cmluZyhkLmdldEhvdXJzKCkpLnBhZFN0YXJ0KDIsICIwIik7CiAgICBjb25zdCBtbSA9IFN0cmluZyhkLmdldE1pbnV0ZXMoKSkucGFkU3RhcnQoMiwgIjAiKTsKICAgIHJldHVybiBgJHtoaH06JHttbX1gOwogIH0KfQoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRPcmRlckJ5T3JkZXJJZCh7IHN0YXRlLCBtb2NrLCBkYXRlSVNPLCBvcmRlcklkLCBlbnN1cmVEYXlMb2FkZWQgPSB0cnVlIH0gPSB7fSl7CiAgaWYgKCFzdGF0ZSB8fCB0eXBlb2Ygc3RhdGUgIT09ICJvYmplY3QiKSByZXR1cm4gZmFsc2U7CiAgY29uc3Qgb3JkZXJfaWQgPSBOdW1iZXIob3JkZXJJZCk7CiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUob3JkZXJfaWQpIHx8IG9yZGVyX2lkIDw9IDApIHJldHVybiBmYWxzZTsKCiAgY29uc3QgbmV4dERhdGVJU08gPSBTdHJpbmcoZGF0ZUlTTyA/PyBzdGF0ZS5zZWxlY3RlZERhdGVJU08gPz8gIiIpLnRyaW0oKTsKICBpZiAoL15cZHs0fS1cZHsyfS1cZHsyfSQvLnRlc3QobmV4dERhdGVJU08pKSB7CiAgICBzdGF0ZS5zZWxlY3RlZERhdGVJU08gPSBuZXh0RGF0ZUlTTzsKICB9CgogIGlmIChlbnN1cmVEYXlMb2FkZWQpIHsKICAgIHRyeSB7IGF3YWl0IGxvYWREYWlseU9yZGVyVGFicyh7IHN0YXRlLCBtb2NrIH0pOyB9IGNhdGNoIChlKSB7fQogICAgdHJ5IHsgYXdhaXQgbG9hZFNsb3RCYWRnZXMoeyBzdGF0ZSwgbW9jaywgZm9yY2U6IHRydWUgfSk7IH0gY2F0Y2ggKGUpIHt9CiAgfQoKICBjb25zdCBwZHYgPSBnZXRQRFZDdXJyZW50KCk7CiAgY29uc3Qgc3RvcmUgPSBzdG9yZVRvU3VmZml4KHBkdik7CiAgY29uc3QgZGF0ZSA9IHN0YXRlLnNlbGVjdGVkRGF0ZUlTTzsKCiAgdHJ5ewogICAgdG9hc3QoYENoYXJnZW1lbnQgY29tbWFuZGUgdGVtcG9yYWlyZSAke29yZGVyX2lkfeKApmAsIHsgZHVyYXRpb246IDEyMDAgfSk7CiAgfSBjYXRjaCAoZSkge30KCiAgdHJ5ewogICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IGZldGNoT3JkZXJEZXRhaWxzQnlPcmRlcklkTG9jYWwoeyBzdG9yZSwgZGF0ZSwgb3JkZXJJZDogb3JkZXJfaWQgfSk7CiAgICByZXR1cm4gYXdhaXQgaHlkcmF0ZUxvYWRlZE9yZGVyUGF5bG9hZCh7CiAgICAgIHN0YXRlLAogICAgICBtb2NrLAogICAgICBzdG9yZSwKICAgICAgZGF0ZSwKICAgICAgcGF5bG9hZCwKICAgICAgbG9hZGVkTWV0YTogewogICAgICAgIHN0b3JlLAogICAgICAgIGlkOiBvcmRlcl9pZCwKICAgICAgICBpZF9kYXRlOiAwLAogICAgICAgIGRhdGVJU086IGRhdGUsCiAgICAgICAgaGV1cmVfcHJlcGE6IE51bWJlcihwYXlsb2FkPy5vcmRlcj8uaGV1cmVfcHJlcGEgPz8gMCkgfHwgMCwKICAgICAgfSwKICAgICAgcHJlc2VydmVMb2FkZWRPcmRlckNvbnRleHQ6IGZhbHNlLAogICAgfSk7CiAgfSBjYXRjaCAoZSkgewogICAgY29uc29sZS53YXJuKCJbb3JkZXJzXSBsb2FkT3JkZXJCeU9yZGVySWQgZmFpbGVkOiIsIGUpOwogICAgc3RhdGUubG9hZGVkT3JkZXJQYXltZW50cyA9IFtdOwogICAgc3RhdGUuaW1wb3J0ZWRPcmRlcklkRGF0ZSA9IG51bGw7CiAgICB0cnl7IHRvYXN0KCJJbXBvc3NpYmxlIGRlIGNoYXJnZXIgbGEgY29tbWFuZGUgdGVtcG9yYWlyZS4iKTsgfSBjYXRjaCAoZTIpIHt9CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9Ci8qKgogKiByZWNvdmVyT3JkZXIoeyBzdGF0ZSwgbW9jaywgZGF0ZUlTTywgaWREYXRlLCBlbnN1cmVEYXlMb2FkZWQgfSkgLT4gUHJvbWlzZTxib29sZWFuPgogKiAtIFJldXNhYmxlIHdyYXBwZXI6IGVuc3VyZXMgdGhlIGFwcCBzdGF0ZSBtYXRjaGVzIHRoZSBvcmRlciBkYXksIHJlZnJlc2hlcyB0YWJzLAogKiAgIHRoZW4gbG9hZHMgdGhlIG9yZGVyIGRldGFpbHMgdXNpbmcgdGhlIGV4aXN0aW5nIGxvYWRlciBjaGFpbi4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWNvdmVyT3JkZXIoeyBzdGF0ZSwgbW9jaywgZGF0ZUlTTywgaWREYXRlLCBlbnN1cmVEYXlMb2FkZWQgPSB0cnVlIH0gPSB7fSl7CiAgaWYgKCFzdGF0ZSB8fCB0eXBlb2Ygc3RhdGUgIT09ICJvYmplY3QiKSByZXR1cm4gZmFsc2U7CiAgY29uc3QgZCA9IFN0cmluZyhkYXRlSVNPID8/ICIiKS50cmltKCk7CiAgY29uc3QgbklkID0gTnVtYmVyKGlkRGF0ZSk7CgogIGlmIChkICYmIC9eXGR7NH0tXGR7Mn0tXGR7Mn0kLy50ZXN0KGQpKXsKICAgIHN0YXRlLnNlbGVjdGVkRGF0ZUlTTyA9IGQ7CiAgfQoKICAvLyBJTVBPUlRBTlQ6IGtlZXAgdGFiIHNlbGVjdGlvbiBjb25zaXN0ZW50IHdpdGggdGhlICJjbGljayBpZF9kYXRlIHRhYiIgZmxvdy4KICAvLyBXaXRob3V0IHRoaXMsIHRoZSBvcmRlciBjYW4gYmUgbG9hZGVkIGluIG1lbW9yeSBidXQgVUkgbWF5IG5vdCByZWZsZWN0IHRoZSBhY3RpdmUgdGFiLgogIGlmIChOdW1iZXIuaXNGaW5pdGUobklkKSl7CiAgICBzdGF0ZS5hY3RpdmVOdW1iZXIgPSBuSWQ7CiAgfQoKICB0cnl7CiAgICAvLyBFbnN1cmUgdGhlIHNhbWUgImRheSBjb250ZXh0IiBhcyBhY3Rpb25zLm9uRGF0ZUNoYW5nZWQoKToKICAgIC8vIHRhYnMgKyBzbG90QmFkZ2VzICh0aW1lIGNoaXBzIGdyaWQgKyBiYWRnZXMpIG11c3QgZXhpc3QgQkVGT1JFIGltcG9ydGluZywKICAgIC8vIHNvIHN0cmljdCBoZXVyZV9wcmVwYSAtPiBISDpNTSBzZWxlY3Rpb24gKyBmb3JjZWQgc2Nyb2xsIGNhbiBzdWNjZWVkIG9uIGZ1dHVyZSBkYXlzLgogICAgaWYgKGVuc3VyZURheUxvYWRlZCl7CiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFsKICAgICAgICBsb2FkRGFpbHlPcmRlclRhYnMoeyBzdGF0ZSB9KSwKICAgICAgICBsb2FkU2xvdEJhZGdlcyh7IHN0YXRlIH0pLAogICAgICBdKTsKICAgIH0gZWxzZSB7CiAgICAgIGF3YWl0IGxvYWREYWlseU9yZGVyVGFicyh7IHN0YXRlIH0pOwogICAgfQogIH0gY2F0Y2ggKGUpIHt9CiAgcmV0dXJuIGxvYWRPcmRlckJ5SWREYXRlKHsgc3RhdGUsIG1vY2ssIGlkRGF0ZTogbklkIH0pOwp9CgpmdW5jdGlvbiBzdHJpY3RDaGlwVGltZUZyb21IZXVyZVByZXBhKHsgc3RhdGUsIG1vY2ssIGhldXJlUHJlcGFNcywgY29udGV4dCB9ID0ge30pewogIGNvbnN0IHQgPSB0b1BhcmlzSEhNTUZyb21FcG9jaE1zKGhldXJlUHJlcGFNcyk7CiAgY29uc3QgY3R4ID0gKGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQgPT09ICJvYmplY3QiKSA/IGNvbnRleHQgOiB7fTsKICBpZiAoIXQpIHsKICAgIGlmIChzdGF0ZSAmJiB0eXBlb2Ygc3RhdGUgPT09ICJvYmplY3QiKSBzdGF0ZS5hY3RpdmVUaW1lRXJyb3IgPSB7CiAgICAgIGtpbmQ6ICJoZXVyZV9wcmVwYV9pbnZhbGlkIiwKICAgICAgLi4uY3R4LAogICAgICBoZXVyZV9wcmVwYV9tczogaGV1cmVQcmVwYU1zLAogICAgICBoaG1tOiAiIiwKICAgIH07CiAgICBjb25zb2xlLmVycm9yKCJbb3JkZXJzXSBpbnZhbGlkIGhldXJlX3ByZXBhIChjYW5ub3QgZm9ybWF0IEhIOk1NKToiLCB7IC4uLmN0eCwgaGV1cmVfcHJlcGFfbXM6IGhldXJlUHJlcGFNcyB9KTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgY29uc3QgYmFkZ2VzID0gQXJyYXkuaXNBcnJheShzdGF0ZT8udGltZUJhZGdlcykKICAgID8gc3RhdGUudGltZUJhZGdlcwogICAgOiAoQXJyYXkuaXNBcnJheShtb2NrPy50aW1lQmFkZ2VzKSA/IG1vY2sudGltZUJhZGdlcyA6IFtdKTsKICBjb25zdCBsaXN0ID0gYmFkZ2VzCiAgICAubWFwKCh4KSA9PiBTdHJpbmcoeD8udGltZSA/PyAiIikudHJpbSgpKQogICAgLmZpbHRlcigoeCkgPT4gL15cZHsyfTpcZHsyfSQvLnRlc3QoeCkpOwoKICBpZiAobGlzdC5pbmNsdWRlcyh0KSkgewogICAgaWYgKHN0YXRlICYmIHR5cGVvZiBzdGF0ZSA9PT0gIm9iamVjdCIpIHN0YXRlLmFjdGl2ZVRpbWVFcnJvciA9IG51bGw7CiAgICByZXR1cm4gdDsKICB9CgogIGNvbnN0IGVyciA9IHsKICAgIGtpbmQ6ICJoZXVyZV9wcmVwYV9vZmZncmlkIiwKICAgIC4uLmN0eCwKICAgIGhldXJlX3ByZXBhX21zOiBoZXVyZVByZXBhTXMsCiAgICBoaG1tOiB0LAogIH07CiAgaWYgKHN0YXRlICYmIHR5cGVvZiBzdGF0ZSA9PT0gIm9iamVjdCIpIHN0YXRlLmFjdGl2ZVRpbWVFcnJvciA9IGVycjsKICBjb25zb2xlLmVycm9yKCJbb3JkZXJzXSBoZXVyZV9wcmVwYSBkb2VzIG5vdCBtYXRjaCBhbnkgVUkgY2hpcCAoc3RyaWN0KToiLCBlcnIpOwogIHRyeSB7IHRvYXN0KGBFcnJldXI6IGhvcmFpcmUgJHt0fSBob3JzIGdyaWxsZWAsIHsgZHVyYXRpb246IDI1MDAgfSk7IH0gY2F0Y2ggKGUpIHt9CiAgcmV0dXJuIG51bGw7Cn0KCmZ1bmN0aW9uIGZpbmRDYXRhbG9nUGl6emFCeUlkKHN0YXRlLCBpZCl7CiAgY29uc3QgcGlkID0gTnVtYmVyKGlkKTsKICBpZiAoIU51bWJlci5pc0Zpbml0ZShwaWQpKSByZXR1cm4gbnVsbDsKICBjb25zdCBsaXN0ID0gQXJyYXkuaXNBcnJheShzdGF0ZT8uY2F0YWxvZz8ucGl6emFzKSA/IHN0YXRlLmNhdGFsb2cucGl6emFzIDogW107CiAgZm9yIChjb25zdCBwIG9mIGxpc3QpewogICAgY29uc3QgbiA9IE51bWJlcihwPy5pZCk7CiAgICBpZiAoTnVtYmVyLmlzRmluaXRlKG4pICYmIG4gPT09IHBpZCkgcmV0dXJuIHA7CiAgfQogIHJldHVybiBudWxsOwp9CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZERhaWx5T3JkZXJUYWJzKHsgc3RhdGUgfSA9IHt9KXsKICBjb25zdCBwZHYgPSBnZXRQRFZDdXJyZW50KCk7CiAgY29uc3Qgc3RvcmUgPSBzdG9yZVRvU3VmZml4KHBkdik7CiAgY29uc3QgZGF0ZSA9IHN0YXRlLnNlbGVjdGVkRGF0ZUlTTzsKCiAgdHJ5ewogICAgLy8g4pSA4pSAIENhcHR1cmUgc2Nyb2xsIGJlZm9yZSB0YWJzIHJlbG9hZCBtYXkgdHJpZ2dlciBhIHJlLXJlbmRlciDilIDilIAKICAgIGNvbnN0IHNhdmVkU2Nyb2xsID0gY2FwdHVyZVRpbWVDaGlwc1Njcm9sbCgpOwogICAgY29uc3QgaGFkQWN0aXZlVGltZSA9ICEhKHN0YXRlLmFjdGl2ZVRpbWUgJiYgU3RyaW5nKHN0YXRlLmFjdGl2ZVRpbWUpLnRyaW0oKSk7CgogICAgY29uc3QgeyBpZERhdGVzLCBsaXZyYWlzb25TbG90cywgY2hpcEdyaWQgfSA9IGF3YWl0IGZldGNoT3JkZXJzU3VtbWFyeSh7IHN0b3JlLCBkYXRlIH0pOwoKICAgIC8vIOKUgOKUgCBSZWJ1aWxkIHRpbWUgY2hpcHMgZnJvbSBBUEkgY2hpcF9ncmlkIGlmIG5vdCB5ZXQgc2V0IGJ5IHNsb3RCYWRnZXNMb2FkZXIg4pSA4pSACiAgICBpZiAoY2hpcEdyaWQgJiYgY2hpcEdyaWQuc3RhcnQgJiYgIXN0YXRlLmNoaXBHcmlkKSB7CiAgICAgIHN0YXRlLmNoaXBHcmlkID0gY2hpcEdyaWQ7CiAgICAgIGNvbnN0IHRpbWVzID0gYnVpbGRUaW1lcyhjaGlwR3JpZC5zdGFydCwgY2hpcEdyaWQuZW5kLCBjaGlwR3JpZC5zdGVwTWluKTsKICAgICAgc3RhdGUudGltZUJhZGdlcyA9IGJ1aWxkVGltZUJhZGdlcyh0aW1lcyk7CiAgICAgIC8vIElNUE9SVEFOVDogZG8gTk9UIGF1dG8tc2VsZWN0IGEgZGVmYXVsdCBzbG90LgogICAgICAvLyBJZiB0aGUgcHJldmlvdXNseSBzZWxlY3RlZCBzbG90IG5vIGxvbmdlciBleGlzdHMgaW4gdGhlIG5ldyBncmlkLAogICAgICAvLyBjbGVhciBzZWxlY3Rpb24gaW5zdGVhZCBvZiBmYWxsaW5nIGJhY2sgdG8gdGhlIGZpcnN0IHNsb3QuCiAgICAgIGlmIChzdGF0ZS5hY3RpdmVUaW1lICYmICF0aW1lcy5pbmNsdWRlcyhzdGF0ZS5hY3RpdmVUaW1lKSkgewogICAgICAgIHN0YXRlLmFjdGl2ZVRpbWUgPSBudWxsOwogICAgICB9CiAgICB9CgogICAgc3RhdGUubnVtYmVycyA9IGlkRGF0ZXM7CiAgICBzdGF0ZS5saXZyYWlzb25CeVNsb3QgPSBidWlsZExpdnJhaXNvbkJ5U2xvdChsaXZyYWlzb25TbG90cyk7IC8vIHt9IG1lYW5zICJrbm93bjogbm9uZSIKICAgIC8vIEtlZXAgc2VsZWN0aW9uIGNvbnNpc3RlbnQKICAgIGlmIChpZERhdGVzLmxlbmd0aCA9PT0gMCl7CiAgICAgIHN0YXRlLmFjdGl2ZU51bWJlciA9IG51bGw7CiAgICB9IGVsc2UgaWYgKCFpZERhdGVzLmluY2x1ZGVzKHN0YXRlLmFjdGl2ZU51bWJlcikpewogICAgICBzdGF0ZS5hY3RpdmVOdW1iZXIgPSBpZERhdGVzWzBdOwogICAgfQoKICAgIC8vIOKUgOKUgCBSZXN0b3JlIHNjcm9sbCBwb3NpdGlvbiBpZiBhIHNsb3Qgd2FzIChhbmQgc3RpbGwgaXMpIHNlbGVjdGVkIOKUgOKUgAogICAgaWYgKGhhZEFjdGl2ZVRpbWUgJiYgc3RhdGUuYWN0aXZlVGltZSl7CiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7CiAgICAgICAgaWYgKGlzU2xvdEluRE9NKHN0YXRlLmFjdGl2ZVRpbWUpKXsKICAgICAgICAgIHJlc3RvcmVUaW1lQ2hpcHNTY3JvbGwoc2F2ZWRTY3JvbGwpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogIH0gY2F0Y2ggKGUpewogICAgLy8gSW4gY2FzZSBvZiBBUEkgZXJyb3IsIGtlZXAgbGFzdCBrbm93biBzdGF0ZSBidXQgYXZvaWQgY3Jhc2hpbmcgVUkKICAgIGNvbnNvbGUud2FybigiW29yZGVyc10gbG9hZERhaWx5T3JkZXJUYWJzIGZhaWxlZDoiLCBlKTsKICB9Cn0KCmFzeW5jIGZ1bmN0aW9uIGZldGNoT3JkZXJEZXRhaWxzQnlPcmRlcklkTG9jYWwoeyBzdG9yZSwgZGF0ZSwgb3JkZXJJZCB9ID0ge30pewogIGNvbnN0IHMgPSAoc3RvcmUgPT09ICJwZWwiKSA/ICJwZWwiIDogImxhbiI7CiAgY29uc3QgZCA9IFN0cmluZyhkYXRlID8/ICIiKS50cmltKCk7CiAgY29uc3QgaWQgPSBOdW1iZXIob3JkZXJJZCk7CiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoaWQpIHx8IGlkIDw9IDApIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBvcmRlcl9pZCIpOwoKICBjb25zdCBxcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoewogICAgc3RvcmU6IHMsCiAgICBkYXRlOiBkLAogICAgb3JkZXJfaWQ6IFN0cmluZyhNYXRoLnRydW5jKGlkKSksCiAgICBfdHM6IFN0cmluZyhEYXRlLm5vdygpKSwKICB9KTsKCiAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYGFwaS9vcmRlckRldGFpbHMucGhwPyR7cXMudG9TdHJpbmcoKX1gLCB7CiAgICBtZXRob2Q6ICJHRVQiLAogICAgaGVhZGVyczogeyBBY2NlcHQ6ICJhcHBsaWNhdGlvbi9qc29uIiB9LAogICAgY3JlZGVudGlhbHM6ICJzYW1lLW9yaWdpbiIsCiAgICBjYWNoZTogIm5vLXN0b3JlIiwKICB9KTsKCiAgY29uc3QgdHh0ID0gYXdhaXQgcmVzLnRleHQoKTsKICBsZXQgZGF0YSA9IG51bGw7CiAgdHJ5IHsKICAgIGRhdGEgPSBKU09OLnBhcnNlKHR4dCk7CiAgfSBjYXRjaCAoZSkgewogICAgZGF0YSA9IG51bGw7CiAgfQoKICBpZiAoIXJlcy5vayB8fCAhZGF0YSB8fCBkYXRhLm9rICE9PSB0cnVlKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoKGRhdGEgJiYgZGF0YS5lcnJvcikgPyBTdHJpbmcoZGF0YS5lcnJvcikgOiAiQVBJIGVycm9yIik7CiAgfQoKICByZXR1cm4gZGF0YTsKfQoKYXN5bmMgZnVuY3Rpb24gaHlkcmF0ZUxvYWRlZE9yZGVyUGF5bG9hZCh7CiAgc3RhdGUsCiAgbW9jaywKICBzdG9yZSwKICBkYXRlLAogIHBheWxvYWQsCiAgbG9hZGVkTWV0YSA9IG51bGwsCiAgcHJlc2VydmVMb2FkZWRPcmRlckNvbnRleHQgPSB0cnVlLAp9ID0ge30pewogIGNvbnN0IG9yZGVyID0gcGF5bG9hZD8ub3JkZXIgJiYgdHlwZW9mIHBheWxvYWQub3JkZXIgPT09ICJvYmplY3QiID8gcGF5bG9hZC5vcmRlciA6IG51bGw7CiAgY29uc3QgY3VzdG9tZXIgPSBwYXlsb2FkPy5jdXN0b21lciAmJiB0eXBlb2YgcGF5bG9hZC5jdXN0b21lciA9PT0gIm9iamVjdCIgPyBwYXlsb2FkLmN1c3RvbWVyIDogbnVsbDsKICBjb25zdCBwaXp6YXMgPSBBcnJheS5pc0FycmF5KHBheWxvYWQ/LnBpenphcykgPyBwYXlsb2FkLnBpenphcyA6IFtdOwogIGNvbnN0IHBheW1lbnRzID0gQXJyYXkuaXNBcnJheShwYXlsb2FkPy5wYXltZW50cykgPyBwYXlsb2FkLnBheW1lbnRzIDogW107CiAgY29uc3QgaHAwID0gb3JkZXI/LmhldXJlX3ByZXBhID8/IG51bGw7CiAgY29uc3Qgbm9ybWFsaXplZE1ldGEgPSAobG9hZGVkTWV0YSAmJiB0eXBlb2YgbG9hZGVkTWV0YSA9PT0gIm9iamVjdCIpCiAgICA/IHsKICAgICAgc3RvcmUsCiAgICAgIGlkOiBOdW1iZXIobG9hZGVkTWV0YT8uaWQgPz8gb3JkZXI/LmlkID8/IDApIHx8IDAsCiAgICAgIGlkX2RhdGU6IE51bWJlcihsb2FkZWRNZXRhPy5pZF9kYXRlID8/IG9yZGVyPy5pZF9kYXRlID8/IDApIHx8IDAsCiAgICAgIGRhdGVJU086IFN0cmluZyhsb2FkZWRNZXRhPy5kYXRlSVNPID8/IGRhdGUgPz8gIiIpLnRyaW0oKSwKICAgICAgaGV1cmVfcHJlcGE6IE51bWJlcihsb2FkZWRNZXRhPy5oZXVyZV9wcmVwYSA/PyBocDAgPz8gMCkgfHwgMCwKICAgIH0KICAgIDogewogICAgICBzdG9yZSwKICAgICAgaWQ6IE51bWJlcihvcmRlcj8uaWQgPz8gMCkgfHwgMCwKICAgICAgaWRfZGF0ZTogTnVtYmVyKG9yZGVyPy5pZF9kYXRlID8/IDApIHx8IDAsCiAgICAgIGRhdGVJU086IFN0cmluZyhkYXRlID8/ICIiKS50cmltKCksCiAgICAgIGhldXJlX3ByZXBhOiBOdW1iZXIoaHAwKSB8fCAwLAogICAgfTsKCiAgLy8gU3RvcmUgcmF3IHBheWxvYWQgZm9yIGxhdGVyIG5lZWRzIChub24taW5qZWN0YWJsZSBpbmZvKQogIHN0YXRlLmxvYWRlZE9yZGVyID0gb3JkZXI7CiAgc3RhdGUubG9hZGVkQ3VzdG9tZXJSYXcgPSBjdXN0b21lcjsKICBzdGF0ZS5sb2FkZWRPcmRlclBheW1lbnRzID0gcGF5bWVudHM7CiAgc3RhdGUubG9hZGVkT3JkZXJNZXRhID0gbm9ybWFsaXplZE1ldGE7CiAgLy8gVUktb25seSB0cmFjZTogc2hvdyB3aGljaCBpbXBvcnRlZCBvcmRlciBpcyBjdXJyZW50bHkgb3BlbmVkIGluIGNhaXNzZS4KICBzdGF0ZS5pbXBvcnRlZE9yZGVySWREYXRlID0gKG5vcm1hbGl6ZWRNZXRhLmlkX2RhdGUgPiAwKSA/IG5vcm1hbGl6ZWRNZXRhLmlkX2RhdGUgOiBudWxsOwoKICAvLyBBcHBseSBzYXZlZCBvcmRlciB0b2dnbGVzIHRocm91Z2ggdGhlIGNlbnRyYWxpemVkIGltcG9ydGVkLW9yZGVyIHJ1bGUuCiAgYXBwbHlJbXBvcnRlZE9yZGVyTW9kZXMoeyBzdGF0ZSwgb3JkZXIgfSk7CgogIC8vIFNlbGVjdCBjaGlwIGJ5IGhldXJlX3ByZXBhIChzdHJpY3QgbWF0Y2g6IG5vIGFkanVzdG1lbnQsIG5vIGZhbGxiYWNrKQogIGNvbnN0IGhwID0gaHAwOwogIGNvbnN0IGhobW0gPSBzdHJpY3RDaGlwVGltZUZyb21IZXVyZVByZXBhKHsKICAgIHN0YXRlLAogICAgbW9jaywKICAgIGhldXJlUHJlcGFNczogaHAsCiAgICBjb250ZXh0OiB7IHN0b3JlLCBkYXRlLCBpZF9kYXRlOiBub3JtYWxpemVkTWV0YS5pZF9kYXRlIHx8IDAgfSwKICB9KTsKICAvLyBJTVBPUlRBTlQ6IHVzZSB0aGUgZXhhY3Qgc2FtZSB1cGRhdGUgbWVjaGFuaXNtIGFzIGEgdXNlciBjbGljawogIC8vIChzaW5nbGUgc291cmNlIG9mIHRydXRoICsgY29uc2lzdGVudCBVSSByZWZyZXNoIHBhdGgpLgogIHNldEFjdGl2ZVRpbWUoewogICAgc3RhdGUsCiAgICBoaG1tLAogICAgc291cmNlOiAib3JkZXJfaW1wb3J0IiwKICAgIC8vIGtlZXAgZXhpc3Rpbmcgc3RyaWN0IGJlaGF2aW91cjogaWYgaGhtbSBpcyBudWxsLCB3ZSBrZWVwIGFjdGl2ZVRpbWUgYXMtaXMKICAgIGlnbm9yZUludmFsaWQ6IHRydWUsCiAgfSk7CgogIC8vIElNUE9SVEFOVDoKICAvLyAtIERvIE5PVCB1c2UgInNjcm9sbCB0byBub3cgLTEwIiBoZXJlICh0b2RheS1vbmx5IGJlaGF2aW9yKS4KICAvLyAtIEZvciBvcmRlciBpbXBvcnQvcmVjb3Zlciwgd2UgTVVTVCBmb3JjZS1zY3JvbGwgdG8gdGhlIGltcG9ydGVkIGhldXJlX3ByZXBhIGNoaXAsCiAgLy8gICBldmVuIG9uIHBhc3QvZnV0dXJlIGRheXMuCiAgLy8gV2UgZGVmZXIgdGhlIGFjdHVhbCBzY3JvbGwgdG8gdGhlIFVJIHJlbmRlciBwYXRoIHRvIGF2b2lkIHJhY2VzIHdpdGgKICAvLyBjb250cm9sbGVyJ3MgInJlc3RvcmUgcHJldmlvdXMgc2Nyb2xsIiBsb2dpYy4KICBpZiAoc3RhdGUuYWN0aXZlVGltZSl7CiAgICBzdGF0ZS51aVNjcm9sbFRvVGltZSA9IHN0YXRlLmFjdGl2ZVRpbWU7CiAgfQoKICAvLyBJbmplY3QgY2xpZW50IGludG8gbGVmdCBwYW5lbCAoa2VlcCBlbXB0eSBpZiBBUEkgaGFzIG5vIGN1c3RvbWVyKQogIHN0YXRlLmNsaWVudCA9IGN1c3RvbWVyID8gYnVpbGRJbmplY3RlZENsaWVudEZyb21BcGkoY3VzdG9tZXIpIDogYnVpbGRFbXB0eUNsaWVudCgpOwogIC8vIEtlZXAgc3RvcF9zbXMgYXZhaWxhYmxlIHdpdGhvdXQgcmVseWluZyBvbiBidWlsZEluamVjdGVkQ2xpZW50RnJvbUFwaSBtYXBwaW5nIChkZWZlbnNpdmUpLgogIGlmIChjdXN0b21lciAmJiBzdGF0ZS5jbGllbnQgJiYgdHlwZW9mIHN0YXRlLmNsaWVudCA9PT0gIm9iamVjdCIpewogICAgc3RhdGUuY2xpZW50LnN0b3BTbXMgPSByZWFkU3RvcFNtc1ZhbHVlKGN1c3RvbWVyKTsKICB9CiAgaWYgKHN0YXRlLmNsaWVudCAmJiB0eXBlb2Ygc3RhdGUuY2xpZW50ID09PSAib2JqZWN0Iil7CiAgICBzeW5jSW5qZWN0ZWRDbGllbnREZWxpdmVyeVN0YXRlKHN0YXRlLmNsaWVudCwgc3RvcmUpOwogIH0KICBzdGF0ZS50ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MgPSBidWlsZExvYWRlZFRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcyhwYXlsb2FkPy50ZW1wb3JhcnlfZGVsaXZlcnlfYWRkcmVzcywgc3RvcmUpOwoKICAvLyBSZXNldCBiYXNrZXQgKyByZWJ1aWxkIGZyb20gb3JkZXIgcGl6emFzCiAgc3RhdGUuYWRkZWRJdGVtcyA9IFtdOwogIHN0YXRlLmxhc3RBZGRlZFBpenphID0gbnVsbDsKCiAgLy8gU25hcHNob3QgZm9yIGRpZmYgdXBkYXRlOiBzdG9yZWQgaW4gcGFyYWxsZWwgd2l0aCBpbmplY3RlZCBiYXNrZXQgbGluZXMKICBjb25zdCBzbmFwc2hvdEl0ZW1zID0gW107CiAgZm9yIChjb25zdCBweiBvZiBwaXp6YXMpewogICAgY29uc3QgcGl6emFJZCA9IHB6Py5waXp6YV9pZCA/PyBwej8uaWRfcG9zX3BpenphcyA/PyBwej8uaWQgPz8gbnVsbDsKICAgIGNvbnN0IG9yZGVyZWRJZCA9IHB6Py5vcmRlcmVkX2lkID8/IHB6Py5pZF9wb3NfcGl6emFzX2NvbW1hbmRlZXMgPz8gbnVsbDsKICAgIGNvbnN0IG1vZGlmcyA9IEFycmF5LmlzQXJyYXkocHo/Lm1vZGlmcykgPyBwei5tb2RpZnMgOiBbXTsKCiAgICAvLyBQcmVmZXIgY2F0YWxvZyBkYXRhIChiZXN0IFVJIGZpZGVsaXR5KSwgZmFsbGJhY2sgdG8gQVBJLXByb3ZpZGVkIGJhc2ljcwogICAgY29uc3QgY2F0ID0gZmluZENhdGFsb2dQaXp6YUJ5SWQoc3RhdGUsIHBpenphSWQpOwogICAgY29uc3QgYmFzZUZyb21BcGkgPSBTdHJpbmcocHo/LmJhc2UgPz8gIiIpLnRyaW0oKTsKICAgIGNvbnN0IHBpenphT2JqID0gY2F0CiAgICAgID8geyAuLi5jYXQgfQogICAgICA6IHsKICAgICAgICBpZDogTnVtYmVyKHBpenphSWQpLAogICAgICAgIG5hbWU6IFN0cmluZyhwej8ubmFtZSA/PyBwej8ucGl6emFfbmFtZSA/PyAiIikudHJpbSgpLAogICAgICAgIGNvbXBsZXRlX25hbWU6IFN0cmluZyhwej8uY29tcGxldGVfbmFtZSA/PyAiIikudHJpbSgpLAogICAgICAgIGJhc2U6IGJhc2VGcm9tQXBpIHx8ICJTYXVjZSBUb21hdGUiLAogICAgICAgIHByaWNlX2xhcmdlOiBOdW1iZXIocHo/LnByaWNlX2xhcmdlID8/IDApLAogICAgICAgIHByaWNlX21lZGl1bTogTnVtYmVyKHB6Py5wcmljZV9tZWRpdW0gPz8gMCksCiAgICAgICAgcmFjY291cmNpczogIiIsCiAgICAgIH07CgogICAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBsaW5lIGlzIGEgcGl6emEgdnMgYm9pc3Nvbi9yw6lkdWN0aW9uIGZyb20gaXRzIGJhc2UuCiAgICAvLyBJTVBPUlRBTlQ6IGRvIG5vdCBmb3JjZSBwaXp6YSBiYXNlIGRlZmF1bHRzIGZvciBub24tcGl6emEgbGluZXMuCiAgICBjb25zdCB0bXBMaW5lID0gbWFrZU9yZGVyTGluZShwaXp6YU9iaik7CiAgICBpZiAoIXRtcExpbmUgfHwgIXRtcExpbmUubmFtZSkgY29udGludWU7CgogICAgaWYgKHRtcExpbmUuY2xhc3MgPT09ICJwaXp6YSIpewogICAgICBlbnN1cmVQaXp6YUJhc2UocGl6emFPYmopOwogICAgfQoKICAgIC8vIEJ1aWxkIHRoZSBmaW5hbCBsaW5lIHNoYXBlOgogICAgLy8gLSBwaXp6YXMgdXNlIG1ha2VQaXp6YUxpbmUgKHN1cHBvcnRzIGV4dHJhcy9tb2RpZnMpCiAgICAvLyAtIG5vbi1waXp6YXMgdXNlIG1ha2VPcmRlckxpbmUgKGNvdW50IGV4Y2x1ZGVkIGJ1dCBwcmljZSBpbmNsdWRlZCkKICAgIGNvbnN0IGxpbmUgPSAodG1wTGluZS5jbGFzcyA9PT0gInBpenphIikgPyBtYWtlUGl6emFMaW5lKHBpenphT2JqKSA6IHRtcExpbmU7CiAgICBpZiAoIWxpbmUgfHwgIWxpbmUubmFtZSkgY29udGludWU7CgogICAgLy8gRW5zdXJlIHN0YWJsZSBpZHMgZm9yIGNvbXBvc2l0aW9uIG1vZGFsCiAgICBjb25zdCBwaWQgPSBOdW1iZXIocGl6emFPYmo/LmlkKTsKICAgIGlmIChOdW1iZXIuaXNGaW5pdGUocGlkKSl7CiAgICAgIGlmIChsaW5lLnBpenphX2lkID09IG51bGwgfHwgU3RyaW5nKGxpbmUucGl6emFfaWQpLnRyaW0oKSA9PT0gIiIpIGxpbmUucGl6emFfaWQgPSBwaWQ7CiAgICAgIGlmIChsaW5lLmlkID09IG51bGwgfHwgU3RyaW5nKGxpbmUuaWQpLnRyaW0oKSA9PT0gIiIpIGxpbmUuaWQgPSBwaWQ7CiAgICB9CgogICAgLy8gVGFnIGxpbmUgd2l0aCBiYWNrZW5kIG9yZGVyZWQgaWQgKGRlYnVnL3RyYWNlLCBub24tVUkpCiAgICBpZiAob3JkZXJlZElkICE9IG51bGwpIGxpbmUub3JkZXJlZF9pZCA9IG9yZGVyZWRJZDsKCiAgICAvLyBSZWNvcmQgc25hcHNob3QgcmVwcmVzZW50YXRpb24gKG9yZGVyZWRfaWQgaXMgdGhlIHN0YWJsZSBzZXJ2ZXItc2lkZSBsaW5lIGlkZW50aWZpZXIpCiAgICBjb25zdCBzbmFwID0gewogICAgICBvcmRlcmVkX2lkOiAob3JkZXJlZElkICE9IG51bGwpID8gTnVtYmVyKG9yZGVyZWRJZCkgOiBudWxsLAogICAgICBpZF9wb3NfcGl6emFzOiBOdW1iZXIocGl6emFPYmo/LmlkKSB8fCBOdW1iZXIocGl6emFJZCkgfHwgbnVsbCwKICAgICAgZGF0YV9pZDogU3RyaW5nKHB6Py5kYXRhX2lkID8/IGxpbmU/LmRhdGFfaWQgPz8gIiIpLnRyaW0oKSwKICAgICAgY2xhc3M6IFN0cmluZyhsaW5lPy5jbGFzcyA/PyB0bXBMaW5lPy5jbGFzcyA/PyAiIikudHJpbSgpLnRvTG93ZXJDYXNlKCksCiAgICAgIG1vZGlmczogQXJyYXkuaXNBcnJheShtb2RpZnMpID8gbW9kaWZzLm1hcCgobSkgPT4gKHsKICAgICAgICBub21fb3B0aW9uOiBTdHJpbmcobT8ubm9tX29wdGlvbiA/PyAiIikudHJpbSgpLAogICAgICAgIGNsYXNzX29wdGlvbjogU3RyaW5nKG0/LmNsYXNzX29wdGlvbiA/PyAiIikudHJpbSgpLAogICAgICAgIGRhdGFfcHJpY2U6IE51bWJlcihtPy5kYXRhX3ByaWNlID8/IDApIHx8IDAsCiAgICAgIH0pKSA6IFtdLAogICAgfTsKICAgIHNuYXBzaG90SXRlbXMucHVzaChzbmFwKTsKCiAgICAvLyBBcHBseSBtb2RpZmljYXRpb25zIE9OTFkgZm9yIHBpenphIGxpbmVzIChleHRyYXMgaW1wYWN0IHRvdGFsLCBidXQgbm90IHBpenphIGNvdW50IGxvZ2ljKS4KICAgIGlmIChsaW5lLmNsYXNzID09PSAicGl6emEiKXsKICAgICAgbGluZS5hZGRlZEluZ3JlZGllbnRzID0gW107CiAgICAgIGxpbmUuc2VsZWN0ZWRPcHRpb25zID0gW107CiAgICAgIGxpbmUuYWRkZWRJbmdyZWRpZW50TGluZXMgPSBbXTsKICAgICAgbGluZS5zZWxlY3RlZE9wdGlvbkxpbmVzID0gW107CiAgICAgIGxpbmUucmVtb3ZlZEluZ3JlZGllbnRzID0gW107CiAgICAgIGxpbmUucmVtb3ZlZEluZ3JlZGllbnROYW1lcyA9IFtdOwogICAgICBsaW5lLm1hbnVhbEV4dHJhcyA9IFtdOwoKICAgICAgLy8g4pSA4pSAIEJ1aWxkIGNvbXBvc2l0aW9uIHNldCB0byBkZXRlY3QgcmVtb3ZhbHMgdnMgYWRkaXRpb25zIOKUgOKUgAogICAgICBjb25zdCBjb21wb3NpdGlvbk5hbWVTZXQgPSBuZXcgU2V0KCk7CiAgICAgIGNvbnN0IF9pZHggPSBzdGF0ZS5jYXRhbG9nSW5kZXg7CiAgICAgIGNvbnN0IF9hc3NvY0J5UGl6emEgPSBfaWR4Py5waXp6YUFzc29jQnlJZCBpbnN0YW5jZW9mIE1hcCA/IF9pZHgucGl6emFBc3NvY0J5SWQgOiBudWxsOwogICAgICBjb25zdCBfaW5nQnlJZCA9IF9pZHg/LmluZ3JlZGllbnRCeUlkIGluc3RhbmNlb2YgTWFwID8gX2lkeC5pbmdyZWRpZW50QnlJZCA6IG51bGw7CgogICAgICBjb25zdCBfcGlkID0gTnVtYmVyKHBpenphT2JqPy5pZCk7CiAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoX3BpZCkgJiYgX2Fzc29jQnlQaXp6YSAmJiBfYXNzb2NCeVBpenphLmhhcyhfcGlkKSl7CiAgICAgICAgY29uc3QgYXNzb2NMaXN0ID0gX2Fzc29jQnlQaXp6YS5nZXQoX3BpZCkgfHwgW107CiAgICAgICAgZm9yIChjb25zdCBhIG9mIGFzc29jTGlzdCl7CiAgICAgICAgICBjb25zdCBpaWQgPSBOdW1iZXIoYT8uaW5ncmVkaWVudF9pZCk7CiAgICAgICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShpaWQpKSBjb250aW51ZTsKICAgICAgICAgIGNvbnN0IGluZyA9IF9pbmdCeUlkID8gX2luZ0J5SWQuZ2V0KGlpZCkgOiBudWxsOwogICAgICAgICAgaWYgKGluZyl7CiAgICAgICAgICAgIGNvbnN0IGluZ05hbWUgPSBTdHJpbmcoaW5nLmluZ3JlZGllbnRfbmFtZSA/PyAiIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgIGlmIChpbmdOYW1lKSBjb21wb3NpdGlvbk5hbWVTZXQuYWRkKGluZ05hbWUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgZm9yIChjb25zdCBtIG9mIG1vZGlmcyl7CiAgICAgICAgY29uc3QgY2xzID0gU3RyaW5nKG0/LmNsYXNzX29wdGlvbiA/PyBtPy5jbGFzcyA/PyAiIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgbGV0IG5tID0gU3RyaW5nKG0/Lm5vbV9vcHRpb24gPz8gbT8ubmFtZSA/PyAiIikudHJpbSgpOwogICAgICAgIGlmICghbm0pIGNvbnRpbnVlOwogICAgICAgIC8vIENvbW1vbiBEQiB2YWx1ZXM6ICIrIGVtbWVudGFsIiAvICJjaG9yaXpvIgogICAgICAgIGNvbnN0IG5tQ2xlYW4gPSBubS5yZXBsYWNlKC9eXCtccyovLCAiIikudHJpbSgpOwogICAgICAgIGNvbnN0IHByaWNlID0gTnVtYmVyKG0/LmRhdGFfcHJpY2UgPz8gbT8ucHJpY2UgPz8gMCk7CiAgICAgICAgY29uc3Qgbm1Mb3dlciA9IG5tQ2xlYW4udG9Mb3dlckNhc2UoKTsKCiAgICAgICAgLy8g4pSA4pSAIFByZXNlcnZlICJtZXh0cmFfX2lucHV0IiAvIGZyZWUtdGV4dCBwYWlkIGV4dHJhcyDilIDilIAKICAgICAgICAvLyBUaGVzZSBhcmUgc3RvcmVkIGluIERCIGFzIGNsYXNzX29wdGlvbj0iZXh0cmEtaXRlbSIgd2l0aCBhIGRhdGFfcHJpY2UuCiAgICAgICAgLy8gSWYgd2UgaW5jb3JyZWN0bHkgbWFwIHRoZW0gdG8gaW5ncmVkaWVudC9vcHRpb25zIGFycmF5cywgdGhlIGxhdGVyCiAgICAgICAgLy8gY2F0YWxvZyBsb29rdXAgbWF5IGZhaWwgYW5kIHRoZSBwcmljZSBiZWNvbWVzIDAgb24gaW1wb3J0ICsgb24gc2F2ZS91cGRhdGUuCiAgICAgICAgY29uc3QgaXNFeHRyYUl0ZW0gPSAoY2xzID09PSAiZXh0cmEtaXRlbSIgfHwgY2xzLmluY2x1ZGVzKCJleHRyYSIpKTsKICAgICAgICBpZiAoaXNFeHRyYUl0ZW0pewogICAgICAgICAgY29uc3QgcCA9IE51bWJlci5pc0Zpbml0ZShwcmljZSkgPyBwcmljZSA6IDA7CiAgICAgICAgICBjb25zdCBsYmwgPSBubUNsZWFuOwogICAgICAgICAgLy8gS2VlcCBlYWNoIERCIHJvdyBhcyBhIGRpc3RpbmN0IG1hbnVhbCBlbnRyeS4KICAgICAgICAgIGxpbmUubWFudWFsRXh0cmFzLnB1c2goeyBsYWJlbDogbGJsLCBhbW91bnQ6IHAgfSk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIC8vIOKUgOKUgCBEZXRlY3QgcmVtb3ZhbCDilIDilIAKICAgICAgICAvLyBSZW1vdmVkIGlmOiBpbiBiYXNlIGNvbXBvc2l0aW9uICsgcHJpY2UgPT0gMCArIG5vdCBhbiBvcHRpb24KICAgICAgICBjb25zdCBpc09wdGlvbiA9IGNscy5pbmNsdWRlcygib3B0aW9uIik7CiAgICAgICAgY29uc3QgaXNJbkNvbXBvc2l0aW9uID0gY29tcG9zaXRpb25OYW1lU2V0LmhhcyhubUxvd2VyKTsKICAgICAgICBjb25zdCBpc1JlbW92YWwgPSAhaXNPcHRpb24gJiYgaXNJbkNvbXBvc2l0aW9uICYmICghTnVtYmVyLmlzRmluaXRlKHByaWNlKSB8fCBwcmljZSA9PT0gMCk7CgogICAgICAgIGlmIChpc1JlbW92YWwpewogICAgICAgICAgLy8gUmVtb3ZlZCBpbmdyZWRpZW50IOKGkiBzdHlsZSBiYXJyw6ksIG5vIHByaWNlIGltcGFjdAogICAgICAgICAgY29uc3Qga2V5ID0gbm9ybWFsaXplS2V5RnJvbU5hbWUoeyBzdGF0ZSwgbmFtZTogbm1DbGVhbiwga2luZDogImFkZGVkSW5ncmVkaWVudCIgfSk7CiAgICAgICAgICBpZiAoa2V5KSBsaW5lLnJlbW92ZWRJbmdyZWRpZW50cy5wdXNoKGtleSk7CiAgICAgICAgICBsaW5lLnJlbW92ZWRJbmdyZWRpZW50TmFtZXMucHVzaChubUNsZWFuKTsKCiAgICAgICAgfSBlbHNlIGlmIChpc09wdGlvbil7CiAgICAgICAgICAvLyBPcHRpb24g4oaSIHNlbGVjdGVkT3B0aW9ucyAoaW1wYWN0cyBleHRyYUNvbXB1dGVkIGlmIHBhaWQpCiAgICAgICAgICBjb25zdCBrZXkgPSBub3JtYWxpemVLZXlGcm9tTmFtZSh7IHN0YXRlLCBuYW1lOiBubUNsZWFuLCBraW5kOiAic2VsZWN0ZWRPcHRpb24iIH0pOwogICAgICAgICAgaWYgKGtleSkgbGluZS5zZWxlY3RlZE9wdGlvbnMucHVzaChrZXkpOwogICAgICAgICAgY29uc3QgbGluZVR4dCA9IChOdW1iZXIuaXNGaW5pdGUocHJpY2UpICYmIHByaWNlICE9PSAwKQogICAgICAgICAgICA/IGAke25tQ2xlYW59ICgke2ZtdEV1cm9TaWduZWRGUihwcmljZSl9KWAKICAgICAgICAgICAgOiBubUNsZWFuOwogICAgICAgICAgbGluZS5zZWxlY3RlZE9wdGlvbkxpbmVzLnB1c2gobGluZVR4dCk7CgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBBZGRlZCBpbmdyZWRpZW50IOKGkiBhZGRlZEluZ3JlZGllbnRzIChpbXBhY3RzIGV4dHJhQ29tcHV0ZWQgaWYgcGFpZCkKICAgICAgICAgIGNvbnN0IGtleSA9IG5vcm1hbGl6ZUtleUZyb21OYW1lKHsgc3RhdGUsIG5hbWU6IG5tQ2xlYW4sIGtpbmQ6ICJhZGRlZEluZ3JlZGllbnQiIH0pOwogICAgICAgICAgaWYgKGtleSkgbGluZS5hZGRlZEluZ3JlZGllbnRzLnB1c2goa2V5KTsKICAgICAgICAgIGNvbnN0IGxpbmVUeHQgPSAoTnVtYmVyLmlzRmluaXRlKHByaWNlKSAmJiBwcmljZSAhPT0gMCkKICAgICAgICAgICAgPyBgJHtubUNsZWFufSAoJHtmbXRFdXJvU2lnbmVkRlIocHJpY2UpfSlgCiAgICAgICAgICAgIDogbm1DbGVhbjsKICAgICAgICAgIGxpbmUuYWRkZWRJbmdyZWRpZW50TGluZXMucHVzaChsaW5lVHh0KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIEtlZXAgYmFja3dhcmQtY29tcGF0aWJsZSBhZ2dyZWdhdGVzIGluIHN5bmMKICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGluZS5tYW51YWxFeHRyYXMpICYmIGxpbmUubWFudWFsRXh0cmFzLmxlbmd0aCl7CiAgICAgICAgbGV0IHN1bSA9IDA7CiAgICAgICAgY29uc3QgbGFiZWxzID0gW107CiAgICAgICAgZm9yIChjb25zdCBpdCBvZiBsaW5lLm1hbnVhbEV4dHJhcyl7CiAgICAgICAgICBjb25zdCBhID0gTnVtYmVyKGl0Py5hbW91bnQpOwogICAgICAgICAgaWYgKE51bWJlci5pc0Zpbml0ZShhKSkgc3VtICs9IGE7CiAgICAgICAgICBjb25zdCBsYmwgPSBTdHJpbmcoaXQ/LmxhYmVsID8/ICIiKS50cmltKCk7CiAgICAgICAgICBpZiAobGJsICYmICFsYWJlbHMuaW5jbHVkZXMobGJsKSkgbGFiZWxzLnB1c2gobGJsKTsKICAgICAgICB9CiAgICAgICAgbGluZS5leHRyYUFtb3VudCA9IE51bWJlci5pc0Zpbml0ZShzdW0pID8gc3VtIDogMDsKICAgICAgICBsaW5lLmV4dHJhTGFiZWwgPSBsYWJlbHMuam9pbigiIC8gIik7CiAgICAgIH0KCiAgICAgIHJlY29tcHV0ZUV4dHJhRm9yTGluZSh7IHN0YXRlLCBsaW5lIH0pOwogICAgfQoKICAgIHN0YXRlLmFkZGVkSXRlbXMucHVzaChsaW5lKTsKICAgIGlmIChsaW5lLmNsYXNzID09PSAicGl6emEiKSBzdGF0ZS5sYXN0QWRkZWRQaXp6YSA9IGxpbmU7CiAgfQoKICBpZiAocHJlc2VydmVMb2FkZWRPcmRlckNvbnRleHQpIHsKICAgIC8vIFBlcnNpc3QgaW5pdGlhbCBzbmFwc2hvdCBmb3IgbGF0ZXIgZGlmZi1iYXNlZCB1cGRhdGUKICAgIHN0YXRlLmxvYWRlZE9yZGVyU25hcHNob3QgPSB7IGl0ZW1zOiBzbmFwc2hvdEl0ZW1zIH07CiAgfSBlbHNlIHsKICAgIC8vIEltcG9ydGVkIHRlbXBvcmFyeSB3ZWIgb3JkZXJzIG11c3QgYmVoYXZlIGxpa2UgYSBuZXcgZWRpdGFibGUgYmFza2V0LAogICAgLy8gbm90IGxpa2UgYSBsaXZlIHVwZGF0ZSBvZiB0aGUgc291cmNlIERCIG9yZGVyLgogICAgc3RhdGUubG9hZGVkT3JkZXJNZXRhID0gbnVsbDsKICAgIHN0YXRlLmltcG9ydGVkT3JkZXJJZERhdGUgPSBudWxsOwogICAgc3RhdGUubG9hZGVkT3JkZXJTbmFwc2hvdCA9IFtdOwogICAgc3RhdGUubG9hZGVkT3JkZXJQYXltZW50cyA9IFtdOwogICAgc3RhdGUubW9kaWZDb21tYW5kZSA9IGZhbHNlOwogIH0KCiAgLy8gVVg6IHN1cHByZXNzICJEb3VibGUgY2xpcXVlIHBvdXIgaW1wb3J0ZXIuLi4iIGhpbnQgcmlnaHQgYWZ0ZXIgYW4gaW1wb3J0LgogIC8vIChPcGVyYXRvcnMgb2Z0ZW4gdGFwIGEgdGFiIHJpZ2h0IGFmdGVyIGltcG9ydDsgd2UgZG9uJ3Qgd2FudCB0byBuYWcuKQogIHRyeXsKICAgIHN0YXRlLnVpTGFzdE9yZGVySW1wb3J0ZWRBdCA9IERhdGUubm93KCk7CiAgfSBjYXRjaCAoZSkge30KICByZXR1cm4gdHJ1ZTsKfQoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRPcmRlckJ5SWREYXRlKHsgc3RhdGUsIG1vY2ssIGlkRGF0ZSB9ID0ge30pewogIGNvbnN0IHBkdiA9IGdldFBEVkN1cnJlbnQoKTsKICBjb25zdCBzdG9yZSA9IHN0b3JlVG9TdWZmaXgocGR2KTsKICBjb25zdCBkYXRlID0gc3RhdGUuc2VsZWN0ZWREYXRlSVNPOwogIGNvbnN0IGlkX2RhdGUgPSBOdW1iZXIoaWREYXRlKTsKICBpZiAoIU51bWJlci5pc0Zpbml0ZShpZF9kYXRlKSkgcmV0dXJuIGZhbHNlOwoKICB0cnl7CiAgICB0b2FzdChgQ2hhcmdlbWVudCBjb21tYW5kZSAke2lkX2RhdGV94oCmYCwgeyBkdXJhdGlvbjogMTIwMCB9KTsKICB9IGNhdGNoIChlKSB7fQoKICB0cnl7CiAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgZmV0Y2hPcmRlckRldGFpbHMoeyBzdG9yZSwgZGF0ZSwgaWREYXRlOiBpZF9kYXRlIH0pOwogICAgcmV0dXJuIGF3YWl0IGh5ZHJhdGVMb2FkZWRPcmRlclBheWxvYWQoewogICAgICBzdGF0ZSwKICAgICAgbW9jaywKICAgICAgc3RvcmUsCiAgICAgIGRhdGUsCiAgICAgIHBheWxvYWQsCiAgICAgIGxvYWRlZE1ldGE6IHsKICAgICAgICBzdG9yZSwKICAgICAgICBpZDogTnVtYmVyKHBheWxvYWQ/Lm9yZGVyPy5pZCA/PyAwKSB8fCAwLAogICAgICAgIGlkX2RhdGUsCiAgICAgICAgZGF0ZUlTTzogZGF0ZSwKICAgICAgICBoZXVyZV9wcmVwYTogTnVtYmVyKHBheWxvYWQ/Lm9yZGVyPy5oZXVyZV9wcmVwYSA/PyAwKSB8fCAwLAogICAgICB9LAogICAgICBwcmVzZXJ2ZUxvYWRlZE9yZGVyQ29udGV4dDogdHJ1ZSwKICAgIH0pOwogIH0gY2F0Y2ggKGUpewogICAgY29uc29sZS53YXJuKCJbb3JkZXJzXSBsb2FkT3JkZXJCeUlkRGF0ZSBmYWlsZWQ6IiwgZSk7CiAgICAvLyBEZWZlbnNpdmU6IG5ldmVyIGtlZXAgc3RhbGUgcGF5bWVudHMgd2hlbiBsb2FkIGZhaWxzCiAgICBzdGF0ZS5sb2FkZWRPcmRlclBheW1lbnRzID0gW107CiAgICBzdGF0ZS5pbXBvcnRlZE9yZGVySWREYXRlID0gbnVsbDsKICAgIHRyeXsgdG9hc3QoIkltcG9zc2libGUgZGUgY2hhcmdlciBsYSBjb21tYW5kZS4iKTsgfSBjYXRjaCAoZTIpIHt9CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9"
            }
        },
        {
            "path": "caisse-aqp/public/assets/js/app-js/orderMode/orderModeToggles.js",
            "kind": "file",
            "before": {
                "exists": true,
                "kind": "file",
                "size": 2536,
                "sha1": "55d6b7cce094edc521c40ff4c1efe257baa5290e",
                "content_b64": "LyogZ2xvYmFsIGRvY3VtZW50ICovCi8qIGRvYy1wcm9qZWN0IHwgY2Fpc3NlLWFxcC9wdWJsaWMvYXNzZXRzL2pzL2FwcC1qcy9vcmRlck1vZGUvb3JkZXJNb2RlVG9nZ2xlcy5qcyB8IEfDqHJlIGxlcyBiYXNjdWxlcyBkZSBtb2RlIGNvdXBlL2xpdnJhaXNvbiwgcmVzeW5jaHJvbmlzZSDDoCBs4oCZYWN0aXZhdGlvbiBkZSBsYSBsaXZyYWlzb24gbGVzIHPDqWxlY3RldXJzIGNvbXBvc2l0ZXMgY29kZSBwb3N0YWwgLyB2aWxsZSBkZXB1aXMgbGVzIHZhbGV1cnMgZMOpasOgIGNvbm51ZXMgZHUgc3RhdGUgY2xpZW50L2FkcmVzc2UgcHJvdmlzb2lyZSwgcHVpcyBkw6ljbGVuY2hlIGxlcyByYWZyYcOuY2hpc3NlbWVudHMgVUkgYXNzb2Npw6lzLiBNdXR1YWxpc2UgZMOpc29ybWFpcyBhdXNzaSBsYSBub3JtYWxpc2F0aW9uIGJvb2zDqWVubmUgYXZlYyBsYSByw6hnbGUgbcOpdGllciBjZW50cmFsaXPDqWUgZGVzIG1vZGVzIGNvbW1hbmRlIHBvdXIgZ2FyYW50aXIgdW4gY29tcG9ydGVtZW50IGlkZW50aXF1ZSBlbnRyZSBjcsOpYXRpb24sIHJlc2V0IGV0IGltcG9ydC4gfCBFeHBvc2U6IHNldENvdXBlTW9kZSwgdG9nZ2xlQ291cGVNb2RlLCBzZXRMaXZyYWlzb25Nb2RlLCB0b2dnbGVMaXZyYWlzb25Nb2RlIHwgRMOpcGVuZCBkZTogZG9jdW1lbnQsIEN1c3RvbUV2ZW50LCAuLi9wZHYuanMsIC4uL2FkZHJlc3MvZGVsaXZlcnlDaXR5U3RhdGVTeW5jLmpzP3RzPTIwMjYwNDA1LTEsIC4vb3JkZXJNb2RlU3RhdGUuanM/dHM9MjAyNjA0MDYtMSB8IEltcGFjdGU6IMOpdGF0IGRlIGNvbW1hbmRlIGVuIG3DqW1vaXJlLCByYWZyYcOuY2hpc3NlbWVudCBkZXMgcGFubmVhdXggVUksIHByw6ktc8OpbGVjdGlvbiB2aWxsZS9jb2RlIHBvc3RhbCBhdSBwYXNzYWdlIGVuIGxpdnJhaXNvbiwgY29ow6lyZW5jZSBkZSBub3JtYWxpc2F0aW9uIGNvdXBlL2xpdnJhaXNvbiB8IFRhYmxlczogYXVjdW5lICovCgppbXBvcnQgeyBnZXRQRFZDdXJyZW50LCBzdG9yZVRvU3VmZml4IH0gZnJvbSAiLi4vcGR2LmpzIjsKaW1wb3J0IHsgc3luY0RlbGl2ZXJ5QWRkcmVzc1NlbGVjdGlvbnMgfSBmcm9tICIuLi9hZGRyZXNzL2RlbGl2ZXJ5Q2l0eVN0YXRlU3luYy5qcz90cz0yMDI2MDQwNS0xIjsKaW1wb3J0IHsgbm9ybWFsaXplT3JkZXJNb2RlQm9vbCB9IGZyb20gIi4vb3JkZXJNb2RlU3RhdGUuanM/dHM9MjAyNjA0MDYtMSI7CgpmdW5jdGlvbiBkaXNwYXRjaFVJUmVmcmVzaChraW5kKXsKICB0cnl7CiAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChraW5kKSk7CiAgfSBjYXRjaCAoZSkge30KfQoKZnVuY3Rpb24gc2V0Qm9vbEZsYWcoc3RhdGUsIGtleSwgbmV4dFZhbHVlKXsKICBpZiAoIXN0YXRlIHx8IHR5cGVvZiBzdGF0ZSAhPT0gIm9iamVjdCIpIHJldHVybiBmYWxzZTsKICBjb25zdCBub3JtYWxpemVkID0gISFuZXh0VmFsdWU7CiAgY29uc3QgY3VycmVudCA9IG5vcm1hbGl6ZU9yZGVyTW9kZUJvb2woc3RhdGU/LltrZXldKTsKICBpZiAoY3VycmVudCA9PT0gbm9ybWFsaXplZCl7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIHN0YXRlW2tleV0gPSBub3JtYWxpemVkOwogIHJldHVybiB0cnVlOwp9CgpleHBvcnQgZnVuY3Rpb24gc2V0Q291cGVNb2RlKHsgc3RhdGUsIGVuYWJsZWQgfSA9IHt9KXsKICBjb25zdCBjaGFuZ2VkID0gc2V0Qm9vbEZsYWcoc3RhdGUsICJjb3VwZSIsIGVuYWJsZWQpOwogIGRpc3BhdGNoVUlSZWZyZXNoKCJ1aTpyZWZyZXNoUmlnaHRQYW5lbE9ubHkiKTsKICByZXR1cm4gY2hhbmdlZDsKfQoKZXhwb3J0IGZ1bmN0aW9uIHRvZ2dsZUNvdXBlTW9kZSh7IHN0YXRlIH0gPSB7fSl7CiAgY29uc3QgY3VycmVudCA9IG5vcm1hbGl6ZU9yZGVyTW9kZUJvb2woc3RhdGU/LmNvdXBlKTsKICByZXR1cm4gc2V0Q291cGVNb2RlKHsgc3RhdGUsIGVuYWJsZWQ6ICFjdXJyZW50IH0pOwp9CgpleHBvcnQgZnVuY3Rpb24gc2V0TGl2cmFpc29uTW9kZSh7IHN0YXRlLCBlbmFibGVkIH0gPSB7fSl7CiAgY29uc3QgY2hhbmdlZCA9IHNldEJvb2xGbGFnKHN0YXRlLCAibGl2cmFpc29uIiwgZW5hYmxlZCk7CiAgaWYgKHN0YXRlICYmIHR5cGVvZiBzdGF0ZSA9PT0gIm9iamVjdCIgJiYgISFlbmFibGVkKXsKICAgIHRyeXsKICAgICAgc3luY0RlbGl2ZXJ5QWRkcmVzc1NlbGVjdGlvbnMoewogICAgICAgIHN0YXRlLAogICAgICAgIHN0b3JlSWQ6IHN0b3JlVG9TdWZmaXgoZ2V0UERWQ3VycmVudCgpKSwKICAgICAgICB3aGVuTGl2cmFpc29uT25seTogdHJ1ZSwKICAgICAgfSk7CiAgICB9IGNhdGNoIChlKSB7fQogIH0KICBkaXNwYXRjaFVJUmVmcmVzaCgidWk6cmVmcmVzaFNpZGVQYW5lbHNPbmx5Iik7CiAgcmV0dXJuIGNoYW5nZWQ7Cn0KCmV4cG9ydCBmdW5jdGlvbiB0b2dnbGVMaXZyYWlzb25Nb2RlKHsgc3RhdGUgfSA9IHt9KXsKICBjb25zdCBjdXJyZW50ID0gbm9ybWFsaXplT3JkZXJNb2RlQm9vbChzdGF0ZT8ubGl2cmFpc29uKTsKICByZXR1cm4gc2V0TGl2cmFpc29uTW9kZSh7IHN0YXRlLCBlbmFibGVkOiAhY3VycmVudCB9KTsKfQ=="
            },
            "after": {
                "exists": true,
                "kind": "file",
                "size": 2582,
                "sha1": "8898e3326ed9718c5a8e1dd1f29e0a1d4c189371",
                "content_b64": "LyogZ2xvYmFsIGRvY3VtZW50ICovCi8qIGRvYy1wcm9qZWN0IHwgY2Fpc3NlLWFxcC9wdWJsaWMvYXNzZXRzL2pzL2FwcC1qcy9vcmRlck1vZGUvb3JkZXJNb2RlVG9nZ2xlcy5qcyB8IEfDqHJlIGxlcyBiYXNjdWxlcyBkZSBtb2RlIGNvdXBlL2xpdnJhaXNvbiwgcmVzeW5jaHJvbmlzZSDDoCBs4oCZYWN0aXZhdGlvbiBkZSBsYSBsaXZyYWlzb24gbGVzIHPDqWxlY3RldXJzIGNvbXBvc2l0ZXMgY29kZSBwb3N0YWwgLyB2aWxsZSBkZXB1aXMgbGVzIHZhbGV1cnMgZMOpasOgIGNvbm51ZXMgZHUgc3RhdGUgY2xpZW50L2FkcmVzc2UgcHJvdmlzb2lyZSwgYXBwbGlxdWUgc2lub24gbGEgY29tbXVuZSBwYXIgZMOpZmF1dCBkdSBQRFYsIHB1aXMgZMOpY2xlbmNoZSBsZXMgcmFmcmHDrmNoaXNzZW1lbnRzIFVJIGFzc29jacOpcy4gTXV0dWFsaXNlIGTDqXNvcm1haXMgYXVzc2kgbGEgbm9ybWFsaXNhdGlvbiBib29sw6llbm5lIGF2ZWMgbGEgcsOoZ2xlIG3DqXRpZXIgY2VudHJhbGlzw6llIGRlcyBtb2RlcyBjb21tYW5kZSBwb3VyIGdhcmFudGlyIHVuIGNvbXBvcnRlbWVudCBpZGVudGlxdWUgZW50cmUgY3LDqWF0aW9uLCByZXNldCBldCBpbXBvcnQuIHwgRXhwb3NlOiBzZXRDb3VwZU1vZGUsIHRvZ2dsZUNvdXBlTW9kZSwgc2V0TGl2cmFpc29uTW9kZSwgdG9nZ2xlTGl2cmFpc29uTW9kZSB8IETDqXBlbmQgZGU6IGRvY3VtZW50LCBDdXN0b21FdmVudCwgLi4vcGR2LmpzLCAuLi9hZGRyZXNzL2RlbGl2ZXJ5Q2l0eVN0YXRlU3luYy5qcz90cz0yMDI2MDQyMi0xLCAuL29yZGVyTW9kZVN0YXRlLmpzP3RzPTIwMjYwNDA2LTEgfCBJbXBhY3RlOiDDqXRhdCBkZSBjb21tYW5kZSBlbiBtw6ltb2lyZSwgcmFmcmHDrmNoaXNzZW1lbnQgZGVzIHBhbm5lYXV4IFVJLCBwcsOpLXPDqWxlY3Rpb24gdmlsbGUvY29kZSBwb3N0YWwgYXUgcGFzc2FnZSBlbiBsaXZyYWlzb24sIGNvaMOpcmVuY2UgZGUgbm9ybWFsaXNhdGlvbiBjb3VwZS9saXZyYWlzb24gfCBUYWJsZXM6IGF1Y3VuZSAqLwoKaW1wb3J0IHsgZ2V0UERWQ3VycmVudCwgc3RvcmVUb1N1ZmZpeCB9IGZyb20gIi4uL3Bkdi5qcyI7CmltcG9ydCB7IHN5bmNEZWxpdmVyeUFkZHJlc3NTZWxlY3Rpb25zIH0gZnJvbSAiLi4vYWRkcmVzcy9kZWxpdmVyeUNpdHlTdGF0ZVN5bmMuanM/dHM9MjAyNjA0MjItMSI7CmltcG9ydCB7IG5vcm1hbGl6ZU9yZGVyTW9kZUJvb2wgfSBmcm9tICIuL29yZGVyTW9kZVN0YXRlLmpzP3RzPTIwMjYwNDA2LTEiOwoKZnVuY3Rpb24gZGlzcGF0Y2hVSVJlZnJlc2goa2luZCl7CiAgdHJ5ewogICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoa2luZCkpOwogIH0gY2F0Y2ggKGUpIHt9Cn0KCmZ1bmN0aW9uIHNldEJvb2xGbGFnKHN0YXRlLCBrZXksIG5leHRWYWx1ZSl7CiAgaWYgKCFzdGF0ZSB8fCB0eXBlb2Ygc3RhdGUgIT09ICJvYmplY3QiKSByZXR1cm4gZmFsc2U7CiAgY29uc3Qgbm9ybWFsaXplZCA9ICEhbmV4dFZhbHVlOwogIGNvbnN0IGN1cnJlbnQgPSBub3JtYWxpemVPcmRlck1vZGVCb29sKHN0YXRlPy5ba2V5XSk7CiAgaWYgKGN1cnJlbnQgPT09IG5vcm1hbGl6ZWQpewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBzdGF0ZVtrZXldID0gbm9ybWFsaXplZDsKICByZXR1cm4gdHJ1ZTsKfQoKZXhwb3J0IGZ1bmN0aW9uIHNldENvdXBlTW9kZSh7IHN0YXRlLCBlbmFibGVkIH0gPSB7fSl7CiAgY29uc3QgY2hhbmdlZCA9IHNldEJvb2xGbGFnKHN0YXRlLCAiY291cGUiLCBlbmFibGVkKTsKICBkaXNwYXRjaFVJUmVmcmVzaCgidWk6cmVmcmVzaFJpZ2h0UGFuZWxPbmx5Iik7CiAgcmV0dXJuIGNoYW5nZWQ7Cn0KCmV4cG9ydCBmdW5jdGlvbiB0b2dnbGVDb3VwZU1vZGUoeyBzdGF0ZSB9ID0ge30pewogIGNvbnN0IGN1cnJlbnQgPSBub3JtYWxpemVPcmRlck1vZGVCb29sKHN0YXRlPy5jb3VwZSk7CiAgcmV0dXJuIHNldENvdXBlTW9kZSh7IHN0YXRlLCBlbmFibGVkOiAhY3VycmVudCB9KTsKfQoKZXhwb3J0IGZ1bmN0aW9uIHNldExpdnJhaXNvbk1vZGUoeyBzdGF0ZSwgZW5hYmxlZCB9ID0ge30pewogIGNvbnN0IGNoYW5nZWQgPSBzZXRCb29sRmxhZyhzdGF0ZSwgImxpdnJhaXNvbiIsIGVuYWJsZWQpOwogIGlmIChzdGF0ZSAmJiB0eXBlb2Ygc3RhdGUgPT09ICJvYmplY3QiICYmICEhZW5hYmxlZCl7CiAgICB0cnl7CiAgICAgIHN5bmNEZWxpdmVyeUFkZHJlc3NTZWxlY3Rpb25zKHsKICAgICAgICBzdGF0ZSwKICAgICAgICBzdG9yZUlkOiBzdG9yZVRvU3VmZml4KGdldFBEVkN1cnJlbnQoKSksCiAgICAgICAgd2hlbkxpdnJhaXNvbk9ubHk6IHRydWUsCiAgICAgIH0pOwogICAgfSBjYXRjaCAoZSkge30KICB9CiAgZGlzcGF0Y2hVSVJlZnJlc2goInVpOnJlZnJlc2hTaWRlUGFuZWxzT25seSIpOwogIHJldHVybiBjaGFuZ2VkOwp9CgpleHBvcnQgZnVuY3Rpb24gdG9nZ2xlTGl2cmFpc29uTW9kZSh7IHN0YXRlIH0gPSB7fSl7CiAgY29uc3QgY3VycmVudCA9IG5vcm1hbGl6ZU9yZGVyTW9kZUJvb2woc3RhdGU/LmxpdnJhaXNvbik7CiAgcmV0dXJuIHNldExpdnJhaXNvbk1vZGUoeyBzdGF0ZSwgZW5hYmxlZDogIWN1cnJlbnQgfSk7Cn0="
            }
        },
        {
            "path": "caisse-aqp/public/assets/js/app-js/state/client.js",
            "kind": "file",
            "before": {
                "exists": true,
                "kind": "file",
                "size": 4925,
                "sha1": "af03d677f37b9b9f9e90fa91f9adf332bc49bb26",
                "content_b64": "LyogZG9jLXByb2plY3QgfCBjYWlzc2UtYXFwL3B1YmxpYy9hc3NldHMvanMvYXBwLWpzL3N0YXRlL2NsaWVudC5qcyB8IENvbnN0cnVpdCBs4oCZw6l0YXQgY2xpZW50IGluamVjdMOpIGRlcHVpcyBs4oCZQVBJLCBub3JtYWxpc2UgZMOpc29ybWFpcyBhdXNzaSBsZXMgYWxpYXMgY2FtZWxDYXNlL3NuYWtlX2Nhc2UgZGVzIGNoYW1wcyBhZHJlc3NlIGRlIGxpdnJhaXNvbiBhdSBtb21lbnQgZGUgbOKAmWltcG9ydCBldCBmb3Vybml0IHVuIGhlbHBlciBwb3VyIHByw6ljb25zdHJ1aXJlIGzigJnDqXRhdCBjb21wbGV0IGNvZGUgcG9zdGFsIC8gdmlsbGUgLyB2YWxldXIgY29tcG9zaXRlIG3Dqm1lIHF1YW5kIGxhIHpvbmUgbGl2cmFpc29uIGVzdCBlbmNvcmUgbWFzcXXDqWUsIGFmaW4gcXVlIGzigJlhY3RpdmF0aW9uIHRhcmRpdmUgZHUgc3dpdGNoIGxpdnJhaXNvbiBuZSBkw6lwZW5kZSBwbHVzIGTigJl1biBET00gZMOpasOgIGFmZmljaMOpLiB8IEV4cG9zZTogYnVpbGRJbmplY3RlZENsaWVudEZyb21BcGksIHN5bmNJbmplY3RlZENsaWVudERlbGl2ZXJ5U3RhdGUsIGJ1aWxkRW1wdHlDbGllbnQgfCBEw6lwZW5kIGRlOiAuLi9hZGRyZXNzL2RlbGl2ZXJ5Q2l0eUNob2ljZXMuanM/dHM9MjAyNjA0MDUtMiB8IEltcGFjdGU6IMOpdGF0IGZyb250ZW5kLCBhZmZpY2hhZ2UgQ2xpZW50Q2FyZCwgcHJvdGVjdGlvbiBkZXMgYWRyZXNzZXMgY2xpZW50IGxvcnMgZGVzIHNhdXZlZ2FyZGVzLCBwcsOpc8OpbGVjdGlvbiBkaWZmw6lyw6llIGR1IHPDqWxlY3RldXIgY29tcG9zaXRlIGxpdnJhaXNvbiB8IFRhYmxlczogYXVjdW5lICovCgppbXBvcnQgeyBidWlsZEFsbG93ZWRDaG9pY2VWYWx1ZSBhcyBidWlsZEFsbG93ZWREZWxpdmVyeUNpdHlDaG9pY2VWYWx1ZSB9IGZyb20gIi4uL2FkZHJlc3MvZGVsaXZlcnlDaXR5Q2hvaWNlcy5qcz90cz0yMDI2MDQwNS0yIjsKCmZ1bmN0aW9uIHJlYWRGaXJzdE5vbkVtcHR5KHNvdXJjZSwga2V5cyl7CiAgY29uc3Qgc3JjID0gKHNvdXJjZSAmJiB0eXBlb2Ygc291cmNlID09PSAib2JqZWN0IikgPyBzb3VyY2UgOiB7fTsKICBjb25zdCBsaXN0ID0gQXJyYXkuaXNBcnJheShrZXlzKSA/IGtleXMgOiBbXTsKICBmb3IgKGNvbnN0IGtleSBvZiBsaXN0KXsKICAgIGNvbnN0IHZhbHVlID0gU3RyaW5nKHNyYz8uW2tleV0gPz8gIiIpLnRyaW0oKTsKICAgIGlmICh2YWx1ZSkgcmV0dXJuIHZhbHVlOwogIH0KICByZXR1cm4gIiI7Cn0KCmV4cG9ydCBmdW5jdGlvbiBidWlsZEluamVjdGVkQ2xpZW50RnJvbUFwaShjdXN0b21lcil7CiAgY29uc3QgYyA9IChjdXN0b21lciAmJiB0eXBlb2YgY3VzdG9tZXIgPT09ICJvYmplY3QiKSA/IGN1c3RvbWVyIDoge307CiAgY29uc3QgaWRSYXcgPSBjLmlkID8/IGMuSUQgPz8gYy5jbGllbnRfaWQgPz8gbnVsbDsKICBjb25zdCBpZCA9IE51bWJlci5pc0Zpbml0ZShOdW1iZXIoaWRSYXcpKSA/IE1hdGguZmxvb3IoTnVtYmVyKGlkUmF3KSkgOiBudWxsOwoKICBjb25zdCBwdHNUb3RhbCA9IE51bWJlcihjLnBvaW50c19maWRfdG90YWwpOwogIGNvbnN0IHBvaW50c0ZpZFRvdGFsID0gTnVtYmVyLmlzRmluaXRlKHB0c1RvdGFsKSA/IHB0c1RvdGFsIDogbnVsbDsKCiAgLy8gUHJlZmVyIGFkanVzdGVkIGRpc3BsYXkgcG9pbnRzIGlmIHByZXNlbnQsIGZhbGxiYWNrIHRvIHRvdGFsIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CiAgY29uc3QgcHRzRGlzcGxheSA9IE51bWJlcihjLmxveWFsdHlfcG9pbnRzX2Rpc3BsYXkpOwogIGNvbnN0IHBvaW50c0ZpZERpc3BsYXkgPSBOdW1iZXIuaXNGaW5pdGUocHRzRGlzcGxheSkgPyBwdHNEaXNwbGF5IDogcG9pbnRzRmlkVG90YWw7CgogIGNvbnN0IHJlc2VydmVkUGl6emFzID0gTnVtYmVyKGMubG95YWx0eV9yZXNlcnZlZF9waXp6YXMpOwogIGNvbnN0IGxveWFsdHlSZXNlcnZlZFBpenphcyA9IE51bWJlci5pc0Zpbml0ZShyZXNlcnZlZFBpenphcykgPyBNYXRoLm1heCgwLCBNYXRoLmZsb29yKHJlc2VydmVkUGl6emFzKSkgOiAwOwogIGNvbnN0IHJlc2VydmVkUG9pbnRzID0gTnVtYmVyKGMubG95YWx0eV9yZXNlcnZlZF9wb2ludHMpOwogIGNvbnN0IGxveWFsdHlSZXNlcnZlZFBvaW50cyA9IE51bWJlci5pc0Zpbml0ZShyZXNlcnZlZFBvaW50cykgPyBNYXRoLm1heCgwLCBNYXRoLmZsb29yKHJlc2VydmVkUG9pbnRzKSkgOiAobG95YWx0eVJlc2VydmVkUGl6emFzICogMTApOwogIGNvbnN0IGxveWFsdHlVc2VkU2VsZWN0ZWREYXkgPSAoYy5sb3lhbHR5X3VzZWRfc2VsZWN0ZWRfZGF5ID09PSB0cnVlKTsKICBjb25zdCBjb2RlUG9zdGFsID0gcmVhZEZpcnN0Tm9uRW1wdHkoYywgWyJjb2RlX3Bvc3RhbCIsICJjb2RlUG9zdGFsIl0pOwogIGNvbnN0IHZpbGxlID0gcmVhZEZpcnN0Tm9uRW1wdHkoYywgWyJ2aWxsZSIsICJjaXR5Il0pOwogIGNvbnN0IGRlbGl2ZXJ5Q2l0eVBlcnNpc3RlZENvZGVQb3N0YWwgPSByZWFkRmlyc3ROb25FbXB0eShjLCBbImRlbGl2ZXJ5Q2l0eVBlcnNpc3RlZENvZGVQb3N0YWwiLCAiY29kZV9wb3N0YWwiLCAiY29kZVBvc3RhbCJdKTsKICBjb25zdCBkZWxpdmVyeUNpdHlQZXJzaXN0ZWRWaWxsZSA9IHJlYWRGaXJzdE5vbkVtcHR5KGMsIFsiZGVsaXZlcnlDaXR5UGVyc2lzdGVkVmlsbGUiLCAidmlsbGUiLCAiY2l0eSJdKTsKICByZXR1cm4gewogICAgaWQsCiAgICB0ZWxlcGhvbmU6IGMucGhvbmVOdW1iZXIgPz8gYy50ZWxlcGhvbmUgPz8gIiIsCiAgICBwb2ludHNGaWRUb3RhbCwKICAgIHBvaW50c0ZpZERpc3BsYXksCiAgICBsb3lhbHR5UmVzZXJ2ZWRQaXp6YXMsCiAgICBsb3lhbHR5UmVzZXJ2ZWRQb2ludHMsCiAgICBsb3lhbHR5VXNlZFNlbGVjdGVkRGF5LAogICAgcHJlbm9tOiBjLm5vbV9wcmVub20gPz8gIiIsCiAgICBhZHJlc3NlOiBjLmFkcmVzc2UgPz8gIiIsCiAgICBjb21wbGVtZW50QWRyZXNzZTogYy5jb21wbGVtZW50X2FkcmVzc2UgPz8gIiIsCiAgICBleHBsaWNhdGlvbnNBZHJlc3NlOiAiIiwKICAgIG51bVBsdXMxOiBjLm51bV9zdXBwMSA/PyAiIiwKICAgIG51bVBsdXMyOiBjLm51bV9zdXBwMiA/PyAiIiwKICAgIGNvZGVQb3N0YWwsCiAgICB2aWxsZSwKICAgIGRlbGl2ZXJ5Q2l0eUNob2ljZTogYy5kZWxpdmVyeUNpdHlDaG9pY2UgPz8gYy5kZWxpdmVyeV9jaXR5X2Nob2ljZSA/PyAiIiwKICAgIGRlbGl2ZXJ5Q2l0eVBlcnNpc3RlZENvZGVQb3N0YWwsCiAgICBkZWxpdmVyeUNpdHlQZXJzaXN0ZWRWaWxsZSwKICAgIHByb2JsZW1lOiBjLnByb2JsZW1lID8/ICIiLAogIH07Cn0KCmV4cG9ydCBmdW5jdGlvbiBzeW5jSW5qZWN0ZWRDbGllbnREZWxpdmVyeVN0YXRlKGNsaWVudCwgc3RvcmVJZCA9ICIiKXsKICBjb25zdCB0YXJnZXQgPSAoY2xpZW50ICYmIHR5cGVvZiBjbGllbnQgPT09ICJvYmplY3QiKSA/IGNsaWVudCA6IG51bGw7CiAgaWYgKCF0YXJnZXQpIHJldHVybiB0YXJnZXQ7CgogIGNvbnN0IGVmZmVjdGl2ZVBvc3RhbCA9IHJlYWRGaXJzdE5vbkVtcHR5KHRhcmdldCwgWyJjb2RlUG9zdGFsIiwgImNvZGVfcG9zdGFsIiwgImRlbGl2ZXJ5Q2l0eVBlcnNpc3RlZENvZGVQb3N0YWwiXSk7CiAgY29uc3QgZWZmZWN0aXZlQ2l0eSA9IHJlYWRGaXJzdE5vbkVtcHR5KHRhcmdldCwgWyJ2aWxsZSIsICJjaXR5IiwgImRlbGl2ZXJ5Q2l0eVBlcnNpc3RlZFZpbGxlIl0pOwoKICB0YXJnZXQuY29kZVBvc3RhbCA9IGVmZmVjdGl2ZVBvc3RhbDsKICB0YXJnZXQudmlsbGUgPSBlZmZlY3RpdmVDaXR5OwogIHRhcmdldC5kZWxpdmVyeUNpdHlQZXJzaXN0ZWRDb2RlUG9zdGFsID0gcmVhZEZpcnN0Tm9uRW1wdHkodGFyZ2V0LCBbImRlbGl2ZXJ5Q2l0eVBlcnNpc3RlZENvZGVQb3N0YWwiXSkgfHwgZWZmZWN0aXZlUG9zdGFsOwogIHRhcmdldC5kZWxpdmVyeUNpdHlQZXJzaXN0ZWRWaWxsZSA9IHJlYWRGaXJzdE5vbkVtcHR5KHRhcmdldCwgWyJkZWxpdmVyeUNpdHlQZXJzaXN0ZWRWaWxsZSJdKSB8fCBlZmZlY3RpdmVDaXR5OwoKICBpZiAoU3RyaW5nKHN0b3JlSWQgPz8gIiIpLnRyaW0oKSAhPT0gIiIpewogICAgY29uc3QgbmV4dENob2ljZVZhbHVlID0gYnVpbGRBbGxvd2VkRGVsaXZlcnlDaXR5Q2hvaWNlVmFsdWUoc3RvcmVJZCwgZWZmZWN0aXZlQ2l0eSwgZWZmZWN0aXZlUG9zdGFsKTsKICAgIHRhcmdldC5kZWxpdmVyeUNpdHlDaG9pY2UgPSBuZXh0Q2hvaWNlVmFsdWUgfHwgIiI7CiAgfSBlbHNlIGlmICghU3RyaW5nKHRhcmdldC5kZWxpdmVyeUNpdHlDaG9pY2UgPz8gIiIpLnRyaW0oKSkgewogICAgdGFyZ2V0LmRlbGl2ZXJ5Q2l0eUNob2ljZSA9ICIiOwogIH0KCiAgcmV0dXJuIHRhcmdldDsKfQoKZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRW1wdHlDbGllbnQoKXsKICAvLyBNdXN0IG1hdGNoIHRoZSBzaGFwZSB1c2VkIGJ5IGJ1aWxkSW5qZWN0ZWRDbGllbnRGcm9tQXBpKCkgc28gQ2xpZW50Q2FyZCByZW5kZXJzIGVtcHR5IGZpZWxkcy4KICByZXR1cm4gewogICAgaWQ6IG51bGwsCiAgICB0ZWxlcGhvbmU6ICIiLAogICAgcG9pbnRzRmlkVG90YWw6IG51bGwsCiAgICBwb2ludHNGaWREaXNwbGF5OiBudWxsLAogICAgbG95YWx0eVJlc2VydmVkUGl6emFzOiAwLAogICAgbG95YWx0eVJlc2VydmVkUG9pbnRzOiAwLAogICAgbG95YWx0eVVzZWRTZWxlY3RlZERheTogZmFsc2UsCiAgICBwcmVub206ICIiLAogICAgYWRyZXNzZTogIiIsCiAgICBjb21wbGVtZW50QWRyZXNzZTogIiIsCiAgICBleHBsaWNhdGlvbnNBZHJlc3NlOiAiIiwKICAgIG51bVBsdXMxOiAiIiwKICAgIG51bVBsdXMyOiAiIiwKICAgIGNvZGVQb3N0YWw6ICIiLAogICAgdmlsbGU6ICIiLAogICAgZGVsaXZlcnlDaXR5Q2hvaWNlOiAiIiwKICAgIGRlbGl2ZXJ5Q2l0eVBlcnNpc3RlZENvZGVQb3N0YWw6ICIiLAogICAgZGVsaXZlcnlDaXR5UGVyc2lzdGVkVmlsbGU6ICIiLAogICAgcHJvYmxlbWU6ICIiLAogIH07Cn0="
            },
            "after": {
                "exists": true,
                "kind": "file",
                "size": 5035,
                "sha1": "c4673798d9c6fd61ce6c749817ef0cd8f64a6765",
                "content_b64": "LyogZG9jLXByb2plY3QgfCBjYWlzc2UtYXFwL3B1YmxpYy9hc3NldHMvanMvYXBwLWpzL3N0YXRlL2NsaWVudC5qcyB8IENvbnN0cnVpdCBs4oCZw6l0YXQgY2xpZW50IGluamVjdMOpIGRlcHVpcyBs4oCZQVBJLCBub3JtYWxpc2UgZMOpc29ybWFpcyBhdXNzaSBsZXMgYWxpYXMgY2FtZWxDYXNlL3NuYWtlX2Nhc2UgZGVzIGNoYW1wcyBhZHJlc3NlIGRlIGxpdnJhaXNvbiBhdSBtb21lbnQgZGUgbOKAmWltcG9ydCBldCBmb3Vybml0IHVuIGhlbHBlciBwb3VyIHByw6ljb25zdHJ1aXJlIGzigJnDqXRhdCBjb21wbGV0IGNvZGUgcG9zdGFsIC8gdmlsbGUgLyB2YWxldXIgY29tcG9zaXRlIG3Dqm1lIHF1YW5kIGxhIHpvbmUgbGl2cmFpc29uIGVzdCBlbmNvcmUgbWFzcXXDqWUsIGFmaW4gcXVlIGzigJlhY3RpdmF0aW9uIHRhcmRpdmUgZHUgc3dpdGNoIGxpdnJhaXNvbiBuZSBkw6lwZW5kZSBwbHVzIGTigJl1biBET00gZMOpasOgIGFmZmljaMOpLCB0b3V0IGVuIGxhaXNzYW50IGxlIHPDqWxlY3RldXIgdmlkZSBsb3JzcXVlIGzigJlhZHJlc3NlIGV4aXN0YW50ZSBuZSBjb3JyZXNwb25kIHBhcyBhdXggY2hvaXggZHUgUERWIGNvdXJhbnQuIHwgRXhwb3NlOiBidWlsZEluamVjdGVkQ2xpZW50RnJvbUFwaSwgc3luY0luamVjdGVkQ2xpZW50RGVsaXZlcnlTdGF0ZSwgYnVpbGRFbXB0eUNsaWVudCB8IETDqXBlbmQgZGU6IC4uL2FkZHJlc3MvZGVsaXZlcnlDaXR5Q2hvaWNlcy5qcz90cz0yMDI2MDQyMi0xIHwgSW1wYWN0ZTogw6l0YXQgZnJvbnRlbmQsIGFmZmljaGFnZSBDbGllbnRDYXJkLCBwcm90ZWN0aW9uIGRlcyBhZHJlc3NlcyBjbGllbnQgbG9ycyBkZXMgc2F1dmVnYXJkZXMsIHByw6lzw6lsZWN0aW9uIGRpZmbDqXLDqWUgZHUgc8OpbGVjdGV1ciBjb21wb3NpdGUgbGl2cmFpc29uIHwgVGFibGVzOiBhdWN1bmUgKi8KCmltcG9ydCB7IGJ1aWxkQWxsb3dlZENob2ljZVZhbHVlIGFzIGJ1aWxkQWxsb3dlZERlbGl2ZXJ5Q2l0eUNob2ljZVZhbHVlIH0gZnJvbSAiLi4vYWRkcmVzcy9kZWxpdmVyeUNpdHlDaG9pY2VzLmpzP3RzPTIwMjYwNDIyLTEiOwoKZnVuY3Rpb24gcmVhZEZpcnN0Tm9uRW1wdHkoc291cmNlLCBrZXlzKXsKICBjb25zdCBzcmMgPSAoc291cmNlICYmIHR5cGVvZiBzb3VyY2UgPT09ICJvYmplY3QiKSA/IHNvdXJjZSA6IHt9OwogIGNvbnN0IGxpc3QgPSBBcnJheS5pc0FycmF5KGtleXMpID8ga2V5cyA6IFtdOwogIGZvciAoY29uc3Qga2V5IG9mIGxpc3QpewogICAgY29uc3QgdmFsdWUgPSBTdHJpbmcoc3JjPy5ba2V5XSA/PyAiIikudHJpbSgpOwogICAgaWYgKHZhbHVlKSByZXR1cm4gdmFsdWU7CiAgfQogIHJldHVybiAiIjsKfQoKZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkSW5qZWN0ZWRDbGllbnRGcm9tQXBpKGN1c3RvbWVyKXsKICBjb25zdCBjID0gKGN1c3RvbWVyICYmIHR5cGVvZiBjdXN0b21lciA9PT0gIm9iamVjdCIpID8gY3VzdG9tZXIgOiB7fTsKICBjb25zdCBpZFJhdyA9IGMuaWQgPz8gYy5JRCA/PyBjLmNsaWVudF9pZCA/PyBudWxsOwogIGNvbnN0IGlkID0gTnVtYmVyLmlzRmluaXRlKE51bWJlcihpZFJhdykpID8gTWF0aC5mbG9vcihOdW1iZXIoaWRSYXcpKSA6IG51bGw7CgogIGNvbnN0IHB0c1RvdGFsID0gTnVtYmVyKGMucG9pbnRzX2ZpZF90b3RhbCk7CiAgY29uc3QgcG9pbnRzRmlkVG90YWwgPSBOdW1iZXIuaXNGaW5pdGUocHRzVG90YWwpID8gcHRzVG90YWwgOiBudWxsOwoKICAvLyBQcmVmZXIgYWRqdXN0ZWQgZGlzcGxheSBwb2ludHMgaWYgcHJlc2VudCwgZmFsbGJhY2sgdG8gdG90YWwgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKICBjb25zdCBwdHNEaXNwbGF5ID0gTnVtYmVyKGMubG95YWx0eV9wb2ludHNfZGlzcGxheSk7CiAgY29uc3QgcG9pbnRzRmlkRGlzcGxheSA9IE51bWJlci5pc0Zpbml0ZShwdHNEaXNwbGF5KSA/IHB0c0Rpc3BsYXkgOiBwb2ludHNGaWRUb3RhbDsKCiAgY29uc3QgcmVzZXJ2ZWRQaXp6YXMgPSBOdW1iZXIoYy5sb3lhbHR5X3Jlc2VydmVkX3Bpenphcyk7CiAgY29uc3QgbG95YWx0eVJlc2VydmVkUGl6emFzID0gTnVtYmVyLmlzRmluaXRlKHJlc2VydmVkUGl6emFzKSA/IE1hdGgubWF4KDAsIE1hdGguZmxvb3IocmVzZXJ2ZWRQaXp6YXMpKSA6IDA7CiAgY29uc3QgcmVzZXJ2ZWRQb2ludHMgPSBOdW1iZXIoYy5sb3lhbHR5X3Jlc2VydmVkX3BvaW50cyk7CiAgY29uc3QgbG95YWx0eVJlc2VydmVkUG9pbnRzID0gTnVtYmVyLmlzRmluaXRlKHJlc2VydmVkUG9pbnRzKSA/IE1hdGgubWF4KDAsIE1hdGguZmxvb3IocmVzZXJ2ZWRQb2ludHMpKSA6IChsb3lhbHR5UmVzZXJ2ZWRQaXp6YXMgKiAxMCk7CiAgY29uc3QgbG95YWx0eVVzZWRTZWxlY3RlZERheSA9IChjLmxveWFsdHlfdXNlZF9zZWxlY3RlZF9kYXkgPT09IHRydWUpOwogIGNvbnN0IGNvZGVQb3N0YWwgPSByZWFkRmlyc3ROb25FbXB0eShjLCBbImNvZGVfcG9zdGFsIiwgImNvZGVQb3N0YWwiXSk7CiAgY29uc3QgdmlsbGUgPSByZWFkRmlyc3ROb25FbXB0eShjLCBbInZpbGxlIiwgImNpdHkiXSk7CiAgY29uc3QgZGVsaXZlcnlDaXR5UGVyc2lzdGVkQ29kZVBvc3RhbCA9IHJlYWRGaXJzdE5vbkVtcHR5KGMsIFsiZGVsaXZlcnlDaXR5UGVyc2lzdGVkQ29kZVBvc3RhbCIsICJjb2RlX3Bvc3RhbCIsICJjb2RlUG9zdGFsIl0pOwogIGNvbnN0IGRlbGl2ZXJ5Q2l0eVBlcnNpc3RlZFZpbGxlID0gcmVhZEZpcnN0Tm9uRW1wdHkoYywgWyJkZWxpdmVyeUNpdHlQZXJzaXN0ZWRWaWxsZSIsICJ2aWxsZSIsICJjaXR5Il0pOwogIHJldHVybiB7CiAgICBpZCwKICAgIHRlbGVwaG9uZTogYy5waG9uZU51bWJlciA/PyBjLnRlbGVwaG9uZSA/PyAiIiwKICAgIHBvaW50c0ZpZFRvdGFsLAogICAgcG9pbnRzRmlkRGlzcGxheSwKICAgIGxveWFsdHlSZXNlcnZlZFBpenphcywKICAgIGxveWFsdHlSZXNlcnZlZFBvaW50cywKICAgIGxveWFsdHlVc2VkU2VsZWN0ZWREYXksCiAgICBwcmVub206IGMubm9tX3ByZW5vbSA/PyAiIiwKICAgIGFkcmVzc2U6IGMuYWRyZXNzZSA/PyAiIiwKICAgIGNvbXBsZW1lbnRBZHJlc3NlOiBjLmNvbXBsZW1lbnRfYWRyZXNzZSA/PyAiIiwKICAgIGV4cGxpY2F0aW9uc0FkcmVzc2U6ICIiLAogICAgbnVtUGx1czE6IGMubnVtX3N1cHAxID8/ICIiLAogICAgbnVtUGx1czI6IGMubnVtX3N1cHAyID8/ICIiLAogICAgY29kZVBvc3RhbCwKICAgIHZpbGxlLAogICAgZGVsaXZlcnlDaXR5Q2hvaWNlOiBjLmRlbGl2ZXJ5Q2l0eUNob2ljZSA/PyBjLmRlbGl2ZXJ5X2NpdHlfY2hvaWNlID8/ICIiLAogICAgZGVsaXZlcnlDaXR5UGVyc2lzdGVkQ29kZVBvc3RhbCwKICAgIGRlbGl2ZXJ5Q2l0eVBlcnNpc3RlZFZpbGxlLAogICAgcHJvYmxlbWU6IGMucHJvYmxlbWUgPz8gIiIsCiAgfTsKfQoKZXhwb3J0IGZ1bmN0aW9uIHN5bmNJbmplY3RlZENsaWVudERlbGl2ZXJ5U3RhdGUoY2xpZW50LCBzdG9yZUlkID0gIiIpewogIGNvbnN0IHRhcmdldCA9IChjbGllbnQgJiYgdHlwZW9mIGNsaWVudCA9PT0gIm9iamVjdCIpID8gY2xpZW50IDogbnVsbDsKICBpZiAoIXRhcmdldCkgcmV0dXJuIHRhcmdldDsKCiAgY29uc3QgZWZmZWN0aXZlUG9zdGFsID0gcmVhZEZpcnN0Tm9uRW1wdHkodGFyZ2V0LCBbImNvZGVQb3N0YWwiLCAiY29kZV9wb3N0YWwiLCAiZGVsaXZlcnlDaXR5UGVyc2lzdGVkQ29kZVBvc3RhbCJdKTsKICBjb25zdCBlZmZlY3RpdmVDaXR5ID0gcmVhZEZpcnN0Tm9uRW1wdHkodGFyZ2V0LCBbInZpbGxlIiwgImNpdHkiLCAiZGVsaXZlcnlDaXR5UGVyc2lzdGVkVmlsbGUiXSk7CgogIHRhcmdldC5jb2RlUG9zdGFsID0gZWZmZWN0aXZlUG9zdGFsOwogIHRhcmdldC52aWxsZSA9IGVmZmVjdGl2ZUNpdHk7CiAgdGFyZ2V0LmRlbGl2ZXJ5Q2l0eVBlcnNpc3RlZENvZGVQb3N0YWwgPSByZWFkRmlyc3ROb25FbXB0eSh0YXJnZXQsIFsiZGVsaXZlcnlDaXR5UGVyc2lzdGVkQ29kZVBvc3RhbCJdKSB8fCBlZmZlY3RpdmVQb3N0YWw7CiAgdGFyZ2V0LmRlbGl2ZXJ5Q2l0eVBlcnNpc3RlZFZpbGxlID0gcmVhZEZpcnN0Tm9uRW1wdHkodGFyZ2V0LCBbImRlbGl2ZXJ5Q2l0eVBlcnNpc3RlZFZpbGxlIl0pIHx8IGVmZmVjdGl2ZUNpdHk7CgogIGlmIChTdHJpbmcoc3RvcmVJZCA/PyAiIikudHJpbSgpICE9PSAiIil7CiAgICBjb25zdCBuZXh0Q2hvaWNlVmFsdWUgPSBidWlsZEFsbG93ZWREZWxpdmVyeUNpdHlDaG9pY2VWYWx1ZShzdG9yZUlkLCBlZmZlY3RpdmVDaXR5LCBlZmZlY3RpdmVQb3N0YWwpOwogICAgdGFyZ2V0LmRlbGl2ZXJ5Q2l0eUNob2ljZSA9IG5leHRDaG9pY2VWYWx1ZSB8fCAiIjsKICB9IGVsc2UgaWYgKCFTdHJpbmcodGFyZ2V0LmRlbGl2ZXJ5Q2l0eUNob2ljZSA/PyAiIikudHJpbSgpKSB7CiAgICB0YXJnZXQuZGVsaXZlcnlDaXR5Q2hvaWNlID0gIiI7CiAgfQoKICByZXR1cm4gdGFyZ2V0Owp9CgpleHBvcnQgZnVuY3Rpb24gYnVpbGRFbXB0eUNsaWVudCgpewogIC8vIE11c3QgbWF0Y2ggdGhlIHNoYXBlIHVzZWQgYnkgYnVpbGRJbmplY3RlZENsaWVudEZyb21BcGkoKSBzbyBDbGllbnRDYXJkIHJlbmRlcnMgZW1wdHkgZmllbGRzLgogIHJldHVybiB7CiAgICBpZDogbnVsbCwKICAgIHRlbGVwaG9uZTogIiIsCiAgICBwb2ludHNGaWRUb3RhbDogbnVsbCwKICAgIHBvaW50c0ZpZERpc3BsYXk6IG51bGwsCiAgICBsb3lhbHR5UmVzZXJ2ZWRQaXp6YXM6IDAsCiAgICBsb3lhbHR5UmVzZXJ2ZWRQb2ludHM6IDAsCiAgICBsb3lhbHR5VXNlZFNlbGVjdGVkRGF5OiBmYWxzZSwKICAgIHByZW5vbTogIiIsCiAgICBhZHJlc3NlOiAiIiwKICAgIGNvbXBsZW1lbnRBZHJlc3NlOiAiIiwKICAgIGV4cGxpY2F0aW9uc0FkcmVzc2U6ICIiLAogICAgbnVtUGx1czE6ICIiLAogICAgbnVtUGx1czI6ICIiLAogICAgY29kZVBvc3RhbDogIiIsCiAgICB2aWxsZTogIiIsCiAgICBkZWxpdmVyeUNpdHlDaG9pY2U6ICIiLAogICAgZGVsaXZlcnlDaXR5UGVyc2lzdGVkQ29kZVBvc3RhbDogIiIsCiAgICBkZWxpdmVyeUNpdHlQZXJzaXN0ZWRWaWxsZTogIiIsCiAgICBwcm9ibGVtZTogIiIsCiAgfTsKfQ=="
            }
        },
        {
            "path": "caisse-aqp/public/assets/js/services/api/saveOrderApi.js",
            "kind": "file",
            "before": {
                "exists": true,
                "kind": "file",
                "size": 1833,
                "sha1": "823c30e05ea81f699ea4e5f9943d9c27a6ffaa33",
                "content_b64": "LyogZ2xvYmFsIGZldGNoICovCi8qIGRvYy1wcm9qZWN0IHwgY2Fpc3NlLWFxcC9wdWJsaWMvYXNzZXRzL2pzL3NlcnZpY2VzL2FwaS9zYXZlT3JkZXJBcGkuanMgfCBFbnZvaWUgbGEgY29tbWFuZGUgYXUgYmFja2VuZCB2aWEgbOKAmUFQSSBkZSBzYXV2ZWdhcmRlLCBub3JtYWxpc2UgZMOpc29ybWFpcyBsZSBwYXlsb2FkIGFkcmVzc2UgYXZhbnQgZW52b2kgcG91ciBjb252ZXJ0aXIgdG91dCBzw6lsZWN0ZXVyIGNvbXBvc2l0ZSB2aWxsZS9jb2RlIHBvc3RhbCBlbiBjaGFtcHMgc8OpcGFyw6lzIGF0dGVuZHVzIHBhciBsZSBiYWNrZW5kLCBuZSBwb3Vzc2VyIHVuZSBtaXNlIMOgIGpvdXIgdmlsbGUgLyBjb2RlIHBvc3RhbCBxdWUgbG9yc3F14oCZdW5lIG9wdGlvbiB2YWxpZGUgZXN0IHPDqWxlY3Rpb25uw6llIGV0IHRyYW5zcG9ydGVyIHNpbm9uIHVuIGluZGljYXRldXIgZXhwbGljaXRlIGRlIHByw6lzZXJ2YXRpb24gZGVzIHZhbGV1cnMgZXhpc3RhbnRlcy4gfCBFeHBvc2U6IHNhdmVPcmRlciwgc2FmZUpzb25QYXJzZSB8IETDqXBlbmQgZGU6IGFwaS9zYXZlT3JkZXIucGhwLCBmZXRjaCwgLi4vcGF5bG9hZHMvb3JkZXJBZGRyZXNzUGF5bG9hZE5vcm1hbGl6ZXIuanM/dHM9MjAyNjA0MDUtMSB8IEltcGFjdGU6IHJlcXXDqnRlIHLDqXNlYXUsIGNyw6lhdGlvbi9taXNlIMOgIGpvdXIgZGUgY29tbWFuZGUgY8O0dMOpIHNlcnZldXIsIGZpYWJpbGl0w6kgZGVzIGNvdXBsZXMgdmlsbGUvY29kZSBwb3N0YWwgZW52b3nDqXMsIHJlc3RpdHV0aW9uIGRlcyBlcnJldXJzIG3DqXRpZXIgVUkgfCBUYWJsZXM6IGF1Y3VuZSAqLwoKaW1wb3J0IHsgbm9ybWFsaXplT3JkZXJBZGRyZXNzUGF5bG9hZCB9IGZyb20gIi4uL3BheWxvYWRzL29yZGVyQWRkcmVzc1BheWxvYWROb3JtYWxpemVyLmpzP3RzPTIwMjYwNDA1LTEiOwoKZnVuY3Rpb24gc2FmZUpzb25QYXJzZSh0eHQpewogIHRyeSB7IHJldHVybiBKU09OLnBhcnNlKHR4dCk7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIG51bGw7IH0KfQoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVPcmRlcihwYXlsb2FkKXsKICBjb25zdCB1cmwgPSBgYXBpL3NhdmVPcmRlci5waHA/dHM9JHtEYXRlLm5vdygpfWA7CiAgY29uc3Qgbm9ybWFsaXplZFBheWxvYWQgPSBub3JtYWxpemVPcmRlckFkZHJlc3NQYXlsb2FkKHBheWxvYWQpOwogIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgewogICAgbWV0aG9kOiAiUE9TVCIsCiAgICBoZWFkZXJzOiB7CiAgICAgICJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCIsCiAgICAgICJDYWNoZS1Db250cm9sIjogIm5vLXN0b3JlIiwKICAgIH0sCiAgICBib2R5OiBKU09OLnN0cmluZ2lmeShub3JtYWxpemVkUGF5bG9hZCksCiAgfSk7CgogIGNvbnN0IHR4dCA9IGF3YWl0IHJlcy50ZXh0KCk7CiAgY29uc3QgZGF0YSA9IHNhZmVKc29uUGFyc2UodHh0KSB8fCB7fTsKICBpZiAoIXJlcy5vayl7CiAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoZGF0YT8uZXJyb3IgfHwgIkhUVFAgZXJyb3IiKTsKICAgIGVyci51cmwgPSB1cmw7CiAgICBlcnIubWV0aG9kID0gIlBPU1QiOwogICAgZXJyLnN0YXR1cyA9IHJlcy5zdGF0dXM7CiAgICBlcnIuc3RhdHVzVGV4dCA9IHJlcy5zdGF0dXNUZXh0OwogICAgZXJyLnBheWxvYWQgPSBkYXRhOwogICAgZXJyLm1lc3NhZ2UgPSBTdHJpbmcoZGF0YT8ubWVzc2FnZSB8fCBkYXRhPy5lcnJvciB8fCAiSFRUUCBlcnJvciIpOwogICAgZXJyLnJhd1RleHQgPSBTdHJpbmcodHh0ID8/ICIiKS5zbGljZSgwLCAyMDAwKTsKICAgIHRocm93IGVycjsKICB9CiAgcmV0dXJuIGRhdGE7Cn0K"
            },
            "after": {
                "exists": true,
                "kind": "file",
                "size": 1893,
                "sha1": "bff09edc254b1e9ad7c921c8a26553abb1bc396c",
                "content_b64": "LyogZ2xvYmFsIGZldGNoICovCi8qIGRvYy1wcm9qZWN0IHwgY2Fpc3NlLWFxcC9wdWJsaWMvYXNzZXRzL2pzL3NlcnZpY2VzL2FwaS9zYXZlT3JkZXJBcGkuanMgfCBFbnZvaWUgbGEgY29tbWFuZGUgYXUgYmFja2VuZCB2aWEgbOKAmUFQSSBkZSBzYXV2ZWdhcmRlLCBub3JtYWxpc2UgZMOpc29ybWFpcyBsZSBwYXlsb2FkIGFkcmVzc2UgYXZhbnQgZW52b2kgcG91ciBjb252ZXJ0aXIgdG91dCBzw6lsZWN0ZXVyIGNvbXBvc2l0ZSB2aWxsZS9jb2RlIHBvc3RhbCBlbiBjaGFtcHMgc8OpcGFyw6lzIGF0dGVuZHVzIHBhciBsZSBiYWNrZW5kLCBuZSBwb3Vzc2VyIHVuZSBtaXNlIMOgIGpvdXIgdmlsbGUgLyBjb2RlIHBvc3RhbCBxdWUgbG9yc3F14oCZdW5lIG9wdGlvbiB2YWxpZGUgZXN0IHPDqWxlY3Rpb25uw6llIGV0IHRyYW5zcG9ydGVyIHNpbm9uIHVuIGluZGljYXRldXIgZXhwbGljaXRlIGRlIHByw6lzZXJ2YXRpb24gZGVzIHZhbGV1cnMgZXhpc3RhbnRlcywgc2FucyBkw6lwZW5kcmUgZOKAmXVuZSB2YWxpZGF0aW9uIGJsb3F1YW50ZSBzdXIgbGEgY29tbXVuZS4gfCBFeHBvc2U6IHNhdmVPcmRlciwgc2FmZUpzb25QYXJzZSB8IETDqXBlbmQgZGU6IGFwaS9zYXZlT3JkZXIucGhwLCBmZXRjaCwgLi4vcGF5bG9hZHMvb3JkZXJBZGRyZXNzUGF5bG9hZE5vcm1hbGl6ZXIuanM/dHM9MjAyNjA0MjItMSB8IEltcGFjdGU6IHJlcXXDqnRlIHLDqXNlYXUsIGNyw6lhdGlvbi9taXNlIMOgIGpvdXIgZGUgY29tbWFuZGUgY8O0dMOpIHNlcnZldXIsIGZpYWJpbGl0w6kgZGVzIGNvdXBsZXMgdmlsbGUvY29kZSBwb3N0YWwgZW52b3nDqXMsIHJlc3RpdHV0aW9uIGRlcyBlcnJldXJzIG3DqXRpZXIgVUkgfCBUYWJsZXM6IGF1Y3VuZSAqLwoKaW1wb3J0IHsgbm9ybWFsaXplT3JkZXJBZGRyZXNzUGF5bG9hZCB9IGZyb20gIi4uL3BheWxvYWRzL29yZGVyQWRkcmVzc1BheWxvYWROb3JtYWxpemVyLmpzP3RzPTIwMjYwNDIyLTEiOwoKZnVuY3Rpb24gc2FmZUpzb25QYXJzZSh0eHQpewogIHRyeSB7IHJldHVybiBKU09OLnBhcnNlKHR4dCk7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIG51bGw7IH0KfQoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVPcmRlcihwYXlsb2FkKXsKICBjb25zdCB1cmwgPSBgYXBpL3NhdmVPcmRlci5waHA/dHM9JHtEYXRlLm5vdygpfWA7CiAgY29uc3Qgbm9ybWFsaXplZFBheWxvYWQgPSBub3JtYWxpemVPcmRlckFkZHJlc3NQYXlsb2FkKHBheWxvYWQpOwogIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgewogICAgbWV0aG9kOiAiUE9TVCIsCiAgICBoZWFkZXJzOiB7CiAgICAgICJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCIsCiAgICAgICJDYWNoZS1Db250cm9sIjogIm5vLXN0b3JlIiwKICAgIH0sCiAgICBib2R5OiBKU09OLnN0cmluZ2lmeShub3JtYWxpemVkUGF5bG9hZCksCiAgfSk7CgogIGNvbnN0IHR4dCA9IGF3YWl0IHJlcy50ZXh0KCk7CiAgY29uc3QgZGF0YSA9IHNhZmVKc29uUGFyc2UodHh0KSB8fCB7fTsKICBpZiAoIXJlcy5vayl7CiAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoZGF0YT8uZXJyb3IgfHwgIkhUVFAgZXJyb3IiKTsKICAgIGVyci51cmwgPSB1cmw7CiAgICBlcnIubWV0aG9kID0gIlBPU1QiOwogICAgZXJyLnN0YXR1cyA9IHJlcy5zdGF0dXM7CiAgICBlcnIuc3RhdHVzVGV4dCA9IHJlcy5zdGF0dXNUZXh0OwogICAgZXJyLnBheWxvYWQgPSBkYXRhOwogICAgZXJyLm1lc3NhZ2UgPSBTdHJpbmcoZGF0YT8ubWVzc2FnZSB8fCBkYXRhPy5lcnJvciB8fCAiSFRUUCBlcnJvciIpOwogICAgZXJyLnJhd1RleHQgPSBTdHJpbmcodHh0ID8/ICIiKS5zbGljZSgwLCAyMDAwKTsKICAgIHRocm93IGVycjsKICB9CiAgcmV0dXJuIGRhdGE7Cn0K"
            }
        },
        {
            "path": "caisse-aqp/public/assets/js/services/api/updateOrderApi.js",
            "kind": "file",
            "before": {
                "exists": true,
                "kind": "file",
                "size": 1805,
                "sha1": "2a0035c06bfad0e8a1ffeee09c143667d23ad745",
                "content_b64": "LyogZG9jLXByb2plY3QgfCBjYWlzc2UtYXFwL3B1YmxpYy9hc3NldHMvanMvc2VydmljZXMvYXBpL3VwZGF0ZU9yZGVyQXBpLmpzIHwgRW52b2llIHVuZSBtaXNlIMOgIGpvdXIgZGUgY29tbWFuZGUgdmVycyBs4oCZQVBJLCBub3JtYWxpc2UgZMOpc29ybWFpcyBsZSBwYXlsb2FkIGFkcmVzc2UgYXZhbnQgZW52b2kgcG91ciBjb252ZXJ0aXIgdG91dCBzw6lsZWN0ZXVyIGNvbXBvc2l0ZSB2aWxsZS9jb2RlIHBvc3RhbCBlbiBjaGFtcHMgc8OpcGFyw6lzIGF0dGVuZHVzIHBhciBsZSBiYWNrZW5kLCBuZSBwb3Vzc2VyIHVuZSBtaXNlIMOgIGpvdXIgdmlsbGUgLyBjb2RlIHBvc3RhbCBxdWUgbG9yc3F14oCZdW5lIG9wdGlvbiB2YWxpZGUgZXN0IHPDqWxlY3Rpb25uw6llIGV0IHRyYW5zcG9ydGVyIHNpbm9uIHVuIGluZGljYXRldXIgZXhwbGljaXRlIGRlIHByw6lzZXJ2YXRpb24gZGVzIHZhbGV1cnMgZXhpc3RhbnRlcy4gfCBFeHBvc2U6IHVwZGF0ZU9yZGVyIHwgRMOpcGVuZCBkZTogYXBpL3VwZGF0ZU9yZGVyLnBocCwgZmV0Y2gsIEpTT04sIC4uL3BheWxvYWRzL29yZGVyQWRkcmVzc1BheWxvYWROb3JtYWxpemVyLmpzP3RzPTIwMjYwNDA1LTEgfCBJbXBhY3RlOiByZXF1w6p0ZXMgcsOpc2VhdSwgw6l0YXQgZGUgY29tbWFuZGUgY8O0dMOpIHNlcnZldXIsIGZpYWJpbGl0w6kgZGVzIGNvdXBsZXMgdmlsbGUvY29kZSBwb3N0YWwgZW52b3nDqXMsIGdlc3Rpb24gZOKAmWVycmV1cnMgY8O0dMOpIFVJIHwgVGFibGVzOiBhdWN1bmUgKi8KLyogZ2xvYmFsIGZldGNoICovCgppbXBvcnQgeyBub3JtYWxpemVPcmRlckFkZHJlc3NQYXlsb2FkIH0gZnJvbSAiLi4vcGF5bG9hZHMvb3JkZXJBZGRyZXNzUGF5bG9hZE5vcm1hbGl6ZXIuanM/dHM9MjAyNjA0MDUtMSI7CgpmdW5jdGlvbiBzYWZlSnNvblBhcnNlKHR4dCl7CiAgdHJ5IHsgcmV0dXJuIEpTT04ucGFyc2UodHh0KTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gbnVsbDsgfQp9CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlT3JkZXIocGF5bG9hZCl7CiAgY29uc3QgdXJsID0gYGFwaS91cGRhdGVPcmRlci5waHA/dHM9JHtEYXRlLm5vdygpfWA7CiAgY29uc3Qgbm9ybWFsaXplZFBheWxvYWQgPSBub3JtYWxpemVPcmRlckFkZHJlc3NQYXlsb2FkKHBheWxvYWQpOwogIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgewogICAgbWV0aG9kOiAiUE9TVCIsCiAgICBoZWFkZXJzOiB7CiAgICAgICJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCIsCiAgICAgICJDYWNoZS1Db250cm9sIjogIm5vLXN0b3JlIiwKICAgIH0sCiAgICBib2R5OiBKU09OLnN0cmluZ2lmeShub3JtYWxpemVkUGF5bG9hZCksCiAgfSk7CgogIGNvbnN0IHR4dCA9IGF3YWl0IHJlcy50ZXh0KCk7CiAgY29uc3QgZGF0YSA9IHNhZmVKc29uUGFyc2UodHh0KSB8fCB7fTsKICBpZiAoIXJlcy5vayl7CiAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoZGF0YT8uZXJyb3IgfHwgIkhUVFAgZXJyb3IiKTsKICAgIGVyci51cmwgPSB1cmw7CiAgICBlcnIubWV0aG9kID0gIlBPU1QiOwogICAgZXJyLnN0YXR1cyA9IHJlcy5zdGF0dXM7CiAgICBlcnIuc3RhdHVzVGV4dCA9IHJlcy5zdGF0dXNUZXh0OwogICAgZXJyLnBheWxvYWQgPSBkYXRhOwogICAgZXJyLm1lc3NhZ2UgPSBTdHJpbmcoZGF0YT8ubWVzc2FnZSB8fCBkYXRhPy5lcnJvciB8fCAiSFRUUCBlcnJvciIpOwogICAgZXJyLnJhd1RleHQgPSBTdHJpbmcodHh0ID8/ICIiKS5zbGljZSgwLCAyMDAwKTsKICAgIHRocm93IGVycjsKICB9CiAgcmV0dXJuIGRhdGE7Cn0="
            },
            "after": {
                "exists": true,
                "kind": "file",
                "size": 1865,
                "sha1": "0d33f01cc18f22907ad504000ce70bc121b4ce24",
                "content_b64": "LyogZG9jLXByb2plY3QgfCBjYWlzc2UtYXFwL3B1YmxpYy9hc3NldHMvanMvc2VydmljZXMvYXBpL3VwZGF0ZU9yZGVyQXBpLmpzIHwgRW52b2llIHVuZSBtaXNlIMOgIGpvdXIgZGUgY29tbWFuZGUgdmVycyBs4oCZQVBJLCBub3JtYWxpc2UgZMOpc29ybWFpcyBsZSBwYXlsb2FkIGFkcmVzc2UgYXZhbnQgZW52b2kgcG91ciBjb252ZXJ0aXIgdG91dCBzw6lsZWN0ZXVyIGNvbXBvc2l0ZSB2aWxsZS9jb2RlIHBvc3RhbCBlbiBjaGFtcHMgc8OpcGFyw6lzIGF0dGVuZHVzIHBhciBsZSBiYWNrZW5kLCBuZSBwb3Vzc2VyIHVuZSBtaXNlIMOgIGpvdXIgdmlsbGUgLyBjb2RlIHBvc3RhbCBxdWUgbG9yc3F14oCZdW5lIG9wdGlvbiB2YWxpZGUgZXN0IHPDqWxlY3Rpb25uw6llIGV0IHRyYW5zcG9ydGVyIHNpbm9uIHVuIGluZGljYXRldXIgZXhwbGljaXRlIGRlIHByw6lzZXJ2YXRpb24gZGVzIHZhbGV1cnMgZXhpc3RhbnRlcywgc2FucyBkw6lwZW5kcmUgZOKAmXVuZSB2YWxpZGF0aW9uIGJsb3F1YW50ZSBzdXIgbGEgY29tbXVuZS4gfCBFeHBvc2U6IHVwZGF0ZU9yZGVyIHwgRMOpcGVuZCBkZTogYXBpL3VwZGF0ZU9yZGVyLnBocCwgZmV0Y2gsIEpTT04sIC4uL3BheWxvYWRzL29yZGVyQWRkcmVzc1BheWxvYWROb3JtYWxpemVyLmpzP3RzPTIwMjYwNDIyLTEgfCBJbXBhY3RlOiByZXF1w6p0ZXMgcsOpc2VhdSwgw6l0YXQgZGUgY29tbWFuZGUgY8O0dMOpIHNlcnZldXIsIGZpYWJpbGl0w6kgZGVzIGNvdXBsZXMgdmlsbGUvY29kZSBwb3N0YWwgZW52b3nDqXMsIGdlc3Rpb24gZOKAmWVycmV1cnMgY8O0dMOpIFVJIHwgVGFibGVzOiBhdWN1bmUgKi8KLyogZ2xvYmFsIGZldGNoICovCgppbXBvcnQgeyBub3JtYWxpemVPcmRlckFkZHJlc3NQYXlsb2FkIH0gZnJvbSAiLi4vcGF5bG9hZHMvb3JkZXJBZGRyZXNzUGF5bG9hZE5vcm1hbGl6ZXIuanM/dHM9MjAyNjA0MjItMSI7CgpmdW5jdGlvbiBzYWZlSnNvblBhcnNlKHR4dCl7CiAgdHJ5IHsgcmV0dXJuIEpTT04ucGFyc2UodHh0KTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gbnVsbDsgfQp9CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlT3JkZXIocGF5bG9hZCl7CiAgY29uc3QgdXJsID0gYGFwaS91cGRhdGVPcmRlci5waHA/dHM9JHtEYXRlLm5vdygpfWA7CiAgY29uc3Qgbm9ybWFsaXplZFBheWxvYWQgPSBub3JtYWxpemVPcmRlckFkZHJlc3NQYXlsb2FkKHBheWxvYWQpOwogIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgewogICAgbWV0aG9kOiAiUE9TVCIsCiAgICBoZWFkZXJzOiB7CiAgICAgICJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCIsCiAgICAgICJDYWNoZS1Db250cm9sIjogIm5vLXN0b3JlIiwKICAgIH0sCiAgICBib2R5OiBKU09OLnN0cmluZ2lmeShub3JtYWxpemVkUGF5bG9hZCksCiAgfSk7CgogIGNvbnN0IHR4dCA9IGF3YWl0IHJlcy50ZXh0KCk7CiAgY29uc3QgZGF0YSA9IHNhZmVKc29uUGFyc2UodHh0KSB8fCB7fTsKICBpZiAoIXJlcy5vayl7CiAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoZGF0YT8uZXJyb3IgfHwgIkhUVFAgZXJyb3IiKTsKICAgIGVyci51cmwgPSB1cmw7CiAgICBlcnIubWV0aG9kID0gIlBPU1QiOwogICAgZXJyLnN0YXR1cyA9IHJlcy5zdGF0dXM7CiAgICBlcnIuc3RhdHVzVGV4dCA9IHJlcy5zdGF0dXNUZXh0OwogICAgZXJyLnBheWxvYWQgPSBkYXRhOwogICAgZXJyLm1lc3NhZ2UgPSBTdHJpbmcoZGF0YT8ubWVzc2FnZSB8fCBkYXRhPy5lcnJvciB8fCAiSFRUUCBlcnJvciIpOwogICAgZXJyLnJhd1RleHQgPSBTdHJpbmcodHh0ID8/ICIiKS5zbGljZSgwLCAyMDAwKTsKICAgIHRocm93IGVycjsKICB9CiAgcmV0dXJuIGRhdGE7Cn0="
            }
        },
        {
            "path": "caisse-aqp/public/assets/js/services/payloads/orderAddressPayloadNormalizer.js",
            "kind": "file",
            "before": {
                "exists": true,
                "kind": "file",
                "size": 6801,
                "sha1": "a681f36cfa8b08d9de7ad85c3bcf6945cd75c95e",
                "content_b64": "LyogZG9jLXByb2plY3QgfCBjYWlzc2UtYXFwL3B1YmxpYy9hc3NldHMvanMvc2VydmljZXMvcGF5bG9hZHMvb3JkZXJBZGRyZXNzUGF5bG9hZE5vcm1hbGl6ZXIuanMgfCBOb3JtYWxpc2UgbGVzIHBheWxvYWRzIGNvbW1hbmRlIGF2YW50IHNhdXZlZ2FyZGUvbWlzZSDDoCBqb3VyIGVuIGNvbnZlcnRpc3NhbnQgbGVzIHPDqWxlY3RldXJzIFVJIGNvbXBvc2l0ZXMgdmlsbGUvY29kZSBwb3N0YWwgZW4gY2hhbXBzIHPDqXBhcsOpcyBjb21wYXRpYmxlcyBiYWNrZW5kLCBlbiBuZSBtZXR0YW50IMOgIGpvdXIgY29kZV9wb3N0YWwgLyB2aWxsZSBxdWUgbG9yc3F14oCZdW5lIG9wdGlvbiB2YWxpZGUgZHUgUERWIGVzdCByw6llbGxlbWVudCBzw6lsZWN0aW9ubsOpZSwgZXQgZW4gbWFycXVhbnQgc2lub24gZXhwbGljaXRlbWVudCBsZXMgY29udGVuZXVycyDDoCBwcsOpc2VydmVyIHBvdXIgZW1ww6pjaGVyIHRvdXQgw6ljcmFzZW1lbnQgc2lsZW5jaWV1eCBkZXMgdmFsZXVycyBkw6lqw6AgcHLDqXNlbnRlcyBlbiBiYXNlLiB8IEV4cG9zZTogbm9ybWFsaXplT3JkZXJBZGRyZXNzUGF5bG9hZCB8IETDqXBlbmQgZGU6IEpTT04sIC4uLy4uL2FwcC1qcy9hZGRyZXNzL2RlbGl2ZXJ5Q2l0eUNob2ljZXMuanM/dHM9MjAyNjA0MDUtMSB8IEltcGFjdGU6IHBheWxvYWRzIGVudm95w6lzIMOgIHNhdmVPcmRlci5waHAgZXQgdXBkYXRlT3JkZXIucGhwLCBjb2jDqXJlbmNlIGRlcyBhZHJlc3NlcyBjbGllbnQgZXQgYWRyZXNzZXMgdGVtcG9yYWlyZXMsIHZhbGlkYXRpb24gYmFja2VuZCBkZXMgY29tbXVuZXMgYXV0b3Jpc8OpZXMsIGNvbnNlcnZhdGlvbiBkZXMgYWRyZXNzZXMgaGlzdG9yaXF1ZXMgaG9ycyBQRFYgfCBUYWJsZXM6IGF1Y3VuZSAqLwoKaW1wb3J0IHsgYnVpbGRBbGxvd2VkQ2hvaWNlVmFsdWUgYXMgYnVpbGRBbGxvd2VkRGVsaXZlcnlDaXR5Q2hvaWNlVmFsdWUgfSBmcm9tICIuLi8uLi9hcHAtanMvYWRkcmVzcy9kZWxpdmVyeUNpdHlDaG9pY2VzLmpzP3RzPTIwMjYwNDA1LTEiOwoKZnVuY3Rpb24gY2xvbmVKc29uU2FmZSh2YWx1ZSl7CiAgdHJ5ewogICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodmFsdWUgPz8ge30pKTsKICB9IGNhdGNoIChfZSl7CiAgICByZXR1cm4ge307CiAgfQp9CgpmdW5jdGlvbiBpc1Bvc3RhbENvZGUodmFsdWUpewogIHJldHVybiAvXlxkezQsNn0kLy50ZXN0KFN0cmluZyh2YWx1ZSA/PyAiIikudHJpbSgpKTsKfQoKZnVuY3Rpb24gbm9ybWFsaXplU3RvcmVTdWZmaXgodmFsdWUpewogIGNvbnN0IHMgPSBTdHJpbmcodmFsdWUgPz8gIiIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwogIHJldHVybiBzID09PSAicGVsIiA/ICJwZWwiIDogImxhbiI7Cn0KCmZ1bmN0aW9uIHBhcnNlQ29tcG9zaXRlQ2l0eVBvc3RhbCh2YWx1ZSl7CiAgY29uc3QgcmF3ID0gU3RyaW5nKHZhbHVlID8/ICIiKS50cmltKCk7CiAgaWYgKCFyYXcpIHJldHVybiBudWxsOwoKICBjb25zdCBwYXJ0cyA9IHJhdwogICAgLnNwbGl0KCJ8IikKICAgIC5tYXAoKGl0ZW0pID0+IFN0cmluZyhpdGVtID8/ICIiKS50cmltKCkpCiAgICAuZmlsdGVyKEJvb2xlYW4pOwoKICBpZiAocGFydHMubGVuZ3RoICE9PSAyKSByZXR1cm4gbnVsbDsKCiAgY29uc3QgYSA9IHBhcnRzWzBdOwogIGNvbnN0IGIgPSBwYXJ0c1sxXTsKCiAgaWYgKGlzUG9zdGFsQ29kZShhKSAmJiAhaXNQb3N0YWxDb2RlKGIpKXsKICAgIHJldHVybiB7IGNvZGVQb3N0YWw6IGEsIHZpbGxlOiBiIH07CiAgfQogIGlmICghaXNQb3N0YWxDb2RlKGEpICYmIGlzUG9zdGFsQ29kZShiKSl7CiAgICByZXR1cm4geyBjb2RlUG9zdGFsOiBiLCB2aWxsZTogYSB9OwogIH0KCiAgcmV0dXJuIG51bGw7Cn0KCmZ1bmN0aW9uIHJlYWROb25FbXB0eShvYmosIGtleXMpewogIGNvbnN0IHNyYyA9IChvYmogJiYgdHlwZW9mIG9iaiA9PT0gIm9iamVjdCIpID8gb2JqIDoge307CiAgY29uc3QgbGlzdCA9IEFycmF5LmlzQXJyYXkoa2V5cykgPyBrZXlzIDogW107CiAgZm9yIChjb25zdCBrZXkgb2YgbGlzdCl7CiAgICBjb25zdCB2YWx1ZSA9IFN0cmluZyhzcmM/LltrZXldID8/ICIiKS50cmltKCk7CiAgICBpZiAodmFsdWUpIHJldHVybiB2YWx1ZTsKICB9CiAgcmV0dXJuICIiOwp9CgpmdW5jdGlvbiBkZWxldGVLZXlzKG9iaiwga2V5cyl7CiAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gIm9iamVjdCIpIHJldHVybjsKICBjb25zdCBsaXN0ID0gQXJyYXkuaXNBcnJheShrZXlzKSA/IGtleXMgOiBbXTsKICBmb3IgKGNvbnN0IGtleSBvZiBsaXN0KXsKICAgIHRyeSB7IGRlbGV0ZSBvYmpba2V5XTsgfSBjYXRjaCAoX2UpIHt9CiAgfQp9CgpmdW5jdGlvbiBub3JtYWxpemVBZGRyZXNzQ29udGFpbmVyKGNvbnRhaW5lciwgY29uZmlnID0ge30pewogIGNvbnN0IHRhcmdldCA9IChjb250YWluZXIgJiYgdHlwZW9mIGNvbnRhaW5lciA9PT0gIm9iamVjdCIpID8gY29udGFpbmVyIDogbnVsbDsKICBpZiAoIXRhcmdldCkgcmV0dXJuOwoKICBjb25zdCBjb21wb3NpdGVWYWx1ZSA9IHJlYWROb25FbXB0eSh0YXJnZXQsIGNvbmZpZy5jb21wb3NpdGVLZXlzKTsKICBjb25zdCBwYXJzZWQgPSBwYXJzZUNvbXBvc2l0ZUNpdHlQb3N0YWwoY29tcG9zaXRlVmFsdWUpOwogIGNvbnN0IHNlbGVjdGVkQ2hvaWNlVmFsdWUgPSBwYXJzZWQKICAgID8gYnVpbGRBbGxvd2VkRGVsaXZlcnlDaXR5Q2hvaWNlVmFsdWUoY29uZmlnLnN0b3JlU3VmZml4LCBwYXJzZWQudmlsbGUsIHBhcnNlZC5jb2RlUG9zdGFsKQogICAgOiAiIjsKICBjb25zdCBoYXNWYWxpZFNlbGVjdGVkQ2hvaWNlID0gc2VsZWN0ZWRDaG9pY2VWYWx1ZSAhPT0gIiI7CgogIGNvbnN0IGZpbmFsUG9zdGFsID0gaGFzVmFsaWRTZWxlY3RlZENob2ljZQogICAgPyBTdHJpbmcocGFyc2VkPy5jb2RlUG9zdGFsID8/ICIiKS50cmltKCkKICAgIDogcmVhZE5vbkVtcHR5KHRhcmdldCwgY29uZmlnLnBvc3RhbEtleXMpOwogIGNvbnN0IGZpbmFsQ2l0eSA9IGhhc1ZhbGlkU2VsZWN0ZWRDaG9pY2UKICAgID8gU3RyaW5nKHBhcnNlZD8udmlsbGUgPz8gIiIpLnRyaW0oKQogICAgOiByZWFkTm9uRW1wdHkodGFyZ2V0LCBjb25maWcuY2l0eUtleXMpOwoKICBpZiAoY29uZmlnLnByZWZlcnJlZFBvc3RhbEtleSAmJiAoZmluYWxQb3N0YWwgfHwgcmVhZE5vbkVtcHR5KHRhcmdldCwgW2NvbmZpZy5wcmVmZXJyZWRQb3N0YWxLZXldKSkpewogICAgdGFyZ2V0W2NvbmZpZy5wcmVmZXJyZWRQb3N0YWxLZXldID0gZmluYWxQb3N0YWw7CiAgfQogIGlmIChjb25maWcucHJlZmVycmVkQ2l0eUtleSAmJiAoZmluYWxDaXR5IHx8IHJlYWROb25FbXB0eSh0YXJnZXQsIFtjb25maWcucHJlZmVycmVkQ2l0eUtleV0pKSl7CiAgICB0YXJnZXRbY29uZmlnLnByZWZlcnJlZENpdHlLZXldID0gZmluYWxDaXR5OwogIH0KICBpZiAoY29uZmlnLnByZXNlcnZlRmxhZ0tleSl7CiAgICBpZiAoaGFzVmFsaWRTZWxlY3RlZENob2ljZSl7CiAgICAgIHRyeSB7IGRlbGV0ZSB0YXJnZXRbY29uZmlnLnByZXNlcnZlRmxhZ0tleV07IH0gY2F0Y2ggKF9lKSB7fQogICAgfSBlbHNlIHsKICAgICAgdGFyZ2V0W2NvbmZpZy5wcmVzZXJ2ZUZsYWdLZXldID0gMTsKICAgIH0KICB9CgogIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZy5wb3N0YWxBbGlhc2VzKSl7CiAgICBmb3IgKGNvbnN0IGtleSBvZiBjb25maWcucG9zdGFsQWxpYXNlcyl7CiAgICAgIGlmIChrZXkgIT09IGNvbmZpZy5wcmVmZXJyZWRQb3N0YWxLZXkpewogICAgICAgIHRyeSB7IGRlbGV0ZSB0YXJnZXRba2V5XTsgfSBjYXRjaCAoX2UpIHt9CiAgICAgIH0KICAgIH0KICB9CiAgaWYgKEFycmF5LmlzQXJyYXkoY29uZmlnLmNpdHlBbGlhc2VzKSl7CiAgICBmb3IgKGNvbnN0IGtleSBvZiBjb25maWcuY2l0eUFsaWFzZXMpewogICAgICBpZiAoa2V5ICE9PSBjb25maWcucHJlZmVycmVkQ2l0eUtleSl7CiAgICAgICAgdHJ5IHsgZGVsZXRlIHRhcmdldFtrZXldOyB9IGNhdGNoIChfZSkge30KICAgICAgfQogICAgfQogIH0KCiAgZGVsZXRlS2V5cyh0YXJnZXQsIGNvbmZpZy5jb21wb3NpdGVLZXlzKTsKfQoKZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZU9yZGVyQWRkcmVzc1BheWxvYWQocGF5bG9hZCl7CiAgY29uc3Qgb3V0ID0gY2xvbmVKc29uU2FmZShwYXlsb2FkKTsKICBjb25zdCBzdG9yZVN1ZmZpeCA9IG5vcm1hbGl6ZVN0b3JlU3VmZml4KG91dC5zdG9yZSA/PyBvdXQuc3RvcmVJZCA/PyBvdXQuc3RvcmVfaWQpOwoKICBub3JtYWxpemVBZGRyZXNzQ29udGFpbmVyKG91dCwgewogICAgY29tcG9zaXRlS2V5czogWyJkZWxpdmVyeUNpdHlDaG9pY2UiLCAiY2l0eV9jaG9pY2UiXSwKICAgIHBvc3RhbEtleXM6IFsiY29kZVBvc3RhbCIsICJjb2RlX3Bvc3RhbCJdLAogICAgY2l0eUtleXM6IFsidmlsbGUiLCAiY2l0eSJdLAogICAgcHJlZmVycmVkUG9zdGFsS2V5OiAiY29kZVBvc3RhbCIsCiAgICBwcmVmZXJyZWRDaXR5S2V5OiAidmlsbGUiLAogICAgcG9zdGFsQWxpYXNlczogWyJjb2RlUG9zdGFsIiwgImNvZGVfcG9zdGFsIl0sCiAgICBjaXR5QWxpYXNlczogWyJ2aWxsZSIsICJjaXR5Il0sCiAgICBzdG9yZVN1ZmZpeCwKICB9KTsKCiAgbm9ybWFsaXplQWRkcmVzc0NvbnRhaW5lcihvdXQuY2xpZW50LCB7CiAgICBjb21wb3NpdGVLZXlzOiBbImRlbGl2ZXJ5Q2l0eUNob2ljZSIsICJjaXR5X2Nob2ljZSJdLAogICAgcG9zdGFsS2V5czogWyJjb2RlUG9zdGFsIiwgImNvZGVfcG9zdGFsIl0sCiAgICBjaXR5S2V5czogWyJ2aWxsZSIsICJjaXR5Il0sCiAgICBwcmVmZXJyZWRQb3N0YWxLZXk6ICJjb2RlX3Bvc3RhbCIsCiAgICBwcmVmZXJyZWRDaXR5S2V5OiAidmlsbGUiLAogICAgcG9zdGFsQWxpYXNlczogWyJjb2RlUG9zdGFsIiwgImNvZGVfcG9zdGFsIl0sCiAgICBjaXR5QWxpYXNlczogWyJ2aWxsZSIsICJjaXR5Il0sCiAgICBwcmVzZXJ2ZUZsYWdLZXk6ICJkZWxpdmVyeUNpdHlDaG9pY2VQcmVzZXJ2ZUV4aXN0aW5nIiwKICAgIHN0b3JlU3VmZml4LAogIH0pOwoKICBub3JtYWxpemVBZGRyZXNzQ29udGFpbmVyKG91dC5jdXN0b21lciwgewogICAgY29tcG9zaXRlS2V5czogWyJkZWxpdmVyeUNpdHlDaG9pY2UiLCAiY2l0eV9jaG9pY2UiXSwKICAgIHBvc3RhbEtleXM6IFsiY29kZVBvc3RhbCIsICJjb2RlX3Bvc3RhbCJdLAogICAgY2l0eUtleXM6IFsidmlsbGUiLCAiY2l0eSJdLAogICAgcHJlZmVycmVkUG9zdGFsS2V5OiAiY29kZV9wb3N0YWwiLAogICAgcHJlZmVycmVkQ2l0eUtleTogInZpbGxlIiwKICAgIHBvc3RhbEFsaWFzZXM6IFsiY29kZVBvc3RhbCIsICJjb2RlX3Bvc3RhbCJdLAogICAgY2l0eUFsaWFzZXM6IFsidmlsbGUiLCAiY2l0eSJdLAogICAgcHJlc2VydmVGbGFnS2V5OiAiZGVsaXZlcnlDaXR5Q2hvaWNlUHJlc2VydmVFeGlzdGluZyIsCiAgICBzdG9yZVN1ZmZpeCwKICB9KTsKCiAgbm9ybWFsaXplQWRkcmVzc0NvbnRhaW5lcihvdXQuYWRkcmVzcywgewogICAgY29tcG9zaXRlS2V5czogWyJkZWxpdmVyeUNpdHlDaG9pY2UiLCAiY2l0eV9jaG9pY2UiXSwKICAgIHBvc3RhbEtleXM6IFsiY29kZVBvc3RhbCIsICJjb2RlX3Bvc3RhbCJdLAogICAgY2l0eUtleXM6IFsidmlsbGUiLCAiY2l0eSJdLAogICAgcHJlZmVycmVkUG9zdGFsS2V5OiAiY29kZV9wb3N0YWwiLAogICAgcHJlZmVycmVkQ2l0eUtleTogInZpbGxlIiwKICAgIHBvc3RhbEFsaWFzZXM6IFsiY29kZVBvc3RhbCIsICJjb2RlX3Bvc3RhbCJdLAogICAgY2l0eUFsaWFzZXM6IFsidmlsbGUiLCAiY2l0eSJdLAogICAgcHJlc2VydmVGbGFnS2V5OiAiZGVsaXZlcnlDaXR5Q2hvaWNlUHJlc2VydmVFeGlzdGluZyIsCiAgICBzdG9yZVN1ZmZpeCwKICB9KTsKCiAgbm9ybWFsaXplQWRkcmVzc0NvbnRhaW5lcihvdXQudGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzLCB7CiAgICBjb21wb3NpdGVLZXlzOiBbInRlbXBvcmFyeURlbGl2ZXJ5Q2l0eUNob2ljZSIsICJkZWxpdmVyeUNpdHlDaG9pY2UiLCAiY2l0eV9jaG9pY2UiXSwKICAgIHBvc3RhbEtleXM6IFsiY29kZVBvc3RhbCIsICJjb2RlX3Bvc3RhbCJdLAogICAgY2l0eUtleXM6IFsidmlsbGUiLCAiY2l0eSJdLAogICAgcHJlZmVycmVkUG9zdGFsS2V5OiAiY29kZV9wb3N0YWwiLAogICAgcHJlZmVycmVkQ2l0eUtleTogInZpbGxlIiwKICAgIHBvc3RhbEFsaWFzZXM6IFsiY29kZVBvc3RhbCIsICJjb2RlX3Bvc3RhbCJdLAogICAgY2l0eUFsaWFzZXM6IFsidmlsbGUiLCAiY2l0eSJdLAogICAgcHJlc2VydmVGbGFnS2V5OiAiZGVsaXZlcnlDaXR5Q2hvaWNlUHJlc2VydmVFeGlzdGluZyIsCiAgICBzdG9yZVN1ZmZpeCwKICB9KTsKCiAgbm9ybWFsaXplQWRkcmVzc0NvbnRhaW5lcihvdXQudGVtcG9yYXJ5X2RlbGl2ZXJ5X2FkZHJlc3MsIHsKICAgIGNvbXBvc2l0ZUtleXM6IFsidGVtcG9yYXJ5RGVsaXZlcnlDaXR5Q2hvaWNlIiwgImRlbGl2ZXJ5Q2l0eUNob2ljZSIsICJjaXR5X2Nob2ljZSJdLAogICAgcG9zdGFsS2V5czogWyJjb2RlUG9zdGFsIiwgImNvZGVfcG9zdGFsIl0sCiAgICBjaXR5S2V5czogWyJ2aWxsZSIsICJjaXR5Il0sCiAgICBwcmVmZXJyZWRQb3N0YWxLZXk6ICJjb2RlX3Bvc3RhbCIsCiAgICBwcmVmZXJyZWRDaXR5S2V5OiAidmlsbGUiLAogICAgcG9zdGFsQWxpYXNlczogWyJjb2RlUG9zdGFsIiwgImNvZGVfcG9zdGFsIl0sCiAgICBjaXR5QWxpYXNlczogWyJ2aWxsZSIsICJjaXR5Il0sCiAgICBwcmVzZXJ2ZUZsYWdLZXk6ICJkZWxpdmVyeUNpdHlDaG9pY2VQcmVzZXJ2ZUV4aXN0aW5nIiwKICAgIHN0b3JlU3VmZml4LAogIH0pOwoKICByZXR1cm4gb3V0Owp9"
            },
            "after": {
                "exists": true,
                "kind": "file",
                "size": 6805,
                "sha1": "99faa1eb87798ad87749f5a0e8b98bc68e2f8a1f",
                "content_b64": "LyogZG9jLXByb2plY3QgfCBjYWlzc2UtYXFwL3B1YmxpYy9hc3NldHMvanMvc2VydmljZXMvcGF5bG9hZHMvb3JkZXJBZGRyZXNzUGF5bG9hZE5vcm1hbGl6ZXIuanMgfCBOb3JtYWxpc2UgbGVzIHBheWxvYWRzIGNvbW1hbmRlIGF2YW50IHNhdXZlZ2FyZGUvbWlzZSDDoCBqb3VyIGVuIGNvbnZlcnRpc3NhbnQgbGVzIHPDqWxlY3RldXJzIFVJIGNvbXBvc2l0ZXMgdmlsbGUvY29kZSBwb3N0YWwgZW4gY2hhbXBzIHPDqXBhcsOpcyBjb21wYXRpYmxlcyBiYWNrZW5kLCBlbiBuZSBtZXR0YW50IMOgIGpvdXIgY29kZV9wb3N0YWwgLyB2aWxsZSBxdWUgbG9yc3F14oCZdW5lIG9wdGlvbiB2YWxpZGUgZHUgUERWIGVzdCByw6llbGxlbWVudCBzw6lsZWN0aW9ubsOpZSBldCBlbiBtYXJxdWFudCBzaW5vbiBleHBsaWNpdGVtZW50IGxlcyBjb250ZW5ldXJzIMOgIHByw6lzZXJ2ZXIgcG91ciBlbXDDqmNoZXIgdG91dCDDqWNyYXNlbWVudCBzaWxlbmNpZXV4IGRlcyB2YWxldXJzIGTDqWrDoCBwcsOpc2VudGVzIGVuIGJhc2UsIHNhbnMgaW1wb3NlciBkZSB2YWxpZGF0aW9uIGJsb3F1YW50ZSBzdXIgbGEgc2F1dmVnYXJkZS4gfCBFeHBvc2U6IG5vcm1hbGl6ZU9yZGVyQWRkcmVzc1BheWxvYWQgfCBEw6lwZW5kIGRlOiBKU09OLCAuLi8uLi9hcHAtanMvYWRkcmVzcy9kZWxpdmVyeUNpdHlDaG9pY2VzLmpzP3RzPTIwMjYwNDIyLTEgfCBJbXBhY3RlOiBwYXlsb2FkcyBlbnZvecOpcyDDoCBzYXZlT3JkZXIucGhwIGV0IHVwZGF0ZU9yZGVyLnBocCwgY29ow6lyZW5jZSBkZXMgYWRyZXNzZXMgY2xpZW50IGV0IGFkcmVzc2VzIHRlbXBvcmFpcmVzLCBjb25zZXJ2YXRpb24gZGVzIGFkcmVzc2VzIGhpc3RvcmlxdWVzIGhvcnMgUERWIHwgVGFibGVzOiBhdWN1bmUgKi8KCmltcG9ydCB7IGJ1aWxkQWxsb3dlZENob2ljZVZhbHVlIGFzIGJ1aWxkQWxsb3dlZERlbGl2ZXJ5Q2l0eVZhbHVlIH0gZnJvbSAiLi4vLi4vYXBwLWpzL2FkZHJlc3MvZGVsaXZlcnlDaXR5Q2hvaWNlcy5qcz90cz0yMDI2MDQyMi0xIjsKCmZ1bmN0aW9uIGNsb25lSnNvblNhZmUodmFsdWUpewogIHRyeXsKICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHZhbHVlID8/IHt9KSk7CiAgfSBjYXRjaCAoX2UpewogICAgcmV0dXJuIHt9OwogIH0KfQoKZnVuY3Rpb24gaXNQb3N0YWxDb2RlKHZhbHVlKXsKICByZXR1cm4gL15cZHs0LDZ9JC8udGVzdChTdHJpbmcodmFsdWUgPz8gIiIpLnRyaW0oKSk7Cn0KCmZ1bmN0aW9uIG5vcm1hbGl6ZVN0b3JlU3VmZml4KHZhbHVlKXsKICBjb25zdCBzID0gU3RyaW5nKHZhbHVlID8/ICIiKS50cmltKCkudG9Mb3dlckNhc2UoKTsKICByZXR1cm4gcyA9PT0gInBlbCIgPyAicGVsIiA6ICJsYW4iOwp9CgpmdW5jdGlvbiBwYXJzZUNvbXBvc2l0ZUNpdHlQb3N0YWwodmFsdWUpewogIGNvbnN0IHJhdyA9IFN0cmluZyh2YWx1ZSA/PyAiIikudHJpbSgpOwogIGlmICghcmF3KSByZXR1cm4gbnVsbDsKCiAgY29uc3QgcGFydHMgPSByYXcKICAgIC5zcGxpdCgifCIpCiAgICAubWFwKChpdGVtKSA9PiBTdHJpbmcoaXRlbSA/PyAiIikudHJpbSgpKQogICAgLmZpbHRlcihCb29sZWFuKTsKCiAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMikgcmV0dXJuIG51bGw7CgogIGNvbnN0IGEgPSBwYXJ0c1swXTsKICBjb25zdCBiID0gcGFydHNbMV07CgogIGlmIChpc1Bvc3RhbENvZGUoYSkgJiYgIWlzUG9zdGFsQ29kZShiKSl7CiAgICByZXR1cm4geyBjb2RlUG9zdGFsOiBhLCB2aWxsZTogYiB9OwogIH0KICBpZiAoIWlzUG9zdGFsQ29kZShhKSAmJiBpc1Bvc3RhbENvZGUoYikpewogICAgcmV0dXJuIHsgY29kZVBvc3RhbDogYiwgdmlsbGU6IGEgfTsKICB9CgogIHJldHVybiBudWxsOwp9CgpmdW5jdGlvbiByZWFkTm9uRW1wdHkob2JqLCBrZXlzKXsKICBjb25zdCBzcmMgPSAob2JqICYmIHR5cGVvZiBvYmogPT09ICJvYmplY3QiKSA/IG9iaiA6IHt9OwogIGNvbnN0IGxpc3QgPSBBcnJheS5pc0FycmF5KGtleXMpID8ga2V5cyA6IFtdOwogIGZvciAoY29uc3Qga2V5IG9mIGxpc3QpewogICAgY29uc3QgdmFsdWUgPSBTdHJpbmcoc3JjPy5ba2V5XSA/PyAiIikudHJpbSgpOwogICAgaWYgKHZhbHVlKSByZXR1cm4gdmFsdWU7CiAgfQogIHJldHVybiAiIjsKfQoKZnVuY3Rpb24gZGVsZXRlS2V5cyhvYmosIGtleXMpewogIGlmICghb2JqIHx8IHR5cGVvZiBvYmogIT09ICJvYmplY3QiKSByZXR1cm47CiAgY29uc3QgbGlzdCA9IEFycmF5LmlzQXJyYXkoa2V5cykgPyBrZXlzIDogW107CiAgZm9yIChjb25zdCBrZXkgb2YgbGlzdCl7CiAgICB0cnkgeyBkZWxldGUgb2JqW2tleV07IH0gY2F0Y2ggKF9lKSB7fQogIH0KfQoKZnVuY3Rpb24gbm9ybWFsaXplQWRkcmVzc0NvbnRhaW5lcihjb250YWluZXIsIGNvbmZpZyA9IHt9KXsKICBjb25zdCB0YXJnZXQgPSAoY29udGFpbmVyICYmIHR5cGVvZiBjb250YWluZXIgPT09ICJvYmplY3QiKSA/IGNvbnRhaW5lciA6IG51bGw7CiAgaWYgKCF0YXJnZXQpIHJldHVybjsKCiAgY29uc3QgY29tcG9zaXRlVmFsdWUgPSByZWFkTm9uRW1wdHkodGFyZ2V0LCBjb25maWcuY29tcG9zaXRlS2V5cyk7CiAgY29uc3QgcGFyc2VkID0gcGFyc2VDb21wb3NpdGVDaXR5UG9zdGFsKGNvbXBvc2l0ZVZhbHVlKTsKICBjb25zdCBzZWxlY3RlZENob2ljZVZhbHVlID0gcGFyc2VkCiAgICA/IGJ1aWxkQWxsb3dlZERlbGl2ZXJ5Q2l0eUNob2ljZVZhbHVlKGNvbmZpZy5zdG9yZVN1ZmZpeCwgcGFyc2VkLnZpbGxlLCBwYXJzZWQuY29kZVBvc3RhbCkKICAgIDogIiI7CiAgY29uc3QgaGFzVmFsaWRTZWxlY3RlZENob2ljZSA9IHNlbGVjdGVkQ2hvaWNlVmFsdWUgIT09ICIiOwoKICBjb25zdCBmaW5hbFBvc3RhbCA9IGhhc1ZhbGlkU2VsZWN0ZWRDaG9pY2UKICAgID8gU3RyaW5nKHBhcnNlZD8uY29kZVBvc3RhbCA/PyAiIikudHJpbSgpCiAgICA6IHJlYWROb25FbXB0eSh0YXJnZXQsIGNvbmZpZy5wb3N0YWxLZXlzKTsKICBjb25zdCBmaW5hbENpdHkgPSBoYXNWYWxpZFNlbGVjdGVkQ2hvaWNlCiAgICA/IFN0cmluZyhwYXJzZWQ/LnZpbGxlID8/ICIiKS50cmltKCkKICAgIDogcmVhZE5vbkVtcHR5KHRhcmdldCwgY29uZmlnLmNpdHlLZXlzKTsKCiAgaWYgKGNvbmZpZy5wcmVmZXJyZWRQb3N0YWxLZXkgJiYgKGZpbmFsUG9zdGFsIHx8IHJlYWROb25FbXB0eSh0YXJnZXQsIFtjb25maWcucHJlZmVycmVkUG9zdGFsS2V5XSkpKXsKICAgIHRhcmdldFtjb25maWcucHJlZmVycmVkUG9zdGFsS2V5XSA9IGZpbmFsUG9zdGFsOwogIH0KICBpZiAoY29uZmlnLnByZWZlcnJlZENpdHlLZXkgJiYgKGZpbmFsQ2l0eSB8fCByZWFkTm9uRW1wdHkodGFyZ2V0LCBbY29uZmlnLnByZWZlcnJlZENpdHlLZXldKSkpewogICAgdGFyZ2V0W2NvbmZpZy5wcmVmZXJyZWRDaXR5S2V5XSA9IGZpbmFsQ2l0eTsKICB9CiAgaWYgKGNvbmZpZy5wcmVzZXJ2ZUZsYWdLZXkpewogICAgaWYgKGhhc1ZhbGlkU2VsZWN0ZWRDaG9pY2UpewogICAgICB0cnkgeyBkZWxldGUgdGFyZ2V0W2NvbmZpZy5wcmVzZXJ2ZUZsYWdLZXldOyB9IGNhdGNoIChfZSkge30KICAgIH0gZWxzZSB7CiAgICAgIHRhcmdldFtjb25maWcucHJlc2VydmVGbGFnS2V5XSA9IDE7CiAgICB9CiAgfQoKICBpZiAoQXJyYXkuaXNBcnJheShjb25maWcucG9zdGFsQWxpYXNlcykpewogICAgZm9yIChjb25zdCBrZXkgb2YgY29uZmlnLnBvc3RhbEFsaWFzZXMpewogICAgICBpZiAoa2V5ICE9PSBjb25maWcucHJlZmVycmVkUG9zdGFsS2V5KXsKICAgICAgICB0cnkgeyBkZWxldGUgdGFyZ2V0W2tleV07IH0gY2F0Y2ggKF9lKSB7fQogICAgICB9CiAgICB9CiAgfQogIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZy5jaXR5QWxpYXNlcykpewogICAgZm9yIChjb25zdCBrZXkgb2YgY29uZmlnLmNpdHlBbGlhc2VzKXsKICAgICAgaWYgKGtleSAhPT0gY29uZmlnLnByZWZlcnJlZENpdHlLZXkpewogICAgICAgIHRyeSB7IGRlbGV0ZSB0YXJnZXRba2V5XTsgfSBjYXRjaCAoX2UpIHt9CiAgICAgIH0KICAgIH0KICB9CgogIGRlbGV0ZUtleXModGFyZ2V0LCBjb25maWcuY29tcG9zaXRlS2V5cyk7Cn0KCmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVPcmRlckFkZHJlc3NQYXlsb2FkKHBheWxvYWQpewogIGNvbnN0IG91dCA9IGNsb25lSnNvblNhZmUocGF5bG9hZCk7CiAgY29uc3Qgc3RvcmVTdWZmaXggPSBub3JtYWxpemVTdG9yZVN1ZmZpeChvdXQuc3RvcmUgPz8gb3V0LnN0b3JlSWQgPz8gb3V0LnN0b3JlX2lkKTsKCiAgbm9ybWFsaXplQWRkcmVzc0NvbnRhaW5lcihvdXQsIHsKICAgIGNvbXBvc2l0ZUtleXM6IFsiZGVsaXZlcnlDaXR5Q2hvaWNlIiwgImNpdHlfY2hvaWNlIl0sCiAgICBwb3N0YWxLZXlzOiBbImNvZGVQb3N0YWwiLCAiY29kZV9wb3N0YWwiXSwKICAgIGNpdHlLZXlzOiBbInZpbGxlIiwgImNpdHkiXSwKICAgIHByZWZlcnJlZFBvc3RhbEtleTogImNvZGVQb3N0YWwiLAogICAgcHJlZmVycmVkQ2l0eUtleTogInZpbGxlIiwKICAgIHBvc3RhbEFsaWFzZXM6IFsiY29kZVBvc3RhbCIsICJjb2RlX3Bvc3RhbCJdLAogICAgY2l0eUFsaWFzZXM6IFsidmlsbGUiLCAiY2l0eSJdLAogICAgc3RvcmVTdWZmaXgsCiAgfSk7CgogIG5vcm1hbGl6ZUFkZHJlc3NDb250YWluZXIob3V0LmNsaWVudCwgewogICAgY29tcG9zaXRlS2V5czogWyJkZWxpdmVyeUNpdHlDaG9pY2UiLCAiY2l0eV9jaG9pY2UiXSwKICAgIHBvc3RhbEtleXM6IFsiY29kZVBvc3RhbCIsICJjb2RlX3Bvc3RhbCJdLAogICAgY2l0eUtleXM6IFsidmlsbGUiLCAiY2l0eSJdLAogICAgcHJlZmVycmVkUG9zdGFsS2V5OiAiY29kZV9wb3N0YWwiLAogICAgcHJlZmVycmVkQ2l0eUtleTogInZpbGxlIiwKICAgIHBvc3RhbEFsaWFzZXM6IFsiY29kZVBvc3RhbCIsICJjb2RlX3Bvc3RhbCJdLAogICAgY2l0eUFsaWFzZXM6IFsidmlsbGUiLCAiY2l0eSJdLAogICAgcHJlc2VydmVGbGFnS2V5OiAiZGVsaXZlcnlDaXR5Q2hvaWNlUHJlc2VydmVFeGlzdGluZyIsCiAgICBzdG9yZVN1ZmZpeCwKICB9KTsKCiAgbm9ybWFsaXplQWRkcmVzc0NvbnRhaW5lcihvdXQuY3VzdG9tZXIsIHsKICAgIGNvbXBvc2l0ZUtleXM6IFsiZGVsaXZlcnlDaXR5Q2hvaWNlIiwgImNpdHlfY2hvaWNlIl0sCiAgICBwb3N0YWxLZXlzOiBbImNvZGVQb3N0YWwiLCAiY29kZV9wb3N0YWwiXSwKICAgIGNpdHlLZXlzOiBbInZpbGxlIiwgImNpdHkiXSwKICAgIHByZWZlcnJlZFBvc3RhbEtleTogImNvZGVfcG9zdGFsIiwKICAgIHByZWZlcnJlZENpdHlLZXk6ICJ2aWxsZSIsCiAgICBwb3N0YWxBbGlhc2VzOiBbImNvZGVQb3N0YWwiLCAiY29kZV9wb3N0YWwiXSwKICAgIGNpdHlBbGlhc2VzOiBbInZpbGxlIiwgImNpdHkiXSwKICAgIHByZXNlcnZlRmxhZ0tleTogImRlbGl2ZXJ5Q2l0eUNob2ljZVByZXNlcnZlRXhpc3RpbmciLAogICAgc3RvcmVTdWZmaXgsCiAgfSk7CgogIG5vcm1hbGl6ZUFkZHJlc3NDb250YWluZXIob3V0LmFkZHJlc3MsIHsKICAgIGNvbXBvc2l0ZUtleXM6IFsiZGVsaXZlcnlDaXR5Q2hvaWNlIiwgImNpdHlfY2hvaWNlIl0sCiAgICBwb3N0YWxLZXlzOiBbImNvZGVQb3N0YWwiLCAiY29kZV9wb3N0YWwiXSwKICAgIGNpdHlLZXlzOiBbInZpbGxlIiwgImNpdHkiXSwKICAgIHByZWZlcnJlZFBvc3RhbEtleTogImNvZGVfcG9zdGFsIiwKICAgIHByZWZlcnJlZENpdHlLZXk6ICJ2aWxsZSIsCiAgICBwb3N0YWxBbGlhc2VzOiBbImNvZGVQb3N0YWwiLCAiY29kZV9wb3N0YWwiXSwKICAgIGNpdHlBbGlhc2VzOiBbInZpbGxlIiwgImNpdHkiXSwKICAgIHByZXNlcnZlRmxhZ0tleTogImRlbGl2ZXJ5Q2l0eUNob2ljZVByZXNlcnZlRXhpc3RpbmciLAogICAgc3RvcmVTdWZmaXgsCiAgfSk7CgogIG5vcm1hbGl6ZUFkZHJlc3NDb250YWluZXIob3V0LnRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcywgewogICAgY29tcG9zaXRlS2V5czogWyJ0ZW1wb3JhcnlEZWxpdmVyeUNpdHlDaG9pY2UiLCAiZGVsaXZlcnlDaXR5Q2hvaWNlIiwgImNpdHlfY2hvaWNlIl0sCiAgICBwb3N0YWxLZXlzOiBbImNvZGVQb3N0YWwiLCAiY29kZV9wb3N0YWwiXSwKICAgIGNpdHlLZXlzOiBbInZpbGxlIiwgImNpdHkiXSwKICAgIHByZWZlcnJlZFBvc3RhbEtleTogImNvZGVfcG9zdGFsIiwKICAgIHByZWZlcnJlZENpdHlLZXk6ICJ2aWxsZSIsCiAgICBwb3N0YWxBbGlhc2VzOiBbImNvZGVQb3N0YWwiLCAiY29kZV9wb3N0YWwiXSwKICAgIGNpdHlBbGlhc2VzOiBbInZpbGxlIiwgImNpdHkiXSwKICAgIHByZXNlcnZlRmxhZ0tleTogImRlbGl2ZXJ5Q2l0eUNob2ljZVByZXNlcnZlRXhpc3RpbmciLAogICAgc3RvcmVTdWZmaXgsCiAgfSk7CgogIG5vcm1hbGl6ZUFkZHJlc3NDb250YWluZXIob3V0LnRlbXBvcmFyeV9kZWxpdmVyeV9hZGRyZXNzLCB7CiAgICBjb21wb3NpdGVLZXlzOiBbInRlbXBvcmFyeURlbGl2ZXJ5Q2l0eUNob2ljZSIsICJkZWxpdmVyeUNpdHlDaG9pY2UiLCAiY2l0eV9jaG9pY2UiXSwKICAgIHBvc3RhbEtleXM6IFsiY29kZVBvc3RhbCIsICJjb2RlX3Bvc3RhbCJdLAogICAgY2l0eUtleXM6IFsidmlsbGUiLCAiY2l0eSJdLAogICAgcHJlZmVycmVkUG9zdGFsS2V5OiAiY29kZV9wb3N0YWwiLAogICAgcHJlZmVycmVkQ2l0eUtleTogInZpbGxlIiwKICAgIHBvc3RhbEFsaWFzZXM6IFsiY29kZVBvc3RhbCIsICJjb2RlX3Bvc3RhbCJdLAogICAgY2l0eUFsaWFzZXM6IFsidmlsbGUiLCAiY2l0eSJdLAogICAgcHJlc2VydmVGbGFnS2V5OiAiZGVsaXZlcnlDaXR5Q2hvaWNlUHJlc2VydmVFeGlzdGluZyIsCiAgICBzdG9yZVN1ZmZpeCwKICB9KTsKCiAgcmV0dXJuIG91dDsKfQ=="
            }
        },
        {
            "path": "caisse-aqp/public/assets/js/ui/components/clientCard.js",
            "kind": "file",
            "before": {
                "exists": true,
                "kind": "file",
                "size": 66801,
                "sha1": "00d4e220ca797d75bd13987e87b7b98b1d8ca435",
                "content_b64": "LyogZG9jLXByb2plY3QgfCBjYWlzc2UtYXFwL3B1YmxpYy9hc3NldHMvanMvdWkvY29tcG9uZW50cy9jbGllbnRDYXJkLmpzIHwgR8OocmUgbOKAmWFmZmljaGFnZSBldCBsYSBtaXNlIMOgIGpvdXIgZGUgbGEgY2FydGUgY2xpZW50IGVuIFVJLCBhdmVjIMOpZGl0aW9uIGR1IHTDqWzDqXBob25lLCBwcsOpbm9tLCBhZHJlc3NlLCBwcm9ibMOobWUsIFN0b3AgU01TLCBwb2ludHMgZmlkw6lsaXTDqSwgc8OpbGVjdGlvbiBjb250cmFpbnRlIGTigJl1biBjb3VwbGUgY29kZSBwb3N0YWwgLyB2aWxsZSBhdXRvcmlzw6kgc2Vsb24gbGUgUERWLCBwcsOpcmVtcGxpc3NhZ2UgZHUgc8OpbGVjdGV1ciBjb21wb3NpdGUgZGVwdWlzIGxhIEJERCwgcHLDqWNvbnN0cnVjdGlvbiBleHBsaWNpdGUgZGUgbOKAmcOpdGF0IGxpdnJhaXNvbiBkw6hzIGzigJlpbXBvcnQgY2xpZW50IG3Dqm1lIHF1YW5kIGxhIHpvbmUgZXN0IG1hc3F1w6llLCBldCBhcHBsaWNhdGlvbiBleHBsaWNpdGUgZGUgbGEgdmFsZXVyIGluaXRpYWxlIGRlcyBzZWxlY3RzIGFwcsOocyBtb250YWdlIGRlIGxldXJzIG9wdGlvbnMgYWZpbiBxdWUgbOKAmWFjdGl2YXRpb24gdGFyZGl2ZSBkdSBzd2l0Y2ggbGl2cmFpc29uIHJldHJvdXZlIGJpZW4gbGEgcHLDqXPDqWxlY3Rpb24gYXR0ZW5kdWUuIENvbnNlcnZlIGF1c3NpIGxlcyB2YWxldXJzIGhpc3RvcmlxdWVzIGhvcnMgUERWIGNvdXJhbnQgdGFudCBxdeKAmWF1Y3VuZSBvcHRpb24gdmFsaWRlIG7igJllc3QgY2hvaXNpZSwgY29udHLDtGxlIG11dHVhbGlzw6kgZHUgdGVtcHMgZGUgdHJhamV0IGRlIGxpdnJhaXNvbiBwb3VyIGzigJlhZHJlc3NlIGNsaWVudCBldCBs4oCZYWRyZXNzZSBwcm92aXNvaXJlIGRlIGNvbW1hbmRlLCBldCByw6lpbmplY3RlIGF1dG9tYXRpcXVlbWVudCBs4oCZYWRyZXNzZSBjb3JyaWfDqWUgcmVudm95w6llIHBhciBs4oCZQVBJIGRlIHRyYWpldCBkYW5zIGxlIGZvcm11bGFpcmUgZXQgbGUgc3RhdGUgZnJvbnQsIHkgY29tcHJpcyBxdWFuZCBzZXVsZSBmdWxsX2FkZHJlc3MgY29udGllbnQgbGEgdnJhaWUgY29ycmVjdGlvbiwgZW4gcHLDqXNlcnZhbnQgZMOpc29ybWFpcyBleHBsaWNpdGVtZW50IGxlIG51bcOpcm8gZGUgdm9pZSBpbml0aWFsIHPigJlpbCBkaXNwYXJhw650IGRhbnMgbGEgY29ycmVjdGlvbiBhdXRvbWF0aXF1ZS4gQ29ycmlnZSBs4oCZw6lkaXRldXIgZmlkw6lsaXTDqSBwb3VyIHRyYXZhaWxsZXIgc3VyIGxlIHRvdGFsIHLDqWVsIGRlcyBwb2ludHMgZXQgbm9uIHN1ciBsZSBzb2xkZSBhZmZpY2jDqSBhcHLDqHMgcsOpc2VydmF0aW9ucyBmaWTDqWxpdMOpLiBMZXMgZmxvd3MgZGUgc2Fpc2llL2xvb2t1cCB0w6lsw6lwaG9uZSByZXN0ZW50IGTDqXNvcm1haXMgc3RyaWN0ZW1lbnQgbGltaXTDqXMgw6AgbOKAmWh5ZHJhdGF0aW9uIGNsaWVudCBldCBuZSB0b3VjaGVudCBqYW1haXMgYXV4IG1vZGVzIGNvdXBlL2xpdnJhaXNvbiwgbGFpc3PDqXMgw6AgbGEgcsOoZ2xlIG3DqXRpZXIgY2VudHJhbGlzw6llIGRlIGNyw6lhdGlvbi9yZXNldC9pbXBvcnQuIHwgRXhwb3NlOiBDbGllbnRDYXJkIHwgRMOpcGVuZCBkZTogLi4vZG9tLmpzLCAuLi9mb3JtYXQvcGhvbmUuanMsIC4uLy4uL2FwcC1qcy91dGlscy9waG9uZS9ub3JtYWxpemVQaG9uZS5qcywgLi4vLi4vYXBwLWpzL3V0aWxzL3Bob25lL3BhcnNlQW5kVmFsaWRhdGVQaG9uZS5qcywgLi4vLi4vc2VydmljZXMvYXBpL2NsaWVudExvb2t1cEFwaS5qcywgLi4vLi4vYXBwLWpzL3N0YXRlL2NsaWVudC5qcz90cz0yMDI2MDQwNS0yLCAuLi8uLi9hcHAtanMvb3JkZXJzL2V4aXN0aW5nT3JkZXJGbG93LmpzLCAuLi8uLi9hcHAtanMvZm9jdXMuanMsIC4uLy4uL2FwcC1qcy9waXp6YVNlYXJjaC5qcywgLi4vLi4vYXBwLWpzL3NlYXJjaC9zZWxlY3Rpb24uanMsIC4uLy4uL3NlcnZpY2VzL2FwaS9jbGllbnRVcGRhdGVMb3lhbHR5UG9pbnRzQXBpLmpzLCAuLi8uLi9zZXJ2aWNlcy9hcGkvY2xpZW50VXBkYXRlUHJvYmxlbWVBcGkuanMsIC4uLy4uL3NlcnZpY2VzL2FwaS9jbGllbnRVcGRhdGVTdG9wU21zQXBpLmpzLCAuLi8uLi9zZXJ2aWNlcy9hcGkvZGVsaXZlcnlUcmF2ZWxUaW1lQXBpLmpzP3RzPTIwMjYwNDA1LTEsIC4uLy4uL2FwcC1qcy9wZHYuanMsIC4uLy4uL2FwcC1qcy9hZGRyZXNzL2RlbGl2ZXJ5Q2l0eUNob2ljZXMuanM/dHM9MjAyNjA0MDUtMSwgLi4vLi4vYXBwLWpzL2FkZHJlc3MvZGVsaXZlcnlDaXR5U3RhdGVTeW5jLmpzP3RzPTIwMjYwNDA1LTEsIC4uLy4uL2FwcC1qcy9hZGRyZXNzL2RlbGl2ZXJ5VHJhdmVsQWRkcmVzc0NvcnJlY3Rpb24uanM/dHM9MjAyNjA0MDUtMSB8IEltcGFjdGU6IGludGVyZmFjZSB1dGlsaXNhdGV1ciwgYXBwZWxzIEFQSSBiYWNrZW5kLCDDqXRhdCBjbGllbnQgZW4gbcOpbW9pcmUsIMOpdGF0IGFkcmVzc2UgdGVtcG9yYWlyZSBkZSBjb21tYW5kZSwgcsOpc3VsdGF0cyBkZSBjb250csO0bGUgdHJhamV0LCBhdXRvLWNvcnJlY3Rpb24gZGVzIGFkcmVzc2VzIGRlIGxpdnJhaXNvbiwgc8OpbGVjdGlvbiBkZXMgY29tbXVuZXMgYXV0b3Jpc8OpZXMgcGFyIFBEViwgZm9jdXMgZGUgcmVjaGVyY2hlLCBub3RpZmljYXRpb25zIHRvYXN0LCBhYnNlbmNlIGTigJllZmZldCBkZSBib3JkIHN1ciBjb3VwZS9saXZyYWlzb24gbG9ycyBkZXMgbG9va3VwcyBjbGllbnQgfCBUYWJsZXM6IGNsaWVudHMoaWQsIHRlbGVwaG9uZSwgcHJlbm9tLCBhZHJlc3NlLCBjb21wbGVtZW50QWRyZXNzZSwgZXhwbGljYXRpb25zQWRyZXNzZSwgbnVtUGx1czEsIG51bVBsdXMyLCBjb2RlUG9zdGFsLCB2aWxsZSwgcHJvYmxlbWUsIHN0b3Bfc21zLCBwb2ludHNfZmlkX3RvdGFsLCBwb2ludHNfZmlkX2Rpc3BsYXksIGxveWFsdHlfdXNlZF9zZWxlY3RlZF9kYXkpICovCmltcG9ydCB7IGVsLCB0b2FzdCwgc3ZnSWNvbiwgbG95YWx0eVBvaW50c01vZGFsIH0gZnJvbSAiLi4vZG9tLmpzIjsKaW1wb3J0IHsgZm9ybWF0UGhvbmVGb3JEaXNwbGF5IH0gZnJvbSAiLi4vZm9ybWF0L3Bob25lLmpzIjsKaW1wb3J0IHsgbm9ybWFsaXplUGhvbmVGb3JEYiB9IGZyb20gIi4uLy4uL2FwcC1qcy91dGlscy9waG9uZS9ub3JtYWxpemVQaG9uZS5qcyI7CmltcG9ydCB7IHBhcnNlQW5kVmFsaWRhdGVQaG9uZSB9IGZyb20gIi4uLy4uL2FwcC1qcy91dGlscy9waG9uZS9wYXJzZUFuZFZhbGlkYXRlUGhvbmUuanMiOwppbXBvcnQgeyBmZXRjaENsaWVudEJ5UGhvbmUgfSBmcm9tICIuLi8uLi9zZXJ2aWNlcy9hcGkvY2xpZW50TG9va3VwQXBpLmpzIjsKaW1wb3J0IHsgYnVpbGRJbmplY3RlZENsaWVudEZyb21BcGksIHN5bmNJbmplY3RlZENsaWVudERlbGl2ZXJ5U3RhdGUgfSBmcm9tICIuLi8uLi9hcHAtanMvc3RhdGUvY2xpZW50LmpzP3RzPTIwMjYwNDA1LTIiOwppbXBvcnQgeyBlbnN1cmVOb0R1cGxpY2F0ZVRvZGF5T3JkZXIgfSBmcm9tICIuLi8uLi9hcHAtanMvb3JkZXJzL2V4aXN0aW5nT3JkZXJGbG93LmpzIjsKaW1wb3J0IHsgcmVxdWVzdFNlYXJjaEZvY3VzIH0gZnJvbSAiLi4vLi4vYXBwLWpzL2ZvY3VzLmpzIjsKaW1wb3J0IHsgY29tcHV0ZVBpenphUmVzdWx0cyB9IGZyb20gIi4uLy4uL2FwcC1qcy9waXp6YVNlYXJjaC5qcyI7CmltcG9ydCB7IGNsYW1wU2VsZWN0ZWRTZWFyY2hJbmRleCB9IGZyb20gIi4uLy4uL2FwcC1qcy9zZWFyY2gvc2VsZWN0aW9uLmpzIjsKaW1wb3J0IHsgdXBkYXRlQ2xpZW50TG95YWx0eVBvaW50cyB9IGZyb20gIi4uLy4uL3NlcnZpY2VzL2FwaS9jbGllbnRVcGRhdGVMb3lhbHR5UG9pbnRzQXBpLmpzIjsKaW1wb3J0IHsgdXBkYXRlQ2xpZW50UHJvYmxlbWUgfSBmcm9tICIuLi8uLi9zZXJ2aWNlcy9hcGkvY2xpZW50VXBkYXRlUHJvYmxlbWVBcGkuanMiOwppbXBvcnQgeyB1cGRhdGVDbGllbnRTdG9wU21zIH0gZnJvbSAiLi4vLi4vc2VydmljZXMvYXBpL2NsaWVudFVwZGF0ZVN0b3BTbXNBcGkuanMiOwppbXBvcnQgeyBjaGVja0RlbGl2ZXJ5VHJhdmVsVGltZSB9IGZyb20gIi4uLy4uL3NlcnZpY2VzL2FwaS9kZWxpdmVyeVRyYXZlbFRpbWVBcGkuanM/dHM9MjAyNjA0MDUtMSI7CmltcG9ydCB7IGdldFBEVkN1cnJlbnQsIHN0b3JlVG9TdWZmaXggfSBmcm9tICIuLi8uLi9hcHAtanMvcGR2LmpzIjsKaW1wb3J0IHsKICBnZXRBbGxvd2VkQ2hvaWNlcyBhcyBnZXRBbGxvd2VkRGVsaXZlcnlDaXR5Q2hvaWNlcywKICBidWlsZEFsbG93ZWRDaG9pY2VWYWx1ZSBhcyBidWlsZEFsbG93ZWREZWxpdmVyeUNpdHlDaG9pY2VWYWx1ZSwKICBmb3JtYXRDaG9pY2VMYWJlbCBhcyBmb3JtYXRBbGxvd2VkRGVsaXZlcnlDaXR5TGFiZWwsCn0gZnJvbSAiLi4vLi4vYXBwLWpzL2FkZHJlc3MvZGVsaXZlcnlDaXR5Q2hvaWNlcy5qcz90cz0yMDI2MDQwNS0xIjsKaW1wb3J0IHsgc3luY0RlbGl2ZXJ5QWRkcmVzc1NlbGVjdGlvbnMgfSBmcm9tICIuLi8uLi9hcHAtanMvYWRkcmVzcy9kZWxpdmVyeUNpdHlTdGF0ZVN5bmMuanM/dHM9MjAyNjA0MDUtMSI7CmltcG9ydCB7CiAgcmVzb2x2ZUNvcnJlY3RlZERlbGl2ZXJ5VHJhdmVsQWRkcmVzcywKICBpc0RlbGl2ZXJ5VHJhdmVsQWRkcmVzc0NvcnJlY3Rpb24sCiAgZm9ybWF0Tm9ybWFsaXplZERlbGl2ZXJ5VHJhdmVsQWRkcmVzc0xhYmVsLAp9IGZyb20gIi4uLy4uL2FwcC1qcy9hZGRyZXNzL2RlbGl2ZXJ5VHJhdmVsQWRkcmVzc0NvcnJlY3Rpb24uanM/dHM9MjAyNjA0MDUtMSI7CgovKioKICogW1JPTEVdIFVJIGNvbXBvbmVudDogbGVmdCBjb2x1bW4gY2xpZW50IGluZm9ybWF0aW9uIGNhcmQgKG1vY2sgaW5wdXRzKS4KICogW1VTRSBXSEVOXSBZb3UgbmVlZCB0byBhZGp1c3Qgd2hpY2ggZmllbGRzIHNob3cvaGlkZSBiYXNlZCBvbiBsaXZyYWlzb24gc3dpdGNoLgogKiBbSU5QVVRdIGNsaWVudCBvYmplY3QgKyBzdGF0ZS5saXZyYWlzb24gKGNvbnRyb2xzIGV4dHJhIGFkZHJlc3MgZmllbGRzKS4KICovCmZ1bmN0aW9uIGlzTm9uRW1wdHkodil7CiAgcmV0dXJuIFN0cmluZyh2ID8/ICIiKS50cmltKCkubGVuZ3RoID4gMDsKfQoKZnVuY3Rpb24gZ2V0Q3VycmVudFN0b3JlU3VmZml4KCl7CiAgdHJ5ewogICAgcmV0dXJuIHN0b3JlVG9TdWZmaXgoZ2V0UERWQ3VycmVudCgpKTsKICB9IGNhdGNoIChfZSl7CiAgICByZXR1cm4gImxhbiI7CiAgfQp9CgpmdW5jdGlvbiBnZXRBbGxvd2VkQ2l0eUNob2ljZU9wdGlvbnMoc3RvcmVTdWZmaXgpewogIHJldHVybiBnZXRBbGxvd2VkRGVsaXZlcnlDaXR5Q2hvaWNlcyhzdG9yZVN1ZmZpeCkubWFwKChyb3cpID0+ICh7CiAgICB2YWx1ZTogU3RyaW5nKHJvdy5jaG9pY2VWYWx1ZSB8fCAiIiksCiAgICBsYWJlbDogZm9ybWF0QWxsb3dlZERlbGl2ZXJ5Q2l0eUxhYmVsKHJvdyksCiAgfSkpOwp9CgpmdW5jdGlvbiBmaW5kQWxsb3dlZENpdHlDaG9pY2VCeVZhbHVlKHN0b3JlU3VmZml4LCB2YWx1ZSl7CiAgY29uc3QgdGFyZ2V0ID0gU3RyaW5nKHZhbHVlID8/ICIiKTsKICBjb25zdCByb3dzID0gZ2V0QWxsb3dlZERlbGl2ZXJ5Q2l0eUNob2ljZXMoc3RvcmVTdWZmaXgpOwogIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpewogICAgaWYgKFN0cmluZyhyb3c/LmNob2ljZVZhbHVlID8/ICIiKSA9PT0gdGFyZ2V0KSByZXR1cm4gcm93OwogIH0KICByZXR1cm4gbnVsbDsKfQoKZnVuY3Rpb24gZW5zdXJlRGVsaXZlcnlUcmF2ZWxDaGVja3Moc3RhdGUpewogIGlmICghc3RhdGUgfHwgdHlwZW9mIHN0YXRlICE9PSAib2JqZWN0IikgcmV0dXJuIHsgY2xpZW50OiB7fSwgdGVtcG9yYXJ5OiB7fSB9OwogIGlmICghc3RhdGUuZGVsaXZlcnlUcmF2ZWxDaGVja3MgfHwgdHlwZW9mIHN0YXRlLmRlbGl2ZXJ5VHJhdmVsQ2hlY2tzICE9PSAib2JqZWN0Iil7CiAgICBzdGF0ZS5kZWxpdmVyeVRyYXZlbENoZWNrcyA9IHt9OwogIH0KICBpZiAoIXN0YXRlLmRlbGl2ZXJ5VHJhdmVsQ2hlY2tzLmNsaWVudCB8fCB0eXBlb2Ygc3RhdGUuZGVsaXZlcnlUcmF2ZWxDaGVja3MuY2xpZW50ICE9PSAib2JqZWN0Iil7CiAgICBzdGF0ZS5kZWxpdmVyeVRyYXZlbENoZWNrcy5jbGllbnQgPSB7fTsKICB9CiAgaWYgKCFzdGF0ZS5kZWxpdmVyeVRyYXZlbENoZWNrcy50ZW1wb3JhcnkgfHwgdHlwZW9mIHN0YXRlLmRlbGl2ZXJ5VHJhdmVsQ2hlY2tzLnRlbXBvcmFyeSAhPT0gIm9iamVjdCIpewogICAgc3RhdGUuZGVsaXZlcnlUcmF2ZWxDaGVja3MudGVtcG9yYXJ5ID0ge307CiAgfQogIHJldHVybiBzdGF0ZS5kZWxpdmVyeVRyYXZlbENoZWNrczsKfQoKZnVuY3Rpb24gZ2V0RGVsaXZlcnlUcmF2ZWxDaGVja0VudHJ5KHN0YXRlLCBraW5kKXsKICBjb25zdCBiYWcgPSBlbnN1cmVEZWxpdmVyeVRyYXZlbENoZWNrcyhzdGF0ZSk7CiAgcmV0dXJuIGJhZ1traW5kID09PSAidGVtcG9yYXJ5IiA/ICJ0ZW1wb3JhcnkiIDogImNsaWVudCJdOwp9CgpmdW5jdGlvbiByZXNldERlbGl2ZXJ5VHJhdmVsQ2hlY2soc3RhdGUsIGtpbmQpewogIGNvbnN0IGVudHJ5ID0gZ2V0RGVsaXZlcnlUcmF2ZWxDaGVja0VudHJ5KHN0YXRlLCBraW5kKTsKICBlbnRyeS5wZW5kaW5nID0gZmFsc2U7CiAgZW50cnkub2sgPSBmYWxzZTsKICBlbnRyeS50b25lID0gIiI7CiAgZW50cnkubWVzc2FnZSA9ICIiOwogIGVudHJ5LmR1cmF0aW9uTGFiZWwgPSAiIjsKICBlbnRyeS5jaGVja2VkQXRTZWNvbmRzID0gMDsKICByZXR1cm4gZW50cnk7Cn0KCmZ1bmN0aW9uIGNsZWFyRGVsaXZlcnlUcmF2ZWxDaGVja0luQ2FyZChjYXJkUm9vdCwga2luZCl7CiAgaWYgKCFjYXJkUm9vdCkgcmV0dXJuOwogIGNvbnN0IHJlc3VsdCA9IGNhcmRSb290LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLXJvbGU9ImRlbGl2ZXJ5LXRyYXZlbC1jaGVjay1yZXN1bHQtJHtTdHJpbmcoa2luZCl9Il1gKTsKICBjb25zdCBidG4gPSBjYXJkUm9vdC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1yb2xlPSJkZWxpdmVyeS10cmF2ZWwtY2hlY2stYnRuLSR7U3RyaW5nKGtpbmQpfSJdYCk7CiAgaWYgKHJlc3VsdCl7CiAgICByZXN1bHQuaGlkZGVuID0gdHJ1ZTsKICAgIHJlc3VsdC50ZXh0Q29udGVudCA9ICIiOwogICAgdHJ5IHsgZGVsZXRlIHJlc3VsdC5kYXRhc2V0LnN0YXRlOyB9IGNhdGNoIChfZSkge30KICB9CiAgaWYgKGJ0bil7CiAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTsKICAgIGJ0bi50ZXh0Q29udGVudCA9ICJWw6lyaWZpZXIgbGUgdGVtcHMgZGUgdHJhamV0IjsKICB9Cn0KCmZ1bmN0aW9uIGludmFsaWRhdGVEZWxpdmVyeVRyYXZlbENoZWNrRnJvbUV2ZW50KGUsIHN0YXRlLCBraW5kKXsKICByZXNldERlbGl2ZXJ5VHJhdmVsQ2hlY2soc3RhdGUsIGtpbmQpOwogIHRyeXsKICAgIGNvbnN0IGNhcmRSb290ID0gZT8udGFyZ2V0Py5jbG9zZXN0Py4oIi5jYXJkIik7CiAgICBjbGVhckRlbGl2ZXJ5VHJhdmVsQ2hlY2tJbkNhcmQoY2FyZFJvb3QsIGtpbmQpOwogIH0gY2F0Y2ggKF9lKSB7fQp9CgpmdW5jdGlvbiBub3JtYWxpemVEZWxpdmVyeVRyYXZlbEFkZHJlc3MocmF3KXsKICBjb25zdCBzcmMgPSAocmF3ICYmIHR5cGVvZiByYXcgPT09ICJvYmplY3QiKSA/IHJhdyA6IHt9OwogIHJldHVybiB7CiAgICBhZHJlc3NlOiBTdHJpbmcoc3JjLmFkcmVzc2UgPz8gIiIpLnRyaW0oKSwKICAgIGNvbXBsZW1lbnRfYWRyZXNzZTogU3RyaW5nKHNyYy5jb21wbGVtZW50QWRyZXNzZSA/PyBzcmMuY29tcGxlbWVudF9hZHJlc3NlID8/ICIiKS50cmltKCksCiAgICBjb2RlX3Bvc3RhbDogU3RyaW5nKHNyYy5jb2RlUG9zdGFsID8/IHNyYy5jb2RlX3Bvc3RhbCA/PyAiIikudHJpbSgpLAogICAgdmlsbGU6IFN0cmluZyhzcmMudmlsbGUgPz8gIiIpLnRyaW0oKSwKICB9Owp9CgpmdW5jdGlvbiBpc0NvbXBsZXRlRGVsaXZlcnlUcmF2ZWxBZGRyZXNzKHJhdyl7CiAgY29uc3QgYSA9IG5vcm1hbGl6ZURlbGl2ZXJ5VHJhdmVsQWRkcmVzcyhyYXcpOwogIHJldHVybiAhIShhLmFkcmVzc2UgJiYgYS5jb2RlX3Bvc3RhbCAmJiBhLnZpbGxlKTsKfQoKZnVuY3Rpb24gZm9ybWF0RGVsaXZlcnlUcmF2ZWxEdXJhdGlvbihyZXN1bHQpewogIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLm1heCgwLCBOdW1iZXIocmVzdWx0Py5kdXJhdGlvbl9taW51dGVzX3JvdW5kZWQgPz8gcmVzdWx0Py5kdXJhdGlvbk1pbnV0ZXNSb3VuZGVkID8/IDApIHx8IDApOwogIGlmICghbWludXRlcykgcmV0dXJuICIiOwogIHJldHVybiBgRHVyw6llIGR1IHRyYWpldCA6ICR7bWludXRlc30gbWluYDsKfQoKZnVuY3Rpb24gdGVtcG9yYXJ5RGVsaXZlcnlGaWVsZCh7IGtleSwgcGxhY2Vob2xkZXIsIHZhbHVlLCBzdGF0ZSB9ID0ge30pewogIGNvbnN0IGhhc1ZhbHVlID0gU3RyaW5nKHZhbHVlID8/ICIiKS50cmltKCkubGVuZ3RoID4gMDsKICByZXR1cm4gZWwoImRpdiIsIHsgY2xhc3M6IGBmaWVsZCR7aGFzVmFsdWUgPyAiIiA6ICIgZmllbGQtLWVtcHR5In1gIH0sIFsKICAgIGVsKCJpbnB1dCIsIHsKICAgICAgY2xhc3M6ICJpbnB1dCBpbnB1dC0tcGxhY2Vob2xkZXItbGciLAogICAgICB2YWx1ZTogU3RyaW5nKHZhbHVlID8/ICIiKSwKICAgICAgcGxhY2Vob2xkZXI6IFN0cmluZyhwbGFjZWhvbGRlciA/PyAiIiksCiAgICAgIGRhdGFzZXQ6IHsgZmllbGRLZXk6IFN0cmluZyhrZXkgPz8gIiIpIH0sCiAgICAgIG9uSW5wdXQ6IChlKSA9PiB7CiAgICAgICAgY29uc3QgdiA9IGU/LnRhcmdldD8udmFsdWUgPz8gIiI7CiAgICAgICAgaWYgKCFzdGF0ZSB8fCB0eXBlb2Ygc3RhdGUgIT09ICJvYmplY3QiKSByZXR1cm47CiAgICAgICAgaWYgKCFzdGF0ZS50ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MgfHwgdHlwZW9mIHN0YXRlLnRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcyAhPT0gIm9iamVjdCIpewogICAgICAgICAgc3RhdGUudGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzID0geyBlbmFibGVkOiB0cnVlIH07CiAgICAgICAgfQogICAgICAgIHN0YXRlLnRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzc1trZXldID0gU3RyaW5nKHYpOwogICAgICAgIHRyeXsKICAgICAgICAgIGNvbnN0IGlucCA9IGU/LnRhcmdldDsKICAgICAgICAgIGNvbnN0IGZpZWxkUm9vdCA9IGlucD8uY2xvc2VzdD8uKCIuZmllbGQiKSB8fCBpbnA/LnBhcmVudEVsZW1lbnQ7CiAgICAgICAgICBpZiAoZmllbGRSb290KSBmaWVsZFJvb3QuY2xhc3NMaXN0LnRvZ2dsZSgiZmllbGQtLWVtcHR5IiwgIWlzTm9uRW1wdHkodikpOwogICAgICAgIH0gY2F0Y2ggKF9lKSB7fQogICAgICAgIGlmIChbImFkcmVzc2UiLCAiY29tcGxlbWVudEFkcmVzc2UiLCAiY29kZVBvc3RhbCIsICJ2aWxsZSJdLmluY2x1ZGVzKFN0cmluZyhrZXkgPz8gIiIpKSl7CiAgICAgICAgICBpbnZhbGlkYXRlRGVsaXZlcnlUcmF2ZWxDaGVja0Zyb21FdmVudChlLCBzdGF0ZSwgInRlbXBvcmFyeSIpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgImFyaWEtbGFiZWwiOiBTdHJpbmcocGxhY2Vob2xkZXIgPz8gIiIpLAogICAgfSksCiAgXSk7Cn0KCmZ1bmN0aW9uIHNlbGVjdEZpZWxkKHsga2V5LCBwbGFjZWhvbGRlciwgdmFsdWUsIG9wdGlvbnMsIG9uQ2hhbmdlLCBpbnZhbGlkYXRlVHJhdmVsQ2hlY2tLaW5kLCBzdGF0ZSB9ID0ge30pewogIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IFN0cmluZyh2YWx1ZSA/PyAiIik7CiAgY29uc3QgaXRlbXMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMpID8gb3B0aW9ucyA6IFtdOwogIGNvbnN0IHNlbGVjdEVsID0gZWwoInNlbGVjdCIsIHsKICAgIGNsYXNzOiAiaW5wdXQgaW5wdXQtLXBsYWNlaG9sZGVyLWxnIiwKICAgIGRhdGFzZXQ6IHsgZmllbGRLZXk6IFN0cmluZyhrZXkgPz8gIiIpIH0sCiAgICAiYXJpYS1sYWJlbCI6IFN0cmluZyhwbGFjZWhvbGRlciA/PyAiIiksCiAgICBvbkNoYW5nZTogKGUpID0+IHsKICAgICAgY29uc3QgbmV4dCA9IFN0cmluZyhlPy50YXJnZXQ/LnZhbHVlID8/ICIiKTsKICAgICAgaWYgKHR5cGVvZiBvbkNoYW5nZSA9PT0gImZ1bmN0aW9uIil7CiAgICAgICAgb25DaGFuZ2UobmV4dCwgZT8udGFyZ2V0IHx8IG51bGwpOwogICAgICB9CiAgICAgIHRyeXsKICAgICAgICBjb25zdCBpbnAgPSBlPy50YXJnZXQ7CiAgICAgICAgY29uc3QgZmllbGRSb290ID0gaW5wPy5jbG9zZXN0Py4oIi5maWVsZCIpIHx8IGlucD8ucGFyZW50RWxlbWVudDsKICAgICAgICBpZiAoZmllbGRSb290KSBmaWVsZFJvb3QuY2xhc3NMaXN0LnRvZ2dsZSgiZmllbGQtLWVtcHR5IiwgIWlzTm9uRW1wdHkobmV4dCkpOwogICAgICB9IGNhdGNoIChfZSkge30KICAgICAgaWYgKGludmFsaWRhdGVUcmF2ZWxDaGVja0tpbmQpewogICAgICAgIGludmFsaWRhdGVEZWxpdmVyeVRyYXZlbENoZWNrRnJvbUV2ZW50KGUsIHN0YXRlLCBpbnZhbGlkYXRlVHJhdmVsQ2hlY2tLaW5kKTsKICAgICAgfQogICAgfSwKICB9LCBbCiAgICBlbCgib3B0aW9uIiwgeyB2YWx1ZTogIiIgfSwgU3RyaW5nKHBsYWNlaG9sZGVyID8/ICIiKSksCiAgICAuLi5pdGVtcy5tYXAoKHJvdykgPT4gZWwoIm9wdGlvbiIsIHsgdmFsdWU6IFN0cmluZyhyb3c/LnZhbHVlID8/ICIiKSB9LCBTdHJpbmcocm93Py5sYWJlbCA/PyAiIikpKSwKICBdKTsKCiAgdHJ5ewogICAgLy8gSW1wb3J0YW50OiBhcHBseSB0aGUgaW5pdGlhbCB2YWx1ZSBvbmx5IGFmdGVyIG9wdGlvbnMgZXhpc3QuCiAgICAvLyBPdGhlcndpc2UgYSBoaWRkZW4gZGVsaXZlcnkgc2VsZWN0IGNhbiBzdGF5IHZpc3VhbGx5IGVtcHR5IHdoZW4gc2hvd24gbGF0ZXIuCiAgICBzZWxlY3RFbC52YWx1ZSA9IGN1cnJlbnRWYWx1ZTsKICAgIGlmIChTdHJpbmcoc2VsZWN0RWwudmFsdWUgPz8gIiIpICE9PSBjdXJyZW50VmFsdWUpewogICAgICBzZWxlY3RFbC52YWx1ZSA9ICIiOwogICAgfQogIH0gY2F0Y2ggKF9lKSB7fQoKICBjb25zdCBhcHBsaWVkVmFsdWUgPSBTdHJpbmcoc2VsZWN0RWw/LnZhbHVlID8/ICIiKTsKICByZXR1cm4gZWwoImRpdiIsIHsgY2xhc3M6IGBmaWVsZCR7aXNOb25FbXB0eShhcHBsaWVkVmFsdWUpID8gIiIgOiAiIGZpZWxkLS1lbXB0eSJ9YCB9LCBbCiAgICBzZWxlY3RFbCwKICBdKTsKfQoKZnVuY3Rpb24gbm9ybWFsaXplRm9yTWF0Y2gocyl7CiAgY29uc3QgcmF3ID0gU3RyaW5nKHMgPz8gIiIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwogIGlmICghcmF3KSByZXR1cm4gIiI7CiAgLy8gQWNjZW50LWluc2Vuc2l0aXZlIG1hdGNoIHdoZW4gc3VwcG9ydGVkCiAgdHJ5ewogICAgcmV0dXJuIHJhdy5ub3JtYWxpemUoIk5GRCIpLnJlcGxhY2UoL1tcdTAzMDAtXHUwMzZmXS9nLCAiIik7CiAgfSBjYXRjaCAoX2UpewogICAgcmV0dXJuIHJhdzsKICB9Cn0KCmZ1bmN0aW9uIGZpbHRlckZpcnN0TmFtZXMoeyBsaXN0LCBxdWVyeSwgbGltaXQgPSAxMCB9ID0ge30pewogIGNvbnN0IHEgPSBub3JtYWxpemVGb3JNYXRjaChxdWVyeSk7CiAgaWYgKCFxIHx8IHEubGVuZ3RoIDwgMikgcmV0dXJuIFtdOwogIGNvbnN0IG91dCA9IFtdOwogIGNvbnN0IHNlZW4gPSBuZXcgU2V0KCk7CiAgY29uc3QgYXJyID0gQXJyYXkuaXNBcnJheShsaXN0KSA/IGxpc3QgOiBbXTsKICBmb3IgKGNvbnN0IHYgb2YgYXJyKXsKICAgIGNvbnN0IHMgPSBTdHJpbmcodiA/PyAiIikudHJpbSgpOwogICAgaWYgKCFzKSBjb250aW51ZTsKICAgIGNvbnN0IGtleSA9IG5vcm1hbGl6ZUZvck1hdGNoKHMpOwogICAgaWYgKCFrZXkpIGNvbnRpbnVlOwogICAgaWYgKCFrZXkuc3RhcnRzV2l0aChxKSkgY29udGludWU7CiAgICBpZiAoc2Vlbi5oYXMoa2V5KSkgY29udGludWU7CiAgICBzZWVuLmFkZChrZXkpOwogICAgb3V0LnB1c2gocyk7CiAgICBpZiAob3V0Lmxlbmd0aCA+PSBsaW1pdCkgYnJlYWs7CiAgfQogIHJldHVybiBvdXQ7Cn0KCmZ1bmN0aW9uIHNldFByb2JsZW1lQXR0ZW50aW9uKGNhcmRSb290LCByYXdWYWx1ZSl7CiAgaWYgKCFjYXJkUm9vdCkgcmV0dXJuOwogIGNvbnN0IGlucCA9IGNhcmRSb290LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W2RhdGEtZmllbGQta2V5PSJwcm9ibGVtZSJdJyk7CiAgaWYgKCFpbnApIHJldHVybjsKICBjb25zdCBmaWVsZFJvb3QgPSBpbnAuY2xvc2VzdCgiLmZpZWxkIikgfHwgaW5wLnBhcmVudEVsZW1lbnQ7CiAgaWYgKCFmaWVsZFJvb3QpIHJldHVybjsKICBjb25zdCBvbiA9IGlzTm9uRW1wdHkocmF3VmFsdWUpOwogIHRyeSB7IGZpZWxkUm9vdC5jbGFzc0xpc3QudG9nZ2xlKCJmaWVsZC0tcHJvYmxlbWUtYWxlcnQiLCBvbik7IH0gY2F0Y2ggKGUpIHt9CiAgdHJ5IHsgaW5wLnNldEF0dHJpYnV0ZSgiYXJpYS1pbnZhbGlkIiwgb24gPyAidHJ1ZSIgOiAiZmFsc2UiKTsgfSBjYXRjaCAoZSkge30KICAvLyBIZWxwZnVsIGZvciBzY3JlZW4tcmVhZGVycyAvIFFBIGluc3BlY3Rpb24KICB0cnkgeyBpbnAuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIiwgb24gPyAiUHJvYmzDqG1lICjDoCBsaXJlKSIgOiAiUHJvYmzDqG1lIik7IH0gY2F0Y2ggKGUpIHt9Cn0KCmZ1bmN0aW9uIHJlYWRTdG9wU21zVmFsdWUoYW55Q2xpZW50KXsKICBjb25zdCBjID0gKGFueUNsaWVudCAmJiB0eXBlb2YgYW55Q2xpZW50ID09PSAib2JqZWN0IikgPyBhbnlDbGllbnQgOiB7fTsKICAvLyBBY2NlcHQgYm90aCBzbmFrZV9jYXNlIGFuZCBjYW1lbENhc2UgKGRlZmVuc2l2ZSkuCiAgY29uc3QgcmF3ID0gKGMuc3RvcFNtcyAhPSBudWxsKSA/IGMuc3RvcFNtcyA6IGMuc3RvcF9zbXM7CiAgaWYgKHJhdyA9PT0gdHJ1ZSB8fCByYXcgPT09IDEgfHwgcmF3ID09PSAiMSIpIHJldHVybiAxOwogIHJldHVybiAwOwp9CgpmdW5jdGlvbiBnZXRTbXNTd2l0Y2hWaXN1YWxTdGF0ZShhbnlDbGllbnQpewogIGNvbnN0IGMgPSAoYW55Q2xpZW50ICYmIHR5cGVvZiBhbnlDbGllbnQgPT09ICJvYmplY3QiKSA/IGFueUNsaWVudCA6IHt9OwogIGNvbnN0IGNpZCA9IE51bWJlcihjPy5pZCk7CiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoY2lkKSB8fCBjaWQgPD0gMCkgcmV0dXJuICJuZXV0cmFsIjsgLy8gbWlkZGxlIChpZCBub3QgbG9hZGVkKQogIHJldHVybiAwOwp9CgpmdW5jdGlvbiBzZXRDYXJkRmllbGRWYWx1ZShjYXJkUm9vdCwga2V5LCB2YWx1ZSl7CiAgaWYgKCFjYXJkUm9vdCkgcmV0dXJuOwogIGNvbnN0IGlucHV0ID0gY2FyZFJvb3QucXVlcnlTZWxlY3RvcihgW2RhdGEtZmllbGQta2V5PSIke1N0cmluZyhrZXkpfSJdYCk7CiAgaWYgKCFpbnB1dCkgcmV0dXJuOwogIHRyeSB7IGlucHV0LnZhbHVlID0gU3RyaW5nKHZhbHVlID8/ICIiKTsgfSBjYXRjaCAoX2UpIHt9CiAgdHJ5ewogICAgY29uc3QgZmllbGRSb290ID0gaW5wdXQuY2xvc2VzdCgiLmZpZWxkIikgfHwgaW5wdXQucGFyZW50RWxlbWVudDsKICAgIGlmIChmaWVsZFJvb3QpIGZpZWxkUm9vdC5jbGFzc0xpc3QudG9nZ2xlKCJmaWVsZC0tZW1wdHkiLCAhaXNOb25FbXB0eShpbnB1dC52YWx1ZSkpOwogIH0gY2F0Y2ggKF9lKSB7fQp9CgpmdW5jdGlvbiBzZXRTdG9wU21zU3dpdGNoKGNhcmRSb290LCB2aXN1YWxTdGF0ZSl7CiAgaWYgKCFjYXJkUm9vdCkgcmV0dXJuOwogIGNvbnN0IHN3ID0gY2FyZFJvb3QucXVlcnlTZWxlY3RvcignW2RhdGEtcm9sZT0ic3RvcC1zbXMtc3dpdGNoIl0nKTsKICBpZiAoIXN3KSByZXR1cm47CiAgY29uc3Qgc3QgPSBTdHJpbmcodmlzdWFsU3RhdGUgPz8gIiIpLnRyaW0oKSB8fCAibmV1dHJhbCI7CiAgY29uc3QgaXNOZXV0cmFsID0gKHN0ID09PSAibmV1dHJhbCIpOwogIGNvbnN0IGlzUmVmdXNlZCA9IChzdCA9PT0gInJlZnVzZWQiKTsKICB0cnl7CiAgICBzdy5kYXRhc2V0LnN0YXRlID0gc3Q7IC8vIGFjY2VwdGVkIHwgbmV1dHJhbCB8IHJlZnVzZWQKICAgIHN3LnNldEF0dHJpYnV0ZSgiYXJpYS1jaGVja2VkIiwgaXNOZXV0cmFsID8gIm1peGVkIiA6IChpc1JlZnVzZWQgPyAidHJ1ZSIgOiAiZmFsc2UiKSk7CiAgICBzdy5zZXRBdHRyaWJ1dGUoImFyaWEtZGlzYWJsZWQiLCBpc05ldXRyYWwgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKICAgIC8vIFByZXZlbnQgaW50ZXJhY3Rpb24gaW4gbmV1dHJhbCBzdGF0ZSAobWlkZGxlIGNhbm5vdCBiZSB1c2VyLXNlbGVjdGVkKQogICAgc3cuZGlzYWJsZWQgPSBpc05ldXRyYWw7CiAgfSBjYXRjaCAoZSkge30KfQoKZnVuY3Rpb24gc3RvcFNtc1RvYXN0TWVzc2FnZUZyb21BcHBsaWVkKGFwcGxpZWQpewogIC8vIGFwcGxpZWQ6IDB8MSAoMCA9IGFjY2VwdGVkL3JlY2VpdmVzIFNNUywgMSA9IHJlZnVzZWQvc3RvcCBTTVMpCiAgY29uc3QgdiA9IChhcHBsaWVkID09PSAxIHx8IGFwcGxpZWQgPT09ICIxIiB8fCBhcHBsaWVkID09PSB0cnVlKSA/IDEgOiAwOwogIHJldHVybiB2ID09PSAxCiAgICA/ICJMZSBjbGllbnQgbmUgcmVjZXZyYSBwbHVzIGRlIFNNUyIKICAgIDogIkxlIGNsaWVudCByZWNldnJhIGxlcyBTTVMiOwp9CgpmdW5jdGlvbiBzdG9wU21zUm93KHsgc3RhdGUsIGNhcmRSb290IH0gPSB7fSl7CiAgY29uc3QgaW5pdFN0YXRlID0gZ2V0U21zU3dpdGNoVmlzdWFsU3RhdGUoc3RhdGU/LmNsaWVudCk7CiAgY29uc3Qgc3cgPSBlbCgiYnV0dG9uIiwgewogICAgdHlwZTogImJ1dHRvbiIsCiAgICBjbGFzczogInN3aXRjaCBzbXMtc3dpdGNoIiwKICAgIGRhdGFzZXQ6IHsgcm9sZTogInN0b3Atc21zLXN3aXRjaCIsIGtpbmQ6ICJzdG9wX3NtcyIgfSwKICAgIHJvbGU6ICJzd2l0Y2giLAogICAgImFyaWEtbGFiZWwiOiAiU3RvcCBTTVMiLAogICAgImFyaWEtY2hlY2tlZCI6IChpbml0U3RhdGUgPT09ICJuZXV0cmFsIikgPyAibWl4ZWQiIDogKChpbml0U3RhdGUgPT09ICJyZWZ1c2VkIikgPyAidHJ1ZSIgOiAiZmFsc2UiKSwKICAgICJhcmlhLWRpc2FibGVkIjogKGluaXRTdGF0ZSA9PT0gIm5ldXRyYWwiKSA/ICJ0cnVlIiA6ICJmYWxzZSIsCiAgICBkaXNhYmxlZDogKGluaXRTdGF0ZSA9PT0gIm5ldXRyYWwiKSwKICAgICJkYXRhLXN0YXRlIjogaW5pdFN0YXRlLAogICAgb25DbGljazogYXN5bmMgKGUpID0+IHsKICAgICAgdHJ5IHsgZT8ucHJldmVudERlZmF1bHQ/LigpOyB9IGNhdGNoIChfZSkge30KICAgICAgaWYgKCFzdGF0ZSB8fCB0eXBlb2Ygc3RhdGUgIT09ICJvYmplY3QiKSByZXR1cm47CiAgICAgIGlmICghc3RhdGUuY2xpZW50IHx8IHR5cGVvZiBzdGF0ZS5jbGllbnQgIT09ICJvYmplY3QiKSBzdGF0ZS5jbGllbnQgPSB7fTsKCiAgICAgIGNvbnN0IGxhdGVzdENsaWVudCA9IHN0YXRlLmNsaWVudDsKICAgICAgY29uc3QgY2lkID0gTnVtYmVyKGxhdGVzdENsaWVudD8uaWQpOwogICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShjaWQpIHx8IGNpZCA8PSAwKXsKICAgICAgICAvLyBOZXV0cmFsIHN0YXRlIGlzIG5vdCB1c2VyLXNlbGVjdGFibGUuCiAgICAgICAgdHJ5IHsgc2V0U3RvcFNtc1N3aXRjaChjYXJkUm9vdCwgIm5ldXRyYWwiKTsgfSBjYXRjaCAoX2UyKSB7fQogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgY29uc3QgcHJldiA9IHJlYWRTdG9wU21zVmFsdWUobGF0ZXN0Q2xpZW50KTsKICAgICAgY29uc3QgbmV4dCA9IHByZXYgPyAwIDogMTsKCiAgICAgIC8vIE9wdGltaXN0aWMgVUkgKyBzdGF0ZQogICAgICBsYXRlc3RDbGllbnQuc3RvcFNtcyA9IG5leHQ7CiAgICAgIHNldFN0b3BTbXNTd2l0Y2goY2FyZFJvb3QsIGdldFNtc1N3aXRjaFZpc3VhbFN0YXRlKGxhdGVzdENsaWVudCkpOwoKICAgICAgLy8gRGlzYWJsZSBkdXJpbmcgc2F2ZSB0byBwcmV2ZW50IGRvdWJsZSB0b2dnbGVzCiAgICAgIHRyeXsKICAgICAgICBzdy5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgc3cuc2V0QXR0cmlidXRlKCJhcmlhLWJ1c3kiLCAidHJ1ZSIpOwogICAgICB9IGNhdGNoIChlMykge30KCiAgICAgIHRyeXsKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB1cGRhdGVDbGllbnRTdG9wU21zKHsgY2xpZW50SWQ6IGNpZCwgc3RvcFNtczogbmV4dCB9KTsKICAgICAgICBpZiAoIXJlcz8ub2spewogICAgICAgICAgLy8gUmV2ZXJ0IG9uIGVycm9yCiAgICAgICAgICBsYXRlc3RDbGllbnQuc3RvcFNtcyA9IHByZXY7CiAgICAgICAgICBzZXRTdG9wU21zU3dpdGNoKGNhcmRSb290LCBnZXRTbXNTd2l0Y2hWaXN1YWxTdGF0ZShsYXRlc3RDbGllbnQpKTsKICAgICAgICAgIHRyeSB7IHRvYXN0KHJlcz8uZXJyb3IgfHwgIkltcG9zc2libGUgZGUgbWV0dHJlIMOgIGpvdXIgU3RvcCBTTVMiLCB7IGFuY2hvckVsOiBzdywgcGxhY2VtZW50OiAidG9wIiB9KTsgfSBjYXRjaCAoZTQpIHt9CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8vIEVuc3VyZSBzdGF0ZSBtYXRjaGVzIGJhY2tlbmQgcmVzcG9uc2UKICAgICAgICBjb25zdCBhcHBsaWVkID0gKHJlcy5zdG9wX3NtcyA9PT0gMSB8fCByZXMuc3RvcF9zbXMgPT09ICIxIiB8fCByZXMuc3RvcF9zbXMgPT09IHRydWUpID8gMSA6IDA7CiAgICAgICAgbGF0ZXN0Q2xpZW50LnN0b3BTbXMgPSBhcHBsaWVkOwogICAgICAgIHNldFN0b3BTbXNTd2l0Y2goY2FyZFJvb3QsIGdldFNtc1N3aXRjaFZpc3VhbFN0YXRlKGxhdGVzdENsaWVudCkpOwogICAgICAgIC8vIFN1Y2Nlc3MgVVggcmVxdWlyZW1lbnQ6CiAgICAgICAgLy8gLSBHbG9iYWwgdG9hc3QgYm90dG9tLWNlbnRlcmVkIChubyBhbmNob3JFbCAvIHBsYWNlbWVudCkKICAgICAgICAvLyAtIER5bmFtaWMgbWVzc2FnZSBiYXNlZCBvbiBmaW5hbCBhcHBsaWVkIHN0YXRlCiAgICAgICAgdHJ5IHsgdG9hc3Qoc3RvcFNtc1RvYXN0TWVzc2FnZUZyb21BcHBsaWVkKGFwcGxpZWQpKTsgfSBjYXRjaCAoZTUpIHt9CiAgICAgIH0gY2F0Y2ggKGVycil7CiAgICAgICAgLy8gUmV2ZXJ0IG9uIG5ldHdvcmsgZXJyb3IKICAgICAgICBsYXRlc3RDbGllbnQuc3RvcFNtcyA9IHByZXY7CiAgICAgICAgc2V0U3RvcFNtc1N3aXRjaChjYXJkUm9vdCwgZ2V0U21zU3dpdGNoVmlzdWFsU3RhdGUobGF0ZXN0Q2xpZW50KSk7CiAgICAgICAgdHJ5IHsgdG9hc3QoIkVycmV1ciByw6lzZWF1IChTdG9wIFNNUykiLCB7IGFuY2hvckVsOiBzdywgcGxhY2VtZW50OiAidG9wIiB9KTsgfSBjYXRjaCAoZTYpIHt9CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgdHJ5ewogICAgICAgICAgLy8gUmVzdG9yZSBlbmFibGVkL2Rpc2FibGVkIGJhc2VkIG9uIGN1cnJlbnQgdmlzdWFsIHN0YXRlLgogICAgICAgICAgY29uc3QgdnMgPSBnZXRTbXNTd2l0Y2hWaXN1YWxTdGF0ZShsYXRlc3RDbGllbnQpOwogICAgICAgICAgc3cuZGlzYWJsZWQgPSAodnMgPT09ICJuZXV0cmFsIik7CiAgICAgICAgICBzdy5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtYnVzeSIpOwogICAgICAgIH0gY2F0Y2ggKGU3KSB7fQogICAgICB9CiAgICB9LAogIH0sIFsKICAgIGVsKCJzcGFuIiwgeyBjbGFzczogInN3aXRjaF9fa25vYiIgfSksCiAgXSk7CgogIHJldHVybiBlbCgiZGl2Iiwge30sIFsKICAgIGVsKCJkaXYiLCB7IGNsYXNzOiAic3dpdGNoLXJvdyIgfSwgWwogICAgICBlbCgiZGl2IiwgeyBjbGFzczogIm5hbWUiIH0sICJTdG9wIFNNUyIpLAogICAgICBzdywKICAgIF0pLAogIF0pOwp9CgpmdW5jdGlvbiBwcm9ibGVtZUZpZWxkV2l0aFNhdmUoeyBwbGFjZWhvbGRlciwgdmFsdWUsIHN0YXRlLCBvblNhdmUgfSA9IHt9KXsKICBjb25zdCBoYXNWYWx1ZSA9IFN0cmluZyh2YWx1ZSA/PyAiIikudHJpbSgpLmxlbmd0aCA+IDA7CiAgY29uc3Qgd3JhcCA9IGVsKCJkaXYiLCB7IGNsYXNzOiBgZmllbGQgZmllbGQtLXByb2JsZW1lJHtoYXNWYWx1ZSA/ICIiIDogIiBmaWVsZC0tZW1wdHkifWAgfSwgWwogICAgLy8gU2luZ2xlIGZpZWxkOiBpbnB1dCArIGludGVncmF0ZWQgcmlnaHQgYWN0aW9uIChiZXR0ZXIgYWVzdGhldGljcykuCiAgICBlbCgiZGl2IiwgeyBjbGFzczogImZpZWxkX19pbmJ0biBmaWVsZF9faW5idG4tLW9rIiB9LCBbCiAgICAgIGVsKCJpbnB1dCIsIHsKICAgICAgICBjbGFzczogImlucHV0IGlucHV0LS1wbGFjZWhvbGRlci1sZyBmaWVsZF9faW5idG4taW5wdXQiLAogICAgICAgIHZhbHVlOiBTdHJpbmcodmFsdWUgPz8gIiIpLAogICAgICAgIHBsYWNlaG9sZGVyOiBTdHJpbmcocGxhY2Vob2xkZXIgPz8gIiIpLAogICAgICAgIGRhdGFzZXQ6IHsgZmllbGRLZXk6ICJwcm9ibGVtZSIgfSwKICAgICAgICAiYXJpYS1sYWJlbCI6IFN0cmluZyhwbGFjZWhvbGRlciA/PyAiIiksCiAgICAgICAgb25JbnB1dDogKGUpID0+IHsKICAgICAgICAgIGNvbnN0IHYgPSBlPy50YXJnZXQ/LnZhbHVlID8/ICIiOwogICAgICAgICAgaWYgKCFzdGF0ZSB8fCB0eXBlb2Ygc3RhdGUgIT09ICJvYmplY3QiKSByZXR1cm47CiAgICAgICAgICBpZiAoIXN0YXRlLmNsaWVudCB8fCB0eXBlb2Ygc3RhdGUuY2xpZW50ICE9PSAib2JqZWN0Iikgc3RhdGUuY2xpZW50ID0ge307CiAgICAgICAgICBzdGF0ZS5jbGllbnQucHJvYmxlbWUgPSBTdHJpbmcodik7CiAgICAgICAgICAvLyBLZWVwIGVtcHR5L25vbi1lbXB0eSB2aXN1YWwgc3RhdGUgaW4gc3luYyB3aXRob3V0IGEgZnVsbCByZS1yZW5kZXIuCiAgICAgICAgICB0cnl7CiAgICAgICAgICAgIGNvbnN0IGlucCA9IGU/LnRhcmdldDsKICAgICAgICAgICAgY29uc3QgZmllbGRSb290ID0gaW5wPy5jbG9zZXN0Py4oIi5maWVsZCIpIHx8IGlucD8ucGFyZW50RWxlbWVudDsKICAgICAgICAgICAgaWYgKGZpZWxkUm9vdCkgZmllbGRSb290LmNsYXNzTGlzdC50b2dnbGUoImZpZWxkLS1lbXB0eSIsICFpc05vbkVtcHR5KHYpKTsKICAgICAgICAgIH0gY2F0Y2ggKGUzKSB7fQogICAgICAgICAgLy8gRW5zdXJlIGF0dGVudGlvbiBzdHlsaW5nIHN0YXlzIGluIHN5bmMuCiAgICAgICAgICB0cnl7CiAgICAgICAgICAgIGNvbnN0IGNhcmRSb290ID0gZT8udGFyZ2V0Py5jbG9zZXN0Py4oIi5jYXJkIik7CiAgICAgICAgICAgIHNldFByb2JsZW1lQXR0ZW50aW9uKGNhcmRSb290LCB2KTsKICAgICAgICAgIH0gY2F0Y2ggKGUyKSB7fQogICAgICAgIH0sCiAgICAgIH0pLAogICAgICBlbCgiYnV0dG9uIiwgewogICAgICAgIHR5cGU6ICJidXR0b24iLAogICAgICAgIGNsYXNzOiAiZmllbGRfX2luYnRuLWJ0biBmaWVsZF9faW5idG4tYnRuLS1vayIsCiAgICAgICAgdGl0bGU6ICJNZXR0cmUgw6Agam91ciBQcm9ibMOobWUiLAogICAgICAgICJhcmlhLWxhYmVsIjogIk1ldHRyZSDDoCBqb3VyIFByb2Jsw6htZSIsCiAgICAgICAgb25DbGljazogYXN5bmMgKGUpID0+IHsKICAgICAgICAgIHRyeSB7IGU/LnByZXZlbnREZWZhdWx0Py4oKTsgfSBjYXRjaCAoX2UpIHt9CiAgICAgICAgICBpZiAodHlwZW9mIG9uU2F2ZSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICB0cnkgeyBhd2FpdCBvblNhdmUoZT8uY3VycmVudFRhcmdldCB8fCBudWxsKTsgfSBjYXRjaCAoX2UyKSB7fQogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgIH0sICJPSyIpLAogICAgXSksCiAgXSk7CiAgcmV0dXJuIHdyYXA7Cn0KCmZ1bmN0aW9uIGZpZWxkKHsga2V5LCBwbGFjZWhvbGRlciwgdmFsdWUsIHN0YXRlIH0gPSB7fSl7CiAgY29uc3QgaGFzVmFsdWUgPSBTdHJpbmcodmFsdWUgPz8gIiIpLnRyaW0oKS5sZW5ndGggPiAwOwogIHJldHVybiBlbCgiZGl2IiwgeyBjbGFzczogYGZpZWxkJHtoYXNWYWx1ZSA/ICIiIDogIiBmaWVsZC0tZW1wdHkifWAgfSwgWwogICAgZWwoImlucHV0IiwgewogICAgICBjbGFzczogImlucHV0IGlucHV0LS1wbGFjZWhvbGRlci1sZyIsCiAgICAgIHZhbHVlOiBTdHJpbmcodmFsdWUgPz8gIiIpLAogICAgICAvLyBBbHdheXMga2VlcCB0aGUgbGFiZWwgYXMgcGxhY2Vob2xkZXIgc28gaXQgcmVhcHBlYXJzIGlmIHRoZSB1c2VyIGNsZWFycyB0aGUgZmllbGQuCiAgICAgIHBsYWNlaG9sZGVyOiBTdHJpbmcocGxhY2Vob2xkZXIgPz8gIiIpLAogICAgICBkYXRhc2V0OiB7IGZpZWxkS2V5OiBTdHJpbmcoa2V5ID8/ICIiKSB9LAogICAgICAvLyBFZGl0YWJsZSBmaWVsZHM6IHBlcnNpc3QgbGl2ZSBlZGl0cyBpbnRvIHN0YXRlLmNsaWVudAogICAgICBvbklucHV0OiAoZSkgPT4gewogICAgICAgIGNvbnN0IHYgPSBlPy50YXJnZXQ/LnZhbHVlID8/ICIiOwogICAgICAgIGlmICghc3RhdGUgfHwgdHlwZW9mIHN0YXRlICE9PSAib2JqZWN0IikgcmV0dXJuOwogICAgICAgIGlmICghc3RhdGUuY2xpZW50IHx8IHR5cGVvZiBzdGF0ZS5jbGllbnQgIT09ICJvYmplY3QiKSBzdGF0ZS5jbGllbnQgPSB7fTsKICAgICAgICBzdGF0ZS5jbGllbnRba2V5XSA9IFN0cmluZyh2KTsKICAgICAgICAvLyBLZWVwIGVtcHR5L25vbi1lbXB0eSB2aXN1YWwgc3RhdGUgaW4gc3luYyB3aXRob3V0IGEgZnVsbCByZS1yZW5kZXIuCiAgICAgICAgdHJ5ewogICAgICAgICAgY29uc3QgaW5wID0gZT8udGFyZ2V0OwogICAgICAgICAgY29uc3QgZmllbGRSb290ID0gaW5wPy5jbG9zZXN0Py4oIi5maWVsZCIpIHx8IGlucD8ucGFyZW50RWxlbWVudDsKICAgICAgICAgIGlmIChmaWVsZFJvb3QpIGZpZWxkUm9vdC5jbGFzc0xpc3QudG9nZ2xlKCJmaWVsZC0tZW1wdHkiLCAhaXNOb25FbXB0eSh2KSk7CiAgICAgICAgfSBjYXRjaCAoZTMpIHt9CiAgICAgICAgaWYgKFsiYWRyZXNzZSIsICJjb21wbGVtZW50QWRyZXNzZSIsICJjb2RlUG9zdGFsIiwgInZpbGxlIl0uaW5jbHVkZXMoU3RyaW5nKGtleSA/PyAiIikpKXsKICAgICAgICAgIGludmFsaWRhdGVEZWxpdmVyeVRyYXZlbENoZWNrRnJvbUV2ZW50KGUsIHN0YXRlLCAiY2xpZW50Iik7CiAgICAgICAgfQogICAgICAgIC8vIFNwZWNpYWwgVVg6IGlmICJwcm9ibGVtZSIgaXMgbm90IGVtcHR5ID0+IGF0dHJhY3QgYXR0ZW50aW9uIGFyb3VuZCB0aGUgZmllbGQuCiAgICAgICAgaWYgKFN0cmluZyhrZXkgPz8gIiIpID09PSAicHJvYmxlbWUiKXsKICAgICAgICAgIC8vIGB0aGlzYCBpcyB1bnJlbGlhYmxlIGhlcmU7IHVzZSBET00gdHJhdmVyc2FsIGZyb20gZXZlbnQgdGFyZ2V0LgogICAgICAgICAgY29uc3QgY2FyZFJvb3QgPSBlPy50YXJnZXQ/LmNsb3Nlc3Q/LigiLmNhcmQiKTsKICAgICAgICAgIHRyeSB7IHNldFByb2JsZW1lQXR0ZW50aW9uKGNhcmRSb290LCB2KTsgfSBjYXRjaCAoZTIpIHt9CiAgICAgICAgfQogICAgICB9LAogICAgICAiYXJpYS1sYWJlbCI6IFN0cmluZyhwbGFjZWhvbGRlciA/PyAiIiksCiAgICB9KSwKICBdKTsKfQoKZnVuY3Rpb24gZmlyc3ROYW1lRmllbGQoeyBwbGFjZWhvbGRlciwgdmFsdWUsIHN0YXRlIH0gPSB7fSl7CiAgY29uc3QgaGFzVmFsdWUgPSBTdHJpbmcodmFsdWUgPz8gIiIpLnRyaW0oKS5sZW5ndGggPiAwOwogIGNvbnN0IHdyYXAgPSBlbCgiZGl2IiwgeyBjbGFzczogYGZpZWxkIGZpZWxkLS1mbiR7aGFzVmFsdWUgPyAiIiA6ICIgZmllbGQtLWVtcHR5In1gIH0sIFsKICAgIGVsKCJkaXYiLCB7IGNsYXNzOiAiZm4tYXV0b2NvbXBsZXRlIiB9LCBbCiAgICAgIGVsKCJpbnB1dCIsIHsKICAgICAgICBjbGFzczogImlucHV0IGlucHV0LS1wbGFjZWhvbGRlci1sZyIsCiAgICAgICAgdmFsdWU6IFN0cmluZyh2YWx1ZSA/PyAiIiksCiAgICAgICAgcGxhY2Vob2xkZXI6IFN0cmluZyhwbGFjZWhvbGRlciA/PyAiIiksCiAgICAgICAgZGF0YXNldDogeyBmaWVsZEtleTogInByZW5vbSIgfSwKICAgICAgICAiYXJpYS1sYWJlbCI6IFN0cmluZyhwbGFjZWhvbGRlciA/PyAiIiksCiAgICAgICAgYXV0b2NvbXBsZXRlOiAib2ZmIiwKICAgICAgICBhdXRvY2FwaXRhbGl6ZTogIm9mZiIsCiAgICAgICAgc3BlbGxjaGVjazogImZhbHNlIiwKICAgICAgfSksCiAgICAgIGVsKCJkaXYiLCB7CiAgICAgICAgY2xhc3M6ICJmbi1saXN0IGlzLWhpZGRlbiIsCiAgICAgICAgcm9sZTogImxpc3Rib3giLAogICAgICAgICJhcmlhLWxhYmVsIjogIlN1Z2dlc3Rpb25zIGRlIHByw6lub21zIiwKICAgICAgfSksCiAgICBdKSwKICBdKTsKCiAgY29uc3QgaW5wID0gd3JhcC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtkYXRhLWZpZWxkLWtleT0icHJlbm9tIl0nKTsKICBjb25zdCBsaXN0RWwgPSB3cmFwLnF1ZXJ5U2VsZWN0b3IoIi5mbi1saXN0Iik7CiAgaWYgKCFpbnAgfHwgIWxpc3RFbCkgcmV0dXJuIHdyYXA7CgogIGxldCBzZWxlY3RlZElkeCA9IC0xOwogIGxldCBsYXN0SXRlbXMgPSBbXTsKICBsZXQgYmx1clRpbWVyID0gbnVsbDsKCiAgZnVuY3Rpb24gaGlkZSgpewogICAgc2VsZWN0ZWRJZHggPSAtMTsKICAgIGxhc3RJdGVtcyA9IFtdOwogICAgdHJ5eyBsaXN0RWwuaW5uZXJIVE1MID0gIiI7IH0gY2F0Y2ggKF9lKSB7fQogICAgdHJ5eyBsaXN0RWwuY2xhc3NMaXN0LmFkZCgiaXMtaGlkZGVuIik7IH0gY2F0Y2ggKF9lKSB7fQogIH0KCiAgZnVuY3Rpb24gc2hvdyhpdGVtcyl7CiAgICBsYXN0SXRlbXMgPSBBcnJheS5pc0FycmF5KGl0ZW1zKSA/IGl0ZW1zIDogW107CiAgICBzZWxlY3RlZElkeCA9IC0xOwogICAgdHJ5eyBsaXN0RWwuaW5uZXJIVE1MID0gIiI7IH0gY2F0Y2ggKF9lKSB7fQogICAgaWYgKCFsYXN0SXRlbXMubGVuZ3RoKXsKICAgICAgaGlkZSgpOwogICAgICByZXR1cm47CiAgICB9CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxhc3RJdGVtcy5sZW5ndGg7IGkrKyl7CiAgICAgIGNvbnN0IG5hbWUgPSBTdHJpbmcobGFzdEl0ZW1zW2ldID8/ICIiKTsKICAgICAgY29uc3Qgcm93ID0gZWwoImJ1dHRvbiIsIHsKICAgICAgICB0eXBlOiAiYnV0dG9uIiwKICAgICAgICBjbGFzczogImZuLWl0ZW0iLAogICAgICAgIHJvbGU6ICJvcHRpb24iLAogICAgICAgIGRhdGFzZXQ6IHsgaWR4OiBTdHJpbmcoaSkgfSwKICAgICAgICBvbk1vdXNlRG93bjogKGUpID0+IHsKICAgICAgICAgIC8vIG1vdXNlZG93biBmaXJlcyBiZWZvcmUgYmx1cjsga2VlcCBjbGljayB3b3JraW5nLgogICAgICAgICAgdHJ5eyBlPy5wcmV2ZW50RGVmYXVsdD8uKCk7IH0gY2F0Y2ggKF9lMikge30KICAgICAgICB9LAogICAgICAgIG9uQ2xpY2s6IChlKSA9PiB7CiAgICAgICAgICB0cnl7IGU/LnByZXZlbnREZWZhdWx0Py4oKTsgfSBjYXRjaCAoX2UyKSB7fQogICAgICAgICAgY29uc3QgcGlja2VkID0gU3RyaW5nKG5hbWUgPz8gIiIpOwogICAgICAgICAgdHJ5eyBpbnAudmFsdWUgPSBwaWNrZWQ7IH0gY2F0Y2ggKF9lMykge30KICAgICAgICAgIGlmIChzdGF0ZSAmJiB0eXBlb2Ygc3RhdGUgPT09ICJvYmplY3QiKXsKICAgICAgICAgICAgaWYgKCFzdGF0ZS5jbGllbnQgfHwgdHlwZW9mIHN0YXRlLmNsaWVudCAhPT0gIm9iamVjdCIpIHN0YXRlLmNsaWVudCA9IHt9OwogICAgICAgICAgICBzdGF0ZS5jbGllbnQucHJlbm9tID0gcGlja2VkOwogICAgICAgICAgfQogICAgICAgICAgLy8gU3luYyBlbXB0eS9ub24tZW1wdHkgc3R5bGUKICAgICAgICAgIHRyeXsKICAgICAgICAgICAgY29uc3QgZmllbGRSb290ID0gaW5wLmNsb3Nlc3QoIi5maWVsZCIpIHx8IGlucC5wYXJlbnRFbGVtZW50OwogICAgICAgICAgICBpZiAoZmllbGRSb290KSBmaWVsZFJvb3QuY2xhc3NMaXN0LnRvZ2dsZSgiZmllbGQtLWVtcHR5IiwgIWlzTm9uRW1wdHkocGlja2VkKSk7CiAgICAgICAgICB9IGNhdGNoIChfZTQpIHt9CiAgICAgICAgICBoaWRlKCk7CiAgICAgICAgfSwKICAgICAgfSwgbmFtZSk7CiAgICAgIHRyeXsgbGlzdEVsLmFwcGVuZENoaWxkKHJvdyk7IH0gY2F0Y2ggKF9lKSB7fQogICAgfQogICAgdHJ5eyBsaXN0RWwuY2xhc3NMaXN0LnJlbW92ZSgiaXMtaGlkZGVuIik7IH0gY2F0Y2ggKF9lKSB7fQogIH0KCiAgZnVuY3Rpb24gcmVuZGVyRnJvbUlucHV0KCl7CiAgICBjb25zdCB2ID0gU3RyaW5nKGlucC52YWx1ZSA/PyAiIik7CiAgICBpZiAoc3RhdGUgJiYgdHlwZW9mIHN0YXRlID09PSAib2JqZWN0Iil7CiAgICAgIGlmICghc3RhdGUuY2xpZW50IHx8IHR5cGVvZiBzdGF0ZS5jbGllbnQgIT09ICJvYmplY3QiKSBzdGF0ZS5jbGllbnQgPSB7fTsKICAgICAgc3RhdGUuY2xpZW50LnByZW5vbSA9IHY7CiAgICB9CiAgICAvLyBLZWVwIGVtcHR5L25vbi1lbXB0eSB2aXN1YWwgc3RhdGUgaW4gc3luYyB3aXRob3V0IGEgZnVsbCByZS1yZW5kZXIuCiAgICB0cnl7CiAgICAgIGNvbnN0IGZpZWxkUm9vdCA9IGlucC5jbG9zZXN0KCIuZmllbGQiKSB8fCBpbnAucGFyZW50RWxlbWVudDsKICAgICAgaWYgKGZpZWxkUm9vdCkgZmllbGRSb290LmNsYXNzTGlzdC50b2dnbGUoImZpZWxkLS1lbXB0eSIsICFpc05vbkVtcHR5KHYpKTsKICAgIH0gY2F0Y2ggKF9lKSB7fQoKICAgIGNvbnN0IGl0ZW1zID0gZmlsdGVyRmlyc3ROYW1lcyh7CiAgICAgIGxpc3Q6IHN0YXRlPy5maXJzdE5hbWVzLAogICAgICBxdWVyeTogdiwKICAgICAgbGltaXQ6IDEwLAogICAgfSk7CiAgICBzaG93KGl0ZW1zKTsKICB9CgogIGZ1bmN0aW9uIHJlZnJlc2hBY3RpdmVJdGVtKCl7CiAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20obGlzdEVsLnF1ZXJ5U2VsZWN0b3JBbGwoIi5mbi1pdGVtIikpOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKyl7CiAgICAgIGNvbnN0IG9uID0gKGkgPT09IHNlbGVjdGVkSWR4KTsKICAgICAgdHJ5eyBjaGlsZHJlbltpXS5jbGFzc0xpc3QudG9nZ2xlKCJpcy1hY3RpdmUiLCBvbik7IH0gY2F0Y2ggKF9lKSB7fQogICAgICB0cnl7IGNoaWxkcmVuW2ldLnNldEF0dHJpYnV0ZSgiYXJpYS1zZWxlY3RlZCIsIG9uID8gInRydWUiIDogImZhbHNlIik7IH0gY2F0Y2ggKF9lMikge30KICAgIH0KICAgIGlmIChzZWxlY3RlZElkeCA+PSAwKXsKICAgICAgY29uc3QgZWxBY3RpdmUgPSBjaGlsZHJlbltzZWxlY3RlZElkeF07CiAgICAgIHRyeXsgZWxBY3RpdmU/LnNjcm9sbEludG9WaWV3Py4oeyBibG9jazogIm5lYXJlc3QiIH0pOyB9IGNhdGNoIChfZSkge30KICAgIH0KICB9CgogIGlucC5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsICgpID0+IHsKICAgIGlmIChibHVyVGltZXIpeyB0cnl7IGNsZWFyVGltZW91dChibHVyVGltZXIpOyB9IGNhdGNoIChfZSkge30gYmx1clRpbWVyID0gbnVsbDsgfQogICAgcmVuZGVyRnJvbUlucHV0KCk7CiAgfSk7CgogIGlucC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgKGUpID0+IHsKICAgIGlmICghZSkgcmV0dXJuOwogICAgY29uc3QgdmlzaWJsZSA9ICFsaXN0RWwuY2xhc3NMaXN0LmNvbnRhaW5zKCJpcy1oaWRkZW4iKTsKICAgIGlmICghdmlzaWJsZSl7CiAgICAgIGlmIChlLmtleSA9PT0gIkVzY2FwZSIpIGhpZGUoKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGUua2V5ID09PSAiRXNjYXBlIil7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgaGlkZSgpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoZS5rZXkgPT09ICJBcnJvd0Rvd24iKXsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBzZWxlY3RlZElkeCA9IE1hdGgubWluKChsYXN0SXRlbXMubGVuZ3RoIC0gMSksIHNlbGVjdGVkSWR4ICsgMSk7CiAgICAgIHJlZnJlc2hBY3RpdmVJdGVtKCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChlLmtleSA9PT0gIkFycm93VXAiKXsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBzZWxlY3RlZElkeCA9IE1hdGgubWF4KDAsIHNlbGVjdGVkSWR4IC0gMSk7CiAgICAgIHJlZnJlc2hBY3RpdmVJdGVtKCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChlLmtleSA9PT0gIkVudGVyIil7CiAgICAgIGlmIChzZWxlY3RlZElkeCA+PSAwICYmIHNlbGVjdGVkSWR4IDwgbGFzdEl0ZW1zLmxlbmd0aCl7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGNvbnN0IHBpY2tlZCA9IFN0cmluZyhsYXN0SXRlbXNbc2VsZWN0ZWRJZHhdID8/ICIiKTsKICAgICAgICB0cnl7IGlucC52YWx1ZSA9IHBpY2tlZDsgfSBjYXRjaCAoX2UyKSB7fQogICAgICAgIGlmIChzdGF0ZSAmJiB0eXBlb2Ygc3RhdGUgPT09ICJvYmplY3QiKXsKICAgICAgICAgIGlmICghc3RhdGUuY2xpZW50IHx8IHR5cGVvZiBzdGF0ZS5jbGllbnQgIT09ICJvYmplY3QiKSBzdGF0ZS5jbGllbnQgPSB7fTsKICAgICAgICAgIHN0YXRlLmNsaWVudC5wcmVub20gPSBwaWNrZWQ7CiAgICAgICAgfQogICAgICAgIHRyeXsKICAgICAgICAgIGNvbnN0IGZpZWxkUm9vdCA9IGlucC5jbG9zZXN0KCIuZmllbGQiKSB8fCBpbnAucGFyZW50RWxlbWVudDsKICAgICAgICAgIGlmIChmaWVsZFJvb3QpIGZpZWxkUm9vdC5jbGFzc0xpc3QudG9nZ2xlKCJmaWVsZC0tZW1wdHkiLCAhaXNOb25FbXB0eShwaWNrZWQpKTsKICAgICAgICB9IGNhdGNoIChfZTMpIHt9CiAgICAgICAgaGlkZSgpOwogICAgICB9CiAgICB9CiAgfSk7CgogIGlucC5hZGRFdmVudExpc3RlbmVyKCJibHVyIiwgKCkgPT4gewogICAgaWYgKGJsdXJUaW1lcil7IHRyeXsgY2xlYXJUaW1lb3V0KGJsdXJUaW1lcik7IH0gY2F0Y2ggKF9lKSB7fSB9CiAgICAvLyBTbWFsbCBkZWxheSBzbyBhIGNsaWNrIG9uIGEgc3VnZ2VzdGlvbiBjYW4gYmUgcHJvY2Vzc2VkLgogICAgYmx1clRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgIGJsdXJUaW1lciA9IG51bGw7CiAgICAgIGhpZGUoKTsKICAgIH0sIDEyMCk7CiAgfSk7CgogIGlucC5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsICgpID0+IHsKICAgIC8vIFJlY29tcHV0ZSBvbiBmb2N1cyBpZiB1c2VyIGFscmVhZHkgdHlwZWQgZW5vdWdoLgogICAgdHJ5ewogICAgICBjb25zdCB2ID0gU3RyaW5nKGlucC52YWx1ZSA/PyAiIik7CiAgICAgIGlmICh2LnRyaW0oKS5sZW5ndGggPj0gMikgcmVuZGVyRnJvbUlucHV0KCk7CiAgICB9IGNhdGNoIChfZSkge30KICB9KTsKCiAgcmV0dXJuIHdyYXA7Cn0KCmZ1bmN0aW9uIGxveWFsdHlQaWxsKHBvaW50cywgb3B0cyA9IHt9KXsKICBjb25zdCBuID0gTnVtYmVyKHBvaW50cyk7CiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUobikpIHJldHVybiBudWxsOwogIGNvbnN0IHJvdW5kZWQgPSBNYXRoLnJvdW5kKG4pOwogIGNvbnN0IGxhYmVsID0gKHJvdW5kZWQgPT09IDEpID8gInBvaW50IiA6ICJwb2ludHMiOwogIGNvbnN0IGlzQWxlcnQgPSAhIW9wdHM/LmlzQWxlcnQ7CiAgcmV0dXJuIGVsKCJkaXYiLCB7CiAgICBjbGFzczogYGxveWFsdHktcGlsbCR7aXNBbGVydCA/ICIgbG95YWx0eS1waWxsLS1hbGVydCIgOiAiIn1gLAogICAgcm9sZTogInN0YXR1cyIsCiAgICAiYXJpYS1sYWJlbCI6ICJQb2ludHMgZmlkw6lsaXTDqSIsCiAgfSwgWwogICAgZWwoInNwYW4iLCB7IGNsYXNzOiAibG95YWx0eS1waWxsX192YWx1ZSIgfSwgU3RyaW5nKHJvdW5kZWQpKSwKICAgIGVsKCJzcGFuIiwgeyBjbGFzczogImxveWFsdHktcGlsbF9fbGFiZWwiIH0sIGxhYmVsKSwKICBdKTsKfQoKZnVuY3Rpb24gbG95YWx0eVBpbGxCdXR0b24ocG9pbnRzLCBvcHRzID0ge30pewogIGNvbnN0IG4gPSBOdW1iZXIocG9pbnRzKTsKICBpZiAoIU51bWJlci5pc0Zpbml0ZShuKSkgcmV0dXJuIG51bGw7CiAgY29uc3Qgcm91bmRlZCA9IE1hdGgucm91bmQobik7CiAgY29uc3QgbGFiZWwgPSAocm91bmRlZCA9PT0gMSkgPyAicG9pbnQiIDogInBvaW50cyI7CiAgY29uc3QgaXNBbGVydCA9ICEhb3B0cz8uaXNBbGVydDsKICByZXR1cm4gZWwoImJ1dHRvbiIsIHsKICAgIHR5cGU6ICJidXR0b24iLAogICAgY2xhc3M6IGBsb3lhbHR5LXBpbGwgbG95YWx0eS1waWxsLS1oZCR7aXNBbGVydCA/ICIgbG95YWx0eS1waWxsLS1hbGVydCIgOiAiIn1gLAogICAgImFyaWEtbGFiZWwiOiAiUG9pbnRzIGZpZMOpbGl0w6kiLAogICAgdGl0bGU6ICJNb2RpZmllciBwb2ludHMgZmlkw6lsaXTDqSIsCiAgfSwgWwogICAgZWwoInNwYW4iLCB7IGNsYXNzOiAibG95YWx0eS1waWxsX192YWx1ZSIgfSwgU3RyaW5nKHJvdW5kZWQpKSwKICAgIGVsKCJzcGFuIiwgeyBjbGFzczogImxveWFsdHktcGlsbF9fbGFiZWwiIH0sIGxhYmVsKSwKICBdKTsKfQoKZnVuY3Rpb24gZ2V0Q2xpZW50TG95YWx0eVRvdGFsUG9pbnRzKGFueUNsaWVudCl7CiAgY29uc3QgYyA9IChhbnlDbGllbnQgJiYgdHlwZW9mIGFueUNsaWVudCA9PT0gIm9iamVjdCIpID8gYW55Q2xpZW50IDoge307CgogIGNvbnN0IHRvdGFsID0gTnVtYmVyKGM/LnBvaW50c0ZpZFRvdGFsKTsKICBpZiAoTnVtYmVyLmlzRmluaXRlKHRvdGFsKSkgcmV0dXJuIE1hdGgudHJ1bmModG90YWwpOwoKICAvLyBEZWZlbnNpdmUgZmFsbGJhY2s6CiAgLy8gd2hlbiBvbmx5IHRoZSBkaXNwbGF5IHZhbHVlIGlzIHByZXNlbnQgaW4gVUkgc3RhdGUsIHJlY29uc3RydWN0IHRoZSBlZGl0YWJsZQogIC8vIHRvdGFsIGJ5IHJlLWFkZGluZyBjdXJyZW50bHkgcmVzZXJ2ZWQgbG95YWx0eSBwb2ludHMuCiAgY29uc3QgZGlzcGxheSA9IE51bWJlcihjPy5wb2ludHNGaWREaXNwbGF5KTsKICBjb25zdCByZXNlcnZlZCA9IE51bWJlcihjPy5sb3lhbHR5UmVzZXJ2ZWRQb2ludHMpOwogIGlmIChOdW1iZXIuaXNGaW5pdGUoZGlzcGxheSkpIHsKICAgIGNvbnN0IHJlY29uc3RydWN0ZWQgPSBkaXNwbGF5ICsgKE51bWJlci5pc0Zpbml0ZShyZXNlcnZlZCkgPyByZXNlcnZlZCA6IDApOwogICAgcmV0dXJuIE1hdGgudHJ1bmMocmVjb25zdHJ1Y3RlZCk7CiAgfQoKICByZXR1cm4gMDsKfQoKZnVuY3Rpb24gc2V0TG95YWx0eVBpbGwoY2FyZFJvb3QsIHBvaW50cywgb3B0cyA9IHt9KXsKICBpZiAoIWNhcmRSb290KSByZXR1cm47CiAgY29uc3QgaG9zdCA9CiAgICBjYXJkUm9vdC5xdWVyeVNlbGVjdG9yKCIuY2FyZF9faGQgLmNhcmRfX2FjdGlvbnMiKSB8fAogICAgY2FyZFJvb3QucXVlcnlTZWxlY3RvcigiLmNhcmRfX2hkIik7CiAgaWYgKCFob3N0KSByZXR1cm47CgogIGNvbnN0IG4gPSBOdW1iZXIocG9pbnRzKTsKICBjb25zdCBoYXMgPSBOdW1iZXIuaXNGaW5pdGUobik7CiAgY29uc3QgaXNBbGVydCA9ICEhb3B0cz8uaXNBbGVydDsKCiAgY29uc3QgZXhpc3RpbmcgPSBjYXJkUm9vdC5xdWVyeVNlbGVjdG9yKCIubG95YWx0eS1waWxsLmxveWFsdHktcGlsbC0taGQiKTsKICBjb25zdCBleGlzdGluZ05vdGUgPSBjYXJkUm9vdC5xdWVyeVNlbGVjdG9yKCIubG95YWx0eS1waWxsLW5vdGUiKTsKICBpZiAoIWhhcyl7CiAgICBpZiAoZXhpc3RpbmcpIHsKICAgICAgdHJ5IHsgZXhpc3RpbmcucmVtb3ZlKCk7IH0gY2F0Y2ggKGUpIHt9CiAgICB9CiAgICBpZiAoZXhpc3RpbmdOb3RlKSB7CiAgICAgIHRyeSB7IGV4aXN0aW5nTm90ZS5yZW1vdmUoKTsgfSBjYXRjaCAoZSkge30KICAgIH0KICAgIHJldHVybjsKICB9CgogIGNvbnN0IHJvdW5kZWQgPSBNYXRoLnJvdW5kKG4pOwogIGNvbnN0IGxhYmVsID0gKHJvdW5kZWQgPT09IDEpID8gInBvaW50IiA6ICJwb2ludHMiOwoKICBpZiAoZXhpc3RpbmcpewogICAgY29uc3QgdmFsRWwgPSBleGlzdGluZy5xdWVyeVNlbGVjdG9yKCIubG95YWx0eS1waWxsX192YWx1ZSIpOwogICAgY29uc3QgbGFiRWwgPSBleGlzdGluZy5xdWVyeVNlbGVjdG9yKCIubG95YWx0eS1waWxsX19sYWJlbCIpOwogICAgaWYgKHZhbEVsKSB2YWxFbC50ZXh0Q29udGVudCA9IFN0cmluZyhyb3VuZGVkKTsKICAgIGlmIChsYWJFbCkgbGFiRWwudGV4dENvbnRlbnQgPSBsYWJlbDsKICAgIGV4aXN0aW5nLmNsYXNzTGlzdC50b2dnbGUoImxveWFsdHktcGlsbC0tYWxlcnQiLCBpc0FsZXJ0KTsKICAgIC8vIE5vdGUgdW5kZXIgcGlsbAogICAgaWYgKGlzQWxlcnQpewogICAgICBpZiAoIWV4aXN0aW5nTm90ZSl7CiAgICAgICAgY29uc3Qgbm90ZSA9IGVsKCJkaXYiLCB7IGNsYXNzOiAibG95YWx0eS1waWxsLW5vdGUiLCByb2xlOiAibm90ZSIgfSwgIkZpZMOpbGl0w6kgdXRpbGlzw6llIGNlIGpvdXIiKTsKICAgICAgICB0cnkgewogICAgICAgICAgaG9zdC5pbnNlcnRBZGphY2VudEVsZW1lbnQoImFmdGVyZW5kIiwgbm90ZSk7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgdHJ5IHsgY2FyZFJvb3QucXVlcnlTZWxlY3RvcigiLmNhcmRfX2JkIik/Lmluc2VydEJlZm9yZShub3RlLCBjYXJkUm9vdC5xdWVyeVNlbGVjdG9yKCIuY2FyZF9fYmQiKT8uZmlyc3RDaGlsZCB8fCBudWxsKTsgfSBjYXRjaCAoZTIpIHt9CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpZiAoZXhpc3RpbmdOb3RlKXsKICAgICAgICB0cnkgeyBleGlzdGluZ05vdGUucmVtb3ZlKCk7IH0gY2F0Y2ggKGUpIHt9CiAgICAgIH0KICAgIH0KICAgIHJldHVybjsKICB9CgogIC8vIEluc2VydCBjb21wYWN0IGJ1dHRvbiBpbiBjYXJkIGhlYWRlciBhY3Rpb25zCiAgY29uc3QgcGlsbCA9IGxveWFsdHlQaWxsQnV0dG9uKG4sIHsgaXNBbGVydCB9KTsKICBpZiAoIXBpbGwpIHJldHVybjsKICB0cnkgeyBob3N0LmFwcGVuZENoaWxkKHBpbGwpOyB9IGNhdGNoIChlKSB7CiAgICB0cnkgeyBob3N0LmFwcGVuZENoaWxkKHBpbGwpOyB9IGNhdGNoIChlMikge30KICB9CiAgaWYgKGlzQWxlcnQpewogICAgY29uc3Qgbm90ZSA9IGVsKCJkaXYiLCB7IGNsYXNzOiAibG95YWx0eS1waWxsLW5vdGUiLCByb2xlOiAibm90ZSIgfSwgIkZpZMOpbGl0w6kgdXRpbGlzw6llIGNlIGpvdXIiKTsKICAgIHRyeSB7CiAgICAgIGNvbnN0IGJkID0gY2FyZFJvb3QucXVlcnlTZWxlY3RvcigiLmNhcmRfX2JkIik7CiAgICAgIGlmIChiZCkgYmQuaW5zZXJ0QmVmb3JlKG5vdGUsIGJkLmZpcnN0Q2hpbGQpOwogICAgfSBjYXRjaCAoZTIpIHt9CiAgfQp9CgpleHBvcnQgZnVuY3Rpb24gQ2xpZW50Q2FyZCh7IGNsaWVudCwgc3RhdGUsIG9uUmVjb3ZlckNhbGwgfSl7CiAgY29uc3QgYyA9IChjbGllbnQgJiYgdHlwZW9mIGNsaWVudCA9PT0gIm9iamVjdCIpID8gY2xpZW50IDoge307CiAgLy8gS2VlcCBmb3JtYXR0ZWQgZGlzcGxheSBieSBkZWZhdWx0OyB1bmRlcmx5aW5nIGVkaXRhYmxlIHZhbHVlIGlzIHN0aWxsIHN0b3JlZCBpbiBzdGF0ZS5jbGllbnQudGVsZXBob25lCiAgLy8gSWYgc3RhdGUuY2xpZW50IGV4aXN0cywgcHJlZmVyIGl0IHNvIGVkaXRzIHBlcnNpc3QgYWNyb3NzIHJlLXJlbmRlcnMuCiAgY29uc3QgbGl2ZUNsaWVudCA9IChzdGF0ZT8uY2xpZW50ICYmIHR5cGVvZiBzdGF0ZS5jbGllbnQgPT09ICJvYmplY3QiKSA/IHN0YXRlLmNsaWVudCA6IGM7CiAgdHJ5ewogICAgc3luY0RlbGl2ZXJ5QWRkcmVzc1NlbGVjdGlvbnMoewogICAgICBzdGF0ZSwKICAgICAgc3RvcmVJZDogZ2V0Q3VycmVudFN0b3JlU3VmZml4KCksCiAgICAgIHdoZW5MaXZyYWlzb25Pbmx5OiB0cnVlLAogICAgfSk7CiAgfSBjYXRjaCAoX2UpIHt9CiAgY29uc3QgcGhvbmVEaXNwbGF5ID0gZm9ybWF0UGhvbmVGb3JEaXNwbGF5KGxpdmVDbGllbnQudGVsZXBob25lKTsKICAvLyBJTVBPUlRBTlQ6IHBpbGwgbXVzdCBmb2xsb3cgbGl2ZSBzdGF0ZSAoYWZ0ZXIgcGhvbmUgbG9va3VwIC8gaW5saW5lIGVkaXRzKQogIGNvbnN0IHB0cyA9IE51bWJlcigKICAgIChsaXZlQ2xpZW50LnBvaW50c0ZpZERpc3BsYXkgIT0gbnVsbCkgPyBsaXZlQ2xpZW50LnBvaW50c0ZpZERpc3BsYXkgOiBsaXZlQ2xpZW50LnBvaW50c0ZpZFRvdGFsCiAgKTsKICBjb25zdCBoYXNQdHMgPSBOdW1iZXIuaXNGaW5pdGUocHRzKTsKICBjb25zdCBpc0xveWFsdHlVc2VkID0gISFsaXZlQ2xpZW50LmxveWFsdHlVc2VkU2VsZWN0ZWREYXk7CiAgY29uc3QgcGlsbCA9IGhhc1B0cyA/IGxveWFsdHlQaWxsQnV0dG9uKHB0cywgeyBpc0FsZXJ0OiBpc0xveWFsdHlVc2VkIH0pIDogbnVsbDsKICBjb25zdCBwaWxsTm90ZSA9IChoYXNQdHMgJiYgaXNMb3lhbHR5VXNlZCkKICAgID8gZWwoImRpdiIsIHsgY2xhc3M6ICJsb3lhbHR5LXBpbGwtbm90ZSIsIHJvbGU6ICJub3RlIiB9LCAiRmlkw6lsaXTDqSB1dGlsaXPDqWUgY2Ugam91ciIpCiAgICA6IG51bGw7CiAgY29uc3QgdGVtcERlbGl2ZXJ5ID0gKCgpID0+IHsKICAgIGNvbnN0IHJhdyA9IChzdGF0ZT8udGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzICYmIHR5cGVvZiBzdGF0ZS50ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MgPT09ICJvYmplY3QiKQogICAgICA/IHN0YXRlLnRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcwogICAgICA6IHt9OwogICAgY29uc3Qgbm9ybWFsaXplZCA9IHsKICAgICAgZW5hYmxlZDogISFyYXcuZW5hYmxlZCwKICAgICAgYWRyZXNzZTogU3RyaW5nKHJhdy5hZHJlc3NlID8/ICIiKSwKICAgICAgY29tcGxlbWVudEFkcmVzc2U6IFN0cmluZyhyYXcuY29tcGxlbWVudEFkcmVzc2UgPz8gcmF3LmNvbXBsZW1lbnRfYWRyZXNzZSA/PyAiIiksCiAgICAgIGNvZGVQb3N0YWw6IFN0cmluZyhyYXcuY29kZVBvc3RhbCA/PyByYXcuY29kZV9wb3N0YWwgPz8gIiIpLAogICAgICB2aWxsZTogU3RyaW5nKHJhdy52aWxsZSA/PyAiIiksCiAgICAgIHRlbXBvcmFyeURlbGl2ZXJ5Q2l0eUNob2ljZTogU3RyaW5nKHJhdy50ZW1wb3JhcnlEZWxpdmVyeUNpdHlDaG9pY2UgPz8gIiIpLAogICAgICBwZXJzaXN0ZWRDb2RlUG9zdGFsOiBTdHJpbmcocmF3LnBlcnNpc3RlZENvZGVQb3N0YWwgPz8gcmF3LmNvZGVQb3N0YWwgPz8gcmF3LmNvZGVfcG9zdGFsID8/ICIiKSwKICAgICAgcGVyc2lzdGVkVmlsbGU6IFN0cmluZyhyYXcucGVyc2lzdGVkVmlsbGUgPz8gcmF3LnZpbGxlID8/ICIiKSwKICAgICAgZXhwbGljYXRpb25zOiBTdHJpbmcocmF3LmV4cGxpY2F0aW9ucyA/PyAiIiksCiAgICAgIG51bWVyb1VyZ2VuY2U6IFN0cmluZyhyYXcubnVtZXJvVXJnZW5jZSA/PyByYXcubnVtZXJvX3VyZ2VuY2UgPz8gIiIpLAogICAgfTsKICAgIGlmIChzdGF0ZSAmJiB0eXBlb2Ygc3RhdGUgPT09ICJvYmplY3QiKSBzdGF0ZS50ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MgPSBub3JtYWxpemVkOwogICAgcmV0dXJuIG5vcm1hbGl6ZWQ7CiAgfSkoKTsKCiAgZW5zdXJlRGVsaXZlcnlUcmF2ZWxDaGVja3Moc3RhdGUpOwoKICBmdW5jdGlvbiBnZXRUcmF2ZWxBZGRyZXNzQnlLaW5kKGtpbmQpewogICAgaWYgKGtpbmQgPT09ICJ0ZW1wb3JhcnkiKXsKICAgICAgcmV0dXJuIG5vcm1hbGl6ZURlbGl2ZXJ5VHJhdmVsQWRkcmVzcyhzdGF0ZT8udGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzIHx8IHt9KTsKICAgIH0KICAgIGNvbnN0IGxhdGVzdENsaWVudCA9IChzdGF0ZT8uY2xpZW50ICYmIHR5cGVvZiBzdGF0ZS5jbGllbnQgPT09ICJvYmplY3QiKSA/IHN0YXRlLmNsaWVudCA6IGxpdmVDbGllbnQ7CiAgICByZXR1cm4gbm9ybWFsaXplRGVsaXZlcnlUcmF2ZWxBZGRyZXNzKGxhdGVzdENsaWVudCB8fCB7fSk7CiAgfQoKICBmdW5jdGlvbiBzZXRTY29wZWRDYXJkRmllbGRWYWx1ZShzY29wZVNlbGVjdG9yLCBrZXksIHZhbHVlKXsKICAgIGlmICghY2FyZEVsKSByZXR1cm47CiAgICBjb25zdCBzY29wZVJvb3QgPSBzY29wZVNlbGVjdG9yID8gY2FyZEVsLnF1ZXJ5U2VsZWN0b3Ioc2NvcGVTZWxlY3RvcikgOiBjYXJkRWw7CiAgICBpZiAoIXNjb3BlUm9vdCkgcmV0dXJuOwogICAgY29uc3QgaW5wdXQgPSBzY29wZVJvb3QucXVlcnlTZWxlY3RvcihgW2RhdGEtZmllbGQta2V5PSIke1N0cmluZyhrZXkpfSJdYCk7CiAgICBpZiAoIWlucHV0KSByZXR1cm47CiAgICB0cnkgeyBpbnB1dC52YWx1ZSA9IFN0cmluZyh2YWx1ZSA/PyAiIik7IH0gY2F0Y2ggKF9lKSB7fQogICAgdHJ5ewogICAgICBjb25zdCBmaWVsZFJvb3QgPSBpbnB1dC5jbG9zZXN0KCIuZmllbGQiKSB8fCBpbnB1dC5wYXJlbnRFbGVtZW50OwogICAgICBpZiAoZmllbGRSb290KSBmaWVsZFJvb3QuY2xhc3NMaXN0LnRvZ2dsZSgiZmllbGQtLWVtcHR5IiwgIWlzTm9uRW1wdHkoaW5wdXQudmFsdWUpKTsKICAgIH0gY2F0Y2ggKF9lKSB7fQogIH0KCiAgZnVuY3Rpb24gYXBwbHlEZWxpdmVyeVRyYXZlbEFkZHJlc3NDb3JyZWN0aW9uKGtpbmQsIGFwaVJlc3VsdCl7CiAgICBjb25zdCBjdXJyZW50QWRkcmVzcyA9IGdldFRyYXZlbEFkZHJlc3NCeUtpbmQoa2luZCk7CiAgICBjb25zdCBub3JtYWxpemVkID0gcmVzb2x2ZUNvcnJlY3RlZERlbGl2ZXJ5VHJhdmVsQWRkcmVzcygKICAgICAgYXBpUmVzdWx0Py5jb3JyZWN0ZWRUbyA/PyBhcGlSZXN1bHQ/Lm5vcm1hbGl6ZWRBZGRyZXNzID8/IG51bGwsCiAgICAgIGFwaVJlc3VsdD8ubm9ybWFsaXplZEFkZHJlc3MgPz8gbnVsbCwKICAgICAgY3VycmVudEFkZHJlc3MKICAgICk7CiAgICBpZiAoIW5vcm1hbGl6ZWQpIHJldHVybiBmYWxzZTsKCiAgICBpZiAoIWlzRGVsaXZlcnlUcmF2ZWxBZGRyZXNzQ29ycmVjdGlvbihjdXJyZW50QWRkcmVzcywgbm9ybWFsaXplZCkpIHJldHVybiBmYWxzZTsKCiAgICBpZiAoa2luZCA9PT0gInRlbXBvcmFyeSIpewogICAgICBpZiAoIXN0YXRlLnRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcyB8fCB0eXBlb2Ygc3RhdGUudGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzICE9PSAib2JqZWN0Iil7CiAgICAgICAgc3RhdGUudGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzID0geyBlbmFibGVkOiB0cnVlIH07CiAgICAgIH0KICAgICAgc3RhdGUudGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzLmVuYWJsZWQgPSB0cnVlOwogICAgICBzdGF0ZS50ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MuYWRyZXNzZSA9IG5vcm1hbGl6ZWQuYWRyZXNzZTsKICAgICAgc3RhdGUudGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzLmNvbXBsZW1lbnRBZHJlc3NlID0gbm9ybWFsaXplZC5jb21wbGVtZW50X2FkcmVzc2U7CiAgICAgIHN0YXRlLnRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcy5jb2RlUG9zdGFsID0gbm9ybWFsaXplZC5jb2RlX3Bvc3RhbDsKICAgICAgc3RhdGUudGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzLnZpbGxlID0gbm9ybWFsaXplZC52aWxsZTsKICAgICAgc3RhdGUudGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzLnBlcnNpc3RlZENvZGVQb3N0YWwgPSBub3JtYWxpemVkLmNvZGVfcG9zdGFsOwogICAgICBzdGF0ZS50ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MucGVyc2lzdGVkVmlsbGUgPSBub3JtYWxpemVkLnZpbGxlOwogICAgICBzdGF0ZS50ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MudGVtcG9yYXJ5RGVsaXZlcnlDaXR5Q2hvaWNlID0gYnVpbGRBbGxvd2VkRGVsaXZlcnlDaXR5Q2hvaWNlVmFsdWUoZ2V0Q3VycmVudFN0b3JlU3VmZml4KCksIG5vcm1hbGl6ZWQudmlsbGUsIG5vcm1hbGl6ZWQuY29kZV9wb3N0YWwpOwoKICAgICAgc2V0U2NvcGVkQ2FyZEZpZWxkVmFsdWUoJ1tkYXRhLXJvbGU9InRlbXBvcmFyeS1kZWxpdmVyeS1hZGRyZXNzLWJsb2NrIl0nLCAiYWRyZXNzZSIsIG5vcm1hbGl6ZWQuYWRyZXNzZSk7CiAgICAgIHNldFNjb3BlZENhcmRGaWVsZFZhbHVlKCdbZGF0YS1yb2xlPSJ0ZW1wb3JhcnktZGVsaXZlcnktYWRkcmVzcy1ibG9jayJdJywgImNvbXBsZW1lbnRBZHJlc3NlIiwgbm9ybWFsaXplZC5jb21wbGVtZW50X2FkcmVzc2UpOwogICAgICBzZXRTY29wZWRDYXJkRmllbGRWYWx1ZSgKICAgICAgICAnW2RhdGEtcm9sZT0idGVtcG9yYXJ5LWRlbGl2ZXJ5LWFkZHJlc3MtYmxvY2siXScsCiAgICAgICAgInRlbXBvcmFyeURlbGl2ZXJ5Q2l0eUNob2ljZSIsCiAgICAgICAgYnVpbGRBbGxvd2VkRGVsaXZlcnlDaXR5Q2hvaWNlVmFsdWUoZ2V0Q3VycmVudFN0b3JlU3VmZml4KCksIG5vcm1hbGl6ZWQudmlsbGUsIG5vcm1hbGl6ZWQuY29kZV9wb3N0YWwpCiAgICAgICk7CiAgICB9IGVsc2UgewogICAgICBpZiAoIXN0YXRlLmNsaWVudCB8fCB0eXBlb2Ygc3RhdGUuY2xpZW50ICE9PSAib2JqZWN0Iikgc3RhdGUuY2xpZW50ID0ge307CiAgICAgIHN0YXRlLmNsaWVudC5hZHJlc3NlID0gbm9ybWFsaXplZC5hZHJlc3NlOwogICAgICBzdGF0ZS5jbGllbnQuY29tcGxlbWVudEFkcmVzc2UgPSBub3JtYWxpemVkLmNvbXBsZW1lbnRfYWRyZXNzZTsKICAgICAgc3RhdGUuY2xpZW50LmNvZGVQb3N0YWwgPSBub3JtYWxpemVkLmNvZGVfcG9zdGFsOwogICAgICBzdGF0ZS5jbGllbnQudmlsbGUgPSBub3JtYWxpemVkLnZpbGxlOwogICAgICBzdGF0ZS5jbGllbnQuZGVsaXZlcnlDaXR5UGVyc2lzdGVkQ29kZVBvc3RhbCA9IG5vcm1hbGl6ZWQuY29kZV9wb3N0YWw7CiAgICAgIHN0YXRlLmNsaWVudC5kZWxpdmVyeUNpdHlQZXJzaXN0ZWRWaWxsZSA9IG5vcm1hbGl6ZWQudmlsbGU7CiAgICAgIHN0YXRlLmNsaWVudC5kZWxpdmVyeUNpdHlDaG9pY2UgPSBidWlsZEFsbG93ZWREZWxpdmVyeUNpdHlDaG9pY2VWYWx1ZShnZXRDdXJyZW50U3RvcmVTdWZmaXgoKSwgbm9ybWFsaXplZC52aWxsZSwgbm9ybWFsaXplZC5jb2RlX3Bvc3RhbCk7CgogICAgICBzZXRTY29wZWRDYXJkRmllbGRWYWx1ZSgiLmRlbGl2ZXJ5LWZpZWxkcyIsICJhZHJlc3NlIiwgbm9ybWFsaXplZC5hZHJlc3NlKTsKICAgICAgc2V0U2NvcGVkQ2FyZEZpZWxkVmFsdWUoIi5kZWxpdmVyeS1maWVsZHMiLCAiY29tcGxlbWVudEFkcmVzc2UiLCBub3JtYWxpemVkLmNvbXBsZW1lbnRfYWRyZXNzZSk7CiAgICAgIHNldFNjb3BlZENhcmRGaWVsZFZhbHVlKAogICAgICAgICIuZGVsaXZlcnktZmllbGRzIiwKICAgICAgICAiZGVsaXZlcnlDaXR5Q2hvaWNlIiwKICAgICAgICBidWlsZEFsbG93ZWREZWxpdmVyeUNpdHlDaG9pY2VWYWx1ZShnZXRDdXJyZW50U3RvcmVTdWZmaXgoKSwgbm9ybWFsaXplZC52aWxsZSwgbm9ybWFsaXplZC5jb2RlX3Bvc3RhbCkKICAgICAgKTsKICAgIH0KCiAgICB0cnl7CiAgICAgIHRvYXN0KGBBZHJlc3NlIGNvcnJpZ8OpZSBhdXRvbWF0aXF1ZW1lbnQgOiAke2Zvcm1hdE5vcm1hbGl6ZWREZWxpdmVyeVRyYXZlbEFkZHJlc3NMYWJlbChub3JtYWxpemVkKX1gKTsKICAgIH0gY2F0Y2ggKF9lKSB7fQoKICAgIHJldHVybiB0cnVlOwogIH0KCiAgZnVuY3Rpb24gc3luY0RlbGl2ZXJ5VHJhdmVsQ2hlY2tVaShraW5kKXsKICAgIGNvbnN0IGVudHJ5ID0gZ2V0RGVsaXZlcnlUcmF2ZWxDaGVja0VudHJ5KHN0YXRlLCBraW5kKTsKICAgIGNvbnN0IGJ0biA9IGNhcmRFbD8ucXVlcnlTZWxlY3Rvcj8uKGBbZGF0YS1yb2xlPSJkZWxpdmVyeS10cmF2ZWwtY2hlY2stYnRuLSR7U3RyaW5nKGtpbmQpfSJdYCk7CiAgICBjb25zdCByZXN1bHQgPSBjYXJkRWw/LnF1ZXJ5U2VsZWN0b3I/LihgW2RhdGEtcm9sZT0iZGVsaXZlcnktdHJhdmVsLWNoZWNrLXJlc3VsdC0ke1N0cmluZyhraW5kKX0iXWApOwogICAgaWYgKCFidG4gfHwgIXJlc3VsdCkgcmV0dXJuOwoKICAgIGJ0bi5kaXNhYmxlZCA9ICEhZW50cnkucGVuZGluZzsKICAgIGJ0bi50ZXh0Q29udGVudCA9IGVudHJ5LnBlbmRpbmcgPyAiVsOpcmlmaWNhdGlvbuKApiIgOiAiVsOpcmlmaWVyIGxlIHRlbXBzIGRlIHRyYWpldCI7CgogICAgY29uc3QgY2h1bmtzID0gW107CiAgICBpZiAoZW50cnkuZHVyYXRpb25MYWJlbCkgY2h1bmtzLnB1c2goU3RyaW5nKGVudHJ5LmR1cmF0aW9uTGFiZWwpKTsKICAgIGlmIChlbnRyeS5tZXNzYWdlKSBjaHVua3MucHVzaChTdHJpbmcoZW50cnkubWVzc2FnZSkpOwogICAgcmVzdWx0LnRleHRDb250ZW50ID0gY2h1bmtzLmpvaW4oIiDigJQgIik7CiAgICByZXN1bHQuaGlkZGVuID0gY2h1bmtzLmxlbmd0aCA9PT0gMDsKICAgIGlmIChjaHVua3MubGVuZ3RoKXsKICAgICAgcmVzdWx0LmRhdGFzZXQuc3RhdGUgPSBTdHJpbmcoZW50cnkudG9uZSB8fCAibmV1dHJhbCIpOwogICAgfSBlbHNlIHsKICAgICAgdHJ5IHsgZGVsZXRlIHJlc3VsdC5kYXRhc2V0LnN0YXRlOyB9IGNhdGNoIChfZSkge30KICAgIH0KICB9CgogIGFzeW5jIGZ1bmN0aW9uIHJ1bkRlbGl2ZXJ5VHJhdmVsQ2hlY2soa2luZCl7CiAgICBjb25zdCBlbnRyeSA9IGdldERlbGl2ZXJ5VHJhdmVsQ2hlY2tFbnRyeShzdGF0ZSwga2luZCk7CiAgICBjb25zdCBhZGRyZXNzID0gZ2V0VHJhdmVsQWRkcmVzc0J5S2luZChraW5kKTsKICAgIGlmICghaXNDb21wbGV0ZURlbGl2ZXJ5VHJhdmVsQWRkcmVzcyhhZGRyZXNzKSl7CiAgICAgIGVudHJ5LnBlbmRpbmcgPSBmYWxzZTsKICAgICAgZW50cnkub2sgPSBmYWxzZTsKICAgICAgZW50cnkudG9uZSA9ICJlcnJvciI7CiAgICAgIGVudHJ5LmR1cmF0aW9uTGFiZWwgPSAiIjsKICAgICAgZW50cnkubWVzc2FnZSA9ICJBZHJlc3NlIGluY29tcGzDqHRlIDogbWVyY2kgZGUgcmVuc2VpZ25lciBs4oCZYWRyZXNzZSwgbGUgY29kZSBwb3N0YWwgZXQgbGEgdmlsbGUgYXZhbnQgZGUgbGFuY2VyIGxlIGNvbnRyw7RsZS4iOwogICAgICBlbnRyeS5jaGVja2VkQXRTZWNvbmRzID0gMDsKICAgICAgc3luY0RlbGl2ZXJ5VHJhdmVsQ2hlY2tVaShraW5kKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGVudHJ5LnBlbmRpbmcgPSB0cnVlOwogICAgZW50cnkubWVzc2FnZSA9ICIiOwogICAgZW50cnkuZHVyYXRpb25MYWJlbCA9ICIiOwogICAgc3luY0RlbGl2ZXJ5VHJhdmVsQ2hlY2tVaShraW5kKTsKCiAgICB0cnl7CiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGNoZWNrRGVsaXZlcnlUcmF2ZWxUaW1lKHsKICAgICAgICBzdG9yZUlkOiBnZXRDdXJyZW50U3RvcmVTdWZmaXgoKSwKICAgICAgICBhZGRyZXNzLAogICAgICB9KTsKICAgICAgdHJ5IHsgYXBwbHlEZWxpdmVyeVRyYXZlbEFkZHJlc3NDb3JyZWN0aW9uKGtpbmQsIHJlcyk7IH0gY2F0Y2ggKF9lMikge30KICAgICAgZW50cnkucGVuZGluZyA9IGZhbHNlOwogICAgICBlbnRyeS5vayA9ICEhcmVzPy5vayAmJiAhIXJlcz8uaXNXaXRoaW41TWluOwogICAgICBlbnRyeS50b25lID0gIXJlcz8ub2sgPyAiZXJyb3IiIDogKHJlcz8uaXNXaXRoaW41TWluID8gInN1Y2Nlc3MiIDogIndhcm5pbmciKTsKICAgICAgZW50cnkuZHVyYXRpb25MYWJlbCA9IGZvcm1hdERlbGl2ZXJ5VHJhdmVsRHVyYXRpb24ocmVzKTsKICAgICAgZW50cnkubWVzc2FnZSA9IFN0cmluZyhyZXM/Lm1lc3NhZ2UgPz8gIiIpLnRyaW0oKTsKICAgICAgZW50cnkuY2hlY2tlZEF0U2Vjb25kcyA9IE51bWJlcihyZXM/LmNoZWNrZWRBdFNlY29uZHMgPz8gMCkgfHwgMDsKICAgICAgc3luY0RlbGl2ZXJ5VHJhdmVsQ2hlY2tVaShraW5kKTsKICAgIH0gY2F0Y2ggKF9lKXsKICAgICAgZW50cnkucGVuZGluZyA9IGZhbHNlOwogICAgICBlbnRyeS5vayA9IGZhbHNlOwogICAgICBlbnRyeS50b25lID0gImVycm9yIjsKICAgICAgZW50cnkuZHVyYXRpb25MYWJlbCA9ICIiOwogICAgICBlbnRyeS5tZXNzYWdlID0gIkltcG9zc2libGUgZGUgdsOpcmlmaWVyIGxlIHRlbXBzIGRlIHRyYWpldCBwb3VyIGxlIG1vbWVudC4gTWVyY2kgZGUgcsOpZXNzYXllci4iOwogICAgICBlbnRyeS5jaGVja2VkQXRTZWNvbmRzID0gMDsKICAgICAgc3luY0RlbGl2ZXJ5VHJhdmVsQ2hlY2tVaShraW5kKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGRlbGl2ZXJ5VHJhdmVsQ2hlY2tCbG9jayhraW5kKXsKICAgIGNvbnN0IGVudHJ5ID0gZ2V0RGVsaXZlcnlUcmF2ZWxDaGVja0VudHJ5KHN0YXRlLCBraW5kKTsKICAgIGNvbnN0IGNodW5rcyA9IFtdOwogICAgaWYgKGVudHJ5LmR1cmF0aW9uTGFiZWwpIGNodW5rcy5wdXNoKFN0cmluZyhlbnRyeS5kdXJhdGlvbkxhYmVsKSk7CiAgICBpZiAoZW50cnkubWVzc2FnZSkgY2h1bmtzLnB1c2goU3RyaW5nKGVudHJ5Lm1lc3NhZ2UpKTsKICAgIHJldHVybiBlbCgiZGl2IiwgewogICAgICBjbGFzczogImNsaWVudC1kZWxpdmVyeS10cmF2ZWwtY2hlY2siLAogICAgICBkYXRhc2V0OiB7IHJvbGU6IGBkZWxpdmVyeS10cmF2ZWwtY2hlY2stJHtTdHJpbmcoa2luZCl9YCB9LAogICAgfSwgWwogICAgICBlbCgiYnV0dG9uIiwgewogICAgICAgIHR5cGU6ICJidXR0b24iLAogICAgICAgIGNsYXNzOiAiYWJ0biBhYnRuLS1wcmltYXJ5IGNsaWVudC1kZWxpdmVyeS10cmF2ZWwtY2hlY2tfX2J0biIsCiAgICAgICAgZGF0YXNldDogeyByb2xlOiBgZGVsaXZlcnktdHJhdmVsLWNoZWNrLWJ0bi0ke1N0cmluZyhraW5kKX1gIH0sCiAgICAgICAgZGlzYWJsZWQ6ICEhZW50cnkucGVuZGluZywKICAgICAgICBvbkNsaWNrOiAoKSA9PiB7IHJ1bkRlbGl2ZXJ5VHJhdmVsQ2hlY2soa2luZCk7IH0sCiAgICAgIH0sIGVudHJ5LnBlbmRpbmcgPyAiVsOpcmlmaWNhdGlvbuKApiIgOiAiVsOpcmlmaWVyIGxlIHRlbXBzIGRlIHRyYWpldCIpLAogICAgICBlbCgiZGl2IiwgewogICAgICAgIGNsYXNzOiAiY2xpZW50LWRlbGl2ZXJ5LXRyYXZlbC1jaGVja19fcmVzdWx0IiwKICAgICAgICBkYXRhc2V0OiB7CiAgICAgICAgICByb2xlOiBgZGVsaXZlcnktdHJhdmVsLWNoZWNrLXJlc3VsdC0ke1N0cmluZyhraW5kKX1gLAogICAgICAgICAgc3RhdGU6IFN0cmluZyhlbnRyeS50b25lIHx8ICJuZXV0cmFsIiksCiAgICAgICAgfSwKICAgICAgICBoaWRkZW46IGNodW5rcy5sZW5ndGggPT09IDAsCiAgICAgIH0sIGNodW5rcy5qb2luKCIg4oCUICIpKSwKICAgIF0pOwogIH0KCiAgZnVuY3Rpb24gaW5qZWN0U2VhcmNoRG91YmxlRGFzaE9uY2UoeyByZWFzb24gPSAidW5rbm93biIgfSA9IHt9KXsKICAgIGlmICghc3RhdGUgfHwgdHlwZW9mIHN0YXRlICE9PSAib2JqZWN0IikgcmV0dXJuIGZhbHNlOwoKICAgIC8vIERvIG5vdCBvdmVyd3JpdGUgdXNlciB0eXBpbmcgLyBhbiBleGlzdGluZyBxdWVyeSAodW5sZXNzIGl0IGlzIGFscmVhZHkgdGhlIGF1dG8gb25lKQogICAgY29uc3QgY3VycmVudFEgPSBTdHJpbmcoc3RhdGUuc2VhcmNoUXVlcnkgPz8gIiIpOwogICAgaWYgKGN1cnJlbnRRICYmIGN1cnJlbnRRICE9PSAiLS0iKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoc3RhdGUuYXV0b0Rpc2NvdW50SW5qZWN0ZWQgPT09IHRydWUgJiYgY3VycmVudFEgPT09ICItLSIpIHJldHVybiBmYWxzZTsKCiAgICAvLyBBbHNvIGNoZWNrIHRoZSBhY3R1YWwgaW5wdXQgdmFsdWUgKGRlZmVuc2l2ZSkKICAgIGxldCBpbnB1dEVsID0gbnVsbDsKICAgIHRyeSB7IGlucHV0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicG9zLXNlYXJjaCIpOyB9IGNhdGNoIChlKSB7fQogICAgY29uc3QgaW5wdXRWYWwgPSBTdHJpbmcoaW5wdXRFbD8udmFsdWUgPz8gIiIpOwogICAgaWYgKGlucHV0VmFsICYmIGlucHV0VmFsICE9PSAiLS0iKSByZXR1cm4gZmFsc2U7CgogICAgLy8gTWFyayB0byBhdm9pZCBsb29wcwogICAgc3RhdGUuYXV0b0Rpc2NvdW50SW5qZWN0ZWQgPSB0cnVlOwoKICAgIC8vIFNldCBzdGF0ZSBhcyBmYWxsYmFjayAoaW4gY2FzZSBpbnB1dCBpc24ndCBtb3VudGVkIHlldCkKICAgIHN0YXRlLnNlYXJjaFF1ZXJ5ID0gIi0tIjsKICAgIHN0YXRlLnNlYXJjaFJlc3VsdHMgPSBjb21wdXRlUGl6emFSZXN1bHRzKHsgcGl6emFzOiBzdGF0ZT8uY2F0YWxvZz8ucGl6emFzIHx8IFtdLCBxdWVyeTogIi0tIiB9KTsKICAgIGNsYW1wU2VsZWN0ZWRTZWFyY2hJbmRleChzdGF0ZSk7CgogICAgLy8gUHJlZmVycmVkIHBhdGg6IGRyaXZlIHRoZSBleGlzdGluZyBTZWFyY2hDYXJkIG9uaW5wdXQgaGFuZGxlciAoa2VlcHMgY29ycmVjdCBoYW5kbGVQaWNrUGl6emEgd2lyaW5nKQogICAgaWYgKGlucHV0RWwpewogICAgICB0cnl7CiAgICAgICAgaW5wdXRFbC52YWx1ZSA9ICItLSI7CiAgICAgICAgaW5wdXRFbC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgiaW5wdXQiLCB7IGJ1YmJsZXM6IHRydWUgfSkpOwogICAgICB9IGNhdGNoIChlKSB7fQogICAgfQoKICAgIC8vIE9wdGlvbmFsIHRyYWNlIGhvb2sgKG5vbi1icmVha2luZykKICAgIHRyeXsKICAgICAgc3RhdGUuX19hdXRvRGlzY291bnRSZWFzb24gPSBTdHJpbmcocmVhc29uID8/ICIiKTsKICAgIH0gY2F0Y2ggKGUpIHt9CgogICAgcmV0dXJuIHRydWU7CiAgfQoKICBhc3luYyBmdW5jdGlvbiBvcGVuTG95YWx0eVBvaW50c0VkaXRvcihjYXJkUm9vdCl7CiAgICAvLyBJTVBPUlRBTlQ6CiAgICAvLyAtIFdoZW4gd2UgbG9va3VwIGEgY2xpZW50IGJ5IHBob25lLCB3ZSBoeWRyYXRlIHRoZSBET00gd2l0aG91dCBhIGZ1bGwgcmUtcmVuZGVyLgogICAgLy8gLSBgbGl2ZUNsaWVudGAgaXMgY2FwdHVyZWQgYXQgcmVuZGVyLXRpbWUsIHNvIGl0IGNhbiBiZSBzdGFsZSAoaWQgc3RpbGwgbnVsbCkgZXZlbiBpZgogICAgLy8gICBgc3RhdGUuY2xpZW50YCBoYXMgYmVlbiB1cGRhdGVkIHdpdGggdGhlIGluamVjdGVkIGNsaWVudCAoaW5jbHVkaW5nIGlkKS4KICAgIC8vIEFsd2F5cyByZWFkIHRoZSBsYXRlc3QgY2xpZW50IGZyb20gc3RhdGUgYXQgY2xpY2stdGltZS4KICAgIGNvbnN0IGxhdGVzdENsaWVudCA9CiAgICAgIChzdGF0ZT8uY2xpZW50ICYmIHR5cGVvZiBzdGF0ZS5jbGllbnQgPT09ICJvYmplY3QiKQogICAgICAgID8gc3RhdGUuY2xpZW50CiAgICAgICAgOiAobGl2ZUNsaWVudCAmJiB0eXBlb2YgbGl2ZUNsaWVudCA9PT0gIm9iamVjdCIgPyBsaXZlQ2xpZW50IDoge30pOwoKICAgIC8vIE5lZWQgYSBwZXJzaXN0ZWQgY2xpZW50IGlkIHRvIHVwZGF0ZSBiYWNrZW5kLgogICAgY29uc3QgY2lkID0gTnVtYmVyKGxhdGVzdENsaWVudD8uaWQpOwogICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoY2lkKSB8fCBjaWQgPD0gMCl7CiAgICAgIHRyeSB7IHRvYXN0KCJDbGllbnQgbm9uIGNoYXJnw6kgKGlkIG1hbnF1YW50KSIpOyB9IGNhdGNoIChlKSB7fQogICAgICByZXR1cm47CiAgICB9CiAgICAvLyBJTVBPUlRBTlQ6CiAgICAvLyBUaGUgZWRpdG9yIG11c3QgYWx3YXlzIHdvcmsgZnJvbSB0aGUgUkVBTCBzdG9yZWQgdG90YWwsIG5vdCBmcm9tIHRoZQogICAgLy8gZGlzcGxheSBiYWxhbmNlIChkaXNwbGF5ID0gdG90YWwgLSByZXNlcnZlZCBsb3lhbHR5IHBvaW50cykuCiAgICAvLyBPdGhlcndpc2UsIHdoZW4gYSBsb3lhbHR5IHJld2FyZCBpcyBhbHJlYWR5IHJlc2VydmVkIG9uIHRoZSBvcmRlciwKICAgIC8vIGFkZGluZyArMSBwb2ludCBmcm9tIHRoZSBtb2RhbCB3b3VsZCBpbmNvcnJlY3RseSBvdmVyd3JpdGUgdG90YWwgcG9pbnRzCiAgICAvLyBmcm9tIGRpc3BsYXkrMSAoZS5nLiAwKzEgaW5zdGVhZCBvZiAxMCsxKS4KICAgIGNvbnN0IGN1ciA9IGdldENsaWVudExveWFsdHlUb3RhbFBvaW50cyhsYXRlc3RDbGllbnQpOwoKICAgIGNvbnN0IGRhdGVJU08gPSBTdHJpbmcoc3RhdGU/LnNlbGVjdGVkRGF0ZUlTTyA/PyAiIikudHJpbSgpOwogICAgLy8gRnJvbnQgTVVTVCBzZW5kIHRoZSBzZWxlY3RlZCBQRFYgdG8gdGhlIFBIUCAoImxhbiIgb3IgInBlbCIpLgogICAgLy8gRG8gTk9UIGRlcGVuZCBvbiBzdGF0ZSBzaGFwZTsgYWx3YXlzIHJlYWQgZnJvbSB0aGUgUERWIG1vZHVsZSAoc291cmNlIG9mIHRydXRoKS4KICAgIGxldCBzdG9yZSA9ICIiOwogICAgdHJ5ewogICAgICBzdG9yZSA9IHN0b3JlVG9TdWZmaXgoZ2V0UERWQ3VycmVudCgpKTsgLy8gLT4gImxhbiIgfCAicGVsIgogICAgfSBjYXRjaCAoZSkgewogICAgICBzdG9yZSA9ICIiOwogICAgfQoKICAgIGF3YWl0IGxveWFsdHlQb2ludHNNb2RhbCh7CiAgICAgIHRpdGxlOiAiTW9kaWZpZXIgcG9pbnRzIGZpZMOpbGl0w6kiLAogICAgICBjdXJyZW50UG9pbnRzOiBjdXIsCiAgICAgIG9uU2F2ZTogYXN5bmMgKHBvaW50c05ldykgPT4gewogICAgICAgIGNvbnN0IHBuID0gTnVtYmVyKHBvaW50c05ldyk7CiAgICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocG4pKSByZXR1cm4geyBvazogZmFsc2UsIGVycm9yOiAiVmFsZXVyIGludmFsaWRlIiB9OwogICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHVwZGF0ZUNsaWVudExveWFsdHlQb2ludHMoewogICAgICAgICAgY2xpZW50SWQ6IGNpZCwKICAgICAgICAgIHBvaW50c05ldzogTWF0aC50cnVuYyhwbiksCiAgICAgICAgICBzdG9yZSwKICAgICAgICAgIGRhdGVJU08sCiAgICAgICAgfSk7CiAgICAgICAgaWYgKCFyZXM/Lm9rKXsKICAgICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgZXJyb3I6IHJlcz8uZXJyb3IgfHwgIkltcG9zc2libGUgZGUgbW9kaWZpZXIgbGVzIHBvaW50cyIgfTsKICAgICAgICB9CgogICAgICAgIC8vIFVwZGF0ZSBzdGF0ZSBpbW1lZGlhdGVseSBzbyBwaWxsIHJlLXJlbmRlcnMgY29ycmVjdGx5LgogICAgICAgIGlmICghc3RhdGUgfHwgdHlwZW9mIHN0YXRlICE9PSAib2JqZWN0IikgcmV0dXJuIHsgb2s6IHRydWUgfTsKICAgICAgICBpZiAoIXN0YXRlLmNsaWVudCB8fCB0eXBlb2Ygc3RhdGUuY2xpZW50ICE9PSAib2JqZWN0Iikgc3RhdGUuY2xpZW50ID0ge307CgogICAgICAgIGNvbnN0IHRvdGFsID0gTnVtYmVyLmlzRmluaXRlKE51bWJlcihyZXM/LnBvaW50c190b3RhbCkpID8gTnVtYmVyKHJlcy5wb2ludHNfdG90YWwpIDogTWF0aC50cnVuYyhwbik7CiAgICAgICAgY29uc3QgZGlzcGxheSA9IE51bWJlci5pc0Zpbml0ZShOdW1iZXIocmVzPy5wb2ludHNfZGlzcGxheSkpID8gTnVtYmVyKHJlcy5wb2ludHNfZGlzcGxheSkgOiB0b3RhbDsKICAgICAgICBzdGF0ZS5jbGllbnQucG9pbnRzRmlkVG90YWwgPSB0b3RhbDsKICAgICAgICBzdGF0ZS5jbGllbnQucG9pbnRzRmlkRGlzcGxheSA9IGRpc3BsYXk7CiAgICAgICAgaWYgKE51bWJlci5pc0Zpbml0ZShOdW1iZXIocmVzPy5sb3lhbHR5X3Jlc2VydmVkX3BpenphcykpKSBzdGF0ZS5jbGllbnQubG95YWx0eVJlc2VydmVkUGl6emFzID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcihOdW1iZXIocmVzLmxveWFsdHlfcmVzZXJ2ZWRfcGl6emFzKSkpOwogICAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoTnVtYmVyKHJlcz8ubG95YWx0eV9yZXNlcnZlZF9wb2ludHMpKSkgc3RhdGUuY2xpZW50LmxveWFsdHlSZXNlcnZlZFBvaW50cyA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3IoTnVtYmVyKHJlcy5sb3lhbHR5X3Jlc2VydmVkX3BvaW50cykpKTsKICAgICAgICBzdGF0ZS5jbGllbnQubG95YWx0eVVzZWRTZWxlY3RlZERheSA9IChyZXM/LmxveWFsdHlfdXNlZF9zZWxlY3RlZF9kYXkgPT09IHRydWUpOwoKICAgICAgICAvLyBVcGRhdGUgcGlsbCBET00gaW4gcGxhY2UgKG5vIGZ1bGwgcmUtcmVuZGVyKS4KICAgICAgICB0cnkgeyBzZXRMb3lhbHR5UGlsbChjYXJkUm9vdCwgZGlzcGxheSwgeyBpc0FsZXJ0OiAhIXN0YXRlLmNsaWVudC5sb3lhbHR5VXNlZFNlbGVjdGVkRGF5IH0pOyB9IGNhdGNoIChlKSB7fQoKICAgICAgICByZXR1cm4geyBvazogdHJ1ZSwgcG9pbnRzX3RvdGFsOiB0b3RhbCwgcG9pbnRzX2Rpc3BsYXk6IGRpc3BsYXkgfTsKICAgICAgfSwKICAgIH0pOwoKICAgIC8vIFJlcXVpcmVtZW50OiBhZnRlciBjbG9zaW5nIHRoZSBsb3lhbHR5IG1vZGFsLCBpZiBiYWxhbmNlID49IDEwLCBpbmplY3QgIi0tIiBpbiBzZWFyY2gKICAgIC8vICh3aXRob3V0IG92ZXJ3cml0aW5nIHVzZXIgaW5wdXQpLgogICAgdHJ5ewogICAgICBjb25zdCBsYXRlc3QgPQogICAgICAgIChzdGF0ZT8uY2xpZW50ICYmIHR5cGVvZiBzdGF0ZS5jbGllbnQgPT09ICJvYmplY3QiKQogICAgICAgICAgPyBzdGF0ZS5jbGllbnQKICAgICAgICAgIDogKGxhdGVzdENsaWVudCAmJiB0eXBlb2YgbGF0ZXN0Q2xpZW50ID09PSAib2JqZWN0IiA/IGxhdGVzdENsaWVudCA6IHt9KTsKICAgICAgY29uc3QgcHRzTm93ID0gTnVtYmVyKAogICAgICAgIChsYXRlc3Q/LnBvaW50c0ZpZERpc3BsYXkgIT0gbnVsbCkgPyBsYXRlc3QucG9pbnRzRmlkRGlzcGxheSA6IGxhdGVzdD8ucG9pbnRzRmlkVG90YWwKICAgICAgKTsKICAgICAgY29uc3QgZWxpZ2libGUgPSBOdW1iZXIuaXNGaW5pdGUocHRzTm93KSAmJiBwdHNOb3cgPj0gMTA7CiAgICAgIGlmIChlbGlnaWJsZSl7CiAgICAgICAgaW5qZWN0U2VhcmNoRG91YmxlRGFzaE9uY2UoeyByZWFzb246ICJsb3lhbHR5X21vZGFsX2Nsb3NlIiB9KTsKICAgICAgfQogICAgfSBjYXRjaCAoZSkge30KICB9CgogIC8vIOKUgOKUgCBQaG9uZSBjb21taXQvbG9va3VwIGxvZ2ljIChkZWJvdW5jZSArIEVudGVyICsgYmx1cikg4pSA4pSACiAgbGV0IF9fcGhvbmVEZWJvdW5jZVRpbWVyID0gbnVsbDsKICBsZXQgX19waG9uZUxvb2t1cEluRmxpZ2h0ID0gZmFsc2U7CiAgbGV0IF9faWdub3JlTmV4dFBob25lQmx1ciA9IGZhbHNlOwoKICBmdW5jdGlvbiBzZXRDYXJkSW5wdXRWYWx1ZShjYXJkUm9vdCwga2V5LCB2YWx1ZSl7CiAgICBpZiAoIWNhcmRSb290KSByZXR1cm47CiAgICBjb25zdCBpbnAgPSBjYXJkUm9vdC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1maWVsZC1rZXk9IiR7U3RyaW5nKGtleSl9Il1gKTsKICAgIGlmICghaW5wKSByZXR1cm47CiAgICB0cnkgeyBpbnAudmFsdWUgPSBTdHJpbmcodmFsdWUgPz8gIiIpOyB9IGNhdGNoIChlKSB7fQogIH0KCmZ1bmN0aW9uIGh5ZHJhdGVDbGllbnRJbnRvVUkoY2FyZFJvb3QsIG5ld0NsaWVudCl7CiAgLy8gVXBkYXRlIERPTSB2YWx1ZXMgaW1tZWRpYXRlbHkgKG5vIGZ1bGwgcmUtcmVuZGVyIG9uIHB1cnBvc2UpLgogIGNvbnN0IG5jID0gKG5ld0NsaWVudCAmJiB0eXBlb2YgbmV3Q2xpZW50ID09PSAib2JqZWN0IikgPyBuZXdDbGllbnQgOiB7fTsKICAgIGNvbnN0IHZQdHMgPSAobmMucG9pbnRzRmlkRGlzcGxheSAhPSBudWxsKSA/IG5jLnBvaW50c0ZpZERpc3BsYXkgOiBuYy5wb2ludHNGaWRUb3RhbDsKICAgIHNldExveWFsdHlQaWxsKGNhcmRSb290LCB2UHRzLCB7IGlzQWxlcnQ6ICEhbmMubG95YWx0eVVzZWRTZWxlY3RlZERheSB9KTsKICAgIHNldENhcmRGaWVsZFZhbHVlKGNhcmRSb290LCAidGVsZXBob25lIiwgZm9ybWF0UGhvbmVGb3JEaXNwbGF5KG5jLnRlbGVwaG9uZSkpOwogICAgc2V0Q2FyZEZpZWxkVmFsdWUoY2FyZFJvb3QsICJwcmVub20iLCBuYy5wcmVub20gPz8gIiIpOwogICAgc2V0Q2FyZEZpZWxkVmFsdWUoY2FyZFJvb3QsICJhZHJlc3NlIiwgbmMuYWRyZXNzZSA/PyAiIik7CiAgICBzZXRDYXJkRmllbGRWYWx1ZShjYXJkUm9vdCwgImNvbXBsZW1lbnRBZHJlc3NlIiwgbmMuY29tcGxlbWVudEFkcmVzc2UgPz8gIiIpOwogICAgc2V0Q2FyZEZpZWxkVmFsdWUoY2FyZFJvb3QsICJleHBsaWNhdGlvbnNBZHJlc3NlIiwgbmMuZXhwbGljYXRpb25zQWRyZXNzZSA/PyAiIik7CiAgICBzZXRDYXJkRmllbGRWYWx1ZShjYXJkUm9vdCwgIm51bVBsdXMxIiwgbmMubnVtUGx1czEgPz8gIiIpOwogICAgc2V0Q2FyZEZpZWxkVmFsdWUoY2FyZFJvb3QsICJudW1QbHVzMiIsIG5jLm51bVBsdXMyID8/ICIiKTsKICAgIHNldENhcmRGaWVsZFZhbHVlKGNhcmRSb290LCAiY29kZVBvc3RhbCIsIG5jLmNvZGVQb3N0YWwgPz8gIiIpOwogICAgc2V0Q2FyZEZpZWxkVmFsdWUoY2FyZFJvb3QsICJ2aWxsZSIsIG5jLnZpbGxlID8/ICIiKTsKICAgIHNldENhcmRGaWVsZFZhbHVlKAogICAgICBjYXJkUm9vdCwKICAgICAgImRlbGl2ZXJ5Q2l0eUNob2ljZSIsCiAgICAgIGJ1aWxkQWxsb3dlZERlbGl2ZXJ5Q2l0eUNob2ljZVZhbHVlKGdldEN1cnJlbnRTdG9yZVN1ZmZpeCgpLCBuYy52aWxsZSA/PyAiIiwgbmMuY29kZVBvc3RhbCA/PyAiIikKICAgICk7CiAgc2V0Q2FyZEZpZWxkVmFsdWUoY2FyZFJvb3QsICJwcm9ibGVtZSIsIG5jLnByb2JsZW1lID8/ICIiKTsKICAvLyBFbnN1cmUgYXR0ZW50aW9uIGlzIHN5bmNlZCBldmVuIHdoZW4gVUkgaXMgaHlkcmF0ZWQgd2l0aG91dCBhIGZ1bGwgcmUtcmVuZGVyLgogIHRyeSB7IHNldFByb2JsZW1lQXR0ZW50aW9uKGNhcmRSb290LCBuYy5wcm9ibGVtZSA/PyAiIik7IH0gY2F0Y2ggKGUpIHt9CiAgLy8gU3luYyBTdG9wIFNNUyB0cmktc3RhdGUgc3dpdGNoIChhY2NlcHRlZCB8IG5ldXRyYWwgfCByZWZ1c2VkKQogIHRyeSB7IHNldFN0b3BTbXNTd2l0Y2goY2FyZFJvb3QsIGdldFNtc1N3aXRjaFZpc3VhbFN0YXRlKG5jKSk7IH0gY2F0Y2ggKGUyKSB7fQp9CgogIGZ1bmN0aW9uIG1heWJlQXV0b0luamVjdExveWFsdHlEaXNjb3VudCgpewogICAgaWYgKCFzdGF0ZSB8fCB0eXBlb2Ygc3RhdGUgIT09ICJvYmplY3QiKSByZXR1cm47CiAgICBjb25zdCBjID0gKHN0YXRlLmNsaWVudCAmJiB0eXBlb2Ygc3RhdGUuY2xpZW50ID09PSAib2JqZWN0IikgPyBzdGF0ZS5jbGllbnQgOiB7fTsKICAgIGNvbnN0IHB0cyA9IE51bWJlcihjLnBvaW50c0ZpZERpc3BsYXkgIT0gbnVsbCA/IGMucG9pbnRzRmlkRGlzcGxheSA6IGMucG9pbnRzRmlkVG90YWwpOwogICAgY29uc3QgZWxpZ2libGUgPSBOdW1iZXIuaXNGaW5pdGUocHRzKSAmJiBwdHMgPj0gMTAgJiYgKGMubG95YWx0eVVzZWRTZWxlY3RlZERheSA9PT0gZmFsc2UpOwogICAgaWYgKCFlbGlnaWJsZSkgcmV0dXJuOwogICAgaW5qZWN0U2VhcmNoRG91YmxlRGFzaE9uY2UoeyByZWFzb246ICJjbGllbnRfbG9va3VwX2F1dG9zdWdnZXN0IiB9KTsKICB9CgogIGFzeW5jIGZ1bmN0aW9uIGNvbW1pdFBob25lKGNhcmRSb290LCByYXdJbnB1dCl7CiAgICBpZiAoIXN0YXRlIHx8IHR5cGVvZiBzdGF0ZSAhPT0gIm9iamVjdCIpIHJldHVybjsKICAgIGlmICghc3RhdGUuY2xpZW50IHx8IHR5cGVvZiBzdGF0ZS5jbGllbnQgIT09ICJvYmplY3QiKSBzdGF0ZS5jbGllbnQgPSB7fTsKCiAgICBjb25zdCByYXcgPSBTdHJpbmcocmF3SW5wdXQgPz8gIiIpLnRyaW0oKTsKICAgIGlmICghcmF3KXsKICAgICAgLy8gQ2xlYXIgcGhvbmUgKGRvIG5vdCBsb29rdXApCiAgICAgIHN0YXRlLmNsaWVudC50ZWxlcGhvbmUgPSAiIjsKICAgICAgc2V0Q2FyZElucHV0VmFsdWUoY2FyZFJvb3QsICJ0ZWxlcGhvbmUiLCAiIik7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBQYXJzZSArIHZhbGlkYXRlIEJFRk9SRSBhbnkgZmV0Y2ggdG8gYXZvaWQgc3BhbW1pbmcgdGhlIEFQSSB3aGlsZSB0eXBpbmcuCiAgICAvLyBSdWxlczoKICAgIC8vIC0gRlIgdmFsaWQ6IDMzICsgOSBkaWdpdHMKICAgIC8vIC0gSU5UTCB2YWxpZDogNi4uMTUgZGlnaXRzIEFORCB1c2VyIHByb3ZpZGVkIGFuIGludGwgcHJlZml4ICgrIG9yIDAwKQogICAgY29uc3QgcGFyc2VkID0gcGFyc2VBbmRWYWxpZGF0ZVBob25lKHJhdyk7CiAgICBpZiAoIXBhcnNlZD8uaXNWYWxpZCkgcmV0dXJuOwogICAgY29uc3QgZGlnaXRzRGIgPSBTdHJpbmcocGFyc2VkLmRpZ2l0cyA/PyAiIikudHJpbSgpOwogICAgaWYgKCFkaWdpdHNEYikgcmV0dXJuOwoKICAgIC8vIFJlc2V0IGR1cGxpY2F0ZS1vcmRlciBwcm9tcHQga2V5IGlmIHVzZXIgYWN0dWFsbHkgY2hhbmdlZCB0aGUgcGhvbmUuCiAgICB0cnl7CiAgICAgIGNvbnN0IHByZXYgPSBTdHJpbmcoc3RhdGUuX19sYXN0Q29tbWl0dGVkUGhvbmVEaWdpdHMgPz8gIiIpOwogICAgICBpZiAocHJldiAmJiBwcmV2ICE9PSBTdHJpbmcoZGlnaXRzRGIpKSBzdGF0ZS5fX2R1cE9yZGVyUHJvbXB0S2V5ID0gbnVsbDsKICAgICAgc3RhdGUuX19sYXN0Q29tbWl0dGVkUGhvbmVEaWdpdHMgPSBTdHJpbmcoZGlnaXRzRGIpOwogICAgfSBjYXRjaCAoZSkge30KCiAgICAvLyBQZXJzaXN0IG5vcm1hbGl6ZWQgZGlnaXRzIGluIHN0YXRlIChEQi9zZWFyY2ggZm9ybWF0KS4KICAgIC8vIElNUE9SVEFOVDogcGhvbmUgY29tbWl0IC8gbG9va3VwIG11c3QgbmV2ZXIgcmVzZXQgb3IgZm9yY2UgY291cGUvbGl2cmFpc29uLgogICAgc3RhdGUuY2xpZW50LnRlbGVwaG9uZSA9IGRpZ2l0c0RiOwogICAgLy8gUmVmb3JtYXQgVUkgb25seSBhdCBjb21taXQgdGltZQogICAgc2V0Q2FyZEZpZWxkVmFsdWUoY2FyZFJvb3QsICJ0ZWxlcGhvbmUiLCBmb3JtYXRQaG9uZUZvckRpc3BsYXkoZGlnaXRzRGIpKTsKCiAgICAvLyBJTVBPUlRBTlQ6IG1vdmUgZm9jdXMgYXdheSBmcm9tIHBob25lIGltbWVkaWF0ZWx5IHNvIHVzZXIgY2xpY2tzIHdvbid0IHJldHJpZ2dlciBjb21taXQgdmlhIGJsdXIuCiAgICAvLyBHdWFyZCBhZ2FpbnN0IHRoZSBwcm9ncmFtbWF0aWMgZm9jdXMgaXRzZWxmIGNhdXNpbmcgYSBibHVyLT5jb21taXQgbG9vcC4KICAgIF9faWdub3JlTmV4dFBob25lQmx1ciA9IHRydWU7CiAgICB0cnkgeyByZXF1ZXN0U2VhcmNoRm9jdXMoKTsgfSBjYXRjaCAoZSkge30KCiAgICBpZiAoX19waG9uZUxvb2t1cEluRmxpZ2h0KSByZXR1cm47CiAgICBfX3Bob25lTG9va3VwSW5GbGlnaHQgPSB0cnVlOwogICAgdHJ5ewogICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaENsaWVudEJ5UGhvbmUoZGlnaXRzRGIsIHsgZGF0ZUlTTzogc3RhdGU/LnNlbGVjdGVkRGF0ZUlTTyB9KTsKICAgICAgaWYgKHJlcz8ub2sgJiYgcmVzPy5mb3VuZCAmJiByZXM/LmNsaWVudCAmJiB0eXBlb2YgcmVzLmNsaWVudCA9PT0gIm9iamVjdCIpewogICAgICAgIGNvbnN0IGluamVjdGVkID0gYnVpbGRJbmplY3RlZENsaWVudEZyb21BcGkocmVzLmNsaWVudCk7CiAgICAgICAgLy8gRW5zdXJlIHRoZSBub3JtYWxpemVkIHBob25lIGlzIGtlcHQgKGV2ZW4gaWYgQVBJIHJvdyBoYXMgYW5vdGhlciByYXcgc2hhcGUpCiAgICAgICAgaW5qZWN0ZWQudGVsZXBob25lID0gZGlnaXRzRGI7CiAgICAgICAgLy8gS2VlcCBzdG9wX3NtcyB3aXRob3V0IGRlcGVuZGluZyBvbiBidWlsZEluamVjdGVkQ2xpZW50RnJvbUFwaSBtYXBwaW5nIChkZWZlbnNpdmUpLgogICAgICAgIGluamVjdGVkLnN0b3BTbXMgPSByZWFkU3RvcFNtc1ZhbHVlKHJlcy5jbGllbnQpOwogICAgICAgIHN5bmNJbmplY3RlZENsaWVudERlbGl2ZXJ5U3RhdGUoaW5qZWN0ZWQsIGdldEN1cnJlbnRTdG9yZVN1ZmZpeCgpKTsKICAgICAgICBzdGF0ZS5jbGllbnQgPSBpbmplY3RlZDsKICAgICAgICBjb25zdCB2UHRzID0gKGluamVjdGVkLnBvaW50c0ZpZERpc3BsYXkgIT0gbnVsbCkgPyBpbmplY3RlZC5wb2ludHNGaWREaXNwbGF5IDogaW5qZWN0ZWQucG9pbnRzRmlkVG90YWw7CiAgICAgICAgc2V0TG95YWx0eVBpbGwoY2FyZFJvb3QsIHZQdHMsIHsgaXNBbGVydDogISFpbmplY3RlZC5sb3lhbHR5VXNlZFNlbGVjdGVkRGF5IH0pOwogICAgICAgIGh5ZHJhdGVDbGllbnRJbnRvVUkoY2FyZFJvb3QsIGluamVjdGVkKTsKICAgICAgICAvLyBBdXRvLXByb3Bvc2UgbG95YWx0eSBkaXNjb3VudCBpZiBlbGlnaWJsZSAocG9pbnRzID49IDEwIGFuZCBub3QgdXNlZCB0aGlzIGRheSkKICAgICAgICAvLyBNdXN0IGhhcHBlbiBBRlRFUiBjbGllbnQgaHlkcmF0aW9uIHNvIGNvbmRpdGlvbiB1c2VzIGZyZXNoIGJhY2tlbmQgZmxhZ3MuCiAgICAgICAgdHJ5IHsgbWF5YmVBdXRvSW5qZWN0TG95YWx0eURpc2NvdW50KCk7IH0gY2F0Y2ggKGUpIHt9CiAgICAgIH0gZWxzZSBpZiAocmVzPy5vayAmJiByZXM/LmZvdW5kID09PSBmYWxzZSl7CiAgICAgICAgLy8gS2VlcCBub3JtYWxpemVkIHBob25lLCBjbGVhciBvdGhlciBmaWVsZHMgKHJlYWR5IHRvIGNyZWF0ZSBuZXcgY2xpZW50IGxhdGVyKS4KICAgICAgICAvLyBJTVBPUlRBTlQ6IHRoaXMgaXMgc3RpbGwgdGhlIHNhbWUgY3VycmVudCBvcmRlciBjb250ZXh0LCBzbyB3ZSBkbyBub3QgdG91Y2gKICAgICAgICAvLyBjb3VwZS9saXZyYWlzb24gaGVyZS4KICAgICAgICBjb25zdCBrZWVwUGhvbmUgPSBkaWdpdHNEYjsKICAgICAgICBjb25zdCBjbGVhcmVkID0gewogICAgICAgICAgdGVsZXBob25lOiBrZWVwUGhvbmUsCiAgICAgICAgICBwb2ludHNGaWRUb3RhbDogbnVsbCwKICAgICAgICAgIHBvaW50c0ZpZERpc3BsYXk6IG51bGwsCiAgICAgICAgICBsb3lhbHR5UmVzZXJ2ZWRQaXp6YXM6IDAsCiAgICAgICAgICBsb3lhbHR5UmVzZXJ2ZWRQb2ludHM6IDAsCiAgICAgICAgICBsb3lhbHR5VXNlZFNlbGVjdGVkRGF5OiBmYWxzZSwKICAgICAgICAgIHByZW5vbTogIiIsCiAgICAgICAgICBhZHJlc3NlOiAiIiwKICAgICAgICAgIGNvbXBsZW1lbnRBZHJlc3NlOiAiIiwKICAgICAgICAgIGV4cGxpY2F0aW9uc0FkcmVzc2U6ICIiLAogICAgICAgICAgbnVtUGx1czE6ICIiLAogICAgICAgICAgbnVtUGx1czI6ICIiLAogICAgICAgICAgY29kZVBvc3RhbDogIiIsCiAgICAgICAgICB2aWxsZTogIiIsCiAgICAgICAgICBkZWxpdmVyeUNpdHlDaG9pY2U6ICIiLAogICAgICAgICAgZGVsaXZlcnlDaXR5UGVyc2lzdGVkQ29kZVBvc3RhbDogIiIsCiAgICAgICAgICBkZWxpdmVyeUNpdHlQZXJzaXN0ZWRWaWxsZTogIiIsCiAgICAgICAgICBwcm9ibGVtZTogIiIsCiAgICAgICAgICBzdG9wU21zOiAwLAogICAgICAgIH07CiAgICAgICAgc3RhdGUuY2xpZW50ID0gY2xlYXJlZDsKICAgICAgICBzZXRMb3lhbHR5UGlsbChjYXJkUm9vdCwgbnVsbCk7CiAgICAgICAgaHlkcmF0ZUNsaWVudEludG9VSShjYXJkUm9vdCwgY2xlYXJlZCk7CiAgICAgICAgLy8gTm90IGVsaWdpYmxlIGFueXdheSwgYnV0IGVuc3VyZSB3ZSBkb24ndCBrZWVwIGFuICJhdXRvIGluamVjdGVkIiBmbGFnIHN0dWNrCiAgICAgICAgc3RhdGUuYXV0b0Rpc2NvdW50SW5qZWN0ZWQgPSBmYWxzZTsKICAgICAgICB0cnkgeyB0b2FzdCgiQ2xpZW50IGludHJvdXZhYmxlIik7IH0gY2F0Y2ggKGUpIHt9CiAgICAgIH0KCiAgICAgIC8vIOKUgOKUgCBORVc6IGRldGVjdCBleGlzdGluZyBvcmRlcnMgZm9yIHRoaXMgcGhvbmUgInRvZGF5IiBvbiBjdXJyZW50IFBEViDilIDilIAKICAgICAgLy8gVHJpZ2dlcmVkIG9uIGNvbW1pdCAoRW50ZXIvYmx1ciksIGV4YWN0bHkgbGlrZSBjbGllbnQgbG9va3VwLgogICAgICB0cnl7CiAgICAgICAgYXdhaXQgZW5zdXJlTm9EdXBsaWNhdGVUb2RheU9yZGVyKHsgc3RhdGUsIHBob25lRGlnaXRzOiBkaWdpdHNEYiB9KTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIC8vIFNpbGVudDogZG8gbm90IGJsb2NrIHRoZSBub3JtYWwgZmxvdyBvbiB0cmFuc2llbnQgaXNzdWVzCiAgICAgIH0KICAgIH0gY2F0Y2ggKGUpewogICAgICAvLyBTaWxlbnQtaXNoOiBrZWVwIHBob25lLCBubyBjcmFzaAogICAgfSBmaW5hbGx5IHsKICAgICAgX19waG9uZUxvb2t1cEluRmxpZ2h0ID0gZmFsc2U7CiAgICB9CiAgfQoKICBhc3luYyBmdW5jdGlvbiBzYXZlQ2xpZW50UHJvYmxlbWUoY2FyZFJvb3QsIGJ0bkVsKXsKICAgIGNvbnN0IGxhdGVzdENsaWVudCA9CiAgICAgIChzdGF0ZT8uY2xpZW50ICYmIHR5cGVvZiBzdGF0ZS5jbGllbnQgPT09ICJvYmplY3QiKQogICAgICAgID8gc3RhdGUuY2xpZW50CiAgICAgICAgOiAobGl2ZUNsaWVudCAmJiB0eXBlb2YgbGl2ZUNsaWVudCA9PT0gIm9iamVjdCIgPyBsaXZlQ2xpZW50IDoge30pOwoKICAgIGNvbnN0IGNpZCA9IE51bWJlcihsYXRlc3RDbGllbnQ/LmlkKTsKICAgIGlmICghTnVtYmVyLmlzRmluaXRlKGNpZCkgfHwgY2lkIDw9IDApewogICAgICB0cnkgeyB0b2FzdCgiQXVjdW4gY2xpZW50IGNoYXJnw6kgKGlkIG1hbnF1YW50KSIsIHsgYW5jaG9yRWw6IGJ0bkVsLCBwbGFjZW1lbnQ6ICJ0b3AiIH0pOyB9IGNhdGNoIChlKSB7fQogICAgICByZXR1cm47CiAgICB9CgogICAgLy8gUHJlZmVyIHN0YXRlIHZhbHVlOyBmYWxsYmFjayB0byBET00gdmFsdWUgKGRlZmVuc2l2ZSkuCiAgICBsZXQgcmF3ID0gIiI7CiAgICB0cnkgeyByYXcgPSBTdHJpbmcobGF0ZXN0Q2xpZW50Py5wcm9ibGVtZSA/PyAiIik7IH0gY2F0Y2ggKGUpIHsgcmF3ID0gIiI7IH0KICAgIGlmICghcmF3ICYmIGNhcmRSb290KXsKICAgICAgdHJ5ewogICAgICAgIGNvbnN0IGlucCA9IGNhcmRSb290LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W2RhdGEtZmllbGQta2V5PSJwcm9ibGVtZSJdJyk7CiAgICAgICAgcmF3ID0gU3RyaW5nKGlucD8udmFsdWUgPz8gIiIpOwogICAgICB9IGNhdGNoIChlMikge30KICAgIH0KCiAgICBjb25zdCB0cmltbWVkID0gU3RyaW5nKHJhdyA/PyAiIikudHJpbSgpOwogICAgY29uc3QgcHJvYmxlbWUgPSB0cmltbWVkID8gdHJpbW1lZCA6IG51bGw7IC8vIGV4cGxpY2l0IGNsZWFyIHdoZW4gZW1wdHkKCiAgICAvLyBVWDogZGlzYWJsZSB3aGlsZSBzYXZpbmcgKHByZXZlbnRzIGRvdWJsZSBjbGljaykKICAgIHRyeXsKICAgICAgaWYgKGJ0bkVsKSB7CiAgICAgICAgYnRuRWwuZGlzYWJsZWQgPSB0cnVlOwogICAgICAgIGJ0bkVsLnNldEF0dHJpYnV0ZSgiYXJpYS1idXN5IiwgInRydWUiKTsKICAgICAgfQogICAgfSBjYXRjaCAoZSkge30KCiAgICB0cnl7CiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdXBkYXRlQ2xpZW50UHJvYmxlbWUoeyBjbGllbnRJZDogY2lkLCBwcm9ibGVtZSB9KTsKICAgICAgICBpZiAoIXJlcz8ub2spewogICAgICAgICAgdHJ5IHsgdG9hc3QocmVzPy5lcnJvciB8fCAiSW1wb3NzaWJsZSBkZSBtZXR0cmUgw6Agam91ciIsIHsgYW5jaG9yRWw6IGJ0bkVsLCBwbGFjZW1lbnQ6ICJ0b3AiIH0pOyB9IGNhdGNoIChlKSB7fQogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgIC8vIFBlcnNpc3QgaW4gc3RhdGUgKyBzeW5jIERPTSAobm8gZnVsbCByZS1yZW5kZXIpLgogICAgICAgIGlmICghc3RhdGUuY2xpZW50IHx8IHR5cGVvZiBzdGF0ZS5jbGllbnQgIT09ICJvYmplY3QiKSBzdGF0ZS5jbGllbnQgPSB7fTsKICAgICAgICBzdGF0ZS5jbGllbnQucHJvYmxlbWUgPSAocmVzPy5wcm9ibGVtZSA9PSBudWxsKSA/ICIiIDogU3RyaW5nKHJlcy5wcm9ibGVtZSk7CiAgICAgICAgdHJ5IHsgc2V0Q2FyZEZpZWxkVmFsdWUoY2FyZFJvb3QsICJwcm9ibGVtZSIsIHN0YXRlLmNsaWVudC5wcm9ibGVtZSk7IH0gY2F0Y2ggKGUpIHt9CiAgICAgICAgdHJ5IHsgc2V0UHJvYmxlbWVBdHRlbnRpb24oY2FyZFJvb3QsIHN0YXRlLmNsaWVudC5wcm9ibGVtZSk7IH0gY2F0Y2ggKGUpIHt9CgogICAgICAgIHRyeSB7IHRvYXN0KCJQcm9ibMOobWUgbWlzIMOgIGpvdXIiLCB7IGFuY2hvckVsOiBidG5FbCwgcGxhY2VtZW50OiAidG9wIiB9KTsgfSBjYXRjaCAoZSkge30KICAgIH0gY2F0Y2ggKGUpewogICAgICB0cnkgeyB0b2FzdCgiRXJyZXVyIHLDqXNlYXUgKE1BSiBwcm9ibMOobWUpIiwgeyBhbmNob3JFbDogYnRuRWwsIHBsYWNlbWVudDogInRvcCIgfSk7IH0gY2F0Y2ggKF9lKSB7fQogICAgfSBmaW5hbGx5IHsKICAgICAgdHJ5ewogICAgICAgIGlmIChidG5FbCkgewogICAgICAgICAgYnRuRWwuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgIGJ0bkVsLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1idXN5Iik7CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlKSB7fQogICAgfQogIH0KCiAgZnVuY3Rpb24gc3R1YlJlY292ZXJBbnN3ZXJlZENhbGwoKXsKICAgIC8vIEZhbGxiYWNrIG9ubHk6IGlmIGNhbGxiYWNrIGlzbid0IHByb3ZpZGVkLCBrZWVwIGEgaGFybWxlc3MgVVggbWVzc2FnZS4KICAgIHRyeSB7IHRvYXN0KCJSw6ljdXDDqXJhdGlvbiBPVkggOiBpbmRpc3BvbmlibGUiKTsgfSBjYXRjaCAoZSkge30KICB9CgpmdW5jdGlvbiBwaG9uZUZpZWxkKHsgcGxhY2Vob2xkZXIsIHZhbHVlLCBzdGF0ZSB9ID0ge30pewogIGNvbnN0IGhhc1ZhbHVlID0gU3RyaW5nKHZhbHVlID8/ICIiKS50cmltKCkubGVuZ3RoID4gMDsKICBjb25zdCB3cmFwID0gZWwoImRpdiIsIHsgY2xhc3M6IGBmaWVsZCBmaWVsZC0tcGhvbmUke2hhc1ZhbHVlID8gIiIgOiAiIGZpZWxkLS1lbXB0eSJ9YCB9LCBbCiAgICAvLyBTaW5nbGUgZmllbGQ6IGlucHV0ICsgaW50ZWdyYXRlZCByaWdodCBhY3Rpb24gKHJlZnJlc2gpIGluc2lkZSB0aGUgZmllbGQuCiAgICBlbCgiZGl2IiwgeyBjbGFzczogImZpZWxkX19pbmJ0biBmaWVsZF9faW5idG4tLXBob25lIiB9LCBbCiAgICAgIGVsKCJpbnB1dCIsIHsKICAgICAgICBjbGFzczogImlucHV0IGlucHV0LS1wbGFjZWhvbGRlci1sZyBmaWVsZF9faW5idG4taW5wdXQiLAogICAgICAgIHZhbHVlOiBTdHJpbmcodmFsdWUgPz8gIiIpLAogICAgICAgIC8vIEFsd2F5cyBrZWVwIHRoZSBsYWJlbCBhcyBwbGFjZWhvbGRlciBzbyBpdCByZWFwcGVhcnMgaWYgdGhlIHVzZXIgY2xlYXJzIHRoZSBmaWVsZC4KICAgICAgICBwbGFjZWhvbGRlcjogU3RyaW5nKHBsYWNlaG9sZGVyID8/ICIiKSwKICAgICAgICBkYXRhc2V0OiB7IGZpZWxkS2V5OiAidGVsZXBob25lIiB9LAogICAgICAgICJhcmlhLWxhYmVsIjogU3RyaW5nKHBsYWNlaG9sZGVyID8/ICIiKSwKICAgICAgfSksCiAgICAgIGVsKCJidXR0b24iLCB7CiAgICAgICAgdHlwZTogImJ1dHRvbiIsCiAgICAgICAgY2xhc3M6ICJmaWVsZF9faW5idG4tYnRuIHBob25lLWFjdGlvbi1idG4gcGhvbmUtYWN0aW9uLWJ0bi0taWNvbiIsCiAgICAgICAgdGl0bGU6ICJSw6ljdXDDqXJlciBhcHBlbCIsCiAgICAgICAgImFyaWEtbGFiZWwiOiAiUsOpY3Vww6lyZXIgYXBwZWwiLAogICAgICAgIG9uQ2xpY2s6IChlKSA9PiB7CiAgICAgICAgICAgIC8vIERvIG5vdCBpbnRlcmZlcmUgd2l0aCBleGlzdGluZyBwaG9uZSBjb21taXQvbG9va3VwIGxvZ2ljLgogICAgICAgICAgICB0cnkgeyBlPy5wcmV2ZW50RGVmYXVsdD8uKCk7IH0gY2F0Y2ggKGUyKSB7fQogICAgICAgICAgICBpZiAodHlwZW9mIG9uUmVjb3ZlckNhbGwgPT09ICJmdW5jdGlvbiIpewogICAgICAgICAgICAgIHRyeSB7IG9uUmVjb3ZlckNhbGwoKTsgfSBjYXRjaCAoZTMpIHt9CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0dWJSZWNvdmVyQW5zd2VyZWRDYWxsKCk7CiAgICAgICAgICB9LAogICAgICAgIH0sIFsKICAgICAgICAgIHN2Z0ljb24oInJlZnJlc2giKSwKICAgICAgICAgIGVsKCJzcGFuIiwgeyBjbGFzczogInNyLW9ubHkiIH0sICJSw6ljdXDDqXJlciBhcHBlbCIpLAogICAgICAgIF0pLAogICAgICBdKSwKICAgIF0pOwoKICAgIGNvbnN0IGlucCA9IHdyYXAucXVlcnlTZWxlY3RvcigiaW5wdXQiKTsKICAgIGlmICghaW5wKSByZXR1cm4gd3JhcDsKCiAgICBpbnAuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLCAoZSkgPT4gewogICAgICBjb25zdCB2ID0gZT8udGFyZ2V0Py52YWx1ZSA/PyAiIjsKICAgICAgaWYgKCFzdGF0ZSB8fCB0eXBlb2Ygc3RhdGUgIT09ICJvYmplY3QiKSByZXR1cm47CiAgICAgIGlmICghc3RhdGUuY2xpZW50IHx8IHR5cGVvZiBzdGF0ZS5jbGllbnQgIT09ICJvYmplY3QiKSBzdGF0ZS5jbGllbnQgPSB7fTsKICAgICAgLy8gV2hpbGUgdHlwaW5nOiBzdG9yZSByYXcgKGRvIG5vdCByZWZvcm1hdDsgYXZvaWQgY3Vyc29yIGp1bXBzKQogICAgICBzdGF0ZS5jbGllbnQudGVsZXBob25lID0gU3RyaW5nKHYpOwogICAgICAvLyBLZWVwIGVtcHR5L25vbi1lbXB0eSB2aXN1YWwgc3RhdGUgaW4gc3luYyB3aXRob3V0IGEgZnVsbCByZS1yZW5kZXIuCiAgICAgIHRyeXsKICAgICAgICBjb25zdCBmaWVsZFJvb3QgPSBpbnAuY2xvc2VzdCgiLmZpZWxkIikgfHwgaW5wLnBhcmVudEVsZW1lbnQ7CiAgICAgICAgaWYgKGZpZWxkUm9vdCkgZmllbGRSb290LmNsYXNzTGlzdC50b2dnbGUoImZpZWxkLS1lbXB0eSIsICFpc05vbkVtcHR5KHYpKTsKICAgICAgfSBjYXRjaCAoZTMpIHt9CiAgICAgIGlmIChfX3Bob25lRGVib3VuY2VUaW1lcil7CiAgICAgICAgdHJ5IHsgY2xlYXJUaW1lb3V0KF9fcGhvbmVEZWJvdW5jZVRpbWVyKTsgfSBjYXRjaCAoZTIpIHt9CiAgICAgICAgX19waG9uZURlYm91bmNlVGltZXIgPSBudWxsOwogICAgICB9CiAgICAgIF9fcGhvbmVEZWJvdW5jZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgX19waG9uZURlYm91bmNlVGltZXIgPSBudWxsOwogICAgICAgIGNvbW1pdFBob25lKGNhcmRFbCwgaW5wLnZhbHVlKTsKICAgICAgfSwgNjUwKTsKICAgIH0pOwoKICAgIGlucC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgKGUpID0+IHsKICAgICAgaWYgKCFlKSByZXR1cm47CiAgICAgIGlmIChlLmtleSA9PT0gIkVudGVyIil7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGlmIChfX3Bob25lRGVib3VuY2VUaW1lcil7CiAgICAgICAgICB0cnkgeyBjbGVhclRpbWVvdXQoX19waG9uZURlYm91bmNlVGltZXIpOyB9IGNhdGNoIChlMikge30KICAgICAgICAgIF9fcGhvbmVEZWJvdW5jZVRpbWVyID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgY29tbWl0UGhvbmUoY2FyZEVsLCBpbnAudmFsdWUpOwogICAgICB9CiAgICB9KTsKCiAgICBpbnAuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsICgpID0+IHsKICAgICAgaWYgKF9faWdub3JlTmV4dFBob25lQmx1cil7CiAgICAgICAgX19pZ25vcmVOZXh0UGhvbmVCbHVyID0gZmFsc2U7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChfX3Bob25lRGVib3VuY2VUaW1lcil7CiAgICAgICAgdHJ5IHsgY2xlYXJUaW1lb3V0KF9fcGhvbmVEZWJvdW5jZVRpbWVyKTsgfSBjYXRjaCAoZTIpIHt9CiAgICAgICAgX19waG9uZURlYm91bmNlVGltZXIgPSBudWxsOwogICAgICB9CiAgICAgIGNvbW1pdFBob25lKGNhcmRFbCwgaW5wLnZhbHVlKTsKICAgIH0pOwoKICAgIHJldHVybiB3cmFwOwogIH0KCiAgY29uc3QgZGVsaXZlcnlGaWVsZHMgPSBlbCgiZGl2IiwgeyBjbGFzczogImRlbGl2ZXJ5LWZpZWxkcyIsICJkYXRhLXZpc2libGUiOiBzdGF0ZS5saXZyYWlzb24gPyAiMSIgOiAiMCIgfSwgWwogICAgZWwoImRpdiIsIHsgY2xhc3M6ICJkaXZpZGVyIiB9KSwKICAgIGZpZWxkKHsga2V5OiAiYWRyZXNzZSIsIHBsYWNlaG9sZGVyOiAiQWRyZXNzZSIsIHZhbHVlOiBsaXZlQ2xpZW50LmFkcmVzc2UsIHN0YXRlIH0pLAogICAgZmllbGQoeyBrZXk6ICJjb21wbGVtZW50QWRyZXNzZSIsIHBsYWNlaG9sZGVyOiAiQ29tcGzDqW1lbnQgZOKAmWFkcmVzc2UiLCB2YWx1ZTogbGl2ZUNsaWVudC5jb21wbGVtZW50QWRyZXNzZSwgc3RhdGUgfSksCiAgICBmaWVsZCh7IGtleTogImV4cGxpY2F0aW9uc0FkcmVzc2UiLCBwbGFjZWhvbGRlcjogIkV4cGxpY2F0aW9ucyBzdXIgYWRyZXNzZSIsIHZhbHVlOiBsaXZlQ2xpZW50LmV4cGxpY2F0aW9uc0FkcmVzc2UsIHN0YXRlIH0pLAogICAgZmllbGQoeyBrZXk6ICJudW1QbHVzMSIsIHBsYWNlaG9sZGVyOiAiTnVtKzEiLCB2YWx1ZTogbGl2ZUNsaWVudC5udW1QbHVzMSwgc3RhdGUgfSksCiAgICBmaWVsZCh7IGtleTogIm51bVBsdXMyIiwgcGxhY2Vob2xkZXI6ICJOdW0rMiIsIHZhbHVlOiBsaXZlQ2xpZW50Lm51bVBsdXMyLCBzdGF0ZSB9KSwKICAgIHNlbGVjdEZpZWxkKHsKICAgICAga2V5OiAiZGVsaXZlcnlDaXR5Q2hvaWNlIiwKICAgICAgcGxhY2Vob2xkZXI6ICJDb2RlIHBvc3RhbCAtIFZpbGxlIiwKICAgICAgdmFsdWU6IGJ1aWxkQWxsb3dlZERlbGl2ZXJ5Q2l0eUNob2ljZVZhbHVlKGdldEN1cnJlbnRTdG9yZVN1ZmZpeCgpLCBsaXZlQ2xpZW50LnZpbGxlLCBsaXZlQ2xpZW50LmNvZGVQb3N0YWwpLAogICAgICBvcHRpb25zOiBnZXRBbGxvd2VkQ2l0eUNob2ljZU9wdGlvbnMoZ2V0Q3VycmVudFN0b3JlU3VmZml4KCkpLAogICAgICBzdGF0ZSwKICAgICAgaW52YWxpZGF0ZVRyYXZlbENoZWNrS2luZDogImNsaWVudCIsCiAgICAgIG9uQ2hhbmdlOiAoY2hvaWNlVmFsdWUpID0+IHsKICAgICAgICBjb25zdCByb3cgPSBmaW5kQWxsb3dlZENpdHlDaG9pY2VCeVZhbHVlKGdldEN1cnJlbnRTdG9yZVN1ZmZpeCgpLCBjaG9pY2VWYWx1ZSk7CiAgICAgICAgaWYgKCFzdGF0ZSB8fCB0eXBlb2Ygc3RhdGUgIT09ICJvYmplY3QiKSByZXR1cm47CiAgICAgICAgaWYgKCFzdGF0ZS5jbGllbnQgfHwgdHlwZW9mIHN0YXRlLmNsaWVudCAhPT0gIm9iamVjdCIpIHN0YXRlLmNsaWVudCA9IHt9OwogICAgICAgIGNvbnN0IHBlcnNpc3RlZFBvc3RhbCA9IFN0cmluZyhzdGF0ZS5jbGllbnQuZGVsaXZlcnlDaXR5UGVyc2lzdGVkQ29kZVBvc3RhbCA/PyBzdGF0ZS5jbGllbnQuY29kZVBvc3RhbCA/PyAiIik7CiAgICAgICAgY29uc3QgcGVyc2lzdGVkQ2l0eSA9IFN0cmluZyhzdGF0ZS5jbGllbnQuZGVsaXZlcnlDaXR5UGVyc2lzdGVkVmlsbGUgPz8gc3RhdGUuY2xpZW50LnZpbGxlID8/ICIiKTsKICAgICAgICBzdGF0ZS5jbGllbnQuZGVsaXZlcnlDaXR5Q2hvaWNlID0gcm93ID8gU3RyaW5nKGNob2ljZVZhbHVlIHx8ICIiKSA6ICIiOwogICAgICAgIHN0YXRlLmNsaWVudC5jb2RlUG9zdGFsID0gcm93ID8gU3RyaW5nKHJvdy5wb3N0YWxDb2RlIHx8ICIiKSA6IHBlcnNpc3RlZFBvc3RhbDsKICAgICAgICBzdGF0ZS5jbGllbnQudmlsbGUgPSByb3cgPyBTdHJpbmcocm93LmNpdHkgfHwgIiIpIDogcGVyc2lzdGVkQ2l0eTsKICAgICAgfSwKICAgIH0pLAogICAgZGVsaXZlcnlUcmF2ZWxDaGVja0Jsb2NrKCJjbGllbnQiKSwKICBdKTsKCiAgLy8gVG9nZ2xlIHZpc2liaWxpdHkgdmlhIGlubGluZSBzdHlsZSAoc2ltcGxlIFVJLW9ubHkgaW50ZXJhY3Rpb24pCiAgZGVsaXZlcnlGaWVsZHMuc3R5bGUuZGlzcGxheSA9IHN0YXRlLmxpdnJhaXNvbiA/ICJibG9jayIgOiAibm9uZSI7CgogIGNvbnN0IHRlbXBvcmFyeURlbGl2ZXJ5VG9nZ2xlID0gZWwoImRpdiIsIHsKICAgIGNsYXNzOiAic3dpdGNoLXJvdyIsCiAgICBkYXRhc2V0OiB7IHJvbGU6ICJ0ZW1wb3JhcnktZGVsaXZlcnktYWRkcmVzcy10b2dnbGUtcm93IiB9LAogIH0sIFsKICAgIGVsKCJkaXYiLCB7IGNsYXNzOiAibmFtZSIgfSwgIkFkcmVzc2UgcHJvdmlzb2lyZSBwb3VyIGNldHRlIGNvbW1hbmRlIiksCiAgICBlbCgiaW5wdXQiLCB7CiAgICAgIHR5cGU6ICJjaGVja2JveCIsCiAgICAgIGNoZWNrZWQ6ICEhdGVtcERlbGl2ZXJ5LmVuYWJsZWQsCiAgICAgIGRhdGFzZXQ6IHsgcm9sZTogInRlbXBvcmFyeS1kZWxpdmVyeS1hZGRyZXNzLXRvZ2dsZSIgfSwKICAgICAgb25DaGFuZ2U6IChlKSA9PiB7CiAgICAgICAgaWYgKCFzdGF0ZSB8fCB0eXBlb2Ygc3RhdGUgIT09ICJvYmplY3QiKSByZXR1cm47CiAgICAgICAgaWYgKCFzdGF0ZS50ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MgfHwgdHlwZW9mIHN0YXRlLnRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcyAhPT0gIm9iamVjdCIpewogICAgICAgICAgc3RhdGUudGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzID0geyBlbmFibGVkOiBmYWxzZSB9OwogICAgICAgIH0KICAgICAgICBzdGF0ZS50ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MuZW5hYmxlZCA9ICEhZT8udGFyZ2V0Py5jaGVja2VkOwogICAgICAgIGNvbnN0IGJsb2NrID0gY2FyZEVsPy5xdWVyeVNlbGVjdG9yPy4oJ1tkYXRhLXJvbGU9InRlbXBvcmFyeS1kZWxpdmVyeS1hZGRyZXNzLWJsb2NrIl0nKTsKICAgICAgICBpZiAoYmxvY2spewogICAgICAgICAgY29uc3Qgb24gPSAhIXN0YXRlLmxpdnJhaXNvbiAmJiAhIXN0YXRlLnRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcy5lbmFibGVkOwogICAgICAgICAgYmxvY2suc3R5bGUuZGlzcGxheSA9IG9uID8gImJsb2NrIiA6ICJub25lIjsKICAgICAgICAgIGJsb2NrLmRhdGFzZXQudmlzaWJsZSA9IG9uID8gIjEiIDogIjAiOwogICAgICAgIH0KICAgICAgfSwKICAgIH0pLAogIF0pOwogIHRlbXBvcmFyeURlbGl2ZXJ5VG9nZ2xlLnN0eWxlLmRpc3BsYXkgPSBzdGF0ZS5saXZyYWlzb24gPyAiIiA6ICJub25lIjsKCiAgY29uc3QgdGVtcG9yYXJ5RGVsaXZlcnlGaWVsZHMgPSBlbCgiZGl2IiwgewogICAgY2xhc3M6ICJkZWxpdmVyeS1maWVsZHMgZGVsaXZlcnktZmllbGRzLS10ZW1wb3JhcnkiLAogICAgImRhdGEtdmlzaWJsZSI6IHRlbXBEZWxpdmVyeS5lbmFibGVkID8gIjEiIDogIjAiLAogICAgZGF0YXNldDogeyByb2xlOiAidGVtcG9yYXJ5LWRlbGl2ZXJ5LWFkZHJlc3MtYmxvY2siIH0sCiAgfSwgWwogICAgZWwoImRpdiIsIHsgY2xhc3M6ICJkaXZpZGVyIiB9KSwKICAgIGVsKCJkaXYiLCB7IGNsYXNzOiAibG95YWx0eS1waWxsLW5vdGUiLCByb2xlOiAibm90ZSIgfSwgIlV0aWxpc8OpZSB1bmlxdWVtZW50IHBvdXIgY2V0dGUgY29tbWFuZGUsIHNhbnMgbW9kaWZpZXIgbGEgZmljaGUgY2xpZW50LiIpLAogICAgdGVtcG9yYXJ5RGVsaXZlcnlGaWVsZCh7IGtleTogImFkcmVzc2UiLCBwbGFjZWhvbGRlcjogIkFkcmVzc2UgcHJvdmlzb2lyZSIsIHZhbHVlOiB0ZW1wRGVsaXZlcnkuYWRyZXNzZSwgc3RhdGUgfSksCiAgICB0ZW1wb3JhcnlEZWxpdmVyeUZpZWxkKHsga2V5OiAiY29tcGxlbWVudEFkcmVzc2UiLCBwbGFjZWhvbGRlcjogIkNvbXBsw6ltZW50IGTigJlhZHJlc3NlIiwgdmFsdWU6IHRlbXBEZWxpdmVyeS5jb21wbGVtZW50QWRyZXNzZSwgc3RhdGUgfSksCiAgICB0ZW1wb3JhcnlEZWxpdmVyeUZpZWxkKHsga2V5OiAiZXhwbGljYXRpb25zIiwgcGxhY2Vob2xkZXI6ICJSZXDDqHJlcyAvIGV4cGxpY2F0aW9ucyIsIHZhbHVlOiB0ZW1wRGVsaXZlcnkuZXhwbGljYXRpb25zLCBzdGF0ZSB9KSwKICAgIHRlbXBvcmFyeURlbGl2ZXJ5RmllbGQoeyBrZXk6ICJudW1lcm9VcmdlbmNlIiwgcGxhY2Vob2xkZXI6ICJUw6lsw6lwaG9uZSBk4oCZdXJnZW5jZSIsIHZhbHVlOiB0ZW1wRGVsaXZlcnkubnVtZXJvVXJnZW5jZSwgc3RhdGUgfSksCiAgICBzZWxlY3RGaWVsZCh7CiAgICAgIGtleTogInRlbXBvcmFyeURlbGl2ZXJ5Q2l0eUNob2ljZSIsCiAgICAgIHBsYWNlaG9sZGVyOiAiQ29kZSBwb3N0YWwgLSBWaWxsZSIsCiAgICAgIHZhbHVlOiBidWlsZEFsbG93ZWREZWxpdmVyeUNpdHlDaG9pY2VWYWx1ZShnZXRDdXJyZW50U3RvcmVTdWZmaXgoKSwgdGVtcERlbGl2ZXJ5LnZpbGxlLCB0ZW1wRGVsaXZlcnkuY29kZVBvc3RhbCksCiAgICAgIG9wdGlvbnM6IGdldEFsbG93ZWRDaXR5Q2hvaWNlT3B0aW9ucyhnZXRDdXJyZW50U3RvcmVTdWZmaXgoKSksCiAgICAgIHN0YXRlLAogICAgICBpbnZhbGlkYXRlVHJhdmVsQ2hlY2tLaW5kOiAidGVtcG9yYXJ5IiwKICAgICAgb25DaGFuZ2U6IChjaG9pY2VWYWx1ZSkgPT4gewogICAgICAgIGNvbnN0IHJvdyA9IGZpbmRBbGxvd2VkQ2l0eUNob2ljZUJ5VmFsdWUoZ2V0Q3VycmVudFN0b3JlU3VmZml4KCksIGNob2ljZVZhbHVlKTsKICAgICAgICBpZiAoIXN0YXRlIHx8IHR5cGVvZiBzdGF0ZSAhPT0gIm9iamVjdCIpIHJldHVybjsKICAgICAgICBpZiAoIXN0YXRlLnRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcyB8fCB0eXBlb2Ygc3RhdGUudGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzICE9PSAib2JqZWN0Iil7CiAgICAgICAgICBzdGF0ZS50ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MgPSB7CiAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgICAgIHRlbXBvcmFyeURlbGl2ZXJ5Q2l0eUNob2ljZTogIiIsCiAgICAgICAgICAgIHBlcnNpc3RlZENvZGVQb3N0YWw6ICIiLAogICAgICAgICAgICBwZXJzaXN0ZWRWaWxsZTogIiIsCiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBjb25zdCBwZXJzaXN0ZWRQb3N0YWwgPSBTdHJpbmcoc3RhdGUudGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzLnBlcnNpc3RlZENvZGVQb3N0YWwgPz8gc3RhdGUudGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzLmNvZGVQb3N0YWwgPz8gIiIpOwogICAgICAgIGNvbnN0IHBlcnNpc3RlZENpdHkgPSBTdHJpbmcoc3RhdGUudGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzLnBlcnNpc3RlZFZpbGxlID8/IHN0YXRlLnRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcy52aWxsZSA/PyAiIik7CiAgICAgICAgc3RhdGUudGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzLnRlbXBvcmFyeURlbGl2ZXJ5Q2l0eUNob2ljZSA9IHJvdyA/IFN0cmluZyhjaG9pY2VWYWx1ZSB8fCAiIikgOiAiIjsKICAgICAgICBzdGF0ZS50ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MuY29kZVBvc3RhbCA9IHJvdyA/IFN0cmluZyhyb3cucG9zdGFsQ29kZSB8fCAiIikgOiBwZXJzaXN0ZWRQb3N0YWw7CiAgICAgICAgc3RhdGUudGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzLnZpbGxlID0gcm93ID8gU3RyaW5nKHJvdy5jaXR5IHx8ICIiKSA6IHBlcnNpc3RlZENpdHk7CiAgICAgIH0sCiAgICB9KSwKICAgIGRlbGl2ZXJ5VHJhdmVsQ2hlY2tCbG9jaygidGVtcG9yYXJ5IiksCiAgXSk7CiAgdGVtcG9yYXJ5RGVsaXZlcnlGaWVsZHMuc3R5bGUuZGlzcGxheSA9IChzdGF0ZS5saXZyYWlzb24gJiYgdGVtcERlbGl2ZXJ5LmVuYWJsZWQpID8gImJsb2NrIiA6ICJub25lIjsKCiAgLy8gUHJvYmzDqG1lIG11c3QgYmUgQUxXQVlTIHZpc2libGUgKG5vdCB0aWVkIHRvIExpdnJhaXNvbiB0b2dnbGUpIEFORCBNVVNUIGJlIGxhc3QuCiAgY29uc3QgcHJvYmxlbWVGaWVsZCA9IHByb2JsZW1lRmllbGRXaXRoU2F2ZSh7CiAgICBwbGFjZWhvbGRlcjogIlByb2Jsw6htZSIsIHZhbHVlOiBsaXZlQ2xpZW50LnByb2JsZW1lLCBzdGF0ZSwKICAgIG9uU2F2ZTogKGJ0bkVsKSA9PiBzYXZlQ2xpZW50UHJvYmxlbWUoY2FyZEVsLCBidG5FbCksCiAgfSk7CiAgLy8gTm90ZTogYXR0ZW50aW9uIHN0eWxpbmcgaXMgc3luY2VkIGFmdGVyIGNhcmQgZXhpc3RzIChzZWUgYmVsb3cpLgoKICBjb25zdCBjYXJkRWwgPSBlbCgiZGl2IiwgeyBjbGFzczogImNhcmQiIH0sIFsKICAgIGVsKCJkaXYiLCB7IGNsYXNzOiAiY2FyZF9faGQiIH0sIFsKICAgICAgLy8gSGVhZGVyIHRpdGxlIHJlbW92ZWQ6IHRoZSBsb3lhbHR5IGJ1dHRvbiBtdXN0IHRha2UgZnVsbCB3aWR0aC4KICAgICAgZWwoImRpdiIsIHsgY2xhc3M6ICJjYXJkX19hY3Rpb25zIiB9LCBbCiAgICAgICAgLi4uKHBpbGwgPyBbcGlsbF0gOiBbXSksCiAgICAgIF0pLAogICAgXSksCiAgICBlbCgiZGl2IiwgeyBjbGFzczogImNhcmRfX2JkIiB9LCBbCiAgICAgIC8vIFZhbGV1ciBicnV0ZSBjb25zZXJ2w6llIGRhbnMgc3RhdGUuY2xpZW50LnRlbGVwaG9uZSAoZXg6IDMzNjE4NTI5Mzc1KQogICAgICAvLyBBZmZpY2hhZ2UgdW5pcXVlbWVudCBmb3JtYXTDqSBpY2kgKGV4OiAwNiAxOCA1MiA5MyA3NSkKICAgICAgLi4uKHBpbGxOb3RlID8gW3BpbGxOb3RlXSA6IFtdKSwKICAgICAgcGhvbmVGaWVsZCh7IHBsYWNlaG9sZGVyOiAiTnVtw6lybyBkZSB0w6lsw6lwaG9uZSIsIHZhbHVlOiBwaG9uZURpc3BsYXksIHN0YXRlIH0pLAogICAgICBmaXJzdE5hbWVGaWVsZCh7IHBsYWNlaG9sZGVyOiAiUHLDqW5vbSIsIHZhbHVlOiBsaXZlQ2xpZW50LnByZW5vbSwgc3RhdGUgfSksCiAgICAgIC8vIExpdnJhaXNvbiBmaWVsZHMgbXVzdCBhcHBlYXIgYmV0d2VlbiAiUHLDqW5vbSIgYW5kICJQcm9ibMOobWUiCiAgICAgIGRlbGl2ZXJ5RmllbGRzLAogICAgICB0ZW1wb3JhcnlEZWxpdmVyeVRvZ2dsZSwKICAgICAgdGVtcG9yYXJ5RGVsaXZlcnlGaWVsZHMsCiAgICAgIC8vIFByb2Jsw6htZSBtdXN0IGFsd2F5cyBiZSB0aGUgTEFTVCBmaWVsZCBkaXNwbGF5ZWQKICAgICAgcHJvYmxlbWVGaWVsZCwKICAgICAgLy8gU3RvcCBTTVMgc3dpdGNoIG11c3QgYmUgZGlyZWN0bHkgdW5kZXIgIlByb2Jsw6htZSIKICAgICAgc3RvcFNtc1Jvdyh7IHN0YXRlLCBjYXJkUm9vdDogbnVsbCB9KSwgLy8gY2FyZFJvb3Qgc2V0IHJpZ2h0IGFmdGVyIGNhcmRFbCBleGlzdHMgKHNlZSBiZWxvdykKICAgIF0pLAogIF0pOwoKICAvLyBOb3cgdGhhdCBjYXJkRWwgZXhpc3RzLCB3aXJlIFN0b3AgU01TIHJvdyB3aXRoIGEgcmVhbCBjYXJkUm9vdCBhbmQgc3luYyBpdHMgaW5pdGlhbCBzdGF0ZS4KICB0cnl7CiAgICBjb25zdCBwbGFjZWhvbGRlclJvdyA9IGNhcmRFbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1yb2xlPSJzdG9wLXNtcy1zd2l0Y2giXScpPy5jbG9zZXN0Py4oImRpdiIpOwogICAgaWYgKHBsYWNlaG9sZGVyUm93KXsKICAgICAgLy8gbm8tb3A6IHN0cnVjdHVyZSBhbHJlYWR5IG1vdW50ZWQKICAgIH0gZWxzZSB7CiAgICAgIC8vIERlZmVuc2l2ZTogaWYgRE9NIHN0cnVjdHVyZSBjaGFuZ2VkLCBkbyBub3RoaW5nLgogICAgfQogIH0gY2F0Y2ggKGUpIHt9CgogIC8vIFJlcGxhY2UgdGhlIHBsYWNlaG9sZGVyIHN0b3BTbXNSb3cgKGNyZWF0ZWQgd2l0aCBudWxsIGNhcmRSb290KSB3aXRoIGEgY29ycmVjdGx5IGJvdW5kIG9uZS4KICB0cnl7CiAgICBjb25zdCBiZCA9IGNhcmRFbC5xdWVyeVNlbGVjdG9yKCIuY2FyZF9fYmQiKTsKICAgIGlmIChiZCl7CiAgICAgIGNvbnN0IG5vZGVzID0gQXJyYXkuZnJvbShiZC5jaGlsZHJlbik7CiAgICAgIC8vIEZpbmQgdGhlIGZpcnN0IC5zd2l0Y2gtcm93IHRoYXQgY29udGFpbnMgIlN0b3AgU01TIgogICAgICBsZXQgaWR4ID0gLTE7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspewogICAgICAgIGNvbnN0IG4gPSBub2Rlc1tpXTsKICAgICAgICBpZiAoIW4pIGNvbnRpbnVlOwogICAgICAgIGNvbnN0IHR4dCA9IFN0cmluZyhuLnRleHRDb250ZW50ID8/ICIiKTsKICAgICAgICBpZiAodHh0LmluY2x1ZGVzKCJTdG9wIFNNUyIpKSB7IGlkeCA9IGk7IGJyZWFrOyB9CiAgICAgIH0KICAgICAgaWYgKGlkeCA+PSAwKXsKICAgICAgICBjb25zdCByZXBsID0gc3RvcFNtc1Jvdyh7IHN0YXRlLCBjYXJkUm9vdDogY2FyZEVsIH0pOwogICAgICAgIGJkLnJlcGxhY2VDaGlsZChyZXBsLCBub2Rlc1tpZHhdKTsKICAgICAgfQogICAgfQogIH0gY2F0Y2ggKGUpIHt9CgogIC8vIEZpbmFsIHN5bmMgYWZ0ZXIgY2FyZCBleGlzdHMgKGNvdmVycyBjYXNlcyB3aGVyZSBpbml0aWFsIHJlbmRlciBjcmVhdGVkIG5vZGVzIGJlZm9yZSB3ZSBjYW4gcXVlcnkgLmNhcmQpLgogIHRyeSB7IHNldFByb2JsZW1lQXR0ZW50aW9uKGNhcmRFbCwgbGl2ZUNsaWVudD8ucHJvYmxlbWUgPz8gIiIpOyB9IGNhdGNoIChlKSB7fQogIHRyeSB7IHNldFN0b3BTbXNTd2l0Y2goY2FyZEVsLCBnZXRTbXNTd2l0Y2hWaXN1YWxTdGF0ZShsaXZlQ2xpZW50KSk7IH0gY2F0Y2ggKGUyKSB7fQogIHRyeSB7IHN5bmNEZWxpdmVyeVRyYXZlbENoZWNrVWkoImNsaWVudCIpOyB9IGNhdGNoIChlMykge30KICB0cnkgeyBzeW5jRGVsaXZlcnlUcmF2ZWxDaGVja1VpKCJ0ZW1wb3JhcnkiKTsgfSBjYXRjaCAoZTQpIHt9CgogIC8vIENsaWNrIG9uIGxveWFsdHkgYnV0dG9uIChoZWFkZXIpID0+IG9wZW4gZWRpdCBtb2RhbAogIGlmIChwaWxsKXsKICAgIHRyeXsKICAgICAgcGlsbC5jbGFzc0xpc3QuYWRkKCJsb3lhbHR5LXBpbGwtLWNsaWNrYWJsZSIpOwogICAgICBwaWxsLnNldEF0dHJpYnV0ZSgicm9sZSIsICJidXR0b24iKTsKICAgICAgcGlsbC5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwgIjAiKTsKICAgICAgcGlsbC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIChlKSA9PiB7CiAgICAgICAgdHJ5IHsgZT8ucHJldmVudERlZmF1bHQ/LigpOyB9IGNhdGNoIChlMikge30KICAgICAgICBvcGVuTG95YWx0eVBvaW50c0VkaXRvcihjYXJkRWwpOwogICAgICB9KTsKICAgICAgcGlsbC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgKGUpID0+IHsKICAgICAgICBpZiAoIWUpIHJldHVybjsKICAgICAgICBpZiAoZS5rZXkgPT09ICJFbnRlciIgfHwgZS5rZXkgPT09ICIgIil7CiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICBvcGVuTG95YWx0eVBvaW50c0VkaXRvcihjYXJkRWwpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9IGNhdGNoIChlKSB7fQogIH0KICByZXR1cm4gY2FyZEVsOwp9"
            },
            "after": {
                "exists": true,
                "kind": "file",
                "size": 66848,
                "sha1": "411db8657bbc0a914be28d4206b5d6e79dc3db8d",
                "content_b64": "LyogZG9jLXByb2plY3QgfCBjYWlzc2UtYXFwL3B1YmxpYy9hc3NldHMvanMvdWkvY29tcG9uZW50cy9jbGllbnRDYXJkLmpzIHwgR8OocmUgbOKAmWFmZmljaGFnZSBldCBsYSBtaXNlIMOgIGpvdXIgZGUgbGEgY2FydGUgY2xpZW50IGVuIFVJLCBhdmVjIMOpZGl0aW9uIGR1IHTDqWzDqXBob25lLCBwcsOpbm9tLCBhZHJlc3NlLCBwcm9ibMOobWUsIFN0b3AgU01TLCBwb2ludHMgZmlkw6lsaXTDqSwgc8OpbGVjdGlvbiBwcm9wb3PDqWUgZOKAmXVuIGNvdXBsZSBjb2RlIHBvc3RhbCAvIHZpbGxlIHBhciBQRFYsIHByw6lyZW1wbGlzc2FnZSBkdSBzw6lsZWN0ZXVyIGNvbXBvc2l0ZSBkZXB1aXMgbGEgQkRELCBwcsOpY29uc3RydWN0aW9uIGV4cGxpY2l0ZSBkZSBs4oCZw6l0YXQgbGl2cmFpc29uIGTDqHMgbOKAmWltcG9ydCBjbGllbnQgbcOqbWUgcXVhbmQgbGEgem9uZSBlc3QgbWFzcXXDqWUsIGFwcGxpY2F0aW9uIGR1IGNob2l4IHBhciBkw6lmYXV0IGR1IG1hZ2FzaW4gdW5pcXVlbWVudCBsb3JzcXXigJlhdWN1bmUgYWRyZXNzZSBu4oCZZXN0IGTDqWrDoCByZW5zZWlnbsOpZSBldCBjb25zZXJ2YXRpb24gZGVzIHZhbGV1cnMgaGlzdG9yaXF1ZXMgaG9ycyBQRFYgY291cmFudCBzYW5zIGJsb2NhZ2UgZGUgc2F1dmVnYXJkZS4gQ29udHLDtGxlIGF1c3NpIGxlIHRlbXBzIGRlIHRyYWpldCBkZSBsaXZyYWlzb24gcG91ciBs4oCZYWRyZXNzZSBjbGllbnQgZXQgbOKAmWFkcmVzc2UgcHJvdmlzb2lyZSBkZSBjb21tYW5kZSwgcsOpaW5qZWN0ZSBhdXRvbWF0aXF1ZW1lbnQgbOKAmWFkcmVzc2UgY29ycmlnw6llIHJlbnZvecOpZSBwYXIgbOKAmUFQSSBkZSB0cmFqZXQgZGFucyBsZSBmb3JtdWxhaXJlIGV0IGxlIHN0YXRlIGZyb250LCB5IGNvbXByaXMgcXVhbmQgc2V1bGUgZnVsbF9hZGRyZXNzIGNvbnRpZW50IGxhIHZyYWllIGNvcnJlY3Rpb24sIGVuIHByw6lzZXJ2YW50IGTDqXNvcm1haXMgZXhwbGljaXRlbWVudCBsZSBudW3DqXJvIGRlIHZvaWUgaW5pdGlhbCBz4oCZaWwgZGlzcGFyYcOudCBkYW5zIGxhIGNvcnJlY3Rpb24gYXV0b21hdGlxdWUuIENvcnJpZ2UgbOKAmcOpZGl0ZXVyIGZpZMOpbGl0w6kgcG91ciB0cmF2YWlsbGVyIHN1ciBsZSB0b3RhbCByw6llbCBkZXMgcG9pbnRzIGV0IG5vbiBzdXIgbGUgc29sZGUgYWZmaWNow6kgYXByw6hzIHLDqXNlcnZhdGlvbnMgZmlkw6lsaXTDqS4gTGVzIGZsb3dzIGRlIHNhaXNpZS9sb29rdXAgdMOpbMOpcGhvbmUgcmVzdGVudCBkw6lzb3JtYWlzIHN0cmljdGVtZW50IGxpbWl0w6lzIMOgIGzigJloeWRyYXRhdGlvbiBjbGllbnQgZXQgbmUgdG91Y2hlbnQgamFtYWlzIGF1eCBtb2RlcyBjb3VwZS9saXZyYWlzb24sIGxhaXNzw6lzIMOgIGxhIHLDqGdsZSBtw6l0aWVyIGNlbnRyYWxpc8OpZSBkZSBjcsOpYXRpb24vcmVzZXQvaW1wb3J0LiB8IEV4cG9zZTogQ2xpZW50Q2FyZCB8IETDqXBlbmQgZGU6IC4uL2RvbS5qcywgLi4vZm9ybWF0L3Bob25lLmpzLCAuLi8uLi9hcHAtanMvdXRpbHMvcGhvbmUvbm9ybWFsaXplUGhvbmUuanMsIC4uLy4uL2FwcC1qcy91dGlscy9waG9uZS9wYXJzZUFuZFZhbGlkYXRlUGhvbmUuanMsIC4uLy4uL3NlcnZpY2VzL2FwaS9jbGllbnRMb29rdXBBcGkuanMsIC4uLy4uL2FwcC1qcy9zdGF0ZS9jbGllbnQuanM/dHM9MjAyNjA0MjItMSwgLi4vLi4vYXBwLWpzL29yZGVycy9leGlzdGluZ09yZGVyRmxvdy5qcywgLi4vLi4vYXBwLWpzL2ZvY3VzLmpzLCAuLi8uLi9hcHAtanMvcGl6emFTZWFyY2guanMsIC4uLy4uL2FwcC1qcy9zZWFyY2gvc2VsZWN0aW9uLmpzLCAuLi8uLi9zZXJ2aWNlcy9hcGkvY2xpZW50VXBkYXRlTG95YWx0eVBvaW50c0FwaS5qcywgLi4vLi4vc2VydmljZXMvYXBpL2NsaWVudFVwZGF0ZVByb2JsZW1lQXBpLmpzLCAuLi8uLi9zZXJ2aWNlcy9hcGkvY2xpZW50VXBkYXRlU3RvcFNtc0FwaS5qcywgLi4vLi4vc2VydmljZXMvYXBpL2RlbGl2ZXJ5VHJhdmVsVGltZUFwaS5qcz90cz0yMDI2MDQwNS0xLCAuLi8uLi9hcHAtanMvcGR2LmpzLCAuLi8uLi9hcHAtanMvYWRkcmVzcy9kZWxpdmVyeUNpdHlDaG9pY2VzLmpzP3RzPTIwMjYwNDIyLTEsIC4uLy4uL2FwcC1qcy9hZGRyZXNzL2RlbGl2ZXJ5Q2l0eVN0YXRlU3luYy5qcz90cz0yMDI2MDQyMi0xLCAuLi8uLi9hcHAtanMvYWRkcmVzcy9kZWxpdmVyeVRyYXZlbEFkZHJlc3NDb3JyZWN0aW9uLmpzP3RzPTIwMjYwNDA1LTEgfCBJbXBhY3RlOiBpbnRlcmZhY2UgdXRpbGlzYXRldXIsIGFwcGVscyBBUEkgYmFja2VuZCwgw6l0YXQgY2xpZW50IGVuIG3DqW1vaXJlLCDDqXRhdCBhZHJlc3NlIHRlbXBvcmFpcmUgZGUgY29tbWFuZGUsIHLDqXN1bHRhdHMgZGUgY29udHLDtGxlIHRyYWpldCwgYXV0by1jb3JyZWN0aW9uIGRlcyBhZHJlc3NlcyBkZSBsaXZyYWlzb24sIHByb3Bvc2l0aW9uIGRlIGNvbW11bmUgcGFyIGTDqWZhdXQgc2Vsb24gbGUgUERWLCBmb2N1cyBkZSByZWNoZXJjaGUsIG5vdGlmaWNhdGlvbnMgdG9hc3QsIGFic2VuY2UgZOKAmWVmZmV0IGRlIGJvcmQgc3VyIGNvdXBlL2xpdnJhaXNvbiBsb3JzIGRlcyBsb29rdXBzIGNsaWVudCB8IFRhYmxlczogY2xpZW50cyhpZCwgdGVsZXBob25lLCBwcmVub20sIGFkcmVzc2UsIGNvbXBsZW1lbnRBZHJlc3NlLCBleHBsaWNhdGlvbnNBZHJlc3NlLCBudW1QbHVzMSwgbnVtUGx1czIsIGNvZGVQb3N0YWwsIHZpbGxlLCBwcm9ibGVtZSwgc3RvcF9zbXMsIHBvaW50c19maWRfdG90YWwsIHBvaW50c19maWRfZGlzcGxheSwgbG95YWx0eV91c2VkX3NlbGVjdGVkX2RheSkgKi8KaW1wb3J0IHsgZWwsIHRvYXN0LCBzdmdJY29uLCBsb3lhbHR5UG9pbnRzTW9kYWwgfSBmcm9tICIuLi9kb20uanMiOwppbXBvcnQgeyBmb3JtYXRQaG9uZUZvckRpc3BsYXkgfSBmcm9tICIuLi9mb3JtYXQvcGhvbmUuanMiOwppbXBvcnQgeyBub3JtYWxpemVQaG9uZUZvckRiIH0gZnJvbSAiLi4vLi4vYXBwLWpzL3V0aWxzL3Bob25lL25vcm1hbGl6ZVBob25lLmpzIjsKaW1wb3J0IHsgcGFyc2VBbmRWYWxpZGF0ZVBob25lIH0gZnJvbSAiLi4vLi4vYXBwLWpzL3V0aWxzL3Bob25lL3BhcnNlQW5kVmFsaWRhdGVQaG9uZS5qcyI7CmltcG9ydCB7IGZldGNoQ2xpZW50QnlQaG9uZSB9IGZyb20gIi4uLy4uL3NlcnZpY2VzL2FwaS9jbGllbnRMb29rdXBBcGkuanMiOwppbXBvcnQgeyBidWlsZEluamVjdGVkQ2xpZW50RnJvbUFwaSwgc3luY0luamVjdGVkQ2xpZW50RGVsaXZlcnlTdGF0ZSB9IGZyb20gIi4uLy4uL2FwcC1qcy9zdGF0ZS9jbGllbnQuanM/dHM9MjAyNjA0MjItMSI7CmltcG9ydCB7IGVuc3VyZU5vRHVwbGljYXRlVG9kYXlPcmRlciB9IGZyb20gIi4uLy4uL2FwcC1qcy9vcmRlcnMvZXhpc3RpbmdPcmRlckZsb3cuanMiOwppbXBvcnQgeyByZXF1ZXN0U2VhcmNoRm9jdXMgfSBmcm9tICIuLi8uLi9hcHAtanMvZm9jdXMuanMiOwppbXBvcnQgeyBjb21wdXRlUGl6emFSZXN1bHRzIH0gZnJvbSAiLi4vLi4vYXBwLWpzL3BpenphU2VhcmNoLmpzIjsKaW1wb3J0IHsgY2xhbXBTZWxlY3RlZFNlYXJjaEluZGV4IH0gZnJvbSAiLi4vLi4vYXBwLWpzL3NlYXJjaC9zZWxlY3Rpb24uanMiOwppbXBvcnQgeyB1cGRhdGVDbGllbnRMb3lhbHR5UG9pbnRzIH0gZnJvbSAiLi4vLi4vc2VydmljZXMvYXBpL2NsaWVudFVwZGF0ZUxveWFsdHlQb2ludHNBcGkuanMiOwppbXBvcnQgeyB1cGRhdGVDbGllbnRQcm9ibGVtZSB9IGZyb20gIi4uLy4uL3NlcnZpY2VzL2FwaS9jbGllbnRVcGRhdGVQcm9ibGVtZUFwaS5qcyI7CmltcG9ydCB7IHVwZGF0ZUNsaWVudFN0b3BTbXMgfSBmcm9tICIuLi8uLi9zZXJ2aWNlcy9hcGkvY2xpZW50VXBkYXRlU3RvcFNtc0FwaS5qcyI7CmltcG9ydCB7IGNoZWNrRGVsaXZlcnlUcmF2ZWxUaW1lIH0gZnJvbSAiLi4vLi4vc2VydmljZXMvYXBpL2RlbGl2ZXJ5VHJhdmVsVGltZUFwaS5qcz90cz0yMDI2MDQwNS0xIjsKaW1wb3J0IHsgZ2V0UERWQ3VycmVudCwgc3RvcmVUb1N1ZmZpeCB9IGZyb20gIi4uLy4uL2FwcC1qcy9wZHYuanMiOwppbXBvcnQgewogIGdldEFsbG93ZWRDaG9pY2VzIGFzIGdldEFsbG93ZWREZWxpdmVyeUNpdHlDaG9pY2VzLAogIGJ1aWxkQWxsb3dlZENob2ljZVZhbHVlIGFzIGJ1aWxkQWxsb3dlZERlbGl2ZXJ5Q2l0eUNob2ljZVZhbHVlLAogIGZvcm1hdENob2ljZUxhYmVsIGFzIGZvcm1hdEFsbG93ZWREZWxpdmVyeUNpdHlMYWJlbCwKfSBmcm9tICIuLi8uLi9hcHAtanMvYWRkcmVzcy9kZWxpdmVyeUNpdHlDaG9pY2VzLmpzP3RzPTIwMjYwNDIyLTEiOwppbXBvcnQgeyBzeW5jRGVsaXZlcnlBZGRyZXNzU2VsZWN0aW9ucyB9IGZyb20gIi4uLy4uL2FwcC1qcy9hZGRyZXNzL2RlbGl2ZXJ5Q2l0eVN0YXRlU3luYy5qcz90cz0yMDI2MDQyMi0xIjsKaW1wb3J0IHsKICByZXNvbHZlQ29ycmVjdGVkRGVsaXZlcnlUcmF2ZWxBZGRyZXNzLAogIGlzRGVsaXZlcnlUcmF2ZWxBZGRyZXNzQ29ycmVjdGlvbiwKICBmb3JtYXROb3JtYWxpemVkRGVsaXZlcnlUcmF2ZWxBZGRyZXNzTGFiZWwsCn0gZnJvbSAiLi4vLi4vYXBwLWpzL2FkZHJlc3MvZGVsaXZlcnlUcmF2ZWxBZGRyZXNzQ29ycmVjdGlvbi5qcz90cz0yMDI2MDQwNS0xIjsKCi8qKgogKiBbUk9MRV0gVUkgY29tcG9uZW50OiBsZWZ0IGNvbHVtbiBjbGllbnQgaW5mb3JtYXRpb24gY2FyZCAobW9jayBpbnB1dHMpLgogKiBbVVNFIFdIRU5dIFlvdSBuZWVkIHRvIGFkanVzdCB3aGljaCBmaWVsZHMgc2hvdy9oaWRlIGJhc2VkIG9uIGxpdnJhaXNvbiBzd2l0Y2guCiAqIFtJTlBVVF0gY2xpZW50IG9iamVjdCArIHN0YXRlLmxpdnJhaXNvbiAoY29udHJvbHMgZXh0cmEgYWRkcmVzcyBmaWVsZHMpLgogKi8KZnVuY3Rpb24gaXNOb25FbXB0eSh2KXsKICByZXR1cm4gU3RyaW5nKHYgPz8gIiIpLnRyaW0oKS5sZW5ndGggPiAwOwp9CgpmdW5jdGlvbiBnZXRDdXJyZW50U3RvcmVTdWZmaXgoKXsKICB0cnl7CiAgICByZXR1cm4gc3RvcmVUb1N1ZmZpeChnZXRQRFZDdXJyZW50KCkpOwogIH0gY2F0Y2ggKF9lKXsKICAgIHJldHVybiAibGFuIjsKICB9Cn0KCmZ1bmN0aW9uIGdldEFsbG93ZWRDaXR5Q2hvaWNlT3B0aW9ucyhzdG9yZVN1ZmZpeCl7CiAgcmV0dXJuIGdldEFsbG93ZWREZWxpdmVyeUNpdHlDaG9pY2VzKHN0b3JlU3VmZml4KS5tYXAoKHJvdykgPT4gKHsKICAgIHZhbHVlOiBTdHJpbmcocm93LmNob2ljZVZhbHVlIHx8ICIiKSwKICAgIGxhYmVsOiBmb3JtYXRBbGxvd2VkRGVsaXZlcnlDaXR5TGFiZWwocm93KSwKICB9KSk7Cn0KCmZ1bmN0aW9uIGZpbmRBbGxvd2VkQ2l0eUNob2ljZUJ5VmFsdWUoc3RvcmVTdWZmaXgsIHZhbHVlKXsKICBjb25zdCB0YXJnZXQgPSBTdHJpbmcodmFsdWUgPz8gIiIpOwogIGNvbnN0IHJvd3MgPSBnZXRBbGxvd2VkRGVsaXZlcnlDaXR5Q2hvaWNlcyhzdG9yZVN1ZmZpeCk7CiAgZm9yIChjb25zdCByb3cgb2Ygcm93cyl7CiAgICBpZiAoU3RyaW5nKHJvdz8uY2hvaWNlVmFsdWUgPz8gIiIpID09PSB0YXJnZXQpIHJldHVybiByb3c7CiAgfQogIHJldHVybiBudWxsOwp9CgpmdW5jdGlvbiBlbnN1cmVEZWxpdmVyeVRyYXZlbENoZWNrcyhzdGF0ZSl7CiAgaWYgKCFzdGF0ZSB8fCB0eXBlb2Ygc3RhdGUgIT09ICJvYmplY3QiKSByZXR1cm4geyBjbGllbnQ6IHt9LCB0ZW1wb3Jhcnk6IHt9IH07CiAgaWYgKCFzdGF0ZS5kZWxpdmVyeVRyYXZlbENoZWNrcyB8fCB0eXBlb2Ygc3RhdGUuZGVsaXZlcnlUcmF2ZWxDaGVja3MgIT09ICJvYmplY3QiKXsKICAgIHN0YXRlLmRlbGl2ZXJ5VHJhdmVsQ2hlY2tzID0ge307CiAgfQogIGlmICghc3RhdGUuZGVsaXZlcnlUcmF2ZWxDaGVja3MuY2xpZW50IHx8IHR5cGVvZiBzdGF0ZS5kZWxpdmVyeVRyYXZlbENoZWNrcy5jbGllbnQgIT09ICJvYmplY3QiKXsKICAgIHN0YXRlLmRlbGl2ZXJ5VHJhdmVsQ2hlY2tzLmNsaWVudCA9IHt9OwogIH0KICBpZiAoIXN0YXRlLmRlbGl2ZXJ5VHJhdmVsQ2hlY2tzLnRlbXBvcmFyeSB8fCB0eXBlb2Ygc3RhdGUuZGVsaXZlcnlUcmF2ZWxDaGVja3MudGVtcG9yYXJ5ICE9PSAib2JqZWN0Iil7CiAgICBzdGF0ZS5kZWxpdmVyeVRyYXZlbENoZWNrcy50ZW1wb3JhcnkgPSB7fTsKICB9CiAgcmV0dXJuIHN0YXRlLmRlbGl2ZXJ5VHJhdmVsQ2hlY2tzOwp9CgpmdW5jdGlvbiBnZXREZWxpdmVyeVRyYXZlbENoZWNrRW50cnkoc3RhdGUsIGtpbmQpewogIGNvbnN0IGJhZyA9IGVuc3VyZURlbGl2ZXJ5VHJhdmVsQ2hlY2tzKHN0YXRlKTsKICByZXR1cm4gYmFnW2tpbmQgPT09ICJ0ZW1wb3JhcnkiID8gInRlbXBvcmFyeSIgOiAiY2xpZW50Il07Cn0KCmZ1bmN0aW9uIHJlc2V0RGVsaXZlcnlUcmF2ZWxDaGVjayhzdGF0ZSwga2luZCl7CiAgY29uc3QgZW50cnkgPSBnZXREZWxpdmVyeVRyYXZlbENoZWNrRW50cnkoc3RhdGUsIGtpbmQpOwogIGVudHJ5LnBlbmRpbmcgPSBmYWxzZTsKICBlbnRyeS5vayA9IGZhbHNlOwogIGVudHJ5LnRvbmUgPSAiIjsKICBlbnRyeS5tZXNzYWdlID0gIiI7CiAgZW50cnkuZHVyYXRpb25MYWJlbCA9ICIiOwogIGVudHJ5LmNoZWNrZWRBdFNlY29uZHMgPSAwOwogIHJldHVybiBlbnRyeTsKfQoKZnVuY3Rpb24gY2xlYXJEZWxpdmVyeVRyYXZlbENoZWNrSW5DYXJkKGNhcmRSb290LCBraW5kKXsKICBpZiAoIWNhcmRSb290KSByZXR1cm47CiAgY29uc3QgcmVzdWx0ID0gY2FyZFJvb3QucXVlcnlTZWxlY3RvcihgW2RhdGEtcm9sZT0iZGVsaXZlcnktdHJhdmVsLWNoZWNrLXJlc3VsdC0ke1N0cmluZyhraW5kKX0iXWApOwogIGNvbnN0IGJ0biA9IGNhcmRSb290LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLXJvbGU9ImRlbGl2ZXJ5LXRyYXZlbC1jaGVjay1idG4tJHtTdHJpbmcoa2luZCl9Il1gKTsKICBpZiAocmVzdWx0KXsKICAgIHJlc3VsdC5oaWRkZW4gPSB0cnVlOwogICAgcmVzdWx0LnRleHRDb250ZW50ID0gIiI7CiAgICB0cnkgeyBkZWxldGUgcmVzdWx0LmRhdGFzZXQuc3RhdGU7IH0gY2F0Y2ggKF9lKSB7fQogIH0KICBpZiAoYnRuKXsKICAgIGJ0bi5kaXNhYmxlZCA9IGZhbHNlOwogICAgYnRuLnRleHRDb250ZW50ID0gIlbDqXJpZmllciBsZSB0ZW1wcyBkZSB0cmFqZXQiOwogIH0KfQoKZnVuY3Rpb24gaW52YWxpZGF0ZURlbGl2ZXJ5VHJhdmVsQ2hlY2tGcm9tRXZlbnQoZSwgc3RhdGUsIGtpbmQpewogIHJlc2V0RGVsaXZlcnlUcmF2ZWxDaGVjayhzdGF0ZSwga2luZCk7CiAgdHJ5ewogICAgY29uc3QgY2FyZFJvb3QgPSBlPy50YXJnZXQ/LmNsb3Nlc3Q/LigiLmNhcmQiKTsKICAgIGNsZWFyRGVsaXZlcnlUcmF2ZWxDaGVja0luQ2FyZChjYXJkUm9vdCwga2luZCk7CiAgfSBjYXRjaCAoX2UpIHt9Cn0KCmZ1bmN0aW9uIG5vcm1hbGl6ZURlbGl2ZXJ5VHJhdmVsQWRkcmVzcyhyYXcpewogIGNvbnN0IHNyYyA9IChyYXcgJiYgdHlwZW9mIHJhdyA9PT0gIm9iamVjdCIpID8gcmF3IDoge307CiAgcmV0dXJuIHsKICAgIGFkcmVzc2U6IFN0cmluZyhzcmMuYWRyZXNzZSA/PyAiIikudHJpbSgpLAogICAgY29tcGxlbWVudF9hZHJlc3NlOiBTdHJpbmcoc3JjLmNvbXBsZW1lbnRBZHJlc3NlID8/IHNyYy5jb21wbGVtZW50X2FkcmVzc2UgPz8gIiIpLnRyaW0oKSwKICAgIGNvZGVfcG9zdGFsOiBTdHJpbmcoc3JjLmNvZGVQb3N0YWwgPz8gc3JjLmNvZGVfcG9zdGFsID8/ICIiKS50cmltKCksCiAgICB2aWxsZTogU3RyaW5nKHNyYy52aWxsZSA/PyAiIikudHJpbSgpLAogIH07Cn0KCmZ1bmN0aW9uIGlzQ29tcGxldGVEZWxpdmVyeVRyYXZlbEFkZHJlc3MocmF3KXsKICBjb25zdCBhID0gbm9ybWFsaXplRGVsaXZlcnlUcmF2ZWxBZGRyZXNzKHJhdyk7CiAgcmV0dXJuICEhKGEuYWRyZXNzZSAmJiBhLmNvZGVfcG9zdGFsICYmIGEudmlsbGUpOwp9CgpmdW5jdGlvbiBmb3JtYXREZWxpdmVyeVRyYXZlbER1cmF0aW9uKHJlc3VsdCl7CiAgY29uc3QgbWludXRlcyA9IE1hdGgubWF4KDAsIE51bWJlcihyZXN1bHQ/LmR1cmF0aW9uX21pbnV0ZXNfcm91bmRlZCA/PyByZXN1bHQ/LmR1cmF0aW9uTWludXRlc1JvdW5kZWQgPz8gMCkgfHwgMCk7CiAgaWYgKCFtaW51dGVzKSByZXR1cm4gIiI7CiAgcmV0dXJuIGBEdXLDqWUgZHUgdHJhamV0IDogJHttaW51dGVzfSBtaW5gOwp9CgpmdW5jdGlvbiB0ZW1wb3JhcnlEZWxpdmVyeUZpZWxkKHsga2V5LCBwbGFjZWhvbGRlciwgdmFsdWUsIHN0YXRlIH0gPSB7fSl7CiAgY29uc3QgaGFzVmFsdWUgPSBTdHJpbmcodmFsdWUgPz8gIiIpLnRyaW0oKS5sZW5ndGggPiAwOwogIHJldHVybiBlbCgiZGl2IiwgeyBjbGFzczogYGZpZWxkJHtoYXNWYWx1ZSA/ICIiIDogIiBmaWVsZC0tZW1wdHkifWAgfSwgWwogICAgZWwoImlucHV0IiwgewogICAgICBjbGFzczogImlucHV0IGlucHV0LS1wbGFjZWhvbGRlci1sZyIsCiAgICAgIHZhbHVlOiBTdHJpbmcodmFsdWUgPz8gIiIpLAogICAgICBwbGFjZWhvbGRlcjogU3RyaW5nKHBsYWNlaG9sZGVyID8/ICIiKSwKICAgICAgZGF0YXNldDogeyBmaWVsZEtleTogU3RyaW5nKGtleSA/PyAiIikgfSwKICAgICAgb25JbnB1dDogKGUpID0+IHsKICAgICAgICBjb25zdCB2ID0gZT8udGFyZ2V0Py52YWx1ZSA/PyAiIjsKICAgICAgICBpZiAoIXN0YXRlIHx8IHR5cGVvZiBzdGF0ZSAhPT0gIm9iamVjdCIpIHJldHVybjsKICAgICAgICBpZiAoIXN0YXRlLnRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcyB8fCB0eXBlb2Ygc3RhdGUudGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzICE9PSAib2JqZWN0Iil7CiAgICAgICAgICBzdGF0ZS50ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MgPSB7IGVuYWJsZWQ6IHRydWUgfTsKICAgICAgICB9CiAgICAgICAgc3RhdGUudGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzW2tleV0gPSBTdHJpbmcodik7CiAgICAgICAgdHJ5ewogICAgICAgICAgY29uc3QgaW5wID0gZT8udGFyZ2V0OwogICAgICAgICAgY29uc3QgZmllbGRSb290ID0gaW5wPy5jbG9zZXN0Py4oIi5maWVsZCIpIHx8IGlucD8ucGFyZW50RWxlbWVudDsKICAgICAgICAgIGlmIChmaWVsZFJvb3QpIGZpZWxkUm9vdC5jbGFzc0xpc3QudG9nZ2xlKCJmaWVsZC0tZW1wdHkiLCAhaXNOb25FbXB0eSh2KSk7CiAgICAgICAgfSBjYXRjaCAoX2UpIHt9CiAgICAgICAgaWYgKFsiYWRyZXNzZSIsICJjb21wbGVtZW50QWRyZXNzZSIsICJjb2RlUG9zdGFsIiwgInZpbGxlIl0uaW5jbHVkZXMoU3RyaW5nKGtleSA/PyAiIikpKXsKICAgICAgICAgIGludmFsaWRhdGVEZWxpdmVyeVRyYXZlbENoZWNrRnJvbUV2ZW50KGUsIHN0YXRlLCAidGVtcG9yYXJ5Iik7CiAgICAgICAgfQogICAgICB9LAogICAgICAiYXJpYS1sYWJlbCI6IFN0cmluZyhwbGFjZWhvbGRlciA/PyAiIiksCiAgICB9KSwKICBdKTsKfQoKZnVuY3Rpb24gc2VsZWN0RmllbGQoeyBrZXksIHBsYWNlaG9sZGVyLCB2YWx1ZSwgb3B0aW9ucywgb25DaGFuZ2UsIGludmFsaWRhdGVUcmF2ZWxDaGVja0tpbmQsIHN0YXRlIH0gPSB7fSl7CiAgY29uc3QgY3VycmVudFZhbHVlID0gU3RyaW5nKHZhbHVlID8/ICIiKTsKICBjb25zdCBpdGVtcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucykgPyBvcHRpb25zIDogW107CiAgY29uc3Qgc2VsZWN0RWwgPSBlbCgic2VsZWN0IiwgewogICAgY2xhc3M6ICJpbnB1dCBpbnB1dC0tcGxhY2Vob2xkZXItbGciLAogICAgZGF0YXNldDogeyBmaWVsZEtleTogU3RyaW5nKGtleSA/PyAiIikgfSwKICAgICJhcmlhLWxhYmVsIjogU3RyaW5nKHBsYWNlaG9sZGVyID8/ICIiKSwKICAgIG9uQ2hhbmdlOiAoZSkgPT4gewogICAgICBjb25zdCBuZXh0ID0gU3RyaW5nKGU/LnRhcmdldD8udmFsdWUgPz8gIiIpOwogICAgICBpZiAodHlwZW9mIG9uQ2hhbmdlID09PSAiZnVuY3Rpb24iKXsKICAgICAgICBvbkNoYW5nZShuZXh0LCBlPy50YXJnZXQgfHwgbnVsbCk7CiAgICAgIH0KICAgICAgdHJ5ewogICAgICAgIGNvbnN0IGlucCA9IGU/LnRhcmdldDsKICAgICAgICBjb25zdCBmaWVsZFJvb3QgPSBpbnA/LmNsb3Nlc3Q/LigiLmZpZWxkIikgfHwgaW5wPy5wYXJlbnRFbGVtZW50OwogICAgICAgIGlmIChmaWVsZFJvb3QpIGZpZWxkUm9vdC5jbGFzc0xpc3QudG9nZ2xlKCJmaWVsZC0tZW1wdHkiLCAhaXNOb25FbXB0eShuZXh0KSk7CiAgICAgIH0gY2F0Y2ggKF9lKSB7fQogICAgICBpZiAoaW52YWxpZGF0ZVRyYXZlbENoZWNrS2luZCl7CiAgICAgICAgaW52YWxpZGF0ZURlbGl2ZXJ5VHJhdmVsQ2hlY2tGcm9tRXZlbnQoZSwgc3RhdGUsIGludmFsaWRhdGVUcmF2ZWxDaGVja0tpbmQpOwogICAgICB9CiAgICB9LAogIH0sIFsKICAgIGVsKCJvcHRpb24iLCB7IHZhbHVlOiAiIiB9LCBTdHJpbmcocGxhY2Vob2xkZXIgPz8gIiIpKSwKICAgIC4uLml0ZW1zLm1hcCgocm93KSA9PiBlbCgib3B0aW9uIiwgeyB2YWx1ZTogU3RyaW5nKHJvdz8udmFsdWUgPz8gIiIpIH0sIFN0cmluZyhyb3c/LmxhYmVsID8/ICIiKSkpLAogIF0pOwoKICB0cnl7CiAgICAvLyBJbXBvcnRhbnQ6IGFwcGx5IHRoZSBpbml0aWFsIHZhbHVlIG9ubHkgYWZ0ZXIgb3B0aW9ucyBleGlzdC4KICAgIC8vIE90aGVyd2lzZSBhIGhpZGRlbiBkZWxpdmVyeSBzZWxlY3QgY2FuIHN0YXkgdmlzdWFsbHkgZW1wdHkgd2hlbiBzaG93biBsYXRlci4KICAgIHNlbGVjdEVsLnZhbHVlID0gY3VycmVudFZhbHVlOwogICAgaWYgKFN0cmluZyhzZWxlY3RFbC52YWx1ZSA/PyAiIikgIT09IGN1cnJlbnRWYWx1ZSl7CiAgICAgIHNlbGVjdEVsLnZhbHVlID0gIiI7CiAgICB9CiAgfSBjYXRjaCAoX2UpIHt9CgogIGNvbnN0IGFwcGxpZWRWYWx1ZSA9IFN0cmluZyhzZWxlY3RFbD8udmFsdWUgPz8gIiIpOwogIHJldHVybiBlbCgiZGl2IiwgeyBjbGFzczogYGZpZWxkJHtpc05vbkVtcHR5KGFwcGxpZWRWYWx1ZSkgPyAiIiA6ICIgZmllbGQtLWVtcHR5In1gIH0sIFsKICAgIHNlbGVjdEVsLAogIF0pOwp9CgpmdW5jdGlvbiBub3JtYWxpemVGb3JNYXRjaChzKXsKICBjb25zdCByYXcgPSBTdHJpbmcocyA/PyAiIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7CiAgaWYgKCFyYXcpIHJldHVybiAiIjsKICAvLyBBY2NlbnQtaW5zZW5zaXRpdmUgbWF0Y2ggd2hlbiBzdXBwb3J0ZWQKICB0cnl7CiAgICByZXR1cm4gcmF3Lm5vcm1hbGl6ZSgiTkZEIikucmVwbGFjZSgvW1x1MDMwMC1cdTAzNmZdL2csICIiKTsKICB9IGNhdGNoIChfZSl7CiAgICByZXR1cm4gcmF3OwogIH0KfQoKZnVuY3Rpb24gZmlsdGVyRmlyc3ROYW1lcyh7IGxpc3QsIHF1ZXJ5LCBsaW1pdCA9IDEwIH0gPSB7fSl7CiAgY29uc3QgcSA9IG5vcm1hbGl6ZUZvck1hdGNoKHF1ZXJ5KTsKICBpZiAoIXEgfHwgcS5sZW5ndGggPCAyKSByZXR1cm4gW107CiAgY29uc3Qgb3V0ID0gW107CiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKTsKICBjb25zdCBhcnIgPSBBcnJheS5pc0FycmF5KGxpc3QpID8gbGlzdCA6IFtdOwogIGZvciAoY29uc3QgdiBvZiBhcnIpewogICAgY29uc3QgcyA9IFN0cmluZyh2ID8/ICIiKS50cmltKCk7CiAgICBpZiAoIXMpIGNvbnRpbnVlOwogICAgY29uc3Qga2V5ID0gbm9ybWFsaXplRm9yTWF0Y2gocyk7CiAgICBpZiAoIWtleSkgY29udGludWU7CiAgICBpZiAoIWtleS5zdGFydHNXaXRoKHEpKSBjb250aW51ZTsKICAgIGlmIChzZWVuLmhhcyhrZXkpKSBjb250aW51ZTsKICAgIHNlZW4uYWRkKGtleSk7CiAgICBvdXQucHVzaChzKTsKICAgIGlmIChvdXQubGVuZ3RoID49IGxpbWl0KSBicmVhazsKICB9CiAgcmV0dXJuIG91dDsKfQoKZnVuY3Rpb24gc2V0UHJvYmxlbWVBdHRlbnRpb24oY2FyZFJvb3QsIHJhd1ZhbHVlKXsKICBpZiAoIWNhcmRSb290KSByZXR1cm47CiAgY29uc3QgaW5wID0gY2FyZFJvb3QucXVlcnlTZWxlY3RvcignaW5wdXRbZGF0YS1maWVsZC1rZXk9InByb2JsZW1lIl0nKTsKICBpZiAoIWlucCkgcmV0dXJuOwogIGNvbnN0IGZpZWxkUm9vdCA9IGlucC5jbG9zZXN0KCIuZmllbGQiKSB8fCBpbnAucGFyZW50RWxlbWVudDsKICBpZiAoIWZpZWxkUm9vdCkgcmV0dXJuOwogIGNvbnN0IG9uID0gaXNOb25FbXB0eShyYXdWYWx1ZSk7CiAgdHJ5IHsgZmllbGRSb290LmNsYXNzTGlzdC50b2dnbGUoImZpZWxkLS1wcm9ibGVtZS1hbGVydCIsIG9uKTsgfSBjYXRjaCAoZSkge30KICB0cnkgeyBpbnAuc2V0QXR0cmlidXRlKCJhcmlhLWludmFsaWQiLCBvbiA/ICJ0cnVlIiA6ICJmYWxzZSIpOyB9IGNhdGNoIChlKSB7fQogIC8vIEhlbHBmdWwgZm9yIHNjcmVlbi1yZWFkZXJzIC8gUUEgaW5zcGVjdGlvbgogIHRyeSB7IGlucC5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLCBvbiA/ICJQcm9ibMOobWUgKMOgIGxpcmUpIiA6ICJQcm9ibMOobWUiKTsgfSBjYXRjaCAoZSkge30KfQoKZnVuY3Rpb24gcmVhZFN0b3BTbXNWYWx1ZShhbnlDbGllbnQpewogIGNvbnN0IGMgPSAoYW55Q2xpZW50ICYmIHR5cGVvZiBhbnlDbGllbnQgPT09ICJvYmplY3QiKSA/IGFueUNsaWVudCA6IHt9OwogIC8vIEFjY2VwdCBib3RoIHNuYWtlX2Nhc2UgYW5kIGNhbWVsQ2FzZSAoZGVmZW5zaXZlKS4KICBjb25zdCByYXcgPSAoYy5zdG9wU21zICE9IG51bGwpID8gYy5zdG9wU21zIDogYy5zdG9wX3NtczsKICBpZiAocmF3ID09PSB0cnVlIHx8IHJhdyA9PT0gMSB8fCByYXcgPT09ICIxIikgcmV0dXJuIDE7CiAgcmV0dXJuIDA7Cn0KCmZ1bmN0aW9uIGdldFNtc1N3aXRjaFZpc3VhbFN0YXRlKGFueUNsaWVudCl7CiAgY29uc3QgYyA9IChhbnlDbGllbnQgJiYgdHlwZW9mIGFueUNsaWVudCA9PT0gIm9iamVjdCIpID8gYW55Q2xpZW50IDoge307CiAgY29uc3QgY2lkID0gTnVtYmVyKGM/LmlkKTsKICBpZiAoIU51bWJlci5pc0Zpbml0ZShjaWQpIHx8IGNpZCA8PSAwKSByZXR1cm4gIm5ldXRyYWwiOyAvLyBtaWRkbGUgKGlkIG5vdCBsb2FkZWQpCiAgcmV0dXJuIDA7Cn0KCmZ1bmN0aW9uIHNldENhcmRGaWVsZFZhbHVlKGNhcmRSb290LCBrZXksIHZhbHVlKXsKICBpZiAoIWNhcmRSb290KSByZXR1cm47CiAgY29uc3QgaW5wdXQgPSBjYXJkUm9vdC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1maWVsZC1rZXk9IiR7U3RyaW5nKGtleSl9Il1gKTsKICBpZiAoIWlucHV0KSByZXR1cm47CiAgdHJ5IHsgaW5wdXQudmFsdWUgPSBTdHJpbmcodmFsdWUgPz8gIiIpOyB9IGNhdGNoIChfZSkge30KICB0cnl7CiAgICBjb25zdCBmaWVsZFJvb3QgPSBpbnB1dC5jbG9zZXN0KCIuZmllbGQiKSB8fCBpbnB1dC5wYXJlbnRFbGVtZW50OwogICAgaWYgKGZpZWxkUm9vdCkgZmllbGRSb290LmNsYXNzTGlzdC50b2dnbGUoImZpZWxkLS1lbXB0eSIsICFpc05vbkVtcHR5KGlucHV0LnZhbHVlKSk7CiAgfSBjYXRjaCAoX2UpIHt9Cn0KCmZ1bmN0aW9uIHNldFN0b3BTbXNTd2l0Y2goY2FyZFJvb3QsIHZpc3VhbFN0YXRlKXsKICBpZiAoIWNhcmRSb290KSByZXR1cm47CiAgY29uc3Qgc3cgPSBjYXJkUm9vdC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1yb2xlPSJzdG9wLXNtcy1zd2l0Y2giXScpOwogIGlmICghc3cpIHJldHVybjsKICBjb25zdCBzdCA9IFN0cmluZyh2aXN1YWxTdGF0ZSA/PyAiIikudHJpbSgpIHx8ICJuZXV0cmFsIjsKICBjb25zdCBpc05ldXRyYWwgPSAoc3QgPT09ICJuZXV0cmFsIik7CiAgY29uc3QgaXNSZWZ1c2VkID0gKHN0ID09PSAicmVmdXNlZCIpOwogIHRyeXsKICAgIHN3LmRhdGFzZXQuc3RhdGUgPSBzdDsgLy8gYWNjZXB0ZWQgfCBuZXV0cmFsIHwgcmVmdXNlZAogICAgc3cuc2V0QXR0cmlidXRlKCJhcmlhLWNoZWNrZWQiLCBpc05ldXRyYWwgPyAibWl4ZWQiIDogKGlzUmVmdXNlZCA/ICJ0cnVlIiA6ICJmYWxzZSIpKTsKICAgIHN3LnNldEF0dHJpYnV0ZSgiYXJpYS1kaXNhYmxlZCIsIGlzTmV1dHJhbCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwogICAgLy8gUHJldmVudCBpbnRlcmFjdGlvbiBpbiBuZXV0cmFsIHN0YXRlIChtaWRkbGUgY2Fubm90IGJlIHVzZXItc2VsZWN0ZWQpCiAgICBzdy5kaXNhYmxlZCA9IGlzTmV1dHJhbDsKICB9IGNhdGNoIChlKSB7fQp9CgpmdW5jdGlvbiBzdG9wU21zVG9hc3RNZXNzYWdlRnJvbUFwcGxpZWQoYXBwbGllZCl7CiAgLy8gYXBwbGllZDogMHwxICgwID0gYWNjZXB0ZWQvcmVjZWl2ZXMgU01TLCAxID0gcmVmdXNlZC9zdG9wIFNNUykKICBjb25zdCB2ID0gKGFwcGxpZWQgPT09IDEgfHwgYXBwbGllZCA9PT0gIjEiIHx8IGFwcGxpZWQgPT09IHRydWUpID8gMSA6IDA7CiAgcmV0dXJuIHYgPT09IDEKICAgID8gIkxlIGNsaWVudCBuZSByZWNldnJhIHBsdXMgZGUgU01TIgogICAgOiAiTGUgY2xpZW50IHJlY2V2cmEgbGVzIFNNUyI7Cn0KCmZ1bmN0aW9uIHN0b3BTbXNSb3coeyBzdGF0ZSwgY2FyZFJvb3QgfSA9IHt9KXsKICBjb25zdCBpbml0U3RhdGUgPSBnZXRTbXNTd2l0Y2hWaXN1YWxTdGF0ZShzdGF0ZT8uY2xpZW50KTsKICBjb25zdCBzdyA9IGVsKCJidXR0b24iLCB7CiAgICB0eXBlOiAiYnV0dG9uIiwKICAgIGNsYXNzOiAic3dpdGNoIHNtcy1zd2l0Y2giLAogICAgZGF0YXNldDogeyByb2xlOiAic3RvcC1zbXMtc3dpdGNoIiwga2luZDogInN0b3Bfc21zIiB9LAogICAgcm9sZTogInN3aXRjaCIsCiAgICAiYXJpYS1sYWJlbCI6ICJTdG9wIFNNUyIsCiAgICAiYXJpYS1jaGVja2VkIjogKGluaXRTdGF0ZSA9PT0gIm5ldXRyYWwiKSA/ICJtaXhlZCIgOiAoKGluaXRTdGF0ZSA9PT0gInJlZnVzZWQiKSA/ICJ0cnVlIiA6ICJmYWxzZSIpLAogICAgImFyaWEtZGlzYWJsZWQiOiAoaW5pdFN0YXRlID09PSAibmV1dHJhbCIpID8gInRydWUiIDogImZhbHNlIiwKICAgIGRpc2FibGVkOiAoaW5pdFN0YXRlID09PSAibmV1dHJhbCIpLAogICAgImRhdGEtc3RhdGUiOiBpbml0U3RhdGUsCiAgICBvbkNsaWNrOiBhc3luYyAoZSkgPT4gewogICAgICB0cnkgeyBlPy5wcmV2ZW50RGVmYXVsdD8uKCk7IH0gY2F0Y2ggKF9lKSB7fQogICAgICBpZiAoIXN0YXRlIHx8IHR5cGVvZiBzdGF0ZSAhPT0gIm9iamVjdCIpIHJldHVybjsKICAgICAgaWYgKCFzdGF0ZS5jbGllbnQgfHwgdHlwZW9mIHN0YXRlLmNsaWVudCAhPT0gIm9iamVjdCIpIHN0YXRlLmNsaWVudCA9IHt9OwoKICAgICAgY29uc3QgbGF0ZXN0Q2xpZW50ID0gc3RhdGUuY2xpZW50OwogICAgICBjb25zdCBjaWQgPSBOdW1iZXIobGF0ZXN0Q2xpZW50Py5pZCk7CiAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKGNpZCkgfHwgY2lkIDw9IDApewogICAgICAgIC8vIE5ldXRyYWwgc3RhdGUgaXMgbm90IHVzZXItc2VsZWN0YWJsZS4KICAgICAgICB0cnkgeyBzZXRTdG9wU21zU3dpdGNoKGNhcmRSb290LCAibmV1dHJhbCIpOyB9IGNhdGNoIChfZTIpIHt9CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBjb25zdCBwcmV2ID0gcmVhZFN0b3BTbXNWYWx1ZShsYXRlc3RDbGllbnQpOwogICAgICBjb25zdCBuZXh0ID0gcHJldiA/IDAgOiAxOwoKICAgICAgLy8gT3B0aW1pc3RpYyBVSSArIHN0YXRlCiAgICAgIGxhdGVzdENsaWVudC5zdG9wU21zID0gbmV4dDsKICAgICAgc2V0U3RvcFNtc1N3aXRjaChjYXJkUm9vdCwgZ2V0U21zU3dpdGNoVmlzdWFsU3RhdGUobGF0ZXN0Q2xpZW50KSk7CgogICAgICAvLyBEaXNhYmxlIGR1cmluZyBzYXZlIHRvIHByZXZlbnQgZG91YmxlIHRvZ2dsZXMKICAgICAgdHJ5ewogICAgICAgIHN3LmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICBzdy5zZXRBdHRyaWJ1dGUoImFyaWEtYnVzeSIsICJ0cnVlIik7CiAgICAgIH0gY2F0Y2ggKGUzKSB7fQoKICAgICAgdHJ5ewogICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHVwZGF0ZUNsaWVudFN0b3BTbXMoeyBjbGllbnRJZDogY2lkLCBzdG9wU21zOiBuZXh0IH0pOwogICAgICAgIGlmICghcmVzPy5vayl7CiAgICAgICAgICAvLyBSZXZlcnQgb24gZXJyb3IKICAgICAgICAgIGxhdGVzdENsaWVudC5zdG9wU21zID0gcHJldjsKICAgICAgICAgIHNldFN0b3BTbXNTd2l0Y2goY2FyZFJvb3QsIGdldFNtc1N3aXRjaFZpc3VhbFN0YXRlKGxhdGVzdENsaWVudCkpOwogICAgICAgICAgdHJ5IHsgdG9hc3QocmVzPy5lcnJvciB8fCAiSW1wb3NzaWJsZSBkZSBtZXR0cmUgw6Agam91ciBTdG9wIFNNUyIsIHsgYW5jaG9yRWw6IHN3LCBwbGFjZW1lbnQ6ICJ0b3AiIH0pOyB9IGNhdGNoIChlNCkge30KICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLy8gRW5zdXJlIHN0YXRlIG1hdGNoZXMgYmFja2VuZCByZXNwb25zZQogICAgICAgIGNvbnN0IGFwcGxpZWQgPSAocmVzLnN0b3Bfc21zID09PSAxIHx8IHJlcy5zdG9wX3NtcyA9PT0gIjEiIHx8IHJlcy5zdG9wX3NtcyA9PT0gdHJ1ZSkgPyAxIDogMDsKICAgICAgICBsYXRlc3RDbGllbnQuc3RvcFNtcyA9IGFwcGxpZWQ7CiAgICAgICAgc2V0U3RvcFNtc1N3aXRjaChjYXJkUm9vdCwgZ2V0U21zU3dpdGNoVmlzdWFsU3RhdGUobGF0ZXN0Q2xpZW50KSk7CiAgICAgICAgLy8gU3VjY2VzcyBVWCByZXF1aXJlbWVudDoKICAgICAgICAvLyAtIEdsb2JhbCB0b2FzdCBib3R0b20tY2VudGVyZWQgKG5vIGFuY2hvckVsIC8gcGxhY2VtZW50KQogICAgICAgIC8vIC0gRHluYW1pYyBtZXNzYWdlIGJhc2VkIG9uIGZpbmFsIGFwcGxpZWQgc3RhdGUKICAgICAgICB0cnkgeyB0b2FzdChzdG9wU21zVG9hc3RNZXNzYWdlRnJvbUFwcGxpZWQoYXBwbGllZCkpOyB9IGNhdGNoIChlNSkge30KICAgICAgfSBjYXRjaCAoZXJyKXsKICAgICAgICAvLyBSZXZlcnQgb24gbmV0d29yayBlcnJvcgogICAgICAgIGxhdGVzdENsaWVudC5zdG9wU21zID0gcHJldjsKICAgICAgICBzZXRTdG9wU21zU3dpdGNoKGNhcmRSb290LCBnZXRTbXNTd2l0Y2hWaXN1YWxTdGF0ZShsYXRlc3RDbGllbnQpKTsKICAgICAgICB0cnkgeyB0b2FzdCgiRXJyZXVyIHLDqXNlYXUgKFN0b3AgU01TKSIsIHsgYW5jaG9yRWw6IHN3LCBwbGFjZW1lbnQ6ICJ0b3AiIH0pOyB9IGNhdGNoIChlNikge30KICAgICAgfSBmaW5hbGx5IHsKICAgICAgICB0cnl7CiAgICAgICAgICAvLyBSZXN0b3JlIGVuYWJsZWQvZGlzYWJsZWQgYmFzZWQgb24gY3VycmVudCB2aXN1YWwgc3RhdGUuCiAgICAgICAgICBjb25zdCB2cyA9IGdldFNtc1N3aXRjaFZpc3VhbFN0YXRlKGxhdGVzdENsaWVudCk7CiAgICAgICAgICBzdy5kaXNhYmxlZCA9ICh2cyA9PT0gIm5ldXRyYWwiKTsKICAgICAgICAgIHN3LnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1idXN5Iik7CiAgICAgICAgfSBjYXRjaCAoZTcpIHt9CiAgICAgIH0KICAgIH0sCiAgfSwgWwogICAgZWwoInNwYW4iLCB7IGNsYXNzOiAic3dpdGNoX19rbm9iIiB9KSwKICBdKTsKCiAgcmV0dXJuIGVsKCJkaXYiLCB7fSwgWwogICAgZWwoImRpdiIsIHsgY2xhc3M6ICJzd2l0Y2gtcm93IiB9LCBbCiAgICAgIGVsKCJkaXYiLCB7IGNsYXNzOiAibmFtZSIgfSwgIlN0b3AgU01TIiksCiAgICAgIHN3LAogICAgXSksCiAgXSk7Cn0KCmZ1bmN0aW9uIHByb2JsZW1lRmllbGRXaXRoU2F2ZSh7IHBsYWNlaG9sZGVyLCB2YWx1ZSwgc3RhdGUsIG9uU2F2ZSB9ID0ge30pewogIGNvbnN0IGhhc1ZhbHVlID0gU3RyaW5nKHZhbHVlID8/ICIiKS50cmltKCkubGVuZ3RoID4gMDsKICBjb25zdCB3cmFwID0gZWwoImRpdiIsIHsgY2xhc3M6IGBmaWVsZCBmaWVsZC0tcHJvYmxlbWUke2hhc1ZhbHVlID8gIiIgOiAiIGZpZWxkLS1lbXB0eSJ9YCB9LCBbCiAgICAvLyBTaW5nbGUgZmllbGQ6IGlucHV0ICsgaW50ZWdyYXRlZCByaWdodCBhY3Rpb24gKGJldHRlciBhZXN0aGV0aWNzKS4KICAgIGVsKCJkaXYiLCB7IGNsYXNzOiAiZmllbGRfX2luYnRuIGZpZWxkX19pbmJ0bi0tb2siIH0sIFsKICAgICAgZWwoImlucHV0IiwgewogICAgICAgIGNsYXNzOiAiaW5wdXQgaW5wdXQtLXBsYWNlaG9sZGVyLWxnIGZpZWxkX19pbmJ0bi1pbnB1dCIsCiAgICAgICAgdmFsdWU6IFN0cmluZyh2YWx1ZSA/PyAiIiksCiAgICAgICAgcGxhY2Vob2xkZXI6IFN0cmluZyhwbGFjZWhvbGRlciA/PyAiIiksCiAgICAgICAgZGF0YXNldDogeyBmaWVsZEtleTogInByb2JsZW1lIiB9LAogICAgICAgICJhcmlhLWxhYmVsIjogU3RyaW5nKHBsYWNlaG9sZGVyID8/ICIiKSwKICAgICAgICBvbklucHV0OiAoZSkgPT4gewogICAgICAgICAgY29uc3QgdiA9IGU/LnRhcmdldD8udmFsdWUgPz8gIiI7CiAgICAgICAgICBpZiAoIXN0YXRlIHx8IHR5cGVvZiBzdGF0ZSAhPT0gIm9iamVjdCIpIHJldHVybjsKICAgICAgICAgIGlmICghc3RhdGUuY2xpZW50IHx8IHR5cGVvZiBzdGF0ZS5jbGllbnQgIT09ICJvYmplY3QiKSBzdGF0ZS5jbGllbnQgPSB7fTsKICAgICAgICAgIHN0YXRlLmNsaWVudC5wcm9ibGVtZSA9IFN0cmluZyh2KTsKICAgICAgICAgIC8vIEtlZXAgZW1wdHkvbm9uLWVtcHR5IHZpc3VhbCBzdGF0ZSBpbiBzeW5jIHdpdGhvdXQgYSBmdWxsIHJlLXJlbmRlci4KICAgICAgICAgIHRyeXsKICAgICAgICAgICAgY29uc3QgaW5wID0gZT8udGFyZ2V0OwogICAgICAgICAgICBjb25zdCBmaWVsZFJvb3QgPSBpbnA/LmNsb3Nlc3Q/LigiLmZpZWxkIikgfHwgaW5wPy5wYXJlbnRFbGVtZW50OwogICAgICAgICAgICBpZiAoZmllbGRSb290KSBmaWVsZFJvb3QuY2xhc3NMaXN0LnRvZ2dsZSgiZmllbGQtLWVtcHR5IiwgIWlzTm9uRW1wdHkodikpOwogICAgICAgICAgfSBjYXRjaCAoZTMpIHt9CiAgICAgICAgICAvLyBFbnN1cmUgYXR0ZW50aW9uIHN0eWxpbmcgc3RheXMgaW4gc3luYy4KICAgICAgICAgIHRyeXsKICAgICAgICAgICAgY29uc3QgY2FyZFJvb3QgPSBlPy50YXJnZXQ/LmNsb3Nlc3Q/LigiLmNhcmQiKTsKICAgICAgICAgICAgc2V0UHJvYmxlbWVBdHRlbnRpb24oY2FyZFJvb3QsIHYpOwogICAgICAgICAgfSBjYXRjaCAoZTIpIHt9CiAgICAgICAgfSwKICAgICAgfSksCiAgICAgIGVsKCJidXR0b24iLCB7CiAgICAgICAgdHlwZTogImJ1dHRvbiIsCiAgICAgICAgY2xhc3M6ICJmaWVsZF9faW5idG4tYnRuIGZpZWxkX19pbmJ0bi1idG4tLW9rIiwKICAgICAgICB0aXRsZTogIk1ldHRyZSDDoCBqb3VyIFByb2Jsw6htZSIsCiAgICAgICAgImFyaWEtbGFiZWwiOiAiTWV0dHJlIMOgIGpvdXIgUHJvYmzDqG1lIiwKICAgICAgICBvbkNsaWNrOiBhc3luYyAoZSkgPT4gewogICAgICAgICAgdHJ5IHsgZT8ucHJldmVudERlZmF1bHQ/LigpOyB9IGNhdGNoIChfZSkge30KICAgICAgICAgIGlmICh0eXBlb2Ygb25TYXZlID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgIHRyeSB7IGF3YWl0IG9uU2F2ZShlPy5jdXJyZW50VGFyZ2V0IHx8IG51bGwpOyB9IGNhdGNoIChfZTIpIHt9CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgfSwgIk9LIiksCiAgICBdKSwKICBdKTsKICByZXR1cm4gd3JhcDsKfQoKZnVuY3Rpb24gZmllbGQoeyBrZXksIHBsYWNlaG9sZGVyLCB2YWx1ZSwgc3RhdGUgfSA9IHt9KXsKICBjb25zdCBoYXNWYWx1ZSA9IFN0cmluZyh2YWx1ZSA/PyAiIikudHJpbSgpLmxlbmd0aCA+IDA7CiAgcmV0dXJuIGVsKCJkaXYiLCB7IGNsYXNzOiBgZmllbGQke2hhc1ZhbHVlID8gIiIgOiAiIGZpZWxkLS1lbXB0eSJ9YCB9LCBbCiAgICBlbCgiaW5wdXQiLCB7CiAgICAgIGNsYXNzOiAiaW5wdXQgaW5wdXQtLXBsYWNlaG9sZGVyLWxnIiwKICAgICAgdmFsdWU6IFN0cmluZyh2YWx1ZSA/PyAiIiksCiAgICAgIC8vIEFsd2F5cyBrZWVwIHRoZSBsYWJlbCBhcyBwbGFjZWhvbGRlciBzbyBpdCByZWFwcGVhcnMgaWYgdGhlIHVzZXIgY2xlYXJzIHRoZSBmaWVsZC4KICAgICAgcGxhY2Vob2xkZXI6IFN0cmluZyhwbGFjZWhvbGRlciA/PyAiIiksCiAgICAgIGRhdGFzZXQ6IHsgZmllbGRLZXk6IFN0cmluZyhrZXkgPz8gIiIpIH0sCiAgICAgIC8vIEVkaXRhYmxlIGZpZWxkczogcGVyc2lzdCBsaXZlIGVkaXRzIGludG8gc3RhdGUuY2xpZW50CiAgICAgIG9uSW5wdXQ6IChlKSA9PiB7CiAgICAgICAgY29uc3QgdiA9IGU/LnRhcmdldD8udmFsdWUgPz8gIiI7CiAgICAgICAgaWYgKCFzdGF0ZSB8fCB0eXBlb2Ygc3RhdGUgIT09ICJvYmplY3QiKSByZXR1cm47CiAgICAgICAgaWYgKCFzdGF0ZS5jbGllbnQgfHwgdHlwZW9mIHN0YXRlLmNsaWVudCAhPT0gIm9iamVjdCIpIHN0YXRlLmNsaWVudCA9IHt9OwogICAgICAgIHN0YXRlLmNsaWVudFtrZXldID0gU3RyaW5nKHYpOwogICAgICAgIC8vIEtlZXAgZW1wdHkvbm9uLWVtcHR5IHZpc3VhbCBzdGF0ZSBpbiBzeW5jIHdpdGhvdXQgYSBmdWxsIHJlLXJlbmRlci4KICAgICAgICB0cnl7CiAgICAgICAgICBjb25zdCBpbnAgPSBlPy50YXJnZXQ7CiAgICAgICAgICBjb25zdCBmaWVsZFJvb3QgPSBpbnA/LmNsb3Nlc3Q/LigiLmZpZWxkIikgfHwgaW5wPy5wYXJlbnRFbGVtZW50OwogICAgICAgICAgaWYgKGZpZWxkUm9vdCkgZmllbGRSb290LmNsYXNzTGlzdC50b2dnbGUoImZpZWxkLS1lbXB0eSIsICFpc05vbkVtcHR5KHYpKTsKICAgICAgICB9IGNhdGNoIChlMykge30KICAgICAgICBpZiAoWyJhZHJlc3NlIiwgImNvbXBsZW1lbnRBZHJlc3NlIiwgImNvZGVQb3N0YWwiLCAidmlsbGUiXS5pbmNsdWRlcyhTdHJpbmcoa2V5ID8/ICIiKSkpewogICAgICAgICAgaW52YWxpZGF0ZURlbGl2ZXJ5VHJhdmVsQ2hlY2tGcm9tRXZlbnQoZSwgc3RhdGUsICJjbGllbnQiKTsKICAgICAgICB9CiAgICAgICAgLy8gU3BlY2lhbCBVWDogaWYgInByb2JsZW1lIiBpcyBub3QgZW1wdHkgPT4gYXR0cmFjdCBhdHRlbnRpb24gYXJvdW5kIHRoZSBmaWVsZC4KICAgICAgICBpZiAoU3RyaW5nKGtleSA/PyAiIikgPT09ICJwcm9ibGVtZSIpewogICAgICAgICAgLy8gYHRoaXNgIGlzIHVucmVsaWFibGUgaGVyZTsgdXNlIERPTSB0cmF2ZXJzYWwgZnJvbSBldmVudCB0YXJnZXQuCiAgICAgICAgICBjb25zdCBjYXJkUm9vdCA9IGU/LnRhcmdldD8uY2xvc2VzdD8uKCIuY2FyZCIpOwogICAgICAgICAgdHJ5IHsgc2V0UHJvYmxlbWVBdHRlbnRpb24oY2FyZFJvb3QsIHYpOyB9IGNhdGNoIChlMikge30KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJhcmlhLWxhYmVsIjogU3RyaW5nKHBsYWNlaG9sZGVyID8/ICIiKSwKICAgIH0pLAogIF0pOwp9CgpmdW5jdGlvbiBmaXJzdE5hbWVGaWVsZCh7IHBsYWNlaG9sZGVyLCB2YWx1ZSwgc3RhdGUgfSA9IHt9KXsKICBjb25zdCBoYXNWYWx1ZSA9IFN0cmluZyh2YWx1ZSA/PyAiIikudHJpbSgpLmxlbmd0aCA+IDA7CiAgY29uc3Qgd3JhcCA9IGVsKCJkaXYiLCB7IGNsYXNzOiBgZmllbGQgZmllbGQtLWZuJHtoYXNWYWx1ZSA/ICIiIDogIiBmaWVsZC0tZW1wdHkifWAgfSwgWwogICAgZWwoImRpdiIsIHsgY2xhc3M6ICJmbi1hdXRvY29tcGxldGUiIH0sIFsKICAgICAgZWwoImlucHV0IiwgewogICAgICAgIGNsYXNzOiAiaW5wdXQgaW5wdXQtLXBsYWNlaG9sZGVyLWxnIiwKICAgICAgICB2YWx1ZTogU3RyaW5nKHZhbHVlID8/ICIiKSwKICAgICAgICBwbGFjZWhvbGRlcjogU3RyaW5nKHBsYWNlaG9sZGVyID8/ICIiKSwKICAgICAgICBkYXRhc2V0OiB7IGZpZWxkS2V5OiAicHJlbm9tIiB9LAogICAgICAgICJhcmlhLWxhYmVsIjogU3RyaW5nKHBsYWNlaG9sZGVyID8/ICIiKSwKICAgICAgICBhdXRvY29tcGxldGU6ICJvZmYiLAogICAgICAgIGF1dG9jYXBpdGFsaXplOiAib2ZmIiwKICAgICAgICBzcGVsbGNoZWNrOiAiZmFsc2UiLAogICAgICB9KSwKICAgICAgZWwoImRpdiIsIHsKICAgICAgICBjbGFzczogImZuLWxpc3QgaXMtaGlkZGVuIiwKICAgICAgICByb2xlOiAibGlzdGJveCIsCiAgICAgICAgImFyaWEtbGFiZWwiOiAiU3VnZ2VzdGlvbnMgZGUgcHLDqW5vbXMiLAogICAgICB9KSwKICAgIF0pLAogIF0pOwoKICBjb25zdCBpbnAgPSB3cmFwLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W2RhdGEtZmllbGQta2V5PSJwcmVub20iXScpOwogIGNvbnN0IGxpc3RFbCA9IHdyYXAucXVlcnlTZWxlY3RvcigiLmZuLWxpc3QiKTsKICBpZiAoIWlucCB8fCAhbGlzdEVsKSByZXR1cm4gd3JhcDsKCiAgbGV0IHNlbGVjdGVkSWR4ID0gLTE7CiAgbGV0IGxhc3RJdGVtcyA9IFtdOwogIGxldCBibHVyVGltZXIgPSBudWxsOwoKICBmdW5jdGlvbiBoaWRlKCl7CiAgICBzZWxlY3RlZElkeCA9IC0xOwogICAgbGFzdEl0ZW1zID0gW107CiAgICB0cnl7IGxpc3RFbC5pbm5lckhUTUwgPSAiIjsgfSBjYXRjaCAoX2UpIHt9CiAgICB0cnl7IGxpc3RFbC5jbGFzc0xpc3QuYWRkKCJpcy1oaWRkZW4iKTsgfSBjYXRjaCAoX2UpIHt9CiAgfQoKICBmdW5jdGlvbiBzaG93KGl0ZW1zKXsKICAgIGxhc3RJdGVtcyA9IEFycmF5LmlzQXJyYXkoaXRlbXMpID8gaXRlbXMgOiBbXTsKICAgIHNlbGVjdGVkSWR4ID0gLTE7CiAgICB0cnl7IGxpc3RFbC5pbm5lckhUTUwgPSAiIjsgfSBjYXRjaCAoX2UpIHt9CiAgICBpZiAoIWxhc3RJdGVtcy5sZW5ndGgpewogICAgICBoaWRlKCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGFzdEl0ZW1zLmxlbmd0aDsgaSsrKXsKICAgICAgY29uc3QgbmFtZSA9IFN0cmluZyhsYXN0SXRlbXNbaV0gPz8gIiIpOwogICAgICBjb25zdCByb3cgPSBlbCgiYnV0dG9uIiwgewogICAgICAgIHR5cGU6ICJidXR0b24iLAogICAgICAgIGNsYXNzOiAiZm4taXRlbSIsCiAgICAgICAgcm9sZTogIm9wdGlvbiIsCiAgICAgICAgZGF0YXNldDogeyBpZHg6IFN0cmluZyhpKSB9LAogICAgICAgIG9uTW91c2VEb3duOiAoZSkgPT4gewogICAgICAgICAgLy8gbW91c2Vkb3duIGZpcmVzIGJlZm9yZSBibHVyOyBrZWVwIGNsaWNrIHdvcmtpbmcuCiAgICAgICAgICB0cnl7IGU/LnByZXZlbnREZWZhdWx0Py4oKTsgfSBjYXRjaCAoX2UyKSB7fQogICAgICAgIH0sCiAgICAgICAgb25DbGljazogKGUpID0+IHsKICAgICAgICAgIHRyeXsgZT8ucHJldmVudERlZmF1bHQ/LigpOyB9IGNhdGNoIChfZTIpIHt9CiAgICAgICAgICBjb25zdCBwaWNrZWQgPSBTdHJpbmcobmFtZSA/PyAiIik7CiAgICAgICAgICB0cnl7IGlucC52YWx1ZSA9IHBpY2tlZDsgfSBjYXRjaCAoX2UzKSB7fQogICAgICAgICAgaWYgKHN0YXRlICYmIHR5cGVvZiBzdGF0ZSA9PT0gIm9iamVjdCIpewogICAgICAgICAgICBpZiAoIXN0YXRlLmNsaWVudCB8fCB0eXBlb2Ygc3RhdGUuY2xpZW50ICE9PSAib2JqZWN0Iikgc3RhdGUuY2xpZW50ID0ge307CiAgICAgICAgICAgIHN0YXRlLmNsaWVudC5wcmVub20gPSBwaWNrZWQ7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBTeW5jIGVtcHR5L25vbi1lbXB0eSBzdHlsZQogICAgICAgICAgdHJ5ewogICAgICAgICAgICBjb25zdCBmaWVsZFJvb3QgPSBpbnAuY2xvc2VzdCgiLmZpZWxkIikgfHwgaW5wLnBhcmVudEVsZW1lbnQ7CiAgICAgICAgICAgIGlmIChmaWVsZFJvb3QpIGZpZWxkUm9vdC5jbGFzc0xpc3QudG9nZ2xlKCJmaWVsZC0tZW1wdHkiLCAhaXNOb25FbXB0eShwaWNrZWQpKTsKICAgICAgICAgIH0gY2F0Y2ggKF9lNCkge30KICAgICAgICAgIGhpZGUoKTsKICAgICAgICB9LAogICAgICB9LCBuYW1lKTsKICAgICAgdHJ5eyBsaXN0RWwuYXBwZW5kQ2hpbGQocm93KTsgfSBjYXRjaCAoX2UpIHt9CiAgICB9CiAgICB0cnl7IGxpc3RFbC5jbGFzc0xpc3QucmVtb3ZlKCJpcy1oaWRkZW4iKTsgfSBjYXRjaCAoX2UpIHt9CiAgfQoKICBmdW5jdGlvbiByZW5kZXJGcm9tSW5wdXQoKXsKICAgIGNvbnN0IHYgPSBTdHJpbmcoaW5wLnZhbHVlID8/ICIiKTsKICAgIGlmIChzdGF0ZSAmJiB0eXBlb2Ygc3RhdGUgPT09ICJvYmplY3QiKXsKICAgICAgaWYgKCFzdGF0ZS5jbGllbnQgfHwgdHlwZW9mIHN0YXRlLmNsaWVudCAhPT0gIm9iamVjdCIpIHN0YXRlLmNsaWVudCA9IHt9OwogICAgICBzdGF0ZS5jbGllbnQucHJlbm9tID0gdjsKICAgIH0KICAgIC8vIEtlZXAgZW1wdHkvbm9uLWVtcHR5IHZpc3VhbCBzdGF0ZSBpbiBzeW5jIHdpdGhvdXQgYSBmdWxsIHJlLXJlbmRlci4KICAgIHRyeXsKICAgICAgY29uc3QgZmllbGRSb290ID0gaW5wLmNsb3Nlc3QoIi5maWVsZCIpIHx8IGlucC5wYXJlbnRFbGVtZW50OwogICAgICBpZiAoZmllbGRSb290KSBmaWVsZFJvb3QuY2xhc3NMaXN0LnRvZ2dsZSgiZmllbGQtLWVtcHR5IiwgIWlzTm9uRW1wdHkodikpOwogICAgfSBjYXRjaCAoX2UpIHt9CgogICAgY29uc3QgaXRlbXMgPSBmaWx0ZXJGaXJzdE5hbWVzKHsKICAgICAgbGlzdDogc3RhdGU/LmZpcnN0TmFtZXMsCiAgICAgIHF1ZXJ5OiB2LAogICAgICBsaW1pdDogMTAsCiAgICB9KTsKICAgIHNob3coaXRlbXMpOwogIH0KCiAgZnVuY3Rpb24gcmVmcmVzaEFjdGl2ZUl0ZW0oKXsKICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShsaXN0RWwucXVlcnlTZWxlY3RvckFsbCgiLmZuLWl0ZW0iKSk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKXsKICAgICAgY29uc3Qgb24gPSAoaSA9PT0gc2VsZWN0ZWRJZHgpOwogICAgICB0cnl7IGNoaWxkcmVuW2ldLmNsYXNzTGlzdC50b2dnbGUoImlzLWFjdGl2ZSIsIG9uKTsgfSBjYXRjaCAoX2UpIHt9CiAgICAgIHRyeXsgY2hpbGRyZW5baV0uc2V0QXR0cmlidXRlKCJhcmlhLXNlbGVjdGVkIiwgb24gPyAidHJ1ZSIgOiAiZmFsc2UiKTsgfSBjYXRjaCAoX2UyKSB7fQogICAgfQogICAgaWYgKHNlbGVjdGVkSWR4ID49IDApewogICAgICBjb25zdCBlbEFjdGl2ZSA9IGNoaWxkcmVuW3NlbGVjdGVkSWR4XTsKICAgICAgdHJ5eyBlbEFjdGl2ZT8uc2Nyb2xsSW50b1ZpZXc/Lih7IGJsb2NrOiAibmVhcmVzdCIgfSk7IH0gY2F0Y2ggKF9lKSB7fQogICAgfQogIH0KCiAgaW5wLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IiwgKCkgPT4gewogICAgaWYgKGJsdXJUaW1lcil7IHRyeXsgY2xlYXJUaW1lb3V0KGJsdXJUaW1lcik7IH0gY2F0Y2ggKF9lKSB7fSBibHVyVGltZXIgPSBudWxsOyB9CiAgICByZW5kZXJGcm9tSW5wdXQoKTsKICB9KTsKCiAgaW5wLmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCAoZSkgPT4gewogICAgaWYgKCFlKSByZXR1cm47CiAgICBjb25zdCB2aXNpYmxlID0gIWxpc3RFbC5jbGFzc0xpc3QuY29udGFpbnMoImlzLWhpZGRlbiIpOwogICAgaWYgKCF2aXNpYmxlKXsKICAgICAgaWYgKGUua2V5ID09PSAiRXNjYXBlIikgaGlkZSgpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoZS5rZXkgPT09ICJFc2NhcGUiKXsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBoaWRlKCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChlLmtleSA9PT0gIkFycm93RG93biIpewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHNlbGVjdGVkSWR4ID0gTWF0aC5taW4oKGxhc3RJdGVtcy5sZW5ndGggLSAxKSwgc2VsZWN0ZWRJZHggKyAxKTsKICAgICAgcmVmcmVzaEFjdGl2ZUl0ZW0oKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGUua2V5ID09PSAiQXJyb3dVcCIpewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHNlbGVjdGVkSWR4ID0gTWF0aC5tYXgoMCwgc2VsZWN0ZWRJZHggLSAxKTsKICAgICAgcmVmcmVzaEFjdGl2ZUl0ZW0oKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGUua2V5ID09PSAiRW50ZXIiKXsKICAgICAgaWYgKHNlbGVjdGVkSWR4ID49IDAgJiYgc2VsZWN0ZWRJZHggPCBsYXN0SXRlbXMubGVuZ3RoKXsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgY29uc3QgcGlja2VkID0gU3RyaW5nKGxhc3RJdGVtc1tzZWxlY3RlZElkeF0gPz8gIiIpOwogICAgICAgIHRyeXsgaW5wLnZhbHVlID0gcGlja2VkOyB9IGNhdGNoIChfZTIpIHt9CiAgICAgICAgaWYgKHN0YXRlICYmIHR5cGVvZiBzdGF0ZSA9PT0gIm9iamVjdCIpewogICAgICAgICAgaWYgKCFzdGF0ZS5jbGllbnQgfHwgdHlwZW9mIHN0YXRlLmNsaWVudCAhPT0gIm9iamVjdCIpIHN0YXRlLmNsaWVudCA9IHt9OwogICAgICAgICAgc3RhdGUuY2xpZW50LnByZW5vbSA9IHBpY2tlZDsKICAgICAgICB9CiAgICAgICAgdHJ5ewogICAgICAgICAgY29uc3QgZmllbGRSb290ID0gaW5wLmNsb3Nlc3QoIi5maWVsZCIpIHx8IGlucC5wYXJlbnRFbGVtZW50OwogICAgICAgICAgaWYgKGZpZWxkUm9vdCkgZmllbGRSb290LmNsYXNzTGlzdC50b2dnbGUoImZpZWxkLS1lbXB0eSIsICFpc05vbkVtcHR5KHBpY2tlZCkpOwogICAgICAgIH0gY2F0Y2ggKF9lMykge30KICAgICAgICBoaWRlKCk7CiAgICAgIH0KICAgIH0KICB9KTsKCiAgaW5wLmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLCAoKSA9PiB7CiAgICBpZiAoYmx1clRpbWVyKXsgdHJ5eyBjbGVhclRpbWVvdXQoYmx1clRpbWVyKTsgfSBjYXRjaCAoX2UpIHt9IH0KICAgIC8vIFNtYWxsIGRlbGF5IHNvIGEgY2xpY2sgb24gYSBzdWdnZXN0aW9uIGNhbiBiZSBwcm9jZXNzZWQuCiAgICBibHVyVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgYmx1clRpbWVyID0gbnVsbDsKICAgICAgaGlkZSgpOwogICAgfSwgMTIwKTsKICB9KTsKCiAgaW5wLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIiwgKCkgPT4gewogICAgLy8gUmVjb21wdXRlIG9uIGZvY3VzIGlmIHVzZXIgYWxyZWFkeSB0eXBlZCBlbm91Z2guCiAgICB0cnl7CiAgICAgIGNvbnN0IHYgPSBTdHJpbmcoaW5wLnZhbHVlID8/ICIiKTsKICAgICAgaWYgKHYudHJpbSgpLmxlbmd0aCA+PSAyKSByZW5kZXJGcm9tSW5wdXQoKTsKICAgIH0gY2F0Y2ggKF9lKSB7fQogIH0pOwoKICByZXR1cm4gd3JhcDsKfQoKZnVuY3Rpb24gbG95YWx0eVBpbGwocG9pbnRzLCBvcHRzID0ge30pewogIGNvbnN0IG4gPSBOdW1iZXIocG9pbnRzKTsKICBpZiAoIU51bWJlci5pc0Zpbml0ZShuKSkgcmV0dXJuIG51bGw7CiAgY29uc3Qgcm91bmRlZCA9IE1hdGgucm91bmQobik7CiAgY29uc3QgbGFiZWwgPSAocm91bmRlZCA9PT0gMSkgPyAicG9pbnQiIDogInBvaW50cyI7CiAgY29uc3QgaXNBbGVydCA9ICEhb3B0cz8uaXNBbGVydDsKICByZXR1cm4gZWwoImRpdiIsIHsKICAgIGNsYXNzOiBgbG95YWx0eS1waWxsJHtpc0FsZXJ0ID8gIiBsb3lhbHR5LXBpbGwtLWFsZXJ0IiA6ICIifWAsCiAgICByb2xlOiAic3RhdHVzIiwKICAgICJhcmlhLWxhYmVsIjogIlBvaW50cyBmaWTDqWxpdMOpIiwKICB9LCBbCiAgICBlbCgic3BhbiIsIHsgY2xhc3M6ICJsb3lhbHR5LXBpbGxfX3ZhbHVlIiB9LCBTdHJpbmcocm91bmRlZCkpLAogICAgZWwoInNwYW4iLCB7IGNsYXNzOiAibG95YWx0eS1waWxsX19sYWJlbCIgfSwgbGFiZWwpLAogIF0pOwp9CgpmdW5jdGlvbiBsb3lhbHR5UGlsbEJ1dHRvbihwb2ludHMsIG9wdHMgPSB7fSl7CiAgY29uc3QgbiA9IE51bWJlcihwb2ludHMpOwogIGlmICghTnVtYmVyLmlzRmluaXRlKG4pKSByZXR1cm4gbnVsbDsKICBjb25zdCByb3VuZGVkID0gTWF0aC5yb3VuZChuKTsKICBjb25zdCBsYWJlbCA9IChyb3VuZGVkID09PSAxKSA/ICJwb2ludCIgOiAicG9pbnRzIjsKICBjb25zdCBpc0FsZXJ0ID0gISFvcHRzPy5pc0FsZXJ0OwogIHJldHVybiBlbCgiYnV0dG9uIiwgewogICAgdHlwZTogImJ1dHRvbiIsCiAgICBjbGFzczogYGxveWFsdHktcGlsbCBsb3lhbHR5LXBpbGwtLWhkJHtpc0FsZXJ0ID8gIiBsb3lhbHR5LXBpbGwtLWFsZXJ0IiA6ICIifWAsCiAgICAiYXJpYS1sYWJlbCI6ICJQb2ludHMgZmlkw6lsaXTDqSIsCiAgICB0aXRsZTogIk1vZGlmaWVyIHBvaW50cyBmaWTDqWxpdMOpIiwKICB9LCBbCiAgICBlbCgic3BhbiIsIHsgY2xhc3M6ICJsb3lhbHR5LXBpbGxfX3ZhbHVlIiB9LCBTdHJpbmcocm91bmRlZCkpLAogICAgZWwoInNwYW4iLCB7IGNsYXNzOiAibG95YWx0eS1waWxsX19sYWJlbCIgfSwgbGFiZWwpLAogIF0pOwp9CgpmdW5jdGlvbiBnZXRDbGllbnRMb3lhbHR5VG90YWxQb2ludHMoYW55Q2xpZW50KXsKICBjb25zdCBjID0gKGFueUNsaWVudCAmJiB0eXBlb2YgYW55Q2xpZW50ID09PSAib2JqZWN0IikgPyBhbnlDbGllbnQgOiB7fTsKCiAgY29uc3QgdG90YWwgPSBOdW1iZXIoYz8ucG9pbnRzRmlkVG90YWwpOwogIGlmIChOdW1iZXIuaXNGaW5pdGUodG90YWwpKSByZXR1cm4gTWF0aC50cnVuYyh0b3RhbCk7CgogIC8vIERlZmVuc2l2ZSBmYWxsYmFjazoKICAvLyB3aGVuIG9ubHkgdGhlIGRpc3BsYXkgdmFsdWUgaXMgcHJlc2VudCBpbiBVSSBzdGF0ZSwgcmVjb25zdHJ1Y3QgdGhlIGVkaXRhYmxlCiAgLy8gdG90YWwgYnkgcmUtYWRkaW5nIGN1cnJlbnRseSByZXNlcnZlZCBsb3lhbHR5IHBvaW50cy4KICBjb25zdCBkaXNwbGF5ID0gTnVtYmVyKGM/LnBvaW50c0ZpZERpc3BsYXkpOwogIGNvbnN0IHJlc2VydmVkID0gTnVtYmVyKGM/LmxveWFsdHlSZXNlcnZlZFBvaW50cyk7CiAgaWYgKE51bWJlci5pc0Zpbml0ZShkaXNwbGF5KSkgewogICAgY29uc3QgcmVjb25zdHJ1Y3RlZCA9IGRpc3BsYXkgKyAoTnVtYmVyLmlzRmluaXRlKHJlc2VydmVkKSA/IHJlc2VydmVkIDogMCk7CiAgICByZXR1cm4gTWF0aC50cnVuYyhyZWNvbnN0cnVjdGVkKTsKICB9CgogIHJldHVybiAwOwp9CgpmdW5jdGlvbiBzZXRMb3lhbHR5UGlsbChjYXJkUm9vdCwgcG9pbnRzLCBvcHRzID0ge30pewogIGlmICghY2FyZFJvb3QpIHJldHVybjsKICBjb25zdCBob3N0ID0KICAgIGNhcmRSb290LnF1ZXJ5U2VsZWN0b3IoIi5jYXJkX19oZCAuY2FyZF9fYWN0aW9ucyIpIHx8CiAgICBjYXJkUm9vdC5xdWVyeVNlbGVjdG9yKCIuY2FyZF9faGQiKTsKICBpZiAoIWhvc3QpIHJldHVybjsKCiAgY29uc3QgbiA9IE51bWJlcihwb2ludHMpOwogIGNvbnN0IGhhcyA9IE51bWJlci5pc0Zpbml0ZShuKTsKICBjb25zdCBpc0FsZXJ0ID0gISFvcHRzPy5pc0FsZXJ0OwoKICBjb25zdCBleGlzdGluZyA9IGNhcmRSb290LnF1ZXJ5U2VsZWN0b3IoIi5sb3lhbHR5LXBpbGwubG95YWx0eS1waWxsLS1oZCIpOwogIGNvbnN0IGV4aXN0aW5nTm90ZSA9IGNhcmRSb290LnF1ZXJ5U2VsZWN0b3IoIi5sb3lhbHR5LXBpbGwtbm90ZSIpOwogIGlmICghaGFzKXsKICAgIGlmIChleGlzdGluZykgewogICAgICB0cnkgeyBleGlzdGluZy5yZW1vdmUoKTsgfSBjYXRjaCAoZSkge30KICAgIH0KICAgIGlmIChleGlzdGluZ05vdGUpIHsKICAgICAgdHJ5IHsgZXhpc3RpbmdOb3RlLnJlbW92ZSgpOyB9IGNhdGNoIChlKSB7fQogICAgfQogICAgcmV0dXJuOwogIH0KCiAgY29uc3Qgcm91bmRlZCA9IE1hdGgucm91bmQobik7CiAgY29uc3QgbGFiZWwgPSAocm91bmRlZCA9PT0gMSkgPyAicG9pbnQiIDogInBvaW50cyI7CgogIGlmIChleGlzdGluZyl7CiAgICBjb25zdCB2YWxFbCA9IGV4aXN0aW5nLnF1ZXJ5U2VsZWN0b3IoIi5sb3lhbHR5LXBpbGxfX3ZhbHVlIik7CiAgICBjb25zdCBsYWJFbCA9IGV4aXN0aW5nLnF1ZXJ5U2VsZWN0b3IoIi5sb3lhbHR5LXBpbGxfX2xhYmVsIik7CiAgICBpZiAodmFsRWwpIHZhbEVsLnRleHRDb250ZW50ID0gU3RyaW5nKHJvdW5kZWQpOwogICAgaWYgKGxhYkVsKSBsYWJFbC50ZXh0Q29udGVudCA9IGxhYmVsOwogICAgZXhpc3RpbmcuY2xhc3NMaXN0LnRvZ2dsZSgibG95YWx0eS1waWxsLS1hbGVydCIsIGlzQWxlcnQpOwogICAgLy8gTm90ZSB1bmRlciBwaWxsCiAgICBpZiAoaXNBbGVydCl7CiAgICAgIGlmICghZXhpc3RpbmdOb3RlKXsKICAgICAgICBjb25zdCBub3RlID0gZWwoImRpdiIsIHsgY2xhc3M6ICJsb3lhbHR5LXBpbGwtbm90ZSIsIHJvbGU6ICJub3RlIiB9LCAiRmlkw6lsaXTDqSB1dGlsaXPDqWUgY2Ugam91ciIpOwogICAgICAgIHRyeSB7CiAgICAgICAgICBob3N0Lmluc2VydEFkamFjZW50RWxlbWVudCgiYWZ0ZXJlbmQiLCBub3RlKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICB0cnkgeyBjYXJkUm9vdC5xdWVyeVNlbGVjdG9yKCIuY2FyZF9fYmQiKT8uaW5zZXJ0QmVmb3JlKG5vdGUsIGNhcmRSb290LnF1ZXJ5U2VsZWN0b3IoIi5jYXJkX19iZCIpPy5maXJzdENoaWxkIHx8IG51bGwpOyB9IGNhdGNoIChlMikge30KICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmIChleGlzdGluZ05vdGUpewogICAgICAgIHRyeSB7IGV4aXN0aW5nTm90ZS5yZW1vdmUoKTsgfSBjYXRjaCAoZSkge30KICAgICAgfQogICAgfQogICAgcmV0dXJuOwogIH0KCiAgLy8gSW5zZXJ0IGNvbXBhY3QgYnV0dG9uIGluIGNhcmQgaGVhZGVyIGFjdGlvbnMKICBjb25zdCBwaWxsID0gbG95YWx0eVBpbGxCdXR0b24obiwgeyBpc0FsZXJ0IH0pOwogIGlmICghcGlsbCkgcmV0dXJuOwogIHRyeSB7IGhvc3QuYXBwZW5kQ2hpbGQocGlsbCk7IH0gY2F0Y2ggKGUpIHsKICAgIHRyeSB7IGhvc3QuYXBwZW5kQ2hpbGQocGlsbCk7IH0gY2F0Y2ggKGUyKSB7fQogIH0KICBpZiAoaXNBbGVydCl7CiAgICBjb25zdCBub3RlID0gZWwoImRpdiIsIHsgY2xhc3M6ICJsb3lhbHR5LXBpbGwtbm90ZSIsIHJvbGU6ICJub3RlIiB9LCAiRmlkw6lsaXTDqSB1dGlsaXPDqWUgY2Ugam91ciIpOwogICAgdHJ5IHsKICAgICAgY29uc3QgYmQgPSBjYXJkUm9vdC5xdWVyeVNlbGVjdG9yKCIuY2FyZF9fYmQiKTsKICAgICAgaWYgKGJkKSBiZC5pbnNlcnRCZWZvcmUobm90ZSwgYmQuZmlyc3RDaGlsZCk7CiAgICB9IGNhdGNoIChlMikge30KICB9Cn0KCmV4cG9ydCBmdW5jdGlvbiBDbGllbnRDYXJkKHsgY2xpZW50LCBzdGF0ZSwgb25SZWNvdmVyQ2FsbCB9KXsKICBjb25zdCBjID0gKGNsaWVudCAmJiB0eXBlb2YgY2xpZW50ID09PSAib2JqZWN0IikgPyBjbGllbnQgOiB7fTsKICAvLyBLZWVwIGZvcm1hdHRlZCBkaXNwbGF5IGJ5IGRlZmF1bHQ7IHVuZGVybHlpbmcgZWRpdGFibGUgdmFsdWUgaXMgc3RpbGwgc3RvcmVkIGluIHN0YXRlLmNsaWVudC50ZWxlcGhvbmUKICAvLyBJZiBzdGF0ZS5jbGllbnQgZXhpc3RzLCBwcmVmZXIgaXQgc28gZWRpdHMgcGVyc2lzdCBhY3Jvc3MgcmUtcmVuZGVycy4KICBjb25zdCBsaXZlQ2xpZW50ID0gKHN0YXRlPy5jbGllbnQgJiYgdHlwZW9mIHN0YXRlLmNsaWVudCA9PT0gIm9iamVjdCIpID8gc3RhdGUuY2xpZW50IDogYzsKICB0cnl7CiAgICBzeW5jRGVsaXZlcnlBZGRyZXNzU2VsZWN0aW9ucyh7CiAgICAgIHN0YXRlLAogICAgICBzdG9yZUlkOiBnZXRDdXJyZW50U3RvcmVTdWZmaXgoKSwKICAgICAgd2hlbkxpdnJhaXNvbk9ubHk6IHRydWUsCiAgICB9KTsKICB9IGNhdGNoIChfZSkge30KICBjb25zdCBwaG9uZURpc3BsYXkgPSBmb3JtYXRQaG9uZUZvckRpc3BsYXkobGl2ZUNsaWVudC50ZWxlcGhvbmUpOwogIC8vIElNUE9SVEFOVDogcGlsbCBtdXN0IGZvbGxvdyBsaXZlIHN0YXRlIChhZnRlciBwaG9uZSBsb29rdXAgLyBpbmxpbmUgZWRpdHMpCiAgY29uc3QgcHRzID0gTnVtYmVyKAogICAgKGxpdmVDbGllbnQucG9pbnRzRmlkRGlzcGxheSAhPSBudWxsKSA/IGxpdmVDbGllbnQucG9pbnRzRmlkRGlzcGxheSA6IGxpdmVDbGllbnQucG9pbnRzRmlkVG90YWwKICApOwogIGNvbnN0IGhhc1B0cyA9IE51bWJlci5pc0Zpbml0ZShwdHMpOwogIGNvbnN0IGlzTG95YWx0eVVzZWQgPSAhIWxpdmVDbGllbnQubG95YWx0eVVzZWRTZWxlY3RlZERheTsKICBjb25zdCBwaWxsID0gaGFzUHRzID8gbG95YWx0eVBpbGxCdXR0b24ocHRzLCB7IGlzQWxlcnQ6IGlzTG95YWx0eVVzZWQgfSkgOiBudWxsOwogIGNvbnN0IHBpbGxOb3RlID0gKGhhc1B0cyAmJiBpc0xveWFsdHlVc2VkKQogICAgPyBlbCgiZGl2IiwgeyBjbGFzczogImxveWFsdHktcGlsbC1ub3RlIiwgcm9sZTogIm5vdGUiIH0sICJGaWTDqWxpdMOpIHV0aWxpc8OpZSBjZSBqb3VyIikKICAgIDogbnVsbDsKICBjb25zdCB0ZW1wRGVsaXZlcnkgPSAoKCkgPT4gewogICAgY29uc3QgcmF3ID0gKHN0YXRlPy50ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MgJiYgdHlwZW9mIHN0YXRlLnRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcyA9PT0gIm9iamVjdCIpCiAgICAgID8gc3RhdGUudGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzCiAgICAgIDoge307CiAgICBjb25zdCBub3JtYWxpemVkID0gewogICAgICBlbmFibGVkOiAhIXJhdy5lbmFibGVkLAogICAgICBhZHJlc3NlOiBTdHJpbmcocmF3LmFkcmVzc2UgPz8gIiIpLAogICAgICBjb21wbGVtZW50QWRyZXNzZTogU3RyaW5nKHJhdy5jb21wbGVtZW50QWRyZXNzZSA/PyByYXcuY29tcGxlbWVudF9hZHJlc3NlID8/ICIiKSwKICAgICAgY29kZVBvc3RhbDogU3RyaW5nKHJhdy5jb2RlUG9zdGFsID8/IHJhdy5jb2RlX3Bvc3RhbCA/PyAiIiksCiAgICAgIHZpbGxlOiBTdHJpbmcocmF3LnZpbGxlID8/ICIiKSwKICAgICAgdGVtcG9yYXJ5RGVsaXZlcnlDaXR5Q2hvaWNlOiBTdHJpbmcocmF3LnRlbXBvcmFyeURlbGl2ZXJ5Q2l0eUNob2ljZSA/PyAiIiksCiAgICAgIHBlcnNpc3RlZENvZGVQb3N0YWw6IFN0cmluZyhyYXcucGVyc2lzdGVkQ29kZVBvc3RhbCA/PyByYXcuY29kZVBvc3RhbCA/PyByYXcuY29kZV9wb3N0YWwgPz8gIiIpLAogICAgICBwZXJzaXN0ZWRWaWxsZTogU3RyaW5nKHJhdy5wZXJzaXN0ZWRWaWxsZSA/PyByYXcudmlsbGUgPz8gIiIpLAogICAgICBleHBsaWNhdGlvbnM6IFN0cmluZyhyYXcuZXhwbGljYXRpb25zID8/ICIiKSwKICAgICAgbnVtZXJvVXJnZW5jZTogU3RyaW5nKHJhdy5udW1lcm9VcmdlbmNlID8/IHJhdy5udW1lcm9fdXJnZW5jZSA/PyAiIiksCiAgICB9OwogICAgaWYgKHN0YXRlICYmIHR5cGVvZiBzdGF0ZSA9PT0gIm9iamVjdCIpIHN0YXRlLnRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcyA9IG5vcm1hbGl6ZWQ7CiAgICByZXR1cm4gbm9ybWFsaXplZDsKICB9KSgpOwoKICBlbnN1cmVEZWxpdmVyeVRyYXZlbENoZWNrcyhzdGF0ZSk7CgogIGZ1bmN0aW9uIGdldFRyYXZlbEFkZHJlc3NCeUtpbmQoa2luZCl7CiAgICBpZiAoa2luZCA9PT0gInRlbXBvcmFyeSIpewogICAgICByZXR1cm4gbm9ybWFsaXplRGVsaXZlcnlUcmF2ZWxBZGRyZXNzKHN0YXRlPy50ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MgfHwge30pOwogICAgfQogICAgY29uc3QgbGF0ZXN0Q2xpZW50ID0gKHN0YXRlPy5jbGllbnQgJiYgdHlwZW9mIHN0YXRlLmNsaWVudCA9PT0gIm9iamVjdCIpID8gc3RhdGUuY2xpZW50IDogbGl2ZUNsaWVudDsKICAgIHJldHVybiBub3JtYWxpemVEZWxpdmVyeVRyYXZlbEFkZHJlc3MobGF0ZXN0Q2xpZW50IHx8IHt9KTsKICB9CgogIGZ1bmN0aW9uIHNldFNjb3BlZENhcmRGaWVsZFZhbHVlKHNjb3BlU2VsZWN0b3IsIGtleSwgdmFsdWUpewogICAgaWYgKCFjYXJkRWwpIHJldHVybjsKICAgIGNvbnN0IHNjb3BlUm9vdCA9IHNjb3BlU2VsZWN0b3IgPyBjYXJkRWwucXVlcnlTZWxlY3RvcihzY29wZVNlbGVjdG9yKSA6IGNhcmRFbDsKICAgIGlmICghc2NvcGVSb290KSByZXR1cm47CiAgICBjb25zdCBpbnB1dCA9IHNjb3BlUm9vdC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1maWVsZC1rZXk9IiR7U3RyaW5nKGtleSl9Il1gKTsKICAgIGlmICghaW5wdXQpIHJldHVybjsKICAgIHRyeSB7IGlucHV0LnZhbHVlID0gU3RyaW5nKHZhbHVlID8/ICIiKTsgfSBjYXRjaCAoX2UpIHt9CiAgICB0cnl7CiAgICAgIGNvbnN0IGZpZWxkUm9vdCA9IGlucHV0LmNsb3Nlc3QoIi5maWVsZCIpIHx8IGlucHV0LnBhcmVudEVsZW1lbnQ7CiAgICAgIGlmIChmaWVsZFJvb3QpIGZpZWxkUm9vdC5jbGFzc0xpc3QudG9nZ2xlKCJmaWVsZC0tZW1wdHkiLCAhaXNOb25FbXB0eShpbnB1dC52YWx1ZSkpOwogICAgfSBjYXRjaCAoX2UpIHt9CiAgfQoKICBmdW5jdGlvbiBhcHBseURlbGl2ZXJ5VHJhdmVsQWRkcmVzc0NvcnJlY3Rpb24oa2luZCwgYXBpUmVzdWx0KXsKICAgIGNvbnN0IGN1cnJlbnRBZGRyZXNzID0gZ2V0VHJhdmVsQWRkcmVzc0J5S2luZChraW5kKTsKICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSByZXNvbHZlQ29ycmVjdGVkRGVsaXZlcnlUcmF2ZWxBZGRyZXNzKAogICAgICBhcGlSZXN1bHQ/LmNvcnJlY3RlZFRvID8/IGFwaVJlc3VsdD8ubm9ybWFsaXplZEFkZHJlc3MgPz8gbnVsbCwKICAgICAgYXBpUmVzdWx0Py5ub3JtYWxpemVkQWRkcmVzcyA/PyBudWxsLAogICAgICBjdXJyZW50QWRkcmVzcwogICAgKTsKICAgIGlmICghbm9ybWFsaXplZCkgcmV0dXJuIGZhbHNlOwoKICAgIGlmICghaXNEZWxpdmVyeVRyYXZlbEFkZHJlc3NDb3JyZWN0aW9uKGN1cnJlbnRBZGRyZXNzLCBub3JtYWxpemVkKSkgcmV0dXJuIGZhbHNlOwoKICAgIGlmIChraW5kID09PSAidGVtcG9yYXJ5Iil7CiAgICAgIGlmICghc3RhdGUudGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzIHx8IHR5cGVvZiBzdGF0ZS50ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MgIT09ICJvYmplY3QiKXsKICAgICAgICBzdGF0ZS50ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MgPSB7IGVuYWJsZWQ6IHRydWUgfTsKICAgICAgfQogICAgICBzdGF0ZS50ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MuZW5hYmxlZCA9IHRydWU7CiAgICAgIHN0YXRlLnRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcy5hZHJlc3NlID0gbm9ybWFsaXplZC5hZHJlc3NlOwogICAgICBzdGF0ZS50ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MuY29tcGxlbWVudEFkcmVzc2UgPSBub3JtYWxpemVkLmNvbXBsZW1lbnRfYWRyZXNzZTsKICAgICAgc3RhdGUudGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzLmNvZGVQb3N0YWwgPSBub3JtYWxpemVkLmNvZGVfcG9zdGFsOwogICAgICBzdGF0ZS50ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MudmlsbGUgPSBub3JtYWxpemVkLnZpbGxlOwogICAgICBzdGF0ZS50ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MucGVyc2lzdGVkQ29kZVBvc3RhbCA9IG5vcm1hbGl6ZWQuY29kZV9wb3N0YWw7CiAgICAgIHN0YXRlLnRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcy5wZXJzaXN0ZWRWaWxsZSA9IG5vcm1hbGl6ZWQudmlsbGU7CiAgICAgIHN0YXRlLnRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcy50ZW1wb3JhcnlEZWxpdmVyeUNpdHlDaG9pY2UgPSBidWlsZEFsbG93ZWREZWxpdmVyeUNpdHlDaG9pY2VWYWx1ZShnZXRDdXJyZW50U3RvcmVTdWZmaXgoKSwgbm9ybWFsaXplZC52aWxsZSwgbm9ybWFsaXplZC5jb2RlX3Bvc3RhbCk7CgogICAgICBzZXRTY29wZWRDYXJkRmllbGRWYWx1ZSgnW2RhdGEtcm9sZT0idGVtcG9yYXJ5LWRlbGl2ZXJ5LWFkZHJlc3MtYmxvY2siXScsICJhZHJlc3NlIiwgbm9ybWFsaXplZC5hZHJlc3NlKTsKICAgICAgc2V0U2NvcGVkQ2FyZEZpZWxkVmFsdWUoJ1tkYXRhLXJvbGU9InRlbXBvcmFyeS1kZWxpdmVyeS1hZGRyZXNzLWJsb2NrIl0nLCAiY29tcGxlbWVudEFkcmVzc2UiLCBub3JtYWxpemVkLmNvbXBsZW1lbnRfYWRyZXNzZSk7CiAgICAgIHNldFNjb3BlZENhcmRGaWVsZFZhbHVlKAogICAgICAgICdbZGF0YS1yb2xlPSJ0ZW1wb3JhcnktZGVsaXZlcnktYWRkcmVzcy1ibG9jayJdJywKICAgICAgICAidGVtcG9yYXJ5RGVsaXZlcnlDaXR5Q2hvaWNlIiwKICAgICAgICBidWlsZEFsbG93ZWREZWxpdmVyeUNpdHlDaG9pY2VWYWx1ZShnZXRDdXJyZW50U3RvcmVTdWZmaXgoKSwgbm9ybWFsaXplZC52aWxsZSwgbm9ybWFsaXplZC5jb2RlX3Bvc3RhbCkKICAgICAgKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmICghc3RhdGUuY2xpZW50IHx8IHR5cGVvZiBzdGF0ZS5jbGllbnQgIT09ICJvYmplY3QiKSBzdGF0ZS5jbGllbnQgPSB7fTsKICAgICAgc3RhdGUuY2xpZW50LmFkcmVzc2UgPSBub3JtYWxpemVkLmFkcmVzc2U7CiAgICAgIHN0YXRlLmNsaWVudC5jb21wbGVtZW50QWRyZXNzZSA9IG5vcm1hbGl6ZWQuY29tcGxlbWVudF9hZHJlc3NlOwogICAgICBzdGF0ZS5jbGllbnQuY29kZVBvc3RhbCA9IG5vcm1hbGl6ZWQuY29kZV9wb3N0YWw7CiAgICAgIHN0YXRlLmNsaWVudC52aWxsZSA9IG5vcm1hbGl6ZWQudmlsbGU7CiAgICAgIHN0YXRlLmNsaWVudC5kZWxpdmVyeUNpdHlQZXJzaXN0ZWRDb2RlUG9zdGFsID0gbm9ybWFsaXplZC5jb2RlX3Bvc3RhbDsKICAgICAgc3RhdGUuY2xpZW50LmRlbGl2ZXJ5Q2l0eVBlcnNpc3RlZFZpbGxlID0gbm9ybWFsaXplZC52aWxsZTsKICAgICAgc3RhdGUuY2xpZW50LmRlbGl2ZXJ5Q2l0eUNob2ljZSA9IGJ1aWxkQWxsb3dlZERlbGl2ZXJ5Q2l0eUNob2ljZVZhbHVlKGdldEN1cnJlbnRTdG9yZVN1ZmZpeCgpLCBub3JtYWxpemVkLnZpbGxlLCBub3JtYWxpemVkLmNvZGVfcG9zdGFsKTsKCiAgICAgIHNldFNjb3BlZENhcmRGaWVsZFZhbHVlKCIuZGVsaXZlcnktZmllbGRzIiwgImFkcmVzc2UiLCBub3JtYWxpemVkLmFkcmVzc2UpOwogICAgICBzZXRTY29wZWRDYXJkRmllbGRWYWx1ZSgiLmRlbGl2ZXJ5LWZpZWxkcyIsICJjb21wbGVtZW50QWRyZXNzZSIsIG5vcm1hbGl6ZWQuY29tcGxlbWVudF9hZHJlc3NlKTsKICAgICAgc2V0U2NvcGVkQ2FyZEZpZWxkVmFsdWUoCiAgICAgICAgIi5kZWxpdmVyeS1maWVsZHMiLAogICAgICAgICJkZWxpdmVyeUNpdHlDaG9pY2UiLAogICAgICAgIGJ1aWxkQWxsb3dlZERlbGl2ZXJ5Q2l0eUNob2ljZVZhbHVlKGdldEN1cnJlbnRTdG9yZVN1ZmZpeCgpLCBub3JtYWxpemVkLnZpbGxlLCBub3JtYWxpemVkLmNvZGVfcG9zdGFsKQogICAgICApOwogICAgfQoKICAgIHRyeXsKICAgICAgdG9hc3QoYEFkcmVzc2UgY29ycmlnw6llIGF1dG9tYXRpcXVlbWVudCA6ICR7Zm9ybWF0Tm9ybWFsaXplZERlbGl2ZXJ5VHJhdmVsQWRkcmVzc0xhYmVsKG5vcm1hbGl6ZWQpfWApOwogICAgfSBjYXRjaCAoX2UpIHt9CgogICAgcmV0dXJuIHRydWU7CiAgfQoKICBmdW5jdGlvbiBzeW5jRGVsaXZlcnlUcmF2ZWxDaGVja1VpKGtpbmQpewogICAgY29uc3QgZW50cnkgPSBnZXREZWxpdmVyeVRyYXZlbENoZWNrRW50cnkoc3RhdGUsIGtpbmQpOwogICAgY29uc3QgYnRuID0gY2FyZEVsPy5xdWVyeVNlbGVjdG9yPy4oYFtkYXRhLXJvbGU9ImRlbGl2ZXJ5LXRyYXZlbC1jaGVjay1idG4tJHtTdHJpbmcoa2luZCl9Il1gKTsKICAgIGNvbnN0IHJlc3VsdCA9IGNhcmRFbD8ucXVlcnlTZWxlY3Rvcj8uKGBbZGF0YS1yb2xlPSJkZWxpdmVyeS10cmF2ZWwtY2hlY2stcmVzdWx0LSR7U3RyaW5nKGtpbmQpfSJdYCk7CiAgICBpZiAoIWJ0biB8fCAhcmVzdWx0KSByZXR1cm47CgogICAgYnRuLmRpc2FibGVkID0gISFlbnRyeS5wZW5kaW5nOwogICAgYnRuLnRleHRDb250ZW50ID0gZW50cnkucGVuZGluZyA/ICJWw6lyaWZpY2F0aW9u4oCmIiA6ICJWw6lyaWZpZXIgbGUgdGVtcHMgZGUgdHJhamV0IjsKCiAgICBjb25zdCBjaHVua3MgPSBbXTsKICAgIGlmIChlbnRyeS5kdXJhdGlvbkxhYmVsKSBjaHVua3MucHVzaChTdHJpbmcoZW50cnkuZHVyYXRpb25MYWJlbCkpOwogICAgaWYgKGVudHJ5Lm1lc3NhZ2UpIGNodW5rcy5wdXNoKFN0cmluZyhlbnRyeS5tZXNzYWdlKSk7CiAgICByZXN1bHQudGV4dENvbnRlbnQgPSBjaHVua3Muam9pbigiIOKAlCAiKTsKICAgIHJlc3VsdC5oaWRkZW4gPSBjaHVua3MubGVuZ3RoID09PSAwOwogICAgaWYgKGNodW5rcy5sZW5ndGgpewogICAgICByZXN1bHQuZGF0YXNldC5zdGF0ZSA9IFN0cmluZyhlbnRyeS50b25lIHx8ICJuZXV0cmFsIik7CiAgICB9IGVsc2UgewogICAgICB0cnkgeyBkZWxldGUgcmVzdWx0LmRhdGFzZXQuc3RhdGU7IH0gY2F0Y2ggKF9lKSB7fQogICAgfQogIH0KCiAgYXN5bmMgZnVuY3Rpb24gcnVuRGVsaXZlcnlUcmF2ZWxDaGVjayhraW5kKXsKICAgIGNvbnN0IGVudHJ5ID0gZ2V0RGVsaXZlcnlUcmF2ZWxDaGVja0VudHJ5KHN0YXRlLCBraW5kKTsKICAgIGNvbnN0IGFkZHJlc3MgPSBnZXRUcmF2ZWxBZGRyZXNzQnlLaW5kKGtpbmQpOwogICAgaWYgKCFpc0NvbXBsZXRlRGVsaXZlcnlUcmF2ZWxBZGRyZXNzKGFkZHJlc3MpKXsKICAgICAgZW50cnkucGVuZGluZyA9IGZhbHNlOwogICAgICBlbnRyeS5vayA9IGZhbHNlOwogICAgICBlbnRyeS50b25lID0gImVycm9yIjsKICAgICAgZW50cnkuZHVyYXRpb25MYWJlbCA9ICIiOwogICAgICBlbnRyeS5tZXNzYWdlID0gIkFkcmVzc2UgaW5jb21wbMOodGUgOiBtZXJjaSBkZSByZW5zZWlnbmVyIGzigJlhZHJlc3NlLCBsZSBjb2RlIHBvc3RhbCBldCBsYSB2aWxsZSBhdmFudCBkZSBsYW5jZXIgbGUgY29udHLDtGxlLiI7CiAgICAgIGVudHJ5LmNoZWNrZWRBdFNlY29uZHMgPSAwOwogICAgICBzeW5jRGVsaXZlcnlUcmF2ZWxDaGVja1VpKGtpbmQpOwogICAgICByZXR1cm47CiAgICB9CgogICAgZW50cnkucGVuZGluZyA9IHRydWU7CiAgICBlbnRyeS5tZXNzYWdlID0gIiI7CiAgICBlbnRyeS5kdXJhdGlvbkxhYmVsID0gIiI7CiAgICBzeW5jRGVsaXZlcnlUcmF2ZWxDaGVja1VpKGtpbmQpOwoKICAgIHRyeXsKICAgICAgY29uc3QgcmVzID0gYXdhaXQgY2hlY2tEZWxpdmVyeVRyYXZlbFRpbWUoewogICAgICAgIHN0b3JlSWQ6IGdldEN1cnJlbnRTdG9yZVN1ZmZpeCgpLAogICAgICAgIGFkZHJlc3MsCiAgICAgIH0pOwogICAgICB0cnkgeyBhcHBseURlbGl2ZXJ5VHJhdmVsQWRkcmVzc0NvcnJlY3Rpb24oa2luZCwgcmVzKTsgfSBjYXRjaCAoX2UyKSB7fQogICAgICBlbnRyeS5wZW5kaW5nID0gZmFsc2U7CiAgICAgIGVudHJ5Lm9rID0gISFyZXM/Lm9rICYmICEhcmVzPy5pc1dpdGhpbjVNaW47CiAgICAgIGVudHJ5LnRvbmUgPSAhcmVzPy5vayA/ICJlcnJvciIgOiAocmVzPy5pc1dpdGhpbjVNaW4gPyAic3VjY2VzcyIgOiAid2FybmluZyIpOwogICAgICBlbnRyeS5kdXJhdGlvbkxhYmVsID0gZm9ybWF0RGVsaXZlcnlUcmF2ZWxEdXJhdGlvbihyZXMpOwogICAgICBlbnRyeS5tZXNzYWdlID0gU3RyaW5nKHJlcz8ubWVzc2FnZSA/PyAiIikudHJpbSgpOwogICAgICBlbnRyeS5jaGVja2VkQXRTZWNvbmRzID0gTnVtYmVyKHJlcz8uY2hlY2tlZEF0U2Vjb25kcyA/PyAwKSB8fCAwOwogICAgICBzeW5jRGVsaXZlcnlUcmF2ZWxDaGVja1VpKGtpbmQpOwogICAgfSBjYXRjaCAoX2UpewogICAgICBlbnRyeS5wZW5kaW5nID0gZmFsc2U7CiAgICAgIGVudHJ5Lm9rID0gZmFsc2U7CiAgICAgIGVudHJ5LnRvbmUgPSAiZXJyb3IiOwogICAgICBlbnRyeS5kdXJhdGlvbkxhYmVsID0gIiI7CiAgICAgIGVudHJ5Lm1lc3NhZ2UgPSAiSW1wb3NzaWJsZSBkZSB2w6lyaWZpZXIgbGUgdGVtcHMgZGUgdHJhamV0IHBvdXIgbGUgbW9tZW50LiBNZXJjaSBkZSByw6llc3NheWVyLiI7CiAgICAgIGVudHJ5LmNoZWNrZWRBdFNlY29uZHMgPSAwOwogICAgICBzeW5jRGVsaXZlcnlUcmF2ZWxDaGVja1VpKGtpbmQpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZGVsaXZlcnlUcmF2ZWxDaGVja0Jsb2NrKGtpbmQpewogICAgY29uc3QgZW50cnkgPSBnZXREZWxpdmVyeVRyYXZlbENoZWNrRW50cnkoc3RhdGUsIGtpbmQpOwogICAgY29uc3QgY2h1bmtzID0gW107CiAgICBpZiAoZW50cnkuZHVyYXRpb25MYWJlbCkgY2h1bmtzLnB1c2goU3RyaW5nKGVudHJ5LmR1cmF0aW9uTGFiZWwpKTsKICAgIGlmIChlbnRyeS5tZXNzYWdlKSBjaHVua3MucHVzaChTdHJpbmcoZW50cnkubWVzc2FnZSkpOwogICAgcmV0dXJuIGVsKCJkaXYiLCB7CiAgICAgIGNsYXNzOiAiY2xpZW50LWRlbGl2ZXJ5LXRyYXZlbC1jaGVjayIsCiAgICAgIGRhdGFzZXQ6IHsgcm9sZTogYGRlbGl2ZXJ5LXRyYXZlbC1jaGVjay0ke1N0cmluZyhraW5kKX1gIH0sCiAgICB9LCBbCiAgICAgIGVsKCJidXR0b24iLCB7CiAgICAgICAgdHlwZTogImJ1dHRvbiIsCiAgICAgICAgY2xhc3M6ICJhYnRuIGFidG4tLXByaW1hcnkgY2xpZW50LWRlbGl2ZXJ5LXRyYXZlbC1jaGVja19fYnRuIiwKICAgICAgICBkYXRhc2V0OiB7IHJvbGU6IGBkZWxpdmVyeS10cmF2ZWwtY2hlY2stYnRuLSR7U3RyaW5nKGtpbmQpfWAgfSwKICAgICAgICBkaXNhYmxlZDogISFlbnRyeS5wZW5kaW5nLAogICAgICAgIG9uQ2xpY2s6ICgpID0+IHsgcnVuRGVsaXZlcnlUcmF2ZWxDaGVjayhraW5kKTsgfSwKICAgICAgfSwgZW50cnkucGVuZGluZyA/ICJWw6lyaWZpY2F0aW9u4oCmIiA6ICJWw6lyaWZpZXIgbGUgdGVtcHMgZGUgdHJhamV0IiksCiAgICAgIGVsKCJkaXYiLCB7CiAgICAgICAgY2xhc3M6ICJjbGllbnQtZGVsaXZlcnktdHJhdmVsLWNoZWNrX19yZXN1bHQiLAogICAgICAgIGRhdGFzZXQ6IHsKICAgICAgICAgIHJvbGU6IGBkZWxpdmVyeS10cmF2ZWwtY2hlY2stcmVzdWx0LSR7U3RyaW5nKGtpbmQpfWAsCiAgICAgICAgICBzdGF0ZTogU3RyaW5nKGVudHJ5LnRvbmUgfHwgIm5ldXRyYWwiKSwKICAgICAgICB9LAogICAgICAgIGhpZGRlbjogY2h1bmtzLmxlbmd0aCA9PT0gMCwKICAgICAgfSwgY2h1bmtzLmpvaW4oIiDigJQgIikpLAogICAgXSk7CiAgfQoKICBmdW5jdGlvbiBpbmplY3RTZWFyY2hEb3VibGVEYXNoT25jZSh7IHJlYXNvbiA9ICJ1bmtub3duIiB9ID0ge30pewogICAgaWYgKCFzdGF0ZSB8fCB0eXBlb2Ygc3RhdGUgIT09ICJvYmplY3QiKSByZXR1cm4gZmFsc2U7CgogICAgLy8gRG8gbm90IG92ZXJ3cml0ZSB1c2VyIHR5cGluZyAvIGFuIGV4aXN0aW5nIHF1ZXJ5ICh1bmxlc3MgaXQgaXMgYWxyZWFkeSB0aGUgYXV0byBvbmUpCiAgICBjb25zdCBjdXJyZW50USA9IFN0cmluZyhzdGF0ZS5zZWFyY2hRdWVyeSA/PyAiIik7CiAgICBpZiAoY3VycmVudFEgJiYgY3VycmVudFEgIT09ICItLSIpIHJldHVybiBmYWxzZTsKICAgIGlmIChzdGF0ZS5hdXRvRGlzY291bnRJbmplY3RlZCA9PT0gdHJ1ZSAmJiBjdXJyZW50USA9PT0gIi0tIikgcmV0dXJuIGZhbHNlOwoKICAgIC8vIEFsc28gY2hlY2sgdGhlIGFjdHVhbCBpbnB1dCB2YWx1ZSAoZGVmZW5zaXZlKQogICAgbGV0IGlucHV0RWwgPSBudWxsOwogICAgdHJ5IHsgaW5wdXRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwb3Mtc2VhcmNoIik7IH0gY2F0Y2ggKGUpIHt9CiAgICBjb25zdCBpbnB1dFZhbCA9IFN0cmluZyhpbnB1dEVsPy52YWx1ZSA/PyAiIik7CiAgICBpZiAoaW5wdXRWYWwgJiYgaW5wdXRWYWwgIT09ICItLSIpIHJldHVybiBmYWxzZTsKCiAgICAvLyBNYXJrIHRvIGF2b2lkIGxvb3BzCiAgICBzdGF0ZS5hdXRvRGlzY291bnRJbmplY3RlZCA9IHRydWU7CgogICAgLy8gU2V0IHN0YXRlIGFzIGZhbGxiYWNrIChpbiBjYXNlIGlucHV0IGlzbid0IG1vdW50ZWQgeWV0KQogICAgc3RhdGUuc2VhcmNoUXVlcnkgPSAiLS0iOwogICAgc3RhdGUuc2VhcmNoUmVzdWx0cyA9IGNvbXB1dGVQaXp6YVJlc3VsdHMoeyBwaXp6YXM6IHN0YXRlPy5jYXRhbG9nPy5waXp6YXMgfHwgW10sIHF1ZXJ5OiAiLS0iIH0pOwogICAgY2xhbXBTZWxlY3RlZFNlYXJjaEluZGV4KHN0YXRlKTsKCiAgICAvLyBQcmVmZXJyZWQgcGF0aDogZHJpdmUgdGhlIGV4aXN0aW5nIFNlYXJjaENhcmQgb25pbnB1dCBoYW5kbGVyIChrZWVwcyBjb3JyZWN0IGhhbmRsZVBpY2tQaXp6YSB3aXJpbmcpCiAgICBpZiAoaW5wdXRFbCl7CiAgICAgIHRyeXsKICAgICAgICBpbnB1dEVsLnZhbHVlID0gIi0tIjsKICAgICAgICBpbnB1dEVsLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJpbnB1dCIsIHsgYnViYmxlczogdHJ1ZSB9KSk7CiAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICB9CgogICAgLy8gT3B0aW9uYWwgdHJhY2UgaG9vayAobm9uLWJyZWFraW5nKQogICAgdHJ5ewogICAgICBzdGF0ZS5fX2F1dG9EaXNjb3VudFJlYXNvbiA9IFN0cmluZyhyZWFzb24gPz8gIiIpOwogICAgfSBjYXRjaCAoZSkge30KCiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGFzeW5jIGZ1bmN0aW9uIG9wZW5Mb3lhbHR5UG9pbnRzRWRpdG9yKGNhcmRSb290KXsKICAgIC8vIElNUE9SVEFOVDoKICAgIC8vIC0gV2hlbiB3ZSBsb29rdXAgYSBjbGllbnQgYnkgcGhvbmUsIHdlIGh5ZHJhdGUgdGhlIERPTSB3aXRob3V0IGEgZnVsbCByZS1yZW5kZXIuCiAgICAvLyAtIGBsaXZlQ2xpZW50YCBpcyBjYXB0dXJlZCBhdCByZW5kZXItdGltZSwgc28gaXQgY2FuIGJlIHN0YWxlIChpZCBzdGlsbCBudWxsKSBldmVuIGlmCiAgICAvLyAgIGBzdGF0ZS5jbGllbnRgIGhhcyBiZWVuIHVwZGF0ZWQgd2l0aCB0aGUgaW5qZWN0ZWQgY2xpZW50IChpbmNsdWRpbmcgaWQpLgogICAgLy8gQWx3YXlzIHJlYWQgdGhlIGxhdGVzdCBjbGllbnQgZnJvbSBzdGF0ZSBhdCBjbGljay10aW1lLgogICAgY29uc3QgbGF0ZXN0Q2xpZW50ID0KICAgICAgKHN0YXRlPy5jbGllbnQgJiYgdHlwZW9mIHN0YXRlLmNsaWVudCA9PT0gIm9iamVjdCIpCiAgICAgICAgPyBzdGF0ZS5jbGllbnQKICAgICAgICA6IChsaXZlQ2xpZW50ICYmIHR5cGVvZiBsaXZlQ2xpZW50ID09PSAib2JqZWN0IiA/IGxpdmVDbGllbnQgOiB7fSk7CgogICAgLy8gTmVlZCBhIHBlcnNpc3RlZCBjbGllbnQgaWQgdG8gdXBkYXRlIGJhY2tlbmQuCiAgICBjb25zdCBjaWQgPSBOdW1iZXIobGF0ZXN0Q2xpZW50Py5pZCk7CiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShjaWQpIHx8IGNpZCA8PSAwKXsKICAgICAgdHJ5IHsgdG9hc3QoIkNsaWVudCBub24gY2hhcmfDqSAoaWQgbWFucXVhbnQpIik7IH0gY2F0Y2ggKGUpIHt9CiAgICAgIHJldHVybjsKICAgIH0KICAgIC8vIElNUE9SVEFOVDoKICAgIC8vIFRoZSBlZGl0b3IgbXVzdCBhbHdheXMgd29yayBmcm9tIHRoZSBSRUFMIHN0b3JlZCB0b3RhbCwgbm90IGZyb20gdGhlCiAgICAvLyBkaXNwbGF5IGJhbGFuY2UgKGRpc3BsYXkgPSB0b3RhbCAtIHJlc2VydmVkIGxveWFsdHkgcG9pbnRzKS4KICAgIC8vIE90aGVyd2lzZSwgd2hlbiBhIGxveWFsdHkgcmV3YXJkIGlzIGFscmVhZHkgcmVzZXJ2ZWQgb24gdGhlIG9yZGVyLAogICAgLy8gYWRkaW5nICsxIHBvaW50IGZyb20gdGhlIG1vZGFsIHdvdWxkIGluY29ycmVjdGx5IG92ZXJ3cml0ZSB0b3RhbCBwb2ludHMKICAgIC8vIGZyb20gZGlzcGxheSsxIChlLmcuIDArMSBpbnN0ZWFkIG9mIDEwKzEpLgogICAgY29uc3QgY3VyID0gZ2V0Q2xpZW50TG95YWx0eVRvdGFsUG9pbnRzKGxhdGVzdENsaWVudCk7CgogICAgY29uc3QgZGF0ZUlTTyA9IFN0cmluZyhzdGF0ZT8uc2VsZWN0ZWREYXRlSVNPID8/ICIiKS50cmltKCk7CiAgICAvLyBGcm9udCBNVVNUIHNlbmQgdGhlIHNlbGVjdGVkIFBEViB0byB0aGUgUEhQICgibGFuIiBvciAicGVsIikuCiAgICAvLyBEbyBOT1QgZGVwZW5kIG9uIHN0YXRlIHNoYXBlOyBhbHdheXMgcmVhZCBmcm9tIHRoZSBQRFYgbW9kdWxlIChzb3VyY2Ugb2YgdHJ1dGgpLgogICAgbGV0IHN0b3JlID0gIiI7CiAgICB0cnl7CiAgICAgIHN0b3JlID0gc3RvcmVUb1N1ZmZpeChnZXRQRFZDdXJyZW50KCkpOyAvLyAtPiAibGFuIiB8ICJwZWwiCiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHN0b3JlID0gIiI7CiAgICB9CgogICAgYXdhaXQgbG95YWx0eVBvaW50c01vZGFsKHsKICAgICAgdGl0bGU6ICJNb2RpZmllciBwb2ludHMgZmlkw6lsaXTDqSIsCiAgICAgIGN1cnJlbnRQb2ludHM6IGN1ciwKICAgICAgb25TYXZlOiBhc3luYyAocG9pbnRzTmV3KSA9PiB7CiAgICAgICAgY29uc3QgcG4gPSBOdW1iZXIocG9pbnRzTmV3KTsKICAgICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShwbikpIHJldHVybiB7IG9rOiBmYWxzZSwgZXJyb3I6ICJWYWxldXIgaW52YWxpZGUiIH07CiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdXBkYXRlQ2xpZW50TG95YWx0eVBvaW50cyh7CiAgICAgICAgICBjbGllbnRJZDogY2lkLAogICAgICAgICAgcG9pbnRzTmV3OiBNYXRoLnRydW5jKHBuKSwKICAgICAgICAgIHN0b3JlLAogICAgICAgICAgZGF0ZUlTTywKICAgICAgICB9KTsKICAgICAgICBpZiAoIXJlcz8ub2spewogICAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBlcnJvcjogcmVzPy5lcnJvciB8fCAiSW1wb3NzaWJsZSBkZSBtb2RpZmllciBsZXMgcG9pbnRzIiB9OwogICAgICAgIH0KCiAgICAgICAgLy8gVXBkYXRlIHN0YXRlIGltbWVkaWF0ZWx5IHNvIHBpbGwgcmUtcmVuZGVycyBjb3JyZWN0bHkuCiAgICAgICAgaWYgKCFzdGF0ZSB8fCB0eXBlb2Ygc3RhdGUgIT09ICJvYmplY3QiKSByZXR1cm4geyBvazogdHJ1ZSB9OwogICAgICAgIGlmICghc3RhdGUuY2xpZW50IHx8IHR5cGVvZiBzdGF0ZS5jbGllbnQgIT09ICJvYmplY3QiKSBzdGF0ZS5jbGllbnQgPSB7fTsKCiAgICAgICAgY29uc3QgdG90YWwgPSBOdW1iZXIuaXNGaW5pdGUoTnVtYmVyKHJlcz8ucG9pbnRzX3RvdGFsKSkgPyBOdW1iZXIocmVzLnBvaW50c190b3RhbCkgOiBNYXRoLnRydW5jKHBuKTsKICAgICAgICBjb25zdCBkaXNwbGF5ID0gTnVtYmVyLmlzRmluaXRlKE51bWJlcihyZXM/LnBvaW50c19kaXNwbGF5KSkgPyBOdW1iZXIocmVzLnBvaW50c19kaXNwbGF5KSA6IHRvdGFsOwogICAgICAgIHN0YXRlLmNsaWVudC5wb2ludHNGaWRUb3RhbCA9IHRvdGFsOwogICAgICAgIHN0YXRlLmNsaWVudC5wb2ludHNGaWREaXNwbGF5ID0gZGlzcGxheTsKICAgICAgICBpZiAoTnVtYmVyLmlzRmluaXRlKE51bWJlcihyZXM/LmxveWFsdHlfcmVzZXJ2ZWRfcGl6emFzKSkpIHN0YXRlLmNsaWVudC5sb3lhbHR5UmVzZXJ2ZWRQaXp6YXMgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKE51bWJlcihyZXMubG95YWx0eV9yZXNlcnZlZF9waXp6YXMpKSk7CiAgICAgICAgaWYgKE51bWJlci5pc0Zpbml0ZShOdW1iZXIocmVzPy5sb3lhbHR5X3Jlc2VydmVkX3BvaW50cykpKSBzdGF0ZS5jbGllbnQubG95YWx0eVJlc2VydmVkUG9pbnRzID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcihOdW1iZXIocmVzLmxveWFsdHlfcmVzZXJ2ZWRfcG9pbnRzKSkpOwogICAgICAgIHN0YXRlLmNsaWVudC5sb3lhbHR5VXNlZFNlbGVjdGVkRGF5ID0gKHJlcz8ubG95YWx0eV91c2VkX3NlbGVjdGVkX2RheSA9PT0gdHJ1ZSk7CgogICAgICAgIC8vIFVwZGF0ZSBwaWxsIERPTSBpbiBwbGFjZSAobm8gZnVsbCByZS1yZW5kZXIpLgogICAgICAgIHRyeSB7IHNldExveWFsdHlQaWxsKGNhcmRSb290LCBkaXNwbGF5LCB7IGlzQWxlcnQ6ICEhc3RhdGUuY2xpZW50LmxveWFsdHlVc2VkU2VsZWN0ZWREYXkgfSk7IH0gY2F0Y2ggKGUpIHt9CgogICAgICAgIHJldHVybiB7IG9rOiB0cnVlLCBwb2ludHNfdG90YWw6IHRvdGFsLCBwb2ludHNfZGlzcGxheTogZGlzcGxheSB9OwogICAgICB9LAogICAgfSk7CgogICAgLy8gUmVxdWlyZW1lbnQ6IGFmdGVyIGNsb3NpbmcgdGhlIGxveWFsdHkgbW9kYWwsIGlmIGJhbGFuY2UgPj0gMTAsIGluamVjdCAiLS0iIGluIHNlYXJjaAogICAgLy8gKHdpdGhvdXQgb3ZlcndyaXRpbmcgdXNlciBpbnB1dCkuCiAgICB0cnl7CiAgICAgIGNvbnN0IGxhdGVzdCA9CiAgICAgICAgKHN0YXRlPy5jbGllbnQgJiYgdHlwZW9mIHN0YXRlLmNsaWVudCA9PT0gIm9iamVjdCIpCiAgICAgICAgICA/IHN0YXRlLmNsaWVudAogICAgICAgICAgOiAobGF0ZXN0Q2xpZW50ICYmIHR5cGVvZiBsYXRlc3RDbGllbnQgPT09ICJvYmplY3QiID8gbGF0ZXN0Q2xpZW50IDoge30pOwogICAgICBjb25zdCBwdHNOb3cgPSBOdW1iZXIoCiAgICAgICAgKGxhdGVzdD8ucG9pbnRzRmlkRGlzcGxheSAhPSBudWxsKSA/IGxhdGVzdC5wb2ludHNGaWREaXNwbGF5IDogbGF0ZXN0Py5wb2ludHNGaWRUb3RhbAogICAgICApOwogICAgICBjb25zdCBlbGlnaWJsZSA9IE51bWJlci5pc0Zpbml0ZShwdHNOb3cpICYmIHB0c05vdyA+PSAxMDsKICAgICAgaWYgKGVsaWdpYmxlKXsKICAgICAgICBpbmplY3RTZWFyY2hEb3VibGVEYXNoT25jZSh7IHJlYXNvbjogImxveWFsdHlfbW9kYWxfY2xvc2UiIH0pOwogICAgICB9CiAgICB9IGNhdGNoIChlKSB7fQogIH0KCiAgLy8g4pSA4pSAIFBob25lIGNvbW1pdC9sb29rdXAgbG9naWMgKGRlYm91bmNlICsgRW50ZXIgKyBibHVyKSDilIDilIAKICBsZXQgX19waG9uZURlYm91bmNlVGltZXIgPSBudWxsOwogIGxldCBfX3Bob25lTG9va3VwSW5GbGlnaHQgPSBmYWxzZTsKICBsZXQgX19pZ25vcmVOZXh0UGhvbmVCbHVyID0gZmFsc2U7CgogIGZ1bmN0aW9uIHNldENhcmRJbnB1dFZhbHVlKGNhcmRSb290LCBrZXksIHZhbHVlKXsKICAgIGlmICghY2FyZFJvb3QpIHJldHVybjsKICAgIGNvbnN0IGlucCA9IGNhcmRSb290LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWZpZWxkLWtleT0iJHtTdHJpbmcoa2V5KX0iXWApOwogICAgaWYgKCFpbnApIHJldHVybjsKICAgIHRyeSB7IGlucC52YWx1ZSA9IFN0cmluZyh2YWx1ZSA/PyAiIik7IH0gY2F0Y2ggKGUpIHt9CiAgfQoKZnVuY3Rpb24gaHlkcmF0ZUNsaWVudEludG9VSShjYXJkUm9vdCwgbmV3Q2xpZW50KXsKICAvLyBVcGRhdGUgRE9NIHZhbHVlcyBpbW1lZGlhdGVseSAobm8gZnVsbCByZS1yZW5kZXIgb24gcHVycG9zZSkuCiAgY29uc3QgbmMgPSAobmV3Q2xpZW50ICYmIHR5cGVvZiBuZXdDbGllbnQgPT09ICJvYmplY3QiKSA/IG5ld0NsaWVudCA6IHt9OwogICAgY29uc3QgdlB0cyA9IChuYy5wb2ludHNGaWREaXNwbGF5ICE9IG51bGwpID8gbmMucG9pbnRzRmlkRGlzcGxheSA6IG5jLnBvaW50c0ZpZFRvdGFsOwogICAgc2V0TG95YWx0eVBpbGwoY2FyZFJvb3QsIHZQdHMsIHsgaXNBbGVydDogISFuYy5sb3lhbHR5VXNlZFNlbGVjdGVkRGF5IH0pOwogICAgc2V0Q2FyZEZpZWxkVmFsdWUoY2FyZFJvb3QsICJ0ZWxlcGhvbmUiLCBmb3JtYXRQaG9uZUZvckRpc3BsYXkobmMudGVsZXBob25lKSk7CiAgICBzZXRDYXJkRmllbGRWYWx1ZShjYXJkUm9vdCwgInByZW5vbSIsIG5jLnByZW5vbSA/PyAiIik7CiAgICBzZXRDYXJkRmllbGRWYWx1ZShjYXJkUm9vdCwgImFkcmVzc2UiLCBuYy5hZHJlc3NlID8/ICIiKTsKICAgIHNldENhcmRGaWVsZFZhbHVlKGNhcmRSb290LCAiY29tcGxlbWVudEFkcmVzc2UiLCBuYy5jb21wbGVtZW50QWRyZXNzZSA/PyAiIik7CiAgICBzZXRDYXJkRmllbGRWYWx1ZShjYXJkUm9vdCwgImV4cGxpY2F0aW9uc0FkcmVzc2UiLCBuYy5leHBsaWNhdGlvbnNBZHJlc3NlID8/ICIiKTsKICAgIHNldENhcmRGaWVsZFZhbHVlKGNhcmRSb290LCAibnVtUGx1czEiLCBuYy5udW1QbHVzMSA/PyAiIik7CiAgICBzZXRDYXJkRmllbGRWYWx1ZShjYXJkUm9vdCwgIm51bVBsdXMyIiwgbmMubnVtUGx1czIgPz8gIiIpOwogICAgc2V0Q2FyZEZpZWxkVmFsdWUoY2FyZFJvb3QsICJjb2RlUG9zdGFsIiwgbmMuY29kZVBvc3RhbCA/PyAiIik7CiAgICBzZXRDYXJkRmllbGRWYWx1ZShjYXJkUm9vdCwgInZpbGxlIiwgbmMudmlsbGUgPz8gIiIpOwogICAgc2V0Q2FyZEZpZWxkVmFsdWUoCiAgICAgIGNhcmRSb290LAogICAgICAiZGVsaXZlcnlDaXR5Q2hvaWNlIiwKICAgICAgYnVpbGRBbGxvd2VkRGVsaXZlcnlDaXR5Q2hvaWNlVmFsdWUoZ2V0Q3VycmVudFN0b3JlU3VmZml4KCksIG5jLnZpbGxlID8/ICIiLCBuYy5jb2RlUG9zdGFsID8/ICIiKQogICAgKTsKICBzZXRDYXJkRmllbGRWYWx1ZShjYXJkUm9vdCwgInByb2JsZW1lIiwgbmMucHJvYmxlbWUgPz8gIiIpOwogIC8vIEVuc3VyZSBhdHRlbnRpb24gaXMgc3luY2VkIGV2ZW4gd2hlbiBVSSBpcyBoeWRyYXRlZCB3aXRob3V0IGEgZnVsbCByZS1yZW5kZXIuCiAgdHJ5IHsgc2V0UHJvYmxlbWVBdHRlbnRpb24oY2FyZFJvb3QsIG5jLnByb2JsZW1lID8/ICIiKTsgfSBjYXRjaCAoZSkge30KICAvLyBTeW5jIFN0b3AgU01TIHRyaS1zdGF0ZSBzd2l0Y2ggKGFjY2VwdGVkIHwgbmV1dHJhbCB8IHJlZnVzZWQpCiAgdHJ5IHsgc2V0U3RvcFNtc1N3aXRjaChjYXJkUm9vdCwgZ2V0U21zU3dpdGNoVmlzdWFsU3RhdGUobmMpKTsgfSBjYXRjaCAoZTIpIHt9Cn0KCiAgZnVuY3Rpb24gbWF5YmVBdXRvSW5qZWN0TG95YWx0eURpc2NvdW50KCl7CiAgICBpZiAoIXN0YXRlIHx8IHR5cGVvZiBzdGF0ZSAhPT0gIm9iamVjdCIpIHJldHVybjsKICAgIGNvbnN0IGMgPSAoc3RhdGUuY2xpZW50ICYmIHR5cGVvZiBzdGF0ZS5jbGllbnQgPT09ICJvYmplY3QiKSA/IHN0YXRlLmNsaWVudCA6IHt9OwogICAgY29uc3QgcHRzID0gTnVtYmVyKGMucG9pbnRzRmlkRGlzcGxheSAhPSBudWxsID8gYy5wb2ludHNGaWREaXNwbGF5IDogYy5wb2ludHNGaWRUb3RhbCk7CiAgICBjb25zdCBlbGlnaWJsZSA9IE51bWJlci5pc0Zpbml0ZShwdHMpICYmIHB0cyA+PSAxMCAmJiAoYy5sb3lhbHR5VXNlZFNlbGVjdGVkRGF5ID09PSBmYWxzZSk7CiAgICBpZiAoIWVsaWdpYmxlKSByZXR1cm47CiAgICBpbmplY3RTZWFyY2hEb3VibGVEYXNoT25jZSh7IHJlYXNvbjogImNsaWVudF9sb29rdXBfYXV0b3N1Z2dlc3QiIH0pOwogIH0KCiAgYXN5bmMgZnVuY3Rpb24gY29tbWl0UGhvbmUoY2FyZFJvb3QsIHJhd0lucHV0KXsKICAgIGlmICghc3RhdGUgfHwgdHlwZW9mIHN0YXRlICE9PSAib2JqZWN0IikgcmV0dXJuOwogICAgaWYgKCFzdGF0ZS5jbGllbnQgfHwgdHlwZW9mIHN0YXRlLmNsaWVudCAhPT0gIm9iamVjdCIpIHN0YXRlLmNsaWVudCA9IHt9OwoKICAgIGNvbnN0IHJhdyA9IFN0cmluZyhyYXdJbnB1dCA/PyAiIikudHJpbSgpOwogICAgaWYgKCFyYXcpewogICAgICAvLyBDbGVhciBwaG9uZSAoZG8gbm90IGxvb2t1cCkKICAgICAgc3RhdGUuY2xpZW50LnRlbGVwaG9uZSA9ICIiOwogICAgICBzZXRDYXJkSW5wdXRWYWx1ZShjYXJkUm9vdCwgInRlbGVwaG9uZSIsICIiKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIFBhcnNlICsgdmFsaWRhdGUgQkVGT1JFIGFueSBmZXRjaCB0byBhdm9pZCBzcGFtbWluZyB0aGUgQVBJIHdoaWxlIHR5cGluZy4KICAgIC8vIFJ1bGVzOgogICAgLy8gLSBGUiB2YWxpZDogMzMgKyA5IGRpZ2l0cwogICAgLy8gLSBJTlRMIHZhbGlkOiA2Li4xNSBkaWdpdHMgQU5EIHVzZXIgcHJvdmlkZWQgYW4gaW50bCBwcmVmaXggKCsgb3IgMDApCiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUFuZFZhbGlkYXRlUGhvbmUocmF3KTsKICAgIGlmICghcGFyc2VkPy5pc1ZhbGlkKSByZXR1cm47CiAgICBjb25zdCBkaWdpdHNEYiA9IFN0cmluZyhwYXJzZWQuZGlnaXRzID8/ICIiKS50cmltKCk7CiAgICBpZiAoIWRpZ2l0c0RiKSByZXR1cm47CgogICAgLy8gUmVzZXQgZHVwbGljYXRlLW9yZGVyIHByb21wdCBrZXkgaWYgdXNlciBhY3R1YWxseSBjaGFuZ2VkIHRoZSBwaG9uZS4KICAgIHRyeXsKICAgICAgY29uc3QgcHJldiA9IFN0cmluZyhzdGF0ZS5fX2xhc3RDb21taXR0ZWRQaG9uZURpZ2l0cyA/PyAiIik7CiAgICAgIGlmIChwcmV2ICYmIHByZXYgIT09IFN0cmluZyhkaWdpdHNEYikpIHN0YXRlLl9fZHVwT3JkZXJQcm9tcHRLZXkgPSBudWxsOwogICAgICBzdGF0ZS5fX2xhc3RDb21taXR0ZWRQaG9uZURpZ2l0cyA9IFN0cmluZyhkaWdpdHNEYik7CiAgICB9IGNhdGNoIChlKSB7fQoKICAgIC8vIFBlcnNpc3Qgbm9ybWFsaXplZCBkaWdpdHMgaW4gc3RhdGUgKERCL3NlYXJjaCBmb3JtYXQpLgogICAgLy8gSU1QT1JUQU5UOiBwaG9uZSBjb21taXQgLyBsb29rdXAgbXVzdCBuZXZlciByZXNldCBvciBmb3JjZSBjb3VwZS9saXZyYWlzb24uCiAgICBzdGF0ZS5jbGllbnQudGVsZXBob25lID0gZGlnaXRzRGI7CiAgICAvLyBSZWZvcm1hdCBVSSBvbmx5IGF0IGNvbW1pdCB0aW1lCiAgICBzZXRDYXJkRmllbGRWYWx1ZShjYXJkUm9vdCwgInRlbGVwaG9uZSIsIGZvcm1hdFBob25lRm9yRGlzcGxheShkaWdpdHNEYikpOwoKICAgIC8vIElNUE9SVEFOVDogbW92ZSBmb2N1cyBhd2F5IGZyb20gcGhvbmUgaW1tZWRpYXRlbHkgc28gdXNlciBjbGlja3Mgd29uJ3QgcmV0cmlnZ2VyIGNvbW1pdCB2aWEgYmx1ci4KICAgIC8vIEd1YXJkIGFnYWluc3QgdGhlIHByb2dyYW1tYXRpYyBmb2N1cyBpdHNlbGYgY2F1c2luZyBhIGJsdXItPmNvbW1pdCBsb29wLgogICAgX19pZ25vcmVOZXh0UGhvbmVCbHVyID0gdHJ1ZTsKICAgIHRyeSB7IHJlcXVlc3RTZWFyY2hGb2N1cygpOyB9IGNhdGNoIChlKSB7fQoKICAgIGlmIChfX3Bob25lTG9va3VwSW5GbGlnaHQpIHJldHVybjsKICAgIF9fcGhvbmVMb29rdXBJbkZsaWdodCA9IHRydWU7CiAgICB0cnl7CiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoQ2xpZW50QnlQaG9uZShkaWdpdHNEYiwgeyBkYXRlSVNPOiBzdGF0ZT8uc2VsZWN0ZWREYXRlSVNPIH0pOwogICAgICBpZiAocmVzPy5vayAmJiByZXM/LmZvdW5kICYmIHJlcz8uY2xpZW50ICYmIHR5cGVvZiByZXMuY2xpZW50ID09PSAib2JqZWN0Iil7CiAgICAgICAgY29uc3QgaW5qZWN0ZWQgPSBidWlsZEluamVjdGVkQ2xpZW50RnJvbUFwaShyZXMuY2xpZW50KTsKICAgICAgICAvLyBFbnN1cmUgdGhlIG5vcm1hbGl6ZWQgcGhvbmUgaXMga2VwdCAoZXZlbiBpZiBBUEkgcm93IGhhcyBhbm90aGVyIHJhdyBzaGFwZSkKICAgICAgICBpbmplY3RlZC50ZWxlcGhvbmUgPSBkaWdpdHNEYjsKICAgICAgICAvLyBLZWVwIHN0b3Bfc21zIHdpdGhvdXQgZGVwZW5kaW5nIG9uIGJ1aWxkSW5qZWN0ZWRDbGllbnRGcm9tQXBpIG1hcHBpbmcgKGRlZmVuc2l2ZSkuCiAgICAgICAgaW5qZWN0ZWQuc3RvcFNtcyA9IHJlYWRTdG9wU21zVmFsdWUocmVzLmNsaWVudCk7CiAgICAgICAgc3luY0luamVjdGVkQ2xpZW50RGVsaXZlcnlTdGF0ZShpbmplY3RlZCwgZ2V0Q3VycmVudFN0b3JlU3VmZml4KCkpOwogICAgICAgIHN0YXRlLmNsaWVudCA9IGluamVjdGVkOwogICAgICAgIGNvbnN0IHZQdHMgPSAoaW5qZWN0ZWQucG9pbnRzRmlkRGlzcGxheSAhPSBudWxsKSA/IGluamVjdGVkLnBvaW50c0ZpZERpc3BsYXkgOiBpbmplY3RlZC5wb2ludHNGaWRUb3RhbDsKICAgICAgICBzZXRMb3lhbHR5UGlsbChjYXJkUm9vdCwgdlB0cywgeyBpc0FsZXJ0OiAhIWluamVjdGVkLmxveWFsdHlVc2VkU2VsZWN0ZWREYXkgfSk7CiAgICAgICAgaHlkcmF0ZUNsaWVudEludG9VSShjYXJkUm9vdCwgaW5qZWN0ZWQpOwogICAgICAgIC8vIEF1dG8tcHJvcG9zZSBsb3lhbHR5IGRpc2NvdW50IGlmIGVsaWdpYmxlIChwb2ludHMgPj0gMTAgYW5kIG5vdCB1c2VkIHRoaXMgZGF5KQogICAgICAgIC8vIE11c3QgaGFwcGVuIEFGVEVSIGNsaWVudCBoeWRyYXRpb24gc28gY29uZGl0aW9uIHVzZXMgZnJlc2ggYmFja2VuZCBmbGFncy4KICAgICAgICB0cnkgeyBtYXliZUF1dG9JbmplY3RMb3lhbHR5RGlzY291bnQoKTsgfSBjYXRjaCAoZSkge30KICAgICAgfSBlbHNlIGlmIChyZXM/Lm9rICYmIHJlcz8uZm91bmQgPT09IGZhbHNlKXsKICAgICAgICAvLyBLZWVwIG5vcm1hbGl6ZWQgcGhvbmUsIGNsZWFyIG90aGVyIGZpZWxkcyAocmVhZHkgdG8gY3JlYXRlIG5ldyBjbGllbnQgbGF0ZXIpLgogICAgICAgIC8vIElNUE9SVEFOVDogdGhpcyBpcyBzdGlsbCB0aGUgc2FtZSBjdXJyZW50IG9yZGVyIGNvbnRleHQsIHNvIHdlIGRvIG5vdCB0b3VjaAogICAgICAgIC8vIGNvdXBlL2xpdnJhaXNvbiBoZXJlLgogICAgICAgIGNvbnN0IGtlZXBQaG9uZSA9IGRpZ2l0c0RiOwogICAgICAgIGNvbnN0IGNsZWFyZWQgPSB7CiAgICAgICAgICB0ZWxlcGhvbmU6IGtlZXBQaG9uZSwKICAgICAgICAgIHBvaW50c0ZpZFRvdGFsOiBudWxsLAogICAgICAgICAgcG9pbnRzRmlkRGlzcGxheTogbnVsbCwKICAgICAgICAgIGxveWFsdHlSZXNlcnZlZFBpenphczogMCwKICAgICAgICAgIGxveWFsdHlSZXNlcnZlZFBvaW50czogMCwKICAgICAgICAgIGxveWFsdHlVc2VkU2VsZWN0ZWREYXk6IGZhbHNlLAogICAgICAgICAgcHJlbm9tOiAiIiwKICAgICAgICAgIGFkcmVzc2U6ICIiLAogICAgICAgICAgY29tcGxlbWVudEFkcmVzc2U6ICIiLAogICAgICAgICAgZXhwbGljYXRpb25zQWRyZXNzZTogIiIsCiAgICAgICAgICBudW1QbHVzMTogIiIsCiAgICAgICAgICBudW1QbHVzMjogIiIsCiAgICAgICAgICBjb2RlUG9zdGFsOiAiIiwKICAgICAgICAgIHZpbGxlOiAiIiwKICAgICAgICAgIGRlbGl2ZXJ5Q2l0eUNob2ljZTogIiIsCiAgICAgICAgICBkZWxpdmVyeUNpdHlQZXJzaXN0ZWRDb2RlUG9zdGFsOiAiIiwKICAgICAgICAgIGRlbGl2ZXJ5Q2l0eVBlcnNpc3RlZFZpbGxlOiAiIiwKICAgICAgICAgIHByb2JsZW1lOiAiIiwKICAgICAgICAgIHN0b3BTbXM6IDAsCiAgICAgICAgfTsKICAgICAgICBzdGF0ZS5jbGllbnQgPSBjbGVhcmVkOwogICAgICAgIHNldExveWFsdHlQaWxsKGNhcmRSb290LCBudWxsKTsKICAgICAgICBoeWRyYXRlQ2xpZW50SW50b1VJKGNhcmRSb290LCBjbGVhcmVkKTsKICAgICAgICAvLyBOb3QgZWxpZ2libGUgYW55d2F5LCBidXQgZW5zdXJlIHdlIGRvbid0IGtlZXAgYW4gImF1dG8gaW5qZWN0ZWQiIGZsYWcgc3R1Y2sKICAgICAgICBzdGF0ZS5hdXRvRGlzY291bnRJbmplY3RlZCA9IGZhbHNlOwogICAgICAgIHRyeSB7IHRvYXN0KCJDbGllbnQgaW50cm91dmFibGUiKTsgfSBjYXRjaCAoZSkge30KICAgICAgfQoKICAgICAgLy8g4pSA4pSAIE5FVzogZGV0ZWN0IGV4aXN0aW5nIG9yZGVycyBmb3IgdGhpcyBwaG9uZSAidG9kYXkiIG9uIGN1cnJlbnQgUERWIOKUgOKUgAogICAgICAvLyBUcmlnZ2VyZWQgb24gY29tbWl0IChFbnRlci9ibHVyKSwgZXhhY3RseSBsaWtlIGNsaWVudCBsb29rdXAuCiAgICAgIHRyeXsKICAgICAgICBhd2FpdCBlbnN1cmVOb0R1cGxpY2F0ZVRvZGF5T3JkZXIoeyBzdGF0ZSwgcGhvbmVEaWdpdHM6IGRpZ2l0c0RiIH0pOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgLy8gU2lsZW50OiBkbyBub3QgYmxvY2sgdGhlIG5vcm1hbCBmbG93IG9uIHRyYW5zaWVudCBpc3N1ZXMKICAgICAgfQogICAgfSBjYXRjaCAoZSl7CiAgICAgIC8vIFNpbGVudC1pc2g6IGtlZXAgcGhvbmUsIG5vIGNyYXNoCiAgICB9IGZpbmFsbHkgewogICAgICBfX3Bob25lTG9va3VwSW5GbGlnaHQgPSBmYWxzZTsKICAgIH0KICB9CgogIGFzeW5jIGZ1bmN0aW9uIHNhdmVDbGllbnRQcm9ibGVtZShjYXJkUm9vdCwgYnRuRWwpewogICAgY29uc3QgbGF0ZXN0Q2xpZW50ID0KICAgICAgKHN0YXRlPy5jbGllbnQgJiYgdHlwZW9mIHN0YXRlLmNsaWVudCA9PT0gIm9iamVjdCIpCiAgICAgICAgPyBzdGF0ZS5jbGllbnQKICAgICAgICA6IChsaXZlQ2xpZW50ICYmIHR5cGVvZiBsaXZlQ2xpZW50ID09PSAib2JqZWN0IiA/IGxpdmVDbGllbnQgOiB7fSk7CgogICAgY29uc3QgY2lkID0gTnVtYmVyKGxhdGVzdENsaWVudD8uaWQpOwogICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoY2lkKSB8fCBjaWQgPD0gMCl7CiAgICAgIHRyeSB7IHRvYXN0KCJBdWN1biBjbGllbnQgY2hhcmfDqSAoaWQgbWFucXVhbnQpIiwgeyBhbmNob3JFbDogYnRuRWwsIHBsYWNlbWVudDogInRvcCIgfSk7IH0gY2F0Y2ggKGUpIHt9CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBQcmVmZXIgc3RhdGUgdmFsdWU7IGZhbGxiYWNrIHRvIERPTSB2YWx1ZSAoZGVmZW5zaXZlKS4KICAgIGxldCByYXcgPSAiIjsKICAgIHRyeSB7IHJhdyA9IFN0cmluZyhsYXRlc3RDbGllbnQ/LnByb2JsZW1lID8/ICIiKTsgfSBjYXRjaCAoZSkgeyByYXcgPSAiIjsgfQogICAgaWYgKCFyYXcgJiYgY2FyZFJvb3QpewogICAgICB0cnl7CiAgICAgICAgY29uc3QgaW5wID0gY2FyZFJvb3QucXVlcnlTZWxlY3RvcignaW5wdXRbZGF0YS1maWVsZC1rZXk9InByb2JsZW1lIl0nKTsKICAgICAgICByYXcgPSBTdHJpbmcoaW5wPy52YWx1ZSA/PyAiIik7CiAgICAgIH0gY2F0Y2ggKGUyKSB7fQogICAgfQoKICAgIGNvbnN0IHRyaW1tZWQgPSBTdHJpbmcocmF3ID8/ICIiKS50cmltKCk7CiAgICBjb25zdCBwcm9ibGVtZSA9IHRyaW1tZWQgPyB0cmltbWVkIDogbnVsbDsgLy8gZXhwbGljaXQgY2xlYXIgd2hlbiBlbXB0eQoKICAgIC8vIFVYOiBkaXNhYmxlIHdoaWxlIHNhdmluZyAocHJldmVudHMgZG91YmxlIGNsaWNrKQogICAgdHJ5ewogICAgICBpZiAoYnRuRWwpIHsKICAgICAgICBidG5FbC5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgYnRuRWwuc2V0QXR0cmlidXRlKCJhcmlhLWJ1c3kiLCAidHJ1ZSIpOwogICAgICB9CiAgICB9IGNhdGNoIChlKSB7fQoKICAgIHRyeXsKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB1cGRhdGVDbGllbnRQcm9ibGVtZSh7IGNsaWVudElkOiBjaWQsIHByb2JsZW1lIH0pOwogICAgICAgIGlmICghcmVzPy5vayl7CiAgICAgICAgICB0cnkgeyB0b2FzdChyZXM/LmVycm9yIHx8ICJJbXBvc3NpYmxlIGRlIG1ldHRyZSDDoCBqb3VyIiwgeyBhbmNob3JFbDogYnRuRWwsIHBsYWNlbWVudDogInRvcCIgfSk7IH0gY2F0Y2ggKGUpIHt9CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgLy8gUGVyc2lzdCBpbiBzdGF0ZSArIHN5bmMgRE9NIChubyBmdWxsIHJlLXJlbmRlcikuCiAgICAgICAgaWYgKCFzdGF0ZS5jbGllbnQgfHwgdHlwZW9mIHN0YXRlLmNsaWVudCAhPT0gIm9iamVjdCIpIHN0YXRlLmNsaWVudCA9IHt9OwogICAgICAgIHN0YXRlLmNsaWVudC5wcm9ibGVtZSA9IChyZXM/LnByb2JsZW1lID09IG51bGwpID8gIiIgOiBTdHJpbmcocmVzLnByb2JsZW1lKTsKICAgICAgICB0cnkgeyBzZXRDYXJkRmllbGRWYWx1ZShjYXJkUm9vdCwgInByb2JsZW1lIiwgc3RhdGUuY2xpZW50LnByb2JsZW1lKTsgfSBjYXRjaCAoZSkge30KICAgICAgICB0cnkgeyBzZXRQcm9ibGVtZUF0dGVudGlvbihjYXJkUm9vdCwgc3RhdGUuY2xpZW50LnByb2JsZW1lKTsgfSBjYXRjaCAoZSkge30KCiAgICAgICAgdHJ5IHsgdG9hc3QoIlByb2Jsw6htZSBtaXMgw6Agam91ciIsIHsgYW5jaG9yRWw6IGJ0bkVsLCBwbGFjZW1lbnQ6ICJ0b3AiIH0pOyB9IGNhdGNoIChlKSB7fQogICAgfSBjYXRjaCAoZSl7CiAgICAgIHRyeSB7IHRvYXN0KCJFcnJldXIgcsOpc2VhdSAoTUFKIHByb2Jsw6htZSkiLCB7IGFuY2hvckVsOiBidG5FbCwgcGxhY2VtZW50OiAidG9wIiB9KTsgfSBjYXRjaCAoX2UpIHt9CiAgICB9IGZpbmFsbHkgewogICAgICB0cnl7CiAgICAgICAgaWYgKGJ0bkVsKSB7CiAgICAgICAgICBidG5FbC5kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgYnRuRWwucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWJ1c3kiKTsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBzdHViUmVjb3ZlckFuc3dlcmVkQ2FsbCgpewogICAgLy8gRmFsbGJhY2sgb25seTogaWYgY2FsbGJhY2sgaXNuJ3QgcHJvdmlkZWQsIGtlZXAgYSBoYXJtbGVzcyBVWCBtZXNzYWdlLgogICAgdHJ5IHsgdG9hc3QoIlLDqWN1cMOpcmF0aW9uIE9WSCA6IGluZGlzcG9uaWJsZSIpOyB9IGNhdGNoIChlKSB7fQogIH0KCmZ1bmN0aW9uIHBob25lRmllbGQoeyBwbGFjZWhvbGRlciwgdmFsdWUsIHN0YXRlIH0gPSB7fSl7CiAgY29uc3QgaGFzVmFsdWUgPSBTdHJpbmcodmFsdWUgPz8gIiIpLnRyaW0oKS5sZW5ndGggPiAwOwogIGNvbnN0IHdyYXAgPSBlbCgiZGl2IiwgeyBjbGFzczogYGZpZWxkIGZpZWxkLS1waG9uZSR7aGFzVmFsdWUgPyAiIiA6ICIgZmllbGQtLWVtcHR5In1gIH0sIFsKICAgIC8vIFNpbmdsZSBmaWVsZDogaW5wdXQgKyBpbnRlZ3JhdGVkIHJpZ2h0IGFjdGlvbiAocmVmcmVzaCkgaW5zaWRlIHRoZSBmaWVsZC4KICAgIGVsKCJkaXYiLCB7IGNsYXNzOiAiZmllbGRfX2luYnRuIGZpZWxkX19pbmJ0bi0tcGhvbmUiIH0sIFsKICAgICAgZWwoImlucHV0IiwgewogICAgICAgIGNsYXNzOiAiaW5wdXQgaW5wdXQtLXBsYWNlaG9sZGVyLWxnIGZpZWxkX19pbmJ0bi1pbnB1dCIsCiAgICAgICAgdmFsdWU6IFN0cmluZyh2YWx1ZSA/PyAiIiksCiAgICAgICAgLy8gQWx3YXlzIGtlZXAgdGhlIGxhYmVsIGFzIHBsYWNlaG9sZGVyIHNvIGl0IHJlYXBwZWFycyBpZiB0aGUgdXNlciBjbGVhcnMgdGhlIGZpZWxkLgogICAgICAgIHBsYWNlaG9sZGVyOiBTdHJpbmcocGxhY2Vob2xkZXIgPz8gIiIpLAogICAgICAgIGRhdGFzZXQ6IHsgZmllbGRLZXk6ICJ0ZWxlcGhvbmUiIH0sCiAgICAgICAgImFyaWEtbGFiZWwiOiBTdHJpbmcocGxhY2Vob2xkZXIgPz8gIiIpLAogICAgICB9KSwKICAgICAgZWwoImJ1dHRvbiIsIHsKICAgICAgICB0eXBlOiAiYnV0dG9uIiwKICAgICAgICBjbGFzczogImZpZWxkX19pbmJ0bi1idG4gcGhvbmUtYWN0aW9uLWJ0biBwaG9uZS1hY3Rpb24tYnRuLS1pY29uIiwKICAgICAgICB0aXRsZTogIlLDqWN1cMOpcmVyIGFwcGVsIiwKICAgICAgICAiYXJpYS1sYWJlbCI6ICJSw6ljdXDDqXJlciBhcHBlbCIsCiAgICAgICAgb25DbGljazogKGUpID0+IHsKICAgICAgICAgICAgLy8gRG8gbm90IGludGVyZmVyZSB3aXRoIGV4aXN0aW5nIHBob25lIGNvbW1pdC9sb29rdXAgbG9naWMuCiAgICAgICAgICAgIHRyeSB7IGU/LnByZXZlbnREZWZhdWx0Py4oKTsgfSBjYXRjaCAoZTIpIHt9CiAgICAgICAgICAgIGlmICh0eXBlb2Ygb25SZWNvdmVyQ2FsbCA9PT0gImZ1bmN0aW9uIil7CiAgICAgICAgICAgICAgdHJ5IHsgb25SZWNvdmVyQ2FsbCgpOyB9IGNhdGNoIChlMykge30KICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3R1YlJlY292ZXJBbnN3ZXJlZENhbGwoKTsKICAgICAgICAgIH0sCiAgICAgICAgfSwgWwogICAgICAgICAgc3ZnSWNvbigicmVmcmVzaCIpLAogICAgICAgICAgZWwoInNwYW4iLCB7IGNsYXNzOiAic3Itb25seSIgfSwgIlLDqWN1cMOpcmVyIGFwcGVsIiksCiAgICAgICAgXSksCiAgICAgIF0pLAogICAgXSk7CgogICAgY29uc3QgaW5wID0gd3JhcC5xdWVyeVNlbGVjdG9yKCJpbnB1dCIpOwogICAgaWYgKCFpbnApIHJldHVybiB3cmFwOwoKICAgIGlucC5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsIChlKSA9PiB7CiAgICAgIGNvbnN0IHYgPSBlPy50YXJnZXQ/LnZhbHVlID8/ICIiOwogICAgICBpZiAoIXN0YXRlIHx8IHR5cGVvZiBzdGF0ZSAhPT0gIm9iamVjdCIpIHJldHVybjsKICAgICAgaWYgKCFzdGF0ZS5jbGllbnQgfHwgdHlwZW9mIHN0YXRlLmNsaWVudCAhPT0gIm9iamVjdCIpIHN0YXRlLmNsaWVudCA9IHt9OwogICAgICAvLyBXaGlsZSB0eXBpbmc6IHN0b3JlIHJhdyAoZG8gbm90IHJlZm9ybWF0OyBhdm9pZCBjdXJzb3IganVtcHMpCiAgICAgIHN0YXRlLmNsaWVudC50ZWxlcGhvbmUgPSBTdHJpbmcodik7CiAgICAgIC8vIEtlZXAgZW1wdHkvbm9uLWVtcHR5IHZpc3VhbCBzdGF0ZSBpbiBzeW5jIHdpdGhvdXQgYSBmdWxsIHJlLXJlbmRlci4KICAgICAgdHJ5ewogICAgICAgIGNvbnN0IGZpZWxkUm9vdCA9IGlucC5jbG9zZXN0KCIuZmllbGQiKSB8fCBpbnAucGFyZW50RWxlbWVudDsKICAgICAgICBpZiAoZmllbGRSb290KSBmaWVsZFJvb3QuY2xhc3NMaXN0LnRvZ2dsZSgiZmllbGQtLWVtcHR5IiwgIWlzTm9uRW1wdHkodikpOwogICAgICB9IGNhdGNoIChlMykge30KICAgICAgaWYgKF9fcGhvbmVEZWJvdW5jZVRpbWVyKXsKICAgICAgICB0cnkgeyBjbGVhclRpbWVvdXQoX19waG9uZURlYm91bmNlVGltZXIpOyB9IGNhdGNoIChlMikge30KICAgICAgICBfX3Bob25lRGVib3VuY2VUaW1lciA9IG51bGw7CiAgICAgIH0KICAgICAgX19waG9uZURlYm91bmNlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICBfX3Bob25lRGVib3VuY2VUaW1lciA9IG51bGw7CiAgICAgICAgY29tbWl0UGhvbmUoY2FyZEVsLCBpbnAudmFsdWUpOwogICAgICB9LCA2NTApOwogICAgfSk7CgogICAgaW5wLmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCAoZSkgPT4gewogICAgICBpZiAoIWUpIHJldHVybjsKICAgICAgaWYgKGUua2V5ID09PSAiRW50ZXIiKXsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgaWYgKF9fcGhvbmVEZWJvdW5jZVRpbWVyKXsKICAgICAgICAgIHRyeSB7IGNsZWFyVGltZW91dChfX3Bob25lRGVib3VuY2VUaW1lcik7IH0gY2F0Y2ggKGUyKSB7fQogICAgICAgICAgX19waG9uZURlYm91bmNlVGltZXIgPSBudWxsOwogICAgICAgIH0KICAgICAgICBjb21taXRQaG9uZShjYXJkRWwsIGlucC52YWx1ZSk7CiAgICAgIH0KICAgIH0pOwoKICAgIGlucC5hZGRFdmVudExpc3RlbmVyKCJibHVyIiwgKCkgPT4gewogICAgICBpZiAoX19pZ25vcmVOZXh0UGhvbmVCbHVyKXsKICAgICAgICBfX2lnbm9yZU5leHRQaG9uZUJsdXIgPSBmYWxzZTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKF9fcGhvbmVEZWJvdW5jZVRpbWVyKXsKICAgICAgICB0cnkgeyBjbGVhclRpbWVvdXQoX19waG9uZURlYm91bmNlVGltZXIpOyB9IGNhdGNoIChlMikge30KICAgICAgICBfX3Bob25lRGVib3VuY2VUaW1lciA9IG51bGw7CiAgICAgIH0KICAgICAgY29tbWl0UGhvbmUoY2FyZEVsLCBpbnAudmFsdWUpOwogICAgfSk7CgogICAgcmV0dXJuIHdyYXA7CiAgfQoKICBjb25zdCBkZWxpdmVyeUZpZWxkcyA9IGVsKCJkaXYiLCB7IGNsYXNzOiAiZGVsaXZlcnktZmllbGRzIiwgImRhdGEtdmlzaWJsZSI6IHN0YXRlLmxpdnJhaXNvbiA/ICIxIiA6ICIwIiB9LCBbCiAgICBlbCgiZGl2IiwgeyBjbGFzczogImRpdmlkZXIiIH0pLAogICAgZmllbGQoeyBrZXk6ICJhZHJlc3NlIiwgcGxhY2Vob2xkZXI6ICJBZHJlc3NlIiwgdmFsdWU6IGxpdmVDbGllbnQuYWRyZXNzZSwgc3RhdGUgfSksCiAgICBmaWVsZCh7IGtleTogImNvbXBsZW1lbnRBZHJlc3NlIiwgcGxhY2Vob2xkZXI6ICJDb21wbMOpbWVudCBk4oCZYWRyZXNzZSIsIHZhbHVlOiBsaXZlQ2xpZW50LmNvbXBsZW1lbnRBZHJlc3NlLCBzdGF0ZSB9KSwKICAgIGZpZWxkKHsga2V5OiAiZXhwbGljYXRpb25zQWRyZXNzZSIsIHBsYWNlaG9sZGVyOiAiRXhwbGljYXRpb25zIHN1ciBhZHJlc3NlIiwgdmFsdWU6IGxpdmVDbGllbnQuZXhwbGljYXRpb25zQWRyZXNzZSwgc3RhdGUgfSksCiAgICBmaWVsZCh7IGtleTogIm51bVBsdXMxIiwgcGxhY2Vob2xkZXI6ICJOdW0rMSIsIHZhbHVlOiBsaXZlQ2xpZW50Lm51bVBsdXMxLCBzdGF0ZSB9KSwKICAgIGZpZWxkKHsga2V5OiAibnVtUGx1czIiLCBwbGFjZWhvbGRlcjogIk51bSsyIiwgdmFsdWU6IGxpdmVDbGllbnQubnVtUGx1czIsIHN0YXRlIH0pLAogICAgc2VsZWN0RmllbGQoewogICAgICBrZXk6ICJkZWxpdmVyeUNpdHlDaG9pY2UiLAogICAgICBwbGFjZWhvbGRlcjogIkNvZGUgcG9zdGFsIC0gVmlsbGUiLAogICAgICB2YWx1ZTogU3RyaW5nKAogICAgICAgIHN0YXRlPy5jbGllbnQ/LmRlbGl2ZXJ5Q2l0eUNob2ljZSA/PwogICAgICAgIGJ1aWxkQWxsb3dlZERlbGl2ZXJ5Q2l0eUNob2ljZVZhbHVlKGdldEN1cnJlbnRTdG9yZVN1ZmZpeCgpLCBsaXZlQ2xpZW50LnZpbGxlLCBsaXZlQ2xpZW50LmNvZGVQb3N0YWwpCiAgICAgICksCiAgICAgIG9wdGlvbnM6IGdldEFsbG93ZWRDaXR5Q2hvaWNlT3B0aW9ucyhnZXRDdXJyZW50U3RvcmVTdWZmaXgoKSksCiAgICAgIHN0YXRlLAogICAgICBpbnZhbGlkYXRlVHJhdmVsQ2hlY2tLaW5kOiAiY2xpZW50IiwKICAgICAgb25DaGFuZ2U6IChjaG9pY2VWYWx1ZSkgPT4gewogICAgICAgIGNvbnN0IHJvdyA9IGZpbmRBbGxvd2VkQ2l0eUNob2ljZUJ5VmFsdWUoZ2V0Q3VycmVudFN0b3JlU3VmZml4KCksIGNob2ljZVZhbHVlKTsKICAgICAgICBpZiAoIXN0YXRlIHx8IHR5cGVvZiBzdGF0ZSAhPT0gIm9iamVjdCIpIHJldHVybjsKICAgICAgICBpZiAoIXN0YXRlLmNsaWVudCB8fCB0eXBlb2Ygc3RhdGUuY2xpZW50ICE9PSAib2JqZWN0Iikgc3RhdGUuY2xpZW50ID0ge307CiAgICAgICAgY29uc3QgcGVyc2lzdGVkUG9zdGFsID0gU3RyaW5nKHN0YXRlLmNsaWVudC5kZWxpdmVyeUNpdHlQZXJzaXN0ZWRDb2RlUG9zdGFsID8/IHN0YXRlLmNsaWVudC5jb2RlUG9zdGFsID8/ICIiKTsKICAgICAgICBjb25zdCBwZXJzaXN0ZWRDaXR5ID0gU3RyaW5nKHN0YXRlLmNsaWVudC5kZWxpdmVyeUNpdHlQZXJzaXN0ZWRWaWxsZSA/PyBzdGF0ZS5jbGllbnQudmlsbGUgPz8gIiIpOwogICAgICAgIHN0YXRlLmNsaWVudC5kZWxpdmVyeUNpdHlDaG9pY2UgPSByb3cgPyBTdHJpbmcoY2hvaWNlVmFsdWUgfHwgIiIpIDogIiI7CiAgICAgICAgc3RhdGUuY2xpZW50LmNvZGVQb3N0YWwgPSByb3cgPyBTdHJpbmcocm93LnBvc3RhbENvZGUgfHwgIiIpIDogcGVyc2lzdGVkUG9zdGFsOwogICAgICAgIHN0YXRlLmNsaWVudC52aWxsZSA9IHJvdyA/IFN0cmluZyhyb3cuY2l0eSB8fCAiIikgOiBwZXJzaXN0ZWRDaXR5OwogICAgICB9LAogICAgfSksCiAgICBkZWxpdmVyeVRyYXZlbENoZWNrQmxvY2soImNsaWVudCIpLAogIF0pOwoKICAvLyBUb2dnbGUgdmlzaWJpbGl0eSB2aWEgaW5saW5lIHN0eWxlIChzaW1wbGUgVUktb25seSBpbnRlcmFjdGlvbikKICBkZWxpdmVyeUZpZWxkcy5zdHlsZS5kaXNwbGF5ID0gc3RhdGUubGl2cmFpc29uID8gImJsb2NrIiA6ICJub25lIjsKCiAgY29uc3QgdGVtcG9yYXJ5RGVsaXZlcnlUb2dnbGUgPSBlbCgiZGl2IiwgewogICAgY2xhc3M6ICJzd2l0Y2gtcm93IiwKICAgIGRhdGFzZXQ6IHsgcm9sZTogInRlbXBvcmFyeS1kZWxpdmVyeS1hZGRyZXNzLXRvZ2dsZS1yb3ciIH0sCiAgfSwgWwogICAgZWwoImRpdiIsIHsgY2xhc3M6ICJuYW1lIiB9LCAiQWRyZXNzZSBwcm92aXNvaXJlIHBvdXIgY2V0dGUgY29tbWFuZGUiKSwKICAgIGVsKCJpbnB1dCIsIHsKICAgICAgdHlwZTogImNoZWNrYm94IiwKICAgICAgY2hlY2tlZDogISF0ZW1wRGVsaXZlcnkuZW5hYmxlZCwKICAgICAgZGF0YXNldDogeyByb2xlOiAidGVtcG9yYXJ5LWRlbGl2ZXJ5LWFkZHJlc3MtdG9nZ2xlIiB9LAogICAgICBvbkNoYW5nZTogKGUpID0+IHsKICAgICAgICBpZiAoIXN0YXRlIHx8IHR5cGVvZiBzdGF0ZSAhPT0gIm9iamVjdCIpIHJldHVybjsKICAgICAgICBpZiAoIXN0YXRlLnRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcyB8fCB0eXBlb2Ygc3RhdGUudGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzICE9PSAib2JqZWN0Iil7CiAgICAgICAgICBzdGF0ZS50ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MgPSB7IGVuYWJsZWQ6IGZhbHNlIH07CiAgICAgICAgfQogICAgICAgIHN0YXRlLnRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcy5lbmFibGVkID0gISFlPy50YXJnZXQ/LmNoZWNrZWQ7CiAgICAgICAgY29uc3QgYmxvY2sgPSBjYXJkRWw/LnF1ZXJ5U2VsZWN0b3I/LignW2RhdGEtcm9sZT0idGVtcG9yYXJ5LWRlbGl2ZXJ5LWFkZHJlc3MtYmxvY2siXScpOwogICAgICAgIGlmIChibG9jayl7CiAgICAgICAgICBjb25zdCBvbiA9ICEhc3RhdGUubGl2cmFpc29uICYmICEhc3RhdGUudGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzLmVuYWJsZWQ7CiAgICAgICAgICBibG9jay5zdHlsZS5kaXNwbGF5ID0gb24gPyAiYmxvY2siIDogIm5vbmUiOwogICAgICAgICAgYmxvY2suZGF0YXNldC52aXNpYmxlID0gb24gPyAiMSIgOiAiMCI7CiAgICAgICAgfQogICAgICB9LAogICAgfSksCiAgXSk7CiAgdGVtcG9yYXJ5RGVsaXZlcnlUb2dnbGUuc3R5bGUuZGlzcGxheSA9IHN0YXRlLmxpdnJhaXNvbiA/ICIiIDogIm5vbmUiOwoKICBjb25zdCB0ZW1wb3JhcnlEZWxpdmVyeUZpZWxkcyA9IGVsKCJkaXYiLCB7CiAgICBjbGFzczogImRlbGl2ZXJ5LWZpZWxkcyBkZWxpdmVyeS1maWVsZHMtLXRlbXBvcmFyeSIsCiAgICAiZGF0YS12aXNpYmxlIjogdGVtcERlbGl2ZXJ5LmVuYWJsZWQgPyAiMSIgOiAiMCIsCiAgICBkYXRhc2V0OiB7IHJvbGU6ICJ0ZW1wb3JhcnktZGVsaXZlcnktYWRkcmVzcy1ibG9jayIgfSwKICB9LCBbCiAgICBlbCgiZGl2IiwgeyBjbGFzczogImRpdmlkZXIiIH0pLAogICAgZWwoImRpdiIsIHsgY2xhc3M6ICJsb3lhbHR5LXBpbGwtbm90ZSIsIHJvbGU6ICJub3RlIiB9LCAiVXRpbGlzw6llIHVuaXF1ZW1lbnQgcG91ciBjZXR0ZSBjb21tYW5kZSwgc2FucyBtb2RpZmllciBsYSBmaWNoZSBjbGllbnQuIiksCiAgICB0ZW1wb3JhcnlEZWxpdmVyeUZpZWxkKHsga2V5OiAiYWRyZXNzZSIsIHBsYWNlaG9sZGVyOiAiQWRyZXNzZSBwcm92aXNvaXJlIiwgdmFsdWU6IHRlbXBEZWxpdmVyeS5hZHJlc3NlLCBzdGF0ZSB9KSwKICAgIHRlbXBvcmFyeURlbGl2ZXJ5RmllbGQoeyBrZXk6ICJjb21wbGVtZW50QWRyZXNzZSIsIHBsYWNlaG9sZGVyOiAiQ29tcGzDqW1lbnQgZOKAmWFkcmVzc2UiLCB2YWx1ZTogdGVtcERlbGl2ZXJ5LmNvbXBsZW1lbnRBZHJlc3NlLCBzdGF0ZSB9KSwKICAgIHRlbXBvcmFyeURlbGl2ZXJ5RmllbGQoeyBrZXk6ICJleHBsaWNhdGlvbnMiLCBwbGFjZWhvbGRlcjogIlJlcMOocmVzIC8gZXhwbGljYXRpb25zIiwgdmFsdWU6IHRlbXBEZWxpdmVyeS5leHBsaWNhdGlvbnMsIHN0YXRlIH0pLAogICAgdGVtcG9yYXJ5RGVsaXZlcnlGaWVsZCh7IGtleTogIm51bWVyb1VyZ2VuY2UiLCBwbGFjZWhvbGRlcjogIlTDqWzDqXBob25lIGTigJl1cmdlbmNlIiwgdmFsdWU6IHRlbXBEZWxpdmVyeS5udW1lcm9VcmdlbmNlLCBzdGF0ZSB9KSwKICAgIHNlbGVjdEZpZWxkKHsKICAgICAga2V5OiAidGVtcG9yYXJ5RGVsaXZlcnlDaXR5Q2hvaWNlIiwKICAgICAgcGxhY2Vob2xkZXI6ICJDb2RlIHBvc3RhbCAtIFZpbGxlIiwKICAgICAgdmFsdWU6IFN0cmluZygKICAgICAgICBzdGF0ZT8udGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzPy50ZW1wb3JhcnlEZWxpdmVyeUNpdHlDaG9pY2UgPz8KICAgICAgICBidWlsZEFsbG93ZWREZWxpdmVyeUNpdHlDaG9pY2VWYWx1ZShnZXRDdXJyZW50U3RvcmVTdWZmaXgoKSwgdGVtcERlbGl2ZXJ5LnZpbGxlLCB0ZW1wRGVsaXZlcnkuY29kZVBvc3RhbCkKICAgICAgKSwKICAgICAgb3B0aW9uczogZ2V0QWxsb3dlZENpdHlDaG9pY2VPcHRpb25zKGdldEN1cnJlbnRTdG9yZVN1ZmZpeCgpKSwKICAgICAgc3RhdGUsCiAgICAgIGludmFsaWRhdGVUcmF2ZWxDaGVja0tpbmQ6ICJ0ZW1wb3JhcnkiLAogICAgICBvbkNoYW5nZTogKGNob2ljZVZhbHVlKSA9PiB7CiAgICAgICAgY29uc3Qgcm93ID0gZmluZEFsbG93ZWRDaXR5Q2hvaWNlQnlWYWx1ZShnZXRDdXJyZW50U3RvcmVTdWZmaXgoKSwgY2hvaWNlVmFsdWUpOwogICAgICAgIGlmICghc3RhdGUgfHwgdHlwZW9mIHN0YXRlICE9PSAib2JqZWN0IikgcmV0dXJuOwogICAgICAgIGlmICghc3RhdGUudGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzIHx8IHR5cGVvZiBzdGF0ZS50ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MgIT09ICJvYmplY3QiKXsKICAgICAgICAgIHN0YXRlLnRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcyA9IHsKICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICAgICAgICAgdGVtcG9yYXJ5RGVsaXZlcnlDaXR5Q2hvaWNlOiAiIiwKICAgICAgICAgICAgcGVyc2lzdGVkQ29kZVBvc3RhbDogIiIsCiAgICAgICAgICAgIHBlcnNpc3RlZFZpbGxlOiAiIiwKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGNvbnN0IHBlcnNpc3RlZFBvc3RhbCA9IFN0cmluZyhzdGF0ZS50ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MucGVyc2lzdGVkQ29kZVBvc3RhbCA/PyBzdGF0ZS50ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MuY29kZVBvc3RhbCA/PyAiIik7CiAgICAgICAgY29uc3QgcGVyc2lzdGVkQ2l0eSA9IFN0cmluZyhzdGF0ZS50ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MucGVyc2lzdGVkVmlsbGUgPz8gc3RhdGUudGVtcG9yYXJ5RGVsaXZlcnlBZGRyZXNzLnZpbGxlID8/ICIiKTsKICAgICAgICBzdGF0ZS50ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MudGVtcG9yYXJ5RGVsaXZlcnlDaXR5Q2hvaWNlID0gcm93ID8gU3RyaW5nKGNob2ljZVZhbHVlIHx8ICIiKSA6ICIiOwogICAgICAgIHN0YXRlLnRlbXBvcmFyeURlbGl2ZXJ5QWRkcmVzcy5jb2RlUG9zdGFsID0gcm93ID8gU3RyaW5nKHJvdy5wb3N0YWxDb2RlIHx8ICIiKSA6IHBlcnNpc3RlZFBvc3RhbDsKICAgICAgICBzdGF0ZS50ZW1wb3JhcnlEZWxpdmVyeUFkZHJlc3MudmlsbGUgPSByb3cgPyBTdHJpbmcocm93LmNpdHkgfHwgIiIpIDogcGVyc2lzdGVkQ2l0eTsKICAgICAgfSwKICAgIH0pLAogICAgZGVsaXZlcnlUcmF2ZWxDaGVja0Jsb2NrKCJ0ZW1wb3JhcnkiKSwKICBdKTsKICB0ZW1wb3JhcnlEZWxpdmVyeUZpZWxkcy5zdHlsZS5kaXNwbGF5ID0gKHN0YXRlLmxpdnJhaXNvbiAmJiB0ZW1wRGVsaXZlcnkuZW5hYmxlZCkgPyAiYmxvY2siIDogIm5vbmUiOwoKICAvLyBQcm9ibMOobWUgbXVzdCBiZSBBTFdBWVMgdmlzaWJsZSAobm90IHRpZWQgdG8gTGl2cmFpc29uIHRvZ2dsZSkgQU5EIE1VU1QgYmUgbGFzdC4KICBjb25zdCBwcm9ibGVtZUZpZWxkID0gcHJvYmxlbWVGaWVsZFdpdGhTYXZlKHsKICAgIHBsYWNlaG9sZGVyOiAiUHJvYmzDqG1lIiwgdmFsdWU6IGxpdmVDbGllbnQucHJvYmxlbWUsIHN0YXRlLAogICAgb25TYXZlOiAoYnRuRWwpID0+IHNhdmVDbGllbnRQcm9ibGVtZShjYXJkRWwsIGJ0bkVsKSwKICB9KTsKICAvLyBOb3RlOiBhdHRlbnRpb24gc3R5bGluZyBpcyBzeW5jZWQgYWZ0ZXIgY2FyZCBleGlzdHMgKHNlZSBiZWxvdykuCgogIGNvbnN0IGNhcmRFbCA9IGVsKCJkaXYiLCB7IGNsYXNzOiAiY2FyZCIgfSwgWwogICAgZWwoImRpdiIsIHsgY2xhc3M6ICJjYXJkX19oZCIgfSwgWwogICAgICAvLyBIZWFkZXIgdGl0bGUgcmVtb3ZlZDogdGhlIGxveWFsdHkgYnV0dG9uIG11c3QgdGFrZSBmdWxsIHdpZHRoLgogICAgICBlbCgiZGl2IiwgeyBjbGFzczogImNhcmRfX2FjdGlvbnMiIH0sIFsKICAgICAgICAuLi4ocGlsbCA/IFtwaWxsXSA6IFtdKSwKICAgICAgXSksCiAgICBdKSwKICAgIGVsKCJkaXYiLCB7IGNsYXNzOiAiY2FyZF9fYmQiIH0sIFsKICAgICAgLy8gVmFsZXVyIGJydXRlIGNvbnNlcnbDqWUgZGFucyBzdGF0ZS5jbGllbnQudGVsZXBob25lIChleDogMzM2MTg1MjkzNzUpCiAgICAgIC8vIEFmZmljaGFnZSB1bmlxdWVtZW50IGZvcm1hdMOpIGljaSAoZXg6IDA2IDE4IDUyIDkzIDc1KQogICAgICAuLi4ocGlsbE5vdGUgPyBbcGlsbE5vdGVdIDogW10pLAogICAgICBwaG9uZUZpZWxkKHsgcGxhY2Vob2xkZXI6ICJOdW3DqXJvIGRlIHTDqWzDqXBob25lIiwgdmFsdWU6IHBob25lRGlzcGxheSwgc3RhdGUgfSksCiAgICAgIGZpcnN0TmFtZUZpZWxkKHsgcGxhY2Vob2xkZXI6ICJQcsOpbm9tIiwgdmFsdWU6IGxpdmVDbGllbnQucHJlbm9tLCBzdGF0ZSB9KSwKICAgICAgLy8gTGl2cmFpc29uIGZpZWxkcyBtdXN0IGFwcGVhciBiZXR3ZWVuICJQcsOpbm9tIiBhbmQgIlByb2Jsw6htZSIKICAgICAgZGVsaXZlcnlGaWVsZHMsCiAgICAgIHRlbXBvcmFyeURlbGl2ZXJ5VG9nZ2xlLAogICAgICB0ZW1wb3JhcnlEZWxpdmVyeUZpZWxkcywKICAgICAgLy8gUHJvYmzDqG1lIG11c3QgYWx3YXlzIGJlIHRoZSBMQVNUIGZpZWxkIGRpc3BsYXllZAogICAgICBwcm9ibGVtZUZpZWxkLAogICAgICAvLyBTdG9wIFNNUyBzd2l0Y2ggbXVzdCBiZSBkaXJlY3RseSB1bmRlciAiUHJvYmzDqG1lIgogICAgICBzdG9wU21zUm93KHsgc3RhdGUsIGNhcmRSb290OiBudWxsIH0pLCAvLyBjYXJkUm9vdCBzZXQgcmlnaHQgYWZ0ZXIgY2FyZEVsIGV4aXN0cyAoc2VlIGJlbG93KQogICAgXSksCiAgXSk7CgogIC8vIE5vdyB0aGF0IGNhcmRFbCBleGlzdHMsIHdpcmUgU3RvcCBTTVMgcm93IHdpdGggYSByZWFsIGNhcmRSb290IGFuZCBzeW5jIGl0cyBpbml0aWFsIHN0YXRlLgogIHRyeXsKICAgIGNvbnN0IHBsYWNlaG9sZGVyUm93ID0gY2FyZEVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXJvbGU9InN0b3Atc21zLXN3aXRjaCJdJyk/LmNsb3Nlc3Q/LigiZGl2Iik7CiAgICBpZiAocGxhY2Vob2xkZXJSb3cpewogICAgICAvLyBuby1vcDogc3RydWN0dXJlIGFscmVhZHkgbW91bnRlZAogICAgfSBlbHNlIHsKICAgICAgLy8gRGVmZW5zaXZlOiBpZiBET00gc3RydWN0dXJlIGNoYW5nZWQsIGRvIG5vdGhpbmcuCiAgICB9CiAgfSBjYXRjaCAoZSkge30KCiAgLy8gUmVwbGFjZSB0aGUgcGxhY2Vob2xkZXIgc3RvcFNtc1JvdyAoY3JlYXRlZCB3aXRoIG51bGwgY2FyZFJvb3QpIHdpdGggYSBjb3JyZWN0bHkgYm91bmQgb25lLgogIHRyeXsKICAgIGNvbnN0IGJkID0gY2FyZEVsLnF1ZXJ5U2VsZWN0b3IoIi5jYXJkX19iZCIpOwogICAgaWYgKGJkKXsKICAgICAgY29uc3Qgbm9kZXMgPSBBcnJheS5mcm9tKGJkLmNoaWxkcmVuKTsKICAgICAgLy8gRmluZCB0aGUgZmlyc3QgLnN3aXRjaC1yb3cgdGhhdCBjb250YWlucyAiU3RvcCBTTVMiCiAgICAgIGxldCBpZHggPSAtMTsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKyl7CiAgICAgICAgY29uc3QgbiA9IG5vZGVzW2ldOwogICAgICAgIGlmICghbikgY29udGludWU7CiAgICAgICAgY29uc3QgdHh0ID0gU3RyaW5nKG4udGV4dENvbnRlbnQgPz8gIiIpOwogICAgICAgIGlmICh0eHQuaW5jbHVkZXMoIlN0b3AgU01TIikpIHsgaWR4ID0gaTsgYnJlYWs7IH0KICAgICAgfQogICAgICBpZiAoaWR4ID49IDApewogICAgICAgIGNvbnN0IHJlcGwgPSBzdG9wU21zUm93KHsgc3RhdGUsIGNhcmRSb290OiBjYXJkRWwgfSk7CiAgICAgICAgYmQucmVwbGFjZUNoaWxkKHJlcGwsIG5vZGVzW2lkeF0pOwogICAgICB9CiAgICB9CiAgfSBjYXRjaCAoZSkge30KCiAgLy8gRmluYWwgc3luYyBhZnRlciBjYXJkIGV4aXN0cyAoY292ZXJzIGNhc2VzIHdoZXJlIGluaXRpYWwgcmVuZGVyIGNyZWF0ZWQgbm9kZXMgYmVmb3JlIHdlIGNhbiBxdWVyeSAuY2FyZCkuCiAgdHJ5IHsgc2V0UHJvYmxlbWVBdHRlbnRpb24oY2FyZEVsLCBsaXZlQ2xpZW50Py5wcm9ibGVtZSA/PyAiIik7IH0gY2F0Y2ggKGUpIHt9CiAgdHJ5IHsgc2V0U3RvcFNtc1N3aXRjaChjYXJkRWwsIGdldFNtc1N3aXRjaFZpc3VhbFN0YXRlKGxpdmVDbGllbnQpKTsgfSBjYXRjaCAoZTIpIHt9CiAgdHJ5IHsgc3luY0RlbGl2ZXJ5VHJhdmVsQ2hlY2tVaSgiY2xpZW50Iik7IH0gY2F0Y2ggKGUzKSB7fQogIHRyeSB7IHN5bmNEZWxpdmVyeVRyYXZlbENoZWNrVWkoInRlbXBvcmFyeSIpOyB9IGNhdGNoIChlNCkge30KCiAgLy8gQ2xpY2sgb24gbG95YWx0eSBidXR0b24gKGhlYWRlcikgPT4gb3BlbiBlZGl0IG1vZGFsCiAgaWYgKHBpbGwpewogICAgdHJ5ewogICAgICBwaWxsLmNsYXNzTGlzdC5hZGQoImxveWFsdHktcGlsbC0tY2xpY2thYmxlIik7CiAgICAgIHBpbGwuc2V0QXR0cmlidXRlKCJyb2xlIiwgImJ1dHRvbiIpOwogICAgICBwaWxsLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCAiMCIpOwogICAgICBwaWxsLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUpID0+IHsKICAgICAgICB0cnkgeyBlPy5wcmV2ZW50RGVmYXVsdD8uKCk7IH0gY2F0Y2ggKGUyKSB7fQogICAgICAgIG9wZW5Mb3lhbHR5UG9pbnRzRWRpdG9yKGNhcmRFbCk7CiAgICAgIH0pOwogICAgICBwaWxsLmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCAoZSkgPT4gewogICAgICAgIGlmICghZSkgcmV0dXJuOwogICAgICAgIGlmIChlLmtleSA9PT0gIkVudGVyIiB8fCBlLmtleSA9PT0gIiAiKXsKICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIG9wZW5Mb3lhbHR5UG9pbnRzRWRpdG9yKGNhcmRFbCk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0gY2F0Y2ggKGUpIHt9CiAgfQogIHJldHVybiBjYXJkRWw7Cn0="
            }
        }
    ],
    "meta": {
        "summary": {
            "changed": 15,
            "created": 0,
            "deleted": 0,
            "errors": 0
        },
        "patch_sha1": "e5883ab0227855e4a6af1ed6a59b28f3c0001a9c",
        "created_files": [],
        "branching": {
            "auto_branch_created": false,
            "auto_branch_id": null,
            "source_branch_id": "main",
            "base_event_id": null
        },
        "transition_store": {
            "dir": "event-assets/event_66151d81c952b430",
            "manifest": "event-assets/event_66151d81c952b430/manifest.json",
            "files_count": 15
        }
    },
    "impacted_paths": [
        "caisse-aqp/public/api/_lib/clientUpsert.php",
        "caisse-aqp/public/api/_lib/deliveryCityChoices.php",
        "caisse-aqp/public/api/_lib/tempAddress.php",
        "caisse-aqp/public/api/saveOrder.php",
        "caisse-aqp/public/api/updateOrder.php",
        "caisse-aqp/public/assets/js/app-js/address/deliveryCityChoices.js",
        "caisse-aqp/public/assets/js/app-js/address/deliveryCityStateSync.js",
        "caisse-aqp/public/assets/js/app-js/bindings/saveOrderValidation.js",
        "caisse-aqp/public/assets/js/app-js/loaders/ordersLoader.js",
        "caisse-aqp/public/assets/js/app-js/orderMode/orderModeToggles.js",
        "caisse-aqp/public/assets/js/app-js/state/client.js",
        "caisse-aqp/public/assets/js/services/api/saveOrderApi.js",
        "caisse-aqp/public/assets/js/services/api/updateOrderApi.js",
        "caisse-aqp/public/assets/js/services/payloads/orderAddressPayloadNormalizer.js",
        "caisse-aqp/public/assets/js/ui/components/clientCard.js"
    ],
    "force_snapshot": true,
    "snapshot_id": "snapshot_5c71b923c03b"
}