@next2d/core 2.7.0 → 2.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +11 -11
- package/src/renderer.worker.inline.js +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@next2d/core",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.9.0",
|
|
4
4
|
"description": "Next2D Core Package",
|
|
5
5
|
"author": "Toshiyuki Ienaga<ienaga@next2d.app> (https://github.com/ienaga/)",
|
|
6
6
|
"license": "MIT",
|
|
@@ -24,15 +24,15 @@
|
|
|
24
24
|
"url": "git+https://github.com/Next2D/Player.git"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@next2d/core": "2.
|
|
28
|
-
"@next2d/display": "2.
|
|
29
|
-
"@next2d/events": "2.
|
|
30
|
-
"@next2d/filters": "2.
|
|
31
|
-
"@next2d/geom": "2.
|
|
32
|
-
"@next2d/media": "2.
|
|
33
|
-
"@next2d/net": "2.
|
|
34
|
-
"@next2d/text": "2.
|
|
35
|
-
"@next2d/ui": "2.
|
|
36
|
-
"@next2d/render-queue": "2.
|
|
27
|
+
"@next2d/core": "2.9.0",
|
|
28
|
+
"@next2d/display": "2.9.0",
|
|
29
|
+
"@next2d/events": "2.9.0",
|
|
30
|
+
"@next2d/filters": "2.9.0",
|
|
31
|
+
"@next2d/geom": "2.9.0",
|
|
32
|
+
"@next2d/media": "2.9.0",
|
|
33
|
+
"@next2d/net": "2.9.0",
|
|
34
|
+
"@next2d/text": "2.9.0",
|
|
35
|
+
"@next2d/ui": "2.9.0",
|
|
36
|
+
"@next2d/render-queue": "2.9.0"
|
|
37
37
|
}
|
|
38
38
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export const workerInlineUrl = 'data:application/javascript;base64,dmFyIFJlbmRlcmVyV29ya2VyPWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2xldCBlPTIwNDg7bGV0IHQ9NDtsZXQgbjtsZXQgcjtjb25zdCBhPShlLHQsbixyPW51bGwpPT57Y29uc3QgYT0rZTtyZXR1cm4gaXNOYU4oYSkmJm51bGwhPT1yP3I6TWF0aC5taW4oTWF0aC5tYXgodCxpc05hTihhKT8wOmEpLG4pfSxvPVtdLHM9KC4uLmUpPT57Y29uc3QgdD1vLnBvcCgpfHxbXTtyZXR1cm4gZS5sZW5ndGgmJnQucHVzaCguLi5lKSx0fSxpPShlPW51bGwpPT57ZSYmKGUubGVuZ3RoJiYoZS5sZW5ndGg9MCksby5wdXNoKGUpKX0sYz1lPT4oZS0tLGV8PWU+PjEsZXw9ZT4+MixlfD1lPj40LGV8PWU+PjgsZXw9ZT4+MTYsKytlKSxsPVtdLHU9KGU9MCx0PTAsbj0wLHI9MCk9Pntjb25zdCBhPWwucG9wKCl8fG5ldyBGbG9hdDMyQXJyYXkoNCk7cmV0dXJuIGFbMF09ZSxhWzFdPXQsYVsyXT1uLGFbM109cixhfSxoPWU9PntsLnB1c2goZSl9LGI9W10sZD0oZT0wLHQ9MCxuPTAscj0wLGE9MCxvPTAscz0wLGk9MCxjPTApPT57Y29uc3QgbD1iLnBvcCgpfHxuZXcgRmxvYXQzMkFycmF5KDkpO3JldHVybiBsWzBdPWUsbFsxXT10LGxbMl09bixsWzNdPXIsbFs0XT1hLGxbNV09byxsWzZdPXMsbFs3XT1pLGxbOF09YyxsfSxmPVtdLG09KGU9MCx0PTAsbj0wLHI9MCxhPTAsbz0wKT0+e2NvbnN0IHM9Zi5wb3AoKXx8bmV3IEZsb2F0MzJBcnJheSg2KTtyZXR1cm4gc1swXT1lLHNbMV09dCxzWzJdPW4sc1szXT1yLHNbNF09YSxzWzVdPW8sc30sdj1lPT57Zi5wdXNoKGUpfSxfPWU9Pntjb25zdCB0PTEvKGVbMF0qZVs0XS1lWzNdKmVbMV0pLG49ZVszXSplWzddLWVbNF0qZVs2XSxyPWVbMV0qZVs2XS1lWzBdKmVbN107cmV0dXJuIGQoZVs0XSp0LDAtZVsxXSp0LDAsMC1lWzNdKnQsZVswXSp0LDAsbip0LHIqdCwxKX07bGV0IHA9MCxnPTA7Y29uc3QgeD0oKT0+cCxFPSgpPT5nO2xldCBBPTE7Y29uc3QgeT0oKT0+QSxUPXMoKSxSPXMoKSxNPShlPSExKT0+e2NvbnN0IHQ9ZT80OjEwO3JldHVybiBULmxlbmd0aDx0JiYoVC5sZW5ndGg9MCksVC5sZW5ndGgmJihSLnB1c2goVC5zbGljZSgwKSksVC5sZW5ndGg9MCksUn0sdz0oZSx0LG4pPT57VC5wdXNoKGUsdCxuKX0sRj0oZSx0KT0+e2NvbnN0IG49VC5sZW5ndGgscj0rVFtuLTNdLGE9K1Rbbi0yXTtyZXR1cm4gZT09PXImJnQ9PT1hfSwkPShlLHQpPT57VC5sZW5ndGg/RihlLHQpfHwoKChlPSExKT0+e2NvbnN0IHQ9ZT80OjEwO1QubGVuZ3RoPHR8fFIucHVzaChULnNsaWNlKDApKSxULmxlbmd0aD0wfSkoKSx3KGUsdCwhMSkpOncoZSx0LCExKX0sTz0oZSx0LG4scik9PntULmxlbmd0aHx8JCgwLDApLEYobixyKXx8KHcoZSx0LCEwKSx3KG4sciwhMSkpfSxTPW5ldyBGbG9hdDMyQXJyYXkoMzIpLGs9KGUsdCxuLHIsYSxvLHMsaSxjLGwpPT57Y29uc3QgdT0uMTI1KihlKzMqKG4rYSkrcyksaD0uMTI1Kih0KzMqKHIrbykraSksYj0uMTI1KihzK2Etbi1lKSxkPS4xMjUqKGkrby1yLXQpO1NbY109ZSxTW2MrMV09dCxTW2MrMl09LjUqKGUrbiksU1tjKzNdPS41Kih0K3IpLFNbYys0XT11LWIsU1tjKzVdPWgtZCxTW2MrNl09dSxTW2MrN109aCxTW2xdPXUsU1tsKzFdPWgsU1tsKzJdPXUrYixTW2wrM109aCtkLFNbbCs0XT0uNSooYStzKSxTW2wrNV09LjUqKG8raSksU1tsKzZdPXMsU1tsKzddPWl9LEM9KGUsdCxuLHIsYSxvLHMsaSxjKT0+e2NvbnN0IGw9LjEyNSooZSszKihuK2EpK3MpLHU9LjEyNSoodCszKihyK28pK2kpO1NbY109LjI1KmUrLjc1Km4sU1tjKzFdPS4yNSp0Ky43NSpyLFNbYysyXT1sLFNbYyszXT11LFNbYys0XT0uNzUqYSsuMjUqcyxTW2MrNV09Ljc1Km8rLjI1KmksU1tjKzZdPXMsU1tjKzddPWl9LFA9KGUsdCxuLHIsYSxvKT0+e2lmKFQubGVuZ3RofHwkKDAsMCksRihhLG8pKXJldHVybjtjb25zdCBzPVQubGVuZ3RoLGk9KChlLHQsbixyLGEsbyxzLGkpPT4oayhlLHQsbixyLGEsbyxzLGksMCwxNiksayhTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sMCw4KSxrKFNbMTZdLFNbMTddLFNbMThdLFNbMTldLFNbMjBdLFNbMjFdLFNbMjJdLFNbMjNdLDE2LDI0KSxDKFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSwwKSxDKFNbOF0sU1s5XSxTWzEwXSxTWzExXSxTWzEyXSxTWzEzXSxTWzE0XSxTWzE1XSw4KSxDKFNbMTZdLFNbMTddLFNbMThdLFNbMTldLFNbMjBdLFNbMjFdLFNbMjJdLFNbMjNdLDE2KSxDKFNbMjRdLFNbMjVdLFNbMjZdLFNbMjddLFNbMjhdLFNbMjldLFNbMzBdLFNbMzFdLDI0KSxTKSkoK1Rbcy0zXSwrVFtzLTJdLGUsdCxuLHIsYSxvKTtmb3IobGV0IGU9MDszMj5lOylPKGlbZSsrXSxpW2UrK10saVtlKytdLGlbZSsrXSl9LEI9W10sST1lPT57bGV0IHQ9LTEsbj1CLmxlbmd0aDtmb3IoO01hdGguYWJzKG4tdCk+MTspe2NvbnN0IHI9TWF0aC5mbG9vcigobit0KS8yKTtlPD1CW3JdLmFyZWE/bj1yOnQ9cn1yZXR1cm4gbn0sTD1lPT57bi5kZWxldGVUZXh0dXJlKGUucmVzb3VyY2UpfSxVPVtdLE49W107bGV0IEQ7bGV0IGo9bnVsbDtsZXQgWD1udWxsO2xldCB6PW51bGw7Y29uc3QgVj1lPT57ej1lfSxXPSgpPT56O2xldCBHPSExO2NvbnN0IFk9ZT0+e0c9ZX0scT0oKT0+RztsZXQgSz1udWxsLEg9bnVsbCxaPW51bGwsUT1udWxsO2NvbnN0IEo9KCk9PkgsZWU9KGUsdD0hMCk9Pnt2YXIgcjtlLm1zYWE/KChlPT57aWYoQi5pbmRleE9mKGUpPi0xKXJldHVybjtjb25zdCB0PUkoZS5hcmVhKTtlLmRpcnR5PSEwLEIuc3BsaWNlKHQsMCxlKX0pKGUuY29sb3IpLGUuY29sb3I9bnVsbCxlLnN0ZW5jaWw9bnVsbCk6KHQmJkwoZS50ZXh0dXJlKSxlLnRleHR1cmU9bnVsbCxyPWUuc3RlbmNpbCxVLmluZGV4T2Yocik+LTF8fChVLmxlbmd0aD4xMD9uLmRlbGV0ZVJlbmRlcmJ1ZmZlcihyLnJlc291cmNlKTooci5kaXJ0eT0hMCxVLnB1c2gocikpKSxlLnN0ZW5jaWw9bnVsbCksTi5wdXNoKGUpfTtsZXQgdGU9MDtjb25zdCBuZT1lPT57aWYoIUIubGVuZ3RoKXJldHVybigoKT0+e2NvbnN0IGU9e2lkOjAscmVzb3VyY2U6bi5jcmVhdGVSZW5kZXJidWZmZXIoKSx3aWR0aDowLGhlaWdodDowLGFyZWE6MCxkaXJ0eTohMX07cmV0dXJue3Jlc291cmNlOm4uY3JlYXRlUmVuZGVyYnVmZmVyKCksc3RlbmNpbDplLHdpZHRoOjAsaGVpZ2h0OjAsYXJlYTowLGRpcnR5OiExfX0pKCk7Y29uc3QgdD1JKGUpO2lmKHQ8Qi5sZW5ndGgpe2NvbnN0IGU9Qlt0XTtyZXR1cm4gQi5zcGxpY2UodCwxKSxlfWNvbnN0IHI9Qi5zaGlmdCgpO2lmKCFyKXRocm93IG5ldyBFcnJvcigidGhlIGNvbG9yIGJ1ZmZlciBpcyB2b2lkLiIpO3JldHVybiByfTtsZXQgcmU9MDtjb25zdCBhZT0oZSx0KT0+e2lmKCFVLmxlbmd0aClyZXR1cm57aWQ6cmUrKyxyZXNvdXJjZTpuLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLHdpZHRoOjAsaGVpZ2h0OjAsYXJlYTowLGRpcnR5OiExfTtmb3IobGV0IG49MDtuPFUubGVuZ3RoOysrbil7Y29uc3Qgcj1VW25dO2lmKHIud2lkdGg9PT1lJiZyLmhlaWdodD09PXQpcmV0dXJuIFUuc3BsaWNlKG4sMSkscn1yZXR1cm4gVS5zaGlmdCgpfTtsZXQgb2U9MDtjb25zdCBzZT0oZSx0KT0+KHtpZDpvZSsrLHJlc291cmNlOm4uY3JlYXRlVGV4dHVyZSgpLHdpZHRoOmUsaGVpZ2h0OnQsYXJlYTplKnQsc21vb3RoOiExfSk7bGV0IGllPS0xO2NvbnN0IGNlPWU9PntpZT1lfSxsZT1bbnVsbCxudWxsLG51bGxdLHVlPShlLHQscj0hMSk9Pntjb25zdCBhPXNlKGUsdCk7cmV0dXJuKChlLHQ9ITEpPT57aWUhPT1uLlRFWFRVUkUwJiYoY2Uobi5URVhUVVJFMCksbi5hY3RpdmVUZXh0dXJlKG4uVEVYVFVSRTApKSxsZVswXT1lLG4uYmluZFRleHR1cmUobi5URVhUVVJFXzJELGUucmVzb3VyY2UpLG4udGV4UGFyYW1ldGVyaShuLlRFWFRVUkVfMkQsbi5URVhUVVJFX1dSQVBfUyxuLkNMQU1QX1RPX0VER0UpLG4udGV4UGFyYW1ldGVyaShuLlRFWFRVUkVfMkQsbi5URVhUVVJFX1dSQVBfVCxuLkNMQU1QX1RPX0VER0UpLG4udGV4UGFyYW1ldGVyaShuLlRFWFRVUkVfMkQsbi5URVhUVVJFX01JTl9GSUxURVIsdD9uLkxJTkVBUjpuLk5FQVJFU1QpLG4udGV4UGFyYW1ldGVyaShuLlRFWFRVUkVfMkQsbi5URVhUVVJFX01BR19GSUxURVIsdD9uLkxJTkVBUjpuLk5FQVJFU1QpLG4udGV4U3RvcmFnZTJEKG4uVEVYVFVSRV8yRCwxLG4uUkdCQTgsZS53aWR0aCxlLmhlaWdodCl9KShhLHIpLGF9LGhlPShlLHIsYT0hMSk9Pntjb25zdCBvPU4ubGVuZ3RoP04uc2hpZnQoKTp7aWQ6dGUrKyx3aWR0aDowLGhlaWdodDowLGNsaXBMZXZlbDowLG1zYWE6ITEsbWFzazohMSxjb2xvcjpudWxsLHRleHR1cmU6bnVsbCxzdGVuY2lsOm51bGx9O3JldHVybiBvLndpZHRoPWUsby5oZWlnaHQ9cixhPyhvLm1zYWE9ITAsby50ZXh0dXJlPW51bGwsby5jb2xvcj0oKGUscik9PntlPU1hdGgubWF4KDI1NixjKGUpKSxyPU1hdGgubWF4KDI1NixjKHIpKTtjb25zdCBhPW5lKGUqcik7cmV0dXJuKGEud2lkdGg8ZXx8YS5oZWlnaHQ8cikmJihlPU1hdGgubWF4KGUsYS53aWR0aCkscj1NYXRoLm1heChyLGEuaGVpZ2h0KSxhLndpZHRoPWUsYS5oZWlnaHQ9cixhLmFyZWE9ZSpyLG4uYmluZFJlbmRlcmJ1ZmZlcihuLlJFTkRFUkJVRkZFUixhLnJlc291cmNlKSxuLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZShuLlJFTkRFUkJVRkZFUix0LG4uUkdCQTgsZSxyKSxuLmJpbmRSZW5kZXJidWZmZXIobi5SRU5ERVJCVUZGRVIsYS5zdGVuY2lsLnJlc291cmNlKSxuLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZShuLlJFTkRFUkJVRkZFUix0LG4uU1RFTkNJTF9JTkRFWDgsZSxyKSksYS5kaXJ0eT0hMCxhfSkoZSxyKSxvLnN0ZW5jaWw9by5jb2xvci5zdGVuY2lsKTooby5tc2FhPSExLG8udGV4dHVyZT11ZShlLHIpLG8uY29sb3I9bnVsbCxvLnN0ZW5jaWw9KChlLHQpPT57Y29uc3Qgcj1hZShlLHQpO3JldHVybiByLndpZHRoPT09ZSYmci5oZWlnaHQ9PT10fHwoci53aWR0aD1lLHIuaGVpZ2h0PXQsci5hcmVhPWUqdCxyLmRpcnR5PSExLG4uYmluZFJlbmRlcmJ1ZmZlcihuLlJFTkRFUkJVRkZFUixyLnJlc291cmNlKSxuLnJlbmRlcmJ1ZmZlclN0b3JhZ2Uobi5SRU5ERVJCVUZGRVIsbi5TVEVOQ0lMX0lOREVYOCxlLHQpKSxyfSkoZSxyKSksby5tYXNrPSExLG8uY2xpcExldmVsPTAsb307bGV0IGJlPTA7Y29uc3QgZGU9ZT0+e2JlPWV9LGZlPSgpPT5iZSxtZT1bXSx2ZT0oKT0+e3ZhciB0O3JldHVybiBiZSBpbiBtZXx8KHQ9aGUoZSxlLCEwKSxtZVtiZV09dCksbWVbYmVdfSxfZT1bXTtsZXQgcGU9bnVsbDtjb25zdCBnZT0oKT0+KHBlfHwocGU9KCgpPT57Y29uc3QgdD1zZShlLGUpO3JldHVybiBuLmFjdGl2ZVRleHR1cmUobi5URVhUVVJFMyksbi5iaW5kVGV4dHVyZShuLlRFWFRVUkVfMkQsdC5yZXNvdXJjZSksbi50ZXhQYXJhbWV0ZXJpKG4uVEVYVFVSRV8yRCxuLlRFWFRVUkVfV1JBUF9TLG4uQ0xBTVBfVE9fRURHRSksbi50ZXhQYXJhbWV0ZXJpKG4uVEVYVFVSRV8yRCxuLlRFWFRVUkVfV1JBUF9ULG4uQ0xBTVBfVE9fRURHRSksbi50ZXhQYXJhbWV0ZXJpKG4uVEVYVFVSRV8yRCxuLlRFWFRVUkVfTUlOX0ZJTFRFUixuLkxJTkVBUiksbi50ZXhQYXJhbWV0ZXJpKG4uVEVYVFVSRV8yRCxuLlRFWFRVUkVfTUFHX0ZJTFRFUixuLk5FQVJFU1QpLG4udGV4U3RvcmFnZTJEKG4uVEVYVFVSRV8yRCwxLG4uUkdCQTgsdC53aWR0aCx0LmhlaWdodCksbi5hY3RpdmVUZXh0dXJlKC0xIT09aWU/aWU6bi5URVhUVVJFMCksdH0pKCkpLHBlKSx4ZT1bXSxFZT1lPT4oZSBpbiB4ZXx8KHhlW2VdPW5ldyBGbG9hdDMyQXJyYXkoW051bWJlci5NQVhfVkFMVUUsTnVtYmVyLk1BWF9WQUxVRSwtTnVtYmVyLk1BWF9WQUxVRSwtTnVtYmVyLk1BWF9WQUxVRV0pKSx4ZVtlXSksQWU9W10seWU9ZT0+KGUgaW4gQWV8fChBZVtlXT1uZXcgRmxvYXQzMkFycmF5KFtOdW1iZXIuTUFYX1ZBTFVFLE51bWJlci5NQVhfVkFMVUUsLU51bWJlci5NQVhfVkFMVUUsLU51bWJlci5NQVhfVkFMVUVdKSksQWVbZV0pO2xldCBUZT0wO2NvbnN0IFJlPWU9PntUZT1lfSxNZT0oKT0+VGUsd2U9KCk9PntfZS5sZW5ndGg9MCxkZSgwKTtjb25zdCBlPW1lO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKWVlKGVbdF0pO2UubGVuZ3RoPTB9LEZlPShlLHQscixhPSEwKT0+e2lmKGUuY2xlYXJBcnJheXNJbnN0YW5jZWQoKSxlLiRzdGFja0F0dGFjaG1lbnRPYmplY3QubGVuZ3RoKWZvcihsZXQgdD0wO3Q8ZS4kc3RhY2tBdHRhY2htZW50T2JqZWN0Lmxlbmd0aDsrK3Qpe2NvbnN0IG49ZS4kc3RhY2tBdHRhY2htZW50T2JqZWN0W3RdO24mJmVlKG4pfWVsc2UgZS4kbWFpbkF0dGFjaG1lbnRPYmplY3QmJmVlKGUuJG1haW5BdHRhY2htZW50T2JqZWN0KTthJiZ3ZSgpLFYobnVsbCkscSgpJiYoWSghMSksbi5iaW5kRnJhbWVidWZmZXIobi5GUkFNRUJVRkZFUixudWxsKSksZS4kbWFpbkF0dGFjaG1lbnRPYmplY3Q9aGUodCxyLCEwKSxlLmJpbmQoZS4kbWFpbkF0dGFjaG1lbnRPYmplY3QpfSwkZT0oZSx0LHI9bnVsbCxhPSExKT0+ey0xIT09aWUmJnQ9PT1pZXx8KGNlKHQpLG4uYWN0aXZlVGV4dHVyZSh0KSk7Y29uc3Qgbz1sZVtlXTtudWxsIT09byYmbnVsbCE9PXImJm8uaWQ9PT1yLmlkfHxyPT09b3x8KGxlW2VdPXIsbi5iaW5kVGV4dHVyZShuLlRFWFRVUkVfMkQscj9yLnJlc291cmNlOm51bGwpLHImJnIuc21vb3RoIT09YSYmKHIuc21vb3RoPWEsbi50ZXhQYXJhbWV0ZXJpKG4uVEVYVFVSRV8yRCxuLlRFWFRVUkVfTUlOX0ZJTFRFUixhP24uTElORUFSOm4uTkVBUkVTVCksbi50ZXhQYXJhbWV0ZXJpKG4uVEVYVFVSRV8yRCxuLlRFWFRVUkVfTUFHX0ZJTFRFUixhP24uTElORUFSOm4uTkVBUkVTVCkpKX0sT2U9KGUsdD0hMSk9PnskZSgyLG4uVEVYVFVSRTIsbnVsbCksJGUoMSxuLlRFWFRVUkUxLG51bGwpLCRlKDAsbi5URVhUVVJFMCxlLHQpfSxTZT0oKT0+e2NvbnN0IGU9ci5jdXJyZW50QXR0YWNobWVudE9iamVjdDtpZighZSlyZXR1cm47Y29uc3QgdD1lLmNsaXBMZXZlbDtsZXQgYT0wO2ZvcihsZXQgZT0wO2U8dDsrK2UpYXw9KDE8PHQtZSktMTtuLnN0ZW5jaWxNYXNrKDI1NSksbi5zdGVuY2lsRnVuYyhuLkVRVUFMLDI1NSZhLGEpLG4uc3RlbmNpbE9wKG4uS0VFUCxuLktFRVAsbi5LRUVQKSxuLmNvbG9yTWFzayghMCwhMCwhMCwhMCksbi5kaXNhYmxlKG4uU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFKSxuLmRpc2FibGUobi5TQ0lTU09SX1RFU1QpfTtsZXQga2U9ITE7Y29uc3QgQ2U9ZT0+e2tlPWV9LFBlPSgpPT5rZSxCZT1uZXcgTWFwLEllPW5ldyBNYXAsTGU9KGUsdCk9Pntjb25zdCByPVcoKTtpZihyJiZ0LmlkPT09ci5pZClyZXR1cm47dmFyIGEsbzsoZT0+e1YoZSkscSgpfHwoWSghMCksbi5iaW5kRnJhbWVidWZmZXIobi5GUkFNRUJVRkZFUixEKSksZS5tc2FhPyhuLmJpbmRSZW5kZXJidWZmZXIobi5SRU5ERVJCVUZGRVIsZS5jb2xvci5yZXNvdXJjZSksbi5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcihuLkZSQU1FQlVGRkVSLG4uQ09MT1JfQVRUQUNITUVOVDAsbi5SRU5ERVJCVUZGRVIsZS5jb2xvci5yZXNvdXJjZSkpOihPZShlLnRleHR1cmUpLG4uZnJhbWVidWZmZXJUZXh0dXJlMkQobi5GUkFNRUJVRkZFUixuLkNPTE9SX0FUVEFDSE1FTlQwLG4uVEVYVFVSRV8yRCxlLnRleHR1cmUucmVzb3VyY2UsMCkpLG4uYmluZFJlbmRlcmJ1ZmZlcihuLlJFTkRFUkJVRkZFUixlLnN0ZW5jaWwucmVzb3VyY2UpLG4uZnJhbWVidWZmZXJSZW5kZXJidWZmZXIobi5GUkFNRUJVRkZFUixuLlNURU5DSUxfQVRUQUNITUVOVCxuLlJFTkRFUkJVRkZFUixlLnN0ZW5jaWwucmVzb3VyY2UpfSkodCksciYmci53aWR0aD09PXQud2lkdGgmJnIuaGVpZ2h0PT09dC5oZWlnaHR8fChhPXQud2lkdGgsbz10LmhlaWdodCxwPWEsZz1vLG4udmlld3BvcnQoMCwwLHQud2lkdGgsdC5oZWlnaHQpKTtjb25zdCBzPXQubXNhYT90LmNvbG9yOnQuc3RlbmNpbDt2YXIgaTtzLmRpcnR5JiYocy5kaXJ0eT0hMSxlLmNsZWFyUmVjdCgwLDAsdC53aWR0aCx0LmhlaWdodCkpLCEoaT10Lm1hc2spJiZQZSgpPyhDZSghMSksbi5kaXNhYmxlKG4uU1RFTkNJTF9URVNUKSxuLmRpc2FibGUobi5TQ0lTU09SX1RFU1QpKTppJiYhUGUoKSYmKENlKCEwKSxuLmVuYWJsZShuLlNURU5DSUxfVEVTVCksU2UoKSl9LFVlPWU9PntpZighZS4kc3RhY2subGVuZ3RoKXJldHVybjtjb25zdCB0PWUuJHN0YWNrLnBvcCgpO3ZhciBuO2UuJG1hdHJpeFswXT10WzBdLGUuJG1hdHJpeFsxXT10WzFdLGUuJG1hdHJpeFszXT10WzNdLGUuJG1hdHJpeFs0XT10WzRdLGUuJG1hdHJpeFs2XT10WzZdLGUuJG1hdHJpeFs3XT10WzddLG49dCxiLnB1c2gobil9LE5lPShlLHQscixhKT0+e24uZW5hYmxlKG4uU0NJU1NPUl9URVNUKSxuLnNjaXNzb3IoZSx0LHIrMSxhKzEpLG4uY2xlYXIobi5DT0xPUl9CVUZGRVJfQklUfG4uU1RFTkNJTF9CVUZGRVJfQklUKSxuLnNjaXNzb3IoZSx0LHIsYSl9LERlPShlLHQsbixyLGEsbyxzLGksYyxsLHUsaCxiKT0+e2NvbnN0IGQ9ZS5sZW5ndGgtNTtmb3IobGV0IGY9MztmPGQ7Zis9Myl7bGV0IGQ9MTcqbjtlW2YrMl0/KHRbZCsrXT1lW2YtM10sdFtkKytdPWVbZi0yXSx0W2QrK109MCx0W2QrK109MCx0W2QrK109bCx0W2QrK109dSx0W2QrK109aCx0W2QrK109Yix0W2QrK109cix0W2QrK109YSx0W2QrK109MCx0W2QrK109byx0W2QrK109cyx0W2QrK109MCx0W2QrK109aSx0W2QrK109Yyx0W2QrK109MCx0W2QrK109ZVtmXSx0W2QrK109ZVtmKzFdLHRbZCsrXT0uNSx0W2QrK109MCx0W2QrK109bCx0W2QrK109dSx0W2QrK109aCx0W2QrK109Yix0W2QrK109cix0W2QrK109YSx0W2QrK109MCx0W2QrK109byx0W2QrK109cyx0W2QrK109MCx0W2QrK109aSx0W2QrK109Yyx0W2QrK109MCx0W2QrK109ZVtmKzNdLHRbZCsrXT1lW2YrNF0sdFtkKytdPTEsdFtkKytdPTEsdFtkKytdPWwsdFtkKytdPXUsdFtkKytdPWgsdFtkKytdPWIsdFtkKytdPXIsdFtkKytdPWEsdFtkKytdPTAsdFtkKytdPW8sdFtkKytdPXMsdFtkKytdPTAsdFtkKytdPWksdFtkKytdPWMsdFtkKytdPTApOmVbZis1XT8odFtkKytdPWVbMF0sdFtkKytdPWVbMV0sdFtkKytdPS41LHRbZCsrXT0uNSx0W2QrK109bCx0W2QrK109dSx0W2QrK109aCx0W2QrK109Yix0W2QrK109cix0W2QrK109YSx0W2QrK109MCx0W2QrK109byx0W2QrK109cyx0W2QrK109MCx0W2QrK109aSx0W2QrK109Yyx0W2QrK109MCx0W2QrK109ZVtmXSx0W2QrK109ZVtmKzFdLHRbZCsrXT0uNSx0W2QrK109LjUsdFtkKytdPWwsdFtkKytdPXUsdFtkKytdPWgsdFtkKytdPWIsdFtkKytdPXIsdFtkKytdPWEsdFtkKytdPTAsdFtkKytdPW8sdFtkKytdPXMsdFtkKytdPTAsdFtkKytdPWksdFtkKytdPWMsdFtkKytdPTAsdFtkKytdPWVbZis2XSx0W2QrK109ZVtmKzddLHRbZCsrXT0uNSx0W2QrK109LjUsdFtkKytdPWwsdFtkKytdPXUsdFtkKytdPWgsdFtkKytdPWIsdFtkKytdPXIsdFtkKytdPWEsdFtkKytdPTAsdFtkKytdPW8sdFtkKytdPXMsdFtkKytdPTAsdFtkKytdPWksdFtkKytdPWMsdFtkKytdPTApOih0W2QrK109ZVswXSx0W2QrK109ZVsxXSx0W2QrK109LjUsdFtkKytdPS41LHRbZCsrXT1sLHRbZCsrXT11LHRbZCsrXT1oLHRbZCsrXT1iLHRbZCsrXT1yLHRbZCsrXT1hLHRbZCsrXT0wLHRbZCsrXT1vLHRbZCsrXT1zLHRbZCsrXT0wLHRbZCsrXT1pLHRbZCsrXT1jLHRbZCsrXT0wLHRbZCsrXT1lW2ZdLHRbZCsrXT1lW2YrMV0sdFtkKytdPS41LHRbZCsrXT0uNSx0W2QrK109bCx0W2QrK109dSx0W2QrK109aCx0W2QrK109Yix0W2QrK109cix0W2QrK109YSx0W2QrK109MCx0W2QrK109byx0W2QrK109cyx0W2QrK109MCx0W2QrK109aSx0W2QrK109Yyx0W2QrK109MCx0W2QrK109ZVtmKzNdLHRbZCsrXT1lW2YrNF0sdFtkKytdPS41LHRbZCsrXT0uNSx0W2QrK109bCx0W2QrK109dSx0W2QrK109aCx0W2QrK109Yix0W2QrK109cix0W2QrK109YSx0W2QrK109MCx0W2QrK109byx0W2QrK109cyx0W2QrK109MCx0W2QrK109aSx0W2QrK109Yyx0W2QrK109MCksbis9M31yZXR1cm4gbn0samU9KGUsdD0iZmlsbCIpPT57Y29uc3Qgbj0iZmlsbCI9PT10P3IuJGZpbGxTdHlsZTpyLiRzdHJva2VTdHlsZSxhPW5bMF0sbz1uWzFdLHM9blsyXSxpPW5bM10sYz1yLiRtYXRyaXgsbD14KCksdT1FKCksaD1jWzBdL2wsYj1jWzNdL2wsZD1jWzZdL2wsZj1jWzFdL3UsbT1jWzRdL3Usdj1jWzddL3U7bGV0IF89MDtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoOysrdClfKz01MSooZVt0XS5sZW5ndGgvMy0yKTtjb25zdCBwPW5ldyBGbG9hdDMyQXJyYXkoXyk7bGV0IGc9MDtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoOysrdClnPURlKGVbdF0scCxnLGgsZixiLG0sZCx2LGEsbyxzLGkpO3JldHVybntidWZmZXI6cCxpbmRleENvdW50Omd9fTtsZXQgWGU9bmV3IEZsb2F0MzJBcnJheSgxMjgpLHplPTA7Y29uc3QgVmU9ZT0+e2NvbnN0IHQ9ZS5sZW5ndGgremU7aWYodD5YZS5sZW5ndGgpe2NvbnN0IHI9bmV3IEZsb2F0MzJBcnJheSgobj10LG4tLSxufD1uPj4xLG58PW4+PjIsbnw9bj4+NCxufD1uPj44LG58PW4+PjE2LCsrbikpO3Iuc2V0KFhlKSxyLnNldChlLHplKSxYZT1yfWVsc2UgWGUuc2V0KGUsemUpO3ZhciBuO3plKz1lLmxlbmd0aH0sV2U9W10sR2U9W10sWWU9KCk9PntHZS5sZW5ndGg9MCx6ZT0wLFdlLmxlbmd0aD0wfSxxZT1bXSxLZT0oZSx0LG4pPT57Y29uc3Qgcj17eDp0LngtZS54LHk6dC55LWUueX0sYT0oKGUsdCxuKT0+e2NvbnN0IHI9TWF0aC5zcXJ0KGUqZSt0KnQpO3JldHVybnt4Oi10L3Iqbix5OmUvcipufX0pKHIueCxyLnksbiksbz17eDplLngrYS54LHk6ZS55K2EueX0scz17eDp0LngrYS54LHk6dC55K2EueX0saT17eDplLngtYS54LHk6ZS55LWEueX0sYz17eDp0LngtYS54LHk6dC55LWEueX07cmV0dXJuW28ueCxvLnksITEscy54LHMueSwhMSxjLngsYy55LCExLGkueCxpLnksITEsby54LG8ueSwhMV19LEhlPShlLHQsbik9Pih7eDplLngrKHQueC1lLngpKm4seTplLnkrKHQueS1lLnkpKm59KSxaZT0oZSx0LG4scj0uNSk9Pntjb25zdCBhPUhlKGUsdCxyKSxvPUhlKHQsbixyKSxzPUhlKGEsbyxyKTtyZXR1cm5bW2UsYSxzXSxbcyxvLG5dXX0sUWU9KGUsdCxuLHIpPT4oe3g6KDEtZSkqKjIqdC54KzIqKDEtZSkqZSpuLngrZSoqMipyLngseTooMS1lKSoqMip0LnkrMiooMS1lKSplKm4ueStlKioyKnIueX0pLEplPShlLHQsbixyKT0+KHt4OjIqKDEtZSkqKG4ueC10LngpKzIqZSooci54LW4ueCkseToyKigxLWUpKihuLnktdC55KSsyKmUqKHIueS1uLnkpfSksZXQ9ZT0+e2NvbnN0IHQ9TWF0aC5zcXJ0KGUueCplLngrZS55KmUueSk7cmV0dXJuIDA9PT10P3t4OjAseTowfTp7eDplLngvdCx5OmUueS90fX0sdHQ9KGUsdCxuLHIpPT57Y29uc3QgYT1bMCwuNSwxXSxvPVtdO2ZvcihsZXQgcz0wO3M8YS5sZW5ndGg7KytzKXtjb25zdCBpPWFbc10sYz1RZShpLGUsdCxuKSxsPUplKGksZSx0LG4pLHU9ZXQoe3g6LWwueSx5OmwueH0pO28ucHVzaCh7eDpjLngrdS54KnIseTpjLnkrdS55KnJ9KX1yZXR1cm4gb30sbnQ9KGUsdCxuLHIpPT57Y29uc3QgYT0oKGUsdCxuLHI9NCk9PntsZXQgYT1bW2UsdCxuXV07Zm9yKGxldCBlPTA7ZTxyOysrZSl7Y29uc3QgZT1bXTtmb3IobGV0IHQ9MDt0PGEubGVuZ3RoOysrdCl7Y29uc3Qgbj1hW3RdO2lmKCFuKWNvbnRpbnVlO2NvbnN0IHI9WmUoblswXSxuWzFdLG5bMl0sLjUpO2UucHVzaChyWzBdLHJbMV0pfWE9ZX1yZXR1cm4gYX0pKGUsdCxuLDUpLG89W10scz1bXTtmb3IobGV0IGU9MDtlPGEubGVuZ3RoOysrZSl7Y29uc3RbdCxuLGldPWFbZV07by5wdXNoKHR0KHQsbixpLCtyKSkscy5wdXNoKHR0KHQsbixpLC1yKSl9Y29uc3QgaT1vWzBdWzBdLGM9W2kueCxpLnksITFdO2ZvcihsZXQgZT0wO2U8by5sZW5ndGg7KytlKXtjb25zdCB0PW9bZV07Yy5wdXNoKHRbMV0ueCx0WzFdLnksITAsdFsyXS54LHRbMl0ueSwhMSl9Y29uc3QgbD1bLi4uc10ucmV2ZXJzZSgpO2ZvcihsZXQgZT0wO2U8bC5sZW5ndGg7KytlKXtjb25zdFt0LG4scl09bFtlXTtsW2VdPVtyLG4sdF19Y29uc3QgdT1sWzBdWzBdO2MucHVzaCh1LngsdS55LCExKTtmb3IobGV0IGU9MDtlPGwubGVuZ3RoOysrZSl7Y29uc3QgdD1sW2VdO2MucHVzaCh0WzFdLngsdFsxXS55LCEwLHRbMl0ueCx0WzJdLnksITEpfXJldHVybiBjfSxydD0oZSx0LG4scik9Pntjb25zdCBhPVtdO2ZvcihsZXQgbz0wO288ci5sZW5ndGg7bys9Myl7aWYocltvKzJdKWNvbnRpbnVlO2NvbnN0IHM9cltvXSxpPXJbbysxXTtNYXRoLnNxcnQoTWF0aC5wb3cocy1lLDIpK01hdGgucG93KGktdCwyKSk9PT1uJiZhLnB1c2gocyxpKX1yZXR1cm4gYX0sYXQ9bmV3IE9mZnNjcmVlbkNhbnZhcygxLDEpLmdldENvbnRleHQoIjJkIiksb3Q9KGUsdCk9PnthdC5iZWdpblBhdGgoKSxhdC5tb3ZlVG8odFswXSx0WzFdKTtmb3IobGV0IGU9MztlPHQubGVuZ3RoO2UrPTMpdFtlKzJdPyhhdC5xdWFkcmF0aWNDdXJ2ZVRvKHRbZV0sdFtlKzFdLHRbZSszXSx0W2UrNF0pLGUrPTMpOmF0LmxpbmVUbyh0W2VdLHRbZSsxXSk7YXQuY2xvc2VQYXRoKCk7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kz0yKXtjb25zdCBuPWVbdF0scj1lW3QrMV07aWYoIWF0LmlzUG9pbnRJblBhdGgobixyKSlyZXR1cm5bbixyXX1yZXR1cm4gbnVsbH0sc3Q9KGUsdCxuLHIsYT0hMSk9Pntjb25zdCBvPWE/MDpyLmxlbmd0aC0xLHM9YT9yLmxlbmd0aC0xOnIubGVuZ3RoLTIsaT1ydChlLHQsbixyW29dKSxjPXJ0KGUsdCxuLHJbc10pLGw9b3QoaSxyW3NdKTtpZighbClyZXR1cm47Y29uc3QgdT1vdChjLHJbb10pO2lmKCF1KXJldHVybjtjb25zdCBoPU1hdGguYXRhbjIobFsxXS10LGxbMF0tZSk7bGV0IGI9TWF0aC5hdGFuMih1WzFdLXQsdVswXS1lKS1oO2I+TWF0aC5QST9iLT0yKk1hdGguUEk6YjwtTWF0aC5QSSYmKGIrPTIqTWF0aC5QSSk7Y29uc3QgZD1iLzgsZj1bZSx0LCExXTtmb3IobGV0IHI9MDtyPD04O3IrKyl7Y29uc3QgYT1oK3IqZCxvPWUrbipNYXRoLmNvcyhhKSxzPXQrbipNYXRoLnNpbihhKTtmLnB1c2gobyxzLCExKX1yLnNwbGljZSgtMSwwLGYpfSxpdD0oZSx0LG4scixhPSExKT0+e2NvbnN0IG89YT8wOnIubGVuZ3RoLTEscz1hP3IubGVuZ3RoLTE6ci5sZW5ndGgtMixpPXJ0KGUsdCxuLHJbb10pLGM9cnQoZSx0LG4scltzXSk7aWYoaVswXT09PWNbMF0mJmlbMV09PT1jWzFdfHxpWzBdPT09Y1syXSYmaVsxXT09PWNbM10pcmV0dXJuO2NvbnN0IGw9b3QoaSxyW3NdKTtpZighbClyZXR1cm47Y29uc3QgdT1vdChjLHJbb10pO3UmJnIuc3BsaWNlKC0xLDAsW2UsdCwhMSxsWzBdLGxbMV0sITEsdVswXSx1WzFdLCExLGUsdCwhMV0pfSxjdD0oZSx0LG4scixhLG89ITEpPT57Y29uc3Qgcz1vPzA6YS5sZW5ndGgtMSxpPW8/YS5sZW5ndGgtMTphLmxlbmd0aC0yLGM9cnQoZS54LGUueSxyLGFbc10pLGw9cnQoZS54LGUueSxyLGFbaV0pO2lmKGNbMF09PT1sWzBdJiZjWzFdPT09bFsxXXx8Y1swXT09PWxbMl0mJmNbMV09PT1sWzNdKXJldHVybjtjb25zdCB1PW90KGMsYVtpXSk7aWYoIXUpcmV0dXJuO2NvbnN0IGg9b3QobCxhW3NdKTtpZighaClyZXR1cm47Y29uc3QgYj10LngtZS54LGQ9dC55LWUueSxmPU1hdGguaHlwb3QoYixkKSxtPXt4OmIvZix5OmQvZn0sdj1uLngtZS54LF89bi55LWUueSxwPU1hdGguaHlwb3QodixfKSxnPXt4OnYvcCx5Ol8vcH0seD1tLngsRT1tLnksQT1nLngseT1nLnksVD14KnktRSpBOzA9PT1UJiZhLnNwbGljZSgtMSwwLFtlLngsZS55LCExLHVbMF0sdVsxXSwhMSxoWzBdLGhbMV0sITFdKTtjb25zdCBSPSgoaFswXS11WzBdKSp5LShoWzFdLXVbMV0pKkEpL1QsTT11WzBdK1IqeCx3PXVbMV0rUipFO2Euc3BsaWNlKC0xLDAsW2UueCxlLnksITEsdVswXSx1WzFdLCExLE0sdywhMSxlLngsZS55LCExLGhbMF0saFsxXSwhMSxNLHcsITFdKX0sbHQ9KGUsdCk9Pntjb25zdCBuPXt4OmVbMF0seTplWzFdfSxhPXt4OjAseTowfSxvPXt4OjAseTowfSxzPXt4OjAseTowfSxpPVtdO2ZvcihsZXQgYz0zO2M8ZS5sZW5ndGg7Yys9Myl7Y29uc3QgbD1lW2NdLHU9ZVtjKzFdO2lmKGVbYysyXSlhLng9bCxhLnk9dTtlbHNle2lmKG8ueD1sLG8ueT11LGVbYy0xXT9pLnB1c2gobnQobixhLG8sdCkpOmkucHVzaChLZShuLG8sdCkpLGkubGVuZ3RoPjEpc3dpdGNoKHIuam9pbnRzKXtjYXNlIDA6aXQobi54LG4ueSx0LGkpO2JyZWFrO2Nhc2UgMTpzLng9ZVtjLTZdLHMueT1lW2MtNV0sY3QobixvLHMsdCxpKTticmVhaztjYXNlIDI6c3Qobi54LG4ueSx0LGkpfW4ueD1vLngsbi55PW8ueX19aWYoZVswXT09PWVbZS5sZW5ndGgtM10mJmVbMV09PT1lW2UubGVuZ3RoLTJdKXN3aXRjaChyLmpvaW50cyl7Y2FzZSAwOml0KG4ueCxuLnksdCxpLCEwKTticmVhaztjYXNlIDE6bi54PWVbMF0sbi55PWVbMV0sby54PWVbM10sby55PWVbNF0scy54PWVbZS5sZW5ndGgtNl0scy55PWVbZS5sZW5ndGgtNV0sY3QobixvLHMsdCxpLCEwKTticmVhaztjYXNlIDI6c3Qobi54LG4ueSx0LGksITApfWVsc2Ugc3dpdGNoKHIuY2Fwcyl7Y2FzZSAxOigoZSx0LG4pPT57Zm9yKGxldCByPTA7cjwyOysrcil7bGV0IGE9MCxvPTAscz0wLGk9MDswPT09cj8oYT1lWzBdLG89ZVsxXSxzPWVbM10saT1lWzRdKTooYT1lW2UubGVuZ3RoLTNdLG89ZVtlLmxlbmd0aC0yXSxzPWVbZS5sZW5ndGgtNl0saT1lW2UubGVuZ3RoLTVdKTtjb25zdCBjPXMtYSxsPWktbyx1PU1hdGguYXRhbjIobCxjKSxoPXUrTWF0aC5QSS8yLGI9dS1NYXRoLlBJLzIsZD0xNixmPShiLWgpL2QsbT1bXTtmb3IobGV0IGU9MDtlPD1kO2UrKyl7Y29uc3Qgbj1iK2YqZSxyPWErdCpNYXRoLmNvcyhuKSxzPW8rdCpNYXRoLnNpbihuKTttLnB1c2gocixzLCExKX0wPT09cj9uLnVuc2hpZnQobSk6bi5wdXNoKG0pfX0pKGUsdCxpKTticmVhaztjYXNlIDI6KChlLHQsbik9Pntmb3IobGV0IHI9MDtyPDI7KytyKXtsZXQgYT0wLG89MCxzPTAsaT0wOzA9PT1yPyhhPWVbMF0sbz1lWzFdLHM9ZVszXSxpPWVbNF0pOihhPWVbZS5sZW5ndGgtM10sbz1lW2UubGVuZ3RoLTJdLHM9ZVtlLmxlbmd0aC02XSxpPWVbZS5sZW5ndGgtNV0pO2NvbnN0IGM9LShzLWEpLGw9LShpLW8pLHU9TWF0aC5zcXJ0KGMqYytsKmwpO2lmKDA9PT11KWNvbnRpbnVlO2NvbnN0IGg9Yy91LGI9bC91LGQ9YSt0KmgsZj1vK3QqYixtPS1iLHY9W2QrdCpoK3QqbSxmK3QqYit0KmgsITEsZCt0KmgtdCptLGYrdCpiLXQqaCwhMSxkLXQqaC10Km0sZi10KmItdCpoLCExLGQrdCpoK3QqbSxmK3QqYit0KmgsITEsZC10KmgtdCptLGYtdCpiLXQqaCwhMSxkLXQqaCt0Km0sZi10KmIrdCpoLCExXTswPT09cj9uLnVuc2hpZnQodik6bi5wdXNoKHYpfX0pKGUsdCxpKX1yZXR1cm4gaX0sdXQ9ZT0+e2NvbnN0IHQ9ci50aGlja25lc3MvMixuPVtdO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7KytyKXtjb25zdCBhPWx0KGVbcl0sdCk7bi5wdXNoKC4uLmEpfXJldHVybiBqZShuLCJzdHJva2UiKX0saHQ9bmV3IE1hcCxidD0oKT0+e2h0LmNsZWFyKCl9LGR0PSgpPT4oe2lkOiJmdW5jdGlvbiI9PXR5cGVvZiBjcnlwdG8/LnJhbmRvbVVVSUQ/Y3J5cHRvLnJhbmRvbVVVSUQoKToieHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Ii5yZXBsYWNlKC9beHldL2csZT0+e2NvbnN0IHQ9MTYqTWF0aC5yYW5kb20oKXwwO3JldHVybigieCI9PT1lP3Q6MyZ0fDgpLnRvU3RyaW5nKDE2KX0pLHJlc291cmNlOm4uY3JlYXRlVmVydGV4QXJyYXkoKSx2ZXJ0ZXhCdWZmZXI6bi5jcmVhdGVCdWZmZXIoKSx2ZXJ0ZXhMZW5ndGg6MH0pO2xldCBmdDtjb25zdCBtdD1lPT57ZnQmJmZ0LmlkPT09ZS5pZHx8KGZ0PWUsbi5iaW5kVmVydGV4QXJyYXkoZS5yZXNvdXJjZSkpfSx2dD1bXSxfdD1uZXcgRmxvYXQzMkFycmF5KFswLDAsMCwxLDEsMCwxLDFdKTtsZXQgcHQ7bGV0IGd0O2xldCB4dDtjb25zdCBFdD0oKT0+KHh0fHwoeHQ9KCgpPT57Y29uc3QgZT1kdCgpO210KGUpLG4uYmluZEJ1ZmZlcihuLkFSUkFZX0JVRkZFUixlLnZlcnRleEJ1ZmZlcik7Y29uc3QgdD1uZXcgRmxvYXQzMkFycmF5KFswLDAsMSwwLDAsMSwxLDEsMCwxLDEsMF0pO3JldHVybiBuLmJ1ZmZlckRhdGEobi5BUlJBWV9CVUZGRVIsdCxuLlNUQVRJQ19EUkFXKSxuLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDApLG4udmVydGV4QXR0cmliUG9pbnRlcigwLDIsbi5GTE9BVCwhMSwwLDApLGV9KSgpKSx4dCksQXQ9KCk9Pntjb25zdCBlPSgoKT0+e2lmKHZ0Lmxlbmd0aClyZXR1cm4gdnQucG9wKCk7Y29uc3QgZT1kdCgpO3JldHVybiBtdChlKSxuLmJpbmRCdWZmZXIobi5BUlJBWV9CVUZGRVIsZS52ZXJ0ZXhCdWZmZXIpLG4uZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoMCksbi5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSgxKSxuLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDIpLG4uZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoMyksbi5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSg0KSxuLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDUpLG4udmVydGV4QXR0cmliUG9pbnRlcigwLDIsbi5GTE9BVCwhMSw2OCwwKSxuLnZlcnRleEF0dHJpYlBvaW50ZXIoMSwyLG4uRkxPQVQsITEsNjgsOCksbi52ZXJ0ZXhBdHRyaWJQb2ludGVyKDIsNCxuLkZMT0FULCExLDY4LDE2KSxuLnZlcnRleEF0dHJpYlBvaW50ZXIoMywzLG4uRkxPQVQsITEsNjgsMzIpLG4udmVydGV4QXR0cmliUG9pbnRlcig0LDMsbi5GTE9BVCwhMSw2OCw0NCksbi52ZXJ0ZXhBdHRyaWJQb2ludGVyKDUsMyxuLkZMT0FULCExLDY4LDU2KSxlfSkoKTttdChlKTtjb25zdCB0PVhlLHI9emU7cmV0dXJuIG4uYmluZEJ1ZmZlcihuLkFSUkFZX0JVRkZFUixlLnZlcnRleEJ1ZmZlciksZS52ZXJ0ZXhMZW5ndGg8dC5sZW5ndGgmJihlLnZlcnRleExlbmd0aD1jKHQubGVuZ3RoKSxuLmJ1ZmZlckRhdGEobi5BUlJBWV9CVUZGRVIsNCplLnZlcnRleExlbmd0aCxuLkRZTkFNSUNfRFJBVykpLG4uYnVmZmVyU3ViRGF0YShuLkFSUkFZX0JVRkZFUiwwLHQuc3ViYXJyYXkoMCxyKSksZX0seXQ9ZT0+e3Z0LmluZGV4T2YoZSk+LTF8fHZ0LnB1c2goZSl9O2xldCBUdD0wO2xldCBSdD0tMTtjbGFzcyBNdHtjb25zdHJ1Y3RvcihlLHQscj0hMSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIl8kcHJvZ3JhbU9iamVjdCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJfJHVuaWZvcm1NYXAiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSx0aGlzLl8kcHJvZ3JhbU9iamVjdD0oKGUsdCk9Pntjb25zdCByPW4uY3JlYXRlUHJvZ3JhbSgpLGE9bi5jcmVhdGVTaGFkZXIobi5WRVJURVhfU0hBREVSKTtuLnNoYWRlclNvdXJjZShhLGUpLG4uY29tcGlsZVNoYWRlcihhKTtjb25zdCBvPW4uY3JlYXRlU2hhZGVyKG4uRlJBR01FTlRfU0hBREVSKTtyZXR1cm4gbi5zaGFkZXJTb3VyY2Uobyx0KSxuLmNvbXBpbGVTaGFkZXIobyksbi5hdHRhY2hTaGFkZXIocixhKSxuLmF0dGFjaFNoYWRlcihyLG8pLG4ubGlua1Byb2dyYW0ociksbi5kZXRhY2hTaGFkZXIocixhKSxuLmRldGFjaFNoYWRlcihyLG8pLG4uZGVsZXRlU2hhZGVyKGEpLG4uZGVsZXRlU2hhZGVyKG8pLHtpZDpUdCsrLHJlc291cmNlOnJ9fSkoZSx0KSx0aGlzLl8kdW5pZm9ybU1hcD1uZXcgTWFwLCgoZSx0LHI9ITEpPT57Y29uc3QgYT1uLmdldFByb2dyYW1QYXJhbWV0ZXIoZSxuLkFDVElWRV9VTklGT1JNUyk7Zm9yKGxldCBvPTA7bzxhOysrbyl7Y29uc3QgYT1uLmdldEFjdGl2ZVVuaWZvcm0oZSxvKSxzPWEubmFtZS5lbmRzV2l0aCgiWzBdIik/YS5uYW1lLnNsaWNlKDAsLTMpOmEubmFtZSxpPW4uZ2V0VW5pZm9ybUxvY2F0aW9uKGUscyk7aWYoYS50eXBlPT09bi5TQU1QTEVSXzJEJiYxPT09YS5zaXplJiYhciljb250aW51ZTtjb25zdCBjPXt9O3N3aXRjaChhLnR5cGUpe2Nhc2Ugbi5GTE9BVF9WRUM0OmMubWV0aG9kPW4udW5pZm9ybTRmdi5iaW5kKG4saSksYy5hcnJheT1uZXcgRmxvYXQzMkFycmF5KDQqYS5zaXplKSxjLmFzc2lnbj0tMTticmVhaztjYXNlIG4uSU5UX1ZFQzQ6Yy5tZXRob2Q9bi51bmlmb3JtNGl2LmJpbmQobixpKSxjLmFycmF5PW5ldyBJbnQzMkFycmF5KDQqYS5zaXplKSxjLmFzc2lnbj0tMTticmVhaztjYXNlIG4uU0FNUExFUl8yRDpjLm1ldGhvZD1yP24udW5pZm9ybTFpLmJpbmQobixpLDMpOm4udW5pZm9ybTFpdi5iaW5kKG4saSksYy5hcnJheT1uZXcgSW50MzJBcnJheShhLnNpemUpLGMuYXNzaWduPTE7YnJlYWs7Y2FzZSBuLkZMT0FUOmNhc2Ugbi5GTE9BVF9WRUMyOmNhc2Ugbi5GTE9BVF9WRUMzOmNhc2Ugbi5GTE9BVF9NQVQyOmNhc2Ugbi5GTE9BVF9NQVQzOmNhc2Ugbi5GTE9BVF9NQVQ0OmNhc2Ugbi5JTlQ6Y2FzZSBuLklOVF9WRUMyOmNhc2Ugbi5JTlRfVkVDMzpkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVXNlIGdsLkZMT0FUX1ZFQzQgb3IgZ2wuSU5UX1ZFQzQgaW5zdGVhZCIpfXQuc2V0KHMsYyl9fSkodGhpcy5fJHByb2dyYW1PYmplY3QucmVzb3VyY2UsdGhpcy5fJHVuaWZvcm1NYXAscil9dXNlUHJvZ3JhbSgpe3ZhciBlO2U9dGhpcy5fJHByb2dyYW1PYmplY3QsUnQhPT1lLmlkJiYoUnQ9ZS5pZCxuLnVzZVByb2dyYW0oZS5yZXNvdXJjZSkpfWJpbmRVbmlmb3JtKCl7KGU9Pntmb3IoY29uc3QgdCBvZiBlLnZhbHVlcygpKXZvaWQgMCE9PXQubWV0aG9kJiZ2b2lkIDAhPT10LmFzc2lnbiYmKHQuYXNzaWduPDA/dC5tZXRob2QodC5hcnJheSk6dC5hc3NpZ24+MCYmKHQuYXNzaWduLS0sdC5tZXRob2QodC5hcnJheSkpKX0pKHRoaXMuXyR1bmlmb3JtTWFwKX1nZXQgaGlnaHAoKXtyZXR1cm4gdGhpcy5fJHVuaWZvcm1NYXAuZ2V0KCJ1X2hpZ2hwIikuYXJyYXl9Z2V0IG1lZGl1bXAoKXtyZXR1cm4gdGhpcy5fJHVuaWZvcm1NYXAuZ2V0KCJ1X21lZGl1bXAiKS5hcnJheX1nZXQgdGV4dHVyZXMoKXtyZXR1cm4gdGhpcy5fJHVuaWZvcm1NYXAuZ2V0KCJ1X3RleHR1cmVzIikuYXJyYXl9fWNvbnN0IHd0PW5ldyBNYXAsRnQ9KGUsdCxuLHIpPT57Y29uc3QgYT1uPyJsYXlvdXQgKGxvY2F0aW9uID0gMSkgaW4gdmVjMiBhX2JlemllcjsiOiIiLG89bj8ib3V0IHZlYzIgdl9iZXppZXI7Ijp0PyJvdXQgdmVjMiB2X3V2OyI6IiIscz1uPyJ2X2JlemllciA9IGFfYmV6aWVyOyI6dD8iXG4gICAgbWF0MyB1dl9tYXRyaXggPSBtYXQzKFxuICAgICAgICB1X2hpZ2hwWzBdLnh5eixcbiAgICAgICAgdV9oaWdocFsxXS54eXosXG4gICAgICAgIHVfaGlnaHBbMl0ueHl6XG4gICAgKTtcbiAgICBtYXQzIGludmVyc2VfbWF0cml4ID0gbWF0MyhcbiAgICAgICAgdV9oaWdocFszXS54eXosXG4gICAgICAgIHVfaGlnaHBbNF0ueHl6LFxuICAgICAgICB2ZWMzKHVfaGlnaHBbMl0udywgdV9oaWdocFszXS53LCB1X2hpZ2hwWzRdLncpXG4gICAgKTtcbiAgICB2X3V2ID0gKGludmVyc2VfbWF0cml4ICogdXZfbWF0cml4ICogdmVjMyhhX3ZlcnRleCwgMS4wKSkueHk7IjoiIixpPXI/KGU9PmBcbnZlYzIgYXBwbHlNYXRyaXgoaW4gdmVjMiB2ZXJ0ZXgpIHtcbiAgICBtYXQzIHBhcmVudF9tYXRyaXggPSBtYXQzKFxuICAgICAgICB1X2hpZ2hwWyR7ZX1dLnh5eixcbiAgICAgICAgdV9oaWdocFske2UrMX1dLnh5eixcbiAgICAgICAgdV9oaWdocFske2UrMn1dLnh5elxuICAgICk7XG4gICAgbWF0MyBhbmNlc3Rvcl9tYXRyaXggPSBtYXQzKFxuICAgICAgICB1X2hpZ2hwWyR7ZSszfV0ueHl6LFxuICAgICAgICB1X2hpZ2hwWyR7ZSs0fV0ueHl6LFxuICAgICAgICB1X2hpZ2hwWyR7ZSs1fV0ueHl6XG4gICAgKTtcblxuICAgIHZlYzIgcGFyZW50X29mZnNldCA9IHZlYzIodV9oaWdocFske2UrMn1dLncsIHVfaGlnaHBbJHtlKzN9XS53KTtcbiAgICB2ZWMyIHBhcmVudF9zaXplICAgPSB2ZWMyKHVfaGlnaHBbJHtlKzR9XS53LCB1X2hpZ2hwWyR7ZSs1fV0udyk7XG4gICAgdmVjNCBncmlkX21pbiA9IHVfaGlnaHBbJHtlKzZ9XTtcbiAgICB2ZWM0IGdyaWRfbWF4ID0gdV9oaWdocFske2UrN31dO1xuICAgIFxuICAgIHZlYzIgcG9zaXRpb24gPSAocGFyZW50X21hdHJpeCAqIHZlYzModmVydGV4LCAxLjApKS54eTtcbiAgICBwb3NpdGlvbiA9IChwb3NpdGlvbiAtIHBhcmVudF9vZmZzZXQpIC8gcGFyZW50X3NpemU7XG5cbiAgICB2ZWM0IGdhID0gZ3JpZF9taW47XG4gICAgdmVjNCBnYiA9IGdyaWRfbWF4ICAtIGdyaWRfbWluO1xuICAgIHZlYzQgZ2MgPSB2ZWM0KDEuMCkgLSBncmlkX21heDtcblxuICAgIHZlYzIgcGEgPSBwb3NpdGlvbjtcbiAgICB2ZWMyIHBiID0gcG9zaXRpb24gLSBncmlkX21pbi5zdDtcbiAgICB2ZWMyIHBjID0gcG9zaXRpb24gLSBncmlkX21heC5zdDtcblxuICAgIHBvc2l0aW9uID0gKGdhLnBxIC8gZ2Euc3QpICogbWluKHBhLCBnYS5zdClcbiAgICAgICAgICAgICAgICArIChnYi5wcSAvIGdiLnN0KSAqIGNsYW1wKHBiLCB2ZWMyKDAuMCksIGdiLnN0KVxuICAgICAgICAgICAgICAgICsgKGdjLnBxIC8gZ2Muc3QpICogbWF4KHZlYzIoMC4wKSwgcGMpO1xuXG4gICAgcG9zaXRpb24gPSBwb3NpdGlvbiAqIHBhcmVudF9zaXplICsgcGFyZW50X29mZnNldDtcbiAgICBwb3NpdGlvbiA9IChhbmNlc3Rvcl9tYXRyaXggKiB2ZWMzKHBvc2l0aW9uLCAxLjApKS54eTtcblxuICAgIHBvc2l0aW9uID0gcG9zaXRpb24gKyB2ZWMyKHVfaGlnaHBbJHtlKzh9XS54LCB1X2hpZ2hwWyR7ZSs4fV0ueSk7XG4gICAgcmV0dXJuIHBvc2l0aW9uIC8gdmVjMih1X2hpZ2hwWzBdLncsIHVfaGlnaHBbMV0udyk7XG59YCkodD81OjApOiJcbnZlYzIgYXBwbHlNYXRyaXgoaW4gdmVjMiB2ZXJ0ZXgpIHtcbiAgICBtYXQzIG1hdHJpeCA9IG1hdDMoYV9tYXRyaXgwLCBhX21hdHJpeDEsIGFfbWF0cml4Mik7XG4gICAgcmV0dXJuIChtYXRyaXggKiB2ZWMzKHZlcnRleCwgMS4wKSkueHk7XG59IjtyZXR1cm5gI3ZlcnNpb24gMzAwIGVzXG5cbmxheW91dCAobG9jYXRpb24gPSAwKSBpbiB2ZWMyIGFfdmVydGV4O1xuJHthfVxuJHtuPyIiOiJsYXlvdXQgKGxvY2F0aW9uID0gMikgaW4gdmVjNCBhX2NvbG9yOyJ9XG4ke3I/IiI6ImxheW91dCAobG9jYXRpb24gPSAzKSBpbiB2ZWMzIGFfbWF0cml4MDtcbmxheW91dCAobG9jYXRpb24gPSA0KSBpbiB2ZWMzIGFfbWF0cml4MTtcbmxheW91dCAobG9jYXRpb24gPSA1KSBpbiB2ZWMzIGFfbWF0cml4MjsifVxuXG4ke2U+MT9gdW5pZm9ybSB2ZWM0IHVfaGlnaHBbJHtlfV07YDoiIn1cbiR7b31cbiR7bj8iIjoib3V0IHZlYzQgdl9jb2xvcjsifVxuJHtpfVxuXG52b2lkIG1haW4oKSB7XG4gICAgJHtuPyIiOiJ2X2NvbG9yID0gYV9jb2xvcjsifVxuICAgICR7c31cbiAgICB2ZWMyIHBvcyA9IGFwcGx5TWF0cml4KGFfdmVydGV4KTtcbiAgICBwb3MgPSBwb3MgKiAyLjAgLSAxLjA7XG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvcy54LCAtcG9zLnksIDAuMCwgMS4wKTtcbn1gfSwkdD1lPT57Y29uc3QgdD0ibSIrKGU/InkiOiJuIik7aWYod3QuaGFzKHQpKXJldHVybiB3dC5nZXQodCk7Y29uc3Qgbj1uZXcgTXQoRnQoZT85OjAsITEsITAsZSksIiN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cbmluIHZlYzIgdl9iZXppZXI7XG5vdXQgdmVjNCBvX2NvbG9yO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdmVjMiBweCA9IGRGZHgodl9iZXppZXIpO1xuICAgIHZlYzIgcHkgPSBkRmR5KHZfYmV6aWVyKTtcblxuICAgIHZlYzIgZiA9ICgyLjAgKiB2X2Jlemllci54KSAqIHZlYzIocHgueCwgcHkueCkgLSB2ZWMyKHB4LnksIHB5LnkpO1xuICAgIGZsb2F0IGFscGhhID0gMC41IC0gKHZfYmV6aWVyLnggKiB2X2Jlemllci54IC0gdl9iZXppZXIueSkgLyBsZW5ndGgoZik7XG5cbiAgICBpZiAoYWxwaGEgPiAwLjApIHtcbiAgICAgICAgb19jb2xvciA9IHZlYzQobWluKGFscGhhLCAxLjApKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBkaXNjYXJkO1xuICAgIH0gICAgXG59Iik7cmV0dXJuIHd0LnNldCh0LG4pLG59LE90PShlLHQpPT57Y29uc3Qgbj1lLmhpZ2hwO25bMF09dFswXSxuWzFdPXRbMV0sblsyXT0wLG5bNF09dFsyXSxuWzVdPXRbM10sbls2XT0wLG5bOF09dFs0XSxuWzldPXRbNV0sblsxMF09MSxuWzEyXT10WzZdLG5bMTNdPXRbN10sblsxNF09MCxuWzE2XT10WzhdLG5bMTddPXRbOV0sblsxOF09MCxuWzIwXT10WzEwXSxuWzIxXT10WzExXSxuWzIyXT0xLG5bM109eCgpLG5bN109RSgpLG5bMTFdPXRbMTJdLG5bMTVdPXRbMTNdLG5bMTldPXRbMTRdLG5bMjNdPXRbMTVdLG5bMjRdPXRbMTZdLG5bMjVdPXRbMTddLG5bMjZdPXRbMThdLG5bMjddPXRbMTldLG5bMjhdPXRbMjBdLG5bMjldPXRbMjFdLG5bMzBdPXRbMjJdLG5bMzFdPXRbMjNdLG5bMzJdPXRbMjRdLG5bMzNdPXRbMjVdfTtsZXQgU3Q9Im5vcm1hbCI7Y29uc3Qga3Q9ZT0+e1N0PWV9LEN0PSgpPT5TdDtsZXQgUHQ9NjAwO2NvbnN0IEJ0PWU9PntQdD1lfSxJdD0oKT0+UHQsTHQ9KCk9Pns2MTMhPT1JdCgpJiYoQnQoNjEzKSxuLmJsZW5kRnVuYyhuLk9ORSxuLk9ORV9NSU5VU19TUkNfQUxQSEEpKX0sVXQ9KGUsdCxyLGEpPT57ZS51c2VQcm9ncmFtKCksZS5iaW5kVW5pZm9ybSgpLEx0KCksbXQodCksbi5kcmF3QXJyYXlzKG4uVFJJQU5HTEVTLHIsYSl9LE50PSgpPT57Y29uc3QgZT0icm1ubiI7aWYod3QuaGFzKGUpKXJldHVybiB3dC5nZXQoZSk7Y29uc3QgdD1uZXcgTXQoIiN2ZXJzaW9uIDMwMCBlc1xubGF5b3V0IChsb2NhdGlvbiA9IDApIGluIHZlYzIgYV92ZXJ0ZXg7XG52b2lkIG1haW4oKSB7XG4gICAgdmVjMiBwb3MgPSBhX3ZlcnRleCAqIDIuMCAtIDEuMDtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zLngsIC1wb3MueSwgMC4wLCAxLjApO1xufSIsIiN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5vdXQgdmVjNCBvX2NvbG9yO1xudm9pZCBtYWluKCkge1xuICAgIG9fY29sb3IgPSB2ZWM0KDEuMCk7XG59Iik7cmV0dXJuIHd0LnNldChlLHQpLHR9LER0PSgpPT57Y29uc3QgZT1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0O2lmKCFlKXJldHVybjtjb25zdCB0PTE8PGUuY2xpcExldmVsLTE7bi5zdGVuY2lsTWFzayh+dC0xKSxuLnN0ZW5jaWxGdW5jKG4uTEVRVUFMLHQsMjU1KSxuLnN0ZW5jaWxPcChuLlpFUk8sbi5SRVBMQUNFLG4uUkVQTEFDRSksVXQoTnQoKSxFdCgpLDAsNiksbi5zdGVuY2lsTWFzaygxPDxlLmNsaXBMZXZlbCksbi5zdGVuY2lsRnVuYyhuLkFMV0FZUywwLDI1NSksbi5zdGVuY2lsT3Aobi5SRVBMQUNFLG4uUkVQTEFDRSxuLlJFUExBQ0UpLFV0KE50KCksRXQoKSwwLDYpLG4uc3RlbmNpbE1hc2soMjU1KSxuLnN0ZW5jaWxPcChuLlpFUk8sbi5JTlZFUlQsbi5JTlZFUlQpfTtjbGFzcyBqdHtjb25zdHJ1Y3RvcihlLHQsbixyLGEpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpbmRleCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJ4Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInkiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywidyIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJoIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImxlZnQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywicmlnaHQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywidXNlZCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLHRoaXMuaW5kZXg9ZSx0aGlzLng9dCx0aGlzLnk9bix0aGlzLnc9cix0aGlzLmg9YSx0aGlzLmxlZnQ9bnVsbCx0aGlzLnJpZ2h0PW51bGwsdGhpcy51c2VkPSExfWluc2VydChlLHQpe3JldHVybigoZSx0LG4pPT57aWYoZS51c2VkKXtjb25zdCByPWUubGVmdD8uaW5zZXJ0KHQsbik7cmV0dXJuIHJ8fGUucmlnaHQ/Lmluc2VydCh0LG4pfHxudWxsfWlmKHQ+ZS53fHxuPmUuaClyZXR1cm4gbnVsbDtpZih0PT09ZS53JiZuPT09ZS5oKXJldHVybiBlLnVzZWQ9ITAsZTtjb25zdCByPWUudy10LGE9ZS5oLW47cmV0dXJuIHI+YT8oZS5sZWZ0PWUuY3JlYXRlKGUuaW5kZXgsZS54LGUueSx0LG4pLGUucmlnaHQ9ZS5jcmVhdGUoZS5pbmRleCxlLngrdCsxLGUueSxyLTEsZS5oKSk6KGUubGVmdD1lLmNyZWF0ZShlLmluZGV4LGUueCxlLnksZS53LG4pLGUucmlnaHQ9ZS5jcmVhdGUoZS5pbmRleCxlLngsZS55K24rMSxlLncsYS0xKSksZS51c2VkPSEwLGUubGVmdC5pbnNlcnQodCxuKX0pKHRoaXMsZSx0KX1kaXNwb3NlKGUsdCxuLHIpe3JldHVybigoZSx0LG4scixhKT0+ZS5sZWZ0Py5kaXNwb3NlKHQsbixyLGEpPyhlLmxlZnQudXNlZHx8ZS5yaWdodD8udXNlZHx8KGUubGVmdD1lLnJpZ2h0PW51bGwsZS51c2VkPSExKSwhMCk6ZS5yaWdodD8uZGlzcG9zZSh0LG4scixhKT8oZS5yaWdodC51c2VkfHxlLmxlZnQ/LnVzZWR8fChlLmxlZnQ9ZS5yaWdodD1udWxsLGUudXNlZD0hMSksITApOnQ9PT1lLngmJm49PT1lLnkmJnI9PT1lLncmJmE9PT1lLmgmJihlLnVzZWQ9ITEsITApKSh0aGlzLGUsdCxuLHIpfWNyZWF0ZShlLHQsbixyLGEpe3JldHVybiBuZXcganQoZSx0LG4scixhKX19Y2xhc3MgWHR7Y29uc3RydWN0b3IoZSx0LG4pe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJfJHJvb3QiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSx0aGlzLl8kcm9vdD1uZXcganQoZSwwLDAsdCxuKX1pbnNlcnQoZSx0KXtyZXR1cm4gdGhpcy5fJHJvb3QuaW5zZXJ0KGUsdCl9ZGlzcG9zZShlLHQsbixyKXtyZXR1cm4gdGhpcy5fJHJvb3QuZGlzcG9zZShlLHQsbixyKX19Y29uc3QgenQ9KHQsbik9Pntjb25zdCByPWZlKCk7X2Vbcl18fChfZVtyXT1uZXcgWHQocixlLGUpKTtjb25zdCBhPV9lW3JdLmluc2VydCh0LG4pO3JldHVybiBhfHwoZGUocisxKSx6dCh0LG4pKX0sVnQ9ZT0+YFxuICAgIHZlYzQgbXVsID0gdV9tZWRpdW1wWyR7ZX1dO1xuICAgIHZlYzQgYWRkID0gdV9tZWRpdW1wWyR7ZSsxfV07XG5cbiAgICBpZiAobXVsLnggIT0gMS4wIHx8IG11bC55ICE9IDEuMCB8fCBtdWwueiAhPSAxLjAgfHwgbXVsLncgIT0gMS4wXG4gICAgICAgIHx8IGFkZC54ICE9IDAuMCB8fCBhZGQueSAhPSAwLjAgfHwgYWRkLnogIT0gMC4wXG4gICAgKSB7XG4gICAgICAgIHNyYy5yZ2IgLz0gbWF4KDAuMDAwMSwgc3JjLmEpO1xuICAgICAgICBzcmMgPSBjbGFtcChzcmMgKiBtdWwgKyBhZGQsIDAuMCwgMS4wKTtcbiAgICAgICAgc3JjLnJnYiAqPSBzcmMuYTtcbiAgICB9XG5gLFd0PWU9PmAjdmVyc2lvbiAzMDAgZXNcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXG51bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmU7XG4ke2U/InVuaWZvcm0gdmVjNCB1X21lZGl1bXBbMl07IjoiIn1cblxuaW4gdmVjMiB2X2Nvb3JkO1xub3V0IHZlYzQgb19jb2xvcjtcblxudm9pZCBtYWluKCkge1xuICAgIHZlYzQgc3JjID0gdGV4dHVyZSh1X3RleHR1cmUsIHZfY29vcmQpO1xuICAgICR7ZT9WdCgwKToiIn1cbiAgICBvX2NvbG9yID0gc3JjO1xufWA7Y29uc3QgR3Q9bmV3IGNsYXNze2NvbnN0cnVjdG9yKCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImJ1ZmZlciIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJvZmZzZXQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSx0aGlzLmJ1ZmZlcj1uZXcgRmxvYXQzMkFycmF5KDI1NiksdGhpcy5vZmZzZXQ9MH1wdXNoKC4uLmUpe3RoaXMuYnVmZmVyLmxlbmd0aDx0aGlzLm9mZnNldCtlLmxlbmd0aCYmdGhpcy5yZXNpemUoZS5sZW5ndGgpO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWVbdF19c2V0KGUpe3RoaXMuYnVmZmVyLmxlbmd0aDx0aGlzLm9mZnNldCtlLmxlbmd0aCYmdGhpcy5yZXNpemUoZS5sZW5ndGgpLHRoaXMuYnVmZmVyLnNldChlLHRoaXMub2Zmc2V0KSx0aGlzLm9mZnNldCs9ZS5sZW5ndGh9cmVzaXplKGUpe2NvbnN0IHQ9bmV3IEZsb2F0MzJBcnJheSgobj10aGlzLm9mZnNldCtlLG4tLSxufD1uPj4xLG58PW4+PjIsbnw9bj4+NCxufD1uPj44LG58PW4+PjE2LCsrbikpO3ZhciBuO3RoaXMuYnVmZmVyLmxlbmd0aCYmdC5zZXQodGhpcy5idWZmZXIpLHRoaXMuYnVmZmVyPXR9fTtjbGFzcyBZdCBleHRlbmRzIE10e2NvbnN0cnVjdG9yKGUsdCxuPSEwKXtzdXBlcihlLHQsbiksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImNvdW50Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksdGhpcy5jb3VudD0wfWNsZWFyKCl7dGhpcy5jb3VudD1HdC5vZmZzZXQ9MH19Y29uc3QgcXQ9bmV3IE1hcCxLdD0oKT0+e2lmKHF0LmhhcygiaSIpKXJldHVybiBxdC5nZXQoImkiKTtjb25zdCBlPW5ldyBZdCgiI3ZlcnNpb24gMzAwIGVzXG5cbmxheW91dCAobG9jYXRpb24gPSAwKSBpbiB2ZWMyIGFfdmVydGV4O1xubGF5b3V0IChsb2NhdGlvbiA9IDEpIGluIHZlYzQgYV9yZWN0O1xubGF5b3V0IChsb2NhdGlvbiA9IDIpIGluIHZlYzQgYV9zaXplO1xubGF5b3V0IChsb2NhdGlvbiA9IDMpIGluIHZlYzIgYV9vZmZzZXQ7XG5sYXlvdXQgKGxvY2F0aW9uID0gNCkgaW4gdmVjNCBhX21hdHJpeDtcbmxheW91dCAobG9jYXRpb24gPSA1KSBpbiB2ZWM0IGFfbXVsO1xubGF5b3V0IChsb2NhdGlvbiA9IDYpIGluIHZlYzQgYV9hZGQ7XG5cbm91dCB2ZWMyIHZfY29vcmQ7XG5vdXQgdmVjNCB2X211bDtcbm91dCB2ZWM0IHZfYWRkO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdl9jb29yZCA9IGFfdmVydGV4ICogYV9yZWN0Lnp3ICsgYV9yZWN0Lnh5O1xuICAgIHZfbXVsID0gYV9tdWw7XG4gICAgdl9hZGQgPSBhX2FkZDtcblxuICAgIHZlYzIgcG9zaXRpb24gPSB2ZWMyKGFfdmVydGV4LngsIDEuMCAtIGFfdmVydGV4LnkpO1xuICAgIHBvc2l0aW9uID0gcG9zaXRpb24gKiBhX3NpemUueHk7XG5cbiAgICBtYXQzIG1hdHJpeCA9IG1hdDMoXG4gICAgICAgIGFfbWF0cml4LngsIGFfbWF0cml4LnksIDAuMCxcbiAgICAgICAgYV9tYXRyaXgueiwgYV9tYXRyaXgudywgMC4wLFxuICAgICAgICBhX29mZnNldC54LCBhX29mZnNldC55LCAxLjBcbiAgICApO1xuXG4gICAgcG9zaXRpb24gPSAobWF0cml4ICogdmVjMyhwb3NpdGlvbiwgMS4wKSkueHk7XG4gICAgcG9zaXRpb24gLz0gYV9zaXplLnp3O1xuXG4gICAgcG9zaXRpb24gPSBwb3NpdGlvbiAqIDIuMCAtIDEuMDtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24ueCwgLXBvc2l0aW9uLnksIDAuMCwgMS4wKTtcbn0iLCIjdmVyc2lvbiAzMDAgZXNcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXG51bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmU7XG5cbmluIHZlYzQgdl9tdWw7XG5pbiB2ZWM0IHZfYWRkO1xuaW4gdmVjMiB2X2Nvb3JkO1xub3V0IHZlYzQgb19jb2xvcjtcblxudm9pZCBtYWluKCkge1xuICAgIHZlYzQgc3JjID0gdGV4dHVyZSh1X3RleHR1cmUsIHZfY29vcmQpO1xuXG4gICAgaWYgKHZfbXVsLnggIT0gMS4wIHx8IHZfbXVsLnkgIT0gMS4wIHx8IHZfbXVsLnogIT0gMS4wIHx8IHZfbXVsLncgIT0gMS4wXG4gICAgICAgIHx8IHZfYWRkLnggIT0gMC4wIHx8IHZfYWRkLnkgIT0gMC4wIHx8IHZfYWRkLnogIT0gMC4wXG4gICAgKSB7XG4gICAgICAgIHNyYy5yZ2IgLz0gbWF4KDAuMDAwMSwgc3JjLmEpO1xuICAgICAgICBzcmMgPSBjbGFtcChzcmMgKiB2X211bCArIHZfYWRkLCAwLjAsIDEuMCk7XG4gICAgICAgIHNyYy5yZ2IgKj0gc3JjLmE7XG4gICAgfVxuXG4gICAgb19jb2xvciA9IHNyYztcbn0iKTtyZXR1cm4gcXQuc2V0KCJpIixlKSxlfSxIdD0oZSx0KT0+e2NvbnN0IG49YGkke2V9eWA7aWYocXQuaGFzKG4pKXJldHVybiBxdC5nZXQobik7Y29uc3Qgcj1uZXcgTXQoIiN2ZXJzaW9uIDMwMCBlc1xuXG5sYXlvdXQgKGxvY2F0aW9uID0gMCkgaW4gdmVjMiBhX3ZlcnRleDtcblxub3V0IHZlYzIgdl9jb29yZDtcblxudm9pZCBtYWluKCkge1xuICAgIHZfY29vcmQgPSBhX3ZlcnRleDtcblxuICAgIHZlYzIgcG9zaXRpb24gPSBhX3ZlcnRleCAqIDIuMCAtIDEuMDtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuMCwgMS4wKTtcbn0iLChlPT57bGV0IHQ7c3dpdGNoKGUpe2Nhc2Uic3VidHJhY3QiOnQ9IlxudmVjNCBibGVuZCAoaW4gdmVjNCBzcmMsIGluIHZlYzQgZHN0KSB7XG4gICAgaWYgKHNyYy5hID09IDAuMCkgeyByZXR1cm4gZHN0OyB9XG4gICAgaWYgKGRzdC5hID09IDAuMCkgeyByZXR1cm4gc3JjOyB9XG5cbiAgICB2ZWM0IGEgPSBzcmMgLSBzcmMgKiBkc3QuYTtcbiAgICB2ZWM0IGIgPSBkc3QgLSBkc3QgKiBzcmMuYTtcblxuICAgIHNyYy5yZ2IgLz0gc3JjLmE7XG4gICAgZHN0LnJnYiAvPSBkc3QuYTtcblxuICAgIHZlYzQgYyA9IHZlYzQoZHN0LnJnYiAtIHNyYy5yZ2IsIHNyYy5hICogZHN0LmEpO1xuICAgIGMucmdiICo9IGMuYTtcblxuICAgIHJldHVybiBhICsgYiArIGM7XG59IjticmVhaztjYXNlIm11bHRpcGx5Ijp0PSJcbnZlYzQgYmxlbmQgKGluIHZlYzQgc3JjLCBpbiB2ZWM0IGRzdCkge1xuICAgIHZlYzQgYSA9IHNyYyAtIHNyYyAqIGRzdC5hO1xuICAgIHZlYzQgYiA9IGRzdCAtIGRzdCAqIHNyYy5hO1xuICAgIHZlYzQgYyA9IHNyYyAqIGRzdDtcblxuICAgIHJldHVybiBhICsgYiArIGM7XG59IjticmVhaztjYXNlImxpZ2h0ZW4iOnQ9IlxudmVjNCBibGVuZCAoaW4gdmVjNCBzcmMsIGluIHZlYzQgZHN0KSB7XG4gICAgaWYgKHNyYy5hID09IDAuMCkgeyByZXR1cm4gZHN0OyB9XG4gICAgaWYgKGRzdC5hID09IDAuMCkgeyByZXR1cm4gc3JjOyB9XG5cbiAgICB2ZWM0IGEgPSBzcmMgLSBzcmMgKiBkc3QuYTtcbiAgICB2ZWM0IGIgPSBkc3QgLSBkc3QgKiBzcmMuYTtcblxuICAgIHNyYy5yZ2IgLz0gc3JjLmE7XG4gICAgZHN0LnJnYiAvPSBkc3QuYTtcblxuICAgIHZlYzQgYyA9IHZlYzQobWl4KHNyYy5yZ2IsIGRzdC5yZ2IsIHN0ZXAoc3JjLnJnYiwgZHN0LnJnYikpLCBzcmMuYSAqIGRzdC5hKTtcbiAgICBjLnJnYiAqPSBjLmE7XG5cbiAgICByZXR1cm4gYSArIGIgKyBjO1xufSI7YnJlYWs7Y2FzZSJkYXJrZW4iOnQ9IlxudmVjNCBibGVuZCAoaW4gdmVjNCBzcmMsIGluIHZlYzQgZHN0KSB7XG4gICAgaWYgKHNyYy5hID09IDAuMCkgeyByZXR1cm4gZHN0OyB9XG4gICAgaWYgKGRzdC5hID09IDAuMCkgeyByZXR1cm4gc3JjOyB9XG5cbiAgICB2ZWM0IGEgPSBzcmMgLSBzcmMgKiBkc3QuYTtcbiAgICB2ZWM0IGIgPSBkc3QgLSBkc3QgKiBzcmMuYTtcblxuICAgIHNyYy5yZ2IgLz0gc3JjLmE7XG4gICAgZHN0LnJnYiAvPSBkc3QuYTtcblxuICAgIHZlYzQgYyA9IHZlYzQobWl4KHNyYy5yZ2IsIGRzdC5yZ2IsIHN0ZXAoZHN0LnJnYiwgc3JjLnJnYikpLCBzcmMuYSAqIGRzdC5hKTtcbiAgICBjLnJnYiAqPSBjLmE7XG5cbiAgICByZXR1cm4gYSArIGIgKyBjO1xufSI7YnJlYWs7Y2FzZSJvdmVybGF5Ijp0PSJcbnZlYzQgYmxlbmQgKGluIHZlYzQgc3JjLCBpbiB2ZWM0IGRzdCkge1xuICAgIGlmIChzcmMuYSA9PSAwLjApIHsgcmV0dXJuIGRzdDsgfVxuICAgIGlmIChkc3QuYSA9PSAwLjApIHsgcmV0dXJuIHNyYzsgfVxuXG4gICAgdmVjNCBhID0gc3JjIC0gc3JjICogZHN0LmE7XG4gICAgdmVjNCBiID0gZHN0IC0gZHN0ICogc3JjLmE7XG5cbiAgICBzcmMucmdiIC89IHNyYy5hO1xuICAgIGRzdC5yZ2IgLz0gZHN0LmE7XG5cbiAgICB2ZWM0IG11bCA9IHNyYyAqIGRzdDtcbiAgICB2ZWMzIGMxID0gMi4wICogbXVsLnJnYjtcbiAgICB2ZWMzIGMyID0gMi4wICogKHNyYy5yZ2IgKyBkc3QucmdiIC0gbXVsLnJnYikgLSAxLjA7XG4gICAgdmVjNCBjID0gdmVjNChtaXgoYzEsIGMyLCBzdGVwKHZlYzMoMC41KSwgZHN0LnJnYikpLCBtdWwuYSk7XG4gICAgYy5yZ2IgKj0gYy5hO1xuXG4gICAgcmV0dXJuIGEgKyBiICsgYztcbn0iO2JyZWFrO2Nhc2UiaGFyZGxpZ2h0Ijp0PSJcbnZlYzQgYmxlbmQgKGluIHZlYzQgc3JjLCBpbiB2ZWM0IGRzdCkge1xuICAgIGlmIChzcmMuYSA9PSAwLjApIHsgcmV0dXJuIGRzdDsgfVxuICAgIGlmIChkc3QuYSA9PSAwLjApIHsgcmV0dXJuIHNyYzsgfVxuXG4gICAgdmVjNCBhID0gc3JjIC0gc3JjICogZHN0LmE7XG4gICAgdmVjNCBiID0gZHN0IC0gZHN0ICogc3JjLmE7XG5cbiAgICBzcmMucmdiIC89IHNyYy5hO1xuICAgIGRzdC5yZ2IgLz0gZHN0LmE7XG5cbiAgICB2ZWM0IG11bCA9IHNyYyAqIGRzdDtcbiAgICB2ZWMzIGMxID0gMi4wICogbXVsLnJnYjtcbiAgICB2ZWMzIGMyID0gMi4wICogKHNyYy5yZ2IgKyBkc3QucmdiIC0gbXVsLnJnYikgLSAxLjA7XG4gICAgdmVjNCBjID0gdmVjNChtaXgoYzEsIGMyLCBzdGVwKHZlYzMoMC41KSwgc3JjLnJnYikpLCBtdWwuYSk7XG4gICAgYy5yZ2IgKj0gYy5hO1xuXG4gICAgcmV0dXJuIGEgKyBiICsgYztcbn0iO2JyZWFrO2Nhc2UiZGlmZmVyZW5jZSI6dD0iXG52ZWM0IGJsZW5kIChpbiB2ZWM0IHNyYywgaW4gdmVjNCBkc3QpIHtcbiAgICBpZiAoc3JjLmEgPT0gMC4wKSB7IHJldHVybiBkc3Q7IH1cbiAgICBpZiAoZHN0LmEgPT0gMC4wKSB7IHJldHVybiBzcmM7IH1cblxuICAgIHZlYzQgYSA9IHNyYyAtIHNyYyAqIGRzdC5hO1xuICAgIHZlYzQgYiA9IGRzdCAtIGRzdCAqIHNyYy5hO1xuXG4gICAgc3JjLnJnYiAvPSBzcmMuYTtcbiAgICBkc3QucmdiIC89IGRzdC5hO1xuXG4gICAgdmVjNCBjID0gdmVjNChhYnMoc3JjLnJnYiAtIGRzdC5yZ2IpLCBzcmMuYSAqIGRzdC5hKTtcbiAgICBjLnJnYiAqPSBjLmE7XG5cbiAgICByZXR1cm4gYSArIGIgKyBjO1xufSI7YnJlYWs7Y2FzZSJpbnZlcnQiOnQ9IlxudmVjNCBibGVuZCAoaW4gdmVjNCBzcmMsIGluIHZlYzQgZHN0KSB7XG4gICAgaWYgKHNyYy5hID09IDAuMCkgeyByZXR1cm4gZHN0OyB9XG4gICAgaWYgKGRzdC5hID09IDAuMCkgeyByZXR1cm4gc3JjOyB9XG5cbiAgICB2ZWM0IGIgPSBkc3QgLSBkc3QgKiBzcmMuYTtcbiAgICB2ZWM0IGMgPSB2ZWM0KHNyYy5hIC0gZHN0LnJnYiAqIHNyYy5hLCBzcmMuYSk7XG5cbiAgICByZXR1cm4gYiArIGM7XG59IjticmVhaztkZWZhdWx0OnQ9IlxudmVjNCBibGVuZCAoaW4gdmVjNCBzcmMsIGluIHZlYzQgZHN0KSB7XG4gICAgcmV0dXJuIHNyYyArIGRzdCAtIGRzdCAqIHNyYy5hO1xufSJ9cmV0dXJuYCN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cbnVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZXNbMl07XG51bmlmb3JtIHZlYzQgdV9tZWRpdW1wWzJdO1xuXG5pbiB2ZWMyIHZfY29vcmQ7XG5vdXQgdmVjNCBvX2NvbG9yO1xuXG4ke3R9XG5cbnZvaWQgbWFpbigpIHtcbiAgICB2ZWM0IGRzdCA9IHRleHR1cmUodV90ZXh0dXJlc1swXSwgdl9jb29yZCk7XG4gICAgdmVjNCBzcmMgPSB0ZXh0dXJlKHVfdGV4dHVyZXNbMV0sIHZfY29vcmQpO1xuICAgICR7VnQoMCl9XG4gICAgb19jb2xvciA9IGJsZW5kKHNyYywgZHN0KTtcbn1gfSkoZSkpO3JldHVybiBxdC5zZXQobixyKSxyfTtsZXQgWnQ9MDtjb25zdCBRdD0oKT0+e2NvbnN0IGU9ci5jdXJyZW50QXR0YWNobWVudE9iamVjdCx0PXIuYXRsYXNBdHRhY2htZW50T2JqZWN0O2lmKHIuYmluZCh0KSxuLmJpbmRGcmFtZWJ1ZmZlcihuLkRSQVdfRlJBTUVCVUZGRVIsWCksWSghMSksWnQ9PT1mZSgpKXtjb25zdCBlPUVlKGZlKCkpO2VbMl0hPT0tTnVtYmVyLk1BWF9WQUxVRSYmZVszXSE9PS1OdW1iZXIuTUFYX1ZBTFVFJiYobi5lbmFibGUobi5TQ0lTU09SX1RFU1QpLG4uc2Npc3NvcihlWzBdLGVbMV0sZVsyXSxlWzNdKSxuLmJsaXRGcmFtZWJ1ZmZlcigwLDAsdC53aWR0aCx0LmhlaWdodCwwLDAsdC53aWR0aCx0LmhlaWdodCxuLkNPTE9SX0JVRkZFUl9CSVQsbi5ORUFSRVNUKSxuLmRpc2FibGUobi5TQ0lTU09SX1RFU1QpKX1lbHNle2NvbnN0IGU9eWUoZmUoKSk7bi5lbmFibGUobi5TQ0lTU09SX1RFU1QpLG4uc2Npc3NvcihlWzBdLGVbMV0sZVsyXSxlWzNdKSxuLmJsaXRGcmFtZWJ1ZmZlcigwLDAsdC53aWR0aCx0LmhlaWdodCwwLDAsdC53aWR0aCx0LmhlaWdodCxuLkNPTE9SX0JVRkZFUl9CSVQsbi5ORUFSRVNUKSxuLmRpc2FibGUobi5TQ0lTU09SX1RFU1QpLFp0PWZlKCl9ZSYmci5iaW5kKGUpfSxKdD1lPT57Y29uc3QgdD1mZSgpO2RlKGUuaW5kZXgpLFF0KCk7Y29uc3Qgcj1LO24uYmluZEZyYW1lYnVmZmVyKG4uRlJBTUVCVUZGRVIscik7Y29uc3QgYT1nZSgpO24uZnJhbWVidWZmZXJUZXh0dXJlMkQobi5GUkFNRUJVRkZFUixuLkNPTE9SX0FUVEFDSE1FTlQwLG4uVEVYVFVSRV8yRCxhLnJlc291cmNlLDApO2NvbnN0IG89SigpO24uYmluZEZyYW1lYnVmZmVyKG4uRlJBTUVCVUZGRVIsbyk7Y29uc3Qgcz11ZShlLncsZS5oKTtyZXR1cm4gbi5mcmFtZWJ1ZmZlclRleHR1cmUyRChuLkZSQU1FQlVGRkVSLG4uQ09MT1JfQVRUQUNITUVOVDAsbi5URVhUVVJFXzJELHMucmVzb3VyY2UsMCksbi5iaW5kRnJhbWVidWZmZXIobi5GUkFNRUJVRkZFUixudWxsKSxuLmJpbmRGcmFtZWJ1ZmZlcihuLlJFQURfRlJBTUVCVUZGRVIsciksbi5iaW5kRnJhbWVidWZmZXIobi5EUkFXX0ZSQU1FQlVGRkVSLG8pLG4uYmxpdEZyYW1lYnVmZmVyKGUueCxlLnksZS54K2UudyxlLnkrZS5oLDAsMCxlLncsZS5oLG4uQ09MT1JfQlVGRkVSX0JJVCxuLk5FQVJFU1QpLGRlKHQpLG4uYmluZEZyYW1lYnVmZmVyKG4uUkVBRF9GUkFNRUJVRkZFUixEKSxuLmJpbmRGcmFtZWJ1ZmZlcihuLkZSQU1FQlVGRkVSLEQpLHN9LGVuPShlLHQscj0hMSk9PnskZSgyLG4uVEVYVFVSRTIsbnVsbCxyKSwkZSgxLG4uVEVYVFVSRTEsdCxyKSwkZSgwLG4uVEVYVFVSRTAsZSxyKX0sdG49KCk9PntpZihxdC5oYXMoInAiKSlyZXR1cm4gcXQuZ2V0KCJwIik7Y29uc3QgZT1uZXcgTXQoIiN2ZXJzaW9uIDMwMCBlc1xuXG5sYXlvdXQgKGxvY2F0aW9uID0gMCkgaW4gdmVjMiBhX3ZlcnRleDtcbnVuaWZvcm0gdmVjNCB1X2hpZ2hwWzJdO1xuXG5vdXQgdmVjMiB2X2Nvb3JkO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdl9jb29yZCA9IGFfdmVydGV4O1xuXG4gICAgdmVjMiBvZmZzZXQgICA9IHVfaGlnaHBbMF0ueHk7XG4gICAgdmVjMiBzaXplICAgICA9IHVfaGlnaHBbMF0uenc7XG4gICAgdmVjMiB2aWV3cG9ydCA9IHZlYzIodV9oaWdocFsxXS54LCB1X2hpZ2hwWzFdLnkpO1xuXG4gICAgdmVjMiBwb3NpdGlvbiA9IHZlYzIoYV92ZXJ0ZXgueCwgMS4wIC0gYV92ZXJ0ZXgueSk7XG4gICAgcG9zaXRpb24gPSBwb3NpdGlvbiAqIHNpemUgKyBvZmZzZXQ7XG4gICAgcG9zaXRpb24gLz0gdmlld3BvcnQ7XG5cbiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uICogMi4wIC0gMS4wO1xuICAgIGdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbi54LCAtcG9zaXRpb24ueSwgMC4wLCAxLjApO1xufSIsV3QoITEpKTtyZXR1cm4gcXQuc2V0KCJwIixlKSxlfSxubj0oZSx0LG4pPT57Y29uc3QgYT1lLmhpZ2hwLG89ci4kbWF0cml4O2FbMF09b1s2XSxhWzFdPW9bN10sYVsyXT10LGFbM109bixhWzRdPXgoKSxhWzVdPUUoKX0scm49ZT0+e2UudXNlUHJvZ3JhbSgpLGUuYmluZFVuaWZvcm0oKSxtdChFdCgpKSxuLmRyYXdBcnJheXMobi5UUklBTkdMRVMsMCw2KX07bGV0IGFuPW51bGw7Y29uc3Qgb249KGUsdCxhLG8pPT57Y29uc3Qgcz1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LGk9ci4kbWFpbkF0dGFjaG1lbnRPYmplY3Q7ci5iaW5kKGkpO2NvbnN0IGM9SigpO3JldHVybiBuLmJpbmRGcmFtZWJ1ZmZlcihuLkZSQU1FQlVGRkVSLGMpLGFuJiZhbi53aWR0aD09PWkud2lkdGgmJmFuLmhlaWdodD09PWkuaGVpZ2h0fHwoYW49dWUoaS53aWR0aCxpLmhlaWdodCkpLE9lKGFuKSxuLmZyYW1lYnVmZmVyVGV4dHVyZTJEKG4uRlJBTUVCVUZGRVIsbi5DT0xPUl9BVFRBQ0hNRU5UMCxuLlRFWFRVUkVfMkQsYW4ucmVzb3VyY2UsMCksbi5iaW5kRnJhbWVidWZmZXIobi5GUkFNRUJVRkZFUixudWxsKSxuLmJpbmRGcmFtZWJ1ZmZlcihuLlJFQURfRlJBTUVCVUZGRVIsRCksbi5iaW5kRnJhbWVidWZmZXIobi5EUkFXX0ZSQU1FQlVGRkVSLGMpLG4uZW5hYmxlKG4uU0NJU1NPUl9URVNUKSxuLnNjaXNzb3IoZSxpLmhlaWdodC10LW8sYSsxLG8rMSksbi5ibGl0RnJhbWVidWZmZXIoMCwwLGkud2lkdGgsaS5oZWlnaHQsMCwwLGkud2lkdGgsaS5oZWlnaHQsbi5DT0xPUl9CVUZGRVJfQklULG4uTkVBUkVTVCksbi5kaXNhYmxlKG4uU0NJU1NPUl9URVNUKSxuLmJpbmRGcmFtZWJ1ZmZlcihuLkZSQU1FQlVGRkVSLEQpLHMmJnIuYmluZChzKSxhbn0sc249KGUsdCxuLGEpPT57Y29uc3Qgbz1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LHM9b24oZSx0LG4sYSksaT1oZShuLGEsITEpO3IuYmluZChpKSxyLnNhdmUoKSxyLnNldFRyYW5zZm9ybSgxLDAsMCwxLC1lLC10KTtjb25zdCBjPXRuKCk7bm4oYyxzLndpZHRoLHMuaGVpZ2h0KSxMdCgpLE9lKHMpLHJuKGMpO2NvbnN0IGw9aS50ZXh0dXJlO3JldHVybiByLnJlc3RvcmUoKSxlZShpLCExKSxvJiZyLmJpbmQobyksbH0sY249KCk9Pns2MTAhPT1JdCgpJiYoQnQoNjEwKSxuLmJsZW5kRnVuYyhuLk9ORSxuLlpFUk8pKX0sbG49ZT0+e09lKGUpLGNuKCk7Y29uc3QgdD10bigpO25uKHQsZS53aWR0aCxlLmhlaWdodCkscm4odCksTHQoKX0sdW49KGUsdCxuLHIsYSxvLHMsaSxjKT0+e2NvbnN0IGw9ZS50ZXh0dXJlcztsWzBdPTAsbFsxXT0xO2NvbnN0IHU9ZS5tZWRpdW1wO3VbMF09dCx1WzFdPW4sdVsyXT1yLHVbM109YSx1WzRdPW8sdVs1XT1zLHVbNl09aSx1WzddPWN9LGhuPShlPSExKT0+e2NvbnN0IHQ9Im0iKyhlPyJ5IjoibiIpO2lmKHF0Lmhhcyh0KSlyZXR1cm4gcXQuZ2V0KHQpO2NvbnN0IG49bmV3IE10KCIjdmVyc2lvbiAzMDAgZXNcblxubGF5b3V0IChsb2NhdGlvbiA9IDApIGluIHZlYzIgYV92ZXJ0ZXg7XG51bmlmb3JtIHZlYzQgdV9oaWdocFszXTtcblxub3V0IHZlYzIgdl9jb29yZDtcblxudm9pZCBtYWluKCkge1xuICAgIHZfY29vcmQgPSBhX3ZlcnRleDtcblxuICAgIG1hdDMgbWF0cml4ID0gbWF0MyhcbiAgICAgICAgdV9oaWdocFswXS54LCB1X2hpZ2hwWzBdLnksIDAuMCxcbiAgICAgICAgdV9oaWdocFswXS56LCB1X2hpZ2hwWzBdLncsIDAuMCxcbiAgICAgICAgdV9oaWdocFsxXS54LCB1X2hpZ2hwWzFdLnksIDEuMFxuICAgICk7XG5cbiAgICB2ZWMyIHNpemUgICAgID0gdV9oaWdocFsxXS56dztcbiAgICB2ZWMyIHZpZXdwb3J0ID0gdmVjMih1X2hpZ2hwWzJdLngsIHVfaGlnaHBbMl0ueSk7XG5cbiAgICB2ZWMyIHBvc2l0aW9uID0gdmVjMihhX3ZlcnRleC54LCAxLjAgLSBhX3ZlcnRleC55KTtcbiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uICogc2l6ZTtcbiAgICBwb3NpdGlvbiA9IChtYXRyaXggKiB2ZWMzKHBvc2l0aW9uLCAxLjApKS54eTtcbiAgICBwb3NpdGlvbiAvPSB2aWV3cG9ydDtcblxuICAgIHBvc2l0aW9uID0gcG9zaXRpb24gKiAyLjAgLSAxLjA7XG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLngsIC1wb3NpdGlvbi55LCAwLjAsIDEuMCk7XG59IixXdChlKSk7cmV0dXJuIHF0LnNldCh0LG4pLG59LGJuPShlLHQsbik9Pntjb25zdCBhPWUuaGlnaHAsbz1yLiRtYXRyaXg7YVswXT1vWzBdLGFbMV09b1sxXSxhWzJdPW9bM10sYVszXT1vWzRdLGFbNF09b1s2XSxhWzVdPW9bN10sYVs2XT10LGFbN109bixhWzhdPXgoKSxhWzldPUUoKX07bGV0IGRuPTA7Y29uc3QgZm49ZT0+e2UudXNlUHJvZ3JhbSgpLGUuYmluZFVuaWZvcm0oKSxtdChndCksbi5iaW5kQnVmZmVyKG4uQVJSQVlfQlVGRkVSLHB0KSxHdC5idWZmZXIubGVuZ3RoPmRuJiYoZG49R3QuYnVmZmVyLmxlbmd0aCxuLmJ1ZmZlckRhdGEobi5BUlJBWV9CVUZGRVIsNCpkbixuLkRZTkFNSUNfRFJBVykpLG4uYnVmZmVyU3ViRGF0YShuLkFSUkFZX0JVRkZFUiwwLEd0LmJ1ZmZlci5zdWJhcnJheSgwLEd0Lm9mZnNldCkpLG4uZHJhd0FycmF5c0luc3RhbmNlZChuLlRSSUFOR0xFUywwLDYsZS5jb3VudCl9LG1uPSgpPT57NjAzIT09SXQoKSYmKEJ0KDYwMyksbi5ibGVuZEZ1bmMobi5aRVJPLG4uT05FX01JTlVTX1NSQ19BTFBIQSkpfSx2bj1lPT57c3dpdGNoKGUpe2Nhc2UiYWRkIjo2MTEhPT1JdCgpJiYoQnQoNjExKSxuLmJsZW5kRnVuYyhuLk9ORSxuLk9ORSkpO2JyZWFrO2Nhc2Uic2NyZWVuIjo2NDEhPT1JdCgpJiYoQnQoNjQxKSxuLmJsZW5kRnVuYyhuLk9ORV9NSU5VU19EU1RfQ09MT1Isbi5PTkUpKTticmVhaztjYXNlImFscGhhIjo2MDYhPT1JdCgpJiYoQnQoNjA2KSxuLmJsZW5kRnVuYyhuLlpFUk8sbi5TUkNfQUxQSEEpKTticmVhaztjYXNlImVyYXNlIjptbigpO2JyZWFrO2Nhc2UiY29weSI6Y24oKTticmVhaztkZWZhdWx0Okx0KCl9fSxfbj1lPT57dmFyIHQ7KGU9PntwdD1lLmNyZWF0ZUJ1ZmZlcigpfSkoZSksdD0oKCk9Pntjb25zdCBlPWR0KCk7cmV0dXJuIG10KGUpLG4uYmluZEJ1ZmZlcihuLkFSUkFZX0JVRkZFUixlLnZlcnRleEJ1ZmZlciksbi5idWZmZXJEYXRhKG4uQVJSQVlfQlVGRkVSLG5ldyBGbG9hdDMyQXJyYXkoWzAsMCwxLDAsMCwxLDEsMSwwLDEsMSwwXSksbi5TVEFUSUNfRFJBVyksbi5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSgwKSxuLnZlcnRleEF0dHJpYlBvaW50ZXIoMCwyLG4uRkxPQVQsITEsMCwwKSxuLmJpbmRCdWZmZXIobi5BUlJBWV9CVUZGRVIscHQpLG4uYnVmZmVyRGF0YShuLkFSUkFZX0JVRkZFUixHdC5idWZmZXIubGVuZ3RoLG4uRFlOQU1JQ19EUkFXKSxuLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDEpLG4udmVydGV4QXR0cmliUG9pbnRlcigxLDQsbi5GTE9BVCwhMSw4OCwwKSxuLnZlcnRleEF0dHJpYkRpdmlzb3IoMSwxKSxuLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDIpLG4udmVydGV4QXR0cmliUG9pbnRlcigyLDQsbi5GTE9BVCwhMSw4OCwxNiksbi52ZXJ0ZXhBdHRyaWJEaXZpc29yKDIsMSksbi5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSgzKSxuLnZlcnRleEF0dHJpYlBvaW50ZXIoMywyLG4uRkxPQVQsITEsODgsMzIpLG4udmVydGV4QXR0cmliRGl2aXNvcigzLDEpLG4uZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoNCksbi52ZXJ0ZXhBdHRyaWJQb2ludGVyKDQsNCxuLkZMT0FULCExLDg4LDQwKSxuLnZlcnRleEF0dHJpYkRpdmlzb3IoNCwxKSxuLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDUpLG4udmVydGV4QXR0cmliUG9pbnRlcig1LDQsbi5GTE9BVCwhMSw4OCw1Niksbi52ZXJ0ZXhBdHRyaWJEaXZpc29yKDUsMSksbi5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSg2KSxuLnZlcnRleEF0dHJpYlBvaW50ZXIoNiw0LG4uRkxPQVQsITEsODgsNzIpLG4udmVydGV4QXR0cmliRGl2aXNvcig2LDEpLGV9KSgpLGd0PXR9LHBuPShlLHQscixhPSExKT0+e2NvbnN0IG89dWUoZSx0LGEpO3JldHVybiBuLnRleFN1YkltYWdlMkQobi5URVhUVVJFXzJELDAsMCwwLGUsdCxuLlJHQkEsbi5VTlNJR05FRF9CWVRFLHIpLG99LGduPShlLHQpPT57Y29uc3Qgcj0oKGUsdCxyLGE9ITEpPT57Y29uc3Qgbz11ZShlLHQsYSk7cmV0dXJuIG4udGV4U3ViSW1hZ2UyRChuLlRFWFRVUkVfMkQsMCwwLDAsbi5SR0JBLG4uVU5TSUdORURfQllURSxyKSxvfSkoZS53LGUuaCx0KSxhPXRuKCk7bm4oYSxlLncsZS5oKSxMdCgpLHJuKGEpLEwocil9LHhuPVtdLEVuPW5ldyBNYXAsQW49KGUsdCxuKT0+e09lKGUsITApO2NvbnN0IHI9TWF0aC5jZWlsKC41Km4pLGE9MS0oci0uNSpuKSxvPTErbixzPShlPT57Y29uc3QgdD1gYiR7ZX1gO2lmKEVuLmhhcyh0KSlyZXR1cm4gRW4uZ2V0KHQpO2NvbnN0IG49bmV3IE10KCIjdmVyc2lvbiAzMDAgZXNcblxubGF5b3V0IChsb2NhdGlvbiA9IDApIGluIHZlYzIgYV92ZXJ0ZXg7XG5cbm91dCB2ZWMyIHZfY29vcmQ7XG5cbnZvaWQgbWFpbigpIHtcbiAgICB2X2Nvb3JkID0gYV92ZXJ0ZXg7XG5cbiAgICB2ZWMyIHBvc2l0aW9uID0gYV92ZXJ0ZXggKiAyLjAgLSAxLjA7XG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLjAsIDEuMCk7XG59IiwoZT0+e2NvbnN0IHQ9ZS50b0ZpeGVkKDEpO3JldHVybmAjdmVyc2lvbiAzMDAgZXNcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXG51bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmU7XG51bmlmb3JtIHZlYzQgdV9tZWRpdW1wO1xuXG5pbiB2ZWMyIHZfY29vcmQ7XG5vdXQgdmVjNCBvX2NvbG9yO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdmVjMiAgb2Zmc2V0ICAgPSB1X21lZGl1bXAueHk7XG4gICAgZmxvYXQgZnJhY3Rpb24gPSB1X21lZGl1bXAuejtcbiAgICBmbG9hdCBzYW1wbGVzICA9IHVfbWVkaXVtcC53O1xuICAgIFxuICAgIHZlYzQgY29sb3IgPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdl9jb29yZCk7XG5cbiAgICBmb3IgKGZsb2F0IGkgPSAxLjA7IGkgPCAke3R9OyBpICs9IDEuMCkge1xuICAgICAgICBjb2xvciArPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdl9jb29yZCArIG9mZnNldCAqIGkpO1xuICAgICAgICBjb2xvciArPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdl9jb29yZCAtIG9mZnNldCAqIGkpO1xuICAgIH1cbiAgICBjb2xvciArPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdl9jb29yZCArIG9mZnNldCAqICR7dH0pICogZnJhY3Rpb247XG4gICAgY29sb3IgKz0gdGV4dHVyZSh1X3RleHR1cmUsIHZfY29vcmQgLSBvZmZzZXQgKiAke3R9KSAqIGZyYWN0aW9uO1xuICAgIGNvbG9yIC89IHNhbXBsZXM7XG5cbiAgICBvX2NvbG9yID0gY29sb3I7XG59YH0pKGUpKTtyZXR1cm4gRW4uc2V0KHQsbiksbn0pKHIpOygoZSx0LG4scixhLG8pPT57Y29uc3Qgcz1lLm1lZGl1bXA7cj8oc1swXT0xL3Qsc1sxXT0wKTooc1swXT0wLHNbMV09MS9uKSxzWzJdPWEsc1szXT1vfSkocyxlLndpZHRoLGUuaGVpZ2h0LHQsYSxvKSxybihzKX0seW49e3g6MCx5OjB9LFRuPShlLHQsbik9PihlPj4xNikqKG4/dDoxKS8yNTUsUm49KGUsdCxuKT0+KGU+PjgmMjU1KSoobj90OjEpLzI1NSxNbj0oZSx0LG4pPT4oMjU1JmUpKihuP3Q6MSkvMjU1LHduPVsuNSwxLjA1LDEuNCwxLjU1LDEuNzUsMS45LDIsMi4xNSwyLjIsMi4zLDIuNSwzLDMsMy41LDMuNV0sRm49KGUsdCxuPTQsYT00LG89MSxzPSEwKT0+e2NvbnN0IGk9ci5jdXJyZW50QXR0YWNobWVudE9iamVjdCxjPU1hdGguc3FydCh0WzBdKnRbMF0rdFsxXSp0WzFdKSxsPU1hdGguc3FydCh0WzJdKnRbMl0rdFszXSp0WzNdKSx1PXkoKSxoPW4qKGMvdSksYj1hKihsL3UpLGQ9d25bby0xXSxmPU1hdGgucm91bmQoaCpkKSxtPU1hdGgucm91bmQoYipkKTt5bi54Kz1mLHluLnkrPW07Y29uc3Qgdj1lLndpZHRoKzIqZixfPWUuaGVpZ2h0KzIqbTtsZXQgcD0xLGc9MTtoPjEyOD9wPS4wNjI1Omg+NjQ/cD0uMTI1Omg+MzI/cD0uMjU6aD4xNiYmKHA9LjUpLGI+MTI4P2c9LjA2MjU6Yj42ND9nPS4xMjU6Yj4zMj9nPS4yNTpiPjE2JiYoZz0uNSk7Y29uc3QgeD1NYXRoLmNlaWwodipwKSxFPU1hdGguY2VpbChfKmcpLEE9aGUoeCxFLCExKSxUPVtBLGhlKHgsRSwhMSldO3IuYmluZChBKSxyLnJlc2V0KCksci5zZXRUcmFuc2Zvcm0ocCwwLDAsZyxmKnAsbSpnKSxPZShlKTtjb25zdCBSPWhuKCk7Ym4oUixlLndpZHRoLGUuaGVpZ2h0KSxybihSKSxzJiZMKGUpO2NvbnN0IE09aCpwLHc9YipnO2xldCBGPTAsJD1BLnRleHR1cmU7T2UoJCwhMCksY24oKTtmb3IobGV0IGU9MDtlPG87KytlKXtpZihuPjApe0Y9KEYrMSklMjtjb25zdCBlPVRbRl07ci5iaW5kKGUpLEFuKCQsITAsTSksJD1lLnRleHR1cmV9aWYoYT4wKXtGPShGKzEpJTI7Y29uc3QgZT1UW0ZdO3IuYmluZChlKSxBbigkLCExLHcpLCQ9ZS50ZXh0dXJlfX1pZihMdCgpLDEhPT1wfHwxIT09Zyl7Y29uc3QgZT1oZSh2LF8sITEpO3IuYmluZChlKSxyLnNldFRyYW5zZm9ybSgxL3AsMCwwLDEvZywwLDApLE9lKCQsITApLGJuKFIsJC53aWR0aCwkLmhlaWdodCkscm4oUiksJD1lLnRleHR1cmUsZWUoVFswXSksZWUoVFsxXSksZWUoZSwhMSl9ZWxzZSBGPShGKzEpJTIsZWUoVFtGXSksRj0oRisxKSUyLGVlKFRbRl0sITEpO3JldHVybiBpJiZyLmJpbmQoaSksJH0sJG49KGUsdCk9Pntjb25zdCBuPXIuY3VycmVudEF0dGFjaG1lbnRPYmplY3QsYT1oZShlLndpZHRoLGUuaGVpZ2h0LCExKTtyLmJpbmQoYSksci5yZXNldCgpLHIuc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKSxPZShlKSxMdCgpO2NvbnN0IG89KCgpPT57aWYoRW4uaGFzKCJtIikpcmV0dXJuIEVuLmdldCgibSIpO2NvbnN0IGU9bmV3IE10KCIjdmVyc2lvbiAzMDAgZXNcblxubGF5b3V0IChsb2NhdGlvbiA9IDApIGluIHZlYzIgYV92ZXJ0ZXg7XG5cbm91dCB2ZWMyIHZfY29vcmQ7XG5cbnZvaWQgbWFpbigpIHtcbiAgICB2X2Nvb3JkID0gYV92ZXJ0ZXg7XG5cbiAgICB2ZWMyIHBvc2l0aW9uID0gYV92ZXJ0ZXggKiAyLjAgLSAxLjA7XG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLjAsIDEuMCk7XG59IiwiI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxudW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlO1xudW5pZm9ybSB2ZWM0IHVfbWVkaXVtcFs1XTtcblxuaW4gdmVjMiB2X2Nvb3JkO1xub3V0IHZlYzQgb19jb2xvcjtcblxudm9pZCBtYWluKCkge1xuICAgIG1hdDQgbXVsID0gbWF0NCh1X21lZGl1bXBbMF0sIHVfbWVkaXVtcFsxXSwgdV9tZWRpdW1wWzJdLCB1X21lZGl1bXBbM10pO1xuICAgIHZlYzQgYWRkID0gdV9tZWRpdW1wWzRdO1xuICAgIFxuICAgIHZlYzQgY29sb3IgPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdl9jb29yZCk7XG5cbiAgICBjb2xvci5yZ2IgLz0gbWF4KDAuMDAwMSwgY29sb3IuYSk7XG4gICAgY29sb3IgPSBjbGFtcChjb2xvciAqIG11bCArIGFkZCwgMC4wLCAxLjApO1xuICAgIGNvbG9yLnJnYiAqPSBjb2xvci5hO1xuXG4gICAgb19jb2xvciA9IGNvbG9yO1xufSIpO3JldHVybiBFbi5zZXQoIm0iLGUpLGV9KSgpOygoZSx0KT0+e2NvbnN0IG49ZS5tZWRpdW1wO25bMF09dFswXSxuWzFdPXRbMV0sblsyXT10WzJdLG5bM109dFszXSxuWzRdPXRbNV0sbls1XT10WzZdLG5bNl09dFs3XSxuWzddPXRbOF0sbls4XT10WzEwXSxuWzldPXRbMTFdLG5bMTBdPXRbMTJdLG5bMTFdPXRbMTNdLG5bMTJdPXRbMTVdLG5bMTNdPXRbMTZdLG5bMTRdPXRbMTddLG5bMTVdPXRbMThdLG5bMTZdPXRbNF0vMjU1LG5bMTddPXRbOV0vMjU1LG5bMThdPXRbMTRdLzI1NSxuWzE5XT10WzE5XS8yNTV9KShvLHQpLHJuKG8pO2NvbnN0IHM9YS50ZXh0dXJlO3JldHVybiBMKGUpLGVlKGEsITEpLG4mJnIuYmluZChuKSxzfSxPbj0oZSx0LG4scixhLG8pPT57Y29uc3Qgcz1lPyJibHVyLmEgPSAxLjAgLSBibHVyLmE7IjoiIixpPW4/KGM9byxgXG4gICAgZmxvYXQgc3RyZW5ndGggPSB1X21lZGl1bXBbJHtNYXRoLmZsb29yKGMvNCl9XVske2MlNH1dO1xuICAgIGJsdXIuYSA9IGNsYW1wKGJsdXIuYSAqIHN0cmVuZ3RoLCAwLjAsIDEuMCk7XG5gKToiIjt2YXIgYztjb25zdCBsPXI/KGU9PmBcbiAgICBibHVyID0gdGV4dHVyZSh1X3RleHR1cmVzWyR7ZT8yOjF9XSwgdmVjMihibHVyLmEsIDAuNSkpO1xuYCkodCk6KGU9PmBcbiAgICB2ZWM0IGNvbG9yID0gdV9tZWRpdW1wWyR7ZX1dO1xuICAgIGJsdXIgPSBjb2xvciAqIGJsdXIuYTtcbmApKGEpO3JldHVybmBcbiAgICAke3N9XG4gICAgJHtpfVxuICAgICR7bH1cbmB9LFNuPShlLHQsbixyLGEsbyk9Pntjb25zdCBzPXQ/IlxuICAgIHZlYzIgcHEgPSAoMS4wIC0gdl9jb29yZCkgKiBibHVyX3NjYWxlIC0gYmx1cl9vZmZzZXQ7XG4gICAgdmVjNCBibHVyMiA9IG1peCh2ZWM0KDAuMCksIHRleHR1cmUodV90ZXh0dXJlc1swXSwgcHEpLCBpc0luc2lkZShwcSkpO1xuIjoiXG4gICAgdmVjNCBibHVyMiA9IHRleHR1cmUodV90ZXh0dXJlc1swXSwgMS4wIC0gdl9jb29yZCk7XG4iLGk9bj8oYz1vLGBcbiAgICBmbG9hdCBzdHJlbmd0aCA9IHVfbWVkaXVtcFske01hdGguZmxvb3IoYy80KX1dWyR7YyU0fV07XG4gICAgaGlnaGxpZ2h0X2FscGhhICo9IHN0cmVuZ3RoO1xuICAgIHNoYWRvd19hbHBoYSAgICAqPSBzdHJlbmd0aDtcbmApOiIiO3ZhciBjO2NvbnN0IGw9cj8oZT0+YFxuICAgIGJsdXIgPSB0ZXh0dXJlKHVfdGV4dHVyZXNbJHtlPzI6MX1dLCB2ZWMyKFxuICAgICAgICAwLjUwMTk2MDc4NDMxMzcyNTUgLSAwLjUwMTk2MDc4NDMxMzcyNTUgKiBzaGFkb3dfYWxwaGEgKyAwLjQ5ODAzOTIxNTY4NjI3NDUgKiBoaWdobGlnaHRfYWxwaGEsXG4gICAgICAgIDAuNVxuICAgICkpO1xuYCkoZSk6KGU9PmBcbiAgICB2ZWM0IGhpZ2hsaWdodF9jb2xvciA9IHVfbWVkaXVtcFske2V9XTtcbiAgICB2ZWM0IHNoYWRvd19jb2xvciAgICA9IHVfbWVkaXVtcFske2UrMX1dO1xuICAgIGJsdXIgPSBoaWdobGlnaHRfY29sb3IgKiBoaWdobGlnaHRfYWxwaGEgKyBzaGFkb3dfY29sb3IgKiBzaGFkb3dfYWxwaGE7XG5gKShhKTtyZXR1cm5gXG4gICAgJHtzfVxuICAgIGZsb2F0IGhpZ2hsaWdodF9hbHBoYSA9IGJsdXIuYSAtIGJsdXIyLmE7XG4gICAgZmxvYXQgc2hhZG93X2FscGhhICAgID0gYmx1cjIuYSAtIGJsdXIuYTtcbiAgICAke2l9XG4gICAgaGlnaGxpZ2h0X2FscGhhID0gY2xhbXAoaGlnaGxpZ2h0X2FscGhhLCAwLjAsIDEuMCk7XG4gICAgc2hhZG93X2FscGhhICAgID0gY2xhbXAoc2hhZG93X2FscGhhLCAwLjAsIDEuMCk7XG4gICAgJHtsfVxuYH0sa249KGUsdCxuLHIsYSxvLHMpPT57Y29uc3QgaT1gZiR7ZT8ieSI6Im4ifSR7dD8ieSI6Im4ifSR7bj8ieSI6Im4ifSR7cn0ke2E/InkiOiJuIn0ke28/InkiOiJuIn1gO2lmKEVuLmhhcyhpKSlyZXR1cm4gRW4uZ2V0KGkpO2xldCBjPTE7ZSYmYysrLHMmJmMrKztsZXQgbD0oZT80OjApKyh0PzQ6MCkrKG8/MTowKTtzfHwobCs9bj80OjgpLGw9TWF0aC5jZWlsKGwvNCk7Y29uc3QgdT1uZXcgTXQoIiN2ZXJzaW9uIDMwMCBlc1xuXG5sYXlvdXQgKGxvY2F0aW9uID0gMCkgaW4gdmVjMiBhX3ZlcnRleDtcblxub3V0IHZlYzIgdl9jb29yZDtcblxudm9pZCBtYWluKCkge1xuICAgIHZfY29vcmQgPSBhX3ZlcnRleDtcblxuICAgIHZlYzIgcG9zaXRpb24gPSBhX3ZlcnRleCAqIDIuMCAtIDEuMDtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuMCwgMS4wKTtcbn0iLCgoZSx0LG4scixhLG8scyxpLGMpPT57bGV0IGw9MDtjb25zdCB1PW4/KGU9PmBcbiAgICB2ZWMyIGJhc2Vfc2NhbGUgID0gdV9tZWRpdW1wWyR7ZX1dLnh5O1xuICAgIHZlYzIgYmFzZV9vZmZzZXQgPSB1X21lZGl1bXBbJHtlfV0uenc7XG5cbiAgICB2ZWMyIHV2ID0gdl9jb29yZCAqIGJhc2Vfc2NhbGUgLSBiYXNlX29mZnNldDtcbiAgICB2ZWM0IGJhc2UgPSBtaXgodmVjNCgwLjApLCB0ZXh0dXJlKHVfdGV4dHVyZXNbMV0sIHV2KSwgaXNJbnNpZGUodXYpKTtcbmApKGwrKyk6IiIsaD1yPyhlPT5gXG4gICAgdmVjMiBibHVyX3NjYWxlICA9IHVfbWVkaXVtcFske2V9XS54eTtcbiAgICB2ZWMyIGJsdXJfb2Zmc2V0ID0gdV9tZWRpdW1wWyR7ZX1dLnp3O1xuXG4gICAgdmVjMiBzdCA9IHZfY29vcmQgKiBibHVyX3NjYWxlIC0gYmx1cl9vZmZzZXQ7XG4gICAgdmVjNCBibHVyID0gbWl4KHZlYzQoMC4wKSwgdGV4dHVyZSh1X3RleHR1cmVzWzBdLCBzdCksIGlzSW5zaWRlKHN0KSk7XG5gKShsKyspOiJcbiAgICB2ZWM0IGJsdXIgPSB0ZXh0dXJlKHVfdGV4dHVyZXNbMF0sIHZfY29vcmQpO1xuIixiPSJpbm5lciI9PT1vLGQ9bDtsZXQgZixtLHY9NCpsO3N3aXRjaChjP2Y9YT9PbighMSxuLGksYyxkLHYpOlNuKG4scixpLGMsZCx2KTphPyh2Kz00LGY9T24oYixuLGksYyxkLHYpKToodis9OCxmPVNuKG4scixpLGMsZCx2KSksbyl7Y2FzZSJvdXRlciI6bT1zPyJibHVyIC0gYmx1ciAqIGJhc2UuYSI6ImJhc2UgKyBibHVyIC0gYmx1ciAqIGJhc2UuYSI7YnJlYWs7Y2FzZSJmdWxsIjptPXM/ImJsdXIiOiJiYXNlIC0gYmFzZSAqIGJsdXIuYSArIGJsdXIiO2JyZWFrO2RlZmF1bHQ6bT0iYmx1ciJ9cmV0dXJuYCN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cbnVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZXNbJHtlfV07XG51bmlmb3JtIHZlYzQgdV9tZWRpdW1wWyR7dH1dO1xuXG5pbiB2ZWMyIHZfY29vcmQ7XG5vdXQgdmVjNCBvX2NvbG9yO1xuXG5cbmZsb2F0IGlzSW5zaWRlKGluIHZlYzIgdXYpIHtcbiAgICByZXR1cm4gc3RlcCg0LjAsIGRvdChzdGVwKHZlYzQoMC4wLCB1di54LCAwLjAsIHV2LnkpLCB2ZWM0KHV2LngsIDEuMCwgdXYueSwgMS4wKSksIHZlYzQoMS4wKSkpO1xufVxuXG52b2lkIG1haW4oKSB7XG4gICAgJHt1fVxuICAgICR7aH1cbiAgICAke2Z9XG4gICAgb19jb2xvciA9ICR7bX07XG59YH0pKGMsbCxlLHQsbixyLGEsbyxzKSk7cmV0dXJuIEVuLnNldChpLHUpLHV9LENuPW5ldyBNYXAsUG49KGUsdCk9Pntjb25zdCBuPWBsJHsoIjAwIitlKS5zbGljZSgtMyl9JHt0PyJ5IjoibiJ9YDtpZihDbi5oYXMobikpcmV0dXJuIENuLmdldChuKTtjb25zdCByPU1hdGguY2VpbCg1KmUvNCksYT1uZXcgTXQoIiN2ZXJzaW9uIDMwMCBlc1xuXG5sYXlvdXQgKGxvY2F0aW9uID0gMCkgaW4gdmVjMiBhX3ZlcnRleDtcblxub3V0IHZlYzIgdl9jb29yZDtcblxudm9pZCBtYWluKCkge1xuICAgIHZfY29vcmQgPSBhX3ZlcnRleDtcblxuICAgIHZlYzIgcG9zaXRpb24gPSBhX3ZlcnRleCAqIDIuMCAtIDEuMDtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuMCwgMS4wKTtcbn0iLCgoZSx0LG4pPT57bGV0IHI9IiI7Zm9yKGxldCBlPTE7ZTx0OysrZSl7Y29uc3Qgbj1lLTEsYT1lLG89YHVfbWVkaXVtcFske3QrTWF0aC5mbG9vcihuLzQpfV1bJHtuJTR9XWAscz1gdV9tZWRpdW1wWyR7dCtNYXRoLmZsb29yKGEvNCl9XVske2ElNH1dYDtyKz1gXG4gICAgaWYgKHQgPD0gJHtzfSkge1xuICAgICAgICByZXR1cm4gbWl4KHVfbWVkaXVtcFske259XSwgdV9tZWRpdW1wWyR7YX1dLCAodCAtICR7b30pIC8gKCR7c30gLSAke299KSk7XG4gICAgfVxuYH1yZXR1cm5gI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxudW5pZm9ybSB2ZWM0IHVfbWVkaXVtcFske2V9XTtcblxuaW4gdmVjMiB2X2Nvb3JkO1xub3V0IHZlYzQgb19jb2xvcjtcblxudmVjNCBnZXRHcmFkaWVudENvbG9yKGluIGZsb2F0IHQpIHtcbiAgICBpZiAodCA8PSB1X21lZGl1bXBbJHt0fV1bMF0pIHtcbiAgICAgICAgcmV0dXJuIHVfbWVkaXVtcFswXTtcbiAgICB9XG4gICAgJHtyfVxuICAgIHJldHVybiB1X21lZGl1bXBbJHt0LTF9XTtcbn1cblxudm9pZCBtYWluKCkge1xuICAgIHZlYzQgY29sb3IgPSBnZXRHcmFkaWVudENvbG9yKHZfY29vcmQueCk7XG4gICAgJHtuPyJjb2xvciA9IHBvdyhjb2xvciwgdmVjNCgwLjQ1NDU0NTQ1KSk7IjoiIn1cbiAgICBjb2xvci5yZ2IgKj0gY29sb3IuYTtcblxuICAgIG9fY29sb3IgPSBjb2xvcjtcbn1gfSkocixlLHQpKTtyZXR1cm4gQ24uc2V0KG4sYSksYX0sQm49KGUsdCxuLHIsYSxvKT0+e2NvbnN0IHM9ZS5tZWRpdW1wO2xldCBpPTA7Zm9yKGxldCBlPWE7ZTxvO2UrKyl7Y29uc3QgdD1uW2VdO3NbaSsrXT0odD4+MTYpLzI1NSxzW2krK109KHQ+PjgmMjU1KS8yNTUsc1tpKytdPSgyNTUmdCkvMjU1LHNbaSsrXT1yW2VdfWZvcihsZXQgZT1hO2U8bztlKyspc1tpKytdPXRbZV0vMjU1fTtsZXQgSW47Y29uc3QgTG49KGUsdCk9PihJbj9fdFswXT09PWUmJl90WzRdPT09dHx8KF90WzBdPWUsX3RbMl09ZSxfdFs0XT10LF90WzZdPXQsbi5idWZmZXJTdWJEYXRhKG4uQVJSQVlfQlVGRkVSLDAsX3QpKTpJbj0oKGUsdCk9Pntjb25zdCByPWR0KCk7cmV0dXJuIG10KHIpLG4uYmluZEJ1ZmZlcihuLkFSUkFZX0JVRkZFUixyLnZlcnRleEJ1ZmZlciksX3RbMF09ZSxfdFsyXT1lLF90WzRdPXQsX3RbNl09dCxuLmJ1ZmZlckRhdGEobi5BUlJBWV9CVUZGRVIsX3Qsbi5TVEFUSUNfRFJBVyksbi5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSgwKSxuLnZlcnRleEF0dHJpYlBvaW50ZXIoMCwyLG4uRkxPQVQsITEsMCwwKSxyfSkoZSx0KSxJbiksVW49KGUsdCxyKT0+e2UudXNlUHJvZ3JhbSgpLGUuYmluZFVuaWZvcm0oKSxtdChMbih0LHIpKSxuLmRyYXdBcnJheXMobi5UUklBTkdMRV9TVFJJUCwwLDQpfTtsZXQgTm49bnVsbDtjb25zdCBEbj0oKT0+KE5ufHwoTm49aGUoNTEyLDEsITEpKSxObik7bGV0IGpuPTA7Y29uc3QgWG49KCk9PmpuLHpuPW5ldyBGbG9hdDMyQXJyYXkoMjU2KSxWbj1uZXcgRmxvYXQzMkFycmF5KDI1Nik7Zm9yKGxldCBlPTA7ZTwyNTY7KytlKXtjb25zdCB0PWUvMjU1O3puW2VdPU1hdGgucG93KHQsMi4yMzMzMzMzMyksVm5bZV09dH1jb25zdCBXbj0oZSx0LGEsbyxzLGksYyxsLHUsaCxiLGQsZixtLHYsXyxwPW51bGwsZz1udWxsLHg9bnVsbCxFPTAsQT0wLHk9MCxUPTAsUj0wLE09MCx3PTAsRj0wKT0+e2NvbnN0ICQ9ci5jdXJyZW50QXR0YWNobWVudE9iamVjdCxPPWhlKGEsbywhMSk7ci5iaW5kKE8pO2NvbnN0IFM9ImlubmVyIj09PW0saz1udWxsIT09cCYmbnVsbCE9PWcmJm51bGwhPT14O2xldCBDPW51bGw7aWYoayYmKEM9KChlLHQsbik9Pntjb25zdCBhPXIuY3VycmVudEF0dGFjaG1lbnRPYmplY3Qsbz1EbigpO3IuYmluZChvKTtjb25zdCBzPWUubGVuZ3RoO2NuKCk7Y29uc3QgaT1YbigpO2ZvcihsZXQgcj0wO3I8cztyKz1pLTEpe2NvbnN0IGE9TWF0aC5taW4ocitpLHMpLG89UG4oYS1yLCExKTtCbihvLGUsdCxuLHIsYSksVW4obyxlW3JdLzI1NSxlW2EtMV0vMjU1KX1yZXR1cm4gTHQoKSxhJiZyLmJpbmQoYSksby50ZXh0dXJlfSkocCxnLHgpKSxTKXtyLnJlc2V0KCksci5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLE9lKGUsITApO2NvbnN0IGE9dG4oKTtubihhLGUud2lkdGgsZS5oZWlnaHQpLHJuKGEpLGsmJkM/KChlLHQscj0hMSk9PnskZSgyLG4uVEVYVFVSRTIsdCxyKSwkZSgxLG4uVEVYVFVSRTEsbnVsbCksJGUoMCxuLlRFWFRVUkUwLGUscil9KSh0LEMsITApOk9lKHQsITApfWVsc2UgayYmQz8oKGUsdCxyLGE9ITEpPT57JGUoMixuLlRFWFRVUkUyLHIsYSksJGUoMSxuLlRFWFRVUkUxLHQsYSksJGUoMCxuLlRFWFRVUkUwLGUsYSl9KSh0LGUsQywhMCk6ZW4odCxlLCEwKTtjb25zdCBQPSEoU3x8ImZ1bGwiPT09bSYmdiksQj0hKGE9PT11JiZvPT09aCYmMD09PWImJjA9PT1kKSxJPSEoMT09PV8pO1M/dj82NzAhPT1JdCgpJiYoQnQoNjcwKSxuLmJsZW5kRnVuYyhuLkRTVF9BTFBIQSxuLlpFUk8pKTo2NzMhPT1JdCgpJiYoQnQoNjczKSxuLmJsZW5kRnVuYyhuLkRTVF9BTFBIQSxuLk9ORV9NSU5VU19TUkNfQUxQSEEpKTpjbigpO2NvbnN0IEw9a24oUCxCLGYsbSx2LEksayk7KChlLHQsbixyLGEsbyxzLGksYyxsLHUsaCxiLGQsZixtLHYsXyxwLGcseCxFLEEseSxUKT0+e2xldCBSO0U/KFI9ZS50ZXh0dXJlcyxSWzBdPTAsUlsxXT0xLFQmJihSWzJdPTIpKTpUJiYoUj1lLnRleHR1cmVzLFJbMF09MCxSWzFdPTIpO2NvbnN0IE09ZS5tZWRpdW1wO2xldCB3PTA7RSYmKE1bdysrXT10L3IsTVt3KytdPW4vYSxNW3crK109by9yLE1bdysrXT0obi1hLXMpL2EpLEEmJihNW3crK109dC9pLE1bdysrXT1uL2MsTVt3KytdPWwvaSxNW3crK109KG4tYy11KS9jKSxUfHwoaD8oTVt3KytdPWQsTVt3KytdPWYsTVt3KytdPW0sTVt3KytdPXYpOihNW3crK109ZCxNW3crK109ZixNW3crK109bSxNW3crK109dixNW3crK109XyxNW3crK109cCxNW3crK109ZyxNW3crK109eCkpLHkmJihNW3ddPWIpfSkoTCxhLG8scyxpLGMsbCx1LGgsYixkLGYsXyxFLEEseSxULFIsTSx3LEYsUCxCLEksaykscm4oTCk7Y29uc3QgVT1PLnRleHR1cmU7cmV0dXJuIGVlKE8sITEpLEx0KCksJCYmci5iaW5kKCQpLFV9LEduPShlLHQsbj0wLGE9MSxvPTQscz00LGk9MSxjPTEsbD0hMSx1PSExKT0+e2NvbnN0IGg9ci5jdXJyZW50QXR0YWNobWVudE9iamVjdCxiPWUud2lkdGgsZD1lLmhlaWdodCxmPXluLngsbT15bi55LHY9Rm4oZSx0LG8scyxjLCExKSxfPXYud2lkdGgscD12LmhlaWdodCxnPXluLngtZix4PXluLnktbSxFPVduKGUsdixsP2I6XyxsP2Q6cCxiLGQsbD8wOmcsbD8wOngsXyxwLGw/LWc6MCxsPy14OjAsITAsbD8iaW5uZXIiOiJvdXRlciIsdSxpLG51bGwsbnVsbCxudWxsLFRuKG4sYSwhMCksUm4obixhLCEwKSxNbihuLGEsITApLGEsMCwwLDAsMCk7cmV0dXJuIEwoZSksTCh2KSxoJiZyLmJpbmQoaCksRX0sWW49TWF0aC5QSS8xODAscW49KGUsdCxuPTQsYT00NSxvPTAscz0xLGk9NCxjPTQsbD0xLHU9MSxoPSExLGI9ITEsZD0hMSk9Pntjb25zdCBmPXIuY3VycmVudEF0dGFjaG1lbnRPYmplY3QsbT1lLndpZHRoLHY9ZS5oZWlnaHQsXz15bi54LHA9eW4ueSxnPUZuKGUsdCxpLGMsdSwhMSkseD1nLndpZHRoLEU9Zy5oZWlnaHQsQT15bi54LFQ9eW4ueSxSPUEtXyxNPVQtcCx3PU1hdGguc3FydCh0WzBdKnRbMF0rdFsxXSp0WzFdKSxGPU1hdGguc3FydCh0WzJdKnRbMl0rdFszXSp0WzNdKSwkPXkoKSxPPWEqWW4sUz1NYXRoLmNvcyhPKSpuKih3LyQpLGs9TWF0aC5zaW4oTykqbiooRi8kKSxDPWg/bTp4K01hdGgubWF4KDAsTWF0aC5hYnMoUyktUiksUD1oP3Y6RStNYXRoLm1heCgwLE1hdGguYWJzKGspLU0pLEI9TWF0aC5jZWlsKEMpLEk9TWF0aC5jZWlsKFApLFU9KEItQykvMixOPShJLVApLzIsRD1oPzA6TWF0aC5tYXgoMCxSLVMpK1Usaj1oPzA6TWF0aC5tYXgoMCxNLWspK04sWD1oP1MtQTooUz4wP01hdGgubWF4KDAsUy1SKTowKStVLHo9aD9rLVQ6KGs+MD9NYXRoLm1heCgwLGstTSk6MCkrTjtsZXQgVixXPSIiO2g/KFc9ImlubmVyIixWPWJ8fGQpOiFiJiZkPyhXPSJmdWxsIixWPSEwKTooVz0ib3V0ZXIiLFY9Yik7Y29uc3QgRz1XbihlLGcsQixJLG0sdixELGoseCxFLFgseiwhMCxXLFYsbCxudWxsLG51bGwsbnVsbCxUbihvLHMsITApLFJuKG8scywhMCksTW4obyxzLCEwKSxzLDAsMCwwLDApO3JldHVybiBMKGUpLEwoZyksZiYmci5iaW5kKGYpLEd9LEtuPU1hdGguUEkvMTgwLEhuPShlLHQsbj00LGE9NDUsbz0xNjc3NzIxNSxzPTEsaT0wLGM9MSxsPTQsdT00LGg9MSxiPTEsZD0wLGY9ITEpPT57Y29uc3QgbT1lLndpZHRoLHY9ZS5oZWlnaHQsXz15bi54LHA9eW4ueSxnPU1hdGguc3FydCh0WzBdKnRbMF0rdFsxXSp0WzFdKSx4PU1hdGguc3FydCh0WzJdKnRbMl0rdFszXSp0WzNdKSxFPXkoKSxBPWEqS24sVD1NYXRoLmNvcyhBKSpuKihnL0UpLFI9TWF0aC5zaW4oQSkqbiooeC9FKSxNPXIuY3VycmVudEF0dGFjaG1lbnRPYmplY3Qsdz1oZShtLHYsITEpO3IuYmluZCh3KSxyLnJlc2V0KCksci5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLE9lKGUpO2NvbnN0IEY9dG4oKTtubihGLGUud2lkdGgsZS5oZWlnaHQpLHJuKEYpLHIuc2V0VHJhbnNmb3JtKDEsMCwwLDEsMipULDIqUiksbW4oKSxubihGLGUud2lkdGgsZS5oZWlnaHQpLHJuKEYpLEx0KCk7Y29uc3QgJD13LnRleHR1cmU7TSYmci5iaW5kKE0pO2NvbnN0IE89Rm4oJCx0LGwsdSxiLCExKTtlZSh3KTtjb25zdCBTPU8ud2lkdGgsaz1PLmhlaWdodCxDPU1hdGguY2VpbChTKzIqTWF0aC5hYnMoVCkpLFA9TWF0aC5jZWlsKGsrMipNYXRoLmFicyhSKSk7bGV0IEI9IiI7c3dpdGNoKGQpe2Nhc2UgMDpCPSJmdWxsIjticmVhaztjYXNlIDE6Qj0iaW5uZXIiO2JyZWFrO2Nhc2UgMjpCPSJvdXRlciJ9Y29uc3QgST0iaW5uZXIiPT09QixVPUk/bTpDLE49ST92OlAsRD1NYXRoLmFicyhUKSxqPU1hdGguYWJzKFIpLFg9KFMtbSkvMix6PShrLXYpLzIsVj1JPzA6RCtYLFc9ST8wOmoreixHPVduKGUsTyxVLE4sbSx2LFYsVyxTLGssST8tWC1UOkQtVCxJPy16LVI6ai1SLCExLEIsZixoLG51bGwsbnVsbCxudWxsLFRuKG8scywhMCksUm4obyxzLCEwKSxNbihvLHMsITApLHMsVG4oaSxjLCEwKSxSbihpLGMsITApLE1uKGksYywhMCksYyk7cmV0dXJuIHluLng9XytWLHluLnk9cCtXLEwoZSksTChPKSxHfSxabj1NYXRoLlBJLzE4MCxRbj0oZSx0LG49NCxhPTQ1LG8scyxpLGM9NCxsPTQsdT0xLGg9MSxiPTAsZD0hMSk9Pntjb25zdCBmPWUud2lkdGgsbT1lLmhlaWdodCx2PXluLngsXz15bi55LHA9TWF0aC5zcXJ0KHRbMF0qdFswXSt0WzFdKnRbMV0pLGc9TWF0aC5zcXJ0KHRbMl0qdFsyXSt0WzNdKnRbM10pLHg9eSgpLEU9YSpabixBPU1hdGguY29zKEUpKm4qKHAveCksVD1NYXRoLnNpbihFKSpuKihnL3gpLFI9ci5jdXJyZW50QXR0YWNobWVudE9iamVjdCxNPWhlKGYsbSwhMSk7ci5iaW5kKE0pLHIucmVzZXQoKSxyLnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCksT2UoZSk7Y29uc3Qgdz10bigpO25uKHcsZS53aWR0aCxlLmhlaWdodCkscm4odyksci5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwyKkEsMipUKSxtbigpLG5uKHcsZS53aWR0aCxlLmhlaWdodCkscm4odyksTHQoKTtjb25zdCBGPU0udGV4dHVyZTtSJiZyLmJpbmQoUik7Y29uc3QgJD1GbihGLHQsYyxsLGgsITEpO2VlKE0pO2NvbnN0IE89JC53aWR0aCxTPSQuaGVpZ2h0LGs9TWF0aC5jZWlsKE8rMipNYXRoLmFicyhBKSksQz1NYXRoLmNlaWwoUysyKk1hdGguYWJzKFQpKTtsZXQgUD0iIjtzd2l0Y2goYil7Y2FzZSAwOlA9ImZ1bGwiO2JyZWFrO2Nhc2UgMTpQPSJpbm5lciI7YnJlYWs7Y2FzZSAyOlA9Im91dGVyIn1jb25zdCBCPSJpbm5lciI9PT1QLEk9Qj9mOmssVT1CP206QyxOPU1hdGguYWJzKEEpLEQ9TWF0aC5hYnMoVCksaj0oTy1mKS8yLFg9KFMtbSkvMix6PUI/MDpOK2osVj1CPzA6RCtYLFc9V24oZSwkLEksVSxmLG0seixWLE8sUyxCPy1qLUE6Ti1BLEI/LVgtVDpELVQsITEsUCxkLHUsaSxvLHMsMCwwLDAsMCwwLDAsMCwwKTtyZXR1cm4geW4ueD12K3oseW4ueT1fK1YsTChlKSxMKCQpLFd9LEpuPU1hdGguUEkvMTgwLGVyPShlLHQsbj00LHI9NDUsYSxvLHMsaT00LGM9NCxsPTEsdT0xLGg9MCxiPSExKT0+e2NvbnN0IGQ9ZS53aWR0aCxmPWUuaGVpZ2h0LG09eW4ueCx2PXluLnksXz1GbihlLHQsaSxjLHUsITEpLHA9Xy53aWR0aCxnPV8uaGVpZ2h0LHg9eW4ueCxFPXluLnksQT14LW0sVD1FLXYsUj1NYXRoLnNxcnQodFswXSp0WzBdK3RbMV0qdFsxXSksTT1NYXRoLnNxcnQodFsyXSp0WzJdK3RbM10qdFszXSksdz15KCksRj1yKkpuLCQ9TWF0aC5jb3MoRikqbiooUi93KSxPPU1hdGguc2luKEYpKm4qKE0vdyksUz0xPT09aCxrPVM/ZDpwK01hdGgubWF4KDAsTWF0aC5hYnMoJCktQSksQz1TP2Y6ZytNYXRoLm1heCgwLE1hdGguYWJzKE8pLVQpLFA9TWF0aC5jZWlsKGspLEI9TWF0aC5jZWlsKEMpLEk9KFAtaykvMixVPShCLUMpLzIsTj1TPzA6TWF0aC5tYXgoMCxBLSQpK0ksRD1TPzA6TWF0aC5tYXgoMCxULU8pK1Usaj1TPyQteDooJD4wP01hdGgubWF4KDAsJC1BKTowKStJLFg9Uz9PLUU6KE8+MD9NYXRoLm1heCgwLE8tVCk6MCkrVTtsZXQgej0iIjtzd2l0Y2goaCl7Y2FzZSAwOno9ImZ1bGwiO2JyZWFrO2Nhc2UgMTp6PSJpbm5lciI7YnJlYWs7Y2FzZSAyOno9Im91dGVyIn1jb25zdCBWPVduKGUsXyxQLEIsZCxmLE4sRCxwLGcsaixYLCEwLHosYixsLHMsYSxvLDAsMCwwLDAsMCwwLDAsMCk7cmV0dXJuIHluLng9bStOLHluLnk9ditELEwoZSksTChfKSxWfSx0cj0oZSx0LG4scik9Pntjb25zdCBhPWBjJHsoIjAiK2UpLnNsaWNlKC0yKX0keygiMCIrdCkuc2xpY2UoLTIpfSR7bj8ieSI6Im4ifSR7cj8ieSI6Im4ifWA7aWYoRW4uaGFzKGEpKXJldHVybiBFbi5nZXQoYSk7Y29uc3Qgbz0ocj8xOjIpK01hdGguY2VpbChlKnQvNCkscz1uZXcgTXQoIiN2ZXJzaW9uIDMwMCBlc1xuXG5sYXlvdXQgKGxvY2F0aW9uID0gMCkgaW4gdmVjMiBhX3ZlcnRleDtcblxub3V0IHZlYzIgdl9jb29yZDtcblxudm9pZCBtYWluKCkge1xuICAgIHZfY29vcmQgPSBhX3ZlcnRleDtcblxuICAgIHZlYzIgcG9zaXRpb24gPSBhX3ZlcnRleCAqIDIuMCAtIDEuMDtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuMCwgMS4wKTtcbn0iLCgoZSx0LG4scixhKT0+e2NvbnN0IG89TWF0aC5mbG9vciguNSp0KSxzPU1hdGguZmxvb3IoLjUqbiksaT10Km47bGV0IGM9IiI7Y29uc3QgbD1hPzE6Mjtmb3IobGV0IGU9MDtlPGk7KytlKWMrPWBcbiAgICByZXN1bHQgKz0gZ2V0V2VpZ2h0ZWRDb2xvcigke2V9LCB1X21lZGl1bXBbJHtsK01hdGguZmxvb3IoZS80KX1dWyR7ZSU0fV0pO1xuYDtyZXR1cm5gI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxudW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlO1xudW5pZm9ybSB2ZWM0IHVfbWVkaXVtcFske2V9XTtcblxuaW4gdmVjMiB2X2Nvb3JkO1xub3V0IHZlYzQgb19jb2xvcjtcblxuXG5mbG9hdCBpc0luc2lkZShpbiB2ZWMyIHV2KSB7XG4gICAgcmV0dXJuIHN0ZXAoNC4wLCBkb3Qoc3RlcCh2ZWM0KDAuMCwgdXYueCwgMC4wLCB1di55KSwgdmVjNCh1di54LCAxLjAsIHV2LnksIDEuMCkpLCB2ZWM0KDEuMCkpKTtcbn1cblxudmVjNCBnZXRXZWlnaHRlZENvbG9yIChpbiBpbnQgaSwgaW4gZmxvYXQgd2VpZ2h0KSB7XG4gICAgdmVjMiByY3Bfc2l6ZSA9IHVfbWVkaXVtcFswXS54eTtcblxuICAgIGludCBpX2Rpdl94ID0gaSAvICR7dH07XG4gICAgaW50IGlfbW9kX3ggPSBpIC0gJHt0fSAqIGlfZGl2X3g7XG4gICAgdmVjMiBvZmZzZXQgPSB2ZWMyKGlfbW9kX3ggLSAke299LCAke3N9IC0gaV9kaXZfeCk7XG4gICAgdmVjMiB1diA9IHZfY29vcmQgKyBvZmZzZXQgKiByY3Bfc2l6ZTtcblxuICAgIHZlYzQgY29sb3IgPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdXYpO1xuICAgIGNvbG9yLnJnYiAvPSBtYXgoMC4wMDAxLCBjb2xvci5hKTtcbiAgICAke2E/IiI6IlxuICAgIHZlYzQgc3Vic3RpdHV0ZV9jb2xvciA9IHVfbWVkaXVtcFsxXTtcbiAgICBjb2xvciA9IG1peChzdWJzdGl0dXRlX2NvbG9yLCBjb2xvciwgaXNJbnNpZGUodXYpKTtcbiJ9XG5cbiAgICByZXR1cm4gY29sb3IgKiB3ZWlnaHQ7XG59XG5cbnZvaWQgbWFpbigpIHtcbiAgICBmbG9hdCByY3BfZGl2aXNvciA9IHVfbWVkaXVtcFswXS56O1xuICAgIGZsb2F0IGJpYXMgICAgICAgID0gdV9tZWRpdW1wWzBdLnc7XG5cbiAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMC4wKTtcbiAgICAke2N9XG4gICAgcmVzdWx0ID0gY2xhbXAocmVzdWx0ICogcmNwX2Rpdmlzb3IgKyBiaWFzLCAwLjAsIDEuMCk7XG4gICAgJHtyPyJyZXN1bHQuYSA9IHRleHR1cmUodV90ZXh0dXJlLCB2X2Nvb3JkKS5hOyI6IiJ9XG5cbiAgICByZXN1bHQucmdiICo9IHJlc3VsdC5hO1xuICAgIG9fY29sb3IgPSByZXN1bHQ7XG59YH0pKG8sZSx0LG4scikpO3JldHVybiBFbi5zZXQoYSxzKSxzfSxucj0oZSx0PTAsbj0wLGEsbz0xLHM9MCxpPSEwLGM9ITAsbD0wLHU9MCk9Pntjb25zdCBoPXIuY3VycmVudEF0dGFjaG1lbnRPYmplY3QsYj1lLndpZHRoLGQ9ZS5oZWlnaHQsZj1oZShiLGQsITEpO3IuYmluZChmKSxyLnJlc2V0KCksci5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLE9lKGUsITApLEx0KCk7Y29uc3QgbT10cih0LG4saSxjKTsoKGUsdCxuLHIsYSxvLHMsaSxjLGwsdSk9Pntjb25zdCBoPWUubWVkaXVtcDtoWzBdPTEvdCxoWzFdPTEvbixoWzJdPTEvYSxoWzNdPW8vMjU1O2xldCBiPTQ7c3x8KGhbYisrXT1pLGhbYisrXT1jLGhbYisrXT1sLGhbYisrXT11KTtjb25zdCBkPXIubGVuZ3RoO2ZvcihsZXQgZT0wO2U8ZDtlKyspaFtiKytdPXJbZV19KShtLGIsZCxhLG8scyxjLFRuKGwsdSwhMSksUm4obCx1LCExKSxNbihsLHUsITEpLHUpLHJuKG0pO2NvbnN0IHY9Zi50ZXh0dXJlO3JldHVybiBMKGUpLGVlKGYsITEpLGgmJnIuYmluZChoKSx2fSxycj0oZSx0LG4sYT0wLG89MCxzPTAsaT0wLGM9MCxsPTAsdT0wLGg9MCxiPTIsZD0wLGY9MCk9Pntjb25zdCBtPXIuY3VycmVudEF0dGFjaG1lbnRPYmplY3Qsdj15KCksXz1NYXRoLnNxcnQodFswXSp0WzBdK3RbMV0qdFsxXSkvdixwPU1hdGguc3FydCh0WzJdKnRbMl0rdFszXSp0WzNdKS92LGc9ZS53aWR0aCx4PWUuaGVpZ2h0LEU9Zy9fLEE9eC9wLFQ9aGUoZyx4LCExKTtyLmJpbmQoVCk7Y29uc3QgUj1wbihhLG8sbik7ZW4oZSxSKTtjb25zdCBNPSgoZSx0LG4pPT57Y29uc3Qgcj1gZCR7ZX0ke3R9JHtufWA7aWYoRW4uaGFzKHIpKXJldHVybiBFbi5nZXQocik7Y29uc3QgYT1uZXcgTXQoIiN2ZXJzaW9uIDMwMCBlc1xuXG5sYXlvdXQgKGxvY2F0aW9uID0gMCkgaW4gdmVjMiBhX3ZlcnRleDtcblxub3V0IHZlYzIgdl9jb29yZDtcblxudm9pZCBtYWluKCkge1xuICAgIHZfY29vcmQgPSBhX3ZlcnRleDtcblxuICAgIHZlYzIgcG9zaXRpb24gPSBhX3ZlcnRleCAqIDIuMCAtIDEuMDtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuMCwgMS4wKTtcbn0iLCgoZSx0LG4scik9PntsZXQgYSxvLHM7c3dpdGNoKHQpe2Nhc2UgMTphPSJtYXBfY29sb3IuciI7YnJlYWs7Y2FzZSAyOmE9Im1hcF9jb2xvci5nIjticmVhaztjYXNlIDQ6YT0ibWFwX2NvbG9yLmIiO2JyZWFrO2Nhc2UgODphPSJtYXBfY29sb3IuYSI7YnJlYWs7ZGVmYXVsdDphPSIwLjUifXN3aXRjaChuKXtjYXNlIDE6bz0ibWFwX2NvbG9yLnIiO2JyZWFrO2Nhc2UgMjpvPSJtYXBfY29sb3IuZyI7YnJlYWs7Y2FzZSA0Om89Im1hcF9jb2xvci5iIjticmVhaztjYXNlIDg6bz0ibWFwX2NvbG9yLmEiO2JyZWFrO2RlZmF1bHQ6bz0iMC41In1zd2l0Y2gocil7Y2FzZSAwOnM9IlxuICAgIHZlYzQgc291cmNlX2NvbG9yID0gdGV4dHVyZSh1X3RleHR1cmVzWzBdLCB1dik7XG4iO2JyZWFrO2Nhc2UgMzpzPSJcbiAgICB2ZWM0IHNvdXJjZV9jb2xvciA9dGV4dHVyZSh1X3RleHR1cmVzWzBdLCBtaXgodl9jb29yZCwgdXYsIHN0ZXAoYWJzKHV2IC0gdmVjMigwLjUpKSwgdmVjMigwLjUpKSkpO1xuIjticmVhaztjYXNlIDE6cz0iXG4gICAgdmVjNCBzdWJzdGl0dXRlX2NvbG9yID0gdV9tZWRpdW1wWzJdO1xuICAgIHZlYzQgc291cmNlX2NvbG9yID0gbWl4KHN1YnN0aXR1dGVfY29sb3IsIHRleHR1cmUodV90ZXh0dXJlc1swXSwgdXYpLCBpc0luc2lkZSh1dikpO1xuIjticmVhaztkZWZhdWx0OnM9IlxuICAgIHZlYzQgc291cmNlX2NvbG9yID0gdGV4dHVyZSh1X3RleHR1cmVzWzBdLCBmcmFjdCh1dikpO1xuIn1yZXR1cm5gI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxudW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlc1syXTtcbnVuaWZvcm0gdmVjNCB1X21lZGl1bXBbJHtlfV07XG5cbmluIHZlYzIgdl9jb29yZDtcbm91dCB2ZWM0IG9fY29sb3I7XG5cblxuZmxvYXQgaXNJbnNpZGUoaW4gdmVjMiB1dikge1xuICAgIHJldHVybiBzdGVwKDQuMCwgZG90KHN0ZXAodmVjNCgwLjAsIHV2LngsIDAuMCwgdXYueSksIHZlYzQodXYueCwgMS4wLCB1di55LCAxLjApKSwgdmVjNCgxLjApKSk7XG59XG5cbnZvaWQgbWFpbigpIHtcbiAgICB2ZWMyIHV2X3RvX3N0X3NjYWxlICA9IHVfbWVkaXVtcFswXS54eTtcbiAgICB2ZWMyIHV2X3RvX3N0X29mZnNldCA9IHVfbWVkaXVtcFswXS56dztcbiAgICB2ZWMyIHNjYWxlICAgICAgICAgICA9IHVfbWVkaXVtcFsxXS54eTtcblxuICAgIHZlYzIgc3QgPSB2X2Nvb3JkICogdXZfdG9fc3Rfc2NhbGUgLSB1dl90b19zdF9vZmZzZXQ7XG4gICAgdmVjNCBtYXBfY29sb3IgPSB0ZXh0dXJlKHVfdGV4dHVyZXNbMV0sIHN0KTtcblxuICAgIHZlYzIgb2Zmc2V0ID0gdmVjMigke2F9LCAke299KSAtIDAuNTtcbiAgICB2ZWMyIHV2ID0gdl9jb29yZCArIG9mZnNldCAqIHNjYWxlO1xuICAgICR7c31cblxuICAgIG9fY29sb3IgPSBtaXgodGV4dHVyZSh1X3RleHR1cmVzWzBdLCB2X2Nvb3JkKSwgc291cmNlX2NvbG9yLCBpc0luc2lkZShzdCkpO1xufWB9KSgxPT09bj8zOjIsZSx0LG4pKTtyZXR1cm4gRW4uc2V0KHIsYSksYX0pKGMsbCxiKTsoKGUsdCxuLHIsYSxvLHMsaSxjLGwsdSxoLGIsZCk9Pntjb25zdCBmPWUudGV4dHVyZXM7ZlswXT0wLGZbMV09MTtjb25zdCBtPWUubWVkaXVtcDttWzBdPXIvdCxtWzFdPWEvbixtWzJdPW8vdCxtWzNdPShhLW4tcykvbixtWzRdPWkvcixtWzVdPS1jL2EsMT09PWwmJihtWzhdPXUsbVs5XT1oLG1bMTBdPWIsbVsxMV09ZCl9KShNLGcseCxFLEEscyxpLHUsaCxiLFRuKGQsZiwhMCksUm4oZCxmLCEwKSxNbihkLGYsITApLGYpLEx0KCkscm4oTSk7Y29uc3Qgdz1ULnRleHR1cmU7cmV0dXJuIG0mJnIuYmluZChtKSxMKGUpLEwoUiksZWUoVCwhMSksd30sYXI9KGUsdCxuLGEpPT57Y29uc3Qgbz1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LHM9ZS53aWR0aCxpPWUuaGVpZ2h0O3N3aXRjaChyLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbil7Y2FzZSJub3JtYWwiOmNhc2UibGF5ZXIiOmNhc2UiYWRkIjpjYXNlInNjcmVlbiI6Y2FzZSJhbHBoYSI6Y2FzZSJlcmFzZSI6Y2FzZSJjb3B5Ijp7ci5iaW5kKHIuJG1haW5BdHRhY2htZW50T2JqZWN0KSxyLnNldFRyYW5zZm9ybSgxLDAsMCwxLG4sYSk7Y29uc3Qgbz1obighMCk7KChlLHQsbixhKT0+e2NvbnN0IG89ZS5oaWdocCxzPXIuJG1hdHJpeDtvWzBdPXNbMF0sb1sxXT1zWzFdLG9bMl09c1szXSxvWzNdPXNbNF0sb1s0XT1zWzZdLG9bNV09c1s3XSxvWzZdPW4sb1s3XT1hLG9bOF09eCgpLG9bOV09RSgpO2NvbnN0IGk9ZS5tZWRpdW1wO2lbMF09dFswXSxpWzFdPXRbMV0saVsyXT10WzJdLGlbM109dFszXSxpWzRdPXRbNF0saVs1XT10WzVdLGlbNl09dFs2XSxpWzddPXRbN119KShvLHQscyxpKSxPZShlKSx2bihyLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbikscm4obyl9YnJlYWs7ZGVmYXVsdDp7Y29uc3Qgbz1zbihuLGEscyxpKSxjPWhlKHMsaSwhMSk7ci5iaW5kKGMpLGVuKG8sZSk7Y29uc3QgbD1IdChyLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbik7dW4obCx0WzBdLHRbMV0sdFsyXSx0WzNdLHRbNF0sdFs1XSx0WzZdLHRbN10pLHJuKGwpLHIuYmluZChyLiRtYWluQXR0YWNobWVudE9iamVjdCksci5yZXNldCgpLHIuc2V0VHJhbnNmb3JtKDEsMCwwLDEsbixhKSxsbihjLnRleHR1cmUpLEwobyksZWUoYyl9fW8mJnIuYmluZChvKSxMdCgpfSxvcj1bXSxzcj1lPT57ZS5zaXplJiZlLmNsZWFyKCksb3IucHVzaChlKX0saXI9KGUsdCxuLHIsYT1udWxsKT0+e3QuaGFzKG4pfHx0LnNldChuLG9yLnBvcCgpfHxuZXcgTWFwKTtjb25zdCBvPXQuZ2V0KG4pO2lmKG51bGw9PT1hKXtpZighby5oYXMocikpcmV0dXJuO3JldHVybiBlLmRlc3Ryb3koby5nZXQocikpLG8uZGVsZXRlKHIpLHZvaWQoby5zaXplfHwodC5kZWxldGUobiksc3IobykpKX1vLnNldChyLGEpfTtjb25zdCBjcj1uZXcgY2xhc3N7Y29uc3RydWN0b3IoKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiXyRwb29sIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIl8kc3RvcmUiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiXyR0cmFzaCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkdGltZXJJZCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkcmVtb3ZlQ2FjaGUiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJHJlbW92ZUlkcyIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLHRoaXMuXyRwb29sPVtdLHRoaXMuXyRzdG9yZT1uZXcgTWFwLHRoaXMuXyR0cmFzaD1uZXcgTWFwLHRoaXMuJHRpbWVySWQ9bnVsbCx0aGlzLiRyZW1vdmVJZHM9W10sdGhpcy4kcmVtb3ZlQ2FjaGU9ITF9cmVzZXQoKXsoKGUsdCxuKT0+e24uY2xlYXIoKSxudWxsIT09ZS4kdGltZXJJZCYmY2xlYXJUaW1lb3V0KGUuJHRpbWVySWQpO2Zvcihjb25zdCBuIG9mIHQudmFsdWVzKCkpe2Zvcihjb25zdCB0IG9mIG4udmFsdWVzKCkpdCYmZS5kZXN0cm95KHQpO3NyKG4pfXQuY2xlYXIoKX0pKHRoaXMsdGhpcy5fJHN0b3JlLHRoaXMuXyR0cmFzaCl9ZGVzdHJveShlPW51bGwpeygoZSx0KT0+e2lmKHQmJiJvYmplY3QiPT10eXBlb2YgdCYmImNhbnZhcyJpbiB0KXtjb25zdCBuPXQuY2FudmFzLHI9bi53aWR0aCxhPW4uaGVpZ2h0O3QuY2xlYXJSZWN0KDAsMCxyKzEsYSsxKSxuLndpZHRoPW4uaGVpZ2h0PTEsZS5wdXNoKG4pfX0pKHRoaXMuXyRwb29sLGUpfWdldENhbnZhcygpe3JldHVybiB0aGlzLl8kcG9vbC5wb3AoKXx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIil9cmVtb3ZlKGUsdCl7KChlLHQsbik9PntpZighZS5oYXModCkpcmV0dXJuO2NvbnN0IHI9ZS5nZXQodCk7ci5oYXMobikmJihyLmRlbGV0ZShuKSxyLnNpemV8fChzcihyKSxlLmRlbGV0ZSh0KSkpfSkodGhpcy5fJHN0b3JlLGUsdCl9cmVtb3ZlVGltZXIoZSl7KChlLHQsbixyKT0+e2lmKG4uaGFzKHIpKXJldHVybjtjb25zdCBhPXQuZ2V0KHIpO2EmJihhLnNldCgidHJhc2giLCEwKSxuLnNldChyLGEpLG51bGwhPT1lLiR0aW1lcklkJiZjbGVhclRpbWVvdXQoZS4kdGltZXJJZCksZS4kcmVtb3ZlQ2FjaGU9ITEsZS4kdGltZXJJZD1zZXRUaW1lb3V0KCgpPT57ZS4kcmVtb3ZlQ2FjaGU9ITAsZS4kdGltZXJJZD1udWxsfSwxZTMpKX0pKHRoaXMsdGhpcy5fJHN0b3JlLHRoaXMuXyR0cmFzaCxlKX1yZW1vdmVUaW1lclNjaGVkdWxlZENhY2hlKCl7KChlLHQpPT57aWYodC5zaXplKXtmb3IoY29uc3RbbixyXW9mIHQpci5oYXMoInRyYXNoIikmJihlLnJlbW92ZUJ5SWQobiksZS4kcmVtb3ZlSWRzLnB1c2goK24pKTt0LmNsZWFyKCksZS4kcmVtb3ZlQ2FjaGU9ITF9fSkodGhpcyx0aGlzLl8kdHJhc2gpfXJlbW92ZUJ5SWQoZSl7KChlLHQsbik9PntpZighdC5oYXMobikpcmV0dXJuO2NvbnN0IHI9dC5nZXQobik7Zm9yKGNvbnN0IHQgb2Ygci52YWx1ZXMoKSllLmRlc3Ryb3kodCk7dC5kZWxldGUobiksc3Iocil9KSh0aGlzLHRoaXMuXyRzdG9yZSxlKX1nZXRCeUlkKGUpe3JldHVybiB0aGlzLl8kc3RvcmUuZ2V0KGUpfWdldChlLHQpe3JldHVybigoZSx0LG4pPT57Y29uc3Qgcj1lLmdldCh0KXx8bnVsbDtyZXR1cm4gcj8oci5kZWxldGUoInRyYXNoIiksci5nZXQobil8fG51bGwpOm51bGx9KSh0aGlzLl8kc3RvcmUsZSx0KX1zZXQoZSx0LG49bnVsbCl7aXIodGhpcyx0aGlzLl8kc3RvcmUsZSx0LG4pfWhhcyhlLHQ9IiIpe3JldHVybigoZSx0LG49IiIpPT5uPyEhZS5oYXModCkmJmUuZ2V0KHQpLmhhcyhuKTplLmhhcyh0KSkodGhpcy5fJHN0b3JlLGUsdCl9Z2VuZXJhdGVLZXlzKGUsdCxuKXtyZXR1cm4oKGUsdCxuKT0+e2NvbnN0IHI9WzEwMCplLDEwMCp0XTtuJiZyLnB1c2goMTAwKm4pO2xldCBhPTIxNjYxMzYyNjE7Zm9yKGxldCBlPTA7ZTxyLmxlbmd0aDsrK2Upe2xldCB0PTB8cltlXTtmb3IobGV0IGU9MDtlPDQ7ZSsrKWFePTI1NSZ0LGE9TWF0aC5pbXVsKGEsMTY3Nzc2MTkpLHQ+Pj49OH1yZXR1cm4oYT4+PjApJTE2Nzc3MjE2fSkoZSx0LG4pfWdlbmVyYXRlRmlsdGVyS2V5cyhlLHQsbixyKXtyZXR1cm4oKGUsdCxuLHIpPT5gJHtlfSR7dH0ke259JHtyfWApKGUsdCxuLHIpfX0sbHI9KGUsdCxuLGEsbyxzLGksYyxsLHUsaCk9Pntjb25zdCBiPXIuY3VycmVudEF0dGFjaG1lbnRPYmplY3Q7bGV0IGQ9bnVsbDtjb25zdCBmPU1hdGguc3FydChpWzBdKmlbMF0raVsxXSppWzFdKSxfPU1hdGguc3FydChpWzJdKmlbMl0raVszXSppWzNdKSxwPWNyLmdlbmVyYXRlRmlsdGVyS2V5cyhpWzBdLGlbMV0saVsyXSxpWzNdKTtsZXQgZz0hMTtpZihjci5nZXQodCwiZktleSIpPT09cCl7Y29uc3QgZT1jci5nZXQodCwiZlRleHR1cmUiKTtuP0woZSk6KGc9ITAsZD1lKX1sZXQgeD0wLEU9MDtpZihnKXg9Y3IuZ2V0KHQsIm9mZnNldFgiKSxFPWNyLmdldCh0LCJvZmZzZXRZIik7ZWxzZXtkPUp0KGUpO2NvbnN0IHQ9TWF0aC5hdGFuMihpWzFdLGlbMF0pLG49TWF0aC5hdGFuMigtaVsyXSxpWzNdKSxjPXM/ZipNYXRoLmNvcyh0KTpNYXRoLmNvcyh0KSxsPXM/ZipNYXRoLnNpbih0KTpNYXRoLnNpbih0KSx1PXM/LV8qTWF0aC5zaW4obik6LU1hdGguc2luKG4pLHA9cz9fKk1hdGguY29zKG4pOk1hdGguY29zKG4pLGc9bShjLGwsdSxwLGEvMixvLzIpLEE9bSgxLDAsMCwxLC1lLncvMiwtZS5oLzIpLHk9KChlLHQpPT57Y29uc3Qgbj1lWzBdLHI9ZVsxXSxhPWVbMl0sbz1lWzNdLHM9ZVs0XSxpPWVbNV0sYz10WzBdLGw9dFsxXSx1PXRbMl0saD10WzNdLGI9dFs0XSxkPXRbNV07cmV0dXJuIG0obipjK2EqbCxyKmMrbypsLG4qdSthKmgscip1K28qaCxuKmIrYSpkK3MscipiK28qZCtpKX0pKGcsQSk7aWYodihnKSx2KEEpLDEhPT15WzBdfHwwIT09eVsxXXx8MCE9PXlbMl18fDEhPT15WzNdKXtjb25zdCBlPWhlKGEsbywhMSk7ci5iaW5kKGUpLHIucmVzZXQoKSxyLnNldFRyYW5zZm9ybSh5WzBdLHlbMV0seVsyXSx5WzNdLHlbNF0seVs1XSkseD15WzRdLEU9eVs1XSxPZShkKTtjb25zdCB0PWhuKCk7Ym4odCxkLndpZHRoLGQuaGVpZ2h0KSxybih0KSxMKGQpLGQ9ZS50ZXh0dXJlLGVlKGUsITEpLGImJnIuYmluZChiKX12KHkpLHluLng9MCx5bi55PTA7Zm9yKGxldCBlPTA7aC5sZW5ndGg+ZTspe3N3aXRjaChoW2UrK10pe2Nhc2UgMDpkPUhuKGQsaSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLEJvb2xlYW4oaFtlKytdKSk7YnJlYWs7Y2FzZSAxOmQ9Rm4oZCxpLGhbZSsrXSxoW2UrK10saFtlKytdKTticmVhaztjYXNlIDI6ZD0kbihkLG5ldyBGbG9hdDMyQXJyYXkoW2hbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK11dKSk7YnJlYWs7Y2FzZSAzOntjb25zdCB0PWhbZSsrXSxuPWhbZSsrXSxyPXQqbixhPWguc3ViYXJyYXkoZSxlK3IpO2UrPXIsZD1ucihkLHQsbixhLGhbZSsrXSxoW2UrK10sQm9vbGVhbihoW2UrK10pLEJvb2xlYW4oaFtlKytdKSxoW2UrK10saFtlKytdKX1icmVhaztjYXNlIDQ6e2NvbnN0IHQ9aFtlKytdLG49bmV3IFVpbnQ4QXJyYXkodCk7bi5zZXQoaC5zdWJhcnJheShlLGUrdCkpLGUrPXQsZD1ycihkLGksbixoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdKX1icmVhaztjYXNlIDU6ZD1xbihkLGksaFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxCb29sZWFuKGhbZSsrXSksQm9vbGVhbihoW2UrK10pLEJvb2xlYW4oaFtlKytdKSk7YnJlYWs7Y2FzZSA2OmQ9R24oZCxpLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLEJvb2xlYW4oaFtlKytdKSxCb29sZWFuKGhbZSsrXSkpO2JyZWFrO2Nhc2UgNzp7Y29uc3QgdD1oW2UrK10sbj1oW2UrK107bGV0IHI9aFtlKytdO2NvbnN0IGE9aC5zdWJhcnJheShlLGUrcik7ZSs9cixyPWhbZSsrXTtjb25zdCBvPWguc3ViYXJyYXkoZSxlK3IpO2UrPXIscj1oW2UrK107Y29uc3Qgcz1oLnN1YmFycmF5KGUsZStyKTtlKz1yLGQ9UW4oZCxpLHQsbixhLG8scyxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLEJvb2xlYW4oaFtlKytdKSl9YnJlYWs7Y2FzZSA4Ontjb25zdCB0PWhbZSsrXSxuPWhbZSsrXTtsZXQgcj1oW2UrK107Y29uc3QgYT1oLnN1YmFycmF5KGUsZStyKTtlKz1yLHI9aFtlKytdO2NvbnN0IG89aC5zdWJhcnJheShlLGUrcik7ZSs9cixyPWhbZSsrXTtjb25zdCBzPWguc3ViYXJyYXkoZSxlK3IpO2UrPXIsZD1lcihkLGksdCxuLGEsbyxzLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10sQm9vbGVhbihoW2UrK10pKX19fX1pZihkKXtjb25zdCBlPXkoKSx0PXVbMF0qKGYvZSksbj11WzFdKihfL2UpO3IucmVzZXQoKSxyLnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCksci5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249bCxhcihkLGMsLXgrdCtpWzRdLC1FK24raVs1XSl9Z3x8KGNyLnNldCh0LCJmS2V5IixwKSxjci5zZXQodCwiZlRleHR1cmUiLGQpLGNyLnNldCh0LCJvZmZzZXRYIix4KSxjci5zZXQodCwib2Zmc2V0WSIsRSkpLGImJnIuYmluZChiKX0sdXI9KGUsdCxyLGEpPT57bi5zdGVuY2lsRnVuYyhuLkFMV0FZUywwLDI1NSksbi5zdGVuY2lsT3BTZXBhcmF0ZShuLkZST05ULG4uS0VFUCxuLktFRVAsbi5JTkNSX1dSQVApLG4uc3RlbmNpbE9wU2VwYXJhdGUobi5CQUNLLG4uS0VFUCxuLktFRVAsbi5ERUNSX1dSQVApLG4uY29sb3JNYXNrKCExLCExLCExLCExKTtjb25zdCBvPSEhYSxzPSR0KG8pO2EmJk90KHMsYSksbi5lbmFibGUobi5TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UpLFV0KHMsZSx0LHIpLG4uZGlzYWJsZShuLlNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSksbi5zdGVuY2lsRnVuYyhuLk5PVEVRVUFMLDAsMjU1KSxuLnN0ZW5jaWxPcChuLktFRVAsbi5aRVJPLG4uWkVSTyksbi5jb2xvck1hc2soITAsITAsITAsITApO2NvbnN0IGk9KGU9Pntjb25zdCB0PSJzIisoZT8ieSI6Im4iKTtpZih3dC5oYXModCkpcmV0dXJuIHd0LmdldCh0KTtjb25zdCBuPW5ldyBNdChGdChlPzk6MCwhMSwhMSxlKSwiI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxuaW4gdmVjNCB2X2NvbG9yO1xub3V0IHZlYzQgb19jb2xvcjtcblxudm9pZCBtYWluKCkge1xuICAgIG9fY29sb3IgPSB2ZWM0KHZfY29sb3IucmdiICogdl9jb2xvci5hLCB2X2NvbG9yLmEpO1xufSIpO3JldHVybiB3dC5zZXQodCxuKSxufSkobyk7YSYmKChlLHQpPT57Y29uc3Qgbj1lLmhpZ2hwO25bMF09dFswXSxuWzFdPXRbMV0sblsyXT0wLG5bNF09dFsyXSxuWzVdPXRbM10sbls2XT0wLG5bOF09dFs0XSxuWzldPXRbNV0sblsxMF09MSxuWzEyXT10WzZdLG5bMTNdPXRbN10sblsxNF09MCxuWzE2XT10WzhdLG5bMTddPXRbOV0sblsxOF09MCxuWzIwXT10WzEwXSxuWzIxXT10WzExXSxuWzIyXT0xLG5bM109eCgpLG5bN109RSgpLG5bMTFdPXRbMTJdLG5bMTVdPXRbMTNdLG5bMTldPXRbMTRdLG5bMjNdPXRbMTVdLG5bMjRdPXRbMTZdLG5bMjVdPXRbMTddLG5bMjZdPXRbMThdLG5bMjddPXRbMTldLG5bMjhdPXRbMjBdLG5bMjldPXRbMjFdLG5bMzBdPXRbMjJdLG5bMzFdPXRbMjNdLG5bMzJdPXRbMjRdLG5bMzNdPXRbMjVdfSkoaSxhKSxVdChpLGUsdCxyKX0saHI9KGUsdCxuLHIsYSk9Pntjb25zdCBvPWUubWVkaXVtcDtsZXQgcz0wO2ZvcihsZXQgZT1uO2U8cjsrK2Upe2NvbnN0IG49NSplO29bcysrXT1hW3RbbisxXV0sb1tzKytdPWFbdFtuKzJdXSxvW3MrK109YVt0W24rM11dLG9bcysrXT1hW3Rbbis0XV19Zm9yKGxldCBlPW47ZTxyOysrZSlvW3MrK109dFs1KmVdfSxicj0oZSx0KT0+e2NvbnN0IGE9ci5jdXJyZW50QXR0YWNobWVudE9iamVjdCxvPW4uZ2V0UGFyYW1ldGVyKG4uU0NJU1NPUl9CT1gpO24uZGlzYWJsZShuLlNDSVNTT1JfVEVTVCk7Y29uc3Qgcz1EbigpO3IuYmluZChzKTtjb25zdCBpPTA9PT10LGM9ZS5sZW5ndGgvNSxsPWk/em46Vm47Y24oKTtjb25zdCB1PVhuKCk7Zm9yKGxldCB0PTA7dDxjO3QrPXUtMSl7Y29uc3Qgbj1NYXRoLm1pbih0K3UsYykscj1QbihuLXQsaSk7aHIocixlLHQsbixsKSxVbihyLGVbMF0sZVtlLmxlbmd0aC01XSl9cmV0dXJuIEx0KCksYSYmci5iaW5kKGEpLE5lKG9bMF0sb1sxXSxvWzJdLG9bM10pLHMudGV4dHVyZX0sZHI9bmV3IE1hcCxmcj0oZSx0LG4scik9Pntjb25zdCBhPSgoZSx0LG4scik9PmAke2U/InkiOiJuIn0ke3Q/InkiOiJuIn0ke3QmJm4/InkiOiJuIn0ke3J9YCkocixlLHQsbik7aWYoZHIuaGFzKGEpKXJldHVybiBkci5nZXQoYSk7Y29uc3Qgbz0xKyhyPzE0OjUpLHM9by0xLGk9bmV3IE10KEZ0KG8sITAsITEsciksKChlLHQsbixyLGEpPT57Y29uc3Qgbz1uPygoZSx0KT0+e2NvbnN0IG49dD8oZT0+YFxuICAgIHZlYzIgZm9jYWwgPSB2ZWMyKHVfaGlnaHBbJHtlfV1bMV0sIDAuMCk7XG5cbiAgICB2ZWMyIGRpciA9IG5vcm1hbGl6ZShjb29yZCAtIGZvY2FsKTtcblxuICAgIGZsb2F0IGEgPSBkb3QoZGlyLCBkaXIpO1xuICAgIGZsb2F0IGIgPSAyLjAgKiBkb3QoZGlyLCBmb2NhbCk7XG4gICAgZmxvYXQgYyA9IGRvdChmb2NhbCwgZm9jYWwpIC0gMS4wO1xuICAgIGZsb2F0IHggPSAoLWIgKyBzcXJ0KGIgKiBiIC0gNC4wICogYSAqIGMpKSAvICgyLjAgKiBhKTtcblxuICAgIGZsb2F0IHQgPSBkaXN0YW5jZShmb2NhbCwgY29vcmQpIC8gZGlzdGFuY2UoZm9jYWwsIGZvY2FsICsgZGlyICogeCk7YCkoZSk6ImZsb2F0IHQgPSBsZW5ndGgoY29vcmQpOyI7cmV0dXJuYFxuICAgIGZsb2F0IHJhZGl1cyA9IHVfaGlnaHBbJHtlfV1bMF07XG4gICAgdmVjMiBjb29yZCA9IHAgLyByYWRpdXM7XG4gICAgJHtufVxuYH0pKHQscik6KGU9PmBcbiAgICB2ZWMyIGEgPSB1X2hpZ2hwWyR7ZX1dLnh5O1xuICAgIHZlYzIgYiA9IHVfaGlnaHBbJHtlfV0uenc7XG5cbiAgICB2ZWMyIGFiID0gYiAtIGE7XG4gICAgdmVjMiBhcCA9IHAgLSBhO1xuXG4gICAgZmxvYXQgdCA9IGRvdChhYiwgYXApIC8gZG90KGFiLCBhYik7YCkodCk7bGV0IHM7c3dpdGNoKGEpe2Nhc2UgMDpzPSIxLjAgLSBhYnMoZnJhY3QodCAqIDAuNSkgKiAyLjAgLSAxLjApIjticmVhaztjYXNlIDE6cz0iZnJhY3QodCkiO2JyZWFrO2RlZmF1bHQ6cz0iY2xhbXAodCwgMC4wLCAxLjApIn1yZXR1cm5gI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gaGlnaHAgZmxvYXQ7XG5cbnVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZTtcbnVuaWZvcm0gdmVjNCB1X2hpZ2hwWyR7ZX1dO1xuICAgIFxuaW4gdmVjMiB2X3V2O1xub3V0IHZlYzQgb19jb2xvcjtcbiAgICBcbnZvaWQgbWFpbigpIHtcbiAgICB2ZWMyIHAgPSB2X3V2O1xuICAgICR7b31cbiAgICB0ID0gJHtzfTtcbiAgICBvX2NvbG9yID0gdGV4dHVyZSh1X3RleHR1cmUsIHZlYzIodCwgMC41KSk7XG59YH0pKG8scyxlLHQsbikpO3JldHVybiBkci5zZXQoYSxpKSxpfSxtcj0oZSx0LG4scixvPTAscz1udWxsLGk9bnVsbCk9Pntjb25zdCBjPWUuaGlnaHA7Y1swXT1uWzBdLGNbMV09blsxXSxjWzJdPW5bMl0sY1s0XT1uWzNdLGNbNV09bls0XSxjWzZdPW5bNV0sY1s4XT1uWzZdLGNbOV09bls3XSxjWzEwXT1uWzhdLGNbMTJdPXJbMF0sY1sxM109clsxXSxjWzE0XT1yWzJdLGNbMTZdPXJbM10sY1sxN109cls0XSxjWzE4XT1yWzVdLGNbMTFdPXJbNl0sY1sxNV09cls3XSxjWzE5XT1yWzhdLGNbM109eCgpLGNbN109RSgpO2xldCBsPTIwO2kmJihjWzIwXT1pWzBdLGNbMjFdPWlbMV0sY1syMl09MCxjWzI0XT1pWzJdLGNbMjVdPWlbM10sY1syNl09MCxjWzI4XT1pWzRdLGNbMjldPWlbNV0sY1szMF09MSxjWzMyXT1pWzZdLGNbMzNdPWlbN10sY1szNF09MCxjWzM2XT1pWzhdLGNbMzddPWlbOV0sY1szOF09MCxjWzQwXT1pWzEwXSxjWzQxXT1pWzExXSxjWzQyXT0xLGNbMzFdPWlbMTJdLGNbMzVdPWlbMTNdLGNbMzldPWlbMTRdLGNbNDNdPWlbMTVdLGNbNDRdPWlbMTZdLGNbNDVdPWlbMTddLGNbNDZdPWlbMThdLGNbNDddPWlbMTldLGNbNDhdPWlbMjBdLGNbNDldPWlbMjFdLGNbNTBdPWlbMjJdLGNbNTFdPWlbMjNdLGNbNTJdPWlbMjRdLGNbNTNdPWlbMjVdLGw9NTYpLDA9PT10PyhjW2wrK109c1swXSxjW2wrK109c1sxXSxjW2wrK109c1syXSxjW2xdPXNbM10pOihjW2wrK109ODE5LjIsY1tsXT1hKG8sLS45NzUsLjk3NSwwKSl9LHZyPShlLHQsYSxvKT0+e2NvbnN0IHM9cWUuc2hpZnQoKSxpPXFlLnNoaWZ0KCksYz1xZS5zaGlmdCgpLGw9cWUuc2hpZnQoKTtuLmRpc2FibGUobi5TVEVOQ0lMX1RFU1QpO2NvbnN0IGI9YnIocyxsKTtPZShiKSxuLmVuYWJsZShuLlNURU5DSUxfVEVTVCksbi5mcm9udEZhY2Uobi5DQ1cpLG4uc3RlbmNpbE1hc2soMjU1KSxuLnN0ZW5jaWxGdW5jKG4uQUxXQVlTLDAsMjU1KSxuLnN0ZW5jaWxPcFNlcGFyYXRlKG4uRlJPTlQsbi5LRUVQLG4uS0VFUCxuLklOQ1JfV1JBUCksbi5zdGVuY2lsT3BTZXBhcmF0ZShuLkJBQ0ssbi5LRUVQLG4uS0VFUCxuLkRFQ1JfV1JBUCksbi5jb2xvck1hc2soITEsITEsITEsITEpO2NvbnN0IGQ9ISFvLGY9JHQoZCk7byYmT3QoZixvKSxuLmVuYWJsZShuLlNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSksVXQoZixlLHQsYSksbi5kaXNhYmxlKG4uU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFKSxuLnN0ZW5jaWxGdW5jKG4uTk9URVFVQUwsMCwyNTUpLG4uc3RlbmNpbE9wKG4uS0VFUCxuLlpFUk8sbi5aRVJPKSxuLmNvbG9yTWFzayghMCwhMCwhMCwhMCk7Y29uc3QgbT1mcighMSwhMSxjLGQpLHA9KGU9Pntjb25zdCB0PS04MTkuMiplWzBdLTgxOS4yKmVbMl0rZVs0XSxuPTgxOS4yKmVbMF0tODE5LjIqZVsyXStlWzRdLHI9LTgxOS4yKmVbMF0rODE5LjIqZVsyXStlWzRdLGE9LTgxOS4yKmVbMV0tODE5LjIqZVszXStlWzVdLG89ODE5LjIqZVsxXS04MTkuMiplWzNdK2VbNV07bGV0IHM9ci10LGk9LTgxOS4yKmVbMV0rODE5LjIqZVszXStlWzVdLWE7Y29uc3QgYz1NYXRoLnNxcnQocypzK2kqaSk7Yz8ocy89YyxpLz1jKToocz0wLGk9MCk7Y29uc3QgbD0obi10KSpzKyhvLWEpKmk7cmV0dXJuIHUodCtsKnMsYStsKmksbixvKX0pKGkpLGc9XyhyLiRtYXRyaXgpO21yKG0sMCxyLiRtYXRyaXgsZywwLHAsbyksaChwKSx2KGcpLFV0KG0sZSx0LGEpfSxfcj0oZSx0LGEsbyk9Pntjb25zdCBzPXFlLnNoaWZ0KCksaT1xZS5zaGlmdCgpLGM9cWUuc2hpZnQoKSxsPXFlLnNoaWZ0KCksdT1xZS5zaGlmdCgpO24uZGlzYWJsZShuLlNURU5DSUxfVEVTVCk7Y29uc3QgaD1icihzLGwpO09lKGgpLG4uZW5hYmxlKG4uU1RFTkNJTF9URVNUKSxuLmZyb250RmFjZShuLkNDVyksbi5zdGVuY2lsTWFzaygyNTUpLG4uc3RlbmNpbEZ1bmMobi5BTFdBWVMsMCwyNTUpLG4uc3RlbmNpbE9wU2VwYXJhdGUobi5GUk9OVCxuLktFRVAsbi5LRUVQLG4uSU5DUl9XUkFQKSxuLnN0ZW5jaWxPcFNlcGFyYXRlKG4uQkFDSyxuLktFRVAsbi5LRUVQLG4uREVDUl9XUkFQKSxuLmNvbG9yTWFzayghMSwhMSwhMSwhMSk7Y29uc3QgYj0hIW8sZD0kdChiKTtvJiZPdChkLG8pLG4uZW5hYmxlKG4uU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFKSxVdChkLGUsdCxhKSxuLmRpc2FibGUobi5TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UpLG4uc3RlbmNpbEZ1bmMobi5OT1RFUVVBTCwwLDI1NSksbi5zdGVuY2lsT3Aobi5LRUVQLG4uWkVSTyxuLlpFUk8pLG4uY29sb3JNYXNrKCEwLCEwLCEwLCEwKSxyLnNhdmUoKSxyLnRyYW5zZm9ybShpWzBdLGlbMV0saVsyXSxpWzNdLGlbNF0saVs1XSk7Y29uc3QgZj1yLiRzdGFja1tyLiRzdGFjay5sZW5ndGgtMV0sbT1fKHIuJG1hdHJpeCkscD1mcighMCxCb29sZWFuKHUpLGMsYik7bXIocCwxLGYsbSx1LG8pLHIucmVzdG9yZSgpLHYobSksVXQocCxlLHQsYSl9LHByPW5ldyBNYXAsZ3I9KGUsdCxhLG8pPT57bi5zdGVuY2lsRnVuYyhuLkFMV0FZUywwLDI1NSksbi5zdGVuY2lsT3BTZXBhcmF0ZShuLkZST05ULG4uS0VFUCxuLktFRVAsbi5JTkNSX1dSQVApLG4uc3RlbmNpbE9wU2VwYXJhdGUobi5CQUNLLG4uS0VFUCxuLktFRVAsbi5ERUNSX1dSQVApLG4uY29sb3JNYXNrKCExLCExLCExLCExKTtjb25zdCBzPSEhbyxpPSR0KHMpO28mJk90KGksbyksbi5lbmFibGUobi5TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UpLFV0KGksZSx0LGEpLG4uZGlzYWJsZShuLlNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSk7Y29uc3QgYz14bi5zaGlmdCgpLGw9eG4uc2hpZnQoKSx1PXhuLnNoaWZ0KCksaD14bi5zaGlmdCgpLGI9eG4uc2hpZnQoKSxkPXhuLnNoaWZ0KCksZj1wbih1LGgsYyxkKTtyLnNhdmUoKSxyLnRyYW5zZm9ybShsWzBdLGxbMV0sbFsyXSxsWzNdLGxbNF0sbFs1XSksbi5zdGVuY2lsRnVuYyhuLk5PVEVRVUFMLDAsMjU1KSxuLnN0ZW5jaWxPcChuLktFRVAsbi5aRVJPLG4uWkVSTyksbi5jb2xvck1hc2soITAsITAsITAsITApO2NvbnN0IG09KChlLHQpPT57Y29uc3Qgbj1gYiR7ZT8ieSI6Im4ifSR7dD8ieSI6Im4ifWA7aWYocHIuaGFzKG4pKXJldHVybiBwci5nZXQobik7Y29uc3Qgcj1lPyIjdmVyc2lvbiAzMDAgZXNcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXG51bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmU7XG51bmlmb3JtIHZlYzQgdV9tZWRpdW1wWzFdO1xuXG5pbiB2ZWMyIHZfdXY7XG5vdXQgdmVjNCBvX2NvbG9yO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdmVjMiB1diA9IGZyYWN0KHZlYzIodl91di54LCAtdl91di55KSAvIHVfbWVkaXVtcFswXS54eSk7XG4gICAgXG4gICAgdmVjNCBzcmMgPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdXYpO1xuICAgIG9fY29sb3IgPSBzcmM7XG59IjoiI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxudW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlO1xudW5pZm9ybSB2ZWM0IHVfbWVkaXVtcFsxXTtcblxuaW4gdmVjMiB2X3V2O1xub3V0IHZlYzQgb19jb2xvcjtcblxudm9pZCBtYWluKCkge1xuICAgIHZlYzIgdXYgPSB2ZWMyKHZfdXYueCwgdV9tZWRpdW1wWzBdLnkgLSB2X3V2LnkpIC8gdV9tZWRpdW1wWzBdLnh5O1xuXG4gICAgdmVjNCBzcmMgPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdXYpO1xuICAgIG9fY29sb3IgPSBzcmM7XG59IixhPW5ldyBNdChGdCh0PzE0OjUsITAsITEsdCkscik7cmV0dXJuIHByLnNldChuLGEpLGF9KShiLHMpOygoZSx0LG4sYSk9Pntjb25zdCBvPWUuaGlnaHAscz1yLiRzdGFja1tyLiRzdGFjay5sZW5ndGgtMV07b1swXT1zWzBdLG9bMV09c1sxXSxvWzJdPXNbMl0sb1s0XT1zWzNdLG9bNV09c1s0XSxvWzZdPXNbNV0sb1s4XT1zWzZdLG9bOV09c1s3XSxvWzEwXT1zWzhdO2NvbnN0IGk9XyhyLiRtYXRyaXgpO29bMTJdPWlbMF0sb1sxM109aVsxXSxvWzE0XT1pWzJdLG9bMTZdPWlbM10sb1sxN109aVs0XSxvWzE4XT1pWzVdLG9bMTFdPWlbNl0sb1sxNV09aVs3XSxvWzE5XT1pWzhdLG9bM109eCgpLG9bN109RSgpLGEmJihvWzIwXT1hWzBdLG9bMjFdPWFbMV0sb1syMl09MCxvWzI0XT1hWzJdLG9bMjVdPWFbM10sb1syNl09MCxvWzI4XT1hWzRdLG9bMjldPWFbNV0sb1szMF09MSxvWzMyXT1hWzZdLG9bMzNdPWFbN10sb1szNF09MCxvWzM2XT1hWzhdLG9bMzddPWFbOV0sb1szOF09MCxvWzQwXT1hWzEwXSxvWzQxXT1hWzExXSxvWzQyXT0xLG9bMzFdPWFbMTJdLG9bMzVdPWFbMTNdLG9bMzldPWFbMTRdLG9bNDNdPWFbMTVdLG9bNDRdPWFbMTZdLG9bNDVdPWFbMTddLG9bNDZdPWFbMThdLG9bNDddPWFbMTldLG9bNDhdPWFbMjBdLG9bNDldPWFbMjFdLG9bNTBdPWFbMjJdLG9bNTFdPWFbMjNdLG9bNTJdPWFbMjRdLG9bNTNdPWFbMjVdKTtjb25zdCBjPWUubWVkaXVtcDtjWzBdPXQsY1sxXT1ufSkobSx1LGgsbyksVXQobSxlLHQsYSksci5yZXN0b3JlKCksTChmKX07bGV0IHhyPTA7Y29uc3QgRXI9bmV3IEZsb2F0MzJBcnJheSgyNTYpO2ZvcihsZXQgZT0xO2U8MjU2O2UrKylFcltlXT0yNTUvZTtjb25zdCBBcj1hc3luYyhlLHQpPT57Y29uc3QgYT1vbigwLDAsZSx0KTtPZShhKSxuLmJpbmRGcmFtZWJ1ZmZlcihuLkZSQU1FQlVGRkVSLFopLG4uZnJhbWVidWZmZXJUZXh0dXJlMkQobi5GUkFNRUJVRkZFUixuLkNPTE9SX0FUVEFDSE1FTlQwLG4uVEVYVFVSRV8yRCxhLnJlc291cmNlLDApO2NvbnN0IG89bmV3IFVpbnQ4QXJyYXkoZSp0KjQpLHM9ci4kbWFpbkF0dGFjaG1lbnRPYmplY3Q7by5ieXRlTGVuZ3RoPnhyJiYoeHI9YyhvLmJ5dGVMZW5ndGgpLG4uYnVmZmVyRGF0YShuLlBJWEVMX1BBQ0tfQlVGRkVSLHhyLG4uU1RSRUFNX1JFQUQpKSxuLnJlYWRQaXhlbHMoMCxzLmhlaWdodC10LGUsdCxuLlJHQkEsbi5VTlNJR05FRF9CWVRFLDApO2NvbnN0IGk9bi5mZW5jZVN5bmMobi5TWU5DX0dQVV9DT01NQU5EU19DT01QTEVURSwwKTthd2FpdCBuZXcgUHJvbWlzZShlPT57Y29uc3QgdD0oKT0+e2lmKG4uY2xpZW50V2FpdFN5bmMoaSxuLlNZTkNfRkxVU0hfQ09NTUFORFNfQklULDApIT09bi5USU1FT1VUX0VYUElSRUQpcmV0dXJuIG4uZGVsZXRlU3luYyhpKSxuLmdldEJ1ZmZlclN1YkRhdGEobi5QSVhFTF9QQUNLX0JVRkZFUiwwLG8pLGUoKTtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUodCl9O3QoKX0pLG4uYmluZEZyYW1lYnVmZmVyKG4uRlJBTUVCVUZGRVIsRCk7Zm9yKGxldCBlPTA7ZTxvLmxlbmd0aDtlKz00KXtjb25zdCB0PW9bZSszXTtpZigwPT09dHx8MjU1PT09dCljb250aW51ZTtjb25zdCBuPUVyW3RdO29bZV09TWF0aC5taW4oMjU1LE1hdGgucm91bmQob1tlXSpuKSksb1tlKzFdPU1hdGgubWluKDI1NSxNYXRoLnJvdW5kKG9bZSsxXSpuKSksb1tlKzJdPU1hdGgubWluKDI1NSxNYXRoLnJvdW5kKG9bZSsyXSpuKSl9cmV0dXJuIGF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKG5ldyBJbWFnZURhdGEobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KG8pLGUsdCkse2ltYWdlT3JpZW50YXRpb246ImZsaXBZIixwcmVtdWx0aXBseUFscGhhOiJub25lIixjb2xvclNwYWNlQ29udmVyc2lvbjoibm9uZSJ9KX07Y2xhc3MgeXJ7Y29uc3RydWN0b3IoYSxvLGk9MSl7dmFyIGM7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRzdGFjayIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkbWF0cml4Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRjbGVhckNvbG9yUiIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkY2xlYXJDb2xvckciLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJGNsZWFyQ29sb3JCIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRjbGVhckNvbG9yQSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkbWFpbkF0dGFjaG1lbnRPYmplY3QiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJHN0YWNrQXR0YWNobWVudE9iamVjdCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJnbG9iYWxBbHBoYSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJnbG9iYWxDb21wb3NpdGVPcGVyYXRpb24iLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaW1hZ2VTbW9vdGhpbmdFbmFibGVkIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRmaWxsU3R5bGUiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJHN0cm9rZVN0eWxlIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIm1hc2tCb3VuZHMiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywidGhpY2tuZXNzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImNhcHMiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiam9pbnRzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIm1pdGVyTGltaXQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSwoZT0+e249ZX0pKGEpLGM9YS5nZXRQYXJhbWV0ZXIoYS5NQVhfVEVYVFVSRV9TSVpFKSxlPU1hdGgubWluKDQwOTYsYy8yKSwoZT0+e3Q9ZX0pKG8pLChlPT57QT1lfSkoaSksdGhpcy4kc3RhY2s9cygpLHRoaXMuJHN0YWNrQXR0YWNobWVudE9iamVjdD1zKCksdGhpcy4kbWF0cml4PWQoMSwwLDAsMCwxLDAsMCwwLDEpLHRoaXMuJGNsZWFyQ29sb3JSPTAsdGhpcy4kY2xlYXJDb2xvckc9MCx0aGlzLiRjbGVhckNvbG9yQj0wLHRoaXMuJGNsZWFyQ29sb3JBPTAsdGhpcy50aGlja25lc3M9MSx0aGlzLmNhcHM9MSx0aGlzLmpvaW50cz0yLHRoaXMubWl0ZXJMaW1pdD0wLHRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0PW51bGwsdGhpcy5nbG9iYWxBbHBoYT0xLHRoaXMuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJub3JtYWwiLHRoaXMuaW1hZ2VTbW9vdGhpbmdFbmFibGVkPSExLHRoaXMuJGZpbGxTdHlsZT1uZXcgRmxvYXQzMkFycmF5KFsxLDEsMSwxXSksdGhpcy4kc3Ryb2tlU3R5bGU9bmV3IEZsb2F0MzJBcnJheShbMSwxLDEsMV0pLHRoaXMubWFza0JvdW5kcz17eE1pbjowLHlNaW46MCx4TWF4OjAseU1heDowfSxhLnBpeGVsU3RvcmVpKGEuVU5QQUNLX0FMSUdOTUVOVCwxKSxhLnBpeGVsU3RvcmVpKGEuVU5QQUNLX0ZMSVBfWV9XRUJHTCwhMCksKGU9PntEPWUuY3JlYXRlRnJhbWVidWZmZXIoKX0pKGEpLChlPT57aj1lLmNyZWF0ZUZyYW1lYnVmZmVyKCl9KShhKSwoKGUsdCk9PntYPWUuY3JlYXRlRnJhbWVidWZmZXIoKSxlLmJpbmRGcmFtZWJ1ZmZlcihlLkZSQU1FQlVGRkVSLFgpLGUuZnJhbWVidWZmZXJUZXh0dXJlMkQoZS5GUkFNRUJVRkZFUixlLkNPTE9SX0FUVEFDSE1FTlQwLGUuVEVYVFVSRV8yRCx0LnJlc291cmNlLDApLGUuYmluZEZyYW1lYnVmZmVyKGUuRlJBTUVCVUZGRVIsbnVsbCksZS5iaW5kRnJhbWVidWZmZXIoZS5EUkFXX0ZSQU1FQlVGRkVSLFgpfSkoYSxnZSgpKSwoZT0+e0g9ZS5jcmVhdGVGcmFtZWJ1ZmZlcigpLEs9ZS5jcmVhdGVGcmFtZWJ1ZmZlcigpLFo9ZS5jcmVhdGVGcmFtZWJ1ZmZlcigpLFE9ZS5jcmVhdGVCdWZmZXIoKSxlLmJpbmRCdWZmZXIoZS5QSVhFTF9QQUNLX0JVRkZFUixRKX0pKGEpLF9uKGEpLG4uZW5hYmxlKG4uQkxFTkQpLEx0KCksKGU9Pntqbj1NYXRoLmZsb29yKC43NSplLmdldFBhcmFtZXRlcihlLk1BWF9GUkFHTUVOVF9VTklGT1JNX1ZFQ1RPUlMpKX0pKGEpLHI9dGhpc31jbGVhclRyYW5zZmVyQm91bmRzKCl7KCgpPT57Zm9yKGxldCBlPTA7ZTx4ZS5sZW5ndGg7KytlKXtjb25zdCB0PXhlW2VdO3QmJih0WzBdPXRbMV09TnVtYmVyLk1BWF9WQUxVRSx0WzJdPXRbM109LU51bWJlci5NQVhfVkFMVUUpfWZvcihsZXQgZT0wO2U8QWUubGVuZ3RoOysrZSl7Y29uc3QgdD1BZVtlXTt0JiYodFswXT10WzFdPU51bWJlci5NQVhfVkFMVUUsdFsyXT10WzNdPS1OdW1iZXIuTUFYX1ZBTFVFKX19KSgpfXVwZGF0ZUJhY2tncm91bmRDb2xvcihlLHQsbixyKXsoKGUsdCxuLHIsbyk9PntlLiRjbGVhckNvbG9yUj1hKHQsMCwxLDApLGUuJGNsZWFyQ29sb3JHPWEobiwwLDEsMCksZS4kY2xlYXJDb2xvckI9YShyLDAsMSwwKSxlLiRjbGVhckNvbG9yQT1hKG8sMCwxLDApfSkodGhpcyxlLHQsbixyKX1maWxsQmFja2dyb3VuZENvbG9yKCl7dmFyIGUsdCxyLGE7ZT10aGlzLiRjbGVhckNvbG9yUix0PXRoaXMuJGNsZWFyQ29sb3JHLHI9dGhpcy4kY2xlYXJDb2xvckIsYT10aGlzLiRjbGVhckNvbG9yQSxuLmNsZWFyQ29sb3IoZSx0LHIsYSksbi5jbGVhcihuLkNPTE9SX0JVRkZFUl9CSVR8bi5TVEVOQ0lMX0JVRkZFUl9CSVQpLG4uY2xlYXJDb2xvcigwLDAsMCwwKX1yZXNpemUoZSx0LG49ITApe0ZlKHRoaXMsZSx0LG4pfWNsZWFyUmVjdChlLHQscixhKXsoKGUsdCxyLGEpPT57bi5lbmFibGUobi5TQ0lTU09SX1RFU1QpLG4uc2Npc3NvcihlLHQscixhKSxuLmNsZWFyKG4uQ09MT1JfQlVGRkVSX0JJVHxuLlNURU5DSUxfQlVGRkVSX0JJVCksbi5kaXNhYmxlKG4uU0NJU1NPUl9URVNUKX0pKGUsdCxyLGEpfWJpbmQoZSl7TGUodGhpcyxlKX1zYXZlKCl7dmFyIGU7KGU9dGhpcykuJHN0YWNrLnB1c2goZCguLi5lLiRtYXRyaXgpKX1yZXN0b3JlKCl7VWUodGhpcyl9c2V0VHJhbnNmb3JtKGUsdCxuLHIsYSxvKXsoKGUsdCxuLHIsYSxvLHMpPT57ZVswXT10LGVbMV09bixlWzNdPXIsZVs0XT1hLGVbNl09byxlWzddPXN9KSh0aGlzLiRtYXRyaXgsZSx0LG4scixhLG8pfXRyYW5zZm9ybShlLHQsbixyLGEsbyl7KChlLHQsbixyLGEsbyxzKT0+e2NvbnN0IGk9ZS4kbWF0cml4WzBdLGM9ZS4kbWF0cml4WzFdLGw9ZS4kbWF0cml4WzNdLHU9ZS4kbWF0cml4WzRdLGg9ZS4kbWF0cml4WzZdLGI9ZS4kbWF0cml4WzddO2UuJG1hdHJpeFswXT10KmkrbipsLGUuJG1hdHJpeFsxXT10KmMrbip1LGUuJG1hdHJpeFszXT1yKmkrYSpsLGUuJG1hdHJpeFs0XT1yKmMrYSp1LGUuJG1hdHJpeFs2XT1vKmkrcypsK2gsZS4kbWF0cml4WzddPW8qYytzKnUrYn0pKHRoaXMsZSx0LG4scixhLG8pfXJlc2V0KCl7dmFyIGU7KGU9dGhpcykuZ2xvYmFsQWxwaGE9MSxlLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0ibm9ybWFsIixlLmltYWdlU21vb3RoaW5nRW5hYmxlZD0hMX1iZWdpblBhdGgoKXt2YXIgZTsoZT10aGlzKS4kZmlsbFN0eWxlLmZpbGwoMSksZS4kc3Ryb2tlU3R5bGUuZmlsbCgxKSwoKCk9Pntmb3IoVC5sZW5ndGg9MDtSLmxlbmd0aDspaShSLnBvcCgpKX0pKCl9bW92ZVRvKGUsdCl7JChlLHQpfWxpbmVUbyhlLHQpeygoZSx0KT0+e1QubGVuZ3RofHwkKGUsdCksRihlLHQpfHx3KGUsdCwhMSl9KShlLHQpfXF1YWRyYXRpY0N1cnZlVG8oZSx0LG4scil7TyhlLHQsbixyKX1maWxsU3R5bGUoZSx0LG4scil7dGhpcy4kZmlsbFN0eWxlWzBdPWUsdGhpcy4kZmlsbFN0eWxlWzFdPXQsdGhpcy4kZmlsbFN0eWxlWzJdPW4sdGhpcy4kZmlsbFN0eWxlWzNdPXJ9c3Ryb2tlU3R5bGUoZSx0LG4scil7dGhpcy4kc3Ryb2tlU3R5bGVbMF09ZSx0aGlzLiRzdHJva2VTdHlsZVsxXT10LHRoaXMuJHN0cm9rZVN0eWxlWzJdPW4sdGhpcy4kc3Ryb2tlU3R5bGVbM109cn1jbG9zZVBhdGgoKXsoKCk9PntpZihULmxlbmd0aDw3KXJldHVybjtjb25zdCBlPStUWzBdLHQ9K1RbMV07RihlLHQpfHx3KGUsdCwhMSl9KSgpfWFyYyhlLHQsbil7KChlLHQsbik9Pntjb25zdCByPW4sYT0uNTUyMjg0NzQ5ODMwNzkzNipuO1AoZStyLHQrYSxlK2EsdCtyLGUsdCtyKSxQKGUtYSx0K3IsZS1yLHQrYSxlLXIsdCksUChlLXIsdC1hLGUtYSx0LXIsZSx0LXIpLFAoZSthLHQtcixlK3IsdC1hLGUrcix0KX0pKGUsdCxuKX1iZXppZXJDdXJ2ZVRvKGUsdCxuLHIsYSxvKXtQKGUsdCxuLHIsYSxvKX1maWxsKCl7KGU9Pntjb25zdCB0PU0oKTtpZighdC5sZW5ndGgpcmV0dXJuO0dlLnB1c2goZSk7Y29uc3Qgbj1qZSh0KTtWZShuLmJ1ZmZlciksV2UucHVzaChuLmluZGV4Q291bnQpfSkoImZpbGwiKX1ncmFkaWVudEZpbGwoZSx0LG4scixhLG8peygoZSx0LG4scixhLG8pPT57Y29uc3Qgcz1NKCk7aWYoIXMubGVuZ3RoKXJldHVybjtHZS5wdXNoKDA9PT1lPyJsaW5lYXIiOiJyYWRpYWwiKTtjb25zdCBpPWplKHMpO1ZlKGkuYnVmZmVyKSxXZS5wdXNoKGkuaW5kZXhDb3VudCkscWUucHVzaCh0LG4scixhKSwxPT09ZSYmcWUucHVzaChvKX0pKGUsdCxuLHIsYSxvKX1iaXRtYXBGaWxsKGUsdCxuLHIsYSxvKXsoKGUsdCxuLHIsYSxvKT0+e2NvbnN0IHM9TSgpO2lmKCFzLmxlbmd0aClyZXR1cm47R2UucHVzaCgiYml0bWFwIik7Y29uc3QgaT1qZShzKTtWZShpLmJ1ZmZlciksV2UucHVzaChpLmluZGV4Q291bnQpLHhuLnB1c2goZSx0LG4scixhLG8pfSkoZSx0LG4scixhLG8pfXN0cm9rZSgpeygoKT0+e2NvbnN0IGU9TSghMCk7aWYoIWUubGVuZ3RoKXJldHVybjtHZS5wdXNoKCJmaWxsIik7Y29uc3QgdD11dChlKTtWZSh0LmJ1ZmZlciksV2UucHVzaCh0LmluZGV4Q291bnQpfSkoKX1ncmFkaWVudFN0cm9rZShlLHQsbixyLGEsbyl7KChlLHQsbixyLGEsbyk9Pntjb25zdCBzPU0oKTtpZighcy5sZW5ndGgpcmV0dXJuO0dlLnB1c2goMD09PWU/ImxpbmVhciI6InJhZGlhbCIpO2NvbnN0IGk9dXQocyk7VmUoaS5idWZmZXIpLFdlLnB1c2goaS5pbmRleENvdW50KSxxZS5wdXNoKHQsbixyLGEpLDE9PT1lJiZxZS5wdXNoKG8pfSkoZSx0LG4scixhLG8pfWJpdG1hcFN0cm9rZShlLHQsbixyLGEsbyl7KChlLHQsbixyLGEsbyk9Pntjb25zdCBzPU0oITApO2lmKCFzLmxlbmd0aClyZXR1cm47R2UucHVzaCgiYml0bWFwIik7Y29uc3QgaT11dChzKTtWZShpLmJ1ZmZlciksV2UucHVzaChpLmluZGV4Q291bnQpLHhuLnB1c2goZSx0LG4scixhLG8pfSkoZSx0LG4scixhLG8pfWNsaXAoKXsoKCk9Pntjb25zdCBlPXIuY3VycmVudEF0dGFjaG1lbnRPYmplY3Q7aWYoIWUpcmV0dXJuO2NvbnN0IHQ9QmUuZ2V0KGUuY2xpcExldmVsKSxhPXRbMF0sbz10WzFdLHM9dFsyXSxpPXRbM10sYz1NYXRoLmNlaWwoTWF0aC5hYnMocy1hKSksbD1NYXRoLmNlaWwoTWF0aC5hYnMoaS1vKSk7bi5lbmFibGUobi5TQ0lTU09SX1RFU1QpLG4uc2Npc3NvcihhLGUuaGVpZ2h0LW8tbCxjLGwpO2NvbnN0IHU9QXQoKTtsZXQgaD1JZS5nZXQoZS5jbGlwTGV2ZWwpLGI9MCxkPW51bGw7Y29uc3QgZj1XZS5sZW5ndGg7Zm9yKGxldCB0PTA7dDxmO3QrKyl7bi5zdGVuY2lsTWFzaygxPDxoLTEpO2NvbnN0IHI9V2VbdF07aHQuaGFzKHQpJiYoZD1odC5nZXQodCkpO2NvbnN0IGE9JHQoISFkKTtkJiZPdChhLGQpLFV0KGEsdSxiLHIpLGIrPXIsKytoLGg+NyYmKER0KCksaD1lLmNsaXBMZXZlbCsxKX1JZS5zZXQoZS5jbGlwTGV2ZWwsaCkseXQodSksWWUoKSxidCgpLG4uZGlzYWJsZShuLlNDSVNTT1JfVEVTVCl9KSgpfWdldCBjdXJyZW50QXR0YWNobWVudE9iamVjdCgpe3JldHVybiBXKCl9Z2V0IGF0bGFzQXR0YWNobWVudE9iamVjdCgpe3JldHVybiB2ZSgpfWNyZWF0ZU5vZGUoZSx0KXtyZXR1cm4genQoZSx0KX1yZW1vdmVOb2RlKGUpeyhlPT57Y29uc3QgdD1fZVtlLmluZGV4XTt0JiZ0LmRpc3Bvc2UoZS54LGUueSxlLncsZS5oKX0pKGUpfWJlZ2luTm9kZVJlbmRlcmluZyhlKXsoZT0+e2NvbnN0IHQ9RWUoZS5pbmRleCksbj10WzBdLHI9dFsxXSxhPXRbMl0sbz10WzNdO3RbMF09TWF0aC5taW4oZS54LG4pLHRbMV09TWF0aC5taW4oZS55LHIpLHRbMl09TWF0aC5tYXgoZS54K2UudyxhKSx0WzNdPU1hdGgubWF4KGUueStlLmgsbyl9KShlKSxOZShlLngsZS55LGUudyxlLmgpfWVuZE5vZGVSZW5kZXJpbmcoKXtuLmRpc2FibGUobi5TQ0lTU09SX1RFU1QpfWRyYXdGaWxsKCl7KCgpPT57Y29uc3QgZT1BdCgpO24uZW5hYmxlKG4uU1RFTkNJTF9URVNUKSxuLmZyb250RmFjZShuLkNDVyksbi5zdGVuY2lsTWFzaygyNTUpO2xldCB0PTAscj1udWxsO2ZvcihsZXQgbj0wO248R2UubGVuZ3RoO24rKylzd2l0Y2goaHQuaGFzKG4pJiYocj1odC5nZXQobikpLEdlW25dKXtjYXNlImZpbGwiOntjb25zdCBuPVdlLnNoaWZ0KCk7dXIoZSx0LG4sciksdCs9bn1icmVhaztjYXNlImxpbmVhciI6e2NvbnN0IG49V2Uuc2hpZnQoKTt2cihlLHQsbixyKSx0Kz1ufWJyZWFrO2Nhc2UicmFkaWFsIjp7Y29uc3Qgbj1XZS5zaGlmdCgpO19yKGUsdCxuLHIpLHQrPW59YnJlYWs7Y2FzZSJiaXRtYXAiOntjb25zdCBuPVdlLnNoaWZ0KCk7Z3IoZSx0LG4sciksdCs9bn19bi5kaXNhYmxlKG4uU1RFTkNJTF9URVNUKSx5dChlKSxZZSgpLGJ0KCl9KSgpfWRyYXdEaXNwbGF5T2JqZWN0KHQsbixhLG8scyxpKXsoZT0+e2NvbnN0IHQ9eWUoZS5pbmRleCksbj10WzBdLHI9dFsxXSxhPXRbMl0sbz10WzNdO3RbMF09TWF0aC5taW4oZS54LG4pLHRbMV09TWF0aC5taW4oZS55LHIpLHRbMl09TWF0aC5tYXgoZS54K2UudyxhKSx0WzNdPU1hdGgubWF4KGUueStlLmgsbyl9KSh0KSwoKHQsbixhLG8scyxpKT0+e2NvbnN0IGM9aVswXSxsPWlbMV0sdT1pWzJdLGg9ci5nbG9iYWxBbHBoYSxiPWlbNF0vMjU1LGQ9aVs1XS8yNTUsZj1pWzZdLzI1NSx2PXIuJG1hdHJpeDtzd2l0Y2goci5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24pe2Nhc2Uibm9ybWFsIjpjYXNlImxheWVyIjpjYXNlImFkZCI6Y2FzZSJzY3JlZW4iOmNhc2UiYWxwaGEiOmNhc2UiZXJhc2UiOmNhc2UiY29weSI6e2lmKEN0KCkhPT1yLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbnx8TWUoKSE9PXQuaW5kZXgpe2RlKE1lKCkpO2NvbnN0IGU9ci5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb247ci5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249Q3QoKSxyLmRyYXdBcnJheXNJbnN0YW5jZWQoKSxyLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj1lLGt0KHIuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uKSxSZSh0LmluZGV4KSxkZSh0LmluZGV4KX1jb25zdCBuPUt0KCk7R3QucHVzaCh0LngvZSx0LnkvZSx0LncvZSx0LmgvZSx0LncsdC5oLHgoKSxFKCksdls2XSx2WzddLHZbMF0sdlsxXSx2WzNdLHZbNF0sYyxsLHUsaCxiLGQsZiwwKSxuLmNvdW50Kyt9YnJlYWs7ZGVmYXVsdDp7Y29uc3QgZT1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0O3IuZHJhd0FycmF5c0luc3RhbmNlZCgpO2NvbnN0IGk9TWF0aC5jZWlsKE1hdGguYWJzKG8tbikpLF89TWF0aC5jZWlsKE1hdGguYWJzKHMtYSkpO2xldCBwPTAsZz0wLHg9SnQodCk7aWYoMSE9PXZbMF18fDAhPT12WzFdfHwwIT09dlszXXx8MSE9PXZbNF0pe2NvbnN0IG49aGUoaSxfLCExKSxhPW0odlswXSx2WzFdLHZbM10sdls0XSxpLzIsXy8yKSxvPW0oMSwwLDAsMSwtdC53LzIsLXQuaC8yKSxzPW0oYVswXSpvWzBdK2FbMl0qb1sxXSxhWzFdKm9bMF0rYVszXSpvWzFdLGFbMF0qb1syXSthWzJdKm9bM10sYVsxXSpvWzJdK2FbM10qb1szXSxhWzBdKm9bNF0rYVsyXSpvWzVdK2FbNF0sYVsxXSpvWzRdK2FbM10qb1s1XSthWzVdKTtyLnNhdmUoKSxyLmJpbmQobiksci5zZXRUcmFuc2Zvcm0oc1swXSxzWzFdLHNbMl0sc1szXSxzWzRdLHNbNV0pLHA9c1s0XSxnPXNbNV07Y29uc3QgYz1obigpO2JuKGMseC53aWR0aCx4LmhlaWdodCksT2UoeCwhMCkscm4oYyksTCh4KSx4PW4udGV4dHVyZSxlZShuLCExKSxlJiZyLmJpbmQoZSksci5yZXN0b3JlKCl9KHB8fGcpJiYodls2XS09cCx2WzddLT1nKTtjb25zdCBFPXNuKHZbNl0sdls3XSxpLF8pLEE9aGUoaSxfLCExKTtyLmJpbmQoQSksZW4oRSx4KTtjb25zdCB5PUh0KHIuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uKTt1bih5LGMsbCx1LGgsYixkLGYsMCkscm4oeSksZSYmci5iaW5kKGUpLGxuKEEudGV4dHVyZSksKHB8fGcpJiYodls2XSs9cCx2WzddKz1nKSxMKHgpLEwoRSksZWUoQSksa3Qoci5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24pLFJlKHQuaW5kZXgpLGRlKHQuaW5kZXgpfX19KSh0LG4sYSxvLHMsaSl9ZHJhd0FycmF5c0luc3RhbmNlZCgpeygoKT0+e2NvbnN0IGU9S3QoKTtlLmNvdW50JiYoUXQoKSx2bihyLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiksZm4oZSksZS5jbGVhcigpKX0pKCl9Y2xlYXJBcnJheXNJbnN0YW5jZWQoKXtLdCgpLmNsZWFyKCl9dHJhbnNmZXJNYWluQ2FudmFzKCl7KCgpPT57Y29uc3QgZT1yLiRtYWluQXR0YWNobWVudE9iamVjdDtyLmJpbmQoZSksbi5iaW5kRnJhbWVidWZmZXIobi5SRUFEX0ZSQU1FQlVGRkVSLEQpLG4uYmluZEZyYW1lYnVmZmVyKG4uRFJBV19GUkFNRUJVRkZFUixudWxsKTtjb25zdCB0PWUud2lkdGgsYT1lLmhlaWdodDtuLmJsaXRGcmFtZWJ1ZmZlcigwLDAsdCxhLDAsMCx0LGEsbi5DT0xPUl9CVUZGRVJfQklULG4uTkVBUkVTVCksbi5iaW5kRnJhbWVidWZmZXIobi5EUkFXX0ZSQU1FQlVGRkVSLGopLG4uYmluZEZyYW1lYnVmZmVyKG4uRlJBTUVCVUZGRVIsRCl9KSgpfWRyYXdQaXhlbHMoZSx0KXsoKGUsdCk9Pntjb25zdCBuPXBuKGUudyxlLmgsdCkscj10bigpO25uKHIsZS53LGUuaCksTHQoKSxybihyKSxMKG4pfSkoZSx0KX1kcmF3RWxlbWVudChlLHQpe2duKGUsdCl9YmVnaW5NYXNrKCl7KCgpPT57Y29uc3QgZT1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0O2UmJihlLm1hc2s9ITAsZS5jbGlwTGV2ZWwrKyxJZS5zZXQoZS5jbGlwTGV2ZWwsZS5jbGlwTGV2ZWwpLFBlKCl8fChDZSghMCksbi5lbmFibGUobi5TVEVOQ0lMX1RFU1QpLG4uZW5hYmxlKG4uU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFKSxuLnN0ZW5jaWxGdW5jKG4uQUxXQVlTLDAsMjU1KSxuLnN0ZW5jaWxPcChuLlpFUk8sbi5JTlZFUlQsbi5JTlZFUlQpLG4uY29sb3JNYXNrKCExLCExLCExLCExKSkpfSkoKX1zZXRNYXNrQm91bmRzKGUsdCxhLG8peygoZSx0LGEsbyk9Pntjb25zdCBzPXIuY3VycmVudEF0dGFjaG1lbnRPYmplY3Q7aWYoIXMpcmV0dXJuO0JlLnNldChzLmNsaXBMZXZlbCx1KGUsdCxhLG8pKTtjb25zdCBpPU1hdGguY2VpbChNYXRoLmFicyhhLWUpKSxjPU1hdGguY2VpbChNYXRoLmFicyhvLXQpKTtuLmVuYWJsZShuLlNDSVNTT1JfVEVTVCksbi5zY2lzc29yKGUscy5oZWlnaHQtdC1jLGksYyl9KShlLHQsYSxvKX1lbmRNYXNrKCl7U2UoKX1sZWF2ZU1hc2soKXt0aGlzLmRyYXdBcnJheXNJbnN0YW5jZWQoKSwoKCk9Pntjb25zdCBlPXIuY3VycmVudEF0dGFjaG1lbnRPYmplY3Q7aWYoIWUpcmV0dXJuO2NvbnN0IHQ9ZS5jbGlwTGV2ZWwsYT1CZS5nZXQodCksbz1hWzBdLHM9YVsxXSxpPWFbMl0sYz1hWzNdO0JlLmRlbGV0ZSh0KSxJZS5kZWxldGUodCksaChhKTtjb25zdCBsPU1hdGguY2VpbChNYXRoLmFicyhpLW8pKSx1PU1hdGguY2VpbChNYXRoLmFicyhjLXMpKTtpZihuLmVuYWJsZShuLlNDSVNTT1JfVEVTVCksbi5zY2lzc29yKG8sZS5oZWlnaHQtcy11LGwsdSksLS1lLmNsaXBMZXZlbCwhZS5jbGlwTGV2ZWwpcmV0dXJuIGUubWFzaz0hMSxDZSghMSksbi5jbGVhcihuLlNURU5DSUxfQlVGRkVSX0JJVCksbi5kaXNhYmxlKG4uU1RFTkNJTF9URVNUKSxuLmRpc2FibGUobi5TQ0lTU09SX1RFU1QpLEllLmNsZWFyKCksdm9pZCBCZS5jbGVhcigpO24uc3RlbmNpbE1hc2soMTw8ZS5jbGlwTGV2ZWwpLG4uc3RlbmNpbEZ1bmMobi5BTFdBWVMsMCwyNTUpLG4uc3RlbmNpbE9wKG4uUkVQTEFDRSxuLlJFUExBQ0Usbi5SRVBMQUNFKSxuLmNvbG9yTWFzayghMSwhMSwhMSwhMSksVXQoTnQoKSxFdCgpLDAsNiksU2UoKX0pKCl9dXNlR3JpZChlKXsoZT0+e2h0LnNldChXZS5sZW5ndGgsZSl9KShlKX1hcHBseUZpbHRlcihlLHQsbixyLGEsbyxzLGksYyxsLHUpe3RoaXMuZHJhd0FycmF5c0luc3RhbmNlZCgpLGxyKGUsdCxuLHIsYSxvLHMsaSxjLGwsdSl9YXN5bmMgY3JlYXRlSW1hZ2VCaXRtYXAoZSx0KXtyZXR1cm4gYXdhaXQgQXIoZSx0KX19bGV0IFRyO2xldCBScjtsZXQgTXI9MDtsZXQgd3I9MDtsZXQgRnI9ITE7Y29uc3QgJHI9W10sT3I9KC4uLmUpPT57Y29uc3QgdD0kci5wb3AoKXx8W107cmV0dXJuIGUubGVuZ3RoJiZ0LnB1c2goLi4uZSksdH0sU3I9KGUsdD0xKT0+KHtSOigxNjcxMTY4MCZlKT4+MTYsRzooNjUyODAmZSk+PjgsQjoyNTUmZSxBOjI1NSp0fSksa3I9KGUsdCk9PnsoZT0+e1JyPWV9KShlKTtjb25zdCBuPWUuZ2V0Q29udGV4dCgid2ViZ2wyIix7c3RlbmNpbDohMCxwcmVtdWx0aXBsaWVkQWxwaGE6ITAsYW50aWFsaWFzOiExLGRlcHRoOiExfSk7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJ3ZWJnbDIgaXMgbm90IHN1cHBvcnRlZC4iKTt2YXIgcjtyPW5ldyB5cihuLDQsdCksVHI9cn0sQ3I9KGUsdCxuPSEwKT0+e01yPT09ZSYmd3I9PT10fHwoRnI9ITAsTXI9ZSx3cj10LFRyLnJlc2l6ZShlLHQsbiksbiYmY3IucmVzZXQoKSl9LFByPShlLHQ9ITEpPT57bGV0IG49MDtmb3IoO2UubGVuZ3RoPm47KXN3aXRjaChlW24rK10pe2Nhc2UgOTpUci5iZWdpblBhdGgoKTticmVhaztjYXNlIDA6VHIubW92ZVRvKGVbbisrXSxlW24rK10pO2JyZWFrO2Nhc2UgMjpUci5saW5lVG8oZVtuKytdLGVbbisrXSk7YnJlYWs7Y2FzZSAxOlRyLnF1YWRyYXRpY0N1cnZlVG8oZVtuKytdLGVbbisrXSxlW24rK10sZVtuKytdKTticmVhaztjYXNlIDU6aWYodCl7bis9NDticmVha31Uci5maWxsU3R5bGUoZVtuKytdLzI1NSxlW24rK10vMjU1LGVbbisrXS8yNTUsZVtuKytdLzI1NSk7YnJlYWs7Y2FzZSA3OlRyLmZpbGwoKTticmVhaztjYXNlIDY6aWYodCl7bis9ODticmVha31Uci50aGlja25lc3M9ZVtuKytdLFRyLmNhcHM9ZVtuKytdLFRyLmpvaW50cz1lW24rK10sVHIubWl0ZXJMaW1pdD1lW24rK10sVHIuc3Ryb2tlU3R5bGUoZVtuKytdLzI1NSxlW24rK10vMjU1LGVbbisrXS8yNTUsZVtuKytdLzI1NSk7YnJlYWs7Y2FzZSA4OmlmKHQpYnJlYWs7VHIuc3Ryb2tlKCk7YnJlYWs7Y2FzZSAxMjpUci5jbG9zZVBhdGgoKTticmVhaztjYXNlIDQ6VHIuYXJjKGVbbisrXSxlW24rK10sZVtuKytdKTticmVhaztjYXNlIDM6VHIuYmV6aWVyQ3VydmVUbyhlW24rK10sZVtuKytdLGVbbisrXSxlW24rK10sZVtuKytdLGVbbisrXSk7YnJlYWs7Y2FzZSAxMDp7aWYodCl7bis9MTtjb25zdCB0PWVbbisrXTtuKz01KnQsbis9OSxUci5maWxsKCk7YnJlYWt9Y29uc3Qgcj1lW24rK10sYT1PcigpLG89ZVtuKytdO2ZvcihsZXQgdD0wO3Q8bzsrK3QpYS5wdXNoKGVbbisrXSxlW24rK10sZVtuKytdLGVbbisrXSxlW24rK10pO2NvbnN0IHM9bmV3IEZsb2F0MzJBcnJheShbZVtuKytdLGVbbisrXSxlW24rK10sZVtuKytdLGVbbisrXSxlW24rK11dKSxpPWVbbisrXSxjPWVbbisrXSxsPWVbbisrXTtUci5ncmFkaWVudEZpbGwocixhLHMsaSxjLGwpfWJyZWFrO2Nhc2UgMTM6e2lmKHQpe24rPTI7Y29uc3QgdD1lW24rK107bis9dCxuKz04LFRyLmZpbGwoKTticmVha31jb25zdCByPWVbbisrXSxhPWVbbisrXSxvPWVbbisrXSxzPW5ldyBVaW50OEFycmF5KGUuc3ViYXJyYXkobixuK28pKTtuKz1vO2NvbnN0IGk9bmV3IEZsb2F0MzJBcnJheShbZVtuKytdLGVbbisrXSxlW24rK10sZVtuKytdLGVbbisrXSxlW24rK11dKTtUci5iaXRtYXBGaWxsKHMsaSxyLGEsQm9vbGVhbihlW24rK10pLEJvb2xlYW4oZVtuKytdKSl9YnJlYWs7Y2FzZSAxMTp7aWYodCl7bis9MjAsVHIuZmlsbCgpO2JyZWFrfVRyLnRoaWNrbmVzcz1lW24rK10sVHIuY2Fwcz1lW24rK10sVHIuam9pbnRzPWVbbisrXSxUci5taXRlckxpbWl0PWVbbisrXTtjb25zdCByPWVbbisrXSxhPU9yKCksbz1lW24rK107Zm9yKGxldCB0PTA7dDxvOysrdClhLnB1c2goZVtuKytdLGVbbisrXSxlW24rK10sZVtuKytdLGVbbisrXSk7Y29uc3Qgcz1uZXcgRmxvYXQzMkFycmF5KFtlW24rK10sZVtuKytdLGVbbisrXSxlW24rK10sZVtuKytdLGVbbisrXV0pLGk9ZVtuKytdLGM9ZVtuKytdLGw9ZVtuKytdO1RyLmdyYWRpZW50U3Ryb2tlKHIsYSxzLGksYyxsKX1icmVhaztjYXNlIDE0OntpZih0KXtuKz02O2NvbnN0IHQ9ZVtuKytdO24rPXQsbis9OCxUci5maWxsKCk7YnJlYWt9VHIudGhpY2tuZXNzPWVbbisrXSxUci5jYXBzPWVbbisrXSxUci5qb2ludHM9ZVtuKytdLFRyLm1pdGVyTGltaXQ9ZVtuKytdO2NvbnN0IHI9ZVtuKytdLGE9ZVtuKytdLG89ZVtuKytdLHM9bmV3IFVpbnQ4QXJyYXkoZS5zdWJhcnJheShuLG4rbykpO24rPW87Y29uc3QgaT1uZXcgRmxvYXQzMkFycmF5KFtlW24rK10sZVtuKytdLGVbbisrXSxlW24rK10sZVtuKytdLGVbbisrXV0pO1RyLmJpdG1hcFN0cm9rZShzLGkscixhLEJvb2xlYW4oZVtuKytdKSxCb29sZWFuKGVbbisrXSkpfX19LEJyPWU9Pntzd2l0Y2goZSl7Y2FzZSAwOnJldHVybiJjb3B5IjtjYXNlIDE6cmV0dXJuImFkZCI7Y2FzZSAyOnJldHVybiJhbHBoYSI7Y2FzZSAzOnJldHVybiJkYXJrZW4iO2Nhc2UgNDpyZXR1cm4iZGlmZmVyZW5jZSI7Y2FzZSA1OnJldHVybiJlcmFzZSI7Y2FzZSA2OnJldHVybiJoYXJkbGlnaHQiO2Nhc2UgNzpyZXR1cm4iaW52ZXJ0IjtjYXNlIDg6cmV0dXJuImxheWVyIjtjYXNlIDk6cmV0dXJuImxpZ2h0ZW4iO2Nhc2UgMTA6cmV0dXJuIm11bHRpcGx5IjtjYXNlIDExOmRlZmF1bHQ6cmV0dXJuIm5vcm1hbCI7Y2FzZSAxMjpyZXR1cm4ib3ZlcmxheSI7Y2FzZSAxMzpyZXR1cm4ic2NyZWVuIjtjYXNlIDE0OnJldHVybiJzdWJ0cmFjdCJ9fSxJcj0oZSx0KT0+e2NvbnN0IG49ZS5zdWJhcnJheSh0LHQrNik7dCs9Njtjb25zdCByPWUuc3ViYXJyYXkodCx0KzgpO3QrPTg7Y29uc3QgYT1lLnN1YmFycmF5KHQsdCs0KTt0Kz00O2NvbnN0IG89ZVt0KytdLHM9ZVt0KytdLGk9ZVt0KytdLGM9ZVt0KytdLGw9Qm9vbGVhbihlW3QrK10pLHU9Qm9vbGVhbihlW3QrK10pLGg9Qm9vbGVhbihlW3QrK10pLGI9YCR7ZVt0KytdfWAsZD1lW3QrK10sZj1NYXRoLnNxcnQoblswXSpuWzBdK25bMV0qblsxXSksbT1NYXRoLnNxcnQoblsyXSpuWzJdK25bM10qblszXSk7bGV0IHY7aWYoZVt0KytdKXtpZih2PWNyLmdldChiLGAke2R9YCksIXYpcmV0dXJuIHR9ZWxzZXtjb25zdCBuPWw/bmV3IEZsb2F0MzJBcnJheSgyOCk6bnVsbDtuJiYobi5zZXQoZS5zdWJhcnJheSh0LHQrMjQpKSx0Kz0yNCksVHIudXNlR3JpZChuKTtjb25zdCByPWVbdCsrXSxhPWUuc3ViYXJyYXkodCx0K3IpO2lmKGgmJiFsKXtjb25zdCBlPU1hdGguY2VpbChNYXRoLmFicyhpLW8pKSx0PU1hdGguY2VpbChNYXRoLmFicyhjLXMpKTt2PVRyLmNyZWF0ZU5vZGUoZSx0KSxjci5zZXQoYixgJHtkfWAsdik7Y29uc3Qgbj1Uci5jdXJyZW50QXR0YWNobWVudE9iamVjdDtUci5iaW5kKFRyLmF0bGFzQXR0YWNobWVudE9iamVjdCksVHIucmVzZXQoKSxUci5iZWdpbk5vZGVSZW5kZXJpbmcodik7Y29uc3Qgcj1Uci5hdGxhc0F0dGFjaG1lbnRPYmplY3QuaGVpZ2h0LXYueS10O1RyLnNldFRyYW5zZm9ybSgxLDAsMCwxLHYueCxyKSx1PyhQcihhKSxUci5kcmF3RmlsbCgpKTpUci5kcmF3UGl4ZWxzKHYsbmV3IFVpbnQ4QXJyYXkoYSkpLFRyLmVuZE5vZGVSZW5kZXJpbmcoKSxuJiZUci5iaW5kKG4pfWVsc2V7Y29uc3QgZT1NYXRoLmNlaWwoTWF0aC5hYnMoaS1vKSpmKSx0PU1hdGguY2VpbChNYXRoLmFicyhjLXMpKm0pO3Y9VHIuY3JlYXRlTm9kZShlLHQpLGNyLnNldChiLGAke2R9YCx2KTtjb25zdCByPVRyLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0O1RyLmJpbmQoVHIuYXRsYXNBdHRhY2htZW50T2JqZWN0KSxUci5yZXNldCgpLFRyLmJlZ2luTm9kZVJlbmRlcmluZyh2KTtjb25zdCBsPVRyLmF0bGFzQXR0YWNobWVudE9iamVjdC5oZWlnaHQtdi55LXQ7VHIuc2V0VHJhbnNmb3JtKGYsMCwwLG0sLW8qZit2LngsLXMqbStsKSxuJiYoblsyNF09di54LG5bMjVdPWwpLFByKGEpLFRyLmRyYXdGaWxsKCksVHIuZW5kTm9kZVJlbmRlcmluZygpLHImJlRyLmJpbmQocil9dCs9cn1jb25zdCBfPWVbdCsrXTtpZihCb29sZWFuKGVbdCsrXSkpe2NvbnN0IG89Qm9vbGVhbihlW3QrK10pLHM9ZS5zdWJhcnJheSh0LHQrNCk7dCs9NDtjb25zdCBpPWVbdCsrXSxjPWUuc3ViYXJyYXkodCx0K2kpLGw9TWF0aC5jZWlsKE1hdGguYWJzKGFbMl0tYVswXSkpLHU9TWF0aC5jZWlsKE1hdGguYWJzKGFbM10tYVsxXSkpO3JldHVybiBUci5hcHBseUZpbHRlcih2LGIsbyxsLHUsaCxuLHIsQnIoXykscyxjKSx0Kz1pfWlmKFRyLmdsb2JhbEFscGhhPU1hdGgubWluKE1hdGgubWF4KDAsclszXStyWzddLzI1NSksMSksVHIuaW1hZ2VTbW9vdGhpbmdFbmFibGVkPSEwLFRyLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj1CcihfKSxoJiYhbClUci5zZXRUcmFuc2Zvcm0oblswXSxuWzFdLG5bMl0sblszXSxuWzRdLG5bNV0pLFRyLmRyYXdEaXNwbGF5T2JqZWN0KHYsYVswXSxhWzFdLGFbMl0sYVszXSxyKTtlbHNle2NvbnN0IGU9TWF0aC5hdGFuMihuWzFdLG5bMF0pLHQ9TWF0aC5hdGFuMigtblsyXSxuWzNdKTtpZihlfHx0KXtjb25zdCByPW8qZixhPXMqbSxpPU1hdGguY29zKGUpLGM9TWF0aC5zaW4oZSksbD1NYXRoLmNvcyh0KSx1PU1hdGguc2luKHQpO1RyLnNldFRyYW5zZm9ybShpLGMsLXUsbCxyKmktYSp1K25bNF0scipjK2EqbCtuWzVdKX1lbHNlIFRyLnNldFRyYW5zZm9ybSgxLDAsMCwxLGFbMF0sYVsxXSk7VHIuZHJhd0Rpc3BsYXlPYmplY3QodixhWzBdLGFbMV0sYVsyXSxhWzNdLHIpfXJldHVybiB0fSxMcj0oZSx0KT0+e2NvbnN0IG49ZS5zdWJhcnJheSh0LHQrNik7dCs9NixUci5yZXNldCgpLFRyLnNldFRyYW5zZm9ybShuWzBdLG5bMV0sblsyXSxuWzNdLG5bNF0sbls1XSk7Y29uc3Qgcj1Cb29sZWFuKGVbdCsrXSk/bmV3IEZsb2F0MzJBcnJheSgyOCk6bnVsbDtUci51c2VHcmlkKHIpLHImJihyLnNldChlLnN1YmFycmF5KHQsdCsyNCkpLHQrPTI0KTtjb25zdCBhPWVbdCsrXSxvPWUuc3ViYXJyYXkodCx0K2EpO3JldHVybiBQcihvLCEwKSx0Kz1hLFRyLmNsaXAoKSx0fSxVcj0oZSx0LG4pPT57Y29uc3Qgcj1lLndpZHRoVGFibGVbdC5saW5lXXx8MCxhPXQudGV4dEZvcm1hdCxvPWEubGVmdE1hcmdpbnx8MDtpZighbi53b3JkV3JhcCYmcj5uLnJhd1dpZHRoKXJldHVybiBNYXRoLm1heCgwLG8pO2NvbnN0IHM9YS5yaWdodE1hcmdpbnx8MDtyZXR1cm4iY2VudGVyIj09PWEuYWxpZ258fCJjZW50ZXIiPT09bi5hdXRvU2l6ZT9NYXRoLm1heCgwLG4ucmF3V2lkdGgvMi1vLXMtci8yLTIpOiJyaWdodCI9PT1hLmFsaWdufHwicmlnaHQiPT09bi5hdXRvU2l6ZT9NYXRoLm1heCgwLG4ucmF3V2lkdGgtby1yLXMtNCk6TWF0aC5tYXgoMCxvKX0sTnI9ZT0+e2xldCB0PSIiO3JldHVybiBlLml0YWxpYyYmKHQrPSJpdGFsaWMgIiksZS5ib2xkJiYodCs9ImJvbGQgIiksYCR7dH0ke2Uuc2l6ZX1weCAnJHtlLmZvbnR9Jywnc2Fucy1zZXJpZidgfSxEcj1uZXcgVGV4dERlY29kZXIsanI9KGUsdCk9Pntjb25zdCBuPWUuc3ViYXJyYXkodCx0KzYpO3QrPTY7Y29uc3Qgcj1lLnN1YmFycmF5KHQsdCs4KTt0Kz04O2NvbnN0IGE9ZS5zdWJhcnJheSh0LHQrNCk7dCs9NDtjb25zdCBvPWVbdCsrXSxzPWVbdCsrXSxpPWVbdCsrXSxjPWVbdCsrXSxsPWAke2VbdCsrXX1gLHU9ZVt0KytdLGg9Qm9vbGVhbihlW3QrK10pLGI9TWF0aC5zcXJ0KG5bMF0qblswXStuWzFdKm5bMV0pLGQ9TWF0aC5zcXJ0KG5bMl0qblsyXStuWzNdKm5bM10pO2xldCBmO2lmKGVbdCsrXSl7aWYoZj1jci5nZXQobCxgJHt1fWApLCFmKXJldHVybiB0fWVsc2V7Y29uc3Qgbj1NYXRoLmNlaWwoTWF0aC5hYnMoaS1vKSpiKSxyPU1hdGguY2VpbChNYXRoLmFicyhjLXMpKmQpLGE9Qm9vbGVhbihlW3QrK10pO2Y9YT9jci5nZXQobCxgJHt1fWApOlRyLmNyZWF0ZU5vZGUobixyKSxhfHxjci5zZXQobCxgJHt1fWAsZik7Y29uc3QgaD1lW3QrK10sbT1uZXcgVWludDhBcnJheShlLnN1YmFycmF5KHQsdCtoKSk7dCs9aDtsZXQgdj0ibm9uZSI7c3dpdGNoKGVbdCsrXSl7Y2FzZSAwOnY9ImNlbnRlciI7YnJlYWs7Y2FzZSAxOnY9ImxlZnQiO2JyZWFrO2Nhc2UgMjp2PSJub25lIjticmVhaztjYXNlIDM6dj0icmlnaHQifWNvbnN0IF89e3dpZHRoOm4saGVpZ2h0OnIsYXV0b1NpemU6dixzdG9wSW5kZXg6ZVt0KytdLHNjcm9sbFg6ZVt0KytdLHNjcm9sbFk6ZVt0KytdLHRleHRXaWR0aDplW3QrK10sdGV4dEhlaWdodDplW3QrK10scmF3V2lkdGg6ZVt0KytdLHJhd0hlaWdodDplW3QrK10sZm9jdXNJbmRleDplW3QrK10sc2VsZWN0SW5kZXg6ZVt0KytdLGZvY3VzVmlzaWJsZTpCb29sZWFuKGVbdCsrXSksdGhpY2tuZXNzOmVbdCsrXSx0aGlja25lc3NDb2xvcjplW3QrK10sd29yZFdyYXA6Qm9vbGVhbihlW3QrK10pLGJvcmRlcjpCb29sZWFuKGVbdCsrXSksYm9yZGVyQ29sb3I6ZVt0KytdLGJhY2tncm91bmQ6Qm9vbGVhbihlW3QrK10pLGJhY2tncm91bmRDb2xvcjplW3QrK10sZGVmYXVsdENvbG9yOmVbdCsrXSxkZWZhdWx0U2l6ZTplW3QrK119LHA9KChlLHQsbixyKT0+e2NvbnN0IGE9bmV3IE9mZnNjcmVlbkNhbnZhcyh0LndpZHRoLHQuaGVpZ2h0KSxvPWEuZ2V0Q29udGV4dCgiMmQiKTtpZighbylyZXR1cm4gYTtjb25zdCBzPU1hdGgubWluKDEsTWF0aC5tYXgobixyKSk7aWYodC5iYWNrZ3JvdW5kfHx0LmJvcmRlcil7aWYoby5iZWdpblBhdGgoKSxvLm1vdmVUbygwLDApLG8ubGluZVRvKHQud2lkdGgsMCksby5saW5lVG8odC53aWR0aCx0LmhlaWdodCksby5saW5lVG8oMCx0LmhlaWdodCksby5saW5lVG8oMCwwKSx0LmJhY2tncm91bmQpe2NvbnN0IGU9U3IodC5iYWNrZ3JvdW5kQ29sb3IpO28uZmlsbFN0eWxlPWByZ2JhKCR7ZS5SfSwke2UuR30sJHtlLkJ9LCR7ZS5BfSlgLG8uZmlsbCgpfWlmKHQuYm9yZGVyKXtjb25zdCBlPVNyKHQuYm9yZGVyQ29sb3IpO28ubGluZVdpZHRoPXMsby5zdHJva2VTdHlsZT1gcmdiYSgke2UuUn0sJHtlLkd9LCR7ZS5CfSwke2UuQX0pYCxvLnN0cm9rZSgpfX1pZighZSlyZXR1cm4gYTtvLnNhdmUoKSxvLmJlZ2luUGF0aCgpLG8ubW92ZVRvKDIsMiksby5saW5lVG8odC53aWR0aC0yLDIpLG8ubGluZVRvKHQud2lkdGgtMix0LmhlaWdodC0yKSxvLmxpbmVUbygyLHQuaGVpZ2h0LTIpLG8ubGluZVRvKDIsMiksby5jbGlwKCk7bGV0IGk9MjtpZih0LnNjcm9sbFg+MCl7Y29uc3QgZT0odC50ZXh0V2lkdGgrNC10LnJhd1dpZHRoKS90LnJhd1dpZHRoO2krPS10LnNjcm9sbFgqZX1sZXQgYz0yO2lmKHQuc2Nyb2xsWT4wKXtjb25zdCBlPSh0LnRleHRIZWlnaHQrMi10LnJhd0hlaWdodCkvdC5yYXdIZWlnaHQ7Yys9LXQuc2Nyb2xsWSplfWlmKG8uc2V0VHJhbnNmb3JtKG4sMCwwLHIsaSpuLGMqciksby5iZWdpblBhdGgoKSx0LnNlbGVjdEluZGV4Pi0xJiZ0LmZvY3VzSW5kZXg+LTEpe2NvbnN0IG49ZS50ZXh0VGFibGUubGVuZ3RoLTE7bGV0IHI9MCxhPTA7dC5mb2N1c0luZGV4PD10LnNlbGVjdEluZGV4PyhyPU1hdGgubWluKHQuZm9jdXNJbmRleCxuKSxhPU1hdGgubWluKHQuc2VsZWN0SW5kZXgsbikpOihyPU1hdGgubWluKHQuc2VsZWN0SW5kZXgsbiksYT1NYXRoLm1pbih0LmZvY3VzSW5kZXgtMSxuKSk7Y29uc3Qgcz1lLnRleHRUYWJsZVtyXSxpPWUubGluZVRhYmxlW3MubGluZV0sYz1VcihlLGksdCk7bGV0IGw9MDtpZihyJiYidGV4dCI9PT1zLm1vZGUpe2xldCB0PXI7Zm9yKDt0Oyl7Y29uc3Qgbj1lLnRleHRUYWJsZVstLXRdO2lmKCJ0ZXh0IiE9PW4ubW9kZSlicmVhaztsKz1uLnd9fW8uZmlsbFN0eWxlPSIjYjRkN2ZmIjtsZXQgdT0wO2ZvcihsZXQgdD1yO3Q8PWE7Kyt0KXtjb25zdCBuPWUudGV4dFRhYmxlW3RdO2lmKCJ0ZXh0Ij09PW4ubW9kZSYmKHUrPW4udyx0IT09YSkpY29udGludWU7bGV0IHI9MDtjb25zdCBzPSJ0ZXh0Ij09PW4ubW9kZT9uLmxpbmU6bi5saW5lLTE7Zm9yKGxldCB0PTA7dDxzOysrdClyKz1lLmhlaWdodFRhYmxlW3RdO28uYmVnaW5QYXRoKCksby5yZWN0KGwscix1K2MsZS5oZWlnaHRUYWJsZVtzXSksby5maWxsKCksbD0wLHU9MH19Y29uc3QgbD10LnJhd1dpZHRoO2xldCB1PTA7aWYodC5zY3JvbGxYPjApe2NvbnN0IGU9KHQudGV4dFdpZHRoLWwpL2w7dT10LnNjcm9sbFgqZX1jb25zdCBoPWwrdSxiPXQucmF3SGVpZ2h0O2xldCBkPTA7aWYodC5zY3JvbGxZPjApe2NvbnN0IGU9KHQudGV4dEhlaWdodC1iKS9iO2Q9dC5zY3JvbGxZKmV9Y29uc3QgZj1iK2Q7bGV0IG09MCx2PTAsXz0wLHA9MCxnPSExLHg9LTE7Zm9yKGxldCBuPTA7bjxlLnRleHRUYWJsZS5sZW5ndGg7KytuKXtjb25zdCByPWUudGV4dFRhYmxlW25dO2lmKCFyKWNvbnRpbnVlO2lmKCgidGV4dCI9PT1yLm1vZGV8fCJicmVhayI9PT1yLm1vZGUpJiYoeCsrLHQuc3RvcEluZGV4Pi0xJiZ4PnQuc3RvcEluZGV4KSlicmVhaztpZihnJiYidGV4dCI9PT1yLm1vZGUpY29udGludWU7Y29uc3QgYT1yLnRleHRGb3JtYXQ7aWYoIm5vbmUiPT09dC5hdXRvU2l6ZSl7aWYodj5mKWJyZWFrO2lmKCJ0ZXh0Ij09PXIubW9kZSYmKHU+bStyLnd8fG0+aCkpe20rPXIudztjb250aW51ZX19Y29uc3QgaT1TcihhLmNvbG9yfHwwKTtpZihvLmZpbGxTdHlsZT1gcmdiYSgke2kuUn0sJHtpLkd9LCR7aS5CfSwke2kuQX0pYCx0LmZvY3VzVmlzaWJsZSYmdC5mb2N1c0luZGV4PT09bil7Y29uc3QgdD1tK18rLjE7bGV0IG49ci5saW5lLGE9ci55LHM9ZS5hc2NlbnRUYWJsZVtuXTsidGV4dCIhPT1yLm1vZGUmJihhPSJicmVhayI9PT1yLm1vZGU/ci5oOmUuYXNjZW50VGFibGVbbi0xXSxuPjA/KG49ci5saW5lLTEscz1lLmFzY2VudFRhYmxlW25dKTpzPXIuaCksbj4wJiYwPT09ZS5hc2NlbnRUYWJsZVtuXSYmbisrO2ZvcihsZXQgdD0wO3Q8bjsrK3Qpcys9ZS5oZWlnaHRUYWJsZVt0XTtvLnN0cm9rZVN0eWxlPWByZ2JhKCR7aS5SfSwke2kuR30sJHtpLkJ9LCR7aS5BfSlgLG8uYmVnaW5QYXRoKCksby5tb3ZlVG8odCxzKSxvLmxpbmVUbyh0LHMtYSksby5zdHJva2UoKX1pZih0LnRoaWNrbmVzcyl7Y29uc3QgZT1Tcih0LnRoaWNrbmVzc0NvbG9yKTtvLmxpbmVXaWR0aD10LnRoaWNrbmVzcyxvLnN0cm9rZVN0eWxlPWByZ2JhKCR7ZS5SfSwke2UuR30sJHtlLkJ9LCR7ZS5BfSlgfWNvbnN0IGM9MHxyLmxpbmU7c3dpdGNoKHIubW9kZSl7Y2FzZSJicmVhayI6Y2FzZSJ3cmFwIjppZihtPTAsYyYmKHYrPWUuaGVpZ2h0VGFibGVbYy0xXSksZD52K2UuaGVpZ2h0VGFibGVbY10pe2c9ITA7Y29udGludWV9cD1lLmFzY2VudFRhYmxlW2NdLF89VXIoZSxyLHQpLGc9ITE7YnJlYWs7Y2FzZSJ0ZXh0Ijp7by5iZWdpblBhdGgoKSxvLmZvbnQ9TnIoYSk7Y29uc3QgZT1tK18sbj12K3A7aWYoYS51bmRlcmxpbmUpe2NvbnN0IHQ9U3IoYS5jb2xvcnx8MCk7by5saW5lV2lkdGg9cyxvLnN0cm9rZVN0eWxlPWByZ2JhKCR7dC5SfSwke3QuR30sJHt0LkJ9LCR7dC5BfSlgLG8uYmVnaW5QYXRoKCksby5tb3ZlVG8oZSxuKzIpLG8ubGluZVRvKGUrci53LG4rMiksby5zdHJva2UoKX10LnRoaWNrbmVzcyYmby5zdHJva2VUZXh0KHIudGV4dCxlLG4pLG8uZmlsbFRleHQoci50ZXh0LGUsbiksbSs9ci53fX19aWYodC5mb2N1c1Zpc2libGUmJnQuZm9jdXNJbmRleD49ZS50ZXh0VGFibGUubGVuZ3RoKXtjb25zdCBuPWUudGV4dFRhYmxlW3QuZm9jdXNJbmRleC0xXTtpZihuKXtjb25zdCBlPVNyKG4udGV4dEZvcm1hdC5jb2xvcnx8MCk7by5zdHJva2VTdHlsZT1gcmdiYSgke2UuUn0sJHtlLkd9LCR7ZS5CfSwke2UuQX0pYDtjb25zdCB0PW0rXysuMSxyPXYrcDtvLmJlZ2luUGF0aCgpLCJ0ZXh0Ij09PW4ubW9kZT9vLm1vdmVUbyh0LHItbi55KTpvLm1vdmVUbyh0LHIrbi5oKSxvLmxpbmVUbyh0LHIpLG8uc3Ryb2tlKCl9fXJldHVybiBvLnJlc3RvcmUoKSxhfSkoSlNPTi5wYXJzZShEci5kZWNvZGUobSkpLF8sYixkKSxnPVRyLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0O1RyLmJpbmQoVHIuYXRsYXNBdHRhY2htZW50T2JqZWN0KSxUci5yZXNldCgpLFRyLmJlZ2luTm9kZVJlbmRlcmluZyhmKTtjb25zdCB4PVRyLmF0bGFzQXR0YWNobWVudE9iamVjdC5oZWlnaHQtZi55LXI7VHIuc2V0VHJhbnNmb3JtKDEsMCwwLDEsZi54LHgpLFRyLmRyYXdFbGVtZW50KGYscCksVHIuZW5kTm9kZVJlbmRlcmluZygpLGcmJlRyLmJpbmQoZyl9Y29uc3QgbT1lW3QrK107aWYoQm9vbGVhbihlW3QrK10pKXtjb25zdCBvPUJvb2xlYW4oZVt0KytdKSxzPWUuc3ViYXJyYXkodCx0KzQpO3QrPTQ7Y29uc3QgaT1lW3QrK10sYz1lLnN1YmFycmF5KHQsdCtpKSx1PU1hdGguY2VpbChNYXRoLmFicyhhWzJdLWFbMF0pKSxiPU1hdGguY2VpbChNYXRoLmFicyhhWzNdLWFbMV0pKTtyZXR1cm4gVHIuYXBwbHlGaWx0ZXIoZixsLEJvb2xlYW4oTWF0aC5tYXgoK2gsK28pKSx1LGIsITEsbixyLEJyKG0pLHMsYyksdCs9aX1Uci5nbG9iYWxBbHBoYT1NYXRoLm1pbihNYXRoLm1heCgwLHJbM10rcls3XS8yNTUpLDEpLFRyLmltYWdlU21vb3RoaW5nRW5hYmxlZD0hMCxUci5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249QnIobSk7Y29uc3Qgdj1NYXRoLmF0YW4yKG5bMV0sblswXSksXz1NYXRoLmF0YW4yKC1uWzJdLG5bM10pO2lmKHZ8fF8pe2NvbnN0IGU9bypiLHQ9cypkLHI9TWF0aC5jb3ModiksYT1NYXRoLnNpbih2KSxpPU1hdGguY29zKF8pLGM9TWF0aC5zaW4oXyk7VHIuc2V0VHJhbnNmb3JtKHIsYSwtYyxpLGUqci10KmMrbls0XSxlKmErdCppK25bNV0pfWVsc2UgVHIuc2V0VHJhbnNmb3JtKDEsMCwwLDEsYVswXSxhWzFdKTtyZXR1cm4gVHIuZHJhd0Rpc3BsYXlPYmplY3QoZixhWzBdLGFbMV0sYVsyXSxhWzNdLHIpLHR9LFhyPShlLHQsbik9Pntjb25zdCByPWUuc3ViYXJyYXkodCx0KzYpO3QrPTY7Y29uc3QgYT1lLnN1YmFycmF5KHQsdCs4KTt0Kz04O2NvbnN0IG89ZS5zdWJhcnJheSh0LHQrNCk7dCs9NDtjb25zdCBzPWVbdCsrXSxpPWVbdCsrXSxjPWVbdCsrXSxsPWVbdCsrXSx1PWAke2VbdCsrXX1gLGg9Qm9vbGVhbihlW3QrK10pO2xldCBiO2lmKGVbdCsrXSl7aWYoYj1jci5nZXQodSwiMCIpLCFiKXJldHVybiB0fWVsc2V7Y29uc3Qgcj1NYXRoLmFicyhjLXMpLGE9TWF0aC5hYnMobC1pKSxvPUJvb2xlYW4oZVt0KytdKTtpZihiPW8/Y3IuZ2V0KHUsIjAiKTpUci5jcmVhdGVOb2RlKHIsYSksb3x8Y3Iuc2V0KHUsIjAiLGIpLG4mJm4ubGVuZ3RoKXtjb25zdCBlPVRyLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0O1RyLmJpbmQoVHIuYXRsYXNBdHRhY2htZW50T2JqZWN0KSxUci5yZXNldCgpLFRyLmJlZ2luTm9kZVJlbmRlcmluZyhiKTtjb25zdCB0PVRyLmF0bGFzQXR0YWNobWVudE9iamVjdC5oZWlnaHQtYi55LWE7VHIuc2V0VHJhbnNmb3JtKDEsMCwwLDEsYi54LHQpO2NvbnN0IHI9bi5zaGlmdCgpO1RyLmRyYXdFbGVtZW50KGIsciksVHIuZW5kTm9kZVJlbmRlcmluZygpLGUmJlRyLmJpbmQoZSl9fWNvbnN0IGQ9ZVt0KytdO2lmKEJvb2xlYW4oZVt0KytdKSl7Y29uc3Qgbj1Cb29sZWFuKGVbdCsrXSkscz1lLnN1YmFycmF5KHQsdCs0KTt0Kz00O2NvbnN0IGk9ZVt0KytdLGM9ZS5zdWJhcnJheSh0LHQraSksbD1NYXRoLmNlaWwoTWF0aC5hYnMob1syXS1vWzBdKSksZj1NYXRoLmNlaWwoTWF0aC5hYnMob1szXS1vWzFdKSk7cmV0dXJuIFRyLmFwcGx5RmlsdGVyKGIsdSxCb29sZWFuKE1hdGgubWF4KCtoLCtuKSksbCxmLCEwLHIsYSxCcihkKSxzLGMpLHQrPWl9cmV0dXJuIFRyLmdsb2JhbEFscGhhPU1hdGgubWluKE1hdGgubWF4KDAsYVszXSthWzddLzI1NSksMSksVHIuaW1hZ2VTbW9vdGhpbmdFbmFibGVkPSEwLFRyLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj1CcihkKSxUci5zZXRUcmFuc2Zvcm0oclswXSxyWzFdLHJbMl0sclszXSxyWzRdLHJbNV0pLFRyLmRyYXdEaXNwbGF5T2JqZWN0KGIsb1swXSxvWzFdLG9bMl0sb1szXSxhKSx0fSx6cj0oZSx0KT0+e2NvbnN0IG49ZVt0KytdO2ZvcihsZXQgcj0wO3I8bjsrK3Ipe3N3aXRjaChlW3QrK10pe2Nhc2UgMDp0PXpyKGUsdCk7YnJlYWs7Y2FzZSAxOnQ9THIoZSx0KX19cmV0dXJuIHR9LFZyPShlLHQsbik9Pntjb25zdCByPUJvb2xlYW4oZVt0KytdKTtpZihyKXtUci5kcmF3QXJyYXlzSW5zdGFuY2VkKCksVHIuc2F2ZSgpLFRyLmJlZ2luTWFzaygpLFRyLnNldE1hc2tCb3VuZHMoZVt0KytdLGVbdCsrXSxlW3QrK10sZVt0KytdKTtzd2l0Y2goZVt0KytdKXtjYXNlIDA6dD16cihlLHQpO2JyZWFrO2Nhc2UgMTp0PUxyKGUsdCl9VHIuZW5kTWFzaygpfWxldCBhPTAsbz0hMDtjb25zdCBzPWVbdCsrXTtmb3IobGV0IHI9MDtzPnI7cisrKXtjb25zdCByPWVbdCsrXSxzPWVbdCsrXTtpZihhJiZyPmEmJihvJiYoVHIucmVzdG9yZSgpLFRyLmxlYXZlTWFzaygpKSxhPTAsbz0hMCksIW8pY29udGludWU7aWYocyl7aWYoYT1zLG89Qm9vbGVhbihlW3QrK10pLCFvKWNvbnRpbnVlO1RyLmRyYXdBcnJheXNJbnN0YW5jZWQoKSxUci5zYXZlKCksVHIuYmVnaW5NYXNrKCksVHIuc2V0TWFza0JvdW5kcyhlW3QrK10sZVt0KytdLGVbdCsrXSxlW3QrK10pO3N3aXRjaChlW3QrK10pe2Nhc2UgMDp0PXpyKGUsdCk7YnJlYWs7Y2FzZSAxOnQ9THIoZSx0KX1Uci5lbmRNYXNrKCk7Y29udGludWV9aWYoIWVbdCsrXSljb250aW51ZTtjb25zdCBpPWVbdCsrXTtzd2l0Y2goaSl7Y2FzZSAwOnQ9VnIoZSx0LG4pO2JyZWFrO2Nhc2UgMTp0PUlyKGUsdCk7YnJlYWs7Y2FzZSAyOnQ9anIoZSx0KTticmVhaztjYXNlIDM6dD1YcihlLHQsbik7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLmVycm9yKCJ1bmtub3duIHR5cGUiLGkpfX1yZXR1cm4oYXx8cikmJihUci5yZXN0b3JlKCksVHIubGVhdmVNYXNrKCkpLHR9O2xldCBXcj0tMTtjb25zdCBHcj0oZSx0KT0+e1RyLmNsZWFyVHJhbnNmZXJCb3VuZHMoKTtsZXQgbj0wO2NvbnN0IHI9ZVtuKytdO2ZvcihXciE9PXImJihXcj1yLC0xPT09V3I/VHIudXBkYXRlQmFja2dyb3VuZENvbG9yKDAsMCwwLDApOlRyLnVwZGF0ZUJhY2tncm91bmRDb2xvcihXcj4+MTYmMSxXcj4+OCYxLDEmV3IsMSkpLFRyLnJlc2V0KCksVHIuc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKSxUci5maWxsQmFja2dyb3VuZENvbG9yKCk7ZS5sZW5ndGg+bjspe2lmKCFlW24rK10pY29udGludWU7Y29uc3Qgcj1lW24rK107c3dpdGNoKHIpe2Nhc2UgMDpuPVZyKGUsbix0KTticmVhaztjYXNlIDE6bj1JcihlLG4pO2JyZWFrO2Nhc2UgMjpuPWpyKGUsbik7YnJlYWs7Y2FzZSAzOm49WHIoZSxuLHQpO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS5lcnJvcigidW5rbm93biB0eXBlIixyKX19VHIuZHJhd0FycmF5c0luc3RhbmNlZCgpLEZyJiYoUnIud2lkdGg9TXIsUnIuaGVpZ2h0PXdyLEZyPSExKSxUci50cmFuc2Zlck1haW5DYW52YXMoKX0sWXI9ZT0+e2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7Kyt0KXtjb25zdCBuPWAke2VbdF19YDtpZighY3IuaGFzKG4pKWNvbnRpbnVlO2NvbnN0IHI9Y3IuZ2V0QnlJZChuKTtmb3IoY29uc3QgZSBvZiByLnZhbHVlcygpKVRyLnJlbW92ZU5vZGUoZSk7Y3IucmVtb3ZlQnlJZChuKX19LHFyPWFzeW5jKGUsdCxuLHI9MCxhPTAsbyk9PntUci5jbGVhclRyYW5zZmVyQm91bmRzKCk7bGV0IHM9MTtmb3IoVHIucmVzZXQoKSxUci5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLFRyLnVwZGF0ZUJhY2tncm91bmRDb2xvcihyPj4xNiYxLHI+PjgmMSwxJnIsYSksVHIuZmlsbEJhY2tncm91bmRDb2xvcigpO2UubGVuZ3RoPnM7KXtpZighZVtzKytdKWNvbnRpbnVlO2NvbnN0IHQ9ZVtzKytdO3N3aXRjaCh0KXtjYXNlIDA6cz1WcihlLHMsbyk7YnJlYWs7Y2FzZSAxOnM9SXIoZSxzKTticmVhaztjYXNlIDI6cz1qcihlLHMpO2JyZWFrO2Nhc2UgMzpzPVhyKGUscyxvKTticmVhaztkZWZhdWx0OmNvbnNvbGUuZXJyb3IoInVua25vd24gdHlwZSIsdCl9fXJldHVybiBUci5kcmF3QXJyYXlzSW5zdGFuY2VkKCksYXdhaXQgVHIuY3JlYXRlSW1hZ2VCaXRtYXAodCxuKX07Y29uc3QgS3I9bmV3IGNsYXNze2NvbnN0cnVjdG9yKCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInN0YXRlIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInF1ZXVlIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksdGhpcy5zdGF0ZT0iZGVhY3RpdmF0ZSIsdGhpcy5xdWV1ZT1bXX1hc3luYyBleGVjdXRlKCl7Zm9yKHRoaXMuc3RhdGU9ImFjdGl2ZSI7dGhpcy5xdWV1ZS5sZW5ndGg7KXtjb25zdCBlPXRoaXMucXVldWUuc2hpZnQoKTtpZihlKXN3aXRjaChlLmNvbW1hbmQpe2Nhc2UicmVuZGVyIjpHcihlLmJ1ZmZlci5zdWJhcnJheSgwLGUubGVuZ3RoKSxlLmltYWdlQml0bWFwcyksZ2xvYmFsVGhpcy5wb3N0TWVzc2FnZSh7bWVzc2FnZToicmVuZGVyIixidWZmZXI6ZS5idWZmZXJ9LFtlLmJ1ZmZlci5idWZmZXJdKTticmVhaztjYXNlInJlc2l6ZSI6Q3IoZS5idWZmZXJbMF0sZS5idWZmZXJbMV0sQm9vbGVhbihlLmJ1ZmZlclsyXSkpO2JyZWFrO2Nhc2UiaW5pdGlhbGl6ZSI6a3IoZS5jYW52YXMsZS5kZXZpY2VQaXhlbFJhdGlvKTticmVhaztjYXNlInJlbW92ZUNhY2hlIjpZcihlLmJ1ZmZlcik7YnJlYWs7Y2FzZSJjYWNoZUNsZWFyIjpjci5yZXNldCgpO2JyZWFrO2Nhc2UiY2FwdHVyZSI6e2NvbnN0IHQ9YXdhaXQgcXIoZS5idWZmZXIuc3ViYXJyYXkoMCxlLmxlbmd0aCksZS53aWR0aCxlLmhlaWdodCxlLmJnQ29sb3IsZS5iZ0FscGhhLGUuaW1hZ2VCaXRtYXBzKTtnbG9iYWxUaGlzLnBvc3RNZXNzYWdlKHttZXNzYWdlOiJjYXB0dXJlIixidWZmZXI6ZS5idWZmZXIsaW1hZ2VCaXRtYXA6dH0sW2UuYnVmZmVyLmJ1ZmZlcix0XSl9fX10aGlzLnN0YXRlPSJkZWFjdGl2YXRlIn19O3NlbGYuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsYXN5bmMgZT0+e0tyLnF1ZXVlLnB1c2goZS5kYXRhKSwiZGVhY3RpdmF0ZSI9PT1Lci5zdGF0ZSYmYXdhaXQgS3IuZXhlY3V0ZSgpfSk7cmV0dXJue319KCk7Cg==';
|
|
1
|
+
export const workerInlineUrl = 'data:application/javascript;base64,dmFyIFJlbmRlcmVyV29ya2VyPWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2xldCBlPTIwNDg7bGV0IHQ9NDtsZXQgbjtsZXQgcjtjb25zdCBhPShlLHQsbixyPW51bGwpPT57Y29uc3QgYT0rZTtyZXR1cm4gaXNOYU4oYSkmJm51bGwhPT1yP3I6TWF0aC5taW4oTWF0aC5tYXgodCxpc05hTihhKT8wOmEpLG4pfSxvPVtdLHM9KC4uLmUpPT57Y29uc3QgdD1vLnBvcCgpfHxbXTtyZXR1cm4gZS5sZW5ndGgmJnQucHVzaCguLi5lKSx0fSxpPShlPW51bGwpPT57ZSYmKGUubGVuZ3RoJiYoZS5sZW5ndGg9MCksby5wdXNoKGUpKX0sYz1lPT4oZS0tLGV8PWU+PjEsZXw9ZT4+MixlfD1lPj40LGV8PWU+PjgsZXw9ZT4+MTYsKytlKSxsPVtdLHU9KGU9MCx0PTAsbj0wLHI9MCk9Pntjb25zdCBhPWwucG9wKCl8fG5ldyBGbG9hdDMyQXJyYXkoNCk7cmV0dXJuIGFbMF09ZSxhWzFdPXQsYVsyXT1uLGFbM109cixhfSxoPWU9PntsLnB1c2goZSl9LGI9W10sZD0oZT0wLHQ9MCxuPTAscj0wLGE9MCxvPTAscz0wLGk9MCxjPTApPT57Y29uc3QgbD1iLnBvcCgpfHxuZXcgRmxvYXQzMkFycmF5KDkpO3JldHVybiBsWzBdPWUsbFsxXT10LGxbMl09bixsWzNdPXIsbFs0XT1hLGxbNV09byxsWzZdPXMsbFs3XT1pLGxbOF09YyxsfSxmPVtdLG09KGU9MCx0PTAsbj0wLHI9MCxhPTAsbz0wKT0+e2NvbnN0IHM9Zi5wb3AoKXx8bmV3IEZsb2F0MzJBcnJheSg2KTtyZXR1cm4gc1swXT1lLHNbMV09dCxzWzJdPW4sc1szXT1yLHNbNF09YSxzWzVdPW8sc30sdj1lPT57Zi5wdXNoKGUpfSxfPWU9Pntjb25zdCB0PTEvKGVbMF0qZVs0XS1lWzNdKmVbMV0pLG49ZVszXSplWzddLWVbNF0qZVs2XSxyPWVbMV0qZVs2XS1lWzBdKmVbN107cmV0dXJuIGQoZVs0XSp0LDAtZVsxXSp0LDAsMC1lWzNdKnQsZVswXSp0LDAsbip0LHIqdCwxKX07bGV0IHA9MCxnPTA7Y29uc3QgeD0oKT0+cCxFPSgpPT5nO2xldCBBPTE7Y29uc3QgeT0oKT0+QSxUPXMoKSxSPXMoKSxNPShlPSExKT0+e2NvbnN0IHQ9ZT80OjEwO3JldHVybiBULmxlbmd0aDx0JiYoVC5sZW5ndGg9MCksVC5sZW5ndGgmJihSLnB1c2goVC5zbGljZSgwKSksVC5sZW5ndGg9MCksUn0sdz0oZSx0LG4pPT57VC5wdXNoKGUsdCxuKX0sRj0oZSx0KT0+e2NvbnN0IG49VC5sZW5ndGgscj0rVFtuLTNdLGE9K1Rbbi0yXTtyZXR1cm4gZT09PXImJnQ9PT1hfSwkPShlLHQpPT57VC5sZW5ndGg/RihlLHQpfHwoKChlPSExKT0+e2NvbnN0IHQ9ZT80OjEwO1QubGVuZ3RoPHR8fFIucHVzaChULnNsaWNlKDApKSxULmxlbmd0aD0wfSkoKSx3KGUsdCwhMSkpOncoZSx0LCExKX0sTz0oZSx0LG4scik9PntULmxlbmd0aHx8JCgwLDApLEYobixyKXx8KHcoZSx0LCEwKSx3KG4sciwhMSkpfSxTPW5ldyBGbG9hdDMyQXJyYXkoMzIpLGs9KGUsdCxuLHIsYSxvLHMsaSxjLGwpPT57Y29uc3QgdT0uMTI1KihlKzMqKG4rYSkrcyksaD0uMTI1Kih0KzMqKHIrbykraSksYj0uMTI1KihzK2Etbi1lKSxkPS4xMjUqKGkrby1yLXQpO1NbY109ZSxTW2MrMV09dCxTW2MrMl09LjUqKGUrbiksU1tjKzNdPS41Kih0K3IpLFNbYys0XT11LWIsU1tjKzVdPWgtZCxTW2MrNl09dSxTW2MrN109aCxTW2xdPXUsU1tsKzFdPWgsU1tsKzJdPXUrYixTW2wrM109aCtkLFNbbCs0XT0uNSooYStzKSxTW2wrNV09LjUqKG8raSksU1tsKzZdPXMsU1tsKzddPWl9LEM9KGUsdCxuLHIsYSxvLHMsaSxjKT0+e2NvbnN0IGw9LjEyNSooZSszKihuK2EpK3MpLHU9LjEyNSoodCszKihyK28pK2kpO1NbY109LjI1KmUrLjc1Km4sU1tjKzFdPS4yNSp0Ky43NSpyLFNbYysyXT1sLFNbYyszXT11LFNbYys0XT0uNzUqYSsuMjUqcyxTW2MrNV09Ljc1Km8rLjI1KmksU1tjKzZdPXMsU1tjKzddPWl9LFA9KGUsdCxuLHIsYSxvKT0+e2lmKFQubGVuZ3RofHwkKDAsMCksRihhLG8pKXJldHVybjtjb25zdCBzPVQubGVuZ3RoLGk9KChlLHQsbixyLGEsbyxzLGkpPT4oayhlLHQsbixyLGEsbyxzLGksMCwxNiksayhTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sMCw4KSxrKFNbMTZdLFNbMTddLFNbMThdLFNbMTldLFNbMjBdLFNbMjFdLFNbMjJdLFNbMjNdLDE2LDI0KSxDKFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSwwKSxDKFNbOF0sU1s5XSxTWzEwXSxTWzExXSxTWzEyXSxTWzEzXSxTWzE0XSxTWzE1XSw4KSxDKFNbMTZdLFNbMTddLFNbMThdLFNbMTldLFNbMjBdLFNbMjFdLFNbMjJdLFNbMjNdLDE2KSxDKFNbMjRdLFNbMjVdLFNbMjZdLFNbMjddLFNbMjhdLFNbMjldLFNbMzBdLFNbMzFdLDI0KSxTKSkoK1Rbcy0zXSwrVFtzLTJdLGUsdCxuLHIsYSxvKTtmb3IobGV0IGU9MDszMj5lOylPKGlbZSsrXSxpW2UrK10saVtlKytdLGlbZSsrXSl9LEI9W10sST1lPT57bGV0IHQ9LTEsbj1CLmxlbmd0aDtmb3IoO01hdGguYWJzKG4tdCk+MTspe2NvbnN0IHI9TWF0aC5mbG9vcigobit0KS8yKTtlPD1CW3JdLmFyZWE/bj1yOnQ9cn1yZXR1cm4gbn0sTD1lPT57bi5kZWxldGVUZXh0dXJlKGUucmVzb3VyY2UpfSxVPVtdLE49W107bGV0IEQ7bGV0IGo9bnVsbDtsZXQgWD1udWxsO2xldCB6PW51bGw7Y29uc3QgVj1lPT57ej1lfSxXPSgpPT56O2xldCBHPSExO2NvbnN0IFk9ZT0+e0c9ZX0scT0oKT0+RztsZXQgSz1udWxsLEg9bnVsbCxaPW51bGwsUT1udWxsO2NvbnN0IEo9KCk9PkgsZWU9KGUsdD0hMCk9Pnt2YXIgcjtlLm1zYWE/KChlPT57aWYoQi5pbmRleE9mKGUpPi0xKXJldHVybjtjb25zdCB0PUkoZS5hcmVhKTtlLmRpcnR5PSEwLEIuc3BsaWNlKHQsMCxlKX0pKGUuY29sb3IpLGUuY29sb3I9bnVsbCxlLnN0ZW5jaWw9bnVsbCk6KHQmJkwoZS50ZXh0dXJlKSxlLnRleHR1cmU9bnVsbCxyPWUuc3RlbmNpbCxVLmluZGV4T2Yocik+LTF8fChVLmxlbmd0aD4xMD9uLmRlbGV0ZVJlbmRlcmJ1ZmZlcihyLnJlc291cmNlKTooci5kaXJ0eT0hMCxVLnB1c2gocikpKSxlLnN0ZW5jaWw9bnVsbCksTi5wdXNoKGUpfTtsZXQgdGU9MDtjb25zdCBuZT1lPT57aWYoIUIubGVuZ3RoKXJldHVybigoKT0+e2NvbnN0IGU9e2lkOjAscmVzb3VyY2U6bi5jcmVhdGVSZW5kZXJidWZmZXIoKSx3aWR0aDowLGhlaWdodDowLGFyZWE6MCxkaXJ0eTohMX07cmV0dXJue3Jlc291cmNlOm4uY3JlYXRlUmVuZGVyYnVmZmVyKCksc3RlbmNpbDplLHdpZHRoOjAsaGVpZ2h0OjAsYXJlYTowLGRpcnR5OiExfX0pKCk7Y29uc3QgdD1JKGUpO2lmKHQ8Qi5sZW5ndGgpe2NvbnN0IGU9Qlt0XTtyZXR1cm4gQi5zcGxpY2UodCwxKSxlfWNvbnN0IHI9Qi5zaGlmdCgpO2lmKCFyKXRocm93IG5ldyBFcnJvcigidGhlIGNvbG9yIGJ1ZmZlciBpcyB2b2lkLiIpO3JldHVybiByfTtsZXQgcmU9MDtjb25zdCBhZT0oZSx0KT0+e2lmKCFVLmxlbmd0aClyZXR1cm57aWQ6cmUrKyxyZXNvdXJjZTpuLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLHdpZHRoOjAsaGVpZ2h0OjAsYXJlYTowLGRpcnR5OiExfTtmb3IobGV0IG49MDtuPFUubGVuZ3RoOysrbil7Y29uc3Qgcj1VW25dO2lmKHIud2lkdGg9PT1lJiZyLmhlaWdodD09PXQpcmV0dXJuIFUuc3BsaWNlKG4sMSkscn1yZXR1cm4gVS5zaGlmdCgpfTtsZXQgb2U9MDtjb25zdCBzZT0oZSx0KT0+KHtpZDpvZSsrLHJlc291cmNlOm4uY3JlYXRlVGV4dHVyZSgpLHdpZHRoOmUsaGVpZ2h0OnQsYXJlYTplKnQsc21vb3RoOiExfSk7bGV0IGllPS0xO2NvbnN0IGNlPWU9PntpZT1lfSxsZT1bbnVsbCxudWxsLG51bGxdLHVlPShlLHQscj0hMSk9Pntjb25zdCBhPXNlKGUsdCk7cmV0dXJuKChlLHQ9ITEpPT57aWUhPT1uLlRFWFRVUkUwJiYoY2Uobi5URVhUVVJFMCksbi5hY3RpdmVUZXh0dXJlKG4uVEVYVFVSRTApKSxsZVswXT1lLG4uYmluZFRleHR1cmUobi5URVhUVVJFXzJELGUucmVzb3VyY2UpLG4udGV4UGFyYW1ldGVyaShuLlRFWFRVUkVfMkQsbi5URVhUVVJFX1dSQVBfUyxuLkNMQU1QX1RPX0VER0UpLG4udGV4UGFyYW1ldGVyaShuLlRFWFRVUkVfMkQsbi5URVhUVVJFX1dSQVBfVCxuLkNMQU1QX1RPX0VER0UpLG4udGV4UGFyYW1ldGVyaShuLlRFWFRVUkVfMkQsbi5URVhUVVJFX01JTl9GSUxURVIsdD9uLkxJTkVBUjpuLk5FQVJFU1QpLG4udGV4UGFyYW1ldGVyaShuLlRFWFRVUkVfMkQsbi5URVhUVVJFX01BR19GSUxURVIsdD9uLkxJTkVBUjpuLk5FQVJFU1QpLG4udGV4U3RvcmFnZTJEKG4uVEVYVFVSRV8yRCwxLG4uUkdCQTgsZS53aWR0aCxlLmhlaWdodCl9KShhLHIpLGF9LGhlPShlLHIsYT0hMSk9Pntjb25zdCBvPU4ubGVuZ3RoP04uc2hpZnQoKTp7aWQ6dGUrKyx3aWR0aDowLGhlaWdodDowLGNsaXBMZXZlbDowLG1zYWE6ITEsbWFzazohMSxjb2xvcjpudWxsLHRleHR1cmU6bnVsbCxzdGVuY2lsOm51bGx9O3JldHVybiBvLndpZHRoPWUsby5oZWlnaHQ9cixhPyhvLm1zYWE9ITAsby50ZXh0dXJlPW51bGwsby5jb2xvcj0oKGUscik9PntlPU1hdGgubWF4KDI1NixjKGUpKSxyPU1hdGgubWF4KDI1NixjKHIpKTtjb25zdCBhPW5lKGUqcik7cmV0dXJuKGEud2lkdGg8ZXx8YS5oZWlnaHQ8cikmJihlPU1hdGgubWF4KGUsYS53aWR0aCkscj1NYXRoLm1heChyLGEuaGVpZ2h0KSxhLndpZHRoPWUsYS5oZWlnaHQ9cixhLmFyZWE9ZSpyLG4uYmluZFJlbmRlcmJ1ZmZlcihuLlJFTkRFUkJVRkZFUixhLnJlc291cmNlKSxuLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZShuLlJFTkRFUkJVRkZFUix0LG4uUkdCQTgsZSxyKSxuLmJpbmRSZW5kZXJidWZmZXIobi5SRU5ERVJCVUZGRVIsYS5zdGVuY2lsLnJlc291cmNlKSxuLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZShuLlJFTkRFUkJVRkZFUix0LG4uU1RFTkNJTF9JTkRFWDgsZSxyKSksYS5kaXJ0eT0hMCxhfSkoZSxyKSxvLnN0ZW5jaWw9by5jb2xvci5zdGVuY2lsKTooby5tc2FhPSExLG8udGV4dHVyZT11ZShlLHIpLG8uY29sb3I9bnVsbCxvLnN0ZW5jaWw9KChlLHQpPT57Y29uc3Qgcj1hZShlLHQpO3JldHVybiByLndpZHRoPT09ZSYmci5oZWlnaHQ9PT10fHwoci53aWR0aD1lLHIuaGVpZ2h0PXQsci5hcmVhPWUqdCxyLmRpcnR5PSExLG4uYmluZFJlbmRlcmJ1ZmZlcihuLlJFTkRFUkJVRkZFUixyLnJlc291cmNlKSxuLnJlbmRlcmJ1ZmZlclN0b3JhZ2Uobi5SRU5ERVJCVUZGRVIsbi5TVEVOQ0lMX0lOREVYOCxlLHQpKSxyfSkoZSxyKSksby5tYXNrPSExLG8uY2xpcExldmVsPTAsb307bGV0IGJlPTA7Y29uc3QgZGU9ZT0+e2JlPWV9LGZlPSgpPT5iZSxtZT1bXSx2ZT0oKT0+e3ZhciB0O3JldHVybiBiZSBpbiBtZXx8KHQ9aGUoZSxlLCEwKSxtZVtiZV09dCksbWVbYmVdfSxfZT1bXTtsZXQgcGU9bnVsbDtjb25zdCBnZT0oKT0+KHBlfHwocGU9KCgpPT57Y29uc3QgdD1zZShlLGUpO3JldHVybiBuLmFjdGl2ZVRleHR1cmUobi5URVhUVVJFMyksbi5iaW5kVGV4dHVyZShuLlRFWFRVUkVfMkQsdC5yZXNvdXJjZSksbi50ZXhQYXJhbWV0ZXJpKG4uVEVYVFVSRV8yRCxuLlRFWFRVUkVfV1JBUF9TLG4uQ0xBTVBfVE9fRURHRSksbi50ZXhQYXJhbWV0ZXJpKG4uVEVYVFVSRV8yRCxuLlRFWFRVUkVfV1JBUF9ULG4uQ0xBTVBfVE9fRURHRSksbi50ZXhQYXJhbWV0ZXJpKG4uVEVYVFVSRV8yRCxuLlRFWFRVUkVfTUlOX0ZJTFRFUixuLkxJTkVBUiksbi50ZXhQYXJhbWV0ZXJpKG4uVEVYVFVSRV8yRCxuLlRFWFRVUkVfTUFHX0ZJTFRFUixuLk5FQVJFU1QpLG4udGV4U3RvcmFnZTJEKG4uVEVYVFVSRV8yRCwxLG4uUkdCQTgsdC53aWR0aCx0LmhlaWdodCksbi5hY3RpdmVUZXh0dXJlKC0xIT09aWU/aWU6bi5URVhUVVJFMCksdH0pKCkpLHBlKSx4ZT1bXSxFZT1lPT4oZSBpbiB4ZXx8KHhlW2VdPW5ldyBGbG9hdDMyQXJyYXkoW051bWJlci5NQVhfVkFMVUUsTnVtYmVyLk1BWF9WQUxVRSwtTnVtYmVyLk1BWF9WQUxVRSwtTnVtYmVyLk1BWF9WQUxVRV0pKSx4ZVtlXSksQWU9W10seWU9ZT0+KGUgaW4gQWV8fChBZVtlXT1uZXcgRmxvYXQzMkFycmF5KFtOdW1iZXIuTUFYX1ZBTFVFLE51bWJlci5NQVhfVkFMVUUsLU51bWJlci5NQVhfVkFMVUUsLU51bWJlci5NQVhfVkFMVUVdKSksQWVbZV0pO2xldCBUZT0wO2NvbnN0IFJlPWU9PntUZT1lfSxNZT0oKT0+VGUsd2U9KCk9PntfZS5sZW5ndGg9MCxkZSgwKTtjb25zdCBlPW1lO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKWVlKGVbdF0pO2UubGVuZ3RoPTB9LEZlPShlLHQscixhPSEwKT0+e2lmKGUuY2xlYXJBcnJheXNJbnN0YW5jZWQoKSxlLiRzdGFja0F0dGFjaG1lbnRPYmplY3QubGVuZ3RoKWZvcihsZXQgdD0wO3Q8ZS4kc3RhY2tBdHRhY2htZW50T2JqZWN0Lmxlbmd0aDsrK3Qpe2NvbnN0IG49ZS4kc3RhY2tBdHRhY2htZW50T2JqZWN0W3RdO24mJmVlKG4pfWVsc2UgZS4kbWFpbkF0dGFjaG1lbnRPYmplY3QmJmVlKGUuJG1haW5BdHRhY2htZW50T2JqZWN0KTthJiZ3ZSgpLFYobnVsbCkscSgpJiYoWSghMSksbi5iaW5kRnJhbWVidWZmZXIobi5GUkFNRUJVRkZFUixudWxsKSksZS4kbWFpbkF0dGFjaG1lbnRPYmplY3Q9aGUodCxyLCEwKSxlLmJpbmQoZS4kbWFpbkF0dGFjaG1lbnRPYmplY3QpfSwkZT0oZSx0LHI9bnVsbCxhPSExKT0+ey0xIT09aWUmJnQ9PT1pZXx8KGNlKHQpLG4uYWN0aXZlVGV4dHVyZSh0KSk7Y29uc3Qgbz1sZVtlXTtudWxsIT09byYmbnVsbCE9PXImJm8uaWQ9PT1yLmlkfHxyPT09b3x8KGxlW2VdPXIsbi5iaW5kVGV4dHVyZShuLlRFWFRVUkVfMkQscj9yLnJlc291cmNlOm51bGwpLHImJnIuc21vb3RoIT09YSYmKHIuc21vb3RoPWEsbi50ZXhQYXJhbWV0ZXJpKG4uVEVYVFVSRV8yRCxuLlRFWFRVUkVfTUlOX0ZJTFRFUixhP24uTElORUFSOm4uTkVBUkVTVCksbi50ZXhQYXJhbWV0ZXJpKG4uVEVYVFVSRV8yRCxuLlRFWFRVUkVfTUFHX0ZJTFRFUixhP24uTElORUFSOm4uTkVBUkVTVCkpKX0sT2U9KGUsdD0hMSk9PnskZSgyLG4uVEVYVFVSRTIsbnVsbCksJGUoMSxuLlRFWFRVUkUxLG51bGwpLCRlKDAsbi5URVhUVVJFMCxlLHQpfSxTZT0oKT0+e2NvbnN0IGU9ci5jdXJyZW50QXR0YWNobWVudE9iamVjdDtpZighZSlyZXR1cm47Y29uc3QgdD1lLmNsaXBMZXZlbDtsZXQgYT0wO2ZvcihsZXQgZT0wO2U8dDsrK2UpYXw9KDE8PHQtZSktMTtuLnN0ZW5jaWxNYXNrKDI1NSksbi5zdGVuY2lsRnVuYyhuLkVRVUFMLDI1NSZhLGEpLG4uc3RlbmNpbE9wKG4uS0VFUCxuLktFRVAsbi5LRUVQKSxuLmNvbG9yTWFzayghMCwhMCwhMCwhMCksbi5kaXNhYmxlKG4uU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFKSxuLmRpc2FibGUobi5TQ0lTU09SX1RFU1QpfTtsZXQga2U9ITE7Y29uc3QgQ2U9ZT0+e2tlPWV9LFBlPSgpPT5rZSxCZT1uZXcgTWFwLEllPW5ldyBNYXAsTGU9KGUsdCk9Pntjb25zdCByPVcoKTtpZihyJiZ0LmlkPT09ci5pZClyZXR1cm47dmFyIGEsbzsoZT0+e1YoZSkscSgpfHwoWSghMCksbi5iaW5kRnJhbWVidWZmZXIobi5GUkFNRUJVRkZFUixEKSksZS5tc2FhPyhuLmJpbmRSZW5kZXJidWZmZXIobi5SRU5ERVJCVUZGRVIsZS5jb2xvci5yZXNvdXJjZSksbi5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcihuLkZSQU1FQlVGRkVSLG4uQ09MT1JfQVRUQUNITUVOVDAsbi5SRU5ERVJCVUZGRVIsZS5jb2xvci5yZXNvdXJjZSkpOihPZShlLnRleHR1cmUpLG4uZnJhbWVidWZmZXJUZXh0dXJlMkQobi5GUkFNRUJVRkZFUixuLkNPTE9SX0FUVEFDSE1FTlQwLG4uVEVYVFVSRV8yRCxlLnRleHR1cmUucmVzb3VyY2UsMCkpLG4uYmluZFJlbmRlcmJ1ZmZlcihuLlJFTkRFUkJVRkZFUixlLnN0ZW5jaWwucmVzb3VyY2UpLG4uZnJhbWVidWZmZXJSZW5kZXJidWZmZXIobi5GUkFNRUJVRkZFUixuLlNURU5DSUxfQVRUQUNITUVOVCxuLlJFTkRFUkJVRkZFUixlLnN0ZW5jaWwucmVzb3VyY2UpfSkodCksciYmci53aWR0aD09PXQud2lkdGgmJnIuaGVpZ2h0PT09dC5oZWlnaHR8fChhPXQud2lkdGgsbz10LmhlaWdodCxwPWEsZz1vLG4udmlld3BvcnQoMCwwLHQud2lkdGgsdC5oZWlnaHQpKTtjb25zdCBzPXQubXNhYT90LmNvbG9yOnQuc3RlbmNpbDt2YXIgaTtzLmRpcnR5JiYocy5kaXJ0eT0hMSxlLmNsZWFyUmVjdCgwLDAsdC53aWR0aCx0LmhlaWdodCkpLCEoaT10Lm1hc2spJiZQZSgpPyhDZSghMSksbi5kaXNhYmxlKG4uU1RFTkNJTF9URVNUKSxuLmRpc2FibGUobi5TQ0lTU09SX1RFU1QpKTppJiYhUGUoKSYmKENlKCEwKSxuLmVuYWJsZShuLlNURU5DSUxfVEVTVCksU2UoKSl9LFVlPWU9PntpZighZS4kc3RhY2subGVuZ3RoKXJldHVybjtjb25zdCB0PWUuJHN0YWNrLnBvcCgpO3ZhciBuO2UuJG1hdHJpeFswXT10WzBdLGUuJG1hdHJpeFsxXT10WzFdLGUuJG1hdHJpeFszXT10WzNdLGUuJG1hdHJpeFs0XT10WzRdLGUuJG1hdHJpeFs2XT10WzZdLGUuJG1hdHJpeFs3XT10WzddLG49dCxiLnB1c2gobil9LE5lPShlLHQscixhKT0+e24uZW5hYmxlKG4uU0NJU1NPUl9URVNUKSxuLnNjaXNzb3IoZSx0LHIrMSxhKzEpLG4uY2xlYXIobi5DT0xPUl9CVUZGRVJfQklUfG4uU1RFTkNJTF9CVUZGRVJfQklUKSxuLnNjaXNzb3IoZSx0LHIsYSl9LERlPShlLHQsbixyLGEsbyxzLGksYyxsLHUsaCxiKT0+e2NvbnN0IGQ9ZS5sZW5ndGgtNTtmb3IobGV0IGY9MztmPGQ7Zis9Myl7bGV0IGQ9MTcqbjtlW2YrMl0/KHRbZCsrXT1lW2YtM10sdFtkKytdPWVbZi0yXSx0W2QrK109MCx0W2QrK109MCx0W2QrK109bCx0W2QrK109dSx0W2QrK109aCx0W2QrK109Yix0W2QrK109cix0W2QrK109YSx0W2QrK109MCx0W2QrK109byx0W2QrK109cyx0W2QrK109MCx0W2QrK109aSx0W2QrK109Yyx0W2QrK109MCx0W2QrK109ZVtmXSx0W2QrK109ZVtmKzFdLHRbZCsrXT0uNSx0W2QrK109MCx0W2QrK109bCx0W2QrK109dSx0W2QrK109aCx0W2QrK109Yix0W2QrK109cix0W2QrK109YSx0W2QrK109MCx0W2QrK109byx0W2QrK109cyx0W2QrK109MCx0W2QrK109aSx0W2QrK109Yyx0W2QrK109MCx0W2QrK109ZVtmKzNdLHRbZCsrXT1lW2YrNF0sdFtkKytdPTEsdFtkKytdPTEsdFtkKytdPWwsdFtkKytdPXUsdFtkKytdPWgsdFtkKytdPWIsdFtkKytdPXIsdFtkKytdPWEsdFtkKytdPTAsdFtkKytdPW8sdFtkKytdPXMsdFtkKytdPTAsdFtkKytdPWksdFtkKytdPWMsdFtkKytdPTApOmVbZis1XT8odFtkKytdPWVbMF0sdFtkKytdPWVbMV0sdFtkKytdPS41LHRbZCsrXT0uNSx0W2QrK109bCx0W2QrK109dSx0W2QrK109aCx0W2QrK109Yix0W2QrK109cix0W2QrK109YSx0W2QrK109MCx0W2QrK109byx0W2QrK109cyx0W2QrK109MCx0W2QrK109aSx0W2QrK109Yyx0W2QrK109MCx0W2QrK109ZVtmXSx0W2QrK109ZVtmKzFdLHRbZCsrXT0uNSx0W2QrK109LjUsdFtkKytdPWwsdFtkKytdPXUsdFtkKytdPWgsdFtkKytdPWIsdFtkKytdPXIsdFtkKytdPWEsdFtkKytdPTAsdFtkKytdPW8sdFtkKytdPXMsdFtkKytdPTAsdFtkKytdPWksdFtkKytdPWMsdFtkKytdPTAsdFtkKytdPWVbZis2XSx0W2QrK109ZVtmKzddLHRbZCsrXT0uNSx0W2QrK109LjUsdFtkKytdPWwsdFtkKytdPXUsdFtkKytdPWgsdFtkKytdPWIsdFtkKytdPXIsdFtkKytdPWEsdFtkKytdPTAsdFtkKytdPW8sdFtkKytdPXMsdFtkKytdPTAsdFtkKytdPWksdFtkKytdPWMsdFtkKytdPTApOih0W2QrK109ZVswXSx0W2QrK109ZVsxXSx0W2QrK109LjUsdFtkKytdPS41LHRbZCsrXT1sLHRbZCsrXT11LHRbZCsrXT1oLHRbZCsrXT1iLHRbZCsrXT1yLHRbZCsrXT1hLHRbZCsrXT0wLHRbZCsrXT1vLHRbZCsrXT1zLHRbZCsrXT0wLHRbZCsrXT1pLHRbZCsrXT1jLHRbZCsrXT0wLHRbZCsrXT1lW2ZdLHRbZCsrXT1lW2YrMV0sdFtkKytdPS41LHRbZCsrXT0uNSx0W2QrK109bCx0W2QrK109dSx0W2QrK109aCx0W2QrK109Yix0W2QrK109cix0W2QrK109YSx0W2QrK109MCx0W2QrK109byx0W2QrK109cyx0W2QrK109MCx0W2QrK109aSx0W2QrK109Yyx0W2QrK109MCx0W2QrK109ZVtmKzNdLHRbZCsrXT1lW2YrNF0sdFtkKytdPS41LHRbZCsrXT0uNSx0W2QrK109bCx0W2QrK109dSx0W2QrK109aCx0W2QrK109Yix0W2QrK109cix0W2QrK109YSx0W2QrK109MCx0W2QrK109byx0W2QrK109cyx0W2QrK109MCx0W2QrK109aSx0W2QrK109Yyx0W2QrK109MCksbis9M31yZXR1cm4gbn0samU9KGUsdD0iZmlsbCIpPT57Y29uc3Qgbj0iZmlsbCI9PT10P3IuJGZpbGxTdHlsZTpyLiRzdHJva2VTdHlsZSxhPW5bMF0sbz1uWzFdLHM9blsyXSxpPW5bM10sYz1yLiRtYXRyaXgsbD14KCksdT1FKCksaD1jWzBdL2wsYj1jWzNdL2wsZD1jWzZdL2wsZj1jWzFdL3UsbT1jWzRdL3Usdj1jWzddL3U7bGV0IF89MDtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoOysrdClfKz01MSooZVt0XS5sZW5ndGgvMy0yKTtjb25zdCBwPW5ldyBGbG9hdDMyQXJyYXkoXyk7bGV0IGc9MDtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoOysrdClnPURlKGVbdF0scCxnLGgsZixiLG0sZCx2LGEsbyxzLGkpO3JldHVybntidWZmZXI6cCxpbmRleENvdW50Omd9fTtsZXQgWGU9bmV3IEZsb2F0MzJBcnJheSgxMjgpLHplPTA7Y29uc3QgVmU9ZT0+e2NvbnN0IHQ9ZS5sZW5ndGgremU7aWYodD5YZS5sZW5ndGgpe2NvbnN0IHI9bmV3IEZsb2F0MzJBcnJheSgobj10LG4tLSxufD1uPj4xLG58PW4+PjIsbnw9bj4+NCxufD1uPj44LG58PW4+PjE2LCsrbikpO3Iuc2V0KFhlKSxyLnNldChlLHplKSxYZT1yfWVsc2UgWGUuc2V0KGUsemUpO3ZhciBuO3plKz1lLmxlbmd0aH0sV2U9W10sR2U9W10sWWU9KCk9PntHZS5sZW5ndGg9MCx6ZT0wLFdlLmxlbmd0aD0wfSxxZT1bXSxLZT0oZSx0LG4pPT57Y29uc3Qgcj17eDp0LngtZS54LHk6dC55LWUueX0sYT0oKGUsdCxuKT0+e2NvbnN0IHI9TWF0aC5zcXJ0KGUqZSt0KnQpO3JldHVybnt4Oi10L3Iqbix5OmUvcipufX0pKHIueCxyLnksbiksbz17eDplLngrYS54LHk6ZS55K2EueX0scz17eDp0LngrYS54LHk6dC55K2EueX0saT17eDplLngtYS54LHk6ZS55LWEueX0sYz17eDp0LngtYS54LHk6dC55LWEueX07cmV0dXJuW28ueCxvLnksITEscy54LHMueSwhMSxjLngsYy55LCExLGkueCxpLnksITEsby54LG8ueSwhMV19LEhlPShlLHQsbik9Pih7eDplLngrKHQueC1lLngpKm4seTplLnkrKHQueS1lLnkpKm59KSxaZT0oZSx0LG4scj0uNSk9Pntjb25zdCBhPUhlKGUsdCxyKSxvPUhlKHQsbixyKSxzPUhlKGEsbyxyKTtyZXR1cm5bW2UsYSxzXSxbcyxvLG5dXX0sUWU9KGUsdCxuLHIpPT4oe3g6KDEtZSkqKjIqdC54KzIqKDEtZSkqZSpuLngrZSoqMipyLngseTooMS1lKSoqMip0LnkrMiooMS1lKSplKm4ueStlKioyKnIueX0pLEplPShlLHQsbixyKT0+KHt4OjIqKDEtZSkqKG4ueC10LngpKzIqZSooci54LW4ueCkseToyKigxLWUpKihuLnktdC55KSsyKmUqKHIueS1uLnkpfSksZXQ9ZT0+e2NvbnN0IHQ9TWF0aC5zcXJ0KGUueCplLngrZS55KmUueSk7cmV0dXJuIDA9PT10P3t4OjAseTowfTp7eDplLngvdCx5OmUueS90fX0sdHQ9KGUsdCxuLHIpPT57Y29uc3QgYT1bMCwuNSwxXSxvPVtdO2ZvcihsZXQgcz0wO3M8YS5sZW5ndGg7KytzKXtjb25zdCBpPWFbc10sYz1RZShpLGUsdCxuKSxsPUplKGksZSx0LG4pLHU9ZXQoe3g6LWwueSx5OmwueH0pO28ucHVzaCh7eDpjLngrdS54KnIseTpjLnkrdS55KnJ9KX1yZXR1cm4gb30sbnQ9KGUsdCxuLHIpPT57Y29uc3QgYT0oKGUsdCxuLHI9NCk9PntsZXQgYT1bW2UsdCxuXV07Zm9yKGxldCBlPTA7ZTxyOysrZSl7Y29uc3QgZT1bXTtmb3IobGV0IHQ9MDt0PGEubGVuZ3RoOysrdCl7Y29uc3Qgbj1hW3RdO2lmKCFuKWNvbnRpbnVlO2NvbnN0IHI9WmUoblswXSxuWzFdLG5bMl0sLjUpO2UucHVzaChyWzBdLHJbMV0pfWE9ZX1yZXR1cm4gYX0pKGUsdCxuLDUpLG89W10scz1bXTtmb3IobGV0IGU9MDtlPGEubGVuZ3RoOysrZSl7Y29uc3RbdCxuLGldPWFbZV07by5wdXNoKHR0KHQsbixpLCtyKSkscy5wdXNoKHR0KHQsbixpLC1yKSl9Y29uc3QgaT1vWzBdWzBdLGM9W2kueCxpLnksITFdO2ZvcihsZXQgZT0wO2U8by5sZW5ndGg7KytlKXtjb25zdCB0PW9bZV07Yy5wdXNoKHRbMV0ueCx0WzFdLnksITAsdFsyXS54LHRbMl0ueSwhMSl9Y29uc3QgbD1bLi4uc10ucmV2ZXJzZSgpO2ZvcihsZXQgZT0wO2U8bC5sZW5ndGg7KytlKXtjb25zdFt0LG4scl09bFtlXTtsW2VdPVtyLG4sdF19Y29uc3QgdT1sWzBdWzBdO2MucHVzaCh1LngsdS55LCExKTtmb3IobGV0IGU9MDtlPGwubGVuZ3RoOysrZSl7Y29uc3QgdD1sW2VdO2MucHVzaCh0WzFdLngsdFsxXS55LCEwLHRbMl0ueCx0WzJdLnksITEpfXJldHVybiBjfSxydD0oZSx0LG4scik9Pntjb25zdCBhPVtdO2ZvcihsZXQgbz0wO288ci5sZW5ndGg7bys9Myl7aWYocltvKzJdKWNvbnRpbnVlO2NvbnN0IHM9cltvXSxpPXJbbysxXTtNYXRoLnNxcnQoTWF0aC5wb3cocy1lLDIpK01hdGgucG93KGktdCwyKSk9PT1uJiZhLnB1c2gocyxpKX1yZXR1cm4gYX0sYXQ9bmV3IE9mZnNjcmVlbkNhbnZhcygxLDEpLmdldENvbnRleHQoIjJkIiksb3Q9KGUsdCk9PnthdC5iZWdpblBhdGgoKSxhdC5tb3ZlVG8odFswXSx0WzFdKTtmb3IobGV0IGU9MztlPHQubGVuZ3RoO2UrPTMpdFtlKzJdPyhhdC5xdWFkcmF0aWNDdXJ2ZVRvKHRbZV0sdFtlKzFdLHRbZSszXSx0W2UrNF0pLGUrPTMpOmF0LmxpbmVUbyh0W2VdLHRbZSsxXSk7YXQuY2xvc2VQYXRoKCk7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kz0yKXtjb25zdCBuPWVbdF0scj1lW3QrMV07aWYoIWF0LmlzUG9pbnRJblBhdGgobixyKSlyZXR1cm5bbixyXX1yZXR1cm4gbnVsbH0sc3Q9KGUsdCxuLHIsYT0hMSk9Pntjb25zdCBvPWE/MDpyLmxlbmd0aC0xLHM9YT9yLmxlbmd0aC0xOnIubGVuZ3RoLTIsaT1ydChlLHQsbixyW29dKSxjPXJ0KGUsdCxuLHJbc10pLGw9b3QoaSxyW3NdKTtpZighbClyZXR1cm47Y29uc3QgdT1vdChjLHJbb10pO2lmKCF1KXJldHVybjtjb25zdCBoPU1hdGguYXRhbjIobFsxXS10LGxbMF0tZSk7bGV0IGI9TWF0aC5hdGFuMih1WzFdLXQsdVswXS1lKS1oO2I+TWF0aC5QST9iLT0yKk1hdGguUEk6YjwtTWF0aC5QSSYmKGIrPTIqTWF0aC5QSSk7Y29uc3QgZD1iLzgsZj1bZSx0LCExXTtmb3IobGV0IHI9MDtyPD04O3IrKyl7Y29uc3QgYT1oK3IqZCxvPWUrbipNYXRoLmNvcyhhKSxzPXQrbipNYXRoLnNpbihhKTtmLnB1c2gobyxzLCExKX1yLnNwbGljZSgtMSwwLGYpfSxpdD0oZSx0LG4scixhPSExKT0+e2NvbnN0IG89YT8wOnIubGVuZ3RoLTEscz1hP3IubGVuZ3RoLTE6ci5sZW5ndGgtMixpPXJ0KGUsdCxuLHJbb10pLGM9cnQoZSx0LG4scltzXSk7aWYoaVswXT09PWNbMF0mJmlbMV09PT1jWzFdfHxpWzBdPT09Y1syXSYmaVsxXT09PWNbM10pcmV0dXJuO2NvbnN0IGw9b3QoaSxyW3NdKTtpZighbClyZXR1cm47Y29uc3QgdT1vdChjLHJbb10pO3UmJnIuc3BsaWNlKC0xLDAsW2UsdCwhMSxsWzBdLGxbMV0sITEsdVswXSx1WzFdLCExLGUsdCwhMV0pfSxjdD0oZSx0LG4scixhLG89ITEpPT57Y29uc3Qgcz1vPzA6YS5sZW5ndGgtMSxpPW8/YS5sZW5ndGgtMTphLmxlbmd0aC0yLGM9cnQoZS54LGUueSxyLGFbc10pLGw9cnQoZS54LGUueSxyLGFbaV0pO2lmKGNbMF09PT1sWzBdJiZjWzFdPT09bFsxXXx8Y1swXT09PWxbMl0mJmNbMV09PT1sWzNdKXJldHVybjtjb25zdCB1PW90KGMsYVtpXSk7aWYoIXUpcmV0dXJuO2NvbnN0IGg9b3QobCxhW3NdKTtpZighaClyZXR1cm47Y29uc3QgYj10LngtZS54LGQ9dC55LWUueSxmPU1hdGguaHlwb3QoYixkKSxtPXt4OmIvZix5OmQvZn0sdj1uLngtZS54LF89bi55LWUueSxwPU1hdGguaHlwb3QodixfKSxnPXt4OnYvcCx5Ol8vcH0seD1tLngsRT1tLnksQT1nLngseT1nLnksVD14KnktRSpBOzA9PT1UJiZhLnNwbGljZSgtMSwwLFtlLngsZS55LCExLHVbMF0sdVsxXSwhMSxoWzBdLGhbMV0sITFdKTtjb25zdCBSPSgoaFswXS11WzBdKSp5LShoWzFdLXVbMV0pKkEpL1QsTT11WzBdK1IqeCx3PXVbMV0rUipFO2Euc3BsaWNlKC0xLDAsW2UueCxlLnksITEsdVswXSx1WzFdLCExLE0sdywhMSxlLngsZS55LCExLGhbMF0saFsxXSwhMSxNLHcsITFdKX0sbHQ9KGUsdCk9Pntjb25zdCBuPXt4OmVbMF0seTplWzFdfSxhPXt4OjAseTowfSxvPXt4OjAseTowfSxzPXt4OjAseTowfSxpPVtdO2ZvcihsZXQgYz0zO2M8ZS5sZW5ndGg7Yys9Myl7Y29uc3QgbD1lW2NdLHU9ZVtjKzFdO2lmKGVbYysyXSlhLng9bCxhLnk9dTtlbHNle2lmKG8ueD1sLG8ueT11LGVbYy0xXT9pLnB1c2gobnQobixhLG8sdCkpOmkucHVzaChLZShuLG8sdCkpLGkubGVuZ3RoPjEpc3dpdGNoKHIuam9pbnRzKXtjYXNlIDA6aXQobi54LG4ueSx0LGkpO2JyZWFrO2Nhc2UgMTpzLng9ZVtjLTZdLHMueT1lW2MtNV0sY3QobixvLHMsdCxpKTticmVhaztjYXNlIDI6c3Qobi54LG4ueSx0LGkpfW4ueD1vLngsbi55PW8ueX19aWYoZVswXT09PWVbZS5sZW5ndGgtM10mJmVbMV09PT1lW2UubGVuZ3RoLTJdKXN3aXRjaChyLmpvaW50cyl7Y2FzZSAwOml0KG4ueCxuLnksdCxpLCEwKTticmVhaztjYXNlIDE6bi54PWVbMF0sbi55PWVbMV0sby54PWVbM10sby55PWVbNF0scy54PWVbZS5sZW5ndGgtNl0scy55PWVbZS5sZW5ndGgtNV0sY3QobixvLHMsdCxpLCEwKTticmVhaztjYXNlIDI6c3Qobi54LG4ueSx0LGksITApfWVsc2Ugc3dpdGNoKHIuY2Fwcyl7Y2FzZSAxOigoZSx0LG4pPT57Zm9yKGxldCByPTA7cjwyOysrcil7bGV0IGE9MCxvPTAscz0wLGk9MDswPT09cj8oYT1lWzBdLG89ZVsxXSxzPWVbM10saT1lWzRdKTooYT1lW2UubGVuZ3RoLTNdLG89ZVtlLmxlbmd0aC0yXSxzPWVbZS5sZW5ndGgtNl0saT1lW2UubGVuZ3RoLTVdKTtjb25zdCBjPXMtYSxsPWktbyx1PU1hdGguYXRhbjIobCxjKSxoPXUrTWF0aC5QSS8yLGI9dS1NYXRoLlBJLzIsZD0xNixmPShiLWgpL2QsbT1bXTtmb3IobGV0IGU9MDtlPD1kO2UrKyl7Y29uc3Qgbj1iK2YqZSxyPWErdCpNYXRoLmNvcyhuKSxzPW8rdCpNYXRoLnNpbihuKTttLnB1c2gocixzLCExKX0wPT09cj9uLnVuc2hpZnQobSk6bi5wdXNoKG0pfX0pKGUsdCxpKTticmVhaztjYXNlIDI6KChlLHQsbik9Pntmb3IobGV0IHI9MDtyPDI7KytyKXtsZXQgYT0wLG89MCxzPTAsaT0wOzA9PT1yPyhhPWVbMF0sbz1lWzFdLHM9ZVszXSxpPWVbNF0pOihhPWVbZS5sZW5ndGgtM10sbz1lW2UubGVuZ3RoLTJdLHM9ZVtlLmxlbmd0aC02XSxpPWVbZS5sZW5ndGgtNV0pO2NvbnN0IGM9LShzLWEpLGw9LShpLW8pLHU9TWF0aC5zcXJ0KGMqYytsKmwpO2lmKDA9PT11KWNvbnRpbnVlO2NvbnN0IGg9Yy91LGI9bC91LGQ9YSt0KmgsZj1vK3QqYixtPS1iLHY9W2QrdCpoK3QqbSxmK3QqYit0KmgsITEsZCt0KmgtdCptLGYrdCpiLXQqaCwhMSxkLXQqaC10Km0sZi10KmItdCpoLCExLGQrdCpoK3QqbSxmK3QqYit0KmgsITEsZC10KmgtdCptLGYtdCpiLXQqaCwhMSxkLXQqaCt0Km0sZi10KmIrdCpoLCExXTswPT09cj9uLnVuc2hpZnQodik6bi5wdXNoKHYpfX0pKGUsdCxpKX1yZXR1cm4gaX0sdXQ9ZT0+e2NvbnN0IHQ9ci50aGlja25lc3MvMixuPVtdO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7KytyKXtjb25zdCBhPWx0KGVbcl0sdCk7bi5wdXNoKC4uLmEpfXJldHVybiBqZShuLCJzdHJva2UiKX0saHQ9bmV3IE1hcCxidD0oKT0+e2h0LmNsZWFyKCl9LGR0PSgpPT4oe2lkOiJmdW5jdGlvbiI9PXR5cGVvZiBjcnlwdG8/LnJhbmRvbVVVSUQ/Y3J5cHRvLnJhbmRvbVVVSUQoKToieHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Ii5yZXBsYWNlKC9beHldL2csZT0+e2NvbnN0IHQ9MTYqTWF0aC5yYW5kb20oKXwwO3JldHVybigieCI9PT1lP3Q6MyZ0fDgpLnRvU3RyaW5nKDE2KX0pLHJlc291cmNlOm4uY3JlYXRlVmVydGV4QXJyYXkoKSx2ZXJ0ZXhCdWZmZXI6bi5jcmVhdGVCdWZmZXIoKSx2ZXJ0ZXhMZW5ndGg6MH0pO2xldCBmdDtjb25zdCBtdD1lPT57ZnQmJmZ0LmlkPT09ZS5pZHx8KGZ0PWUsbi5iaW5kVmVydGV4QXJyYXkoZS5yZXNvdXJjZSkpfSx2dD1bXSxfdD1uZXcgRmxvYXQzMkFycmF5KFswLDAsMCwxLDEsMCwxLDFdKTtsZXQgcHQ7bGV0IGd0O2xldCB4dDtjb25zdCBFdD0oKT0+KHh0fHwoeHQ9KCgpPT57Y29uc3QgZT1kdCgpO210KGUpLG4uYmluZEJ1ZmZlcihuLkFSUkFZX0JVRkZFUixlLnZlcnRleEJ1ZmZlcik7Y29uc3QgdD1uZXcgRmxvYXQzMkFycmF5KFswLDAsMSwwLDAsMSwxLDEsMCwxLDEsMF0pO3JldHVybiBuLmJ1ZmZlckRhdGEobi5BUlJBWV9CVUZGRVIsdCxuLlNUQVRJQ19EUkFXKSxuLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDApLG4udmVydGV4QXR0cmliUG9pbnRlcigwLDIsbi5GTE9BVCwhMSwwLDApLGV9KSgpKSx4dCksQXQ9KCk9Pntjb25zdCBlPSgoKT0+e2lmKHZ0Lmxlbmd0aClyZXR1cm4gdnQucG9wKCk7Y29uc3QgZT1kdCgpO3JldHVybiBtdChlKSxuLmJpbmRCdWZmZXIobi5BUlJBWV9CVUZGRVIsZS52ZXJ0ZXhCdWZmZXIpLG4uZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoMCksbi5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSgxKSxuLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDIpLG4uZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoMyksbi5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSg0KSxuLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDUpLG4udmVydGV4QXR0cmliUG9pbnRlcigwLDIsbi5GTE9BVCwhMSw2OCwwKSxuLnZlcnRleEF0dHJpYlBvaW50ZXIoMSwyLG4uRkxPQVQsITEsNjgsOCksbi52ZXJ0ZXhBdHRyaWJQb2ludGVyKDIsNCxuLkZMT0FULCExLDY4LDE2KSxuLnZlcnRleEF0dHJpYlBvaW50ZXIoMywzLG4uRkxPQVQsITEsNjgsMzIpLG4udmVydGV4QXR0cmliUG9pbnRlcig0LDMsbi5GTE9BVCwhMSw2OCw0NCksbi52ZXJ0ZXhBdHRyaWJQb2ludGVyKDUsMyxuLkZMT0FULCExLDY4LDU2KSxlfSkoKTttdChlKTtjb25zdCB0PVhlLHI9emU7cmV0dXJuIG4uYmluZEJ1ZmZlcihuLkFSUkFZX0JVRkZFUixlLnZlcnRleEJ1ZmZlciksZS52ZXJ0ZXhMZW5ndGg8dC5sZW5ndGgmJihlLnZlcnRleExlbmd0aD1jKHQubGVuZ3RoKSxuLmJ1ZmZlckRhdGEobi5BUlJBWV9CVUZGRVIsNCplLnZlcnRleExlbmd0aCxuLkRZTkFNSUNfRFJBVykpLG4uYnVmZmVyU3ViRGF0YShuLkFSUkFZX0JVRkZFUiwwLHQuc3ViYXJyYXkoMCxyKSksZX0seXQ9ZT0+e3Z0LmluZGV4T2YoZSk+LTF8fHZ0LnB1c2goZSl9O2xldCBUdD0wO2xldCBSdD0tMTtjbGFzcyBNdHtjb25zdHJ1Y3RvcihlLHQscj0hMSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIl8kcHJvZ3JhbU9iamVjdCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJfJHVuaWZvcm1NYXAiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSx0aGlzLl8kcHJvZ3JhbU9iamVjdD0oKGUsdCk9Pntjb25zdCByPW4uY3JlYXRlUHJvZ3JhbSgpLGE9bi5jcmVhdGVTaGFkZXIobi5WRVJURVhfU0hBREVSKTtuLnNoYWRlclNvdXJjZShhLGUpLG4uY29tcGlsZVNoYWRlcihhKTtjb25zdCBvPW4uY3JlYXRlU2hhZGVyKG4uRlJBR01FTlRfU0hBREVSKTtyZXR1cm4gbi5zaGFkZXJTb3VyY2Uobyx0KSxuLmNvbXBpbGVTaGFkZXIobyksbi5hdHRhY2hTaGFkZXIocixhKSxuLmF0dGFjaFNoYWRlcihyLG8pLG4ubGlua1Byb2dyYW0ociksbi5kZXRhY2hTaGFkZXIocixhKSxuLmRldGFjaFNoYWRlcihyLG8pLG4uZGVsZXRlU2hhZGVyKGEpLG4uZGVsZXRlU2hhZGVyKG8pLHtpZDpUdCsrLHJlc291cmNlOnJ9fSkoZSx0KSx0aGlzLl8kdW5pZm9ybU1hcD1uZXcgTWFwLCgoZSx0LHI9ITEpPT57Y29uc3QgYT1uLmdldFByb2dyYW1QYXJhbWV0ZXIoZSxuLkFDVElWRV9VTklGT1JNUyk7Zm9yKGxldCBvPTA7bzxhOysrbyl7Y29uc3QgYT1uLmdldEFjdGl2ZVVuaWZvcm0oZSxvKSxzPWEubmFtZS5lbmRzV2l0aCgiWzBdIik/YS5uYW1lLnNsaWNlKDAsLTMpOmEubmFtZSxpPW4uZ2V0VW5pZm9ybUxvY2F0aW9uKGUscyk7aWYoYS50eXBlPT09bi5TQU1QTEVSXzJEJiYxPT09YS5zaXplJiYhciljb250aW51ZTtjb25zdCBjPXt9O3N3aXRjaChhLnR5cGUpe2Nhc2Ugbi5GTE9BVF9WRUM0OmMubWV0aG9kPW4udW5pZm9ybTRmdi5iaW5kKG4saSksYy5hcnJheT1uZXcgRmxvYXQzMkFycmF5KDQqYS5zaXplKSxjLmFzc2lnbj0tMTticmVhaztjYXNlIG4uSU5UX1ZFQzQ6Yy5tZXRob2Q9bi51bmlmb3JtNGl2LmJpbmQobixpKSxjLmFycmF5PW5ldyBJbnQzMkFycmF5KDQqYS5zaXplKSxjLmFzc2lnbj0tMTticmVhaztjYXNlIG4uU0FNUExFUl8yRDpjLm1ldGhvZD1yP24udW5pZm9ybTFpLmJpbmQobixpLDMpOm4udW5pZm9ybTFpdi5iaW5kKG4saSksYy5hcnJheT1uZXcgSW50MzJBcnJheShhLnNpemUpLGMuYXNzaWduPTE7YnJlYWs7Y2FzZSBuLkZMT0FUOmNhc2Ugbi5GTE9BVF9WRUMyOmNhc2Ugbi5GTE9BVF9WRUMzOmNhc2Ugbi5GTE9BVF9NQVQyOmNhc2Ugbi5GTE9BVF9NQVQzOmNhc2Ugbi5GTE9BVF9NQVQ0OmNhc2Ugbi5JTlQ6Y2FzZSBuLklOVF9WRUMyOmNhc2Ugbi5JTlRfVkVDMzpkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVXNlIGdsLkZMT0FUX1ZFQzQgb3IgZ2wuSU5UX1ZFQzQgaW5zdGVhZCIpfXQuc2V0KHMsYyl9fSkodGhpcy5fJHByb2dyYW1PYmplY3QucmVzb3VyY2UsdGhpcy5fJHVuaWZvcm1NYXAscil9dXNlUHJvZ3JhbSgpe3ZhciBlO2U9dGhpcy5fJHByb2dyYW1PYmplY3QsUnQhPT1lLmlkJiYoUnQ9ZS5pZCxuLnVzZVByb2dyYW0oZS5yZXNvdXJjZSkpfWJpbmRVbmlmb3JtKCl7KGU9Pntmb3IoY29uc3QgdCBvZiBlLnZhbHVlcygpKXZvaWQgMCE9PXQubWV0aG9kJiZ2b2lkIDAhPT10LmFzc2lnbiYmKHQuYXNzaWduPDA/dC5tZXRob2QodC5hcnJheSk6dC5hc3NpZ24+MCYmKHQuYXNzaWduLS0sdC5tZXRob2QodC5hcnJheSkpKX0pKHRoaXMuXyR1bmlmb3JtTWFwKX1nZXQgaGlnaHAoKXtyZXR1cm4gdGhpcy5fJHVuaWZvcm1NYXAuZ2V0KCJ1X2hpZ2hwIikuYXJyYXl9Z2V0IG1lZGl1bXAoKXtyZXR1cm4gdGhpcy5fJHVuaWZvcm1NYXAuZ2V0KCJ1X21lZGl1bXAiKS5hcnJheX1nZXQgdGV4dHVyZXMoKXtyZXR1cm4gdGhpcy5fJHVuaWZvcm1NYXAuZ2V0KCJ1X3RleHR1cmVzIikuYXJyYXl9fWNvbnN0IHd0PW5ldyBNYXAsRnQ9KGUsdCxuLHIpPT57Y29uc3QgYT1uPyJsYXlvdXQgKGxvY2F0aW9uID0gMSkgaW4gdmVjMiBhX2JlemllcjsiOiIiLG89bj8ib3V0IHZlYzIgdl9iZXppZXI7Ijp0PyJvdXQgdmVjMiB2X3V2OyI6IiIscz1uPyJ2X2JlemllciA9IGFfYmV6aWVyOyI6dD8iXG4gICAgbWF0MyB1dl9tYXRyaXggPSBtYXQzKFxuICAgICAgICB1X2hpZ2hwWzBdLnh5eixcbiAgICAgICAgdV9oaWdocFsxXS54eXosXG4gICAgICAgIHVfaGlnaHBbMl0ueHl6XG4gICAgKTtcbiAgICBtYXQzIGludmVyc2VfbWF0cml4ID0gbWF0MyhcbiAgICAgICAgdV9oaWdocFszXS54eXosXG4gICAgICAgIHVfaGlnaHBbNF0ueHl6LFxuICAgICAgICB2ZWMzKHVfaGlnaHBbMl0udywgdV9oaWdocFszXS53LCB1X2hpZ2hwWzRdLncpXG4gICAgKTtcbiAgICB2X3V2ID0gKGludmVyc2VfbWF0cml4ICogdXZfbWF0cml4ICogdmVjMyhhX3ZlcnRleCwgMS4wKSkueHk7IjoiIixpPXI/KGU9PmBcbnZlYzIgYXBwbHlNYXRyaXgoaW4gdmVjMiB2ZXJ0ZXgpIHtcbiAgICBtYXQzIHBhcmVudF9tYXRyaXggPSBtYXQzKFxuICAgICAgICB1X2hpZ2hwWyR7ZX1dLnh5eixcbiAgICAgICAgdV9oaWdocFske2UrMX1dLnh5eixcbiAgICAgICAgdV9oaWdocFske2UrMn1dLnh5elxuICAgICk7XG4gICAgbWF0MyBhbmNlc3Rvcl9tYXRyaXggPSBtYXQzKFxuICAgICAgICB1X2hpZ2hwWyR7ZSszfV0ueHl6LFxuICAgICAgICB1X2hpZ2hwWyR7ZSs0fV0ueHl6LFxuICAgICAgICB1X2hpZ2hwWyR7ZSs1fV0ueHl6XG4gICAgKTtcblxuICAgIHZlYzIgcGFyZW50X29mZnNldCA9IHZlYzIodV9oaWdocFske2UrMn1dLncsIHVfaGlnaHBbJHtlKzN9XS53KTtcbiAgICB2ZWMyIHBhcmVudF9zaXplICAgPSB2ZWMyKHVfaGlnaHBbJHtlKzR9XS53LCB1X2hpZ2hwWyR7ZSs1fV0udyk7XG4gICAgdmVjNCBncmlkX21pbiA9IHVfaGlnaHBbJHtlKzZ9XTtcbiAgICB2ZWM0IGdyaWRfbWF4ID0gdV9oaWdocFske2UrN31dO1xuICAgIFxuICAgIHZlYzIgcG9zaXRpb24gPSAocGFyZW50X21hdHJpeCAqIHZlYzModmVydGV4LCAxLjApKS54eTtcbiAgICBwb3NpdGlvbiA9IChwb3NpdGlvbiAtIHBhcmVudF9vZmZzZXQpIC8gcGFyZW50X3NpemU7XG5cbiAgICB2ZWM0IGdhID0gZ3JpZF9taW47XG4gICAgdmVjNCBnYiA9IGdyaWRfbWF4ICAtIGdyaWRfbWluO1xuICAgIHZlYzQgZ2MgPSB2ZWM0KDEuMCkgLSBncmlkX21heDtcblxuICAgIHZlYzIgcGEgPSBwb3NpdGlvbjtcbiAgICB2ZWMyIHBiID0gcG9zaXRpb24gLSBncmlkX21pbi5zdDtcbiAgICB2ZWMyIHBjID0gcG9zaXRpb24gLSBncmlkX21heC5zdDtcblxuICAgIHBvc2l0aW9uID0gKGdhLnBxIC8gZ2Euc3QpICogbWluKHBhLCBnYS5zdClcbiAgICAgICAgICAgICAgICArIChnYi5wcSAvIGdiLnN0KSAqIGNsYW1wKHBiLCB2ZWMyKDAuMCksIGdiLnN0KVxuICAgICAgICAgICAgICAgICsgKGdjLnBxIC8gZ2Muc3QpICogbWF4KHZlYzIoMC4wKSwgcGMpO1xuXG4gICAgcG9zaXRpb24gPSBwb3NpdGlvbiAqIHBhcmVudF9zaXplICsgcGFyZW50X29mZnNldDtcbiAgICBwb3NpdGlvbiA9IChhbmNlc3Rvcl9tYXRyaXggKiB2ZWMzKHBvc2l0aW9uLCAxLjApKS54eTtcblxuICAgIHBvc2l0aW9uID0gcG9zaXRpb24gKyB2ZWMyKHVfaGlnaHBbJHtlKzh9XS54LCB1X2hpZ2hwWyR7ZSs4fV0ueSk7XG4gICAgcmV0dXJuIHBvc2l0aW9uIC8gdmVjMih1X2hpZ2hwWzBdLncsIHVfaGlnaHBbMV0udyk7XG59YCkodD81OjApOiJcbnZlYzIgYXBwbHlNYXRyaXgoaW4gdmVjMiB2ZXJ0ZXgpIHtcbiAgICBtYXQzIG1hdHJpeCA9IG1hdDMoYV9tYXRyaXgwLCBhX21hdHJpeDEsIGFfbWF0cml4Mik7XG4gICAgcmV0dXJuIChtYXRyaXggKiB2ZWMzKHZlcnRleCwgMS4wKSkueHk7XG59IjtyZXR1cm5gI3ZlcnNpb24gMzAwIGVzXG5cbmxheW91dCAobG9jYXRpb24gPSAwKSBpbiB2ZWMyIGFfdmVydGV4O1xuJHthfVxuJHtuPyIiOiJsYXlvdXQgKGxvY2F0aW9uID0gMikgaW4gdmVjNCBhX2NvbG9yOyJ9XG4ke3I/IiI6ImxheW91dCAobG9jYXRpb24gPSAzKSBpbiB2ZWMzIGFfbWF0cml4MDtcbmxheW91dCAobG9jYXRpb24gPSA0KSBpbiB2ZWMzIGFfbWF0cml4MTtcbmxheW91dCAobG9jYXRpb24gPSA1KSBpbiB2ZWMzIGFfbWF0cml4MjsifVxuXG4ke2U+MT9gdW5pZm9ybSB2ZWM0IHVfaGlnaHBbJHtlfV07YDoiIn1cbiR7b31cbiR7bj8iIjoib3V0IHZlYzQgdl9jb2xvcjsifVxuJHtpfVxuXG52b2lkIG1haW4oKSB7XG4gICAgJHtuPyIiOiJ2X2NvbG9yID0gYV9jb2xvcjsifVxuICAgICR7c31cbiAgICB2ZWMyIHBvcyA9IGFwcGx5TWF0cml4KGFfdmVydGV4KTtcbiAgICBwb3MgPSBwb3MgKiAyLjAgLSAxLjA7XG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvcy54LCAtcG9zLnksIDAuMCwgMS4wKTtcbn1gfSwkdD1lPT57Y29uc3QgdD0ibSIrKGU/InkiOiJuIik7aWYod3QuaGFzKHQpKXJldHVybiB3dC5nZXQodCk7Y29uc3Qgbj1uZXcgTXQoRnQoZT85OjAsITEsITAsZSksIiN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cbmluIHZlYzIgdl9iZXppZXI7XG5vdXQgdmVjNCBvX2NvbG9yO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdmVjMiBweCA9IGRGZHgodl9iZXppZXIpO1xuICAgIHZlYzIgcHkgPSBkRmR5KHZfYmV6aWVyKTtcblxuICAgIHZlYzIgZiA9ICgyLjAgKiB2X2Jlemllci54KSAqIHZlYzIocHgueCwgcHkueCkgLSB2ZWMyKHB4LnksIHB5LnkpO1xuICAgIGZsb2F0IGFscGhhID0gMC41IC0gKHZfYmV6aWVyLnggKiB2X2Jlemllci54IC0gdl9iZXppZXIueSkgLyBsZW5ndGgoZik7XG5cbiAgICBpZiAoYWxwaGEgPiAwLjApIHtcbiAgICAgICAgb19jb2xvciA9IHZlYzQobWluKGFscGhhLCAxLjApKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBkaXNjYXJkO1xuICAgIH0gICAgXG59Iik7cmV0dXJuIHd0LnNldCh0LG4pLG59LE90PShlLHQpPT57Y29uc3Qgbj1lLmhpZ2hwO25bMF09dFswXSxuWzFdPXRbMV0sblsyXT0wLG5bNF09dFsyXSxuWzVdPXRbM10sbls2XT0wLG5bOF09dFs0XSxuWzldPXRbNV0sblsxMF09MSxuWzEyXT10WzZdLG5bMTNdPXRbN10sblsxNF09MCxuWzE2XT10WzhdLG5bMTddPXRbOV0sblsxOF09MCxuWzIwXT10WzEwXSxuWzIxXT10WzExXSxuWzIyXT0xLG5bM109eCgpLG5bN109RSgpLG5bMTFdPXRbMTJdLG5bMTVdPXRbMTNdLG5bMTldPXRbMTRdLG5bMjNdPXRbMTVdLG5bMjRdPXRbMTZdLG5bMjVdPXRbMTddLG5bMjZdPXRbMThdLG5bMjddPXRbMTldLG5bMjhdPXRbMjBdLG5bMjldPXRbMjFdLG5bMzBdPXRbMjJdLG5bMzFdPXRbMjNdLG5bMzJdPXRbMjRdLG5bMzNdPXRbMjVdfTtsZXQgU3Q9Im5vcm1hbCI7Y29uc3Qga3Q9ZT0+e1N0PWV9LEN0PSgpPT5TdDtsZXQgUHQ9NjAwO2NvbnN0IEJ0PWU9PntQdD1lfSxJdD0oKT0+UHQsTHQ9KCk9Pns2MTMhPT1JdCgpJiYoQnQoNjEzKSxuLmJsZW5kRnVuYyhuLk9ORSxuLk9ORV9NSU5VU19TUkNfQUxQSEEpKX0sVXQ9KGUsdCxyLGEpPT57ZS51c2VQcm9ncmFtKCksZS5iaW5kVW5pZm9ybSgpLEx0KCksbXQodCksbi5kcmF3QXJyYXlzKG4uVFJJQU5HTEVTLHIsYSl9LE50PSgpPT57Y29uc3QgZT0icm1ubiI7aWYod3QuaGFzKGUpKXJldHVybiB3dC5nZXQoZSk7Y29uc3QgdD1uZXcgTXQoIiN2ZXJzaW9uIDMwMCBlc1xubGF5b3V0IChsb2NhdGlvbiA9IDApIGluIHZlYzIgYV92ZXJ0ZXg7XG52b2lkIG1haW4oKSB7XG4gICAgdmVjMiBwb3MgPSBhX3ZlcnRleCAqIDIuMCAtIDEuMDtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zLngsIC1wb3MueSwgMC4wLCAxLjApO1xufSIsIiN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5vdXQgdmVjNCBvX2NvbG9yO1xudm9pZCBtYWluKCkge1xuICAgIG9fY29sb3IgPSB2ZWM0KDEuMCk7XG59Iik7cmV0dXJuIHd0LnNldChlLHQpLHR9LER0PSgpPT57Y29uc3QgZT1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0O2lmKCFlKXJldHVybjtjb25zdCB0PTE8PGUuY2xpcExldmVsLTE7bi5zdGVuY2lsTWFzayh+dC0xKSxuLnN0ZW5jaWxGdW5jKG4uTEVRVUFMLHQsMjU1KSxuLnN0ZW5jaWxPcChuLlpFUk8sbi5SRVBMQUNFLG4uUkVQTEFDRSksVXQoTnQoKSxFdCgpLDAsNiksbi5zdGVuY2lsTWFzaygxPDxlLmNsaXBMZXZlbCksbi5zdGVuY2lsRnVuYyhuLkFMV0FZUywwLDI1NSksbi5zdGVuY2lsT3Aobi5SRVBMQUNFLG4uUkVQTEFDRSxuLlJFUExBQ0UpLFV0KE50KCksRXQoKSwwLDYpLG4uc3RlbmNpbE1hc2soMjU1KSxuLnN0ZW5jaWxPcChuLlpFUk8sbi5JTlZFUlQsbi5JTlZFUlQpfTtjbGFzcyBqdHtjb25zdHJ1Y3RvcihlLHQsbixyLGEpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpbmRleCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJ4Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInkiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywidyIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJoIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImxlZnQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywicmlnaHQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywidXNlZCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLHRoaXMuaW5kZXg9ZSx0aGlzLng9dCx0aGlzLnk9bix0aGlzLnc9cix0aGlzLmg9YSx0aGlzLmxlZnQ9bnVsbCx0aGlzLnJpZ2h0PW51bGwsdGhpcy51c2VkPSExfWluc2VydChlLHQpe3JldHVybigoZSx0LG4pPT57aWYoZS51c2VkKXtjb25zdCByPWUubGVmdD8uaW5zZXJ0KHQsbik7cmV0dXJuIHJ8fGUucmlnaHQ/Lmluc2VydCh0LG4pfHxudWxsfWlmKHQ+ZS53fHxuPmUuaClyZXR1cm4gbnVsbDtpZih0PT09ZS53JiZuPT09ZS5oKXJldHVybiBlLnVzZWQ9ITAsZTtjb25zdCByPWUudy10LGE9ZS5oLW47cmV0dXJuIHI+YT8oZS5sZWZ0PWUuY3JlYXRlKGUuaW5kZXgsZS54LGUueSx0LG4pLGUucmlnaHQ9ZS5jcmVhdGUoZS5pbmRleCxlLngrdCsxLGUueSxyLTEsZS5oKSk6KGUubGVmdD1lLmNyZWF0ZShlLmluZGV4LGUueCxlLnksZS53LG4pLGUucmlnaHQ9ZS5jcmVhdGUoZS5pbmRleCxlLngsZS55K24rMSxlLncsYS0xKSksZS51c2VkPSEwLGUubGVmdC5pbnNlcnQodCxuKX0pKHRoaXMsZSx0KX1kaXNwb3NlKGUsdCxuLHIpe3JldHVybigoZSx0LG4scixhKT0+ZS5sZWZ0Py5kaXNwb3NlKHQsbixyLGEpPyhlLmxlZnQudXNlZHx8ZS5yaWdodD8udXNlZHx8KGUubGVmdD1lLnJpZ2h0PW51bGwsZS51c2VkPSExKSwhMCk6ZS5yaWdodD8uZGlzcG9zZSh0LG4scixhKT8oZS5yaWdodC51c2VkfHxlLmxlZnQ/LnVzZWR8fChlLmxlZnQ9ZS5yaWdodD1udWxsLGUudXNlZD0hMSksITApOnQ9PT1lLngmJm49PT1lLnkmJnI9PT1lLncmJmE9PT1lLmgmJihlLnVzZWQ9ITEsITApKSh0aGlzLGUsdCxuLHIpfWNyZWF0ZShlLHQsbixyLGEpe3JldHVybiBuZXcganQoZSx0LG4scixhKX19Y2xhc3MgWHR7Y29uc3RydWN0b3IoZSx0LG4pe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJfJHJvb3QiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSx0aGlzLl8kcm9vdD1uZXcganQoZSwwLDAsdCxuKX1pbnNlcnQoZSx0KXtyZXR1cm4gdGhpcy5fJHJvb3QuaW5zZXJ0KGUsdCl9ZGlzcG9zZShlLHQsbixyKXtyZXR1cm4gdGhpcy5fJHJvb3QuZGlzcG9zZShlLHQsbixyKX19Y29uc3QgenQ9KHQsbik9Pntjb25zdCByPWZlKCk7X2Vbcl18fChfZVtyXT1uZXcgWHQocixlLGUpKTtjb25zdCBhPV9lW3JdLmluc2VydCh0LG4pO3JldHVybiBhfHwoZGUocisxKSx6dCh0LG4pKX0sVnQ9ZT0+YFxuICAgIHZlYzQgbXVsID0gdV9tZWRpdW1wWyR7ZX1dO1xuICAgIHZlYzQgYWRkID0gdV9tZWRpdW1wWyR7ZSsxfV07XG5cbiAgICBpZiAobXVsLnggIT0gMS4wIHx8IG11bC55ICE9IDEuMCB8fCBtdWwueiAhPSAxLjAgfHwgbXVsLncgIT0gMS4wXG4gICAgICAgIHx8IGFkZC54ICE9IDAuMCB8fCBhZGQueSAhPSAwLjAgfHwgYWRkLnogIT0gMC4wXG4gICAgKSB7XG4gICAgICAgIHNyYy5yZ2IgLz0gbWF4KDAuMDAwMSwgc3JjLmEpO1xuICAgICAgICBzcmMgPSBjbGFtcChzcmMgKiBtdWwgKyBhZGQsIDAuMCwgMS4wKTtcbiAgICAgICAgc3JjLnJnYiAqPSBzcmMuYTtcbiAgICB9XG5gLFd0PWU9PmAjdmVyc2lvbiAzMDAgZXNcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXG51bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmU7XG4ke2U/InVuaWZvcm0gdmVjNCB1X21lZGl1bXBbMl07IjoiIn1cblxuaW4gdmVjMiB2X2Nvb3JkO1xub3V0IHZlYzQgb19jb2xvcjtcblxudm9pZCBtYWluKCkge1xuICAgIHZlYzQgc3JjID0gdGV4dHVyZSh1X3RleHR1cmUsIHZfY29vcmQpO1xuICAgICR7ZT9WdCgwKToiIn1cbiAgICBvX2NvbG9yID0gc3JjO1xufWA7Y29uc3QgR3Q9bmV3IGNsYXNze2NvbnN0cnVjdG9yKCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImJ1ZmZlciIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJvZmZzZXQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSx0aGlzLmJ1ZmZlcj1uZXcgRmxvYXQzMkFycmF5KDI1NiksdGhpcy5vZmZzZXQ9MH1wdXNoKC4uLmUpe3RoaXMuYnVmZmVyLmxlbmd0aDx0aGlzLm9mZnNldCtlLmxlbmd0aCYmdGhpcy5yZXNpemUoZS5sZW5ndGgpO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWVbdF19c2V0KGUpe3RoaXMuYnVmZmVyLmxlbmd0aDx0aGlzLm9mZnNldCtlLmxlbmd0aCYmdGhpcy5yZXNpemUoZS5sZW5ndGgpLHRoaXMuYnVmZmVyLnNldChlLHRoaXMub2Zmc2V0KSx0aGlzLm9mZnNldCs9ZS5sZW5ndGh9cmVzaXplKGUpe2NvbnN0IHQ9bmV3IEZsb2F0MzJBcnJheSgobj10aGlzLm9mZnNldCtlLG4tLSxufD1uPj4xLG58PW4+PjIsbnw9bj4+NCxufD1uPj44LG58PW4+PjE2LCsrbikpO3ZhciBuO3RoaXMuYnVmZmVyLmxlbmd0aCYmdC5zZXQodGhpcy5idWZmZXIpLHRoaXMuYnVmZmVyPXR9fTtjbGFzcyBZdCBleHRlbmRzIE10e2NvbnN0cnVjdG9yKGUsdCxuPSEwKXtzdXBlcihlLHQsbiksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImNvdW50Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksdGhpcy5jb3VudD0wfWNsZWFyKCl7dGhpcy5jb3VudD1HdC5vZmZzZXQ9MH19Y29uc3QgcXQ9bmV3IE1hcCxLdD0oKT0+e2lmKHF0LmhhcygiaSIpKXJldHVybiBxdC5nZXQoImkiKTtjb25zdCBlPW5ldyBZdCgiI3ZlcnNpb24gMzAwIGVzXG5cbmxheW91dCAobG9jYXRpb24gPSAwKSBpbiB2ZWMyIGFfdmVydGV4O1xubGF5b3V0IChsb2NhdGlvbiA9IDEpIGluIHZlYzQgYV9yZWN0O1xubGF5b3V0IChsb2NhdGlvbiA9IDIpIGluIHZlYzQgYV9zaXplO1xubGF5b3V0IChsb2NhdGlvbiA9IDMpIGluIHZlYzIgYV9vZmZzZXQ7XG5sYXlvdXQgKGxvY2F0aW9uID0gNCkgaW4gdmVjNCBhX21hdHJpeDtcbmxheW91dCAobG9jYXRpb24gPSA1KSBpbiB2ZWM0IGFfbXVsO1xubGF5b3V0IChsb2NhdGlvbiA9IDYpIGluIHZlYzQgYV9hZGQ7XG5cbm91dCB2ZWMyIHZfY29vcmQ7XG5vdXQgdmVjNCB2X211bDtcbm91dCB2ZWM0IHZfYWRkO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdl9jb29yZCA9IGFfdmVydGV4ICogYV9yZWN0Lnp3ICsgYV9yZWN0Lnh5O1xuICAgIHZfbXVsID0gYV9tdWw7XG4gICAgdl9hZGQgPSBhX2FkZDtcblxuICAgIHZlYzIgcG9zaXRpb24gPSB2ZWMyKGFfdmVydGV4LngsIDEuMCAtIGFfdmVydGV4LnkpO1xuICAgIHBvc2l0aW9uID0gcG9zaXRpb24gKiBhX3NpemUueHk7XG5cbiAgICBtYXQzIG1hdHJpeCA9IG1hdDMoXG4gICAgICAgIGFfbWF0cml4LngsIGFfbWF0cml4LnksIDAuMCxcbiAgICAgICAgYV9tYXRyaXgueiwgYV9tYXRyaXgudywgMC4wLFxuICAgICAgICBhX29mZnNldC54LCBhX29mZnNldC55LCAxLjBcbiAgICApO1xuXG4gICAgcG9zaXRpb24gPSAobWF0cml4ICogdmVjMyhwb3NpdGlvbiwgMS4wKSkueHk7XG4gICAgcG9zaXRpb24gLz0gYV9zaXplLnp3O1xuXG4gICAgcG9zaXRpb24gPSBwb3NpdGlvbiAqIDIuMCAtIDEuMDtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24ueCwgLXBvc2l0aW9uLnksIDAuMCwgMS4wKTtcbn0iLCIjdmVyc2lvbiAzMDAgZXNcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXG51bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmU7XG5cbmluIHZlYzQgdl9tdWw7XG5pbiB2ZWM0IHZfYWRkO1xuaW4gdmVjMiB2X2Nvb3JkO1xub3V0IHZlYzQgb19jb2xvcjtcblxudm9pZCBtYWluKCkge1xuICAgIHZlYzQgc3JjID0gdGV4dHVyZSh1X3RleHR1cmUsIHZfY29vcmQpO1xuXG4gICAgaWYgKHZfbXVsLnggIT0gMS4wIHx8IHZfbXVsLnkgIT0gMS4wIHx8IHZfbXVsLnogIT0gMS4wIHx8IHZfbXVsLncgIT0gMS4wXG4gICAgICAgIHx8IHZfYWRkLnggIT0gMC4wIHx8IHZfYWRkLnkgIT0gMC4wIHx8IHZfYWRkLnogIT0gMC4wXG4gICAgKSB7XG4gICAgICAgIHNyYy5yZ2IgLz0gbWF4KDAuMDAwMSwgc3JjLmEpO1xuICAgICAgICBzcmMgPSBjbGFtcChzcmMgKiB2X211bCArIHZfYWRkLCAwLjAsIDEuMCk7XG4gICAgICAgIHNyYy5yZ2IgKj0gc3JjLmE7XG4gICAgfVxuXG4gICAgb19jb2xvciA9IHNyYztcbn0iKTtyZXR1cm4gcXQuc2V0KCJpIixlKSxlfSxIdD0oZSx0KT0+e2NvbnN0IG49YGkke2V9eWA7aWYocXQuaGFzKG4pKXJldHVybiBxdC5nZXQobik7Y29uc3Qgcj1uZXcgTXQoIiN2ZXJzaW9uIDMwMCBlc1xuXG5sYXlvdXQgKGxvY2F0aW9uID0gMCkgaW4gdmVjMiBhX3ZlcnRleDtcblxub3V0IHZlYzIgdl9jb29yZDtcblxudm9pZCBtYWluKCkge1xuICAgIHZfY29vcmQgPSBhX3ZlcnRleDtcblxuICAgIHZlYzIgcG9zaXRpb24gPSBhX3ZlcnRleCAqIDIuMCAtIDEuMDtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuMCwgMS4wKTtcbn0iLChlPT57bGV0IHQ7c3dpdGNoKGUpe2Nhc2Uic3VidHJhY3QiOnQ9IlxudmVjNCBibGVuZCAoaW4gdmVjNCBzcmMsIGluIHZlYzQgZHN0KSB7XG4gICAgaWYgKHNyYy5hID09IDAuMCkgeyByZXR1cm4gZHN0OyB9XG4gICAgaWYgKGRzdC5hID09IDAuMCkgeyByZXR1cm4gc3JjOyB9XG5cbiAgICB2ZWM0IGEgPSBzcmMgLSBzcmMgKiBkc3QuYTtcbiAgICB2ZWM0IGIgPSBkc3QgLSBkc3QgKiBzcmMuYTtcblxuICAgIHNyYy5yZ2IgLz0gc3JjLmE7XG4gICAgZHN0LnJnYiAvPSBkc3QuYTtcblxuICAgIHZlYzQgYyA9IHZlYzQoZHN0LnJnYiAtIHNyYy5yZ2IsIHNyYy5hICogZHN0LmEpO1xuICAgIGMucmdiICo9IGMuYTtcblxuICAgIHJldHVybiBhICsgYiArIGM7XG59IjticmVhaztjYXNlIm11bHRpcGx5Ijp0PSJcbnZlYzQgYmxlbmQgKGluIHZlYzQgc3JjLCBpbiB2ZWM0IGRzdCkge1xuICAgIHZlYzQgYSA9IHNyYyAtIHNyYyAqIGRzdC5hO1xuICAgIHZlYzQgYiA9IGRzdCAtIGRzdCAqIHNyYy5hO1xuICAgIHZlYzQgYyA9IHNyYyAqIGRzdDtcblxuICAgIHJldHVybiBhICsgYiArIGM7XG59IjticmVhaztjYXNlImxpZ2h0ZW4iOnQ9IlxudmVjNCBibGVuZCAoaW4gdmVjNCBzcmMsIGluIHZlYzQgZHN0KSB7XG4gICAgaWYgKHNyYy5hID09IDAuMCkgeyByZXR1cm4gZHN0OyB9XG4gICAgaWYgKGRzdC5hID09IDAuMCkgeyByZXR1cm4gc3JjOyB9XG5cbiAgICB2ZWM0IGEgPSBzcmMgLSBzcmMgKiBkc3QuYTtcbiAgICB2ZWM0IGIgPSBkc3QgLSBkc3QgKiBzcmMuYTtcblxuICAgIHNyYy5yZ2IgLz0gc3JjLmE7XG4gICAgZHN0LnJnYiAvPSBkc3QuYTtcblxuICAgIHZlYzQgYyA9IHZlYzQobWl4KHNyYy5yZ2IsIGRzdC5yZ2IsIHN0ZXAoc3JjLnJnYiwgZHN0LnJnYikpLCBzcmMuYSAqIGRzdC5hKTtcbiAgICBjLnJnYiAqPSBjLmE7XG5cbiAgICByZXR1cm4gYSArIGIgKyBjO1xufSI7YnJlYWs7Y2FzZSJkYXJrZW4iOnQ9IlxudmVjNCBibGVuZCAoaW4gdmVjNCBzcmMsIGluIHZlYzQgZHN0KSB7XG4gICAgaWYgKHNyYy5hID09IDAuMCkgeyByZXR1cm4gZHN0OyB9XG4gICAgaWYgKGRzdC5hID09IDAuMCkgeyByZXR1cm4gc3JjOyB9XG5cbiAgICB2ZWM0IGEgPSBzcmMgLSBzcmMgKiBkc3QuYTtcbiAgICB2ZWM0IGIgPSBkc3QgLSBkc3QgKiBzcmMuYTtcblxuICAgIHNyYy5yZ2IgLz0gc3JjLmE7XG4gICAgZHN0LnJnYiAvPSBkc3QuYTtcblxuICAgIHZlYzQgYyA9IHZlYzQobWl4KHNyYy5yZ2IsIGRzdC5yZ2IsIHN0ZXAoZHN0LnJnYiwgc3JjLnJnYikpLCBzcmMuYSAqIGRzdC5hKTtcbiAgICBjLnJnYiAqPSBjLmE7XG5cbiAgICByZXR1cm4gYSArIGIgKyBjO1xufSI7YnJlYWs7Y2FzZSJvdmVybGF5Ijp0PSJcbnZlYzQgYmxlbmQgKGluIHZlYzQgc3JjLCBpbiB2ZWM0IGRzdCkge1xuICAgIGlmIChzcmMuYSA9PSAwLjApIHsgcmV0dXJuIGRzdDsgfVxuICAgIGlmIChkc3QuYSA9PSAwLjApIHsgcmV0dXJuIHNyYzsgfVxuXG4gICAgdmVjNCBhID0gc3JjIC0gc3JjICogZHN0LmE7XG4gICAgdmVjNCBiID0gZHN0IC0gZHN0ICogc3JjLmE7XG5cbiAgICBzcmMucmdiIC89IHNyYy5hO1xuICAgIGRzdC5yZ2IgLz0gZHN0LmE7XG5cbiAgICB2ZWM0IG11bCA9IHNyYyAqIGRzdDtcbiAgICB2ZWMzIGMxID0gMi4wICogbXVsLnJnYjtcbiAgICB2ZWMzIGMyID0gMi4wICogKHNyYy5yZ2IgKyBkc3QucmdiIC0gbXVsLnJnYikgLSAxLjA7XG4gICAgdmVjNCBjID0gdmVjNChtaXgoYzEsIGMyLCBzdGVwKHZlYzMoMC41KSwgZHN0LnJnYikpLCBtdWwuYSk7XG4gICAgYy5yZ2IgKj0gYy5hO1xuXG4gICAgcmV0dXJuIGEgKyBiICsgYztcbn0iO2JyZWFrO2Nhc2UiaGFyZGxpZ2h0Ijp0PSJcbnZlYzQgYmxlbmQgKGluIHZlYzQgc3JjLCBpbiB2ZWM0IGRzdCkge1xuICAgIGlmIChzcmMuYSA9PSAwLjApIHsgcmV0dXJuIGRzdDsgfVxuICAgIGlmIChkc3QuYSA9PSAwLjApIHsgcmV0dXJuIHNyYzsgfVxuXG4gICAgdmVjNCBhID0gc3JjIC0gc3JjICogZHN0LmE7XG4gICAgdmVjNCBiID0gZHN0IC0gZHN0ICogc3JjLmE7XG5cbiAgICBzcmMucmdiIC89IHNyYy5hO1xuICAgIGRzdC5yZ2IgLz0gZHN0LmE7XG5cbiAgICB2ZWM0IG11bCA9IHNyYyAqIGRzdDtcbiAgICB2ZWMzIGMxID0gMi4wICogbXVsLnJnYjtcbiAgICB2ZWMzIGMyID0gMi4wICogKHNyYy5yZ2IgKyBkc3QucmdiIC0gbXVsLnJnYikgLSAxLjA7XG4gICAgdmVjNCBjID0gdmVjNChtaXgoYzEsIGMyLCBzdGVwKHZlYzMoMC41KSwgc3JjLnJnYikpLCBtdWwuYSk7XG4gICAgYy5yZ2IgKj0gYy5hO1xuXG4gICAgcmV0dXJuIGEgKyBiICsgYztcbn0iO2JyZWFrO2Nhc2UiZGlmZmVyZW5jZSI6dD0iXG52ZWM0IGJsZW5kIChpbiB2ZWM0IHNyYywgaW4gdmVjNCBkc3QpIHtcbiAgICBpZiAoc3JjLmEgPT0gMC4wKSB7IHJldHVybiBkc3Q7IH1cbiAgICBpZiAoZHN0LmEgPT0gMC4wKSB7IHJldHVybiBzcmM7IH1cblxuICAgIHZlYzQgYSA9IHNyYyAtIHNyYyAqIGRzdC5hO1xuICAgIHZlYzQgYiA9IGRzdCAtIGRzdCAqIHNyYy5hO1xuXG4gICAgc3JjLnJnYiAvPSBzcmMuYTtcbiAgICBkc3QucmdiIC89IGRzdC5hO1xuXG4gICAgdmVjNCBjID0gdmVjNChhYnMoc3JjLnJnYiAtIGRzdC5yZ2IpLCBzcmMuYSAqIGRzdC5hKTtcbiAgICBjLnJnYiAqPSBjLmE7XG5cbiAgICByZXR1cm4gYSArIGIgKyBjO1xufSI7YnJlYWs7Y2FzZSJpbnZlcnQiOnQ9IlxudmVjNCBibGVuZCAoaW4gdmVjNCBzcmMsIGluIHZlYzQgZHN0KSB7XG4gICAgaWYgKHNyYy5hID09IDAuMCkgeyByZXR1cm4gZHN0OyB9XG4gICAgaWYgKGRzdC5hID09IDAuMCkgeyByZXR1cm4gc3JjOyB9XG5cbiAgICB2ZWM0IGIgPSBkc3QgLSBkc3QgKiBzcmMuYTtcbiAgICB2ZWM0IGMgPSB2ZWM0KHNyYy5hIC0gZHN0LnJnYiAqIHNyYy5hLCBzcmMuYSk7XG5cbiAgICByZXR1cm4gYiArIGM7XG59IjticmVhaztkZWZhdWx0OnQ9IlxudmVjNCBibGVuZCAoaW4gdmVjNCBzcmMsIGluIHZlYzQgZHN0KSB7XG4gICAgcmV0dXJuIHNyYyArIGRzdCAtIGRzdCAqIHNyYy5hO1xufSJ9cmV0dXJuYCN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cbnVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZXNbMl07XG51bmlmb3JtIHZlYzQgdV9tZWRpdW1wWzJdO1xuXG5pbiB2ZWMyIHZfY29vcmQ7XG5vdXQgdmVjNCBvX2NvbG9yO1xuXG4ke3R9XG5cbnZvaWQgbWFpbigpIHtcbiAgICB2ZWM0IGRzdCA9IHRleHR1cmUodV90ZXh0dXJlc1swXSwgdl9jb29yZCk7XG4gICAgdmVjNCBzcmMgPSB0ZXh0dXJlKHVfdGV4dHVyZXNbMV0sIHZfY29vcmQpO1xuICAgICR7VnQoMCl9XG4gICAgb19jb2xvciA9IGJsZW5kKHNyYywgZHN0KTtcbn1gfSkoZSkpO3JldHVybiBxdC5zZXQobixyKSxyfTtsZXQgWnQ9MDtjb25zdCBRdD0oKT0+e2NvbnN0IGU9ci5jdXJyZW50QXR0YWNobWVudE9iamVjdCx0PXIuYXRsYXNBdHRhY2htZW50T2JqZWN0O2lmKHIuYmluZCh0KSxuLmJpbmRGcmFtZWJ1ZmZlcihuLkRSQVdfRlJBTUVCVUZGRVIsWCksWSghMSksWnQ9PT1mZSgpKXtjb25zdCBlPUVlKGZlKCkpO2VbMl0hPT0tTnVtYmVyLk1BWF9WQUxVRSYmZVszXSE9PS1OdW1iZXIuTUFYX1ZBTFVFJiYobi5lbmFibGUobi5TQ0lTU09SX1RFU1QpLG4uc2Npc3NvcihlWzBdLGVbMV0sZVsyXSxlWzNdKSxuLmJsaXRGcmFtZWJ1ZmZlcigwLDAsdC53aWR0aCx0LmhlaWdodCwwLDAsdC53aWR0aCx0LmhlaWdodCxuLkNPTE9SX0JVRkZFUl9CSVQsbi5ORUFSRVNUKSxuLmRpc2FibGUobi5TQ0lTU09SX1RFU1QpKX1lbHNle2NvbnN0IGU9eWUoZmUoKSk7bi5lbmFibGUobi5TQ0lTU09SX1RFU1QpLG4uc2Npc3NvcihlWzBdLGVbMV0sZVsyXSxlWzNdKSxuLmJsaXRGcmFtZWJ1ZmZlcigwLDAsdC53aWR0aCx0LmhlaWdodCwwLDAsdC53aWR0aCx0LmhlaWdodCxuLkNPTE9SX0JVRkZFUl9CSVQsbi5ORUFSRVNUKSxuLmRpc2FibGUobi5TQ0lTU09SX1RFU1QpLFp0PWZlKCl9ZSYmci5iaW5kKGUpfSxKdD1lPT57Y29uc3QgdD1mZSgpO2RlKGUuaW5kZXgpLFF0KCk7Y29uc3Qgcj1LO24uYmluZEZyYW1lYnVmZmVyKG4uRlJBTUVCVUZGRVIscik7Y29uc3QgYT1nZSgpO24uZnJhbWVidWZmZXJUZXh0dXJlMkQobi5GUkFNRUJVRkZFUixuLkNPTE9SX0FUVEFDSE1FTlQwLG4uVEVYVFVSRV8yRCxhLnJlc291cmNlLDApO2NvbnN0IG89SigpO24uYmluZEZyYW1lYnVmZmVyKG4uRlJBTUVCVUZGRVIsbyk7Y29uc3Qgcz11ZShlLncsZS5oKTtyZXR1cm4gbi5mcmFtZWJ1ZmZlclRleHR1cmUyRChuLkZSQU1FQlVGRkVSLG4uQ09MT1JfQVRUQUNITUVOVDAsbi5URVhUVVJFXzJELHMucmVzb3VyY2UsMCksbi5iaW5kRnJhbWVidWZmZXIobi5GUkFNRUJVRkZFUixudWxsKSxuLmJpbmRGcmFtZWJ1ZmZlcihuLlJFQURfRlJBTUVCVUZGRVIsciksbi5iaW5kRnJhbWVidWZmZXIobi5EUkFXX0ZSQU1FQlVGRkVSLG8pLG4uYmxpdEZyYW1lYnVmZmVyKGUueCxlLnksZS54K2UudyxlLnkrZS5oLDAsMCxlLncsZS5oLG4uQ09MT1JfQlVGRkVSX0JJVCxuLk5FQVJFU1QpLGRlKHQpLG4uYmluZEZyYW1lYnVmZmVyKG4uUkVBRF9GUkFNRUJVRkZFUixEKSxuLmJpbmRGcmFtZWJ1ZmZlcihuLkZSQU1FQlVGRkVSLEQpLHN9LGVuPShlLHQscj0hMSk9PnskZSgyLG4uVEVYVFVSRTIsbnVsbCxyKSwkZSgxLG4uVEVYVFVSRTEsdCxyKSwkZSgwLG4uVEVYVFVSRTAsZSxyKX0sdG49KCk9PntpZihxdC5oYXMoInAiKSlyZXR1cm4gcXQuZ2V0KCJwIik7Y29uc3QgZT1uZXcgTXQoIiN2ZXJzaW9uIDMwMCBlc1xuXG5sYXlvdXQgKGxvY2F0aW9uID0gMCkgaW4gdmVjMiBhX3ZlcnRleDtcbnVuaWZvcm0gdmVjNCB1X2hpZ2hwWzJdO1xuXG5vdXQgdmVjMiB2X2Nvb3JkO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdl9jb29yZCA9IGFfdmVydGV4O1xuXG4gICAgdmVjMiBvZmZzZXQgICA9IHVfaGlnaHBbMF0ueHk7XG4gICAgdmVjMiBzaXplICAgICA9IHVfaGlnaHBbMF0uenc7XG4gICAgdmVjMiB2aWV3cG9ydCA9IHZlYzIodV9oaWdocFsxXS54LCB1X2hpZ2hwWzFdLnkpO1xuXG4gICAgdmVjMiBwb3NpdGlvbiA9IHZlYzIoYV92ZXJ0ZXgueCwgMS4wIC0gYV92ZXJ0ZXgueSk7XG4gICAgcG9zaXRpb24gPSBwb3NpdGlvbiAqIHNpemUgKyBvZmZzZXQ7XG4gICAgcG9zaXRpb24gLz0gdmlld3BvcnQ7XG5cbiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uICogMi4wIC0gMS4wO1xuICAgIGdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbi54LCAtcG9zaXRpb24ueSwgMC4wLCAxLjApO1xufSIsV3QoITEpKTtyZXR1cm4gcXQuc2V0KCJwIixlKSxlfSxubj0oZSx0LG4pPT57Y29uc3QgYT1lLmhpZ2hwLG89ci4kbWF0cml4O2FbMF09b1s2XSxhWzFdPW9bN10sYVsyXT10LGFbM109bixhWzRdPXgoKSxhWzVdPUUoKX0scm49ZT0+e2UudXNlUHJvZ3JhbSgpLGUuYmluZFVuaWZvcm0oKSxtdChFdCgpKSxuLmRyYXdBcnJheXMobi5UUklBTkdMRVMsMCw2KX07bGV0IGFuPW51bGw7Y29uc3Qgb249KGUsdCxhLG8pPT57Y29uc3Qgcz1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LGk9ci4kbWFpbkF0dGFjaG1lbnRPYmplY3Q7ci5iaW5kKGkpO2NvbnN0IGM9SigpO3JldHVybiBuLmJpbmRGcmFtZWJ1ZmZlcihuLkZSQU1FQlVGRkVSLGMpLGFuJiZhbi53aWR0aD09PWkud2lkdGgmJmFuLmhlaWdodD09PWkuaGVpZ2h0fHwoYW49dWUoaS53aWR0aCxpLmhlaWdodCkpLE9lKGFuKSxuLmZyYW1lYnVmZmVyVGV4dHVyZTJEKG4uRlJBTUVCVUZGRVIsbi5DT0xPUl9BVFRBQ0hNRU5UMCxuLlRFWFRVUkVfMkQsYW4ucmVzb3VyY2UsMCksbi5iaW5kRnJhbWVidWZmZXIobi5GUkFNRUJVRkZFUixudWxsKSxuLmJpbmRGcmFtZWJ1ZmZlcihuLlJFQURfRlJBTUVCVUZGRVIsRCksbi5iaW5kRnJhbWVidWZmZXIobi5EUkFXX0ZSQU1FQlVGRkVSLGMpLG4uZW5hYmxlKG4uU0NJU1NPUl9URVNUKSxuLnNjaXNzb3IoZSxpLmhlaWdodC10LW8sYSsxLG8rMSksbi5ibGl0RnJhbWVidWZmZXIoMCwwLGkud2lkdGgsaS5oZWlnaHQsMCwwLGkud2lkdGgsaS5oZWlnaHQsbi5DT0xPUl9CVUZGRVJfQklULG4uTkVBUkVTVCksbi5kaXNhYmxlKG4uU0NJU1NPUl9URVNUKSxuLmJpbmRGcmFtZWJ1ZmZlcihuLkZSQU1FQlVGRkVSLEQpLHMmJnIuYmluZChzKSxhbn0sc249KGUsdCxuLGEpPT57Y29uc3Qgbz1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LHM9b24oZSx0LG4sYSksaT1oZShuLGEsITEpO3IuYmluZChpKSxyLnNhdmUoKSxyLnNldFRyYW5zZm9ybSgxLDAsMCwxLC1lLC10KTtjb25zdCBjPXRuKCk7bm4oYyxzLndpZHRoLHMuaGVpZ2h0KSxMdCgpLE9lKHMpLHJuKGMpO2NvbnN0IGw9aS50ZXh0dXJlO3JldHVybiByLnJlc3RvcmUoKSxlZShpLCExKSxvJiZyLmJpbmQobyksbH0sY249KCk9Pns2MTAhPT1JdCgpJiYoQnQoNjEwKSxuLmJsZW5kRnVuYyhuLk9ORSxuLlpFUk8pKX0sbG49ZT0+e09lKGUpLGNuKCk7Y29uc3QgdD10bigpO25uKHQsZS53aWR0aCxlLmhlaWdodCkscm4odCksTHQoKX0sdW49KGUsdCxuLHIsYSxvLHMsaSxjKT0+e2NvbnN0IGw9ZS50ZXh0dXJlcztsWzBdPTAsbFsxXT0xO2NvbnN0IHU9ZS5tZWRpdW1wO3VbMF09dCx1WzFdPW4sdVsyXT1yLHVbM109YSx1WzRdPW8sdVs1XT1zLHVbNl09aSx1WzddPWN9LGhuPShlPSExKT0+e2NvbnN0IHQ9Im0iKyhlPyJ5IjoibiIpO2lmKHF0Lmhhcyh0KSlyZXR1cm4gcXQuZ2V0KHQpO2NvbnN0IG49bmV3IE10KCIjdmVyc2lvbiAzMDAgZXNcblxubGF5b3V0IChsb2NhdGlvbiA9IDApIGluIHZlYzIgYV92ZXJ0ZXg7XG51bmlmb3JtIHZlYzQgdV9oaWdocFszXTtcblxub3V0IHZlYzIgdl9jb29yZDtcblxudm9pZCBtYWluKCkge1xuICAgIHZfY29vcmQgPSBhX3ZlcnRleDtcblxuICAgIG1hdDMgbWF0cml4ID0gbWF0MyhcbiAgICAgICAgdV9oaWdocFswXS54LCB1X2hpZ2hwWzBdLnksIDAuMCxcbiAgICAgICAgdV9oaWdocFswXS56LCB1X2hpZ2hwWzBdLncsIDAuMCxcbiAgICAgICAgdV9oaWdocFsxXS54LCB1X2hpZ2hwWzFdLnksIDEuMFxuICAgICk7XG5cbiAgICB2ZWMyIHNpemUgICAgID0gdV9oaWdocFsxXS56dztcbiAgICB2ZWMyIHZpZXdwb3J0ID0gdmVjMih1X2hpZ2hwWzJdLngsIHVfaGlnaHBbMl0ueSk7XG5cbiAgICB2ZWMyIHBvc2l0aW9uID0gdmVjMihhX3ZlcnRleC54LCAxLjAgLSBhX3ZlcnRleC55KTtcbiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uICogc2l6ZTtcbiAgICBwb3NpdGlvbiA9IChtYXRyaXggKiB2ZWMzKHBvc2l0aW9uLCAxLjApKS54eTtcbiAgICBwb3NpdGlvbiAvPSB2aWV3cG9ydDtcblxuICAgIHBvc2l0aW9uID0gcG9zaXRpb24gKiAyLjAgLSAxLjA7XG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLngsIC1wb3NpdGlvbi55LCAwLjAsIDEuMCk7XG59IixXdChlKSk7cmV0dXJuIHF0LnNldCh0LG4pLG59LGJuPShlLHQsbik9Pntjb25zdCBhPWUuaGlnaHAsbz1yLiRtYXRyaXg7YVswXT1vWzBdLGFbMV09b1sxXSxhWzJdPW9bM10sYVszXT1vWzRdLGFbNF09b1s2XSxhWzVdPW9bN10sYVs2XT10LGFbN109bixhWzhdPXgoKSxhWzldPUUoKX07bGV0IGRuPTA7Y29uc3QgZm49ZT0+e2UudXNlUHJvZ3JhbSgpLGUuYmluZFVuaWZvcm0oKSxtdChndCksbi5iaW5kQnVmZmVyKG4uQVJSQVlfQlVGRkVSLHB0KSxHdC5idWZmZXIubGVuZ3RoPmRuJiYoZG49R3QuYnVmZmVyLmxlbmd0aCxuLmJ1ZmZlckRhdGEobi5BUlJBWV9CVUZGRVIsNCpkbixuLkRZTkFNSUNfRFJBVykpLG4uYnVmZmVyU3ViRGF0YShuLkFSUkFZX0JVRkZFUiwwLEd0LmJ1ZmZlci5zdWJhcnJheSgwLEd0Lm9mZnNldCkpLG4uZHJhd0FycmF5c0luc3RhbmNlZChuLlRSSUFOR0xFUywwLDYsZS5jb3VudCl9LG1uPSgpPT57NjAzIT09SXQoKSYmKEJ0KDYwMyksbi5ibGVuZEZ1bmMobi5aRVJPLG4uT05FX01JTlVTX1NSQ19BTFBIQSkpfSx2bj1lPT57c3dpdGNoKGUpe2Nhc2UiYWRkIjo2MTEhPT1JdCgpJiYoQnQoNjExKSxuLmJsZW5kRnVuYyhuLk9ORSxuLk9ORSkpO2JyZWFrO2Nhc2Uic2NyZWVuIjo2NDEhPT1JdCgpJiYoQnQoNjQxKSxuLmJsZW5kRnVuYyhuLk9ORV9NSU5VU19EU1RfQ09MT1Isbi5PTkUpKTticmVhaztjYXNlImFscGhhIjo2MDYhPT1JdCgpJiYoQnQoNjA2KSxuLmJsZW5kRnVuYyhuLlpFUk8sbi5TUkNfQUxQSEEpKTticmVhaztjYXNlImVyYXNlIjptbigpO2JyZWFrO2Nhc2UiY29weSI6Y24oKTticmVhaztkZWZhdWx0Okx0KCl9fSxfbj1lPT57dmFyIHQ7KGU9PntwdD1lLmNyZWF0ZUJ1ZmZlcigpfSkoZSksdD0oKCk9Pntjb25zdCBlPWR0KCk7cmV0dXJuIG10KGUpLG4uYmluZEJ1ZmZlcihuLkFSUkFZX0JVRkZFUixlLnZlcnRleEJ1ZmZlciksbi5idWZmZXJEYXRhKG4uQVJSQVlfQlVGRkVSLG5ldyBGbG9hdDMyQXJyYXkoWzAsMCwxLDAsMCwxLDEsMSwwLDEsMSwwXSksbi5TVEFUSUNfRFJBVyksbi5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSgwKSxuLnZlcnRleEF0dHJpYlBvaW50ZXIoMCwyLG4uRkxPQVQsITEsMCwwKSxuLmJpbmRCdWZmZXIobi5BUlJBWV9CVUZGRVIscHQpLG4uYnVmZmVyRGF0YShuLkFSUkFZX0JVRkZFUixHdC5idWZmZXIubGVuZ3RoLG4uRFlOQU1JQ19EUkFXKSxuLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDEpLG4udmVydGV4QXR0cmliUG9pbnRlcigxLDQsbi5GTE9BVCwhMSw4OCwwKSxuLnZlcnRleEF0dHJpYkRpdmlzb3IoMSwxKSxuLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDIpLG4udmVydGV4QXR0cmliUG9pbnRlcigyLDQsbi5GTE9BVCwhMSw4OCwxNiksbi52ZXJ0ZXhBdHRyaWJEaXZpc29yKDIsMSksbi5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSgzKSxuLnZlcnRleEF0dHJpYlBvaW50ZXIoMywyLG4uRkxPQVQsITEsODgsMzIpLG4udmVydGV4QXR0cmliRGl2aXNvcigzLDEpLG4uZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoNCksbi52ZXJ0ZXhBdHRyaWJQb2ludGVyKDQsNCxuLkZMT0FULCExLDg4LDQwKSxuLnZlcnRleEF0dHJpYkRpdmlzb3IoNCwxKSxuLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDUpLG4udmVydGV4QXR0cmliUG9pbnRlcig1LDQsbi5GTE9BVCwhMSw4OCw1Niksbi52ZXJ0ZXhBdHRyaWJEaXZpc29yKDUsMSksbi5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSg2KSxuLnZlcnRleEF0dHJpYlBvaW50ZXIoNiw0LG4uRkxPQVQsITEsODgsNzIpLG4udmVydGV4QXR0cmliRGl2aXNvcig2LDEpLGV9KSgpLGd0PXR9LHBuPShlLHQscixhPSExKT0+e2NvbnN0IG89dWUoZSx0LGEpO3JldHVybiBuLnRleFN1YkltYWdlMkQobi5URVhUVVJFXzJELDAsMCwwLGUsdCxuLlJHQkEsbi5VTlNJR05FRF9CWVRFLHIpLG99LGduPShlLHQpPT57Y29uc3Qgcj0oKGUsdCxyLGE9ITEpPT57Y29uc3Qgbz11ZShlLHQsYSk7cmV0dXJuIG4udGV4U3ViSW1hZ2UyRChuLlRFWFRVUkVfMkQsMCwwLDAsbi5SR0JBLG4uVU5TSUdORURfQllURSxyKSxvfSkoZS53LGUuaCx0KSxhPXRuKCk7bm4oYSxlLncsZS5oKSxMdCgpLHJuKGEpLEwocil9LHhuPVtdLEVuPW5ldyBNYXAsQW49KGUsdCxuKT0+e09lKGUsITApO2NvbnN0IHI9TWF0aC5jZWlsKC41Km4pLGE9MS0oci0uNSpuKSxvPTErbixzPShlPT57Y29uc3QgdD1gYiR7ZX1gO2lmKEVuLmhhcyh0KSlyZXR1cm4gRW4uZ2V0KHQpO2NvbnN0IG49bmV3IE10KCIjdmVyc2lvbiAzMDAgZXNcblxubGF5b3V0IChsb2NhdGlvbiA9IDApIGluIHZlYzIgYV92ZXJ0ZXg7XG5cbm91dCB2ZWMyIHZfY29vcmQ7XG5cbnZvaWQgbWFpbigpIHtcbiAgICB2X2Nvb3JkID0gYV92ZXJ0ZXg7XG5cbiAgICB2ZWMyIHBvc2l0aW9uID0gYV92ZXJ0ZXggKiAyLjAgLSAxLjA7XG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLjAsIDEuMCk7XG59IiwoZT0+e2NvbnN0IHQ9ZS50b0ZpeGVkKDEpO3JldHVybmAjdmVyc2lvbiAzMDAgZXNcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXG51bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmU7XG51bmlmb3JtIHZlYzQgdV9tZWRpdW1wO1xuXG5pbiB2ZWMyIHZfY29vcmQ7XG5vdXQgdmVjNCBvX2NvbG9yO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdmVjMiAgb2Zmc2V0ICAgPSB1X21lZGl1bXAueHk7XG4gICAgZmxvYXQgZnJhY3Rpb24gPSB1X21lZGl1bXAuejtcbiAgICBmbG9hdCBzYW1wbGVzICA9IHVfbWVkaXVtcC53O1xuICAgIFxuICAgIHZlYzQgY29sb3IgPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdl9jb29yZCk7XG5cbiAgICBmb3IgKGZsb2F0IGkgPSAxLjA7IGkgPCAke3R9OyBpICs9IDEuMCkge1xuICAgICAgICBjb2xvciArPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdl9jb29yZCArIG9mZnNldCAqIGkpO1xuICAgICAgICBjb2xvciArPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdl9jb29yZCAtIG9mZnNldCAqIGkpO1xuICAgIH1cbiAgICBjb2xvciArPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdl9jb29yZCArIG9mZnNldCAqICR7dH0pICogZnJhY3Rpb247XG4gICAgY29sb3IgKz0gdGV4dHVyZSh1X3RleHR1cmUsIHZfY29vcmQgLSBvZmZzZXQgKiAke3R9KSAqIGZyYWN0aW9uO1xuICAgIGNvbG9yIC89IHNhbXBsZXM7XG5cbiAgICBvX2NvbG9yID0gY29sb3I7XG59YH0pKGUpKTtyZXR1cm4gRW4uc2V0KHQsbiksbn0pKHIpOygoZSx0LG4scixhLG8pPT57Y29uc3Qgcz1lLm1lZGl1bXA7cj8oc1swXT0xL3Qsc1sxXT0wKTooc1swXT0wLHNbMV09MS9uKSxzWzJdPWEsc1szXT1vfSkocyxlLndpZHRoLGUuaGVpZ2h0LHQsYSxvKSxybihzKX0seW49e3g6MCx5OjB9LFRuPShlLHQsbik9PihlPj4xNikqKG4/dDoxKS8yNTUsUm49KGUsdCxuKT0+KGU+PjgmMjU1KSoobj90OjEpLzI1NSxNbj0oZSx0LG4pPT4oMjU1JmUpKihuP3Q6MSkvMjU1LHduPVsuNSwxLjA1LDEuNCwxLjU1LDEuNzUsMS45LDIsMi4xNSwyLjIsMi4zLDIuNSwzLDMsMy41LDMuNV0sRm49KGUsdCxuPTQsYT00LG89MSxzPSEwKT0+e2NvbnN0IGk9ci5jdXJyZW50QXR0YWNobWVudE9iamVjdCxjPU1hdGguc3FydCh0WzBdKnRbMF0rdFsxXSp0WzFdKSxsPU1hdGguc3FydCh0WzJdKnRbMl0rdFszXSp0WzNdKSx1PXkoKSxoPW4qKGMvdSksYj1hKihsL3UpLGQ9d25bby0xXSxmPU1hdGgucm91bmQoaCpkKSxtPU1hdGgucm91bmQoYipkKTt5bi54Kz1mLHluLnkrPW07Y29uc3Qgdj1lLndpZHRoKzIqZixfPWUuaGVpZ2h0KzIqbTtsZXQgcD0xLGc9MTtoPjEyOD9wPS4wNjI1Omg+NjQ/cD0uMTI1Omg+MzI/cD0uMjU6aD4xNiYmKHA9LjUpLGI+MTI4P2c9LjA2MjU6Yj42ND9nPS4xMjU6Yj4zMj9nPS4yNTpiPjE2JiYoZz0uNSk7Y29uc3QgeD1NYXRoLmNlaWwodipwKSxFPU1hdGguY2VpbChfKmcpLEE9aGUoeCxFLCExKSxUPVtBLGhlKHgsRSwhMSldO3IuYmluZChBKSxyLnJlc2V0KCksci5zZXRUcmFuc2Zvcm0ocCwwLDAsZyxmKnAsbSpnKSxPZShlKTtjb25zdCBSPWhuKCk7Ym4oUixlLndpZHRoLGUuaGVpZ2h0KSxybihSKSxzJiZMKGUpO2NvbnN0IE09aCpwLHc9YipnO2xldCBGPTAsJD1BLnRleHR1cmU7T2UoJCwhMCksY24oKTtmb3IobGV0IGU9MDtlPG87KytlKXtpZihuPjApe0Y9KEYrMSklMjtjb25zdCBlPVRbRl07ci5iaW5kKGUpLEFuKCQsITAsTSksJD1lLnRleHR1cmV9aWYoYT4wKXtGPShGKzEpJTI7Y29uc3QgZT1UW0ZdO3IuYmluZChlKSxBbigkLCExLHcpLCQ9ZS50ZXh0dXJlfX1pZihMdCgpLDEhPT1wfHwxIT09Zyl7Y29uc3QgZT1oZSh2LF8sITEpO3IuYmluZChlKSxyLnNldFRyYW5zZm9ybSgxL3AsMCwwLDEvZywwLDApLE9lKCQsITApLGJuKFIsJC53aWR0aCwkLmhlaWdodCkscm4oUiksJD1lLnRleHR1cmUsZWUoVFswXSksZWUoVFsxXSksZWUoZSwhMSl9ZWxzZSBGPShGKzEpJTIsZWUoVFtGXSksRj0oRisxKSUyLGVlKFRbRl0sITEpO3JldHVybiBpJiZyLmJpbmQoaSksJH0sJG49KGUsdCk9Pntjb25zdCBuPXIuY3VycmVudEF0dGFjaG1lbnRPYmplY3QsYT1oZShlLndpZHRoLGUuaGVpZ2h0LCExKTtyLmJpbmQoYSksci5yZXNldCgpLHIuc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKSxPZShlKSxMdCgpO2NvbnN0IG89KCgpPT57aWYoRW4uaGFzKCJtIikpcmV0dXJuIEVuLmdldCgibSIpO2NvbnN0IGU9bmV3IE10KCIjdmVyc2lvbiAzMDAgZXNcblxubGF5b3V0IChsb2NhdGlvbiA9IDApIGluIHZlYzIgYV92ZXJ0ZXg7XG5cbm91dCB2ZWMyIHZfY29vcmQ7XG5cbnZvaWQgbWFpbigpIHtcbiAgICB2X2Nvb3JkID0gYV92ZXJ0ZXg7XG5cbiAgICB2ZWMyIHBvc2l0aW9uID0gYV92ZXJ0ZXggKiAyLjAgLSAxLjA7XG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLjAsIDEuMCk7XG59IiwiI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxudW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlO1xudW5pZm9ybSB2ZWM0IHVfbWVkaXVtcFs1XTtcblxuaW4gdmVjMiB2X2Nvb3JkO1xub3V0IHZlYzQgb19jb2xvcjtcblxudm9pZCBtYWluKCkge1xuICAgIG1hdDQgbXVsID0gbWF0NCh1X21lZGl1bXBbMF0sIHVfbWVkaXVtcFsxXSwgdV9tZWRpdW1wWzJdLCB1X21lZGl1bXBbM10pO1xuICAgIHZlYzQgYWRkID0gdV9tZWRpdW1wWzRdO1xuICAgIFxuICAgIHZlYzQgY29sb3IgPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdl9jb29yZCk7XG5cbiAgICBjb2xvci5yZ2IgLz0gbWF4KDAuMDAwMSwgY29sb3IuYSk7XG4gICAgY29sb3IgPSBjbGFtcChjb2xvciAqIG11bCArIGFkZCwgMC4wLCAxLjApO1xuICAgIGNvbG9yLnJnYiAqPSBjb2xvci5hO1xuXG4gICAgb19jb2xvciA9IGNvbG9yO1xufSIpO3JldHVybiBFbi5zZXQoIm0iLGUpLGV9KSgpOygoZSx0KT0+e2NvbnN0IG49ZS5tZWRpdW1wO25bMF09dFswXSxuWzFdPXRbMV0sblsyXT10WzJdLG5bM109dFszXSxuWzRdPXRbNV0sbls1XT10WzZdLG5bNl09dFs3XSxuWzddPXRbOF0sbls4XT10WzEwXSxuWzldPXRbMTFdLG5bMTBdPXRbMTJdLG5bMTFdPXRbMTNdLG5bMTJdPXRbMTVdLG5bMTNdPXRbMTZdLG5bMTRdPXRbMTddLG5bMTVdPXRbMThdLG5bMTZdPXRbNF0vMjU1LG5bMTddPXRbOV0vMjU1LG5bMThdPXRbMTRdLzI1NSxuWzE5XT10WzE5XS8yNTV9KShvLHQpLHJuKG8pO2NvbnN0IHM9YS50ZXh0dXJlO3JldHVybiBMKGUpLGVlKGEsITEpLG4mJnIuYmluZChuKSxzfSxPbj0oZSx0LG4scixhLG8pPT57Y29uc3Qgcz1lPyJibHVyLmEgPSAxLjAgLSBibHVyLmE7IjoiIixpPW4/KGM9byxgXG4gICAgZmxvYXQgc3RyZW5ndGggPSB1X21lZGl1bXBbJHtNYXRoLmZsb29yKGMvNCl9XVske2MlNH1dO1xuICAgIGJsdXIuYSA9IGNsYW1wKGJsdXIuYSAqIHN0cmVuZ3RoLCAwLjAsIDEuMCk7XG5gKToiIjt2YXIgYztjb25zdCBsPXI/KGU9PmBcbiAgICBibHVyID0gdGV4dHVyZSh1X3RleHR1cmVzWyR7ZT8yOjF9XSwgdmVjMihibHVyLmEsIDAuNSkpO1xuYCkodCk6KGU9PmBcbiAgICB2ZWM0IGNvbG9yID0gdV9tZWRpdW1wWyR7ZX1dO1xuICAgIGJsdXIgPSBjb2xvciAqIGJsdXIuYTtcbmApKGEpO3JldHVybmBcbiAgICAke3N9XG4gICAgJHtpfVxuICAgICR7bH1cbmB9LFNuPShlLHQsbixyLGEsbyk9Pntjb25zdCBzPXQ/IlxuICAgIHZlYzIgcHEgPSAoMS4wIC0gdl9jb29yZCkgKiBibHVyX3NjYWxlIC0gYmx1cl9vZmZzZXQ7XG4gICAgdmVjNCBibHVyMiA9IG1peCh2ZWM0KDAuMCksIHRleHR1cmUodV90ZXh0dXJlc1swXSwgcHEpLCBpc0luc2lkZShwcSkpO1xuIjoiXG4gICAgdmVjNCBibHVyMiA9IHRleHR1cmUodV90ZXh0dXJlc1swXSwgMS4wIC0gdl9jb29yZCk7XG4iLGk9bj8oYz1vLGBcbiAgICBmbG9hdCBzdHJlbmd0aCA9IHVfbWVkaXVtcFske01hdGguZmxvb3IoYy80KX1dWyR7YyU0fV07XG4gICAgaGlnaGxpZ2h0X2FscGhhICo9IHN0cmVuZ3RoO1xuICAgIHNoYWRvd19hbHBoYSAgICAqPSBzdHJlbmd0aDtcbmApOiIiO3ZhciBjO2NvbnN0IGw9cj8oZT0+YFxuICAgIGJsdXIgPSB0ZXh0dXJlKHVfdGV4dHVyZXNbJHtlPzI6MX1dLCB2ZWMyKFxuICAgICAgICAwLjUwMTk2MDc4NDMxMzcyNTUgLSAwLjUwMTk2MDc4NDMxMzcyNTUgKiBzaGFkb3dfYWxwaGEgKyAwLjQ5ODAzOTIxNTY4NjI3NDUgKiBoaWdobGlnaHRfYWxwaGEsXG4gICAgICAgIDAuNVxuICAgICkpO1xuYCkoZSk6KGU9PmBcbiAgICB2ZWM0IGhpZ2hsaWdodF9jb2xvciA9IHVfbWVkaXVtcFske2V9XTtcbiAgICB2ZWM0IHNoYWRvd19jb2xvciAgICA9IHVfbWVkaXVtcFske2UrMX1dO1xuICAgIGJsdXIgPSBoaWdobGlnaHRfY29sb3IgKiBoaWdobGlnaHRfYWxwaGEgKyBzaGFkb3dfY29sb3IgKiBzaGFkb3dfYWxwaGE7XG5gKShhKTtyZXR1cm5gXG4gICAgJHtzfVxuICAgIGZsb2F0IGhpZ2hsaWdodF9hbHBoYSA9IGJsdXIuYSAtIGJsdXIyLmE7XG4gICAgZmxvYXQgc2hhZG93X2FscGhhICAgID0gYmx1cjIuYSAtIGJsdXIuYTtcbiAgICAke2l9XG4gICAgaGlnaGxpZ2h0X2FscGhhID0gY2xhbXAoaGlnaGxpZ2h0X2FscGhhLCAwLjAsIDEuMCk7XG4gICAgc2hhZG93X2FscGhhICAgID0gY2xhbXAoc2hhZG93X2FscGhhLCAwLjAsIDEuMCk7XG4gICAgJHtsfVxuYH0sa249KGUsdCxuLHIsYSxvLHMpPT57Y29uc3QgaT1gZiR7ZT8ieSI6Im4ifSR7dD8ieSI6Im4ifSR7bj8ieSI6Im4ifSR7cn0ke2E/InkiOiJuIn0ke28/InkiOiJuIn1gO2lmKEVuLmhhcyhpKSlyZXR1cm4gRW4uZ2V0KGkpO2xldCBjPTE7ZSYmYysrLHMmJmMrKztsZXQgbD0oZT80OjApKyh0PzQ6MCkrKG8/MTowKTtzfHwobCs9bj80OjgpLGw9TWF0aC5jZWlsKGwvNCk7Y29uc3QgdT1uZXcgTXQoIiN2ZXJzaW9uIDMwMCBlc1xuXG5sYXlvdXQgKGxvY2F0aW9uID0gMCkgaW4gdmVjMiBhX3ZlcnRleDtcblxub3V0IHZlYzIgdl9jb29yZDtcblxudm9pZCBtYWluKCkge1xuICAgIHZfY29vcmQgPSBhX3ZlcnRleDtcblxuICAgIHZlYzIgcG9zaXRpb24gPSBhX3ZlcnRleCAqIDIuMCAtIDEuMDtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuMCwgMS4wKTtcbn0iLCgoZSx0LG4scixhLG8scyxpLGMpPT57bGV0IGw9MDtjb25zdCB1PW4/KGU9PmBcbiAgICB2ZWMyIGJhc2Vfc2NhbGUgID0gdV9tZWRpdW1wWyR7ZX1dLnh5O1xuICAgIHZlYzIgYmFzZV9vZmZzZXQgPSB1X21lZGl1bXBbJHtlfV0uenc7XG5cbiAgICB2ZWMyIHV2ID0gdl9jb29yZCAqIGJhc2Vfc2NhbGUgLSBiYXNlX29mZnNldDtcbiAgICB2ZWM0IGJhc2UgPSBtaXgodmVjNCgwLjApLCB0ZXh0dXJlKHVfdGV4dHVyZXNbMV0sIHV2KSwgaXNJbnNpZGUodXYpKTtcbmApKGwrKyk6IiIsaD1yPyhlPT5gXG4gICAgdmVjMiBibHVyX3NjYWxlICA9IHVfbWVkaXVtcFske2V9XS54eTtcbiAgICB2ZWMyIGJsdXJfb2Zmc2V0ID0gdV9tZWRpdW1wWyR7ZX1dLnp3O1xuXG4gICAgdmVjMiBzdCA9IHZfY29vcmQgKiBibHVyX3NjYWxlIC0gYmx1cl9vZmZzZXQ7XG4gICAgdmVjNCBibHVyID0gbWl4KHZlYzQoMC4wKSwgdGV4dHVyZSh1X3RleHR1cmVzWzBdLCBzdCksIGlzSW5zaWRlKHN0KSk7XG5gKShsKyspOiJcbiAgICB2ZWM0IGJsdXIgPSB0ZXh0dXJlKHVfdGV4dHVyZXNbMF0sIHZfY29vcmQpO1xuIixiPSJpbm5lciI9PT1vLGQ9bDtsZXQgZixtLHY9NCpsO3N3aXRjaChjP2Y9YT9PbighMSxuLGksYyxkLHYpOlNuKG4scixpLGMsZCx2KTphPyh2Kz00LGY9T24oYixuLGksYyxkLHYpKToodis9OCxmPVNuKG4scixpLGMsZCx2KSksbyl7Y2FzZSJvdXRlciI6bT1zPyJibHVyIC0gYmx1ciAqIGJhc2UuYSI6ImJhc2UgKyBibHVyIC0gYmx1ciAqIGJhc2UuYSI7YnJlYWs7Y2FzZSJmdWxsIjptPXM/ImJsdXIiOiJiYXNlIC0gYmFzZSAqIGJsdXIuYSArIGJsdXIiO2JyZWFrO2RlZmF1bHQ6bT0iYmx1ciJ9cmV0dXJuYCN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cbnVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZXNbJHtlfV07XG51bmlmb3JtIHZlYzQgdV9tZWRpdW1wWyR7dH1dO1xuXG5pbiB2ZWMyIHZfY29vcmQ7XG5vdXQgdmVjNCBvX2NvbG9yO1xuXG5cbmZsb2F0IGlzSW5zaWRlKGluIHZlYzIgdXYpIHtcbiAgICByZXR1cm4gc3RlcCg0LjAsIGRvdChzdGVwKHZlYzQoMC4wLCB1di54LCAwLjAsIHV2LnkpLCB2ZWM0KHV2LngsIDEuMCwgdXYueSwgMS4wKSksIHZlYzQoMS4wKSkpO1xufVxuXG52b2lkIG1haW4oKSB7XG4gICAgJHt1fVxuICAgICR7aH1cbiAgICAke2Z9XG4gICAgb19jb2xvciA9ICR7bX07XG59YH0pKGMsbCxlLHQsbixyLGEsbyxzKSk7cmV0dXJuIEVuLnNldChpLHUpLHV9LENuPW5ldyBNYXAsUG49KGUsdCk9Pntjb25zdCBuPWBsJHsoIjAwIitlKS5zbGljZSgtMyl9JHt0PyJ5IjoibiJ9YDtpZihDbi5oYXMobikpcmV0dXJuIENuLmdldChuKTtjb25zdCByPU1hdGguY2VpbCg1KmUvNCksYT1uZXcgTXQoIiN2ZXJzaW9uIDMwMCBlc1xuXG5sYXlvdXQgKGxvY2F0aW9uID0gMCkgaW4gdmVjMiBhX3ZlcnRleDtcblxub3V0IHZlYzIgdl9jb29yZDtcblxudm9pZCBtYWluKCkge1xuICAgIHZfY29vcmQgPSBhX3ZlcnRleDtcblxuICAgIHZlYzIgcG9zaXRpb24gPSBhX3ZlcnRleCAqIDIuMCAtIDEuMDtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuMCwgMS4wKTtcbn0iLCgoZSx0LG4pPT57bGV0IHI9IiI7Zm9yKGxldCBlPTE7ZTx0OysrZSl7Y29uc3Qgbj1lLTEsYT1lLG89YHVfbWVkaXVtcFske3QrTWF0aC5mbG9vcihuLzQpfV1bJHtuJTR9XWAscz1gdV9tZWRpdW1wWyR7dCtNYXRoLmZsb29yKGEvNCl9XVske2ElNH1dYDtyKz1gXG4gICAgaWYgKHQgPD0gJHtzfSkge1xuICAgICAgICByZXR1cm4gbWl4KHVfbWVkaXVtcFske259XSwgdV9tZWRpdW1wWyR7YX1dLCAodCAtICR7b30pIC8gKCR7c30gLSAke299KSk7XG4gICAgfVxuYH1yZXR1cm5gI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxudW5pZm9ybSB2ZWM0IHVfbWVkaXVtcFske2V9XTtcblxuaW4gdmVjMiB2X2Nvb3JkO1xub3V0IHZlYzQgb19jb2xvcjtcblxudmVjNCBnZXRHcmFkaWVudENvbG9yKGluIGZsb2F0IHQpIHtcbiAgICBpZiAodCA8PSB1X21lZGl1bXBbJHt0fV1bMF0pIHtcbiAgICAgICAgcmV0dXJuIHVfbWVkaXVtcFswXTtcbiAgICB9XG4gICAgJHtyfVxuICAgIHJldHVybiB1X21lZGl1bXBbJHt0LTF9XTtcbn1cblxudm9pZCBtYWluKCkge1xuICAgIHZlYzQgY29sb3IgPSBnZXRHcmFkaWVudENvbG9yKHZfY29vcmQueCk7XG4gICAgJHtuPyJjb2xvciA9IHBvdyhjb2xvciwgdmVjNCgwLjQ1NDU0NTQ1KSk7IjoiIn1cbiAgICBjb2xvci5yZ2IgKj0gY29sb3IuYTtcblxuICAgIG9fY29sb3IgPSBjb2xvcjtcbn1gfSkocixlLHQpKTtyZXR1cm4gQ24uc2V0KG4sYSksYX0sQm49KGUsdCxuLHIsYSxvKT0+e2NvbnN0IHM9ZS5tZWRpdW1wO2xldCBpPTA7Zm9yKGxldCBlPWE7ZTxvO2UrKyl7Y29uc3QgdD1uW2VdO3NbaSsrXT0odD4+MTYpLzI1NSxzW2krK109KHQ+PjgmMjU1KS8yNTUsc1tpKytdPSgyNTUmdCkvMjU1LHNbaSsrXT1yW2VdfWZvcihsZXQgZT1hO2U8bztlKyspc1tpKytdPXRbZV0vMjU1fTtsZXQgSW47Y29uc3QgTG49KGUsdCk9PihJbj9fdFswXT09PWUmJl90WzRdPT09dHx8KF90WzBdPWUsX3RbMl09ZSxfdFs0XT10LF90WzZdPXQsbi5idWZmZXJTdWJEYXRhKG4uQVJSQVlfQlVGRkVSLDAsX3QpKTpJbj0oKGUsdCk9Pntjb25zdCByPWR0KCk7cmV0dXJuIG10KHIpLG4uYmluZEJ1ZmZlcihuLkFSUkFZX0JVRkZFUixyLnZlcnRleEJ1ZmZlciksX3RbMF09ZSxfdFsyXT1lLF90WzRdPXQsX3RbNl09dCxuLmJ1ZmZlckRhdGEobi5BUlJBWV9CVUZGRVIsX3Qsbi5TVEFUSUNfRFJBVyksbi5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSgwKSxuLnZlcnRleEF0dHJpYlBvaW50ZXIoMCwyLG4uRkxPQVQsITEsMCwwKSxyfSkoZSx0KSxJbiksVW49KGUsdCxyKT0+e2UudXNlUHJvZ3JhbSgpLGUuYmluZFVuaWZvcm0oKSxtdChMbih0LHIpKSxuLmRyYXdBcnJheXMobi5UUklBTkdMRV9TVFJJUCwwLDQpfTtsZXQgTm49bnVsbDtjb25zdCBEbj0oKT0+KE5ufHwoTm49aGUoNTEyLDEsITEpKSxObik7bGV0IGpuPTA7Y29uc3QgWG49KCk9PmpuLHpuPW5ldyBGbG9hdDMyQXJyYXkoMjU2KSxWbj1uZXcgRmxvYXQzMkFycmF5KDI1Nik7Zm9yKGxldCBlPTA7ZTwyNTY7KytlKXtjb25zdCB0PWUvMjU1O3puW2VdPU1hdGgucG93KHQsMi4yMzMzMzMzMyksVm5bZV09dH1jb25zdCBXbj0oZSx0LGEsbyxzLGksYyxsLHUsaCxiLGQsZixtLHYsXyxwPW51bGwsZz1udWxsLHg9bnVsbCxFPTAsQT0wLHk9MCxUPTAsUj0wLE09MCx3PTAsRj0wKT0+e2NvbnN0ICQ9ci5jdXJyZW50QXR0YWNobWVudE9iamVjdCxPPWhlKGEsbywhMSk7ci5iaW5kKE8pO2NvbnN0IFM9ImlubmVyIj09PW0saz1udWxsIT09cCYmbnVsbCE9PWcmJm51bGwhPT14O2xldCBDPW51bGw7aWYoayYmKEM9KChlLHQsbik9Pntjb25zdCBhPXIuY3VycmVudEF0dGFjaG1lbnRPYmplY3Qsbz1EbigpO3IuYmluZChvKTtjb25zdCBzPWUubGVuZ3RoO2NuKCk7Y29uc3QgaT1YbigpO2ZvcihsZXQgcj0wO3I8cztyKz1pLTEpe2NvbnN0IGE9TWF0aC5taW4ocitpLHMpLG89UG4oYS1yLCExKTtCbihvLGUsdCxuLHIsYSksVW4obyxlW3JdLzI1NSxlW2EtMV0vMjU1KX1yZXR1cm4gTHQoKSxhJiZyLmJpbmQoYSksby50ZXh0dXJlfSkocCxnLHgpKSxTKXtyLnJlc2V0KCksci5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLE9lKGUsITApO2NvbnN0IGE9dG4oKTtubihhLGUud2lkdGgsZS5oZWlnaHQpLHJuKGEpLGsmJkM/KChlLHQscj0hMSk9PnskZSgyLG4uVEVYVFVSRTIsdCxyKSwkZSgxLG4uVEVYVFVSRTEsbnVsbCksJGUoMCxuLlRFWFRVUkUwLGUscil9KSh0LEMsITApOk9lKHQsITApfWVsc2UgayYmQz8oKGUsdCxyLGE9ITEpPT57JGUoMixuLlRFWFRVUkUyLHIsYSksJGUoMSxuLlRFWFRVUkUxLHQsYSksJGUoMCxuLlRFWFRVUkUwLGUsYSl9KSh0LGUsQywhMCk6ZW4odCxlLCEwKTtjb25zdCBQPSEoU3x8ImZ1bGwiPT09bSYmdiksQj0hKGE9PT11JiZvPT09aCYmMD09PWImJjA9PT1kKSxJPSEoMT09PV8pO1M/dj82NzAhPT1JdCgpJiYoQnQoNjcwKSxuLmJsZW5kRnVuYyhuLkRTVF9BTFBIQSxuLlpFUk8pKTo2NzMhPT1JdCgpJiYoQnQoNjczKSxuLmJsZW5kRnVuYyhuLkRTVF9BTFBIQSxuLk9ORV9NSU5VU19TUkNfQUxQSEEpKTpjbigpO2NvbnN0IEw9a24oUCxCLGYsbSx2LEksayk7KChlLHQsbixyLGEsbyxzLGksYyxsLHUsaCxiLGQsZixtLHYsXyxwLGcseCxFLEEseSxUKT0+e2xldCBSO0U/KFI9ZS50ZXh0dXJlcyxSWzBdPTAsUlsxXT0xLFQmJihSWzJdPTIpKTpUJiYoUj1lLnRleHR1cmVzLFJbMF09MCxSWzFdPTIpO2NvbnN0IE09ZS5tZWRpdW1wO2xldCB3PTA7RSYmKE1bdysrXT10L3IsTVt3KytdPW4vYSxNW3crK109by9yLE1bdysrXT0obi1hLXMpL2EpLEEmJihNW3crK109dC9pLE1bdysrXT1uL2MsTVt3KytdPWwvaSxNW3crK109KG4tYy11KS9jKSxUfHwoaD8oTVt3KytdPWQsTVt3KytdPWYsTVt3KytdPW0sTVt3KytdPXYpOihNW3crK109ZCxNW3crK109ZixNW3crK109bSxNW3crK109dixNW3crK109XyxNW3crK109cCxNW3crK109ZyxNW3crK109eCkpLHkmJihNW3ddPWIpfSkoTCxhLG8scyxpLGMsbCx1LGgsYixkLGYsXyxFLEEseSxULFIsTSx3LEYsUCxCLEksaykscm4oTCk7Y29uc3QgVT1PLnRleHR1cmU7cmV0dXJuIGVlKE8sITEpLEx0KCksJCYmci5iaW5kKCQpLFV9LEduPShlLHQsbj0wLGE9MSxvPTQscz00LGk9MSxjPTEsbD0hMSx1PSExKT0+e2NvbnN0IGg9ci5jdXJyZW50QXR0YWNobWVudE9iamVjdCxiPWUud2lkdGgsZD1lLmhlaWdodCxmPXluLngsbT15bi55LHY9Rm4oZSx0LG8scyxjLCExKSxfPXYud2lkdGgscD12LmhlaWdodCxnPXluLngtZix4PXluLnktbSxFPVduKGUsdixsP2I6XyxsP2Q6cCxiLGQsbD8wOmcsbD8wOngsXyxwLGw/LWc6MCxsPy14OjAsITAsbD8iaW5uZXIiOiJvdXRlciIsdSxpLG51bGwsbnVsbCxudWxsLFRuKG4sYSwhMCksUm4obixhLCEwKSxNbihuLGEsITApLGEsMCwwLDAsMCk7cmV0dXJuIEwoZSksTCh2KSxoJiZyLmJpbmQoaCksRX0sWW49TWF0aC5QSS8xODAscW49KGUsdCxuPTQsYT00NSxvPTAscz0xLGk9NCxjPTQsbD0xLHU9MSxoPSExLGI9ITEsZD0hMSk9Pntjb25zdCBmPXIuY3VycmVudEF0dGFjaG1lbnRPYmplY3QsbT1lLndpZHRoLHY9ZS5oZWlnaHQsXz15bi54LHA9eW4ueSxnPUZuKGUsdCxpLGMsdSwhMSkseD1nLndpZHRoLEU9Zy5oZWlnaHQsQT15bi54LFQ9eW4ueSxSPUEtXyxNPVQtcCx3PU1hdGguc3FydCh0WzBdKnRbMF0rdFsxXSp0WzFdKSxGPU1hdGguc3FydCh0WzJdKnRbMl0rdFszXSp0WzNdKSwkPXkoKSxPPWEqWW4sUz1NYXRoLmNvcyhPKSpuKih3LyQpLGs9TWF0aC5zaW4oTykqbiooRi8kKSxDPWg/bTp4K01hdGgubWF4KDAsTWF0aC5hYnMoUyktUiksUD1oP3Y6RStNYXRoLm1heCgwLE1hdGguYWJzKGspLU0pLEI9TWF0aC5jZWlsKEMpLEk9TWF0aC5jZWlsKFApLFU9KEItQykvMixOPShJLVApLzIsRD1oPzA6TWF0aC5tYXgoMCxSLVMpK1Usaj1oPzA6TWF0aC5tYXgoMCxNLWspK04sWD1oP1MtQTooUz4wP01hdGgubWF4KDAsUy1SKTowKStVLHo9aD9rLVQ6KGs+MD9NYXRoLm1heCgwLGstTSk6MCkrTjtsZXQgVixXPSIiO2g/KFc9ImlubmVyIixWPWJ8fGQpOiFiJiZkPyhXPSJmdWxsIixWPSEwKTooVz0ib3V0ZXIiLFY9Yik7Y29uc3QgRz1XbihlLGcsQixJLG0sdixELGoseCxFLFgseiwhMCxXLFYsbCxudWxsLG51bGwsbnVsbCxUbihvLHMsITApLFJuKG8scywhMCksTW4obyxzLCEwKSxzLDAsMCwwLDApO3JldHVybiBMKGUpLEwoZyksZiYmci5iaW5kKGYpLEd9LEtuPU1hdGguUEkvMTgwLEhuPShlLHQsbj00LGE9NDUsbz0xNjc3NzIxNSxzPTEsaT0wLGM9MSxsPTQsdT00LGg9MSxiPTEsZD0wLGY9ITEpPT57Y29uc3QgbT1lLndpZHRoLHY9ZS5oZWlnaHQsXz15bi54LHA9eW4ueSxnPU1hdGguc3FydCh0WzBdKnRbMF0rdFsxXSp0WzFdKSx4PU1hdGguc3FydCh0WzJdKnRbMl0rdFszXSp0WzNdKSxFPXkoKSxBPWEqS24sVD1NYXRoLmNvcyhBKSpuKihnL0UpLFI9TWF0aC5zaW4oQSkqbiooeC9FKSxNPXIuY3VycmVudEF0dGFjaG1lbnRPYmplY3Qsdz1oZShtLHYsITEpO3IuYmluZCh3KSxyLnJlc2V0KCksci5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLE9lKGUpO2NvbnN0IEY9dG4oKTtubihGLGUud2lkdGgsZS5oZWlnaHQpLHJuKEYpLHIuc2V0VHJhbnNmb3JtKDEsMCwwLDEsMipULDIqUiksbW4oKSxubihGLGUud2lkdGgsZS5oZWlnaHQpLHJuKEYpLEx0KCk7Y29uc3QgJD13LnRleHR1cmU7TSYmci5iaW5kKE0pO2NvbnN0IE89Rm4oJCx0LGwsdSxiLCExKTtlZSh3KTtjb25zdCBTPU8ud2lkdGgsaz1PLmhlaWdodCxDPU1hdGguY2VpbChTKzIqTWF0aC5hYnMoVCkpLFA9TWF0aC5jZWlsKGsrMipNYXRoLmFicyhSKSk7bGV0IEI9IiI7c3dpdGNoKGQpe2Nhc2UgMDpCPSJmdWxsIjticmVhaztjYXNlIDE6Qj0iaW5uZXIiO2JyZWFrO2Nhc2UgMjpCPSJvdXRlciJ9Y29uc3QgST0iaW5uZXIiPT09QixVPUk/bTpDLE49ST92OlAsRD1NYXRoLmFicyhUKSxqPU1hdGguYWJzKFIpLFg9KFMtbSkvMix6PShrLXYpLzIsVj1JPzA6RCtYLFc9ST8wOmoreixHPVduKGUsTyxVLE4sbSx2LFYsVyxTLGssST8tWC1UOkQtVCxJPy16LVI6ai1SLCExLEIsZixoLG51bGwsbnVsbCxudWxsLFRuKG8scywhMCksUm4obyxzLCEwKSxNbihvLHMsITApLHMsVG4oaSxjLCEwKSxSbihpLGMsITApLE1uKGksYywhMCksYyk7cmV0dXJuIHluLng9XytWLHluLnk9cCtXLEwoZSksTChPKSxHfSxabj1NYXRoLlBJLzE4MCxRbj0oZSx0LG49NCxhPTQ1LG8scyxpLGM9NCxsPTQsdT0xLGg9MSxiPTAsZD0hMSk9Pntjb25zdCBmPWUud2lkdGgsbT1lLmhlaWdodCx2PXluLngsXz15bi55LHA9TWF0aC5zcXJ0KHRbMF0qdFswXSt0WzFdKnRbMV0pLGc9TWF0aC5zcXJ0KHRbMl0qdFsyXSt0WzNdKnRbM10pLHg9eSgpLEU9YSpabixBPU1hdGguY29zKEUpKm4qKHAveCksVD1NYXRoLnNpbihFKSpuKihnL3gpLFI9ci5jdXJyZW50QXR0YWNobWVudE9iamVjdCxNPWhlKGYsbSwhMSk7ci5iaW5kKE0pLHIucmVzZXQoKSxyLnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCksT2UoZSk7Y29uc3Qgdz10bigpO25uKHcsZS53aWR0aCxlLmhlaWdodCkscm4odyksci5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwyKkEsMipUKSxtbigpLG5uKHcsZS53aWR0aCxlLmhlaWdodCkscm4odyksTHQoKTtjb25zdCBGPU0udGV4dHVyZTtSJiZyLmJpbmQoUik7Y29uc3QgJD1GbihGLHQsYyxsLGgsITEpO2VlKE0pO2NvbnN0IE89JC53aWR0aCxTPSQuaGVpZ2h0LGs9TWF0aC5jZWlsKE8rMipNYXRoLmFicyhBKSksQz1NYXRoLmNlaWwoUysyKk1hdGguYWJzKFQpKTtsZXQgUD0iIjtzd2l0Y2goYil7Y2FzZSAwOlA9ImZ1bGwiO2JyZWFrO2Nhc2UgMTpQPSJpbm5lciI7YnJlYWs7Y2FzZSAyOlA9Im91dGVyIn1jb25zdCBCPSJpbm5lciI9PT1QLEk9Qj9mOmssVT1CP206QyxOPU1hdGguYWJzKEEpLEQ9TWF0aC5hYnMoVCksaj0oTy1mKS8yLFg9KFMtbSkvMix6PUI/MDpOK2osVj1CPzA6RCtYLFc9V24oZSwkLEksVSxmLG0seixWLE8sUyxCPy1qLUE6Ti1BLEI/LVgtVDpELVQsITEsUCxkLHUsaSxvLHMsMCwwLDAsMCwwLDAsMCwwKTtyZXR1cm4geW4ueD12K3oseW4ueT1fK1YsTChlKSxMKCQpLFd9LEpuPU1hdGguUEkvMTgwLGVyPShlLHQsbj00LHI9NDUsYSxvLHMsaT00LGM9NCxsPTEsdT0xLGg9MCxiPSExKT0+e2NvbnN0IGQ9ZS53aWR0aCxmPWUuaGVpZ2h0LG09eW4ueCx2PXluLnksXz1GbihlLHQsaSxjLHUsITEpLHA9Xy53aWR0aCxnPV8uaGVpZ2h0LHg9eW4ueCxFPXluLnksQT14LW0sVD1FLXYsUj1NYXRoLnNxcnQodFswXSp0WzBdK3RbMV0qdFsxXSksTT1NYXRoLnNxcnQodFsyXSp0WzJdK3RbM10qdFszXSksdz15KCksRj1yKkpuLCQ9TWF0aC5jb3MoRikqbiooUi93KSxPPU1hdGguc2luKEYpKm4qKE0vdyksUz0xPT09aCxrPVM/ZDpwK01hdGgubWF4KDAsTWF0aC5hYnMoJCktQSksQz1TP2Y6ZytNYXRoLm1heCgwLE1hdGguYWJzKE8pLVQpLFA9TWF0aC5jZWlsKGspLEI9TWF0aC5jZWlsKEMpLEk9KFAtaykvMixVPShCLUMpLzIsTj1TPzA6TWF0aC5tYXgoMCxBLSQpK0ksRD1TPzA6TWF0aC5tYXgoMCxULU8pK1Usaj1TPyQteDooJD4wP01hdGgubWF4KDAsJC1BKTowKStJLFg9Uz9PLUU6KE8+MD9NYXRoLm1heCgwLE8tVCk6MCkrVTtsZXQgej0iIjtzd2l0Y2goaCl7Y2FzZSAwOno9ImZ1bGwiO2JyZWFrO2Nhc2UgMTp6PSJpbm5lciI7YnJlYWs7Y2FzZSAyOno9Im91dGVyIn1jb25zdCBWPVduKGUsXyxQLEIsZCxmLE4sRCxwLGcsaixYLCEwLHosYixsLHMsYSxvLDAsMCwwLDAsMCwwLDAsMCk7cmV0dXJuIHluLng9bStOLHluLnk9ditELEwoZSksTChfKSxWfSx0cj0oZSx0LG4scik9Pntjb25zdCBhPWBjJHsoIjAiK2UpLnNsaWNlKC0yKX0keygiMCIrdCkuc2xpY2UoLTIpfSR7bj8ieSI6Im4ifSR7cj8ieSI6Im4ifWA7aWYoRW4uaGFzKGEpKXJldHVybiBFbi5nZXQoYSk7Y29uc3Qgbz0ocj8xOjIpK01hdGguY2VpbChlKnQvNCkscz1uZXcgTXQoIiN2ZXJzaW9uIDMwMCBlc1xuXG5sYXlvdXQgKGxvY2F0aW9uID0gMCkgaW4gdmVjMiBhX3ZlcnRleDtcblxub3V0IHZlYzIgdl9jb29yZDtcblxudm9pZCBtYWluKCkge1xuICAgIHZfY29vcmQgPSBhX3ZlcnRleDtcblxuICAgIHZlYzIgcG9zaXRpb24gPSBhX3ZlcnRleCAqIDIuMCAtIDEuMDtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuMCwgMS4wKTtcbn0iLCgoZSx0LG4scixhKT0+e2NvbnN0IG89TWF0aC5mbG9vciguNSp0KSxzPU1hdGguZmxvb3IoLjUqbiksaT10Km47bGV0IGM9IiI7Y29uc3QgbD1hPzE6Mjtmb3IobGV0IGU9MDtlPGk7KytlKWMrPWBcbiAgICByZXN1bHQgKz0gZ2V0V2VpZ2h0ZWRDb2xvcigke2V9LCB1X21lZGl1bXBbJHtsK01hdGguZmxvb3IoZS80KX1dWyR7ZSU0fV0pO1xuYDtyZXR1cm5gI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxudW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlO1xudW5pZm9ybSB2ZWM0IHVfbWVkaXVtcFske2V9XTtcblxuaW4gdmVjMiB2X2Nvb3JkO1xub3V0IHZlYzQgb19jb2xvcjtcblxuXG5mbG9hdCBpc0luc2lkZShpbiB2ZWMyIHV2KSB7XG4gICAgcmV0dXJuIHN0ZXAoNC4wLCBkb3Qoc3RlcCh2ZWM0KDAuMCwgdXYueCwgMC4wLCB1di55KSwgdmVjNCh1di54LCAxLjAsIHV2LnksIDEuMCkpLCB2ZWM0KDEuMCkpKTtcbn1cblxudmVjNCBnZXRXZWlnaHRlZENvbG9yIChpbiBpbnQgaSwgaW4gZmxvYXQgd2VpZ2h0KSB7XG4gICAgdmVjMiByY3Bfc2l6ZSA9IHVfbWVkaXVtcFswXS54eTtcblxuICAgIGludCBpX2Rpdl94ID0gaSAvICR7dH07XG4gICAgaW50IGlfbW9kX3ggPSBpIC0gJHt0fSAqIGlfZGl2X3g7XG4gICAgdmVjMiBvZmZzZXQgPSB2ZWMyKGlfbW9kX3ggLSAke299LCAke3N9IC0gaV9kaXZfeCk7XG4gICAgdmVjMiB1diA9IHZfY29vcmQgKyBvZmZzZXQgKiByY3Bfc2l6ZTtcblxuICAgIHZlYzQgY29sb3IgPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdXYpO1xuICAgIGNvbG9yLnJnYiAvPSBtYXgoMC4wMDAxLCBjb2xvci5hKTtcbiAgICAke2E/IiI6IlxuICAgIHZlYzQgc3Vic3RpdHV0ZV9jb2xvciA9IHVfbWVkaXVtcFsxXTtcbiAgICBjb2xvciA9IG1peChzdWJzdGl0dXRlX2NvbG9yLCBjb2xvciwgaXNJbnNpZGUodXYpKTtcbiJ9XG5cbiAgICByZXR1cm4gY29sb3IgKiB3ZWlnaHQ7XG59XG5cbnZvaWQgbWFpbigpIHtcbiAgICBmbG9hdCByY3BfZGl2aXNvciA9IHVfbWVkaXVtcFswXS56O1xuICAgIGZsb2F0IGJpYXMgICAgICAgID0gdV9tZWRpdW1wWzBdLnc7XG5cbiAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMC4wKTtcbiAgICAke2N9XG4gICAgcmVzdWx0ID0gY2xhbXAocmVzdWx0ICogcmNwX2Rpdmlzb3IgKyBiaWFzLCAwLjAsIDEuMCk7XG4gICAgJHtyPyJyZXN1bHQuYSA9IHRleHR1cmUodV90ZXh0dXJlLCB2X2Nvb3JkKS5hOyI6IiJ9XG5cbiAgICByZXN1bHQucmdiICo9IHJlc3VsdC5hO1xuICAgIG9fY29sb3IgPSByZXN1bHQ7XG59YH0pKG8sZSx0LG4scikpO3JldHVybiBFbi5zZXQoYSxzKSxzfSxucj0oZSx0PTAsbj0wLGEsbz0xLHM9MCxpPSEwLGM9ITAsbD0wLHU9MCk9Pntjb25zdCBoPXIuY3VycmVudEF0dGFjaG1lbnRPYmplY3QsYj1lLndpZHRoLGQ9ZS5oZWlnaHQsZj1oZShiLGQsITEpO3IuYmluZChmKSxyLnJlc2V0KCksci5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLE9lKGUsITApLEx0KCk7Y29uc3QgbT10cih0LG4saSxjKTsoKGUsdCxuLHIsYSxvLHMsaSxjLGwsdSk9Pntjb25zdCBoPWUubWVkaXVtcDtoWzBdPTEvdCxoWzFdPTEvbixoWzJdPTEvYSxoWzNdPW8vMjU1O2xldCBiPTQ7c3x8KGhbYisrXT1pLGhbYisrXT1jLGhbYisrXT1sLGhbYisrXT11KTtjb25zdCBkPXIubGVuZ3RoO2ZvcihsZXQgZT0wO2U8ZDtlKyspaFtiKytdPXJbZV19KShtLGIsZCxhLG8scyxjLFRuKGwsdSwhMSksUm4obCx1LCExKSxNbihsLHUsITEpLHUpLHJuKG0pO2NvbnN0IHY9Zi50ZXh0dXJlO3JldHVybiBMKGUpLGVlKGYsITEpLGgmJnIuYmluZChoKSx2fSxycj0oZSx0LG4sYT0wLG89MCxzPTAsaT0wLGM9MCxsPTAsdT0wLGg9MCxiPTIsZD0wLGY9MCk9Pntjb25zdCBtPXIuY3VycmVudEF0dGFjaG1lbnRPYmplY3Qsdj15KCksXz1NYXRoLnNxcnQodFswXSp0WzBdK3RbMV0qdFsxXSkvdixwPU1hdGguc3FydCh0WzJdKnRbMl0rdFszXSp0WzNdKS92LGc9ZS53aWR0aCx4PWUuaGVpZ2h0LEU9Zy9fLEE9eC9wLFQ9aGUoZyx4LCExKTtyLmJpbmQoVCk7Y29uc3QgUj1wbihhLG8sbik7ZW4oZSxSKTtjb25zdCBNPSgoZSx0LG4pPT57Y29uc3Qgcj1gZCR7ZX0ke3R9JHtufWA7aWYoRW4uaGFzKHIpKXJldHVybiBFbi5nZXQocik7Y29uc3QgYT1uZXcgTXQoIiN2ZXJzaW9uIDMwMCBlc1xuXG5sYXlvdXQgKGxvY2F0aW9uID0gMCkgaW4gdmVjMiBhX3ZlcnRleDtcblxub3V0IHZlYzIgdl9jb29yZDtcblxudm9pZCBtYWluKCkge1xuICAgIHZfY29vcmQgPSBhX3ZlcnRleDtcblxuICAgIHZlYzIgcG9zaXRpb24gPSBhX3ZlcnRleCAqIDIuMCAtIDEuMDtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuMCwgMS4wKTtcbn0iLCgoZSx0LG4scik9PntsZXQgYSxvLHM7c3dpdGNoKHQpe2Nhc2UgMTphPSJtYXBfY29sb3IuciI7YnJlYWs7Y2FzZSAyOmE9Im1hcF9jb2xvci5nIjticmVhaztjYXNlIDQ6YT0ibWFwX2NvbG9yLmIiO2JyZWFrO2Nhc2UgODphPSJtYXBfY29sb3IuYSI7YnJlYWs7ZGVmYXVsdDphPSIwLjUifXN3aXRjaChuKXtjYXNlIDE6bz0ibWFwX2NvbG9yLnIiO2JyZWFrO2Nhc2UgMjpvPSJtYXBfY29sb3IuZyI7YnJlYWs7Y2FzZSA0Om89Im1hcF9jb2xvci5iIjticmVhaztjYXNlIDg6bz0ibWFwX2NvbG9yLmEiO2JyZWFrO2RlZmF1bHQ6bz0iMC41In1zd2l0Y2gocil7Y2FzZSAwOnM9IlxuICAgIHZlYzQgc291cmNlX2NvbG9yID0gdGV4dHVyZSh1X3RleHR1cmVzWzBdLCB1dik7XG4iO2JyZWFrO2Nhc2UgMzpzPSJcbiAgICB2ZWM0IHNvdXJjZV9jb2xvciA9dGV4dHVyZSh1X3RleHR1cmVzWzBdLCBtaXgodl9jb29yZCwgdXYsIHN0ZXAoYWJzKHV2IC0gdmVjMigwLjUpKSwgdmVjMigwLjUpKSkpO1xuIjticmVhaztjYXNlIDE6cz0iXG4gICAgdmVjNCBzdWJzdGl0dXRlX2NvbG9yID0gdV9tZWRpdW1wWzJdO1xuICAgIHZlYzQgc291cmNlX2NvbG9yID0gbWl4KHN1YnN0aXR1dGVfY29sb3IsIHRleHR1cmUodV90ZXh0dXJlc1swXSwgdXYpLCBpc0luc2lkZSh1dikpO1xuIjticmVhaztkZWZhdWx0OnM9IlxuICAgIHZlYzQgc291cmNlX2NvbG9yID0gdGV4dHVyZSh1X3RleHR1cmVzWzBdLCBmcmFjdCh1dikpO1xuIn1yZXR1cm5gI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxudW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlc1syXTtcbnVuaWZvcm0gdmVjNCB1X21lZGl1bXBbJHtlfV07XG5cbmluIHZlYzIgdl9jb29yZDtcbm91dCB2ZWM0IG9fY29sb3I7XG5cblxuZmxvYXQgaXNJbnNpZGUoaW4gdmVjMiB1dikge1xuICAgIHJldHVybiBzdGVwKDQuMCwgZG90KHN0ZXAodmVjNCgwLjAsIHV2LngsIDAuMCwgdXYueSksIHZlYzQodXYueCwgMS4wLCB1di55LCAxLjApKSwgdmVjNCgxLjApKSk7XG59XG5cbnZvaWQgbWFpbigpIHtcbiAgICB2ZWMyIHV2X3RvX3N0X3NjYWxlICA9IHVfbWVkaXVtcFswXS54eTtcbiAgICB2ZWMyIHV2X3RvX3N0X29mZnNldCA9IHVfbWVkaXVtcFswXS56dztcbiAgICB2ZWMyIHNjYWxlICAgICAgICAgICA9IHVfbWVkaXVtcFsxXS54eTtcblxuICAgIHZlYzIgc3QgPSB2X2Nvb3JkICogdXZfdG9fc3Rfc2NhbGUgLSB1dl90b19zdF9vZmZzZXQ7XG4gICAgdmVjNCBtYXBfY29sb3IgPSB0ZXh0dXJlKHVfdGV4dHVyZXNbMV0sIHN0KTtcblxuICAgIHZlYzIgb2Zmc2V0ID0gdmVjMigke2F9LCAke299KSAtIDAuNTtcbiAgICB2ZWMyIHV2ID0gdl9jb29yZCArIG9mZnNldCAqIHNjYWxlO1xuICAgICR7c31cblxuICAgIG9fY29sb3IgPSBtaXgodGV4dHVyZSh1X3RleHR1cmVzWzBdLCB2X2Nvb3JkKSwgc291cmNlX2NvbG9yLCBpc0luc2lkZShzdCkpO1xufWB9KSgxPT09bj8zOjIsZSx0LG4pKTtyZXR1cm4gRW4uc2V0KHIsYSksYX0pKGMsbCxiKTsoKGUsdCxuLHIsYSxvLHMsaSxjLGwsdSxoLGIsZCk9Pntjb25zdCBmPWUudGV4dHVyZXM7ZlswXT0wLGZbMV09MTtjb25zdCBtPWUubWVkaXVtcDttWzBdPXIvdCxtWzFdPWEvbixtWzJdPW8vdCxtWzNdPShhLW4tcykvbixtWzRdPWkvcixtWzVdPS1jL2EsMT09PWwmJihtWzhdPXUsbVs5XT1oLG1bMTBdPWIsbVsxMV09ZCl9KShNLGcseCxFLEEscyxpLHUsaCxiLFRuKGQsZiwhMCksUm4oZCxmLCEwKSxNbihkLGYsITApLGYpLEx0KCkscm4oTSk7Y29uc3Qgdz1ULnRleHR1cmU7cmV0dXJuIG0mJnIuYmluZChtKSxMKGUpLEwoUiksZWUoVCwhMSksd30sYXI9KGUsdCxuLGEpPT57Y29uc3Qgbz1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LHM9ZS53aWR0aCxpPWUuaGVpZ2h0O3N3aXRjaChyLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbil7Y2FzZSJub3JtYWwiOmNhc2UibGF5ZXIiOmNhc2UiYWRkIjpjYXNlInNjcmVlbiI6Y2FzZSJhbHBoYSI6Y2FzZSJlcmFzZSI6Y2FzZSJjb3B5Ijp7ci5iaW5kKHIuJG1haW5BdHRhY2htZW50T2JqZWN0KSxyLnNldFRyYW5zZm9ybSgxLDAsMCwxLG4sYSk7Y29uc3Qgbz1obighMCk7KChlLHQsbixhKT0+e2NvbnN0IG89ZS5oaWdocCxzPXIuJG1hdHJpeDtvWzBdPXNbMF0sb1sxXT1zWzFdLG9bMl09c1szXSxvWzNdPXNbNF0sb1s0XT1zWzZdLG9bNV09c1s3XSxvWzZdPW4sb1s3XT1hLG9bOF09eCgpLG9bOV09RSgpO2NvbnN0IGk9ZS5tZWRpdW1wO2lbMF09dFswXSxpWzFdPXRbMV0saVsyXT10WzJdLGlbM109dFszXSxpWzRdPXRbNF0saVs1XT10WzVdLGlbNl09dFs2XSxpWzddPXRbN119KShvLHQscyxpKSxPZShlKSx2bihyLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbikscm4obyl9YnJlYWs7ZGVmYXVsdDp7Y29uc3Qgbz1zbihuLGEscyxpKSxjPWhlKHMsaSwhMSk7ci5iaW5kKGMpLGVuKG8sZSk7Y29uc3QgbD1IdChyLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbik7dW4obCx0WzBdLHRbMV0sdFsyXSx0WzNdLHRbNF0sdFs1XSx0WzZdLHRbN10pLHJuKGwpLHIuYmluZChyLiRtYWluQXR0YWNobWVudE9iamVjdCksci5yZXNldCgpLHIuc2V0VHJhbnNmb3JtKDEsMCwwLDEsbixhKSxsbihjLnRleHR1cmUpLEwobyksZWUoYyl9fW8mJnIuYmluZChvKSxMdCgpfSxvcj1bXSxzcj1lPT57ZS5zaXplJiZlLmNsZWFyKCksb3IucHVzaChlKX0saXI9KGUsdCxuLHIsYT1udWxsKT0+e3QuaGFzKG4pfHx0LnNldChuLG9yLnBvcCgpfHxuZXcgTWFwKTtjb25zdCBvPXQuZ2V0KG4pO2lmKG51bGw9PT1hKXtpZighby5oYXMocikpcmV0dXJuO3JldHVybiBlLmRlc3Ryb3koby5nZXQocikpLG8uZGVsZXRlKHIpLHZvaWQoby5zaXplfHwodC5kZWxldGUobiksc3IobykpKX1vLnNldChyLGEpfTtjb25zdCBjcj1uZXcgY2xhc3N7Y29uc3RydWN0b3IoKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiXyRwb29sIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIl8kc3RvcmUiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiXyR0cmFzaCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkdGltZXJJZCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkcmVtb3ZlQ2FjaGUiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJHJlbW92ZUlkcyIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLHRoaXMuXyRwb29sPVtdLHRoaXMuXyRzdG9yZT1uZXcgTWFwLHRoaXMuXyR0cmFzaD1uZXcgTWFwLHRoaXMuJHRpbWVySWQ9bnVsbCx0aGlzLiRyZW1vdmVJZHM9W10sdGhpcy4kcmVtb3ZlQ2FjaGU9ITF9cmVzZXQoKXsoKGUsdCxuKT0+e24uY2xlYXIoKSxudWxsIT09ZS4kdGltZXJJZCYmY2xlYXJUaW1lb3V0KGUuJHRpbWVySWQpO2Zvcihjb25zdCBuIG9mIHQudmFsdWVzKCkpe2Zvcihjb25zdCB0IG9mIG4udmFsdWVzKCkpdCYmZS5kZXN0cm95KHQpO3NyKG4pfXQuY2xlYXIoKX0pKHRoaXMsdGhpcy5fJHN0b3JlLHRoaXMuXyR0cmFzaCl9ZGVzdHJveShlPW51bGwpeygoZSx0KT0+e2lmKHQmJiJvYmplY3QiPT10eXBlb2YgdCYmImNhbnZhcyJpbiB0KXtjb25zdCBuPXQuY2FudmFzLHI9bi53aWR0aCxhPW4uaGVpZ2h0O3QuY2xlYXJSZWN0KDAsMCxyKzEsYSsxKSxuLndpZHRoPW4uaGVpZ2h0PTEsZS5wdXNoKG4pfX0pKHRoaXMuXyRwb29sLGUpfWdldENhbnZhcygpe3JldHVybiB0aGlzLl8kcG9vbC5wb3AoKXx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIil9cmVtb3ZlKGUsdCl7KChlLHQsbik9PntpZighZS5oYXModCkpcmV0dXJuO2NvbnN0IHI9ZS5nZXQodCk7ci5oYXMobikmJihyLmRlbGV0ZShuKSxyLnNpemV8fChzcihyKSxlLmRlbGV0ZSh0KSkpfSkodGhpcy5fJHN0b3JlLGUsdCl9cmVtb3ZlVGltZXIoZSl7KChlLHQsbixyKT0+e2lmKG4uaGFzKHIpKXJldHVybjtjb25zdCBhPXQuZ2V0KHIpO2EmJihhLnNldCgidHJhc2giLCEwKSxuLnNldChyLGEpLG51bGwhPT1lLiR0aW1lcklkJiZjbGVhclRpbWVvdXQoZS4kdGltZXJJZCksZS4kcmVtb3ZlQ2FjaGU9ITEsZS4kdGltZXJJZD1zZXRUaW1lb3V0KCgpPT57ZS4kcmVtb3ZlQ2FjaGU9ITAsZS4kdGltZXJJZD1udWxsfSwxZTMpKX0pKHRoaXMsdGhpcy5fJHN0b3JlLHRoaXMuXyR0cmFzaCxlKX1yZW1vdmVUaW1lclNjaGVkdWxlZENhY2hlKCl7KChlLHQpPT57aWYodC5zaXplKXtmb3IoY29uc3RbbixyXW9mIHQpci5oYXMoInRyYXNoIikmJihlLnJlbW92ZUJ5SWQobiksZS4kcmVtb3ZlSWRzLnB1c2goK24pKTt0LmNsZWFyKCksZS4kcmVtb3ZlQ2FjaGU9ITF9fSkodGhpcyx0aGlzLl8kdHJhc2gpfXJlbW92ZUJ5SWQoZSl7KChlLHQsbik9PntpZighdC5oYXMobikpcmV0dXJuO2NvbnN0IHI9dC5nZXQobik7Zm9yKGNvbnN0IHQgb2Ygci52YWx1ZXMoKSllLmRlc3Ryb3kodCk7dC5kZWxldGUobiksc3Iocil9KSh0aGlzLHRoaXMuXyRzdG9yZSxlKX1nZXRCeUlkKGUpe3JldHVybiB0aGlzLl8kc3RvcmUuZ2V0KGUpfWdldChlLHQpe3JldHVybigoZSx0LG4pPT57Y29uc3Qgcj1lLmdldCh0KXx8bnVsbDtyZXR1cm4gcj8oci5kZWxldGUoInRyYXNoIiksci5nZXQobil8fG51bGwpOm51bGx9KSh0aGlzLl8kc3RvcmUsZSx0KX1zZXQoZSx0LG49bnVsbCl7aXIodGhpcyx0aGlzLl8kc3RvcmUsZSx0LG4pfWhhcyhlLHQ9IiIpe3JldHVybigoZSx0LG49IiIpPT5uPyEhZS5oYXModCkmJmUuZ2V0KHQpLmhhcyhuKTplLmhhcyh0KSkodGhpcy5fJHN0b3JlLGUsdCl9Z2VuZXJhdGVLZXlzKGUsdCxuKXtyZXR1cm4oKGUsdCxuKT0+e2NvbnN0IHI9WzEwMCplLDEwMCp0XTtuJiZyLnB1c2goMTAwKm4pO2xldCBhPTIxNjYxMzYyNjE7Zm9yKGxldCBlPTA7ZTxyLmxlbmd0aDsrK2Upe2xldCB0PTB8cltlXTtmb3IobGV0IGU9MDtlPDQ7ZSsrKWFePTI1NSZ0LGE9TWF0aC5pbXVsKGEsMTY3Nzc2MTkpLHQ+Pj49OH1yZXR1cm4oYT4+PjApJTE2Nzc3MjE2fSkoZSx0LG4pfWdlbmVyYXRlRmlsdGVyS2V5cyhlLHQsbixyKXtyZXR1cm4oKGUsdCxuLHIpPT5gJHtlfSR7dH0ke259JHtyfWApKGUsdCxuLHIpfX0sbHI9KGUsdCxuLGEsbyxzLGksYyxsLHUsaCk9Pntjb25zdCBiPXIuY3VycmVudEF0dGFjaG1lbnRPYmplY3Q7bGV0IGQ9bnVsbDtjb25zdCBmPU1hdGguc3FydChpWzBdKmlbMF0raVsxXSppWzFdKSxfPU1hdGguc3FydChpWzJdKmlbMl0raVszXSppWzNdKSxwPWNyLmdlbmVyYXRlRmlsdGVyS2V5cyhpWzBdLGlbMV0saVsyXSxpWzNdKTtsZXQgZz0hMTtpZihjci5nZXQodCwiZktleSIpPT09cCl7Y29uc3QgZT1jci5nZXQodCwiZlRleHR1cmUiKTtuP0woZSk6KGc9ITAsZD1lKX1sZXQgeD0wLEU9MDtpZihnKXg9Y3IuZ2V0KHQsIm9mZnNldFgiKSxFPWNyLmdldCh0LCJvZmZzZXRZIik7ZWxzZXtkPUp0KGUpO2NvbnN0IHQ9TWF0aC5hdGFuMihpWzFdLGlbMF0pLG49TWF0aC5hdGFuMigtaVsyXSxpWzNdKSxjPXM/ZipNYXRoLmNvcyh0KTpNYXRoLmNvcyh0KSxsPXM/ZipNYXRoLnNpbih0KTpNYXRoLnNpbih0KSx1PXM/LV8qTWF0aC5zaW4obik6LU1hdGguc2luKG4pLHA9cz9fKk1hdGguY29zKG4pOk1hdGguY29zKG4pLGc9bShjLGwsdSxwLGEvMixvLzIpLEE9bSgxLDAsMCwxLC1lLncvMiwtZS5oLzIpLHk9KChlLHQpPT57Y29uc3Qgbj1lWzBdLHI9ZVsxXSxhPWVbMl0sbz1lWzNdLHM9ZVs0XSxpPWVbNV0sYz10WzBdLGw9dFsxXSx1PXRbMl0saD10WzNdLGI9dFs0XSxkPXRbNV07cmV0dXJuIG0obipjK2EqbCxyKmMrbypsLG4qdSthKmgscip1K28qaCxuKmIrYSpkK3MscipiK28qZCtpKX0pKGcsQSk7aWYodihnKSx2KEEpLDEhPT15WzBdfHwwIT09eVsxXXx8MCE9PXlbMl18fDEhPT15WzNdKXtjb25zdCBlPWhlKGEsbywhMSk7ci5iaW5kKGUpLHIucmVzZXQoKSxyLnNldFRyYW5zZm9ybSh5WzBdLHlbMV0seVsyXSx5WzNdLHlbNF0seVs1XSkseD15WzRdLEU9eVs1XSxPZShkKTtjb25zdCB0PWhuKCk7Ym4odCxkLndpZHRoLGQuaGVpZ2h0KSxybih0KSxMKGQpLGQ9ZS50ZXh0dXJlLGVlKGUsITEpLGImJnIuYmluZChiKX12KHkpLHluLng9MCx5bi55PTA7Zm9yKGxldCBlPTA7aC5sZW5ndGg+ZTspe3N3aXRjaChoW2UrK10pe2Nhc2UgMDpkPUhuKGQsaSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLEJvb2xlYW4oaFtlKytdKSk7YnJlYWs7Y2FzZSAxOmQ9Rm4oZCxpLGhbZSsrXSxoW2UrK10saFtlKytdKTticmVhaztjYXNlIDI6ZD0kbihkLG5ldyBGbG9hdDMyQXJyYXkoW2hbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK11dKSk7YnJlYWs7Y2FzZSAzOntjb25zdCB0PWhbZSsrXSxuPWhbZSsrXSxyPXQqbixhPWguc3ViYXJyYXkoZSxlK3IpO2UrPXIsZD1ucihkLHQsbixhLGhbZSsrXSxoW2UrK10sQm9vbGVhbihoW2UrK10pLEJvb2xlYW4oaFtlKytdKSxoW2UrK10saFtlKytdKX1icmVhaztjYXNlIDQ6e2NvbnN0IHQ9aFtlKytdLG49bmV3IFVpbnQ4QXJyYXkodCk7bi5zZXQoaC5zdWJhcnJheShlLGUrdCkpLGUrPXQsZD1ycihkLGksbixoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdKX1icmVhaztjYXNlIDU6ZD1xbihkLGksaFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxCb29sZWFuKGhbZSsrXSksQm9vbGVhbihoW2UrK10pLEJvb2xlYW4oaFtlKytdKSk7YnJlYWs7Y2FzZSA2OmQ9R24oZCxpLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLEJvb2xlYW4oaFtlKytdKSxCb29sZWFuKGhbZSsrXSkpO2JyZWFrO2Nhc2UgNzp7Y29uc3QgdD1oW2UrK10sbj1oW2UrK107bGV0IHI9aFtlKytdO2NvbnN0IGE9aC5zdWJhcnJheShlLGUrcik7ZSs9cixyPWhbZSsrXTtjb25zdCBvPWguc3ViYXJyYXkoZSxlK3IpO2UrPXIscj1oW2UrK107Y29uc3Qgcz1oLnN1YmFycmF5KGUsZStyKTtlKz1yLGQ9UW4oZCxpLHQsbixhLG8scyxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLEJvb2xlYW4oaFtlKytdKSl9YnJlYWs7Y2FzZSA4Ontjb25zdCB0PWhbZSsrXSxuPWhbZSsrXTtsZXQgcj1oW2UrK107Y29uc3QgYT1oLnN1YmFycmF5KGUsZStyKTtlKz1yLHI9aFtlKytdO2NvbnN0IG89aC5zdWJhcnJheShlLGUrcik7ZSs9cixyPWhbZSsrXTtjb25zdCBzPWguc3ViYXJyYXkoZSxlK3IpO2UrPXIsZD1lcihkLGksdCxuLGEsbyxzLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10sQm9vbGVhbihoW2UrK10pKX19fX1pZihkKXtjb25zdCBlPXkoKSx0PXVbMF0qKGYvZSksbj11WzFdKihfL2UpO3IucmVzZXQoKSxyLnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCksci5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249bCxhcihkLGMsLXgrdCtpWzRdLC1FK24raVs1XSl9Z3x8KGNyLnNldCh0LCJmS2V5IixwKSxjci5zZXQodCwiZlRleHR1cmUiLGQpLGNyLnNldCh0LCJvZmZzZXRYIix4KSxjci5zZXQodCwib2Zmc2V0WSIsRSkpLGImJnIuYmluZChiKX0sdXI9KGUsdCxyLGEpPT57bi5zdGVuY2lsRnVuYyhuLkFMV0FZUywwLDI1NSksbi5zdGVuY2lsT3BTZXBhcmF0ZShuLkZST05ULG4uS0VFUCxuLktFRVAsbi5JTkNSX1dSQVApLG4uc3RlbmNpbE9wU2VwYXJhdGUobi5CQUNLLG4uS0VFUCxuLktFRVAsbi5ERUNSX1dSQVApLG4uY29sb3JNYXNrKCExLCExLCExLCExKTtjb25zdCBvPSEhYSxzPSR0KG8pO2EmJk90KHMsYSksbi5lbmFibGUobi5TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UpLFV0KHMsZSx0LHIpLG4uZGlzYWJsZShuLlNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSksbi5zdGVuY2lsRnVuYyhuLk5PVEVRVUFMLDAsMjU1KSxuLnN0ZW5jaWxPcChuLktFRVAsbi5aRVJPLG4uWkVSTyksbi5jb2xvck1hc2soITAsITAsITAsITApO2NvbnN0IGk9KGU9Pntjb25zdCB0PSJzIisoZT8ieSI6Im4iKTtpZih3dC5oYXModCkpcmV0dXJuIHd0LmdldCh0KTtjb25zdCBuPW5ldyBNdChGdChlPzk6MCwhMSwhMSxlKSwiI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxuaW4gdmVjNCB2X2NvbG9yO1xub3V0IHZlYzQgb19jb2xvcjtcblxudm9pZCBtYWluKCkge1xuICAgIG9fY29sb3IgPSB2ZWM0KHZfY29sb3IucmdiICogdl9jb2xvci5hLCB2X2NvbG9yLmEpO1xufSIpO3JldHVybiB3dC5zZXQodCxuKSxufSkobyk7YSYmKChlLHQpPT57Y29uc3Qgbj1lLmhpZ2hwO25bMF09dFswXSxuWzFdPXRbMV0sblsyXT0wLG5bNF09dFsyXSxuWzVdPXRbM10sbls2XT0wLG5bOF09dFs0XSxuWzldPXRbNV0sblsxMF09MSxuWzEyXT10WzZdLG5bMTNdPXRbN10sblsxNF09MCxuWzE2XT10WzhdLG5bMTddPXRbOV0sblsxOF09MCxuWzIwXT10WzEwXSxuWzIxXT10WzExXSxuWzIyXT0xLG5bM109eCgpLG5bN109RSgpLG5bMTFdPXRbMTJdLG5bMTVdPXRbMTNdLG5bMTldPXRbMTRdLG5bMjNdPXRbMTVdLG5bMjRdPXRbMTZdLG5bMjVdPXRbMTddLG5bMjZdPXRbMThdLG5bMjddPXRbMTldLG5bMjhdPXRbMjBdLG5bMjldPXRbMjFdLG5bMzBdPXRbMjJdLG5bMzFdPXRbMjNdLG5bMzJdPXRbMjRdLG5bMzNdPXRbMjVdfSkoaSxhKSxVdChpLGUsdCxyKX0saHI9KGUsdCxuLHIsYSk9Pntjb25zdCBvPWUubWVkaXVtcDtsZXQgcz0wO2ZvcihsZXQgZT1uO2U8cjsrK2Upe2NvbnN0IG49NSplO29bcysrXT1hW3RbbisxXV0sb1tzKytdPWFbdFtuKzJdXSxvW3MrK109YVt0W24rM11dLG9bcysrXT1hW3Rbbis0XV19Zm9yKGxldCBlPW47ZTxyOysrZSlvW3MrK109dFs1KmVdfSxicj0oZSx0KT0+e2NvbnN0IGE9ci5jdXJyZW50QXR0YWNobWVudE9iamVjdCxvPW4uZ2V0UGFyYW1ldGVyKG4uU0NJU1NPUl9CT1gpO24uZGlzYWJsZShuLlNDSVNTT1JfVEVTVCk7Y29uc3Qgcz1EbigpO3IuYmluZChzKTtjb25zdCBpPTA9PT10LGM9ZS5sZW5ndGgvNSxsPWk/em46Vm47Y24oKTtjb25zdCB1PVhuKCk7Zm9yKGxldCB0PTA7dDxjO3QrPXUtMSl7Y29uc3Qgbj1NYXRoLm1pbih0K3UsYykscj1QbihuLXQsaSk7aHIocixlLHQsbixsKSxVbihyLGVbMF0sZVtlLmxlbmd0aC01XSl9cmV0dXJuIEx0KCksYSYmci5iaW5kKGEpLE5lKG9bMF0sb1sxXSxvWzJdLG9bM10pLHMudGV4dHVyZX0sZHI9bmV3IE1hcCxmcj0oZSx0LG4scik9Pntjb25zdCBhPSgoZSx0LG4scik9PmAke2U/InkiOiJuIn0ke3Q/InkiOiJuIn0ke3QmJm4/InkiOiJuIn0ke3J9YCkocixlLHQsbik7aWYoZHIuaGFzKGEpKXJldHVybiBkci5nZXQoYSk7Y29uc3Qgbz0xKyhyPzE0OjUpLHM9by0xLGk9bmV3IE10KEZ0KG8sITAsITEsciksKChlLHQsbixyLGEpPT57Y29uc3Qgbz1uPygoZSx0KT0+e2NvbnN0IG49dD8oZT0+YFxuICAgIHZlYzIgZm9jYWwgPSB2ZWMyKHVfaGlnaHBbJHtlfV1bMV0sIDAuMCk7XG5cbiAgICB2ZWMyIGRpciA9IG5vcm1hbGl6ZShjb29yZCAtIGZvY2FsKTtcblxuICAgIGZsb2F0IGEgPSBkb3QoZGlyLCBkaXIpO1xuICAgIGZsb2F0IGIgPSAyLjAgKiBkb3QoZGlyLCBmb2NhbCk7XG4gICAgZmxvYXQgYyA9IGRvdChmb2NhbCwgZm9jYWwpIC0gMS4wO1xuICAgIGZsb2F0IHggPSAoLWIgKyBzcXJ0KGIgKiBiIC0gNC4wICogYSAqIGMpKSAvICgyLjAgKiBhKTtcblxuICAgIGZsb2F0IHQgPSBkaXN0YW5jZShmb2NhbCwgY29vcmQpIC8gZGlzdGFuY2UoZm9jYWwsIGZvY2FsICsgZGlyICogeCk7YCkoZSk6ImZsb2F0IHQgPSBsZW5ndGgoY29vcmQpOyI7cmV0dXJuYFxuICAgIGZsb2F0IHJhZGl1cyA9IHVfaGlnaHBbJHtlfV1bMF07XG4gICAgdmVjMiBjb29yZCA9IHAgLyByYWRpdXM7XG4gICAgJHtufVxuYH0pKHQscik6KGU9PmBcbiAgICB2ZWMyIGEgPSB1X2hpZ2hwWyR7ZX1dLnh5O1xuICAgIHZlYzIgYiA9IHVfaGlnaHBbJHtlfV0uenc7XG5cbiAgICB2ZWMyIGFiID0gYiAtIGE7XG4gICAgdmVjMiBhcCA9IHAgLSBhO1xuXG4gICAgZmxvYXQgdCA9IGRvdChhYiwgYXApIC8gZG90KGFiLCBhYik7YCkodCk7bGV0IHM7c3dpdGNoKGEpe2Nhc2UgMDpzPSIxLjAgLSBhYnMoZnJhY3QodCAqIDAuNSkgKiAyLjAgLSAxLjApIjticmVhaztjYXNlIDE6cz0iZnJhY3QodCkiO2JyZWFrO2RlZmF1bHQ6cz0iY2xhbXAodCwgMC4wLCAxLjApIn1yZXR1cm5gI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gaGlnaHAgZmxvYXQ7XG5cbnVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZTtcbnVuaWZvcm0gdmVjNCB1X2hpZ2hwWyR7ZX1dO1xuICAgIFxuaW4gdmVjMiB2X3V2O1xub3V0IHZlYzQgb19jb2xvcjtcbiAgICBcbnZvaWQgbWFpbigpIHtcbiAgICB2ZWMyIHAgPSB2X3V2O1xuICAgICR7b31cbiAgICB0ID0gJHtzfTtcbiAgICBvX2NvbG9yID0gdGV4dHVyZSh1X3RleHR1cmUsIHZlYzIodCwgMC41KSk7XG59YH0pKG8scyxlLHQsbikpO3JldHVybiBkci5zZXQoYSxpKSxpfSxtcj0oZSx0LG4scixvPTAscz1udWxsLGk9bnVsbCk9Pntjb25zdCBjPWUuaGlnaHA7Y1swXT1uWzBdLGNbMV09blsxXSxjWzJdPW5bMl0sY1s0XT1uWzNdLGNbNV09bls0XSxjWzZdPW5bNV0sY1s4XT1uWzZdLGNbOV09bls3XSxjWzEwXT1uWzhdLGNbMTJdPXJbMF0sY1sxM109clsxXSxjWzE0XT1yWzJdLGNbMTZdPXJbM10sY1sxN109cls0XSxjWzE4XT1yWzVdLGNbMTFdPXJbNl0sY1sxNV09cls3XSxjWzE5XT1yWzhdLGNbM109eCgpLGNbN109RSgpO2xldCBsPTIwO2kmJihjWzIwXT1pWzBdLGNbMjFdPWlbMV0sY1syMl09MCxjWzI0XT1pWzJdLGNbMjVdPWlbM10sY1syNl09MCxjWzI4XT1pWzRdLGNbMjldPWlbNV0sY1szMF09MSxjWzMyXT1pWzZdLGNbMzNdPWlbN10sY1szNF09MCxjWzM2XT1pWzhdLGNbMzddPWlbOV0sY1szOF09MCxjWzQwXT1pWzEwXSxjWzQxXT1pWzExXSxjWzQyXT0xLGNbMzFdPWlbMTJdLGNbMzVdPWlbMTNdLGNbMzldPWlbMTRdLGNbNDNdPWlbMTVdLGNbNDRdPWlbMTZdLGNbNDVdPWlbMTddLGNbNDZdPWlbMThdLGNbNDddPWlbMTldLGNbNDhdPWlbMjBdLGNbNDldPWlbMjFdLGNbNTBdPWlbMjJdLGNbNTFdPWlbMjNdLGNbNTJdPWlbMjRdLGNbNTNdPWlbMjVdLGw9NTYpLDA9PT10PyhjW2wrK109c1swXSxjW2wrK109c1sxXSxjW2wrK109c1syXSxjW2xdPXNbM10pOihjW2wrK109ODE5LjIsY1tsXT1hKG8sLS45NzUsLjk3NSwwKSl9LHZyPShlLHQsYSxvKT0+e2NvbnN0IHM9cWUuc2hpZnQoKSxpPXFlLnNoaWZ0KCksYz1xZS5zaGlmdCgpLGw9cWUuc2hpZnQoKTtuLmRpc2FibGUobi5TVEVOQ0lMX1RFU1QpO2NvbnN0IGI9YnIocyxsKTtPZShiKSxuLmVuYWJsZShuLlNURU5DSUxfVEVTVCksbi5mcm9udEZhY2Uobi5DQ1cpLG4uc3RlbmNpbE1hc2soMjU1KSxuLnN0ZW5jaWxGdW5jKG4uQUxXQVlTLDAsMjU1KSxuLnN0ZW5jaWxPcFNlcGFyYXRlKG4uRlJPTlQsbi5LRUVQLG4uS0VFUCxuLklOQ1JfV1JBUCksbi5zdGVuY2lsT3BTZXBhcmF0ZShuLkJBQ0ssbi5LRUVQLG4uS0VFUCxuLkRFQ1JfV1JBUCksbi5jb2xvck1hc2soITEsITEsITEsITEpO2NvbnN0IGQ9ISFvLGY9JHQoZCk7byYmT3QoZixvKSxuLmVuYWJsZShuLlNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSksVXQoZixlLHQsYSksbi5kaXNhYmxlKG4uU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFKSxuLnN0ZW5jaWxGdW5jKG4uTk9URVFVQUwsMCwyNTUpLG4uc3RlbmNpbE9wKG4uS0VFUCxuLlpFUk8sbi5aRVJPKSxuLmNvbG9yTWFzayghMCwhMCwhMCwhMCk7Y29uc3QgbT1mcighMSwhMSxjLGQpLHA9KGU9Pntjb25zdCB0PS04MTkuMiplWzBdLTgxOS4yKmVbMl0rZVs0XSxuPTgxOS4yKmVbMF0tODE5LjIqZVsyXStlWzRdLHI9LTgxOS4yKmVbMF0rODE5LjIqZVsyXStlWzRdLGE9LTgxOS4yKmVbMV0tODE5LjIqZVszXStlWzVdLG89ODE5LjIqZVsxXS04MTkuMiplWzNdK2VbNV07bGV0IHM9ci10LGk9LTgxOS4yKmVbMV0rODE5LjIqZVszXStlWzVdLWE7Y29uc3QgYz1NYXRoLnNxcnQocypzK2kqaSk7Yz8ocy89YyxpLz1jKToocz0wLGk9MCk7Y29uc3QgbD0obi10KSpzKyhvLWEpKmk7cmV0dXJuIHUodCtsKnMsYStsKmksbixvKX0pKGkpLGc9XyhyLiRtYXRyaXgpO21yKG0sMCxyLiRtYXRyaXgsZywwLHAsbyksaChwKSx2KGcpLFV0KG0sZSx0LGEpfSxfcj0oZSx0LGEsbyk9Pntjb25zdCBzPXFlLnNoaWZ0KCksaT1xZS5zaGlmdCgpLGM9cWUuc2hpZnQoKSxsPXFlLnNoaWZ0KCksdT1xZS5zaGlmdCgpO24uZGlzYWJsZShuLlNURU5DSUxfVEVTVCk7Y29uc3QgaD1icihzLGwpO09lKGgpLG4uZW5hYmxlKG4uU1RFTkNJTF9URVNUKSxuLmZyb250RmFjZShuLkNDVyksbi5zdGVuY2lsTWFzaygyNTUpLG4uc3RlbmNpbEZ1bmMobi5BTFdBWVMsMCwyNTUpLG4uc3RlbmNpbE9wU2VwYXJhdGUobi5GUk9OVCxuLktFRVAsbi5LRUVQLG4uSU5DUl9XUkFQKSxuLnN0ZW5jaWxPcFNlcGFyYXRlKG4uQkFDSyxuLktFRVAsbi5LRUVQLG4uREVDUl9XUkFQKSxuLmNvbG9yTWFzayghMSwhMSwhMSwhMSk7Y29uc3QgYj0hIW8sZD0kdChiKTtvJiZPdChkLG8pLG4uZW5hYmxlKG4uU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFKSxVdChkLGUsdCxhKSxuLmRpc2FibGUobi5TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UpLG4uc3RlbmNpbEZ1bmMobi5OT1RFUVVBTCwwLDI1NSksbi5zdGVuY2lsT3Aobi5LRUVQLG4uWkVSTyxuLlpFUk8pLG4uY29sb3JNYXNrKCEwLCEwLCEwLCEwKSxyLnNhdmUoKSxyLnRyYW5zZm9ybShpWzBdLGlbMV0saVsyXSxpWzNdLGlbNF0saVs1XSk7Y29uc3QgZj1yLiRzdGFja1tyLiRzdGFjay5sZW5ndGgtMV0sbT1fKHIuJG1hdHJpeCkscD1mcighMCxCb29sZWFuKHUpLGMsYik7bXIocCwxLGYsbSx1LG8pLHIucmVzdG9yZSgpLHYobSksVXQocCxlLHQsYSl9LHByPW5ldyBNYXAsZ3I9KGUsdCxhLG8pPT57bi5zdGVuY2lsRnVuYyhuLkFMV0FZUywwLDI1NSksbi5zdGVuY2lsT3BTZXBhcmF0ZShuLkZST05ULG4uS0VFUCxuLktFRVAsbi5JTkNSX1dSQVApLG4uc3RlbmNpbE9wU2VwYXJhdGUobi5CQUNLLG4uS0VFUCxuLktFRVAsbi5ERUNSX1dSQVApLG4uY29sb3JNYXNrKCExLCExLCExLCExKTtjb25zdCBzPSEhbyxpPSR0KHMpO28mJk90KGksbyksbi5lbmFibGUobi5TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UpLFV0KGksZSx0LGEpLG4uZGlzYWJsZShuLlNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSk7Y29uc3QgYz14bi5zaGlmdCgpLGw9eG4uc2hpZnQoKSx1PXhuLnNoaWZ0KCksaD14bi5zaGlmdCgpLGI9eG4uc2hpZnQoKSxkPXhuLnNoaWZ0KCksZj1wbih1LGgsYyxkKTtyLnNhdmUoKSxyLnRyYW5zZm9ybShsWzBdLGxbMV0sbFsyXSxsWzNdLGxbNF0sbFs1XSksbi5zdGVuY2lsRnVuYyhuLk5PVEVRVUFMLDAsMjU1KSxuLnN0ZW5jaWxPcChuLktFRVAsbi5aRVJPLG4uWkVSTyksbi5jb2xvck1hc2soITAsITAsITAsITApO2NvbnN0IG09KChlLHQpPT57Y29uc3Qgbj1gYiR7ZT8ieSI6Im4ifSR7dD8ieSI6Im4ifWA7aWYocHIuaGFzKG4pKXJldHVybiBwci5nZXQobik7Y29uc3Qgcj1lPyIjdmVyc2lvbiAzMDAgZXNcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXG51bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmU7XG51bmlmb3JtIHZlYzQgdV9tZWRpdW1wWzFdO1xuXG5pbiB2ZWMyIHZfdXY7XG5vdXQgdmVjNCBvX2NvbG9yO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdmVjMiB1diA9IGZyYWN0KHZlYzIodl91di54LCAtdl91di55KSAvIHVfbWVkaXVtcFswXS54eSk7XG4gICAgXG4gICAgdmVjNCBzcmMgPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdXYpO1xuICAgIG9fY29sb3IgPSBzcmM7XG59IjoiI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxudW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlO1xudW5pZm9ybSB2ZWM0IHVfbWVkaXVtcFsxXTtcblxuaW4gdmVjMiB2X3V2O1xub3V0IHZlYzQgb19jb2xvcjtcblxudm9pZCBtYWluKCkge1xuICAgIHZlYzIgdXYgPSB2ZWMyKHZfdXYueCwgdV9tZWRpdW1wWzBdLnkgLSB2X3V2LnkpIC8gdV9tZWRpdW1wWzBdLnh5O1xuXG4gICAgdmVjNCBzcmMgPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdXYpO1xuICAgIG9fY29sb3IgPSBzcmM7XG59IixhPW5ldyBNdChGdCh0PzE0OjUsITAsITEsdCkscik7cmV0dXJuIHByLnNldChuLGEpLGF9KShiLHMpOygoZSx0LG4sYSk9Pntjb25zdCBvPWUuaGlnaHAscz1yLiRzdGFja1tyLiRzdGFjay5sZW5ndGgtMV07b1swXT1zWzBdLG9bMV09c1sxXSxvWzJdPXNbMl0sb1s0XT1zWzNdLG9bNV09c1s0XSxvWzZdPXNbNV0sb1s4XT1zWzZdLG9bOV09c1s3XSxvWzEwXT1zWzhdO2NvbnN0IGk9XyhyLiRtYXRyaXgpO29bMTJdPWlbMF0sb1sxM109aVsxXSxvWzE0XT1pWzJdLG9bMTZdPWlbM10sb1sxN109aVs0XSxvWzE4XT1pWzVdLG9bMTFdPWlbNl0sb1sxNV09aVs3XSxvWzE5XT1pWzhdLG9bM109eCgpLG9bN109RSgpLGEmJihvWzIwXT1hWzBdLG9bMjFdPWFbMV0sb1syMl09MCxvWzI0XT1hWzJdLG9bMjVdPWFbM10sb1syNl09MCxvWzI4XT1hWzRdLG9bMjldPWFbNV0sb1szMF09MSxvWzMyXT1hWzZdLG9bMzNdPWFbN10sb1szNF09MCxvWzM2XT1hWzhdLG9bMzddPWFbOV0sb1szOF09MCxvWzQwXT1hWzEwXSxvWzQxXT1hWzExXSxvWzQyXT0xLG9bMzFdPWFbMTJdLG9bMzVdPWFbMTNdLG9bMzldPWFbMTRdLG9bNDNdPWFbMTVdLG9bNDRdPWFbMTZdLG9bNDVdPWFbMTddLG9bNDZdPWFbMThdLG9bNDddPWFbMTldLG9bNDhdPWFbMjBdLG9bNDldPWFbMjFdLG9bNTBdPWFbMjJdLG9bNTFdPWFbMjNdLG9bNTJdPWFbMjRdLG9bNTNdPWFbMjVdKTtjb25zdCBjPWUubWVkaXVtcDtjWzBdPXQsY1sxXT1ufSkobSx1LGgsbyksVXQobSxlLHQsYSksci5yZXN0b3JlKCksTChmKX07bGV0IHhyPTA7Y29uc3QgRXI9bmV3IEZsb2F0MzJBcnJheSgyNTYpO2ZvcihsZXQgZT0xO2U8MjU2O2UrKylFcltlXT0yNTUvZTtjb25zdCBBcj1hc3luYyhlLHQpPT57Y29uc3QgYT1vbigwLDAsZSx0KTtPZShhKSxuLmJpbmRGcmFtZWJ1ZmZlcihuLkZSQU1FQlVGRkVSLFopLG4uZnJhbWVidWZmZXJUZXh0dXJlMkQobi5GUkFNRUJVRkZFUixuLkNPTE9SX0FUVEFDSE1FTlQwLG4uVEVYVFVSRV8yRCxhLnJlc291cmNlLDApO2NvbnN0IG89bmV3IFVpbnQ4QXJyYXkoZSp0KjQpLHM9ci4kbWFpbkF0dGFjaG1lbnRPYmplY3Q7by5ieXRlTGVuZ3RoPnhyJiYoeHI9YyhvLmJ5dGVMZW5ndGgpLG4uYnVmZmVyRGF0YShuLlBJWEVMX1BBQ0tfQlVGRkVSLHhyLG4uU1RSRUFNX1JFQUQpKSxuLnJlYWRQaXhlbHMoMCxzLmhlaWdodC10LGUsdCxuLlJHQkEsbi5VTlNJR05FRF9CWVRFLDApO2NvbnN0IGk9bi5mZW5jZVN5bmMobi5TWU5DX0dQVV9DT01NQU5EU19DT01QTEVURSwwKTthd2FpdCBuZXcgUHJvbWlzZShlPT57Y29uc3QgdD0oKT0+e2lmKG4uY2xpZW50V2FpdFN5bmMoaSxuLlNZTkNfRkxVU0hfQ09NTUFORFNfQklULDApIT09bi5USU1FT1VUX0VYUElSRUQpcmV0dXJuIG4uZGVsZXRlU3luYyhpKSxuLmdldEJ1ZmZlclN1YkRhdGEobi5QSVhFTF9QQUNLX0JVRkZFUiwwLG8pLGUoKTtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUodCl9O3QoKX0pLG4uYmluZEZyYW1lYnVmZmVyKG4uRlJBTUVCVUZGRVIsRCk7Zm9yKGxldCBlPTA7ZTxvLmxlbmd0aDtlKz00KXtjb25zdCB0PW9bZSszXTtpZigwPT09dHx8MjU1PT09dCljb250aW51ZTtjb25zdCBuPUVyW3RdO29bZV09TWF0aC5taW4oMjU1LE1hdGgucm91bmQob1tlXSpuKSksb1tlKzFdPU1hdGgubWluKDI1NSxNYXRoLnJvdW5kKG9bZSsxXSpuKSksb1tlKzJdPU1hdGgubWluKDI1NSxNYXRoLnJvdW5kKG9bZSsyXSpuKSl9cmV0dXJuIGF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKG5ldyBJbWFnZURhdGEobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KG8pLGUsdCkse2ltYWdlT3JpZW50YXRpb246ImZsaXBZIixwcmVtdWx0aXBseUFscGhhOiJub25lIixjb2xvclNwYWNlQ29udmVyc2lvbjoibm9uZSJ9KX07Y2xhc3MgeXJ7Y29uc3RydWN0b3IoYSxvLGk9MSl7dmFyIGM7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRzdGFjayIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkbWF0cml4Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRjbGVhckNvbG9yUiIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkY2xlYXJDb2xvckciLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJGNsZWFyQ29sb3JCIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRjbGVhckNvbG9yQSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkbWFpbkF0dGFjaG1lbnRPYmplY3QiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJHN0YWNrQXR0YWNobWVudE9iamVjdCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJnbG9iYWxBbHBoYSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJnbG9iYWxDb21wb3NpdGVPcGVyYXRpb24iLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaW1hZ2VTbW9vdGhpbmdFbmFibGVkIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRmaWxsU3R5bGUiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJHN0cm9rZVN0eWxlIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIm1hc2tCb3VuZHMiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywidGhpY2tuZXNzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImNhcHMiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiam9pbnRzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIm1pdGVyTGltaXQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSwoZT0+e249ZX0pKGEpLGM9YS5nZXRQYXJhbWV0ZXIoYS5NQVhfVEVYVFVSRV9TSVpFKSxlPU1hdGgubWluKDQwOTYsYy8yKSwoZT0+e3Q9ZX0pKG8pLChlPT57QT1lfSkoaSksdGhpcy4kc3RhY2s9cygpLHRoaXMuJHN0YWNrQXR0YWNobWVudE9iamVjdD1zKCksdGhpcy4kbWF0cml4PWQoMSwwLDAsMCwxLDAsMCwwLDEpLHRoaXMuJGNsZWFyQ29sb3JSPTAsdGhpcy4kY2xlYXJDb2xvckc9MCx0aGlzLiRjbGVhckNvbG9yQj0wLHRoaXMuJGNsZWFyQ29sb3JBPTAsdGhpcy50aGlja25lc3M9MSx0aGlzLmNhcHM9MSx0aGlzLmpvaW50cz0yLHRoaXMubWl0ZXJMaW1pdD0wLHRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0PW51bGwsdGhpcy5nbG9iYWxBbHBoYT0xLHRoaXMuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJub3JtYWwiLHRoaXMuaW1hZ2VTbW9vdGhpbmdFbmFibGVkPSExLHRoaXMuJGZpbGxTdHlsZT1uZXcgRmxvYXQzMkFycmF5KFsxLDEsMSwxXSksdGhpcy4kc3Ryb2tlU3R5bGU9bmV3IEZsb2F0MzJBcnJheShbMSwxLDEsMV0pLHRoaXMubWFza0JvdW5kcz17eE1pbjowLHlNaW46MCx4TWF4OjAseU1heDowfSxhLnBpeGVsU3RvcmVpKGEuVU5QQUNLX0FMSUdOTUVOVCwxKSxhLnBpeGVsU3RvcmVpKGEuVU5QQUNLX0ZMSVBfWV9XRUJHTCwhMCksKGU9PntEPWUuY3JlYXRlRnJhbWVidWZmZXIoKX0pKGEpLChlPT57aj1lLmNyZWF0ZUZyYW1lYnVmZmVyKCl9KShhKSwoKGUsdCk9PntYPWUuY3JlYXRlRnJhbWVidWZmZXIoKSxlLmJpbmRGcmFtZWJ1ZmZlcihlLkZSQU1FQlVGRkVSLFgpLGUuZnJhbWVidWZmZXJUZXh0dXJlMkQoZS5GUkFNRUJVRkZFUixlLkNPTE9SX0FUVEFDSE1FTlQwLGUuVEVYVFVSRV8yRCx0LnJlc291cmNlLDApLGUuYmluZEZyYW1lYnVmZmVyKGUuRlJBTUVCVUZGRVIsbnVsbCksZS5iaW5kRnJhbWVidWZmZXIoZS5EUkFXX0ZSQU1FQlVGRkVSLFgpfSkoYSxnZSgpKSwoZT0+e0g9ZS5jcmVhdGVGcmFtZWJ1ZmZlcigpLEs9ZS5jcmVhdGVGcmFtZWJ1ZmZlcigpLFo9ZS5jcmVhdGVGcmFtZWJ1ZmZlcigpLFE9ZS5jcmVhdGVCdWZmZXIoKSxlLmJpbmRCdWZmZXIoZS5QSVhFTF9QQUNLX0JVRkZFUixRKX0pKGEpLF9uKGEpLG4uZW5hYmxlKG4uQkxFTkQpLEx0KCksKGU9Pntqbj1NYXRoLmZsb29yKC43NSplLmdldFBhcmFtZXRlcihlLk1BWF9GUkFHTUVOVF9VTklGT1JNX1ZFQ1RPUlMpKX0pKGEpLHI9dGhpc31jbGVhclRyYW5zZmVyQm91bmRzKCl7KCgpPT57Zm9yKGxldCBlPTA7ZTx4ZS5sZW5ndGg7KytlKXtjb25zdCB0PXhlW2VdO3QmJih0WzBdPXRbMV09TnVtYmVyLk1BWF9WQUxVRSx0WzJdPXRbM109LU51bWJlci5NQVhfVkFMVUUpfWZvcihsZXQgZT0wO2U8QWUubGVuZ3RoOysrZSl7Y29uc3QgdD1BZVtlXTt0JiYodFswXT10WzFdPU51bWJlci5NQVhfVkFMVUUsdFsyXT10WzNdPS1OdW1iZXIuTUFYX1ZBTFVFKX19KSgpfXVwZGF0ZUJhY2tncm91bmRDb2xvcihlLHQsbixyKXsoKGUsdCxuLHIsbyk9PntlLiRjbGVhckNvbG9yUj1hKHQsMCwxLDApLGUuJGNsZWFyQ29sb3JHPWEobiwwLDEsMCksZS4kY2xlYXJDb2xvckI9YShyLDAsMSwwKSxlLiRjbGVhckNvbG9yQT1hKG8sMCwxLDApfSkodGhpcyxlLHQsbixyKX1maWxsQmFja2dyb3VuZENvbG9yKCl7dmFyIGUsdCxyLGE7ZT10aGlzLiRjbGVhckNvbG9yUix0PXRoaXMuJGNsZWFyQ29sb3JHLHI9dGhpcy4kY2xlYXJDb2xvckIsYT10aGlzLiRjbGVhckNvbG9yQSxuLmNsZWFyQ29sb3IoZSx0LHIsYSksbi5jbGVhcihuLkNPTE9SX0JVRkZFUl9CSVR8bi5TVEVOQ0lMX0JVRkZFUl9CSVQpLG4uY2xlYXJDb2xvcigwLDAsMCwwKX1yZXNpemUoZSx0LG49ITApe0ZlKHRoaXMsZSx0LG4pfWNsZWFyUmVjdChlLHQscixhKXsoKGUsdCxyLGEpPT57bi5lbmFibGUobi5TQ0lTU09SX1RFU1QpLG4uc2Npc3NvcihlLHQscixhKSxuLmNsZWFyKG4uQ09MT1JfQlVGRkVSX0JJVHxuLlNURU5DSUxfQlVGRkVSX0JJVCksbi5kaXNhYmxlKG4uU0NJU1NPUl9URVNUKX0pKGUsdCxyLGEpfWJpbmQoZSl7TGUodGhpcyxlKX1zYXZlKCl7dmFyIGU7KGU9dGhpcykuJHN0YWNrLnB1c2goZCguLi5lLiRtYXRyaXgpKX1yZXN0b3JlKCl7VWUodGhpcyl9c2V0VHJhbnNmb3JtKGUsdCxuLHIsYSxvKXsoKGUsdCxuLHIsYSxvLHMpPT57ZVswXT10LGVbMV09bixlWzNdPXIsZVs0XT1hLGVbNl09byxlWzddPXN9KSh0aGlzLiRtYXRyaXgsZSx0LG4scixhLG8pfXRyYW5zZm9ybShlLHQsbixyLGEsbyl7KChlLHQsbixyLGEsbyxzKT0+e2NvbnN0IGk9ZS4kbWF0cml4WzBdLGM9ZS4kbWF0cml4WzFdLGw9ZS4kbWF0cml4WzNdLHU9ZS4kbWF0cml4WzRdLGg9ZS4kbWF0cml4WzZdLGI9ZS4kbWF0cml4WzddO2UuJG1hdHJpeFswXT10KmkrbipsLGUuJG1hdHJpeFsxXT10KmMrbip1LGUuJG1hdHJpeFszXT1yKmkrYSpsLGUuJG1hdHJpeFs0XT1yKmMrYSp1LGUuJG1hdHJpeFs2XT1vKmkrcypsK2gsZS4kbWF0cml4WzddPW8qYytzKnUrYn0pKHRoaXMsZSx0LG4scixhLG8pfXJlc2V0KCl7dmFyIGU7KGU9dGhpcykuZ2xvYmFsQWxwaGE9MSxlLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0ibm9ybWFsIixlLmltYWdlU21vb3RoaW5nRW5hYmxlZD0hMX1iZWdpblBhdGgoKXt2YXIgZTsoZT10aGlzKS4kZmlsbFN0eWxlLmZpbGwoMSksZS4kc3Ryb2tlU3R5bGUuZmlsbCgxKSwoKCk9Pntmb3IoVC5sZW5ndGg9MDtSLmxlbmd0aDspaShSLnBvcCgpKX0pKCl9bW92ZVRvKGUsdCl7JChlLHQpfWxpbmVUbyhlLHQpeygoZSx0KT0+e1QubGVuZ3RofHwkKGUsdCksRihlLHQpfHx3KGUsdCwhMSl9KShlLHQpfXF1YWRyYXRpY0N1cnZlVG8oZSx0LG4scil7TyhlLHQsbixyKX1maWxsU3R5bGUoZSx0LG4scil7dGhpcy4kZmlsbFN0eWxlWzBdPWUsdGhpcy4kZmlsbFN0eWxlWzFdPXQsdGhpcy4kZmlsbFN0eWxlWzJdPW4sdGhpcy4kZmlsbFN0eWxlWzNdPXJ9c3Ryb2tlU3R5bGUoZSx0LG4scil7dGhpcy4kc3Ryb2tlU3R5bGVbMF09ZSx0aGlzLiRzdHJva2VTdHlsZVsxXT10LHRoaXMuJHN0cm9rZVN0eWxlWzJdPW4sdGhpcy4kc3Ryb2tlU3R5bGVbM109cn1jbG9zZVBhdGgoKXsoKCk9PntpZihULmxlbmd0aDw3KXJldHVybjtjb25zdCBlPStUWzBdLHQ9K1RbMV07RihlLHQpfHx3KGUsdCwhMSl9KSgpfWFyYyhlLHQsbil7KChlLHQsbik9Pntjb25zdCByPW4sYT0uNTUyMjg0NzQ5ODMwNzkzNipuO1AoZStyLHQrYSxlK2EsdCtyLGUsdCtyKSxQKGUtYSx0K3IsZS1yLHQrYSxlLXIsdCksUChlLXIsdC1hLGUtYSx0LXIsZSx0LXIpLFAoZSthLHQtcixlK3IsdC1hLGUrcix0KX0pKGUsdCxuKX1iZXppZXJDdXJ2ZVRvKGUsdCxuLHIsYSxvKXtQKGUsdCxuLHIsYSxvKX1maWxsKCl7KGU9Pntjb25zdCB0PU0oKTtpZighdC5sZW5ndGgpcmV0dXJuO0dlLnB1c2goZSk7Y29uc3Qgbj1qZSh0KTtWZShuLmJ1ZmZlciksV2UucHVzaChuLmluZGV4Q291bnQpfSkoImZpbGwiKX1ncmFkaWVudEZpbGwoZSx0LG4scixhLG8peygoZSx0LG4scixhLG8pPT57Y29uc3Qgcz1NKCk7aWYoIXMubGVuZ3RoKXJldHVybjtHZS5wdXNoKDA9PT1lPyJsaW5lYXIiOiJyYWRpYWwiKTtjb25zdCBpPWplKHMpO1ZlKGkuYnVmZmVyKSxXZS5wdXNoKGkuaW5kZXhDb3VudCkscWUucHVzaCh0LG4scixhKSwxPT09ZSYmcWUucHVzaChvKX0pKGUsdCxuLHIsYSxvKX1iaXRtYXBGaWxsKGUsdCxuLHIsYSxvKXsoKGUsdCxuLHIsYSxvKT0+e2NvbnN0IHM9TSgpO2lmKCFzLmxlbmd0aClyZXR1cm47R2UucHVzaCgiYml0bWFwIik7Y29uc3QgaT1qZShzKTtWZShpLmJ1ZmZlciksV2UucHVzaChpLmluZGV4Q291bnQpLHhuLnB1c2goZSx0LG4scixhLG8pfSkoZSx0LG4scixhLG8pfXN0cm9rZSgpeygoKT0+e2NvbnN0IGU9TSghMCk7aWYoIWUubGVuZ3RoKXJldHVybjtHZS5wdXNoKCJmaWxsIik7Y29uc3QgdD11dChlKTtWZSh0LmJ1ZmZlciksV2UucHVzaCh0LmluZGV4Q291bnQpfSkoKX1ncmFkaWVudFN0cm9rZShlLHQsbixyLGEsbyl7KChlLHQsbixyLGEsbyk9Pntjb25zdCBzPU0oKTtpZighcy5sZW5ndGgpcmV0dXJuO0dlLnB1c2goMD09PWU/ImxpbmVhciI6InJhZGlhbCIpO2NvbnN0IGk9dXQocyk7VmUoaS5idWZmZXIpLFdlLnB1c2goaS5pbmRleENvdW50KSxxZS5wdXNoKHQsbixyLGEpLDE9PT1lJiZxZS5wdXNoKG8pfSkoZSx0LG4scixhLG8pfWJpdG1hcFN0cm9rZShlLHQsbixyLGEsbyl7KChlLHQsbixyLGEsbyk9Pntjb25zdCBzPU0oITApO2lmKCFzLmxlbmd0aClyZXR1cm47R2UucHVzaCgiYml0bWFwIik7Y29uc3QgaT11dChzKTtWZShpLmJ1ZmZlciksV2UucHVzaChpLmluZGV4Q291bnQpLHhuLnB1c2goZSx0LG4scixhLG8pfSkoZSx0LG4scixhLG8pfWNsaXAoKXsoKCk9Pntjb25zdCBlPXIuY3VycmVudEF0dGFjaG1lbnRPYmplY3Q7aWYoIWUpcmV0dXJuO2NvbnN0IHQ9QmUuZ2V0KGUuY2xpcExldmVsKSxhPXRbMF0sbz10WzFdLHM9dFsyXSxpPXRbM10sYz1NYXRoLmNlaWwoTWF0aC5hYnMocy1hKSksbD1NYXRoLmNlaWwoTWF0aC5hYnMoaS1vKSk7bi5lbmFibGUobi5TQ0lTU09SX1RFU1QpLG4uc2Npc3NvcihhLGUuaGVpZ2h0LW8tbCxjLGwpO2NvbnN0IHU9QXQoKTtsZXQgaD1JZS5nZXQoZS5jbGlwTGV2ZWwpLGI9MCxkPW51bGw7Y29uc3QgZj1XZS5sZW5ndGg7Zm9yKGxldCB0PTA7dDxmO3QrKyl7bi5zdGVuY2lsTWFzaygxPDxoLTEpO2NvbnN0IHI9V2VbdF07aHQuaGFzKHQpJiYoZD1odC5nZXQodCkpO2NvbnN0IGE9JHQoISFkKTtkJiZPdChhLGQpLFV0KGEsdSxiLHIpLGIrPXIsKytoLGg+NyYmKER0KCksaD1lLmNsaXBMZXZlbCsxKX1JZS5zZXQoZS5jbGlwTGV2ZWwsaCkseXQodSksWWUoKSxidCgpLG4uZGlzYWJsZShuLlNDSVNTT1JfVEVTVCl9KSgpfWdldCBjdXJyZW50QXR0YWNobWVudE9iamVjdCgpe3JldHVybiBXKCl9Z2V0IGF0bGFzQXR0YWNobWVudE9iamVjdCgpe3JldHVybiB2ZSgpfWNyZWF0ZU5vZGUoZSx0KXtyZXR1cm4genQoZSx0KX1yZW1vdmVOb2RlKGUpeyhlPT57Y29uc3QgdD1fZVtlLmluZGV4XTt0JiZ0LmRpc3Bvc2UoZS54LGUueSxlLncsZS5oKX0pKGUpfWJlZ2luTm9kZVJlbmRlcmluZyhlKXsoZT0+e2NvbnN0IHQ9RWUoZS5pbmRleCksbj10WzBdLHI9dFsxXSxhPXRbMl0sbz10WzNdO3RbMF09TWF0aC5taW4oZS54LG4pLHRbMV09TWF0aC5taW4oZS55LHIpLHRbMl09TWF0aC5tYXgoZS54K2UudyxhKSx0WzNdPU1hdGgubWF4KGUueStlLmgsbyl9KShlKSxOZShlLngsZS55LGUudyxlLmgpfWVuZE5vZGVSZW5kZXJpbmcoKXtuLmRpc2FibGUobi5TQ0lTU09SX1RFU1QpfWRyYXdGaWxsKCl7KCgpPT57Y29uc3QgZT1BdCgpO24uZW5hYmxlKG4uU1RFTkNJTF9URVNUKSxuLmZyb250RmFjZShuLkNDVyksbi5zdGVuY2lsTWFzaygyNTUpO2xldCB0PTAscj1udWxsO2ZvcihsZXQgbj0wO248R2UubGVuZ3RoO24rKylzd2l0Y2goaHQuaGFzKG4pJiYocj1odC5nZXQobikpLEdlW25dKXtjYXNlImZpbGwiOntjb25zdCBuPVdlLnNoaWZ0KCk7dXIoZSx0LG4sciksdCs9bn1icmVhaztjYXNlImxpbmVhciI6e2NvbnN0IG49V2Uuc2hpZnQoKTt2cihlLHQsbixyKSx0Kz1ufWJyZWFrO2Nhc2UicmFkaWFsIjp7Y29uc3Qgbj1XZS5zaGlmdCgpO19yKGUsdCxuLHIpLHQrPW59YnJlYWs7Y2FzZSJiaXRtYXAiOntjb25zdCBuPVdlLnNoaWZ0KCk7Z3IoZSx0LG4sciksdCs9bn19bi5kaXNhYmxlKG4uU1RFTkNJTF9URVNUKSx5dChlKSxZZSgpLGJ0KCl9KSgpfWRyYXdEaXNwbGF5T2JqZWN0KHQsbixhLG8scyxpKXsoZT0+e2NvbnN0IHQ9eWUoZS5pbmRleCksbj10WzBdLHI9dFsxXSxhPXRbMl0sbz10WzNdO3RbMF09TWF0aC5taW4oZS54LG4pLHRbMV09TWF0aC5taW4oZS55LHIpLHRbMl09TWF0aC5tYXgoZS54K2UudyxhKSx0WzNdPU1hdGgubWF4KGUueStlLmgsbyl9KSh0KSwoKHQsbixhLG8scyxpKT0+e2NvbnN0IGM9aVswXSxsPWlbMV0sdT1pWzJdLGg9ci5nbG9iYWxBbHBoYSxiPWlbNF0vMjU1LGQ9aVs1XS8yNTUsZj1pWzZdLzI1NSx2PXIuJG1hdHJpeDtzd2l0Y2goci5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24pe2Nhc2Uibm9ybWFsIjpjYXNlImxheWVyIjpjYXNlImFkZCI6Y2FzZSJzY3JlZW4iOmNhc2UiYWxwaGEiOmNhc2UiZXJhc2UiOmNhc2UiY29weSI6e2lmKEN0KCkhPT1yLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbnx8TWUoKSE9PXQuaW5kZXgpe2RlKE1lKCkpO2NvbnN0IGU9ci5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb247ci5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249Q3QoKSxyLmRyYXdBcnJheXNJbnN0YW5jZWQoKSxyLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj1lLGt0KHIuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uKSxSZSh0LmluZGV4KSxkZSh0LmluZGV4KX1jb25zdCBuPUt0KCk7R3QucHVzaCh0LngvZSx0LnkvZSx0LncvZSx0LmgvZSx0LncsdC5oLHgoKSxFKCksdls2XSx2WzddLHZbMF0sdlsxXSx2WzNdLHZbNF0sYyxsLHUsaCxiLGQsZiwwKSxuLmNvdW50Kyt9YnJlYWs7ZGVmYXVsdDp7Y29uc3QgZT1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0O3IuZHJhd0FycmF5c0luc3RhbmNlZCgpO2NvbnN0IGk9TWF0aC5jZWlsKE1hdGguYWJzKG8tbikpLF89TWF0aC5jZWlsKE1hdGguYWJzKHMtYSkpO2xldCBwPTAsZz0wLHg9SnQodCk7aWYoMSE9PXZbMF18fDAhPT12WzFdfHwwIT09dlszXXx8MSE9PXZbNF0pe2NvbnN0IG49aGUoaSxfLCExKSxhPW0odlswXSx2WzFdLHZbM10sdls0XSxpLzIsXy8yKSxvPW0oMSwwLDAsMSwtdC53LzIsLXQuaC8yKSxzPW0oYVswXSpvWzBdK2FbMl0qb1sxXSxhWzFdKm9bMF0rYVszXSpvWzFdLGFbMF0qb1syXSthWzJdKm9bM10sYVsxXSpvWzJdK2FbM10qb1szXSxhWzBdKm9bNF0rYVsyXSpvWzVdK2FbNF0sYVsxXSpvWzRdK2FbM10qb1s1XSthWzVdKTtyLnNhdmUoKSxyLmJpbmQobiksci5zZXRUcmFuc2Zvcm0oc1swXSxzWzFdLHNbMl0sc1szXSxzWzRdLHNbNV0pLHA9c1s0XSxnPXNbNV07Y29uc3QgYz1obigpO2JuKGMseC53aWR0aCx4LmhlaWdodCksT2UoeCwhMCkscm4oYyksTCh4KSx4PW4udGV4dHVyZSxlZShuLCExKSxlJiZyLmJpbmQoZSksci5yZXN0b3JlKCl9KHB8fGcpJiYodls2XS09cCx2WzddLT1nKTtjb25zdCBFPXNuKHZbNl0sdls3XSxpLF8pLEE9aGUoaSxfLCExKTtyLmJpbmQoQSksZW4oRSx4KTtjb25zdCB5PUh0KHIuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uKTt1bih5LGMsbCx1LGgsYixkLGYsMCkscm4oeSksZSYmci5iaW5kKGUpLGxuKEEudGV4dHVyZSksKHB8fGcpJiYodls2XSs9cCx2WzddKz1nKSxMKHgpLEwoRSksZWUoQSksa3Qoci5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24pLFJlKHQuaW5kZXgpLGRlKHQuaW5kZXgpfX19KSh0LG4sYSxvLHMsaSl9ZHJhd0FycmF5c0luc3RhbmNlZCgpeygoKT0+e2NvbnN0IGU9S3QoKTtlLmNvdW50JiYoUXQoKSx2bihyLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiksZm4oZSksZS5jbGVhcigpKX0pKCl9Y2xlYXJBcnJheXNJbnN0YW5jZWQoKXtLdCgpLmNsZWFyKCl9dHJhbnNmZXJNYWluQ2FudmFzKCl7KCgpPT57Y29uc3QgZT1yLiRtYWluQXR0YWNobWVudE9iamVjdDtyLmJpbmQoZSksbi5iaW5kRnJhbWVidWZmZXIobi5SRUFEX0ZSQU1FQlVGRkVSLEQpLG4uYmluZEZyYW1lYnVmZmVyKG4uRFJBV19GUkFNRUJVRkZFUixudWxsKTtjb25zdCB0PWUud2lkdGgsYT1lLmhlaWdodDtuLmJsaXRGcmFtZWJ1ZmZlcigwLDAsdCxhLDAsMCx0LGEsbi5DT0xPUl9CVUZGRVJfQklULG4uTkVBUkVTVCksbi5iaW5kRnJhbWVidWZmZXIobi5EUkFXX0ZSQU1FQlVGRkVSLGopLG4uYmluZEZyYW1lYnVmZmVyKG4uRlJBTUVCVUZGRVIsRCl9KSgpfWRyYXdQaXhlbHMoZSx0KXsoKGUsdCk9Pntjb25zdCBuPXBuKGUudyxlLmgsdCkscj10bigpO25uKHIsZS53LGUuaCksTHQoKSxybihyKSxMKG4pfSkoZSx0KX1kcmF3RWxlbWVudChlLHQpe2duKGUsdCl9YmVnaW5NYXNrKCl7KCgpPT57Y29uc3QgZT1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0O2UmJihlLm1hc2s9ITAsZS5jbGlwTGV2ZWwrKyxJZS5zZXQoZS5jbGlwTGV2ZWwsZS5jbGlwTGV2ZWwpLFBlKCl8fChDZSghMCksbi5lbmFibGUobi5TVEVOQ0lMX1RFU1QpLG4uZW5hYmxlKG4uU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFKSxuLnN0ZW5jaWxGdW5jKG4uQUxXQVlTLDAsMjU1KSxuLnN0ZW5jaWxPcChuLlpFUk8sbi5JTlZFUlQsbi5JTlZFUlQpLG4uY29sb3JNYXNrKCExLCExLCExLCExKSkpfSkoKX1zZXRNYXNrQm91bmRzKGUsdCxhLG8peygoZSx0LGEsbyk9Pntjb25zdCBzPXIuY3VycmVudEF0dGFjaG1lbnRPYmplY3Q7aWYoIXMpcmV0dXJuO0JlLnNldChzLmNsaXBMZXZlbCx1KGUsdCxhLG8pKTtjb25zdCBpPU1hdGguY2VpbChNYXRoLmFicyhhLWUpKSxjPU1hdGguY2VpbChNYXRoLmFicyhvLXQpKTtuLmVuYWJsZShuLlNDSVNTT1JfVEVTVCksbi5zY2lzc29yKGUscy5oZWlnaHQtdC1jLGksYyl9KShlLHQsYSxvKX1lbmRNYXNrKCl7U2UoKX1sZWF2ZU1hc2soKXt0aGlzLmRyYXdBcnJheXNJbnN0YW5jZWQoKSwoKCk9Pntjb25zdCBlPXIuY3VycmVudEF0dGFjaG1lbnRPYmplY3Q7aWYoIWUpcmV0dXJuO2NvbnN0IHQ9ZS5jbGlwTGV2ZWwsYT1CZS5nZXQodCksbz1hWzBdLHM9YVsxXSxpPWFbMl0sYz1hWzNdO0JlLmRlbGV0ZSh0KSxJZS5kZWxldGUodCksaChhKTtjb25zdCBsPU1hdGguY2VpbChNYXRoLmFicyhpLW8pKSx1PU1hdGguY2VpbChNYXRoLmFicyhjLXMpKTtpZihuLmVuYWJsZShuLlNDSVNTT1JfVEVTVCksbi5zY2lzc29yKG8sZS5oZWlnaHQtcy11LGwsdSksLS1lLmNsaXBMZXZlbCwhZS5jbGlwTGV2ZWwpcmV0dXJuIGUubWFzaz0hMSxDZSghMSksbi5jbGVhcihuLlNURU5DSUxfQlVGRkVSX0JJVCksbi5kaXNhYmxlKG4uU1RFTkNJTF9URVNUKSxuLmRpc2FibGUobi5TQ0lTU09SX1RFU1QpLEllLmNsZWFyKCksdm9pZCBCZS5jbGVhcigpO24uc3RlbmNpbE1hc2soMTw8ZS5jbGlwTGV2ZWwpLG4uc3RlbmNpbEZ1bmMobi5BTFdBWVMsMCwyNTUpLG4uc3RlbmNpbE9wKG4uUkVQTEFDRSxuLlJFUExBQ0Usbi5SRVBMQUNFKSxuLmNvbG9yTWFzayghMSwhMSwhMSwhMSksVXQoTnQoKSxFdCgpLDAsNiksU2UoKX0pKCl9dXNlR3JpZChlKXsoZT0+e2h0LnNldChXZS5sZW5ndGgsZSl9KShlKX1hcHBseUZpbHRlcihlLHQsbixyLGEsbyxzLGksYyxsLHUpe3RoaXMuZHJhd0FycmF5c0luc3RhbmNlZCgpLGxyKGUsdCxuLHIsYSxvLHMsaSxjLGwsdSl9YXN5bmMgY3JlYXRlSW1hZ2VCaXRtYXAoZSx0KXtyZXR1cm4gYXdhaXQgQXIoZSx0KX19bGV0IFRyO2xldCBScjtsZXQgTXI9MDtsZXQgd3I9MDtsZXQgRnI9ITE7Y29uc3QgJHI9W10sT3I9KC4uLmUpPT57Y29uc3QgdD0kci5wb3AoKXx8W107cmV0dXJuIGUubGVuZ3RoJiZ0LnB1c2goLi4uZSksdH0sU3I9KGUsdD0xKT0+KHtSOigxNjcxMTY4MCZlKT4+MTYsRzooNjUyODAmZSk+PjgsQjoyNTUmZSxBOjI1NSp0fSksa3I9KGUsdCk9PnsoZT0+e1JyPWV9KShlKTtjb25zdCBuPWUuZ2V0Q29udGV4dCgid2ViZ2wyIix7c3RlbmNpbDohMCxwcmVtdWx0aXBsaWVkQWxwaGE6ITAsYW50aWFsaWFzOiExLGRlcHRoOiExfSk7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJ3ZWJnbDIgaXMgbm90IHN1cHBvcnRlZC4iKTt2YXIgcjtyPW5ldyB5cihuLDQsdCksVHI9cn0sQ3I9KGUsdCxuPSEwKT0+e01yPT09ZSYmd3I9PT10fHwoRnI9ITAsTXI9ZSx3cj10LFRyLnJlc2l6ZShlLHQsbiksbiYmY3IucmVzZXQoKSl9LFByPShlLHQ9ITEpPT57bGV0IG49MDtmb3IoO2UubGVuZ3RoPm47KXN3aXRjaChlW24rK10pe2Nhc2UgOTpUci5iZWdpblBhdGgoKTticmVhaztjYXNlIDA6VHIubW92ZVRvKGVbbisrXSxlW24rK10pO2JyZWFrO2Nhc2UgMjpUci5saW5lVG8oZVtuKytdLGVbbisrXSk7YnJlYWs7Y2FzZSAxOlRyLnF1YWRyYXRpY0N1cnZlVG8oZVtuKytdLGVbbisrXSxlW24rK10sZVtuKytdKTticmVhaztjYXNlIDU6aWYodCl7bis9NDticmVha31Uci5maWxsU3R5bGUoZVtuKytdLzI1NSxlW24rK10vMjU1LGVbbisrXS8yNTUsZVtuKytdLzI1NSk7YnJlYWs7Y2FzZSA3OlRyLmZpbGwoKTticmVhaztjYXNlIDY6aWYodCl7bis9ODticmVha31Uci50aGlja25lc3M9ZVtuKytdLFRyLmNhcHM9ZVtuKytdLFRyLmpvaW50cz1lW24rK10sVHIubWl0ZXJMaW1pdD1lW24rK10sVHIuc3Ryb2tlU3R5bGUoZVtuKytdLzI1NSxlW24rK10vMjU1LGVbbisrXS8yNTUsZVtuKytdLzI1NSk7YnJlYWs7Y2FzZSA4OmlmKHQpYnJlYWs7VHIuc3Ryb2tlKCk7YnJlYWs7Y2FzZSAxMjpUci5jbG9zZVBhdGgoKTticmVhaztjYXNlIDQ6VHIuYXJjKGVbbisrXSxlW24rK10sZVtuKytdKTticmVhaztjYXNlIDM6VHIuYmV6aWVyQ3VydmVUbyhlW24rK10sZVtuKytdLGVbbisrXSxlW24rK10sZVtuKytdLGVbbisrXSk7YnJlYWs7Y2FzZSAxMDp7aWYodCl7bis9MTtjb25zdCB0PWVbbisrXTtuKz01KnQsbis9OSxUci5maWxsKCk7YnJlYWt9Y29uc3Qgcj1lW24rK10sYT1PcigpLG89ZVtuKytdO2ZvcihsZXQgdD0wO3Q8bzsrK3QpYS5wdXNoKGVbbisrXSxlW24rK10sZVtuKytdLGVbbisrXSxlW24rK10pO2NvbnN0IHM9bmV3IEZsb2F0MzJBcnJheShbZVtuKytdLGVbbisrXSxlW24rK10sZVtuKytdLGVbbisrXSxlW24rK11dKSxpPWVbbisrXSxjPWVbbisrXSxsPWVbbisrXTtUci5ncmFkaWVudEZpbGwocixhLHMsaSxjLGwpfWJyZWFrO2Nhc2UgMTM6e2lmKHQpe24rPTI7Y29uc3QgdD1lW24rK107bis9dCxuKz04LFRyLmZpbGwoKTticmVha31jb25zdCByPWVbbisrXSxhPWVbbisrXSxvPWVbbisrXSxzPW5ldyBVaW50OEFycmF5KGUuc3ViYXJyYXkobixuK28pKTtuKz1vO2NvbnN0IGk9bmV3IEZsb2F0MzJBcnJheShbZVtuKytdLGVbbisrXSxlW24rK10sZVtuKytdLGVbbisrXSxlW24rK11dKTtUci5iaXRtYXBGaWxsKHMsaSxyLGEsQm9vbGVhbihlW24rK10pLEJvb2xlYW4oZVtuKytdKSl9YnJlYWs7Y2FzZSAxMTp7aWYodCl7bis9MjAsVHIuZmlsbCgpO2JyZWFrfVRyLnRoaWNrbmVzcz1lW24rK10sVHIuY2Fwcz1lW24rK10sVHIuam9pbnRzPWVbbisrXSxUci5taXRlckxpbWl0PWVbbisrXTtjb25zdCByPWVbbisrXSxhPU9yKCksbz1lW24rK107Zm9yKGxldCB0PTA7dDxvOysrdClhLnB1c2goZVtuKytdLGVbbisrXSxlW24rK10sZVtuKytdLGVbbisrXSk7Y29uc3Qgcz1uZXcgRmxvYXQzMkFycmF5KFtlW24rK10sZVtuKytdLGVbbisrXSxlW24rK10sZVtuKytdLGVbbisrXV0pLGk9ZVtuKytdLGM9ZVtuKytdLGw9ZVtuKytdO1RyLmdyYWRpZW50U3Ryb2tlKHIsYSxzLGksYyxsKX1icmVhaztjYXNlIDE0OntpZih0KXtuKz02O2NvbnN0IHQ9ZVtuKytdO24rPXQsbis9OCxUci5maWxsKCk7YnJlYWt9VHIudGhpY2tuZXNzPWVbbisrXSxUci5jYXBzPWVbbisrXSxUci5qb2ludHM9ZVtuKytdLFRyLm1pdGVyTGltaXQ9ZVtuKytdO2NvbnN0IHI9ZVtuKytdLGE9ZVtuKytdLG89ZVtuKytdLHM9bmV3IFVpbnQ4QXJyYXkoZS5zdWJhcnJheShuLG4rbykpO24rPW87Y29uc3QgaT1uZXcgRmxvYXQzMkFycmF5KFtlW24rK10sZVtuKytdLGVbbisrXSxlW24rK10sZVtuKytdLGVbbisrXV0pO1RyLmJpdG1hcFN0cm9rZShzLGkscixhLEJvb2xlYW4oZVtuKytdKSxCb29sZWFuKGVbbisrXSkpfX19LEJyPWU9Pntzd2l0Y2goZSl7Y2FzZSAwOnJldHVybiJjb3B5IjtjYXNlIDE6cmV0dXJuImFkZCI7Y2FzZSAyOnJldHVybiJhbHBoYSI7Y2FzZSAzOnJldHVybiJkYXJrZW4iO2Nhc2UgNDpyZXR1cm4iZGlmZmVyZW5jZSI7Y2FzZSA1OnJldHVybiJlcmFzZSI7Y2FzZSA2OnJldHVybiJoYXJkbGlnaHQiO2Nhc2UgNzpyZXR1cm4iaW52ZXJ0IjtjYXNlIDg6cmV0dXJuImxheWVyIjtjYXNlIDk6cmV0dXJuImxpZ2h0ZW4iO2Nhc2UgMTA6cmV0dXJuIm11bHRpcGx5IjtjYXNlIDExOmRlZmF1bHQ6cmV0dXJuIm5vcm1hbCI7Y2FzZSAxMjpyZXR1cm4ib3ZlcmxheSI7Y2FzZSAxMzpyZXR1cm4ic2NyZWVuIjtjYXNlIDE0OnJldHVybiJzdWJ0cmFjdCJ9fSxJcj0oZSx0KT0+e2NvbnN0IG49ZS5zdWJhcnJheSh0LHQrNik7dCs9Njtjb25zdCByPWUuc3ViYXJyYXkodCx0KzgpO3QrPTg7Y29uc3QgYT1lLnN1YmFycmF5KHQsdCs0KTt0Kz00O2NvbnN0IG89ZVt0KytdLHM9ZVt0KytdLGk9ZVt0KytdLGM9ZVt0KytdLGw9Qm9vbGVhbihlW3QrK10pLHU9Qm9vbGVhbihlW3QrK10pLGg9Qm9vbGVhbihlW3QrK10pLGI9YCR7ZVt0KytdfWAsZD1lW3QrK10sZj1NYXRoLnNxcnQoblswXSpuWzBdK25bMV0qblsxXSksbT1NYXRoLnNxcnQoblsyXSpuWzJdK25bM10qblszXSk7bGV0IHY7aWYoZVt0KytdKXtpZih2PWNyLmdldChiLGAke2R9YCksIXYpcmV0dXJuIHR9ZWxzZXtjb25zdCBuPWw/bmV3IEZsb2F0MzJBcnJheSgyOCk6bnVsbDtuJiYobi5zZXQoZS5zdWJhcnJheSh0LHQrMjQpKSx0Kz0yNCksVHIudXNlR3JpZChuKTtjb25zdCByPWVbdCsrXSxhPWUuc3ViYXJyYXkodCx0K3IpO2lmKGgmJiFsKXtjb25zdCBlPU1hdGguY2VpbChNYXRoLmFicyhpLW8pKSx0PU1hdGguY2VpbChNYXRoLmFicyhjLXMpKTt2PVRyLmNyZWF0ZU5vZGUoZSx0KSxjci5zZXQoYixgJHtkfWAsdik7Y29uc3Qgbj1Uci5jdXJyZW50QXR0YWNobWVudE9iamVjdDtUci5iaW5kKFRyLmF0bGFzQXR0YWNobWVudE9iamVjdCksVHIucmVzZXQoKSxUci5iZWdpbk5vZGVSZW5kZXJpbmcodik7Y29uc3Qgcj1Uci5hdGxhc0F0dGFjaG1lbnRPYmplY3QuaGVpZ2h0LXYueS10O1RyLnNldFRyYW5zZm9ybSgxLDAsMCwxLHYueCxyKSx1PyhQcihhKSxUci5kcmF3RmlsbCgpKTpUci5kcmF3UGl4ZWxzKHYsbmV3IFVpbnQ4QXJyYXkoYSkpLFRyLmVuZE5vZGVSZW5kZXJpbmcoKSxuJiZUci5iaW5kKG4pfWVsc2V7Y29uc3QgZT1NYXRoLmNlaWwoTWF0aC5hYnMoaS1vKSpmKSx0PU1hdGguY2VpbChNYXRoLmFicyhjLXMpKm0pO3Y9VHIuY3JlYXRlTm9kZShlLHQpLGNyLnNldChiLGAke2R9YCx2KTtjb25zdCByPVRyLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0O1RyLmJpbmQoVHIuYXRsYXNBdHRhY2htZW50T2JqZWN0KSxUci5yZXNldCgpLFRyLmJlZ2luTm9kZVJlbmRlcmluZyh2KTtjb25zdCBsPVRyLmF0bGFzQXR0YWNobWVudE9iamVjdC5oZWlnaHQtdi55LXQ7VHIuc2V0VHJhbnNmb3JtKGYsMCwwLG0sLW8qZit2LngsLXMqbStsKSxuJiYoblsyNF09di54LG5bMjVdPWwpLFByKGEpLFRyLmRyYXdGaWxsKCksVHIuZW5kTm9kZVJlbmRlcmluZygpLHImJlRyLmJpbmQocil9dCs9cn1jb25zdCBfPWVbdCsrXTtpZihCb29sZWFuKGVbdCsrXSkpe2NvbnN0IG89Qm9vbGVhbihlW3QrK10pLHM9ZS5zdWJhcnJheSh0LHQrNCk7dCs9NDtjb25zdCBpPWVbdCsrXSxjPWUuc3ViYXJyYXkodCx0K2kpLGw9TWF0aC5jZWlsKE1hdGguYWJzKGFbMl0tYVswXSkpLHU9TWF0aC5jZWlsKE1hdGguYWJzKGFbM10tYVsxXSkpO3JldHVybiBUci5hcHBseUZpbHRlcih2LGIsbyxsLHUsaCxuLHIsQnIoXykscyxjKSx0Kz1pfWlmKFRyLmdsb2JhbEFscGhhPU1hdGgubWluKE1hdGgubWF4KDAsclszXStyWzddLzI1NSksMSksVHIuaW1hZ2VTbW9vdGhpbmdFbmFibGVkPSEwLFRyLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj1CcihfKSxoJiYhbClUci5zZXRUcmFuc2Zvcm0oblswXSxuWzFdLG5bMl0sblszXSxuWzRdLG5bNV0pLFRyLmRyYXdEaXNwbGF5T2JqZWN0KHYsYVswXSxhWzFdLGFbMl0sYVszXSxyKTtlbHNle2NvbnN0IGU9TWF0aC5hdGFuMihuWzFdLG5bMF0pLHQ9TWF0aC5hdGFuMigtblsyXSxuWzNdKTtpZihlfHx0KXtjb25zdCByPW8qZixhPXMqbSxpPU1hdGguY29zKGUpLGM9TWF0aC5zaW4oZSksbD1NYXRoLmNvcyh0KSx1PU1hdGguc2luKHQpO1RyLnNldFRyYW5zZm9ybShpLGMsLXUsbCxyKmktYSp1K25bNF0scipjK2EqbCtuWzVdKX1lbHNlIFRyLnNldFRyYW5zZm9ybSgxLDAsMCwxLGFbMF0sYVsxXSk7VHIuZHJhd0Rpc3BsYXlPYmplY3QodixhWzBdLGFbMV0sYVsyXSxhWzNdLHIpfXJldHVybiB0fSxMcj0oZSx0KT0+e2NvbnN0IG49ZS5zdWJhcnJheSh0LHQrNik7dCs9NixUci5yZXNldCgpLFRyLnNldFRyYW5zZm9ybShuWzBdLG5bMV0sblsyXSxuWzNdLG5bNF0sbls1XSk7Y29uc3Qgcj1Cb29sZWFuKGVbdCsrXSk/bmV3IEZsb2F0MzJBcnJheSgyOCk6bnVsbDtUci51c2VHcmlkKHIpLHImJihyLnNldChlLnN1YmFycmF5KHQsdCsyNCkpLHQrPTI0KTtjb25zdCBhPWVbdCsrXSxvPWUuc3ViYXJyYXkodCx0K2EpO3JldHVybiBQcihvLCEwKSx0Kz1hLFRyLmNsaXAoKSx0fSxVcj0oZSx0LG4pPT57Y29uc3Qgcj1lLndpZHRoVGFibGVbdC5saW5lXXx8MCxhPXQudGV4dEZvcm1hdCxvPWEubGVmdE1hcmdpbnx8MDtpZighbi53b3JkV3JhcCYmcj5uLnJhd1dpZHRoKXJldHVybiBNYXRoLm1heCgwLG8pO2NvbnN0IHM9YS5yaWdodE1hcmdpbnx8MDtyZXR1cm4iY2VudGVyIj09PWEuYWxpZ258fCJjZW50ZXIiPT09bi5hdXRvU2l6ZT9NYXRoLm1heCgwLG4ucmF3V2lkdGgvMi1vLXMtci8yLTIpOiJyaWdodCI9PT1hLmFsaWdufHwicmlnaHQiPT09bi5hdXRvU2l6ZT9NYXRoLm1heCgwLG4ucmF3V2lkdGgtby1yLXMtNCk6TWF0aC5tYXgoMCxvKX0sTnI9ZT0+e2xldCB0PSIiO3JldHVybiBlLml0YWxpYyYmKHQrPSJpdGFsaWMgIiksZS5ib2xkJiYodCs9ImJvbGQgIiksYCR7dH0ke2Uuc2l6ZX1weCAnJHtlLmZvbnR9Jywnc2Fucy1zZXJpZidgfSxEcj1uZXcgVGV4dERlY29kZXIsanI9KGUsdCk9Pntjb25zdCBuPWUuc3ViYXJyYXkodCx0KzYpO3QrPTY7Y29uc3Qgcj1lLnN1YmFycmF5KHQsdCs4KTt0Kz04O2NvbnN0IGE9ZS5zdWJhcnJheSh0LHQrNCk7dCs9NDtjb25zdCBvPWVbdCsrXSxzPWVbdCsrXSxpPWVbdCsrXSxjPWVbdCsrXSxsPWAke2VbdCsrXX1gLHU9ZVt0KytdLGg9Qm9vbGVhbihlW3QrK10pLGI9TWF0aC5zcXJ0KG5bMF0qblswXStuWzFdKm5bMV0pLGQ9TWF0aC5zcXJ0KG5bMl0qblsyXStuWzNdKm5bM10pO2xldCBmO2lmKGVbdCsrXSl7aWYoZj1jci5nZXQobCxgJHt1fWApLCFmKXJldHVybiB0fWVsc2V7Y29uc3Qgbj1NYXRoLmNlaWwoTWF0aC5hYnMoaS1vKSpiKSxyPU1hdGguY2VpbChNYXRoLmFicyhjLXMpKmQpLGE9Qm9vbGVhbihlW3QrK10pO2Y9YT9jci5nZXQobCxgJHt1fWApOlRyLmNyZWF0ZU5vZGUobixyKSxhfHxjci5zZXQobCxgJHt1fWAsZik7Y29uc3QgaD1lW3QrK10sbT1uZXcgVWludDhBcnJheShlLnN1YmFycmF5KHQsdCtoKSk7dCs9aDtsZXQgdj0ibm9uZSI7c3dpdGNoKGVbdCsrXSl7Y2FzZSAwOnY9ImNlbnRlciI7YnJlYWs7Y2FzZSAxOnY9ImxlZnQiO2JyZWFrO2Nhc2UgMjp2PSJub25lIjticmVhaztjYXNlIDM6dj0icmlnaHQifWNvbnN0IF89e3dpZHRoOm4saGVpZ2h0OnIsYXV0b1NpemU6dixzdG9wSW5kZXg6ZVt0KytdLHNjcm9sbFg6ZVt0KytdLHNjcm9sbFk6ZVt0KytdLHRleHRXaWR0aDplW3QrK10sdGV4dEhlaWdodDplW3QrK10scmF3V2lkdGg6ZVt0KytdLHJhd0hlaWdodDplW3QrK10sZm9jdXNJbmRleDplW3QrK10sc2VsZWN0SW5kZXg6ZVt0KytdLGZvY3VzVmlzaWJsZTpCb29sZWFuKGVbdCsrXSksdGhpY2tuZXNzOmVbdCsrXSx0aGlja25lc3NDb2xvcjplW3QrK10sd29yZFdyYXA6Qm9vbGVhbihlW3QrK10pLGJvcmRlcjpCb29sZWFuKGVbdCsrXSksYm9yZGVyQ29sb3I6ZVt0KytdLGJhY2tncm91bmQ6Qm9vbGVhbihlW3QrK10pLGJhY2tncm91bmRDb2xvcjplW3QrK10sZGVmYXVsdENvbG9yOmVbdCsrXSxkZWZhdWx0U2l6ZTplW3QrK119LHA9KChlLHQsbixyKT0+e2NvbnN0IGE9bmV3IE9mZnNjcmVlbkNhbnZhcyh0LndpZHRoLHQuaGVpZ2h0KSxvPWEuZ2V0Q29udGV4dCgiMmQiKTtpZighbylyZXR1cm4gYTtjb25zdCBzPU1hdGgubWluKDEsTWF0aC5tYXgobixyKSk7aWYodC5iYWNrZ3JvdW5kfHx0LmJvcmRlcil7aWYoby5iZWdpblBhdGgoKSxvLm1vdmVUbygwLDApLG8ubGluZVRvKHQud2lkdGgsMCksby5saW5lVG8odC53aWR0aCx0LmhlaWdodCksby5saW5lVG8oMCx0LmhlaWdodCksby5saW5lVG8oMCwwKSx0LmJhY2tncm91bmQpe2NvbnN0IGU9U3IodC5iYWNrZ3JvdW5kQ29sb3IpO28uZmlsbFN0eWxlPWByZ2JhKCR7ZS5SfSwke2UuR30sJHtlLkJ9LCR7ZS5BfSlgLG8uZmlsbCgpfWlmKHQuYm9yZGVyKXtjb25zdCBlPVNyKHQuYm9yZGVyQ29sb3IpO28ubGluZVdpZHRoPXMsby5zdHJva2VTdHlsZT1gcmdiYSgke2UuUn0sJHtlLkd9LCR7ZS5CfSwke2UuQX0pYCxvLnN0cm9rZSgpfX1pZighZSlyZXR1cm4gYTtvLnNhdmUoKSxvLmJlZ2luUGF0aCgpLG8ubW92ZVRvKDIsMiksby5saW5lVG8odC53aWR0aC0yLDIpLG8ubGluZVRvKHQud2lkdGgtMix0LmhlaWdodC0yKSxvLmxpbmVUbygyLHQuaGVpZ2h0LTIpLG8ubGluZVRvKDIsMiksby5jbGlwKCk7bGV0IGk9MjtpZih0LnNjcm9sbFg+MCl7Y29uc3QgZT0odC50ZXh0V2lkdGgrNC10LnJhd1dpZHRoKS90LnJhd1dpZHRoO2krPS10LnNjcm9sbFgqZX1sZXQgYz0yO2lmKHQuc2Nyb2xsWT4wKXtjb25zdCBlPSh0LnRleHRIZWlnaHQrMi10LnJhd0hlaWdodCkvdC5yYXdIZWlnaHQ7Yys9LXQuc2Nyb2xsWSplfWlmKG8uc2V0VHJhbnNmb3JtKG4sMCwwLHIsaSpuLGMqciksby5iZWdpblBhdGgoKSx0LnNlbGVjdEluZGV4Pi0xJiZ0LmZvY3VzSW5kZXg+LTEpe2NvbnN0IG49ZS50ZXh0VGFibGUubGVuZ3RoLTE7bGV0IHI9MCxhPTA7dC5mb2N1c0luZGV4PD10LnNlbGVjdEluZGV4PyhyPU1hdGgubWluKHQuZm9jdXNJbmRleCxuKSxhPU1hdGgubWluKHQuc2VsZWN0SW5kZXgsbikpOihyPU1hdGgubWluKHQuc2VsZWN0SW5kZXgsbiksYT1NYXRoLm1pbih0LmZvY3VzSW5kZXgtMSxuKSk7Y29uc3Qgcz1lLnRleHRUYWJsZVtyXSxpPWUubGluZVRhYmxlW3MubGluZV0sYz1VcihlLGksdCk7bGV0IGw9MDtpZihyJiYidGV4dCI9PT1zLm1vZGUpe2xldCB0PXI7Zm9yKDt0Oyl7Y29uc3Qgbj1lLnRleHRUYWJsZVstLXRdO2lmKCJ0ZXh0IiE9PW4ubW9kZSlicmVhaztsKz1uLnd9fW8uZmlsbFN0eWxlPSIjYjRkN2ZmIjtsZXQgdT0wO2ZvcihsZXQgdD1yO3Q8PWE7Kyt0KXtjb25zdCBuPWUudGV4dFRhYmxlW3RdO2lmKCJ0ZXh0Ij09PW4ubW9kZSYmKHUrPW4udyx0IT09YSkpY29udGludWU7bGV0IHI9MDtjb25zdCBzPSJ0ZXh0Ij09PW4ubW9kZT9uLmxpbmU6bi5saW5lLTE7Zm9yKGxldCB0PTA7dDxzOysrdClyKz1lLmhlaWdodFRhYmxlW3RdO28uYmVnaW5QYXRoKCksby5yZWN0KGwscix1K2MsZS5oZWlnaHRUYWJsZVtzXSksby5maWxsKCksbD0wLHU9MH19Y29uc3QgbD10LnJhd1dpZHRoO2xldCB1PTA7aWYodC5zY3JvbGxYPjApe2NvbnN0IGU9KHQudGV4dFdpZHRoLWwpL2w7dT10LnNjcm9sbFgqZX1jb25zdCBoPWwrdSxiPXQucmF3SGVpZ2h0O2xldCBkPTA7aWYodC5zY3JvbGxZPjApe2NvbnN0IGU9KHQudGV4dEhlaWdodC1iKS9iO2Q9dC5zY3JvbGxZKmV9Y29uc3QgZj1iK2Q7bGV0IG09MCx2PTAsXz0wLHA9MCxnPSExLHg9LTE7Zm9yKGxldCBuPTA7bjxlLnRleHRUYWJsZS5sZW5ndGg7KytuKXtjb25zdCByPWUudGV4dFRhYmxlW25dO2lmKCFyKWNvbnRpbnVlO2lmKCgidGV4dCI9PT1yLm1vZGV8fCJicmVhayI9PT1yLm1vZGUpJiYoeCsrLHQuc3RvcEluZGV4Pi0xJiZ4PnQuc3RvcEluZGV4KSlicmVhaztpZihnJiYidGV4dCI9PT1yLm1vZGUpY29udGludWU7Y29uc3QgYT1yLnRleHRGb3JtYXQ7aWYoIm5vbmUiPT09dC5hdXRvU2l6ZSl7aWYodj5mKWJyZWFrO2lmKCJ0ZXh0Ij09PXIubW9kZSYmKHU+bStyLnd8fG0+aCkpe20rPXIudztjb250aW51ZX19Y29uc3QgaT1TcihhLmNvbG9yfHwwKTtpZihvLmZpbGxTdHlsZT1gcmdiYSgke2kuUn0sJHtpLkd9LCR7aS5CfSwke2kuQX0pYCx0LmZvY3VzVmlzaWJsZSYmdC5mb2N1c0luZGV4PT09bil7Y29uc3QgdD1tK18rLjE7bGV0IG49ci5saW5lLGE9ci55LHM9ZS5hc2NlbnRUYWJsZVtuXTsidGV4dCIhPT1yLm1vZGUmJihhPSJicmVhayI9PT1yLm1vZGU/ci5oOmUuYXNjZW50VGFibGVbbi0xXSxuPjA/KG49ci5saW5lLTEscz1lLmFzY2VudFRhYmxlW25dKTpzPXIuaCksbj4wJiYwPT09ZS5hc2NlbnRUYWJsZVtuXSYmbisrO2ZvcihsZXQgdD0wO3Q8bjsrK3Qpcys9ZS5oZWlnaHRUYWJsZVt0XTtvLnN0cm9rZVN0eWxlPWByZ2JhKCR7aS5SfSwke2kuR30sJHtpLkJ9LCR7aS5BfSlgLG8uYmVnaW5QYXRoKCksby5tb3ZlVG8odCxzKSxvLmxpbmVUbyh0LHMtYSksby5zdHJva2UoKX1pZih0LnRoaWNrbmVzcyl7Y29uc3QgZT1Tcih0LnRoaWNrbmVzc0NvbG9yKTtvLmxpbmVXaWR0aD10LnRoaWNrbmVzcyxvLnN0cm9rZVN0eWxlPWByZ2JhKCR7ZS5SfSwke2UuR30sJHtlLkJ9LCR7ZS5BfSlgfWNvbnN0IGM9MHxyLmxpbmU7c3dpdGNoKHIubW9kZSl7Y2FzZSJicmVhayI6Y2FzZSJ3cmFwIjppZihtPTAsYyYmKHYrPWUuaGVpZ2h0VGFibGVbYy0xXSksZD52K2UuaGVpZ2h0VGFibGVbY10pe2c9ITA7Y29udGludWV9cD1lLmFzY2VudFRhYmxlW2NdLF89VXIoZSxyLHQpLGc9ITE7YnJlYWs7Y2FzZSJ0ZXh0Ijp7by5iZWdpblBhdGgoKSxvLmZvbnQ9TnIoYSk7Y29uc3QgZT1tK18sbj12K3A7aWYoYS51bmRlcmxpbmUpe2NvbnN0IHQ9U3IoYS5jb2xvcnx8MCk7by5saW5lV2lkdGg9cyxvLnN0cm9rZVN0eWxlPWByZ2JhKCR7dC5SfSwke3QuR30sJHt0LkJ9LCR7dC5BfSlgLG8uYmVnaW5QYXRoKCksby5tb3ZlVG8oZSxuKzIpLG8ubGluZVRvKGUrci53LG4rMiksby5zdHJva2UoKX10LnRoaWNrbmVzcyYmby5zdHJva2VUZXh0KHIudGV4dCxlLG4pLG8uZmlsbFRleHQoci50ZXh0LGUsbiksbSs9ci53fX19aWYodC5mb2N1c1Zpc2libGUmJnQuZm9jdXNJbmRleD49ZS50ZXh0VGFibGUubGVuZ3RoKXtjb25zdCBuPWUudGV4dFRhYmxlW3QuZm9jdXNJbmRleC0xXTtpZihuKXtjb25zdCBlPVNyKG4udGV4dEZvcm1hdC5jb2xvcnx8MCk7by5zdHJva2VTdHlsZT1gcmdiYSgke2UuUn0sJHtlLkd9LCR7ZS5CfSwke2UuQX0pYDtjb25zdCB0PW0rXysuMSxyPXYrcDtvLmJlZ2luUGF0aCgpLCJ0ZXh0Ij09PW4ubW9kZT9vLm1vdmVUbyh0LHItbi55KTpvLm1vdmVUbyh0LHIrbi5oKSxvLmxpbmVUbyh0LHIpLG8uc3Ryb2tlKCl9fXJldHVybiBvLnJlc3RvcmUoKSxhfSkoSlNPTi5wYXJzZShEci5kZWNvZGUobSkpLF8sYixkKSxnPVRyLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0O1RyLmJpbmQoVHIuYXRsYXNBdHRhY2htZW50T2JqZWN0KSxUci5yZXNldCgpLFRyLmJlZ2luTm9kZVJlbmRlcmluZyhmKTtjb25zdCB4PVRyLmF0bGFzQXR0YWNobWVudE9iamVjdC5oZWlnaHQtZi55LXI7VHIuc2V0VHJhbnNmb3JtKDEsMCwwLDEsZi54LHgpLFRyLmRyYXdFbGVtZW50KGYscCksVHIuZW5kTm9kZVJlbmRlcmluZygpLGcmJlRyLmJpbmQoZyl9Y29uc3QgbT1lW3QrK107aWYoQm9vbGVhbihlW3QrK10pKXtjb25zdCBvPUJvb2xlYW4oZVt0KytdKSxzPWUuc3ViYXJyYXkodCx0KzQpO3QrPTQ7Y29uc3QgaT1lW3QrK10sYz1lLnN1YmFycmF5KHQsdCtpKSx1PU1hdGguY2VpbChNYXRoLmFicyhhWzJdLWFbMF0pKSxiPU1hdGguY2VpbChNYXRoLmFicyhhWzNdLWFbMV0pKTtyZXR1cm4gVHIuYXBwbHlGaWx0ZXIoZixsLEJvb2xlYW4oTWF0aC5tYXgoK2gsK28pKSx1LGIsITEsbixyLEJyKG0pLHMsYyksdCs9aX1Uci5nbG9iYWxBbHBoYT1NYXRoLm1pbihNYXRoLm1heCgwLHJbM10rcls3XS8yNTUpLDEpLFRyLmltYWdlU21vb3RoaW5nRW5hYmxlZD0hMCxUci5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249QnIobSk7Y29uc3Qgdj1NYXRoLmF0YW4yKG5bMV0sblswXSksXz1NYXRoLmF0YW4yKC1uWzJdLG5bM10pO2lmKHZ8fF8pe2NvbnN0IGU9bypiLHQ9cypkLHI9TWF0aC5jb3ModiksYT1NYXRoLnNpbih2KSxpPU1hdGguY29zKF8pLGM9TWF0aC5zaW4oXyk7VHIuc2V0VHJhbnNmb3JtKHIsYSwtYyxpLGUqci10KmMrbls0XSxlKmErdCppK25bNV0pfWVsc2UgVHIuc2V0VHJhbnNmb3JtKDEsMCwwLDEsYVswXSxhWzFdKTtyZXR1cm4gVHIuZHJhd0Rpc3BsYXlPYmplY3QoZixhWzBdLGFbMV0sYVsyXSxhWzNdLHIpLHR9LFhyPShlLHQsbik9Pntjb25zdCByPWUuc3ViYXJyYXkodCx0KzYpO3QrPTY7Y29uc3QgYT1lLnN1YmFycmF5KHQsdCs4KTt0Kz04O2NvbnN0IG89ZS5zdWJhcnJheSh0LHQrNCk7dCs9NDtjb25zdCBzPWVbdCsrXSxpPWVbdCsrXSxjPWVbdCsrXSxsPWVbdCsrXSx1PWAke2VbdCsrXX1gLGg9Qm9vbGVhbihlW3QrK10pO2xldCBiO2lmKGVbdCsrXSl7aWYoYj1jci5nZXQodSwiMCIpLCFiKXJldHVybiB0fWVsc2V7Y29uc3Qgcj1NYXRoLmFicyhjLXMpLGE9TWF0aC5hYnMobC1pKSxvPUJvb2xlYW4oZVt0KytdKTtpZihiPW8/Y3IuZ2V0KHUsIjAiKTpUci5jcmVhdGVOb2RlKHIsYSksb3x8Y3Iuc2V0KHUsIjAiLGIpLG4mJm4ubGVuZ3RoKXtjb25zdCBlPVRyLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0O1RyLmJpbmQoVHIuYXRsYXNBdHRhY2htZW50T2JqZWN0KSxUci5yZXNldCgpLFRyLmJlZ2luTm9kZVJlbmRlcmluZyhiKTtjb25zdCB0PVRyLmF0bGFzQXR0YWNobWVudE9iamVjdC5oZWlnaHQtYi55LWE7VHIuc2V0VHJhbnNmb3JtKDEsMCwwLDEsYi54LHQpO2NvbnN0IHI9bi5zaGlmdCgpO1RyLmRyYXdFbGVtZW50KGIsciksVHIuZW5kTm9kZVJlbmRlcmluZygpLGUmJlRyLmJpbmQoZSl9fWNvbnN0IGQ9ZVt0KytdO2lmKEJvb2xlYW4oZVt0KytdKSl7Y29uc3Qgbj1Cb29sZWFuKGVbdCsrXSkscz1lLnN1YmFycmF5KHQsdCs0KTt0Kz00O2NvbnN0IGk9ZVt0KytdLGM9ZS5zdWJhcnJheSh0LHQraSksbD1NYXRoLmNlaWwoTWF0aC5hYnMob1syXS1vWzBdKSksZj1NYXRoLmNlaWwoTWF0aC5hYnMob1szXS1vWzFdKSk7cmV0dXJuIFRyLmFwcGx5RmlsdGVyKGIsdSxCb29sZWFuKE1hdGgubWF4KCtoLCtuKSksbCxmLCEwLHIsYSxCcihkKSxzLGMpLHQrPWl9cmV0dXJuIFRyLmdsb2JhbEFscGhhPU1hdGgubWluKE1hdGgubWF4KDAsYVszXSthWzddLzI1NSksMSksVHIuaW1hZ2VTbW9vdGhpbmdFbmFibGVkPSEwLFRyLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj1CcihkKSxUci5zZXRUcmFuc2Zvcm0oclswXSxyWzFdLHJbMl0sclszXSxyWzRdLHJbNV0pLFRyLmRyYXdEaXNwbGF5T2JqZWN0KGIsb1swXSxvWzFdLG9bMl0sb1szXSxhKSx0fSx6cj0oZSx0KT0+e2NvbnN0IG49ZVt0KytdO2ZvcihsZXQgcj0wO3I8bjsrK3Ipe3N3aXRjaChlW3QrK10pe2Nhc2UgMDp0PXpyKGUsdCk7YnJlYWs7Y2FzZSAxOnQ9THIoZSx0KX19cmV0dXJuIHR9LFZyPShlLHQsbik9Pntjb25zdCByPUJvb2xlYW4oZVt0KytdKTtpZihyKXtUci5kcmF3QXJyYXlzSW5zdGFuY2VkKCksVHIuc2F2ZSgpLFRyLmJlZ2luTWFzaygpLFRyLnNldE1hc2tCb3VuZHMoZVt0KytdLGVbdCsrXSxlW3QrK10sZVt0KytdKTtzd2l0Y2goZVt0KytdKXtjYXNlIDA6dD16cihlLHQpO2JyZWFrO2Nhc2UgMTp0PUxyKGUsdCl9VHIuZW5kTWFzaygpfWxldCBhPTAsbz0hMDtjb25zdCBzPWVbdCsrXTtmb3IobGV0IHI9MDtzPnI7cisrKXtjb25zdCByPWVbdCsrXSxzPWVbdCsrXTtpZihhJiZyPmEmJihvJiYoVHIucmVzdG9yZSgpLFRyLmxlYXZlTWFzaygpKSxhPTAsbz0hMCksIW8pY29udGludWU7aWYocyl7aWYoYT1zLG89Qm9vbGVhbihlW3QrK10pLCFvKWNvbnRpbnVlO1RyLmRyYXdBcnJheXNJbnN0YW5jZWQoKSxUci5zYXZlKCksVHIuYmVnaW5NYXNrKCksVHIuc2V0TWFza0JvdW5kcyhlW3QrK10sZVt0KytdLGVbdCsrXSxlW3QrK10pO3N3aXRjaChlW3QrK10pe2Nhc2UgMDp0PXpyKGUsdCk7YnJlYWs7Y2FzZSAxOnQ9THIoZSx0KX1Uci5lbmRNYXNrKCk7Y29udGludWV9aWYoIWVbdCsrXSljb250aW51ZTtjb25zdCBpPWVbdCsrXTtzd2l0Y2goaSl7Y2FzZSAwOnQ9VnIoZSx0LG4pO2JyZWFrO2Nhc2UgMTp0PUlyKGUsdCk7YnJlYWs7Y2FzZSAyOnQ9anIoZSx0KTticmVhaztjYXNlIDM6dD1YcihlLHQsbik7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLmVycm9yKCJ1bmtub3duIHR5cGUiLGkpfX1yZXR1cm4oYXx8cikmJihUci5yZXN0b3JlKCksVHIubGVhdmVNYXNrKCkpLHR9O2xldCBXcj0tMTtjb25zdCBHcj0oZSx0KT0+e1RyLmNsZWFyVHJhbnNmZXJCb3VuZHMoKTtsZXQgbj0wO2NvbnN0IHI9ZVtuKytdO2ZvcihXciE9PXImJihXcj1yLC0xPT09V3I/VHIudXBkYXRlQmFja2dyb3VuZENvbG9yKDAsMCwwLDApOlRyLnVwZGF0ZUJhY2tncm91bmRDb2xvcigoV3I+PjE2JjI1NSkvMjU1LChXcj4+OCYyNTUpLzI1NSwoMjU1JldyKS8yNTUsMSkpLFRyLnJlc2V0KCksVHIuc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKSxUci5maWxsQmFja2dyb3VuZENvbG9yKCk7ZS5sZW5ndGg+bjspe2lmKCFlW24rK10pY29udGludWU7Y29uc3Qgcj1lW24rK107c3dpdGNoKHIpe2Nhc2UgMDpuPVZyKGUsbix0KTticmVhaztjYXNlIDE6bj1JcihlLG4pO2JyZWFrO2Nhc2UgMjpuPWpyKGUsbik7YnJlYWs7Y2FzZSAzOm49WHIoZSxuLHQpO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS5lcnJvcigidW5rbm93biB0eXBlIixyKX19VHIuZHJhd0FycmF5c0luc3RhbmNlZCgpLEZyJiYoUnIud2lkdGg9TXIsUnIuaGVpZ2h0PXdyLEZyPSExKSxUci50cmFuc2Zlck1haW5DYW52YXMoKX0sWXI9ZT0+e2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7Kyt0KXtjb25zdCBuPWAke2VbdF19YDtpZighY3IuaGFzKG4pKWNvbnRpbnVlO2NvbnN0IHI9Y3IuZ2V0QnlJZChuKTtmb3IoY29uc3QgZSBvZiByLnZhbHVlcygpKVRyLnJlbW92ZU5vZGUoZSk7Y3IucmVtb3ZlQnlJZChuKX19LHFyPWFzeW5jKGUsdCxuLHI9MCxhPTAsbyk9PntUci5jbGVhclRyYW5zZmVyQm91bmRzKCk7bGV0IHM9MTtmb3IoVHIucmVzZXQoKSxUci5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLFRyLnVwZGF0ZUJhY2tncm91bmRDb2xvcigocj4+MTYmMjU1KS8yNTUsKHI+PjgmMjU1KS8yNTUsKDI1NSZyKS8yNTUsYSksVHIuZmlsbEJhY2tncm91bmRDb2xvcigpO2UubGVuZ3RoPnM7KXtpZighZVtzKytdKWNvbnRpbnVlO2NvbnN0IHQ9ZVtzKytdO3N3aXRjaCh0KXtjYXNlIDA6cz1WcihlLHMsbyk7YnJlYWs7Y2FzZSAxOnM9SXIoZSxzKTticmVhaztjYXNlIDI6cz1qcihlLHMpO2JyZWFrO2Nhc2UgMzpzPVhyKGUscyxvKTticmVhaztkZWZhdWx0OmNvbnNvbGUuZXJyb3IoInVua25vd24gdHlwZSIsdCl9fXJldHVybiBUci5kcmF3QXJyYXlzSW5zdGFuY2VkKCksYXdhaXQgVHIuY3JlYXRlSW1hZ2VCaXRtYXAodCxuKX07Y29uc3QgS3I9bmV3IGNsYXNze2NvbnN0cnVjdG9yKCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInN0YXRlIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInF1ZXVlIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksdGhpcy5zdGF0ZT0iZGVhY3RpdmF0ZSIsdGhpcy5xdWV1ZT1bXX1hc3luYyBleGVjdXRlKCl7Zm9yKHRoaXMuc3RhdGU9ImFjdGl2ZSI7dGhpcy5xdWV1ZS5sZW5ndGg7KXtjb25zdCBlPXRoaXMucXVldWUuc2hpZnQoKTtpZihlKXN3aXRjaChlLmNvbW1hbmQpe2Nhc2UicmVuZGVyIjpHcihlLmJ1ZmZlci5zdWJhcnJheSgwLGUubGVuZ3RoKSxlLmltYWdlQml0bWFwcyksZ2xvYmFsVGhpcy5wb3N0TWVzc2FnZSh7bWVzc2FnZToicmVuZGVyIixidWZmZXI6ZS5idWZmZXJ9LFtlLmJ1ZmZlci5idWZmZXJdKTticmVhaztjYXNlInJlc2l6ZSI6Q3IoZS5idWZmZXJbMF0sZS5idWZmZXJbMV0sQm9vbGVhbihlLmJ1ZmZlclsyXSkpO2JyZWFrO2Nhc2UiaW5pdGlhbGl6ZSI6a3IoZS5jYW52YXMsZS5kZXZpY2VQaXhlbFJhdGlvKTticmVhaztjYXNlInJlbW92ZUNhY2hlIjpZcihlLmJ1ZmZlcik7YnJlYWs7Y2FzZSJjYWNoZUNsZWFyIjpjci5yZXNldCgpO2JyZWFrO2Nhc2UiY2FwdHVyZSI6e2NvbnN0IHQ9YXdhaXQgcXIoZS5idWZmZXIuc3ViYXJyYXkoMCxlLmxlbmd0aCksZS53aWR0aCxlLmhlaWdodCxlLmJnQ29sb3IsZS5iZ0FscGhhLGUuaW1hZ2VCaXRtYXBzKTtnbG9iYWxUaGlzLnBvc3RNZXNzYWdlKHttZXNzYWdlOiJjYXB0dXJlIixidWZmZXI6ZS5idWZmZXIsaW1hZ2VCaXRtYXA6dH0sW2UuYnVmZmVyLmJ1ZmZlcix0XSl9fX10aGlzLnN0YXRlPSJkZWFjdGl2YXRlIn19O3NlbGYuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsYXN5bmMgZT0+e0tyLnF1ZXVlLnB1c2goZS5kYXRhKSwiZGVhY3RpdmF0ZSI9PT1Lci5zdGF0ZSYmYXdhaXQgS3IuZXhlY3V0ZSgpfSk7cmV0dXJue319KCk7Cg==';
|