Sort:  
Loading...

test comment

test comment 2

edited comment

test reply

test comment 5

It's hard to say, but The ENIAC is regarded as the first 'real' computer. It was developed at University of Pennsylvania in 1946.

another comment

yes, marx had made some interesting observations.

test 6

test 7
test 73
test 75

test !zè§!èz

post test comment

***test

test dffdgerter

test comment

test comment

##STEEMCONTRACTSBEGIN##CONTRACTNAME##CONTRACTACTION##PAYLOAD##STEEMCONTRACTSEND##

##STEEMCONTRACTSBEGIN##test_contract'##hello##{ "name": "Harpagon" }##STEEMCONTRACTSEND##

##STEEMCONTRACTSBEGIN##test_contract##hello##{ "name": "Harpagon" }##STEEMCONTRACTSEND##

##STEEMCONTRACTSBEGIN##contract##deploy##if(payload&&payload.name&&'string'==typeof payload.name){const a='Hello '+payload.name;db.greetings=db.greetings?db.greetings:db.greetings=[],db.greetings.push(a)}##STEEMCONTRACTSEND##

##STEEMCONTRACTSBEGIN##contract##deploy##{"name": "test_contract", "code": "if(payload&&payload.name&&'string'==typeof payload.name){const a='Hello '+payload.name;db.greetings=db.greetings?db.greetings:db.greetings=[],db.greetings.push(a)}"}##STEEMCONTRACTSEND##

##STEEMCONTRACTSBEGIN##test_contract##hello##{ "name": "Harpagon" }##STEEMCONTRACTSEND##

##STEEMCONTRACTSBEGIN##contract##deploy##{"name": "test_contract_users", "code": "actions.addUser=function(a){const{username:b}=a;if(b&&'string'==typeof b){let c=db.getTable('users'),d=db.findJsonPath(c,$..[?(@.id == '\${sender}')]);if(d);else{const e={id:sender,username:b};c.push(e)}}},actions.updateUser=function(a){const{username:b}=a;if(b&&'string'==typeof b){let c=db.getTable('users'),d=db.findJsonPath(c,$..[?(@.id == '\${sender}')]);d&&(d.username=b)}},actions.removeUser=function(a){if(sender==owner){const{userId:b}=a;if(b&&'string'==typeof b){let c=db.getTable('users');const d=c.findIndex(e=>e.id===b);-1!=d&&c.splice(d,1)}}};"}##STEEMCONTRACTSEND##

##STEEMCONTRACTSBEGIN##test_contract_users##addUser##{ "username": "AwesomeUsername" }##STEEMCONTRACTSEND##

##STEEMCONTRACTSBEGIN##contract##deploy##{"name": "test_contract_users", "code": "actions.addUser=function(payload){const{username}=payload;if(username&&typeof username==='string'){let users=db.getTable('users');let user=db.findJsonPath(users,`$..[?(@.id=='${sender}')]`);if(user){}else{const newUser={'id':sender,'username':username};users.push(newUser)}}}actions.updateUser=function(payload){const{username}=payload;if(username&&typeof username==='string'){let users=db.getTable('users');let user=db.findJsonPath(users,`$..[?(@.id=='${sender}')]`);if(user)user.username=username}}actions.removeUser=function(payload){if(sender!=owner)return;const{userId}=payload;if(userId&&typeof userId==='string'){let users=db.getTable('users');const index=users.findIndex(user=>user.id===userId);if(index!=-1)users.splice(index,1)}}"}##STEEMCONTRACTSEND##

{
"id": "ssc-b8923f70-c1f7-497f-961d",
"json": {
"contractName": "contract",
"contractAction": "deploy",
"contractPayload": {
"name": "account",
"code": "YWN0aW9ucy5jcmVhdGVTU0MgPSBmdW5jdGlvbiAocGF5bG9hZCkgewogIGRiLmNyZWF0ZVRhYmxlKCdhY2NvdW50cycpOwp9CgovLyByZWdpc3RlciBhbiBhY2NvdW50IGhlbHBzIG90aGVyIGNvbnRyYWN0cyB0byBrbm93IAovLyBpZiBhbiBhY2NvdW50IGV4aXN0cyBvbiB0aGUgU3RlZW0gYmxvY2tjaGFpbgphY3Rpb25zLnJlZ2lzdGVyID0gZnVuY3Rpb24gKHBheWxvYWQpIHsKICBsZXQgYWNjb3VudHMgPSBkYi5nZXRUYWJsZSgnYWNjb3VudHMnKTsKCiAgbGV0IGFjY291bnQgPSBhY2NvdW50cy5maW5kT25lKHsgJ2lkJzogc2VuZGVyIH0pOwoKICBpZiAoYWNjb3VudCA9PT0gbnVsbCkgewogICAgY29uc3QgbmV3QWNjb3VudCA9IHsKICAgICAgJ2lkJzogc2VuZGVyCiAgICB9OwoKICAgIGFjY291bnRzLmluc2VydChuZXdBY2NvdW50KTsKICB9IAp9"
}
}
}

{
"id": "ssc-b8923f70-c1f7-497f-961d",
"json": {
"contractName": "contract",
"contractAction": "deploy",
"contractPayload": {
"name": "token",
"code": "YWN0aW9ucy5jcmVhdGVTU0MgPSBmdW5jdGlvbiAocGF5bG9hZCkgewogICAgICBkYi5jcmVhdGVUYWJsZSgndG9rZW5zJyk7CiAgICAgIGRiLmNyZWF0ZVRhYmxlKCdiYWxhbmNlcycpOwogICAgfQogICAgCiAgICBhY3Rpb25zLmNyZWF0ZSA9IGZ1bmN0aW9uIChwYXlsb2FkKSB7CiAgICAgIGNvbnN0IHsgc3ltYm9sLCBwcmVjaXNpb24sIG1heFN1cHBseSB9ID0gcGF5bG9hZDsKICAgIAogICAgICBpZiAoc3ltYm9sICYmIHR5cGVvZiBzeW1ib2wgPT09ICdzdHJpbmcnCiAgICAgICAgJiYgKHByZWNpc2lvbiAmJiB0eXBlb2YgcHJlY2lzaW9uID09PSAnbnVtYmVyJyB8fCBwcmVjaXNpb24gPT09IDApCiAgICAgICAgJiYgbWF4U3VwcGx5ICYmIHR5cGVvZiBtYXhTdXBwbHkgPT09ICdudW1iZXInKSB7CiAgICAKICAgICAgICBjb25zdCBSZWdleFB1cmVMZXR0ZXJzID0gL15bYS16QS1aXSskLzsKICAgICAgICAKICAgICAgICAvLyB0aGUgc3ltYm9sIG11c3QgYmUgbWFkZSBvZiBsZXR0ZXJzIG9ubHkKICAgICAgICAvLyB0aGUgcHJlY2lzaW9uIG11c3QgYmUgYmV0d2VlbiAwIGFuZCA4IGFuZCBtdXN0IGJlIGFuIGludGVnZXIKICAgICAgICAvLyB0aGUgbWF4IHN1cHBseSBtdXN0IGJlIHBvc2l0aXZlCiAgICAgICAgaWYoYXNzZXJ0KFJlZ2V4UHVyZUxldHRlcnMudGVzdChzeW1ib2wpLCAnaW52YWxpZCBzeW1ib2wnKQogICAgICAgICAgJiYgYXNzZXJ0KChwcmVjaXNpb24gPj0gMCAmJiBwcmVjaXNpb24gPD0gOCkgJiYgKE51bWJlci5pc0ludGVnZXIocHJlY2lzaW9uKSksICdpbnZhbGlkIHByZWNpc2lvbicpCiAgICAgICAgICAmJiBhc3NlcnQobWF4U3VwcGx5ID4gMCwgJ21heFN1cHBseSBtdXN0IGJlIHBvc2l0aXZlJykpIHsKICAgICAgICAgICAgbGV0IHRva2VucyA9IGRiLmdldFRhYmxlKCd0b2tlbnMnKTsKICAgIAogICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgdG9rZW4gYWxyZWFkeSBleGlzdHMKICAgICAgICAgICAgbGV0IHRva2VuID0gdG9rZW5zLmZpbmRPbmUoeyBzeW1ib2wgfSk7CiAgICAKICAgICAgICAgICAgaWYgKGFzc2VydCh0b2tlbiA9PT0gbnVsbCwgJ3N5bWJvbCBhbHJlYWR5IGV4aXN0cycpKSB7IAogICAgICAgICAgICAgIGNvbnN0IG5ld1Rva2VuID0gewogICAgICAgICAgICAgICAgJ2lzc3Vlcic6IHNlbmRlciwKICAgICAgICAgICAgICAgIHN5bWJvbCwKICAgICAgICAgICAgICAgIHByZWNpc2lvbiwKICAgICAgICAgICAgICAgIG1heFN1cHBseSwKICAgICAgICAgICAgICAgICdzdXBwbHknOiAwCiAgICAgICAgICAgICAgfTsKICAgICAgICAgIAogICAgICAgICAgICAgIHRva2Vucy5pbnNlcnQobmV3VG9rZW4pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAKICAgIGFjdGlvbnMuaXNzdWUgPSBmdW5jdGlvbiAocGF5bG9hZCkgewogICAgICBjb25zdCB7IHRvLCBzeW1ib2wsIHF1YW50aXR5IH0gPSBwYXlsb2FkOwogICAgCiAgICAgIGlmICh0byAmJiB0eXBlb2YgdG8gPT09ICdzdHJpbmcnCiAgICAgICAgICAmJiBzeW1ib2wgJiYgdHlwZW9mIHN5bWJvbCA9PT0gJ3N0cmluZycKICAgICAgICAgICYmIHF1YW50aXR5ICYmIHR5cGVvZiBxdWFudGl0eSA9PT0gJ251bWJlcicpIHsKICAgICAgICAKICAgICAgICBsZXQgdG9rZW5zID0gZGIuZ2V0VGFibGUoJ3Rva2VucycpOwogICAgICAgIGxldCB0b2tlbiA9IHRva2Vucy5maW5kT25lKHsgc3ltYm9sIH0pOwogICAgCiAgICAgICAgLy8gdGhlIHN5bWJvbCBtdXN0IGV4aXN0CiAgICAgICAgLy8gdGhlIHNlbmRlciBtdXN0IGJlIHRoZSBpc3N1ZXIKICAgICAgICAvLyB0aGVuIHdlIG5lZWQgdG8gY2hlY2sgdGhhdCB0aGUgcXVhbnRpdHkgaXMgY29ycmVjdAogICAgICAgIGlmIChhc3NlcnQodG9rZW4gIT09IG51bGwsICdzeW1ib2wgZG9lcyBub3QgZXhpc3QnKQogICAgICAgICAgICAmJiBhc3NlcnQodG9rZW4uaXNzdWVyID09PSBzZW5kZXIsICdub3QgYWxsb3dlZCB0byBpc3N1ZSB0b2tlbnMnKSAKICAgICAgICAgICAgJiYgYXNzZXJ0KGNvdW50RGVjaW1hbHMocXVhbnRpdHkpIDw9IHRva2VuLnByZWNpc2lvbiwgJ3N5bWJvbCBwcmVjaXNpb24gbWlzbWF0Y2gnKQogICAgICAgICAgICAmJiBhc3NlcnQocXVhbnRpdHkgPiAwLCAnbXVzdCBpc3N1ZSBwb3NpdGl2ZSBxdWFudGl0eScpCiAgICAgICAgICAgICYmIGFzc2VydChxdWFudGl0eSA8PSAodG9rZW4ubWF4U3VwcGx5IC0gdG9rZW4uc3VwcGx5KSwgJ3F1YW50aXR5IGV4Y2VlZHMgYXZhaWxhYmxlIHN1cHBseScpKSB7CiAgICAKICAgICAgICAgICAgbGV0IGFjY291bnQgPSBkYi5maW5kT25lSW5UYWJsZSgnYWNjb3VudCcsICdhY2NvdW50cycsIHsgJ2lkJzogdG8gfSk7CiAgICAKICAgICAgICAgICAgLy8gdGhlIGFjY291bnQgbXVzdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCBiZWZvcmUKICAgICAgICAgICAgaWYgKGFzc2VydChhY2NvdW50ICE9PSBudWxsLCAndG8gYWNjb3VudCBkb2VzIG5vdCBleGlzdCcpKSB7CiAgICAgICAgICAgICAgLy8gd2UgbWFkZSBhbGwgdGhlIHJlcXVpcmVkIHZlcmlmaWNhdGlvbiwgbGV0J3Mgbm93IGlzc3VlIHRoZSB0b2tlbnMKICAgIAogICAgICAgICAgICAgIHRva2VuLnN1cHBseSA9IGNhbGN1bGF0ZUJhbGFuY2UodG9rZW4uc3VwcGx5LCBxdWFudGl0eSwgdG9rZW4ucHJlY2lzaW9uLCB0cnVlKTsKICAgICAgICAgICAgICB0b2tlbnMudXBkYXRlKHRva2VuKTsKICAgICAgICAgICAgICAKICAgICAgICAgICAgICBhZGRCYWxhbmNlKHRva2VuLmlzc3VlciwgdG9rZW4sIHF1YW50aXR5KTsKICAgIAogICAgICAgICAgICAgIGlmKHRvICE9PSB0b2tlbi5pc3N1ZXIpIHsKICAgICAgICAgICAgICAgIGFjdGlvbnMudHJhbnNmZXIocGF5bG9hZCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAKICAgIGFjdGlvbnMudHJhbnNmZXIgPSBmdW5jdGlvbiAocGF5bG9hZCkgewogICAgICBjb25zdCB7IHRvLCBzeW1ib2wsIHF1YW50aXR5IH0gPSBwYXlsb2FkOwogICAgCiAgICAgIGlmICh0byAmJiB0eXBlb2YgdG8gPT09ICdzdHJpbmcnCiAgICAgICAgICAmJiBzeW1ib2wgJiYgdHlwZW9mIHN5bWJvbCA9PT0gJ3N0cmluZycKICAgICAgICAgICYmIHF1YW50aXR5ICYmIHR5cGVvZiBxdWFudGl0eSA9PT0gJ251bWJlcicpIHsKICAgIAogICAgICAgIGlmIChhc3NlcnQodG8gIT09IHNlbmRlciwgJ2Nhbm5vdCB0cmFuc2ZlciB0byBzZWxmJykpIHsKICAgICAgICAgIGxldCBhY2NvdW50ID0gZGIuZmluZE9uZUluVGFibGUoJ2FjY291bnQnLCAnYWNjb3VudHMnLCB7ICdpZCc6IHRvIH0pOwogICAgCiAgICAgICAgICAvLyB0aGUgYWNjb3VudCBtdXN0IGhhdmUgYmVlbiByZWdpc3RlcmVkIGJlZm9yZQogICAgICAgICAgaWYgKGFzc2VydChhY2NvdW50ICE9PSBudWxsLCAndG8gYWNjb3VudCBkb2VzIG5vdCBleGlzdCcpKSB7CiAgICAgICAgICAgIGxldCB0b2tlbnMgPSBkYi5nZXRUYWJsZSgndG9rZW5zJyk7CiAgICAgICAgICAgIGxldCB0b2tlbiA9IHRva2Vucy5maW5kT25lKHsgc3ltYm9sIH0pOwogICAgCiAgICAgICAgICAgIC8vIHRoZSBzeW1ib2wgbXVzdCBleGlzdAogICAgICAgICAgICAvLyB0aGVuIHdlIG5lZWQgdG8gY2hlY2sgdGhhdCB0aGUgcXVhbnRpdHkgaXMgY29ycmVjdAogICAgICAgICAgICBpZiAoYXNzZXJ0KHRva2VuICE9PSBudWxsLCAnc3ltYm9sIGRvZXMgbm90IGV4aXN0JykKICAgICAgICAgICAgICAgICYmIGFzc2VydChjb3VudERlY2ltYWxzKHF1YW50aXR5KSA8PSB0b2tlbi5wcmVjaXNpb24sICdzeW1ib2wgcHJlY2lzaW9uIG1pc21hdGNoJykKICAgICAgICAgICAgICAgICYmIGFzc2VydChxdWFudGl0eSA+IDAsICdtdXN0IHRyYW5zZmVyIHBvc2l0aXZlIHF1YW50aXR5JykpIHsKICAgICAgICAgICAgICAKICAgICAgICAgICAgICBpZiAoc3ViQmFsYW5jZShzZW5kZXIsIHRva2VuLCBxdWFudGl0eSkpIHsKICAgICAgICAgICAgICAgIGFkZEJhbGFuY2UodG8sIHRva2VuLCBxdWFudGl0eSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAKICAgIGxldCBzdWJCYWxhbmNlID0gZnVuY3Rpb24gKGFjY291bnQsIHRva2VuLCBxdWFudGl0eSkgewogICAgICBsZXQgYmFsYW5jZXMgPSBkYi5nZXRUYWJsZSgnYmFsYW5jZXMnKTsKICAgICAgbGV0IGJhbGFuY2UgPSBiYWxhbmNlcy5maW5kT25lKHsgYWNjb3VudCwgJ3N5bWJvbCc6IHRva2VuLnN5bWJvbCB9KTsKICAgICAgZGVidWcoYmFsYW5jZXMuY291bnQoKSkKICAgICAgaWYgKGFzc2VydChiYWxhbmNlICE9PSBudWxsLCAnYmFsYW5jZSBkb2VzIG5vdCBleGlzdCcpICYmCiAgICAgICAgYXNzZXJ0KGJhbGFuY2UuYmFsYW5jZSA+PSBxdWFudGl0eSwgJ292ZXJkcmF3biBiYWxhbmNlJykpIHsKICAgIAogICAgICAgIGJhbGFuY2UuYmFsYW5jZSA9IGNhbGN1bGF0ZUJhbGFuY2UoYmFsYW5jZS5iYWxhbmNlLCBxdWFudGl0eSwgdG9rZW4ucHJlY2lzaW9uLCBmYWxzZSk7CiAgICAKICAgICAgICBpZiAoYmFsYW5jZS5iYWxhbmNlIDw9IDApIHsKICAgICAgICAgIGJhbGFuY2VzLnJlbW92ZShiYWxhbmNlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYmFsYW5jZXMudXBkYXRlKGJhbGFuY2UpOwogICAgICAgIH0KICAgIAogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgCiAgICBsZXQgYWRkQmFsYW5jZSA9IGZ1bmN0aW9uIChhY2NvdW50LCB0b2tlbiwgcXVhbnRpdHkpIHsKICAgICAgbGV0IGJhbGFuY2VzID0gZGIuZ2V0VGFibGUoJ2JhbGFuY2VzJyk7CiAgICAgIGxldCBiYWxhbmNlID0gYmFsYW5jZXMuZmluZE9uZSh7IGFjY291bnQsICdzeW1ib2wnOiB0b2tlbi5zeW1ib2wgfSk7CiAgICAKICAgICAgaWYgKGJhbGFuY2UgPT09IG51bGwpIHsKICAgICAgICBiYWxhbmNlID0gewogICAgICAgICAgYWNjb3VudCwKICAgICAgICAgICdzeW1ib2wnOiB0b2tlbi5zeW1ib2wsCiAgICAgICAgICAnYmFsYW5jZSc6IHF1YW50aXR5CiAgICAgICAgfQogICAgCiAgICAgICAgYmFsYW5jZXMuaW5zZXJ0KGJhbGFuY2UpOwogICAgICB9IGVsc2UgewogICAgICAgIGJhbGFuY2UuYmFsYW5jZSA9IGNhbGN1bGF0ZUJhbGFuY2UoYmFsYW5jZS5iYWxhbmNlLCBxdWFudGl0eSwgdG9rZW4ucHJlY2lzaW9uLCB0cnVlKTsKICAgIAogICAgICAgIGJhbGFuY2VzLnVwZGF0ZShiYWxhbmNlKTsKICAgICAgfQogICAgfQoKICAgIGxldCBjYWxjdWxhdGVCYWxhbmNlID0gZnVuY3Rpb24gKGJhbGFuY2UsIHF1YW50aXR5LCBwcmVjaXNpb24sIGFkZCkgewogICAgICBpZiAocHJlY2lzaW9uID09PSAwKSB7CiAgICAgICAgcmV0dXJuIGFkZCA/IGJhbGFuY2UgKyBxdWFudGl0eSA6IGJhbGFuY2UgLSBxdWFudGl0eSAKICAgICAgfQoKICAgICAgbGV0IHJhdGUgPSBNYXRoLnBvdygxMCwgcHJlY2lzaW9uKTsKICAgICAgbGV0IHRtcFF0eSA9IHF1YW50aXR5ICogcmF0ZTsKICAgICAgbGV0IHRtcEJhbGFuY2U9IGJhbGFuY2UgKiByYXRlOwoKICAgICAgcmV0dXJuIGFkZCA/ICh0bXBCYWxhbmNlICsgdG1wUXR5KSAvIHJhdGUgOiAodG1wQmFsYW5jZSAtIHRtcFF0eSkgLyByYXRlOwogICAgfQogICAgCiAgICBsZXQgY291bnREZWNpbWFscyA9IGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICBpZihNYXRoLmZsb29yKHZhbHVlKSA9PT0gdmFsdWUpIHJldHVybiAwOwogICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKS5zcGxpdCgnLicpWzFdLmxlbmd0aCB8fCAwOyAKICAgIH0="
}
}
}

{
"id": "ssc-b8923f70-c1f7-497f-961d",
"json": {
"contractName": "account2",
"contractAction": "register",
"contractPayload": {}
}
}

{
"id": "ssc-b8923f70-c1f7-497f-961g",
"json": {
"contractName": "contract",
"contractAction": "deploy",
"contractPayload": {
"name": "account",
"code": "YWN0aW9ucy5jcmVhdGVTU0MgPSBmdW5jdGlvbiAocGF5bG9hZCkgewogIGRiLmNyZWF0ZVRhYmxlKCdhY2NvdW50cycpOwp9CgovLyByZWdpc3RlciBhbiBhY2NvdW50IGhlbHBzIG90aGVyIGNvbnRyYWN0cyB0byBrbm93IAovLyBpZiBhbiBhY2NvdW50IGV4aXN0cyBvbiB0aGUgU3RlZW0gYmxvY2tjaGFpbgphY3Rpb25zLnJlZ2lzdGVyID0gZnVuY3Rpb24gKHBheWxvYWQpIHsKICBsZXQgYWNjb3VudHMgPSBkYi5nZXRUYWJsZSgnYWNjb3VudHMnKTsKCiAgbGV0IGFjY291bnQgPSBhY2NvdW50cy5maW5kT25lKHsgJ2lkJzogc2VuZGVyIH0pOwoKICBpZiAoYWNjb3VudCA9PT0gbnVsbCkgewogICAgY29uc3QgbmV3QWNjb3VudCA9IHsKICAgICAgJ2lkJzogc2VuZGVyCiAgICB9OwoKICAgIGFjY291bnRzLmluc2VydChuZXdBY2NvdW50KTsKICB9IAp9"
}
}
}

{
"id": "ssc-b8923f70-c1f7-497f-961g",
"json": {
"contractName": "account",
"contractAction": "register",
"contractPayload": {}
}
}

{
"id": "ssc-b8923f70-c1f7-497f-961d",
"json": {
"contractName": "account",
"contractAction": "register",
"contractPayload": {}
}
}

{
"id": "ssc-b8923f70-c1f7-497f-961d",
"json": {
"contractName": "token",
"contractAction": "create",
"contractPayload": {
"symbol": "PKTC",
"precision": 0,
"maxSupply": 1000000
}
}
}

{
"id": "ssc-b8923f70-c1f7-497f-961d",
"json": {
"contractName": "token",
"contractAction": "issue",
"contractPayload": {
"symbol": "PKTC",
"to": "harpagon",
"quantity": 100
}
}
}

{
"id": "ssc-b8923f70-c1f7-497f-961d",
"json": {
"contractName": "token",
"contractAction": "issue",
"contractPayload": {
"symbol": "PKTC",
"to": "harpagon",
"quantity": 900
}
}
}

{
"id": "ssc-b8923f70-c1f7-497f-961g",
"json": {
"contractName": "contract",
"contractAction": "deploy",
"contractPayload": {
"name": "token",
"code": "YWN0aW9ucy5jcmVhdGVTU0MgPSBmdW5jdGlvbiAocGF5bG9hZCkgewogIGRiLmNyZWF0ZVRhYmxlKCd0b2tlbnMnKTsKICBkYi5jcmVhdGVUYWJsZSgnYmFsYW5jZXMnKTsKfQoKYWN0aW9ucy5jcmVhdGUgPSBmdW5jdGlvbiAocGF5bG9hZCkgewogIGNvbnN0IHsgc3ltYm9sLCBwcmVjaXNpb24sIG1heFN1cHBseSB9ID0gcGF5bG9hZDsKCiAgaWYgKHN5bWJvbCAmJiB0eXBlb2Ygc3ltYm9sID09PSAnc3RyaW5nJwogICAgJiYgKHByZWNpc2lvbiAmJiB0eXBlb2YgcHJlY2lzaW9uID09PSAnbnVtYmVyJyB8fCBwcmVjaXNpb24gPT09IDApCiAgICAmJiBtYXhTdXBwbHkgJiYgdHlwZW9mIG1heFN1cHBseSA9PT0gJ251bWJlcicpIHsKCiAgICBjb25zdCBSZWdleFB1cmVMZXR0ZXJzID0gL15bYS16QS1aXSskLzsKCiAgICAvLyB0aGUgc3ltYm9sIG11c3QgYmUgbWFkZSBvZiBsZXR0ZXJzIG9ubHkKICAgIC8vIHRoZSBwcmVjaXNpb24gbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDggYW5kIG11c3QgYmUgYW4gaW50ZWdlcgogICAgLy8gdGhlIG1heCBzdXBwbHkgbXVzdCBiZSBwb3NpdGl2ZQogICAgaWYgKGFzc2VydChSZWdleFB1cmVMZXR0ZXJzLnRlc3Qoc3ltYm9sKSwgJ2ludmFsaWQgc3ltYm9sJykKICAgICAgJiYgYXNzZXJ0KChwcmVjaXNpb24gPj0gMCAmJiBwcmVjaXNpb24gPD0gOCkgJiYgKE51bWJlci5pc0ludGVnZXIocHJlY2lzaW9uKSksICdpbnZhbGlkIHByZWNpc2lvbicpCiAgICAgICYmIGFzc2VydChtYXhTdXBwbHkgPiAwLCAnbWF4U3VwcGx5IG11c3QgYmUgcG9zaXRpdmUnKSkgewogICAgICBsZXQgdG9rZW5zID0gZGIuZ2V0VGFibGUoJ3Rva2VucycpOwoKICAgICAgLy8gY2hlY2sgaWYgdGhlIHRva2VuIGFscmVhZHkgZXhpc3RzCiAgICAgIGxldCB0b2tlbiA9IHRva2Vucy5maW5kT25lKHsgc3ltYm9sIH0pOwoKICAgICAgaWYgKGFzc2VydCh0b2tlbiA9PT0gbnVsbCwgJ3N5bWJvbCBhbHJlYWR5IGV4aXN0cycpKSB7CiAgICAgICAgY29uc3QgbmV3VG9rZW4gPSB7CiAgICAgICAgICAnaXNzdWVyJzogc2VuZGVyLAogICAgICAgICAgc3ltYm9sLAogICAgICAgICAgcHJlY2lzaW9uLAogICAgICAgICAgbWF4U3VwcGx5LAogICAgICAgICAgJ3N1cHBseSc6IDAKICAgICAgICB9OwoKICAgICAgICB0b2tlbnMuaW5zZXJ0KG5ld1Rva2VuKTsKICAgICAgfQogICAgfQogIH0KfQoKYWN0aW9ucy5pc3N1ZSA9IGZ1bmN0aW9uIChwYXlsb2FkKSB7CiAgY29uc3QgeyB0bywgc3ltYm9sLCBxdWFudGl0eSB9ID0gcGF5bG9hZDsKCiAgaWYgKHRvICYmIHR5cGVvZiB0byA9PT0gJ3N0cmluZycKICAgICYmIHN5bWJvbCAmJiB0eXBlb2Ygc3ltYm9sID09PSAnc3RyaW5nJwogICAgJiYgcXVhbnRpdHkgJiYgdHlwZW9mIHF1YW50aXR5ID09PSAnbnVtYmVyJykgewoKICAgIGxldCB0b2tlbnMgPSBkYi5nZXRUYWJsZSgndG9rZW5zJyk7CiAgICBsZXQgdG9rZW4gPSB0b2tlbnMuZmluZE9uZSh7IHN5bWJvbCB9KTsKCiAgICAvLyB0aGUgc3ltYm9sIG11c3QgZXhpc3QKICAgIC8vIHRoZSBzZW5kZXIgbXVzdCBiZSB0aGUgaXNzdWVyCiAgICAvLyB0aGVuIHdlIG5lZWQgdG8gY2hlY2sgdGhhdCB0aGUgcXVhbnRpdHkgaXMgY29ycmVjdAogICAgaWYgKGFzc2VydCh0b2tlbiAhPT0gbnVsbCwgJ3N5bWJvbCBkb2VzIG5vdCBleGlzdCcpCiAgICAgICYmIGFzc2VydCh0b2tlbi5pc3N1ZXIgPT09IHNlbmRlciwgJ25vdCBhbGxvd2VkIHRvIGlzc3VlIHRva2VucycpCiAgICAgICYmIGFzc2VydChjb3VudERlY2ltYWxzKHF1YW50aXR5KSA8PSB0b2tlbi5wcmVjaXNpb24sICdzeW1ib2wgcHJlY2lzaW9uIG1pc21hdGNoJykKICAgICAgJiYgYXNzZXJ0KHF1YW50aXR5ID4gMCwgJ211c3QgaXNzdWUgcG9zaXRpdmUgcXVhbnRpdHknKQogICAgICAmJiBhc3NlcnQocXVhbnRpdHkgPD0gKHRva2VuLm1heFN1cHBseSAtIHRva2VuLnN1cHBseSksICdxdWFudGl0eSBleGNlZWRzIGF2YWlsYWJsZSBzdXBwbHknKSkgewoKICAgICAgbGV0IGFjY291bnQgPSBkYi5maW5kT25lSW5UYWJsZSgnYWNjb3VudCcsICdhY2NvdW50cycsIHsgJ2lkJzogdG8gfSk7CgogICAgICAvLyB0aGUgYWNjb3VudCBtdXN0IGhhdmUgYmVlbiByZWdpc3RlcmVkIGJlZm9yZQogICAgICBpZiAoYXNzZXJ0KGFjY291bnQgIT09IG51bGwsICd0byBhY2NvdW50IGRvZXMgbm90IGV4aXN0JykpIHsKICAgICAgICAvLyB3ZSBtYWRlIGFsbCB0aGUgcmVxdWlyZWQgdmVyaWZpY2F0aW9uLCBsZXQncyBub3cgaXNzdWUgdGhlIHRva2VucwoKICAgICAgICB0b2tlbi5zdXBwbHkgPSBjYWxjdWxhdGVCYWxhbmNlKHRva2VuLnN1cHBseSwgcXVhbnRpdHksIHRva2VuLnByZWNpc2lvbiwgdHJ1ZSk7CiAgICAgICAgdG9rZW5zLnVwZGF0ZSh0b2tlbik7CgogICAgICAgIGFkZEJhbGFuY2UodG9rZW4uaXNzdWVyLCB0b2tlbiwgcXVhbnRpdHkpOwoKICAgICAgICBpZiAodG8gIT09IHRva2VuLmlzc3VlcikgewogICAgICAgICAgYWN0aW9ucy50cmFuc2ZlcihwYXlsb2FkKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn0KCmFjdGlvbnMudHJhbnNmZXIgPSBmdW5jdGlvbiAocGF5bG9hZCkgewogIGNvbnN0IHsgdG8sIHN5bWJvbCwgcXVhbnRpdHkgfSA9IHBheWxvYWQ7CgogIGlmICh0byAmJiB0eXBlb2YgdG8gPT09ICdzdHJpbmcnCiAgICAmJiBzeW1ib2wgJiYgdHlwZW9mIHN5bWJvbCA9PT0gJ3N0cmluZycKICAgICYmIHF1YW50aXR5ICYmIHR5cGVvZiBxdWFudGl0eSA9PT0gJ251bWJlcicpIHsKCiAgICBpZiAoYXNzZXJ0KHRvICE9PSBzZW5kZXIsICdjYW5ub3QgdHJhbnNmZXIgdG8gc2VsZicpKSB7CiAgICAgIGxldCBhY2NvdW50ID0gZGIuZmluZE9uZUluVGFibGUoJ2FjY291bnQnLCAnYWNjb3VudHMnLCB7ICdpZCc6IHRvIH0pOwoKICAgICAgLy8gdGhlIGFjY291bnQgbXVzdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCBiZWZvcmUKICAgICAgaWYgKGFzc2VydChhY2NvdW50ICE9PSBudWxsLCAndG8gYWNjb3VudCBkb2VzIG5vdCBleGlzdCcpKSB7CiAgICAgICAgbGV0IHRva2VucyA9IGRiLmdldFRhYmxlKCd0b2tlbnMnKTsKICAgICAgICBsZXQgdG9rZW4gPSB0b2tlbnMuZmluZE9uZSh7IHN5bWJvbCB9KTsKCiAgICAgICAgLy8gdGhlIHN5bWJvbCBtdXN0IGV4aXN0CiAgICAgICAgLy8gdGhlbiB3ZSBuZWVkIHRvIGNoZWNrIHRoYXQgdGhlIHF1YW50aXR5IGlzIGNvcnJlY3QKICAgICAgICBpZiAoYXNzZXJ0KHRva2VuICE9PSBudWxsLCAnc3ltYm9sIGRvZXMgbm90IGV4aXN0JykKICAgICAgICAgICYmIGFzc2VydChjb3VudERlY2ltYWxzKHF1YW50aXR5KSA8PSB0b2tlbi5wcmVjaXNpb24sICdzeW1ib2wgcHJlY2lzaW9uIG1pc21hdGNoJykKICAgICAgICAgICYmIGFzc2VydChxdWFudGl0eSA+IDAsICdtdXN0IHRyYW5zZmVyIHBvc2l0aXZlIHF1YW50aXR5JykpIHsKCiAgICAgICAgICBpZiAoc3ViQmFsYW5jZShzZW5kZXIsIHRva2VuLCBxdWFudGl0eSkpIHsKICAgICAgICAgICAgYWRkQmFsYW5jZSh0bywgdG9rZW4sIHF1YW50aXR5KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn0KCmxldCBzdWJCYWxhbmNlID0gZnVuY3Rpb24gKGFjY291bnQsIHRva2VuLCBxdWFudGl0eSkgewogIGxldCBiYWxhbmNlcyA9IGRiLmdldFRhYmxlKCdiYWxhbmNlcycpOwogIGxldCBiYWxhbmNlID0gYmFsYW5jZXMuZmluZE9uZSh7IGFjY291bnQsICdzeW1ib2wnOiB0b2tlbi5zeW1ib2wgfSk7CiAgZGVidWcoYmFsYW5jZXMuY291bnQoKSkKICBpZiAoYXNzZXJ0KGJhbGFuY2UgIT09IG51bGwsICdiYWxhbmNlIGRvZXMgbm90IGV4aXN0JykgJiYKICAgIGFzc2VydChiYWxhbmNlLmJhbGFuY2UgPj0gcXVhbnRpdHksICdvdmVyZHJhd24gYmFsYW5jZScpKSB7CgogICAgYmFsYW5jZS5iYWxhbmNlID0gY2FsY3VsYXRlQmFsYW5jZShiYWxhbmNlLmJhbGFuY2UsIHF1YW50aXR5LCB0b2tlbi5wcmVjaXNpb24sIGZhbHNlKTsKCiAgICBpZiAoYmFsYW5jZS5iYWxhbmNlIDw9IDApIHsKICAgICAgYmFsYW5jZXMucmVtb3ZlKGJhbGFuY2UpOwogICAgfSBlbHNlIHsKICAgICAgYmFsYW5jZXMudXBkYXRlKGJhbGFuY2UpOwogICAgfQoKICAgIHJldHVybiB0cnVlOwogIH0KCiAgcmV0dXJuIGZhbHNlOwp9CgpsZXQgYWRkQmFsYW5jZSA9IGZ1bmN0aW9uIChhY2NvdW50LCB0b2tlbiwgcXVhbnRpdHkpIHsKICBsZXQgYmFsYW5jZXMgPSBkYi5nZXRUYWJsZSgnYmFsYW5jZXMnKTsKICBsZXQgYmFsYW5jZSA9IGJhbGFuY2VzLmZpbmRPbmUoeyBhY2NvdW50LCAnc3ltYm9sJzogdG9rZW4uc3ltYm9sIH0pOwoKICBpZiAoYmFsYW5jZSA9PT0gbnVsbCkgewogICAgYmFsYW5jZSA9IHsKICAgICAgYWNjb3VudCwKICAgICAgJ3N5bWJvbCc6IHRva2VuLnN5bWJvbCwKICAgICAgJ2JhbGFuY2UnOiBxdWFudGl0eQogICAgfQoKICAgIGJhbGFuY2VzLmluc2VydChiYWxhbmNlKTsKICB9IGVsc2UgewogICAgYmFsYW5jZS5iYWxhbmNlID0gY2FsY3VsYXRlQmFsYW5jZShiYWxhbmNlLmJhbGFuY2UsIHF1YW50aXR5LCB0b2tlbi5wcmVjaXNpb24sIHRydWUpOwoKICAgIGJhbGFuY2VzLnVwZGF0ZShiYWxhbmNlKTsKICB9Cn0KCmxldCBjYWxjdWxhdGVCYWxhbmNlID0gZnVuY3Rpb24gKGJhbGFuY2UsIHF1YW50aXR5LCBwcmVjaXNpb24sIGFkZCkgewogIGlmIChwcmVjaXNpb24gPT09IDApIHsKICAgIHJldHVybiBhZGQgPyBiYWxhbmNlICsgcXVhbnRpdHkgOiBiYWxhbmNlIC0gcXVhbnRpdHkKICB9CgogIGxldCByYXRlID0gTWF0aC5wb3coMTAsIHByZWNpc2lvbik7CiAgbGV0IHRtcFF0eSA9IHF1YW50aXR5ICogcmF0ZTsKICBsZXQgdG1wQmFsYW5jZSA9IGJhbGFuY2UgKiByYXRlOwoKICByZXR1cm4gYWRkID8gKHRtcEJhbGFuY2UgKyB0bXBRdHkpIC8gcmF0ZSA6ICh0bXBCYWxhbmNlIC0gdG1wUXR5KSAvIHJhdGU7Cn0KCmxldCBjb3VudERlY2ltYWxzID0gZnVuY3Rpb24gKHZhbHVlKSB7CiAgaWYgKE1hdGguZmxvb3IodmFsdWUpID09PSB2YWx1ZSkgcmV0dXJuIDA7CiAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCkuc3BsaXQoJy4nKVsxXS5sZW5ndGggfHwgMDsKfQ=="
}
}
}

##STEEMCONTRACTSBEGIN##test_contract_users##addUser##{ "username": "AwesomeUsername" }##STEEMCONTRACTSEND##

##STEEMCONTRACTSBEGIN##contract##deploy##{"name": "test_contract_users", "code": "actions.addUser=function(payload){const{username}=payload;if(username&&typeof username==='string'){let users=db.getTable('users');let user=db.findJsonPath(users,"$..[?(@.id == '"+sender+"')]");if(user){}else{const newUser={'id':sender,'username':username};users.push(newUser)}}}actions.updateUser=function(payload){const{username}=payload;if(username&&typeof username==='string'){let users=db.getTable('users');let user=db.findJsonPath(users,"$..[?(@.id == '"+sender+"')]");if(user)user.username=username}}actions.removeUser=function(payload){if(sender!=owner)return;const{userId}=payload;if(userId&&typeof userId==='string'){let users=db.getTable('users');const index=users.findIndex(user=>user.id===userId);if(index!=-1)users.splice(index,1)}}"}##STEEMCONTRACTSEND##

##STEEMCONTRACTSBEGIN##test_contract_users##addUser##{ "username": "AwesomeUsername" }##STEEMCONTRACTSEND##

##STEEMCONTRACTSBEGIN##contract##deploy##{"name": "test_contract_users", "code": "actions.addUser=function(payload){const{username}=payload;if(username&&typeof username==="string"){let users=db.getTable("users");let user=db.findJsonPath(users,"$..[?(@.id == '"+sender+"')]");if(user){}else{const newUser={"id":sender,"username":username};users.push(newUser)}}}actions.updateUser=function(payload){const{username}=payload;if(username&&typeof username==="string"){let users=db.getTable("users");let user=db.findJsonPath(users,"$..[?(@.id == '"+sender+"')]");if(user)user.username=username}}actions.removeUser=function(payload){if(sender!=owner)return;const{userId}=payload;if(userId&&typeof userId==="string"){let users=db.getTable("users");const index=users.findIndex(user=>user.id===userId);if(index!=-1)users.splice(index,1)}}"}##STEEMCONTRACTSEND##

##STEEMCONTRACTSBEGIN##test_contract_users##addUser##{ "username": "AwesomeUsername" }##STEEMCONTRACTSEND##

##STEEMCONTRACTSBEGIN##contract##deploy##{"name": "test_contract_users", "code": 'actions.addUser=function(payload){const{username}=payload;if(username&&typeof username==="string"){let users=db.getTable("users");let user=db.findJsonPath(users,"$..[?(@.id == '"+sender+"')]");if(user){}else{const newUser={"id":sender,"username":username};users.push(newUser)}}}actions.updateUser=function(payload){const{username}=payload;if(username&&typeof username==="string"){let users=db.getTable("users");let user=db.findJsonPath(users,"$..[?(@.id == '"+sender+"')]");if(user)user.username=username}}actions.removeUser=function(payload){if(sender!=owner)return;const{userId}=payload;if(userId&&typeof userId==="string"){let users=db.getTable("users");const index=users.findIndex(user=>user.id===userId);if(index!=-1)users.splice(index,1)}}'}##STEEMCONTRACTSEND##

##STEEMCONTRACTSBEGIN##test_contract_users##addUser##{ "username": "AwesomeUsername" }##STEEMCONTRACTSEND##

##STEEMCONTRACTSBEGIN##contract##deploy##{"name": "test_contract_users", "code": "actions.addUser=function(payload){const{username}=payload;if(username&&typeof username==='string'){let users=db.getTable('users');let user=db.findJsonPath(users,'$..[?(@.id == ''+sender+'')]');if(user){}else{const newUser={'id':sender,'username':username};users.push(newUser)}}}actions.updateUser=function(payload){const{username}=payload;if(username&&typeof username==='string'){let users=db.getTable('users');let user=db.findJsonPath(users,'$..[?(@.id == ''+sender+'')]');if(user)user.username=username}}actions.removeUser=function(payload){if(sender!=owner)return;const{userId}=payload;if(userId&&typeof userId==='string'){let users=db.getTable('users');const index=users.findIndex(user=>user.id===userId);if(index!=-1)users.splice(index,1)}}"}##STEEMCONTRACTSEND##

##STEEMCONTRACTSBEGIN##test_contract_users##addUser##{ "username": "AwesomeUsername" }##STEEMCONTRACTSEND##

##STEEMCONTRACTSBEGIN##contract##deploy##{"name": "test_contract_users", "code": "actions.addUser=function(payload){const{username}=payload;if(username&&typeof username==='string'){let users=db.getTable('users');let user=db.findJsonPath(users,'$..[?(@.id == ''+sender+'')]');if(user){}else{const newUser={'id':sender,'username':username};users.push(newUser)}}}actions.updateUser=function(payload){const{username}=payload;if(username&&typeof username==='string'){let users=db.getTable('users');let user=db.findJsonPath(users,'$..[?(@.id == ''+sender+'')]');if(user)user.username=username}}actions.removeUser=function(payload){if(sender!=owner)return;const{userId}=payload;if(userId&&typeof userId==='string'){let users=db.getTable('users');const index=users.findIndex(user=>user.id===userId);if(index!=-1)users.splice(index,1)}}"}##STEEMCONTRACTSEND##

##STEEMCONTRACTSBEGIN##test_contract_users##addUser##{ "username": "AwesomeUsername" }##STEEMCONTRACTSEND##

##STEEMCONTRACTSBEGIN##contract##deploy##{"name": "test_contract_users", "code": "YWN0aW9ucy5hZGRVc2VyID0gZnVuY3Rpb24gKHBheWxvYWQpIHsNCiAgICBjb25zdCB7IHVzZXJuYW1lIH0gPSBwYXlsb2FkOw0KICAgIGlmICh1c2VybmFtZSAmJiB0eXBlb2YgdXNlcm5hbWUgPT09ICdzdHJpbmcnKXsNCg0KICAgICAgbGV0IHVzZXJzID0gZGIuZ2V0VGFibGUoJ3VzZXJzJyk7DQoNCiAgICAgIGxldCB1c2VyID0gZGIuZmluZEpzb25QYXRoKHVzZXJzLCBgJC4uWz8oQC5pZCA9PSAnXCR7c2VuZGVyfScpXWApOw0KDQogICAgICBpZiAodXNlcikgew0KICAgICAgICAvLyB1c2VyIGFscmVhZHkgZXhpc3RzDQogICAgICB9IGVsc2Ugew0KICAgICAgICBjb25zdCBuZXdVc2VyID0gew0KICAgICAgICAgICdpZCc6IHNlbmRlciwNCiAgICAgICAgICAndXNlcm5hbWUnOiB1c2VybmFtZQ0KICAgICAgICB9Ow0KICAgICAgICB1c2Vycy5wdXNoKG5ld1VzZXIpOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIGFjdGlvbnMudXBkYXRlVXNlciA9IGZ1bmN0aW9uIChwYXlsb2FkKSB7DQogICAgY29uc3QgeyB1c2VybmFtZSB9ID0gcGF5bG9hZDsNCiAgICBpZiAodXNlcm5hbWUgJiYgdHlwZW9mIHVzZXJuYW1lID09PSAnc3RyaW5nJyl7DQoNCiAgICAgIGxldCB1c2VycyA9IGRiLmdldFRhYmxlKCd1c2VycycpOw0KICAgICAgbGV0IHVzZXIgPSBkYi5maW5kSnNvblBhdGgodXNlcnMsIGAkLi5bPyhALmlkID09ICdcJHtzZW5kZXJ9JyldYCk7DQogICAgICBpZiAodXNlcikNCiAgICAgICAgdXNlci51c2VybmFtZSA9IHVzZXJuYW1lOw0KICAgIH0NCiAgfQ0KDQogIGFjdGlvbnMucmVtb3ZlVXNlciA9IGZ1bmN0aW9uIChwYXlsb2FkKSB7DQogICAgaWYgKHNlbmRlciAhPSBvd25lcikgcmV0dXJuOw0KICAgIA0KICAgIGNvbnN0IHsgdXNlcklkIH0gPSBwYXlsb2FkOw0KDQogICAgaWYgKHVzZXJJZCAmJiB0eXBlb2YgdXNlcklkID09PSAnc3RyaW5nJyl7DQogICAgICBsZXQgdXNlcnMgPSBkYi5nZXRUYWJsZSgndXNlcnMnKTsNCiAgICAgIGNvbnN0IGluZGV4ID0gdXNlcnMuZmluZEluZGV4KHVzZXIgPT4gdXNlci5pZCA9PT0gdXNlcklkKTsNCiAgICAgIGlmIChpbmRleCAhPSAtMSkNCiAgICAgICAgdXNlcnMuc3BsaWNlKGluZGV4LCAxKTsNCiAgICB9DQogIH0="}##STEEMCONTRACTSEND##

##STEEMCONTRACTSBEGIN##test_contract_users##addUser##{ "username": "AwesomeUsername" }##STEEMCONTRACTSEND##

##STEEMCONTRACTSBEGIN##contract##deploy##{"name": "users_contract", "code": "YWN0aW9ucy5jcmVhdGUgPSBmdW5jdGlvbiAocGF5bG9hZCkgew0KICAgICAgZGIuY3JlYXRlVGFibGUoJ3VzZXJzJyk7DQogICAgfQ0KDQogICAgYWN0aW9ucy5hZGRVc2VyID0gZnVuY3Rpb24gKHBheWxvYWQpIHsNCiAgICAgIGNvbnN0IHsgdXNlcm5hbWUgfSA9IHBheWxvYWQ7DQogICAgICBpZiAodXNlcm5hbWUgJiYgdHlwZW9mIHVzZXJuYW1lID09PSAnc3RyaW5nJyl7DQoNCiAgICAgICAgbGV0IHVzZXJzID0gZGIuZ2V0VGFibGUoJ3VzZXJzJyk7DQoNCiAgICAgICAgbGV0IHVzZXIgPSB1c2Vycy5maW5kT25lKHsgJ2lkJzogc2VuZGVyIH0pOw0KDQogICAgICAgIGlmICh1c2VyID09PSBudWxsKSB7DQogICAgICAgICAgY29uc3QgbmV3VXNlciA9IHsNCiAgICAgICAgICAgICdpZCc6IHNlbmRlciwNCiAgICAgICAgICAgICd1c2VybmFtZSc6IHVzZXJuYW1lLA0KICAgICAgICAgICAgJ3ZlcmlmaWVkJzogZmFsc2UsDQogICAgICAgICAgfTsNCg0KICAgICAgICAgIHVzZXJzLmluc2VydChuZXdVc2VyKTsNCiAgICAgICAgICBlbWl0KCduZXdVc2VyQ3JlYXRlZCcsIG5ld1VzZXIpOw0KICAgICAgICB9IA0KICAgICAgfQ0KICAgIH0NCg0KICAgIGFjdGlvbnMudXBkYXRlVXNlciA9IGZ1bmN0aW9uIChwYXlsb2FkKSB7DQogICAgICBjb25zdCB7IHVzZXJuYW1lIH0gPSBwYXlsb2FkOw0KICAgICAgaWYgKHVzZXJuYW1lICYmIHR5cGVvZiB1c2VybmFtZSA9PT0gJ3N0cmluZycpew0KDQogICAgICAgIGxldCB1c2VycyA9IGRiLmdldFRhYmxlKCd1c2VycycpOw0KICAgICAgICBsZXQgdXNlciA9IHVzZXJzLmZpbmRPbmUoeyAnaWQnOiBzZW5kZXIgfSk7DQogICAgICAgIGlmICh1c2VyKSB7DQogICAgICAgICAgdXNlci51c2VybmFtZSA9IHVzZXJuYW1lOw0KICAgICAgICAgIHVzZXJzLnVwZGF0ZSh1c2VyKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0="##STEEMCONTRACTSEND##

##STEEMCONTRACTSBEGIN##users_contract##addUser##{ "username": "AwesomeUsername" }##STEEMCONTRACTSEND##

##STEEMCONTRACTSBEGIN##contract##deploy##{"name": "users_contract", "code": "YWN0aW9ucy5jcmVhdGUgPSBmdW5jdGlvbiAocGF5bG9hZCkgew0KICAgICAgZGIuY3JlYXRlVGFibGUoJ3VzZXJzJyk7DQogICAgfQ0KDQogICAgYWN0aW9ucy5hZGRVc2VyID0gZnVuY3Rpb24gKHBheWxvYWQpIHsNCiAgICAgIGNvbnN0IHsgdXNlcm5hbWUgfSA9IHBheWxvYWQ7DQogICAgICBpZiAodXNlcm5hbWUgJiYgdHlwZW9mIHVzZXJuYW1lID09PSAnc3RyaW5nJyl7DQoNCiAgICAgICAgbGV0IHVzZXJzID0gZGIuZ2V0VGFibGUoJ3VzZXJzJyk7DQoNCiAgICAgICAgbGV0IHVzZXIgPSB1c2Vycy5maW5kT25lKHsgJ2lkJzogc2VuZGVyIH0pOw0KDQogICAgICAgIGlmICh1c2VyID09PSBudWxsKSB7DQogICAgICAgICAgY29uc3QgbmV3VXNlciA9IHsNCiAgICAgICAgICAgICdpZCc6IHNlbmRlciwNCiAgICAgICAgICAgICd1c2VybmFtZSc6IHVzZXJuYW1lLA0KICAgICAgICAgICAgJ3ZlcmlmaWVkJzogZmFsc2UsDQogICAgICAgICAgfTsNCg0KICAgICAgICAgIHVzZXJzLmluc2VydChuZXdVc2VyKTsNCiAgICAgICAgICBlbWl0KCduZXdVc2VyQ3JlYXRlZCcsIG5ld1VzZXIpOw0KICAgICAgICB9IA0KICAgICAgfQ0KICAgIH0NCg0KICAgIGFjdGlvbnMudXBkYXRlVXNlciA9IGZ1bmN0aW9uIChwYXlsb2FkKSB7DQogICAgICBjb25zdCB7IHVzZXJuYW1lIH0gPSBwYXlsb2FkOw0KICAgICAgaWYgKHVzZXJuYW1lICYmIHR5cGVvZiB1c2VybmFtZSA9PT0gJ3N0cmluZycpew0KDQogICAgICAgIGxldCB1c2VycyA9IGRiLmdldFRhYmxlKCd1c2VycycpOw0KICAgICAgICBsZXQgdXNlciA9IHVzZXJzLmZpbmRPbmUoeyAnaWQnOiBzZW5kZXIgfSk7DQogICAgICAgIGlmICh1c2VyKSB7DQogICAgICAgICAgdXNlci51c2VybmFtZSA9IHVzZXJuYW1lOw0KICAgICAgICAgIHVzZXJzLnVwZGF0ZSh1c2VyKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0="}##STEEMCONTRACTSEND##

##STEEMCONTRACTSBEGIN##users_contract##addUser##{ "username": "AwesomeUsername" }##STEEMCONTRACTSEND##

##STEEMCONTRACTSBEGIN##contract##deploy##{"name": "users_test_contract", "code": "YWN0aW9ucy5jcmVhdGUgPSBmdW5jdGlvbiAocGF5bG9hZCkgew0KICAgICAgZGIuY3JlYXRlVGFibGUoJ3VzZXJzJyk7DQogICAgfQ0KDQogICAgYWN0aW9ucy5hZGRVc2VyID0gZnVuY3Rpb24gKHBheWxvYWQpIHsNCiAgICAgIGNvbnN0IHsgdXNlcm5hbWUgfSA9IHBheWxvYWQ7DQogICAgICBpZiAodXNlcm5hbWUgJiYgdHlwZW9mIHVzZXJuYW1lID09PSAnc3RyaW5nJyl7DQoNCiAgICAgICAgbGV0IHVzZXJzID0gZGIuZ2V0VGFibGUoJ3VzZXJzJyk7DQoNCiAgICAgICAgbGV0IHVzZXIgPSB1c2Vycy5maW5kT25lKHsgJ2lkJzogc2VuZGVyIH0pOw0KDQogICAgICAgIGlmICh1c2VyID09PSBudWxsKSB7DQogICAgICAgICAgY29uc3QgbmV3VXNlciA9IHsNCiAgICAgICAgICAgICdpZCc6IHNlbmRlciwNCiAgICAgICAgICAgICd1c2VybmFtZSc6IHVzZXJuYW1lLA0KICAgICAgICAgICAgJ3ZlcmlmaWVkJzogZmFsc2UsDQogICAgICAgICAgfTsNCg0KICAgICAgICAgIHVzZXJzLmluc2VydChuZXdVc2VyKTsNCiAgICAgICAgICBlbWl0KCduZXdVc2VyQ3JlYXRlZCcsIG5ld1VzZXIpOw0KICAgICAgICB9IA0KICAgICAgfQ0KICAgIH0NCg0KICAgIGFjdGlvbnMudXBkYXRlVXNlciA9IGZ1bmN0aW9uIChwYXlsb2FkKSB7DQogICAgICBjb25zdCB7IHVzZXJuYW1lIH0gPSBwYXlsb2FkOw0KICAgICAgaWYgKHVzZXJuYW1lICYmIHR5cGVvZiB1c2VybmFtZSA9PT0gJ3N0cmluZycpew0KDQogICAgICAgIGxldCB1c2VycyA9IGRiLmdldFRhYmxlKCd1c2VycycpOw0KICAgICAgICBsZXQgdXNlciA9IHVzZXJzLmZpbmRPbmUoeyAnaWQnOiBzZW5kZXIgfSk7DQogICAgICAgIGlmICh1c2VyKSB7DQogICAgICAgICAgdXNlci51c2VybmFtZSA9IHVzZXJuYW1lOw0KICAgICAgICAgIHVzZXJzLnVwZGF0ZSh1c2VyKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0="}##STEEMCONTRACTSEND##

##STEEMCONTRACTSBEGIN##users_contract##addUser##{ "username": "AwesomeUsername" }##STEEMCONTRACTSEND##

##STEEMCONTRACTSBEGIN##users_test_contract##addUser##{ "username": "AwesomeUsername" }##STEEMCONTRACTSEND##

{
"id": "ssc-b8923f70-c1f7-497f-961d",
"json": {
"contractName": "contract",
"contractAction": "deploy",
"contractPayload": {
"name": "account2",
"code": "YWN0aW9ucy5jcmVhdGVTU0MgPSBmdW5jdGlvbiAocGF5bG9hZCkgewogIGRiLmNyZWF0ZVRhYmxlKCdhY2NvdW50cycpOwp9CgovLyByZWdpc3RlciBhbiBhY2NvdW50IGhlbHBzIG90aGVyIGNvbnRyYWN0cyB0byBrbm93IAovLyBpZiBhbiBhY2NvdW50IGV4aXN0cyBvbiB0aGUgU3RlZW0gYmxvY2tjaGFpbgphY3Rpb25zLnJlZ2lzdGVyID0gZnVuY3Rpb24gKHBheWxvYWQpIHsKICBsZXQgYWNjb3VudHMgPSBkYi5nZXRUYWJsZSgnYWNjb3VudHMnKTsKCiAgbGV0IGFjY291bnQgPSBhY2NvdW50cy5maW5kT25lKHsgJ2lkJzogc2VuZGVyIH0pOwoKICBpZiAoYWNjb3VudCA9PT0gbnVsbCkgewogICAgY29uc3QgbmV3QWNjb3VudCA9IHsKICAgICAgJ2lkJzogc2VuZGVyCiAgICB9OwoKICAgIGFjY291bnRzLmluc2VydChuZXdBY2NvdW50KTsKICB9IAp9"
}
}
}

{
"id": "ssc-b8923f70-c1f7-497f-961l",
"json": {
"contractName": "contract",
"contractAction": "deploy",
"contractPayload": {
"name": "account",
"code": "YWN0aW9ucy5jcmVhdGVTU0MgPSBmdW5jdGlvbiAocGF5bG9hZCkgewogIGRiLmNyZWF0ZVRhYmxlKCdhY2NvdW50cycpOwp9CgovLyByZWdpc3RlciBhbiBhY2NvdW50IGhlbHBzIG90aGVyIGNvbnRyYWN0cyB0byBrbm93IAovLyBpZiBhbiBhY2NvdW50IGV4aXN0cyBvbiB0aGUgU3RlZW0gYmxvY2tjaGFpbgphY3Rpb25zLnJlZ2lzdGVyID0gZnVuY3Rpb24gKHBheWxvYWQpIHsKICBsZXQgYWNjb3VudHMgPSBkYi5nZXRUYWJsZSgnYWNjb3VudHMnKTsKCiAgbGV0IGFjY291bnQgPSBhY2NvdW50cy5maW5kT25lKHsgJ2lkJzogc2VuZGVyIH0pOwoKICBpZiAoYWNjb3VudCA9PT0gbnVsbCkgewogICAgY29uc3QgbmV3QWNjb3VudCA9IHsKICAgICAgJ2lkJzogc2VuZGVyCiAgICB9OwoKICAgIGFjY291bnRzLmluc2VydChuZXdBY2NvdW50KTsKICB9IAp9"
}
}
}

{
"id": "ssc-b8923f70-c1f7-497f-961l",
"json": {
"contractName": "account",
"contractAction": "register",
"contractPayload": {}
}
}

{
"id": "ssc-b8923f70-c1f7-497f-961l",
"json": {
"contractName": "contract",
"contractAction": "deploy",
"contractPayload": {
"name": "token",
"code": "YWN0aW9ucy5jcmVhdGVTU0MgPSBmdW5jdGlvbiAocGF5bG9hZCkgewogICAgICBkYi5jcmVhdGVUYWJsZSgndG9rZW5zJyk7CiAgICAgIGRiLmNyZWF0ZVRhYmxlKCdiYWxhbmNlcycpOwogICAgfQogICAgCiAgICBhY3Rpb25zLmNyZWF0ZSA9IGZ1bmN0aW9uIChwYXlsb2FkKSB7CiAgICAgIGNvbnN0IHsgc3ltYm9sLCBwcmVjaXNpb24sIG1heFN1cHBseSB9ID0gcGF5bG9hZDsKICAgIAogICAgICBpZiAoc3ltYm9sICYmIHR5cGVvZiBzeW1ib2wgPT09ICdzdHJpbmcnCiAgICAgICAgJiYgKHByZWNpc2lvbiAmJiB0eXBlb2YgcHJlY2lzaW9uID09PSAnbnVtYmVyJyB8fCBwcmVjaXNpb24gPT09IDApCiAgICAgICAgJiYgbWF4U3VwcGx5ICYmIHR5cGVvZiBtYXhTdXBwbHkgPT09ICdudW1iZXInKSB7CiAgICAKICAgICAgICBjb25zdCBSZWdleFB1cmVMZXR0ZXJzID0gL15bYS16QS1aXSskLzsKICAgIAogICAgICAgIC8vIHRoZSBzeW1ib2wgbXVzdCBiZSBtYWRlIG9mIGxldHRlcnMgb25seQogICAgICAgIC8vIHRoZSBwcmVjaXNpb24gbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDggYW5kIG11c3QgYmUgYW4gaW50ZWdlcgogICAgICAgIC8vIHRoZSBtYXggc3VwcGx5IG11c3QgYmUgcG9zaXRpdmUKICAgICAgICBpZiAoYXNzZXJ0KFJlZ2V4UHVyZUxldHRlcnMudGVzdChzeW1ib2wpLCAnaW52YWxpZCBzeW1ib2wnKQogICAgICAgICAgJiYgYXNzZXJ0KChwcmVjaXNpb24gPj0gMCAmJiBwcmVjaXNpb24gPD0gOCkgJiYgKE51bWJlci5pc0ludGVnZXIocHJlY2lzaW9uKSksICdpbnZhbGlkIHByZWNpc2lvbicpCiAgICAgICAgICAmJiBhc3NlcnQobWF4U3VwcGx5ID4gMCwgJ21heFN1cHBseSBtdXN0IGJlIHBvc2l0aXZlJykpIHsKICAgICAgICAgIGxldCB0b2tlbnMgPSBkYi5nZXRUYWJsZSgndG9rZW5zJyk7CiAgICAKICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSB0b2tlbiBhbHJlYWR5IGV4aXN0cwogICAgICAgICAgbGV0IHRva2VuID0gdG9rZW5zLmZpbmRPbmUoeyBzeW1ib2wgfSk7CiAgICAKICAgICAgICAgIGlmIChhc3NlcnQodG9rZW4gPT09IG51bGwsICdzeW1ib2wgYWxyZWFkeSBleGlzdHMnKSkgewogICAgICAgICAgICBjb25zdCBuZXdUb2tlbiA9IHsKICAgICAgICAgICAgICAnaXNzdWVyJzogc2VuZGVyLAogICAgICAgICAgICAgIHN5bWJvbCwKICAgICAgICAgICAgICBwcmVjaXNpb24sCiAgICAgICAgICAgICAgbWF4U3VwcGx5LAogICAgICAgICAgICAgICdzdXBwbHknOiAwCiAgICAgICAgICAgIH07CiAgICAKICAgICAgICAgICAgdG9rZW5zLmluc2VydChuZXdUb2tlbik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAKICAgIGFjdGlvbnMuaXNzdWUgPSBmdW5jdGlvbiAocGF5bG9hZCkgewogICAgICBjb25zdCB7IHRvLCBzeW1ib2wsIHF1YW50aXR5LCBpc1NpZ25lZFdpdGhBY3RpdmVLZXkgfSA9IHBheWxvYWQ7CiAgICAKICAgICAgaWYgKGFzc2VydChpc1NpZ25lZFdpdGhBY3RpdmVLZXkgPT09IHRydWUsICd5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXknKQogICAgICAgICYmIHRvICYmIHR5cGVvZiB0byA9PT0gJ3N0cmluZycKICAgICAgICAmJiBzeW1ib2wgJiYgdHlwZW9mIHN5bWJvbCA9PT0gJ3N0cmluZycKICAgICAgICAmJiBxdWFudGl0eSAmJiB0eXBlb2YgcXVhbnRpdHkgPT09ICdudW1iZXInKSB7CiAgICAKICAgICAgICBsZXQgdG9rZW5zID0gZGIuZ2V0VGFibGUoJ3Rva2VucycpOwogICAgICAgIGxldCB0b2tlbiA9IHRva2Vucy5maW5kT25lKHsgc3ltYm9sIH0pOwogICAgCiAgICAgICAgLy8gdGhlIHN5bWJvbCBtdXN0IGV4aXN0CiAgICAgICAgLy8gdGhlIHNlbmRlciBtdXN0IGJlIHRoZSBpc3N1ZXIKICAgICAgICAvLyB0aGVuIHdlIG5lZWQgdG8gY2hlY2sgdGhhdCB0aGUgcXVhbnRpdHkgaXMgY29ycmVjdAogICAgICAgIGlmIChhc3NlcnQodG9rZW4gIT09IG51bGwsICdzeW1ib2wgZG9lcyBub3QgZXhpc3QnKQogICAgICAgICAgJiYgYXNzZXJ0KHRva2VuLmlzc3VlciA9PT0gc2VuZGVyLCAnbm90IGFsbG93ZWQgdG8gaXNzdWUgdG9rZW5zJykKICAgICAgICAgICYmIGFzc2VydChjb3VudERlY2ltYWxzKHF1YW50aXR5KSA8PSB0b2tlbi5wcmVjaXNpb24sICdzeW1ib2wgcHJlY2lzaW9uIG1pc21hdGNoJykKICAgICAgICAgICYmIGFzc2VydChxdWFudGl0eSA+IDAsICdtdXN0IGlzc3VlIHBvc2l0aXZlIHF1YW50aXR5JykKICAgICAgICAgICYmIGFzc2VydChxdWFudGl0eSA8PSAodG9rZW4ubWF4U3VwcGx5IC0gdG9rZW4uc3VwcGx5KSwgJ3F1YW50aXR5IGV4Y2VlZHMgYXZhaWxhYmxlIHN1cHBseScpKSB7CiAgICAKICAgICAgICAgIGxldCBhY2NvdW50ID0gZGIuZmluZE9uZUluVGFibGUoJ2FjY291bnQnLCAnYWNjb3VudHMnLCB7ICdpZCc6IHRvIH0pOwogICAgCiAgICAgICAgICAvLyB0aGUgYWNjb3VudCBtdXN0IGhhdmUgYmVlbiByZWdpc3RlcmVkIGJlZm9yZQogICAgICAgICAgaWYgKGFzc2VydChhY2NvdW50ICE9PSBudWxsLCAndG8gYWNjb3VudCBkb2VzIG5vdCBleGlzdCcpKSB7CiAgICAgICAgICAgIC8vIHdlIG1hZGUgYWxsIHRoZSByZXF1aXJlZCB2ZXJpZmljYXRpb24sIGxldCdzIG5vdyBpc3N1ZSB0aGUgdG9rZW5zCiAgICAKICAgICAgICAgICAgdG9rZW4uc3VwcGx5ID0gY2FsY3VsYXRlQmFsYW5jZSh0b2tlbi5zdXBwbHksIHF1YW50aXR5LCB0b2tlbi5wcmVjaXNpb24sIHRydWUpOwogICAgICAgICAgICB0b2tlbnMudXBkYXRlKHRva2VuKTsKICAgIAogICAgICAgICAgICBhZGRCYWxhbmNlKHRva2VuLmlzc3VlciwgdG9rZW4sIHF1YW50aXR5KTsKICAgIAogICAgICAgICAgICBpZiAodG8gIT09IHRva2VuLmlzc3VlcikgewogICAgICAgICAgICAgIGFjdGlvbnMudHJhbnNmZXIocGF5bG9hZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIAogICAgYWN0aW9ucy50cmFuc2ZlciA9IGZ1bmN0aW9uIChwYXlsb2FkKSB7CiAgICAgIGNvbnN0IHsgdG8sIHN5bWJvbCwgcXVhbnRpdHksIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSB9ID0gcGF5bG9hZDsKICAgIAogICAgICBpZiAoYXNzZXJ0KGlzU2lnbmVkV2l0aEFjdGl2ZUtleSA9PT0gdHJ1ZSwgJ3lvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleScpCiAgICAgICAgJiYgdG8gJiYgdHlwZW9mIHRvID09PSAnc3RyaW5nJwogICAgICAgICYmIHN5bWJvbCAmJiB0eXBlb2Ygc3ltYm9sID09PSAnc3RyaW5nJwogICAgICAgICYmIHF1YW50aXR5ICYmIHR5cGVvZiBxdWFudGl0eSA9PT0gJ251bWJlcicpIHsKICAgIAogICAgICAgIGlmIChhc3NlcnQodG8gIT09IHNlbmRlciwgJ2Nhbm5vdCB0cmFuc2ZlciB0byBzZWxmJykpIHsKICAgICAgICAgIGxldCBhY2NvdW50ID0gZGIuZmluZE9uZUluVGFibGUoJ2FjY291bnQnLCAnYWNjb3VudHMnLCB7ICdpZCc6IHRvIH0pOwogICAgCiAgICAgICAgICAvLyB0aGUgYWNjb3VudCBtdXN0IGhhdmUgYmVlbiByZWdpc3RlcmVkIGJlZm9yZQogICAgICAgICAgaWYgKGFzc2VydChhY2NvdW50ICE9PSBudWxsLCAndG8gYWNjb3VudCBkb2VzIG5vdCBleGlzdCcpKSB7CiAgICAgICAgICAgIGxldCB0b2tlbnMgPSBkYi5nZXRUYWJsZSgndG9rZW5zJyk7CiAgICAgICAgICAgIGxldCB0b2tlbiA9IHRva2Vucy5maW5kT25lKHsgc3ltYm9sIH0pOwogICAgCiAgICAgICAgICAgIC8vIHRoZSBzeW1ib2wgbXVzdCBleGlzdAogICAgICAgICAgICAvLyB0aGVuIHdlIG5lZWQgdG8gY2hlY2sgdGhhdCB0aGUgcXVhbnRpdHkgaXMgY29ycmVjdAogICAgICAgICAgICBpZiAoYXNzZXJ0KHRva2VuICE9PSBudWxsLCAnc3ltYm9sIGRvZXMgbm90IGV4aXN0JykKICAgICAgICAgICAgICAmJiBhc3NlcnQoY291bnREZWNpbWFscyhxdWFudGl0eSkgPD0gdG9rZW4ucHJlY2lzaW9uLCAnc3ltYm9sIHByZWNpc2lvbiBtaXNtYXRjaCcpCiAgICAgICAgICAgICAgJiYgYXNzZXJ0KHF1YW50aXR5ID4gMCwgJ211c3QgdHJhbnNmZXIgcG9zaXRpdmUgcXVhbnRpdHknKSkgewogICAgCiAgICAgICAgICAgICAgaWYgKHN1YkJhbGFuY2Uoc2VuZGVyLCB0b2tlbiwgcXVhbnRpdHkpKSB7CiAgICAgICAgICAgICAgICBhZGRCYWxhbmNlKHRvLCB0b2tlbiwgcXVhbnRpdHkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgCiAgICBsZXQgc3ViQmFsYW5jZSA9IGZ1bmN0aW9uIChhY2NvdW50LCB0b2tlbiwgcXVhbnRpdHkpIHsKICAgICAgbGV0IGJhbGFuY2VzID0gZGIuZ2V0VGFibGUoJ2JhbGFuY2VzJyk7CiAgICAgIGxldCBiYWxhbmNlID0gYmFsYW5jZXMuZmluZE9uZSh7IGFjY291bnQsICdzeW1ib2wnOiB0b2tlbi5zeW1ib2wgfSk7CiAgICAgIGlmIChhc3NlcnQoYmFsYW5jZSAhPT0gbnVsbCwgJ2JhbGFuY2UgZG9lcyBub3QgZXhpc3QnKSAmJgogICAgICAgIGFzc2VydChiYWxhbmNlLmJhbGFuY2UgPj0gcXVhbnRpdHksICdvdmVyZHJhd24gYmFsYW5jZScpKSB7CiAgICAKICAgICAgICBiYWxhbmNlLmJhbGFuY2UgPSBjYWxjdWxhdGVCYWxhbmNlKGJhbGFuY2UuYmFsYW5jZSwgcXVhbnRpdHksIHRva2VuLnByZWNpc2lvbiwgZmFsc2UpOwogICAgCiAgICAgICAgaWYgKGJhbGFuY2UuYmFsYW5jZSA8PSAwKSB7CiAgICAgICAgICBiYWxhbmNlcy5yZW1vdmUoYmFsYW5jZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGJhbGFuY2VzLnVwZGF0ZShiYWxhbmNlKTsKICAgICAgICB9CiAgICAKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgCiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIAogICAgbGV0IGFkZEJhbGFuY2UgPSBmdW5jdGlvbiAoYWNjb3VudCwgdG9rZW4sIHF1YW50aXR5KSB7CiAgICAgIGxldCBiYWxhbmNlcyA9IGRiLmdldFRhYmxlKCdiYWxhbmNlcycpOwogICAgICBsZXQgYmFsYW5jZSA9IGJhbGFuY2VzLmZpbmRPbmUoeyBhY2NvdW50LCAnc3ltYm9sJzogdG9rZW4uc3ltYm9sIH0pOwogICAgCiAgICAgIGlmIChiYWxhbmNlID09PSBudWxsKSB7CiAgICAgICAgYmFsYW5jZSA9IHsKICAgICAgICAgIGFjY291bnQsCiAgICAgICAgICAnc3ltYm9sJzogdG9rZW4uc3ltYm9sLAogICAgICAgICAgJ2JhbGFuY2UnOiBxdWFudGl0eQogICAgICAgIH0KICAgICAgICAKICAgICAgICBiYWxhbmNlcy5pbnNlcnQoYmFsYW5jZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYmFsYW5jZS5iYWxhbmNlID0gY2FsY3VsYXRlQmFsYW5jZShiYWxhbmNlLmJhbGFuY2UsIHF1YW50aXR5LCB0b2tlbi5wcmVjaXNpb24sIHRydWUpOwogICAgCiAgICAgICAgYmFsYW5jZXMudXBkYXRlKGJhbGFuY2UpOwogICAgICB9CiAgICB9CiAgICAKICAgIGxldCBjYWxjdWxhdGVCYWxhbmNlID0gZnVuY3Rpb24gKGJhbGFuY2UsIHF1YW50aXR5LCBwcmVjaXNpb24sIGFkZCkgewogICAgICBpZiAocHJlY2lzaW9uID09PSAwKSB7CiAgICAgICAgcmV0dXJuIGFkZCA/IGJhbGFuY2UgKyBxdWFudGl0eSA6IGJhbGFuY2UgLSBxdWFudGl0eQogICAgICB9CiAgICAgIAogICAgICByZXR1cm4gYWRkID8gY3VycmVuY3koYmFsYW5jZSwgeyBwcmVjaXNpb24gfSkuc3VidHJhY3QocXVhbnRpdHkpIDogY3VycmVuY3koYmFsYW5jZSwgeyBwcmVjaXNpb24gfSkuc3VidHJhY3QocXVhbnRpdHkpOwogICAgfQogICAgCiAgICBsZXQgY291bnREZWNpbWFscyA9IGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICBpZiAoTWF0aC5mbG9vcih2YWx1ZSkgPT09IHZhbHVlKSByZXR1cm4gMDsKICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCkuc3BsaXQoJy4nKVsxXS5sZW5ndGggfHwgMDsKICAgIH0="
}
}
}

{
"id": "ssc-b8923f70-c1f7-497f-961l",
"json": {
"contractName": "token",
"contractAction": "create",
"contractPayload": {
"symbol": "PKTC",
"precision": 0,
"maxSupply": 1000000
}
}
}

{
"id": "ssc-b8923f70-c1f7-497f-961j",
"json": {
"contractName": "contract",
"contractAction": "deploy",
"contractPayload": {
"name": "account",
"code": "YWN0aW9ucy5jcmVhdGVTU0MgPSBmdW5jdGlvbiAocGF5bG9hZCkgewogIGRiLmNyZWF0ZVRhYmxlKCdhY2NvdW50cycpOwp9CgovLyByZWdpc3RlciBhbiBhY2NvdW50IGhlbHBzIG90aGVyIGNvbnRyYWN0cyB0byBrbm93IAovLyBpZiBhbiBhY2NvdW50IGV4aXN0cyBvbiB0aGUgU3RlZW0gYmxvY2tjaGFpbgphY3Rpb25zLnJlZ2lzdGVyID0gZnVuY3Rpb24gKHBheWxvYWQpIHsKICBsZXQgYWNjb3VudHMgPSBkYi5nZXRUYWJsZSgnYWNjb3VudHMnKTsKCiAgbGV0IGFjY291bnQgPSBhY2NvdW50cy5maW5kT25lKHsgJ2lkJzogc2VuZGVyIH0pOwoKICBpZiAoYWNjb3VudCA9PT0gbnVsbCkgewogICAgY29uc3QgbmV3QWNjb3VudCA9IHsKICAgICAgJ2lkJzogc2VuZGVyCiAgICB9OwoKICAgIGFjY291bnRzLmluc2VydChuZXdBY2NvdW50KTsKICB9IAp9"
}
}
}

{
"id": "ssc-b8923f70-c1f7-497f-961j",
"json": {
"contractName": "account",
"contractAction": "register",
"contractPayload": {}
}
}

{
"id": "ssc-b8923f70-c1f7-497f-961j",
"json": {
"contractName": "contract",
"contractAction": "deploy",
"contractPayload": {
"name": "token",
"code": "YWN0aW9ucy5jcmVhdGVTU0MgPSBmdW5jdGlvbiAocGF5bG9hZCkgewogICAgICBkYi5jcmVhdGVUYWJsZSgndG9rZW5zJyk7CiAgICAgIGRiLmNyZWF0ZVRhYmxlKCdiYWxhbmNlcycpOwogICAgfQogICAgCiAgICBhY3Rpb25zLmNyZWF0ZSA9IGZ1bmN0aW9uIChwYXlsb2FkKSB7CiAgICAgIGNvbnN0IHsgc3ltYm9sLCBwcmVjaXNpb24sIG1heFN1cHBseSB9ID0gcGF5bG9hZDsKICAgIAogICAgICBpZiAoc3ltYm9sICYmIHR5cGVvZiBzeW1ib2wgPT09ICdzdHJpbmcnCiAgICAgICAgJiYgKHByZWNpc2lvbiAmJiB0eXBlb2YgcHJlY2lzaW9uID09PSAnbnVtYmVyJyB8fCBwcmVjaXNpb24gPT09IDApCiAgICAgICAgJiYgbWF4U3VwcGx5ICYmIHR5cGVvZiBtYXhTdXBwbHkgPT09ICdudW1iZXInKSB7CiAgICAKICAgICAgICBjb25zdCBSZWdleFB1cmVMZXR0ZXJzID0gL15bYS16QS1aXSskLzsKICAgIAogICAgICAgIC8vIHRoZSBzeW1ib2wgbXVzdCBiZSBtYWRlIG9mIGxldHRlcnMgb25seQogICAgICAgIC8vIHRoZSBwcmVjaXNpb24gbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDggYW5kIG11c3QgYmUgYW4gaW50ZWdlcgogICAgICAgIC8vIHRoZSBtYXggc3VwcGx5IG11c3QgYmUgcG9zaXRpdmUKICAgICAgICBpZiAoYXNzZXJ0KFJlZ2V4UHVyZUxldHRlcnMudGVzdChzeW1ib2wpLCAnaW52YWxpZCBzeW1ib2wnKQogICAgICAgICAgJiYgYXNzZXJ0KChwcmVjaXNpb24gPj0gMCAmJiBwcmVjaXNpb24gPD0gOCkgJiYgKE51bWJlci5pc0ludGVnZXIocHJlY2lzaW9uKSksICdpbnZhbGlkIHByZWNpc2lvbicpCiAgICAgICAgICAmJiBhc3NlcnQobWF4U3VwcGx5ID4gMCwgJ21heFN1cHBseSBtdXN0IGJlIHBvc2l0aXZlJykpIHsKICAgICAgICAgIGxldCB0b2tlbnMgPSBkYi5nZXRUYWJsZSgndG9rZW5zJyk7CiAgICAKICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSB0b2tlbiBhbHJlYWR5IGV4aXN0cwogICAgICAgICAgbGV0IHRva2VuID0gdG9rZW5zLmZpbmRPbmUoeyBzeW1ib2wgfSk7CiAgICAKICAgICAgICAgIGlmIChhc3NlcnQodG9rZW4gPT09IG51bGwsICdzeW1ib2wgYWxyZWFkeSBleGlzdHMnKSkgewogICAgICAgICAgICBjb25zdCBuZXdUb2tlbiA9IHsKICAgICAgICAgICAgICAnaXNzdWVyJzogc2VuZGVyLAogICAgICAgICAgICAgIHN5bWJvbCwKICAgICAgICAgICAgICBwcmVjaXNpb24sCiAgICAgICAgICAgICAgbWF4U3VwcGx5LAogICAgICAgICAgICAgICdzdXBwbHknOiAwCiAgICAgICAgICAgIH07CiAgICAKICAgICAgICAgICAgdG9rZW5zLmluc2VydChuZXdUb2tlbik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAKICAgIGFjdGlvbnMuaXNzdWUgPSBmdW5jdGlvbiAocGF5bG9hZCkgewogICAgICBjb25zdCB7IHRvLCBzeW1ib2wsIHF1YW50aXR5LCBpc1NpZ25lZFdpdGhBY3RpdmVLZXkgfSA9IHBheWxvYWQ7CiAgICAKICAgICAgaWYgKGFzc2VydChpc1NpZ25lZFdpdGhBY3RpdmVLZXkgPT09IHRydWUsICd5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXknKQogICAgICAgICYmIHRvICYmIHR5cGVvZiB0byA9PT0gJ3N0cmluZycKICAgICAgICAmJiBzeW1ib2wgJiYgdHlwZW9mIHN5bWJvbCA9PT0gJ3N0cmluZycKICAgICAgICAmJiBxdWFudGl0eSAmJiB0eXBlb2YgcXVhbnRpdHkgPT09ICdudW1iZXInKSB7CiAgICAKICAgICAgICBsZXQgdG9rZW5zID0gZGIuZ2V0VGFibGUoJ3Rva2VucycpOwogICAgICAgIGxldCB0b2tlbiA9IHRva2Vucy5maW5kT25lKHsgc3ltYm9sIH0pOwogICAgCiAgICAgICAgLy8gdGhlIHN5bWJvbCBtdXN0IGV4aXN0CiAgICAgICAgLy8gdGhlIHNlbmRlciBtdXN0IGJlIHRoZSBpc3N1ZXIKICAgICAgICAvLyB0aGVuIHdlIG5lZWQgdG8gY2hlY2sgdGhhdCB0aGUgcXVhbnRpdHkgaXMgY29ycmVjdAogICAgICAgIGlmIChhc3NlcnQodG9rZW4gIT09IG51bGwsICdzeW1ib2wgZG9lcyBub3QgZXhpc3QnKQogICAgICAgICAgJiYgYXNzZXJ0KHRva2VuLmlzc3VlciA9PT0gc2VuZGVyLCAnbm90IGFsbG93ZWQgdG8gaXNzdWUgdG9rZW5zJykKICAgICAgICAgICYmIGFzc2VydChjb3VudERlY2ltYWxzKHF1YW50aXR5KSA8PSB0b2tlbi5wcmVjaXNpb24sICdzeW1ib2wgcHJlY2lzaW9uIG1pc21hdGNoJykKICAgICAgICAgICYmIGFzc2VydChxdWFudGl0eSA+IDAsICdtdXN0IGlzc3VlIHBvc2l0aXZlIHF1YW50aXR5JykKICAgICAgICAgICYmIGFzc2VydChxdWFudGl0eSA8PSAodG9rZW4ubWF4U3VwcGx5IC0gdG9rZW4uc3VwcGx5KSwgJ3F1YW50aXR5IGV4Y2VlZHMgYXZhaWxhYmxlIHN1cHBseScpKSB7CiAgICAKICAgICAgICAgIGxldCBhY2NvdW50ID0gZGIuZmluZE9uZUluVGFibGUoJ2FjY291bnQnLCAnYWNjb3VudHMnLCB7ICdpZCc6IHRvIH0pOwogICAgCiAgICAgICAgICAvLyB0aGUgYWNjb3VudCBtdXN0IGhhdmUgYmVlbiByZWdpc3RlcmVkIGJlZm9yZQogICAgICAgICAgaWYgKGFzc2VydChhY2NvdW50ICE9PSBudWxsLCAndG8gYWNjb3VudCBkb2VzIG5vdCBleGlzdCcpKSB7CiAgICAgICAgICAgIC8vIHdlIG1hZGUgYWxsIHRoZSByZXF1aXJlZCB2ZXJpZmljYXRpb24sIGxldCdzIG5vdyBpc3N1ZSB0aGUgdG9rZW5zCiAgICAKICAgICAgICAgICAgdG9rZW4uc3VwcGx5ID0gY2FsY3VsYXRlQmFsYW5jZSh0b2tlbi5zdXBwbHksIHF1YW50aXR5LCB0b2tlbi5wcmVjaXNpb24sIHRydWUpOwogICAgICAgICAgICB0b2tlbnMudXBkYXRlKHRva2VuKTsKICAgIAogICAgICAgICAgICBhZGRCYWxhbmNlKHRva2VuLmlzc3VlciwgdG9rZW4sIHF1YW50aXR5KTsKICAgIAogICAgICAgICAgICBpZiAodG8gIT09IHRva2VuLmlzc3VlcikgewogICAgICAgICAgICAgIGFjdGlvbnMudHJhbnNmZXIocGF5bG9hZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIAogICAgYWN0aW9ucy50cmFuc2ZlciA9IGZ1bmN0aW9uIChwYXlsb2FkKSB7CiAgICAgIGNvbnN0IHsgdG8sIHN5bWJvbCwgcXVhbnRpdHksIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSB9ID0gcGF5bG9hZDsKICAgIAogICAgICBpZiAoYXNzZXJ0KGlzU2lnbmVkV2l0aEFjdGl2ZUtleSA9PT0gdHJ1ZSwgJ3lvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleScpCiAgICAgICAgJiYgdG8gJiYgdHlwZW9mIHRvID09PSAnc3RyaW5nJwogICAgICAgICYmIHN5bWJvbCAmJiB0eXBlb2Ygc3ltYm9sID09PSAnc3RyaW5nJwogICAgICAgICYmIHF1YW50aXR5ICYmIHR5cGVvZiBxdWFudGl0eSA9PT0gJ251bWJlcicpIHsKICAgIAogICAgICAgIGlmIChhc3NlcnQodG8gIT09IHNlbmRlciwgJ2Nhbm5vdCB0cmFuc2ZlciB0byBzZWxmJykpIHsKICAgICAgICAgIGxldCBhY2NvdW50ID0gZGIuZmluZE9uZUluVGFibGUoJ2FjY291bnQnLCAnYWNjb3VudHMnLCB7ICdpZCc6IHRvIH0pOwogICAgCiAgICAgICAgICAvLyB0aGUgYWNjb3VudCBtdXN0IGhhdmUgYmVlbiByZWdpc3RlcmVkIGJlZm9yZQogICAgICAgICAgaWYgKGFzc2VydChhY2NvdW50ICE9PSBudWxsLCAndG8gYWNjb3VudCBkb2VzIG5vdCBleGlzdCcpKSB7CiAgICAgICAgICAgIGxldCB0b2tlbnMgPSBkYi5nZXRUYWJsZSgndG9rZW5zJyk7CiAgICAgICAgICAgIGxldCB0b2tlbiA9IHRva2Vucy5maW5kT25lKHsgc3ltYm9sIH0pOwogICAgCiAgICAgICAgICAgIC8vIHRoZSBzeW1ib2wgbXVzdCBleGlzdAogICAgICAgICAgICAvLyB0aGVuIHdlIG5lZWQgdG8gY2hlY2sgdGhhdCB0aGUgcXVhbnRpdHkgaXMgY29ycmVjdAogICAgICAgICAgICBpZiAoYXNzZXJ0KHRva2VuICE9PSBudWxsLCAnc3ltYm9sIGRvZXMgbm90IGV4aXN0JykKICAgICAgICAgICAgICAmJiBhc3NlcnQoY291bnREZWNpbWFscyhxdWFudGl0eSkgPD0gdG9rZW4ucHJlY2lzaW9uLCAnc3ltYm9sIHByZWNpc2lvbiBtaXNtYXRjaCcpCiAgICAgICAgICAgICAgJiYgYXNzZXJ0KHF1YW50aXR5ID4gMCwgJ211c3QgdHJhbnNmZXIgcG9zaXRpdmUgcXVhbnRpdHknKSkgewogICAgCiAgICAgICAgICAgICAgaWYgKHN1YkJhbGFuY2Uoc2VuZGVyLCB0b2tlbiwgcXVhbnRpdHkpKSB7CiAgICAgICAgICAgICAgICBhZGRCYWxhbmNlKHRvLCB0b2tlbiwgcXVhbnRpdHkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgCiAgICBsZXQgc3ViQmFsYW5jZSA9IGZ1bmN0aW9uIChhY2NvdW50LCB0b2tlbiwgcXVhbnRpdHkpIHsKICAgICAgbGV0IGJhbGFuY2VzID0gZGIuZ2V0VGFibGUoJ2JhbGFuY2VzJyk7CiAgICAgIGxldCBiYWxhbmNlID0gYmFsYW5jZXMuZmluZE9uZSh7IGFjY291bnQsICdzeW1ib2wnOiB0b2tlbi5zeW1ib2wgfSk7CiAgICAgIGlmIChhc3NlcnQoYmFsYW5jZSAhPT0gbnVsbCwgJ2JhbGFuY2UgZG9lcyBub3QgZXhpc3QnKSAmJgogICAgICAgIGFzc2VydChiYWxhbmNlLmJhbGFuY2UgPj0gcXVhbnRpdHksICdvdmVyZHJhd24gYmFsYW5jZScpKSB7CiAgICAKICAgICAgICBiYWxhbmNlLmJhbGFuY2UgPSBjYWxjdWxhdGVCYWxhbmNlKGJhbGFuY2UuYmFsYW5jZSwgcXVhbnRpdHksIHRva2VuLnByZWNpc2lvbiwgZmFsc2UpOwogICAgCiAgICAgICAgaWYgKGJhbGFuY2UuYmFsYW5jZSA8PSAwKSB7CiAgICAgICAgICBiYWxhbmNlcy5yZW1vdmUoYmFsYW5jZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGJhbGFuY2VzLnVwZGF0ZShiYWxhbmNlKTsKICAgICAgICB9CiAgICAKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgCiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIAogICAgbGV0IGFkZEJhbGFuY2UgPSBmdW5jdGlvbiAoYWNjb3VudCwgdG9rZW4sIHF1YW50aXR5KSB7CiAgICAgIGxldCBiYWxhbmNlcyA9IGRiLmdldFRhYmxlKCdiYWxhbmNlcycpOwogICAgICBsZXQgYmFsYW5jZSA9IGJhbGFuY2VzLmZpbmRPbmUoeyBhY2NvdW50LCAnc3ltYm9sJzogdG9rZW4uc3ltYm9sIH0pOwogICAgCiAgICAgIGlmIChiYWxhbmNlID09PSBudWxsKSB7CiAgICAgICAgYmFsYW5jZSA9IHsKICAgICAgICAgIGFjY291bnQsCiAgICAgICAgICAnc3ltYm9sJzogdG9rZW4uc3ltYm9sLAogICAgICAgICAgJ2JhbGFuY2UnOiBxdWFudGl0eQogICAgICAgIH0KICAgICAgICAKICAgICAgICBiYWxhbmNlcy5pbnNlcnQoYmFsYW5jZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYmFsYW5jZS5iYWxhbmNlID0gY2FsY3VsYXRlQmFsYW5jZShiYWxhbmNlLmJhbGFuY2UsIHF1YW50aXR5LCB0b2tlbi5wcmVjaXNpb24sIHRydWUpOwogICAgCiAgICAgICAgYmFsYW5jZXMudXBkYXRlKGJhbGFuY2UpOwogICAgICB9CiAgICB9CiAgICAKICAgIGxldCBjYWxjdWxhdGVCYWxhbmNlID0gZnVuY3Rpb24gKGJhbGFuY2UsIHF1YW50aXR5LCBwcmVjaXNpb24sIGFkZCkgewogICAgICBpZiAocHJlY2lzaW9uID09PSAwKSB7CiAgICAgICAgcmV0dXJuIGFkZCA/IGJhbGFuY2UgKyBxdWFudGl0eSA6IGJhbGFuY2UgLSBxdWFudGl0eQogICAgICB9CgogICAgICByZXR1cm4gYWRkID8gY3VycmVuY3koYmFsYW5jZSwgeyBwcmVjaXNpb24gfSkuYWRkKHF1YW50aXR5KSA6IGN1cnJlbmN5KGJhbGFuY2UsIHsgcHJlY2lzaW9uIH0pLnN1YnRyYWN0KHF1YW50aXR5KTsKICAgIH0KICAgIAogICAgbGV0IGNvdW50RGVjaW1hbHMgPSBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgaWYgKE1hdGguZmxvb3IodmFsdWUpID09PSB2YWx1ZSkgcmV0dXJuIDA7CiAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpLnNwbGl0KCcuJylbMV0ubGVuZ3RoIHx8IDA7CiAgICB9"
}
}
}

{
"id": "ssc-b8923f70-c1f7-497f-961j",
"json": {
"contractName": "token",
"contractAction": "create",
"contractPayload": {
"symbol": "PKTC",
"precision": 0,
"maxSupply": 1000000
}
}
}

{
"id": "ssc-b8923f70-c1f7-497f-961j",
"json": {
"contractName": "token",
"contractAction": "create",
"contractPayload": {
"symbol": "SMMT",
"precision": 0,
"maxSupply": 1000000
}
}
}

{
"id": "ssc-b8923f70-c1f7-497f-961j",
"json": {
"contractName": "contract",
"contractAction": "deploy",
"contractPayload": {
"name": "smmt",
"code": "Y29uc3QgVE9LRU5TWU1CT0wgPSAnU01NVCc7CmFjdGlvbnMuY3JlYXRlU1NDID0gZnVuY3Rpb24gKHBheWxvYWQpIHsKICBkYi5jcmVhdGVUYWJsZSgnYmFsYW5jZXMnKTsKICBsZXQgcmV3YXJkcyA9IGRiLmNyZWF0ZVRhYmxlKCdyZXdhcmRzJyk7CiAgcmV3YXJkcy5pbnNlcnQoewogICAgJ3BlbmRpbmdSZXdhcmRzJzogMCwKICAgICdyZXdhcmRzRGlzdHJpYnV0aW9uSW50ZXJ2YWwnOiAzMDAwMCwKICAgICdsYXN0QmxvY2tSZXdhcmQnOiAwLAogICAgJ3Rva2VuSXNzdWFuY2VSYXRlJzogMSwKICAgICduZXh0SGFsdmluZyc6IDUwMDAwMCwKICAgICdiZW5lZmljaWFyaWVzJzogWydzdGVlbW1vbnN0ZXJzJywgJ2hhcnBhZ29uJ10KICB9KQp9CgphY3Rpb25zLnVwZGF0ZVJld2FyZHNEaXN0cmlidXRpb25JbnRlcnZhbCA9IGZ1bmN0aW9uIChwYXlsb2FkKSB7CiAgaWYgKHNlbmRlciAhPT0gb3duZXIpIHJldHVybjsKCiAgY29uc3QgeyBuYkJsb2NrcyB9ID0gcGF5bG9hZDsKCiAgaWYgKE51bWJlci5pc0ludGVnZXIobmJCbG9ja3MpKSB7CiAgICBsZXQgcmV3YXJkcyA9IGRiLmdldFRhYmxlKCdyZXdhcmRzJyk7CiAgICBsZXQgcmVjID0gcmV3YXJkcy5maW5kT25lKHt9KTsKICAgIHJlYy5yZXdhcmRzRGlzdHJpYnV0aW9uSW50ZXJ2YWwgPSBuYkJsb2NrczsKICAgIHJld2FyZHMudXBkYXRlKHJlYyk7CiAgfQp9CgphY3Rpb25zLnVwZGF0ZUJlbmVmaWNpYXJpZXMgPSBmdW5jdGlvbiAocGF5bG9hZCkgewogIGlmIChzZW5kZXIgIT09IG93bmVyKSByZXR1cm47CgogIGNvbnN0IHsgYmVuZWZpY2lhcmllcywgaXNTaWduZWRXaXRoQWN0aXZlS2V5IH0gPSBwYXlsb2FkOwoKICBpZiAoaXNTaWduZWRXaXRoQWN0aXZlS2V5ID09PSB0cnVlCiAgICAmJiBBcnJheS5pc0FycmF5KGJlbmVmaWNpYXJpZXMpKSB7CiAgICBpZiAoYmVuZWZpY2lhcmllcy5pbmRleE9mKG93bmVyKSA9PT0gLTEpIHsKICAgICAgYmVuZWZpY2lhcmllcy5wdXNoKG93bmVyKTsKICAgIH0KCiAgICBsZXQgcmV3YXJkcyA9IGRiLmdldFRhYmxlKCdyZXdhcmRzJyk7CiAgICBsZXQgcmVjID0gcmV3YXJkcy5maW5kT25lKHt9KTsKICAgIHJlYy5iZW5lZmljaWFyaWVzID0gYmVuZWZpY2lhcmllczsKICAgIHJld2FyZHMudXBkYXRlKHJlYyk7CiAgfQp9CgphY3Rpb25zLmlzc3VlVG9rZW5zID0gZnVuY3Rpb24gKHBheWxvYWQpIHsKICBpZiAoc2VuZGVyICE9PSBvd25lcikgcmV0dXJuOwoKICBjb25zdCB7IGJlbmVmaWNpYXJpZXMsIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSB9ID0gcGF5bG9hZDsKCiAgaWYgKGlzU2lnbmVkV2l0aEFjdGl2ZUtleSA9PT0gdHJ1ZQogICAgJiYgQXJyYXkuaXNBcnJheShiZW5lZmljaWFyaWVzKSkgewoKICAgIGxldCByZXdhcmRzID0gZGIuZ2V0VGFibGUoJ3Jld2FyZHMnKTsKICAgIGxldCByZWMgPSByZXdhcmRzLmZpbmRPbmUoe30pOwoKICAgIGJlbmVmaWNpYXJpZXMuZm9yRWFjaChiZW5lZiA9PiB7CiAgICAgIGV4ZWN1dGVTbWFydENvbnRyYWN0KCd0b2tlbicsICdpc3N1ZScsICd7ICJzeW1ib2wiOiAiJyArIFRPS0VOU1lNQk9MICsgJyIsICJ0byI6ICInICsgYmVuZWYuYWNjdCArICciLCAicXVhbnRpdHkiOiAnICsgYmVuZWYucXR5ICsgJywgImlzU2lnbmVkV2l0aEFjdGl2ZUtleSI6IHRydWUgfScpOwoKICAgICAgcmVjLmJlbmVmaWNpYXJpZXMuZm9yRWFjaChhY2N0ID0+IHsKICAgICAgICBleGVjdXRlU21hcnRDb250cmFjdCgndG9rZW4nLCAnaXNzdWUnLCAneyAic3ltYm9sIjogIicgKyBUT0tFTlNZTUJPTCArICciLCAidG8iOiAiJyArIGFjY3QgKyAnIiwgInF1YW50aXR5IjogJyArIGJlbmVmLnF0eSArICcsICJpc1NpZ25lZFdpdGhBY3RpdmVLZXkiOiB0cnVlIH0nKTsKICAgICAgfSkKICAgIH0pCiAgfQp9CgphY3Rpb25zLnByb2Nlc3NQdXJjaGFzZSA9IGZ1bmN0aW9uIChwYXlsb2FkKSB7CiAgaWYgKHNlbmRlciAhPT0gb3duZXIpIHJldHVybjsKCiAgY29uc3QgeyBhY2NvdW50LCBxdWFudGl0eSwgaXNTaWduZWRXaXRoQWN0aXZlS2V5IH0gPSBwYXlsb2FkOwogIGlmIChpc1NpZ25lZFdpdGhBY3RpdmVLZXkgPT09IHRydWUpIHsKICAgIC8vIGdldCB0aGUgaXNzdWFuY2UgcmF0ZQogICAgY29uc3QgaXNzdWFuY2VSYXRlID0gZ2V0SXNzdWFuY2VSYXRlKCk7CgogICAgLy8gYWRkIHRoZSBxdWFudGl0eSB0byB0aGUgcGVuZGluZyByZXdhcmRzCiAgICBsZXQgcmV3YXJkcyA9IGRiLmdldFRhYmxlKCdyZXdhcmRzJyk7CiAgICBsZXQgcmVjID0gcmV3YXJkcy5maW5kT25lKHt9KTsKCiAgICAvLyBpc3N1ZSBTTU1UIHRvIHRoZSBhY2NvdW50CiAgICBjb25zdCB0b2tlbnNUb0lzc3VlID0gKHF1YW50aXR5ICogaXNzdWFuY2VSYXRlKS50b0ZpeGVkKDMpOwogICAgZXhlY3V0ZVNtYXJ0Q29udHJhY3QoJ3Rva2VuJywgJ2lzc3VlJywgJ3sgInN5bWJvbCI6ICInICsgVE9LRU5TWU1CT0wgKyAnIiwgInRvIjogIicgKyBhY2NvdW50ICsgJyIsICJxdWFudGl0eSI6ICcgKyB0b2tlbnNUb0lzc3VlICsgJywgImlzU2lnbmVkV2l0aEFjdGl2ZUtleSI6IHRydWUgfScpOwoKICAgIHJlYy5iZW5lZmljaWFyaWVzLmZvckVhY2goYWNjdCA9PiB7CiAgICAgIGV4ZWN1dGVTbWFydENvbnRyYWN0KCd0b2tlbicsICdpc3N1ZScsICd7ICJzeW1ib2wiOiAiJyArIFRPS0VOU1lNQk9MICsgJyIsICJ0byI6ICInICsgYWNjdCArICciLCAicXVhbnRpdHkiOiAnICsgdG9rZW5zVG9Jc3N1ZSArICcsICJpc1NpZ25lZFdpdGhBY3RpdmVLZXkiOiB0cnVlIH0nKTsKICAgIH0pCgogICAgbGV0IHBlbmRpbmdSZXdhcmRzID0gcmVjLnBlbmRpbmdSZXdhcmRzCiAgICBwZW5kaW5nUmV3YXJkcyA9IGFkZChwZW5kaW5nUmV3YXJkcywgcXVhbnRpdHkpOwogICAgcmVjLnBlbmRpbmdSZXdhcmRzID0gcGVuZGluZ1Jld2FyZHM7CiAgICByZXdhcmRzLnVwZGF0ZShyZWMpOwoKICAgIC8vIGRpc3RyaWJ1dGUgdGhlIHJld2FyZHMgKGlmIGl0J3MgdGltZSB0byBkbyBzbykKICAgIGlmIChyZWMucGVuZGluZ1Jld2FyZHMgPiAwCiAgICAgICYmIChyZWZTdGVlbUJsb2NrTnVtYmVyIC0gcmVjLmxhc3RCbG9ja1Jld2FyZCkgPj0gcmVjLnJld2FyZHNEaXN0cmlidXRpb25JbnRlcnZhbCkgewogICAgICBkaXN0cmlidXRlUmV3YXJkcygpOwogICAgfQogIH0KfQoKYWN0aW9ucy53aXRoZHJhd1Jld2FyZHMgPSBmdW5jdGlvbiAocGF5bG9hZCkgewogIGNvbnN0IHsgcXVhbnRpdHksIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSB9ID0gcGF5bG9hZDsKCiAgaWYgKGFzc2VydChpc1NpZ25lZFdpdGhBY3RpdmVLZXkgPT09IHRydWUsICd5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXknKQogICAgJiYgcXVhbnRpdHkgJiYgdHlwZW9mIHF1YW50aXR5ID09PSAnbnVtYmVyJykgewoKICAgIGxldCBiYWxhbmNlcyA9IGRiLmdldFRhYmxlKCdiYWxhbmNlcycpOwogICAgbGV0IGJhbGFuY2UgPSBiYWxhbmNlcy5maW5kT25lKHsgJ2FjY291bnQnOiBzZW5kZXIgfSk7CgogICAgLy8gY2hlY2sgaWYgdGhlIGJhbGFuY2UgZXhpc3RzCiAgICBpZiAoYXNzZXJ0KGJhbGFuY2UgIT09IG51bGwsICdiYWxhbmNlIGRvZXMgbm90IGV4aXN0JykKICAgICAgJiYgYXNzZXJ0KGNvdW50RGVjaW1hbHMocXVhbnRpdHkpIDw9IDMsICdzeW1ib2wgcHJlY2lzaW9uIG1pc21hdGNoJykKICAgICAgJiYgYXNzZXJ0KHF1YW50aXR5ID4gMCwgJ211c3Qgd2l0aGRyYXcgcG9zaXRpdmUgcXVhbnRpdHknKQogICAgICAmJiBhc3NlcnQoYmFsYW5jZS5iYWxhbmNlID49IHF1YW50aXR5LCAnb3ZlcmRyYXduIGJhbGFuY2UnKSkgewoKICAgICAgLy9iYWxhbmNlLmJhbGFuY2UgPSAoKChiYWxhbmNlLmJhbGFuY2UgKiAxMDAwKSAtIChxdWFudGl0eSAqIDEwMDApKSAvIDEwMDApLnRvRml4ZWQoMyk7CiAgICAgIGJhbGFuY2UuYmFsYW5jZSA9IHN1YihiYWxhbmNlLmJhbGFuY2UsIHF1YW50aXR5KQogICAgICBpZiAoYmFsYW5jZS5iYWxhbmNlIDw9IDApIHsKICAgICAgICBiYWxhbmNlcy5yZW1vdmUoYmFsYW5jZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYmFsYW5jZXMudXBkYXRlKGJhbGFuY2UpOwogICAgICB9CiAgICB9CiAgfQp9CgpsZXQgZ2V0SXNzdWFuY2VSYXRlID0gZnVuY3Rpb24gKCkgewogIC8vIGdldCByZXdhcmRzIHBhcmFtcwogIGxldCByZXdhcmRzID0gZGIuZ2V0VGFibGUoJ3Jld2FyZHMnKTsKICBsZXQgcGFyYW1zID0gcmV3YXJkcy5maW5kT25lKHt9KTsKICBjb25zdCBuZXh0SGFsdmluZyA9IHBhcmFtcy5uZXh0SGFsdmluZzsKCiAgLy8gZ2V0IHRoZSB0b2tlbiBzdXBwbHkKICBsZXQgdG9rZW5QYXJhbXMgPSBkYi5maW5kT25lSW5UYWJsZSgndG9rZW4nLCAndG9rZW5zJywgeyAnc3ltYm9sJzogVE9LRU5TWU1CT0wgfSk7CiAgY29uc3QgdG90YWxTdXBwbHkgPSB0b2tlblBhcmFtcy5zdXBwbHk7CiAgY29uc3QgbWF4U3VwcGx5ID0gdG9rZW5QYXJhbXMubWF4U3VwcGx5OwoKICAvLyBjaGVjayBpZiB3ZSBuZWVkIHRvIGhhbHZlIHRoZSBpc3N1YW5jZSByYXRlCiAgaWYgKChtYXhTdXBwbHkgLSB0b3RhbFN1cHBseSkgPD0gbmV4dEhhbHZpbmcpIHsKICAgIHBhcmFtcy50b2tlbklzc3VhbmNlUmF0ZSA9IHBhcmFtcy50b2tlbklzc3VhbmNlUmF0ZSAvIDI7CiAgICBwYXJhbXMubmV4dEhhbHZpbmcgPSBuZXh0SGFsdmluZyAvIDI7CiAgICByZXdhcmRzLnVwZGF0ZShwYXJhbXMpOwogIH0KCiAgcmV0dXJuIHBhcmFtcy50b2tlbklzc3VhbmNlUmF0ZTsKfQoKbGV0IGRpc3RyaWJ1dGVSZXdhcmRzID0gZnVuY3Rpb24gKCkgewogIC8vIGdldCB0aGUgcGVuZGluZyByZXdhcmRzCiAgbGV0IHJld2FyZHMgPSBkYi5nZXRUYWJsZSgncmV3YXJkcycpOwogIGxldCByZWMgPSByZXdhcmRzLmZpbmRPbmUoe30pOwogIGNvbnN0IHBlbmRpbmdSZXdhcmRzID0gcmVjLnBlbmRpbmdSZXdhcmRzOwoKICAvLyBnZXQgdGhlIHRva2VuIHN1cHBseQogIGxldCB0b2tlblBhcmFtcyA9IGRiLmZpbmRPbmVJblRhYmxlKCd0b2tlbicsICd0b2tlbnMnLCB7ICdzeW1ib2wnOiBUT0tFTlNZTUJPTCB9KTsKICBjb25zdCB0b3RhbFN1cHBseSA9IHRva2VuUGFyYW1zLnN1cHBseTsKCiAgY29uc3QgcmV3YXJkUGVyVG9rZW4gPSBkaXYocGVuZGluZ1Jld2FyZHMsIHRvdGFsU3VwcGx5KTsKCiAgbGV0IHRva2VuSG9sZGVycyA9IGRiLmZpbmRJblRhYmxlKCd0b2tlbicsICdiYWxhbmNlcycsIHsgJ3N5bWJvbCc6IFRPS0VOU1lNQk9MIH0pCiAgICAuc29ydCgoYSwgYikgPT4gYi5iYWxhbmNlIC0gYS5iYWxhbmNlKTsKICBsZXQgYmFsYW5jZXMgPSBkYi5nZXRUYWJsZSgnYmFsYW5jZXMnKTsKICBsZXQgdG90YWxSZXdhcmRzRGlzdHJpYnV0ZWQgPSAwOwogIGNvbnN0IGJhbGFuY2VzVG9VcGRhdGUgPSBbXTsKICBjb25zdCBiYWxhbmNlc1RvQ3JlYXRlID0gW107CgogIGxldCBsZW4gPSB0b2tlbkhvbGRlcnMubGVuZ3RoOwogIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgIGNvbnN0IHRva2VuSG9sZGVyID0gdG9rZW5Ib2xkZXJzW2ldOwoKICAgIC8vIGNhbGN1bGF0ZSB0aGUgcmV3YXJkIGJhc2VkIG9uIHRoZSBzdGFrZQogICAgY29uc3QgcmV3YXJkcyA9IChtdWxSZXdhcmRzKHRva2VuSG9sZGVyLmJhbGFuY2UsIHJld2FyZFBlclRva2VuKSk7CgogICAgdG90YWxSZXdhcmRzRGlzdHJpYnV0ZWQgPSBhZGRSZXdhcmRzKHRvdGFsUmV3YXJkc0Rpc3RyaWJ1dGVkLCByZXdhcmRzKTsKICAgIC8vIHVwZGF0ZSB0aGUgYmFsYW5jZSBpZiA+IDAKICAgIGlmIChyZXdhcmRzID4gMCkgewogICAgICBsZXQgYWNjID0gYmFsYW5jZXMuZmluZE9uZSh7ICdhY2NvdW50JzogdG9rZW5Ib2xkZXIuYWNjb3VudCB9KTsKICAgICAgaWYgKGFjYykgewogICAgICAgIGFjYy5iYWxhbmNlID0gYWRkKGFjYy5iYWxhbmNlLCByZXdhcmRzKTsKICAgICAgICBiYWxhbmNlc1RvVXBkYXRlLnB1c2goYWNjKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhY2MgPSB7CiAgICAgICAgICAnYWNjb3VudCc6IHRva2VuSG9sZGVyLmFjY291bnQsCiAgICAgICAgICAnYmFsYW5jZSc6IHJld2FyZHMsCiAgICAgICAgfQogICAgICAgIGJhbGFuY2VzVG9DcmVhdGUucHVzaChhY2MpOwogICAgICB9CiAgICB9CiAgfTsKCiAgaWYgKGJhbGFuY2VzVG9DcmVhdGUubGVuZ3RoID4gMCkgewogICAgYmFsYW5jZXMuaW5zZXJ0KGJhbGFuY2VzVG9DcmVhdGUpOwogIH0KCiAgaWYgKGJhbGFuY2VzVG9VcGRhdGUubGVuZ3RoID4gMCkgewogICAgYmFsYW5jZXMudXBkYXRlKGJhbGFuY2VzVG9VcGRhdGUpOwogIH0KCiAgLy8gdXBkYXRlIHRoZSBwZW5kaW5nIHJld2FyZHMKICByZWMucGVuZGluZ1Jld2FyZHMgPSBzdWIocGVuZGluZ1Jld2FyZHMsIHRvdGFsUmV3YXJkc0Rpc3RyaWJ1dGVkKTsKICByZWMubGFzdEJsb2NrUmV3YXJkID0gcmVmU3RlZW1CbG9ja051bWJlcjsKICByZXdhcmRzLnVwZGF0ZShyZWMpOwp9CgpsZXQgZGl2ID0gZnVuY3Rpb24gKGEsIGIpIHsKICByZXR1cm4gKChhICogMTAwMCkgLyAoYiAqIDEwMDApKSAvIDEwMDA7Cn0KCmxldCBtdWxSZXdhcmRzID0gZnVuY3Rpb24gKGEsIGIpIHsKICBsZXQgcmVzID0gKChhICogMTAwMCkgKiAoYiAqIDEwMDApKSAvIDEwMDA7CiAgcmV0dXJuIHJlcyA+PSAwLjAwMSA/IChyZXMgLSAwLjAwMSkudG9GaXhlZCgzKSA6IDA7Cn0KCmxldCBhZGRSZXdhcmRzID0gZnVuY3Rpb24gKGEsIGIpIHsKICByZXR1cm4gKChhICogMTAwMCkgKyAoYiAqIDEwMDApKSAvIDEwMDA7Cn0KCmxldCBtdWwgPSBmdW5jdGlvbiAoYSwgYikgewogIC8vcmV0dXJuICgoYSAqIDEwMDApICogKGIgKiAxMDAwKSkgLyAxMDAwOwogIHJldHVybiBjdXJyZW5jeShhLCB7IHByZWNpc2lvbjogMyB9KS5tdWx0aXBseShiKTsKfQoKbGV0IGFkZCA9IGZ1bmN0aW9uIChhLCBiKSB7CiAgLy9sZXQgcmVzID0gKChhICogMTAwMCkgKyAoYiAqIDEwMDApKSAvIDEwMDA7CiAgLy9yZXR1cm4gcmVzID4gMCA/IHJlcy50b0ZpeGVkKDMpIDogMDsKICByZXR1cm4gY3VycmVuY3koYSwgeyBwcmVjaXNpb246IDMgfSkuYWRkKGIpOwp9CgpsZXQgc3ViID0gZnVuY3Rpb24gKGEsIGIpIHsKICAvL2xldCByZXMgPSAoKGEgKiAxMDAwKSAtIChiICogMTAwMCkpIC8gMTAwMDsKICAvL3JldHVybiByZXMgPiAwID8gcmVzLnRvRml4ZWQoMykgOiAwOwogIHJldHVybiBjdXJyZW5jeShhLCB7IHByZWNpc2lvbjogMyB9KS5zdWJ0cmFjdChiKTsKfQoKbGV0IGNvdW50RGVjaW1hbHMgPSBmdW5jdGlvbiAodmFsdWUpIHsKICBpZiAoTWF0aC5mbG9vcih2YWx1ZSkgPT09IHZhbHVlKSByZXR1cm4gMDsKICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKS5zcGxpdCgnLicpWzFdLmxlbmd0aCB8fCAwOwp9"
}
}
}

{
"id": "ssc-b8923f70-c1f7-497f-961j",
"json": {
"contractName": "token",
"contractAction": "create",
"contractPayload": {
"symbol": "SMMKT",
"precision": 3,
"maxSupply": 1000000
}
}
}

{
"id": "ssc-b8923f70-c1f7-497f-961j",
"json": {
"contractName": "contract",
"contractAction": "deploy",
"contractPayload": {
"name": "smmkt",
"code": "Y29uc3QgVE9LRU5TWU1CT0wgPSAnU01NS1QnOwphY3Rpb25zLmNyZWF0ZVNTQyA9IGZ1bmN0aW9uIChwYXlsb2FkKSB7CiAgZGIuY3JlYXRlVGFibGUoJ2JhbGFuY2VzJyk7CiAgbGV0IHJld2FyZHMgPSBkYi5jcmVhdGVUYWJsZSgncmV3YXJkcycpOwogIHJld2FyZHMuaW5zZXJ0KHsKICAgICdwZW5kaW5nUmV3YXJkcyc6IDAsCiAgICAncmV3YXJkc0Rpc3RyaWJ1dGlvbkludGVydmFsJzogMzAwMDAsCiAgICAnbGFzdEJsb2NrUmV3YXJkJzogcmVmU3RlZW1CbG9ja051bWJlciwKICAgICd0b2tlbklzc3VhbmNlUmF0ZSc6IDEsCiAgICAnbmV4dEhhbHZpbmcnOiA1MDAwMDAsCiAgICAnYmVuZWZpY2lhcmllcyc6IFsnc21tYXJrZXR0b2tlbiddCiAgfSkKfQoKYWN0aW9ucy51cGRhdGVSZXdhcmRzRGlzdHJpYnV0aW9uSW50ZXJ2YWwgPSBmdW5jdGlvbiAocGF5bG9hZCkgewogIGlmIChzZW5kZXIgIT09IG93bmVyKSByZXR1cm47CgogIGNvbnN0IHsgbmJCbG9ja3MgfSA9IHBheWxvYWQ7CgogIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG5iQmxvY2tzKSkgewogICAgbGV0IHJld2FyZHMgPSBkYi5nZXRUYWJsZSgncmV3YXJkcycpOwogICAgbGV0IHJlYyA9IHJld2FyZHMuZmluZE9uZSh7fSk7CiAgICByZWMucmV3YXJkc0Rpc3RyaWJ1dGlvbkludGVydmFsID0gbmJCbG9ja3M7CiAgICByZXdhcmRzLnVwZGF0ZShyZWMpOwogIH0KfQoKYWN0aW9ucy51cGRhdGVCZW5lZmljaWFyaWVzID0gZnVuY3Rpb24gKHBheWxvYWQpIHsKICBpZiAoc2VuZGVyICE9PSBvd25lcikgcmV0dXJuOwoKICBjb25zdCB7IGJlbmVmaWNpYXJpZXMsIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSB9ID0gcGF5bG9hZDsKCiAgaWYgKGlzU2lnbmVkV2l0aEFjdGl2ZUtleSA9PT0gdHJ1ZQogICAgJiYgQXJyYXkuaXNBcnJheShiZW5lZmljaWFyaWVzKSkgewogICAgaWYgKGJlbmVmaWNpYXJpZXMuaW5kZXhPZihvd25lcikgPT09IC0xKSB7CiAgICAgIGJlbmVmaWNpYXJpZXMucHVzaChvd25lcik7CiAgICB9CgogICAgbGV0IHJld2FyZHMgPSBkYi5nZXRUYWJsZSgncmV3YXJkcycpOwogICAgbGV0IHJlYyA9IHJld2FyZHMuZmluZE9uZSh7fSk7CiAgICByZWMuYmVuZWZpY2lhcmllcyA9IGJlbmVmaWNpYXJpZXM7CiAgICByZXdhcmRzLnVwZGF0ZShyZWMpOwogIH0KfQoKYWN0aW9ucy5pc3N1ZVRva2VucyA9IGZ1bmN0aW9uIChwYXlsb2FkKSB7CiAgaWYgKHNlbmRlciAhPT0gb3duZXIpIHJldHVybjsKCiAgY29uc3QgeyBiZW5lZmljaWFyaWVzLCBpc1NpZ25lZFdpdGhBY3RpdmVLZXkgfSA9IHBheWxvYWQ7CgogIGlmIChpc1NpZ25lZFdpdGhBY3RpdmVLZXkgPT09IHRydWUKICAgICYmIEFycmF5LmlzQXJyYXkoYmVuZWZpY2lhcmllcykpIHsKCiAgICBsZXQgcmV3YXJkcyA9IGRiLmdldFRhYmxlKCdyZXdhcmRzJyk7CiAgICBsZXQgcmVjID0gcmV3YXJkcy5maW5kT25lKHt9KTsKCiAgICBiZW5lZmljaWFyaWVzLmZvckVhY2goYmVuZWYgPT4gewogICAgICBleGVjdXRlU21hcnRDb250cmFjdCgndG9rZW4nLCAnaXNzdWUnLCAneyAic3ltYm9sIjogIicgKyBUT0tFTlNZTUJPTCArICciLCAidG8iOiAiJyArIGJlbmVmLmFjY3QgKyAnIiwgInF1YW50aXR5IjogJyArIGJlbmVmLnF0eSArICcsICJpc1NpZ25lZFdpdGhBY3RpdmVLZXkiOiB0cnVlIH0nKTsKCiAgICAgIHJlYy5iZW5lZmljaWFyaWVzLmZvckVhY2goYWNjdCA9PiB7CiAgICAgICAgZXhlY3V0ZVNtYXJ0Q29udHJhY3QoJ3Rva2VuJywgJ2lzc3VlJywgJ3sgInN5bWJvbCI6ICInICsgVE9LRU5TWU1CT0wgKyAnIiwgInRvIjogIicgKyBhY2N0ICsgJyIsICJxdWFudGl0eSI6ICcgKyBiZW5lZi5xdHkgKyAnLCAiaXNTaWduZWRXaXRoQWN0aXZlS2V5IjogdHJ1ZSB9Jyk7CiAgICAgIH0pCiAgICB9KQogIH0KfQoKYWN0aW9ucy5wcm9jZXNzUHVyY2hhc2UgPSBmdW5jdGlvbiAocGF5bG9hZCkgewogIGlmIChzZW5kZXIgIT09IG93bmVyKSByZXR1cm47CgogIGNvbnN0IHsgYWNjb3VudCwgcXVhbnRpdHksIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSB9ID0gcGF5bG9hZDsKICBpZiAoaXNTaWduZWRXaXRoQWN0aXZlS2V5ID09PSB0cnVlKSB7CiAgICAvLyBnZXQgdGhlIGlzc3VhbmNlIHJhdGUKICAgIGNvbnN0IGlzc3VhbmNlUmF0ZSA9IGdldElzc3VhbmNlUmF0ZSgpOwoKICAgIC8vIGFkZCB0aGUgcXVhbnRpdHkgdG8gdGhlIHBlbmRpbmcgcmV3YXJkcwogICAgbGV0IHJld2FyZHMgPSBkYi5nZXRUYWJsZSgncmV3YXJkcycpOwogICAgbGV0IHJlYyA9IHJld2FyZHMuZmluZE9uZSh7fSk7CgogICAgLy8gaXNzdWUgU01NVCB0byB0aGUgYWNjb3VudAogICAgY29uc3QgdG9rZW5zVG9Jc3N1ZSA9IChxdWFudGl0eSAqIGlzc3VhbmNlUmF0ZSkudG9GaXhlZCgzKTsKICAgIGV4ZWN1dGVTbWFydENvbnRyYWN0KCd0b2tlbicsICdpc3N1ZScsICd7ICJzeW1ib2wiOiAiJyArIFRPS0VOU1lNQk9MICsgJyIsICJ0byI6ICInICsgYWNjb3VudCArICciLCAicXVhbnRpdHkiOiAnICsgdG9rZW5zVG9Jc3N1ZSArICcsICJpc1NpZ25lZFdpdGhBY3RpdmVLZXkiOiB0cnVlIH0nKTsKCiAgICByZWMuYmVuZWZpY2lhcmllcy5mb3JFYWNoKGFjY3QgPT4gewogICAgICBleGVjdXRlU21hcnRDb250cmFjdCgndG9rZW4nLCAnaXNzdWUnLCAneyAic3ltYm9sIjogIicgKyBUT0tFTlNZTUJPTCArICciLCAidG8iOiAiJyArIGFjY3QgKyAnIiwgInF1YW50aXR5IjogJyArIHRva2Vuc1RvSXNzdWUgKyAnLCAiaXNTaWduZWRXaXRoQWN0aXZlS2V5IjogdHJ1ZSB9Jyk7CiAgICB9KQoKICAgIGxldCBwZW5kaW5nUmV3YXJkcyA9IHJlYy5wZW5kaW5nUmV3YXJkcwogICAgcGVuZGluZ1Jld2FyZHMgPSBhZGQocGVuZGluZ1Jld2FyZHMsIHF1YW50aXR5KTsKICAgIHJlYy5wZW5kaW5nUmV3YXJkcyA9IHBlbmRpbmdSZXdhcmRzOwogICAgcmV3YXJkcy51cGRhdGUocmVjKTsKCiAgICAvLyBkaXN0cmlidXRlIHRoZSByZXdhcmRzIChpZiBpdCdzIHRpbWUgdG8gZG8gc28pCiAgICBpZiAocmVjLnBlbmRpbmdSZXdhcmRzID4gMAogICAgICAmJiAocmVmU3RlZW1CbG9ja051bWJlciAtIHJlYy5sYXN0QmxvY2tSZXdhcmQpID49IHJlYy5yZXdhcmRzRGlzdHJpYnV0aW9uSW50ZXJ2YWwpIHsKICAgICAgZGlzdHJpYnV0ZVJld2FyZHMoKTsKICAgIH0KICB9Cn0KCmFjdGlvbnMud2l0aGRyYXdSZXdhcmRzID0gZnVuY3Rpb24gKHBheWxvYWQpIHsKICBjb25zdCB7IHF1YW50aXR5LCBpc1NpZ25lZFdpdGhBY3RpdmVLZXkgfSA9IHBheWxvYWQ7CgogIGlmIChhc3NlcnQoaXNTaWduZWRXaXRoQWN0aXZlS2V5ID09PSB0cnVlLCAneW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5JykKICAgICYmIHF1YW50aXR5ICYmIHR5cGVvZiBxdWFudGl0eSA9PT0gJ251bWJlcicpIHsKCiAgICBsZXQgYmFsYW5jZXMgPSBkYi5nZXRUYWJsZSgnYmFsYW5jZXMnKTsKICAgIGxldCBiYWxhbmNlID0gYmFsYW5jZXMuZmluZE9uZSh7ICdhY2NvdW50Jzogc2VuZGVyIH0pOwoKICAgIC8vIGNoZWNrIGlmIHRoZSBiYWxhbmNlIGV4aXN0cwogICAgaWYgKGFzc2VydChiYWxhbmNlICE9PSBudWxsLCAnYmFsYW5jZSBkb2VzIG5vdCBleGlzdCcpCiAgICAgICYmIGFzc2VydChjb3VudERlY2ltYWxzKHF1YW50aXR5KSA8PSAzLCAnc3ltYm9sIHByZWNpc2lvbiBtaXNtYXRjaCcpCiAgICAgICYmIGFzc2VydChxdWFudGl0eSA+IDAsICdtdXN0IHdpdGhkcmF3IHBvc2l0aXZlIHF1YW50aXR5JykKICAgICAgJiYgYXNzZXJ0KGJhbGFuY2UuYmFsYW5jZSA+PSBxdWFudGl0eSwgJ292ZXJkcmF3biBiYWxhbmNlJykpIHsKCiAgICAgIC8vYmFsYW5jZS5iYWxhbmNlID0gKCgoYmFsYW5jZS5iYWxhbmNlICogMTAwMCkgLSAocXVhbnRpdHkgKiAxMDAwKSkgLyAxMDAwKS50b0ZpeGVkKDMpOwogICAgICBiYWxhbmNlLmJhbGFuY2UgPSBzdWIoYmFsYW5jZS5iYWxhbmNlLCBxdWFudGl0eSkKICAgICAgaWYgKGJhbGFuY2UuYmFsYW5jZSA8PSAwKSB7CiAgICAgICAgYmFsYW5jZXMucmVtb3ZlKGJhbGFuY2UpOwogICAgICB9IGVsc2UgewogICAgICAgIGJhbGFuY2VzLnVwZGF0ZShiYWxhbmNlKTsKICAgICAgfQogICAgfQogIH0KfQoKbGV0IGdldElzc3VhbmNlUmF0ZSA9IGZ1bmN0aW9uICgpIHsKICAvLyBnZXQgcmV3YXJkcyBwYXJhbXMKICBsZXQgcmV3YXJkcyA9IGRiLmdldFRhYmxlKCdyZXdhcmRzJyk7CiAgbGV0IHBhcmFtcyA9IHJld2FyZHMuZmluZE9uZSh7fSk7CiAgY29uc3QgbmV4dEhhbHZpbmcgPSBwYXJhbXMubmV4dEhhbHZpbmc7CgogIC8vIGdldCB0aGUgdG9rZW4gc3VwcGx5CiAgbGV0IHRva2VuUGFyYW1zID0gZGIuZmluZE9uZUluVGFibGUoJ3Rva2VuJywgJ3Rva2VucycsIHsgJ3N5bWJvbCc6IFRPS0VOU1lNQk9MIH0pOwogIGNvbnN0IHRvdGFsU3VwcGx5ID0gdG9rZW5QYXJhbXMuc3VwcGx5OwogIGNvbnN0IG1heFN1cHBseSA9IHRva2VuUGFyYW1zLm1heFN1cHBseTsKCiAgLy8gY2hlY2sgaWYgd2UgbmVlZCB0byBoYWx2ZSB0aGUgaXNzdWFuY2UgcmF0ZQogIGlmICgobWF4U3VwcGx5IC0gdG90YWxTdXBwbHkpIDw9IG5leHRIYWx2aW5nKSB7CiAgICBwYXJhbXMudG9rZW5Jc3N1YW5jZVJhdGUgPSBwYXJhbXMudG9rZW5Jc3N1YW5jZVJhdGUgLyAyOwogICAgcGFyYW1zLm5leHRIYWx2aW5nID0gbmV4dEhhbHZpbmcgLyAyOwogICAgcmV3YXJkcy51cGRhdGUocGFyYW1zKTsKICB9CgogIHJldHVybiBwYXJhbXMudG9rZW5Jc3N1YW5jZVJhdGU7Cn0KCmxldCBkaXN0cmlidXRlUmV3YXJkcyA9IGZ1bmN0aW9uICgpIHsKICAvLyBnZXQgdGhlIHBlbmRpbmcgcmV3YXJkcwogIGxldCByZXdhcmRzID0gZGIuZ2V0VGFibGUoJ3Jld2FyZHMnKTsKICBsZXQgcmVjID0gcmV3YXJkcy5maW5kT25lKHt9KTsKICBjb25zdCBwZW5kaW5nUmV3YXJkcyA9IHJlYy5wZW5kaW5nUmV3YXJkczsKCiAgLy8gZ2V0IHRoZSB0b2tlbiBzdXBwbHkKICBsZXQgdG9rZW5QYXJhbXMgPSBkYi5maW5kT25lSW5UYWJsZSgndG9rZW4nLCAndG9rZW5zJywgeyAnc3ltYm9sJzogVE9LRU5TWU1CT0wgfSk7CiAgY29uc3QgdG90YWxTdXBwbHkgPSB0b2tlblBhcmFtcy5zdXBwbHk7CgogIGNvbnN0IHJld2FyZFBlclRva2VuID0gZGl2KHBlbmRpbmdSZXdhcmRzLCB0b3RhbFN1cHBseSk7CgogIGxldCB0b2tlbkhvbGRlcnMgPSBkYi5maW5kSW5UYWJsZSgndG9rZW4nLCAnYmFsYW5jZXMnLCB7ICdzeW1ib2wnOiBUT0tFTlNZTUJPTCB9KQogICAgLnNvcnQoKGEsIGIpID0+IGIuYmFsYW5jZSAtIGEuYmFsYW5jZSk7CiAgbGV0IGJhbGFuY2VzID0gZGIuZ2V0VGFibGUoJ2JhbGFuY2VzJyk7CiAgbGV0IHRvdGFsUmV3YXJkc0Rpc3RyaWJ1dGVkID0gMDsKICBjb25zdCBiYWxhbmNlc1RvVXBkYXRlID0gW107CiAgY29uc3QgYmFsYW5jZXNUb0NyZWF0ZSA9IFtdOwoKICBsZXQgbGVuID0gdG9rZW5Ib2xkZXJzLmxlbmd0aDsKICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICBjb25zdCB0b2tlbkhvbGRlciA9IHRva2VuSG9sZGVyc1tpXTsKCiAgICAvLyBjYWxjdWxhdGUgdGhlIHJld2FyZCBiYXNlZCBvbiB0aGUgc3Rha2UKICAgIGNvbnN0IHJld2FyZHMgPSAobXVsUmV3YXJkcyh0b2tlbkhvbGRlci5iYWxhbmNlLCByZXdhcmRQZXJUb2tlbikpOwoKICAgIHRvdGFsUmV3YXJkc0Rpc3RyaWJ1dGVkID0gYWRkUmV3YXJkcyh0b3RhbFJld2FyZHNEaXN0cmlidXRlZCwgcmV3YXJkcyk7CiAgICAvLyB1cGRhdGUgdGhlIGJhbGFuY2UgaWYgPiAwCiAgICBpZiAocmV3YXJkcyA+IDApIHsKICAgICAgbGV0IGFjYyA9IGJhbGFuY2VzLmZpbmRPbmUoeyAnYWNjb3VudCc6IHRva2VuSG9sZGVyLmFjY291bnQgfSk7CiAgICAgIGlmIChhY2MpIHsKICAgICAgICBhY2MuYmFsYW5jZSA9IGFkZChhY2MuYmFsYW5jZSwgcmV3YXJkcyk7CiAgICAgICAgYmFsYW5jZXNUb1VwZGF0ZS5wdXNoKGFjYyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYWNjID0gewogICAgICAgICAgJ2FjY291bnQnOiB0b2tlbkhvbGRlci5hY2NvdW50LAogICAgICAgICAgJ2JhbGFuY2UnOiByZXdhcmRzLAogICAgICAgIH0KICAgICAgICBiYWxhbmNlc1RvQ3JlYXRlLnB1c2goYWNjKTsKICAgICAgfQogICAgfQogIH07CgogIGlmIChiYWxhbmNlc1RvQ3JlYXRlLmxlbmd0aCA+IDApIHsKICAgIGJhbGFuY2VzLmluc2VydChiYWxhbmNlc1RvQ3JlYXRlKTsKICB9CgogIGlmIChiYWxhbmNlc1RvVXBkYXRlLmxlbmd0aCA+IDApIHsKICAgIGJhbGFuY2VzLnVwZGF0ZShiYWxhbmNlc1RvVXBkYXRlKTsKICB9CgogIC8vIHVwZGF0ZSB0aGUgcGVuZGluZyByZXdhcmRzCiAgcmVjLnBlbmRpbmdSZXdhcmRzID0gc3ViKHBlbmRpbmdSZXdhcmRzLCB0b3RhbFJld2FyZHNEaXN0cmlidXRlZCk7CiAgcmVjLmxhc3RCbG9ja1Jld2FyZCA9IHJlZlN0ZWVtQmxvY2tOdW1iZXI7CiAgcmV3YXJkcy51cGRhdGUocmVjKTsKfQoKbGV0IGRpdiA9IGZ1bmN0aW9uIChhLCBiKSB7CiAgcmV0dXJuICgoYSAqIDEwMDApIC8gKGIgKiAxMDAwKSkgLyAxMDAwOwp9CgpsZXQgbXVsUmV3YXJkcyA9IGZ1bmN0aW9uIChhLCBiKSB7CiAgbGV0IHJlcyA9ICgoYSAqIDEwMDApICogKGIgKiAxMDAwKSkgLyAxMDAwOwogIHJldHVybiByZXMgPj0gMC4wMDEgPyAocmVzIC0gMC4wMDEpLnRvRml4ZWQoMykgOiAwOwp9CgpsZXQgYWRkUmV3YXJkcyA9IGZ1bmN0aW9uIChhLCBiKSB7CiAgcmV0dXJuICgoYSAqIDEwMDApICsgKGIgKiAxMDAwKSkgLyAxMDAwOwp9CgpsZXQgbXVsID0gZnVuY3Rpb24gKGEsIGIpIHsKICAvL3JldHVybiAoKGEgKiAxMDAwKSAqIChiICogMTAwMCkpIC8gMTAwMDsKICByZXR1cm4gY3VycmVuY3koYSwgeyBwcmVjaXNpb246IDMgfSkubXVsdGlwbHkoYik7Cn0KCmxldCBhZGQgPSBmdW5jdGlvbiAoYSwgYikgewogIC8vbGV0IHJlcyA9ICgoYSAqIDEwMDApICsgKGIgKiAxMDAwKSkgLyAxMDAwOwogIC8vcmV0dXJuIHJlcyA+IDAgPyByZXMudG9GaXhlZCgzKSA6IDA7CiAgcmV0dXJuIGN1cnJlbmN5KGEsIHsgcHJlY2lzaW9uOiAzIH0pLmFkZChiKTsKfQoKbGV0IHN1YiA9IGZ1bmN0aW9uIChhLCBiKSB7CiAgLy9sZXQgcmVzID0gKChhICogMTAwMCkgLSAoYiAqIDEwMDApKSAvIDEwMDA7CiAgLy9yZXR1cm4gcmVzID4gMCA/IHJlcy50b0ZpeGVkKDMpIDogMDsKICByZXR1cm4gY3VycmVuY3koYSwgeyBwcmVjaXNpb246IDMgfSkuc3VidHJhY3QoYik7Cn0KCmxldCBjb3VudERlY2ltYWxzID0gZnVuY3Rpb24gKHZhbHVlKSB7CiAgaWYgKE1hdGguZmxvb3IodmFsdWUpID09PSB2YWx1ZSkgcmV0dXJuIDA7CiAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCkuc3BsaXQoJy4nKVsxXS5sZW5ndGggfHwgMDsKfQ=="
}
}
}

{
"id": "ssc-00000000000000000002",
"json": {
"contractName": "contract",
"contractAction": "deploy",
"contractPayload": {
"name": "tokens",
"params": "",
"code": "Ly9jb25zdCBhY3Rpb25zID0ge30KLy9jb25zdCBhcGkgPSB7fQoKYWN0aW9ucy5jcmVhdGVTU0MgPSBhc3luYyAocGF5bG9hZCkgPT4gewogIGF3YWl0IGFwaS5kYi5jcmVhdGVUYWJsZSgndG9rZW5zJywgWydzeW1ib2wnXSk7CiAgYXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKCdiYWxhbmNlcycsIFsnYWNjb3VudCddKTsKICBhd2FpdCBhcGkuZGIuY3JlYXRlVGFibGUoJ2NvbnRyYWN0c0JhbGFuY2VzJywgWydhY2NvdW50J10pOwogIGF3YWl0IGFwaS5kYi5jcmVhdGVUYWJsZSgncGFyYW1zJyk7CiAgYXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKCdwZW5kaW5nVW5zdGFrZXMnLCBbJ2FjY291bnQnLCAndW5zdGFrZUNvbXBsZXRlVGltZXN0YW1wJ10pOwoKICBjb25zdCBwYXJhbXMgPSB7fTsKICBwYXJhbXMudG9rZW5DcmVhdGlvbkZlZSA9ICcwJzsKICBhd2FpdCBhcGkuZGIuaW5zZXJ0KCdwYXJhbXMnLCBwYXJhbXMpOwp9OwoKYWN0aW9ucy51cGRhdGVQYXJhbXMgPSBhc3luYyAocGF5bG9hZCkgPT4gewogIGlmIChhcGkuc2VuZGVyICE9PSBhcGkub3duZXIpIHJldHVybjsKCiAgY29uc3QgeyB0b2tlbkNyZWF0aW9uRmVlIH0gPSBwYXlsb2FkOwoKICBjb25zdCBwYXJhbXMgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgncGFyYW1zJywge30pOwoKICBwYXJhbXMudG9rZW5DcmVhdGlvbkZlZSA9IHR5cGVvZiB0b2tlbkNyZWF0aW9uRmVlID09PSAnbnVtYmVyJyA/IHRva2VuQ3JlYXRpb25GZWUudG9GaXhlZCg4KSA6IHRva2VuQ3JlYXRpb25GZWU7CgogIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3BhcmFtcycsIHBhcmFtcyk7Cn07CgphY3Rpb25zLnVwZGF0ZVVybCA9IGFzeW5jIChwYXlsb2FkKSA9PiB7CiAgY29uc3QgeyB1cmwsIHN5bWJvbCB9ID0gcGF5bG9hZDsKCiAgaWYgKGFwaS5hc3NlcnQoc3ltYm9sICYmIHR5cGVvZiBzeW1ib2wgPT09ICdzdHJpbmcnCiAgICAmJiB1cmwgJiYgdHlwZW9mIHVybCA9PT0gJ3N0cmluZycsICdpbnZhbGlkIHBhcmFtcycpCiAgICAmJiBhcGkuYXNzZXJ0KHVybC5sZW5ndGggPD0gMjU1LCAnaW52YWxpZCB1cmw6IG1heCBsZW5ndGggb2YgMjU1JykpIHsKICAgIC8vIGNoZWNrIGlmIHRoZSB0b2tlbiBleGlzdHMKICAgIGNvbnN0IHRva2VuID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ3Rva2VucycsIHsgc3ltYm9sIH0pOwoKICAgIGlmICh0b2tlbikgewogICAgICBpZiAoYXBpLmFzc2VydCh0b2tlbi5pc3N1ZXIgPT09IGFwaS5zZW5kZXIsICdtdXN0IGJlIHRoZSBpc3N1ZXInKSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IEpTT04ucGFyc2UodG9rZW4ubWV0YWRhdGEpOwoKICAgICAgICAgIGlmIChhcGkuYXNzZXJ0KG1ldGFkYXRhICYmIG1ldGFkYXRhLnVybCwgJ2FuIGVycm9yIG9jY3VyZWQgd2hlbiB0cnlpbmcgdG8gdXBkYXRlIHRoZSB1cmwnKSkgewogICAgICAgICAgICBtZXRhZGF0YS51cmwgPSB1cmw7CiAgICAgICAgICAgIHRva2VuLm1ldGFkYXRhID0gSlNPTi5zdHJpbmdpZnkobWV0YWRhdGEpOwogICAgICAgICAgICBhd2FpdCBhcGkuZGIudXBkYXRlKCd0b2tlbnMnLCB0b2tlbik7CiAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgLy8gZXJyb3Igd2hlbiBwYXJzaW5nIHRoZSBtZXRhZGF0YQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfTsKCmFjdGlvbnMudXBkYXRlTWV0YWRhdGEgPSBhc3luYyAocGF5bG9hZCkgPT4gewogIGNvbnN0IHsgbWV0YWRhdGEsIHN5bWJvbCB9ID0gcGF5bG9hZDsKCiAgaWYgKGFwaS5hc3NlcnQoc3ltYm9sICYmIHR5cGVvZiBzeW1ib2wgPT09ICdzdHJpbmcnCiAgICAmJiBtZXRhZGF0YSAmJiB0eXBlb2YgbWV0YWRhdGEgPT09ICdvYmplY3QnLCAnaW52YWxpZCBwYXJhbXMnKSkgewogICAgLy8gY2hlY2sgaWYgdGhlIHRva2VuIGV4aXN0cwogICAgY29uc3QgdG9rZW4gPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgndG9rZW5zJywgeyBzeW1ib2wgfSk7CgogICAgaWYgKHRva2VuKSB7CiAgICAgIGlmIChhcGkuYXNzZXJ0KHRva2VuLmlzc3VlciA9PT0gYXBpLnNlbmRlciwgJ211c3QgYmUgdGhlIGlzc3VlcicpKSB7CgogICAgICAgIHRyeSB7CiAgICAgICAgICBjb25zdCBmaW5hbE1ldGFkYXRhID0gSlNPTi5zdHJpbmdpZnkobWV0YWRhdGEpOwoKICAgICAgICAgIGlmIChhcGkuYXNzZXJ0KGZpbmFsTWV0YWRhdGEubGVuZ3RoIDw9IDEwMDAsICdpbnZhbGlkIG1ldGFkYXRhOiBtYXggbGVuZ3RoIG9mIDEwMDAnKSkgewogICAgICAgICAgICB0b2tlbi5tZXRhZGF0YSA9IGZpbmFsTWV0YWRhdGE7CiAgICAgICAgICAgIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3Rva2VucycsIHRva2VuKTsKICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAvLyBlcnJvciB3aGVuIHN0cmluZ2lmeWluZyB0aGUgbWV0YWRhdGEKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn07CgphY3Rpb25zLnRyYW5zZmVyT3duZXJzaGlwID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBjb25zdCB7IHN5bWJvbCwgdG8sIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSB9ID0gcGF5bG9hZDsKCiAgaWYgKGFwaS5hc3NlcnQoaXNTaWduZWRXaXRoQWN0aXZlS2V5ID09PSB0cnVlLCAneW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5JykKICAgICYmIGFwaS5hc3NlcnQoc3ltYm9sICYmIHR5cGVvZiBzeW1ib2wgPT09ICdzdHJpbmcnCiAgICAgICYmIHRvICYmIHR5cGVvZiB0byA9PT0gJ3N0cmluZycsICdpbnZhbGlkIHBhcmFtcycpKSB7CiAgICAvLyBjaGVjayBpZiB0aGUgdG9rZW4gZXhpc3RzCiAgICBsZXQgdG9rZW4gPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgndG9rZW5zJywgeyBzeW1ib2wgfSk7CgogICAgaWYgKHRva2VuKSB7CiAgICAgIGlmIChhcGkuYXNzZXJ0KHRva2VuLmlzc3VlciA9PT0gYXBpLnNlbmRlciwgJ211c3QgYmUgdGhlIGlzc3VlcicpKSB7CiAgICAgICAgY29uc3QgZmluYWxUbyA9IHRvLnRyaW0oKTsKCiAgICAgICAgLy8gYSB2YWxpZCBzdGVlbSBhY2NvdW50IGlzIGJldHdlZW4gMyBhbmQgMTYgY2hhcmFjdGVycyBpbiBsZW5ndGgKICAgICAgICBpZiAoYXBpLmFzc2VydChmaW5hbFRvLmxlbmd0aCA+PSAzICYmIGZpbmFsVG8ubGVuZ3RoIDw9IDE2LCAnaW52YWxpZCB0bycpKSB7CiAgICAgICAgICB0b2tlbi5pc3N1ZXIgPSBmaW5hbFRvCiAgICAgICAgICBhd2FpdCBhcGkuZGIudXBkYXRlKCd0b2tlbnMnLCB0b2tlbik7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9OwoKY29uc3QgY3JlYXRlVk9uZSA9IGFzeW5jIChwYXlsb2FkKSA9PiB7CiAgY29uc3QgewogICAgbmFtZSwgc3ltYm9sLCB1cmwsIHByZWNpc2lvbiwgbWF4U3VwcGx5LCBpc1NpZ25lZFdpdGhBY3RpdmVLZXksCiAgfSA9IHBheWxvYWQ7CgogIC8vIGdldCBjb250cmFjdCBwYXJhbXMKICBjb25zdCBwYXJhbXMgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgncGFyYW1zJywge30pOwogIGNvbnN0IHsgdG9rZW5DcmVhdGlvbkZlZSB9ID0gcGFyYW1zOwoKICAvLyBnZXQgYXBpLnNlbmRlcidzIFVUSUxJVFlfVE9LRU5fU1lNQk9MIGJhbGFuY2UKICBjb25zdCB1dGlsaXR5VG9rZW5CYWxhbmNlID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ2JhbGFuY2VzJywgeyBhY2NvdW50OiBhcGkuc2VuZGVyLCBzeW1ib2w6ICJTU0MiIH0pOwoKICBjb25zdCBhdXRob3JpemVkQ3JlYXRpb24gPSBhcGkuQmlnTnVtYmVyKHRva2VuQ3JlYXRpb25GZWUpLmx0ZSgnMCcpID8gdHJ1ZSA6IHV0aWxpdHlUb2tlbkJhbGFuY2UgJiYgYXBpLkJpZ051bWJlcih1dGlsaXR5VG9rZW5CYWxhbmNlLmJhbGFuY2UpLmd0ZSh0b2tlbkNyZWF0aW9uRmVlKTsKCiAgaWYgKGFwaS5hc3NlcnQoYXV0aG9yaXplZENyZWF0aW9uLCAneW91IG11c3QgaGF2ZSBlbm91Z2ggdG9rZW5zIHRvIGNvdmVyIHRoZSBjcmVhdGlvbiBmZWVzJykKICAgICYmIGFwaS5hc3NlcnQobmFtZSAmJiB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycKICAgICAgJiYgc3ltYm9sICYmIHR5cGVvZiBzeW1ib2wgPT09ICdzdHJpbmcnCiAgICAgICYmICh1cmwgPT09IHVuZGVmaW5lZCB8fCAodXJsICYmIHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnKSkKICAgICAgJiYgKChwcmVjaXNpb24gJiYgdHlwZW9mIHByZWNpc2lvbiA9PT0gJ251bWJlcicpIHx8IHByZWNpc2lvbiA9PT0gMCkKICAgICAgJiYgbWF4U3VwcGx5ICYmIHR5cGVvZiBtYXhTdXBwbHkgPT09ICdudW1iZXInLCAnaW52YWxpZCBwYXJhbXMnKSkgewogICAgLy8gdGhlIHByZWNpc2lvbiBtdXN0IGJlIGJldHdlZW4gMCBhbmQgOCBhbmQgbXVzdCBiZSBhbiBpbnRlZ2VyCiAgICAvLyB0aGUgbWF4IHN1cHBseSBtdXN0IGJlIHBvc2l0aXZlCiAgICBpZiAoYXBpLmFzc2VydChhcGkudmFsaWRhdG9yLmlzQWxwaGEoc3ltYm9sKSAmJiBhcGkudmFsaWRhdG9yLmlzVXBwZXJjYXNlKHN5bWJvbCkgJiYgc3ltYm9sLmxlbmd0aCA+IDAgJiYgc3ltYm9sLmxlbmd0aCA8PSAxMCwgJ2ludmFsaWQgc3ltYm9sOiB1cHBlcmNhc2UgbGV0dGVycyBvbmx5LCBtYXggbGVuZ3RoIG9mIDEwJykKICAgICAgJiYgYXBpLmFzc2VydChhcGkudmFsaWRhdG9yLmlzQWxwaGFudW1lcmljKGFwaS52YWxpZGF0b3IuYmxhY2tsaXN0KG5hbWUsICcgJykpICYmIG5hbWUubGVuZ3RoID4gMCAmJiBuYW1lLmxlbmd0aCA8PSA1MCwgJ2ludmFsaWQgbmFtZTogbGV0dGVycywgbnVtYmVycywgd2hpdGVzcGFjZXMgb25seSwgbWF4IGxlbmd0aCBvZiA1MCcpCiAgICAgICYmIGFwaS5hc3NlcnQodXJsID09PSB1bmRlZmluZWQgfHwgdXJsLmxlbmd0aCA8PSAyNTUsICdpbnZhbGlkIHVybDogbWF4IGxlbmd0aCBvZiAyNTUnKQogICAgICAmJiBhcGkuYXNzZXJ0KChwcmVjaXNpb24gPj0gMCAmJiBwcmVjaXNpb24gPD0gOCkgJiYgKE51bWJlci5pc0ludGVnZXIocHJlY2lzaW9uKSksICdpbnZhbGlkIHByZWNpc2lvbicpCiAgICAgICYmIGFwaS5hc3NlcnQobWF4U3VwcGx5ID4gMCwgJ21heFN1cHBseSBtdXN0IGJlIHBvc2l0aXZlJykKICAgICAgJiYgYXBpLmFzc2VydChhcGkuYmxvY2tOdW1iZXIgPT09IDAgfHwgKGFwaS5ibG9ja051bWJlciA+IDAgJiYgbWF4U3VwcGx5IDw9IDEwMDAwMDAwMDAwMDApLCAnbWF4U3VwcGx5IG11c3QgYmUgbG93ZXIgdGhhbiAxMDAwMDAwMDAwMDAwJykpIHsKICAgICAgLy8gY2hlY2sgaWYgdGhlIHRva2VuIGFscmVhZHkgZXhpc3RzCiAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ3Rva2VucycsIHsgc3ltYm9sIH0pOwoKICAgICAgaWYgKGFwaS5hc3NlcnQodG9rZW4gPT09IG51bGwsICdzeW1ib2wgYWxyZWFkeSBleGlzdHMnKSkgewogICAgICAgIGNvbnN0IGZpbmFsVXJsID0gdXJsID09PSB1bmRlZmluZWQgPyAnJyA6IHVybDsKCiAgICAgICAgbGV0IG1ldGFkYXRhID0gewogICAgICAgICAgdXJsOiBmaW5hbFVybCwKICAgICAgICB9OwoKICAgICAgICBtZXRhZGF0YSA9IEpTT04uc3RyaW5naWZ5KG1ldGFkYXRhKTsKCiAgICAgICAgY29uc3QgbmV3VG9rZW4gPSB7CiAgICAgICAgICBpc3N1ZXI6IGFwaS5zZW5kZXIsCiAgICAgICAgICBzeW1ib2wsCiAgICAgICAgICBuYW1lLAogICAgICAgICAgbWV0YWRhdGEsCiAgICAgICAgICBwcmVjaXNpb24sCiAgICAgICAgICBtYXhTdXBwbHksCiAgICAgICAgICBzdXBwbHk6IDAsCiAgICAgICAgICBjaXJjdWxhdGluZ1N1cHBseTogMCwKICAgICAgICB9OwoKICAgICAgICBhd2FpdCBhcGkuZGIuaW5zZXJ0KCd0b2tlbnMnLCBuZXdUb2tlbik7CgogICAgICAgIC8vIGJ1cm4gdGhlIHRva2VuIGNyZWF0aW9uIGZlZXMKICAgICAgICBpZiAoYXBpLkJpZ051bWJlcih0b2tlbkNyZWF0aW9uRmVlKS5ndCgwKSkgewogICAgICAgICAgYXdhaXQgYWN0aW9ucy50cmFuc2Zlcih7CiAgICAgICAgICAgIHRvOiAnbnVsbCcsIHN5bWJvbDogIlNTQyIsIHF1YW50aXR5OiBhcGkuQmlnTnVtYmVyKHRva2VuQ3JlYXRpb25GZWUpLnRvTnVtYmVyKCksIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfTsKCmNvbnN0IGNyZWF0ZVZUd28gPSBhc3luYyAocGF5bG9hZCkgPT4gewogIGNvbnN0IHsKICAgIG5hbWUsIHN5bWJvbCwgdXJsLCBwcmVjaXNpb24sIG1heFN1cHBseSwgaXNTaWduZWRXaXRoQWN0aXZlS2V5LAogIH0gPSBwYXlsb2FkOwoKICAvLyBnZXQgY29udHJhY3QgcGFyYW1zCiAgY29uc3QgcGFyYW1zID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ3BhcmFtcycsIHt9KTsKICBjb25zdCB7IHRva2VuQ3JlYXRpb25GZWUgfSA9IHBhcmFtczsKCiAgLy8gZ2V0IGFwaS5zZW5kZXIncyBVVElMSVRZX1RPS0VOX1NZTUJPTCBiYWxhbmNlCiAgY29uc3QgdXRpbGl0eVRva2VuQmFsYW5jZSA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdiYWxhbmNlcycsIHsgYWNjb3VudDogYXBpLnNlbmRlciwgc3ltYm9sOiAiU1NDIiB9KTsKCiAgY29uc3QgYXV0aG9yaXplZENyZWF0aW9uID0gYXBpLkJpZ051bWJlcih0b2tlbkNyZWF0aW9uRmVlKS5sdGUoMCkKICAgID8gdHJ1ZQogICAgOiB1dGlsaXR5VG9rZW5CYWxhbmNlICYmIGFwaS5CaWdOdW1iZXIodXRpbGl0eVRva2VuQmFsYW5jZS5iYWxhbmNlKS5ndGUodG9rZW5DcmVhdGlvbkZlZSk7CgogIGlmIChhcGkuYXNzZXJ0KGF1dGhvcml6ZWRDcmVhdGlvbiwgJ3lvdSBtdXN0IGhhdmUgZW5vdWdoIHRva2VucyB0byBjb3ZlciB0aGUgY3JlYXRpb24gZmVlcycpCiAgICAmJiBhcGkuYXNzZXJ0KG5hbWUgJiYgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnCiAgICAgICYmIHN5bWJvbCAmJiB0eXBlb2Ygc3ltYm9sID09PSAnc3RyaW5nJwogICAgICAmJiAodXJsID09PSB1bmRlZmluZWQgfHwgKHVybCAmJiB0eXBlb2YgdXJsID09PSAnc3RyaW5nJykpCiAgICAgICYmICgocHJlY2lzaW9uICYmIHR5cGVvZiBwcmVjaXNpb24gPT09ICdudW1iZXInKSB8fCBwcmVjaXNpb24gPT09IDApCiAgICAgICYmIG1heFN1cHBseSAmJiB0eXBlb2YgbWF4U3VwcGx5ID09PSAnc3RyaW5nJyAmJiAhYXBpLkJpZ051bWJlcihtYXhTdXBwbHkpLmlzTmFOKCksICdpbnZhbGlkIHBhcmFtcycpKSB7CgogICAgLy8gdGhlIHByZWNpc2lvbiBtdXN0IGJlIGJldHdlZW4gMCBhbmQgOCBhbmQgbXVzdCBiZSBhbiBpbnRlZ2VyCiAgICAvLyB0aGUgbWF4IHN1cHBseSBtdXN0IGJlIHBvc2l0aXZlCiAgICBpZiAoYXBpLmFzc2VydChhcGkudmFsaWRhdG9yLmlzQWxwaGEoc3ltYm9sKSAmJiBhcGkudmFsaWRhdG9yLmlzVXBwZXJjYXNlKHN5bWJvbCkgJiYgc3ltYm9sLmxlbmd0aCA+IDAgJiYgc3ltYm9sLmxlbmd0aCA8PSAxMCwgJ2ludmFsaWQgc3ltYm9sOiB1cHBlcmNhc2UgbGV0dGVycyBvbmx5LCBtYXggbGVuZ3RoIG9mIDEwJykKICAgICAgJiYgYXBpLmFzc2VydChhcGkudmFsaWRhdG9yLmlzQWxwaGFudW1lcmljKGFwaS52YWxpZGF0b3IuYmxhY2tsaXN0KG5hbWUsICcgJykpICYmIG5hbWUubGVuZ3RoID4gMCAmJiBuYW1lLmxlbmd0aCA8PSA1MCwgJ2ludmFsaWQgbmFtZTogbGV0dGVycywgbnVtYmVycywgd2hpdGVzcGFjZXMgb25seSwgbWF4IGxlbmd0aCBvZiA1MCcpCiAgICAgICYmIGFwaS5hc3NlcnQodXJsID09PSB1bmRlZmluZWQgfHwgdXJsLmxlbmd0aCA8PSAyNTUsICdpbnZhbGlkIHVybDogbWF4IGxlbmd0aCBvZiAyNTUnKQogICAgICAmJiBhcGkuYXNzZXJ0KChwcmVjaXNpb24gPj0gMCAmJiBwcmVjaXNpb24gPD0gOCkgJiYgKE51bWJlci5pc0ludGVnZXIocHJlY2lzaW9uKSksICdpbnZhbGlkIHByZWNpc2lvbicpCiAgICAgICYmIGFwaS5hc3NlcnQoYXBpLkJpZ051bWJlcihtYXhTdXBwbHkpLmd0KDApLCAnbWF4U3VwcGx5IG11c3QgYmUgcG9zaXRpdmUnKQogICAgICAmJiBhcGkuYXNzZXJ0KGFwaS5CaWdOdW1iZXIobWF4U3VwcGx5KS5sdGUoTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpLCAnbWF4U3VwcGx5IG11c3QgYmUgbG93ZXIgdGhhbiAnICsgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpKSB7CgogICAgICAvLyBjaGVjayBpZiB0aGUgdG9rZW4gYWxyZWFkeSBleGlzdHMKICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgndG9rZW5zJywgeyBzeW1ib2wgfSk7CgogICAgICBpZiAoYXBpLmFzc2VydCh0b2tlbiA9PT0gbnVsbCwgJ3N5bWJvbCBhbHJlYWR5IGV4aXN0cycpKSB7CiAgICAgICAgY29uc3QgZmluYWxVcmwgPSB1cmwgPT09IHVuZGVmaW5lZCA/ICcnIDogdXJsOwoKICAgICAgICBsZXQgbWV0YWRhdGEgPSB7CiAgICAgICAgICB1cmw6IGZpbmFsVXJsLAogICAgICAgIH07CgogICAgICAgIG1ldGFkYXRhID0gSlNPTi5zdHJpbmdpZnkobWV0YWRhdGEpOwogICAgICAgIGNvbnN0IG5ld1Rva2VuID0gewogICAgICAgICAgaXNzdWVyOiBhcGkuc2VuZGVyLAogICAgICAgICAgc3ltYm9sLAogICAgICAgICAgbmFtZSwKICAgICAgICAgIG1ldGFkYXRhLAogICAgICAgICAgcHJlY2lzaW9uLAogICAgICAgICAgbWF4U3VwcGx5OiBhcGkuQmlnTnVtYmVyKG1heFN1cHBseSkudG9GaXhlZChwcmVjaXNpb24pLAogICAgICAgICAgc3VwcGx5OiAnMCcsCiAgICAgICAgICBjaXJjdWxhdGluZ1N1cHBseTogJzAnLAogICAgICAgICAgc3Rha2luZ0VuYWJsZWQ6IGZhbHNlLAogICAgICAgICAgdW5zdGFraW5nQ29vbGRvd246IDEsCiAgICAgICAgICBuYkRheXMxMDBQZXJjZW50Vm90ZVJlZ2VuZXJhdGlvbjogMSwKICAgICAgICB9OwoKICAgICAgICBhd2FpdCBhcGkuZGIuaW5zZXJ0KCd0b2tlbnMnLCBuZXdUb2tlbik7CgogICAgICAgIC8vIGJ1cm4gdGhlIHRva2VuIGNyZWF0aW9uIGZlZXMKICAgICAgICBpZiAoYXBpLkJpZ051bWJlcih0b2tlbkNyZWF0aW9uRmVlKS5ndCgwKSkgewogICAgICAgICAgYXdhaXQgYWN0aW9ucy50cmFuc2Zlcih7CiAgICAgICAgICAgIHRvOiAnbnVsbCcsIHN5bWJvbDogIlNTQyIsIHF1YW50aXR5OiB0b2tlbkNyZWF0aW9uRmVlLCBpc1NpZ25lZFdpdGhBY3RpdmVLZXksCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn07CgphY3Rpb25zLmNyZWF0ZSA9IGFzeW5jIChwYXlsb2FkKSA9PiB7CiAgaWYgKGFwaS5yZWZTdGVlbUJsb2NrTnVtYmVyIDwgMzA4OTY1MDApIHsKICAgIGF3YWl0IGNyZWF0ZVZPbmUocGF5bG9hZCk7CiAgfSBlbHNlIHsKICAgIGF3YWl0IGNyZWF0ZVZUd28ocGF5bG9hZCk7CiAgfQp9OwoKY29uc3QgaXNzdWVWT25lID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBjb25zdCB7CiAgICB0bywgc3ltYm9sLCBxdWFudGl0eSwgaXNTaWduZWRXaXRoQWN0aXZlS2V5LAogIH0gPSBwYXlsb2FkOwoKICBpZiAoYXBpLmFzc2VydChpc1NpZ25lZFdpdGhBY3RpdmVLZXkgPT09IHRydWUsICd5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXknKQogICAgJiYgYXBpLmFzc2VydCh0byAmJiB0eXBlb2YgdG8gPT09ICdzdHJpbmcnCiAgICAgICYmIHN5bWJvbCAmJiB0eXBlb2Ygc3ltYm9sID09PSAnc3RyaW5nJwogICAgICAmJiBxdWFudGl0eSAmJiB0eXBlb2YgcXVhbnRpdHkgPT09ICdudW1iZXInLCAnaW52YWxpZCBwYXJhbXMnKSkgewogICAgY29uc3QgZmluYWxUbyA9IHRvLnRyaW0oKTsKCiAgICBjb25zdCB0b2tlbiA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCd0b2tlbnMnLCB7IHN5bWJvbCB9KTsKCiAgICAvLyB0aGUgc3ltYm9sIG11c3QgZXhpc3QKICAgIC8vIHRoZSBhcGkuc2VuZGVyIG11c3QgYmUgdGhlIGlzc3VlcgogICAgLy8gdGhlbiB3ZSBuZWVkIHRvIGNoZWNrIHRoYXQgdGhlIHF1YW50aXR5IGlzIGNvcnJlY3QKICAgIGlmIChhcGkuYXNzZXJ0KHRva2VuICE9PSBudWxsLCAnc3ltYm9sIGRvZXMgbm90IGV4aXN0JykKICAgICAgJiYgYXBpLmFzc2VydCh0b2tlbi5pc3N1ZXIgPT09IGFwaS5zZW5kZXIsICdub3QgYWxsb3dlZCB0byBpc3N1ZSB0b2tlbnMnKQogICAgICAmJiBhcGkuYXNzZXJ0KGNvdW50RGVjaW1hbHMocXVhbnRpdHkpIDw9IHRva2VuLnByZWNpc2lvbiwgJ3N5bWJvbCBwcmVjaXNpb24gbWlzbWF0Y2gnKQogICAgICAmJiBhcGkuYXNzZXJ0KHF1YW50aXR5ID4gMCwgJ211c3QgaXNzdWUgcG9zaXRpdmUgcXVhbnRpdHknKQogICAgICAmJiBhcGkuYXNzZXJ0KHF1YW50aXR5IDw9IChhcGkuQmlnTnVtYmVyKHRva2VuLm1heFN1cHBseSkubWludXModG9rZW4uc3VwcGx5KS50b051bWJlcigpKSwgJ3F1YW50aXR5IGV4Y2VlZHMgYXZhaWxhYmxlIHN1cHBseScpKSB7CgogICAgICAvLyBhIHZhbGlkIHN0ZWVtIGFjY291bnQgaXMgYmV0d2VlbiAzIGFuZCAxNiBjaGFyYWN0ZXJzIGluIGxlbmd0aAogICAgICBpZiAoYXBpLmFzc2VydChmaW5hbFRvLmxlbmd0aCA+PSAzICYmIGZpbmFsVG8ubGVuZ3RoIDw9IDE2LCAnaW52YWxpZCB0bycpKSB7CiAgICAgICAgLy8gd2UgbWFkZSBhbGwgdGhlIHJlcXVpcmVkIHZlcmlmaWNhdGlvbiwgbGV0J3Mgbm93IGlzc3VlIHRoZSB0b2tlbnMKCiAgICAgICAgbGV0IHJlcyA9IGF3YWl0IGFkZEJhbGFuY2VWT25lKHRva2VuLmlzc3VlciwgdG9rZW4sIHF1YW50aXR5LCAnYmFsYW5jZXMnKTsKCiAgICAgICAgaWYgKHJlcyA9PT0gdHJ1ZSAmJiBmaW5hbFRvICE9PSB0b2tlbi5pc3N1ZXIpIHsKICAgICAgICAgIGlmIChhd2FpdCBzdWJCYWxhbmNlVk9uZSh0b2tlbi5pc3N1ZXIsIHRva2VuLCBxdWFudGl0eSwgJ2JhbGFuY2VzJykpIHsKICAgICAgICAgICAgcmVzID0gYXdhaXQgYWRkQmFsYW5jZVZPbmUoZmluYWxUbywgdG9rZW4sIHF1YW50aXR5LCAnYmFsYW5jZXMnKTsKCiAgICAgICAgICAgIGlmIChyZXMgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgYXdhaXQgYWRkQmFsYW5jZVZPbmUodG9rZW4uaXNzdWVyLCB0b2tlbiwgcXVhbnRpdHksICdiYWxhbmNlcycpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAocmVzID09PSB0cnVlKSB7CiAgICAgICAgICB0b2tlbi5zdXBwbHkgPSBjYWxjdWxhdGVCYWxhbmNlVk9uZSh0b2tlbi5zdXBwbHksIHF1YW50aXR5LCB0b2tlbi5wcmVjaXNpb24sIHRydWUpOwoKICAgICAgICAgIGlmIChmaW5hbFRvICE9PSAnbnVsbCcpIHsKICAgICAgICAgICAgdG9rZW4uY2lyY3VsYXRpbmdTdXBwbHkgPSBjYWxjdWxhdGVCYWxhbmNlVk9uZSgKICAgICAgICAgICAgICB0b2tlbi5jaXJjdWxhdGluZ1N1cHBseSwgcXVhbnRpdHksIHRva2VuLnByZWNpc2lvbiwgdHJ1ZSwKICAgICAgICAgICAgKTsKICAgICAgICAgIH0KCiAgICAgICAgICBhd2FpdCBhcGkuZGIudXBkYXRlKCd0b2tlbnMnLCB0b2tlbik7CgogICAgICAgICAgYXBpLmVtaXQoJ3RyYW5zZmVyRnJvbUNvbnRyYWN0JywgewogICAgICAgICAgICBmcm9tOiAndG9rZW5zJywgdG86IGZpbmFsVG8sIHN5bWJvbCwgcXVhbnRpdHksCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn07Cgpjb25zdCBpc3N1ZVZUd28gPSBhc3luYyAocGF5bG9hZCkgPT4gewogIGNvbnN0IHsKICAgIHRvLCBzeW1ib2wsIHF1YW50aXR5LCBpc1NpZ25lZFdpdGhBY3RpdmVLZXksCiAgfSA9IHBheWxvYWQ7CgogIGlmIChhcGkuYXNzZXJ0KGlzU2lnbmVkV2l0aEFjdGl2ZUtleSA9PT0gdHJ1ZSwgJ3lvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleScpCiAgICAmJiBhcGkuYXNzZXJ0KHRvICYmIHR5cGVvZiB0byA9PT0gJ3N0cmluZycKICAgICAgJiYgc3ltYm9sICYmIHR5cGVvZiBzeW1ib2wgPT09ICdzdHJpbmcnCiAgICAgICYmIHF1YW50aXR5ICYmIHR5cGVvZiBxdWFudGl0eSA9PT0gJ3N0cmluZycgJiYgIWFwaS5CaWdOdW1iZXIocXVhbnRpdHkpLmlzTmFOKCksICdpbnZhbGlkIHBhcmFtcycpKSB7CiAgICBjb25zdCBmaW5hbFRvID0gdG8udHJpbSgpOwogICAgY29uc3QgdG9rZW4gPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgndG9rZW5zJywgeyBzeW1ib2wgfSk7CgogICAgLy8gdGhlIHN5bWJvbCBtdXN0IGV4aXN0CiAgICAvLyB0aGUgYXBpLnNlbmRlciBtdXN0IGJlIHRoZSBpc3N1ZXIKICAgIC8vIHRoZW4gd2UgbmVlZCB0byBjaGVjayB0aGF0IHRoZSBxdWFudGl0eSBpcyBjb3JyZWN0CiAgICBpZiAoYXBpLmFzc2VydCh0b2tlbiAhPT0gbnVsbCwgJ3N5bWJvbCBkb2VzIG5vdCBleGlzdCcpCiAgICAgICYmIGFwaS5hc3NlcnQodG9rZW4uaXNzdWVyID09PSBhcGkuc2VuZGVyLCAnbm90IGFsbG93ZWQgdG8gaXNzdWUgdG9rZW5zJykKICAgICAgJiYgYXBpLmFzc2VydChjb3VudERlY2ltYWxzKHF1YW50aXR5KSA8PSB0b2tlbi5wcmVjaXNpb24sICdzeW1ib2wgcHJlY2lzaW9uIG1pc21hdGNoJykKICAgICAgJiYgYXBpLmFzc2VydChhcGkuQmlnTnVtYmVyKHF1YW50aXR5KS5ndCgwKSwgJ211c3QgaXNzdWUgcG9zaXRpdmUgcXVhbnRpdHknKQogICAgICAmJiBhcGkuYXNzZXJ0KGFwaS5CaWdOdW1iZXIodG9rZW4ubWF4U3VwcGx5KS5taW51cyh0b2tlbi5zdXBwbHkpLmd0ZShxdWFudGl0eSksICdxdWFudGl0eSBleGNlZWRzIGF2YWlsYWJsZSBzdXBwbHknKSkgewoKICAgICAgLy8gYSB2YWxpZCBzdGVlbSBhY2NvdW50IGlzIGJldHdlZW4gMyBhbmQgMTYgY2hhcmFjdGVycyBpbiBsZW5ndGgKICAgICAgaWYgKGFwaS5hc3NlcnQoZmluYWxUby5sZW5ndGggPj0gMyAmJiBmaW5hbFRvLmxlbmd0aCA8PSAxNiwgJ2ludmFsaWQgdG8nKSkgewogICAgICAgIC8vIHdlIG1hZGUgYWxsIHRoZSByZXF1aXJlZCB2ZXJpZmljYXRpb24sIGxldCdzIG5vdyBpc3N1ZSB0aGUgdG9rZW5zCgogICAgICAgIGxldCByZXMgPSBhd2FpdCBhZGRCYWxhbmNlVlR3byh0b2tlbi5pc3N1ZXIsIHRva2VuLCBxdWFudGl0eSwgJ2JhbGFuY2VzJyk7CgogICAgICAgIGlmIChyZXMgPT09IHRydWUgJiYgZmluYWxUbyAhPT0gdG9rZW4uaXNzdWVyKSB7CiAgICAgICAgICBpZiAoYXdhaXQgc3ViQmFsYW5jZVZUd28odG9rZW4uaXNzdWVyLCB0b2tlbiwgcXVhbnRpdHksICdiYWxhbmNlcycpKSB7CiAgICAgICAgICAgIHJlcyA9IGF3YWl0IGFkZEJhbGFuY2VWVHdvKGZpbmFsVG8sIHRva2VuLCBxdWFudGl0eSwgJ2JhbGFuY2VzJyk7CgogICAgICAgICAgICBpZiAocmVzID09PSBmYWxzZSkgewogICAgICAgICAgICAgIGF3YWl0IGFkZEJhbGFuY2VWVHdvKHRva2VuLmlzc3VlciwgdG9rZW4sIHF1YW50aXR5LCAnYmFsYW5jZXMnKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKHJlcyA9PT0gdHJ1ZSkgewogICAgICAgICAgdG9rZW4uc3VwcGx5ID0gY2FsY3VsYXRlQmFsYW5jZVZUd28odG9rZW4uc3VwcGx5LCBxdWFudGl0eSwgdG9rZW4ucHJlY2lzaW9uLCB0cnVlKTsKCiAgICAgICAgICBpZiAoZmluYWxUbyAhPT0gJ251bGwnKSB7CiAgICAgICAgICAgIHRva2VuLmNpcmN1bGF0aW5nU3VwcGx5ID0gY2FsY3VsYXRlQmFsYW5jZVZUd28oCiAgICAgICAgICAgICAgdG9rZW4uY2lyY3VsYXRpbmdTdXBwbHksIHF1YW50aXR5LCB0b2tlbi5wcmVjaXNpb24sIHRydWUsCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CgogICAgICAgICAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgndG9rZW5zJywgdG9rZW4pOwoKICAgICAgICAgIGFwaS5lbWl0KCd0cmFuc2ZlckZyb21Db250cmFjdCcsIHsKICAgICAgICAgICAgZnJvbTogJ3Rva2VucycsIHRvOiBmaW5hbFRvLCBzeW1ib2wsIHF1YW50aXR5LAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9OwoKYWN0aW9ucy5pc3N1ZSA9IGFzeW5jIChwYXlsb2FkKSA9PiB7CiAgaWYgKGFwaS5yZWZTdGVlbUJsb2NrTnVtYmVyIDwgMzA4OTY1MDApIHsKICAgIGF3YWl0IGlzc3VlVk9uZShwYXlsb2FkKTsKICB9IGVsc2UgewogICAgYXdhaXQgaXNzdWVWVHdvKHBheWxvYWQpOwogIH0KfTsKCmNvbnN0IHRyYW5zZmVyVk9uZSA9IGFzeW5jIChwYXlsb2FkKSA9PiB7CiAgY29uc3QgewogICAgdG8sIHN5bWJvbCwgcXVhbnRpdHksIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICB9ID0gcGF5bG9hZDsKCiAgaWYgKGFwaS5hc3NlcnQoaXNTaWduZWRXaXRoQWN0aXZlS2V5ID09PSB0cnVlLCAneW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5JykKICAgICYmIGFwaS5hc3NlcnQodG8gJiYgdHlwZW9mIHRvID09PSAnc3RyaW5nJwogICAgICAmJiBzeW1ib2wgJiYgdHlwZW9mIHN5bWJvbCA9PT0gJ3N0cmluZycKICAgICAgJiYgcXVhbnRpdHkgJiYgdHlwZW9mIHF1YW50aXR5ID09PSAnbnVtYmVyJywgJ2ludmFsaWQgcGFyYW1zJykpIHsKICAgIGNvbnN0IGZpbmFsVG8gPSB0by50cmltKCk7CiAgICBpZiAoYXBpLmFzc2VydChmaW5hbFRvICE9PSBhcGkuc2VuZGVyLCAnY2Fubm90IHRyYW5zZmVyIHRvIHNlbGYnKSkgewogICAgICAvLyBhIHZhbGlkIHN0ZWVtIGFjY291bnQgaXMgYmV0d2VlbiAzIGFuZCAxNiBjaGFyYWN0ZXJzIGluIGxlbmd0aAogICAgICBpZiAoYXBpLmFzc2VydChmaW5hbFRvLmxlbmd0aCA+PSAzICYmIGZpbmFsVG8ubGVuZ3RoIDw9IDE2LCAnaW52YWxpZCB0bycpKSB7CiAgICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgndG9rZW5zJywgeyBzeW1ib2wgfSk7CgogICAgICAgIC8vIHRoZSBzeW1ib2wgbXVzdCBleGlzdAogICAgICAgIC8vIHRoZW4gd2UgbmVlZCB0byBjaGVjayB0aGF0IHRoZSBxdWFudGl0eSBpcyBjb3JyZWN0CiAgICAgICAgaWYgKGFwaS5hc3NlcnQodG9rZW4gIT09IG51bGwsICdzeW1ib2wgZG9lcyBub3QgZXhpc3QnKQogICAgICAgICAgJiYgYXBpLmFzc2VydChjb3VudERlY2ltYWxzKHF1YW50aXR5KSA8PSB0b2tlbi5wcmVjaXNpb24sICdzeW1ib2wgcHJlY2lzaW9uIG1pc21hdGNoJykKICAgICAgICAgICYmIGFwaS5hc3NlcnQocXVhbnRpdHkgPiAwLCAnbXVzdCB0cmFuc2ZlciBwb3NpdGl2ZSBxdWFudGl0eScpKSB7CgogICAgICAgICAgaWYgKGF3YWl0IHN1YkJhbGFuY2VWT25lKGFwaS5zZW5kZXIsIHRva2VuLCBxdWFudGl0eSwgJ2JhbGFuY2VzJykpIHsKICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgYWRkQmFsYW5jZVZPbmUoZmluYWxUbywgdG9rZW4sIHF1YW50aXR5LCAnYmFsYW5jZXMnKTsKCiAgICAgICAgICAgIGlmIChyZXMgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgYXdhaXQgYWRkQmFsYW5jZVZPbmUoYXBpLnNlbmRlciwgdG9rZW4sIHF1YW50aXR5LCAnYmFsYW5jZXMnKTsKCiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZmluYWxUbyA9PT0gJ251bGwnKSB7CiAgICAgICAgICAgICAgdG9rZW4uY2lyY3VsYXRpbmdTdXBwbHkgPSBjYWxjdWxhdGVCYWxhbmNlVk9uZSgKICAgICAgICAgICAgICAgIHRva2VuLmNpcmN1bGF0aW5nU3VwcGx5LCBxdWFudGl0eSwgdG9rZW4ucHJlY2lzaW9uLCBmYWxzZSwKICAgICAgICAgICAgICApOwogICAgICAgICAgICAgIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3Rva2VucycsIHRva2VuKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYXBpLmVtaXQoJ3RyYW5zZmVyJywgewogICAgICAgICAgICAgIGZyb206IGFwaS5zZW5kZXIsIHRvOiBmaW5hbFRvLCBzeW1ib2wsIHF1YW50aXR5LAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgcmV0dXJuIGZhbHNlOwp9OwoKY29uc3QgdHJhbnNmZXJWVHdvID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBjb25zdCB7CiAgICB0bywgc3ltYm9sLCBxdWFudGl0eSwgaXNTaWduZWRXaXRoQWN0aXZlS2V5LAogIH0gPSBwYXlsb2FkOwoKICBpZiAoYXBpLmFzc2VydChpc1NpZ25lZFdpdGhBY3RpdmVLZXkgPT09IHRydWUsICd5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXknKQogICAgJiYgYXBpLmFzc2VydCh0byAmJiB0eXBlb2YgdG8gPT09ICdzdHJpbmcnCiAgICAgICYmIHN5bWJvbCAmJiB0eXBlb2Ygc3ltYm9sID09PSAnc3RyaW5nJwogICAgICAmJiBxdWFudGl0eSAmJiB0eXBlb2YgcXVhbnRpdHkgPT09ICdzdHJpbmcnICYmICFhcGkuQmlnTnVtYmVyKHF1YW50aXR5KS5pc05hTigpLCAnaW52YWxpZCBwYXJhbXMnKSkgewogICAgY29uc3QgZmluYWxUbyA9IHRvLnRyaW0oKTsKICAgIGlmIChhcGkuYXNzZXJ0KGZpbmFsVG8gIT09IGFwaS5zZW5kZXIsICdjYW5ub3QgdHJhbnNmZXIgdG8gc2VsZicpKSB7CiAgICAgIC8vIGEgdmFsaWQgc3RlZW0gYWNjb3VudCBpcyBiZXR3ZWVuIDMgYW5kIDE2IGNoYXJhY3RlcnMgaW4gbGVuZ3RoCiAgICAgIGlmIChhcGkuYXNzZXJ0KGZpbmFsVG8ubGVuZ3RoID49IDMgJiYgZmluYWxUby5sZW5ndGggPD0gMTYsICdpbnZhbGlkIHRvJykpIHsKICAgICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCd0b2tlbnMnLCB7IHN5bWJvbCB9KTsKCiAgICAgICAgLy8gdGhlIHN5bWJvbCBtdXN0IGV4aXN0CiAgICAgICAgLy8gdGhlbiB3ZSBuZWVkIHRvIGNoZWNrIHRoYXQgdGhlIHF1YW50aXR5IGlzIGNvcnJlY3QKICAgICAgICBpZiAoYXBpLmFzc2VydCh0b2tlbiAhPT0gbnVsbCwgJ3N5bWJvbCBkb2VzIG5vdCBleGlzdCcpCiAgICAgICAgICAmJiBhcGkuYXNzZXJ0KGNvdW50RGVjaW1hbHMocXVhbnRpdHkpIDw9IHRva2VuLnByZWNpc2lvbiwgJ3N5bWJvbCBwcmVjaXNpb24gbWlzbWF0Y2gnKQogICAgICAgICAgJiYgYXBpLmFzc2VydChhcGkuQmlnTnVtYmVyKHF1YW50aXR5KS5ndCgwKSwgJ211c3QgdHJhbnNmZXIgcG9zaXRpdmUgcXVhbnRpdHknKSkgewogICAgICAgICAgaWYgKGF3YWl0IHN1YkJhbGFuY2VWVHdvKGFwaS5zZW5kZXIsIHRva2VuLCBxdWFudGl0eSwgJ2JhbGFuY2VzJykpIHsKICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgYWRkQmFsYW5jZVZUd28oZmluYWxUbywgdG9rZW4sIHF1YW50aXR5LCAnYmFsYW5jZXMnKTsKCiAgICAgICAgICAgIGlmIChyZXMgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgYXdhaXQgYWRkQmFsYW5jZVZUd28oYXBpLnNlbmRlciwgdG9rZW4sIHF1YW50aXR5LCAnYmFsYW5jZXMnKTsKCiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZmluYWxUbyA9PT0gJ251bGwnKSB7CiAgICAgICAgICAgICAgdG9rZW4uY2lyY3VsYXRpbmdTdXBwbHkgPSBjYWxjdWxhdGVCYWxhbmNlVlR3bygKICAgICAgICAgICAgICAgIHRva2VuLmNpcmN1bGF0aW5nU3VwcGx5LCBxdWFudGl0eSwgdG9rZW4ucHJlY2lzaW9uLCBmYWxzZSwKICAgICAgICAgICAgICApOwogICAgICAgICAgICAgIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3Rva2VucycsIHRva2VuKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYXBpLmVtaXQoJ3RyYW5zZmVyJywgewogICAgICAgICAgICAgIGZyb206IGFwaS5zZW5kZXIsIHRvOiBmaW5hbFRvLCBzeW1ib2wsIHF1YW50aXR5LAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgcmV0dXJuIGZhbHNlOwp9OwoKYWN0aW9ucy50cmFuc2ZlciA9IGFzeW5jIChwYXlsb2FkKSA9PiB7CiAgaWYgKGFwaS5yZWZTdGVlbUJsb2NrTnVtYmVyIDwgMzA4OTY1MDApIHsKICAgIGF3YWl0IHRyYW5zZmVyVk9uZShwYXlsb2FkKTsKICB9IGVsc2UgewogICAgYXdhaXQgdHJhbnNmZXJWVHdvKHBheWxvYWQpOwogIH0KfTsKCmFjdGlvbnMudHJhbnNmZXJUb0NvbnRyYWN0ID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBjb25zdCB7CiAgICB0bywgc3ltYm9sLCBxdWFudGl0eSwgaXNTaWduZWRXaXRoQWN0aXZlS2V5LAogIH0gPSBwYXlsb2FkOwoKICBpZiAoYXBpLmFzc2VydChpc1NpZ25lZFdpdGhBY3RpdmVLZXkgPT09IHRydWUsICd5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXknKQogICAgJiYgYXBpLmFzc2VydCh0byAmJiB0eXBlb2YgdG8gPT09ICdzdHJpbmcnCiAgICAgICYmIHN5bWJvbCAmJiB0eXBlb2Ygc3ltYm9sID09PSAnc3RyaW5nJwogICAgICAmJiBxdWFudGl0eSAmJiB0eXBlb2YgcXVhbnRpdHkgPT09ICdzdHJpbmcnICYmICFhcGkuQmlnTnVtYmVyKHF1YW50aXR5KS5pc05hTigpLCAnaW52YWxpZCBwYXJhbXMnKSkgewogICAgY29uc3QgZmluYWxUbyA9IHRvLnRyaW0oKTsKICAgIGlmIChhcGkuYXNzZXJ0KGZpbmFsVG8gIT09IGFwaS5zZW5kZXIsICdjYW5ub3QgdHJhbnNmZXIgdG8gc2VsZicpKSB7CiAgICAgIC8vIGEgdmFsaWQgY29udHJhY3QgYWNjb3VudCBpcyBiZXR3ZWVuIDMgYW5kIDUwIGNoYXJhY3RlcnMgaW4gbGVuZ3RoCiAgICAgIGlmIChhcGkuYXNzZXJ0KGZpbmFsVG8ubGVuZ3RoID49IDMgJiYgZmluYWxUby5sZW5ndGggPD0gNTAsICdpbnZhbGlkIHRvJykpIHsKICAgICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCd0b2tlbnMnLCB7IHN5bWJvbCB9KTsKCiAgICAgICAgLy8gdGhlIHN5bWJvbCBtdXN0IGV4aXN0CiAgICAgICAgLy8gdGhlbiB3ZSBuZWVkIHRvIGNoZWNrIHRoYXQgdGhlIHF1YW50aXR5IGlzIGNvcnJlY3QKICAgICAgICBpZiAoYXBpLmFzc2VydCh0b2tlbiAhPT0gbnVsbCwgJ3N5bWJvbCBkb2VzIG5vdCBleGlzdCcpCiAgICAgICAgICAmJiBhcGkuYXNzZXJ0KGNvdW50RGVjaW1hbHMocXVhbnRpdHkpIDw9IHRva2VuLnByZWNpc2lvbiwgJ3N5bWJvbCBwcmVjaXNpb24gbWlzbWF0Y2gnKQogICAgICAgICAgJiYgYXBpLmFzc2VydChhcGkuQmlnTnVtYmVyKHF1YW50aXR5KS5ndCgwKSwgJ211c3QgdHJhbnNmZXIgcG9zaXRpdmUgcXVhbnRpdHknKSkgewogICAgICAgICAgaWYgKGF3YWl0IHN1YkJhbGFuY2VWVHdvKGFwaS5zZW5kZXIsIHRva2VuLCBxdWFudGl0eSwgJ2JhbGFuY2VzJykpIHsKICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgYWRkQmFsYW5jZVZUd28oZmluYWxUbywgdG9rZW4sIHF1YW50aXR5LCAnY29udHJhY3RzQmFsYW5jZXMnKTsKCiAgICAgICAgICAgIGlmIChyZXMgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgYXdhaXQgYWRkQmFsYW5jZVZUd28oYXBpLnNlbmRlciwgdG9rZW4sIHF1YW50aXR5LCAnYmFsYW5jZXMnKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBpZiAoZmluYWxUbyA9PT0gJ251bGwnKSB7CiAgICAgICAgICAgICAgICB0b2tlbi5jaXJjdWxhdGluZ1N1cHBseSA9IGNhbGN1bGF0ZUJhbGFuY2VWVHdvKAogICAgICAgICAgICAgICAgICB0b2tlbi5jaXJjdWxhdGluZ1N1cHBseSwgcXVhbnRpdHksIHRva2VuLnByZWNpc2lvbiwgZmFsc2UsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgndG9rZW5zJywgdG9rZW4pOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgYXBpLmVtaXQoJ3RyYW5zZmVyVG9Db250cmFjdCcsIHsKICAgICAgICAgICAgICAgIGZyb206IGFwaS5zZW5kZXIsIHRvOiBmaW5hbFRvLCBzeW1ib2wsIHF1YW50aXR5LAogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9OwoKYWN0aW9ucy50cmFuc2ZlckZyb21Db250cmFjdCA9IGFzeW5jIChwYXlsb2FkKSA9PiB7CiAgLy8gdGhpcyBhY3Rpb24gY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IHRoZSAnbnVsbCcgYWNjb3VudCB3aGljaCBvbmx5IHRoZSBjb3JlIGNvZGUgY2FuIHVzZQogIGlmIChhcGkuYXNzZXJ0KGFwaS5zZW5kZXIgPT09ICdudWxsJywgJ25vdCBhdXRob3JpemVkJykpIHsKICAgIGNvbnN0IHsKICAgICAgZnJvbSwgdG8sIHN5bWJvbCwgcXVhbnRpdHksIHR5cGUsIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICAgIH0gPSBwYXlsb2FkOwogICAgY29uc3QgdHlwZXMgPSBbJ3VzZXInLCAnY29udHJhY3QnXTsKCiAgICBpZiAoYXBpLmFzc2VydChpc1NpZ25lZFdpdGhBY3RpdmVLZXkgPT09IHRydWUsICd5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXknKQogICAgICAmJiBhcGkuYXNzZXJ0KHRvICYmIHR5cGVvZiB0byA9PT0gJ3N0cmluZycKICAgICAgICAmJiBmcm9tICYmIHR5cGVvZiBmcm9tID09PSAnc3RyaW5nJwogICAgICAgICYmIHN5bWJvbCAmJiB0eXBlb2Ygc3ltYm9sID09PSAnc3RyaW5nJwogICAgICAgICYmIHR5cGUgJiYgKHR5cGVzLmluY2x1ZGVzKHR5cGUpKQogICAgICAgICYmIHF1YW50aXR5ICYmIHR5cGVvZiBxdWFudGl0eSA9PT0gJ3N0cmluZycgJiYgIWFwaS5CaWdOdW1iZXIocXVhbnRpdHkpLmlzTmFOKCksICdpbnZhbGlkIHBhcmFtcycpKSB7CiAgICAgIGNvbnN0IGZpbmFsVG8gPSB0by50cmltKCk7CiAgICAgIGNvbnN0IHRhYmxlID0gdHlwZSA9PT0gJ3VzZXInID8gJ2JhbGFuY2VzJyA6ICdjb250cmFjdHNCYWxhbmNlcyc7CgogICAgICBpZiAoYXBpLmFzc2VydCh0eXBlID09PSAndXNlcicgfHwgKHR5cGUgPT09ICdjb250cmFjdCcgJiYgZmluYWxUbyAhPT0gZnJvbSksICdjYW5ub3QgdHJhbnNmZXIgdG8gc2VsZicpKSB7CiAgICAgICAgLy8gdmFsaWRhdGUgdGhlICJ0byIKICAgICAgICBjb25zdCB0b1ZhbGlkID0gdHlwZSA9PT0gJ3VzZXInID8gZmluYWxUby5sZW5ndGggPj0gMyAmJiBmaW5hbFRvLmxlbmd0aCA8PSAxNiA6IGZpbmFsVG8ubGVuZ3RoID49IDMgJiYgZmluYWxUby5sZW5ndGggPD0gNTA7CgogICAgICAgIC8vIHRoZSBhY2NvdW50IG11c3QgZXhpc3QKICAgICAgICBpZiAoYXBpLmFzc2VydCh0b1ZhbGlkID09PSB0cnVlLCAnaW52YWxpZCB0bycpKSB7CiAgICAgICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCd0b2tlbnMnLCB7IHN5bWJvbCB9KTsKCiAgICAgICAgICAvLyB0aGUgc3ltYm9sIG11c3QgZXhpc3QKICAgICAgICAgIC8vIHRoZW4gd2UgbmVlZCB0byBjaGVjayB0aGF0IHRoZSBxdWFudGl0eSBpcyBjb3JyZWN0CiAgICAgICAgICBpZiAoYXBpLmFzc2VydCh0b2tlbiAhPT0gbnVsbCwgJ3N5bWJvbCBkb2VzIG5vdCBleGlzdCcpCiAgICAgICAgICAgICYmIGFwaS5hc3NlcnQoY291bnREZWNpbWFscyhxdWFudGl0eSkgPD0gdG9rZW4ucHJlY2lzaW9uLCAnc3ltYm9sIHByZWNpc2lvbiBtaXNtYXRjaCcpCiAgICAgICAgICAgICYmIGFwaS5hc3NlcnQoYXBpLkJpZ051bWJlcihxdWFudGl0eSkuZ3QoMCksICdtdXN0IHRyYW5zZmVyIHBvc2l0aXZlIHF1YW50aXR5JykpIHsKCiAgICAgICAgICAgIGlmIChhd2FpdCBzdWJCYWxhbmNlVlR3byhmcm9tLCB0b2tlbiwgcXVhbnRpdHksICdjb250cmFjdHNCYWxhbmNlcycpKSB7CiAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgYWRkQmFsYW5jZVZUd28oZmluYWxUbywgdG9rZW4sIHF1YW50aXR5LCB0YWJsZSk7CgogICAgICAgICAgICAgIGlmIChyZXMgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICBhd2FpdCBhZGRCYWxhbmNlVlR3byhmcm9tLCB0b2tlbiwgcXVhbnRpdHksICdjb250cmFjdHNCYWxhbmNlcycpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoZmluYWxUbyA9PT0gJ251bGwnKSB7CiAgICAgICAgICAgICAgICAgIHRva2VuLmNpcmN1bGF0aW5nU3VwcGx5ID0gY2FsY3VsYXRlQmFsYW5jZVZUd28oCiAgICAgICAgICAgICAgICAgICAgdG9rZW4uY2lyY3VsYXRpbmdTdXBwbHksIHF1YW50aXR5LCB0b2tlbi5wcmVjaXNpb24sIGZhbHNlLAogICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICBhd2FpdCBhcGkuZGIudXBkYXRlKCd0b2tlbnMnLCB0b2tlbik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgYXBpLmVtaXQoJ3RyYW5zZmVyRnJvbUNvbnRyYWN0JywgewogICAgICAgICAgICAgICAgICBmcm9tLCB0bzogZmluYWxUbywgc3ltYm9sLCBxdWFudGl0eSwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfTsKCmNvbnN0IHByb2Nlc3NVbnN0YWtlID0gYXN5bmMgKHVuc3Rha2UpID0+IHsKICBjb25zdCB7CiAgICBhY2NvdW50LAogICAgc3ltYm9sLAogICAgcXVhbnRpdHksCiAgICBxdWFudGl0eUxlZnQsCiAgICBudW1iZXJUcmFuc2FjdGlvbnNMZWZ0LAogIH0gPSB1bnN0YWtlOwoKICBjb25zdCBuZXdVbnN0YWtlID0gdW5zdGFrZTsKCiAgY29uc3QgYmFsYW5jZSA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdiYWxhbmNlcycsIHsgYWNjb3VudCwgc3ltYm9sIH0pOwogIGNvbnN0IHRva2VuID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ3Rva2VucycsIHsgc3ltYm9sIH0pOwogIGxldCB0b2tlbnNUb1JlbGVhc2UgPSAwOwoKICBpZiAoYXBpLmFzc2VydChiYWxhbmNlICE9PSBudWxsLCAnYmFsYW5jZSBkb2VzIG5vdCBleGlzdCcpKSB7CiAgICAvLyBpZiBsYXN0IHRyYW5zYWN0aW9uIHRvIHByb2Nlc3MKICAgIGlmIChudW1iZXJUcmFuc2FjdGlvbnNMZWZ0ID09PSAxKSB7CiAgICAgIHRva2Vuc1RvUmVsZWFzZSA9IHF1YW50aXR5TGVmdDsKICAgICAgYXdhaXQgYXBpLmRiLnJlbW92ZSgncGVuZGluZ1Vuc3Rha2VzJywgdW5zdGFrZSk7CiAgICB9IGVsc2UgewogICAgICB0b2tlbnNUb1JlbGVhc2UgPSBhcGkuQmlnTnVtYmVyKHF1YW50aXR5KQogICAgICAgIC5kaXZpZGVkQnkodG9rZW4ubnVtYmVyVHJhbnNhY3Rpb25zKQogICAgICAgIC50b0ZpeGVkKHRva2VuLnByZWNpc2lvbiwgYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKTsKCiAgICAgIG5ld1Vuc3Rha2UucXVhbnRpdHlMZWZ0ID0gYXBpLkJpZ051bWJlcihuZXdVbnN0YWtlLnF1YW50aXR5TGVmdCkKICAgICAgICAubWludXModG9rZW5zVG9SZWxlYXNlKQogICAgICAgIC50b0ZpeGVkKHRva2VuLnByZWNpc2lvbik7CgogICAgICBuZXdVbnN0YWtlLm51bWJlclRyYW5zYWN0aW9uc0xlZnQgLT0gMTsKCiAgICAgIG5ld1Vuc3Rha2UubmV4dFRyYW5zYWN0aW9uVGltZXN0YW1wID0gYXBpLkJpZ051bWJlcihuZXdVbnN0YWtlLm5leHRUcmFuc2FjdGlvblRpbWVzdGFtcCkKICAgICAgICAucGx1cyhuZXdVbnN0YWtlLm1pbGxpc2VjUGVyUGVyaW9kKQogICAgICAgIC50b051bWJlcigpOwoKICAgICAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgncGVuZGluZ1Vuc3Rha2VzJywgbmV3VW5zdGFrZSk7CiAgICB9CgogICAgaWYgKGFwaS5CaWdOdW1iZXIodG9rZW5zVG9SZWxlYXNlKS5ndCgwKSkgewogICAgICBjb25zdCBvcmlnaW5hbEJhbGFuY2UgPSBiYWxhbmNlLmJhbGFuY2U7CiAgICAgIGNvbnN0IG9yaWdpbmFsUGVuZGluZ1N0YWtlID0gYmFsYW5jZS5wZW5kaW5nVW5zdGFrZTsKCiAgICAgIGJhbGFuY2UuYmFsYW5jZSA9IGNhbGN1bGF0ZUJhbGFuY2VWVHdvKAogICAgICAgIGJhbGFuY2UuYmFsYW5jZSwgdG9rZW5zVG9SZWxlYXNlLCB0b2tlbi5wcmVjaXNpb24sIHRydWUsCiAgICAgICk7CiAgICAgIGJhbGFuY2UucGVuZGluZ1Vuc3Rha2UgPSBjYWxjdWxhdGVCYWxhbmNlVlR3bygKICAgICAgICBiYWxhbmNlLnBlbmRpbmdVbnN0YWtlLCB0b2tlbnNUb1JlbGVhc2UsIHRva2VuLnByZWNpc2lvbiwgZmFsc2UsCiAgICAgICk7CgogICAgICBpZiAoYXBpLmFzc2VydChhcGkuQmlnTnVtYmVyKGJhbGFuY2UucGVuZGluZ1Vuc3Rha2UpLmx0KG9yaWdpbmFsUGVuZGluZ1N0YWtlKQogICAgICAgICYmIGFwaS5CaWdOdW1iZXIoYmFsYW5jZS5iYWxhbmNlKS5ndChvcmlnaW5hbEJhbGFuY2UpLCAnY2Fubm90IHN1YnRyYWN0JykpIHsKICAgICAgICBhd2FpdCBhcGkuZGIudXBkYXRlKCdiYWxhbmNlcycsIGJhbGFuY2UpOwoKICAgICAgICBhcGkuZW1pdCgndW5zdGFrZScsIHsgYWNjb3VudCwgc3ltYm9sLCBxdWFudGl0eTogdG9rZW5zVG9SZWxlYXNlIH0pOwogICAgICB9CiAgICB9CiAgfQp9OwoKYWN0aW9ucy5jaGVja1BlbmRpbmdVbnN0YWtlcyA9IGFzeW5jIChwYXlsb2FkKSA9PiB7CiAgaWYgKGFwaS5hc3NlcnQoYXBpLnNlbmRlciA9PT0gJ251bGwnLCAnbm90IGF1dGhvcml6ZWQnKSkgewogICAgY29uc3QgYmxvY2tEYXRlID0gbmV3IERhdGUoYCR7YXBpLnN0ZWVtQmxvY2tUaW1lc3RhbXB9LjAwMFpgKTsKICAgIGNvbnN0IHRpbWVzdGFtcCA9IGJsb2NrRGF0ZS5nZXRUaW1lKCk7CgogICAgLy8gZ2V0IGFsbCB0aGUgcGVuZGluZyB1bnN0YWtlcyB0aGF0IGFyZSByZWFkeSB0byBiZSByZWxlYXNlZAogICAgbGV0IHBlbmRpbmdVbnN0YWtlcyA9IGF3YWl0IGFwaS5kYi5maW5kKAogICAgICAncGVuZGluZ1Vuc3Rha2VzJywKICAgICAgewogICAgICAgIG5leHRUcmFuc2FjdGlvblRpbWVzdGFtcDogewogICAgICAgICAgJGx0ZTogdGltZXN0YW1wLAogICAgICAgIH0sCiAgICAgIH0pOwoKICAgIGxldCBuYlBlbmRpbmdVbnN0YWtlcyA9IHBlbmRpbmdVbnN0YWtlcy5sZW5ndGg7CiAgICB3aGlsZSAobmJQZW5kaW5nVW5zdGFrZXMgPiAwKSB7CiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBuYlBlbmRpbmdVbnN0YWtlczsgaW5kZXggKz0gMSkgewogICAgICAgIGNvbnN0IHBlbmRpbmdVbnN0YWtlID0gcGVuZGluZ1Vuc3Rha2VzW2luZGV4XTsKICAgICAgICBhd2FpdCBwcm9jZXNzVW5zdGFrZShwZW5kaW5nVW5zdGFrZSk7CiAgICAgIH0KCiAgICAgIHBlbmRpbmdVbnN0YWtlcyA9IGF3YWl0IGFwaS5kYi5maW5kKAogICAgICAgICdwZW5kaW5nVW5zdGFrZXMnLAogICAgICAgIHsKICAgICAgICAgIG5leHRUcmFuc2FjdGlvblRpbWVzdGFtcDogewogICAgICAgICAgICAkbHRlOiB0aW1lc3RhbXAsCiAgICAgICAgICB9LAogICAgICAgIH0pOwogIAogICAgICBuYlBlbmRpbmdVbnN0YWtlcyA9IHBlbmRpbmdVbnN0YWtlcy5sZW5ndGg7CiAgICB9CiAgfQp9OwoKYWN0aW9ucy5lbmFibGVTdGFraW5nID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBjb25zdCB7IHN5bWJvbCwgdW5zdGFraW5nQ29vbGRvd24sIG51bWJlclRyYW5zYWN0aW9ucywgaXNTaWduZWRXaXRoQWN0aXZlS2V5IH0gPSBwYXlsb2FkOwoKICBpZiAoYXBpLmFzc2VydChpc1NpZ25lZFdpdGhBY3RpdmVLZXkgPT09IHRydWUsICd5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXknKQogICAgJiYgYXBpLmFzc2VydChzeW1ib2wgJiYgdHlwZW9mIHN5bWJvbCA9PT0gJ3N0cmluZycsICdpbnZhbGlkIHN5bWJvbCcpCiAgICAmJiBhcGkuYXNzZXJ0KHVuc3Rha2luZ0Nvb2xkb3duICYmIE51bWJlci5pc0ludGVnZXIodW5zdGFraW5nQ29vbGRvd24pICYmIHVuc3Rha2luZ0Nvb2xkb3duID4gMCAmJiB1bnN0YWtpbmdDb29sZG93biA8PSAzNjUsICd1bnN0YWtpbmdDb29sZG93biBtdXN0IGJlIGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCAzNjUnKQogICAgJiYgYXBpLmFzc2VydChudW1iZXJUcmFuc2FjdGlvbnMgJiYgTnVtYmVyLmlzSW50ZWdlcihudW1iZXJUcmFuc2FjdGlvbnMpICYmIG51bWJlclRyYW5zYWN0aW9ucyA+IDAgJiYgbnVtYmVyVHJhbnNhY3Rpb25zIDw9IDM2NSwgJ251bWJlclRyYW5zYWN0aW9ucyBtdXN0IGJlIGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCAzNjUnKSkgewogICAgY29uc3QgdG9rZW4gPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgndG9rZW5zJywgeyBzeW1ib2wgfSk7CgogICAgaWYgKGFwaS5hc3NlcnQodG9rZW4gIT09IG51bGwsICdzeW1ib2wgZG9lcyBub3QgZXhpc3QnKQogICAgICAmJiBhcGkuYXNzZXJ0KHRva2VuLmlzc3VlciA9PT0gYXBpLnNlbmRlciwgJ211c3QgYmUgdGhlIGlzc3VlcicpCiAgICAgICYmIGFwaS5hc3NlcnQodG9rZW4uc3Rha2luZ0VuYWJsZWQgPT09IHVuZGVmaW5lZCB8fCB0b2tlbi5zdGFraW5nRW5hYmxlZCA9PT0gZmFsc2UsICdzdGFraW5nIGFscmVhZHkgZW5hYmxlZCcpKSB7CiAgICAgIHRva2VuLnN0YWtpbmdFbmFibGVkID0gdHJ1ZTsKICAgICAgdG9rZW4udW5zdGFraW5nQ29vbGRvd24gPSB1bnN0YWtpbmdDb29sZG93bjsKICAgICAgdG9rZW4ubnVtYmVyVHJhbnNhY3Rpb25zID0gbnVtYmVyVHJhbnNhY3Rpb25zOwogICAgICBhd2FpdCBhcGkuZGIudXBkYXRlKCd0b2tlbnMnLCB0b2tlbik7CiAgICB9CiAgfQp9OwoKYWN0aW9ucy5lbmFibGVWb3RpbmcgPSBhc3luYyAocGF5bG9hZCkgPT4gewogIGNvbnN0IHsgc3ltYm9sLCBuYkRheXMxMDBQZXJjZW50UmVnZW5lcmF0aW9uLCBpc1NpZ25lZFdpdGhBY3RpdmVLZXkgfSA9IHBheWxvYWQ7CgogIGlmIChhcGkuYXNzZXJ0KGlzU2lnbmVkV2l0aEFjdGl2ZUtleSA9PT0gdHJ1ZSwgJ3lvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleScpCiAgICAmJiBhcGkuYXNzZXJ0KHN5bWJvbCAmJiB0eXBlb2Ygc3ltYm9sID09PSAnc3RyaW5nJywgJ2ludmFsaWQgc3ltYm9sJykKICAgICYmIGFwaS5hc3NlcnQobmJEYXlzMTAwUGVyY2VudFJlZ2VuZXJhdGlvbiAmJiBOdW1iZXIuaXNJbnRlZ2VyKG5iRGF5czEwMFBlcmNlbnRSZWdlbmVyYXRpb24pICYmIG5iRGF5czEwMFBlcmNlbnRSZWdlbmVyYXRpb24gPiAwICYmIG5iRGF5czEwMFBlcmNlbnRSZWdlbmVyYXRpb24gPD0gMzY1LCAnbmJEYXlzMTAwUGVyY2VudFJlZ2VuZXJhdGlvbiBtdXN0IGJlIGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCAzNjUnKSkgewogICAgY29uc3QgdG9rZW4gPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgndG9rZW5zJywgeyBzeW1ib2wgfSk7CgogICAgaWYgKGFwaS5hc3NlcnQodG9rZW4gIT09IG51bGwsICdzeW1ib2wgZG9lcyBub3QgZXhpc3QnKQogICAgICAmJiBhcGkuYXNzZXJ0KHRva2VuLmlzc3VlciA9PT0gYXBpLnNlbmRlciwgJ211c3QgYmUgdGhlIGlzc3VlcicpCiAgICAgICYmIGFwaS5hc3NlcnQodG9rZW4uc3Rha2luZ0VuYWJsZWQgPT09IGZhbHNlLCAndm90aW5nIGFscmVhZHkgZW5hYmxlZCcpKSB7CiAgICAgIHRva2VuLnZvdGluZ0VuYWJsZWQgPSB0cnVlOwogICAgICB0b2tlbi5uYkRheXMxMDBQZXJjZW50UmVnZW5lcmF0aW9uID0gbmJEYXlzMTAwUGVyY2VudFJlZ2VuZXJhdGlvbjsKICAgICAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgndG9rZW5zJywgdG9rZW4pOwogICAgfQogIH0KfTsKCmFjdGlvbnMuc3Rha2UgPSBhc3luYyAocGF5bG9hZCkgPT4gewogIGNvbnN0IHsgc3ltYm9sLCBxdWFudGl0eSwgaXNTaWduZWRXaXRoQWN0aXZlS2V5IH0gPSBwYXlsb2FkOwoKICBpZiAoYXBpLmFzc2VydChpc1NpZ25lZFdpdGhBY3RpdmVLZXkgPT09IHRydWUsICd5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXknKQogICAgJiYgYXBpLmFzc2VydChzeW1ib2wgJiYgdHlwZW9mIHN5bWJvbCA9PT0gJ3N0cmluZycKICAgICAgJiYgcXVhbnRpdHkgJiYgdHlwZW9mIHF1YW50aXR5ID09PSAnc3RyaW5nJyAmJiAhYXBpLkJpZ051bWJlcihxdWFudGl0eSkuaXNOYU4oKSwgJ2ludmFsaWQgcGFyYW1zJykpIHsKCiAgICAvLyBhIHZhbGlkIHN0ZWVtIGFjY291bnQgaXMgYmV0d2VlbiAzIGFuZCAxNiBjaGFyYWN0ZXJzIGluIGxlbmd0aAogICAgY29uc3QgdG9rZW4gPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgndG9rZW5zJywgeyBzeW1ib2wgfSk7CgogICAgLy8gdGhlIHN5bWJvbCBtdXN0IGV4aXN0CiAgICAvLyB0aGVuIHdlIG5lZWQgdG8gY2hlY2sgdGhhdCB0aGUgcXVhbnRpdHkgaXMgY29ycmVjdAogICAgaWYgKGFwaS5hc3NlcnQodG9rZW4gIT09IG51bGwsICdzeW1ib2wgZG9lcyBub3QgZXhpc3QnKQogICAgICAmJiBhcGkuYXNzZXJ0KGNvdW50RGVjaW1hbHMocXVhbnRpdHkpIDw9IHRva2VuLnByZWNpc2lvbiwgJ3N5bWJvbCBwcmVjaXNpb24gbWlzbWF0Y2gnKQogICAgICAmJiBhcGkuYXNzZXJ0KHRva2VuLnN0YWtpbmdFbmFibGVkID09PSB0cnVlLCAnc3Rha2luZyBub3QgZW5hYmxlZCcpCiAgICAgICYmIGFwaS5hc3NlcnQoYXBpLkJpZ051bWJlcihxdWFudGl0eSkuZ3QoMCksICdtdXN0IHN0YWtlIHBvc2l0aXZlIHF1YW50aXR5JykpIHsKICAgICAgaWYgKGF3YWl0IHN1YkJhbGFuY2VWVHdvKGFwaS5zZW5kZXIsIHRva2VuLCBxdWFudGl0eSwgJ2JhbGFuY2VzJykpIHsKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBhZGRTdGFrZShhcGkuc2VuZGVyLCB0b2tlbiwgcXVhbnRpdHkpOwoKICAgICAgICBpZiAocmVzID09PSBmYWxzZSkgewogICAgICAgICAgYXdhaXQgYWRkQmFsYW5jZVZUd28oYXBpLnNlbmRlciwgdG9rZW4sIHF1YW50aXR5LCAnYmFsYW5jZXMnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYXBpLmVtaXQoJ3N0YWtlJywgeyBhY2NvdW50OiBhcGkuc2VuZGVyLCBzeW1ib2wsIHF1YW50aXR5IH0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfTsKCmNvbnN0IHN0YXJ0VW5zdGFrZSA9IGFzeW5jIChhY2NvdW50LCB0b2tlbiwgcXVhbnRpdHkpID0+IHsKICBjb25zdCBibG9ja0RhdGUgPSBuZXcgRGF0ZShgJHthcGkuc3RlZW1CbG9ja1RpbWVzdGFtcH0uMDAwWmApOwogIGNvbnN0IGNvb2xkb3duUGVyaW9kTWlsbGlzZWMgPSB0b2tlbi51bnN0YWtpbmdDb29sZG93biAqIDI0ICogMzYwMCAqIDEwMDA7CiAgY29uc3QgbWlsbGlzZWNQZXJQZXJpb2QgPSBhcGkuQmlnTnVtYmVyKGNvb2xkb3duUGVyaW9kTWlsbGlzZWMpCiAgICAuZGl2aWRlZEJ5KHRva2VuLm51bWJlclRyYW5zYWN0aW9ucykKICAgIC5pbnRlZ2VyVmFsdWUoYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKTsKCiAgY29uc3QgbmV4dFRyYW5zYWN0aW9uVGltZXN0YW1wID0gYXBpLkJpZ051bWJlcihibG9ja0RhdGUuZ2V0VGltZSgpKQogICAgLnBsdXMobWlsbGlzZWNQZXJQZXJpb2QpCiAgICAudG9OdW1iZXIoKTsKCiAgY29uc3QgdW5zdGFrZSA9IHsKICAgIGFjY291bnQsCiAgICBzeW1ib2w6IHRva2VuLnN5bWJvbCwKICAgIHF1YW50aXR5LAogICAgcXVhbnRpdHlMZWZ0OiBxdWFudGl0eSwKICAgIG5leHRUcmFuc2FjdGlvblRpbWVzdGFtcCwKICAgIG51bWJlclRyYW5zYWN0aW9uc0xlZnQ6IHRva2VuLm51bWJlclRyYW5zYWN0aW9ucywKICAgIG1pbGxpc2VjUGVyUGVyaW9kLAogICAgdHhJRDogYXBpLnRyYW5zYWN0aW9uSWQsCiAgfTsKCiAgYXdhaXQgYXBpLmRiLmluc2VydCgncGVuZGluZ1Vuc3Rha2VzJywgdW5zdGFrZSk7Cn07CgphY3Rpb25zLnVuc3Rha2UgPSBhc3luYyAocGF5bG9hZCkgPT4gewogIGNvbnN0IHsgc3ltYm9sLCBxdWFudGl0eSwgaXNTaWduZWRXaXRoQWN0aXZlS2V5IH0gPSBwYXlsb2FkOwoKICBpZiAoYXBpLmFzc2VydChpc1NpZ25lZFdpdGhBY3RpdmVLZXkgPT09IHRydWUsICd5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXknKQogICAgJiYgYXBpLmFzc2VydChzeW1ib2wgJiYgdHlwZW9mIHN5bWJvbCA9PT0gJ3N0cmluZycKICAgICAgJiYgcXVhbnRpdHkgJiYgdHlwZW9mIHF1YW50aXR5ID09PSAnc3RyaW5nJyAmJiAhYXBpLkJpZ051bWJlcihxdWFudGl0eSkuaXNOYU4oKSwgJ2ludmFsaWQgcGFyYW1zJykpIHsKCiAgICAvLyBhIHZhbGlkIHN0ZWVtIGFjY291bnQgaXMgYmV0d2VlbiAzIGFuZCAxNiBjaGFyYWN0ZXJzIGluIGxlbmd0aAogICAgY29uc3QgdG9rZW4gPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgndG9rZW5zJywgeyBzeW1ib2wgfSk7CgogICAgLy8gdGhlIHN5bWJvbCBtdXN0IGV4aXN0CiAgICAvLyB0aGVuIHdlIG5lZWQgdG8gY2hlY2sgdGhhdCB0aGUgcXVhbnRpdHkgaXMgY29ycmVjdAogICAgaWYgKGFwaS5hc3NlcnQodG9rZW4gIT09IG51bGwsICdzeW1ib2wgZG9lcyBub3QgZXhpc3QnKQogICAgICAmJiBhcGkuYXNzZXJ0KHRva2VuLnN0YWtpbmdFbmFibGVkID09PSB0cnVlLCAnc3Rha2luZyBub3QgZW5hYmxlZCcpCiAgICAgICYmIGFwaS5hc3NlcnQoY291bnREZWNpbWFscyhxdWFudGl0eSkgPD0gdG9rZW4ucHJlY2lzaW9uLCAnc3ltYm9sIHByZWNpc2lvbiBtaXNtYXRjaCcpCiAgICAgICYmIGFwaS5hc3NlcnQoYXBpLkJpZ051bWJlcihxdWFudGl0eSkuZ3QoMCksICdtdXN0IHVuc3Rha2UgcG9zaXRpdmUgcXVhbnRpdHknKSkgewoKICAgICAgaWYgKGF3YWl0IHN1YlN0YWtlKGFwaS5zZW5kZXIsIHRva2VuLCBxdWFudGl0eSkpIHsKICAgICAgICBhd2FpdCBzdGFydFVuc3Rha2UoYXBpLnNlbmRlciwgdG9rZW4sIHF1YW50aXR5KTsKCiAgICAgICAgYXBpLmVtaXQoJ3Vuc3Rha2VTdGFydCcsIHsgYWNjb3VudDogYXBpLnNlbmRlciwgc3ltYm9sLCBxdWFudGl0eSB9KTsKICAgICAgfQogICAgfQogIH0KfTsKCmNvbnN0IHByb2Nlc3NDYW5jZWxVbnN0YWtlID0gYXN5bmMgKHVuc3Rha2UpID0+IHsKICBjb25zdCB7CiAgICBhY2NvdW50LAogICAgc3ltYm9sLAogICAgcXVhbnRpdHlMZWZ0LAogIH0gPSB1bnN0YWtlOwoKICBjb25zdCBiYWxhbmNlID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ2JhbGFuY2VzJywgeyBhY2NvdW50LCBzeW1ib2wgfSk7CiAgY29uc3QgdG9rZW4gPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgndG9rZW5zJywgeyBzeW1ib2wgfSk7CgogIGlmIChhcGkuYXNzZXJ0KGJhbGFuY2UgIT09IG51bGwsICdiYWxhbmNlIGRvZXMgbm90IGV4aXN0JykKICAgICYmIGFwaS5hc3NlcnQoYXBpLkJpZ051bWJlcihiYWxhbmNlLnBlbmRpbmdVbnN0YWtlKS5ndGUocXVhbnRpdHlMZWZ0KSwgJ292ZXJkcmF3biBwZW5kaW5nVW5zdGFrZScpKSB7CiAgICBjb25zdCBvcmlnaW5hbFN0YWtlID0gYmFsYW5jZS5zdGFrZTsKICAgIGNvbnN0IG9yaWdpbmFsUGVuZGluZ1N0YWtlID0gYmFsYW5jZS5wZW5kaW5nVW5zdGFrZTsKCiAgICBiYWxhbmNlLnN0YWtlID0gY2FsY3VsYXRlQmFsYW5jZVZUd28oCiAgICAgIGJhbGFuY2Uuc3Rha2UsIHF1YW50aXR5TGVmdCwgdG9rZW4ucHJlY2lzaW9uLCB0cnVlLAogICAgKTsKICAgIGJhbGFuY2UucGVuZGluZ1Vuc3Rha2UgPSBjYWxjdWxhdGVCYWxhbmNlVlR3bygKICAgICAgYmFsYW5jZS5wZW5kaW5nVW5zdGFrZSwgcXVhbnRpdHlMZWZ0LCB0b2tlbi5wcmVjaXNpb24sIGZhbHNlLAogICAgKTsKCiAgICBpZiAoYXBpLmFzc2VydChhcGkuQmlnTnVtYmVyKGJhbGFuY2UucGVuZGluZ1Vuc3Rha2UpLmx0KG9yaWdpbmFsUGVuZGluZ1N0YWtlKQogICAgICAmJiBhcGkuQmlnTnVtYmVyKGJhbGFuY2Uuc3Rha2UpLmd0KG9yaWdpbmFsU3Rha2UpLCAnY2Fubm90IHN1YnRyYWN0JykpIHsKICAgICAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgnYmFsYW5jZXMnLCBiYWxhbmNlKTsKCiAgICAgIGFwaS5lbWl0KCd1bnN0YWtlJywgeyBhY2NvdW50LCBzeW1ib2wsIHF1YW50aXR5OiBxdWFudGl0eUxlZnQgfSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH0KCiAgcmV0dXJuIGZhbHNlOwp9OwoKYWN0aW9ucy5jYW5jZWxVbnN0YWtlID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBjb25zdCB7IHR4SUQsIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSB9ID0gcGF5bG9hZDsKCiAgaWYgKGFwaS5hc3NlcnQoaXNTaWduZWRXaXRoQWN0aXZlS2V5ID09PSB0cnVlLCAneW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5JykKICAgICAgJiYgYXBpLmFzc2VydCh0eElEICYmIHR5cGVvZiB0eElEID09PSAnc3RyaW5nJywgJ2ludmFsaWQgcGFyYW1zJykpIHsKICAgIC8vIGdldCB1bnN0YWtlCiAgICBjb25zdCB1bnN0YWtlID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ3BlbmRpbmdVbnN0YWtlcycsIHsgYWNjb3VudDogYXBpLnNlbmRlciwgdHhJRCB9KTsKCiAgICBpZiAoYXBpLmFzc2VydCh1bnN0YWtlLCAndW5zdGFrZSBkb2VzIG5vdCBleGlzdCcpKSB7CiAgICAgIGlmIChhd2FpdCBwcm9jZXNzQ2FuY2VsVW5zdGFrZSh1bnN0YWtlKSkgewogICAgICAgIGF3YWl0IGFwaS5kYi5yZW1vdmUoJ3BlbmRpbmdVbnN0YWtlcycsIHVuc3Rha2UpOwogICAgICB9CiAgICB9CiAgfQp9OwoKY29uc3QgYWRkU3Rha2UgPSBhc3luYyAoYWNjb3VudCwgdG9rZW4sIHF1YW50aXR5KSA9PiB7CiAgY29uc3QgYmFsYW5jZSA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdiYWxhbmNlcycsIHsgYWNjb3VudCwgc3ltYm9sOiB0b2tlbi5zeW1ib2wgfSk7CgogIGNvbnN0IG9yaWdpbmFsU3Rha2UgPSBiYWxhbmNlLnN0YWtlOwoKICBiYWxhbmNlLnN0YWtlID0gY2FsY3VsYXRlQmFsYW5jZVZUd28oYmFsYW5jZS5zdGFrZSwgcXVhbnRpdHksIHRva2VuLnByZWNpc2lvbiwgdHJ1ZSk7CiAgaWYgKGFwaS5hc3NlcnQoYXBpLkJpZ051bWJlcihiYWxhbmNlLnN0YWtlKS5ndChvcmlnaW5hbFN0YWtlKSwgJ2Nhbm5vdCBhZGQnKSkgewogICAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgnYmFsYW5jZXMnLCBiYWxhbmNlKTsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgcmV0dXJuIGZhbHNlOwp9OwoKY29uc3Qgc3ViU3Rha2UgPSBhc3luYyAoYWNjb3VudCwgdG9rZW4sIHF1YW50aXR5KSA9PiB7CiAgY29uc3QgYmFsYW5jZSA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdiYWxhbmNlcycsIHsgYWNjb3VudCwgc3ltYm9sOiB0b2tlbi5zeW1ib2wgfSk7CgogIGlmIChhcGkuYXNzZXJ0KGJhbGFuY2UgIT09IG51bGwsICdiYWxhbmNlIGRvZXMgbm90IGV4aXN0JykKICAgICYmIGFwaS5hc3NlcnQoYXBpLkJpZ051bWJlcihiYWxhbmNlLnN0YWtlKS5ndGUocXVhbnRpdHkpLCAnb3ZlcmRyYXduIHN0YWtlJykpIHsKICAgIGNvbnN0IG9yaWdpbmFsU3Rha2UgPSBiYWxhbmNlLnN0YWtlOwogICAgY29uc3Qgb3JpZ2luYWxQZW5kaW5nU3Rha2UgPSBiYWxhbmNlLnBlbmRpbmdVbnN0YWtlOwoKICAgIGJhbGFuY2Uuc3Rha2UgPSBjYWxjdWxhdGVCYWxhbmNlVlR3byhiYWxhbmNlLnN0YWtlLCBxdWFudGl0eSwgdG9rZW4ucHJlY2lzaW9uLCBmYWxzZSk7CiAgICBiYWxhbmNlLnBlbmRpbmdVbnN0YWtlID0gY2FsY3VsYXRlQmFsYW5jZVZUd28oCiAgICAgIGJhbGFuY2UucGVuZGluZ1Vuc3Rha2UsIHF1YW50aXR5LCB0b2tlbi5wcmVjaXNpb24sIHRydWUsCiAgICApOwoKICAgIGlmIChhcGkuYXNzZXJ0KGFwaS5CaWdOdW1iZXIoYmFsYW5jZS5zdGFrZSkubHQob3JpZ2luYWxTdGFrZSkKICAgICAgJiYgYXBpLkJpZ051bWJlcihiYWxhbmNlLnBlbmRpbmdVbnN0YWtlKS5ndChvcmlnaW5hbFBlbmRpbmdTdGFrZSksICdjYW5ub3Qgc3VidHJhY3QnKSkgewogICAgICBhd2FpdCBhcGkuZGIudXBkYXRlKCdiYWxhbmNlcycsIGJhbGFuY2UpOwoKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgfQoKICByZXR1cm4gZmFsc2U7Cn07Cgpjb25zdCBzdWJCYWxhbmNlVk9uZSA9IGFzeW5jIChhY2NvdW50LCB0b2tlbiwgcXVhbnRpdHksIHRhYmxlKSA9PiB7CiAgY29uc3QgYmFsYW5jZSA9IGF3YWl0IGFwaS5kYi5maW5kT25lKHRhYmxlLCB7IGFjY291bnQsIHN5bWJvbDogdG9rZW4uc3ltYm9sIH0pOwogIGlmIChhcGkuYXNzZXJ0KGJhbGFuY2UgIT09IG51bGwsICdiYWxhbmNlIGRvZXMgbm90IGV4aXN0JykgCiAgICAmJiBhcGkuYXNzZXJ0KGJhbGFuY2UuYmFsYW5jZSA+PSBxdWFudGl0eSwgJ292ZXJkcmF3biBiYWxhbmNlJykpIHsKICAgIGNvbnN0IG9yaWdpbmFsQmFsYW5jZSA9IGJhbGFuY2UuYmFsYW5jZTsKCiAgICBiYWxhbmNlLmJhbGFuY2UgPSBjYWxjdWxhdGVCYWxhbmNlVk9uZShiYWxhbmNlLmJhbGFuY2UsIHF1YW50aXR5LCB0b2tlbi5wcmVjaXNpb24sIGZhbHNlKTsKCiAgICBpZiAoYXBpLmFzc2VydChiYWxhbmNlLmJhbGFuY2UgPCBvcmlnaW5hbEJhbGFuY2UsICdjYW5ub3Qgc3VidHJhY3QnKSkgewogICAgICBhd2FpdCBhcGkuZGIudXBkYXRlKHRhYmxlLCBiYWxhbmNlKTsKCiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH0KCiAgcmV0dXJuIGZhbHNlOwp9OwoKY29uc3Qgc3ViQmFsYW5jZVZUd28gPSBhc3luYyAoYWNjb3VudCwgdG9rZW4sIHF1YW50aXR5LCB0YWJsZSkgPT4gewogIGNvbnN0IGJhbGFuY2UgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSh0YWJsZSwgeyBhY2NvdW50LCBzeW1ib2w6IHRva2VuLnN5bWJvbCB9KTsKCiAgaWYgKGFwaS5hc3NlcnQoYmFsYW5jZSAhPT0gbnVsbCwgJ2JhbGFuY2UgZG9lcyBub3QgZXhpc3QnKQogICAgJiYgYXBpLmFzc2VydChhcGkuQmlnTnVtYmVyKGJhbGFuY2UuYmFsYW5jZSkuZ3RlKHF1YW50aXR5KSwgJ292ZXJkcmF3biBiYWxhbmNlJykpIHsKICAgIGNvbnN0IG9yaWdpbmFsQmFsYW5jZSA9IGJhbGFuY2UuYmFsYW5jZTsKCiAgICBiYWxhbmNlLmJhbGFuY2UgPSBjYWxjdWxhdGVCYWxhbmNlVlR3byhiYWxhbmNlLmJhbGFuY2UsIHF1YW50aXR5LCB0b2tlbi5wcmVjaXNpb24sIGZhbHNlKTsKCiAgICBpZiAoYXBpLmFzc2VydChhcGkuQmlnTnVtYmVyKGJhbGFuY2UuYmFsYW5jZSkubHQob3JpZ2luYWxCYWxhbmNlKSwgJ2Nhbm5vdCBzdWJ0cmFjdCcpKSB7CiAgICAgIGF3YWl0IGFwaS5kYi51cGRhdGUodGFibGUsIGJhbGFuY2UpOwoKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgfQoKICByZXR1cm4gZmFsc2U7Cn07Cgpjb25zdCBhZGRCYWxhbmNlVk9uZSA9IGFzeW5jIChhY2NvdW50LCB0b2tlbiwgcXVhbnRpdHksIHRhYmxlKSA9PiB7CiAgbGV0IGJhbGFuY2UgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSh0YWJsZSwgeyBhY2NvdW50LCBzeW1ib2w6IHRva2VuLnN5bWJvbCB9KTsKICBpZiAoYmFsYW5jZSA9PT0gbnVsbCkgewogICAgYmFsYW5jZSA9IHsKICAgICAgYWNjb3VudCwKICAgICAgc3ltYm9sOiB0b2tlbi5zeW1ib2wsCiAgICAgIGJhbGFuY2U6IHF1YW50aXR5CiAgICB9OwoKICAgIGF3YWl0IGFwaS5kYi5pbnNlcnQodGFibGUsIGJhbGFuY2UpOwoKICAgIHJldHVybiB0cnVlOwogIH0KICBjb25zdCBvcmlnaW5hbEJhbGFuY2UgPSBiYWxhbmNlLmJhbGFuY2U7CgogIGJhbGFuY2UuYmFsYW5jZSA9IGNhbGN1bGF0ZUJhbGFuY2VWT25lKGJhbGFuY2UuYmFsYW5jZSwgcXVhbnRpdHksIHRva2VuLnByZWNpc2lvbiwgdHJ1ZSk7CiAgaWYgKGFwaS5hc3NlcnQoYmFsYW5jZS5iYWxhbmNlID4gb3JpZ2luYWxCYWxhbmNlLCAnY2Fubm90IGFkZCcpKSB7CiAgICBhd2FpdCBhcGkuZGIudXBkYXRlKHRhYmxlLCBiYWxhbmNlKTsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgcmV0dXJuIGZhbHNlOwp9OwoKY29uc3QgYWRkQmFsYW5jZVZUd28gPSBhc3luYyAoYWNjb3VudCwgdG9rZW4sIHF1YW50aXR5LCB0YWJsZSkgPT4gewogIGxldCBiYWxhbmNlID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUodGFibGUsIHsgYWNjb3VudCwgc3ltYm9sOiB0b2tlbi5zeW1ib2wgfSk7CiAgaWYgKGJhbGFuY2UgPT09IG51bGwpIHsKICAgIGJhbGFuY2UgPSB7CiAgICAgIGFjY291bnQsCiAgICAgIHN5bWJvbDogdG9rZW4uc3ltYm9sLAogICAgICBiYWxhbmNlOiBxdWFudGl0eSwKICAgICAgc3Rha2U6ICcwJywKICAgICAgZGVsZWdhdGVkU3Rha2U6ICcwJywKICAgICAgcmVjZWl2ZWRTdGFrZTogJzAnLAogICAgICBwZW5kaW5nVW5zdGFrZTogJzAnLAogICAgICB2b3RpbmdQb3dlcjogJzEwMCcsCiAgICAgIGxhc3RWb3RlVGltZTogMCwKICAgIH07CgogICAgYXdhaXQgYXBpLmRiLmluc2VydCh0YWJsZSwgYmFsYW5jZSk7CgogICAgcmV0dXJuIHRydWU7CiAgfQoKICBjb25zdCBvcmlnaW5hbEJhbGFuY2UgPSBiYWxhbmNlLmJhbGFuY2U7CgogIGJhbGFuY2UuYmFsYW5jZSA9IGNhbGN1bGF0ZUJhbGFuY2VWVHdvKGJhbGFuY2UuYmFsYW5jZSwgcXVhbnRpdHksIHRva2VuLnByZWNpc2lvbiwgdHJ1ZSk7CiAgaWYgKGFwaS5hc3NlcnQoYXBpLkJpZ051bWJlcihiYWxhbmNlLmJhbGFuY2UpLmd0KG9yaWdpbmFsQmFsYW5jZSksICdjYW5ub3QgYWRkJykpIHsKICAgIGF3YWl0IGFwaS5kYi51cGRhdGUodGFibGUsIGJhbGFuY2UpOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICByZXR1cm4gZmFsc2U7Cn07Cgpjb25zdCBjYWxjdWxhdGVCYWxhbmNlVk9uZSA9IChiYWxhbmNlLCBxdWFudGl0eSwgcHJlY2lzaW9uLCBhZGQpID0+IHsKICBpZiAocHJlY2lzaW9uID09PSAwKSB7CiAgICByZXR1cm4gYWRkID8gYmFsYW5jZSArIHF1YW50aXR5IDogYmFsYW5jZSAtIHF1YW50aXR5OwogIH0KCiAgcmV0dXJuIGFkZAogICAgPyBhcGkuQmlnTnVtYmVyKGJhbGFuY2UpLnBsdXMocXVhbnRpdHkpLnRvTnVtYmVyKCkKICAgIDogYXBpLkJpZ051bWJlcihiYWxhbmNlKS5taW51cyhxdWFudGl0eSkudG9OdW1iZXIoKTsKfTsKCmNvbnN0IGNhbGN1bGF0ZUJhbGFuY2VWVHdvID0gKGJhbGFuY2UsIHF1YW50aXR5LCBwcmVjaXNpb24sIGFkZCkgPT4gewogIHJldHVybiBhZGQKICAgID8gYXBpLkJpZ051bWJlcihiYWxhbmNlKS5wbHVzKHF1YW50aXR5KS50b0ZpeGVkKHByZWNpc2lvbikKICAgIDogYXBpLkJpZ051bWJlcihiYWxhbmNlKS5taW51cyhxdWFudGl0eSkudG9GaXhlZChwcmVjaXNpb24pOwp9OwoKY29uc3QgY2FsY3VsYXRlVm90aW5nUG93ZXIgPSAoYmFsYW5jZSwgbmJEYXlzMTAwUGVyY2VudFJlZ2VuZXJhdGlvbiwgbm93VGltZVNlYykgPT4gewogIGlmIChiYWxhbmNlLmxhc3RWb3RlVGltZSA9PT0gMCB8fCBhcGkuQmlnTnVtYmVyKGJhbGFuY2Uudm90aW5nUG93ZXIpLmVxKDEwMCkpIHsKICAgIHJldHVybiBiYWxhbmNlLnZvdGluZ1Bvd2VyOwogIH0KCiAgY29uc3Qgc2Vjb25kc2FnbyA9IG5vd1RpbWVTZWMgLSBiYWxhbmNlLmxhc3RWb3RlVGltZTsKICBjb25zdCBuYkRheXMxMDBQZXJjZW50UmVnZW5lcmF0aW9uU2VjcyA9IG5iRGF5czEwMFBlcmNlbnRSZWdlbmVyYXRpb24gKiAyNCAqIDYwICogNjA7CiAgY29uc3QgcmVnZW5lcmF0ZWRQb3dlciA9IGFwaS5CaWdOdW1iZXIoMTAwKQogICAgLmRpdmlkZWRCeShuYkRheXMxMDBQZXJjZW50UmVnZW5lcmF0aW9uU2VjcykKICAgIC5tdWx0aXBsaWVkQnkoc2Vjb25kc2FnbykKICAgIC50b0ZpeGVkKDIpOwoKICBjb25zdCBuZXdWb3RpbmdQb3dlciA9IGFwaS5CaWdOdW1iZXIoYmFsYW5jZS52b3RpbmdQb3dlcikKICAgIC5wbHVzKHJlZ2VuZXJhdGVkUG93ZXIpCiAgICAudG9GaXhlZCgyKTsKCiAgcmV0dXJuIGFwaS5CaWdOdW1iZXIobmV3Vm90aW5nUG93ZXIpLmd0KDEwMCkgPyAnMTAwLjAwJyA6IG5ld1ZvdGluZ1Bvd2VyOwp9OwoKY29uc3QgY291bnREZWNpbWFscyA9IHZhbHVlID0+IGFwaS5CaWdOdW1iZXIodmFsdWUpLmRwKCk7Cg=="
}
}
}

{
"id": "ssc-00000000000000000002",
"json": {
"contractName": "contract",
"contractAction": "deploy",
"contractPayload": {
"name": "test",
"params": "",
"code": "YWN0aW9ucy5jcmVhdGVTU0MgPSBhc3luYyAocGF5bG9hZCkgPT4gewogICAgICAgICAgYXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKCd0ZXN0VXBkYXRlVGFibGUnKTsKICAgICAgICB9"
}
}
}

{
"id": "ssc-testnet1",
"json": {
"contractName": "contract",
"contractAction": "update",
"contractPayload": {
"name": "tokens",
"params": "",
"code": "YWN0aW9ucy5jcmVhdGVTU0M9KGFzeW5jKCk9PntsZXQgYT1hd2FpdCBhcGkuZGIudGFibGVFeGlzdHMoInRva2VucyIpO2lmKCExPT09YSl7YXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKCJ0b2tlbnMiLFsic3ltYm9sIl0pLGF3YWl0IGFwaS5kYi5jcmVhdGVUYWJsZSgiYmFsYW5jZXMiLFsiYWNjb3VudCJdKSxhd2FpdCBhcGkuZGIuY3JlYXRlVGFibGUoImNvbnRyYWN0c0JhbGFuY2VzIixbImFjY291bnQiXSksYXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKCJwYXJhbXMiKTtjb25zdCBhPXt0b2tlbkNyZWF0aW9uRmVlOiIwIn07YXdhaXQgYXBpLmRiLmluc2VydCgicGFyYW1zIixhKX1lbHNle2NvbnN0IGE9YXdhaXQgYXBpLmRiLmZpbmRPbmUoInBhcmFtcyIse30pO2EuZW5hYmxlRGVsZWdhdGlvbkZlZT0iMTAwMCIsYS5lbmFibGVTdGFraW5nRmVlPSIxMDAwIixhd2FpdCBhcGkuZGIudXBkYXRlKCJwYXJhbXMiLGEpfSExPT09KGE9YXdhaXQgYXBpLmRiLnRhYmxlRXhpc3RzKCJwZW5kaW5nVW5zdGFrZXMiKSkmJmF3YWl0IGFwaS5kYi5jcmVhdGVUYWJsZSgicGVuZGluZ1Vuc3Rha2VzIixbImFjY291bnQiLCJ1bnN0YWtlQ29tcGxldGVUaW1lc3RhbXAiXSksITE9PT0oYT1hd2FpdCBhcGkuZGIudGFibGVFeGlzdHMoImRlbGVnYXRpb25zIikpJiYoYXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKCJkZWxlZ2F0aW9ucyIsWyJmcm9tIiwidG8iXSksYXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKCJwZW5kaW5nVW5kZWxlZ2F0aW9ucyIsWyJhY2NvdW50IiwiY29tcGxldGVUaW1lc3RhbXAiXSkpO2xldCBlPWF3YWl0IGFwaS5kYi5maW5kT25lKCJ0b2tlbnMiLHtzeW1ib2w6IlNURUVNUCJ9KTtlJiZlLnByZWNpc2lvbjw4JiYoZS5wcmVjaXNpb249OCxhd2FpdCBhcGkuZGIudXBkYXRlKCJ0b2tlbnMiLGUpKSx2b2lkIDAhPT0oZT1hd2FpdCBhcGkuZGIuZmluZE9uZSgidG9rZW5zIix7c3ltYm9sOiJTU0MifSkpLnN0YWtpbmdFbmFibGVkJiYhMSE9PWUuc3Rha2luZ0VuYWJsZWR8fChlLnN0YWtpbmdFbmFibGVkPSEwLGUudG90YWxTdGFrZWQ9IjAiLGUudW5zdGFraW5nQ29vbGRvd249NDAsZS5udW1iZXJUcmFuc2FjdGlvbnM9NCxlLmRlbGVnYXRpb25FbmFibGVkPSEwLGUudW5kZWxlZ2F0aW9uQ29vbGRvd249Nyxhd2FpdCBhcGkuZGIudXBkYXRlKCJ0b2tlbnMiLGUpKX0pO2NvbnN0IGJhbGFuY2VUZW1wbGF0ZT17YWNjb3VudDpudWxsLHN5bWJvbDpudWxsLGJhbGFuY2U6IjAiLHN0YWtlOiIwIixwZW5kaW5nVW5zdGFrZToiMCIsZGVsZWdhdGlvbnNJbjoiMCIsZGVsZWdhdGlvbnNPdXQ6IjAiLHBlbmRpbmdVbmRlbGVnYXRpb25zOiIwIn0sY2FsY3VsYXRlQmFsYW5jZT0oYSxlLHQsaSk9Pmk/YXBpLkJpZ051bWJlcihhKS5wbHVzKGUpLnRvRml4ZWQodCk6YXBpLkJpZ051bWJlcihhKS5taW51cyhlKS50b0ZpeGVkKHQpLGNvdW50RGVjaW1hbHM9YT0+YXBpLkJpZ051bWJlcihhKS5kcCgpLGFkZFN0YWtlPWFzeW5jKGEsZSx0KT0+e2xldCBpPWF3YWl0IGFwaS5kYi5maW5kT25lKCJiYWxhbmNlcyIse2FjY291bnQ6YSxzeW1ib2w6ZS5zeW1ib2x9KTtudWxsPT09aSYmKChpPWJhbGFuY2VUZW1wbGF0ZSkuYWNjb3VudD1hLGkuc3ltYm9sPWUuc3ltYm9sLGk9YXdhaXQgYXBpLmRiLmluc2VydCgiYmFsYW5jZXMiLGkpKSx2b2lkIDA9PT1pLnN0YWtlJiYoaS5zdGFrZT0iMCIsaS5wZW5kaW5nVW5zdGFrZT0iMCIpO2NvbnN0IHM9aS5zdGFrZTtyZXR1cm4gaS5zdGFrZT1jYWxjdWxhdGVCYWxhbmNlKGkuc3Rha2UsdCxlLnByZWNpc2lvbiwhMCksISFhcGkuYXNzZXJ0KGFwaS5CaWdOdW1iZXIoaS5zdGFrZSkuZ3QocyksImNhbm5vdCBhZGQiKSYmKGF3YWl0IGFwaS5kYi51cGRhdGUoImJhbGFuY2VzIixpKSx2b2lkIDA9PT1lLnRvdGFsU3Rha2VkJiYoZS50b3RhbFN0YWtlZD0iMCIpLGUudG90YWxTdGFrZWQ9Y2FsY3VsYXRlQmFsYW5jZShlLnRvdGFsU3Rha2VkLHQsZS5wcmVjaXNpb24sITApLGF3YWl0IGFwaS5kYi51cGRhdGUoInRva2VucyIsZSksITApfSxzdWJTdGFrZT1hc3luYyhhLGUsdCk9Pntjb25zdCBpPWF3YWl0IGFwaS5kYi5maW5kT25lKCJiYWxhbmNlcyIse2FjY291bnQ6YSxzeW1ib2w6ZS5zeW1ib2x9KTtpZihhcGkuYXNzZXJ0KG51bGwhPT1pLCJiYWxhbmNlIGRvZXMgbm90IGV4aXN0IikmJmFwaS5hc3NlcnQoYXBpLkJpZ051bWJlcihpLnN0YWtlKS5ndGUodCksIm92ZXJkcmF3biBzdGFrZSIpKXtjb25zdCBhPWkuc3Rha2Uscz1pLnBlbmRpbmdVbnN0YWtlO2lmKGkuc3Rha2U9Y2FsY3VsYXRlQmFsYW5jZShpLnN0YWtlLHQsZS5wcmVjaXNpb24sITEpLGkucGVuZGluZ1Vuc3Rha2U9Y2FsY3VsYXRlQmFsYW5jZShpLnBlbmRpbmdVbnN0YWtlLHQsZS5wcmVjaXNpb24sITApLGFwaS5hc3NlcnQoYXBpLkJpZ051bWJlcihpLnN0YWtlKS5sdChhKSYmYXBpLkJpZ051bWJlcihpLnBlbmRpbmdVbnN0YWtlKS5ndChzKSwiY2Fubm90IHN1YnRyYWN0IikpcmV0dXJuIGF3YWl0IGFwaS5kYi51cGRhdGUoImJhbGFuY2VzIixpKSwhMH1yZXR1cm4hMX0sc3ViQmFsYW5jZT1hc3luYyhhLGUsdCxpKT0+e2NvbnN0IHM9YXdhaXQgYXBpLmRiLmZpbmRPbmUoaSx7YWNjb3VudDphLHN5bWJvbDplLnN5bWJvbH0pO2lmKGFwaS5hc3NlcnQobnVsbCE9PXMsImJhbGFuY2UgZG9lcyBub3QgZXhpc3QiKSYmYXBpLmFzc2VydChhcGkuQmlnTnVtYmVyKHMuYmFsYW5jZSkuZ3RlKHQpLCJvdmVyZHJhd24gYmFsYW5jZSIpKXtjb25zdCBhPXMuYmFsYW5jZTtpZihzLmJhbGFuY2U9Y2FsY3VsYXRlQmFsYW5jZShzLmJhbGFuY2UsdCxlLnByZWNpc2lvbiwhMSksYXBpLmFzc2VydChhcGkuQmlnTnVtYmVyKHMuYmFsYW5jZSkubHQoYSksImNhbm5vdCBzdWJ0cmFjdCIpKXJldHVybiBhd2FpdCBhcGkuZGIudXBkYXRlKGkscyksITB9cmV0dXJuITF9LGFkZEJhbGFuY2U9YXN5bmMoYSxlLHQsaSk9PntsZXQgcz1hd2FpdCBhcGkuZGIuZmluZE9uZShpLHthY2NvdW50OmEsc3ltYm9sOmUuc3ltYm9sfSk7aWYobnVsbD09PXMpcmV0dXJuKHM9YmFsYW5jZVRlbXBsYXRlKS5hY2NvdW50PWEscy5zeW1ib2w9ZS5zeW1ib2wscy5iYWxhbmNlPXQsYXdhaXQgYXBpLmRiLmluc2VydChpLHMpLCEwO2NvbnN0IG49cy5iYWxhbmNlO3JldHVybiBzLmJhbGFuY2U9Y2FsY3VsYXRlQmFsYW5jZShzLmJhbGFuY2UsdCxlLnByZWNpc2lvbiwhMCksISFhcGkuYXNzZXJ0KGFwaS5CaWdOdW1iZXIocy5iYWxhbmNlKS5ndChuKSwiY2Fubm90IGFkZCIpJiYoYXdhaXQgYXBpLmRiLnVwZGF0ZShpLHMpLCEwKX07YWN0aW9ucy51cGRhdGVQYXJhbXM9KGFzeW5jIGE9PntpZihhcGkuc2VuZGVyIT09YXBpLm93bmVyKXJldHVybjtjb25zdHt0b2tlbkNyZWF0aW9uRmVlOmV9PWEsdD1hd2FpdCBhcGkuZGIuZmluZE9uZSgicGFyYW1zIix7fSk7dC50b2tlbkNyZWF0aW9uRmVlPWUsYXdhaXQgYXBpLmRiLnVwZGF0ZSgicGFyYW1zIix0KX0pLGFjdGlvbnMudXBkYXRlVXJsPShhc3luYyBhPT57Y29uc3R7dXJsOmUsc3ltYm9sOnR9PWE7aWYoYXBpLmFzc2VydCh0JiYic3RyaW5nIj09dHlwZW9mIHQmJmUmJiJzdHJpbmciPT10eXBlb2YgZSwiaW52YWxpZCBwYXJhbXMiKSYmYXBpLmFzc2VydChlLmxlbmd0aDw9MjU1LCJpbnZhbGlkIHVybDogbWF4IGxlbmd0aCBvZiAyNTUiKSl7Y29uc3QgYT1hd2FpdCBhcGkuZGIuZmluZE9uZSgidG9rZW5zIix7c3ltYm9sOnR9KTtpZihhJiZhcGkuYXNzZXJ0KGEuaXNzdWVyPT09YXBpLnNlbmRlciwibXVzdCBiZSB0aGUgaXNzdWVyIikpdHJ5e2NvbnN0IHQ9SlNPTi5wYXJzZShhLm1ldGFkYXRhKTthcGkuYXNzZXJ0KHQmJnQudXJsLCJhbiBlcnJvciBvY2N1cmVkIHdoZW4gdHJ5aW5nIHRvIHVwZGF0ZSB0aGUgdXJsIikmJih0LnVybD1lLGEubWV0YWRhdGE9SlNPTi5zdHJpbmdpZnkodCksYXdhaXQgYXBpLmRiLnVwZGF0ZSgidG9rZW5zIixhKSl9Y2F0Y2goYSl7fX19KSxhY3Rpb25zLnVwZGF0ZU1ldGFkYXRhPShhc3luYyBhPT57Y29uc3R7bWV0YWRhdGE6ZSxzeW1ib2w6dH09YTtpZihhcGkuYXNzZXJ0KHQmJiJzdHJpbmciPT10eXBlb2YgdCYmZSYmIm9iamVjdCI9PXR5cGVvZiBlLCJpbnZhbGlkIHBhcmFtcyIpKXtjb25zdCBhPWF3YWl0IGFwaS5kYi5maW5kT25lKCJ0b2tlbnMiLHtzeW1ib2w6dH0pO2lmKGEmJmFwaS5hc3NlcnQoYS5pc3N1ZXI9PT1hcGkuc2VuZGVyLCJtdXN0IGJlIHRoZSBpc3N1ZXIiKSl0cnl7Y29uc3QgdD1KU09OLnN0cmluZ2lmeShlKTthcGkuYXNzZXJ0KHQubGVuZ3RoPD0xZTMsImludmFsaWQgbWV0YWRhdGE6IG1heCBsZW5ndGggb2YgMTAwMCIpJiYoYS5tZXRhZGF0YT10LGF3YWl0IGFwaS5kYi51cGRhdGUoInRva2VucyIsYSkpfWNhdGNoKGEpe319fSksYWN0aW9ucy51cGRhdGVQcmVjaXNpb249KGFzeW5jIGE9Pntjb25zdHtzeW1ib2w6ZSxwcmVjaXNpb246dCxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6aX09YTtpZihhcGkuYXNzZXJ0KCEwPT09aSwieW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJmFwaS5hc3NlcnQoZSYmInN0cmluZyI9PXR5cGVvZiBlKSYmYXBpLmFzc2VydCh0PjAmJnQ8PTgmJk51bWJlci5pc0ludGVnZXIodCksImludmFsaWQgcHJlY2lzaW9uIikpe2NvbnN0IGE9YXdhaXQgYXBpLmRiLmZpbmRPbmUoInRva2VucyIse3N5bWJvbDplfSk7YSYmYXBpLmFzc2VydChhLmlzc3Vlcj09PWFwaS5zZW5kZXIsIm11c3QgYmUgdGhlIGlzc3VlciIpJiZhcGkuYXNzZXJ0KHQ+YS5wcmVjaXNpb24sInByZWNpc2lvbiBjYW4gb25seSBiZSBpbmNyZWFzZWQiKSYmKGEucHJlY2lzaW9uPXQsYXdhaXQgYXBpLmRiLnVwZGF0ZSgidG9rZW5zIixhKSl9fSksYWN0aW9ucy50cmFuc2Zlck93bmVyc2hpcD0oYXN5bmMgYT0+e2NvbnN0e3N5bWJvbDplLHRvOnQsaXNTaWduZWRXaXRoQWN0aXZlS2V5Oml9PWE7aWYoYXBpLmFzc2VydCghMD09PWksInlvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleSIpJiZhcGkuYXNzZXJ0KGUmJiJzdHJpbmciPT10eXBlb2YgZSYmdCYmInN0cmluZyI9PXR5cGVvZiB0LCJpbnZhbGlkIHBhcmFtcyIpKXtjb25zdCBhPWF3YWl0IGFwaS5kYi5maW5kT25lKCJ0b2tlbnMiLHtzeW1ib2w6ZX0pO2lmKGEmJmFwaS5hc3NlcnQoYS5pc3N1ZXI9PT1hcGkuc2VuZGVyLCJtdXN0IGJlIHRoZSBpc3N1ZXIiKSl7Y29uc3QgZT10LnRyaW0oKTthcGkuYXNzZXJ0KGFwaS5pc1ZhbGlkQWNjb3VudE5hbWUoZSksImludmFsaWQgdG8iKSYmKGEuaXNzdWVyPWUsYXdhaXQgYXBpLmRiLnVwZGF0ZSgidG9rZW5zIixhKSl9fX0pLGFjdGlvbnMuY3JlYXRlPShhc3luYyBhPT57Y29uc3R7bmFtZTplLHN5bWJvbDp0LHVybDppLHByZWNpc2lvbjpzLG1heFN1cHBseTpuLGlzU2lnbmVkV2l0aEFjdGl2ZUtleTpvfT1hLGw9YXdhaXQgYXBpLmRiLmZpbmRPbmUoInBhcmFtcyIse30pLHt0b2tlbkNyZWF0aW9uRmVlOnB9PWwsYz1hd2FpdCBhcGkuZGIuZmluZE9uZSgiYmFsYW5jZXMiLHthY2NvdW50OmFwaS5zZW5kZXIsc3ltYm9sOiJTU0MifSkscj0hIWFwaS5CaWdOdW1iZXIocCkubHRlKDApfHxjJiZhcGkuQmlnTnVtYmVyKGMuYmFsYW5jZSkuZ3RlKHApO2lmKGFwaS5hc3NlcnQociwieW91IG11c3QgaGF2ZSBlbm91Z2ggdG9rZW5zIHRvIGNvdmVyIHRoZSBjcmVhdGlvbiBmZWVzIikmJmFwaS5hc3NlcnQoITA9PT1vLCJ5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXkiKSYmYXBpLmFzc2VydChlJiYic3RyaW5nIj09dHlwZW9mIGUmJnQmJiJzdHJpbmciPT10eXBlb2YgdCYmKHZvaWQgMD09PWl8fGkmJiJzdHJpbmciPT10eXBlb2YgaSkmJihzJiYibnVtYmVyIj09dHlwZW9mIHN8fDA9PT1zKSYmbiYmInN0cmluZyI9PXR5cGVvZiBuJiYhYXBpLkJpZ051bWJlcihuKS5pc05hTigpLCJpbnZhbGlkIHBhcmFtcyIpJiZhcGkuYXNzZXJ0KGFwaS52YWxpZGF0b3IuaXNBbHBoYSh0KSYmYXBpLnZhbGlkYXRvci5pc1VwcGVyY2FzZSh0KSYmdC5sZW5ndGg+MCYmdC5sZW5ndGg8PTEwLCJpbnZhbGlkIHN5bWJvbDogdXBwZXJjYXNlIGxldHRlcnMgb25seSwgbWF4IGxlbmd0aCBvZiAxMCIpJiZhcGkuYXNzZXJ0KGFwaS52YWxpZGF0b3IuaXNBbHBoYW51bWVyaWMoYXBpLnZhbGlkYXRvci5ibGFja2xpc3QoZSwiICIpKSYmZS5sZW5ndGg+MCYmZS5sZW5ndGg8PTUwLCJpbnZhbGlkIG5hbWU6IGxldHRlcnMsIG51bWJlcnMsIHdoaXRlc3BhY2VzIG9ubHksIG1heCBsZW5ndGggb2YgNTAiKSYmYXBpLmFzc2VydCh2b2lkIDA9PT1pfHxpLmxlbmd0aDw9MjU1LCJpbnZhbGlkIHVybDogbWF4IGxlbmd0aCBvZiAyNTUiKSYmYXBpLmFzc2VydChzPj0wJiZzPD04JiZOdW1iZXIuaXNJbnRlZ2VyKHMpLCJpbnZhbGlkIHByZWNpc2lvbiIpJiZhcGkuYXNzZXJ0KGFwaS5CaWdOdW1iZXIobikuZ3QoMCksIm1heFN1cHBseSBtdXN0IGJlIHBvc2l0aXZlIikmJmFwaS5hc3NlcnQoYXBpLkJpZ051bWJlcihuKS5sdGUoTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpLGBtYXhTdXBwbHkgbXVzdCBiZSBsb3dlciB0aGFuICR7TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJ9YCkpe2NvbnN0IGE9YXdhaXQgYXBpLmRiLmZpbmRPbmUoInRva2VucyIse3N5bWJvbDp0fSk7aWYoYXBpLmFzc2VydChudWxsPT09YSwic3ltYm9sIGFscmVhZHkgZXhpc3RzIikpe2xldCBhPXt1cmw6dm9pZCAwPT09aT8iIjppfTthPUpTT04uc3RyaW5naWZ5KGEpO2NvbnN0IGw9e2lzc3VlcjphcGkuc2VuZGVyLHN5bWJvbDp0LG5hbWU6ZSxtZXRhZGF0YTphLHByZWNpc2lvbjpzLG1heFN1cHBseTphcGkuQmlnTnVtYmVyKG4pLnRvRml4ZWQocyksc3VwcGx5OiIwIixjaXJjdWxhdGluZ1N1cHBseToiMCIsc3Rha2luZ0VuYWJsZWQ6ITEsdW5zdGFraW5nQ29vbGRvd246MSxkZWxlZ2F0aW9uRW5hYmxlZDohMSx1bmRlbGVnYXRpb25Db29sZG93bjowfTthd2FpdCBhcGkuZGIuaW5zZXJ0KCJ0b2tlbnMiLGwpLGFwaS5CaWdOdW1iZXIocCkuZ3QoMCkmJmF3YWl0IGFjdGlvbnMudHJhbnNmZXIoe3RvOiJudWxsIixzeW1ib2w6IlNTQyIscXVhbnRpdHk6cCxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6b30pfX19KSxhY3Rpb25zLmlzc3VlPShhc3luYyBhPT57Y29uc3R7dG86ZSxzeW1ib2w6dCxxdWFudGl0eTppLGlzU2lnbmVkV2l0aEFjdGl2ZUtleTpzfT1hO2lmKGFwaS5hc3NlcnQoITA9PT1zLCJ5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXkiKSYmYXBpLmFzc2VydChlJiYic3RyaW5nIj09dHlwZW9mIGUmJnQmJiJzdHJpbmciPT10eXBlb2YgdCYmaSYmInN0cmluZyI9PXR5cGVvZiBpJiYhYXBpLkJpZ051bWJlcihpKS5pc05hTigpLCJpbnZhbGlkIHBhcmFtcyIpKXtjb25zdCBhPWUudHJpbSgpLHM9YXdhaXQgYXBpLmRiLmZpbmRPbmUoInRva2VucyIse3N5bWJvbDp0fSk7aWYoYXBpLmFzc2VydChudWxsIT09cywic3ltYm9sIGRvZXMgbm90IGV4aXN0IikmJmFwaS5hc3NlcnQocy5pc3N1ZXI9PT1hcGkuc2VuZGVyLCJub3QgYWxsb3dlZCB0byBpc3N1ZSB0b2tlbnMiKSYmYXBpLmFzc2VydChjb3VudERlY2ltYWxzKGkpPD1zLnByZWNpc2lvbiwic3ltYm9sIHByZWNpc2lvbiBtaXNtYXRjaCIpJiZhcGkuYXNzZXJ0KGFwaS5CaWdOdW1iZXIoaSkuZ3QoMCksIm11c3QgaXNzdWUgcG9zaXRpdmUgcXVhbnRpdHkiKSYmYXBpLmFzc2VydChhcGkuQmlnTnVtYmVyKHMubWF4U3VwcGx5KS5taW51cyhzLnN1cHBseSkuZ3RlKGkpLCJxdWFudGl0eSBleGNlZWRzIGF2YWlsYWJsZSBzdXBwbHkiKSYmYXBpLmFzc2VydChhcGkuaXNWYWxpZEFjY291bnROYW1lKGEpLCJpbnZhbGlkIHRvIikpe2xldCBlPWF3YWl0IGFkZEJhbGFuY2Uocy5pc3N1ZXIscyxpLCJiYWxhbmNlcyIpOyEwPT09ZSYmYSE9PXMuaXNzdWVyJiZhd2FpdCBzdWJCYWxhbmNlKHMuaXNzdWVyLHMsaSwiYmFsYW5jZXMiKSYmITE9PT0oZT1hd2FpdCBhZGRCYWxhbmNlKGEscyxpLCJiYWxhbmNlcyIpKSYmYXdhaXQgYWRkQmFsYW5jZShzLmlzc3VlcixzLGksImJhbGFuY2VzIiksITA9PT1lJiYocy5zdXBwbHk9Y2FsY3VsYXRlQmFsYW5jZShzLnN1cHBseSxpLHMucHJlY2lzaW9uLCEwKSwibnVsbCIhPT1hJiYocy5jaXJjdWxhdGluZ1N1cHBseT1jYWxjdWxhdGVCYWxhbmNlKHMuY2lyY3VsYXRpbmdTdXBwbHksaSxzLnByZWNpc2lvbiwhMCkpLGF3YWl0IGFwaS5kYi51cGRhdGUoInRva2VucyIscyksYXBpLmVtaXQoInRyYW5zZmVyRnJvbUNvbnRyYWN0Iix7ZnJvbToidG9rZW5zIix0bzphLHN5bWJvbDp0LHF1YW50aXR5Oml9KSl9fX0pLGFjdGlvbnMuaXNzdWVUb0NvbnRyYWN0PShhc3luYyBhPT57Y29uc3R7dG86ZSxzeW1ib2w6dCxxdWFudGl0eTppLGlzU2lnbmVkV2l0aEFjdGl2ZUtleTpzfT1hO2lmKGFwaS5hc3NlcnQoITA9PT1zLCJ5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXkiKSYmYXBpLmFzc2VydChlJiYic3RyaW5nIj09dHlwZW9mIGUmJnQmJiJzdHJpbmciPT10eXBlb2YgdCYmaSYmInN0cmluZyI9PXR5cGVvZiBpJiYhYXBpLkJpZ051bWJlcihpKS5pc05hTigpLCJpbnZhbGlkIHBhcmFtcyIpKXtjb25zdCBhPWUudHJpbSgpLHM9YXdhaXQgYXBpLmRiLmZpbmRPbmUoInRva2VucyIse3N5bWJvbDp0fSk7aWYoYXBpLmFzc2VydChudWxsIT09cywic3ltYm9sIGRvZXMgbm90IGV4aXN0IikmJmFwaS5hc3NlcnQocy5pc3N1ZXI9PT1hcGkuc2VuZGVyLCJub3QgYWxsb3dlZCB0byBpc3N1ZSB0b2tlbnMiKSYmYXBpLmFzc2VydChjb3VudERlY2ltYWxzKGkpPD1zLnByZWNpc2lvbiwic3ltYm9sIHByZWNpc2lvbiBtaXNtYXRjaCIpJiZhcGkuYXNzZXJ0KGFwaS5CaWdOdW1iZXIoaSkuZ3QoMCksIm11c3QgaXNzdWUgcG9zaXRpdmUgcXVhbnRpdHkiKSYmYXBpLmFzc2VydChhcGkuQmlnTnVtYmVyKHMubWF4U3VwcGx5KS5taW51cyhzLnN1cHBseSkuZ3RlKGkpLCJxdWFudGl0eSBleGNlZWRzIGF2YWlsYWJsZSBzdXBwbHkiKSYmYXBpLmFzc2VydChhLmxlbmd0aD49MyYmYS5sZW5ndGg8PTUwLCJpbnZhbGlkIHRvIikpeyEwPT09YXdhaXQgYWRkQmFsYW5jZShhLHMsaSwiY29udHJhY3RzQmFsYW5jZXMiKSYmKHMuc3VwcGx5PWNhbGN1bGF0ZUJhbGFuY2Uocy5zdXBwbHksaSxzLnByZWNpc2lvbiwhMCksIm51bGwiIT09YSYmKHMuY2lyY3VsYXRpbmdTdXBwbHk9Y2FsY3VsYXRlQmFsYW5jZShzLmNpcmN1bGF0aW5nU3VwcGx5LGkscy5wcmVjaXNpb24sITApKSxhd2FpdCBhcGkuZGIudXBkYXRlKCJ0b2tlbnMiLHMpLGFwaS5lbWl0KCJpc3N1ZVRvQ29udHJhY3QiLHtmcm9tOiJ0b2tlbnMiLHRvOmEsc3ltYm9sOnQscXVhbnRpdHk6aX0pKX19fSksYWN0aW9ucy50cmFuc2Zlcj0oYXN5bmMgYT0+e2NvbnN0e3RvOmUsc3ltYm9sOnQscXVhbnRpdHk6aSxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6c309YTtpZihhcGkuYXNzZXJ0KCEwPT09cywieW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJmFwaS5hc3NlcnQoZSYmInN0cmluZyI9PXR5cGVvZiBlJiZ0JiYic3RyaW5nIj09dHlwZW9mIHQmJmkmJiJzdHJpbmciPT10eXBlb2YgaSYmIWFwaS5CaWdOdW1iZXIoaSkuaXNOYU4oKSwiaW52YWxpZCBwYXJhbXMiKSl7Y29uc3QgYT1lLnRyaW0oKTtpZihhcGkuYXNzZXJ0KGEhPT1hcGkuc2VuZGVyLCJjYW5ub3QgdHJhbnNmZXIgdG8gc2VsZiIpJiZhcGkuYXNzZXJ0KGFwaS5pc1ZhbGlkQWNjb3VudE5hbWUoYSksImludmFsaWQgdG8iKSl7Y29uc3QgZT1hd2FpdCBhcGkuZGIuZmluZE9uZSgidG9rZW5zIix7c3ltYm9sOnR9KTtpZihhcGkuYXNzZXJ0KG51bGwhPT1lLCJzeW1ib2wgZG9lcyBub3QgZXhpc3QiKSYmYXBpLmFzc2VydChjb3VudERlY2ltYWxzKGkpPD1lLnByZWNpc2lvbiwic3ltYm9sIHByZWNpc2lvbiBtaXNtYXRjaCIpJiZhcGkuYXNzZXJ0KGFwaS5CaWdOdW1iZXIoaSkuZ3QoMCksIm11c3QgdHJhbnNmZXIgcG9zaXRpdmUgcXVhbnRpdHkiKSYmYXdhaXQgc3ViQmFsYW5jZShhcGkuc2VuZGVyLGUsaSwiYmFsYW5jZXMiKSl7cmV0dXJuITE9PT1hd2FpdCBhZGRCYWxhbmNlKGEsZSxpLCJiYWxhbmNlcyIpPyhhd2FpdCBhZGRCYWxhbmNlKGFwaS5zZW5kZXIsZSxpLCJiYWxhbmNlcyIpLCExKTooIm51bGwiPT09YSYmKGUuY2lyY3VsYXRpbmdTdXBwbHk9Y2FsY3VsYXRlQmFsYW5jZShlLmNpcmN1bGF0aW5nU3VwcGx5LGksZS5wcmVjaXNpb24sITEpLGF3YWl0IGFwaS5kYi51cGRhdGUoInRva2VucyIsZSkpLGFwaS5lbWl0KCJ0cmFuc2ZlciIse2Zyb206YXBpLnNlbmRlcix0bzphLHN5bWJvbDp0LHF1YW50aXR5Oml9KSwhMCl9fX1yZXR1cm4hMX0pLGFjdGlvbnMudHJhbnNmZXJUb0NvbnRyYWN0PShhc3luYyBhPT57Y29uc3R7dG86ZSxzeW1ib2w6dCxxdWFudGl0eTppLGlzU2lnbmVkV2l0aEFjdGl2ZUtleTpzfT1hO2lmKGFwaS5hc3NlcnQoITA9PT1zLCJ5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXkiKSYmYXBpLmFzc2VydChlJiYic3RyaW5nIj09dHlwZW9mIGUmJnQmJiJzdHJpbmciPT10eXBlb2YgdCYmaSYmInN0cmluZyI9PXR5cGVvZiBpJiYhYXBpLkJpZ051bWJlcihpKS5pc05hTigpLCJpbnZhbGlkIHBhcmFtcyIpKXtjb25zdCBhPWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7aWYoYXBpLmFzc2VydChhIT09YXBpLnNlbmRlciwiY2Fubm90IHRyYW5zZmVyIHRvIHNlbGYiKSYmYXBpLmFzc2VydChhLmxlbmd0aD49MyYmYS5sZW5ndGg8PTUwLCJpbnZhbGlkIHRvIikpe2NvbnN0IGU9YXdhaXQgYXBpLmRiLmZpbmRPbmUoInRva2VucyIse3N5bWJvbDp0fSk7aWYoYXBpLmFzc2VydChudWxsIT09ZSwic3ltYm9sIGRvZXMgbm90IGV4aXN0IikmJmFwaS5hc3NlcnQoY291bnREZWNpbWFscyhpKTw9ZS5wcmVjaXNpb24sInN5bWJvbCBwcmVjaXNpb24gbWlzbWF0Y2giKSYmYXBpLmFzc2VydChhcGkuQmlnTnVtYmVyKGkpLmd0KDApLCJtdXN0IHRyYW5zZmVyIHBvc2l0aXZlIHF1YW50aXR5IikmJmF3YWl0IHN1YkJhbGFuY2UoYXBpLnNlbmRlcixlLGksImJhbGFuY2VzIikpeyExPT09YXdhaXQgYWRkQmFsYW5jZShhLGUsaSwiY29udHJhY3RzQmFsYW5jZXMiKT9hd2FpdCBhZGRCYWxhbmNlKGFwaS5zZW5kZXIsZSxpLCJiYWxhbmNlcyIpOigibnVsbCI9PT1hJiYoZS5jaXJjdWxhdGluZ1N1cHBseT1jYWxjdWxhdGVCYWxhbmNlKGUuY2lyY3VsYXRpbmdTdXBwbHksaSxlLnByZWNpc2lvbiwhMSksYXdhaXQgYXBpLmRiLnVwZGF0ZSgidG9rZW5zIixlKSksYXBpLmVtaXQoInRyYW5zZmVyVG9Db250cmFjdCIse2Zyb206YXBpLnNlbmRlcix0bzphLHN5bWJvbDp0LHF1YW50aXR5Oml9KSl9fX19KSxhY3Rpb25zLnRyYW5zZmVyRnJvbUNvbnRyYWN0PShhc3luYyBhPT57aWYoYXBpLmFzc2VydCgibnVsbCI9PT1hcGkuc2VuZGVyLCJub3QgYXV0aG9yaXplZCIpKXtjb25zdHtmcm9tOmUsdG86dCxzeW1ib2w6aSxxdWFudGl0eTpzLHR5cGU6bixpc1NpZ25lZFdpdGhBY3RpdmVLZXk6b309YSxsPVsidXNlciIsImNvbnRyYWN0Il07aWYoYXBpLmFzc2VydCghMD09PW8sInlvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleSIpJiZhcGkuYXNzZXJ0KHQmJiJzdHJpbmciPT10eXBlb2YgdCYmZSYmInN0cmluZyI9PXR5cGVvZiBlJiZpJiYic3RyaW5nIj09dHlwZW9mIGkmJm4mJmwuaW5jbHVkZXMobikmJnMmJiJzdHJpbmciPT10eXBlb2YgcyYmIWFwaS5CaWdOdW1iZXIocykuaXNOYU4oKSwiaW52YWxpZCBwYXJhbXMiKSl7Y29uc3QgYT10LnRyaW0oKSxvPSJ1c2VyIj09PW4/ImJhbGFuY2VzIjoiY29udHJhY3RzQmFsYW5jZXMiO2lmKGFwaS5hc3NlcnQoInVzZXIiPT09bnx8ImNvbnRyYWN0Ij09PW4mJmEhPT1lLCJjYW5ub3QgdHJhbnNmZXIgdG8gc2VsZiIpKXtjb25zdCB0PSJ1c2VyIj09PW4/YXBpLmlzVmFsaWRBY2NvdW50TmFtZShhKTphLmxlbmd0aD49MyYmYS5sZW5ndGg8PTUwO2lmKGFwaS5hc3NlcnQoITA9PT10LCJpbnZhbGlkIHRvIikpe2NvbnN0IHQ9YXdhaXQgYXBpLmRiLmZpbmRPbmUoInRva2VucyIse3N5bWJvbDppfSk7aWYoYXBpLmFzc2VydChudWxsIT09dCwic3ltYm9sIGRvZXMgbm90IGV4aXN0IikmJmFwaS5hc3NlcnQoY291bnREZWNpbWFscyhzKTw9dC5wcmVjaXNpb24sInN5bWJvbCBwcmVjaXNpb24gbWlzbWF0Y2giKSYmYXBpLmFzc2VydChhcGkuQmlnTnVtYmVyKHMpLmd0KDApLCJtdXN0IHRyYW5zZmVyIHBvc2l0aXZlIHF1YW50aXR5IikmJmF3YWl0IHN1YkJhbGFuY2UoZSx0LHMsImNvbnRyYWN0c0JhbGFuY2VzIikpeyExPT09YXdhaXQgYWRkQmFsYW5jZShhLHQscyxvKT9hd2FpdCBhZGRCYWxhbmNlKGUsdCxzLCJjb250cmFjdHNCYWxhbmNlcyIpOigibnVsbCI9PT1hJiYodC5jaXJjdWxhdGluZ1N1cHBseT1jYWxjdWxhdGVCYWxhbmNlKHQuY2lyY3VsYXRpbmdTdXBwbHkscyx0LnByZWNpc2lvbiwhMSksYXdhaXQgYXBpLmRiLnVwZGF0ZSgidG9rZW5zIix0KSksYXBpLmVtaXQoInRyYW5zZmVyRnJvbUNvbnRyYWN0Iix7ZnJvbTplLHRvOmEsc3ltYm9sOmkscXVhbnRpdHk6c30pKX19fX19fSk7Y29uc3QgcHJvY2Vzc1Vuc3Rha2U9YXN5bmMgYT0+e2NvbnN0e2FjY291bnQ6ZSxzeW1ib2w6dCxxdWFudGl0eTppLHF1YW50aXR5TGVmdDpzLG51bWJlclRyYW5zYWN0aW9uc0xlZnQ6bn09YSxvPWEsbD1hd2FpdCBhcGkuZGIuZmluZE9uZSgiYmFsYW5jZXMiLHthY2NvdW50OmUsc3ltYm9sOnR9KSxwPWF3YWl0IGFwaS5kYi5maW5kT25lKCJ0b2tlbnMiLHtzeW1ib2w6dH0pO2xldCBjPTA7aWYoYXBpLmFzc2VydChudWxsIT09bCwiYmFsYW5jZSBkb2VzIG5vdCBleGlzdCIpJiYoMT09PW4/KGM9cyxhd2FpdCBhcGkuZGIucmVtb3ZlKCJwZW5kaW5nVW5zdGFrZXMiLGEpKTooYz1hcGkuQmlnTnVtYmVyKGkpLmRpdmlkZWRCeShwLm51bWJlclRyYW5zYWN0aW9ucykudG9GaXhlZChwLnByZWNpc2lvbixhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pLG8ucXVhbnRpdHlMZWZ0PWFwaS5CaWdOdW1iZXIoby5xdWFudGl0eUxlZnQpLm1pbnVzKGMpLnRvRml4ZWQocC5wcmVjaXNpb24pLG8ubnVtYmVyVHJhbnNhY3Rpb25zTGVmdC09MSxvLm5leHRUcmFuc2FjdGlvblRpbWVzdGFtcD1hcGkuQmlnTnVtYmVyKG8ubmV4dFRyYW5zYWN0aW9uVGltZXN0YW1wKS5wbHVzKG8ubWlsbGlzZWNQZXJQZXJpb2QpLnRvTnVtYmVyKCksYXdhaXQgYXBpLmRiLnVwZGF0ZSgicGVuZGluZ1Vuc3Rha2VzIixvKSksYXBpLkJpZ051bWJlcihjKS5ndCgwKSkpe2NvbnN0IGE9bC5iYWxhbmNlLGk9bC5wZW5kaW5nVW5zdGFrZTtsLmJhbGFuY2U9Y2FsY3VsYXRlQmFsYW5jZShsLmJhbGFuY2UsYyxwLnByZWNpc2lvbiwhMCksbC5wZW5kaW5nVW5zdGFrZT1jYWxjdWxhdGVCYWxhbmNlKGwucGVuZGluZ1Vuc3Rha2UsYyxwLnByZWNpc2lvbiwhMSksYXBpLmFzc2VydChhcGkuQmlnTnVtYmVyKGwucGVuZGluZ1Vuc3Rha2UpLmx0KGkpJiZhcGkuQmlnTnVtYmVyKGwuYmFsYW5jZSkuZ3QoYSksImNhbm5vdCBzdWJ0cmFjdCIpJiYoYXdhaXQgYXBpLmRiLnVwZGF0ZSgiYmFsYW5jZXMiLGwpLHAudG90YWxTdGFrZWQ9Y2FsY3VsYXRlQmFsYW5jZShwLnRvdGFsU3Rha2VkLGMscC5wcmVjaXNpb24sITEpLGF3YWl0IGFwaS5kYi51cGRhdGUoInRva2VucyIscCksYXBpLmVtaXQoInVuc3Rha2UiLHthY2NvdW50OmUsc3ltYm9sOnQscXVhbnRpdHk6Y30pLCJTU0MiPT09dCYmYXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCJ3aXRuZXNzZXMiLCJ1cGRhdGVXaXRuZXNzZXNBcHByb3ZhbHMiLHthY2NvdW50OmV9KSl9fTthY3Rpb25zLmNoZWNrUGVuZGluZ1Vuc3Rha2VzPShhc3luYygpPT57aWYoYXBpLmFzc2VydCgibnVsbCI9PT1hcGkuc2VuZGVyLCJub3QgYXV0aG9yaXplZCIpKXtjb25zdCBhPW5ldyBEYXRlKGAke2FwaS5zdGVlbUJsb2NrVGltZXN0YW1wfS4wMDBaYCkuZ2V0VGltZSgpO2xldCBlPWF3YWl0IGFwaS5kYi5maW5kKCJwZW5kaW5nVW5zdGFrZXMiLHtuZXh0VHJhbnNhY3Rpb25UaW1lc3RhbXA6eyRsdGU6YX19KSx0PWUubGVuZ3RoO2Zvcig7dD4wOyl7Zm9yKGxldCBhPTA7YTx0O2ErPTEpe2NvbnN0IHQ9ZVthXTthd2FpdCBwcm9jZXNzVW5zdGFrZSh0KX10PShlPWF3YWl0IGFwaS5kYi5maW5kKCJwZW5kaW5nVW5zdGFrZXMiLHtuZXh0VHJhbnNhY3Rpb25UaW1lc3RhbXA6eyRsdGU6YX19KSkubGVuZ3RofX19KSxhY3Rpb25zLmVuYWJsZVN0YWtpbmc9KGFzeW5jIGE9Pntjb25zdHtzeW1ib2w6ZSx1bnN0YWtpbmdDb29sZG93bjp0LG51bWJlclRyYW5zYWN0aW9uczppLGlzU2lnbmVkV2l0aEFjdGl2ZUtleTpzfT1hLG49YXdhaXQgYXBpLmRiLmZpbmRPbmUoInBhcmFtcyIse30pLHtlbmFibGVTdGFraW5nRmVlOm99PW4sbD1hd2FpdCBhcGkuZGIuZmluZE9uZSgiYmFsYW5jZXMiLHthY2NvdW50OmFwaS5zZW5kZXIsc3ltYm9sOiJTU0MifSkscD1sJiZhcGkuQmlnTnVtYmVyKGwuYmFsYW5jZSkuZ3RlKG8pLGM9dm9pZCAwPT09b3x8YXBpLkJpZ051bWJlcihvKS5sdGUoMCl8fHA7aWYoYXBpLmFzc2VydChjLCJ5b3UgbXVzdCBoYXZlIGVub3VnaCB0b2tlbnMgdG8gY292ZXIgIGZlZXMiKSYmYXBpLmFzc2VydCghMD09PXMsInlvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleSIpJiZhcGkuYXNzZXJ0KGUmJiJzdHJpbmciPT10eXBlb2YgZSwiaW52YWxpZCBzeW1ib2wiKSYmYXBpLmFzc2VydCh0JiZOdW1iZXIuaXNJbnRlZ2VyKHQpJiZ0PjAmJnQ8PTE4MjUwLCJ1bnN0YWtpbmdDb29sZG93biBtdXN0IGJlIGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCAxODI1MCIpJiZhcGkuYXNzZXJ0KGkmJk51bWJlci5pc0ludGVnZXIoaSkmJmk+MCYmaTw9MTgyNTAsIm51bWJlclRyYW5zYWN0aW9ucyBtdXN0IGJlIGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCAxODI1MCIpKXtjb25zdCBhPWF3YWl0IGFwaS5kYi5maW5kT25lKCJ0b2tlbnMiLHtzeW1ib2w6ZX0pO2FwaS5hc3NlcnQobnVsbCE9PWEsInN5bWJvbCBkb2VzIG5vdCBleGlzdCIpJiZhcGkuYXNzZXJ0KGEuaXNzdWVyPT09YXBpLnNlbmRlciwibXVzdCBiZSB0aGUgaXNzdWVyIikmJmFwaS5hc3NlcnQodm9pZCAwPT09YS5zdGFraW5nRW5hYmxlZHx8ITE9PT1hLnN0YWtpbmdFbmFibGVkLCJzdGFraW5nIGFscmVhZHkgZW5hYmxlZCIpJiYoYS5zdGFraW5nRW5hYmxlZD0hMCxhLnRvdGFsU3Rha2VkPSIwIixhLnVuc3Rha2luZ0Nvb2xkb3duPXQsYS5udW1iZXJUcmFuc2FjdGlvbnM9aSxhd2FpdCBhcGkuZGIudXBkYXRlKCJ0b2tlbnMiLGEpLGFwaS5CaWdOdW1iZXIobykuZ3QoMCkmJmF3YWl0IGFjdGlvbnMudHJhbnNmZXIoe3RvOiJudWxsIixzeW1ib2w6IlNTQyIscXVhbnRpdHk6byxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6c30pKX19KSxhY3Rpb25zLnN0YWtlPShhc3luYyBhPT57Y29uc3R7c3ltYm9sOmUscXVhbnRpdHk6dCx0bzppLGlzU2lnbmVkV2l0aEFjdGl2ZUtleTpzfT1hO2lmKGFwaS5hc3NlcnQoITA9PT1zLCJ5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXkiKSYmYXBpLmFzc2VydChlJiYic3RyaW5nIj09dHlwZW9mIGUmJmkmJiJzdHJpbmciPT10eXBlb2YgaSYmdCYmInN0cmluZyI9PXR5cGVvZiB0JiYhYXBpLkJpZ051bWJlcih0KS5pc05hTigpLCJpbnZhbGlkIHBhcmFtcyIpKXtjb25zdCBhPWF3YWl0IGFwaS5kYi5maW5kT25lKCJ0b2tlbnMiLHtzeW1ib2w6ZX0pLHM9aS50cmltKCk7aWYoYXBpLmFzc2VydChhcGkuaXNWYWxpZEFjY291bnROYW1lKHMpLCJpbnZhbGlkIHRvIikmJmFwaS5hc3NlcnQobnVsbCE9PWEsInN5bWJvbCBkb2VzIG5vdCBleGlzdCIpJiZhcGkuYXNzZXJ0KGNvdW50RGVjaW1hbHModCk8PWEucHJlY2lzaW9uLCJzeW1ib2wgcHJlY2lzaW9uIG1pc21hdGNoIikmJmFwaS5hc3NlcnQoITA9PT1hLnN0YWtpbmdFbmFibGVkLCJzdGFraW5nIG5vdCBlbmFibGVkIikmJmFwaS5hc3NlcnQoYXBpLkJpZ051bWJlcih0KS5ndCgwKSwibXVzdCBzdGFrZSBwb3NpdGl2ZSBxdWFudGl0eSIpJiZhd2FpdCBzdWJCYWxhbmNlKGFwaS5zZW5kZXIsYSx0LCJiYWxhbmNlcyIpKXshMT09PWF3YWl0IGFkZFN0YWtlKHMsYSx0KT9hd2FpdCBhZGRCYWxhbmNlKGFwaS5zZW5kZXIsYSx0LCJiYWxhbmNlcyIpOihhcGkuZW1pdCgic3Rha2UiLHthY2NvdW50OnMsc3ltYm9sOmUscXVhbnRpdHk6dH0pLCJTU0MiPT09ZSYmYXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCJ3aXRuZXNzZXMiLCJ1cGRhdGVXaXRuZXNzZXNBcHByb3ZhbHMiLHthY2NvdW50OmFwaS5zZW5kZXJ9KSl9fX0pLGFjdGlvbnMuc3Rha2VGcm9tQ29udHJhY3Q9KGFzeW5jIGE9Pntjb25zdHtzeW1ib2w6ZSxxdWFudGl0eTp0LHRvOmksY2FsbGluZ0NvbnRyYWN0SW5mbzpzfT1hO2lmKHMmJmFwaS5hc3NlcnQoZSYmInN0cmluZyI9PXR5cGVvZiBlJiZpJiYic3RyaW5nIj09dHlwZW9mIGkmJnQmJiJzdHJpbmciPT10eXBlb2YgdCYmIWFwaS5CaWdOdW1iZXIodCkuaXNOYU4oKSwiaW52YWxpZCBwYXJhbXMiKSl7Y29uc3QgYT1hd2FpdCBhcGkuZGIuZmluZE9uZSgidG9rZW5zIix7c3ltYm9sOmV9KSxuPWkudHJpbSgpO2lmKGFwaS5hc3NlcnQoYXBpLmlzVmFsaWRBY2NvdW50TmFtZShuKSwiaW52YWxpZCB0byIpJiZhcGkuYXNzZXJ0KG51bGwhPT1hLCJzeW1ib2wgZG9lcyBub3QgZXhpc3QiKSYmYXBpLmFzc2VydChjb3VudERlY2ltYWxzKHQpPD1hLnByZWNpc2lvbiwic3ltYm9sIHByZWNpc2lvbiBtaXNtYXRjaCIpJiZhcGkuYXNzZXJ0KCEwPT09YS5zdGFraW5nRW5hYmxlZCwic3Rha2luZyBub3QgZW5hYmxlZCIpJiZhcGkuYXNzZXJ0KGFwaS5CaWdOdW1iZXIodCkuZ3QoMCksIm11c3Qgc3Rha2UgcG9zaXRpdmUgcXVhbnRpdHkiKSYmYXdhaXQgc3ViQmFsYW5jZShzLm5hbWUsYSx0LCJjb250cmFjdHNCYWxhbmNlcyIpKXshMT09PWF3YWl0IGFkZFN0YWtlKG4sYSx0KT9hd2FpdCBhZGRCYWxhbmNlKHMubmFtZSxhLHQsImJhbGFuY2VzIik6KGFwaS5lbWl0KCJzdGFrZUZyb21Db250cmFjdCIse2FjY291bnQ6bixzeW1ib2w6ZSxxdWFudGl0eTp0fSksIlNTQyI9PT1lJiZhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoIndpdG5lc3NlcyIsInVwZGF0ZVdpdG5lc3Nlc0FwcHJvdmFscyIse2FjY291bnQ6bn0pKX19fSk7Y29uc3Qgc3RhcnRVbnN0YWtlPWFzeW5jKGEsZSx0KT0+e2NvbnN0IGk9bmV3IERhdGUoYCR7YXBpLnN0ZWVtQmxvY2tUaW1lc3RhbXB9LjAwMFpgKSxzPTI0KmUudW5zdGFraW5nQ29vbGRvd24qMzYwMCoxZTMsbj1hcGkuQmlnTnVtYmVyKHMpLmRpdmlkZWRCeShlLm51bWJlclRyYW5zYWN0aW9ucykuaW50ZWdlclZhbHVlKGFwaS5CaWdOdW1iZXIuUk9VTkRfRE9XTiksbz1hcGkuQmlnTnVtYmVyKGkuZ2V0VGltZSgpKS5wbHVzKG4pLnRvTnVtYmVyKCksbD17YWNjb3VudDphLHN5bWJvbDplLnN5bWJvbCxxdWFudGl0eTp0LHF1YW50aXR5TGVmdDp0LG5leHRUcmFuc2FjdGlvblRpbWVzdGFtcDpvLG51bWJlclRyYW5zYWN0aW9uc0xlZnQ6ZS5udW1iZXJUcmFuc2FjdGlvbnMsbWlsbGlzZWNQZXJQZXJpb2Q6bix0eElEOmFwaS50cmFuc2FjdGlvbklkfTthd2FpdCBhcGkuZGIuaW5zZXJ0KCJwZW5kaW5nVW5zdGFrZXMiLGwpfTthY3Rpb25zLnVuc3Rha2U9KGFzeW5jIGE9Pntjb25zdHtzeW1ib2w6ZSxxdWFudGl0eTp0LGlzU2lnbmVkV2l0aEFjdGl2ZUtleTppfT1hO2lmKGFwaS5hc3NlcnQoITA9PT1pLCJ5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXkiKSYmYXBpLmFzc2VydChlJiYic3RyaW5nIj09dHlwZW9mIGUmJnQmJiJzdHJpbmciPT10eXBlb2YgdCYmIWFwaS5CaWdOdW1iZXIodCkuaXNOYU4oKSwiaW52YWxpZCBwYXJhbXMiKSl7Y29uc3QgYT1hd2FpdCBhcGkuZGIuZmluZE9uZSgidG9rZW5zIix7c3ltYm9sOmV9KTthcGkuYXNzZXJ0KG51bGwhPT1hLCJzeW1ib2wgZG9lcyBub3QgZXhpc3QiKSYmYXBpLmFzc2VydCghMD09PWEuc3Rha2luZ0VuYWJsZWQsInN0YWtpbmcgbm90IGVuYWJsZWQiKSYmYXBpLmFzc2VydChjb3VudERlY2ltYWxzKHQpPD1hLnByZWNpc2lvbiwic3ltYm9sIHByZWNpc2lvbiBtaXNtYXRjaCIpJiZhcGkuYXNzZXJ0KGFwaS5CaWdOdW1iZXIodCkuZ3QoMCksIm11c3QgdW5zdGFrZSBwb3NpdGl2ZSBxdWFudGl0eSIpJiZhd2FpdCBzdWJTdGFrZShhcGkuc2VuZGVyLGEsdCkmJihhd2FpdCBzdGFydFVuc3Rha2UoYXBpLnNlbmRlcixhLHQpLGFwaS5lbWl0KCJ1bnN0YWtlU3RhcnQiLHthY2NvdW50OmFwaS5zZW5kZXIsc3ltYm9sOmUscXVhbnRpdHk6dH0pKX19KTtjb25zdCBwcm9jZXNzQ2FuY2VsVW5zdGFrZT1hc3luYyBhPT57Y29uc3R7YWNjb3VudDplLHN5bWJvbDp0LHF1YW50aXR5TGVmdDppfT1hLHM9YXdhaXQgYXBpLmRiLmZpbmRPbmUoImJhbGFuY2VzIix7YWNjb3VudDplLHN5bWJvbDp0fSksbj1hd2FpdCBhcGkuZGIuZmluZE9uZSgidG9rZW5zIix7c3ltYm9sOnR9KTtpZihhcGkuYXNzZXJ0KG51bGwhPT1zLCJiYWxhbmNlIGRvZXMgbm90IGV4aXN0IikmJmFwaS5hc3NlcnQoYXBpLkJpZ051bWJlcihzLnBlbmRpbmdVbnN0YWtlKS5ndGUoaSksIm92ZXJkcmF3biBwZW5kaW5nVW5zdGFrZSIpKXtjb25zdCBhPXMuc3Rha2Usbz1zLnBlbmRpbmdVbnN0YWtlO2lmKHMuc3Rha2U9Y2FsY3VsYXRlQmFsYW5jZShzLnN0YWtlLGksbi5wcmVjaXNpb24sITApLHMucGVuZGluZ1Vuc3Rha2U9Y2FsY3VsYXRlQmFsYW5jZShzLnBlbmRpbmdVbnN0YWtlLGksbi5wcmVjaXNpb24sITEpLGFwaS5hc3NlcnQoYXBpLkJpZ051bWJlcihzLnBlbmRpbmdVbnN0YWtlKS5sdChvKSYmYXBpLkJpZ051bWJlcihzLnN0YWtlKS5ndChhKSwiY2Fubm90IHN1YnRyYWN0IikpcmV0dXJuIGF3YWl0IGFwaS5kYi51cGRhdGUoImJhbGFuY2VzIixzKSxhcGkuZW1pdCgidW5zdGFrZSIse2FjY291bnQ6ZSxzeW1ib2w6dCxxdWFudGl0eTppfSksITB9cmV0dXJuITF9O2FjdGlvbnMuY2FuY2VsVW5zdGFrZT0oYXN5bmMgYT0+e2NvbnN0e3R4SUQ6ZSxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6dH09YTtpZihhcGkuYXNzZXJ0KCEwPT09dCwieW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJmFwaS5hc3NlcnQoZSYmInN0cmluZyI9PXR5cGVvZiBlLCJpbnZhbGlkIHBhcmFtcyIpKXtjb25zdCBhPWF3YWl0IGFwaS5kYi5maW5kT25lKCJwZW5kaW5nVW5zdGFrZXMiLHthY2NvdW50OmFwaS5zZW5kZXIsdHhJRDplfSk7YXBpLmFzc2VydChhLCJ1bnN0YWtlIGRvZXMgbm90IGV4aXN0IikmJmF3YWl0IHByb2Nlc3NDYW5jZWxVbnN0YWtlKGEpJiZhd2FpdCBhcGkuZGIucmVtb3ZlKCJwZW5kaW5nVW5zdGFrZXMiLGEpfX0pLGFjdGlvbnMuZW5hYmxlRGVsZWdhdGlvbj0oYXN5bmMgYT0+e2NvbnN0e3N5bWJvbDplLHVuZGVsZWdhdGlvbkNvb2xkb3duOnQsaXNTaWduZWRXaXRoQWN0aXZlS2V5Oml9PWEscz1hd2FpdCBhcGkuZGIuZmluZE9uZSgicGFyYW1zIix7fSkse2VuYWJsZURlbGVnYXRpb25GZWU6bn09cyxvPWF3YWl0IGFwaS5kYi5maW5kT25lKCJiYWxhbmNlcyIse2FjY291bnQ6YXBpLnNlbmRlcixzeW1ib2w6IlNTQyJ9KSxsPW8mJmFwaS5CaWdOdW1iZXIoby5iYWxhbmNlKS5ndGUobikscD12b2lkIDA9PT1ufHxhcGkuQmlnTnVtYmVyKG4pLmx0ZSgwKXx8bDtpZihhcGkuYXNzZXJ0KHAsInlvdSBtdXN0IGhhdmUgZW5vdWdoIHRva2VucyB0byBjb3ZlciAgZmVlcyIpJiZhcGkuYXNzZXJ0KCEwPT09aSwieW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJmFwaS5hc3NlcnQoZSYmInN0cmluZyI9PXR5cGVvZiBlLCJpbnZhbGlkIHN5bWJvbCIpJiZhcGkuYXNzZXJ0KHQmJk51bWJlci5pc0ludGVnZXIodCkmJnQ+MCYmdDw9MTgyNTAsInVuZGVsZWdhdGlvbkNvb2xkb3duIG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDE4MjUwIikpe2NvbnN0IGE9YXdhaXQgYXBpLmRiLmZpbmRPbmUoInRva2VucyIse3N5bWJvbDplfSk7YXBpLmFzc2VydChudWxsIT09YSwic3ltYm9sIGRvZXMgbm90IGV4aXN0IikmJmFwaS5hc3NlcnQoYS5pc3N1ZXI9PT1hcGkuc2VuZGVyLCJtdXN0IGJlIHRoZSBpc3N1ZXIiKSYmYXBpLmFzc2VydCghMD09PWEuc3Rha2luZ0VuYWJsZWQsInN0YWtpbmcgbm90IGVuYWJsZWQiKSYmYXBpLmFzc2VydCh2b2lkIDA9PT1hLmRlbGVnYXRpb25FbmFibGVkfHwhMT09PWEuZGVsZWdhdGlvbkVuYWJsZWQsImRlbGVnYXRpb24gYWxyZWFkeSBlbmFibGVkIikmJihhLmRlbGVnYXRpb25FbmFibGVkPSEwLGEudW5kZWxlZ2F0aW9uQ29vbGRvd249dCxhd2FpdCBhcGkuZGIudXBkYXRlKCJ0b2tlbnMiLGEpLGFwaS5CaWdOdW1iZXIobikuZ3QoMCkmJmF3YWl0IGFjdGlvbnMudHJhbnNmZXIoe3RvOiJudWxsIixzeW1ib2w6IlNTQyIscXVhbnRpdHk6bixpc1NpZ25lZFdpdGhBY3RpdmVLZXk6aX0pKX19KSxhY3Rpb25zLmRlbGVnYXRlPShhc3luYyBhPT57Y29uc3R7c3ltYm9sOmUscXVhbnRpdHk6dCx0bzppLGlzU2lnbmVkV2l0aEFjdGl2ZUtleTpzfT1hO2lmKGFwaS5hc3NlcnQoITA9PT1zLCJ5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXkiKSYmYXBpLmFzc2VydChlJiYic3RyaW5nIj09dHlwZW9mIGUmJmkmJiJzdHJpbmciPT10eXBlb2YgaSYmdCYmInN0cmluZyI9PXR5cGVvZiB0JiYhYXBpLkJpZ051bWJlcih0KS5pc05hTigpLCJpbnZhbGlkIHBhcmFtcyIpKXtjb25zdCBhPWkudHJpbSgpO2lmKGFwaS5hc3NlcnQoYXBpLmlzVmFsaWRBY2NvdW50TmFtZShhKSwiaW52YWxpZCB0byIpKXtjb25zdCBpPWF3YWl0IGFwaS5kYi5maW5kT25lKCJ0b2tlbnMiLHtzeW1ib2w6ZX0pO2lmKGFwaS5hc3NlcnQobnVsbCE9PWksInN5bWJvbCBkb2VzIG5vdCBleGlzdCIpJiZhcGkuYXNzZXJ0KGNvdW50RGVjaW1hbHModCk8PWkucHJlY2lzaW9uLCJzeW1ib2wgcHJlY2lzaW9uIG1pc21hdGNoIikmJmFwaS5hc3NlcnQoITA9PT1pLmRlbGVnYXRpb25FbmFibGVkLCJkZWxlZ2F0aW9uIG5vdCBlbmFibGVkIikmJmFwaS5hc3NlcnQoYSE9PWFwaS5zZW5kZXIsImNhbm5vdCBkZWxlZ2F0ZSB0byB5b3Vyc2VsZiIpJiZhcGkuYXNzZXJ0KGFwaS5CaWdOdW1iZXIodCkuZ3QoMCksIm11c3QgZGVsZWdhdGUgcG9zaXRpdmUgcXVhbnRpdHkiKSl7Y29uc3Qgcz1hd2FpdCBhcGkuZGIuZmluZE9uZSgiYmFsYW5jZXMiLHthY2NvdW50OmFwaS5zZW5kZXIsc3ltYm9sOmV9KTtpZihhcGkuYXNzZXJ0KG51bGwhPT1zLCJiYWxhbmNlRnJvbSBkb2VzIG5vdCBleGlzdCIpJiZhcGkuYXNzZXJ0KGFwaS5CaWdOdW1iZXIocy5zdGFrZSkuZ3RlKHQpLCJvdmVyZHJhd24gc3Rha2UiKSl7dm9pZCAwPT09cy5zdGFrZT8ocy5zdGFrZT0iMCIscy5wZW5kaW5nVW5zdGFrZT0iMCIscy5kZWxlZ2F0aW9uc0luPSIwIixzLmRlbGVnYXRpb25zT3V0PSIwIixzLnBlbmRpbmdVbmRlbGVnYXRpb25zPSIwIik6dm9pZCAwPT09cy5kZWxlZ2F0aW9uc0luJiYocy5kZWxlZ2F0aW9uc0luPSIwIixzLmRlbGVnYXRpb25zT3V0PSIwIixzLnBlbmRpbmdVbmRlbGVnYXRpb25zPSIwIixzLmRlbGVnYXRlZFN0YWtlJiYoZGVsZXRlIHMuZGVsZWdhdGVkU3Rha2UsZGVsZXRlIHMucmVjZWl2ZWRTdGFrZSkpO2xldCBuPWF3YWl0IGFwaS5kYi5maW5kT25lKCJiYWxhbmNlcyIse2FjY291bnQ6YSxzeW1ib2w6ZX0pO251bGw9PT1uPygobj1iYWxhbmNlVGVtcGxhdGUpLmFjY291bnQ9YSxuLnN5bWJvbD1lLG49YXdhaXQgYXBpLmRiLmluc2VydCgiYmFsYW5jZXMiLG4pKTp2b2lkIDA9PT1uLnN0YWtlPyhuLnN0YWtlPSIwIixuLnBlbmRpbmdVbnN0YWtlPSIwIixuLmRlbGVnYXRpb25zSW49IjAiLG4uZGVsZWdhdGlvbnNPdXQ9IjAiLG4ucGVuZGluZ1VuZGVsZWdhdGlvbnM9IjAiKTp2b2lkIDA9PT1uLmRlbGVnYXRpb25zSW4mJihuLmRlbGVnYXRpb25zSW49IjAiLG4uZGVsZWdhdGlvbnNPdXQ9IjAiLG4ucGVuZGluZ1VuZGVsZWdhdGlvbnM9IjAiLG4uZGVsZWdhdGVkU3Rha2UmJihkZWxldGUgbi5kZWxlZ2F0ZWRTdGFrZSxkZWxldGUgbi5yZWNlaXZlZFN0YWtlKSk7bGV0IG89YXdhaXQgYXBpLmRiLmZpbmRPbmUoImRlbGVnYXRpb25zIix7dG86YSxmcm9tOmFwaS5zZW5kZXIsc3ltYm9sOmV9KTtjb25zdCBsPW5ldyBEYXRlKGAke2FwaS5zdGVlbUJsb2NrVGltZXN0YW1wfS4wMDBaYCkuZ2V0VGltZSgpO251bGw9PW8/KHMuc3Rha2U9Y2FsY3VsYXRlQmFsYW5jZShzLnN0YWtlLHQsaS5wcmVjaXNpb24sITEpLHMuZGVsZWdhdGlvbnNPdXQ9Y2FsY3VsYXRlQmFsYW5jZShzLmRlbGVnYXRpb25zT3V0LHQsaS5wcmVjaXNpb24sITApLGF3YWl0IGFwaS5kYi51cGRhdGUoImJhbGFuY2VzIixzKSxuLmRlbGVnYXRpb25zSW49Y2FsY3VsYXRlQmFsYW5jZShuLmRlbGVnYXRpb25zSW4sdCxpLnByZWNpc2lvbiwhMCksYXdhaXQgYXBpLmRiLnVwZGF0ZSgiYmFsYW5jZXMiLG4pLChvPXt9KS5mcm9tPWFwaS5zZW5kZXIsby50bz1hLG8uc3ltYm9sPWUsby5xdWFudGl0eT10LG8uY3JlYXRlZD1sLG8udXBkYXRlZD1sLGF3YWl0IGFwaS5kYi5pbnNlcnQoImRlbGVnYXRpb25zIixvKSxhcGkuZW1pdCgiZGVsZWdhdGUiLHt0bzphLHN5bWJvbDplLHF1YW50aXR5OnR9KSwiU1NDIj09PWUmJihhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoIndpdG5lc3NlcyIsInVwZGF0ZVdpdG5lc3Nlc0FwcHJvdmFscyIse2FjY291bnQ6YXBpLnNlbmRlcn0pLGF3YWl0IGFwaS5leGVjdXRlU21hcnRDb250cmFjdCgid2l0bmVzc2VzIiwidXBkYXRlV2l0bmVzc2VzQXBwcm92YWxzIix7YWNjb3VudDphfSkpKToocy5zdGFrZT1jYWxjdWxhdGVCYWxhbmNlKHMuc3Rha2UsdCxpLnByZWNpc2lvbiwhMSkscy5kZWxlZ2F0aW9uc091dD1jYWxjdWxhdGVCYWxhbmNlKHMuZGVsZWdhdGlvbnNPdXQsdCxpLnByZWNpc2lvbiwhMCksYXdhaXQgYXBpLmRiLnVwZGF0ZSgiYmFsYW5jZXMiLHMpLG4uZGVsZWdhdGlvbnNJbj1jYWxjdWxhdGVCYWxhbmNlKG4uZGVsZWdhdGlvbnNJbix0LGkucHJlY2lzaW9uLCEwKSxhd2FpdCBhcGkuZGIudXBkYXRlKCJiYWxhbmNlcyIsbiksby5xdWFudGl0eT1jYWxjdWxhdGVCYWxhbmNlKG8ucXVhbnRpdHksdCxpLnByZWNpc2lvbiwhMCksby51cGRhdGVkPWwsYXdhaXQgYXBpLmRiLnVwZGF0ZSgiZGVsZWdhdGlvbnMiLG8pLGFwaS5lbWl0KCJkZWxlZ2F0ZSIse3RvOmEsc3ltYm9sOmUscXVhbnRpdHk6dH0pLCJTU0MiPT09ZSYmKGF3YWl0IGFwaS5leGVjdXRlU21hcnRDb250cmFjdCgid2l0bmVzc2VzIiwidXBkYXRlV2l0bmVzc2VzQXBwcm92YWxzIix7YWNjb3VudDphcGkuc2VuZGVyfSksYXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCJ3aXRuZXNzZXMiLCJ1cGRhdGVXaXRuZXNzZXNBcHByb3ZhbHMiLHthY2NvdW50OmF9KSkpfX19fX0pLGFjdGlvbnMudW5kZWxlZ2F0ZT0oYXN5bmMgYT0+e2NvbnN0e3N5bWJvbDplLHF1YW50aXR5OnQsZnJvbTppLGlzU2lnbmVkV2l0aEFjdGl2ZUtleTpzfT1hO2lmKGFwaS5hc3NlcnQoITA9PT1zLCJ5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXkiKSYmYXBpLmFzc2VydChlJiYic3RyaW5nIj09dHlwZW9mIGUmJmkmJiJzdHJpbmciPT10eXBlb2YgaSYmdCYmInN0cmluZyI9PXR5cGVvZiB0JiYhYXBpLkJpZ051bWJlcih0KS5pc05hTigpLCJpbnZhbGlkIHBhcmFtcyIpKXtjb25zdCBhPWkudHJpbSgpO2lmKGFwaS5hc3NlcnQoYXBpLmlzVmFsaWRBY2NvdW50TmFtZShhKSwiaW52YWxpZCBmcm9tIikpe2NvbnN0IGk9YXdhaXQgYXBpLmRiLmZpbmRPbmUoInRva2VucyIse3N5bWJvbDplfSk7aWYoYXBpLmFzc2VydChudWxsIT09aSwic3ltYm9sIGRvZXMgbm90IGV4aXN0IikmJmFwaS5hc3NlcnQoY291bnREZWNpbWFscyh0KTw9aS5wcmVjaXNpb24sInN5bWJvbCBwcmVjaXNpb24gbWlzbWF0Y2giKSYmYXBpLmFzc2VydCghMD09PWkuZGVsZWdhdGlvbkVuYWJsZWQsImRlbGVnYXRpb24gbm90IGVuYWJsZWQiKSYmYXBpLmFzc2VydChhIT09YXBpLnNlbmRlciwiY2Fubm90IHVuZGVsZWdhdGUgZnJvbSB5b3Vyc2VsZiIpJiZhcGkuYXNzZXJ0KGFwaS5CaWdOdW1iZXIodCkuZ3QoMCksIm11c3QgdW5kZWxlZ2F0ZSBwb3NpdGl2ZSBxdWFudGl0eSIpKXtjb25zdCBzPWF3YWl0IGFwaS5kYi5maW5kT25lKCJiYWxhbmNlcyIse2FjY291bnQ6YXBpLnNlbmRlcixzeW1ib2w6ZX0pO2lmKGFwaS5hc3NlcnQobnVsbCE9PXMsImJhbGFuY2VUbyBkb2VzIG5vdCBleGlzdCIpJiZhcGkuYXNzZXJ0KGFwaS5CaWdOdW1iZXIocy5kZWxlZ2F0aW9uc091dCkuZ3RlKHQpLCJvdmVyZHJhd24gZGVsZWdhdGlvbiIpKXtjb25zdCBuPWF3YWl0IGFwaS5kYi5maW5kT25lKCJiYWxhbmNlcyIse2FjY291bnQ6YSxzeW1ib2w6ZX0pO2lmKGFwaS5hc3NlcnQobnVsbCE9PW4sImJhbGFuY2VGcm9tIGRvZXMgbm90IGV4aXN0Iikpe2NvbnN0IG89YXdhaXQgYXBpLmRiLmZpbmRPbmUoImRlbGVnYXRpb25zIix7dG86YSxmcm9tOmFwaS5zZW5kZXIsc3ltYm9sOmV9KTtpZihhcGkuYXNzZXJ0KG51bGwhPT1vLCJkZWxlZ2F0aW9uIGRvZXMgbm90IGV4aXN0IikmJmFwaS5hc3NlcnQoYXBpLkJpZ051bWJlcihvLnF1YW50aXR5KS5ndGUodCksIm92ZXJkcmF3biBkZWxlZ2F0aW9uIikpe3MucGVuZGluZ1VuZGVsZWdhdGlvbnM9Y2FsY3VsYXRlQmFsYW5jZShuLnBlbmRpbmdVbmRlbGVnYXRpb25zLHQsaS5wcmVjaXNpb24sITApLHMuZGVsZWdhdGlvbnNPdXQ9Y2FsY3VsYXRlQmFsYW5jZShzLmRlbGVnYXRpb25zT3V0LHQsaS5wcmVjaXNpb24sITEpLGF3YWl0IGFwaS5kYi51cGRhdGUoImJhbGFuY2VzIixzKSxuLmRlbGVnYXRpb25zSW49Y2FsY3VsYXRlQmFsYW5jZShuLmRlbGVnYXRpb25zSW4sdCxpLnByZWNpc2lvbiwhMSksYXdhaXQgYXBpLmRiLnVwZGF0ZSgiYmFsYW5jZXMiLG4pLG8ucXVhbnRpdHk9Y2FsY3VsYXRlQmFsYW5jZShvLnF1YW50aXR5LHQsaS5wcmVjaXNpb24sITEpLGFwaS5CaWdOdW1iZXIoby5xdWFudGl0eSkuZ3QoMCk/YXdhaXQgYXBpLmRiLnVwZGF0ZSgiZGVsZWdhdGlvbnMiLG8pOmF3YWl0IGFwaS5kYi5yZW1vdmUoImRlbGVnYXRpb25zIixvKTtjb25zdCBsPW5ldyBEYXRlKGAke2FwaS5zdGVlbUJsb2NrVGltZXN0YW1wfS4wMDBaYCkscD0yNCppLnVuZGVsZWdhdGlvbkNvb2xkb3duKjM2MDAqMWUzLGM9bC5nZXRUaW1lKCkrcCxyPXthY2NvdW50OmFwaS5zZW5kZXIsc3ltYm9sOmkuc3ltYm9sLHF1YW50aXR5OnQsY29tcGxldGVUaW1lc3RhbXA6Yyx0eElEOmFwaS50cmFuc2FjdGlvbklkfTthd2FpdCBhcGkuZGIuaW5zZXJ0KCJwZW5kaW5nVW5kZWxlZ2F0aW9ucyIsciksYXBpLmVtaXQoInVuZGVsZWdhdGVTdGFydCIse2Zyb206YSxzeW1ib2w6ZSxxdWFudGl0eTp0fSksIlNTQyI9PT1lJiZhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoIndpdG5lc3NlcyIsInVwZGF0ZVdpdG5lc3Nlc0FwcHJvdmFscyIse2FjY291bnQ6YX0pfX19fX19fSk7Y29uc3QgcHJvY2Vzc1VuZGVsZWdhdGlvbj1hc3luYyBhPT57Y29uc3R7YWNjb3VudDplLHN5bWJvbDp0LHF1YW50aXR5Oml9PWEscz1hd2FpdCBhcGkuZGIuZmluZE9uZSgiYmFsYW5jZXMiLHthY2NvdW50OmUsc3ltYm9sOnR9KSxuPWF3YWl0IGFwaS5kYi5maW5kT25lKCJ0b2tlbnMiLHtzeW1ib2w6dH0pO2lmKGFwaS5hc3NlcnQobnVsbCE9PXMsImJhbGFuY2UgZG9lcyBub3QgZXhpc3QiKSl7Y29uc3Qgbz1zLnN0YWtlLGw9cy5wZW5kaW5nVW5kZWxlZ2F0aW9ucztzLnN0YWtlPWNhbGN1bGF0ZUJhbGFuY2Uocy5zdGFrZSxpLG4ucHJlY2lzaW9uLCEwKSxzLnBlbmRpbmdVbmRlbGVnYXRpb25zPWNhbGN1bGF0ZUJhbGFuY2Uocy5wZW5kaW5nVW5kZWxlZ2F0aW9ucyxpLG4ucHJlY2lzaW9uLCExKSxhcGkuYXNzZXJ0KGFwaS5CaWdOdW1iZXIocy5wZW5kaW5nVW5kZWxlZ2F0aW9ucykubHQobCkmJmFwaS5CaWdOdW1iZXIocy5zdGFrZSkuZ3QobyksImNhbm5vdCBzdWJ0cmFjdCIpJiYoYXdhaXQgYXBpLmRiLnVwZGF0ZSgiYmFsYW5jZXMiLHMpLGF3YWl0IGFwaS5kYi5yZW1vdmUoInBlbmRpbmdVbmRlbGVnYXRpb25zIixhKSxhcGkuZW1pdCgidW5kZWxlZ2F0ZURvbmUiLHthY2NvdW50OmUsc3ltYm9sOnQscXVhbnRpdHk6aX0pLCJTU0MiPT09dCYmYXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCJ3aXRuZXNzZXMiLCJ1cGRhdGVXaXRuZXNzZXNBcHByb3ZhbHMiLHthY2NvdW50OmV9KSl9fTthY3Rpb25zLmNoZWNrUGVuZGluZ1VuZGVsZWdhdGlvbnM9KGFzeW5jKCk9PntpZihhcGkuYXNzZXJ0KCJudWxsIj09PWFwaS5zZW5kZXIsIm5vdCBhdXRob3JpemVkIikpe2NvbnN0IGE9bmV3IERhdGUoYCR7YXBpLnN0ZWVtQmxvY2tUaW1lc3RhbXB9LjAwMFpgKS5nZXRUaW1lKCk7bGV0IGU9YXdhaXQgYXBpLmRiLmZpbmQoInBlbmRpbmdVbmRlbGVnYXRpb25zIix7Y29tcGxldGVUaW1lc3RhbXA6eyRsdGU6YX19KSx0PWUubGVuZ3RoO2Zvcig7dD4wOyl7Zm9yKGxldCBhPTA7YTx0O2ErPTEpe2NvbnN0IHQ9ZVthXTthd2FpdCBwcm9jZXNzVW5kZWxlZ2F0aW9uKHQpfXQ9KGU9YXdhaXQgYXBpLmRiLmZpbmQoInBlbmRpbmdVbmRlbGVnYXRpb25zIix7Y29tcGxldGVUaW1lc3RhbXA6eyRsdGU6YX19KSkubGVuZ3RofX19KTs="
}
}
}

{
"id": "ssc-00000000000000000002",
"json": {
"contractName": "contract",
"contractAction": "deploy",
"contractPayload": {
"name": "test",
"params": "",
"code": "YWN0aW9ucy5jcmVhdGVTU0MgPSBhc3luYyAocGF5bG9hZCkgPT4gewogICAgICAgICAgYXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKCd0ZXN0VXBkYXRlVGFibGUnKTsKICAgICAgICB9"
}
}
}

{
"id": "ssc-testnet1",
"json": {
"contractName": "contract",
"contractAction": "update",
"contractPayload": {
"name": "witnesses",
"params": "",
"code": "LyogZXNsaW50LWRpc2FibGUgbm8tYXdhaXQtaW4tbG9vcCAqLwovKiBnbG9iYWwgYWN0aW9ucywgYXBpICovCgpjb25zdCBOQl9BUFBST1ZBTFNfQUxMT1dFRCA9IDMwOwpjb25zdCBOQl9UT1BfV0lUTkVTU0VTID0gNDsKY29uc3QgTkJfQkFDS1VQX1dJVE5FU1NFUyA9IDE7CmNvbnN0IE5CX1dJVE5FU1NFUyA9IE5CX1RPUF9XSVRORVNTRVMgKyBOQl9CQUNLVVBfV0lUTkVTU0VTOwpjb25zdCBOQl9XSVRORVNTRVNfU0lHTkFUVVJFU19SRVFVSVJFRCA9IDM7CmNvbnN0IE1BWF9ST1VORFNfTUlTU0VEX0lOX0FfUk9XID0gMzsgLy8gYWZ0ZXIgdGhhdCB0aGUgd2l0bmVzcyBpcyBkaXNhYmxlZApjb25zdCBNQVhfUk9VTkRfUFJPUE9TSVRJT05fV0FJVElOR19QRVJJT0QgPSA0MDsgLy8gMjAgYmxvY2tzCmNvbnN0IE5CX1RPS0VOU19UT19SRVdBUkQgPSAnMC4wMTkwMjU4Nyc7CmNvbnN0IE5CX1RPS0VOU19ORUVERURfQkVGT1JFX1JFV0FSRElORyA9ICcwLjA5NTEyOTM1JzsKLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRlbXBsYXRlLWN1cmx5LWluLXN0cmluZwpjb25zdCBVVElMSVRZX1RPS0VOX1NZTUJPTCA9ICJTU0MiOwovLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdGVtcGxhdGUtY3VybHktaW4tc3RyaW5nCmNvbnN0IFVUSUxJVFlfVE9LRU5fUFJFQ0lTSU9OID0gODsKLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRlbXBsYXRlLWN1cmx5LWluLXN0cmluZwpjb25zdCBVVElMSVRZX1RPS0VOX01JTl9WQUxVRSA9IDAuMDAwMDAwMDE7CgphY3Rpb25zLmNyZWF0ZVNTQyA9IGFzeW5jICgpID0+IHsKICBjb25zdCB0YWJsZUV4aXN0cyA9IGF3YWl0IGFwaS5kYi50YWJsZUV4aXN0cygnd2l0bmVzc2VzJyk7CgogIGlmICh0YWJsZUV4aXN0cyA9PT0gZmFsc2UpIHsKICAgIGF3YWl0IGFwaS5kYi5jcmVhdGVUYWJsZSgnd2l0bmVzc2VzJywgWydhcHByb3ZhbFdlaWdodCddKTsKICAgIGF3YWl0IGFwaS5kYi5jcmVhdGVUYWJsZSgnYXBwcm92YWxzJywgWydmcm9tJywgJ3RvJ10pOwogICAgYXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKCdhY2NvdW50cycsIFsnYWNjb3VudCddKTsKICAgIGF3YWl0IGFwaS5kYi5jcmVhdGVUYWJsZSgnc2NoZWR1bGVzJyk7CiAgICBhd2FpdCBhcGkuZGIuY3JlYXRlVGFibGUoJ3BhcmFtcycpOwoKICAgIGNvbnN0IHBhcmFtcyA9IHsKICAgICAgdG90YWxBcHByb3ZhbFdlaWdodDogJzAnLAogICAgICBudW1iZXJPZkFwcHJvdmVkV2l0bmVzc2VzOiAwLAogICAgICBsYXN0VmVyaWZpZWRCbG9ja051bWJlcjogMCwKICAgICAgcm91bmQ6IDAsCiAgICAgIGxhc3RCbG9ja1JvdW5kOiAwLAogICAgICBjdXJyZW50V2l0bmVzczogbnVsbCwKICAgICAgYmxvY2tOdW1iZXJXaXRuZXNzQ2hhbmdlOiAwLAogICAgICBsYXN0V2l0bmVzc2VzOiBbXSwKICAgIH07CgogICAgYXdhaXQgYXBpLmRiLmluc2VydCgncGFyYW1zJywgcGFyYW1zKTsKICB9CgogIC8vIFRPRE86IGNsZWFudXAgd2hlbiBsYXVuY2hpbmcgZm9yIG1haW5uZXQgLyBuZXh0IHVwZGF0ZQogIGNvbnN0IHdpdG5lc3NlcyA9IGF3YWl0IGFwaS5kYi5maW5kKCd3aXRuZXNzZXMnLCB7IH0pOwoKICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgd2l0bmVzc2VzLmxlbmd0aDsgaW5kZXggKz0gMSkgewogICAgY29uc3Qgd2l0bmVzcyA9IHdpdG5lc3Nlc1tpbmRleF07CiAgICB3aXRuZXNzLm1pc3NlZFJvdW5kcyA9IDA7CiAgICB3aXRuZXNzLm1pc3NlZFJvdW5kc0luQVJvdyA9IDA7CiAgICBhd2FpdCBhcGkuZGIudXBkYXRlKCd3aXRuZXNzZXMnLCB3aXRuZXNzKTsKICB9CgogIGNvbnN0IHNjaGVkdWxlcyA9IGF3YWl0IGFwaS5kYi5maW5kKCdzY2hlZHVsZXMnLCB7IH0pOwoKICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc2NoZWR1bGVzLmxlbmd0aDsgaW5kZXggKz0gMSkgewogICAgY29uc3Qgc2NoZWR1bGUgPSBzY2hlZHVsZXNbaW5kZXhdOwogICAgYXdhaXQgYXBpLmRiLnJlbW92ZSgnc2NoZWR1bGVzJywgc2NoZWR1bGUpOwogIH0KCiAgY29uc3QgcGFyYW1zID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ3BhcmFtcycsIHt9KTsKICBwYXJhbXMuY3VycmVudFdpdG5lc3MgPSBudWxsOwogIHBhcmFtcy5ibG9ja051bWJlcldpdG5lc3NDaGFuZ2UgPSAwOwogIHBhcmFtcy5sYXN0V2l0bmVzc2VzID0gW107CiAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgncGFyYW1zJywgcGFyYW1zKTsKfTsKCmFjdGlvbnMucmVzZXRTY2hlZHVsZSA9IGFzeW5jICgpID0+IHsKICBpZiAoYXBpLnNlbmRlciAhPT0gYXBpLm93bmVyKSByZXR1cm47CgogIGNvbnN0IHNjaGVkdWxlcyA9IGF3YWl0IGFwaS5kYi5maW5kKCdzY2hlZHVsZXMnLCB7IH0pOwoKICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc2NoZWR1bGVzLmxlbmd0aDsgaW5kZXggKz0gMSkgewogICAgY29uc3Qgc2NoZWR1bGUgPSBzY2hlZHVsZXNbaW5kZXhdOwogICAgYXdhaXQgYXBpLmRiLnJlbW92ZSgnc2NoZWR1bGVzJywgc2NoZWR1bGUpOwogIH0KCiAgY29uc3QgcGFyYW1zID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ3BhcmFtcycsIHt9KTsKICBwYXJhbXMuY3VycmVudFdpdG5lc3MgPSBudWxsOwogIHBhcmFtcy5ibG9ja051bWJlcldpdG5lc3NDaGFuZ2UgPSAwOwogIHBhcmFtcy5sYXN0V2l0bmVzc2VzID0gW107CiAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgncGFyYW1zJywgcGFyYW1zKTsKfTsKCmFjdGlvbnMuc2V0VGVzdEhwZyA9IGFzeW5jICgpID0+IHsKICBpZiAoYXBpLnNlbmRlciAhPT0gYXBpLm93bmVyKSByZXR1cm47CgogIGNvbnN0IHBhcmFtcyA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdwYXJhbXMnLCB7fSk7CiAgcGFyYW1zLmN1cnJlbnRXaXRuZXNzID0gJ3Rlc3QuaHBnJzsKICBhd2FpdCBhcGkuZGIudXBkYXRlKCdwYXJhbXMnLCBwYXJhbXMpOwp9OwoKY29uc3QgdXBkYXRlV2l0bmVzc1JhbmsgPSBhc3luYyAod2l0bmVzcywgYXBwcm92YWxXZWlnaHQpID0+IHsKICAvLyBjaGVjayBpZiB3aXRuZXNzIGV4aXN0cwogIGNvbnN0IHdpdG5lc3NSZWMgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgnd2l0bmVzc2VzJywgeyBhY2NvdW50OiB3aXRuZXNzIH0pOwoKICBpZiAod2l0bmVzc1JlYykgewogICAgLy8gdXBkYXRlIHdpdG5lc3MgYXBwcm92YWxXZWlnaHQKICAgIGNvbnN0IG9sZEFwcHJvdmFsV2VpZ2h0ID0gd2l0bmVzc1JlYy5hcHByb3ZhbFdlaWdodC4kbnVtYmVyRGVjaW1hbDsKICAgIHdpdG5lc3NSZWMuYXBwcm92YWxXZWlnaHQuJG51bWJlckRlY2ltYWwgPSBhcGkuQmlnTnVtYmVyKAogICAgICB3aXRuZXNzUmVjLmFwcHJvdmFsV2VpZ2h0LiRudW1iZXJEZWNpbWFsLAogICAgKQogICAgICAucGx1cyhhcHByb3ZhbFdlaWdodCkKICAgICAgLnRvRml4ZWQoVVRJTElUWV9UT0tFTl9QUkVDSVNJT04pOwoKICAgIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3dpdG5lc3NlcycsIHdpdG5lc3NSZWMpOwoKICAgIGNvbnN0IHBhcmFtcyA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdwYXJhbXMnLCB7fSk7CgogICAgLy8gdXBkYXRlIHRvdGFsQXBwcm92YWxXZWlnaHQKICAgIHBhcmFtcy50b3RhbEFwcHJvdmFsV2VpZ2h0ID0gYXBpLkJpZ051bWJlcihwYXJhbXMudG90YWxBcHByb3ZhbFdlaWdodCkKICAgICAgLnBsdXMoYXBwcm92YWxXZWlnaHQpCiAgICAgIC50b0ZpeGVkKFVUSUxJVFlfVE9LRU5fUFJFQ0lTSU9OKTsKCiAgICAvLyB1cGRhdGUgbnVtYmVyT2ZBcHByb3ZlZFdpdG5lc3NlcwogICAgaWYgKGFwaS5CaWdOdW1iZXIob2xkQXBwcm92YWxXZWlnaHQpLmVxKDApCiAgICAgICYmIGFwaS5CaWdOdW1iZXIod2l0bmVzc1JlYy5hcHByb3ZhbFdlaWdodC4kbnVtYmVyRGVjaW1hbCkuZ3QoMCkpIHsKICAgICAgcGFyYW1zLm51bWJlck9mQXBwcm92ZWRXaXRuZXNzZXMgKz0gMTsKICAgIH0gZWxzZSBpZiAoYXBpLkJpZ051bWJlcihvbGRBcHByb3ZhbFdlaWdodCkuZ3QoMCkKICAgICAgJiYgYXBpLkJpZ051bWJlcih3aXRuZXNzUmVjLmFwcHJvdmFsV2VpZ2h0LiRudW1iZXJEZWNpbWFsKS5lcSgwKSkgewogICAgICBwYXJhbXMubnVtYmVyT2ZBcHByb3ZlZFdpdG5lc3NlcyAtPSAxOwogICAgfQoKICAgIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3BhcmFtcycsIHBhcmFtcyk7CiAgfQp9OwoKYWN0aW9ucy51cGRhdGVXaXRuZXNzZXNBcHByb3ZhbHMgPSBhc3luYyAocGF5bG9hZCkgPT4gewogIGNvbnN0IHsgYWNjb3VudCwgY2FsbGluZ0NvbnRyYWN0SW5mbyB9ID0gcGF5bG9hZDsKCiAgaWYgKGNhbGxpbmdDb250cmFjdEluZm8gPT09IHVuZGVmaW5lZCkgcmV0dXJuOwogIGlmIChjYWxsaW5nQ29udHJhY3RJbmZvLm5hbWUgIT09ICd0b2tlbnMnKSByZXR1cm47CgogIGNvbnN0IGFjY3QgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgnYWNjb3VudHMnLCB7IGFjY291bnQgfSk7CiAgaWYgKGFjY3QgIT09IG51bGwpIHsKICAgIC8vIGNhbGN1bGF0ZSBhcHByb3ZhbCB3ZWlnaHQgb2YgdGhlIGFjY291bnQKICAgIGNvbnN0IGJhbGFuY2UgPSBhd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoJ3Rva2VucycsICdiYWxhbmNlcycsIHsgYWNjb3VudCwgc3ltYm9sOiBVVElMSVRZX1RPS0VOX1NZTUJPTCB9KTsKICAgIGxldCBhcHByb3ZhbFdlaWdodCA9IDA7CiAgICBpZiAoYmFsYW5jZSAmJiBiYWxhbmNlLnN0YWtlKSB7CiAgICAgIGFwcHJvdmFsV2VpZ2h0ID0gYmFsYW5jZS5zdGFrZTsKICAgIH0KCiAgICBpZiAoYmFsYW5jZSAmJiBiYWxhbmNlLnBlbmRpbmdVbnN0YWtlKSB7CiAgICAgIGFwcHJvdmFsV2VpZ2h0ID0gYXBpLkJpZ051bWJlcihhcHByb3ZhbFdlaWdodCkKICAgICAgICAucGx1cyhiYWxhbmNlLnBlbmRpbmdVbnN0YWtlKQogICAgICAgIC50b0ZpeGVkKFVUSUxJVFlfVE9LRU5fUFJFQ0lTSU9OKTsKICAgIH0KCiAgICBpZiAoYmFsYW5jZSAmJiBiYWxhbmNlLmRlbGVnYXRpb25zSW4pIHsKICAgICAgYXBwcm92YWxXZWlnaHQgPSBhcGkuQmlnTnVtYmVyKGFwcHJvdmFsV2VpZ2h0KQogICAgICAgIC5wbHVzKGJhbGFuY2UuZGVsZWdhdGlvbnNJbikKICAgICAgICAudG9GaXhlZChVVElMSVRZX1RPS0VOX1BSRUNJU0lPTik7CiAgICB9CgogICAgY29uc3Qgb2xkQXBwcm92YWxXZWlnaHQgPSBhY2N0LmFwcHJvdmFsV2VpZ2h0OwoKICAgIGNvbnN0IGRlbHRhQXBwcm92YWxXZWlnaHQgPSBhcGkuQmlnTnVtYmVyKGFwcHJvdmFsV2VpZ2h0KQogICAgICAubWludXMob2xkQXBwcm92YWxXZWlnaHQpCiAgICAgIC50b0ZpeGVkKFVUSUxJVFlfVE9LRU5fUFJFQ0lTSU9OKTsKCiAgICBhY2N0LmFwcHJvdmFsV2VpZ2h0ID0gYXBwcm92YWxXZWlnaHQ7CgogICAgaWYgKCFhcGkuQmlnTnVtYmVyKGRlbHRhQXBwcm92YWxXZWlnaHQpLmVxKDApKSB7CiAgICAgIGF3YWl0IGFwaS5kYi51cGRhdGUoJ2FjY291bnRzJywgYWNjdCk7CgogICAgICBjb25zdCBhcHByb3ZhbHMgPSBhd2FpdCBhcGkuZGIuZmluZCgnYXBwcm92YWxzJywgeyBmcm9tOiBhY2NvdW50IH0pOwoKICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFwcHJvdmFscy5sZW5ndGg7IGluZGV4ICs9IDEpIHsKICAgICAgICBjb25zdCBhcHByb3ZhbCA9IGFwcHJvdmFsc1tpbmRleF07CiAgICAgICAgYXdhaXQgdXBkYXRlV2l0bmVzc1JhbmsoYXBwcm92YWwudG8sIGRlbHRhQXBwcm92YWxXZWlnaHQpOwogICAgICB9CiAgICB9CiAgfQp9OwoKYWN0aW9ucy5yZWdpc3RlciA9IGFzeW5jIChwYXlsb2FkKSA9PiB7CiAgY29uc3QgewogICAgSVAsIFJQQ1BvcnQsIFAyUFBvcnQsIHNpZ25pbmdLZXksIGVuYWJsZWQsIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICB9ID0gcGF5bG9hZDsKCiAgaWYgKGFwaS5hc3NlcnQoaXNTaWduZWRXaXRoQWN0aXZlS2V5ID09PSB0cnVlLCAnYWN0aXZlIGtleSByZXF1aXJlZCcpCiAgICAmJiBhcGkuYXNzZXJ0KElQICYmIHR5cGVvZiBJUCA9PT0gJ3N0cmluZycgJiYgYXBpLnZhbGlkYXRvci5pc0lQKElQKSwgJ0lQIGlzIGludmFsaWQnKQogICAgJiYgYXBpLmFzc2VydChSUENQb3J0ICYmIE51bWJlci5pc0ludGVnZXIoUlBDUG9ydCkgJiYgUlBDUG9ydCA+PSAwICYmIFJQQ1BvcnQgPD0gNjU1MzUsICdSUENQb3J0IG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDY1NTM1JykKICAgICYmIGFwaS5hc3NlcnQoUDJQUG9ydCAmJiBOdW1iZXIuaXNJbnRlZ2VyKFAyUFBvcnQpICYmIFAyUFBvcnQgPj0gMCAmJiBQMlBQb3J0IDw9IDY1NTM1LCAnUDJQUG9ydCBtdXN0IGJlIGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCA2NTUzNScpCiAgICAmJiBhcGkuYXNzZXJ0KGFwaS52YWxpZGF0b3IuaXNBbHBoYW51bWVyaWMoc2lnbmluZ0tleSkgJiYgc2lnbmluZ0tleS5sZW5ndGggPT09IDUzLCAnaW52YWxpZCBzaWduaW5nIGtleScpCiAgICAmJiBhcGkuYXNzZXJ0KHR5cGVvZiBlbmFibGVkID09PSAnYm9vbGVhbicsICdlbmFibGVkIG11c3QgYmUgYSBib29sZWFuJykpIHsKICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGFscmVhZHkgYSB3aXRuZXNzIHdpdGggdGhlIHNhbWUgc2lnbmluZyBrZXkKICAgIGxldCB3aXRuZXNzID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ3dpdG5lc3NlcycsIHsgc2lnbmluZ0tleSB9KTsKCiAgICBpZiAoYXBpLmFzc2VydCh3aXRuZXNzID09PSBudWxsIHx8IHdpdG5lc3MuYWNjb3VudCA9PT0gYXBpLnNlbmRlciwgJ2Egd2l0bmVzcyBpcyBhbHJlYWR5IHVzaW5nIHRoaXMgc2lnbmluZyBrZXknKSkgewogICAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgd2l0bmVzcyB3aXRoIHRoZSBzYW1lIElQL1BvcnQKICAgICAgd2l0bmVzcyA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCd3aXRuZXNzZXMnLCB7IElQLCBQMlBQb3J0IH0pOwoKICAgICAgaWYgKGFwaS5hc3NlcnQod2l0bmVzcyA9PT0gbnVsbCB8fCB3aXRuZXNzLmFjY291bnQgPT09IGFwaS5zZW5kZXIsICdhIHdpdG5lc3MgaXMgYWxyZWFkeSB1c2luZyB0aGlzIElQL1BvcnQnKSkgewogICAgICAgIHdpdG5lc3MgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgnd2l0bmVzc2VzJywgeyBhY2NvdW50OiBhcGkuc2VuZGVyIH0pOwoKICAgICAgICAvLyBpZiB0aGUgd2l0bmVzcyBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQKICAgICAgICBpZiAod2l0bmVzcykgewogICAgICAgICAgd2l0bmVzcy5JUCA9IElQOwogICAgICAgICAgd2l0bmVzcy5SUENQb3J0ID0gUlBDUG9ydDsKICAgICAgICAgIHdpdG5lc3MuUDJQUG9ydCA9IFAyUFBvcnQ7CiAgICAgICAgICB3aXRuZXNzLnNpZ25pbmdLZXkgPSBzaWduaW5nS2V5OwogICAgICAgICAgd2l0bmVzcy5lbmFibGVkID0gZW5hYmxlZDsKICAgICAgICAgIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3dpdG5lc3NlcycsIHdpdG5lc3MpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB3aXRuZXNzID0gewogICAgICAgICAgICBhY2NvdW50OiBhcGkuc2VuZGVyLAogICAgICAgICAgICBhcHByb3ZhbFdlaWdodDogeyAkbnVtYmVyRGVjaW1hbDogJzAnIH0sCiAgICAgICAgICAgIHNpZ25pbmdLZXksCiAgICAgICAgICAgIElQLAogICAgICAgICAgICBSUENQb3J0LAogICAgICAgICAgICBQMlBQb3J0LAogICAgICAgICAgICBlbmFibGVkLAogICAgICAgICAgICBtaXNzZWRSb3VuZHM6IDAsCiAgICAgICAgICAgIG1pc3NlZFJvdW5kc0luQVJvdzogMCwKICAgICAgICAgICAgdmVyaWZpZWRSb3VuZHM6IDAsCiAgICAgICAgICAgIGxhc3RSb3VuZFZlcmlmaWVkOiBudWxsLAogICAgICAgICAgICBsYXN0QmxvY2tWZXJpZmllZDogbnVsbCwKICAgICAgICAgIH07CiAgICAgICAgICBhd2FpdCBhcGkuZGIuaW5zZXJ0KCd3aXRuZXNzZXMnLCB3aXRuZXNzKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn07CgphY3Rpb25zLmFwcHJvdmUgPSBhc3luYyAocGF5bG9hZCkgPT4gewogIGNvbnN0IHsgd2l0bmVzcyB9ID0gcGF5bG9hZDsKCiAgaWYgKGFwaS5hc3NlcnQod2l0bmVzcyAmJiB0eXBlb2Ygd2l0bmVzcyA9PT0gJ3N0cmluZycgJiYgd2l0bmVzcy5sZW5ndGggPj0gMyAmJiB3aXRuZXNzLmxlbmd0aCA8PSAxNiwgJ2ludmFsaWQgd2l0bmVzcyBhY2NvdW50JykpIHsKICAgIC8vIGNoZWNrIGlmIHdpdG5lc3MgZXhpc3RzCiAgICBjb25zdCB3aXRuZXNzUmVjID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ3dpdG5lc3NlcycsIHsgYWNjb3VudDogd2l0bmVzcyB9KTsKCiAgICBpZiAoYXBpLmFzc2VydCh3aXRuZXNzUmVjLCAnd2l0bmVzcyBkb2VzIG5vdCBleGlzdCcpKSB7CiAgICAgIGxldCBhY2N0ID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ2FjY291bnRzJywgeyBhY2NvdW50OiBhcGkuc2VuZGVyIH0pOwoKICAgICAgaWYgKGFjY3QgPT09IG51bGwpIHsKICAgICAgICBhY2N0ID0gewogICAgICAgICAgYWNjb3VudDogYXBpLnNlbmRlciwKICAgICAgICAgIGFwcHJvdmFsczogMCwKICAgICAgICAgIGFwcHJvdmFsV2VpZ2h0OiB7ICRudW1iZXJEZWNpbWFsOiAnMCcgfSwKICAgICAgICB9OwoKICAgICAgICBhY2N0ID0gYXdhaXQgYXBpLmRiLmluc2VydCgnYWNjb3VudHMnLCBhY2N0KTsKICAgICAgfQoKICAgICAgLy8gYSB1c2VyIGNhbiBhcHByb3ZlIE5CX0FQUFJPVkFMU19BTExPV0VEIHdpdG5lc3NlcyBvbmx5CiAgICAgIGlmIChhcGkuYXNzZXJ0KGFjY3QuYXBwcm92YWxzIDwgTkJfQVBQUk9WQUxTX0FMTE9XRUQsIGB5b3UgY2FuIG9ubHkgYXBwcm92ZSAke05CX0FQUFJPVkFMU19BTExPV0VEfSB3aXRuZXNzZXNgKSkgewogICAgICAgIGxldCBhcHByb3ZhbCA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdhcHByb3ZhbHMnLCB7IGZyb206IGFwaS5zZW5kZXIsIHRvOiB3aXRuZXNzIH0pOwoKICAgICAgICBpZiAoYXBpLmFzc2VydChhcHByb3ZhbCA9PT0gbnVsbCwgJ3lvdSBhbHJlYWR5IGFwcHJvdmVkIHRoaXMgd2l0bmVzcycpKSB7CiAgICAgICAgICBhcHByb3ZhbCA9IHsKICAgICAgICAgICAgZnJvbTogYXBpLnNlbmRlciwKICAgICAgICAgICAgdG86IHdpdG5lc3MsCiAgICAgICAgICB9OwogICAgICAgICAgYXdhaXQgYXBpLmRiLmluc2VydCgnYXBwcm92YWxzJywgYXBwcm92YWwpOwoKICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgcmFuayBvZiB0aGUgd2l0bmVzcyB0aGF0IHJlY2VpdmVkIHRoZSBhcHByb3ZhbAogICAgICAgICAgY29uc3QgYmFsYW5jZSA9IGF3YWl0IGFwaS5kYi5maW5kT25lSW5UYWJsZSgndG9rZW5zJywgJ2JhbGFuY2VzJywgeyBhY2NvdW50OiBhcGkuc2VuZGVyLCBzeW1ib2w6IFVUSUxJVFlfVE9LRU5fU1lNQk9MIH0pOwogICAgICAgICAgbGV0IGFwcHJvdmFsV2VpZ2h0ID0gMDsKICAgICAgICAgIGlmIChiYWxhbmNlICYmIGJhbGFuY2Uuc3Rha2UpIHsKICAgICAgICAgICAgYXBwcm92YWxXZWlnaHQgPSBiYWxhbmNlLnN0YWtlOwogICAgICAgICAgfQoKICAgICAgICAgIGlmIChiYWxhbmNlICYmIGJhbGFuY2UucGVuZGluZ1Vuc3Rha2UpIHsKICAgICAgICAgICAgYXBwcm92YWxXZWlnaHQgPSBhcGkuQmlnTnVtYmVyKGFwcHJvdmFsV2VpZ2h0KQogICAgICAgICAgICAgIC5wbHVzKGJhbGFuY2UucGVuZGluZ1Vuc3Rha2UpCiAgICAgICAgICAgICAgLnRvRml4ZWQoVVRJTElUWV9UT0tFTl9QUkVDSVNJT04pOwogICAgICAgICAgfQoKICAgICAgICAgIGlmIChiYWxhbmNlICYmIGJhbGFuY2UuZGVsZWdhdGlvbnNJbikgewogICAgICAgICAgICBhcHByb3ZhbFdlaWdodCA9IGFwaS5CaWdOdW1iZXIoYXBwcm92YWxXZWlnaHQpCiAgICAgICAgICAgICAgLnBsdXMoYmFsYW5jZS5kZWxlZ2F0aW9uc0luKQogICAgICAgICAgICAgIC50b0ZpeGVkKFVUSUxJVFlfVE9LRU5fUFJFQ0lTSU9OKTsKICAgICAgICAgIH0KCiAgICAgICAgICBhY2N0LmFwcHJvdmFscyArPSAxOwogICAgICAgICAgYWNjdC5hcHByb3ZhbFdlaWdodCA9IGFwcHJvdmFsV2VpZ2h0OwoKICAgICAgICAgIGF3YWl0IGFwaS5kYi51cGRhdGUoJ2FjY291bnRzJywgYWNjdCk7CgogICAgICAgICAgYXdhaXQgdXBkYXRlV2l0bmVzc1Jhbmsod2l0bmVzcywgYXBwcm92YWxXZWlnaHQpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfTsKCmFjdGlvbnMuZGlzYXBwcm92ZSA9IGFzeW5jIChwYXlsb2FkKSA9PiB7CiAgY29uc3QgeyB3aXRuZXNzIH0gPSBwYXlsb2FkOwoKICBpZiAoYXBpLmFzc2VydCh3aXRuZXNzICYmIHR5cGVvZiB3aXRuZXNzID09PSAnc3RyaW5nJyAmJiB3aXRuZXNzLmxlbmd0aCA+PSAzICYmIHdpdG5lc3MubGVuZ3RoIDw9IDE2LCAnaW52YWxpZCB3aXRuZXNzIGFjY291bnQnKSkgewogICAgLy8gY2hlY2sgaWYgd2l0bmVzcyBleGlzdHMKICAgIGNvbnN0IHdpdG5lc3NSZWMgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgnd2l0bmVzc2VzJywgeyBhY2NvdW50OiB3aXRuZXNzIH0pOwoKCiAgICBpZiAoYXBpLmFzc2VydCh3aXRuZXNzUmVjLCAnd2l0bmVzcyBkb2VzIG5vdCBleGlzdCcpKSB7CiAgICAgIGxldCBhY2N0ID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ2FjY291bnRzJywgeyBhY2NvdW50OiBhcGkuc2VuZGVyIH0pOwoKICAgICAgaWYgKGFjY3QgPT09IG51bGwpIHsKICAgICAgICBhY2N0ID0gewogICAgICAgICAgYWNjb3VudDogYXBpLnNlbmRlciwKICAgICAgICAgIGFwcHJvdmFsczogMCwKICAgICAgICAgIGFwcHJvdmFsV2VpZ2h0OiB7ICRudW1iZXJEZWNpbWFsOiAnMCcgfSwKICAgICAgICB9OwoKICAgICAgICBhd2FpdCBhcGkuZGIuaW5zZXJ0KCdhY2NvdW50cycsIGFjY3QpOwogICAgICB9CgogICAgICAvLyBhIHVzZXIgY2FuIG9ubHkgZGlzYXBwcm92ZSBpZiBpdCBhbHJlYWR5IGFwcHJvdmVkIGEgd2l0bmVzcwogICAgICBpZiAoYXBpLmFzc2VydChhY2N0LmFwcHJvdmFscyA+IDAsICdubyBhcHByb3ZhbHMgZm91bmQnKSkgewogICAgICAgIGNvbnN0IGFwcHJvdmFsID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ2FwcHJvdmFscycsIHsgZnJvbTogYXBpLnNlbmRlciwgdG86IHdpdG5lc3MgfSk7CgogICAgICAgIGlmIChhcGkuYXNzZXJ0KGFwcHJvdmFsICE9PSBudWxsLCAneW91IGhhdmUgbm90IGFwcHJvdmVkIHRoaXMgd2l0bmVzcycpKSB7CiAgICAgICAgICBhd2FpdCBhcGkuZGIucmVtb3ZlKCdhcHByb3ZhbHMnLCBhcHByb3ZhbCk7CgogICAgICAgICAgY29uc3QgYmFsYW5jZSA9IGF3YWl0IGFwaS5kYi5maW5kT25lSW5UYWJsZSgndG9rZW5zJywgJ2JhbGFuY2VzJywgeyBhY2NvdW50OiBhcGkuc2VuZGVyLCBzeW1ib2w6IFVUSUxJVFlfVE9LRU5fU1lNQk9MIH0pOwogICAgICAgICAgbGV0IGFwcHJvdmFsV2VpZ2h0ID0gMDsKICAgICAgICAgIGlmIChiYWxhbmNlICYmIGJhbGFuY2Uuc3Rha2UpIHsKICAgICAgICAgICAgYXBwcm92YWxXZWlnaHQgPSBiYWxhbmNlLnN0YWtlOwogICAgICAgICAgfQoKICAgICAgICAgIGlmIChiYWxhbmNlICYmIGJhbGFuY2UuZGVsZWdhdGlvbnNJbikgewogICAgICAgICAgICBhcHByb3ZhbFdlaWdodCA9IGFwaS5CaWdOdW1iZXIoYXBwcm92YWxXZWlnaHQpCiAgICAgICAgICAgICAgLnBsdXMoYmFsYW5jZS5kZWxlZ2F0aW9uc0luKQogICAgICAgICAgICAgIC50b0ZpeGVkKFVUSUxJVFlfVE9LRU5fUFJFQ0lTSU9OKTsKICAgICAgICAgIH0KCiAgICAgICAgICBhY2N0LmFwcHJvdmFscyAtPSAxOwogICAgICAgICAgYWNjdC5hcHByb3ZhbFdlaWdodCA9IGFwcHJvdmFsV2VpZ2h0OwoKICAgICAgICAgIGF3YWl0IGFwaS5kYi51cGRhdGUoJ2FjY291bnRzJywgYWNjdCk7CgogICAgICAgICAgLy8gdXBkYXRlIHRoZSByYW5rIG9mIHRoZSB3aXRuZXNzIHRoYXQgcmVjZWl2ZWQgdGhlIGRpc2FwcHJvdmFsCiAgICAgICAgICBhd2FpdCB1cGRhdGVXaXRuZXNzUmFuayh3aXRuZXNzLCBgLSR7YXBwcm92YWxXZWlnaHR9YCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9OwoKY29uc3QgY2hhbmdlQ3VycmVudFdpdG5lc3MgPSBhc3luYyAoKSA9PiB7CiAgY29uc3QgcGFyYW1zID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ3BhcmFtcycsIHt9KTsKICBjb25zdCB7CiAgICBjdXJyZW50V2l0bmVzcywKICAgIHRvdGFsQXBwcm92YWxXZWlnaHQsCiAgICBsYXN0V2l0bmVzc2VzLAogICAgbGFzdEJsb2NrUm91bmQsCiAgICByb3VuZCwKICB9ID0gcGFyYW1zOwoKICBsZXQgd2l0bmVzc0ZvdW5kID0gZmFsc2U7CiAgLy8gZ2V0IGEgZGV0ZXJtaW5pc3RpYyByYW5kb20gd2VpZ2h0CiAgY29uc3QgcmFuZG9tID0gYXBpLnJhbmRvbSgpOwogIGNvbnN0IHJhbmRvbVdlaWdodCA9IGFwaS5CaWdOdW1iZXIodG90YWxBcHByb3ZhbFdlaWdodCkKICAgIC50aW1lcyhyYW5kb20pCiAgICAudG9GaXhlZChVVElMSVRZX1RPS0VOX1BSRUNJU0lPTik7CgogIGxldCBvZmZzZXQgPSAwOwogIGxldCBhY2NXZWlnaHQgPSAwOwoKICBsZXQgd2l0bmVzc2VzID0gYXdhaXQgYXBpLmRiLmZpbmQoCiAgICAnd2l0bmVzc2VzJywKICAgIHsKICAgICAgYXBwcm92YWxXZWlnaHQ6IHsKICAgICAgICAkZ3Q6IHsKICAgICAgICAgICRudW1iZXJEZWNpbWFsOiAnMCcsCiAgICAgICAgfSwKICAgICAgfSwKICAgIH0sCiAgICAxMDAsIC8vIGxpbWl0CiAgICBvZmZzZXQsIC8vIG9mZnNldAogICAgWwogICAgICB7IGluZGV4OiAnYXBwcm92YWxXZWlnaHQnLCBkZXNjZW5kaW5nOiB0cnVlIH0sCiAgICBdLAogICk7CiAgLy8gZ2V0IHRoZSB3aXRuZXNzZXMgb24gc2NoZWR1bGUKICBjb25zdCBzY2hlZHVsZXMgPSBhd2FpdCBhcGkuZGIuZmluZCgnc2NoZWR1bGVzJywgeyByb3VuZCB9KTsKCiAgY29uc3QgcHJldmlvdXNSb3VuZFdpdG5lc3MgPSBsYXN0V2l0bmVzc2VzLmxlbmd0aCA+IDEgPyBsYXN0V2l0bmVzc2VzW2xhc3RXaXRuZXNzZXMubGVuZ3RoIC0gMl0gOiAnJzsKCiAgLy8gZ2V0IHRoZSBjdXJyZW50IHNjaGVkdWxlCiAgY29uc3Qgc2NoZWR1bGUgPSBhd2FpdCBhcGkuZGIKICAgIC5maW5kT25lKCdzY2hlZHVsZXMnLCB7IHJvdW5kLCB3aXRuZXNzOiBjdXJyZW50V2l0bmVzcywgYmxvY2tOdW1iZXI6IGxhc3RCbG9ja1JvdW5kIH0pOwoKICBkbyB7CiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgd2l0bmVzc2VzLmxlbmd0aDsgaW5kZXggKz0gMSkgewogICAgICBjb25zdCB3aXRuZXNzID0gd2l0bmVzc2VzW2luZGV4XTsKCiAgICAgIGFjY1dlaWdodCA9IGFwaS5CaWdOdW1iZXIoYWNjV2VpZ2h0KQogICAgICAgIC5wbHVzKHdpdG5lc3MuYXBwcm92YWxXZWlnaHQuJG51bWJlckRlY2ltYWwpCiAgICAgICAgLnRvRml4ZWQoVVRJTElUWV9UT0tFTl9QUkVDSVNJT04pOwoKICAgICAgLy8gaWYgdGhlIHdpdG5lc3MgaXMgZW5hYmxlZAogICAgICAvLyBhbmQgZGlmZmVyZW50IGZyb20gdGhlIHNjaGVkdWxlZCBvbmUgZnJvbSB0aGUgcHJldmlvdXMgcm91bmQKICAgICAgLy8gYW5kIGRpZmZlcmVudCBmcm9tIGFuIGFscmVhZHkgc2NoZWR1bGVkIHdpdG5lc3MgZm9yIHRoaXMgcm91bmQKICAgICAgaWYgKHdpdG5lc3MuZW5hYmxlZCA9PT0gdHJ1ZQogICAgICAgICYmIHdpdG5lc3MuYWNjb3VudCAhPT0gcHJldmlvdXNSb3VuZFdpdG5lc3MKICAgICAgICAmJiBzY2hlZHVsZXMuZmluZChzID0+IHMud2l0bmVzcyA9PT0gd2l0bmVzcy5hY2NvdW50KSA9PT0gdW5kZWZpbmVkCiAgICAgICAgJiYgYXBpLkJpZ051bWJlcihyYW5kb21XZWlnaHQpLmx0ZShhY2NXZWlnaHQpKSB7CiAgICAgICAgYXBpLmRlYnVnKGBjaGFuZ2VkIGN1cnJlbnQgd2l0bmVzcyBmcm9tICR7c2NoZWR1bGUud2l0bmVzc30gdG8gJHt3aXRuZXNzLmFjY291bnR9YCk7CiAgICAgICAgc2NoZWR1bGUud2l0bmVzcyA9IHdpdG5lc3MuYWNjb3VudDsKICAgICAgICBhd2FpdCBhcGkuZGIudXBkYXRlKCdzY2hlZHVsZXMnLCBzY2hlZHVsZSk7CiAgICAgICAgcGFyYW1zLmN1cnJlbnRXaXRuZXNzID0gd2l0bmVzcy5hY2NvdW50OwogICAgICAgIHBhcmFtcy5sYXN0V2l0bmVzc2VzLnB1c2god2l0bmVzcy5hY2NvdW50KTsKICAgICAgICBwYXJhbXMuYmxvY2tOdW1iZXJXaXRuZXNzQ2hhbmdlID0gYXBpLnJlZlN0ZWVtQmxvY2tOdW1iZXIKICAgICAgICAgICsgTUFYX1JPVU5EX1BST1BPU0lUSU9OX1dBSVRJTkdfUEVSSU9EOwogICAgICAgIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3BhcmFtcycsIHBhcmFtcyk7CgogICAgICAgIC8vIHVwZGF0ZSB0aGUgY3VycmVudCB3aXRuZXNzCiAgICAgICAgY29uc3Qgc2NoZWR1bGVkV2l0bmVzcyA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCd3aXRuZXNzZXMnLCB7IGFjY291bnQ6IGN1cnJlbnRXaXRuZXNzIH0pOwogICAgICAgIHNjaGVkdWxlZFdpdG5lc3MubWlzc2VkUm91bmRzICs9IDE7CiAgICAgICAgc2NoZWR1bGVkV2l0bmVzcy5taXNzZWRSb3VuZHNJbkFSb3cgKz0gMTsKCiAgICAgICAgLy8gZGlzYWJsZSB0aGUgd2l0bmVzcyBpZiBtaXNzZWQgTUFYX1JPVU5EU19NSVNTRURfSU5fQV9ST1cKICAgICAgICBpZiAoc2NoZWR1bGVkV2l0bmVzcy5taXNzZWRSb3VuZHNJbkFSb3cgPj0gTUFYX1JPVU5EU19NSVNTRURfSU5fQV9ST1cpIHsKICAgICAgICAgIHNjaGVkdWxlZFdpdG5lc3MubWlzc2VkUm91bmRzSW5BUm93ID0gMDsKICAgICAgICAgIHNjaGVkdWxlZFdpdG5lc3MuZW5hYmxlZCA9IGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgnd2l0bmVzc2VzJywgc2NoZWR1bGVkV2l0bmVzcyk7CiAgICAgICAgd2l0bmVzc0ZvdW5kID0gdHJ1ZTsKICAgICAgICBhcGkuZW1pdCgnY3VycmVudFdpdG5lc3NDaGFuZ2VkJywgeyB9KTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQoKICAgIGlmICh3aXRuZXNzRm91bmQgPT09IGZhbHNlKSB7CiAgICAgIG9mZnNldCArPSAxMDA7CiAgICAgIHdpdG5lc3NlcyA9IGF3YWl0IGFwaS5kYi5maW5kKAogICAgICAgICd3aXRuZXNzZXMnLAogICAgICAgIHsKICAgICAgICAgIGFwcHJvdmFsV2VpZ2h0OiB7CiAgICAgICAgICAgICRndDogewogICAgICAgICAgICAgICRudW1iZXJEZWNpbWFsOiAnMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgMTAwLCAvLyBsaW1pdAogICAgICAgIG9mZnNldCwgLy8gb2Zmc2V0CiAgICAgICAgWwogICAgICAgICAgeyBpbmRleDogJ2FwcHJvdmFsV2VpZ2h0JywgZGVzY2VuZGluZzogdHJ1ZSB9LAogICAgICAgIF0sCiAgICAgICk7CiAgICB9CiAgfSB3aGlsZSAod2l0bmVzc2VzLmxlbmd0aCA+IDAgJiYgd2l0bmVzc0ZvdW5kID09PSBmYWxzZSk7CgogIGlmICh3aXRuZXNzRm91bmQgPT09IGZhbHNlKSB7CiAgICBhcGkuZGVidWcoJ25vIGJhY2t1cCB3aXRuZXNzIHdhcyBmb3VuZCwgaW50ZXJjaGFuZ2luZyB3aXRuZXNzZXMgd2l0aGluIHRoZSBjdXJyZW50IHNjaGVkdWxlJyk7CiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc2NoZWR1bGVzLmxlbmd0aCAtIDE7IGluZGV4ICs9IDEpIHsKICAgICAgY29uc3Qgc2NoZWQgPSBzY2hlZHVsZXNbaW5kZXhdOwogICAgICBjb25zdCBuZXdXaXRuZXNzID0gc2NoZWQud2l0bmVzczsKICAgICAgaWYgKG5ld1dpdG5lc3MgIT09IHByZXZpb3VzUm91bmRXaXRuZXNzKSB7CiAgICAgICAgYXBpLmRlYnVnKGBjaGFuZ2VkIGN1cnJlbnQgd2l0bmVzcyBmcm9tICR7Y3VycmVudFdpdG5lc3N9IHRvICR7bmV3V2l0bmVzc31gKTsKICAgICAgICBzY2hlZHVsZS53aXRuZXNzID0gbmV3V2l0bmVzczsKICAgICAgICBhd2FpdCBhcGkuZGIudXBkYXRlKCdzY2hlZHVsZXMnLCBzY2hlZHVsZSk7CiAgICAgICAgc2NoZWQud2l0bmVzcyA9IGN1cnJlbnRXaXRuZXNzOwogICAgICAgIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3NjaGVkdWxlcycsIHNjaGVkKTsKICAgICAgICBwYXJhbXMuY3VycmVudFdpdG5lc3MgPSBuZXdXaXRuZXNzOwogICAgICAgIHBhcmFtcy5sYXN0V2l0bmVzc2VzLnB1c2gobmV3V2l0bmVzcyk7CiAgICAgICAgcGFyYW1zLmJsb2NrTnVtYmVyV2l0bmVzc0NoYW5nZSA9IGFwaS5yZWZTdGVlbUJsb2NrTnVtYmVyCiAgICAgICAgICArIE1BWF9ST1VORF9QUk9QT1NJVElPTl9XQUlUSU5HX1BFUklPRDsKICAgICAgICBhd2FpdCBhcGkuZGIudXBkYXRlKCdwYXJhbXMnLCBwYXJhbXMpOwoKICAgICAgICAvLyB1cGRhdGUgdGhlIGN1cnJlbnQgd2l0bmVzcwogICAgICAgIGNvbnN0IHNjaGVkdWxlZFdpdG5lc3MgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgnd2l0bmVzc2VzJywgeyBhY2NvdW50OiBjdXJyZW50V2l0bmVzcyB9KTsKICAgICAgICBzY2hlZHVsZWRXaXRuZXNzLm1pc3NlZFJvdW5kcyArPSAxOwogICAgICAgIHNjaGVkdWxlZFdpdG5lc3MubWlzc2VkUm91bmRzSW5BUm93ICs9IDE7CgogICAgICAgIC8vIGRpc2FibGUgdGhlIHdpdG5lc3MgaWYgbWlzc2VkIE1BWF9ST1VORFNfTUlTU0VEX0lOX0FfUk9XCiAgICAgICAgaWYgKHNjaGVkdWxlZFdpdG5lc3MubWlzc2VkUm91bmRzSW5BUm93ID49IE1BWF9ST1VORFNfTUlTU0VEX0lOX0FfUk9XKSB7CiAgICAgICAgICBzY2hlZHVsZWRXaXRuZXNzLm1pc3NlZFJvdW5kc0luQVJvdyA9IDA7CiAgICAgICAgICBzY2hlZHVsZWRXaXRuZXNzLmVuYWJsZWQgPSBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3dpdG5lc3NlcycsIHNjaGVkdWxlZFdpdG5lc3MpOwogICAgICAgIGFwaS5lbWl0KCdjdXJyZW50V2l0bmVzc0NoYW5nZWQnLCB7IH0pOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgfQp9OwoKY29uc3QgbWFuYWdlV2l0bmVzc2VzU2NoZWR1bGUgPSBhc3luYyAoKSA9PiB7CiAgaWYgKGFwaS5zZW5kZXIgIT09ICdudWxsJykgcmV0dXJuOwoKICBjb25zdCBwYXJhbXMgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgncGFyYW1zJywge30pOwogIGNvbnN0IHsKICAgIG51bWJlck9mQXBwcm92ZWRXaXRuZXNzZXMsCiAgICB0b3RhbEFwcHJvdmFsV2VpZ2h0LAogICAgbGFzdFZlcmlmaWVkQmxvY2tOdW1iZXIsCiAgICBibG9ja051bWJlcldpdG5lc3NDaGFuZ2UsCiAgICBsYXN0QmxvY2tSb3VuZCwKICB9ID0gcGFyYW1zOwoKICAvLyBjaGVjayB0aGUgY3VycmVudCBzY2hlZHVsZQogIGNvbnN0IGN1cnJlbnRCbG9jayA9IGxhc3RWZXJpZmllZEJsb2NrTnVtYmVyICsgMTsKICBsZXQgc2NoZWR1bGUgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgnc2NoZWR1bGVzJywgeyBibG9ja051bWJlcjogY3VycmVudEJsb2NrIH0pOwoKICAvLyBpZiB0aGUgY3VycmVudCBibG9jayBoYXMgbm90IGJlZW4gc2NoZWR1bGVkIGFscmVhZHkgd2UgaGF2ZSB0byBjcmVhdGUgYSBuZXcgc2NoZWR1bGUKICBpZiAoc2NoZWR1bGUgPT09IG51bGwpIHsKICAgIGFwaS5kZWJ1ZygnY2FsY3VsYXRpbmcgbmV3IHNjaGVkdWxlJyk7CiAgICBzY2hlZHVsZSA9IFtdOwoKICAgIC8vIHRoZXJlIGhhcyB0byBiZSBlbm91Z2ggdG9wIHdpdG5lc3NlcyB0byBzdGFydCBhIHNjaGVkdWxlCiAgICBpZiAobnVtYmVyT2ZBcHByb3ZlZFdpdG5lc3NlcyA+PSBOQl9XSVRORVNTRVMpIHsKICAgICAgLyoKICAgICAgICBleGFtcGxlOgogICAgICAgIC0+IHRvdGFsIGFwcHJvdmFsIHdlaWdodCA9IDEwLDAwMAogICAgICAgIC0+ICBhcHByb3ZhbCB3ZWlnaHRzOgogICAgICAgICAgYWNjdCBBIDogMTAwMCAoZnJvbSAwIHRvIDEwMDApCiAgICAgICAgICBhY2N0IEIgOiA5MDAgKGZyb20gMTAwMC4wMDAwMDAwMSB0byAxOTAwKQogICAgICAgICAgYWNjdCBDIDogODAwIChmcm9tIDE5MDAuMDAwMDAwMDEgdG8gMjcwMCkKICAgICAgICAgIGFjY3QgRCA6IDcwMCAoZnJvbSAyNzAwLjAwMDAwMDAxIHRvIDM0MDApCiAgICAgICAgICAuLi4KICAgICAgICAgIGFjY3QgbiA6IGZyb20gKChuLTEpLnVwcGVyQm91bmQgKyAwLjAwMDAwMDAxKSB0byAxMCwwMDApCgogICAgICAgICAgLT4gdG90YWwgYXBwcm92YWwgd2VpZ2h0IHRvcCB3aXRuZXNzZXMgKEEtRCkgPSAzLDQwMAogICAgICAgICAgLT4gcGljayB1cCBiYWNrdXAgd2l0bmVzc2VzIChFLW4pOiB3ZWlnaHQgcmFuZ2U6CiAgICAgICAgICAgIGZyb20gMyw0MDAuMDAwMDAwMSB0byAxMCwwMDAKICAgICAgKi8KCiAgICAgIC8vIGdldCBhIGRldGVybWluaXN0aWMgcmFuZG9tIHdlaWdodAogICAgICBjb25zdCByYW5kb20gPSBhcGkucmFuZG9tKCk7CiAgICAgIGxldCByYW5kb21XZWlnaHQgPSBudWxsOwoKICAgICAgbGV0IG9mZnNldCA9IDA7CiAgICAgIGxldCBhY2NXZWlnaHQgPSAwOwoKICAgICAgbGV0IHdpdG5lc3NlcyA9IGF3YWl0IGFwaS5kYi5maW5kKAogICAgICAgICd3aXRuZXNzZXMnLAogICAgICAgIHsKICAgICAgICAgIGFwcHJvdmFsV2VpZ2h0OiB7CiAgICAgICAgICAgICRndDogewogICAgICAgICAgICAgICRudW1iZXJEZWNpbWFsOiAnMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgMTAwLCAvLyBsaW1pdAogICAgICAgIG9mZnNldCwgLy8gb2Zmc2V0CiAgICAgICAgWwogICAgICAgICAgeyBpbmRleDogJ2FwcHJvdmFsV2VpZ2h0JywgZGVzY2VuZGluZzogdHJ1ZSB9LAogICAgICAgIF0sCiAgICAgICk7CgogICAgICBkbyB7CiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHdpdG5lc3Nlcy5sZW5ndGg7IGluZGV4ICs9IDEpIHsKICAgICAgICAgIGNvbnN0IHdpdG5lc3MgPSB3aXRuZXNzZXNbaW5kZXhdOwoKICAgICAgICAgIC8vIGNhbGN1bGF0ZSBhIHJhbmRvbSB3ZWlnaHQgaWYgbm90IGRvbmUgeWV0CiAgICAgICAgICBpZiAoc2NoZWR1bGUubGVuZ3RoID49IE5CX1RPUF9XSVRORVNTRVMKICAgICAgICAgICAgJiYgcmFuZG9tV2VpZ2h0ID09PSBudWxsKSB7CiAgICAgICAgICAgIGNvbnN0IG1pbiA9IGFwaS5CaWdOdW1iZXIoYWNjV2VpZ2h0KQogICAgICAgICAgICAgIC5wbHVzKFVUSUxJVFlfVE9LRU5fTUlOX1ZBTFVFKTsKCiAgICAgICAgICAgIHJhbmRvbVdlaWdodCA9IGFwaS5CaWdOdW1iZXIodG90YWxBcHByb3ZhbFdlaWdodCkKICAgICAgICAgICAgICAubWludXMobWluKQogICAgICAgICAgICAgIC50aW1lcyhyYW5kb20pCiAgICAgICAgICAgICAgLnBsdXMobWluKQogICAgICAgICAgICAgIC50b0ZpeGVkKFVUSUxJVFlfVE9LRU5fUFJFQ0lTSU9OKTsKICAgICAgICAgIH0KCiAgICAgICAgICBhY2NXZWlnaHQgPSBhcGkuQmlnTnVtYmVyKGFjY1dlaWdodCkKICAgICAgICAgICAgLnBsdXMod2l0bmVzcy5hcHByb3ZhbFdlaWdodC4kbnVtYmVyRGVjaW1hbCkKICAgICAgICAgICAgLnRvRml4ZWQoVVRJTElUWV9UT0tFTl9QUkVDSVNJT04pOwoKICAgICAgICAgIC8vIGlmIHRoZSB3aXRuZXNzIGlzIGVuYWJsZWQKICAgICAgICAgIGlmICh3aXRuZXNzLmVuYWJsZWQgPT09IHRydWUpIHsKICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZW4ndCBmb3VuZCBhbGwgdGhlIHRvcCB3aXRuZXNzZXMgeWV0CiAgICAgICAgICAgIGlmIChzY2hlZHVsZS5sZW5ndGggPCBOQl9UT1BfV0lUTkVTU0VTCiAgICAgICAgICAgICAgfHwgYXBpLkJpZ051bWJlcihyYW5kb21XZWlnaHQpLmx0ZShhY2NXZWlnaHQpKSB7CiAgICAgICAgICAgICAgc2NoZWR1bGUucHVzaCh7CiAgICAgICAgICAgICAgICB3aXRuZXNzOiB3aXRuZXNzLmFjY291bnQsCiAgICAgICAgICAgICAgICBibG9ja051bWJlcjogbnVsbCwKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIGlmIChzY2hlZHVsZS5sZW5ndGggPj0gTkJfV0lUTkVTU0VTKSB7CiAgICAgICAgICAgIGluZGV4ID0gd2l0bmVzc2VzLmxlbmd0aDsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChzY2hlZHVsZS5sZW5ndGggPCBOQl9XSVRORVNTRVMpIHsKICAgICAgICAgIG9mZnNldCArPSAxMDA7CiAgICAgICAgICB3aXRuZXNzZXMgPSBhd2FpdCBhcGkuZGIuZmluZCgKICAgICAgICAgICAgJ3dpdG5lc3NlcycsCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBhcHByb3ZhbFdlaWdodDogewogICAgICAgICAgICAgICAgJGd0OiB7CiAgICAgICAgICAgICAgICAgICRudW1iZXJEZWNpbWFsOiAnMCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDEwMCwgLy8gbGltaXQKICAgICAgICAgICAgb2Zmc2V0LCAvLyBvZmZzZXQKICAgICAgICAgICAgWwogICAgICAgICAgICAgIHsgaW5kZXg6ICdhcHByb3ZhbFdlaWdodCcsIGRlc2NlbmRpbmc6IHRydWUgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICB9IHdoaWxlICh3aXRuZXNzZXMubGVuZ3RoID4gMCAmJiBzY2hlZHVsZS5sZW5ndGggPCBOQl9XSVRORVNTRVMpOwogICAgfQoKICAgIC8vIGlmIHRoZXJlIGFyZSBlbm91Z2ggd2l0bmVzc2VzIHNjaGVkdWxlZAogICAgaWYgKHNjaGVkdWxlLmxlbmd0aCA9PT0gTkJfV0lUTkVTU0VTKSB7CiAgICAgIC8vIHNodWZmbGUgdGhlIHdpdG5lc3NlcwogICAgICBsZXQgajsgbGV0IHg7CiAgICAgIGZvciAobGV0IGkgPSBzY2hlZHVsZS5sZW5ndGggLSAxOyBpID4gMDsgaSAtPSAxKSB7CiAgICAgICAgY29uc3QgcmFuZG9tID0gYXBpLnJhbmRvbSgpOwogICAgICAgIGogPSBNYXRoLmZsb29yKHJhbmRvbSAqIChpICsgMSkpOwogICAgICAgIHggPSBzY2hlZHVsZVtpXTsKICAgICAgICBzY2hlZHVsZVtpXSA9IHNjaGVkdWxlW2pdOwogICAgICAgIHNjaGVkdWxlW2pdID0geDsKICAgICAgfQoKICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lCiAgICAgIGxldCBsYXN0V2l0bmVzc2VzID0gcGFyYW1zLmxhc3RXaXRuZXNzZXM7CiAgICAgIGNvbnN0IHByZXZpb3VzUm91bmRXaXRuZXNzID0gbGFzdFdpdG5lc3Nlcy5sZW5ndGggPiAwID8gbGFzdFdpdG5lc3Nlc1tsYXN0V2l0bmVzc2VzLmxlbmd0aCAtIDFdIDogJyc7CgogICAgICBpZiAobGFzdFdpdG5lc3Nlcy5sZW5ndGggPj0gTkJfV0lUTkVTU0VTKSB7CiAgICAgICAgbGFzdFdpdG5lc3NlcyA9IFtdOwogICAgICB9CgogICAgICAvLyBtYWtlIHN1cmUgdGhlIGxhc3Qgd2l0bmVzcyBvZiB0aGlzIHJvdW5kIGlzIG5vdCBvbmUgb2YgdGhlIGxhc3Qgd2l0bmVzc2VzIHNjaGVkdWxlZAogICAgICBjb25zdCBsYXN0V2l0bmVzcyA9IHNjaGVkdWxlW3NjaGVkdWxlLmxlbmd0aCAtIDFdLndpdG5lc3M7CiAgICAgIGlmIChsYXN0V2l0bmVzc2VzLmluY2x1ZGVzKGxhc3RXaXRuZXNzKSB8fCBwcmV2aW91c1JvdW5kV2l0bmVzcyA9PT0gbGFzdFdpdG5lc3MpIHsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjaGVkdWxlLmxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgICBpZiAoIWxhc3RXaXRuZXNzZXMuaW5jbHVkZXMoc2NoZWR1bGVbaV0ud2l0bmVzcykKICAgICAgICAgICAgJiYgc2NoZWR1bGVbaV0ud2l0bmVzcyAhPT0gcHJldmlvdXNSb3VuZFdpdG5lc3MpIHsKICAgICAgICAgICAgY29uc3QgdGhpc1dpdG5lc3MgPSBzY2hlZHVsZVtpXS53aXRuZXNzOwogICAgICAgICAgICBzY2hlZHVsZVtpXS53aXRuZXNzID0gbGFzdFdpdG5lc3M7CiAgICAgICAgICAgIHNjaGVkdWxlW3NjaGVkdWxlLmxlbmd0aCAtIDFdLndpdG5lc3MgPSB0aGlzV2l0bmVzczsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBtYWtlIHN1cmUgdGhlIHdpdG5lc3Mgb2YgdGhlIHByZXZpb3VzIHJvdW5kIGlzIG5vdCB0aGUgZmlyc3Qgd2l0bmVzcyBvZiB0aGlzIHJvdW5kCiAgICAgIGlmIChzY2hlZHVsZVswXS53aXRuZXNzID09PSBwcmV2aW91c1JvdW5kV2l0bmVzcykgewogICAgICAgIGNvbnN0IGZpcnN0V2l0bmVzcyA9IHNjaGVkdWxlWzBdLndpdG5lc3M7CiAgICAgICAgY29uc3Qgc2Vjb25kV2l0bmVzcyA9IHNjaGVkdWxlWzFdLndpdG5lc3M7CiAgICAgICAgc2NoZWR1bGVbMF0ud2l0bmVzcyA9IHNlY29uZFdpdG5lc3M7CiAgICAgICAgc2NoZWR1bGVbMV0ud2l0bmVzcyA9IGZpcnN0V2l0bmVzczsKICAgICAgfQoKICAgICAgLy8gYmxvY2sgbnVtYmVyIGF0dHJpYnV0aW9uCiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItZGVzdHJ1Y3R1cmluZwogICAgICBsZXQgYmxvY2tOdW1iZXIgPSBsYXN0VmVyaWZpZWRCbG9ja051bWJlciA9PT0gMAogICAgICAgID8gYXBpLmJsb2NrTnVtYmVyCiAgICAgICAgOiBsYXN0VmVyaWZpZWRCbG9ja051bWJlciArIDE7CiAgICAgIHBhcmFtcy5yb3VuZCArPSAxOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjaGVkdWxlLmxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgLy8gdGhlIGJsb2NrIG51bWJlciB0aGF0IHRoZSB3aXRuZXNzIHdpbGwgaGF2ZSB0byAic2lnbiIKICAgICAgICBzY2hlZHVsZVtpXS5ibG9ja051bWJlciA9IGJsb2NrTnVtYmVyOwogICAgICAgIHNjaGVkdWxlW2ldLnJvdW5kID0gcGFyYW1zLnJvdW5kOwogICAgICAgIGFwaS5kZWJ1Zyhgc2NoZWR1bGVkIHdpdG5lc3MgJHtzY2hlZHVsZVtpXS53aXRuZXNzfSBmb3IgYmxvY2sgJHtibG9ja051bWJlcn0gKHJvdW5kICR7cGFyYW1zLnJvdW5kfSlgKTsKICAgICAgICBhd2FpdCBhcGkuZGIuaW5zZXJ0KCdzY2hlZHVsZXMnLCBzY2hlZHVsZVtpXSk7CiAgICAgICAgYmxvY2tOdW1iZXIgKz0gMTsKICAgICAgfQoKICAgICAgaWYgKGxhc3RWZXJpZmllZEJsb2NrTnVtYmVyID09PSAwKSB7CiAgICAgICAgcGFyYW1zLmxhc3RWZXJpZmllZEJsb2NrTnVtYmVyID0gYXBpLmJsb2NrTnVtYmVyIC0gMTsKICAgICAgfQogICAgICBjb25zdCBsYXN0V2l0bmVzc1JvdW5kU2NoZWR1bGUgPSBzY2hlZHVsZVtzY2hlZHVsZS5sZW5ndGggLSAxXTsKICAgICAgcGFyYW1zLmxhc3RCbG9ja1JvdW5kID0gbGFzdFdpdG5lc3NSb3VuZFNjaGVkdWxlLmJsb2NrTnVtYmVyOwogICAgICBwYXJhbXMuY3VycmVudFdpdG5lc3MgPSBsYXN0V2l0bmVzc1JvdW5kU2NoZWR1bGUud2l0bmVzczsKICAgICAgbGFzdFdpdG5lc3Nlcy5wdXNoKGxhc3RXaXRuZXNzUm91bmRTY2hlZHVsZS53aXRuZXNzKTsKICAgICAgcGFyYW1zLmxhc3RXaXRuZXNzZXMgPSBsYXN0V2l0bmVzc2VzOwogICAgICBwYXJhbXMuYmxvY2tOdW1iZXJXaXRuZXNzQ2hhbmdlID0gYXBpLnJlZlN0ZWVtQmxvY2tOdW1iZXIKICAgICAgICArIE1BWF9ST1VORF9QUk9QT1NJVElPTl9XQUlUSU5HX1BFUklPRDsKICAgICAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgncGFyYW1zJywgcGFyYW1zKTsKICAgICAgYXBpLmVtaXQoJ25ld1NjaGVkdWxlJywgeyB9KTsKICAgIH0KICB9IGVsc2UgaWYgKGFwaS5yZWZTdGVlbUJsb2NrTnVtYmVyID49IGJsb2NrTnVtYmVyV2l0bmVzc0NoYW5nZSkgewogICAgaWYgKGFwaS5ibG9ja051bWJlciA+IGxhc3RCbG9ja1JvdW5kKSB7CiAgICAgIC8vIG90aGVyd2lzZSB3ZSBjaGFuZ2UgdGhlIGN1cnJlbnQgd2l0bmVzcyBpZiBpdCBoYXMgbm90IHByb3Bvc2VkIHRoZSByb3VuZCBpbiB0aW1lCiAgICAgIGF3YWl0IGNoYW5nZUN1cnJlbnRXaXRuZXNzKCk7CiAgICB9IGVsc2UgewogICAgICBwYXJhbXMuYmxvY2tOdW1iZXJXaXRuZXNzQ2hhbmdlID0gYXBpLnJlZlN0ZWVtQmxvY2tOdW1iZXIKICAgICAgICArIE1BWF9ST1VORF9QUk9QT1NJVElPTl9XQUlUSU5HX1BFUklPRDsKICAgICAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgncGFyYW1zJywgcGFyYW1zKTsKICAgICAgYXBpLmVtaXQoJ2F3YWl0aW5nUm91bmRFbmQnLCB7IH0pOwogICAgfQogIH0KfTsKCmFjdGlvbnMucHJvcG9zZVJvdW5kID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBjb25zdCB7CiAgICByb3VuZEhhc2gsCiAgICBpc1NpZ25lZFdpdGhBY3RpdmVLZXksCiAgICBzaWduYXR1cmVzLAogIH0gPSBwYXlsb2FkOwoKICBpZiAoaXNTaWduZWRXaXRoQWN0aXZlS2V5ID09PSB0cnVlCiAgICAmJiByb3VuZEhhc2ggJiYgdHlwZW9mIHJvdW5kSGFzaCA9PT0gJ3N0cmluZycgJiYgcm91bmRIYXNoLmxlbmd0aCA9PT0gNjQKICAgICYmIEFycmF5LmlzQXJyYXkoc2lnbmF0dXJlcykKICAgICYmIHNpZ25hdHVyZXMubGVuZ3RoIDw9IE5CX1dJVE5FU1NFUwogICAgJiYgc2lnbmF0dXJlcy5sZW5ndGggPj0gTkJfV0lUTkVTU0VTX1NJR05BVFVSRVNfUkVRVUlSRUQpIHsKICAgIGNvbnN0IHBhcmFtcyA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdwYXJhbXMnLCB7fSk7CiAgICBjb25zdCB7CiAgICAgIGxhc3RWZXJpZmllZEJsb2NrTnVtYmVyLAogICAgICByb3VuZCwKICAgICAgbGFzdEJsb2NrUm91bmQsCiAgICAgIGN1cnJlbnRXaXRuZXNzLAogICAgfSA9IHBhcmFtczsKICAgIGxldCBjdXJyZW50QmxvY2sgPSBsYXN0VmVyaWZpZWRCbG9ja051bWJlciArIDE7CiAgICBsZXQgY2FsY3VsYXRlZFJvdW5kSGFzaCA9ICcnOwoKICAgIC8vIHRoZSBzZW5kZXIgbXVzdCBiZSB0aGUgY3VycmVudCB3aXRuZXNzIG9mIHRoZSByb3VuZAogICAgaWYgKGFwaS5zZW5kZXIgPT09IGN1cnJlbnRXaXRuZXNzKSB7CiAgICAgIC8vIGNhbGN1bGF0ZSByb3VuZCBoYXNoCiAgICAgIHdoaWxlIChjdXJyZW50QmxvY2sgPD0gbGFzdEJsb2NrUm91bmQpIHsKICAgICAgICBjb25zdCBibG9jayA9IGF3YWl0IGFwaS5kYi5nZXRCbG9ja0luZm8oY3VycmVudEJsb2NrKTsKCiAgICAgICAgaWYgKGJsb2NrICE9PSBudWxsKSB7CiAgICAgICAgICBjYWxjdWxhdGVkUm91bmRIYXNoID0gYXBpLlNIQTI1NihgJHtjYWxjdWxhdGVkUm91bmRIYXNofSR7YmxvY2suaGFzaH1gKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY2FsY3VsYXRlZFJvdW5kSGFzaCA9ICcnOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBjdXJyZW50QmxvY2sgKz0gMTsKICAgICAgfQoKICAgICAgaWYgKGNhbGN1bGF0ZWRSb3VuZEhhc2ggIT09ICcnICYmIGNhbGN1bGF0ZWRSb3VuZEhhc2ggPT09IHJvdW5kSGFzaCkgewogICAgICAgIC8vIGdldCB0aGUgd2l0bmVzc2VzIG9uIHNjaGVkdWxlCiAgICAgICAgY29uc3Qgc2NoZWR1bGVzID0gYXdhaXQgYXBpLmRiLmZpbmQoJ3NjaGVkdWxlcycsIHsgcm91bmQgfSk7CgogICAgICAgIC8vIGNoZWNrIHRoZSBzaWduYXR1cmVzCiAgICAgICAgbGV0IHNpZ25hdHVyZXNDaGVja2VkID0gMDsKICAgICAgICBjb25zdCB2ZXJpZmllZEJsb2NrSW5mb3JtYXRpb24gPSBbXTsKICAgICAgICBjb25zdCBjdXJyZW50V2l0bmVzc0luZm8gPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgnd2l0bmVzc2VzJywgeyBhY2NvdW50OiBjdXJyZW50V2l0bmVzcyB9KTsKICAgICAgICBjb25zdCBjdXJyZW50V2l0bmVzc1NpZ25hdHVyZSA9IHNpZ25hdHVyZXMuZmluZChzID0+IHNbMF0gPT09IGN1cnJlbnRXaXRuZXNzKTsKICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc2NoZWR1bGVzLmxlbmd0aDsgaW5kZXggKz0gMSkgewogICAgICAgICAgY29uc3Qgc2NoZWR1bGVkV2l0bmVzcyA9IHNjaGVkdWxlc1tpbmRleF07CiAgICAgICAgICBjb25zdCB3aXRuZXNzID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ3dpdG5lc3NlcycsIHsgYWNjb3VudDogc2NoZWR1bGVkV2l0bmVzcy53aXRuZXNzIH0pOwogICAgICAgICAgaWYgKHdpdG5lc3MgIT09IG51bGwpIHsKICAgICAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gc2lnbmF0dXJlcy5maW5kKHMgPT4gc1swXSA9PT0gd2l0bmVzcy5hY2NvdW50KTsKICAgICAgICAgICAgaWYgKHNpZ25hdHVyZSkgewogICAgICAgICAgICAgIGlmIChhcGkuY2hlY2tTaWduYXR1cmUoCiAgICAgICAgICAgICAgICBjYWxjdWxhdGVkUm91bmRIYXNoLCBzaWduYXR1cmVbMV0sIHdpdG5lc3Muc2lnbmluZ0tleSwgdHJ1ZSwKICAgICAgICAgICAgICApKSB7CiAgICAgICAgICAgICAgICBhcGkuZGVidWcoYHdpdG5lc3MgJHt3aXRuZXNzLmFjY291bnR9IHNpZ25lZCByb3VuZCAke3JvdW5kfWApOwogICAgICAgICAgICAgICAgc2lnbmF0dXJlc0NoZWNrZWQgKz0gMTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHRoZSBjdXJyZW50IHdpdG5lc3Mgd2lsbCBzaG93IGFzIHRoZSB3aXRuZXNzIHRoYXQgdmVyaWZpZWQgdGhlIGJsb2NrcyBmcm9tIHRoZSByb3VuZAogICAgICAgICAgICB2ZXJpZmllZEJsb2NrSW5mb3JtYXRpb24ucHVzaCgKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBibG9ja051bWJlcjogc2NoZWR1bGVkV2l0bmVzcy5ibG9ja051bWJlciwKICAgICAgICAgICAgICAgIHdpdG5lc3M6IGN1cnJlbnRXaXRuZXNzLAogICAgICAgICAgICAgICAgc2lnbmluZ0tleTogY3VycmVudFdpdG5lc3NJbmZvLnNpZ25pbmdLZXksCiAgICAgICAgICAgICAgICByb3VuZFNpZ25hdHVyZTogY3VycmVudFdpdG5lc3NTaWduYXR1cmVbMV0sCiAgICAgICAgICAgICAgICByb3VuZCwKICAgICAgICAgICAgICAgIHJvdW5kSGFzaCwKICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKHNpZ25hdHVyZXNDaGVja2VkID49IE5CX1dJVE5FU1NFU19TSUdOQVRVUkVTX1JFUVVJUkVEKSB7CiAgICAgICAgICAvLyBtYXJrIGJsb2NrcyBvZiB0aGUgdmVyaWZpZWQgcm91bmQgYXMgdmVyaWZpZWQgYnkgdGhlIGN1cnJlbnQgd2l0bmVzcwogICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHZlcmlmaWVkQmxvY2tJbmZvcm1hdGlvbi5sZW5ndGg7IGluZGV4ICs9IDEpIHsKICAgICAgICAgICAgYXdhaXQgYXBpLnZlcmlmeUJsb2NrKHZlcmlmaWVkQmxvY2tJbmZvcm1hdGlvbltpbmRleF0pOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIGdldCBjb250cmFjdCBiYWxhbmNlCiAgICAgICAgICBjb25zdCBjb250cmFjdEJhbGFuY2UgPSBhd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoJ3Rva2VucycsICdjb250cmFjdHNCYWxhbmNlcycsIHsgYWNjb3VudDogJ3dpdG5lc3NlcycsIHN5bWJvbDogVVRJTElUWV9UT0tFTl9TWU1CT0wgfSk7CiAgICAgICAgICBsZXQgcmV3YXJkV2l0bmVzc2VzID0gZmFsc2U7CgogICAgICAgICAgaWYgKGNvbnRyYWN0QmFsYW5jZQogICAgICAgICAgICAmJiBhcGkuQmlnTnVtYmVyKGNvbnRyYWN0QmFsYW5jZS5iYWxhbmNlKS5ndGUoTkJfVE9LRU5TX05FRURFRF9CRUZPUkVfUkVXQVJESU5HKSkgewogICAgICAgICAgICByZXdhcmRXaXRuZXNzZXMgPSB0cnVlOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIHJlbW92ZSB0aGUgc2NoZWR1bGVzCiAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc2NoZWR1bGVzLmxlbmd0aDsgaW5kZXggKz0gMSkgewogICAgICAgICAgICBjb25zdCBzY2hlZHVsZSA9IHNjaGVkdWxlc1tpbmRleF07CiAgICAgICAgICAgIC8vIHJld2FyZCB0aGUgd2l0bmVzcyB0aGF0IGhlbHAgdmVyaWZ5aW5nIHRoaXMgcm91bmQKICAgICAgICAgICAgaWYgKHJld2FyZFdpdG5lc3NlcyA9PT0gdHJ1ZSkgewogICAgICAgICAgICAgIGF3YWl0IGFwaS5leGVjdXRlU21hcnRDb250cmFjdCgndG9rZW5zJywgJ3N0YWtlRnJvbUNvbnRyYWN0JywgeyB0bzogc2NoZWR1bGUud2l0bmVzcywgc3ltYm9sOiBVVElMSVRZX1RPS0VOX1NZTUJPTCwgcXVhbnRpdHk6IE5CX1RPS0VOU19UT19SRVdBUkQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXdhaXQgYXBpLmRiLnJlbW92ZSgnc2NoZWR1bGVzJywgc2NoZWR1bGUpOwogICAgICAgICAgfQoKICAgICAgICAgIHBhcmFtcy5jdXJyZW50V2l0bmVzcyA9IG51bGw7CiAgICAgICAgICBwYXJhbXMubGFzdFZlcmlmaWVkQmxvY2tOdW1iZXIgPSBsYXN0QmxvY2tSb3VuZDsKICAgICAgICAgIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3BhcmFtcycsIHBhcmFtcyk7CgogICAgICAgICAgLy8gdXBkYXRlIGluZm9ybWF0aW9uIGZvciB0aGUgY3VycmVudCB3aXRuZXNzCiAgICAgICAgICBjb25zdCB3aXRuZXNzID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ3dpdG5lc3NlcycsIHsgYWNjb3VudDogY3VycmVudFdpdG5lc3MgfSk7CiAgICAgICAgICB3aXRuZXNzLm1pc3NlZFJvdW5kc0luQVJvdyA9IDA7CiAgICAgICAgICB3aXRuZXNzLmxhc3RSb3VuZFZlcmlmaWVkID0gcm91bmQ7CiAgICAgICAgICB3aXRuZXNzLmxhc3RCbG9ja1ZlcmlmaWVkID0gbGFzdEJsb2NrUm91bmQ7CiAgICAgICAgICB3aXRuZXNzLnZlcmlmaWVkUm91bmRzICs9IDE7CiAgICAgICAgICBhd2FpdCBhcGkuZGIudXBkYXRlKCd3aXRuZXNzZXMnLCB3aXRuZXNzKTsKCiAgICAgICAgICAvLyBjYWxjdWxhdGUgbmV3IHNjaGVkdWxlCiAgICAgICAgICBhd2FpdCBtYW5hZ2VXaXRuZXNzZXNTY2hlZHVsZSgpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfTsKCmFjdGlvbnMuc2NoZWR1bGVXaXRuZXNzZXMgPSBhc3luYyAoKSA9PiB7CiAgaWYgKGFwaS5zZW5kZXIgIT09ICdudWxsJykgcmV0dXJuOwoKICBhd2FpdCBtYW5hZ2VXaXRuZXNzZXNTY2hlZHVsZSgpOwp9Owo="
}
}
}

{
"id": "ssc-testnet1",
"json": {
"contractName": "contract",
"contractAction": "deploy",
"contractPayload": {
"name": "inflation",
"params": "",
"code": "LyogZXNsaW50LWRpc2FibGUgbm8tYXdhaXQtaW4tbG9vcCAqLwovKiBnbG9iYWwgYWN0aW9ucywgYXBpICovCgovLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdGVtcGxhdGUtY3VybHktaW4tc3RyaW5nCmNvbnN0IFVUSUxJVFlfVE9LRU5fU1lNQk9MID0gIlNTQyI7CgphY3Rpb25zLmNyZWF0ZVNTQyA9IGFzeW5jICgpID0+IHsKCn07CgphY3Rpb25zLmlzc3VlTmV3VG9rZW5zID0gYXN5bmMgKCkgPT4gewogIGlmIChhcGkuc2VuZGVyICE9PSAnbnVsbCcpIHJldHVybjsKCiAgLy8gaXNzdWUgdG9rZW5zIHRvIHN0ZWVtc2MKICAvLyAxMDBrIHRva2VucyBwZXIgeWVhciA9IDExLjQxNTUyNTExIHRva2VucyBwZXIgaG91ciAoYW4gaG91ciA9IDEyMDAgYmxvY2tzKQogIGxldCBuYlRva2VucyA9ICcxMS40MTU1MjUxMSc7CiAgYXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCd0b2tlbnMnLCAnaXNzdWUnLCB7IHN5bWJvbDogVVRJTElUWV9UT0tFTl9TWU1CT0wsIHF1YW50aXR5OiBuYlRva2VucywgdG86ICdzdGVlbXNjJyB9KTsKCiAgLy8gaXNzdWUgdG9rZW5zIHRvIGVuZ3Bvb2wKICAvLyAxMDBrIHRva2VucyBwZXIgeWVhciA9IDExLjQxNTUyNTExIHRva2VucyBwZXIgaG91ciAoYW4gaG91ciA9IDEyMDAgYmxvY2tzKQogIG5iVG9rZW5zID0gJzExLjQxNTUyNTExJzsKICBhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoJ3Rva2VucycsICdpc3N1ZScsIHsgc3ltYm9sOiBVVElMSVRZX1RPS0VOX1NZTUJPTCwgcXVhbnRpdHk6IG5iVG9rZW5zLCB0bzogJ2VuZ3Bvb2wnIH0pOwoKICAvLyBpc3N1ZSB0b2tlbnMgdG8gIndpdG5lc3NlcyIgY29udHJhY3QKICAvLyAyMDBrIHRva2VucyBwZXIgeWVhciA9IDIyLjgzMTA1MDIyIHRva2VucyBwZXIgaG91ciAoYW4gaG91ciA9IDEyMDAgYmxvY2tzKQogIG5iVG9rZW5zID0gJzIyLjgzMTA1MDIyJzsKICBhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoJ3Rva2VucycsICdpc3N1ZVRvQ29udHJhY3QnLCB7IHN5bWJvbDogVVRJTElUWV9UT0tFTl9TWU1CT0wsIHF1YW50aXR5OiBuYlRva2VucywgdG86ICd3aXRuZXNzZXMnIH0pOwp9Owo="
}
}
}

{
"id": "ssc-testnet1",
"json": {
"contractName": "contract",
"contractAction": "update",
"contractPayload": {
"name": "nft",
"params": "",
"code": "Y29uc3QgQ09OVFJBQ1RfTkFNRT0ibmZ0IixVVElMSVRZX1RPS0VOX1NZTUJPTD0iU1NDIixNQVhfTlVNX0FVVEhPUklaRURfSVNTVUVSUz0xMCxNQVhfTlVNX0xPQ0tFRF9UT0tFTl9UWVBFUz0xMCxNQVhfU1lNQk9MX0xFTkdUSD0xMCxNQVhfREFUQV9QUk9QRVJUWV9MRU5HVEg9MTAwLE1BWF9OVU1fTkZUU19JU1NVQUJMRT0xMCxNQVhfTlVNX05GVFNfRURJVEFCTEU9NTAsTUFYX05VTV9ORlRTX09QRVJBQkxFPTUwO2FjdGlvbnMuY3JlYXRlU1NDPShhc3luYygpPT57aWYoITE9PT1hd2FpdCBhcGkuZGIudGFibGVFeGlzdHMoIm5mdHMiKSl7YXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKCJuZnRzIixbInN5bWJvbCJdKSxhd2FpdCBhcGkuZGIuY3JlYXRlVGFibGUoInBhcmFtcyIpLGF3YWl0IGFwaS5kYi5jcmVhdGVUYWJsZSgicGVuZGluZ1VuZGVsZWdhdGlvbnMiLFsic3ltYm9sIiwiY29tcGxldGVUaW1lc3RhbXAiXSk7Y29uc3QgZT17bmZ0Q3JlYXRpb25GZWU6IjEwMCIsbmZ0SXNzdWFuY2VGZWU6e1NTQzoiMC4wMDEiLFBBTDoiMC4wMDEifSxkYXRhUHJvcGVydHlDcmVhdGlvbkZlZToiMTAwIixlbmFibGVEZWxlZ2F0aW9uRmVlOiIxMDAwIn07YXdhaXQgYXBpLmRiLmluc2VydCgicGFyYW1zIixlKX19KSxhY3Rpb25zLnVwZGF0ZVBhcmFtcz0oYXN5bmMgZT0+e2lmKGFwaS5zZW5kZXIhPT1hcGkub3duZXIpcmV0dXJuO2NvbnN0e25mdENyZWF0aW9uRmVlOnQsbmZ0SXNzdWFuY2VGZWU6YSxkYXRhUHJvcGVydHlDcmVhdGlvbkZlZTppLGVuYWJsZURlbGVnYXRpb25GZWU6c309ZSxuPWF3YWl0IGFwaS5kYi5maW5kT25lKCJwYXJhbXMiLHt9KTt0JiYic3RyaW5nIj09dHlwZW9mIHQmJiFhcGkuQmlnTnVtYmVyKHQpLmlzTmFOKCkmJmFwaS5CaWdOdW1iZXIodCkuZ3RlKDApJiYobi5uZnRDcmVhdGlvbkZlZT10KSxhJiYib2JqZWN0Ij09dHlwZW9mIGEmJihuLm5mdElzc3VhbmNlRmVlPWEpLGkmJiJzdHJpbmciPT10eXBlb2YgaSYmIWFwaS5CaWdOdW1iZXIoaSkuaXNOYU4oKSYmYXBpLkJpZ051bWJlcihpKS5ndGUoMCkmJihuLmRhdGFQcm9wZXJ0eUNyZWF0aW9uRmVlPWkpLHMmJiJzdHJpbmciPT10eXBlb2YgcyYmIWFwaS5CaWdOdW1iZXIocykuaXNOYU4oKSYmYXBpLkJpZ051bWJlcihzKS5ndGUoMCkmJihuLmVuYWJsZURlbGVnYXRpb25GZWU9cyksYXdhaXQgYXBpLmRiLnVwZGF0ZSgicGFyYW1zIixuKX0pO2NvbnN0IGlzVG9rZW5UcmFuc2ZlclZlcmlmaWVkPShlLHQsYSxpLHMsbik9PiEodm9pZCAwIT09ZS5lcnJvcnN8fCFlLmV2ZW50c3x8dm9pZCAwPT09ZS5ldmVudHMuZmluZChlPT4idG9rZW5zIj09PWUuY29udHJhY3QmJmUuZXZlbnQ9PT1uJiZlLmRhdGEuZnJvbT09PXQmJmUuZGF0YS50bz09PWEmJmUuZGF0YS5xdWFudGl0eT09PXMmJmUuZGF0YS5zeW1ib2w9PT1pKSksY2FsY3VsYXRlQmFsYW5jZT0oZSx0LGEsaSk9Pmk/YXBpLkJpZ051bWJlcihlKS5wbHVzKHQpLnRvRml4ZWQoYSk6YXBpLkJpZ051bWJlcihlKS5taW51cyh0KS50b0ZpeGVkKGEpLGNvdW50RGVjaW1hbHM9ZT0+YXBpLkJpZ051bWJlcihlKS5kcCgpLGNvbnRhaW5zRHVwbGljYXRlcz1lPT5uZXcgU2V0KGUpLnNpemUhPT1lLmxlbmd0aCxpc1ZhbGlkU3RlZW1BY2NvdW50TGVuZ3RoPWU9PmUubGVuZ3RoPj0zJiZlLmxlbmd0aDw9MTYsaXNWYWxpZENvbnRyYWN0TGVuZ3RoPWU9PmUubGVuZ3RoPj0zJiZlLmxlbmd0aDw9NTAsaXNWYWxpZEFjY291bnRzQXJyYXk9ZT0+e2xldCB0PSEwO3JldHVybiBlLmZvckVhY2goZT0+eyJzdHJpbmciPT10eXBlb2YgZSYmaXNWYWxpZFN0ZWVtQWNjb3VudExlbmd0aChlKXx8KHQ9ITEpfSksdH0saXNWYWxpZENvbnRyYWN0c0FycmF5PWU9PntsZXQgdD0hMDtyZXR1cm4gZS5mb3JFYWNoKGU9Pnsic3RyaW5nIj09dHlwZW9mIGUmJmlzVmFsaWRDb250cmFjdExlbmd0aChlKXx8KHQ9ITEpfSksdH0saXNWYWxpZERhdGFQcm9wZXJ0aWVzPShlLHQsYSxpKT0+e2NvbnN0IHM9T2JqZWN0LmtleXMoaSkubGVuZ3RoLG49T2JqZWN0LmtleXMoYS5wcm9wZXJ0aWVzKS5sZW5ndGg7aWYoIWFwaS5hc3NlcnQoczw9biwiY2Fubm90IHNldCBtb3JlIGRhdGEgcHJvcGVydGllcyB0aGFuIE5GVCBoYXMiKSlyZXR1cm4hMTtmb3IoY29uc3RbcyxuXW9mIE9iamVjdC5lbnRyaWVzKGkpKXtsZXQgcj0hMTtpZihhcGkuYXNzZXJ0KHMmJiJzdHJpbmciPT10eXBlb2YgcyYmYXBpLnZhbGlkYXRvci5pc0FscGhhbnVtZXJpYyhzKSYmcy5sZW5ndGg+MCYmcy5sZW5ndGg8PTI1LCJpbnZhbGlkIGRhdGEgcHJvcGVydHkgbmFtZTogbGV0dGVycyAmIG51bWJlcnMgb25seSwgbWF4IGxlbmd0aCBvZiAyNSIpJiZhcGkuYXNzZXJ0KHMgaW4gYS5wcm9wZXJ0aWVzLCJkYXRhIHByb3BlcnR5IG11c3QgZXhpc3QiKSl7Y29uc3Qgbz1hLnByb3BlcnRpZXNbc107YXBpLmFzc2VydChudWxsIT1uJiYodHlwZW9mIG49PT1vLnR5cGV8fCJudW1iZXIiPT09by50eXBlJiYic3RyaW5nIj09dHlwZW9mIG4mJiFhcGkuQmlnTnVtYmVyKG4pLmlzTmFOKCkpLGBkYXRhIHByb3BlcnR5IHR5cGUgbWlzbWF0Y2g6IGV4cGVjdGVkICR7by50eXBlfSBidXQgZ290ICR7dHlwZW9mIG59IGZvciBwcm9wZXJ0eSAke3N9YCkmJmFwaS5hc3NlcnQoInN0cmluZyIhPXR5cGVvZiBufHxuLmxlbmd0aDw9MTAwLCJzdHJpbmcgcHJvcGVydHkgbWF4IGxlbmd0aCBpcyAxMDAgY2hhcmFjdGVycyIpJiZhcGkuYXNzZXJ0KCJjb250cmFjdCI9PT10JiZvLmF1dGhvcml6ZWRFZGl0aW5nQ29udHJhY3RzLmluY2x1ZGVzKGUpfHwidXNlciI9PT10JiZvLmF1dGhvcml6ZWRFZGl0aW5nQWNjb3VudHMuaW5jbHVkZXMoZSksIm5vdCBhbGxvd2VkIHRvIHNldCBkYXRhIHByb3BlcnRpZXMiKSYmKHI9ITAsIm51bWJlciI9PT1vLnR5cGUmJiJzdHJpbmciPT10eXBlb2YgbiYmKGlbc109YXBpLkJpZ051bWJlcihuKS50b051bWJlcigpKSl9aWYoIXIpcmV0dXJuITF9cmV0dXJuITB9LGlzVmFsaWREYXRhUHJvcGVydGllc0FycmF5PShlLHQsYSxpKT0+e3RyeXtmb3IobGV0IHM9MDtzPGkubGVuZ3RoO3MrPTEpe2xldCBuPSExO2NvbnN0e2lkOnIscHJvcGVydGllczpvfT1pW3NdO2lmKGFwaS5hc3NlcnQociYmInN0cmluZyI9PXR5cGVvZiByJiYhYXBpLkJpZ051bWJlcihyKS5pc05hTigpJiZhcGkuQmlnTnVtYmVyKHIpLmd0KDApJiZvJiYib2JqZWN0Ij09dHlwZW9mIG8sImludmFsaWQgZGF0YSBwcm9wZXJ0aWVzIikmJmlzVmFsaWREYXRhUHJvcGVydGllcyhlLHQsYSxvKSYmKG49ITApLCFuKXJldHVybiExfX1jYXRjaChlKXtyZXR1cm4hMX1yZXR1cm4hMH0saXNWYWxpZE5mdElkQXJyYXk9ZT0+e3RyeXtsZXQgdD0wO2ZvcihsZXQgYT0wO2E8ZS5sZW5ndGg7YSs9MSl7bGV0IGk9ITE7Y29uc3R7c3ltYm9sOnMsaWRzOm59PWVbYV07aWYoYXBpLmFzc2VydChzJiYic3RyaW5nIj09dHlwZW9mIHMmJmFwaS52YWxpZGF0b3IuaXNBbHBoYShzKSYmYXBpLnZhbGlkYXRvci5pc1VwcGVyY2FzZShzKSYmcy5sZW5ndGg+MCYmcy5sZW5ndGg8PTEwJiZuJiYib2JqZWN0Ij09dHlwZW9mIG4mJkFycmF5LmlzQXJyYXkobiksImludmFsaWQgbmZ0IGxpc3QiKSYmKHQrPW4ubGVuZ3RoLGFwaS5hc3NlcnQodDw9NTAsImNhbm5vdCBvcGVyYXRlIG9uIG1vcmUgdGhhbiA1MCBORlQgaW5zdGFuY2VzIGF0IG9uY2UiKSkpe2ZvcihsZXQgZT0wO2U8bi5sZW5ndGg7ZSs9MSl7Y29uc3QgdD1uW2VdO2lmKCFhcGkuYXNzZXJ0KHQmJiJzdHJpbmciPT10eXBlb2YgdCYmIWFwaS5CaWdOdW1iZXIodCkuaXNOYU4oKSYmYXBpLkJpZ051bWJlcih0KS5ndCgwKSwiaW52YWxpZCBuZnQgbGlzdCIpKXJldHVybiExfWk9ITB9aWYoIWkpcmV0dXJuITF9fWNhdGNoKGUpe3JldHVybiExfXJldHVybiEwfSxpc1ZhbGlkVG9rZW5CYXNrZXQ9YXN5bmMoZSx0LGEsaSxzKT0+e3RyeXtpZihPYmplY3Qua2V5cyhlKS5sZW5ndGg+MTApcmV0dXJuITE7Zm9yKGNvbnN0W24scl1vZiBPYmplY3QuZW50cmllcyhlKSl7bGV0IGU9ITE7aWYoInN0cmluZyI9PXR5cGVvZiBuJiZhcGkudmFsaWRhdG9yLmlzQWxwaGEobikmJmFwaS52YWxpZGF0b3IuaXNVcHBlcmNhc2UobikmJm4ubGVuZ3RoPjAmJm4ubGVuZ3RoPD0xMCl7Y29uc3Qgbz1hd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoInRva2VucyIsInRva2VucyIse3N5bWJvbDpufSk7aWYobyYmciYmInN0cmluZyI9PXR5cGVvZiByJiYhYXBpLkJpZ051bWJlcihyKS5pc05hTigpJiZhcGkuQmlnTnVtYmVyKHIpLmd0KDApJiZjb3VudERlY2ltYWxzKHIpPD1vLnByZWNpc2lvbil7Y29uc3QgcD1uPT09aT9jYWxjdWxhdGVCYWxhbmNlKHIscyxvLnByZWNpc2lvbiwhMCk6cixjPWF3YWl0IGFwaS5kYi5maW5kT25lSW5UYWJsZSgidG9rZW5zIix0LHthY2NvdW50OmEsc3ltYm9sOm59KTtjJiZhcGkuQmlnTnVtYmVyKGMuYmFsYW5jZSkuZ3RlKHApJiYoZT0hMCl9fWlmKCFlKXJldHVybiExfX1jYXRjaChlKXtyZXR1cm4hMX1yZXR1cm4hMH07YWN0aW9ucy51cGRhdGVVcmw9KGFzeW5jIGU9Pntjb25zdHt1cmw6dCxzeW1ib2w6YX09ZTtpZihhcGkuYXNzZXJ0KGEmJiJzdHJpbmciPT10eXBlb2YgYSYmdCYmInN0cmluZyI9PXR5cGVvZiB0LCJpbnZhbGlkIHBhcmFtcyIpJiZhcGkuYXNzZXJ0KHQubGVuZ3RoPD0yNTUsImludmFsaWQgdXJsOiBtYXggbGVuZ3RoIG9mIDI1NSIpKXtjb25zdCBlPWF3YWl0IGFwaS5kYi5maW5kT25lKCJuZnRzIix7c3ltYm9sOmF9KTtpZihlJiZhcGkuYXNzZXJ0KGUuaXNzdWVyPT09YXBpLnNlbmRlciwibXVzdCBiZSB0aGUgaXNzdWVyIikpdHJ5e2NvbnN0IGE9SlNPTi5wYXJzZShlLm1ldGFkYXRhKTthcGkuYXNzZXJ0KGEmJmEudXJsLCJhbiBlcnJvciBvY2N1cmVkIHdoZW4gdHJ5aW5nIHRvIHVwZGF0ZSB0aGUgdXJsIikmJihhLnVybD10LGUubWV0YWRhdGE9SlNPTi5zdHJpbmdpZnkoYSksYXdhaXQgYXBpLmRiLnVwZGF0ZSgibmZ0cyIsZSkpfWNhdGNoKGUpe319fSksYWN0aW9ucy51cGRhdGVNZXRhZGF0YT0oYXN5bmMgZT0+e2NvbnN0e21ldGFkYXRhOnQsc3ltYm9sOmF9PWU7aWYoYXBpLmFzc2VydChhJiYic3RyaW5nIj09dHlwZW9mIGEmJnQmJiJvYmplY3QiPT10eXBlb2YgdCwiaW52YWxpZCBwYXJhbXMiKSl7Y29uc3QgZT1hd2FpdCBhcGkuZGIuZmluZE9uZSgibmZ0cyIse3N5bWJvbDphfSk7aWYoZSYmYXBpLmFzc2VydChlLmlzc3Vlcj09PWFwaS5zZW5kZXIsIm11c3QgYmUgdGhlIGlzc3VlciIpKXRyeXtjb25zdCBhPUpTT04uc3RyaW5naWZ5KHQpO2FwaS5hc3NlcnQoYS5sZW5ndGg8PTFlMywiaW52YWxpZCBtZXRhZGF0YTogbWF4IGxlbmd0aCBvZiAxMDAwIikmJihlLm1ldGFkYXRhPWEsYXdhaXQgYXBpLmRiLnVwZGF0ZSgibmZ0cyIsZSkpfWNhdGNoKGUpe319fSksYWN0aW9ucy51cGRhdGVOYW1lPShhc3luYyBlPT57Y29uc3R7bmFtZTp0LHN5bWJvbDphfT1lO2lmKGFwaS5hc3NlcnQoYSYmInN0cmluZyI9PXR5cGVvZiBhJiZ0JiYic3RyaW5nIj09dHlwZW9mIHQsImludmFsaWQgcGFyYW1zIikmJmFwaS5hc3NlcnQoYXBpLnZhbGlkYXRvci5pc0FscGhhbnVtZXJpYyhhcGkudmFsaWRhdG9yLmJsYWNrbGlzdCh0LCIgIikpJiZ0Lmxlbmd0aD4wJiZ0Lmxlbmd0aDw9NTAsImludmFsaWQgbmFtZTogbGV0dGVycywgbnVtYmVycywgd2hpdGVzcGFjZXMgb25seSwgbWF4IGxlbmd0aCBvZiA1MCIpKXtjb25zdCBlPWF3YWl0IGFwaS5kYi5maW5kT25lKCJuZnRzIix7c3ltYm9sOmF9KTtlJiZhcGkuYXNzZXJ0KGUuaXNzdWVyPT09YXBpLnNlbmRlciwibXVzdCBiZSB0aGUgaXNzdWVyIikmJihlLm5hbWU9dCxhd2FpdCBhcGkuZGIudXBkYXRlKCJuZnRzIixlKSl9fSksYWN0aW9ucy51cGRhdGVPcmdOYW1lPShhc3luYyBlPT57Y29uc3R7b3JnTmFtZTp0LHN5bWJvbDphfT1lO2lmKGFwaS5hc3NlcnQoYSYmInN0cmluZyI9PXR5cGVvZiBhJiZ0JiYic3RyaW5nIj09dHlwZW9mIHQsImludmFsaWQgcGFyYW1zIikmJmFwaS5hc3NlcnQoYXBpLnZhbGlkYXRvci5pc0FscGhhbnVtZXJpYyhhcGkudmFsaWRhdG9yLmJsYWNrbGlzdCh0LCIgIikpJiZ0Lmxlbmd0aD4wJiZ0Lmxlbmd0aDw9NTAsImludmFsaWQgb3JnIG5hbWU6IGxldHRlcnMsIG51bWJlcnMsIHdoaXRlc3BhY2VzIG9ubHksIG1heCBsZW5ndGggb2YgNTAiKSl7Y29uc3QgZT1hd2FpdCBhcGkuZGIuZmluZE9uZSgibmZ0cyIse3N5bWJvbDphfSk7ZSYmYXBpLmFzc2VydChlLmlzc3Vlcj09PWFwaS5zZW5kZXIsIm11c3QgYmUgdGhlIGlzc3VlciIpJiYoZS5vcmdOYW1lPXQsYXdhaXQgYXBpLmRiLnVwZGF0ZSgibmZ0cyIsZSkpfX0pLGFjdGlvbnMudXBkYXRlUHJvZHVjdE5hbWU9KGFzeW5jIGU9Pntjb25zdHtwcm9kdWN0TmFtZTp0LHN5bWJvbDphfT1lO2lmKGFwaS5hc3NlcnQoYSYmInN0cmluZyI9PXR5cGVvZiBhJiZ0JiYic3RyaW5nIj09dHlwZW9mIHQsImludmFsaWQgcGFyYW1zIikmJmFwaS5hc3NlcnQoYXBpLnZhbGlkYXRvci5pc0FscGhhbnVtZXJpYyhhcGkudmFsaWRhdG9yLmJsYWNrbGlzdCh0LCIgIikpJiZ0Lmxlbmd0aD4wJiZ0Lmxlbmd0aDw9NTAsImludmFsaWQgcHJvZHVjdCBuYW1lOiBsZXR0ZXJzLCBudW1iZXJzLCB3aGl0ZXNwYWNlcyBvbmx5LCBtYXggbGVuZ3RoIG9mIDUwIikpe2NvbnN0IGU9YXdhaXQgYXBpLmRiLmZpbmRPbmUoIm5mdHMiLHtzeW1ib2w6YX0pO2UmJmFwaS5hc3NlcnQoZS5pc3N1ZXI9PT1hcGkuc2VuZGVyLCJtdXN0IGJlIHRoZSBpc3N1ZXIiKSYmKGUucHJvZHVjdE5hbWU9dCxhd2FpdCBhcGkuZGIudXBkYXRlKCJuZnRzIixlKSl9fSksYWN0aW9ucy5hZGRBdXRob3JpemVkSXNzdWluZ0FjY291bnRzPShhc3luYyBlPT57Y29uc3R7YWNjb3VudHM6dCxzeW1ib2w6YSxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6aX09ZTtpZihhcGkuYXNzZXJ0KCEwPT09aSwieW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJmFwaS5hc3NlcnQoYSYmInN0cmluZyI9PXR5cGVvZiBhJiZ0JiYib2JqZWN0Ij09dHlwZW9mIHQmJkFycmF5LmlzQXJyYXkodCksImludmFsaWQgcGFyYW1zIikmJmFwaS5hc3NlcnQodC5sZW5ndGg8PTEwLCJjYW5ub3QgaGF2ZSBtb3JlIHRoYW4gMTAgYXV0aG9yaXplZCBpc3N1aW5nIGFjY291bnRzIikpe2NvbnN0IGU9aXNWYWxpZEFjY291bnRzQXJyYXkodCk7aWYoYXBpLmFzc2VydChlLCJpbnZhbGlkIGFjY291bnQgbGlzdCIpKXtjb25zdCBlPWF3YWl0IGFwaS5kYi5maW5kT25lKCJuZnRzIix7c3ltYm9sOmF9KTtpZihlKXtjb25zdCBhPVtdO2lmKHQuZm9yRWFjaCh0PT57Y29uc3QgaT10LnRyaW0oKS50b0xvd2VyQ2FzZSgpO2xldCBzPSExO2ZvcihsZXQgdD0wO3Q8ZS5hdXRob3JpemVkSXNzdWluZ0FjY291bnRzLmxlbmd0aDt0Kz0xKWlmKGk9PT1lLmF1dGhvcml6ZWRJc3N1aW5nQWNjb3VudHNbdF0pe3M9ITA7YnJlYWt9c3x8YS5wdXNoKGkpfSksYXBpLmFzc2VydChlLmlzc3Vlcj09PWFwaS5zZW5kZXIsIm11c3QgYmUgdGhlIGlzc3VlciIpJiZhcGkuYXNzZXJ0KCFjb250YWluc0R1cGxpY2F0ZXMoYSksImNhbm5vdCBhZGQgdGhlIHNhbWUgYWNjb3VudCB0d2ljZSIpJiZhcGkuYXNzZXJ0KGUuYXV0aG9yaXplZElzc3VpbmdBY2NvdW50cy5sZW5ndGgrYS5sZW5ndGg8PTEwLCJjYW5ub3QgaGF2ZSBtb3JlIHRoYW4gMTAgYXV0aG9yaXplZCBpc3N1aW5nIGFjY291bnRzIikpe2NvbnN0IHQ9ZS5hdXRob3JpemVkSXNzdWluZ0FjY291bnRzLmNvbmNhdChhKTtlLmF1dGhvcml6ZWRJc3N1aW5nQWNjb3VudHM9dCxhd2FpdCBhcGkuZGIudXBkYXRlKCJuZnRzIixlKX19fX19KSxhY3Rpb25zLmFkZEF1dGhvcml6ZWRJc3N1aW5nQ29udHJhY3RzPShhc3luYyBlPT57Y29uc3R7Y29udHJhY3RzOnQsc3ltYm9sOmEsaXNTaWduZWRXaXRoQWN0aXZlS2V5Oml9PWU7aWYoYXBpLmFzc2VydCghMD09PWksInlvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleSIpJiZhcGkuYXNzZXJ0KGEmJiJzdHJpbmciPT10eXBlb2YgYSYmdCYmIm9iamVjdCI9PXR5cGVvZiB0JiZBcnJheS5pc0FycmF5KHQpLCJpbnZhbGlkIHBhcmFtcyIpJiZhcGkuYXNzZXJ0KHQubGVuZ3RoPD0xMCwiY2Fubm90IGhhdmUgbW9yZSB0aGFuIDEwIGF1dGhvcml6ZWQgaXNzdWluZyBjb250cmFjdHMiKSl7Y29uc3QgZT1pc1ZhbGlkQ29udHJhY3RzQXJyYXkodCk7aWYoYXBpLmFzc2VydChlLCJpbnZhbGlkIGNvbnRyYWN0IGxpc3QiKSl7Y29uc3QgZT1hd2FpdCBhcGkuZGIuZmluZE9uZSgibmZ0cyIse3N5bWJvbDphfSk7aWYoZSl7Y29uc3QgYT1bXTtpZih0LmZvckVhY2godD0+e2NvbnN0IGk9dC50cmltKCk7bGV0IHM9ITE7Zm9yKGxldCB0PTA7dDxlLmF1dGhvcml6ZWRJc3N1aW5nQ29udHJhY3RzLmxlbmd0aDt0Kz0xKWlmKGk9PT1lLmF1dGhvcml6ZWRJc3N1aW5nQ29udHJhY3RzW3RdKXtzPSEwO2JyZWFrfXN8fGEucHVzaChpKX0pLGFwaS5hc3NlcnQoZS5pc3N1ZXI9PT1hcGkuc2VuZGVyLCJtdXN0IGJlIHRoZSBpc3N1ZXIiKSYmYXBpLmFzc2VydCghY29udGFpbnNEdXBsaWNhdGVzKGEpLCJjYW5ub3QgYWRkIHRoZSBzYW1lIGNvbnRyYWN0IHR3aWNlIikmJmFwaS5hc3NlcnQoZS5hdXRob3JpemVkSXNzdWluZ0NvbnRyYWN0cy5sZW5ndGgrYS5sZW5ndGg8PTEwLCJjYW5ub3QgaGF2ZSBtb3JlIHRoYW4gMTAgYXV0aG9yaXplZCBpc3N1aW5nIGNvbnRyYWN0cyIpKXtjb25zdCB0PWUuYXV0aG9yaXplZElzc3VpbmdDb250cmFjdHMuY29uY2F0KGEpO2UuYXV0aG9yaXplZElzc3VpbmdDb250cmFjdHM9dCxhd2FpdCBhcGkuZGIudXBkYXRlKCJuZnRzIixlKX19fX19KSxhY3Rpb25zLnJlbW92ZUF1dGhvcml6ZWRJc3N1aW5nQWNjb3VudHM9KGFzeW5jIGU9Pntjb25zdHthY2NvdW50czp0LHN5bWJvbDphLGlzU2lnbmVkV2l0aEFjdGl2ZUtleTppfT1lO2lmKGFwaS5hc3NlcnQoITA9PT1pLCJ5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXkiKSYmYXBpLmFzc2VydChhJiYic3RyaW5nIj09dHlwZW9mIGEmJnQmJiJvYmplY3QiPT10eXBlb2YgdCYmQXJyYXkuaXNBcnJheSh0KSwiaW52YWxpZCBwYXJhbXMiKSYmYXBpLmFzc2VydCh0Lmxlbmd0aDw9MTAsImNhbm5vdCByZW1vdmUgbW9yZSB0aGFuIDEwIGF1dGhvcml6ZWQgaXNzdWluZyBhY2NvdW50cyIpKXtjb25zdCBlPWlzVmFsaWRBY2NvdW50c0FycmF5KHQpO2lmKGFwaS5hc3NlcnQoZSwiaW52YWxpZCBhY2NvdW50IGxpc3QiKSl7Y29uc3QgZT1hd2FpdCBhcGkuZGIuZmluZE9uZSgibmZ0cyIse3N5bWJvbDphfSk7aWYoZSYmYXBpLmFzc2VydChlLmlzc3Vlcj09PWFwaS5zZW5kZXIsIm11c3QgYmUgdGhlIGlzc3VlciIpKXtjb25zdCBhPWUuYXV0aG9yaXplZElzc3VpbmdBY2NvdW50cy5maWx0ZXIoZT0+e2ZvcihsZXQgYT0wO2E8dC5sZW5ndGg7YSs9MSl7aWYoZT09PXRbYV0udHJpbSgpLnRvTG93ZXJDYXNlKCkpcmV0dXJuITF9cmV0dXJuITB9KTtlLmF1dGhvcml6ZWRJc3N1aW5nQWNjb3VudHM9YSxhd2FpdCBhcGkuZGIudXBkYXRlKCJuZnRzIixlKX19fX0pLGFjdGlvbnMucmVtb3ZlQXV0aG9yaXplZElzc3VpbmdDb250cmFjdHM9KGFzeW5jIGU9Pntjb25zdHtjb250cmFjdHM6dCxzeW1ib2w6YSxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6aX09ZTtpZihhcGkuYXNzZXJ0KCEwPT09aSwieW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJmFwaS5hc3NlcnQoYSYmInN0cmluZyI9PXR5cGVvZiBhJiZ0JiYib2JqZWN0Ij09dHlwZW9mIHQmJkFycmF5LmlzQXJyYXkodCksImludmFsaWQgcGFyYW1zIikmJmFwaS5hc3NlcnQodC5sZW5ndGg8PTEwLCJjYW5ub3QgcmVtb3ZlIG1vcmUgdGhhbiAxMCBhdXRob3JpemVkIGlzc3VpbmcgY29udHJhY3RzIikpe2NvbnN0IGU9aXNWYWxpZENvbnRyYWN0c0FycmF5KHQpO2lmKGFwaS5hc3NlcnQoZSwiaW52YWxpZCBjb250cmFjdCBsaXN0Iikpe2NvbnN0IGU9YXdhaXQgYXBpLmRiLmZpbmRPbmUoIm5mdHMiLHtzeW1ib2w6YX0pO2lmKGUmJmFwaS5hc3NlcnQoZS5pc3N1ZXI9PT1hcGkuc2VuZGVyLCJtdXN0IGJlIHRoZSBpc3N1ZXIiKSl7Y29uc3QgYT1lLmF1dGhvcml6ZWRJc3N1aW5nQ29udHJhY3RzLmZpbHRlcihlPT57Zm9yKGxldCBhPTA7YTx0Lmxlbmd0aDthKz0xKXtpZihlPT09dFthXS50cmltKCkpcmV0dXJuITF9cmV0dXJuITB9KTtlLmF1dGhvcml6ZWRJc3N1aW5nQ29udHJhY3RzPWEsYXdhaXQgYXBpLmRiLnVwZGF0ZSgibmZ0cyIsZSl9fX19KSxhY3Rpb25zLnRyYW5zZmVyT3duZXJzaGlwPShhc3luYyBlPT57Y29uc3R7c3ltYm9sOnQsdG86YSxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6aX09ZTtpZihhcGkuYXNzZXJ0KCEwPT09aSwieW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJmFwaS5hc3NlcnQodCYmInN0cmluZyI9PXR5cGVvZiB0JiZhJiYic3RyaW5nIj09dHlwZW9mIGEsImludmFsaWQgcGFyYW1zIikpe2NvbnN0IGU9YXdhaXQgYXBpLmRiLmZpbmRPbmUoIm5mdHMiLHtzeW1ib2w6dH0pO2lmKGUmJmFwaS5hc3NlcnQoZS5pc3N1ZXI9PT1hcGkuc2VuZGVyLCJtdXN0IGJlIHRoZSBpc3N1ZXIiKSl7Y29uc3QgdD1hLnRyaW0oKS50b0xvd2VyQ2FzZSgpO2FwaS5hc3NlcnQoaXNWYWxpZFN0ZWVtQWNjb3VudExlbmd0aCh0KSwiaW52YWxpZCB0byIpJiYoZS5pc3N1ZXI9dCxhd2FpdCBhcGkuZGIudXBkYXRlKCJuZnRzIixlKSl9fX0pLGFjdGlvbnMuZW5hYmxlRGVsZWdhdGlvbj0oYXN5bmMgZT0+e2NvbnN0e3N5bWJvbDp0LHVuZGVsZWdhdGlvbkNvb2xkb3duOmEsaXNTaWduZWRXaXRoQWN0aXZlS2V5Oml9PWUscz1hd2FpdCBhcGkuZGIuZmluZE9uZSgicGFyYW1zIix7fSkse2VuYWJsZURlbGVnYXRpb25GZWU6bn09cyxyPWF3YWl0IGFwaS5kYi5maW5kT25lSW5UYWJsZSgidG9rZW5zIiwiYmFsYW5jZXMiLHthY2NvdW50OmFwaS5zZW5kZXIsc3ltYm9sOiJTU0MifSksbz0hIWFwaS5CaWdOdW1iZXIobikubHRlKDApfHxyJiZhcGkuQmlnTnVtYmVyKHIuYmFsYW5jZSkuZ3RlKG4pO2lmKGFwaS5hc3NlcnQobywieW91IG11c3QgaGF2ZSBlbm91Z2ggdG9rZW5zIHRvIGNvdmVyIGZlZXMiKSYmYXBpLmFzc2VydCghMD09PWksInlvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleSIpJiZhcGkuYXNzZXJ0KHQmJiJzdHJpbmciPT10eXBlb2YgdCwiaW52YWxpZCBzeW1ib2wiKSYmYXBpLmFzc2VydChhJiZOdW1iZXIuaXNJbnRlZ2VyKGEpJiZhPjAmJmE8PTE4MjUwLCJ1bmRlbGVnYXRpb25Db29sZG93biBtdXN0IGJlIGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCAxODI1MCIpKXtjb25zdCBlPWF3YWl0IGFwaS5kYi5maW5kT25lKCJuZnRzIix7c3ltYm9sOnR9KTtpZihhcGkuYXNzZXJ0KG51bGwhPT1lLCJzeW1ib2wgZG9lcyBub3QgZXhpc3QiKSYmYXBpLmFzc2VydChlLmlzc3Vlcj09PWFwaS5zZW5kZXIsIm11c3QgYmUgdGhlIGlzc3VlciIpJiZhcGkuYXNzZXJ0KHZvaWQgMD09PWUuZGVsZWdhdGlvbkVuYWJsZWR8fCExPT09ZS5kZWxlZ2F0aW9uRW5hYmxlZCwiZGVsZWdhdGlvbiBhbHJlYWR5IGVuYWJsZWQiKSl7aWYoYXBpLkJpZ051bWJlcihuKS5ndCgwKSl7Y29uc3QgZT1hd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoInRva2VucyIsInRyYW5zZmVyIix7dG86Im51bGwiLHN5bWJvbDoiU1NDIixxdWFudGl0eTpuLGlzU2lnbmVkV2l0aEFjdGl2ZUtleTppfSk7aWYoIWlzVG9rZW5UcmFuc2ZlclZlcmlmaWVkKGUsYXBpLnNlbmRlciwibnVsbCIsIlNTQyIsbiwidHJhbnNmZXIiKSlyZXR1cm4hMX1yZXR1cm4gZS5kZWxlZ2F0aW9uRW5hYmxlZD0hMCxlLnVuZGVsZWdhdGlvbkNvb2xkb3duPWEsYXdhaXQgYXBpLmRiLnVwZGF0ZSgibmZ0cyIsZSksITB9fXJldHVybiExfSksYWN0aW9ucy51cGRhdGVQcm9wZXJ0eURlZmluaXRpb249KGFzeW5jIGU9Pntjb25zdHtzeW1ib2w6dCxuYW1lOmEsbmV3TmFtZTppLHR5cGU6cyxpc1JlYWRPbmx5Om4saXNTaWduZWRXaXRoQWN0aXZlS2V5OnJ9PWU7aWYoYXBpLmFzc2VydCghMD09PXIsInlvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleSIpJiZhcGkuYXNzZXJ0KHQmJiJzdHJpbmciPT10eXBlb2YgdCYmYSYmInN0cmluZyI9PXR5cGVvZiBhLCJpbnZhbGlkIHBhcmFtcyIpJiZhcGkuYXNzZXJ0KGFwaS52YWxpZGF0b3IuaXNBbHBoYW51bWVyaWMoYSkmJmEubGVuZ3RoPjAmJmEubGVuZ3RoPD0yNSwiaW52YWxpZCBuYW1lOiBsZXR0ZXJzICYgbnVtYmVycyBvbmx5LCBtYXggbGVuZ3RoIG9mIDI1IikmJmFwaS5hc3NlcnQodm9pZCAwPT09aXx8InN0cmluZyI9PXR5cGVvZiBpJiZhcGkudmFsaWRhdG9yLmlzQWxwaGFudW1lcmljKGkpJiZpLmxlbmd0aD4wJiZpLmxlbmd0aDw9MjUsImludmFsaWQgbmV3IG5hbWU6IGxldHRlcnMgJiBudW1iZXJzIG9ubHksIG1heCBsZW5ndGggb2YgMjUiKSYmYXBpLmFzc2VydCh2b2lkIDA9PT1zfHwic3RyaW5nIj09dHlwZW9mIHMmJigibnVtYmVyIj09PXN8fCJzdHJpbmciPT09c3x8ImJvb2xlYW4iPT09cyksImludmFsaWQgdHlwZTogbXVzdCBiZSBudW1iZXIsIHN0cmluZywgb3IgYm9vbGVhbiIpJiZhcGkuYXNzZXJ0KHZvaWQgMD09PW58fCJib29sZWFuIj09dHlwZW9mIG4sImludmFsaWQgaXNSZWFkT25seTogbXVzdCBiZSB0cnVlIG9yIGZhbHNlIikpe2NvbnN0IGU9YXdhaXQgYXBpLmRiLmZpbmRPbmUoIm5mdHMiLHtzeW1ib2w6dH0pO2lmKGUmJmFwaS5hc3NlcnQoMD09PWUuc3VwcGx5LCJjYW5ub3QgY2hhbmdlIGRhdGEgcHJvcGVydHkgZGVmaW5pdGlvbjsgdG9rZW5zIGFscmVhZHkgaXNzdWVkIikmJmFwaS5hc3NlcnQoYSBpbiBlLnByb3BlcnRpZXMsInByb3BlcnR5IG11c3QgZXhpc3QiKSYmYXBpLmFzc2VydChlLmlzc3Vlcj09PWFwaS5zZW5kZXIsIm11c3QgYmUgdGhlIGlzc3VlciIpKXtpZih2b2lkIDAhPT1pKXtpZih2b2lkIDAhPT1lLmdyb3VwQnkmJmUuZ3JvdXBCeS5sZW5ndGg+MCYmIWFwaS5hc3NlcnQoIWUuZ3JvdXBCeS5pbmNsdWRlcyhhKSwiY2Fubm90IGNoYW5nZSBkYXRhIHByb3BlcnR5IG5hbWU7IHByb3BlcnR5IGlzIHBhcnQgb2YgZ3JvdXBCeSIpKXJldHVybiExO2lmKCFhcGkuYXNzZXJ0KGkhPT1hLCJuZXcgbmFtZSBtdXN0IGJlIGRpZmZlcmVudCBmcm9tIG9sZCBuYW1lIil8fCFhcGkuYXNzZXJ0KCEoaSBpbiBlLnByb3BlcnRpZXMpLCJ0aGVyZSBpcyBhbHJlYWR5IGEgZGF0YSBwcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBuZXcgbmFtZSIpKXJldHVybiExfWxldCByPSExO2NvbnN0IG89ZS5wcm9wZXJ0aWVzW2FdLnR5cGUscD1lLnByb3BlcnRpZXNbYV0uaXNSZWFkT25seTtyZXR1cm4gdm9pZCAwIT09cyYmcyE9PW8mJihlLnByb3BlcnRpZXNbYV0udHlwZT1zLHI9ITApLHZvaWQgMCE9PW4mJm4hPT1wJiYoZS5wcm9wZXJ0aWVzW2FdLmlzUmVhZE9ubHk9bixyPSEwKSx2b2lkIDAhPT1pJiZpIT09YSYmKGUucHJvcGVydGllc1tpXT1lLnByb3BlcnRpZXNbYV0sZGVsZXRlIGUucHJvcGVydGllc1thXSxyPSEwKSxyJiYoYXdhaXQgYXBpLmRiLnVwZGF0ZSgibmZ0cyIsZSksYXBpLmVtaXQoInVwZGF0ZVByb3BlcnR5RGVmaW5pdGlvbiIse3N5bWJvbDp0LG9yaWdpbmFsTmFtZTphLG9yaWdpbmFsVHlwZTpvLG9yaWdpbmFsSXNSZWFkT25seTpwLG5ld05hbWU6aSxuZXdUeXBlOnMsbmV3SXNSZWFkT25seTpufSkpLCEwfX1yZXR1cm4hMX0pLGFjdGlvbnMuYWRkUHJvcGVydHk9KGFzeW5jIGU9Pntjb25zdHtzeW1ib2w6dCxuYW1lOmEsdHlwZTppLGlzUmVhZE9ubHk6cyxhdXRob3JpemVkRWRpdGluZ0FjY291bnRzOm4sYXV0aG9yaXplZEVkaXRpbmdDb250cmFjdHM6cixpc1NpZ25lZFdpdGhBY3RpdmVLZXk6b309ZSxwPWF3YWl0IGFwaS5kYi5maW5kT25lKCJwYXJhbXMiLHt9KSx7ZGF0YVByb3BlcnR5Q3JlYXRpb25GZWU6Y309cDtpZihhcGkuYXNzZXJ0KCEwPT09bywieW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJmFwaS5hc3NlcnQodCYmInN0cmluZyI9PXR5cGVvZiB0JiZhJiYic3RyaW5nIj09dHlwZW9mIGEmJih2b2lkIDA9PT1zfHwiYm9vbGVhbiI9PXR5cGVvZiBzKSYmKHZvaWQgMD09PW58fG4mJiJvYmplY3QiPT10eXBlb2YgbiYmQXJyYXkuaXNBcnJheShuKSkmJih2b2lkIDA9PT1yfHxyJiYib2JqZWN0Ij09dHlwZW9mIHImJkFycmF5LmlzQXJyYXkocikpJiZpJiYic3RyaW5nIj09dHlwZW9mIGksImludmFsaWQgcGFyYW1zIikmJmFwaS5hc3NlcnQoYXBpLnZhbGlkYXRvci5pc0FscGhhbnVtZXJpYyhhKSYmYS5sZW5ndGg+MCYmYS5sZW5ndGg8PTI1LCJpbnZhbGlkIG5hbWU6IGxldHRlcnMgJiBudW1iZXJzIG9ubHksIG1heCBsZW5ndGggb2YgMjUiKSYmYXBpLmFzc2VydCgibnVtYmVyIj09PWl8fCJzdHJpbmciPT09aXx8ImJvb2xlYW4iPT09aSwiaW52YWxpZCB0eXBlOiBtdXN0IGJlIG51bWJlciwgc3RyaW5nLCBvciBib29sZWFuIikpe2NvbnN0IGU9YXdhaXQgYXBpLmRiLmZpbmRPbmUoIm5mdHMiLHtzeW1ib2w6dH0pO2lmKGUmJmFwaS5hc3NlcnQoIShhIGluIGUucHJvcGVydGllcyksImNhbm5vdCBhZGQgdGhlIHNhbWUgcHJvcGVydHkgdHdpY2UiKSYmYXBpLmFzc2VydChlLmlzc3Vlcj09PWFwaS5zZW5kZXIsIm11c3QgYmUgdGhlIGlzc3VlciIpKXtpZihPYmplY3Qua2V5cyhlLnByb3BlcnRpZXMpLmxlbmd0aD49Myl7Y29uc3QgZT1hd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoInRva2VucyIsImJhbGFuY2VzIix7YWNjb3VudDphcGkuc2VuZGVyLHN5bWJvbDoiU1NDIn0pLHQ9ISFhcGkuQmlnTnVtYmVyKGMpLmx0ZSgwKXx8ZSYmYXBpLkJpZ051bWJlcihlLmJhbGFuY2UpLmd0ZShjKTtpZighYXBpLmFzc2VydCh0LCJ5b3UgbXVzdCBoYXZlIGVub3VnaCB0b2tlbnMgdG8gY292ZXIgdGhlIGNyZWF0aW9uIGZlZXMiKSlyZXR1cm4hMTtpZihhcGkuQmlnTnVtYmVyKGMpLmd0KDApKXtjb25zdCBlPWF3YWl0IGFwaS5leGVjdXRlU21hcnRDb250cmFjdCgidG9rZW5zIiwidHJhbnNmZXIiLHt0bzoibnVsbCIsc3ltYm9sOiJTU0MiLHF1YW50aXR5OmMsaXNTaWduZWRXaXRoQWN0aXZlS2V5Om99KTtpZighaXNUb2tlblRyYW5zZmVyVmVyaWZpZWQoZSxhcGkuc2VuZGVyLCJudWxsIiwiU1NDIixjLCJ0cmFuc2ZlciIpKXJldHVybiExfX1jb25zdCBwPXt0eXBlOmksaXNSZWFkT25seTp2b2lkIDAhPT1zJiZzLGF1dGhvcml6ZWRFZGl0aW5nQWNjb3VudHM6dm9pZCAwPT09bj9bYXBpLnNlbmRlcl06W10sYXV0aG9yaXplZEVkaXRpbmdDb250cmFjdHM6W119O3JldHVybiBlLnByb3BlcnRpZXNbYV09cCxhd2FpdCBhcGkuZGIudXBkYXRlKCJuZnRzIixlKSwobnx8cikmJmF3YWl0IGFjdGlvbnMuc2V0UHJvcGVydHlQZXJtaXNzaW9ucyh7c3ltYm9sOnQsbmFtZTphLGFjY291bnRzOm4sY29udHJhY3RzOnIsaXNTaWduZWRXaXRoQWN0aXZlS2V5Om99KSwhMH19cmV0dXJuITF9KSxhY3Rpb25zLnNldFByb3BlcnR5UGVybWlzc2lvbnM9KGFzeW5jIGU9Pntjb25zdHtzeW1ib2w6dCxuYW1lOmEsYWNjb3VudHM6aSxjb250cmFjdHM6cyxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6bn09ZTtpZihhcGkuYXNzZXJ0KCEwPT09biwieW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJmFwaS5hc3NlcnQodCYmInN0cmluZyI9PXR5cGVvZiB0JiZhJiYic3RyaW5nIj09dHlwZW9mIGEmJih2b2lkIDA9PT1pfHxpJiYib2JqZWN0Ij09dHlwZW9mIGkmJkFycmF5LmlzQXJyYXkoaSkpJiYodm9pZCAwPT09c3x8cyYmIm9iamVjdCI9PXR5cGVvZiBzJiZBcnJheS5pc0FycmF5KHMpKSwiaW52YWxpZCBwYXJhbXMiKSYmYXBpLmFzc2VydChhcGkudmFsaWRhdG9yLmlzQWxwaGFudW1lcmljKGEpJiZhLmxlbmd0aD4wJiZhLmxlbmd0aDw9MjUsImludmFsaWQgbmFtZTogbGV0dGVycyAmIG51bWJlcnMgb25seSwgbWF4IGxlbmd0aCBvZiAyNSIpJiZhcGkuYXNzZXJ0KHZvaWQgMD09PWl8fGkubGVuZ3RoPD0xMCwiY2Fubm90IGhhdmUgbW9yZSB0aGFuIDEwIGF1dGhvcml6ZWQgYWNjb3VudHMiKSYmYXBpLmFzc2VydCh2b2lkIDA9PT1zfHxzLmxlbmd0aDw9MTAsImNhbm5vdCBoYXZlIG1vcmUgdGhhbiAxMCBhdXRob3JpemVkIGNvbnRyYWN0cyIpJiZhcGkuYXNzZXJ0KHZvaWQgMD09PWl8fGlzVmFsaWRBY2NvdW50c0FycmF5KGkpLCJpbnZhbGlkIGFjY291bnQgbGlzdCIpJiZhcGkuYXNzZXJ0KHZvaWQgMD09PXN8fGlzVmFsaWRDb250cmFjdHNBcnJheShzKSwiaW52YWxpZCBjb250cmFjdCBsaXN0Iikpe2NvbnN0IGU9YXdhaXQgYXBpLmRiLmZpbmRPbmUoIm5mdHMiLHtzeW1ib2w6dH0pO2lmKGUmJmFwaS5hc3NlcnQoYSBpbiBlLnByb3BlcnRpZXMsInByb3BlcnR5IG11c3QgZXhpc3QiKSYmYXBpLmFzc2VydChlLmlzc3Vlcj09PWFwaS5zZW5kZXIsIm11c3QgYmUgdGhlIGlzc3VlciIpKXtsZXQgdD1bXSxuPVtdO2lmKGkmJih0PWkubWFwKGU9PmUudHJpbSgpLnRvTG93ZXJDYXNlKCkpKSxzJiYobj1zLm1hcChlPT5lLnRyaW0oKSkpLGFwaS5hc3NlcnQodm9pZCAwPT09aXx8IWNvbnRhaW5zRHVwbGljYXRlcyh0KSwiY2Fubm90IGFkZCB0aGUgc2FtZSBhY2NvdW50IHR3aWNlIikmJmFwaS5hc3NlcnQodm9pZCAwPT09c3x8IWNvbnRhaW5zRHVwbGljYXRlcyhuKSwiY2Fubm90IGFkZCB0aGUgc2FtZSBjb250cmFjdCB0d2ljZSIpKXtsZXQgcj0hMTtpJiYoZS5wcm9wZXJ0aWVzW2FdLmF1dGhvcml6ZWRFZGl0aW5nQWNjb3VudHM9dCxyPSEwKSxzJiYoZS5wcm9wZXJ0aWVzW2FdLmF1dGhvcml6ZWRFZGl0aW5nQ29udHJhY3RzPW4scj0hMCksciYmYXdhaXQgYXBpLmRiLnVwZGF0ZSgibmZ0cyIsZSl9fX19KSxhY3Rpb25zLnNldEdyb3VwQnk9KGFzeW5jIGU9Pntjb25zdHtzeW1ib2w6dCxwcm9wZXJ0aWVzOmEsaXNTaWduZWRXaXRoQWN0aXZlS2V5Oml9PWU7aWYoYXBpLmFzc2VydCghMD09PWksInlvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleSIpJiZhcGkuYXNzZXJ0KHQmJiJzdHJpbmciPT10eXBlb2YgdCYmYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZBcnJheS5pc0FycmF5KGEpLCJpbnZhbGlkIHBhcmFtcyIpKXtjb25zdCBlPWF3YWl0IGFwaS5kYi5maW5kT25lKCJuZnRzIix7c3ltYm9sOnR9KTtpZihlKXtjb25zdCB0PU9iamVjdC5rZXlzKGUucHJvcGVydGllcykubGVuZ3RoO2lmKGFwaS5hc3NlcnQoZS5pc3N1ZXI9PT1hcGkuc2VuZGVyLCJtdXN0IGJlIHRoZSBpc3N1ZXIiKSYmYXBpLmFzc2VydCh2b2lkIDA9PT1lLmdyb3VwQnl8fDA9PT1lLmdyb3VwQnkubGVuZ3RoLCJsaXN0IGlzIGFscmVhZHkgc2V0IikmJmFwaS5hc3NlcnQoYS5sZW5ndGg8PXQsImNhbm5vdCBzZXQgbW9yZSBkYXRhIHByb3BlcnRpZXMgdGhhbiBORlQgaGFzIikmJmFwaS5hc3NlcnQoIWNvbnRhaW5zRHVwbGljYXRlcyhhKSwibGlzdCBjYW5ub3QgY29udGFpbiBkdXBsaWNhdGVzIikpe2ZvcihsZXQgdD0wO3Q8YS5sZW5ndGg7dCs9MSl7Y29uc3QgaT1hW3RdO2lmKCFhcGkuYXNzZXJ0KGkmJiJzdHJpbmciPT10eXBlb2YgaSYmaSBpbiBlLnByb3BlcnRpZXMsImRhdGEgcHJvcGVydHkgbXVzdCBleGlzdCIpKXJldHVybiExfXJldHVybiBlLmdyb3VwQnk9YSxhd2FpdCBhcGkuZGIudXBkYXRlKCJuZnRzIixlKSwhMH19fXJldHVybiExfSksYWN0aW9ucy5zZXRQcm9wZXJ0aWVzPShhc3luYyBlPT57Y29uc3R7c3ltYm9sOnQsZnJvbVR5cGU6YSxuZnRzOmksY2FsbGluZ0NvbnRyYWN0SW5mbzpzfT1lLG49dm9pZCAwPT09YT8idXNlciI6YTtpZihhcGkuYXNzZXJ0KGkmJiJvYmplY3QiPT10eXBlb2YgaSYmQXJyYXkuaXNBcnJheShpKSYmbiYmInN0cmluZyI9PXR5cGVvZiBuJiZbInVzZXIiLCJjb250cmFjdCJdLmluY2x1ZGVzKG4pJiZ0JiYic3RyaW5nIj09dHlwZW9mIHQmJihzfHx2b2lkIDA9PT1zJiYidXNlciI9PT1uKSwiaW52YWxpZCBwYXJhbXMiKSYmYXBpLmFzc2VydChpLmxlbmd0aDw9NTAsImNhbm5vdCBzZXQgcHJvcGVydGllcyBvbiBtb3JlIHRoYW4gNTAgTkZUIGluc3RhbmNlcyBhdCBvbmNlIikpe2NvbnN0IGU9InVzZXIiPT09bj9hcGkuc2VuZGVyOnMubmFtZSxhPWF3YWl0IGFwaS5kYi5maW5kT25lKCJuZnRzIix7c3ltYm9sOnR9KTtpZihhcGkuYXNzZXJ0KG51bGwhPT1hLCJzeW1ib2wgZG9lcyBub3QgZXhpc3QiKSl7aWYoIWlzVmFsaWREYXRhUHJvcGVydGllc0FycmF5KGUsbixhLGkpKXJldHVybiExO2NvbnN0IHM9dCsiaW5zdGFuY2VzIjtmb3IobGV0IGU9MDtlPGkubGVuZ3RoO2UrPTEpe2NvbnN0e2lkOnQscHJvcGVydGllczpufT1pW2VdO2lmKDA9PT1PYmplY3Qua2V5cyhuKS5sZW5ndGgpY29udGludWU7Y29uc3Qgcj1hd2FpdCBhcGkuZGIuZmluZE9uZShzLHtfaWQ6YXBpLkJpZ051bWJlcih0KS50b051bWJlcigpfSk7aWYoYXBpLmFzc2VydChudWxsIT09ciwibmZ0IGluc3RhbmNlIGRvZXMgbm90IGV4aXN0Iikpe2xldCBlPSExO2Zvcihjb25zdFt0LGldb2YgT2JqZWN0LmVudHJpZXMobikpe2EucHJvcGVydGllc1t0XS5pc1JlYWRPbmx5P2FwaS5hc3NlcnQoISh0IGluIHIucHJvcGVydGllcyksImNhbm5vdCBlZGl0IHJlYWQtb25seSBwcm9wZXJ0aWVzIikmJihyLnByb3BlcnRpZXNbdF09aSxlPSEwKTooci5wcm9wZXJ0aWVzW3RdPWksZT0hMCl9ZSYmYXdhaXQgYXBpLmRiLnVwZGF0ZShzLHIpfX1yZXR1cm4hMH19cmV0dXJuITF9KSxhY3Rpb25zLmJ1cm49KGFzeW5jIGU9Pntjb25zdHtmcm9tVHlwZTp0LG5mdHM6YSxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6aSxjYWxsaW5nQ29udHJhY3RJbmZvOnN9PWUsbj12b2lkIDA9PT10PyJ1c2VyIjp0O2lmKGFwaS5hc3NlcnQoITA9PT1pLCJ5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXkiKSYmYXBpLmFzc2VydChuJiYic3RyaW5nIj09dHlwZW9mIG4mJlsidXNlciIsImNvbnRyYWN0Il0uaW5jbHVkZXMobikmJihzfHx2b2lkIDA9PT1zJiYidXNlciI9PT1uKSYmYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZBcnJheS5pc0FycmF5KGEpLCJpbnZhbGlkIHBhcmFtcyIpJiZpc1ZhbGlkTmZ0SWRBcnJheShhKSl7Y29uc3QgZT0idXNlciI9PT1uP2FwaS5zZW5kZXI6cy5uYW1lO2ZvcihsZXQgdD0wO3Q8YS5sZW5ndGg7dCs9MSl7Y29uc3R7c3ltYm9sOmksaWRzOnN9PWFbdF0scj1hd2FpdCBhcGkuZGIuZmluZE9uZSgibmZ0cyIse3N5bWJvbDppfSk7aWYocil7Y29uc3QgdD1pKyJpbnN0YW5jZXMiO2ZvcihsZXQgYT0wO2E8cy5sZW5ndGg7YSs9MSl7Y29uc3Qgbz1zW2FdLHA9YXdhaXQgYXBpLmRiLmZpbmRPbmUodCx7X2lkOmFwaS5CaWdOdW1iZXIobykudG9OdW1iZXIoKX0pO2lmKHAmJnAuYWNjb3VudD09PWUmJigidSI9PT1wLm93bmVkQnkmJiJ1c2VyIj09PW58fCJjIj09PXAub3duZWRCeSYmImNvbnRyYWN0Ij09PW4pJiZ2b2lkIDA9PT1wLmRlbGVnYXRlZFRvKXtjb25zdCBhPXt9O2xldCBzPSEwO2Zvcihjb25zdFt0LGldb2YgT2JqZWN0LmVudHJpZXMocC5sb2NrZWRUb2tlbnMpKXtjb25zdCByPWF3YWl0IGFwaS50cmFuc2ZlclRva2VucyhlLHQsaSxuKTtpc1Rva2VuVHJhbnNmZXJWZXJpZmllZChyLCJuZnQiLGUsdCxpLCJ0cmFuc2ZlckZyb21Db250cmFjdCIpfHwoYVt0XT1pLHM9ITEpfWFwaS5hc3NlcnQocyxgdW5hYmxlIHRvIHJlbGVhc2UgbG9ja2VkIHRva2VuczogJHtpfSwgaWQgJHtvfWApO2NvbnN0IGM9cC5vd25lZEJ5LGQ9cC5sb2NrZWRUb2tlbnM7cC5sb2NrZWRUb2tlbnM9YSxzJiYocC5wcmV2aW91c0FjY291bnQ9cC5hY2NvdW50LHAucHJldmlvdXNPd25lZEJ5PXAub3duZWRCeSxwLmFjY291bnQ9Im51bGwiLHAub3duZWRCeT0idSIsci5jaXJjdWxhdGluZ1N1cHBseS09MSksYXdhaXQgYXBpLmRiLnVwZGF0ZSh0LHApLHMmJmFwaS5lbWl0KCJidXJuIix7YWNjb3VudDplLG93bmVkQnk6Yyx1bmxvY2tlZFRva2VuczpkLHN5bWJvbDppLGlkOm99KX19YXdhaXQgYXBpLmRiLnVwZGF0ZSgibmZ0cyIscil9fX19KSxhY3Rpb25zLnRyYW5zZmVyPShhc3luYyBlPT57Y29uc3R7ZnJvbVR5cGU6dCx0bzphLHRvVHlwZTppLG5mdHM6cyxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6bixjYWxsaW5nQ29udHJhY3RJbmZvOnJ9PWUsbz1bInVzZXIiLCJjb250cmFjdCJdLHA9dm9pZCAwPT09aT8idXNlciI6aSxjPXZvaWQgMD09PXQ/InVzZXIiOnQ7aWYoYXBpLmFzc2VydCghMD09PW4sInlvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleSIpJiZhcGkuYXNzZXJ0KGMmJiJzdHJpbmciPT10eXBlb2YgYyYmby5pbmNsdWRlcyhjKSYmYSYmInN0cmluZyI9PXR5cGVvZiBhJiZwJiYic3RyaW5nIj09dHlwZW9mIHAmJm8uaW5jbHVkZXMocCkmJihyfHx2b2lkIDA9PT1yJiYidXNlciI9PT1jKSYmcyYmIm9iamVjdCI9PXR5cGVvZiBzJiZBcnJheS5pc0FycmF5KHMpLCJpbnZhbGlkIHBhcmFtcyIpJiZpc1ZhbGlkTmZ0SWRBcnJheShzKSl7Y29uc3QgZT0idXNlciI9PT1wP2EudHJpbSgpLnRvTG93ZXJDYXNlKCk6YS50cmltKCksdD0idXNlciI9PT1wP2lzVmFsaWRTdGVlbUFjY291bnRMZW5ndGgoZSk6aXNWYWxpZENvbnRyYWN0TGVuZ3RoKGUpLGk9InVzZXIiPT09Yz9hcGkuc2VuZGVyOnIubmFtZTtpZihhcGkuYXNzZXJ0KHQsImludmFsaWQgdG8iKSYmYXBpLmFzc2VydCghKHA9PT1jJiZlPT09aSksImNhbm5vdCB0cmFuc2ZlciB0byBzZWxmIikmJmFwaS5hc3NlcnQoISgidXNlciI9PT1wJiYibnVsbCI9PT1lKSwiY2Fubm90IHRyYW5zZmVyIHRvIG51bGw7IHVzZSBidXJuIGFjdGlvbiBpbnN0ZWFkIikpZm9yKGxldCB0PTA7dDxzLmxlbmd0aDt0Kz0xKXtjb25zdHtzeW1ib2w6YSxpZHM6bn09c1t0XTtpZihhd2FpdCBhcGkuZGIuZmluZE9uZSgibmZ0cyIse3N5bWJvbDphfSkpe2NvbnN0IHQ9YSsiaW5zdGFuY2VzIjtmb3IobGV0IHM9MDtzPG4ubGVuZ3RoO3MrPTEpe2NvbnN0IHI9bltzXSxvPWF3YWl0IGFwaS5kYi5maW5kT25lKHQse19pZDphcGkuQmlnTnVtYmVyKHIpLnRvTnVtYmVyKCl9KTtpZihvJiZvLmFjY291bnQ9PT1pJiYoInUiPT09by5vd25lZEJ5JiYidXNlciI9PT1jfHwiYyI9PT1vLm93bmVkQnkmJiJjb250cmFjdCI9PT1jKSYmdm9pZCAwPT09by5kZWxlZ2F0ZWRUbyl7Y29uc3Qgcz1vLm93bmVkQnksbj0idXNlciI9PT1wPyJ1IjoiYyI7by5wcmV2aW91c0FjY291bnQ9by5hY2NvdW50LG8ucHJldmlvdXNPd25lZEJ5PW8ub3duZWRCeSxvLmFjY291bnQ9ZSxvLm93bmVkQnk9bixhd2FpdCBhcGkuZGIudXBkYXRlKHQsbyksYXBpLmVtaXQoInRyYW5zZmVyIix7ZnJvbTppLGZyb21UeXBlOnMsdG86ZSx0b1R5cGU6bixzeW1ib2w6YSxpZDpyfSl9fX19fX0pLGFjdGlvbnMuZGVsZWdhdGU9KGFzeW5jIGU9Pntjb25zdHtmcm9tVHlwZTp0LHRvOmEsdG9UeXBlOmksbmZ0czpzLGlzU2lnbmVkV2l0aEFjdGl2ZUtleTpuLGNhbGxpbmdDb250cmFjdEluZm86cn09ZSxvPVsidXNlciIsImNvbnRyYWN0Il0scD12b2lkIDA9PT1pPyJ1c2VyIjppLGM9dm9pZCAwPT09dD8idXNlciI6dDtpZihhcGkuYXNzZXJ0KCEwPT09biwieW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJmFwaS5hc3NlcnQoYyYmInN0cmluZyI9PXR5cGVvZiBjJiZvLmluY2x1ZGVzKGMpJiZhJiYic3RyaW5nIj09dHlwZW9mIGEmJnAmJiJzdHJpbmciPT10eXBlb2YgcCYmby5pbmNsdWRlcyhwKSYmKHJ8fHZvaWQgMD09PXImJiJ1c2VyIj09PWMpJiZzJiYib2JqZWN0Ij09dHlwZW9mIHMmJkFycmF5LmlzQXJyYXkocyksImludmFsaWQgcGFyYW1zIikmJmlzVmFsaWROZnRJZEFycmF5KHMpKXtjb25zdCBlPSJ1c2VyIj09PXA/YS50cmltKCkudG9Mb3dlckNhc2UoKTphLnRyaW0oKSx0PSJ1c2VyIj09PXA/aXNWYWxpZFN0ZWVtQWNjb3VudExlbmd0aChlKTppc1ZhbGlkQ29udHJhY3RMZW5ndGgoZSksaT0idXNlciI9PT1jP2FwaS5zZW5kZXI6ci5uYW1lO2lmKGFwaS5hc3NlcnQodCwiaW52YWxpZCB0byIpJiZhcGkuYXNzZXJ0KCEocD09PWMmJmU9PT1pKSwiY2Fubm90IGRlbGVnYXRlIHRvIHNlbGYiKSYmYXBpLmFzc2VydCghKCJ1c2VyIj09PXAmJiJudWxsIj09PWUpLCJjYW5ub3QgZGVsZWdhdGUgdG8gbnVsbCIpKWZvcihsZXQgdD0wO3Q8cy5sZW5ndGg7dCs9MSl7Y29uc3R7c3ltYm9sOmEsaWRzOm59PXNbdF0scj1hd2FpdCBhcGkuZGIuZmluZE9uZSgibmZ0cyIse3N5bWJvbDphfSk7aWYociYmYXBpLmFzc2VydCghMD09PXIuZGVsZWdhdGlvbkVuYWJsZWQsYGRlbGVnYXRpb24gbm90IGVuYWJsZWQgZm9yICR7YX1gKSl7Y29uc3QgdD1hKyJpbnN0YW5jZXMiO2ZvcihsZXQgcz0wO3M8bi5sZW5ndGg7cys9MSl7Y29uc3Qgcj1uW3NdLG89YXdhaXQgYXBpLmRiLmZpbmRPbmUodCx7X2lkOmFwaS5CaWdOdW1iZXIocikudG9OdW1iZXIoKX0pO2lmKG8mJm8uYWNjb3VudD09PWkmJigidSI9PT1vLm93bmVkQnkmJiJ1c2VyIj09PWN8fCJjIj09PW8ub3duZWRCeSYmImNvbnRyYWN0Ij09PWMpJiZ2b2lkIDA9PT1vLmRlbGVnYXRlZFRvKXtjb25zdCBzPSJ1c2VyIj09PXA/InUiOiJjIixuPXthY2NvdW50OmUsb3duZWRCeTpzfTtvLmRlbGVnYXRlZFRvPW4sYXdhaXQgYXBpLmRiLnVwZGF0ZSh0LG8pLGFwaS5lbWl0KCJkZWxlZ2F0ZSIse2Zyb206aSxmcm9tVHlwZTpvLm93bmVkQnksdG86ZSx0b1R5cGU6cyxzeW1ib2w6YSxpZDpyfSl9fX19fX0pLGFjdGlvbnMudW5kZWxlZ2F0ZT0oYXN5bmMgZT0+e2NvbnN0e2Zyb21UeXBlOnQsbmZ0czphLGlzU2lnbmVkV2l0aEFjdGl2ZUtleTppLGNhbGxpbmdDb250cmFjdEluZm86c309ZSxuPXZvaWQgMD09PXQ/InVzZXIiOnQ7aWYoYXBpLmFzc2VydCghMD09PWksInlvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleSIpJiZhcGkuYXNzZXJ0KG4mJiJzdHJpbmciPT10eXBlb2YgbiYmWyJ1c2VyIiwiY29udHJhY3QiXS5pbmNsdWRlcyhuKSYmKHN8fHZvaWQgMD09PXMmJiJ1c2VyIj09PW4pJiZhJiYib2JqZWN0Ij09dHlwZW9mIGEmJkFycmF5LmlzQXJyYXkoYSksImludmFsaWQgcGFyYW1zIikmJmlzVmFsaWROZnRJZEFycmF5KGEpKXtjb25zdCBlPSJ1c2VyIj09PW4/YXBpLnNlbmRlcjpzLm5hbWUsdD1uZXcgRGF0ZShgJHthcGkuc3RlZW1CbG9ja1RpbWVzdGFtcH0uMDAwWmApO2ZvcihsZXQgaT0wO2k8YS5sZW5ndGg7aSs9MSl7Y29uc3R7c3ltYm9sOnMsaWRzOnJ9PWFbaV0sbz1hd2FpdCBhcGkuZGIuZmluZE9uZSgibmZ0cyIse3N5bWJvbDpzfSk7aWYobyYmYXBpLmFzc2VydCghMD09PW8uZGVsZWdhdGlvbkVuYWJsZWQsYGRlbGVnYXRpb24gbm90IGVuYWJsZWQgZm9yICR7c31gKSl7Y29uc3QgYT0yNCpvLnVuZGVsZWdhdGlvbkNvb2xkb3duKjM2MDAqMWUzLGk9dC5nZXRUaW1lKCkrYSxwPXMrImluc3RhbmNlcyIsYz17c3ltYm9sOnMsaWRzOltdLGNvbXBsZXRlVGltZXN0YW1wOml9O2ZvcihsZXQgdD0wO3Q8ci5sZW5ndGg7dCs9MSl7Y29uc3QgYT1yW3RdLG89YXdhaXQgYXBpLmRiLmZpbmRPbmUocCx7X2lkOmFwaS5CaWdOdW1iZXIoYSkudG9OdW1iZXIoKX0pO28mJm8uYWNjb3VudD09PWUmJigidSI9PT1vLm93bmVkQnkmJiJ1c2VyIj09PW58fCJjIj09PW8ub3duZWRCeSYmImNvbnRyYWN0Ij09PW4pJiZvLmRlbGVnYXRlZFRvJiZ2b2lkIDA9PT1vLmRlbGVnYXRlZFRvLnVuZGVsZWdhdGVBdCYmKG8uZGVsZWdhdGVkVG8udW5kZWxlZ2F0ZUF0PWksYy5pZHMucHVzaChvLl9pZCksYXdhaXQgYXBpLmRiLnVwZGF0ZShwLG8pLGFwaS5lbWl0KCJ1bmRlbGVnYXRlU3RhcnQiLHtmcm9tOm8uZGVsZWdhdGVkVG8uYWNjb3VudCxmcm9tVHlwZTpvLmRlbGVnYXRlZFRvLm93bmVkQnksc3ltYm9sOnMsaWQ6YX0pKX1jLmlkcy5sZW5ndGg+MCYmYXdhaXQgYXBpLmRiLmluc2VydCgicGVuZGluZ1VuZGVsZWdhdGlvbnMiLGMpfX19fSk7Y29uc3QgcHJvY2Vzc1VuZGVsZWdhdGlvbj1hc3luYyBlPT57Y29uc3R7c3ltYm9sOnQsaWRzOmF9PWUsaT10KyJpbnN0YW5jZXMiLHM9YXdhaXQgYXBpLmRiLmZpbmQoaSx7X2lkOnskaW46YX19LDUwLDAsW3tpbmRleDoiX2lkIixkZXNjZW5kaW5nOiExfV0pO2ZvcihsZXQgZT0wO2U8cy5sZW5ndGg7ZSs9MSlkZWxldGUgc1tlXS5kZWxlZ2F0ZWRUbyxhd2FpdCBhcGkuZGIudXBkYXRlKGksc1tlXSx7ZGVsZWdhdGVkVG86IiJ9KTthd2FpdCBhcGkuZGIucmVtb3ZlKCJwZW5kaW5nVW5kZWxlZ2F0aW9ucyIsZSksYXBpLmVtaXQoInVuZGVsZWdhdGVEb25lIix7c3ltYm9sOnQsaWRzOmF9KX07YWN0aW9ucy5jaGVja1BlbmRpbmdVbmRlbGVnYXRpb25zPShhc3luYygpPT57aWYoYXBpLmFzc2VydCgibnVsbCI9PT1hcGkuc2VuZGVyLCJub3QgYXV0aG9yaXplZCIpKXtjb25zdCBlPW5ldyBEYXRlKGAke2FwaS5zdGVlbUJsb2NrVGltZXN0YW1wfS4wMDBaYCkuZ2V0VGltZSgpO2xldCB0PWF3YWl0IGFwaS5kYi5maW5kKCJwZW5kaW5nVW5kZWxlZ2F0aW9ucyIse2NvbXBsZXRlVGltZXN0YW1wOnskbHRlOmV9fSksYT10Lmxlbmd0aDtmb3IoO2E+MDspe2ZvcihsZXQgZT0wO2U8YTtlKz0xKXtjb25zdCBhPXRbZV07YXdhaXQgcHJvY2Vzc1VuZGVsZWdhdGlvbihhKX1hPSh0PWF3YWl0IGFwaS5kYi5maW5kKCJwZW5kaW5nVW5kZWxlZ2F0aW9ucyIse2NvbXBsZXRlVGltZXN0YW1wOnskbHRlOmV9fSkpLmxlbmd0aH19fSksYWN0aW9ucy5jcmVhdGU9KGFzeW5jIGU9Pntjb25zdHtuYW1lOnQsb3JnTmFtZTphLHByb2R1Y3ROYW1lOmksc3ltYm9sOnMsdXJsOm4sbWF4U3VwcGx5OnIsYXV0aG9yaXplZElzc3VpbmdBY2NvdW50czpvLGF1dGhvcml6ZWRJc3N1aW5nQ29udHJhY3RzOnAsaXNTaWduZWRXaXRoQWN0aXZlS2V5OmN9PWUsZD1hd2FpdCBhcGkuZGIuZmluZE9uZSgicGFyYW1zIix7fSkse25mdENyZWF0aW9uRmVlOmx9PWQsdT1hd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoInRva2VucyIsImJhbGFuY2VzIix7YWNjb3VudDphcGkuc2VuZGVyLHN5bWJvbDoiU1NDIn0pLHk9ISFhcGkuQmlnTnVtYmVyKGwpLmx0ZSgwKXx8dSYmYXBpLkJpZ051bWJlcih1LmJhbGFuY2UpLmd0ZShsKTtpZihhcGkuYXNzZXJ0KHksInlvdSBtdXN0IGhhdmUgZW5vdWdoIHRva2VucyB0byBjb3ZlciB0aGUgY3JlYXRpb24gZmVlcyIpJiZhcGkuYXNzZXJ0KCEwPT09YywieW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJmFwaS5hc3NlcnQodCYmInN0cmluZyI9PXR5cGVvZiB0JiZzJiYic3RyaW5nIj09dHlwZW9mIHMmJih2b2lkIDA9PT1ufHxuJiYic3RyaW5nIj09dHlwZW9mIG4pJiYodm9pZCAwPT09YXx8YSYmInN0cmluZyI9PXR5cGVvZiBhKSYmKHZvaWQgMD09PWl8fGkmJiJzdHJpbmciPT10eXBlb2YgaSkmJih2b2lkIDA9PT1vfHxvJiYib2JqZWN0Ij09dHlwZW9mIG8mJkFycmF5LmlzQXJyYXkobykpJiYodm9pZCAwPT09cHx8cCYmIm9iamVjdCI9PXR5cGVvZiBwJiZBcnJheS5pc0FycmF5KHApKSYmKHZvaWQgMD09PXJ8fHImJiJzdHJpbmciPT10eXBlb2YgciYmIWFwaS5CaWdOdW1iZXIocikuaXNOYU4oKSksImludmFsaWQgcGFyYW1zIikmJmFwaS5hc3NlcnQoYXBpLnZhbGlkYXRvci5pc0FscGhhKHMpJiZhcGkudmFsaWRhdG9yLmlzVXBwZXJjYXNlKHMpJiZzLmxlbmd0aD4wJiZzLmxlbmd0aDw9MTAsImludmFsaWQgc3ltYm9sOiB1cHBlcmNhc2UgbGV0dGVycyBvbmx5LCBtYXggbGVuZ3RoIG9mIDEwIikmJmFwaS5hc3NlcnQoYXBpLnZhbGlkYXRvci5pc0FscGhhbnVtZXJpYyhhcGkudmFsaWRhdG9yLmJsYWNrbGlzdCh0LCIgIikpJiZ0Lmxlbmd0aD4wJiZ0Lmxlbmd0aDw9NTAsImludmFsaWQgbmFtZTogbGV0dGVycywgbnVtYmVycywgd2hpdGVzcGFjZXMgb25seSwgbWF4IGxlbmd0aCBvZiA1MCIpJiZhcGkuYXNzZXJ0KHZvaWQgMD09PWF8fGFwaS52YWxpZGF0b3IuaXNBbHBoYW51bWVyaWMoYXBpLnZhbGlkYXRvci5ibGFja2xpc3QoYSwiICIpKSYmYS5sZW5ndGg+MCYmYS5sZW5ndGg8PTUwLCJpbnZhbGlkIG9yZyBuYW1lOiBsZXR0ZXJzLCBudW1iZXJzLCB3aGl0ZXNwYWNlcyBvbmx5LCBtYXggbGVuZ3RoIG9mIDUwIikmJmFwaS5hc3NlcnQodm9pZCAwPT09aXx8YXBpLnZhbGlkYXRvci5pc0FscGhhbnVtZXJpYyhhcGkudmFsaWRhdG9yLmJsYWNrbGlzdChpLCIgIikpJiZpLmxlbmd0aD4wJiZpLmxlbmd0aDw9NTAsImludmFsaWQgcHJvZHVjdCBuYW1lOiBsZXR0ZXJzLCBudW1iZXJzLCB3aGl0ZXNwYWNlcyBvbmx5LCBtYXggbGVuZ3RoIG9mIDUwIikmJmFwaS5hc3NlcnQodm9pZCAwPT09bnx8bi5sZW5ndGg8PTI1NSwiaW52YWxpZCB1cmw6IG1heCBsZW5ndGggb2YgMjU1IikmJmFwaS5hc3NlcnQodm9pZCAwPT09cnx8YXBpLkJpZ051bWJlcihyKS5ndCgwKSwibWF4U3VwcGx5IG11c3QgYmUgcG9zaXRpdmUiKSYmYXBpLmFzc2VydCh2b2lkIDA9PT1yfHxhcGkuQmlnTnVtYmVyKHIpLmx0ZShOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiksYG1heFN1cHBseSBtdXN0IGJlIGxvd2VyIHRoYW4gJHtOdW1iZXIuTUFYX1NBRkVfSU5URUdFUn1gKSl7Y29uc3QgZT1hd2FpdCBhcGkuZGIuZmluZE9uZSgibmZ0cyIse3N5bWJvbDpzfSk7aWYoYXBpLmFzc2VydChudWxsPT09ZSwic3ltYm9sIGFscmVhZHkgZXhpc3RzIikpe2lmKGFwaS5CaWdOdW1iZXIobCkuZ3QoMCkpe2NvbnN0IGU9YXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCJ0b2tlbnMiLCJ0cmFuc2ZlciIse3RvOiJudWxsIixzeW1ib2w6IlNTQyIscXVhbnRpdHk6bCxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6Y30pO2lmKCFpc1Rva2VuVHJhbnNmZXJWZXJpZmllZChlLGFwaS5zZW5kZXIsIm51bGwiLCJTU0MiLGwsInRyYW5zZmVyIikpcmV0dXJuITF9Y29uc3QgZT12b2lkIDA9PT1yPzA6YXBpLkJpZ051bWJlcihyKS5pbnRlZ2VyVmFsdWUoYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKS50b051bWJlcigpLGQ9dm9pZCAwPT09YT8iIjphLHU9dm9pZCAwPT09aT8iIjppO2xldCB5PXt1cmw6dm9pZCAwPT09bj8iIjpufTt5PUpTT04uc3RyaW5naWZ5KHkpO2NvbnN0IGY9dm9pZCAwPT09bz9bYXBpLnNlbmRlcl06W10sbT17aXNzdWVyOmFwaS5zZW5kZXIsc3ltYm9sOnMsbmFtZTp0LG9yZ05hbWU6ZCxwcm9kdWN0TmFtZTp1LG1ldGFkYXRhOnksbWF4U3VwcGx5OmUsc3VwcGx5OjAsY2lyY3VsYXRpbmdTdXBwbHk6MCxkZWxlZ2F0aW9uRW5hYmxlZDohMSx1bmRlbGVnYXRpb25Db29sZG93bjowLGF1dGhvcml6ZWRJc3N1aW5nQWNjb3VudHM6ZixhdXRob3JpemVkSXNzdWluZ0NvbnRyYWN0czpbXSxwcm9wZXJ0aWVzOnt9LGdyb3VwQnk6W119LGc9cysiaW5zdGFuY2VzIjtyZXR1cm4hMT09PWF3YWl0IGFwaS5kYi50YWJsZUV4aXN0cyhnKSYmYXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKGcsWyJhY2NvdW50Iiwib3duZWRCeSJdKSxhd2FpdCBhcGkuZGIuaW5zZXJ0KCJuZnRzIixtKSx2b2lkIDAhPT1vJiZhd2FpdCBhY3Rpb25zLmFkZEF1dGhvcml6ZWRJc3N1aW5nQWNjb3VudHMoe2FjY291bnRzOm8sc3ltYm9sOnMsaXNTaWduZWRXaXRoQWN0aXZlS2V5OmN9KSx2b2lkIDAhPT1wJiZhd2FpdCBhY3Rpb25zLmFkZEF1dGhvcml6ZWRJc3N1aW5nQ29udHJhY3RzKHtjb250cmFjdHM6cCxzeW1ib2w6cyxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6Y30pLCEwfX1yZXR1cm4hMX0pLGFjdGlvbnMuaXNzdWU9KGFzeW5jIGU9Pntjb25zdHtzeW1ib2w6dCxmcm9tVHlwZTphLHRvOmksdG9UeXBlOnMsZmVlU3ltYm9sOm4sbG9ja1Rva2VuczpyLHByb3BlcnRpZXM6byxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6cCxjYWxsaW5nQ29udHJhY3RJbmZvOmN9PWUsZD1bInVzZXIiLCJjb250cmFjdCJdLGw9dm9pZCAwPT09cz8idXNlciI6cyx1PXZvaWQgMD09PWE/InVzZXIiOmEseT1hd2FpdCBhcGkuZGIuZmluZE9uZSgicGFyYW1zIix7fSkse25mdElzc3VhbmNlRmVlOmZ9PXk7aWYoYXBpLmFzc2VydCghMD09PXAsInlvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleSIpJiZhcGkuYXNzZXJ0KHQmJiJzdHJpbmciPT10eXBlb2YgdCYmdSYmInN0cmluZyI9PXR5cGVvZiB1JiZkLmluY2x1ZGVzKHUpJiYoY3x8dm9pZCAwPT09YyYmInVzZXIiPT09dSkmJmkmJiJzdHJpbmciPT10eXBlb2YgaSYmbCYmInN0cmluZyI9PXR5cGVvZiBsJiZkLmluY2x1ZGVzKGwpJiZuJiYic3RyaW5nIj09dHlwZW9mIG4mJm4gaW4gZiYmKHZvaWQgMD09PW98fG8mJiJvYmplY3QiPT10eXBlb2YgbykmJih2b2lkIDA9PT1yfHxyJiYib2JqZWN0Ij09dHlwZW9mIHIpLCJpbnZhbGlkIHBhcmFtcyIpKXtjb25zdCBlPSJ1c2VyIj09PWw/aS50cmltKCkudG9Mb3dlckNhc2UoKTppLnRyaW0oKSxhPSJ1c2VyIj09PWw/aXNWYWxpZFN0ZWVtQWNjb3VudExlbmd0aChlKTppc1ZhbGlkQ29udHJhY3RMZW5ndGgoZSkscz0idXNlciI9PT11P2FwaS5zZW5kZXI6Yy5uYW1lLGQ9InVzZXIiPT09dT8iYmFsYW5jZXMiOiJjb250cmFjdHNCYWxhbmNlcyI7aWYoYXBpLmFzc2VydChhLCJpbnZhbGlkIHRvIikpe2NvbnN0IGE9YXdhaXQgYXBpLmRiLmZpbmRPbmUoIm5mdHMiLHtzeW1ib2w6dH0pLGk9YXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCJ0b2tlbnMiLCJ0b2tlbnMiLHtzeW1ib2w6bn0pO2lmKGFwaS5hc3NlcnQobnVsbCE9PWEsInN5bWJvbCBkb2VzIG5vdCBleGlzdCIpJiZhcGkuYXNzZXJ0KG51bGwhPT1pLCJmZWUgc3ltYm9sIGRvZXMgbm90IGV4aXN0Iikpe2NvbnN0IGM9dCsiaW5zdGFuY2VzIjtpZihhcGkuYXNzZXJ0KCJjb250cmFjdCI9PT11JiZhLmF1dGhvcml6ZWRJc3N1aW5nQ29udHJhY3RzLmluY2x1ZGVzKHMpfHwidXNlciI9PT11JiZhLmF1dGhvcml6ZWRJc3N1aW5nQWNjb3VudHMuaW5jbHVkZXMocyksIm5vdCBhbGxvd2VkIHRvIGlzc3VlIHRva2VucyIpJiZhcGkuYXNzZXJ0KDA9PT1hLm1heFN1cHBseXx8YS5zdXBwbHk8YS5tYXhTdXBwbHksIm1heCBzdXBwbHkgbGltaXQgcmVhY2hlZCIpKXtjb25zdCB5PU9iamVjdC5rZXlzKGEucHJvcGVydGllcykubGVuZ3RoLG09YXBpLkJpZ051bWJlcihmW25dKS5tdWx0aXBsaWVkQnkoeSksZz1jYWxjdWxhdGVCYWxhbmNlKGZbbl0sbSxpLnByZWNpc2lvbiwhMCksYj1hd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoInRva2VucyIsZCx7YWNjb3VudDpzLHN5bWJvbDpufSksaD0hIWFwaS5CaWdOdW1iZXIoZykubHRlKDApfHxiJiZhcGkuQmlnTnVtYmVyKGIuYmFsYW5jZSkuZ3RlKGcpO2lmKHIpe2NvbnN0IGU9YXdhaXQgaXNWYWxpZFRva2VuQmFza2V0KHIsZCxzLG4sZyk7aWYoIWFwaS5hc3NlcnQoZSwiaW52YWxpZCBiYXNrZXQgb2YgdG9rZW5zIHRvIGxvY2sgKGNhbm5vdCBsb2NrIG1vcmUgdGhhbiAxMCB0b2tlbiB0eXBlczsgaXNzdWluZyBhY2NvdW50IG11c3QgaGF2ZSBlbm91Z2ggYmFsYW5jZSkiKSlyZXR1cm4hMX1sZXQgdj17fTtpZih2b2lkIDAhPT1vKXt0cnl7aWYoIWlzVmFsaWREYXRhUHJvcGVydGllcyhzLHUsYSxvKSlyZXR1cm4hMX1jYXRjaChlKXtyZXR1cm4hMX12PW99aWYoYXBpLmFzc2VydChoLCJ5b3UgbXVzdCBoYXZlIGVub3VnaCB0b2tlbnMgdG8gY292ZXIgdGhlIGlzc3VhbmNlIGZlZXMiKSl7aWYoYXBpLkJpZ051bWJlcihnKS5ndCgwKSlpZigiY29udHJhY3QiPT09dSl7Y29uc3QgZT1hd2FpdCBhcGkudHJhbnNmZXJUb2tlbnNGcm9tQ2FsbGluZ0NvbnRyYWN0KCJudWxsIixuLGcsInVzZXIiKTtpZighYXBpLmFzc2VydChpc1Rva2VuVHJhbnNmZXJWZXJpZmllZChlLHMsIm51bGwiLG4sZywidHJhbnNmZXJGcm9tQ29udHJhY3QiKSwidW5hYmxlIHRvIHRyYW5zZmVyIGlzc3VhbmNlIGZlZSIpKXJldHVybiExfWVsc2V7Y29uc3QgZT1hd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoInRva2VucyIsInRyYW5zZmVyIix7dG86Im51bGwiLHN5bWJvbDpuLHF1YW50aXR5OmcsaXNTaWduZWRXaXRoQWN0aXZlS2V5OnB9KTtpZighYXBpLmFzc2VydChpc1Rva2VuVHJhbnNmZXJWZXJpZmllZChlLHMsIm51bGwiLG4sZywidHJhbnNmZXIiKSwidW5hYmxlIHRvIHRyYW5zZmVyIGlzc3VhbmNlIGZlZSIpKXJldHVybiExfWNvbnN0IGk9e307aWYocilmb3IoY29uc3RbZSx0XW9mIE9iamVjdC5lbnRyaWVzKHIpKWlmKCJjb250cmFjdCI9PT11KXtjb25zdCBhPWF3YWl0IGFwaS50cmFuc2ZlclRva2Vuc0Zyb21DYWxsaW5nQ29udHJhY3QoIm5mdCIsZSx0LCJjb250cmFjdCIpO2lzVG9rZW5UcmFuc2ZlclZlcmlmaWVkKGEscywibmZ0IixlLHQsInRyYW5zZmVyRnJvbUNvbnRyYWN0IikmJihpW2VdPXQpfWVsc2V7Y29uc3QgYT1hd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoInRva2VucyIsInRyYW5zZmVyVG9Db250cmFjdCIse3RvOiJuZnQiLHN5bWJvbDplLHF1YW50aXR5OnQsaXNTaWduZWRXaXRoQWN0aXZlS2V5OnB9KTtpc1Rva2VuVHJhbnNmZXJWZXJpZmllZChhLHMsIm5mdCIsZSx0LCJ0cmFuc2ZlclRvQ29udHJhY3QiKSYmKGlbZV09dCl9Y29uc3Qgbz17YWNjb3VudDplLG93bmVkQnk6InVzZXIiPT09bD8idSI6ImMiLGxvY2tlZFRva2VuczppLHByb3BlcnRpZXM6dn0sZD1hd2FpdCBhcGkuZGIuaW5zZXJ0KGMsbyk7cmV0dXJuIGEuc3VwcGx5Kz0xLCJudWxsIj09PWUmJiJjb250cmFjdCIhPT1sfHwoYS5jaXJjdWxhdGluZ1N1cHBseSs9MSksYXdhaXQgYXBpLmRiLnVwZGF0ZSgibmZ0cyIsYSksYXBpLmVtaXQoImlzc3VlIix7ZnJvbTpzLGZyb21UeXBlOnUsdG86ZSx0b1R5cGU6bCxzeW1ib2w6dCxsb2NrZWRUb2tlbnM6aSxwcm9wZXJ0aWVzOnYsaWQ6ZC5faWR9KSwhMH19fX19cmV0dXJuITF9KSxhY3Rpb25zLmlzc3VlTXVsdGlwbGU9KGFzeW5jIGU9Pntjb25zdHtpbnN0YW5jZXM6dCxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6YSxjYWxsaW5nQ29udHJhY3RJbmZvOml9PWU7aWYoYXBpLmFzc2VydCghMD09PWEsInlvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleSIpJiZhcGkuYXNzZXJ0KHQmJiJvYmplY3QiPT10eXBlb2YgdCYmQXJyYXkuaXNBcnJheSh0KSwiaW52YWxpZCBwYXJhbXMiKSYmYXBpLmFzc2VydCh0Lmxlbmd0aDw9MTAsImNhbm5vdCBpc3N1ZSBtb3JlIHRoYW4gMTAgTkZUIGluc3RhbmNlcyBhdCBvbmNlIikpZm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKz0xKXtjb25zdHtzeW1ib2w6cyxmcm9tVHlwZTpuLHRvOnIsdG9UeXBlOm8sZmVlU3ltYm9sOnAsbG9ja1Rva2VuczpjLHByb3BlcnRpZXM6ZH09dFtlXTthd2FpdCBhY3Rpb25zLmlzc3VlKHtzeW1ib2w6cyxmcm9tVHlwZTpuLHRvOnIsdG9UeXBlOm8sZmVlU3ltYm9sOnAsbG9ja1Rva2VuczpjLHByb3BlcnRpZXM6ZCxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6YSxjYWxsaW5nQ29udHJhY3RJbmZvOml9KX19KTs="
}
}
}

{
"id": "ssc-testnet1",
"json": {
"contractName": "contract",
"contractAction": "deploy",
"contractPayload": {
"name": "crittermanager",
"params": "",
"code": "LyogZXNsaW50LWRpc2FibGUgbm8tYXdhaXQtaW4tbG9vcCAqLwovKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovCi8qIGdsb2JhbCBhY3Rpb25zLCBhcGkgKi8KCi8vIHRlc3QgY29udHJhY3QgdG8gZGVtb25zdHJhdGUgU3BsaW50ZXJsYW5kcyBzdHlsZQovLyBwYWNrIGlzc3VhbmNlIG9mIGNvbGxlY3RhYmxlIGNyaXR0ZXJzCmNvbnN0IENPTlRSQUNUX05BTUUgPSAnY3JpdHRlcm1hbmFnZXInOwoKLy8gbm9ybWFsbHkgd2Ugd291bGQgdXNlIGFwaS5vd25lciB0byByZWZlciB0byB0aGUgY29udHJhY3QKLy8gb3duZXIgKHRoZSBhY2NvdW50IHRoYXQgZGVwbG95ZWQgdGhlIGNvbnRyYWN0KSwgYnV0IGZvciBub3cKLy8gY29udHJhY3QgZGVwbG95bWVudCBpcyByZXN0cmljdGVkLCBzbyB3ZSBuZWVkIGFub3RoZXIgd2F5Ci8vIHRvIHJlY29nbml6ZSB0aGUgQ3JpdHRlciBhcHAgb3duZXIKY29uc3QgQ1JJVFRFUl9DUkVBVE9SID0gJ2NyeXB0b21hbmNlcic7CgovLyB0aGlzIHBsYWNlaG9sZGVyIHJlcHJlc2VudHMgRU5HIHRva2VucyBvbiB0aGUgbWFpbm5ldCBhbmQgU1NDIG9uIHRoZSB0ZXN0bmV0Ci8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10ZW1wbGF0ZS1jdXJseS1pbi1zdHJpbmcKY29uc3QgVVRJTElUWV9UT0tFTl9TWU1CT0wgPSAiU1NDIjsKCi8vIHdlIHdpbGwgaXNzdWUgY3JpdHRlcnMgaW4gInBhY2tzIiBvZiA1IGF0IGEgdGltZQpjb25zdCBDUklUVEVSU19QRVJfUEFDSyA9IDU7CgphY3Rpb25zLmNyZWF0ZVNTQyA9IGFzeW5jICgpID0+IHsKICBjb25zdCB0YWJsZUV4aXN0cyA9IGF3YWl0IGFwaS5kYi50YWJsZUV4aXN0cygncGFyYW1zJyk7CiAgaWYgKHRhYmxlRXhpc3RzID09PSBmYWxzZSkgewogICAgYXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKCdwYXJhbXMnKTsKCiAgICAvLyBUaGlzIHRhYmxlIHdpbGwgc3RvcmUgY29udHJhY3QgY29uZmlndXJhdGlvbiBzZXR0aW5ncy4KICAgIC8vIEZvciB0aGlzIHRlc3QsIHdlIGhhdmUgMyBDUklUVEVSIGVkaXRpb25zIHRoYXQgeW91IGNhbiBidXkKICAgIC8vIHdpdGggZGlmZmVyZW50IHRva2Vucy4gVGhlIGNvbnRyYWN0IG93bmVyIGNhbiBhZGQgbW9yZQogICAgLy8gZWRpdGlvbnMgdmlhIHRoZSB1cGRhdGVQYXJhbXMgYWN0aW9uLgogICAgY29uc3QgcGFyYW1zID0ge307CiAgICBwYXJhbXMuZWRpdGlvbk1hcHBpbmcgPSB7CiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10ZW1wbGF0ZS1jdXJseS1pbi1zdHJpbmcKICAgICAgIlNTQyI6IDEsCiAgICAgIEFMUEhBOiAyLAogICAgICBCRVRBOiAzLAogICAgfTsKICAgIGF3YWl0IGFwaS5kYi5pbnNlcnQoJ3BhcmFtcycsIHBhcmFtcyk7CiAgfQp9OwoKLy8gaGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrIHRoYXQgdG9rZW4gdHJhbnNmZXJzIHN1Y2NlZWRlZApjb25zdCBpc1Rva2VuVHJhbnNmZXJWZXJpZmllZCA9IChyZXN1bHQsIGZyb20sIHRvLCBzeW1ib2wsIHF1YW50aXR5LCBldmVudFN0cikgPT4gewogIGlmIChyZXN1bHQuZXJyb3JzID09PSB1bmRlZmluZWQKICAgICYmIHJlc3VsdC5ldmVudHMgJiYgcmVzdWx0LmV2ZW50cy5maW5kKGVsID0+IGVsLmNvbnRyYWN0ID09PSAndG9rZW5zJyAmJiBlbC5ldmVudCA9PT0gZXZlbnRTdHIKICAgICYmIGVsLmRhdGEuZnJvbSA9PT0gZnJvbSAmJiBlbC5kYXRhLnRvID09PSB0byAmJiBlbC5kYXRhLnF1YW50aXR5ID09PSBxdWFudGl0eSAmJiBlbC5kYXRhLnN5bWJvbCA9PT0gc3ltYm9sKSAhPT0gdW5kZWZpbmVkKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgcmV0dXJuIGZhbHNlOwp9OwoKLy8gVGhlIGNvbnRyYWN0IG93bmVyIGNhbiB1c2UgdGhpcyBhY3Rpb24gdG8gdXBkYXRlIHNldHRpbmdzCi8vIHdpdGhvdXQgaGF2aW5nIHRvIGNoYW5nZSAmIHJlZGVwbG95IHRoZSBjb250cmFjdCBzb3VyY2UgY29kZS4KYWN0aW9ucy51cGRhdGVQYXJhbXMgPSBhc3luYyAocGF5bG9hZCkgPT4gewogIGlmIChhcGkuc2VuZGVyICE9PSBDUklUVEVSX0NSRUFUT1IpIHJldHVybjsKCiAgY29uc3QgewogICAgZWRpdGlvbk1hcHBpbmcsCiAgfSA9IHBheWxvYWQ7CgogIGNvbnN0IHBhcmFtcyA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdwYXJhbXMnLCB7fSk7CgogIGlmIChlZGl0aW9uTWFwcGluZyAmJiB0eXBlb2YgZWRpdGlvbk1hcHBpbmcgPT09ICdvYmplY3QnKSB7CiAgICBwYXJhbXMuZWRpdGlvbk1hcHBpbmcgPSBlZGl0aW9uTWFwcGluZzsKICB9CgogIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3BhcmFtcycsIHBhcmFtcyk7Cn07CgovLyBUaGUgY29udHJhY3Qgb3duZXIgY2FuIGNhbGwgdGhpcyBhY3Rpb24gb25lIHRpbWUgb25seSwgdG8KLy8gY3JlYXRlIHRoZSBDUklUVEVSIE5GVCBkZWZpbml0aW9uLiBOb3JtYWxseSB5b3Ugd291bGQgcHJvYmFibHkKLy8gZG8gdGhpcyB0aHJvdWdoIHRoZSBTdGVlbSBFbmdpbmUgd2ViIHNpdGUsIGJ1dCB3ZSBpbmNsdWRlIGl0Ci8vIGhlcmUgdG8gaWxsdXN0cmF0ZSBwcm9ncmFtbWF0aWMgTkZUIGNyZWF0aW9uLCBhbmQgdG8gbWFrZSBpdAovLyBjbGVhciB3aGF0IGRhdGEgcHJvcGVydGllcyB3ZSBuZWVkLiBOb3RlOiB0aGUgY29udHJhY3Qgb3duZXIKLy8gbXVzdCBoYXZlIGVub3VnaCBFTkcvU1NDIHRvIHBheSB0aGUgY3JlYXRpb24gZmVlcy4gRm9yIHNpbXBsaWNpdHkKLy8gd2UgZG9uJ3QgZG8gY2hlY2tzIG9uIHRoZSBvd25lcidzIGJhbGFuY2UgaGVyZSwgYnV0IGluIGEKLy8gcHJvZHVjdGlvbiByZWFkeSBzbWFydCBjb250cmFjdCB3ZSBkZWZpbml0ZWx5IHNob3VsZCBkbyBzbwovLyBiZWZvcmUgdGFraW5nIGFueSBhY3Rpb24gdGhhdCBzcGVuZHMgdG9rZW5zIGFzIGEgc2lkZSBlZmZlY3QuCmFjdGlvbnMuY3JlYXRlTmZ0ID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBpZiAoYXBpLnNlbmRlciAhPT0gQ1JJVFRFUl9DUkVBVE9SKSByZXR1cm47CgogIC8vIHRoaXMgYWN0aW9uIHJlcXVpcmVzIGFjdGl2ZSBrZXkgYXV0aG9yaXphdGlvbgogIGNvbnN0IHsKICAgIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICB9ID0gcGF5bG9hZDsKCiAgLy8gdmVyaWZ5IENSSVRURVIgZG9lcyBub3QgZXhpc3QgeWV0CiAgY29uc3QgbmZ0ID0gYXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCduZnQnLCAnbmZ0cycsIHsgc3ltYm9sOiAnQ1JJVFRFUicgfSk7CiAgaWYgKGFwaS5hc3NlcnQobmZ0ID09PSBudWxsLCAnQ1JJVFRFUiBhbHJlYWR5IGV4aXN0cycpCiAgICAmJiBhcGkuYXNzZXJ0KGlzU2lnbmVkV2l0aEFjdGl2ZUtleSA9PT0gdHJ1ZSwgJ3lvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleScpKSB7CiAgICAvLyBjcmVhdGUgQ1JJVFRFUgogICAgLy8gTm90ZSAxOiB3ZSBkb24ndCBzcGVjaWZ5IG1heFN1cHBseSwgd2hpY2ggbWVhbnMgdGhlIHN1cHBseSBvZiBDUklUVEVSCiAgICAvLyB3aWxsIGJlIHVubGltaXRlZC4gQnV0IGluZGlyZWN0bHkgdGhlIHN1cHBseSBpcyBsaW1pdGVkIGJ5IHRoZQogICAgLy8gc3VwcGx5IG9mIHRoZSB0b2tlbnMgeW91IGNhbiB1c2UgdG8gYnV5IENSSVRURVJTLgogICAgLy8gTm90ZSAyOiB3ZSB3YW50IHRoaXMgY29udHJhY3QgdG8gYmUgdGhlIG9ubHkgYXV0aG9yaXplZCB0b2tlbiBpc3N1ZXIKICAgIGF3YWl0IGFwaS5leGVjdXRlU21hcnRDb250cmFjdCgnbmZ0JywgJ2NyZWF0ZScsIHsKICAgICAgbmFtZTogJ01pc2NoaWV2b3VzIENyeXB0byBDcml0dGVycycsCiAgICAgIHN5bWJvbDogJ0NSSVRURVInLAogICAgICBhdXRob3JpemVkSXNzdWluZ0FjY291bnRzOiBbXSwKICAgICAgYXV0aG9yaXplZElzc3VpbmdDb250cmFjdHM6IFtDT05UUkFDVF9OQU1FXSwKICAgICAgaXNTaWduZWRXaXRoQWN0aXZlS2V5LAogICAgfSk7CgogICAgLy8gTm93IGFkZCBzb21lIGRhdGEgcHJvcGVydGllcyAobm90ZSB0aGF0IG9ubHkgdGhpcyBjb250cmFjdCBpcwogICAgLy8gYXV0aG9yaXplZCB0byBlZGl0IGRhdGEgcHJvcGVydGllcykuIFdlIGNvdWxkIGhhdmUgY2hvc2VuIGEgbW9yZQogICAgLy8gZWNvbm9taWNhbCBkZXNpZ24gYnkgZm9ybWF0dGluZyB0aGVzZSBpbiBzb21lIGN1c3RvbSB3YXkgdG8gZml0CiAgICAvLyB3aXRoaW4gYSBzaW5nbGUgc3RyaW5nIGRhdGEgcHJvcGVydHksIHdoaWNoIHdvdWxkIGN1dCBkb3duIG9uCiAgICAvLyB0b2tlbiBpc3N1YW5jZSBmZWVzLiBUaGUgZHJhd2JhY2sgaXMgdGhlbiB3ZSBsb3NlIHRoZSBhYmlsaXR5IHRvCiAgICAvLyBlYXNpbHkgcXVlcnkgdG9rZW5zIGJ5IHByb3BlcnRpZXMgKGZvciBleGFtcGxlLCBnZXQgYSBsaXN0IG9mIGFsbAogICAgLy8gcmFyZSBjcml0dGVycyBvciBhbGwgY3JpdHRlcnMgYmVsb25naW5nIHRvIGEgY2VydGFpbiBlZGl0aW9uLCBldGMpLgoKICAgIC8vIEVkaXRpb24gb25seSBnZXRzIHNldCBvbmNlIGF0IGlzc3VhbmNlIGFuZCBuZXZlciBjaGFuZ2VzLCBzbyB3ZQogICAgLy8gY2FuIG1ha2UgaXQgcmVhZCBvbmx5LgogICAgYXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCduZnQnLCAnYWRkUHJvcGVydHknLCB7CiAgICAgIHN5bWJvbDogJ0NSSVRURVInLAogICAgICBuYW1lOiAnZWRpdGlvbicsCiAgICAgIHR5cGU6ICdudW1iZXInLAogICAgICBpc1JlYWRPbmx5OiB0cnVlLAogICAgICBhdXRob3JpemVkRWRpdGluZ0FjY291bnRzOiBbXSwKICAgICAgYXV0aG9yaXplZEVkaXRpbmdDb250cmFjdHM6IFtDT05UUkFDVF9OQU1FXSwKICAgICAgaXNTaWduZWRXaXRoQWN0aXZlS2V5LAogICAgfSk7CgogICAgLy8gVHlwZSAod2hpY2ggYWxzbyBuZXZlciBjaGFuZ2VzIG9uY2Ugc2V0KSByZXByZXNlbnRzIHRoZSBraW5kIG9mCiAgICAvLyBjcml0dGVyIHdpdGhpbiBhbiBlZGl0aW9uLiBUaGUgaW50ZXJwcmV0YXRpb24gb2YgdGhpcyB2YWx1ZSBpcwogICAgLy8gaGFuZGxlZCBieSB3aGF0ZXZlciBhcHAgdXNlcyB0aGVzZSB0b2tlbnM7IGZvciBleGFtcGxlIG1heWJlCiAgICAvLyAwID0gZHJhZ29uLCAxID0gdHJvbGwsIDIgPSBnb2JsaW4sIGV0YwogICAgYXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCduZnQnLCAnYWRkUHJvcGVydHknLCB7CiAgICAgIHN5bWJvbDogJ0NSSVRURVInLAogICAgICBuYW1lOiAndHlwZScsCiAgICAgIHR5cGU6ICdudW1iZXInLAogICAgICBpc1JlYWRPbmx5OiB0cnVlLAogICAgICBhdXRob3JpemVkRWRpdGluZ0FjY291bnRzOiBbXSwKICAgICAgYXV0aG9yaXplZEVkaXRpbmdDb250cmFjdHM6IFtDT05UUkFDVF9OQU1FXSwKICAgICAgaXNTaWduZWRXaXRoQWN0aXZlS2V5LAogICAgfSk7CgogICAgLy8gSG93IHJhcmUgaXMgdGhpcyBjcml0dGVyPyAwID0gY29tbW9uLCAxID0gdW5jb21tb24sCiAgICAvLyAyID0gcmFyZSwgMyA9IGxlZ2VuZGFyeQogICAgYXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCduZnQnLCAnYWRkUHJvcGVydHknLCB7CiAgICAgIHN5bWJvbDogJ0NSSVRURVInLAogICAgICBuYW1lOiAncmFyaXR5JywKICAgICAgdHlwZTogJ251bWJlcicsCiAgICAgIGlzUmVhZE9ubHk6IHRydWUsCiAgICAgIGF1dGhvcml6ZWRFZGl0aW5nQWNjb3VudHM6IFtdLAogICAgICBhdXRob3JpemVkRWRpdGluZ0NvbnRyYWN0czogW0NPTlRSQUNUX05BTUVdLAogICAgICBpc1NpZ25lZFdpdGhBY3RpdmVLZXksCiAgICB9KTsKCiAgICAvLyBEbyB3ZSBoYXZlIGEgc3VwZXIgcmFyZSBnb2xkIGZvaWw/CiAgICBhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoJ25mdCcsICdhZGRQcm9wZXJ0eScsIHsKICAgICAgc3ltYm9sOiAnQ1JJVFRFUicsCiAgICAgIG5hbWU6ICdpc0dvbGRGb2lsJywKICAgICAgdHlwZTogJ2Jvb2xlYW4nLAogICAgICBpc1JlYWRPbmx5OiB0cnVlLAogICAgICBhdXRob3JpemVkRWRpdGluZ0FjY291bnRzOiBbXSwKICAgICAgYXV0aG9yaXplZEVkaXRpbmdDb250cmFjdHM6IFtDT05UUkFDVF9OQU1FXSwKICAgICAgaXNTaWduZWRXaXRoQWN0aXZlS2V5LAogICAgfSk7CgogICAgLy8gV2Ugd2lsbCBhbGxvdyBwZW9wbGUgdG8gY3VzdG9taXplIHRoZWlyIGNyaXR0ZXJzCiAgICAvLyBieSBuYW1pbmcgdGhlbSAobm90ZSB0aGlzIGlzIE5PVCByZWFkIG9ubHkhKQogICAgYXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCduZnQnLCAnYWRkUHJvcGVydHknLCB7CiAgICAgIHN5bWJvbDogJ0NSSVRURVInLAogICAgICBuYW1lOiAnbmFtZScsCiAgICAgIHR5cGU6ICdzdHJpbmcnLAogICAgICBhdXRob3JpemVkRWRpdGluZ0FjY291bnRzOiBbXSwKICAgICAgYXV0aG9yaXplZEVkaXRpbmdDb250cmFjdHM6IFtDT05UUkFDVF9OQU1FXSwKICAgICAgaXNTaWduZWRXaXRoQWN0aXZlS2V5LAogICAgfSk7CgogICAgLy8gYWRkIHNvbWUgb3RoZXIgbWlzY2VsbGFuZW91cyBwcm9wZXJ0aWVzIGZvciB0aGUgc2FrZSBvZgogICAgLy8gY29tcGxldGVuZXNzCiAgICBhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoJ25mdCcsICdhZGRQcm9wZXJ0eScsIHsKICAgICAgc3ltYm9sOiAnQ1JJVFRFUicsCiAgICAgIG5hbWU6ICd4cCcsIC8vIGV4cGVyaWVuY2UgcG9pbnRzCiAgICAgIHR5cGU6ICdudW1iZXInLAogICAgICBhdXRob3JpemVkRWRpdGluZ0FjY291bnRzOiBbXSwKICAgICAgYXV0aG9yaXplZEVkaXRpbmdDb250cmFjdHM6IFtDT05UUkFDVF9OQU1FXSwKICAgICAgaXNTaWduZWRXaXRoQWN0aXZlS2V5LAogICAgfSk7CiAgICBhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoJ25mdCcsICdhZGRQcm9wZXJ0eScsIHsKICAgICAgc3ltYm9sOiAnQ1JJVFRFUicsCiAgICAgIG5hbWU6ICdocCcsIC8vIGhlYWx0aCBwb2ludHMKICAgICAgdHlwZTogJ251bWJlcicsCiAgICAgIGF1dGhvcml6ZWRFZGl0aW5nQWNjb3VudHM6IFtdLAogICAgICBhdXRob3JpemVkRWRpdGluZ0NvbnRyYWN0czogW0NPTlRSQUNUX05BTUVdLAogICAgICBpc1NpZ25lZFdpdGhBY3RpdmVLZXksCiAgICB9KTsKICB9Cn07CgovLyBUaGlzIGFjdGlvbiBjYW4gYmUgY2FsbGVkIGJ5IGEgdG9rZW4gaG9sZGVyIHRvIGNoYW5nZQovLyB0aGVpciBjcml0dGVyJ3MgbmFtZS4KYWN0aW9ucy51cGRhdGVOYW1lID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBjb25zdCB7IGlkLCBuYW1lIH0gPSBwYXlsb2FkOwoKICBpZiAoYXBpLmFzc2VydChpZCAmJiB0eXBlb2YgaWQgPT09ICdzdHJpbmcnCiAgICAmJiAhYXBpLkJpZ051bWJlcihpZCkuaXNOYU4oKSAmJiBhcGkuQmlnTnVtYmVyKGlkKS5ndCgwKQogICAgJiYgbmFtZSAmJiB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycsICdpbnZhbGlkIHBhcmFtcycpCiAgICAmJiBhcGkuYXNzZXJ0KGFwaS52YWxpZGF0b3IuaXNBbHBoYW51bWVyaWMoYXBpLnZhbGlkYXRvci5ibGFja2xpc3QobmFtZSwgJyAnKSkgJiYgbmFtZS5sZW5ndGggPiAwICYmIG5hbWUubGVuZ3RoIDw9IDI1LCAnaW52YWxpZCBuYW1lOiBsZXR0ZXJzLCBudW1iZXJzLCB3aGl0ZXNwYWNlcyBvbmx5LCBtYXggbGVuZ3RoIG9mIDI1JykpIHsKICAgIC8vIGZldGNoIHRoZSB0b2tlbiB3ZSB3YW50IHRvIGVkaXQKICAgIGNvbnN0IGluc3RhbmNlID0gYXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCduZnQnLCAnQ1JJVFRFUmluc3RhbmNlcycsIHsgX2lkOiBhcGkuQmlnTnVtYmVyKGlkKS50b051bWJlcigpIH0pOwoKICAgIGlmIChpbnN0YW5jZSkgewogICAgICAvLyBtYWtlIHN1cmUgdGhpcyB0b2tlbiBpcyBvd25lZCBieSB0aGUgY2FsbGVyCiAgICAgIGlmIChhcGkuYXNzZXJ0KGluc3RhbmNlLmFjY291bnQgPT09IGFwaS5zZW5kZXIgJiYgaW5zdGFuY2Uub3duZWRCeSA9PT0gJ3UnLCAnbXVzdCBiZSB0aGUgdG9rZW4gaG9sZGVyJykpIHsKICAgICAgICBhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoJ25mdCcsICdzZXRQcm9wZXJ0aWVzJywgewogICAgICAgICAgc3ltYm9sOiAnQ1JJVFRFUicsCiAgICAgICAgICBmcm9tVHlwZTogJ2NvbnRyYWN0JywKICAgICAgICAgIG5mdHM6IFt7CiAgICAgICAgICAgIGlkLCBwcm9wZXJ0aWVzOiB7IG5hbWUgfSwKICAgICAgICAgIH1dLAogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgfQp9OwoKLy8gZ2VuZXJhdGUgaXNzdWFuY2UgZGF0YSBmb3IgYSByYW5kb20gY3JpdHRlciBvZiB0aGUgZ2l2ZW4gZWRpdGlvbgpjb25zdCBnZW5lcmF0ZVJhbmRvbUNyaXR0ZXIgPSAoZWRpdGlvbiwgdG8pID0+IHsKICAvLyBlYWNoIHJhcml0eSBoYXMgMTAgdHlwZXMgb2YgY3JpdHRlcnMKICBjb25zdCB0eXBlID0gTWF0aC5mbG9vcihhcGkucmFuZG9tKCkgKiAxMCkgKyAxOwoKICAvLyBkZXRlcm1pbmUgcmFyaXR5CiAgbGV0IHJhcml0eSA9IDA7CiAgbGV0IHJhcml0eVJvbGwgPSBNYXRoLmZsb29yKGFwaS5yYW5kb20oKSAqIDEwMDApICsgMTsKICBpZiAocmFyaXR5Um9sbCA+IDk5NSkgeyAvLyAwLjUlIGNoYW5jZSBvZiBsZWdlbmRhcnkKICAgIHJhcml0eSA9IDM7CiAgfSBlbHNlIGlmIChyYXJpdHlSb2xsID4gOTAwKSB7IC8vIDEwJSBjaGFuY2Ugb2YgcmFyZSBvciBoaWdoZXIKICAgIHJhcml0eSA9IDI7CiAgfSBlbHNlIGlmIChyYXJpdHlSb2xsID4gNzAwKSB7IC8vIDMwJSBvZiB1bmNvbW1vbiBvciBoaWdoZXIKICAgIHJhcml0eSA9IDE7CiAgfQoKICAvLyBkZXRlcm1pbmUgZ29sZCBmb2lsCiAgbGV0IGlzR29sZEZvaWwgPSBmYWxzZTsKICByYXJpdHlSb2xsID0gTWF0aC5mbG9vcihhcGkucmFuZG9tKCkgKiAxMDApICsgMTsKICBpZiAocmFyaXR5Um9sbCA+IDk1KSB7IC8vIDUlIGNoYW5jZSBvZiBiZWluZyBnb2xkCiAgICBpc0dvbGRGb2lsID0gdHJ1ZTsKICB9CgogIGNvbnN0IHByb3BlcnRpZXMgPSB7CiAgICBlZGl0aW9uLAogICAgdHlwZSwKICAgIHJhcml0eSwKICAgIGlzR29sZEZvaWwsCiAgICBuYW1lOiAnJywKICAgIHhwOiAwLAogICAgaHA6IDEwMCwKICB9OwoKICBjb25zdCBpbnN0YW5jZSA9IHsKICAgIHN5bWJvbDogJ0NSSVRURVInLAogICAgZnJvbVR5cGU6ICdjb250cmFjdCcsCiAgICB0bywKICAgIGZlZVN5bWJvbDogVVRJTElUWV9UT0tFTl9TWU1CT0wsCiAgICBwcm9wZXJ0aWVzLAogIH07CgogIHJldHVybiBpbnN0YW5jZTsKfTsKCi8vIGlzc3VlIHNvbWUgcmFuZG9tIGNyaXR0ZXJzIQphY3Rpb25zLmhhdGNoID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICAvLyB0aGlzIGFjdGlvbiByZXF1aXJlcyBhY3RpdmUga2V5IGF1dGhvcml6YXRpb24KICBjb25zdCB7CiAgICBwYWNrU3ltYm9sLCAvLyB0aGUgdG9rZW4gd2Ugd2FudCB0byBidXkgd2l0aCBkZXRlcm1pbmVzIHdoaWNoIGVkaXRpb24gdG8gaXNzdWUKICAgIHBhY2tzLCAvLyBob3cgbWFueSBjcml0dGVycyB0byBoYXRjaCAoMSBwYWNrID0gNSBjcml0dGVycykKICAgIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICB9ID0gcGF5bG9hZDsKCiAgLy8gZ2V0IGNvbnRyYWN0IHBhcmFtcwogIGNvbnN0IHBhcmFtcyA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdwYXJhbXMnLCB7fSk7CiAgY29uc3QgeyBlZGl0aW9uTWFwcGluZyB9ID0gcGFyYW1zOwoKICBpZiAoYXBpLmFzc2VydChpc1NpZ25lZFdpdGhBY3RpdmVLZXkgPT09IHRydWUsICd5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXknKQogICAgJiYgYXBpLmFzc2VydChwYWNrU3ltYm9sICYmIHR5cGVvZiBwYWNrU3ltYm9sID09PSAnc3RyaW5nJyAmJiBwYWNrU3ltYm9sIGluIGVkaXRpb25NYXBwaW5nLCAnaW52YWxpZCBwYWNrIHN5bWJvbCcpCiAgICAmJiBhcGkuYXNzZXJ0KHBhY2tzICYmIHR5cGVvZiBwYWNrcyA9PT0gJ251bWJlcicgJiYgcGFja3MgPj0gMSAmJiBwYWNrcyA8PSAxMCAmJiBOdW1iZXIuaXNJbnRlZ2VyKHBhY2tzKSwgJ3BhY2tzIG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDEwJykpIHsKICAgIC8vIHZlcmlmeSB1c2VyIGhhcyBlbm91Z2ggYmFsYW5jZSB0byBwYXkgZm9yIGFsbCB0aGUgcGFja3MKICAgIGNvbnN0IHBheW1lbnRUb2tlbkJhbGFuY2UgPSBhd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoJ3Rva2VucycsICdiYWxhbmNlcycsIHsgYWNjb3VudDogYXBpLnNlbmRlciwgc3ltYm9sOiBwYWNrU3ltYm9sIH0pOwogICAgY29uc3QgYXV0aG9yaXplZCA9IHBheW1lbnRUb2tlbkJhbGFuY2UgJiYgYXBpLkJpZ051bWJlcihwYXltZW50VG9rZW5CYWxhbmNlLmJhbGFuY2UpLmd0ZShwYWNrcyk7CiAgICBpZiAoYXBpLmFzc2VydChhdXRob3JpemVkLCAneW91IG11c3QgaGF2ZSBlbm91Z2ggcGFjayB0b2tlbnMnKSkgewogICAgICAvLyB2ZXJpZnkgdGhpcyBjb250cmFjdCBoYXMgZW5vdWdoIGJhbGFuY2UgdG8gcGF5IHRoZSBORlQgaXNzdWFuY2UgZmVlcwogICAgICBjb25zdCBjcml0dGVyc1RvSGF0Y2ggPSBwYWNrcyAqIENSSVRURVJTX1BFUl9QQUNLOwogICAgICBjb25zdCBuZnRQYXJhbXMgPSBhd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoJ25mdCcsICdwYXJhbXMnLCB7fSk7CiAgICAgIGNvbnN0IHsgbmZ0SXNzdWFuY2VGZWUgfSA9IG5mdFBhcmFtczsKICAgICAgY29uc3Qgb25lVG9rZW5Jc3N1YW5jZUZlZSA9IGFwaS5CaWdOdW1iZXIobmZ0SXNzdWFuY2VGZWVbVVRJTElUWV9UT0tFTl9TWU1CT0xdKS5tdWx0aXBsaWVkQnkoOCk7IC8vIGJhc2UgZmVlICsgNyBkYXRhIHByb3BlcnRpZXMKICAgICAgY29uc3QgdG90YWxJc3N1YW5jZUZlZSA9IG9uZVRva2VuSXNzdWFuY2VGZWUubXVsdGlwbGllZEJ5KGNyaXR0ZXJzVG9IYXRjaCk7CiAgICAgIGNvbnN0IHV0aWxpdHlUb2tlbkJhbGFuY2UgPSBhd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoJ3Rva2VucycsICdjb250cmFjdHNCYWxhbmNlcycsIHsgYWNjb3VudDogQ09OVFJBQ1RfTkFNRSwgc3ltYm9sOiBVVElMSVRZX1RPS0VOX1NZTUJPTCB9KTsKICAgICAgY29uc3QgY2FuQWZmb3JkSXNzdWFuY2UgPSB1dGlsaXR5VG9rZW5CYWxhbmNlICYmIGFwaS5CaWdOdW1iZXIodXRpbGl0eVRva2VuQmFsYW5jZS5iYWxhbmNlKS5ndGUodG90YWxJc3N1YW5jZUZlZSk7CiAgICAgIGlmIChhcGkuYXNzZXJ0KGNhbkFmZm9yZElzc3VhbmNlLCAnY29udHJhY3QgY2Fubm90IGFmZm9yZCBpc3N1YW5jZScpKSB7CiAgICAgICAgLy8gYnVybiB0aGUgcGFjayB0b2tlbnMKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoJ3Rva2VucycsICd0cmFuc2ZlcicsIHsKICAgICAgICAgIHRvOiAnbnVsbCcsIHN5bWJvbDogcGFja1N5bWJvbCwgcXVhbnRpdHk6IHBhY2tzLnRvU3RyaW5nKCksIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICAgICAgICB9KTsKICAgICAgICBpZiAoIWFwaS5hc3NlcnQoaXNUb2tlblRyYW5zZmVyVmVyaWZpZWQocmVzLCBhcGkuc2VuZGVyLCAnbnVsbCcsIHBhY2tTeW1ib2wsIHBhY2tzLnRvU3RyaW5nKCksICd0cmFuc2ZlcicpLCAndW5hYmxlIHRvIHRyYW5zZmVyIHBhY2sgdG9rZW5zJykpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIC8vIHdlIHdpbGwgaXNzdWUgY3JpdHRlcnMgaW4gcGFja3Mgb2YgNSBhdCBvbmNlCiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYWNrczsgaSArPSAxKSB7CiAgICAgICAgICBjb25zdCBpbnN0YW5jZXMgPSBbXTsKICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgQ1JJVFRFUlNfUEVSX1BBQ0s7IGogKz0gMSkgewogICAgICAgICAgICBpbnN0YW5jZXMucHVzaChnZW5lcmF0ZVJhbmRvbUNyaXR0ZXIoZWRpdGlvbk1hcHBpbmdbcGFja1N5bWJvbF0sIGFwaS5zZW5kZXIpKTsKICAgICAgICAgIH0KCiAgICAgICAgICBhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoJ25mdCcsICdpc3N1ZU11bHRpcGxlJywgewogICAgICAgICAgICBpbnN0YW5jZXMsCiAgICAgICAgICAgIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogIH0KICByZXR1cm4gZmFsc2U7Cn07Cg=="
}
}
}

{
"id": "ssc-testnet1",
"json": {
"contractName": "contract",
"contractAction": "deploy",
"contractPayload": {
"name": "nftmarket",
"params": "",
"code": "LyogZXNsaW50LWRpc2FibGUgbm8tYXdhaXQtaW4tbG9vcCAqLwovKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovCi8qIGVzbGludC1kaXNhYmxlIHByZWZlci10ZW1wbGF0ZSAqLwovKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlcnNjb3JlLWRhbmdsZSAqLwovKiBnbG9iYWwgYWN0aW9ucywgYXBpICovCgpjb25zdCBDT05UUkFDVF9OQU1FID0gJ25mdG1hcmtldCc7CgovLyBjYW5ub3QgYnV5IG9yIHNlbGwgbW9yZSB0aGFuIHRoaXMgbnVtYmVyIG9mIE5GVCBpbnN0YW5jZXMgaW4gb25lIGFjdGlvbgpjb25zdCBNQVhfTlVNX1VOSVRTX09QRVJBQkxFID0gNTA7CgphY3Rpb25zLmNyZWF0ZVNTQyA9IGFzeW5jICgpID0+IHsKICAvLyBub3RoaW5nIHRvIGRvIGhlcmUKfTsKCi8vIGNoZWNrIHRoYXQgdG9rZW4gdHJhbnNmZXJzIHN1Y2NlZWRlZApjb25zdCBpc1Rva2VuVHJhbnNmZXJWZXJpZmllZCA9IChyZXN1bHQsIGZyb20sIHRvLCBzeW1ib2wsIHF1YW50aXR5LCBldmVudFN0cikgPT4gewogIGlmIChyZXN1bHQuZXJyb3JzID09PSB1bmRlZmluZWQKICAgICYmIHJlc3VsdC5ldmVudHMgJiYgcmVzdWx0LmV2ZW50cy5maW5kKGVsID0+IGVsLmNvbnRyYWN0ID09PSAndG9rZW5zJyAmJiBlbC5ldmVudCA9PT0gZXZlbnRTdHIKICAgICYmIGVsLmRhdGEuZnJvbSA9PT0gZnJvbSAmJiBlbC5kYXRhLnRvID09PSB0byAmJiBlbC5kYXRhLnF1YW50aXR5ID09PSBxdWFudGl0eSAmJiBlbC5kYXRhLnN5bWJvbCA9PT0gc3ltYm9sKSAhPT0gdW5kZWZpbmVkKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgcmV0dXJuIGZhbHNlOwp9OwoKY29uc3QgY291bnREZWNpbWFscyA9IHZhbHVlID0+IGFwaS5CaWdOdW1iZXIodmFsdWUpLmRwKCk7CgovLyBhIHZhbGlkIFN0ZWVtIGFjY291bnQgaXMgYmV0d2VlbiAzIGFuZCAxNiBjaGFyYWN0ZXJzIGluIGxlbmd0aApjb25zdCBpc1ZhbGlkU3RlZW1BY2NvdW50TGVuZ3RoID0gYWNjb3VudCA9PiBhY2NvdW50Lmxlbmd0aCA+PSAzICYmIGFjY291bnQubGVuZ3RoIDw9IDE2OwoKLy8gaGVscGVyIGZvciBidXkgYWN0aW9uCmNvbnN0IG1ha2VNYXBLZXkgPSAoYWNjb3VudCwgdHlwZSkgPT4gYWNjb3VudCArICctJyArIHR5cGU7CgovLyBoZWxwZXIgZm9yIHVwZGF0aW5nIG9wZW4gaW50ZXJlc3QKY29uc3QgbWFrZUdyb3VwaW5nS2V5ID0gKGdyb3VwaW5nLCBncm91cEJ5KSA9PiB7CiAgbGV0IGtleSA9ICcnOwogIGdyb3VwQnkuZm9yRWFjaCgobmFtZSkgPT4gewogICAga2V5ID0ga2V5ICsgJzonICsgbmFtZSArICc6JyArIGdyb3VwaW5nW25hbWVdOwogIH0pOwogIHJldHVybiBrZXk7Cn07Cgpjb25zdCBpc1ZhbGlkSWRBcnJheSA9IChhcnIpID0+IHsKICB0cnkgewogICAgaWYgKCFhcGkuYXNzZXJ0KGFyciAmJiB0eXBlb2YgYXJyID09PSAnb2JqZWN0JyAmJiBBcnJheS5pc0FycmF5KGFyciksICdpbnZhbGlkIGlkIGxpc3QnKSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgaWYgKCFhcGkuYXNzZXJ0KGFyci5sZW5ndGggPD0gTUFYX05VTV9VTklUU19PUEVSQUJMRSwgYGNhbm5vdCBhY3Qgb24gbW9yZSB0aGFuICR7TUFYX05VTV9VTklUU19PUEVSQUJMRX0gSURzIGF0IG9uY2VgKSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgY29uc3QgaWQgPSBhcnJbaV07CiAgICAgIGlmICghYXBpLmFzc2VydChpZCAmJiB0eXBlb2YgaWQgPT09ICdzdHJpbmcnICYmICFhcGkuQmlnTnVtYmVyKGlkKS5pc05hTigpICYmIGFwaS5CaWdOdW1iZXIoaWQpLmd0KDApLCAnaW52YWxpZCBpZCBsaXN0JykpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICB9IGNhdGNoIChlKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIHJldHVybiB0cnVlOwp9OwoKYWN0aW9ucy5lbmFibGVNYXJrZXQgPSBhc3luYyAocGF5bG9hZCkgPT4gewogIGNvbnN0IHsKICAgIHN5bWJvbCwKICAgIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICB9ID0gcGF5bG9hZDsKCiAgaWYgKGFwaS5hc3NlcnQoaXNTaWduZWRXaXRoQWN0aXZlS2V5ID09PSB0cnVlLCAneW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5JykKICAgICYmIGFwaS5hc3NlcnQoc3ltYm9sICYmIHR5cGVvZiBzeW1ib2wgPT09ICdzdHJpbmcnLCAnaW52YWxpZCBwYXJhbXMnKSkgewogICAgLy8gbWFrZSBzdXJlIE5GVCBleGlzdHMgYW5kIHZlcmlmeSBvd25lcnNoaXAKICAgIGNvbnN0IG5mdCA9IGF3YWl0IGFwaS5kYi5maW5kT25lSW5UYWJsZSgnbmZ0JywgJ25mdHMnLCB7IHN5bWJvbCB9KTsKICAgIGlmIChhcGkuYXNzZXJ0KG5mdCAhPT0gbnVsbCwgJ3N5bWJvbCBkb2VzIG5vdCBleGlzdCcpCiAgICAgICYmIGFwaS5hc3NlcnQobmZ0Lmlzc3VlciA9PT0gYXBpLnNlbmRlciwgJ211c3QgYmUgdGhlIGlzc3VlcicpKSB7CiAgICAgIC8vIGNyZWF0ZSBhIG5ldyB0YWJsZSB0byBob2xkIG1hcmtldCBvcmRlcnMgZm9yIHRoaXMgTkZUCiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItdGVtcGxhdGUKICAgICAgY29uc3QgbWFya2V0VGFibGVOYW1lID0gc3ltYm9sICsgJ3NlbGxCb29rJzsKICAgICAgY29uc3QgbWV0cmljc1RhYmxlTmFtZSA9IHN5bWJvbCArICdvcGVuSW50ZXJlc3QnOwogICAgICBjb25zdCBoaXN0b3J5VGFibGVOYW1lID0gc3ltYm9sICsgJ3RyYWRlc0hpc3RvcnknOwogICAgICBjb25zdCB0YWJsZUV4aXN0cyA9IGF3YWl0IGFwaS5kYi50YWJsZUV4aXN0cyhtYXJrZXRUYWJsZU5hbWUpOwogICAgICBpZiAoYXBpLmFzc2VydCh0YWJsZUV4aXN0cyA9PT0gZmFsc2UsICdtYXJrZXQgYWxyZWFkeSBlbmFibGVkJykpIHsKICAgICAgICBhd2FpdCBhcGkuZGIuY3JlYXRlVGFibGUobWFya2V0VGFibGVOYW1lLCBbJ293bmVkQnknLCAnYWNjb3VudCcsICduZnRJZCcsICdncm91cGluZycsICdwcmljZVN5bWJvbCddKTsKICAgICAgICBhd2FpdCBhcGkuZGIuY3JlYXRlVGFibGUobWV0cmljc1RhYmxlTmFtZSwgWydzaWRlJywgJ3ByaWNlU3ltYm9sJywgJ2dyb3VwaW5nJ10pOwogICAgICAgIGF3YWl0IGFwaS5kYi5jcmVhdGVUYWJsZShoaXN0b3J5VGFibGVOYW1lLCBbJ3ByaWNlU3ltYm9sJywgJ3RpbWVzdGFtcCddKTsKCiAgICAgICAgYXBpLmVtaXQoJ2VuYWJsZU1hcmtldCcsIHsgc3ltYm9sIH0pOwogICAgICB9CiAgICB9CiAgfQp9OwoKY29uc3QgdXBkYXRlT3BlbkludGVyZXN0ID0gYXN5bmMgKHNpZGUsIHN5bWJvbCwgcHJpY2VTeW1ib2wsIGdyb3VwcywgZ3JvdXBCeSkgPT4gewogIGNvbnN0IG1ldHJpY3NUYWJsZU5hbWUgPSBzeW1ib2wgKyAnb3BlbkludGVyZXN0JzsKCiAgLy8gY29sbGVjdCBhbGwgdGhlIGdyb3VwaW5ncyB0byBmZXRjaAogIGNvbnN0IGdyb3VwS2V5cyA9IFtdOwogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheAogIGZvciAoY29uc3QgaW5mbyBvZiBPYmplY3QudmFsdWVzKGdyb3VwcykpIHsKICAgIGdyb3VwS2V5cy5wdXNoKGluZm8uZ3JvdXBpbmcpOwogIH0KCiAgaWYgKGdyb3VwS2V5cy5sZW5ndGggPD0gMCkgewogICAgcmV0dXJuOwogIH0KCiAgY29uc3Qgb3BlbkludGVyZXN0ID0gYXdhaXQgYXBpLmRiLmZpbmQoCiAgICBtZXRyaWNzVGFibGVOYW1lLAogICAgewogICAgICBzaWRlLAogICAgICBwcmljZVN5bWJvbCwKICAgICAgZ3JvdXBpbmc6IHsKICAgICAgICAkaW46IGdyb3VwS2V5cywKICAgICAgfSwKICAgIH0sCiAgICBNQVhfTlVNX1VOSVRTX09QRVJBQkxFLAogICAgMCwKICAgIFt7IGluZGV4OiAnc2lkZScsIGRlc2NlbmRpbmc6IGZhbHNlIH0sIHsgaW5kZXg6ICdwcmljZVN5bWJvbCcsIGRlc2NlbmRpbmc6IGZhbHNlIH0sIHsgaW5kZXg6ICdncm91cGluZycsIGRlc2NlbmRpbmc6IGZhbHNlIH1dLAogICk7CgogIC8vIHVwZGF0ZSBleGlzdGluZyByZWNvcmRzLi4uCiAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcGVuSW50ZXJlc3QubGVuZ3RoOyBpICs9IDEpIHsKICAgIGNvbnN0IG1ldHJpYyA9IG9wZW5JbnRlcmVzdFtpXTsKICAgIGNvbnN0IGtleSA9IG1ha2VHcm91cGluZ0tleShtZXRyaWMuZ3JvdXBpbmcsIGdyb3VwQnkpOwogICAgaWYgKGtleSBpbiBncm91cHMpIHsKICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduCiAgICAgIGdyb3Vwc1trZXldLmlzSW5Db2xsZWN0aW9uID0gdHJ1ZTsKICAgICAgbWV0cmljLmNvdW50ICs9IGdyb3Vwc1trZXldLmNvdW50OwogICAgICBpZiAobWV0cmljLmNvdW50IDwgMCkgewogICAgICAgIG1ldHJpYy5jb3VudCA9IDA7IC8vIHNob3VsZG4ndCBoYXBwZW4sIGJ1dCBuZWVkIHRvIHNhZmVndWFyZAogICAgICB9CgogICAgICBhd2FpdCBhcGkuZGIudXBkYXRlKG1ldHJpY3NUYWJsZU5hbWUsIG1ldHJpYyk7CiAgICB9CiAgfQoKICAvLyAuLi5hbmQgYWRkIG5ldyBvbmVzCiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4CiAgZm9yIChjb25zdCBpbmZvIG9mIE9iamVjdC52YWx1ZXMoZ3JvdXBzKSkgewogICAgaWYgKCFpbmZvLmlzSW5Db2xsZWN0aW9uKSB7CiAgICAgIGNvbnN0IGZpbmFsQ291bnQgPSBpbmZvLmNvdW50ID4gMCA/IGluZm8uY291bnQgOiAwOwogICAgICBjb25zdCBuZXdNZXRyaWMgPSB7CiAgICAgICAgc2lkZSwKICAgICAgICBwcmljZVN5bWJvbCwKICAgICAgICBncm91cGluZzogaW5mby5ncm91cGluZywKICAgICAgICBjb3VudDogZmluYWxDb3VudCwKICAgICAgfTsKCiAgICAgIGF3YWl0IGFwaS5kYi5pbnNlcnQobWV0cmljc1RhYmxlTmFtZSwgbmV3TWV0cmljKTsKICAgIH0KICB9Cn07Cgpjb25zdCB1cGRhdGVUcmFkZXNIaXN0b3J5ID0gYXN5bmMgKHR5cGUsIGFjY291bnQsIG93bmVkQnksIGNvdW50ZXJwYXJ0aWVzLCBzeW1ib2wsIHByaWNlU3ltYm9sLCBwcmljZSwgbWFya2V0QWNjb3VudCwgZmVlLCB2b2x1bWUpID0+IHsKICBjb25zdCBibG9ja0RhdGUgPSBuZXcgRGF0ZShgJHthcGkuc3RlZW1CbG9ja1RpbWVzdGFtcH0uMDAwWmApOwogIGNvbnN0IHRpbWVzdGFtcFNlYyA9IGJsb2NrRGF0ZS5nZXRUaW1lKCkgLyAxMDAwOwogIGNvbnN0IHRpbWVzdGFtcE1pbnVzMjRocnMgPSBibG9ja0RhdGUuc2V0RGF0ZShibG9ja0RhdGUuZ2V0RGF0ZSgpIC0gMSkgLyAxMDAwOwogIGNvbnN0IGhpc3RvcnlUYWJsZU5hbWUgPSBzeW1ib2wgKyAndHJhZGVzSGlzdG9yeSc7CgogIC8vIGNsZWFuIGhpc3RvcnkKICBsZXQgdHJhZGVzVG9EZWxldGUgPSBhd2FpdCBhcGkuZGIuZmluZCgKICAgIGhpc3RvcnlUYWJsZU5hbWUsCiAgICB7CiAgICAgIHByaWNlU3ltYm9sLAogICAgICB0aW1lc3RhbXA6IHsKICAgICAgICAkbHQ6IHRpbWVzdGFtcE1pbnVzMjRocnMsCiAgICAgIH0sCiAgICB9LAogICk7CiAgbGV0IG5iVHJhZGVzVG9EZWxldGUgPSB0cmFkZXNUb0RlbGV0ZS5sZW5ndGg7CgogIHdoaWxlIChuYlRyYWRlc1RvRGVsZXRlID4gMCkgewogICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IG5iVHJhZGVzVG9EZWxldGU7IGluZGV4ICs9IDEpIHsKICAgICAgY29uc3QgdHJhZGUgPSB0cmFkZXNUb0RlbGV0ZVtpbmRleF07CiAgICAgIGF3YWl0IGFwaS5kYi5yZW1vdmUoaGlzdG9yeVRhYmxlTmFtZSwgdHJhZGUpOwogICAgfQogICAgdHJhZGVzVG9EZWxldGUgPSBhd2FpdCBhcGkuZGIuZmluZCgKICAgICAgaGlzdG9yeVRhYmxlTmFtZSwKICAgICAgewogICAgICAgIHByaWNlU3ltYm9sLAogICAgICAgIHRpbWVzdGFtcDogewogICAgICAgICAgJGx0OiB0aW1lc3RhbXBNaW51czI0aHJzLAogICAgICAgIH0sCiAgICAgIH0sCiAgICApOwogICAgbmJUcmFkZXNUb0RlbGV0ZSA9IHRyYWRlc1RvRGVsZXRlLmxlbmd0aDsKICB9CiAgLy8gYWRkIG9yZGVyIHRvIHRoZSBoaXN0b3J5CiAgY29uc3QgbmV3VHJhZGUgPSB7fTsKICBuZXdUcmFkZS50eXBlID0gdHlwZTsKICBuZXdUcmFkZS5hY2NvdW50ID0gYWNjb3VudDsKICBuZXdUcmFkZS5vd25lZEJ5ID0gb3duZWRCeTsKICBuZXdUcmFkZS5jb3VudGVycGFydGllcyA9IGNvdW50ZXJwYXJ0aWVzOwogIG5ld1RyYWRlLnByaWNlU3ltYm9sID0gcHJpY2VTeW1ib2w7CiAgbmV3VHJhZGUucHJpY2UgPSBwcmljZTsKICBuZXdUcmFkZS5tYXJrZXRBY2NvdW50ID0gbWFya2V0QWNjb3VudDsKICBuZXdUcmFkZS5mZWUgPSBmZWU7CiAgbmV3VHJhZGUudGltZXN0YW1wID0gdGltZXN0YW1wU2VjOwogIG5ld1RyYWRlLnZvbHVtZSA9IHZvbHVtZTsKICBhd2FpdCBhcGkuZGIuaW5zZXJ0KGhpc3RvcnlUYWJsZU5hbWUsIG5ld1RyYWRlKTsKfTsKCmFjdGlvbnMuY2hhbmdlUHJpY2UgPSBhc3luYyAocGF5bG9hZCkgPT4gewogIGNvbnN0IHsKICAgIHN5bWJvbCwKICAgIG5mdHMsCiAgICBwcmljZSwKICAgIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICB9ID0gcGF5bG9hZDsKCiAgaWYgKCFhcGkuYXNzZXJ0KHN5bWJvbCAmJiB0eXBlb2Ygc3ltYm9sID09PSAnc3RyaW5nJywgJ2ludmFsaWQgcGFyYW1zJykpIHsKICAgIHJldHVybjsKICB9CgogIGNvbnN0IG1hcmtldFRhYmxlTmFtZSA9IHN5bWJvbCArICdzZWxsQm9vayc7CiAgY29uc3QgdGFibGVFeGlzdHMgPSBhd2FpdCBhcGkuZGIudGFibGVFeGlzdHMobWFya2V0VGFibGVOYW1lKTsKCiAgaWYgKGFwaS5hc3NlcnQoaXNTaWduZWRXaXRoQWN0aXZlS2V5ID09PSB0cnVlLCAneW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5JykKICAgICYmIGlzVmFsaWRJZEFycmF5KG5mdHMpCiAgICAmJiBhcGkuYXNzZXJ0KHByaWNlICYmIHR5cGVvZiBwcmljZSA9PT0gJ3N0cmluZycgJiYgIWFwaS5CaWdOdW1iZXIocHJpY2UpLmlzTmFOKCksICdpbnZhbGlkIHBhcmFtcycpCiAgICAmJiBhcGkuYXNzZXJ0KHRhYmxlRXhpc3RzLCAnbWFya2V0IG5vdCBlbmFibGVkIGZvciBzeW1ib2wnKSkgewogICAgLy8gbG9vayB1cCBvcmRlciBpbmZvCiAgICBjb25zdCBvcmRlcnMgPSBhd2FpdCBhcGkuZGIuZmluZCgKICAgICAgbWFya2V0VGFibGVOYW1lLAogICAgICB7CiAgICAgICAgbmZ0SWQ6IHsKICAgICAgICAgICRpbjogbmZ0cywKICAgICAgICB9LAogICAgICB9LAogICAgICBNQVhfTlVNX1VOSVRTX09QRVJBQkxFLAogICAgICAwLAogICAgICBbeyBpbmRleDogJ25mdElkJywgZGVzY2VuZGluZzogZmFsc2UgfV0sCiAgICApOwoKICAgIGlmIChvcmRlcnMubGVuZ3RoID4gMCkgewogICAgICAvLyBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGNhbGxlciBpcyBhY3R1YWxseSB0aGUgb3duZXIgb2YgZWFjaCBvcmRlcgogICAgICAvLyBhbmQgYWxsIG9yZGVycyBoYXZlIHRoZSBzYW1lIHByaWNlIHN5bWJvbAogICAgICBsZXQgcHJpY2VTeW1ib2wgPSAnJzsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcmRlcnMubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgICBjb25zdCBvcmRlciA9IG9yZGVyc1tpXTsKICAgICAgICBpZiAocHJpY2VTeW1ib2wgPT09ICcnKSB7CiAgICAgICAgICAoeyBwcmljZVN5bWJvbCB9ID0gb3JkZXIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWFwaS5hc3NlcnQob3JkZXIuYWNjb3VudCA9PT0gYXBpLnNlbmRlcgogICAgICAgICAgJiYgb3JkZXIub3duZWRCeSA9PT0gJ3UnLCAnYWxsIG9yZGVycyBtdXN0IGJlIHlvdXIgb3duJykKICAgICAgICAgIHx8ICFhcGkuYXNzZXJ0KHByaWNlU3ltYm9sID09PSBvcmRlci5wcmljZVN5bWJvbCwgJ2FsbCBvcmRlcnMgbXVzdCBoYXZlIHRoZSBzYW1lIHByaWNlIHN5bWJvbCcpKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIGdldCB0aGUgcHJpY2UgdG9rZW4gcGFyYW1zCiAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCd0b2tlbnMnLCAndG9rZW5zJywgeyBzeW1ib2w6IHByaWNlU3ltYm9sIH0pOwogICAgICBpZiAoYXBpLmFzc2VydCh0b2tlbgogICAgICAgICYmIGFwaS5CaWdOdW1iZXIocHJpY2UpLmd0KDApCiAgICAgICAgJiYgY291bnREZWNpbWFscyhwcmljZSkgPD0gdG9rZW4ucHJlY2lzaW9uLCAnaW52YWxpZCBwcmljZScpKSB7CiAgICAgICAgY29uc3QgZmluYWxQcmljZSA9IGFwaS5CaWdOdW1iZXIocHJpY2UpLnRvRml4ZWQodG9rZW4ucHJlY2lzaW9uKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9yZGVycy5sZW5ndGg7IGkgKz0gMSkgewogICAgICAgICAgY29uc3Qgb3JkZXIgPSBvcmRlcnNbaV07CiAgICAgICAgICBjb25zdCBvbGRQcmljZSA9IG9yZGVyLnByaWNlOwogICAgICAgICAgb3JkZXIucHJpY2UgPSBmaW5hbFByaWNlOwogICAgICAgICAgb3JkZXIucHJpY2VEZWMgPSB7ICRudW1iZXJEZWNpbWFsOiBmaW5hbFByaWNlIH07CgogICAgICAgICAgYXdhaXQgYXBpLmRiLnVwZGF0ZShtYXJrZXRUYWJsZU5hbWUsIG9yZGVyKTsKCiAgICAgICAgICBhcGkuZW1pdCgnY2hhbmdlUHJpY2UnLCB7CiAgICAgICAgICAgIHN5bWJvbCwKICAgICAgICAgICAgbmZ0SWQ6IG9yZGVyLm5mdElkLAogICAgICAgICAgICBvbGRQcmljZSwKICAgICAgICAgICAgbmV3UHJpY2U6IG9yZGVyLnByaWNlLAogICAgICAgICAgICBwcmljZVN5bWJvbDogb3JkZXIucHJpY2VTeW1ib2wsCiAgICAgICAgICAgIG9yZGVySWQ6IG9yZGVyLl9pZCwKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfTsKCmFjdGlvbnMuY2FuY2VsID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBjb25zdCB7CiAgICBzeW1ib2wsCiAgICBuZnRzLAogICAgaXNTaWduZWRXaXRoQWN0aXZlS2V5LAogIH0gPSBwYXlsb2FkOwoKICBpZiAoIWFwaS5hc3NlcnQoc3ltYm9sICYmIHR5cGVvZiBzeW1ib2wgPT09ICdzdHJpbmcnLCAnaW52YWxpZCBwYXJhbXMnKSkgewogICAgcmV0dXJuOwogIH0KCiAgY29uc3QgbWFya2V0VGFibGVOYW1lID0gc3ltYm9sICsgJ3NlbGxCb29rJzsKICBjb25zdCB0YWJsZUV4aXN0cyA9IGF3YWl0IGFwaS5kYi50YWJsZUV4aXN0cyhtYXJrZXRUYWJsZU5hbWUpOwoKICBpZiAoYXBpLmFzc2VydChpc1NpZ25lZFdpdGhBY3RpdmVLZXkgPT09IHRydWUsICd5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXknKQogICAgJiYgaXNWYWxpZElkQXJyYXkobmZ0cykKICAgICYmIGFwaS5hc3NlcnQodGFibGVFeGlzdHMsICdtYXJrZXQgbm90IGVuYWJsZWQgZm9yIHN5bWJvbCcpKSB7CiAgICBjb25zdCBuZnQgPSBhd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoJ25mdCcsICduZnRzJywgeyBzeW1ib2wgfSk7CiAgICBpZiAoIWFwaS5hc3NlcnQobmZ0ICYmIG5mdC5ncm91cEJ5ICYmIG5mdC5ncm91cEJ5Lmxlbmd0aCA+IDAsICdtYXJrZXQgZ3JvdXBpbmcgbm90IHNldCcpKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBsb29rIHVwIG9yZGVyIGluZm8KICAgIGNvbnN0IG9yZGVycyA9IGF3YWl0IGFwaS5kYi5maW5kKAogICAgICBtYXJrZXRUYWJsZU5hbWUsCiAgICAgIHsKICAgICAgICBuZnRJZDogewogICAgICAgICAgJGluOiBuZnRzLAogICAgICAgIH0sCiAgICAgIH0sCiAgICAgIE1BWF9OVU1fVU5JVFNfT1BFUkFCTEUsCiAgICAgIDAsCiAgICAgIFt7IGluZGV4OiAnbmZ0SWQnLCBkZXNjZW5kaW5nOiBmYWxzZSB9XSwKICAgICk7CgogICAgaWYgKG9yZGVycy5sZW5ndGggPiAwKSB7CiAgICAgIC8vIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgY2FsbGVyIGlzIGFjdHVhbGx5IHRoZSBvd25lciBvZiBlYWNoIG9yZGVyCiAgICAgIGNvbnN0IGlkcyA9IFtdOwogICAgICBjb25zdCBpZE1hcCA9IHt9OwogICAgICBsZXQgcHJpY2VTeW1ib2wgPSAnJzsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcmRlcnMubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgICBjb25zdCBvcmRlciA9IG9yZGVyc1tpXTsKICAgICAgICBpZiAocHJpY2VTeW1ib2wgPT09ICcnKSB7CiAgICAgICAgICAoeyBwcmljZVN5bWJvbCB9ID0gb3JkZXIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWFwaS5hc3NlcnQob3JkZXIuYWNjb3VudCA9PT0gYXBpLnNlbmRlciAmJiBvcmRlci5vd25lZEJ5ID09PSAndScsICdhbGwgb3JkZXJzIG11c3QgYmUgeW91ciBvd24nKQogICAgICAgICAgfHwgIWFwaS5hc3NlcnQocHJpY2VTeW1ib2wgPT09IG9yZGVyLnByaWNlU3ltYm9sLCAnYWxsIG9yZGVycyBtdXN0IGhhdmUgdGhlIHNhbWUgcHJpY2Ugc3ltYm9sJykpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWRzLnB1c2gob3JkZXIubmZ0SWQpOwogICAgICAgIGlkTWFwW29yZGVyLm5mdElkXSA9IG9yZGVyOwogICAgICB9CgogICAgICAvLyBtb3ZlIHRoZSBsb2NrZWQgTkZUcyBiYWNrIHRvIHRoZWlyIG93bmVyCiAgICAgIGNvbnN0IG5mdEFycmF5ID0gW107CiAgICAgIGNvbnN0IHdyYXBwZWROZnRzID0gewogICAgICAgIHN5bWJvbCwKICAgICAgICBpZHMsCiAgICAgIH07CiAgICAgIG5mdEFycmF5LnB1c2god3JhcHBlZE5mdHMpOwogICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoJ25mdCcsICd0cmFuc2ZlcicsIHsKICAgICAgICBmcm9tVHlwZTogJ2NvbnRyYWN0JywKICAgICAgICB0bzogYXBpLnNlbmRlciwKICAgICAgICB0b1R5cGU6ICd1c2VyJywKICAgICAgICBuZnRzOiBuZnRBcnJheSwKICAgICAgICBpc1NpZ25lZFdpdGhBY3RpdmVLZXksCiAgICAgIH0pOwoKICAgICAgLy8gaXQncyBwb3NzaWJsZSAoYnV0IHVubGlrZWx5KSB0aGF0IHNvbWUgdHJhbnNmZXJzIGNvdWxkIGhhdmUgZmFpbGVkCiAgICAgIC8vIGR1ZSB0byB2YWxpZGF0aW9uIGVycm9ycyAmIHdoYXRub3QsIHNvIHdlIG5lZWQgdG8gbG9vcCBvdmVyIHRoZQogICAgICAvLyB0cmFuc2ZlciByZXN1bHRzIGFuZCBvbmx5IGNhbmNlbCBvcmRlcnMgZm9yIHRoZSB0cmFuc2ZlcnMgdGhhdCBzdWNjZWVkZWQKICAgICAgaWYgKHJlcy5ldmVudHMpIHsKICAgICAgICBjb25zdCBncm91cGluZ01hcCA9IHt9OwogICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVzLmV2ZW50cy5sZW5ndGg7IGogKz0gMSkgewogICAgICAgICAgY29uc3QgZXYgPSByZXMuZXZlbnRzW2pdOwogICAgICAgICAgaWYgKGV2LmNvbnRyYWN0ICYmIGV2LmV2ZW50ICYmIGV2LmRhdGEKICAgICAgICAgICAgJiYgZXYuY29udHJhY3QgPT09ICduZnQnCiAgICAgICAgICAgICYmIGV2LmV2ZW50ID09PSAndHJhbnNmZXInCiAgICAgICAgICAgICYmIGV2LmRhdGEuZnJvbSA9PT0gQ09OVFJBQ1RfTkFNRQogICAgICAgICAgICAmJiBldi5kYXRhLmZyb21UeXBlID09PSAnYycKICAgICAgICAgICAgJiYgZXYuZGF0YS50byA9PT0gYXBpLnNlbmRlcgogICAgICAgICAgICAmJiBldi5kYXRhLnRvVHlwZSA9PT0gJ3UnCiAgICAgICAgICAgICYmIGV2LmRhdGEuc3ltYm9sID09PSBzeW1ib2wpIHsKICAgICAgICAgICAgLy8gdHJhbnNmZXIgaXMgdmVyaWZpZWQsIG5vdyB3ZSBjYW4gY2FuY2VsIHRoZSBvcmRlcgogICAgICAgICAgICBjb25zdCBpbnN0YW5jZUlkID0gZXYuZGF0YS5pZDsKICAgICAgICAgICAgaWYgKGluc3RhbmNlSWQgaW4gaWRNYXApIHsKICAgICAgICAgICAgICBjb25zdCBvcmRlciA9IGlkTWFwW2luc3RhbmNlSWRdOwoKICAgICAgICAgICAgICBhd2FpdCBhcGkuZGIucmVtb3ZlKG1hcmtldFRhYmxlTmFtZSwgb3JkZXIpOwoKICAgICAgICAgICAgICBhcGkuZW1pdCgnY2FuY2VsT3JkZXInLCB7CiAgICAgICAgICAgICAgICBhY2NvdW50OiBvcmRlci5hY2NvdW50LAogICAgICAgICAgICAgICAgb3duZWRCeTogb3JkZXIub3duZWRCeSwKICAgICAgICAgICAgICAgIHN5bWJvbCwKICAgICAgICAgICAgICAgIG5mdElkOiBvcmRlci5uZnRJZCwKICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogb3JkZXIudGltZXN0YW1wLAogICAgICAgICAgICAgICAgcHJpY2U6IG9yZGVyLnByaWNlLAogICAgICAgICAgICAgICAgcHJpY2VTeW1ib2w6IG9yZGVyLnByaWNlU3ltYm9sLAogICAgICAgICAgICAgICAgZmVlOiBvcmRlci5mZWUsCiAgICAgICAgICAgICAgICBvcmRlcklkOiBvcmRlci5faWQsCiAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgIGNvbnN0IGtleSA9IG1ha2VHcm91cGluZ0tleShvcmRlci5ncm91cGluZywgbmZ0Lmdyb3VwQnkpOwogICAgICAgICAgICAgIGNvbnN0IGdyb3VwSW5mbyA9IGtleSBpbiBncm91cGluZ01hcAogICAgICAgICAgICAgICAgPyBncm91cGluZ01hcFtrZXldCiAgICAgICAgICAgICAgICA6IHsKICAgICAgICAgICAgICAgICAgZ3JvdXBpbmc6IG9yZGVyLmdyb3VwaW5nLAogICAgICAgICAgICAgICAgICBpc0luQ29sbGVjdGlvbjogZmFsc2UsCiAgICAgICAgICAgICAgICAgIGNvdW50OiAwLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICBncm91cEluZm8uY291bnQgLT0gMTsKICAgICAgICAgICAgICBncm91cGluZ01hcFtrZXldID0gZ3JvdXBJbmZvOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyB1cGRhdGUgb3BlbiBpbnRlcmVzdCBtZXRyaWNzCiAgICAgICAgYXdhaXQgdXBkYXRlT3BlbkludGVyZXN0KCdzZWxsJywgc3ltYm9sLCBwcmljZVN5bWJvbCwgZ3JvdXBpbmdNYXAsIG5mdC5ncm91cEJ5KTsKICAgICAgfQogICAgfQogIH0KfTsKCmFjdGlvbnMuYnV5ID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBjb25zdCB7CiAgICBzeW1ib2wsCiAgICBuZnRzLAogICAgbWFya2V0QWNjb3VudCwKICAgIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICB9ID0gcGF5bG9hZDsKCiAgaWYgKCFhcGkuYXNzZXJ0KHN5bWJvbCAmJiB0eXBlb2Ygc3ltYm9sID09PSAnc3RyaW5nJwogICAgJiYgbWFya2V0QWNjb3VudCAmJiB0eXBlb2YgbWFya2V0QWNjb3VudCA9PT0gJ3N0cmluZycsICdpbnZhbGlkIHBhcmFtcycpKSB7CiAgICByZXR1cm47CiAgfQoKICBjb25zdCBtYXJrZXRUYWJsZU5hbWUgPSBzeW1ib2wgKyAnc2VsbEJvb2snOwogIGNvbnN0IHRhYmxlRXhpc3RzID0gYXdhaXQgYXBpLmRiLnRhYmxlRXhpc3RzKG1hcmtldFRhYmxlTmFtZSk7CgogIGlmIChhcGkuYXNzZXJ0KGlzU2lnbmVkV2l0aEFjdGl2ZUtleSA9PT0gdHJ1ZSwgJ3lvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleScpCiAgICAmJiBpc1ZhbGlkSWRBcnJheShuZnRzKQogICAgJiYgYXBpLmFzc2VydCh0YWJsZUV4aXN0cywgJ21hcmtldCBub3QgZW5hYmxlZCBmb3Igc3ltYm9sJykpIHsKICAgIGNvbnN0IGZpbmFsTWFya2V0QWNjb3VudCA9IG1hcmtldEFjY291bnQudHJpbSgpLnRvTG93ZXJDYXNlKCk7CiAgICBpZiAoYXBpLmFzc2VydChpc1ZhbGlkU3RlZW1BY2NvdW50TGVuZ3RoKGZpbmFsTWFya2V0QWNjb3VudCksICdpbnZhbGlkIG1hcmtldCBhY2NvdW50JykpIHsKICAgICAgY29uc3QgbmZ0ID0gYXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCduZnQnLCAnbmZ0cycsIHsgc3ltYm9sIH0pOwogICAgICBpZiAoIWFwaS5hc3NlcnQobmZ0ICYmIG5mdC5ncm91cEJ5ICYmIG5mdC5ncm91cEJ5Lmxlbmd0aCA+IDAsICdtYXJrZXQgZ3JvdXBpbmcgbm90IHNldCcpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICAvLyBsb29rIHVwIG9yZGVyIGluZm8KICAgICAgY29uc3Qgb3JkZXJzID0gYXdhaXQgYXBpLmRiLmZpbmQoCiAgICAgICAgbWFya2V0VGFibGVOYW1lLAogICAgICAgIHsKICAgICAgICAgIG5mdElkOiB7CiAgICAgICAgICAgICRpbjogbmZ0cywKICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBNQVhfTlVNX1VOSVRTX09QRVJBQkxFLAogICAgICAgIDAsCiAgICAgICAgW3sgaW5kZXg6ICduZnRJZCcsIGRlc2NlbmRpbmc6IGZhbHNlIH1dLAogICAgICApOwoKICAgICAgaWYgKG9yZGVycy5sZW5ndGggPiAwKSB7CiAgICAgICAgLy8gZG8gYSBjb3VwbGUgbW9yZSBzYW5pdHkgY2hlY2tzCiAgICAgICAgbGV0IHByaWNlU3ltYm9sID0gJyc7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcmRlcnMubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgICAgIGNvbnN0IG9yZGVyID0gb3JkZXJzW2ldOwogICAgICAgICAgaWYgKHByaWNlU3ltYm9sID09PSAnJykgewogICAgICAgICAgICAoeyBwcmljZVN5bWJvbCB9ID0gb3JkZXIpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFhcGkuYXNzZXJ0KCEob3JkZXIub3duZWRCeSA9PT0gJ3UnICYmIG9yZGVyLmFjY291bnQgPT09IGFwaS5zZW5kZXIpLCAnY2Fubm90IGZpbGwgeW91ciBvd24gb3JkZXJzJykKICAgICAgICAgICAgfHwgIWFwaS5hc3NlcnQocHJpY2VTeW1ib2wgPT09IG9yZGVyLnByaWNlU3ltYm9sLCAnYWxsIG9yZGVycyBtdXN0IGhhdmUgdGhlIHNhbWUgcHJpY2Ugc3ltYm9sJykpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBnZXQgdGhlIHByaWNlIHRva2VuIHBhcmFtcwogICAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCd0b2tlbnMnLCAndG9rZW5zJywgeyBzeW1ib2w6IHByaWNlU3ltYm9sIH0pOwogICAgICAgIGlmICghdG9rZW4pIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIGNyZWF0ZSBvcmRlciBtYXBzCiAgICAgICAgbGV0IGZlZVRvdGFsID0gYXBpLkJpZ051bWJlcigwKTsKICAgICAgICBsZXQgcGF5bWVudFRvdGFsID0gYXBpLkJpZ051bWJlcigwKTsKICAgICAgICBsZXQgc29sZE5mdHMgPSBbXTsKICAgICAgICBjb25zdCBzZWxsZXJzID0gW107CiAgICAgICAgY29uc3Qgc2VsbGVyTWFwID0ge307CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcmRlcnMubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgICAgIGNvbnN0IG9yZGVyID0gb3JkZXJzW2ldOwogICAgICAgICAgY29uc3QgZmluYWxQcmljZSA9IGFwaS5CaWdOdW1iZXIob3JkZXIucHJpY2UpOwogICAgICAgICAgY29uc3QgZmVlUGVyY2VudCA9IG9yZGVyLmZlZSAvIDEwMDAwOwogICAgICAgICAgbGV0IGZpbmFsRmVlID0gZmluYWxQcmljZS5tdWx0aXBsaWVkQnkoZmVlUGVyY2VudCkuZGVjaW1hbFBsYWNlcyh0b2tlbi5wcmVjaXNpb24pOwogICAgICAgICAgaWYgKGZpbmFsRmVlLmd0KGZpbmFsUHJpY2UpKSB7CiAgICAgICAgICAgIGZpbmFsRmVlID0gZmluYWxQcmljZTsgLy8gdW5saWtlbHkgYnV0IG5lZWQgdG8gYmUgc3VyZQogICAgICAgICAgfQogICAgICAgICAgbGV0IGZpbmFsUGF5bWVudCA9IGZpbmFsUHJpY2UubWludXMoZmluYWxGZWUpLmRlY2ltYWxQbGFjZXModG9rZW4ucHJlY2lzaW9uKTsKICAgICAgICAgIGlmIChmaW5hbFBheW1lbnQubHQoMCkpIHsKICAgICAgICAgICAgZmluYWxQYXltZW50ID0gYXBpLkJpZ051bWJlcigwKTsgLy8gdW5saWtlbHkgYnV0IG5lZWQgdG8gYmUgc3VyZQogICAgICAgICAgfQogICAgICAgICAgcGF5bWVudFRvdGFsID0gcGF5bWVudFRvdGFsLnBsdXMoZmluYWxQYXltZW50KTsKICAgICAgICAgIGZlZVRvdGFsID0gZmVlVG90YWwucGx1cyhmaW5hbEZlZSk7CgogICAgICAgICAgY29uc3Qga2V5ID0gbWFrZU1hcEtleShvcmRlci5hY2NvdW50LCBvcmRlci5vd25lZEJ5KTsKICAgICAgICAgIGNvbnN0IHNlbGxlckluZm8gPSBrZXkgaW4gc2VsbGVyTWFwCiAgICAgICAgICAgID8gc2VsbGVyTWFwW2tleV0KICAgICAgICAgICAgOiB7CiAgICAgICAgICAgICAgYWNjb3VudDogb3JkZXIuYWNjb3VudCwKICAgICAgICAgICAgICBvd25lZEJ5OiBvcmRlci5vd25lZEJ5LAogICAgICAgICAgICAgIG5mdElkczogW10sCiAgICAgICAgICAgICAgcGF5bWVudFRvdGFsOiBhcGkuQmlnTnVtYmVyKDApLAogICAgICAgICAgICB9OwoKICAgICAgICAgIHNlbGxlckluZm8ucGF5bWVudFRvdGFsID0gc2VsbGVySW5mby5wYXltZW50VG90YWwucGx1cyhmaW5hbFBheW1lbnQpOwogICAgICAgICAgc2VsbGVySW5mby5uZnRJZHMucHVzaChvcmRlci5uZnRJZCk7CiAgICAgICAgICBzZWxsZXJNYXBba2V5XSA9IHNlbGxlckluZm87CiAgICAgICAgfQoKICAgICAgICAvLyB2ZXJpZnkgYnV5ZXIgaGFzIGVub3VnaCBmdW5kcyBmb3IgcGF5bWVudAogICAgICAgIGNvbnN0IHJlcXVpcmVkQmFsYW5jZSA9IHBheW1lbnRUb3RhbC5wbHVzKGZlZVRvdGFsKS50b0ZpeGVkKHRva2VuLnByZWNpc2lvbik7CiAgICAgICAgY29uc3QgYnV5ZXJCYWxhbmNlID0gYXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCd0b2tlbnMnLCAnYmFsYW5jZXMnLCB7IGFjY291bnQ6IGFwaS5zZW5kZXIsIHN5bWJvbDogcHJpY2VTeW1ib2wgfSk7CiAgICAgICAgaWYgKCFhcGkuYXNzZXJ0KGJ1eWVyQmFsYW5jZQogICAgICAgICAgJiYgYXBpLkJpZ051bWJlcihidXllckJhbGFuY2UuYmFsYW5jZSkuZ3RlKHJlcXVpcmVkQmFsYW5jZSksICd5b3UgbXVzdCBoYXZlIGVub3VnaCB0b2tlbnMgZm9yIHBheW1lbnQnKSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBwYXltZW50VG90YWwgPSBwYXltZW50VG90YWwudG9GaXhlZCh0b2tlbi5wcmVjaXNpb24pOwoKICAgICAgICAvLyBzZW5kIGZlZXMgdG8gbWFya2V0IGFjY291bnQKICAgICAgICBpZiAoZmVlVG90YWwuZ3QoMCkpIHsKICAgICAgICAgIGZlZVRvdGFsID0gZmVlVG90YWwudG9GaXhlZCh0b2tlbi5wcmVjaXNpb24pOwogICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCd0b2tlbnMnLCAndHJhbnNmZXInLCB7CiAgICAgICAgICAgIHRvOiBmaW5hbE1hcmtldEFjY291bnQsIHN5bWJvbDogcHJpY2VTeW1ib2wsIHF1YW50aXR5OiBmZWVUb3RhbCwgaXNTaWduZWRXaXRoQWN0aXZlS2V5LAogICAgICAgICAgfSk7CiAgICAgICAgICBpZiAoIWFwaS5hc3NlcnQoaXNUb2tlblRyYW5zZmVyVmVyaWZpZWQocmVzLCBhcGkuc2VuZGVyLCBmaW5hbE1hcmtldEFjY291bnQsIHByaWNlU3ltYm9sLCBmZWVUb3RhbCwgJ3RyYW5zZmVyJyksICd1bmFibGUgdG8gdHJhbnNmZXIgbWFya2V0IGZlZXMnKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBzZW5kIHBheW1lbnRzIHRvIHNlbGxlcnMKICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXgKICAgICAgICBmb3IgKGNvbnN0IGluZm8gb2YgT2JqZWN0LnZhbHVlcyhzZWxsZXJNYXApKSB7CiAgICAgICAgICBpZiAoaW5mby5wYXltZW50VG90YWwuZ3QoMCkpIHsKICAgICAgICAgICAgY29uc3QgY29udHJhY3RBY3Rpb24gPSBpbmZvLm93bmVkQnkgPT09ICd1JyA/ICd0cmFuc2ZlcicgOiAndHJhbnNmZXJUb0NvbnRyYWN0JzsKICAgICAgICAgICAgaW5mby5wYXltZW50VG90YWwgPSBpbmZvLnBheW1lbnRUb3RhbC50b0ZpeGVkKHRva2VuLnByZWNpc2lvbik7CiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaS5leGVjdXRlU21hcnRDb250cmFjdCgndG9rZW5zJywgY29udHJhY3RBY3Rpb24sIHsKICAgICAgICAgICAgICB0bzogaW5mby5hY2NvdW50LCBzeW1ib2w6IHByaWNlU3ltYm9sLCBxdWFudGl0eTogaW5mby5wYXltZW50VG90YWwsIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGlmIChhcGkuYXNzZXJ0KGlzVG9rZW5UcmFuc2ZlclZlcmlmaWVkKHJlcywgYXBpLnNlbmRlciwgaW5mby5hY2NvdW50LCBwcmljZVN5bWJvbCwgaW5mby5wYXltZW50VG90YWwsIGNvbnRyYWN0QWN0aW9uKSwgYHVuYWJsZSB0byB0cmFuc2ZlciBwYXltZW50IHRvICR7aW5mby5hY2NvdW50fWApKSB7CiAgICAgICAgICAgICAgc29sZE5mdHMgPSBzb2xkTmZ0cy5jb25jYXQoaW5mby5uZnRJZHMpOwogICAgICAgICAgICAgIHNlbGxlcnMucHVzaChpbmZvKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc29sZE5mdHMgPSBzb2xkTmZ0cy5jb25jYXQoaW5mby5uZnRJZHMpOwogICAgICAgICAgICBzZWxsZXJzLnB1c2goaW5mbyk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyB0cmFuc2ZlciBzb2xkIE5GVCBpbnN0YW5jZXMgdG8gbmV3IG93bmVyCiAgICAgICAgY29uc3QgbmZ0QXJyYXkgPSBbXTsKICAgICAgICBjb25zdCB3cmFwcGVkTmZ0cyA9IHsKICAgICAgICAgIHN5bWJvbCwKICAgICAgICAgIGlkczogc29sZE5mdHMsCiAgICAgICAgfTsKICAgICAgICBuZnRBcnJheS5wdXNoKHdyYXBwZWROZnRzKTsKICAgICAgICBhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoJ25mdCcsICd0cmFuc2ZlcicsIHsKICAgICAgICAgIGZyb21UeXBlOiAnY29udHJhY3QnLAogICAgICAgICAgdG86IGFwaS5zZW5kZXIsCiAgICAgICAgICB0b1R5cGU6ICd1c2VyJywKICAgICAgICAgIG5mdHM6IG5mdEFycmF5LAogICAgICAgICAgaXNTaWduZWRXaXRoQWN0aXZlS2V5LAogICAgICAgIH0pOwoKICAgICAgICAvLyBkZWxldGUgc29sZCBtYXJrZXQgb3JkZXJzCiAgICAgICAgY29uc3QgZ3JvdXBpbmdNYXAgPSB7fTsKICAgICAgICBjb25zdCBzb2xkU2V0ID0gbmV3IFNldChzb2xkTmZ0cyk7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcmRlcnMubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgICAgIGNvbnN0IG9yZGVyID0gb3JkZXJzW2ldOwogICAgICAgICAgaWYgKHNvbGRTZXQuaGFzKG9yZGVyLm5mdElkKSkgewogICAgICAgICAgICBhd2FpdCBhcGkuZGIucmVtb3ZlKG1hcmtldFRhYmxlTmFtZSwgb3JkZXIpOwoKICAgICAgICAgICAgY29uc3Qga2V5ID0gbWFrZUdyb3VwaW5nS2V5KG9yZGVyLmdyb3VwaW5nLCBuZnQuZ3JvdXBCeSk7CiAgICAgICAgICAgIGNvbnN0IGdyb3VwSW5mbyA9IGtleSBpbiBncm91cGluZ01hcAogICAgICAgICAgICAgID8gZ3JvdXBpbmdNYXBba2V5XQogICAgICAgICAgICAgIDogewogICAgICAgICAgICAgICAgZ3JvdXBpbmc6IG9yZGVyLmdyb3VwaW5nLAogICAgICAgICAgICAgICAgaXNJbkNvbGxlY3Rpb246IGZhbHNlLAogICAgICAgICAgICAgICAgY291bnQ6IDAsCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgZ3JvdXBJbmZvLmNvdW50IC09IDE7CiAgICAgICAgICAgIGdyb3VwaW5nTWFwW2tleV0gPSBncm91cEluZm87CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBhZGQgdGhlIHRyYWRlIHRvIHRoZSBoaXN0b3J5CiAgICAgICAgYXdhaXQgdXBkYXRlVHJhZGVzSGlzdG9yeSgnYnV5JywgYXBpLnNlbmRlciwgJ3UnLCBzZWxsZXJzLCBzeW1ib2wsIHByaWNlU3ltYm9sLCByZXF1aXJlZEJhbGFuY2UsIGZpbmFsTWFya2V0QWNjb3VudCwgZmVlVG90YWwsIHNvbGROZnRzLmxlbmd0aCk7CgogICAgICAgIGFwaS5lbWl0KCdoaXRTZWxsT3JkZXInLCB7CiAgICAgICAgICBzeW1ib2wsCiAgICAgICAgICBwcmljZVN5bWJvbCwKICAgICAgICAgIGFjY291bnQ6IGFwaS5zZW5kZXIsCiAgICAgICAgICBvd25lZEJ5OiAndScsCiAgICAgICAgICBzZWxsZXJzLAogICAgICAgICAgcGF5bWVudFRvdGFsLAogICAgICAgICAgZmVlVG90YWwsCiAgICAgICAgfSk7CgogICAgICAgIC8vIHVwZGF0ZSBvcGVuIGludGVyZXN0IG1ldHJpY3MKICAgICAgICBhd2FpdCB1cGRhdGVPcGVuSW50ZXJlc3QoJ3NlbGwnLCBzeW1ib2wsIHByaWNlU3ltYm9sLCBncm91cGluZ01hcCwgbmZ0Lmdyb3VwQnkpOwogICAgICB9CiAgICB9CiAgfQp9OwoKYWN0aW9ucy5zZWxsID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBjb25zdCB7CiAgICBzeW1ib2wsCiAgICBuZnRzLAogICAgcHJpY2UsCiAgICBwcmljZVN5bWJvbCwKICAgIGZlZSwKICAgIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICB9ID0gcGF5bG9hZDsKCiAgaWYgKCFhcGkuYXNzZXJ0KHN5bWJvbCAmJiB0eXBlb2Ygc3ltYm9sID09PSAnc3RyaW5nJywgJ2ludmFsaWQgcGFyYW1zJykpIHsKICAgIHJldHVybjsKICB9CgogIGNvbnN0IG1hcmtldFRhYmxlTmFtZSA9IHN5bWJvbCArICdzZWxsQm9vayc7CiAgY29uc3QgaW5zdGFuY2VUYWJsZU5hbWUgPSBzeW1ib2wgKyAnaW5zdGFuY2VzJzsKICBjb25zdCB0YWJsZUV4aXN0cyA9IGF3YWl0IGFwaS5kYi50YWJsZUV4aXN0cyhtYXJrZXRUYWJsZU5hbWUpOwoKICBpZiAoYXBpLmFzc2VydChpc1NpZ25lZFdpdGhBY3RpdmVLZXkgPT09IHRydWUsICd5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXknKQogICAgJiYgYXBpLmFzc2VydChuZnRzICYmIHR5cGVvZiBuZnRzID09PSAnb2JqZWN0JyAmJiBBcnJheS5pc0FycmF5KG5mdHMpCiAgICAmJiBwcmljZVN5bWJvbCAmJiB0eXBlb2YgcHJpY2VTeW1ib2wgPT09ICdzdHJpbmcnCiAgICAmJiBwcmljZSAmJiB0eXBlb2YgcHJpY2UgPT09ICdzdHJpbmcnICYmICFhcGkuQmlnTnVtYmVyKHByaWNlKS5pc05hTigpCiAgICAmJiBmZWUgJiYgdHlwZW9mIGZlZSA9PT0gJ251bWJlcicgJiYgZmVlID49IDAgJiYgZmVlIDw9IDEwMDAwICYmIE51bWJlci5pc0ludGVnZXIoZmVlKSwgJ2ludmFsaWQgcGFyYW1zJykKICAgICYmIGFwaS5hc3NlcnQobmZ0cy5sZW5ndGggPD0gTUFYX05VTV9VTklUU19PUEVSQUJMRSwgYGNhbm5vdCBzZWxsIG1vcmUgdGhhbiAke01BWF9OVU1fVU5JVFNfT1BFUkFCTEV9IE5GVCBpbnN0YW5jZXMgYXQgb25jZWApCiAgICAmJiBhcGkuYXNzZXJ0KHRhYmxlRXhpc3RzLCAnbWFya2V0IG5vdCBlbmFibGVkIGZvciBzeW1ib2wnKSkgewogICAgY29uc3QgbmZ0ID0gYXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCduZnQnLCAnbmZ0cycsIHsgc3ltYm9sIH0pOwogICAgaWYgKCFhcGkuYXNzZXJ0KG5mdCAmJiBuZnQuZ3JvdXBCeSAmJiBuZnQuZ3JvdXBCeS5sZW5ndGggPiAwLCAnbWFya2V0IGdyb3VwaW5nIG5vdCBzZXQnKSkgewogICAgICByZXR1cm47CiAgICB9CgogICAgLy8gZ2V0IHRoZSBwcmljZSB0b2tlbiBwYXJhbXMKICAgIGNvbnN0IHRva2VuID0gYXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCd0b2tlbnMnLCAndG9rZW5zJywgeyBzeW1ib2w6IHByaWNlU3ltYm9sIH0pOwogICAgaWYgKGFwaS5hc3NlcnQodG9rZW4KICAgICAgJiYgYXBpLkJpZ051bWJlcihwcmljZSkuZ3QoMCkKICAgICAgJiYgY291bnREZWNpbWFscyhwcmljZSkgPD0gdG9rZW4ucHJlY2lzaW9uLCAnaW52YWxpZCBwcmljZScpKSB7CiAgICAgIC8vIGxvY2sgdGhlIE5GVHMgdG8gc2VsbCBieSBtb3ZpbmcgdGhlbSB0byB0aGlzIGNvbnRyYWN0IGZvciBzYWZla2VlcGluZwogICAgICBjb25zdCBuZnRBcnJheSA9IFtdOwogICAgICBjb25zdCB3cmFwcGVkTmZ0cyA9IHsKICAgICAgICBzeW1ib2wsCiAgICAgICAgaWRzOiBuZnRzLAogICAgICB9OwogICAgICBuZnRBcnJheS5wdXNoKHdyYXBwZWROZnRzKTsKICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCduZnQnLCAndHJhbnNmZXInLCB7CiAgICAgICAgZnJvbVR5cGU6ICd1c2VyJywKICAgICAgICB0bzogQ09OVFJBQ1RfTkFNRSwKICAgICAgICB0b1R5cGU6ICdjb250cmFjdCcsCiAgICAgICAgbmZ0czogbmZ0QXJyYXksCiAgICAgICAgaXNTaWduZWRXaXRoQWN0aXZlS2V5LAogICAgICB9KTsKCiAgICAgIC8vIGl0J3MgcG9zc2libGUgdGhhdCBzb21lIHRyYW5zZmVycyBjb3VsZCBoYXZlIGZhaWxlZCBkdWUgdG8gdmFsaWRhdGlvbgogICAgICAvLyBlcnJvcnMgJiB3aGF0bm90LCBzbyB3ZSBuZWVkIHRvIGxvb3Agb3ZlciB0aGUgdHJhbnNmZXIgcmVzdWx0cyBhbmQKICAgICAgLy8gb25seSBjcmVhdGUgbWFya2V0IG9yZGVycyBmb3IgdGhlIHRyYW5zZmVycyB0aGF0IHN1Y2NlZWRlZAogICAgICBpZiAocmVzLmV2ZW50cykgewogICAgICAgIGNvbnN0IGJsb2NrRGF0ZSA9IG5ldyBEYXRlKGAke2FwaS5zdGVlbUJsb2NrVGltZXN0YW1wfS4wMDBaYCk7CiAgICAgICAgY29uc3QgdGltZXN0YW1wID0gYmxvY2tEYXRlLmdldFRpbWUoKTsKICAgICAgICBjb25zdCBmaW5hbFByaWNlID0gYXBpLkJpZ051bWJlcihwcmljZSkudG9GaXhlZCh0b2tlbi5wcmVjaXNpb24pOwogICAgICAgIGNvbnN0IG5mdEludGVnZXJJZExpc3QgPSBbXTsKICAgICAgICBjb25zdCBvcmRlckRhdGFNYXAgPSB7fTsKCiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXMuZXZlbnRzLmxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgICBjb25zdCBldiA9IHJlcy5ldmVudHNbaV07CiAgICAgICAgICBpZiAoZXYuY29udHJhY3QgJiYgZXYuZXZlbnQgJiYgZXYuZGF0YQogICAgICAgICAgICAmJiBldi5jb250cmFjdCA9PT0gJ25mdCcKICAgICAgICAgICAgJiYgZXYuZXZlbnQgPT09ICd0cmFuc2ZlcicKICAgICAgICAgICAgJiYgZXYuZGF0YS5mcm9tID09PSBhcGkuc2VuZGVyCiAgICAgICAgICAgICYmIGV2LmRhdGEuZnJvbVR5cGUgPT09ICd1JwogICAgICAgICAgICAmJiBldi5kYXRhLnRvID09PSBDT05UUkFDVF9OQU1FCiAgICAgICAgICAgICYmIGV2LmRhdGEudG9UeXBlID09PSAnYycKICAgICAgICAgICAgJiYgZXYuZGF0YS5zeW1ib2wgPT09IHN5bWJvbCkgewogICAgICAgICAgICAvLyB0cmFuc2ZlciBpcyB2ZXJpZmllZCwgbm93IHdlIGNhbiBhZGQgYSBtYXJrZXQgb3JkZXIKICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VJZCA9IGV2LmRhdGEuaWQ7CgogICAgICAgICAgICBjb25zdCBvcmRlckRhdGEgPSB7CiAgICAgICAgICAgICAgbmZ0SWQ6IGluc3RhbmNlSWQsCiAgICAgICAgICAgICAgZ3JvdXBpbmc6IHt9LAogICAgICAgICAgICAgIGdyb3VwaW5nS2V5OiAnJywKICAgICAgICAgICAgfTsKICAgICAgICAgICAgY29uc3QgaW50ZWdlcklkID0gYXBpLkJpZ051bWJlcihpbnN0YW5jZUlkKS50b051bWJlcigpOwogICAgICAgICAgICBuZnRJbnRlZ2VySWRMaXN0LnB1c2goaW50ZWdlcklkKTsKICAgICAgICAgICAgb3JkZXJEYXRhTWFwW2ludGVnZXJJZF0gPSBvcmRlckRhdGE7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBxdWVyeSBORlQgaW5zdGFuY2VzIHRvIGNvbnN0cnVjdCB0aGUgZ3JvdXBpbmcKICAgICAgICBjb25zdCBpbnN0YW5jZXMgPSBhd2FpdCBhcGkuZGIuZmluZEluVGFibGUoCiAgICAgICAgICAnbmZ0JywKICAgICAgICAgIGluc3RhbmNlVGFibGVOYW1lLAogICAgICAgICAgewogICAgICAgICAgICBfaWQ6IHsKICAgICAgICAgICAgICAkaW46IG5mdEludGVnZXJJZExpc3QsCiAgICAgICAgICAgIH0sCiAgICAgICAgICB9LAogICAgICAgICAgTUFYX05VTV9VTklUU19PUEVSQUJMRSwKICAgICAgICAgIDAsCiAgICAgICAgICBbeyBpbmRleDogJ19pZCcsIGRlc2NlbmRpbmc6IGZhbHNlIH1dLAogICAgICAgICk7CgogICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaW5zdGFuY2VzLmxlbmd0aDsgaiArPSAxKSB7CiAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGluc3RhbmNlc1tqXTsKICAgICAgICAgIGNvbnN0IGdyb3VwaW5nID0ge307CiAgICAgICAgICBsZXQgZ3JvdXBpbmdLZXkgPSAnJzsKICAgICAgICAgIG5mdC5ncm91cEJ5LmZvckVhY2goKG5hbWUpID0+IHsKICAgICAgICAgICAgaWYgKGluc3RhbmNlLnByb3BlcnRpZXNbbmFtZV0gIT09IHVuZGVmaW5lZCAmJiBpbnN0YW5jZS5wcm9wZXJ0aWVzW25hbWVdICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgZ3JvdXBpbmdbbmFtZV0gPSBpbnN0YW5jZS5wcm9wZXJ0aWVzW25hbWVdLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgZ3JvdXBpbmdbbmFtZV0gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBncm91cGluZ0tleSA9IGdyb3VwaW5nS2V5ICsgJzonICsgbmFtZSArICc6JyArIGdyb3VwaW5nW25hbWVdOwogICAgICAgICAgfSk7CiAgICAgICAgICBvcmRlckRhdGFNYXBbaW5zdGFuY2UuX2lkXS5ncm91cGluZyA9IGdyb3VwaW5nOwogICAgICAgICAgb3JkZXJEYXRhTWFwW2luc3RhbmNlLl9pZF0uZ3JvdXBpbmdLZXkgPSBncm91cGluZ0tleTsKICAgICAgICB9CgogICAgICAgIC8vIGNyZWF0ZSB0aGUgb3JkZXJzCiAgICAgICAgY29uc3QgZ3JvdXBpbmdNYXAgPSB7fTsKICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IG5mdEludGVnZXJJZExpc3QubGVuZ3RoOyBrICs9IDEpIHsKICAgICAgICAgIGNvbnN0IGludElkID0gbmZ0SW50ZWdlcklkTGlzdFtrXTsKICAgICAgICAgIGNvbnN0IG9yZGVySW5mbyA9IG9yZGVyRGF0YU1hcFtpbnRJZF07CiAgICAgICAgICBjb25zdCBvcmRlciA9IHsKICAgICAgICAgICAgYWNjb3VudDogYXBpLnNlbmRlciwKICAgICAgICAgICAgb3duZWRCeTogJ3UnLAogICAgICAgICAgICBuZnRJZDogb3JkZXJJbmZvLm5mdElkLAogICAgICAgICAgICBncm91cGluZzogb3JkZXJJbmZvLmdyb3VwaW5nLAogICAgICAgICAgICB0aW1lc3RhbXAsCiAgICAgICAgICAgIHByaWNlOiBmaW5hbFByaWNlLAogICAgICAgICAgICBwcmljZURlYzogeyAkbnVtYmVyRGVjaW1hbDogZmluYWxQcmljZSB9LAogICAgICAgICAgICBwcmljZVN5bWJvbCwKICAgICAgICAgICAgZmVlLAogICAgICAgICAgfTsKCiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhcGkuZGIuaW5zZXJ0KG1hcmtldFRhYmxlTmFtZSwgb3JkZXIpOwoKICAgICAgICAgIGFwaS5lbWl0KCdzZWxsT3JkZXInLCB7CiAgICAgICAgICAgIGFjY291bnQ6IG9yZGVyLmFjY291bnQsCiAgICAgICAgICAgIG93bmVkQnk6IG9yZGVyLm93bmVkQnksCiAgICAgICAgICAgIHN5bWJvbCwKICAgICAgICAgICAgbmZ0SWQ6IG9yZGVyLm5mdElkLAogICAgICAgICAgICB0aW1lc3RhbXAsCiAgICAgICAgICAgIHByaWNlOiBvcmRlci5wcmljZSwKICAgICAgICAgICAgcHJpY2VTeW1ib2w6IG9yZGVyLnByaWNlU3ltYm9sLAogICAgICAgICAgICBmZWUsCiAgICAgICAgICAgIG9yZGVySWQ6IHJlc3VsdC5faWQsCiAgICAgICAgICB9KTsKCiAgICAgICAgICBjb25zdCBncm91cEluZm8gPSBvcmRlckluZm8uZ3JvdXBpbmdLZXkgaW4gZ3JvdXBpbmdNYXAKICAgICAgICAgICAgPyBncm91cGluZ01hcFtvcmRlckluZm8uZ3JvdXBpbmdLZXldCiAgICAgICAgICAgIDogewogICAgICAgICAgICAgIGdyb3VwaW5nOiBvcmRlckluZm8uZ3JvdXBpbmcsCiAgICAgICAgICAgICAgaXNJbkNvbGxlY3Rpb246IGZhbHNlLAogICAgICAgICAgICAgIGNvdW50OiAwLAogICAgICAgICAgICB9OwogICAgICAgICAgZ3JvdXBJbmZvLmNvdW50ICs9IDE7CiAgICAgICAgICBncm91cGluZ01hcFtvcmRlckluZm8uZ3JvdXBpbmdLZXldID0gZ3JvdXBJbmZvOwogICAgICAgIH0KCiAgICAgICAgLy8gdXBkYXRlIG9wZW4gaW50ZXJlc3QgbWV0cmljcwogICAgICAgIGF3YWl0IHVwZGF0ZU9wZW5JbnRlcmVzdCgnc2VsbCcsIHN5bWJvbCwgcHJpY2VTeW1ib2wsIGdyb3VwaW5nTWFwLCBuZnQuZ3JvdXBCeSk7CiAgICAgIH0KICAgIH0KICB9Cn07Cg=="
}
}
}