diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index 96d48c9..9fb4a49 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -1993,7 +1993,7 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) #ifdef WIN32 // Adding win-registry, since it is very useful for windows... Refer to /modules/win-registry.js to see a human readable version - duk_peval_string_noresult(ctx, "addModule('win-registry', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciBLRVlfUVVFUllfVkFMVUUgPSAweDAwMDE7CnZhciBLRVlfRU5VTUVSQVRFX1NVQl9LRVlTID0gMHgwMDA4Owp2YXIgS0VZX1dSSVRFID0gMHgyMDAwNjsKCnZhciBLRVlfREFUQV9UWVBFUyA9CiAgICB7CiAgICAgICAgUkVHX05PTkU6IDAsCiAgICAgICAgUkVHX1NaOiAxLAogICAgICAgIFJFR19FWFBBTkRfU1o6IDIsCiAgICAgICAgUkVHX0JJTkFSWTogMywKICAgICAgICBSRUdfRFdPUkQ6IDQsCiAgICAgICAgUkVHX0RXT1JEX0JJR19FTkRJQU46IDUsCiAgICAgICAgUkVHX0xJTks6IDYsCiAgICAgICAgUkVHX01VTFRJX1NaOiA3LAogICAgICAgIFJFR19SRVNPVVJDRV9MSVNUOiA4LAogICAgICAgIFJFR19GVUxMX1JFU09VUkNFX0RFU0NSSVBUT1I6IDksCiAgICAgICAgUkVHX1JFU09VUkNFX1JFUVVJUkVNRU5UU19MSVNUOiAxMCwKICAgICAgICBSRUdfUVdPUkQ6IDExCiAgICB9OwoKZnVuY3Rpb24gd2luZG93c19yZWdpc3RyeSgpCnsKICAgIHRoaXMuX09iamVjdElkID0gJ3dpbi1yZWdpc3RyeSc7CiAgICB0aGlzLl9tYXJzaGFsID0gcmVxdWlyZSgnX0dlbmVyaWNNYXJzaGFsJyk7CiAgICB0aGlzLl9BZHZBcGkgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZU5hdGl2ZVByb3h5KCdBZHZhcGkzMi5kbGwnKTsKICAgIHRoaXMuX0FkdkFwaS5DcmVhdGVNZXRob2QoJ1JlZ0NyZWF0ZUtleUV4VycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnRW51bUtleUV4VycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnRW51bVZhbHVlVycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnT3BlbktleUV4VycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnUXVlcnlJbmZvS2V5VycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnUXVlcnlWYWx1ZUV4VycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnQ2xvc2VLZXknKTsKICAgIHRoaXMuX0FkdkFwaS5DcmVhdGVNZXRob2QoJ1JlZ0RlbGV0ZUtleVcnKTsKICAgIHRoaXMuX0FkdkFwaS5DcmVhdGVNZXRob2QoJ1JlZ0RlbGV0ZVZhbHVlVycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnU2V0VmFsdWVFeFcnKTsKICAgIHRoaXMuSEtFWSA9IHsgUm9vdDogQnVmZmVyLmZyb20oJzgwMDAwMDAwJywgJ2hleCcpLnN3YXAzMigpLCBDdXJyZW50VXNlcjogQnVmZmVyLmZyb20oJzgwMDAwMDAxJywgJ2hleCcpLnN3YXAzMigpLCBMb2NhbE1hY2hpbmU6IEJ1ZmZlci5mcm9tKCc4MDAwMDAwMicsICdoZXgnKS5zd2FwMzIoKSwgVXNlcnM6IEJ1ZmZlci5mcm9tKCc4MDAwMDAwMycsICdoZXgnKS5zd2FwMzIoKSB9OwoKICAgIHRoaXMuUXVlcnlLZXkgPSBmdW5jdGlvbiBRdWVyeUtleShoa2V5LCBwYXRoLCBrZXkpCiAgICB7CiAgICAgICAgdmFyIGVycjsKICAgICAgICB2YXIgaCA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlUG9pbnRlcigpOwogICAgICAgIHZhciBsZW4gPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOwogICAgICAgIHZhciB2YWxUeXBlID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsKICAgICAgICB2YXIgSEsgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVBvaW50ZXIoaGtleSk7CiAgICAgICAgdmFyIHJldFZhbCA9IG51bGw7CiAgICAgICAgaWYgKGtleSkgeyBrZXkgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKGtleSwgeyB3aWRlOiB0cnVlIH0pOyB9CiAgICAgICAgaWYgKCFwYXRoKSB7IHBhdGggPSAnJzsgfQoKCiAgICAgICAgaWYgKChlcnIgPSB0aGlzLl9BZHZBcGkuUmVnT3BlbktleUV4VyhISywgdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZShwYXRoLCB7IHdpZGU6IHRydWUgfSksIDAsIEtFWV9RVUVSWV9WQUxVRSB8IEtFWV9FTlVNRVJBVEVfU1VCX0tFWVMsIGgpLlZhbCkgIT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHRocm93ICgnT3BlbmluZyBSZWdpc3RyeSBLZXk6ICcgKyBwYXRoICsgJyA9PiBSZXR1cm5lZCBFcnJvcjogJyArIGVycik7CiAgICAgICAgfQogIAoKICAgICAgICBpZiAodGhpcy5fQWR2QXBpLlJlZ1F1ZXJ5VmFsdWVFeFcoaC5EZXJlZigpLCBrZXkgPyBrZXkgOiAwLCAwLCAwLCAwLCBsZW4pLlZhbCA9PSAwKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgZGF0YSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUobGVuLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkpOwogICAgICAgICAgICBpZiAodGhpcy5fQWR2QXBpLlJlZ1F1ZXJ5VmFsdWVFeFcoaC5EZXJlZigpLCBrZXkgPyBrZXkgOiAwLCAwLCB2YWxUeXBlLCBkYXRhLCBsZW4pLlZhbCA9PSAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsVHlwZS50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVlfREFUQV9UWVBFUy5SRUdfRFdPUkQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGRhdGEudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVlfREFUQV9UWVBFUy5SRUdfRFdPUkRfQklHX0VORElBTjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZGF0YS50b0J1ZmZlcigpLnJlYWRVSW50MzJCRSgpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIEtFWV9EQVRBX1RZUEVTLlJFR19TWjoKICAgICAgICAgICAgICAgICAgICBjYXNlIEtFWV9EQVRBX1RZUEVTLlJFR19FWFBBTkRfU1o6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGRhdGEuV2lkZTJVVEY4OwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIEtFWV9EQVRBX1RZUEVTLlJFR19CSU5BUlk6CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZGF0YS50b0J1ZmZlcigpOwogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuX2RhdGEgPSBkYXRhOwogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuX3R5cGUgPSB2YWxUeXBlLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKGtleSkgICAgLy8gT25seSB0aHJvdyBhbiBleGNlcHRpb24gaWYgYW4gZXhwbGljaXQga2V5IHdhcyBzcGVjaWZpZWQsIGJlY3Vhc2UgaXQgd2Fzbid0IGZvdW5kLiBPdGhlcndpc2UsIGFsbCB3ZSBrbm93IGlzIHRoYXQgYSBkZWZhdWx0IHZhbHVlIHdhc24ndCBzZXQNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aGlzLl9BZHZBcGkuUmVnQ2xvc2VLZXkoaC5EZXJlZigpKTsKICAgICAgICAgICAgICAgIHRocm93ICgnTm90IEZvdW5kJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0KCgoKICAgICAgICBpZiAoKHBhdGggPT0gJycgJiYgIWtleSkgfHwgIWtleSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSB7IHN1YmtleXM6IFtdLCB2YWx1ZXM6IFtdLCBkZWZhdWx0OiByZXRWYWwgfTsKICAgICAgICAgICAgaWYgKCFrZXkgJiYgIXJldFZhbCkgeyBkZWxldGUgcmVzdWx0LmRlZmF1bHQ7IH0KCiAgICAgICAgICAgIC8vIEVudW1lcmF0ZSAga2V5cwogICAgICAgICAgICB2YXIgYWNoQ2xhc3MgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDEwMjQpOwogICAgICAgICAgICB2YXIgYWNoS2V5ID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSgxMDI0KTsKICAgICAgICAgICAgdmFyIGFjaFZhbHVlID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSgzMjc2OCk7CiAgICAgICAgICAgIHZhciBhY2hWYWx1ZVNpemUgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOwogICAgICAgICAgICB2YXIgbmFtZVNpemUgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOyAKICAgICAgICAgICAgdmFyIGFjaENsYXNzU2l6ZSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7IGFjaENsYXNzU2l6ZS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoMTAyNCk7CiAgICAgICAgICAgIHZhciBudW1TdWJLZXlzID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsKICAgICAgICAgICAgdmFyIG51bVZhbHVlcyA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7CiAgICAgICAgICAgIHZhciBsb25nZXN0U3Via2V5U2l6ZSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7CiAgICAgICAgICAgIHZhciBsb25nZXN0Q2xhc3NTdHJpbmcgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOwogICAgICAgICAgICB2YXIgbG9uZ2VzdFZhbHVlTmFtZSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7CiAgICAgICAgICAgIHZhciBsb25nZXN0VmFsdWVEYXRhID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsKICAgICAgICAgICAgdmFyIHNlY3VyaXR5RGVzY3JpcHRvciA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7CiAgICAgICAgICAgIHZhciBsYXN0V3JpdGVUaW1lID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg4KTsKCiAgICAgICAgICAgIHJldFZhbCA9IHRoaXMuX0FkdkFwaS5SZWdRdWVyeUluZm9LZXlXKGguRGVyZWYoKSwgYWNoQ2xhc3MsIGFjaENsYXNzU2l6ZSwgMCwKICAgICAgICAgICAgICAgIG51bVN1YktleXMsIGxvbmdlc3RTdWJrZXlTaXplLCBsb25nZXN0Q2xhc3NTdHJpbmcsIG51bVZhbHVlcywKICAgICAgICAgICAgICAgIGxvbmdlc3RWYWx1ZU5hbWUsIGxvbmdlc3RWYWx1ZURhdGEsIHNlY3VyaXR5RGVzY3JpcHRvciwgbGFzdFdyaXRlVGltZSk7CiAgICAgICAgICAgIGlmIChyZXRWYWwuVmFsICE9IDApIHsgdGhyb3cgKCdSZWdRdWVyeUluZm9LZXlXKCkgcmV0dXJuZWQgZXJyb3I6ICcgKyByZXRWYWwuVmFsKTsgfQogICAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgbnVtU3ViS2V5cy50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpOyArK2kpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG5hbWVTaXplLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSgxMDI0KTsKICAgICAgICAgICAgICAgIHJldFZhbCA9IHRoaXMuX0FkdkFwaS5SZWdFbnVtS2V5RXhXKGguRGVyZWYoKSwgaSwgYWNoS2V5LCBuYW1lU2l6ZSwgMCwgMCwgMCwgbGFzdFdyaXRlVGltZSk7CiAgICAgICAgICAgICAgICBpZihyZXRWYWwuVmFsID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN1YmtleXMucHVzaChhY2hLZXkuV2lkZTJVVEY4KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bVZhbHVlcy50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpIDsgKytpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBhY2hWYWx1ZVNpemUudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKDMyNzY4KTsKICAgICAgICAgICAgICAgIGlmKHRoaXMuX0FkdkFwaS5SZWdFbnVtVmFsdWVXKGguRGVyZWYoKSwgaSwgYWNoVmFsdWUsIGFjaFZhbHVlU2l6ZSwgMCwgMCwgMCwgMCkuVmFsID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnZhbHVlcy5wdXNoKGFjaFZhbHVlLldpZGUyVVRGOCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIChyZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5fQWR2QXBpLlJlZ0Nsb3NlS2V5KGguRGVyZWYoKSk7CiAgICAgICAgcmV0dXJuIChyZXRWYWwpOwogICAgfTsKICAgIHRoaXMuV3JpdGVLZXkgPSBmdW5jdGlvbiBXcml0ZUtleShoa2V5LCBwYXRoLCBrZXksIHZhbHVlKQogICAgewogICAgICAgIHZhciByZXN1bHQ7CiAgICAgICAgdmFyIGggPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVBvaW50ZXIoKTsKCiAgICAgICAgaWYgKHRoaXMuX0FkdkFwaS5SZWdDcmVhdGVLZXlFeFcodGhpcy5fbWFyc2hhbC5DcmVhdGVQb2ludGVyKGhrZXkpLCB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKHBhdGgsIHsgd2lkZTogdHJ1ZSB9KSwgMCwgMCwgMCwgS0VZX1dSSVRFLCAwLCBoLCAwKS5WYWwgIT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHRocm93ICgnRXJyb3IgT3BlbmluZyBSZWdpc3RyeSBLZXk6ICcgKyBwYXRoKTsKICAgICAgICB9CgogICAgICAgIHZhciBkYXRhOwogICAgICAgIHZhciBkYXRhVHlwZTsKCiAgICAgICAgc3dpdGNoKHR5cGVvZih2YWx1ZSkpCiAgICAgICAgewogICAgICAgICAgICBjYXNlICdib29sZWFuJzoKICAgICAgICAgICAgICAgIGRhdGFUeXBlID0gS0VZX0RBVEFfVFlQRVMuUkVHX0RXT1JEOwogICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7CiAgICAgICAgICAgICAgICBkYXRhLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSh2YWx1ZSA/IDEgOiAwKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdudW1iZXInOgogICAgICAgICAgICAgICAgZGF0YVR5cGUgPSBLRVlfREFUQV9UWVBFUy5SRUdfRFdPUkQ7CiAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsKICAgICAgICAgICAgICAgIGRhdGEudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKHZhbHVlKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzdHJpbmcnOgogICAgICAgICAgICAgICAgZGF0YVR5cGUgPSBLRVlfREFUQV9UWVBFUy5SRUdfU1o7CiAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSh2YWx1ZSwgeyB3aWRlOiB0cnVlIH0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBkYXRhVHlwZSA9IEtFWV9EQVRBX1RZUEVTLlJFR19CSU5BUlk7CiAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSh2YWx1ZS5sZW5ndGgpOwogICAgICAgICAgICAgICAgdmFsdWUuY29weShkYXRhLnRvQnVmZmVyKCkpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBpZiAodGhpcy5fQWR2QXBpLlJlZ1NldFZhbHVlRXhXKGguRGVyZWYoKSwga2V5P3RoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoa2V5LCB7IHdpZGU6IHRydWUgfSk6MCwgMCwgZGF0YVR5cGUsIGRhdGEsIGRhdGEuX3NpemUpLlZhbCAhPSAwKQogICAgICAgIHsgICAgICAgICAgIAogICAgICAgICAgICB0aGlzLl9BZHZBcGkuUmVnQ2xvc2VLZXkoaC5EZXJlZigpKTsKICAgICAgICAgICAgdGhyb3cgKCdFcnJvciB3cml0aW5nIHJlZyBrZXk6ICcgKyBrZXkpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9BZHZBcGkuUmVnQ2xvc2VLZXkoaC5EZXJlZigpKTsKICAgIH07CiAgICB0aGlzLkRlbGV0ZUtleSA9IGZ1bmN0aW9uIERlbGV0ZUtleShoa2V5LCBwYXRoLCBrZXkpCiAgICB7CiAgICAgICAgaWYoIWtleSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLl9BZHZBcGkuUmVnRGVsZXRlS2V5Vyh0aGlzLl9tYXJzaGFsLkNyZWF0ZVBvaW50ZXIoaGtleSksIHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUocGF0aCwgeyB3aWRlOiB0cnVlIH0pKS5WYWwgIT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhyb3cgKCdFcnJvciBEZWxldGluZyBLZXk6ICcgKyBwYXRoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICB2YXIgaCA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlUG9pbnRlcigpOwogICAgICAgICAgICB2YXIgcmVzdWx0OwogICAgICAgICAgICBpZiAodGhpcy5fQWR2QXBpLlJlZ09wZW5LZXlFeFcodGhpcy5fbWFyc2hhbC5DcmVhdGVQb2ludGVyKGhrZXkpLCB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKHBhdGgsIHsgd2lkZTogdHJ1ZSB9KSwgMCwgS0VZX1FVRVJZX1ZBTFVFIHwgS0VZX1dSSVRFLCBoKS5WYWwgIT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhyb3cgKCdFcnJvciBPcGVuaW5nIFJlZ2lzdHJ5IEtleTogJyArIHBhdGgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgocmVzdWx0ID0gdGhpcy5fQWR2QXBpLlJlZ0RlbGV0ZVZhbHVlVyhoLkRlcmVmKCksIHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoa2V5LCB7IHdpZGU6IHRydWUgfSkpLlZhbCkgIT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5fQWR2QXBpLlJlZ0Nsb3NlS2V5KGguRGVyZWYoKSk7CiAgICAgICAgICAgICAgICB0aHJvdyAoJ0Vycm9yWycgKyByZXN1bHQgKyAnXSBEZWxldGluZyBLZXk6ICcgKyBwYXRoICsgJy4nICsga2V5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9BZHZBcGkuUmVnQ2xvc2VLZXkoaC5EZXJlZigpKTsKICAgICAgICB9CiAgICB9Owp9Cgptb2R1bGUuZXhwb3J0cyA9IG5ldyB3aW5kb3dzX3JlZ2lzdHJ5KCk7Cgo=', 'base64').toString());"); + duk_peval_string_noresult(ctx, "addModule('win-registry', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciBLRVlfUVVFUllfVkFMVUUgPSAweDAwMDE7CnZhciBLRVlfRU5VTUVSQVRFX1NVQl9LRVlTID0gMHgwMDA4Owp2YXIgS0VZX1dSSVRFID0gMHgyMDAwNjsKCnZhciBLRVlfREFUQV9UWVBFUyA9CiAgICB7CiAgICAgICAgUkVHX05PTkU6IDAsCiAgICAgICAgUkVHX1NaOiAxLAogICAgICAgIFJFR19FWFBBTkRfU1o6IDIsCiAgICAgICAgUkVHX0JJTkFSWTogMywKICAgICAgICBSRUdfRFdPUkQ6IDQsCiAgICAgICAgUkVHX0RXT1JEX0JJR19FTkRJQU46IDUsCiAgICAgICAgUkVHX0xJTks6IDYsCiAgICAgICAgUkVHX01VTFRJX1NaOiA3LAogICAgICAgIFJFR19SRVNPVVJDRV9MSVNUOiA4LAogICAgICAgIFJFR19GVUxMX1JFU09VUkNFX0RFU0NSSVBUT1I6IDksCiAgICAgICAgUkVHX1JFU09VUkNFX1JFUVVJUkVNRU5UU19MSVNUOiAxMCwKICAgICAgICBSRUdfUVdPUkQ6IDExCiAgICB9OwoKZnVuY3Rpb24gd2luZG93c19yZWdpc3RyeSgpCnsKICAgIHRoaXMuX09iamVjdElkID0gJ3dpbi1yZWdpc3RyeSc7CiAgICB0aGlzLl9tYXJzaGFsID0gcmVxdWlyZSgnX0dlbmVyaWNNYXJzaGFsJyk7CiAgICB0aGlzLl9BZHZBcGkgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZU5hdGl2ZVByb3h5KCdBZHZhcGkzMi5kbGwnKTsKICAgIHRoaXMuX0FkdkFwaS5DcmVhdGVNZXRob2QoJ1JlZ0NyZWF0ZUtleUV4VycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnRW51bUtleUV4VycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnRW51bVZhbHVlVycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnT3BlbktleUV4VycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnUXVlcnlJbmZvS2V5VycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnUXVlcnlWYWx1ZUV4VycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnQ2xvc2VLZXknKTsKICAgIHRoaXMuX0FkdkFwaS5DcmVhdGVNZXRob2QoJ1JlZ0RlbGV0ZUtleVcnKTsKICAgIHRoaXMuX0FkdkFwaS5DcmVhdGVNZXRob2QoJ1JlZ0RlbGV0ZVZhbHVlVycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnU2V0VmFsdWVFeFcnKTsKICAgIHRoaXMuSEtFWSA9IHsgUm9vdDogQnVmZmVyLmZyb20oJzgwMDAwMDAwJywgJ2hleCcpLnN3YXAzMigpLCBDdXJyZW50VXNlcjogQnVmZmVyLmZyb20oJzgwMDAwMDAxJywgJ2hleCcpLnN3YXAzMigpLCBMb2NhbE1hY2hpbmU6IEJ1ZmZlci5mcm9tKCc4MDAwMDAwMicsICdoZXgnKS5zd2FwMzIoKSwgVXNlcnM6IEJ1ZmZlci5mcm9tKCc4MDAwMDAwMycsICdoZXgnKS5zd2FwMzIoKSB9OwoKICAgIHRoaXMuUXVlcnlLZXkgPSBmdW5jdGlvbiBRdWVyeUtleShoa2V5LCBwYXRoLCBrZXkpCiAgICB7CiAgICAgICAgdmFyIGVycjsKICAgICAgICB2YXIgaCA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlUG9pbnRlcigpOwogICAgICAgIHZhciBsZW4gPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOwogICAgICAgIHZhciB2YWxUeXBlID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsKICAgICAgICB2YXIgSEsgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVBvaW50ZXIoaGtleSk7CiAgICAgICAgdmFyIHJldFZhbCA9IG51bGw7CiAgICAgICAgaWYgKGtleSkgeyBrZXkgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKGtleSwgeyB3aWRlOiB0cnVlIH0pOyB9CiAgICAgICAgaWYgKCFwYXRoKSB7IHBhdGggPSAnJzsgfQoKCiAgICAgICAgaWYgKChlcnIgPSB0aGlzLl9BZHZBcGkuUmVnT3BlbktleUV4VyhISywgdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZShwYXRoLCB7IHdpZGU6IHRydWUgfSksIDAsIEtFWV9RVUVSWV9WQUxVRSB8IEtFWV9FTlVNRVJBVEVfU1VCX0tFWVMsIGgpLlZhbCkgIT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHRocm93ICgnT3BlbmluZyBSZWdpc3RyeSBLZXk6ICcgKyBwYXRoICsgJyA9PiBSZXR1cm5lZCBFcnJvcjogJyArIGVycik7CiAgICAgICAgfQogIAoKICAgICAgICBpZiAodGhpcy5fQWR2QXBpLlJlZ1F1ZXJ5VmFsdWVFeFcoaC5EZXJlZigpLCBrZXkgPyBrZXkgOiAwLCAwLCAwLCAwLCBsZW4pLlZhbCA9PSAwKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgZGF0YSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUobGVuLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkpOwogICAgICAgICAgICBpZiAodGhpcy5fQWR2QXBpLlJlZ1F1ZXJ5VmFsdWVFeFcoaC5EZXJlZigpLCBrZXkgPyBrZXkgOiAwLCAwLCB2YWxUeXBlLCBkYXRhLCBsZW4pLlZhbCA9PSAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsVHlwZS50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVlfREFUQV9UWVBFUy5SRUdfRFdPUkQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGRhdGEudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVlfREFUQV9UWVBFUy5SRUdfRFdPUkRfQklHX0VORElBTjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZGF0YS50b0J1ZmZlcigpLnJlYWRVSW50MzJCRSgpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIEtFWV9EQVRBX1RZUEVTLlJFR19TWjoKICAgICAgICAgICAgICAgICAgICBjYXNlIEtFWV9EQVRBX1RZUEVTLlJFR19FWFBBTkRfU1o6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGRhdGEuV2lkZTJVVEY4OwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIEtFWV9EQVRBX1RZUEVTLlJFR19CSU5BUlk6CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZGF0YS50b0J1ZmZlcigpOwogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuX2RhdGEgPSBkYXRhOwogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuX3R5cGUgPSB2YWxUeXBlLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKGtleSkgICAgLy8gT25seSB0aHJvdyBhbiBleGNlcHRpb24gaWYgYW4gZXhwbGljaXQga2V5IHdhcyBzcGVjaWZpZWQsIGJlY3Vhc2UgaXQgd2Fzbid0IGZvdW5kLiBPdGhlcndpc2UsIGFsbCB3ZSBrbm93IGlzIHRoYXQgYSBkZWZhdWx0IHZhbHVlIHdhc24ndCBzZXQNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aGlzLl9BZHZBcGkuUmVnQ2xvc2VLZXkoaC5EZXJlZigpKTsKICAgICAgICAgICAgICAgIHRocm93ICgnTm90IEZvdW5kJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0KCgoKICAgICAgICBpZiAoKHBhdGggPT0gJycgJiYgIWtleSkgfHwgIWtleSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSB7IHN1YmtleXM6IFtdLCB2YWx1ZXM6IFtdLCBkZWZhdWx0OiByZXRWYWwgfTsKICAgICAgICAgICAgaWYgKCFrZXkgJiYgIXJldFZhbCkgeyBkZWxldGUgcmVzdWx0LmRlZmF1bHQ7IH0KCiAgICAgICAgICAgIC8vIEVudW1lcmF0ZSAga2V5cwogICAgICAgICAgICB2YXIgYWNoQ2xhc3MgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDEwMjQpOwogICAgICAgICAgICB2YXIgYWNoS2V5ID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSgxMDI0KTsKICAgICAgICAgICAgdmFyIGFjaFZhbHVlID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSgzMjc2OCk7CiAgICAgICAgICAgIHZhciBhY2hWYWx1ZVNpemUgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOwogICAgICAgICAgICB2YXIgbmFtZVNpemUgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOyAKICAgICAgICAgICAgdmFyIGFjaENsYXNzU2l6ZSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7IGFjaENsYXNzU2l6ZS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoMTAyNCk7CiAgICAgICAgICAgIHZhciBudW1TdWJLZXlzID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsKICAgICAgICAgICAgdmFyIG51bVZhbHVlcyA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7CiAgICAgICAgICAgIHZhciBsb25nZXN0U3Via2V5U2l6ZSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7CiAgICAgICAgICAgIHZhciBsb25nZXN0Q2xhc3NTdHJpbmcgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOwogICAgICAgICAgICB2YXIgbG9uZ2VzdFZhbHVlTmFtZSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7CiAgICAgICAgICAgIHZhciBsb25nZXN0VmFsdWVEYXRhID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsKICAgICAgICAgICAgdmFyIHNlY3VyaXR5RGVzY3JpcHRvciA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7CiAgICAgICAgICAgIHZhciBsYXN0V3JpdGVUaW1lID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg4KTsKCiAgICAgICAgICAgIHJldFZhbCA9IHRoaXMuX0FkdkFwaS5SZWdRdWVyeUluZm9LZXlXKGguRGVyZWYoKSwgYWNoQ2xhc3MsIGFjaENsYXNzU2l6ZSwgMCwKICAgICAgICAgICAgICAgIG51bVN1YktleXMsIGxvbmdlc3RTdWJrZXlTaXplLCBsb25nZXN0Q2xhc3NTdHJpbmcsIG51bVZhbHVlcywKICAgICAgICAgICAgICAgIGxvbmdlc3RWYWx1ZU5hbWUsIGxvbmdlc3RWYWx1ZURhdGEsIHNlY3VyaXR5RGVzY3JpcHRvciwgbGFzdFdyaXRlVGltZSk7CiAgICAgICAgICAgIGlmIChyZXRWYWwuVmFsICE9IDApIHsgdGhyb3cgKCdSZWdRdWVyeUluZm9LZXlXKCkgcmV0dXJuZWQgZXJyb3I6ICcgKyByZXRWYWwuVmFsKTsgfQogICAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgbnVtU3ViS2V5cy50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpOyArK2kpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG5hbWVTaXplLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSgxMDI0KTsKICAgICAgICAgICAgICAgIHJldFZhbCA9IHRoaXMuX0FkdkFwaS5SZWdFbnVtS2V5RXhXKGguRGVyZWYoKSwgaSwgYWNoS2V5LCBuYW1lU2l6ZSwgMCwgMCwgMCwgbGFzdFdyaXRlVGltZSk7CiAgICAgICAgICAgICAgICBpZihyZXRWYWwuVmFsID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN1YmtleXMucHVzaChhY2hLZXkuV2lkZTJVVEY4KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bVZhbHVlcy50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpIDsgKytpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBhY2hWYWx1ZVNpemUudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKDMyNzY4KTsKICAgICAgICAgICAgICAgIGlmKHRoaXMuX0FkdkFwaS5SZWdFbnVtVmFsdWVXKGguRGVyZWYoKSwgaSwgYWNoVmFsdWUsIGFjaFZhbHVlU2l6ZSwgMCwgMCwgMCwgMCkuVmFsID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnZhbHVlcy5wdXNoKGFjaFZhbHVlLldpZGUyVVRGOCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIChyZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5fQWR2QXBpLlJlZ0Nsb3NlS2V5KGguRGVyZWYoKSk7CiAgICAgICAgcmV0dXJuIChyZXRWYWwpOwogICAgfTsKICAgIHRoaXMuV3JpdGVLZXkgPSBmdW5jdGlvbiBXcml0ZUtleShoa2V5LCBwYXRoLCBrZXksIHZhbHVlKQogICAgewogICAgICAgIHZhciByZXN1bHQ7CiAgICAgICAgdmFyIGggPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVBvaW50ZXIoKTsKCiAgICAgICAgaWYgKHRoaXMuX0FkdkFwaS5SZWdDcmVhdGVLZXlFeFcodGhpcy5fbWFyc2hhbC5DcmVhdGVQb2ludGVyKGhrZXkpLCB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKHBhdGgsIHsgd2lkZTogdHJ1ZSB9KSwgMCwgMCwgMCwgS0VZX1dSSVRFLCAwLCBoLCAwKS5WYWwgIT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHRocm93ICgnRXJyb3IgT3BlbmluZyBSZWdpc3RyeSBLZXk6ICcgKyBwYXRoKTsKICAgICAgICB9CgogICAgICAgIHZhciBkYXRhOwogICAgICAgIHZhciBkYXRhVHlwZTsKCiAgICAgICAgc3dpdGNoKHR5cGVvZih2YWx1ZSkpCiAgICAgICAgewogICAgICAgICAgICBjYXNlICdib29sZWFuJzoKICAgICAgICAgICAgICAgIGRhdGFUeXBlID0gS0VZX0RBVEFfVFlQRVMuUkVHX0RXT1JEOwogICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7CiAgICAgICAgICAgICAgICBkYXRhLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSh2YWx1ZSA/IDEgOiAwKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdudW1iZXInOgogICAgICAgICAgICAgICAgZGF0YVR5cGUgPSBLRVlfREFUQV9UWVBFUy5SRUdfRFdPUkQ7CiAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsKICAgICAgICAgICAgICAgIGRhdGEudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKHZhbHVlKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzdHJpbmcnOgogICAgICAgICAgICAgICAgZGF0YVR5cGUgPSBLRVlfREFUQV9UWVBFUy5SRUdfU1o7CiAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSh2YWx1ZSwgeyB3aWRlOiB0cnVlIH0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBkYXRhVHlwZSA9IEtFWV9EQVRBX1RZUEVTLlJFR19CSU5BUlk7CiAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSh2YWx1ZS5sZW5ndGgpOwogICAgICAgICAgICAgICAgdmFsdWUuY29weShkYXRhLnRvQnVmZmVyKCkpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBpZiAodGhpcy5fQWR2QXBpLlJlZ1NldFZhbHVlRXhXKGguRGVyZWYoKSwga2V5P3RoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoa2V5LCB7IHdpZGU6IHRydWUgfSk6MCwgMCwgZGF0YVR5cGUsIGRhdGEsIGRhdGEuX3NpemUpLlZhbCAhPSAwKQogICAgICAgIHsgICAgICAgICAgIAogICAgICAgICAgICB0aGlzLl9BZHZBcGkuUmVnQ2xvc2VLZXkoaC5EZXJlZigpKTsKICAgICAgICAgICAgdGhyb3cgKCdFcnJvciB3cml0aW5nIHJlZyBrZXk6ICcgKyBrZXkpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9BZHZBcGkuUmVnQ2xvc2VLZXkoaC5EZXJlZigpKTsKICAgIH07CiAgICB0aGlzLkRlbGV0ZUtleSA9IGZ1bmN0aW9uIERlbGV0ZUtleShoa2V5LCBwYXRoLCBrZXkpCiAgICB7CiAgICAgICAgaWYoIWtleSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLl9BZHZBcGkuUmVnRGVsZXRlS2V5Vyh0aGlzLl9tYXJzaGFsLkNyZWF0ZVBvaW50ZXIoaGtleSksIHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUocGF0aCwgeyB3aWRlOiB0cnVlIH0pKS5WYWwgIT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhyb3cgKCdFcnJvciBEZWxldGluZyBLZXk6ICcgKyBwYXRoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICB2YXIgaCA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlUG9pbnRlcigpOwogICAgICAgICAgICB2YXIgcmVzdWx0OwogICAgICAgICAgICBpZiAodGhpcy5fQWR2QXBpLlJlZ09wZW5LZXlFeFcodGhpcy5fbWFyc2hhbC5DcmVhdGVQb2ludGVyKGhrZXkpLCB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKHBhdGgsIHsgd2lkZTogdHJ1ZSB9KSwgMCwgS0VZX1FVRVJZX1ZBTFVFIHwgS0VZX1dSSVRFLCBoKS5WYWwgIT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhyb3cgKCdFcnJvciBPcGVuaW5nIFJlZ2lzdHJ5IEtleTogJyArIHBhdGgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgocmVzdWx0ID0gdGhpcy5fQWR2QXBpLlJlZ0RlbGV0ZVZhbHVlVyhoLkRlcmVmKCksIHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoa2V5LCB7IHdpZGU6IHRydWUgfSkpLlZhbCkgIT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5fQWR2QXBpLlJlZ0Nsb3NlS2V5KGguRGVyZWYoKSk7CiAgICAgICAgICAgICAgICB0aHJvdyAoJ0Vycm9yWycgKyByZXN1bHQgKyAnXSBEZWxldGluZyBLZXk6ICcgKyBwYXRoICsgJy4nICsga2V5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9BZHZBcGkuUmVnQ2xvc2VLZXkoaC5EZXJlZigpKTsKICAgICAgICB9CiAgICB9OwogICAgdGhpcy51c2VybmFtZVRvVXNlcktleSA9IGZ1bmN0aW9uIHVzZXJuYW1lVG9Vc2VyS2V5KHVzZXIpDQogICAgew0KICAgICAgICB2YXIgc2lkID0gdXNlcjsNCiAgICAgICAgaWYgKHR5cGVvZiAodXNlcikgPT0gJ3N0cmluZycpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciByID0gdGhpcy5RdWVyeUtleSh0aGlzLkhLRVkuTG9jYWxNYWNoaW5lLCAnU0FNXFxTQU1cXERvbWFpbnNcXEFjY291bnRcXFVzZXJzXFxOYW1lc1xcJyArIHVzZXIpOw0KICAgICAgICAgICAgc2lkID0gci5kZWZhdWx0Ll90eXBlOw0KICAgICAgICB9DQogICAgICAgIHZhciB1ID0gdGhpcy5RdWVyeUtleSh0aGlzLkhLRVkuVXNlcnMpOw0KICAgICAgICBmb3IoaSBpbiB1LnN1YmtleXMpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmKHUuc3Via2V5c1tpXS5lbmRzV2l0aCgnLScgKyBzaWQpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHJldHVybiAodS5zdWJrZXlzW2ldKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICB0aHJvdyAodXNlciArICc6IE5vdCBGb3VuZCcpOw0KICAgIH07Cn0KCm1vZHVsZS5leHBvcnRzID0gbmV3IHdpbmRvd3NfcmVnaXN0cnkoKTsKCv==', 'base64').toString());"); // Adding PE_Parser, since it is very userful for windows.. Refer to /modules/PE_Parser.js to see a human readable version duk_peval_string_noresult(ctx, "addModule('PE_Parser', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCi8vIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGV4ZWN1dGFibGUKZnVuY3Rpb24gcGFyc2UoZXhlUGF0aCkKewogICAgdmFyIHJldFZhbCA9IHt9OwogICAgdmFyIGZzID0gcmVxdWlyZSgnZnMnKTsKICAgIHZhciBmZCA9IGZzLm9wZW5TeW5jKGV4ZVBhdGgsICdyYicpOwogICAgdmFyIGJ5dGVzUmVhZDsKICAgIHZhciBkb3NIZWFkZXIgPSBCdWZmZXIuYWxsb2MoNjQpOwogICAgdmFyIG50SGVhZGVyID0gQnVmZmVyLmFsbG9jKDI0KTsKICAgIHZhciBvcHRIZWFkZXI7CgogICAgLy8gUmVhZCB0aGUgRE9TIGhlYWRlcgogICAgYnl0ZXNSZWFkID0gZnMucmVhZFN5bmMoZmQsIGRvc0hlYWRlciwgMCwgNjQsIDApOwogICAgaWYgKGRvc0hlYWRlci5yZWFkVUludDE2TEUoMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkgIT0gJzVBNEQnKQogICAgewogICAgICAgIHRocm93ICgndW5yZWNvZ25pemVkIGJpbmFyeSBmb3JtYXQnKTsKICAgIH0KCiAgICAvLyBSZWFkIHRoZSBOVCBoZWFkZXIKICAgIGJ5dGVzUmVhZCA9IGZzLnJlYWRTeW5jKGZkLCBudEhlYWRlciwgMCwgbnRIZWFkZXIubGVuZ3RoLCBkb3NIZWFkZXIucmVhZFVJbnQzMkxFKDYwKSk7CiAgICBpZiAobnRIZWFkZXIuc2xpY2UoMCwgNCkudG9TdHJpbmcoJ2hleCcpICE9ICc1MDQ1MDAwMCcpCiAgICB7CiAgICAgICAgdGhyb3cgKCdub3QgYSBQRSBmaWxlJyk7CiAgICB9CiAgICBzd2l0Y2ggKG50SGVhZGVyLnJlYWRVSW50MTZMRSg0KS50b1N0cmluZygxNikpCiAgICB7CiAgICAgICAgY2FzZSAnMTRjJzogLy8gMzIgYml0CiAgICAgICAgICAgIHJldFZhbC5mb3JtYXQgPSAneDg2JzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnODY2NCc6IC8vIDY0IGJpdAogICAgICAgICAgICByZXRWYWwuZm9ybWF0ID0gJ3g2NCc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6IC8vIFVua25vd24KICAgICAgICAgICAgcmV0VmFsLmZvcm1hdCA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CgogICAgcmV0VmFsLm9wdGlvbmFsSGVhZGVyU2l6ZSA9IG50SGVhZGVyLnJlYWRVSW50MTZMRSgyMCk7CiAgICByZXRWYWwub3B0aW9uYWxIZWFkZXJTaXplQWRkcmVzcyA9IGRvc0hlYWRlci5yZWFkVUludDMyTEUoNjApICsgMjA7CgogICAgLy8gUmVhZCB0aGUgb3B0aW9uYWwgaGVhZGVyCiAgICBvcHRIZWFkZXIgPSBCdWZmZXIuYWxsb2MobnRIZWFkZXIucmVhZFVJbnQxNkxFKDIwKSk7CiAgICBieXRlc1JlYWQgPSBmcy5yZWFkU3luYyhmZCwgb3B0SGVhZGVyLCAwLCBvcHRIZWFkZXIubGVuZ3RoLCBkb3NIZWFkZXIucmVhZFVJbnQzMkxFKDYwKSArIDI0KTsKICAgIHZhciBudW1SVkEgPSB1bmRlZmluZWQ7CgogICAgcmV0VmFsLkNoZWNrU3VtUG9zID0gZG9zSGVhZGVyLnJlYWRVSW50MzJMRSg2MCkgKyAyNCArIDY0OwogICAgcmV0VmFsLlNpemVPZkNvZGUgPSBvcHRIZWFkZXIucmVhZFVJbnQzMkxFKDQpOwogICAgcmV0VmFsLlNpemVPZkluaXRpYWxpemVkRGF0YSA9IG9wdEhlYWRlci5yZWFkVUludDMyTEUoOCk7CiAgICByZXRWYWwuU2l6ZU9mVW5Jbml0aWFsaXplZERhdGEgPSBvcHRIZWFkZXIucmVhZFVJbnQzMkxFKDEyKTsKCiAgICBzd2l0Y2ggKG9wdEhlYWRlci5yZWFkVUludDE2TEUoMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkpCiAgICB7CiAgICAgICAgY2FzZSAnMTBCJzogLy8gMzIgYml0IGJpbmFyeQogICAgICAgICAgICBudW1SVkEgPSBvcHRIZWFkZXIucmVhZFVJbnQzMkxFKDkyKTsKICAgICAgICAgICAgcmV0VmFsLkNlcnRpZmljYXRlVGFibGVBZGRyZXNzID0gb3B0SGVhZGVyLnJlYWRVSW50MzJMRSgxMjgpOwogICAgICAgICAgICByZXRWYWwuQ2VydGlmaWNhdGVUYWJsZVNpemUgPSBvcHRIZWFkZXIucmVhZFVJbnQzMkxFKDEzMik7CiAgICAgICAgICAgIHJldFZhbC5DZXJ0aWZpY2F0ZVRhYmxlU2l6ZVBvcyA9IGRvc0hlYWRlci5yZWFkVUludDMyTEUoNjApICsgMjQgKyAxMzI7CiAgICAgICAgICAgIHJldFZhbC5ydmFTdGFydEFkZHJlc3MgPSBkb3NIZWFkZXIucmVhZFVJbnQzMkxFKDYwKSArIDI0ICsgOTY7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJzIwQic6IC8vIDY0IGJpdCBiaW5hcnkKICAgICAgICAgICAgbnVtUlZBID0gb3B0SGVhZGVyLnJlYWRVSW50MzJMRSgxMDgpOwogICAgICAgICAgICByZXRWYWwuQ2VydGlmaWNhdGVUYWJsZUFkZHJlc3MgPSBvcHRIZWFkZXIucmVhZFVJbnQzMkxFKDE0NCk7CiAgICAgICAgICAgIHJldFZhbC5DZXJ0aWZpY2F0ZVRhYmxlU2l6ZSA9IG9wdEhlYWRlci5yZWFkVUludDMyTEUoMTQ4KTsKICAgICAgICAgICAgcmV0VmFsLkNlcnRpZmljYXRlVGFibGVTaXplUG9zID0gZG9zSGVhZGVyLnJlYWRVSW50MzJMRSg2MCkgKyAyNCArIDE0ODsKICAgICAgICAgICAgcmV0VmFsLnJ2YVN0YXJ0QWRkcmVzcyA9IGRvc0hlYWRlci5yZWFkVUludDMyTEUoNjApICsgMjQgKyAxMTI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHRocm93ICgnVW5rbm93biBWYWx1ZSBmb3VuZCBmb3IgT3B0aW9uYWwgTWFnaWM6ICcgKyBudEhlYWRlci5yZWFkVUludDE2TEUoMjQpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXRWYWwucnZhQ291bnQgPSBudW1SVkE7CgogICAgaWYgKHJldFZhbC5DZXJ0aWZpY2F0ZVRhYmxlQWRkcmVzcykKICAgIHsKICAgICAgICAvLyBSZWFkIHRoZSBhdXRoZW50aWNvZGUgY2VydGlmaWNhdGUsIG9ubHkgb25lIGNlcnQgKG9ubHkgdGhlIGZpcnN0IGVudHJ5KQogICAgICAgIHZhciBoZHIgPSBCdWZmZXIuYWxsb2MoOCk7CiAgICAgICAgZnMucmVhZFN5bmMoZmQsIGhkciwgMCwgaGRyLmxlbmd0aCwgcmV0VmFsLkNlcnRpZmljYXRlVGFibGVBZGRyZXNzKTsKICAgICAgICByZXRWYWwuY2VydGlmaWNhdGUgPSBCdWZmZXIuYWxsb2MoaGRyLnJlYWRVSW50MzJMRSgwKSk7CiAgICAgICAgZnMucmVhZFN5bmMoZmQsIHJldFZhbC5jZXJ0aWZpY2F0ZSwgMCwgcmV0VmFsLmNlcnRpZmljYXRlLmxlbmd0aCwgcmV0VmFsLkNlcnRpZmljYXRlVGFibGVBZGRyZXNzICsgaGRyLmxlbmd0aCk7CiAgICAgICAgcmV0VmFsLmNlcnRpZmljYXRlID0gcmV0VmFsLmNlcnRpZmljYXRlLnRvU3RyaW5nKCdiYXNlNjQnKTsKICAgICAgICByZXRWYWwuY2VydGlmaWNhdGVEd0xlbmd0aCA9IGhkci5yZWFkVUludDMyTEUoMCk7CiAgICB9CiAgICBmcy5jbG9zZVN5bmMoZmQpOwogICAgcmV0dXJuIChyZXRWYWwpOwp9Cgptb2R1bGUuZXhwb3J0cyA9IHBhcnNlOwoKCv==', 'base64').toString());"); @@ -2057,13 +2057,13 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) duk_pcall_method(ctx, 2); duk_pop(ctx); free(_servicemanager); - char *_usersessions = ILibMemory_Allocate(102880, 0, NULL, NULL); - memcpy_s(_usersessions + 0, 58788, "LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciBOT1RJRllfRk9SX1RISVNfU0VTU0lPTiA9IDA7CnZhciBOT1RJRllfRk9SX0FMTF9TRVNTSU9OUyA9IDE7CnZhciBXTV9XVFNTRVNTSU9OX0NIQU5HRSA9IDB4MDJCMTsKdmFyIFdNX1BPV0VSQlJPQURDQVNUID0gMHgyMTg7CnZhciBQQlRfUE9XRVJTRVRUSU5HQ0hBTkdFID0gMHg4MDEzOwp2YXIgUEJUX0FQTVNVU1BFTkQgPSAweDQ7CnZhciBQQlRfQVBNUkVTVU1FU1VTUEVORCA9IDB4NzsKdmFyIFBCVF9BUE1SRVNVTUVBVVRPTUFUSUMgPSAweDEyOwp2YXIgUEJUX0FQTVBPV0VSU1RBVFVTQ0hBTkdFID0gMHhBOwp2YXIgUFJPQ0VTU19RVUVSWV9JTkZPUk1BVElPTiA9IDB4MDQwMDsNCnZhciBUT0tFTl9RVUVSWSA9IDB4MDAwODsNCnZhciBUb2tlblVzZXIgPSAxOwp2YXIgVG9rZW5UeXBlID0gODsKdmFyIFRva2VuU2Vzc2lvbklkID0gMTI7CnZhciBFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSID0gMTIyOw0KdmFyIEhFQVBfWkVST19NRU1PUlkgPSAweDAwMDAwMDA4Ow0KCnZhciBXVFNfQ09OU09MRV9DT05ORUNUICAgICAgICAgPSAoMHgxKTsKdmFyIFdUU19DT05TT0xFX0RJU0NPTk5FQ1QgICAgICA9ICgweDIpOwp2YXIgV1RTX1JFTU9URV9DT05ORUNUICAgICAgICAgID0gKDB4Myk7CnZhciBXVFNfUkVNT1RFX0RJU0NPTk5FQ1QgICAgICAgPSAoMHg0KTsKdmFyIFdUU19TRVNTSU9OX0xPR09OICAgICAgICAgICA9ICgweDUpOwp2YXIgV1RTX1NFU1NJT05fTE9HT0ZGICAgICAgICAgID0gKDB4Nik7CnZhciBXVFNfU0VTU0lPTl9MT0NLICAgICAgICAgICAgPSAoMHg3KTsKdmFyIFdUU19TRVNTSU9OX1VOTE9DSyAgICAgICAgICA9ICgweDgpOwp2YXIgV1RTX1NFU1NJT05fUkVNT1RFX0NPTlRST0wgID0gKDB4OSk7CnZhciBXVFNfU0VTU0lPTl9DUkVBVEUgICAgICAgICAgPSAoMHhBKTsKdmFyIFdUU19TRVNTSU9OX1RFUk1JTkFURSAgICAgICA9ICgweEIpOwoKdmFyIEdVSURfQUNEQ19QT1dFUl9TT1VSQ0U7CnZhciBHVUlEX0JBVFRFUllfUEVSQ0VOVEFHRV9SRU1BSU5JTkc7CnZhciBHVUlEX0NPTlNPTEVfRElTUExBWV9TVEFURTsKCmZ1bmN0aW9uIGNvbHVtblBhcnNlKGRhdGEsIGRlbGltaXRlcikKewogICAgdmFyIHRva2VucyA9IGRhdGEuc3BsaXQoZGVsaW1pdGVyKTsKICAgIHZhciByZXQgPSBbXTsKICAgIGZvcih2YXIgaSBpbiB0b2tlbnMpCiAgICB7CiAgICAgICAgaWYgKHRva2Vuc1tpXS5sZW5ndGggPiAwKSB7IHJldC5wdXNoKHRva2Vuc1tpXSk7IH0KICAgIH0KICAgIHJldHVybiAocmV0KTsKfQoKCmZ1bmN0aW9uIFVzZXJTZXNzaW9ucygpCnsKICAgIHRoaXMuX09iamVjdElEID0gJ3VzZXItc2Vzc2lvbnMnOwogICAgcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyLmNhbGwodGhpcywgdHJ1ZSkKICAgICAgICAuY3JlYXRlRXZlbnQoJ2NoYW5nZWQnKQogICAgICAgIC5jcmVhdGVFdmVudCgnbG9ja2VkJykKICAgICAgICAuY3JlYXRlRXZlbnQoJ3VubG9ja2VkJyk7CgogICAgdGhpcy5lbnVtZXJhdGVVc2VycyA9IGZ1bmN0aW9uIGVudW1lcmF0ZVVzZXJzKCkKICAgIHsKICAgICAgICB2YXIgcHJvbWlzZSA9IHJlcXVpcmUoJ3Byb21pc2UnKTsKICAgICAgICB2YXIgcCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChyZXMsIHJlaikKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuX19yZXNvbHZlciA9IHJlczsKICAgICAgICAgICAgdGhpcy5fX3JlamVjdG9yID0gcmVqOwogICAgICAgIH0pOwogICAgICAgIHAuX19oYW5kbGVyID0gZnVuY3Rpb24gX19oYW5kbGVyKHVzZXJzKQogICAgICAgIHsKICAgICAgICAgICAgcC5fX3Jlc29sdmVyKHVzZXJzKTsKICAgICAgICB9OwogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5DdXJyZW50KHAuX19oYW5kbGVyKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2goZSkKICAgICAgICB7CiAgICAgICAgICAgIHAuX19yZWplY3RvcihlKTsKICAgICAgICB9CiAgICAgICAgcC5wYXJlbnQgPSB0aGlzOwogICAgICAgIHJldHVybiAocCk7CiAgICB9CgogICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ3dpbjMyJykKICAgIHsKICAgICAgICB0aGlzLl9zZXJ2aWNlSG9va2VkID0gZmFsc2U7CiAgICAgICAgdGhpcy5fbWFyc2hhbCA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpOwogICAgICAgIHRoaXMuX2tlcm5lbDMyID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVOYXRpdmVQcm94eSgnS2VybmVsMzIuZGxsJyk7CiAgICAgICAgdGhpcy5fa2VybmVsMzIuQ3JlYXRlTWV0aG9kKCdHZXRMYXN0RXJyb3InKTsKICAgICAgICB0aGlzLl9rZXJuZWwzMi5DcmVhdGVNZXRob2QoJ1dUU0dldEFjdGl2ZUNvbnNvbGVTZXNzaW9uSWQnKQogICAgICAgIHRoaXMuX2tlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnQ2xvc2VIYW5kbGUnKTsKCiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB0aGlzLl93dHMgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZU5hdGl2ZVByb3h5KCdXdHNhcGkzMi5kbGwnKTsKICAgICAgICAgICAgdGhpcy5fd3RzLkNyZWF0ZU1ldGhvZCgnV1RTRW51bWVyYXRlU2Vzc2lvbnNBJyk7CiAgICAgICAgICAgIHRoaXMuX3d0cy5DcmVhdGVNZXRob2QoJ1dUU1F1ZXJ5U2Vzc2lvbkluZm9ybWF0aW9uVycpOwogICAgICAgICAgICB0aGlzLl93dHMuQ3JlYXRlTWV0aG9kKCdXVFNSZWdpc3RlclNlc3Npb25Ob3RpZmljYXRpb24nKTsKICAgICAgICAgICAgdGhpcy5fd3RzLkNyZWF0ZU1ldGhvZCgnV1RTVW5SZWdpc3RlclNlc3Npb25Ob3RpZmljYXRpb24nKTsKICAgICAgICAgICAgdGhpcy5fd3RzLkNyZWF0ZU1ldGhvZCgnV1RTRnJlZU1lbW9yeScpOwogICAgICAgIH0KICAgICAgICBjYXRjaChleGMpCiAgICAgICAgewogICAgICAgIH0KCiAgICAgICAgdGhpcy5fYWR2YXBpID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVOYXRpdmVQcm94eSgnQWR2YXBpMzIuZGxsJyk7CiAgICAgICAgdGhpcy5fYWR2YXBpLkNyZWF0ZU1ldGhvZCgnQWxsb2NhdGVBbmRJbml0aWFsaXplU2lkJyk7CiAgICAgICAgdGhpcy5fYWR2YXBpLkNyZWF0ZU1ldGhvZCgnQ2hlY2tUb2tlbk1lbWJlcnNoaXAnKTsKICAgICAgICB0aGlzLl9hZHZhcGkuQ3JlYXRlTWV0aG9kKCdGcmVlU2lkJyk7CgogICAgICAgIHRoaXMuX3VzZXIzMiA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlTmF0aXZlUHJveHkoJ3VzZXIzMi5kbGwnKTsKICAgICAgICB0aGlzLl91c2VyMzIuQ3JlYXRlTWV0aG9kKHsgbWV0aG9kOiAnUmVnaXN0ZXJQb3dlclNldHRpbmdOb3RpZmljYXRpb24nLCB0aHJlYWREaXNwYXRjaDogMX0pOwogICAgICAgIHRoaXMuX3VzZXIzMi5DcmVhdGVNZXRob2QoJ1VucmVnaXN0ZXJQb3dlclNldHRpbmdOb3RpZmljYXRpb24nKTsKICAgICAgICB0aGlzLl9ycGNydCA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlTmF0aXZlUHJveHkoJ1JwY3J0NC5kbGwnKTsKICAgICAgICB0aGlzLl9ycGNydC5DcmVhdGVNZXRob2QoJ1V1aWRGcm9tU3RyaW5nQScpOwogICAgICAgIHRoaXMuX3JwY3J0LlN0cmluZ1RvVVVJRCA9IGZ1bmN0aW9uIFN0cmluZ1RvVVVJRChndWlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJldFZhbCA9IFN0cmluZ1RvVVVJRC51cy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSgxNik7CiAgICAgICAgICAgIGlmKFN0cmluZ1RvVVVJRC51cy5fcnBjcnQuVXVpZEZyb21TdHJpbmdBKFN0cmluZ1RvVVVJRC51cy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZShndWlkKSwgcmV0VmFsKS5WYWwgPT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIChyZXRWYWwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhyb3cgKCdDb3VsZCBub3QgY29udmVydCBzdHJpbmcgdG8gVVVJRCcpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuX3JwY3J0LlN0cmluZ1RvVVVJRC51cyA9IHRoaXM7CgogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5fa2VybmVsMzIuQ3JlYXRlTWV0aG9kKCdPcGVuUHJvY2VzcycpCiAgICAgICAgICAgIHRoaXMuX2FkdmFwaS5DcmVhdGVNZXRob2QoJ09wZW5Qcm9jZXNzVG9rZW4nKTsNCiAgICAgICAgICAgIHRoaXMuX2FkdmFwaS5DcmVhdGVNZXRob2QoJ0dldFRva2VuSW5mb3JtYXRpb24nKTsNCiAgICAgICAgICAgIHRoaXMuX2FkdmFwaS5DcmVhdGVNZXRob2QoJ0xvb2t1cEFjY291bnRTaWRXJyk7DQogICAgICAgICAgICB0aGlzLl9hZHZhcGkuQ3JlYXRlTWV0aG9kKCdPcGVuVGhyZWFkVG9rZW4nKTsNCiAgICAgICAgfQogICAgICAgIGNhdGNoKGUpCiAgICAgICAgew0KICAgICAgICB9CgoKICAgICAgICBHVUlEX0FDRENfUE9XRVJfU09VUkNFID0gdGhpcy5fcnBjcnQuU3RyaW5nVG9VVUlEKCc1ZDNlOWE1OS1lOUQ1LTRiMDAtYTZiZC1mZjM0ZmY1MTY1NDgnKTsKICAgICAgICBHVUlEX0JBVFRFUllfUEVSQ0VOVEFHRV9SRU1BSU5JTkcgPSB0aGlzLl9ycGNydC5TdHJpbmdUb1VVSUQoJ2E3YWQ4MDQxLWI0NWEtNGNhZS04N2EzLWVlY2JiNDY4YTllMScpOwogICAgICAgIEdVSURfQ09OU09MRV9ESVNQTEFZX1NUQVRFID0gdGhpcy5fcnBjcnQuU3RyaW5nVG9VVUlEKCc2ZmU2OTU1Ni03MDRhLTQ3YTAtOGYyNC1jMjhkOTM2ZmRhNDcnKTsKCiAgICAgICAgdGhpcy5TZXNzaW9uU3RhdGVzID0gWydBY3RpdmUnLCAnQ29ubmVjdGVkJywgJ0Nvbm5lY3RRdWVyeScsICdTaGFkb3cnLCAnRGlzY29ubmVjdGVkJywgJ0lkbGUnLCAnTGlzdGVuaW5nJywgJ1Jlc2V0JywgJ0Rvd24nLCAnSW5pdCddOwogICAgICAgIHRoaXMuSW5mb0NsYXNzID0KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJ1dUU0luaXRpYWxQcm9ncmFtJzogMCwKICAgICAgICAgICAgICAgICdXVFNBcHBsaWNhdGlvbk5hbWUnOiAxLAogICAgICAgICAgICAgICAgJ1dUU1dvcmtpbmdEaXJlY3RvcnknOiAyLAogICAgICAgICAgICAgICAgJ1dUU09FTUlkJzogMywKICAgICAgICAgICAgICAgICdXVFNTZXNzaW9uSWQnOiA0LAogICAgICAgICAgICAgICAgJ1dUU1VzZXJOYW1lJzogNSwKICAgICAgICAgICAgICAgICdXVFNXaW5TdGF0aW9uTmFtZSc6IDYsCiAgICAgICAgICAgICAgICAnV1RTRG9tYWluTmFtZSc6IDcsCiAgICAgICAgICAgICAgICAnV1RTQ29ubmVjdFN0YXRlJzogOCwKICAgICAgICAgICAgICAgICdXVFNDbGllbnRCdWlsZE51bWJlcic6IDksCiAgICAgICAgICAgICAgICAnV1RTQ2xpZW50TmFtZSc6IDEwLAogICAgICAgICAgICAgICAgJ1dUU0NsaWVudERpcmVjdG9yeSc6IDExLAogICAgICAgICAgICAgICAgJ1dUU0NsaWVudFByb2R1Y3RJZCc6IDEyLAogICAgICAgICAgICAgICAgJ1dUU0NsaWVudEhhcmR3YXJlSWQnOiAxMywKICAgICAgICAgICAgICAgICdXVFNDbGllbnRBZGRyZXNzJzogMTQsCiAgICAgICAgICAgICAgICAnV1RTQ2xpZW50RGlzcGxheSc6IDE1LAogICAgICAgICAgICAgICAgJ1dUU0NsaWVudFByb3RvY29sVHlwZSc6IDE2LAogICAgICAgICAgICAgICAgJ1dUU0lkbGVUaW1lJzogMTcsCiAgICAgICAgICAgICAgICAnV1RTTG9nb25UaW1lJzogMTgsCiAgICAgICAgICAgICAgICAnV1RTSW5jb21pbmdCeXRlcyc6IDE5LAogICAgICAgICAgICAgICAgJ1dUU091dGdvaW5nQnl0ZXMnOiAyMCwKICAgICAgICAgICAgICAgICdXVFNJbmNvbWluZ0ZyYW1lcyc6IDIxLAogICAgICAgICAgICAgICAgJ1dUU091dGdvaW5nRnJhbWVzJzogMjIsCiAgICAgICAgICAgICAgICAnV1RTQ2xpZW50SW5mbyc6IDIzLAogICAgICAgICAgICAgICAgJ1dUU1Nlc3Npb25JbmZvJzogMjQsCiAgICAgICAgICAgICAgICAnV1RTU2Vzc2lvbkluZm9FeCc6IDI1LAogICAgICAgICAgICAgICAgJ1dUU0NvbmZpZ0luZm8nOiAyNiwKICAgICAgICAgICAgICAgICdXVFNWYWxpZGF0aW9uSW5mbyc6IDI3LAogICAgICAgICAgICAgICAgJ1dUU1Nlc3Npb25BZGRyZXNzVjQnOiAyOCwKICAgICAgICAgICAgICAgICdXVFNJc1JlbW90ZVNlc3Npb24nOiAyOQogICAgICAgICAgICB9OwoKICAgICAgICB0aGlzLmlzUm9vdCA9IGZ1bmN0aW9uIGlzUm9vdCgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgTlRBdXRob3JpdHkgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDYpOwogICAgICAgICAgICBOVEF1dGhvcml0eS50b0J1ZmZlcigpLndyaXRlSW50OCg1LCA1KTsKCiAgICAgICAgICAgIHZhciBBZG1pbmlzdHJhdG9yc0dyb3VwID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVQb2ludGVyKCk7CiAgICAgICAgICAgIHZhciBhZG1pbiA9IGZhbHNlOwoKICAgICAgICAgICAgaWYgKHRoaXMuX2FkdmFwaS5BbGxvY2F0ZUFuZEluaXRpYWxpemVTaWQoTlRBdXRob3JpdHksIDIsIDMyLCA1NDQsIDAsIDAsIDAsIDAsIDAsIDAsIEFkbWluaXN0cmF0b3JzR3JvdXApLlZhbCAhPSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbWVtYmVyID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVJbnRlZ2VyKCk7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5fYWR2YXBpLkNoZWNrVG9rZW5NZW1iZXJzaGlwKDAsIEFkbWluaXN0cmF0b3JzR3JvdXAuRGVyZWYoKSwgbWVtYmVyKS5WYWwgIT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAobWVtYmVyLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkgIT0gMCkgeyBhZG1pbiA9IHRydWU7IH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX2FkdmFwaS5GcmVlU2lkKEFkbWluaXN0cmF0b3JzR3JvdXAuRGVyZWYoKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGFkbWluOwogICAgICAgIH0KICAgICAgICB0aGlzLmdldFByb2Nlc3NPd25lck5hbWUgPSBmdW5jdGlvbiBnZXRQcm9jZXNzT3duZXJOYW1lKHBpZCkKICAgICAgICB7DQogICAgICAgICAgICB2YXIgcmV0ID0gbnVsbDsNCiAgICAgICAgICAgIHZhciBuYW1lID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSgxMDI0KTsNCiAgICAgICAgICAgIHZhciBkb21haW4gPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDEwMjQpOw0KICAgICAgICAgICAgdmFyIG5hbWVEb21haW5MZW5ndGggPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOyBuYW1lRG9tYWluTGVuZ3RoLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSgxMDI0KTsNCiAgICAgICAgICAgIHZhciBidWZmZXJMZW5ndGggPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOw0KICAgICAgICAgICAgdmFyIHNpZHR5cGUgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOw0KICAgICAgICAgICAgdmFyIHRva2VudXNlciA9IDA7DQogICAgICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVBvaW50ZXIoKTsNCg0KICAgICAgICAgICAgdmFyIGggPSB0aGlzLl9rZXJuZWwzMi5PcGVuUHJvY2VzcyhQUk9DRVNTX1FVRVJZX0lORk9STUFUSU9OLCAxLCBwaWQpOw0KICAgICAgICAgICAgaWYgKGguVmFsID09IDApIHsgdGhyb3cgKCdGYWlsZWQgdG8gcXVlcnkgcHJvY2VzcyBpZDogJyArIHBpZCk7IH0NCg0KICAgICAgICAgICAgaWYodGhpcy5fYWR2YXBpLk9wZW5Qcm9jZXNzVG9rZW4oaCwgVE9LRU5fUVVFUlksIHRva2VuKS5WYWw9PTApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5fa2VybmVsMzIuQ2xvc2VIYW5kbGUoaCk7DQogICAgICAgICAgICAgICAgdGhyb3cgKCdGYWlsZWQgdG8gUXVlcnkgUHJvY2VzcyBUb2tlbiBmb3IgcGlkOiAnICsgcGlkKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdmFyIHRzaWQgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOw0KICAgICAgICAgICAgdGhpcy5fYWR2YXBpLkdldFRva2VuSW5mb3JtYXRpb24odG9rZW4uRGVyZWYoKSwgVG9rZW5TZXNzaW9uSWQsIHRzaWQsIDQsIGJ1ZmZlckxlbmd0aCk7DQogICAgICAgICAgICB0aGlzLl9hZHZhcGkuR2V0VG9rZW5JbmZvcm1hdGlvbih0b2tlbi5EZXJlZigpLCBUb2tlblVzZXIsIHRva2VudXNlciwgMCwgYnVmZmVyTGVuZ3RoKTsNCiAgICAgICAgICAgIHRva2VudXNlciA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoYnVmZmVyTGVuZ3RoLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkpOw0KDQogICAgICAgICAgICBpZiAodGhpcy5fYWR2YXBpLkdldFRva2VuSW5mb3JtYXRpb24odG9rZW4uRGVyZWYoKSwgVG9rZW5Vc2VyLCB0b2tlbnVzZXIsIGJ1ZmZlckxlbmd0aC50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpLCBidWZmZXJMZW5ndGgpLlZhbCA9PSAwKSB7IHRocm93ICgnSW50ZXJuYWwgRXJyb3InKTsgfQ0KICAgICAgICAgICAgaWYodGhpcy5fYWR2YXBpLkxvb2t1cEFjY291bnRTaWRXKDAsIHRva2VudXNlci5EZXJlZigpLCBuYW1lLCBuYW1lRG9tYWluTGVuZ3RoLCBkb21haW4sIG5hbWVEb21haW5MZW5ndGgsIHNpZHR5cGUpLlZhbCA9PSAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRocm93ICgnTG9va3VwIEVycm9yJyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgbmFtZS5fc2l6ZSA9IDA7IGRvbWFpbi5fc2l6ZSA9IDA7DQogICAgICAgICAgICAgICAgcmV0ID0geyBuYW1lOiBuYW1lLldpZGUyVVRGOCwgZG9tYWluOiBkb21haW4uV2lkZTJVVEY4LCB0c2lkOiB0c2lkLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkgfTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdGhpcy5fa2VybmVsMzIuQ2xvc2VIYW5kbGUodG9rZW4uRGVyZWYoKSk7DQogICAgICAgICAgICB0aGlzLl9rZXJuZWwzMi5DbG9zZUhhbmRsZShoKTsNCiAgICAgICAgICAgIHJldHVybiAocmV0KTsNCiAgICAgICAgfTsKCiAgICAgICAgdGhpcy5nZXRTZXNzaW9uQXR0cmlidXRlID0gZnVuY3Rpb24gZ2V0U2Vzc2lvbkF0dHJpYnV0ZShzZXNzaW9uSWQsIGF0dHIpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYnVmZmVyID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVQb2ludGVyKCk7CiAgICAgICAgICAgIHZhciBieXRlc1JldHVybmVkID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsKCiAgICAgICAgICAgIGlmICh0aGlzLl93dHMuV1RTUXVlcnlTZXNzaW9uSW5mb3JtYXRpb25XKDAsIHNlc3Npb25JZCwgYXR0ciwgYnVmZmVyLCBieXRlc1JldHVybmVkKS5WYWwgPT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhyb3cgKCdFcnJvciBjYWxsaW5nIFdUU1F1ZXJ5U2Vzc2lvbkluZm9ybWF0aW9uVzogJyArIHRoaXMuX2tlcm5lbDMyLkdldExhc3RFcnJvci5WYWwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmV0VmFsID0gYnVmZmVyLkRlcmVmKCkuV2lkZTJVVEY4OwoKICAgICAgICAgICAgdGhpcy5fd3RzLldUU0ZyZWVNZW1vcnkoYnVmZmVyLkRlcmVmKCkpOwogICAgICAgICAgICByZXR1cm4gKHJldFZhbCk7CiAgICAgICAgfTsKICAgICAgICB0aGlzLmNvbnNvbGVVaWQgPSBmdW5jdGlvbiBjb25zb2xlVWlkKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBpZCA9IHRoaXMuX2tlcm5lbDMyLldUU0dldEFjdGl2ZUNvbnNvbGVTZXNzaW9uSWQoKS5WYWw7CiAgICAgICAgICAgIGlmKGlkPT0weEZGRkZGRkZGKSB7dGhyb3coJ05vYm9keSBsb2dnZWQgaW4nKTt9CiAgICAgICAgICAgIHJldHVybiAoaWQpOwogICAgICAgIH07CiAgICAgICAgdGhpcy5nZXRVc2VybmFtZSA9IGZ1bmN0aW9uIGdldFVzZXJuYW1lKHVpZCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAodGhpcy5nZXRTZXNzaW9uQXR0cmlidXRlKHVpZCwgdGhpcy5JbmZvQ2xhc3MuV1RTVXNlck5hbWUpKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5DdXJyZW50ID0gZnVuY3Rpb24gQ3VycmVudChjYikKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXRWYWwgPSB7fTsKICAgICAgICAgICAgdmFyIHBpbmZvID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVQb2ludGVyKCk7CiAgICAgICAgICAgIHZhciBjb3VudCA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7CiAgICAgICAgICAgIGlmICh0aGlzLl93dHMuV1RTRW51bWVyYXRlU2Vzc2lvbnNBKDAsIDAsIDEsIHBpbmZvLCBjb3VudCkuVmFsID09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRocm93ICgnRXJyb3IgY2FsbGluZyBXVFNFbnVtZXJhdGVTZXNzaW9uc0E6ICcgKyB0aGlzLl9rZXJuZWwzMi5HZXRMYXN0RXJyb3IoKS5WYWwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50LnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkgOyArK2kpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBpbmZvID0gcGluZm8uRGVyZWYoKS5EZXJlZihpICogKHRoaXMuX21hcnNoYWwuUG9pbnRlclNpemUgPT0gNCA/IDEyIDogMjQpLCB0aGlzLl9tYXJzaGFsLlBvaW50ZXJTaXplID09IDQgPyAxMiA6IDI0KTsKICAgICAgICAgICAgICAgIHZhciBqID0geyBTZXNzaW9uSWQ6IGluZm8udG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKSB9OwogICAgICAgICAgICAgICAgai5TdGF0aW9uTmFtZSA9IGluZm8uRGVyZWYodGhpcy5fbWFyc2hhbC5Qb2ludGVyU2l6ZSA9PSA0ID8gNCA6IDgsIHRoaXMuX21hcnNoYWwuUG9pbnRlclNpemUpLkRlcmVmKCkuU3RyaW5nOwogICAgICAgICAgICAgICAgai5TdGF0ZSA9IHRoaXMuU2Vzc2lvblN0YXRlc1tpbmZvLkRlcmVmKHRoaXMuX21hcnNoYWwuUG9pbnRlclNpemUgPT0gNCA/IDggOiAxNiwgNCkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKV07CiAgICAgICAgICAgICAgICBpZiAoai5TdGF0ZSA9PSAnQWN0aXZlJykgewogICAgICAgICAgICAgICAgICAgIGouVXNlcm5hbWUgPSB0aGlzLmdldFNlc3Npb25BdHRyaWJ1dGUoai5TZXNzaW9uSWQsIHRoaXMuSW5mb0NsYXNzLldUU1VzZXJOYW1lKTsKICAgICAgICAgICAgICAgICAgICBqLkRvbWFpbiA9IHRoaXMuZ2V0U2Vzc2lvbkF0dHJpYnV0ZShqLlNlc3Npb25JZCwgdGhpcy5JbmZvQ2xhc3MuV1RTRG9tYWluTmFtZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXRWYWxbai5TZXNzaW9uSWRdID0gajsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5fd3RzLldUU0ZyZWVNZW1vcnkocGluZm8uRGVyZWYoKSk7CgogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0VmFsLCAnQWN0aXZlJywgeyB2YWx1ZTogc2hvd0FjdGl2ZU9ubHkocmV0VmFsKSB9KTsKICAgICAgICAgICAgaWYgKGNiKSB7IGNiKHJldFZhbCk7IH0KICAgICAgICAgICAgcmV0dXJuIChyZXRWYWwpOwogICAgICAgIH07CgoKICAgICAgICAvLyBXZSBuZWVkIHRvIHNwaW4gdXAgYSBtZXNzYWdlIHB1bXAsIGFuZCBmZXRjaCBhIHdpbmRvdyBoYW5kbGUKICAgICAgICB2YXIgbWVz", 16000); - memcpy_s(_usersessions + 16000, 42788, "c2FnZV9wdW1wID0gcmVxdWlyZSgnd2luLW1lc3NhZ2UtcHVtcCcpOwogICAgICAgIHRoaXMuX21lc3NhZ2VwdW1wID0gbmV3IG1lc3NhZ2VfcHVtcCh7IGZpbHRlcjogV01fV1RTU0VTU0lPTl9DSEFOR0UgfSk7IHRoaXMuX21lc3NhZ2VwdW1wLnBhcmVudCA9IHRoaXM7ICAgICAKICAgICAgICB0aGlzLl9tZXNzYWdlcHVtcC5vbignZXhpdCcsIGZ1bmN0aW9uIChjb2RlKSB7IHRoaXMucGFyZW50Ll93dHMuV1RTVW5SZWdpc3RlclNlc3Npb25Ob3RpZmljYXRpb24odGhpcy5wYXJlbnQuaHduZCk7IH0pOwogICAgICAgIHRoaXMuX21lc3NhZ2VwdW1wLm9uKCdod25kJywgZnVuY3Rpb24gKGgpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnBhcmVudC5od25kID0gaDsKCiAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8geWllbGQsIGFuZCBkbyB0aGlzIGluIHRoZSBuZXh0IGV2ZW50IGxvb3AgcGFzcywgYmVjdWFzZSB3ZSBkb24ndCB3YW50IHRvIGNhbGwgJ1JlZ2lzdGVyUG93ZXJTZXR0aW5nTm90aWZpY2F0aW9uJwogICAgICAgICAgICAvLyBmcm9tIHRoZSBtZXNzYWdlcHVtcCAndGhyZWFkJywgYmVjYXVzZSB3ZSBhcmUgYWN0dWFsbHkgb24gdGhlIG1pY3Jvc3RhY2sgdGhyZWFkLCBzdWNoIHRoYXQgdGhlIG1lc3NhZ2UgcHVtcCB0aHJlYWQsIGlzIGhvbGRpbmcKICAgICAgICAgICAgLy8gb24gYSBzZW1hcGhvcmUgZm9yIHVzIHRvIHJldHVybi4gSWYgd2UgY2FsbCBub3csIHdlIG1heSBkZWFkbG9jayBvbiBXaW5kb3dzIDcsIGJlY3Vhc2UgaXQgd2lsbCB0cnkgdG8gbm90aWZ5IGltbWVkaWF0ZWx5CiAgICAgICAgICAgIHRoaXMuaW1tZWRpYXRlID0gc2V0SW1tZWRpYXRlKGZ1bmN0aW9uIChzZWxmKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGEgd2luZG93IGhhbmRsZSwgd2UgY2FuIHJlZ2lzdGVyIGl0IHRvIHJlY2VpdmUgV2luZG93cyBNZXNzYWdlcwogICAgICAgICAgICAgICAgaWYgKHNlbGYucGFyZW50Ll93dHMpIHsgc2VsZi5wYXJlbnQuX3d0cy5XVFNSZWdpc3RlclNlc3Npb25Ob3RpZmljYXRpb24oc2VsZi5wYXJlbnQuaHduZCwgTk9USUZZX0ZPUl9BTExfU0VTU0lPTlMpOyB9CiAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5fdXNlcjMyLkFDRENfSCA9IHNlbGYucGFyZW50Ll91c2VyMzIuUmVnaXN0ZXJQb3dlclNldHRpbmdOb3RpZmljYXRpb24oc2VsZi5wYXJlbnQuaHduZCwgR1VJRF9BQ0RDX1BPV0VSX1NPVVJDRSwgMCk7CiAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5fdXNlcjMyLkJBVFRfSCA9IHNlbGYucGFyZW50Ll91c2VyMzIuUmVnaXN0ZXJQb3dlclNldHRpbmdOb3RpZmljYXRpb24oc2VsZi5wYXJlbnQuaHduZCwgR1VJRF9CQVRURVJZX1BFUkNFTlRBR0VfUkVNQUlOSU5HLCAwKTsKICAgICAgICAgICAgICAgIHNlbGYucGFyZW50Ll91c2VyMzIuRElTUF9IID0gc2VsZi5wYXJlbnQuX3VzZXIzMi5SZWdpc3RlclBvd2VyU2V0dGluZ05vdGlmaWNhdGlvbihzZWxmLnBhcmVudC5od25kLCBHVUlEX0NPTlNPTEVfRElTUExBWV9TVEFURSwgMCk7CiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHNlbGYucGFyZW50Ll91c2VyMzIuQUNEQ19ILlZhbCwgc2VsZi5wYXJlbnQuX3VzZXIzMi5CQVRUX0guVmFsLCBzZWxmLnBhcmVudC5fdXNlcjMyLkRJU1BfSC5WYWwpOwogICAgICAgICAgICB9LCB0aGlzKTsKICAgICAgICB9KTsKICAgICAgICB0aGlzLl9tZXNzYWdlcHVtcC5vbignbWVzc2FnZScsIGZ1bmN0aW9uIChtc2cpCiAgICAgICAgewogICAgICAgICAgICBzd2l0Y2gobXNnLm1lc3NhZ2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgV01fV1RTU0VTU0lPTl9DSEFOR0U6CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG1zZy53cGFyYW0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdUU19TRVNTSU9OX0xPQ0s6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5lbnVtZXJhdGVVc2VycygpLnRoZW4oZnVuY3Rpb24gKHVzZXJzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2Vyc1ttc2cubHBhcmFtXSkgeyB0aGlzLnBhcmVudC5lbWl0KCdsb2NrZWQnLCB1c2Vyc1ttc2cubHBhcmFtXSk7IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV1RTX1NFU1NJT05fVU5MT0NLOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuZW51bWVyYXRlVXNlcnMoKS50aGVuKGZ1bmN0aW9uICh1c2VycykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlcnNbbXNnLmxwYXJhbV0pIHsgdGhpcy5wYXJlbnQuZW1pdCgndW5sb2NrZWQnLCB1c2Vyc1ttc2cubHBhcmFtXSk7IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV1RTX1NFU1NJT05fTE9HT046CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV1RTX1NFU1NJT05fTE9HT0ZGOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuZW1pdCgnY2hhbmdlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBXTV9QT1dFUkJST0FEQ0FTVDoKICAgICAgICAgICAgICAgICAgICBzd2l0Y2gobXNnLndwYXJhbSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnV01fUE9XRVJCUk9BRENBU1QgW1VOS05PV04gd3BhcmFtXTogJyArIG1zZy53cGFyYW0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUEJUX0FQTVNVU1BFTkQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnc3gnLCAnU0xFRVAnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBCVF9BUE1SRVNVTUVBVVRPTUFUSUM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnc3gnLCAnUkVTVU1FX05PTl9JTlRFUkFDVElWRScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUEJUX0FQTVJFU1VNRVNVU1BFTkQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnc3gnLCAnUkVTVU1FX0lOVEVSQUNUSVZFJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQQlRfQVBNUE9XRVJTVEFUVVNDSEFOR0U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnY2hhbmdlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUEJUX1BPV0VSU0VUVElOR0NIQU5HRToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBscGFyYW0gPSB0aGlzLnBhcmVudC5fbWFyc2hhbC5DcmVhdGVQb2ludGVyKEJ1ZmZlci5mcm9tKG1zZy5scGFyYW1faGV4LCAnaGV4JykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBscGFyYW0uRGVyZWYoMjAsIGxwYXJhbS5EZXJlZigxNiwgNCkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoMCkpLnRvQnVmZmVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2gobHBhcmFtLkRlcmVmKDAsIDE2KS50b0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEdVSURfQUNEQ19QT1dFUl9TT1VSQ0UuRGVyZWYoMCwgMTYpLnRvQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goZGF0YS5yZWFkVUludDMyTEUoMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnYWNkYycsICdBQycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ3Bvd2VyLW1vbml0b3InKS5lbWl0KCdhY2RjJywgJ0JBVFRFUlknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnYWNkYycsICdIT1QnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEdVSURfQkFUVEVSWV9QRVJDRU5UQUdFX1JFTUFJTklORy5EZXJlZigwLCAxNikudG9CdWZmZXIoKS50b1N0cmluZygnaGV4Jyk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ3Bvd2VyLW1vbml0b3InKS5lbWl0KCdiYXR0ZXJ5TGV2ZWwnLCBkYXRhLnJlYWRVSW50MzJMRSgwKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgR1VJRF9DT05TT0xFX0RJU1BMQVlfU1RBVEUuRGVyZWYoMCwgMTYpLnRvQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goZGF0YS5yZWFkVUludDMyTEUoMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnZGlzcGxheScsICdPRkYnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnZGlzcGxheScsICdPTicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ3Bvd2VyLW1vbml0b3InKS5lbWl0KCdkaXNwbGF5JywgJ0RJTU1FRCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQogICAgZWxzZSBpZihwcm9jZXNzLnBsYXRmb3JtID09ICdsaW51eCcgfHwgcHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZnJlZWJzZCcpCiAgICB7CiAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2xpbnV4JykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBkYnVzID0gcmVxdWlyZSgnbGludXgtZGJ1cycpOwogICAgICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS53YXRjaCkgewogICAgICAgICAgICAgICAgdGhpcy5fbGludXhXYXRjaGVyID0gcmVxdWlyZSgnZnMnKS53YXRjaCgnL3Zhci9ydW4vdXRtcCcpOwogICAgICAgICAgICAgICAgdGhpcy5fbGludXhXYXRjaGVyLnVzZXJfc2Vzc2lvbiA9IHRoaXM7CiAgICAgICAgICAgICAgICB0aGlzLl9saW51eFdhdGNoZXIub24oJ2NoYW5nZScsIGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy51c2VyX3Nlc3Npb24uZW1pdCgnY2hhbmdlZCcpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5DdXJyZW50ID0gZnVuY3Rpb24gQ3VycmVudChjYikgewogICAgICAgICAgICAgICAgdmFyIHJldFZhbCA9IHt9OwogICAgICAgICAgICAgICAgcmV0VmFsLl9PYmplY3RJRCA9ICdVc2VyU2Vzc2lvbicKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXRWYWwsICdfY2FsbGJhY2snLCB7IHZhbHVlOiBjYiB9KTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXRWYWwsICdfY2hpbGQnLCB7IHZhbHVlOiByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy91c3IvYmluL2xhc3QnLCBbJ2xhc3QnLCAnLWYnLCAnL3Zhci9ydW4vdXRtcCddKSB9KTsKCiAgICAgICAgICAgICAgICByZXRWYWwuX2NoaWxkLlBhcmVudCA9IHJldFZhbDsKICAgICAgICAgICAgICAgIHJldFZhbC5fY2hpbGQuX3R4dCA9ICcnOwogICAgICAgICAgICAgICAgcmV0VmFsLl9jaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uIChjb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxpbmVzID0gdGhpcy5fdHh0LnNwbGl0KCdcbicpOwogICAgICAgICAgICAgICAgICAgIHZhciBzZXNzaW9ucyA9IFtdOwogICAgICAgICAgICAgICAgICAgIHZhciB1c2VycyA9IHt9OwoKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIGxpbmVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lc1tpXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IGdldFRva2VucyhsaW5lc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IHsgVXNlcm5hbWU6IHRva2Vuc1swXSwgU2Vzc2lvbklkOiB0b2tlbnNbMV0gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRva2Vuc1szXS5pbmNsdWRlcygnc3RpbGwgbG9nZ2VkIGluJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLlN0YXRlID0gJ0FjdGl2ZSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLkxhc3RBY3RpdmUgPSB0b2tlbnNbM107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbnMucHVzaChzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXNzaW9ucy5wb3AoKTsKCgogICAgICAgICAgICAgICAgICAgIHZhciB1c2VybmFtZXMgPSB7fTsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvbWlzZXMgPSBbXTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBzZXNzaW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbnNbaV0uVXNlcm5hbWUgIT0gJ3JlYm9vdCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJzW3Nlc3Npb25zW2ldLlNlc3Npb25JZF0gPSBzZXNzaW9uc1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VybmFtZXNbc2Vzc2lvbnNbaV0uVXNlcm5hbWVdID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZXNbc2Vzc2lvbnNbaV0uVXNlcm5hbWVdID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ3Byb21pc2UnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHVzZXJzLCAnQWN0aXZlJywgeyB2YWx1ZTogc2hvd0FjdGl2ZU9ubHkodXNlcnMpIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5QYXJlbnQuX2NhbGxiYWNrKSB7IHRoaXMuUGFyZW50Ll9jYWxsYmFjay5jYWxsKHRoaXMuUGFyZW50LCB1c2Vycyk7IH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHByb21pc2UgPSByZXF1aXJlKCdwcm9taXNlJyk7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiBpbiB1c2VybmFtZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAocmVzLCByZWopIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX191c2VybmFtZSA9IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9fcmVzb2x2ZXIgPSByZXM7IHRoaXMuX19yZWplY3RvciA9IHJlajsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX19jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL3Vzci9iaW4vaWQnLCBbJ2lkJywgJy11Jywgbl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fX2NoaWxkLnByb21pc2UgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fX2NoaWxkLnN0ZG91dC5fdHh0ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9fY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuX3R4dCArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX19jaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uIChjb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQodGhpcy5zdGRvdXQuX3R4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fX3JlamVjdG9yKCdpbnZhbGlkIHVpZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSBwYXJzZUludCh0aGlzLnN0ZG91dC5fdHh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuX19yZXNvbHZlcihpZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2gocCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKGZ1bmN0aW9uIChwbGlzdCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBEb25lCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIHBsaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZVtwbGlzdFtpXS5fX3VzZXJuYW1lXSA9IHBsaXN0W2ldLl9pbnRlcm5hbC5jb21wbGV0ZWRBcmdzWzBdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gdXNlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJzW2ldLnVpZCA9IHRhYmxlW3VzZXJzW2ldLlVzZXJuYW1lXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodXNlcnMsICdBY3RpdmUnLCB7IHZhbHVlOiBzaG93QWN0aXZlT25seSh1c2VycykgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXRWYWwuX2NhbGxiYWNrKSB7IHJldFZhbC5fY2FsbGJhY2suY2FsbChyZXRWYWwsIHVzZXJzKTsgfQogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmFpbGVkCiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh1c2VycywgJ0FjdGl2ZScsIHsgdmFsdWU6IHNob3dBY3RpdmVPbmx5KHVzZXJzKSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldFZhbC5fY2FsbGJhY2spIHsgcmV0VmFsLl9jYWxsYmFjay5jYWxsKHJldFZhbCwgdXNlcnMpOyB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJldFZhbC5fY2hpbGQuc3Rkb3V0LlBhcmVudCA9IHJldFZhbC5fY2hpbGQ7CiAgICAgICAgICAgICAgICByZXRWYWwuX2NoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLlBhcmVudC5fdHh0ICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwoKICAgICAgICAgICAgICAgIHJldHVybiAocmV0VmFsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9yZWNoZWNrTG9nZ2VkSW5Vc2VycyA9IGZ1bmN0aW9uIF9yZWNoZWNrTG9nZ2VkSW5Vc2VycygpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZW51bWVyYXRlVXNlcnMoKS50aGVuKGZ1bmN0aW9uICh1KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICh1LkFjdGl2ZS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIGFscmVhZHkgYSB1c2VyIGxvZ2dlZCBpbiwgc28gd2UgY2FuIG1vbml0b3IgREJVUyBmb3IgbG9jay91bmxvY2sKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50Ll9saW51eF9sb2NrX3dhdGNoZXIgIT0gbnVsbCAmJiB0aGlzLnBhcmVudC5fbGludXhfbG9ja193YXRjaGVyLnVpZCAhPSB1LkFjdGl2ZVswXS51aWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnBhcmVudC5fbGludXhfbG9ja193YXRjaGVyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Ll9saW51eF9s", 16000); - memcpy_s(_usersessions + 32000, 26788, "b2NrX3dhdGNoZXIgPSBuZXcgZGJ1cyhwcm9jZXNzLmVudlsnWERHX0NVUlJFTlRfREVTS1RPUCddID09ICdVbml0eScgPyAnY29tLnVidW50dS5VcHN0YXJ0MF82JyA6ICdvcmcuZ25vbWUuU2NyZWVuU2F2ZXInLCB1LkFjdGl2ZVswXS51aWQpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5fbGludXhfbG9ja193YXRjaGVyLnVzZXJfc2Vzc2lvbiA9IHRoaXMucGFyZW50OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5fbGludXhfbG9ja193YXRjaGVyLm9uKCdzaWduYWwnLCBmdW5jdGlvbiAocykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSB0aGlzLnVzZXJfc2Vzc2lvbi5lbnVtZXJhdGVVc2VycygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5zaWduYWxEYXRhID0gcy5kYXRhWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcC50aGVuKGZ1bmN0aW9uICh1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLnNpZ25hbERhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB0cnVlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkZXNrdG9wLWxvY2snOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuZW1pdCgnbG9ja2VkJywgdS5BY3RpdmVbMF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZmFsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Rlc2t0b3AtdW5sb2NrJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LmVtaXQoJ3VubG9ja2VkJywgdS5BY3RpdmVbMF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLnBhcmVudC5fbGludXhfbG9ja193YXRjaGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMucGFyZW50Ll9saW51eF9sb2NrX3dhdGNoZXI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLmdldFVpZENvbmZpZyA9IGZ1bmN0aW9uIGdldFVpZENvbmZpZygpIHsKICAgICAgICAgICAgICAgIHZhciByZXQgPSB7fTsKICAgICAgICAgICAgICAgIHZhciBjZmcgPSByZXF1aXJlKCdmcycpLnJlYWRGaWxlU3luYygnL2V0Yy9sb2dpbi5kZWZzJykudG9TdHJpbmcoKS5zcGxpdCgnXG4nKTsKICAgICAgICAgICAgICAgIHZhciB0b2tlbnM7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIGNmZykgewogICAgICAgICAgICAgICAgICAgIHRva2VucyA9IGNvbHVtblBhcnNlKGNmZ1tpXSwgJ1x0Jyk7IC8vY29uc29sZS5sb2codG9rZW5zKTsKICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5zWzBdID09ICdVSURfTUlOJykgeyByZXQuTUlOID0gcGFyc2VJbnQodG9rZW5zWzFdKTsgfQogICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbnNbMF0gPT0gJ1VJRF9NQVgnKSB7IHJldC5NQVggPSBwYXJzZUludCh0b2tlbnNbMV0pOyB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHJldC5NSU4gIT0gbnVsbCAmJiByZXQuTUFYICE9IG51bGwpIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAocmV0KTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy5vbignY2hhbmdlZCcsIHRoaXMuX3JlY2hlY2tMb2dnZWRJblVzZXJzKTsgLy8gRm9yIGxpbnV4IExvY2svVW5sb2NrIG1vbml0b3JpbmcsIHdlIG5lZWQgdG8gd2F0Y2ggZm9yIExvZ09uL0xvZ09mZiwgYW5kIGtlZXAgdHJhY2sgb2YgdGhlIFVJRC4KCiAgICAgICAgICAgIC8vIEZpcnN0IHN0ZXAsIGlzIHRvIHNlZSBpZiB0aGVyZSBpcyBhIHVzZXIgbG9nZ2VkIGluOgogICAgICAgICAgICB0aGlzLl9yZWNoZWNrTG9nZ2VkSW5Vc2VycygpOwogICAgICAgIH0KICAgICAgICB0aGlzLm1pblVpZCA9ICBmdW5jdGlvbiBtaW5VaWQoKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0IC9ldGMvbG9naW4uZGVmcyB8IGdyZXAgVUlEXyB8IGF3ayAneyBpZigkMT09XCJVSURfTUlOXCIpIHsgcHJpbnQgJDI7IH0gfSdcbmV4aXRcbiIpOwogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICByZXR1cm4gKHBhcnNlSW50KGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKSA+PSAwID8gcGFyc2VJbnQoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpIDogNTAwKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fdXNlcnMgPSBmdW5jdGlvbiBfdXNlcnMoKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJnZXRlbnQgcGFzc3dkIHwgYXdrIC1GOiAneyBpZigkMz49MCkgeyBwcmludGYgXCIlczolc1xcblwiLCAkMSwgJDM7IH0gfSdcbmV4aXRcbiIpOwogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwoKICAgICAgICAgICAgdmFyIGxpbmVzID0gY2hpbGQuc3Rkb3V0LnN0ci5zcGxpdCgnXG4nKTsKICAgICAgICAgICAgdmFyIHJldCA9IHt9LCB0b2tlbnM7CiAgICAgICAgICAgIGZvciAodmFyIGxuIGluIGxpbmVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbnMgPSBsaW5lc1tsbl0uc3BsaXQoJzonKTsKICAgICAgICAgICAgICAgIGlmICh0b2tlbnNbMF0pIHsgcmV0W3Rva2Vuc1swXV0gPSB0b2tlbnNbMV07IH0gICAgICAgICAgIAogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAocmV0KTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fdWlkcyA9IGZ1bmN0aW9uIF91aWRzKCkgewogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImdldGVudCBwYXNzd2QgfCBhd2sgLUY6ICd7IGlmKCQzPj0wKSB7IHByaW50ZiBcIiVzOiVzXFxuXCIsICQxLCAkMzsgfSB9J1xuZXhpdFxuIik7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CgogICAgICAgICAgICB2YXIgbGluZXMgPSBjaGlsZC5zdGRvdXQuc3RyLnNwbGl0KCdcbicpOwogICAgICAgICAgICB2YXIgcmV0ID0ge30sIHRva2VuczsKICAgICAgICAgICAgZm9yICh2YXIgbG4gaW4gbGluZXMpIHsKICAgICAgICAgICAgICAgIHRva2VucyA9IGxpbmVzW2xuXS5zcGxpdCgnOicpOwogICAgICAgICAgICAgICAgaWYgKHRva2Vuc1swXSkgeyByZXRbdG9rZW5zWzFdXSA9IHRva2Vuc1swXTsgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAocmV0KTsKICAgICAgICB9CiAgICAgICAgdGhpcy5sb2dpblVpZHMgPSBmdW5jdGlvbiBsb2dpblVpZHMoKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIG1pbiA9IHRoaXMubWluVWlkKCk7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2dldGVudCBwYXNzd2QgfCBhd2sgLUY6IFwneyBpZigkMyA+PSAnICsgbWluICsgJykgeyBhPXNwbGl0KCQ3LGIsIi8iKTsgaWYoYlthXSE9Im5vbG9naW4iKSB7IHByaW50ICQzOyB9IH19XCcgfCB0ciAiXFxuIiAiXFwsIiB8IGF3ayBcJ3sgcHJpbnRmICJbJXNdIiwgJDA7IH1cJ1xuZXhpdFxuJyk7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgIHJldHVybiAoSlNPTi5wYXJzZShjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKS5yZXBsYWNlKCcsXScsJ10nKSkpOwogICAgICAgIH0KICAgICAgICB0aGlzLmNvbnNvbGVVaWQgPSBmdW5jdGlvbiBjb25zb2xlVWlkKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3dob1xuZXhpdFxuJyk7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CgogICAgICAgICAgICBpZiAoY2hpbGQuc3RkZXJyLnN0ciAhPSAnJykgeyByZXR1cm4gKDApOyB9CgogICAgICAgICAgICB2YXIgbGluZXMgPSBjaGlsZC5zdGRvdXQuc3RyLnNwbGl0KCdcbicpOwogICAgICAgICAgICB2YXIgdG9rZW5zLCBpLCBqOwogICAgICAgICAgICBmb3IgKGkgaW4gbGluZXMpIHsKICAgICAgICAgICAgICAgIHRva2VucyA9IGxpbmVzW2ldLnNwbGl0KCcgJyk7CiAgICAgICAgICAgICAgICBmb3IgKGogPSAxOyBqIDwgdG9rZW5zLmxlbmd0aDsgKytqKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2Vuc1tqXS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocGFyc2VJbnQodGhpcy5fdXNlcnMoKVt0b2tlbnNbMF1dKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHRocm93ICgnbm9ib2R5IGxvZ2dlZCBpbnRvIGNvbnNvbGUnKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgdGhpcy5nZXRIb21lRm9sZGVyID0gZnVuY3Rpb24gZ2V0SG9tZUZvbGRlcihpZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiZ2V0ZW50IHBhc3N3ZCAiICsgaWQgKyAiIHwgYXdrIC1GOiAne3ByaW50ICQ2fSdcbmV4aXRcbiIpOwogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5nZXRVaWQgPSBmdW5jdGlvbiBnZXRVaWQodXNlcm5hbWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImdldGVudCBwYXNzd2QgXCIiICsgdXNlcm5hbWUgKyAiXCIgfCBhd2sgLUY6ICd7cHJpbnQgJDN9J1xuZXhpdFxuIik7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CgogICAgICAgICAgICB2YXIgcmV0ID0gcGFyc2VJbnQoY2hpbGQuc3Rkb3V0LnN0cik7ICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChyZXQgPj0gMCkgeyByZXR1cm4gKHJldCk7IH0KICAgICAgICAgICAgdGhyb3cgKCd1c2VybmFtZTogJyArIHVzZXJuYW1lICsgJyBOT1QgRk9VTkQnKTsKICAgICAgICB9OwogICAgICAgIHRoaXMuZ2V0VXNlcm5hbWUgPSBmdW5jdGlvbiBnZXRVc2VybmFtZSh1aWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImdldGVudCBwYXNzd2QgIiArIHVpZCArICIgfCBhd2sgLUY6ICd7cHJpbnQgJDF9J1xuZXhpdFxuIik7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgIGlmIChjaGlsZC5zdGRvdXQuc3RyLmxlbmd0aCA+IDApIHsgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7IH0KICAgICAgICAgICAgdGhyb3cgKCd1aWQ6ICcgKyB1aWQgKyAnIE5PVCBGT1VORCcpOwogICAgICAgIH07CiAgICAgICAgdGhpcy5nZXRHcm91cG5hbWUgPSBmdW5jdGlvbiBnZXRHcm91cG5hbWUoZ2lkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJnZXRlbnQgZ3JvdXAgIiArIGdpZCArICIgfCBhd2sgLUY6ICd7cHJpbnQgJDF9J1xuZXhpdFxuIik7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgIGlmIChjaGlsZC5zdGRvdXQuc3RyLmxlbmd0aCA+IDApIHsgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7IH0KICAgICAgICAgICAgdGhyb3cgKCdnaWQ6ICcgKyBnaWQgKyAnIE5PVCBGT1VORCcpOwogICAgICAgIH07CiAgICAgICAgdGhpcy53aG9hbWkgPSBmdW5jdGlvbiB3aG9hbWkoKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJ3aG9hbWlcbmV4aXRcbiIpOwogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsKICAgICAgICB9OwogICAgICAgIHRoaXMuZ2V0RW52RnJvbVBpZCA9IGZ1bmN0aW9uIGdldEVudkZyb21QaWQocGlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJldCA9IHt9OwogICAgICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnbGludXgnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcHMsIHBzeCwgdiwgdnMgPSAwOwogICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcHMgPSByZXF1aXJlKCdmcycpLnJlYWRGaWxlU3luYygnL3Byb2MvJyArIHBpZCArICcvZW52aXJvbicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKHBzZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJldCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZm9yIChwc3ggPSAwOyBwc3ggPCBwcy5sZW5ndGg7ICsrcHN4KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChwc1twc3hdID09IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2ID0gcHMuc2xpY2UodnMsIHBzeCkudG9TdHJpbmcoKS5zcGxpdCgnPScpOwogICAgICAgICAgICAgICAgICAgICAgICByZXRbdlswXV0gPSB2WzFdOwogICAgICAgICAgICAgICAgICAgICAgICB2cyA9IHBzeCArIDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2ZyZWVic2QnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoInByb2NzdGF0IC1lICIgKyBwaWQgKyAiIHwgZ3JlcCAiICsgcGlkICsgIiB8IGF3ayAneyAkMT1cIlwiOyAkMj1cIlwiOyBwcmludCAkMCB9JyB8IHRyIFwiXFwgXCIgXCJcXG5cIlxuZXhpdFxuIik7IAogICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKCQkKICAgICAgICAgICAgICAgIHZhciBlbnY7CiAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkuc3BsaXQoJ1xuJyk7CiAgICAgICAgICAgICAgICBmb3IodmFyIGkgaW4gdG9rZW5zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVudiA9IHRva2Vuc1tpXS5zcGxpdCgnPScpOwogICAgICAgICAgICAgICAgICAgIHJldFtlbnZbMF1dID0gZW52WzFdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAocmV0KTsKICAgICAgICB9OwogICAgICAgIHRoaXMuZmluZEVudiA9IGZ1bmN0aW9uIGZpbmRFbnYodWlkLCBlbnYpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdW5hbWUgPSB0aGlzLmdldFVzZXJuYW1lKHVpZCk7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgicHMgIiArIChwcm9jZXNzLnBsYXRmb3JtID09ICdmcmVlYnNkJyA/ICItYXggIjoiIikgKyAiLWUgLW8gcGlkIC1vIHVzZXIgfCBncmVwICIgKyB1bmFtZSArICIgfCBhd2sgJ3sgcHJpbnQgJDEgfSdcbmV4aXRcbiIpOwogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwoKICAgICAgICAgICAgdmFyIGxpbmVzID0gY2hpbGQuc3Rkb3V0LnN0ci5zcGxpdCgnXG4nKTsKICAgICAgICAgICAgZm9yICh2YXIgbiBpbiBsaW5lcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGxuID0gbGluZXNbbl0udHJpbSgpOwogICAgICAgICAgICAgICAgaWYgKGxuLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzLmdldEVudkZyb21QaWQobG4pOwogICAgICAgICAgICAgICAgICAgIGlmIChlW2Vudl0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGVbZW52XSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAobnVsbCk7CiAgICAgICAgfTsKICAgIH0KICAgIGVsc2UgaWYocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZGFyd2luJykKICAgIHsKICAgICAgICB0aGlzLmdldFVpZCA9IGZ1bmN0aW9uIGdldFVpZCh1c2VybmFtZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiaWQgIiArIHVzZXJuYW1lICsgIiB8IGF3ayAneyBzcGxpdCgkMSwgdG9rZW4sIFwiPVwiKTsgc3BsaXQodG9rZW5bMl0sIHVpZCwgXCIoXCIpOyBwcmludCB1aWRbMV07IH0nXG5leGl0XG4iKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgcmV0dXJuIChwYXJzZUludChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSkpOwogICAgICAgIH07CiAgICAgICAgdGhpcy5nZXRHcm91cElEID0gZnVuY3Rpb24gZ2V0R3JvdXBJRCh1aWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImlkICIgKyB1aWQgKyAiIHwgYXdrICd7IHNwbGl0KCQyLCBnaWQsIFwiPVwiKTsgaWYoZ2lkWzFdPT1cImdpZFwiKSB7IHNwbGl0KGdpZFsyXSwgZ2lkbnVtLCBcIihcIik7IHByaW50IGdpZG51bVsxXTsgIH0gfSdcbmV4aXRcbiIpOwogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICByZXR1cm4gKHBhcnNlSW50KGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuZ2V0VXNlcm5hbWUgPSBmdW5jdGlvbiBnZXRVc2VybmFtZSh1aWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3No", 16000); - memcpy_s(_usersessions + 48000, 10788, "J10pOwogICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJkc2NsIC4gbGlzdCAvVXNlcnMgVW5pcXVlSUQgfCBncmVwICIgKyB1aWQgKyAiIHwgYXdrICd7IGlmKCQyPT0iICsgdWlkICsgIil7IHByaW50ICQxIH19J1xuZXhpdFxuIik7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgIGlmKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpICE9ICcnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRocm93ICgndWlkOiAnICsgdWlkICsgJyBub3QgZm91bmQnKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgdGhpcy5nZXRHcm91cG5hbWUgPSBmdW5jdGlvbiBnZXRHcm91cG5hbWUoZ2lkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiZHNjbCAuIGxpc3QgL0dyb3VwcyBQcmltYXJ5R3JvdXBJRCB8IGdyZXAgIiArIGdpZCArICIgfCBhd2sgJ3sgaWYoJDI9PSIgKyBnaWQgKyAiKXsgcHJpbnQgJDEgfX0nXG5leGl0XG4iKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgaWYoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgIT0gJycpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhyb3cgKCdnaWQ6ICcgKyBnaWQgKyAnIG5vdCBmb3VuZCcpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICB0aGlzLmNvbnNvbGVVaWQgPSBmdW5jdGlvbiBjb25zb2xlVWlkKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgid2hvIHwgdHIgJ1xuJyAnXC4nIHwgYXdrICd7IHByaW50ICQxIH0nXG5leGl0XG4iKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKCiAgICAgICAgICAgIHZhciByZXQgPSBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKTsKICAgICAgICAgICAgaWYgKHJldCAhPSAnJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLmdldFVpZChyZXQpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aHJvdyAoJ25vYm9keSBsb2dnZWQgaW50byBjb25zb2xlJyk7ICAgICAKICAgICAgICB9CiAgICAgICAgdGhpcy5nZXRIb21lRm9sZGVyID0gZnVuY3Rpb24gZ2V0SG9tZUZvbGRlcih1c2VyKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJkc2NsIC4gLXJlYWQgL1VzZXJzLyIgKyB1c2VyICsgIiB8IGdyZXAgTkZTSG9tZURpcmVjdG9yeSB8IGF3ayAtRjogJ3sgcHJpbnQgJDIgfSdcbmV4aXRcbiIpOwogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICBpZiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgIT0gJycpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhyb3cgKCd1c2VyOiAnICsgdXNlciArICcgbm90IGZvdW5kJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHRoaXMuX3VzZXJzID0gZnVuY3Rpb24gKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL3Vzci9iaW4vZHNjbCcsIFsnZHNjbCcsICcuJywgJ2xpc3QnLCAnL1VzZXJzJywgJ1VuaXF1ZUlEJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdleGl0XG4nKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKCgogICAgICAgICAgICB2YXIgbGluZXMgPSBjaGlsZC5zdGRvdXQuc3RyLnNwbGl0KCdcbicpOwogICAgICAgICAgICB2YXIgdG9rZW5zLCBpOwogICAgICAgICAgICB2YXIgdXNlcnMgPSB7fTsKCiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7ICsraSkgewogICAgICAgICAgICAgICAgdG9rZW5zID0gbGluZXNbaV0uc3BsaXQoJyAnKTsKICAgICAgICAgICAgICAgIGlmICh0b2tlbnNbMF0pIHsgdXNlcnNbdG9rZW5zWzBdXSA9IHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV07IH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICh1c2Vycyk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3VpZHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL3Vzci9iaW4vZHNjbCcsIFsnZHNjbCcsICcuJywgJ2xpc3QnLCAnL1VzZXJzJywgJ1VuaXF1ZUlEJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2V4aXRcbicpOwogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwoKICAgICAgICAgICAgdmFyIGxpbmVzID0gY2hpbGQuc3Rkb3V0LnN0ci5zcGxpdCgnXG4nKTsKICAgICAgICAgICAgdmFyIHRva2VucywgaTsKICAgICAgICAgICAgdmFyIHVzZXJzID0ge307CgogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICAgIHRva2VucyA9IGxpbmVzW2ldLnNwbGl0KCcgJyk7CiAgICAgICAgICAgICAgICBpZiAodG9rZW5zWzBdKSB7IHVzZXJzW3Rva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV1dID0gdG9rZW5zWzBdOyB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAodXNlcnMpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9pZFRhYmxlID0gZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRhYmxlID0ge307CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL3Vzci9iaW4vaWQnLCBbJ2lkJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKCiAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoaWxkLnN0ZG91dC5zdHIuc3BsaXQoJ1xuJylbMF0uc3BsaXQoJyAnKTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7ICsraSkgewogICAgICAgICAgICAgICAgdmFyIHR5cGVzID0gbGluZXNbaV0uc3BsaXQoJz0nKTsKICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSB0eXBlc1sxXS5zcGxpdCgnLCcpOwogICAgICAgICAgICAgICAgdGFibGVbdHlwZXNbMF1dID0ge307CgogICAgICAgICAgICAgICAgZm9yICh2YXIgaiBpbiB0b2tlbnMpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaWRhcnIgPSB0b2tlbnNbal0uc3BsaXQoJygnKTsKICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSBpZGFyclswXTsKICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZSA9IGlkYXJyWzFdLnN1YnN0cmluZygwLCBpZGFyclsxXS5sZW5ndGggLSAxKS50cmltKCk7CiAgICAgICAgICAgICAgICAgICAgdGFibGVbdHlwZXNbMF1dW25hbWVdID0gaWQ7CiAgICAgICAgICAgICAgICAgICAgdGFibGVbdHlwZXNbMF1dW2lkXSA9IG5hbWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICh0YWJsZSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuQ3VycmVudCA9IGZ1bmN0aW9uIChjYikKICAgICAgICB7CiAgICAgICAgICAgIHZhciB1c2VycyA9IHt9OwogICAgICAgICAgICB2YXIgdGFibGUgPSB0aGlzLl9pZFRhYmxlKCk7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL3Vzci9iaW4vbGFzdCcsIFsnbGFzdCddKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CgogICAgICAgICAgICB2YXIgbGluZXMgPSBjaGlsZC5zdGRvdXQuc3RyLnNwbGl0KCdcbicpOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aCAmJiBsaW5lc1tpXS5sZW5ndGggPiAwOyArK2kpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghdXNlcnNbbGluZXNbaV0uc3BsaXQoJyAnKVswXV0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB1c2Vyc1tsaW5lc1tpXS5zcGxpdCgnICcpWzBdXSA9IHsgVXNlcm5hbWU6IGxpbmVzW2ldLnNwbGl0KCcgJylbMF0sIFN0YXRlOiBsaW5lc1tpXS5zcGxpdCgnc3RpbGwgbG9nZ2VkIGluJykubGVuZ3RoID4gMSA/ICdBY3RpdmUnIDogJ0luYWN0aXZlJywgdWlkOiB0YWJsZS51aWRbbGluZXNbaV0uc3BsaXQoJyAnKVswXV0gfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2F0Y2goZSkKICAgICAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmKHVzZXJzW2xpbmVzW2ldLnNwbGl0KCcgJylbMF1dLlN0YXRlICE9ICdBY3RpdmUnICYmIGxpbmVzW2ldLnNwbGl0KCdzdGlsbCBsb2dnZWQgaW4nKS5sZW5ndGggPiAxKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdXNlcnNbbGluZXNbaV0uc3BsaXQoJyAnKVswXV0uU3RhdGUgPSAnQWN0aXZlJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh1c2VycywgJ0FjdGl2ZScsIHsgdmFsdWU6IHNob3dBY3RpdmVPbmx5KHVzZXJzKSB9KTsKICAgICAgICAgICAgaWYgKGNiKSB7IGNiLmNhbGwodGhpcywgdXNlcnMpOyB9CiAgICAgICAgfQogICAgfQoKICAgIGlmKHByb2Nlc3MucGxhdGZvcm0gIT0gJ3dpbjMyJykgLy8gTGludXgsIE1hY09TLCBGcmVlQlNECiAgICB7CiAgICAgICAgdGhpcy5TZWxmID0gZnVuY3Rpb24gU2VsZigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy91c3IvYmluL2lkJywgWydpZCcsICctdSddKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgIHJldHVybiAocGFyc2VJbnQoY2hpbGQuc3Rkb3V0LnN0cikpOwogICAgICAgIH0KICAgICAgICB0aGlzLmlzUm9vdCA9IGZ1bmN0aW9uIGlzUm9vdCgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKHRoaXMuU2VsZigpID09IDApOwogICAgICAgIH0KICAgIH0KCgp9CmZ1bmN0aW9uIHNob3dBY3RpdmVPbmx5KHNvdXJjZSkKewogICAgdmFyIHJldFZhbCA9IFtdOwogICAgdmFyIHVuaXF1ZSA9IHt9OwogICAgdmFyIHVzZXJuYW1lcyA9IFtdOwogICAgdmFyIHRtcDsKCiAgICBmb3IgKHZhciBpIGluIHNvdXJjZSkKICAgIHsKICAgICAgICBpZiAoc291cmNlW2ldLlN0YXRlID09ICdBY3RpdmUnKQogICAgICAgIHsKICAgICAgICAgICAgcmV0VmFsLnB1c2goc291cmNlW2ldKTsKICAgICAgICAgICAgdG1wID0gKHNvdXJjZVtpXS5Eb21haW4gPyAoc291cmNlW2ldLkRvbWFpbiArICdcXCcpIDogJycpICsgc291cmNlW2ldLlVzZXJuYW1lOwogICAgICAgICAgICBpZiAoIXVuaXF1ZVt0bXBdKSB7IHVuaXF1ZVt0bXBdID0gdG1wO30KICAgICAgICB9CiAgICB9CgogICAgZm9yICh2YXIgaSBpbiB1bmlxdWUpCiAgICB7CiAgICAgICAgdXNlcm5hbWVzLnB1c2goaSk7CiAgICB9CgogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldFZhbCwgJ3VzZXJuYW1lcycsIHsgdmFsdWU6IHVzZXJuYW1lcyB9KTsKICAgIHJldHVybiAocmV0VmFsKTsKfQpmdW5jdGlvbiBnZXRUb2tlbnMoc3RyKQp7CiAgICB2YXIgY29sdW1ucyA9IFtdOwogICAgdmFyIGk7CgogICAgY29sdW1ucy5wdXNoKHN0ci5zdWJzdHJpbmcoMCwgKGk9c3RyLmluZGV4T2YoJyAnKSkpKTsKICAgIHdoaWxlIChzdHJbKytpXSA9PSAnICcpOwogICAgY29sdW1ucy5wdXNoKHN0ci5zdWJzdHJpbmcoaSwgKGk9c3RyLnN1YnN0cmluZyhpKS5pbmRleE9mKCcgJykgKyBpKSkpOwogICAgd2hpbGUgKHN0clsrK2ldID09ICcgJyk7CiAgICBjb2x1bW5zLnB1c2goc3RyLnN1YnN0cmluZyhpLCAoaT1zdHIuc3Vic3RyaW5nKGkpLmluZGV4T2YoJyAnKSArIGkpKSk7CiAgICB3aGlsZSAoc3RyWysraV0gPT0gJyAnKTsKICAgIHZhciBzdGF0dXMgPSBzdHIuc3Vic3RyaW5nKGkpLnRyaW0oKTsKICAgIGNvbHVtbnMucHVzaChzdGF0dXMpOwoKICAgIHJldHVybiAoY29sdW1ucyk7Cn0KCm1vZHVsZS5leHBvcnRzID0gbmV3IFVzZXJTZXNzaW9ucygpOwo=", 10788); - ILibBase64DecodeEx((unsigned char*)_usersessions, 58788, (unsigned char*)_usersessions + 58788); - duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "user-sessions"); duk_push_string(ctx, _usersessions + 58788); + char *_usersessions = ILibMemory_Allocate(104638, 0, NULL, NULL); + memcpy_s(_usersessions + 0, 59792, "LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciBOT1RJRllfRk9SX1RISVNfU0VTU0lPTiA9IDA7CnZhciBOT1RJRllfRk9SX0FMTF9TRVNTSU9OUyA9IDE7CnZhciBXTV9XVFNTRVNTSU9OX0NIQU5HRSA9IDB4MDJCMTsKdmFyIFdNX1BPV0VSQlJPQURDQVNUID0gMHgyMTg7CnZhciBQQlRfUE9XRVJTRVRUSU5HQ0hBTkdFID0gMHg4MDEzOwp2YXIgUEJUX0FQTVNVU1BFTkQgPSAweDQ7CnZhciBQQlRfQVBNUkVTVU1FU1VTUEVORCA9IDB4NzsKdmFyIFBCVF9BUE1SRVNVTUVBVVRPTUFUSUMgPSAweDEyOwp2YXIgUEJUX0FQTVBPV0VSU1RBVFVTQ0hBTkdFID0gMHhBOwp2YXIgUFJPQ0VTU19RVUVSWV9JTkZPUk1BVElPTiA9IDB4MDQwMDsNCnZhciBUT0tFTl9RVUVSWSA9IDB4MDAwODsNCnZhciBUb2tlblVzZXIgPSAxOwp2YXIgVG9rZW5UeXBlID0gODsKdmFyIFRva2VuU2Vzc2lvbklkID0gMTI7CnZhciBFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSID0gMTIyOw0KdmFyIEhFQVBfWkVST19NRU1PUlkgPSAweDAwMDAwMDA4Ow0KCnZhciBXVFNfQ09OU09MRV9DT05ORUNUICAgICAgICAgPSAoMHgxKTsKdmFyIFdUU19DT05TT0xFX0RJU0NPTk5FQ1QgICAgICA9ICgweDIpOwp2YXIgV1RTX1JFTU9URV9DT05ORUNUICAgICAgICAgID0gKDB4Myk7CnZhciBXVFNfUkVNT1RFX0RJU0NPTk5FQ1QgICAgICAgPSAoMHg0KTsKdmFyIFdUU19TRVNTSU9OX0xPR09OICAgICAgICAgICA9ICgweDUpOwp2YXIgV1RTX1NFU1NJT05fTE9HT0ZGICAgICAgICAgID0gKDB4Nik7CnZhciBXVFNfU0VTU0lPTl9MT0NLICAgICAgICAgICAgPSAoMHg3KTsKdmFyIFdUU19TRVNTSU9OX1VOTE9DSyAgICAgICAgICA9ICgweDgpOwp2YXIgV1RTX1NFU1NJT05fUkVNT1RFX0NPTlRST0wgID0gKDB4OSk7CnZhciBXVFNfU0VTU0lPTl9DUkVBVEUgICAgICAgICAgPSAoMHhBKTsKdmFyIFdUU19TRVNTSU9OX1RFUk1JTkFURSAgICAgICA9ICgweEIpOwoKdmFyIEdVSURfQUNEQ19QT1dFUl9TT1VSQ0U7CnZhciBHVUlEX0JBVFRFUllfUEVSQ0VOVEFHRV9SRU1BSU5JTkc7CnZhciBHVUlEX0NPTlNPTEVfRElTUExBWV9TVEFURTsKCmZ1bmN0aW9uIGNvbHVtblBhcnNlKGRhdGEsIGRlbGltaXRlcikKewogICAgdmFyIHRva2VucyA9IGRhdGEuc3BsaXQoZGVsaW1pdGVyKTsKICAgIHZhciByZXQgPSBbXTsKICAgIGZvcih2YXIgaSBpbiB0b2tlbnMpCiAgICB7CiAgICAgICAgaWYgKHRva2Vuc1tpXS5sZW5ndGggPiAwKSB7IHJldC5wdXNoKHRva2Vuc1tpXSk7IH0KICAgIH0KICAgIHJldHVybiAocmV0KTsKfQoKCmZ1bmN0aW9uIFVzZXJTZXNzaW9ucygpCnsKICAgIHRoaXMuX09iamVjdElEID0gJ3VzZXItc2Vzc2lvbnMnOwogICAgcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyLmNhbGwodGhpcywgdHJ1ZSkKICAgICAgICAuY3JlYXRlRXZlbnQoJ2NoYW5nZWQnKQogICAgICAgIC5jcmVhdGVFdmVudCgnbG9ja2VkJykKICAgICAgICAuY3JlYXRlRXZlbnQoJ3VubG9ja2VkJyk7CgogICAgdGhpcy5lbnVtZXJhdGVVc2VycyA9IGZ1bmN0aW9uIGVudW1lcmF0ZVVzZXJzKCkKICAgIHsKICAgICAgICB2YXIgcHJvbWlzZSA9IHJlcXVpcmUoJ3Byb21pc2UnKTsKICAgICAgICB2YXIgcCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChyZXMsIHJlaikKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuX19yZXNvbHZlciA9IHJlczsKICAgICAgICAgICAgdGhpcy5fX3JlamVjdG9yID0gcmVqOwogICAgICAgIH0pOwogICAgICAgIHAuX19oYW5kbGVyID0gZnVuY3Rpb24gX19oYW5kbGVyKHVzZXJzKQogICAgICAgIHsKICAgICAgICAgICAgcC5fX3Jlc29sdmVyKHVzZXJzKTsKICAgICAgICB9OwogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5DdXJyZW50KHAuX19oYW5kbGVyKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2goZSkKICAgICAgICB7CiAgICAgICAgICAgIHAuX19yZWplY3RvcihlKTsKICAgICAgICB9CiAgICAgICAgcC5wYXJlbnQgPSB0aGlzOwogICAgICAgIHJldHVybiAocCk7CiAgICB9CgogICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ3dpbjMyJykKICAgIHsKICAgICAgICB0aGlzLl9zZXJ2aWNlSG9va2VkID0gZmFsc2U7CiAgICAgICAgdGhpcy5fbWFyc2hhbCA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpOwogICAgICAgIHRoaXMuX2tlcm5lbDMyID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVOYXRpdmVQcm94eSgnS2VybmVsMzIuZGxsJyk7CiAgICAgICAgdGhpcy5fa2VybmVsMzIuQ3JlYXRlTWV0aG9kKCdHZXRMYXN0RXJyb3InKTsKICAgICAgICB0aGlzLl9rZXJuZWwzMi5DcmVhdGVNZXRob2QoJ1dUU0dldEFjdGl2ZUNvbnNvbGVTZXNzaW9uSWQnKQogICAgICAgIHRoaXMuX2tlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnQ2xvc2VIYW5kbGUnKTsKCiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB0aGlzLl93dHMgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZU5hdGl2ZVByb3h5KCdXdHNhcGkzMi5kbGwnKTsKICAgICAgICAgICAgdGhpcy5fd3RzLkNyZWF0ZU1ldGhvZCgnV1RTRW51bWVyYXRlU2Vzc2lvbnNBJyk7CiAgICAgICAgICAgIHRoaXMuX3d0cy5DcmVhdGVNZXRob2QoJ1dUU1F1ZXJ5U2Vzc2lvbkluZm9ybWF0aW9uVycpOwogICAgICAgICAgICB0aGlzLl93dHMuQ3JlYXRlTWV0aG9kKCdXVFNSZWdpc3RlclNlc3Npb25Ob3RpZmljYXRpb24nKTsKICAgICAgICAgICAgdGhpcy5fd3RzLkNyZWF0ZU1ldGhvZCgnV1RTVW5SZWdpc3RlclNlc3Npb25Ob3RpZmljYXRpb24nKTsKICAgICAgICAgICAgdGhpcy5fd3RzLkNyZWF0ZU1ldGhvZCgnV1RTRnJlZU1lbW9yeScpOwogICAgICAgIH0KICAgICAgICBjYXRjaChleGMpCiAgICAgICAgewogICAgICAgIH0KCiAgICAgICAgdGhpcy5fYWR2YXBpID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVOYXRpdmVQcm94eSgnQWR2YXBpMzIuZGxsJyk7CiAgICAgICAgdGhpcy5fYWR2YXBpLkNyZWF0ZU1ldGhvZCgnQWxsb2NhdGVBbmRJbml0aWFsaXplU2lkJyk7CiAgICAgICAgdGhpcy5fYWR2YXBpLkNyZWF0ZU1ldGhvZCgnQ2hlY2tUb2tlbk1lbWJlcnNoaXAnKTsKICAgICAgICB0aGlzLl9hZHZhcGkuQ3JlYXRlTWV0aG9kKCdGcmVlU2lkJyk7CgogICAgICAgIHRoaXMuX3VzZXIzMiA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlTmF0aXZlUHJveHkoJ3VzZXIzMi5kbGwnKTsKICAgICAgICB0aGlzLl91c2VyMzIuQ3JlYXRlTWV0aG9kKHsgbWV0aG9kOiAnUmVnaXN0ZXJQb3dlclNldHRpbmdOb3RpZmljYXRpb24nLCB0aHJlYWREaXNwYXRjaDogMX0pOwogICAgICAgIHRoaXMuX3VzZXIzMi5DcmVhdGVNZXRob2QoJ1VucmVnaXN0ZXJQb3dlclNldHRpbmdOb3RpZmljYXRpb24nKTsKICAgICAgICB0aGlzLl9ycGNydCA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlTmF0aXZlUHJveHkoJ1JwY3J0NC5kbGwnKTsKICAgICAgICB0aGlzLl9ycGNydC5DcmVhdGVNZXRob2QoJ1V1aWRGcm9tU3RyaW5nQScpOwogICAgICAgIHRoaXMuX3JwY3J0LlN0cmluZ1RvVVVJRCA9IGZ1bmN0aW9uIFN0cmluZ1RvVVVJRChndWlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJldFZhbCA9IFN0cmluZ1RvVVVJRC51cy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSgxNik7CiAgICAgICAgICAgIGlmKFN0cmluZ1RvVVVJRC51cy5fcnBjcnQuVXVpZEZyb21TdHJpbmdBKFN0cmluZ1RvVVVJRC51cy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZShndWlkKSwgcmV0VmFsKS5WYWwgPT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIChyZXRWYWwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhyb3cgKCdDb3VsZCBub3QgY29udmVydCBzdHJpbmcgdG8gVVVJRCcpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuX3JwY3J0LlN0cmluZ1RvVVVJRC51cyA9IHRoaXM7CgogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5fa2VybmVsMzIuQ3JlYXRlTWV0aG9kKCdPcGVuUHJvY2VzcycpCiAgICAgICAgICAgIHRoaXMuX2FkdmFwaS5DcmVhdGVNZXRob2QoJ09wZW5Qcm9jZXNzVG9rZW4nKTsNCiAgICAgICAgICAgIHRoaXMuX2FkdmFwaS5DcmVhdGVNZXRob2QoJ0dldFRva2VuSW5mb3JtYXRpb24nKTsNCiAgICAgICAgICAgIHRoaXMuX2FkdmFwaS5DcmVhdGVNZXRob2QoJ0xvb2t1cEFjY291bnRTaWRXJyk7DQogICAgICAgICAgICB0aGlzLl9hZHZhcGkuQ3JlYXRlTWV0aG9kKCdPcGVuVGhyZWFkVG9rZW4nKTsNCiAgICAgICAgfQogICAgICAgIGNhdGNoKGUpCiAgICAgICAgew0KICAgICAgICB9CgoKICAgICAgICBHVUlEX0FDRENfUE9XRVJfU09VUkNFID0gdGhpcy5fcnBjcnQuU3RyaW5nVG9VVUlEKCc1ZDNlOWE1OS1lOUQ1LTRiMDAtYTZiZC1mZjM0ZmY1MTY1NDgnKTsKICAgICAgICBHVUlEX0JBVFRFUllfUEVSQ0VOVEFHRV9SRU1BSU5JTkcgPSB0aGlzLl9ycGNydC5TdHJpbmdUb1VVSUQoJ2E3YWQ4MDQxLWI0NWEtNGNhZS04N2EzLWVlY2JiNDY4YTllMScpOwogICAgICAgIEdVSURfQ09OU09MRV9ESVNQTEFZX1NUQVRFID0gdGhpcy5fcnBjcnQuU3RyaW5nVG9VVUlEKCc2ZmU2OTU1Ni03MDRhLTQ3YTAtOGYyNC1jMjhkOTM2ZmRhNDcnKTsKCiAgICAgICAgdGhpcy5TZXNzaW9uU3RhdGVzID0gWydBY3RpdmUnLCAnQ29ubmVjdGVkJywgJ0Nvbm5lY3RRdWVyeScsICdTaGFkb3cnLCAnRGlzY29ubmVjdGVkJywgJ0lkbGUnLCAnTGlzdGVuaW5nJywgJ1Jlc2V0JywgJ0Rvd24nLCAnSW5pdCddOwogICAgICAgIHRoaXMuSW5mb0NsYXNzID0KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJ1dUU0luaXRpYWxQcm9ncmFtJzogMCwKICAgICAgICAgICAgICAgICdXVFNBcHBsaWNhdGlvbk5hbWUnOiAxLAogICAgICAgICAgICAgICAgJ1dUU1dvcmtpbmdEaXJlY3RvcnknOiAyLAogICAgICAgICAgICAgICAgJ1dUU09FTUlkJzogMywKICAgICAgICAgICAgICAgICdXVFNTZXNzaW9uSWQnOiA0LAogICAgICAgICAgICAgICAgJ1dUU1VzZXJOYW1lJzogNSwKICAgICAgICAgICAgICAgICdXVFNXaW5TdGF0aW9uTmFtZSc6IDYsCiAgICAgICAgICAgICAgICAnV1RTRG9tYWluTmFtZSc6IDcsCiAgICAgICAgICAgICAgICAnV1RTQ29ubmVjdFN0YXRlJzogOCwKICAgICAgICAgICAgICAgICdXVFNDbGllbnRCdWlsZE51bWJlcic6IDksCiAgICAgICAgICAgICAgICAnV1RTQ2xpZW50TmFtZSc6IDEwLAogICAgICAgICAgICAgICAgJ1dUU0NsaWVudERpcmVjdG9yeSc6IDExLAogICAgICAgICAgICAgICAgJ1dUU0NsaWVudFByb2R1Y3RJZCc6IDEyLAogICAgICAgICAgICAgICAgJ1dUU0NsaWVudEhhcmR3YXJlSWQnOiAxMywKICAgICAgICAgICAgICAgICdXVFNDbGllbnRBZGRyZXNzJzogMTQsCiAgICAgICAgICAgICAgICAnV1RTQ2xpZW50RGlzcGxheSc6IDE1LAogICAgICAgICAgICAgICAgJ1dUU0NsaWVudFByb3RvY29sVHlwZSc6IDE2LAogICAgICAgICAgICAgICAgJ1dUU0lkbGVUaW1lJzogMTcsCiAgICAgICAgICAgICAgICAnV1RTTG9nb25UaW1lJzogMTgsCiAgICAgICAgICAgICAgICAnV1RTSW5jb21pbmdCeXRlcyc6IDE5LAogICAgICAgICAgICAgICAgJ1dUU091dGdvaW5nQnl0ZXMnOiAyMCwKICAgICAgICAgICAgICAgICdXVFNJbmNvbWluZ0ZyYW1lcyc6IDIxLAogICAgICAgICAgICAgICAgJ1dUU091dGdvaW5nRnJhbWVzJzogMjIsCiAgICAgICAgICAgICAgICAnV1RTQ2xpZW50SW5mbyc6IDIzLAogICAgICAgICAgICAgICAgJ1dUU1Nlc3Npb25JbmZvJzogMjQsCiAgICAgICAgICAgICAgICAnV1RTU2Vzc2lvbkluZm9FeCc6IDI1LAogICAgICAgICAgICAgICAgJ1dUU0NvbmZpZ0luZm8nOiAyNiwKICAgICAgICAgICAgICAgICdXVFNWYWxpZGF0aW9uSW5mbyc6IDI3LAogICAgICAgICAgICAgICAgJ1dUU1Nlc3Npb25BZGRyZXNzVjQnOiAyOCwKICAgICAgICAgICAgICAgICdXVFNJc1JlbW90ZVNlc3Npb24nOiAyOQogICAgICAgICAgICB9OwoKICAgICAgICB0aGlzLmlzUm9vdCA9IGZ1bmN0aW9uIGlzUm9vdCgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgTlRBdXRob3JpdHkgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDYpOwogICAgICAgICAgICBOVEF1dGhvcml0eS50b0J1ZmZlcigpLndyaXRlSW50OCg1LCA1KTsKCiAgICAgICAgICAgIHZhciBBZG1pbmlzdHJhdG9yc0dyb3VwID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVQb2ludGVyKCk7CiAgICAgICAgICAgIHZhciBhZG1pbiA9IGZhbHNlOwoKICAgICAgICAgICAgaWYgKHRoaXMuX2FkdmFwaS5BbGxvY2F0ZUFuZEluaXRpYWxpemVTaWQoTlRBdXRob3JpdHksIDIsIDMyLCA1NDQsIDAsIDAsIDAsIDAsIDAsIDAsIEFkbWluaXN0cmF0b3JzR3JvdXApLlZhbCAhPSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbWVtYmVyID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVJbnRlZ2VyKCk7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5fYWR2YXBpLkNoZWNrVG9rZW5NZW1iZXJzaGlwKDAsIEFkbWluaXN0cmF0b3JzR3JvdXAuRGVyZWYoKSwgbWVtYmVyKS5WYWwgIT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAobWVtYmVyLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkgIT0gMCkgeyBhZG1pbiA9IHRydWU7IH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX2FkdmFwaS5GcmVlU2lkKEFkbWluaXN0cmF0b3JzR3JvdXAuRGVyZWYoKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGFkbWluOwogICAgICAgIH0KICAgICAgICB0aGlzLmdldFByb2Nlc3NPd25lck5hbWUgPSBmdW5jdGlvbiBnZXRQcm9jZXNzT3duZXJOYW1lKHBpZCkKICAgICAgICB7DQogICAgICAgICAgICB2YXIgcmV0ID0gbnVsbDsNCiAgICAgICAgICAgIHZhciBuYW1lID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSgxMDI0KTsNCiAgICAgICAgICAgIHZhciBkb21haW4gPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDEwMjQpOw0KICAgICAgICAgICAgdmFyIG5hbWVEb21haW5MZW5ndGggPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOyBuYW1lRG9tYWluTGVuZ3RoLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSgxMDI0KTsNCiAgICAgICAgICAgIHZhciBidWZmZXJMZW5ndGggPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOw0KICAgICAgICAgICAgdmFyIHNpZHR5cGUgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOw0KICAgICAgICAgICAgdmFyIHRva2VudXNlciA9IDA7DQogICAgICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVBvaW50ZXIoKTsNCg0KICAgICAgICAgICAgdmFyIGggPSB0aGlzLl9rZXJuZWwzMi5PcGVuUHJvY2VzcyhQUk9DRVNTX1FVRVJZX0lORk9STUFUSU9OLCAxLCBwaWQpOw0KICAgICAgICAgICAgaWYgKGguVmFsID09IDApIHsgdGhyb3cgKCdGYWlsZWQgdG8gcXVlcnkgcHJvY2VzcyBpZDogJyArIHBpZCk7IH0NCg0KICAgICAgICAgICAgaWYodGhpcy5fYWR2YXBpLk9wZW5Qcm9jZXNzVG9rZW4oaCwgVE9LRU5fUVVFUlksIHRva2VuKS5WYWw9PTApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5fa2VybmVsMzIuQ2xvc2VIYW5kbGUoaCk7DQogICAgICAgICAgICAgICAgdGhyb3cgKCdGYWlsZWQgdG8gUXVlcnkgUHJvY2VzcyBUb2tlbiBmb3IgcGlkOiAnICsgcGlkKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdmFyIHRzaWQgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOw0KICAgICAgICAgICAgdGhpcy5fYWR2YXBpLkdldFRva2VuSW5mb3JtYXRpb24odG9rZW4uRGVyZWYoKSwgVG9rZW5TZXNzaW9uSWQsIHRzaWQsIDQsIGJ1ZmZlckxlbmd0aCk7DQogICAgICAgICAgICB0aGlzLl9hZHZhcGkuR2V0VG9rZW5JbmZvcm1hdGlvbih0b2tlbi5EZXJlZigpLCBUb2tlblVzZXIsIHRva2VudXNlciwgMCwgYnVmZmVyTGVuZ3RoKTsNCiAgICAgICAgICAgIHRva2VudXNlciA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoYnVmZmVyTGVuZ3RoLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkpOw0KDQogICAgICAgICAgICBpZiAodGhpcy5fYWR2YXBpLkdldFRva2VuSW5mb3JtYXRpb24odG9rZW4uRGVyZWYoKSwgVG9rZW5Vc2VyLCB0b2tlbnVzZXIsIGJ1ZmZlckxlbmd0aC50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpLCBidWZmZXJMZW5ndGgpLlZhbCA9PSAwKSB7IHRocm93ICgnSW50ZXJuYWwgRXJyb3InKTsgfQ0KICAgICAgICAgICAgaWYodGhpcy5fYWR2YXBpLkxvb2t1cEFjY291bnRTaWRXKDAsIHRva2VudXNlci5EZXJlZigpLCBuYW1lLCBuYW1lRG9tYWluTGVuZ3RoLCBkb21haW4sIG5hbWVEb21haW5MZW5ndGgsIHNpZHR5cGUpLlZhbCA9PSAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRocm93ICgnTG9va3VwIEVycm9yJyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgbmFtZS5fc2l6ZSA9IDA7IGRvbWFpbi5fc2l6ZSA9IDA7DQogICAgICAgICAgICAgICAgcmV0ID0geyBuYW1lOiBuYW1lLldpZGUyVVRGOCwgZG9tYWluOiBkb21haW4uV2lkZTJVVEY4LCB0c2lkOiB0c2lkLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkgfTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdGhpcy5fa2VybmVsMzIuQ2xvc2VIYW5kbGUodG9rZW4uRGVyZWYoKSk7DQogICAgICAgICAgICB0aGlzLl9rZXJuZWwzMi5DbG9zZUhhbmRsZShoKTsNCiAgICAgICAgICAgIHJldHVybiAocmV0KTsNCiAgICAgICAgfTsKCiAgICAgICAgdGhpcy5nZXRSYXdTZXNzaW9uQXR0cmlidXRlID0gZnVuY3Rpb24gZ2V0UmF3U2Vzc2lvbkF0dHJpYnV0ZShzZXNzaW9uSWQsIGF0dHIpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBidWZmZXIgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVBvaW50ZXIoKTsKICAgICAgICAgICAgdmFyIGJ5dGVzUmV0dXJuZWQgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOwoKICAgICAgICAgICAgaWYgKHRoaXMuX3d0cy5XVFNRdWVyeVNlc3Npb25JbmZvcm1hdGlvblcoMCwgc2Vzc2lvbklkLCBhdHRyLCBidWZmZXIsIGJ5dGVzUmV0dXJuZWQpLlZhbCA9PSAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRocm93ICgnRXJyb3IgY2FsbGluZyBXVFNRdWVyeVNlc3Npb25JbmZvcm1hdGlvblc6ICcgKyB0aGlzLl9rZXJuZWwzMi5HZXRMYXN0RXJyb3IuVmFsKTsNCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBiID0gYnVmZmVyLkRlcmVmKCkuRGVyZWYoMCwgYnl0ZXNSZXR1cm5lZC50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpKS50b0J1ZmZlcigpOwogICAgICAgICAgICB2YXIgcmV0ID0gQnVmZmVyLmFsbG9jKGJ5dGVzUmV0dXJuZWQudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKSk7CiAgICAgICAgICAgIGIuY29weShyZXQpOwogICAgICAgICAgICB0aGlzLl93dHMuV1RTRnJlZU1lbW9yeShidWZmZXIuRGVyZWYoKSk7CiAgICAgICAgICAgIHJldHVybiAocmV0KTsNCiAgICAgICAgfQogICAgICAgIHRoaXMuZ2V0U2Vzc2lvbkF0dHJpYnV0ZSA9IGZ1bmN0aW9uIGdldFNlc3Npb25BdHRyaWJ1dGUoc2Vzc2lvbklkLCBhdHRyKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGJ1ZmZlciA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlUG9pbnRlcigpOwogICAgICAgICAgICB2YXIgYnl0ZXNSZXR1cm5lZCA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7CgogICAgICAgICAgICBpZiAodGhpcy5fd3RzLldUU1F1ZXJ5U2Vzc2lvbkluZm9ybWF0aW9uVygwLCBzZXNzaW9uSWQsIGF0dHIsIGJ1ZmZlciwgYnl0ZXNSZXR1cm5lZCkuVmFsID09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRocm93ICgnRXJyb3IgY2FsbGluZyBXVFNRdWVyeVNlc3Npb25JbmZvcm1hdGlvblc6ICcgKyB0aGlzLl9rZXJuZWwzMi5HZXRMYXN0RXJyb3IuVmFsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHJldFZhbCA9IGJ1ZmZlci5EZXJlZigpLldpZGUyVVRGODsKCiAgICAgICAgICAgIHRoaXMuX3d0cy5XVFNGcmVlTWVtb3J5KGJ1ZmZlci5EZXJlZigpKTsKICAgICAgICAgICAgcmV0dXJuIChyZXRWYWwpOwogICAgICAgIH07CiAgICAgICAgdGhpcy5jb25zb2xlVWlkID0gZnVuY3Rpb24gY29uc29sZVVpZCgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaWQgPSB0aGlzLl9rZXJuZWwzMi5XVFNHZXRBY3RpdmVDb25zb2xlU2Vzc2lvbklkKCkuVmFsOwogICAgICAgICAgICBpZihpZD09MHhGRkZGRkZGRikge3Rocm93KCdOb2JvZHkgbG9nZ2VkIGluJyk7fQogICAgICAgICAgICByZXR1cm4gKGlkKTsKICAgICAgICB9OwogICAgICAgIHRoaXMuZ2V0VXNlcm5hbWUgPSBmdW5jdGlvbiBnZXRVc2VybmFtZSh1aWQpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKHRoaXMuZ2V0U2Vzc2lvbkF0dHJpYnV0ZSh1aWQsIHRoaXMuSW5mb0NsYXNzLldUU1VzZXJOYW1lKSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuQ3VycmVudCA9IGZ1bmN0aW9uIEN1cnJlbnQoY2IpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcmV0VmFsID0ge307CiAgICAgICAgICAgIHZhciBwaW5mbyA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlUG9pbnRlcigpOwogICAgICAgICAgICB2YXIgY291bnQgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOwogICAgICAgICAgICBpZiAodGhpcy5fd3RzLldUU0VudW1lcmF0ZVNlc3Npb25zQSgwLCAwLCAxLCBwaW5mbywgY291bnQpLlZhbCA9PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aHJvdyAoJ0Vycm9yIGNhbGxpbmcgV1RTRW51bWVyYXRlU2Vzc2lvbnNBOiAnICsgdGhpcy5fa2VybmVsMzIuR2V0TGFzdEVycm9yKCkuVmFsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudC50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpIDsgKytpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaW5mbyA9IHBpbmZvLkRlcmVmKCkuRGVyZWYoaSAqICh0aGlzLl9tYXJzaGFsLlBvaW50ZXJTaXplID09IDQgPyAxMiA6IDI0KSwgdGhpcy5fbWFyc2hhbC5Qb2ludGVyU2l6ZSA9PSA0ID8gMTIgOiAyNCk7CiAgICAgICAgICAgICAgICB2YXIgaiA9IHsgU2Vzc2lvbklkOiBpbmZvLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkgfTsKICAgICAgICAgICAgICAgIGouU3RhdGlvbk5hbWUgPSBpbmZvLkRlcmVmKHRoaXMuX21hcnNoYWwuUG9pbnRlclNpemUgPT0gNCA/IDQgOiA4LCB0aGlzLl9tYXJzaGFsLlBvaW50ZXJTaXplKS5EZXJlZigpLlN0cmlu", 16000); + memcpy_s(_usersessions + 16000, 43792, "ZzsKICAgICAgICAgICAgICAgIGouU3RhdGUgPSB0aGlzLlNlc3Npb25TdGF0ZXNbaW5mby5EZXJlZih0aGlzLl9tYXJzaGFsLlBvaW50ZXJTaXplID09IDQgPyA4IDogMTYsIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCldOwogICAgICAgICAgICAgICAgaWYgKGouU3RhdGUgPT0gJ0FjdGl2ZScpIHsKICAgICAgICAgICAgICAgICAgICBqLlVzZXJuYW1lID0gdGhpcy5nZXRTZXNzaW9uQXR0cmlidXRlKGouU2Vzc2lvbklkLCB0aGlzLkluZm9DbGFzcy5XVFNVc2VyTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgai5Eb21haW4gPSB0aGlzLmdldFNlc3Npb25BdHRyaWJ1dGUoai5TZXNzaW9uSWQsIHRoaXMuSW5mb0NsYXNzLldUU0RvbWFpbk5hbWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0VmFsW2ouU2Vzc2lvbklkXSA9IGo7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuX3d0cy5XVFNGcmVlTWVtb3J5KHBpbmZvLkRlcmVmKCkpOwoKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldFZhbCwgJ0FjdGl2ZScsIHsgdmFsdWU6IHNob3dBY3RpdmVPbmx5KHJldFZhbCkgfSk7CiAgICAgICAgICAgIGlmIChjYikgeyBjYihyZXRWYWwpOyB9CiAgICAgICAgICAgIHJldHVybiAocmV0VmFsKTsKICAgICAgICB9OwoKCiAgICAgICAgLy8gV2UgbmVlZCB0byBzcGluIHVwIGEgbWVzc2FnZSBwdW1wLCBhbmQgZmV0Y2ggYSB3aW5kb3cgaGFuZGxlCiAgICAgICAgdmFyIG1lc3NhZ2VfcHVtcCA9IHJlcXVpcmUoJ3dpbi1tZXNzYWdlLXB1bXAnKTsKICAgICAgICB0aGlzLl9tZXNzYWdlcHVtcCA9IG5ldyBtZXNzYWdlX3B1bXAoeyBmaWx0ZXI6IFdNX1dUU1NFU1NJT05fQ0hBTkdFIH0pOyB0aGlzLl9tZXNzYWdlcHVtcC5wYXJlbnQgPSB0aGlzOyAgICAgCiAgICAgICAgdGhpcy5fbWVzc2FnZXB1bXAub24oJ2V4aXQnLCBmdW5jdGlvbiAoY29kZSkgeyB0aGlzLnBhcmVudC5fd3RzLldUU1VuUmVnaXN0ZXJTZXNzaW9uTm90aWZpY2F0aW9uKHRoaXMucGFyZW50Lmh3bmQpOyB9KTsKICAgICAgICB0aGlzLl9tZXNzYWdlcHVtcC5vbignaHduZCcsIGZ1bmN0aW9uIChoKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5wYXJlbnQuaHduZCA9IGg7CgogICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHlpZWxkLCBhbmQgZG8gdGhpcyBpbiB0aGUgbmV4dCBldmVudCBsb29wIHBhc3MsIGJlY3Vhc2Ugd2UgZG9uJ3Qgd2FudCB0byBjYWxsICdSZWdpc3RlclBvd2VyU2V0dGluZ05vdGlmaWNhdGlvbicKICAgICAgICAgICAgLy8gZnJvbSB0aGUgbWVzc2FnZXB1bXAgJ3RocmVhZCcsIGJlY2F1c2Ugd2UgYXJlIGFjdHVhbGx5IG9uIHRoZSBtaWNyb3N0YWNrIHRocmVhZCwgc3VjaCB0aGF0IHRoZSBtZXNzYWdlIHB1bXAgdGhyZWFkLCBpcyBob2xkaW5nCiAgICAgICAgICAgIC8vIG9uIGEgc2VtYXBob3JlIGZvciB1cyB0byByZXR1cm4uIElmIHdlIGNhbGwgbm93LCB3ZSBtYXkgZGVhZGxvY2sgb24gV2luZG93cyA3LCBiZWN1YXNlIGl0IHdpbGwgdHJ5IHRvIG5vdGlmeSBpbW1lZGlhdGVseQogICAgICAgICAgICB0aGlzLmltbWVkaWF0ZSA9IHNldEltbWVkaWF0ZShmdW5jdGlvbiAoc2VsZikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSBhIHdpbmRvdyBoYW5kbGUsIHdlIGNhbiByZWdpc3RlciBpdCB0byByZWNlaXZlIFdpbmRvd3MgTWVzc2FnZXMKICAgICAgICAgICAgICAgIGlmIChzZWxmLnBhcmVudC5fd3RzKSB7IHNlbGYucGFyZW50Ll93dHMuV1RTUmVnaXN0ZXJTZXNzaW9uTm90aWZpY2F0aW9uKHNlbGYucGFyZW50Lmh3bmQsIE5PVElGWV9GT1JfQUxMX1NFU1NJT05TKTsgfQogICAgICAgICAgICAgICAgc2VsZi5wYXJlbnQuX3VzZXIzMi5BQ0RDX0ggPSBzZWxmLnBhcmVudC5fdXNlcjMyLlJlZ2lzdGVyUG93ZXJTZXR0aW5nTm90aWZpY2F0aW9uKHNlbGYucGFyZW50Lmh3bmQsIEdVSURfQUNEQ19QT1dFUl9TT1VSQ0UsIDApOwogICAgICAgICAgICAgICAgc2VsZi5wYXJlbnQuX3VzZXIzMi5CQVRUX0ggPSBzZWxmLnBhcmVudC5fdXNlcjMyLlJlZ2lzdGVyUG93ZXJTZXR0aW5nTm90aWZpY2F0aW9uKHNlbGYucGFyZW50Lmh3bmQsIEdVSURfQkFUVEVSWV9QRVJDRU5UQUdFX1JFTUFJTklORywgMCk7CiAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5fdXNlcjMyLkRJU1BfSCA9IHNlbGYucGFyZW50Ll91c2VyMzIuUmVnaXN0ZXJQb3dlclNldHRpbmdOb3RpZmljYXRpb24oc2VsZi5wYXJlbnQuaHduZCwgR1VJRF9DT05TT0xFX0RJU1BMQVlfU1RBVEUsIDApOwogICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhzZWxmLnBhcmVudC5fdXNlcjMyLkFDRENfSC5WYWwsIHNlbGYucGFyZW50Ll91c2VyMzIuQkFUVF9ILlZhbCwgc2VsZi5wYXJlbnQuX3VzZXIzMi5ESVNQX0guVmFsKTsKICAgICAgICAgICAgfSwgdGhpcyk7CiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5fbWVzc2FnZXB1bXAub24oJ21lc3NhZ2UnLCBmdW5jdGlvbiAobXNnKQogICAgICAgIHsKICAgICAgICAgICAgc3dpdGNoKG1zZy5tZXNzYWdlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlIFdNX1dUU1NFU1NJT05fQ0hBTkdFOgogICAgICAgICAgICAgICAgICAgIHN3aXRjaChtc2cud3BhcmFtKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXVFNfU0VTU0lPTl9MT0NLOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuZW51bWVyYXRlVXNlcnMoKS50aGVuKGZ1bmN0aW9uICh1c2VycykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlcnNbbXNnLmxwYXJhbV0pIHsgdGhpcy5wYXJlbnQuZW1pdCgnbG9ja2VkJywgdXNlcnNbbXNnLmxwYXJhbV0pOyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdUU19TRVNTSU9OX1VOTE9DSzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LmVudW1lcmF0ZVVzZXJzKCkudGhlbihmdW5jdGlvbiAodXNlcnMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZXJzW21zZy5scGFyYW1dKSB7IHRoaXMucGFyZW50LmVtaXQoJ3VubG9ja2VkJywgdXNlcnNbbXNnLmxwYXJhbV0pOyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdUU19TRVNTSU9OX0xPR09OOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdUU19TRVNTSU9OX0xPR09GRjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LmVtaXQoJ2NoYW5nZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgV01fUE9XRVJCUk9BRENBU1Q6CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG1zZy53cGFyYW0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1dNX1BPV0VSQlJPQURDQVNUIFtVTktOT1dOIHdwYXJhbV06ICcgKyBtc2cud3BhcmFtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBCVF9BUE1TVVNQRU5EOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgncG93ZXItbW9uaXRvcicpLmVtaXQoJ3N4JywgJ1NMRUVQJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQQlRfQVBNUkVTVU1FQVVUT01BVElDOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgncG93ZXItbW9uaXRvcicpLmVtaXQoJ3N4JywgJ1JFU1VNRV9OT05fSU5URVJBQ1RJVkUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBCVF9BUE1SRVNVTUVTVVNQRU5EOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgncG93ZXItbW9uaXRvcicpLmVtaXQoJ3N4JywgJ1JFU1VNRV9JTlRFUkFDVElWRScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUEJUX0FQTVBPV0VSU1RBVFVTQ0hBTkdFOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgncG93ZXItbW9uaXRvcicpLmVtaXQoJ2NoYW5nZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBCVF9QT1dFUlNFVFRJTkdDSEFOR0U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbHBhcmFtID0gdGhpcy5wYXJlbnQuX21hcnNoYWwuQ3JlYXRlUG9pbnRlcihCdWZmZXIuZnJvbShtc2cubHBhcmFtX2hleCwgJ2hleCcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0gbHBhcmFtLkRlcmVmKDIwLCBscGFyYW0uRGVyZWYoMTYsIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKDApKS50b0J1ZmZlcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGxwYXJhbS5EZXJlZigwLCAxNikudG9CdWZmZXIoKS50b1N0cmluZygnaGV4JykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBHVUlEX0FDRENfUE9XRVJfU09VUkNFLkRlcmVmKDAsIDE2KS50b0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGRhdGEucmVhZFVJbnQzMkxFKDApKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgncG93ZXItbW9uaXRvcicpLmVtaXQoJ2FjZGMnLCAnQUMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnYWNkYycsICdCQVRURVJZJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgncG93ZXItbW9uaXRvcicpLmVtaXQoJ2FjZGMnLCAnSE9UJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBHVUlEX0JBVFRFUllfUEVSQ0VOVEFHRV9SRU1BSU5JTkcuRGVyZWYoMCwgMTYpLnRvQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnYmF0dGVyeUxldmVsJywgZGF0YS5yZWFkVUludDMyTEUoMCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEdVSURfQ09OU09MRV9ESVNQTEFZX1NUQVRFLkRlcmVmKDAsIDE2KS50b0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGRhdGEucmVhZFVJbnQzMkxFKDApKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgncG93ZXItbW9uaXRvcicpLmVtaXQoJ2Rpc3BsYXknLCAnT0ZGJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgncG93ZXItbW9uaXRvcicpLmVtaXQoJ2Rpc3BsYXknLCAnT04nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnZGlzcGxheScsICdESU1NRUQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KICAgIGVsc2UgaWYocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnbGludXgnIHx8IHByb2Nlc3MucGxhdGZvcm0gPT0gJ2ZyZWVic2QnKQogICAgewogICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdsaW51eCcpCiAgICAgICAgewogICAgICAgICAgICB2YXIgZGJ1cyA9IHJlcXVpcmUoJ2xpbnV4LWRidXMnKTsKICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ2ZzJykud2F0Y2gpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2xpbnV4V2F0Y2hlciA9IHJlcXVpcmUoJ2ZzJykud2F0Y2goJy92YXIvcnVuL3V0bXAnKTsKICAgICAgICAgICAgICAgIHRoaXMuX2xpbnV4V2F0Y2hlci51c2VyX3Nlc3Npb24gPSB0aGlzOwogICAgICAgICAgICAgICAgdGhpcy5fbGludXhXYXRjaGVyLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICAgICAgICAgIHRoaXMudXNlcl9zZXNzaW9uLmVtaXQoJ2NoYW5nZWQnKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuQ3VycmVudCA9IGZ1bmN0aW9uIEN1cnJlbnQoY2IpIHsKICAgICAgICAgICAgICAgIHZhciByZXRWYWwgPSB7fTsKICAgICAgICAgICAgICAgIHJldFZhbC5fT2JqZWN0SUQgPSAnVXNlclNlc3Npb24nCiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0VmFsLCAnX2NhbGxiYWNrJywgeyB2YWx1ZTogY2IgfSk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0VmFsLCAnX2NoaWxkJywgeyB2YWx1ZTogcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvdXNyL2Jpbi9sYXN0JywgWydsYXN0JywgJy1mJywgJy92YXIvcnVuL3V0bXAnXSkgfSk7CgogICAgICAgICAgICAgICAgcmV0VmFsLl9jaGlsZC5QYXJlbnQgPSByZXRWYWw7CiAgICAgICAgICAgICAgICByZXRWYWwuX2NoaWxkLl90eHQgPSAnJzsKICAgICAgICAgICAgICAgIHJldFZhbC5fY2hpbGQub24oJ2V4aXQnLCBmdW5jdGlvbiAoY29kZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBsaW5lcyA9IHRoaXMuX3R4dC5zcGxpdCgnXG4nKTsKICAgICAgICAgICAgICAgICAgICB2YXIgc2Vzc2lvbnMgPSBbXTsKICAgICAgICAgICAgICAgICAgICB2YXIgdXNlcnMgPSB7fTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBsaW5lcykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZXNbaV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBnZXRUb2tlbnMobGluZXNbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSB7IFVzZXJuYW1lOiB0b2tlbnNbMF0sIFNlc3Npb25JZDogdG9rZW5zWzFdIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbnNbM10uaW5jbHVkZXMoJ3N0aWxsIGxvZ2dlZCBpbicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5TdGF0ZSA9ICdBY3RpdmUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5MYXN0QWN0aXZlID0gdG9rZW5zWzNdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25zLnB1c2gocyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbnMucG9wKCk7CgoKICAgICAgICAgICAgICAgICAgICB2YXIgdXNlcm5hbWVzID0ge307CiAgICAgICAgICAgICAgICAgICAgdmFyIHByb21pc2VzID0gW107CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gc2Vzc2lvbnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb25zW2ldLlVzZXJuYW1lICE9ICdyZWJvb3QnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Vyc1tzZXNzaW9uc1tpXS5TZXNzaW9uSWRdID0gc2Vzc2lvbnNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlcm5hbWVzW3Nlc3Npb25zW2ldLlVzZXJuYW1lXSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWVzW3Nlc3Npb25zW2ldLlVzZXJuYW1lXSA9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwcm9taXNlJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh1c2VycywgJ0FjdGl2ZScsIHsgdmFsdWU6IHNob3dBY3RpdmVPbmx5KHVzZXJzKSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuUGFyZW50Ll9jYWxsYmFjaykgeyB0aGlzLlBhcmVudC5fY2FsbGJhY2suY2FsbCh0aGlzLlBhcmVudCwgdXNlcnMpOyB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciBwcm9taXNlID0gcmVxdWlyZSgncHJvbWlzZScpOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gdXNlcm5hbWVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gbmV3IHByb21pc2UoZnVuY3Rpb24gKHJlcywgcmVqKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9fdXNlcm5hbWUgPSBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fX3Jlc29sdmVyID0gcmVzOyB0aGlzLl9fcmVqZWN0b3IgPSByZWo7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9fY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy91c3IvYmluL2lkJywgWydpZCcsICctdScsIG5dKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX19jaGlsZC5wcm9taXNlID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX19jaGlsZC5zdGRvdXQuX3R4dCA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fX2NoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLl90eHQgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9fY2hpbGQub24oJ2V4aXQnLCBmdW5jdGlvbiAoY29kZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KHRoaXMuc3Rkb3V0Ll90eHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuX19yZWplY3RvcignaW52YWxpZCB1aWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gcGFyc2VJbnQodGhpcy5zdGRvdXQuX3R4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlLl9fcmVzb2x2ZXIoaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBwcm9taXNlLmFsbChwcm9taXNlcykudGhlbihmdW5jdGlvbiAocGxpc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9uZQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBwbGlzdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVbcGxpc3RbaV0uX191c2VybmFtZV0gPSBwbGlzdFtpXS5faW50ZXJuYWwuY29tcGxldGVkQXJnc1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIHVzZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Vyc1tpXS51aWQgPSB0YWJsZVt1c2Vyc1tpXS5Vc2VybmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHVzZXJzLCAnQWN0aXZlJywgeyB2YWx1ZTogc2hvd0FjdGl2ZU9ubHkodXNlcnMpIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0VmFsLl9jYWxsYmFjaykgeyByZXRWYWwuX2NhbGxiYWNrLmNhbGwocmV0VmFsLCB1c2Vycyk7IH0KICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZhaWxlZAogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodXNlcnMsICdBY3RpdmUnLCB7IHZhbHVlOiBzaG93QWN0aXZlT25seSh1c2VycykgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXRWYWwuX2NhbGxiYWNrKSB7IHJldFZhbC5fY2FsbGJhY2suY2FsbChyZXRWYWwsIHVzZXJzKTsgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXRWYWwuX2NoaWxkLnN0ZG91dC5QYXJl", 16000); + memcpy_s(_usersessions + 32000, 27792, "bnQgPSByZXRWYWwuX2NoaWxkOwogICAgICAgICAgICAgICAgcmV0VmFsLl9jaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5QYXJlbnQuX3R4dCArPSBjaHVuay50b1N0cmluZygpOyB9KTsKCiAgICAgICAgICAgICAgICByZXR1cm4gKHJldFZhbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fcmVjaGVja0xvZ2dlZEluVXNlcnMgPSBmdW5jdGlvbiBfcmVjaGVja0xvZ2dlZEluVXNlcnMoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLmVudW1lcmF0ZVVzZXJzKCkudGhlbihmdW5jdGlvbiAodSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodS5BY3RpdmUubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBhbHJlYWR5IGEgdXNlciBsb2dnZWQgaW4sIHNvIHdlIGNhbiBtb25pdG9yIERCVVMgZm9yIGxvY2svdW5sb2NrCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudC5fbGludXhfbG9ja193YXRjaGVyICE9IG51bGwgJiYgdGhpcy5wYXJlbnQuX2xpbnV4X2xvY2tfd2F0Y2hlci51aWQgIT0gdS5BY3RpdmVbMF0udWlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5wYXJlbnQuX2xpbnV4X2xvY2tfd2F0Y2hlcjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5fbGludXhfbG9ja193YXRjaGVyID0gbmV3IGRidXMocHJvY2Vzcy5lbnZbJ1hER19DVVJSRU5UX0RFU0tUT1AnXSA9PSAnVW5pdHknID8gJ2NvbS51YnVudHUuVXBzdGFydDBfNicgOiAnb3JnLmdub21lLlNjcmVlblNhdmVyJywgdS5BY3RpdmVbMF0udWlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuX2xpbnV4X2xvY2tfd2F0Y2hlci51c2VyX3Nlc3Npb24gPSB0aGlzLnBhcmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuX2xpbnV4X2xvY2tfd2F0Y2hlci5vbignc2lnbmFsJywgZnVuY3Rpb24gKHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gdGhpcy51c2VyX3Nlc3Npb24uZW51bWVyYXRlVXNlcnMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuc2lnbmFsRGF0YSA9IHMuZGF0YVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAudGhlbihmdW5jdGlvbiAodSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5zaWduYWxEYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgdHJ1ZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGVza3RvcC1sb2NrJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LmVtaXQoJ2xvY2tlZCcsIHUuQWN0aXZlWzBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGZhbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkZXNrdG9wLXVubG9jayc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5lbWl0KCd1bmxvY2tlZCcsIHUuQWN0aXZlWzBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5wYXJlbnQuX2xpbnV4X2xvY2tfd2F0Y2hlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnBhcmVudC5fbGludXhfbG9ja193YXRjaGVyOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy5nZXRVaWRDb25maWcgPSBmdW5jdGlvbiBnZXRVaWRDb25maWcoKSB7CiAgICAgICAgICAgICAgICB2YXIgcmV0ID0ge307CiAgICAgICAgICAgICAgICB2YXIgY2ZnID0gcmVxdWlyZSgnZnMnKS5yZWFkRmlsZVN5bmMoJy9ldGMvbG9naW4uZGVmcycpLnRvU3RyaW5nKCkuc3BsaXQoJ1xuJyk7CiAgICAgICAgICAgICAgICB2YXIgdG9rZW5zOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBjZmcpIHsKICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSBjb2x1bW5QYXJzZShjZmdbaV0sICdcdCcpOyAvL2NvbnNvbGUubG9nKHRva2Vucyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2Vuc1swXSA9PSAnVUlEX01JTicpIHsgcmV0Lk1JTiA9IHBhcnNlSW50KHRva2Vuc1sxXSk7IH0KICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5zWzBdID09ICdVSURfTUFYJykgeyByZXQuTUFYID0gcGFyc2VJbnQodG9rZW5zWzFdKTsgfQogICAgICAgICAgICAgICAgICAgIGlmIChyZXQuTUlOICE9IG51bGwgJiYgcmV0Lk1BWCAhPSBudWxsKSB7IGJyZWFrOyB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gKHJldCk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMub24oJ2NoYW5nZWQnLCB0aGlzLl9yZWNoZWNrTG9nZ2VkSW5Vc2Vycyk7IC8vIEZvciBsaW51eCBMb2NrL1VubG9jayBtb25pdG9yaW5nLCB3ZSBuZWVkIHRvIHdhdGNoIGZvciBMb2dPbi9Mb2dPZmYsIGFuZCBrZWVwIHRyYWNrIG9mIHRoZSBVSUQuCgogICAgICAgICAgICAvLyBGaXJzdCBzdGVwLCBpcyB0byBzZWUgaWYgdGhlcmUgaXMgYSB1c2VyIGxvZ2dlZCBpbjoKICAgICAgICAgICAgdGhpcy5fcmVjaGVja0xvZ2dlZEluVXNlcnMoKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5taW5VaWQgPSAgZnVuY3Rpb24gbWluVWlkKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAvZXRjL2xvZ2luLmRlZnMgfCBncmVwIFVJRF8gfCBhd2sgJ3sgaWYoJDE9PVwiVUlEX01JTlwiKSB7IHByaW50ICQyOyB9IH0nXG5leGl0XG4iKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgcmV0dXJuIChwYXJzZUludChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSkgPj0gMCA/IHBhcnNlSW50KGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKSA6IDUwMCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3VzZXJzID0gZnVuY3Rpb24gX3VzZXJzKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiZ2V0ZW50IHBhc3N3ZCB8IGF3ayAtRjogJ3sgaWYoJDM+PTApIHsgcHJpbnRmIFwiJXM6JXNcXG5cIiwgJDEsICQzOyB9IH0nXG5leGl0XG4iKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKCiAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoaWxkLnN0ZG91dC5zdHIuc3BsaXQoJ1xuJyk7CiAgICAgICAgICAgIHZhciByZXQgPSB7fSwgdG9rZW5zOwogICAgICAgICAgICBmb3IgKHZhciBsbiBpbiBsaW5lcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW5zID0gbGluZXNbbG5dLnNwbGl0KCc6Jyk7CiAgICAgICAgICAgICAgICBpZiAodG9rZW5zWzBdKSB7IHJldFt0b2tlbnNbMF1dID0gdG9rZW5zWzFdOyB9ICAgICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKHJldCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3VpZHMgPSBmdW5jdGlvbiBfdWlkcygpIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJnZXRlbnQgcGFzc3dkIHwgYXdrIC1GOiAneyBpZigkMz49MCkgeyBwcmludGYgXCIlczolc1xcblwiLCAkMSwgJDM7IH0gfSdcbmV4aXRcbiIpOwogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwoKICAgICAgICAgICAgdmFyIGxpbmVzID0gY2hpbGQuc3Rkb3V0LnN0ci5zcGxpdCgnXG4nKTsKICAgICAgICAgICAgdmFyIHJldCA9IHt9LCB0b2tlbnM7CiAgICAgICAgICAgIGZvciAodmFyIGxuIGluIGxpbmVzKSB7CiAgICAgICAgICAgICAgICB0b2tlbnMgPSBsaW5lc1tsbl0uc3BsaXQoJzonKTsKICAgICAgICAgICAgICAgIGlmICh0b2tlbnNbMF0pIHsgcmV0W3Rva2Vuc1sxXV0gPSB0b2tlbnNbMF07IH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKHJldCk7CiAgICAgICAgfQogICAgICAgIHRoaXMubG9naW5VaWRzID0gZnVuY3Rpb24gbG9naW5VaWRzKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBtaW4gPSB0aGlzLm1pblVpZCgpOwogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdnZXRlbnQgcGFzc3dkIHwgYXdrIC1GOiBcJ3sgaWYoJDMgPj0gJyArIG1pbiArICcpIHsgYT1zcGxpdCgkNyxiLCIvIik7IGlmKGJbYV0hPSJub2xvZ2luIikgeyBwcmludCAkMzsgfSB9fVwnIHwgdHIgIlxcbiIgIlxcLCIgfCBhd2sgXCd7IHByaW50ZiAiWyVzXSIsICQwOyB9XCdcbmV4aXRcbicpOwogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICByZXR1cm4gKEpTT04ucGFyc2UoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkucmVwbGFjZSgnLF0nLCddJykpKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5jb25zb2xlVWlkID0gZnVuY3Rpb24gY29uc29sZVVpZCgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCd3aG9cbmV4aXRcbicpOwogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwoKICAgICAgICAgICAgaWYgKGNoaWxkLnN0ZGVyci5zdHIgIT0gJycpIHsgcmV0dXJuICgwKTsgfQoKICAgICAgICAgICAgdmFyIGxpbmVzID0gY2hpbGQuc3Rkb3V0LnN0ci5zcGxpdCgnXG4nKTsKICAgICAgICAgICAgdmFyIHRva2VucywgaSwgajsKICAgICAgICAgICAgZm9yIChpIGluIGxpbmVzKSB7CiAgICAgICAgICAgICAgICB0b2tlbnMgPSBsaW5lc1tpXS5zcGxpdCgnICcpOwogICAgICAgICAgICAgICAgZm9yIChqID0gMTsgaiA8IHRva2Vucy5sZW5ndGg7ICsraikgewogICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbnNbal0ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHBhcnNlSW50KHRoaXMuX3VzZXJzKClbdG9rZW5zWzBdXSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB0aHJvdyAoJ25vYm9keSBsb2dnZWQgaW50byBjb25zb2xlJyk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHRoaXMuZ2V0SG9tZUZvbGRlciA9IGZ1bmN0aW9uIGdldEhvbWVGb2xkZXIoaWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImdldGVudCBwYXNzd2QgIiArIGlkICsgIiB8IGF3ayAtRjogJ3twcmludCAkNn0nXG5leGl0XG4iKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuZ2V0VWlkID0gZnVuY3Rpb24gZ2V0VWlkKHVzZXJuYW1lKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJnZXRlbnQgcGFzc3dkIFwiIiArIHVzZXJuYW1lICsgIlwiIHwgYXdrIC1GOiAne3ByaW50ICQzfSdcbmV4aXRcbiIpOwogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwoKICAgICAgICAgICAgdmFyIHJldCA9IHBhcnNlSW50KGNoaWxkLnN0ZG91dC5zdHIpOyAgICAgICAgICAgIAogICAgICAgICAgICBpZiAocmV0ID49IDApIHsgcmV0dXJuIChyZXQpOyB9CiAgICAgICAgICAgIHRocm93ICgndXNlcm5hbWU6ICcgKyB1c2VybmFtZSArICcgTk9UIEZPVU5EJyk7CiAgICAgICAgfTsKICAgICAgICB0aGlzLmdldFVzZXJuYW1lID0gZnVuY3Rpb24gZ2V0VXNlcm5hbWUodWlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJnZXRlbnQgcGFzc3dkICIgKyB1aWQgKyAiIHwgYXdrIC1GOiAne3ByaW50ICQxfSdcbmV4aXRcbiIpOwogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICBpZiAoY2hpbGQuc3Rkb3V0LnN0ci5sZW5ndGggPiAwKSB7IHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOyB9CiAgICAgICAgICAgIHRocm93ICgndWlkOiAnICsgdWlkICsgJyBOT1QgRk9VTkQnKTsKICAgICAgICB9OwogICAgICAgIHRoaXMuZ2V0R3JvdXBuYW1lID0gZnVuY3Rpb24gZ2V0R3JvdXBuYW1lKGdpZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiZ2V0ZW50IGdyb3VwICIgKyBnaWQgKyAiIHwgYXdrIC1GOiAne3ByaW50ICQxfSdcbmV4aXRcbiIpOwogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICBpZiAoY2hpbGQuc3Rkb3V0LnN0ci5sZW5ndGggPiAwKSB7IHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOyB9CiAgICAgICAgICAgIHRocm93ICgnZ2lkOiAnICsgZ2lkICsgJyBOT1QgRk9VTkQnKTsKICAgICAgICB9OwogICAgICAgIHRoaXMud2hvYW1pID0gZnVuY3Rpb24gd2hvYW1pKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgid2hvYW1pXG5leGl0XG4iKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7CiAgICAgICAgfTsKICAgICAgICB0aGlzLmdldEVudkZyb21QaWQgPSBmdW5jdGlvbiBnZXRFbnZGcm9tUGlkKHBpZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXQgPSB7fTsKICAgICAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2xpbnV4JykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHBzLCBwc3gsIHYsIHZzID0gMDsKICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHBzID0gcmVxdWlyZSgnZnMnKS5yZWFkRmlsZVN5bmMoJy9wcm9jLycgKyBwaWQgKyAnL2Vudmlyb24nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChwc2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZXQpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGZvciAocHN4ID0gMDsgcHN4IDwgcHMubGVuZ3RoOyArK3BzeCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAocHNbcHN4XSA9PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHBzLnNsaWNlKHZzLCBwc3gpLnRvU3RyaW5nKCkuc3BsaXQoJz0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0W3ZbMF1dID0gdlsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgdnMgPSBwc3ggKyAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdmcmVlYnNkJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJwcm9jc3RhdCAtZSAiICsgcGlkICsgIiB8IGdyZXAgIiArIHBpZCArICIgfCBhd2sgJ3sgJDE9XCJcIjsgJDI9XCJcIjsgcHJpbnQgJDAgfScgfCB0ciBcIlxcIFwiIFwiXFxuXCJcbmV4aXRcbiIpOyAKICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CgkJCiAgICAgICAgICAgICAgICB2YXIgZW52OwogICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpLnNwbGl0KCdcbicpOwogICAgICAgICAgICAgICAgZm9yKHZhciBpIGluIHRva2VucykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlbnYgPSB0b2tlbnNbaV0uc3BsaXQoJz0nKTsKICAgICAgICAgICAgICAgICAgICByZXRbZW52WzBdXSA9IGVudlsxXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKHJldCk7CiAgICAgICAgfTsKICAgICAgICB0aGlzLmZpbmRFbnYgPSBmdW5jdGlvbiBmaW5kRW52KHVpZCwgZW52KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHVuYW1lID0gdGhpcy5nZXRVc2VybmFtZSh1aWQpOwogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoInBzICIgKyAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZnJlZWJzZCcgPyAiLWF4ICI6IiIpICsgIi1lIC1vIHBpZCAtbyB1c2VyIHwgZ3JlcCAiICsgdW5hbWUgKyAiIHwgYXdrICd7IHByaW50ICQxIH0nXG5leGl0XG4iKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKCiAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoaWxkLnN0ZG91dC5zdHIuc3BsaXQoJ1xuJyk7CiAgICAgICAgICAgIGZvciAodmFyIG4gaW4gbGluZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBsbiA9IGxpbmVzW25dLnRyaW0oKTsKICAgICAgICAgICAgICAgIGlmIChsbi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gdGhpcy5nZXRFbnZGcm9tUGlkKGxuKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZVtlbnZdKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlW2Vudl0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKG51bGwpOwogICAgICAgIH07CiAgICB9CiAgICBlbHNlIGlmKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2RhcndpbicpCiAgICB7CiAgICAgICAgdGhpcy5nZXRVaWQgPSBmdW5jdGlvbiBnZXRVaWQodXNlcm5hbWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImlkICIgKyB1c2VybmFtZSArICIgfCBhd2sgJ3sgc3BsaXQoJDEsIHRva2VuLCBcIj1cIik7IHNwbGl0KHRva2VuWzJdLCB1aWQsIFwiKFwiKTsgcHJpbnQgdWlkWzFdOyB9J1xuZXhpdFxuIik7CiAg", 16000); + memcpy_s(_usersessions + 48000, 11792, "ICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgIHJldHVybiAocGFyc2VJbnQoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpKTsKICAgICAgICB9OwogICAgICAgIHRoaXMuZ2V0R3JvdXBJRCA9IGZ1bmN0aW9uIGdldEdyb3VwSUQodWlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJpZCAiICsgdWlkICsgIiB8IGF3ayAneyBzcGxpdCgkMiwgZ2lkLCBcIj1cIik7IGlmKGdpZFsxXT09XCJnaWRcIikgeyBzcGxpdChnaWRbMl0sIGdpZG51bSwgXCIoXCIpOyBwcmludCBnaWRudW1bMV07ICB9IH0nXG5leGl0XG4iKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgcmV0dXJuIChwYXJzZUludChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSkpOwogICAgICAgIH0KICAgICAgICB0aGlzLmdldFVzZXJuYW1lID0gZnVuY3Rpb24gZ2V0VXNlcm5hbWUodWlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiZHNjbCAuIGxpc3QgL1VzZXJzIFVuaXF1ZUlEIHwgZ3JlcCAiICsgdWlkICsgIiB8IGF3ayAneyBpZigkMj09IiArIHVpZCArICIpeyBwcmludCAkMSB9fSdcbmV4aXRcbiIpOwogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICBpZihjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSAhPSAnJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aHJvdyAoJ3VpZDogJyArIHVpZCArICcgbm90IGZvdW5kJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHRoaXMuZ2V0R3JvdXBuYW1lID0gZnVuY3Rpb24gZ2V0R3JvdXBuYW1lKGdpZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImRzY2wgLiBsaXN0IC9Hcm91cHMgUHJpbWFyeUdyb3VwSUQgfCBncmVwICIgKyBnaWQgKyAiIHwgYXdrICd7IGlmKCQyPT0iICsgZ2lkICsgIil7IHByaW50ICQxIH19J1xuZXhpdFxuIik7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgIGlmKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpICE9ICcnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRocm93ICgnZ2lkOiAnICsgZ2lkICsgJyBub3QgZm91bmQnKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgdGhpcy5jb25zb2xlVWlkID0gZnVuY3Rpb24gY29uc29sZVVpZCgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoIndobyB8IHRyICdcbicgJ1wuJyB8IGF3ayAneyBwcmludCAkMSB9J1xuZXhpdFxuIik7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CgogICAgICAgICAgICB2YXIgcmV0ID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCk7CiAgICAgICAgICAgIGlmIChyZXQgIT0gJycpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5nZXRVaWQocmV0KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhyb3cgKCdub2JvZHkgbG9nZ2VkIGludG8gY29uc29sZScpOyAgICAgCiAgICAgICAgfQogICAgICAgIHRoaXMuZ2V0SG9tZUZvbGRlciA9IGZ1bmN0aW9uIGdldEhvbWVGb2xkZXIodXNlcikKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiZHNjbCAuIC1yZWFkIC9Vc2Vycy8iICsgdXNlciArICIgfCBncmVwIE5GU0hvbWVEaXJlY3RvcnkgfCBhd2sgLUY6ICd7IHByaW50ICQyIH0nXG5leGl0XG4iKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgaWYgKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpICE9ICcnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRocm93ICgndXNlcjogJyArIHVzZXIgKyAnIG5vdCBmb3VuZCcpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICB0aGlzLl91c2VycyA9IGZ1bmN0aW9uICgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy91c3IvYmluL2RzY2wnLCBbJ2RzY2wnLCAnLicsICdsaXN0JywgJy9Vc2VycycsICdVbmlxdWVJRCddKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnZXhpdFxuJyk7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CgoKICAgICAgICAgICAgdmFyIGxpbmVzID0gY2hpbGQuc3Rkb3V0LnN0ci5zcGxpdCgnXG4nKTsKICAgICAgICAgICAgdmFyIHRva2VucywgaTsKICAgICAgICAgICAgdmFyIHVzZXJzID0ge307CgogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICAgIHRva2VucyA9IGxpbmVzW2ldLnNwbGl0KCcgJyk7CiAgICAgICAgICAgICAgICBpZiAodG9rZW5zWzBdKSB7IHVzZXJzW3Rva2Vuc1swXV0gPSB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdOyB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAodXNlcnMpOwogICAgICAgIH0KICAgICAgICB0aGlzLl91aWRzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy91c3IvYmluL2RzY2wnLCBbJ2RzY2wnLCAnLicsICdsaXN0JywgJy9Vc2VycycsICdVbmlxdWVJRCddKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdleGl0XG4nKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKCiAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoaWxkLnN0ZG91dC5zdHIuc3BsaXQoJ1xuJyk7CiAgICAgICAgICAgIHZhciB0b2tlbnMsIGk7CiAgICAgICAgICAgIHZhciB1c2VycyA9IHt9OwoKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICB0b2tlbnMgPSBsaW5lc1tpXS5zcGxpdCgnICcpOwogICAgICAgICAgICAgICAgaWYgKHRva2Vuc1swXSkgeyB1c2Vyc1t0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdXSA9IHRva2Vuc1swXTsgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gKHVzZXJzKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5faWRUYWJsZSA9IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciB0YWJsZSA9IHt9OwogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy91c3IvYmluL2lkJywgWydpZCddKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CgogICAgICAgICAgICB2YXIgbGluZXMgPSBjaGlsZC5zdGRvdXQuc3RyLnNwbGl0KCdcbicpWzBdLnNwbGl0KCcgJyk7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICAgIHZhciB0eXBlcyA9IGxpbmVzW2ldLnNwbGl0KCc9Jyk7CiAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gdHlwZXNbMV0uc3BsaXQoJywnKTsKICAgICAgICAgICAgICAgIHRhYmxlW3R5cGVzWzBdXSA9IHt9OwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGogaW4gdG9rZW5zKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlkYXJyID0gdG9rZW5zW2pdLnNwbGl0KCcoJyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gaWRhcnJbMF07CiAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBpZGFyclsxXS5zdWJzdHJpbmcoMCwgaWRhcnJbMV0ubGVuZ3RoIC0gMSkudHJpbSgpOwogICAgICAgICAgICAgICAgICAgIHRhYmxlW3R5cGVzWzBdXVtuYW1lXSA9IGlkOwogICAgICAgICAgICAgICAgICAgIHRhYmxlW3R5cGVzWzBdXVtpZF0gPSBuYW1lOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAodGFibGUpOwogICAgICAgIH0KICAgICAgICB0aGlzLkN1cnJlbnQgPSBmdW5jdGlvbiAoY2IpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdXNlcnMgPSB7fTsKICAgICAgICAgICAgdmFyIHRhYmxlID0gdGhpcy5faWRUYWJsZSgpOwogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy91c3IvYmluL2xhc3QnLCBbJ2xhc3QnXSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwoKICAgICAgICAgICAgdmFyIGxpbmVzID0gY2hpbGQuc3Rkb3V0LnN0ci5zcGxpdCgnXG4nKTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGggJiYgbGluZXNbaV0ubGVuZ3RoID4gMDsgKytpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIXVzZXJzW2xpbmVzW2ldLnNwbGl0KCcgJylbMF1dKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdXNlcnNbbGluZXNbaV0uc3BsaXQoJyAnKVswXV0gPSB7IFVzZXJuYW1lOiBsaW5lc1tpXS5zcGxpdCgnICcpWzBdLCBTdGF0ZTogbGluZXNbaV0uc3BsaXQoJ3N0aWxsIGxvZ2dlZCBpbicpLmxlbmd0aCA+IDEgPyAnQWN0aXZlJyA6ICdJbmFjdGl2ZScsIHVpZDogdGFibGUudWlkW2xpbmVzW2ldLnNwbGl0KCcgJylbMF1dIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhdGNoKGUpCiAgICAgICAgICAgICAgICAgICAge30KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZih1c2Vyc1tsaW5lc1tpXS5zcGxpdCgnICcpWzBdXS5TdGF0ZSAhPSAnQWN0aXZlJyAmJiBsaW5lc1tpXS5zcGxpdCgnc3RpbGwgbG9nZ2VkIGluJykubGVuZ3RoID4gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJzW2xpbmVzW2ldLnNwbGl0KCcgJylbMF1dLlN0YXRlID0gJ0FjdGl2ZSc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodXNlcnMsICdBY3RpdmUnLCB7IHZhbHVlOiBzaG93QWN0aXZlT25seSh1c2VycykgfSk7CiAgICAgICAgICAgIGlmIChjYikgeyBjYi5jYWxsKHRoaXMsIHVzZXJzKTsgfQogICAgICAgIH0KICAgIH0KCiAgICBpZihwcm9jZXNzLnBsYXRmb3JtICE9ICd3aW4zMicpIC8vIExpbnV4LCBNYWNPUywgRnJlZUJTRAogICAgewogICAgICAgIHRoaXMuU2VsZiA9IGZ1bmN0aW9uIFNlbGYoKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvdXNyL2Jpbi9pZCcsIFsnaWQnLCAnLXUnXSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICByZXR1cm4gKHBhcnNlSW50KGNoaWxkLnN0ZG91dC5zdHIpKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5pc1Jvb3QgPSBmdW5jdGlvbiBpc1Jvb3QoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICh0aGlzLlNlbGYoKSA9PSAwKTsKICAgICAgICB9CiAgICB9CgoKfQpmdW5jdGlvbiBzaG93QWN0aXZlT25seShzb3VyY2UpCnsKICAgIHZhciByZXRWYWwgPSBbXTsKICAgIHZhciB1bmlxdWUgPSB7fTsKICAgIHZhciB1c2VybmFtZXMgPSBbXTsKICAgIHZhciB0bXA7CgogICAgZm9yICh2YXIgaSBpbiBzb3VyY2UpCiAgICB7CiAgICAgICAgaWYgKHNvdXJjZVtpXS5TdGF0ZSA9PSAnQWN0aXZlJykKICAgICAgICB7CiAgICAgICAgICAgIHJldFZhbC5wdXNoKHNvdXJjZVtpXSk7CiAgICAgICAgICAgIHRtcCA9IChzb3VyY2VbaV0uRG9tYWluID8gKHNvdXJjZVtpXS5Eb21haW4gKyAnXFwnKSA6ICcnKSArIHNvdXJjZVtpXS5Vc2VybmFtZTsKICAgICAgICAgICAgaWYgKCF1bmlxdWVbdG1wXSkgeyB1bmlxdWVbdG1wXSA9IHRtcDt9CiAgICAgICAgfQogICAgfQoKICAgIGZvciAodmFyIGkgaW4gdW5pcXVlKQogICAgewogICAgICAgIHVzZXJuYW1lcy5wdXNoKGkpOwogICAgfQoKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXRWYWwsICd1c2VybmFtZXMnLCB7IHZhbHVlOiB1c2VybmFtZXMgfSk7CiAgICByZXR1cm4gKHJldFZhbCk7Cn0KZnVuY3Rpb24gZ2V0VG9rZW5zKHN0cikKewogICAgdmFyIGNvbHVtbnMgPSBbXTsKICAgIHZhciBpOwoKICAgIGNvbHVtbnMucHVzaChzdHIuc3Vic3RyaW5nKDAsIChpPXN0ci5pbmRleE9mKCcgJykpKSk7CiAgICB3aGlsZSAoc3RyWysraV0gPT0gJyAnKTsKICAgIGNvbHVtbnMucHVzaChzdHIuc3Vic3RyaW5nKGksIChpPXN0ci5zdWJzdHJpbmcoaSkuaW5kZXhPZignICcpICsgaSkpKTsKICAgIHdoaWxlIChzdHJbKytpXSA9PSAnICcpOwogICAgY29sdW1ucy5wdXNoKHN0ci5zdWJzdHJpbmcoaSwgKGk9c3RyLnN1YnN0cmluZyhpKS5pbmRleE9mKCcgJykgKyBpKSkpOwogICAgd2hpbGUgKHN0clsrK2ldID09ICcgJyk7CiAgICB2YXIgc3RhdHVzID0gc3RyLnN1YnN0cmluZyhpKS50cmltKCk7CiAgICBjb2x1bW5zLnB1c2goc3RhdHVzKTsKCiAgICByZXR1cm4gKGNvbHVtbnMpOwp9Cgptb2R1bGUuZXhwb3J0cyA9IG5ldyBVc2VyU2Vzc2lvbnMoKTsK", 11792); + ILibBase64DecodeEx((unsigned char*)_usersessions, 59792, (unsigned char*)_usersessions + 59792); + duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "user-sessions"); duk_push_string(ctx, _usersessions + 59792); duk_pcall_method(ctx, 2); duk_pop(ctx); free(_usersessions); diff --git a/modules/user-sessions.js b/modules/user-sessions.js index f7f58cc..5ea323e 100644 --- a/modules/user-sessions.js +++ b/modules/user-sessions.js @@ -249,6 +249,22 @@ function UserSessions() return (ret); }; + this.getRawSessionAttribute = function getRawSessionAttribute(sessionId, attr) + { + var buffer = this._marshal.CreatePointer(); + var bytesReturned = this._marshal.CreateVariable(4); + + if (this._wts.WTSQuerySessionInformationW(0, sessionId, attr, buffer, bytesReturned).Val == 0) + { + throw ('Error calling WTSQuerySessionInformationW: ' + this._kernel32.GetLastError.Val); + } + + var b = buffer.Deref().Deref(0, bytesReturned.toBuffer().readUInt32LE()).toBuffer(); + var ret = Buffer.alloc(bytesReturned.toBuffer().readUInt32LE()); + b.copy(ret); + this._wts.WTSFreeMemory(buffer.Deref()); + return (ret); + } this.getSessionAttribute = function getSessionAttribute(sessionId, attr) { var buffer = this._marshal.CreatePointer(); diff --git a/modules/win-registry.js b/modules/win-registry.js index 88f4b66..8212fee 100644 --- a/modules/win-registry.js +++ b/modules/win-registry.js @@ -222,6 +222,24 @@ function windows_registry() this._AdvApi.RegCloseKey(h.Deref()); } }; + this.usernameToUserKey = function usernameToUserKey(user) + { + var sid = user; + if (typeof (user) == 'string') + { + var r = this.QueryKey(this.HKEY.LocalMachine, 'SAM\\SAM\\Domains\\Account\\Users\\Names\\' + user); + sid = r.default._type; + } + var u = this.QueryKey(this.HKEY.Users); + for(i in u.subkeys) + { + if(u.subkeys[i].endsWith('-' + sid)) + { + return (u.subkeys[i]); + } + } + throw (user + ': Not Found'); + }; } module.exports = new windows_registry();